From df52b5b78668a9bf889e5d41f107b1db78c91ac4 Mon Sep 17 00:00:00 2001 From: Jean Guyader Date: Tue, 14 Jul 2009 17:48:02 +0100 Subject: [PATCH] Rebase linux 2.6.27 patch queue. changeset: 587:d5edf2cf2e4a tag: tip user: Ian Campbell date: Mon Jul 13 14:11:47 2009 +0100 summary: pci_walk_bus uses EXPORT_SYMBOL_GPL - Need to disable the intel hda sound backport (didn't apply cleanly) - Remove the pciback patch because they have been merge inside xenserver tree. --- master/.hgignore | 1 + master/CA-14400-reduce-printk-levels | 72 +- master/CA-15999-blkback-pause-unpause | 2 +- master/blkback-use-blk_getput_queue.patch | 21 + master/blkback_multi_page_ring | 397 + master/blktap_multi_page_ring | 418 + master/bnx2-1.9.16b | 33332 ++++++ master/bnx2i-1.8.9k | 12992 +++ master/bnx2x-1.50.8 | 84186 ++++++++++++++++ master/bnx2x-fix-paths | 16 +- master/e1000-8.0.13.patch | 31182 ++++++ master/e1000e-0.5.18.3.patch | 22770 +++++ master/enable-xen-save-restore.patch | 12 + master/export-pci_walk_bus.patch | 8 + master/feature-gso-tcpv4-prefix | 171 + master/forward-port-drivers-xen-blktap.patch | 171 + ...4957179c92fda7d9a06e49b7ae56fb7c925b.patch | 46 + ...0c7ed4d027e02f6231afa39852a2d48e6f25.patch | 70 + ...20966fe0659d61815b9e9b4b68fdc5-fixes.patch | 12 + ...d80b5120966fe0659d61815b9e9b4b68fdc5.patch | 74 + ...9bee3a2b228370194f1b3ebc3db427cc9c94.patch | 128 + ...8ce2ac372ea1f2065b89228ede105eb68dc5.patch | 138 + ...e56eb22f1ff3f36804bc70cbff220b50f067.patch | 82 + ...fa8a2e534523c896a32a9f27f78d52ad7d82.patch | 43 + ...6fdb48e0d83c2acf46e357548c89891df58b.patch | 101 + ...93b7837fb3cf0579a42f4953ac463a5b9e1e.patch | 157 + ...5dbee7b0a89e946f7ba284f2b957505a2c3a.patch | 31 + ...a727cb73b75a9104d295f096cca12959a5a5.patch | 141 + ...7ed6f72b1a115f7ece8ce1b66cf095de1348.patch | 92 + ...1a731ff1a990d4da7689909317756e50cb4d.patch | 40 + ...d8120021897e139641062236215aac5d220e.patch | 36 + ...1bcc7dbbc9ddef773bf3395d7ff92aaaad2e.patch | 208 + ...3b175d4de9438a4b0af3a94a112cb5266944.patch | 77 + ...587c2d14d3be2414190845b2e2617c0aa33b.patch | 62 + ...501ab25dcd683574a5d3d56d8fe450083ed6.patch | 100 + ...85172fa729513d8636257b44bd1cfd279096.patch | 69 + ...db6adc6688b9b8fd82ea4a5cf4674dabad79.patch | 91 + ...f8036c123296fc4214f9d8810eb485570422.patch | 178 + ...68a55aa92180a765d6c51c3303f6200167a6.patch | 59 + ...24b0fb909d247229a70761c90bb37b13366a.patch | 101 + ...5a8277cb353161454b6704b3186ebcf3a2a3.patch | 43 + ...54da8f599905f3c18a218961dcf17f9d5f13.patch | 417 + ...4014e2a94bd37b7dee5e76e03f7bc4fab49a.patch | 29 + ...c44d0bcec5e9c42fe52e88dc254ae62eac8d.patch | 420 + ...eb1f3638b7bb4ca21eb361f004fac2bfe259.patch | 287 + ...1b146b52765ee38bfb91bb14eb850fa98017.patch | 29 + ...9c6d8f92de0c9f75698a75f0989f2234c517.patch | 125 + master/igb-1.3.19.3.patch | 23148 +++++ master/increase-nr-dynirq | 12 + master/intel-net-driver-kcompat.patch | 58 +- master/ixgbe-2.0.34.3.patch | 26561 +++++ master/kernel-configuration | 101 +- master/linux-2.6.18-xen.hg-734.412b24a36929 | 945 + master/linux-2.6.18-xen.hg-767.78d81e85e8cd | 32 + master/linux-2.6.18-xen.hg-778.0fadef4d5c46 | 31 + master/linux-2.6.18-xen.hg-792.db9857bb0320 | 106 + master/linux-2.6.18-xen.hg-793.3aa9b8a7876b | 45 + master/linux-2.6.18-xen.hg-820.8b86d11a6eb3 | 56 + master/linux-2.6.18-xen.hg-832.c0f2f398aa3c | 25 +- master/linux-2.6.27.23-0.1.1.patch | 28497 ++++++ master/mpt2sas-01.255.04.00.patch | 25139 +++++ master/mpt2sas-build-integration.patch | 33 + master/mptlinux-4.19.00.03.patch | 18942 ++++ .../netback-fix-receive-checksum-setup.patch | 12 + master/netback-watch-csum-offload | 30 +- .../open-iscsi-2.0-870.3-2.6.27_compat.patch | 60 + master/open-iscsi-2.0-870.3.patch | 1194 + master/open-iscsi-adjust-for-in-kernel-build | 46 +- master/open-iscsi-gfpkernel.patch | 12 +- master/pciback-flr | 222 +- master/revert-balloon-max-target.patch | 75 + ...revert-configurable-nr-guest-devices.patch | 68 + master/revert-netback-dynirq-accounting.patch | 53 + master/revert-netback-notify-multiple.patch | 81 + master/revert-vbd-cdrom-extensions.patch | 815 + master/revert-vbd-packet-extensions.patch | 141 + master/revert-vbd-protocol-hack.patch | 182 + master/revert-xencons-behaviour | 19 + master/series | 113 +- master/status | 189 + master/sync-drivers-xen-blktap.patch | 435 + master/tg3-3.99d | 9930 ++ master/vim | 72 + master/vswitch-0.90.1.0.patch | 6419 ++ master/vswitch-build-integration.patch | 141 + master/watch_online_node | 41 +- 86 files changed, 332941 insertions(+), 377 deletions(-) create mode 100644 master/.hgignore create mode 100644 master/blkback-use-blk_getput_queue.patch create mode 100644 master/blkback_multi_page_ring create mode 100644 master/blktap_multi_page_ring create mode 100644 master/bnx2-1.9.16b create mode 100644 master/bnx2i-1.8.9k create mode 100644 master/bnx2x-1.50.8 create mode 100644 master/e1000-8.0.13.patch create mode 100644 master/e1000e-0.5.18.3.patch create mode 100644 master/enable-xen-save-restore.patch create mode 100644 master/export-pci_walk_bus.patch create mode 100644 master/feature-gso-tcpv4-prefix create mode 100644 master/forward-port-drivers-xen-blktap.patch create mode 100644 master/git-01db4957179c92fda7d9a06e49b7ae56fb7c925b.patch create mode 100644 master/git-0b400c7ed4d027e02f6231afa39852a2d48e6f25.patch create mode 100644 master/git-14add80b5120966fe0659d61815b9e9b4b68fdc5-fixes.patch create mode 100644 master/git-14add80b5120966fe0659d61815b9e9b4b68fdc5.patch create mode 100644 master/git-15b49bee3a2b228370194f1b3ebc3db427cc9c94.patch create mode 100644 master/git-1b6b8ce2ac372ea1f2065b89228ede105eb68dc5.patch create mode 100644 master/git-201de56eb22f1ff3f36804bc70cbff220b50f067.patch create mode 100644 master/git-3789fa8a2e534523c896a32a9f27f78d52ad7d82.patch create mode 100644 master/git-3fa16fdb48e0d83c2acf46e357548c89891df58b.patch create mode 100644 master/git-480b93b7837fb3cf0579a42f4953ac463a5b9e1e.patch create mode 100644 master/git-4d135dbee7b0a89e946f7ba284f2b957505a2c3a.patch create mode 100644 master/git-58c3a727cb73b75a9104d295f096cca12959a5a5.patch create mode 100644 master/git-613e7ed6f72b1a115f7ece8ce1b66cf095de1348.patch create mode 100644 master/git-67fd1a731ff1a990d4da7689909317756e50cb4d.patch create mode 100644 master/git-6a49d8120021897e139641062236215aac5d220e.patch create mode 100644 master/git-74bb1bcc7dbbc9ddef773bf3395d7ff92aaaad2e.patch create mode 100644 master/git-7eb93b175d4de9438a4b0af3a94a112cb5266944.patch create mode 100644 master/git-8113587c2d14d3be2414190845b2e2617c0aa33b.patch create mode 100644 master/git-876e501ab25dcd683574a5d3d56d8fe450083ed6.patch create mode 100644 master/git-898585172fa729513d8636257b44bd1cfd279096.patch create mode 100644 master/git-8c5cdb6adc6688b9b8fd82ea4a5cf4674dabad79.patch create mode 100644 master/git-8dd7f8036c123296fc4214f9d8810eb485570422.patch create mode 100644 master/git-93ff68a55aa92180a765d6c51c3303f6200167a6.patch create mode 100644 master/git-a28724b0fb909d247229a70761c90bb37b13366a.patch create mode 100644 master/git-bc5f5a8277cb353161454b6704b3186ebcf3a2a3.patch create mode 100644 master/git-d1b054da8f599905f3c18a218961dcf17f9d5f13.patch create mode 100644 master/git-d3a54014e2a94bd37b7dee5e76e03f7bc4fab49a.patch create mode 100644 master/git-dd7cc44d0bcec5e9c42fe52e88dc254ae62eac8d.patch create mode 100644 master/git-f19aeb1f3638b7bb4ca21eb361f004fac2bfe259.patch create mode 100644 master/git-f79b1b146b52765ee38bfb91bb14eb850fa98017.patch create mode 100644 master/git-fde09c6d8f92de0c9f75698a75f0989f2234c517.patch create mode 100644 master/igb-1.3.19.3.patch create mode 100644 master/increase-nr-dynirq create mode 100644 master/ixgbe-2.0.34.3.patch create mode 100644 master/linux-2.6.18-xen.hg-734.412b24a36929 create mode 100644 master/linux-2.6.18-xen.hg-767.78d81e85e8cd create mode 100644 master/linux-2.6.18-xen.hg-778.0fadef4d5c46 create mode 100644 master/linux-2.6.18-xen.hg-792.db9857bb0320 create mode 100644 master/linux-2.6.18-xen.hg-793.3aa9b8a7876b create mode 100644 master/linux-2.6.18-xen.hg-820.8b86d11a6eb3 create mode 100644 master/linux-2.6.27.23-0.1.1.patch create mode 100644 master/mpt2sas-01.255.04.00.patch create mode 100644 master/mpt2sas-build-integration.patch create mode 100644 master/mptlinux-4.19.00.03.patch create mode 100644 master/netback-fix-receive-checksum-setup.patch create mode 100644 master/open-iscsi-2.0-870.3-2.6.27_compat.patch create mode 100644 master/open-iscsi-2.0-870.3.patch create mode 100644 master/revert-balloon-max-target.patch create mode 100644 master/revert-configurable-nr-guest-devices.patch create mode 100644 master/revert-netback-dynirq-accounting.patch create mode 100644 master/revert-netback-notify-multiple.patch create mode 100644 master/revert-vbd-cdrom-extensions.patch create mode 100644 master/revert-vbd-packet-extensions.patch create mode 100644 master/revert-vbd-protocol-hack.patch create mode 100644 master/sync-drivers-xen-blktap.patch create mode 100644 master/tg3-3.99d create mode 100644 master/vim create mode 100644 master/vswitch-0.90.1.0.patch create mode 100644 master/vswitch-build-integration.patch diff --git a/master/.hgignore b/master/.hgignore new file mode 100644 index 0000000..8be5547 --- /dev/null +++ b/master/.hgignore @@ -0,0 +1 @@ +status diff --git a/master/CA-14400-reduce-printk-levels b/master/CA-14400-reduce-printk-levels index 0bfacde..8ca8c6a 100644 --- a/master/CA-14400-reduce-printk-levels +++ b/master/CA-14400-reduce-printk-levels @@ -1,7 +1,7 @@ -diff -r b5f167287694 -r cbb59ec6ee75 drivers/net/bonding/bond_sysfs.c ---- a/drivers/net/bonding/bond_sysfs.c Mon Sep 22 11:43:26 2008 +0100 -+++ b/drivers/net/bonding/bond_sysfs.c Mon Sep 22 11:43:29 2008 +0100 -@@ -276,7 +276,7 @@ static ssize_t bonding_store_slaves(stru +diff -r c4ed02a862f0 drivers/net/bonding/bond_sysfs.c +--- a/drivers/net/bonding/bond_sysfs.c Wed Jun 17 14:12:56 2009 +0100 ++++ b/drivers/net/bonding/bond_sysfs.c Wed Jun 17 14:21:39 2009 +0100 +@@ -276,7 +276,7 @@ read_lock(&bond->lock); bond_for_each_slave(bond, slave, i) if (strnicmp(slave->dev->name, ifname, IFNAMSIZ) == 0) { @@ -10,10 +10,10 @@ diff -r b5f167287694 -r cbb59ec6ee75 drivers/net/bonding/bond_sysfs.c ": %s: Interface %s is already enslaved!\n", bond->dev->name, ifname); ret = -EPERM; -diff -r b5f167287694 -r cbb59ec6ee75 drivers/xen/blkfront/blkfront.c ---- a/drivers/xen/blkfront/blkfront.c Mon Sep 22 11:43:26 2008 +0100 -+++ b/drivers/xen/blkfront/blkfront.c Mon Sep 22 11:43:29 2008 +0100 -@@ -294,7 +294,7 @@ static void backend_changed(struct xenbu +diff -r c4ed02a862f0 drivers/xen/blkfront/blkfront.c +--- a/drivers/xen/blkfront/blkfront.c Wed Jun 17 14:12:56 2009 +0100 ++++ b/drivers/xen/blkfront/blkfront.c Wed Jun 17 14:21:39 2009 +0100 +@@ -299,7 +299,7 @@ mutex_lock(&bd->bd_mutex); #endif if (info->users > 0) @@ -22,19 +22,19 @@ diff -r b5f167287694 -r cbb59ec6ee75 drivers/xen/blkfront/blkfront.c "Device in use; refusing to close"); else blkfront_closing(dev); -diff -r b5f167287694 -r cbb59ec6ee75 drivers/xen/xenbus/xenbus_client.c ---- a/drivers/xen/xenbus/xenbus_client.c Mon Sep 22 11:43:26 2008 +0100 -+++ b/drivers/xen/xenbus/xenbus_client.c Mon Sep 22 11:43:29 2008 +0100 -@@ -159,7 +159,7 @@ static char *error_path(struct xenbus_de +diff -r c4ed02a862f0 drivers/xen/xenbus/xenbus_client.c +--- a/drivers/xen/xenbus/xenbus_client.c Wed Jun 17 14:12:56 2009 +0100 ++++ b/drivers/xen/xenbus/xenbus_client.c Wed Jun 17 14:21:39 2009 +0100 +@@ -235,7 +235,7 @@ } --void _dev_error(struct xenbus_device *dev, int err, const char *fmt, -+static void _dev_error(struct xenbus_device *dev, int err, const char *loglevel, const char *fmt, - va_list ap) +-static void _dev_error(struct xenbus_device *dev, int err, ++static void _dev_error(struct xenbus_device *dev, int err, const char *loglevel, + const char *fmt, va_list ap) { int ret; -@@ -176,18 +176,19 @@ void _dev_error(struct xenbus_device *de +@@ -252,7 +252,8 @@ BUG_ON(len + ret > PRINTF_BUFFER_SIZE-1); @@ -44,27 +44,7 @@ diff -r b5f167287694 -r cbb59ec6ee75 drivers/xen/xenbus/xenbus_client.c path_buffer = error_path(dev); - if (path_buffer == NULL) { -- printk("xenbus: failed to write error node for %s (%s)\n", -+ printk(KERN_ERR "xenbus: failed to write error node for %s (%s)\n", - dev->nodename, printf_buffer); - goto fail; - } - - if (xenbus_write(XBT_NIL, path_buffer, "error", printf_buffer) != 0) { -- printk("xenbus: failed to write error node for %s (%s)\n", -+ printk(KERN_ERR "xenbus: failed to write error node for %s (%s)\n", - dev->nodename, printf_buffer); - goto fail; - } -@@ -199,18 +200,27 @@ fail: - kfree(path_buffer); - } - -- - void xenbus_dev_error(struct xenbus_device *dev, int err, const char *fmt, - ...) - { +@@ -293,7 +294,7 @@ va_list ap; va_start(ap, fmt); @@ -73,7 +53,11 @@ diff -r b5f167287694 -r cbb59ec6ee75 drivers/xen/xenbus/xenbus_client.c va_end(ap); } EXPORT_SYMBOL_GPL(xenbus_dev_error); - +@@ -309,13 +310,25 @@ + * xenbus_switch_state(dev, NULL, XenbusStateClosing) to schedule an orderly + * closedown of this driver and its peer. + */ ++ +void xenbus_dev_error_loglevel(struct xenbus_device *dev, int err, const char *loglevel, const char *fmt, + ...) +{ @@ -84,10 +68,10 @@ diff -r b5f167287694 -r cbb59ec6ee75 drivers/xen/xenbus/xenbus_client.c + va_end(ap); +} +EXPORT_SYMBOL_GPL(xenbus_dev_error_loglevel); - ++ void xenbus_dev_fatal(struct xenbus_device *dev, int err, const char *fmt, ...) -@@ -218,7 +228,7 @@ void xenbus_dev_fatal(struct xenbus_devi + { va_list ap; va_start(ap, fmt); @@ -96,10 +80,10 @@ diff -r b5f167287694 -r cbb59ec6ee75 drivers/xen/xenbus/xenbus_client.c va_end(ap); xenbus_switch_state(dev, XenbusStateClosing); -diff -r b5f167287694 -r cbb59ec6ee75 include/xen/xenbus.h ---- a/include/xen/xenbus.h Mon Sep 22 11:43:26 2008 +0100 -+++ b/include/xen/xenbus.h Mon Sep 22 11:43:29 2008 +0100 -@@ -287,6 +287,13 @@ void xenbus_dev_error(struct xenbus_devi +diff -r c4ed02a862f0 include/xen/xenbus.h +--- a/include/xen/xenbus.h Wed Jun 17 14:12:56 2009 +0100 ++++ b/include/xen/xenbus.h Wed Jun 17 14:21:39 2009 +0100 +@@ -314,6 +314,13 @@ void xenbus_dev_error(struct xenbus_device *dev, int err, const char *fmt, ...); diff --git a/master/CA-15999-blkback-pause-unpause b/master/CA-15999-blkback-pause-unpause index 9c73e97..a24983d 100644 --- a/master/CA-15999-blkback-pause-unpause +++ b/master/CA-15999-blkback-pause-unpause @@ -150,7 +150,7 @@ diff -r a1ea1a50c7ec drivers/xen/blkback/common.h - wait_queue_head_t wq; struct task_struct *xenblkd; unsigned int waiting_reqs; - struct request_queue *plug; + struct request_queue *plug; + + /* queue management */ + int queue_state; diff --git a/master/blkback-use-blk_getput_queue.patch b/master/blkback-use-blk_getput_queue.patch new file mode 100644 index 0000000..bc7080b --- /dev/null +++ b/master/blkback-use-blk_getput_queue.patch @@ -0,0 +1,21 @@ +--- a/drivers/xen/blkback/blkback.c 2009-06-17 09:56:54.000000000 +0100 ++++ b/drivers/xen/blkback/blkback.c 2009-06-16 17:05:06.000000000 +0100 +@@ -149,7 +149,7 @@ + return; + if (blkif->plug->unplug_fn) + blkif->plug->unplug_fn(blkif->plug); +- kobject_put(&blkif->plug->kobj); ++ blk_put_queue(blkif->plug); + blkif->plug = NULL; + } + +@@ -160,8 +160,7 @@ + if (q == blkif->plug) + return; + unplug_queue(blkif); +- WARN_ON(test_bit(QUEUE_FLAG_DEAD, &q->queue_flags)); +- kobject_get(&q->kobj); ++ blk_get_queue(q); + blkif->plug = q; + } + diff --git a/master/blkback_multi_page_ring b/master/blkback_multi_page_ring new file mode 100644 index 0000000..efee82f --- /dev/null +++ b/master/blkback_multi_page_ring @@ -0,0 +1,397 @@ +diff -r 801b056f04f7 drivers/xen/blkback/common.h +--- a/drivers/xen/blkback/common.h Tue Jun 23 11:29:51 2009 +0100 ++++ b/drivers/xen/blkback/common.h Fri Jul 03 10:38:03 2009 +0100 +@@ -70,6 +70,9 @@ + + struct backend_info; + ++#define BLKIF_MAX_RING_PAGE_ORDER 2 ++#define BLKIF_MAX_RING_PAGES (1 << BLKIF_MAX_RING_PAGE_ORDER) ++ + typedef struct blkif_st { + /* Unique identifier for this interface. */ + domid_t domid; +@@ -78,8 +81,8 @@ + unsigned int irq; + /* Comms information. */ + enum blkif_protocol blk_protocol; +- blkif_back_rings_t blk_rings; +- struct vm_struct *blk_ring_area; ++ blkif_back_rings_t blk_rings; ++ struct vm_struct *blk_ring_area; + /* The VBD attached to this interface. */ + struct vbd vbd; + /* Back pointer to the backend_info. */ +@@ -115,14 +118,15 @@ + + wait_queue_head_t waiting_to_free; + +- grant_handle_t shmem_handle; +- grant_ref_t shmem_ref; ++ unsigned int nr_shared_pages; ++ grant_handle_t shmem_handle[BLKIF_MAX_RING_PAGES]; + } blkif_t; + + blkif_t *blkif_alloc(domid_t domid); + void blkif_disconnect(blkif_t *blkif); + void blkif_free(blkif_t *blkif); +-int blkif_map(blkif_t *blkif, unsigned long shared_page, unsigned int evtchn); ++int blkif_map(blkif_t *blkif, unsigned long *shared_pages, ++ unsigned int nr_shared_pages, unsigned int evtchn); + + #define blkif_get(_b) (atomic_inc(&(_b)->refcnt)) + #define blkif_put(_b) \ +diff -r 801b056f04f7 drivers/xen/blkback/interface.c +--- a/drivers/xen/blkback/interface.c Tue Jun 23 11:29:51 2009 +0100 ++++ b/drivers/xen/blkback/interface.c Fri Jul 03 10:38:03 2009 +0100 +@@ -57,50 +57,91 @@ + return blkif; + } + +-static int map_frontend_page(blkif_t *blkif, unsigned long shared_page) ++#define INVALID_GRANT_HANDLE ((grant_handle_t)~0U) ++ ++static void unmap_frontend_pages(blkif_t *blkif) + { +- struct gnttab_map_grant_ref op; ++ struct vm_struct *area = blkif->blk_ring_area; ++ struct gnttab_unmap_grant_ref op[BLKIF_MAX_RING_PAGES]; ++ unsigned int i; ++ unsigned int j; + +- gnttab_set_map_op(&op, (unsigned long)blkif->blk_ring_area->addr, +- GNTMAP_host_map, shared_page, blkif->domid); ++ j = 0; ++ for (i = 0; i < blkif->nr_shared_pages; i++) { ++ unsigned long addr = (unsigned long)area->addr + ++ (i * PAGE_SIZE); + +- if (HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1)) ++ if (blkif->shmem_handle[i] != INVALID_GRANT_HANDLE) { ++ gnttab_set_unmap_op(&op[j++], addr, ++ GNTMAP_host_map, ++ blkif->shmem_handle[i]); ++ ++ blkif->shmem_handle[i] = INVALID_GRANT_HANDLE; ++ } ++ } ++ ++ blkif->nr_shared_pages = 0; ++ ++ if (j != 0) { ++ if (HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, ++ op, j)) ++ BUG(); ++ } ++} ++ ++static int map_frontend_pages(blkif_t *blkif, unsigned long shared_pages[], ++ unsigned int nr_shared_pages) ++{ ++ struct vm_struct *area = blkif->blk_ring_area; ++ struct gnttab_map_grant_ref op[BLKIF_MAX_RING_PAGES]; ++ unsigned int i; ++ int status = 0; ++ ++ for (i = 0; i < nr_shared_pages; i++) { ++ unsigned long addr = (unsigned long)area->addr + ++ (i * PAGE_SIZE); ++ ++ gnttab_set_map_op(&op[i], addr, GNTMAP_host_map, ++ shared_pages[i], blkif->domid); ++ } ++ ++ if (HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, op, ++ nr_shared_pages)) + BUG(); + +- if (op.status) { +- DPRINTK(" Grant table operation failure !\n"); +- return op.status; ++ for (i = 0; i < nr_shared_pages; i++) { ++ if ((status = op[i].status) != 0) { ++ blkif->shmem_handle[i] = INVALID_GRANT_HANDLE; ++ continue; ++ } ++ ++ blkif->shmem_handle[i] = op[i].handle; + } + +- blkif->shmem_ref = shared_page; +- blkif->shmem_handle = op.handle; ++ blkif->nr_shared_pages = nr_shared_pages; + +- return 0; ++ if (status != 0) { ++ DPRINTK(" Grant table operation failure !\n"); ++ unmap_frontend_pages(blkif); ++ } ++ ++ return status; + } + +-static void unmap_frontend_page(blkif_t *blkif) ++int blkif_map(blkif_t *blkif, unsigned long shared_pages[], ++ unsigned int nr_shared_pages, unsigned int evtchn) + { +- struct gnttab_unmap_grant_ref op; +- +- gnttab_set_unmap_op(&op, (unsigned long)blkif->blk_ring_area->addr, +- GNTMAP_host_map, blkif->shmem_handle); +- +- if (HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1)) +- BUG(); +-} +- +-int blkif_map(blkif_t *blkif, unsigned long shared_page, unsigned int evtchn) +-{ ++ unsigned long size = nr_shared_pages * PAGE_SIZE; + int err; + + /* Already connected through? */ + if (blkif->irq) + return 0; + +- if ( (blkif->blk_ring_area = alloc_vm_area(PAGE_SIZE)) == NULL ) ++ if ( (blkif->blk_ring_area = alloc_vm_area(size)) == NULL ) + return -ENOMEM; + +- err = map_frontend_page(blkif, shared_page); ++ err = map_frontend_pages(blkif, shared_pages, nr_shared_pages); + if (err) { + free_vm_area(blkif->blk_ring_area); + return err; +@@ -111,21 +152,23 @@ + { + blkif_sring_t *sring; + sring = (blkif_sring_t *)blkif->blk_ring_area->addr; +- BACK_RING_INIT(&blkif->blk_rings.native, sring, PAGE_SIZE); ++ BACK_RING_INIT(&blkif->blk_rings.native, sring, size); + break; + } + case BLKIF_PROTOCOL_X86_32: + { + blkif_x86_32_sring_t *sring_x86_32; + sring_x86_32 = (blkif_x86_32_sring_t *)blkif->blk_ring_area->addr; +- BACK_RING_INIT(&blkif->blk_rings.x86_32, sring_x86_32, PAGE_SIZE); ++ BACK_RING_INIT(&blkif->blk_rings.x86_32, sring_x86_32, ++ size); + break; + } + case BLKIF_PROTOCOL_X86_64: + { + blkif_x86_64_sring_t *sring_x86_64; + sring_x86_64 = (blkif_x86_64_sring_t *)blkif->blk_ring_area->addr; +- BACK_RING_INIT(&blkif->blk_rings.x86_64, sring_x86_64, PAGE_SIZE); ++ BACK_RING_INIT(&blkif->blk_rings.x86_64, sring_x86_64, ++ size); + break; + } + default: +@@ -133,14 +176,17 @@ + } + + err = bind_interdomain_evtchn_to_irqhandler( +- blkif->domid, evtchn, blkif_be_int, 0, "blkif-backend", blkif); ++ blkif->domid, evtchn, blkif_be_int, 0, "blkif-backend", ++ blkif); + if (err < 0) + { +- unmap_frontend_page(blkif); ++ unmap_frontend_pages(blkif); + free_vm_area(blkif->blk_ring_area); ++ blkif->blk_ring_area = NULL; + blkif->blk_rings.common.sring = NULL; + return err; + } ++ + blkif->irq = err; + + return 0; +@@ -158,8 +204,9 @@ + } + + if (blkif->blk_rings.common.sring) { +- unmap_frontend_page(blkif); ++ unmap_frontend_pages(blkif); + free_vm_area(blkif->blk_ring_area); ++ blkif->blk_ring_area = NULL; + blkif->blk_rings.common.sring = NULL; + } + } +diff -r 801b056f04f7 drivers/xen/blkback/xenbus.c +--- a/drivers/xen/blkback/xenbus.c Tue Jun 23 11:29:51 2009 +0100 ++++ b/drivers/xen/blkback/xenbus.c Fri Jul 03 10:38:03 2009 +0100 +@@ -50,6 +50,11 @@ + static int connect_ring(struct backend_info *); + static void backend_changed(struct xenbus_watch *, const char **, + unsigned int); ++ ++/* Order of maximum shared ring size advertised to the front end. */ ++static int blkif_max_ring_page_order = 0; ++module_param_named(max_ring_page_order, blkif_max_ring_page_order, int, 0); ++MODULE_PARM_DESC(max_ring_page_order, "Order of maximum VM shared ring size"); + + static int blkback_name(blkif_t *blkif, char *buf) + { +@@ -543,6 +548,11 @@ + if (err) + goto fail; + ++ err = xenbus_printf(XBT_NIL, dev->nodename, "max-ring-page-order", ++ "%u", blkif_max_ring_page_order); ++ if (err) ++ goto fail; ++ + err = xenbus_switch_state(dev, XenbusStateInitWait); + if (err) + goto fail; +@@ -574,6 +584,8 @@ + err = xenbus_scanf(XBT_NIL, dev->nodename, "physical-device", "%x:%x", + &major, &minor); + if (err != 2) { ++ err = -EINVAL; ++ + xenbus_dev_fatal(dev, err, "reading physical-device"); + return err; + } +@@ -831,30 +843,89 @@ + xenbus_transaction_end(xbt, 1); + } + +- + static int connect_ring(struct backend_info *be) + { + struct xenbus_device *dev = be->dev; +- unsigned long ring_ref; + unsigned int evtchn; ++ unsigned int ring_order; ++ unsigned long ring_ref[BLKIF_MAX_RING_PAGES]; + char protocol[64] = ""; + int err; + + DPRINTK("%s", dev->otherend); + +- err = xenbus_gather(XBT_NIL, dev->otherend, "ring-ref", "%lu", &ring_ref, +- "event-channel", "%u", &evtchn, NULL); +- if (err) { +- xenbus_dev_fatal(dev, err, +- "reading %s/ring-ref and event-channel", ++ err = xenbus_scanf(XBT_NIL, dev->otherend, "event-channel", "%u", ++ &evtchn); ++ if (err != 1) { ++ err = -EINVAL; ++ ++ xenbus_dev_fatal(dev, err, "reading %s/event-channel", + dev->otherend); + return err; + } + ++ printk(KERN_INFO "blkback: event-channel %u\n", evtchn); ++ ++ err = xenbus_scanf(XBT_NIL, dev->otherend, "ring-page-order", "%u", ++ &ring_order); ++ if (err != 1) { ++ DPRINTK("%s: using single page handshake", dev->otherend); ++ ++ ring_order = 0; ++ ++ err = xenbus_scanf(XBT_NIL, dev->otherend, "ring-ref", ++ "%lu", &ring_ref[0]); ++ if (err != 1) { ++ err = -EINVAL; ++ ++ xenbus_dev_fatal(dev, err, "reading %s/ring-ref", ++ dev->otherend); ++ return err; ++ } ++ ++ printk(KERN_INFO "blkback: ring-ref %lu\n", ring_ref[0]); ++ } else { ++ unsigned int i; ++ ++ if (ring_order > blkif_max_ring_page_order) { ++ err = -EINVAL; ++ ++ xenbus_dev_fatal(dev, err, ++ "%s/ring-page-order too big", ++ dev->otherend); ++ return err; ++ } ++ ++ DPRINTK("%s: using %u page(s)", dev->otherend, ++ (1 << ring_order)); ++ ++ for (i = 0; i < (1u << ring_order); i++) { ++ char ring_ref_name[10]; ++ ++ snprintf(ring_ref_name, sizeof (ring_ref_name), ++ "ring-ref%1u", i); ++ err = xenbus_scanf(XBT_NIL, dev->otherend, ++ ring_ref_name, "%lu", ++ &ring_ref[i]); ++ if (err != 1) { ++ err = -EINVAL; ++ ++ xenbus_dev_fatal(dev, err, ++ "reading %s/%s", ++ dev->otherend, ++ ring_ref_name); ++ return err; ++ } ++ ++ printk(KERN_INFO "blkback: ring-ref%u %lu\n", i, ++ ring_ref[i]); ++ } ++ } ++ + be->blkif->blk_protocol = BLKIF_PROTOCOL_NATIVE; +- err = xenbus_gather(XBT_NIL, dev->otherend, "protocol", +- "%63s", protocol, NULL); +- if (err) ++ err = xenbus_scanf(XBT_NIL, dev->otherend, "protocol", ++ "%63s", protocol); ++ if (err != 1) + strcpy(protocol, "unspecified, assuming native"); + else if (0 == strcmp(protocol, XEN_IO_PROTO_ABI_NATIVE)) + be->blkif->blk_protocol = BLKIF_PROTOCOL_NATIVE; +@@ -867,18 +938,21 @@ + else if (0 == strcmp(protocol, "2")) /* SLES compatibility */ + be->blkif->blk_protocol = BLKIF_PROTOCOL_X86_64; + else { +- xenbus_dev_fatal(dev, err, "unknown fe protocol %s", protocol); +- return -1; ++ err = -EINVAL; ++ ++ xenbus_dev_fatal(dev, err, "unknown fe protocol %s", ++ protocol); ++ return err; + } +- printk(KERN_INFO +- "blkback: ring-ref %ld, event-channel %d, protocol %d (%s)\n", +- ring_ref, evtchn, be->blkif->blk_protocol, protocol); ++ ++ printk(KERN_INFO "blkback: protocol %d (%s)\n", ++ be->blkif->blk_protocol, protocol); + + /* Map the shared frame, irq etc. */ +- err = blkif_map(be->blkif, ring_ref, evtchn); ++ err = blkif_map(be->blkif, ring_ref, (1u << ring_order), evtchn); + if (err) { +- xenbus_dev_fatal(dev, err, "mapping ring-ref %lu port %u", +- ring_ref, evtchn); ++ xenbus_dev_fatal(dev, err, ++ "mapping ring-refs and evtchn"); + return err; + } + +@@ -907,6 +981,9 @@ + + void blkif_xenbus_init(void) + { ++ if (blkif_max_ring_page_order > BLKIF_MAX_RING_PAGE_ORDER) ++ blkif_max_ring_page_order = BLKIF_MAX_RING_PAGE_ORDER; ++ + if (xenbus_register_backend(&blkback)) + BUG(); + } diff --git a/master/blktap_multi_page_ring b/master/blktap_multi_page_ring new file mode 100644 index 0000000..8c97f7e --- /dev/null +++ b/master/blktap_multi_page_ring @@ -0,0 +1,418 @@ +diff -r 7cdc164e3ab8 drivers/xen/blktap/blktap.c +--- a/drivers/xen/blktap/blktap.c Fri Jul 03 10:38:03 2009 +0100 ++++ b/drivers/xen/blktap/blktap.c Fri Jul 03 10:38:55 2009 +0100 +@@ -62,16 +62,17 @@ + #define MAX_DEV_NAME 100 /*the max tapdisk ring device name e.g. blktap0 */ + + static int blkif_reqs = MAX_PENDING_REQS; ++module_param(blkif_reqs, int, 0); ++ + static int mmap_pages = MMAP_PAGES; + + #define RING_PAGES 1 /* BLKTAP - immediately before the mmap area, we +- * have a bunch of pages reserved for shared ++ * have a bunch of pages reserved for user/kernel shared + * memory rings. + */ + + static struct tap_blkif *tapfds[MAX_TAP_DEV]; + +-module_param(blkif_reqs, int, 0); + /* Run-time switchable: /sys/module/blktap/parameters/ */ + static unsigned int log_stats = 0; + static unsigned int debug_lvl = 0; +diff -r 7cdc164e3ab8 drivers/xen/blktap/blktap.h +--- a/drivers/xen/blktap/blktap.h Fri Jul 03 10:38:03 2009 +0100 ++++ b/drivers/xen/blktap/blktap.h Fri Jul 03 10:38:55 2009 +0100 +@@ -13,7 +13,7 @@ + #define BLK_RING_SIZE __RING_SIZE((blkif_sring_t *)0, PAGE_SIZE) + #define MAX_DYNAMIC_MEM BLK_RING_SIZE + #define MAX_PENDING_REQS BLK_RING_SIZE +-#define MMAP_PAGES (MAX_PENDING_REQS * BLKIF_MAX_SEGMENTS_PER_REQUEST) ++#define MMAP_PAGES (MAX_PENDING_REQS * BLKIF_MAX_SEGMENTS_PER_REQUEST) + #define MMAP_VADDR(_start, _req,_seg) \ + (_start + \ + ((_req) * BLKIF_MAX_SEGMENTS_PER_REQUEST * PAGE_SIZE) + \ +diff -r 7cdc164e3ab8 drivers/xen/blktap/common.h +--- a/drivers/xen/blktap/common.h Fri Jul 03 10:38:03 2009 +0100 ++++ b/drivers/xen/blktap/common.h Fri Jul 03 10:38:55 2009 +0100 +@@ -53,6 +53,9 @@ + + struct backend_info; + ++#define BLKIF_MAX_RING_PAGE_ORDER 2 ++#define BLKIF_MAX_RING_PAGES (1 << BLKIF_MAX_RING_PAGE_ORDER) ++ + typedef struct blkif_st { + /* Unique identifier for this interface. */ + domid_t domid; +@@ -90,8 +93,8 @@ + + wait_queue_head_t waiting_to_free; + +- grant_handle_t shmem_handle; +- grant_ref_t shmem_ref; ++ unsigned int nr_shared_pages; ++ grant_handle_t shmem_handle[BLKIF_MAX_RING_PAGES]; + + struct tap_blkif *tapif; + uint64_t sectors; +@@ -99,8 +102,8 @@ + + blkif_t *tap_alloc_blkif(domid_t domid); + void tap_blkif_free(blkif_t *blkif); +-int tap_blkif_map(blkif_t *blkif, unsigned long shared_page, +- unsigned int evtchn); ++int tap_blkif_map(blkif_t *blkif, unsigned long shared_pages[], ++ unsigned int nr_shared_pages, unsigned int evtchn); + void tap_blkif_disconnect(blkif_t *blkif); + int tap_blkif_connected(blkif_t *blkif); + +diff -r 7cdc164e3ab8 drivers/xen/blktap/interface.c +--- a/drivers/xen/blktap/interface.c Fri Jul 03 10:38:03 2009 +0100 ++++ b/drivers/xen/blktap/interface.c Fri Jul 03 10:38:55 2009 +0100 +@@ -55,51 +55,93 @@ + return blkif; + } + +-static int map_frontend_page(blkif_t *blkif, unsigned long shared_page) ++#define INVALID_GRANT_HANDLE ((grant_handle_t)~0U) ++ ++static void unmap_frontend_pages(blkif_t *blkif) + { +- struct gnttab_map_grant_ref op; ++ struct vm_struct *area = blkif->blk_ring_area; ++ struct gnttab_unmap_grant_ref op[BLKIF_MAX_RING_PAGES]; ++ unsigned int i; ++ unsigned int j; + +- gnttab_set_map_op(&op, (unsigned long)blkif->blk_ring_area->addr, +- GNTMAP_host_map, shared_page, blkif->domid); ++ j = 0; ++ for (i = 0; i < blkif->nr_shared_pages; i++) { ++ unsigned long addr = (unsigned long)area->addr + ++ (i * PAGE_SIZE); + +- if (HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1)) ++ if (blkif->shmem_handle[i] != INVALID_GRANT_HANDLE) { ++ gnttab_set_unmap_op(&op[j++], addr, ++ GNTMAP_host_map, ++ blkif->shmem_handle[i]); ++ ++ blkif->shmem_handle[i] = INVALID_GRANT_HANDLE; ++ } ++ } ++ ++ blkif->nr_shared_pages = 0; ++ ++ if (j != 0) { ++ if (HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, ++ op, j)) ++ BUG(); ++ } ++} ++ ++static int map_frontend_pages(blkif_t *blkif, unsigned long shared_pages[], ++ unsigned int nr_shared_pages) ++{ ++ struct vm_struct *area = blkif->blk_ring_area; ++ struct gnttab_map_grant_ref op[BLKIF_MAX_RING_PAGES]; ++ unsigned int i; ++ int failed = 0; ++ ++ for (i = 0; i < nr_shared_pages; i++) { ++ unsigned long addr = (unsigned long)area->addr + ++ (i * PAGE_SIZE); ++ ++ gnttab_set_map_op(&op[i], addr, GNTMAP_host_map, ++ shared_pages[i], blkif->domid); ++ } ++ ++ if (HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, op, ++ nr_shared_pages)) + BUG(); + +- if (op.status) { +- DPRINTK(" Grant table operation failure !\n"); +- return op.status; ++ for (i = 0; i < nr_shared_pages; i++) { ++ if (op[i].status != 0) { ++ blkif->shmem_handle[i] = INVALID_GRANT_HANDLE; ++ ++ failed = 1; ++ continue; ++ } ++ ++ blkif->shmem_handle[i] = op[i].handle; + } + +- blkif->shmem_ref = shared_page; +- blkif->shmem_handle = op.handle; ++ blkif->nr_shared_pages = nr_shared_pages; + +- return 0; ++ if (failed) { ++ DPRINTK(" Grant table operation failure !\n"); ++ unmap_frontend_pages(blkif); ++ } ++ ++ return (failed) ? -EFAULT : 0; + } + +-static void unmap_frontend_page(blkif_t *blkif) ++int tap_blkif_map(blkif_t *blkif, unsigned long shared_pages[], ++ unsigned int nr_shared_pages, unsigned int evtchn) + { +- struct gnttab_unmap_grant_ref op; +- +- gnttab_set_unmap_op(&op, (unsigned long)blkif->blk_ring_area->addr, +- GNTMAP_host_map, blkif->shmem_handle); +- +- if (HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1)) +- BUG(); +-} +- +-int tap_blkif_map(blkif_t *blkif, unsigned long shared_page, +- unsigned int evtchn) +-{ ++ unsigned long size = nr_shared_pages * PAGE_SIZE; + int err; + + /* Already connected through? */ + if (blkif->irq) + return 0; + +- if ( (blkif->blk_ring_area = alloc_vm_area(PAGE_SIZE)) == NULL ) ++ if ( (blkif->blk_ring_area = alloc_vm_area(size)) == NULL ) + return -ENOMEM; + +- err = map_frontend_page(blkif, shared_page); ++ err = map_frontend_pages(blkif, shared_pages, nr_shared_pages); + if (err) { + free_vm_area(blkif->blk_ring_area); + return err; +@@ -110,21 +152,23 @@ + { + blkif_sring_t *sring; + sring = (blkif_sring_t *)blkif->blk_ring_area->addr; +- BACK_RING_INIT(&blkif->blk_rings.native, sring, PAGE_SIZE); ++ BACK_RING_INIT(&blkif->blk_rings.native, sring, size); + break; + } + case BLKIF_PROTOCOL_X86_32: + { + blkif_x86_32_sring_t *sring_x86_32; + sring_x86_32 = (blkif_x86_32_sring_t *)blkif->blk_ring_area->addr; +- BACK_RING_INIT(&blkif->blk_rings.x86_32, sring_x86_32, PAGE_SIZE); ++ BACK_RING_INIT(&blkif->blk_rings.x86_32, sring_x86_32, ++ size); + break; + } + case BLKIF_PROTOCOL_X86_64: + { + blkif_x86_64_sring_t *sring_x86_64; + sring_x86_64 = (blkif_x86_64_sring_t *)blkif->blk_ring_area->addr; +- BACK_RING_INIT(&blkif->blk_rings.x86_64, sring_x86_64, PAGE_SIZE); ++ BACK_RING_INIT(&blkif->blk_rings.x86_64, sring_x86_64, ++ size); + break; + } + default: +@@ -134,12 +178,15 @@ + err = bind_interdomain_evtchn_to_irqhandler( + blkif->domid, evtchn, tap_blkif_be_int, + 0, "blkif-backend", blkif); +- if (err < 0) { +- unmap_frontend_page(blkif); ++ if (err < 0) ++ { ++ unmap_frontend_pages(blkif); + free_vm_area(blkif->blk_ring_area); ++ blkif->blk_ring_area = NULL; + blkif->blk_rings.common.sring = NULL; + return err; + } ++ + blkif->irq = err; + + return 0; +@@ -156,8 +203,9 @@ + blkif->irq = 0; + } + if (blkif->blk_rings.common.sring) { +- unmap_frontend_page(blkif); ++ unmap_frontend_pages(blkif); + free_vm_area(blkif->blk_ring_area); ++ blkif->blk_ring_area = NULL; + blkif->blk_rings.common.sring = NULL; + } + } +diff -r 7cdc164e3ab8 drivers/xen/blktap/xenbus.c +--- a/drivers/xen/blktap/xenbus.c Fri Jul 03 10:38:03 2009 +0100 ++++ b/drivers/xen/blktap/xenbus.c Fri Jul 03 10:38:55 2009 +0100 +@@ -74,6 +74,11 @@ + unsigned int); + static void tap_frontend_changed(struct xenbus_device *dev, + enum xenbus_state frontend_state); ++ ++/* Order of maximum shared ring size advertised to the front end. */ ++static int blkif_max_ring_page_order = 0; ++module_param_named(max_ring_page_order, blkif_max_ring_page_order, int, 0); ++MODULE_PARM_DESC(max_ring_page_order, "Order of maximum VM shared ring size"); + + static void + link_backend_device(struct backend_info *be) +@@ -607,6 +612,11 @@ + if (err) + goto fail; + ++ err = xenbus_printf(XBT_NIL, dev->nodename, "max-ring-page-order", ++ "%u", blkif_max_ring_page_order); ++ if (err) ++ goto fail; ++ + err = xenbus_switch_state(dev, XenbusStateInitWait); + if (err) + goto fail; +@@ -794,26 +804,86 @@ + static int connect_ring(struct backend_info *be) + { + struct xenbus_device *dev = be->dev; +- unsigned long ring_ref; + unsigned int evtchn; +- char protocol[64]; ++ unsigned int ring_order; ++ unsigned long ring_ref[BLKIF_MAX_RING_PAGES]; ++ char protocol[64] = ""; + int err; + +- DPRINTK("%s\n", dev->otherend); ++ DPRINTK("%s", dev->otherend); + +- err = xenbus_gather(XBT_NIL, dev->otherend, "ring-ref", "%lu", +- &ring_ref, "event-channel", "%u", &evtchn, NULL); +- if (err) { +- xenbus_dev_fatal(dev, err, +- "reading %s/ring-ref and event-channel", ++ err = xenbus_scanf(XBT_NIL, dev->otherend, "event-channel", "%u", ++ &evtchn); ++ if (err != 1) { ++ err = -EINVAL; ++ ++ xenbus_dev_fatal(dev, err, "reading %s/event-channel", + dev->otherend); + return err; + } + ++ printk(KERN_INFO "blktap: event-channel %u\n", evtchn); ++ ++ err = xenbus_scanf(XBT_NIL, dev->otherend, "ring-page-order", "%u", ++ &ring_order); ++ if (err != 1) { ++ DPRINTK("%s: using single page handshake", dev->otherend); ++ ++ ring_order = 0; ++ ++ err = xenbus_scanf(XBT_NIL, dev->otherend, "ring-ref", ++ "%lu", &ring_ref[0]); ++ if (err != 1) { ++ err = -EINVAL; ++ ++ xenbus_dev_fatal(dev, err, "reading %s/ring-ref", ++ dev->otherend); ++ return err; ++ } ++ ++ printk(KERN_INFO "blktap: ring-ref %lu\n", ring_ref[0]); ++ } else { ++ unsigned int i; ++ ++ if (ring_order > blkif_max_ring_page_order) { ++ err = -EINVAL; ++ ++ xenbus_dev_fatal(dev, err, ++ "%s/ring-page-order too big", ++ dev->otherend); ++ return err; ++ } ++ ++ DPRINTK("%s: using %u page(s)", dev->otherend, ++ (1 << ring_order)); ++ ++ for (i = 0; i < (1u << ring_order); i++) { ++ char ring_ref_name[10]; ++ ++ snprintf(ring_ref_name, sizeof (ring_ref_name), ++ "ring-ref%1u", i); ++ err = xenbus_scanf(XBT_NIL, dev->otherend, ++ ring_ref_name, "%lu", ++ &ring_ref[i]); ++ if (err != 1) { ++ err = -EINVAL; ++ ++ xenbus_dev_fatal(dev, err, ++ "reading %s/%s", ++ dev->otherend, ++ ring_ref_name); ++ return err; ++ } ++ ++ printk(KERN_INFO "blktap: ring-ref%u %lu\n", i, ++ ring_ref[i]); ++ } ++ } ++ + be->blkif->blk_protocol = BLKIF_PROTOCOL_NATIVE; +- err = xenbus_gather(XBT_NIL, dev->otherend, "protocol", +- "%63s", protocol, NULL); +- if (err) ++ err = xenbus_scanf(XBT_NIL, dev->otherend, "protocol", ++ "%63s", protocol); ++ if (err != 1) + strcpy(protocol, "unspecified, assuming native"); + else if (0 == strcmp(protocol, XEN_IO_PROTO_ABI_NATIVE)) + be->blkif->blk_protocol = BLKIF_PROTOCOL_NATIVE; +@@ -826,20 +896,24 @@ + else if (0 == strcmp(protocol, "2")) /* SLES compatibility */ + be->blkif->blk_protocol = BLKIF_PROTOCOL_X86_64; + else { +- xenbus_dev_fatal(dev, err, "unknown fe protocol %s", protocol); +- return -1; ++ err = -EINVAL; ++ ++ xenbus_dev_fatal(dev, err, "unknown fe protocol %s", ++ protocol); ++ return err; + } +- printk(KERN_INFO +- "blktap: ring-ref %ld, event-channel %d, protocol %d (%s)\n", +- ring_ref, evtchn, be->blkif->blk_protocol, protocol); ++ ++ printk(KERN_INFO "blktap: protocol %d (%s)\n", ++ be->blkif->blk_protocol, protocol); + + /* Map the shared frame, irq etc. */ +- err = tap_blkif_map(be->blkif, ring_ref, evtchn); ++ err = tap_blkif_map(be->blkif, ring_ref, (1u << ring_order), ++ evtchn); + if (err) { +- xenbus_dev_fatal(dev, err, "mapping ring-ref %lu port %u", +- ring_ref, evtchn); ++ xenbus_dev_fatal(dev, err, ++ "mapping ring-refs and evtchn"); + return err; +- } ++ } + + return 0; + } +@@ -866,6 +940,9 @@ + + void tap_blkif_xenbus_init(void) + { ++ if (blkif_max_ring_page_order > BLKIF_MAX_RING_PAGE_ORDER) ++ blkif_max_ring_page_order = BLKIF_MAX_RING_PAGE_ORDER; ++ + if (xenbus_register_backend(&blktap)) + BUG(); + } diff --git a/master/bnx2-1.9.16b b/master/bnx2-1.9.16b new file mode 100644 index 0000000..a326937 --- /dev/null +++ b/master/bnx2-1.9.16b @@ -0,0 +1,33332 @@ +diff -r 19900e8f54d8 drivers/net/5710_hsi_cnic.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/5710_hsi_cnic.h Mon Jun 15 16:38:18 2009 +0100 +@@ -0,0 +1,2936 @@ ++#ifndef __5710_HSI_CNIC_LE__ ++#define __5710_HSI_CNIC_LE__ ++ ++/* ++ * common data for all protocols ++ */ ++struct b577xx_doorbell_hdr { ++ u8 header; ++#define B577XX_DOORBELL_HDR_RX (0x1<<0) ++#define B577XX_DOORBELL_HDR_RX_SHIFT 0 ++#define B577XX_DOORBELL_HDR_DB_TYPE (0x1<<1) ++#define B577XX_DOORBELL_HDR_DB_TYPE_SHIFT 1 ++#define B577XX_DOORBELL_HDR_DPM_SIZE (0x3<<2) ++#define B577XX_DOORBELL_HDR_DPM_SIZE_SHIFT 2 ++#define B577XX_DOORBELL_HDR_CONN_TYPE (0xF<<4) ++#define B577XX_DOORBELL_HDR_CONN_TYPE_SHIFT 4 ++}; ++ ++/* ++ * doorbell message sent to the chip ++ */ ++struct b577xx_doorbell { ++#if defined(__BIG_ENDIAN) ++ u16 zero_fill2; ++ u8 zero_fill1; ++ struct b577xx_doorbell_hdr header; ++#elif defined(__LITTLE_ENDIAN) ++ struct b577xx_doorbell_hdr header; ++ u8 zero_fill1; ++ u16 zero_fill2; ++#endif ++}; ++ ++/* ++ * iSCSI context region, used only in iSCSI ++ */ ++struct ustorm_iscsi_rq_db { ++ struct regpair pbl_base; ++ struct regpair curr_pbe; ++}; ++ ++/* ++ * iSCSI context region, used only in iSCSI ++ */ ++struct ustorm_iscsi_r2tq_db { ++ struct regpair pbl_base; ++ struct regpair curr_pbe; ++}; ++ ++/* ++ * iSCSI context region, used only in iSCSI ++ */ ++struct ustorm_iscsi_cq_db { ++#if defined(__BIG_ENDIAN) ++ u16 cq_sn; ++ u16 prod; ++#elif defined(__LITTLE_ENDIAN) ++ u16 prod; ++ u16 cq_sn; ++#endif ++ struct regpair curr_pbe; ++}; ++ ++/* ++ * iSCSI context region, used only in iSCSI ++ */ ++struct rings_db { ++ struct ustorm_iscsi_rq_db rq; ++ struct ustorm_iscsi_r2tq_db r2tq; ++ struct ustorm_iscsi_cq_db cq[8]; ++#if defined(__BIG_ENDIAN) ++ u16 rq_prod; ++ u16 r2tq_prod; ++#elif defined(__LITTLE_ENDIAN) ++ u16 r2tq_prod; ++ u16 rq_prod; ++#endif ++ struct regpair cq_pbl_base; ++}; ++ ++/* ++ * iSCSI context region, used only in iSCSI ++ */ ++struct ustorm_iscsi_placement_db { ++ u32 sgl_base_lo; ++ u32 sgl_base_hi; ++ u32 local_sge_0_address_hi; ++ u32 local_sge_0_address_lo; ++#if defined(__BIG_ENDIAN) ++ u16 curr_sge_offset; ++ u16 local_sge_0_size; ++#elif defined(__LITTLE_ENDIAN) ++ u16 local_sge_0_size; ++ u16 curr_sge_offset; ++#endif ++ u32 local_sge_1_address_hi; ++ u32 local_sge_1_address_lo; ++#if defined(__BIG_ENDIAN) ++ u16 reserved6; ++ u16 local_sge_1_size; ++#elif defined(__LITTLE_ENDIAN) ++ u16 local_sge_1_size; ++ u16 reserved6; ++#endif ++#if defined(__BIG_ENDIAN) ++ u8 sgl_size; ++ u8 local_sge_index_2b; ++ u16 reserved7; ++#elif defined(__LITTLE_ENDIAN) ++ u16 reserved7; ++ u8 local_sge_index_2b; ++ u8 sgl_size; ++#endif ++ u32 rem_pdu; ++ u32 place_db_bitfield_1; ++#define USTORM_ISCSI_PLACEMENT_DB_REM_PDU_PAYLOAD (0xFFFFFF<<0) ++#define USTORM_ISCSI_PLACEMENT_DB_REM_PDU_PAYLOAD_SHIFT 0 ++#define USTORM_ISCSI_PLACEMENT_DB_CQ_ID (0xFF<<24) ++#define USTORM_ISCSI_PLACEMENT_DB_CQ_ID_SHIFT 24 ++ u32 place_db_bitfield_2; ++#define USTORM_ISCSI_PLACEMENT_DB_BYTES_2_TRUNCATE (0xFFFFFF<<0) ++#define USTORM_ISCSI_PLACEMENT_DB_BYTES_2_TRUNCATE_SHIFT 0 ++#define USTORM_ISCSI_PLACEMENT_DB_HOST_SGE_INDEX (0xFF<<24) ++#define USTORM_ISCSI_PLACEMENT_DB_HOST_SGE_INDEX_SHIFT 24 ++ u32 nal; ++#define USTORM_ISCSI_PLACEMENT_DB_REM_SGE_SIZE (0xFFFFFF<<0) ++#define USTORM_ISCSI_PLACEMENT_DB_REM_SGE_SIZE_SHIFT 0 ++#define USTORM_ISCSI_PLACEMENT_DB_EXP_PADDING_2B (0x3<<24) ++#define USTORM_ISCSI_PLACEMENT_DB_EXP_PADDING_2B_SHIFT 24 ++#define USTORM_ISCSI_PLACEMENT_DB_EXP_DIGEST_3B (0x7<<26) ++#define USTORM_ISCSI_PLACEMENT_DB_EXP_DIGEST_3B_SHIFT 26 ++#define USTORM_ISCSI_PLACEMENT_DB_NAL_LEN_3B (0x7<<29) ++#define USTORM_ISCSI_PLACEMENT_DB_NAL_LEN_3B_SHIFT 29 ++}; ++ ++/* ++ * Ustorm iSCSI Storm Context ++ */ ++struct ustorm_iscsi_st_context { ++ u32 exp_stat_sn; ++ u32 exp_data_sn; ++ struct rings_db ring; ++ struct regpair task_pbl_base; ++ struct regpair tce_phy_addr; ++ struct ustorm_iscsi_placement_db place_db; ++ u32 data_rcv_seq; ++ u32 rem_rcv_len; ++#if defined(__BIG_ENDIAN) ++ u16 hdr_itt; ++ u16 iscsi_conn_id; ++#elif defined(__LITTLE_ENDIAN) ++ u16 iscsi_conn_id; ++ u16 hdr_itt; ++#endif ++ u32 nal_bytes; ++#if defined(__BIG_ENDIAN) ++ u8 hdr_second_byte_union; ++ u8 bitfield_0; ++#define USTORM_ISCSI_ST_CONTEXT_BMIDDLEOFPDU (0x1<<0) ++#define USTORM_ISCSI_ST_CONTEXT_BMIDDLEOFPDU_SHIFT 0 ++#define USTORM_ISCSI_ST_CONTEXT_BFENCECQE (0x1<<1) ++#define USTORM_ISCSI_ST_CONTEXT_BFENCECQE_SHIFT 1 ++#define USTORM_ISCSI_ST_CONTEXT_RESERVED1 (0x3F<<2) ++#define USTORM_ISCSI_ST_CONTEXT_RESERVED1_SHIFT 2 ++ u8 task_pdu_cache_index; ++ u8 task_pbe_cache_index; ++#elif defined(__LITTLE_ENDIAN) ++ u8 task_pbe_cache_index; ++ u8 task_pdu_cache_index; ++ u8 bitfield_0; ++#define USTORM_ISCSI_ST_CONTEXT_BMIDDLEOFPDU (0x1<<0) ++#define USTORM_ISCSI_ST_CONTEXT_BMIDDLEOFPDU_SHIFT 0 ++#define USTORM_ISCSI_ST_CONTEXT_BFENCECQE (0x1<<1) ++#define USTORM_ISCSI_ST_CONTEXT_BFENCECQE_SHIFT 1 ++#define USTORM_ISCSI_ST_CONTEXT_RESERVED1 (0x3F<<2) ++#define USTORM_ISCSI_ST_CONTEXT_RESERVED1_SHIFT 2 ++ u8 hdr_second_byte_union; ++#endif ++#if defined(__BIG_ENDIAN) ++ u16 reserved3; ++ u8 reserved2; ++ u8 acDecrement; ++#elif defined(__LITTLE_ENDIAN) ++ u8 acDecrement; ++ u8 reserved2; ++ u16 reserved3; ++#endif ++ u32 task_stat; ++#if defined(__BIG_ENDIAN) ++ u8 hdr_opcode; ++ u8 num_cqs; ++ u16 reserved5; ++#elif defined(__LITTLE_ENDIAN) ++ u16 reserved5; ++ u8 num_cqs; ++ u8 hdr_opcode; ++#endif ++ u32 negotiated_rx; ++#define USTORM_ISCSI_ST_CONTEXT_MAX_RECV_PDU_LENGTH (0xFFFFFF<<0) ++#define USTORM_ISCSI_ST_CONTEXT_MAX_RECV_PDU_LENGTH_SHIFT 0 ++#define USTORM_ISCSI_ST_CONTEXT_MAX_OUTSTANDING_R2TS (0xFF<<24) ++#define USTORM_ISCSI_ST_CONTEXT_MAX_OUTSTANDING_R2TS_SHIFT 24 ++ u32 negotiated_rx_and_flags; ++#define USTORM_ISCSI_ST_CONTEXT_MAX_BURST_LENGTH (0xFFFFFF<<0) ++#define USTORM_ISCSI_ST_CONTEXT_MAX_BURST_LENGTH_SHIFT 0 ++#define USTORM_ISCSI_ST_CONTEXT_B_CQE_POSTED_OR_HEADER_CACHED (0x1<<24) ++#define USTORM_ISCSI_ST_CONTEXT_B_CQE_POSTED_OR_HEADER_CACHED_SHIFT 24 ++#define USTORM_ISCSI_ST_CONTEXT_B_HDR_DIGEST_EN (0x1<<25) ++#define USTORM_ISCSI_ST_CONTEXT_B_HDR_DIGEST_EN_SHIFT 25 ++#define USTORM_ISCSI_ST_CONTEXT_B_DATA_DIGEST_EN (0x1<<26) ++#define USTORM_ISCSI_ST_CONTEXT_B_DATA_DIGEST_EN_SHIFT 26 ++#define USTORM_ISCSI_ST_CONTEXT_B_PROTOCOL_ERROR (0x1<<27) ++#define USTORM_ISCSI_ST_CONTEXT_B_PROTOCOL_ERROR_SHIFT 27 ++#define USTORM_ISCSI_ST_CONTEXT_B_TASK_VALID (0x1<<28) ++#define USTORM_ISCSI_ST_CONTEXT_B_TASK_VALID_SHIFT 28 ++#define USTORM_ISCSI_ST_CONTEXT_TASK_TYPE (0x3<<29) ++#define USTORM_ISCSI_ST_CONTEXT_TASK_TYPE_SHIFT 29 ++#define USTORM_ISCSI_ST_CONTEXT_B_ALL_DATA_ACKED (0x1<<31) ++#define USTORM_ISCSI_ST_CONTEXT_B_ALL_DATA_ACKED_SHIFT 31 ++}; ++ ++/* ++ * TCP context region, shared in TOE, RDMA and ISCSI ++ */ ++struct tstorm_tcp_st_context_section { ++ u32 flags1; ++#define TSTORM_TCP_ST_CONTEXT_SECTION_RTT_SRTT_20B (0xFFFFFF<<0) ++#define TSTORM_TCP_ST_CONTEXT_SECTION_RTT_SRTT_20B_SHIFT 0 ++#define TSTORM_TCP_ST_CONTEXT_SECTION_PAWS_INVALID (0x1<<24) ++#define TSTORM_TCP_ST_CONTEXT_SECTION_PAWS_INVALID_SHIFT 24 ++#define TSTORM_TCP_ST_CONTEXT_SECTION_TIMESTAMP_EXISTS (0x1<<25) ++#define TSTORM_TCP_ST_CONTEXT_SECTION_TIMESTAMP_EXISTS_SHIFT 25 ++#define TSTORM_TCP_ST_CONTEXT_SECTION_ISLE_EXISTS (0x1<<26) ++#define TSTORM_TCP_ST_CONTEXT_SECTION_ISLE_EXISTS_SHIFT 26 ++#define TSTORM_TCP_ST_CONTEXT_SECTION_STOP_RX_PAYLOAD (0x1<<27) ++#define TSTORM_TCP_ST_CONTEXT_SECTION_STOP_RX_PAYLOAD_SHIFT 27 ++#define TSTORM_TCP_ST_CONTEXT_SECTION_KA_ENABLED (0x1<<28) ++#define TSTORM_TCP_ST_CONTEXT_SECTION_KA_ENABLED_SHIFT 28 ++#define TSTORM_TCP_ST_CONTEXT_SECTION_FIRST_RTO_ESTIMATE (0x1<<29) ++#define TSTORM_TCP_ST_CONTEXT_SECTION_FIRST_RTO_ESTIMATE_SHIFT 29 ++#define TSTORM_TCP_ST_CONTEXT_SECTION_MAX_SEG_RETRANSMIT_EN (0x1<<30) ++#define TSTORM_TCP_ST_CONTEXT_SECTION_MAX_SEG_RETRANSMIT_EN_SHIFT 30 ++#define TSTORM_TCP_ST_CONTEXT_SECTION_RESERVED3 (0x1<<31) ++#define TSTORM_TCP_ST_CONTEXT_SECTION_RESERVED3_SHIFT 31 ++ u32 flags2; ++#define TSTORM_TCP_ST_CONTEXT_SECTION_RTT_VARIATION_20B (0xFFFFFF<<0) ++#define TSTORM_TCP_ST_CONTEXT_SECTION_RTT_VARIATION_20B_SHIFT 0 ++#define TSTORM_TCP_ST_CONTEXT_SECTION_DA_EN (0x1<<24) ++#define TSTORM_TCP_ST_CONTEXT_SECTION_DA_EN_SHIFT 24 ++#define TSTORM_TCP_ST_CONTEXT_SECTION_DA_COUNTER_EN (0x1<<25) ++#define TSTORM_TCP_ST_CONTEXT_SECTION_DA_COUNTER_EN_SHIFT 25 ++#define __TSTORM_TCP_ST_CONTEXT_SECTION_KA_PROBE_SENT (0x1<<26) ++#define __TSTORM_TCP_ST_CONTEXT_SECTION_KA_PROBE_SENT_SHIFT 26 ++#define __TSTORM_TCP_ST_CONTEXT_SECTION_PERSIST_PROBE_SENT (0x1<<27) ++#define __TSTORM_TCP_ST_CONTEXT_SECTION_PERSIST_PROBE_SENT_SHIFT 27 ++#define TSTORM_TCP_ST_CONTEXT_SECTION_UPDATE_L2_STATSTICS (0x1<<28) ++#define TSTORM_TCP_ST_CONTEXT_SECTION_UPDATE_L2_STATSTICS_SHIFT 28 ++#define TSTORM_TCP_ST_CONTEXT_SECTION_UPDATE_L4_STATSTICS (0x1<<29) ++#define TSTORM_TCP_ST_CONTEXT_SECTION_UPDATE_L4_STATSTICS_SHIFT 29 ++#define __TSTORM_TCP_ST_CONTEXT_SECTION_SECOND_ISLE_DROPPED (0x1<<30) ++#define __TSTORM_TCP_ST_CONTEXT_SECTION_SECOND_ISLE_DROPPED_SHIFT 30 ++#define __TSTORM_TCP_ST_CONTEXT_SECTION_DONT_SUPPORT_OOO (0x1<<31) ++#define __TSTORM_TCP_ST_CONTEXT_SECTION_DONT_SUPPORT_OOO_SHIFT 31 ++#if defined(__BIG_ENDIAN) ++ u16 reserved_slowpath; ++ u8 tcp_sm_state_3b; ++ u8 rto_exp_3b; ++#elif defined(__LITTLE_ENDIAN) ++ u8 rto_exp_3b; ++ u8 tcp_sm_state_3b; ++ u16 reserved_slowpath; ++#endif ++ u32 rcv_nxt; ++ u32 timestamp_recent; ++ u32 timestamp_recent_time; ++ u32 cwnd; ++ u32 ss_thresh; ++ u32 cwnd_accum; ++ u32 prev_seg_seq; ++ u32 expected_rel_seq; ++ u32 recover; ++#if defined(__BIG_ENDIAN) ++ u8 retransmit_count; ++ u8 ka_max_probe_count; ++ u8 persist_probe_count; ++ u8 ka_probe_count; ++#elif defined(__LITTLE_ENDIAN) ++ u8 ka_probe_count; ++ u8 persist_probe_count; ++ u8 ka_max_probe_count; ++ u8 retransmit_count; ++#endif ++#if defined(__BIG_ENDIAN) ++ u8 statistics_counter_id; ++ u8 ooo_support_mode; ++ u8 snd_wnd_scale_4b; ++ u8 dup_ack_count; ++#elif defined(__LITTLE_ENDIAN) ++ u8 dup_ack_count; ++ u8 snd_wnd_scale_4b; ++ u8 ooo_support_mode; ++ u8 statistics_counter_id; ++#endif ++ u32 retransmit_start_time; ++ u32 ka_timeout; ++ u32 ka_interval; ++ u32 isle_start_seq; ++ u32 isle_end_seq; ++#if defined(__BIG_ENDIAN) ++ u16 mss; ++ u16 recent_seg_wnd; ++#elif defined(__LITTLE_ENDIAN) ++ u16 recent_seg_wnd; ++ u16 mss; ++#endif ++ u32 reserved4; ++ u32 max_rt_time; ++#if defined(__BIG_ENDIAN) ++ u16 lsb_mac_address; ++ u16 vlan_id; ++#elif defined(__LITTLE_ENDIAN) ++ u16 vlan_id; ++ u16 lsb_mac_address; ++#endif ++ u32 msb_mac_address; ++ u32 reserved2; ++}; ++ ++/* ++ * Termination variables ++ */ ++struct iscsi_term_vars { ++ u8 BitMap; ++#define ISCSI_TERM_VARS_TCP_STATE (0xF<<0) ++#define ISCSI_TERM_VARS_TCP_STATE_SHIFT 0 ++#define ISCSI_TERM_VARS_FIN_RECEIVED_SBIT (0x1<<4) ++#define ISCSI_TERM_VARS_FIN_RECEIVED_SBIT_SHIFT 4 ++#define ISCSI_TERM_VARS_ACK_ON_FIN_RECEIVED_SBIT (0x1<<5) ++#define ISCSI_TERM_VARS_ACK_ON_FIN_RECEIVED_SBIT_SHIFT 5 ++#define ISCSI_TERM_VARS_TERM_ON_CHIP (0x1<<6) ++#define ISCSI_TERM_VARS_TERM_ON_CHIP_SHIFT 6 ++#define ISCSI_TERM_VARS_RSRV (0x1<<7) ++#define ISCSI_TERM_VARS_RSRV_SHIFT 7 ++}; ++ ++/* ++ * iSCSI context region, used only in iSCSI ++ */ ++struct tstorm_iscsi_st_context_section { ++#if defined(__BIG_ENDIAN) ++ u16 rem_tcp_data_len; ++ u16 brb_offset; ++#elif defined(__LITTLE_ENDIAN) ++ u16 brb_offset; ++ u16 rem_tcp_data_len; ++#endif ++ u32 b2nh; ++#if defined(__BIG_ENDIAN) ++ u16 rq_cons; ++ u8 flags; ++#define TSTORM_ISCSI_ST_CONTEXT_SECTION_B_HDR_DIGEST_EN (0x1<<0) ++#define TSTORM_ISCSI_ST_CONTEXT_SECTION_B_HDR_DIGEST_EN_SHIFT 0 ++#define TSTORM_ISCSI_ST_CONTEXT_SECTION_B_DATA_DIGEST_EN (0x1<<1) ++#define TSTORM_ISCSI_ST_CONTEXT_SECTION_B_DATA_DIGEST_EN_SHIFT 1 ++#define TSTORM_ISCSI_ST_CONTEXT_SECTION_B_PARTIAL_HEADER (0x1<<2) ++#define TSTORM_ISCSI_ST_CONTEXT_SECTION_B_PARTIAL_HEADER_SHIFT 2 ++#define TSTORM_ISCSI_ST_CONTEXT_SECTION_B_FULL_FEATURE (0x1<<3) ++#define TSTORM_ISCSI_ST_CONTEXT_SECTION_B_FULL_FEATURE_SHIFT 3 ++#define TSTORM_ISCSI_ST_CONTEXT_SECTION_B_DROP_ALL_PDUS (0x1<<4) ++#define TSTORM_ISCSI_ST_CONTEXT_SECTION_B_DROP_ALL_PDUS_SHIFT 4 ++#define TSTORM_ISCSI_ST_CONTEXT_SECTION_FLAGS_RSRV (0x7<<5) ++#define TSTORM_ISCSI_ST_CONTEXT_SECTION_FLAGS_RSRV_SHIFT 5 ++ u8 hdr_bytes_2_fetch; ++#elif defined(__LITTLE_ENDIAN) ++ u8 hdr_bytes_2_fetch; ++ u8 flags; ++#define TSTORM_ISCSI_ST_CONTEXT_SECTION_B_HDR_DIGEST_EN (0x1<<0) ++#define TSTORM_ISCSI_ST_CONTEXT_SECTION_B_HDR_DIGEST_EN_SHIFT 0 ++#define TSTORM_ISCSI_ST_CONTEXT_SECTION_B_DATA_DIGEST_EN (0x1<<1) ++#define TSTORM_ISCSI_ST_CONTEXT_SECTION_B_DATA_DIGEST_EN_SHIFT 1 ++#define TSTORM_ISCSI_ST_CONTEXT_SECTION_B_PARTIAL_HEADER (0x1<<2) ++#define TSTORM_ISCSI_ST_CONTEXT_SECTION_B_PARTIAL_HEADER_SHIFT 2 ++#define TSTORM_ISCSI_ST_CONTEXT_SECTION_B_FULL_FEATURE (0x1<<3) ++#define TSTORM_ISCSI_ST_CONTEXT_SECTION_B_FULL_FEATURE_SHIFT 3 ++#define TSTORM_ISCSI_ST_CONTEXT_SECTION_B_DROP_ALL_PDUS (0x1<<4) ++#define TSTORM_ISCSI_ST_CONTEXT_SECTION_B_DROP_ALL_PDUS_SHIFT 4 ++#define TSTORM_ISCSI_ST_CONTEXT_SECTION_FLAGS_RSRV (0x7<<5) ++#define TSTORM_ISCSI_ST_CONTEXT_SECTION_FLAGS_RSRV_SHIFT 5 ++ u16 rq_cons; ++#endif ++ struct regpair rq_db_phy_addr; ++#if defined(__BIG_ENDIAN) ++ struct iscsi_term_vars term_vars; ++ u8 scratchpad_idx; ++ u16 iscsi_conn_id; ++#elif defined(__LITTLE_ENDIAN) ++ u16 iscsi_conn_id; ++ u8 scratchpad_idx; ++ struct iscsi_term_vars term_vars; ++#endif ++ u32 reserved2; ++}; ++ ++/* ++ * The iSCSI non-aggregative context of Tstorm ++ */ ++struct tstorm_iscsi_st_context { ++ struct tstorm_tcp_st_context_section tcp; ++ struct tstorm_iscsi_st_context_section iscsi; ++}; ++ ++/* ++ * The tcp aggregative context section of Xstorm ++ */ ++struct xstorm_tcp_tcp_ag_context_section { ++#if defined(__BIG_ENDIAN) ++ u8 __tcp_agg_vars1; ++ u8 __da_cnt; ++ u16 mss; ++#elif defined(__LITTLE_ENDIAN) ++ u16 mss; ++ u8 __da_cnt; ++ u8 __tcp_agg_vars1; ++#endif ++ u32 snd_nxt; ++ u32 tx_wnd; ++ u32 snd_una; ++ u32 local_adv_wnd; ++#if defined(__BIG_ENDIAN) ++ u8 __agg_val8_th; ++ u8 __agg_val8; ++ u16 tcp_agg_vars2; ++#define XSTORM_TCP_TCP_AG_CONTEXT_SECTION_TX_FIN_FLAG (0x1<<0) ++#define XSTORM_TCP_TCP_AG_CONTEXT_SECTION_TX_FIN_FLAG_SHIFT 0 ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_TX_UNBLOCKED (0x1<<1) ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_TX_UNBLOCKED_SHIFT 1 ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_DA_TIMER_ACTIVE (0x1<<2) ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_DA_TIMER_ACTIVE_SHIFT 2 ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX3_FLAG (0x1<<3) ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX3_FLAG_SHIFT 3 ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX4_FLAG (0x1<<4) ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX4_FLAG_SHIFT 4 ++#define XSTORM_TCP_TCP_AG_CONTEXT_SECTION_DA_ENABLE (0x1<<5) ++#define XSTORM_TCP_TCP_AG_CONTEXT_SECTION_DA_ENABLE_SHIFT 5 ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_ACK_TO_FE_UPDATED_EN (0x1<<6) ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_ACK_TO_FE_UPDATED_EN_SHIFT 6 ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX3_CF_EN (0x1<<7) ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX3_CF_EN_SHIFT 7 ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_TX_FIN_FLAG_EN (0x1<<8) ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_TX_FIN_FLAG_EN_SHIFT 8 ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX1_FLAG (0x1<<9) ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX1_FLAG_SHIFT 9 ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_SET_RTO_CF (0x3<<10) ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_SET_RTO_CF_SHIFT 10 ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_TS_TO_ECHO_UPDATED_CF (0x3<<12) ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_TS_TO_ECHO_UPDATED_CF_SHIFT 12 ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX8_CF (0x3<<14) ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX8_CF_SHIFT 14 ++#elif defined(__LITTLE_ENDIAN) ++ u16 tcp_agg_vars2; ++#define XSTORM_TCP_TCP_AG_CONTEXT_SECTION_TX_FIN_FLAG (0x1<<0) ++#define XSTORM_TCP_TCP_AG_CONTEXT_SECTION_TX_FIN_FLAG_SHIFT 0 ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_TX_UNBLOCKED (0x1<<1) ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_TX_UNBLOCKED_SHIFT 1 ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_DA_TIMER_ACTIVE (0x1<<2) ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_DA_TIMER_ACTIVE_SHIFT 2 ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX3_FLAG (0x1<<3) ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX3_FLAG_SHIFT 3 ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX4_FLAG (0x1<<4) ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX4_FLAG_SHIFT 4 ++#define XSTORM_TCP_TCP_AG_CONTEXT_SECTION_DA_ENABLE (0x1<<5) ++#define XSTORM_TCP_TCP_AG_CONTEXT_SECTION_DA_ENABLE_SHIFT 5 ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_ACK_TO_FE_UPDATED_EN (0x1<<6) ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_ACK_TO_FE_UPDATED_EN_SHIFT 6 ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX3_CF_EN (0x1<<7) ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX3_CF_EN_SHIFT 7 ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_TX_FIN_FLAG_EN (0x1<<8) ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_TX_FIN_FLAG_EN_SHIFT 8 ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX1_FLAG (0x1<<9) ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX1_FLAG_SHIFT 9 ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_SET_RTO_CF (0x3<<10) ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_SET_RTO_CF_SHIFT 10 ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_TS_TO_ECHO_UPDATED_CF (0x3<<12) ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_TS_TO_ECHO_UPDATED_CF_SHIFT 12 ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX8_CF (0x3<<14) ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX8_CF_SHIFT 14 ++ u8 __agg_val8; ++ u8 __agg_val8_th; ++#endif ++ u32 ack_to_far_end; ++ u32 rto_timer; ++ u32 ka_timer; ++ u32 ts_to_echo; ++#if defined(__BIG_ENDIAN) ++ u16 __agg_val7_th; ++ u16 __agg_val7; ++#elif defined(__LITTLE_ENDIAN) ++ u16 __agg_val7; ++ u16 __agg_val7_th; ++#endif ++#if defined(__BIG_ENDIAN) ++ u8 __tcp_agg_vars5; ++ u8 __tcp_agg_vars4; ++ u8 __tcp_agg_vars3; ++ u8 __force_pure_ack_cnt; ++#elif defined(__LITTLE_ENDIAN) ++ u8 __force_pure_ack_cnt; ++ u8 __tcp_agg_vars3; ++ u8 __tcp_agg_vars4; ++ u8 __tcp_agg_vars5; ++#endif ++ u32 tcp_agg_vars6; ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_TS_TO_ECHO_CF_EN (0x1<<0) ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_TS_TO_ECHO_CF_EN_SHIFT 0 ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX8_CF_EN (0x1<<1) ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX8_CF_EN_SHIFT 1 ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX9_CF_EN (0x1<<2) ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX9_CF_EN_SHIFT 2 ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX10_CF_EN (0x1<<3) ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX10_CF_EN_SHIFT 3 ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX6_FLAG (0x1<<4) ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX6_FLAG_SHIFT 4 ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX7_FLAG (0x1<<5) ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX7_FLAG_SHIFT 5 ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX5_CF (0x3<<6) ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX5_CF_SHIFT 6 ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX9_CF (0x3<<8) ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX9_CF_SHIFT 8 ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX10_CF (0x3<<10) ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX10_CF_SHIFT 10 ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX11_CF (0x3<<12) ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX11_CF_SHIFT 12 ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX12_CF (0x3<<14) ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX12_CF_SHIFT 14 ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX13_CF (0x3<<16) ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX13_CF_SHIFT 16 ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX14_CF (0x3<<18) ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX14_CF_SHIFT 18 ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX15_CF (0x3<<20) ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX15_CF_SHIFT 20 ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX16_CF (0x3<<22) ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX16_CF_SHIFT 22 ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX17_CF (0x3<<24) ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX17_CF_SHIFT 24 ++#define XSTORM_TCP_TCP_AG_CONTEXT_SECTION_ECE_FLAG (0x1<<26) ++#define XSTORM_TCP_TCP_AG_CONTEXT_SECTION_ECE_FLAG_SHIFT 26 ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_RESERVED71 (0x1<<27) ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_RESERVED71_SHIFT 27 ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_FORCE_PURE_ACK_CNT_DIRTY (0x1<<28) ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_FORCE_PURE_ACK_CNT_DIRTY_SHIFT 28 ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_TCP_AUTO_STOP_FLAG (0x1<<29) ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_TCP_AUTO_STOP_FLAG_SHIFT 29 ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_DO_TS_UPDATE_FLAG (0x1<<30) ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_DO_TS_UPDATE_FLAG_SHIFT 30 ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_CANCEL_RETRANSMIT_FLAG (0x1<<31) ++#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_CANCEL_RETRANSMIT_FLAG_SHIFT 31 ++#if defined(__BIG_ENDIAN) ++ u16 __agg_misc6; ++ u16 __tcp_agg_vars7; ++#elif defined(__LITTLE_ENDIAN) ++ u16 __tcp_agg_vars7; ++ u16 __agg_misc6; ++#endif ++ u32 __agg_val10; ++ u32 __agg_val10_th; ++#if defined(__BIG_ENDIAN) ++ u16 __reserved3; ++ u8 __reserved2; ++ u8 __da_only_cnt; ++#elif defined(__LITTLE_ENDIAN) ++ u8 __da_only_cnt; ++ u8 __reserved2; ++ u16 __reserved3; ++#endif ++}; ++ ++/* ++ * The iscsi aggregative context of Xstorm ++ */ ++struct xstorm_iscsi_ag_context { ++#if defined(__BIG_ENDIAN) ++ u16 agg_val1; ++ u8 agg_vars1; ++#define __XSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM0 (0x1<<0) ++#define __XSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM0_SHIFT 0 ++#define XSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM1 (0x1<<1) ++#define XSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM1_SHIFT 1 ++#define XSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM2 (0x1<<2) ++#define XSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM2_SHIFT 2 ++#define XSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM3 (0x1<<3) ++#define XSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM3_SHIFT 3 ++#define __XSTORM_ISCSI_AG_CONTEXT_MORE_TO_SEND_EN (0x1<<4) ++#define __XSTORM_ISCSI_AG_CONTEXT_MORE_TO_SEND_EN_SHIFT 4 ++#define XSTORM_ISCSI_AG_CONTEXT_NAGLE_EN (0x1<<5) ++#define XSTORM_ISCSI_AG_CONTEXT_NAGLE_EN_SHIFT 5 ++#define __XSTORM_ISCSI_AG_CONTEXT_DQ_SPARE_FLAG (0x1<<6) ++#define __XSTORM_ISCSI_AG_CONTEXT_DQ_SPARE_FLAG_SHIFT 6 ++#define __XSTORM_ISCSI_AG_CONTEXT_UNA_GT_NXT_EN (0x1<<7) ++#define __XSTORM_ISCSI_AG_CONTEXT_UNA_GT_NXT_EN_SHIFT 7 ++ u8 state; ++#elif defined(__LITTLE_ENDIAN) ++ u8 state; ++ u8 agg_vars1; ++#define __XSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM0 (0x1<<0) ++#define __XSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM0_SHIFT 0 ++#define XSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM1 (0x1<<1) ++#define XSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM1_SHIFT 1 ++#define XSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM2 (0x1<<2) ++#define XSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM2_SHIFT 2 ++#define XSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM3 (0x1<<3) ++#define XSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM3_SHIFT 3 ++#define __XSTORM_ISCSI_AG_CONTEXT_MORE_TO_SEND_EN (0x1<<4) ++#define __XSTORM_ISCSI_AG_CONTEXT_MORE_TO_SEND_EN_SHIFT 4 ++#define XSTORM_ISCSI_AG_CONTEXT_NAGLE_EN (0x1<<5) ++#define XSTORM_ISCSI_AG_CONTEXT_NAGLE_EN_SHIFT 5 ++#define __XSTORM_ISCSI_AG_CONTEXT_DQ_SPARE_FLAG (0x1<<6) ++#define __XSTORM_ISCSI_AG_CONTEXT_DQ_SPARE_FLAG_SHIFT 6 ++#define __XSTORM_ISCSI_AG_CONTEXT_UNA_GT_NXT_EN (0x1<<7) ++#define __XSTORM_ISCSI_AG_CONTEXT_UNA_GT_NXT_EN_SHIFT 7 ++ u16 agg_val1; ++#endif ++#if defined(__BIG_ENDIAN) ++ u8 cdu_reserved; ++ u8 agg_vars4; ++#define XSTORM_ISCSI_AG_CONTEXT_R2TQ_PROD_CF (0x3<<0) ++#define XSTORM_ISCSI_AG_CONTEXT_R2TQ_PROD_CF_SHIFT 0 ++#define __XSTORM_ISCSI_AG_CONTEXT_AUX21_CF (0x3<<2) ++#define __XSTORM_ISCSI_AG_CONTEXT_AUX21_CF_SHIFT 2 ++#define __XSTORM_ISCSI_AG_CONTEXT_AUX18_CF_EN (0x1<<4) ++#define __XSTORM_ISCSI_AG_CONTEXT_AUX18_CF_EN_SHIFT 4 ++#define __XSTORM_ISCSI_AG_CONTEXT_AUX19_CF_EN (0x1<<5) ++#define __XSTORM_ISCSI_AG_CONTEXT_AUX19_CF_EN_SHIFT 5 ++#define __XSTORM_ISCSI_AG_CONTEXT_R2TQ_PROD_CF_EN (0x1<<6) ++#define __XSTORM_ISCSI_AG_CONTEXT_R2TQ_PROD_CF_EN_SHIFT 6 ++#define __XSTORM_ISCSI_AG_CONTEXT_AUX21_CF_EN (0x1<<7) ++#define __XSTORM_ISCSI_AG_CONTEXT_AUX21_CF_EN_SHIFT 7 ++ u8 agg_vars3; ++#define XSTORM_ISCSI_AG_CONTEXT_PHYSICAL_QUEUE_NUM2 (0x3F<<0) ++#define XSTORM_ISCSI_AG_CONTEXT_PHYSICAL_QUEUE_NUM2_SHIFT 0 ++#define __XSTORM_ISCSI_AG_CONTEXT_AUX19_CF (0x3<<6) ++#define __XSTORM_ISCSI_AG_CONTEXT_AUX19_CF_SHIFT 6 ++ u8 agg_vars2; ++#define __XSTORM_ISCSI_AG_CONTEXT_DQ_CF (0x3<<0) ++#define __XSTORM_ISCSI_AG_CONTEXT_DQ_CF_SHIFT 0 ++#define __XSTORM_ISCSI_AG_CONTEXT_DQ_SPARE_FLAG_EN (0x1<<2) ++#define __XSTORM_ISCSI_AG_CONTEXT_DQ_SPARE_FLAG_EN_SHIFT 2 ++#define __XSTORM_ISCSI_AG_CONTEXT_AUX8_FLAG (0x1<<3) ++#define __XSTORM_ISCSI_AG_CONTEXT_AUX8_FLAG_SHIFT 3 ++#define __XSTORM_ISCSI_AG_CONTEXT_AUX9_FLAG (0x1<<4) ++#define __XSTORM_ISCSI_AG_CONTEXT_AUX9_FLAG_SHIFT 4 ++#define XSTORM_ISCSI_AG_CONTEXT_DECISION_RULE1 (0x3<<5) ++#define XSTORM_ISCSI_AG_CONTEXT_DECISION_RULE1_SHIFT 5 ++#define __XSTORM_ISCSI_AG_CONTEXT_DQ_CF_EN (0x1<<7) ++#define __XSTORM_ISCSI_AG_CONTEXT_DQ_CF_EN_SHIFT 7 ++#elif defined(__LITTLE_ENDIAN) ++ u8 agg_vars2; ++#define __XSTORM_ISCSI_AG_CONTEXT_DQ_CF (0x3<<0) ++#define __XSTORM_ISCSI_AG_CONTEXT_DQ_CF_SHIFT 0 ++#define __XSTORM_ISCSI_AG_CONTEXT_DQ_SPARE_FLAG_EN (0x1<<2) ++#define __XSTORM_ISCSI_AG_CONTEXT_DQ_SPARE_FLAG_EN_SHIFT 2 ++#define __XSTORM_ISCSI_AG_CONTEXT_AUX8_FLAG (0x1<<3) ++#define __XSTORM_ISCSI_AG_CONTEXT_AUX8_FLAG_SHIFT 3 ++#define __XSTORM_ISCSI_AG_CONTEXT_AUX9_FLAG (0x1<<4) ++#define __XSTORM_ISCSI_AG_CONTEXT_AUX9_FLAG_SHIFT 4 ++#define XSTORM_ISCSI_AG_CONTEXT_DECISION_RULE1 (0x3<<5) ++#define XSTORM_ISCSI_AG_CONTEXT_DECISION_RULE1_SHIFT 5 ++#define __XSTORM_ISCSI_AG_CONTEXT_DQ_CF_EN (0x1<<7) ++#define __XSTORM_ISCSI_AG_CONTEXT_DQ_CF_EN_SHIFT 7 ++ u8 agg_vars3; ++#define XSTORM_ISCSI_AG_CONTEXT_PHYSICAL_QUEUE_NUM2 (0x3F<<0) ++#define XSTORM_ISCSI_AG_CONTEXT_PHYSICAL_QUEUE_NUM2_SHIFT 0 ++#define __XSTORM_ISCSI_AG_CONTEXT_AUX19_CF (0x3<<6) ++#define __XSTORM_ISCSI_AG_CONTEXT_AUX19_CF_SHIFT 6 ++ u8 agg_vars4; ++#define XSTORM_ISCSI_AG_CONTEXT_R2TQ_PROD_CF (0x3<<0) ++#define XSTORM_ISCSI_AG_CONTEXT_R2TQ_PROD_CF_SHIFT 0 ++#define __XSTORM_ISCSI_AG_CONTEXT_AUX21_CF (0x3<<2) ++#define __XSTORM_ISCSI_AG_CONTEXT_AUX21_CF_SHIFT 2 ++#define __XSTORM_ISCSI_AG_CONTEXT_AUX18_CF_EN (0x1<<4) ++#define __XSTORM_ISCSI_AG_CONTEXT_AUX18_CF_EN_SHIFT 4 ++#define __XSTORM_ISCSI_AG_CONTEXT_AUX19_CF_EN (0x1<<5) ++#define __XSTORM_ISCSI_AG_CONTEXT_AUX19_CF_EN_SHIFT 5 ++#define __XSTORM_ISCSI_AG_CONTEXT_R2TQ_PROD_CF_EN (0x1<<6) ++#define __XSTORM_ISCSI_AG_CONTEXT_R2TQ_PROD_CF_EN_SHIFT 6 ++#define __XSTORM_ISCSI_AG_CONTEXT_AUX21_CF_EN (0x1<<7) ++#define __XSTORM_ISCSI_AG_CONTEXT_AUX21_CF_EN_SHIFT 7 ++ u8 cdu_reserved; ++#endif ++ u32 more_to_send; ++#if defined(__BIG_ENDIAN) ++ u16 agg_vars5; ++#define XSTORM_ISCSI_AG_CONTEXT_DECISION_RULE5 (0x3<<0) ++#define XSTORM_ISCSI_AG_CONTEXT_DECISION_RULE5_SHIFT 0 ++#define XSTORM_ISCSI_AG_CONTEXT_PHYSICAL_QUEUE_NUM0 (0x3F<<2) ++#define XSTORM_ISCSI_AG_CONTEXT_PHYSICAL_QUEUE_NUM0_SHIFT 2 ++#define XSTORM_ISCSI_AG_CONTEXT_PHYSICAL_QUEUE_NUM1 (0x3F<<8) ++#define XSTORM_ISCSI_AG_CONTEXT_PHYSICAL_QUEUE_NUM1_SHIFT 8 ++#define XSTORM_ISCSI_AG_CONTEXT_DECISION_RULE2 (0x3<<14) ++#define XSTORM_ISCSI_AG_CONTEXT_DECISION_RULE2_SHIFT 14 ++ u16 sq_cons; ++#elif defined(__LITTLE_ENDIAN) ++ u16 sq_cons; ++ u16 agg_vars5; ++#define XSTORM_ISCSI_AG_CONTEXT_DECISION_RULE5 (0x3<<0) ++#define XSTORM_ISCSI_AG_CONTEXT_DECISION_RULE5_SHIFT 0 ++#define XSTORM_ISCSI_AG_CONTEXT_PHYSICAL_QUEUE_NUM0 (0x3F<<2) ++#define XSTORM_ISCSI_AG_CONTEXT_PHYSICAL_QUEUE_NUM0_SHIFT 2 ++#define XSTORM_ISCSI_AG_CONTEXT_PHYSICAL_QUEUE_NUM1 (0x3F<<8) ++#define XSTORM_ISCSI_AG_CONTEXT_PHYSICAL_QUEUE_NUM1_SHIFT 8 ++#define XSTORM_ISCSI_AG_CONTEXT_DECISION_RULE2 (0x3<<14) ++#define XSTORM_ISCSI_AG_CONTEXT_DECISION_RULE2_SHIFT 14 ++#endif ++ struct xstorm_tcp_tcp_ag_context_section tcp; ++#if defined(__BIG_ENDIAN) ++ u16 agg_vars7; ++#define __XSTORM_ISCSI_AG_CONTEXT_AGG_VAL11_DECISION_RULE (0x7<<0) ++#define __XSTORM_ISCSI_AG_CONTEXT_AGG_VAL11_DECISION_RULE_SHIFT 0 ++#define __XSTORM_ISCSI_AG_CONTEXT_AUX13_FLAG (0x1<<3) ++#define __XSTORM_ISCSI_AG_CONTEXT_AUX13_FLAG_SHIFT 3 ++#define XSTORM_ISCSI_AG_CONTEXT_AUX18_CF (0x3<<4) ++#define XSTORM_ISCSI_AG_CONTEXT_AUX18_CF_SHIFT 4 ++#define XSTORM_ISCSI_AG_CONTEXT_DECISION_RULE3 (0x3<<6) ++#define XSTORM_ISCSI_AG_CONTEXT_DECISION_RULE3_SHIFT 6 ++#define XSTORM_ISCSI_AG_CONTEXT_AUX1_CF (0x3<<8) ++#define XSTORM_ISCSI_AG_CONTEXT_AUX1_CF_SHIFT 8 ++#define __XSTORM_ISCSI_AG_CONTEXT_COMPLETION_SEQ_DECISION_MASK (0x1<<10) ++#define __XSTORM_ISCSI_AG_CONTEXT_COMPLETION_SEQ_DECISION_MASK_SHIFT 10 ++#define __XSTORM_ISCSI_AG_CONTEXT_AUX1_CF_EN (0x1<<11) ++#define __XSTORM_ISCSI_AG_CONTEXT_AUX1_CF_EN_SHIFT 11 ++#define __XSTORM_ISCSI_AG_CONTEXT_AUX10_FLAG (0x1<<12) ++#define __XSTORM_ISCSI_AG_CONTEXT_AUX10_FLAG_SHIFT 12 ++#define __XSTORM_ISCSI_AG_CONTEXT_AUX11_FLAG (0x1<<13) ++#define __XSTORM_ISCSI_AG_CONTEXT_AUX11_FLAG_SHIFT 13 ++#define __XSTORM_ISCSI_AG_CONTEXT_AUX12_FLAG (0x1<<14) ++#define __XSTORM_ISCSI_AG_CONTEXT_AUX12_FLAG_SHIFT 14 ++#define __XSTORM_ISCSI_AG_CONTEXT_AUX2_FLAG (0x1<<15) ++#define __XSTORM_ISCSI_AG_CONTEXT_AUX2_FLAG_SHIFT 15 ++ u8 agg_val3_th; ++ u8 agg_vars6; ++#define XSTORM_ISCSI_AG_CONTEXT_DECISION_RULE6 (0x7<<0) ++#define XSTORM_ISCSI_AG_CONTEXT_DECISION_RULE6_SHIFT 0 ++#define XSTORM_ISCSI_AG_CONTEXT_DECISION_RULE7 (0x7<<3) ++#define XSTORM_ISCSI_AG_CONTEXT_DECISION_RULE7_SHIFT 3 ++#define XSTORM_ISCSI_AG_CONTEXT_DECISION_RULE4 (0x3<<6) ++#define XSTORM_ISCSI_AG_CONTEXT_DECISION_RULE4_SHIFT 6 ++#elif defined(__LITTLE_ENDIAN) ++ u8 agg_vars6; ++#define XSTORM_ISCSI_AG_CONTEXT_DECISION_RULE6 (0x7<<0) ++#define XSTORM_ISCSI_AG_CONTEXT_DECISION_RULE6_SHIFT 0 ++#define XSTORM_ISCSI_AG_CONTEXT_DECISION_RULE7 (0x7<<3) ++#define XSTORM_ISCSI_AG_CONTEXT_DECISION_RULE7_SHIFT 3 ++#define XSTORM_ISCSI_AG_CONTEXT_DECISION_RULE4 (0x3<<6) ++#define XSTORM_ISCSI_AG_CONTEXT_DECISION_RULE4_SHIFT 6 ++ u8 agg_val3_th; ++ u16 agg_vars7; ++#define __XSTORM_ISCSI_AG_CONTEXT_AGG_VAL11_DECISION_RULE (0x7<<0) ++#define __XSTORM_ISCSI_AG_CONTEXT_AGG_VAL11_DECISION_RULE_SHIFT 0 ++#define __XSTORM_ISCSI_AG_CONTEXT_AUX13_FLAG (0x1<<3) ++#define __XSTORM_ISCSI_AG_CONTEXT_AUX13_FLAG_SHIFT 3 ++#define XSTORM_ISCSI_AG_CONTEXT_AUX18_CF (0x3<<4) ++#define XSTORM_ISCSI_AG_CONTEXT_AUX18_CF_SHIFT 4 ++#define XSTORM_ISCSI_AG_CONTEXT_DECISION_RULE3 (0x3<<6) ++#define XSTORM_ISCSI_AG_CONTEXT_DECISION_RULE3_SHIFT 6 ++#define XSTORM_ISCSI_AG_CONTEXT_AUX1_CF (0x3<<8) ++#define XSTORM_ISCSI_AG_CONTEXT_AUX1_CF_SHIFT 8 ++#define __XSTORM_ISCSI_AG_CONTEXT_COMPLETION_SEQ_DECISION_MASK (0x1<<10) ++#define __XSTORM_ISCSI_AG_CONTEXT_COMPLETION_SEQ_DECISION_MASK_SHIFT 10 ++#define __XSTORM_ISCSI_AG_CONTEXT_AUX1_CF_EN (0x1<<11) ++#define __XSTORM_ISCSI_AG_CONTEXT_AUX1_CF_EN_SHIFT 11 ++#define __XSTORM_ISCSI_AG_CONTEXT_AUX10_FLAG (0x1<<12) ++#define __XSTORM_ISCSI_AG_CONTEXT_AUX10_FLAG_SHIFT 12 ++#define __XSTORM_ISCSI_AG_CONTEXT_AUX11_FLAG (0x1<<13) ++#define __XSTORM_ISCSI_AG_CONTEXT_AUX11_FLAG_SHIFT 13 ++#define __XSTORM_ISCSI_AG_CONTEXT_AUX12_FLAG (0x1<<14) ++#define __XSTORM_ISCSI_AG_CONTEXT_AUX12_FLAG_SHIFT 14 ++#define __XSTORM_ISCSI_AG_CONTEXT_AUX2_FLAG (0x1<<15) ++#define __XSTORM_ISCSI_AG_CONTEXT_AUX2_FLAG_SHIFT 15 ++#endif ++#if defined(__BIG_ENDIAN) ++ u16 __agg_val11_th; ++ u16 __agg_val11; ++#elif defined(__LITTLE_ENDIAN) ++ u16 __agg_val11; ++ u16 __agg_val11_th; ++#endif ++#if defined(__BIG_ENDIAN) ++ u8 __reserved1; ++ u8 __agg_val6_th; ++ u16 __agg_val9; ++#elif defined(__LITTLE_ENDIAN) ++ u16 __agg_val9; ++ u8 __agg_val6_th; ++ u8 __reserved1; ++#endif ++#if defined(__BIG_ENDIAN) ++ u16 hq_prod; ++ u16 hq_cons; ++#elif defined(__LITTLE_ENDIAN) ++ u16 hq_cons; ++ u16 hq_prod; ++#endif ++ u32 agg_vars8; ++#define XSTORM_ISCSI_AG_CONTEXT_AGG_MISC2 (0xFFFFFF<<0) ++#define XSTORM_ISCSI_AG_CONTEXT_AGG_MISC2_SHIFT 0 ++#define XSTORM_ISCSI_AG_CONTEXT_AGG_MISC3 (0xFF<<24) ++#define XSTORM_ISCSI_AG_CONTEXT_AGG_MISC3_SHIFT 24 ++#if defined(__BIG_ENDIAN) ++ u16 r2tq_prod; ++ u16 sq_prod; ++#elif defined(__LITTLE_ENDIAN) ++ u16 sq_prod; ++ u16 r2tq_prod; ++#endif ++#if defined(__BIG_ENDIAN) ++ u8 agg_val3; ++ u8 agg_val6; ++ u8 agg_val5_th; ++ u8 agg_val5; ++#elif defined(__LITTLE_ENDIAN) ++ u8 agg_val5; ++ u8 agg_val5_th; ++ u8 agg_val6; ++ u8 agg_val3; ++#endif ++#if defined(__BIG_ENDIAN) ++ u16 __agg_misc1; ++ u16 agg_limit1; ++#elif defined(__LITTLE_ENDIAN) ++ u16 agg_limit1; ++ u16 __agg_misc1; ++#endif ++ u32 hq_cons_tcp_seq; ++ u32 exp_stat_sn; ++ u32 agg_misc5; ++}; ++ ++/* ++ * The tcp aggregative context section of Tstorm ++ */ ++struct tstorm_tcp_tcp_ag_context_section { ++ u32 __agg_val1; ++#if defined(__BIG_ENDIAN) ++ u8 __tcp_agg_vars2; ++ u8 __agg_val3; ++ u16 __agg_val2; ++#elif defined(__LITTLE_ENDIAN) ++ u16 __agg_val2; ++ u8 __agg_val3; ++ u8 __tcp_agg_vars2; ++#endif ++#if defined(__BIG_ENDIAN) ++ u16 __agg_val5; ++ u8 __agg_val6; ++ u8 __tcp_agg_vars3; ++#elif defined(__LITTLE_ENDIAN) ++ u8 __tcp_agg_vars3; ++ u8 __agg_val6; ++ u16 __agg_val5; ++#endif ++ u32 snd_nxt; ++ u32 rtt_seq; ++ u32 rtt_time; ++ u32 __reserved66; ++ u32 wnd_right_edge; ++ u32 tcp_agg_vars1; ++#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_FIN_SENT_FLAG (0x1<<0) ++#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_FIN_SENT_FLAG_SHIFT 0 ++#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_LAST_PACKET_FIN_FLAG (0x1<<1) ++#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_LAST_PACKET_FIN_FLAG_SHIFT 1 ++#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_WND_UPD_CF (0x3<<2) ++#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_WND_UPD_CF_SHIFT 2 ++#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_TIMEOUT_CF (0x3<<4) ++#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_TIMEOUT_CF_SHIFT 4 ++#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_WND_UPD_CF_EN (0x1<<6) ++#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_WND_UPD_CF_EN_SHIFT 6 ++#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_TIMEOUT_CF_EN (0x1<<7) ++#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_TIMEOUT_CF_EN_SHIFT 7 ++#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_RETRANSMIT_SEQ_EN (0x1<<8) ++#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_RETRANSMIT_SEQ_EN_SHIFT 8 ++#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_SND_NXT_EN (0x1<<9) ++#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_SND_NXT_EN_SHIFT 9 ++#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX1_FLAG (0x1<<10) ++#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX1_FLAG_SHIFT 10 ++#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX2_FLAG (0x1<<11) ++#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX2_FLAG_SHIFT 11 ++#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX1_CF_EN (0x1<<12) ++#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX1_CF_EN_SHIFT 12 ++#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX2_CF_EN (0x1<<13) ++#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX2_CF_EN_SHIFT 13 ++#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX1_CF (0x3<<14) ++#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX1_CF_SHIFT 14 ++#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX2_CF (0x3<<16) ++#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX2_CF_SHIFT 16 ++#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_TX_BLOCKED (0x1<<18) ++#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_TX_BLOCKED_SHIFT 18 ++#define __TSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX10_CF_EN (0x1<<19) ++#define __TSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX10_CF_EN_SHIFT 19 ++#define __TSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX11_CF_EN (0x1<<20) ++#define __TSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX11_CF_EN_SHIFT 20 ++#define __TSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX12_CF_EN (0x1<<21) ++#define __TSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX12_CF_EN_SHIFT 21 ++#define __TSTORM_TCP_TCP_AG_CONTEXT_SECTION_RESERVED1 (0x3<<22) ++#define __TSTORM_TCP_TCP_AG_CONTEXT_SECTION_RESERVED1_SHIFT 22 ++#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_RETRANSMIT_PEND_SEQ (0xF<<24) ++#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_RETRANSMIT_PEND_SEQ_SHIFT 24 ++#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_RETRANSMIT_DONE_SEQ (0xF<<28) ++#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_RETRANSMIT_DONE_SEQ_SHIFT 28 ++ u32 snd_max; ++ u32 snd_una; ++ u32 __reserved2; ++}; ++ ++/* ++ * The iscsi aggregative context of Tstorm ++ */ ++struct tstorm_iscsi_ag_context { ++#if defined(__BIG_ENDIAN) ++ u16 ulp_credit; ++ u8 agg_vars1; ++#define TSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM0 (0x1<<0) ++#define TSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM0_SHIFT 0 ++#define TSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM1 (0x1<<1) ++#define TSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM1_SHIFT 1 ++#define TSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM2 (0x1<<2) ++#define TSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM2_SHIFT 2 ++#define TSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM3 (0x1<<3) ++#define TSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM3_SHIFT 3 ++#define __TSTORM_ISCSI_AG_CONTEXT_AUX3_CF (0x3<<4) ++#define __TSTORM_ISCSI_AG_CONTEXT_AUX3_CF_SHIFT 4 ++#define __TSTORM_ISCSI_AG_CONTEXT_AUX3_FLAG (0x1<<6) ++#define __TSTORM_ISCSI_AG_CONTEXT_AUX3_FLAG_SHIFT 6 ++#define __TSTORM_ISCSI_AG_CONTEXT_AUX4_FLAG (0x1<<7) ++#define __TSTORM_ISCSI_AG_CONTEXT_AUX4_FLAG_SHIFT 7 ++ u8 state; ++#elif defined(__LITTLE_ENDIAN) ++ u8 state; ++ u8 agg_vars1; ++#define TSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM0 (0x1<<0) ++#define TSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM0_SHIFT 0 ++#define TSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM1 (0x1<<1) ++#define TSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM1_SHIFT 1 ++#define TSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM2 (0x1<<2) ++#define TSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM2_SHIFT 2 ++#define TSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM3 (0x1<<3) ++#define TSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM3_SHIFT 3 ++#define __TSTORM_ISCSI_AG_CONTEXT_AUX3_CF (0x3<<4) ++#define __TSTORM_ISCSI_AG_CONTEXT_AUX3_CF_SHIFT 4 ++#define __TSTORM_ISCSI_AG_CONTEXT_AUX3_FLAG (0x1<<6) ++#define __TSTORM_ISCSI_AG_CONTEXT_AUX3_FLAG_SHIFT 6 ++#define __TSTORM_ISCSI_AG_CONTEXT_AUX4_FLAG (0x1<<7) ++#define __TSTORM_ISCSI_AG_CONTEXT_AUX4_FLAG_SHIFT 7 ++ u16 ulp_credit; ++#endif ++#if defined(__BIG_ENDIAN) ++ u16 __agg_val4; ++ u16 agg_vars2; ++#define __TSTORM_ISCSI_AG_CONTEXT_AUX5_FLAG (0x1<<0) ++#define __TSTORM_ISCSI_AG_CONTEXT_AUX5_FLAG_SHIFT 0 ++#define __TSTORM_ISCSI_AG_CONTEXT_AUX6_FLAG (0x1<<1) ++#define __TSTORM_ISCSI_AG_CONTEXT_AUX6_FLAG_SHIFT 1 ++#define __TSTORM_ISCSI_AG_CONTEXT_AUX4_CF (0x3<<2) ++#define __TSTORM_ISCSI_AG_CONTEXT_AUX4_CF_SHIFT 2 ++#define __TSTORM_ISCSI_AG_CONTEXT_AUX5_CF (0x3<<4) ++#define __TSTORM_ISCSI_AG_CONTEXT_AUX5_CF_SHIFT 4 ++#define __TSTORM_ISCSI_AG_CONTEXT_AUX6_CF (0x3<<6) ++#define __TSTORM_ISCSI_AG_CONTEXT_AUX6_CF_SHIFT 6 ++#define __TSTORM_ISCSI_AG_CONTEXT_AUX7_CF (0x3<<8) ++#define __TSTORM_ISCSI_AG_CONTEXT_AUX7_CF_SHIFT 8 ++#define __TSTORM_ISCSI_AG_CONTEXT_AUX7_FLAG (0x1<<10) ++#define __TSTORM_ISCSI_AG_CONTEXT_AUX7_FLAG_SHIFT 10 ++#define TSTORM_ISCSI_AG_CONTEXT_AUX3_CF_EN (0x1<<11) ++#define TSTORM_ISCSI_AG_CONTEXT_AUX3_CF_EN_SHIFT 11 ++#define TSTORM_ISCSI_AG_CONTEXT_AUX4_CF_EN (0x1<<12) ++#define TSTORM_ISCSI_AG_CONTEXT_AUX4_CF_EN_SHIFT 12 ++#define TSTORM_ISCSI_AG_CONTEXT_AUX5_CF_EN (0x1<<13) ++#define TSTORM_ISCSI_AG_CONTEXT_AUX5_CF_EN_SHIFT 13 ++#define TSTORM_ISCSI_AG_CONTEXT_AUX6_CF_EN (0x1<<14) ++#define TSTORM_ISCSI_AG_CONTEXT_AUX6_CF_EN_SHIFT 14 ++#define TSTORM_ISCSI_AG_CONTEXT_AUX7_CF_EN (0x1<<15) ++#define TSTORM_ISCSI_AG_CONTEXT_AUX7_CF_EN_SHIFT 15 ++#elif defined(__LITTLE_ENDIAN) ++ u16 agg_vars2; ++#define __TSTORM_ISCSI_AG_CONTEXT_AUX5_FLAG (0x1<<0) ++#define __TSTORM_ISCSI_AG_CONTEXT_AUX5_FLAG_SHIFT 0 ++#define __TSTORM_ISCSI_AG_CONTEXT_AUX6_FLAG (0x1<<1) ++#define __TSTORM_ISCSI_AG_CONTEXT_AUX6_FLAG_SHIFT 1 ++#define __TSTORM_ISCSI_AG_CONTEXT_AUX4_CF (0x3<<2) ++#define __TSTORM_ISCSI_AG_CONTEXT_AUX4_CF_SHIFT 2 ++#define __TSTORM_ISCSI_AG_CONTEXT_AUX5_CF (0x3<<4) ++#define __TSTORM_ISCSI_AG_CONTEXT_AUX5_CF_SHIFT 4 ++#define __TSTORM_ISCSI_AG_CONTEXT_AUX6_CF (0x3<<6) ++#define __TSTORM_ISCSI_AG_CONTEXT_AUX6_CF_SHIFT 6 ++#define __TSTORM_ISCSI_AG_CONTEXT_AUX7_CF (0x3<<8) ++#define __TSTORM_ISCSI_AG_CONTEXT_AUX7_CF_SHIFT 8 ++#define __TSTORM_ISCSI_AG_CONTEXT_AUX7_FLAG (0x1<<10) ++#define __TSTORM_ISCSI_AG_CONTEXT_AUX7_FLAG_SHIFT 10 ++#define TSTORM_ISCSI_AG_CONTEXT_AUX3_CF_EN (0x1<<11) ++#define TSTORM_ISCSI_AG_CONTEXT_AUX3_CF_EN_SHIFT 11 ++#define TSTORM_ISCSI_AG_CONTEXT_AUX4_CF_EN (0x1<<12) ++#define TSTORM_ISCSI_AG_CONTEXT_AUX4_CF_EN_SHIFT 12 ++#define TSTORM_ISCSI_AG_CONTEXT_AUX5_CF_EN (0x1<<13) ++#define TSTORM_ISCSI_AG_CONTEXT_AUX5_CF_EN_SHIFT 13 ++#define TSTORM_ISCSI_AG_CONTEXT_AUX6_CF_EN (0x1<<14) ++#define TSTORM_ISCSI_AG_CONTEXT_AUX6_CF_EN_SHIFT 14 ++#define TSTORM_ISCSI_AG_CONTEXT_AUX7_CF_EN (0x1<<15) ++#define TSTORM_ISCSI_AG_CONTEXT_AUX7_CF_EN_SHIFT 15 ++ u16 __agg_val4; ++#endif ++ struct tstorm_tcp_tcp_ag_context_section tcp; ++}; ++ ++/* ++ * The iscsi aggregative context of Cstorm ++ */ ++struct cstorm_iscsi_ag_context { ++ u32 agg_vars1; ++#define CSTORM_ISCSI_AG_CONTEXT_STATE (0xFF<<0) ++#define CSTORM_ISCSI_AG_CONTEXT_STATE_SHIFT 0 ++#define __CSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM0 (0x1<<8) ++#define __CSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM0_SHIFT 8 ++#define __CSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM1 (0x1<<9) ++#define __CSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM1_SHIFT 9 ++#define __CSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM2 (0x1<<10) ++#define __CSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM2_SHIFT 10 ++#define __CSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM3 (0x1<<11) ++#define __CSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM3_SHIFT 11 ++#define __CSTORM_ISCSI_AG_CONTEXT_RESERVED_ULP_RX_SE_CF_EN (0x1<<12) ++#define __CSTORM_ISCSI_AG_CONTEXT_RESERVED_ULP_RX_SE_CF_EN_SHIFT 12 ++#define __CSTORM_ISCSI_AG_CONTEXT_RESERVED_ULP_RX_INV_CF_EN (0x1<<13) ++#define __CSTORM_ISCSI_AG_CONTEXT_RESERVED_ULP_RX_INV_CF_EN_SHIFT 13 ++#define __CSTORM_ISCSI_AG_CONTEXT_PENDING_COMPLETION3_CF (0x3<<14) ++#define __CSTORM_ISCSI_AG_CONTEXT_PENDING_COMPLETION3_CF_SHIFT 14 ++#define __CSTORM_ISCSI_AG_CONTEXT_RESERVED66 (0x3<<16) ++#define __CSTORM_ISCSI_AG_CONTEXT_RESERVED66_SHIFT 16 ++#define __CSTORM_ISCSI_AG_CONTEXT_FIN_RECEIVED_CF_EN (0x1<<18) ++#define __CSTORM_ISCSI_AG_CONTEXT_FIN_RECEIVED_CF_EN_SHIFT 18 ++#define __CSTORM_ISCSI_AG_CONTEXT_PENDING_COMPLETION0_CF_EN (0x1<<19) ++#define __CSTORM_ISCSI_AG_CONTEXT_PENDING_COMPLETION0_CF_EN_SHIFT 19 ++#define __CSTORM_ISCSI_AG_CONTEXT_PENDING_COMPLETION1_CF_EN (0x1<<20) ++#define __CSTORM_ISCSI_AG_CONTEXT_PENDING_COMPLETION1_CF_EN_SHIFT 20 ++#define __CSTORM_ISCSI_AG_CONTEXT_PENDING_COMPLETION2_CF_EN (0x1<<21) ++#define __CSTORM_ISCSI_AG_CONTEXT_PENDING_COMPLETION2_CF_EN_SHIFT 21 ++#define __CSTORM_ISCSI_AG_CONTEXT_PENDING_COMPLETION3_CF_EN (0x1<<22) ++#define __CSTORM_ISCSI_AG_CONTEXT_PENDING_COMPLETION3_CF_EN_SHIFT 22 ++#define __CSTORM_ISCSI_AG_CONTEXT_REL_SEQ_RULE (0x7<<23) ++#define __CSTORM_ISCSI_AG_CONTEXT_REL_SEQ_RULE_SHIFT 23 ++#define CSTORM_ISCSI_AG_CONTEXT_HQ_PROD_RULE (0x3<<26) ++#define CSTORM_ISCSI_AG_CONTEXT_HQ_PROD_RULE_SHIFT 26 ++#define __CSTORM_ISCSI_AG_CONTEXT_RESERVED52 (0x3<<28) ++#define __CSTORM_ISCSI_AG_CONTEXT_RESERVED52_SHIFT 28 ++#define __CSTORM_ISCSI_AG_CONTEXT_RESERVED53 (0x3<<30) ++#define __CSTORM_ISCSI_AG_CONTEXT_RESERVED53_SHIFT 30 ++#if defined(__BIG_ENDIAN) ++ u8 __aux1_th; ++ u8 __aux1_val; ++ u16 __agg_vars2; ++#elif defined(__LITTLE_ENDIAN) ++ u16 __agg_vars2; ++ u8 __aux1_val; ++ u8 __aux1_th; ++#endif ++ u32 rel_seq; ++ u32 rel_seq_th; ++#if defined(__BIG_ENDIAN) ++ u16 hq_cons; ++ u16 hq_prod; ++#elif defined(__LITTLE_ENDIAN) ++ u16 hq_prod; ++ u16 hq_cons; ++#endif ++#if defined(__BIG_ENDIAN) ++ u8 __reserved62; ++ u8 __reserved61; ++ u8 __reserved60; ++ u8 __reserved59; ++#elif defined(__LITTLE_ENDIAN) ++ u8 __reserved59; ++ u8 __reserved60; ++ u8 __reserved61; ++ u8 __reserved62; ++#endif ++#if defined(__BIG_ENDIAN) ++ u16 __reserved64; ++ u16 __cq_u_prod0; ++#elif defined(__LITTLE_ENDIAN) ++ u16 __cq_u_prod0; ++ u16 __reserved64; ++#endif ++ u32 __cq_u_prod1; ++#if defined(__BIG_ENDIAN) ++ u16 __agg_vars3; ++ u16 __cq_u_prod2; ++#elif defined(__LITTLE_ENDIAN) ++ u16 __cq_u_prod2; ++ u16 __agg_vars3; ++#endif ++#if defined(__BIG_ENDIAN) ++ u16 __aux2_th; ++ u16 __cq_u_prod3; ++#elif defined(__LITTLE_ENDIAN) ++ u16 __cq_u_prod3; ++ u16 __aux2_th; ++#endif ++}; ++ ++/* ++ * The iscsi aggregative context of Ustorm ++ */ ++struct ustorm_iscsi_ag_context { ++#if defined(__BIG_ENDIAN) ++ u8 __aux_counter_flags; ++ u8 agg_vars2; ++#define USTORM_ISCSI_AG_CONTEXT_TX_CF (0x3<<0) ++#define USTORM_ISCSI_AG_CONTEXT_TX_CF_SHIFT 0 ++#define __USTORM_ISCSI_AG_CONTEXT_TIMER_CF (0x3<<2) ++#define __USTORM_ISCSI_AG_CONTEXT_TIMER_CF_SHIFT 2 ++#define USTORM_ISCSI_AG_CONTEXT_AGG_MISC4_RULE (0x7<<4) ++#define USTORM_ISCSI_AG_CONTEXT_AGG_MISC4_RULE_SHIFT 4 ++#define __USTORM_ISCSI_AG_CONTEXT_AGG_VAL2_MASK (0x1<<7) ++#define __USTORM_ISCSI_AG_CONTEXT_AGG_VAL2_MASK_SHIFT 7 ++ u8 agg_vars1; ++#define __USTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM0 (0x1<<0) ++#define __USTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM0_SHIFT 0 ++#define USTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM1 (0x1<<1) ++#define USTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM1_SHIFT 1 ++#define USTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM2 (0x1<<2) ++#define USTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM2_SHIFT 2 ++#define USTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM3 (0x1<<3) ++#define USTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM3_SHIFT 3 ++#define USTORM_ISCSI_AG_CONTEXT_INV_CF (0x3<<4) ++#define USTORM_ISCSI_AG_CONTEXT_INV_CF_SHIFT 4 ++#define USTORM_ISCSI_AG_CONTEXT_COMPLETION_CF (0x3<<6) ++#define USTORM_ISCSI_AG_CONTEXT_COMPLETION_CF_SHIFT 6 ++ u8 state; ++#elif defined(__LITTLE_ENDIAN) ++ u8 state; ++ u8 agg_vars1; ++#define __USTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM0 (0x1<<0) ++#define __USTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM0_SHIFT 0 ++#define USTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM1 (0x1<<1) ++#define USTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM1_SHIFT 1 ++#define USTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM2 (0x1<<2) ++#define USTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM2_SHIFT 2 ++#define USTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM3 (0x1<<3) ++#define USTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM3_SHIFT 3 ++#define USTORM_ISCSI_AG_CONTEXT_INV_CF (0x3<<4) ++#define USTORM_ISCSI_AG_CONTEXT_INV_CF_SHIFT 4 ++#define USTORM_ISCSI_AG_CONTEXT_COMPLETION_CF (0x3<<6) ++#define USTORM_ISCSI_AG_CONTEXT_COMPLETION_CF_SHIFT 6 ++ u8 agg_vars2; ++#define USTORM_ISCSI_AG_CONTEXT_TX_CF (0x3<<0) ++#define USTORM_ISCSI_AG_CONTEXT_TX_CF_SHIFT 0 ++#define __USTORM_ISCSI_AG_CONTEXT_TIMER_CF (0x3<<2) ++#define __USTORM_ISCSI_AG_CONTEXT_TIMER_CF_SHIFT 2 ++#define USTORM_ISCSI_AG_CONTEXT_AGG_MISC4_RULE (0x7<<4) ++#define USTORM_ISCSI_AG_CONTEXT_AGG_MISC4_RULE_SHIFT 4 ++#define __USTORM_ISCSI_AG_CONTEXT_AGG_VAL2_MASK (0x1<<7) ++#define __USTORM_ISCSI_AG_CONTEXT_AGG_VAL2_MASK_SHIFT 7 ++ u8 __aux_counter_flags; ++#endif ++#if defined(__BIG_ENDIAN) ++ u8 cdu_usage; ++ u8 agg_misc2; ++ u16 __cq_local_comp_itt_val; ++#elif defined(__LITTLE_ENDIAN) ++ u16 __cq_local_comp_itt_val; ++ u8 agg_misc2; ++ u8 cdu_usage; ++#endif ++ u32 agg_misc4; ++#if defined(__BIG_ENDIAN) ++ u8 agg_val3_th; ++ u8 agg_val3; ++ u16 agg_misc3; ++#elif defined(__LITTLE_ENDIAN) ++ u16 agg_misc3; ++ u8 agg_val3; ++ u8 agg_val3_th; ++#endif ++ u32 agg_val1; ++ u32 agg_misc4_th; ++#if defined(__BIG_ENDIAN) ++ u16 agg_val2_th; ++ u16 agg_val2; ++#elif defined(__LITTLE_ENDIAN) ++ u16 agg_val2; ++ u16 agg_val2_th; ++#endif ++#if defined(__BIG_ENDIAN) ++ u16 __reserved2; ++ u8 decision_rules; ++#define USTORM_ISCSI_AG_CONTEXT_AGG_VAL2_RULE (0x7<<0) ++#define USTORM_ISCSI_AG_CONTEXT_AGG_VAL2_RULE_SHIFT 0 ++#define __USTORM_ISCSI_AG_CONTEXT_AGG_VAL3_RULE (0x7<<3) ++#define __USTORM_ISCSI_AG_CONTEXT_AGG_VAL3_RULE_SHIFT 3 ++#define __USTORM_ISCSI_AG_CONTEXT_AGG_VAL2_ARM_N_FLAG (0x1<<6) ++#define __USTORM_ISCSI_AG_CONTEXT_AGG_VAL2_ARM_N_FLAG_SHIFT 6 ++#define __USTORM_ISCSI_AG_CONTEXT_RESERVED1 (0x1<<7) ++#define __USTORM_ISCSI_AG_CONTEXT_RESERVED1_SHIFT 7 ++ u8 decision_rule_enable_bits; ++#define USTORM_ISCSI_AG_CONTEXT_INV_CF_EN (0x1<<0) ++#define USTORM_ISCSI_AG_CONTEXT_INV_CF_EN_SHIFT 0 ++#define USTORM_ISCSI_AG_CONTEXT_COMPLETION_CF_EN (0x1<<1) ++#define USTORM_ISCSI_AG_CONTEXT_COMPLETION_CF_EN_SHIFT 1 ++#define USTORM_ISCSI_AG_CONTEXT_TX_CF_EN (0x1<<2) ++#define USTORM_ISCSI_AG_CONTEXT_TX_CF_EN_SHIFT 2 ++#define __USTORM_ISCSI_AG_CONTEXT_TIMER_CF_EN (0x1<<3) ++#define __USTORM_ISCSI_AG_CONTEXT_TIMER_CF_EN_SHIFT 3 ++#define __USTORM_ISCSI_AG_CONTEXT_CQ_LOCAL_COMP_CF_EN (0x1<<4) ++#define __USTORM_ISCSI_AG_CONTEXT_CQ_LOCAL_COMP_CF_EN_SHIFT 4 ++#define __USTORM_ISCSI_AG_CONTEXT_QUEUES_FLUSH_Q0_CF_EN (0x1<<5) ++#define __USTORM_ISCSI_AG_CONTEXT_QUEUES_FLUSH_Q0_CF_EN_SHIFT 5 ++#define __USTORM_ISCSI_AG_CONTEXT_AUX3_CF_EN (0x1<<6) ++#define __USTORM_ISCSI_AG_CONTEXT_AUX3_CF_EN_SHIFT 6 ++#define __USTORM_ISCSI_AG_CONTEXT_DQ_CF_EN (0x1<<7) ++#define __USTORM_ISCSI_AG_CONTEXT_DQ_CF_EN_SHIFT 7 ++#elif defined(__LITTLE_ENDIAN) ++ u8 decision_rule_enable_bits; ++#define USTORM_ISCSI_AG_CONTEXT_INV_CF_EN (0x1<<0) ++#define USTORM_ISCSI_AG_CONTEXT_INV_CF_EN_SHIFT 0 ++#define USTORM_ISCSI_AG_CONTEXT_COMPLETION_CF_EN (0x1<<1) ++#define USTORM_ISCSI_AG_CONTEXT_COMPLETION_CF_EN_SHIFT 1 ++#define USTORM_ISCSI_AG_CONTEXT_TX_CF_EN (0x1<<2) ++#define USTORM_ISCSI_AG_CONTEXT_TX_CF_EN_SHIFT 2 ++#define __USTORM_ISCSI_AG_CONTEXT_TIMER_CF_EN (0x1<<3) ++#define __USTORM_ISCSI_AG_CONTEXT_TIMER_CF_EN_SHIFT 3 ++#define __USTORM_ISCSI_AG_CONTEXT_CQ_LOCAL_COMP_CF_EN (0x1<<4) ++#define __USTORM_ISCSI_AG_CONTEXT_CQ_LOCAL_COMP_CF_EN_SHIFT 4 ++#define __USTORM_ISCSI_AG_CONTEXT_QUEUES_FLUSH_Q0_CF_EN (0x1<<5) ++#define __USTORM_ISCSI_AG_CONTEXT_QUEUES_FLUSH_Q0_CF_EN_SHIFT 5 ++#define __USTORM_ISCSI_AG_CONTEXT_AUX3_CF_EN (0x1<<6) ++#define __USTORM_ISCSI_AG_CONTEXT_AUX3_CF_EN_SHIFT 6 ++#define __USTORM_ISCSI_AG_CONTEXT_DQ_CF_EN (0x1<<7) ++#define __USTORM_ISCSI_AG_CONTEXT_DQ_CF_EN_SHIFT 7 ++ u8 decision_rules; ++#define USTORM_ISCSI_AG_CONTEXT_AGG_VAL2_RULE (0x7<<0) ++#define USTORM_ISCSI_AG_CONTEXT_AGG_VAL2_RULE_SHIFT 0 ++#define __USTORM_ISCSI_AG_CONTEXT_AGG_VAL3_RULE (0x7<<3) ++#define __USTORM_ISCSI_AG_CONTEXT_AGG_VAL3_RULE_SHIFT 3 ++#define __USTORM_ISCSI_AG_CONTEXT_AGG_VAL2_ARM_N_FLAG (0x1<<6) ++#define __USTORM_ISCSI_AG_CONTEXT_AGG_VAL2_ARM_N_FLAG_SHIFT 6 ++#define __USTORM_ISCSI_AG_CONTEXT_RESERVED1 (0x1<<7) ++#define __USTORM_ISCSI_AG_CONTEXT_RESERVED1_SHIFT 7 ++ u16 __reserved2; ++#endif ++}; ++ ++/* ++ * Timers connection context ++ */ ++struct iscsi_timers_block_context { ++ u32 __reserved_0; ++ u32 __reserved_1; ++ u32 __reserved_2; ++ u32 flags; ++#define __ISCSI_TIMERS_BLOCK_CONTEXT_NUM_OF_ACTIVE_TIMERS (0x3<<0) ++#define __ISCSI_TIMERS_BLOCK_CONTEXT_NUM_OF_ACTIVE_TIMERS_SHIFT 0 ++#define ISCSI_TIMERS_BLOCK_CONTEXT_CONN_VALID_FLG (0x1<<2) ++#define ISCSI_TIMERS_BLOCK_CONTEXT_CONN_VALID_FLG_SHIFT 2 ++#define __ISCSI_TIMERS_BLOCK_CONTEXT_RESERVED0 (0x1FFFFFFF<<3) ++#define __ISCSI_TIMERS_BLOCK_CONTEXT_RESERVED0_SHIFT 3 ++}; ++ ++/* ++ * Ethernet context section, shared in TOE, RDMA and ISCSI ++ */ ++struct xstorm_eth_context_section { ++#if defined(__BIG_ENDIAN) ++ u8 remote_addr_4; ++ u8 remote_addr_5; ++ u8 local_addr_0; ++ u8 local_addr_1; ++#elif defined(__LITTLE_ENDIAN) ++ u8 local_addr_1; ++ u8 local_addr_0; ++ u8 remote_addr_5; ++ u8 remote_addr_4; ++#endif ++#if defined(__BIG_ENDIAN) ++ u8 remote_addr_0; ++ u8 remote_addr_1; ++ u8 remote_addr_2; ++ u8 remote_addr_3; ++#elif defined(__LITTLE_ENDIAN) ++ u8 remote_addr_3; ++ u8 remote_addr_2; ++ u8 remote_addr_1; ++ u8 remote_addr_0; ++#endif ++#if defined(__BIG_ENDIAN) ++ u16 reserved_vlan_type; ++ u16 params; ++#define XSTORM_ETH_CONTEXT_SECTION_VLAN_ID (0xFFF<<0) ++#define XSTORM_ETH_CONTEXT_SECTION_VLAN_ID_SHIFT 0 ++#define XSTORM_ETH_CONTEXT_SECTION_CFI (0x1<<12) ++#define XSTORM_ETH_CONTEXT_SECTION_CFI_SHIFT 12 ++#define XSTORM_ETH_CONTEXT_SECTION_PRIORITY (0x7<<13) ++#define XSTORM_ETH_CONTEXT_SECTION_PRIORITY_SHIFT 13 ++#elif defined(__LITTLE_ENDIAN) ++ u16 params; ++#define XSTORM_ETH_CONTEXT_SECTION_VLAN_ID (0xFFF<<0) ++#define XSTORM_ETH_CONTEXT_SECTION_VLAN_ID_SHIFT 0 ++#define XSTORM_ETH_CONTEXT_SECTION_CFI (0x1<<12) ++#define XSTORM_ETH_CONTEXT_SECTION_CFI_SHIFT 12 ++#define XSTORM_ETH_CONTEXT_SECTION_PRIORITY (0x7<<13) ++#define XSTORM_ETH_CONTEXT_SECTION_PRIORITY_SHIFT 13 ++ u16 reserved_vlan_type; ++#endif ++#if defined(__BIG_ENDIAN) ++ u8 local_addr_2; ++ u8 local_addr_3; ++ u8 local_addr_4; ++ u8 local_addr_5; ++#elif defined(__LITTLE_ENDIAN) ++ u8 local_addr_5; ++ u8 local_addr_4; ++ u8 local_addr_3; ++ u8 local_addr_2; ++#endif ++}; ++ ++/* ++ * IpV4 context section, shared in TOE, RDMA and ISCSI ++ */ ++struct xstorm_ip_v4_context_section { ++#if defined(__BIG_ENDIAN) ++ u16 __pbf_hdr_cmd_rsvd_id; ++ u16 __pbf_hdr_cmd_rsvd_flags_offset; ++#elif defined(__LITTLE_ENDIAN) ++ u16 __pbf_hdr_cmd_rsvd_flags_offset; ++ u16 __pbf_hdr_cmd_rsvd_id; ++#endif ++#if defined(__BIG_ENDIAN) ++ u8 __pbf_hdr_cmd_rsvd_ver_ihl; ++ u8 tos; ++ u16 __pbf_hdr_cmd_rsvd_length; ++#elif defined(__LITTLE_ENDIAN) ++ u16 __pbf_hdr_cmd_rsvd_length; ++ u8 tos; ++ u8 __pbf_hdr_cmd_rsvd_ver_ihl; ++#endif ++ u32 ip_local_addr; ++#if defined(__BIG_ENDIAN) ++ u8 ttl; ++ u8 __pbf_hdr_cmd_rsvd_protocol; ++ u16 __pbf_hdr_cmd_rsvd_csum; ++#elif defined(__LITTLE_ENDIAN) ++ u16 __pbf_hdr_cmd_rsvd_csum; ++ u8 __pbf_hdr_cmd_rsvd_protocol; ++ u8 ttl; ++#endif ++ u32 __pbf_hdr_cmd_rsvd_1; ++ u32 ip_remote_addr; ++}; ++ ++/* ++ * context section, shared in TOE, RDMA and ISCSI ++ */ ++struct xstorm_padded_ip_v4_context_section { ++ struct xstorm_ip_v4_context_section ip_v4; ++ u32 reserved1[4]; ++}; ++ ++/* ++ * IpV6 context section, shared in TOE, RDMA and ISCSI ++ */ ++struct xstorm_ip_v6_context_section { ++#if defined(__BIG_ENDIAN) ++ u16 pbf_hdr_cmd_rsvd_payload_len; ++ u8 pbf_hdr_cmd_rsvd_nxt_hdr; ++ u8 hop_limit; ++#elif defined(__LITTLE_ENDIAN) ++ u8 hop_limit; ++ u8 pbf_hdr_cmd_rsvd_nxt_hdr; ++ u16 pbf_hdr_cmd_rsvd_payload_len; ++#endif ++ u32 priority_flow_label; ++#define XSTORM_IP_V6_CONTEXT_SECTION_FLOW_LABEL (0xFFFFF<<0) ++#define XSTORM_IP_V6_CONTEXT_SECTION_FLOW_LABEL_SHIFT 0 ++#define XSTORM_IP_V6_CONTEXT_SECTION_TRAFFIC_CLASS (0xFF<<20) ++#define XSTORM_IP_V6_CONTEXT_SECTION_TRAFFIC_CLASS_SHIFT 20 ++#define XSTORM_IP_V6_CONTEXT_SECTION_PBF_HDR_CMD_RSVD_VER (0xF<<28) ++#define XSTORM_IP_V6_CONTEXT_SECTION_PBF_HDR_CMD_RSVD_VER_SHIFT 28 ++ u32 ip_local_addr_lo_hi; ++ u32 ip_local_addr_lo_lo; ++ u32 ip_local_addr_hi_hi; ++ u32 ip_local_addr_hi_lo; ++ u32 ip_remote_addr_lo_hi; ++ u32 ip_remote_addr_lo_lo; ++ u32 ip_remote_addr_hi_hi; ++ u32 ip_remote_addr_hi_lo; ++}; ++ ++union xstorm_ip_context_section_types { ++ struct xstorm_padded_ip_v4_context_section padded_ip_v4; ++ struct xstorm_ip_v6_context_section ip_v6; ++}; ++ ++/* ++ * TCP context section, shared in TOE, RDMA and ISCSI ++ */ ++struct xstorm_tcp_context_section { ++ u32 snd_max; ++#if defined(__BIG_ENDIAN) ++ u16 remote_port; ++ u16 local_port; ++#elif defined(__LITTLE_ENDIAN) ++ u16 local_port; ++ u16 remote_port; ++#endif ++#if defined(__BIG_ENDIAN) ++ u8 original_nagle_1b; ++ u8 ts_enabled_1b; ++ u16 tcp_params; ++#define XSTORM_TCP_CONTEXT_SECTION_TOTAL_HEADER_SIZE (0xFF<<0) ++#define XSTORM_TCP_CONTEXT_SECTION_TOTAL_HEADER_SIZE_SHIFT 0 ++#define __XSTORM_TCP_CONTEXT_SECTION_ECT_BIT (0x1<<8) ++#define __XSTORM_TCP_CONTEXT_SECTION_ECT_BIT_SHIFT 8 ++#define __XSTORM_TCP_CONTEXT_SECTION_ECN_ENABLED (0x1<<9) ++#define __XSTORM_TCP_CONTEXT_SECTION_ECN_ENABLED_SHIFT 9 ++#define XSTORM_TCP_CONTEXT_SECTION_SACK_ENABLED (0x1<<10) ++#define XSTORM_TCP_CONTEXT_SECTION_SACK_ENABLED_SHIFT 10 ++#define XSTORM_TCP_CONTEXT_SECTION_KA_STATE (0x1<<11) ++#define XSTORM_TCP_CONTEXT_SECTION_KA_STATE_SHIFT 11 ++#define XSTORM_TCP_CONTEXT_SECTION_FIN_SENT_FLAG (0x1<<12) ++#define XSTORM_TCP_CONTEXT_SECTION_FIN_SENT_FLAG_SHIFT 12 ++#define XSTORM_TCP_CONTEXT_SECTION_WINDOW_SATURATED (0x1<<13) ++#define XSTORM_TCP_CONTEXT_SECTION_WINDOW_SATURATED_SHIFT 13 ++#define XSTORM_TCP_CONTEXT_SECTION_SLOWPATH_QUEUES_FLUSH_COUNTER (0x3<<14) ++#define XSTORM_TCP_CONTEXT_SECTION_SLOWPATH_QUEUES_FLUSH_COUNTER_SHIFT 14 ++#elif defined(__LITTLE_ENDIAN) ++ u16 tcp_params; ++#define XSTORM_TCP_CONTEXT_SECTION_TOTAL_HEADER_SIZE (0xFF<<0) ++#define XSTORM_TCP_CONTEXT_SECTION_TOTAL_HEADER_SIZE_SHIFT 0 ++#define __XSTORM_TCP_CONTEXT_SECTION_ECT_BIT (0x1<<8) ++#define __XSTORM_TCP_CONTEXT_SECTION_ECT_BIT_SHIFT 8 ++#define __XSTORM_TCP_CONTEXT_SECTION_ECN_ENABLED (0x1<<9) ++#define __XSTORM_TCP_CONTEXT_SECTION_ECN_ENABLED_SHIFT 9 ++#define XSTORM_TCP_CONTEXT_SECTION_SACK_ENABLED (0x1<<10) ++#define XSTORM_TCP_CONTEXT_SECTION_SACK_ENABLED_SHIFT 10 ++#define XSTORM_TCP_CONTEXT_SECTION_KA_STATE (0x1<<11) ++#define XSTORM_TCP_CONTEXT_SECTION_KA_STATE_SHIFT 11 ++#define XSTORM_TCP_CONTEXT_SECTION_FIN_SENT_FLAG (0x1<<12) ++#define XSTORM_TCP_CONTEXT_SECTION_FIN_SENT_FLAG_SHIFT 12 ++#define XSTORM_TCP_CONTEXT_SECTION_WINDOW_SATURATED (0x1<<13) ++#define XSTORM_TCP_CONTEXT_SECTION_WINDOW_SATURATED_SHIFT 13 ++#define XSTORM_TCP_CONTEXT_SECTION_SLOWPATH_QUEUES_FLUSH_COUNTER (0x3<<14) ++#define XSTORM_TCP_CONTEXT_SECTION_SLOWPATH_QUEUES_FLUSH_COUNTER_SHIFT 14 ++ u8 ts_enabled_1b; ++ u8 original_nagle_1b; ++#endif ++#if defined(__BIG_ENDIAN) ++ u16 pseudo_csum; ++ u16 window_scaling_factor; ++#elif defined(__LITTLE_ENDIAN) ++ u16 window_scaling_factor; ++ u16 pseudo_csum; ++#endif ++ u32 reserved2; ++ u32 ts_time_diff; ++ u32 __next_timer_expir; ++}; ++ ++/* ++ * Common context section, shared in TOE, RDMA and ISCSI ++ */ ++struct xstorm_common_context_section { ++ struct xstorm_eth_context_section ethernet; ++ union xstorm_ip_context_section_types ip_union; ++ struct xstorm_tcp_context_section tcp; ++#if defined(__BIG_ENDIAN) ++ u16 reserved; ++ u8 statistics_params; ++#define XSTORM_COMMON_CONTEXT_SECTION_UPDATE_L2_STATSTICS (0x1<<0) ++#define XSTORM_COMMON_CONTEXT_SECTION_UPDATE_L2_STATSTICS_SHIFT 0 ++#define XSTORM_COMMON_CONTEXT_SECTION_UPDATE_L4_STATSTICS (0x1<<1) ++#define XSTORM_COMMON_CONTEXT_SECTION_UPDATE_L4_STATSTICS_SHIFT 1 ++#define XSTORM_COMMON_CONTEXT_SECTION_STATISTICS_COUNTER_ID (0x1F<<2) ++#define XSTORM_COMMON_CONTEXT_SECTION_STATISTICS_COUNTER_ID_SHIFT 2 ++#define XSTORM_COMMON_CONTEXT_SECTION_RESERVED0 (0x1<<7) ++#define XSTORM_COMMON_CONTEXT_SECTION_RESERVED0_SHIFT 7 ++ u8 ip_version_1b; ++#elif defined(__LITTLE_ENDIAN) ++ u8 ip_version_1b; ++ u8 statistics_params; ++#define XSTORM_COMMON_CONTEXT_SECTION_UPDATE_L2_STATSTICS (0x1<<0) ++#define XSTORM_COMMON_CONTEXT_SECTION_UPDATE_L2_STATSTICS_SHIFT 0 ++#define XSTORM_COMMON_CONTEXT_SECTION_UPDATE_L4_STATSTICS (0x1<<1) ++#define XSTORM_COMMON_CONTEXT_SECTION_UPDATE_L4_STATSTICS_SHIFT 1 ++#define XSTORM_COMMON_CONTEXT_SECTION_STATISTICS_COUNTER_ID (0x1F<<2) ++#define XSTORM_COMMON_CONTEXT_SECTION_STATISTICS_COUNTER_ID_SHIFT 2 ++#define XSTORM_COMMON_CONTEXT_SECTION_RESERVED0 (0x1<<7) ++#define XSTORM_COMMON_CONTEXT_SECTION_RESERVED0_SHIFT 7 ++ u16 reserved; ++#endif ++}; ++ ++/* ++ * Flags used in ISCSI context section ++ */ ++struct xstorm_iscsi_context_flags { ++ u8 flags; ++#define XSTORM_ISCSI_CONTEXT_FLAGS_B_IMMEDIATE_DATA (0x1<<0) ++#define XSTORM_ISCSI_CONTEXT_FLAGS_B_IMMEDIATE_DATA_SHIFT 0 ++#define XSTORM_ISCSI_CONTEXT_FLAGS_B_INITIAL_R2T (0x1<<1) ++#define XSTORM_ISCSI_CONTEXT_FLAGS_B_INITIAL_R2T_SHIFT 1 ++#define XSTORM_ISCSI_CONTEXT_FLAGS_B_EN_HEADER_DIGEST (0x1<<2) ++#define XSTORM_ISCSI_CONTEXT_FLAGS_B_EN_HEADER_DIGEST_SHIFT 2 ++#define XSTORM_ISCSI_CONTEXT_FLAGS_B_EN_DATA_DIGEST (0x1<<3) ++#define XSTORM_ISCSI_CONTEXT_FLAGS_B_EN_DATA_DIGEST_SHIFT 3 ++#define XSTORM_ISCSI_CONTEXT_FLAGS_B_HQ_BD_WRITTEN (0x1<<4) ++#define XSTORM_ISCSI_CONTEXT_FLAGS_B_HQ_BD_WRITTEN_SHIFT 4 ++#define XSTORM_ISCSI_CONTEXT_FLAGS_B_LAST_OP_SQ (0x1<<5) ++#define XSTORM_ISCSI_CONTEXT_FLAGS_B_LAST_OP_SQ_SHIFT 5 ++#define XSTORM_ISCSI_CONTEXT_FLAGS_B_UPDATE_SND_NXT (0x1<<6) ++#define XSTORM_ISCSI_CONTEXT_FLAGS_B_UPDATE_SND_NXT_SHIFT 6 ++#define XSTORM_ISCSI_CONTEXT_FLAGS_RESERVED4 (0x1<<7) ++#define XSTORM_ISCSI_CONTEXT_FLAGS_RESERVED4_SHIFT 7 ++}; ++ ++struct iscsi_task_context_entry_x { ++ u32 data_out_buffer_offset; ++ u32 itt; ++ u32 data_sn; ++}; ++ ++struct iscsi_task_context_entry_xuc_x_write_only { ++ u32 tx_r2t_sn; ++}; ++ ++struct iscsi_task_context_entry_xuc_xu_write_both { ++ u32 sgl_base_lo; ++ u32 sgl_base_hi; ++#if defined(__BIG_ENDIAN) ++ u8 sgl_size; ++ u8 sge_index; ++ u16 sge_offset; ++#elif defined(__LITTLE_ENDIAN) ++ u16 sge_offset; ++ u8 sge_index; ++ u8 sgl_size; ++#endif ++}; ++ ++/* ++ * iSCSI context section ++ */ ++struct xstorm_iscsi_context_section { ++ u32 first_burst_length; ++ u32 max_send_pdu_length; ++ struct regpair sq_pbl_base; ++ struct regpair sq_curr_pbe; ++ struct regpair hq_pbl_base; ++ struct regpair hq_curr_pbe_base; ++ struct regpair r2tq_pbl_base; ++ struct regpair r2tq_curr_pbe_base; ++ struct regpair task_pbl_base; ++#if defined(__BIG_ENDIAN) ++ u16 data_out_count; ++ struct xstorm_iscsi_context_flags flags; ++ u8 task_pbl_cache_idx; ++#elif defined(__LITTLE_ENDIAN) ++ u8 task_pbl_cache_idx; ++ struct xstorm_iscsi_context_flags flags; ++ u16 data_out_count; ++#endif ++ u32 seq_more_2_send; ++ u32 pdu_more_2_send; ++ struct iscsi_task_context_entry_x temp_tce_x; ++ struct iscsi_task_context_entry_xuc_x_write_only temp_tce_x_wr; ++ struct iscsi_task_context_entry_xuc_xu_write_both temp_tce_xu_wr; ++ struct regpair lun; ++ u32 exp_data_transfer_len_ttt; ++ u32 pdu_data_2_rxmit; ++ u32 rxmit_bytes_2_dr; ++#if defined(__BIG_ENDIAN) ++ u16 rxmit_sge_offset; ++ u16 hq_rxmit_cons; ++#elif defined(__LITTLE_ENDIAN) ++ u16 hq_rxmit_cons; ++ u16 rxmit_sge_offset; ++#endif ++#if defined(__BIG_ENDIAN) ++ u16 r2tq_cons; ++ u8 rxmit_flags; ++#define XSTORM_ISCSI_CONTEXT_SECTION_B_NEW_HQ_BD (0x1<<0) ++#define XSTORM_ISCSI_CONTEXT_SECTION_B_NEW_HQ_BD_SHIFT 0 ++#define XSTORM_ISCSI_CONTEXT_SECTION_B_RXMIT_PDU_HDR (0x1<<1) ++#define XSTORM_ISCSI_CONTEXT_SECTION_B_RXMIT_PDU_HDR_SHIFT 1 ++#define XSTORM_ISCSI_CONTEXT_SECTION_B_RXMIT_END_PDU (0x1<<2) ++#define XSTORM_ISCSI_CONTEXT_SECTION_B_RXMIT_END_PDU_SHIFT 2 ++#define XSTORM_ISCSI_CONTEXT_SECTION_B_RXMIT_DR (0x1<<3) ++#define XSTORM_ISCSI_CONTEXT_SECTION_B_RXMIT_DR_SHIFT 3 ++#define XSTORM_ISCSI_CONTEXT_SECTION_B_RXMIT_START_DR (0x1<<4) ++#define XSTORM_ISCSI_CONTEXT_SECTION_B_RXMIT_START_DR_SHIFT 4 ++#define XSTORM_ISCSI_CONTEXT_SECTION_B_RXMIT_PADDING (0x3<<5) ++#define XSTORM_ISCSI_CONTEXT_SECTION_B_RXMIT_PADDING_SHIFT 5 ++#define XSTORM_ISCSI_CONTEXT_SECTION_B_ISCSI_CONT_FAST_RXMIT (0x1<<7) ++#define XSTORM_ISCSI_CONTEXT_SECTION_B_ISCSI_CONT_FAST_RXMIT_SHIFT 7 ++ u8 rxmit_sge_idx; ++#elif defined(__LITTLE_ENDIAN) ++ u8 rxmit_sge_idx; ++ u8 rxmit_flags; ++#define XSTORM_ISCSI_CONTEXT_SECTION_B_NEW_HQ_BD (0x1<<0) ++#define XSTORM_ISCSI_CONTEXT_SECTION_B_NEW_HQ_BD_SHIFT 0 ++#define XSTORM_ISCSI_CONTEXT_SECTION_B_RXMIT_PDU_HDR (0x1<<1) ++#define XSTORM_ISCSI_CONTEXT_SECTION_B_RXMIT_PDU_HDR_SHIFT 1 ++#define XSTORM_ISCSI_CONTEXT_SECTION_B_RXMIT_END_PDU (0x1<<2) ++#define XSTORM_ISCSI_CONTEXT_SECTION_B_RXMIT_END_PDU_SHIFT 2 ++#define XSTORM_ISCSI_CONTEXT_SECTION_B_RXMIT_DR (0x1<<3) ++#define XSTORM_ISCSI_CONTEXT_SECTION_B_RXMIT_DR_SHIFT 3 ++#define XSTORM_ISCSI_CONTEXT_SECTION_B_RXMIT_START_DR (0x1<<4) ++#define XSTORM_ISCSI_CONTEXT_SECTION_B_RXMIT_START_DR_SHIFT 4 ++#define XSTORM_ISCSI_CONTEXT_SECTION_B_RXMIT_PADDING (0x3<<5) ++#define XSTORM_ISCSI_CONTEXT_SECTION_B_RXMIT_PADDING_SHIFT 5 ++#define XSTORM_ISCSI_CONTEXT_SECTION_B_ISCSI_CONT_FAST_RXMIT (0x1<<7) ++#define XSTORM_ISCSI_CONTEXT_SECTION_B_ISCSI_CONT_FAST_RXMIT_SHIFT 7 ++ u16 r2tq_cons; ++#endif ++ u32 hq_rxmit_tcp_seq; ++}; ++ ++/* ++ * Xstorm iSCSI Storm Context ++ */ ++struct xstorm_iscsi_st_context { ++ struct xstorm_common_context_section common; ++ struct xstorm_iscsi_context_section iscsi; ++}; ++ ++/* ++ * CQ DB CQ producer and pending completion counter ++ */ ++struct iscsi_cq_db_prod_pnd_cmpltn_cnt { ++#if defined(__BIG_ENDIAN) ++ u16 cntr; ++ u16 prod; ++#elif defined(__LITTLE_ENDIAN) ++ u16 prod; ++ u16 cntr; ++#endif ++}; ++ ++/* ++ * CQ DB pending completion ITT array ++ */ ++struct iscsi_cq_db_prod_pnd_cmpltn_cnt_arr { ++ struct iscsi_cq_db_prod_pnd_cmpltn_cnt prod_pend_comp[8]; ++}; ++ ++/* ++ * Cstorm CQ sequence to notify array, updated by driver ++ */ ++struct iscsi_cq_db_sqn_2_notify_arr { ++ u16 sqn[8]; ++}; ++ ++/* ++ * Cstorm iSCSI Storm Context ++ */ ++struct cstorm_iscsi_st_context { ++ struct iscsi_cq_db_prod_pnd_cmpltn_cnt_arr cq_c_prod_pend_comp_ctr_arr; ++ struct iscsi_cq_db_sqn_2_notify_arr cq_c_prod_sqn_arr; ++ struct iscsi_cq_db_sqn_2_notify_arr cq_c_sqn_2_notify_arr; ++ struct regpair hq_pbl_base; ++ struct regpair hq_curr_pbe; ++ struct regpair task_pbl_base; ++ struct regpair cq_db_base; ++#if defined(__BIG_ENDIAN) ++ u16 hq_bd_itt; ++ u16 iscsi_conn_id; ++#elif defined(__LITTLE_ENDIAN) ++ u16 iscsi_conn_id; ++ u16 hq_bd_itt; ++#endif ++ u32 hq_bd_data_segment_len; ++ u32 hq_bd_buffer_offset; ++#if defined(__BIG_ENDIAN) ++ u8 timer_entry_idx; ++ u8 cq_proc_en_bit_map; ++ u8 cq_pend_comp_itt_valid_bit_map; ++ u8 hq_bd_opcode; ++#elif defined(__LITTLE_ENDIAN) ++ u8 hq_bd_opcode; ++ u8 cq_pend_comp_itt_valid_bit_map; ++ u8 cq_proc_en_bit_map; ++ u8 timer_entry_idx; ++#endif ++ u32 hq_tcp_seq; ++#if defined(__BIG_ENDIAN) ++ u16 flags; ++#define CSTORM_ISCSI_ST_CONTEXT_DATA_DIGEST_EN (0x1<<0) ++#define CSTORM_ISCSI_ST_CONTEXT_DATA_DIGEST_EN_SHIFT 0 ++#define CSTORM_ISCSI_ST_CONTEXT_HDR_DIGEST_EN (0x1<<1) ++#define CSTORM_ISCSI_ST_CONTEXT_HDR_DIGEST_EN_SHIFT 1 ++#define CSTORM_ISCSI_ST_CONTEXT_HQ_BD_CTXT_VALID (0x1<<2) ++#define CSTORM_ISCSI_ST_CONTEXT_HQ_BD_CTXT_VALID_SHIFT 2 ++#define CSTORM_ISCSI_ST_CONTEXT_HQ_BD_LCL_CMPLN_FLG (0x1<<3) ++#define CSTORM_ISCSI_ST_CONTEXT_HQ_BD_LCL_CMPLN_FLG_SHIFT 3 ++#define CSTORM_ISCSI_ST_CONTEXT_HQ_BD_WRITE_TASK (0x1<<4) ++#define CSTORM_ISCSI_ST_CONTEXT_HQ_BD_WRITE_TASK_SHIFT 4 ++#define CSTORM_ISCSI_ST_CONTEXT_CTRL_FLAGS_RSRV (0x7FF<<5) ++#define CSTORM_ISCSI_ST_CONTEXT_CTRL_FLAGS_RSRV_SHIFT 5 ++ u16 hq_cons; ++#elif defined(__LITTLE_ENDIAN) ++ u16 hq_cons; ++ u16 flags; ++#define CSTORM_ISCSI_ST_CONTEXT_DATA_DIGEST_EN (0x1<<0) ++#define CSTORM_ISCSI_ST_CONTEXT_DATA_DIGEST_EN_SHIFT 0 ++#define CSTORM_ISCSI_ST_CONTEXT_HDR_DIGEST_EN (0x1<<1) ++#define CSTORM_ISCSI_ST_CONTEXT_HDR_DIGEST_EN_SHIFT 1 ++#define CSTORM_ISCSI_ST_CONTEXT_HQ_BD_CTXT_VALID (0x1<<2) ++#define CSTORM_ISCSI_ST_CONTEXT_HQ_BD_CTXT_VALID_SHIFT 2 ++#define CSTORM_ISCSI_ST_CONTEXT_HQ_BD_LCL_CMPLN_FLG (0x1<<3) ++#define CSTORM_ISCSI_ST_CONTEXT_HQ_BD_LCL_CMPLN_FLG_SHIFT 3 ++#define CSTORM_ISCSI_ST_CONTEXT_HQ_BD_WRITE_TASK (0x1<<4) ++#define CSTORM_ISCSI_ST_CONTEXT_HQ_BD_WRITE_TASK_SHIFT 4 ++#define CSTORM_ISCSI_ST_CONTEXT_CTRL_FLAGS_RSRV (0x7FF<<5) ++#define CSTORM_ISCSI_ST_CONTEXT_CTRL_FLAGS_RSRV_SHIFT 5 ++#endif ++ struct regpair rsrv1; ++}; ++ ++/* ++ * Iscsi connection context ++ */ ++struct iscsi_context { ++ struct ustorm_iscsi_st_context ustorm_st_context; ++ struct tstorm_iscsi_st_context tstorm_st_context; ++ struct xstorm_iscsi_ag_context xstorm_ag_context; ++ struct tstorm_iscsi_ag_context tstorm_ag_context; ++ struct cstorm_iscsi_ag_context cstorm_ag_context; ++ struct ustorm_iscsi_ag_context ustorm_ag_context; ++ struct iscsi_timers_block_context timers_context; ++ struct regpair upb_context; ++ struct xstorm_iscsi_st_context xstorm_st_context; ++ struct regpair xpb_context; ++ struct cstorm_iscsi_st_context cstorm_st_context; ++}; ++ ++ ++ ++/* ++ * CQ DB pending completion ITT array ++ */ ++struct iscsi_cq_db_pnd_comp_itt_arr { ++ u16 itt[8]; ++}; ++ ++/* ++ * CQ DB ++ */ ++struct iscsi_cq_db { ++ struct iscsi_cq_db_prod_pnd_cmpltn_cnt_arr cq_u_prod_pend_comp_ctr_arr; ++ struct iscsi_cq_db_pnd_comp_itt_arr cq_c_pend_comp_itt_arr; ++ struct iscsi_cq_db_sqn_2_notify_arr cq_drv_sqn_2_notify_arr; ++ u32 reserved[4]; ++}; ++ ++ ++ ++ ++ ++ ++/* ++ * iSCSI KCQ CQE parameters ++ */ ++union iscsi_kcqe_params { ++ u32 reserved0[4]; ++}; ++ ++/* ++ * iSCSI KCQ CQE ++ */ ++struct iscsi_kcqe { ++ u32 iscsi_conn_id; ++ u32 completion_status; ++ u32 iscsi_conn_context_id; ++ union iscsi_kcqe_params params; ++#if defined(__BIG_ENDIAN) ++ u8 flags; ++#define ISCSI_KCQE_RESERVED0 (0x7<<0) ++#define ISCSI_KCQE_RESERVED0_SHIFT 0 ++#define ISCSI_KCQE_RAMROD_COMPLETION (0x1<<3) ++#define ISCSI_KCQE_RAMROD_COMPLETION_SHIFT 3 ++#define ISCSI_KCQE_LAYER_CODE (0x7<<4) ++#define ISCSI_KCQE_LAYER_CODE_SHIFT 4 ++#define ISCSI_KCQE_LINKED_WITH_NEXT (0x1<<7) ++#define ISCSI_KCQE_LINKED_WITH_NEXT_SHIFT 7 ++ u8 op_code; ++ u16 qe_self_seq; ++#elif defined(__LITTLE_ENDIAN) ++ u16 qe_self_seq; ++ u8 op_code; ++ u8 flags; ++#define ISCSI_KCQE_RESERVED0 (0x7<<0) ++#define ISCSI_KCQE_RESERVED0_SHIFT 0 ++#define ISCSI_KCQE_RAMROD_COMPLETION (0x1<<3) ++#define ISCSI_KCQE_RAMROD_COMPLETION_SHIFT 3 ++#define ISCSI_KCQE_LAYER_CODE (0x7<<4) ++#define ISCSI_KCQE_LAYER_CODE_SHIFT 4 ++#define ISCSI_KCQE_LINKED_WITH_NEXT (0x1<<7) ++#define ISCSI_KCQE_LINKED_WITH_NEXT_SHIFT 7 ++#endif ++}; ++ ++ ++ ++/* ++ * iSCSI KWQE header ++ */ ++struct iscsi_kwqe_header { ++#if defined(__BIG_ENDIAN) ++ u8 flags; ++#define ISCSI_KWQE_HEADER_RESERVED0 (0xF<<0) ++#define ISCSI_KWQE_HEADER_RESERVED0_SHIFT 0 ++#define ISCSI_KWQE_HEADER_LAYER_CODE (0x7<<4) ++#define ISCSI_KWQE_HEADER_LAYER_CODE_SHIFT 4 ++#define ISCSI_KWQE_HEADER_RESERVED1 (0x1<<7) ++#define ISCSI_KWQE_HEADER_RESERVED1_SHIFT 7 ++ u8 op_code; ++#elif defined(__LITTLE_ENDIAN) ++ u8 op_code; ++ u8 flags; ++#define ISCSI_KWQE_HEADER_RESERVED0 (0xF<<0) ++#define ISCSI_KWQE_HEADER_RESERVED0_SHIFT 0 ++#define ISCSI_KWQE_HEADER_LAYER_CODE (0x7<<4) ++#define ISCSI_KWQE_HEADER_LAYER_CODE_SHIFT 4 ++#define ISCSI_KWQE_HEADER_RESERVED1 (0x1<<7) ++#define ISCSI_KWQE_HEADER_RESERVED1_SHIFT 7 ++#endif ++}; ++ ++/* ++ * iSCSI firmware init request 1 ++ */ ++struct iscsi_kwqe_init1 { ++#if defined(__BIG_ENDIAN) ++ struct iscsi_kwqe_header hdr; ++ u8 reserved0; ++ u8 num_cqs; ++#elif defined(__LITTLE_ENDIAN) ++ u8 num_cqs; ++ u8 reserved0; ++ struct iscsi_kwqe_header hdr; ++#endif ++ u32 dummy_buffer_addr_lo; ++ u32 dummy_buffer_addr_hi; ++#if defined(__BIG_ENDIAN) ++ u16 num_ccells_per_conn; ++ u16 num_tasks_per_conn; ++#elif defined(__LITTLE_ENDIAN) ++ u16 num_tasks_per_conn; ++ u16 num_ccells_per_conn; ++#endif ++#if defined(__BIG_ENDIAN) ++ u16 sq_wqes_per_page; ++ u16 sq_num_wqes; ++#elif defined(__LITTLE_ENDIAN) ++ u16 sq_num_wqes; ++ u16 sq_wqes_per_page; ++#endif ++#if defined(__BIG_ENDIAN) ++ u8 cq_log_wqes_per_page; ++ u8 flags; ++#define ISCSI_KWQE_INIT1_PAGE_SIZE (0xF<<0) ++#define ISCSI_KWQE_INIT1_PAGE_SIZE_SHIFT 0 ++#define ISCSI_KWQE_INIT1_DELAYED_ACK_ENABLE (0x1<<4) ++#define ISCSI_KWQE_INIT1_DELAYED_ACK_ENABLE_SHIFT 4 ++#define ISCSI_KWQE_INIT1_KEEP_ALIVE_ENABLE (0x1<<5) ++#define ISCSI_KWQE_INIT1_KEEP_ALIVE_ENABLE_SHIFT 5 ++#define ISCSI_KWQE_INIT1_RESERVED1 (0x3<<6) ++#define ISCSI_KWQE_INIT1_RESERVED1_SHIFT 6 ++ u16 cq_num_wqes; ++#elif defined(__LITTLE_ENDIAN) ++ u16 cq_num_wqes; ++ u8 flags; ++#define ISCSI_KWQE_INIT1_PAGE_SIZE (0xF<<0) ++#define ISCSI_KWQE_INIT1_PAGE_SIZE_SHIFT 0 ++#define ISCSI_KWQE_INIT1_DELAYED_ACK_ENABLE (0x1<<4) ++#define ISCSI_KWQE_INIT1_DELAYED_ACK_ENABLE_SHIFT 4 ++#define ISCSI_KWQE_INIT1_KEEP_ALIVE_ENABLE (0x1<<5) ++#define ISCSI_KWQE_INIT1_KEEP_ALIVE_ENABLE_SHIFT 5 ++#define ISCSI_KWQE_INIT1_RESERVED1 (0x3<<6) ++#define ISCSI_KWQE_INIT1_RESERVED1_SHIFT 6 ++ u8 cq_log_wqes_per_page; ++#endif ++#if defined(__BIG_ENDIAN) ++ u16 cq_num_pages; ++ u16 sq_num_pages; ++#elif defined(__LITTLE_ENDIAN) ++ u16 sq_num_pages; ++ u16 cq_num_pages; ++#endif ++#if defined(__BIG_ENDIAN) ++ u16 rq_buffer_size; ++ u16 rq_num_wqes; ++#elif defined(__LITTLE_ENDIAN) ++ u16 rq_num_wqes; ++ u16 rq_buffer_size; ++#endif ++}; ++ ++/* ++ * iSCSI firmware init request 2 ++ */ ++struct iscsi_kwqe_init2 { ++#if defined(__BIG_ENDIAN) ++ struct iscsi_kwqe_header hdr; ++ u16 max_cq_sqn; ++#elif defined(__LITTLE_ENDIAN) ++ u16 max_cq_sqn; ++ struct iscsi_kwqe_header hdr; ++#endif ++ u32 error_bit_map[2]; ++ u32 tcp_keepalive; ++ u32 reserved1[4]; ++}; ++ ++/* ++ * Initial iSCSI connection offload request 1 ++ */ ++struct iscsi_kwqe_conn_offload1 { ++#if defined(__BIG_ENDIAN) ++ struct iscsi_kwqe_header hdr; ++ u16 iscsi_conn_id; ++#elif defined(__LITTLE_ENDIAN) ++ u16 iscsi_conn_id; ++ struct iscsi_kwqe_header hdr; ++#endif ++ u32 sq_page_table_addr_lo; ++ u32 sq_page_table_addr_hi; ++ u32 cq_page_table_addr_lo; ++ u32 cq_page_table_addr_hi; ++ u32 reserved0[3]; ++}; ++ ++/* ++ * iSCSI Page Table Entry (PTE) ++ */ ++struct iscsi_pte { ++ u32 hi; ++ u32 lo; ++}; ++ ++/* ++ * Initial iSCSI connection offload request 2 ++ */ ++struct iscsi_kwqe_conn_offload2 { ++#if defined(__BIG_ENDIAN) ++ struct iscsi_kwqe_header hdr; ++ u16 reserved0; ++#elif defined(__LITTLE_ENDIAN) ++ u16 reserved0; ++ struct iscsi_kwqe_header hdr; ++#endif ++ u32 rq_page_table_addr_lo; ++ u32 rq_page_table_addr_hi; ++ struct iscsi_pte sq_first_pte; ++ struct iscsi_pte cq_first_pte; ++ u32 num_additional_wqes; ++}; ++ ++/* ++ * Everest specific - Initial iSCSI connection offload request 3 ++ */ ++struct iscsi_kwqe_conn_offload3 { ++#if defined(__BIG_ENDIAN) ++ struct iscsi_kwqe_header hdr; ++ u16 reserved0; ++#elif defined(__LITTLE_ENDIAN) ++ u16 reserved0; ++ struct iscsi_kwqe_header hdr; ++#endif ++ u32 reserved1; ++ struct iscsi_pte qp_first_pte[3]; ++}; ++ ++/* ++ * iSCSI connection update request ++ */ ++struct iscsi_kwqe_conn_update { ++#if defined(__BIG_ENDIAN) ++ struct iscsi_kwqe_header hdr; ++ u16 reserved0; ++#elif defined(__LITTLE_ENDIAN) ++ u16 reserved0; ++ struct iscsi_kwqe_header hdr; ++#endif ++#if defined(__BIG_ENDIAN) ++ u8 session_error_recovery_level; ++ u8 max_outstanding_r2ts; ++ u8 reserved2; ++ u8 conn_flags; ++#define ISCSI_KWQE_CONN_UPDATE_HEADER_DIGEST (0x1<<0) ++#define ISCSI_KWQE_CONN_UPDATE_HEADER_DIGEST_SHIFT 0 ++#define ISCSI_KWQE_CONN_UPDATE_DATA_DIGEST (0x1<<1) ++#define ISCSI_KWQE_CONN_UPDATE_DATA_DIGEST_SHIFT 1 ++#define ISCSI_KWQE_CONN_UPDATE_INITIAL_R2T (0x1<<2) ++#define ISCSI_KWQE_CONN_UPDATE_INITIAL_R2T_SHIFT 2 ++#define ISCSI_KWQE_CONN_UPDATE_IMMEDIATE_DATA (0x1<<3) ++#define ISCSI_KWQE_CONN_UPDATE_IMMEDIATE_DATA_SHIFT 3 ++#define ISCSI_KWQE_CONN_UPDATE_RESERVED1 (0xF<<4) ++#define ISCSI_KWQE_CONN_UPDATE_RESERVED1_SHIFT 4 ++#elif defined(__LITTLE_ENDIAN) ++ u8 conn_flags; ++#define ISCSI_KWQE_CONN_UPDATE_HEADER_DIGEST (0x1<<0) ++#define ISCSI_KWQE_CONN_UPDATE_HEADER_DIGEST_SHIFT 0 ++#define ISCSI_KWQE_CONN_UPDATE_DATA_DIGEST (0x1<<1) ++#define ISCSI_KWQE_CONN_UPDATE_DATA_DIGEST_SHIFT 1 ++#define ISCSI_KWQE_CONN_UPDATE_INITIAL_R2T (0x1<<2) ++#define ISCSI_KWQE_CONN_UPDATE_INITIAL_R2T_SHIFT 2 ++#define ISCSI_KWQE_CONN_UPDATE_IMMEDIATE_DATA (0x1<<3) ++#define ISCSI_KWQE_CONN_UPDATE_IMMEDIATE_DATA_SHIFT 3 ++#define ISCSI_KWQE_CONN_UPDATE_RESERVED1 (0xF<<4) ++#define ISCSI_KWQE_CONN_UPDATE_RESERVED1_SHIFT 4 ++ u8 reserved2; ++ u8 max_outstanding_r2ts; ++ u8 session_error_recovery_level; ++#endif ++ u32 context_id; ++ u32 max_send_pdu_length; ++ u32 max_recv_pdu_length; ++ u32 first_burst_length; ++ u32 max_burst_length; ++ u32 exp_stat_sn; ++}; ++ ++/* ++ * iSCSI destroy connection request ++ */ ++struct iscsi_kwqe_conn_destroy { ++#if defined(__BIG_ENDIAN) ++ struct iscsi_kwqe_header hdr; ++ u16 iscsi_conn_id; ++#elif defined(__LITTLE_ENDIAN) ++ u16 iscsi_conn_id; ++ struct iscsi_kwqe_header hdr; ++#endif ++ u32 context_id; ++ u32 reserved1[6]; ++}; ++ ++/* ++ * iSCSI KWQ WQE ++ */ ++union iscsi_kwqe { ++ struct iscsi_kwqe_init1 init1; ++ struct iscsi_kwqe_init2 init2; ++ struct iscsi_kwqe_conn_offload1 conn_offload1; ++ struct iscsi_kwqe_conn_offload2 conn_offload2; ++ struct iscsi_kwqe_conn_offload3 conn_offload3; ++ struct iscsi_kwqe_conn_update conn_update; ++ struct iscsi_kwqe_conn_destroy conn_destroy; ++}; ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++struct iscsi_rq_db { ++#if defined(__BIG_ENDIAN) ++ u16 reserved0; ++ u16 rq_prod; ++#elif defined(__LITTLE_ENDIAN) ++ u16 rq_prod; ++ u16 reserved0; ++#endif ++ u32 reserved1[3]; ++}; ++ ++ ++struct iscsi_sq_db { ++#if defined(__BIG_ENDIAN) ++ u16 reserved0; ++ u16 sq_prod; ++#elif defined(__LITTLE_ENDIAN) ++ u16 sq_prod; ++ u16 reserved0; ++#endif ++ u32 reserved1[3]; ++}; ++ ++ ++ ++/* ++ * SCSI read/write SQ WQE ++ */ ++struct iscsi_cmd_pdu_hdr_little_endian { ++#if defined(__BIG_ENDIAN) ++ u8 opcode; ++ u8 op_attr; ++#define ISCSI_CMD_PDU_HDR_LITTLE_ENDIAN_ATTRIBUTES (0x7<<0) ++#define ISCSI_CMD_PDU_HDR_LITTLE_ENDIAN_ATTRIBUTES_SHIFT 0 ++#define ISCSI_CMD_PDU_HDR_LITTLE_ENDIAN_RSRV1 (0x3<<3) ++#define ISCSI_CMD_PDU_HDR_LITTLE_ENDIAN_RSRV1_SHIFT 3 ++#define ISCSI_CMD_PDU_HDR_LITTLE_ENDIAN_WRITE_FLAG (0x1<<5) ++#define ISCSI_CMD_PDU_HDR_LITTLE_ENDIAN_WRITE_FLAG_SHIFT 5 ++#define ISCSI_CMD_PDU_HDR_LITTLE_ENDIAN_READ_FLAG (0x1<<6) ++#define ISCSI_CMD_PDU_HDR_LITTLE_ENDIAN_READ_FLAG_SHIFT 6 ++#define ISCSI_CMD_PDU_HDR_LITTLE_ENDIAN_FINAL_FLAG (0x1<<7) ++#define ISCSI_CMD_PDU_HDR_LITTLE_ENDIAN_FINAL_FLAG_SHIFT 7 ++ u16 rsrv0; ++#elif defined(__LITTLE_ENDIAN) ++ u16 rsrv0; ++ u8 op_attr; ++#define ISCSI_CMD_PDU_HDR_LITTLE_ENDIAN_ATTRIBUTES (0x7<<0) ++#define ISCSI_CMD_PDU_HDR_LITTLE_ENDIAN_ATTRIBUTES_SHIFT 0 ++#define ISCSI_CMD_PDU_HDR_LITTLE_ENDIAN_RSRV1 (0x3<<3) ++#define ISCSI_CMD_PDU_HDR_LITTLE_ENDIAN_RSRV1_SHIFT 3 ++#define ISCSI_CMD_PDU_HDR_LITTLE_ENDIAN_WRITE_FLAG (0x1<<5) ++#define ISCSI_CMD_PDU_HDR_LITTLE_ENDIAN_WRITE_FLAG_SHIFT 5 ++#define ISCSI_CMD_PDU_HDR_LITTLE_ENDIAN_READ_FLAG (0x1<<6) ++#define ISCSI_CMD_PDU_HDR_LITTLE_ENDIAN_READ_FLAG_SHIFT 6 ++#define ISCSI_CMD_PDU_HDR_LITTLE_ENDIAN_FINAL_FLAG (0x1<<7) ++#define ISCSI_CMD_PDU_HDR_LITTLE_ENDIAN_FINAL_FLAG_SHIFT 7 ++ u8 opcode; ++#endif ++ u32 data_fields; ++#define ISCSI_CMD_PDU_HDR_LITTLE_ENDIAN_DATA_SEGMENT_LENGTH (0xFFFFFF<<0) ++#define ISCSI_CMD_PDU_HDR_LITTLE_ENDIAN_DATA_SEGMENT_LENGTH_SHIFT 0 ++#define ISCSI_CMD_PDU_HDR_LITTLE_ENDIAN_TOTAL_AHS_LENGTH (0xFF<<24) ++#define ISCSI_CMD_PDU_HDR_LITTLE_ENDIAN_TOTAL_AHS_LENGTH_SHIFT 24 ++ struct regpair lun; ++ u32 itt; ++ u32 expected_data_transfer_length; ++ u32 cmd_sn; ++ u32 exp_stat_sn; ++ u32 scsi_command_block[4]; ++}; ++ ++ ++/* ++ * Buffer per connection, used in Tstorm ++ */ ++struct iscsi_conn_buf { ++ struct regpair reserved[8]; ++}; ++ ++ ++/* ++ * PDU header of an iSCSI DATA-OUT ++ */ ++struct iscsi_data_pdu_hdr_little_endian { ++#if defined(__BIG_ENDIAN) ++ u8 opcode; ++ u8 op_attr; ++#define ISCSI_DATA_PDU_HDR_LITTLE_ENDIAN_RSRV1 (0x7F<<0) ++#define ISCSI_DATA_PDU_HDR_LITTLE_ENDIAN_RSRV1_SHIFT 0 ++#define ISCSI_DATA_PDU_HDR_LITTLE_ENDIAN_FINAL_FLAG (0x1<<7) ++#define ISCSI_DATA_PDU_HDR_LITTLE_ENDIAN_FINAL_FLAG_SHIFT 7 ++ u16 rsrv0; ++#elif defined(__LITTLE_ENDIAN) ++ u16 rsrv0; ++ u8 op_attr; ++#define ISCSI_DATA_PDU_HDR_LITTLE_ENDIAN_RSRV1 (0x7F<<0) ++#define ISCSI_DATA_PDU_HDR_LITTLE_ENDIAN_RSRV1_SHIFT 0 ++#define ISCSI_DATA_PDU_HDR_LITTLE_ENDIAN_FINAL_FLAG (0x1<<7) ++#define ISCSI_DATA_PDU_HDR_LITTLE_ENDIAN_FINAL_FLAG_SHIFT 7 ++ u8 opcode; ++#endif ++ u32 data_fields; ++#define ISCSI_DATA_PDU_HDR_LITTLE_ENDIAN_DATA_SEGMENT_LENGTH (0xFFFFFF<<0) ++#define ISCSI_DATA_PDU_HDR_LITTLE_ENDIAN_DATA_SEGMENT_LENGTH_SHIFT 0 ++#define ISCSI_DATA_PDU_HDR_LITTLE_ENDIAN_TOTAL_AHS_LENGTH (0xFF<<24) ++#define ISCSI_DATA_PDU_HDR_LITTLE_ENDIAN_TOTAL_AHS_LENGTH_SHIFT 24 ++ struct regpair lun; ++ u32 itt; ++ u32 ttt; ++ u32 rsrv2; ++ u32 exp_stat_sn; ++ u32 rsrv3; ++ u32 data_sn; ++ u32 buffer_offset; ++ u32 rsrv4; ++}; ++ ++ ++/* ++ * PDU header of an iSCSI login request ++ */ ++struct iscsi_login_req_hdr_little_endian { ++#if defined(__BIG_ENDIAN) ++ u8 opcode; ++ u8 op_attr; ++#define ISCSI_LOGIN_REQ_HDR_LITTLE_ENDIAN_NSG (0x3<<0) ++#define ISCSI_LOGIN_REQ_HDR_LITTLE_ENDIAN_NSG_SHIFT 0 ++#define ISCSI_LOGIN_REQ_HDR_LITTLE_ENDIAN_CSG (0x3<<2) ++#define ISCSI_LOGIN_REQ_HDR_LITTLE_ENDIAN_CSG_SHIFT 2 ++#define ISCSI_LOGIN_REQ_HDR_LITTLE_ENDIAN_RSRV0 (0x3<<4) ++#define ISCSI_LOGIN_REQ_HDR_LITTLE_ENDIAN_RSRV0_SHIFT 4 ++#define ISCSI_LOGIN_REQ_HDR_LITTLE_ENDIAN_CONTINUE_FLG (0x1<<6) ++#define ISCSI_LOGIN_REQ_HDR_LITTLE_ENDIAN_CONTINUE_FLG_SHIFT 6 ++#define ISCSI_LOGIN_REQ_HDR_LITTLE_ENDIAN_TRANSIT (0x1<<7) ++#define ISCSI_LOGIN_REQ_HDR_LITTLE_ENDIAN_TRANSIT_SHIFT 7 ++ u8 version_max; ++ u8 version_min; ++#elif defined(__LITTLE_ENDIAN) ++ u8 version_min; ++ u8 version_max; ++ u8 op_attr; ++#define ISCSI_LOGIN_REQ_HDR_LITTLE_ENDIAN_NSG (0x3<<0) ++#define ISCSI_LOGIN_REQ_HDR_LITTLE_ENDIAN_NSG_SHIFT 0 ++#define ISCSI_LOGIN_REQ_HDR_LITTLE_ENDIAN_CSG (0x3<<2) ++#define ISCSI_LOGIN_REQ_HDR_LITTLE_ENDIAN_CSG_SHIFT 2 ++#define ISCSI_LOGIN_REQ_HDR_LITTLE_ENDIAN_RSRV0 (0x3<<4) ++#define ISCSI_LOGIN_REQ_HDR_LITTLE_ENDIAN_RSRV0_SHIFT 4 ++#define ISCSI_LOGIN_REQ_HDR_LITTLE_ENDIAN_CONTINUE_FLG (0x1<<6) ++#define ISCSI_LOGIN_REQ_HDR_LITTLE_ENDIAN_CONTINUE_FLG_SHIFT 6 ++#define ISCSI_LOGIN_REQ_HDR_LITTLE_ENDIAN_TRANSIT (0x1<<7) ++#define ISCSI_LOGIN_REQ_HDR_LITTLE_ENDIAN_TRANSIT_SHIFT 7 ++ u8 opcode; ++#endif ++ u32 data_fields; ++#define ISCSI_LOGIN_REQ_HDR_LITTLE_ENDIAN_DATA_SEGMENT_LENGTH (0xFFFFFF<<0) ++#define ISCSI_LOGIN_REQ_HDR_LITTLE_ENDIAN_DATA_SEGMENT_LENGTH_SHIFT 0 ++#define ISCSI_LOGIN_REQ_HDR_LITTLE_ENDIAN_TOTAL_AHS_LENGTH (0xFF<<24) ++#define ISCSI_LOGIN_REQ_HDR_LITTLE_ENDIAN_TOTAL_AHS_LENGTH_SHIFT 24 ++ u32 isid_lo; ++#if defined(__BIG_ENDIAN) ++ u16 isid_hi; ++ u16 tsih; ++#elif defined(__LITTLE_ENDIAN) ++ u16 tsih; ++ u16 isid_hi; ++#endif ++ u32 itt; ++#if defined(__BIG_ENDIAN) ++ u16 cid; ++ u16 rsrv1; ++#elif defined(__LITTLE_ENDIAN) ++ u16 rsrv1; ++ u16 cid; ++#endif ++ u32 cmd_sn; ++ u32 exp_stat_sn; ++ u32 rsrv2[4]; ++}; ++ ++/* ++ * PDU header of an iSCSI logout request ++ */ ++struct iscsi_logout_req_hdr_little_endian { ++#if defined(__BIG_ENDIAN) ++ u8 opcode; ++ u8 op_attr; ++#define ISCSI_LOGOUT_REQ_HDR_LITTLE_ENDIAN_REASON_CODE (0x7F<<0) ++#define ISCSI_LOGOUT_REQ_HDR_LITTLE_ENDIAN_REASON_CODE_SHIFT 0 ++#define ISCSI_LOGOUT_REQ_HDR_LITTLE_ENDIAN_RSRV1_1 (0x1<<7) ++#define ISCSI_LOGOUT_REQ_HDR_LITTLE_ENDIAN_RSRV1_1_SHIFT 7 ++ u16 rsrv0; ++#elif defined(__LITTLE_ENDIAN) ++ u16 rsrv0; ++ u8 op_attr; ++#define ISCSI_LOGOUT_REQ_HDR_LITTLE_ENDIAN_REASON_CODE (0x7F<<0) ++#define ISCSI_LOGOUT_REQ_HDR_LITTLE_ENDIAN_REASON_CODE_SHIFT 0 ++#define ISCSI_LOGOUT_REQ_HDR_LITTLE_ENDIAN_RSRV1_1 (0x1<<7) ++#define ISCSI_LOGOUT_REQ_HDR_LITTLE_ENDIAN_RSRV1_1_SHIFT 7 ++ u8 opcode; ++#endif ++ u32 data_fields; ++#define ISCSI_LOGOUT_REQ_HDR_LITTLE_ENDIAN_DATA_SEGMENT_LENGTH (0xFFFFFF<<0) ++#define ISCSI_LOGOUT_REQ_HDR_LITTLE_ENDIAN_DATA_SEGMENT_LENGTH_SHIFT 0 ++#define ISCSI_LOGOUT_REQ_HDR_LITTLE_ENDIAN_TOTAL_AHS_LENGTH (0xFF<<24) ++#define ISCSI_LOGOUT_REQ_HDR_LITTLE_ENDIAN_TOTAL_AHS_LENGTH_SHIFT 24 ++ u32 rsrv2[2]; ++ u32 itt; ++#if defined(__BIG_ENDIAN) ++ u16 cid; ++ u16 rsrv1; ++#elif defined(__LITTLE_ENDIAN) ++ u16 rsrv1; ++ u16 cid; ++#endif ++ u32 cmd_sn; ++ u32 exp_stat_sn; ++ u32 rsrv3[4]; ++}; ++ ++/* ++ * PDU header of an iSCSI TMF request ++ */ ++struct iscsi_tmf_req_hdr_little_endian { ++#if defined(__BIG_ENDIAN) ++ u8 opcode; ++ u8 op_attr; ++#define ISCSI_TMF_REQ_HDR_LITTLE_ENDIAN_FUNCTION (0x7F<<0) ++#define ISCSI_TMF_REQ_HDR_LITTLE_ENDIAN_FUNCTION_SHIFT 0 ++#define ISCSI_TMF_REQ_HDR_LITTLE_ENDIAN_RSRV1_1 (0x1<<7) ++#define ISCSI_TMF_REQ_HDR_LITTLE_ENDIAN_RSRV1_1_SHIFT 7 ++ u16 rsrv0; ++#elif defined(__LITTLE_ENDIAN) ++ u16 rsrv0; ++ u8 op_attr; ++#define ISCSI_TMF_REQ_HDR_LITTLE_ENDIAN_FUNCTION (0x7F<<0) ++#define ISCSI_TMF_REQ_HDR_LITTLE_ENDIAN_FUNCTION_SHIFT 0 ++#define ISCSI_TMF_REQ_HDR_LITTLE_ENDIAN_RSRV1_1 (0x1<<7) ++#define ISCSI_TMF_REQ_HDR_LITTLE_ENDIAN_RSRV1_1_SHIFT 7 ++ u8 opcode; ++#endif ++ u32 data_fields; ++#define ISCSI_TMF_REQ_HDR_LITTLE_ENDIAN_DATA_SEGMENT_LENGTH (0xFFFFFF<<0) ++#define ISCSI_TMF_REQ_HDR_LITTLE_ENDIAN_DATA_SEGMENT_LENGTH_SHIFT 0 ++#define ISCSI_TMF_REQ_HDR_LITTLE_ENDIAN_TOTAL_AHS_LENGTH (0xFF<<24) ++#define ISCSI_TMF_REQ_HDR_LITTLE_ENDIAN_TOTAL_AHS_LENGTH_SHIFT 24 ++ struct regpair lun; ++ u32 itt; ++ u32 referenced_task_tag; ++ u32 cmd_sn; ++ u32 exp_stat_sn; ++ u32 ref_cmd_sn; ++ u32 exp_data_sn; ++ u32 rsrv2[2]; ++}; ++ ++/* ++ * PDU header of an iSCSI Text request ++ */ ++struct iscsi_text_req_hdr_little_endian { ++#if defined(__BIG_ENDIAN) ++ u8 opcode; ++ u8 op_attr; ++#define ISCSI_TEXT_REQ_HDR_LITTLE_ENDIAN_RSRV1 (0x3F<<0) ++#define ISCSI_TEXT_REQ_HDR_LITTLE_ENDIAN_RSRV1_SHIFT 0 ++#define ISCSI_TEXT_REQ_HDR_LITTLE_ENDIAN_CONTINUE_FLG (0x1<<6) ++#define ISCSI_TEXT_REQ_HDR_LITTLE_ENDIAN_CONTINUE_FLG_SHIFT 6 ++#define ISCSI_TEXT_REQ_HDR_LITTLE_ENDIAN_FINAL (0x1<<7) ++#define ISCSI_TEXT_REQ_HDR_LITTLE_ENDIAN_FINAL_SHIFT 7 ++ u16 rsrv0; ++#elif defined(__LITTLE_ENDIAN) ++ u16 rsrv0; ++ u8 op_attr; ++#define ISCSI_TEXT_REQ_HDR_LITTLE_ENDIAN_RSRV1 (0x3F<<0) ++#define ISCSI_TEXT_REQ_HDR_LITTLE_ENDIAN_RSRV1_SHIFT 0 ++#define ISCSI_TEXT_REQ_HDR_LITTLE_ENDIAN_CONTINUE_FLG (0x1<<6) ++#define ISCSI_TEXT_REQ_HDR_LITTLE_ENDIAN_CONTINUE_FLG_SHIFT 6 ++#define ISCSI_TEXT_REQ_HDR_LITTLE_ENDIAN_FINAL (0x1<<7) ++#define ISCSI_TEXT_REQ_HDR_LITTLE_ENDIAN_FINAL_SHIFT 7 ++ u8 opcode; ++#endif ++ u32 data_fields; ++#define ISCSI_TEXT_REQ_HDR_LITTLE_ENDIAN_DATA_SEGMENT_LENGTH (0xFFFFFF<<0) ++#define ISCSI_TEXT_REQ_HDR_LITTLE_ENDIAN_DATA_SEGMENT_LENGTH_SHIFT 0 ++#define ISCSI_TEXT_REQ_HDR_LITTLE_ENDIAN_TOTAL_AHS_LENGTH (0xFF<<24) ++#define ISCSI_TEXT_REQ_HDR_LITTLE_ENDIAN_TOTAL_AHS_LENGTH_SHIFT 24 ++ struct regpair lun; ++ u32 itt; ++ u32 ttt; ++ u32 cmd_sn; ++ u32 exp_stat_sn; ++ u32 rsrv3[4]; ++}; ++ ++/* ++ * PDU header of an iSCSI Nop-Out ++ */ ++struct iscsi_nop_out_hdr_little_endian { ++#if defined(__BIG_ENDIAN) ++ u8 opcode; ++ u8 op_attr; ++#define ISCSI_NOP_OUT_HDR_LITTLE_ENDIAN_RSRV1 (0x7F<<0) ++#define ISCSI_NOP_OUT_HDR_LITTLE_ENDIAN_RSRV1_SHIFT 0 ++#define ISCSI_NOP_OUT_HDR_LITTLE_ENDIAN_RSRV2_1 (0x1<<7) ++#define ISCSI_NOP_OUT_HDR_LITTLE_ENDIAN_RSRV2_1_SHIFT 7 ++ u16 rsrv0; ++#elif defined(__LITTLE_ENDIAN) ++ u16 rsrv0; ++ u8 op_attr; ++#define ISCSI_NOP_OUT_HDR_LITTLE_ENDIAN_RSRV1 (0x7F<<0) ++#define ISCSI_NOP_OUT_HDR_LITTLE_ENDIAN_RSRV1_SHIFT 0 ++#define ISCSI_NOP_OUT_HDR_LITTLE_ENDIAN_RSRV2_1 (0x1<<7) ++#define ISCSI_NOP_OUT_HDR_LITTLE_ENDIAN_RSRV2_1_SHIFT 7 ++ u8 opcode; ++#endif ++ u32 data_fields; ++#define ISCSI_NOP_OUT_HDR_LITTLE_ENDIAN_DATA_SEGMENT_LENGTH (0xFFFFFF<<0) ++#define ISCSI_NOP_OUT_HDR_LITTLE_ENDIAN_DATA_SEGMENT_LENGTH_SHIFT 0 ++#define ISCSI_NOP_OUT_HDR_LITTLE_ENDIAN_TOTAL_AHS_LENGTH (0xFF<<24) ++#define ISCSI_NOP_OUT_HDR_LITTLE_ENDIAN_TOTAL_AHS_LENGTH_SHIFT 24 ++ struct regpair lun; ++ u32 itt; ++ u32 ttt; ++ u32 cmd_sn; ++ u32 exp_stat_sn; ++ u32 rsrv3[4]; ++}; ++ ++/* ++ * iscsi pdu headers in little endian form. ++ */ ++union iscsi_pdu_headers_little_endian { ++ u32 fullHeaderSize[12]; ++ struct iscsi_cmd_pdu_hdr_little_endian command_pdu_hdr; ++ struct iscsi_data_pdu_hdr_little_endian data_out_pdu_hdr; ++ struct iscsi_login_req_hdr_little_endian login_req_pdu_hdr; ++ struct iscsi_logout_req_hdr_little_endian logout_req_pdu_hdr; ++ struct iscsi_tmf_req_hdr_little_endian tmf_req_pdu_hdr; ++ struct iscsi_text_req_hdr_little_endian text_req_pdu_hdr; ++ struct iscsi_nop_out_hdr_little_endian nop_out_pdu_hdr; ++}; ++ ++struct iscsi_hq_bd { ++ union iscsi_pdu_headers_little_endian pdu_header; ++#if defined(__BIG_ENDIAN) ++ u16 reserved1; ++ u16 lcl_cmp_flg; ++#elif defined(__LITTLE_ENDIAN) ++ u16 lcl_cmp_flg; ++ u16 reserved1; ++#endif ++ u32 sgl_base_lo; ++ u32 sgl_base_hi; ++#if defined(__BIG_ENDIAN) ++ u8 sgl_size; ++ u8 sge_index; ++ u16 sge_offset; ++#elif defined(__LITTLE_ENDIAN) ++ u16 sge_offset; ++ u8 sge_index; ++ u8 sgl_size; ++#endif ++}; ++ ++ ++ ++ ++ ++ ++struct iscsi_task_context_entry_xuc_c_write_only { ++ u32 total_data_acked; ++}; ++ ++struct iscsi_task_context_r2t_table_entry { ++ u32 ttt; ++ u32 desired_data_len; ++}; ++ ++struct iscsi_task_context_entry_xuc_u_write_only { ++ u32 exp_r2t_sn; ++ struct iscsi_task_context_r2t_table_entry r2t_table[4]; ++#if defined(__BIG_ENDIAN) ++ u16 data_in_count; ++ u8 cq_id; ++ u8 valid_1b; ++#elif defined(__LITTLE_ENDIAN) ++ u8 valid_1b; ++ u8 cq_id; ++ u16 data_in_count; ++#endif ++}; ++ ++struct iscsi_task_context_entry_xuc { ++ struct iscsi_task_context_entry_xuc_c_write_only write_c; ++ u32 exp_data_transfer_len; ++ struct iscsi_task_context_entry_xuc_x_write_only write_x; ++ u32 lun_lo; ++ struct iscsi_task_context_entry_xuc_xu_write_both write_xu; ++ u32 lun_hi; ++ struct iscsi_task_context_entry_xuc_u_write_only write_u; ++}; ++ ++struct iscsi_task_context_entry_u { ++ u32 exp_r2t_buff_offset; ++ u32 rem_rcv_len; ++ u32 exp_data_sn; ++}; ++ ++struct iscsi_task_context_entry { ++ struct iscsi_task_context_entry_x tce_x; ++#if defined(__BIG_ENDIAN) ++ u16 data_out_count; ++ u16 rsrv0; ++#elif defined(__LITTLE_ENDIAN) ++ u16 rsrv0; ++ u16 data_out_count; ++#endif ++ struct iscsi_task_context_entry_xuc tce_xuc; ++ struct iscsi_task_context_entry_u tce_u; ++ u32 rsrv1[7]; ++}; ++ ++ ++ ++ ++ ++ ++ ++ ++struct iscsi_task_context_entry_xuc_x_init_only { ++ struct regpair lun; ++ u32 exp_data_transfer_len; ++}; ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++/* ++ * ipv6 structure ++ */ ++struct ip_v6_addr { ++ u32 ip_addr_lo_lo; ++ u32 ip_addr_lo_hi; ++ u32 ip_addr_hi_lo; ++ u32 ip_addr_hi_hi; ++}; ++ ++ ++ ++/* ++ * l5cm- connection identification params ++ */ ++struct l5cm_conn_addr_params { ++ u32 pmtu; ++#if defined(__BIG_ENDIAN) ++ u8 remote_addr_3; ++ u8 remote_addr_2; ++ u8 remote_addr_1; ++ u8 remote_addr_0; ++#elif defined(__LITTLE_ENDIAN) ++ u8 remote_addr_0; ++ u8 remote_addr_1; ++ u8 remote_addr_2; ++ u8 remote_addr_3; ++#endif ++#if defined(__BIG_ENDIAN) ++ u16 params; ++#define L5CM_CONN_ADDR_PARAMS_IP_VERSION (0x1<<0) ++#define L5CM_CONN_ADDR_PARAMS_IP_VERSION_SHIFT 0 ++#define L5CM_CONN_ADDR_PARAMS_RSRV (0x7FFF<<1) ++#define L5CM_CONN_ADDR_PARAMS_RSRV_SHIFT 1 ++ u8 remote_addr_5; ++ u8 remote_addr_4; ++#elif defined(__LITTLE_ENDIAN) ++ u8 remote_addr_4; ++ u8 remote_addr_5; ++ u16 params; ++#define L5CM_CONN_ADDR_PARAMS_IP_VERSION (0x1<<0) ++#define L5CM_CONN_ADDR_PARAMS_IP_VERSION_SHIFT 0 ++#define L5CM_CONN_ADDR_PARAMS_RSRV (0x7FFF<<1) ++#define L5CM_CONN_ADDR_PARAMS_RSRV_SHIFT 1 ++#endif ++ struct ip_v6_addr local_ip_addr; ++ struct ip_v6_addr remote_ip_addr; ++ u32 ipv6_flow_label_20b; ++ u32 reserved1; ++#if defined(__BIG_ENDIAN) ++ u16 remote_tcp_port; ++ u16 local_tcp_port; ++#elif defined(__LITTLE_ENDIAN) ++ u16 local_tcp_port; ++ u16 remote_tcp_port; ++#endif ++}; ++ ++/* ++ * l5cm-xstorm connection buffer ++ */ ++struct l5cm_xstorm_conn_buffer { ++#if defined(__BIG_ENDIAN) ++ u16 rsrv1; ++ u16 params; ++#define L5CM_XSTORM_CONN_BUFFER_NAGLE_ENABLE (0x1<<0) ++#define L5CM_XSTORM_CONN_BUFFER_NAGLE_ENABLE_SHIFT 0 ++#define L5CM_XSTORM_CONN_BUFFER_RSRV (0x7FFF<<1) ++#define L5CM_XSTORM_CONN_BUFFER_RSRV_SHIFT 1 ++#elif defined(__LITTLE_ENDIAN) ++ u16 params; ++#define L5CM_XSTORM_CONN_BUFFER_NAGLE_ENABLE (0x1<<0) ++#define L5CM_XSTORM_CONN_BUFFER_NAGLE_ENABLE_SHIFT 0 ++#define L5CM_XSTORM_CONN_BUFFER_RSRV (0x7FFF<<1) ++#define L5CM_XSTORM_CONN_BUFFER_RSRV_SHIFT 1 ++ u16 rsrv1; ++#endif ++#if defined(__BIG_ENDIAN) ++ u16 mss; ++ u16 pseudo_header_checksum; ++#elif defined(__LITTLE_ENDIAN) ++ u16 pseudo_header_checksum; ++ u16 mss; ++#endif ++ u32 rcv_buf; ++ u32 rsrv2; ++ struct regpair context_addr; ++}; ++ ++/* ++ * l5cm-tstorm connection buffer ++ */ ++struct l5cm_tstorm_conn_buffer { ++ u32 snd_buf; ++ u32 rcv_buf; ++#if defined(__BIG_ENDIAN) ++ u16 params; ++#define L5CM_TSTORM_CONN_BUFFER_DELAYED_ACK_ENABLE (0x1<<0) ++#define L5CM_TSTORM_CONN_BUFFER_DELAYED_ACK_ENABLE_SHIFT 0 ++#define L5CM_TSTORM_CONN_BUFFER_RSRV (0x7FFF<<1) ++#define L5CM_TSTORM_CONN_BUFFER_RSRV_SHIFT 1 ++ u8 ka_max_probe_count; ++ u8 ka_enable; ++#elif defined(__LITTLE_ENDIAN) ++ u8 ka_enable; ++ u8 ka_max_probe_count; ++ u16 params; ++#define L5CM_TSTORM_CONN_BUFFER_DELAYED_ACK_ENABLE (0x1<<0) ++#define L5CM_TSTORM_CONN_BUFFER_DELAYED_ACK_ENABLE_SHIFT 0 ++#define L5CM_TSTORM_CONN_BUFFER_RSRV (0x7FFF<<1) ++#define L5CM_TSTORM_CONN_BUFFER_RSRV_SHIFT 1 ++#endif ++ u32 ka_timeout; ++ u32 ka_interval; ++ u32 max_rt_time; ++}; ++ ++/* ++ * l5cm connection buffer for active side ++ */ ++struct l5cm_active_conn_buffer { ++ struct l5cm_conn_addr_params conn_addr_buf; ++ struct l5cm_xstorm_conn_buffer xstorm_conn_buffer; ++ struct l5cm_tstorm_conn_buffer tstorm_conn_buffer; ++}; ++ ++ ++ ++/* ++ * The l5cm opaque buffer passed in add new connection ramrod passive side ++ */ ++struct l5cm_hash_input_string { ++ u32 seed; ++#if defined(__BIG_ENDIAN) ++ u16 remote_tcp_port; ++ u16 local_tcp_port; ++#elif defined(__LITTLE_ENDIAN) ++ u16 local_tcp_port; ++ u16 remote_tcp_port; ++#endif ++ struct ip_v6_addr local_ip_addr; ++ struct ip_v6_addr remote_ip_addr; ++ u32 remote_isn; ++ u32 zero_padded[5]; ++}; ++ ++ ++/* ++ * syn cookie component ++ */ ++struct l5cm_syn_cookie_comp { ++ u32 syn_cookie_chip_comp; ++#define L5CM_SYN_COOKIE_COMP_SEED_INDEX (0x7<<0) ++#define L5CM_SYN_COOKIE_COMP_SEED_INDEX_SHIFT 0 ++#define L5CM_SYN_COOKIE_COMP_RX_MSS_INDEX (0x7<<3) ++#define L5CM_SYN_COOKIE_COMP_RX_MSS_INDEX_SHIFT 3 ++#define L5CM_SYN_COOKIE_COMP_RX_WND_SCL_EN (0x1<<6) ++#define L5CM_SYN_COOKIE_COMP_RX_WND_SCL_EN_SHIFT 6 ++#define L5CM_SYN_COOKIE_COMP_RX_TS_EN (0x1<<7) ++#define L5CM_SYN_COOKIE_COMP_RX_TS_EN_SHIFT 7 ++#define L5CM_SYN_COOKIE_COMP_RX_WND_SCALE (0xF<<8) ++#define L5CM_SYN_COOKIE_COMP_RX_WND_SCALE_SHIFT 8 ++#define L5CM_SYN_COOKIE_COMP_DO_NOT_USE (0xF<<12) ++#define L5CM_SYN_COOKIE_COMP_DO_NOT_USE_SHIFT 12 ++#define L5CM_SYN_COOKIE_COMP_DO_NOT_USE1 (0xFFFF<<16) ++#define L5CM_SYN_COOKIE_COMP_DO_NOT_USE1_SHIFT 16 ++}; ++ ++/* ++ * data related to listeners of a TCP port ++ */ ++struct l5cm_port_listener_data { ++ u8 params; ++#define L5CM_PORT_LISTENER_DATA_ENABLE (0x1<<0) ++#define L5CM_PORT_LISTENER_DATA_ENABLE_SHIFT 0 ++#define L5CM_PORT_LISTENER_DATA_IP_INDEX (0xF<<1) ++#define L5CM_PORT_LISTENER_DATA_IP_INDEX_SHIFT 1 ++#define L5CM_PORT_LISTENER_DATA_NET_FILTER (0x1<<5) ++#define L5CM_PORT_LISTENER_DATA_NET_FILTER_SHIFT 5 ++#define L5CM_PORT_LISTENER_DATA_DEFFERED_MODE (0x1<<6) ++#define L5CM_PORT_LISTENER_DATA_DEFFERED_MODE_SHIFT 6 ++#define L5CM_PORT_LISTENER_DATA_MPA_MODE (0x1<<7) ++#define L5CM_PORT_LISTENER_DATA_MPA_MODE_SHIFT 7 ++}; ++ ++/* ++ * Opaque structure passed from U to X when final ack arrives ++ */ ++struct l5cm_opaque_buf { ++ u32 rcv_nxt; ++ u32 snd_nxt; ++ u32 ts_to_echo; ++ u32 snd_wnd; ++ struct l5cm_syn_cookie_comp syn_cookie; ++#if defined(__BIG_ENDIAN) ++ u16 rsrv2; ++ u8 rsrv; ++ struct l5cm_port_listener_data listener_data; ++#elif defined(__LITTLE_ENDIAN) ++ struct l5cm_port_listener_data listener_data; ++ u8 rsrv; ++ u16 rsrv2; ++#endif ++}; ++ ++ ++/* ++ * l5cm slow path element ++ */ ++struct l5cm_packet_size { ++ u32 size; ++ u32 rsrv; ++}; ++ ++ ++/* ++ * The final-ack union structure in PCS entry after final ack arrived ++ */ ++struct l5cm_pcse_ack { ++ struct l5cm_xstorm_conn_buffer tx_socket_params; ++ struct l5cm_opaque_buf opaque_buf; ++ struct l5cm_tstorm_conn_buffer rx_socket_params; ++}; ++ ++ ++/* ++ * The syn union structure in PCS entry after syn arrived ++ */ ++struct l5cm_pcse_syn { ++ struct l5cm_opaque_buf opaque_buf; ++ u32 rsrv[12]; ++}; ++ ++ ++/* ++ * pcs entry data for passive connections ++ */ ++struct l5cm_pcs_attributes { ++#if defined(__BIG_ENDIAN) ++ u16 pcs_id; ++ u8 status; ++ u8 flags; ++#define L5CM_PCS_ATTRIBUTES_NET_FILTER (0x1<<0) ++#define L5CM_PCS_ATTRIBUTES_NET_FILTER_SHIFT 0 ++#define L5CM_PCS_ATTRIBUTES_CALCULATE_HASH (0x1<<1) ++#define L5CM_PCS_ATTRIBUTES_CALCULATE_HASH_SHIFT 1 ++#define L5CM_PCS_ATTRIBUTES_COMPARE_HASH_RESULT (0x1<<2) ++#define L5CM_PCS_ATTRIBUTES_COMPARE_HASH_RESULT_SHIFT 2 ++#define L5CM_PCS_ATTRIBUTES_QUERY_ULP_ACCEPT (0x1<<3) ++#define L5CM_PCS_ATTRIBUTES_QUERY_ULP_ACCEPT_SHIFT 3 ++#define L5CM_PCS_ATTRIBUTES_FIND_DEST_MAC (0x1<<4) ++#define L5CM_PCS_ATTRIBUTES_FIND_DEST_MAC_SHIFT 4 ++#define L5CM_PCS_ATTRIBUTES_L4_OFFLOAD (0x1<<5) ++#define L5CM_PCS_ATTRIBUTES_L4_OFFLOAD_SHIFT 5 ++#define L5CM_PCS_ATTRIBUTES_FORWARD_PACKET (0x1<<6) ++#define L5CM_PCS_ATTRIBUTES_FORWARD_PACKET_SHIFT 6 ++#define L5CM_PCS_ATTRIBUTES_RSRV (0x1<<7) ++#define L5CM_PCS_ATTRIBUTES_RSRV_SHIFT 7 ++#elif defined(__LITTLE_ENDIAN) ++ u8 flags; ++#define L5CM_PCS_ATTRIBUTES_NET_FILTER (0x1<<0) ++#define L5CM_PCS_ATTRIBUTES_NET_FILTER_SHIFT 0 ++#define L5CM_PCS_ATTRIBUTES_CALCULATE_HASH (0x1<<1) ++#define L5CM_PCS_ATTRIBUTES_CALCULATE_HASH_SHIFT 1 ++#define L5CM_PCS_ATTRIBUTES_COMPARE_HASH_RESULT (0x1<<2) ++#define L5CM_PCS_ATTRIBUTES_COMPARE_HASH_RESULT_SHIFT 2 ++#define L5CM_PCS_ATTRIBUTES_QUERY_ULP_ACCEPT (0x1<<3) ++#define L5CM_PCS_ATTRIBUTES_QUERY_ULP_ACCEPT_SHIFT 3 ++#define L5CM_PCS_ATTRIBUTES_FIND_DEST_MAC (0x1<<4) ++#define L5CM_PCS_ATTRIBUTES_FIND_DEST_MAC_SHIFT 4 ++#define L5CM_PCS_ATTRIBUTES_L4_OFFLOAD (0x1<<5) ++#define L5CM_PCS_ATTRIBUTES_L4_OFFLOAD_SHIFT 5 ++#define L5CM_PCS_ATTRIBUTES_FORWARD_PACKET (0x1<<6) ++#define L5CM_PCS_ATTRIBUTES_FORWARD_PACKET_SHIFT 6 ++#define L5CM_PCS_ATTRIBUTES_RSRV (0x1<<7) ++#define L5CM_PCS_ATTRIBUTES_RSRV_SHIFT 7 ++ u8 status; ++ u16 pcs_id; ++#endif ++}; ++ ++ ++union l5cm_seg_params { ++ struct l5cm_pcse_syn syn_seg_params; ++ struct l5cm_pcse_ack ack_seg_params; ++}; ++ ++/* ++ * pcs entry data for passive connections ++ */ ++struct l5cm_pcs_hdr { ++ struct l5cm_hash_input_string hash_input_string; ++ struct l5cm_conn_addr_params conn_addr_buf; ++ u32 cid; ++ u32 hash_result; ++ union l5cm_seg_params seg_params; ++ struct l5cm_pcs_attributes att; ++#if defined(__BIG_ENDIAN) ++ u16 rsrv; ++ u16 rx_seg_size; ++#elif defined(__LITTLE_ENDIAN) ++ u16 rx_seg_size; ++ u16 rsrv; ++#endif ++}; ++ ++/* ++ * pcs entry for passive connections ++ */ ++struct l5cm_pcs_entry { ++ struct l5cm_pcs_hdr hdr; ++ u8 rx_segment[1516]; ++}; ++ ++ ++ ++ ++/* ++ * l5cm connection parameters ++ */ ++union l5cm_reduce_param_union { ++ u32 passive_side_scramble_key; ++ u32 pcs_id; ++}; ++ ++/* ++ * l5cm connection parameters ++ */ ++struct l5cm_reduce_conn { ++ union l5cm_reduce_param_union param; ++ u32 isn; ++}; ++ ++/* ++ * l5cm slow path element ++ */ ++union l5cm_specific_data { ++ u8 protocol_data[8]; ++ struct regpair phy_address; ++ struct l5cm_packet_size packet_size; ++ struct l5cm_reduce_conn reduced_conn; ++}; ++ ++/* ++ * l5 slow path element ++ */ ++struct l5cm_spe { ++ struct spe_hdr hdr; ++ union l5cm_specific_data data; ++}; ++ ++ ++ ++ ++/* ++ * Termination variables ++ */ ++struct l5cm_term_vars { ++ u8 BitMap; ++#define L5CM_TERM_VARS_TCP_STATE (0xF<<0) ++#define L5CM_TERM_VARS_TCP_STATE_SHIFT 0 ++#define L5CM_TERM_VARS_FIN_RECEIVED_SBIT (0x1<<4) ++#define L5CM_TERM_VARS_FIN_RECEIVED_SBIT_SHIFT 4 ++#define L5CM_TERM_VARS_ACK_ON_FIN_RECEIVED_SBIT (0x1<<5) ++#define L5CM_TERM_VARS_ACK_ON_FIN_RECEIVED_SBIT_SHIFT 5 ++#define L5CM_TERM_VARS_TERM_ON_CHIP (0x1<<6) ++#define L5CM_TERM_VARS_TERM_ON_CHIP_SHIFT 6 ++#define L5CM_TERM_VARS_RSRV (0x1<<7) ++#define L5CM_TERM_VARS_RSRV_SHIFT 7 ++}; ++ ++ ++ ++ ++/* ++ * Tstorm Tcp flags ++ */ ++struct tstorm_l5cm_tcp_flags { ++ u16 flags; ++#define TSTORM_L5CM_TCP_FLAGS_VLAN_ID (0xFFF<<0) ++#define TSTORM_L5CM_TCP_FLAGS_VLAN_ID_SHIFT 0 ++#define TSTORM_L5CM_TCP_FLAGS_RSRV0 (0x1<<12) ++#define TSTORM_L5CM_TCP_FLAGS_RSRV0_SHIFT 12 ++#define TSTORM_L5CM_TCP_FLAGS_TS_ENABLED (0x1<<13) ++#define TSTORM_L5CM_TCP_FLAGS_TS_ENABLED_SHIFT 13 ++#define TSTORM_L5CM_TCP_FLAGS_RSRV1 (0x3<<14) ++#define TSTORM_L5CM_TCP_FLAGS_RSRV1_SHIFT 14 ++}; ++ ++ ++/* ++ * Xstorm Tcp flags ++ */ ++struct xstorm_l5cm_tcp_flags { ++ u8 flags; ++#define XSTORM_L5CM_TCP_FLAGS_ENC_ENABLED (0x1<<0) ++#define XSTORM_L5CM_TCP_FLAGS_ENC_ENABLED_SHIFT 0 ++#define XSTORM_L5CM_TCP_FLAGS_TS_ENABLED (0x1<<1) ++#define XSTORM_L5CM_TCP_FLAGS_TS_ENABLED_SHIFT 1 ++#define XSTORM_L5CM_TCP_FLAGS_WND_SCL_EN (0x1<<2) ++#define XSTORM_L5CM_TCP_FLAGS_WND_SCL_EN_SHIFT 2 ++#define XSTORM_L5CM_TCP_FLAGS_RSRV (0x1F<<3) ++#define XSTORM_L5CM_TCP_FLAGS_RSRV_SHIFT 3 ++}; ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++#endif /* __5710_HSI_CNIC_LE__ */ +diff -r 19900e8f54d8 drivers/net/57xx_iscsi_constants.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/57xx_iscsi_constants.h Mon Jun 15 16:38:18 2009 +0100 +@@ -0,0 +1,212 @@ ++#ifndef __57XX_ISCSI_CONSTANTS_H_ ++#define __57XX_ISCSI_CONSTANTS_H_ ++ ++/** ++* This file defines HSI constants for the iSCSI flows ++*/ ++ ++/* iSCSI request op codes */ ++#define ISCSI_OPCODE_NOP_OUT (0 | 0x40) ++#define ISCSI_OPCODE_SCSI_CMD (1) ++#define ISCSI_OPCODE_TMF_REQUEST (2 | 0x40) ++#define ISCSI_OPCODE_LOGIN_REQUEST (3 | 0x40) ++#define ISCSI_OPCODE_TEXT_REQUEST (4 | 0x40) ++#define ISCSI_OPCODE_DATA_OUT (5) ++#define ISCSI_OPCODE_LOGOUT_REQUEST (6 | 0x00) ++#define ISCSI_OPCODE_CLEANUP_REQUEST (7) ++ ++/* iSCSI response/messages op codes */ ++#define ISCSI_OPCODE_NOP_IN (0x20) ++#define ISCSI_OPCODE_SCSI_RESPONSE (0x21) ++#define ISCSI_OPCODE_TMF_RESPONSE (0x22) ++#define ISCSI_OPCODE_LOGIN_RESPONSE (0x23) ++#define ISCSI_OPCODE_TEXT_RESPONSE (0x24) ++#define ISCSI_OPCODE_DATA_IN (0x25) ++#define ISCSI_OPCODE_LOGOUT_RESPONSE (0x26) ++#define ISCSI_OPCODE_CLEANUP_RESPONSE (0x27) ++#define ISCSI_OPCODE_R2T (0x31) ++#define ISCSI_OPCODE_ASYNC_MSG (0x32) ++#define ISCSI_OPCODE_REJECT (0x3f) ++#define ISCSI_OPCODE_NOPOUT_LOCAL_COMPLETION (0) ++ ++/* iSCSI stages */ ++#define ISCSI_STAGE_SECURITY_NEGOTIATION (0) ++#define ISCSI_STAGE_LOGIN_OPERATIONAL_NEGOTIATION (1) ++#define ISCSI_STAGE_FULL_FEATURE_PHASE (3) ++ ++/* iSCSI parameter defaults */ ++#define ISCSI_DEFAULT_HEADER_DIGEST (0) ++#define ISCSI_DEFAULT_DATA_DIGEST (0) ++#define ISCSI_DEFAULT_INITIAL_R2T (1) ++#define ISCSI_DEFAULT_IMMEDIATE_DATA (1) ++#define ISCSI_DEFAULT_MAX_PDU_LENGTH (0x2000) ++#define ISCSI_DEFAULT_FIRST_BURST_LENGTH (0x10000) ++#define ISCSI_DEFAULT_MAX_BURST_LENGTH (0x40000) ++#define ISCSI_DEFAULT_MAX_OUTSTANDING_R2T (1) ++ ++/* iSCSI parameter limits */ ++#define ISCSI_MIN_VAL_MAX_PDU_LENGTH (0x200) ++#define ISCSI_MAX_VAL_MAX_PDU_LENGTH (0xffffff) ++#define ISCSI_MIN_VAL_BURST_LENGTH (0x200) ++#define ISCSI_MAX_VAL_BURST_LENGTH (0xffffff) ++#define ISCSI_MIN_VAL_MAX_OUTSTANDING_R2T (1) ++#define ISCSI_MAX_VAL_MAX_OUTSTANDING_R2T (0xff) /* 0x10000 according to RFC */ ++ ++/* SCSI command response codes */ ++#define ISCSI_SCSI_CMD_RESPONSE_CMD_COMPLETED (0x00) ++#define ISCSI_SCSI_CMD_RESPONSE_TARGET_FAILURE (0x01) ++ ++/* SCSI command status codes */ ++#define ISCSI_SCSI_CMD_STATUS_GOOD (0x00) ++#define ISCSI_SCSI_CMD_STATUS_CHECK_CONDITION (0x02) ++#define ISCSI_SCSI_CMD_STATUS_INTERMIDIATE (0x10) ++ ++/* TMF codes */ ++#define ISCSI_TMF_ABORT_TASK (1) ++#define ISCSI_TMF_LOGICAL_UNIT_RESET (5) ++ ++/* TMF response codes */ ++#define ISCSI_TMF_RESPONSE_FUNCTION_COMPLETE (0x00) ++#define ISCSI_TMF_RESPONSE_TASK_DOESNT_EXIST (0x01) ++#define ISCSI_TMF_RESPONSE_LUN_DOESNT_EXIST (0x02) ++#define ISCSI_TMF_RESPONSE_TASK_STILL_ALLEGIANT (0x03) ++#define ISCSI_TMF_RESPONSE_FUNCTION_NOT_SUPPORTED (0x05) ++#define ISCSI_TMF_RESPONSE_FUNCTION_AUTHORIZATION_FAILED (0x06) ++#define ISCSI_TMF_RESPONSE_FUNCTION_REJECTED (0xff) ++ ++/* Logout reason codes */ ++/*#define ISCSI_LOGOUT_REASON_CLOSE_CONNECTION (1) */ ++ ++/* Logout response codes */ ++#define ISCSI_LOGOUT_RESPONSE_CONNECTION_CLOSED (0) ++#define ISCSI_LOGOUT_RESPONSE_CID_NOT_FOUND (1) ++#define ISCSI_LOGOUT_RESPONSE_CLEANUP_FAILED (3) ++ ++/* iSCSI task types */ ++#define ISCSI_TASK_TYPE_READ (0) ++#define ISCSI_TASK_TYPE_WRITE (1) ++#define ISCSI_TASK_TYPE_MPATH (2) ++ ++/* initial CQ sequence numbers */ ++#define ISCSI_INITIAL_SN (1) ++ ++/* KWQ (kernel work queue) layer codes */ ++#define ISCSI_KWQE_LAYER_CODE (6) ++ ++/* KWQ (kernel work queue) request op codes */ ++#define ISCSI_KWQE_OPCODE_OFFLOAD_CONN1 (0) ++#define ISCSI_KWQE_OPCODE_OFFLOAD_CONN2 (1) ++#define ISCSI_KWQE_OPCODE_UPDATE_CONN (2) ++#define ISCSI_KWQE_OPCODE_DESTROY_CONN (3) ++#define ISCSI_KWQE_OPCODE_INIT1 (4) ++#define ISCSI_KWQE_OPCODE_INIT2 (5) ++ ++/* KCQ (kernel completion queue) response op codes */ ++#define ISCSI_KCQE_OPCODE_OFFLOAD_CONN (0x10) ++#define ISCSI_KCQE_OPCODE_UPDATE_CONN (0x12) ++#define ISCSI_KCQE_OPCODE_DESTROY_CONN (0x13) ++#define ISCSI_KCQE_OPCODE_INIT (0x14) ++#define ISCSI_KCQE_OPCODE_CLEAN_TASK (0x15) ++#define ISCSI_KCQE_OPCODE_TCP_RESET (0x16) ++#define ISCSI_KCQE_OPCODE_TCP_SYN (0x17) ++#define ISCSI_KCQE_OPCODE_TCP_FIN (0X18) ++#define ISCSI_KCQE_OPCODE_TCP_ERROR (0x19) ++#define ISCSI_KCQE_OPCODE_CQ_EVENT_NOTIFICATION (0x20) ++#define ISCSI_KCQE_OPCODE_ISCSI_ERROR (0x21) ++ ++/* KCQ (kernel completion queue) completion status */ ++#define ISCSI_KCQE_COMPLETION_STATUS_SUCCESS (0) ++#define ISCSI_KCQE_COMPLETION_STATUS_INVALID_OPCODE (1) ++#define ISCSI_KCQE_COMPLETION_STATUS_CTX_ALLOC_FAILURE (2) ++#define ISCSI_KCQE_COMPLETION_STATUS_CTX_FREE_FAILURE (3) ++#define ISCSI_KCQE_COMPLETION_STATUS_NIC_ERROR (4) ++ ++#define ISCSI_KCQE_COMPLETION_STATUS_HDR_DIG_ERR (0x5) ++#define ISCSI_KCQE_COMPLETION_STATUS_DATA_DIG_ERR (0x6) ++/*#define ISCSI_KCQE_COMPLETION_STATUS_DATA_DIG_ERR_DATA_IN (0x6) */ ++/*#define ISCSI_KCQE_COMPLETION_STATUS_DATA_DIG_ERR_RESPONSE (0x7) */ ++/*#define ISCSI_KCQE_COMPLETION_STATUS_DATA_DIG_ERR_REJECT (0x8) */ ++/*#define ISCSI_KCQE_COMPLETION_STATUS_DATA_DIG_ERR_ASYNC (0x9) */ ++ ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_UNEXPECTED_OPCODE (0xa) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_OPCODE (0xb) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_AHS_LEN (0xc) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_ITT (0xd) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_STATSN (0xe) ++ /* Response */ ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_EXP_DATASN (0xf) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_PEND_R2T (0x10) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_DATA_SEG_LEN_IS_ZERO (0x2c) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_DATA_SEG_LEN_TOO_BIG (0x2d) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_O_U_0 (0x11) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_O_U_1 (0x12) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_O_U_2 (0x13) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_O_U_3 (0x14) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_O_U_4 (0x15) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_O_U_5 (0x16) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_O_U_6 (0x17) ++ /* Data-In */ ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_REMAIN_RCV_LEN (0x18) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_MAX_RCV_PDU_LEN (0x19) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_F_BIT_ZERO (0x1a) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_TTT_NOT_RSRV (0x1b) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_DATASN (0x1c) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_REMAIN_BURST_LEN (0x1d) ++ ++ /* R2T */ ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_BUFFER_OFF (0x1f) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_LUN (0x20) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_R2TSN (0x21) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_DESIRED_DATA_TRNS_LEN_0 (0x22) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_DESIRED_DATA_TRNS_LEN_1 (0x23) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_PEND_R2T_EXCEED (0x24) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_TTT_IS_RSRV (0x25) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_MAX_BURST_LEN (0x26) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_DATA_SEG_LEN_NOT_ZERO (0x27) ++ /* TMF */ ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_REJECT_PDU_LEN (0x28) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_ASYNC_PDU_LEN (0x29) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_NOPIN_PDU_LEN (0x2a) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_PEND_R2T_IN_CLEANUP (0x2b) ++ ++/* IP/TCP processing errors: */ ++#define ISCI_KCQE_COMPLETION_STATUS_TCP_ERROR_IP_FRAGMENT (0x40) ++#define ISCI_KCQE_COMPLETION_STATUS_TCP_ERROR_IP_OPTIONS (0x41) ++#define ISCI_KCQE_COMPLETION_STATUS_TCP_ERROR_URGENT_FLAG (0x42) ++#define ISCI_KCQE_COMPLETION_STATUS_TCP_ERROR_MAX_RTRANS (0x43) ++ ++/* iSCSI licensing errors */ ++/* general iSCSI license not installed */ ++#define ISCSI_KCQE_COMPLETION_STATUS_ISCSI_NOT_SUPPORTED (0x50) ++/* additional LOM specific iSCSI license not installed */ ++#define ISCSI_KCQE_COMPLETION_STATUS_LOM_ISCSI_NOT_ENABLED (0x51) ++ ++/* SQ/RQ/CQ DB structure sizes */ ++#define ISCSI_SQ_DB_SIZE (16) ++#define ISCSI_RQ_DB_SIZE (16) ++#define ISCSI_CQ_DB_SIZE (80) ++ ++/* Page size codes (for l5_wqe_flags in connection offload request) */ ++#define ISCSI_PAGE_SIZE_256 (0) ++#define ISCSI_PAGE_SIZE_512 (1) ++#define ISCSI_PAGE_SIZE_1K (2) ++#define ISCSI_PAGE_SIZE_2K (3) ++#define ISCSI_PAGE_SIZE_4K (4) ++#define ISCSI_PAGE_SIZE_8K (5) ++#define ISCSI_PAGE_SIZE_16K (6) ++#define ISCSI_PAGE_SIZE_32K (7) ++#define ISCSI_PAGE_SIZE_64K (8) ++#define ISCSI_PAGE_SIZE_128K (9) ++#define ISCSI_PAGE_SIZE_256K (10) ++#define ISCSI_PAGE_SIZE_512K (11) ++#define ISCSI_PAGE_SIZE_1M (12) ++#define ISCSI_PAGE_SIZE_2M (13) ++#define ISCSI_PAGE_SIZE_4M (14) ++#define ISCSI_PAGE_SIZE_8M (15) ++ ++/* Iscsi PDU related defines */ ++#define ISCSI_HEADER_SIZE (48) ++#define ISCSI_DIGEST_SHIFT (2) ++#define ISCSI_DIGEST_SIZE (4) ++ ++#endif /*__57XX_ISCSI_CONSTANTS_H_ */ +diff -r 19900e8f54d8 drivers/net/Kconfig +--- a/drivers/net/Kconfig Mon Jun 15 16:27:59 2009 +0100 ++++ b/drivers/net/Kconfig Mon Jun 15 16:38:18 2009 +0100 +@@ -2191,6 +2191,16 @@ + To compile this driver as a module, choose M here: the module + will be called bnx2. This is recommended. + ++config CNIC ++ tristate "Broadcom CNIC support" ++ depends on BNX2 ++ help ++ This driver supports offload features of Broadcom NetXtremeII ++ gigabit Ethernet cards. ++ ++ To compile this driver as a module, choose M here: the module ++ will be called cnic. This is recommended. ++ + config SPIDER_NET + tristate "Spider Gigabit Ethernet driver" + depends on PCI && (PPC_IBM_CELL_BLADE || PPC_CELLEB) +diff -r 19900e8f54d8 drivers/net/Makefile +--- a/drivers/net/Makefile Mon Jun 15 16:27:59 2009 +0100 ++++ b/drivers/net/Makefile Mon Jun 15 16:38:18 2009 +0100 +@@ -68,6 +68,9 @@ + obj-$(CONFIG_TIGON3) += tg3.o + CFLAGS_tg3.o += -DBCM_HAS_PRINT_MAC + obj-$(CONFIG_BNX2) += bnx2.o ++CFLAGS_bnx2.o += -DHAVE_LE32 -DHAVE_IP_HDR -DNEW_SKB ++obj-$(CONFIG_CNIC) += cnic.o ++CFLAGS_cnic.o += -DHAVE_LE32 -DHAVE_IP_HDR -DNEW_SKB + obj-$(CONFIG_BNX2X) += bnx2x.o + bnx2x-objs := bnx2x_main.o bnx2x_link.o + spidernet-y += spider_net.o spider_net_ethtool.o +diff -r 19900e8f54d8 drivers/net/bnx2.c +--- a/drivers/net/bnx2.c Mon Jun 15 16:27:59 2009 +0100 ++++ b/drivers/net/bnx2.c Mon Jun 15 16:38:18 2009 +0100 +@@ -1,6 +1,6 @@ + /* bnx2.c: Broadcom NX2 network driver. + * +- * Copyright (c) 2004-2008 Broadcom Corporation ++ * Copyright (c) 2004-2009 Broadcom Corporation + * + * 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 +@@ -9,9 +9,23 @@ + * Written by: Michael Chan (mchan@broadcom.com) + */ + ++#include ++ ++#if (LINUX_VERSION_CODE < 0x020612) ++#include ++#endif ++ ++#if (LINUX_VERSION_CODE < 0x020500) ++#if defined(CONFIG_MODVERSIONS) && defined(MODULE) && ! defined(MODVERSIONS) ++#define MODVERSIONS ++#include ++#endif ++#endif + + #include ++#if (LINUX_VERSION_CODE >= 0x020600) + #include ++#endif + + #include + #include +@@ -25,7 +39,9 @@ + #include + #include + #include ++#if (LINUX_VERSION_CODE >= 0x020600) + #include ++#endif + #include + #include + #include +@@ -39,26 +55,39 @@ + #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) + #define BCM_VLAN 1 + #endif ++ ++/* For driver stability, disable IPv6 checksum and TSO. */ ++#define __VMKLNX_NO_IPV6_CSUM__ 1 ++#undef NETIF_F_TSO6 ++ ++#ifdef NETIF_F_TSO + #include + #include + #include ++#define BCM_TSO 1 ++#endif ++#if (LINUX_VERSION_CODE >= 0x020600) + #include ++#endif ++#ifndef BNX2_BOOT_DISK + #include ++#endif + #include + #include + #include ++#if (LINUX_VERSION_CODE >= 0x20617) && !defined(NETIF_F_MULTI_QUEUE) + #include +- ++#endif ++ ++#include "cnic_drv.h" + #include "bnx2.h" + #include "bnx2_fw.h" + #include "bnx2_fw2.h" + +-#define FW_BUF_SIZE 0x10000 +- + #define DRV_MODULE_NAME "bnx2" + #define PFX DRV_MODULE_NAME ": " +-#define DRV_MODULE_VERSION "1.8.0" +-#define DRV_MODULE_RELDATE "Aug 14, 2008" ++#define DRV_MODULE_VERSION "1.9.16b" ++#define DRV_MODULE_RELDATE "June 10, 2009" + + #define RUN_AT(x) (jiffies + (x)) + +@@ -69,14 +98,29 @@ + "Broadcom NetXtreme II Gigabit Ethernet Driver " DRV_MODULE_NAME " v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n"; + + MODULE_AUTHOR("Michael Chan "); +-MODULE_DESCRIPTION("Broadcom NetXtreme II BCM5706/5708/5709 Driver"); ++MODULE_DESCRIPTION("Broadcom NetXtreme II BCM5706/5708/5709/5716 Driver"); + MODULE_LICENSE("GPL"); + MODULE_VERSION(DRV_MODULE_VERSION); + + static int disable_msi = 0; + ++#if (LINUX_VERSION_CODE >= 0x20600) + module_param(disable_msi, int, 0); + MODULE_PARM_DESC(disable_msi, "Disable Message Signaled Interrupt (MSI)"); ++#endif ++ ++#if defined(__VMKLNX__) && defined(__VMKNETDDI_QUEUEOPS__) ++static int disable_netq = 0; ++ ++module_param(disable_netq, int, 0); ++MODULE_PARM_DESC(disable_netq, "Disable NetQueue support on 5709/5716"); ++ ++static int force_netq = -1; ++module_param(force_netq, int, 0); ++MODULE_PARM_DESC(force_netq, "Enforce the number of NetQueues per port " ++ "(allowed values: 2-7, <2 is default value)"); ++ ++#endif + + typedef enum { + BCM5706 = 0, +@@ -131,7 +175,7 @@ + { PCI_VENDOR_ID_BROADCOM, 0x163b, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, BCM5716 }, + { PCI_VENDOR_ID_BROADCOM, 0x163c, +- PCI_ANY_ID, PCI_ANY_ID, 0, 0, BCM5716 }, ++ PCI_ANY_ID, PCI_ANY_ID, 0, 0, BCM5716S }, + { 0, } + }; + +@@ -235,6 +279,41 @@ + + MODULE_DEVICE_TABLE(pci, bnx2_pci_tbl); + ++#if defined(__VMKLNX__) && defined(__VMKNETDDI_QUEUEOPS__) ++static int bnx2_netqueue_ops(vmknetddi_queueops_op_t op, void *args); ++static void bnx2_stop_netqueue_hw(struct bnx2 *bp); ++static int bnx2_start_netqueue_hw(struct bnx2 *bp); ++static void bnx2_netqueue_service_bnx2_msix(struct bnx2_napi *bnapi); ++#ifdef BNX2_DEBUG ++static u32 bnx2_read_ctx(struct bnx2 *bp, u32 offset); ++#endif ++ ++#define TRUE 1 ++#define FALSE 0 ++ ++#define for_each_nondefault_rx_queue(bp, var) \ ++ for (var = 1; var < bp->num_rx_rings; var++) ++#define for_each_nondefault_tx_queue(bp, var) \ ++ for (var = 1; var < bp->num_tx_rings; var++) ++#define is_multi(bp) (bp->num_rx_ring > 1) ++#endif /* defined(__VMKLNX__) && defined(__VMKNETDDI_QUEUEOPS__) */ ++ ++#ifdef BNX2_BOOT_DISK ++u32 ether_crc_le(size_t len, unsigned char const *p) ++{ ++ u32 crc = ~0; ++ int i; ++#define CRCPOLY_LE 0xedb88320 ++ ++ while (len--) { ++ crc ^= *p++; ++ for (i = 0; i < 8; i++) ++ crc = (crc >> 1) ^ ((crc & 1) ? CRCPOLY_LE : 0); ++ } ++ return crc; ++} ++#endif ++ + static inline u32 bnx2_tx_avail(struct bnx2 *bp, struct bnx2_tx_ring_info *txr) + { + u32 diff; +@@ -310,6 +389,184 @@ + spin_unlock_bh(&bp->indirect_lock); + } + ++#ifdef BCM_CNIC ++static int ++bnx2_drv_ctl(struct net_device *dev, struct drv_ctl_info *info) ++{ ++ struct bnx2 *bp = netdev_priv(dev); ++ struct drv_ctl_io *io = &info->data.io; ++ ++ switch (info->cmd) { ++ case DRV_CTL_IO_WR_CMD: ++ bnx2_reg_wr_ind(bp, io->offset, io->data); ++ break; ++ case DRV_CTL_IO_RD_CMD: ++ io->data = bnx2_reg_rd_ind(bp, io->offset); ++ break; ++ case DRV_CTL_CTX_WR_CMD: ++ bnx2_ctx_wr(bp, io->cid_addr, io->offset, io->data); ++ break; ++ default: ++ return -EINVAL; ++ } ++ return 0; ++} ++ ++static void bnx2_setup_cnic_irq_info(struct bnx2 *bp) ++{ ++ struct cnic_ops *c_ops; ++ struct cnic_eth_dev *cp = &bp->cnic_eth_dev; ++ struct bnx2_napi *bnapi = &bp->bnx2_napi[0]; ++ int sb_id; ++ ++ rcu_read_lock(); ++ c_ops = rcu_dereference(bp->cnic_ops); ++ if (!c_ops) ++ goto done; ++ ++ if (bp->flags & BNX2_FLAG_USING_MSIX) { ++ cp->drv_state |= CNIC_DRV_STATE_USING_MSIX; ++ bnapi->cnic_present = 0; ++ sb_id = bp->irq_nvecs; ++ cp->irq_arr[0].irq_flags |= CNIC_IRQ_FL_MSIX; ++ } else { ++ cp->drv_state &= ~CNIC_DRV_STATE_USING_MSIX; ++ bnapi->cnic_tag = bnapi->last_status_idx; ++ bnapi->cnic_present = 1; ++ sb_id = 0; ++ cp->irq_arr[0].irq_flags &= ~CNIC_IRQ_FL_MSIX; ++ } ++ ++ cp->irq_arr[0].vector = bp->irq_tbl[sb_id].vector; ++ cp->irq_arr[0].status_blk = (void *) ++ ((unsigned long) bnapi->status_blk.msi + ++ (BNX2_SBLK_MSIX_ALIGN_SIZE * sb_id)); ++ cp->irq_arr[0].status_blk_num = sb_id; ++ cp->num_irq = 1; ++ ++done: ++ rcu_read_unlock(); ++} ++ ++static int bnx2_register_cnic(struct net_device *dev, struct cnic_ops *ops, ++ void *data) ++{ ++ struct bnx2 *bp = netdev_priv(dev); ++ struct cnic_eth_dev *cp = &bp->cnic_eth_dev; ++ ++ if (ops == NULL) ++ return -EINVAL; ++ ++#if !defined(__VMKLNX__) ++ if (!try_module_get(ops->cnic_owner)) ++ return -EBUSY; ++#endif ++ if (atomic_read(&bp->intr_sem) != 0) ++ return -EBUSY; ++ ++ spin_lock(&bp->cnic_lock); ++ if (cp->drv_state & CNIC_DRV_STATE_REGD) { ++ spin_unlock(&bp->cnic_lock); ++ return -EBUSY; ++ } ++ bp->cnic_data = data; ++ rcu_assign_pointer(bp->cnic_ops, ops); ++ ++ cp->num_irq = 0; ++ cp->drv_state = CNIC_DRV_STATE_REGD; ++ ++ bnx2_setup_cnic_irq_info(bp); ++ spin_unlock(&bp->cnic_lock); ++ ++ return 0; ++} ++ ++static int bnx2_unregister_cnic(struct net_device *dev) ++{ ++ struct bnx2 *bp = netdev_priv(dev); ++ struct bnx2_napi *bnapi = &bp->bnx2_napi[0]; ++ struct cnic_eth_dev *cp = &bp->cnic_eth_dev; ++ ++ spin_lock(&bp->cnic_lock); ++ cp->drv_state = 0; ++#if !defined(__VMKLNX__) ++ module_put(bp->cnic_ops->cnic_owner); ++#endif ++ bnapi->cnic_present = 0; ++ rcu_assign_pointer(bp->cnic_ops, NULL); ++ spin_unlock(&bp->cnic_lock); ++#if !defined(__VMKLNX__) ++ synchronize_rcu(); ++#endif ++ return 0; ++} ++ ++struct cnic_eth_dev *bnx2_cnic_probe(struct net_device *dev) ++{ ++ struct bnx2 *bp = netdev_priv(dev); ++ struct cnic_eth_dev *cp = &bp->cnic_eth_dev; ++ ++ cp->drv_owner = THIS_MODULE; ++ cp->chip_id = bp->chip_id; ++ cp->pdev = bp->pdev; ++ cp->io_base = bp->regview; ++ cp->drv_ctl = bnx2_drv_ctl; ++ cp->drv_register_cnic = bnx2_register_cnic; ++ cp->drv_unregister_cnic = bnx2_unregister_cnic; ++ ++ return cp; ++} ++EXPORT_SYMBOL(bnx2_cnic_probe); ++ ++static void ++bnx2_cnic_stop(struct bnx2 *bp) ++{ ++ struct cnic_ops *c_ops; ++ struct cnic_ctl_info info; ++ ++ rcu_read_lock(); ++ c_ops = rcu_dereference(bp->cnic_ops); ++ if (c_ops) { ++ info.cmd = CNIC_CTL_STOP_CMD; ++ c_ops->cnic_ctl(bp->cnic_data, &info); ++ } ++ rcu_read_unlock(); ++} ++ ++static void ++bnx2_cnic_start(struct bnx2 *bp) ++{ ++ struct cnic_ops *c_ops; ++ struct cnic_ctl_info info; ++ ++ rcu_read_lock(); ++ c_ops = rcu_dereference(bp->cnic_ops); ++ if (c_ops) { ++ if (!(bp->flags & BNX2_FLAG_USING_MSIX)) { ++ struct bnx2_napi *bnapi = &bp->bnx2_napi[0]; ++ ++ bnapi->cnic_tag = bnapi->last_status_idx; ++ } ++ info.cmd = CNIC_CTL_START_CMD; ++ c_ops->cnic_ctl(bp->cnic_data, &info); ++ } ++ rcu_read_unlock(); ++} ++ ++#else ++ ++static void ++bnx2_cnic_stop(struct bnx2 *bp) ++{ ++} ++ ++static void ++bnx2_cnic_start(struct bnx2 *bp) ++{ ++} ++ ++#endif ++ + static int + bnx2_read_phy(struct bnx2 *bp, u32 reg, u32 *val) + { +@@ -457,32 +714,48 @@ + int i; + + atomic_inc(&bp->intr_sem); ++ if (!netif_running(bp->dev)) ++ return; ++ + bnx2_disable_int(bp); + for (i = 0; i < bp->irq_nvecs; i++) ++#if (LINUX_VERSION_CODE >= 0x2051c) + synchronize_irq(bp->irq_tbl[i].vector); ++#else ++ synchronize_irq(); ++#endif + } + + static void + bnx2_napi_disable(struct bnx2 *bp) + { ++#ifdef BNX2_NEW_NAPI + int i; + + for (i = 0; i < bp->irq_nvecs; i++) + napi_disable(&bp->bnx2_napi[i].napi); ++#else ++ netif_poll_disable(bp->dev); ++#endif + } + + static void + bnx2_napi_enable(struct bnx2 *bp) + { ++#ifdef BNX2_NEW_NAPI + int i; + + for (i = 0; i < bp->irq_nvecs; i++) + napi_enable(&bp->bnx2_napi[i].napi); ++#else ++ netif_poll_enable(bp->dev); ++#endif + } + + static void + bnx2_netif_stop(struct bnx2 *bp) + { ++ bnx2_cnic_stop(bp); + bnx2_disable_int_sync(bp); + if (netif_running(bp->dev)) { + bnx2_napi_disable(bp); +@@ -499,6 +772,7 @@ + netif_tx_wake_all_queues(bp->dev); + bnx2_napi_enable(bp); + bnx2_enable_int(bp); ++ bnx2_cnic_start(bp); + } + } + } +@@ -566,10 +840,11 @@ + struct bnx2_napi *bnapi = &bp->bnx2_napi[i]; + struct bnx2_tx_ring_info *txr = &bnapi->tx_ring; + +- txr->tx_buf_ring = kzalloc(SW_TXBD_RING_SIZE, GFP_KERNEL); ++ txr->tx_buf_ring = kmalloc(SW_TXBD_RING_SIZE, GFP_KERNEL); + if (txr->tx_buf_ring == NULL) + return -ENOMEM; + ++ memset(txr->tx_buf_ring, 0, SW_TXBD_RING_SIZE); + txr->tx_desc_ring = + pci_alloc_consistent(bp->pdev, TXBD_RING_SIZE, + &txr->tx_desc_mapping); +@@ -663,9 +938,11 @@ + + /* Combine status and statistics blocks into one allocation. */ + status_blk_size = L1_CACHE_ALIGN(sizeof(struct status_block)); ++#ifdef CONFIG_PCI_MSI + if (bp->flags & BNX2_FLAG_MSIX_CAP) + status_blk_size = L1_CACHE_ALIGN(BNX2_MAX_MSIX_HW_VEC * + BNX2_SBLK_MSIX_ALIGN_SIZE); ++#endif + bp->status_stats_size = status_blk_size + + sizeof(struct statistics_block); + +@@ -1116,6 +1393,7 @@ + val |= lo_water | (hi_water << BNX2_L2CTX_HI_WATER_MARK_SHIFT); + } + bnx2_ctx_wr(bp, rx_cid_addr, BNX2_L2CTX_CTX_TYPE, val); ++ + } + + static void +@@ -1131,7 +1409,7 @@ + } + } + +-static int ++static void + bnx2_set_mac_link(struct bnx2 *bp) + { + u32 val; +@@ -1197,8 +1475,6 @@ + + if (CHIP_NUM(bp) == CHIP_NUM_5709) + bnx2_init_all_rx_contexts(bp); +- +- return 0; + } + + static void +@@ -1499,6 +1775,8 @@ + + static int + bnx2_setup_remote_phy(struct bnx2 *bp, u8 port) ++__releases(&bp->phy_lock) ++__acquires(&bp->phy_lock) + { + u32 speed_arg = 0, pause_adv; + +@@ -1556,6 +1834,8 @@ + + static int + bnx2_setup_serdes_phy(struct bnx2 *bp, u8 port) ++__releases(&bp->phy_lock) ++__acquires(&bp->phy_lock) + { + u32 adv, bmcr; + u32 new_adv = 0; +@@ -1643,7 +1923,7 @@ + if (bp->link_up) { + bnx2_write_phy(bp, bp->mii_bmcr, BMCR_LOOPBACK); + spin_unlock_bh(&bp->phy_lock); +- msleep(20); ++ bnx2_msleep(20); + spin_lock_bh(&bp->phy_lock); + } + +@@ -1658,7 +1938,7 @@ + * exchanging base pages plus 3 next pages and + * normally completes in about 120 msec. + */ +- bp->current_interval = SERDES_AN_TIMEOUT; ++ bp->current_interval = BNX2_SERDES_AN_TIMEOUT; + bp->serdes_an_pending = 1; + mod_timer(&bp->timer, jiffies + bp->current_interval); + } else { +@@ -1853,7 +2133,11 @@ + { + u32 evt_code; + +- evt_code = bnx2_shmem_rd(bp, BNX2_FW_EVT_CODE_MB); ++ spin_lock(&bp->indirect_lock); ++ REG_WR(bp, BNX2_PCICFG_REG_WINDOW_ADDRESS, ++ bp->shmem_base + BNX2_FW_EVT_CODE_MB); ++ evt_code = REG_RD(bp, BNX2_PCICFG_REG_WINDOW); ++ spin_unlock(&bp->indirect_lock); + switch (evt_code) { + case BNX2_FW_EVT_CODE_LINK_EVENT: + bnx2_remote_phy_event(bp); +@@ -1868,6 +2152,8 @@ + + static int + bnx2_setup_copper_phy(struct bnx2 *bp) ++__releases(&bp->phy_lock) ++__acquires(&bp->phy_lock) + { + u32 bmcr; + u32 new_bmcr; +@@ -1937,7 +2223,7 @@ + /* Force link down */ + bnx2_write_phy(bp, bp->mii_bmcr, BMCR_LOOPBACK); + spin_unlock_bh(&bp->phy_lock); +- msleep(50); ++ bnx2_msleep(50); + spin_lock_bh(&bp->phy_lock); + + bnx2_read_phy(bp, bp->mii_bmsr, &bmsr); +@@ -1965,6 +2251,8 @@ + + static int + bnx2_setup_phy(struct bnx2 *bp, u8 port) ++__releases(&bp->phy_lock) ++__acquires(&bp->phy_lock) + { + if (bp->loopback == MAC_LOOPBACK) + return 0; +@@ -2001,6 +2289,9 @@ + bnx2_read_phy(bp, MII_BNX2_SERDES_DIG_1000XCTL1, &val); + val &= ~MII_BNX2_SD_1000XCTL1_AUTODET; + val |= MII_BNX2_SD_1000XCTL1_FIBER; ++ /* NEMO temp. FIX */ ++ if (bnx2_shmem_rd(bp, BNX2_SHARED_HW_CFG_CONFIG) & 0x80000000) ++ val |= (1 << 3); + bnx2_write_phy(bp, MII_BNX2_SERDES_DIG_1000XCTL1, val); + + bnx2_write_phy(bp, MII_BNX2_BLK_ADDR, MII_BNX2_BLK_ADDR_OVER1G); +@@ -2178,6 +2469,8 @@ + + static int + bnx2_init_phy(struct bnx2 *bp, int reset_phy) ++__releases(&bp->phy_lock) ++__acquires(&bp->phy_lock) + { + u32 val; + int rc = 0; +@@ -2251,7 +2544,7 @@ + for (i = 0; i < 10; i++) { + if (bnx2_test_link(bp) == 0) + break; +- msleep(100); ++ bnx2_msleep(100); + } + + mac_mode = REG_RD(bp, BNX2_EMAC_MODE); +@@ -2280,8 +2573,8 @@ + return 0; + + /* wait for an acknowledgement. */ +- for (i = 0; i < (FW_ACK_TIME_OUT_MS / 10); i++) { +- msleep(10); ++ for (i = 0; i < (BNX2_FW_ACK_TIME_OUT_MS / 10); i++) { ++ bnx2_msleep(10); + + val = bnx2_shmem_rd(bp, BNX2_FW_MB); + +@@ -2476,12 +2769,21 @@ + struct sw_pg *rx_pg = &rxr->rx_pg_ring[index]; + struct rx_bd *rxbd = + &rxr->rx_pg_desc_ring[RX_RING(index)][RX_IDX(index)]; +- struct page *page = netdev_alloc_page(bp->dev); ++ struct page *page = alloc_page(GFP_ATOMIC); + + if (!page) + return -ENOMEM; + mapping = pci_map_page(bp->pdev, page, 0, PAGE_SIZE, + PCI_DMA_FROMDEVICE); ++#if (LINUX_VERSION_CODE >= 0x02061b) ++ if (pci_dma_mapping_error(bp->pdev, mapping)) { ++#else ++ if (pci_dma_mapping_error(mapping)) { ++#endif ++ __free_page(page); ++ return -EIO; ++ } ++ + rx_pg->page = page; + pci_unmap_addr_set(rx_pg, mapping, mapping); + rxbd->rx_bd_haddr_hi = (u64) mapping >> 32; +@@ -2501,7 +2803,7 @@ + pci_unmap_page(bp->pdev, pci_unmap_addr(rx_pg, mapping), PAGE_SIZE, + PCI_DMA_FROMDEVICE); + +- netdev_free_page(bp->dev, page); ++ __free_page(page); + rx_pg->page = NULL; + } + +@@ -2524,6 +2826,14 @@ + + mapping = pci_map_single(bp->pdev, skb->data, bp->rx_buf_use_size, + PCI_DMA_FROMDEVICE); ++#if (LINUX_VERSION_CODE >= 0x02061b) ++ if (pci_dma_mapping_error(bp->pdev, mapping)) { ++#else ++ if (pci_dma_mapping_error(mapping)) { ++#endif ++ dev_kfree_skb(skb); ++ return -EIO; ++ } + + rx_buf->skb = skb; + pci_unmap_addr_set(rx_buf, mapping, mapping); +@@ -2578,6 +2888,7 @@ + /* Tell compiler that status block fields can change. */ + barrier(); + cons = *bnapi->hw_tx_cons_ptr; ++ barrier(); + if (unlikely((cons & MAX_TX_DESC_CNT) == MAX_TX_DESC_CNT)) + cons++; + return cons; +@@ -2588,17 +2899,21 @@ + { + struct bnx2_tx_ring_info *txr = &bnapi->tx_ring; + u16 hw_cons, sw_cons, sw_ring_cons; ++#ifndef BCM_HAVE_MULTI_QUEUE ++ int tx_pkt = 0; ++#else + int tx_pkt = 0, index; + struct netdev_queue *txq; + + index = (bnapi - bp->bnx2_napi); + txq = netdev_get_tx_queue(bp->dev, index); ++#endif + + hw_cons = bnx2_get_hw_tx_cons(bnapi); + sw_cons = txr->tx_cons; + + while (sw_cons != hw_cons) { +- struct sw_bd *tx_buf; ++ struct sw_tx_bd *tx_buf; + struct sk_buff *skb; + int i, last; + +@@ -2607,14 +2922,16 @@ + tx_buf = &txr->tx_buf_ring[sw_ring_cons]; + skb = tx_buf->skb; + ++ /* prefetch skb_end_pointer() to speedup skb_shinfo(skb) */ ++ prefetch(&skb->end); ++ ++#ifdef BCM_TSO + /* partial BD completions possible with TSO packets */ +- if (skb_is_gso(skb)) { ++ if (tx_buf->is_gso) { + u16 last_idx, last_ring_idx; + +- last_idx = sw_cons + +- skb_shinfo(skb)->nr_frags + 1; +- last_ring_idx = sw_ring_cons + +- skb_shinfo(skb)->nr_frags + 1; ++ last_idx = sw_cons + tx_buf->nr_frags + 1; ++ last_ring_idx = sw_ring_cons + tx_buf->nr_frags + 1; + if (unlikely(last_ring_idx >= MAX_TX_DESC_CNT)) { + last_idx++; + } +@@ -2622,12 +2939,12 @@ + break; + } + } +- ++#endif + pci_unmap_single(bp->pdev, pci_unmap_addr(tx_buf, mapping), + skb_headlen(skb), PCI_DMA_TODEVICE); + + tx_buf->skb = NULL; +- last = skb_shinfo(skb)->nr_frags; ++ last = tx_buf->nr_frags; + + for (i = 0; i < last; i++) { + sw_cons = NEXT_TX_BD(sw_cons); +@@ -2642,12 +2959,17 @@ + + sw_cons = NEXT_TX_BD(sw_cons); + ++#if defined(__VMKLNX__) && defined(__VMKNETDDI_QUEUEOPS__) ++ bnapi->stats.tx_packets++; ++ bnapi->stats.tx_bytes += skb->len; ++#endif + dev_kfree_skb(skb); + tx_pkt++; + if (tx_pkt == budget) + break; + +- hw_cons = bnx2_get_hw_tx_cons(bnapi); ++ if (hw_cons == sw_cons) ++ hw_cons = bnx2_get_hw_tx_cons(bnapi); + } + + txr->hw_tx_cons = hw_cons; +@@ -2660,6 +2982,25 @@ + */ + smp_mb(); + ++#if defined(__VMKLNX__) && defined(__VMKNETDDI_QUEUEOPS__) ++ if ((bnapi->netq_flags & BNX2_NETQ_FREE_TX_QUEUE_STATE) && ++ (sw_cons == txr->tx_prod)) { ++ bp->netq_flags = L2_KCQE_OPCODE_VALUE_VM_FREE_TX_QUEUE; ++ wake_up(&bp->netq_wait); ++ } ++ ++#endif ++ ++#ifndef BCM_HAVE_MULTI_QUEUE ++ if (unlikely(netif_queue_stopped(bp->dev)) && ++ (bnx2_tx_avail(bp, txr) > bp->tx_wake_thresh)) { ++ netif_tx_lock(bp->dev); ++ if ((netif_queue_stopped(bp->dev)) && ++ (bnx2_tx_avail(bp, txr) > bp->tx_wake_thresh)) ++ netif_wake_queue(bp->dev); ++ netif_tx_unlock(bp->dev); ++ } ++#else + if (unlikely(netif_tx_queue_stopped(txq)) && + (bnx2_tx_avail(bp, txr) > bp->tx_wake_thresh)) { + __netif_tx_lock(txq, smp_processor_id()); +@@ -2668,7 +3009,7 @@ + netif_tx_wake_queue(txq); + __netif_tx_unlock(txq); + } +- ++#endif + return tx_pkt; + } + +@@ -2678,10 +3019,30 @@ + { + struct sw_pg *cons_rx_pg, *prod_rx_pg; + struct rx_bd *cons_bd, *prod_bd; +- dma_addr_t mapping; +- int i; +- u16 hw_prod = rxr->rx_pg_prod, prod; ++ int i; ++ u16 hw_prod, prod; + u16 cons = rxr->rx_pg_cons; ++ ++ cons_rx_pg = &rxr->rx_pg_ring[cons]; ++ ++ /* The caller was unable to allocate a new page to replace the ++ * last one in the frags array, so we need to recycle that page ++ * and then free the skb. ++ */ ++ if (skb) { ++ struct page *page; ++ struct skb_shared_info *shinfo; ++ ++ shinfo = skb_shinfo(skb); ++ shinfo->nr_frags--; ++ page = shinfo->frags[shinfo->nr_frags].page; ++ shinfo->frags[shinfo->nr_frags].page = NULL; ++ ++ cons_rx_pg->page = page; ++ dev_kfree_skb(skb); ++ } ++ ++ hw_prod = rxr->rx_pg_prod; + + for (i = 0; i < count; i++) { + prod = RX_PG_RING_IDX(hw_prod); +@@ -2691,20 +3052,6 @@ + cons_bd = &rxr->rx_pg_desc_ring[RX_RING(cons)][RX_IDX(cons)]; + prod_bd = &rxr->rx_pg_desc_ring[RX_RING(prod)][RX_IDX(prod)]; + +- if (i == 0 && skb) { +- struct page *page; +- struct skb_shared_info *shinfo; +- +- shinfo = skb_shinfo(skb); +- shinfo->nr_frags--; +- page = shinfo->frags[shinfo->nr_frags].page; +- shinfo->frags[shinfo->nr_frags].page = NULL; +- mapping = pci_map_page(bp->pdev, page, 0, PAGE_SIZE, +- PCI_DMA_FROMDEVICE); +- cons_rx_pg->page = page; +- pci_unmap_addr_set(cons_rx_pg, mapping, mapping); +- dev_kfree_skb(skb); +- } + if (prod != cons) { + prod_rx_pg->page = cons_rx_pg->page; + cons_rx_pg->page = NULL; +@@ -2790,6 +3137,8 @@ + skb_put(skb, hdr_len); + + for (i = 0; i < pages; i++) { ++ dma_addr_t mapping_old; ++ + frag_len = min(frag_size, (unsigned int) PAGE_SIZE); + if (unlikely(frag_len <= 4)) { + unsigned int tail = 4 - frag_len; +@@ -2812,13 +3161,15 @@ + } + rx_pg = &rxr->rx_pg_ring[pg_cons]; + +- pci_unmap_page(bp->pdev, pci_unmap_addr(rx_pg, mapping), +- PAGE_SIZE, PCI_DMA_FROMDEVICE); +- ++ /* Don't unmap yet. If we're unable to allocate a new ++ * page, we need to recycle the page and the DMA addr. ++ */ ++ mapping_old = pci_unmap_addr(rx_pg, mapping); + if (i == pages - 1) + frag_len -= 4; + +- skb_fill_page_desc(skb, i, rx_pg->page, 0, frag_len); ++ bnx2_skb_fill_page_desc(skb, i, rx_pg->page, 0, ++ frag_len); + rx_pg->page = NULL; + + err = bnx2_alloc_rx_page(bp, rxr, +@@ -2831,8 +3182,13 @@ + return err; + } + ++ pci_unmap_page(bp->pdev, mapping_old, ++ PAGE_SIZE, PCI_DMA_FROMDEVICE); ++ + frag_size -= frag_len; +- skb_add_rx_frag(skb, i, rx_pg->page, 0, frag_len); ++ skb->data_len += frag_len; ++ skb->truesize += frag_len; ++ skb->len += frag_len; + + pg_prod = NEXT_RX_BD(pg_prod); + pg_cons = RX_PG_RING_IDX(NEXT_RX_BD(pg_cons)); +@@ -2851,6 +3207,7 @@ + /* Tell compiler that status block fields can change. */ + barrier(); + cons = *bnapi->hw_rx_cons_ptr; ++ barrier(); + if (unlikely((cons & MAX_RX_DESC_CNT) == MAX_RX_DESC_CNT)) + cons++; + return cons; +@@ -2897,18 +3254,8 @@ + + rx_hdr = (struct l2_fhdr *) skb->data; + len = rx_hdr->l2_fhdr_pkt_len; +- +- if ((status = rx_hdr->l2_fhdr_status) & +- (L2_FHDR_ERRORS_BAD_CRC | +- L2_FHDR_ERRORS_PHY_DECODE | +- L2_FHDR_ERRORS_ALIGNMENT | +- L2_FHDR_ERRORS_TOO_SHORT | +- L2_FHDR_ERRORS_GIANT_FRAME)) { +- +- bnx2_reuse_rx_skb(bp, rxr, skb, sw_ring_cons, +- sw_ring_prod); +- goto next_rx; +- } ++ status = rx_hdr->l2_fhdr_status; ++ + hdr_len = 0; + if (status & L2_FHDR_STATUS_SPLIT) { + hdr_len = rx_hdr->l2_fhdr_ip_xsum; +@@ -2918,6 +3265,36 @@ + pg_ring_used = 1; + } + ++ if (unlikely(status & (L2_FHDR_ERRORS_BAD_CRC | ++ L2_FHDR_ERRORS_PHY_DECODE | ++ L2_FHDR_ERRORS_ALIGNMENT | ++ L2_FHDR_ERRORS_TOO_SHORT | ++ L2_FHDR_ERRORS_GIANT_FRAME))) { ++ ++#if defined(__VMKLNX__) && defined(__VMKNETDDI_QUEUEOPS__) ++ bnapi->stats.rx_errors++; ++ ++ if (status & L2_FHDR_ERRORS_BAD_CRC) ++ bnapi->stats.rx_crc_errors++; ++ ++ if (status & ++ (L2_FHDR_ERRORS_TOO_SHORT | ++ L2_FHDR_ERRORS_GIANT_FRAME)) ++ bnapi->stats.rx_frame_errors++; ++#endif ++ ++ bnx2_reuse_rx_skb(bp, rxr, skb, sw_ring_cons, ++ sw_ring_prod); ++ if (pg_ring_used) { ++ int pages; ++ ++ pages = PAGE_ALIGN(len - hdr_len) >> PAGE_SHIFT; ++ ++ bnx2_reuse_rx_skb_pages(bp, rxr, NULL, pages); ++ } ++ goto next_rx; ++ } ++ + len -= 4; + + if (len <= bp->rx_copy_thresh) { +@@ -2931,9 +3308,15 @@ + } + + /* aligned copy */ ++#if (LINUX_VERSION_CODE >= 0x20616) + skb_copy_from_linear_data_offset(skb, + BNX2_RX_OFFSET - 6, + new_skb->data, len + 6); ++#else ++ memcpy(new_skb->data, skb->data + BNX2_RX_OFFSET - 6, ++ len + 6); ++#endif ++ + skb_reserve(new_skb, 6); + skb_put(new_skb, len); + +@@ -2957,7 +3340,7 @@ + struct vlan_ethhdr *ve = (struct vlan_ethhdr *) + __skb_push(skb, 4); + +- memmove(ve, skb->data + 4, ETH_ALEN * 2); ++ bcm_memmove(ve, skb->data + 4, ETH_ALEN * 2); + ve->h_vlan_proto = htons(ETH_P_8021Q); + ve->h_vlan_TCI = htons(vtag); + len += 4; +@@ -2984,6 +3367,8 @@ + skb->ip_summed = CHECKSUM_UNNECESSARY; + } + ++ skb_record_rx_queue(skb, bnapi - &bp->bnx2_napi[0]); ++ + #ifdef BCM_VLAN + if (hw_vlan) + vlan_hwaccel_receive_skb(skb, bp->vlgrp, vtag); +@@ -2991,8 +3376,16 @@ + #endif + netif_receive_skb(skb); + ++#if (LINUX_VERSION_CODE < 0x02061b) || defined(__VMKLNX__) + bp->dev->last_rx = jiffies; ++#endif + rx_pkt++; ++ ++#if defined(__VMKLNX__) && defined(__VMKNETDDI_QUEUEOPS__) ++ /* Update queue specific stats */ ++ bnapi->stats.rx_packets++; ++ bnapi->stats.rx_bytes += len; ++#endif + + next_rx: + sw_cons = NEXT_RX_BD(sw_cons); +@@ -3023,15 +3416,19 @@ + + } + ++#ifdef CONFIG_PCI_MSI + /* MSI ISR - The only difference between this and the INTx ISR + * is that the MSI interrupt is always serviced. + */ + static irqreturn_t ++#if (LINUX_VERSION_CODE >= 0x20613) + bnx2_msi(int irq, void *dev_instance) ++#else ++bnx2_msi(int irq, void *dev_instance, struct pt_regs *regs) ++#endif + { + struct bnx2_napi *bnapi = dev_instance; + struct bnx2 *bp = bnapi->bp; +- struct net_device *dev = bp->dev; + + prefetch(bnapi->status_blk.msi); + REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD, +@@ -3042,17 +3439,24 @@ + if (unlikely(atomic_read(&bp->intr_sem) != 0)) + return IRQ_HANDLED; + +- netif_rx_schedule(dev, &bnapi->napi); ++#ifdef BNX2_NEW_NAPI ++ napi_schedule(&bnapi->napi); ++#else ++ netif_rx_schedule(bp->dev); ++#endif + + return IRQ_HANDLED; + } + + static irqreturn_t ++#if (LINUX_VERSION_CODE >= 0x20613) + bnx2_msi_1shot(int irq, void *dev_instance) ++#else ++bnx2_msi_1shot(int irq, void *dev_instance, struct pt_regs *regs) ++#endif + { + struct bnx2_napi *bnapi = dev_instance; + struct bnx2 *bp = bnapi->bp; +- struct net_device *dev = bp->dev; + + prefetch(bnapi->status_blk.msi); + +@@ -3060,17 +3464,25 @@ + if (unlikely(atomic_read(&bp->intr_sem) != 0)) + return IRQ_HANDLED; + +- netif_rx_schedule(dev, &bnapi->napi); ++#ifdef BNX2_NEW_NAPI ++ napi_schedule(&bnapi->napi); ++#else ++ netif_rx_schedule(bp->dev); ++#endif + + return IRQ_HANDLED; + } ++#endif + + static irqreturn_t ++#if (LINUX_VERSION_CODE >= 0x20613) + bnx2_interrupt(int irq, void *dev_instance) ++#else ++bnx2_interrupt(int irq, void *dev_instance, struct pt_regs *regs) ++#endif + { + struct bnx2_napi *bnapi = dev_instance; + struct bnx2 *bp = bnapi->bp; +- struct net_device *dev = bp->dev; + struct status_block *sblk = bnapi->status_blk.msi; + + /* When using INTx, it is possible for the interrupt to arrive +@@ -3097,10 +3509,17 @@ + if (unlikely(atomic_read(&bp->intr_sem) != 0)) + return IRQ_HANDLED; + +- if (netif_rx_schedule_prep(dev, &bnapi->napi)) { ++#ifdef BNX2_NEW_NAPI ++ if (napi_schedule_prep(&bnapi->napi)) { + bnapi->last_status_idx = sblk->status_idx; +- __netif_rx_schedule(dev, &bnapi->napi); +- } ++ __napi_schedule(&bnapi->napi); ++ } ++#else ++ if (netif_rx_schedule_prep(bp->dev)) { ++ bnapi->last_status_idx = sblk->status_idx; ++ __netif_rx_schedule(bp->dev); ++ } ++#endif + + return IRQ_HANDLED; + } +@@ -3128,6 +3547,11 @@ + if (bnx2_has_fast_work(bnapi)) + return 1; + ++#ifdef BCM_CNIC ++ if (bnapi->cnic_present && (bnapi->cnic_tag != sblk->status_idx)) ++ return 1; ++#endif ++ + if ((sblk->status_attn_bits & STATUS_ATTN_EVENTS) != + (sblk->status_attn_bits_ack & STATUS_ATTN_EVENTS)) + return 1; +@@ -3135,6 +3559,52 @@ + return 0; + } + ++#ifdef CONFIG_PCI_MSI ++static void ++bnx2_chk_missed_msi(struct bnx2 *bp) ++{ ++ struct bnx2_napi *bnapi = &bp->bnx2_napi[0]; ++ u32 msi_ctrl; ++ ++ if (bnx2_has_work(bnapi)) { ++ msi_ctrl = REG_RD(bp, BNX2_PCICFG_MSI_CONTROL); ++ if (!(msi_ctrl & BNX2_PCICFG_MSI_CONTROL_ENABLE)) ++ return; ++ ++ if (bnapi->last_status_idx == bp->idle_chk_status_idx) { ++ REG_WR(bp, BNX2_PCICFG_MSI_CONTROL, msi_ctrl & ++ ~BNX2_PCICFG_MSI_CONTROL_ENABLE); ++ REG_WR(bp, BNX2_PCICFG_MSI_CONTROL, msi_ctrl); ++#if (LINUX_VERSION_CODE >= 0x20613) ++ bnx2_msi(bp->irq_tbl[0].vector, bnapi); ++#else ++ bnx2_msi(bp->irq_tbl[0].vector, bnapi, NULL); ++#endif ++ } ++ } ++ ++ bp->idle_chk_status_idx = bnapi->last_status_idx; ++} ++#endif ++ ++#ifdef BCM_CNIC ++static void bnx2_poll_cnic(struct bnx2 *bp, struct bnx2_napi *bnapi) ++{ ++ struct cnic_ops *c_ops; ++ ++ if (!bnapi->cnic_present) ++ return; ++ ++ rcu_read_lock(); ++ c_ops = rcu_dereference(bp->cnic_ops); ++ if (c_ops) ++ bnapi->cnic_tag = c_ops->cnic_handler(bp->cnic_data, ++ bnapi->status_blk.msi); ++ rcu_read_unlock(); ++} ++#endif ++ ++#ifdef BNX2_NEW_NAPI + static void bnx2_poll_link(struct bnx2 *bp, struct bnx2_napi *bnapi) + { + struct status_block *sblk = bnapi->status_blk.msi; +@@ -3187,7 +3657,7 @@ + rmb(); + if (likely(!bnx2_has_fast_work(bnapi))) { + +- netif_rx_complete(bp->dev, napi); ++ napi_complete(napi); + REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD, bnapi->int_num | + BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID | + bnapi->last_status_idx); +@@ -3209,17 +3679,29 @@ + + work_done = bnx2_poll_work(bp, bnapi, work_done, budget); + +- if (unlikely(work_done >= budget)) +- break; ++#if defined(__VMKLNX__) && defined(__VMKNETDDI_QUEUEOPS__) ++ if ((disable_netq == 0) && ++ (bp->flags & BNX2_FLAG_USING_MSIX) && ++ (CHIP_NUM(bp) == CHIP_NUM_5709)) ++ bnx2_netqueue_service_bnx2_msix(bnapi); ++#endif ++ ++#ifdef BCM_CNIC ++ bnx2_poll_cnic(bp, bnapi); ++#endif + + /* bnapi->last_status_idx is used below to tell the hw how + * much work has been processed, so we must read it before + * checking for more work. + */ + bnapi->last_status_idx = sblk->status_idx; ++ ++ if (unlikely(work_done >= budget)) ++ break; ++ + rmb(); + if (likely(!bnx2_has_work(bnapi))) { +- netif_rx_complete(bp->dev, napi); ++ napi_complete(napi); + if (likely(bp->flags & BNX2_FLAG_USING_MSI_OR_MSIX)) { + REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD, + BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID | +@@ -3241,6 +3723,77 @@ + return work_done; + } + ++#else ++ ++static int ++bnx2_poll(struct net_device *dev, int *budget) ++{ ++ struct bnx2 *bp = netdev_priv(dev); ++ struct bnx2_napi *bnapi = &bp->bnx2_napi[0]; ++ struct bnx2_tx_ring_info *txr = &bnapi->tx_ring; ++ struct bnx2_rx_ring_info *rxr = &bnapi->rx_ring; ++ struct status_block *sblk = bnapi->status_blk.msi; ++ u32 status_attn_bits = sblk->status_attn_bits; ++ u32 status_attn_bits_ack = sblk->status_attn_bits_ack; ++ ++ if ((status_attn_bits & STATUS_ATTN_EVENTS) != ++ (status_attn_bits_ack & STATUS_ATTN_EVENTS)) { ++ ++ bnx2_phy_int(bp, bnapi); ++ ++ /* This is needed to take care of transient status ++ * during link changes. ++ */ ++ REG_WR(bp, BNX2_HC_COMMAND, ++ bp->hc_cmd | BNX2_HC_COMMAND_COAL_NOW_WO_INT); ++ REG_RD(bp, BNX2_HC_COMMAND); ++ } ++ ++ if (bnx2_get_hw_tx_cons(bnapi) != txr->hw_tx_cons) ++ bnx2_tx_int(bp, bnapi, 0); ++ ++ if (bnx2_get_hw_rx_cons(bnapi) != rxr->rx_cons) { ++ int orig_budget = *budget; ++ int work_done; ++ ++ if (orig_budget > dev->quota) ++ orig_budget = dev->quota; ++ ++ work_done = bnx2_rx_int(bp, bnapi, orig_budget); ++ *budget -= work_done; ++ dev->quota -= work_done; ++ } ++ ++#ifdef BCM_CNIC ++ bnx2_poll_cnic(bp, bnapi); ++#endif ++ ++ bnapi->last_status_idx = sblk->status_idx; ++ rmb(); ++ ++ if (!bnx2_has_work(bnapi)) { ++ netif_rx_complete(dev); ++ if (likely(bp->flags & BNX2_FLAG_USING_MSI_OR_MSIX)) { ++ REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD, ++ BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID | ++ bnapi->last_status_idx); ++ return 0; ++ } ++ REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD, ++ BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID | ++ BNX2_PCICFG_INT_ACK_CMD_MASK_INT | ++ bnapi->last_status_idx); ++ ++ REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD, ++ BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID | ++ bnapi->last_status_idx); ++ return 0; ++ } ++ ++ return 1; ++} ++#endif ++ + /* Called with rtnl_lock from vlan functions and also netif_tx_lock + * from set_multicast. + */ +@@ -3249,7 +3802,9 @@ + { + struct bnx2 *bp = netdev_priv(dev); + u32 rx_mode, sort_mode; ++#ifdef HAVE_SET_RX_MODE + struct dev_addr_list *uc_ptr; ++#endif + int i; + + if (!netif_running(dev)) +@@ -3308,6 +3863,7 @@ + sort_mode |= BNX2_RPM_SORT_USER0_MC_HSH_EN; + } + ++#ifdef HAVE_SET_RX_MODE + uc_ptr = NULL; + if (dev->uc_count > BNX2_MAX_UNICAST_ADDRESSES) { + rx_mode |= BNX2_EMAC_RX_MODE_PROMISCUOUS; +@@ -3326,6 +3882,7 @@ + } + + } ++#endif + + if (rx_mode != bp->rx_mode) { + bp->rx_mode = rx_mode; +@@ -3337,6 +3894,83 @@ + REG_WR(bp, BNX2_RPM_SORT_USER0, sort_mode | BNX2_RPM_SORT_USER0_ENA); + + spin_unlock_bh(&bp->phy_lock); ++} ++ ++#define FW_BUF_SIZE 0x10000 ++ ++static int ++bnx2_gunzip_init(struct bnx2 *bp) ++{ ++ if ((bp->gunzip_buf = vmalloc(FW_BUF_SIZE)) == NULL) ++ goto gunzip_nomem1; ++ ++ if ((bp->strm = kmalloc(sizeof(*bp->strm), GFP_KERNEL)) == NULL) ++ goto gunzip_nomem2; ++ ++ bp->strm->workspace = kmalloc(zlib_inflate_workspacesize(), GFP_KERNEL); ++ if (bp->strm->workspace == NULL) ++ goto gunzip_nomem3; ++ ++ return 0; ++ ++gunzip_nomem3: ++ kfree(bp->strm); ++ bp->strm = NULL; ++ ++gunzip_nomem2: ++ vfree(bp->gunzip_buf); ++ bp->gunzip_buf = NULL; ++ ++gunzip_nomem1: ++ printk(KERN_ERR PFX "%s: Cannot allocate firmware buffer for " ++ "uncompression.\n", bp->dev->name); ++ return -ENOMEM; ++} ++ ++static void ++bnx2_gunzip_end(struct bnx2 *bp) ++{ ++ kfree(bp->strm->workspace); ++ ++ kfree(bp->strm); ++ bp->strm = NULL; ++ ++ if (bp->gunzip_buf) { ++ vfree(bp->gunzip_buf); ++ bp->gunzip_buf = NULL; ++ } ++} ++ ++static int ++bnx2_gunzip(struct bnx2 *bp, const u8 *zbuf, ++ int len, void **outbuf, int *outlen) ++{ ++ int rc; ++ ++ bp->strm->next_in = zbuf; ++ bp->strm->avail_in = len; ++ bp->strm->next_out = bp->gunzip_buf; ++ bp->strm->avail_out = FW_BUF_SIZE; ++ ++ rc = zlib_inflateInit2(bp->strm, -MAX_WBITS); ++ if (rc != Z_OK) ++ return rc; ++ ++ rc = zlib_inflate(bp->strm, Z_FINISH); ++ ++ *outlen = FW_BUF_SIZE - bp->strm->avail_out; ++ *outbuf = bp->gunzip_buf; ++ ++ if ((rc != Z_OK) && (rc != Z_STREAM_END)) ++ printk(KERN_ERR PFX "%s: Firmware decompression error: %s\n", ++ bp->dev->name, bp->strm->msg); ++ ++ zlib_inflateEnd(bp->strm); ++ ++ if (rc == Z_STREAM_END) ++ return 0; ++ ++ return rc; + } + + static void +@@ -3393,14 +4027,20 @@ + + /* Load the Text area. */ + offset = cpu_reg->spad_base + (fw->text_addr - cpu_reg->mips_view_base); ++ + if (fw->gz_text) { +- int j; +- +- rc = zlib_inflate_blob(fw->text, FW_BUF_SIZE, fw->gz_text, +- fw->gz_text_len); +- if (rc < 0) ++ u32 text_len; ++ void *text; ++ ++ rc = bnx2_gunzip(bp, fw->gz_text, fw->gz_text_len, &text, ++ &text_len); ++ if (rc) + return rc; + ++ fw->text = text; ++ } ++ if (fw->text) { ++ int j; + for (j = 0; j < (fw->text_len / 4); j++, offset += 4) { + bnx2_reg_wr_ind(bp, offset, le32_to_cpu(fw->text[j])); + } +@@ -3464,13 +4104,15 @@ + bnx2_init_cpus(struct bnx2 *bp) + { + struct fw_info *fw; +- int rc, rv2p_len; +- void *text, *rv2p; ++ int rc = 0, rv2p_len; ++ void *text; ++ const void *rv2p; ++ u32 text_len; ++ ++ if ((rc = bnx2_gunzip_init(bp)) != 0) ++ return rc; + + /* Initialize the RV2P processor. */ +- text = vmalloc(FW_BUF_SIZE); +- if (!text) +- return -ENOMEM; + if (CHIP_NUM(bp) == CHIP_NUM_5709) { + rv2p = bnx2_xi_rv2p_proc1; + rv2p_len = sizeof(bnx2_xi_rv2p_proc1); +@@ -3478,11 +4120,11 @@ + rv2p = bnx2_rv2p_proc1; + rv2p_len = sizeof(bnx2_rv2p_proc1); + } +- rc = zlib_inflate_blob(text, FW_BUF_SIZE, rv2p, rv2p_len); +- if (rc < 0) ++ rc = bnx2_gunzip(bp, rv2p, rv2p_len, &text, &text_len); ++ if (rc) + goto init_cpu_err; + +- load_rv2p_fw(bp, text, rc /* == len */, RV2P_PROC1); ++ load_rv2p_fw(bp, text, text_len, RV2P_PROC1); + + if (CHIP_NUM(bp) == CHIP_NUM_5709) { + rv2p = bnx2_xi_rv2p_proc2; +@@ -3491,11 +4133,11 @@ + rv2p = bnx2_rv2p_proc2; + rv2p_len = sizeof(bnx2_rv2p_proc2); + } +- rc = zlib_inflate_blob(text, FW_BUF_SIZE, rv2p, rv2p_len); +- if (rc < 0) ++ rc = bnx2_gunzip(bp, rv2p, rv2p_len, &text, &text_len); ++ if (rc) + goto init_cpu_err; + +- load_rv2p_fw(bp, text, rc /* == len */, RV2P_PROC2); ++ load_rv2p_fw(bp, text, text_len, RV2P_PROC2); + + /* Initialize the RX Processor. */ + if (CHIP_NUM(bp) == CHIP_NUM_5709) +@@ -3503,7 +4145,6 @@ + else + fw = &bnx2_rxp_fw_06; + +- fw->text = text; + rc = load_cpu_fw(bp, &cpu_reg_rxp, fw); + if (rc) + goto init_cpu_err; +@@ -3514,7 +4155,6 @@ + else + fw = &bnx2_txp_fw_06; + +- fw->text = text; + rc = load_cpu_fw(bp, &cpu_reg_txp, fw); + if (rc) + goto init_cpu_err; +@@ -3525,7 +4165,6 @@ + else + fw = &bnx2_tpat_fw_06; + +- fw->text = text; + rc = load_cpu_fw(bp, &cpu_reg_tpat, fw); + if (rc) + goto init_cpu_err; +@@ -3536,7 +4175,6 @@ + else + fw = &bnx2_com_fw_06; + +- fw->text = text; + rc = load_cpu_fw(bp, &cpu_reg_com, fw); + if (rc) + goto init_cpu_err; +@@ -3547,11 +4185,12 @@ + else + fw = &bnx2_cp_fw_06; + +- fw->text = text; + rc = load_cpu_fw(bp, &cpu_reg_cp, fw); ++ if (rc) ++ goto init_cpu_err; + + init_cpu_err: +- vfree(text); ++ bnx2_gunzip_end(bp); + return rc; + } + +@@ -3572,7 +4211,7 @@ + + if (pmcsr & PCI_PM_CTRL_STATE_MASK) + /* delay required during transition out of D3hot */ +- msleep(20); ++ bnx2_msleep(20); + + val = REG_RD(bp, BNX2_EMAC_MODE); + val |= BNX2_EMAC_MODE_MPKT_RCVD | BNX2_EMAC_MODE_ACPI_RCVD; +@@ -4405,7 +5044,7 @@ + */ + if ((CHIP_ID(bp) == CHIP_ID_5706_A0) || + (CHIP_ID(bp) == CHIP_ID_5706_A1)) +- msleep(20); ++ bnx2_msleep(20); + + /* Reset takes approximate 30 usec */ + for (i = 0; i < 10; i++) { +@@ -4461,7 +5100,7 @@ + static int + bnx2_init_chip(struct bnx2 *bp) + { +- u32 val; ++ u32 val, mtu; + int rc, i; + + /* Make sure the interrupt is not active. */ +@@ -4526,8 +5165,11 @@ + val = REG_RD(bp, BNX2_MQ_CONFIG); + val &= ~BNX2_MQ_CONFIG_KNL_BYP_BLK_SIZE; + val |= BNX2_MQ_CONFIG_KNL_BYP_BLK_SIZE_256; +- if (CHIP_ID(bp) == CHIP_ID_5709_A0 || CHIP_ID(bp) == CHIP_ID_5709_A1) +- val |= BNX2_MQ_CONFIG_HALT_DIS; ++ if (CHIP_NUM(bp) == CHIP_NUM_5709) { ++ val |= BNX2_MQ_CONFIG_BIN_MQ_MODE; ++ if (CHIP_REV(bp) == CHIP_REV_Ax) ++ val |= BNX2_MQ_CONFIG_HALT_DIS; ++ } + + REG_WR(bp, BNX2_MQ_CONFIG, val); + +@@ -4553,13 +5195,24 @@ + REG_WR(bp, BNX2_EMAC_BACKOFF_SEED, val); + + /* Program the MTU. Also include 4 bytes for CRC32. */ +- val = bp->dev->mtu + ETH_HLEN + 4; ++ mtu = bp->dev->mtu; ++ val = mtu + ETH_HLEN + ETH_FCS_LEN; + if (val > (MAX_ETHERNET_PACKET_SIZE + 4)) + val |= BNX2_EMAC_RX_MTU_SIZE_JUMBO_ENA; + REG_WR(bp, BNX2_EMAC_RX_MTU_SIZE, val); + ++ if (mtu < 1500) ++ mtu = 1500; ++ ++ bnx2_reg_wr_ind(bp, BNX2_RBUF_CONFIG, BNX2_RBUF_CONFIG_VAL(mtu)); ++ bnx2_reg_wr_ind(bp, BNX2_RBUF_CONFIG2, BNX2_RBUF_CONFIG2_VAL(mtu)); ++ bnx2_reg_wr_ind(bp, BNX2_RBUF_CONFIG3, BNX2_RBUF_CONFIG3_VAL(mtu)); ++ ++ memset(bp->bnx2_napi[0].status_blk.msi, 0, bp->status_stats_size); + for (i = 0; i < BNX2_MAX_MSIX_VEC; i++) + bp->bnx2_napi[i].last_status_idx = 0; ++ ++ bp->idle_chk_status_idx = 0xffff; + + bp->rx_mode = BNX2_EMAC_RX_MODE_SORT_MODE; + +@@ -4594,7 +5247,7 @@ + REG_WR(bp, BNX2_HC_CMD_TICKS, + (bp->cmd_ticks_int << 16) | bp->cmd_ticks); + +- if (CHIP_NUM(bp) == CHIP_NUM_5708) ++ if (bp->flags & BNX2_FLAG_BROKEN_STATS) + REG_WR(bp, BNX2_HC_STATS_TICKS, 0); + else + REG_WR(bp, BNX2_HC_STATS_TICKS, bp->stats_ticks); +@@ -4615,7 +5268,7 @@ + } + + if (bp->flags & BNX2_FLAG_ONE_SHOT_MSI) +- val |= BNX2_HC_CONFIG_ONE_SHOT; ++ val |= BNX2_HC_CONFIG_ONE_SHOT | BNX2_HC_CONFIG_USE_INT_PARAM; + + REG_WR(bp, BNX2_HC_CONFIG, val); + +@@ -4802,6 +5455,14 @@ + if (CHIP_NUM(bp) == CHIP_NUM_5709) { + val = REG_RD(bp, BNX2_MQ_MAP_L2_5); + REG_WR(bp, BNX2_MQ_MAP_L2_5, val | BNX2_MQ_MAP_L2_5_ARM); ++ ++#if defined(__VMKLNX__) && defined(__VMKNETDDI_QUEUEOPS__) ++ /* Set in the RX context the proper CID location ++ * for the completion ++ */ ++ if(disable_netq == 0) ++ bnx2_ctx_wr(bp, rx_cid_addr, 0x04, 1 << 16); ++#endif + } + + bnx2_ctx_wr(bp, rx_cid_addr, BNX2_L2CTX_PG_BUF_SIZE, 0); +@@ -4925,7 +5586,7 @@ + static void + bnx2_set_rx_ring_size(struct bnx2 *bp, u32 size) + { +- u32 rx_size, rx_space, jumbo_size; ++ u32 rx_size, rx_space; + + /* 8 for CRC and VLAN */ + rx_size = bp->dev->mtu + ETH_HLEN + BNX2_RX_OFFSET + 8; +@@ -4937,10 +5598,11 @@ + bp->rx_pg_ring_size = 0; + bp->rx_max_pg_ring = 0; + bp->rx_max_pg_ring_idx = 0; ++#if !defined(__VMKLNX__) + if ((rx_space > PAGE_SIZE) && !(bp->flags & BNX2_FLAG_JUMBO_BROKEN)) { + int pages = PAGE_ALIGN(bp->dev->mtu - 40) >> PAGE_SHIFT; + +- jumbo_size = size * pages; ++ u32 jumbo_size = size * pages; + if (jumbo_size > MAX_TOTAL_RX_PG_DESC_CNT) + jumbo_size = MAX_TOTAL_RX_PG_DESC_CNT; + +@@ -4951,6 +5613,7 @@ + rx_size = BNX2_RX_COPY_THRESH + BNX2_RX_OFFSET; + bp->rx_copy_thresh = 0; + } ++#endif + + bp->rx_buf_use_size = rx_size; + /* hw alignment */ +@@ -4975,7 +5638,7 @@ + continue; + + for (j = 0; j < TX_DESC_CNT; ) { +- struct sw_bd *tx_buf = &txr->tx_buf_ring[j]; ++ struct sw_tx_bd *tx_buf = &txr->tx_buf_ring[j]; + struct sk_buff *skb = tx_buf->skb; + int k, last; + +@@ -4998,8 +5661,8 @@ + skb_shinfo(skb)->frags[j].size, + PCI_DMA_TODEVICE); + } ++ j += last + 1; + dev_kfree_skb(skb); +- j += k + 1; + } + } + } +@@ -5532,6 +6195,12 @@ + return -ENODEV; + + if (bp->phy_flags & BNX2_PHY_FLAG_REMOTE_PHY_CAP) { ++ int i; ++ ++ for (i = 0; i < 6 && !bp->link_up; i++) { ++ if (bnx2_msleep_interruptible(500)) ++ break; ++ } + if (bp->link_up) + return 0; + return -ENODEV; +@@ -5571,7 +6240,7 @@ + break; + } + +- msleep_interruptible(10); ++ bnx2_msleep_interruptible(10); + } + if (i < 10) + return 0; +@@ -5623,7 +6292,7 @@ + } else if ((bp->link_up == 0) && (bp->autoneg & AUTONEG_SPEED)) { + u32 bmcr; + +- bp->current_interval = bp->timer_interval; ++ bp->current_interval = BNX2_TIMER_INTERVAL; + + bnx2_read_phy(bp, bp->mii_bmcr, &bmcr); + +@@ -5652,7 +6321,7 @@ + bp->phy_flags &= ~BNX2_PHY_FLAG_PARALLEL_DETECT; + } + } else +- bp->current_interval = bp->timer_interval; ++ bp->current_interval = BNX2_TIMER_INTERVAL; + + if (check_link) { + u32 val; +@@ -5693,15 +6362,15 @@ + bnx2_read_phy(bp, bp->mii_bmcr, &bmcr); + if (bmcr & BMCR_ANENABLE) { + bnx2_enable_forced_2g5(bp); +- bp->current_interval = SERDES_FORCED_TIMEOUT; ++ bp->current_interval = BNX2_SERDES_FORCED_TIMEOUT; + } else { + bnx2_disable_forced_2g5(bp); + bp->serdes_an_pending = 2; +- bp->current_interval = bp->timer_interval; ++ bp->current_interval = BNX2_TIMER_INTERVAL; + } + + } else +- bp->current_interval = bp->timer_interval; ++ bp->current_interval = BNX2_TIMER_INTERVAL; + + spin_unlock(&bp->phy_lock); + } +@@ -5717,13 +6386,19 @@ + if (atomic_read(&bp->intr_sem) != 0) + goto bnx2_restart_timer; + ++#ifdef CONFIG_PCI_MSI ++ if ((bp->flags & (BNX2_FLAG_USING_MSI | BNX2_FLAG_ONE_SHOT_MSI)) == ++ BNX2_FLAG_USING_MSI) ++ bnx2_chk_missed_msi(bp); ++#endif ++ + bnx2_send_heart_beat(bp); + + bp->stats_blk->stat_FwRxDrop = + bnx2_reg_rd_ind(bp, BNX2_FW_RX_DROP_COUNT); + + /* workaround occasional corrupted counters */ +- if (CHIP_NUM(bp) == CHIP_NUM_5708 && bp->stats_ticks) ++ if ((bp->flags & BNX2_FLAG_BROKEN_STATS) && bp->stats_ticks) + REG_WR(bp, BNX2_HC_COMMAND, bp->hc_cmd | + BNX2_HC_COMMAND_STATS_NOW); + +@@ -5773,19 +6448,25 @@ + free_irq(irq->vector, &bp->bnx2_napi[i]); + irq->requested = 0; + } ++#ifdef CONFIG_PCI_MSI + if (bp->flags & BNX2_FLAG_USING_MSI) + pci_disable_msi(bp->pdev); + else if (bp->flags & BNX2_FLAG_USING_MSIX) + pci_disable_msix(bp->pdev); + + bp->flags &= ~(BNX2_FLAG_USING_MSI_OR_MSIX | BNX2_FLAG_ONE_SHOT_MSI); +-} +- ++#endif ++} ++ ++#ifdef CONFIG_PCI_MSI + static void + bnx2_enable_msix(struct bnx2 *bp, int msix_vecs) + { ++#ifdef BNX2_NEW_NAPI + int i, rc; + struct msix_entry msix_ent[BNX2_MAX_MSIX_VEC]; ++ struct net_device *dev = bp->dev; ++ const int len = sizeof(bp->irq_tbl[0].name); + + bnx2_setup_msix_tbl(bp); + REG_WR(bp, BNX2_PCI_MSIX_CONTROL, BNX2_MAX_MSIX_HW_VEC - 1); +@@ -5795,9 +6476,6 @@ + for (i = 0; i < BNX2_MAX_MSIX_VEC; i++) { + msix_ent[i].entry = i; + msix_ent[i].vector = 0; +- +- strcpy(bp->irq_tbl[i].name, bp->dev->name); +- bp->irq_tbl[i].handler = bnx2_msi_1shot; + } + + rc = pci_enable_msix(bp->pdev, msix_ent, BNX2_MAX_MSIX_VEC); +@@ -5806,21 +6484,36 @@ + + bp->irq_nvecs = msix_vecs; + bp->flags |= BNX2_FLAG_USING_MSIX | BNX2_FLAG_ONE_SHOT_MSI; +- for (i = 0; i < BNX2_MAX_MSIX_VEC; i++) ++ for (i = 0; i < BNX2_MAX_MSIX_VEC; i++) { + bp->irq_tbl[i].vector = msix_ent[i].vector; +-} ++ snprintf(bp->irq_tbl[i].name, len, "%s-%d", dev->name, i); ++ bp->irq_tbl[i].handler = bnx2_msi_1shot; ++ } ++#endif ++} ++#endif + + static void + bnx2_setup_int_mode(struct bnx2 *bp, int dis_msi) + { ++#ifdef CONFIG_PCI_MSI + int cpus = num_online_cpus(); ++#if defined(__VMKLNX__) && defined(__VMKNETDDI_QUEUEOPS__) ++ int max_rings = (bp->dev->mtu <= 1500) ? RX_MAX_RINGS : 4; ++ int msix_vecs = min(cpus + 1, max_rings); ++ if(force_netq >= 2) ++ msix_vecs = min(force_netq, RX_MAX_RINGS); ++#else + int msix_vecs = min(cpus + 1, RX_MAX_RINGS); ++#endif ++#endif + + bp->irq_tbl[0].handler = bnx2_interrupt; + strcpy(bp->irq_tbl[0].name, bp->dev->name); + bp->irq_nvecs = 1; + bp->irq_tbl[0].vector = bp->pdev->irq; + ++#ifdef CONFIG_PCI_MSI + if ((bp->flags & BNX2_FLAG_MSIX_CAP) && !dis_msi && cpus > 1) + bnx2_enable_msix(bp, msix_vecs); + +@@ -5837,10 +6530,28 @@ + bp->irq_tbl[0].vector = bp->pdev->irq; + } + } +- ++#endif ++#ifdef BCM_CNIC ++ spin_lock(&bp->cnic_lock); ++ bnx2_setup_cnic_irq_info(bp); ++ spin_unlock(&bp->cnic_lock); ++#endif ++ ++#ifndef BCM_HAVE_MULTI_QUEUE ++ bp->num_tx_rings = 1; ++#else ++#if defined(__VMKLNX__) ++#if defined(__VMKNETDDI_QUEUEOPS__) ++ bp->num_tx_rings = bp->irq_nvecs; ++ bp->dev->real_num_tx_queues = bp->num_tx_rings; ++#else ++ bp->num_tx_rings = 1; ++#endif ++#else + bp->num_tx_rings = rounddown_pow_of_two(bp->irq_nvecs); ++#endif + bp->dev->real_num_tx_queues = bp->num_tx_rings; +- ++#endif + bp->num_rx_rings = bp->irq_nvecs; + } + +@@ -5857,7 +6568,9 @@ + bnx2_disable_int(bp); + + bnx2_setup_int_mode(bp, disable_msi); ++#ifdef BNX2_NEW_NAPI + bnx2_napi_enable(bp); ++#endif + rc = bnx2_alloc_mem(bp); + if (rc) + goto open_err; +@@ -5876,6 +6589,7 @@ + + bnx2_enable_int(bp); + ++#ifdef CONFIG_PCI_MSI + if (bp->flags & BNX2_FLAG_USING_MSI) { + /* Test MSI to make sure it is working + * If MSI test fails, go back to INTx mode +@@ -5904,17 +6618,32 @@ + bnx2_enable_int(bp); + } + } ++ ++#if defined(__VMKLNX__) && defined(__VMKNETDDI_QUEUEOPS__) ++ if ((disable_netq == 0) && ++ (bp->flags & BNX2_FLAG_USING_MSIX) && ++ (CHIP_NUM(bp) == CHIP_NUM_5709)) { ++ rc = bnx2_start_netqueue_hw(bp); ++ ++ if (rc != 0) ++ goto open_err; ++ } ++#endif ++ + if (bp->flags & BNX2_FLAG_USING_MSI) + printk(KERN_INFO PFX "%s: using MSI\n", dev->name); + else if (bp->flags & BNX2_FLAG_USING_MSIX) + printk(KERN_INFO PFX "%s: using MSIX\n", dev->name); ++#endif + + netif_tx_start_all_queues(dev); + + return 0; + + open_err: ++#ifdef BNX2_NEW_NAPI + bnx2_napi_disable(bp); ++#endif + bnx2_free_skbs(bp); + bnx2_free_irq(bp); + bnx2_free_mem(bp); +@@ -5922,9 +6651,17 @@ + } + + static void ++#if defined(INIT_DELAYED_WORK_DEFERRABLE) || defined(INIT_WORK_NAR) + bnx2_reset_task(struct work_struct *work) +-{ ++#else ++bnx2_reset_task(void *data) ++#endif ++{ ++#if defined(INIT_DELAYED_WORK_DEFERRABLE) || defined(INIT_WORK_NAR) + struct bnx2 *bp = container_of(work, struct bnx2, reset_task); ++#else ++ struct bnx2 *bp = data; ++#endif + + if (!netif_running(bp->dev)) + return; +@@ -5943,7 +6680,11 @@ + struct bnx2 *bp = netdev_priv(dev); + + /* This allows the netif to be shutdown gracefully before resetting */ ++#if (LINUX_VERSION_CODE >= 0x20600) + schedule_work(&bp->reset_task); ++#else ++ schedule_task(&bp->reset_task); ++#endif + } + + #ifdef BCM_VLAN +@@ -5953,15 +6694,43 @@ + { + struct bnx2 *bp = netdev_priv(dev); + +- bnx2_netif_stop(bp); ++ if (netif_running(dev)) ++ bnx2_netif_stop(bp); + + bp->vlgrp = vlgrp; ++ ++ if (!netif_running(dev)) ++ return; ++ + bnx2_set_rx_mode(dev); + if (bp->flags & BNX2_FLAG_CAN_KEEP_VLAN) + bnx2_fw_sync(bp, BNX2_DRV_MSG_CODE_KEEP_VLAN_UPDATE, 0, 1); + + bnx2_netif_start(bp); + } ++ ++#if (LINUX_VERSION_CODE < 0x20616) ++/* Called with rtnl_lock */ ++static void ++bnx2_vlan_rx_kill_vid(struct net_device *dev, uint16_t vid) ++{ ++ struct bnx2 *bp = netdev_priv(dev); ++ ++ if (netif_running(dev)) ++ bnx2_netif_stop(bp); ++ ++ vlan_group_set_device(bp->vlgrp, vid, NULL); ++ ++ if (!netif_running(dev)) ++ return; ++ ++ bnx2_set_rx_mode(dev); ++ if (bp->flags & BNX2_FLAG_CAN_KEEP_VLAN) ++ bnx2_fw_sync(bp, BNX2_DRV_MSG_CODE_KEEP_VLAN_UPDATE, 0, 1); ++ ++ bnx2_netif_start(bp); ++} ++#endif + #endif + + /* Called with netif_tx_lock. +@@ -5974,10 +6743,14 @@ + struct bnx2 *bp = netdev_priv(dev); + dma_addr_t mapping; + struct tx_bd *txbd; +- struct sw_bd *tx_buf; ++ struct sw_tx_bd *tx_buf; + u32 len, vlan_tag_flags, last_frag, mss; + u16 prod, ring_prod; + int i; ++#ifndef BCM_HAVE_MULTI_QUEUE ++ struct bnx2_napi *bnapi = &bp->bnx2_napi[0]; ++ struct bnx2_tx_ring_info *txr = &bnapi->tx_ring; ++#else + struct bnx2_napi *bnapi; + struct bnx2_tx_ring_info *txr; + struct netdev_queue *txq; +@@ -5987,10 +6760,15 @@ + bnapi = &bp->bnx2_napi[i]; + txr = &bnapi->tx_ring; + txq = netdev_get_tx_queue(dev, i); ++#endif + + if (unlikely(bnx2_tx_avail(bp, txr) < + (skb_shinfo(skb)->nr_frags + 1))) { ++#ifndef BCM_HAVE_MULTI_QUEUE ++ netif_stop_queue(dev); ++#else + netif_tx_stop_queue(txq); ++#endif + printk(KERN_ERR PFX "%s: BUG! Tx ring full when queue awake!\n", + dev->name); + +@@ -6011,14 +6789,20 @@ + (TX_BD_FLAGS_VLAN_TAG | (vlan_tx_tag_get(skb) << 16)); + } + #endif ++#ifdef BCM_TSO + if ((mss = skb_shinfo(skb)->gso_size)) { +- u32 tcp_opt_len, ip_tcp_len; ++ u32 tcp_opt_len; + struct iphdr *iph; + ++ tcp_opt_len = tcp_optlen(skb); ++ ++ if (skb_transport_offset(skb) + tcp_opt_len + ++ sizeof(struct tcphdr) + mss >= skb->len) ++ goto abort_tso; ++ + vlan_tag_flags |= TX_BD_FLAGS_SW_LSO; + +- tcp_opt_len = tcp_optlen(skb); +- ++#ifndef BCM_NO_TSO6 + if (skb_shinfo(skb)->gso_type & SKB_GSO_TCPV6) { + u32 tcp_off = skb_transport_offset(skb) - + sizeof(struct ipv6hdr) - ETH_HLEN; +@@ -6035,31 +6819,32 @@ + TX_BD_FLAGS_TCP6_OFF4_SHL); + mss |= (tcp_off & 0xc) << TX_BD_TCP6_OFF2_SHL; + } +- } else { +- if (skb_header_cloned(skb) && +- pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) { +- dev_kfree_skb(skb); +- return NETDEV_TX_OK; +- } +- +- ip_tcp_len = ip_hdrlen(skb) + sizeof(struct tcphdr); +- ++ } else ++#endif ++ { + iph = ip_hdr(skb); +- iph->check = 0; +- iph->tot_len = htons(mss + ip_tcp_len + tcp_opt_len); +- tcp_hdr(skb)->check = ~csum_tcpudp_magic(iph->saddr, +- iph->daddr, 0, +- IPPROTO_TCP, +- 0); + if (tcp_opt_len || (iph->ihl > 5)) { + vlan_tag_flags |= ((iph->ihl - 5) + + (tcp_opt_len >> 2)) << 8; + } + } +- } else ++ } ++ else ++abort_tso: ++#endif ++ { + mss = 0; ++ } + + mapping = pci_map_single(bp->pdev, skb->data, len, PCI_DMA_TODEVICE); ++#if (LINUX_VERSION_CODE >= 0x02061b) ++ if (pci_dma_mapping_error(bp->pdev, mapping)) { ++#else ++ if (pci_dma_mapping_error(mapping)) { ++#endif ++ dev_kfree_skb(skb); ++ return NETDEV_TX_OK; ++ } + + tx_buf = &txr->tx_buf_ring[ring_prod]; + tx_buf->skb = skb; +@@ -6073,6 +6858,8 @@ + txbd->tx_bd_vlan_tag_flags = vlan_tag_flags | TX_BD_FLAGS_START; + + last_frag = skb_shinfo(skb)->nr_frags; ++ tx_buf->nr_frags = last_frag; ++ tx_buf->is_gso = skb_is_gso(skb); + + for (i = 0; i < last_frag; i++) { + skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; +@@ -6107,9 +6894,17 @@ + dev->trans_start = jiffies; + + if (unlikely(bnx2_tx_avail(bp, txr) <= MAX_SKB_FRAGS)) { ++#ifndef BCM_HAVE_MULTI_QUEUE ++ netif_stop_queue(dev); ++#else + netif_tx_stop_queue(txq); ++#endif + if (bnx2_tx_avail(bp, txr) > bp->tx_wake_thresh) ++#ifndef BCM_HAVE_MULTI_QUEUE ++ netif_wake_queue(dev); ++#else + netif_tx_wake_queue(txq); ++#endif + } + + return NETDEV_TX_OK; +@@ -6121,10 +6916,21 @@ + { + struct bnx2 *bp = netdev_priv(dev); + ++#if defined(__VMKLNX__) && defined(__VMKNETDDI_QUEUEOPS__) ++ if ((disable_netq == 0) && ++ (bp->flags & BNX2_FLAG_USING_MSIX) && ++ (CHIP_NUM(bp) == CHIP_NUM_5709)) ++ bnx2_stop_netqueue_hw(bp); ++#endif ++ ++#if (LINUX_VERSION_CODE >= 0x20616) + cancel_work_sync(&bp->reset_task); ++#endif + + bnx2_disable_int_sync(bp); ++#ifdef BNX2_NEW_NAPI + bnx2_napi_disable(bp); ++#endif + del_timer_sync(&bp->timer); + bnx2_shutdown_chip(bp); + bnx2_free_irq(bp); +@@ -6390,6 +7196,11 @@ + strcpy(info->version, DRV_MODULE_VERSION); + strcpy(info->bus_info, pci_name(bp->pdev)); + strcpy(info->fw_version, bp->fw_version); ++ ++#if defined(VMWARE_ESX_DDK_VERSION) && \ ++ (VMWARE_ESX_DDK_VERSION >= 35000) && (VMWARE_ESX_DDK_VERSION < 40000) ++ info->eedump_len = bnx2_get_eeprom_len(dev); ++#endif + } + + #define BNX2_REGDUMP_LEN (32 * 1024) +@@ -6517,11 +7328,11 @@ + bnx2_write_phy(bp, bp->mii_bmcr, BMCR_LOOPBACK); + spin_unlock_bh(&bp->phy_lock); + +- msleep(20); ++ bnx2_msleep(20); + + spin_lock_bh(&bp->phy_lock); + +- bp->current_interval = SERDES_AN_TIMEOUT; ++ bp->current_interval = BNX2_SERDES_AN_TIMEOUT; + bp->serdes_an_pending = 1; + mod_timer(&bp->timer, jiffies + bp->current_interval); + } +@@ -6535,6 +7346,9 @@ + return 0; + } + ++#if (LINUX_VERSION_CODE >= 0x20418) || \ ++ (defined(VMWARE_ESX_DDK_VERSION) && \ ++ ((VMWARE_ESX_DDK_VERSION >= 35000) && (VMWARE_ESX_DDK_VERSION < 40000))) + static int + bnx2_get_eeprom_len(struct net_device *dev) + { +@@ -6545,7 +7359,9 @@ + + return (int) bp->flash_size; + } +- ++#endif ++ ++#ifdef ETHTOOL_GEEPROM + static int + bnx2_get_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom, + u8 *eebuf) +@@ -6562,7 +7378,9 @@ + + return rc; + } +- ++#endif ++ ++#ifdef ETHTOOL_SEEPROM + static int + bnx2_set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom, + u8 *eebuf) +@@ -6579,6 +7397,7 @@ + + return rc; + } ++#endif + + static int + bnx2_get_coalesce(struct net_device *dev, struct ethtool_coalesce *coal) +@@ -6634,7 +7453,7 @@ + 0xff; + + bp->stats_ticks = coal->stats_block_coalesce_usecs; +- if (CHIP_NUM(bp) == CHIP_NUM_5708) { ++ if (bp->flags & BNX2_FLAG_BROKEN_STATS) { + if (bp->stats_ticks != 0 && bp->stats_ticks != USEC_PER_SEC) + bp->stats_ticks = USEC_PER_SEC; + } +@@ -6763,6 +7582,7 @@ + return 0; + } + ++#ifdef BCM_TSO + static int + bnx2_set_tso(struct net_device *dev, u32 data) + { +@@ -6777,12 +7597,11 @@ + NETIF_F_TSO_ECN); + return 0; + } +- +-#define BNX2_NUM_STATS 46 ++#endif + + static struct { + char string[ETH_GSTRING_LEN]; +-} bnx2_stats_str_arr[BNX2_NUM_STATS] = { ++} bnx2_stats_str_arr[] = { + { "rx_bytes" }, + { "rx_error_bytes" }, + { "tx_bytes" }, +@@ -6829,7 +7648,61 @@ + { "rx_filtered_packets" }, + { "rx_discards" }, + { "rx_fw_discards" }, +-}; ++#if defined(__VMKLNX__) && defined(__VMKNETDDI_QUEUEOPS__) ++ { "[0] rx_packets" }, ++ { "[0] rx_bytes" }, ++ { "[0] rx_errors" }, ++ { "[0] tx_packets" }, ++ { "[0] tx_bytes" }, ++ { "[1] rx_packets" }, ++ { "[1] rx_bytes" }, ++ { "[1] rx_errors" }, ++ { "[1] tx_packets" }, ++ { "[1] tx_bytes" }, ++ { "[2] rx_packets" }, ++ { "[2] rx_bytes" }, ++ { "[2] rx_errors" }, ++ { "[2] tx_packets" }, ++ { "[2] tx_bytes" }, ++ { "[3] rx_packets" }, ++ { "[3] rx_bytes" }, ++ { "[3] rx_errors" }, ++ { "[3] tx_packets" }, ++ { "[3] tx_bytes" }, ++ { "[4] rx_packets" }, ++ { "[4] rx_bytes" }, ++ { "[4] rx_errors" }, ++ { "[4] tx_packets" }, ++ { "[4] tx_bytes" }, ++ { "[5] rx_packets" }, ++ { "[5] rx_bytes" }, ++ { "[5] rx_errors" }, ++ { "[5] tx_packets" }, ++ { "[5] tx_bytes" }, ++ { "[6] rx_packets" }, ++ { "[6] rx_bytes" }, ++ { "[6] rx_errors" }, ++ { "[6] tx_packets" }, ++ { "[6] tx_bytes" }, ++ { "[7] rx_packets" }, ++ { "[7] rx_bytes" }, ++ { "[7] rx_errors" }, ++ { "[7] tx_packets" }, ++ { "[7] tx_bytes" }, ++ { "[8] rx_packets" }, ++ { "[8] rx_bytes" }, ++ { "[8] rx_errors" }, ++ { "[8] tx_packets" }, ++ { "[8] tx_bytes" }, ++#endif ++}; ++ ++#define BNX2_NUM_STATS (sizeof(bnx2_stats_str_arr)/\ ++ sizeof(bnx2_stats_str_arr[0])) ++ ++#if defined(__VMKLNX__) && defined(__VMKNETDDI_QUEUEOPS__) ++#define BNX2_NUM_NETQ_STATS 45 ++#endif + + #define STATS_OFFSET32(offset_name) (offsetof(struct statistics_block, offset_name) / 4) + +@@ -6914,6 +7787,7 @@ + { "link_test (online)" }, + }; + ++#ifdef ETHTOOL_GFLAGS + static int + bnx2_get_sset_count(struct net_device *dev, int sset) + { +@@ -6926,6 +7800,13 @@ + return -EOPNOTSUPP; + } + } ++#else ++static int ++bnx2_self_test_count(struct net_device *dev) ++{ ++ return BNX2_NUM_TESTS; ++} ++#endif + + static void + bnx2_self_test(struct net_device *dev, struct ethtool_test *etest, u64 *buf) +@@ -6964,7 +7845,7 @@ + for (i = 0; i < 7; i++) { + if (bp->link_up) + break; +- msleep_interruptible(1000); ++ bnx2_msleep_interruptible(1000); + } + } + +@@ -7001,6 +7882,14 @@ + } + } + ++#ifndef ETHTOOL_GFLAGS ++static int ++bnx2_get_stats_count(struct net_device *dev) ++{ ++ return BNX2_NUM_STATS; ++} ++#endif ++ + static void + bnx2_get_ethtool_stats(struct net_device *dev, + struct ethtool_stats *stats, u64 *buf) +@@ -7022,8 +7911,11 @@ + stats_len_arr = bnx2_5706_stats_len_arr; + else + stats_len_arr = bnx2_5708_stats_len_arr; +- ++#if defined(__VMKLNX__) && defined(__VMKNETDDI_QUEUEOPS__) ++ for (i = 0; i < BNX2_NUM_STATS - BNX2_NUM_NETQ_STATS; i++) { ++#else + for (i = 0; i < BNX2_NUM_STATS; i++) { ++#endif + if (stats_len_arr[i] == 0) { + /* skip this counter */ + buf[i] = 0; +@@ -7040,6 +7932,23 @@ + bnx2_stats_offset_arr[i])) << 32) + + *(hw_stats + bnx2_stats_offset_arr[i] + 1); + } ++ ++#if defined(__VMKLNX__) && defined(__VMKNETDDI_QUEUEOPS__) ++ /* Copy over the NetQ specific statistics */ ++ { ++ int j; ++ ++ for (j = 0; j < BNX2_MAX_MSIX_VEC; j++) { ++ struct bnx2_napi *bnapi = &bp->bnx2_napi[j]; ++ ++ buf[i + (j*5) + 0] = (u64) (bnapi->stats.rx_packets); ++ buf[i + (j*5) + 1] = (u64) (bnapi->stats.rx_bytes); ++ buf[i + (j*5) + 2] = (u64) (bnapi->stats.rx_errors); ++ buf[i + (j*5) + 3] = (u64) (bnapi->stats.tx_packets); ++ buf[i + (j*5) + 4] = (u64) (bnapi->stats.tx_bytes); ++ } ++ } ++#endif + } + + static int +@@ -7069,7 +7978,7 @@ + BNX2_EMAC_LED_TRAFFIC_OVERRIDE | + BNX2_EMAC_LED_TRAFFIC); + } +- msleep_interruptible(500); ++ bnx2_msleep_interruptible(500); + if (signal_pending(current)) + break; + } +@@ -7082,18 +7991,26 @@ + return 0; + } + ++#if (LINUX_VERSION_CODE >= 0x20418) + static int + bnx2_set_tx_csum(struct net_device *dev, u32 data) + { + struct bnx2 *bp = netdev_priv(dev); + + if (CHIP_NUM(bp) == CHIP_NUM_5709) ++#if (LINUX_VERSION_CODE < 0x2060c) ++ return (bnx2_set_tx_hw_csum(dev, data)); ++#elif (LINUX_VERSION_CODE >= 0x20617) + return (ethtool_op_set_tx_ipv6_csum(dev, data)); ++#else ++ return (ethtool_op_set_tx_hw_csum(dev, data)); ++#endif + else + return (ethtool_op_set_tx_csum(dev, data)); + } +- +-static const struct ethtool_ops bnx2_ethtool_ops = { ++#endif ++ ++static struct ethtool_ops bnx2_ethtool_ops = { + .get_settings = bnx2_get_settings, + .set_settings = bnx2_set_settings, + .get_drvinfo = bnx2_get_drvinfo, +@@ -7103,9 +8020,15 @@ + .set_wol = bnx2_set_wol, + .nway_reset = bnx2_nway_reset, + .get_link = ethtool_op_get_link, ++#if (LINUX_VERSION_CODE >= 0x20418) + .get_eeprom_len = bnx2_get_eeprom_len, ++#endif ++#ifdef ETHTOOL_GEEPROM + .get_eeprom = bnx2_get_eeprom, ++#endif ++#ifdef ETHTOOL_SEEPROM + .set_eeprom = bnx2_set_eeprom, ++#endif + .get_coalesce = bnx2_get_coalesce, + .set_coalesce = bnx2_set_coalesce, + .get_ringparam = bnx2_get_ringparam, +@@ -7114,21 +8037,45 @@ + .set_pauseparam = bnx2_set_pauseparam, + .get_rx_csum = bnx2_get_rx_csum, + .set_rx_csum = bnx2_set_rx_csum, ++ .get_tx_csum = ethtool_op_get_tx_csum, ++#if (LINUX_VERSION_CODE >= 0x20418) + .set_tx_csum = bnx2_set_tx_csum, ++#endif ++ .get_sg = ethtool_op_get_sg, + .set_sg = ethtool_op_set_sg, ++#ifdef BCM_TSO ++ .get_tso = ethtool_op_get_tso, + .set_tso = bnx2_set_tso, ++#endif ++#ifndef ETHTOOL_GFLAGS ++ .self_test_count = bnx2_self_test_count, ++#endif + .self_test = bnx2_self_test, + .get_strings = bnx2_get_strings, + .phys_id = bnx2_phys_id, ++#ifndef ETHTOOL_GFLAGS ++ .get_stats_count = bnx2_get_stats_count, ++#endif + .get_ethtool_stats = bnx2_get_ethtool_stats, ++#ifdef ETHTOOL_GPERMADDR ++#if (LINUX_VERSION_CODE < 0x020617) ++ .get_perm_addr = ethtool_op_get_perm_addr, ++#endif ++#endif ++#ifdef ETHTOOL_GFLAGS + .get_sset_count = bnx2_get_sset_count, ++#endif + }; + + /* Called with rtnl_lock */ + static int + bnx2_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) + { ++#if (LINUX_VERSION_CODE >= 0x020607) + struct mii_ioctl_data *data = if_mii(ifr); ++#else ++ struct mii_ioctl_data *data = (struct mii_ioctl_data *) &ifr->ifr_ifru; ++#endif + struct bnx2 *bp = netdev_priv(dev); + int err; + +@@ -7215,9 +8162,32 @@ + { + struct bnx2 *bp = netdev_priv(dev); + +- disable_irq(bp->pdev->irq); +- bnx2_interrupt(bp->pdev->irq, dev); +- enable_irq(bp->pdev->irq); ++#if defined(RED_HAT_LINUX_KERNEL) && (LINUX_VERSION_CODE < 0x020600) ++ if (netdump_mode) { ++ bnx2_interrupt(bp->pdev->irq, &bp->bnx2_napi[0], NULL); ++ if (dev->poll_list.prev) { ++ int budget = 64; ++ ++ bnx2_poll(dev, &budget); ++ } ++ } ++ else ++#endif ++ { ++ int i; ++ ++ for (i = 0; i < bp->irq_nvecs; i++) { ++ unsigned int irq = bp->irq_tbl[i].vector; ++ ++ disable_irq(irq); ++#if (LINUX_VERSION_CODE >= 0x20613) ++ bnx2_interrupt(irq, &bp->bnx2_napi[i]); ++#else ++ bnx2_interrupt(irq, &bp->bnx2_napi[i], NULL); ++#endif ++ enable_irq(irq); ++ } ++ } + } + #endif + +@@ -7320,7 +8290,12 @@ + u32 reg; + u64 dma_mask, persist_dma_mask; + ++#if (LINUX_VERSION_CODE < 0x20610) ++ SET_MODULE_OWNER(dev); ++#endif ++#if (LINUX_VERSION_CODE >= 0x20419) + SET_NETDEV_DEV(dev, &pdev->dev); ++#endif + bp = netdev_priv(dev); + + bp->flags = 0; +@@ -7347,7 +8322,9 @@ + } + + pci_set_master(pdev); ++#if (LINUX_VERSION_CODE >= 0x020611) + pci_save_state(pdev); ++#endif + + bp->pm_cap = pci_find_capability(pdev, PCI_CAP_ID_PM); + if (bp->pm_cap == 0) { +@@ -7362,10 +8339,26 @@ + + spin_lock_init(&bp->phy_lock); + spin_lock_init(&bp->indirect_lock); ++ spin_lock_init(&bp->cnic_lock); ++#if (LINUX_VERSION_CODE >= 0x20600) ++#if defined(INIT_DELAYED_WORK_DEFERRABLE) || defined(INIT_WORK_NAR) + INIT_WORK(&bp->reset_task, bnx2_reset_task); ++#else ++ INIT_WORK(&bp->reset_task, bnx2_reset_task, bp); ++#endif ++#else ++ INIT_TQUEUE(&bp->reset_task, bnx2_reset_task, bp); ++#endif + + dev->base_addr = dev->mem_start = pci_resource_start(pdev, 0); +- mem_len = MB_GET_CID_ADDR(TX_TSS_CID + TX_MAX_TSS_RINGS); ++#if defined(__VMKLNX__) && defined(__VMKNETDDI_QUEUEOPS__) ++ if(disable_netq == 0) ++ mem_len = MB_GET_CID_ADDR(NETQUEUE_KCQ_CID + 2); ++ else ++ mem_len = MB_GET_CID_ADDR(TX_TSS_CID + TX_MAX_TSS_RINGS + 1); ++#else ++ mem_len = MB_GET_CID_ADDR(TX_TSS_CID + TX_MAX_TSS_RINGS + 1); ++#endif + dev->mem_end = dev->mem_start + mem_len; + dev->irq = pdev->irq; + +@@ -7407,12 +8400,15 @@ + rc = -EIO; + goto err_out_unmap; + } +- } +- ++ bp->flags |= BNX2_FLAG_BROKEN_STATS; ++ } ++ ++#ifdef CONFIG_PCI_MSI + if (CHIP_NUM(bp) == CHIP_NUM_5709 && CHIP_REV(bp) != CHIP_REV_Ax) { + if (pci_find_capability(pdev, PCI_CAP_ID_MSIX)) + bp->flags |= BNX2_FLAG_MSIX_CAP; + } ++#endif + + if (CHIP_ID(bp) != CHIP_ID_5706_A0 && CHIP_ID(bp) != CHIP_ID_5706_A1) { + if (pci_find_capability(pdev, PCI_CAP_ID_MSI)) +@@ -7505,7 +8501,7 @@ + reg = bnx2_shmem_rd(bp, BNX2_BC_STATE_CONDITION); + if (reg & BNX2_CONDITION_MFW_RUN_MASK) + break; +- msleep(10); ++ bnx2_msleep(10); + } + } + reg = bnx2_shmem_rd(bp, BNX2_BC_STATE_CONDITION); +@@ -7538,20 +8534,19 @@ + + bp->rx_csum = 1; + +- bp->tx_quick_cons_trip_int = 20; ++ bp->tx_quick_cons_trip_int = 2; + bp->tx_quick_cons_trip = 20; +- bp->tx_ticks_int = 80; ++ bp->tx_ticks_int = 18; + bp->tx_ticks = 80; + +- bp->rx_quick_cons_trip_int = 6; +- bp->rx_quick_cons_trip = 6; ++ bp->rx_quick_cons_trip_int = 2; ++ bp->rx_quick_cons_trip = 12; + bp->rx_ticks_int = 18; + bp->rx_ticks = 18; + + bp->stats_ticks = USEC_PER_SEC & BNX2_HC_STATS_TICKS_HC_STAT_TICKS; + +- bp->timer_interval = HZ; +- bp->current_interval = HZ; ++ bp->current_interval = BNX2_TIMER_INTERVAL; + + bp->phy_addr = 1; + +@@ -7594,7 +8589,8 @@ + + if ((CHIP_ID(bp) == CHIP_ID_5708_A0) || + (CHIP_ID(bp) == CHIP_ID_5708_B0) || +- (CHIP_ID(bp) == CHIP_ID_5708_B1)) { ++ (CHIP_ID(bp) == CHIP_ID_5708_B1) || ++ !(REG_RD(bp, BNX2_PCI_CONFIG_3) & BNX2_PCI_CONFIG_3_VAUX_PRESET)) { + bp->flags |= BNX2_FLAG_NO_WOL; + bp->wol = 0; + } +@@ -7611,6 +8607,7 @@ + bp->cmd_ticks_int = bp->cmd_ticks; + } + ++#ifdef CONFIG_PCI_MSI + /* Disable MSI on 5706 if AMD 8132 bridge is found. + * + * MSI is defined to be 32-bit write. The 5706 does 64-bit MSI writes +@@ -7627,21 +8624,22 @@ + while ((amd_8132 = pci_get_device(PCI_VENDOR_ID_AMD, + PCI_DEVICE_ID_AMD_8132_BRIDGE, + amd_8132))) { +- +- if (amd_8132->revision >= 0x10 && +- amd_8132->revision <= 0x13) { ++ u8 rev; ++ ++ pci_read_config_byte(amd_8132, PCI_REVISION_ID, &rev); ++ if (rev >= 0x10 && rev <= 0x13) { + disable_msi = 1; + pci_dev_put(amd_8132); + break; + } + } + } +- ++#endif + bnx2_set_default_link(bp); + bp->req_flow_ctrl = FLOW_CTRL_RX | FLOW_CTRL_TX; + + init_timer(&bp->timer); +- bp->timer.expires = RUN_AT(bp->timer_interval); ++ bp->timer.expires = RUN_AT(BNX2_TIMER_INTERVAL); + bp->timer.data = (unsigned long) bp; + bp->timer.function = bnx2_timer; + +@@ -7691,6 +8689,7 @@ + + for (i = 0; i < BNX2_MAX_MSIX_VEC; i++) { + struct bnx2_napi *bnapi = &bp->bnx2_napi[i]; ++#ifdef BNX2_NEW_NAPI + int (*poll)(struct napi_struct *, int); + + if (i == 0) +@@ -7699,9 +8698,36 @@ + poll = bnx2_poll_msix; + + netif_napi_add(bp->dev, &bp->bnx2_napi[i].napi, poll, 64); ++#endif ++ + bnapi->bp = bp; + } +-} ++#ifndef BNX2_NEW_NAPI ++ bp->dev->poll = bnx2_poll; ++ bp->dev->weight = 64; ++#endif ++} ++ ++#ifdef HAVE_NET_DEVICE_OPS ++static const struct net_device_ops bnx2_netdev_ops = { ++ .ndo_open = bnx2_open, ++ .ndo_start_xmit = bnx2_start_xmit, ++ .ndo_stop = bnx2_close, ++ .ndo_get_stats = bnx2_get_stats, ++ .ndo_set_rx_mode = bnx2_set_rx_mode, ++ .ndo_do_ioctl = bnx2_ioctl, ++ .ndo_validate_addr = eth_validate_addr, ++ .ndo_set_mac_address = bnx2_change_mac_addr, ++ .ndo_change_mtu = bnx2_change_mtu, ++ .ndo_tx_timeout = bnx2_tx_timeout, ++#ifdef BCM_VLAN ++ .ndo_vlan_rx_register = bnx2_vlan_rx_register, ++#endif ++#if defined(HAVE_POLL_CONTROLLER) || defined(CONFIG_NET_POLL_CONTROLLER) ++ .ndo_poll_controller = poll_bnx2, ++#endif ++}; ++#endif + + static int __devinit + bnx2_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) +@@ -7717,56 +8743,100 @@ + printk(KERN_INFO "%s", version); + + /* dev zeroed in init_etherdev */ ++#if (LINUX_VERSION_CODE >= 0x20418) ++#ifndef BCM_HAVE_MULTI_QUEUE ++ dev = alloc_etherdev(sizeof(*bp)); ++#else + dev = alloc_etherdev_mq(sizeof(*bp), TX_MAX_RINGS); ++#endif ++#else ++ dev = init_etherdev(NULL, sizeof(*bp)); ++#endif + + if (!dev) + return -ENOMEM; + + rc = bnx2_init_board(pdev, dev); + if (rc < 0) { ++#if (LINUX_VERSION_CODE >= 0x20418) + free_netdev(dev); +- return rc; +- } +- ++#else ++ unregister_netdev(dev); ++ kfree(dev); ++#endif ++ return rc; ++ } ++ ++#ifndef HAVE_NET_DEVICE_OPS + dev->open = bnx2_open; + dev->hard_start_xmit = bnx2_start_xmit; + dev->stop = bnx2_close; + dev->get_stats = bnx2_get_stats; ++#ifdef HAVE_SET_RX_MODE + dev->set_rx_mode = bnx2_set_rx_mode; ++#else ++ dev->set_multicast_list = bnx2_set_rx_mode; ++#endif + dev->do_ioctl = bnx2_ioctl; + dev->set_mac_address = bnx2_change_mac_addr; + dev->change_mtu = bnx2_change_mtu; + dev->tx_timeout = bnx2_tx_timeout; +- dev->watchdog_timeo = TX_TIMEOUT; + #ifdef BCM_VLAN + dev->vlan_rx_register = bnx2_vlan_rx_register; +-#endif ++#if (LINUX_VERSION_CODE < 0x20616) ++ dev->vlan_rx_kill_vid = bnx2_vlan_rx_kill_vid; ++#endif ++#endif ++#if defined(HAVE_POLL_CONTROLLER) || defined(CONFIG_NET_POLL_CONTROLLER) ++ dev->poll_controller = poll_bnx2; ++#endif ++#else ++ dev->netdev_ops = &bnx2_netdev_ops; ++#endif ++ dev->watchdog_timeo = TX_TIMEOUT; + dev->ethtool_ops = &bnx2_ethtool_ops; + + bp = netdev_priv(dev); + bnx2_init_napi(bp); + +-#if defined(HAVE_POLL_CONTROLLER) || defined(CONFIG_NET_POLL_CONTROLLER) +- dev->poll_controller = poll_bnx2; +-#endif +- + pci_set_drvdata(pdev, dev); + + memcpy(dev->dev_addr, bp->mac_addr, 6); ++#ifdef ETHTOOL_GPERMADDR + memcpy(dev->perm_addr, bp->mac_addr, 6); +- bp->name = board_info[ent->driver_data].name; +- ++#endif ++ ++#ifdef NETIF_F_IPV6_CSUM + dev->features |= NETIF_F_IP_CSUM | NETIF_F_SG; + if (CHIP_NUM(bp) == CHIP_NUM_5709) + dev->features |= NETIF_F_IPV6_CSUM; +- ++#else ++ dev->features |= NETIF_F_SG; ++ if (CHIP_NUM(bp) == CHIP_NUM_5709) ++ dev->features |= NETIF_F_HW_CSUM; ++ else ++ dev->features |= NETIF_F_IP_CSUM; ++#endif + #ifdef BCM_VLAN + dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX; + #endif ++#ifdef BCM_TSO + dev->features |= NETIF_F_TSO | NETIF_F_TSO_ECN; + if (CHIP_NUM(bp) == CHIP_NUM_5709) + dev->features |= NETIF_F_TSO6; +- ++#endif ++ ++#if defined(__VMKLNX__) && defined(__VMKNETDDI_QUEUEOPS__) ++ if (CHIP_NUM(bp) == CHIP_NUM_5709) { ++ if (disable_netq == 0) { ++ VMKNETDDI_REGISTER_QUEUEOPS(dev, bnx2_netqueue_ops); ++ printk(KERN_INFO "NetQueue Ops registered\n"); ++ } else ++ printk(KERN_INFO "NetQueue Ops not registered\n"); ++ } ++#endif ++ ++#if (LINUX_VERSION_CODE >= 0x20418) + if ((rc = register_netdev(dev))) { + dev_err(&pdev->dev, "Cannot register net device\n"); + if (bp->regview) +@@ -7777,11 +8847,11 @@ + free_netdev(dev); + return rc; + } +- ++#endif + printk(KERN_INFO "%s: %s (%c%d) %s found at mem %lx, " + "IRQ %d, node addr %s\n", + dev->name, +- bp->name, ++ board_info[ent->driver_data].name, + ((CHIP_ID(bp) & 0xf000) >> 12) + 'A', + ((CHIP_ID(bp) & 0x0ff0) >> 4), + bnx2_bus_string(bp, str), +@@ -7797,14 +8867,20 @@ + struct net_device *dev = pci_get_drvdata(pdev); + struct bnx2 *bp = netdev_priv(dev); + ++#if (LINUX_VERSION_CODE >= 0x20600) + flush_scheduled_work(); ++#endif + + unregister_netdev(dev); + + if (bp->regview) + iounmap(bp->regview); + ++#if (LINUX_VERSION_CODE >= 0x20418) + free_netdev(dev); ++#else ++ kfree(dev); ++#endif + pci_release_regions(pdev); + pci_disable_device(pdev); + pci_set_drvdata(pdev, NULL); +@@ -7816,21 +8892,29 @@ + struct net_device *dev = pci_get_drvdata(pdev); + struct bnx2 *bp = netdev_priv(dev); + ++#if (LINUX_VERSION_CODE >= 0x2060b) + /* PCI register 4 needs to be saved whether netif_running() or not. + * MSI address and data need to be saved if using MSI and + * netif_running(). + */ + pci_save_state(pdev); ++#endif + if (!netif_running(dev)) + return 0; + ++#if (LINUX_VERSION_CODE >= 0x20600) + flush_scheduled_work(); ++#endif + bnx2_netif_stop(bp); + netif_device_detach(dev); + del_timer_sync(&bp->timer); + bnx2_shutdown_chip(bp); + bnx2_free_skbs(bp); ++#if (LINUX_VERSION_CODE < 0x2060b) ++ bnx2_set_power_state(bp, state); ++#else + bnx2_set_power_state(bp, pci_choose_state(pdev, state)); ++#endif + return 0; + } + +@@ -7840,7 +8924,9 @@ + struct net_device *dev = pci_get_drvdata(pdev); + struct bnx2 *bp = netdev_priv(dev); + ++#if (LINUX_VERSION_CODE >= 0x2060b) + pci_restore_state(pdev); ++#endif + if (!netif_running(dev)) + return 0; + +@@ -7851,6 +8937,8 @@ + return 0; + } + ++#if !defined(__VMKLNX__) ++#if (LINUX_VERSION_CODE >= 0x020611) + /** + * bnx2_io_error_detected - called when PCI error is detected + * @pdev: Pointer to PCI device +@@ -7937,6 +9025,9 @@ + .resume = bnx2_io_resume, + }; + ++#endif ++#endif ++ + static struct pci_driver bnx2_pci_driver = { + .name = DRV_MODULE_NAME, + .id_table = bnx2_pci_tbl, +@@ -7944,16 +9035,60 @@ + .remove = __devexit_p(bnx2_remove_one), + .suspend = bnx2_suspend, + .resume = bnx2_resume, ++#if !defined(__VMKLNX__) ++#if (LINUX_VERSION_CODE >= 0x020611) + .err_handler = &bnx2_err_handler, +-}; ++#endif ++#endif ++}; ++ ++#if defined(VMWARE_ISCSI) ++static vmk_IscsiNetDriverData iscsinet_bnx2_drv_data = { ++ .drvData = bnx2_cnic_probe, ++ .privData = NULL, ++}; ++#endif + + static int __init bnx2_init(void) + { +- return pci_register_driver(&bnx2_pci_driver); ++ int rc; ++#if defined(VMWARE_ISCSI) ++ VMK_ReturnStatus vm_err; ++#endif ++ ++#if defined(__VMKLNX__) && defined(__VMKNETDDI_QUEUEOPS__) ++ /* sanity check the force_netq parameter */ ++ if(force_netq > 7) { ++ printk(KERN_ERR "bnx2x: please use a 'force_netq'value " ++ "between (2-7)\n"); ++ return -EINVAL; ++ } ++#endif ++ ++#if (LINUX_VERSION_CODE < 0x020613) ++ rc = pci_module_init(&bnx2_pci_driver); ++#else ++ rc = pci_register_driver(&bnx2_pci_driver); ++#endif ++#if !defined(VMWARE_ISCSI) ++ return rc; ++#else ++ if (rc) ++ return rc; ++ vm_err = vmk_IscsiNetDriverRegister(THIS_MODULE->moduleID, &iscsinet_bnx2_drv_data); ++ if (vm_err != VMK_OK) { ++ pci_unregister_driver(&bnx2_pci_driver); ++ return vm_err; ++ } ++ return 0; ++#endif + } + + static void __exit bnx2_cleanup(void) + { ++#if defined(VMWARE_ISCSI) ++ vmk_IscsiNetDriverUnregister(THIS_MODULE->moduleID); ++#endif + pci_unregister_driver(&bnx2_pci_driver); + } + +@@ -7961,4 +9096,1185 @@ + module_exit(bnx2_cleanup); + + +- ++#if defined(__VMKLNX__) && defined(__VMKNETDDI_QUEUEOPS__) ++ ++#ifdef BNX2_DEBUG ++static u32 bnx2_read_ctx(struct bnx2 *bp, u32 offset) ++{ ++ int i; ++ ++ if (CHIP_NUM(bp) != CHIP_NUM_5709) { ++ REG_WR(bp, BNX2_CTX_DATA_ADR, offset); ++ return REG_RD(bp, BNX2_CTX_DATA); ++ } ++ ++ REG_WR(bp, BNX2_CTX_CTX_CTRL, offset | BNX2_CTX_CTX_CTRL_READ_REQ); ++ for (i = 0; i < 5; i++) { ++ udelay(5); ++ if (REG_RD(bp, BNX2_CTX_CTX_CTRL) & BNX2_CTX_CTX_CTRL_READ_REQ) ++ continue; ++ break; ++ } ++ ++ return REG_RD(bp, BNX2_CTX_CTX_DATA); ++} ++ ++static void dump_ctx(struct bnx2 *bp, u32 cid) ++{ ++ u32 addr = cid * 128; ++ int i; ++ ++ for (i = 0; i < 8; i++) { ++ u32 val, val1, val2, val3; ++ ++ val = bnx2_read_ctx(bp, addr); ++ val1 = bnx2_read_ctx(bp, addr+4); ++ val2 = bnx2_read_ctx(bp, addr+8); ++ val3 = bnx2_read_ctx(bp, addr+0xc); ++ printk(KERN_ALERT "ctx %08x: %08x %08x %08x %08x\n", ++ addr, val, val1, val2, val3); ++ addr += 0x10; ++ } ++} ++#endif ++ ++#define NETQ_WAIT_EVENT_TIMEOUT msecs_to_jiffies(100) ++ ++#define BNX2_MAX_CID 0x2000 ++ ++#define L2_KWQ_PAGE_CNT 4 ++#define L2_KCQ_PAGE_CNT 16 ++ ++#define L2_KWQE_CNT (BCM_PAGE_SIZE / sizeof(struct l2_kwqe)) ++#define L2_KCQE_CNT (BCM_PAGE_SIZE / sizeof(struct l2_kcqe)) ++#define MAX_L2_KWQE_CNT (L2_KWQE_CNT - 1) ++#define MAX_L2_KCQE_CNT (L2_KCQE_CNT - 1) ++ ++#define MAX_L2_KWQ_IDX ((L2_KWQ_PAGE_CNT * L2_KWQE_CNT) - 1) ++#define MAX_L2_KCQ_IDX ((L2_KCQ_PAGE_CNT * L2_KCQE_CNT) - 1) ++ ++#define L2_KWQ_PG(x) (((x) & ~MAX_L2_KWQE_CNT) >> (BCM_PAGE_BITS - 5)) ++#define L2_KWQ_IDX(x) ((x) & MAX_L2_KWQE_CNT) ++ ++#define L2_KCQ_PG(x) (((x) & ~MAX_L2_KCQE_CNT) >> (BCM_PAGE_BITS - 5)) ++#define L2_KCQ_IDX(x) ((x) & MAX_L2_KCQE_CNT) ++ ++/* ++ * krnlq_context definition ++ */ ++#define L2_KRNLQ_FLAGS 0x00000000 ++#define L2_KRNLQ_SIZE 0x00000000 ++#define L2_KRNLQ_TYPE 0x00000000 ++#define KRNLQ_FLAGS_PG_SZ (0xf<<0) ++#define KRNLQ_FLAGS_PG_SZ_256 (0<<0) ++#define KRNLQ_FLAGS_PG_SZ_512 (1<<0) ++#define KRNLQ_FLAGS_PG_SZ_1K (2<<0) ++#define KRNLQ_FLAGS_PG_SZ_2K (3<<0) ++#define KRNLQ_FLAGS_PG_SZ_4K (4<<0) ++#define KRNLQ_FLAGS_PG_SZ_8K (5<<0) ++#define KRNLQ_FLAGS_PG_SZ_16K (6<<0) ++#define KRNLQ_FLAGS_PG_SZ_32K (7<<0) ++#define KRNLQ_FLAGS_PG_SZ_64K (8<<0) ++#define KRNLQ_FLAGS_PG_SZ_128K (9<<0) ++#define KRNLQ_FLAGS_PG_SZ_256K (10<<0) ++#define KRNLQ_FLAGS_PG_SZ_512K (11<<0) ++#define KRNLQ_FLAGS_PG_SZ_1M (12<<0) ++#define KRNLQ_FLAGS_PG_SZ_2M (13<<0) ++#define KRNLQ_FLAGS_QE_SELF_SEQ (1<<15) ++#define KRNLQ_SIZE_TYPE_SIZE ((((0x28 + 0x1f) & ~0x1f) / 0x20) << 16) ++#define KRNLQ_TYPE_TYPE (0xf<<28) ++#define KRNLQ_TYPE_TYPE_EMPTY (0<<28) ++#define KRNLQ_TYPE_TYPE_KRNLQ (6<<28) ++ ++#define L2_KRNLQ_HOST_QIDX 0x00000004 ++#define L2_KRNLQ_HOST_FW_QIDX 0x00000008 ++#define L2_KRNLQ_NX_QE_SELF_SEQ 0x0000000c ++#define L2_KRNLQ_QE_SELF_SEQ_MAX 0x0000000c ++#define L2_KRNLQ_NX_QE_HADDR_HI 0x00000010 ++#define L2_KRNLQ_NX_QE_HADDR_LO 0x00000014 ++#define L2_KRNLQ_PGTBL_PGIDX 0x00000018 ++#define L2_KRNLQ_NX_PG_QIDX 0x00000018 ++#define L2_KRNLQ_PGTBL_NPAGES 0x0000001c ++#define L2_KRNLQ_QIDX_INCR 0x0000001c ++#define L2_KRNLQ_PGTBL_HADDR_HI 0x00000020 ++#define L2_KRNLQ_PGTBL_HADDR_LO 0x00000024 ++ ++#define BNX2_PG_CTX_MAP 0x1a0034 ++ ++static inline u32 ++bnx2_netqueue_kwq_avail(struct bnx2 *bp) ++{ ++ return MAX_L2_KWQ_IDX - ++ ((bp->netq_kwq_prod_idx - bp->netq_kwq_con_idx) & ++ MAX_L2_KWQ_IDX); ++} ++ ++static int ++bnx2_netqueue_submit_kwqes(struct bnx2 *bp, struct l2_kwqe *wqes) ++{ ++ struct l2_kwqe *prod_qe; ++ u16 prod, sw_prod; ++ ++ if (1 > bnx2_netqueue_kwq_avail(bp)) { ++ printk(KERN_WARNING "%s: No kwq's available\n", bp->dev->name); ++ return -EAGAIN; ++ } ++ ++ prod = bp->netq_kwq_prod_idx; ++ sw_prod = prod & MAX_L2_KWQ_IDX; ++ ++ prod_qe = &bp->netq_kwq[L2_KWQ_PG(sw_prod)][L2_KWQ_IDX(sw_prod)]; ++ memcpy(prod_qe, wqes, sizeof(struct l2_kwqe)); ++ prod++; ++ sw_prod = prod & MAX_L2_KWQ_IDX; ++ ++ bp->netq_kwq_prod_idx = prod; ++ ++ REG_WR16(bp, bp->netq_kwq_io_addr, bp->netq_kwq_prod_idx); ++ mmiowb(); ++ ++ return 0; ++} ++ ++static void ++bnx2_netqueue_free_dma(struct bnx2 *bp, struct netq_dma *dma) ++{ ++ int i; ++ ++ if (!dma->pg_arr) ++ return; ++ ++ for (i = 0; i < dma->num_pages; i++) { ++ if (dma->pg_arr[i]) { ++ pci_free_consistent(bp->pdev, BCM_PAGE_SIZE, ++ dma->pg_arr[i], dma->pg_map_arr[i]); ++ dma->pg_arr[i] = NULL; ++ } ++ } ++ if (dma->pgtbl) { ++ pci_free_consistent(bp->pdev, dma->pgtbl_size, ++ dma->pgtbl, dma->pgtbl_map); ++ dma->pgtbl = NULL; ++ } ++ kfree(dma->pg_arr); ++ dma->pg_arr = NULL; ++ dma->num_pages = 0; ++} ++ ++static void ++bnx2_netqueue_free_resc(struct bnx2 *bp) ++{ ++ int i; ++ ++ for (i = 0; i < bp->netq_ctx_blks; i++) { ++ if (bp->netq_ctx_arr[i].ctx) { ++ pci_free_consistent(bp->pdev, bp->netq_ctx_blk_size, ++ bp->netq_ctx_arr[i].ctx, ++ bp->netq_ctx_arr[i].mapping); ++ bp->netq_ctx_arr[i].ctx = NULL; ++ } ++ } ++ kfree(bp->netq_ctx_arr); ++ bp->netq_ctx_arr = NULL; ++ bp->netq_ctx_blks = 0; ++ ++ bnx2_netqueue_free_dma(bp, &bp->netq_kwq_info); ++ bnx2_netqueue_free_dma(bp, &bp->netq_kcq_info); ++} ++ ++static void ++bnx2_netqueue_setup_page_tbl(struct bnx2 *bp, ++ struct netq_dma *dma) ++{ ++ int i; ++ u32 *page_table = dma->pgtbl; ++ ++ for (i = 0; i < dma->num_pages; i++) { ++ /* Each entry needs to be in big endian format. */ ++ *page_table = (u32) ((u64) dma->pg_map_arr[i] >> 32); ++ page_table++; ++ *page_table = (u32) dma->pg_map_arr[i]; ++ page_table++; ++ } ++} ++ ++static int ++bnx2_netqueue_alloc_dma(struct bnx2 *bp, struct netq_dma *dma, ++ int pages, int use_pg_tbl) ++{ ++ int i, size; ++ ++ size = pages * (sizeof(void *) + sizeof(dma_addr_t)); ++ dma->pg_arr = kzalloc(size, GFP_ATOMIC); ++ if (dma->pg_arr == NULL) { ++ printk(KERN_ERR "%s: Couldn't alloc space for dma page array\n", ++ bp->dev->name); ++ return -ENOMEM; ++ } ++ ++ dma->pg_map_arr = (dma_addr_t *) (dma->pg_arr + pages); ++ dma->num_pages = pages; ++ ++ for (i = 0; i < pages; i++) { ++ dma->pg_arr[i] = pci_alloc_consistent(bp->pdev, ++ BCM_PAGE_SIZE, ++ &dma->pg_map_arr[i]); ++ if (dma->pg_arr[i] == NULL) { ++ printk(KERN_ERR "%s: Couldn't alloc dma page\n", ++ bp->dev->name); ++ ++ goto error; ++ } ++ } ++ if (!use_pg_tbl) ++ return 0; ++ ++ dma->pgtbl_size = ((pages * 8) + BCM_PAGE_SIZE - 1) & ++ ~(BCM_PAGE_SIZE - 1); ++ dma->pgtbl = pci_alloc_consistent(bp->pdev, dma->pgtbl_size, ++ &dma->pgtbl_map); ++ if (dma->pgtbl == NULL) ++ goto error; ++ ++ bnx2_netqueue_setup_page_tbl(bp, dma); ++ ++ return 0; ++ ++error: ++ bnx2_netqueue_free_dma(bp, dma); ++ return -ENOMEM; ++} ++ ++static int ++bnx2_netqueue_alloc_context(struct bnx2 *bp) ++{ ++ if (CHIP_NUM(bp) == CHIP_NUM_5709) { ++ int i, k, arr_size; ++ ++ bp->netq_ctx_blk_size = BCM_PAGE_SIZE; ++ bp->netq_cids_per_blk = BCM_PAGE_SIZE / 128; ++ arr_size = BNX2_MAX_CID / bp->netq_cids_per_blk * ++ sizeof(struct netq_ctx); ++ bp->netq_ctx_arr = kmalloc(arr_size, GFP_KERNEL); ++ if (bp->netq_ctx_arr == NULL) ++ return -ENOMEM; ++ ++ memset(bp->netq_ctx_arr, 0, arr_size); ++ ++ k = 0; ++ for (i = 0; i < 1; i++) { ++ u32 j, reg, off, lo, hi; ++ ++ off = BNX2_PG_CTX_MAP; ++ ++ reg = bnx2_reg_rd_ind(bp, off); ++ lo = reg >> 16; ++ hi = reg & 0xffff; ++ for (j = lo; j < hi; j += bp->netq_cids_per_blk, k++) ++ bp->netq_ctx_arr[k].cid = j; ++ } ++ ++ bp->netq_ctx_blks = k; ++ if (bp->netq_ctx_blks >= ++ (BNX2_MAX_CID / bp->netq_cids_per_blk)) { ++ bp->netq_ctx_blks = 0; ++ return -ENOMEM; ++ } ++ ++ for (i = 0; i < bp->netq_ctx_blks; i++) { ++ bp->netq_ctx_arr[i].ctx = ++ pci_alloc_consistent(bp->pdev, BCM_PAGE_SIZE, ++ &bp->netq_ctx_arr[i].mapping); ++ if (bp->netq_ctx_arr[i].ctx == NULL) ++ return -ENOMEM; ++ } ++ } ++ return 0; ++} ++ ++static int ++bnx2_netqueue_alloc_resc(struct bnx2 *bp) ++{ ++ int ret; ++ ++ ret = bnx2_netqueue_alloc_dma(bp, &bp->netq_kwq_info, ++ L2_KWQ_PAGE_CNT, 1); ++ if (ret) { ++ printk(KERN_ERR "%s: Couldn't alloc space for kwq\n", ++ bp->dev->name); ++ goto error; ++ } ++ bp->netq_kwq = (struct l2_kwqe **) bp->netq_kwq_info.pg_arr; ++ ++ ret = bnx2_netqueue_alloc_dma(bp, &bp->netq_kcq_info, ++ L2_KCQ_PAGE_CNT, 1); ++ if (ret) { ++ printk(KERN_ERR "%s: Couldn't alloc space for kwq\n", ++ bp->dev->name); ++ goto error; ++ } ++ bp->netq_kcq = (struct l2_kcqe **) bp->netq_kcq_info.pg_arr; ++ ++ ret = bnx2_netqueue_alloc_context(bp); ++ if (ret) ++ goto error; ++ ++ return 0; ++ ++error: ++ bnx2_netqueue_free_resc(bp); ++ return ret; ++} ++ ++static void ++bnx2_init_netqueue_context(struct bnx2 *bp, u32 cid) ++{ ++ u32 cid_addr; ++ int i; ++ ++ cid_addr = GET_CID_ADDR(cid); ++ ++ for (i = 0; i < CTX_SIZE; i += 4) ++ bnx2_ctx_wr(bp, cid_addr, i, 0); ++} ++ ++static int ++bnx2_netqueue_setup_5709_context(struct bnx2 *bp, int valid) ++{ ++ int ret = 0, i; ++ u32 valid_bit = valid ? BNX2_CTX_HOST_PAGE_TBL_DATA0_VALID : 0; ++ ++ if (CHIP_NUM(bp) != CHIP_NUM_5709) ++ return 0; ++ ++ for (i = 0; i < bp->netq_ctx_blks; i++) { ++ int j; ++ u32 idx = bp->netq_ctx_arr[i].cid / bp->netq_cids_per_blk; ++ u32 val; ++ ++ memset(bp->netq_ctx_arr[i].ctx, 0, BCM_PAGE_SIZE); ++ ++ REG_WR(bp, BNX2_CTX_HOST_PAGE_TBL_DATA0, ++ (bp->netq_ctx_arr[i].mapping & 0xffffffff) | valid_bit); ++ REG_WR(bp, BNX2_CTX_HOST_PAGE_TBL_DATA1, ++ (u64) bp->netq_ctx_arr[i].mapping >> 32); ++ REG_WR(bp, BNX2_CTX_HOST_PAGE_TBL_CTRL, idx | ++ BNX2_CTX_HOST_PAGE_TBL_CTRL_WRITE_REQ); ++ for (j = 0; j < 10; j++) { ++ ++ val = REG_RD(bp, BNX2_CTX_HOST_PAGE_TBL_CTRL); ++ if (!(val & BNX2_CTX_HOST_PAGE_TBL_CTRL_WRITE_REQ)) ++ break; ++ udelay(5); ++ } ++ if (val & BNX2_CTX_HOST_PAGE_TBL_CTRL_WRITE_REQ) { ++ ret = -EBUSY; ++ break; ++ } ++ } ++ return ret; ++} ++ ++static int ++bnx2_netqueue_get_kcqes(struct bnx2 *bp, u16 hw_prod, u16 *sw_prod) ++{ ++ u16 i, ri, last; ++ struct l2_kcqe *kcqe; ++ int kcqe_cnt = 0, last_cnt = 0; ++ ++ i = ri = last = *sw_prod; ++ ri &= MAX_L2_KCQ_IDX; ++ ++ while ((i != hw_prod) && (kcqe_cnt < MAX_COMPLETED_KCQE)) { ++ kcqe = &bp->netq_kcq[L2_KCQ_PG(ri)][L2_KCQ_IDX(ri)]; ++ bp->netq_completed_kcq[kcqe_cnt++] = kcqe; ++ i = (i + 1); ++ ri = i & MAX_L2_KCQ_IDX; ++ if (likely(!(kcqe->flags & L2_KCQE_FLAGS_NEXT))) { ++ last_cnt = kcqe_cnt; ++ last = i; ++ } ++ } ++ ++ *sw_prod = last; ++ return last_cnt; ++} ++ ++ ++static void ++bnx2_service_netq_kcqes(struct bnx2_napi *bnapi, int num_cqes) ++{ ++ struct bnx2 *bp = bnapi->bp; ++ int i, j; ++ ++ i = 0; ++ j = 1; ++ while (num_cqes) { ++ u32 kcqe_op_flag = bp->netq_completed_kcq[i]->opcode; ++ u32 kcqe_layer = bp->netq_completed_kcq[i]->flags & ++ L2_KCQE_FLAGS_LAYER_MASK; ++ ++ printk(KERN_INFO "kcwe service [reserved: 0x%x, status: 0x%x, qid: 0x%x, qe_self_seq: 0x%x, opcode: 0x%x, flags: 0x%x]\n", ++ bp->netq_completed_kcq[i]->reserved, ++ bp->netq_completed_kcq[i]->status, ++ bp->netq_completed_kcq[i]->qid, ++ bp->netq_completed_kcq[i]->qe_self_seq, ++ bp->netq_completed_kcq[i]->opcode, ++ bp->netq_completed_kcq[i]->flags); ++ ++ while (j < num_cqes) { ++ u32 next_op = bp->netq_completed_kcq[i + j]->opcode; ++ ++ if ((next_op & L2_KCQE_FLAGS_LAYER_MASK) != kcqe_layer) ++ break; ++ j++; ++ } ++ ++ if (kcqe_layer != L2_KCQE_FLAGS_LAYER_MASK_L2) { ++ printk(KERN_ERR PFX "%s: Unknown type of KCQE(0x%x)\n", ++ bp->dev->name, kcqe_op_flag); ++ goto end; ++ } ++ ++ bp->netq_flags = kcqe_op_flag; ++ wake_up(&bp->netq_wait); ++ ++end: ++ num_cqes -= j; ++ i += j; ++ j = 1; ++ } ++ ++ ++ return; ++} ++ ++static void ++bnx2_netqueue_service_bnx2_msix(struct bnx2_napi *bnapi) ++{ ++ struct bnx2 *bp = bnapi->bp; ++ struct status_block *status_blk = bp->bnx2_napi[0].status_blk.msi; ++ u32 status_idx = status_blk->status_idx; ++ u16 hw_prod, sw_prod; ++ int kcqe_cnt; ++ ++ bp->netq_kwq_con_idx = status_blk->status_cmd_consumer_index; ++ ++ hw_prod = status_blk->status_completion_producer_index; ++ sw_prod = bp->netq_kcq_prod_idx; ++ ++ /* Ensure that there is a NetQ kcq avaliable */ ++ if (sw_prod == hw_prod) ++ return; ++ ++ while (sw_prod != hw_prod) { ++ kcqe_cnt = bnx2_netqueue_get_kcqes(bp, hw_prod, &sw_prod); ++ if (kcqe_cnt == 0) ++ goto done; ++ ++ bnx2_service_netq_kcqes(bnapi, kcqe_cnt); ++ ++ /* Tell compiler that status_blk fields can change. */ ++ barrier(); ++ if (status_idx != status_blk->status_idx) { ++ status_idx = status_blk->status_idx; ++ bp->netq_kwq_con_idx = status_blk->status_cmd_consumer_index; ++ hw_prod = status_blk->status_completion_producer_index; ++ } else ++ break; ++ } ++ ++done: ++ REG_WR16(bp, bp->netq_kcq_io_addr, sw_prod); ++ ++ bp->netq_kcq_prod_idx = sw_prod; ++ bp->netq_last_status_idx = status_idx; ++} ++ ++static void ++bnx2_stop_netqueue_hw(struct bnx2 *bp) ++{ ++ u32 val; ++ ++ /* Disable the CP and COM doorbells. These two processors polls the ++ * doorbell for a non zero value before running. This must be done ++ * after setting up the kernel queue contexts. This is for ++ * KQW/KCQ #1. */ ++ ++ val = bnx2_reg_rd_ind(bp, BNX2_CP_SCRATCH + 0x20); ++ val &= ~KWQ1_READY; ++ bnx2_reg_wr_ind(bp, BNX2_CP_SCRATCH + 0x20, val); ++ ++ val = bnx2_reg_rd_ind(bp, BNX2_COM_SCRATCH + 0x20); ++ val &= ~KCQ1_READY; ++ bnx2_reg_wr_ind(bp, BNX2_COM_SCRATCH + 0x20, val); ++ ++ /* Return back all the used resources */ ++ bnx2_netqueue_free_resc(bp); ++} ++ ++static int ++bnx2_start_netqueue_hw(struct bnx2 *bp) ++{ ++ u32 val; ++ int err; ++ ++ /* Initialize the bnx2 netqueue structures */ ++ init_waitqueue_head(&bp->netq_wait); ++ ++ err = bnx2_netqueue_alloc_resc(bp); ++ if (err != 0) { ++ printk(KERN_ERR "%s: Couldn't allocate netq resources\n", ++ bp->dev->name); ++ return err; ++ } ++ ++ val = REG_RD(bp, BNX2_MQ_CONFIG); ++ val &= ~BNX2_MQ_CONFIG_KNL_BYP_BLK_SIZE; ++ if (BCM_PAGE_BITS > 12) ++ val |= (12 - 8) << 4; ++ else ++ val |= (BCM_PAGE_BITS - 8) << 4; ++ ++ REG_WR(bp, BNX2_MQ_CONFIG, val); ++ ++ REG_WR(bp, BNX2_HC_COMP_PROD_TRIP, (2 << 16) | 8); ++ REG_WR(bp, BNX2_HC_COM_TICKS, (64 << 16) | 220); ++ REG_WR(bp, BNX2_HC_CMD_TICKS, (64 << 16) | 220); ++ ++ err = bnx2_netqueue_setup_5709_context(bp, 1); ++ if (err) { ++ printk(KERN_ERR "Couldn't setup 5709 context\n"); ++ return err; ++ } ++ ++ bnx2_init_netqueue_context(bp, NETQUEUE_KWQ_CID); ++ bnx2_init_netqueue_context(bp, NETQUEUE_KCQ_CID); ++ ++ bp->netq_kwq_cid_addr = GET_CID_ADDR(NETQUEUE_KWQ_CID); ++ bp->netq_kwq_io_addr = MB_GET_CID_ADDR(NETQUEUE_KWQ_CID) + ++ L2_KRNLQ_HOST_QIDX; ++ ++ bp->netq_kwq_prod_idx = 0; ++ bp->netq_kwq_con_idx = 0; ++ ++ /* Initialize the kernel work queue context. */ ++ val = KRNLQ_TYPE_TYPE_KRNLQ | KRNLQ_SIZE_TYPE_SIZE | ++ (BCM_PAGE_BITS - 8) | KRNLQ_FLAGS_QE_SELF_SEQ; ++ bnx2_ctx_wr(bp, bp->netq_kwq_cid_addr, L2_KRNLQ_TYPE, val); ++ ++ val = (BCM_PAGE_SIZE / sizeof(struct l2_kwqe) - 1) << 16; ++ bnx2_ctx_wr(bp, bp->netq_kwq_cid_addr, L2_KRNLQ_QE_SELF_SEQ_MAX, val); ++ ++ val = ((BCM_PAGE_SIZE / sizeof(struct l2_kwqe)) << 16) | L2_KWQ_PAGE_CNT; ++ bnx2_ctx_wr(bp, bp->netq_kwq_cid_addr, L2_KRNLQ_PGTBL_NPAGES, val); ++ ++ val = (u32) ((u64) bp->netq_kwq_info.pgtbl_map >> 32); ++ bnx2_ctx_wr(bp, bp->netq_kwq_cid_addr, L2_KRNLQ_PGTBL_HADDR_HI, val); ++ ++ val = (u32) bp->netq_kwq_info.pgtbl_map; ++ bnx2_ctx_wr(bp, bp->netq_kwq_cid_addr, L2_KRNLQ_PGTBL_HADDR_LO, val); ++ ++ bp->netq_kcq_cid_addr = GET_CID_ADDR(NETQUEUE_KCQ_CID); ++ bp->netq_kcq_io_addr = MB_GET_CID_ADDR(NETQUEUE_KCQ_CID) + ++ L2_KRNLQ_HOST_QIDX; ++ bp->netq_kcq_prod_idx = 0; ++ ++ /* Initialize the kernel complete queue context. */ ++ val = KRNLQ_TYPE_TYPE_KRNLQ | KRNLQ_SIZE_TYPE_SIZE | ++ (BCM_PAGE_BITS - 8) | KRNLQ_FLAGS_QE_SELF_SEQ; ++ bnx2_ctx_wr(bp, bp->netq_kcq_cid_addr, L2_KRNLQ_TYPE, val); ++ ++ val = (BCM_PAGE_SIZE / sizeof(struct l2_kcqe) - 1) << 16; ++ bnx2_ctx_wr(bp, bp->netq_kcq_cid_addr, L2_KRNLQ_QE_SELF_SEQ_MAX, val); ++ ++ val = ((BCM_PAGE_SIZE / sizeof(struct l2_kcqe)) << 16)|L2_KCQ_PAGE_CNT; ++ bnx2_ctx_wr(bp, bp->netq_kcq_cid_addr, L2_KRNLQ_PGTBL_NPAGES, val); ++ ++ val = (u32) ((u64) bp->netq_kcq_info.pgtbl_map >> 32); ++ bnx2_ctx_wr(bp, bp->netq_kcq_cid_addr, L2_KRNLQ_PGTBL_HADDR_HI, val); ++ ++ val = (u32) bp->netq_kcq_info.pgtbl_map; ++ bnx2_ctx_wr(bp, bp->netq_kcq_cid_addr, L2_KRNLQ_PGTBL_HADDR_LO, val); ++ ++ /* Enable Commnad Scheduler notification when we write to the ++ * host producer index of the kernel contexts. */ ++ REG_WR(bp, BNX2_MQ_KNL_CMD_MASK1, 2); ++ ++ /* Enable Command Scheduler notification when we write to either ++ * the Send Queue or Receive Queue producer indexes of the kernel ++ * bypass contexts. */ ++ REG_WR(bp, BNX2_MQ_KNL_BYP_CMD_MASK1, 7); ++ REG_WR(bp, BNX2_MQ_KNL_BYP_WRITE_MASK1, 7); ++ ++ /* Notify COM when the driver post an application buffer. */ ++ REG_WR(bp, BNX2_MQ_KNL_RX_V2P_MASK2, 0x2000); ++ ++ /* Set the CP and COM doorbells. These two processors polls the ++ * doorbell for a non zero value before running. This must be done ++ * after setting up the kernel queue contexts. This is for ++ * KQW/KCQ 1. */ ++ bnx2_reg_wr_ind(bp, BNX2_CP_SCRATCH + 0x20, KWQ1_READY); ++ bnx2_reg_wr_ind(bp, BNX2_COM_SCRATCH + 0x20, KCQ1_READY); ++ ++ mmiowb(); ++ ++ printk(KERN_INFO "%s: NetQueue hardware support is enabled\n", ++ bp->dev->name); ++ ++ return 0; ++} ++ ++ ++ ++static int ++bnx2_netq_get_netqueue_features(vmknetddi_queueop_get_features_args_t *args) ++{ ++ args->features = VMKNETDDI_QUEUEOPS_FEATURE_NONE; ++ args->features |= VMKNETDDI_QUEUEOPS_FEATURE_RXQUEUES; ++ args->features |= VMKNETDDI_QUEUEOPS_FEATURE_TXQUEUES; ++ return VMKNETDDI_QUEUEOPS_OK; ++} ++ ++static int ++bnx2_netq_get_queue_count(vmknetddi_queueop_get_queue_count_args_t *args) ++{ ++ struct bnx2 *bp = netdev_priv(args->netdev); ++ ++ /* workaround for packets duplicated */ ++ if (bp->num_tx_rings + bp->num_rx_rings > 1) ++ bp->netq_enabled = 1; ++ ++ if (args->type == VMKNETDDI_QUEUEOPS_QUEUE_TYPE_RX) { ++ args->count = max_t(u16, bp->num_rx_rings - 1, 0); ++ ++ printk(KERN_INFO "%s: Using %d RX NetQ rings\n", ++ args->netdev->name, args->count); ++ ++ return VMKNETDDI_QUEUEOPS_OK; ++ } else if (args->type == VMKNETDDI_QUEUEOPS_QUEUE_TYPE_TX) { ++ args->count = max_t(u16, bp->num_tx_rings - 1, 0); ++ ++ printk(KERN_INFO "%s: Using %d TX NetQ rings\n", ++ args->netdev->name, args->count); ++ ++ return VMKNETDDI_QUEUEOPS_OK; ++ } else { ++ printk(KERN_ERR "%s: Counting queue: invalid queue type\n", ++ bp->dev->name); ++ return VMKNETDDI_QUEUEOPS_ERR; ++ } ++} ++ ++static int ++bnx2_netq_get_filter_count(vmknetddi_queueop_get_filter_count_args_t *args) ++{ ++ /* Only support 1 Mac filter per queue */ ++ args->count = 1; ++ return VMKNETDDI_QUEUEOPS_OK; ++} ++ ++static int ++bnx2_netq_alloc_rx_queue(struct net_device *netdev, ++ vmknetddi_queueops_queueid_t *p_qid, ++ struct napi_struct **napi_p) ++{ ++ int i; ++ struct bnx2 *bp = netdev_priv(netdev); ++ ++ /* We need to count the default ring as part of the number of RX rings ++ avaliable */ ++ if (bp->n_rx_queues_allocated >= (bp->num_rx_rings - 1)) ++ return VMKNETDDI_QUEUEOPS_ERR; ++ ++ for_each_nondefault_rx_queue(bp, i) { ++ struct bnx2_napi *bnapi = &bp->bnx2_napi[i]; ++ if (!bnapi->rx_queue_allocated) { ++ int rc; ++ ++ /* Prepare the kwqe to be passed to the firmware */ ++ struct l2_kwqe_vm_alloc_rx_queue kwqe_alloc_rx; ++ ++ memset(&kwqe_alloc_rx, 0, sizeof(kwqe_alloc_rx)); ++ ++ kwqe_alloc_rx.kwqe_flags = KWQE_FLAGS_LAYER_MASK_L2; ++ kwqe_alloc_rx.kwqe_opcode = L2_KWQE_OPCODE_VALUE_VM_ALLOC_RX_QUEUE; ++ kwqe_alloc_rx.queue_type = L2_NET_QUEUE; ++ kwqe_alloc_rx.qid = i - 1; ++ ++ rc = bnx2_netqueue_submit_kwqes(bp, ++ (struct l2_kwqe *)&kwqe_alloc_rx); ++ if (rc != 0) { ++ printk(KERN_ERR "%s: Couldn't submit alloc rx kwqe\n", ++ bp->dev->name); ++ return VMKNETDDI_QUEUEOPS_ERR; ++ } ++ ++ bp->netq_flags = 0; ++ rc = wait_event_timeout(bp->netq_wait, ++ (bp->netq_flags & ++ L2_KCQE_OPCODE_VALUE_VM_ALLOC_RX_QUEUE), ++ NETQ_WAIT_EVENT_TIMEOUT); ++ ++ if (rc != 0) { ++ bnapi->rx_queue_allocated = TRUE; ++ bp->n_rx_queues_allocated++; ++ *p_qid = VMKNETDDI_QUEUEOPS_MK_RX_QUEUEID(i); ++ *napi_p = &bnapi->napi; ++ ++ printk(KERN_INFO "%s: RX NetQ allocated on %d\n", ++ bp->dev->name, kwqe_alloc_rx.qid); ++ return VMKNETDDI_QUEUEOPS_OK; ++ } else { ++ printk(KERN_INFO "%s: Timeout RX NetQ allocate on %d\n", ++ bp->dev->name, kwqe_alloc_rx.qid); ++ return VMKNETDDI_QUEUEOPS_ERR; ++ } ++ } ++ } ++ printk(KERN_ERR "%s: No free rx queues found!\n", bp->dev->name); ++ return VMKNETDDI_QUEUEOPS_ERR; ++} ++ ++static int ++bnx2_netq_alloc_tx_queue(struct net_device *netdev, ++ vmknetddi_queueops_queueid_t *p_qid, ++ u16 *queue_mapping) ++{ ++ int i; ++ struct bnx2 *bp = netdev_priv(netdev); ++ ++ if (bp->n_tx_queues_allocated >= (bp->num_tx_rings - 1)) ++ return VMKNETDDI_QUEUEOPS_ERR; ++ ++ for_each_nondefault_tx_queue(bp, i) { ++ struct bnx2_napi *bnapi = &bp->bnx2_napi[i]; ++ if (!bnapi->tx_queue_allocated) { ++ ++ bnapi->tx_queue_allocated = TRUE; ++ bp->n_tx_queues_allocated++; ++ *p_qid = VMKNETDDI_QUEUEOPS_MK_TX_QUEUEID(i); ++ *queue_mapping = i; ++ ++ printk(KERN_INFO "%s: TX NetQ allocated on %d\n", ++ bp->dev->name, i); ++ return VMKNETDDI_QUEUEOPS_OK; ++ } ++ } ++ ++ printk(KERN_ERR "%s: no free tx queues found!\n", ++ bp->dev->name); ++ return VMKNETDDI_QUEUEOPS_ERR; ++} ++ ++static int ++bnx2_netq_alloc_queue(vmknetddi_queueop_alloc_queue_args_t *args) ++{ ++ struct net_device *netdev = args->netdev; ++ struct bnx2 *bp = netdev_priv(netdev); ++ ++ if (args->type == VMKNETDDI_QUEUEOPS_QUEUE_TYPE_TX) { ++ return bnx2_netq_alloc_tx_queue(args->netdev, &args->queueid, ++ &args->queue_mapping); ++ } else if (args->type == VMKNETDDI_QUEUEOPS_QUEUE_TYPE_RX) { ++ return bnx2_netq_alloc_rx_queue(args->netdev, &args->queueid, ++ &args->napi); ++ } else { ++ printk(KERN_ERR "%s: Trying to alloc invalid queue type: %x\n", ++ bp->dev->name, args->type); ++ return VMKNETDDI_QUEUEOPS_ERR; ++ } ++} ++ ++static int ++bnx2_netq_free_tx_queue(struct net_device *netdev, ++ vmknetddi_queueops_queueid_t qid) ++{ ++ struct bnx2 *bp = netdev_priv(netdev); ++ struct bnx2_napi *bnapi; ++ struct bnx2_tx_ring_info *txr; ++ int rc; ++ ++ u16 index = VMKNETDDI_QUEUEOPS_QUEUEID_VAL(qid); ++ if (index > bp->num_tx_rings) ++ return VMKNETDDI_QUEUEOPS_ERR; ++ ++ bnapi = &bp->bnx2_napi[index]; ++ if (bnapi->tx_queue_allocated != TRUE) ++ return VMKNETDDI_QUEUEOPS_ERR; ++ ++ txr = &bnapi->tx_ring; ++ if (txr->tx_cons == txr->tx_prod) ++ goto free_tx_ring; ++ ++ /* Wait for the TX to flush all packets */ ++ bnapi->netq_flags |= BNX2_NETQ_FREE_TX_QUEUE_STATE; ++ rc = wait_event_timeout(bp->netq_wait, ++ (bp->netq_flags & ++ L2_KCQE_OPCODE_VALUE_VM_FREE_TX_QUEUE), ++ NETQ_WAIT_EVENT_TIMEOUT); ++ bnapi->netq_flags &= ~BNX2_NETQ_FREE_TX_QUEUE_STATE; ++ ++ if (rc == 0) { ++ printk(KERN_INFO "%s: Timeout submiting free NetQ TX Queue: %x\n", ++ bp->dev->name, index); ++ ++ return VMKNETDDI_QUEUEOPS_ERR; ++ } ++ ++free_tx_ring: ++ bnapi->tx_queue_allocated = FALSE; ++ bp->n_tx_queues_allocated--; ++ ++ printk(KERN_INFO "%s: Free NetQ TX Queue: %x\n", ++ bp->dev->name, index); ++ ++ return VMKNETDDI_QUEUEOPS_OK; ++} ++ ++static int ++bnx2_netq_free_rx_queue(struct net_device *netdev, ++ vmknetddi_queueops_queueid_t qid) ++{ ++ int rc; ++ struct bnx2 *bp = netdev_priv(netdev); ++ struct bnx2_napi *bnapi; ++ struct l2_kwqe_vm_free_rx_queue kwqe_free_rx; ++ ++ u16 index = VMKNETDDI_QUEUEOPS_QUEUEID_VAL(qid); ++ if (index > bp->num_rx_rings) ++ return VMKNETDDI_QUEUEOPS_ERR; ++ ++ bnapi = &bp->bnx2_napi[index]; ++ if (bnapi->rx_queue_allocated != TRUE) ++ return VMKNETDDI_QUEUEOPS_ERR; ++ ++ memset(&kwqe_free_rx, 0, sizeof(kwqe_free_rx)); ++ ++ kwqe_free_rx.flags = KWQE_FLAGS_LAYER_MASK_L2; ++ kwqe_free_rx.opcode = L2_KWQE_OPCODE_VALUE_VM_FREE_RX_QUEUE; ++ kwqe_free_rx.qid = index; ++ ++ rc = bnx2_netqueue_submit_kwqes(bp, ++ (struct l2_kwqe *) &kwqe_free_rx); ++ if (rc != 0) { ++ printk(KERN_ERR "%s: Couldn't submit free rx kwqe\n", ++ bp->dev->name); ++ ++ return VMKNETDDI_QUEUEOPS_ERR; ++ } ++ ++ bp->netq_flags = 0; ++ rc = wait_event_timeout(bp->netq_wait, ++ (bp->netq_flags & ++ L2_KCQE_OPCODE_VALUE_VM_FREE_RX_QUEUE), ++ NETQ_WAIT_EVENT_TIMEOUT); ++ if (rc != 0) { ++ bnapi->rx_queue_allocated = FALSE; ++ bp->n_rx_queues_allocated--; ++ ++ printk(KERN_INFO "%s: Free NetQ RX Queue: %x\n", ++ bp->dev->name, index); ++ ++ return VMKNETDDI_QUEUEOPS_OK; ++ } else { ++ printk(KERN_INFO "%s: Timeout free NetQ RX Queue: %x\n", ++ bp->dev->name, index); ++ ++ return VMKNETDDI_QUEUEOPS_OK; ++ } ++} ++ ++static int ++bnx2_netq_free_queue(vmknetddi_queueop_free_queue_args_t *args) ++{ ++ if (VMKNETDDI_QUEUEOPS_IS_TX_QUEUEID(args->queueid)) { ++ return bnx2_netq_free_tx_queue(args->netdev, args->queueid); ++ } else if (VMKNETDDI_QUEUEOPS_IS_RX_QUEUEID(args->queueid)) { ++ return bnx2_netq_free_rx_queue(args->netdev, args->queueid); ++ } else { ++ printk(KERN_ERR "%s: free netq: invalid queue type\n", ++ args->netdev->name); ++ return VMKNETDDI_QUEUEOPS_ERR; ++ } ++} ++ ++static int ++bnx2_netq_get_queue_vector(vmknetddi_queueop_get_queue_vector_args_t *args) ++{ ++ int qid; ++ struct bnx2 *bp = netdev_priv(args->netdev); ++ qid = VMKNETDDI_QUEUEOPS_QUEUEID_VAL(args->queueid); ++ if (qid > bp->num_rx_rings) ++ return VMKNETDDI_QUEUEOPS_ERR; ++ ++#ifdef CONFIG_PCI_MSI ++ args->vector = bp->bnx2_napi[qid].int_num; ++#endif ++ return VMKNETDDI_QUEUEOPS_OK; ++} ++ ++static int ++bnx2_netq_get_default_queue(vmknetddi_queueop_get_default_queue_args_t *args) ++{ ++ struct bnx2 *bp = netdev_priv(args->netdev); ++ ++ if (args->type == VMKNETDDI_QUEUEOPS_QUEUE_TYPE_RX) { ++ args->queueid = VMKNETDDI_QUEUEOPS_MK_RX_QUEUEID(0); ++ args->napi = &bp->bnx2_napi[0].napi; ++ return VMKNETDDI_QUEUEOPS_OK; ++ } else if (args->type == VMKNETDDI_QUEUEOPS_QUEUE_TYPE_TX) { ++ args->queueid = VMKNETDDI_QUEUEOPS_MK_TX_QUEUEID(0); ++ args->queue_mapping = 0; ++ return VMKNETDDI_QUEUEOPS_OK; ++ } else ++ return VMKNETDDI_QUEUEOPS_ERR; ++} ++ ++static int ++bnx2_netq_remove_rx_filter(vmknetddi_queueop_remove_rx_filter_args_t *args) ++{ ++ struct bnx2 *bp = netdev_priv(args->netdev); ++ u16 qid = VMKNETDDI_QUEUEOPS_QUEUEID_VAL(args->queueid); ++ u16 fw_qid = qid - 1; ++ u16 fid = VMKNETDDI_QUEUEOPS_FILTERID_VAL(args->filterid); ++ struct bnx2_napi *bnapi; ++ struct l2_kwqe_vm_remove_rx_filter kwqe_remove_rx_filter; ++ int rc; ++ ++ bnapi = &bp->bnx2_napi[qid]; ++ ++ if (!VMKNETDDI_QUEUEOPS_IS_RX_QUEUEID(args->queueid)) ++ return VMKNETDDI_QUEUEOPS_ERR; ++ ++ if (qid > bp->num_rx_rings) ++ return VMKNETDDI_QUEUEOPS_ERR; ++ ++ /* Only support one Mac filter per queue */ ++ if (fid != 0 || bnapi->rx_queue_active == 0) ++ return VMKNETDDI_QUEUEOPS_ERR; ++ ++ memset(&kwqe_remove_rx_filter, 0, sizeof(kwqe_remove_rx_filter)); ++ ++ kwqe_remove_rx_filter.flags = KWQE_FLAGS_LAYER_MASK_L2; ++ kwqe_remove_rx_filter.opcode = L2_KWQE_OPCODE_VALUE_VM_REMOVE_RX_FILTER; ++ kwqe_remove_rx_filter.filter_type = L2_VM_FILTER_MAC; ++ kwqe_remove_rx_filter.qid = fw_qid; ++ ++ rc = bnx2_netqueue_submit_kwqes(bp, ++ (struct l2_kwqe *) &kwqe_remove_rx_filter); ++ if (rc != 0) { ++ printk(KERN_ERR "Couldn't submit rx filter kwqe\n"); ++ return VMKNETDDI_QUEUEOPS_ERR; ++ } ++ ++ bp->netq_flags = 0; ++ rc = wait_event_timeout(bp->netq_wait, ++ (bp->netq_flags & ++ L2_KCQE_OPCODE_VALUE_VM_REMOVE_RX_FILTER), ++ NETQ_WAIT_EVENT_TIMEOUT); ++ if (rc != 0) { ++ printk(KERN_INFO "%s: NetQ remove RX filter: %d\n", ++ bp->dev->name, qid); ++ ++ return VMKNETDDI_QUEUEOPS_OK; ++ } else { ++ printk(KERN_INFO "%s: Timeout NetQ remove RX filter: %d\n", ++ bp->dev->name, qid); ++ ++ return VMKNETDDI_QUEUEOPS_ERR; ++ } ++} ++ ++static int ++bnx2_netq_apply_rx_filter(vmknetddi_queueop_apply_rx_filter_args_t *args) ++{ ++ u8 *macaddr; ++ struct bnx2_napi *bnapi; ++ struct bnx2 *bp = netdev_priv(args->netdev); ++ vmknetddi_queueops_filter_class_t class; ++ u16 queueid = VMKNETDDI_QUEUEOPS_QUEUEID_VAL(args->queueid); ++ u16 fw_queueid = queueid - 1; ++ struct l2_kwqe_vm_set_rx_filter kwqe_set_rx_filter; ++ int rc; ++ DECLARE_MAC_BUF(mac); ++ u16 vlan_id; ++ ++ if (!VMKNETDDI_QUEUEOPS_IS_RX_QUEUEID(args->queueid)) { ++ printk(KERN_ERR "%s: invalid NetQ RX ID: %x\n", ++ args->netdev->name, args->queueid); ++ return VMKNETDDI_QUEUEOPS_ERR; ++ } ++ ++ class = vmknetddi_queueops_get_filter_class(&args->filter); ++ if ((class != VMKNETDDI_QUEUEOPS_FILTER_MACADDR) && ++ (class != VMKNETDDI_QUEUEOPS_FILTER_VLANMACADDR)) { ++ printk(KERN_ERR "%s: recieved invalid RX NetQ filter: %x\n", ++ args->netdev->name, class); ++ return VMKNETDDI_QUEUEOPS_ERR; ++ } ++ ++ if (queueid > bp->num_rx_rings) { ++ printk(KERN_ERR "%s: applying filter with invalid RX NetQ %d ID\n", ++ args->netdev->name, queueid); ++ return VMKNETDDI_QUEUEOPS_ERR; ++ } ++ ++ bnapi = &bp->bnx2_napi[queueid]; ++ ++ if (bnapi->rx_queue_active || !bnapi->rx_queue_allocated) { ++ printk(KERN_ERR "%s: RX NetQ %d already active\n", ++ args->netdev->name, queueid); ++ return VMKNETDDI_QUEUEOPS_ERR; ++ } ++ ++ macaddr = (void *)vmknetddi_queueops_get_filter_macaddr(&args->filter); ++ memcpy(bnapi->mac_filter_addr, macaddr, ETH_ALEN); ++ vlan_id = vmknetddi_queueops_get_filter_vlanid(&args->filter); ++ ++ bnx2_set_mac_addr(bp, bnapi->mac_filter_addr, ++ fw_queueid + QID_TO_PM_OFFSET); ++ ++ /* Apply RX filter code here */ ++ args->filterid = VMKNETDDI_QUEUEOPS_MK_FILTERID(queueid); ++ ++ memset(&kwqe_set_rx_filter, 0, sizeof(&kwqe_set_rx_filter)); ++ ++ kwqe_set_rx_filter.flags = KWQE_FLAGS_LAYER_MASK_L2; ++ kwqe_set_rx_filter.opcode = L2_KWQE_OPCODE_VALUE_VM_SET_RX_FILTER; ++ ++#if defined(__LITTLE_ENDIAN) ++ memcpy(&kwqe_set_rx_filter.mac_addr_hi, bnapi->mac_filter_addr, 2); ++ memcpy(&kwqe_set_rx_filter.mac_addr_lo, bnapi->mac_filter_addr + 2, 4); ++#else ++ memcpy(&kwqe_set_rx_filter.mac_addr, bnapi->mac_filter_addr, 6); ++#endif ++ ++ if (class == VMKNETDDI_QUEUEOPS_FILTER_MACADDR) { ++ kwqe_set_rx_filter.filter_type = L2_VM_FILTER_MAC; ++ } else { ++ kwqe_set_rx_filter.filter_type = L2_VM_FILTER_MAC_VLAN; ++ kwqe_set_rx_filter.vlan = vlan_id; ++ } ++ kwqe_set_rx_filter.qid = fw_queueid; ++ ++ rc = bnx2_netqueue_submit_kwqes(bp, ++ (struct l2_kwqe *) &kwqe_set_rx_filter); ++ if (rc != 0) { ++ printk(KERN_ERR "Couldn't submit rx filter kwqe\n"); ++ return VMKNETDDI_QUEUEOPS_ERR; ++ } ++ ++ bp->netq_flags = 0; ++ rc = wait_event_timeout(bp->netq_wait, ++ (bp->netq_flags & ++ L2_KCQE_OPCODE_VALUE_VM_SET_RX_FILTER), ++ NETQ_WAIT_EVENT_TIMEOUT); ++ ++ if (rc != 0) { ++ printk(KERN_INFO "%s: NetQ set RX Filter: %d [%s %d]\n", ++ bp->dev->name, ++ queueid, print_mac(mac, macaddr), vlan_id); ++ ++ return VMKNETDDI_QUEUEOPS_OK; ++ } else { ++ printk(KERN_INFO "%s: Timeout submitting NetQ set RX Filter: %d [%s]\n", ++ bp->dev->name, queueid, print_mac(mac, macaddr)); ++ ++ return VMKNETDDI_QUEUEOPS_ERR; ++ } ++} ++ ++static int ++bnx2_netq_get_queue_stats(vmknetddi_queueop_get_stats_args_t *args) ++{ ++ u16 queueid = VMKNETDDI_QUEUEOPS_QUEUEID_VAL(args->queueid); ++ struct bnx2_napi *bnapi; ++ struct bnx2 *bp = netdev_priv(args->netdev); ++ ++ bnapi = &bp->bnx2_napi[queueid]; ++ ++ args->stats = &bnapi->stats; ++ ++ return VMKNETDDI_QUEUEOPS_OK; ++} ++ ++static int ++bnx2_netq_get_netqueue_version(vmknetddi_queueop_get_version_args_t *args) ++{ ++ return vmknetddi_queueops_version(args); ++} ++ ++static int ++bnx2_netqueue_ops(vmknetddi_queueops_op_t op, void *args) ++{ ++ switch (op) { ++ case VMKNETDDI_QUEUEOPS_OP_GET_VERSION: ++ return bnx2_netq_get_netqueue_version( ++ (vmknetddi_queueop_get_version_args_t *)args); ++ break; ++ ++ case VMKNETDDI_QUEUEOPS_OP_GET_FEATURES: ++ return bnx2_netq_get_netqueue_features( ++ (vmknetddi_queueop_get_features_args_t *)args); ++ break; ++ ++ case VMKNETDDI_QUEUEOPS_OP_GET_QUEUE_COUNT: ++ return bnx2_netq_get_queue_count( ++ (vmknetddi_queueop_get_queue_count_args_t *)args); ++ break; ++ ++ case VMKNETDDI_QUEUEOPS_OP_GET_FILTER_COUNT: ++ return bnx2_netq_get_filter_count( ++ (vmknetddi_queueop_get_filter_count_args_t *)args); ++ break; ++ ++ case VMKNETDDI_QUEUEOPS_OP_ALLOC_QUEUE: ++ return bnx2_netq_alloc_queue( ++ (vmknetddi_queueop_alloc_queue_args_t *)args); ++ break; ++ ++ case VMKNETDDI_QUEUEOPS_OP_FREE_QUEUE: ++ return bnx2_netq_free_queue( ++ (vmknetddi_queueop_free_queue_args_t *)args); ++ break; ++ ++ case VMKNETDDI_QUEUEOPS_OP_GET_QUEUE_VECTOR: ++ return bnx2_netq_get_queue_vector( ++ (vmknetddi_queueop_get_queue_vector_args_t *)args); ++ break; ++ ++ case VMKNETDDI_QUEUEOPS_OP_GET_DEFAULT_QUEUE: ++ return bnx2_netq_get_default_queue( ++ (vmknetddi_queueop_get_default_queue_args_t *)args); ++ break; ++ ++ case VMKNETDDI_QUEUEOPS_OP_APPLY_RX_FILTER: ++ return bnx2_netq_apply_rx_filter( ++ (vmknetddi_queueop_apply_rx_filter_args_t *)args); ++ break; ++ ++ case VMKNETDDI_QUEUEOPS_OP_REMOVE_RX_FILTER: ++ return bnx2_netq_remove_rx_filter( ++ (vmknetddi_queueop_remove_rx_filter_args_t *)args); ++ break; ++ ++ case VMKNETDDI_QUEUEOPS_OP_GET_STATS: ++ return bnx2_netq_get_queue_stats( ++ (vmknetddi_queueop_get_stats_args_t *)args); ++ break; ++ ++ /* Unsupported for now */ ++ case VMKNETDDI_QUEUEOPS_OP_SET_TX_PRIORITY: ++ return VMKNETDDI_QUEUEOPS_ERR; ++ break; ++ ++ default: ++ printk(KERN_WARNING "Unhandled NETQUEUE OP %d\n", op); ++ return VMKNETDDI_QUEUEOPS_ERR; ++ } ++ ++ return VMKNETDDI_QUEUEOPS_ERR; ++} ++#endif /* defined(__VMKLNX__) && defined(__VMKNETDDI_QUEUEOPS__) */ ++ +diff -r 19900e8f54d8 drivers/net/bnx2.h +--- a/drivers/net/bnx2.h Mon Jun 15 16:27:59 2009 +0100 ++++ b/drivers/net/bnx2.h Mon Jun 15 16:38:18 2009 +0100 +@@ -12,6 +12,890 @@ + + #ifndef BNX2_H + #define BNX2_H ++ ++#if (LINUX_VERSION_CODE >= 0x020610) ++#define BCM_CNIC 1 ++#endif ++ ++#if defined(__VMKLNX__) && (VMWARE_ESX_DDK_VERSION >= 41000) ++#define VMWARE_ISCSI ++#endif ++ ++#if defined(__VMKLNX__) ++#define HAVE_LE32 1 ++#define HAVE_IP_HDR 1 ++#define NEW_SKB 1 ++#define BNX2_NEW_NAPI 1 ++#endif ++ ++#ifndef ADVERTISE_1000XFULL ++#define ADVERTISE_1000XFULL 0x0020 ++#define ADVERTISE_1000XHALF 0x0040 ++#define ADVERTISE_1000XPAUSE 0x0080 ++#define ADVERTISE_1000XPSE_ASYM 0x0100 ++#endif ++ ++#ifndef ADVERTISE_PAUSE_CAP ++#define ADVERTISE_PAUSE_CAP 0x0400 ++#define ADVERTISE_PAUSE_ASYM 0x0800 ++#endif ++ ++#ifndef MII_CTRL1000 ++#define MII_CTRL1000 0x9 ++#define MII_STAT1000 0xa ++#endif ++ ++#ifndef BMCR_SPEED1000 ++#define BMCR_SPEED1000 0x0040 ++#endif ++ ++#ifndef ADVERTISE_1000FULL ++#define ADVERTISE_1000FULL 0x0200 ++#define ADVERTISE_1000HALF 0x0100 ++#endif ++ ++#ifndef SPEED_2500 ++#define SPEED_2500 2500 ++#endif ++ ++#ifndef SUPPORTED_2500baseX_Full ++#define SUPPORTED_2500baseX_Full (1 << 15) ++#define ADVERTISED_2500baseX_Full (1 << 15) ++#endif ++ ++#ifndef ETH_FCS_LEN ++#define ETH_FCS_LEN 4 ++#endif ++ ++#ifndef PCI_DEVICE_ID_NX2_5706 ++#define PCI_DEVICE_ID_NX2_5706 0x164a ++#define PCI_DEVICE_ID_NX2_5706S 0x16aa ++#endif ++ ++#ifndef PCI_DEVICE_ID_NX2_5708 ++#define PCI_DEVICE_ID_NX2_5708 0x164c ++#define PCI_DEVICE_ID_NX2_5708S 0x16ac ++#endif ++ ++#ifndef PCI_DEVICE_ID_NX2_5709 ++#define PCI_DEVICE_ID_NX2_5709 0x1639 ++#endif ++ ++#ifndef PCI_DEVICE_ID_NX2_5709S ++#define PCI_DEVICE_ID_NX2_5709S 0x163a ++#endif ++ ++#ifndef PCI_DEVICE_ID_AMD_8132_BRIDGE ++#define PCI_DEVICE_ID_AMD_8132_BRIDGE 0x7458 ++#endif ++ ++#ifndef IRQ_RETVAL ++typedef void irqreturn_t; ++#define IRQ_RETVAL(x) ++#define IRQ_HANDLED ++#define IRQ_NONE ++#endif ++ ++#ifndef IRQF_SHARED ++#define IRQF_SHARED SA_SHIRQ ++#endif ++ ++#ifndef NETDEV_TX_OK ++#define NETDEV_TX_OK 0 ++#endif ++ ++#ifndef NETDEV_TX_BUSY ++#define NETDEV_TX_BUSY 1 ++#endif ++ ++#if (LINUX_VERSION_CODE < 0x020547) ++#define pci_set_consistent_dma_mask(pdev, mask) (0) ++#endif ++ ++#ifndef PCI_CAP_ID_EXP ++#define PCI_CAP_ID_EXP 0x10 ++#endif ++ ++#ifndef DEFINE_PCI_DEVICE_TABLE ++#define DEFINE_PCI_DEVICE_TABLE(_table) \ ++ struct pci_device_id _table[] ++#endif ++ ++#if (LINUX_VERSION_CODE < 0x020604) ++#define MODULE_VERSION(version) ++#endif ++ ++#ifndef SET_MODULE_OWNER ++#define SET_MODULE_OWNER(dev) do { } while (0) ++#endif ++ ++#ifndef CHECKSUM_PARTIAL ++#define CHECKSUM_PARTIAL CHECKSUM_HW ++#endif ++ ++#ifndef DMA_64BIT_MASK ++#define DMA_64BIT_MASK ((u64) 0xffffffffffffffffULL) ++#define DMA_32BIT_MASK ((u64) 0x00000000ffffffffULL) ++#endif ++ ++#ifndef DMA_40BIT_MASK ++#define DMA_40BIT_MASK ((u64) 0x000000ffffffffffULL) ++#endif ++ ++#ifndef mmiowb ++#define mmiowb() ++#endif ++ ++#if !defined(__iomem) ++#define __iomem ++#endif ++ ++#if !defined(__rcquires) ++#define __acquires(x) ++#define __releases(x) ++#endif ++ ++#ifndef HAVE_LE32 ++typedef u32 __le32; ++typedef u32 __be32; ++#endif ++ ++#ifndef USEC_PER_SEC ++#define USEC_PER_SEC 1000000L ++#endif ++ ++#ifndef __maybe_unused ++#define __maybe_unused ++#endif ++ ++#if (LINUX_VERSION_CODE < 0x2060b) ++typedef u32 pm_message_t; ++typedef u32 pci_power_t; ++#define PCI_D0 0 ++#define PCI_D3hot 3 ++#endif ++ ++#if (LINUX_VERSION_CODE < 0x020605) ++#define pci_dma_sync_single_for_cpu(pdev, map, len, dir) \ ++ pci_dma_sync_single(pdev, map, len, dir) ++ ++#define pci_dma_sync_single_for_device(pdev, map, len, dir) ++#endif ++ ++#if defined(__VMKLNX__) && defined(__VMKNETDDI_QUEUEOPS__) ++ ++#define QID_TO_PM_OFFSET 4 ++ ++/* u32 fw_doorbell_ready */ ++#define KWQ_READY (1<<0) ++#define KWQ1_READY (1<<1) ++#define KWQ2_READY (1<<2) ++#define KWQ3_READY (1<<3) ++ ++#define KCQ_READY (1<<0) ++#define KCQ1_READY (1<<1) ++#define KCQ2_READY (1<<2) ++#define KCQ3_READY (1<<3) ++ ++typedef u16 l2_kcqe_errors_t; ++ #define L2_KCQE_ERRORS_BAD_CRC (1<<1) ++ #define L2_KCQE_ERRORS_PHY_DECODE (1<<2) ++ #define L2_KCQE_ERRORS_ALIGNMENT (1<<3) ++ #define L2_KCQE_ERRORS_TOO_SHORT (1<<4) ++ #define L2_KCQE_ERRORS_GIANT_FRAME (1<<5) ++ ++typedef u16 l2_kcqe_status_t; ++ #define L2_KCQE_STATUS_RULE_CLASS (0x7<<0) ++ #define L2_KCQE_STATUS_RULE_P2 (1<<3) ++ #define L2_KCQE_STATUS_RULE_P3 (1<<4) ++ #define L2_KCQE_STATUS_RULE_P4 (1<<5) ++ #define L2_KCQE_STATUS_L2_VLAN_TAG (1<<6) ++ #define L2_KCQE_STATUS_L2_LLC_SNAP (1<<7) ++ #define L2_KCQE_STATUS_L2_HASH (0x1f<<8) ++ #define L2_KCQE_STATUS_IP_DATAGRAM (1<<13) ++ #define L2_KCQE_STATUS_TCP_SEGMENT (1<<14) ++ #define L2_KCQE_STATUS_UDP_DATAGRAM (1<<15) ++ ++typedef u8 l2_kcqe_opcode_t; ++ #define L2_KCQE_OPCODE_VALUE (0xff<<0) ++ #define L2_KCQE_OPCODE_VALUE_RX_PACKET (0<<0) ++ #define L2_KCQE_OPCODE_VALUE_ENABLE_RSS (1<<0) ++ #define L2_KCQE_OPCODE_VALUE_DISABLE_RSS (2<<0) ++ #define L2_KCQE_OPCODE_VALUE_UPDATE_RSS (3<<0) ++ #define L2_KCQE_OPCODE_VALUE_FLUSH_BD_CHAIN (4<<0) ++ #define L2_KCQE_OPCODE_VALUE_DEBUG (5<<0) ++ #define L2_KCQE_OPCODE_VALUE_VM_ALLOC_TX_QUEUE (6<<0) ++ #define L2_KCQE_OPCODE_VALUE_VM_FREE_TX_QUEUE (7<<0) ++ #define L2_KCQE_OPCODE_VALUE_VM_ALLOC_RX_QUEUE (8<<0) ++ #define L2_KCQE_OPCODE_VALUE_VM_FREE_RX_QUEUE (9<<0) ++ #define L2_KCQE_OPCODE_VALUE_VM_SET_RX_FILTER (10<<0) ++ #define L2_KCQE_OPCODE_VALUE_VM_REMOVE_RX_FILTER (11<<0) ++ ++typedef u8 l2_kcqe_flags_t; ++ #define L2_KCQE_FLAGS_LAYER_MASK (0x7<<4) ++ #define L2_KCQE_FLAGS_LAYER_MASK_MISC (0<<4) ++ #define L2_KCQE_FLAGS_LAYER_MASK_L2 (2<<4) ++ #define L2_KCQE_FLAGS_LAYER_MASK_L3 (3<<4) ++ #define L2_KCQE_FLAGS_LAYER_MASK_L4 (4<<4) ++ #define L2_KCQE_FLAGS_LAYER_MASK_L5 (5<<4) ++ #define L2_KCQE_FLAGS_NEXT (1<<7) ++ ++/* ++ * l2_kcqe_l definition ++ */ ++#if defined(__BIG_ENDIAN) ++struct l2_kcqe { ++ u8 qid; ++ u8 status; ++ u16 reserved; ++ u32 reserved1[6]; ++ ++ l2_kcqe_flags_t flags; ++ l2_kcqe_opcode_t opcode; ++ u16 qe_self_seq; ++}; ++#elif defined(__LITTLE_ENDIAN) ++struct l2_kcqe { ++ u8 qid; ++ u8 status; ++ u16 reserved; ++ u32 reserved1[6]; ++ ++ u16 qe_self_seq; ++ l2_kcqe_opcode_t opcode; ++ l2_kcqe_flags_t flags; ++}; ++#endif ++ ++/* ++ * l2_kcqe_vm_alloc_tx_queue definition ++ */ ++#if defined(BIG_ENDIAN) ++struct l2_kcqe_vm_alloc_tx_queue { ++ u8 qid; ++ u8 status; ++ u16 reserved; ++ u32 reserved1[5]; ++ ++ l2_kcqe_flags_t flags; ++ l2_kcqe_opcode_t opcode; ++ u16 qe_self_seq; ++}; ++#elif defined(LITTLE_ENDIAN) ++struct l2_kcqe_vm_alloc_tx_queue { ++ u16 reserved; ++ u8 status; ++ u8 qid; ++ u32 reserved1[5]; ++ ++ u16 qe_self_seq; ++ l2_kcqe_opcode_t opcode; ++ l2_kcqe_flags_t flags; ++}; ++#endif ++ ++/* ++ * l2_kcqe_vm_free_tx_queue definition ++ */ ++#if defined(BIG_ENDIAN) ++struct l2_kcqe_vm_free_tx_queue { ++ u8 qid; ++ u8 status; ++ u16 nx_bidx; ++ u32 reserved1[5]; ++ ++ l2_kcqe_flags_t flags; ++ l2_kcqe_opcode_t opcode; ++ u16 qe_self_seq; ++}; ++#elif defined(LITTLE_ENDIAN) ++struct l2_kcqe_vm_free_tx_queue { ++ u16 nx_bidx; ++ u8 status; ++ u8 qid; ++ u32 reserved1[5]; ++ ++ u16 qe_self_seq; ++ l2_kcqe_opcode_t opcode; ++ l2_kcqe_flags_t flags; ++}; ++#endif ++ ++/* ++ * l2_kcqe_vm_alloc_rx_queue definition ++ */ ++#if defined(BIG_ENDIAN) ++struct l2_kcqe_vm_alloc_rx_queue_b { ++ u8 qid; ++ u8 status; ++ u16 reserved; ++ u32 reserved1[5]; ++ ++ l2_kcqe_flags_t flags; ++ l2_kcqe_opcode_t opcode; ++ u16 qe_self_seq; ++}; ++#elif defined(LITTLE_ENDIAN) ++struct l2_kcqe_vm_alloc_rx_queue_l { ++ u16 reserved; ++ u8 status; ++ u8 qid; ++ u32 reserved1[5]; ++ ++ u16 qe_self_seq; ++ l2_kcqe_opcode_t opcode; ++ l2_kcqe_flags_t flags; ++}; ++#endif ++ ++/* ++ * l2_kcqe_vm_free_rx_queue definition ++ */ ++#if defined(BIG_ENDIAN) ++struct l2_kcqe_vm_free_rx_queue { ++ u8 qid; ++ u8 status; ++ u16 nx_bidx; ++ u32 reserved1[5]; ++ ++ l2_kcqe_flags_t flags; ++ l2_kcqe_opcode_t opcode; ++ u16 qe_self_seq; ++}; ++#elif defined(LITTLE_ENDIAN) ++struct l2_kcqe_vm_free_rx_queue { ++ u16 nx_bidx; ++ u8 status; ++ u8 qid; ++ u32 reserved1[5]; ++ ++ u16 qe_self_seq; ++ l2_kcqe_opcode_t opcode; ++ l2_kcqe_flags_t flags; ++}; ++#endif ++ ++/* ++ * l2_kcqe_vm_set_rx_filter definition ++ */ ++#if defined(BIG_ENDIAN) ++struct l2_kcqe_vm_set_rx_filter { ++ u8 qid; ++ u8 status; ++ u16 reserved1; ++ u32 reserved2[5]; ++ ++ l2_kcqe_flags_t flags; ++ l2_kcqe_opcode_t opcode; ++ u16 qe_self_seq; ++}; ++#elif defined(LITTLE_ENDIAN) ++struct l2_kcqe_vm_set_rx_filter { ++ u16 reserved1; ++ u8 status; ++ u8 qid; ++ u32 reserved2[5]; ++ ++ u16 qe_self_seq; ++ l2_kcqe_opcode_t opcode; ++ l2_kcqe_flags_t flags; ++}; ++#endif ++ ++/* ++ * l2_kcqe_vm_remove_rx_filter definition ++ */ ++#if defined(BIG_ENDIAN) ++struct l2_kcqe_vm_remove_rx_filter { ++ u8 qid; ++ u8 status; ++ u16 reserved1; ++ u32 reserved2[5]; ++ ++ l2_kcqe_flags_t flags; ++ l2_kcqe_opcode_t opcode; ++ u16 qe_self_seq; ++}; ++#elif defined(LITTLE_ENDIAN) ++struct l2_kcqe_vm_remove_rx_filter { ++ u16 reserved1; ++ u8 status; ++ u8 qid; ++ u32 reserved2[5]; ++ ++ u16 qe_self_seq; ++ l2_kcqe_opcode_t opcode; ++ l2_kcqe_flags_t flags; ++}; ++#endif ++ ++/* ++ * kwqe definition ++ */ ++#if defined(__BIG_ENDIAN) ++struct l2_kwqe { ++ u8 kwqe_flags; ++ #define KWQE_FLAGS_LAYER_MASK (0x7<<4) ++ #define KWQE_FLAGS_LAYER_MASK_MISC (0<<4) ++ #define KWQE_FLAGS_LAYER_MASK_L2 (2<<4) ++ #define KWQE_FLAGS_LAYER_MASK_L3 (3<<4) ++ #define KWQE_FLAGS_LAYER_MASK_L4 (4<<4) ++ #define KWQE_FLAGS_LAYER_MASK_L5 (5<<4) ++ #define KWQE_FLAGS_NEXT (1<<7) ++ u8 kwqe_opcode; ++ u16 kwqe_info; ++ u32 kwqe_info0; ++ u32 kwqe_info1; ++ u32 kwqe_info2; ++ u32 kwqe_info3; ++ u32 kwqe_info4; ++ u32 kwqe_info5; ++ u32 kwqe_info6; ++}; ++#elif defined(__LITTLE_ENDIAN) ++struct l2_kwqe { ++ u16 kwqe_info; ++ u8 kwqe_opcode; ++ u8 kwqe_flags; ++ #define KWQE_FLAGS_LAYER_MASK (0x7<<4) ++ #define KWQE_FLAGS_LAYER_MASK_MISC (0<<4) ++ #define KWQE_FLAGS_LAYER_MASK_L2 (2<<4) ++ #define KWQE_FLAGS_LAYER_MASK_L3 (3<<4) ++ #define KWQE_FLAGS_LAYER_MASK_L4 (4<<4) ++ #define KWQE_FLAGS_LAYER_MASK_L5 (5<<4) ++ #define KWQE_FLAGS_GET_DEBUG_TRACE (7<<4) ++ #define KWQE_FLAGS_NEXT (1<<7) ++ u32 kwqe_info0; ++ u32 kwqe_info1; ++ u32 kwqe_info2; ++ u32 kwqe_info3; ++ u32 kwqe_info4; ++ u32 kwqe_info5; ++ u32 kwqe_info6; ++}; ++#endif ++ ++typedef u8 l2_kwqe_flags_t; ++ #define L2_KWQE_FLAGS_LAYER_MASK (0x7<<4) ++ #define L2_KWQE_FLAGS_LAYER_MASK_MISC (0<<4) ++ #define L2_KWQE_FLAGS_LAYER_MASK_L2 (2<<4) ++ #define L2_KWQE_FLAGS_LAYER_MASK_L3 (3<<4) ++ #define L2_KWQE_FLAGS_LAYER_MASK_L4 (4<<4) ++ #define L2_KWQE_FLAGS_LAYER_MASK_L5 (5<<4) ++ #define L2_KWQE_FLAGS_NEXT (1<<7) ++ ++typedef u8 l2_kwqe_opcode_t; ++ #define L2_KWQE_OPCODE_VALUE (0xff<<0) ++ #define L2_KWQE_OPCODE_VALUE_NOP (0<<0) ++ #define L2_KWQE_OPCODE_VALUE_ENABLE_RSS (1<<0) ++ #define L2_KWQE_OPCODE_VALUE_DISABLE_RSS (2<<0) ++ #define L2_KWQE_OPCODE_VALUE_UPDATE_RSS (3<<0) ++ #define L2_KWQE_OPCODE_VALUE_FLUSH_BD_CHAIN (4<<0) ++ #define L2_KWQE_OPCODE_VALUE_VM_ALLOC_TX_QUEUE (5<<0) ++ #define L2_KWQE_OPCODE_VALUE_VM_FREE_TX_QUEUE (6<<0) ++ #define L2_KWQE_OPCODE_VALUE_VM_ALLOC_RX_QUEUE (7<<0) ++ #define L2_KWQE_OPCODE_VALUE_VM_FREE_RX_QUEUE (8<<0) ++ #define L2_KWQE_OPCODE_VALUE_VM_SET_RX_FILTER (9<<0) ++ #define L2_KWQE_OPCODE_VALUE_VM_REMOVE_RX_FILTER (10<<0) ++ ++typedef u8 l2_kwqe_vm_filter_t; ++ #define L2_VM_FILTER_UNDEFINED 0 ++ #define L2_VM_FILTER_MAC 1 ++ #define L2_VM_FILTER_MAC_VLAN 2 ++ #define L2_VM_FILTER_VLAN 3 ++ ++typedef u8 l2_kwqe_queue_t; ++ #define L2_NORMAL_QUEUE 0 ++ #define L2_NET_QUEUE 1 ++ #define L2_VM_QUEUE 2 ++ #define L2_VM_DROP_QUEUE 3 ++ ++/* ++ * l2_kwqe_vm_alloc_tx_queue definition ++ */ ++#if defined(__BIG_ENDIAN) ++struct l2_kwqe_vm_alloc_tx_queue { ++ l2_kwqe_flags_t flags; ++ l2_kwqe_opcode_t opcode; ++ u8 queue_type; ++ u8 qid; ++ u32 reserved1[6]; ++}; ++#elif defined(__LITTLE_ENDIAN) ++struct l2_kwqe_vm_alloc_tx_queue { ++ u8 qid; ++ u8 queue_type; ++ l2_kwqe_opcode_t opcode; ++ l2_kwqe_flags_t flags; ++ u32 reserved1[6]; ++}; ++#endif ++ ++/* ++ * l2_kwqe_vm_free_tx_queue definition ++ */ ++#if defined(__BIG_ENDIAN) ++struct l2_kwqe_vm_free_tx_queue { ++ l2_kwqe_flags_t flags; ++ l2_kwqe_opcode_t opcode; ++ u8 qid; ++ u8 reserved; ++ u32 reserved1[6]; ++}; ++#elif defined(__LITTLE_ENDIAN) ++struct l2_kwqe_vm_free_tx_queue { ++ u8 reserved; ++ u8 qid; ++ l2_kwqe_opcode_t opcode; ++ l2_kwqe_flags_t flags; ++ u32 reserved1[6]; ++}; ++#endif ++ ++/* ++ * l2_kwqe_vm_alloc_rx_queue definition ++ */ ++#if defined(__BIG_ENDIAN) ++struct l2_kwqe_vm_alloc_rx_queue { ++ l2_kwqe_flags_t flags; ++ l2_kwqe_opcode_t opcode; ++ u8 queue_type; ++ u8 qid; ++ u32 reserved1[6]; ++}; ++#elif defined(__LITTLE_ENDIAN) ++struct l2_kwqe_vm_alloc_rx_queue { ++ u8 qid; ++ u8 queue_type; ++ l2_kwqe_opcode_t kwqe_opcode; ++ l2_kwqe_flags_t kwqe_flags; ++ u32 reserved1[6]; ++}; ++#endif ++ ++/* ++ * l2_kwqe_vm_free_rx_queue definition ++ */ ++#if defined(__BIG_ENDIAN) ++struct l2_kwqe_vm_free_rx_queue { ++ l2_kwqe_flags_t flags; ++ l2_kwqe_opcode_t opcode; ++ u8 qid; ++ u8 reserved; ++ u32 reserved1[6]; ++}; ++#elif defined(__LITTLE_ENDIAN) ++struct l2_kwqe_vm_free_rx_queue { ++ u8 reserved; ++ u8 qid; ++ l2_kwqe_opcode_t opcode; ++ l2_kwqe_flags_t flags; ++ u32 reserved1[6]; ++}; ++#endif ++ ++/* ++ * l2_kwqe_vm_set_rx_filter definition ++ */ ++#if defined(__BIG_ENDIAN) ++struct l2_kwqe_vm_set_rx_filter { ++ l2_kwqe_flags_t flags; ++ l2_kwqe_opcode_t opcode; ++ u8 qid; ++ l2_kwqe_vm_filter_t filter_type; ++ u16 vlan; ++ u8 mac_addr[6]; ++ u32 reserved1[4]; ++} l2_kwqe_vm_set_rx_filter_b_t; ++#elif defined(__LITTLE_ENDIAN) ++struct l2_kwqe_vm_set_rx_filter { ++ l2_kwqe_vm_filter_t filter_type; ++ u8 qid; ++ l2_kwqe_opcode_t opcode; ++ l2_kwqe_flags_t flags; ++ ++ u16 mac_addr_hi; ++ u16 vlan; ++ u32 mac_addr_lo; ++ u32 reserved1[4]; ++}; ++#endif ++ ++/* ++ * l2_kwqe_vm_remove_rx_filter ++ */ ++#if defined(BIG_ENDIAN) ++struct l2_kwqe_vm_remove_rx_filter { ++ l2_kwqe_flags_t flags; ++ l2_kwqe_opcode_t opcode; ++ u8 qid; ++ l2_kwqe_vm_filter_t filter_type; ++ u32 reserved1[6]; ++}; ++#elif defined(__LITTLE_ENDIAN) ++struct l2_kwqe_vm_remove_rx_filter { ++ l2_kwqe_vm_filter_t filter_type; ++ u8 qid; ++ l2_kwqe_opcode_t opcode; ++ l2_kwqe_flags_t flags; ++ u32 reserved1[6]; ++}; ++#endif ++#endif ++ ++#if (LINUX_VERSION_CODE < 0x020612) ++static inline struct sk_buff *netdev_alloc_skb(struct net_device *dev, ++ unsigned int length) ++{ ++ struct sk_buff *skb = dev_alloc_skb(length); ++ if (skb) ++ skb->dev = dev; ++ return skb; ++} ++#endif ++ ++static inline void bnx2_skb_fill_page_desc(struct sk_buff *skb, int i, ++ struct page *page, int off, int size) ++{ ++#if (LINUX_VERSION_CODE < 0x020600) ++ skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; ++ ++ frag->page = page; ++ frag->page_offset = off; ++ frag->size = size; ++ skb_shinfo(skb)->nr_frags = i + 1; ++#else ++ skb_fill_page_desc(skb, i, page, off, size); ++#endif ++} ++ ++#ifndef NETIF_F_GSO ++static inline void netif_tx_lock(struct net_device *dev) ++{ ++ spin_lock(&dev->xmit_lock); ++ dev->xmit_lock_owner = smp_processor_id(); ++} ++ ++static inline void netif_tx_unlock(struct net_device *dev) ++{ ++ dev->xmit_lock_owner = -1; ++ spin_unlock(&dev->xmit_lock); ++} ++#endif ++ ++#if !defined(HAVE_NETDEV_PRIV) && (LINUX_VERSION_CODE != 0x020603) && (LINUX_VERSION_CODE != 0x020604) && (LINUX_VERSION_CODE != 0x20605) ++static inline void *netdev_priv(struct net_device *dev) ++{ ++ return dev->priv; ++} ++#endif ++ ++#ifdef OLD_NETIF ++static inline void netif_poll_disable(struct net_device *dev) ++{ ++ while (test_and_set_bit(__LINK_STATE_RX_SCHED, &dev->state)) { ++ /* No hurry. */ ++ current->state = TASK_INTERRUPTIBLE; ++ schedule_timeout(1); ++ } ++} ++ ++static inline void netif_poll_enable(struct net_device *dev) ++{ ++ clear_bit(__LINK_STATE_RX_SCHED, &dev->state); ++} ++ ++static inline void netif_tx_disable(struct net_device *dev) ++{ ++ spin_lock_bh(&dev->xmit_lock); ++ netif_stop_queue(dev); ++ spin_unlock_bh(&dev->xmit_lock); ++} ++ ++#endif ++ ++#if (LINUX_VERSION_CODE >= 0x20418) && (LINUX_VERSION_CODE < 0x2060c) ++static inline int bnx2_set_tx_hw_csum(struct net_device *dev, u32 data) ++{ ++ if (data) ++ dev->features |= NETIF_F_HW_CSUM; ++ else ++ dev->features &= ~NETIF_F_HW_CSUM; ++ ++ return 0; ++} ++#endif ++ ++#ifndef VLAN_GROUP_ARRAY_SPLIT_PARTS ++static inline void vlan_group_set_device(struct vlan_group *vg, int vlan_id, ++ struct net_device *dev) ++{ ++ if (vg) ++ vg->vlan_devices[vlan_id] = dev; ++} ++#endif ++ ++#ifdef NETIF_F_TSO ++#ifndef NETIF_F_GSO ++static inline int skb_is_gso(const struct sk_buff *skb) ++{ ++ return skb_shinfo(skb)->tso_size; ++} ++#define gso_size tso_size ++#define gso_segs tso_segs ++#endif ++#ifndef NETIF_F_TSO6 ++#define NETIF_F_TSO6 0 ++#define BCM_NO_TSO6 1 ++#endif ++#ifndef NETIF_F_TSO_ECN ++#define NETIF_F_TSO_ECN 0 ++#endif ++ ++#ifndef HAVE_IP_HDR ++static inline struct iphdr *ip_hdr(const struct sk_buff *skb) ++{ ++ return skb->nh.iph; ++} ++#endif ++ ++#ifndef NEW_SKB ++static inline int skb_transport_offset(const struct sk_buff *skb) ++{ ++ return (int) (skb->h.raw - skb->data); ++} ++ ++static inline unsigned int ip_hdrlen(const struct sk_buff *skb) ++{ ++ return ip_hdr(skb)->ihl * 4; ++} ++ ++static inline struct tcphdr *tcp_hdr(const struct sk_buff *skb) ++{ ++ return skb->h.th; ++} ++ ++static inline unsigned int tcp_optlen(const struct sk_buff *skb) ++{ ++ return (tcp_hdr(skb)->doff - 5) * 4; ++} ++ ++#endif ++#endif /* #ifdef NETIF_F_TSO */ ++ ++#ifndef VMWARE_ESX_40_DDK ++#if ((LINUX_VERSION_CODE >= 0x20617) && !defined(NETIF_F_MULTI_QUEUE)) || defined(__VMKLNX__) ++ ++#define BCM_HAVE_MULTI_QUEUE ++ ++#else ++ ++static inline void netif_tx_wake_all_queues(struct net_device *dev) ++{ ++ netif_wake_queue(dev); ++} ++ ++static inline void netif_tx_start_all_queues(struct net_device *dev) ++{ ++ netif_start_queue(dev); ++} ++ ++#endif ++#else ++#define BCM_HAVE_MULTI_QUEUE ++#endif ++ ++ ++#ifndef NET_SKB_PAD ++#define NET_SKB_PAD 16 ++#endif ++ ++#if (LINUX_VERSION_CODE < 0x02061e) ++static inline void skb_record_rx_queue(struct sk_buff *skb, u16 rx_queue) ++{ ++} ++#endif ++ ++#if (LINUX_VERSION_CODE < 0x020600) ++#define dev_err(unused, format, arg...) \ ++ printk(KERN_ERR "bnx2: " format , ## arg) ++#else ++#ifndef dev_err ++#ifndef dev_printk ++#define dev_printk(level, dev, format, arg...) \ ++ printk(level "bnx2 %s: " format , (dev)->bus_id , ## arg) ++#endif ++#define dev_err(dev, format, arg...) \ ++ dev_printk(KERN_ERR , dev , format , ## arg) ++#endif ++#endif ++ ++#ifndef DECLARE_MAC_BUF ++#define DECLARE_MAC_BUF(var) char var[18] ++#define MAC_FMT "%02x:%02x:%02x:%02x:%02x:%02x" ++static inline char *print_mac(char *buf, const u8 *addr) ++{ ++ sprintf(buf, MAC_FMT, ++ addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]); ++ return buf; ++} ++#endif ++ ++#ifndef ARRAY_SIZE ++#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) ++#endif ++ ++#if (LINUX_VERSION_CODE >= 0x020618) ++#define BNX2_NEW_NAPI 1 ++#endif ++ ++static inline void bnx2_msleep(unsigned int msecs) ++{ ++#if (LINUX_VERSION_CODE < 0x20607) ++ current->state = TASK_UNINTERRUPTIBLE; ++ schedule_timeout((msecs * HZ / 1000) + 1); ++#else ++ msleep(msecs); ++#endif ++} ++ ++static inline unsigned long bnx2_msleep_interruptible(unsigned int msecs) ++{ ++#if (LINUX_VERSION_CODE < 0x20609) ++ current->state = TASK_INTERRUPTIBLE; ++ return schedule_timeout((msecs * HZ / 1000) + 1); ++#else ++ return msleep_interruptible(msecs); ++#endif ++} ++ ++#ifdef __VMKLNX__ ++/** ++ * THIS FUNCTION SHOULD BE REMOVED ONCE PR 379263 IS RESOLVED ++ */ ++static void *bcm_memmove(void *dest, const void *src, size_t count) ++{ ++ char *tmp; ++ const char *s; ++ ++ if (dest <= src) { ++ tmp = dest; ++ s = src; ++ while (count--) ++ *tmp++ = *s++; ++ } else { ++ tmp = dest; ++ tmp += count; ++ s = src; ++ s += count; ++ while (count--) ++ *--tmp = *--s; ++ } ++ return dest; ++} ++#else ++#define bcm_memmove memmove ++#endif /* __VMKLNX__ */ + + /* Hardware data structures and register definitions automatically + * generated from RTL code. Do not modify. +@@ -66,7 +950,7 @@ + * status_block definition + */ + struct status_block { +- u32 status_attn_bits; ++ volatile u32 status_attn_bits; + #define STATUS_ATTN_BITS_LINK_STATE (1L<<0) + #define STATUS_ATTN_BITS_TX_SCHEDULER_ABORT (1L<<1) + #define STATUS_ATTN_BITS_TX_BD_READ_ABORT (1L<<2) +@@ -98,84 +982,85 @@ + #define STATUS_ATTN_BITS_EPB_ERROR (1L<<30) + #define STATUS_ATTN_BITS_PARITY_ERROR (1L<<31) + +- u32 status_attn_bits_ack; +-#if defined(__BIG_ENDIAN) +- u16 status_tx_quick_consumer_index0; +- u16 status_tx_quick_consumer_index1; +- u16 status_tx_quick_consumer_index2; +- u16 status_tx_quick_consumer_index3; +- u16 status_rx_quick_consumer_index0; +- u16 status_rx_quick_consumer_index1; +- u16 status_rx_quick_consumer_index2; +- u16 status_rx_quick_consumer_index3; +- u16 status_rx_quick_consumer_index4; +- u16 status_rx_quick_consumer_index5; +- u16 status_rx_quick_consumer_index6; +- u16 status_rx_quick_consumer_index7; +- u16 status_rx_quick_consumer_index8; +- u16 status_rx_quick_consumer_index9; +- u16 status_rx_quick_consumer_index10; +- u16 status_rx_quick_consumer_index11; +- u16 status_rx_quick_consumer_index12; +- u16 status_rx_quick_consumer_index13; +- u16 status_rx_quick_consumer_index14; +- u16 status_rx_quick_consumer_index15; +- u16 status_completion_producer_index; +- u16 status_cmd_consumer_index; +- u16 status_idx; +- u8 status_unused; +- u8 status_blk_num; +-#elif defined(__LITTLE_ENDIAN) +- u16 status_tx_quick_consumer_index1; +- u16 status_tx_quick_consumer_index0; +- u16 status_tx_quick_consumer_index3; +- u16 status_tx_quick_consumer_index2; +- u16 status_rx_quick_consumer_index1; +- u16 status_rx_quick_consumer_index0; +- u16 status_rx_quick_consumer_index3; +- u16 status_rx_quick_consumer_index2; +- u16 status_rx_quick_consumer_index5; +- u16 status_rx_quick_consumer_index4; +- u16 status_rx_quick_consumer_index7; +- u16 status_rx_quick_consumer_index6; +- u16 status_rx_quick_consumer_index9; +- u16 status_rx_quick_consumer_index8; +- u16 status_rx_quick_consumer_index11; +- u16 status_rx_quick_consumer_index10; +- u16 status_rx_quick_consumer_index13; +- u16 status_rx_quick_consumer_index12; +- u16 status_rx_quick_consumer_index15; +- u16 status_rx_quick_consumer_index14; +- u16 status_cmd_consumer_index; +- u16 status_completion_producer_index; +- u8 status_blk_num; +- u8 status_unused; +- u16 status_idx; +-#endif +-}; ++ volatile u32 status_attn_bits_ack; ++#if defined(__BIG_ENDIAN) ++ volatile u16 status_tx_quick_consumer_index0; ++ volatile u16 status_tx_quick_consumer_index1; ++ volatile u16 status_tx_quick_consumer_index2; ++ volatile u16 status_tx_quick_consumer_index3; ++ volatile u16 status_rx_quick_consumer_index0; ++ volatile u16 status_rx_quick_consumer_index1; ++ volatile u16 status_rx_quick_consumer_index2; ++ volatile u16 status_rx_quick_consumer_index3; ++ volatile u16 status_rx_quick_consumer_index4; ++ volatile u16 status_rx_quick_consumer_index5; ++ volatile u16 status_rx_quick_consumer_index6; ++ volatile u16 status_rx_quick_consumer_index7; ++ volatile u16 status_rx_quick_consumer_index8; ++ volatile u16 status_rx_quick_consumer_index9; ++ volatile u16 status_rx_quick_consumer_index10; ++ volatile u16 status_rx_quick_consumer_index11; ++ volatile u16 status_rx_quick_consumer_index12; ++ volatile u16 status_rx_quick_consumer_index13; ++ volatile u16 status_rx_quick_consumer_index14; ++ volatile u16 status_rx_quick_consumer_index15; ++ volatile u16 status_completion_producer_index; ++ volatile u16 status_cmd_consumer_index; ++ volatile u16 status_idx; ++ volatile u8 status_unused; ++ volatile u8 status_blk_num; ++#elif defined(__LITTLE_ENDIAN) ++ volatile u16 status_tx_quick_consumer_index1; ++ volatile u16 status_tx_quick_consumer_index0; ++ volatile u16 status_tx_quick_consumer_index3; ++ volatile u16 status_tx_quick_consumer_index2; ++ volatile u16 status_rx_quick_consumer_index1; ++ volatile u16 status_rx_quick_consumer_index0; ++ volatile u16 status_rx_quick_consumer_index3; ++ volatile u16 status_rx_quick_consumer_index2; ++ volatile u16 status_rx_quick_consumer_index5; ++ volatile u16 status_rx_quick_consumer_index4; ++ volatile u16 status_rx_quick_consumer_index7; ++ volatile u16 status_rx_quick_consumer_index6; ++ volatile u16 status_rx_quick_consumer_index9; ++ volatile u16 status_rx_quick_consumer_index8; ++ volatile u16 status_rx_quick_consumer_index11; ++ volatile u16 status_rx_quick_consumer_index10; ++ volatile u16 status_rx_quick_consumer_index13; ++ volatile u16 status_rx_quick_consumer_index12; ++ volatile u16 status_rx_quick_consumer_index15; ++ volatile u16 status_rx_quick_consumer_index14; ++ volatile u16 status_cmd_consumer_index; ++ volatile u16 status_completion_producer_index; ++ volatile u8 status_blk_num; ++ volatile u8 status_unused; ++ volatile u16 status_idx; ++#endif ++}; ++ + + /* + * status_block definition + */ + struct status_block_msix { + #if defined(__BIG_ENDIAN) +- u16 status_tx_quick_consumer_index; +- u16 status_rx_quick_consumer_index; +- u16 status_completion_producer_index; +- u16 status_cmd_consumer_index; +- u32 status_unused; +- u16 status_idx; +- u8 status_unused2; +- u8 status_blk_num; +-#elif defined(__LITTLE_ENDIAN) +- u16 status_rx_quick_consumer_index; +- u16 status_tx_quick_consumer_index; +- u16 status_cmd_consumer_index; +- u16 status_completion_producer_index; +- u32 status_unused; +- u8 status_blk_num; +- u8 status_unused2; +- u16 status_idx; ++ volatile u16 status_tx_quick_consumer_index; ++ volatile u16 status_rx_quick_consumer_index; ++ volatile u16 status_completion_producer_index; ++ volatile u16 status_cmd_consumer_index; ++ volatile u32 status_unused; ++ volatile u16 status_idx; ++ volatile u8 status_unused2; ++ volatile u8 status_blk_num; ++#elif defined(__LITTLE_ENDIAN) ++ volatile u16 status_rx_quick_consumer_index; ++ volatile u16 status_tx_quick_consumer_index; ++ volatile u16 status_cmd_consumer_index; ++ volatile u16 status_completion_producer_index; ++ volatile u32 status_unused; ++ volatile u8 status_blk_num; ++ volatile u8 status_unused2; ++ volatile u16 status_idx; + #endif + }; + +@@ -361,6 +1246,9 @@ + #define BNX2_L2CTX_CTX_TYPE_CTX_BD_CHN_TYPE_VALUE (1<<28) + + #define BNX2_L2CTX_HOST_BDIDX 0x00000004 ++#define BNX2_L2CTX_STATUSB_NUM_SHIFT 16 ++#define BNX2_L2CTX_STATUSB_NUM(sb_id) \ ++ (((sb_id) > 0) ? (((sb_id) + 7) << BNX2_L2CTX_STATUSB_NUM_SHIFT) : 0) + #define BNX2_L2CTX_HOST_BSEQ 0x00000008 + #define BNX2_L2CTX_NX_BSEQ 0x0000000c + #define BNX2_L2CTX_NX_BDHADDR_HI 0x00000010 +@@ -378,6 +1266,9 @@ + * pci_config_l definition + * offset: 0000 + */ ++#define BNX2_PCICFG_MSI_CONTROL 0x00000058 ++#define BNX2_PCICFG_MSI_CONTROL_ENABLE (1L<<16) ++ + #define BNX2_PCICFG_MISC_CONFIG 0x00000068 + #define BNX2_PCICFG_MISC_CONFIG_TARGET_BYTE_SWAP (1L<<2) + #define BNX2_PCICFG_MISC_CONFIG_TARGET_MB_WORD_SWAP (1L<<3) +@@ -4199,7 +5090,14 @@ + + #define BNX2_RBUF_CONFIG 0x0020000c + #define BNX2_RBUF_CONFIG_XOFF_TRIP (0x3ffL<<0) ++#define BNX2_RBUF_CONFIG_XOFF_TRIP_VAL(mtu) \ ++ ((((mtu) - 1500) * 31 / 1000) + 54) + #define BNX2_RBUF_CONFIG_XON_TRIP (0x3ffL<<16) ++#define BNX2_RBUF_CONFIG_XON_TRIP_VAL(mtu) \ ++ ((((mtu) - 1500) * 39 / 1000) + 66) ++#define BNX2_RBUF_CONFIG_VAL(mtu) \ ++ (BNX2_RBUF_CONFIG_XOFF_TRIP_VAL(mtu) | \ ++ (BNX2_RBUF_CONFIG_XON_TRIP_VAL(mtu) << 16)) + + #define BNX2_RBUF_FW_BUF_ALLOC 0x00200010 + #define BNX2_RBUF_FW_BUF_ALLOC_VALUE (0x1ffL<<7) +@@ -4221,11 +5119,25 @@ + + #define BNX2_RBUF_CONFIG2 0x0020001c + #define BNX2_RBUF_CONFIG2_MAC_DROP_TRIP (0x3ffL<<0) ++#define BNX2_RBUF_CONFIG2_MAC_DROP_TRIP_VAL(mtu) \ ++ ((((mtu) - 1500) * 4 / 1000) + 5) + #define BNX2_RBUF_CONFIG2_MAC_KEEP_TRIP (0x3ffL<<16) ++#define BNX2_RBUF_CONFIG2_MAC_KEEP_TRIP_VAL(mtu) \ ++ ((((mtu) - 1500) * 2 / 100) + 30) ++#define BNX2_RBUF_CONFIG2_VAL(mtu) \ ++ (BNX2_RBUF_CONFIG2_MAC_DROP_TRIP_VAL(mtu) | \ ++ (BNX2_RBUF_CONFIG2_MAC_KEEP_TRIP_VAL(mtu) << 16)) + + #define BNX2_RBUF_CONFIG3 0x00200020 + #define BNX2_RBUF_CONFIG3_CU_DROP_TRIP (0x3ffL<<0) ++#define BNX2_RBUF_CONFIG3_CU_DROP_TRIP_VAL(mtu) \ ++ ((((mtu) - 1500) * 12 / 1000) + 18) + #define BNX2_RBUF_CONFIG3_CU_KEEP_TRIP (0x3ffL<<16) ++#define BNX2_RBUF_CONFIG3_CU_KEEP_TRIP_VAL(mtu) \ ++ ((((mtu) - 1500) * 2 / 100) + 30) ++#define BNX2_RBUF_CONFIG3_VAL(mtu) \ ++ (BNX2_RBUF_CONFIG3_CU_DROP_TRIP_VAL(mtu) | \ ++ (BNX2_RBUF_CONFIG3_CU_KEEP_TRIP_VAL(mtu) << 16)) + + #define BNX2_RBUF_PKT_DATA 0x00208000 + #define BNX2_RBUF_CLIST_DATA 0x00210000 +@@ -4509,6 +5421,10 @@ + #define BNX2_MQ_MEM_RD_DATA2_VALUE (0x3fffffffL<<0) + #define BNX2_MQ_MEM_RD_DATA2_VALUE_XI (0x7fffffffL<<0) + ++#define BNX2_MQ_CONFIG2 0x00003d00 ++#define BNX2_MQ_CONFIG2_CONT_SZ (0x7L<<4) ++#define BNX2_MQ_CONFIG2_FIRST_L4L5 (0x1fL<<8) ++ + #define BNX2_MQ_MAP_L2_3 0x00003d2c + #define BNX2_MQ_MAP_L2_3_MQ_OFFSET (0xffL<<0) + #define BNX2_MQ_MAP_L2_3_SZ (0x3L<<8) +@@ -4520,6 +5436,7 @@ + + #define BNX2_MQ_MAP_L2_5 0x00003d34 + #define BNX2_MQ_MAP_L2_5_ARM (0x3L<<26) ++ + + /* + * tsch_reg definition +@@ -5876,6 +6793,7 @@ + #define BNX2_RXP_FTQ_CTL_CUR_DEPTH (0x3ffL<<22) + + #define BNX2_RXP_SCRATCH 0x000e0000 ++#define BNX2_RXP_SCRATCH_RXP_FLOOD 0x000e0024 + #define BNX2_RXP_SCRATCH_RSS_TBL_SZ 0x000e0038 + #define BNX2_RXP_SCRATCH_RSS_TBL 0x000e003c + #define BNX2_RXP_SCRATCH_RSS_TBL_MAX_ENTRIES 128 +@@ -6165,6 +7083,8 @@ + #define BNX2_CP_CPQ_FTQ_CTL_CUR_DEPTH (0x3ffL<<22) + + #define BNX2_CP_SCRATCH 0x001a0000 ++ ++#define BNX2_FW_MAX_ISCSI_CONN 0x001a0080 + + + /* +@@ -6459,8 +7379,8 @@ + #define TX_DESC_CNT (BCM_PAGE_SIZE / sizeof(struct tx_bd)) + #define MAX_TX_DESC_CNT (TX_DESC_CNT - 1) + +-#define MAX_RX_RINGS 4 +-#define MAX_RX_PG_RINGS 16 ++#define MAX_RX_RINGS 16 ++#define MAX_RX_PG_RINGS 64 + #define RX_DESC_CNT (BCM_PAGE_SIZE / sizeof(struct rx_bd)) + #define MAX_RX_DESC_CNT (RX_DESC_CNT - 1) + #define MAX_TOTAL_RX_DESC_CNT (MAX_RX_DESC_CNT * MAX_RX_RINGS) +@@ -6516,6 +7436,11 @@ + #define MB_TX_CID_ADDR MB_GET_CID_ADDR(TX_CID) + #define MB_RX_CID_ADDR MB_GET_CID_ADDR(RX_CID) + ++#if defined(__VMKLNX__) && defined(__VMKNETDDI_QUEUEOPS__) ++#define NETQUEUE_KWQ_CID 97 ++#define NETQUEUE_KCQ_CID 100 ++#endif ++ + struct sw_bd { + struct sk_buff *skb; + DECLARE_PCI_UNMAP_ADDR(mapping) +@@ -6526,10 +7451,17 @@ + DECLARE_PCI_UNMAP_ADDR(mapping) + }; + ++struct sw_tx_bd { ++ struct sk_buff *skb; ++ unsigned short is_gso; ++ unsigned short nr_frags; ++ DECLARE_PCI_UNMAP_ADDR(mapping) ++}; ++ + #define SW_RXBD_RING_SIZE (sizeof(struct sw_bd) * RX_DESC_CNT) + #define SW_RXPG_RING_SIZE (sizeof(struct sw_pg) * RX_DESC_CNT) + #define RXBD_RING_SIZE (sizeof(struct rx_bd) * RX_DESC_CNT) +-#define SW_TXBD_RING_SIZE (sizeof(struct sw_bd) * TX_DESC_CNT) ++#define SW_TXBD_RING_SIZE (sizeof(struct sw_tx_bd) * TX_DESC_CNT) + #define TXBD_RING_SIZE (sizeof(struct tx_bd) * TX_DESC_CNT) + + /* Buffered flash (Atmel: AT45DB011B) specific information */ +@@ -6596,7 +7528,11 @@ + #define BNX2_TX_INT_NUM (BNX2_TX_VEC << BNX2_PCICFG_INT_ACK_CMD_INT_NUM_SHIFT) + + struct bnx2_irq { ++#if (LINUX_VERSION_CODE < 0x020613) ++ irqreturn_t (*handler)(int, void *, struct pt_regs *); ++#else + irq_handler_t handler; ++#endif + unsigned int vector; + u8 requested; + char name[16]; +@@ -6609,7 +7545,7 @@ + u32 tx_bseq_addr; + + struct tx_bd *tx_desc_ring; +- struct sw_bd *tx_buf_ring; ++ struct sw_tx_bd *tx_buf_ring; + + u16 tx_cons; + u16 hw_tx_cons; +@@ -6639,20 +7575,55 @@ + }; + + struct bnx2_napi { ++#ifdef BNX2_NEW_NAPI + struct napi_struct napi ____cacheline_aligned; ++#endif + struct bnx2 *bp; + union { + struct status_block *msi; + struct status_block_msix *msix; + } status_blk; +- u16 *hw_tx_cons_ptr; +- u16 *hw_rx_cons_ptr; ++ volatile u16 *hw_tx_cons_ptr; ++ volatile u16 *hw_rx_cons_ptr; + u32 last_status_idx; + u32 int_num; + ++ u32 cnic_tag; ++ int cnic_present; ++ + struct bnx2_rx_ring_info rx_ring; + struct bnx2_tx_ring_info tx_ring; +-}; ++ ++#if defined(__VMKLNX__) && defined(__VMKNETDDI_QUEUEOPS__) ++ u8 rx_queue_allocated; ++ u8 tx_queue_allocated; ++ u8 rx_queue_active; ++ u8 tx_queue_active; ++ ++ u8 mac_filter_addr[6]; ++ u16 netq_flags; ++#define BNX2_NETQ_FREE_TX_QUEUE_STATE 0x0001 ++ ++ struct net_device_stats stats; ++#endif ++}; ++ ++#if defined(__VMKLNX__) && defined(__VMKNETDDI_QUEUEOPS__) ++struct netq_dma { ++ int num_pages; ++ void **pg_arr; ++ dma_addr_t *pg_map_arr; ++ int pgtbl_size; ++ u32 *pgtbl; ++ dma_addr_t pgtbl_map; ++}; ++ ++struct netq_ctx { ++ u32 cid; ++ void *ctx; ++ dma_addr_t mapping; ++}; ++#endif + + struct bnx2 { + /* Fields used in the tx and intr/napi performance paths are grouped */ +@@ -6679,6 +7650,7 @@ + BNX2_FLAG_USING_MSIX) + #define BNX2_FLAG_JUMBO_BROKEN 0x00000800 + #define BNX2_FLAG_CAN_KEEP_VLAN 0x00001000 ++#define BNX2_FLAG_BROKEN_STATS 0x00002000 + + struct bnx2_napi bnx2_napi[BNX2_MAX_MSIX_VEC]; + +@@ -6699,14 +7671,22 @@ + int tx_ring_size; + u32 tx_wake_thresh; + ++ struct cnic_ops *cnic_ops; ++ void *cnic_data; ++ + /* End of fields used in the performance code paths. */ + +- char *name; +- +- int timer_interval; +- int current_interval; ++ unsigned int current_interval; ++#define BNX2_TIMER_INTERVAL HZ ++#define BNX2_SERDES_AN_TIMEOUT (HZ / 3) ++#define BNX2_SERDES_FORCED_TIMEOUT (HZ / 10) ++ + struct timer_list timer; ++#if (LINUX_VERSION_CODE >= 0x020600) + struct work_struct reset_task; ++#else ++ struct tq_struct reset_task; ++#endif + + /* Used to synchronize phy accesses. */ + spinlock_t phy_lock; +@@ -6819,8 +7799,10 @@ + u8 flow_ctrl; /* actual flow ctrl settings */ + /* may be different from */ + /* req_flow_ctrl if autoneg */ ++#ifndef FLOW_CTRL_TX + #define FLOW_CTRL_TX 1 + #define FLOW_CTRL_RX 2 ++#endif + + u32 advertising; + +@@ -6836,8 +7818,6 @@ + #define PHY_LOOPBACK 2 + + u8 serdes_an_pending; +-#define SERDES_AN_TIMEOUT (HZ / 3) +-#define SERDES_FORCED_TIMEOUT (HZ / 10) + + u8 mac_addr[8]; + +@@ -6855,11 +7835,58 @@ + + int status_stats_size; + ++ struct z_stream_s *strm; ++ void *gunzip_buf; ++ + struct bnx2_irq irq_tbl[BNX2_MAX_MSIX_VEC]; + int irq_nvecs; + + u8 num_tx_rings; + u8 num_rx_rings; ++ ++ u32 idle_chk_status_idx; ++ ++ spinlock_t cnic_lock; ++ struct cnic_eth_dev cnic_eth_dev; ++ ++#if defined(__VMKLNX__) && defined(__VMKNETDDI_QUEUEOPS__) ++ u16 n_rx_queues_allocated; ++ u16 n_tx_queues_allocated; ++ ++ /* KWQ/KCQ for NetQueue */ ++ u32 netq_kwq_cid_addr; ++ u32 netq_kcq_cid_addr; ++ ++ struct netq_dma netq_kwq_info; ++ struct l2_kwqe **netq_kwq; ++ ++ u16 netq_kwq_prod_idx; ++ u32 netq_kwq_io_addr; ++ ++ u16 netq_kwq_con_idx; ++ ++ struct netq_dma netq_kcq_info; ++ struct l2_kcqe **netq_kcq; ++ ++ u16 netq_kcq_prod_idx; ++ u32 netq_kcq_io_addr; ++ ++ u32 netq_last_status_idx; ++ ++#define MAX_COMPLETED_KCQE 64 ++ struct l2_kcqe *netq_completed_kcq[MAX_COMPLETED_KCQE]; ++ ++ struct netq_ctx *netq_ctx_arr; ++ int netq_ctx_blks; ++ int netq_ctx_blk_size; ++ int netq_cids_per_blk; ++ ++ u8 netq_flags; ++ u8 netq_enabled; ++ u8 reserved1[2]; ++ ++ wait_queue_head_t netq_wait; ++#endif + }; + + #define REG_RD(bp, offset) \ +@@ -6902,7 +7929,7 @@ + const u32 text_len; + const u32 text_index; + __le32 *text; +- u8 *gz_text; ++ const u8 *gz_text; + const u32 gz_text_len; + + /* Data section. */ +@@ -6935,14 +7962,14 @@ + /* This value (in milliseconds) determines the frequency of the driver + * issuing the PULSE message code. The firmware monitors this periodic + * pulse to determine when to switch to an OS-absent mode. */ +-#define DRV_PULSE_PERIOD_MS 250 ++#define BNX2_DRV_PULSE_PERIOD_MS 250 + + /* This value (in milliseconds) determines how long the driver should + * wait for an acknowledgement from the firmware before timing out. Once + * the firmware has timed out, the driver will assume there is no firmware + * running and there won't be any firmware-driver synchronization during a + * driver reset. */ +-#define FW_ACK_TIME_OUT_MS 1000 ++#define BNX2_FW_ACK_TIME_OUT_MS 1000 + + + #define BNX2_DRV_RESET_SIGNATURE 0x00000000 +diff -r 19900e8f54d8 drivers/net/bnx2_fw.h +--- a/drivers/net/bnx2_fw.h Mon Jun 15 16:27:59 2009 +0100 ++++ b/drivers/net/bnx2_fw.h Mon Jun 15 16:38:18 2009 +0100 +@@ -15,854 +15,856 @@ + */ + + static u8 bnx2_COM_b06FwText[] = { +- 0xcd, 0x7c, 0x0d, 0x70, 0x5c, 0xd5, 0x95, 0xe6, 0xe9, 0xd7, 0xdd, 0x52, +- 0x4b, 0x96, 0xe5, 0x27, 0xb9, 0x51, 0x1a, 0xa2, 0x24, 0xef, 0xa9, 0x9f, +- 0xa4, 0x06, 0x29, 0xe4, 0xd9, 0x08, 0x10, 0x49, 0x0f, 0x34, 0xdd, 0x92, +- 0x11, 0x89, 0x77, 0x24, 0x40, 0x61, 0xbc, 0x3b, 0xae, 0xac, 0xa6, 0x2d, +- 0x13, 0x42, 0x31, 0x35, 0xae, 0x0a, 0x3b, 0x71, 0xb2, 0x04, 0x37, 0x2d, +- 0x99, 0x38, 0x8c, 0xec, 0x56, 0x64, 0x59, 0x66, 0x67, 0xd8, 0xd9, 0x4e, +- 0x4b, 0xb2, 0x19, 0xa6, 0xed, 0xc6, 0x90, 0x1f, 0xa6, 0x92, 0x0c, 0x5a, +- 0xe3, 0x00, 0x93, 0xcd, 0x56, 0x41, 0x2a, 0xb5, 0xcb, 0x6c, 0x51, 0xbb, +- 0x5e, 0x27, 0x4c, 0xb2, 0xa9, 0xda, 0x0a, 0x3b, 0x93, 0xda, 0x65, 0xf2, +- 0x33, 0x6f, 0xbf, 0xef, 0xbe, 0xfb, 0xa4, 0x96, 0xac, 0x38, 0x4c, 0xa6, +- 0x52, 0x35, 0xaa, 0xea, 0xba, 0xef, 0xde, 0x77, 0x7f, 0xce, 0x3d, 0xf7, +- 0xdc, 0x73, 0xbe, 0x73, 0xee, 0x7d, 0xba, 0x55, 0xa4, 0x59, 0xf4, 0xdf, +- 0x56, 0xfc, 0x06, 0x7e, 0xff, 0x0f, 0xf6, 0xdd, 0x78, 0xbd, 0x7b, 0x3d, +- 0xf3, 0x46, 0x54, 0x22, 0x4c, 0xc3, 0xf8, 0xc5, 0xf1, 0xdb, 0xa9, 0x9f, +- 0x37, 0xfb, 0x33, 0xf1, 0xbb, 0x29, 0x24, 0x32, 0xf1, 0x23, 0x91, 0xd0, +- 0x86, 0x77, 0xb1, 0x4d, 0xea, 0x7b, 0xde, 0x2f, 0xe9, 0x48, 0xff, 0x19, +- 0xf8, 0x59, 0x57, 0xae, 0xb2, 0x3a, 0xee, 0xaf, 0xfb, 0x17, 0xd6, 0xcd, +- 0xb7, 0xea, 0x9f, 0xc4, 0x8c, 0xf4, 0xc5, 0xdf, 0xce, 0x3a, 0x12, 0x0b, +- 0xa7, 0xbf, 0x3b, 0xba, 0xcf, 0x11, 0xc9, 0x54, 0xfb, 0xac, 0x9c, 0xfc, +- 0xc2, 0x2b, 0xc4, 0x23, 0xc2, 0xf2, 0xf7, 0xa4, 0x7f, 0x7e, 0xe8, 0x1b, +- 0x37, 0xdb, 0x6f, 0x95, 0xc3, 0x12, 0x33, 0xd3, 0x6f, 0x8b, 0xd9, 0x23, +- 0xb1, 0x4e, 0xb4, 0x79, 0xb2, 0xf7, 0x29, 0x43, 0x5a, 0x83, 0xbe, 0xcc, +- 0x89, 0x70, 0x5a, 0xc6, 0x26, 0x67, 0x0e, 0x79, 0x86, 0x23, 0x85, 0x6b, +- 0xd2, 0x8e, 0x55, 0x94, 0x96, 0xc1, 0xe9, 0x81, 0x9b, 0x05, 0xf9, 0xb1, +- 0xc9, 0x6a, 0x4c, 0xb2, 0xb5, 0x42, 0x8b, 0xe1, 0x38, 0x48, 0x63, 0x85, +- 0x77, 0xa7, 0x25, 0xd6, 0x90, 0x9e, 0x6f, 0x7c, 0xc9, 0xe1, 0xf8, 0x89, +- 0xd1, 0xac, 0xf3, 0x6e, 0x89, 0x38, 0x9e, 0x37, 0x8d, 0xf1, 0x77, 0x55, +- 0x7f, 0xe1, 0x3d, 0x1a, 0xf1, 0xc7, 0x36, 0xd2, 0x07, 0xc3, 0x4c, 0x43, +- 0x69, 0x6b, 0xb4, 0xab, 0xaa, 0xf2, 0x0d, 0x7e, 0xde, 0xd1, 0xf9, 0x58, +- 0xb3, 0x4f, 0xbb, 0x34, 0x81, 0xf6, 0x58, 0x24, 0x9d, 0x6e, 0x42, 0x1f, +- 0xb1, 0x68, 0xfa, 0x99, 0xdf, 0x5a, 0x56, 0xf5, 0xee, 0xd7, 0xf5, 0xee, +- 0x8f, 0xfa, 0xed, 0x26, 0x47, 0x7b, 0xaa, 0x4c, 0x1f, 0x1a, 0xed, 0x56, +- 0xe9, 0xc3, 0xa3, 0x49, 0x95, 0x16, 0x54, 0xbd, 0x50, 0x7a, 0x7a, 0xd4, +- 0x51, 0x69, 0xa7, 0x2e, 0x4f, 0x8d, 0x5a, 0x2a, 0xed, 0xd7, 0xa9, 0xab, +- 0xd3, 0x01, 0x9d, 0x0e, 0xea, 0x34, 0xad, 0xd3, 0x8c, 0x4e, 0x87, 0x74, +- 0x3f, 0x23, 0x3a, 0xbf, 0x5b, 0xa7, 0x63, 0x3a, 0x1d, 0xd7, 0xe9, 0x1e, +- 0x9d, 0xee, 0xd5, 0x74, 0x4d, 0xe8, 0xf4, 0x41, 0x5d, 0x7e, 0x40, 0xd3, +- 0x79, 0x10, 0xf4, 0x7c, 0xa6, 0x51, 0xcb, 0x2d, 0xe6, 0x6b, 0xc9, 0xbe, +- 0x99, 0x98, 0x14, 0x4b, 0x61, 0xc9, 0xa9, 0xf5, 0xfc, 0x7c, 0x54, 0x9a, +- 0x63, 0x32, 0x55, 0x8b, 0xc9, 0x45, 0x25, 0xae, 0x3f, 0xf4, 0xbe, 0xd1, +- 0x6b, 0xca, 0x33, 0xb5, 0xb8, 0xbc, 0x50, 0x93, 0xd0, 0x58, 0x6f, 0x93, +- 0x18, 0x73, 0xd7, 0x48, 0xc6, 0x0c, 0x49, 0x58, 0xf1, 0xd5, 0x92, 0xec, +- 0x4c, 0x07, 0xf2, 0x76, 0x42, 0xe4, 0xe5, 0xa8, 0xbf, 0x8e, 0x31, 0x09, +- 0x2f, 0x70, 0x5d, 0x16, 0x46, 0x5f, 0x9a, 0x4f, 0x48, 0xe4, 0x98, 0x85, +- 0xfe, 0x5b, 0x24, 0xba, 0x20, 0x9d, 0x61, 0xe9, 0x4e, 0xdc, 0x87, 0x1a, +- 0x43, 0xd5, 0x88, 0x0c, 0x57, 0x43, 0x58, 0xab, 0x18, 0xe4, 0xa4, 0x05, +- 0x3f, 0x13, 0xbf, 0x38, 0x7e, 0x09, 0xfc, 0x3c, 0xf4, 0xd3, 0x29, 0xb9, +- 0x2a, 0xfb, 0xc4, 0xb8, 0x25, 0x8c, 0x5f, 0xb2, 0xcd, 0x09, 0x21, 0x4d, +- 0x09, 0xf9, 0x46, 0xaf, 0x4f, 0xd3, 0x0b, 0xb5, 0x58, 0x28, 0x7b, 0x52, +- 0x0e, 0xe4, 0x5c, 0xb1, 0x0c, 0xa7, 0x59, 0xf2, 0x66, 0xc8, 0x9a, 0x4c, +- 0xb5, 0x4b, 0x61, 0x1c, 0xef, 0x4a, 0x92, 0x31, 0xd0, 0x77, 0xde, 0x94, +- 0x09, 0xff, 0x1d, 0xcb, 0xfe, 0x1e, 0xfb, 0xd5, 0x36, 0x29, 0xb8, 0x2f, +- 0x94, 0xfe, 0x02, 0xcf, 0xec, 0xeb, 0xcd, 0x88, 0x4f, 0xf3, 0xdb, 0xc8, +- 0xb3, 0xfc, 0x67, 0xdb, 0xfc, 0x3c, 0x9f, 0x59, 0x37, 0x18, 0x33, 0x98, +- 0x2b, 0xc7, 0xee, 0xc5, 0x7c, 0x39, 0xfe, 0xea, 0x7c, 0x41, 0x47, 0x4b, +- 0x28, 0x77, 0xd2, 0x92, 0xc3, 0xa5, 0x5b, 0x25, 0xeb, 0x7a, 0xde, 0x3e, +- 0x57, 0xe2, 0x86, 0x74, 0x9b, 0x39, 0xbc, 0xad, 0x54, 0x25, 0x94, 0x2d, +- 0x05, 0xfc, 0x60, 0xbf, 0x11, 0x94, 0x75, 0xa0, 0x7e, 0x6b, 0x68, 0xe8, +- 0x24, 0x68, 0x4f, 0x93, 0x2f, 0x90, 0x59, 0xb7, 0x3b, 0x31, 0x89, 0xf1, +- 0x16, 0xab, 0xdd, 0xee, 0x79, 0x31, 0xd1, 0x67, 0x3b, 0xea, 0x90, 0x47, +- 0xec, 0x8b, 0x7d, 0xb2, 0xbf, 0x16, 0xb4, 0x8d, 0xe3, 0x1d, 0x69, 0xf2, +- 0xbc, 0xac, 0x6b, 0x32, 0x2f, 0x65, 0xf0, 0xad, 0x4c, 0xbe, 0x35, 0x77, +- 0xca, 0xa9, 0x2a, 0xc7, 0xd8, 0x8c, 0xee, 0xeb, 0xfe, 0x99, 0xd1, 0x9d, +- 0x40, 0xff, 0x71, 0xa4, 0x5b, 0x42, 0xd9, 0xe3, 0x1e, 0xc6, 0x4f, 0xe0, +- 0x79, 0xb3, 0x39, 0x5c, 0xd4, 0x32, 0x98, 0x00, 0xed, 0x71, 0x39, 0xa7, +- 0xe4, 0x70, 0x8b, 0x84, 0x21, 0x87, 0x5c, 0xe3, 0xb6, 0x85, 0x1b, 0x25, +- 0x1f, 0xb7, 0x2d, 0xea, 0xce, 0xae, 0x9d, 0x4d, 0x98, 0xa3, 0xd6, 0x82, +- 0xc7, 0xe2, 0x90, 0xc3, 0xf3, 0x6d, 0x06, 0x4a, 0x0c, 0xb1, 0xcd, 0x7f, +- 0x25, 0x05, 0xc9, 0x2d, 0x7d, 0x2a, 0x24, 0xcd, 0x06, 0xea, 0x5d, 0x1b, +- 0xf2, 0x79, 0x40, 0xfe, 0x64, 0xc0, 0x9f, 0x90, 0xf8, 0xfb, 0x3a, 0x23, +- 0x5d, 0x55, 0xbe, 0xef, 0xb3, 0x0c, 0xf5, 0x6e, 0x08, 0xef, 0x22, 0x92, +- 0xdc, 0x19, 0xbc, 0x1f, 0xc2, 0xfb, 0x6b, 0x64, 0xc2, 0x04, 0x2d, 0xa5, +- 0xe7, 0x8d, 0x2c, 0x68, 0xbc, 0x3d, 0xa2, 0xe6, 0x8a, 0xba, 0x13, 0x75, +- 0xfd, 0x4c, 0xa0, 0xde, 0x1f, 0x63, 0x2c, 0xd0, 0x5b, 0xb2, 0x40, 0x4b, +- 0x07, 0x68, 0x21, 0x8d, 0x05, 0x23, 0x5b, 0x8b, 0x20, 0x3f, 0x6d, 0xe4, +- 0x4e, 0x1f, 0xc1, 0xb3, 0x98, 0x46, 0xfa, 0x79, 0xa6, 0x68, 0xbf, 0xb7, +- 0xae, 0xfd, 0x5e, 0xb4, 0xe7, 0x18, 0x6c, 0xef, 0xcb, 0x7f, 0x41, 0xc9, +- 0xa2, 0x75, 0x05, 0x7e, 0x84, 0x7f, 0x0d, 0x7e, 0x7c, 0x4d, 0xf3, 0xe3, +- 0x67, 0xf2, 0x9b, 0xe7, 0xc7, 0x7f, 0xff, 0x0d, 0xf1, 0x43, 0x24, 0x7f, +- 0x9c, 0xcf, 0x11, 0x29, 0x28, 0xbd, 0xc5, 0x7d, 0x4b, 0x79, 0xa7, 0xce, +- 0x22, 0x9f, 0x28, 0xc7, 0xd8, 0x03, 0xb5, 0x08, 0xd2, 0xa7, 0x90, 0x6e, +- 0x09, 0x8d, 0x1d, 0xbf, 0x84, 0xf5, 0xf7, 0xc4, 0xdc, 0x19, 0xd8, 0x8d, +- 0x42, 0xc2, 0x94, 0x4e, 0x31, 0xaf, 0x87, 0xd1, 0xee, 0xb0, 0xcd, 0xbc, +- 0xbc, 0x89, 0xf7, 0xbf, 0x08, 0x05, 0xf6, 0x3d, 0x3b, 0xd3, 0xf4, 0x76, +- 0x46, 0x3d, 0x45, 0xc9, 0xcf, 0x8c, 0x91, 0x8e, 0x84, 0x72, 0x25, 0x6b, +- 0xc2, 0x48, 0xc7, 0xa1, 0xa7, 0x98, 0x1f, 0x0c, 0xf9, 0x34, 0x0f, 0xa0, +- 0x6e, 0xa0, 0xb3, 0x02, 0xda, 0x07, 0x40, 0xfb, 0x46, 0xdd, 0x95, 0x01, +- 0x2d, 0xa4, 0x81, 0x74, 0x55, 0xc2, 0x9a, 0xf7, 0xe8, 0xe7, 0xa0, 0xea, +- 0x27, 0x9c, 0x1e, 0x14, 0xda, 0xd0, 0xfc, 0x0c, 0xf7, 0x01, 0xdb, 0xb1, +- 0x2f, 0x5f, 0x27, 0xe7, 0xab, 0x41, 0x1f, 0x85, 0xba, 0x3e, 0x0a, 0xa0, +- 0x47, 0xb6, 0x19, 0x4e, 0x14, 0x6b, 0xcf, 0xae, 0x8e, 0xe0, 0xdd, 0x93, +- 0x92, 0x3d, 0x7d, 0xb3, 0x81, 0x39, 0xa0, 0x5f, 0xf2, 0x68, 0x0c, 0x3a, +- 0x9b, 0xfb, 0x2c, 0x26, 0xb9, 0x38, 0xcb, 0x3e, 0xa6, 0xc7, 0x8d, 0x48, +- 0x46, 0xe5, 0x5f, 0x69, 0x5d, 0xa3, 0xe3, 0x79, 0x3d, 0x9f, 0x34, 0xe6, +- 0x43, 0x1a, 0x82, 0xb9, 0xa4, 0xeb, 0xe6, 0x12, 0xf0, 0x9a, 0xbc, 0x30, +- 0xa1, 0xe3, 0x63, 0xda, 0x86, 0xb0, 0xdd, 0x74, 0xdd, 0xda, 0x4d, 0xa3, +- 0x0d, 0x79, 0x8f, 0x3a, 0x1b, 0xec, 0x0a, 0x6d, 0xca, 0x10, 0xfa, 0x29, +- 0xce, 0x1b, 0x92, 0x73, 0x61, 0xab, 0xdd, 0x77, 0x6b, 0x79, 0x5d, 0x93, +- 0xa5, 0xe8, 0xa6, 0xb2, 0x74, 0xc8, 0xf0, 0xf5, 0x35, 0x6c, 0x0b, 0xec, +- 0xcf, 0xd4, 0xbc, 0x9d, 0x0a, 0x64, 0xa9, 0x38, 0xf3, 0x4e, 0x64, 0x29, +- 0x68, 0x1f, 0x83, 0xec, 0x06, 0x63, 0x6c, 0xa4, 0x39, 0xa8, 0x03, 0x1a, +- 0x4b, 0x59, 0x8d, 0x51, 0x38, 0x8e, 0x6f, 0x1b, 0xca, 0xeb, 0x6c, 0xc3, +- 0x11, 0xb4, 0x95, 0x50, 0xae, 0xb7, 0x45, 0xf6, 0xcf, 0x07, 0x7d, 0x1c, +- 0x51, 0x32, 0x3b, 0x39, 0x63, 0x9b, 0xc3, 0x61, 0xc9, 0x0c, 0xcf, 0x0e, +- 0xca, 0x50, 0xad, 0x13, 0x6b, 0xfa, 0xb6, 0x07, 0xdb, 0x79, 0x7d, 0x54, +- 0x1c, 0xe8, 0x45, 0xcc, 0x79, 0x00, 0x3c, 0xae, 0x45, 0xc5, 0x48, 0xbb, +- 0x48, 0xeb, 0x31, 0x56, 0x24, 0x32, 0xbc, 0x2e, 0xdf, 0x80, 0x3a, 0xe8, +- 0x7b, 0x60, 0x63, 0x3d, 0xc8, 0x27, 0x78, 0x9b, 0x75, 0x7f, 0xe1, 0xc1, +- 0x0e, 0x6b, 0x9b, 0xc5, 0x52, 0xea, 0x89, 0x40, 0x47, 0x7c, 0x14, 0xfb, +- 0x5b, 0xed, 0x85, 0x82, 0x91, 0x3e, 0x80, 0x3e, 0x44, 0xc9, 0x69, 0xb1, +- 0xf6, 0x4c, 0xb0, 0xef, 0x55, 0xf9, 0xae, 0x01, 0xca, 0x5e, 0x19, 0x98, +- 0x80, 0x73, 0x5a, 0x52, 0x7b, 0x3d, 0x67, 0xc6, 0x65, 0xba, 0xc4, 0xf9, +- 0x2c, 0x49, 0xb2, 0xfa, 0xa7, 0x92, 0x3b, 0x2d, 0xf2, 0xad, 0x19, 0xd6, +- 0xfb, 0xba, 0xae, 0xf7, 0x3c, 0xea, 0x25, 0xad, 0xa1, 0x90, 0x0d, 0x3b, +- 0x60, 0x63, 0x9b, 0xf4, 0x59, 0x48, 0xcd, 0x11, 0xfc, 0x86, 0x68, 0x64, +- 0x50, 0xcf, 0xc7, 0x40, 0xcf, 0x83, 0x1f, 0x22, 0x77, 0x95, 0x1a, 0xa1, +- 0x4f, 0xfe, 0x27, 0x68, 0x8d, 0xcb, 0xe3, 0x98, 0xc7, 0x4b, 0x33, 0xc4, +- 0x59, 0x5f, 0x97, 0xe5, 0x19, 0xe2, 0xae, 0xe7, 0x65, 0x7a, 0x26, 0xe9, +- 0x7e, 0x0b, 0x7c, 0x3e, 0x25, 0x9c, 0x4b, 0x9f, 0x8b, 0x14, 0x18, 0xd0, +- 0xb6, 0x1e, 0x83, 0x3e, 0xeb, 0xdd, 0xe9, 0xf7, 0xd7, 0xad, 0xfb, 0x73, +- 0xaa, 0xb6, 0x5c, 0x34, 0xa9, 0x9f, 0x2e, 0xdf, 0xe3, 0x59, 0xbd, 0xc7, +- 0xc7, 0xdc, 0x4e, 0x31, 0xb0, 0xaf, 0x33, 0xe3, 0x05, 0x58, 0x3f, 0xee, +- 0xeb, 0xff, 0x6b, 0xac, 0xe1, 0x9f, 0x04, 0xb0, 0xaa, 0xad, 0xec, 0xdd, +- 0x3f, 0x6e, 0x8f, 0xd7, 0xef, 0x6d, 0x8e, 0xdf, 0x8a, 0x36, 0x11, 0xa4, +- 0x57, 0xde, 0xd7, 0xe8, 0xa3, 0xae, 0xed, 0x20, 0xf7, 0x05, 0xda, 0xfc, +- 0x09, 0x78, 0x41, 0xfe, 0xbf, 0x93, 0xfd, 0xdc, 0x17, 0x7e, 0x47, 0xfb, +- 0x79, 0xfc, 0x4a, 0xfb, 0xb9, 0x7e, 0x2f, 0x9f, 0x25, 0x2f, 0x30, 0xb6, +- 0xcc, 0xfa, 0xb2, 0xd5, 0x0d, 0x5e, 0x5b, 0x90, 0x53, 0xd0, 0x50, 0xfa, +- 0x07, 0x2f, 0x13, 0xf1, 0xf1, 0x9c, 0x2f, 0x4f, 0xac, 0x17, 0xd4, 0xf1, +- 0x75, 0xef, 0x50, 0xed, 0xa2, 0xd2, 0xb3, 0xe7, 0x94, 0x9e, 0xb5, 0x8f, +- 0x14, 0x84, 0xf2, 0x76, 0x43, 0x98, 0x7c, 0x7f, 0xc6, 0xfd, 0x2c, 0x68, +- 0xb4, 0x2d, 0xcb, 0xe8, 0x2e, 0x18, 0xc6, 0x67, 0xe5, 0xc0, 0xe2, 0x43, +- 0x72, 0xa0, 0xc4, 0x3e, 0xd2, 0x78, 0xef, 0xa0, 0xac, 0x09, 0xba, 0x96, +- 0x3a, 0xfd, 0xed, 0x90, 0x3f, 0x96, 0x01, 0xfb, 0xb5, 0x12, 0xba, 0xab, +- 0x76, 0x21, 0x94, 0x5d, 0xe4, 0xde, 0x45, 0x79, 0xad, 0x5e, 0xe7, 0x07, +- 0xfa, 0xbe, 0x5e, 0xb7, 0x17, 0x42, 0x63, 0xa5, 0x69, 0xe2, 0x40, 0x23, +- 0xeb, 0x46, 0xb5, 0xee, 0xf8, 0x9a, 0x29, 0xad, 0xb0, 0x2d, 0xc6, 0x3c, +- 0x78, 0x45, 0x9c, 0x4a, 0xde, 0xa5, 0x24, 0x13, 0x21, 0x9e, 0xe4, 0xb3, +- 0x78, 0xe1, 0x34, 0xf7, 0x9e, 0x44, 0xc2, 0xe9, 0x2e, 0xf0, 0x8e, 0x75, +- 0x6e, 0x05, 0xad, 0xb0, 0x7b, 0xee, 0xfb, 0x84, 0x72, 0xf9, 0x42, 0xe9, +- 0x36, 0xe4, 0x23, 0x9a, 0xbf, 0x51, 0xd4, 0x61, 0x7f, 0x3f, 0x6d, 0x90, +- 0xd6, 0xe3, 0xd0, 0x15, 0x41, 0xbf, 0xac, 0x93, 0xd0, 0x75, 0x5a, 0x74, +- 0x9d, 0x5b, 0xf0, 0x7e, 0x0e, 0xf5, 0x6c, 0x57, 0x84, 0x7c, 0x60, 0x59, +- 0x3b, 0xe6, 0x85, 0xba, 0x8b, 0xe9, 0xf0, 0x7a, 0xba, 0x6e, 0xaa, 0xab, +- 0xcb, 0xfc, 0x66, 0x58, 0x97, 0xf2, 0x24, 0x5a, 0x97, 0xb1, 0x6c, 0x10, +- 0xcf, 0x5d, 0x32, 0xb1, 0x98, 0x81, 0x4e, 0xba, 0x5d, 0xf5, 0x13, 0x75, +- 0xd6, 0xd9, 0x3a, 0xd0, 0x64, 0x69, 0x9a, 0xb6, 0x04, 0xfa, 0x18, 0x65, +- 0xae, 0x2e, 0x6b, 0xa8, 0x2b, 0x0b, 0xe4, 0xe7, 0x5f, 0x83, 0x76, 0x8e, +- 0x3d, 0xa2, 0x71, 0x98, 0xe7, 0xe5, 0x28, 0x77, 0xfd, 0xff, 0x52, 0xf3, +- 0xa2, 0x60, 0x86, 0xd5, 0x5e, 0xa9, 0xfe, 0xf6, 0xda, 0x5e, 0x01, 0x6e, +- 0x57, 0xbd, 0x70, 0x8e, 0xa4, 0xa5, 0x05, 0x6b, 0x3b, 0x04, 0x5a, 0xb1, +- 0x86, 0x1d, 0x21, 0xcc, 0xb7, 0x45, 0xf2, 0xb5, 0xb4, 0x7e, 0xc7, 0xf2, +- 0x88, 0x8c, 0xc5, 0x83, 0xf9, 0x7d, 0xc0, 0xf4, 0xb1, 0x37, 0xea, 0x94, +- 0xb6, 0x44, 0xfc, 0xbd, 0x68, 0x4a, 0xfe, 0xe4, 0x10, 0x64, 0x9e, 0xd8, +- 0xb0, 0x01, 0x32, 0x1f, 0x57, 0x36, 0xc7, 0x70, 0x58, 0x1f, 0xef, 0x4e, +- 0xff, 0xbb, 0xb0, 0xdf, 0x86, 0xf5, 0x82, 0x36, 0xc1, 0xd8, 0xed, 0xab, +- 0x6d, 0xc7, 0x5c, 0x43, 0xc2, 0x6a, 0x7c, 0x94, 0x9d, 0x5e, 0x3f, 0xbe, +- 0xd1, 0x11, 0x8c, 0xff, 0xa7, 0xba, 0xaf, 0xf6, 0xba, 0xbe, 0xe2, 0x57, +- 0x18, 0x1f, 0xef, 0x4e, 0xff, 0xee, 0x76, 0xbf, 0x4d, 0xbc, 0xae, 0x4d, +- 0xc7, 0x86, 0x36, 0xac, 0x1f, 0x8c, 0x81, 0x77, 0xa7, 0xef, 0x6b, 0xf1, +- 0xdb, 0xb0, 0x5e, 0x03, 0x6c, 0x2c, 0xdf, 0x71, 0x0f, 0x1e, 0xa8, 0xdb, +- 0x83, 0x07, 0xb0, 0x07, 0x03, 0xd9, 0xde, 0x88, 0xd7, 0x03, 0xbf, 0x8b, +- 0xfe, 0x16, 0x31, 0xde, 0x9a, 0x7f, 0x15, 0x59, 0x68, 0x01, 0x7e, 0x6a, +- 0xa5, 0x4f, 0xa5, 0xf1, 0x39, 0x7d, 0x2c, 0xe2, 0x71, 0x71, 0x22, 0xd2, +- 0x0d, 0x5d, 0xd9, 0x9d, 0xd8, 0xcf, 0x8d, 0x5f, 0x8d, 0x2b, 0xdc, 0x9e, +- 0xd1, 0x63, 0xd0, 0xbf, 0x22, 0xdf, 0x99, 0xcf, 0xad, 0xfa, 0x5b, 0x9d, +- 0xf0, 0xc7, 0x88, 0xbb, 0x89, 0xdb, 0x02, 0xfa, 0x03, 0x7a, 0x0e, 0x1a, +- 0x6b, 0x7b, 0x33, 0x63, 0x0c, 0xd5, 0x86, 0x0c, 0x7f, 0x6f, 0xf2, 0xfd, +- 0x41, 0x6d, 0x5b, 0x37, 0xd2, 0xfb, 0x9e, 0x0d, 0xf4, 0x12, 0xdf, 0x59, +- 0x32, 0x05, 0x19, 0x89, 0x2c, 0x50, 0xd7, 0x2f, 0x8c, 0x2e, 0xcf, 0x13, +- 0xc7, 0xf4, 0x83, 0x2f, 0xa4, 0x97, 0xfc, 0xa3, 0x4e, 0x69, 0x85, 0x9e, +- 0xea, 0x4e, 0x55, 0x50, 0x9f, 0x7e, 0xfe, 0x84, 0xf2, 0x0f, 0x5b, 0x90, +- 0xc2, 0x89, 0x03, 0xad, 0x13, 0xa0, 0x75, 0x42, 0xfb, 0x86, 0xfb, 0x61, +- 0x47, 0x22, 0xc7, 0x02, 0x5a, 0x6f, 0x89, 0x04, 0x6b, 0xb3, 0x9e, 0xf6, +- 0x7a, 0xfb, 0xe7, 0xe3, 0xc0, 0xbb, 0x7a, 0xd5, 0x9e, 0x2c, 0x10, 0x3b, +- 0x4e, 0x9c, 0x0e, 0xf6, 0xa3, 0xf8, 0x7b, 0xa9, 0x35, 0xc0, 0x01, 0x9c, +- 0x0f, 0x71, 0x08, 0x75, 0x4f, 0x30, 0x87, 0x16, 0xe9, 0x5a, 0xe0, 0x1c, +- 0x56, 0xe9, 0x8f, 0x33, 0xca, 0x72, 0x00, 0xfa, 0x3b, 0xaf, 0x68, 0xdd, +- 0x2d, 0x93, 0xa5, 0xf7, 0x69, 0xfa, 0x5b, 0x40, 0xff, 0x18, 0x64, 0x7b, +- 0x4d, 0x77, 0xe5, 0xab, 0xe3, 0xc8, 0xfb, 0x98, 0x90, 0x3c, 0xce, 0x57, +- 0xa9, 0xc7, 0xf4, 0x7c, 0x9a, 0x39, 0x9f, 0x8d, 0x3a, 0x6e, 0x33, 0xbe, +- 0xbe, 0x77, 0x03, 0x5f, 0x45, 0xf3, 0x35, 0x26, 0x0d, 0x0b, 0xca, 0xbf, +- 0x46, 0xbf, 0xe4, 0x35, 0xed, 0xe8, 0xc2, 0xe8, 0xf4, 0xbc, 0xf4, 0x33, +- 0x08, 0x95, 0x07, 0xdf, 0x50, 0x36, 0xd0, 0x20, 0xdd, 0xee, 0x05, 0xcc, +- 0x3b, 0x8f, 0xf5, 0x36, 0x8e, 0xf9, 0xf2, 0x4d, 0xfe, 0xe6, 0xab, 0xcd, +- 0xf0, 0xe9, 0x39, 0x36, 0x79, 0x46, 0xfa, 0x4d, 0x45, 0xcf, 0x2a, 0xbf, +- 0x41, 0xdf, 0x7d, 0xd5, 0x8d, 0xbc, 0xad, 0xd7, 0x33, 0x41, 0xec, 0xe0, +- 0x35, 0xd3, 0xdf, 0x17, 0x9b, 0xc5, 0x0e, 0x5a, 0xa0, 0xa3, 0x23, 0x8c, +- 0x13, 0x80, 0xf7, 0x8c, 0xf3, 0x5c, 0x8a, 0xd0, 0x17, 0x78, 0xa1, 0x04, +- 0x3d, 0x73, 0x9c, 0xd8, 0xa5, 0x55, 0xef, 0x8f, 0x1b, 0xb4, 0x0d, 0x8b, +- 0x2a, 0xdb, 0x21, 0x86, 0x49, 0x7c, 0x84, 0x32, 0xe4, 0x17, 0x99, 0x0f, +- 0xe8, 0xb8, 0x7b, 0x4f, 0xd4, 0x79, 0x21, 0x12, 0xe8, 0x84, 0x35, 0xba, +- 0xea, 0x63, 0x03, 0x1e, 0x30, 0xe5, 0xfb, 0x20, 0xb7, 0xb7, 0xc3, 0xff, +- 0xb7, 0x24, 0x9f, 0xe2, 0x3e, 0x1a, 0x54, 0x3e, 0x92, 0xe1, 0xec, 0x47, +- 0x59, 0x13, 0xca, 0x60, 0x4c, 0x4d, 0xcc, 0xdf, 0xf9, 0x3d, 0x99, 0x80, +- 0x8c, 0xe7, 0x53, 0x7d, 0xa0, 0x83, 0xf8, 0x0e, 0x58, 0xcb, 0x49, 0x31, +- 0x7e, 0x80, 0xbf, 0x7b, 0xa3, 0xfe, 0xbc, 0xf6, 0x20, 0xdf, 0x8c, 0x3a, +- 0x5d, 0xba, 0xce, 0x16, 0x61, 0x1c, 0x2a, 0x6f, 0xb6, 0x22, 0xed, 0xd9, +- 0x50, 0xf7, 0x43, 0xc8, 0xdf, 0xa2, 0xfb, 0x2f, 0xe0, 0xfd, 0x4d, 0xf8, +- 0x0d, 0xa1, 0xec, 0x66, 0x94, 0xb9, 0x28, 0xbb, 0x11, 0xf9, 0x0f, 0xe9, +- 0xb8, 0x44, 0xd0, 0xa6, 0x15, 0xf9, 0x47, 0xf1, 0x1e, 0xba, 0xc2, 0x7c, +- 0x05, 0xef, 0x6f, 0xc1, 0xef, 0xfa, 0x0d, 0x75, 0xda, 0x37, 0xe4, 0x4f, +- 0xae, 0xf2, 0xe0, 0x85, 0xd2, 0x55, 0xfa, 0x99, 0xf2, 0xcc, 0xfc, 0x2b, +- 0x3a, 0x7f, 0xfb, 0x86, 0xf2, 0xfb, 0x83, 0x7c, 0xdd, 0x1a, 0xc2, 0x0e, +- 0x9a, 0x01, 0xd6, 0xbd, 0xda, 0xf4, 0xd7, 0xe0, 0x3d, 0x7e, 0xbc, 0xa0, +- 0x14, 0xb4, 0x23, 0xf6, 0xbd, 0x3d, 0xbc, 0xbe, 0xaf, 0xff, 0xd6, 0xb0, +- 0x96, 0x6f, 0x09, 0x0d, 0x9f, 0x64, 0xd9, 0x4f, 0x1b, 0xd6, 0xd7, 0x79, +- 0x5f, 0xe3, 0x5a, 0x7e, 0x6b, 0x68, 0xf8, 0x38, 0xcb, 0xee, 0x6b, 0x5c, +- 0x5f, 0x67, 0xb8, 0x71, 0x6d, 0x1e, 0x6b, 0xba, 0x30, 0x92, 0xae, 0x50, +- 0x8e, 0xb1, 0x17, 0xaa, 0xa3, 0xd9, 0x19, 0xcf, 0x9b, 0x72, 0x57, 0x12, +- 0x61, 0xa1, 0x0d, 0x22, 0x66, 0x66, 0xf9, 0x53, 0x28, 0x07, 0xa6, 0xaa, +- 0x8d, 0x09, 0x75, 0xd2, 0xe6, 0xd8, 0xd8, 0xd2, 0xd8, 0x58, 0x65, 0x23, +- 0x59, 0x85, 0x65, 0x9f, 0x18, 0x05, 0xf6, 0xd2, 0xcf, 0x4f, 0xe2, 0xd9, +- 0xaa, 0xc7, 0xdf, 0xe8, 0xb7, 0x3c, 0x9a, 0x9d, 0xa7, 0xcd, 0x5b, 0x1a, +- 0xdd, 0x37, 0xcf, 0x3d, 0x7f, 0x0a, 0x7b, 0x3e, 0x24, 0xd3, 0xca, 0xfe, +- 0x91, 0x0e, 0xb6, 0x2b, 0x8f, 0x76, 0x2d, 0x31, 0xad, 0x8c, 0x3a, 0x4b, +- 0x61, 0xd9, 0x1f, 0xf7, 0xdb, 0x32, 0x6f, 0x2d, 0x05, 0x7b, 0xa0, 0x59, +- 0xa2, 0x69, 0xca, 0xa4, 0x9d, 0x82, 0x0f, 0x80, 0xf9, 0x1c, 0x19, 0x9d, +- 0x76, 0x28, 0x9f, 0x9f, 0x82, 0xdd, 0x6f, 0x96, 0x06, 0xa5, 0x6f, 0x1e, +- 0xd7, 0x63, 0x9d, 0xc2, 0x58, 0xdb, 0xd4, 0x7e, 0xca, 0x3a, 0x91, 0x04, +- 0xc6, 0x39, 0x64, 0x38, 0x7d, 0x18, 0x8f, 0x1e, 0x7b, 0xa7, 0x4c, 0xd5, +- 0xb8, 0x6f, 0xf6, 0x44, 0xd7, 0xfc, 0xf4, 0x39, 0xb4, 0x0b, 0xfc, 0x43, +- 0x8e, 0x57, 0x01, 0x3e, 0x84, 0x2c, 0xa7, 0x6d, 0x33, 0x1b, 0x86, 0x9d, +- 0x9f, 0x0f, 0xea, 0x90, 0xa6, 0x63, 0xa3, 0xc9, 0xa5, 0x24, 0xfa, 0xea, +- 0xa4, 0x0e, 0x83, 0xee, 0x0a, 0xe3, 0xc7, 0xbe, 0xd9, 0x0e, 0xb6, 0x68, +- 0x90, 0x76, 0x64, 0x0e, 0x76, 0xa4, 0x53, 0x0e, 0x97, 0x54, 0x1f, 0x16, +- 0xfb, 0x28, 0xea, 0xb6, 0x5d, 0x4b, 0x0d, 0xf0, 0xb1, 0x92, 0xe6, 0x8b, +- 0xb2, 0xd6, 0x76, 0x58, 0xfc, 0x76, 0x7e, 0xdf, 0x3f, 0xf1, 0x32, 0xf1, +- 0xfa, 0xbd, 0xdf, 0x2c, 0x61, 0xd0, 0x91, 0x43, 0x1f, 0x1c, 0x7f, 0xad, +- 0xef, 0xa0, 0xbf, 0xa4, 0x79, 0xfe, 0xb2, 0xbe, 0xb6, 0x69, 0xfc, 0x66, +- 0x5b, 0xb9, 0x5f, 0x6b, 0x6c, 0xce, 0xf7, 0x09, 0xc8, 0x83, 0x44, 0x72, +- 0xbd, 0xd0, 0x8b, 0xb5, 0x41, 0x2d, 0x23, 0x4f, 0xa2, 0xac, 0xde, 0xc7, +- 0xf2, 0xe5, 0xab, 0x00, 0x6c, 0x59, 0xc4, 0x3e, 0x0f, 0xa7, 0x33, 0x6d, +- 0x7e, 0xcc, 0xeb, 0x4a, 0x7e, 0x15, 0xe4, 0x06, 0x7d, 0x16, 0x57, 0xdb, +- 0x72, 0x4e, 0x4f, 0x8e, 0xbe, 0x34, 0x93, 0xc0, 0x9c, 0x7c, 0xbb, 0xe0, +- 0xf3, 0x9a, 0x36, 0x27, 0x24, 0xcb, 0x8e, 0x05, 0xff, 0x9d, 0x36, 0xde, +- 0x92, 0x97, 0x9d, 0xc0, 0xfe, 0xd0, 0x16, 0xa1, 0x7e, 0x8d, 0xb4, 0x91, +- 0xf6, 0x39, 0xcc, 0xcd, 0x93, 0x59, 0xd7, 0x97, 0xc1, 0x5e, 0xd8, 0x91, +- 0xff, 0x18, 0xb1, 0x8f, 0xd0, 0xcf, 0xbb, 0x18, 0xa9, 0x9f, 0x4f, 0x80, +- 0x15, 0x9e, 0xd0, 0x31, 0xe8, 0x39, 0x2d, 0x2f, 0x65, 0xc8, 0x4b, 0x9f, +- 0x65, 0x4a, 0x0f, 0x68, 0x47, 0x9d, 0xfe, 0x6e, 0xf8, 0x5b, 0xf4, 0xe5, +- 0x13, 0xa0, 0xc7, 0x84, 0xee, 0xd8, 0xa6, 0x7d, 0x87, 0xb7, 0xa2, 0xb4, +- 0x6d, 0x6d, 0x2a, 0xbe, 0x3d, 0xa7, 0xe4, 0xd9, 0x97, 0xef, 0xb0, 0x7e, +- 0x1f, 0xc8, 0x54, 0x98, 0x90, 0x46, 0xd6, 0xe2, 0xb8, 0xac, 0xbf, 0xa0, +- 0xeb, 0xcf, 0xa3, 0x7e, 0x08, 0x73, 0xf2, 0xbc, 0x49, 0x45, 0xef, 0x02, +- 0xf8, 0x1e, 0x96, 0xe2, 0xaa, 0xcc, 0x2f, 0x40, 0xe6, 0x29, 0xdf, 0x73, +- 0xd8, 0xaf, 0x20, 0xfe, 0x6e, 0xca, 0x7d, 0x45, 0x86, 0x4e, 0xef, 0x6f, +- 0x60, 0xcc, 0xd5, 0x32, 0xe8, 0x03, 0x53, 0x26, 0x3b, 0xe5, 0xb1, 0x52, +- 0xd2, 0x9c, 0xaa, 0x5b, 0xcb, 0x5d, 0xeb, 0xd6, 0x92, 0x32, 0xa0, 0xea, +- 0xa7, 0x58, 0xbf, 0x52, 0x27, 0x03, 0x8b, 0xf3, 0x57, 0x6a, 0x47, 0x19, +- 0x60, 0xbb, 0xcd, 0xfc, 0x05, 0xc6, 0x28, 0x3d, 0x6f, 0xd9, 0x25, 0xfe, +- 0x6f, 0x94, 0x82, 0x92, 0xb1, 0x90, 0x14, 0x5d, 0xee, 0xab, 0xac, 0x15, +- 0x11, 0x1b, 0x58, 0xe9, 0xf7, 0x41, 0x67, 0x26, 0x15, 0x15, 0x3f, 0xa6, +- 0x31, 0x81, 0x35, 0x58, 0x31, 0x3d, 0xef, 0x25, 0x47, 0xa4, 0x02, 0x1f, +- 0x78, 0x19, 0x69, 0xb1, 0x8a, 0x3d, 0xdb, 0x1c, 0x81, 0x0e, 0x08, 0x64, +- 0x3c, 0x26, 0x65, 0xd4, 0x59, 0xc4, 0xbb, 0xc7, 0xaa, 0x81, 0xc4, 0x78, +- 0x9e, 0x01, 0x1e, 0xed, 0x73, 0x7e, 0xea, 0xe5, 0xe3, 0xf5, 0x75, 0x03, +- 0x4c, 0x4c, 0x2c, 0x4b, 0x6c, 0x4a, 0x4c, 0xc9, 0x77, 0xc4, 0x89, 0x87, +- 0x40, 0x0b, 0xf7, 0x6c, 0xab, 0xc4, 0xd2, 0x76, 0x62, 0x44, 0x02, 0xdb, +- 0xff, 0x3a, 0x64, 0xa9, 0xe0, 0x35, 0x3a, 0x9d, 0xf2, 0x1c, 0xe4, 0xe6, +- 0xd9, 0x55, 0x1c, 0x63, 0x41, 0x8e, 0x68, 0x47, 0x3d, 0x39, 0xe7, 0x3a, +- 0xd6, 0xe7, 0x90, 0x7e, 0xc7, 0xfd, 0x00, 0xf9, 0xf6, 0x84, 0x48, 0x3f, +- 0x7c, 0x32, 0xe8, 0xf5, 0xd9, 0x00, 0xdb, 0xb7, 0xd2, 0x37, 0xd4, 0xb2, +- 0x74, 0x11, 0x7d, 0xda, 0xa6, 0x01, 0x50, 0x7b, 0x07, 0xea, 0xf9, 0x7b, +- 0x23, 0x28, 0x3b, 0x84, 0xba, 0xa4, 0x81, 0x7e, 0xfb, 0x77, 0xb1, 0x67, +- 0x3d, 0xef, 0x1e, 0xf7, 0xe5, 0x3a, 0x5d, 0xb3, 0x80, 0xf5, 0x57, 0x72, +- 0x3e, 0xd0, 0x26, 0x8c, 0xf3, 0x4a, 0x7f, 0xbb, 0xf2, 0x2b, 0xf9, 0x0c, +- 0x79, 0x1f, 0x20, 0x16, 0xb2, 0x14, 0xd6, 0x24, 0x6e, 0x78, 0x16, 0xbc, +- 0xff, 0xa4, 0xc2, 0x34, 0xc4, 0x6f, 0xa0, 0xbf, 0x44, 0x4c, 0xe1, 0x63, +- 0x69, 0x1f, 0xd7, 0x11, 0x5b, 0xa4, 0xb8, 0x36, 0x1a, 0x5f, 0xb0, 0x2d, +- 0xeb, 0xb1, 0x6d, 0xfd, 0xfa, 0xb1, 0xce, 0xb6, 0x50, 0xee, 0x38, 0xe5, +- 0x99, 0xf6, 0xb1, 0x4d, 0xf6, 0xa7, 0x1a, 0xc1, 0xf7, 0x76, 0x6d, 0xc7, +- 0x3f, 0x08, 0xcc, 0x06, 0xec, 0x6d, 0xd2, 0x87, 0x0a, 0x78, 0x7d, 0x23, +- 0xca, 0x7e, 0x0e, 0xfe, 0xb3, 0x0c, 0xfe, 0x95, 0xb2, 0x93, 0x0f, 0x61, +- 0x2f, 0x97, 0xb7, 0xf9, 0x31, 0x34, 0xae, 0x43, 0x80, 0x13, 0x02, 0xdc, +- 0x67, 0x6a, 0xbc, 0xcf, 0xb5, 0xf1, 0xe3, 0x6d, 0x86, 0xaa, 0x4b, 0x5f, +- 0xab, 0xde, 0xc7, 0xe5, 0x1e, 0xf6, 0xbc, 0x73, 0x6e, 0x80, 0x23, 0xeb, +- 0xfd, 0xc4, 0xc0, 0x07, 0x8c, 0x89, 0xd5, 0x4e, 0x4c, 0xf1, 0x47, 0x0d, +- 0x6b, 0x58, 0xe6, 0x1f, 0xbc, 0xb0, 0x43, 0x9f, 0x93, 0x38, 0x26, 0xf0, +- 0x07, 0x59, 0x97, 0xd8, 0xe6, 0x51, 0x8c, 0x11, 0x16, 0xab, 0x83, 0xf9, +- 0x1f, 0xeb, 0x36, 0x7c, 0xf6, 0xa4, 0x67, 0x67, 0xbd, 0x3c, 0x0f, 0xfa, +- 0xfe, 0x62, 0x73, 0x10, 0x03, 0xee, 0x54, 0xfa, 0x64, 0x4d, 0x2e, 0x02, +- 0x9a, 0x82, 0x71, 0x7d, 0xff, 0xb4, 0x1d, 0xb4, 0xdd, 0x05, 0x9b, 0xb2, +- 0xb3, 0xdd, 0xae, 0xf3, 0x45, 0xeb, 0x69, 0xaa, 0xc7, 0x57, 0x16, 0xc6, +- 0x68, 0x94, 0x9d, 0x1d, 0xe4, 0x5d, 0xa7, 0xb2, 0x2d, 0x6b, 0xeb, 0x41, +- 0xdb, 0xcf, 0xb1, 0x37, 0x96, 0xdf, 0x52, 0x47, 0xd7, 0x46, 0xcc, 0x47, +- 0x1f, 0xd7, 0xc7, 0x7c, 0x99, 0xb8, 0x27, 0xbb, 0xdc, 0x00, 0xdf, 0xd5, +- 0xd3, 0x41, 0x8c, 0x47, 0x9a, 0xa3, 0x75, 0x3e, 0xf2, 0xef, 0xea, 0x33, +- 0xaa, 0x39, 0x3d, 0x97, 0xc0, 0x97, 0x4e, 0xa2, 0xfe, 0x7f, 0x00, 0xdd, +- 0x7c, 0x26, 0xed, 0x01, 0x1e, 0x4c, 0xfa, 0x6d, 0x9b, 0x37, 0xc3, 0xfd, +- 0xdc, 0x27, 0x01, 0x6f, 0xda, 0xf5, 0xba, 0xd4, 0xfb, 0xe3, 0xea, 0xe7, +- 0xae, 0xd7, 0x1d, 0x37, 0xd6, 0xcd, 0xa9, 0x5f, 0x0a, 0x8b, 0x94, 0x85, +- 0xf7, 0x23, 0x0d, 0xfc, 0xa1, 0x01, 0xd8, 0x8e, 0x0c, 0xfc, 0x1f, 0xfa, +- 0x45, 0x97, 0xf9, 0x44, 0x3c, 0xc3, 0x1c, 0xcf, 0xc3, 0x47, 0x56, 0xb6, +- 0xc3, 0xb7, 0x8b, 0xc8, 0x43, 0x87, 0xd4, 0xee, 0xa6, 0x5c, 0x8d, 0x4f, +- 0x54, 0xdd, 0xf1, 0xc9, 0xea, 0xc0, 0x38, 0x7d, 0x07, 0x5f, 0xce, 0x50, +- 0xbf, 0x2a, 0x13, 0x06, 0xda, 0x65, 0x55, 0x3b, 0x15, 0xcb, 0xd8, 0xa4, +- 0x1f, 0xe1, 0x1e, 0x9c, 0xf0, 0xc7, 0x8a, 0x8d, 0xe7, 0xa0, 0x77, 0x16, +- 0x67, 0x61, 0xd7, 0x1c, 0x3b, 0x43, 0x59, 0xdc, 0xe7, 0xda, 0x23, 0x4a, +- 0xde, 0xe2, 0xf6, 0x18, 0xd7, 0xaf, 0x32, 0xfb, 0x5e, 0xe8, 0x4d, 0x4f, +- 0xee, 0x84, 0xfe, 0x7b, 0x00, 0xf2, 0x29, 0x67, 0xa0, 0xfc, 0xce, 0x40, +- 0x61, 0x9d, 0x89, 0x8b, 0x71, 0xa2, 0x53, 0xa2, 0x47, 0x13, 0x12, 0x39, +- 0x4a, 0xff, 0x2b, 0x69, 0xde, 0x29, 0x02, 0x3b, 0xf8, 0xe2, 0xcd, 0x86, +- 0xd8, 0x83, 0x19, 0x49, 0xc2, 0x87, 0xec, 0x33, 0x2b, 0x48, 0x8b, 0x92, +- 0x4c, 0x9d, 0x46, 0x5f, 0xd1, 0x33, 0xa8, 0x8b, 0x76, 0x4d, 0xcb, 0x16, +- 0x7e, 0x1d, 0xd2, 0xbc, 0xec, 0xef, 0x8f, 0xe6, 0xe5, 0xf5, 0xf1, 0x9b, +- 0xa1, 0xd5, 0xf8, 0x0d, 0xdf, 0xbf, 0xad, 0xe3, 0x4e, 0x5f, 0xd2, 0xbe, +- 0x0c, 0xe5, 0x82, 0xf6, 0x4c, 0xf9, 0x63, 0xd0, 0xdd, 0x5f, 0x82, 0xff, +- 0xeb, 0x48, 0xae, 0x04, 0x9c, 0x9e, 0xf6, 0xe4, 0x69, 0xb7, 0xe0, 0x65, +- 0x07, 0x3c, 0x79, 0xdd, 0x75, 0x0a, 0x79, 0xb1, 0xdf, 0xa6, 0x8e, 0xfb, +- 0xb1, 0xfb, 0x21, 0xd9, 0xd3, 0x66, 0xef, 0xc9, 0x84, 0x0a, 0x5e, 0x8b, +- 0xd3, 0x2c, 0x57, 0xa7, 0x0f, 0xc9, 0xbe, 0x1d, 0x2b, 0x66, 0x58, 0x32, +- 0x57, 0x03, 0x0b, 0x26, 0xf2, 0x4a, 0x3f, 0xbd, 0xa1, 0x7c, 0xea, 0xfb, +- 0xbb, 0x0f, 0xc9, 0xd6, 0x1d, 0xb6, 0x79, 0x29, 0x4c, 0x9c, 0x76, 0x08, +- 0xf8, 0xdf, 0x4e, 0xe4, 0xc2, 0x8e, 0xb9, 0x5b, 0xec, 0x91, 0x4f, 0x0b, +- 0xcf, 0x8c, 0x1d, 0xe9, 0x3a, 0xea, 0x24, 0x1e, 0x0c, 0xf5, 0x1c, 0x78, +- 0x90, 0x3e, 0xdd, 0x19, 0xe6, 0x3d, 0x89, 0xed, 0x30, 0xf1, 0x1c, 0x97, +- 0xae, 0x13, 0x96, 0x24, 0xc1, 0x97, 0x5e, 0xc5, 0x13, 0x9e, 0x5d, 0x25, +- 0xa4, 0xe7, 0x28, 0x71, 0x93, 0xe2, 0x4d, 0x2f, 0x78, 0x93, 0x02, 0x6f, +- 0xe0, 0x47, 0xf5, 0x99, 0x97, 0x90, 0x9e, 0x97, 0xe4, 0xe0, 0x9b, 0xe0, +- 0x4d, 0x2f, 0x78, 0xd3, 0x73, 0xc6, 0x42, 0x7b, 0xf4, 0xb1, 0xdc, 0x85, +- 0xb4, 0x59, 0x3e, 0x72, 0x55, 0x07, 0x9e, 0x1d, 0x49, 0x1e, 0x8d, 0x61, +- 0x8c, 0x90, 0xec, 0xea, 0x2e, 0xc8, 0xf0, 0x0e, 0xf8, 0x63, 0xf1, 0x43, +- 0x72, 0x01, 0xb6, 0xa7, 0x04, 0xbf, 0xe0, 0xe9, 0x41, 0x7b, 0x6c, 0x05, +- 0xfa, 0xb3, 0x76, 0x97, 0x27, 0xaf, 0xec, 0xf8, 0x2b, 0x2f, 0x71, 0x95, +- 0xbd, 0x47, 0x42, 0x03, 0x32, 0x5d, 0x52, 0x36, 0x21, 0x91, 0x0d, 0x2b, +- 0x2c, 0x86, 0x39, 0x16, 0x60, 0x57, 0x78, 0x16, 0xee, 0x40, 0xbf, 0x7f, +- 0x5a, 0x1e, 0x28, 0x4f, 0xe1, 0x07, 0x1f, 0x73, 0x86, 0x75, 0x0f, 0xc0, +- 0x87, 0x7b, 0x48, 0xf6, 0xcf, 0x00, 0x2f, 0xa6, 0x41, 0xf7, 0x80, 0x03, +- 0x1f, 0xee, 0x7c, 0xa3, 0xb4, 0xa2, 0x0c, 0xbc, 0x1d, 0xab, 0x6d, 0xf4, +- 0xdd, 0x56, 0xb0, 0x0e, 0x83, 0xf2, 0x97, 0xb5, 0x01, 0xf9, 0x6a, 0xad, +- 0x5f, 0xbe, 0x0c, 0x7b, 0xf2, 0x6c, 0xad, 0x13, 0x7b, 0x25, 0x81, 0x35, +- 0x49, 0x63, 0x7d, 0x5c, 0xf9, 0x4a, 0x2d, 0x25, 0x5f, 0x02, 0xaf, 0x9e, +- 0xc3, 0x6f, 0xb8, 0x94, 0x92, 0x5d, 0xa5, 0x7e, 0xbd, 0x46, 0x5c, 0x1f, +- 0x07, 0xf4, 0x38, 0x98, 0xbb, 0xfd, 0x54, 0x01, 0xfb, 0x6f, 0xb1, 0xe6, +- 0xbc, 0x55, 0x91, 0xc7, 0x1a, 0x19, 0x5f, 0x3e, 0xb5, 0x6a, 0x53, 0x0a, +- 0x9e, 0xe9, 0xd8, 0x47, 0x26, 0xb0, 0x0e, 0x15, 0xec, 0xd3, 0x31, 0xc5, +- 0xfb, 0x35, 0x7b, 0x53, 0xf1, 0xed, 0x4d, 0x30, 0xbf, 0xd9, 0xbc, 0x7c, +- 0x47, 0xb2, 0x73, 0xd3, 0xb2, 0xef, 0xb8, 0x27, 0xbf, 0xe3, 0x7a, 0x90, +- 0x63, 0xea, 0xdf, 0x01, 0xea, 0x75, 0x6b, 0x22, 0x6c, 0x28, 0xff, 0xc9, +- 0xc7, 0x2a, 0xbd, 0xdb, 0xb1, 0x67, 0x53, 0x19, 0x63, 0x4a, 0x92, 0x73, +- 0x53, 0xd2, 0x35, 0x07, 0x59, 0x70, 0xd9, 0xd7, 0x8a, 0x69, 0x5c, 0x26, +- 0x0f, 0x1c, 0xc7, 0x1e, 0xcc, 0x89, 0x63, 0xbe, 0x25, 0x29, 0x8c, 0x7f, +- 0x50, 0xba, 0xd1, 0xc6, 0x41, 0x9b, 0x4b, 0x6a, 0xec, 0x16, 0x8c, 0xdd, +- 0x28, 0x87, 0xe3, 0x36, 0x64, 0x8d, 0x76, 0xfb, 0xff, 0x48, 0xb6, 0xc2, +- 0xf4, 0x6f, 0x25, 0x7b, 0xea, 0x91, 0x98, 0x34, 0xf3, 0x19, 0xaa, 0x61, +- 0x81, 0xe5, 0x5d, 0x48, 0x59, 0xee, 0xc0, 0x77, 0xfe, 0x89, 0x64, 0xcf, +- 0x72, 0xec, 0xb7, 0x50, 0xfe, 0x8a, 0x64, 0x8f, 0xfd, 0x1c, 0xf9, 0x0b, +- 0x48, 0xdf, 0x46, 0x3a, 0x26, 0x5d, 0xc7, 0x24, 0x94, 0x3d, 0xfb, 0x6d, +- 0xe4, 0x23, 0x48, 0x0f, 0xa3, 0xde, 0x6d, 0xa0, 0xef, 0xaf, 0xd1, 0x5f, +- 0x06, 0x7a, 0xee, 0xc3, 0x9a, 0x7e, 0x96, 0xb3, 0x8c, 0xef, 0x0e, 0x43, +- 0xa7, 0xfd, 0x0f, 0x8f, 0xf1, 0x44, 0xf5, 0xbc, 0xc8, 0x3c, 0x75, 0x1b, +- 0x9f, 0xa7, 0xc0, 0x93, 0x83, 0xc8, 0x7b, 0xf2, 0x90, 0x4b, 0x1b, 0x73, +- 0x93, 0x8c, 0x9b, 0x05, 0xaf, 0x19, 0x58, 0xa2, 0x05, 0xfb, 0x60, 0x6a, +- 0xe7, 0xe6, 0xfb, 0xe0, 0x48, 0xcf, 0x21, 0x69, 0xda, 0x11, 0xcc, 0x3f, +- 0x98, 0xaf, 0x63, 0xfe, 0x48, 0xf1, 0xc1, 0x2e, 0x3c, 0x28, 0x9c, 0x87, +- 0x93, 0x78, 0xdc, 0xe8, 0xd9, 0xf3, 0x00, 0xf6, 0x81, 0x71, 0x96, 0x79, +- 0x7f, 0x1f, 0x18, 0x67, 0xa1, 0x1b, 0x16, 0xe0, 0x17, 0x2e, 0x74, 0x4a, +- 0xe3, 0xb1, 0xb5, 0x7d, 0xd0, 0x70, 0xec, 0x57, 0xef, 0x83, 0xc6, 0xb3, +- 0xa8, 0x77, 0x96, 0x3c, 0x43, 0x1f, 0xa7, 0xc8, 0xb3, 0x0e, 0xa4, 0x9f, +- 0xc6, 0x5c, 0x49, 0x7b, 0x23, 0x68, 0xf7, 0xb1, 0xd0, 0xcd, 0x90, 0xf7, +- 0xfb, 0x77, 0x1c, 0xd4, 0xe5, 0xff, 0xd9, 0x1b, 0x89, 0xdb, 0x65, 0x09, +- 0x91, 0xa7, 0xa8, 0x5b, 0x21, 0x0f, 0x6f, 0x69, 0x92, 0xe6, 0x03, 0xd2, +- 0x45, 0xfe, 0x55, 0x76, 0x23, 0x5f, 0xf0, 0xa2, 0x4e, 0x8b, 0xe6, 0x27, +- 0xb0, 0xd1, 0x00, 0xcb, 0x5f, 0x83, 0xcc, 0x10, 0xa3, 0xbe, 0x21, 0xfb, +- 0x66, 0x3c, 0x19, 0x77, 0x39, 0xff, 0xef, 0x63, 0xfe, 0x99, 0x1d, 0x71, +- 0x59, 0xb1, 0xe2, 0xe0, 0xc9, 0x22, 0x74, 0xfb, 0x05, 0xf1, 0xf9, 0xc0, +- 0x33, 0x89, 0x5d, 0xe2, 0x24, 0x86, 0xc5, 0x49, 0xbd, 0x09, 0x3e, 0x0c, +- 0x43, 0xf6, 0x73, 0x35, 0xca, 0xce, 0xab, 0x32, 0x04, 0x99, 0xf8, 0x9e, +- 0x6b, 0xa7, 0x80, 0x7f, 0xa0, 0x2f, 0x28, 0x17, 0x94, 0x89, 0x56, 0xa5, +- 0x93, 0x16, 0x5c, 0xfb, 0x89, 0x8a, 0x5c, 0x27, 0x0b, 0xed, 0xa4, 0x1d, +- 0xef, 0x8e, 0x29, 0x7b, 0x91, 0x9a, 0x30, 0xba, 0xa1, 0xa3, 0x53, 0x62, +- 0xf6, 0x7c, 0xb1, 0x31, 0xb8, 0xbf, 0x92, 0x9f, 0x0b, 0xc9, 0x54, 0x0f, +- 0xd7, 0x8a, 0xfd, 0x22, 0x5f, 0x29, 0x78, 0x11, 0xe7, 0x2d, 0xef, 0x64, +- 0x87, 0x25, 0x9f, 0xec, 0x59, 0x95, 0xcb, 0xb2, 0x88, 0xbf, 0x2f, 0x86, +- 0xd4, 0x7a, 0x04, 0x74, 0x07, 0x73, 0x09, 0xde, 0xf5, 0xd7, 0xbd, 0xe3, +- 0x5c, 0x28, 0xeb, 0xab, 0x7b, 0xc7, 0xba, 0x9c, 0xd6, 0x9f, 0x41, 0x9e, +- 0xec, 0x27, 0x8a, 0xf2, 0x3a, 0x64, 0x0f, 0x3c, 0x3c, 0xcb, 0x94, 0x3c, +- 0x9c, 0x82, 0xdc, 0xbf, 0x26, 0xbb, 0xe6, 0xb8, 0x67, 0x5e, 0xc3, 0x5c, +- 0x95, 0x2e, 0x81, 0x8e, 0x60, 0x7f, 0x9e, 0x4c, 0xbb, 0xdd, 0xa9, 0x53, +- 0x72, 0x5d, 0x62, 0x12, 0x7e, 0xe6, 0x84, 0xe9, 0xc9, 0xb2, 0x5b, 0x90, +- 0xe5, 0x41, 0xb4, 0xa9, 0x7c, 0x1a, 0xbf, 0x79, 0x3d, 0xb7, 0x47, 0xc0, +- 0x77, 0xdb, 0x2a, 0x1b, 0x9f, 0x01, 0xdf, 0x1f, 0x92, 0xe4, 0xb1, 0x55, +- 0x5d, 0x03, 0xb9, 0xf3, 0x75, 0x4d, 0xf2, 0xac, 0x29, 0x95, 0x92, 0x23, +- 0x1f, 0xa3, 0x0e, 0x29, 0x71, 0x5e, 0xd0, 0x31, 0x3c, 0xdf, 0x2f, 0x41, +- 0xcf, 0x94, 0xa0, 0x53, 0xa0, 0x43, 0xbe, 0x8c, 0xf2, 0x2f, 0xa1, 0xce, +- 0x73, 0xf0, 0x99, 0x9e, 0x05, 0xde, 0x3b, 0x07, 0x1c, 0xf1, 0x4c, 0x29, +- 0xa3, 0xfd, 0x57, 0x35, 0x5f, 0xd8, 0x2c, 0xe5, 0xef, 0x48, 0xa5, 0x4c, +- 0x7e, 0xfc, 0x44, 0xad, 0x6d, 0xd6, 0xdd, 0x46, 0x6c, 0x05, 0xca, 0x44, +- 0xca, 0xe5, 0x80, 0x27, 0xd4, 0x7d, 0x3c, 0x1b, 0x0a, 0x74, 0x65, 0xcb, +- 0x06, 0x5d, 0x29, 0xf2, 0x62, 0xd5, 0xc7, 0x90, 0xc4, 0xc4, 0xc5, 0x19, +- 0x6b, 0xf5, 0x0c, 0xb5, 0x08, 0xbb, 0x79, 0x1e, 0xbe, 0x45, 0x2c, 0xfd, +- 0x2d, 0x89, 0x9d, 0xf0, 0xbc, 0x1f, 0xc0, 0x6e, 0x16, 0xb0, 0x26, 0x46, +- 0x08, 0xe5, 0x4b, 0x7c, 0x47, 0xb9, 0xa7, 0x6c, 0x87, 0x78, 0x96, 0x22, +- 0x2f, 0xa3, 0xac, 0xa2, 0x7c, 0xae, 0x6f, 0x83, 0x1e, 0x4d, 0x9f, 0x2a, +- 0x63, 0xbd, 0x46, 0xc9, 0x8d, 0xa7, 0xe0, 0xd7, 0xf4, 0x99, 0x8d, 0x68, +- 0x5f, 0x5e, 0x62, 0x1b, 0x7b, 0x90, 0x57, 0xb9, 0x5e, 0x5e, 0x62, 0x79, +- 0xa7, 0x5c, 0x80, 0xff, 0x49, 0x1a, 0x2a, 0xf3, 0x69, 0xf1, 0xe3, 0xc5, +- 0xd4, 0x57, 0xa4, 0x15, 0x79, 0xf0, 0x2b, 0x5b, 0xa2, 0x9d, 0x8d, 0x48, +- 0x21, 0x41, 0x5e, 0x27, 0xe4, 0xfc, 0xcc, 0x1f, 0x37, 0x31, 0x1e, 0x9b, +- 0x75, 0xf8, 0x1c, 0xc4, 0x37, 0xcc, 0x77, 0x10, 0xdf, 0x60, 0x4c, 0x23, +- 0x02, 0x5b, 0xa6, 0xe2, 0x1c, 0x48, 0xad, 0x3a, 0x9f, 0x97, 0xef, 0x7d, +- 0x6c, 0xb4, 0x86, 0x19, 0x89, 0x21, 0x39, 0x5f, 0xbb, 0xb0, 0x02, 0xfd, +- 0xd1, 0x9e, 0x7e, 0x49, 0xee, 0x5e, 0xf0, 0xe7, 0x67, 0x9c, 0x12, 0xde, +- 0xe3, 0x91, 0x4b, 0xf3, 0xb6, 0x7b, 0x51, 0x78, 0x06, 0xe2, 0x62, 0xbd, +- 0xfe, 0xa0, 0x09, 0xfa, 0x6b, 0x30, 0x63, 0x7c, 0xbb, 0xc9, 0xc7, 0x67, +- 0x11, 0x99, 0x9a, 0xe1, 0x99, 0x2b, 0x74, 0x1b, 0x70, 0xe3, 0xef, 0x45, +- 0xf0, 0x5c, 0x65, 0x1e, 0x7e, 0xa8, 0xef, 0xc3, 0xe2, 0xd9, 0xef, 0x8f, +- 0x3c, 0x37, 0x16, 0x38, 0xf7, 0x90, 0xdc, 0x0d, 0x74, 0x22, 0xe8, 0xbf, +- 0x4b, 0x8f, 0xd5, 0x75, 0x2a, 0xc5, 0xf8, 0xb5, 0x24, 0xa1, 0x2f, 0xb2, +- 0xf0, 0x1f, 0x73, 0xf1, 0x4e, 0x8d, 0xc7, 0xf9, 0x6e, 0x23, 0xde, 0x0c, +- 0xfc, 0xba, 0x94, 0x7c, 0xbe, 0x14, 0x60, 0xbd, 0x14, 0x6c, 0xac, 0x44, +- 0x46, 0x7a, 0x3d, 0xf9, 0x81, 0x4b, 0x7e, 0xf5, 0x23, 0xef, 0xca, 0x91, +- 0xda, 0x2f, 0x3b, 0x5b, 0xad, 0xff, 0x6b, 0x01, 0x8d, 0xfc, 0x81, 0x3e, +- 0xe0, 0x23, 0xd2, 0x6e, 0xc0, 0x9e, 0x17, 0x81, 0xbb, 0x8c, 0x33, 0x9d, +- 0xea, 0x9d, 0x01, 0x6c, 0x50, 0x99, 0x81, 0x6e, 0x3c, 0xc3, 0xf3, 0x66, +- 0xe8, 0xb6, 0x33, 0x51, 0x29, 0xce, 0x52, 0x2e, 0xa5, 0xdd, 0xc0, 0x7a, +- 0xb1, 0x7e, 0x65, 0xa6, 0x13, 0x69, 0x0b, 0x52, 0x4b, 0xf5, 0x53, 0x99, +- 0x71, 0x54, 0xfb, 0xca, 0x4c, 0x4a, 0xb5, 0xab, 0xcc, 0xf4, 0x23, 0x75, +- 0xa5, 0xe1, 0x0c, 0x9c, 0xa5, 0x33, 0x3d, 0x32, 0x75, 0x12, 0xf6, 0x65, +- 0xc0, 0x50, 0x77, 0x35, 0x26, 0x60, 0x7f, 0x22, 0xf0, 0xac, 0x2e, 0x9a, +- 0x83, 0xc0, 0x58, 0x37, 0x01, 0x83, 0xdc, 0x24, 0xce, 0x09, 0xce, 0x9f, +- 0xba, 0xf7, 0x3c, 0x63, 0x5e, 0x89, 0x4f, 0x48, 0x46, 0xf6, 0xcf, 0x36, +- 0x62, 0xbf, 0x46, 0xcc, 0xa2, 0x74, 0x9b, 0xc3, 0xc8, 0xe7, 0xcb, 0xe4, +- 0xdb, 0xbd, 0xca, 0x5f, 0xcb, 0xba, 0x37, 0x34, 0x4b, 0x73, 0x1a, 0x63, +- 0xbc, 0x93, 0xf6, 0xbd, 0x90, 0x3f, 0x47, 0xf7, 0x91, 0x06, 0x3d, 0xf5, +- 0xfc, 0xe0, 0x39, 0x73, 0xe6, 0x57, 0x9c, 0x33, 0x53, 0xae, 0xc9, 0xdf, +- 0x7b, 0xe5, 0xbc, 0x93, 0x96, 0x97, 0x9d, 0x94, 0x5c, 0x70, 0x76, 0xca, +- 0x37, 0x61, 0xa7, 0x5f, 0x72, 0xce, 0x34, 0x11, 0x0b, 0x54, 0xd4, 0xd9, +- 0x5d, 0xb0, 0x56, 0x8e, 0x8e, 0x9d, 0xff, 0x50, 0x96, 0x67, 0x88, 0x9d, +- 0xbd, 0xdb, 0xf6, 0xb9, 0x05, 0xda, 0x2d, 0xd0, 0x40, 0xac, 0x56, 0x80, +- 0xfd, 0x3b, 0x24, 0xc3, 0x2e, 0xed, 0x9e, 0xb2, 0x51, 0x89, 0x61, 0x7f, +- 0x3f, 0xbb, 0x79, 0xe8, 0xd5, 0xf3, 0xb3, 0xd8, 0x4f, 0x42, 0xf9, 0xc7, +- 0x73, 0x99, 0xeb, 0xee, 0xc8, 0xe3, 0x25, 0xce, 0xb3, 0xb8, 0xbd, 0x59, +- 0xc2, 0x32, 0xa2, 0xf0, 0x42, 0xab, 0xbc, 0xb8, 0xb4, 0x45, 0x0c, 0x58, +- 0x28, 0xe3, 0xda, 0xa8, 0xba, 0xe5, 0x42, 0x9f, 0x5b, 0xda, 0x78, 0xb6, +- 0xf6, 0x87, 0xe0, 0x0d, 0xfd, 0x7f, 0xcc, 0xad, 0x8d, 0x33, 0x09, 0xf2, +- 0xfd, 0xd8, 0x5f, 0x7c, 0x0e, 0x49, 0xce, 0x89, 0xe3, 0x99, 0x29, 0xf7, +- 0x1c, 0x63, 0x63, 0x61, 0xf1, 0x31, 0xf7, 0x21, 0xf5, 0xbe, 0xd1, 0xb9, +- 0x15, 0xb8, 0x8e, 0xf2, 0x8a, 0x74, 0xd9, 0x1f, 0x37, 0x07, 0x1c, 0x97, +- 0xef, 0xe7, 0x1d, 0x1b, 0x3b, 0x55, 0xc0, 0x5e, 0x98, 0x50, 0xf5, 0x07, +- 0xe4, 0xa5, 0x99, 0x52, 0xb3, 0xbf, 0x3f, 0x06, 0xf5, 0x33, 0xdf, 0xd3, +- 0xa7, 0x62, 0x8c, 0xe4, 0x99, 0xd1, 0x69, 0xe7, 0xa2, 0xde, 0x3f, 0x12, +- 0xba, 0xb3, 0x17, 0x38, 0xf4, 0x68, 0x03, 0xe6, 0x62, 0x5b, 0x56, 0xc8, +- 0xe8, 0x30, 0x80, 0xe3, 0x87, 0x95, 0xcd, 0xed, 0x55, 0x31, 0xe8, 0x53, +- 0xa9, 0x56, 0xa9, 0x98, 0x8e, 0xba, 0x93, 0xb7, 0x62, 0xee, 0x20, 0xd6, +- 0xc7, 0xaf, 0x09, 0x65, 0xdd, 0x48, 0x1b, 0x91, 0xbe, 0x5f, 0x8a, 0xc7, +- 0xcf, 0xe8, 0xf1, 0xa2, 0x1b, 0xf2, 0x1f, 0xd1, 0xe9, 0x67, 0xb5, 0x3f, +- 0xc5, 0x71, 0xa2, 0xe2, 0x7c, 0xa1, 0x45, 0xba, 0x8f, 0x9a, 0xc0, 0xb6, +- 0x09, 0x60, 0xdd, 0x4e, 0x49, 0x1d, 0xb5, 0xe4, 0xda, 0xa3, 0x41, 0x9c, +- 0xe9, 0x2b, 0xa3, 0x49, 0x15, 0xd7, 0xfc, 0xf2, 0xa8, 0x53, 0x56, 0xe7, +- 0xed, 0xfa, 0xee, 0xe0, 0x8a, 0xbe, 0x53, 0xf8, 0xca, 0x68, 0xaf, 0x4a, +- 0xbf, 0x3d, 0x9a, 0x52, 0xe9, 0xab, 0xa3, 0xd7, 0x56, 0x7d, 0xff, 0xa8, +- 0xb8, 0x98, 0x92, 0xcf, 0x95, 0x88, 0x2f, 0x07, 0x80, 0x1d, 0x5d, 0xe8, +- 0x99, 0x7e, 0xe8, 0x99, 0x14, 0xf4, 0xcc, 0x20, 0xf5, 0x0c, 0xf4, 0xf6, +- 0xab, 0xd0, 0xdb, 0xae, 0x7c, 0x0f, 0xf2, 0xfa, 0x8c, 0xdb, 0x08, 0x5c, +- 0xe8, 0x79, 0xfe, 0x5c, 0xed, 0x27, 0x56, 0xb0, 0xbe, 0x95, 0xd3, 0x12, +- 0x6b, 0x83, 0x0e, 0xda, 0xb1, 0xd0, 0x20, 0x8b, 0x71, 0xcf, 0x9b, 0x73, +- 0x1d, 0xb9, 0x84, 0xfa, 0x59, 0x87, 0xfb, 0xf8, 0x6f, 0x9a, 0xe9, 0x8f, +- 0x5d, 0x9a, 0xd9, 0x09, 0x9d, 0x44, 0x79, 0x8f, 0x49, 0x65, 0x3c, 0x21, +- 0x4b, 0xf0, 0xcf, 0xd6, 0xea, 0xa4, 0xf0, 0xcc, 0xfd, 0xff, 0x13, 0xd4, +- 0x4d, 0xc1, 0x3e, 0x98, 0xb2, 0xdc, 0x6b, 0xc9, 0xa9, 0x5e, 0x7b, 0xd0, +- 0x32, 0xa8, 0xbb, 0x2c, 0x29, 0xc3, 0xbf, 0xaf, 0x94, 0x58, 0x9f, 0xf5, +- 0xb0, 0x3f, 0x4b, 0x7e, 0xbb, 0xe9, 0x52, 0xa0, 0x27, 0x06, 0x18, 0x7b, +- 0x8c, 0xe4, 0x7a, 0x7d, 0x1b, 0x60, 0x18, 0x8d, 0x90, 0x03, 0x17, 0xfc, +- 0x1f, 0x47, 0xf9, 0x00, 0xef, 0x9a, 0xa0, 0x8c, 0x58, 0x28, 0xb6, 0x85, +- 0x18, 0x31, 0xe7, 0x8e, 0xa3, 0x8c, 0x6d, 0xec, 0x44, 0x12, 0xe5, 0x63, +- 0x92, 0x4c, 0xe4, 0xd5, 0xbd, 0xb7, 0x0e, 0x94, 0xb1, 0x8f, 0xb0, 0x8e, +- 0xc1, 0x74, 0x6c, 0xf1, 0xcf, 0x7d, 0x83, 0xf2, 0x3e, 0x15, 0x0f, 0xc8, +- 0x98, 0x2e, 0xf6, 0x03, 0xcb, 0x92, 0x26, 0xdb, 0xe5, 0x5c, 0x57, 0xe9, +- 0xc2, 0x7b, 0xaa, 0x3c, 0xb7, 0x8b, 0xc9, 0xdd, 0xd5, 0x16, 0xc9, 0x55, +- 0x1b, 0xae, 0xa0, 0xff, 0x83, 0x3d, 0x79, 0x3e, 0x61, 0x0a, 0xef, 0x60, +- 0xf8, 0xfb, 0x3c, 0xb2, 0x93, 0x7b, 0x02, 0x7c, 0x87, 0xfd, 0x7d, 0x0e, +- 0xf3, 0x7d, 0x16, 0xf6, 0xf7, 0x1c, 0xec, 0xef, 0x33, 0xa5, 0x35, 0xfd, +- 0xe1, 0xdb, 0x5d, 0xea, 0x80, 0xa7, 0xb0, 0x66, 0x63, 0xc0, 0xfd, 0xbb, +- 0xe1, 0x0f, 0x8c, 0x00, 0xfb, 0x0f, 0x61, 0xfd, 0xd2, 0x58, 0xbb, 0x71, +- 0xde, 0x55, 0xc2, 0x3a, 0x0e, 0xaa, 0xb3, 0xe5, 0x59, 0x75, 0xdf, 0xe3, +- 0x87, 0xca, 0xf6, 0x3e, 0x56, 0x32, 0x60, 0x1f, 0x0a, 0xde, 0x76, 0xc7, +- 0x06, 0xfe, 0x5b, 0xdd, 0xcf, 0x83, 0x2f, 0x42, 0xaf, 0xfc, 0x1d, 0xe8, +- 0x7a, 0x76, 0x96, 0xf6, 0x1c, 0x75, 0x7c, 0xbc, 0xed, 0x32, 0xbe, 0x85, +- 0xfd, 0x7c, 0xe4, 0xbc, 0xac, 0x00, 0x77, 0x64, 0x28, 0xc7, 0xf0, 0x1f, +- 0xec, 0x67, 0xca, 0xd2, 0x43, 0x1d, 0x58, 0xe6, 0x5e, 0x19, 0x38, 0x96, +- 0x00, 0xd6, 0x03, 0x92, 0x57, 0x67, 0xa9, 0x78, 0x3e, 0xbb, 0x55, 0x0c, +- 0xe2, 0x3d, 0xf7, 0x2a, 0x94, 0x51, 0x6f, 0x04, 0x18, 0x69, 0x65, 0xb0, +- 0x5d, 0x32, 0x3b, 0xda, 0x95, 0xee, 0xb0, 0xdd, 0x97, 0x31, 0xee, 0x2e, +- 0x69, 0x04, 0x86, 0x2b, 0x60, 0x8c, 0x83, 0xf2, 0x37, 0x2e, 0xe3, 0x52, +- 0xbe, 0xef, 0x07, 0x5a, 0x62, 0xe0, 0x59, 0xd3, 0x3e, 0xc7, 0x8c, 0xed, +- 0xaa, 0xb1, 0xff, 0x98, 0xc2, 0x58, 0x39, 0x61, 0xff, 0xb0, 0x13, 0x18, +- 0x33, 0x79, 0x8c, 0xb2, 0xdf, 0x87, 0x75, 0xfb, 0x2d, 0x60, 0x20, 0x72, +- 0xf5, 0x5b, 0x5b, 0xfc, 0xfd, 0x42, 0xfa, 0x57, 0x88, 0x27, 0x18, 0xf7, +- 0xf7, 0xfd, 0xf2, 0x55, 0xda, 0x06, 0x40, 0xef, 0x73, 0x5b, 0x82, 0xf3, +- 0xe3, 0xae, 0x63, 0xbe, 0xbd, 0xee, 0x3a, 0x8b, 0x56, 0x73, 0xd2, 0xc1, +- 0x93, 0x68, 0x43, 0xae, 0x95, 0xdb, 0x23, 0x7e, 0x3f, 0xc6, 0x82, 0x09, +- 0x59, 0xa5, 0x1e, 0xe8, 0x80, 0x9c, 0x33, 0x4f, 0x9d, 0x42, 0x9d, 0x40, +- 0x59, 0x70, 0xa4, 0x58, 0x83, 0x4e, 0x68, 0xed, 0x94, 0x32, 0x79, 0xb6, +- 0x40, 0x3d, 0xf1, 0x43, 0x99, 0xde, 0xa0, 0x2b, 0x87, 0x24, 0xf0, 0x6b, +- 0x5b, 0x24, 0x9a, 0x76, 0xcc, 0x7b, 0xd4, 0x1c, 0x7d, 0x7d, 0xb9, 0x9f, +- 0xf8, 0x73, 0x36, 0x63, 0xb7, 0x8b, 0xc6, 0x9e, 0x0a, 0x3f, 0x7d, 0x1f, +- 0x73, 0x65, 0x1f, 0x8a, 0x4f, 0x83, 0x43, 0xbe, 0x2f, 0xa0, 0xe2, 0x7c, +- 0xc0, 0xc1, 0x89, 0xbf, 0x83, 0xae, 0xcd, 0x11, 0x97, 0x80, 0xcf, 0x5d, +- 0x73, 0x94, 0xa3, 0xed, 0xd4, 0x65, 0xc0, 0x79, 0x29, 0xea, 0x6b, 0x59, +- 0x3a, 0x06, 0xcc, 0x65, 0xdc, 0x2a, 0x79, 0xca, 0x2b, 0xef, 0x48, 0x2c, +- 0x19, 0x32, 0x3d, 0xdf, 0x2a, 0xdd, 0x0b, 0x8c, 0xa9, 0x7e, 0xb3, 0x59, +- 0x5a, 0x19, 0x57, 0xa5, 0x0d, 0x1a, 0x90, 0x1c, 0xca, 0xbb, 0x16, 0xc2, +- 0x2a, 0x06, 0x56, 0x36, 0xc8, 0xa3, 0x7e, 0xe8, 0x03, 0x3b, 0xb5, 0x62, +- 0x7c, 0xb4, 0xc9, 0xc7, 0x90, 0x90, 0xa5, 0x12, 0x64, 0xac, 0x04, 0x19, +- 0x2b, 0x41, 0xc6, 0x4a, 0x90, 0x31, 0x60, 0xbf, 0x67, 0xb1, 0xff, 0xce, +- 0x95, 0x06, 0xb5, 0x5d, 0xdf, 0xa3, 0xec, 0xfa, 0xe1, 0xd2, 0xab, 0x1e, +- 0xd3, 0x2f, 0x29, 0xdf, 0xb4, 0x1f, 0x32, 0x48, 0x5f, 0x34, 0xf0, 0x51, +- 0x5f, 0x95, 0xa7, 0x66, 0x5f, 0x93, 0x53, 0xb3, 0x6b, 0x38, 0x70, 0xaa, +- 0xe4, 0xc9, 0xcb, 0x2e, 0xfc, 0xcf, 0x45, 0x62, 0xaa, 0x4c, 0x5b, 0xa3, +- 0xc2, 0x56, 0x87, 0x24, 0xaf, 0x70, 0xb2, 0xb2, 0x23, 0xc0, 0x57, 0x0a, +- 0x17, 0x72, 0x6f, 0x4a, 0xfb, 0x8e, 0xd7, 0xe5, 0x1c, 0xec, 0xf8, 0x52, +- 0xed, 0x0d, 0x79, 0x4e, 0xe1, 0x71, 0xf2, 0xe1, 0x7d, 0xf2, 0xb7, 0xa6, +- 0x7f, 0x86, 0x7f, 0x0a, 0x58, 0x63, 0xa9, 0x97, 0xba, 0x23, 0x02, 0x5b, +- 0x60, 0x17, 0xba, 0xb0, 0xaf, 0x0f, 0x18, 0xef, 0x02, 0xa6, 0xe1, 0xfb, +- 0xad, 0xf2, 0xe2, 0x6c, 0xa1, 0x4e, 0x26, 0xa8, 0x1f, 0xec, 0x23, 0x62, +- 0xd0, 0x4e, 0xd1, 0x6e, 0x72, 0xbe, 0xb4, 0x53, 0x6d, 0x2d, 0xbc, 0x3f, +- 0x56, 0x39, 0x7e, 0xc3, 0x16, 0xc6, 0x18, 0xe3, 0x0e, 0x79, 0xfa, 0xba, +- 0x1c, 0xa8, 0xb2, 0xec, 0x35, 0xac, 0x0f, 0xd3, 0x37, 0xbd, 0xbb, 0xe3, +- 0x1c, 0x8f, 0xfd, 0x02, 0x37, 0x75, 0x60, 0xae, 0xa5, 0xcf, 0x6a, 0xcc, +- 0xdd, 0xaf, 0x70, 0xf4, 0xe5, 0x78, 0x99, 0x7c, 0x72, 0xc1, 0xa7, 0xd7, +- 0x55, 0x0c, 0x70, 0x93, 0xd8, 0xf0, 0x13, 0xd8, 0x57, 0x85, 0x8b, 0xc2, +- 0x38, 0x25, 0x63, 0xb8, 0x8c, 0x0f, 0xd7, 0x6b, 0x0c, 0x75, 0x57, 0x40, +- 0xee, 0x82, 0x7e, 0xb9, 0x1b, 0xfa, 0xe5, 0x9e, 0xcb, 0xee, 0x5f, 0x07, +- 0x71, 0xff, 0xee, 0x42, 0xd8, 0xe8, 0x94, 0xb1, 0x6a, 0x7d, 0x5b, 0xc6, +- 0x6e, 0x37, 0x8b, 0xd5, 0x32, 0x8e, 0x9b, 0xda, 0x10, 0xff, 0xa3, 0x6c, +- 0x78, 0xf2, 0x92, 0xcb, 0xb8, 0x5b, 0x70, 0x67, 0x7f, 0x33, 0xfc, 0x65, +- 0xb5, 0x04, 0x71, 0xe6, 0x48, 0xfa, 0xa2, 0xf0, 0xee, 0x7e, 0x71, 0x86, +- 0x78, 0x20, 0xae, 0xee, 0xd9, 0x19, 0x2a, 0xce, 0xe7, 0xb7, 0x2d, 0xce, +- 0xa8, 0x73, 0xa5, 0x02, 0xe3, 0xd5, 0xe6, 0x4e, 0xdb, 0x1c, 0x0b, 0xfb, +- 0xf7, 0x65, 0xb8, 0x97, 0x7d, 0x5d, 0x06, 0x59, 0xac, 0xad, 0xdd, 0xb1, +- 0x1c, 0x52, 0xfa, 0xe2, 0x22, 0xf6, 0x00, 0xd7, 0x0b, 0xfe, 0x02, 0xf6, +- 0xc9, 0x14, 0xf4, 0x53, 0x5e, 0xf5, 0x17, 0xa3, 0x5c, 0x64, 0xb2, 0x61, +- 0x43, 0xa2, 0x27, 0xe8, 0x0b, 0xf9, 0xb1, 0x96, 0x5c, 0xd8, 0x56, 0xfa, +- 0x1b, 0xb4, 0x03, 0x9f, 0x71, 0x7f, 0x5a, 0x13, 0x8d, 0xe9, 0x06, 0xd8, +- 0x55, 0xac, 0x5f, 0x8d, 0x31, 0x01, 0xec, 0xdd, 0xe5, 0xef, 0xca, 0xfe, +- 0xf9, 0xe1, 0x16, 0x5f, 0xfe, 0x19, 0x3b, 0xe6, 0xfc, 0x02, 0x1a, 0xd6, +- 0xf7, 0x6d, 0x9c, 0x90, 0x58, 0x33, 0x6c, 0xda, 0x87, 0xe1, 0x67, 0xec, +- 0x82, 0xac, 0xac, 0xc4, 0xd9, 0xaf, 0xbf, 0x67, 0xa6, 0x4b, 0xec, 0xfb, +- 0xbb, 0x32, 0x3c, 0x7f, 0xb6, 0x85, 0xb6, 0x64, 0x19, 0x7a, 0xe0, 0xbc, +- 0x49, 0x1b, 0x3a, 0x0e, 0x1b, 0xd7, 0x21, 0xdf, 0x9f, 0xa7, 0x7d, 0x4c, +- 0x9a, 0xa7, 0xa4, 0x2f, 0x71, 0x0a, 0x34, 0x7d, 0xde, 0x8d, 0xd0, 0x47, +- 0xf3, 0x86, 0x50, 0xf6, 0x4d, 0x49, 0x9a, 0x5d, 0x21, 0x3e, 0xf7, 0x99, +- 0x8f, 0x03, 0xc3, 0x66, 0xcc, 0xa4, 0x79, 0x5d, 0x88, 0x72, 0x04, 0x9f, +- 0x7b, 0x79, 0x8d, 0xce, 0x37, 0xe7, 0x95, 0x9f, 0xa4, 0xf4, 0xcc, 0xb2, +- 0xcb, 0xf1, 0x40, 0xb7, 0xd2, 0x59, 0xd7, 0x41, 0x9f, 0xc4, 0xf4, 0x99, +- 0x1b, 0xda, 0x10, 0xdb, 0xb8, 0x11, 0x9d, 0x7f, 0x44, 0xb2, 0x27, 0xe3, +- 0xd0, 0x67, 0xec, 0x2b, 0xf0, 0x1d, 0x68, 0x23, 0x03, 0xbc, 0x4d, 0x7b, +- 0x77, 0x2b, 0xec, 0xde, 0x35, 0x8a, 0x9e, 0x11, 0xb7, 0x5f, 0xa6, 0x8e, +- 0x73, 0xec, 0x5e, 0xe8, 0xf2, 0x84, 0x92, 0xdb, 0x62, 0xe9, 0x7c, 0x22, +- 0x06, 0x9d, 0x1c, 0xdb, 0x41, 0x7e, 0x7e, 0x50, 0xee, 0x70, 0xc6, 0xe5, +- 0x4e, 0xc8, 0xce, 0x90, 0xe3, 0xca, 0x30, 0xd6, 0x62, 0x97, 0x03, 0xbb, +- 0xa3, 0x30, 0x74, 0x23, 0xfc, 0x2e, 0x8e, 0xdd, 0xa1, 0xef, 0x5c, 0xf8, +- 0xf8, 0xf1, 0xcf, 0x6a, 0x3e, 0x8f, 0xb2, 0xf3, 0x2f, 0x2b, 0xde, 0x8c, +- 0xb8, 0x37, 0x69, 0x3b, 0xdb, 0x2a, 0x39, 0x55, 0xef, 0x26, 0x65, 0x8f, +- 0x8b, 0x4b, 0xf7, 0x22, 0x85, 0x6d, 0x5e, 0x82, 0xbe, 0x01, 0xe6, 0x2e, +- 0x56, 0x77, 0x22, 0x0f, 0x1b, 0xba, 0x94, 0x46, 0xfa, 0x41, 0xa4, 0xac, +- 0xfb, 0xb9, 0x16, 0x3f, 0x96, 0x5b, 0x7f, 0x87, 0xcc, 0xbf, 0x7f, 0xfa, +- 0x61, 0x85, 0x4b, 0x2f, 0xaa, 0xfb, 0x87, 0x06, 0xb0, 0x4e, 0x16, 0x7a, +- 0xa5, 0x05, 0x18, 0x68, 0xe6, 0x84, 0x9d, 0x1a, 0x0e, 0xdd, 0x26, 0x1f, +- 0x81, 0x2f, 0x5f, 0x71, 0xb9, 0x96, 0x3b, 0xe5, 0x13, 0xb7, 0x50, 0x46, +- 0x6e, 0x93, 0x7d, 0xb7, 0x84, 0x64, 0x5f, 0xbf, 0x9d, 0x21, 0xdd, 0xd7, +- 0xbe, 0x3f, 0xf0, 0xa7, 0xbb, 0x47, 0x92, 0xa1, 0x01, 0x79, 0x1c, 0x32, +- 0x56, 0x80, 0x7c, 0x0d, 0xd7, 0xc8, 0x73, 0xea, 0x7b, 0xea, 0xf9, 0x14, +- 0xb0, 0x72, 0x80, 0xfd, 0x1c, 0x99, 0xa9, 0x35, 0x88, 0x75, 0x15, 0xe3, +- 0xc9, 0x96, 0x7f, 0xae, 0x71, 0x15, 0x65, 0x02, 0x3e, 0xc8, 0x55, 0xfe, +- 0xfe, 0x54, 0xf7, 0xfe, 0xae, 0xf2, 0xed, 0x0a, 0xfc, 0x5f, 0x8f, 0x38, +- 0xcf, 0xbf, 0x5f, 0x70, 0x51, 0xeb, 0xd2, 0xe4, 0xd6, 0x55, 0x7c, 0xd7, +- 0x4a, 0xff, 0xe1, 0xeb, 0x2d, 0x6b, 0xdf, 0x2d, 0x6c, 0x94, 0xc5, 0x20, +- 0xee, 0x56, 0xc6, 0x9c, 0x69, 0xd3, 0x6d, 0x93, 0xba, 0xb0, 0xcd, 0xd9, +- 0x23, 0x7f, 0x09, 0xfb, 0xfe, 0xd5, 0x55, 0xfb, 0xbe, 0x17, 0xfc, 0xd8, +- 0x88, 0x01, 0x1c, 0xf3, 0x2e, 0xcc, 0x65, 0x04, 0xeb, 0x79, 0x27, 0x7e, +- 0x77, 0x94, 0xd6, 0xc5, 0xf1, 0x66, 0x0b, 0xc0, 0x93, 0x0d, 0x0e, 0xfb, +- 0x5b, 0x17, 0xcf, 0x2b, 0xe4, 0x65, 0x35, 0x56, 0x38, 0x78, 0x49, 0x68, +- 0xf7, 0xde, 0x92, 0x68, 0x8f, 0xf3, 0x56, 0x57, 0xc8, 0x79, 0xde, 0x08, +- 0xf1, 0xec, 0xdb, 0x95, 0xd3, 0x35, 0xe2, 0xb0, 0x0b, 0x62, 0x9c, 0x25, +- 0x06, 0x7b, 0x45, 0xc5, 0xa0, 0x2a, 0xa5, 0x6f, 0x23, 0x45, 0x7d, 0xe8, +- 0xc7, 0xb0, 0x1f, 0xa7, 0x50, 0x58, 0x85, 0x7a, 0xf6, 0x4e, 0xac, 0xc3, +- 0x14, 0x7e, 0x5d, 0x3b, 0xae, 0xc3, 0xfe, 0xa5, 0x9c, 0x32, 0xf6, 0xd5, +- 0x63, 0xee, 0x08, 0xf1, 0xdd, 0x66, 0x71, 0xb0, 0xef, 0x48, 0x64, 0x0e, +- 0xb6, 0xce, 0xa0, 0x7e, 0xe0, 0x3c, 0x68, 0x27, 0x4d, 0x59, 0x3c, 0xce, +- 0xbd, 0xbe, 0x59, 0xfd, 0xa0, 0x6e, 0x30, 0x17, 0x65, 0x37, 0x32, 0x79, +- 0xc6, 0x38, 0x4b, 0x5c, 0x03, 0x17, 0x6b, 0xe0, 0xc9, 0x09, 0xb7, 0x0d, +- 0x7a, 0x3b, 0x2e, 0xe1, 0x13, 0x9e, 0x0c, 0x29, 0xec, 0xda, 0x07, 0xcc, +- 0xb5, 0x55, 0xe3, 0x86, 0xb8, 0x44, 0x4e, 0x74, 0x4a, 0x23, 0x70, 0x75, +- 0xc3, 0x51, 0xda, 0xc8, 0xa4, 0x35, 0x04, 0x21, 0x88, 0xa8, 0xbb, 0xac, +- 0xf6, 0xe0, 0xf7, 0xa5, 0xcf, 0xfa, 0xbe, 0x10, 0x2f, 0xfd, 0x7b, 0xac, +- 0x9f, 0xed, 0x5e, 0xd8, 0xa4, 0x7e, 0x71, 0xad, 0x3e, 0xe4, 0x88, 0xb1, +- 0x35, 0xb6, 0x61, 0xac, 0x2d, 0x39, 0xf8, 0x3d, 0xc6, 0xd8, 0xe0, 0x6b, +- 0x36, 0x9c, 0xf1, 0x69, 0x30, 0x96, 0xdb, 0xa5, 0x72, 0x92, 0x7b, 0x94, +- 0x71, 0x16, 0xd3, 0xf7, 0x53, 0x4b, 0xf4, 0x57, 0xf9, 0xde, 0xd2, 0xef, +- 0xbb, 0xf4, 0x7b, 0xfa, 0xa3, 0x05, 0xaf, 0x01, 0x3c, 0xdd, 0x05, 0xfd, +- 0x79, 0xef, 0x4e, 0x47, 0xe1, 0x86, 0x7b, 0x57, 0xd7, 0x6c, 0xb7, 0xba, +- 0x4f, 0x54, 0x29, 0x1d, 0x12, 0x67, 0xc7, 0x4a, 0x2a, 0x22, 0x63, 0x58, +- 0x0b, 0xe6, 0x33, 0xa4, 0x27, 0x75, 0x58, 0x0e, 0xa8, 0xb5, 0xa9, 0x1c, +- 0xb7, 0x8f, 0x58, 0xa1, 0x29, 0x31, 0x2a, 0x7c, 0xfe, 0x34, 0xd2, 0xc3, +- 0xc0, 0x3b, 0x7e, 0xec, 0xd2, 0xa8, 0xac, 0xe7, 0x25, 0x30, 0x86, 0xb9, +- 0x6b, 0x5d, 0x1c, 0x6b, 0x2d, 0xc6, 0xc5, 0xf7, 0x43, 0xea, 0x7d, 0x6a, +- 0x5d, 0x9c, 0x2b, 0x67, 0x10, 0xcb, 0x04, 0xef, 0xb9, 0x16, 0x5c, 0x2f, +- 0xd8, 0xe2, 0xe3, 0x41, 0xcc, 0xab, 0x55, 0xaf, 0x0b, 0xd7, 0x67, 0x46, +- 0xce, 0x99, 0xf6, 0x08, 0xe5, 0xef, 0x86, 0x9d, 0x57, 0xcb, 0x44, 0x07, +- 0xe3, 0x6d, 0xf5, 0x34, 0x6c, 0x8c, 0xa3, 0xd5, 0x8f, 0xbf, 0x31, 0xfe, +- 0xc6, 0xb1, 0xfd, 0x18, 0x5b, 0x76, 0x5d, 0x8c, 0xad, 0x7e, 0x3c, 0x8e, +- 0xb5, 0x15, 0xfe, 0x53, 0xc1, 0x8b, 0x3b, 0x5c, 0xa3, 0x6e, 0x6b, 0x9e, +- 0xf9, 0x2f, 0x1a, 0x58, 0xc7, 0x38, 0xec, 0x08, 0xd7, 0x32, 0x38, 0x6f, +- 0xe6, 0x9a, 0x26, 0xad, 0xc3, 0xfe, 0x7a, 0x0e, 0xfa, 0xeb, 0xee, 0xaf, +- 0xff, 0x85, 0xd5, 0x75, 0xa4, 0x7d, 0xe0, 0x3a, 0x76, 0x88, 0x40, 0xcf, +- 0x1a, 0x47, 0xb9, 0x86, 0x4c, 0xb9, 0x86, 0x7c, 0xc7, 0x35, 0xec, 0xd2, +- 0xef, 0xb8, 0x7e, 0xc0, 0x69, 0x5f, 0xe0, 0x3d, 0xd5, 0xac, 0xfa, 0x06, +- 0xab, 0xab, 0x27, 0xd8, 0x8b, 0x29, 0x79, 0x6e, 0xb1, 0x59, 0xcc, 0xb4, +- 0x3f, 0xaf, 0xf1, 0x75, 0xf1, 0x76, 0x9e, 0x5f, 0xf5, 0x13, 0x7b, 0x06, +- 0xf3, 0x4a, 0x70, 0x5e, 0x07, 0xe4, 0x75, 0xc9, 0xcf, 0x44, 0xe0, 0x03, +- 0xa6, 0x80, 0x73, 0xfa, 0xa1, 0x6f, 0x19, 0x1f, 0x45, 0x59, 0x95, 0x78, +- 0x85, 0xb6, 0x2e, 0x85, 0xbd, 0x42, 0x1d, 0x4c, 0x3c, 0xf2, 0x9a, 0xe4, +- 0xca, 0x81, 0x8e, 0x41, 0xff, 0x46, 0xd0, 0x3f, 0xf9, 0x9c, 0xb9, 0x76, +- 0xbb, 0xac, 0x58, 0xdb, 0xc5, 0xb6, 0x96, 0x64, 0x6d, 0x5d, 0xc7, 0x37, +- 0xe7, 0xbb, 0x7b, 0x6f, 0x78, 0x4d, 0x36, 0xc6, 0x37, 0x59, 0xfb, 0x49, +- 0x09, 0xde, 0x07, 0x6b, 0xbf, 0xe9, 0x3a, 0x14, 0x5e, 0x15, 0xae, 0x05, +- 0x79, 0x40, 0x3c, 0x1c, 0x95, 0x7f, 0x13, 0xe7, 0x7e, 0x2c, 0xa8, 0x33, +- 0xcd, 0xa4, 0xd1, 0xa3, 0x74, 0xc6, 0x90, 0xeb, 0xcb, 0x6b, 0x01, 0xe3, +- 0xc4, 0xba, 0xff, 0xd0, 0x1b, 0x8a, 0xc3, 0xcf, 0xed, 0xa6, 0x7e, 0x09, +- 0xf6, 0x74, 0xb3, 0xda, 0xd3, 0x9f, 0x77, 0x43, 0x52, 0x74, 0x42, 0x32, +- 0xe5, 0x1c, 0x52, 0x18, 0xff, 0xa3, 0xe8, 0xeb, 0x13, 0xba, 0xaf, 0x29, +- 0xe9, 0xd1, 0xfa, 0xe7, 0x20, 0xe4, 0xdc, 0x93, 0x7b, 0xdc, 0x9d, 0x72, +- 0x43, 0x1b, 0xf7, 0x40, 0x30, 0xff, 0x43, 0xd2, 0xbd, 0x73, 0xc5, 0x82, +- 0x67, 0x70, 0x6d, 0x74, 0x95, 0x07, 0xdc, 0x67, 0x81, 0x7c, 0xfb, 0x7c, +- 0xf0, 0xe7, 0xbf, 0x6e, 0xae, 0x7a, 0x9e, 0x9c, 0x33, 0xeb, 0x71, 0xae, +- 0x3e, 0x96, 0x5f, 0x9b, 0x6b, 0x50, 0xbf, 0x05, 0xb2, 0x64, 0x5b, 0x12, +- 0xaa, 0xe7, 0xcd, 0xaa, 0x8e, 0x1a, 0x61, 0x8c, 0x64, 0xc5, 0xb4, 0x53, +- 0x56, 0x28, 0x88, 0x45, 0xfb, 0x58, 0xb7, 0x0b, 0x38, 0xdc, 0xe9, 0xe9, +- 0x49, 0xe5, 0x55, 0x8c, 0xd4, 0x50, 0xf3, 0x9a, 0x02, 0x26, 0x5b, 0x74, +- 0x5f, 0xf5, 0x3e, 0x09, 0xcc, 0x3a, 0x21, 0x0f, 0x49, 0x78, 0x5d, 0x2c, +- 0x17, 0xf9, 0xb3, 0x8c, 0xe7, 0xda, 0x56, 0x06, 0x6b, 0xfc, 0x3b, 0xf0, +- 0xe1, 0x2b, 0xd0, 0xfb, 0x1f, 0xa3, 0x6d, 0x28, 0xc1, 0x5e, 0x00, 0x97, +- 0x7c, 0xf5, 0x8a, 0x18, 0x7e, 0xa2, 0x2e, 0x96, 0xeb, 0xe3, 0xd3, 0x73, +- 0x0a, 0x93, 0x12, 0xb7, 0x1f, 0x09, 0xdd, 0xd5, 0x1b, 0x86, 0x9f, 0x51, +- 0xf0, 0x62, 0x0e, 0x71, 0xdc, 0x21, 0xb9, 0x03, 0xeb, 0x73, 0x7a, 0xb1, +- 0x10, 0xda, 0x55, 0x0a, 0x64, 0x15, 0x7e, 0x65, 0xcd, 0x4e, 0x9d, 0x07, +- 0x3f, 0x9e, 0xd2, 0x98, 0x8f, 0xe7, 0x35, 0x15, 0xed, 0xb3, 0x30, 0x36, +- 0x54, 0xac, 0x1d, 0x92, 0x69, 0x97, 0xb1, 0x9d, 0x6e, 0x29, 0xc6, 0x33, +- 0x57, 0x37, 0xae, 0xf2, 0xc8, 0x36, 0xe1, 0xf3, 0xa5, 0xa8, 0xbf, 0x2b, +- 0xfa, 0xbc, 0xe3, 0x29, 0x25, 0x5f, 0x41, 0x5c, 0x98, 0xfe, 0x11, 0xcf, +- 0xab, 0xba, 0xcd, 0x11, 0x3e, 0x97, 0x29, 0x03, 0xca, 0x67, 0x02, 0x2f, +- 0xef, 0x90, 0xcc, 0x98, 0xa5, 0x70, 0xcb, 0x63, 0x25, 0xee, 0x17, 0xe2, +- 0xff, 0xd7, 0x81, 0xfd, 0x23, 0x58, 0x33, 0xfa, 0x01, 0x1c, 0x9b, 0xfb, +- 0x02, 0x65, 0x55, 0xf3, 0x97, 0xec, 0x8b, 0x0f, 0x6d, 0x23, 0xc6, 0x78, +- 0xa1, 0xf4, 0x98, 0xe2, 0xdf, 0x8a, 0x04, 0xb1, 0x73, 0x85, 0x05, 0x0b, +- 0xd9, 0x70, 0x48, 0x92, 0x73, 0xff, 0x16, 0x32, 0xd4, 0x0f, 0x1f, 0x89, +- 0xf5, 0x44, 0x9d, 0x5f, 0x0d, 0x01, 0x73, 0x19, 0xce, 0xbb, 0xa4, 0x68, +- 0x46, 0xa5, 0xa8, 0xee, 0xfe, 0xf1, 0x3c, 0x37, 0xac, 0x62, 0x3b, 0x45, +- 0x93, 0x98, 0x3f, 0xbd, 0x2d, 0xb8, 0xfb, 0x57, 0x34, 0xd9, 0x8e, 0x79, +- 0x96, 0x4f, 0x49, 0x74, 0xee, 0xa0, 0x34, 0xcc, 0x3d, 0x24, 0x8d, 0xc7, +- 0x88, 0xf1, 0x18, 0xbb, 0x37, 0x6e, 0x6d, 0x14, 0x62, 0xee, 0x6f, 0x61, +- 0xec, 0x43, 0xf2, 0x03, 0x37, 0xa0, 0xe9, 0xba, 0xad, 0xd2, 0xca, 0x3a, +- 0x41, 0x9e, 0xcf, 0xc4, 0x09, 0x3c, 0x17, 0x77, 0xfc, 0x18, 0xa9, 0x3a, +- 0x57, 0x41, 0x5a, 0xe1, 0xb9, 0x38, 0xdf, 0xbf, 0x66, 0xfa, 0xa9, 0x8f, +- 0xf7, 0x7d, 0xdf, 0x83, 0x6d, 0x52, 0x75, 0xd8, 0x62, 0xfd, 0xf7, 0xa1, +- 0x39, 0x94, 0xe7, 0xe7, 0x83, 0x3b, 0x3a, 0x06, 0x7c, 0x5f, 0xbb, 0x40, +- 0x9f, 0xc1, 0xe4, 0xb7, 0x98, 0xf3, 0x05, 0xf0, 0xf9, 0x1a, 0x75, 0xbf, +- 0x87, 0x77, 0x24, 0x50, 0xcf, 0xf2, 0x31, 0x1f, 0xf3, 0x09, 0xf0, 0xf9, +- 0xfd, 0x9d, 0x46, 0xfa, 0x7f, 0x5f, 0x9d, 0x1d, 0x20, 0xa6, 0xd8, 0xc6, +- 0xb3, 0x3f, 0x60, 0x55, 0xae, 0xed, 0x77, 0xb1, 0xb6, 0x8d, 0xea, 0xac, +- 0xa5, 0x58, 0xa2, 0x0f, 0x95, 0xc7, 0x9a, 0xf1, 0x9e, 0x1c, 0x7d, 0xad, +- 0xbc, 0x8e, 0x81, 0x92, 0x4e, 0xe2, 0xe8, 0x00, 0x93, 0xb3, 0xcf, 0xcd, +- 0xee, 0x03, 0x07, 0x7e, 0x12, 0xd7, 0x38, 0xa1, 0x68, 0x1e, 0xde, 0xe0, +- 0x23, 0x1c, 0xc6, 0xfe, 0x5b, 0x84, 0x0c, 0x4d, 0x42, 0xef, 0x0c, 0x85, +- 0xb9, 0x27, 0x9a, 0xb5, 0xff, 0xe8, 0xd0, 0x57, 0x0e, 0x8d, 0xa1, 0x0f, +- 0xe3, 0xd8, 0x1b, 0x32, 0x05, 0x9d, 0x3b, 0x5d, 0x4b, 0xaa, 0x6f, 0x78, +- 0x32, 0x09, 0xde, 0xdb, 0x62, 0xf9, 0x7f, 0x81, 0x8c, 0xbc, 0x01, 0x0c, +- 0xba, 0x05, 0xfc, 0x34, 0xf4, 0xbd, 0x90, 0x0f, 0xe8, 0xf8, 0x4f, 0x8c, +- 0xf1, 0x6f, 0xe8, 0xaa, 0xa2, 0x8f, 0xef, 0xe2, 0xd3, 0x48, 0xbf, 0xd0, +- 0xec, 0xcb, 0xc8, 0xcb, 0x7a, 0x8d, 0x9b, 0x50, 0xfe, 0xa8, 0x8a, 0xfb, +- 0xf9, 0x73, 0xb2, 0xb5, 0x7f, 0x10, 0xc5, 0x3a, 0x73, 0x5e, 0x5f, 0x41, +- 0x3d, 0xae, 0x6f, 0xaf, 0x3e, 0x0f, 0x6d, 0x56, 0x3a, 0x29, 0xe7, 0x5a, +- 0xf0, 0x75, 0x89, 0x89, 0x80, 0xa9, 0x5d, 0xb6, 0x7b, 0x76, 0x1b, 0xcf, +- 0x1b, 0x1b, 0x1c, 0x85, 0xe7, 0x3b, 0xc2, 0x12, 0x94, 0xdd, 0x8e, 0x32, +- 0xc6, 0x25, 0xde, 0x85, 0xb5, 0x61, 0x59, 0x16, 0x79, 0x8e, 0x75, 0xb5, +- 0x1e, 0x87, 0x63, 0x0c, 0xb7, 0xac, 0xa7, 0x89, 0x73, 0xe9, 0xd8, 0xf0, +- 0xfd, 0x00, 0xcb, 0xde, 0xa5, 0xcb, 0x22, 0x7a, 0x7e, 0xb7, 0xeb, 0x6f, +- 0x67, 0xed, 0x23, 0x99, 0x55, 0x3c, 0x4a, 0xfa, 0x62, 0xaa, 0x5d, 0xc6, +- 0xf4, 0x65, 0xe7, 0x30, 0xd6, 0x23, 0x92, 0xf6, 0xda, 0xb9, 0x47, 0x86, +- 0xc2, 0x81, 0x5f, 0x98, 0x50, 0xbe, 0x9e, 0x65, 0xf8, 0x77, 0x84, 0xce, +- 0x5d, 0x76, 0x0f, 0xda, 0xbf, 0x53, 0x3e, 0xdc, 0xdb, 0x24, 0x8b, 0xb3, +- 0x31, 0x7d, 0x3f, 0x31, 0xa1, 0xf6, 0x49, 0x7e, 0x9c, 0xf9, 0x1f, 0x6d, +- 0xe3, 0x77, 0xcb, 0x86, 0xc3, 0xf2, 0x0e, 0xcd, 0xdf, 0x77, 0xa9, 0xfb, +- 0x3c, 0xbc, 0x67, 0x52, 0x2c, 0xff, 0x44, 0xbd, 0x3f, 0x3d, 0xdf, 0xa0, +- 0xea, 0x9f, 0x9e, 0xdf, 0x78, 0x27, 0x87, 0x65, 0xef, 0x66, 0x4c, 0x41, +- 0x96, 0x66, 0x1a, 0x64, 0x79, 0xde, 0xa2, 0x8f, 0x94, 0x6e, 0x5c, 0xfb, +- 0xf6, 0x45, 0x7f, 0xa7, 0xe6, 0xc9, 0x30, 0xd6, 0x6f, 0x71, 0x70, 0x5a, +- 0x2a, 0x83, 0xf4, 0x01, 0xd4, 0xbd, 0x3b, 0xc8, 0x48, 0x03, 0xf0, 0x5f, +- 0xc1, 0xab, 0x38, 0x8c, 0xbd, 0xb6, 0x6a, 0x1f, 0xea, 0xc7, 0xda, 0xcf, +- 0x22, 0x8f, 0x0c, 0xc9, 0xf5, 0x4f, 0x29, 0xba, 0x2a, 0x8a, 0x57, 0xc1, +- 0xb7, 0x45, 0xec, 0x9f, 0xdf, 0x17, 0x85, 0x35, 0x7e, 0x7c, 0x50, 0xf3, +- 0xfc, 0xaf, 0x75, 0xfa, 0x88, 0xec, 0x3b, 0xfe, 0x19, 0xd0, 0xda, 0xe4, +- 0xdf, 0x2d, 0x92, 0xfa, 0xef, 0x36, 0x22, 0xea, 0xdb, 0x95, 0x88, 0xf3, +- 0x08, 0xca, 0x18, 0x7b, 0x7a, 0x44, 0xcd, 0x83, 0xf7, 0xd7, 0x0a, 0xf2, +- 0xab, 0xee, 0x64, 0x04, 0xfe, 0x0f, 0xef, 0x08, 0x35, 0xeb, 0xfe, 0x76, +- 0xe9, 0x75, 0x1c, 0x97, 0x7d, 0xd0, 0xef, 0x79, 0xe0, 0x40, 0xde, 0xab, +- 0x9a, 0x08, 0xd7, 0x8f, 0x19, 0xc8, 0xb2, 0xef, 0x5b, 0x07, 0x67, 0xfd, +- 0x61, 0xe5, 0x03, 0xac, 0xfa, 0xe9, 0xba, 0x7c, 0x5c, 0xf6, 0x97, 0x94, +- 0xbf, 0xae, 0xce, 0xe8, 0xa6, 0xb1, 0x27, 0x87, 0x94, 0x0e, 0x8f, 0x85, +- 0x86, 0xab, 0x69, 0xc9, 0x9f, 0xdc, 0x8d, 0x71, 0x18, 0xfb, 0xca, 0xe8, +- 0xb3, 0xb0, 0xbd, 0xb2, 0xaf, 0xe6, 0x8f, 0x3d, 0x59, 0xe2, 0xfb, 0x24, +- 0xec, 0x22, 0xdf, 0xe7, 0x12, 0x61, 0x15, 0xcd, 0xbf, 0x0e, 0x6d, 0x1b, +- 0x34, 0x6f, 0x79, 0x9f, 0x9e, 0xed, 0xb9, 0xff, 0x3e, 0x6e, 0x4a, 0x73, +- 0x0e, 0xef, 0xd9, 0x26, 0xe8, 0x6f, 0x12, 0x7a, 0x9a, 0xfe, 0xe8, 0xc3, +- 0xb2, 0x52, 0x9e, 0x96, 0xf3, 0xe5, 0x40, 0xce, 0x78, 0xb7, 0x99, 0xb4, +- 0xdf, 0xa9, 0xef, 0x36, 0x67, 0xb0, 0x0e, 0xeb, 0x79, 0x95, 0x5b, 0xf7, +- 0xfd, 0xd1, 0x5f, 0x98, 0xfe, 0x37, 0x80, 0xb7, 0xa9, 0x7b, 0x4a, 0xeb, +- 0xe5, 0x9d, 0xfd, 0x2c, 0x9b, 0x8c, 0xed, 0xfb, 0x77, 0xad, 0x3a, 0xea, +- 0xde, 0xc7, 0xf5, 0xfd, 0xa6, 0xe7, 0xf4, 0x9d, 0x78, 0xf2, 0x73, 0x4c, +- 0xd3, 0x7b, 0x1d, 0xf6, 0x1e, 0xfb, 0x7c, 0x54, 0xaf, 0x1b, 0xd2, 0x45, +- 0x3e, 0x53, 0x0f, 0xad, 0xe8, 0xf3, 0x4e, 0x53, 0x8f, 0x51, 0x7f, 0xbf, +- 0xac, 0xa1, 0x6e, 0x5c, 0xb6, 0xe7, 0xb7, 0x48, 0xc1, 0x5d, 0x6b, 0x96, +- 0x1d, 0xd7, 0xf7, 0xd8, 0x82, 0xbb, 0xd5, 0x2c, 0x0b, 0xee, 0x5b, 0x91, +- 0x5f, 0x8c, 0xe1, 0x21, 0xad, 0x8d, 0xe9, 0xe7, 0xb1, 0xba, 0x6f, 0x74, +- 0x82, 0x3e, 0x23, 0xe8, 0xe3, 0xf6, 0xf0, 0xe5, 0x77, 0xb1, 0xf9, 0xdd, +- 0x14, 0x65, 0xd1, 0xe0, 0x37, 0xdd, 0xf4, 0x7b, 0x80, 0x55, 0xb6, 0xca, +- 0xa4, 0xa2, 0xa7, 0xa0, 0xee, 0x27, 0x64, 0xdd, 0x26, 0x19, 0x32, 0xfd, +- 0xfc, 0xe4, 0xe2, 0x46, 0x39, 0x65, 0xf9, 0xf5, 0x31, 0x69, 0x2e, 0x60, +- 0x1c, 0xbe, 0xdf, 0xec, 0x1b, 0x81, 0xa8, 0xfe, 0x4e, 0xc9, 0x45, 0x9b, +- 0xcf, 0x53, 0xde, 0x0b, 0x85, 0xd5, 0xbb, 0x90, 0x05, 0x15, 0x97, 0x14, +- 0x23, 0xb8, 0x93, 0xc8, 0x6f, 0xd6, 0x45, 0x9e, 0xa9, 0xf2, 0xbb, 0xad, +- 0xdb, 0xd4, 0xbd, 0x11, 0xff, 0x2c, 0x8e, 0x74, 0x75, 0x2b, 0x9d, 0x5c, +- 0xa9, 0x16, 0xc9, 0x53, 0x1d, 0x87, 0x8d, 0xea, 0x38, 0x2c, 0x79, 0x3c, +- 0x02, 0x1e, 0xff, 0x3f, 0xbd, 0x2e, 0xc1, 0x77, 0x5f, 0x3c, 0xeb, 0xe1, +- 0x79, 0xd0, 0xa3, 0x6a, 0x2e, 0xd4, 0xd1, 0x68, 0xfb, 0xde, 0xb0, 0xda, +- 0xbb, 0xea, 0x9b, 0x78, 0xc8, 0x27, 0xbf, 0x71, 0x87, 0x7e, 0x2d, 0xf1, +- 0x5b, 0xf6, 0x11, 0xf5, 0x3d, 0x47, 0xa5, 0xca, 0x75, 0xe5, 0x37, 0xec, +- 0x63, 0x75, 0xf2, 0x18, 0xd6, 0x63, 0x6d, 0x69, 0x93, 0x66, 0x7f, 0xdd, +- 0xf9, 0x2d, 0x48, 0xa5, 0x1a, 0xdc, 0xa3, 0xdc, 0xb2, 0xc2, 0x3d, 0x21, +- 0xbe, 0x5f, 0xab, 0xbe, 0x67, 0xa9, 0xa8, 0xef, 0x43, 0x2c, 0x7e, 0x67, +- 0x09, 0xdb, 0xb1, 0x07, 0xcf, 0x3c, 0x47, 0xdd, 0x8b, 0x14, 0x3a, 0xa7, +- 0x3a, 0x81, 0xf4, 0x21, 0xc9, 0xa9, 0x38, 0x57, 0x0b, 0xf2, 0x93, 0x6a, +- 0xec, 0x62, 0xf5, 0x7e, 0xd9, 0x77, 0xf2, 0x01, 0x7e, 0x43, 0xa3, 0xbe, +- 0xc3, 0xcf, 0xba, 0xa4, 0x31, 0x2e, 0x53, 0x6a, 0xde, 0x85, 0xb5, 0x6f, +- 0x33, 0x7c, 0x39, 0x6a, 0xe3, 0x9a, 0x16, 0xaa, 0x2d, 0xa0, 0x31, 0xa4, +- 0xef, 0x52, 0x12, 0xff, 0x06, 0xf3, 0x6f, 0xe6, 0xfd, 0x3c, 0x8f, 0xe7, +- 0x65, 0xfb, 0x4a, 0xbc, 0x2b, 0x99, 0xd4, 0x7e, 0x31, 0x63, 0x65, 0x8c, +- 0xc7, 0x53, 0xc6, 0xed, 0xd4, 0x04, 0xb4, 0x7f, 0x54, 0x12, 0x3c, 0xcb, +- 0xd5, 0x73, 0x69, 0xa9, 0x9b, 0x0b, 0xef, 0x87, 0xfa, 0xf3, 0xe1, 0x37, +- 0x27, 0xf9, 0x52, 0xfd, 0xf7, 0x32, 0xea, 0x9b, 0x70, 0xf5, 0x7d, 0xca, +- 0x44, 0xf5, 0x41, 0xb9, 0xaf, 0xb4, 0x55, 0x7f, 0x2b, 0x13, 0x93, 0xfb, +- 0xaa, 0x6f, 0x28, 0x9e, 0xe6, 0xd5, 0x77, 0x3e, 0x51, 0xbd, 0x66, 0x71, +- 0xd5, 0xc7, 0xda, 0xf7, 0x3e, 0x76, 0xdd, 0xb7, 0x1f, 0x51, 0x99, 0x58, +- 0xfc, 0x65, 0xdf, 0xfc, 0x3c, 0x2c, 0xfc, 0xee, 0xe3, 0x25, 0x77, 0x5a, +- 0x1e, 0x2b, 0x7b, 0xde, 0x1d, 0x2e, 0xb1, 0xd4, 0x16, 0x39, 0x1f, 0xcf, +- 0x0c, 0x7e, 0xcf, 0x69, 0x0f, 0x55, 0x66, 0x1b, 0xa1, 0xaf, 0x1b, 0x95, +- 0x2d, 0x61, 0x7e, 0x71, 0x96, 0x7b, 0x3e, 0x82, 0x39, 0xda, 0xe6, 0x25, +- 0xf9, 0x54, 0x1b, 0xe3, 0x4c, 0x77, 0xc0, 0x77, 0xfb, 0xb8, 0xeb, 0xeb, +- 0xe5, 0xcf, 0x2d, 0xed, 0x96, 0xcf, 0x55, 0x63, 0xa1, 0xca, 0x0c, 0xef, +- 0xd7, 0xd9, 0x23, 0x65, 0x49, 0xa2, 0x1e, 0xfb, 0x87, 0xbc, 0x24, 0xb6, +- 0xcb, 0xd3, 0xc7, 0x7f, 0xee, 0x5d, 0x72, 0xf0, 0x1e, 0xba, 0xe6, 0xbc, +- 0x1b, 0xc4, 0xd2, 0xe0, 0x37, 0x1f, 0x65, 0xbd, 0xed, 0x90, 0x03, 0xd8, +- 0x6d, 0xec, 0x39, 0xfa, 0x75, 0x97, 0xb4, 0xde, 0x32, 0x8e, 0x5e, 0x23, +- 0x97, 0x56, 0xef, 0xe4, 0xbe, 0x0e, 0xd9, 0xb6, 0x7c, 0xfe, 0xab, 0xd8, +- 0xf3, 0x41, 0x09, 0x7f, 0x01, 0x76, 0xe2, 0x0b, 0x0d, 0x4a, 0xb7, 0xd3, +- 0x9e, 0x01, 0xf3, 0x03, 0xd7, 0x47, 0xd0, 0xcf, 0xfe, 0x36, 0x5f, 0x66, +- 0xa7, 0x45, 0xbe, 0xd8, 0x24, 0x99, 0x36, 0xfa, 0x8d, 0xf2, 0x2b, 0xf4, +- 0x57, 0xfd, 0x3e, 0x4b, 0xc9, 0x9f, 0x71, 0x8f, 0xd7, 0x38, 0x97, 0x64, +- 0xe2, 0x7f, 0xc9, 0x27, 0x65, 0x22, 0xc1, 0xb9, 0x3c, 0x2c, 0x85, 0xf2, +- 0xa3, 0xf8, 0x71, 0x9e, 0xa4, 0xfb, 0x5f, 0xe8, 0xb3, 0xfb, 0x31, 0x29, +- 0xce, 0xa4, 0x65, 0x6a, 0x7e, 0x92, 0xdf, 0xe4, 0x8e, 0xdc, 0xa1, 0xce, +- 0xb4, 0xec, 0x44, 0x32, 0xd4, 0x67, 0x4d, 0xf1, 0xae, 0x82, 0x9a, 0xcf, +- 0x24, 0xe6, 0xf3, 0x4a, 0x1b, 0xef, 0x78, 0x5f, 0x82, 0xfe, 0x35, 0x4e, +- 0x50, 0x0e, 0x6d, 0xb3, 0x2b, 0xc4, 0xfc, 0x5e, 0xf8, 0xab, 0x2c, 0xdb, +- 0x2b, 0xe1, 0xa3, 0xab, 0x7a, 0x1e, 0xe5, 0xfa, 0x6c, 0x55, 0xb5, 0xff, +- 0xaf, 0x68, 0x8b, 0x7a, 0x47, 0x83, 0xb6, 0x41, 0x1d, 0xb6, 0xe5, 0x3c, +- 0x77, 0xc3, 0x4f, 0x0e, 0xe8, 0x82, 0x1c, 0x26, 0xea, 0xf9, 0xdd, 0xbc, +- 0x81, 0xdf, 0x11, 0xe2, 0x4d, 0xf0, 0x8b, 0x3c, 0x0e, 0x6b, 0x1e, 0xff, +- 0x3d, 0xfa, 0x0f, 0xd6, 0xe0, 0x0e, 0x94, 0x99, 0xfa, 0x1b, 0xbc, 0x77, +- 0xc2, 0x77, 0xf2, 0x9c, 0xf5, 0xf7, 0xb7, 0xf9, 0xb2, 0x46, 0x7a, 0x36, +- 0xe3, 0xf9, 0x7b, 0xdb, 0xfd, 0x75, 0xd9, 0x0b, 0x7e, 0xf1, 0x1e, 0x65, +- 0x9f, 0xba, 0x8f, 0x9f, 0x19, 0xdf, 0x0b, 0xd9, 0x09, 0xe6, 0xd5, 0x07, +- 0x19, 0xe3, 0x39, 0x01, 0xeb, 0xd7, 0xf3, 0xc4, 0xb7, 0x7b, 0x61, 0xfa, +- 0xfa, 0x0e, 0xe7, 0x0a, 0x4c, 0xf8, 0x45, 0xf5, 0xfd, 0x0d, 0xf4, 0xe4, +- 0xbb, 0x57, 0xbf, 0xbf, 0xb9, 0xf2, 0x1a, 0x0f, 0xb4, 0xfb, 0x36, 0xca, +- 0x04, 0x4f, 0x5a, 0x75, 0x9b, 0xbd, 0xc0, 0xa7, 0x8c, 0x7f, 0x26, 0x13, +- 0x9f, 0x90, 0x60, 0x1c, 0xef, 0x36, 0xfa, 0x79, 0x43, 0x03, 0x7d, 0xf0, +- 0x69, 0xd5, 0x1d, 0x95, 0x04, 0xef, 0xbc, 0x24, 0x43, 0x7b, 0xd5, 0x7d, +- 0x85, 0x17, 0xd6, 0x7d, 0x43, 0x95, 0x92, 0xa7, 0xd7, 0x64, 0x65, 0xe4, +- 0x47, 0x62, 0x8b, 0x75, 0x35, 0x65, 0x85, 0xfd, 0x4e, 0x72, 0x9e, 0x89, +- 0x07, 0xd4, 0x3c, 0x4d, 0xf8, 0x4d, 0xbc, 0x5b, 0x60, 0x86, 0x2a, 0xf3, +- 0x5c, 0x77, 0xa4, 0x4b, 0x7c, 0x0e, 0xce, 0x37, 0x95, 0x5e, 0xc1, 0xb8, +- 0x2c, 0xa3, 0x6e, 0xe4, 0xfb, 0xb4, 0x3e, 0xff, 0xbc, 0xa7, 0x9d, 0x67, +- 0xf0, 0x79, 0x94, 0x95, 0x97, 0x36, 0xa7, 0xed, 0xe3, 0x4a, 0x0e, 0x1e, +- 0x06, 0xdf, 0xff, 0x04, 0x75, 0x1f, 0x45, 0xca, 0x39, 0xa6, 0x57, 0xd7, +- 0x9d, 0xfc, 0xfe, 0xb0, 0x0c, 0x42, 0x2e, 0x98, 0x7f, 0x58, 0x8a, 0xea, +- 0xee, 0x10, 0xd2, 0x32, 0x9f, 0xa9, 0xeb, 0x1d, 0x6d, 0x4f, 0x49, 0xcb, +- 0x5e, 0xfd, 0xdd, 0x56, 0x20, 0x4f, 0x7b, 0x74, 0xbb, 0xf1, 0x55, 0x5e, +- 0x3d, 0x70, 0x19, 0xde, 0x88, 0xae, 0xe2, 0x0d, 0x7f, 0xac, 0x62, 0x7b, +- 0x80, 0x35, 0xfc, 0x39, 0xf8, 0x58, 0xc3, 0x97, 0xf3, 0x49, 0x89, 0x40, +- 0x8e, 0xc3, 0x6b, 0x72, 0x0c, 0xdc, 0xe3, 0xef, 0x99, 0x29, 0x9e, 0xdb, +- 0x29, 0x3e, 0x53, 0x0e, 0x29, 0xbf, 0x5c, 0xc7, 0xfa, 0xb5, 0xbe, 0xf1, +- 0x97, 0xac, 0xf5, 0x85, 0xf6, 0x00, 0x3f, 0xfc, 0xd3, 0xf6, 0xc1, 0xd7, +- 0xda, 0xd7, 0xf6, 0xc1, 0x35, 0xbf, 0xa1, 0x7d, 0xb0, 0x51, 0x2e, 0xeb, +- 0x65, 0xca, 0x84, 0x3c, 0x71, 0xbd, 0x28, 0x4f, 0x94, 0x23, 0xf2, 0x92, +- 0xfa, 0xb4, 0x91, 0xbe, 0x53, 0xe2, 0xa2, 0xfa, 0x3e, 0x62, 0x1a, 0x3a, +- 0xa8, 0x3d, 0x54, 0x86, 0x5f, 0x5e, 0x5c, 0xba, 0x49, 0xc9, 0xf4, 0xd3, +- 0x35, 0xea, 0xa5, 0x2b, 0xcd, 0x7d, 0xbd, 0xce, 0xcd, 0x6f, 0xd0, 0xb9, +- 0xf9, 0x55, 0x9d, 0xdb, 0xa6, 0xfd, 0xa5, 0x7f, 0x8a, 0xce, 0x8d, 0xd7, +- 0x9d, 0x85, 0x04, 0xe7, 0x20, 0x12, 0xca, 0xf6, 0x36, 0xcb, 0xae, 0xd9, +- 0xb8, 0x8c, 0xcc, 0xec, 0x96, 0x3f, 0x9a, 0x99, 0x56, 0xf7, 0x82, 0xfe, +- 0xca, 0x4d, 0x26, 0xee, 0x0f, 0x79, 0xf2, 0x61, 0xf8, 0xbb, 0x13, 0x9d, +- 0x0d, 0xb2, 0xeb, 0xfd, 0xea, 0x7c, 0xcf, 0xcc, 0x86, 0x3a, 0x84, 0x91, +- 0xe7, 0x9c, 0x6b, 0xbb, 0x56, 0x88, 0x77, 0xc4, 0x1a, 0x65, 0x22, 0xde, +- 0x22, 0xbb, 0x81, 0x9d, 0x0a, 0x57, 0xb9, 0xea, 0x9b, 0xed, 0x8c, 0x3a, +- 0x3f, 0xe9, 0xde, 0xee, 0x8f, 0x0b, 0x3e, 0xb4, 0x9a, 0xf2, 0xe7, 0xb5, +- 0x6e, 0xf5, 0xfd, 0xf1, 0x0b, 0xa5, 0x3f, 0x6f, 0x5b, 0x9f, 0xe7, 0xf3, +- 0x7f, 0x42, 0x9d, 0x38, 0x78, 0x55, 0x7f, 0xdf, 0x26, 0xac, 0xf8, 0x59, +- 0x2c, 0x8f, 0xab, 0x7b, 0x4c, 0x17, 0xc3, 0xe4, 0x97, 0xf2, 0x9b, 0x12, +- 0xd9, 0x30, 0x30, 0xce, 0x2c, 0x90, 0xb4, 0x43, 0x9f, 0x4f, 0xe3, 0x4f, +- 0xe8, 0xff, 0x7d, 0xea, 0x3c, 0x75, 0x05, 0xbc, 0xf1, 0x54, 0xbc, 0x35, +- 0x1f, 0x27, 0xae, 0x5f, 0xbb, 0xb3, 0x7b, 0x39, 0xbe, 0xf7, 0xbf, 0xf1, +- 0xd2, 0xb1, 0x7f, 0x1d, 0x9f, 0xd1, 0x3e, 0xb8, 0x3a, 0xcb, 0xda, 0xec, +- 0xff, 0x50, 0xf8, 0xdf, 0xec, 0x67, 0x4b, 0xc4, 0x76, 0xf6, 0x91, 0xb2, +- 0xf4, 0x6f, 0x57, 0xb1, 0x26, 0xf2, 0xb7, 0x82, 0x75, 0x3a, 0x96, 0x08, +- 0xec, 0x79, 0xa8, 0xeb, 0x6c, 0xbd, 0x1f, 0xc8, 0x3e, 0x62, 0xea, 0x0e, +- 0xc4, 0xda, 0xff, 0xbd, 0x61, 0x4c, 0x25, 0x13, 0xba, 0xab, 0x34, 0x2d, +- 0xe1, 0xb9, 0x31, 0x89, 0x1c, 0x63, 0xfc, 0x3a, 0x23, 0xc5, 0xb8, 0x27, +- 0xf7, 0xb9, 0xeb, 0x7d, 0x93, 0x2e, 0x63, 0x23, 0xed, 0x0f, 0xcb, 0xd0, +- 0xc9, 0x47, 0x25, 0x3a, 0xc7, 0x77, 0xeb, 0xce, 0x2e, 0xa0, 0x8f, 0xb6, +- 0x48, 0x39, 0xce, 0x18, 0x6e, 0x54, 0x9d, 0x05, 0x9f, 0x1f, 0x5f, 0x90, +- 0x22, 0xb0, 0x42, 0x5e, 0xe9, 0x16, 0xa4, 0xab, 0xbe, 0xc4, 0xf4, 0x76, +- 0xee, 0x29, 0xf8, 0x98, 0xa1, 0x89, 0x72, 0x54, 0xdd, 0xc9, 0x39, 0x1f, +- 0x67, 0x5d, 0xf8, 0xef, 0x73, 0xc4, 0x19, 0xd0, 0x1d, 0x63, 0x12, 0x62, +- 0x3e, 0x3c, 0xb7, 0x86, 0x33, 0xa8, 0x13, 0x86, 0xdc, 0xb8, 0x44, 0x4e, +- 0xf9, 0x73, 0xe7, 0x3f, 0x52, 0x32, 0x16, 0x76, 0x4b, 0xf8, 0x18, 0x9f, +- 0xeb, 0xfd, 0x21, 0x62, 0x77, 0xd8, 0x86, 0xb3, 0x9f, 0x45, 0x7f, 0x7c, +- 0x97, 0xd1, 0xdf, 0xc2, 0x22, 0x5f, 0xf9, 0xc7, 0xfe, 0xcf, 0x04, 0xca, +- 0xfe, 0xff, 0x07, 0x3b, 0x97, 0x22, 0x9a, 0xb0, 0x4e, 0x00, 0x00, 0x00 }; ++ 0xcd, 0x7c, 0x7f, 0x70, 0x5b, 0xd7, 0x95, 0xde, 0x79, 0x0f, 0x00, 0x09, ++ 0x91, 0x14, 0xf5, 0x48, 0xc3, 0x0c, 0xec, 0x30, 0x09, 0x40, 0x3c, 0x92, ++ 0xb0, 0x49, 0x27, 0x4f, 0x5a, 0x46, 0xa1, 0xb3, 0xa8, 0x05, 0x03, 0xa4, ++ 0x4c, 0x27, 0xe2, 0x2c, 0xed, 0xb0, 0x5e, 0x4d, 0x57, 0x4d, 0x51, 0x50, ++ 0x72, 0x1c, 0x8f, 0x33, 0xd1, 0x4c, 0xdc, 0x56, 0x49, 0x1d, 0x0b, 0x02, ++ 0x29, 0x47, 0xf1, 0x42, 0x02, 0x23, 0x51, 0x92, 0xdb, 0xc9, 0x74, 0x11, ++ 0x90, 0x94, 0x9c, 0x04, 0x12, 0x24, 0xdb, 0x49, 0xbc, 0x49, 0x6c, 0x73, ++ 0x15, 0xc5, 0x76, 0x3c, 0xe9, 0x8e, 0x9d, 0x71, 0x3b, 0x9e, 0xae, 0xdb, ++ 0x6a, 0x14, 0xa7, 0x71, 0xd3, 0x6d, 0xeb, 0x26, 0xf9, 0xc3, 0xdd, 0x3a, ++ 0x79, 0xfd, 0xbe, 0xfb, 0xee, 0x03, 0x41, 0x9a, 0xb1, 0xb3, 0xbb, 0xd3, ++ 0x99, 0x72, 0x06, 0x73, 0xdf, 0xbd, 0xef, 0xfe, 0x3c, 0xe7, 0xdc, 0x73, ++ 0xbe, 0x73, 0xee, 0x7d, 0x1c, 0x13, 0x69, 0x13, 0xfd, 0xb7, 0x19, 0xbf, ++ 0x0f, 0x7f, 0xe6, 0xb3, 0x33, 0xce, 0x07, 0x9d, 0x0f, 0xe2, 0xf1, 0x53, ++ 0xa6, 0x48, 0x88, 0xe5, 0x01, 0xfc, 0x22, 0xf8, 0x6d, 0xd3, 0xcf, 0x1b, ++ 0xfd, 0x59, 0xf8, 0x6d, 0x37, 0x44, 0x72, 0xbf, 0xd0, 0x8d, 0x9a, 0xfe, ++ 0xc2, 0xbf, 0xa3, 0xcd, 0x3b, 0xfd, 0x99, 0xbf, 0x67, 0x3d, 0xeb, 0xef, ++ 0xd0, 0xf7, 0xbb, 0xfd, 0x05, 0x74, 0xb7, 0x9b, 0xf5, 0x4f, 0xc2, 0x66, ++ 0x4a, 0x26, 0x33, 0xb6, 0x84, 0x03, 0xa9, 0xb7, 0x26, 0x67, 0x6c, 0x91, ++ 0x74, 0x6d, 0x28, 0x96, 0x95, 0xdf, 0xb8, 0x85, 0x48, 0x50, 0x58, 0xfe, ++ 0xbe, 0xd4, 0x5b, 0x07, 0x9f, 0xfa, 0x48, 0xfc, 0x8d, 0x4a, 0x40, 0xc2, ++ 0x56, 0xca, 0x32, 0xac, 0x01, 0x09, 0xf7, 0xa2, 0xcd, 0x57, 0x07, 0x23, ++ 0xa6, 0x74, 0xfa, 0x7d, 0xbd, 0xee, 0x3e, 0x35, 0x18, 0x91, 0x67, 0xea, ++ 0x96, 0x5c, 0xa8, 0x87, 0x8d, 0xcc, 0x69, 0xd9, 0x9f, 0x75, 0x24, 0x66, ++ 0xda, 0xed, 0x92, 0xb7, 0x8c, 0x58, 0x3e, 0xf9, 0x21, 0x49, 0x47, 0xe2, ++ 0x1c, 0x39, 0x6d, 0xda, 0xfd, 0x28, 0x53, 0x93, 0xc9, 0x99, 0xf6, 0x00, ++ 0x9e, 0x59, 0xbe, 0x00, 0x5e, 0xa1, 0x7d, 0x59, 0x8c, 0xa9, 0xc1, 0x4d, ++ 0x62, 0x1e, 0xbf, 0x5e, 0xd2, 0x96, 0x21, 0x01, 0x9b, 0xf3, 0x8b, 0x49, ++ 0xa6, 0xd4, 0x83, 0x7c, 0x3c, 0x2a, 0x32, 0x14, 0xf2, 0xc6, 0x0c, 0x4b, ++ 0xe0, 0x94, 0x84, 0x5b, 0x52, 0x4f, 0x4f, 0x3e, 0xbb, 0x10, 0x95, 0xe0, ++ 0xb1, 0x98, 0x14, 0xcb, 0x1d, 0x12, 0x3a, 0x25, 0xbd, 0x01, 0xe9, 0x8f, ++ 0xde, 0x8d, 0x1a, 0x63, 0xb5, 0xa0, 0x8c, 0xd7, 0x0c, 0x09, 0xda, 0x61, ++ 0xac, 0xa9, 0x03, 0x3f, 0x0b, 0xbf, 0x08, 0x7e, 0x51, 0xfc, 0xa6, 0xd0, ++ 0x4f, 0xaf, 0x64, 0x6b, 0xec, 0xf3, 0x04, 0xc6, 0x8e, 0x5b, 0x39, 0x79, ++ 0x2a, 0xe0, 0xf5, 0xed, 0xe5, 0x45, 0x0e, 0x6d, 0xf1, 0xf2, 0x7c, 0xe6, ++ 0xdc, 0xb0, 0xb6, 0x72, 0x58, 0xae, 0x04, 0xa2, 0xf2, 0xd4, 0xe0, 0x15, ++ 0xac, 0x97, 0x6b, 0x8d, 0x62, 0xcd, 0x11, 0xb9, 0x58, 0xe7, 0xbc, 0xdb, ++ 0x25, 0x80, 0x79, 0x9b, 0x18, 0xaf, 0xeb, 0xd4, 0x9f, 0x48, 0x3e, 0x12, ++ 0x4f, 0x8a, 0x18, 0xd2, 0xb7, 0x0d, 0xe3, 0x6b, 0x56, 0x9a, 0xc7, 0x22, ++ 0x98, 0xf7, 0xa5, 0x2e, 0x13, 0x25, 0x26, 0xfa, 0xfd, 0x47, 0xf2, 0x57, ++ 0x18, 0xab, 0x20, 0xd9, 0x25, 0x7f, 0x9d, 0x49, 0x5d, 0xb7, 0xb1, 0x4e, ++ 0xd0, 0xb2, 0xc3, 0xc8, 0x9e, 0x8e, 0xc9, 0xe1, 0xf2, 0x2d, 0x92, 0x71, ++ 0x5c, 0x77, 0xc6, 0x11, 0x10, 0xbe, 0xdf, 0xca, 0xe2, 0x6d, 0xb5, 0x26, ++ 0x46, 0xa6, 0xec, 0xd3, 0x21, 0x88, 0x7c, 0x0f, 0xea, 0x76, 0x1a, 0x63, ++ 0xa7, 0x41, 0xfb, 0x14, 0x69, 0xe1, 0xba, 0x73, 0x4e, 0x7f, 0x74, 0x2f, ++ 0xe8, 0xb5, 0x58, 0xeb, 0x77, 0x2e, 0x89, 0x85, 0xfe, 0xba, 0x51, 0x87, ++ 0x74, 0x61, 0x3f, 0xec, 0x8f, 0x7d, 0x75, 0xa0, 0x6d, 0x04, 0xef, 0x5c, ++ 0x37, 0xe3, 0x58, 0x78, 0x8e, 0xa2, 0xdf, 0x08, 0xd2, 0x76, 0x23, 0x73, ++ 0xc2, 0xc5, 0xb8, 0x51, 0x3c, 0x7b, 0x34, 0x3b, 0x53, 0xe3, 0x5c, 0xd3, ++ 0x98, 0xab, 0xa1, 0xe4, 0xc3, 0xc0, 0x73, 0x5f, 0x8d, 0xf2, 0x33, 0x26, ++ 0x33, 0x25, 0x13, 0xeb, 0x0d, 0x8a, 0xbd, 0xcd, 0x90, 0x19, 0xf5, 0x6e, ++ 0x4c, 0x12, 0xa0, 0x77, 0xc1, 0x1a, 0x4a, 0x9a, 0xf2, 0xa4, 0x99, 0x01, ++ 0xfd, 0xb2, 0xc1, 0x18, 0xe8, 0xc0, 0x3e, 0x72, 0x4d, 0x7d, 0xe4, 0xd0, ++ 0xc7, 0xff, 0x01, 0x2d, 0x0c, 0x09, 0xd9, 0x3d, 0xa0, 0x11, 0x69, 0x57, ++ 0x30, 0x33, 0xf5, 0x20, 0xea, 0xce, 0x99, 0xd9, 0xb3, 0x47, 0xf0, 0x2c, ++ 0x96, 0x99, 0x7a, 0x92, 0x29, 0xda, 0xee, 0x69, 0x6a, 0xbb, 0x07, 0x6d, ++ 0xc1, 0x07, 0xcc, 0xf7, 0xa2, 0xe2, 0x51, 0xdc, 0xaa, 0x08, 0xf9, 0x14, ++ 0x7b, 0x07, 0x3e, 0x05, 0x34, 0x9f, 0x3e, 0x43, 0x3e, 0xc5, 0xde, 0x9d, ++ 0x4f, 0x19, 0x63, 0x2d, 0x9f, 0xfa, 0xff, 0x3f, 0xe1, 0x53, 0x44, 0x2a, ++ 0x58, 0x7b, 0xe5, 0x5d, 0x78, 0x63, 0x82, 0x0f, 0x99, 0x52, 0x50, 0x12, ++ 0xdb, 0xfc, 0xf2, 0x31, 0x94, 0x5f, 0x2f, 0x39, 0x8b, 0xfc, 0x7a, 0x37, ++ 0xbe, 0xfc, 0x0b, 0x83, 0x7c, 0x09, 0x7a, 0x7c, 0x89, 0xfd, 0xed, 0xf8, ++ 0x72, 0x00, 0x6d, 0xc9, 0x9b, 0x6b, 0xb8, 0x7f, 0xd1, 0x36, 0x68, 0x64, ++ 0xcb, 0xb1, 0x9c, 0x99, 0x8a, 0x60, 0xef, 0x41, 0xbf, 0x94, 0x7e, 0x6b, ++ 0x04, 0x6c, 0x37, 0x90, 0x71, 0xda, 0x25, 0xab, 0xf8, 0x40, 0x3a, 0xad, ++ 0x80, 0xee, 0x6f, 0xb9, 0x19, 0xf0, 0x27, 0x33, 0xec, 0x71, 0x20, 0x60, ++ 0xa7, 0x3f, 0x10, 0xa0, 0xbe, 0x48, 0x45, 0x3e, 0x8d, 0x3d, 0x8b, 0x7a, ++ 0x6b, 0xf9, 0x5d, 0x68, 0xf0, 0x5b, 0xd0, 0xbf, 0x18, 0xa6, 0x1d, 0x90, ++ 0xfc, 0xd4, 0xa5, 0xae, 0x80, 0xd2, 0x4d, 0x4c, 0x7d, 0x3e, 0x16, 0x24, ++ 0xbd, 0xc4, 0xba, 0x4a, 0x17, 0x49, 0xfe, 0x04, 0x9f, 0xb1, 0xa2, 0xba, ++ 0x5f, 0xd6, 0x78, 0x67, 0x50, 0x3e, 0x8a, 0x11, 0xd1, 0x3a, 0xf2, 0xad, ++ 0xa6, 0x75, 0xbd, 0x85, 0x75, 0xfd, 0x19, 0xd6, 0x15, 0x93, 0xaa, 0xc3, ++ 0x77, 0x73, 0x4d, 0xef, 0xe6, 0xf0, 0x8e, 0xe5, 0x94, 0x25, 0x4b, 0x16, ++ 0xd5, 0x7b, 0xc8, 0x46, 0xe3, 0x7d, 0xd8, 0xe8, 0xab, 0x79, 0x63, 0x72, ++ 0xac, 0x9c, 0xe5, 0xf7, 0x1f, 0x6c, 0xaa, 0x13, 0x6c, 0xaa, 0xa3, 0xf4, ++ 0x73, 0xd3, 0x3b, 0x69, 0x7a, 0xf7, 0xba, 0x92, 0xed, 0x67, 0x20, 0xd3, ++ 0x63, 0x83, 0x61, 0x99, 0x85, 0x5c, 0xe5, 0x9d, 0xf7, 0xaa, 0x95, 0xde, ++ 0xed, 0x78, 0x3c, 0xbd, 0x35, 0xc8, 0xfd, 0xb4, 0x11, 0x4f, 0xff, 0x1b, ++ 0xe6, 0x8f, 0xb6, 0x65, 0xe8, 0x4d, 0xe8, 0xd6, 0xd9, 0x85, 0xd5, 0xfd, ++ 0x56, 0x2c, 0xfd, 0x3e, 0x7c, 0xf5, 0xdb, 0xb7, 0xc8, 0x8a, 0x15, 0x4f, ++ 0xe6, 0x40, 0xaf, 0xb1, 0x72, 0xd9, 0xf0, 0xf6, 0xc2, 0x2f, 0x0c, 0x6f, ++ 0x1f, 0x83, 0x7e, 0x65, 0xf2, 0xbb, 0x55, 0xb2, 0x53, 0xec, 0xbf, 0xb9, ++ 0x0e, 0xd6, 0x8b, 0xf9, 0x15, 0xeb, 0x2c, 0x67, 0x3f, 0xfe, 0x9e, 0xa5, ++ 0x6e, 0xe5, 0x78, 0x47, 0x30, 0x1e, 0x78, 0x39, 0xd8, 0x21, 0xfb, 0x16, ++ 0xfc, 0x71, 0x8f, 0xa8, 0x7d, 0xbe, 0xb7, 0x14, 0xb7, 0xc6, 0xc1, 0xd0, ++ 0xf1, 0xf9, 0x51, 0x19, 0xab, 0xf7, 0x4a, 0xbe, 0xf4, 0xa6, 0x0b, 0x3b, ++ 0xf1, 0xc1, 0x90, 0xd8, 0xd8, 0x1f, 0x90, 0xa9, 0x91, 0x94, 0x64, 0xea, ++ 0x21, 0x31, 0x53, 0x0e, 0xd2, 0x66, 0xdb, 0x17, 0x0c, 0x8e, 0xaf, 0xc9, ++ 0xb7, 0xa0, 0x0e, 0xfa, 0x1e, 0x59, 0x5f, 0x4f, 0x24, 0x03, 0xb9, 0xca, ++ 0x38, 0xbf, 0x71, 0xd3, 0x96, 0x2f, 0x13, 0x2c, 0xa5, 0x2e, 0x89, 0xca, ++ 0x63, 0x75, 0x2b, 0x17, 0x48, 0xf5, 0x6a, 0x7d, 0x42, 0xdd, 0x22, 0x53, ++ 0x7b, 0x4b, 0x07, 0x5d, 0xd3, 0x96, 0xc2, 0xf5, 0x29, 0x3b, 0x56, 0x94, ++ 0x8e, 0xd1, 0xb9, 0x91, 0x8f, 0x40, 0xbf, 0xa0, 0x1c, 0x7b, 0xaf, 0x3b, ++ 0x35, 0x3a, 0x79, 0xe7, 0x00, 0x64, 0xb9, 0x5e, 0xe8, 0x30, 0x6d, 0x1b, ++ 0x69, 0xb8, 0xf0, 0xde, 0x14, 0x75, 0xc1, 0x70, 0xcb, 0xb3, 0x76, 0xdc, ++ 0x4a, 0x9b, 0xbd, 0xd8, 0x5b, 0xd8, 0xff, 0xb0, 0xbd, 0x3b, 0x6b, 0xbf, ++ 0x71, 0x0f, 0x05, 0x3d, 0xbb, 0x6b, 0xa6, 0xee, 0x33, 0xf4, 0x1e, 0x9e, ++ 0xf4, 0xf6, 0x70, 0x30, 0xa8, 0xf7, 0xae, 0xce, 0x3f, 0xd9, 0xaa, 0xe9, ++ 0xa2, 0xf3, 0x7b, 0x4c, 0xcf, 0x8e, 0x8f, 0xb4, 0x50, 0xf7, 0x06, 0x53, ++ 0x57, 0x5a, 0xd0, 0x67, 0x38, 0x94, 0x9a, 0xfa, 0xc3, 0x65, 0x55, 0xaf, ++ 0xa2, 0xeb, 0xfd, 0x3a, 0xa4, 0x65, 0x75, 0x72, 0xa0, 0xc6, 0x74, 0x61, ++ 0xb2, 0x5f, 0xa5, 0x5f, 0x9d, 0x4c, 0xa8, 0x74, 0x69, 0xd2, 0x56, 0xe9, ++ 0xa3, 0xaa, 0xbe, 0x91, 0x4a, 0xe9, 0xf2, 0x89, 0xc9, 0x98, 0x4a, 0x77, ++ 0xe9, 0x74, 0x4a, 0xa7, 0xd3, 0x3a, 0xdd, 0xad, 0xd3, 0x3d, 0x3a, 0xcd, ++ 0xe9, 0x74, 0xaf, 0xee, 0xef, 0x1e, 0x9d, 0xbf, 0x4f, 0xa7, 0xfb, 0x75, ++ 0x7a, 0xbf, 0x4e, 0x0f, 0xe8, 0xf4, 0x01, 0x3d, 0xaf, 0x82, 0x4e, 0x4b, ++ 0xba, 0x7c, 0x5e, 0xcf, 0xf3, 0x11, 0xcc, 0xe7, 0x7b, 0x2d, 0x9e, 0x1c, ++ 0x41, 0x68, 0x53, 0xfb, 0xc1, 0x43, 0xf0, 0xac, 0x14, 0x81, 0x3c, 0x71, ++ 0xfd, 0x31, 0xd8, 0xa1, 0x20, 0x65, 0x4f, 0xb2, 0x16, 0xdf, 0xff, 0x2a, ++ 0x28, 0x9d, 0x41, 0x99, 0xad, 0x7b, 0x75, 0x77, 0x8e, 0xb0, 0x4e, 0x05, ++ 0x75, 0x48, 0x8b, 0x25, 0xa5, 0x17, 0xb3, 0x56, 0x44, 0xe6, 0xca, 0x6a, ++ 0xed, 0xb0, 0x57, 0xff, 0x46, 0xb2, 0x67, 0x45, 0x5e, 0x28, 0xb1, 0xde, ++ 0xf7, 0x75, 0xbd, 0x27, 0x51, 0x2f, 0x11, 0x1b, 0x33, 0xe2, 0xd0, 0xd1, ++ 0xf1, 0x34, 0xf4, 0x7e, 0x0c, 0xa9, 0x35, 0x81, 0xdf, 0x18, 0x95, 0x3f, ++ 0xea, 0x79, 0x34, 0x7a, 0x92, 0xfa, 0x56, 0xee, 0x80, 0xcc, 0xf7, 0x6d, ++ 0x7b, 0x15, 0xf2, 0x13, 0x91, 0x87, 0x21, 0x5b, 0xcf, 0x96, 0xc8, 0x87, ++ 0xef, 0xcb, 0x72, 0x89, 0x7c, 0x79, 0x52, 0xe6, 0x4a, 0x09, 0xe7, 0x05, ++ 0x89, 0x27, 0xcf, 0x28, 0x6c, 0x31, 0xe4, 0x20, 0x85, 0xdc, 0xc4, 0x63, ++ 0x0f, 0xc1, 0x0e, 0x0d, 0x6e, 0xf3, 0xfa, 0xeb, 0xd7, 0xfd, 0xd9, 0xb5, ++ 0x0f, 0xc8, 0x15, 0xa5, 0xa7, 0xa9, 0x1b, 0x61, 0x7b, 0xea, 0xdc, 0x3b, ++ 0x8f, 0x22, 0xa5, 0x6d, 0x3e, 0x82, 0xfd, 0xe4, 0xca, 0x94, 0xf3, 0x3e, ++ 0x31, 0x3f, 0x18, 0x94, 0xf4, 0x74, 0x01, 0x5a, 0xe7, 0x4f, 0x51, 0xf6, ++ 0x43, 0xd3, 0xc3, 0xbe, 0x71, 0xeb, 0x4e, 0xca, 0x73, 0x69, 0xd3, 0x9b, ++ 0x69, 0x45, 0xae, 0x10, 0xed, 0x56, 0x9a, 0xfa, 0x66, 0x55, 0x0f, 0x33, ++ 0x3f, 0x6a, 0x78, 0xfb, 0x7c, 0xa4, 0x69, 0x9f, 0x8f, 0x60, 0x2d, 0x1c, ++ 0xb7, 0x13, 0x6d, 0x82, 0x48, 0xd3, 0x18, 0x97, 0xe3, 0x71, 0x0e, 0x1f, ++ 0xd7, 0x58, 0x89, 0x6d, 0x0f, 0xe8, 0xb6, 0xa3, 0x4d, 0x6d, 0x47, 0xd1, ++ 0x96, 0x6d, 0x1e, 0x01, 0x0d, 0x48, 0xf7, 0x42, 0x53, 0xdb, 0x02, 0x75, ++ 0xf4, 0x16, 0xd3, 0x0e, 0xc1, 0xf6, 0xb2, 0x8b, 0x23, 0x78, 0xf7, 0x55, ++ 0xc9, 0x9c, 0xfd, 0x1b, 0xce, 0x19, 0xfd, 0x51, 0x2f, 0x4f, 0x41, 0xe7, ++ 0x13, 0x77, 0xc0, 0x2e, 0x45, 0x58, 0x76, 0x93, 0x1e, 0x8f, 0x6b, 0x64, ++ 0x7e, 0x73, 0xe7, 0xea, 0xf8, 0x4f, 0xea, 0xf1, 0x53, 0x4d, 0xe3, 0xa7, ++ 0x30, 0xfe, 0x17, 0xd8, 0x1f, 0xc6, 0x96, 0x79, 0x6f, 0x9f, 0xf7, 0x83, ++ 0xc6, 0x31, 0xe8, 0x0c, 0xcc, 0xa1, 0xfc, 0x5b, 0x37, 0x1d, 0xf4, 0x74, ++ 0xb0, 0xd6, 0xb3, 0x85, 0xd5, 0x3a, 0x9e, 0x2d, 0x19, 0xab, 0x5f, 0x51, ++ 0x98, 0xd6, 0xdb, 0xe3, 0xf1, 0x23, 0x05, 0xda, 0x9c, 0xba, 0x19, 0x20, ++ 0xbd, 0x2f, 0x38, 0x5f, 0xc4, 0x1c, 0xe3, 0xb1, 0x98, 0xd9, 0x5f, 0x30, ++ 0xcd, 0x2f, 0xca, 0xfe, 0xc5, 0xfb, 0x65, 0x7f, 0x99, 0x7d, 0xb4, 0xe3, ++ 0xbd, 0x8d, 0xb2, 0x4d, 0x22, 0x3d, 0xb4, 0x51, 0x6f, 0x1a, 0xde, 0x58, ++ 0x26, 0xf4, 0xc1, 0x8a, 0x71, 0x47, 0xfd, 0xb2, 0x91, 0x59, 0xa4, 0x5e, ++ 0x45, 0x79, 0xbd, 0xd9, 0x86, 0xf9, 0xf6, 0xcb, 0xd7, 0xe9, 0x73, 0xc4, ++ 0xd0, 0x66, 0xc6, 0x09, 0x69, 0xbb, 0x99, 0xb1, 0xbc, 0xf5, 0xde, 0x1a, ++ 0xf0, 0x6c, 0x31, 0x69, 0xb6, 0x49, 0xd2, 0x41, 0xea, 0x4e, 0x3e, 0x8b, ++ 0x1b, 0x48, 0x51, 0xff, 0x49, 0x30, 0x90, 0x0a, 0x80, 0x66, 0xac, 0x73, ++ 0x0b, 0xe6, 0xe8, 0xe9, 0xd6, 0x42, 0x43, 0xb7, 0x1a, 0x98, 0x47, 0x9f, ++ 0xe4, 0x16, 0x7b, 0x24, 0x7f, 0x36, 0x0d, 0x7d, 0x6c, 0x05, 0x3c, 0x5d, ++ 0xdd, 0x8c, 0xdf, 0x49, 0x7f, 0x57, 0xc6, 0x9c, 0x98, 0xcc, 0x8e, 0x3a, ++ 0x52, 0x1c, 0x1d, 0x8a, 0x06, 0x64, 0x08, 0x12, 0x68, 0x47, 0xf3, 0xf0, ++ 0x1f, 0x72, 0xd6, 0x14, 0xfa, 0xc8, 0xc3, 0x36, 0x12, 0x13, 0x4f, 0x68, ++ 0x7c, 0xe8, 0xba, 0x59, 0xf2, 0x73, 0x78, 0x8f, 0x50, 0xe6, 0x9f, 0x29, ++ 0x17, 0xd0, 0x31, 0xf7, 0xcf, 0xf3, 0xbb, 0x66, 0xa0, 0xe3, 0xb2, 0x4a, ++ 0x06, 0x61, 0x13, 0x3d, 0x74, 0x05, 0x1a, 0x71, 0xec, 0x0e, 0xd0, 0x6c, ++ 0x0c, 0x73, 0x07, 0x6d, 0x7a, 0x38, 0xaf, 0x0e, 0xc9, 0xd7, 0xdb, 0xf5, ++ 0x3b, 0x96, 0x07, 0x65, 0x2a, 0xe2, 0xe3, 0xee, 0x27, 0xb7, 0x10, 0x47, ++ 0x3c, 0x05, 0x7b, 0x90, 0x2f, 0x3f, 0x1e, 0xf0, 0x64, 0xdb, 0x92, 0xfc, ++ 0xe9, 0x31, 0xc8, 0x12, 0xb1, 0xd0, 0x26, 0x2d, 0x4b, 0xec, 0xc7, 0x52, ++ 0x6b, 0x03, 0x4d, 0xb4, 0x0d, 0x1b, 0x45, 0xfa, 0xdd, 0x80, 0xe7, 0x5f, ++ 0xb0, 0x8d, 0xdf, 0xde, 0x9f, 0x47, 0x77, 0xa3, 0x9f, 0x29, 0x07, 0x58, ++ 0x43, 0xcd, 0x05, 0x65, 0x67, 0xd7, 0xce, 0xc5, 0xec, 0xf1, 0xe7, 0x02, ++ 0xeb, 0xa3, 0xe6, 0xd2, 0xdd, 0xd4, 0x57, 0xa4, 0x69, 0x2e, 0x2d, 0x98, ++ 0x0b, 0xeb, 0x7a, 0x73, 0xb9, 0x00, 0x1e, 0xe7, 0xcf, 0x5e, 0xed, 0xf6, ++ 0xda, 0x44, 0x9a, 0xda, 0xf4, 0xac, 0x6b, 0xc3, 0xfa, 0xfe, 0x18, 0xe4, ++ 0xcf, 0x37, 0xdb, 0xbd, 0x36, 0xac, 0xd7, 0x02, 0xff, 0x49, 0xf9, 0x47, ++ 0x61, 0xa5, 0xef, 0x1a, 0x72, 0xbe, 0x1f, 0x72, 0xde, 0xec, 0x97, 0xac, ++ 0xe1, 0xa3, 0x31, 0x55, 0x26, 0x2f, 0x37, 0x19, 0x59, 0xc5, 0xcf, 0x0f, ++ 0xa0, 0xff, 0x65, 0xf8, 0x5b, 0x31, 0xc9, 0x27, 0xe1, 0x03, 0x59, 0xa3, ++ 0xc8, 0xb7, 0xe1, 0x19, 0xbe, 0x91, 0xd5, 0xae, 0xf0, 0x70, 0x3e, 0x39, ++ 0xac, 0x71, 0xed, 0xcf, 0x24, 0x07, 0x99, 0xcd, 0x27, 0xe1, 0x8f, 0x44, ++ 0x60, 0x27, 0x95, 0x9f, 0xc6, 0xf1, 0xbf, 0x13, 0xa4, 0xdd, 0xbf, 0x50, ++ 0xfe, 0x24, 0xf2, 0xf0, 0xed, 0x92, 0xaf, 0xea, 0x79, 0x75, 0xa2, 0xce, ++ 0xe7, 0x50, 0xc6, 0x77, 0xac, 0xc3, 0x3e, 0x56, 0x90, 0xbf, 0x19, 0x75, ++ 0xb0, 0xa9, 0x21, 0x81, 0xa6, 0xbd, 0x1d, 0xbf, 0x17, 0x50, 0xf6, 0x11, ++ 0x94, 0x3d, 0x81, 0xb2, 0x0f, 0x23, 0xff, 0x17, 0xeb, 0xfa, 0x1d, 0x42, ++ 0xfe, 0x10, 0xde, 0x63, 0xbd, 0xd6, 0xf3, 0x78, 0x7f, 0x33, 0x7e, 0x4f, ++ 0xac, 0xab, 0xf3, 0xaf, 0xd6, 0xe5, 0x7d, 0x4c, 0xfe, 0xe7, 0x5a, 0xf6, ++ 0x7c, 0x4c, 0xee, 0xe9, 0xcb, 0xd9, 0x72, 0x87, 0x31, 0x7e, 0x3a, 0x6c, ++ 0xec, 0x3c, 0x0d, 0x5a, 0xd4, 0x82, 0x0a, 0x87, 0x07, 0x81, 0xc3, 0xe7, ++ 0x16, 0x64, 0x38, 0x04, 0x7d, 0x92, 0x57, 0xbe, 0x8e, 0x8c, 0xb4, 0x48, ++ 0xbf, 0x73, 0x19, 0xfb, 0x24, 0x5f, 0xeb, 0x45, 0x9e, 0xfb, 0x07, 0xb2, ++ 0x56, 0x6b, 0x83, 0x7c, 0xf7, 0x27, 0xab, 0x90, 0xb5, 0x7d, 0xc0, 0xda, ++ 0x39, 0xe0, 0x8f, 0x5c, 0xad, 0x57, 0xee, 0xae, 0x1d, 0x0d, 0x6a, 0x7f, ++ 0x55, 0x8f, 0xfd, 0xaf, 0xd7, 0x8d, 0x1d, 0x26, 0xb6, 0x87, 0xfc, 0x3f, ++ 0x3d, 0x39, 0xb3, 0xc0, 0xf1, 0xcd, 0x3e, 0x18, 0x21, 0xcc, 0x81, 0x7e, ++ 0xaa, 0x0c, 0x04, 0xa5, 0x3f, 0x36, 0x2b, 0x1c, 0xbf, 0x20, 0x81, 0x54, ++ 0x3f, 0xec, 0x80, 0xca, 0xc3, 0x2f, 0x85, 0x7e, 0xab, 0xad, 0xfa, 0xab, ++ 0xe3, 0x0d, 0x7f, 0xb5, 0x17, 0xfe, 0x2c, 0x0c, 0x95, 0xda, 0xfb, 0x1d, ++ 0xd0, 0x0d, 0xd7, 0x82, 0xee, 0x9e, 0x3e, 0xe7, 0x1e, 0xcf, 0x38, 0x5d, ++ 0x3a, 0x4f, 0x99, 0x86, 0xbe, 0x30, 0x43, 0x4a, 0x3f, 0x89, 0x89, 0x77, ++ 0x23, 0x94, 0x63, 0xe4, 0x17, 0x29, 0x0b, 0x31, 0xad, 0x57, 0x3f, 0x03, ++ 0x9b, 0xc7, 0xf7, 0xbe, 0xbc, 0xed, 0xb6, 0x3c, 0x59, 0x23, 0x5e, 0xfe, ++ 0xf6, 0xba, 0xb5, 0xcd, 0xac, 0x5b, 0x5b, 0xb0, 0x41, 0x57, 0xae, 0x31, ++ 0x84, 0x35, 0x2e, 0x2f, 0x90, 0xb6, 0xc3, 0x90, 0x53, 0xb1, 0x83, 0x42, ++ 0x79, 0xa6, 0x1e, 0xed, 0x84, 0x6e, 0x26, 0xed, 0x82, 0xb2, 0x17, 0x6b, ++ 0xca, 0x61, 0x4d, 0x39, 0xac, 0x29, 0xd7, 0x44, 0xc7, 0x7d, 0x8d, 0x35, ++ 0xf9, 0xf3, 0x46, 0x3d, 0xb5, 0xef, 0xf8, 0xac, 0xe6, 0x8f, 0x67, 0x1f, ++ 0xc3, 0x72, 0x2e, 0xe9, 0x75, 0x73, 0x21, 0x2d, 0x38, 0x97, 0xc6, 0x3c, ++ 0x22, 0x8c, 0xae, 0xec, 0xaf, 0x91, 0xaf, 0x1c, 0x73, 0x97, 0xec, 0x2d, ++ 0x7f, 0x40, 0xcf, 0xa3, 0x03, 0xf3, 0x98, 0x82, 0xfe, 0xe0, 0x78, 0xd0, ++ 0x03, 0xb5, 0x69, 0x3c, 0x47, 0xc8, 0x7f, 0x3d, 0x17, 0x9f, 0x16, 0xf0, ++ 0xa5, 0x14, 0x2d, 0x30, 0xbc, 0xdd, 0x2f, 0xc5, 0x29, 0x96, 0x55, 0xb7, ++ 0x78, 0x73, 0x8a, 0xe9, 0xf1, 0x3d, 0xda, 0xc2, 0xf7, 0x20, 0x7e, 0xd5, ++ 0xfa, 0xa0, 0x99, 0x9e, 0xd1, 0x16, 0xad, 0xaf, 0xc0, 0xfb, 0xe6, 0xf2, ++ 0xd1, 0x96, 0xd5, 0xba, 0xcc, 0xff, 0x63, 0x9d, 0xdf, 0x6c, 0x8c, 0x9f, ++ 0xf0, 0xcb, 0xce, 0xb6, 0xbc, 0xbd, 0xbf, 0xd9, 0x16, 0x5f, 0x7f, 0xac, ++ 0x8d, 0x43, 0x1c, 0x30, 0x57, 0xed, 0x4b, 0x41, 0xe6, 0x46, 0xd2, 0xe6, ++ 0x58, 0x7d, 0xcc, 0xf4, 0x6c, 0x0c, 0xeb, 0x1c, 0x50, 0xf8, 0x3d, 0x98, ++ 0x7a, 0x81, 0xf2, 0x0e, 0x1a, 0xbe, 0x3c, 0x99, 0x29, 0xb9, 0xee, 0xac, ++ 0xb3, 0x02, 0x9d, 0x4e, 0xbd, 0x4c, 0xac, 0xcc, 0xf2, 0x17, 0x51, 0x0e, ++ 0xfb, 0x5d, 0x87, 0x6e, 0x47, 0xbb, 0x8d, 0x31, 0x71, 0x4c, 0x63, 0x62, ++ 0x0f, 0x4c, 0x67, 0x14, 0x5e, 0x5a, 0x01, 0x46, 0x0c, 0xea, 0xe7, 0xcb, ++ 0x93, 0xf4, 0x7d, 0x9a, 0x70, 0x37, 0xfa, 0x7d, 0x7e, 0x32, 0xb3, 0xc0, ++ 0x7d, 0xf0, 0x63, 0xec, 0x03, 0xf2, 0xe8, 0x2f, 0xc1, 0x23, 0x43, 0xe6, ++ 0x94, 0x4d, 0xe0, 0x3c, 0xd8, 0xee, 0xf9, 0xc9, 0xbe, 0x25, 0xa6, 0x2f, ++ 0x4c, 0xda, 0x4b, 0x01, 0xd9, 0xa7, 0x7d, 0x2e, 0xe6, 0x63, 0x4b, 0xbe, ++ 0x7d, 0x6e, 0x93, 0x50, 0x8a, 0xba, 0x2d, 0x9e, 0x84, 0xf6, 0xc5, 0x7a, ++ 0x2e, 0x4c, 0xce, 0xd9, 0xb4, 0x93, 0xdf, 0x82, 0x1c, 0xb4, 0x49, 0x8b, ++ 0x92, 0x8f, 0xc7, 0xf4, 0x58, 0x7f, 0x89, 0xb1, 0xb6, 0x60, 0xae, 0x01, ++ 0xe8, 0xc8, 0x60, 0x14, 0xe3, 0x1c, 0x34, 0xed, 0x21, 0x8c, 0x47, 0x5f, ++ 0xb2, 0x17, 0x38, 0x50, 0xf9, 0x84, 0x41, 0xad, 0x23, 0xd0, 0xee, 0xbb, ++ 0x68, 0x47, 0x3b, 0x49, 0x7a, 0x72, 0xbc, 0x2a, 0xb0, 0x48, 0x1b, 0xd6, ++ 0x11, 0xb7, 0x32, 0x81, 0x16, 0xc9, 0x2e, 0xf8, 0x75, 0x38, 0xa7, 0x6f, ++ 0x4f, 0x26, 0x96, 0x12, 0xe8, 0xab, 0x97, 0x32, 0x07, 0x59, 0x0b, 0xe0, ++ 0xc7, 0xbe, 0xd9, 0x0e, 0x3a, 0x79, 0xd4, 0xb7, 0xdf, 0xab, 0xed, 0xfd, ++ 0x76, 0x7d, 0x4b, 0x5b, 0xb4, 0xcc, 0xfe, 0x6f, 0x37, 0x3d, 0xcd, 0xf7, ++ 0x1c, 0xb3, 0x59, 0x6f, 0xb3, 0x9d, 0x5f, 0x27, 0xa0, 0xf5, 0xf0, 0xfb, ++ 0x42, 0xab, 0xf3, 0x5c, 0x01, 0x8f, 0xd8, 0x46, 0x82, 0xd9, 0xc1, 0x51, ++ 0xcd, 0xb7, 0xcb, 0x28, 0xf3, 0x64, 0x75, 0xb6, 0xde, 0xec, 0xf7, 0x78, ++ 0xfd, 0x16, 0x80, 0x31, 0x8a, 0xf0, 0xd1, 0x02, 0xa9, 0x74, 0x97, 0x17, ++ 0x8b, 0x78, 0x27, 0x5f, 0x07, 0x3c, 0x45, 0x3f, 0xc5, 0x46, 0x5b, 0xfa, ++ 0x28, 0x97, 0x27, 0x9f, 0x45, 0xff, 0x87, 0xcb, 0xde, 0x1e, 0xf3, 0xe8, ++ 0x40, 0x5c, 0x64, 0xc8, 0xb2, 0x0d, 0x9c, 0x6d, 0xd3, 0x0e, 0xc5, 0xe4, ++ 0x39, 0xdb, 0xc7, 0x49, 0xc4, 0x48, 0xa8, 0x5f, 0xe7, 0x7c, 0xb8, 0xee, ++ 0xef, 0x62, 0xdd, 0xae, 0xcc, 0x3b, 0x9e, 0x7c, 0x0c, 0x62, 0x4f, 0xfe, ++ 0x45, 0x30, 0x7e, 0x84, 0xbe, 0xd7, 0x95, 0x60, 0xf3, 0xba, 0x7c, 0x7b, ++ 0xb6, 0xa2, 0x7d, 0x94, 0xef, 0x6a, 0x5e, 0x3e, 0x0f, 0x5e, 0x0e, 0xc5, ++ 0x2c, 0x19, 0xc0, 0xdc, 0x51, 0x67, 0xb8, 0x1f, 0x78, 0x1b, 0x3a, 0x32, ++ 0x12, 0xc5, 0x7c, 0x2c, 0xc8, 0xfc, 0x16, 0x6d, 0xf7, 0x6f, 0x0d, 0x51, ++ 0x4f, 0x74, 0x29, 0xff, 0xe7, 0xbb, 0x4a, 0xd6, 0x3c, 0xd9, 0x0b, 0xe8, ++ 0xf7, 0x3e, 0xbf, 0x03, 0x34, 0xbb, 0xb2, 0x1a, 0xb7, 0xf1, 0x75, 0x34, ++ 0xeb, 0x7f, 0x1f, 0xf5, 0x19, 0xb7, 0x72, 0xdd, 0xbd, 0x6a, 0xbe, 0x4f, ++ 0x83, 0xd7, 0x81, 0x46, 0x0c, 0x80, 0xf9, 0xd8, 0x52, 0x8b, 0x48, 0x77, ++ 0xb3, 0xdc, 0x50, 0x56, 0x16, 0x43, 0x8c, 0x17, 0xc6, 0x4c, 0x9f, 0x77, ++ 0x41, 0x62, 0x36, 0xe4, 0x7d, 0xde, 0xf1, 0x79, 0x23, 0xac, 0xc7, 0x98, ++ 0x8f, 0xeb, 0x2e, 0x3b, 0x8c, 0x41, 0xb6, 0x4a, 0xc1, 0xf2, 0xf0, 0x4b, ++ 0xd1, 0xa1, 0x9c, 0x66, 0x62, 0x41, 0x89, 0x47, 0xf7, 0xc9, 0x37, 0xd1, ++ 0x77, 0x3a, 0x19, 0xd2, 0x71, 0x89, 0x9c, 0xd0, 0xdf, 0x76, 0xdd, 0x67, ++ 0xe1, 0x2b, 0x56, 0xa1, 0x3a, 0xe1, 0xd7, 0x49, 0xb1, 0x86, 0x3d, 0xd0, ++ 0x16, 0xc4, 0x9e, 0x5a, 0x8d, 0x2b, 0x54, 0x50, 0x67, 0x11, 0xef, 0x1e, ++ 0xaa, 0xf9, 0x5c, 0x76, 0xe1, 0x9f, 0xba, 0xee, 0x8c, 0xfd, 0x37, 0x6e, ++ 0x3e, 0xd2, 0x5c, 0xd7, 0xc7, 0x5d, 0xc4, 0x4c, 0xc4, 0x3c, 0xc4, 0x2a, ++ 0x7c, 0x47, 0xfc, 0x71, 0x10, 0x73, 0xa1, 0x0c, 0x77, 0x4a, 0x38, 0x15, ++ 0x8f, 0x4e, 0x88, 0xaf, 0x83, 0x5f, 0x01, 0xff, 0x0b, 0x6e, 0xab, 0xdd, ++ 0x2b, 0x8f, 0xd7, 0xe9, 0x0f, 0xfb, 0xbc, 0x8f, 0x81, 0xf7, 0xf1, 0x42, ++ 0x41, 0x5c, 0xb9, 0xe8, 0xd8, 0xb1, 0x2f, 0x21, 0xfd, 0x89, 0xf3, 0x21, ++ 0xd2, 0xe2, 0x11, 0x98, 0x3a, 0xe0, 0x69, 0xd8, 0x88, 0x79, 0x1f, 0xd7, ++ 0x77, 0x12, 0xd7, 0x6b, 0x3a, 0x5e, 0x41, 0x9f, 0x71, 0xcb, 0x04, 0x58, ++ 0xba, 0x0d, 0xf5, 0x3c, 0xb9, 0xf6, 0xcb, 0x0e, 0xa2, 0x2e, 0xe7, 0x40, ++ 0x5f, 0xeb, 0x65, 0xec, 0x25, 0xd7, 0xfd, 0x84, 0x33, 0xd4, 0xb4, 0x27, ++ 0x9e, 0x06, 0x0f, 0x94, 0x6c, 0x8e, 0x74, 0x09, 0xe3, 0x66, 0x32, 0xdc, ++ 0xad, 0x7c, 0x02, 0x3e, 0x43, 0x46, 0x47, 0x68, 0x0b, 0x30, 0x2f, 0xe0, ++ 0x37, 0xda, 0x9c, 0xc7, 0x40, 0xfb, 0xcf, 0xd5, 0xc8, 0x87, 0x0e, 0xa5, ++ 0xf3, 0x1f, 0x2f, 0xd3, 0xae, 0x7b, 0x18, 0x2d, 0xa7, 0x62, 0xc5, 0xb4, ++ 0x05, 0x49, 0xf0, 0x86, 0x36, 0x80, 0x76, 0x9e, 0x6d, 0x59, 0x8f, 0x6d, ++ 0x9b, 0xf9, 0xc7, 0x3a, 0x5b, 0x80, 0xab, 0x28, 0x83, 0x9d, 0xc0, 0x23, ++ 0x5d, 0xb2, 0x2f, 0xd9, 0x0a, 0xba, 0x77, 0x2b, 0x1c, 0x65, 0xda, 0x1f, ++ 0x85, 0xcd, 0x6a, 0x61, 0x6c, 0xdb, 0x59, 0xf5, 0x31, 0x3e, 0x8c, 0xb2, ++ 0xb7, 0x40, 0x7f, 0x96, 0xbd, 0x18, 0xf2, 0x30, 0xd2, 0xfd, 0xd8, 0x7f, ++ 0x95, 0x2d, 0x19, 0xc5, 0x0f, 0xf2, 0xc1, 0xd7, 0x03, 0xbe, 0xdd, 0xb3, ++ 0x34, 0x8e, 0x24, 0x6f, 0x7c, 0xfc, 0xce, 0xba, 0xc4, 0xf0, 0xcd, 0xfe, ++ 0x09, 0xf7, 0x9d, 0xeb, 0x5e, 0x74, 0x94, 0x1d, 0x05, 0x0f, 0x76, 0xc0, ++ 0xd6, 0x07, 0x35, 0xad, 0x3b, 0xbc, 0xd8, 0x1a, 0x6c, 0x6b, 0xac, 0x1b, ++ 0x7a, 0xc7, 0xfe, 0x91, 0xa6, 0x1f, 0x31, 0xc2, 0x6f, 0xdd, 0x80, 0x4d, ++ 0xbf, 0x81, 0xf8, 0x80, 0x73, 0x47, 0xbb, 0x45, 0xd6, 0xa5, 0x0d, 0x3e, ++ 0x84, 0x31, 0x02, 0x12, 0xeb, 0x61, 0xfe, 0x26, 0xed, 0x6f, 0xf3, 0xd9, ++ 0x95, 0x81, 0x6d, 0xcd, 0xf2, 0x3c, 0x8a, 0x79, 0x72, 0x3d, 0x7e, 0xbc, ++ 0xb5, 0x57, 0xe9, 0x80, 0x55, 0xb9, 0xf0, 0xe7, 0xe4, 0x8f, 0xcb, 0xb9, ++ 0x45, 0xa5, 0x1b, 0x73, 0xbb, 0x03, 0x3a, 0x7a, 0x5b, 0x37, 0xfb, 0xf4, ++ 0xc7, 0x6e, 0x9e, 0x93, 0x8f, 0x5b, 0x3c, 0xbb, 0x1b, 0xb2, 0x5b, 0x65, ++ 0x5b, 0x0f, 0x69, 0xd7, 0xab, 0x74, 0xf5, 0x2a, 0x3f, 0x68, 0x7f, 0x39, ++ 0xf6, 0xfa, 0xf2, 0x9b, 0x9b, 0xe6, 0xf5, 0xba, 0x8e, 0x03, 0x13, 0x1b, ++ 0x13, 0x33, 0x6c, 0xc7, 0x3b, 0xce, 0x09, 0xce, 0x70, 0xc4, 0x95, 0x9d, ++ 0x8a, 0x6e, 0x9c, 0x5b, 0xf3, 0x3c, 0x88, 0x9d, 0x38, 0x67, 0xce, 0x61, ++ 0x3d, 0x26, 0xe1, 0x7c, 0xbe, 0xda, 0xe2, 0xf1, 0xf0, 0x45, 0xbd, 0x2e, ++ 0x1f, 0xc3, 0x24, 0xd0, 0xf6, 0xcf, 0xb0, 0x06, 0x3e, 0x73, 0x1d, 0xbe, ++ 0xcd, 0x4e, 0x78, 0xfd, 0xb4, 0xf9, 0xe7, 0x07, 0xd1, 0xa6, 0x18, 0x12, ++ 0xf7, 0x8c, 0x4f, 0xa7, 0x6e, 0xcd, 0xa3, 0x1d, 0xeb, 0xc6, 0x8d, 0x3b, ++ 0x6b, 0xf5, 0xc8, 0x87, 0x9b, 0xd6, 0x37, 0x2c, 0x85, 0x45, 0xca, 0xc5, ++ 0x4d, 0x48, 0x7d, 0x4c, 0x30, 0x02, 0xdd, 0x9f, 0x86, 0xfd, 0x27, 0x36, ++ 0x78, 0x1b, 0x26, 0xc8, 0x05, 0x52, 0x32, 0x9d, 0x87, 0x4f, 0xa6, 0x74, ++ 0xbf, 0xda, 0x8b, 0x61, 0xe4, 0x3b, 0xa0, 0xff, 0xef, 0xa4, 0x8c, 0x4d, ++ 0xe7, 0x6a, 0xce, 0xf4, 0xde, 0xda, 0xc8, 0x34, 0x71, 0x94, 0x27, 0x73, ++ 0xa8, 0x5f, 0x63, 0x0c, 0x56, 0xa6, 0x33, 0xaa, 0x9d, 0x8a, 0x25, 0x6c, ++ 0xd0, 0x4f, 0x07, 0xf7, 0x63, 0xce, 0x1b, 0x2b, 0x3c, 0x9d, 0x85, 0x0e, ++ 0x5a, 0x9c, 0x87, 0x5d, 0xb2, 0xe3, 0x69, 0xca, 0xe5, 0x8c, 0x13, 0x9f, ++ 0x50, 0xb2, 0x17, 0x89, 0x4f, 0x91, 0x97, 0xd5, 0xf9, 0xf7, 0xcb, 0xe2, ++ 0x82, 0x2b, 0xb7, 0x43, 0x17, 0xde, 0x0b, 0x59, 0x95, 0x73, 0x50, 0x84, ++ 0xe7, 0xa0, 0xbc, 0xce, 0x45, 0xc4, 0x3c, 0xd9, 0x2b, 0xa1, 0xa3, 0x51, ++ 0x09, 0x1e, 0x25, 0xa6, 0x4c, 0x58, 0xb7, 0x8b, 0xc0, 0x8e, 0xfd, 0xe0, ++ 0x23, 0xa6, 0xc4, 0x47, 0xd3, 0x92, 0x88, 0x3d, 0x04, 0xdb, 0x5b, 0x45, ++ 0x5a, 0x94, 0x44, 0xf2, 0x2c, 0xfa, 0x0a, 0x9d, 0x43, 0x5d, 0xb4, 0xdb, ++ 0xb4, 0x1c, 0xc3, 0xaf, 0x47, 0xda, 0x96, 0xbd, 0xbd, 0xd2, 0xb6, 0xbc, ++ 0xd6, 0x0f, 0x1f, 0x6b, 0xf8, 0xe1, 0x7c, 0xff, 0xa6, 0x8e, 0x1f, 0x3c, ++ 0x01, 0x9d, 0xe3, 0xfb, 0x4f, 0xb4, 0x47, 0xca, 0x87, 0x82, 0xde, 0x7f, ++ 0x02, 0x3e, 0x96, 0x2d, 0xd9, 0x32, 0xfc, 0xa7, 0x94, 0x2b, 0xdf, 0x70, ++ 0x0a, 0x6e, 0x66, 0xc4, 0x95, 0x57, 0x1c, 0xbb, 0x90, 0x97, 0xf8, 0x9b, ++ 0xd4, 0x77, 0xff, 0xd3, 0xf9, 0x43, 0xd9, 0xdd, 0x15, 0xdf, 0x9d, 0x36, ++ 0x0a, 0x6e, 0x07, 0x7c, 0xaa, 0xeb, 0x52, 0x07, 0x65, 0x66, 0xeb, 0x0a, ++ 0x04, 0x25, 0x7d, 0x1d, 0x70, 0x16, 0xfc, 0x66, 0xf6, 0xff, 0xaa, 0xf2, ++ 0xdb, 0xee, 0xe9, 0x3f, 0x28, 0x9b, 0xb7, 0xc6, 0xad, 0xab, 0x01, 0x62, ++ 0xa0, 0x83, 0x92, 0x85, 0xfe, 0xcf, 0x06, 0x6c, 0x6b, 0x97, 0xc4, 0x27, ++ 0x3e, 0x2f, 0x8c, 0x0f, 0xda, 0xd2, 0x77, 0xd4, 0x8e, 0xde, 0x67, 0x0c, ++ 0xec, 0xbf, 0x0f, 0xb4, 0xec, 0x3b, 0xc7, 0xbc, 0x2b, 0xe1, 0xad, 0x16, ++ 0x9e, 0x23, 0xd2, 0x77, 0x32, 0x26, 0x09, 0xd0, 0x65, 0x50, 0xd1, 0x84, ++ 0xe7, 0x02, 0x51, 0x19, 0x38, 0x4a, 0x4c, 0xa2, 0x68, 0x33, 0x08, 0xda, ++ 0x24, 0x41, 0x1b, 0xf8, 0x32, 0x43, 0xd6, 0x55, 0xa4, 0x97, 0x24, 0x31, ++ 0xfa, 0x33, 0xd0, 0x66, 0x10, 0xb4, 0x19, 0x38, 0x17, 0x43, 0x7b, 0xf4, ++ 0xb1, 0xdc, 0x87, 0xb4, 0x4d, 0x3e, 0x7e, 0x6d, 0x0f, 0x9e, 0x6d, 0x49, ++ 0x1c, 0x0d, 0x63, 0x0c, 0x43, 0x76, 0xf6, 0x17, 0x64, 0x7c, 0x2b, 0xb0, ++ 0x73, 0xe4, 0xa0, 0x5c, 0x86, 0x1d, 0x2a, 0xc3, 0x6f, 0xfb, 0xc6, 0x68, ++ 0x7c, 0x6a, 0x05, 0xba, 0xb4, 0x7e, 0x87, 0x2b, 0xcf, 0x6f, 0xfd, 0x91, ++ 0x1b, 0xbd, 0x36, 0xbe, 0x5b, 0x8c, 0x11, 0x99, 0x2b, 0x2b, 0xfb, 0x10, ++ 0xcd, 0x04, 0x14, 0xd6, 0xc1, 0x1a, 0x0b, 0xb0, 0x31, 0x8c, 0x7f, 0xda, ++ 0xd0, 0xf5, 0x9f, 0x97, 0x7b, 0x2b, 0xb3, 0xf8, 0x01, 0x6f, 0x97, 0x58, ++ 0x77, 0x3f, 0x70, 0xf6, 0xfd, 0xb2, 0xaf, 0x04, 0x2c, 0x96, 0xc2, 0xbc, ++ 0x47, 0x6c, 0xe0, 0xf1, 0x40, 0xab, 0x74, 0xa2, 0x0c, 0xb4, 0x9d, 0xaa, ++ 0xaf, 0xc7, 0xb5, 0x2b, 0xe0, 0xc3, 0xa8, 0x3c, 0x5d, 0x1f, 0x91, 0xef, ++ 0xd4, 0x87, 0xe5, 0x5b, 0xb0, 0x2d, 0x8f, 0xd5, 0x7b, 0xb1, 0x57, 0xa2, ++ 0xe0, 0x49, 0x0a, 0xfc, 0x71, 0xe4, 0xdb, 0xf5, 0xa4, 0x3c, 0x01, 0x5a, ++ 0x3d, 0x8e, 0xdf, 0x78, 0x39, 0x29, 0x3b, 0xcb, 0xc3, 0x9a, 0x47, 0xe4, ++ 0x0f, 0x63, 0x15, 0x36, 0xd6, 0x1e, 0x7f, 0xb4, 0x80, 0xfd, 0xb7, 0x58, ++ 0xb7, 0xdf, 0xa8, 0xca, 0x73, 0xd0, 0x61, 0x96, 0x9c, 0x69, 0xd8, 0x97, ++ 0x82, 0x6b, 0xd9, 0xf1, 0x23, 0x39, 0xf0, 0xa1, 0x8a, 0x7d, 0x3a, 0xa5, ++ 0x68, 0xbf, 0x6a, 0x7b, 0xaa, 0x9e, 0xed, 0xf1, 0xd7, 0x37, 0x9f, 0x97, ++ 0x9f, 0x48, 0xe6, 0xf8, 0x9c, 0xcc, 0xc0, 0x97, 0xfe, 0x63, 0xc7, 0x85, ++ 0x1c, 0x53, 0x17, 0x8f, 0x50, 0xc7, 0xc7, 0x72, 0x01, 0x53, 0xf9, 0xb7, ++ 0x1e, 0xd6, 0x38, 0xdf, 0x8d, 0x3d, 0x9b, 0x4c, 0x9b, 0xb3, 0x92, 0x38, ++ 0x3e, 0x2b, 0x7d, 0xc7, 0x21, 0x0b, 0x0e, 0xfb, 0x5a, 0xb1, 0xcc, 0xb7, ++ 0xc9, 0x03, 0xc7, 0x89, 0x8f, 0x66, 0xc5, 0xb6, 0xde, 0x90, 0x24, 0xc6, ++ 0x3f, 0x20, 0xfd, 0x68, 0x63, 0xa3, 0xcd, 0x55, 0x35, 0x76, 0x07, 0xc6, ++ 0x6e, 0x95, 0xc3, 0x91, 0x38, 0x64, 0x8d, 0x36, 0xfc, 0x7f, 0x49, 0xa6, ++ 0xca, 0xf4, 0x97, 0x92, 0x39, 0xf3, 0x4c, 0xab, 0xb4, 0xf1, 0x19, 0xaa, ++ 0xe1, 0x14, 0xcb, 0xfb, 0x90, 0xb2, 0xdc, 0x16, 0xf3, 0xd8, 0xaf, 0x25, ++ 0x73, 0x9e, 0x63, 0xbf, 0x81, 0xf2, 0xe7, 0x25, 0x73, 0xec, 0x2d, 0xe4, ++ 0x2f, 0x23, 0x7d, 0x13, 0xe9, 0x94, 0xf4, 0x1d, 0x83, 0x6f, 0x7c, 0xfe, ++ 0xc7, 0xc8, 0xc3, 0x97, 0x3b, 0x7f, 0x18, 0xf5, 0x76, 0x60, 0x7e, 0xd7, ++ 0x87, 0x81, 0x35, 0xa0, 0xf3, 0x5e, 0xd2, 0xf3, 0x67, 0x39, 0xcb, 0xf8, ++ 0xee, 0x30, 0x74, 0xda, 0x7f, 0x86, 0x4e, 0xd3, 0xcf, 0x8b, 0xcc, 0x53, ++ 0xb7, 0xf1, 0x79, 0x16, 0x34, 0x39, 0xa0, 0x62, 0x46, 0xf7, 0x3b, 0xb4, ++ 0x37, 0xdb, 0x65, 0xda, 0x2a, 0xb8, 0x6d, 0xc0, 0x15, 0x1d, 0xd8, 0x07, ++ 0xb3, 0xdb, 0x36, 0xde, 0x07, 0x47, 0x06, 0x0e, 0xca, 0xa6, 0xad, 0xfe, ++ 0xfa, 0xfd, 0xf5, 0xda, 0xd6, 0x2f, 0x14, 0x1d, 0xe2, 0x85, 0xfb, 0x84, ++ 0xeb, 0xb0, 0xa3, 0x0f, 0x9b, 0x03, 0xbb, 0xef, 0xc5, 0x3e, 0x30, 0xcf, ++ 0x33, 0xef, 0xed, 0x03, 0xf3, 0x3c, 0x74, 0xc3, 0x29, 0xf8, 0xb2, 0xa7, ++ 0x7a, 0xa5, 0xf5, 0xd8, 0xea, 0x3e, 0x68, 0x39, 0xf6, 0xee, 0xfb, 0xa0, ++ 0xf5, 0x3c, 0xea, 0x9d, 0x27, 0xcd, 0xd0, 0xc7, 0x19, 0xd2, 0xac, 0x07, ++ 0xe9, 0xe7, 0xb1, 0x56, 0xce, 0xbd, 0x15, 0x73, 0xf7, 0x70, 0xd1, 0x47, ++ 0x20, 0xef, 0xf7, 0x6c, 0x3d, 0xa0, 0xcb, 0xff, 0xad, 0x3b, 0x11, 0x89, ++ 0x57, 0xc4, 0x20, 0x4d, 0x51, 0xb7, 0x4a, 0x1a, 0x7e, 0x01, 0xb4, 0xd9, ++ 0x2f, 0x7d, 0xa4, 0x5f, 0x75, 0x17, 0xf2, 0x05, 0x37, 0x44, 0xdf, 0x5c, ++ 0xd1, 0x13, 0x38, 0x69, 0x84, 0xe5, 0x2f, 0x41, 0x66, 0x88, 0x31, 0x5f, ++ 0x95, 0x99, 0x92, 0x2b, 0xd3, 0xea, 0x3c, 0xe8, 0x35, 0xfa, 0xb1, 0x5b, ++ 0x23, 0xb2, 0x12, 0x8b, 0x80, 0x26, 0x8b, 0xd0, 0xed, 0x97, 0xc5, 0xa3, ++ 0x03, 0x63, 0xca, 0x3b, 0xc5, 0x8e, 0x8e, 0x8b, 0x9d, 0xfc, 0x19, 0xe8, ++ 0x30, 0x0e, 0xd9, 0xcf, 0xd6, 0x29, 0x3b, 0x2f, 0xca, 0x18, 0x64, 0xe2, ++ 0xa7, 0x4e, 0x3c, 0x09, 0x2c, 0x04, 0x7d, 0x41, 0xb9, 0xa0, 0x4c, 0x74, ++ 0x2a, 0x9d, 0x74, 0xca, 0x89, 0x3f, 0x52, 0x95, 0x1b, 0xe5, 0x54, 0xb7, ++ 0xa7, 0x7f, 0xcd, 0x63, 0xca, 0x5e, 0x24, 0x73, 0x26, 0xcf, 0x29, 0x93, ++ 0x62, 0x0d, 0x5c, 0x6d, 0xf1, 0xcf, 0xea, 0xf3, 0xc7, 0x0d, 0x99, 0x1d, ++ 0x20, 0xaf, 0xd8, 0x2f, 0xf2, 0xd5, 0x82, 0x1b, 0xb4, 0xdf, 0x70, 0x4f, ++ 0xf7, 0xc4, 0xe4, 0x73, 0x03, 0x0d, 0xb9, 0xac, 0x88, 0x78, 0xfb, 0x62, ++ 0x4c, 0xf1, 0xc3, 0x9f, 0xb7, 0xbf, 0x16, 0xff, 0xdd, 0x70, 0xd3, 0x3b, ++ 0xae, 0x85, 0xb2, 0xde, 0xd8, 0x3b, 0xb1, 0xb7, 0xcf, 0x15, 0x0a, 0xb7, ++ 0x2d, 0xfe, 0x48, 0x51, 0x5e, 0x81, 0xec, 0x81, 0x86, 0xe7, 0x99, 0x92, ++ 0x86, 0xb3, 0x90, 0xfb, 0x97, 0x64, 0xe7, 0x71, 0xee, 0x99, 0x97, 0xb0, ++ 0x56, 0xa5, 0x4b, 0xa0, 0x23, 0xd8, 0x9f, 0x2b, 0x73, 0x0e, 0x63, 0x24, ++ 0x37, 0x46, 0xf7, 0xc2, 0x87, 0xcb, 0x59, 0xae, 0x2c, 0x3b, 0x05, 0x59, ++ 0x1e, 0x45, 0x9b, 0xea, 0xe7, 0xf1, 0xfb, 0x77, 0x7a, 0x6d, 0x0f, 0x82, ++ 0xee, 0xf1, 0x58, 0xc5, 0xfc, 0x02, 0xe8, 0x7e, 0xbf, 0x24, 0x8e, 0x35, ++ 0x74, 0x0d, 0xe3, 0x96, 0x4a, 0xd7, 0x24, 0xce, 0x5b, 0x52, 0x2d, 0xdb, ++ 0xf2, 0x49, 0xea, 0x90, 0x32, 0xd7, 0x05, 0x1d, 0xc3, 0x73, 0xee, 0x32, ++ 0xf4, 0x4c, 0x19, 0x3a, 0x05, 0x3a, 0xe4, 0x5b, 0x28, 0x7f, 0x02, 0x75, ++ 0x1e, 0x87, 0xcf, 0xf3, 0x18, 0xb0, 0xdf, 0x45, 0x60, 0x8a, 0x0b, 0xe5, ++ 0xb4, 0xf6, 0x0d, 0xd5, 0x7a, 0x61, 0xb3, 0x94, 0xbf, 0x22, 0xd5, 0x0a, ++ 0xe9, 0xf1, 0x6b, 0xc5, 0xdb, 0x8c, 0xb3, 0x85, 0x38, 0x0b, 0x33, 0x13, ++ 0xa9, 0x54, 0x7c, 0x9a, 0x50, 0xf7, 0x31, 0xb6, 0xef, 0xeb, 0xca, 0x8e, ++ 0x75, 0xba, 0x52, 0xe4, 0x07, 0x35, 0x0f, 0x4f, 0x12, 0x1f, 0x17, 0x4b, ++ 0x90, 0x1b, 0x8d, 0xcd, 0x8b, 0xb0, 0x9b, 0x97, 0xe0, 0x97, 0x84, 0x53, ++ 0x2f, 0x48, 0xf8, 0xa4, 0xeb, 0xfe, 0x1c, 0x76, 0xb3, 0x00, 0x9e, 0x98, ++ 0x06, 0xca, 0x97, 0xf8, 0x8e, 0x72, 0x4f, 0xd9, 0x36, 0x18, 0x13, 0x97, ++ 0xe7, 0x50, 0x56, 0xf5, 0x7c, 0x6d, 0xcc, 0x47, 0xcf, 0x4f, 0x95, 0xb1, ++ 0x5e, 0xab, 0x64, 0xa7, 0x93, 0xf2, 0x50, 0x79, 0xc8, 0x6a, 0x45, 0xfb, ++ 0xca, 0x12, 0xdb, 0xc4, 0x47, 0xd1, 0x14, 0xed, 0x58, 0xde, 0x2b, 0x97, ++ 0x4b, 0x29, 0x35, 0x87, 0xea, 0x42, 0x4a, 0xbc, 0x98, 0x24, 0xf5, 0x15, ++ 0xe7, 0x8a, 0x3c, 0x7d, 0xcb, 0x32, 0xed, 0x6c, 0x50, 0x0a, 0x51, 0xd2, ++ 0x3a, 0x2a, 0x97, 0x4a, 0x7f, 0x15, 0x66, 0xec, 0x26, 0x63, 0xf3, 0xd9, ++ 0x8f, 0x1d, 0x58, 0xbf, 0x47, 0xec, 0x80, 0xf1, 0x82, 0x20, 0x6c, 0x99, ++ 0x8a, 0x21, 0x20, 0x8d, 0x35, 0xf9, 0xac, 0x7c, 0xef, 0x9f, 0xb3, 0xf9, ++ 0xd8, 0x88, 0x78, 0x92, 0xeb, 0x8d, 0x17, 0x56, 0x84, 0xe7, 0x69, 0xcf, ++ 0xca, 0x9d, 0xa7, 0xbc, 0xf5, 0x99, 0x67, 0x84, 0xf7, 0x40, 0xe4, 0xea, ++ 0x42, 0xdc, 0xb9, 0x02, 0x4c, 0x91, 0x8d, 0x38, 0xe0, 0xd7, 0x85, 0x30, ++ 0xf4, 0xd7, 0x68, 0xda, 0xdc, 0xbc, 0xc9, 0xc3, 0x67, 0x41, 0x99, 0xe5, ++ 0x79, 0x50, 0x09, 0xba, 0x0d, 0x18, 0xf2, 0x9f, 0x06, 0xf1, 0x5c, 0x63, ++ 0x1e, 0x7e, 0x9a, 0xe7, 0x83, 0xe2, 0xd9, 0xeb, 0x8f, 0x34, 0x37, 0x4f, ++ 0x71, 0xed, 0x86, 0xdc, 0x09, 0x74, 0x22, 0xe8, 0xbf, 0x4f, 0x8f, 0xd5, ++ 0x77, 0x26, 0xc9, 0xd8, 0x9d, 0x24, 0xa0, 0x2f, 0x32, 0x0b, 0x41, 0x8c, ++ 0xd5, 0xab, 0xb1, 0x39, 0xdf, 0xad, 0xc7, 0x9e, 0xbe, 0x8f, 0x97, 0x94, ++ 0x2f, 0x97, 0x7d, 0xac, 0x97, 0x84, 0x8d, 0x95, 0xe0, 0xc4, 0xa0, 0x2b, ++ 0x3f, 0x77, 0x48, 0xaf, 0x61, 0xe4, 0x1d, 0x39, 0x52, 0xff, 0x5d, 0xe7, ++ 0x95, 0xcd, 0x7f, 0xc0, 0x65, 0xc4, 0x66, 0x25, 0xcc, 0x0f, 0xf8, 0x88, ++ 0x73, 0x37, 0x61, 0xcf, 0x8b, 0xc0, 0x5d, 0xe6, 0xb9, 0x5e, 0xf5, 0xce, ++ 0x04, 0x36, 0xa8, 0x96, 0xa0, 0x1b, 0xcf, 0xf1, 0x4c, 0x17, 0xba, 0xed, ++ 0x5c, 0x48, 0x8a, 0xf3, 0x94, 0x4b, 0xe9, 0x36, 0xc1, 0x2f, 0xd6, 0xaf, ++ 0x96, 0x7a, 0x91, 0x76, 0x20, 0x8d, 0xa9, 0x7e, 0xaa, 0x25, 0x5b, 0xb5, ++ 0xaf, 0x96, 0x92, 0xaa, 0x5d, 0xb5, 0x34, 0x8c, 0xd4, 0x91, 0x96, 0x73, ++ 0x70, 0x9c, 0xce, 0x0d, 0xc8, 0xec, 0x69, 0xd8, 0x97, 0x11, 0x53, 0xdd, ++ 0x91, 0xc8, 0xc1, 0xfe, 0x04, 0xe1, 0x65, 0x5d, 0xb1, 0x46, 0x81, 0xb1, ++ 0xb6, 0x03, 0x83, 0x6c, 0x17, 0xfb, 0x24, 0xd7, 0x4f, 0xdd, 0x7b, 0x89, ++ 0xf1, 0xa4, 0xe8, 0xa7, 0x25, 0x2d, 0xfb, 0xe6, 0x5b, 0xb1, 0x5f, 0x83, ++ 0x56, 0x51, 0xfa, 0xad, 0x71, 0xe4, 0xf3, 0x15, 0xd2, 0xed, 0x2e, 0xe5, ++ 0xbb, 0x65, 0x9c, 0xfb, 0xc1, 0x93, 0x14, 0xc6, 0xf8, 0x7d, 0xda, 0x0f, ++ 0xf2, 0xcc, 0x41, 0xf7, 0x91, 0xc2, 0x7c, 0x9a, 0xe9, 0xc1, 0xb3, 0xdb, ++ 0xf4, 0xbb, 0x9c, 0xdd, 0x52, 0xae, 0x49, 0xdf, 0xbb, 0xe4, 0x92, 0x9d, ++ 0x92, 0xe7, 0xec, 0xa4, 0x5c, 0xb6, 0xb7, 0xc9, 0x0f, 0x61, 0xa7, 0x9f, ++ 0xb5, 0xff, 0x47, 0x98, 0x58, 0xa0, 0xaa, 0xce, 0x60, 0x7c, 0x5e, 0xd9, ++ 0x3a, 0x8e, 0xf8, 0xba, 0x2c, 0x97, 0x88, 0x9d, 0xdd, 0x1d, 0x33, 0x4e, ++ 0x81, 0x76, 0x0b, 0x73, 0x20, 0x56, 0x2b, 0xc0, 0xfe, 0x1d, 0x94, 0x71, ++ 0x87, 0x76, 0x4f, 0xd9, 0xa8, 0xe8, 0xb8, 0xb7, 0x9f, 0x9d, 0x3c, 0xf4, ++ 0xea, 0xa5, 0x79, 0xec, 0x27, 0xa1, 0xfc, 0xe3, 0xb9, 0x42, 0xbe, 0xdb, ++ 0xf2, 0x70, 0x99, 0xeb, 0x2c, 0x5e, 0xd3, 0x26, 0x01, 0x99, 0x50, 0x78, ++ 0xa1, 0x53, 0x7e, 0xb0, 0xd4, 0x2e, 0x26, 0x2c, 0x94, 0x79, 0x43, 0x48, ++ 0x9d, 0xd5, 0xf3, 0x8c, 0x40, 0xba, 0x78, 0xd7, 0xe9, 0x7b, 0xa0, 0x0d, ++ 0x63, 0x01, 0xc0, 0x1b, 0x5d, 0x5c, 0x89, 0x9f, 0x67, 0xdf, 0x41, 0xe1, ++ 0x19, 0x41, 0x3a, 0xc2, 0xfc, 0x30, 0xf6, 0x1b, 0xdf, 0x19, 0x92, 0xb5, ++ 0x23, 0x78, 0x66, 0xca, 0x3d, 0xc8, 0x38, 0x54, 0x40, 0xc7, 0x81, 0x2f, ++ 0xab, 0xf7, 0xad, 0xf6, 0x2d, 0xc0, 0x79, 0x94, 0x5f, 0xa4, 0xcb, 0xde, ++ 0x3c, 0xb2, 0xc0, 0x75, 0xf9, 0xe1, 0x4d, 0xf4, 0xcb, 0x93, 0x05, 0xec, ++ 0x8d, 0x9c, 0xaa, 0xbf, 0x1d, 0xfb, 0xeb, 0xe5, 0x4d, 0xc4, 0x13, 0x3b, ++ 0x21, 0x9b, 0xcf, 0x96, 0xf8, 0xcc, 0xf7, 0xf4, 0xb7, 0x18, 0x6f, 0x7b, ++ 0x65, 0x72, 0xce, 0x8e, 0xeb, 0xfd, 0x24, 0xc6, 0xed, 0x83, 0xc0, 0xa5, ++ 0x47, 0x5b, 0xb0, 0xb6, 0x78, 0x2c, 0x66, 0x98, 0x3d, 0x26, 0x70, 0xfd, ++ 0xb8, 0xb2, 0xc1, 0x83, 0x58, 0x4f, 0x52, 0xce, 0x24, 0x3b, 0xa5, 0x6a, ++ 0x81, 0x9e, 0xd8, 0xd3, 0x2b, 0xd6, 0x56, 0x62, 0x7f, 0xfc, 0x36, 0xa1, ++ 0xac, 0x1f, 0x69, 0x2b, 0xd2, 0x9b, 0xa4, 0x78, 0xe2, 0x97, 0xba, 0xbf, ++ 0xd0, 0xba, 0x7c, 0x49, 0xa7, 0x4f, 0x6b, 0xff, 0x8a, 0xe3, 0x84, 0xc4, ++ 0xfe, 0x4a, 0x87, 0xf4, 0x1f, 0xb5, 0x80, 0x75, 0xa3, 0xc0, 0xbe, 0xbd, ++ 0x92, 0x3c, 0x1a, 0x93, 0x1b, 0x8e, 0xfa, 0x71, 0xa3, 0xff, 0x34, 0x99, ++ 0x50, 0x31, 0xc4, 0xff, 0x38, 0x69, 0x57, 0x98, 0xbe, 0xa6, 0xcf, 0x8a, ++ 0x5f, 0xd7, 0x67, 0xc8, 0x6f, 0x4c, 0x0e, 0xaa, 0xf4, 0xd7, 0x93, 0x49, ++ 0x95, 0xbe, 0x39, 0x79, 0x43, 0xcd, 0xf3, 0x97, 0x8a, 0x8b, 0x49, 0xf9, ++ 0x52, 0x99, 0x78, 0x73, 0x04, 0x58, 0xd2, 0x81, 0xde, 0x19, 0x86, 0xde, ++ 0x49, 0x42, 0xef, 0x8c, 0x52, 0xef, 0x30, 0x36, 0x0a, 0x3d, 0xee, 0xc8, ++ 0x4f, 0x21, 0xbf, 0x17, 0x9c, 0x56, 0xe0, 0x44, 0xd7, 0xf5, 0xd6, 0x1a, ++ 0x7f, 0x64, 0x05, 0xfc, 0xae, 0x9e, 0x95, 0x70, 0x17, 0x74, 0xd2, 0xd6, ++ 0x53, 0x2d, 0xb2, 0x18, 0x71, 0xdd, 0xe3, 0x8e, 0x2d, 0x57, 0x51, 0x3f, ++ 0x63, 0x73, 0x5f, 0x0f, 0xb5, 0xd1, 0x3f, 0xbb, 0x5a, 0xda, 0x06, 0x1d, ++ 0x45, 0xf9, 0x0f, 0x4b, 0x75, 0x3a, 0x2a, 0x4b, 0xf0, 0xd7, 0x56, 0xeb, ++ 0x24, 0xf1, 0x4c, 0x7d, 0x70, 0x33, 0xea, 0x26, 0x61, 0x2f, 0x2c, 0x59, ++ 0x1e, 0x8c, 0xc9, 0x99, 0xc1, 0xf8, 0x68, 0xcc, 0xa4, 0x2e, 0x8b, 0x49, ++ 0x05, 0xbe, 0x7f, 0xb5, 0xcc, 0xfa, 0xac, 0x87, 0xfd, 0x5a, 0xf6, 0xda, ++ 0xcd, 0x95, 0x7d, 0xbd, 0x01, 0x79, 0x5d, 0x60, 0x5c, 0xd0, 0xb3, 0x09, ++ 0xa6, 0xd9, 0x0a, 0x39, 0x70, 0x40, 0xff, 0x69, 0x94, 0x8f, 0xf0, 0x7e, ++ 0x07, 0xca, 0x88, 0x8d, 0x26, 0xdb, 0xc8, 0xe3, 0xac, 0x33, 0x8d, 0x32, ++ 0xb6, 0x89, 0x47, 0x13, 0x28, 0x9f, 0x92, 0x44, 0x34, 0xaf, 0xee, 0x18, ++ 0xf5, 0xa0, 0x8c, 0x7d, 0x04, 0x74, 0x7c, 0xe6, 0x4f, 0xda, 0x28, 0x47, ++ 0x01, 0xdb, 0x2f, 0x1f, 0x52, 0xb1, 0x82, 0xb4, 0xe5, 0x60, 0x7f, 0xb0, ++ 0x2c, 0x61, 0xb1, 0x5d, 0xd6, 0x71, 0x94, 0x6e, 0xfc, 0x84, 0x3e, 0xbf, ++ 0xb8, 0xb3, 0xd6, 0x21, 0xd9, 0x5a, 0xcb, 0x3b, 0xd8, 0x03, 0x7f, 0x8f, ++ 0x5e, 0x8a, 0x5a, 0xc2, 0x33, 0x75, 0x6f, 0xdf, 0x07, 0xb7, 0x71, 0x8f, ++ 0x80, 0xee, 0xb0, 0xc7, 0x8f, 0x63, 0xbd, 0x8f, 0xc1, 0x1e, 0x5f, 0x84, ++ 0x3d, 0xbe, 0x50, 0x5e, 0xd5, 0x27, 0x9e, 0x1d, 0xa6, 0x4e, 0x78, 0x14, ++ 0x3c, 0x9b, 0x82, 0x1f, 0xb0, 0x0b, 0xfe, 0xc1, 0x04, 0x7c, 0x81, 0x31, ++ 0xf0, 0x2f, 0x05, 0xde, 0x4d, 0x83, 0x6f, 0x69, 0xf0, 0x71, 0x54, 0x9d, ++ 0x65, 0xce, 0xab, 0xf3, 0xfb, 0xd7, 0x95, 0x2d, 0x7e, 0xa8, 0x6c, 0xc2, ++ 0x5e, 0x14, 0xdc, 0x6b, 0xec, 0x38, 0xf0, 0x60, 0x63, 0x7f, 0x8f, 0xfe, ++ 0x00, 0x7a, 0xe6, 0x57, 0x98, 0xd7, 0x63, 0xf3, 0xb4, 0xef, 0xa8, 0xe3, ++ 0xe1, 0x6f, 0x87, 0xb1, 0x2f, 0xec, 0xef, 0x23, 0x97, 0x64, 0x05, 0x38, ++ 0x24, 0x4d, 0x39, 0x86, 0x3f, 0x11, 0xbf, 0x50, 0x91, 0x01, 0xea, 0x44, ++ 0x60, 0xa4, 0x51, 0x19, 0x39, 0x16, 0x05, 0xf6, 0x03, 0xb2, 0x57, 0xe7, ++ 0x77, 0x78, 0x3e, 0xbf, 0x59, 0x4c, 0xe2, 0x3f, 0x87, 0x67, 0x34, 0xd4, ++ 0x23, 0x3e, 0x66, 0x5a, 0x19, 0xed, 0x96, 0xf4, 0xd6, 0x6e, 0xa5, 0x4b, ++ 0xe2, 0xce, 0x73, 0x18, 0x77, 0xa7, 0xb4, 0x02, 0xd3, 0x15, 0x30, 0xc6, ++ 0x01, 0xf9, 0x2f, 0x0e, 0x63, 0x56, 0x9e, 0x2f, 0x88, 0xb9, 0x84, 0x41, ++ 0xb3, 0x4d, 0x33, 0xb6, 0x15, 0xde, 0x59, 0x67, 0xff, 0x61, 0x85, 0xb9, ++ 0xb2, 0xc2, 0xfe, 0x61, 0x37, 0x30, 0x66, 0xe2, 0x18, 0x65, 0x7f, 0x08, ++ 0x7c, 0xfb, 0x07, 0xfa, 0x1e, 0xd1, 0x96, 0x76, 0x7d, 0xae, 0x89, 0xf9, ++ 0xaf, 0x10, 0x5f, 0x30, 0xc6, 0xee, 0xf9, 0xe9, 0x8d, 0xb9, 0x6d, 0x87, ++ 0x3d, 0x7b, 0x53, 0xc9, 0xc0, 0xb4, 0x03, 0x3f, 0xf0, 0x98, 0x67, 0xbf, ++ 0xfb, 0xce, 0xa3, 0xd5, 0x71, 0xe9, 0xe1, 0xe9, 0xa7, 0x29, 0x37, 0xc8, ++ 0xad, 0x41, 0xaf, 0x1f, 0xf3, 0x94, 0x05, 0x59, 0xa5, 0x1e, 0xe8, 0x81, ++ 0x9c, 0x33, 0x4f, 0x9d, 0x42, 0x9d, 0x40, 0x59, 0xb0, 0x79, 0x7f, 0x67, ++ 0x13, 0xef, 0x9d, 0x55, 0x48, 0xb3, 0x53, 0xd4, 0x13, 0xaf, 0xcb, 0xdc, ++ 0x3a, 0xdd, 0x39, 0x26, 0xbe, 0x9f, 0xdb, 0x21, 0xa1, 0x94, 0x6d, 0x7d, ++ 0x42, 0xad, 0xd1, 0xd3, 0x9f, 0xfb, 0x88, 0x47, 0xe7, 0xd3, 0xf1, 0x6e, ++ 0xd1, 0x58, 0x54, 0xe1, 0xa9, 0xd7, 0xb0, 0x56, 0xf6, 0xa1, 0xe8, 0x34, ++ 0x3a, 0xe6, 0xf9, 0x06, 0x2a, 0x06, 0x08, 0x5c, 0x1c, 0xfd, 0x15, 0x74, ++ 0x6f, 0x96, 0x38, 0x05, 0x74, 0xee, 0x3b, 0x4e, 0x39, 0xf2, 0xee, 0x96, ++ 0x55, 0xcc, 0x24, 0xf5, 0xb7, 0x2c, 0x1d, 0x03, 0x06, 0x33, 0x6f, 0x91, ++ 0x3c, 0xe5, 0x95, 0x67, 0xe0, 0x4b, 0xa6, 0xcc, 0x2d, 0x74, 0x4a, 0xff, ++ 0x29, 0xc6, 0x5b, 0xdb, 0xda, 0xa4, 0x93, 0x31, 0x57, 0xda, 0xa4, 0x11, ++ 0xc9, 0xa2, 0xbc, 0xef, 0x54, 0x40, 0xc5, 0xc7, 0x2a, 0x26, 0x69, 0x34, ++ 0x0c, 0x7d, 0x10, 0x4f, 0xae, 0x98, 0xa7, 0xc2, 0x1e, 0xa6, 0x84, 0x2c, ++ 0x95, 0x21, 0x63, 0x65, 0xc8, 0x58, 0x19, 0x32, 0x56, 0x86, 0x8c, 0x01, ++ 0x0b, 0x3e, 0x86, 0xfd, 0x77, 0xb1, 0x3c, 0xaa, 0xed, 0xfc, 0x6e, 0x65, ++ 0xe7, 0x0f, 0x97, 0x5f, 0x74, 0x99, 0x3e, 0xa1, 0x7c, 0xd5, 0x61, 0xc8, ++ 0x20, 0x7d, 0x53, 0xdf, 0x67, 0x7d, 0x51, 0x1e, 0x9d, 0x7f, 0x49, 0xce, ++ 0xcc, 0xaf, 0xe2, 0xc2, 0xd9, 0xb2, 0x2b, 0xcf, 0x39, 0xf0, 0x47, 0x17, ++ 0x89, 0xb1, 0xd2, 0x5d, 0xad, 0x0a, 0x6b, 0x1d, 0x94, 0xbc, 0xc2, 0xcd, ++ 0xca, 0xae, 0x00, 0x6f, 0x29, 0x9c, 0xc8, 0xbd, 0x29, 0xdd, 0x5b, 0x5f, ++ 0x91, 0x8b, 0xb0, 0xeb, 0x4b, 0xf5, 0x57, 0xe5, 0x71, 0x85, 0xcf, 0x49, ++ 0x87, 0x0f, 0xc8, 0x2f, 0x2d, 0xef, 0xdc, 0xf8, 0x0c, 0xb0, 0xc7, 0xd2, ++ 0x20, 0x75, 0x47, 0x10, 0xb6, 0x20, 0x5e, 0xe8, 0xc3, 0xbe, 0xde, 0x6f, ++ 0xbe, 0x07, 0x18, 0x87, 0xef, 0x37, 0xcb, 0x0f, 0xe6, 0x0b, 0x4d, 0x32, ++ 0x41, 0xfd, 0x10, 0x3f, 0x22, 0x26, 0x6d, 0x0b, 0xed, 0x28, 0xd7, 0x4b, ++ 0xbb, 0x75, 0x57, 0x3b, 0xcf, 0x54, 0xab, 0x27, 0x0e, 0xb4, 0x31, 0xfe, ++ 0x18, 0xb1, 0x49, 0xd3, 0x57, 0x64, 0x7f, 0x8d, 0x65, 0x2f, 0x81, 0x3f, ++ 0x4c, 0x7f, 0xe6, 0xde, 0x19, 0xe1, 0x78, 0xec, 0x17, 0x38, 0xaa, 0x07, ++ 0x6b, 0x2d, 0x3f, 0xad, 0x31, 0xf8, 0xb0, 0xc2, 0xd5, 0x6f, 0xc7, 0xcf, ++ 0xa4, 0x93, 0x03, 0x3a, 0xbd, 0xa2, 0xe2, 0x83, 0x1b, 0xc4, 0x8d, 0x1f, ++ 0xc1, 0xbe, 0x2a, 0x5c, 0x11, 0xc6, 0x30, 0x19, 0xdf, 0x65, 0xec, 0xb8, ++ 0x59, 0x63, 0xa8, 0x73, 0x53, 0xb9, 0x03, 0xfa, 0xe5, 0x4e, 0xe8, 0x97, ++ 0x4f, 0xbc, 0xed, 0x3e, 0xaf, 0x1f, 0xc7, 0xef, 0x2f, 0x04, 0xcc, 0x5e, ++ 0x99, 0xaa, 0x35, 0xb7, 0x65, 0x5c, 0x77, 0xa3, 0x38, 0x2e, 0x63, 0xbc, ++ 0xc9, 0x75, 0xb1, 0x41, 0xca, 0x86, 0x2b, 0xcf, 0x3a, 0x8c, 0xc3, 0xf9, ++ 0xf7, 0xb5, 0x36, 0xc2, 0x63, 0xfb, 0xda, 0xfd, 0x18, 0x74, 0x30, 0x75, ++ 0x45, 0x78, 0x77, 0xab, 0x58, 0x22, 0x3e, 0x50, 0x67, 0x83, 0x2a, 0x96, ++ 0x9d, 0xf5, 0xe2, 0x09, 0x28, 0x87, 0xd5, 0x85, 0xff, 0xc3, 0x58, 0xb6, ++ 0xb5, 0x2d, 0x6e, 0x4d, 0x05, 0xbc, 0x3b, 0x8b, 0xdc, 0xcb, 0x9e, 0x2e, ++ 0x83, 0x2c, 0x36, 0xe2, 0xbe, 0xbc, 0x6f, 0xc0, 0xb5, 0x5c, 0xc1, 0x1e, ++ 0x20, 0xbf, 0xe0, 0x3f, 0x60, 0x9f, 0xcc, 0x42, 0x3f, 0xe5, 0x55, 0x7f, ++ 0x61, 0xca, 0x45, 0x3a, 0x13, 0x30, 0x25, 0x74, 0x92, 0xbe, 0x91, 0x17, ++ 0x7b, 0xc9, 0x06, 0xe2, 0x4a, 0x7f, 0x63, 0xee, 0xc0, 0x6b, 0xdc, 0x9f, ++ 0xb1, 0x5c, 0x6b, 0xaa, 0x05, 0x76, 0x15, 0xfc, 0xab, 0x33, 0x46, 0x80, ++ 0xbd, 0xbb, 0xfc, 0xb2, 0xec, 0x5b, 0x78, 0xb8, 0xdd, 0x93, 0x7f, 0xc6, ++ 0x95, 0xb9, 0x3e, 0x7f, 0x0e, 0x6b, 0xfb, 0x36, 0x4f, 0x4a, 0xb8, 0x0d, ++ 0x36, 0xed, 0x63, 0x27, 0x89, 0x07, 0x5a, 0x65, 0x25, 0xc2, 0x7e, 0xbd, ++ 0x3d, 0x33, 0x57, 0x66, 0xdf, 0x2f, 0xcb, 0xf8, 0xc2, 0xaf, 0xda, 0xa9, ++ 0x47, 0x96, 0xa1, 0x07, 0x2e, 0x59, 0xb4, 0xa1, 0xd3, 0xb0, 0x71, 0x3d, ++ 0xf2, 0xda, 0x02, 0xed, 0x63, 0xc2, 0x3a, 0x23, 0x43, 0xd1, 0x33, 0x98, ++ 0xd3, 0x97, 0x9d, 0x20, 0x7d, 0x36, 0x77, 0x0c, 0x65, 0x3f, 0x94, 0x84, ++ 0xd5, 0x67, 0xf0, 0x79, 0xc8, 0x7a, 0x58, 0x78, 0xef, 0x20, 0x61, 0xdd, ++ 0x68, 0x50, 0x8e, 0xe0, 0x83, 0x2f, 0xaf, 0xce, 0xf3, 0x67, 0x0b, 0xca, ++ 0x6f, 0x52, 0x7a, 0x66, 0xd9, 0xe1, 0x78, 0x0f, 0x6b, 0xdd, 0x76, 0x23, ++ 0xf4, 0x89, 0x7f, 0x4f, 0x17, 0x6d, 0x88, 0x6d, 0x9c, 0xa0, 0xce, 0x3f, ++ 0x28, 0x99, 0xd3, 0x11, 0xe8, 0x33, 0xf6, 0xe5, 0xfb, 0x12, 0xb4, 0x91, ++ 0x3e, 0xfe, 0xa6, 0xbd, 0xbb, 0x05, 0x76, 0xef, 0x7a, 0x35, 0x9f, 0x09, ++ 0x67, 0x58, 0x66, 0x4f, 0x70, 0xec, 0x41, 0xe8, 0xf2, 0xa8, 0x92, 0xdb, ++ 0x62, 0xf9, 0x52, 0x34, 0x0c, 0x9d, 0x1c, 0xde, 0x4a, 0x7a, 0x7e, 0x54, ++ 0x6e, 0xb3, 0xa7, 0xe5, 0x76, 0xc8, 0xce, 0x98, 0xed, 0xc8, 0x38, 0x78, ++ 0xb1, 0xd3, 0x86, 0xdd, 0x51, 0x98, 0xba, 0x15, 0x7e, 0x18, 0xc7, 0xe6, ++ 0xbd, 0x74, 0xb6, 0xf5, 0xf0, 0xe4, 0xd7, 0xeb, 0x1e, 0x8d, 0x32, 0x0b, ++ 0x1d, 0x1d, 0xa4, 0xcd, 0x84, 0xb3, 0x5d, 0xdb, 0xd9, 0x4e, 0xc9, 0xaa, ++ 0x7a, 0xdb, 0x95, 0x3d, 0x2e, 0x2e, 0xdd, 0x85, 0x14, 0xb6, 0x79, 0x09, ++ 0xfa, 0x06, 0x18, 0xbc, 0x58, 0xdb, 0x86, 0x3c, 0x6c, 0xe8, 0x52, 0x0a, ++ 0xe9, 0x47, 0x91, 0xb2, 0xee, 0x8f, 0xdb, 0xbd, 0xd8, 0xee, 0xfa, 0xbb, ++ 0x41, 0x62, 0x7c, 0x4c, 0xe1, 0xd4, 0x2b, 0xea, 0x3e, 0x19, 0xf4, 0xc9, ++ 0x64, 0x06, 0x7a, 0xa5, 0x03, 0x18, 0xa8, 0x74, 0x32, 0x9e, 0x1c, 0x37, ++ 0x76, 0xc8, 0xc7, 0xe1, 0xdb, 0x57, 0x1d, 0xf2, 0x72, 0x9b, 0x7c, 0xfa, ++ 0x66, 0xca, 0xc8, 0x0e, 0x99, 0xb9, 0xd9, 0x90, 0x99, 0xe1, 0x78, 0x9a, ++ 0xf3, 0xbe, 0xe1, 0x26, 0xdf, 0xbf, 0xee, 0x9f, 0x48, 0x18, 0x23, 0xf2, ++ 0x30, 0x64, 0xac, 0x00, 0xf9, 0x1a, 0xaf, 0x93, 0xe6, 0xd4, 0xf7, 0xd4, ++ 0xf3, 0x49, 0x60, 0x67, 0x1f, 0xfb, 0xd9, 0x52, 0xaa, 0xb7, 0x48, 0xec, ++ 0x5a, 0xc6, 0x97, 0x63, 0xde, 0x99, 0xc7, 0xb5, 0x94, 0x09, 0xf8, 0x24, ++ 0xd7, 0x7a, 0xfb, 0x53, 0xdd, 0xe7, 0x52, 0xcf, 0x11, 0xfa, 0xc3, 0x2e, ++ 0x71, 0x9e, 0x77, 0xcf, 0x9f, 0x36, 0x82, 0xe9, 0x3d, 0x1d, 0x0d, 0x7c, ++ 0xd7, 0x49, 0x7f, 0xc2, 0xe8, 0xf0, 0xca, 0x37, 0x92, 0x45, 0x3f, 0x0e, ++ 0x57, 0xc1, 0x9a, 0x69, 0xd3, 0xe3, 0x16, 0x75, 0x61, 0x97, 0xbd, 0x5b, ++ 0x9e, 0x86, 0x7d, 0xff, 0x4e, 0xc3, 0xbe, 0xef, 0x01, 0x3d, 0xd6, 0x63, ++ 0x00, 0xdb, 0xba, 0x03, 0x6b, 0x99, 0x00, 0x3f, 0x6f, 0xc7, 0xef, 0xb6, ++ 0xf2, 0x9a, 0xb8, 0xde, 0x7c, 0x01, 0x78, 0xb2, 0xc5, 0x66, 0x7f, 0x6b, ++ 0xe2, 0x7b, 0x85, 0xbc, 0x34, 0x62, 0x87, 0xa3, 0x57, 0x85, 0x76, 0xef, ++ 0x0d, 0x09, 0x0d, 0xd8, 0x6f, 0xf4, 0x19, 0xf6, 0x93, 0xa6, 0xc1, 0x73, ++ 0x66, 0x47, 0xce, 0xd6, 0x89, 0xc3, 0x2e, 0x8b, 0x79, 0x9e, 0x18, 0xec, ++ 0x79, 0x15, 0x93, 0xaa, 0x96, 0x7f, 0x8c, 0x14, 0xf5, 0xa1, 0x1f, 0x03, ++ 0x5e, 0xdc, 0x42, 0x61, 0x15, 0xea, 0xd9, 0xdb, 0xc1, 0x87, 0x59, 0xfc, ++ 0xfa, 0xb6, 0xde, 0x88, 0xfd, 0x4b, 0x39, 0x65, 0x2c, 0x6c, 0xc0, 0xda, ++ 0x6a, 0xf0, 0xdd, 0x46, 0x71, 0xb1, 0x9f, 0x48, 0xf0, 0x38, 0x6c, 0x9d, ++ 0x49, 0xfd, 0xc0, 0x75, 0xd0, 0x4e, 0x5a, 0xb2, 0x78, 0x82, 0x7b, 0x7d, ++ 0xa3, 0xfa, 0x7e, 0x5d, 0x7f, 0x2d, 0xca, 0x6e, 0xa4, 0xf3, 0x8c, 0x79, ++ 0x96, 0xc9, 0x03, 0x07, 0x3c, 0x70, 0xe5, 0xa4, 0xd3, 0x05, 0xbd, 0x1d, ++ 0x91, 0xc0, 0x49, 0xde, 0x03, 0x22, 0xce, 0x1b, 0x02, 0xe6, 0xda, 0xac, ++ 0x71, 0x43, 0x44, 0x82, 0x27, 0x7b, 0xa5, 0x15, 0xb8, 0xba, 0xe5, 0x28, ++ 0x6d, 0x64, 0x22, 0x36, 0x06, 0xa6, 0x05, 0xd5, 0xdd, 0xc4, 0xf8, 0xe8, ++ 0x6b, 0x32, 0x14, 0x7b, 0x4d, 0x88, 0x97, 0xae, 0x82, 0x7f, 0x71, 0xe7, ++ 0xf2, 0x06, 0xf5, 0x8b, 0xab, 0xf5, 0x21, 0x47, 0x8c, 0xb5, 0xb1, 0x0d, ++ 0x63, 0x6f, 0x89, 0xd1, 0x9f, 0x32, 0xe6, 0x06, 0xdf, 0xb3, 0xe5, 0x9c, ++ 0x37, 0x07, 0x73, 0xb9, 0x5b, 0xaa, 0xa7, 0xb9, 0x47, 0x19, 0x77, 0xb1, ++ 0x3c, 0xbf, 0xb5, 0x4c, 0xff, 0x95, 0xef, 0x63, 0xfa, 0x7d, 0x9f, 0x7e, ++ 0x4f, 0xff, 0xb4, 0xe0, 0xb6, 0x80, 0xa6, 0x3b, 0xa1, 0x3f, 0xef, 0xda, ++ 0x66, 0x2b, 0xdc, 0x70, 0x57, 0x83, 0x67, 0xbb, 0xc4, 0x3c, 0x06, 0xbf, ++ 0xb5, 0x7c, 0x50, 0xec, 0xad, 0x2b, 0xc9, 0xa0, 0x4c, 0x81, 0x17, 0xcc, ++ 0xa7, 0x39, 0x9f, 0xe4, 0x61, 0xd9, 0xaf, 0x78, 0x53, 0x3d, 0x11, 0x3f, ++ 0x12, 0x33, 0x66, 0xc5, 0xac, 0xf2, 0xf9, 0xf3, 0x48, 0x0f, 0x03, 0xef, ++ 0x78, 0xb1, 0x4c, 0xb3, 0xba, 0x96, 0x96, 0xc0, 0x18, 0xd6, 0xce, 0x35, ++ 0x71, 0xad, 0xd5, 0x98, 0x17, 0xdf, 0x8f, 0xa9, 0xf7, 0xc9, 0x35, 0x71, ++ 0xaf, 0xac, 0x49, 0x2c, 0xe3, 0xbf, 0x27, 0x2f, 0xc8, 0x2f, 0xd8, 0xe2, ++ 0x13, 0x7e, 0x0c, 0xac, 0x53, 0xf3, 0x85, 0xfc, 0x29, 0xc9, 0x45, 0x2b, ++ 0x3e, 0x41, 0xf9, 0xfb, 0x83, 0x6d, 0xd7, 0x49, 0xae, 0x87, 0xf1, 0xb7, ++ 0xe6, 0x39, 0xac, 0x8f, 0xab, 0x35, 0x8f, 0xbf, 0x3e, 0x1e, 0xc7, 0xb1, ++ 0xbd, 0x98, 0x5b, 0x66, 0x4d, 0xcc, 0xad, 0x79, 0x3c, 0x8e, 0xb5, 0x19, ++ 0xfe, 0x53, 0xc1, 0x8d, 0xd8, 0xe4, 0x51, 0x7f, 0x6c, 0x81, 0xf9, 0xaf, ++ 0x99, 0xe0, 0x63, 0x04, 0x76, 0x84, 0xbc, 0xf4, 0xcf, 0xa2, 0xc9, 0xd3, ++ 0x44, 0xec, 0xb0, 0xc7, 0xcf, 0x51, 0x8f, 0xef, 0x1e, 0xff, 0x2f, 0x37, ++ 0xf8, 0x48, 0xfb, 0x40, 0x3e, 0xf6, 0x88, 0x40, 0xcf, 0x9a, 0x47, 0xc9, ++ 0x43, 0xa6, 0xe4, 0x21, 0xdf, 0x91, 0x87, 0x7d, 0xfa, 0x1d, 0xf9, 0x07, ++ 0x9c, 0xf6, 0x15, 0x60, 0x0c, 0x27, 0xa3, 0xbe, 0xe9, 0xe9, 0x1b, 0xf0, ++ 0xf7, 0x62, 0x52, 0x1e, 0x5f, 0x6c, 0x13, 0x2b, 0xe5, 0xad, 0x6b, 0x7a, ++ 0x4d, 0xfc, 0x9d, 0xe7, 0x59, 0xc3, 0xc4, 0x9e, 0xfe, 0xba, 0xa2, 0x5c, ++ 0xd7, 0x7e, 0x79, 0x45, 0xf2, 0xa5, 0x20, 0x7c, 0xc0, 0x24, 0x70, 0xce, ++ 0x30, 0xf4, 0x2d, 0xe3, 0xa5, 0x28, 0xab, 0x11, 0xaf, 0xd0, 0xd6, 0x25, ++ 0xb1, 0x57, 0xa8, 0x83, 0x89, 0x47, 0x5e, 0x92, 0x6c, 0xc5, 0xd7, 0x31, ++ 0xe8, 0xdf, 0xf4, 0xfb, 0x27, 0x9d, 0xd3, 0x37, 0x5c, 0x23, 0x2b, 0xb1, ++ 0x6b, 0x24, 0x1e, 0x5b, 0x92, 0x55, 0xbe, 0x4e, 0x6f, 0x4c, 0x77, 0xe7, ++ 0xae, 0xc0, 0xaa, 0x6c, 0x4c, 0x6f, 0xc0, 0xfb, 0xbd, 0xe2, 0xbf, 0xf7, ++ 0x79, 0xbf, 0x21, 0x1f, 0x0a, 0x2f, 0x0a, 0x79, 0x41, 0x1a, 0x10, 0x0f, ++ 0x87, 0xe4, 0x9f, 0x45, 0xb8, 0x1f, 0x0b, 0xea, 0xbc, 0x33, 0x61, 0x0e, ++ 0x28, 0x9d, 0x31, 0xe6, 0x78, 0xf2, 0x5a, 0xc0, 0x38, 0xe1, 0xfe, 0x7f, ++ 0xee, 0x8e, 0x45, 0xe0, 0xe7, 0xf6, 0x53, 0xbf, 0xf8, 0x7b, 0xba, 0x4d, ++ 0xed, 0xe9, 0x2f, 0x3b, 0x86, 0x14, 0x6d, 0x43, 0x66, 0xed, 0x83, 0x0a, ++ 0xe3, 0xff, 0x43, 0xf4, 0xf5, 0x69, 0xdd, 0xd7, 0xac, 0x0c, 0x68, 0xfd, ++ 0x73, 0x00, 0x72, 0xee, 0xca, 0x27, 0x9c, 0x6d, 0xf2, 0x07, 0x5d, 0xdc, ++ 0x03, 0xfe, 0xfa, 0x0f, 0x4a, 0xff, 0xb6, 0x95, 0x18, 0x3c, 0x83, 0x1b, ++ 0x42, 0x0d, 0x1a, 0x70, 0x9f, 0xf9, 0xf2, 0xed, 0xd1, 0xc1, 0x5b, 0xff, ++ 0x9a, 0xb5, 0xea, 0x75, 0x72, 0xcd, 0xac, 0xc7, 0xb5, 0x7a, 0x58, 0x7e, ++ 0x75, 0xad, 0x7e, 0xfd, 0x0e, 0xc8, 0x52, 0x3c, 0x26, 0x46, 0x33, 0x6d, ++ 0x1a, 0x3a, 0x6a, 0x82, 0x31, 0x13, 0x7e, 0x3b, 0x10, 0x33, 0xfc, 0xd8, ++ 0xb4, 0x87, 0x75, 0xfb, 0x80, 0xc3, 0xed, 0x81, 0x81, 0x64, 0x5e, 0xc5, ++ 0x4c, 0x4d, 0xb5, 0xae, 0x59, 0x60, 0xb2, 0x45, 0xe7, 0x45, 0xf7, 0x73, ++ 0xc0, 0xac, 0x39, 0xb9, 0x5f, 0x02, 0x6b, 0x62, 0xbb, 0xc8, 0x9f, 0x67, ++ 0x7c, 0x37, 0x1e, 0x4b, 0x83, 0xc7, 0x7f, 0x0c, 0x1f, 0xbe, 0x0a, 0xbd, ++ 0xff, 0x49, 0xda, 0x86, 0x32, 0xec, 0x05, 0x70, 0xc9, 0x77, 0xde, 0x11, ++ 0xc3, 0xe7, 0x9a, 0x62, 0xbb, 0x1e, 0x3e, 0xbd, 0xa8, 0x30, 0x29, 0x71, ++ 0xfb, 0x11, 0xe3, 0x8e, 0xc1, 0x00, 0xfc, 0x8c, 0x82, 0x1b, 0xb6, 0x89, ++ 0xe3, 0x0e, 0xca, 0x6d, 0xe0, 0xcf, 0xd9, 0xc5, 0x82, 0xb1, 0xb3, 0xec, ++ 0xcb, 0x2a, 0xfc, 0xca, 0x7a, 0x3c, 0x79, 0x09, 0xf4, 0x78, 0x54, 0x63, ++ 0x3e, 0x9e, 0xdf, 0x54, 0xb5, 0xcf, 0xc2, 0x58, 0x51, 0xb1, 0x7e, 0x50, ++ 0xe6, 0x1c, 0xd3, 0xbb, 0x4f, 0x16, 0x49, 0x5f, 0xd7, 0xda, 0xa0, 0x51, ++ 0xdc, 0x82, 0xcf, 0x97, 0xa4, 0xfe, 0xae, 0xea, 0xf3, 0x8f, 0x47, 0x95, ++ 0x7c, 0xf9, 0x71, 0x62, 0xfa, 0x47, 0x3c, 0xbf, 0xea, 0xb7, 0x26, 0xf8, ++ 0x5c, 0xa1, 0x0c, 0x28, 0x9f, 0x09, 0xb4, 0xbc, 0x57, 0xd2, 0x53, 0x31, ++ 0x85, 0x5b, 0x1e, 0x2a, 0x73, 0xbf, 0x10, 0xff, 0xbf, 0x02, 0xec, 0x1f, ++ 0x04, 0xcf, 0xe8, 0x07, 0x70, 0x6c, 0xee, 0x0b, 0x94, 0xd5, 0xac, 0xdf, ++ 0xb1, 0x2f, 0x16, 0x3b, 0x89, 0x31, 0x9e, 0x29, 0xf3, 0x6c, 0x2c, 0x1e, ++ 0x5b, 0x11, 0x3f, 0x96, 0xae, 0xb0, 0x60, 0x21, 0x13, 0x30, 0x24, 0x71, ++ 0xfc, 0x5f, 0x42, 0x86, 0xfe, 0x08, 0x3e, 0x12, 0xeb, 0x89, 0x3a, 0xcf, ++ 0x1a, 0x03, 0xe6, 0x32, 0xed, 0xf7, 0x48, 0xd1, 0x0a, 0x49, 0x51, 0xdd, ++ 0xd5, 0xe4, 0xf9, 0x6e, 0x40, 0xc5, 0x76, 0x8a, 0x16, 0x31, 0xff, 0x52, ++ 0xa7, 0x67, 0xeb, 0xbb, 0x91, 0x67, 0x3b, 0xe6, 0x59, 0x3e, 0x2b, 0xa1, ++ 0xe3, 0x07, 0xa4, 0xe5, 0xf8, 0xfd, 0xd2, 0x7a, 0x8c, 0x18, 0x8f, 0xb1, ++ 0x7c, 0xf3, 0x96, 0x56, 0x21, 0xe6, 0x6e, 0x07, 0x0f, 0x0f, 0xca, 0xcf, ++ 0x1d, 0x7f, 0x4e, 0x9f, 0xc5, 0x1c, 0x59, 0xc7, 0xcf, 0xfb, 0x78, 0xfc, ++ 0x16, 0xcc, 0x87, 0xeb, 0x8f, 0x69, 0xdc, 0x77, 0x4b, 0x93, 0xef, 0xda, ++ 0xa2, 0x7d, 0x57, 0xb6, 0x1b, 0xc5, 0x5a, 0x4e, 0x48, 0xc8, 0xf6, 0xdb, ++ 0xef, 0x40, 0xbd, 0x68, 0xd3, 0x9d, 0x08, 0xd6, 0xd1, 0x77, 0x04, 0x3a, ++ 0x89, 0x7b, 0x78, 0xfe, 0xce, 0x32, 0xef, 0x0e, 0x80, 0x59, 0x6d, 0x0f, ++ 0xac, 0x1d, 0x7f, 0x7b, 0x53, 0x5d, 0xbf, 0xcc, 0x6f, 0x13, 0xf2, 0x7c, ++ 0xfe, 0x91, 0x50, 0x53, 0xbb, 0xdd, 0x96, 0x97, 0x7a, 0xbe, 0x87, 0xe7, ++ 0x07, 0x71, 0x0d, 0xc9, 0x26, 0x9c, 0xd3, 0xec, 0x7b, 0xf0, 0x7b, 0x97, ++ 0x30, 0xfc, 0x56, 0xff, 0x5e, 0x99, 0x89, 0xb5, 0xc4, 0x0b, 0xf4, 0x5f, ++ 0x2c, 0xde, 0xcd, 0x5d, 0x28, 0xf0, 0x8c, 0x4e, 0xdd, 0x2d, 0xe2, 0x5d, ++ 0x0e, 0xd4, 0x8b, 0x79, 0xf8, 0x93, 0xf9, 0x28, 0x78, 0x7e, 0x53, 0xaf, ++ 0x99, 0xfa, 0xef, 0xd7, 0x65, 0x46, 0x88, 0x6f, 0xb6, 0xf0, 0x5c, 0x12, ++ 0xb8, 0x59, 0xdd, 0xf9, 0x83, 0x9c, 0xb5, 0xaa, 0x73, 0xa0, 0x62, 0x99, ++ 0xfe, 0x5c, 0x1e, 0xf2, 0xc3, 0xfb, 0x71, 0xf4, 0xfb, 0xf2, 0x3a, 0x3e, ++ 0xcb, 0x79, 0x12, 0xd3, 0xfb, 0xfe, 0x01, 0xfb, 0xdc, 0xe8, 0x9b, 0x47, ++ 0xdf, 0x67, 0xa3, 0xbc, 0x45, 0xd5, 0x9c, 0xc7, 0xd7, 0xf9, 0x2b, 0x87, ++ 0xa1, 0x0b, 0x16, 0x21, 0xcf, 0x7b, 0xa1, 0x03, 0xc7, 0x02, 0xdc, 0x9f, ++ 0x6d, 0xda, 0x97, 0xb5, 0xe9, 0xb7, 0x1b, 0x53, 0xe8, 0xc3, 0x3c, 0xf6, ++ 0xaa, 0xcc, 0x42, 0xff, 0xcf, 0xd5, 0x13, 0xea, 0x9b, 0x9d, 0x74, 0x94, ++ 0x77, 0xc2, 0x58, 0xfe, 0x5e, 0x8c, 0xff, 0x2a, 0xf0, 0x70, 0x3b, 0xe8, ++ 0x69, 0x6a, 0x5e, 0x7d, 0x48, 0xc7, 0xa2, 0xc2, 0x8c, 0xcd, 0x43, 0x6f, ++ 0x16, 0x3d, 0xac, 0x19, 0x99, 0x43, 0xfa, 0xef, 0x35, 0xb6, 0xfc, 0xd0, ++ 0x16, 0x4f, 0xde, 0x78, 0x0f, 0xfc, 0x90, 0x8a, 0x41, 0x7a, 0x6b, 0x8a, ++ 0x6b, 0x5f, 0x25, 0x04, 0x99, 0xe3, 0xba, 0xde, 0x8f, 0x7a, 0x94, 0xb5, ++ 0x41, 0x7d, 0x56, 0xdb, 0xa6, 0xf4, 0x63, 0x16, 0xb2, 0x94, 0x57, 0x7e, ++ 0x04, 0xf0, 0xbd, 0xc3, 0x76, 0xd7, 0x6f, 0xe1, 0x59, 0x68, 0x8b, 0xad, ++ 0x7c, 0x8b, 0x9e, 0x80, 0xf8, 0x65, 0xb7, 0xa2, 0x8c, 0x72, 0xf6, 0x1e, ++ 0xf0, 0x86, 0x65, 0x19, 0xe4, 0x39, 0xd6, 0x75, 0x7a, 0x1c, 0x8e, 0xf1, ++ 0x70, 0xfb, 0xda, 0x39, 0x71, 0x2d, 0x3d, 0x7a, 0x2d, 0x2d, 0xfc, 0x26, ++ 0x45, 0x97, 0xbd, 0x47, 0x97, 0x05, 0xf5, 0xfa, 0xbe, 0xae, 0xbf, 0x69, ++ 0x88, 0x1f, 0x49, 0x37, 0xb0, 0x31, 0xe7, 0x17, 0xf6, 0x62, 0xbf, 0x96, ++ 0x27, 0x3b, 0x87, 0xc1, 0x8f, 0x60, 0xea, 0x21, 0x9e, 0xd1, 0x82, 0xbe, ++ 0xfe, 0x9e, 0x88, 0x2a, 0xbf, 0x33, 0x66, 0x7a, 0x77, 0x99, 0x2e, 0xae, ++ 0xf9, 0x9e, 0xc0, 0xbf, 0x0f, 0x6e, 0xcb, 0x54, 0x83, 0x57, 0xe4, 0x1b, ++ 0xf9, 0xf5, 0xbb, 0x78, 0x45, 0x3e, 0x92, 0x5f, 0x79, 0x29, 0xce, 0x93, ++ 0x4f, 0x94, 0x97, 0x29, 0x25, 0x2f, 0xc5, 0x8a, 0x8f, 0x93, 0xa9, 0x4b, ++ 0xf8, 0xad, 0xc3, 0x46, 0xe7, 0xf7, 0xfe, 0x5d, 0xb1, 0xf7, 0x91, 0x7e, ++ 0xc6, 0xf8, 0xe0, 0x26, 0x59, 0x9c, 0x57, 0x3a, 0x05, 0x76, 0x31, 0xaa, ++ 0x74, 0x45, 0x7e, 0x9a, 0xf9, 0xfd, 0xa0, 0x11, 0xef, 0x97, 0xb0, 0xbc, ++ 0x47, 0xf3, 0xf5, 0x3d, 0xea, 0xbe, 0x13, 0xf7, 0x60, 0xb1, 0xf2, 0x05, ++ 0xf5, 0xfe, 0xec, 0x42, 0x8b, 0xaa, 0x7f, 0x76, 0x61, 0xfd, 0x9d, 0x25, ++ 0x96, 0xbd, 0x97, 0x71, 0x15, 0x59, 0x2a, 0xb5, 0xc8, 0xf2, 0xc2, 0x3e, ++ 0xfa, 0x89, 0xa9, 0xd6, 0xd5, 0xef, 0x3a, 0xd4, 0xb7, 0x71, 0xc5, 0x05, ++ 0x57, 0xc6, 0x21, 0x37, 0x8b, 0xa3, 0x73, 0x52, 0x1d, 0xa5, 0x1f, 0xa4, ++ 0xee, 0x12, 0x62, 0xbd, 0x2d, 0xc0, 0xc0, 0xc0, 0x85, 0x36, 0xe3, 0xcf, ++ 0x9b, 0xb5, 0x3e, 0x19, 0xe9, 0x68, 0xc4, 0xa5, 0x23, 0x05, 0xb7, 0x6a, ++ 0xfb, 0xdf, 0xca, 0xb0, 0x4f, 0x7e, 0x2f, 0x43, 0x9e, 0x99, 0x68, 0xcf, ++ 0x3b, 0x9a, 0xc0, 0xa9, 0xf6, 0xcb, 0x5a, 0xd7, 0x05, 0x50, 0x9f, 0xe9, ++ 0xad, 0x9a, 0xef, 0xff, 0x44, 0xa7, 0x0f, 0xca, 0xcc, 0x89, 0x2f, 0xf0, ++ 0x1e, 0xbe, 0xff, 0x8d, 0x63, 0xd3, 0xf7, 0x2d, 0x41, 0xfd, 0xad, 0xc6, ++ 0x83, 0x28, 0x63, 0x2c, 0xee, 0x41, 0xb5, 0x26, 0xde, 0xf5, 0x2b, 0xc8, ++ 0xbb, 0xdd, 0x59, 0xf1, 0xfd, 0x41, 0xde, 0xa7, 0x6a, 0xd3, 0xfd, 0xed, ++ 0xd4, 0xb2, 0x34, 0x2d, 0x33, 0xb0, 0x77, 0xf9, 0xf2, 0x17, 0xd5, 0x1d, ++ 0xb4, 0x5c, 0xa0, 0x79, 0x4c, 0x7f, 0x3f, 0x79, 0xb1, 0x06, 0xff, 0x2e, ++ 0x44, 0x40, 0xf9, 0x44, 0x8d, 0xb8, 0x85, 0x2e, 0x9f, 0x96, 0x7d, 0x65, ++ 0x15, 0xbf, 0x50, 0x67, 0x98, 0x73, 0xd0, 0x0b, 0x63, 0xca, 0xa6, 0x85, ++ 0x8d, 0xf1, 0x5a, 0x4a, 0xf2, 0xa7, 0x77, 0x61, 0x1c, 0xc6, 0x02, 0xd3, ++ 0xfa, 0xac, 0x70, 0x8f, 0xcc, 0xd4, 0xbd, 0xb1, 0xf7, 0x96, 0xf9, 0x3e, ++ 0x01, 0x9c, 0xc0, 0xf7, 0xd9, 0xa8, 0xf7, 0x0d, 0xe6, 0x8d, 0x68, 0xdb, ++ 0xa2, 0xe9, 0xcc, 0xfb, 0xd7, 0x6c, 0x4f, 0x1d, 0xf0, 0x06, 0x68, 0x95, ++ 0xc5, 0x7b, 0xb6, 0xf1, 0xfb, 0xdb, 0x0b, 0xbb, 0x45, 0xff, 0xfc, 0x01, ++ 0x59, 0xa9, 0xcc, 0xc9, 0xa5, 0x8a, 0x2f, 0xeb, 0xbc, 0x8b, 0xcd, 0xb9, ++ 0xdf, 0xa6, 0xbe, 0xb1, 0x7c, 0xa6, 0x9c, 0x06, 0x7f, 0xd6, 0xd2, 0x2a, ++ 0xbb, 0xe6, 0x3b, 0x1b, 0x8c, 0xa6, 0xbe, 0x55, 0xdc, 0xa1, 0xee, 0x74, ++ 0xad, 0xdd, 0x73, 0xec, 0x67, 0xd8, 0xe2, 0x59, 0x87, 0x77, 0x2f, 0xad, ++ 0xa7, 0xe9, 0x7d, 0x44, 0xdf, 0x05, 0xfb, 0xa8, 0xe5, 0xf1, 0x91, 0xf4, ++ 0x9c, 0xd2, 0xf3, 0x4d, 0x62, 0xff, 0xb3, 0xcf, 0x43, 0x9a, 0x6f, 0x48, ++ 0x17, 0x0f, 0xa9, 0x3b, 0x10, 0x59, 0x65, 0x1b, 0xfd, 0x7b, 0xa9, 0x3b, ++ 0x54, 0x99, 0xda, 0xf7, 0x8d, 0xf1, 0xd8, 0x8e, 0x76, 0xc9, 0xbf, 0x0b, ++ 0xce, 0xb2, 0x13, 0xfa, 0xae, 0xdf, 0xd9, 0xa6, 0x32, 0xff, 0x4e, 0x1a, ++ 0xe9, 0xc4, 0x58, 0x26, 0xd2, 0xfa, 0x94, 0x7e, 0x9e, 0x6a, 0xfa, 0x56, ++ 0xc6, 0xef, 0x33, 0xc8, 0x3e, 0xf4, 0xfd, 0xb2, 0xe6, 0xbb, 0xc5, 0xfc, ++ 0x3e, 0x88, 0x32, 0x68, 0xf2, 0x3b, 0x62, 0xfa, 0x7f, 0xc0, 0x6c, 0x9b, ++ 0x65, 0xaf, 0x9a, 0x4f, 0x41, 0xcf, 0x6f, 0x93, 0x8c, 0x59, 0x5e, 0x7e, ++ 0xef, 0xe2, 0x7a, 0xf9, 0x64, 0xf9, 0x67, 0x5b, 0xa5, 0xad, 0x80, 0x71, ++ 0xf8, 0x7e, 0xed, 0xf7, 0xa7, 0x9e, 0xed, 0xe2, 0xbe, 0x74, 0xd0, 0xc6, ++ 0x41, 0x9b, 0x2f, 0x53, 0xce, 0x0b, 0x85, 0xc6, 0x7d, 0xd1, 0x82, 0xf7, ++ 0x0d, 0x93, 0xe9, 0xdf, 0xdb, 0xe4, 0x37, 0xd2, 0x22, 0x17, 0x6a, 0xfc, ++ 0x3e, 0x69, 0x87, 0xba, 0x4f, 0xe3, 0x9d, 0x51, 0x72, 0x5e, 0xfd, 0xca, ++ 0x1e, 0x54, 0x6b, 0x45, 0xbc, 0xf3, 0x6d, 0x7a, 0x48, 0xdb, 0x74, 0xea, ++ 0xae, 0x09, 0xe8, 0xae, 0x07, 0x35, 0x3f, 0xd8, 0x3e, 0xad, 0xee, 0x79, ++ 0x7b, 0xe7, 0x62, 0x3e, 0xfd, 0x55, 0xdb, 0xf7, 0x07, 0x54, 0x9c, 0x53, ++ 0x7d, 0x83, 0x0d, 0xb9, 0xe4, 0x77, 0xd5, 0xd0, 0xed, 0x65, 0x7e, 0x3f, ++ 0x3d, 0x81, 0x94, 0xdf, 0x4e, 0xef, 0x52, 0xf7, 0xff, 0xab, 0xea, 0x9b, ++ 0x00, 0x5f, 0x0e, 0x03, 0x7a, 0xac, 0xe3, 0x18, 0xc3, 0xe3, 0x77, 0xbe, ++ 0xcc, 0x6f, 0xdf, 0xfd, 0xbb, 0xa6, 0xed, 0x2b, 0xdc, 0x0b, 0xa2, 0xfc, ++ 0x7b, 0xef, 0x9b, 0xeb, 0xaa, 0xfa, 0x8e, 0x20, 0xc6, 0xef, 0x07, 0x61, ++ 0xb7, 0x76, 0xe3, 0x99, 0xe7, 0xcb, 0x7b, 0x90, 0x42, 0xef, 0xd4, 0x72, ++ 0x48, 0xef, 0x97, 0xac, 0x8a, 0xf7, 0x75, 0x20, 0xbf, 0x57, 0x8d, 0x5d, ++ 0xac, 0xdd, 0x23, 0x33, 0xa7, 0xef, 0xe5, 0xf7, 0x12, 0xea, 0xdb, 0xef, ++ 0x8c, 0xc3, 0x39, 0x46, 0x64, 0x56, 0xad, 0xbb, 0xa0, 0x69, 0xef, 0x9f, ++ 0xc1, 0x3c, 0xab, 0xbe, 0xcd, 0x28, 0xd4, 0x3a, 0x30, 0x47, 0x43, 0xdf, ++ 0x37, 0xa5, 0x1f, 0xe0, 0xaf, 0xbf, 0x8d, 0x77, 0x18, 0x5d, 0xde, 0xe3, ++ 0x9d, 0x29, 0xf3, 0x3e, 0x69, 0x42, 0xc7, 0x07, 0x18, 0x33, 0xe4, 0xb9, ++ 0x04, 0x65, 0x9b, 0xdf, 0xe8, 0x66, 0x81, 0xd2, 0xa2, 0x3c, 0xe3, 0xd6, ++ 0x6b, 0xe9, 0x68, 0x5a, 0x0b, 0xef, 0xd0, 0x7a, 0xeb, 0xe1, 0xf7, 0x10, ++ 0xf9, 0x72, 0xf3, 0x37, 0x15, 0xea, 0x1b, 0x74, 0x7e, 0x3b, 0x23, 0xb9, ++ 0xda, 0x7d, 0x72, 0x77, 0x79, 0xb3, 0xfe, 0x9e, 0x22, 0x2c, 0x77, 0xd7, ++ 0x5e, 0x55, 0x34, 0xcd, 0xab, 0xef, 0x3a, 0x42, 0x9a, 0x67, 0xfe, 0x37, ++ 0x15, 0x5e, 0x7f, 0xfb, 0xf8, 0xbd, 0x76, 0x03, 0x4b, 0x84, 0x24, 0xb7, ++ 0xf8, 0xe7, 0xc1, 0x8d, 0xbf, 0x65, 0x78, 0x40, 0x32, 0xa7, 0x69, 0x9b, ++ 0xe7, 0xe4, 0xa1, 0x8a, 0xeb, 0xde, 0xe6, 0x10, 0x53, 0xb6, 0xcb, 0xa5, ++ 0xc8, 0xd4, 0xce, 0x9f, 0xda, 0xdd, 0x46, 0x75, 0xbe, 0x15, 0x3a, 0x97, ++ 0x38, 0x46, 0xda, 0x98, 0x5f, 0x9c, 0xe7, 0xfe, 0x0c, 0x62, 0x8d, 0x71, ++ 0xeb, 0xaa, 0xfc, 0xd6, 0x62, 0xbc, 0xed, 0x36, 0xf8, 0xb0, 0x9f, 0x72, ++ 0x3c, 0x3d, 0xfd, 0xa5, 0xa5, 0x5d, 0xf2, 0xa5, 0x5a, 0xd8, 0xa8, 0x96, ++ 0x78, 0xef, 0x30, 0x3e, 0x51, 0x91, 0x04, 0xea, 0xb1, 0x7f, 0xc8, 0x4b, ++ 0xf4, 0x1a, 0xf9, 0xc6, 0x89, 0xb7, 0xdc, 0xab, 0x36, 0xde, 0x43, 0xc7, ++ 0x5c, 0x72, 0xfc, 0x98, 0xe2, 0x14, 0x7c, 0x56, 0xd6, 0xbb, 0x06, 0x72, ++ 0x00, 0xcc, 0x80, 0x3d, 0x47, 0xff, 0xf6, 0xaa, 0xd6, 0x57, 0xe6, 0xd1, ++ 0xeb, 0xe5, 0x6a, 0xe3, 0xde, 0xf2, 0x2b, 0x90, 0xed, 0x98, 0x47, 0x7f, ++ 0x15, 0x83, 0x3f, 0x20, 0x81, 0xaf, 0xc0, 0x96, 0x7c, 0xa5, 0x45, 0xe9, ++ 0x74, 0xda, 0x34, 0xf8, 0x3e, 0xf0, 0x6f, 0x82, 0xe8, 0xe7, 0xaf, 0xb5, ++ 0xcc, 0xce, 0x89, 0x7c, 0x6d, 0x93, 0xa4, 0xbb, 0xe8, 0x3f, 0xcb, 0xbb, ++ 0xe8, 0xad, 0xe6, 0x7d, 0x96, 0x94, 0xaf, 0x73, 0x8f, 0xd7, 0xb9, 0x96, ++ 0x44, 0xf4, 0xbf, 0xca, 0xe7, 0x24, 0x17, 0xe5, 0x5a, 0x1e, 0x90, 0x42, ++ 0xe5, 0x10, 0x7e, 0x5c, 0x27, 0xe7, 0x3d, 0xa9, 0xef, 0x34, 0x4c, 0x49, ++ 0xb1, 0x94, 0x92, 0xd9, 0x85, 0xbd, 0xfc, 0xd6, 0x74, 0xe2, 0x36, 0x75, ++ 0xb6, 0x17, 0x8f, 0x26, 0x8c, 0xa1, 0xd8, 0x2c, 0xef, 0x70, 0xa8, 0xf5, ++ 0xec, 0xc5, 0x7a, 0xfe, 0xa8, 0x8b, 0x77, 0xd7, 0xaf, 0x42, 0xef, 0x9a, ++ 0x27, 0x29, 0x87, 0x71, 0xab, 0xcf, 0x60, 0x7e, 0x0f, 0xfc, 0x76, 0x96, ++ 0xed, 0x91, 0xc0, 0xd1, 0x86, 0x7e, 0x47, 0xb9, 0x3e, 0x63, 0x56, 0xed, ++ 0x3f, 0x89, 0xb6, 0xa8, 0x77, 0xd4, 0x6f, 0xeb, 0xd7, 0x61, 0x5b, 0xae, ++ 0x73, 0x97, 0xb4, 0x9e, 0xf3, 0xe7, 0x05, 0x39, 0x8c, 0x36, 0xd3, 0xbb, ++ 0x6d, 0x1d, 0xbd, 0x83, 0xc4, 0xba, 0xa0, 0x17, 0x69, 0x1c, 0xd0, 0x34, ++ 0x2e, 0xa0, 0x7f, 0x9f, 0x07, 0xb7, 0xa1, 0xcc, 0xd2, 0xdf, 0x24, 0xfd, ++ 0x3e, 0x74, 0x27, 0xcd, 0x59, 0xff, 0xaf, 0xf5, 0x77, 0x4d, 0x9c, 0xcf, ++ 0x46, 0x34, 0x5f, 0xee, 0xf2, 0xf8, 0xb2, 0x07, 0xf4, 0xe2, 0xfd, 0xd2, ++ 0x21, 0xf5, 0x9d, 0x41, 0x7a, 0x7a, 0x0f, 0x64, 0xc7, 0x5f, 0xd7, 0x10, ++ 0x64, 0x8c, 0xe7, 0x25, 0xac, 0xdf, 0x4c, 0x13, 0xcf, 0xde, 0x05, 0x18, ++ 0xf3, 0xb0, 0xb9, 0x56, 0xe0, 0xd1, 0xaf, 0xd1, 0x36, 0xf1, 0x3b, 0xf7, ++ 0xf7, 0x6a, 0xdb, 0xf4, 0x6e, 0x3c, 0xfe, 0x5e, 0x97, 0x67, 0x9b, 0x2c, ++ 0xd0, 0xa4, 0x53, 0xb7, 0xd9, 0x03, 0x6c, 0xcc, 0x38, 0x70, 0x22, 0xfa, ++ 0x69, 0xf1, 0xc7, 0x71, 0x77, 0xd0, 0xdf, 0x1d, 0x1b, 0x19, 0x02, 0x5a, ++ 0x51, 0x77, 0x77, 0xa2, 0xbc, 0x0b, 0x94, 0x30, 0xf6, 0xa8, 0x7b, 0x1c, ++ 0x6b, 0xbf, 0x23, 0x49, 0xca, 0x37, 0x56, 0x65, 0x65, 0xe2, 0x17, 0x12, ++ 0x97, 0xd8, 0x75, 0x94, 0x15, 0xf6, 0xbb, 0x97, 0xeb, 0x8c, 0xde, 0xab, ++ 0xd6, 0x69, 0xc1, 0x7f, 0xe4, 0x9d, 0x0b, 0xcb, 0xa8, 0x2e, 0x90, 0xef, ++ 0x48, 0x97, 0xf8, 0xec, 0x9f, 0xf3, 0x2a, 0xbd, 0x82, 0x71, 0x59, 0x46, ++ 0xdd, 0xc8, 0xf7, 0x29, 0x7d, 0x0e, 0xfc, 0x1f, 0x28, 0x37, 0x98, 0x97, ++ 0x65, 0x54, 0x96, 0x36, 0x9e, 0xdb, 0xa7, 0x94, 0x1c, 0x3c, 0x00, 0xba, ++ 0xf7, 0x75, 0x4b, 0xdb, 0x21, 0xa4, 0x5c, 0x63, 0xaa, 0xc1, 0x77, 0xd2, ++ 0xfb, 0x63, 0x32, 0x0a, 0xb9, 0x60, 0xfe, 0x01, 0xe0, 0x4c, 0xda, 0x51, ++ 0xa4, 0x15, 0x3e, 0x53, 0xd7, 0xdb, 0xfa, 0x5e, 0x15, 0xe7, 0xb2, 0x07, ++ 0x73, 0x51, 0xeb, 0xd4, 0xf2, 0xb4, 0x5b, 0xb7, 0x9b, 0x6e, 0xd0, 0xea, ++ 0xde, 0xb7, 0xe1, 0x8c, 0x50, 0x03, 0x67, 0x78, 0x63, 0x6d, 0xea, 0xf6, ++ 0x31, 0x86, 0xb7, 0x06, 0x0f, 0x63, 0x78, 0x72, 0xbe, 0x57, 0x82, 0x90, ++ 0xe3, 0xc0, 0xaa, 0x1c, 0x03, 0xef, 0x78, 0x7b, 0x66, 0x96, 0xe7, 0x97, ++ 0x8a, 0xce, 0x94, 0x43, 0xca, 0x2f, 0xf9, 0xd8, 0xcc, 0xeb, 0x0f, 0xff, ++ 0x0e, 0x5e, 0x7f, 0xbc, 0xdb, 0xc7, 0x0d, 0x7f, 0xbf, 0x7d, 0x90, 0xe9, ++ 0x5e, 0xdd, 0x07, 0xd7, 0xff, 0x3f, 0xda, 0x07, 0xeb, 0xe5, 0xb2, 0x59, ++ 0xa6, 0x2c, 0xc8, 0x13, 0xf9, 0x45, 0x79, 0xa2, 0x1c, 0x91, 0x96, 0xd4, ++ 0xa7, 0xad, 0xf4, 0xdb, 0xa2, 0x57, 0xd4, 0x37, 0x24, 0x73, 0xd0, 0x41, ++ 0xdd, 0x46, 0xa5, 0x12, 0x91, 0xe2, 0xd2, 0x53, 0x4a, 0xa6, 0xbf, 0x51, ++ 0xa7, 0x5e, 0x7a, 0xa7, 0xb5, 0xaf, 0xd5, 0xb9, 0xf9, 0x75, 0x3a, 0x37, ++ 0xdf, 0xd0, 0xb9, 0x5d, 0x1a, 0x4b, 0xfd, 0x7d, 0x74, 0x6e, 0xa4, 0xe9, ++ 0x4c, 0xc8, 0x3f, 0x0f, 0x12, 0x23, 0x33, 0xd8, 0x26, 0x3b, 0x61, 0x47, ++ 0x26, 0x4a, 0xbb, 0xe4, 0x4f, 0x4b, 0x73, 0xea, 0xbe, 0xd4, 0x8f, 0x9c, ++ 0x44, 0xf4, 0x1e, 0xc3, 0x95, 0x8f, 0xc1, 0xd7, 0xce, 0xf5, 0xb6, 0xc8, ++ 0xce, 0x9b, 0xd4, 0x39, 0xa7, 0x95, 0x31, 0x7a, 0x84, 0x11, 0xf8, 0xac, ++ 0x13, 0x77, 0x62, 0x06, 0xef, 0xce, 0xb5, 0x4a, 0x2e, 0xd2, 0x21, 0xbb, ++ 0x80, 0x9d, 0x0a, 0xd7, 0x12, 0xf7, 0xb4, 0xab, 0xef, 0x92, 0x9e, 0x29, ++ 0xd7, 0x34, 0xdf, 0x41, 0x87, 0x4e, 0x4b, 0xbe, 0x59, 0xaf, 0x75, 0x7b, ++ 0xff, 0x03, 0x65, 0xdb, 0xba, 0x3c, 0x9f, 0xef, 0x84, 0x1f, 0x17, 0x01, ++ 0xad, 0x9a, 0xef, 0x21, 0x05, 0x14, 0x3d, 0x8b, 0x95, 0x69, 0x75, 0xbf, ++ 0xeb, 0x4a, 0x80, 0xf4, 0x52, 0xbe, 0x53, 0x34, 0x13, 0x00, 0xc6, 0x99, ++ 0x07, 0x82, 0xb6, 0xe9, 0x6f, 0x6a, 0xdc, 0x09, 0xfd, 0x3f, 0xa3, 0xce, ++ 0x95, 0x57, 0x40, 0x1b, 0x57, 0xc5, 0x9d, 0xf3, 0x11, 0xe2, 0xf9, 0xd5, ++ 0xbb, 0xcc, 0x6f, 0xc7, 0xf5, 0x0a, 0xd3, 0xfb, 0x67, 0x20, 0x3a, 0x4e, ++ 0xa5, 0xfd, 0x7f, 0x75, 0xa6, 0xb7, 0x9e, 0x56, 0xbe, 0xdf, 0xcf, 0xef, ++ 0xf8, 0x89, 0xed, 0xe2, 0x47, 0x2a, 0xf2, 0xb8, 0xf2, 0x41, 0xd3, 0xa4, ++ 0x6f, 0x15, 0x7c, 0x3a, 0x16, 0xf5, 0xed, 0xb9, 0xd1, 0x77, 0xbe, 0xd9, ++ 0x07, 0x65, 0x1f, 0x61, 0x75, 0x17, 0x64, 0xf5, 0xff, 0xf0, 0x30, 0xb6, ++ 0x94, 0x36, 0xee, 0x28, 0xcf, 0x49, 0xe0, 0xf8, 0x94, 0x04, 0x8f, 0x31, ++ 0x8e, 0x9f, 0x96, 0x62, 0xc4, 0x95, 0xbb, 0x9d, 0xb5, 0x3e, 0x49, 0x9f, ++ 0xb9, 0x7e, 0xee, 0x0f, 0xc8, 0xd8, 0xe9, 0x43, 0x12, 0x3a, 0xce, 0x77, ++ 0x6b, 0xce, 0x70, 0xa0, 0x8f, 0xda, 0xa5, 0x12, 0x61, 0x2c, 0x3b, 0xa4, ++ 0xce, 0xc4, 0x2f, 0x4d, 0xbf, 0x1a, 0x2a, 0x02, 0x2b, 0xe4, 0x95, 0x6e, ++ 0x41, 0xda, 0xf0, 0x21, 0xda, 0xaf, 0xe1, 0x9e, 0x82, 0x9f, 0x69, 0xe4, ++ 0x2a, 0x21, 0x75, 0x37, 0xe9, 0x52, 0x84, 0x75, 0x0f, 0xc1, 0xdf, 0x26, ++ 0xce, 0x80, 0xee, 0x98, 0x92, 0x36, 0xe6, 0x03, 0xc7, 0x57, 0x71, 0x06, ++ 0x75, 0xc2, 0x98, 0x13, 0x91, 0xe0, 0x19, 0x6f, 0xed, 0xfc, 0xe7, 0x3d, ++ 0xe6, 0xa9, 0x5d, 0x12, 0x38, 0xc6, 0xe7, 0x66, 0x3f, 0x88, 0xd8, 0x1d, ++ 0xb6, 0xe1, 0xfc, 0x17, 0xd1, 0x1f, 0xdf, 0xa5, 0xf5, 0x77, 0xb8, 0xc8, ++ 0x57, 0xff, 0xb6, 0xff, 0x13, 0x80, 0xb2, 0xff, 0x7f, 0x01, 0x5b, 0xff, ++ 0xfc, 0x9d, 0xcc, 0x4c, 0x00, 0x00, 0x00 }; + + static const u32 bnx2_COM_b06FwData[(0x0/4) + 1] = { 0x0 }; + static const u32 bnx2_COM_b06FwRodata[(0x14/4) + 1] = { +- 0x08000f04, 0x08000f4c, 0x08000f80, 0x08000fcc, 0x08001000, 0x00000000 ++ 0x08000d98, 0x08000de0, 0x08000e20, 0x08000e6c, 0x08000ea0, 0x00000000 + }; + + static struct fw_info bnx2_com_fw_06 = { +- /* Firmware version: 4.0.5 */ +- .ver_major = 0x4, +- .ver_minor = 0x0, +- .ver_fix = 0x5, +- +- .start_addr = 0x080000f8, ++ /* Firmware version: 5.0.0g */ ++ .ver_major = 0x5, ++ .ver_minor = 0x0, ++ .ver_fix = 0x0, ++ ++ .start_addr = 0x08000110, + + .text_addr = 0x08000000, +- .text_len = 0x4eac, ++ .text_len = 0x4cc8, + .text_index = 0x0, + .gz_text = bnx2_COM_b06FwText, + .gz_text_len = sizeof(bnx2_COM_b06FwText), +@@ -872,15 +874,15 @@ + .data_index = 0x0, + .data = bnx2_COM_b06FwData, + +- .sbss_addr = 0x08004ee0, ++ .sbss_addr = 0x08004d00, + .sbss_len = 0x38, + .sbss_index = 0x0, + +- .bss_addr = 0x08004f18, +- .bss_len = 0xbc, +- .bss_index = 0x0, +- +- .rodata_addr = 0x08004eac, ++ .bss_addr = 0x08004d38, ++ .bss_len = 0xc4, ++ .bss_index = 0x0, ++ ++ .rodata_addr = 0x08004cc8, + .rodata_len = 0x14, + .rodata_index = 0x0, + .rodata = bnx2_COM_b06FwRodata, +@@ -902,1232 +904,1242 @@ + .mips_view_base = 0x8000000, + }; + +- + static u8 bnx2_CP_b06FwText[] = { +- 0x9d, 0xbc, 0x0d, 0x78, 0x13, 0xe7, 0x99, 0x2e, 0x7c, 0xcf, 0x48, 0xb2, +- 0x65, 0x5b, 0xb6, 0xc7, 0xb6, 0x0c, 0x22, 0x65, 0x41, 0x83, 0x47, 0x20, +- 0x62, 0x27, 0x1d, 0x81, 0x49, 0x94, 0xac, 0x36, 0xa8, 0xc6, 0x01, 0x93, +- 0x90, 0xc6, 0x34, 0xb4, 0x75, 0x7a, 0xd2, 0x8d, 0x62, 0x0c, 0x21, 0x84, +- 0x10, 0x67, 0x9b, 0x9e, 0xe3, 0x7c, 0x5f, 0xce, 0x5a, 0x35, 0x06, 0x0c, +- 0xc8, 0x96, 0x31, 0x0e, 0x90, 0xfd, 0x7a, 0x9d, 0x18, 0x6c, 0x30, 0x49, +- 0x65, 0x8b, 0x34, 0x74, 0x97, 0xf4, 0xa3, 0x45, 0x07, 0xf2, 0xe3, 0xfc, +- 0x35, 0xa4, 0xed, 0x76, 0xdb, 0x3d, 0x39, 0x89, 0x0f, 0x25, 0x84, 0xb4, +- 0xdd, 0xfc, 0xb4, 0xdd, 0x2d, 0x69, 0x9b, 0xcc, 0x77, 0x3f, 0x23, 0x09, +- 0x0c, 0x4d, 0x7f, 0xf6, 0xf3, 0x75, 0xcd, 0x65, 0xcd, 0xcc, 0xfb, 0xf3, +- 0xbc, 0xcf, 0xfb, 0x3c, 0xf7, 0x73, 0x3f, 0xef, 0xbc, 0x33, 0xb3, 0x80, +- 0x62, 0xe4, 0xfe, 0x4a, 0x79, 0x5c, 0x5d, 0xdf, 0xbe, 0x1a, 0x8b, 0xae, +- 0x36, 0xe5, 0xdc, 0xe9, 0x82, 0x13, 0x7f, 0xe1, 0x9f, 0xff, 0x2f, 0x2d, +- 0x38, 0xe5, 0xcf, 0x01, 0x68, 0xf9, 0x7e, 0xe5, 0x80, 0x5b, 0x8d, 0x3c, +- 0xf3, 0x5f, 0x1a, 0x0c, 0xb8, 0x1d, 0x91, 0x9e, 0xd6, 0xd5, 0x06, 0x10, +- 0x4d, 0xd5, 0xfa, 0x97, 0xe0, 0x23, 0x2b, 0xee, 0x75, 0x42, 0xae, 0xff, +- 0x55, 0xe4, 0xf7, 0x9d, 0xdf, 0xb9, 0x56, 0x7f, 0x7f, 0xc8, 0x01, 0xb7, +- 0x16, 0xe9, 0x80, 0x36, 0x17, 0xee, 0x99, 0xac, 0xf3, 0xf5, 0x79, 0xdb, +- 0x15, 0x94, 0xe5, 0xdb, 0x3a, 0x67, 0x7d, 0x67, 0x9e, 0x2f, 0x56, 0x14, +- 0xd1, 0x70, 0x3c, 0x8d, 0xe6, 0xba, 0xde, 0x4e, 0xab, 0xd4, 0x08, 0xc1, +- 0x6d, 0x18, 0x2d, 0xbd, 0x8a, 0x27, 0xbc, 0x7e, 0x11, 0x3c, 0x85, 0x06, +- 0xe2, 0x57, 0x44, 0xd0, 0x7c, 0xe5, 0x58, 0x71, 0xdc, 0x19, 0x71, 0xa3, +- 0x29, 0xed, 0x8e, 0x7f, 0x2a, 0x62, 0x60, 0x59, 0xfa, 0xfa, 0x62, 0x94, +- 0xb9, 0xd1, 0x9d, 0xfe, 0xa8, 0x28, 0xdb, 0x5e, 0x73, 0xee, 0xff, 0xec, +- 0xaa, 0xec, 0xff, 0x69, 0x31, 0x67, 0x04, 0xd8, 0x9c, 0xb0, 0xac, 0x82, +- 0xc8, 0x6d, 0xb7, 0xa9, 0x11, 0xc3, 0x77, 0x10, 0x8b, 0xd1, 0xaa, 0xe1, +- 0xe1, 0x2d, 0xf5, 0xbf, 0x54, 0x4e, 0x0c, 0xb2, 0xe1, 0x51, 0x07, 0xa2, +- 0xda, 0x33, 0xfc, 0x3f, 0x6b, 0x56, 0x4b, 0xd8, 0xc0, 0xde, 0xd1, 0xf3, +- 0xbc, 0xee, 0xb4, 0xaf, 0x6d, 0xda, 0x33, 0x6b, 0xd6, 0xed, 0xe1, 0x67, +- 0xf0, 0xe8, 0xa8, 0xfc, 0xbe, 0x1b, 0x9d, 0x75, 0x0a, 0x26, 0x6f, 0x5b, +- 0x0b, 0x87, 0x61, 0xa0, 0x7b, 0x8f, 0xe2, 0xec, 0xaa, 0x53, 0x11, 0xf5, +- 0xea, 0xc1, 0x18, 0x95, 0xef, 0x34, 0x10, 0x2b, 0x8c, 0x84, 0x9d, 0xef, +- 0x24, 0x22, 0x9a, 0xc3, 0xb0, 0xac, 0x60, 0x68, 0x3a, 0x1c, 0x15, 0x96, +- 0xf5, 0xb4, 0xe9, 0x81, 0xff, 0x8b, 0xcf, 0x21, 0x3e, 0xdc, 0x0c, 0xd5, +- 0x78, 0x0e, 0x5d, 0xc3, 0xcf, 0xe1, 0xb1, 0x5d, 0xc5, 0x98, 0xac, 0xe2, +- 0x78, 0x93, 0x3e, 0x7c, 0x67, 0x9e, 0xf4, 0x2d, 0x72, 0xd4, 0xf1, 0x70, +- 0x63, 0xd2, 0xf1, 0x06, 0xff, 0x4b, 0x99, 0xf3, 0xd6, 0xe4, 0xf4, 0x8b, +- 0x65, 0x36, 0xb3, 0x4c, 0xf7, 0x65, 0x65, 0xe2, 0xc3, 0x11, 0xbc, 0x94, +- 0x50, 0xb0, 0x3e, 0x54, 0x86, 0x68, 0x85, 0x8c, 0xd7, 0xb2, 0x46, 0xcd, +- 0xb3, 0xd6, 0xa4, 0x26, 0x7d, 0x4d, 0xe0, 0x65, 0xde, 0xdb, 0x12, 0x3a, +- 0x63, 0x65, 0xbc, 0xd2, 0x5e, 0x3b, 0x6d, 0x67, 0x25, 0xaf, 0x3b, 0x91, +- 0x4c, 0x20, 0x56, 0x16, 0xb9, 0x8d, 0xe7, 0xba, 0xf9, 0xae, 0xe2, 0x76, +- 0xbf, 0x97, 0x70, 0x7f, 0xb1, 0xd4, 0x50, 0x1f, 0x2c, 0xa7, 0x01, 0xbd, +- 0x42, 0x99, 0x8f, 0x9a, 0x6b, 0xe1, 0x32, 0x1e, 0x10, 0x5b, 0xe3, 0xb8, +- 0x7e, 0x68, 0x61, 0x7a, 0xbe, 0xbe, 0xb4, 0xeb, 0xc6, 0x96, 0xa4, 0x65, +- 0x6d, 0x33, 0xa3, 0xd7, 0x15, 0xd1, 0x20, 0x4e, 0x26, 0x9a, 0xe1, 0x8e, +- 0x04, 0xfc, 0xe7, 0x10, 0xc6, 0x92, 0xb4, 0x17, 0xcf, 0x26, 0xe0, 0x6c, +- 0x98, 0xe7, 0x45, 0x57, 0x3a, 0x82, 0x1b, 0xd3, 0x26, 0x1a, 0xd3, 0x7f, +- 0xde, 0xb2, 0x6e, 0x4e, 0xfa, 0x39, 0x86, 0x8f, 0xac, 0xec, 0x18, 0x64, +- 0x7c, 0xd9, 0xff, 0xdd, 0xc9, 0x2b, 0xb0, 0x9d, 0x73, 0xb4, 0x95, 0xf3, +- 0xb7, 0x3c, 0x94, 0x89, 0x16, 0x41, 0x37, 0xcf, 0x21, 0x82, 0xa5, 0x69, +- 0x83, 0x73, 0x1a, 0xc1, 0x92, 0x64, 0x8d, 0x36, 0x8c, 0xf9, 0x88, 0xfa, +- 0xb2, 0x36, 0xbd, 0x83, 0xe3, 0x6d, 0x0d, 0x34, 0xa3, 0x94, 0x36, 0x92, +- 0x5a, 0x14, 0x46, 0x03, 0xfb, 0x5f, 0xf1, 0x17, 0xf4, 0x7f, 0x2b, 0xfb, +- 0x7f, 0x97, 0xfd, 0x67, 0xec, 0xfe, 0xe1, 0xbc, 0x89, 0xe7, 0x6e, 0xda, +- 0xe3, 0xf6, 0x94, 0xd3, 0xb9, 0x3c, 0xe9, 0xc5, 0xb6, 0x94, 0x49, 0x9b, +- 0x93, 0x5b, 0x3e, 0x6c, 0x19, 0x9c, 0x89, 0xad, 0x83, 0xba, 0xef, 0x79, +- 0xfe, 0xde, 0x34, 0x72, 0x05, 0x36, 0x0f, 0x2a, 0xd8, 0x6f, 0x5c, 0x81, +- 0x2e, 0xfe, 0xde, 0x3b, 0x38, 0x0b, 0x8f, 0x0e, 0x3a, 0x10, 0xae, 0xba, +- 0x74, 0x1c, 0x93, 0x8e, 0x2b, 0x10, 0x1f, 0xf1, 0xa3, 0x2b, 0xf1, 0xa2, +- 0xad, 0xc3, 0xd2, 0xc8, 0xff, 0x9b, 0xf7, 0x63, 0xfa, 0x8e, 0x1f, 0xab, +- 0x13, 0x1a, 0xba, 0x92, 0x0e, 0xb1, 0x4b, 0xfe, 0xfd, 0x92, 0xf7, 0x34, +- 0x6c, 0x4a, 0xe7, 0xeb, 0x8b, 0x9f, 0xf9, 0xd1, 0x90, 0x98, 0xa0, 0x9f, +- 0xd4, 0xd3, 0x47, 0x4c, 0x7c, 0x37, 0x5d, 0x87, 0x7f, 0x4a, 0x07, 0xf1, +- 0x8f, 0xd4, 0xc3, 0xb7, 0xd2, 0x7e, 0x1c, 0x49, 0xcf, 0xc4, 0x53, 0x69, +- 0x1f, 0xbe, 0x49, 0xfd, 0x3f, 0x99, 0x6e, 0xa6, 0xed, 0x6a, 0x38, 0x9c, +- 0x16, 0xfd, 0x15, 0x50, 0xde, 0x62, 0x6c, 0x1a, 0xac, 0x09, 0x9e, 0xa4, +- 0x6d, 0xfc, 0xa3, 0x79, 0x13, 0x32, 0x95, 0xf5, 0xb6, 0x4d, 0x6d, 0xe3, +- 0xf5, 0xed, 0x83, 0x35, 0xd1, 0x2b, 0x15, 0xcb, 0x52, 0x43, 0xb5, 0xe1, +- 0x13, 0xaa, 0x8a, 0x49, 0xaf, 0xee, 0xcf, 0xa8, 0xba, 0x3f, 0x0a, 0x17, +- 0x12, 0xb4, 0xed, 0x78, 0xb5, 0x3e, 0x14, 0xa7, 0x4d, 0x78, 0x8d, 0x7d, +- 0x40, 0x99, 0xee, 0x8f, 0xab, 0x6e, 0x6c, 0x4d, 0xea, 0x7b, 0xe3, 0xaa, +- 0x07, 0xf1, 0x74, 0x31, 0xfe, 0x6d, 0x50, 0xef, 0x89, 0xab, 0x9f, 0x45, +- 0xbc, 0xd2, 0xb2, 0xbe, 0x19, 0x42, 0xfb, 0xf4, 0x08, 0xa2, 0xd5, 0x11, +- 0xc4, 0x66, 0x45, 0xbc, 0x48, 0x26, 0x81, 0x77, 0x7b, 0x0d, 0xdf, 0xbf, +- 0x28, 0xcd, 0xf8, 0x6a, 0xb3, 0xee, 0xf7, 0xab, 0xb5, 0xf1, 0x61, 0x75, +- 0x11, 0x5d, 0x12, 0x7e, 0x5f, 0x64, 0x19, 0x3a, 0xec, 0x6b, 0x0a, 0x34, +- 0xc3, 0x83, 0x4d, 0xc9, 0xeb, 0x10, 0xf3, 0xd6, 0xb4, 0xec, 0x54, 0x6b, +- 0xce, 0x9b, 0xaa, 0x3e, 0xd1, 0xac, 0x5a, 0xd6, 0x07, 0x0b, 0xdf, 0xb5, +- 0xfc, 0xd3, 0x2c, 0x6b, 0xc1, 0x42, 0xe9, 0xd3, 0x8f, 0x8a, 0x88, 0x89, +- 0x95, 0xf6, 0x1c, 0x14, 0xe3, 0xec, 0x60, 0x25, 0xfb, 0xd0, 0xf0, 0xcf, +- 0xd7, 0xea, 0xc1, 0xb5, 0x6a, 0x31, 0xde, 0x1a, 0x29, 0xc6, 0x69, 0x8e, +- 0xe7, 0x97, 0x83, 0x3e, 0xfc, 0x7a, 0xd0, 0xb2, 0xbe, 0x68, 0xfe, 0x35, +- 0x06, 0x2a, 0xfb, 0xf1, 0x4f, 0xe3, 0x5e, 0xfc, 0x1b, 0x75, 0x7b, 0x26, +- 0x11, 0x7d, 0xa0, 0x0a, 0x7a, 0x74, 0x5c, 0x39, 0x79, 0x67, 0x19, 0x6a, +- 0x9b, 0xcb, 0x14, 0xbd, 0x69, 0x07, 0x74, 0xdf, 0x95, 0x8a, 0x17, 0xe7, +- 0x52, 0x1a, 0x7e, 0x9a, 0xaa, 0x09, 0xff, 0x80, 0x7d, 0xfe, 0x87, 0xf9, +- 0xb4, 0x95, 0x99, 0x26, 0x7a, 0x13, 0x1d, 0x51, 0xcf, 0x49, 0xea, 0x39, +- 0x49, 0x3d, 0x27, 0xa9, 0x67, 0xca, 0x70, 0x24, 0x49, 0x3d, 0x53, 0x77, +- 0xdf, 0xa4, 0x4d, 0x3c, 0x99, 0xa4, 0x8e, 0x93, 0x32, 0x47, 0x61, 0xfa, +- 0xe7, 0xa7, 0xf0, 0xf7, 0xf6, 0xdc, 0xbd, 0x6c, 0xfd, 0x37, 0xaf, 0x8c, +- 0xe9, 0xfe, 0x69, 0x59, 0xfc, 0x91, 0xb1, 0xbd, 0x64, 0xc5, 0x34, 0x19, +- 0x97, 0x8c, 0xcf, 0xd6, 0x9f, 0xbf, 0x5d, 0xf9, 0xaa, 0x82, 0x62, 0xcb, +- 0xda, 0x65, 0xe6, 0xee, 0x7b, 0xf3, 0xe3, 0xfb, 0x8c, 0x92, 0xb5, 0x8b, +- 0x7f, 0x72, 0x53, 0xdf, 0xc1, 0xa8, 0xba, 0x88, 0xe7, 0x7a, 0x3c, 0x8a, +- 0x9b, 0x0a, 0x2f, 0x3d, 0xbf, 0xb6, 0x5a, 0xe6, 0xc3, 0x7f, 0xe1, 0x9c, +- 0xf6, 0x64, 0xf7, 0xf7, 0x45, 0x9e, 0xcb, 0x58, 0x04, 0x53, 0xc5, 0x06, +- 0xbc, 0xb4, 0x97, 0x45, 0xb9, 0x7b, 0x88, 0xab, 0x91, 0x76, 0x34, 0xd7, +- 0xef, 0xb5, 0xfb, 0x28, 0xe8, 0x13, 0xbb, 0x57, 0xf0, 0xee, 0x75, 0x0a, +- 0x4e, 0x84, 0x0c, 0xda, 0xcc, 0x10, 0xfd, 0x1a, 0x28, 0xec, 0x83, 0xdb, +- 0x13, 0x89, 0x20, 0xd1, 0x0b, 0x77, 0x51, 0x24, 0x8c, 0xf9, 0xbd, 0x35, +- 0xeb, 0xce, 0x42, 0x0f, 0xf6, 0x2a, 0x7a, 0x33, 0x50, 0x6b, 0x8e, 0x51, +- 0x8f, 0x57, 0x2a, 0xba, 0xbf, 0x40, 0x81, 0x5b, 0x61, 0xb9, 0x40, 0x6a, +- 0x08, 0x5b, 0xd3, 0xf2, 0x3b, 0x0c, 0x23, 0xf5, 0xeb, 0x7c, 0x5f, 0xb4, +- 0xeb, 0x76, 0xda, 0xf5, 0x59, 0x8e, 0x5d, 0xf7, 0x13, 0x1f, 0xdd, 0xae, +- 0xc8, 0x3a, 0x1c, 0x48, 0xc0, 0x5d, 0x10, 0xd9, 0x80, 0xe7, 0x12, 0x1f, +- 0x57, 0xe7, 0xcb, 0x29, 0x2c, 0xe7, 0x4f, 0x4d, 0x95, 0xe5, 0x0d, 0x2b, +- 0xea, 0xcd, 0xca, 0x52, 0xdc, 0x37, 0x84, 0x1d, 0x49, 0xa9, 0x1b, 0xb1, +- 0xeb, 0x3a, 0xd9, 0x47, 0x77, 0xa2, 0xa6, 0xe9, 0x66, 0x45, 0x0f, 0x3f, +- 0x8e, 0xda, 0xe8, 0x3b, 0x9c, 0xc3, 0x2e, 0xe8, 0xe7, 0xd7, 0x21, 0x2b, +- 0xcb, 0xbc, 0x54, 0x56, 0x8e, 0xc5, 0x29, 0x28, 0xb7, 0x27, 0xe1, 0xf1, +- 0x19, 0x55, 0x39, 0x5f, 0x84, 0x72, 0x0b, 0xe7, 0x4f, 0x35, 0xfc, 0xb8, +- 0x85, 0x36, 0xb4, 0x61, 0x97, 0x85, 0x4d, 0xa1, 0x4a, 0xfa, 0x5b, 0x33, +- 0xca, 0x88, 0x87, 0x1b, 0x35, 0x44, 0xcb, 0x23, 0x61, 0xe5, 0xd6, 0xf4, +- 0xce, 0x9c, 0xfe, 0x9f, 0xae, 0xa4, 0x7c, 0x4a, 0x63, 0xf2, 0xf2, 0xeb, +- 0x1f, 0xe5, 0xc7, 0x77, 0xd9, 0xf5, 0xb9, 0x05, 0x9f, 0x5c, 0xbe, 0x56, +- 0x1b, 0x81, 0xc2, 0x78, 0x51, 0x44, 0xfd, 0xea, 0x8c, 0xd2, 0xd1, 0xa0, +- 0xcb, 0xbe, 0xe6, 0xc0, 0x90, 0x33, 0xea, 0x73, 0xe0, 0xf7, 0x56, 0x74, +- 0x95, 0x5c, 0x2b, 0x46, 0xac, 0xb9, 0xd6, 0xe7, 0x44, 0x6d, 0x78, 0x33, +- 0xfd, 0x6d, 0x72, 0x55, 0x03, 0xef, 0x05, 0xcc, 0x93, 0xa8, 0xf1, 0x6f, +- 0x86, 0xfc, 0xfe, 0x90, 0x36, 0xd2, 0x20, 0x75, 0x59, 0x46, 0x6c, 0x4e, +- 0xd7, 0x4e, 0xc2, 0x8b, 0xcd, 0xb4, 0xbf, 0xc2, 0x88, 0x6e, 0x2e, 0x73, +- 0x38, 0x71, 0x88, 0x38, 0xec, 0x30, 0x7a, 0x50, 0xc8, 0x31, 0x32, 0x3e, +- 0xe2, 0xf1, 0x04, 0xf0, 0x62, 0xbf, 0x85, 0x86, 0x90, 0x07, 0x4b, 0x6c, +- 0xdb, 0x3c, 0xaa, 0xdc, 0x98, 0xfc, 0xd8, 0x1a, 0x72, 0x16, 0x45, 0xd5, +- 0x48, 0xc0, 0x77, 0x9a, 0xd1, 0xbc, 0x20, 0x52, 0xab, 0x39, 0x11, 0x57, +- 0x9a, 0xd2, 0xdd, 0xca, 0xf2, 0x74, 0x8f, 0xb2, 0xc4, 0xc6, 0x9c, 0xa3, +- 0xca, 0xd2, 0xb4, 0x07, 0xa9, 0x7e, 0x05, 0x3b, 0x42, 0x94, 0xab, 0x3a, +- 0x6b, 0xc7, 0xe9, 0x7e, 0x95, 0x18, 0xf9, 0x2e, 0x31, 0x52, 0x0f, 0x83, +- 0x7d, 0x3f, 0x9d, 0xa8, 0xc4, 0x51, 0x62, 0xe1, 0x4f, 0x52, 0xe5, 0x2a, +- 0x8a, 0xaf, 0xc0, 0x8f, 0x47, 0xca, 0x30, 0x36, 0x38, 0x8b, 0xbf, 0xeb, +- 0xf0, 0xca, 0x88, 0x65, 0x75, 0x9b, 0x96, 0x75, 0xc0, 0x3c, 0xaa, 0x34, +- 0xb0, 0xcf, 0xa8, 0x33, 0x1e, 0x2d, 0x8c, 0x04, 0xcc, 0xad, 0xec, 0xd3, +- 0x11, 0x89, 0x2b, 0x51, 0xf6, 0x77, 0x23, 0xfb, 0x5b, 0x9a, 0xeb, 0x2f, +- 0xdb, 0xaf, 0xc8, 0x22, 0xf5, 0xf2, 0x75, 0xc2, 0xac, 0x03, 0x1c, 0x4c, +- 0x04, 0x82, 0xf9, 0x7a, 0x4b, 0x59, 0xe7, 0xc6, 0x0b, 0x75, 0x80, 0xe1, +- 0x44, 0x90, 0x73, 0x2a, 0xb6, 0xee, 0x67, 0xec, 0xf9, 0x1a, 0x9c, 0x46, +- 0x3d, 0x5a, 0x87, 0x85, 0x47, 0x84, 0xd5, 0xec, 0x3c, 0x49, 0xfc, 0x74, +- 0xdb, 0x31, 0x6b, 0xd2, 0x21, 0x71, 0x34, 0x88, 0x5e, 0xfa, 0x75, 0x57, +- 0x52, 0x6c, 0xbc, 0xfe, 0xcb, 0x89, 0x80, 0x82, 0x6f, 0x04, 0x32, 0xcd, +- 0xa5, 0x28, 0xc7, 0xba, 0x90, 0xd8, 0xa6, 0xf9, 0xe5, 0xe7, 0x0c, 0x3d, +- 0xbc, 0x42, 0xe1, 0x9c, 0x05, 0xf4, 0xa6, 0xa5, 0x0a, 0x10, 0x18, 0x03, +- 0xce, 0xa4, 0xca, 0xb1, 0xda, 0x74, 0x40, 0xad, 0x08, 0xa2, 0x27, 0x3d, +- 0x15, 0xd7, 0x4d, 0xe2, 0xb4, 0xb4, 0x17, 0xa4, 0x5f, 0x97, 0x60, 0x99, +- 0x96, 0xb5, 0x69, 0x37, 0xdb, 0x76, 0x07, 0x32, 0x41, 0x95, 0xf1, 0xea, +- 0x10, 0x2f, 0x9c, 0x64, 0x5c, 0x6a, 0x30, 0x5c, 0x68, 0xd3, 0xca, 0xd1, +- 0x60, 0xfe, 0xd6, 0x5a, 0xb6, 0x4a, 0xee, 0x5d, 0xc4, 0xf7, 0x42, 0xf6, +- 0xfb, 0xb6, 0xa1, 0xfb, 0x47, 0x79, 0x92, 0x49, 0x65, 0xaf, 0xc7, 0x19, +- 0x73, 0x36, 0xb1, 0xdd, 0x2d, 0x6c, 0x77, 0xad, 0xa6, 0x47, 0xe3, 0x17, +- 0xca, 0x65, 0x82, 0x0e, 0xe8, 0x9a, 0x94, 0x6d, 0x64, 0xbb, 0xab, 0xd9, +- 0x6e, 0x8f, 0x26, 0xf2, 0xfd, 0xd6, 0x5a, 0xbb, 0x4a, 0xee, 0x65, 0xed, +- 0x23, 0xdb, 0x6e, 0xbd, 0xb4, 0x6b, 0x8e, 0xe6, 0xfa, 0x3a, 0x91, 0x40, +- 0xbf, 0x23, 0xc2, 0x18, 0x59, 0x1f, 0xf0, 0x77, 0x31, 0x5e, 0x36, 0x32, +- 0x76, 0x64, 0x6d, 0x62, 0x6a, 0xbc, 0x42, 0xfc, 0x62, 0x19, 0xb9, 0x26, +- 0xe5, 0xc4, 0xd6, 0x26, 0xa9, 0x67, 0x89, 0x2f, 0x3e, 0xea, 0x57, 0xb0, +- 0xc5, 0x89, 0xc3, 0x09, 0xe2, 0x3f, 0xbe, 0x46, 0xbb, 0xf3, 0xa3, 0x39, +- 0x5d, 0x83, 0xb6, 0x5d, 0x8c, 0x63, 0x66, 0x05, 0x6d, 0x3d, 0x6b, 0x6f, +- 0xcb, 0xd8, 0xf6, 0xa4, 0xdd, 0x76, 0x5c, 0x69, 0x4e, 0xd7, 0x6a, 0x15, +- 0x8c, 0x99, 0xc7, 0x2f, 0x60, 0xe7, 0xec, 0x68, 0x71, 0x24, 0xd0, 0xb4, +- 0x9e, 0x93, 0xe4, 0x66, 0x7c, 0xfb, 0xce, 0xbc, 0x6e, 0xda, 0x45, 0x0f, +- 0xed, 0x30, 0x3b, 0xbf, 0x4d, 0x62, 0x70, 0xc4, 0x38, 0xa8, 0x35, 0x58, +- 0xbb, 0x4b, 0xfe, 0x93, 0x6b, 0xd4, 0x3f, 0xca, 0x6b, 0x35, 0x58, 0x3d, +- 0xfc, 0x0d, 0xda, 0x99, 0xee, 0x13, 0x3b, 0xec, 0xba, 0x20, 0x97, 0xc8, +- 0x24, 0xb2, 0x89, 0x4c, 0xff, 0x37, 0xcb, 0xcd, 0xa4, 0x7e, 0x04, 0x1b, +- 0x2b, 0x29, 0xcf, 0x36, 0xf2, 0x99, 0xa3, 0xca, 0x67, 0x29, 0x4f, 0xc6, +- 0xe5, 0xc5, 0x63, 0x49, 0x91, 0x47, 0x89, 0xce, 0x88, 0xcc, 0xc4, 0xf9, +- 0x64, 0x20, 0xfe, 0x34, 0x44, 0xb6, 0x6e, 0xa5, 0x45, 0xea, 0x27, 0x7b, +- 0x78, 0x2f, 0x2f, 0x23, 0xb4, 0x72, 0x5b, 0xb6, 0xac, 0x4c, 0xb7, 0x72, +- 0xae, 0x5d, 0xc6, 0xfd, 0xa5, 0x28, 0x73, 0xd2, 0xd6, 0xa4, 0xed, 0x9f, +- 0x59, 0x51, 0x6d, 0x13, 0xaf, 0x79, 0x39, 0x4f, 0x6e, 0xc6, 0x75, 0x3d, +- 0x78, 0x8b, 0x43, 0x69, 0xf6, 0x48, 0xbc, 0xa6, 0x7d, 0xa6, 0x52, 0x4e, +- 0x3c, 0x93, 0x58, 0xba, 0xb4, 0xc4, 0xb8, 0x1a, 0xdf, 0x18, 0xf1, 0x61, +- 0x84, 0x73, 0xfb, 0x62, 0x42, 0xe2, 0xeb, 0x4c, 0x3c, 0x91, 0xf2, 0xe0, +- 0x85, 0x84, 0x1f, 0x8f, 0x33, 0xfe, 0x4c, 0x24, 0x0c, 0x1c, 0x4a, 0x79, +- 0xf1, 0x3c, 0xed, 0x79, 0x34, 0xe5, 0xa3, 0xbd, 0xd4, 0x61, 0x38, 0xd5, +- 0x6c, 0x8f, 0xe1, 0xd9, 0xc4, 0xab, 0x32, 0xd6, 0xa0, 0x8c, 0x75, 0x8b, +- 0x3d, 0xd6, 0x7c, 0x9c, 0x9f, 0x79, 0x61, 0x1e, 0x4e, 0x25, 0x6c, 0x1c, +- 0xe8, 0x59, 0xe6, 0x90, 0x79, 0xa0, 0xcd, 0x0e, 0x08, 0x16, 0xe8, 0xfd, +- 0x71, 0x58, 0xd8, 0x6f, 0xce, 0xa0, 0xff, 0xf7, 0x50, 0x5e, 0xea, 0x94, +- 0xe3, 0x87, 0xab, 0x2c, 0x5a, 0x1a, 0x09, 0xc4, 0x7a, 0xa9, 0x77, 0x67, +- 0x44, 0xf4, 0x90, 0xd5, 0xfb, 0x8a, 0xf4, 0x51, 0x45, 0xb8, 0xda, 0x95, +- 0x03, 0x71, 0xab, 0xc4, 0x10, 0x7d, 0x07, 0x88, 0xb3, 0xc0, 0xfc, 0xfd, +- 0x4e, 0x8e, 0x6f, 0x25, 0xc7, 0x6c, 0xa2, 0xc0, 0xa8, 0xd5, 0x2a, 0x29, +- 0xfb, 0xf1, 0x3f, 0x88, 0x81, 0xa2, 0xa3, 0x35, 0xb9, 0xf9, 0x2a, 0x77, +- 0x50, 0x5e, 0x3f, 0x90, 0x9f, 0x17, 0xcb, 0xda, 0x69, 0xe6, 0xe7, 0xa6, +- 0x1a, 0xfe, 0x4a, 0x3d, 0x3e, 0x44, 0x8b, 0x18, 0x49, 0x54, 0x21, 0xae, +- 0xa9, 0xb9, 0xb6, 0xa3, 0x4a, 0x01, 0xf3, 0x07, 0x8c, 0x8b, 0xef, 0x97, +- 0x22, 0xea, 0x94, 0xfa, 0x88, 0x16, 0x44, 0x02, 0xc1, 0xb9, 0xea, 0x54, +- 0x9b, 0x11, 0x1c, 0x90, 0xbe, 0xe2, 0x94, 0xf5, 0x52, 0x2c, 0x18, 0x49, +- 0xe4, 0x71, 0xe3, 0x3f, 0x53, 0xcf, 0x4b, 0x1f, 0x9b, 0xaa, 0x53, 0x91, +- 0x53, 0xf4, 0xaa, 0xa2, 0x75, 0x50, 0xf4, 0xe7, 0xc4, 0x4a, 0x73, 0x51, +- 0x4e, 0xe6, 0x99, 0x68, 0x4b, 0xa8, 0xd8, 0x30, 0xc8, 0xbe, 0x52, 0x0a, +- 0x36, 0x87, 0x96, 0x60, 0xc8, 0x6b, 0xd3, 0x45, 0xb4, 0x26, 0x1a, 0x69, +- 0x63, 0xc4, 0x99, 0x71, 0x3b, 0x7e, 0xda, 0xfe, 0x33, 0x9b, 0x3e, 0xb1, +- 0x2c, 0xfd, 0x20, 0xd6, 0x26, 0x03, 0xfe, 0x93, 0x78, 0x10, 0x6d, 0x69, +- 0x17, 0x62, 0xc3, 0x1e, 0x74, 0xb2, 0x6f, 0xb5, 0x4f, 0xfc, 0x49, 0x43, +- 0xe7, 0xe8, 0x89, 0x17, 0x54, 0xda, 0x67, 0xe7, 0xa8, 0x97, 0xc7, 0x34, +- 0x1e, 0x6e, 0x3c, 0xc4, 0xe3, 0x28, 0xe7, 0xbf, 0x83, 0x18, 0x9c, 0x4e, +- 0x98, 0xb8, 0x9f, 0x32, 0x8d, 0x27, 0xea, 0xb1, 0x91, 0xf2, 0x8d, 0x25, +- 0x1c, 0xf0, 0x4f, 0x0b, 0xe3, 0x3e, 0xea, 0xf2, 0xc9, 0x44, 0x58, 0x79, +- 0x80, 0xff, 0x0f, 0x51, 0x26, 0xc9, 0x47, 0xd6, 0xd1, 0x0e, 0xa2, 0xd3, +- 0x68, 0x27, 0x6a, 0xad, 0xc3, 0x9e, 0x07, 0x88, 0x7f, 0x5c, 0x3e, 0x57, +- 0xba, 0x16, 0x43, 0x7e, 0xbe, 0x80, 0xa1, 0x14, 0x62, 0xee, 0x48, 0x5d, +- 0x63, 0x41, 0x6f, 0xeb, 0x86, 0xc2, 0x48, 0xfb, 0x43, 0x3f, 0xad, 0x9f, +- 0x85, 0x93, 0x9c, 0x13, 0xa7, 0x6d, 0xe3, 0x51, 0xc5, 0x65, 0x18, 0xb6, +- 0x2f, 0xab, 0xe3, 0xed, 0xb9, 0xbc, 0x4a, 0x97, 0x38, 0xc6, 0x3e, 0x44, +- 0x6f, 0xa2, 0x0b, 0xd1, 0xc3, 0x71, 0x6b, 0xc8, 0xf6, 0x77, 0xf1, 0x39, +- 0x27, 0x75, 0xf4, 0x5d, 0xc6, 0x6f, 0xd1, 0x85, 0x94, 0xdb, 0xca, 0xb6, +- 0x44, 0x1e, 0x3b, 0x16, 0xfa, 0xfe, 0xd0, 0x76, 0xa6, 0xca, 0x53, 0x87, +- 0xed, 0x7b, 0x0c, 0xec, 0xd8, 0x53, 0x4b, 0xbb, 0xfb, 0xa5, 0xe5, 0xaf, +- 0x18, 0x60, 0xdd, 0xa9, 0xb2, 0x08, 0x2f, 0x40, 0xae, 0x5d, 0x69, 0x73, +- 0x13, 0xef, 0x1d, 0xa6, 0xad, 0x49, 0xbb, 0x96, 0xb5, 0xe5, 0x42, 0xdc, +- 0x28, 0x88, 0x16, 0x31, 0x6e, 0x1c, 0x4a, 0x04, 0xc2, 0x2f, 0xd8, 0xb1, +- 0xcd, 0x49, 0xdb, 0x90, 0xf9, 0xef, 0xb6, 0xe7, 0x7e, 0xd9, 0x85, 0xb9, +- 0x9f, 0xbc, 0xc0, 0x91, 0xfa, 0x93, 0x53, 0x7d, 0x2a, 0x3b, 0xef, 0xce, +- 0x3e, 0xbd, 0xc7, 0xb6, 0xd3, 0x94, 0xe0, 0x9f, 0x03, 0x8e, 0x01, 0xce, +- 0xb3, 0x79, 0x15, 0xc7, 0x5f, 0xc9, 0x78, 0x52, 0xc0, 0x83, 0x79, 0xe4, +- 0xf0, 0xa7, 0x50, 0x3c, 0x90, 0xb1, 0x8a, 0xf8, 0xbb, 0x29, 0x14, 0x08, +- 0x17, 0x29, 0x37, 0xe0, 0xee, 0x61, 0x07, 0x0a, 0x06, 0x14, 0x3c, 0x6b, +- 0xd6, 0xe5, 0xec, 0x43, 0xe6, 0xfb, 0x2a, 0xdb, 0x3e, 0xe6, 0x8c, 0xcb, +- 0x7c, 0xcb, 0x1c, 0x7b, 0xe0, 0xeb, 0x53, 0xe0, 0x21, 0x6e, 0x94, 0x18, +- 0x32, 0xd7, 0x1a, 0xca, 0xfb, 0x64, 0xae, 0x49, 0x1b, 0x77, 0x87, 0xb1, +- 0x91, 0xf6, 0x50, 0xba, 0xfb, 0x7a, 0xdc, 0xc7, 0x72, 0x1b, 0x78, 0x6f, +- 0xc3, 0x68, 0x25, 0x0f, 0x2f, 0x8f, 0x69, 0x3c, 0xea, 0x71, 0xef, 0x70, +- 0x0d, 0xa2, 0x95, 0x7a, 0xd0, 0xaf, 0x3a, 0x50, 0x39, 0x20, 0x3a, 0x55, +- 0xb1, 0x72, 0x81, 0x02, 0xf3, 0xea, 0x42, 0xa8, 0x73, 0x3f, 0xc9, 0x37, +- 0xff, 0x9c, 0xac, 0x3f, 0x9a, 0x32, 0x87, 0x6e, 0x8e, 0xfd, 0x9f, 0xed, +- 0x39, 0x9c, 0x33, 0x2e, 0x7d, 0x48, 0x2c, 0xb5, 0xe7, 0xf1, 0x4f, 0xf8, +- 0xfe, 0x73, 0x9c, 0x8f, 0x2e, 0x96, 0xf9, 0xc3, 0xf9, 0xc5, 0x85, 0xf9, +- 0x9d, 0xca, 0x49, 0x25, 0xae, 0xeb, 0xe1, 0x21, 0x9b, 0xc3, 0xf8, 0x99, +- 0xcf, 0xe9, 0x71, 0xd1, 0x39, 0x39, 0x8b, 0x5b, 0x35, 0xe0, 0x2f, 0x30, +- 0xee, 0xc0, 0x3d, 0x9c, 0xa7, 0x03, 0x09, 0x75, 0xa9, 0x0b, 0xea, 0x4c, +- 0x17, 0x13, 0xdb, 0x11, 0x53, 0xc7, 0xba, 0x61, 0xe6, 0x4a, 0xc3, 0xa5, +- 0xe8, 0xd2, 0x14, 0xf7, 0xf6, 0xba, 0x45, 0x92, 0xf3, 0xfa, 0xcb, 0x0d, +- 0xa8, 0x25, 0x8c, 0xef, 0x3b, 0x34, 0x38, 0x0b, 0x0c, 0x45, 0x4d, 0xd4, +- 0x35, 0x22, 0x5e, 0x01, 0x67, 0x99, 0x01, 0x85, 0x39, 0x2d, 0x7a, 0x35, +- 0x08, 0xb6, 0x44, 0x0b, 0x8c, 0x07, 0x71, 0x4f, 0x12, 0x56, 0x71, 0x84, +- 0xf9, 0x4e, 0xc4, 0x20, 0x87, 0x0d, 0xf8, 0x0a, 0x94, 0x07, 0xb1, 0x9a, +- 0xbc, 0x61, 0xcd, 0xb0, 0xc8, 0xe1, 0x21, 0x9f, 0x30, 0xfc, 0xad, 0x60, +- 0x8e, 0xdd, 0xac, 0x07, 0x27, 0x99, 0x67, 0xae, 0xa6, 0xee, 0x47, 0x12, +- 0x0f, 0xa2, 0x21, 0x79, 0xdc, 0xf2, 0x90, 0x27, 0x16, 0x18, 0x35, 0xe7, +- 0xbb, 0x10, 0xa3, 0x0f, 0x0b, 0xff, 0x69, 0xc3, 0x43, 0xf4, 0xbf, 0x74, +- 0x42, 0x7d, 0x86, 0xec, 0x01, 0x1d, 0xa3, 0xeb, 0x71, 0xff, 0xe8, 0x4c, +- 0xfa, 0xea, 0x06, 0xfa, 0x2a, 0xb9, 0x50, 0xff, 0x0d, 0xb8, 0x6f, 0xf8, +- 0x06, 0xdc, 0xbb, 0xcb, 0x08, 0x6e, 0xa0, 0xae, 0xd7, 0x0c, 0x33, 0x10, +- 0x4e, 0x93, 0x76, 0xf3, 0xba, 0x12, 0x3e, 0x48, 0x5d, 0xe4, 0xf4, 0x94, +- 0x41, 0x9e, 0xa3, 0xfc, 0xb3, 0xc5, 0x4b, 0xf1, 0x82, 0x7a, 0xc5, 0xbf, +- 0xb7, 0xee, 0xfb, 0xcc, 0xbd, 0x45, 0x76, 0x44, 0x67, 0x18, 0xaf, 0x5a, +- 0x8f, 0x6a, 0x0a, 0x0a, 0x22, 0x88, 0xcf, 0xae, 0x7f, 0xd9, 0x7a, 0x6c, +- 0x95, 0x5c, 0xbf, 0xd5, 0x89, 0x62, 0x95, 0xd7, 0xa4, 0xcd, 0x1d, 0x32, +- 0x47, 0x44, 0xda, 0x4f, 0x6a, 0x33, 0x63, 0xf5, 0x5d, 0x28, 0x4f, 0xde, +- 0x47, 0xac, 0x7d, 0x3a, 0xe1, 0x45, 0x4f, 0x32, 0xcb, 0x9d, 0x6e, 0x4f, +- 0x0b, 0x67, 0x72, 0xa3, 0xb8, 0x57, 0xe2, 0x46, 0x14, 0xeb, 0xf9, 0xbb, +- 0xa8, 0x57, 0x6f, 0x8e, 0x83, 0xc9, 0xbc, 0xd1, 0xc8, 0xb9, 0xa0, 0xbd, +- 0xf6, 0x3a, 0x50, 0x64, 0x34, 0x65, 0x6d, 0xb5, 0x77, 0x85, 0x8d, 0x4b, +- 0x65, 0xbd, 0xdd, 0x36, 0x2e, 0x95, 0xb2, 0x9e, 0x60, 0x92, 0xa7, 0x77, +- 0x15, 0xed, 0x75, 0x26, 0x4a, 0x7a, 0x5b, 0x70, 0x2f, 0xe7, 0x78, 0x2d, +- 0x79, 0xf6, 0x09, 0xb3, 0x3c, 0xc7, 0x3f, 0x9b, 0x70, 0x77, 0x32, 0x8a, +- 0xd6, 0x64, 0x4d, 0xf4, 0xb4, 0xac, 0x25, 0xb9, 0xb2, 0xd8, 0x19, 0xad, +- 0x16, 0x5d, 0x3c, 0x97, 0xc3, 0x08, 0xbd, 0x29, 0xcb, 0xd9, 0x74, 0xcd, +- 0xaf, 0xe4, 0x65, 0xef, 0x46, 0x8c, 0xf9, 0xc5, 0xec, 0x48, 0x33, 0xac, +- 0xa4, 0xc8, 0x1d, 0xb7, 0x7c, 0xcc, 0x19, 0x3d, 0x11, 0xbd, 0x7d, 0xb1, +- 0xc3, 0xe8, 0xf8, 0xb1, 0x12, 0xc4, 0xad, 0x94, 0xa1, 0xa4, 0xb7, 0x13, +- 0xaf, 0x84, 0x74, 0xdf, 0xb7, 0x15, 0xfd, 0xfc, 0x06, 0xfc, 0x18, 0x3f, +- 0xe7, 0xb5, 0x82, 0xde, 0x09, 0x3c, 0x96, 0x7e, 0x1d, 0x67, 0x29, 0xab, +- 0xda, 0xfb, 0xb1, 0xb5, 0xcc, 0x20, 0x18, 0x14, 0xbb, 0x95, 0xb7, 0xd3, +- 0x53, 0x6d, 0xf1, 0x06, 0xac, 0xde, 0x25, 0xf6, 0xa7, 0x07, 0xe3, 0xa0, +- 0x7c, 0x66, 0x99, 0x60, 0x9c, 0xc4, 0x1f, 0xca, 0xdf, 0x4c, 0xd9, 0x2c, +- 0xfa, 0x07, 0xed, 0xc0, 0x1e, 0xc3, 0x43, 0x36, 0x0e, 0x3a, 0xfb, 0xe4, +- 0xc8, 0xeb, 0x39, 0xa2, 0xb4, 0x8e, 0x5e, 0x53, 0x8c, 0x62, 0x5f, 0xce, +- 0x0f, 0xb2, 0x6b, 0x0a, 0x17, 0xeb, 0xfe, 0xd2, 0x1a, 0xf1, 0x5e, 0x5a, +- 0xb7, 0x8c, 0x39, 0x56, 0x39, 0xc7, 0xf3, 0x5e, 0x6f, 0xdc, 0x2a, 0xce, +- 0x8e, 0xa5, 0xe9, 0x55, 0x45, 0x6c, 0x32, 0x48, 0xee, 0xde, 0x89, 0xab, +- 0x42, 0x7a, 0xcb, 0xb7, 0x15, 0x29, 0xab, 0x87, 0x37, 0x28, 0xf9, 0x7e, +- 0x7e, 0x84, 0xd3, 0x23, 0xd2, 0x87, 0xf4, 0x35, 0xc1, 0x9c, 0xeb, 0x52, +- 0x7f, 0x4a, 0xd9, 0xf3, 0xa9, 0x9b, 0x43, 0xe4, 0x75, 0x2b, 0x38, 0xcc, +- 0x92, 0x5e, 0x19, 0x93, 0xa9, 0xdc, 0x3b, 0x2a, 0xf3, 0xba, 0x40, 0x59, +- 0x4f, 0x2c, 0x29, 0xea, 0xad, 0x57, 0xee, 0x21, 0x96, 0x14, 0xee, 0xac, +- 0x51, 0xee, 0xb6, 0x6d, 0xbe, 0x0a, 0x23, 0xfd, 0xd7, 0x28, 0x6d, 0xc3, +- 0xa2, 0x03, 0x37, 0xc7, 0x3e, 0x8d, 0x63, 0xf7, 0xa2, 0x8f, 0xfe, 0xfb, +- 0x4a, 0x6f, 0x9d, 0x72, 0x1f, 0x7d, 0xa3, 0x73, 0x97, 0x8a, 0xc9, 0x2a, +- 0x85, 0x78, 0x47, 0xfe, 0x6b, 0xf8, 0x94, 0xd6, 0xe1, 0xef, 0x3b, 0x25, +- 0xbe, 0x64, 0x70, 0x03, 0x5a, 0x79, 0x6f, 0xa9, 0xe9, 0x42, 0x46, 0xab, +- 0xd5, 0x34, 0xac, 0xc0, 0xea, 0xe4, 0x2a, 0xb4, 0x25, 0x8b, 0xc9, 0x73, +- 0x65, 0xbc, 0x79, 0xb9, 0xf3, 0xf3, 0xf8, 0x20, 0x5a, 0x92, 0x88, 0xcf, +- 0x88, 0x04, 0x3a, 0x66, 0x38, 0xe8, 0xd2, 0xc5, 0x75, 0xca, 0xfd, 0xe9, +- 0x1a, 0x65, 0xcd, 0xae, 0x72, 0x64, 0xb1, 0xe7, 0x61, 0x34, 0xed, 0xa9, +- 0x57, 0xee, 0xde, 0x53, 0x85, 0x49, 0xcd, 0xb2, 0x9c, 0xa1, 0x7a, 0xa5, +- 0x75, 0x8f, 0x65, 0xdd, 0x64, 0x46, 0x9b, 0x8a, 0xc9, 0x77, 0xb7, 0xb1, +- 0xbd, 0xd6, 0x51, 0xe9, 0xe7, 0xf2, 0x76, 0x4d, 0x65, 0xe3, 0x9e, 0x87, +- 0xb1, 0x82, 0x65, 0x5f, 0x09, 0x45, 0x5b, 0x4a, 0x59, 0x56, 0x74, 0xd6, +- 0x3a, 0xfa, 0x19, 0xf6, 0x21, 0xe5, 0x17, 0x4c, 0x69, 0x67, 0x31, 0xaf, +- 0x49, 0x5b, 0x59, 0xdd, 0x89, 0xde, 0x1e, 0xcf, 0xea, 0x2d, 0x2c, 0x7a, +- 0x5b, 0x4e, 0x5d, 0xba, 0x7a, 0x7d, 0x3c, 0x5c, 0xf4, 0x75, 0x1f, 0xd6, +- 0xa4, 0x65, 0x4c, 0x33, 0x89, 0x03, 0xcd, 0xb4, 0xdb, 0x76, 0xb4, 0x52, +- 0xaf, 0x71, 0x2d, 0x6b, 0x9f, 0x17, 0x7d, 0x4b, 0xf7, 0x4f, 0x72, 0xec, +- 0xad, 0x49, 0xd1, 0x4b, 0x33, 0xcb, 0xdb, 0xf7, 0xe9, 0xdb, 0x53, 0xcb, +- 0x5c, 0x3a, 0x57, 0xfb, 0x13, 0xc2, 0x27, 0x0a, 0xc8, 0x7d, 0x0a, 0xd8, +- 0x5e, 0x96, 0x2b, 0x8a, 0xbd, 0x38, 0x68, 0x2f, 0xcf, 0x98, 0xc5, 0xd8, +- 0xe4, 0x95, 0x31, 0x66, 0xf5, 0x0c, 0x15, 0x58, 0xc7, 0x7b, 0x2e, 0xde, +- 0x2b, 0x0c, 0x15, 0xe2, 0x2d, 0x5b, 0x57, 0x59, 0x3e, 0x98, 0xf7, 0xf3, +- 0xa1, 0x0b, 0xfd, 0x1c, 0xab, 0xce, 0xda, 0xd8, 0x26, 0x57, 0x96, 0x33, +- 0xe6, 0xb9, 0x8d, 0x65, 0x0d, 0x98, 0x79, 0x6e, 0x23, 0x71, 0xee, 0x53, +- 0xc2, 0x15, 0x6c, 0x1e, 0xd6, 0x96, 0xeb, 0xb7, 0xcb, 0x0c, 0xd0, 0x4f, +- 0x85, 0xfb, 0x45, 0x94, 0xb6, 0x3d, 0xa7, 0x68, 0xab, 0x92, 0x8b, 0x01, +- 0x1b, 0x79, 0xbf, 0x94, 0xf7, 0x5f, 0x0b, 0xb9, 0x70, 0xd5, 0x34, 0xe9, +- 0xfb, 0x06, 0x74, 0xec, 0x8a, 0xa2, 0x7c, 0x61, 0x00, 0x93, 0xf6, 0x7a, +- 0x59, 0x9e, 0xa7, 0xbb, 0x70, 0xdf, 0xae, 0x8f, 0xad, 0x32, 0x9b, 0x3b, +- 0x1a, 0xb1, 0x71, 0x45, 0xc5, 0x8e, 0x45, 0xc2, 0xd7, 0x5d, 0x8c, 0x57, +- 0xe4, 0xce, 0x92, 0x0b, 0xb8, 0x4a, 0xc8, 0xb9, 0x85, 0x73, 0x06, 0x32, +- 0xb7, 0xab, 0xd0, 0xb4, 0x88, 0x70, 0xcf, 0x99, 0x36, 0xe7, 0x16, 0xee, +- 0xfd, 0xcd, 0xe4, 0xd1, 0x29, 0xdc, 0xfb, 0x02, 0x4f, 0x61, 0xae, 0xd6, +- 0x8c, 0x44, 0xaf, 0x07, 0xee, 0x88, 0xde, 0xbc, 0x59, 0xe9, 0xc4, 0xf2, +- 0x90, 0x61, 0xca, 0x1a, 0xc0, 0xf5, 0x8a, 0x1e, 0x3c, 0x87, 0x20, 0xe3, +- 0xc7, 0x8f, 0x30, 0x32, 0xf8, 0x0f, 0x2e, 0xf1, 0x8b, 0xcd, 0xe9, 0x8b, +- 0xf2, 0xdc, 0x4d, 0x79, 0xdc, 0x59, 0x79, 0xcc, 0x73, 0x54, 0xe4, 0xb3, +- 0xf5, 0x2e, 0xe2, 0xf0, 0x7f, 0xb7, 0xed, 0x76, 0x89, 0x9d, 0x4b, 0xfc, +- 0x77, 0xc6, 0x93, 0x70, 0x71, 0x5e, 0xcf, 0x9d, 0xc4, 0xab, 0x0f, 0x17, +- 0x16, 0x21, 0x44, 0x7b, 0xaf, 0x30, 0x3a, 0x98, 0xcf, 0x7f, 0x6c, 0xc5, +- 0x9d, 0xa4, 0xdf, 0x06, 0xb4, 0xa2, 0x48, 0x94, 0xb2, 0x35, 0x2a, 0x37, +- 0x0d, 0x8f, 0xb3, 0x9f, 0x0e, 0xe6, 0x29, 0x1e, 0x3c, 0x40, 0x5c, 0x79, +- 0x80, 0xfe, 0xf4, 0x00, 0x63, 0xf3, 0x03, 0xa3, 0xff, 0x8b, 0xd7, 0xa7, +- 0xd9, 0xbf, 0x37, 0x27, 0xf3, 0xf6, 0xe5, 0x64, 0x9c, 0x13, 0xfd, 0x6e, +- 0x21, 0x16, 0x48, 0x9c, 0x03, 0x65, 0xb2, 0x70, 0xda, 0x2c, 0xa4, 0xae, +- 0xf5, 0x60, 0x06, 0x09, 0xd7, 0xc5, 0x3c, 0x35, 0x1f, 0x2b, 0x65, 0x1e, +- 0x5d, 0xb8, 0x87, 0x32, 0x06, 0x43, 0xbf, 0xb1, 0x50, 0x21, 0x58, 0x74, +- 0xf9, 0xfd, 0xec, 0xbc, 0x1e, 0xbf, 0xc0, 0x59, 0x15, 0xc9, 0x91, 0xe8, +- 0xef, 0xfd, 0x36, 0x07, 0x7b, 0x8d, 0x3e, 0xd9, 0xb6, 0xeb, 0xc4, 0x7c, +- 0x31, 0x95, 0x35, 0xa3, 0x51, 0x6c, 0xe2, 0xb8, 0x57, 0x0f, 0x3f, 0x9a, +- 0xd3, 0x4b, 0x7e, 0xbc, 0xe2, 0xd3, 0x1e, 0xda, 0x74, 0x36, 0xb7, 0x6a, +- 0x1d, 0x15, 0x2e, 0x5e, 0xc9, 0xff, 0xc2, 0xc5, 0xc5, 0x7f, 0x84, 0x97, +- 0x4f, 0xe3, 0x7f, 0x27, 0x39, 0xa7, 0x70, 0xe9, 0x3a, 0xf4, 0xd0, 0x8f, +- 0x0a, 0x03, 0x75, 0xd8, 0x3a, 0x7a, 0xf9, 0x1c, 0x5d, 0x2e, 0x8f, 0x3d, +- 0x07, 0xcc, 0xc3, 0x5c, 0x82, 0xad, 0x7e, 0xbf, 0x2a, 0x7d, 0x5b, 0x68, +- 0x37, 0x6f, 0xc8, 0x72, 0xa7, 0x4a, 0xb9, 0x36, 0x95, 0x9f, 0xe7, 0xdb, +- 0x99, 0x7a, 0x4d, 0x2d, 0x40, 0x71, 0x9e, 0x37, 0x78, 0x73, 0xb9, 0x0e, +- 0xf3, 0x9b, 0xa4, 0xe8, 0x4b, 0xc6, 0x90, 0xcd, 0x5f, 0xc5, 0x5e, 0x2e, +- 0xc5, 0x83, 0xf8, 0xb4, 0x22, 0x43, 0x6c, 0x25, 0x48, 0x7f, 0xd6, 0xc3, +- 0x4d, 0x0c, 0x35, 0x67, 0x13, 0x88, 0x39, 0x22, 0x4d, 0x8d, 0x6b, 0x12, +- 0x73, 0xb5, 0x67, 0x72, 0xf9, 0xf1, 0x7e, 0xc6, 0x1e, 0xd5, 0x90, 0xb5, +- 0x19, 0xda, 0xc3, 0xb0, 0xe8, 0xa7, 0x43, 0xb9, 0x98, 0x0b, 0x47, 0xc9, +- 0x15, 0x19, 0x57, 0x0d, 0xc9, 0x91, 0x1a, 0x95, 0xa5, 0xc3, 0x52, 0x87, +- 0xf6, 0x70, 0x19, 0x67, 0xcc, 0x8e, 0xb7, 0x0c, 0x9e, 0x01, 0xe1, 0x8a, +- 0x3a, 0x36, 0x90, 0x9b, 0x94, 0x0c, 0xf8, 0x69, 0xef, 0x95, 0x28, 0xde, +- 0x1d, 0xc1, 0xfa, 0x51, 0x0d, 0x45, 0xbb, 0x2d, 0x6b, 0x6e, 0xa8, 0x1b, +- 0x6b, 0xd3, 0xcb, 0x0b, 0x24, 0x9f, 0x73, 0xf6, 0x11, 0x2b, 0x88, 0x2b, +- 0xeb, 0x92, 0x0a, 0x6e, 0x24, 0x07, 0x88, 0xa2, 0x99, 0xdc, 0x5d, 0xf0, +- 0xc5, 0xea, 0x9c, 0x1d, 0x71, 0xd1, 0x4e, 0x56, 0xf1, 0x7e, 0x0b, 0xb1, +- 0xa7, 0x85, 0x58, 0x62, 0x59, 0x1f, 0x5e, 0x8b, 0xce, 0x92, 0xc8, 0x1d, +- 0xc4, 0xa0, 0x1a, 0xe6, 0x0f, 0xc2, 0x39, 0xae, 0x45, 0x1b, 0xb1, 0xbb, +- 0xb0, 0xcf, 0xce, 0xf1, 0xa8, 0x47, 0xc6, 0xd5, 0x34, 0xe3, 0x32, 0x65, +- 0x7f, 0x9e, 0x7c, 0xbd, 0x83, 0x7e, 0x54, 0xde, 0xb7, 0x81, 0xf1, 0xd9, +- 0x83, 0xb2, 0x81, 0x6b, 0xb0, 0x91, 0xd8, 0x7e, 0xdf, 0x2e, 0x3f, 0x52, +- 0x8b, 0x6e, 0xa0, 0x7c, 0x0f, 0x62, 0x7d, 0xd2, 0x90, 0xbc, 0x2e, 0x1a, +- 0x5c, 0xf4, 0x20, 0xfb, 0xa5, 0x7d, 0xec, 0x92, 0x1c, 0xb1, 0x04, 0x4b, +- 0x9a, 0x81, 0x60, 0x9f, 0x60, 0x8e, 0x8c, 0xff, 0x36, 0x59, 0xcf, 0x82, +- 0xd1, 0x37, 0x75, 0x3e, 0xa6, 0x72, 0x39, 0x59, 0x1b, 0x6c, 0xc6, 0x7c, +- 0xc6, 0x2f, 0xb1, 0x21, 0x8d, 0x79, 0x6f, 0x91, 0x62, 0xf8, 0xf6, 0xd3, +- 0x17, 0x25, 0x17, 0xbb, 0xae, 0x2f, 0x1f, 0xaf, 0xf5, 0xcc, 0x62, 0x47, +- 0x27, 0xb1, 0x42, 0x6f, 0xff, 0xad, 0xa2, 0xaf, 0x3b, 0xa5, 0xfc, 0x18, +- 0x07, 0xc7, 0x5e, 0xc7, 0xd0, 0x98, 0x5b, 0x19, 0x1d, 0x93, 0xbe, 0x26, +- 0xd0, 0x9b, 0xfe, 0x73, 0x7d, 0x4d, 0x5d, 0x13, 0x5a, 0x74, 0xc9, 0x3a, +- 0xd2, 0x8d, 0xb9, 0xdc, 0x75, 0xe9, 0x25, 0x9c, 0x5e, 0xe6, 0x44, 0x6c, +- 0xcf, 0x8b, 0xee, 0xe4, 0xc5, 0xb5, 0x8a, 0xfe, 0xc4, 0x76, 0xdb, 0x07, +- 0x9b, 0xd3, 0x62, 0x93, 0xcc, 0xef, 0xcc, 0x39, 0xf6, 0xb3, 0x1b, 0x59, +- 0x5f, 0x58, 0xb3, 0xab, 0xd7, 0xbe, 0x77, 0xd0, 0xfc, 0x2b, 0x64, 0xec, +- 0x6b, 0x8b, 0xe9, 0x7f, 0x8c, 0x93, 0xc4, 0xbd, 0x60, 0xc8, 0x87, 0xc2, +- 0x0a, 0x59, 0x5b, 0xba, 0xb8, 0x1e, 0xb1, 0x61, 0x17, 0x69, 0x84, 0x8d, +- 0x2b, 0x0d, 0xc4, 0xb8, 0x1a, 0xce, 0x77, 0x16, 0x4b, 0xd6, 0xd3, 0x86, +- 0x6e, 0x11, 0x1b, 0x72, 0x65, 0x6d, 0xe8, 0x0f, 0xd7, 0x3c, 0x54, 0x90, +- 0xaf, 0x6a, 0x65, 0x76, 0x2e, 0xda, 0xa8, 0xdc, 0x9a, 0xb3, 0xab, 0xcf, +- 0xa6, 0xbf, 0x53, 0x90, 0xcb, 0x91, 0x2e, 0x2b, 0xff, 0x49, 0x3a, 0xb8, +- 0xe6, 0x2f, 0xd0, 0x81, 0x60, 0xbe, 0xe4, 0x31, 0xa2, 0x83, 0x99, 0x53, +- 0xfc, 0xf2, 0x93, 0xf4, 0x50, 0x9b, 0xd3, 0xc3, 0x62, 0x62, 0x48, 0x25, +- 0x71, 0x4f, 0x38, 0x4b, 0x00, 0x4f, 0x6a, 0x79, 0x3d, 0x38, 0x73, 0x7a, +- 0xd0, 0xff, 0x40, 0x0f, 0xf7, 0x13, 0x5f, 0x4b, 0xd9, 0x56, 0x31, 0x8f, +- 0x77, 0xa9, 0x87, 0x8d, 0xc3, 0x8b, 0xf1, 0x00, 0x7d, 0x69, 0x83, 0xbd, +- 0x5e, 0x23, 0xcf, 0xef, 0x5c, 0x97, 0xe8, 0x66, 0x25, 0xe5, 0xf7, 0x17, +- 0xa8, 0x98, 0x41, 0x1d, 0xf8, 0x6c, 0x3c, 0x95, 0x3e, 0x1a, 0x95, 0xdb, +- 0x87, 0x05, 0xe3, 0x3e, 0xa6, 0x0e, 0x3a, 0x18, 0x07, 0xfe, 0x54, 0x9e, +- 0x21, 0xfd, 0x7f, 0x7c, 0x41, 0x57, 0x7f, 0xbc, 0xdc, 0x8f, 0xa9, 0x03, +- 0x79, 0x26, 0x22, 0x6b, 0xec, 0xf2, 0x7c, 0x44, 0xf4, 0x61, 0x4c, 0xd1, +- 0x83, 0x65, 0x1d, 0x31, 0xe7, 0x21, 0x56, 0xa9, 0xf7, 0x4b, 0x1c, 0xed, +- 0x27, 0xa6, 0x38, 0x98, 0xb7, 0x17, 0x44, 0xa2, 0x14, 0x5b, 0xbd, 0x81, +- 0x4c, 0xa7, 0xce, 0x81, 0x4e, 0x9c, 0x31, 0x8d, 0x9e, 0xb5, 0xf8, 0x2b, +- 0x74, 0x79, 0x2d, 0x1c, 0x60, 0x3b, 0x9b, 0x92, 0x45, 0x58, 0x57, 0x47, +- 0xd3, 0x5c, 0xe9, 0xc1, 0xce, 0x64, 0xbc, 0x85, 0xd0, 0xc2, 0xd8, 0x74, +- 0xe6, 0xf6, 0x44, 0x40, 0x6f, 0xde, 0x40, 0xbe, 0xb6, 0xbc, 0xd7, 0x0d, +- 0xbf, 0x92, 0x8d, 0xcf, 0x03, 0xaa, 0xac, 0x7f, 0x5e, 0xc9, 0xb1, 0x77, +- 0xdb, 0x79, 0xac, 0x7f, 0x9a, 0xf4, 0xe3, 0x47, 0x3c, 0x2d, 0x75, 0xa9, +- 0xb3, 0xb9, 0x0a, 0x96, 0xcf, 0xd5, 0xe3, 0x51, 0xc5, 0xb2, 0x16, 0x84, +- 0x9c, 0xf6, 0xfd, 0xed, 0xe9, 0xda, 0x96, 0xdb, 0xd4, 0xd7, 0xad, 0xec, +- 0x9a, 0xab, 0xae, 0x45, 0x99, 0x0c, 0x1d, 0xff, 0xa3, 0xcf, 0x1d, 0x82, +- 0x90, 0xe7, 0x41, 0x6e, 0x63, 0x25, 0x0e, 0xe5, 0xd6, 0x1d, 0x5d, 0x91, +- 0xc3, 0x5f, 0x3e, 0x60, 0x48, 0xbe, 0x26, 0x7a, 0x92, 0xfe, 0xc4, 0x9e, +- 0x1e, 0x28, 0x14, 0x1c, 0xed, 0x4a, 0x2f, 0xe4, 0x3c, 0xfe, 0x87, 0x35, +- 0xea, 0x9d, 0x5a, 0x76, 0x89, 0x9a, 0x7d, 0x8e, 0x20, 0x65, 0xf3, 0xe5, +- 0xe6, 0x10, 0x57, 0x1a, 0x30, 0x7c, 0x49, 0x9b, 0x92, 0x6f, 0xe7, 0xdb, +- 0xec, 0x2d, 0x14, 0x5e, 0x55, 0x81, 0x42, 0xe2, 0xe3, 0x6f, 0xac, 0x83, +- 0x97, 0xb4, 0xb7, 0xd1, 0x95, 0x6d, 0x6f, 0x0f, 0xcb, 0x48, 0xd9, 0x02, +- 0xd6, 0x79, 0x37, 0xc7, 0x7f, 0xf3, 0x65, 0x3e, 0x77, 0x59, 0x19, 0x66, +- 0x78, 0xc6, 0x5b, 0xd6, 0xfe, 0x4b, 0xca, 0x7c, 0xda, 0x79, 0x69, 0x19, +- 0x27, 0x66, 0x1b, 0xaf, 0x5b, 0xc7, 0x2f, 0x29, 0x33, 0x70, 0x59, 0x99, +- 0x6b, 0x31, 0x56, 0xf7, 0xb8, 0x35, 0x94, 0x9d, 0x9b, 0x0c, 0x5d, 0xd0, +- 0x3d, 0x23, 0xe2, 0xfe, 0xd2, 0x75, 0xf3, 0x74, 0xf2, 0x4d, 0x79, 0x16, +- 0xe5, 0x46, 0x26, 0x3b, 0x37, 0x71, 0x99, 0x1b, 0xd7, 0x82, 0xfc, 0xdc, +- 0x3c, 0x90, 0xab, 0x9f, 0x6f, 0x37, 0x56, 0x70, 0x69, 0xbb, 0xf9, 0xeb, +- 0x8e, 0xcb, 0xe4, 0x9e, 0xb8, 0xac, 0x5c, 0x51, 0xe1, 0x27, 0xd7, 0xfb, +- 0x81, 0xe3, 0xd2, 0xeb, 0xff, 0x43, 0xbd, 0xf4, 0xfc, 0x9a, 0xdc, 0x79, +- 0x5e, 0xff, 0xd6, 0x65, 0xf7, 0x1d, 0x97, 0x9d, 0x3f, 0xa3, 0x7e, 0x72, +- 0x3f, 0xab, 0x2e, 0xeb, 0xc7, 0x5e, 0x83, 0xc7, 0x73, 0x17, 0x70, 0x03, +- 0x8d, 0x05, 0x08, 0x98, 0x4e, 0x05, 0x7e, 0xe2, 0x87, 0xff, 0xf9, 0xcb, +- 0xd6, 0xe2, 0x1b, 0x2f, 0xe0, 0xc7, 0x25, 0x5c, 0x35, 0x56, 0x18, 0x91, +- 0x38, 0x28, 0x3c, 0x55, 0xf8, 0xe2, 0x27, 0xf1, 0xef, 0xb2, 0x58, 0x51, +- 0xa4, 0x1e, 0xfe, 0xb1, 0x99, 0xfe, 0xb7, 0x12, 0xb2, 0x1e, 0xfb, 0x7b, +- 0x72, 0x2e, 0xc3, 0x77, 0x08, 0x33, 0xfd, 0x3f, 0x4d, 0x95, 0xb8, 0x51, +- 0xe6, 0xc1, 0x8d, 0x89, 0x4f, 0xae, 0xa7, 0x46, 0xa0, 0x2c, 0xab, 0xf7, +- 0x31, 0xaf, 0x84, 0xf3, 0xa6, 0x79, 0x98, 0xf2, 0xd7, 0x2c, 0x79, 0xae, +- 0x7a, 0xb2, 0x3e, 0xcc, 0x18, 0x9f, 0x7d, 0x8e, 0xbc, 0x24, 0xad, 0xfb, +- 0xa2, 0x4a, 0xf6, 0x59, 0xf1, 0xba, 0xd0, 0x47, 0xe4, 0x45, 0x9d, 0x94, +- 0xcb, 0x62, 0x5f, 0xc0, 0x86, 0x84, 0x65, 0x3d, 0xc7, 0xfc, 0x5c, 0xf6, +- 0x20, 0xfc, 0x22, 0xf5, 0x3b, 0x6b, 0xc2, 0xeb, 0xc4, 0xdb, 0xc6, 0xd4, +- 0xf6, 0xfc, 0x28, 0x8f, 0x98, 0xcc, 0x13, 0xed, 0x13, 0x75, 0xcc, 0xa8, +- 0x6d, 0x3f, 0x40, 0xbf, 0x9b, 0x1f, 0xd0, 0xfd, 0x7d, 0xf8, 0x3f, 0x96, +- 0xbf, 0x5a, 0x0f, 0x0e, 0x29, 0xf9, 0xf5, 0xef, 0xcb, 0xd7, 0xb9, 0xcb, +- 0x62, 0x2e, 0x8e, 0x6f, 0xbf, 0xbd, 0xd6, 0x5d, 0x40, 0xac, 0x44, 0xcc, +- 0x19, 0x99, 0xe9, 0xdf, 0x9a, 0xb0, 0xc7, 0x49, 0x5e, 0xa9, 0xe0, 0x64, +- 0xfd, 0x4c, 0xff, 0xa6, 0x94, 0x17, 0x3b, 0x18, 0xd3, 0x8b, 0x8c, 0x7a, +- 0x3c, 0x9e, 0x52, 0x71, 0xcf, 0x23, 0x5e, 0xac, 0x21, 0x67, 0x6d, 0xef, +- 0xfd, 0x1a, 0x8c, 0xab, 0x9c, 0xb8, 0x9b, 0xf6, 0xb7, 0x96, 0xae, 0x23, +- 0xf9, 0xc3, 0xfa, 0x5e, 0x27, 0xea, 0xae, 0x2a, 0x43, 0xbc, 0xba, 0x10, +- 0xdf, 0x33, 0x1d, 0xcc, 0xf7, 0x4a, 0x30, 0x64, 0x73, 0x69, 0xc9, 0xe1, +- 0x05, 0x13, 0x45, 0x6f, 0x0e, 0x7b, 0xbd, 0xf5, 0x93, 0xe3, 0xc1, 0x7f, +- 0x58, 0x99, 0xea, 0x1d, 0x36, 0x8e, 0x3b, 0x22, 0xa6, 0x1d, 0x73, 0x81, +- 0x2c, 0x9f, 0xeb, 0xba, 0xe4, 0x79, 0x77, 0xb3, 0x32, 0x3b, 0x12, 0x98, +- 0x58, 0xac, 0x38, 0x10, 0x0e, 0x94, 0xc5, 0xca, 0x23, 0x61, 0x2c, 0x4b, +- 0x77, 0xf9, 0x7c, 0xf6, 0x33, 0xf4, 0x08, 0xce, 0x2d, 0x32, 0x99, 0xfb, +- 0xc3, 0xb9, 0x8c, 0xba, 0x6f, 0xa4, 0x5e, 0xb7, 0x98, 0x1f, 0x59, 0x19, +- 0xdb, 0xef, 0xdd, 0x88, 0x31, 0x07, 0x5b, 0x4b, 0xfd, 0x3a, 0xa8, 0xc7, +- 0x9f, 0xe7, 0xf4, 0x2b, 0x3a, 0x2d, 0x19, 0xfb, 0x9d, 0x75, 0x92, 0xfa, +- 0x75, 0xb3, 0x3d, 0x37, 0xdb, 0x2b, 0x1a, 0xbb, 0x54, 0xcf, 0x85, 0x94, +- 0x67, 0x99, 0x2d, 0xc3, 0x42, 0x79, 0x86, 0xe9, 0x8f, 0x2a, 0x32, 0x1e, +- 0xc1, 0xf7, 0x3f, 0x37, 0xa6, 0x1f, 0x4f, 0xc9, 0x55, 0x44, 0xff, 0x7e, +- 0xea, 0x5f, 0x30, 0x5c, 0xe6, 0xa0, 0x4e, 0xd6, 0xbb, 0x7a, 0x80, 0x97, +- 0x98, 0xcc, 0x2a, 0xa8, 0x32, 0x22, 0x78, 0xaa, 0xd9, 0x83, 0xb7, 0x12, +- 0xa5, 0xf6, 0xb8, 0xaf, 0x9a, 0x6b, 0x59, 0x4f, 0x86, 0xfc, 0xf8, 0x85, +- 0x51, 0x1b, 0x5e, 0xa0, 0xea, 0xcc, 0x1f, 0xbd, 0x48, 0x10, 0x67, 0xbb, +- 0x92, 0xb3, 0x38, 0x5f, 0x5e, 0x6c, 0x4d, 0xa2, 0x9d, 0xf6, 0xe4, 0x77, +- 0x44, 0x80, 0x33, 0x09, 0x23, 0xb8, 0x85, 0xfd, 0x0f, 0x7b, 0xeb, 0xc9, +- 0xd3, 0xd5, 0x46, 0xd2, 0xbd, 0x78, 0x51, 0xc4, 0x88, 0x6f, 0xc3, 0xcf, +- 0xac, 0x21, 0xe2, 0x7c, 0x41, 0x48, 0xd6, 0x1c, 0x67, 0xe3, 0x19, 0xcd, +- 0x81, 0x17, 0x83, 0xcc, 0x87, 0x2b, 0x1c, 0x28, 0x31, 0xde, 0xb6, 0x7e, +- 0xe0, 0x95, 0x7e, 0x64, 0x2c, 0x33, 0x38, 0x0e, 0xc5, 0xc6, 0xc2, 0xad, +- 0xc9, 0x7a, 0xea, 0xfb, 0xf2, 0xfe, 0xff, 0x8f, 0x35, 0xe9, 0x95, 0xfe, +- 0x75, 0xcd, 0xaf, 0x72, 0x0c, 0x7f, 0x14, 0xbb, 0xbf, 0x6f, 0xbd, 0x64, +- 0xb7, 0x79, 0xbb, 0x3b, 0x1b, 0x4f, 0xa5, 0xbd, 0xb7, 0x38, 0x3e, 0x69, +- 0x33, 0xdf, 0x8f, 0xe8, 0xed, 0x8c, 0x5b, 0xfc, 0x79, 0x6b, 0x52, 0xf4, +- 0x27, 0x78, 0x75, 0xd2, 0xc2, 0x34, 0x39, 0x7f, 0xd6, 0x2e, 0x1b, 0xa7, +- 0xbe, 0xba, 0x68, 0x43, 0x8c, 0xe1, 0x3e, 0xd8, 0xbb, 0x3b, 0x34, 0x3b, +- 0x9f, 0xdb, 0xcc, 0x1c, 0x60, 0xc8, 0x5b, 0x8e, 0xad, 0x26, 0xed, 0xce, +- 0x50, 0xe7, 0x38, 0x61, 0xe1, 0xa4, 0x29, 0xe7, 0x2e, 0x4c, 0x7a, 0x1d, +- 0xd8, 0x66, 0x3a, 0xb1, 0xce, 0x50, 0x75, 0xb9, 0xee, 0x08, 0xc9, 0xb9, +- 0x0b, 0xfe, 0x6a, 0x05, 0x3b, 0x18, 0x3e, 0xd6, 0x1b, 0x5d, 0x7e, 0xb9, +- 0xbe, 0x24, 0x24, 0xe7, 0x0a, 0xda, 0xa8, 0x93, 0xb8, 0xa6, 0x60, 0x83, +- 0x21, 0xcf, 0x4d, 0xb3, 0xfc, 0x39, 0x06, 0xcb, 0xda, 0x61, 0x36, 0x5c, +- 0x57, 0xc2, 0x72, 0x67, 0x4d, 0xe1, 0x83, 0x87, 0xef, 0x98, 0x1f, 0x88, +- 0x47, 0x0b, 0xa0, 0xc7, 0x8a, 0xe8, 0xa7, 0x5b, 0x7b, 0x67, 0xb3, 0x9e, +- 0x42, 0x6e, 0xe0, 0xf4, 0x6d, 0x87, 0xc4, 0xcf, 0x80, 0xff, 0xa7, 0x4c, +- 0xb2, 0x86, 0xbc, 0xf3, 0xa8, 0x59, 0xc3, 0x7f, 0x9a, 0xf3, 0x56, 0x6e, +- 0x38, 0xdb, 0x5f, 0x85, 0xbe, 0xae, 0x48, 0x99, 0x17, 0x2c, 0x63, 0xae, +- 0x10, 0x27, 0xbe, 0x8f, 0x8c, 0x39, 0xb1, 0x25, 0x69, 0x68, 0x07, 0x6d, +- 0xfe, 0xe7, 0xa4, 0x2e, 0x9c, 0xcc, 0xcf, 0x03, 0xda, 0x84, 0x92, 0x3f, +- 0x9f, 0x2d, 0xd8, 0x40, 0x3e, 0x2f, 0xf8, 0x16, 0xb7, 0x9e, 0xad, 0x17, +- 0xaa, 0xe1, 0xf6, 0xc7, 0x52, 0x1e, 0x1e, 0x1a, 0x0f, 0xaf, 0x7f, 0x4d, +- 0xca, 0xe7, 0x6f, 0x4b, 0xc1, 0xdf, 0x9a, 0xca, 0xdb, 0x65, 0xde, 0xb7, +- 0x05, 0xdb, 0x2c, 0x72, 0xd6, 0x6c, 0x6e, 0xd6, 0x25, 0xb9, 0x0f, 0xe4, +- 0xb9, 0xdf, 0xe1, 0x3b, 0x9e, 0xa3, 0xad, 0xbb, 0x98, 0x0f, 0x6c, 0x33, +- 0xe2, 0x51, 0x79, 0x0e, 0x69, 0x84, 0x74, 0x5f, 0x81, 0xe2, 0xc7, 0xd6, +- 0xba, 0xdf, 0x72, 0x3e, 0xc9, 0x93, 0x53, 0x9f, 0x29, 0xca, 0xce, 0x87, +- 0xf8, 0x99, 0x60, 0x80, 0x9f, 0xf9, 0x92, 0xcf, 0xdf, 0xc5, 0x7e, 0x36, +- 0xa7, 0xa6, 0xfa, 0x80, 0x82, 0x9b, 0xd8, 0x56, 0x43, 0x08, 0xce, 0xa5, +- 0x75, 0xbf, 0xb1, 0x32, 0xde, 0xec, 0x33, 0xc8, 0x2c, 0xe6, 0x81, 0x36, +- 0x67, 0xf7, 0xe9, 0xdc, 0x5f, 0x27, 0xfb, 0x8e, 0x14, 0x0c, 0xd3, 0xa7, +- 0x36, 0xa5, 0xc5, 0x9e, 0xb2, 0x7a, 0x8d, 0xff, 0x01, 0xfe, 0x98, 0xb8, +- 0x37, 0x89, 0x58, 0x41, 0x44, 0xf0, 0xc7, 0xed, 0x7f, 0x29, 0x55, 0x47, +- 0x0e, 0x2f, 0xcf, 0xf2, 0xdd, 0x9c, 0x67, 0x8f, 0xff, 0xc5, 0xd4, 0xf5, +- 0xb8, 0x67, 0x4f, 0x18, 0xeb, 0xf6, 0xa0, 0xae, 0x88, 0x72, 0x17, 0x86, +- 0x02, 0xfe, 0x51, 0x68, 0xfe, 0x67, 0xa8, 0x87, 0x13, 0x94, 0xed, 0xe4, +- 0x25, 0xb2, 0x89, 0xde, 0xe0, 0xbf, 0x2f, 0xe1, 0x46, 0x2a, 0xf4, 0xa1, +- 0x15, 0xb7, 0x79, 0x86, 0xd7, 0xbf, 0x31, 0xe1, 0x47, 0xc6, 0xe6, 0xac, +- 0xae, 0x22, 0xc9, 0x1f, 0xbb, 0x93, 0xf1, 0x28, 0xd3, 0xe1, 0xdc, 0x9c, +- 0xea, 0x61, 0x99, 0xcf, 0x33, 0x09, 0xb9, 0x17, 0xfd, 0x9a, 0x0a, 0xdd, +- 0xaf, 0x32, 0x7e, 0xf6, 0x9b, 0x62, 0xb3, 0x35, 0xa2, 0x93, 0x20, 0x2b, +- 0xc6, 0x3d, 0x91, 0x40, 0x4b, 0x1d, 0xaf, 0x6b, 0x0b, 0x10, 0xab, 0x88, +- 0x08, 0x27, 0xf4, 0xfa, 0x6b, 0xc7, 0x7d, 0x7e, 0x73, 0x1c, 0xfe, 0x2b, +- 0xc7, 0xa7, 0x8a, 0x40, 0x6e, 0xff, 0x89, 0xb9, 0x9f, 0xd7, 0xbf, 0x36, +- 0x31, 0x1b, 0x6a, 0x24, 0x6e, 0x2d, 0xa9, 0x3f, 0x67, 0xcd, 0x8e, 0x18, +- 0x99, 0x93, 0x94, 0xe1, 0xc3, 0x6b, 0xf5, 0xf8, 0x0c, 0xc7, 0x89, 0x87, +- 0xb4, 0x29, 0x7d, 0xbc, 0x1f, 0xfa, 0xff, 0xdb, 0x47, 0x3e, 0xb6, 0x89, +- 0xfc, 0x12, 0xdf, 0x72, 0x73, 0xaa, 0xe6, 0xc7, 0xa2, 0x70, 0x4e, 0x39, +- 0x1f, 0xc9, 0x7c, 0xac, 0xb2, 0xac, 0x56, 0xc3, 0x97, 0x7b, 0xfe, 0x07, +- 0xda, 0xcb, 0x89, 0xeb, 0x9c, 0x58, 0x4c, 0x7b, 0x6f, 0xf8, 0x6b, 0x27, +- 0xa2, 0xbe, 0x42, 0xc6, 0x50, 0xd9, 0x53, 0xf0, 0x4c, 0xdd, 0xa4, 0x35, +- 0x61, 0xd4, 0xa1, 0x21, 0x2d, 0xcf, 0x63, 0x1d, 0xb4, 0x63, 0x0b, 0x8f, +- 0x9b, 0x72, 0x5f, 0xf0, 0x24, 0x1e, 0x73, 0xd0, 0x26, 0xdc, 0x86, 0xde, +- 0xf2, 0x0f, 0x4a, 0x19, 0x8a, 0x23, 0xce, 0xe0, 0x04, 0xf4, 0xf0, 0x7a, +- 0x72, 0x63, 0x7f, 0xc5, 0x3c, 0x53, 0xd4, 0xfe, 0x4e, 0x22, 0x60, 0x06, +- 0x72, 0xf1, 0xe7, 0x2c, 0xe7, 0xeb, 0xdd, 0x84, 0xb1, 0xee, 0xb9, 0xdc, +- 0xf9, 0xbf, 0xa5, 0xa6, 0xe6, 0xbf, 0x62, 0x77, 0x6e, 0xf7, 0xe6, 0x04, +- 0xde, 0x77, 0xd4, 0xe3, 0xfd, 0xfd, 0x66, 0x01, 0xf3, 0x36, 0xb1, 0x47, +- 0xb7, 0x7b, 0x6b, 0x02, 0x93, 0x4e, 0x5e, 0x3b, 0x6b, 0xce, 0x22, 0x76, +- 0xa9, 0xbc, 0x16, 0x96, 0x58, 0x10, 0xd3, 0x18, 0x47, 0x8b, 0x23, 0x5e, +- 0x77, 0xf1, 0x38, 0xb4, 0x22, 0xa3, 0x8c, 0x79, 0x31, 0x1a, 0x1d, 0x7d, +- 0xba, 0xbf, 0xc9, 0x51, 0xc7, 0xfc, 0xd8, 0xaf, 0xb8, 0x8c, 0x6f, 0x31, +- 0xcf, 0x97, 0xf5, 0xaa, 0x30, 0xc7, 0xed, 0x64, 0x85, 0x9d, 0xd3, 0xd4, +- 0x88, 0x42, 0xcc, 0x2b, 0xc3, 0xbd, 0xda, 0x86, 0xc5, 0x6a, 0xa4, 0x1f, +- 0xb7, 0xd6, 0xbb, 0x1b, 0xcb, 0xc7, 0xf3, 0x3a, 0x41, 0xcc, 0x13, 0x61, +- 0x0e, 0x63, 0x40, 0x2d, 0x8d, 0x88, 0x6e, 0xfc, 0x8d, 0x7d, 0x63, 0x22, +- 0xab, 0xe6, 0xee, 0x1d, 0xf3, 0x14, 0xa3, 0x38, 0x4c, 0x4c, 0xfa, 0x57, +- 0xdf, 0x7f, 0xae, 0xde, 0x64, 0x91, 0xe0, 0xba, 0xcb, 0x90, 0xff, 0xb6, +- 0x3d, 0xb9, 0xdd, 0x91, 0x63, 0x31, 0x77, 0xc0, 0xb2, 0x18, 0x0f, 0x7d, +- 0x50, 0x66, 0x71, 0x3c, 0xf4, 0x29, 0xce, 0x4d, 0x5b, 0xea, 0x23, 0xeb, +- 0x33, 0x4e, 0x3b, 0xd6, 0xbb, 0x0b, 0x23, 0xe1, 0xbb, 0xde, 0x36, 0x7e, +- 0x6f, 0xbd, 0x95, 0x60, 0x5e, 0x4d, 0xdf, 0x2d, 0x20, 0x6e, 0x6f, 0x37, +- 0x9d, 0x4d, 0x4b, 0x15, 0x05, 0xdd, 0xc6, 0x3c, 0xad, 0x88, 0xf1, 0x68, +- 0x13, 0xfd, 0x37, 0xe6, 0x35, 0x82, 0xfb, 0xc1, 0x72, 0xa9, 0xb5, 0x6b, +- 0x5d, 0x91, 0x8d, 0x77, 0x8d, 0xd4, 0x8b, 0xcf, 0x9f, 0xbf, 0xeb, 0x39, +- 0xa3, 0x19, 0xdd, 0xe9, 0x41, 0xf4, 0xa4, 0xb3, 0xfd, 0x64, 0x30, 0xfb, +- 0x13, 0xfa, 0x59, 0xbb, 0xb6, 0x30, 0x22, 0x1c, 0xeb, 0xe8, 0x5d, 0x07, +- 0x8c, 0x28, 0xb6, 0xa4, 0x37, 0xde, 0x75, 0xb6, 0xbe, 0x9f, 0xff, 0xb3, +- 0x75, 0x86, 0x50, 0xfe, 0x89, 0x75, 0x4a, 0x22, 0xd2, 0x47, 0x98, 0x7d, +- 0x6c, 0xbc, 0x6b, 0xdd, 0xa2, 0xaf, 0x63, 0x73, 0x7a, 0xdd, 0x9f, 0xed, +- 0xa7, 0x94, 0x75, 0x8a, 0x23, 0x1d, 0xad, 0x37, 0x05, 0x36, 0xde, 0x95, +- 0x5a, 0xd4, 0xc3, 0x3e, 0x56, 0x31, 0x8e, 0x64, 0xeb, 0x44, 0x15, 0xc7, +- 0x27, 0xea, 0xa0, 0x28, 0xd2, 0xd3, 0x3a, 0x3f, 0xf0, 0x7b, 0x6b, 0x5e, +- 0x6f, 0x81, 0xad, 0x03, 0x17, 0x75, 0xf0, 0xa8, 0xe9, 0xcc, 0x04, 0x1c, +- 0xb6, 0x0e, 0x3a, 0x7c, 0xd4, 0x41, 0x1f, 0x75, 0x90, 0xa9, 0x36, 0xc2, +- 0xef, 0x51, 0x07, 0xf3, 0xc6, 0xd6, 0xae, 0x2d, 0x8a, 0xc0, 0xe9, 0x30, +- 0x5e, 0x77, 0x38, 0x39, 0x17, 0x2e, 0x63, 0x2d, 0xf5, 0xb6, 0xf1, 0xae, +- 0x39, 0x8b, 0x6c, 0x9d, 0x7f, 0xd9, 0x1d, 0xd8, 0x60, 0xef, 0xdd, 0xdb, +- 0x94, 0x6e, 0xe3, 0xd1, 0xc4, 0xe3, 0x61, 0x1e, 0xdd, 0xcc, 0x4d, 0xee, +- 0xa0, 0xae, 0x1a, 0x39, 0x8e, 0x15, 0x94, 0xab, 0x9d, 0xbf, 0x5b, 0xf8, +- 0xbb, 0x83, 0xbf, 0x65, 0x7e, 0xd4, 0x0b, 0xb2, 0xc5, 0x2e, 0xc8, 0xe6, +- 0xa0, 0x3c, 0x1e, 0x62, 0x94, 0x8c, 0x69, 0xe2, 0xcb, 0x37, 0x05, 0x62, +- 0x6c, 0xe3, 0xa9, 0x62, 0xd9, 0xf7, 0xe4, 0x32, 0xe2, 0x3e, 0x27, 0x44, +- 0x3e, 0xbd, 0x65, 0x1d, 0x32, 0xc4, 0xd8, 0xdf, 0x65, 0x31, 0x96, 0xb2, +- 0x95, 0x71, 0x7e, 0x5e, 0x59, 0x34, 0x34, 0xdd, 0x63, 0xc0, 0xe7, 0x36, +- 0xe2, 0xe8, 0x4d, 0x27, 0xa8, 0x03, 0xb1, 0x93, 0x07, 0xa9, 0xbf, 0x4e, +- 0x74, 0x19, 0x27, 0xf4, 0xec, 0xde, 0x89, 0xbd, 0x94, 0x21, 0x48, 0x7e, +- 0xe8, 0x81, 0x33, 0xa2, 0xfb, 0x1b, 0x1d, 0x5d, 0x41, 0x17, 0x68, 0xcb, +- 0xc5, 0x62, 0xcb, 0x71, 0xc6, 0x35, 0xc1, 0x3a, 0xb7, 0xd6, 0x66, 0xe3, +- 0x5f, 0x7c, 0xbe, 0x0b, 0x1e, 0x6d, 0x4d, 0x2a, 0x1f, 0x0b, 0x3c, 0x5a, +- 0x6b, 0x42, 0xfc, 0x4a, 0xd6, 0xfc, 0xc3, 0x76, 0x2c, 0x3f, 0x9e, 0x7e, +- 0xb1, 0x18, 0x65, 0xb6, 0x8f, 0x95, 0x39, 0x8d, 0x6c, 0xbb, 0x1a, 0xdb, +- 0x6d, 0x76, 0x68, 0xb8, 0xe8, 0x23, 0xba, 0xd6, 0xec, 0x90, 0x7d, 0xae, +- 0xf4, 0xfe, 0x54, 0xae, 0x5e, 0x16, 0x27, 0x16, 0xbb, 0x6c, 0x9c, 0x60, +- 0x1b, 0xc5, 0xc0, 0x92, 0xc4, 0xe5, 0xfd, 0x4b, 0x7f, 0xd2, 0x6f, 0x57, +- 0x85, 0x8a, 0x09, 0xfb, 0x99, 0xcb, 0x91, 0x74, 0x0c, 0x83, 0xc9, 0xa9, +- 0x7b, 0xf9, 0xf4, 0xa3, 0x6c, 0xff, 0x70, 0x9c, 0xfa, 0x98, 0x65, 0xc8, +- 0x3e, 0x3f, 0xd9, 0xdb, 0x37, 0x75, 0x5f, 0x9f, 0xc8, 0x56, 0x58, 0x42, +- 0x00, 0xc1, 0x01, 0xe2, 0x4c, 0xb4, 0x59, 0xea, 0x5b, 0xd6, 0x1b, 0xf3, +- 0x82, 0xc8, 0x54, 0x39, 0x31, 0x38, 0x17, 0x18, 0xe8, 0x93, 0x7d, 0x57, +- 0x47, 0x63, 0xab, 0x99, 0x97, 0x45, 0x2b, 0x6b, 0xb5, 0x4d, 0xaa, 0xec, +- 0x99, 0x3a, 0xf6, 0xe5, 0x6e, 0xa3, 0x46, 0xeb, 0x56, 0x33, 0x87, 0x88, +- 0xdd, 0x7b, 0x81, 0x69, 0x25, 0xe2, 0x6b, 0x15, 0x46, 0xb4, 0xa7, 0x02, +- 0x73, 0xe1, 0xaf, 0xb4, 0xf1, 0x32, 0xfe, 0x94, 0x6a, 0x04, 0x57, 0xda, +- 0x38, 0xf8, 0xa1, 0x35, 0xc4, 0xb8, 0xf4, 0x95, 0xb9, 0x3f, 0x28, 0xce, +- 0xe6, 0xd9, 0xd1, 0x75, 0xd3, 0x38, 0x57, 0xbf, 0x58, 0xa0, 0xfb, 0x53, +- 0x8a, 0xe8, 0x48, 0xb8, 0x49, 0x02, 0xdb, 0xc8, 0x75, 0x7f, 0x33, 0x37, +- 0x82, 0x83, 0xfc, 0xff, 0xf3, 0xeb, 0x65, 0x0f, 0xaa, 0x65, 0x05, 0x03, +- 0xf3, 0xc2, 0x15, 0x1c, 0xc3, 0x8b, 0xbc, 0xdf, 0x93, 0x7e, 0xdb, 0x3a, +- 0x3b, 0xcd, 0xe8, 0x5f, 0xc6, 0x40, 0x32, 0x30, 0xae, 0x6b, 0x93, 0xea, +- 0x7f, 0x76, 0x4f, 0x1d, 0xdc, 0x65, 0x1c, 0xcb, 0xf7, 0x02, 0xb5, 0x5a, +- 0x9f, 0xaa, 0x96, 0x88, 0x5e, 0x07, 0xc6, 0x7f, 0x3c, 0x65, 0xaf, 0x47, +- 0x9e, 0x1f, 0xda, 0x6b, 0x1d, 0x3d, 0x43, 0xf4, 0xa9, 0x21, 0x2d, 0x1a, +- 0xa7, 0xde, 0xdd, 0x55, 0x1c, 0xf3, 0x57, 0xe6, 0xde, 0x6a, 0x8f, 0xb3, +- 0xd2, 0x98, 0xc1, 0x31, 0x2a, 0xd0, 0xe6, 0xfe, 0x2c, 0xb7, 0xee, 0xd9, +- 0x40, 0x36, 0x33, 0x64, 0x35, 0xd2, 0x06, 0x0b, 0x58, 0xe7, 0x46, 0x73, +- 0xdf, 0xf4, 0xae, 0x3a, 0xdd, 0xf7, 0x15, 0xc6, 0xce, 0xd0, 0xdc, 0x5f, +- 0x5b, 0x51, 0xcd, 0x69, 0x7e, 0x93, 0xa3, 0xbe, 0x27, 0x21, 0x65, 0x65, +- 0x5e, 0x8d, 0xe8, 0x5c, 0xe5, 0x5d, 0x0b, 0xd5, 0x81, 0xf0, 0x5c, 0x7b, +- 0xfc, 0xc0, 0xdd, 0xa9, 0x04, 0xb6, 0x27, 0xa5, 0x4d, 0x05, 0xcb, 0x02, +- 0xef, 0x58, 0xfe, 0x69, 0x09, 0x6c, 0x4d, 0xff, 0x29, 0xae, 0x37, 0x28, +- 0x71, 0xbf, 0x25, 0x0e, 0x3d, 0x9a, 0x7d, 0xc6, 0x35, 0x5b, 0xd6, 0x94, +- 0x65, 0x0f, 0xd2, 0x5d, 0x89, 0x00, 0xdc, 0xa5, 0xc4, 0xba, 0xb1, 0x80, +- 0x3c, 0x13, 0xf5, 0x22, 0xd3, 0x2c, 0x65, 0x6a, 0xb4, 0x31, 0x64, 0xc8, +- 0xc4, 0x64, 0x7d, 0xb2, 0xa7, 0x24, 0xbb, 0x9f, 0x82, 0x86, 0x57, 0xad, +- 0x6b, 0x67, 0xc8, 0x9d, 0x9a, 0x0c, 0x69, 0x43, 0xc1, 0xfc, 0x40, 0x15, +- 0x6a, 0x57, 0xbe, 0xfe, 0x66, 0x41, 0xa0, 0x80, 0xb8, 0x2d, 0xfe, 0x64, +- 0xb4, 0x9f, 0xc4, 0xbf, 0xd3, 0xd7, 0x65, 0x6f, 0xd9, 0x16, 0xa9, 0xc7, +- 0xb6, 0xe6, 0x22, 0xa5, 0x39, 0xc9, 0x33, 0x64, 0x9f, 0xb2, 0x65, 0xdd, +- 0x14, 0x78, 0xcb, 0x8a, 0x56, 0x53, 0x1e, 0xf2, 0x9f, 0x6c, 0x5d, 0x29, +- 0x93, 0xdb, 0x33, 0xa4, 0x34, 0xdc, 0x25, 0x3a, 0x79, 0xd6, 0x8c, 0x93, +- 0x5d, 0x0b, 0xbe, 0x1e, 0x8b, 0xbd, 0x6d, 0x28, 0xf6, 0xb3, 0xca, 0x65, +- 0x4a, 0x39, 0xe3, 0x95, 0xd3, 0x3f, 0x62, 0xe7, 0xdf, 0x61, 0x62, 0xa1, +- 0xf0, 0x35, 0xc9, 0xa1, 0x9c, 0x78, 0xce, 0xa8, 0xc0, 0xb3, 0x5a, 0x96, +- 0xfb, 0x10, 0x53, 0xf0, 0x6a, 0x62, 0x5e, 0x86, 0x1e, 0x42, 0x0e, 0x69, +- 0xac, 0x3b, 0xaf, 0xfc, 0x3b, 0xf3, 0x2b, 0xe0, 0x95, 0x54, 0x3b, 0x1e, +- 0x95, 0x75, 0x3d, 0xa5, 0xa6, 0xa9, 0xd6, 0x21, 0xfd, 0xb5, 0x63, 0x5b, +- 0x5a, 0xda, 0x3a, 0x16, 0x3b, 0x60, 0xf4, 0xe7, 0x64, 0x15, 0xcc, 0x3c, +- 0x16, 0x7b, 0xce, 0x78, 0xdc, 0x9e, 0x3b, 0x79, 0x7e, 0xd6, 0x63, 0x0a, +- 0xb6, 0x14, 0x43, 0x25, 0x0f, 0x77, 0x18, 0x77, 0xc0, 0x51, 0xf1, 0x75, +- 0xda, 0x9e, 0xec, 0xbf, 0xb9, 0x13, 0xce, 0x0a, 0x17, 0x7d, 0xf3, 0x6e, +- 0xb8, 0x2a, 0x84, 0xfb, 0xe6, 0x79, 0x69, 0x94, 0xf7, 0x45, 0xb7, 0xe7, +- 0x6d, 0xdd, 0x3a, 0x89, 0xa7, 0xdd, 0x92, 0x27, 0x19, 0xe5, 0xd4, 0x91, +- 0xde, 0x42, 0x8e, 0x8c, 0x52, 0x62, 0x13, 0xe3, 0x90, 0xbb, 0x9c, 0x65, +- 0xde, 0xa3, 0xde, 0xe7, 0xf5, 0x96, 0x90, 0x13, 0x5b, 0xd6, 0x87, 0xe4, +- 0xc4, 0xf3, 0x03, 0xb5, 0x19, 0x83, 0xf1, 0x03, 0xb7, 0xe9, 0x4d, 0x71, +- 0xe6, 0x88, 0xab, 0x8d, 0xf3, 0x56, 0x6c, 0x95, 0x94, 0xd1, 0x7d, 0x31, +- 0x25, 0xdf, 0xc7, 0x02, 0xf8, 0xab, 0x2c, 0xb8, 0x22, 0xb2, 0x96, 0x2f, +- 0x6b, 0xb8, 0x0d, 0xf2, 0xcc, 0xb0, 0x59, 0xc6, 0xef, 0x92, 0x75, 0x41, +- 0x44, 0x27, 0x5c, 0x30, 0x32, 0x07, 0x65, 0xce, 0xa6, 0x5b, 0x08, 0x2c, +- 0xfc, 0x1d, 0x73, 0x0b, 0x99, 0x9f, 0x9a, 0x4c, 0x9d, 0x92, 0x09, 0xfa, +- 0xc8, 0x91, 0x9f, 0x80, 0xde, 0x9c, 0xa0, 0xae, 0x1b, 0x43, 0xb2, 0x0f, +- 0xc0, 0xe9, 0x4b, 0xc0, 0xe6, 0xc5, 0xe6, 0x69, 0x7c, 0x06, 0xa5, 0xcc, +- 0x05, 0xe7, 0x8e, 0xad, 0x40, 0x59, 0x45, 0xd4, 0x57, 0x8c, 0x6b, 0x78, +- 0xde, 0x46, 0xbe, 0xff, 0x05, 0x94, 0xad, 0x6c, 0x41, 0x82, 0x63, 0x2f, +- 0x35, 0xbe, 0xc4, 0x6b, 0x0f, 0xa3, 0x2f, 0xe9, 0xe2, 0x38, 0xfe, 0xd5, +- 0x2a, 0xab, 0x16, 0xd9, 0x4c, 0x6f, 0x09, 0xf3, 0xf4, 0xa8, 0xad, 0x0b, +- 0x62, 0x63, 0x52, 0xb8, 0x48, 0x6d, 0x74, 0x3d, 0x98, 0x2b, 0x57, 0xeb, +- 0x2d, 0x6d, 0x4a, 0x07, 0x6d, 0xb6, 0x9b, 0x3a, 0x97, 0xb2, 0x96, 0xb5, +- 0x3c, 0x30, 0x49, 0x1d, 0x77, 0xf0, 0xdc, 0xf0, 0xbf, 0x05, 0xf5, 0x9a, +- 0x42, 0x9c, 0xb2, 0xe2, 0x9a, 0x8f, 0x76, 0xa9, 0xae, 0x12, 0xde, 0xb2, +- 0x34, 0x74, 0xae, 0x44, 0xf6, 0x21, 0x67, 0xed, 0xf4, 0x68, 0x4e, 0x97, +- 0xe7, 0xef, 0xea, 0x36, 0x5e, 0xb5, 0xaf, 0x3b, 0xec, 0xeb, 0xe1, 0xdc, +- 0xf5, 0xa3, 0xbc, 0xfe, 0x3d, 0x5e, 0xef, 0xa1, 0xee, 0xd5, 0x2b, 0xa4, +- 0xfe, 0x5a, 0x53, 0xea, 0x33, 0x45, 0x31, 0xba, 0x73, 0xf3, 0xd1, 0xd1, +- 0x9a, 0x2d, 0xdb, 0xd3, 0x9a, 0x6d, 0xc3, 0xc9, 0x36, 0xe2, 0xd1, 0x62, +- 0x98, 0x28, 0x61, 0x9c, 0x3f, 0x6b, 0x88, 0x5c, 0x9c, 0xbb, 0xb4, 0xc8, +- 0xd5, 0xc6, 0xb8, 0xd2, 0xf5, 0x42, 0x31, 0xe2, 0x1d, 0x33, 0x6c, 0x3b, +- 0x3c, 0x7a, 0x97, 0xec, 0x8f, 0x7b, 0x5b, 0x69, 0xf0, 0xc9, 0xb6, 0xca, +- 0x24, 0x79, 0xe2, 0x43, 0xa6, 0x33, 0x5c, 0xe7, 0x98, 0x97, 0x29, 0x84, +- 0x11, 0x3b, 0xaf, 0x7c, 0x64, 0xe3, 0x43, 0x22, 0xd5, 0xc0, 0x4c, 0x26, +- 0x1e, 0x64, 0x0e, 0x12, 0x4c, 0x53, 0xb7, 0xad, 0x44, 0xec, 0xa3, 0xf6, +- 0x1e, 0x39, 0xe7, 0xc4, 0x0a, 0x34, 0xe8, 0x0e, 0xcc, 0x0b, 0xcf, 0x60, +- 0x26, 0x43, 0xbb, 0x34, 0x0b, 0x1d, 0xba, 0xff, 0x56, 0x7c, 0xc6, 0x23, +- 0xf5, 0x0e, 0xa6, 0x32, 0xeb, 0x8a, 0x39, 0xa7, 0xdf, 0xa0, 0x1c, 0xdb, +- 0x03, 0x22, 0xc7, 0xd7, 0x73, 0x72, 0xb4, 0x30, 0x66, 0x99, 0xda, 0xcd, +- 0x81, 0x9e, 0x0b, 0x7a, 0x7b, 0xc1, 0xd6, 0xdb, 0xc3, 0x3c, 0x2f, 0x64, +- 0xbe, 0x5c, 0x80, 0x13, 0x75, 0xde, 0xdc, 0x7e, 0x37, 0xc9, 0x7d, 0x04, +- 0x7f, 0xcf, 0x7c, 0x69, 0xb5, 0xa1, 0x87, 0x1d, 0x36, 0x67, 0x76, 0x23, +- 0x6e, 0xf3, 0x51, 0x79, 0x76, 0x5e, 0x86, 0xc7, 0xed, 0x72, 0x2e, 0xea, +- 0xa4, 0x04, 0x4f, 0xe4, 0xfc, 0x45, 0xf6, 0x2e, 0x7c, 0xc3, 0xfe, 0xbd, +- 0x97, 0x73, 0xeb, 0xa2, 0xaf, 0xe6, 0x63, 0x94, 0xac, 0x81, 0x6f, 0xb4, +- 0x7d, 0x7f, 0x08, 0xc7, 0xec, 0xff, 0x99, 0x6c, 0xfe, 0x82, 0x6e, 0x53, +- 0xf6, 0xfc, 0x94, 0x60, 0x93, 0x3c, 0x8b, 0x4c, 0x4b, 0x4e, 0x7d, 0x3d, +- 0xb6, 0x70, 0x54, 0x6e, 0x83, 0x1c, 0x43, 0x13, 0x9b, 0xe8, 0x44, 0x9f, +- 0x66, 0x7a, 0xd3, 0x75, 0x53, 0x73, 0x0f, 0x13, 0xfb, 0xeb, 0x7e, 0x6f, +- 0x45, 0xed, 0x7c, 0xe4, 0x94, 0x75, 0xc0, 0x38, 0x11, 0xa2, 0x07, 0xaf, +- 0x2b, 0xb0, 0xf5, 0x7b, 0xfe, 0x2e, 0x7b, 0x9f, 0x20, 0x65, 0x7e, 0x21, +- 0x21, 0x71, 0x74, 0x36, 0x52, 0xa6, 0xc8, 0xe6, 0x6c, 0xde, 0xc1, 0x39, +- 0xe9, 0x4e, 0x06, 0xa2, 0x57, 0xf2, 0xde, 0x04, 0x63, 0xd9, 0x26, 0xea, +- 0x33, 0xd6, 0x2c, 0x3c, 0xa8, 0x0d, 0x7b, 0x69, 0x63, 0xe3, 0xa6, 0x65, +- 0x1d, 0x24, 0x46, 0x94, 0xcf, 0x53, 0x91, 0xa9, 0x6e, 0x43, 0x92, 0xb1, +- 0xe9, 0xa0, 0xd1, 0xf0, 0x99, 0x02, 0xc4, 0xfd, 0x6e, 0xe8, 0xbe, 0xad, +- 0x1c, 0xcd, 0x43, 0x9c, 0xaf, 0x13, 0xa6, 0xf0, 0x33, 0xe7, 0xf9, 0xa5, +- 0x30, 0xc2, 0x8b, 0x1d, 0xff, 0x6a, 0x4d, 0xda, 0xcf, 0x51, 0xbb, 0xfe, +- 0x27, 0x65, 0x68, 0x17, 0xe7, 0x2d, 0xe7, 0x1c, 0xbf, 0x17, 0x90, 0xe7, +- 0xe0, 0x40, 0x6d, 0x6f, 0xc3, 0x3a, 0x91, 0xe1, 0x40, 0xc8, 0x19, 0x3b, +- 0x88, 0x40, 0xf3, 0x06, 0xe5, 0x22, 0x07, 0xbf, 0x72, 0xcc, 0xc4, 0x68, +- 0xdd, 0x8b, 0xe4, 0x0b, 0x52, 0xbf, 0x10, 0x4f, 0x9b, 0xcf, 0x5b, 0x35, +- 0xd3, 0xbf, 0x67, 0x1d, 0x32, 0xd4, 0xf5, 0xd4, 0x76, 0xac, 0x94, 0x6d, +- 0x95, 0xb0, 0xad, 0x7b, 0x03, 0xba, 0xb9, 0x83, 0x6d, 0x3d, 0x93, 0x38, +- 0x11, 0x74, 0xb3, 0xad, 0x27, 0x4c, 0xe1, 0xe0, 0xce, 0xa6, 0x26, 0xce, +- 0x6d, 0x57, 0x32, 0xe0, 0xdb, 0x46, 0xb9, 0x24, 0x37, 0xba, 0x33, 0x21, +- 0xef, 0x74, 0x7c, 0x9d, 0xe3, 0x89, 0xb6, 0xbb, 0xd0, 0xf0, 0x50, 0x19, +- 0xed, 0xa7, 0x1c, 0x79, 0x5b, 0xd7, 0x7d, 0xc4, 0x3b, 0xdc, 0xcb, 0x32, +- 0x6f, 0x06, 0x66, 0xe3, 0x95, 0x50, 0xc3, 0xca, 0xd9, 0x70, 0xc6, 0x0e, +- 0x29, 0x81, 0xa6, 0x0d, 0x4a, 0x5c, 0x13, 0x5b, 0xbc, 0x27, 0xa5, 0x07, +- 0x1b, 0x21, 0xd8, 0xdd, 0x42, 0x7d, 0xcc, 0xc6, 0x87, 0x0b, 0x45, 0x2e, +- 0x67, 0x38, 0xe8, 0x08, 0x74, 0x3c, 0xcf, 0xf9, 0x2d, 0x9b, 0x97, 0xcd, +- 0xfb, 0xd2, 0xf6, 0xbe, 0xce, 0x16, 0xf4, 0xa5, 0x4f, 0xbd, 0x77, 0xc0, +- 0x80, 0xf3, 0x68, 0xdd, 0xa3, 0x16, 0xec, 0x77, 0x40, 0x1a, 0x64, 0x1e, +- 0x5a, 0x64, 0x1e, 0x8a, 0xe9, 0x4f, 0x37, 0x51, 0xee, 0xf5, 0xb6, 0xdc, +- 0xb3, 0x31, 0x6c, 0xca, 0x7a, 0x92, 0x53, 0xbb, 0x07, 0x3d, 0xc4, 0xce, +- 0xc0, 0xf9, 0x2e, 0xf6, 0xf3, 0x26, 0x65, 0x9e, 0x47, 0xbd, 0x4f, 0x36, +- 0x0b, 0x3f, 0x7c, 0x18, 0xbd, 0xc9, 0xfc, 0x3b, 0x22, 0x0a, 0x52, 0x01, +- 0xe9, 0xe3, 0x61, 0xf2, 0xa5, 0x2e, 0x6b, 0xb2, 0x5a, 0xae, 0xef, 0x65, +- 0x2e, 0x1d, 0xd5, 0xe8, 0x0f, 0xd4, 0x3b, 0xf4, 0xd9, 0xd0, 0x27, 0xce, +- 0x38, 0xa2, 0xf4, 0x01, 0xd3, 0x7b, 0x9e, 0xd8, 0x70, 0x14, 0x1d, 0x16, +- 0x2a, 0x6c, 0x7b, 0xf8, 0xf9, 0x88, 0xf1, 0x0b, 0x45, 0x62, 0x7b, 0x86, +- 0x3a, 0x60, 0xb6, 0xdf, 0x2e, 0x3a, 0x28, 0xa5, 0xcf, 0x8e, 0x05, 0x74, +- 0xff, 0x2b, 0x94, 0x67, 0x07, 0xe5, 0x59, 0x91, 0x9d, 0x43, 0xdf, 0x16, +- 0x45, 0x7c, 0x3a, 0xd0, 0xbc, 0x9a, 0xd7, 0xb7, 0x53, 0x9e, 0x40, 0xaf, +- 0x82, 0xa1, 0xe6, 0x6e, 0xf2, 0xb1, 0x0e, 0xea, 0xe0, 0xa2, 0x3c, 0x6e, +- 0x7b, 0xce, 0x3a, 0xc8, 0x05, 0x0a, 0x99, 0xff, 0x0b, 0x7e, 0x6b, 0x18, +- 0xa6, 0x9d, 0xee, 0xe7, 0x8c, 0x44, 0xbd, 0x2a, 0x0a, 0x0d, 0xc1, 0x80, +- 0x6a, 0x5e, 0x73, 0x71, 0x6e, 0xca, 0x71, 0x48, 0xdb, 0x6b, 0xef, 0x69, +- 0xce, 0xe6, 0xea, 0x1f, 0x59, 0xa3, 0x5e, 0xe1, 0x67, 0xb2, 0xde, 0x24, +- 0x6b, 0x32, 0x71, 0x4f, 0x76, 0x4f, 0xb5, 0x8b, 0x3a, 0xc9, 0x5e, 0x7f, +- 0x41, 0x73, 0xe4, 0xf2, 0x66, 0xb9, 0xfe, 0x81, 0xf5, 0xac, 0x5d, 0x5e, +- 0xca, 0xb9, 0x6c, 0x2e, 0x5c, 0x6c, 0x97, 0xfb, 0xc0, 0x7a, 0x51, 0x73, +- 0x4e, 0x29, 0x97, 0x7f, 0x86, 0x77, 0xe2, 0x6b, 0x4e, 0x62, 0x5e, 0xe1, +- 0xdc, 0xc5, 0x38, 0x69, 0x9c, 0xaa, 0x39, 0x5d, 0xd7, 0xc9, 0x38, 0x36, +- 0x75, 0x1f, 0x98, 0x85, 0x27, 0xed, 0x1c, 0xb7, 0x6b, 0xbe, 0x03, 0x27, +- 0x76, 0x16, 0xd0, 0x27, 0xa3, 0x9a, 0xac, 0x87, 0x45, 0x4b, 0x72, 0x7b, +- 0x55, 0x24, 0x6f, 0x0c, 0xfa, 0xd5, 0xab, 0x6d, 0x6e, 0x18, 0x55, 0xff, +- 0xdc, 0x7e, 0x3b, 0xe1, 0x2e, 0x9d, 0xd8, 0x6f, 0xe4, 0x39, 0xcb, 0x89, +- 0x47, 0x55, 0xe2, 0xe4, 0x80, 0xb9, 0x58, 0x62, 0xb3, 0x9f, 0xf5, 0x83, +- 0x31, 0x75, 0x2a, 0xb7, 0x59, 0xed, 0x41, 0x59, 0xd7, 0x36, 0x07, 0x64, +- 0x9f, 0xa9, 0xec, 0x19, 0x95, 0xbe, 0x8a, 0x72, 0xeb, 0x3c, 0x9f, 0xc4, +- 0x35, 0xf2, 0x7d, 0x09, 0xdf, 0xf8, 0x20, 0xc7, 0xdd, 0xf4, 0x60, 0xd4, +- 0x96, 0xf3, 0x57, 0xd6, 0x4a, 0x2d, 0x33, 0x43, 0xc3, 0xa5, 0xb2, 0x47, +- 0x73, 0xb2, 0xc7, 0x3e, 0x71, 0x9d, 0x4a, 0xfa, 0x99, 0xda, 0x66, 0x7e, +- 0x4f, 0xb7, 0xac, 0x61, 0xca, 0x3d, 0x05, 0x5d, 0xc4, 0xa1, 0xa8, 0xd6, +- 0xc0, 0x38, 0xaf, 0xfb, 0xd6, 0x70, 0x3e, 0xe2, 0x5e, 0xd9, 0xcb, 0x9e, +- 0x8f, 0x91, 0x85, 0xc8, 0xae, 0x25, 0xca, 0x7e, 0x87, 0xec, 0xfa, 0x21, +- 0xed, 0x1e, 0x5d, 0xa9, 0xdf, 0x59, 0x19, 0xaf, 0x93, 0xb1, 0xf0, 0xe2, +- 0x3e, 0xea, 0x21, 0xea, 0x55, 0xd6, 0x41, 0xb6, 0x5c, 0x58, 0xab, 0x90, +- 0x35, 0x1a, 0x89, 0xbd, 0xbf, 0xb5, 0x5a, 0x2f, 0x29, 0x3b, 0x75, 0x4f, +- 0x79, 0x75, 0x4c, 0x9e, 0x83, 0x8d, 0xe6, 0xd6, 0xb1, 0x1b, 0xff, 0xe0, +- 0x39, 0xd8, 0x04, 0x6d, 0x09, 0xd1, 0x2d, 0xe4, 0x76, 0x71, 0x74, 0x63, +- 0x34, 0x51, 0xab, 0x6d, 0x85, 0x26, 0xeb, 0xb7, 0xfc, 0xeb, 0xc6, 0xa1, +- 0x04, 0xa2, 0x05, 0x57, 0x95, 0x93, 0x6f, 0x21, 0xea, 0x60, 0x8c, 0x7a, +- 0x22, 0x51, 0xdb, 0xb4, 0x9d, 0x63, 0xf2, 0xaf, 0xec, 0xc6, 0x70, 0xa2, +- 0xe1, 0x4b, 0x8c, 0x23, 0xfe, 0x12, 0x9b, 0xeb, 0x44, 0xff, 0xcb, 0x01, +- 0xe2, 0xc0, 0xe6, 0xdc, 0x1a, 0x52, 0x6b, 0xe2, 0xd7, 0x94, 0xdf, 0x16, +- 0x92, 0xf5, 0xfe, 0x54, 0xb9, 0x09, 0xe6, 0xd3, 0xa7, 0xb0, 0xb6, 0x5f, +- 0xc1, 0xb3, 0xc6, 0x29, 0xac, 0x19, 0x12, 0x79, 0x4e, 0xa1, 0xad, 0xff, +- 0xfb, 0xd8, 0xdf, 0x3f, 0x1d, 0x8d, 0xb6, 0x6e, 0x3a, 0xb0, 0x61, 0xd7, +- 0x11, 0xec, 0x48, 0x5a, 0xd8, 0x1e, 0xf2, 0x60, 0xfd, 0x3e, 0x05, 0xcb, +- 0x03, 0xc7, 0xb0, 0x75, 0x97, 0x85, 0x39, 0xa1, 0x4e, 0x34, 0x99, 0x25, +- 0x28, 0xac, 0x98, 0xb7, 0x4e, 0x65, 0xb9, 0xd6, 0xe1, 0x8e, 0xdc, 0xfe, +- 0xe5, 0x43, 0xc4, 0x02, 0x15, 0x3e, 0x43, 0xf6, 0x26, 0x47, 0x95, 0xdb, +- 0xd3, 0x8d, 0x4a, 0x4b, 0xee, 0x39, 0xe2, 0xad, 0xe9, 0x8f, 0x99, 0xff, +- 0xc4, 0xb1, 0x3f, 0x74, 0x0a, 0x43, 0x43, 0xbf, 0x2e, 0xcd, 0xfa, 0xcb, +- 0x04, 0xb9, 0x83, 0xe4, 0x1c, 0x26, 0x6d, 0xea, 0x4f, 0xbd, 0x37, 0x24, +- 0x76, 0x37, 0x89, 0x9f, 0x0e, 0x9e, 0xc6, 0xe9, 0xc1, 0x7f, 0xc1, 0x12, +- 0x4d, 0xf2, 0x34, 0xab, 0xd3, 0x19, 0xb1, 0xac, 0x3d, 0xf5, 0x71, 0xab, +- 0xda, 0x78, 0xab, 0x0c, 0xc5, 0x65, 0x98, 0x16, 0x79, 0x0d, 0xdb, 0x35, +- 0xb6, 0x95, 0x3c, 0x84, 0x9d, 0x8c, 0xeb, 0xbe, 0xc8, 0x1d, 0xf0, 0x25, +- 0x33, 0x66, 0x25, 0xa2, 0x3b, 0x2b, 0xa1, 0xb7, 0x57, 0x38, 0x8c, 0x8e, +- 0x7f, 0x56, 0xea, 0x70, 0x6b, 0xfa, 0x34, 0x7e, 0x31, 0x68, 0xef, 0xc9, +- 0x6a, 0xf9, 0xb6, 0x62, 0x75, 0x6e, 0x0f, 0xe9, 0x4d, 0xff, 0x55, 0x89, +- 0xc6, 0x65, 0x2f, 0x4f, 0x11, 0x73, 0x82, 0xdb, 0x06, 0x25, 0xdf, 0x6c, +- 0x81, 0xbb, 0x57, 0xcf, 0x2c, 0x25, 0xcf, 0xfe, 0xca, 0x82, 0xf8, 0x8c, +- 0x2a, 0xda, 0xa5, 0x43, 0xd1, 0x83, 0x86, 0xda, 0x89, 0xe3, 0xa6, 0x3e, +- 0xf1, 0x5b, 0x87, 0x31, 0xf4, 0x2d, 0xd4, 0x61, 0x55, 0x5a, 0x1f, 0xba, +- 0x86, 0x79, 0xd8, 0xd6, 0x3e, 0x13, 0xc9, 0x3e, 0xbd, 0xa5, 0xc3, 0xd1, +- 0x83, 0xfb, 0x02, 0x35, 0xed, 0xef, 0x91, 0xcb, 0x79, 0x88, 0x29, 0x7d, +- 0xe3, 0x23, 0xcc, 0x13, 0x7b, 0xb0, 0x61, 0x5f, 0x04, 0xeb, 0xf7, 0x98, +- 0xe8, 0xee, 0x1b, 0xa1, 0x6c, 0x2f, 0x95, 0xca, 0x1e, 0x96, 0xe6, 0x50, +- 0xfc, 0x66, 0x15, 0x81, 0x28, 0xfb, 0x6c, 0x50, 0x23, 0x01, 0xbf, 0xaa, +- 0x30, 0xfa, 0x8f, 0x3b, 0xb1, 0x89, 0x65, 0x7a, 0x93, 0xb4, 0xb9, 0x3e, +- 0x37, 0xe3, 0xe5, 0x4c, 0x0c, 0x8f, 0xf9, 0x70, 0x70, 0xcc, 0x83, 0xa1, +- 0x31, 0x8d, 0x47, 0x31, 0x1e, 0x1b, 0x90, 0xbd, 0x20, 0x5e, 0x3c, 0x7d, +- 0xc0, 0x8d, 0xcd, 0xbb, 0x3d, 0x98, 0x1d, 0x99, 0x86, 0x03, 0x07, 0x8a, +- 0xb1, 0x97, 0xd7, 0x2b, 0x16, 0xfa, 0xf1, 0x24, 0xaf, 0xf7, 0xef, 0x76, +- 0x71, 0x1e, 0xe6, 0xe0, 0x30, 0x0d, 0x7b, 0x68, 0xac, 0x04, 0xc9, 0x01, +- 0x9a, 0x3c, 0x39, 0xeb, 0xdb, 0xcc, 0x30, 0x46, 0x0f, 0x30, 0x36, 0xee, +- 0x33, 0x91, 0x60, 0x3f, 0x3b, 0xa8, 0xab, 0x6e, 0xe2, 0xda, 0x86, 0x31, +- 0xc1, 0xf8, 0x55, 0xb8, 0xa9, 0x57, 0x6f, 0x6a, 0x54, 0x8c, 0xe8, 0x22, +- 0x7b, 0xbf, 0x97, 0xbc, 0xdf, 0xb5, 0x0a, 0x0d, 0x09, 0xdd, 0x6c, 0x44, +- 0x27, 0x4e, 0x72, 0xdc, 0xff, 0x17, 0xfd, 0x76, 0xb1, 0x43, 0xef, 0xb9, +- 0x51, 0x3d, 0x82, 0x9d, 0xe9, 0xa3, 0xe4, 0xea, 0x40, 0x78, 0xff, 0x11, +- 0xf2, 0xb7, 0xe3, 0xc4, 0x9f, 0x37, 0x2d, 0x9f, 0xa1, 0xe2, 0xd6, 0x47, +- 0x8c, 0xf0, 0xfb, 0x4a, 0xa0, 0xfd, 0x57, 0xd4, 0xc1, 0x67, 0x0f, 0xa8, +- 0xb8, 0x65, 0xe7, 0x62, 0xa4, 0x42, 0x51, 0xec, 0x58, 0xa4, 0xe2, 0xe6, +- 0x7d, 0x47, 0x88, 0xfb, 0x13, 0x36, 0x4f, 0xce, 0xa4, 0x1e, 0x46, 0xb0, +- 0x57, 0xd6, 0xb8, 0xdd, 0x8c, 0xdf, 0xa5, 0x78, 0xa6, 0x9f, 0x39, 0xb4, +- 0x59, 0x8a, 0x13, 0x43, 0x47, 0x68, 0x8f, 0xa5, 0x38, 0xde, 0x6f, 0x4c, +- 0xfc, 0xd4, 0x51, 0x8a, 0xa7, 0x79, 0xbe, 0x93, 0xe7, 0x0b, 0x07, 0x8c, +- 0xfe, 0x0e, 0xb5, 0x14, 0x0b, 0xf6, 0xd7, 0xa3, 0xbf, 0x4f, 0x6c, 0x53, +- 0x43, 0xfb, 0x58, 0x5d, 0x4e, 0xf7, 0xa2, 0x73, 0x2f, 0x36, 0x52, 0x57, +- 0xf7, 0xed, 0xec, 0x64, 0x7f, 0x3e, 0xea, 0xfc, 0x08, 0x1e, 0x63, 0x5e, +- 0xb7, 0xbd, 0xcf, 0x87, 0x73, 0x49, 0xc3, 0xff, 0x45, 0xc5, 0x30, 0x8b, +- 0x94, 0x80, 0xf6, 0x0c, 0x7c, 0x38, 0x9d, 0x2e, 0xc6, 0xa6, 0x81, 0x99, +- 0xf8, 0x29, 0xed, 0xf3, 0xd1, 0xdd, 0xd2, 0xdf, 0x04, 0xe3, 0xc3, 0x2c, +- 0x3c, 0x3d, 0x62, 0xb2, 0x6d, 0x99, 0x27, 0x89, 0x39, 0xdd, 0x70, 0x25, +- 0xc5, 0x37, 0xa2, 0x3b, 0x69, 0x16, 0xc4, 0xc4, 0x63, 0x48, 0xf7, 0xeb, +- 0x3d, 0xb7, 0xa9, 0xc2, 0xab, 0x55, 0xea, 0xd2, 0x81, 0x49, 0x4d, 0x8f, +- 0x57, 0xa8, 0xf1, 0x7e, 0xe6, 0xaf, 0xf1, 0x4a, 0xf5, 0x18, 0x9e, 0xee, +- 0x77, 0x62, 0xde, 0x42, 0x95, 0xd7, 0xe3, 0xe7, 0x19, 0xdb, 0xe2, 0xb3, +- 0x55, 0x13, 0x7b, 0x6d, 0x59, 0x11, 0x2f, 0x20, 0xb7, 0x2f, 0x5f, 0x58, +- 0xc3, 0xf8, 0xe5, 0x10, 0xdb, 0x8b, 0x95, 0xaa, 0x4e, 0xea, 0xfd, 0x34, +- 0x46, 0x68, 0xd7, 0x4f, 0xf0, 0x38, 0x3c, 0x68, 0x75, 0x2e, 0x27, 0xe7, +- 0x9e, 0x13, 0xb0, 0x3a, 0x6f, 0x33, 0x0d, 0x5f, 0x81, 0x1a, 0x88, 0x7e, +- 0x05, 0xa7, 0x71, 0x68, 0x44, 0xca, 0xc0, 0xed, 0x8d, 0x30, 0xaf, 0xee, +- 0xb3, 0x3a, 0x77, 0x9a, 0x73, 0x50, 0x6f, 0xe7, 0xc6, 0x3f, 0x2f, 0xcd, +- 0x62, 0xa6, 0xf8, 0x91, 0xbd, 0xa7, 0x0a, 0xbf, 0x62, 0x3b, 0xef, 0x0f, +- 0x96, 0xa3, 0xaa, 0x52, 0xfc, 0xe0, 0x14, 0xde, 0xe9, 0x7f, 0x0d, 0xe7, +- 0xfa, 0x2d, 0x2c, 0x08, 0x59, 0x70, 0x86, 0x6a, 0xcd, 0x46, 0xf5, 0x1a, +- 0x62, 0x84, 0x82, 0x9b, 0xe6, 0x7e, 0x1f, 0xef, 0xd2, 0xff, 0x6f, 0x9e, +- 0x6b, 0xd9, 0xb2, 0xf4, 0x62, 0xa1, 0xb5, 0xa3, 0x5a, 0xfc, 0xc6, 0xb4, +- 0xf7, 0xd3, 0xfc, 0xe9, 0x3c, 0x38, 0xbf, 0xaf, 0x4b, 0x72, 0xe1, 0xd3, +- 0x18, 0x1e, 0x34, 0xa2, 0x6b, 0xf3, 0x72, 0xf6, 0x9f, 0xa6, 0x0e, 0x2c, +- 0xec, 0x34, 0x4f, 0xec, 0xab, 0xc0, 0xbc, 0xf3, 0xcc, 0x1a, 0xaf, 0x9b, +- 0x4d, 0xdb, 0x59, 0xb0, 0x30, 0x60, 0x2e, 0x53, 0xff, 0x37, 0xfd, 0xf4, +- 0x34, 0x0e, 0x0e, 0xe5, 0xf1, 0xda, 0x87, 0x46, 0xfa, 0x79, 0x76, 0xcf, +- 0xbb, 0x17, 0x0d, 0xc9, 0xa3, 0xf6, 0xfa, 0xc3, 0x61, 0xe2, 0x63, 0xf6, +- 0x19, 0xa1, 0x86, 0x91, 0x74, 0x23, 0xb1, 0x21, 0x8a, 0xef, 0xa6, 0x23, +- 0xc4, 0x87, 0x30, 0xf1, 0xa1, 0x9e, 0xf8, 0x60, 0x12, 0x1f, 0xea, 0x88, +- 0x0f, 0x41, 0xfb, 0xd9, 0xb9, 0xac, 0x47, 0x0f, 0x8d, 0xbe, 0x86, 0x82, +- 0x81, 0x53, 0x70, 0x0d, 0xc8, 0x3e, 0x35, 0x8b, 0xfc, 0xa4, 0x56, 0x6b, +- 0xc3, 0x1c, 0x45, 0xf6, 0x0c, 0x0e, 0xa5, 0x4f, 0xa1, 0x68, 0x40, 0xe3, +- 0x58, 0x64, 0xaf, 0x40, 0x4d, 0xb8, 0x87, 0x58, 0xfd, 0x6b, 0xa3, 0xb6, +- 0xc7, 0x8b, 0xda, 0xbd, 0xd5, 0x30, 0xfa, 0x17, 0xaa, 0x73, 0x95, 0xe8, +- 0xe7, 0xbc, 0x1c, 0x67, 0x25, 0x66, 0xed, 0xd6, 0x30, 0x9b, 0xc7, 0x3f, +- 0x25, 0x6b, 0x26, 0xde, 0x74, 0xc0, 0x3b, 0x9d, 0x74, 0x67, 0x06, 0x99, +- 0x00, 0x59, 0xad, 0xd7, 0x87, 0x2b, 0x0f, 0x9f, 0x56, 0x15, 0x64, 0x3e, +- 0x27, 0x31, 0xaf, 0x36, 0xd8, 0xad, 0x32, 0x5b, 0xd7, 0x04, 0xc3, 0x79, +- 0xa8, 0x88, 0x90, 0x45, 0xcc, 0x64, 0x7e, 0x61, 0xb5, 0x99, 0x45, 0xd8, +- 0x52, 0xa7, 0xca, 0x7e, 0x8d, 0xa3, 0x12, 0xa3, 0xa6, 0x33, 0x46, 0x14, +- 0xf7, 0xc5, 0xef, 0x99, 0x0e, 0x0f, 0x8a, 0xfa, 0x2c, 0xeb, 0x1b, 0x21, +- 0x0d, 0x9e, 0x48, 0x20, 0xba, 0x81, 0x69, 0xe4, 0xe7, 0xe6, 0x85, 0x71, +- 0x53, 0xfa, 0x30, 0x06, 0x38, 0xbe, 0xe5, 0xe9, 0xfc, 0xbb, 0x9c, 0x7f, +- 0xfa, 0xef, 0xe2, 0x3b, 0xa1, 0x57, 0xee, 0x9d, 0x0e, 0x43, 0x7b, 0x40, +- 0xed, 0x28, 0x27, 0x07, 0x3f, 0xcc, 0xb8, 0xa7, 0x4c, 0x7e, 0x5e, 0x41, +- 0xcb, 0x40, 0x1c, 0x55, 0xa1, 0x53, 0x4a, 0x4c, 0xf6, 0x32, 0x29, 0x95, +- 0xf8, 0xfc, 0x6e, 0xea, 0x7a, 0x41, 0x86, 0xb6, 0xe2, 0xc3, 0xb7, 0x46, +- 0x45, 0xb7, 0x35, 0x43, 0x3b, 0x39, 0x8e, 0x37, 0xe6, 0x1e, 0x16, 0x9c, +- 0x3c, 0x32, 0x0b, 0x8e, 0x23, 0xd3, 0x98, 0x9b, 0xd6, 0xcc, 0xbd, 0xf2, +- 0xfc, 0xbf, 0xa8, 0xa2, 0x17, 0x85, 0xd8, 0xa1, 0xf7, 0xc7, 0xd8, 0xf6, +- 0x07, 0x8e, 0xc3, 0xd8, 0x44, 0x0c, 0x3e, 0x9a, 0xfe, 0x0e, 0x75, 0x79, +- 0x28, 0x97, 0x2f, 0xad, 0x42, 0xa2, 0x57, 0xf6, 0xe3, 0x9d, 0xc2, 0xac, +- 0x01, 0xbd, 0x79, 0x9b, 0x62, 0x04, 0x6f, 0x56, 0x4e, 0x61, 0xc6, 0x40, +- 0x90, 0x73, 0xa9, 0x61, 0x59, 0x5f, 0x1e, 0x3f, 0x05, 0x83, 0x57, 0x11, +- 0x83, 0xad, 0xc5, 0x3f, 0x35, 0xe3, 0xcc, 0x71, 0x74, 0xd3, 0xa9, 0xe8, +- 0x2d, 0x73, 0x15, 0xd9, 0x9b, 0x63, 0x9c, 0x6f, 0x65, 0x1d, 0xcf, 0x40, +- 0x1d, 0xee, 0xe4, 0x98, 0x9b, 0x38, 0x6f, 0xaf, 0x2d, 0xb4, 0xb0, 0x68, +- 0xa1, 0xbe, 0xb7, 0xc8, 0x11, 0x7d, 0xa0, 0x02, 0x99, 0x8e, 0x6a, 0xda, +- 0xcd, 0x7d, 0x0b, 0xf4, 0xf0, 0xab, 0xc4, 0x5d, 0xe2, 0x34, 0x36, 0x31, +- 0xee, 0xb4, 0x31, 0x16, 0x15, 0x47, 0xf4, 0x1e, 0xe6, 0xa8, 0xef, 0xdf, +- 0xed, 0x88, 0x86, 0xe4, 0x7d, 0xa3, 0x7f, 0xc0, 0x62, 0xb8, 0x43, 0x65, +- 0xc4, 0x41, 0x3d, 0xf3, 0x1a, 0xf4, 0xbd, 0x77, 0x92, 0x93, 0xfe, 0x84, +- 0xfc, 0xae, 0xfa, 0xaa, 0xa3, 0xc4, 0xa8, 0x11, 0x3c, 0x9a, 0x3e, 0x82, +- 0xbd, 0xe9, 0x14, 0x76, 0xa5, 0x77, 0x28, 0x43, 0xf6, 0xb3, 0x3a, 0x45, +- 0xde, 0xad, 0x8b, 0x96, 0x29, 0x5f, 0x46, 0x69, 0xe8, 0x9b, 0xd6, 0x50, +- 0x85, 0x8a, 0xf2, 0x50, 0x10, 0x37, 0xf5, 0xc5, 0xe1, 0x88, 0xbc, 0x67, +- 0xc9, 0x7b, 0xd9, 0xeb, 0xc7, 0x0d, 0xdc, 0xd8, 0x57, 0x8c, 0xd8, 0x7e, +- 0xcb, 0xea, 0xa9, 0x77, 0x62, 0xcd, 0x78, 0x1d, 0x96, 0x0d, 0x3c, 0x66, +- 0xcd, 0x66, 0xcc, 0xf9, 0xf8, 0x5a, 0x0f, 0xee, 0xde, 0xef, 0x41, 0x6b, +- 0x5f, 0x14, 0xbe, 0x48, 0x09, 0x7f, 0x07, 0xcc, 0x25, 0x30, 0x26, 0x26, +- 0x60, 0xf4, 0xdc, 0xe0, 0x08, 0x1c, 0x0a, 0xab, 0x1e, 0x7c, 0x95, 0x38, +- 0xbe, 0x9c, 0xb8, 0x13, 0x1b, 0xb7, 0x50, 0x1e, 0xf1, 0xe2, 0x1e, 0xd6, +- 0xbf, 0x85, 0x73, 0xff, 0xee, 0xa2, 0x43, 0xc4, 0x02, 0xd9, 0x83, 0xa8, +- 0x61, 0xc3, 0xb8, 0x9b, 0xba, 0x72, 0x23, 0x76, 0xb0, 0x12, 0x37, 0xee, +- 0xf6, 0xe3, 0xee, 0x71, 0x0f, 0x1a, 0xfa, 0xac, 0xc5, 0x87, 0xcd, 0xf8, +- 0x4a, 0x0d, 0x06, 0x5a, 0xc7, 0xbd, 0xf8, 0xdb, 0x3e, 0xdd, 0x77, 0x33, +- 0x73, 0xfe, 0x11, 0x33, 0x88, 0xbf, 0x1f, 0xf7, 0xe1, 0xf6, 0xbe, 0x13, +- 0x92, 0x47, 0x2e, 0x71, 0x32, 0xf6, 0x3c, 0x34, 0x3e, 0x13, 0x2b, 0xfb, +- 0xf4, 0xf3, 0x13, 0xe4, 0x76, 0x9d, 0x07, 0x4d, 0x3c, 0x30, 0xae, 0xa2, +- 0x85, 0xed, 0x7c, 0xbe, 0x6f, 0x16, 0x3a, 0x0e, 0xd6, 0x53, 0x86, 0x85, +- 0x58, 0x3e, 0xe0, 0x84, 0x49, 0x16, 0x8f, 0x2f, 0x00, 0xcd, 0x03, 0x13, +- 0xcc, 0xe3, 0x1e, 0xc6, 0x8e, 0x5e, 0x13, 0xf7, 0x8e, 0xcb, 0xf9, 0x11, +- 0xfb, 0x5d, 0xd8, 0xf7, 0xf7, 0x2d, 0xc4, 0x67, 0x07, 0x54, 0xe2, 0x40, +- 0x21, 0x86, 0x56, 0x2a, 0xf8, 0x5b, 0x5e, 0xdf, 0x96, 0x94, 0xbd, 0xcc, +- 0x40, 0x68, 0x67, 0xe0, 0x50, 0x05, 0x39, 0xc3, 0xa2, 0x7d, 0xd9, 0xeb, +- 0x8f, 0x12, 0xe7, 0x8b, 0x88, 0xf3, 0x25, 0xe4, 0xb0, 0x37, 0x0c, 0x1f, +- 0xc1, 0x23, 0xc4, 0xe5, 0xa3, 0x03, 0x9d, 0x8c, 0x3b, 0xa5, 0x78, 0x92, +- 0x71, 0xa0, 0x8f, 0xe7, 0xa7, 0x76, 0x1a, 0x1d, 0x45, 0xc4, 0xe9, 0x57, +- 0x89, 0xbf, 0x3d, 0xc4, 0x8c, 0xfb, 0xfa, 0x18, 0xee, 0x77, 0x32, 0x07, +- 0xb8, 0x2a, 0x3a, 0xdf, 0xc3, 0x1c, 0xeb, 0x66, 0x25, 0xe0, 0x7b, 0x0b, +- 0xa5, 0x70, 0xec, 0xab, 0x44, 0xc3, 0x6e, 0x29, 0x23, 0xf8, 0xa5, 0x42, +- 0x3d, 0xe0, 0xa4, 0xce, 0x8f, 0xc1, 0xea, 0x77, 0x70, 0xbc, 0x35, 0x26, +- 0x19, 0x38, 0xde, 0x30, 0x75, 0xed, 0xbb, 0xc4, 0xda, 0x0f, 0x89, 0xa9, +- 0xfe, 0xe9, 0xf5, 0x68, 0x34, 0x4c, 0x1e, 0xc7, 0x70, 0xba, 0xdf, 0x30, +- 0x65, 0x9f, 0xdc, 0x9b, 0xe4, 0x79, 0x93, 0xd3, 0x19, 0x33, 0x0d, 0xf1, +- 0xc3, 0x11, 0x8e, 0x47, 0x95, 0xbc, 0x04, 0x8e, 0x31, 0xe0, 0x9d, 0x7d, +- 0x8b, 0x39, 0x2e, 0x89, 0xa5, 0x12, 0xef, 0x46, 0x28, 0xeb, 0x62, 0xac, +- 0xa0, 0x3e, 0x1a, 0xfb, 0x54, 0xa4, 0x0e, 0x46, 0x70, 0xef, 0x9e, 0x6c, +- 0x1c, 0x6e, 0x0f, 0xc5, 0x6f, 0x63, 0x1c, 0x0e, 0x17, 0x33, 0x0e, 0xbb, +- 0x22, 0x22, 0x9b, 0x13, 0xc3, 0x8c, 0xdb, 0x5b, 0x92, 0x61, 0x34, 0x71, +- 0x0e, 0x27, 0x52, 0xec, 0xb7, 0x6f, 0x26, 0x9e, 0x49, 0x79, 0x18, 0xb3, +- 0x34, 0x1e, 0x44, 0xb5, 0x91, 0x69, 0x3c, 0xfc, 0x3c, 0xe6, 0xf0, 0x30, +- 0xec, 0x6b, 0x6d, 0x7d, 0x0a, 0xe2, 0xcd, 0xd9, 0xe7, 0x65, 0xcf, 0xa4, +- 0x04, 0x9b, 0x65, 0x2d, 0xf3, 0xde, 0x72, 0xd9, 0xfb, 0xd9, 0x9f, 0xfc, +- 0x3e, 0xca, 0x89, 0x4f, 0x65, 0x39, 0x1c, 0xfa, 0x79, 0x48, 0x70, 0xb7, +- 0x86, 0xb8, 0x2b, 0xfb, 0x73, 0x2c, 0x6b, 0x55, 0x60, 0x2a, 0x1e, 0xfd, +- 0xef, 0x8f, 0xa3, 0xf6, 0x7e, 0x56, 0xc1, 0x24, 0xe2, 0x5f, 0x92, 0xf8, +- 0xc7, 0x31, 0x74, 0x5d, 0x4f, 0x0c, 0xa4, 0x4c, 0xff, 0x98, 0x24, 0x06, +- 0x12, 0xa7, 0x8f, 0x10, 0xa7, 0x9f, 0x22, 0x4e, 0x7f, 0x93, 0x38, 0xfd, +- 0x24, 0x31, 0x21, 0xbb, 0xa6, 0xd7, 0x24, 0xcf, 0x2f, 0x38, 0x1f, 0xef, +- 0xd9, 0x6b, 0x8b, 0xd5, 0xd4, 0xd5, 0xac, 0x01, 0x79, 0xe7, 0x47, 0x3f, +- 0x24, 0x76, 0xff, 0x13, 0xce, 0x93, 0xbf, 0x2a, 0xbb, 0xef, 0xaa, 0xb1, +- 0xaf, 0x1b, 0xee, 0xbe, 0x5a, 0xad, 0x07, 0xf6, 0xb7, 0x02, 0x4c, 0xe1, +- 0xa2, 0x05, 0x7d, 0x6d, 0x70, 0xf4, 0xd5, 0x1e, 0x3a, 0x29, 0xcf, 0x43, +- 0xa7, 0x49, 0x5e, 0xdf, 0x26, 0x7b, 0xbd, 0x0f, 0xc9, 0x7e, 0xad, 0x65, +- 0xbc, 0xe7, 0xea, 0xab, 0x35, 0xdf, 0x82, 0x8d, 0x6d, 0xfe, 0x49, 0xfb, +- 0x5e, 0xcd, 0xfb, 0x8f, 0x50, 0x5f, 0x19, 0xb6, 0x99, 0x4a, 0xca, 0x7e, +- 0xd4, 0x99, 0x78, 0x22, 0x2d, 0xbf, 0x6b, 0x5b, 0x12, 0xea, 0xe3, 0x88, +- 0x55, 0x0b, 0x1f, 0x0f, 0xe3, 0xd6, 0x3e, 0x0f, 0xed, 0x20, 0x8e, 0x32, +- 0xfa, 0xd6, 0xfd, 0xe3, 0xf5, 0xf4, 0xb5, 0xc7, 0x2c, 0x2d, 0x12, 0x68, +- 0x19, 0x27, 0xe7, 0x59, 0x3f, 0xbe, 0x18, 0x4b, 0x07, 0x2c, 0xcb, 0x73, +- 0x8d, 0x11, 0xde, 0xa0, 0xf8, 0xe1, 0xa2, 0x0f, 0x3a, 0xe8, 0x57, 0x6b, +- 0xf7, 0x07, 0xb4, 0xb7, 0x88, 0xa7, 0xeb, 0xea, 0x0f, 0xd3, 0x3e, 0x8c, +- 0xf3, 0x4d, 0xc4, 0x52, 0x67, 0x24, 0xc0, 0x3c, 0xd1, 0x43, 0xdb, 0xf7, +- 0xe2, 0x7c, 0x42, 0xfc, 0x4b, 0xef, 0xf8, 0x2e, 0x73, 0x93, 0x0e, 0xfa, +- 0xc6, 0x07, 0x89, 0xeb, 0xe9, 0x4b, 0x61, 0x1e, 0x33, 0xe9, 0x0b, 0x6e, +- 0xbc, 0x93, 0x30, 0xe8, 0x77, 0x1e, 0xbc, 0x9b, 0xa8, 0x63, 0x9f, 0x41, +- 0x96, 0xf5, 0x63, 0xa3, 0xfd, 0xde, 0x75, 0x4d, 0xfc, 0x5b, 0x4a, 0x4d, +- 0xff, 0x2c, 0xb5, 0x02, 0xd1, 0x4a, 0x0d, 0x7f, 0x37, 0xfe, 0x37, 0xf8, +- 0x19, 0xe3, 0xf6, 0x9a, 0x3e, 0x70, 0x0e, 0x11, 0x22, 0x0f, 0x9c, 0x38, +- 0x28, 0xcf, 0xe9, 0x50, 0x1b, 0x9d, 0xeb, 0xd0, 0x99, 0xdb, 0xea, 0x99, +- 0x73, 0x0e, 0x27, 0xfb, 0x24, 0x2b, 0x66, 0xd9, 0x0f, 0xfa, 0x8b, 0xf1, +- 0xc0, 0xfe, 0xc3, 0xf4, 0x91, 0x02, 0x2c, 0x78, 0xc4, 0x8d, 0xbf, 0x3b, +- 0x38, 0x22, 0x6b, 0x4b, 0x82, 0x99, 0xfe, 0x21, 0x12, 0x85, 0x30, 0xb9, +- 0xde, 0xfd, 0x7b, 0x46, 0x30, 0x90, 0xe3, 0x79, 0x1f, 0x84, 0xe2, 0x5f, +- 0x51, 0x71, 0x98, 0x3c, 0x22, 0x10, 0xbf, 0x9a, 0x36, 0x26, 0xef, 0xb8, +- 0x49, 0xec, 0x5f, 0x41, 0x1b, 0xeb, 0xe6, 0x7c, 0x7e, 0x83, 0xe3, 0xd8, +- 0x41, 0x1b, 0x1b, 0x4d, 0xcc, 0xc4, 0x56, 0xda, 0x58, 0x9c, 0x36, 0x16, +- 0xa7, 0x3d, 0xc5, 0x69, 0x63, 0xf2, 0x6e, 0x7e, 0x9c, 0x36, 0x16, 0xa7, +- 0x8d, 0xc5, 0x53, 0x8b, 0xf1, 0x14, 0x99, 0xc6, 0xae, 0x91, 0x45, 0xc4, +- 0x31, 0x79, 0xb6, 0xc6, 0x79, 0xb8, 0xed, 0x6f, 0xc8, 0xd9, 0x6f, 0xe0, +- 0xa1, 0xe0, 0x4e, 0xfa, 0xe4, 0x63, 0x43, 0xc4, 0x3b, 0xda, 0xc1, 0xa2, +- 0xb4, 0x70, 0xfc, 0x7a, 0xe6, 0xb1, 0xc7, 0xc8, 0xf3, 0x55, 0x3c, 0x6b, +- 0x4a, 0x1e, 0x6c, 0xf2, 0x9c, 0xb1, 0x26, 0x29, 0x1c, 0xec, 0x18, 0x36, +- 0xf4, 0x03, 0x37, 0x91, 0x17, 0x56, 0x92, 0x97, 0x8c, 0x2c, 0x00, 0x5e, +- 0x1c, 0x12, 0x19, 0xc5, 0xc7, 0xb3, 0xfb, 0x4f, 0x8f, 0xf7, 0xd7, 0x44, +- 0x1b, 0x65, 0x7d, 0x88, 0x9c, 0x64, 0xf1, 0xb0, 0x70, 0xbc, 0xc3, 0xe4, +- 0x48, 0x7a, 0xf8, 0xdf, 0x21, 0x1c, 0xaf, 0x12, 0x65, 0x7b, 0xf4, 0xf0, +- 0x3b, 0x30, 0xd6, 0xfd, 0x52, 0xb1, 0x16, 0xbf, 0x16, 0x0a, 0xc4, 0x9f, +- 0x54, 0x54, 0x34, 0x93, 0xef, 0xdd, 0xbc, 0xd3, 0x89, 0x9e, 0xd0, 0x62, +- 0x7c, 0x85, 0x9c, 0x6f, 0xf5, 0x35, 0x2a, 0x96, 0xec, 0xa3, 0x2d, 0x55, +- 0x0a, 0xc7, 0xd2, 0xc3, 0xe7, 0x30, 0x61, 0xaf, 0x13, 0x8e, 0xa6, 0x8e, +- 0x5b, 0x55, 0x86, 0x60, 0x11, 0xb1, 0xed, 0xea, 0x37, 0x2d, 0xb7, 0xac, +- 0x35, 0x91, 0x03, 0x0e, 0xf7, 0x47, 0x5f, 0x70, 0x12, 0xf7, 0xd7, 0x93, +- 0x07, 0x3e, 0x91, 0xe3, 0x81, 0x07, 0xfb, 0x0d, 0xed, 0x07, 0xc4, 0x8b, +- 0xfd, 0x3c, 0xdf, 0xca, 0x73, 0xab, 0xdf, 0xe0, 0x7c, 0x04, 0x9a, 0x66, +- 0x90, 0x1b, 0xbe, 0x43, 0x99, 0x7b, 0x29, 0x73, 0x82, 0xf6, 0x9f, 0xee, +- 0xd5, 0x90, 0x1c, 0x33, 0x30, 0xde, 0xeb, 0x45, 0xdf, 0x58, 0x10, 0x4f, +- 0xf6, 0xfa, 0xb0, 0x93, 0xfc, 0xf0, 0x70, 0xaf, 0xf8, 0xe2, 0x4c, 0xf4, +- 0x8f, 0xcd, 0xc4, 0x37, 0x92, 0xb2, 0x3e, 0xf5, 0x2e, 0x56, 0x57, 0x88, +- 0x7e, 0xc4, 0x2f, 0xc9, 0xaf, 0x93, 0x7a, 0x4f, 0x8c, 0x63, 0x8a, 0x79, +- 0xf5, 0x43, 0x31, 0xe8, 0x43, 0x9c, 0xc1, 0x8f, 0x87, 0xbe, 0x20, 0x31, +- 0x52, 0x7c, 0x52, 0xc3, 0x13, 0xe4, 0x3c, 0xa5, 0xc4, 0xd5, 0x92, 0x48, +- 0x4d, 0xf4, 0x0b, 0x8a, 0x1e, 0x7b, 0x45, 0xb5, 0xac, 0x4a, 0x89, 0xe1, +- 0x07, 0x35, 0xf2, 0x0f, 0x13, 0x37, 0xdb, 0x31, 0x5b, 0xc3, 0xf4, 0xdd, +- 0x95, 0xa8, 0xda, 0xdd, 0x87, 0xff, 0x56, 0x19, 0xff, 0x60, 0x1a, 0x63, +- 0xfd, 0x34, 0x62, 0xfb, 0xec, 0xbe, 0x93, 0xd3, 0x67, 0x91, 0x33, 0xbf, +- 0xa1, 0xd6, 0x66, 0xbe, 0x0b, 0xfd, 0xd0, 0x69, 0x87, 0x3e, 0x71, 0x94, +- 0xf1, 0xc1, 0x45, 0xfb, 0x9c, 0x31, 0xae, 0xd1, 0x7f, 0x6b, 0x8f, 0x56, +- 0xc1, 0x88, 0x5f, 0xab, 0x3a, 0x2d, 0x54, 0x8a, 0x3c, 0xa1, 0xf2, 0x6c, +- 0x6e, 0x14, 0x26, 0xf6, 0x4b, 0x6c, 0x70, 0x40, 0x23, 0x0e, 0xff, 0x3d, +- 0x7d, 0xe6, 0x4e, 0x3b, 0x1e, 0x1d, 0xb6, 0x9f, 0x85, 0x76, 0x8e, 0xc7, +- 0xe9, 0x27, 0x8b, 0xd1, 0xd1, 0xef, 0x41, 0xbb, 0x1d, 0x8b, 0x1e, 0xb3, +- 0x2a, 0xe8, 0x33, 0x1d, 0xfb, 0x03, 0x4d, 0x37, 0xd2, 0x67, 0xae, 0xbb, +- 0x46, 0xe2, 0xd8, 0x61, 0xf2, 0x5f, 0xc3, 0xbc, 0x8e, 0xf8, 0xb2, 0xb5, +- 0xde, 0xe8, 0x78, 0x9e, 0x32, 0xdd, 0x4f, 0xfb, 0x7f, 0x97, 0x3c, 0xe7, +- 0xdc, 0x9e, 0x43, 0xd4, 0x99, 0x66, 0xfb, 0xc3, 0xcf, 0x92, 0x3e, 0xdb, +- 0x37, 0x62, 0xfc, 0x2d, 0x71, 0x2f, 0x46, 0x5f, 0xfa, 0x37, 0xc6, 0xec, +- 0xe2, 0x50, 0xfc, 0xf6, 0x62, 0x04, 0x71, 0x1f, 0x65, 0xfd, 0x38, 0xa9, +- 0xf7, 0x6f, 0x90, 0x77, 0x8f, 0x43, 0x26, 0x65, 0xf1, 0xe0, 0x83, 0xa4, +- 0xd8, 0xd9, 0x89, 0xff, 0x59, 0x89, 0xf8, 0x26, 0xc6, 0xe0, 0xa0, 0xe6, +- 0x90, 0xb5, 0xf0, 0x99, 0x58, 0x73, 0xf0, 0x1a, 0xca, 0x5c, 0x47, 0xff, +- 0x03, 0xe6, 0x0c, 0x47, 0x70, 0xcf, 0x1e, 0xc9, 0x31, 0xd0, 0x20, 0xb9, +- 0xda, 0xbc, 0x50, 0xc0, 0x3c, 0x43, 0xac, 0x58, 0x3b, 0x76, 0x98, 0x71, +- 0x42, 0xd6, 0x96, 0x91, 0xf1, 0x19, 0x61, 0xbc, 0xda, 0x5b, 0x6f, 0xbf, +- 0xd3, 0x70, 0xff, 0x58, 0x3d, 0x5e, 0xe9, 0x9d, 0x89, 0xfb, 0x98, 0xeb, +- 0xc4, 0x98, 0xeb, 0xc4, 0xc6, 0xbc, 0x88, 0x1d, 0x98, 0xc6, 0x83, 0xb2, +- 0x1d, 0x98, 0xc3, 0x83, 0xb2, 0x8d, 0xa9, 0xf8, 0x2a, 0xf3, 0x97, 0x0d, +- 0xc4, 0xf3, 0x1e, 0xda, 0xe3, 0xff, 0xe0, 0xdc, 0x0f, 0xd0, 0xde, 0xab, +- 0x89, 0xf7, 0x6f, 0xee, 0x02, 0xee, 0xb4, 0xf5, 0x73, 0x84, 0x7a, 0x54, +- 0xf0, 0x15, 0xfa, 0x44, 0x15, 0x63, 0x52, 0x37, 0xe7, 0x7c, 0xe7, 0xa0, +- 0x11, 0x0c, 0xab, 0x01, 0xed, 0x09, 0xce, 0x73, 0xd7, 0x88, 0x8a, 0x47, +- 0xfb, 0x17, 0x63, 0x3e, 0x63, 0xca, 0xb6, 0xa1, 0x09, 0xbb, 0x7c, 0x37, +- 0xfd, 0xe1, 0x6e, 0xfa, 0xc9, 0x7b, 0xf4, 0x93, 0xc9, 0x95, 0xf2, 0x3e, +- 0xa9, 0x93, 0x39, 0xff, 0xc3, 0x58, 0x93, 0x90, 0x78, 0xa7, 0xf7, 0x0c, +- 0xa9, 0xcc, 0xb5, 0x68, 0x9f, 0x5d, 0xcc, 0x51, 0x6e, 0xa7, 0x6d, 0x3e, +- 0x3a, 0x24, 0x3e, 0x24, 0x39, 0x8b, 0x11, 0xde, 0x46, 0xdb, 0x7c, 0x7e, +- 0x48, 0xfc, 0xa3, 0x14, 0xb7, 0xee, 0x94, 0xfd, 0xa6, 0xa5, 0xf8, 0xec, +- 0xbe, 0xc3, 0x94, 0xef, 0x08, 0x76, 0xd1, 0x2e, 0x4b, 0x69, 0x97, 0xf7, +- 0x51, 0xaf, 0x1e, 0xda, 0xe5, 0x06, 0xe2, 0x50, 0x09, 0xed, 0xf2, 0x5e, +- 0xf2, 0x81, 0xca, 0x9c, 0x5d, 0xfe, 0xdd, 0xf8, 0xc2, 0x8a, 0x6c, 0x8c, +- 0xf0, 0x42, 0xdd, 0x2d, 0xef, 0xf7, 0x59, 0xd6, 0xed, 0x66, 0xa6, 0x69, +- 0x06, 0x74, 0xb6, 0x1d, 0xc1, 0xb2, 0xb4, 0x13, 0xe5, 0x7d, 0x11, 0x2c, +- 0x4d, 0xd6, 0xb4, 0x9f, 0x55, 0x22, 0xc8, 0xcc, 0xc8, 0xf2, 0x40, 0x57, +- 0x9f, 0x7c, 0xdf, 0x43, 0x23, 0x07, 0xe1, 0xf8, 0xaf, 0xcd, 0x7e, 0x53, +- 0xe4, 0xf3, 0x7f, 0x01, 0x7f, 0x5c, 0x42, 0x99, 0x3a, 0xcd, 0x8f, 0xac, +- 0xc9, 0xec, 0xf7, 0x07, 0x9c, 0xb7, 0xf1, 0x7c, 0x16, 0xdb, 0xa8, 0x1a, +- 0x77, 0x3a, 0xbf, 0x98, 0xf4, 0x60, 0xfa, 0xb8, 0x89, 0xbf, 0xcd, 0xb6, +- 0xe3, 0x2e, 0x88, 0x34, 0xe2, 0xb9, 0x84, 0x82, 0x69, 0xc6, 0xd3, 0xf8, +- 0x91, 0xbd, 0x2e, 0x50, 0x89, 0xf2, 0xdd, 0xf6, 0x9a, 0x02, 0x0e, 0x24, +- 0xf4, 0xf6, 0x34, 0xcf, 0xcb, 0x0e, 0x7a, 0x51, 0xbc, 0x5b, 0xc1, 0x2d, +- 0x01, 0x2f, 0x4a, 0xf9, 0xdb, 0x43, 0xbe, 0xd9, 0x1d, 0x5a, 0x6e, 0x6d, +- 0x59, 0x25, 0xf6, 0xed, 0x05, 0x0e, 0x96, 0x94, 0x0b, 0x0e, 0x1e, 0x30, +- 0x65, 0xed, 0xd2, 0x40, 0x77, 0xa2, 0x12, 0x85, 0xbb, 0x6b, 0x9a, 0x1a, +- 0x51, 0x63, 0xbe, 0xc3, 0xfa, 0x05, 0x07, 0x3f, 0x5b, 0x21, 0xeb, 0xf6, +- 0x4f, 0x49, 0x8c, 0x1b, 0x92, 0x79, 0xcd, 0xc6, 0x50, 0xe7, 0xd8, 0x5b, +- 0x9a, 0xe8, 0x65, 0x13, 0x39, 0x8a, 0xda, 0xf7, 0xa6, 0x5d, 0xc6, 0x17, +- 0x39, 0x4a, 0x0c, 0x90, 0xf8, 0x72, 0x0a, 0xed, 0xfd, 0xa7, 0x68, 0xff, +- 0xb2, 0x8e, 0xc1, 0xbc, 0x77, 0x81, 0x85, 0xe2, 0x85, 0x99, 0x60, 0x31, +- 0xa2, 0x15, 0x15, 0xc4, 0x6f, 0xfa, 0x00, 0x5e, 0x30, 0xf5, 0x96, 0x87, +- 0x1c, 0xd1, 0x87, 0x8a, 0xa0, 0xaf, 0x7b, 0x5b, 0xe9, 0xc1, 0xc6, 0xc0, +- 0x08, 0xfa, 0xc8, 0x05, 0xf3, 0xf9, 0xf8, 0xba, 0x3d, 0x8c, 0x6f, 0x8e, +- 0x8b, 0xf9, 0xb8, 0x16, 0x8a, 0xff, 0x8e, 0x3c, 0xc0, 0x3f, 0x9b, 0x18, +- 0xed, 0xb0, 0x7d, 0x27, 0x90, 0xd9, 0x44, 0x7b, 0x0d, 0x8f, 0x87, 0xe9, +- 0x23, 0x23, 0x82, 0x7d, 0xf2, 0x35, 0xa3, 0x17, 0x0a, 0x98, 0x3f, 0x16, +- 0x33, 0x0f, 0x39, 0x9d, 0xb4, 0x3a, 0xdd, 0xb4, 0x6b, 0xe7, 0xa2, 0x99, +- 0x50, 0xd3, 0x37, 0xe0, 0x9d, 0x5d, 0x33, 0x51, 0x48, 0x5f, 0xaa, 0x48, +- 0xca, 0x0b, 0x55, 0xea, 0xa7, 0xd9, 0x6f, 0xec, 0x3d, 0x04, 0xda, 0x03, +- 0x8e, 0xda, 0x75, 0x49, 0x45, 0x27, 0xf6, 0xeb, 0x2d, 0xa5, 0xea, 0x4c, +- 0x78, 0x98, 0xaf, 0x94, 0xa4, 0x3d, 0x00, 0xb9, 0x32, 0x58, 0xef, 0xa7, +- 0xbb, 0x5c, 0x28, 0x37, 0x8c, 0xe8, 0x33, 0xcc, 0x81, 0x1c, 0xa3, 0x4e, +- 0xfc, 0xcc, 0x96, 0x6b, 0x1a, 0x8a, 0x47, 0x6f, 0xc0, 0xe9, 0x5d, 0x7e, +- 0xa8, 0xbc, 0x76, 0x76, 0xcf, 0x1c, 0x14, 0x8c, 0x12, 0x08, 0xd2, 0x8b, +- 0xf1, 0xd6, 0x2e, 0x15, 0xae, 0xd1, 0xbf, 0xc1, 0x87, 0xbb, 0x14, 0xcc, +- 0x9f, 0xa7, 0xa0, 0x68, 0x78, 0x84, 0x3a, 0x11, 0xee, 0x45, 0x3f, 0x4d, +- 0xc1, 0xe6, 0x5d, 0x5b, 0x92, 0xc2, 0xed, 0xc9, 0xe9, 0x06, 0x2b, 0x61, +- 0xee, 0x7e, 0xd3, 0xaa, 0x30, 0x8c, 0xd8, 0x2d, 0xaa, 0xb5, 0xb8, 0x72, +- 0x41, 0xa0, 0x65, 0x80, 0x38, 0xfd, 0x12, 0x7d, 0xe0, 0x64, 0x7f, 0xdc, +- 0xf2, 0x18, 0x8b, 0x89, 0xb5, 0x51, 0x34, 0x30, 0x37, 0x97, 0xbc, 0x7b, +- 0x9b, 0x9d, 0xef, 0xca, 0x7e, 0x63, 0x27, 0xfc, 0x63, 0x0f, 0xe3, 0x78, +- 0xc2, 0x8d, 0xc5, 0x63, 0xa5, 0xb8, 0x8e, 0x39, 0x75, 0x98, 0xdc, 0x21, +- 0xbc, 0x2f, 0xcb, 0xf1, 0x9e, 0x27, 0xc7, 0xfb, 0x15, 0xb2, 0x1c, 0x6f, +- 0x80, 0xb9, 0x5a, 0x95, 0x51, 0x8a, 0x5b, 0x06, 0x0c, 0xc6, 0x80, 0x52, +- 0x34, 0xdb, 0xeb, 0x01, 0x1a, 0x6e, 0xa3, 0xff, 0x7e, 0x9e, 0xf9, 0xf8, +- 0xcd, 0x3b, 0x03, 0xbe, 0x1d, 0x8a, 0x8f, 0x71, 0x40, 0xda, 0x3f, 0x4c, +- 0xdc, 0xf0, 0x61, 0x4e, 0xaf, 0x11, 0x5c, 0x8a, 0xc0, 0xf9, 0x43, 0xd4, +- 0xe5, 0xe2, 0xb1, 0x1b, 0x10, 0xa6, 0xee, 0xc2, 0xfb, 0x0e, 0xe7, 0xc6, +- 0x31, 0x41, 0xd9, 0x9d, 0x78, 0x6f, 0x70, 0x16, 0x5e, 0x3d, 0x90, 0xcd, +- 0xc3, 0x03, 0x7d, 0x13, 0xb2, 0x5e, 0xfc, 0x35, 0x86, 0xd7, 0x7b, 0x24, +- 0x0f, 0xff, 0x41, 0xbf, 0xde, 0x5f, 0x2a, 0xeb, 0x84, 0xf4, 0xe7, 0xaf, +- 0x2e, 0x70, 0x30, 0xbe, 0xe8, 0xfe, 0xef, 0x3b, 0xe2, 0xf2, 0x1c, 0xd9, +- 0xff, 0x08, 0xef, 0x7f, 0x9f, 0xf1, 0xfc, 0x36, 0x5e, 0x8f, 0x55, 0x32, +- 0xd7, 0x5e, 0x18, 0x3f, 0xef, 0xe2, 0xf5, 0xc7, 0x38, 0x97, 0x65, 0x46, +- 0x4d, 0xec, 0x15, 0xe5, 0x08, 0x71, 0xc3, 0x81, 0x1d, 0x21, 0x3d, 0xba, +- 0xc3, 0xce, 0xa1, 0x9d, 0x98, 0x48, 0x5f, 0x9d, 0xf3, 0xc1, 0x4a, 0x94, +- 0xec, 0x96, 0xfc, 0xc5, 0x90, 0xf5, 0x9f, 0xfe, 0x12, 0xe6, 0x4f, 0x95, +- 0x17, 0xec, 0x33, 0xbf, 0xff, 0x09, 0xee, 0x8a, 0x48, 0x33, 0x42, 0x7d, +- 0xf9, 0x7d, 0x50, 0x87, 0xd0, 0x9d, 0x7e, 0x10, 0xed, 0xbb, 0xf4, 0x76, +- 0x59, 0x1f, 0x7a, 0x25, 0x14, 0xb7, 0xca, 0x8d, 0x4e, 0xb8, 0x16, 0x18, +- 0xcd, 0xcc, 0x5d, 0x62, 0xdf, 0x56, 0x8a, 0x19, 0x3b, 0x8e, 0x61, 0xf3, +- 0xb0, 0x1e, 0xdc, 0xa1, 0x18, 0xcc, 0xf7, 0x34, 0x1c, 0x1a, 0x2c, 0xc0, +- 0xdd, 0x7b, 0x5a, 0x19, 0xdb, 0x4c, 0xe2, 0x66, 0x8d, 0xff, 0x1c, 0xde, +- 0xc7, 0x49, 0x53, 0xde, 0x11, 0x2a, 0x42, 0xab, 0x26, 0x7b, 0x80, 0x98, +- 0x79, 0x4e, 0xbb, 0xe4, 0x3d, 0x71, 0x4f, 0x91, 0x91, 0x7f, 0xdf, 0xdf, +- 0x60, 0xae, 0x38, 0x89, 0xfd, 0x83, 0xb2, 0x2e, 0x50, 0xa5, 0x1c, 0xef, +- 0x9f, 0xeb, 0xeb, 0x22, 0xe6, 0x3f, 0x64, 0x66, 0x70, 0x7e, 0x61, 0x25, +- 0x30, 0x5d, 0x41, 0xe8, 0xd3, 0x01, 0xf9, 0x9e, 0x0d, 0xff, 0xde, 0xb3, +- 0xfc, 0x5f, 0x90, 0x76, 0x4a, 0xcb, 0xb2, 0x6b, 0x05, 0x3f, 0xaa, 0x94, +- 0xf7, 0x01, 0x8f, 0x27, 0x2b, 0xca, 0xb3, 0xcf, 0x9c, 0xff, 0x54, 0x1f, +- 0x6f, 0x58, 0x7e, 0xbb, 0x8d, 0x7c, 0xdd, 0xd7, 0xad, 0xa8, 0x57, 0xca, +- 0x17, 0xb0, 0x6d, 0xf1, 0xcb, 0x2a, 0x65, 0x1d, 0x71, 0x54, 0x0d, 0x55, +- 0x29, 0xad, 0x43, 0x97, 0xb7, 0xfb, 0x9a, 0x15, 0x6d, 0x96, 0xf3, 0x7c, +- 0x39, 0x8b, 0xf7, 0xa5, 0x6c, 0xfe, 0xfe, 0x0b, 0xb9, 0xb6, 0x0a, 0xc9, +- 0x53, 0xb3, 0x65, 0xee, 0xee, 0x97, 0xfd, 0x4b, 0x51, 0x9c, 0xa8, 0x9f, +- 0xda, 0x5e, 0xbe, 0xef, 0xef, 0x5c, 0xd2, 0x5e, 0xb6, 0x6c, 0x55, 0x15, +- 0x8a, 0xa5, 0x7c, 0x06, 0xff, 0x8f, 0xbd, 0x86, 0x70, 0xc6, 0xde, 0x73, +- 0xb8, 0xcd, 0x6c, 0x88, 0x16, 0xe1, 0x33, 0x50, 0xaf, 0x8a, 0xcf, 0x2f, +- 0xb2, 0xb9, 0x6d, 0xb4, 0xb9, 0x88, 0xf9, 0xad, 0xdb, 0x88, 0x3e, 0xe4, +- 0x46, 0x26, 0xe3, 0x86, 0xde, 0x72, 0x5e, 0x39, 0xa4, 0xdc, 0x1d, 0xd0, +- 0xdb, 0xdf, 0x23, 0xd7, 0x78, 0x39, 0x10, 0xb7, 0x4a, 0x0d, 0xc3, 0xd7, +- 0xab, 0xe8, 0xe6, 0x1a, 0xc6, 0xb2, 0x17, 0x99, 0x3f, 0xb6, 0x05, 0x7a, +- 0xec, 0xe7, 0x8b, 0x4a, 0x64, 0x05, 0xae, 0xb4, 0xbf, 0xdd, 0xd2, 0x0c, +- 0x23, 0xf5, 0xb2, 0xac, 0x77, 0xf1, 0x77, 0x0c, 0xf3, 0xed, 0x6b, 0x6d, +- 0x08, 0xda, 0xff, 0x57, 0xe5, 0xbe, 0xef, 0xd2, 0x82, 0x1a, 0xfb, 0xff, +- 0x1d, 0x98, 0x9b, 0xba, 0xb0, 0x2e, 0x8c, 0x4d, 0xa6, 0x65, 0x3d, 0x67, +- 0x5a, 0x38, 0x73, 0x71, 0xbf, 0xf3, 0x0a, 0x07, 0xf3, 0x0d, 0x52, 0xac, +- 0x58, 0xf6, 0xfb, 0x54, 0x17, 0xdf, 0x97, 0x58, 0x7a, 0xc9, 0x7e, 0x67, +- 0xf9, 0xae, 0x42, 0xa5, 0xfd, 0xfd, 0xb1, 0x79, 0x8b, 0x9c, 0x78, 0x29, +- 0x51, 0x16, 0xf3, 0xf0, 0xf7, 0xe6, 0x45, 0x05, 0x58, 0x4f, 0x4e, 0xd6, +- 0x74, 0xd5, 0x33, 0x38, 0x67, 0x7f, 0xc7, 0x21, 0x1e, 0x92, 0xef, 0x37, +- 0x9c, 0x48, 0xd0, 0xa7, 0x07, 0xbb, 0x43, 0xfb, 0xed, 0xbe, 0x5f, 0xc7, +- 0xa6, 0x51, 0x79, 0xe6, 0xd7, 0x8c, 0xd5, 0x89, 0x49, 0xc6, 0x37, 0x69, +- 0x4b, 0xf2, 0x6e, 0x3d, 0xd3, 0xc6, 0x5c, 0x55, 0x75, 0x04, 0x71, 0x3b, +- 0xe3, 0xca, 0x2b, 0x09, 0xda, 0xe9, 0x42, 0xbd, 0xe3, 0xdb, 0xe4, 0x06, +- 0x65, 0x11, 0x3d, 0xf8, 0xae, 0xd2, 0x82, 0x31, 0xd6, 0x9f, 0x48, 0x88, +- 0x2d, 0x56, 0xc6, 0x0a, 0x39, 0x96, 0x43, 0xe4, 0xa3, 0x2f, 0x27, 0x34, +- 0x9c, 0xab, 0xf7, 0x20, 0x45, 0x7e, 0xfa, 0x52, 0x42, 0xb8, 0x9a, 0x17, +- 0x4f, 0x0c, 0xca, 0xfa, 0x60, 0x23, 0x1a, 0x12, 0xb2, 0x36, 0xec, 0xc5, +- 0xe3, 0x23, 0x5e, 0xda, 0xa3, 0x65, 0x6d, 0xa2, 0xed, 0xb6, 0x6a, 0x13, +- 0xec, 0x53, 0xd6, 0x14, 0xa3, 0xb8, 0xa9, 0xb7, 0x12, 0x4f, 0x8c, 0xf8, +- 0xf0, 0x3d, 0xf2, 0xf1, 0x3e, 0xd6, 0x7b, 0x25, 0xe1, 0x47, 0x6f, 0xca, +- 0x87, 0xe7, 0xc9, 0xcb, 0xb7, 0xf2, 0x5c, 0xbe, 0x05, 0x56, 0x60, 0x04, +- 0x91, 0x48, 0x1d, 0x63, 0x6c, 0xbc, 0x02, 0x6b, 0x57, 0x1e, 0x81, 0xda, +- 0x7b, 0x94, 0xc7, 0xf5, 0x8c, 0xd5, 0xd7, 0x23, 0x39, 0x18, 0x41, 0x72, +- 0xe4, 0x87, 0xe8, 0x19, 0x94, 0x71, 0xc9, 0x37, 0xa1, 0x64, 0x6f, 0x91, +- 0x81, 0xf9, 0x8c, 0xa7, 0x43, 0x23, 0xd2, 0x4f, 0x25, 0xfb, 0xfe, 0x4b, +- 0xdb, 0xff, 0x99, 0xb5, 0xf6, 0xf3, 0xd2, 0xf6, 0x91, 0x3f, 0xd1, 0xbe, +- 0xe8, 0x2a, 0xff, 0x6e, 0x9f, 0xac, 0x73, 0xb8, 0xd9, 0xa6, 0x07, 0x8e, +- 0x48, 0x66, 0x65, 0x29, 0xf4, 0xe8, 0x76, 0xc5, 0x68, 0x2a, 0x51, 0x26, +- 0xb1, 0x3d, 0x2d, 0xef, 0x71, 0x15, 0xe2, 0x79, 0x72, 0x02, 0x57, 0x48, +- 0xd7, 0xbe, 0x4d, 0xdb, 0x59, 0x42, 0x8c, 0x39, 0x63, 0x7e, 0x1a, 0x71, +- 0x4d, 0xf4, 0x57, 0x88, 0x57, 0xfb, 0xdd, 0x78, 0x37, 0xc4, 0x98, 0x6d, +- 0xef, 0xa1, 0xf6, 0xe0, 0x27, 0x09, 0x2f, 0xe7, 0xab, 0x36, 0x63, 0x38, +- 0xe6, 0x02, 0x55, 0xd9, 0x6b, 0x27, 0x12, 0x6d, 0xd8, 0x4f, 0x79, 0x5f, +- 0x49, 0x9c, 0xe7, 0xfc, 0xac, 0xa3, 0xfe, 0x45, 0xdf, 0xf1, 0x9c, 0xae, +- 0xbb, 0xa9, 0xeb, 0x99, 0x78, 0x31, 0xf1, 0x30, 0x9e, 0xa0, 0xfc, 0x8f, +- 0xf7, 0x1b, 0xd1, 0x39, 0xca, 0x31, 0x1c, 0x1a, 0x2a, 0x24, 0x7e, 0xbb, +- 0x71, 0x37, 0xb3, 0xe4, 0x49, 0xe9, 0x2b, 0x29, 0x6b, 0x93, 0x0a, 0xb9, +- 0xc7, 0x31, 0x8c, 0xf3, 0xde, 0x4f, 0xf8, 0x3b, 0xbc, 0xb0, 0x9c, 0x7d, +- 0x88, 0x7e, 0xfc, 0x76, 0x1e, 0xd0, 0x45, 0x7e, 0xb3, 0xbc, 0xfe, 0x98, +- 0xcd, 0x79, 0xba, 0x93, 0xad, 0xe8, 0xe9, 0x7f, 0x9f, 0x7c, 0x8e, 0x38, +- 0xe4, 0xad, 0xa7, 0xad, 0x67, 0xb0, 0x3d, 0xf5, 0xef, 0x55, 0x59, 0xee, +- 0xf9, 0x6a, 0x95, 0xec, 0xeb, 0x3d, 0x91, 0x28, 0xc4, 0x4b, 0xac, 0xb3, +- 0x36, 0xe4, 0xca, 0x3d, 0x2f, 0x39, 0x86, 0x5e, 0xe2, 0x6a, 0x8a, 0x7d, +- 0x24, 0xec, 0x36, 0xaa, 0x94, 0xbd, 0xf4, 0xc3, 0xf2, 0x85, 0x55, 0x4a, +- 0x92, 0xe7, 0x7d, 0xc9, 0x1f, 0xe2, 0xd9, 0x47, 0xb2, 0x3a, 0xdc, 0x6f, +- 0xb6, 0x61, 0x28, 0x75, 0x2a, 0xd7, 0xde, 0x8f, 0xa7, 0xbc, 0x9b, 0x26, +- 0xef, 0xba, 0xe4, 0xdf, 0x7b, 0xc9, 0x3e, 0xcf, 0x7a, 0x2a, 0x5d, 0x46, +- 0xde, 0x5c, 0x4c, 0x5b, 0x2b, 0x88, 0x79, 0x19, 0x4f, 0xdb, 0x16, 0x68, +- 0xd8, 0x75, 0xcd, 0x9c, 0x2a, 0x94, 0x69, 0xee, 0x5f, 0xd7, 0xbf, 0xcc, +- 0x7e, 0xca, 0x62, 0x15, 0x91, 0x8c, 0xbd, 0x07, 0x2a, 0x74, 0x4d, 0x35, +- 0x73, 0x68, 0x79, 0x2e, 0x1c, 0xc3, 0xdb, 0x89, 0xca, 0x58, 0x65, 0xa4, +- 0x9c, 0x78, 0x7b, 0x0e, 0xbd, 0xc3, 0xc4, 0x76, 0xf2, 0xe5, 0xd2, 0xbe, +- 0x4a, 0xb8, 0xed, 0x35, 0xbc, 0x2b, 0x30, 0x63, 0xf7, 0x2c, 0xf8, 0x76, +- 0xcf, 0x24, 0x5f, 0x61, 0x6e, 0x19, 0xb2, 0xac, 0x9f, 0x2f, 0xb4, 0xac, +- 0x2b, 0x79, 0x14, 0xf1, 0x38, 0x1b, 0x12, 0x3f, 0x8d, 0xa2, 0xd6, 0xf6, +- 0x57, 0x03, 0x75, 0xf6, 0xff, 0x46, 0xfa, 0x7a, 0x47, 0x68, 0xfe, 0xf8, +- 0xc3, 0xa1, 0xb9, 0xe3, 0xd5, 0x50, 0x07, 0xa6, 0xc1, 0xc1, 0xb6, 0x3e, +- 0x77, 0x8d, 0x85, 0x46, 0xfa, 0xf0, 0x1a, 0x53, 0xf8, 0x50, 0x1b, 0xf9, +- 0x50, 0x4f, 0xc8, 0x18, 0x3f, 0x82, 0x1b, 0xc9, 0x97, 0xdd, 0x03, 0x3e, +- 0xf6, 0x23, 0xf9, 0xb5, 0x33, 0x33, 0x9b, 0x3c, 0xfb, 0xd3, 0x0b, 0x85, +- 0x1b, 0xb5, 0x90, 0x1b, 0x1d, 0x45, 0xcb, 0xf8, 0x31, 0xdc, 0xca, 0x32, +- 0x1e, 0xe6, 0xfd, 0x7d, 0xe9, 0x1f, 0x92, 0x77, 0x58, 0x8c, 0x39, 0x19, +- 0xdc, 0xcc, 0xb6, 0x8b, 0x07, 0x9a, 0x70, 0xf7, 0xf8, 0x0a, 0xac, 0x1d, +- 0xb7, 0xb0, 0x3c, 0x34, 0x81, 0xe5, 0xe3, 0xe4, 0x9a, 0xe3, 0x79, 0x7f, +- 0x15, 0x9e, 0xb4, 0x82, 0x3c, 0x49, 0xe2, 0xd0, 0x2a, 0x7b, 0x1d, 0x4d, +- 0xa5, 0x1f, 0x36, 0x24, 0xe4, 0x9d, 0x9b, 0x38, 0x56, 0x8f, 0x0b, 0x56, +- 0x3f, 0x88, 0x4d, 0xe3, 0xb2, 0x2e, 0xfb, 0xf5, 0xd0, 0x9c, 0xf1, 0xd7, +- 0xd1, 0x30, 0x3e, 0x14, 0x9a, 0x37, 0x3e, 0x42, 0xb9, 0x13, 0x94, 0xad, +- 0x3f, 0x54, 0x33, 0x3e, 0x18, 0x0a, 0x8e, 0xef, 0x0d, 0x05, 0xc6, 0x9b, +- 0xb1, 0x75, 0x7c, 0x15, 0xb6, 0x8c, 0xb7, 0x63, 0xf3, 0xb8, 0xe0, 0xfc, +- 0x24, 0x96, 0x8d, 0x9f, 0xc1, 0xd2, 0xf1, 0x97, 0xd1, 0x38, 0x7e, 0x0a, +- 0x4b, 0xc6, 0x7f, 0x88, 0xa6, 0xf1, 0x1f, 0x73, 0x2c, 0xb2, 0xce, 0x2b, +- 0x6b, 0xbc, 0xf9, 0x67, 0x6a, 0xf9, 0xf7, 0x44, 0xf3, 0xdf, 0xd7, 0x70, +- 0x21, 0xaa, 0xbd, 0x81, 0xee, 0x3d, 0xf2, 0xbd, 0xc1, 0x5a, 0x6d, 0x93, +- 0xfd, 0xbe, 0xc1, 0xcb, 0xb2, 0x4f, 0x1d, 0x45, 0xc6, 0xe5, 0xef, 0xc5, +- 0xcb, 0x77, 0x31, 0xe4, 0x39, 0xe7, 0x24, 0xba, 0xd2, 0xe7, 0xad, 0xa8, +- 0x26, 0x65, 0xde, 0xc0, 0xe6, 0x3d, 0xf2, 0x3e, 0x71, 0x06, 0x5d, 0x49, +- 0x79, 0x0e, 0x2f, 0xef, 0xa0, 0xbf, 0x81, 0x2d, 0xa3, 0xb6, 0xaf, 0xa1, +- 0x71, 0x48, 0xde, 0x89, 0x69, 0xc3, 0x75, 0xc9, 0x8c, 0xbd, 0x56, 0x5e, +- 0x66, 0xe0, 0xef, 0x67, 0xe0, 0x41, 0xe6, 0x04, 0x05, 0xe4, 0xfd, 0xc5, +- 0xe8, 0x7c, 0x24, 0x6e, 0x15, 0x1a, 0x1e, 0xcc, 0x88, 0x18, 0x99, 0x77, +- 0x1d, 0xc5, 0xe8, 0xe0, 0xb5, 0xfb, 0x76, 0xc2, 0xef, 0x33, 0x44, 0xf7, +- 0x81, 0xd8, 0x28, 0x63, 0xec, 0x86, 0x7d, 0x19, 0xf2, 0x8b, 0x0e, 0xf8, +- 0xf9, 0x7f, 0x7b, 0x52, 0xf6, 0x21, 0x6d, 0x42, 0x74, 0x9f, 0xe8, 0xb0, +- 0x99, 0x3a, 0x9c, 0x64, 0xdc, 0x90, 0x67, 0x38, 0x46, 0x70, 0x2b, 0x64, +- 0x9d, 0x52, 0xc5, 0xf7, 0x06, 0xe5, 0x79, 0x83, 0xde, 0xf1, 0x25, 0xfa, +- 0xf4, 0x87, 0xca, 0x0f, 0x51, 0x76, 0x40, 0xf8, 0xd2, 0x04, 0x7a, 0x84, +- 0x6f, 0x47, 0x14, 0x23, 0x15, 0x38, 0x0b, 0xcf, 0x01, 0xc1, 0x5d, 0x27, +- 0x4a, 0xc6, 0xe4, 0xfb, 0x38, 0x40, 0x31, 0xf3, 0x12, 0x1c, 0x20, 0xa7, +- 0x3d, 0x70, 0x0a, 0xd8, 0x27, 0xeb, 0x56, 0xaf, 0x61, 0x72, 0x48, 0xe6, +- 0xad, 0x8d, 0xf3, 0x26, 0x7e, 0xf8, 0x7d, 0x0c, 0x0f, 0x79, 0xe8, 0xe3, +- 0x13, 0x1c, 0xc7, 0xeb, 0x78, 0x74, 0x8f, 0x3c, 0x17, 0x99, 0x89, 0x36, +- 0xd6, 0x3b, 0xc1, 0x3c, 0xbf, 0x75, 0xcc, 0xe4, 0x78, 0x56, 0xa1, 0xf3, +- 0xc0, 0x17, 0x78, 0x4c, 0xc3, 0x43, 0x07, 0xd6, 0x71, 0x8c, 0x71, 0x74, +- 0x8c, 0x75, 0xf3, 0x68, 0xc5, 0xc6, 0x9d, 0x26, 0xb9, 0xa0, 0xd8, 0xb4, +- 0x46, 0x3f, 0x6b, 0xe5, 0x98, 0xa4, 0x8f, 0xd5, 0xf8, 0x19, 0x31, 0xa6, +- 0x29, 0xb4, 0x1a, 0xe7, 0x6c, 0xbf, 0x5b, 0x8d, 0x2d, 0xfd, 0x46, 0xf0, +- 0x24, 0x56, 0x63, 0x33, 0xcf, 0x1f, 0xa5, 0xef, 0xcf, 0x21, 0x17, 0xbc, +- 0x93, 0xbe, 0xbd, 0x78, 0x78, 0x42, 0xbe, 0x9d, 0x80, 0xbe, 0x5d, 0x32, +- 0x1f, 0x6d, 0xf0, 0x8d, 0x65, 0x50, 0x3e, 0xc6, 0xec, 0x79, 0x27, 0xee, +- 0x2a, 0x43, 0x39, 0xbe, 0x11, 0x92, 0x3d, 0x0b, 0x3f, 0x40, 0xf1, 0x3e, +- 0x91, 0xf5, 0x87, 0x6c, 0xfb, 0x1c, 0x73, 0xf1, 0x53, 0x9c, 0x83, 0xfc, +- 0xb3, 0xf1, 0x5f, 0xe0, 0x60, 0x6a, 0x92, 0xb8, 0x7a, 0x9a, 0xc7, 0xe5, +- 0xcf, 0xa5, 0xbd, 0x76, 0x8e, 0x92, 0xdd, 0xff, 0xed, 0xc4, 0x8c, 0x3e, +- 0x59, 0xdf, 0x6d, 0x86, 0x2f, 0x29, 0x7c, 0x27, 0xb3, 0x8d, 0xf9, 0x4a, +- 0x7b, 0xd8, 0xe6, 0x3f, 0x46, 0x8c, 0xbc, 0xa7, 0xf9, 0xdb, 0x8a, 0x87, +- 0xbc, 0x27, 0x88, 0x15, 0x69, 0x3d, 0x7a, 0x33, 0xf5, 0x5b, 0xf4, 0xc8, +- 0x8f, 0xe0, 0x7c, 0xc4, 0x89, 0x42, 0xe6, 0x37, 0xa1, 0x90, 0xe8, 0x59, +- 0xde, 0x95, 0xcd, 0xe8, 0x85, 0xc4, 0xcc, 0x82, 0xbe, 0x0c, 0xe7, 0x27, +- 0x33, 0xbf, 0x00, 0x7e, 0xce, 0xcd, 0x0d, 0x68, 0xeb, 0x8f, 0x72, 0x6e, +- 0x3e, 0x45, 0x1b, 0x9b, 0xa0, 0xbd, 0x48, 0x4e, 0xf4, 0x32, 0x65, 0x74, +- 0xe5, 0xbe, 0xc9, 0x93, 0xd1, 0x9d, 0xd0, 0x4d, 0xbf, 0x5a, 0x95, 0x7d, +- 0x27, 0x05, 0xf6, 0xb3, 0xe7, 0x30, 0xf0, 0x06, 0x6d, 0x33, 0xcf, 0x67, +- 0x2c, 0xab, 0x9d, 0xf6, 0xd5, 0x3f, 0x2a, 0xbe, 0xb2, 0xb4, 0x2a, 0xfb, +- 0xbe, 0xee, 0x54, 0xae, 0x93, 0xaf, 0xeb, 0x20, 0x36, 0xe6, 0xef, 0xff, +- 0x08, 0x77, 0x32, 0x7e, 0x9d, 0x59, 0x78, 0x2a, 0x67, 0xf3, 0xd3, 0xab, +- 0xb3, 0xf8, 0xf5, 0x49, 0xdf, 0x0b, 0xfa, 0x2b, 0xfb, 0xdb, 0x3b, 0xd9, +- 0x6f, 0x1f, 0x01, 0xcf, 0x26, 0x0a, 0xe4, 0x29, 0xc1, 0x62, 0x17, 0x54, +- 0xaf, 0x0b, 0x85, 0x8c, 0x01, 0xd5, 0xd8, 0xe4, 0xb5, 0x70, 0xa3, 0x59, +- 0x80, 0x43, 0x75, 0xb7, 0x00, 0x15, 0xf1, 0x16, 0x97, 0xfd, 0x4e, 0xde, +- 0xef, 0xbf, 0xf4, 0x87, 0xef, 0xe4, 0x9d, 0xb1, 0xf3, 0xe1, 0x52, 0xe3, +- 0x76, 0xbc, 0x62, 0xc7, 0x09, 0x05, 0x25, 0x73, 0x65, 0x5d, 0xd2, 0x8f, +- 0x17, 0x8d, 0x5a, 0x7f, 0x85, 0x3c, 0x6f, 0x52, 0xce, 0x5a, 0x71, 0xaf, +- 0xbc, 0x87, 0xf7, 0xc7, 0xf6, 0x8f, 0x3f, 0x87, 0xad, 0xbb, 0xc2, 0x90, +- 0xf7, 0x3b, 0x9c, 0x46, 0xa1, 0x37, 0x2b, 0xbf, 0xc8, 0x26, 0xeb, 0x44, +- 0xb7, 0x71, 0x1c, 0x67, 0xe8, 0x8b, 0x67, 0xec, 0x75, 0x2a, 0xb7, 0xf1, +- 0xd7, 0x08, 0x56, 0xe4, 0xc7, 0x2f, 0x39, 0x8d, 0x92, 0xd5, 0x41, 0xf6, +- 0xfd, 0xda, 0x6a, 0xc1, 0xfe, 0x2d, 0xc9, 0x33, 0xf6, 0x9a, 0xac, 0xcb, +- 0xf8, 0x0f, 0xeb, 0x2d, 0x6f, 0x25, 0xcb, 0x3e, 0x95, 0xbb, 0x3f, 0x29, +- 0xeb, 0x38, 0xa6, 0x7c, 0xbb, 0xca, 0x69, 0xd7, 0x11, 0xbd, 0x5f, 0xac, +- 0xb3, 0x89, 0xbc, 0x7a, 0xb6, 0x71, 0xca, 0xea, 0xf4, 0xca, 0x18, 0xd6, +- 0x5c, 0x56, 0x47, 0xd6, 0x08, 0x34, 0xe9, 0x37, 0x2c, 0x63, 0xee, 0x4a, +- 0xff, 0x61, 0x9f, 0xb2, 0x7e, 0x5b, 0x60, 0x94, 0xe0, 0x6c, 0x45, 0x76, +- 0x4d, 0xe5, 0xa2, 0x8c, 0xed, 0xd5, 0xb2, 0xef, 0xae, 0xd0, 0x3e, 0xb7, +- 0xfb, 0x35, 0x2f, 0xd6, 0x7b, 0x30, 0x37, 0xde, 0x4a, 0xfb, 0x9d, 0x9a, +- 0x47, 0x6d, 0xae, 0xe3, 0x98, 0x32, 0xee, 0xdf, 0x78, 0x2f, 0xed, 0xe7, +- 0xf3, 0xb9, 0x7e, 0x45, 0x1e, 0xef, 0x94, 0x3e, 0x44, 0xae, 0xde, 0x5c, +- 0x1d, 0x3d, 0x1c, 0xb5, 0xfb, 0x57, 0x11, 0xde, 0x93, 0xef, 0xd3, 0xb2, +- 0x0a, 0x16, 0xe6, 0xdb, 0xc8, 0xd0, 0x0f, 0xad, 0xce, 0x42, 0xc6, 0xab, +- 0xb3, 0xf5, 0x0f, 0x62, 0x73, 0x42, 0xf4, 0x2c, 0xdf, 0x70, 0x25, 0x2e, +- 0xdb, 0xfc, 0xcb, 0xc5, 0x5c, 0xf6, 0x1a, 0x0c, 0x69, 0x71, 0xec, 0xaf, +- 0x93, 0x77, 0xc8, 0x5c, 0xf4, 0x85, 0x38, 0x71, 0xb0, 0x90, 0x38, 0x1a, +- 0xb7, 0xf7, 0x94, 0x1c, 0x34, 0xf5, 0xe8, 0xb3, 0xf2, 0x8d, 0xb2, 0xab, +- 0xec, 0xb5, 0xa7, 0xa6, 0x21, 0xc8, 0xf5, 0xfc, 0x7a, 0x52, 0xfe, 0xaf, +- 0x88, 0xb6, 0x23, 0x72, 0x89, 0x0d, 0x50, 0xba, 0x84, 0xbc, 0xeb, 0x54, +- 0x1b, 0x23, 0x67, 0xc4, 0x2b, 0x29, 0xd9, 0x7f, 0xf0, 0x5b, 0x2b, 0x5e, +- 0x2d, 0xfb, 0x1c, 0xa7, 0xd6, 0x29, 0x20, 0x97, 0x0b, 0x84, 0xcb, 0x94, +- 0xfc, 0xfb, 0x4e, 0x17, 0xff, 0x6e, 0xa5, 0xcd, 0x9c, 0xb3, 0xdf, 0x51, +- 0x93, 0xb3, 0x08, 0x1a, 0x92, 0xf2, 0xad, 0x52, 0x7d, 0x62, 0x39, 0x6a, +- 0x33, 0x35, 0x0e, 0x67, 0x8e, 0x93, 0x84, 0xb1, 0x82, 0x76, 0xb3, 0x25, +- 0x10, 0xb6, 0xdf, 0xc5, 0x5a, 0x96, 0xac, 0x09, 0x3e, 0xce, 0x1c, 0xfa, +- 0x1d, 0x96, 0xbf, 0x25, 0xfd, 0x3d, 0x6b, 0xc8, 0x2b, 0x63, 0xca, 0x63, +- 0xc3, 0x29, 0xfa, 0x06, 0xf5, 0x18, 0x11, 0xff, 0xf0, 0xa0, 0x22, 0x12, +- 0xa6, 0xff, 0x4a, 0x4c, 0x97, 0xf7, 0xb8, 0xf4, 0xbd, 0x71, 0x98, 0xc4, +- 0xfc, 0x1e, 0xda, 0x91, 0xec, 0x5b, 0xd6, 0xfd, 0x2b, 0x19, 0x5b, 0x8e, +- 0x5f, 0x78, 0xc6, 0x2f, 0x1c, 0xe0, 0xd9, 0xea, 0xdc, 0xde, 0x66, 0xf7, +- 0x6c, 0xc6, 0x3c, 0xcb, 0x7e, 0x6e, 0xdf, 0x66, 0x63, 0x8a, 0x66, 0xe8, +- 0x87, 0x7e, 0xe5, 0xe8, 0xc4, 0xd3, 0x0b, 0x8c, 0x8e, 0xc3, 0x6a, 0x66, +- 0xc8, 0x47, 0x7c, 0xb9, 0xde, 0x11, 0xdd, 0xc9, 0xff, 0xfe, 0xd7, 0xec, +- 0x6f, 0xab, 0x48, 0x5d, 0x3d, 0xb8, 0x4a, 0x95, 0xfd, 0x40, 0xcd, 0x18, +- 0xeb, 0x95, 0x77, 0x06, 0xf4, 0x96, 0xa7, 0x94, 0x4e, 0x6c, 0x08, 0x19, +- 0xcd, 0xed, 0x8a, 0xde, 0xf4, 0x0f, 0x8a, 0xee, 0x0f, 0x29, 0x52, 0x2e, +- 0xc8, 0xbc, 0xeb, 0x62, 0x3c, 0x75, 0xb1, 0x8f, 0x03, 0x09, 0x3d, 0x5c, +- 0xc5, 0xb2, 0x67, 0x4d, 0xc3, 0xf7, 0x3e, 0xdb, 0xfc, 0x57, 0x1e, 0x3b, +- 0xed, 0xf7, 0xc4, 0xa5, 0x7c, 0x74, 0xbe, 0xcb, 0xfe, 0xbe, 0x69, 0x0b, +- 0xe3, 0xae, 0x7c, 0x23, 0x38, 0x06, 0xad, 0x6f, 0x26, 0x4d, 0x4c, 0xef, +- 0xb9, 0x0d, 0xb2, 0xe7, 0xa0, 0x89, 0x09, 0xba, 0x07, 0xde, 0x48, 0x27, +- 0xe6, 0x2e, 0x30, 0x7c, 0x8b, 0x54, 0xbb, 0x7e, 0x30, 0xaa, 0x4a, 0x7d, +- 0xdd, 0x3f, 0x08, 0x69, 0x23, 0x63, 0x69, 0x73, 0xcb, 0xed, 0x3a, 0x0b, +- 0xd4, 0xcf, 0xc0, 0x75, 0xf5, 0xaf, 0xe5, 0x5b, 0x46, 0x5a, 0xa5, 0x21, +- 0x75, 0xe2, 0x3b, 0x35, 0xfc, 0xb1, 0x7a, 0x82, 0x2b, 0xbf, 0xb2, 0x30, +- 0x4d, 0xea, 0xc9, 0x9e, 0xb1, 0x3b, 0x70, 0xaf, 0xfd, 0x3d, 0x16, 0xf1, +- 0x47, 0x3d, 0xfa, 0x15, 0xf2, 0xcf, 0x62, 0x45, 0xb8, 0xa7, 0xf0, 0x84, +- 0x56, 0x74, 0x33, 0x8e, 0x69, 0x21, 0xbd, 0xe7, 0x0a, 0xd5, 0x83, 0xc2, +- 0xc8, 0x63, 0xb2, 0x6f, 0x66, 0xef, 0x3c, 0x35, 0xbb, 0xbf, 0x26, 0xc6, +- 0x76, 0x8f, 0xff, 0xd1, 0xe7, 0xb8, 0xec, 0xab, 0xd8, 0x94, 0xf7, 0x5b, +- 0xec, 0x35, 0xc5, 0xd6, 0x84, 0x23, 0xb7, 0x5f, 0x30, 0x3f, 0xb7, 0x1a, +- 0xda, 0xc8, 0xf5, 0xd7, 0xc8, 0x37, 0x31, 0x39, 0xd6, 0xb5, 0x09, 0x59, +- 0x4d, 0xfa, 0xff, 0x00, 0x85, 0x57, 0x0f, 0xe7, 0xe8, 0x59, 0x00, 0x00, +- 0x00 }; ++ 0x9d, 0xbc, 0x0b, 0x74, 0x14, 0xd7, 0x95, 0x2e, 0xfc, 0x55, 0x75, 0xb7, ++ 0xd4, 0x7a, 0x97, 0x44, 0x0b, 0xb7, 0x1c, 0x05, 0xba, 0x50, 0xb5, 0x24, ++ 0x90, 0x1c, 0x57, 0x83, 0xb0, 0xdb, 0x9e, 0x8e, 0xd5, 0x11, 0x32, 0x08, ++ 0x9b, 0xd8, 0x62, 0xc2, 0xd8, 0xf2, 0x8c, 0xff, 0xd0, 0x06, 0x01, 0x32, ++ 0xc6, 0x8e, 0x3c, 0x61, 0xee, 0x95, 0x67, 0xe5, 0x5e, 0xb5, 0x25, 0x01, ++ 0x02, 0x5a, 0xdd, 0x92, 0x90, 0x05, 0x99, 0xc9, 0xba, 0x6e, 0x10, 0x20, ++ 0x9c, 0xb4, 0xd4, 0xc4, 0x71, 0x26, 0x24, 0x8b, 0x5c, 0xf7, 0x80, 0x1f, ++ 0xf2, 0x9b, 0x24, 0x1e, 0x5f, 0x4f, 0x7e, 0xaf, 0x89, 0x2e, 0xb6, 0x31, ++ 0x49, 0xfc, 0x60, 0x32, 0x89, 0x07, 0xe7, 0xe1, 0xfa, 0xbf, 0x5d, 0x2d, ++ 0x81, 0xec, 0x78, 0x3c, 0x99, 0x5f, 0x6b, 0xd5, 0x52, 0x57, 0xd5, 0x79, ++ 0xec, 0xb3, 0xcf, 0xde, 0xdf, 0xfe, 0xf6, 0xa9, 0x53, 0xb5, 0x08, 0xc8, ++ 0xc7, 0xcc, 0x5f, 0x11, 0x8f, 0xcf, 0x2d, 0xef, 0xdc, 0xb8, 0xc5, 0xfc, ++ 0x9c, 0x29, 0xe7, 0x4e, 0xc0, 0x85, 0x3f, 0xf1, 0xcf, 0xf7, 0xa7, 0x16, ++ 0x9c, 0xf9, 0x53, 0x78, 0xd4, 0x7d, 0xec, 0x9a, 0x03, 0xd0, 0x66, 0xe5, ++ 0x90, 0x03, 0x6e, 0x35, 0xd4, 0xfe, 0x97, 0x4d, 0x06, 0xdc, 0x8e, 0x90, ++ 0x79, 0xd7, 0x46, 0x03, 0x08, 0xa7, 0xea, 0x7c, 0x2b, 0xf0, 0x07, 0x2b, ++ 0xea, 0x71, 0x42, 0xae, 0x7f, 0x36, 0xf4, 0xfb, 0xee, 0x1f, 0x5e, 0xab, ++ 0x5f, 0x48, 0x3a, 0xe0, 0xd6, 0x42, 0xfd, 0xd0, 0xaa, 0xe1, 0xae, 0x64, ++ 0x9d, 0x6f, 0xd4, 0x1c, 0x55, 0x50, 0x3c, 0xdb, 0xd6, 0x79, 0xeb, 0x87, ++ 0x35, 0xde, 0x48, 0x5e, 0x48, 0xc3, 0xe3, 0x69, 0xb4, 0xd6, 0x0f, 0x74, ++ 0x5b, 0x45, 0x46, 0x00, 0x6e, 0xc3, 0x68, 0x1b, 0x50, 0x0a, 0x83, 0x5b, ++ 0x97, 0xa3, 0x30, 0xd7, 0x40, 0xf4, 0xca, 0x10, 0x5a, 0x97, 0x4c, 0xe4, ++ 0x47, 0x9d, 0x21, 0x37, 0x5a, 0xd2, 0xee, 0xe8, 0x67, 0x42, 0x06, 0x56, ++ 0xa5, 0x43, 0x79, 0x28, 0xd6, 0xd0, 0x97, 0xb6, 0xdc, 0xd9, 0xf6, 0xd6, ++ 0xcc, 0xfc, 0x7f, 0xaa, 0x2c, 0xfb, 0x7f, 0x7e, 0xc4, 0x19, 0x02, 0x76, ++ 0xc4, 0x2c, 0x2b, 0x27, 0xf4, 0xa5, 0x2f, 0xa9, 0x21, 0xc3, 0x7b, 0x14, ++ 0xab, 0xb0, 0x41, 0xc3, 0xd7, 0x76, 0x36, 0xfc, 0x4a, 0x39, 0x35, 0x52, ++ 0x8f, 0xe8, 0xb8, 0x03, 0x61, 0xed, 0x79, 0xfe, 0x5f, 0xb0, 0xa0, 0x2d, ++ 0x58, 0x8f, 0x03, 0xe3, 0x17, 0x79, 0xdd, 0x69, 0x5f, 0xeb, 0xdd, 0xbf, ++ 0x60, 0xc1, 0x1d, 0xc1, 0xe7, 0xf1, 0xf5, 0x71, 0xf9, 0xbd, 0x05, 0xdd, ++ 0xf5, 0x0a, 0xa6, 0xbf, 0xb4, 0x19, 0x0e, 0xa3, 0x1e, 0x7d, 0xfb, 0x15, ++ 0x67, 0x4f, 0xbd, 0x8a, 0xb0, 0x47, 0xaf, 0x8d, 0x70, 0x32, 0x9c, 0x06, ++ 0x22, 0xb9, 0xa1, 0xa0, 0xf3, 0xe7, 0xb1, 0x90, 0xe6, 0x30, 0x2c, 0xab, ++ 0x36, 0xb0, 0x10, 0x8e, 0x52, 0xcb, 0xfa, 0xbe, 0xa9, 0xc1, 0x77, 0xfb, ++ 0x8b, 0x88, 0x8e, 0xb5, 0x42, 0x35, 0x5e, 0x44, 0xcf, 0xd8, 0x8b, 0x78, ++ 0x78, 0x5f, 0x09, 0xdb, 0x79, 0x1e, 0x3b, 0xc6, 0xa5, 0x5f, 0xfe, 0xdf, ++ 0xcf, 0xb1, 0x27, 0x44, 0x96, 0x06, 0x1e, 0xe7, 0x78, 0xc0, 0xad, 0x84, ++ 0xa2, 0xf0, 0xa7, 0xdc, 0x98, 0x76, 0x78, 0xf1, 0xc3, 0x1a, 0xa9, 0xf3, ++ 0x1b, 0x6b, 0xfa, 0xf6, 0x99, 0xf2, 0x73, 0xea, 0xf4, 0x7d, 0x4a, 0x9d, ++ 0xe8, 0x58, 0x08, 0xcf, 0xc5, 0x14, 0x6c, 0x0d, 0x14, 0x23, 0x5c, 0x2a, ++ 0xfa, 0xb0, 0xac, 0x71, 0xf3, 0x5f, 0xac, 0x69, 0x4d, 0x64, 0x99, 0xc2, ++ 0xf3, 0xbc, 0xb7, 0x33, 0xf0, 0x9a, 0x95, 0xf1, 0x48, 0xfb, 0xdb, 0x69, ++ 0x6b, 0x6b, 0x79, 0xdd, 0x89, 0x44, 0x0c, 0x91, 0xe2, 0xd0, 0xed, 0x3c, ++ 0xd7, 0xcd, 0x77, 0x15, 0xb7, 0xfb, 0xbd, 0x98, 0xfb, 0xf6, 0x22, 0x43, ++ 0xdd, 0x5e, 0x42, 0x9b, 0x7b, 0x81, 0x63, 0x3a, 0x61, 0x6e, 0x86, 0xcb, ++ 0xf8, 0x1b, 0xb1, 0x4d, 0x8e, 0xfb, 0x79, 0x0b, 0x57, 0xcc, 0xd6, 0x97, ++ 0x76, 0x35, 0xec, 0x4c, 0x58, 0xd6, 0x6e, 0x33, 0x7c, 0x5d, 0x1e, 0x0d, ++ 0xe6, 0x74, 0xac, 0x15, 0xee, 0x90, 0xdf, 0x77, 0x1e, 0x41, 0xac, 0x48, ++ 0x7b, 0xf0, 0x64, 0x0c, 0xce, 0xa6, 0x9a, 0x4a, 0xf4, 0xa4, 0x43, 0xb8, ++ 0x31, 0x6d, 0xa2, 0x39, 0xfd, 0x9f, 0x5b, 0xe3, 0xcd, 0x09, 0x1f, 0xc7, ++ 0xf0, 0x07, 0x2b, 0x3b, 0x06, 0x19, 0x9f, 0xfc, 0xe7, 0xbc, 0x27, 0xae, ++ 0xc4, 0x9e, 0x11, 0x03, 0xbb, 0x38, 0xbf, 0xab, 0x03, 0x99, 0x70, 0x1e, ++ 0x74, 0xf3, 0x3c, 0x42, 0x58, 0x99, 0x36, 0x38, 0xe7, 0x21, 0xac, 0x48, ++ 0x54, 0x69, 0x63, 0x58, 0x8c, 0xb0, 0x37, 0xeb, 0x03, 0x7b, 0x39, 0xde, ++ 0x0d, 0xfe, 0x56, 0x14, 0xd1, 0x86, 0x52, 0xcb, 0x83, 0x68, 0x62, 0xff, ++ 0x6b, 0xfe, 0x84, 0xfe, 0x6f, 0x65, 0xff, 0xef, 0xb2, 0xff, 0x8c, 0xdd, ++ 0x3f, 0x9c, 0x37, 0xf1, 0xdc, 0x4d, 0x7b, 0xdd, 0x93, 0x72, 0x3a, 0x57, ++ 0x27, 0x3c, 0xd8, 0x9d, 0x32, 0x69, 0x93, 0x72, 0xcb, 0x8b, 0x9d, 0x23, ++ 0x95, 0xd8, 0x35, 0xa2, 0x7b, 0x9f, 0xe6, 0xef, 0xde, 0xc3, 0x57, 0x62, ++ 0xc7, 0x88, 0x82, 0x43, 0xc6, 0x95, 0xe8, 0xe1, 0xef, 0x03, 0x23, 0x0b, ++ 0xf0, 0xf5, 0x11, 0x07, 0x82, 0xf3, 0xe6, 0x8e, 0x43, 0xfe, 0x5f, 0x89, ++ 0xe8, 0x61, 0x1f, 0x7a, 0x62, 0xaf, 0xd8, 0x3a, 0x2c, 0x0a, 0x3d, 0x3d, ++ 0xeb, 0xf7, 0xf4, 0x2d, 0x1f, 0x36, 0xc6, 0xbc, 0xe8, 0x49, 0x88, 0x9f, ++ 0xb8, 0x69, 0xbb, 0xe2, 0x27, 0x1f, 0x02, 0xc5, 0x6c, 0x3f, 0x3d, 0x7b, ++ 0x5f, 0x81, 0x93, 0xf3, 0xd6, 0xce, 0x7b, 0xbb, 0x13, 0x62, 0x17, 0xb3, ++ 0x36, 0x20, 0xbf, 0xcb, 0x68, 0x97, 0xf9, 0xf0, 0x1d, 0xc9, 0x47, 0xed, ++ 0x43, 0x1a, 0xde, 0x6c, 0x90, 0xeb, 0xf4, 0x87, 0x80, 0x94, 0x19, 0xc4, ++ 0xd1, 0x94, 0xf8, 0xb1, 0x0f, 0x4d, 0xb1, 0x29, 0xb6, 0xdf, 0xc0, 0xb6, ++ 0x4d, 0xfc, 0xef, 0x74, 0x3d, 0xbe, 0x97, 0xae, 0xc5, 0x3f, 0x50, 0x8f, ++ 0xdf, 0x4d, 0xfb, 0xf0, 0x58, 0xba, 0x12, 0xdf, 0x49, 0x7b, 0xf1, 0x28, ++ 0xe7, 0xef, 0xdb, 0xe9, 0x56, 0xfa, 0x86, 0x86, 0xe3, 0x69, 0xd1, 0x7f, ++ 0x0e, 0xc7, 0x9b, 0x8f, 0xde, 0x91, 0xaa, 0xda, 0xd3, 0xb4, 0xad, 0x7f, ++ 0x30, 0x6f, 0x42, 0xa6, 0x8c, 0x6d, 0x24, 0xbc, 0xd8, 0xcd, 0xeb, 0x7b, ++ 0x46, 0xaa, 0xc2, 0x4b, 0x14, 0xcb, 0x52, 0x03, 0x75, 0xc1, 0x53, 0xaa, ++ 0x8a, 0x69, 0x8f, 0xee, 0xcb, 0xa8, 0xba, 0x2f, 0x4c, 0xe0, 0x8a, 0xd1, ++ 0x77, 0xa2, 0xe5, 0x7a, 0x32, 0x4a, 0x9b, 0xf2, 0x18, 0x13, 0x1c, 0x8f, ++ 0xee, 0x8b, 0xaa, 0x1a, 0x76, 0x25, 0xf4, 0x03, 0x51, 0xd5, 0x83, 0x68, ++ 0x3a, 0x1f, 0xef, 0x8c, 0xe8, 0xfd, 0x51, 0xf5, 0x16, 0x44, 0xcb, 0x2c, ++ 0xeb, 0xd1, 0x00, 0x3a, 0xaf, 0x08, 0x21, 0x5c, 0x1e, 0x42, 0x64, 0x41, ++ 0xa8, 0x12, 0x89, 0x04, 0xf0, 0xee, 0x80, 0xe1, 0xfd, 0x3f, 0x4a, 0x2b, ++ 0xfe, 0xa6, 0x55, 0xf7, 0xf9, 0xd4, 0xba, 0xe8, 0x98, 0xba, 0x9c, 0x2e, ++ 0x0f, 0x9f, 0x37, 0xb4, 0x0a, 0x5d, 0xf6, 0x35, 0x05, 0x9a, 0xe1, 0x41, ++ 0x6f, 0xe2, 0x3a, 0x44, 0x3c, 0x55, 0x6d, 0x43, 0x6a, 0xd5, 0x45, 0x53, ++ 0xd5, 0xa7, 0x5a, 0x55, 0xcb, 0xfa, 0xd7, 0x65, 0xef, 0x5a, 0xbe, 0xf9, ++ 0x96, 0xb5, 0x74, 0x99, 0xf4, 0xe9, 0x43, 0x69, 0xc8, 0xc4, 0x5a, 0x7b, ++ 0x0e, 0xf3, 0x71, 0x6e, 0xa4, 0x8c, 0x7d, 0x68, 0xf8, 0xa7, 0x6b, 0xf5, ++ 0xda, 0xcd, 0x6a, 0x3e, 0xde, 0x3c, 0x9c, 0x8f, 0xb3, 0x1c, 0xcf, 0xaf, ++ 0x46, 0xbc, 0xf8, 0xf5, 0x88, 0x65, 0xdd, 0x6e, 0xfe, 0x19, 0x86, 0xcb, ++ 0x06, 0xf1, 0xbd, 0x49, 0x0f, 0xde, 0x89, 0x69, 0x78, 0x23, 0x16, 0xbe, ++ 0x7f, 0x1e, 0xf4, 0xf0, 0xa4, 0x72, 0x7a, 0x7d, 0x31, 0xea, 0x5a, 0x8b, ++ 0x15, 0xbd, 0x65, 0x2f, 0x74, 0xef, 0x12, 0xc5, 0x83, 0xf3, 0x29, 0x0d, ++ 0xaf, 0xa7, 0xaa, 0x82, 0x3f, 0x61, 0x9f, 0xef, 0x9b, 0xdf, 0xb7, 0x32, ++ 0xf3, 0x45, 0x6f, 0xa2, 0x23, 0xea, 0x99, 0xfe, 0xfb, 0xbd, 0x04, 0xf5, ++ 0x9c, 0xa0, 0x9e, 0x29, 0xc3, 0x63, 0x09, 0xea, 0x99, 0xba, 0x7b, 0x94, ++ 0x36, 0xf5, 0x6d, 0xce, 0xe3, 0x71, 0x7b, 0x1e, 0x83, 0x9c, 0xaf, 0xcf, ++ 0xe0, 0x7f, 0xda, 0xd8, 0xfb, 0xbc, 0xf5, 0xdf, 0x3d, 0x32, 0xa6, 0xd2, ++ 0xf9, 0x59, 0x7c, 0x93, 0xb1, 0x3d, 0x67, 0x45, 0x34, 0x19, 0x97, 0x8c, ++ 0xcf, 0xd6, 0x9f, 0xaf, 0x53, 0x19, 0x52, 0x90, 0x6f, 0x59, 0xfb, 0xcc, ++ 0x99, 0xfb, 0x9e, 0xd9, 0xf1, 0xfd, 0x3f, 0x4a, 0xd6, 0xae, 0x8e, 0xe4, ++ 0x52, 0xdf, 0xb5, 0x61, 0x75, 0x2d, 0xcf, 0xf5, 0x68, 0x18, 0x37, 0x3b, ++ 0x3e, 0x7a, 0xfe, 0xcf, 0x1e, 0x99, 0x0f, 0xdf, 0xa5, 0x73, 0xda, 0xa3, ++ 0xdd, 0xdf, 0x57, 0x79, 0x2e, 0x63, 0x11, 0x5b, 0x14, 0x1b, 0xf0, 0xd0, ++ 0x5e, 0xae, 0x9b, 0xb9, 0x87, 0xa8, 0x1a, 0xea, 0x44, 0x6b, 0xc3, 0x63, ++ 0x76, 0x1f, 0x39, 0x71, 0xf1, 0x1b, 0x05, 0xef, 0x5e, 0xa7, 0xe0, 0x54, ++ 0xc0, 0xa0, 0xcd, 0x1c, 0x23, 0x2e, 0x00, 0xb9, 0x71, 0xb8, 0x0b, 0x43, ++ 0x21, 0xc4, 0x06, 0xe0, 0xce, 0x0b, 0x05, 0xb1, 0x78, 0xa0, 0xaa, 0xe3, ++ 0x1c, 0xf4, 0xda, 0x01, 0x45, 0x6f, 0x65, 0xcc, 0x31, 0x27, 0xa8, 0xc7, ++ 0x25, 0x8a, 0xee, 0xcb, 0x51, 0x04, 0xcf, 0x42, 0xc4, 0xb3, 0x63, 0xd8, ++ 0x95, 0x96, 0xdf, 0x41, 0x18, 0x29, 0xcc, 0xc4, 0x0d, 0xb1, 0xfb, 0x4e, ++ 0xda, 0xfd, 0x39, 0x8e, 0x5d, 0xf7, 0x11, 0x7f, 0xdd, 0xae, 0x50, 0x07, ++ 0x8e, 0xc4, 0xe0, 0xce, 0x09, 0x6d, 0xc3, 0x53, 0xb1, 0x64, 0xf9, 0x6c, ++ 0x39, 0x85, 0xe5, 0x7c, 0xa9, 0xb9, 0xb2, 0xfc, 0x8b, 0x15, 0xf6, 0x64, ++ 0x65, 0xc9, 0x8f, 0x1f, 0xc3, 0xde, 0x84, 0xd4, 0x0d, 0xd9, 0x75, 0x9d, ++ 0xec, 0xa3, 0x2f, 0x56, 0xd5, 0x72, 0xb3, 0xa2, 0x07, 0x1f, 0xe1, 0xfc, ++ 0xf5, 0xa0, 0x2e, 0xfc, 0x73, 0xe8, 0x5a, 0x07, 0xb2, 0xb2, 0xd4, 0xa4, ++ 0xb2, 0x72, 0x2c, 0xa2, 0x1c, 0xeb, 0x13, 0xb0, 0x2a, 0x0c, 0x14, 0x7a, ++ 0x0d, 0xc3, 0xf7, 0x81, 0xa3, 0x0c, 0x07, 0x38, 0x3f, 0x7d, 0xf4, 0x15, ++ 0xc1, 0xb3, 0x7b, 0xf7, 0xf9, 0x50, 0x68, 0x58, 0x38, 0x1a, 0x28, 0xc3, ++ 0xf3, 0xc4, 0xda, 0x62, 0xfa, 0xe6, 0x8b, 0x1a, 0xc2, 0x15, 0xa1, 0xa0, ++ 0x72, 0x47, 0x7a, 0x62, 0x66, 0x0e, 0x42, 0x33, 0x31, 0xea, 0xe3, 0xd7, ++ 0x2b, 0x94, 0x4f, 0xbe, 0x0e, 0xa5, 0x2d, 0xa1, 0xd7, 0x46, 0x61, 0xa1, ++ 0x64, 0x99, 0xee, 0x9b, 0x56, 0x2e, 0xaa, 0x28, 0x26, 0x56, 0xa7, 0x3f, ++ 0x5e, 0xae, 0x4e, 0x3b, 0x4c, 0x35, 0x39, 0x8c, 0x3c, 0xea, 0x5c, 0x27, ++ 0x53, 0x08, 0xd7, 0xba, 0xec, 0x6b, 0x0e, 0x24, 0x9d, 0x61, 0xaf, 0x03, ++ 0xbf, 0xb7, 0xc2, 0xeb, 0xe4, 0x5a, 0x3e, 0x22, 0xad, 0x75, 0x5e, 0x27, ++ 0xea, 0x82, 0x3b, 0xe8, 0x83, 0xd3, 0xeb, 0x9a, 0x78, 0xcf, 0x6f, 0x9e, ++ 0x46, 0x95, 0x6f, 0x07, 0xe4, 0xf7, 0x07, 0xb4, 0x9b, 0x26, 0xa9, 0xcb, ++ 0x32, 0x62, 0x87, 0xba, 0x26, 0x3e, 0xde, 0x67, 0x5a, 0xd6, 0x11, 0xf3, ++ 0x84, 0xd2, 0x94, 0xf8, 0xd0, 0x0a, 0x3b, 0xa3, 0xe1, 0xdc, 0x90, 0xdf, ++ 0xdc, 0x45, 0x30, 0x76, 0x84, 0xa2, 0x4a, 0x38, 0xdd, 0xa7, 0xdc, 0x98, ++ 0xee, 0x57, 0x56, 0xa6, 0xa5, 0xfc, 0x09, 0x65, 0x45, 0x5a, 0xca, 0xcf, ++ 0x96, 0x0d, 0xb2, 0x2c, 0x70, 0x34, 0xe6, 0xaf, 0x9d, 0x2d, 0xbf, 0x92, ++ 0x65, 0x6f, 0xbc, 0x54, 0x36, 0x48, 0x5b, 0x35, 0x39, 0x2f, 0x05, 0xd8, ++ 0xac, 0xe9, 0xe1, 0x28, 0x75, 0x9e, 0x1b, 0x7a, 0xf5, 0xaf, 0xde, 0x32, ++ 0x32, 0xb5, 0x0e, 0xce, 0xc1, 0x38, 0x47, 0xd6, 0x4c, 0x9c, 0xdb, 0x68, ++ 0xb8, 0xd0, 0xaf, 0x95, 0x60, 0xa3, 0xf9, 0x5b, 0x6b, 0xf3, 0x3a, 0xb9, ++ 0x97, 0x95, 0x0d, 0x76, 0xf9, 0xd7, 0x58, 0x5e, 0x37, 0xc7, 0x67, 0xb0, ++ 0xf5, 0x54, 0x0c, 0x83, 0x8e, 0x10, 0x31, 0xbf, 0xc1, 0xef, 0xeb, 0x81, ++ 0xcc, 0x8d, 0x0f, 0x37, 0x52, 0x96, 0xa4, 0x73, 0x2e, 0xfe, 0x22, 0x7a, ++ 0xb9, 0x8c, 0x5c, 0x93, 0x72, 0xd3, 0xb4, 0x6f, 0xc1, 0x3a, 0xcb, 0x1a, ++ 0x32, 0xc5, 0xce, 0xbd, 0xb4, 0xf3, 0x72, 0xf8, 0xca, 0xf4, 0x68, 0x52, ++ 0xbc, 0x27, 0x36, 0x0f, 0x49, 0x4d, 0x25, 0xe6, 0xf6, 0x16, 0xa2, 0x38, ++ 0xac, 0xe4, 0x90, 0xfb, 0x60, 0x52, 0xc6, 0x59, 0x84, 0xb0, 0x53, 0xaf, ++ 0x95, 0xb9, 0xcb, 0x61, 0xcc, 0xab, 0x56, 0x59, 0xef, 0x92, 0x2f, 0xcb, ++ 0x98, 0x7d, 0xf4, 0xe5, 0xa8, 0xad, 0xa3, 0xe6, 0x4b, 0xe3, 0x96, 0xf6, ++ 0x66, 0x75, 0xf4, 0x5f, 0xa9, 0x67, 0x59, 0x3b, 0x2f, 0xe9, 0x36, 0x27, ++ 0x9c, 0x47, 0xdd, 0x1e, 0x8b, 0xf9, 0x83, 0xcf, 0x20, 0xaa, 0xb4, 0xa4, ++ 0x9d, 0x38, 0x1c, 0x93, 0x7a, 0x7d, 0x2c, 0xdf, 0xaf, 0xac, 0xba, 0x54, ++ 0x67, 0x7a, 0xc6, 0x6f, 0x65, 0x3c, 0x32, 0xbe, 0x1b, 0xb0, 0x71, 0x9f, ++ 0x1e, 0x8d, 0x42, 0xec, 0x2a, 0x8c, 0x0d, 0xa6, 0xee, 0x03, 0x4a, 0x68, ++ 0x37, 0x40, 0x69, 0xbc, 0xcb, 0x9d, 0xc5, 0x00, 0x60, 0xcb, 0xbe, 0x56, ++ 0x8e, 0xd5, 0xc2, 0x9b, 0x66, 0x19, 0x0e, 0xd3, 0x4b, 0x4b, 0xe2, 0x72, ++ 0x7d, 0xae, 0x8c, 0x21, 0x65, 0xc3, 0x78, 0x30, 0x0f, 0xf9, 0x22, 0xe7, ++ 0x2e, 0x35, 0x6b, 0xbf, 0x9f, 0x54, 0xff, 0x57, 0xd6, 0x61, 0x4f, 0xf6, ++ 0x5a, 0x49, 0x5c, 0x38, 0x61, 0x2b, 0xb4, 0x78, 0x21, 0xe3, 0x5d, 0xd4, ++ 0x2a, 0x30, 0xf4, 0xd6, 0x0b, 0x4a, 0x37, 0x6e, 0x09, 0xe8, 0x91, 0x9f, ++ 0x2a, 0x7a, 0x78, 0x40, 0x31, 0xe8, 0x87, 0xb5, 0x58, 0x9d, 0xfe, 0x78, ++ 0x5f, 0xaf, 0x40, 0x3d, 0x22, 0xfd, 0x48, 0x7f, 0x67, 0xd0, 0x6f, 0x8f, ++ 0x69, 0x76, 0x3c, 0x32, 0x36, 0x05, 0x9b, 0xed, 0x31, 0xb5, 0xda, 0xfe, ++ 0xf1, 0x23, 0xd3, 0x85, 0xf6, 0x7d, 0xa7, 0x16, 0x8b, 0x81, 0x6c, 0x1a, ++ 0x0f, 0xa3, 0xb7, 0xc1, 0x85, 0x8d, 0x63, 0x77, 0xa8, 0x22, 0x1b, 0xd4, ++ 0xeb, 0xf3, 0xb2, 0xff, 0x15, 0xf2, 0x96, 0x42, 0x6c, 0x48, 0x73, 0xee, ++ 0x88, 0xa1, 0x1b, 0xc6, 0x65, 0x6e, 0xcb, 0xf8, 0x5f, 0xe6, 0xd6, 0xc3, ++ 0xff, 0x32, 0xcf, 0xf3, 0xf9, 0xbf, 0x04, 0xbe, 0xf9, 0x22, 0x4b, 0x03, ++ 0x62, 0xfb, 0xe1, 0x2e, 0x08, 0x75, 0xe1, 0x9e, 0x01, 0xcb, 0xea, 0xf7, ++ 0x5b, 0x56, 0x5e, 0x80, 0x3c, 0xcb, 0x5f, 0x17, 0x5c, 0xa2, 0xe4, 0x60, ++ 0x5a, 0x6b, 0x40, 0xff, 0x78, 0x4e, 0xa4, 0x24, 0x44, 0x98, 0x26, 0x1f, ++ 0x7a, 0x67, 0x79, 0x2b, 0x26, 0x27, 0xe6, 0x8e, 0x21, 0x6b, 0x67, 0x3f, ++ 0xac, 0x99, 0xb5, 0x33, 0x91, 0x5f, 0x64, 0xd7, 0xfb, 0x93, 0xf4, 0xcb, ++ 0xa8, 0x86, 0x08, 0xfd, 0x83, 0x32, 0x95, 0xa1, 0xe7, 0x12, 0xe7, 0xfe, ++ 0xa4, 0xfa, 0x17, 0xeb, 0x3a, 0x62, 0x1f, 0x5a, 0xd9, 0x3c, 0x20, 0x53, ++ 0x77, 0x7f, 0xea, 0xa3, 0x76, 0x93, 0x67, 0xdb, 0x8d, 0x94, 0xbd, 0x58, ++ 0x77, 0x77, 0xaa, 0xd5, 0x1e, 0x73, 0x92, 0x85, 0x37, 0xed, 0x13, 0x9d, ++ 0x8a, 0x0e, 0x2c, 0x1c, 0x37, 0x6f, 0x20, 0x56, 0xbc, 0x65, 0x39, 0xe6, ++ 0xdb, 0x73, 0xa6, 0x34, 0xd3, 0x9e, 0xa2, 0xce, 0x5c, 0x90, 0x73, 0x6b, ++ 0x39, 0xa1, 0xb0, 0xb2, 0xd6, 0xd6, 0x7f, 0xb3, 0xb2, 0x6a, 0x6c, 0x6e, ++ 0xdb, 0x5d, 0xf4, 0xdd, 0x67, 0xd4, 0xec, 0x7c, 0x9f, 0xb7, 0xc7, 0x90, ++ 0x95, 0xdf, 0x87, 0xd6, 0x84, 0xb4, 0x23, 0x7a, 0xcd, 0xfa, 0x5b, 0xab, ++ 0xc4, 0x88, 0x4b, 0x32, 0x67, 0xb9, 0xc7, 0x65, 0x4c, 0x58, 0xfe, 0x11, ++ 0xfc, 0xb8, 0x91, 0xf8, 0x11, 0xfe, 0x0f, 0xf1, 0xe3, 0x9a, 0xff, 0xa4, ++ 0xec, 0x19, 0xca, 0x21, 0x3c, 0x45, 0xe2, 0x9e, 0xf0, 0x16, 0xe1, 0x2b, ++ 0xb5, 0x94, 0x4b, 0xf8, 0xcb, 0xac, 0x6d, 0x58, 0xd6, 0x77, 0xcd, 0x1a, ++ 0x44, 0xca, 0xf4, 0x41, 0xa0, 0x12, 0x83, 0x94, 0xd5, 0x11, 0x47, 0x94, ++ 0xe3, 0xa4, 0xae, 0xd5, 0x1b, 0x1c, 0x50, 0xeb, 0x1d, 0xe8, 0xc6, 0x1b, ++ 0xa6, 0xd1, 0xbf, 0x19, 0x9f, 0x45, 0x8f, 0xc7, 0xc2, 0x11, 0xb3, 0x96, ++ 0xb8, 0x94, 0x8f, 0x8e, 0x7a, 0x4e, 0xc4, 0x5a, 0x0f, 0x86, 0x12, 0xd1, ++ 0x36, 0xc2, 0x06, 0x63, 0xd8, 0xb6, 0xb6, 0x98, 0x5f, 0x6f, 0xdd, 0xc6, ++ 0x54, 0x69, 0xf5, 0x80, 0x1b, 0x3e, 0x49, 0x99, 0x18, 0x33, 0x1e, 0x65, ++ 0x9c, 0xdf, 0x64, 0x1a, 0xd4, 0x6d, 0x1f, 0x6d, 0x48, 0xa5, 0xbd, 0x48, ++ 0x3f, 0xb5, 0xe4, 0x33, 0x52, 0x97, 0x71, 0xa1, 0x5a, 0xc1, 0xcd, 0xd5, ++ 0xb4, 0x4f, 0xf2, 0xa2, 0xbf, 0x0e, 0x38, 0xed, 0xfb, 0xb1, 0x74, 0x5d, ++ 0xf8, 0x4b, 0xea, 0x6b, 0x16, 0xca, 0xed, 0x36, 0xb4, 0xb0, 0x4a, 0xb9, ++ 0x3f, 0x95, 0x13, 0x98, 0x10, 0xae, 0x56, 0x64, 0xbc, 0x8f, 0x09, 0x8f, ++ 0xd4, 0x29, 0x46, 0xc1, 0x70, 0x74, 0x7e, 0x3e, 0x6d, 0x38, 0x37, 0xa4, ++ 0xe3, 0x9e, 0xb1, 0x22, 0x38, 0x86, 0xf5, 0x8b, 0xab, 0x1c, 0x88, 0xe4, ++ 0x08, 0x3f, 0x1c, 0x2b, 0x43, 0xe9, 0xa8, 0xd5, 0xed, 0x0e, 0x59, 0x56, ++ 0xe1, 0xf2, 0x10, 0xee, 0x1f, 0xd7, 0xa0, 0x8e, 0xba, 0x50, 0xc0, 0x3c, ++ 0x65, 0x9d, 0xd9, 0x87, 0xed, 0xe4, 0x77, 0x15, 0xf1, 0x5a, 0xdc, 0x44, ++ 0x2c, 0xba, 0x98, 0x68, 0x69, 0x7e, 0x29, 0x56, 0xdd, 0x59, 0xe1, 0x10, ++ 0xee, 0xbf, 0x06, 0x9b, 0xd3, 0x6b, 0x70, 0x37, 0x63, 0xe7, 0x0b, 0x06, ++ 0xba, 0x2b, 0xe8, 0xaf, 0x77, 0x93, 0xff, 0xb5, 0x27, 0xd6, 0xa1, 0x3d, ++ 0xdd, 0xc9, 0x7b, 0x6d, 0xb8, 0x97, 0xc7, 0xa6, 0x84, 0xf8, 0xf7, 0x9d, ++ 0xd8, 0x94, 0xae, 0x42, 0x64, 0xac, 0x1d, 0xdb, 0xd2, 0xd7, 0x52, 0x06, ++ 0x0f, 0x75, 0xdb, 0x82, 0x8d, 0xe9, 0x16, 0xdc, 0xcf, 0xb1, 0xdc, 0xcf, ++ 0xf9, 0x50, 0xe3, 0xdb, 0xe8, 0x63, 0x85, 0xf0, 0x0c, 0x5f, 0x83, 0xed, ++ 0x63, 0x37, 0x60, 0x2b, 0xe3, 0xe4, 0xfa, 0xe5, 0x37, 0xa0, 0x7b, 0x6c, ++ 0x3b, 0xba, 0x12, 0x46, 0x57, 0x05, 0x53, 0xb1, 0x77, 0x97, 0x6f, 0xc7, ++ 0x7d, 0x94, 0xa3, 0x73, 0x9f, 0x85, 0xbc, 0xa5, 0xcb, 0x54, 0xa3, 0x34, ++ 0x6a, 0x79, 0x0d, 0x89, 0xcd, 0x6d, 0x77, 0xf6, 0x19, 0x23, 0x33, 0xd8, ++ 0xe2, 0x44, 0x8e, 0xa1, 0x88, 0x8d, 0x66, 0xaf, 0xc7, 0xfe, 0x07, 0x36, ++ 0x8f, 0xb9, 0xb0, 0x65, 0xac, 0x4b, 0xb9, 0x49, 0x6c, 0xc5, 0xa5, 0x72, ++ 0x3e, 0xc3, 0xc4, 0xbe, 0x66, 0xa5, 0x69, 0xcc, 0x9e, 0x67, 0xcd, 0x13, ++ 0xea, 0x52, 0xd6, 0xa5, 0xbf, 0xea, 0x40, 0xbe, 0xcc, 0xc5, 0xb5, 0x98, ++ 0xa8, 0xff, 0x86, 0x95, 0xcc, 0xce, 0x67, 0x92, 0xee, 0xe3, 0xf6, 0x86, ++ 0x46, 0xda, 0xbc, 0x35, 0x7a, 0xd7, 0x01, 0x55, 0x78, 0xa5, 0x1b, 0x19, ++ 0x7b, 0x3e, 0x73, 0xd8, 0x4f, 0x29, 0x8e, 0x7a, 0xb2, 0x5c, 0x62, 0x21, ++ 0xfb, 0xb2, 0x12, 0x2e, 0x8e, 0x95, 0x72, 0x73, 0x3c, 0x15, 0x71, 0x2f, ++ 0x1e, 0xa0, 0x7e, 0xba, 0x38, 0x47, 0x5d, 0xd4, 0xcb, 0x57, 0x12, 0xa7, ++ 0x18, 0x23, 0x3a, 0xf1, 0x95, 0x99, 0x7e, 0xfa, 0xd2, 0xb9, 0xc8, 0x37, ++ 0xfa, 0xf0, 0x4d, 0x2d, 0x87, 0x3e, 0x26, 0x3c, 0xa3, 0xed, 0xce, 0x23, ++ 0xc6, 0x97, 0x39, 0x86, 0x07, 0xd9, 0x86, 0xc8, 0x55, 0xa7, 0x95, 0x22, ++ 0x5b, 0xb6, 0x87, 0x98, 0x9d, 0x6f, 0xbc, 0x6f, 0x7d, 0xd3, 0xd3, 0x6a, ++ 0x97, 0x2d, 0x66, 0xd9, 0x17, 0x07, 0x7c, 0xb8, 0x85, 0xf6, 0x9d, 0x17, ++ 0x0f, 0x53, 0xef, 0x6e, 0x72, 0xaa, 0x66, 0xea, 0x9c, 0x73, 0x4c, 0xbd, ++ 0x6e, 0xa1, 0x3d, 0x3b, 0xe3, 0x6b, 0x38, 0x0f, 0x1a, 0x8a, 0xe2, 0x7d, ++ 0x9c, 0x07, 0x0f, 0xdc, 0xf1, 0x56, 0x74, 0x50, 0x2e, 0x57, 0x7c, 0x1d, ++ 0xe7, 0xa2, 0x12, 0x85, 0xf1, 0x36, 0xce, 0x05, 0x70, 0x0f, 0x75, 0xb9, ++ 0x3d, 0xf0, 0x1b, 0xa5, 0xb7, 0x4c, 0x86, 0xd1, 0xc2, 0xf9, 0x0b, 0x63, ++ 0x73, 0xa2, 0x2a, 0xb8, 0x53, 0xe2, 0xbe, 0x93, 0x09, 0x99, 0xf1, 0x2f, ++ 0xe4, 0xc2, 0xb4, 0x7e, 0xa3, 0x87, 0xbf, 0x67, 0xe5, 0x9c, 0xc5, 0x71, ++ 0x91, 0x53, 0xe2, 0xeb, 0xac, 0x9c, 0x2e, 0xe4, 0x31, 0xe7, 0x7b, 0xc4, ++ 0x03, 0x9f, 0x8b, 0x65, 0xf3, 0x59, 0xf6, 0x26, 0xca, 0x79, 0x13, 0xe5, ++ 0x5f, 0x18, 0xbf, 0x13, 0xdd, 0x94, 0xb3, 0x62, 0xd8, 0x4d, 0x8e, 0xaa, ++ 0xe3, 0x01, 0xea, 0xfe, 0x40, 0x22, 0x0f, 0x25, 0x9c, 0xe7, 0xaf, 0xf0, ++ 0xf7, 0x4e, 0xfa, 0xd1, 0x8b, 0x83, 0x16, 0x9e, 0x08, 0x68, 0x18, 0xd4, ++ 0xf2, 0xd0, 0x5b, 0xbb, 0x8d, 0xbc, 0x5c, 0xe6, 0x8a, 0xf9, 0x94, 0x51, ++ 0xc0, 0xb8, 0x8e, 0xa8, 0xab, 0x41, 0xc7, 0x8e, 0x5a, 0x37, 0x92, 0x1e, ++ 0x84, 0x5d, 0x46, 0x98, 0x36, 0xee, 0xc2, 0x80, 0xa6, 0xc0, 0x45, 0x3c, ++ 0xcc, 0xa5, 0x3f, 0xed, 0x62, 0xdc, 0x75, 0x85, 0xe4, 0x1e, 0xed, 0x84, ++ 0x1c, 0xac, 0x24, 0x64, 0x44, 0x5f, 0x52, 0xfc, 0x2d, 0x2e, 0x75, 0x3b, ++ 0x75, 0x54, 0x80, 0x27, 0x06, 0x1f, 0x44, 0x3b, 0xfb, 0xea, 0x4b, 0x14, ++ 0x32, 0x37, 0xf9, 0x7b, 0x25, 0x63, 0xe3, 0x67, 0x21, 0xe2, 0x23, 0x8f, ++ 0x5b, 0x0b, 0x0d, 0xb1, 0x9b, 0x10, 0xee, 0x1b, 0x2f, 0xc6, 0xe0, 0xe0, ++ 0x0d, 0xe8, 0x64, 0xb9, 0xdd, 0x89, 0x12, 0x18, 0x43, 0x8d, 0x76, 0x9d, ++ 0x11, 0xfa, 0xd7, 0x40, 0x7c, 0x3b, 0x56, 0x25, 0xaa, 0x6a, 0xc7, 0x95, ++ 0x08, 0x75, 0xe8, 0x41, 0x7f, 0xbc, 0xdd, 0xd6, 0x69, 0x6c, 0xb4, 0x03, ++ 0xdb, 0xc6, 0xaf, 0xc4, 0xde, 0xd1, 0xad, 0xb8, 0x67, 0x9c, 0xf9, 0xab, ++ 0x6d, 0xcb, 0x2a, 0x7a, 0x47, 0x6f, 0x50, 0x36, 0xb2, 0xbd, 0x3d, 0xc3, ++ 0xb4, 0x67, 0xda, 0xf4, 0x03, 0xfb, 0x8c, 0x4c, 0xa3, 0x63, 0xab, 0xe2, ++ 0x2b, 0xbb, 0x01, 0x5d, 0xb6, 0xed, 0x65, 0xf5, 0xb6, 0x33, 0xbd, 0x88, ++ 0x79, 0xce, 0xff, 0xb4, 0x1e, 0xf3, 0xe4, 0xda, 0xf3, 0xab, 0x52, 0x6f, ++ 0x4d, 0xb1, 0x42, 0xda, 0x0b, 0x73, 0xaf, 0x19, 0x7b, 0xe9, 0x4d, 0x2f, ++ 0x23, 0x6f, 0xf4, 0x20, 0xa5, 0xd5, 0x52, 0x1f, 0xb3, 0xf3, 0x60, 0xce, ++ 0xd8, 0xcb, 0x45, 0x96, 0xb1, 0x6d, 0xf9, 0x63, 0xbe, 0x20, 0xf3, 0xdb, ++ 0x8a, 0x52, 0xc6, 0xd7, 0x8d, 0x81, 0x75, 0xca, 0xfd, 0xda, 0xa5, 0x39, ++ 0xf3, 0xce, 0xce, 0x99, 0xe4, 0x89, 0x76, 0x5b, 0xb1, 0x07, 0x6d, 0xdb, ++ 0xbd, 0x31, 0xdd, 0x80, 0x8e, 0xb1, 0xb9, 0xed, 0xcf, 0xd6, 0xc9, 0xe3, ++ 0x5c, 0xcc, 0xce, 0xb3, 0xde, 0x2f, 0x58, 0xe6, 0x5f, 0x3a, 0x8b, 0x65, ++ 0x5f, 0x9d, 0xe9, 0xff, 0xa0, 0xc5, 0x98, 0xe4, 0x74, 0x19, 0x0e, 0x8c, ++ 0xd4, 0xfe, 0x37, 0x25, 0x5a, 0xe6, 0xa4, 0xcc, 0x0a, 0xb1, 0xe4, 0xef, ++ 0xad, 0xbd, 0xeb, 0x64, 0x5e, 0x56, 0xd1, 0x90, 0xa1, 0xb8, 0x2e, 0xf9, ++ 0xec, 0x1a, 0x6c, 0x48, 0x88, 0xac, 0xad, 0xd8, 0x98, 0xb0, 0xe5, 0xf2, ++ 0xcd, 0xca, 0xd5, 0x47, 0x9b, 0xd1, 0xe2, 0x7b, 0x6c, 0x99, 0x5a, 0x69, ++ 0x57, 0xf7, 0xed, 0x53, 0xf1, 0x4c, 0x60, 0x93, 0xe2, 0x2b, 0x97, 0x38, ++ 0x5c, 0x85, 0xae, 0x7d, 0xf2, 0xdf, 0x47, 0xbe, 0x1b, 0x51, 0xa6, 0xcb, ++ 0x07, 0x58, 0xae, 0x11, 0x1b, 0xf6, 0x95, 0xa1, 0x82, 0x63, 0x5d, 0x6f, ++ 0xfe, 0x95, 0xf2, 0xc1, 0x3c, 0x19, 0x4f, 0xeb, 0x4c, 0x2c, 0xaf, 0xc2, ++ 0xf6, 0x7d, 0xe2, 0x43, 0xf2, 0xbb, 0x09, 0xbd, 0xd7, 0x54, 0xcd, 0xc4, ++ 0xf9, 0xff, 0xc1, 0x79, 0xe9, 0x52, 0x6e, 0x26, 0x2e, 0x44, 0x88, 0x0b, ++ 0xb4, 0x29, 0xa5, 0x95, 0xb8, 0x70, 0xe3, 0x0c, 0x2e, 0x14, 0x12, 0x17, ++ 0xd6, 0xa4, 0x3f, 0xa0, 0x3c, 0xe2, 0x8b, 0x1f, 0x95, 0xe7, 0x5e, 0xca, ++ 0x73, 0x2c, 0x50, 0x01, 0xd8, 0xf2, 0x34, 0x92, 0xc7, 0x94, 0x71, 0x0e, ++ 0x2d, 0xc6, 0x07, 0x45, 0x19, 0xb1, 0xf5, 0xdc, 0x48, 0x99, 0xc5, 0xa6, ++ 0x2c, 0xca, 0xfd, 0x7b, 0x54, 0xdb, 0xeb, 0x03, 0x97, 0xe5, 0xd9, 0xb0, ++ 0xef, 0x43, 0xe6, 0x08, 0xf2, 0x9b, 0x78, 0xd1, 0x50, 0x45, 0x9c, 0x6b, ++ 0x24, 0xee, 0xb9, 0x38, 0x2e, 0xc1, 0x3a, 0x91, 0xcd, 0x45, 0xbf, 0x90, ++ 0xb6, 0x45, 0x27, 0x61, 0x47, 0x76, 0x1e, 0x66, 0xe7, 0xd9, 0x49, 0x3f, ++ 0x76, 0xa3, 0x24, 0xa4, 0x87, 0x6f, 0x75, 0xc8, 0x9c, 0x11, 0xe5, 0x87, ++ 0x5a, 0x67, 0xfa, 0xfa, 0x5b, 0xa5, 0xba, 0xb4, 0x9f, 0x72, 0x9e, 0x50, ++ 0xee, 0xe0, 0xb8, 0x7c, 0xb9, 0xc5, 0xe1, 0xc2, 0x90, 0xbf, 0x2d, 0xf6, ++ 0xb1, 0xd8, 0x78, 0x73, 0x3a, 0xcb, 0x2f, 0xd5, 0xa1, 0xa8, 0x95, 0x4f, ++ 0xdb, 0x77, 0x1a, 0xfe, 0x8b, 0x37, 0xb1, 0x87, 0x85, 0x07, 0x85, 0xcf, ++ 0x98, 0x6c, 0x6b, 0xb6, 0xaf, 0x4a, 0x62, 0xc9, 0x9f, 0xcd, 0xd8, 0xc1, ++ 0x1a, 0x85, 0x79, 0x43, 0x4b, 0xd8, 0xb6, 0x87, 0xdd, 0xd4, 0xd7, 0x09, ++ 0xe5, 0x8b, 0xc2, 0x99, 0x6d, 0x8e, 0x11, 0x55, 0x56, 0x13, 0x57, 0x4a, ++ 0xe2, 0x4a, 0xd8, 0x13, 0xaa, 0xeb, 0x2c, 0x85, 0xbf, 0xe5, 0x31, 0xf6, ++ 0x59, 0x4a, 0x9e, 0x79, 0x2b, 0x63, 0x6d, 0x9c, 0x7d, 0xae, 0x66, 0x9f, ++ 0x6b, 0xd3, 0xdb, 0xd9, 0xae, 0x60, 0xab, 0x8a, 0x8a, 0x51, 0xb8, 0x3d, ++ 0xb4, 0x83, 0x91, 0x6a, 0x27, 0x82, 0xcb, 0x7e, 0x05, 0xcc, 0x43, 0x44, ++ 0x65, 0xfe, 0xbe, 0x30, 0x2e, 0xb9, 0x54, 0xdb, 0x9d, 0x8d, 0x29, 0xc1, ++ 0x52, 0x0d, 0x85, 0xc3, 0x1e, 0x89, 0x47, 0xe8, 0x0b, 0x54, 0x2a, 0x7b, ++ 0x6d, 0xbc, 0x55, 0x91, 0x37, 0xaa, 0xe0, 0xaa, 0xc0, 0xa3, 0x4a, 0xb2, ++ 0x3c, 0x8b, 0xf9, 0x2a, 0xf5, 0xd1, 0x33, 0x29, 0xd8, 0x18, 0x21, 0x36, ++ 0x1e, 0x53, 0xb2, 0xeb, 0x31, 0xf4, 0xfb, 0x04, 0xa2, 0xc5, 0x21, 0x59, ++ 0x03, 0xf1, 0x77, 0x7c, 0x4e, 0xd9, 0x4e, 0x2c, 0x74, 0x31, 0x0e, 0x15, ++ 0x12, 0x1b, 0x25, 0x4e, 0x47, 0xee, 0x8c, 0x0d, 0x54, 0xa2, 0x9f, 0xbe, ++ 0xdd, 0x3e, 0x7e, 0xea, 0x8e, 0x42, 0x94, 0xf1, 0xbf, 0x87, 0xc7, 0x7c, ++ 0x1e, 0x6e, 0xfa, 0xb2, 0x1b, 0x8e, 0x01, 0xe1, 0x7b, 0xf5, 0x8c, 0x55, ++ 0x85, 0xc8, 0x1f, 0x30, 0xb1, 0x95, 0xf2, 0xe4, 0x0e, 0x35, 0x30, 0x9e, ++ 0xd0, 0xcf, 0x13, 0xa5, 0xb8, 0x71, 0x70, 0x39, 0x36, 0xd9, 0xf8, 0x55, ++ 0x86, 0x33, 0x83, 0xd7, 0xd8, 0xb8, 0xf1, 0x70, 0x62, 0x1e, 0x3e, 0xd8, ++ 0x77, 0xad, 0x8d, 0x71, 0x83, 0x8c, 0xcd, 0xde, 0xd1, 0x20, 0xba, 0xd8, ++ 0xa6, 0x67, 0xf4, 0x7a, 0x6c, 0x1f, 0xf7, 0x52, 0x47, 0x06, 0xe3, 0x80, ++ 0xfa, 0xa1, 0xef, 0x36, 0xb1, 0xf3, 0xb9, 0xd8, 0x2f, 0x73, 0x2d, 0x75, ++ 0xfe, 0x81, 0xc6, 0x2a, 0xbf, 0x9d, 0x36, 0x17, 0xce, 0xea, 0x28, 0xab, ++ 0x93, 0xab, 0xa9, 0x93, 0x5b, 0xd3, 0x34, 0x87, 0x61, 0x27, 0xe7, 0x9a, ++ 0x1c, 0xa2, 0xb4, 0x8c, 0x7e, 0x99, 0xc3, 0x83, 0xf6, 0x3f, 0xf6, 0x19, ++ 0xc6, 0xf6, 0x0c, 0xe7, 0x93, 0xbf, 0x4d, 0x99, 0x4f, 0x89, 0x9f, 0x0e, ++ 0x62, 0xae, 0x42, 0xfd, 0xfe, 0x23, 0x70, 0x45, 0x36, 0xb7, 0x99, 0xd5, ++ 0x95, 0xca, 0xf1, 0x37, 0xc5, 0x32, 0x36, 0xa7, 0x67, 0x46, 0xa4, 0xab, ++ 0xbc, 0xd7, 0x3e, 0x4e, 0xce, 0x1d, 0x17, 0x9f, 0xf5, 0xd0, 0x9e, 0xeb, ++ 0xa9, 0x2f, 0x8d, 0xb1, 0xc3, 0x24, 0xce, 0xcd, 0x87, 0x8b, 0xe3, 0xd8, ++ 0x44, 0xfd, 0x14, 0x72, 0x1c, 0xdb, 0x58, 0xee, 0x1e, 0xde, 0xbb, 0x67, ++ 0xbc, 0x8c, 0x87, 0x87, 0xc7, 0x7c, 0x1e, 0xbf, 0x24, 0x66, 0x35, 0xd0, ++ 0x8e, 0x1d, 0xc8, 0x19, 0x56, 0xf1, 0xb4, 0xa9, 0xe0, 0x42, 0x3d, 0xfb, ++ 0xab, 0xbe, 0x8c, 0x75, 0x12, 0xcb, 0x3c, 0xf1, 0x07, 0x89, 0x73, 0x3e, ++ 0xac, 0x23, 0x27, 0xe8, 0xd8, 0xa7, 0xc1, 0x15, 0x48, 0x31, 0x67, 0x12, ++ 0x19, 0x4e, 0xcc, 0x70, 0xcc, 0x85, 0xcc, 0x75, 0xea, 0x82, 0xb4, 0x21, ++ 0x6d, 0xb3, 0x6d, 0x43, 0x51, 0xc6, 0xe7, 0x5a, 0xe6, 0xfa, 0x59, 0xdb, ++ 0x6d, 0xfa, 0x88, 0x1d, 0xd1, 0xc7, 0x38, 0x9e, 0x8a, 0x90, 0xee, 0xbb, ++ 0x83, 0xbe, 0x20, 0x9c, 0x2f, 0x37, 0x0e, 0x1c, 0x18, 0x6c, 0x45, 0x09, ++ 0x6d, 0xc6, 0xb3, 0x6c, 0x1c, 0x89, 0xb2, 0x7e, 0xdb, 0x56, 0xb3, 0x6d, ++ 0xe7, 0x85, 0x8b, 0x42, 0x75, 0x11, 0x69, 0x7b, 0x62, 0xa6, 0xed, 0x95, ++ 0x6c, 0x3b, 0xc6, 0xb6, 0x57, 0xfd, 0x51, 0xdb, 0x73, 0xe3, 0x5d, 0xcf, ++ 0x4c, 0x5c, 0x96, 0xbc, 0x79, 0x16, 0xb7, 0x67, 0x39, 0xc6, 0x97, 0xcb, ++ 0x2f, 0xe3, 0xe4, 0xa0, 0xcc, 0x9d, 0x37, 0xeb, 0xb3, 0x1f, 0xc5, 0xe6, ++ 0xcb, 0x6d, 0xed, 0x9d, 0x8d, 0xf1, 0x66, 0xe9, 0x9c, 0xb6, 0x2a, 0x78, ++ 0xff, 0xba, 0x84, 0x70, 0x89, 0x56, 0x58, 0x94, 0xf5, 0x79, 0x43, 0xef, ++ 0x6a, 0x74, 0x18, 0x9d, 0x17, 0x99, 0xeb, 0xdc, 0x72, 0xa9, 0x2f, 0x59, ++ 0x1b, 0x69, 0xc5, 0xe2, 0x01, 0xbd, 0x63, 0x37, 0xf9, 0xe8, 0x91, 0x80, ++ 0x1e, 0xfe, 0x01, 0xf4, 0x68, 0xae, 0xf2, 0x2a, 0x72, 0x26, 0xcf, 0x60, ++ 0x30, 0xfd, 0x1a, 0xf3, 0xcd, 0x53, 0x6c, 0xd3, 0xad, 0x14, 0x4e, 0xf6, ++ 0x21, 0xc2, 0x7a, 0x6e, 0xd6, 0x73, 0x0f, 0xc0, 0x5d, 0xc4, 0x7a, 0x13, ++ 0x03, 0x51, 0xcb, 0x45, 0x2e, 0xa8, 0x86, 0xf4, 0xb6, 0x22, 0xc5, 0x88, ++ 0x6c, 0x62, 0xdb, 0x6b, 0x18, 0xcb, 0xf2, 0xe3, 0xdd, 0xe4, 0x01, 0xba, ++ 0xf7, 0xef, 0x54, 0xbd, 0x6b, 0x03, 0x5e, 0xc5, 0x2f, 0x48, 0x1e, 0x17, ++ 0xc6, 0xcf, 0x20, 0xc1, 0xf6, 0xac, 0x09, 0x8d, 0x7c, 0xe6, 0x43, 0x2b, ++ 0x58, 0x53, 0xee, 0x94, 0x76, 0x2f, 0x4e, 0xd4, 0x7c, 0x18, 0xbb, 0x8c, ++ 0xe7, 0x9a, 0xcb, 0x58, 0xfe, 0x31, 0x7c, 0xaa, 0x6f, 0x5e, 0x19, 0xdb, ++ 0xb0, 0xcd, 0x15, 0xea, 0x7c, 0xe0, 0x78, 0x43, 0xd6, 0x6e, 0x7d, 0x29, ++ 0x37, 0xce, 0x78, 0xc4, 0x97, 0x98, 0xff, 0xec, 0xaf, 0xc7, 0x9e, 0xfd, ++ 0xcc, 0x2b, 0xd5, 0xba, 0x60, 0xbe, 0x52, 0xca, 0x9c, 0x68, 0xd8, 0xe6, ++ 0xc3, 0x4e, 0xe3, 0xa0, 0x9d, 0x33, 0x4b, 0x7c, 0x90, 0x3a, 0x8b, 0x52, ++ 0x12, 0xff, 0x64, 0x3d, 0xa7, 0xed, 0xce, 0x8d, 0x31, 0xfa, 0xad, 0xd6, ++ 0xcb, 0x32, 0xdb, 0x66, 0xd6, 0xf1, 0x65, 0x0d, 0xa3, 0x77, 0x0e, 0x27, ++ 0xf9, 0xf2, 0x9c, 0x58, 0x55, 0xe7, 0x2b, 0xbd, 0x14, 0x47, 0x3a, 0x67, ++ 0xca, 0x5f, 0xef, 0xca, 0xca, 0xe6, 0x9e, 0x83, 0x67, 0x83, 0xbc, 0x96, ++ 0xf5, 0x85, 0xcb, 0xf1, 0x6e, 0xd7, 0xcc, 0xdc, 0xa4, 0x5c, 0x59, 0xdc, ++ 0xdf, 0xee, 0x9e, 0x5d, 0x2f, 0xca, 0x96, 0x69, 0xce, 0x41, 0xfe, 0xde, ++ 0x4b, 0xb1, 0x25, 0x4a, 0x2c, 0xef, 0xdc, 0x97, 0x5d, 0x9f, 0x2c, 0xba, ++ 0x46, 0x70, 0xbb, 0x0a, 0xf7, 0xda, 0x7e, 0xff, 0x5d, 0x57, 0xd6, 0x0e, ++ 0x9c, 0x33, 0xe3, 0x32, 0x69, 0x83, 0x4b, 0xe4, 0x99, 0xc0, 0x0c, 0x7e, ++ 0xea, 0xbc, 0xdf, 0x0b, 0x99, 0x0b, 0x17, 0xfd, 0xf3, 0x71, 0xd3, 0x81, ++ 0xe9, 0x79, 0x59, 0xbe, 0xae, 0x8e, 0xd6, 0xa3, 0xe7, 0x30, 0xf1, 0x86, ++ 0x3e, 0xd4, 0x12, 0x58, 0x6b, 0xa1, 0x54, 0xd6, 0x0d, 0xca, 0x50, 0x30, ++ 0x2a, 0xbc, 0x99, 0x3c, 0xe3, 0xf0, 0xf3, 0xf6, 0x58, 0x7a, 0x53, 0xd9, ++ 0x75, 0x91, 0x5d, 0x89, 0xbe, 0x0f, 0xb7, 0x68, 0x82, 0x17, 0x62, 0x1b, ++ 0xaf, 0xfd, 0xd5, 0x62, 0x7f, 0xc6, 0xe7, 0x80, 0x6e, 0xee, 0xe6, 0x85, ++ 0x97, 0x63, 0x5f, 0xc6, 0x8e, 0x32, 0x05, 0x5d, 0x46, 0x09, 0x1c, 0xcb, ++ 0x7e, 0x6b, 0x6d, 0x59, 0x27, 0xf7, 0xdc, 0xae, 0x2c, 0xbe, 0x7c, 0x92, ++ 0x7d, 0xcb, 0xb8, 0x85, 0xd3, 0xb9, 0x51, 0x40, 0x9f, 0xba, 0xd9, 0x21, ++ 0x9c, 0x53, 0x61, 0xec, 0xb4, 0xe7, 0x02, 0xbd, 0x49, 0x05, 0x7b, 0x92, ++ 0x82, 0x99, 0x4e, 0xe2, 0xa0, 0x17, 0xbb, 0x92, 0x82, 0x83, 0x2e, 0xe2, ++ 0x60, 0x05, 0x76, 0x24, 0x05, 0x07, 0x73, 0xf0, 0xb3, 0xc1, 0x2b, 0xf1, ++ 0x30, 0x7f, 0x7f, 0x3d, 0x91, 0x8b, 0xe0, 0xbe, 0xcf, 0xe0, 0x40, 0x52, ++ 0xf8, 0x93, 0x1b, 0x89, 0xe1, 0x4a, 0x24, 0x92, 0x59, 0x2e, 0x51, 0x3c, ++ 0xfc, 0x59, 0xc4, 0xf9, 0x7b, 0x80, 0xbc, 0x2f, 0x35, 0xb4, 0x00, 0x31, ++ 0xfe, 0x96, 0xf5, 0xb6, 0x42, 0xca, 0x1f, 0xf3, 0x17, 0x60, 0xe3, 0x90, ++ 0xe4, 0xd0, 0xaf, 0xfe, 0xd5, 0x3d, 0xfe, 0x85, 0xec, 0xb3, 0x12, 0x7b, ++ 0xc8, 0xd9, 0x5a, 0x86, 0x7c, 0xe8, 0xe7, 0xef, 0x5d, 0x89, 0x22, 0xbc, ++ 0x39, 0xa8, 0xdb, 0xfd, 0xf5, 0x24, 0x56, 0xae, 0x74, 0x19, 0xc5, 0x58, ++ 0x39, 0xb8, 0x08, 0x3b, 0x93, 0x82, 0xbd, 0x25, 0xc4, 0xde, 0x2a, 0x7c, ++ 0x3d, 0x29, 0xfc, 0x52, 0x83, 0x67, 0x9f, 0x81, 0x91, 0xa4, 0xac, 0x09, ++ 0x97, 0xe2, 0xc2, 0x90, 0x1f, 0x83, 0x76, 0xff, 0x26, 0xe2, 0x89, 0x20, ++ 0xe5, 0xf3, 0xa0, 0x68, 0x34, 0xe3, 0x2d, 0x86, 0x82, 0x29, 0x7f, 0x2d, ++ 0x06, 0x0e, 0xcf, 0x47, 0xfe, 0xa8, 0x6e, 0x6e, 0x83, 0x7e, 0xf1, 0x1e, ++ 0x2c, 0xc1, 0x9e, 0xc3, 0x5e, 0xe4, 0x8e, 0x96, 0xc0, 0x1d, 0xa8, 0xc7, ++ 0xae, 0xc3, 0x9f, 0xc3, 0x8e, 0xc3, 0x95, 0xc4, 0x4e, 0xe0, 0x99, 0x94, ++ 0x89, 0x7e, 0x62, 0x70, 0x05, 0x63, 0xcc, 0xd9, 0xb4, 0xcc, 0xa3, 0xcc, ++ 0x8f, 0x82, 0x42, 0x7f, 0x09, 0x63, 0x94, 0xfc, 0x96, 0x6b, 0x41, 0x1b, ++ 0xdb, 0xb3, 0xeb, 0x54, 0x7a, 0x74, 0x17, 0x6c, 0x7d, 0x23, 0x93, 0x12, ++ 0xdd, 0xcb, 0x9a, 0xd0, 0x5c, 0x7b, 0xda, 0x65, 0xaf, 0xd1, 0x5f, 0xb6, ++ 0xcb, 0x1b, 0x67, 0xec, 0xd2, 0x5e, 0x53, 0xc3, 0x53, 0x97, 0xf2, 0x5c, ++ 0xb0, 0xb0, 0xdf, 0x74, 0x2a, 0xf0, 0x31, 0xdf, 0xf5, 0x3d, 0xfd, 0xb1, ++ 0xb5, 0xb5, 0xcb, 0xeb, 0x3f, 0x73, 0xd7, 0x60, 0xe5, 0xd9, 0x93, 0xca, ++ 0x78, 0x9e, 0x83, 0xa8, 0x26, 0x6b, 0x54, 0x75, 0x1a, 0xb5, 0xf2, 0xb1, ++ 0xbc, 0xbb, 0x38, 0x92, 0x17, 0x6a, 0x80, 0x6f, 0xa2, 0xd2, 0xf7, 0x66, ++ 0x4c, 0x74, 0xfa, 0x7b, 0xcb, 0x6d, 0x18, 0xde, 0x63, 0xa8, 0xf4, 0xbd, ++ 0x9e, 0xfa, 0x20, 0x07, 0xc5, 0x85, 0xb8, 0x31, 0xf6, 0xc9, 0xf5, 0xd4, ++ 0x10, 0x94, 0x55, 0x0d, 0x5e, 0xf2, 0x7e, 0x38, 0x6f, 0xaa, 0xc1, 0x9c, ++ 0x3f, 0xf2, 0x91, 0x10, 0xd4, 0xd3, 0x0d, 0x41, 0xe6, 0xfa, 0xd9, 0xe7, ++ 0x39, 0x2b, 0xd2, 0xba, 0x37, 0xac, 0x64, 0x9f, 0xd9, 0x74, 0x04, 0xfe, ++ 0x40, 0xbb, 0xee, 0x16, 0xce, 0xc2, 0xbe, 0x80, 0x6d, 0x31, 0xcb, 0x7a, ++ 0x8a, 0x3a, 0x90, 0x67, 0x85, 0x6f, 0xa7, 0x7e, 0x67, 0x4d, 0x79, 0x9c, ++ 0x78, 0xcb, 0x98, 0xdb, 0x1e, 0xb9, 0x5e, 0xc8, 0x64, 0xec, 0xb3, 0x4f, ++ 0xd4, 0x09, 0xa3, 0xae, 0xf3, 0x08, 0xf3, 0xe4, 0xc5, 0x7e, 0xdd, 0x17, ++ 0xc7, 0xff, 0xb5, 0x84, 0x17, 0x26, 0x95, 0xd9, 0x75, 0xbb, 0x8f, 0xaf, ++ 0x9d, 0x14, 0x47, 0x5c, 0x1c, 0xdf, 0xa1, 0x98, 0xde, 0x1f, 0x65, 0xde, ++ 0x16, 0xf6, 0x20, 0xe2, 0x0c, 0x55, 0xfa, 0x76, 0xc5, 0xec, 0x71, 0x9a, ++ 0xe7, 0x39, 0x77, 0xa7, 0x1b, 0x2a, 0x7d, 0xbd, 0x29, 0xb1, 0x41, 0x85, ++ 0x63, 0x69, 0xc0, 0x23, 0x29, 0x15, 0x77, 0x3f, 0xe4, 0xc1, 0xa6, 0x81, ++ 0x42, 0x74, 0x0e, 0x3c, 0x08, 0xe3, 0x2a, 0x27, 0xb6, 0x30, 0xf7, 0xdb, ++ 0x3c, 0x90, 0x4b, 0x3d, 0x6a, 0xd8, 0x3a, 0xe0, 0x44, 0xfd, 0x55, 0xc5, ++ 0x88, 0x96, 0xe7, 0xe2, 0x45, 0xfa, 0xee, 0x55, 0x81, 0x02, 0x24, 0x6d, ++ 0xce, 0x21, 0xd8, 0x20, 0xbc, 0x4d, 0xf4, 0xc6, 0x38, 0x68, 0x08, 0x86, ++ 0x7c, 0xd2, 0xfa, 0xcc, 0xfb, 0x56, 0xa6, 0x7c, 0xaf, 0xcd, 0x27, 0x1d, ++ 0x21, 0xd1, 0x8d, 0xd4, 0x95, 0xb5, 0x26, 0x0f, 0x63, 0xe4, 0x47, 0xf4, ++ 0xa8, 0x2c, 0x0c, 0xf9, 0xa7, 0x1a, 0x15, 0x07, 0x82, 0xfe, 0xe2, 0x48, ++ 0x49, 0x28, 0x88, 0x55, 0xe9, 0x1e, 0xaf, 0xd7, 0x7e, 0x96, 0x15, 0xc2, ++ 0xf9, 0xe5, 0x26, 0xee, 0x48, 0xc3, 0xb9, 0x8a, 0xba, 0x6f, 0xa6, 0x5e, ++ 0x77, 0x9a, 0x7f, 0xb0, 0xb2, 0x79, 0x8d, 0x9b, 0x78, 0x69, 0x59, 0x9b, ++ 0xa9, 0x5f, 0xe6, 0x14, 0xf8, 0xe5, 0x8c, 0x7e, 0x45, 0xa7, 0x05, 0x13, ++ 0xbf, 0xb3, 0x4e, 0x53, 0xbf, 0x6e, 0xb6, 0xe7, 0x66, 0x7b, 0x79, 0x13, ++ 0x1f, 0xd5, 0x73, 0x2e, 0xe5, 0x59, 0x65, 0xcb, 0xa0, 0xcb, 0xb3, 0x00, ++ 0x5f, 0x58, 0x99, 0xe5, 0xa1, 0xff, 0xd9, 0x98, 0x5e, 0xb5, 0xd7, 0xdb, ++ 0x1e, 0x4d, 0x5b, 0xd6, 0xb0, 0x29, 0xfa, 0xf7, 0x51, 0xff, 0xb2, 0xee, ++ 0x22, 0x73, 0x50, 0x8f, 0x70, 0x99, 0xde, 0x0f, 0x7c, 0x9f, 0x89, 0xaf, ++ 0x82, 0x79, 0xcc, 0xdf, 0xbe, 0xd3, 0x5a, 0x88, 0x37, 0x63, 0x45, 0xf6, ++ 0xb8, 0xaf, 0xab, 0xb6, 0xac, 0xc0, 0x32, 0x1f, 0x2e, 0x1a, 0x75, 0xc1, ++ 0xa5, 0xaa, 0xce, 0x98, 0x40, 0xff, 0xa5, 0xfd, 0xf6, 0x24, 0x16, 0x70, ++ 0xbe, 0xc4, 0xe7, 0xd1, 0x49, 0x7b, 0xf2, 0x39, 0x42, 0xc0, 0x1b, 0x31, ++ 0xa3, 0x76, 0x27, 0xfb, 0x1f, 0xf3, 0x84, 0xb0, 0x23, 0xa1, 0x36, 0x3b, ++ 0x49, 0x3e, 0xf3, 0x98, 0xeb, 0xed, 0xc6, 0x2f, 0xac, 0xa4, 0xc7, 0x42, ++ 0x0e, 0x79, 0x51, 0xbe, 0xf1, 0x39, 0x3c, 0xab, 0x39, 0xf0, 0x5c, 0xed, ++ 0x7c, 0x44, 0x4a, 0x1d, 0xcc, 0x43, 0xde, 0xb2, 0x7e, 0xe2, 0x91, 0x7e, ++ 0x64, 0x2c, 0xb9, 0x1c, 0x97, 0x62, 0xe3, 0xdd, 0xae, 0x44, 0x88, 0xfa, ++ 0xfe, 0x78, 0xff, 0xff, 0xd7, 0x9a, 0xf6, 0x48, 0xff, 0xba, 0xe6, 0x23, ++ 0x3f, 0x7f, 0xfc, 0x13, 0xd7, 0x59, 0x6a, 0x39, 0xde, 0x2b, 0xf1, 0xbc, ++ 0xe6, 0x64, 0x1e, 0x7a, 0xc6, 0x7a, 0xc1, 0x93, 0x6d, 0x23, 0x6e, 0x66, ++ 0x2a, 0x8a, 0x2f, 0xf1, 0x18, 0x68, 0x25, 0x21, 0xa7, 0x4f, 0xa3, 0x8f, ++ 0xae, 0x98, 0xe1, 0x2e, 0xad, 0xe4, 0x17, 0xb7, 0xa6, 0x1f, 0xb3, 0x75, ++ 0x70, 0x5d, 0xb5, 0xe8, 0x53, 0xf2, 0xa7, 0xc7, 0x2d, 0xcc, 0x17, 0x59, ++ 0xbe, 0xc3, 0xeb, 0x21, 0x44, 0xd3, 0xb3, 0x32, 0x8a, 0xce, 0x7f, 0x9c, ++ 0x2b, 0x58, 0xbf, 0x2b, 0xb1, 0x2a, 0x7b, 0xae, 0xca, 0xef, 0x9f, 0xd8, ++ 0xe5, 0x7a, 0xa8, 0xe7, 0x1e, 0xda, 0x1e, 0x63, 0x0a, 0xe3, 0x8c, 0x3c, ++ 0x9d, 0xd5, 0x88, 0xd5, 0x16, 0x76, 0x98, 0x2e, 0xe6, 0xc8, 0x25, 0xd8, ++ 0x65, 0xd2, 0x5e, 0x0d, 0x75, 0x91, 0x13, 0x16, 0x4e, 0x9b, 0x72, 0xee, ++ 0xc2, 0xb4, 0xc7, 0x81, 0xdd, 0xa6, 0x13, 0x1d, 0x86, 0xaa, 0xcb, 0x75, ++ 0x47, 0x40, 0xce, 0x5d, 0xf0, 0x95, 0x2b, 0xd8, 0x1b, 0x54, 0xb1, 0xd5, ++ 0xe8, 0xf1, 0xc9, 0xf5, 0x15, 0x01, 0x39, 0x57, 0xd0, 0x4e, 0x5d, 0x46, ++ 0x99, 0x63, 0x6f, 0x63, 0xbb, 0xbd, 0x81, 0xec, 0x7a, 0x7a, 0x04, 0x96, ++ 0xb5, 0xd7, 0x6c, 0xba, 0xae, 0x80, 0xe5, 0xce, 0x99, 0x12, 0x73, 0xda, ++ 0x18, 0x73, 0xa2, 0xe1, 0x1c, 0xe8, 0x91, 0x3c, 0xfa, 0xf7, 0xae, 0x81, ++ 0x85, 0xac, 0x27, 0x31, 0xc3, 0xe9, 0xdd, 0x03, 0x59, 0x27, 0xf3, 0xfb, ++ 0x5e, 0x27, 0x67, 0x4f, 0x7a, 0x6a, 0x38, 0x23, 0x86, 0xef, 0x2c, 0xe7, ++ 0xbb, 0xc4, 0x70, 0x76, 0xbe, 0x04, 0xbd, 0x23, 0x4f, 0xa9, 0xa9, 0x2d, ++ 0x86, 0x0b, 0x51, 0xf2, 0xfa, 0xc3, 0x13, 0xcc, 0xcb, 0x13, 0x86, 0x76, ++ 0xd4, 0x5e, 0x6b, 0x2f, 0xe4, 0xf8, 0x0a, 0x19, 0x67, 0xfc, 0xda, 0x94, ++ 0x32, 0x7b, 0xbe, 0x50, 0x30, 0x25, 0xe2, 0x08, 0x09, 0x2e, 0x46, 0xad, ++ 0x27, 0x1b, 0xa8, 0x0e, 0xc3, 0xed, 0x8b, 0xa4, 0x0a, 0x79, 0x68, 0x3c, ++ 0x3c, 0xbe, 0x4d, 0x29, 0xaf, 0xaf, 0x3d, 0x05, 0xdf, 0x86, 0xd4, 0xac, ++ 0x3d, 0xcf, 0x62, 0x82, 0x60, 0xa2, 0x65, 0xc9, 0x33, 0xe8, 0xc7, 0xd3, ++ 0xd2, 0x56, 0x36, 0xfe, 0xe5, 0x50, 0xf6, 0xa7, 0xe8, 0x23, 0x2e, 0xc6, ++ 0xb8, 0xdd, 0x46, 0x94, 0x10, 0x6b, 0x59, 0x06, 0x79, 0x50, 0x8e, 0xe2, ++ 0xc3, 0xae, 0xfa, 0xdf, 0xd2, 0x0e, 0x80, 0x4d, 0xa9, 0xcf, 0xbb, 0xb3, ++ 0x73, 0x21, 0xfe, 0x29, 0xd8, 0xe1, 0x63, 0xdc, 0xf6, 0xfa, 0x7a, 0xd8, ++ 0xcf, 0x8e, 0xd4, 0x5c, 0xdf, 0x51, 0x70, 0x13, 0xdb, 0x6a, 0x0a, 0xc0, ++ 0xb9, 0xb2, 0xfe, 0xdf, 0xad, 0x8c, 0x67, 0xee, 0xf3, 0x56, 0x37, 0x63, ++ 0x35, 0x9c, 0x1b, 0xea, 0xe5, 0x5c, 0x41, 0x53, 0x50, 0xce, 0x15, 0x6c, ++ 0x30, 0xe4, 0x9c, 0x58, 0x9f, 0x96, 0x73, 0xcb, 0xba, 0x7c, 0xfe, 0x71, ++ 0x0c, 0x33, 0x71, 0x4f, 0x42, 0xd6, 0xec, 0x04, 0xc3, 0xdc, 0xbe, 0xe7, ++ 0x52, 0xf5, 0xd8, 0x9a, 0x90, 0xe7, 0x6a, 0xcc, 0x51, 0x8c, 0x42, 0xdf, ++ 0xb3, 0xa9, 0xeb, 0x71, 0xf7, 0xfe, 0x20, 0x3a, 0xf6, 0xa3, 0x3e, 0x8f, ++ 0x63, 0xc8, 0x0d, 0xf8, 0x7d, 0xe3, 0xd0, 0x7c, 0x4f, 0x50, 0x27, 0xa7, ++ 0x28, 0xe7, 0xe9, 0x8f, 0xc8, 0x29, 0x3a, 0x84, 0xef, 0xde, 0x98, 0x1b, ++ 0xa9, 0xc0, 0x07, 0x56, 0xd4, 0xce, 0xa1, 0x3c, 0xbe, 0xfb, 0x62, 0x3e, ++ 0x64, 0xec, 0x5c, 0x8e, 0x0a, 0x27, 0xe6, 0xf7, 0x25, 0xa2, 0x61, 0x15, ++ 0xb3, 0xf3, 0xab, 0x07, 0x65, 0x6e, 0xdf, 0x88, 0xc9, 0xbd, 0xf0, 0x83, ++ 0x2a, 0xe3, 0x99, 0xaa, 0x5a, 0xd6, 0xa0, 0x3c, 0x17, 0x50, 0x17, 0x8a, ++ 0x7e, 0xe4, 0xd9, 0x46, 0x54, 0x72, 0xcd, 0x7a, 0x5e, 0xd7, 0x96, 0xd2, ++ 0xed, 0xa8, 0xa7, 0x7c, 0xc3, 0xe3, 0xab, 0x9b, 0xf4, 0xfa, 0xcc, 0x49, ++ 0xf8, 0x96, 0x4c, 0xce, 0x15, 0x81, 0x1c, 0x43, 0xfd, 0x24, 0x0c, 0xf1, ++ 0xf8, 0x36, 0xc7, 0x16, 0x92, 0x9f, 0x46, 0xad, 0x15, 0x0d, 0xe7, 0xad, ++ 0x85, 0x21, 0x23, 0x73, 0x9a, 0x32, 0x7c, 0x70, 0xad, 0x1e, 0xad, 0x70, ++ 0x9c, 0x7a, 0x40, 0x9b, 0xd3, 0xc7, 0x85, 0xc0, 0xff, 0xdf, 0x3e, 0x66, ++ 0xe3, 0x23, 0xed, 0xa1, 0x41, 0xc6, 0x20, 0x71, 0x92, 0x39, 0x54, 0x99, ++ 0x8c, 0xe5, 0xf3, 0x33, 0x7c, 0x6f, 0x76, 0x5c, 0x0a, 0xe7, 0xda, 0x4d, ++ 0x5d, 0xcc, 0xc6, 0x3e, 0xcb, 0xea, 0x35, 0xbc, 0x33, 0x6b, 0xe7, 0x9c, ++ 0xb3, 0xf4, 0xa9, 0xeb, 0x9c, 0xcc, 0xf5, 0xcf, 0x99, 0x4d, 0x7f, 0xe6, ++ 0x44, 0xd8, 0x9b, 0xcb, 0x98, 0x2c, 0x6b, 0x56, 0x4f, 0xd4, 0x4f, 0x5b, ++ 0x53, 0xcc, 0x9f, 0x9a, 0xd2, 0xf2, 0x5c, 0xca, 0x41, 0xfb, 0xb6, 0xf0, ++ 0x88, 0x29, 0xf7, 0x05, 0x9f, 0xa2, 0x11, 0x07, 0x6d, 0xc5, 0x6d, 0xe8, ++ 0x6d, 0x7f, 0xa7, 0x14, 0xd3, 0x95, 0x9d, 0xb5, 0x53, 0xd0, 0x83, 0x5b, ++ 0x15, 0xfa, 0x61, 0x69, 0x8d, 0x29, 0x53, 0xf0, 0xf3, 0x98, 0xdf, 0xf4, ++ 0xcf, 0xc4, 0xb3, 0x73, 0x9c, 0xbb, 0x77, 0x63, 0x46, 0xc7, 0x53, 0x33, ++ 0xe7, 0xef, 0xa4, 0xe6, 0xae, 0xab, 0x8b, 0x3d, 0xba, 0xdd, 0x3b, 0x62, ++ 0xb8, 0xe0, 0x68, 0xc0, 0x85, 0x43, 0x66, 0x0e, 0x56, 0xb4, 0x8a, 0x9d, ++ 0xba, 0xdd, 0xbb, 0x62, 0x98, 0x76, 0xf2, 0xda, 0x39, 0x73, 0x01, 0x9e, ++ 0xd0, 0xec, 0x75, 0x4f, 0x89, 0x2d, 0x11, 0x8d, 0x71, 0x39, 0x3f, 0xe4, ++ 0x71, 0xe7, 0x4f, 0x42, 0xcb, 0x23, 0x77, 0x72, 0x87, 0xd0, 0xec, 0x88, ++ 0xeb, 0xbe, 0x16, 0x47, 0x3d, 0x56, 0xa7, 0x7d, 0xe4, 0xdf, 0x6f, 0x91, ++ 0xaf, 0xda, 0xcf, 0x07, 0x69, 0x93, 0x4e, 0x56, 0x18, 0x9a, 0xaf, 0x86, ++ 0x24, 0x27, 0x2c, 0xc6, 0x3d, 0xda, 0xb6, 0xcf, 0xab, 0xa1, 0x41, 0xdc, ++ 0xda, 0xe0, 0x6e, 0x2e, 0x99, 0x9c, 0xd5, 0x09, 0x22, 0x85, 0x21, 0x68, ++ 0xc5, 0x06, 0xd4, 0xa2, 0x90, 0xe8, 0xc6, 0xd7, 0x1c, 0x9f, 0x10, 0x59, ++ 0x35, 0xf7, 0xc0, 0x44, 0x71, 0x1e, 0xf2, 0xc3, 0xc4, 0xb4, 0x9f, 0x7a, ++ 0xff, 0x6b, 0xf5, 0xce, 0xba, 0x05, 0x23, 0x5d, 0x86, 0xfc, 0xb7, 0x6d, ++ 0x8b, 0x79, 0x4c, 0xfb, 0x7a, 0xb7, 0xdf, 0xb2, 0x18, 0x5f, 0xbd, 0x50, ++ 0x16, 0x70, 0x3c, 0xf4, 0x35, 0xc6, 0xb3, 0xf6, 0xd4, 0x1f, 0xac, 0x2f, ++ 0x38, 0x6d, 0xee, 0x40, 0xbe, 0x35, 0xbd, 0xfe, 0x2d, 0xe3, 0xf7, 0x96, ++ 0xf0, 0x18, 0x27, 0x7d, 0x3a, 0xc7, 0x58, 0x88, 0x3d, 0xa6, 0xb3, 0x65, ++ 0xa5, 0xa2, 0xa0, 0xcf, 0xa8, 0xd1, 0xf2, 0x18, 0xdf, 0x7a, 0xe9, 0xd7, ++ 0x11, 0x8f, 0x51, 0x7b, 0x08, 0x2c, 0x97, 0xda, 0xbc, 0xd9, 0x15, 0xba, ++ 0xef, 0xae, 0xc3, 0x0d, 0x82, 0x05, 0xc9, 0xc8, 0x53, 0x46, 0x1b, 0x79, ++ 0xdb, 0x37, 0xc8, 0xef, 0xb2, 0xfd, 0x64, 0xb0, 0xf0, 0x13, 0xfa, 0xd9, ++ 0xbc, 0x39, 0x37, 0x24, 0xfc, 0x2d, 0x12, 0x39, 0x62, 0xb4, 0x30, 0x77, ++ 0xbb, 0xef, 0xae, 0x73, 0x0d, 0x07, 0xf8, 0x3f, 0x5b, 0x27, 0x89, 0x92, ++ 0x4f, 0xac, 0x53, 0x10, 0x92, 0x3e, 0xa6, 0xd7, 0x3f, 0x65, 0xdc, 0x77, ++ 0x57, 0xc7, 0xf2, 0xc3, 0xd8, 0x91, 0xee, 0xfc, 0x4f, 0xfb, 0x29, 0x0a, ++ 0xc9, 0x3a, 0xaa, 0xef, 0xae, 0x9b, 0xfc, 0xf7, 0xdd, 0x95, 0x5a, 0x3e, ++ 0xc8, 0x3e, 0xee, 0x64, 0xae, 0x9a, 0xad, 0x13, 0x56, 0x1c, 0x9f, 0xa8, ++ 0x83, 0xbc, 0x90, 0x79, 0xd7, 0x62, 0xff, 0xef, 0xad, 0x9a, 0x81, 0x1c, ++ 0x5b, 0x07, 0x2e, 0xea, 0xe0, 0xeb, 0xa6, 0x33, 0xe3, 0x77, 0xd8, 0x3a, ++ 0xe8, 0xf2, 0x52, 0x07, 0x71, 0xea, 0x20, 0x53, 0x6e, 0x04, 0xdf, 0xa3, ++ 0x0e, 0x6a, 0x26, 0x36, 0x6f, 0xce, 0x0b, 0xc1, 0xe9, 0x30, 0x5e, 0x73, ++ 0x30, 0x9f, 0x52, 0x5d, 0xc6, 0x66, 0xea, 0xed, 0xbe, 0xbb, 0x16, 0x2d, ++ 0xb7, 0x75, 0x7e, 0xa7, 0xdb, 0xbf, 0x9d, 0x76, 0xd3, 0x4c, 0x5b, 0xdf, ++ 0xc6, 0xa3, 0x95, 0x47, 0x1f, 0x8f, 0x18, 0xf6, 0xa4, 0xdb, 0xa9, 0xab, ++ 0x35, 0x1c, 0xc7, 0x3a, 0xca, 0xd5, 0xc5, 0xdf, 0x11, 0xfe, 0x8e, 0xf2, ++ 0xb7, 0xcc, 0x8f, 0x7a, 0x49, 0xb6, 0xc8, 0x25, 0xd9, 0x1c, 0x94, 0xa7, ++ 0xd0, 0x5e, 0xe3, 0xcc, 0x0f, 0x75, 0xde, 0x79, 0x93, 0xbf, 0x83, 0x6d, ++ 0x7c, 0x37, 0x4f, 0xf6, 0x23, 0xb8, 0x8c, 0xa8, 0xd7, 0x09, 0x91, 0x4f, ++ 0x6f, 0xeb, 0x40, 0x86, 0xd8, 0xfb, 0xbb, 0x2c, 0xf6, 0x52, 0xb6, 0x62, ++ 0xce, 0xcf, 0x0b, 0xcb, 0x93, 0x57, 0x14, 0x1a, 0xf0, 0xba, 0x8d, 0x7e, ++ 0x0c, 0xa4, 0x47, 0xa8, 0x03, 0xb1, 0x93, 0xaf, 0x51, 0x7f, 0xdd, 0xac, ++ 0x73, 0x8a, 0xb1, 0x4c, 0x0f, 0xd3, 0x67, 0x69, 0xb3, 0x7a, 0x90, 0x07, ++ 0xed, 0xe5, 0x79, 0xb6, 0x9b, 0xa4, 0x4c, 0x39, 0xb4, 0x5f, 0x05, 0xf2, ++ 0xec, 0xf7, 0x09, 0xb6, 0x7f, 0xc4, 0xf8, 0x4d, 0xc1, 0x29, 0x8e, 0x3d, ++ 0xec, 0xd9, 0x8c, 0xb1, 0x7a, 0xd1, 0x95, 0x8f, 0xba, 0xd2, 0xbd, 0xbe, ++ 0x39, 0xba, 0xbc, 0x2c, 0xef, 0x95, 0xe4, 0x21, 0x96, 0xf5, 0xba, 0xd1, ++ 0xb4, 0x98, 0xc9, 0x24, 0x92, 0x76, 0x8e, 0x65, 0x59, 0x39, 0xf6, 0xbe, ++ 0x36, 0xdf, 0x5d, 0x1b, 0x0d, 0x91, 0xb7, 0xae, 0x75, 0x07, 0x8d, 0x73, ++ 0x73, 0x8a, 0xfe, 0xec, 0xff, 0x9d, 0x15, 0x2e, 0x97, 0x7a, 0x0b, 0x71, ++ 0x96, 0xb1, 0x37, 0xac, 0x45, 0x3b, 0xdc, 0x92, 0x17, 0x18, 0xce, 0xe0, ++ 0x1a, 0x44, 0xdb, 0xdc, 0x94, 0xeb, 0x6e, 0x72, 0xd6, 0x73, 0x46, 0xd6, ++ 0x8f, 0x8f, 0xa6, 0xf4, 0xf0, 0x23, 0x3c, 0x27, 0x77, 0x26, 0x07, 0x9b, ++ 0x8d, 0x53, 0xb5, 0xe4, 0xcb, 0x85, 0x70, 0x32, 0xf7, 0x6a, 0x76, 0xf4, ++ 0xd4, 0xba, 0x40, 0x5f, 0xcc, 0x97, 0x71, 0x45, 0x39, 0x46, 0xc1, 0x6d, ++ 0xb7, 0xd6, 0x6e, 0x63, 0x79, 0x74, 0xb1, 0x0b, 0x85, 0xda, 0xa6, 0xd4, ++ 0x6c, 0x8c, 0x2b, 0xd4, 0x36, 0xc4, 0x04, 0x17, 0xe4, 0x79, 0x6d, 0x90, ++ 0x7a, 0x16, 0x7c, 0xf8, 0xbd, 0xbd, 0x07, 0x8e, 0x18, 0x51, 0xec, 0x34, ++ 0xb2, 0xed, 0x6a, 0x6c, 0xb7, 0xd5, 0xa1, 0xe1, 0xb2, 0x8f, 0xeb, 0x5a, ++ 0xab, 0x43, 0xf6, 0xe7, 0x11, 0xbd, 0x52, 0x33, 0xf5, 0xb2, 0x38, 0xd7, ++ 0xe8, 0xb2, 0x71, 0x8e, 0x6d, 0x30, 0x5f, 0x59, 0x11, 0xfb, 0x78, 0xff, ++ 0xd2, 0x9f, 0xf4, 0xdb, 0x53, 0xaa, 0x42, 0xf6, 0x07, 0xc9, 0xb3, 0xb4, ++ 0x0e, 0xe6, 0x79, 0x73, 0xf7, 0x08, 0xe9, 0x27, 0xd8, 0xfe, 0xf1, 0x28, ++ 0xe7, 0x73, 0x81, 0x21, 0xfb, 0x87, 0xe4, 0xd9, 0xdb, 0xdc, 0xfd, 0x42, ++ 0x22, 0xdb, 0x75, 0xf9, 0xc2, 0x65, 0x8e, 0x10, 0x27, 0xc3, 0xad, 0x52, ++ 0xdf, 0xb2, 0xfe, 0xa5, 0xa6, 0x16, 0x99, 0x79, 0x4e, 0x8c, 0x54, 0x03, ++ 0xc3, 0x71, 0xd1, 0x75, 0x64, 0xfd, 0x46, 0xe3, 0xdf, 0xad, 0x70, 0x59, ++ 0x9d, 0xd6, 0xab, 0xca, 0x3a, 0x48, 0xfb, 0x9d, 0x7d, 0x46, 0x95, 0xd6, ++ 0xa7, 0x66, 0x8e, 0x31, 0x0e, 0x1d, 0x00, 0x5a, 0xf2, 0x05, 0x2b, 0x4a, ++ 0x8d, 0x70, 0x7f, 0x29, 0xaa, 0xe1, 0xb3, 0x9f, 0x65, 0xe8, 0xd1, 0xef, ++ 0xa8, 0x46, 0xed, 0x5a, 0xe1, 0xad, 0xea, 0x07, 0x56, 0x92, 0x36, 0xf0, ++ 0xd5, 0x6a, 0x57, 0x7e, 0x16, 0xdb, 0xc3, 0x1d, 0xf3, 0x39, 0x2f, 0x6f, ++ 0x2f, 0xd5, 0x7d, 0x29, 0x45, 0x74, 0x24, 0x7c, 0x6b, 0x04, 0xbb, 0x19, ++ 0x8f, 0xff, 0xbd, 0x3a, 0x84, 0xa3, 0xfc, 0xff, 0xcb, 0xeb, 0x65, 0x6f, ++ 0x9c, 0x65, 0xd5, 0xfa, 0x6b, 0x82, 0xa5, 0x1c, 0xc3, 0xb3, 0xbc, 0xdf, ++ 0x9f, 0x7e, 0xcb, 0x3a, 0x37, 0xdf, 0x18, 0x5c, 0xc5, 0xa0, 0x38, 0x3c, ++ 0xa9, 0x6b, 0xd3, 0xea, 0x7f, 0x75, 0xaf, 0x8e, 0xbd, 0x3e, 0xb9, 0xfe, ++ 0x45, 0x7f, 0x9d, 0x16, 0x57, 0x1b, 0xf2, 0x45, 0xaf, 0xc3, 0x93, 0xaf, ++ 0xce, 0xc4, 0xf9, 0xec, 0x33, 0xd2, 0xc7, 0x2f, 0xe9, 0x47, 0x9e, 0xf7, ++ 0x2e, 0xa4, 0xcd, 0x85, 0x49, 0x23, 0xe1, 0x9e, 0xc7, 0x31, 0x7f, 0xb5, ++ 0xfa, 0x41, 0x7b, 0x9c, 0x65, 0x46, 0x05, 0xc7, 0xa8, 0x40, 0xab, 0xae, ++ 0xcc, 0xcf, 0x72, 0xc2, 0x26, 0xb2, 0xb4, 0xa4, 0xd5, 0x4c, 0x1f, 0xca, ++ 0x61, 0x9d, 0x1b, 0xcd, 0x83, 0x57, 0xf4, 0xd4, 0xeb, 0xde, 0xaf, 0xd2, ++ 0x56, 0x03, 0xd5, 0xbf, 0xb6, 0xc2, 0x9a, 0xd3, 0x7c, 0x94, 0xa3, 0xbe, ++ 0x3b, 0x26, 0x65, 0x65, 0x5e, 0x8d, 0x70, 0xb5, 0xf2, 0xae, 0x85, 0x72, ++ 0x7f, 0xb0, 0xda, 0x1e, 0x3f, 0xb0, 0x25, 0x35, 0xc2, 0x1c, 0x5b, 0xda, ++ 0x54, 0xb0, 0xca, 0xff, 0x73, 0xcb, 0x37, 0x7f, 0x04, 0xbb, 0xd2, 0x9f, ++ 0xc6, 0x7d, 0xbf, 0x41, 0xee, 0xad, 0xb7, 0x45, 0xb3, 0x7e, 0xd7, 0x02, ++ 0xf6, 0x9b, 0x6f, 0xd8, 0xf9, 0xfb, 0xfa, 0x98, 0x5f, 0xd6, 0x9a, 0xda, ++ 0xd7, 0x4f, 0xf8, 0x65, 0x4f, 0x87, 0x07, 0x99, 0x56, 0x29, 0x53, 0xa5, ++ 0x4d, 0x20, 0x43, 0x86, 0x29, 0xfb, 0x4f, 0x7e, 0x90, 0x9f, 0x5d, 0x7f, ++ 0x70, 0xc8, 0xfa, 0xb9, 0xf6, 0x06, 0x39, 0x61, 0x8b, 0x21, 0x6d, 0x28, ++ 0x58, 0xec, 0x9f, 0x87, 0xba, 0xb5, 0xaf, 0xfd, 0x2c, 0xc7, 0x9f, 0xf5, ++ 0xdb, 0x3e, 0xc3, 0xe8, 0x3c, 0x8d, 0xdf, 0x10, 0xab, 0x64, 0x7f, 0xca, ++ 0x09, 0xa9, 0xc7, 0xb6, 0xaa, 0x91, 0x22, 0xef, 0x1e, 0x33, 0x64, 0x7f, ++ 0xa5, 0x65, 0xdd, 0xe4, 0x7f, 0x93, 0x7e, 0x47, 0x79, 0xd2, 0xce, 0x99, ++ 0xba, 0x52, 0x66, 0x66, 0xef, 0x87, 0xd2, 0x74, 0x97, 0xe8, 0xe4, 0x49, ++ 0x33, 0xca, 0x6c, 0x43, 0xe2, 0x43, 0x3b, 0xe3, 0x83, 0x70, 0x7f, 0xdd, ++ 0x5c, 0xa5, 0x94, 0x30, 0xde, 0x3a, 0x7d, 0x87, 0xed, 0x75, 0x90, 0xe9, ++ 0xf5, 0x47, 0x0c, 0xe1, 0xa1, 0x92, 0x53, 0x3a, 0xf1, 0x94, 0x51, 0x8a, ++ 0x27, 0xb5, 0x2c, 0xa7, 0x23, 0x26, 0xe2, 0xa5, 0x58, 0x4d, 0x86, 0x1e, ++ 0x42, 0x6e, 0x6c, 0x74, 0x5c, 0x54, 0x7e, 0xc3, 0x7c, 0x13, 0x78, 0x21, ++ 0xd5, 0x85, 0xaf, 0xcb, 0xf3, 0x2f, 0xa5, 0xaa, 0xa5, 0xce, 0x21, 0xfd, ++ 0x75, 0x61, 0xb7, 0xbd, 0x9e, 0xdb, 0xce, 0xb6, 0x4e, 0xcd, 0xc8, 0x2a, ++ 0x98, 0xdf, 0x4e, 0xcc, 0xff, 0x7f, 0xed, 0xb9, 0x93, 0xbd, 0x0e, 0xfd, ++ 0xa6, 0x60, 0x63, 0x3e, 0x54, 0xe6, 0x25, 0x0e, 0xe3, 0x4e, 0x38, 0x4a, ++ 0x0f, 0xd3, 0xf6, 0x64, 0x9d, 0x68, 0x3d, 0x9c, 0xa5, 0x2e, 0xfa, 0xe6, ++ 0x16, 0xb8, 0x4a, 0x85, 0xd3, 0xcf, 0xf2, 0xed, 0x16, 0xde, 0x17, 0xdd, ++ 0x26, 0x23, 0xa2, 0x5b, 0xf2, 0xcf, 0xbb, 0xfa, 0x24, 0x6f, 0x34, 0x4a, ++ 0xa8, 0x23, 0xbd, 0x4d, 0xd6, 0xc3, 0x8b, 0x88, 0xad, 0x8c, 0xa3, 0xee, ++ 0x12, 0x96, 0x79, 0x8f, 0x7a, 0xaf, 0x19, 0x28, 0x20, 0xd7, 0xb7, 0xac, ++ 0x0f, 0xc8, 0xf5, 0x17, 0xfb, 0xeb, 0x32, 0x06, 0xe3, 0x1f, 0xbe, 0xa4, ++ 0xb7, 0xc8, 0xb3, 0xe5, 0x8d, 0xc6, 0x45, 0x2b, 0xb2, 0x4e, 0xca, 0xe8, ++ 0xde, 0x88, 0x32, 0xdb, 0xc7, 0x52, 0xf8, 0xe6, 0x59, 0x70, 0x85, 0x2c, ++ 0x62, 0x97, 0x6e, 0x86, 0xd1, 0x24, 0x7b, 0x84, 0x5a, 0x65, 0xfc, 0x2e, ++ 0x79, 0x4e, 0x81, 0xf0, 0x94, 0x0b, 0x46, 0xe6, 0xa8, 0xcc, 0xd9, 0x15, ++ 0x16, 0xfc, 0xcb, 0x7e, 0xc7, 0x5c, 0x4b, 0xe6, 0xa7, 0x2a, 0x53, 0xaf, ++ 0x64, 0x6a, 0xbd, 0xe4, 0xfe, 0xdf, 0x84, 0xde, 0x1a, 0xa3, 0xae, 0x9b, ++ 0x03, 0x36, 0xe6, 0x79, 0x63, 0xb0, 0xf9, 0xbe, 0x79, 0x16, 0x5f, 0x40, ++ 0x11, 0x73, 0xe3, 0xea, 0x89, 0x35, 0x28, 0x2e, 0x0d, 0x7b, 0xf3, 0x71, ++ 0x0d, 0xcf, 0xb7, 0x31, 0x8f, 0xb9, 0x0d, 0xc5, 0x6b, 0x23, 0x88, 0x25, ++ 0x24, 0x87, 0xfa, 0x4b, 0x5e, 0xeb, 0x43, 0x3c, 0xe1, 0xe2, 0x38, 0x7e, ++ 0x6a, 0x15, 0x97, 0x8b, 0x6c, 0xa6, 0xa7, 0xc0, 0x60, 0xbe, 0x6e, 0xeb, ++ 0x82, 0x58, 0x9e, 0x10, 0x2e, 0x55, 0x17, 0xde, 0x8a, 0x3f, 0xd0, 0x76, ++ 0xf5, 0xb6, 0x76, 0x25, 0x4a, 0x9b, 0x8d, 0x51, 0xe7, 0x52, 0xd6, 0xb2, ++ 0x56, 0xfb, 0xcb, 0x0a, 0x90, 0x1f, 0xe5, 0xb9, 0xe1, 0x7b, 0x13, 0xea, ++ 0x35, 0xb9, 0x38, 0x63, 0x45, 0x35, 0x2f, 0xed, 0x52, 0x5d, 0x27, 0xbc, ++ 0x6b, 0x65, 0xe0, 0x4a, 0xde, 0xd7, 0x66, 0xec, 0x34, 0x32, 0xa3, 0xcb, ++ 0x64, 0xa4, 0xcf, 0x50, 0xec, 0xeb, 0x0e, 0xfb, 0xfa, 0xf4, 0xfa, 0xec, ++ 0xf5, 0x08, 0xaf, 0x83, 0xd7, 0x07, 0xa9, 0x7b, 0xf5, 0x4a, 0xa9, 0xbf, ++ 0xd9, 0x94, 0xfa, 0xa4, 0x23, 0x46, 0x6c, 0x66, 0x3e, 0x7c, 0x77, 0x65, ++ 0xcb, 0x9a, 0x77, 0x65, 0xdb, 0x70, 0xb2, 0x8d, 0x68, 0x38, 0x1f, 0x26, ++ 0x0a, 0xfc, 0x82, 0xf3, 0x22, 0x17, 0xe7, 0x2e, 0x2d, 0x72, 0x6d, 0x63, ++ 0x5c, 0xec, 0x79, 0x26, 0x1f, 0xd1, 0xae, 0x0a, 0xdb, 0x0e, 0x23, 0x11, ++ 0xc6, 0x24, 0xdf, 0x5b, 0x4a, 0x93, 0x57, 0x96, 0x83, 0x12, 0xe4, 0xbc, ++ 0x0f, 0x98, 0xce, 0x60, 0xbd, 0xa3, 0x26, 0x93, 0x0b, 0x23, 0x72, 0x51, ++ 0xb9, 0xba, 0x40, 0xf0, 0x21, 0x96, 0x6a, 0x62, 0x86, 0x16, 0xad, 0x65, ++ 0x6e, 0x55, 0x9b, 0xa6, 0x6e, 0x37, 0x10, 0xb1, 0x4f, 0xd8, 0x7b, 0x9d, ++ 0x9c, 0x53, 0x6b, 0xd0, 0xa4, 0x3b, 0x50, 0x13, 0xac, 0x60, 0x86, 0x46, ++ 0xbb, 0x34, 0x73, 0x1d, 0xba, 0xef, 0x56, 0x7c, 0xd5, 0xae, 0x77, 0x34, ++ 0x95, 0xe9, 0xc8, 0xe7, 0x9c, 0x7e, 0x8b, 0x72, 0xec, 0xf1, 0x8b, 0x1c, ++ 0x87, 0x67, 0xe4, 0x88, 0x30, 0xe6, 0x9a, 0xda, 0xcd, 0xfe, 0xc1, 0x4b, ++ 0x7a, 0x7b, 0xc6, 0xd6, 0x5b, 0x1f, 0xcf, 0x73, 0xb1, 0x93, 0xfc, 0xf1, ++ 0x54, 0xbd, 0x67, 0xe6, 0x99, 0x80, 0xe4, 0x74, 0xf6, 0x7e, 0xba, 0x3b, ++ 0x36, 0x1a, 0x7a, 0xd0, 0x61, 0xf3, 0x7f, 0x37, 0xa2, 0x36, 0xb7, 0x76, ++ 0x40, 0xb8, 0xe3, 0x23, 0x76, 0x39, 0x17, 0x75, 0x52, 0x80, 0x6f, 0xce, ++ 0xf8, 0x4b, 0x01, 0xe3, 0xdb, 0xb7, 0xec, 0xdf, 0x49, 0xce, 0xad, 0x8b, ++ 0xbe, 0x3a, 0x1b, 0xa3, 0x64, 0x5d, 0x31, 0x69, 0xfb, 0x7e, 0x12, 0xef, ++ 0xda, 0xff, 0x33, 0xd9, 0xbc, 0x0c, 0x7d, 0xf4, 0x09, 0x07, 0xdb, 0xe8, ++ 0xb5, 0xf7, 0xb0, 0xca, 0x1a, 0xc3, 0xf5, 0xd8, 0xc9, 0x51, 0xb9, 0x8d, ++ 0x0e, 0xf4, 0x6b, 0x62, 0x13, 0xdd, 0x88, 0x6b, 0xa6, 0x27, 0x5d, 0x3f, ++ 0x37, 0xa7, 0x32, 0x71, 0xa8, 0xfe, 0xf7, 0x8c, 0xe5, 0x72, 0xed, 0x8c, ++ 0x45, 0x9f, 0x0b, 0xd0, 0x83, 0x3b, 0x72, 0x6c, 0xfd, 0x26, 0x23, 0xf6, ++ 0x7e, 0x2f, 0xca, 0xfc, 0x4c, 0x4c, 0xe2, 0xe8, 0x42, 0xa4, 0x4c, 0x91, ++ 0xcd, 0xd9, 0xba, 0x97, 0x73, 0xd2, 0x97, 0xf0, 0x87, 0x97, 0xf0, 0xde, ++ 0x14, 0x63, 0x59, 0x2f, 0xf5, 0x19, 0x69, 0x15, 0x1e, 0xb7, 0x0d, 0x07, ++ 0x68, 0x63, 0x93, 0xa6, 0x65, 0x1d, 0x25, 0x46, 0x94, 0xd4, 0xa8, 0xc8, ++ 0x94, 0x6f, 0x43, 0x82, 0xb1, 0xe9, 0xa8, 0xd1, 0xf4, 0x85, 0x1c, 0x44, ++ 0x7d, 0x8c, 0xe1, 0xde, 0x5d, 0x1c, 0xcd, 0x03, 0x9c, 0xaf, 0x53, 0xa6, ++ 0xf0, 0x4b, 0xe7, 0xc5, 0x95, 0x30, 0x82, 0x8d, 0x8e, 0x9f, 0x5a, 0xd3, ++ 0x22, 0x7b, 0xa2, 0xe7, 0x1f, 0x29, 0x43, 0xa7, 0x38, 0x6f, 0x09, 0xe7, ++ 0xf8, 0x3d, 0xbf, 0xde, 0xf2, 0x12, 0xfb, 0xa9, 0x1b, 0x68, 0xea, 0x10, ++ 0x19, 0x8e, 0x04, 0x9c, 0x91, 0xa3, 0xf0, 0xb7, 0x6e, 0x53, 0x66, 0x73, ++ 0x08, 0x60, 0xc9, 0x84, 0x89, 0xf1, 0xfa, 0x67, 0xc9, 0x77, 0xa4, 0x7e, ++ 0x2e, 0xbe, 0x6f, 0x3e, 0x6d, 0x55, 0x5d, 0xf1, 0xa2, 0x75, 0xcc, 0x50, ++ 0xb7, 0x52, 0xdb, 0x91, 0x22, 0xc8, 0x5a, 0x68, 0x24, 0x72, 0x8f, 0x5f, ++ 0x37, 0xf7, 0xb2, 0xad, 0x27, 0x62, 0xa7, 0x6a, 0xdd, 0x6c, 0xeb, 0x9b, ++ 0xa6, 0xe4, 0x10, 0xce, 0x96, 0x16, 0xce, 0x6d, 0x4f, 0xc2, 0xef, 0x95, ++ 0xf5, 0x5e, 0xc9, 0xf3, 0xd6, 0xc7, 0x64, 0x2f, 0xfa, 0x61, 0x8e, 0x27, ++ 0xdc, 0xe9, 0x42, 0xd3, 0x03, 0xc5, 0xb4, 0x9f, 0x12, 0xcc, 0xda, 0xba, ++ 0xee, 0x25, 0xde, 0xe1, 0x1e, 0x96, 0xf9, 0x99, 0x7f, 0x21, 0x5e, 0x08, ++ 0x34, 0xad, 0x5d, 0x08, 0x67, 0xe4, 0x98, 0xe2, 0x6f, 0xd9, 0xa6, 0x44, ++ 0x35, 0xb1, 0xc5, 0xbb, 0x53, 0x7a, 0x6d, 0x33, 0x04, 0xbb, 0x23, 0xd4, ++ 0xc7, 0x42, 0x7c, 0xb0, 0x4c, 0xe4, 0x72, 0x06, 0x6b, 0x1d, 0xfe, 0xae, ++ 0xa7, 0x65, 0x9b, 0x65, 0x8d, 0xc8, 0x0e, 0xa4, 0xed, 0xfd, 0xe4, 0x11, ++ 0xc4, 0xd3, 0x67, 0xde, 0x3b, 0x62, 0xc0, 0x79, 0xa2, 0xfe, 0xeb, 0x16, ++ 0xe6, 0x49, 0xd9, 0x26, 0x99, 0x87, 0x36, 0x99, 0x87, 0x7c, 0xfa, 0xd3, ++ 0x4d, 0x94, 0x7b, 0xab, 0x2d, 0xf7, 0x42, 0x8c, 0x99, 0xb2, 0xbe, 0xe6, ++ 0xd4, 0xee, 0xc6, 0x20, 0xb1, 0xd3, 0x7f, 0xb1, 0x87, 0xfd, 0xfc, 0x8c, ++ 0x32, 0xd7, 0x50, 0xef, 0xd3, 0xad, 0xc2, 0x6f, 0xfb, 0x30, 0x60, 0xef, ++ 0x53, 0x96, 0x3e, 0x14, 0xa4, 0xfc, 0xd2, 0x47, 0x1f, 0xf9, 0x5e, 0x8f, ++ 0x35, 0x5d, 0x2e, 0xd7, 0x93, 0xd8, 0x99, 0x08, 0x6b, 0xf4, 0x07, 0xea, ++ 0x1d, 0xfa, 0x42, 0xe8, 0x53, 0x6f, 0x38, 0xc2, 0xf4, 0x01, 0xd3, 0x73, ++ 0x91, 0xd8, 0x70, 0x02, 0x5d, 0x16, 0x4a, 0x6d, 0x7b, 0xf8, 0xe5, 0x61, ++ 0xa3, 0x48, 0xd6, 0xe8, 0x6b, 0x33, 0xd4, 0x81, 0xca, 0x39, 0x11, 0x1d, ++ 0x14, 0xd1, 0x67, 0x27, 0xfc, 0xba, 0xef, 0x05, 0xca, 0xb3, 0x97, 0xf2, ++ 0xac, 0xc9, 0xce, 0xa1, 0x77, 0xa7, 0x22, 0x3e, 0xed, 0x6f, 0xdd, 0xc8, ++ 0xeb, 0x7b, 0x28, 0x8f, 0x7f, 0x40, 0x41, 0x92, 0x68, 0xd6, 0x47, 0x3e, ++ 0x7b, 0x60, 0x8e, 0x3c, 0x6e, 0x7b, 0xce, 0xa2, 0xe4, 0x02, 0xb9, 0x38, ++ 0x62, 0x0a, 0x7e, 0x6b, 0x18, 0xa3, 0x9d, 0x1e, 0xe2, 0x8c, 0x84, 0x3d, ++ 0x2a, 0x72, 0x0d, 0xc1, 0x80, 0x72, 0x5e, 0x73, 0x71, 0x6e, 0x4a, 0x70, ++ 0x4c, 0x4b, 0x32, 0x4e, 0xce, 0x72, 0xbb, 0x3f, 0x58, 0xe3, 0x1e, 0xe1, ++ 0x67, 0xb2, 0xfe, 0x26, 0xcf, 0x3b, 0x1e, 0x2d, 0xc8, 0xee, 0xcb, 0x94, ++ 0x7d, 0x13, 0xd9, 0xeb, 0xcf, 0x68, 0xc2, 0x91, 0x67, 0xcb, 0xff, 0xab, ++ 0xf5, 0xa4, 0x5d, 0x5e, 0xca, 0xb9, 0x6c, 0x2e, 0x9f, 0x6f, 0x97, 0xfb, ++ 0x57, 0xeb, 0x59, 0xcd, 0x39, 0xa7, 0xdc, 0xec, 0xde, 0xbd, 0x53, 0x0f, ++ 0xba, 0x88, 0x79, 0x8e, 0xea, 0x46, 0x3c, 0x69, 0x9c, 0xa9, 0xda, 0x50, ++ 0xdf, 0xcd, 0x38, 0x36, 0xcb, 0xb5, 0x2a, 0xe9, 0x57, 0x16, 0x86, 0xcc, ++ 0x53, 0x43, 0x39, 0xe8, 0x21, 0x77, 0x14, 0x2e, 0x20, 0x1c, 0x55, 0xd6, ++ 0x07, 0xff, 0x3a, 0xff, 0x72, 0xce, 0xab, 0xd7, 0xfa, 0xd4, 0x88, 0xcd, ++ 0x0d, 0xc3, 0xaa, 0xe0, 0x6e, 0xa5, 0x3d, 0xf6, 0xcb, 0xf1, 0x5f, 0x62, ++ 0xc5, 0xdc, 0xf5, 0xbe, 0x6e, 0x1c, 0x32, 0x66, 0x39, 0xcb, 0xa9, 0xaf, ++ 0xab, 0xc4, 0xc9, 0x61, 0xb3, 0x51, 0x62, 0xb3, 0x8f, 0xf5, 0x6b, 0x23, ++ 0xea, 0x5c, 0x6e, 0xf3, 0x50, 0x01, 0x8a, 0x7b, 0x76, 0x3b, 0x20, 0xfb, ++ 0x86, 0x65, 0xaf, 0xb7, 0xf4, 0x95, 0x37, 0xb3, 0x7e, 0xf5, 0x49, 0x5c, ++ 0x63, 0xb6, 0x2f, 0xe1, 0x1b, 0x55, 0xb3, 0x32, 0xd6, 0x86, 0x6d, 0x39, ++ 0xff, 0xcd, 0x5a, 0xab, 0x65, 0x2a, 0x34, 0x7c, 0x54, 0xf6, 0xf0, 0x8c, ++ 0xec, 0x91, 0x4f, 0x5c, 0xb7, 0x93, 0x7e, 0xe6, 0xb6, 0x39, 0xbb, 0x67, ++ 0x55, 0xd6, 0x74, 0xe5, 0x9e, 0x82, 0x1e, 0xe2, 0x50, 0x58, 0x6b, 0x62, ++ 0x9c, 0xd7, 0xbd, 0x9b, 0x38, 0x1f, 0x51, 0x8f, 0xec, 0x87, 0x9d, 0x8d, ++ 0x91, 0xb9, 0xc8, 0xae, 0xad, 0x02, 0x87, 0x66, 0xd6, 0x53, 0x69, 0xf7, ++ 0xe8, 0x49, 0xfd, 0xce, 0xca, 0x78, 0x9c, 0x8c, 0x85, 0x97, 0xf7, 0xed, ++ 0x27, 0xa9, 0xd7, 0x31, 0xde, 0xdb, 0x79, 0x69, 0xdd, 0x45, 0xd6, 0x9e, ++ 0x24, 0xf6, 0xfe, 0xd6, 0xda, 0xf0, 0x91, 0xb2, 0x73, 0xf7, 0xcc, 0x96, ++ 0x47, 0x64, 0x1f, 0xdb, 0xf8, 0xcc, 0xba, 0x7e, 0xf3, 0x1f, 0xef, 0x63, ++ 0xa3, 0x2d, 0x21, 0xbc, 0x93, 0xdc, 0x2e, 0x8a, 0x3e, 0x8c, 0xc7, 0xea, ++ 0xb4, 0x5d, 0xd0, 0x64, 0x3d, 0x9b, 0x7f, 0x7d, 0x38, 0x16, 0x43, 0x38, ++ 0xe7, 0xaa, 0x12, 0xf2, 0x2d, 0x84, 0x1d, 0xb2, 0xb7, 0x28, 0x56, 0xd7, ++ 0xb2, 0x87, 0x63, 0xf2, 0xad, 0xed, 0xc3, 0x58, 0xac, 0xe9, 0x2f, 0x19, ++ 0x47, 0x7c, 0x05, 0x59, 0xae, 0x73, 0xc7, 0x11, 0xe2, 0xc0, 0x8e, 0x99, ++ 0xb5, 0xb1, 0x0d, 0xb1, 0x5f, 0x53, 0x7e, 0x5b, 0x48, 0xd6, 0xfb, 0xb4, ++ 0x72, 0x67, 0xd0, 0x9b, 0x38, 0x83, 0xcd, 0x83, 0x8a, 0xd8, 0x17, 0x36, ++ 0x25, 0x45, 0x9e, 0x33, 0x68, 0x1f, 0xfc, 0x31, 0x0e, 0x0d, 0x5e, 0x81, ++ 0x66, 0x5b, 0x37, 0x5d, 0xd8, 0xb6, 0xef, 0x24, 0xf6, 0x26, 0x2c, 0xec, ++ 0x09, 0x14, 0x62, 0xeb, 0x41, 0x05, 0xab, 0xfd, 0x4f, 0x60, 0xd7, 0x3e, ++ 0x0b, 0x8b, 0x02, 0xdd, 0x68, 0x31, 0x0b, 0x90, 0x5b, 0x5a, 0xd3, 0xa1, ++ 0xb2, 0xdc, 0x86, 0xb1, 0x2e, 0xe5, 0x16, 0x8e, 0x3b, 0xe3, 0x3a, 0x4e, ++ 0x2c, 0x50, 0xe1, 0x35, 0x64, 0xbd, 0x34, 0xac, 0xdc, 0x91, 0x6e, 0x56, ++ 0xda, 0xc6, 0x6c, 0x3e, 0xa5, 0xdc, 0x9a, 0x36, 0x8b, 0x24, 0xa6, 0x1f, ++ 0x0a, 0x9c, 0x41, 0x32, 0x59, 0x5d, 0x94, 0xf5, 0x97, 0xd9, 0x75, 0xe6, ++ 0x13, 0x18, 0x4e, 0xcc, 0x5d, 0x63, 0x16, 0x5b, 0x7b, 0x0c, 0xfb, 0xc8, ++ 0xc5, 0xef, 0x88, 0x47, 0x99, 0xeb, 0xbc, 0x67, 0x15, 0x87, 0x88, 0xd5, ++ 0x93, 0x06, 0xda, 0xe2, 0xf9, 0x88, 0x1c, 0xb2, 0xac, 0x17, 0x96, 0x3b, ++ 0xd1, 0x35, 0x59, 0x8f, 0xb5, 0xc3, 0x0f, 0x5b, 0x05, 0x21, 0xcb, 0xda, ++ 0xba, 0xbc, 0x10, 0xf7, 0x1f, 0x2a, 0xc4, 0x57, 0xe2, 0x61, 0xb8, 0x43, ++ 0x05, 0xfc, 0xed, 0x8f, 0x5c, 0x50, 0x8c, 0x96, 0x01, 0xc5, 0x08, 0x2e, ++ 0x51, 0xfc, 0xe6, 0x79, 0x14, 0x62, 0xf3, 0xa4, 0x13, 0x37, 0xc6, 0xbd, ++ 0x88, 0x4c, 0x5a, 0xcc, 0xcb, 0x3c, 0xd8, 0xc4, 0xfa, 0x2b, 0xe2, 0x96, ++ 0xd5, 0xd3, 0xe0, 0x46, 0xe4, 0xa8, 0x71, 0x71, 0x03, 0xe7, 0xa0, 0x7b, ++ 0xd2, 0xcd, 0x3e, 0x8f, 0x63, 0x30, 0x51, 0x86, 0x5b, 0x46, 0x7d, 0xec, ++ 0xb3, 0x10, 0x6b, 0xe3, 0x56, 0xe3, 0xab, 0x81, 0xe8, 0x03, 0x5e, 0x18, ++ 0xb8, 0x7f, 0xd2, 0x83, 0x2f, 0xc6, 0x75, 0xb6, 0xad, 0xe0, 0xb9, 0x40, ++ 0x2d, 0xee, 0x9d, 0xf4, 0xe2, 0xa6, 0xf8, 0xa9, 0x2f, 0x14, 0x22, 0x7a, ++ 0x73, 0x01, 0xea, 0xb1, 0x75, 0xb2, 0x12, 0x2b, 0xe3, 0xb2, 0xc6, 0x56, ++ 0x89, 0x2d, 0x47, 0x4d, 0xf6, 0xa9, 0xe2, 0x46, 0xb6, 0xd3, 0x1c, 0x5f, ++ 0x80, 0x4d, 0x47, 0x1b, 0xd0, 0x3e, 0xb9, 0x0c, 0x2b, 0x86, 0x9d, 0x8c, ++ 0xff, 0x2e, 0x84, 0xc9, 0xdd, 0x56, 0x0e, 0xcb, 0x5c, 0x7c, 0x0d, 0xdd, ++ 0x31, 0x93, 0x7d, 0xcb, 0xf9, 0x49, 0xb1, 0x0d, 0x1c, 0x4d, 0x2e, 0x43, ++ 0xf3, 0xb0, 0x4a, 0x3b, 0xce, 0x65, 0x3e, 0xa5, 0xe0, 0x16, 0x5e, 0xdf, ++ 0x95, 0x90, 0x3d, 0x1e, 0xc0, 0xcf, 0x07, 0xb3, 0x31, 0xef, 0x7c, 0x32, ++ 0x7b, 0x7d, 0x20, 0xf1, 0x38, 0x73, 0xcf, 0x9f, 0x59, 0x82, 0x2b, 0x93, ++ 0x07, 0x4f, 0x92, 0x4b, 0x15, 0x61, 0xcd, 0x50, 0x37, 0xf6, 0x06, 0x8a, ++ 0x70, 0x33, 0xcf, 0x77, 0xf2, 0x7c, 0x6a, 0xd0, 0xa0, 0x4c, 0x45, 0x78, ++ 0x3a, 0x79, 0x12, 0x43, 0xf4, 0xa3, 0x4d, 0xf1, 0x22, 0x54, 0x0d, 0x2b, ++ 0x8c, 0xbb, 0xe1, 0x0f, 0x54, 0x18, 0x53, 0xed, 0xf0, 0x67, 0x1a, 0x1d, ++ 0x45, 0x08, 0x1e, 0x3a, 0x89, 0x7e, 0x8e, 0xbd, 0x75, 0xf4, 0x0c, 0xfb, ++ 0x53, 0xa1, 0x1d, 0x11, 0x9d, 0x9d, 0xc4, 0x3b, 0x83, 0x0e, 0xa4, 0xcd, ++ 0x2a, 0x62, 0xaf, 0x03, 0xcf, 0x07, 0x74, 0x2d, 0x45, 0xae, 0xfa, 0x2d, ++ 0x66, 0x2b, 0x91, 0xf2, 0x06, 0x34, 0x1b, 0x26, 0x8f, 0x93, 0xf8, 0xd7, ++ 0x41, 0x23, 0xfa, 0x6d, 0xd9, 0xeb, 0xb0, 0x54, 0xc5, 0x34, 0xf3, 0xe7, ++ 0x5e, 0x43, 0xec, 0x3b, 0x25, 0xbc, 0x4b, 0xd6, 0x90, 0xe1, 0x98, 0x60, ++ 0x8c, 0x3c, 0xd8, 0x88, 0x96, 0xe1, 0x14, 0xdb, 0x56, 0x28, 0x7f, 0x8a, ++ 0xb2, 0x34, 0x72, 0xcc, 0x4e, 0xea, 0x47, 0x45, 0xf5, 0xd1, 0x10, 0x36, ++ 0xed, 0xff, 0x03, 0xfd, 0xde, 0xb2, 0x8e, 0x9b, 0xd1, 0x79, 0x2a, 0xfc, ++ 0x3e, 0x12, 0xd7, 0x26, 0x47, 0xc8, 0x7f, 0xb1, 0x97, 0xed, 0x36, 0x4e, ++ 0xa6, 0xa8, 0x9b, 0x20, 0xe7, 0xc7, 0x8b, 0xef, 0xa7, 0x1a, 0x68, 0x0b, ++ 0x95, 0x38, 0x91, 0x2a, 0x44, 0x92, 0xc4, 0x24, 0x99, 0xf2, 0x20, 0x79, ++ 0x78, 0x3e, 0x0f, 0x1f, 0x8f, 0x45, 0x3c, 0x0c, 0xfb, 0xda, 0x86, 0xb8, ++ 0x62, 0xeb, 0x4f, 0xd6, 0xf2, 0x3e, 0x29, 0x07, 0x3a, 0x94, 0xfa, 0x6c, ++ 0x91, 0x3c, 0x5f, 0xfe, 0x61, 0xcd, 0x19, 0xea, 0x49, 0xf6, 0x97, 0xd6, ++ 0xd3, 0x0e, 0xff, 0xa3, 0xf7, 0x62, 0xc4, 0x36, 0xa7, 0x71, 0x7a, 0xe4, ++ 0x2c, 0x4e, 0x8d, 0xac, 0xc4, 0x0a, 0x4d, 0xd6, 0x3b, 0x6a, 0x8b, 0x91, ++ 0x5f, 0x8c, 0xf9, 0xa1, 0x15, 0xd8, 0xad, 0xb1, 0x6e, 0xe2, 0x38, 0xe3, ++ 0x8c, 0xf8, 0xdc, 0x9d, 0x38, 0x12, 0x8b, 0x5a, 0x1e, 0x43, 0x8f, 0x9c, ++ 0x60, 0xae, 0x31, 0xa2, 0xd4, 0xe3, 0x8b, 0xe9, 0xb3, 0x78, 0x76, 0x44, ++ 0xe6, 0x45, 0x6f, 0xf9, 0x5b, 0xc5, 0xea, 0x6e, 0x0e, 0xe8, 0xe1, 0x6b, ++ 0x14, 0x66, 0x75, 0xd0, 0x8f, 0x31, 0x69, 0xc2, 0xf8, 0xa8, 0xbd, 0xff, ++ 0x10, 0x16, 0x73, 0xf6, 0xdf, 0x98, 0xd1, 0x8a, 0x72, 0xc6, 0xc4, 0xd7, ++ 0x1d, 0x7a, 0x7f, 0x85, 0xa3, 0x1b, 0xcb, 0x96, 0xea, 0x5d, 0x7f, 0xab, ++ 0x1a, 0xd1, 0x06, 0xb5, 0x1e, 0xad, 0x69, 0xfd, 0xc0, 0xfb, 0x9c, 0xcb, ++ 0xfb, 0xa8, 0xb7, 0x27, 0x03, 0x57, 0xcf, 0xec, 0xb9, 0x38, 0x6b, 0xcb, ++ 0xf5, 0x33, 0x1e, 0x3f, 0x19, 0x41, 0x94, 0xf9, 0x49, 0xf7, 0x07, 0xcb, ++ 0x14, 0x04, 0x6b, 0xac, 0xee, 0xd2, 0x65, 0x46, 0xb4, 0x5d, 0xf5, 0x77, ++ 0x95, 0xaa, 0x67, 0xf1, 0xd2, 0xe1, 0xb3, 0x78, 0x71, 0x04, 0xee, 0xb2, ++ 0x50, 0x04, 0x7f, 0x1e, 0xb7, 0xba, 0x5f, 0x0e, 0xfc, 0x13, 0x86, 0xed, ++ 0x3c, 0x5b, 0xc6, 0x2f, 0xeb, 0x2d, 0xd3, 0x76, 0x1b, 0x4f, 0x8f, 0x94, ++ 0xc0, 0xb2, 0xc7, 0x73, 0x06, 0x4f, 0x0c, 0xfe, 0x88, 0xf6, 0x23, 0xf1, ++ 0x80, 0x7e, 0x13, 0xa8, 0x0b, 0x36, 0xab, 0x4f, 0x90, 0xe3, 0x10, 0x0f, ++ 0xaa, 0x7f, 0x8c, 0x17, 0x88, 0x21, 0x37, 0x55, 0x5b, 0x48, 0x05, 0xf4, ++ 0xb6, 0x18, 0xfe, 0xd1, 0xda, 0x5a, 0x2e, 0xe3, 0x97, 0x7a, 0x9f, 0x96, ++ 0x47, 0xeb, 0x8c, 0xa6, 0xb3, 0x7b, 0x5c, 0x35, 0xdc, 0x13, 0xcf, 0x74, ++ 0x96, 0x91, 0x6b, 0x6f, 0x8b, 0x87, 0x87, 0xca, 0xa0, 0x77, 0xdc, 0xa2, ++ 0xea, 0x2d, 0xf7, 0x3a, 0xaa, 0xb4, 0x6d, 0x4a, 0x3f, 0x96, 0xf8, 0x25, ++ 0xbe, 0x6a, 0xd8, 0xc0, 0xb9, 0xdf, 0x93, 0xee, 0x87, 0x71, 0x30, 0x84, ++ 0x8d, 0xfb, 0x4d, 0xb4, 0xc7, 0xc5, 0x76, 0xb2, 0xb6, 0xd2, 0x69, 0x46, ++ 0x57, 0xd0, 0x56, 0x2e, 0x32, 0xcd, 0x6c, 0x22, 0xee, 0x4e, 0xbd, 0xe5, ++ 0x70, 0xe2, 0x3a, 0xfa, 0x7a, 0x17, 0xcb, 0xec, 0xa1, 0x2f, 0xdd, 0x1f, ++ 0x77, 0x73, 0xfe, 0x2b, 0xd1, 0x36, 0xe1, 0xc5, 0xda, 0x89, 0x42, 0x84, ++ 0x27, 0x88, 0xb5, 0x13, 0xf9, 0xd8, 0x34, 0x6c, 0xe1, 0xa8, 0xe9, 0xc1, ++ 0xca, 0x23, 0x6e, 0x74, 0x8e, 0x16, 0x32, 0x67, 0x9a, 0x8f, 0xd6, 0x23, ++ 0xf9, 0xf8, 0x0a, 0xaf, 0xbf, 0x1b, 0xf0, 0xe1, 0x16, 0x5e, 0xbf, 0x77, ++ 0xd4, 0x85, 0x12, 0x63, 0x11, 0xbe, 0xc8, 0x00, 0x11, 0x9e, 0x28, 0xc0, ++ 0x36, 0xde, 0xdb, 0x4b, 0xbb, 0xbf, 0xf9, 0x08, 0x3b, 0x3b, 0x68, 0xe2, ++ 0x6e, 0xf6, 0xd1, 0xc7, 0x39, 0x7f, 0x98, 0xb6, 0xb4, 0x3b, 0x25, 0x1c, ++ 0x7b, 0x1d, 0x36, 0xc6, 0xf4, 0x70, 0x37, 0xb9, 0xa4, 0x47, 0xa9, 0x95, ++ 0xe7, 0x6f, 0xee, 0x0a, 0x5e, 0xbb, 0x2e, 0x81, 0x0c, 0x6d, 0x81, 0x3e, ++ 0xd6, 0x8d, 0xd2, 0x65, 0xba, 0x79, 0xbd, 0xaa, 0x47, 0x9f, 0x84, 0xde, ++ 0xd9, 0xaa, 0x9e, 0x24, 0xef, 0xca, 0x60, 0x30, 0xcd, 0xdc, 0x94, 0xbe, ++ 0xba, 0x3b, 0x21, 0x7b, 0x18, 0x7f, 0x46, 0xbb, 0x52, 0xb1, 0xf4, 0x21, ++ 0xa3, 0x63, 0x9d, 0xea, 0x8f, 0x7c, 0x57, 0x51, 0x51, 0x7f, 0x44, 0x45, ++ 0xdd, 0x50, 0x23, 0xb6, 0x06, 0x98, 0xd1, 0x2d, 0x57, 0xb1, 0xe8, 0xa0, ++ 0xe0, 0xc1, 0x19, 0xf6, 0x6d, 0x75, 0xe7, 0x85, 0x9c, 0x98, 0x4e, 0x7d, ++ 0x8d, 0xfc, 0xd7, 0xb2, 0x16, 0x2d, 0x77, 0xe3, 0xf5, 0x54, 0x11, 0xce, ++ 0x0f, 0xca, 0x3b, 0x0f, 0xdd, 0x28, 0x27, 0x06, 0xfc, 0xc6, 0xf6, 0xf9, ++ 0x22, 0x5c, 0x37, 0x6c, 0x5c, 0xf2, 0xf1, 0x04, 0xcf, 0xcf, 0x0d, 0x19, ++ 0x94, 0xa1, 0x08, 0x17, 0x0e, 0x36, 0xe0, 0xbe, 0xb8, 0xe0, 0x86, 0x86, ++ 0x5b, 0x26, 0xea, 0xf1, 0xd7, 0x71, 0x13, 0xdb, 0xe3, 0x55, 0xec, 0x9b, ++ 0x58, 0x47, 0x9d, 0x65, 0xb1, 0xc4, 0x6b, 0x63, 0xc9, 0x81, 0x84, 0xe8, ++ 0xde, 0x0b, 0x77, 0xc2, 0x38, 0xd6, 0xc3, 0x31, 0x3a, 0x14, 0xff, 0xc5, ++ 0xdf, 0xc0, 0x8b, 0x85, 0xe9, 0x7c, 0x3c, 0x30, 0x5c, 0x89, 0x0a, 0xe2, ++ 0xfd, 0xfd, 0xa3, 0x27, 0xed, 0x78, 0xb2, 0x33, 0xb1, 0x00, 0xdf, 0x3e, ++ 0x2c, 0x6d, 0x49, 0x9d, 0x22, 0x7b, 0x8f, 0xe1, 0x93, 0x31, 0x3b, 0xf6, ++ 0x3d, 0xc8, 0xe8, 0x4c, 0x2e, 0x77, 0x12, 0x8f, 0x0e, 0xea, 0x9d, 0x17, ++ 0x14, 0xc9, 0x53, 0x55, 0x7c, 0x71, 0xa9, 0x03, 0xc9, 0x52, 0x3d, 0x1a, ++ 0x57, 0xa3, 0xb2, 0x1e, 0x14, 0x2d, 0x57, 0xe5, 0xbe, 0x13, 0xeb, 0x88, ++ 0x27, 0xd1, 0xb2, 0x68, 0x17, 0xb9, 0x62, 0xb4, 0x44, 0x35, 0x71, 0x2f, ++ 0x65, 0xed, 0x4b, 0x20, 0x9a, 0xc3, 0x5c, 0x39, 0x15, 0xa8, 0x6a, 0x2b, ++ 0x24, 0x26, 0x6d, 0x08, 0xe8, 0xad, 0xaa, 0xea, 0x24, 0xe7, 0x3b, 0x8b, ++ 0xc3, 0xb4, 0xdf, 0x47, 0x78, 0x1c, 0x1b, 0xb1, 0xba, 0xab, 0x98, 0xc3, ++ 0x76, 0xd2, 0x17, 0x72, 0x97, 0x1a, 0x17, 0x73, 0x14, 0xb1, 0x8d, 0xb3, ++ 0xf8, 0x3e, 0x7d, 0xe0, 0xdb, 0x23, 0xb2, 0x16, 0x13, 0xc1, 0x57, 0xe9, ++ 0x03, 0xc1, 0xa5, 0x2e, 0xcc, 0xb3, 0xf7, 0x6c, 0x10, 0x0b, 0x6c, 0x0e, ++ 0x52, 0x55, 0x2c, 0xef, 0x1d, 0xec, 0x4c, 0xb0, 0xec, 0x88, 0xd1, 0x5f, ++ 0xcd, 0x3a, 0xdf, 0x66, 0x9d, 0x13, 0x83, 0x67, 0xf1, 0x18, 0xfd, 0x60, ++ 0xde, 0xb2, 0x53, 0x0f, 0xcc, 0x43, 0xcd, 0x20, 0x23, 0xf4, 0x23, 0x65, ++ 0x60, 0x3e, 0xb3, 0xd4, 0x6f, 0xfe, 0x93, 0x22, 0x75, 0xcf, 0x12, 0xb7, ++ 0x2f, 0xd7, 0x7d, 0x7e, 0xc4, 0x68, 0xeb, 0x53, 0xce, 0xe2, 0x39, 0xd6, ++ 0x7d, 0x96, 0x75, 0x4f, 0xb1, 0xee, 0xea, 0xc0, 0x29, 0x3d, 0x0f, 0x35, ++ 0x61, 0x27, 0x32, 0x15, 0x6e, 0xd6, 0xfd, 0x0b, 0xd3, 0x1f, 0x1c, 0xa3, ++ 0x5f, 0x3e, 0x7d, 0xa9, 0xde, 0x2c, 0x97, 0xf1, 0xa2, 0x99, 0xd8, 0x93, ++ 0x7d, 0x77, 0xc6, 0x83, 0xa6, 0xc4, 0x71, 0x62, 0x53, 0x2d, 0xf1, 0xe7, ++ 0x0c, 0x63, 0x53, 0x90, 0xb8, 0xb4, 0x86, 0x38, 0xd5, 0x82, 0xff, 0x9d, ++ 0x6e, 0xc6, 0xf7, 0xd2, 0x61, 0xe2, 0x55, 0x88, 0x78, 0xd5, 0x40, 0xac, ++ 0x32, 0x89, 0x55, 0xf5, 0xc4, 0x2a, 0xe2, 0xe1, 0xf8, 0x8f, 0x90, 0xc3, ++ 0xf8, 0xe2, 0x1a, 0xb6, 0xac, 0x11, 0xfa, 0xee, 0x13, 0x3c, 0xc6, 0xcc, ++ 0x3a, 0xad, 0x1d, 0x0b, 0x78, 0xef, 0x7e, 0xfb, 0x1d, 0xbf, 0x24, 0xdb, ++ 0xcb, 0x1b, 0xae, 0x3b, 0xe0, 0x21, 0xdf, 0xab, 0x0d, 0x54, 0x05, 0xfb, ++ 0xc9, 0x63, 0x7e, 0x65, 0xd4, 0xf5, 0x97, 0xc1, 0xe8, 0x5a, 0xa6, 0xfe, ++ 0x0d, 0xa6, 0xd7, 0x6a, 0xf4, 0xdb, 0x32, 0x78, 0x47, 0x35, 0xd9, 0xe7, ++ 0xf7, 0x6b, 0x0f, 0xaa, 0x4e, 0x54, 0x38, 0xf0, 0xd8, 0x15, 0x70, 0x78, ++ 0xe6, 0x63, 0xc9, 0xb1, 0x1e, 0x55, 0x45, 0x72, 0xbe, 0xc3, 0x58, 0x60, ++ 0xf3, 0xc0, 0xba, 0x8b, 0xcd, 0xf2, 0x0e, 0xe0, 0x3c, 0xc1, 0x7d, 0xdd, ++ 0x1b, 0x56, 0xd1, 0x40, 0x66, 0x5d, 0x99, 0x03, 0xd9, 0x2f, 0x9f, 0xc7, ++ 0x58, 0x63, 0xbf, 0x4b, 0x7b, 0x40, 0x78, 0xdb, 0x3c, 0x43, 0xf6, 0x3c, ++ 0x47, 0xef, 0x98, 0xc7, 0xb8, 0xec, 0x66, 0x0c, 0x6e, 0x0f, 0x30, 0x9f, ++ 0x0f, 0xf9, 0x83, 0x7b, 0xe4, 0xdd, 0xcb, 0x9a, 0x20, 0x56, 0x93, 0x13, ++ 0xec, 0xe1, 0x98, 0x5a, 0xd2, 0xb3, 0xcf, 0xb0, 0x3f, 0xfd, 0xef, 0x8b, ++ 0xc4, 0x99, 0x54, 0xe0, 0x0f, 0x56, 0xb4, 0x74, 0x49, 0xe7, 0x3c, 0x18, ++ 0xda, 0x8f, 0x14, 0xfd, 0x18, 0x90, 0x51, 0xb2, 0xf9, 0x6f, 0x16, 0x93, ++ 0x0b, 0xe8, 0x87, 0xf7, 0x0c, 0x44, 0xad, 0x52, 0x72, 0x9e, 0x05, 0xc3, ++ 0xba, 0xaf, 0x4b, 0x31, 0xb4, 0x21, 0xe2, 0x5e, 0xc5, 0x70, 0x2d, 0x9a, ++ 0x88, 0xed, 0x37, 0x0e, 0xd8, 0xcf, 0x11, 0xf1, 0x54, 0x0c, 0xee, 0x2b, ++ 0x58, 0xf6, 0xdf, 0x19, 0xf7, 0xc7, 0x89, 0xc3, 0xb9, 0xd0, 0xc3, 0xa7, ++ 0x39, 0x3e, 0xb7, 0xc3, 0xb8, 0x28, 0xe5, 0x0b, 0x86, 0xeb, 0xb1, 0x9e, ++ 0x32, 0xb5, 0x0c, 0x59, 0x78, 0x65, 0x99, 0x85, 0xab, 0x97, 0xe9, 0x9d, ++ 0x17, 0xd5, 0xf0, 0x5d, 0xf3, 0x91, 0xe9, 0x28, 0xe1, 0x9c, 0x3e, 0x13, ++ 0xd0, 0x83, 0x03, 0x8a, 0x5e, 0x7b, 0xbd, 0x22, 0xfb, 0x75, 0xbb, 0x99, ++ 0x8b, 0xdb, 0xfb, 0xb4, 0x8e, 0x1f, 0x42, 0x58, 0x38, 0xf3, 0xd4, 0x16, ++ 0x87, 0x7e, 0xf1, 0xa7, 0x68, 0x84, 0x3b, 0x50, 0x8c, 0x05, 0x21, 0xfd, ++ 0xc4, 0x35, 0x6a, 0x3f, 0x71, 0x5a, 0xef, 0xff, 0xd0, 0xe1, 0x46, 0xc9, ++ 0x55, 0x29, 0x1c, 0x48, 0x9f, 0xc4, 0x7e, 0x62, 0xc2, 0x68, 0x3a, 0xa1, ++ 0x4c, 0x97, 0x3e, 0x86, 0xa1, 0xb4, 0xac, 0x3f, 0xcb, 0x9a, 0x63, 0xff, ++ 0x1d, 0x2f, 0xfa, 0xf5, 0xc8, 0x24, 0x63, 0xff, 0xee, 0x4b, 0xef, 0x23, ++ 0xfc, 0x18, 0xc5, 0x9c, 0xe3, 0xa2, 0x99, 0x39, 0x7c, 0x36, 0x60, 0xd9, ++ 0x3e, 0x11, 0xa3, 0xbc, 0x37, 0x2b, 0x96, 0x35, 0x7c, 0x69, 0x2e, 0xe3, ++ 0xcc, 0xbb, 0xa4, 0xbc, 0xcc, 0x27, 0x6d, 0x27, 0x41, 0xdb, 0x61, 0x0c, ++ 0x6e, 0xba, 0x9e, 0xf6, 0x93, 0xa0, 0xfd, 0x24, 0x68, 0x3f, 0x62, 0x57, ++ 0x09, 0xda, 0x10, 0x7d, 0xfc, 0x51, 0x62, 0xf8, 0xb7, 0x89, 0xe1, 0xd9, ++ 0x75, 0xc2, 0x56, 0x3b, 0x67, 0x6a, 0x1b, 0xf2, 0xe1, 0x8a, 0x65, 0x4e, ++ 0x75, 0xba, 0x4c, 0xc1, 0x7c, 0xc6, 0xfb, 0x85, 0xc3, 0xfa, 0x71, 0xe1, ++ 0xda, 0x1f, 0x2c, 0x2b, 0x82, 0x6f, 0x9e, 0x82, 0x05, 0x86, 0x07, 0x2d, ++ 0x03, 0x7d, 0x70, 0xc4, 0xeb, 0x8e, 0x3b, 0x88, 0x59, 0x99, 0xf9, 0xba, ++ 0x09, 0xa5, 0x0f, 0x39, 0xf1, 0x76, 0xb8, 0xe2, 0x75, 0xc1, 0x27, 0x31, ++ 0xf3, 0x7e, 0x28, 0xda, 0xe1, 0x8c, 0xcb, 0x7a, 0x32, 0xed, 0x7a, 0xa0, ++ 0x1d, 0x05, 0xf1, 0x3a, 0xf3, 0x66, 0xde, 0xcb, 0x78, 0xc4, 0x86, 0xe4, ++ 0x5e, 0xd5, 0x89, 0x51, 0xb6, 0x3b, 0x7d, 0x9b, 0xca, 0x36, 0xeb, 0x7c, ++ 0x5f, 0x56, 0x5b, 0x94, 0xa8, 0x9d, 0x5b, 0x30, 0xf6, 0x0f, 0x14, 0xe2, ++ 0x6a, 0x72, 0x42, 0x2f, 0xf9, 0xe0, 0x75, 0x93, 0x0d, 0x68, 0x1d, 0x78, ++ 0x98, 0xdc, 0xd0, 0x1f, 0xb9, 0xa8, 0x38, 0x61, 0x4e, 0x36, 0x62, 0xf5, ++ 0x90, 0x70, 0x43, 0xc3, 0x37, 0xa0, 0xf8, 0x68, 0x4f, 0xef, 0x91, 0x1b, ++ 0x16, 0x60, 0xf1, 0x21, 0xb1, 0x2b, 0xcb, 0xda, 0xb0, 0xdc, 0xa8, 0x3d, ++ 0x4b, 0xdb, 0xcb, 0x09, 0x9d, 0x20, 0x76, 0xfa, 0xa7, 0x8e, 0xd2, 0xf6, ++ 0xae, 0x23, 0x9f, 0x7b, 0x3d, 0xe6, 0x85, 0x6f, 0xf2, 0x77, 0x96, 0x9b, ++ 0x9c, 0xb0, 0x8a, 0x7c, 0xee, 0x22, 0x71, 0x74, 0xe1, 0x72, 0xa3, 0xb3, ++ 0xd1, 0x51, 0x89, 0x20, 0xf9, 0xe0, 0x7b, 0x31, 0x3d, 0xfa, 0x7f, 0x54, ++ 0x03, 0x57, 0x93, 0x0b, 0xbe, 0x13, 0xab, 0x67, 0x3f, 0x85, 0xf8, 0xdc, ++ 0xa4, 0x0f, 0x57, 0x4d, 0xd6, 0xb2, 0x5e, 0x10, 0xbe, 0xa3, 0xd7, 0xf3, ++ 0xf0, 0xe0, 0xed, 0x58, 0x55, 0xcb, 0xa8, 0x52, 0xd5, 0x7a, 0xad, 0x52, ++ 0x8a, 0x30, 0x73, 0xd7, 0x25, 0x93, 0x9f, 0xc7, 0xbb, 0xc4, 0xaf, 0xfa, ++ 0x38, 0x60, 0xc4, 0x71, 0x77, 0xf1, 0x47, 0xdf, 0x81, 0x6c, 0xdb, 0xc3, ++ 0x1c, 0x66, 0x33, 0xe5, 0xf6, 0x93, 0xf7, 0x2d, 0x62, 0xd9, 0xd7, 0x07, ++ 0xf3, 0x51, 0x75, 0xe8, 0x04, 0xf9, 0x57, 0x0e, 0x16, 0x3e, 0xe4, 0x46, ++ 0xe3, 0xd1, 0x14, 0xf9, 0xb7, 0xec, 0xf9, 0x91, 0x77, 0x6a, 0x81, 0xcd, ++ 0x07, 0x85, 0x1f, 0xa5, 0xe8, 0xff, 0x96, 0x75, 0xc8, 0x94, 0xd8, 0xe7, ++ 0xc3, 0x21, 0x72, 0x94, 0xb1, 0x84, 0xc4, 0xbf, 0x13, 0xc4, 0x55, 0xff, ++ 0x94, 0x3c, 0x92, 0x5e, 0x18, 0x12, 0x2e, 0xe7, 0x84, 0x77, 0x52, 0x62, ++ 0x53, 0x10, 0x69, 0x8e, 0x2f, 0x41, 0xbe, 0x74, 0x3c, 0x56, 0x89, 0x41, ++ 0xf2, 0xa5, 0x28, 0xf9, 0x52, 0x94, 0xdc, 0x28, 0x4a, 0xbe, 0x24, 0xef, ++ 0x24, 0x47, 0xc9, 0x97, 0xa2, 0xe4, 0x4b, 0xd1, 0x54, 0x23, 0xc6, 0x07, ++ 0x55, 0xec, 0x3a, 0xac, 0xa9, 0x19, 0xce, 0x71, 0x11, 0x63, 0xd0, 0xf4, ++ 0x9f, 0x7f, 0x9e, 0x39, 0xc1, 0x0d, 0x3c, 0xe4, 0x99, 0xb8, 0xec, 0x19, ++ 0x93, 0x36, 0xdd, 0x18, 0x4d, 0x09, 0x6f, 0x6d, 0x60, 0x9e, 0x7c, 0x12, ++ 0x5f, 0x61, 0x9d, 0x77, 0x89, 0xb3, 0x99, 0xb5, 0x26, 0xcf, 0x4f, 0xa0, ++ 0x27, 0x71, 0x92, 0x79, 0xc0, 0x49, 0x74, 0x0c, 0x02, 0xeb, 0x39, 0x7e, ++ 0x8d, 0x38, 0xfd, 0xd2, 0x52, 0xa0, 0x71, 0xec, 0x04, 0xfd, 0xf0, 0x24, ++ 0x62, 0x09, 0xf2, 0x48, 0x95, 0xed, 0xef, 0x43, 0x46, 0xf6, 0x98, 0x3f, ++ 0xcb, 0xba, 0x03, 0x8c, 0x2d, 0x83, 0x89, 0x13, 0x8c, 0x7f, 0x7a, 0xf0, ++ 0x7d, 0xda, 0x82, 0x73, 0xb4, 0x0c, 0xd5, 0x0f, 0xe9, 0xc1, 0x5f, 0xc0, ++ 0x68, 0xdb, 0x01, 0xab, 0xf1, 0xb4, 0xe9, 0xd7, 0x36, 0xca, 0xb3, 0xa8, ++ 0xa3, 0x2a, 0xed, 0xce, 0x49, 0xdf, 0x69, 0xa4, 0xdd, 0x85, 0x11, 0xbc, ++ 0x96, 0xf9, 0xc6, 0x21, 0xda, 0x4e, 0x99, 0xc4, 0x1c, 0x3d, 0x78, 0xde, ++ 0xe6, 0x31, 0x4e, 0x8c, 0xa7, 0x24, 0x8e, 0x7e, 0x0d, 0xa7, 0x63, 0xe4, ++ 0xe9, 0x9f, 0xfb, 0x99, 0x55, 0x42, 0xbc, 0x19, 0x63, 0x5c, 0x3c, 0x36, ++ 0x18, 0xbe, 0xbb, 0x80, 0x3e, 0xaa, 0x32, 0x2e, 0x1e, 0x4a, 0x4a, 0x9f, ++ 0x45, 0xf4, 0xff, 0x6c, 0x5c, 0xf4, 0x1e, 0xca, 0x72, 0xe7, 0x5b, 0x86, ++ 0x8c, 0x88, 0xbc, 0x6f, 0x30, 0x40, 0x8e, 0xb5, 0xfa, 0xe0, 0x09, 0xb6, ++ 0x27, 0x79, 0x90, 0x0f, 0x4f, 0xc7, 0x34, 0x6c, 0x99, 0x30, 0x18, 0xc3, ++ 0xc8, 0x9f, 0x27, 0x6a, 0xf1, 0x04, 0xf5, 0xda, 0xce, 0x78, 0x79, 0x3a, ++ 0x26, 0xd8, 0x5f, 0x89, 0x8d, 0x13, 0x2a, 0xdc, 0xc6, 0x37, 0x30, 0x75, ++ 0xbb, 0x60, 0xf4, 0x19, 0xc6, 0xd8, 0x0c, 0xdb, 0xd3, 0x7d, 0xd3, 0xea, ++ 0x19, 0x9c, 0x1f, 0x3a, 0x83, 0x5f, 0xf2, 0x78, 0x8b, 0x98, 0xa1, 0xd1, ++ 0x47, 0xef, 0x0b, 0x84, 0xef, 0xd6, 0x90, 0x21, 0x79, 0xd4, 0xbd, 0x47, ++ 0x88, 0x13, 0x3f, 0x37, 0xf5, 0xa9, 0x8d, 0x8e, 0x70, 0x20, 0x0f, 0xfa, ++ 0xc5, 0x67, 0xd1, 0x8f, 0x45, 0x35, 0x29, 0xf4, 0x10, 0x07, 0x1e, 0x26, ++ 0xe7, 0xb9, 0x61, 0x4c, 0xe6, 0x5a, 0xe6, 0xdd, 0x87, 0x13, 0x89, 0xe8, ++ 0x46, 0x9a, 0x42, 0x53, 0x49, 0xc8, 0x1f, 0x3e, 0xa0, 0x9c, 0xa0, 0x2e, ++ 0xfd, 0x6d, 0x25, 0xb4, 0xa1, 0x02, 0xda, 0x61, 0xdf, 0x80, 0xd8, 0x8b, ++ 0xfd, 0x8c, 0xf5, 0x3a, 0x17, 0x44, 0xb6, 0x06, 0xc4, 0x07, 0xac, 0xee, ++ 0x12, 0xe6, 0x47, 0xe7, 0x97, 0x57, 0xe2, 0xbe, 0x89, 0x1b, 0xd0, 0x3b, ++ 0x54, 0x89, 0xbb, 0x07, 0xbc, 0xd8, 0x3c, 0x80, 0xb5, 0x0e, 0xa8, 0x5f, ++ 0x21, 0x1e, 0x65, 0x98, 0x1f, 0x69, 0xef, 0x10, 0xbb, 0xf3, 0x1d, 0xfa, ++ 0xd4, 0x29, 0xc6, 0x58, 0xb1, 0xfb, 0x2e, 0xc6, 0xfd, 0x4e, 0x72, 0xa5, ++ 0x08, 0xb9, 0x52, 0x84, 0xf5, 0xfa, 0x86, 0x5c, 0x58, 0x68, 0x30, 0x6d, ++ 0xa6, 0x8f, 0xb7, 0x33, 0x27, 0x88, 0x3f, 0x64, 0x84, 0xcf, 0xab, 0x32, ++ 0xb6, 0xf9, 0xb8, 0xef, 0xc8, 0x0d, 0xd8, 0x41, 0x6c, 0xd8, 0xc4, 0xeb, ++ 0x03, 0x0f, 0x2d, 0xc2, 0xbd, 0xe4, 0x4a, 0x91, 0x89, 0x46, 0xec, 0x1a, ++ 0x52, 0xb1, 0xe5, 0x88, 0xf4, 0xf9, 0x79, 0xec, 0x1e, 0xaa, 0x6a, 0xad, ++ 0x62, 0xce, 0xb4, 0xd2, 0xaf, 0xd0, 0x8e, 0x53, 0x33, 0x36, 0xe2, 0xc6, ++ 0xed, 0x29, 0xb1, 0x0b, 0xd1, 0xbb, 0xd8, 0x86, 0x8a, 0x5b, 0x1f, 0x2a, ++ 0x43, 0xf1, 0xfe, 0xc7, 0x2d, 0xaf, 0x61, 0x74, 0x94, 0xa8, 0x56, 0xe3, ++ 0x93, 0x01, 0x7f, 0xf0, 0x08, 0xe7, 0x7d, 0x15, 0xf9, 0xcf, 0x9a, 0x21, ++ 0xe1, 0x45, 0x8d, 0xd8, 0x4d, 0x0e, 0x54, 0x45, 0x0e, 0xb4, 0xe2, 0xa0, ++ 0xb4, 0x91, 0x8d, 0x99, 0x79, 0xcc, 0x2f, 0x7c, 0xe9, 0xaf, 0xe1, 0x39, ++ 0x72, 0x6e, 0x07, 0xe7, 0xba, 0x2e, 0x5d, 0x84, 0x45, 0xfb, 0x10, 0x2d, ++ 0x20, 0x07, 0x5a, 0xcf, 0xd4, 0x53, 0xfa, 0x88, 0x73, 0x6e, 0xcf, 0x0c, ++ 0x19, 0x5d, 0x5e, 0xb5, 0xc8, 0xe6, 0x5a, 0x31, 0x9e, 0x0f, 0x0c, 0x19, ++ 0x6c, 0xbf, 0x08, 0xbb, 0xec, 0x3c, 0x49, 0xc3, 0x33, 0xf4, 0x8b, 0x57, ++ 0x52, 0x5e, 0xc6, 0x6b, 0xff, 0xf1, 0x15, 0x8a, 0x17, 0xaf, 0x24, 0x85, ++ 0x2b, 0x89, 0x6c, 0x5e, 0x9c, 0x1d, 0x30, 0x2e, 0xde, 0x0c, 0xff, 0xd4, ++ 0x79, 0x87, 0x17, 0x1f, 0x50, 0x27, 0xda, 0xbe, 0x4a, 0x72, 0xa7, 0x13, ++ 0x6c, 0x57, 0x72, 0x30, 0xc9, 0x97, 0xc8, 0xc7, 0x1f, 0x5a, 0x80, 0x23, ++ 0x47, 0xb2, 0x5c, 0xe7, 0xcd, 0x98, 0x5c, 0x0b, 0xdf, 0xc5, 0xf9, 0xd2, ++ 0x85, 0xeb, 0xfc, 0x62, 0x50, 0x6f, 0xe9, 0x53, 0x64, 0xdd, 0x43, 0xc5, ++ 0x6d, 0x01, 0x07, 0x6d, 0x56, 0x37, 0x7f, 0xae, 0x46, 0x8f, 0x93, 0xeb, ++ 0x98, 0xaf, 0xf0, 0xfe, 0xdb, 0xf4, 0x95, 0x3e, 0x59, 0x25, 0xd6, 0x1c, ++ 0xf8, 0xc5, 0xd2, 0x68, 0xc6, 0xc5, 0xeb, 0xaf, 0x32, 0xef, 0xc9, 0xa3, ++ 0x8f, 0xed, 0x4f, 0x54, 0x69, 0x4b, 0x14, 0x07, 0xc7, 0xa2, 0x4f, 0xfd, ++ 0x8c, 0xd7, 0x3e, 0x98, 0x14, 0x9b, 0x0b, 0xc2, 0x7f, 0xf4, 0x8c, 0xfd, ++ 0x1e, 0x48, 0xc6, 0xc1, 0x5c, 0xcc, 0xa3, 0x1f, 0x8f, 0x40, 0xde, 0x7b, ++ 0xdb, 0x89, 0xcc, 0x6d, 0x27, 0x58, 0x47, 0xb0, 0x5f, 0x43, 0xde, 0x68, ++ 0x55, 0xeb, 0x43, 0xaa, 0x0f, 0x9e, 0x90, 0xae, 0x3d, 0xa2, 0x6a, 0xf4, ++ 0x21, 0x13, 0xeb, 0xd2, 0x96, 0xb5, 0x2e, 0x90, 0x8d, 0x07, 0xf3, 0xe8, ++ 0x6b, 0x0b, 0x47, 0x4b, 0xf1, 0x6f, 0x36, 0x07, 0x2a, 0xc4, 0x15, 0xe4, ++ 0xcb, 0x85, 0xf1, 0xe8, 0x33, 0xcc, 0x3f, 0x98, 0x1c, 0x9e, 0xae, 0xa9, ++ 0x40, 0xdd, 0xf1, 0x0a, 0x45, 0xef, 0xa2, 0xec, 0x6d, 0xef, 0x2b, 0x8c, ++ 0xd7, 0xc4, 0xc4, 0x82, 0xc9, 0xba, 0x63, 0x1e, 0x18, 0xd1, 0xe5, 0xea, ++ 0x3d, 0x1f, 0xa2, 0x4c, 0x64, 0x58, 0x5c, 0x92, 0xcd, 0xe9, 0x3d, 0x28, ++ 0x18, 0x95, 0xf7, 0x1a, 0x2c, 0x6b, 0x63, 0x20, 0xd3, 0x49, 0xfb, 0x0a, ++ 0x4e, 0x22, 0xc4, 0x18, 0x2e, 0xfb, 0xbb, 0x43, 0x8c, 0xd3, 0x55, 0x17, ++ 0x5e, 0xc0, 0x35, 0xc8, 0x7c, 0x26, 0x1b, 0xb7, 0xdd, 0xcc, 0xcf, 0x54, ++ 0xbf, 0xc6, 0xfc, 0xc9, 0x8d, 0x97, 0xae, 0xc9, 0x7e, 0xaf, 0xe1, 0xd6, ++ 0x3f, 0x21, 0xde, 0xcb, 0x1e, 0xb9, 0x98, 0x29, 0xf1, 0xde, 0x3e, 0x75, ++ 0xde, 0xc1, 0xf3, 0x2b, 0xd8, 0x46, 0xc5, 0xa4, 0xd3, 0xf9, 0x17, 0x89, ++ 0x42, 0x94, 0x4f, 0x9a, 0xb8, 0x3d, 0xdb, 0x0e, 0x63, 0x7a, 0x33, 0x63, ++ 0xba, 0x02, 0xaf, 0xf1, 0x13, 0xbc, 0x6a, 0xf3, 0x81, 0x32, 0xe4, 0x8e, ++ 0x4a, 0x8e, 0x16, 0x66, 0x8e, 0xa6, 0x77, 0x8c, 0xf3, 0xbc, 0x88, 0xf8, ++ 0xbd, 0x60, 0x54, 0xc1, 0x33, 0x35, 0x1e, 0xe4, 0xf1, 0xb7, 0x3a, 0x6a, ++ 0x59, 0xcd, 0xe6, 0xd3, 0xd6, 0xce, 0x75, 0x32, 0x4e, 0xe1, 0x63, 0xce, ++ 0x12, 0x14, 0x7b, 0x98, 0x98, 0x0b, 0xc7, 0x37, 0xc8, 0xf1, 0xcb, 0xe0, ++ 0x1a, 0xad, 0xea, 0x5c, 0x81, 0x2a, 0x73, 0x92, 0xf5, 0x73, 0x8e, 0x5e, ++ 0x5d, 0x8a, 0x7c, 0x29, 0x0b, 0xa8, 0xf1, 0xa6, 0x52, 0x79, 0x0e, 0x31, ++ 0x3f, 0xa4, 0xe0, 0xb6, 0x21, 0x79, 0x97, 0xbf, 0xa9, 0x6b, 0x3e, 0x68, ++ 0x2b, 0xe5, 0x0b, 0x70, 0x6c, 0xbf, 0x07, 0xeb, 0x07, 0x90, 0x29, 0x35, ++ 0xac, 0xc6, 0x0f, 0x97, 0x19, 0x53, 0xa5, 0x8a, 0xbc, 0x97, 0x16, 0x81, ++ 0x37, 0xe1, 0x3f, 0x71, 0x83, 0xc3, 0x6a, 0x7c, 0x73, 0x69, 0x5d, 0xeb, ++ 0x09, 0x48, 0xfc, 0x58, 0x80, 0xef, 0x8d, 0xcb, 0xfb, 0xb3, 0x6d, 0xd0, ++ 0xe2, 0xc7, 0x69, 0x83, 0xd1, 0xfb, 0x5d, 0x88, 0x5a, 0x85, 0x86, 0x4e, ++ 0xbf, 0xd0, 0x5b, 0x26, 0x15, 0x66, 0x18, 0x01, 0xa3, 0xad, 0x9e, 0xf6, ++ 0xf4, 0x77, 0xb2, 0xd7, 0x38, 0x54, 0x8f, 0x9b, 0xd3, 0xba, 0x79, 0x88, ++ 0x7c, 0xfe, 0x69, 0xda, 0xd1, 0xeb, 0x0d, 0x45, 0x38, 0x9d, 0x6c, 0x9c, ++ 0xe1, 0xb3, 0x32, 0x3f, 0xf2, 0xbc, 0x4e, 0x6c, 0x42, 0xc1, 0xf7, 0xab, ++ 0x91, 0xaa, 0x40, 0xd5, 0xe0, 0x0a, 0xd5, 0x91, 0x2a, 0x47, 0x18, 0x17, ++ 0xab, 0x97, 0xf8, 0xbe, 0xa3, 0x8a, 0xad, 0xc8, 0xf3, 0x1e, 0x5d, 0x36, ++ 0x0a, 0x93, 0x17, 0xd1, 0xe6, 0xd3, 0xb7, 0x97, 0xc8, 0x38, 0x52, 0xe9, ++ 0x32, 0xdc, 0xf6, 0xd0, 0x71, 0xc9, 0x35, 0xac, 0x27, 0x97, 0xfe, 0xaa, ++ 0x50, 0xf4, 0xf0, 0x0f, 0xe3, 0xd2, 0xe6, 0xdf, 0x97, 0x66, 0xf7, 0x46, ++ 0x4b, 0x5c, 0x26, 0x1f, 0x39, 0xea, 0xb0, 0x9f, 0xb1, 0x49, 0x5c, 0xbe, ++ 0x7d, 0x20, 0x1f, 0xbe, 0x43, 0xe2, 0x37, 0x4e, 0x5c, 0x3b, 0x19, 0x45, ++ 0x49, 0xa8, 0x11, 0x85, 0xfb, 0x0a, 0x61, 0x1c, 0x2a, 0x44, 0x6d, 0xfc, ++ 0x61, 0x3b, 0x2e, 0xd7, 0x1f, 0xf2, 0x7b, 0x4b, 0xc8, 0x51, 0xee, 0x5b, ++ 0xfe, 0x9e, 0xe5, 0x0a, 0x89, 0x6c, 0x46, 0xc7, 0x7d, 0xf2, 0xfd, 0x92, ++ 0x06, 0xc3, 0x1c, 0xa7, 0x9d, 0x55, 0x33, 0x36, 0x7f, 0x18, 0x2f, 0x83, ++ 0x35, 0x7a, 0x9c, 0x78, 0xa1, 0xe1, 0x06, 0x9e, 0x5f, 0x88, 0x4b, 0xac, ++ 0xf6, 0xf1, 0xf0, 0x30, 0x0e, 0x1b, 0xfc, 0xef, 0xc5, 0xcf, 0xc9, 0xd3, ++ 0x2e, 0x2c, 0x8b, 0x92, 0xa9, 0xd6, 0x62, 0x31, 0x6d, 0xf3, 0x83, 0xb8, ++ 0x9e, 0x69, 0x22, 0xd6, 0xbc, 0xbd, 0xcc, 0xa4, 0x2c, 0x85, 0xf8, 0x65, ++ 0x5c, 0xd6, 0x0d, 0x4e, 0x3d, 0xe0, 0x45, 0xb4, 0xaa, 0x90, 0x36, 0xfd, ++ 0x06, 0xf1, 0xa4, 0x98, 0xf9, 0x60, 0xed, 0xd1, 0x6b, 0x28, 0x73, 0x3d, ++ 0xea, 0x18, 0x7f, 0x27, 0x93, 0x21, 0x6c, 0xd9, 0x6f, 0xe7, 0x8b, 0x4d, ++ 0xb2, 0x2f, 0xed, 0x1d, 0xd3, 0x6f, 0x8e, 0x11, 0x57, 0x57, 0x4e, 0x9c, ++ 0xc0, 0xff, 0x4a, 0xd8, 0xfb, 0xc5, 0x32, 0x6e, 0x23, 0x88, 0x1f, 0x31, ++ 0xe6, 0xe5, 0x18, 0x92, 0x47, 0x36, 0xe0, 0x19, 0xe6, 0xb5, 0xab, 0x2f, ++ 0xe5, 0x93, 0x1e, 0x84, 0x8f, 0xcc, 0xe7, 0xe1, 0xe3, 0xb1, 0x88, 0x87, ++ 0xe4, 0x8b, 0xf4, 0x73, 0x3b, 0x4f, 0x4c, 0x31, 0x3f, 0x3c, 0x61, 0xc7, ++ 0xc4, 0x03, 0xc4, 0xbc, 0xf7, 0x69, 0x97, 0xd7, 0xee, 0x03, 0xae, 0x18, ++ 0x13, 0xfc, 0x16, 0x7c, 0x51, 0x88, 0xaf, 0x0a, 0xde, 0x38, 0x28, 0x38, ++ 0xa2, 0xe2, 0x5b, 0x0f, 0x19, 0x9d, 0x1d, 0x8a, 0xbf, 0xf6, 0x0c, 0xe5, ++ 0x3c, 0x42, 0xdc, 0x1b, 0x67, 0xde, 0xf7, 0xba, 0xa9, 0x62, 0xec, 0xa0, ++ 0xc4, 0x5c, 0xc9, 0x7d, 0x4e, 0xe2, 0x7e, 0xc6, 0xdc, 0x1b, 0x96, 0x32, ++ 0xe6, 0x7e, 0x49, 0xde, 0xf1, 0x71, 0x62, 0x27, 0xf3, 0xbf, 0xaf, 0xc4, ++ 0x1e, 0xb7, 0xb1, 0x2f, 0xc1, 0x38, 0xd7, 0x3f, 0xd8, 0x8d, 0x02, 0xc6, ++ 0xb8, 0xbd, 0xc9, 0x93, 0xf6, 0x3e, 0xeb, 0x77, 0x07, 0x8d, 0xda, 0xd3, ++ 0xc4, 0xb9, 0x37, 0x79, 0xfe, 0xbf, 0x78, 0xfe, 0xc2, 0x3e, 0x1f, 0x8e, ++ 0x2e, 0x2f, 0xc2, 0x53, 0x94, 0x61, 0x4f, 0xe2, 0xa4, 0xfd, 0xde, 0x6a, ++ 0xeb, 0x80, 0x66, 0xeb, 0x74, 0xf5, 0x80, 0x87, 0x7a, 0x24, 0x27, 0x66, ++ 0x9c, 0x58, 0x34, 0x49, 0xae, 0x3b, 0x50, 0x89, 0xc6, 0xc9, 0xcf, 0xce, ++ 0xb1, 0xa5, 0x72, 0x7b, 0xde, 0x33, 0x6a, 0x19, 0xf2, 0xed, 0x35, 0x0b, ++ 0x03, 0x56, 0x42, 0x3f, 0xf0, 0x0b, 0x47, 0x19, 0xe6, 0x5d, 0xf2, 0x03, ++ 0xc6, 0xf4, 0x64, 0xca, 0x7e, 0x16, 0x5f, 0x48, 0x99, 0xea, 0x27, 0xae, ++ 0xd6, 0x24, 0xbf, 0xe9, 0x4d, 0xc8, 0x1a, 0xb7, 0xd8, 0x7c, 0x2b, 0x6d, ++ 0x7e, 0xee, 0x7b, 0xea, 0xb4, 0xaf, 0xf4, 0x76, 0xdc, 0xbf, 0x4f, 0xef, ++ 0x72, 0x3a, 0xa2, 0x96, 0x66, 0x74, 0x93, 0x53, 0x74, 0xc3, 0xbf, 0xd4, ++ 0x68, 0x63, 0x7e, 0xd8, 0xf1, 0x53, 0x25, 0x1f, 0x85, 0xa1, 0x27, 0xb0, ++ 0x63, 0x4c, 0xaf, 0x4d, 0x29, 0x06, 0x6d, 0x5d, 0x63, 0x8e, 0x97, 0x83, ++ 0x8e, 0xfd, 0x1b, 0x70, 0x74, 0x50, 0x0f, 0x46, 0x61, 0x72, 0x8e, 0xaa, ++ 0x7c, 0x79, 0xca, 0x05, 0x9c, 0x36, 0x99, 0x63, 0xa6, 0x2b, 0xb0, 0x41, ++ 0x93, 0x3d, 0x61, 0x1b, 0x30, 0x39, 0x78, 0xc1, 0x2a, 0x32, 0x5a, 0x91, ++ 0x6f, 0x18, 0xe4, 0xce, 0x92, 0xbf, 0x5f, 0x8d, 0xad, 0x36, 0x6e, 0xe4, ++ 0xca, 0xb7, 0x44, 0x0a, 0x17, 0x1a, 0x06, 0xf9, 0xbc, 0xac, 0x4d, 0x78, ++ 0xe7, 0xec, 0x8b, 0x96, 0x75, 0xf1, 0xfc, 0x92, 0xec, 0x73, 0xf9, 0x4f, ++ 0x2b, 0x33, 0x8d, 0x43, 0x23, 0x92, 0x73, 0xce, 0x53, 0x1e, 0x1f, 0xac, ++ 0xf6, 0xf6, 0xd0, 0x7e, 0x1f, 0x30, 0x33, 0x78, 0x6b, 0x59, 0x1e, 0x64, ++ 0x8d, 0x24, 0x70, 0x75, 0x50, 0xfa, 0xe0, 0xdf, 0x39, 0xcb, 0x77, 0x9b, ++ 0xb4, 0x73, 0x76, 0x46, 0x8f, 0x77, 0x51, 0x79, 0x72, 0x2e, 0xef, 0x65, ++ 0xda, 0xeb, 0x37, 0x33, 0xd7, 0x5f, 0xb3, 0xc2, 0x1e, 0xb9, 0xbe, 0x88, ++ 0xf5, 0x44, 0x5f, 0xf3, 0x94, 0xbb, 0x07, 0x1b, 0xb1, 0x28, 0x30, 0x4f, ++ 0xd9, 0x90, 0x9c, 0xad, 0xf3, 0x32, 0xd2, 0x23, 0x2f, 0xdb, 0xeb, 0x35, ++ 0xd3, 0x70, 0xcd, 0x7c, 0xa3, 0x40, 0xf6, 0xd1, 0xb9, 0x98, 0x5f, 0xc9, ++ 0xb3, 0x8c, 0x73, 0x18, 0xda, 0x2f, 0x7e, 0x69, 0x59, 0xfe, 0xea, 0x73, ++ 0xd8, 0x31, 0x7e, 0x42, 0x69, 0x4b, 0x7c, 0x68, 0x21, 0x77, 0x5e, 0xa4, ++ 0xc2, 0xde, 0x67, 0x2e, 0x6d, 0xf4, 0x29, 0xad, 0x69, 0x7f, 0xf0, 0x01, ++ 0x06, 0x00, 0x2d, 0x24, 0xdf, 0x0f, 0x90, 0xb1, 0x9d, 0xe0, 0x35, 0xc3, ++ 0x7e, 0x57, 0xeb, 0xb8, 0x3d, 0xce, 0x8f, 0xeb, 0xe1, 0xbb, 0x56, 0xb8, ++ 0x55, 0xea, 0xce, 0xca, 0xb5, 0x87, 0xf2, 0x88, 0x6c, 0xb3, 0xf7, 0x27, ++ 0x66, 0x64, 0xcf, 0x85, 0xaf, 0x2c, 0x5b, 0xa6, 0x83, 0xb2, 0xe7, 0x30, ++ 0x5e, 0x9f, 0x6a, 0x98, 0x2b, 0xff, 0xec, 0x58, 0x0f, 0x7e, 0xa4, 0xbd, ++ 0x6c, 0xd9, 0x1f, 0x94, 0xc9, 0x3e, 0xb3, 0x53, 0x0d, 0x53, 0xf8, 0x7b, ++ 0x3b, 0xf7, 0x7d, 0x1b, 0xd1, 0xb4, 0x7c, 0x6b, 0xa8, 0x29, 0x9c, 0x87, ++ 0x2f, 0x40, 0xbd, 0x2a, 0xba, 0x38, 0x0f, 0x92, 0x47, 0x86, 0x5b, 0xf3, ++ 0x88, 0x5d, 0x6e, 0x23, 0xfc, 0x80, 0x1b, 0x99, 0x8c, 0x9b, 0x7c, 0xfa, ++ 0xa2, 0x72, 0x4c, 0xd9, 0xe2, 0xd7, 0x3b, 0xdf, 0x23, 0xbf, 0x7b, 0xde, ++ 0x1f, 0xe5, 0x9c, 0x1b, 0x5e, 0xf2, 0x6d, 0x73, 0x13, 0x79, 0xb7, 0x70, ++ 0xaa, 0x76, 0x7f, 0xbf, 0xfd, 0xcc, 0x58, 0x09, 0xad, 0xc1, 0x12, 0xfb, ++ 0x3b, 0x1f, 0xad, 0x30, 0x52, 0x2f, 0xd3, 0x56, 0xe4, 0x77, 0x04, 0x8b, ++ 0xed, 0x6b, 0xed, 0xa8, 0xb5, 0xff, 0xaf, 0x9b, 0xf9, 0x16, 0x48, 0x1b, ++ 0xaa, 0xec, 0xff, 0x77, 0xa2, 0x3a, 0x75, 0x69, 0xad, 0x1f, 0xbd, 0xcc, ++ 0xd1, 0x9f, 0x32, 0xe5, 0x3d, 0xc1, 0x4b, 0x7b, 0xfa, 0xd7, 0x38, 0xe0, ++ 0x0f, 0x92, 0x22, 0x47, 0xb2, 0xdf, 0x42, 0xba, 0xfc, 0x9e, 0xde, 0xca, ++ 0x8f, 0xec, 0xe9, 0xb7, 0xdf, 0x31, 0xb3, 0xbf, 0x85, 0x55, 0xb3, 0xdc, ++ 0x49, 0xbe, 0x52, 0x1c, 0x29, 0xe4, 0xef, 0x1d, 0xcb, 0x73, 0xb0, 0x95, ++ 0x3c, 0xb8, 0xe5, 0xaa, 0x27, 0x70, 0x3e, 0xe5, 0x24, 0xb7, 0x8c, 0x06, ++ 0x0e, 0xb3, 0xbf, 0x53, 0x31, 0x15, 0xa7, 0x47, 0xfa, 0x02, 0x87, 0xec, ++ 0xbe, 0xdf, 0x40, 0xef, 0xb8, 0xc4, 0x9f, 0x56, 0xc6, 0x9f, 0xf3, 0xc4, ++ 0x01, 0x69, 0x2b, 0x6a, 0xa9, 0x86, 0x9e, 0x69, 0x87, 0x31, 0xa5, 0x3a, ++ 0x6a, 0x71, 0x07, 0xe3, 0xec, 0x0b, 0xb1, 0x6e, 0xb8, 0x96, 0xe9, 0x5d, ++ 0x3f, 0x60, 0x2c, 0x2f, 0x0e, 0xe9, 0xb5, 0xef, 0x2a, 0x6d, 0x98, 0x60, ++ 0xfd, 0x29, 0x59, 0x7b, 0x49, 0xcb, 0xb7, 0x82, 0xee, 0xc4, 0x31, 0xe6, ++ 0x00, 0xcf, 0x93, 0xcf, 0x9e, 0x6f, 0x28, 0x44, 0x8a, 0x39, 0xc1, 0x73, ++ 0x31, 0x37, 0xbe, 0x45, 0xee, 0xf3, 0xcd, 0x11, 0x79, 0x9f, 0xac, 0x19, ++ 0x4d, 0x31, 0x59, 0xef, 0xf7, 0xe0, 0x91, 0xc3, 0x1e, 0xda, 0xb6, 0x65, ++ 0xf5, 0x9a, 0x57, 0xd0, 0x9f, 0x64, 0xbd, 0x49, 0x9e, 0x05, 0x86, 0x71, ++ 0xd3, 0x40, 0x19, 0xbe, 0x79, 0xd8, 0x8b, 0x17, 0x63, 0x06, 0xe2, 0xac, ++ 0xf7, 0x42, 0xcc, 0x87, 0x01, 0xf2, 0xa6, 0xa7, 0x99, 0x1f, 0xed, 0xe2, ++ 0xb9, 0x7c, 0x77, 0x2a, 0xc7, 0xa8, 0x45, 0x2c, 0x75, 0x12, 0x05, 0x03, ++ 0x57, 0x62, 0xf3, 0xda, 0xc7, 0xa0, 0x0e, 0x9c, 0xe0, 0x71, 0x3d, 0x7a, ++ 0x0e, 0x5f, 0x8f, 0xc4, 0x48, 0x08, 0x89, 0xc3, 0x2f, 0xa3, 0x7f, 0x44, ++ 0xc6, 0x25, 0xdf, 0x0f, 0x92, 0x3d, 0x5c, 0x06, 0x16, 0x0f, 0xc8, 0x3a, ++ 0xae, 0xf4, 0x53, 0xc6, 0xbe, 0xff, 0xd4, 0xf6, 0x7f, 0x61, 0x6d, 0xfe, ++ 0x0b, 0x69, 0xfb, 0xb1, 0x4f, 0x69, 0x5f, 0x74, 0x25, 0xcf, 0xfa, 0x5b, ++ 0x11, 0x1b, 0x90, 0x6f, 0x51, 0xb8, 0xd9, 0x66, 0x21, 0x1c, 0xa1, 0xcc, ++ 0xda, 0x22, 0xc6, 0x84, 0x3d, 0x8a, 0xd1, 0x52, 0xa0, 0x9c, 0xc7, 0x9e, ++ 0xb4, 0x7c, 0x8f, 0x22, 0x97, 0x31, 0x94, 0x3a, 0x0c, 0xe8, 0xda, 0x0f, ++ 0x68, 0x3b, 0x2b, 0xc8, 0xb7, 0xde, 0x30, 0xaf, 0x26, 0x2f, 0x13, 0xfd, ++ 0xe5, 0xe2, 0xa5, 0x41, 0x37, 0xb1, 0x29, 0x84, 0xec, 0xbb, 0x89, 0x85, ++ 0xf8, 0x67, 0xe6, 0x03, 0x4f, 0xc4, 0xea, 0x32, 0x86, 0xa3, 0x5a, 0xde, ++ 0x7d, 0xb4, 0xaf, 0x9d, 0x8a, 0xb5, 0xe3, 0x10, 0xe5, 0x7d, 0x21, 0x76, ++ 0x91, 0xf3, 0xd3, 0x41, 0xfd, 0x8b, 0xbe, 0xa3, 0x33, 0xba, 0xee, 0xa3, ++ 0xae, 0x2b, 0xf1, 0x6c, 0xec, 0x6b, 0xf8, 0x26, 0xe5, 0x7f, 0x64, 0xd0, ++ 0x08, 0x2f, 0x52, 0x4e, 0xe2, 0x58, 0x32, 0x17, 0xa7, 0xd9, 0xf6, 0x16, ++ 0xd3, 0x89, 0x69, 0xe9, 0x8b, 0xb8, 0x9c, 0x66, 0xde, 0xf5, 0xee, 0xf2, ++ 0x93, 0x8c, 0x4f, 0xb9, 0xf8, 0xe7, 0x41, 0x79, 0xff, 0xaf, 0x84, 0x7d, ++ 0x88, 0x7e, 0x7c, 0x76, 0xee, 0xd5, 0xc3, 0x38, 0xb0, 0xba, 0xe1, 0x24, ++ 0x76, 0x27, 0xe5, 0xda, 0x06, 0xe2, 0xfe, 0x05, 0x38, 0x02, 0x39, 0xd8, ++ 0xe2, 0x69, 0xa0, 0xad, 0x33, 0xff, 0x48, 0x7d, 0x63, 0x5e, 0x96, 0x97, ++ 0xfd, 0xb7, 0x79, 0xf2, 0x2e, 0xdc, 0xa9, 0x58, 0x2e, 0x9e, 0x63, 0x9d, ++ 0xcd, 0xc4, 0x8a, 0xec, 0x33, 0x30, 0xc6, 0x1c, 0xf2, 0x85, 0x14, 0xfb, ++ 0x88, 0xd9, 0x6d, 0xcc, 0x53, 0x0e, 0xd0, 0x0f, 0x4b, 0x96, 0xcd, 0x53, ++ 0x12, 0x3c, 0x8f, 0x27, 0x5e, 0x26, 0xa7, 0xcd, 0xea, 0xf0, 0x90, 0xd9, ++ 0x8e, 0x64, 0xea, 0xbf, 0xcf, 0xbb, 0xfc, 0xec, 0x46, 0xf0, 0x5b, 0xde, ++ 0xc3, 0x31, 0x66, 0xbe, 0xc1, 0x70, 0xf9, 0x19, 0xe5, 0x77, 0xd2, 0xc5, ++ 0xe4, 0x95, 0xf9, 0xb4, 0xb5, 0x9c, 0x88, 0x87, 0xf1, 0xb4, 0x7d, 0xa9, ++ 0x86, 0x7d, 0xd7, 0x3c, 0x43, 0x72, 0xaf, 0x39, 0x7f, 0xdd, 0xf0, 0x32, ++ 0xfb, 0x29, 0x8e, 0x94, 0x86, 0x4e, 0xd9, 0xfb, 0xda, 0x02, 0xd7, 0x94, ++ 0xa3, 0x78, 0xd8, 0xde, 0x4b, 0x81, 0xb7, 0x62, 0x65, 0x91, 0xb2, 0x50, ++ 0x09, 0x5e, 0x08, 0x5c, 0xc0, 0xc0, 0x98, 0x13, 0xc5, 0xe4, 0xa2, 0x45, ++ 0xe4, 0x00, 0xee, 0x51, 0x8d, 0x1c, 0xf5, 0x4a, 0x54, 0x8c, 0x2e, 0x80, ++ 0x77, 0xb4, 0x12, 0x25, 0xe4, 0x67, 0x85, 0x01, 0xcb, 0xfa, 0xe5, 0x32, ++ 0xcb, 0x5a, 0xc2, 0x23, 0x8f, 0xc7, 0xb9, 0x80, 0xf8, 0x69, 0x18, 0x75, ++ 0xb6, 0xbf, 0x1a, 0xa8, 0xb7, 0xff, 0x37, 0xd3, 0xd7, 0xbb, 0x02, 0x8b, ++ 0x27, 0xbf, 0x16, 0xa8, 0x9e, 0x2c, 0x87, 0x3a, 0x3c, 0x1f, 0x0e, 0xb6, ++ 0xf5, 0xe7, 0xd7, 0x58, 0x68, 0x36, 0x65, 0x5d, 0xca, 0xde, 0xd7, 0x43, ++ 0x7e, 0xd8, 0x1f, 0x30, 0x26, 0x1f, 0xc3, 0x8d, 0xe4, 0x15, 0xee, 0x61, ++ 0x2f, 0xfb, 0x51, 0x98, 0xef, 0x38, 0x33, 0x0b, 0xc9, 0x4f, 0xae, 0x5e, ++ 0x66, 0xbf, 0xe3, 0x23, 0xdf, 0x70, 0x41, 0xdb, 0xe4, 0x49, 0xdc, 0xca, ++ 0x32, 0x85, 0xc3, 0xaf, 0x22, 0x9e, 0x7e, 0x0d, 0x03, 0x69, 0x89, 0x27, ++ 0x19, 0xdc, 0xcc, 0xb6, 0xf3, 0x87, 0x5b, 0xb0, 0x65, 0x72, 0x0d, 0x36, ++ 0x4f, 0xca, 0x3a, 0xdf, 0x14, 0x56, 0x4f, 0x7e, 0x0d, 0x9b, 0x26, 0x67, ++ 0xfd, 0x55, 0x9e, 0xdb, 0xaf, 0x81, 0xbc, 0xf7, 0xe7, 0x26, 0xb6, 0xc8, ++ 0x7b, 0x7c, 0x2a, 0xfd, 0xb0, 0x89, 0xf6, 0xfd, 0x78, 0x22, 0x8a, 0x8d, ++ 0x93, 0x82, 0xb9, 0xdb, 0xd1, 0x3b, 0x29, 0x6b, 0xe5, 0xdf, 0x08, 0x2c, ++ 0x9a, 0x7c, 0x0d, 0x4d, 0x93, 0xc9, 0x40, 0xcd, 0xe4, 0x61, 0xca, 0x1d, ++ 0xa3, 0x6c, 0x83, 0x81, 0xaa, 0xc9, 0x91, 0x40, 0xed, 0xe4, 0x81, 0x80, ++ 0x7f, 0xb2, 0x15, 0xbb, 0x26, 0xd7, 0x61, 0xe7, 0x64, 0x27, 0x76, 0x4c, ++ 0x0a, 0x6e, 0x4f, 0x63, 0xd5, 0xe4, 0x1b, 0x58, 0x39, 0xf9, 0x3c, 0x9a, ++ 0x27, 0xcf, 0x60, 0xc5, 0xe4, 0xcb, 0x68, 0x99, 0x7c, 0x95, 0x63, 0x91, ++ 0xb5, 0x77, 0x59, 0x77, 0x9f, 0x7d, 0x4e, 0x3a, 0x77, 0x2f, 0xba, 0xec, ++ 0xb3, 0x93, 0x77, 0xf0, 0x64, 0x0e, 0x5d, 0x58, 0xab, 0x9d, 0x43, 0xdf, ++ 0x7e, 0xf9, 0x06, 0x5e, 0x9d, 0xd6, 0x0b, 0x79, 0x06, 0xfe, 0xb2, 0xbc, ++ 0x93, 0x41, 0x1b, 0x9b, 0xbb, 0xef, 0x5a, 0xd7, 0xa6, 0x2f, 0x3d, 0x33, ++ 0x96, 0x77, 0xe1, 0x24, 0xf6, 0x9c, 0x67, 0x9e, 0xfa, 0xbe, 0x15, 0xd6, ++ 0xa4, 0xac, 0xbc, 0xa3, 0x27, 0xf6, 0x70, 0x0e, 0x0f, 0xef, 0x3f, 0x4f, ++ 0xbe, 0x33, 0x45, 0x3e, 0xa3, 0xe0, 0xbd, 0x1a, 0xf9, 0x3e, 0x92, 0x8f, ++ 0xd8, 0x74, 0x0e, 0x89, 0x71, 0x72, 0xad, 0x83, 0xe2, 0x87, 0xed, 0xf4, ++ 0xc3, 0x29, 0xf1, 0xc9, 0x28, 0x31, 0xf9, 0xcb, 0x85, 0xd8, 0x8e, 0xe7, ++ 0x52, 0x39, 0xc8, 0x1c, 0xce, 0xc7, 0x33, 0x23, 0x51, 0xe6, 0xee, 0xf2, ++ 0xcd, 0x18, 0x83, 0xb9, 0x69, 0x3e, 0x5e, 0xe5, 0xb5, 0xa9, 0x41, 0xf8, ++ 0xbc, 0x86, 0xdf, 0xbb, 0x90, 0xe7, 0xa7, 0x93, 0x53, 0xe4, 0x34, 0x5d, ++ 0x98, 0xe6, 0x7f, 0xc9, 0xf9, 0x81, 0x5e, 0x24, 0x93, 0xa2, 0xcf, 0x56, ++ 0xea, 0x53, 0x70, 0x51, 0xef, 0x6a, 0x26, 0x1e, 0x5a, 0x8a, 0xe0, 0xa1, ++ 0xca, 0x7c, 0x44, 0xb8, 0x84, 0xfd, 0xcd, 0x19, 0x73, 0x40, 0x79, 0x19, ++ 0xcf, 0x1d, 0x56, 0xc9, 0x5b, 0x98, 0x37, 0x12, 0x2b, 0x8b, 0x43, 0x8a, ++ 0xb1, 0xda, 0x7f, 0x0e, 0xcf, 0x1c, 0x76, 0x32, 0x17, 0x71, 0x62, 0x8a, ++ 0x38, 0xe9, 0x88, 0xcb, 0xfe, 0x0b, 0x66, 0xe7, 0xc4, 0xbe, 0x0c, 0xb1, ++ 0x28, 0x63, 0x3f, 0x1f, 0x15, 0x6e, 0xf5, 0x23, 0xbb, 0x1f, 0x27, 0x65, ++ 0xef, 0x23, 0x96, 0xf6, 0x24, 0x7e, 0x8c, 0xe6, 0x64, 0xa1, 0xfd, 0x7e, ++ 0xe5, 0x9e, 0xc4, 0x1b, 0x48, 0xec, 0xaf, 0xc4, 0x7a, 0xfb, 0x1d, 0x4b, ++ 0x93, 0x9c, 0xdf, 0x8b, 0x3b, 0x26, 0x4c, 0xf2, 0xc0, 0x75, 0x58, 0x7b, ++ 0xe4, 0x36, 0x1e, 0xf3, 0x71, 0xeb, 0x91, 0x0e, 0xdc, 0x32, 0x11, 0x45, ++ 0xdb, 0x44, 0x1f, 0x8f, 0x0d, 0xf8, 0xe2, 0x50, 0x09, 0x52, 0x01, 0x0d, ++ 0x7b, 0x97, 0x6f, 0xc0, 0xcd, 0x07, 0x25, 0x8f, 0xdd, 0x88, 0x67, 0x88, ++ 0x3b, 0xb5, 0x81, 0x8d, 0x98, 0xb2, 0x7d, 0x51, 0xf6, 0xa8, 0x6e, 0xc4, ++ 0x8e, 0x41, 0x43, 0x1b, 0xc3, 0x46, 0xf4, 0xf0, 0xda, 0x90, 0x3d, 0x07, ++ 0x27, 0xd1, 0x38, 0xac, 0xe0, 0x83, 0x6b, 0x4f, 0xe2, 0xba, 0x43, 0xd2, ++ 0xf7, 0x05, 0x24, 0xf6, 0xb5, 0xb3, 0xcd, 0x0c, 0x5a, 0x27, 0x7e, 0x82, ++ 0x5b, 0x86, 0x70, 0x77, 0x09, 0x4a, 0xf0, 0x7c, 0xc0, 0xdf, 0x36, 0xa0, ++ 0xfc, 0xc4, 0x6e, 0x7b, 0x47, 0xe2, 0x35, 0x72, 0xb1, 0xf3, 0x78, 0x24, ++ 0xf5, 0x2a, 0xfa, 0x13, 0x73, 0xe7, 0x54, 0xe6, 0xf2, 0x6d, 0xc6, 0x83, ++ 0x57, 0x70, 0xf4, 0xf0, 0x34, 0xb1, 0xf7, 0x2c, 0x8f, 0x8f, 0xef, 0x47, ++ 0xc8, 0xbe, 0xff, 0x9c, 0xb5, 0x1b, 0x27, 0xc7, 0x37, 0xcb, 0xdf, 0xa2, ++ 0x56, 0x89, 0x91, 0xd9, 0x5d, 0x01, 0xbd, 0x33, 0xa8, 0x76, 0xd3, 0x67, ++ 0x65, 0xdd, 0x44, 0x6f, 0xfd, 0x01, 0xb9, 0x7b, 0x41, 0x48, 0xde, 0x47, ++ 0xd5, 0xc3, 0x37, 0x53, 0xdf, 0x79, 0x0f, 0xbd, 0x02, 0xe7, 0x43, 0x4e, ++ 0xe4, 0x32, 0x27, 0x0c, 0x04, 0xe4, 0x7b, 0x3e, 0xf2, 0xed, 0x98, 0x8c, ++ 0x9e, 0x2b, 0xdf, 0xf8, 0x88, 0x4f, 0x31, 0xf6, 0x67, 0x16, 0xe7, 0x40, ++ 0xde, 0x7f, 0xbf, 0x01, 0xed, 0x83, 0x61, 0xf4, 0x98, 0xf2, 0x6e, 0x57, ++ 0x76, 0xfc, 0x0b, 0x1b, 0x5e, 0x41, 0x2f, 0xe3, 0xcf, 0x06, 0x62, 0xe2, ++ 0x7a, 0xfb, 0xd9, 0xf6, 0x2b, 0xe8, 0x1b, 0x79, 0xc9, 0x2d, 0x7c, 0xa7, ++ 0xcf, 0x94, 0x3c, 0x53, 0x37, 0x3f, 0xfa, 0xed, 0xa0, 0x45, 0xb2, 0x27, ++ 0x90, 0x36, 0x91, 0x59, 0xec, 0xc2, 0x3b, 0x65, 0xd9, 0xef, 0xd7, 0x7c, ++ 0xd2, 0xb7, 0x9e, 0x3e, 0x6b, 0x7f, 0xeb, 0x49, 0xf6, 0x45, 0xc8, 0x77, ++ 0xc2, 0x9e, 0x8c, 0xc9, 0xf7, 0x3b, 0xd4, 0x46, 0x17, 0x54, 0x8f, 0x8b, ++ 0xbc, 0xf0, 0x0d, 0xb3, 0x1c, 0xbd, 0x1e, 0x0b, 0x37, 0x52, 0x96, 0x63, ++ 0xf5, 0x5f, 0x04, 0x4a, 0xa3, 0x6d, 0x2e, 0xfb, 0x9b, 0x30, 0xc7, 0xee, ++ 0xf8, 0xe3, 0x6f, 0xc2, 0xbc, 0x4d, 0x9c, 0x94, 0xf5, 0xb2, 0x3b, 0xf0, ++ 0x82, 0x1d, 0x13, 0x14, 0x14, 0x54, 0x5b, 0x56, 0x67, 0xc0, 0x87, 0x67, ++ 0x8d, 0x3a, 0x5f, 0xa9, 0xaa, 0x9b, 0x61, 0xe5, 0x9c, 0x15, 0xf5, 0x54, ++ 0x32, 0xbe, 0xfc, 0x47, 0xef, 0x32, 0xbc, 0x88, 0x5d, 0xfb, 0x82, 0xe4, ++ 0x8c, 0x1e, 0xca, 0x3f, 0x39, 0x6f, 0xf6, 0x1d, 0xd8, 0x9d, 0x76, 0xee, ++ 0xf1, 0x1b, 0x0f, 0xf2, 0xdf, 0xa6, 0x9f, 0xbd, 0x6d, 0x3f, 0x4b, 0x75, ++ 0x1b, 0x7f, 0x86, 0xda, 0xd2, 0x79, 0xd9, 0xf7, 0xd3, 0xec, 0xbd, 0xd2, ++ 0xf2, 0x9d, 0x94, 0x77, 0x66, 0xbe, 0x35, 0x26, 0x65, 0xa5, 0xde, 0xdb, ++ 0xf6, 0xf3, 0x5b, 0x97, 0xf1, 0xbe, 0xf5, 0xa6, 0xa7, 0x8c, 0x65, 0xff, ++ 0x72, 0xa6, 0xcd, 0xf3, 0xe2, 0x33, 0x66, 0x18, 0x72, 0x4d, 0xea, 0x88, ++ 0xae, 0x2e, 0xd7, 0xe9, 0x4d, 0x38, 0x88, 0x7b, 0x67, 0xac, 0x6e, 0x8f, ++ 0x8c, 0xa1, 0xf0, 0x63, 0x75, 0x54, 0xfb, 0xdb, 0x8f, 0x59, 0xfd, 0x8a, ++ 0x3c, 0x7f, 0xdc, 0x67, 0xc2, 0x5e, 0xaf, 0x2c, 0xc0, 0xb9, 0xd2, 0xec, ++ 0xda, 0xc2, 0x65, 0x19, 0xcb, 0xca, 0x65, 0xdf, 0x64, 0xae, 0x7d, 0x6e, ++ 0xf7, 0x6b, 0x5e, 0xae, 0xf7, 0x19, 0x4f, 0xb6, 0x9d, 0x32, 0xfb, 0x1d, ++ 0xb1, 0xaf, 0xdb, 0xbc, 0xc6, 0x31, 0x67, 0xdc, 0xe3, 0x9e, 0x8f, 0xf6, ++ 0xf3, 0xfb, 0x99, 0x7e, 0x55, 0xfb, 0x3d, 0xbb, 0xcb, 0x7d, 0x88, 0x5c, ++ 0x57, 0x97, 0x67, 0xeb, 0xe8, 0xc1, 0xb0, 0xdd, 0xbf, 0x8a, 0xe0, 0xfe, ++ 0xd9, 0x3e, 0xe9, 0x4f, 0xcb, 0x66, 0xdb, 0x98, 0xb2, 0x9f, 0x9d, 0xe5, ++ 0x32, 0x36, 0x9d, 0x6b, 0xd8, 0x8e, 0x1d, 0x31, 0xd1, 0xb3, 0x7c, 0x3b, ++ 0x94, 0x18, 0x6c, 0x73, 0x2d, 0x17, 0xfd, 0xed, 0x1a, 0x24, 0xb5, 0x28, ++ 0x0e, 0xd5, 0xcb, 0x33, 0x09, 0x17, 0x6d, 0x3a, 0x8a, 0x3c, 0x72, 0xdb, ++ 0x30, 0xaf, 0xc9, 0x9e, 0xa0, 0xa3, 0xa6, 0x1e, 0x7e, 0x12, 0x0f, 0xc2, ++ 0x71, 0x95, 0xbd, 0xf6, 0xd2, 0x92, 0x84, 0x5c, 0x37, 0x99, 0x9b, 0xcc, ++ 0x5d, 0xa9, 0xc8, 0xa3, 0xed, 0xd8, 0x7b, 0xd9, 0x4d, 0x79, 0x67, 0x72, ++ 0x20, 0x26, 0xef, 0xee, 0xd5, 0x45, 0xc8, 0x0f, 0xf1, 0x42, 0x4a, 0xf6, ++ 0x8f, 0xfc, 0xd6, 0x8a, 0x96, 0xcb, 0x3e, 0xd5, 0xb9, 0x75, 0x72, 0x88, ++ 0x4b, 0xfe, 0x60, 0xb1, 0xf2, 0xc7, 0xcf, 0x3e, 0x6e, 0xa5, 0xcd, 0x9c, ++ 0xb7, 0xdf, 0xb9, 0x94, 0xb3, 0x10, 0x9a, 0x12, 0xf2, 0x0d, 0x4c, 0x7d, ++ 0x6a, 0x35, 0xea, 0x32, 0x55, 0x0e, 0xe7, 0x0c, 0xff, 0x08, 0x62, 0x0d, ++ 0xed, 0x66, 0xa7, 0x3f, 0x68, 0xbf, 0x5b, 0x28, 0xdf, 0x3a, 0x79, 0x04, ++ 0x7a, 0xc7, 0xcf, 0x59, 0xfe, 0x8b, 0xe9, 0x17, 0xad, 0xa4, 0x47, 0xc6, ++ 0x34, 0xeb, 0xe3, 0xf2, 0xcc, 0x9b, 0x7a, 0x0c, 0x89, 0x7f, 0x14, 0xa2, ++ 0x34, 0x14, 0xa4, 0x1f, 0x4a, 0xfc, 0x96, 0xf7, 0x12, 0xf5, 0x03, 0x92, ++ 0x57, 0x35, 0xa5, 0xe5, 0xbd, 0x7b, 0xd9, 0x77, 0xae, 0xfb, 0xd6, 0x3a, ++ 0x6a, 0x67, 0xf6, 0x7f, 0xcf, 0xc6, 0xfb, 0x2d, 0xe5, 0x33, 0x7b, 0xd3, ++ 0x99, 0x07, 0xae, 0x61, 0x1e, 0x28, 0xd8, 0xd0, 0x6e, 0x63, 0x83, 0x66, ++ 0xe8, 0xc7, 0xfe, 0xcd, 0xd1, 0x8d, 0xef, 0x2f, 0x35, 0xba, 0x8e, 0xab, ++ 0x99, 0xa4, 0x97, 0x38, 0x71, 0xbd, 0x23, 0x3c, 0xc4, 0xff, 0xbe, 0x1f, ++ 0x11, 0x9b, 0x6f, 0xb5, 0xeb, 0xea, 0xb5, 0xeb, 0xd4, 0xd9, 0x77, 0xda, ++ 0xe5, 0x9d, 0x15, 0xbd, 0xed, 0x3b, 0x4a, 0x37, 0xb6, 0x05, 0x8c, 0xd6, ++ 0x4e, 0x45, 0x6f, 0xf9, 0x3b, 0x45, 0xf7, 0x05, 0x14, 0x29, 0x67, 0x7f, ++ 0xbb, 0xe8, 0x52, 0xec, 0x74, 0xb1, 0x8f, 0x23, 0x31, 0x3d, 0x38, 0x8f, ++ 0x65, 0xcf, 0x99, 0x86, 0xf7, 0x02, 0xdb, 0xfc, 0x29, 0x8f, 0x21, 0xd4, ++ 0x62, 0x85, 0xdd, 0x6e, 0x78, 0xb1, 0xcb, 0xfe, 0x7e, 0x6d, 0x1b, 0x63, ++ 0x82, 0xac, 0xa3, 0x44, 0xa0, 0xc5, 0x2b, 0x69, 0x62, 0x7a, 0xff, 0x97, ++ 0x10, 0xb5, 0xca, 0x8d, 0x5f, 0xd0, 0x4e, 0x0a, 0xe1, 0x09, 0x75, 0xa3, ++ 0x7a, 0xa9, 0xe1, 0x5d, 0xae, 0xda, 0xf5, 0x6b, 0xe5, 0xbb, 0x4c, 0x2b, ++ 0x38, 0xce, 0x11, 0x48, 0x1b, 0x19, 0x4b, 0xab, 0x2e, 0xb1, 0xeb, 0x2c, ++ 0x55, 0xbf, 0x00, 0xd7, 0xe7, 0x7e, 0x6d, 0x25, 0x35, 0x68, 0x65, 0x86, ++ 0xd4, 0x89, 0x0e, 0x69, 0xf8, 0x8f, 0xea, 0x09, 0xae, 0xfc, 0x9b, 0x85, ++ 0xf9, 0x52, 0x4f, 0x9e, 0x3b, 0xdd, 0x69, 0x3f, 0x77, 0xca, 0x37, 0xc4, ++ 0x1f, 0xf5, 0xf0, 0x57, 0xc9, 0x35, 0xf3, 0xed, 0xef, 0x9e, 0x49, 0x2c, ++ 0xd9, 0x40, 0x3c, 0xeb, 0x86, 0x16, 0xd0, 0xfb, 0xaf, 0x54, 0xe5, 0xdb, ++ 0x4e, 0x3f, 0x92, 0x7d, 0x4f, 0x07, 0x6a, 0xd4, 0xec, 0xfe, 0xa8, 0xc8, ++ 0xa7, 0x7e, 0x27, 0x8a, 0x7d, 0xe5, 0xcb, 0x33, 0xf4, 0x4a, 0xfb, 0xfd, ++ 0x9e, 0x0d, 0x31, 0xc7, 0xcc, 0x7e, 0xcf, 0xcb, 0xdf, 0x4f, 0x6d, 0x27, ++ 0xaf, 0xdf, 0x24, 0xdf, 0x4a, 0xe4, 0x58, 0x37, 0xc7, 0x64, 0x19, 0xed, ++ 0xff, 0x03, 0xc1, 0x98, 0xc9, 0x60, 0x70, 0x58, 0x00, 0x00, 0x00 }; + + static const u32 bnx2_CP_b06FwData[(0x84/4) + 1] = { + 0x00000000, 0x0000001b, 0x0000000f, 0x0000000a, 0x00000008, 0x00000006, +@@ -2136,50 +2148,52 @@ + 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002, + 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002, + 0x00000001, 0x00000001, 0x00000001, 0x00000000 }; +-static const u32 bnx2_CP_b06FwRodata[(0x130/4) + 1] = { +- 0x08001f1c, 0x08001da8, 0x08001ef8, 0x08001ed4, 0x08001eb0, 0x08001e8c, +- 0x08001e64, 0x08001e3c, 0x08001e10, 0x08002014, 0x08002004, 0x08001dc4, +- 0x08001dc4, 0x08001dc4, 0x08001f44, 0x08001f44, 0x08001dc4, 0x08001dc4, +- 0x08001ff4, 0x08001dc4, 0x08001dc4, 0x08001dc4, 0x08001dc4, 0x08001fe4, +- 0x08001dc4, 0x08001dc4, 0x08001dc4, 0x08001dc4, 0x08001dc4, 0x08001dc4, +- 0x08001dc4, 0x08001dc4, 0x08001dc4, 0x08001dc4, 0x08001dc4, 0x08001dc4, +- 0x08001dc4, 0x08001dc4, 0x08001fd4, 0x08001dc4, 0x08001dc4, 0x08001fc4, +- 0x08001dc4, 0x08001dc4, 0x08001dc4, 0x08001dc4, 0x08001dc4, 0x08001dc4, +- 0x08001dc4, 0x08001dc4, 0x08001dc4, 0x08001dc4, 0x08001dc4, 0x08001dc4, +- 0x08001dc4, 0x08001dc4, 0x08001dc4, 0x08001dc4, 0x08001dc4, 0x08001fac, +- 0x08001dc4, 0x08001dc4, 0x08001f9c, 0x08001f8c, 0x080031e8, 0x080031f0, +- 0x080031b8, 0x080031c4, 0x080031d0, 0x080031dc, 0x08005644, 0x08005604, +- 0x080055d0, 0x080055a4, 0x08005580, 0x0800553c, 0x00000000 }; ++static const u32 bnx2_CP_b06FwRodata[(0x154/4) + 1] = { ++ 0x08000f58, 0x08000db0, 0x08000fec, 0x08001094, 0x08000f80, 0x08000fc0, ++ 0x080011cc, 0x08000dcc, 0x080011f0, 0x08000e1c, 0x080014c0, 0x08001468, ++ 0x08000dcc, 0x08000dcc, 0x08000dcc, 0x0800127c, 0x0800127c, 0x08000dcc, ++ 0x08000dcc, 0x08001708, 0x08000dcc, 0x08000dcc, 0x08000dcc, 0x08000dcc, ++ 0x080013fc, 0x08000dcc, 0x08000dcc, 0x08000dcc, 0x08000dcc, 0x08000dcc, ++ 0x08000dcc, 0x08000dcc, 0x08000dcc, 0x08000dcc, 0x08000dcc, 0x08000dcc, ++ 0x08000dcc, 0x08000dcc, 0x08000dcc, 0x08000fe0, 0x08000dcc, 0x08000dcc, ++ 0x080016b8, 0x08000dcc, 0x08000dcc, 0x08000dcc, 0x08000dcc, 0x08000dcc, ++ 0x08000dcc, 0x08000dcc, 0x08000dcc, 0x08000dcc, 0x08000dcc, 0x08000dcc, ++ 0x08000dcc, 0x08000dcc, 0x08000dcc, 0x08000dcc, 0x08000dcc, 0x08000dcc, ++ 0x080015e4, 0x08000dcc, 0x08000dcc, 0x08001370, 0x080012e0, 0x08002eb0, ++ 0x08002eb8, 0x08002e80, 0x08002e8c, 0x08002e98, 0x08002ea4, 0x0800465c, ++ 0x08003ea8, 0x080045dc, 0x0800465c, 0x0800465c, 0x0800445c, 0x0800465c, ++ 0x080046a4, 0x080054cc, 0x0800548c, 0x08005458, 0x0800542c, 0x08005408, ++ 0x080053c4, 0x00000000 }; + + static struct fw_info bnx2_cp_fw_06 = { +- /* Firmware version: 4.0.5 */ +- .ver_major = 0x4, +- .ver_minor = 0x0, +- .ver_fix = 0x5, +- +- .start_addr = 0x08000078, ++ /* Firmware version: 5.0.0g */ ++ .ver_major = 0x5, ++ .ver_minor = 0x0, ++ .ver_fix = 0x0, ++ ++ .start_addr = 0x08000088, + + .text_addr = 0x08000000, +- .text_len = 0x59e4, ++ .text_len = 0x586c, + .text_index = 0x0, + .gz_text = bnx2_CP_b06FwText, + .gz_text_len = sizeof(bnx2_CP_b06FwText), + +- .data_addr = 0x08005b40, ++ .data_addr = 0x080059e0, + .data_len = 0x84, + .data_index = 0x0, + .data = bnx2_CP_b06FwData, + +- .sbss_addr = 0x08005bc4, +- .sbss_len = 0xe9, +- .sbss_index = 0x0, +- +- .bss_addr = 0x08005cb0, ++ .sbss_addr = 0x08005a64, ++ .sbss_len = 0xf1, ++ .sbss_index = 0x0, ++ ++ .bss_addr = 0x08005b58, + .bss_len = 0x5d8, + .bss_index = 0x0, + +- .rodata_addr = 0x080059e4, +- .rodata_len = 0x130, ++ .rodata_addr = 0x0800586c, ++ .rodata_len = 0x154, + .rodata_index = 0x0, + .rodata = bnx2_CP_b06FwRodata, + }; +@@ -2201,761 +2215,753 @@ + }; + + static u8 bnx2_RXP_b06FwText[] = { +- 0xec, 0x5b, 0x5d, 0x70, 0x5c, 0xd7, 0x5d, 0xff, 0xdf, 0xb3, 0x2b, 0x69, +- 0x2d, 0x4b, 0xf2, 0x95, 0xbc, 0x71, 0x56, 0xa9, 0x92, 0xec, 0x5a, 0x57, +- 0xd2, 0xa6, 0x12, 0xe1, 0xca, 0x6c, 0x12, 0x75, 0xd8, 0x69, 0xb6, 0xbb, +- 0xb2, 0xa3, 0xb4, 0x66, 0x46, 0x49, 0x0d, 0xcd, 0xb4, 0x65, 0x10, 0xbb, +- 0x0e, 0xa4, 0x0f, 0x0c, 0xc6, 0x40, 0x26, 0x80, 0xc1, 0xcb, 0x4a, 0x71, +- 0x94, 0x74, 0xad, 0xdd, 0xda, 0x0a, 0x86, 0x69, 0x61, 0x94, 0xd5, 0x87, +- 0x53, 0x66, 0xad, 0x4d, 0xcb, 0x4b, 0x99, 0xd6, 0xb1, 0xea, 0xb8, 0x26, +- 0x0f, 0x3c, 0xa4, 0x94, 0xce, 0x64, 0x20, 0x33, 0x35, 0xb2, 0x63, 0xfb, +- 0x81, 0x8f, 0xc0, 0x4c, 0x49, 0x20, 0x6e, 0x2e, 0xbf, 0xdf, 0xb9, 0xf7, +- 0xca, 0x2b, 0x45, 0xd0, 0x3c, 0xf0, 0x78, 0xcf, 0x8c, 0xe6, 0xde, 0x7b, +- 0xce, 0xff, 0xfc, 0xcf, 0xff, 0xfb, 0xe3, 0xac, 0xfd, 0x3b, 0x1d, 0xd2, +- 0x2e, 0xde, 0xe8, 0xc4, 0x5f, 0xea, 0xc8, 0x33, 0x47, 0x47, 0xef, 0x1f, +- 0xbd, 0x9f, 0xdf, 0x21, 0xc3, 0x08, 0xf3, 0x69, 0x48, 0x30, 0x82, 0x11, +- 0x8c, 0x60, 0x04, 0x23, 0x18, 0xc1, 0x08, 0x46, 0x30, 0x82, 0x11, 0x8c, +- 0x60, 0x04, 0x23, 0x18, 0xc1, 0x08, 0x46, 0x30, 0x82, 0x11, 0x8c, 0x60, +- 0x04, 0x23, 0x18, 0xc1, 0x08, 0x46, 0x30, 0x82, 0x11, 0x8c, 0x60, 0x04, +- 0x23, 0x18, 0xc1, 0x08, 0x46, 0x30, 0x82, 0x11, 0x8c, 0x60, 0x04, 0x23, +- 0x18, 0xc1, 0x08, 0x46, 0x30, 0x82, 0x11, 0x8c, 0x60, 0x04, 0x23, 0x18, +- 0xc1, 0x08, 0x46, 0x30, 0xfe, 0x3f, 0x47, 0x48, 0xc4, 0xe4, 0xb3, 0xd3, +- 0xfb, 0x93, 0x88, 0x4a, 0xc7, 0x8f, 0x66, 0x2d, 0x89, 0x84, 0xd2, 0x97, +- 0x9e, 0x2e, 0x58, 0x22, 0x99, 0xfa, 0x70, 0x3c, 0x27, 0x3f, 0x71, 0x8a, +- 0xd1, 0xb0, 0x70, 0xfe, 0xee, 0xf4, 0xad, 0xe3, 0xe7, 0x1f, 0x4a, 0xbc, +- 0xb3, 0x10, 0x92, 0x88, 0x99, 0x7e, 0x63, 0xd4, 0x1c, 0x94, 0x48, 0x1f, +- 0xf6, 0x7c, 0x6d, 0x68, 0x6d, 0x97, 0x74, 0xf9, 0xb8, 0x44, 0x6a, 0xe5, +- 0x84, 0x7d, 0x40, 0x86, 0xcd, 0x8b, 0x12, 0x96, 0x0c, 0xce, 0x58, 0xa9, +- 0x8b, 0x94, 0xca, 0x06, 0x71, 0x48, 0xa9, 0x1e, 0x91, 0x2b, 0x21, 0x42, +- 0x7d, 0xcb, 0xc8, 0x56, 0x3e, 0x70, 0x32, 0x61, 0x9c, 0x6b, 0xe1, 0xbd, +- 0xe1, 0xcf, 0x47, 0x44, 0xa5, 0x13, 0xc9, 0x6c, 0x68, 0x42, 0x6a, 0xf3, +- 0x8e, 0x33, 0x63, 0x7f, 0x0c, 0x38, 0x7a, 0x64, 0xc6, 0x72, 0xbf, 0xb3, +- 0xf6, 0xc7, 0xcd, 0x71, 0xb9, 0x13, 0x73, 0x21, 0x51, 0xd6, 0x5d, 0xf8, +- 0x8b, 0x1b, 0xb9, 0xd3, 0x5f, 0x36, 0xb2, 0x8b, 0x1d, 0x52, 0xaa, 0x38, +- 0x52, 0xb0, 0x25, 0x93, 0xb5, 0x77, 0x60, 0xfd, 0x03, 0xa7, 0xb0, 0xb1, +- 0x67, 0xd8, 0xcc, 0x49, 0x8b, 0x64, 0xa2, 0x31, 0xc0, 0xcc, 0x1b, 0xb9, +- 0xb3, 0x7f, 0xdd, 0x21, 0xed, 0xa0, 0x27, 0xc5, 0xef, 0x0f, 0x9c, 0x90, +- 0x65, 0x61, 0x9d, 0xe7, 0xe3, 0xbb, 0x41, 0xbc, 0x7c, 0x27, 0xce, 0x2b, +- 0xce, 0xf9, 0xa1, 0x98, 0x7c, 0xb3, 0x11, 0x95, 0x6f, 0x34, 0x4c, 0x79, +- 0xa5, 0xd1, 0x27, 0x17, 0x1a, 0x8e, 0xf3, 0x0d, 0xdb, 0x71, 0xde, 0xc0, +- 0xdf, 0x7f, 0xd8, 0x1b, 0x3c, 0x60, 0x14, 0x8d, 0xf1, 0xc6, 0x57, 0x3b, +- 0xa4, 0x2b, 0x11, 0x17, 0xd5, 0x21, 0xd3, 0x95, 0x98, 0xcc, 0x54, 0xca, +- 0xc6, 0x63, 0x67, 0xe7, 0x8c, 0xc9, 0xb3, 0x55, 0x9c, 0x19, 0xc6, 0x9c, +- 0x14, 0x4b, 0xf6, 0xcb, 0x46, 0xae, 0x31, 0x6b, 0x3c, 0x7e, 0xb6, 0x0b, +- 0x34, 0xf2, 0xfc, 0x3d, 0x46, 0xf6, 0xf4, 0x2d, 0xc9, 0xda, 0x94, 0x71, +- 0xc2, 0xfc, 0x3c, 0xc4, 0x9e, 0x2d, 0x93, 0xe6, 0x56, 0x8f, 0x5e, 0xc7, +- 0x51, 0x69, 0xe7, 0x78, 0x36, 0x65, 0x99, 0x25, 0x21, 0x7d, 0x7a, 0xee, +- 0x82, 0x4b, 0xf3, 0x8a, 0x91, 0x3d, 0xdb, 0x61, 0xe4, 0xce, 0x84, 0x41, +- 0x87, 0xf4, 0x85, 0x84, 0xfb, 0x06, 0x62, 0x79, 0xa9, 0xe3, 0x0c, 0x31, +- 0x55, 0x9a, 0x72, 0x05, 0xcd, 0xa0, 0xe5, 0x9b, 0x15, 0xf0, 0x50, 0x01, +- 0x0f, 0x15, 0xf2, 0x16, 0x97, 0xf3, 0x43, 0x3e, 0x6f, 0x8e, 0xf3, 0x77, +- 0x36, 0x69, 0x4f, 0xc4, 0x33, 0xca, 0xe7, 0xd3, 0x71, 0xfe, 0xdd, 0x26, +- 0xaf, 0xe4, 0xc7, 0x71, 0x5e, 0xb1, 0x63, 0xa0, 0xdd, 0xb9, 0xa0, 0xac, +- 0x32, 0x78, 0xb1, 0x80, 0x9f, 0xb2, 0x9e, 0x03, 0x0f, 0xb3, 0xe0, 0x6f, +- 0x05, 0xbc, 0x55, 0x41, 0xc7, 0x4f, 0x3b, 0xaf, 0x68, 0xe4, 0x86, 0x36, +- 0xe4, 0x15, 0xa7, 0x8c, 0xf3, 0x4b, 0x0a, 0xb2, 0xde, 0x29, 0xf9, 0x05, +- 0x53, 0xa6, 0x96, 0xfc, 0xfd, 0xbe, 0x1d, 0x1c, 0x91, 0x83, 0x95, 0x1e, +- 0xc8, 0x86, 0xb2, 0x4c, 0xd8, 0x22, 0x0e, 0x64, 0x54, 0x4a, 0x2a, 0x11, +- 0x23, 0x6f, 0x1f, 0xd7, 0xfa, 0x5f, 0xb2, 0x24, 0x93, 0xb7, 0x29, 0x47, +- 0x89, 0xe7, 0xed, 0x62, 0x2c, 0x0c, 0x7b, 0x5b, 0xb2, 0x8a, 0x66, 0x58, +- 0x28, 0xc7, 0x44, 0xec, 0xf7, 0x21, 0xcb, 0x27, 0xcb, 0x92, 0xf9, 0x74, +- 0xd9, 0x97, 0xb1, 0x2b, 0xdf, 0xcf, 0x94, 0x3f, 0xd5, 0x29, 0xed, 0xea, +- 0x9e, 0x16, 0xf9, 0x0d, 0xec, 0x25, 0xee, 0x4d, 0x7b, 0xb1, 0xcf, 0x85, +- 0x73, 0xf7, 0x26, 0x9e, 0x10, 0x21, 0x6c, 0xa9, 0xbf, 0x45, 0xfb, 0x88, +- 0x18, 0x59, 0xab, 0x18, 0x0b, 0x01, 0x2e, 0x2f, 0xa5, 0x51, 0x6f, 0xae, +- 0x25, 0x6b, 0xdd, 0x0a, 0xcd, 0xd8, 0x89, 0x78, 0x49, 0x6e, 0x85, 0x2e, +- 0xdb, 0x7a, 0x6e, 0x47, 0xd6, 0x72, 0x64, 0x19, 0xd8, 0x9f, 0x83, 0x3f, +- 0x5c, 0x04, 0x47, 0x5f, 0x2a, 0xeb, 0xf9, 0x4e, 0xec, 0x4f, 0xb6, 0x00, +- 0x67, 0xbb, 0x24, 0x92, 0x35, 0xcc, 0x5f, 0x76, 0xe7, 0xbb, 0x5d, 0xbc, +- 0xa5, 0xfe, 0x76, 0x8d, 0x5b, 0xe4, 0x65, 0x77, 0xfe, 0x0e, 0x17, 0x77, +- 0xe9, 0x3e, 0xcc, 0x03, 0xff, 0xe0, 0xc4, 0x90, 0xa1, 0xe7, 0x7b, 0xe9, +- 0x4f, 0xbf, 0x5e, 0xbe, 0x15, 0x5a, 0xb6, 0x1d, 0xc9, 0x8d, 0x0e, 0x4e, +- 0x0c, 0x1a, 0x2e, 0xbe, 0x13, 0xee, 0xbe, 0xbb, 0x5d, 0x7c, 0x83, 0x13, +- 0x49, 0xc3, 0xc5, 0xb7, 0x54, 0xd6, 0x7b, 0x25, 0x5f, 0x26, 0xec, 0xe0, +- 0x84, 0x65, 0xdc, 0x2d, 0x53, 0xdd, 0x83, 0x13, 0x7b, 0x0d, 0x75, 0xcf, +- 0x4e, 0x97, 0x8f, 0x84, 0x4f, 0xc3, 0x4e, 0x4d, 0x03, 0xcf, 0xd5, 0xf3, +- 0x03, 0x59, 0xab, 0x74, 0xdf, 0x4e, 0x7d, 0x3e, 0xcf, 0xd4, 0x73, 0xf7, +- 0x91, 0x2e, 0x9e, 0x5d, 0x18, 0xdd, 0x74, 0xee, 0xcf, 0xdc, 0x96, 0xcf, +- 0x76, 0x67, 0xf2, 0x3c, 0x89, 0x84, 0xd3, 0xe1, 0xd1, 0x99, 0xf2, 0x11, +- 0xc9, 0x56, 0xe2, 0x32, 0x3d, 0xb2, 0x43, 0xa6, 0xcc, 0xfe, 0xa9, 0x83, +- 0xc2, 0xd8, 0x13, 0x19, 0x2d, 0x78, 0x3a, 0xcc, 0x89, 0x21, 0xd3, 0xe0, +- 0xf1, 0x60, 0x5d, 0x22, 0x06, 0xe0, 0xfb, 0xeb, 0x61, 0x79, 0xbe, 0x61, +- 0x48, 0xab, 0xf6, 0xcf, 0x84, 0xb9, 0x06, 0x3b, 0x7c, 0xb6, 0x42, 0x3b, +- 0xa6, 0xcd, 0x4a, 0xa6, 0x06, 0x3b, 0xbd, 0xa0, 0x7d, 0xb5, 0x9d, 0x7a, +- 0x2d, 0x16, 0x05, 0xae, 0x98, 0xb6, 0xcc, 0x9a, 0xb4, 0x49, 0x66, 0x52, +- 0x8a, 0x5c, 0xf7, 0x7c, 0x27, 0xb6, 0x28, 0xdf, 0x85, 0x0d, 0x88, 0x99, +- 0x4d, 0x71, 0x9e, 0xf0, 0x4d, 0xb0, 0xa6, 0xeb, 0x77, 0x21, 0xf8, 0x5d, +- 0x21, 0x45, 0x58, 0x29, 0xea, 0x58, 0xd1, 0x80, 0x2d, 0x36, 0xee, 0xee, +- 0x74, 0x63, 0x5d, 0x04, 0xfe, 0xd9, 0x01, 0x1f, 0xbf, 0x07, 0xfe, 0xd7, +- 0x67, 0x64, 0xcf, 0x38, 0x0e, 0x62, 0x4f, 0x54, 0x09, 0xfd, 0x0f, 0xbe, +- 0xde, 0xe0, 0x5a, 0x07, 0xe6, 0xc5, 0x9c, 0xb6, 0xbb, 0xc1, 0x9f, 0xe3, +- 0x4c, 0xd8, 0x71, 0x29, 0xd9, 0xbb, 0xb0, 0xaf, 0x45, 0xba, 0x2d, 0xda, +- 0x3b, 0x7d, 0x7a, 0x27, 0xce, 0x33, 0xf8, 0xdd, 0x85, 0xf3, 0x3a, 0x31, +- 0x17, 0x9b, 0xa6, 0x1f, 0xa7, 0x18, 0xb3, 0xdc, 0xf8, 0x29, 0x72, 0x15, +- 0xb4, 0x72, 0x8f, 0x86, 0x8b, 0xb4, 0xa5, 0x53, 0x72, 0xa3, 0xdc, 0x2b, +- 0x57, 0xa2, 0xe4, 0x1f, 0x38, 0x2b, 0x88, 0x87, 0x51, 0x03, 0xf4, 0x93, +- 0x6e, 0xc6, 0xbf, 0xdd, 0xde, 0xb7, 0x71, 0xaf, 0x7b, 0x86, 0x98, 0xa1, +- 0x74, 0x97, 0xe4, 0xf4, 0x9c, 0x28, 0x35, 0xba, 0xd3, 0x5b, 0xef, 0x32, +- 0x0e, 0x9c, 0x51, 0x32, 0xf4, 0x20, 0x62, 0x16, 0xce, 0xba, 0x6c, 0x39, +- 0xce, 0x65, 0xfb, 0xc7, 0xf0, 0x79, 0x25, 0x2d, 0xd6, 0x7a, 0x97, 0xb4, +- 0x43, 0x9e, 0x15, 0xa3, 0x49, 0x86, 0x31, 0x39, 0x51, 0xe1, 0x9e, 0xa2, +- 0x84, 0x2d, 0xc2, 0x10, 0xfe, 0x47, 0x80, 0x0b, 0x49, 0x1b, 0x7c, 0xf1, +- 0xa2, 0x1d, 0x25, 0xbd, 0xbb, 0x5c, 0xf8, 0x6e, 0x9c, 0x41, 0xda, 0xe9, +- 0x7b, 0x8e, 0xf6, 0xbd, 0x6c, 0x48, 0x65, 0xc6, 0xe7, 0xe1, 0x49, 0x23, +- 0x94, 0x77, 0xb6, 0x1b, 0xa1, 0x5f, 0xa6, 0x87, 0x8a, 0xa6, 0xd2, 0xba, +- 0x16, 0xc9, 0x95, 0xef, 0x95, 0x19, 0x1b, 0xe7, 0x59, 0x61, 0xd0, 0xcc, +- 0x38, 0x33, 0x50, 0x0c, 0x29, 0x78, 0x58, 0x0f, 0x65, 0xe5, 0xd3, 0xfa, +- 0x16, 0xce, 0x2b, 0x1a, 0x61, 0x8b, 0x67, 0xfc, 0xb2, 0x27, 0x1f, 0xda, +- 0x9d, 0x2d, 0xd9, 0x72, 0x07, 0xbf, 0x41, 0x47, 0xbb, 0xa6, 0x23, 0x94, +- 0xd6, 0xba, 0x33, 0x54, 0xda, 0x8f, 0xff, 0x04, 0xdd, 0x84, 0x07, 0x7c, +- 0x70, 0xaf, 0x85, 0xbd, 0x11, 0xd0, 0xd8, 0xd9, 0x44, 0x7f, 0x3b, 0xe1, +- 0x21, 0xab, 0x88, 0x77, 0x86, 0xe6, 0xdb, 0x70, 0xf9, 0xf6, 0x65, 0xf5, +- 0x2a, 0x64, 0xf5, 0xbe, 0x33, 0xb4, 0x8f, 0x38, 0x52, 0xc0, 0x01, 0xb9, +- 0x9b, 0x8c, 0x57, 0x8c, 0x51, 0xe6, 0x06, 0x2e, 0xf8, 0x81, 0x0a, 0xa5, +- 0x3b, 0x24, 0x67, 0xea, 0x1c, 0x00, 0xd8, 0x31, 0xd1, 0x31, 0xde, 0x22, +- 0x8f, 0xde, 0xb7, 0x95, 0xd0, 0x76, 0x93, 0xaf, 0x32, 0x0f, 0xfc, 0x31, +- 0x68, 0x5b, 0x4b, 0x28, 0xcd, 0x5a, 0x07, 0x64, 0x2e, 0x91, 0x96, 0xf4, +- 0x1b, 0xb2, 0x5c, 0x56, 0x7b, 0x5a, 0x65, 0x97, 0x4c, 0x42, 0x46, 0xb5, +- 0x31, 0xe4, 0xaf, 0x91, 0x0e, 0x09, 0xdd, 0xcf, 0x3c, 0x10, 0x03, 0xad, +- 0x6b, 0x09, 0x53, 0x6e, 0x39, 0x6a, 0x10, 0xfb, 0x47, 0xa0, 0x87, 0x43, +- 0xd4, 0xa9, 0xf2, 0xe0, 0x08, 0x13, 0xa2, 0xcc, 0x7b, 0x5a, 0x85, 0xb8, +- 0xb9, 0x36, 0x1c, 0x33, 0x85, 0xf3, 0xc8, 0x95, 0x93, 0xdc, 0x4b, 0xfe, +- 0xdc, 0x3d, 0x1f, 0xe6, 0xcf, 0x5f, 0xa7, 0xcc, 0x28, 0x3b, 0xd8, 0x18, +- 0x78, 0xcc, 0xda, 0xbf, 0xe0, 0xc9, 0xe6, 0x4e, 0xb9, 0x62, 0x8a, 0x51, +- 0xb3, 0xef, 0x68, 0x92, 0x1f, 0x79, 0xee, 0xde, 0xc2, 0x33, 0x71, 0x6c, +- 0xcf, 0xf7, 0xe1, 0x2a, 0xcf, 0x74, 0xcf, 0x9e, 0xb1, 0xd6, 0x12, 0x61, +- 0xd9, 0x2c, 0x5f, 0xe8, 0x52, 0x0a, 0x65, 0xda, 0x46, 0xab, 0xe4, 0x51, +- 0x8f, 0xd8, 0xfb, 0x10, 0x54, 0x1e, 0x57, 0x32, 0xfa, 0x20, 0x71, 0xfe, +- 0x23, 0x79, 0x1a, 0x8b, 0x2b, 0x43, 0xf2, 0x3a, 0xf7, 0xfb, 0xfa, 0xe2, +- 0x5c, 0xb3, 0x6d, 0xbf, 0xea, 0xd9, 0xf6, 0xfb, 0xce, 0xe8, 0x3e, 0x5f, +- 0xef, 0x90, 0xd7, 0x87, 0xf6, 0x08, 0xf4, 0xfc, 0x7f, 0xed, 0xa1, 0xad, +- 0x44, 0xb6, 0xec, 0x29, 0x6e, 0xb3, 0x67, 0xb7, 0xc8, 0x2f, 0xd1, 0x87, +- 0xba, 0xbd, 0x98, 0xe1, 0xfb, 0x94, 0x8f, 0x07, 0xba, 0xd1, 0xb6, 0xca, +- 0xb9, 0xed, 0x7c, 0x91, 0x38, 0x88, 0x8b, 0x7b, 0x09, 0xe3, 0xe7, 0x54, +- 0xa8, 0x43, 0xb6, 0xcd, 0xab, 0x18, 0x13, 0x78, 0x57, 0x88, 0x43, 0xcd, +- 0xf9, 0x95, 0x73, 0x26, 0xbe, 0xc7, 0xf1, 0xb4, 0x24, 0x5f, 0xa7, 0x3f, +- 0x71, 0x3f, 0xf3, 0xed, 0x4d, 0x2f, 0x7e, 0x76, 0x4c, 0x85, 0xd3, 0x51, +- 0xc4, 0x4f, 0x99, 0x2c, 0x95, 0x8f, 0xa3, 0x26, 0x92, 0xe2, 0x5d, 0x69, +- 0xda, 0x47, 0xc7, 0x18, 0x62, 0xe4, 0x64, 0xa9, 0xce, 0xba, 0x08, 0x61, +- 0x0c, 0xfb, 0x90, 0xa3, 0x23, 0x6a, 0x2e, 0x52, 0xfc, 0x58, 0x9a, 0x71, +- 0x39, 0x2e, 0xf1, 0xfa, 0x3b, 0xa8, 0x3b, 0x4c, 0xc9, 0x6a, 0x5b, 0xfb, +- 0xb3, 0x5e, 0xd2, 0x5b, 0x42, 0x0d, 0x11, 0x4e, 0x4b, 0x58, 0xa5, 0x5b, +- 0x23, 0xd3, 0xa9, 0x0e, 0xd4, 0x5a, 0x13, 0xbd, 0x6a, 0xf5, 0x60, 0x6f, +- 0x68, 0x75, 0xcf, 0x54, 0x4b, 0xba, 0xd8, 0xab, 0xe6, 0x44, 0x16, 0xcb, +- 0xa2, 0x50, 0xd7, 0xc4, 0x0e, 0x0b, 0xbe, 0x57, 0x3f, 0xfb, 0x59, 0x95, +- 0x0e, 0x41, 0xb7, 0x72, 0x6c, 0x29, 0x15, 0x66, 0x0d, 0x19, 0x9f, 0x94, +- 0x63, 0xa8, 0x1b, 0x9f, 0x91, 0xe9, 0x32, 0xe8, 0xd2, 0x7c, 0xc7, 0xc0, +- 0x6f, 0x1f, 0x70, 0x93, 0xf6, 0x28, 0x62, 0xac, 0x4b, 0x3b, 0x68, 0xce, +- 0xe4, 0x58, 0x27, 0xa5, 0x98, 0x57, 0xde, 0x81, 0xfd, 0xd0, 0x5f, 0xfe, +- 0x59, 0x96, 0xad, 0x1d, 0x92, 0x77, 0xe3, 0x03, 0xed, 0x15, 0x6b, 0x37, +- 0xbd, 0xb5, 0x6b, 0x58, 0xa3, 0xfd, 0xee, 0x6c, 0xd2, 0xe1, 0x97, 0x75, +- 0xad, 0x73, 0xd9, 0xe6, 0x3b, 0x61, 0xff, 0x76, 0xd4, 0x85, 0x7d, 0x7d, +- 0x74, 0xd9, 0xfa, 0xdc, 0x2e, 0x69, 0x37, 0xa9, 0x37, 0x9c, 0x13, 0x65, +- 0x8c, 0xc5, 0xfa, 0x15, 0x0f, 0xd7, 0x5b, 0xc0, 0xd5, 0x41, 0xba, 0x31, +- 0xc2, 0x58, 0x07, 0x7d, 0xa8, 0x79, 0xf2, 0x1b, 0xb1, 0x86, 0xb0, 0xdf, +- 0xf1, 0x70, 0x7d, 0xab, 0x09, 0x17, 0xd7, 0xf8, 0xe4, 0x99, 0x38, 0xbb, +- 0x9d, 0xbc, 0x91, 0x1f, 0xea, 0x80, 0xfa, 0x48, 0x1a, 0x93, 0x88, 0xed, +- 0x93, 0x0d, 0x5d, 0xdb, 0x19, 0xb9, 0x0a, 0x6a, 0xae, 0xc6, 0x8b, 0xa0, +- 0x11, 0xb5, 0x58, 0x63, 0xd0, 0xab, 0xb7, 0x69, 0x47, 0x6b, 0xda, 0x1e, +- 0x19, 0x77, 0x4a, 0xda, 0xae, 0x2e, 0xb9, 0x76, 0x65, 0x51, 0x37, 0x97, +- 0x64, 0x6f, 0xbd, 0xba, 0xcb, 0xfd, 0xbf, 0xdb, 0xa6, 0x84, 0xb4, 0x3e, +- 0x99, 0xdf, 0x68, 0x63, 0x77, 0x22, 0xae, 0x3b, 0xef, 0x32, 0xcf, 0x4c, +- 0x32, 0x07, 0x4d, 0x32, 0x77, 0x18, 0x5e, 0x3c, 0x8c, 0x37, 0xe1, 0x88, +- 0x03, 0xc7, 0x8a, 0x67, 0xbf, 0x73, 0x1e, 0x2e, 0xbf, 0xfe, 0xf4, 0x63, +- 0xea, 0x9f, 0xdf, 0xb5, 0x79, 0x5d, 0x99, 0xee, 0x77, 0xab, 0x8e, 0xc7, +- 0xb0, 0x75, 0xd0, 0x1f, 0x9f, 0x52, 0xb0, 0xaf, 0x5c, 0xdd, 0xd5, 0x07, +- 0x7c, 0x1f, 0xb6, 0xc7, 0x57, 0x5f, 0xb7, 0x6e, 0xfd, 0xed, 0xca, 0x80, +- 0x3a, 0xcd, 0x90, 0xef, 0x4c, 0x98, 0xb4, 0x34, 0x26, 0xb0, 0x5f, 0x8e, +- 0x30, 0x37, 0xe6, 0xc1, 0xc7, 0x61, 0x73, 0xd8, 0x9c, 0x26, 0xee, 0xa8, +- 0x00, 0x27, 0x6a, 0xc9, 0x74, 0x9b, 0xa7, 0xe7, 0x6f, 0xf3, 0x7c, 0xe0, +- 0xde, 0xc9, 0x6f, 0x3c, 0xbf, 0xed, 0xd1, 0x73, 0xa3, 0xcb, 0xa5, 0xc7, +- 0x5f, 0x1f, 0x34, 0x37, 0x7f, 0xaf, 0xf4, 0x7a, 0xf2, 0xc4, 0xfb, 0x33, +- 0x1e, 0x5d, 0xd4, 0x4d, 0x33, 0x4d, 0xd4, 0xcb, 0xbb, 0xc0, 0xa3, 0x6b, +- 0x8d, 0xa2, 0x4a, 0xa3, 0x76, 0x49, 0x31, 0x67, 0x25, 0xc6, 0x32, 0x62, +- 0x41, 0x27, 0x09, 0x7b, 0x0a, 0xbb, 0x6e, 0x96, 0xa9, 0xe7, 0x5b, 0x88, +- 0xd5, 0xd4, 0xfb, 0x7b, 0x32, 0x53, 0xee, 0xb7, 0x5b, 0x0d, 0xfa, 0x6b, +- 0x22, 0xb9, 0x22, 0xc3, 0xf6, 0x8a, 0xae, 0xa1, 0x12, 0xf1, 0x13, 0x42, +- 0xd9, 0xde, 0x92, 0x01, 0x5d, 0xdb, 0xbc, 0x27, 0x16, 0xe4, 0x32, 0x59, +- 0x81, 0x8f, 0xed, 0xfb, 0x57, 0x47, 0xd7, 0xa4, 0x08, 0x6f, 0xd7, 0xb7, +- 0xc1, 0xf5, 0xba, 0xc6, 0x43, 0x7c, 0xcd, 0xb8, 0x0c, 0x69, 0xdb, 0xe7, +- 0xe3, 0xb3, 0x64, 0xb6, 0xe1, 0xe3, 0x0c, 0x23, 0x2e, 0x23, 0x06, 0xec, +- 0xfb, 0xbc, 0x67, 0x2f, 0x7c, 0xff, 0xbe, 0xc3, 0x5a, 0x48, 0xa5, 0xbf, +- 0xea, 0xcd, 0x7d, 0x8f, 0x32, 0xc0, 0xb7, 0x2f, 0xf7, 0x17, 0xbd, 0x78, +- 0x53, 0x34, 0x32, 0x0d, 0xca, 0x80, 0xb6, 0x02, 0xfd, 0x6b, 0xfb, 0x84, +- 0xcf, 0x54, 0x3e, 0x89, 0x98, 0xd5, 0xed, 0xd6, 0x0f, 0xe8, 0xaf, 0x32, +- 0x0d, 0xce, 0xad, 0xb5, 0x65, 0xed, 0x16, 0xcf, 0x97, 0x0e, 0x62, 0x6e, +- 0x12, 0x7f, 0x94, 0x1d, 0x61, 0x0e, 0xe1, 0x3d, 0xe3, 0xc1, 0xc9, 0x58, +- 0x16, 0xb9, 0x2b, 0x73, 0x68, 0x1c, 0xdf, 0x86, 0xd7, 0x67, 0x69, 0xb9, +- 0x57, 0x51, 0xab, 0x40, 0x9e, 0x03, 0xe0, 0x27, 0x2e, 0xe3, 0x0d, 0xe8, +- 0x7c, 0x23, 0x9e, 0x6d, 0xc0, 0x14, 0x6f, 0xc3, 0xb8, 0xb1, 0x6f, 0xbc, +- 0xf1, 0xa6, 0xc3, 0x78, 0xf0, 0x57, 0xda, 0x5f, 0xe2, 0xa0, 0xdd, 0xef, +- 0xd5, 0x32, 0xc6, 0x63, 0x95, 0x09, 0xe3, 0xf1, 0x0a, 0xf7, 0xa8, 0xaf, +- 0xf5, 0x88, 0x15, 0xcf, 0x2a, 0xd4, 0xa9, 0xfb, 0xba, 0x70, 0xe6, 0x09, +- 0xd8, 0x46, 0xd1, 0x98, 0x1c, 0xda, 0x25, 0xf9, 0x64, 0x0f, 0x68, 0x7e, +- 0x08, 0xcf, 0x56, 0xcc, 0xff, 0x3c, 0xe6, 0x61, 0x47, 0x49, 0xfa, 0xc7, +- 0x0e, 0xdd, 0x5b, 0x4e, 0x99, 0xa4, 0x71, 0xc0, 0xb3, 0xad, 0x37, 0x4d, +- 0xd7, 0x96, 0x9e, 0xc6, 0xf7, 0x4e, 0xcc, 0x7f, 0x01, 0x4f, 0xe4, 0xb2, +- 0x7d, 0xfe, 0x3c, 0x7d, 0x70, 0x0c, 0xf3, 0x0f, 0x00, 0xc7, 0x1f, 0xe0, +- 0xfd, 0x5e, 0xbc, 0xff, 0xde, 0x96, 0xbd, 0xbf, 0xcb, 0xb3, 0x31, 0x9f, +- 0xdd, 0x32, 0xef, 0xc7, 0x6f, 0x9e, 0x27, 0xd2, 0xbd, 0x0a, 0xc6, 0x57, +- 0x23, 0xb2, 0x7b, 0xa5, 0x5d, 0x54, 0xcd, 0x8d, 0xe1, 0xaa, 0x66, 0x4a, +- 0xcf, 0x0a, 0xe3, 0xf7, 0x0f, 0xb0, 0xc7, 0x12, 0xb5, 0x0a, 0xa5, 0x51, +- 0xb7, 0xda, 0x47, 0x9f, 0x39, 0xba, 0x77, 0x81, 0xcf, 0xe2, 0xd1, 0xd1, +- 0x3a, 0x61, 0xf8, 0x7e, 0xec, 0xe8, 0xde, 0xfa, 0x3f, 0x00, 0x16, 0x72, +- 0xa9, 0xf8, 0xf8, 0x09, 0x7f, 0x7e, 0xcb, 0x99, 0x5a, 0xb6, 0x38, 0x93, +- 0x7e, 0xff, 0xcc, 0xd1, 0x6c, 0x95, 0x75, 0x42, 0x22, 0x26, 0xba, 0x16, +- 0x2f, 0x1e, 0x2d, 0x20, 0x3f, 0x86, 0x34, 0x2d, 0xfe, 0x3a, 0xd7, 0xa8, +- 0x87, 0xed, 0x68, 0x23, 0x5d, 0xcd, 0x78, 0x98, 0x67, 0x88, 0xe7, 0x18, +- 0xf0, 0x24, 0x81, 0x87, 0xf9, 0xc6, 0xa5, 0x37, 0xbe, 0xb0, 0x1d, 0x6d, +- 0xc4, 0xc5, 0xb3, 0x7c, 0x7c, 0x3d, 0xa2, 0x56, 0x7e, 0x48, 0x7a, 0x4d, +- 0xd6, 0xb6, 0x6e, 0xac, 0x69, 0x91, 0xfc, 0x69, 0xe6, 0xec, 0x7d, 0xde, +- 0x37, 0xca, 0x18, 0xf4, 0xdc, 0x71, 0xc5, 0x79, 0x3e, 0xb1, 0x96, 0x62, +- 0xb9, 0x82, 0xef, 0x45, 0x1f, 0x56, 0x79, 0xb0, 0x9d, 0x4d, 0x7c, 0xb7, +- 0x78, 0xb2, 0xe6, 0x99, 0x7e, 0xef, 0xd9, 0x4c, 0x0b, 0x40, 0xa1, 0x87, +- 0xee, 0x0d, 0x3d, 0xf8, 0x7c, 0x62, 0x61, 0x95, 0xb4, 0x25, 0xc1, 0xab, +- 0x4f, 0xdb, 0x47, 0xd5, 0x1f, 0xf7, 0x26, 0xf1, 0xe7, 0x9f, 0xe7, 0xcb, +- 0x80, 0x74, 0xf1, 0x09, 0x5b, 0xfe, 0x50, 0xef, 0x9c, 0x84, 0xdf, 0xf1, +- 0x1e, 0xc4, 0x71, 0x96, 0x6d, 0xca, 0xbe, 0x0d, 0x7a, 0x27, 0x2f, 0x06, +- 0x7a, 0x09, 0xc5, 0x9a, 0x2e, 0xce, 0x9e, 0xf5, 0x49, 0xb9, 0x0a, 0x5c, +- 0x19, 0xf4, 0x95, 0x6e, 0x6f, 0x34, 0x85, 0xf8, 0xb8, 0x06, 0xfb, 0xbc, +- 0x6c, 0xf1, 0x3e, 0x26, 0xcc, 0x7c, 0x27, 0xa5, 0xfa, 0xbf, 0x00, 0x86, +- 0xf5, 0xd5, 0xed, 0xbb, 0x96, 0x05, 0xc0, 0x2c, 0x62, 0xed, 0x84, 0x1b, +- 0x97, 0x19, 0xdb, 0x1d, 0x85, 0xda, 0xa3, 0x60, 0xfd, 0xb7, 0xc3, 0x3a, +- 0xeb, 0x36, 0xec, 0x76, 0x77, 0x21, 0xc8, 0x39, 0xf3, 0x89, 0xd9, 0x05, +- 0xc4, 0xf0, 0xaa, 0xa5, 0x76, 0x2b, 0x6d, 0x91, 0x89, 0x2a, 0x62, 0x12, +- 0xba, 0xde, 0x44, 0x7c, 0x41, 0xfe, 0x53, 0xeb, 0xa1, 0xc5, 0x1a, 0x36, +- 0x7b, 0xd4, 0xe7, 0x68, 0x57, 0x9a, 0xf2, 0xd0, 0x29, 0xe4, 0xe5, 0x91, +- 0xc7, 0x90, 0x73, 0x20, 0xaf, 0x53, 0x45, 0x74, 0xf2, 0xb4, 0x91, 0x37, +- 0x7e, 0xab, 0x60, 0xb9, 0x7d, 0x80, 0xce, 0x67, 0xe2, 0xf2, 0x18, 0x3a, +- 0xd5, 0xa1, 0xe3, 0x4c, 0x5e, 0xc7, 0x9b, 0x7e, 0x73, 0x52, 0xb5, 0xa3, +- 0xc6, 0x40, 0x01, 0x8a, 0x0a, 0xc7, 0x1c, 0x14, 0xd9, 0x3b, 0x87, 0xb8, +- 0x82, 0x38, 0xbc, 0x77, 0x15, 0xd1, 0xed, 0x14, 0xe1, 0x95, 0x84, 0x4f, +- 0x85, 0xa4, 0xe5, 0x14, 0xef, 0x43, 0x64, 0x0f, 0xfa, 0x31, 0xe2, 0xdc, +- 0x1b, 0xc6, 0x73, 0x1c, 0x7f, 0xfb, 0x51, 0x5b, 0x99, 0xa8, 0x91, 0xb7, +- 0x81, 0x07, 0x2c, 0xf7, 0x6c, 0x07, 0x6f, 0x76, 0x4b, 0x7b, 0x04, 0x7b, +- 0x08, 0x1f, 0x06, 0x1d, 0x7b, 0x40, 0x8f, 0x7b, 0x3e, 0x71, 0x84, 0x4f, +- 0x89, 0xf4, 0xcf, 0x49, 0x8f, 0xd2, 0x7b, 0xc2, 0x52, 0x48, 0x71, 0xad, +- 0x03, 0xf0, 0xdc, 0x87, 0x35, 0xbd, 0xcf, 0xbd, 0x57, 0xca, 0xdf, 0xa6, +- 0x1b, 0x73, 0x06, 0xde, 0x51, 0x4f, 0xa5, 0x4c, 0xe9, 0xaf, 0xb9, 0xb0, +- 0x7b, 0x57, 0xbf, 0xd4, 0xcd, 0xbb, 0x29, 0x65, 0xb9, 0xb4, 0x29, 0xd4, +- 0xc4, 0x79, 0x48, 0x35, 0x3c, 0xc8, 0xfb, 0x19, 0xc2, 0xb0, 0xaf, 0x35, +- 0x35, 0x8c, 0x39, 0x48, 0xf9, 0xb9, 0x73, 0x4a, 0xfd, 0x6f, 0xf7, 0x2e, +- 0xcd, 0x35, 0x85, 0xf6, 0x15, 0xec, 0xff, 0x43, 0xed, 0x2b, 0xa2, 0xe2, +- 0x9e, 0xaf, 0xe0, 0x7b, 0x91, 0xdf, 0x7e, 0x2e, 0xfe, 0xed, 0xbb, 0xdc, +- 0x78, 0xef, 0xc8, 0xb4, 0xcd, 0x3b, 0x0c, 0x47, 0x2e, 0xdb, 0x45, 0xe3, +- 0x91, 0x4d, 0x75, 0x66, 0x52, 0xe7, 0xe7, 0x02, 0x64, 0xbf, 0x5e, 0xd7, +- 0x3d, 0x9b, 0x5c, 0xa9, 0x47, 0xe4, 0xea, 0x52, 0xbb, 0xac, 0x2f, 0xb8, +- 0x36, 0xbf, 0xbe, 0x40, 0x3b, 0x37, 0xe5, 0xed, 0x25, 0x0b, 0x6b, 0x49, +- 0xfc, 0xf5, 0xc8, 0xf5, 0xa5, 0xcd, 0x75, 0xe7, 0x85, 0xc6, 0xc3, 0xa0, +- 0xa5, 0x47, 0x42, 0x96, 0xa3, 0xfb, 0xaf, 0x1c, 0x72, 0x5f, 0x51, 0xc6, +- 0x25, 0x5f, 0xe9, 0x47, 0x0f, 0x88, 0xe4, 0x1c, 0x66, 0x0e, 0x82, 0xfe, +- 0x2b, 0x9f, 0x40, 0x6d, 0x92, 0x80, 0xf3, 0xf4, 0xeb, 0x7b, 0xc5, 0x4f, +- 0x85, 0x7b, 0xa4, 0xd5, 0xfa, 0xa3, 0x6e, 0x37, 0x57, 0x99, 0x6e, 0x9f, +- 0x6a, 0xf9, 0xf9, 0xfa, 0x75, 0xe0, 0x1e, 0x81, 0x9d, 0xd2, 0x36, 0x6d, +- 0xd8, 0xac, 0x29, 0xcb, 0x43, 0x89, 0x6a, 0x51, 0x18, 0x1f, 0x52, 0x38, +- 0xd3, 0xc0, 0xbe, 0x24, 0xe4, 0xb1, 0x43, 0xd7, 0x42, 0x19, 0x05, 0xdd, +- 0xce, 0xcd, 0x48, 0xbe, 0xf1, 0x9b, 0x98, 0xcf, 0xc8, 0x54, 0x63, 0x0c, +- 0x67, 0x9d, 0xa4, 0xdd, 0xf6, 0x48, 0x3b, 0xcf, 0x49, 0x81, 0xc6, 0x87, +- 0xa4, 0x70, 0x7a, 0x46, 0x0e, 0x57, 0x48, 0x27, 0xef, 0x19, 0x13, 0xc9, +- 0x9c, 0x0c, 0xc7, 0x97, 0x50, 0x3b, 0xb9, 0xfe, 0x98, 0x96, 0xc2, 0x19, +- 0xe0, 0xa8, 0xf0, 0x1e, 0xa0, 0x1f, 0x76, 0x33, 0xac, 0xfb, 0x9a, 0x29, +- 0x1d, 0x77, 0x38, 0xff, 0x43, 0xe8, 0xa9, 0xbf, 0xb8, 0x1f, 0x70, 0x79, +- 0xf4, 0x40, 0x93, 0xa8, 0x97, 0x17, 0x2b, 0xe8, 0xf7, 0xec, 0x10, 0x6b, +- 0x2f, 0xa5, 0xee, 0xef, 0x93, 0x5a, 0x65, 0xd8, 0x54, 0x8a, 0x35, 0x15, +- 0x75, 0xc1, 0x35, 0xfa, 0x77, 0x4c, 0x85, 0xad, 0x3e, 0x59, 0xaa, 0x14, +- 0xd1, 0x37, 0x2b, 0xef, 0x5e, 0x03, 0x16, 0x60, 0xb9, 0x71, 0x2f, 0xa3, +- 0xc8, 0x37, 0xea, 0xcf, 0xc6, 0x27, 0x41, 0x63, 0x26, 0x6e, 0xca, 0x71, +- 0xd0, 0x87, 0xf7, 0x45, 0xd8, 0xf8, 0x1c, 0x6b, 0xb8, 0x0c, 0xd6, 0xd2, +- 0x72, 0xe4, 0xec, 0x24, 0x68, 0xe8, 0x92, 0xfe, 0x3f, 0xa1, 0x8f, 0x3d, +- 0x81, 0x39, 0x7e, 0x27, 0x60, 0xaf, 0x5f, 0xc4, 0x3b, 0x61, 0x63, 0x78, +- 0x52, 0x0e, 0x7d, 0x78, 0x9a, 0xa0, 0x25, 0xe2, 0xf6, 0x26, 0x87, 0xe2, +- 0x52, 0x3b, 0xfd, 0xa0, 0x4c, 0x2d, 0x3e, 0x08, 0xfc, 0x3f, 0x42, 0x5f, +- 0x80, 0xfc, 0xb6, 0xc8, 0xb3, 0x58, 0xff, 0xf1, 0x9c, 0x9d, 0x3d, 0xda, +- 0x37, 0xe6, 0x38, 0xcf, 0xe7, 0x41, 0xec, 0x47, 0x8f, 0x51, 0xc9, 0x48, +- 0xa1, 0xc2, 0xb3, 0xa0, 0x3b, 0xd4, 0x53, 0xf9, 0xd3, 0x93, 0x9e, 0x8e, +- 0x7b, 0x24, 0x17, 0x2d, 0xb2, 0xbf, 0x40, 0x9e, 0x58, 0x18, 0xcd, 0x96, +- 0x13, 0x66, 0x56, 0x11, 0x57, 0x52, 0x98, 0x1b, 0xdc, 0xb9, 0x88, 0x58, +- 0x73, 0xe8, 0x6d, 0xd3, 0x5c, 0x3b, 0xee, 0xdd, 0x1d, 0x10, 0xd7, 0x9b, +- 0x32, 0x0e, 0x1b, 0xeb, 0x9f, 0x1b, 0x41, 0x2d, 0xfc, 0x16, 0x6a, 0xc9, +- 0x84, 0x27, 0x83, 0x31, 0xcf, 0x36, 0xda, 0x9b, 0x6c, 0x02, 0x7a, 0xae, +- 0x40, 0xf7, 0x15, 0xd8, 0x01, 0x62, 0xf5, 0x2b, 0x1b, 0xf6, 0x31, 0xd6, +- 0x54, 0x63, 0x76, 0xca, 0xdf, 0x54, 0x13, 0xc9, 0x35, 0xd8, 0xcf, 0x75, +- 0xf4, 0x02, 0x6b, 0xe8, 0x55, 0xd7, 0xd1, 0xd7, 0x2d, 0x96, 0x0f, 0x81, +- 0x7e, 0xd6, 0x94, 0xfc, 0x8e, 0xe9, 0x5a, 0xa7, 0xcd, 0x7a, 0xe1, 0x2e, +- 0x7d, 0xb7, 0x2b, 0x4f, 0xf4, 0xb0, 0xd7, 0x64, 0x5f, 0xce, 0x7b, 0xe9, +- 0xab, 0xd0, 0xe3, 0x9a, 0xc9, 0x75, 0x7f, 0x1f, 0x7b, 0x01, 0xdf, 0x7e, +- 0x48, 0x0b, 0xed, 0x87, 0x7b, 0x08, 0xd3, 0xa3, 0xfd, 0x24, 0xaf, 0xf1, +- 0xd1, 0x66, 0xeb, 0xdd, 0xae, 0x9f, 0xe9, 0x3a, 0xcb, 0xbc, 0x22, 0xbe, +- 0xfd, 0xbe, 0xe7, 0xb0, 0xaf, 0xcb, 0x0e, 0x21, 0x76, 0x37, 0x1c, 0x79, +- 0xc1, 0xde, 0xec, 0x77, 0x07, 0x2a, 0xbe, 0x9c, 0x28, 0xc7, 0x43, 0x72, +- 0xa2, 0x91, 0x80, 0x4f, 0x50, 0x86, 0x56, 0x93, 0x0c, 0x45, 0xbe, 0x5e, +- 0x11, 0x79, 0xb9, 0xc2, 0x35, 0x2d, 0xc3, 0x58, 0x36, 0xd4, 0xce, 0xbb, +- 0x75, 0xd8, 0xe5, 0xdf, 0xcb, 0xe1, 0x79, 0x91, 0xb3, 0x58, 0x5f, 0xae, +- 0xd0, 0x57, 0x47, 0x50, 0xbf, 0xee, 0x94, 0xda, 0x02, 0x7a, 0xb2, 0x8a, +- 0x4c, 0x65, 0x1f, 0x60, 0xbe, 0x89, 0xc8, 0xba, 0xbe, 0x93, 0x15, 0x19, +- 0x3c, 0x17, 0x96, 0xf0, 0x39, 0x34, 0x7f, 0x90, 0xfd, 0xf9, 0x21, 0xff, +- 0x8e, 0xd6, 0xf5, 0xf9, 0x52, 0x19, 0x7b, 0x2b, 0xfd, 0x3a, 0x4e, 0x96, +- 0xea, 0x05, 0xc9, 0x57, 0x79, 0x16, 0x9e, 0x0b, 0x71, 0xac, 0xa5, 0x64, +- 0xfa, 0xf4, 0x88, 0x3c, 0x8b, 0x33, 0xd0, 0xff, 0xe1, 0x8c, 0x71, 0x29, +- 0x9e, 0xc5, 0x7c, 0xfd, 0x9a, 0x2c, 0x2c, 0x15, 0xa4, 0x56, 0xbd, 0xd0, +- 0x74, 0xf7, 0x8e, 0xef, 0x85, 0xe6, 0x5e, 0xf6, 0x10, 0xfb, 0x19, 0xf4, +- 0xaa, 0x16, 0xbe, 0x21, 0xb3, 0xfa, 0xf4, 0xd4, 0xe6, 0x3b, 0xe3, 0xe6, +- 0x1e, 0x76, 0x42, 0x66, 0x2b, 0x29, 0x29, 0x9d, 0x1e, 0xd1, 0x77, 0x0d, +- 0x6d, 0xe9, 0xea, 0xd3, 0x37, 0x90, 0x2b, 0x26, 0xf4, 0x9d, 0xf1, 0x2d, +- 0x79, 0xd4, 0x9e, 0x95, 0x27, 0xad, 0x83, 0x72, 0x02, 0xf5, 0xf5, 0xa7, +- 0xd1, 0xeb, 0xc7, 0xbb, 0xa9, 0x47, 0xd0, 0x6b, 0xb1, 0x07, 0x75, 0x64, +- 0xdc, 0xfe, 0xb8, 0xf9, 0x3c, 0x24, 0x7b, 0xb5, 0xce, 0x3c, 0xf9, 0x5f, +- 0x4e, 0x06, 0x79, 0xef, 0x06, 0x7a, 0xc7, 0x8c, 0x86, 0x33, 0x5c, 0xb8, +- 0x2a, 0xe1, 0x86, 0xcd, 0x17, 0x08, 0xb7, 0x60, 0x78, 0x70, 0x06, 0xe0, +- 0x42, 0x72, 0xd1, 0x0e, 0xc3, 0x46, 0x26, 0xc0, 0x27, 0x62, 0xfc, 0x68, +- 0xa7, 0x57, 0x07, 0xef, 0x40, 0x6e, 0xbd, 0xbd, 0xff, 0x35, 0x6f, 0xff, +- 0xb3, 0xde, 0xfe, 0xcb, 0x1b, 0xfb, 0xfd, 0xfc, 0xfa, 0x13, 0x47, 0x9a, +- 0xe8, 0x7a, 0xad, 0xec, 0xc2, 0xcf, 0x7a, 0x74, 0x5d, 0xde, 0xa0, 0xcb, +- 0x87, 0x87, 0x3c, 0x35, 0xcf, 0x8c, 0xcd, 0x8c, 0xd1, 0xfd, 0x90, 0xa3, +- 0x23, 0x39, 0x1b, 0xbe, 0x51, 0x49, 0x8c, 0x15, 0xf5, 0x9d, 0x9a, 0x92, +- 0xb5, 0xe8, 0xac, 0x4c, 0x58, 0x89, 0xb1, 0x69, 0x09, 0xc1, 0x96, 0x19, +- 0x5b, 0x42, 0x52, 0x63, 0xcc, 0xc1, 0x33, 0x6f, 0x6f, 0x4f, 0xeb, 0xd5, +- 0x26, 0x5a, 0x43, 0x2f, 0x91, 0x46, 0x97, 0xd6, 0xc8, 0xc0, 0x6d, 0x5a, +- 0x5d, 0x78, 0x97, 0xd6, 0xab, 0xe5, 0x26, 0xf8, 0x73, 0x61, 0x0f, 0x3e, +- 0xdc, 0x04, 0x4f, 0x7b, 0x66, 0x5d, 0x41, 0x7b, 0x26, 0x6d, 0x3f, 0x0b, +- 0xdf, 0x90, 0xc8, 0x8e, 0x74, 0xf5, 0xe8, 0x7d, 0x03, 0x8e, 0x44, 0x50, +- 0x6f, 0xb4, 0x62, 0x6d, 0xbd, 0xca, 0x5a, 0x44, 0xed, 0x6d, 0x95, 0x41, +- 0xd8, 0x2c, 0x75, 0xe7, 0xde, 0x0d, 0x3e, 0xaa, 0x6b, 0x02, 0x47, 0x9e, +- 0xb4, 0x49, 0xcb, 0x8f, 0x9d, 0x97, 0xa3, 0x83, 0x76, 0x49, 0x86, 0xcc, +- 0x56, 0x9c, 0x5f, 0x6b, 0x68, 0x9c, 0x49, 0xd2, 0xb2, 0x32, 0xd4, 0x6f, +- 0x7e, 0x0f, 0x7c, 0x8e, 0x57, 0x0d, 0xa9, 0x59, 0x89, 0xd8, 0x79, 0xe0, +- 0xd8, 0x0f, 0xdd, 0xd4, 0x46, 0x48, 0x8f, 0xc8, 0x61, 0xd8, 0x77, 0x4d, +- 0xe7, 0x45, 0xda, 0x71, 0x62, 0xa2, 0x88, 0x5a, 0xe7, 0x2f, 0x75, 0x6e, +- 0x73, 0x9c, 0x1b, 0xc8, 0x6f, 0x13, 0x5b, 0x6c, 0x4f, 0x9d, 0x73, 0x6d, +- 0x4f, 0x9d, 0x43, 0x0f, 0x7c, 0x32, 0x22, 0x6d, 0xcb, 0xf0, 0x9f, 0x97, +- 0xf6, 0xb8, 0xf5, 0xdc, 0x4b, 0xfc, 0xdd, 0x09, 0xf1, 0xee, 0x64, 0x58, +- 0xac, 0x93, 0x3a, 0x1f, 0x40, 0xde, 0xe3, 0x32, 0x7d, 0x86, 0x31, 0xd5, +- 0x92, 0x81, 0x93, 0xd4, 0x07, 0xeb, 0x9a, 0x85, 0xd1, 0x02, 0x7c, 0x64, +- 0x06, 0x71, 0x41, 0x2d, 0xdf, 0x94, 0x82, 0x45, 0x39, 0x74, 0x49, 0xfb, +- 0x32, 0xfa, 0xf1, 0x65, 0xc4, 0x86, 0xe5, 0x98, 0xb4, 0xc0, 0xb7, 0xd4, +- 0xb9, 0xa8, 0x51, 0x9a, 0x7f, 0x17, 0xfe, 0xc0, 0xdf, 0x70, 0x50, 0x5b, +- 0x9e, 0x8b, 0x19, 0xf4, 0x2d, 0x75, 0x8e, 0x76, 0x8e, 0x72, 0xea, 0x1c, +- 0xed, 0x9c, 0x74, 0xf8, 0xfe, 0x82, 0xf7, 0x73, 0x23, 0xfa, 0x9e, 0xfa, +- 0x86, 0x4d, 0x5e, 0x7e, 0x20, 0xd9, 0x2a, 0x6b, 0x44, 0xf2, 0x23, 0xdd, +- 0xa8, 0x65, 0x76, 0x65, 0xed, 0x81, 0xb1, 0x75, 0xf9, 0xa8, 0x7c, 0xdd, +- 0xf9, 0x11, 0xf8, 0x22, 0x1f, 0xcd, 0x7c, 0x91, 0xa7, 0x2e, 0x69, 0xd1, +- 0x7c, 0xf9, 0xfc, 0x40, 0xd0, 0xe0, 0x67, 0xef, 0xc9, 0x18, 0xf0, 0x7f, +- 0x11, 0x31, 0xa0, 0x0f, 0xcf, 0x27, 0xf0, 0x44, 0x4a, 0x3b, 0x47, 0xde, +- 0xc9, 0xeb, 0x75, 0xd4, 0x8d, 0x3e, 0x9f, 0x53, 0x78, 0x7f, 0x55, 0xa6, +- 0xe7, 0x9d, 0xe3, 0xc8, 0xab, 0xbc, 0x43, 0xef, 0x71, 0xef, 0x83, 0xb7, +- 0xf2, 0xfe, 0xaa, 0xb8, 0xf2, 0x49, 0x98, 0x35, 0xc1, 0xfb, 0xd2, 0x56, +- 0x59, 0x34, 0xc7, 0x8e, 0x98, 0xae, 0xc3, 0x0f, 0xd7, 0x19, 0x27, 0x28, +- 0xa3, 0xeb, 0x92, 0x9d, 0xe7, 0xfd, 0x97, 0x8b, 0x6f, 0xaa, 0xee, 0xc7, +- 0x8d, 0xe6, 0x3d, 0x36, 0xe0, 0xfa, 0x00, 0x47, 0xba, 0xd6, 0x28, 0x3f, +- 0xc4, 0x9c, 0xde, 0xa6, 0x58, 0xd3, 0xbc, 0x6f, 0x4c, 0x9e, 0x43, 0x1d, +- 0xf0, 0x9a, 0xbd, 0x49, 0xae, 0x53, 0xac, 0x85, 0x6a, 0xf5, 0x49, 0xf8, +- 0x64, 0x0b, 0x62, 0x99, 0x29, 0xeb, 0xe5, 0x56, 0xa9, 0xa1, 0xde, 0x59, +- 0x5c, 0x62, 0x2c, 0x24, 0xed, 0xed, 0x98, 0x77, 0xe3, 0x17, 0x63, 0xed, +- 0x7a, 0x19, 0x79, 0x16, 0xbe, 0xbd, 0x5e, 0x8e, 0xe2, 0xd9, 0x87, 0xa7, +- 0x85, 0x67, 0x1c, 0xcf, 0x24, 0x9e, 0x23, 0x78, 0x8e, 0xe0, 0x69, 0x61, +- 0x6f, 0x0c, 0x4f, 0xbf, 0x67, 0x20, 0xae, 0xdb, 0x7c, 0x97, 0xf4, 0x79, +- 0xa8, 0x15, 0x2d, 0xe6, 0xb4, 0xb0, 0x9d, 0x43, 0x1f, 0x91, 0x1d, 0x61, +- 0xad, 0xc7, 0x9a, 0xef, 0x03, 0xc7, 0xb4, 0xd8, 0x97, 0x17, 0x8d, 0xfd, +- 0x43, 0xcc, 0x0b, 0x55, 0xe4, 0x85, 0xf7, 0x76, 0xa3, 0x7f, 0x34, 0x0f, +- 0xe8, 0xbb, 0xa3, 0x79, 0x7c, 0xf3, 0x1d, 0x3d, 0x6f, 0x74, 0x06, 0x79, +- 0x8a, 0xf1, 0xd3, 0xc1, 0x9e, 0x3c, 0xe2, 0xf8, 0x2e, 0xf8, 0x5f, 0x06, +- 0x71, 0x1b, 0xef, 0x0b, 0x97, 0x76, 0xbb, 0x39, 0x15, 0xf9, 0x56, 0x6d, +- 0xbd, 0xaf, 0xb1, 0xb1, 0x67, 0xbb, 0xde, 0xa0, 0x13, 0x38, 0x12, 0xd5, +- 0x05, 0xf8, 0xe0, 0xf7, 0xed, 0xe3, 0xba, 0xb6, 0xa3, 0x2e, 0x9e, 0x45, +- 0x8d, 0x9a, 0x9b, 0x63, 0x0d, 0x73, 0x0c, 0x7d, 0x09, 0xfa, 0xb3, 0x28, +- 0x7b, 0x72, 0xe6, 0x02, 0x5d, 0x8b, 0x46, 0xa5, 0x9d, 0x79, 0xe0, 0x06, +- 0xce, 0x03, 0x5f, 0x8b, 0x0e, 0x64, 0xf6, 0x08, 0x6a, 0x42, 0xc7, 0x09, +- 0x5b, 0xfb, 0x25, 0xfe, 0x38, 0x63, 0x8e, 0x60, 0xbf, 0x29, 0xee, 0xbd, +- 0x3a, 0xe2, 0xee, 0xa4, 0xfe, 0xbd, 0x18, 0xc6, 0x65, 0x63, 0xef, 0x1d, +- 0xc0, 0xc5, 0x79, 0xde, 0x69, 0x8b, 0xec, 0x9f, 0x73, 0x6b, 0x5a, 0x65, +- 0x35, 0xe3, 0xfb, 0x39, 0x0f, 0x1f, 0xd7, 0x95, 0xf7, 0xdb, 0xc6, 0x1e, +- 0xc8, 0x08, 0xfe, 0x00, 0x1d, 0x9f, 0x40, 0xfd, 0x7c, 0x11, 0x7a, 0x79, +- 0x0d, 0x3a, 0xb9, 0x54, 0xa6, 0xad, 0x0f, 0xc3, 0xee, 0x21, 0xc3, 0x49, +- 0xe2, 0x1a, 0xd1, 0x67, 0x5f, 0x2c, 0x23, 0x76, 0x32, 0xfe, 0xa9, 0x5f, +- 0x8d, 0xb2, 0x3e, 0x64, 0x1e, 0x74, 0xf1, 0xf4, 0xb9, 0x70, 0xe2, 0xaf, +- 0xed, 0xd6, 0xf4, 0xd4, 0xf4, 0x3d, 0x18, 0xe5, 0x04, 0x1b, 0xe4, 0x6f, +- 0x04, 0x1a, 0xe6, 0x0b, 0x51, 0x7d, 0x0f, 0xaf, 0x38, 0x47, 0x3e, 0x46, +- 0x24, 0x3b, 0xe7, 0xef, 0xeb, 0xc6, 0xbe, 0x1d, 0x4d, 0xb8, 0xee, 0xdc, +- 0xc2, 0x83, 0xf2, 0x78, 0xe0, 0xfa, 0xd6, 0xba, 0x3f, 0x61, 0x16, 0x37, +- 0xee, 0x86, 0x99, 0x7f, 0xa9, 0x9b, 0x14, 0xf6, 0xfb, 0xfa, 0xe9, 0xf3, +- 0x7a, 0x81, 0xc4, 0x6c, 0x51, 0x58, 0xab, 0x50, 0x47, 0x63, 0xf0, 0x6b, +- 0x13, 0xf8, 0x6d, 0xa9, 0x96, 0xdb, 0x44, 0xf5, 0xb0, 0x37, 0x66, 0xad, +- 0xdc, 0x7c, 0xe6, 0xaf, 0x78, 0x67, 0xa2, 0x9f, 0x3e, 0xc5, 0xba, 0x59, +- 0xe7, 0x19, 0xc0, 0x74, 0x6c, 0xa1, 0xed, 0x17, 0x3d, 0x38, 0xae, 0x27, +- 0xa5, 0x88, 0x3a, 0x34, 0x37, 0x87, 0x8a, 0x1e, 0xf1, 0x5b, 0xa5, 0xf9, +- 0xbb, 0x16, 0xef, 0xf0, 0x86, 0xe3, 0xd3, 0xa0, 0xb1, 0x68, 0x66, 0x78, +- 0x6f, 0x06, 0x1c, 0xbd, 0x5b, 0x70, 0x8c, 0x7b, 0x38, 0xc6, 0xa5, 0x74, +- 0x66, 0x02, 0xbe, 0x96, 0x41, 0x7e, 0xef, 0x37, 0x1f, 0x91, 0x4f, 0xa0, +- 0xb9, 0xc6, 0xdc, 0xd9, 0x11, 0xe8, 0xc9, 0x71, 0xf6, 0xdb, 0x87, 0x40, +- 0xf7, 0x77, 0x90, 0x5b, 0xfd, 0x9a, 0xa7, 0x14, 0x0b, 0x21, 0x87, 0x1d, +- 0xd1, 0xbf, 0xc3, 0x16, 0x4d, 0x13, 0xf6, 0xaa, 0x8c, 0xe1, 0x24, 0xda, +- 0x7b, 0xe4, 0xb7, 0x59, 0xe4, 0x2a, 0xf2, 0xd9, 0x29, 0x25, 0xd3, 0x78, +- 0x38, 0x84, 0xba, 0x26, 0x3b, 0x47, 0x3f, 0x92, 0x81, 0x50, 0xba, 0x15, +- 0x35, 0xa9, 0x23, 0x6f, 0xdb, 0xfc, 0x77, 0x0a, 0xb3, 0x72, 0xb1, 0x6e, +- 0xe2, 0xf9, 0x5d, 0xe8, 0xe1, 0x4f, 0xf1, 0xfe, 0x76, 0x0f, 0xea, 0x3e, +- 0xac, 0x64, 0x60, 0xbb, 0x49, 0x5d, 0xcf, 0xb0, 0x8e, 0xa8, 0x21, 0xdf, +- 0x2a, 0xe4, 0x1a, 0xd4, 0x55, 0x63, 0xac, 0x5d, 0x9f, 0x5b, 0xbc, 0x26, +- 0x97, 0xe6, 0xf9, 0x3b, 0x28, 0xf3, 0xf2, 0x41, 0xc6, 0x03, 0x73, 0x26, +- 0x85, 0xb9, 0x25, 0xc6, 0x32, 0x7c, 0x37, 0xe0, 0x40, 0x3d, 0xa8, 0x11, +- 0x50, 0x6b, 0xaf, 0x5b, 0x49, 0xf0, 0x79, 0x4d, 0x2e, 0xce, 0x87, 0x65, +- 0xd1, 0x62, 0x5d, 0x24, 0xf1, 0x2c, 0x60, 0x2f, 0x2e, 0xfd, 0x93, 0x6b, +- 0x13, 0x84, 0x47, 0xcf, 0x53, 0x44, 0x5d, 0xf7, 0x88, 0xde, 0xfb, 0xd3, +- 0xf4, 0x4c, 0x9a, 0x9a, 0xfb, 0xbc, 0x82, 0x5c, 0xa4, 0x3f, 0xe9, 0xdf, +- 0x28, 0x58, 0x1b, 0x1c, 0x83, 0xcd, 0xb2, 0x76, 0x67, 0x3f, 0x80, 0xf7, +- 0x3a, 0xd7, 0xc9, 0x3b, 0x9e, 0x0b, 0xfd, 0x90, 0x0d, 0xfd, 0x9e, 0x77, +- 0x62, 0xc8, 0xa3, 0x8a, 0xbe, 0x5e, 0xd2, 0xb1, 0xa0, 0x54, 0x29, 0x20, +- 0xa7, 0x20, 0x06, 0xd8, 0xbd, 0xb0, 0xc5, 0x49, 0xe8, 0x72, 0x0c, 0x70, +- 0x5b, 0x72, 0xc9, 0x6a, 0x49, 0xd7, 0x65, 0x6a, 0xe5, 0xf6, 0xfd, 0x4d, +- 0x1e, 0xfe, 0xa3, 0x56, 0x61, 0x5b, 0xf0, 0x21, 0xb5, 0x1a, 0xc5, 0x13, +- 0xf1, 0x78, 0x15, 0xfd, 0x45, 0x99, 0xf7, 0x43, 0xe8, 0x0d, 0xca, 0xbc, +- 0x3b, 0x49, 0xe2, 0x39, 0xc2, 0xfb, 0x22, 0x2f, 0xae, 0x11, 0x3f, 0xe9, +- 0xf0, 0xe3, 0x0b, 0x6b, 0x49, 0xc6, 0x17, 0xbf, 0x9e, 0x74, 0x6d, 0xe1, +- 0x44, 0x85, 0x31, 0x84, 0x76, 0xdd, 0x8f, 0xb8, 0x45, 0x5b, 0x70, 0x6b, +- 0xc9, 0xa5, 0xaa, 0x2b, 0xb3, 0xe9, 0xc6, 0x05, 0x9d, 0x23, 0x0e, 0x88, +- 0x05, 0x1b, 0xa3, 0xec, 0xb0, 0xa6, 0x73, 0xc0, 0x79, 0xc9, 0xe8, 0x27, +- 0x65, 0xf6, 0xaa, 0x64, 0x96, 0x46, 0xe4, 0x05, 0x1d, 0xb7, 0xfc, 0x98, +- 0xc5, 0x1a, 0x92, 0xbf, 0x1f, 0x27, 0xe5, 0xf9, 0xd3, 0xd7, 0x24, 0xfb, +- 0x22, 0xe3, 0xd6, 0x70, 0x6c, 0x87, 0xc1, 0x58, 0xe5, 0x48, 0x1d, 0xb9, +- 0xe9, 0x11, 0x9b, 0xff, 0x16, 0x20, 0x84, 0x9e, 0xce, 0x91, 0xd6, 0xd1, +- 0x84, 0x1d, 0x37, 0xfa, 0x9f, 0xd8, 0x61, 0x30, 0x37, 0x0e, 0x9b, 0x4f, +- 0x89, 0x7f, 0x1f, 0xd5, 0x26, 0x4f, 0xe9, 0xbb, 0x0a, 0xb8, 0xed, 0xdc, +- 0xfb, 0xfa, 0x77, 0x94, 0x1b, 0x29, 0xca, 0x1a, 0xdf, 0xab, 0x9c, 0x2f, +- 0x46, 0x6e, 0xa4, 0x5a, 0xa4, 0x74, 0x87, 0xe3, 0x3c, 0x39, 0xfa, 0xc0, +- 0x6e, 0xf7, 0xdf, 0x8b, 0x3c, 0x7d, 0x87, 0x1b, 0x0b, 0x7e, 0xcd, 0xfb, +- 0xfe, 0x3a, 0x9e, 0xb4, 0x6d, 0xe6, 0x5b, 0xe6, 0x47, 0xea, 0x0d, 0xcf, +- 0x25, 0xbe, 0x33, 0xf7, 0xce, 0x22, 0xf7, 0x32, 0x5f, 0xee, 0x92, 0x1c, +- 0x7f, 0xe7, 0x53, 0x7a, 0xbe, 0xe8, 0xd6, 0xd2, 0x1e, 0x5c, 0x75, 0x4a, +- 0xa6, 0xab, 0xac, 0xa1, 0x2e, 0x22, 0x97, 0x0d, 0xc1, 0x56, 0x99, 0xd3, +- 0x8e, 0x23, 0x9f, 0xf3, 0xf7, 0x69, 0xac, 0x2d, 0x70, 0x5f, 0x22, 0x19, +- 0x57, 0xcd, 0xbf, 0x2b, 0xdd, 0x8c, 0xf2, 0x3e, 0xea, 0xfc, 0x10, 0xf4, +- 0xfe, 0x15, 0xf6, 0x16, 0x03, 0xda, 0x46, 0xb2, 0x2f, 0x51, 0xf6, 0xee, +- 0xef, 0xd7, 0xd2, 0xed, 0xfa, 0x00, 0xeb, 0x80, 0xcf, 0x40, 0x2e, 0x07, +- 0xec, 0x6b, 0xcc, 0xdd, 0xff, 0xa6, 0xac, 0xe1, 0xe4, 0x53, 0x06, 0x7d, +- 0x1b, 0xdf, 0x4b, 0x21, 0x59, 0x88, 0x92, 0x7f, 0xc8, 0xcb, 0xa0, 0xef, +- 0x6c, 0x27, 0x87, 0xad, 0x32, 0xf8, 0x0b, 0xc8, 0x80, 0xb2, 0xf4, 0x65, +- 0xc0, 0xf7, 0x09, 0xe8, 0x8b, 0x3d, 0x43, 0xbf, 0xee, 0x23, 0x4b, 0x0d, +- 0xf7, 0xec, 0x52, 0xa5, 0x99, 0x66, 0xd2, 0x4b, 0x9d, 0x9e, 0x97, 0x9c, +- 0xd6, 0xef, 0xac, 0xe4, 0xaa, 0xe7, 0x65, 0x7f, 0x75, 0x56, 0x1e, 0xb5, +- 0x1e, 0x06, 0xbf, 0x57, 0x9c, 0x82, 0xa5, 0x7b, 0x95, 0xb1, 0x3c, 0xce, +- 0x2e, 0x8c, 0xf4, 0xca, 0x4d, 0xd4, 0x1d, 0xcf, 0x2e, 0x9a, 0xf2, 0x3f, +- 0x9d, 0x5b, 0x5f, 0x6c, 0x5b, 0xd5, 0x19, 0xff, 0x7c, 0x6d, 0x27, 0x69, +- 0x68, 0xc2, 0xad, 0xeb, 0x24, 0x6e, 0x9a, 0x51, 0x3b, 0xbe, 0x6d, 0x23, +- 0x92, 0xa2, 0xdb, 0x10, 0x68, 0xd4, 0x65, 0x8a, 0x71, 0x42, 0x17, 0xb6, +- 0x22, 0xd2, 0xae, 0xab, 0x2a, 0x8d, 0x81, 0xe5, 0xa6, 0x7f, 0xd8, 0xc3, +- 0x0a, 0x85, 0x75, 0x08, 0x21, 0xd5, 0xb8, 0xe9, 0xd6, 0x69, 0x21, 0x4e, +- 0xff, 0x2d, 0x8c, 0x87, 0xcd, 0x4a, 0xd2, 0x96, 0x4d, 0x11, 0x2e, 0x88, +- 0xb2, 0x3d, 0x6c, 0xa3, 0x4a, 0x01, 0xed, 0x79, 0x7b, 0x99, 0x34, 0x36, +- 0x65, 0x05, 0x36, 0x5e, 0x36, 0xf5, 0x81, 0x07, 0xa6, 0xd1, 0x79, 0xbf, +- 0xdf, 0x77, 0xee, 0x75, 0x6c, 0x13, 0x84, 0xb4, 0x48, 0x91, 0xef, 0x39, +- 0xf7, 0xdc, 0x73, 0xce, 0x3d, 0xdf, 0xff, 0xef, 0xfb, 0xdd, 0x8c, 0x3d, +- 0x28, 0x3f, 0xd2, 0x5c, 0x3e, 0xe3, 0x93, 0x00, 0x7c, 0x52, 0x83, 0x2d, +- 0x90, 0x36, 0x27, 0x76, 0x53, 0xe8, 0x53, 0x86, 0x41, 0xeb, 0xb8, 0xf1, +- 0x9b, 0x6d, 0x73, 0x7f, 0xcb, 0x59, 0xf8, 0xee, 0xee, 0x7d, 0x6d, 0x7e, +- 0xce, 0xd7, 0xf8, 0xb7, 0x7f, 0xf2, 0x6a, 0x68, 0x83, 0x32, 0x83, 0xfd, +- 0xbc, 0xa1, 0x7a, 0xd6, 0x01, 0x2f, 0x31, 0x37, 0x1d, 0xd3, 0xfc, 0x43, +- 0x78, 0x9a, 0x3a, 0xea, 0x2a, 0x74, 0xd4, 0x10, 0x75, 0xd7, 0xf0, 0xbc, +- 0xcb, 0xfc, 0x40, 0x54, 0xfe, 0x38, 0x45, 0x3d, 0x1c, 0x97, 0x3f, 0x4c, +- 0x3d, 0x8b, 0xfd, 0x24, 0x8a, 0xcc, 0x51, 0xde, 0x98, 0xc9, 0xd1, 0x4f, +- 0x52, 0x7f, 0x3e, 0xed, 0x3e, 0xad, 0x76, 0x20, 0x6e, 0xe5, 0xd7, 0x87, +- 0x55, 0xdf, 0x1c, 0xd3, 0xda, 0x6e, 0xdc, 0xea, 0x92, 0x1b, 0x17, 0x8c, +- 0x8e, 0x0d, 0x4f, 0x47, 0x03, 0x23, 0x0b, 0xb4, 0x4b, 0xc9, 0x58, 0xd6, +- 0x6a, 0x94, 0x43, 0x51, 0xe6, 0x9e, 0x53, 0xd4, 0xcf, 0xb0, 0x85, 0xbd, +- 0x76, 0xd6, 0x6a, 0xf2, 0xec, 0x4f, 0xac, 0x4e, 0xcf, 0x1e, 0xf3, 0xf4, +- 0x2c, 0xef, 0xa5, 0x68, 0x03, 0x20, 0x93, 0x89, 0x99, 0x51, 0x2b, 0x09, +- 0x9b, 0x87, 0xeb, 0x45, 0xce, 0x1f, 0x97, 0xe3, 0x8b, 0x47, 0xe1, 0x7f, +- 0xf7, 0xda, 0x7b, 0x69, 0x57, 0xed, 0x21, 0xe2, 0x71, 0xb0, 0xfe, 0x97, +- 0xea, 0xe6, 0x7a, 0xd4, 0x9b, 0x8b, 0xf7, 0x21, 0xe7, 0xd3, 0xac, 0xd7, +- 0x36, 0x32, 0x9f, 0xa3, 0x7b, 0xad, 0x1d, 0xbb, 0xa7, 0xb2, 0xee, 0x64, +- 0xc1, 0xf1, 0xb0, 0x61, 0xf8, 0x85, 0x2f, 0xf4, 0x8d, 0x08, 0xd7, 0xe4, +- 0x7a, 0xad, 0x92, 0xde, 0x0f, 0xfd, 0x32, 0xcd, 0xff, 0x9c, 0x57, 0xbb, +- 0x42, 0xbc, 0x12, 0xed, 0x5c, 0xc5, 0x36, 0x7d, 0xc5, 0x9b, 0xaf, 0xbf, +- 0x5d, 0x9a, 0xa3, 0x55, 0xe3, 0x99, 0x5b, 0x61, 0x3b, 0x2e, 0xb9, 0x45, +- 0xfe, 0x96, 0xcb, 0x11, 0xa7, 0x41, 0xf6, 0xda, 0x1b, 0xeb, 0xe6, 0xd8, +- 0x86, 0x3e, 0xe3, 0x13, 0x04, 0xa7, 0x03, 0x9e, 0x6f, 0xb1, 0x89, 0x7e, +- 0x93, 0x77, 0xdd, 0xa4, 0x39, 0x99, 0xb8, 0xd5, 0x59, 0xf7, 0x1e, 0x9b, +- 0x2a, 0x76, 0x38, 0x6e, 0x51, 0x77, 0x36, 0x46, 0xa5, 0x95, 0x3c, 0x54, +- 0x56, 0x3f, 0x3e, 0xe4, 0x18, 0xcc, 0x45, 0xd4, 0x39, 0xd2, 0xce, 0x9c, +- 0xfd, 0x5b, 0x7a, 0x6e, 0x2d, 0xf4, 0x09, 0x70, 0x0d, 0x3e, 0xf9, 0x4c, +- 0xbe, 0x97, 0xb9, 0x5e, 0xcc, 0xdf, 0xcc, 0xf9, 0x5d, 0xef, 0x9c, 0x13, +- 0x6e, 0xce, 0xba, 0x5f, 0xb2, 0x17, 0x0c, 0xff, 0xa5, 0x1d, 0xf0, 0x5e, +- 0x2b, 0xda, 0x0b, 0xb4, 0x09, 0x9f, 0x37, 0x8f, 0x6f, 0x1b, 0x7a, 0xd4, +- 0x36, 0x9c, 0x2a, 0x90, 0x3f, 0xc9, 0x97, 0x3e, 0x3f, 0xfa, 0x3a, 0x8f, +- 0x3c, 0x4a, 0x3d, 0x3b, 0x28, 0x67, 0x0b, 0x3c, 0x9b, 0x94, 0xd6, 0xb4, +- 0x36, 0x9f, 0x3b, 0xa8, 0x98, 0xac, 0xee, 0xe9, 0xc4, 0x4b, 0x39, 0x19, +- 0x96, 0xab, 0x2e, 0xcf, 0x2c, 0x51, 0xcc, 0x04, 0x5b, 0xaa, 0xde, 0x7f, +- 0xbf, 0x9e, 0x59, 0x58, 0x7d, 0xc6, 0x18, 0xc6, 0x3e, 0xef, 0xd1, 0xbb, +- 0x55, 0xcf, 0x36, 0x53, 0x43, 0x9f, 0xaf, 0xeb, 0x39, 0x85, 0xa1, 0x13, +- 0x59, 0xdf, 0x0f, 0x47, 0xf8, 0x0c, 0xd7, 0xa5, 0xcf, 0xc7, 0xb5, 0xc8, +- 0x7b, 0xdd, 0xb0, 0xd8, 0xfd, 0x12, 0xdc, 0x09, 0xd1, 0xdf, 0xc9, 0x3a, +- 0x72, 0x00, 0xb2, 0xba, 0xd9, 0x60, 0x60, 0xc6, 0x8d, 0xaf, 0x91, 0xb1, +- 0xae, 0xe1, 0x1c, 0x11, 0xab, 0xc0, 0x8f, 0x3e, 0xf5, 0x93, 0xdb, 0x98, +- 0x2f, 0xe3, 0xf9, 0xeb, 0x03, 0x98, 0xdf, 0xf1, 0xea, 0xea, 0x53, 0xdb, +- 0xc9, 0xab, 0xa3, 0x5a, 0x1f, 0xe4, 0x33, 0x94, 0x63, 0x9e, 0x19, 0xe9, +- 0xf2, 0x1e, 0x9e, 0x67, 0x7b, 0x5b, 0x1d, 0x1d, 0x93, 0xde, 0xfe, 0xfc, +- 0xfb, 0x61, 0x09, 0xb7, 0x53, 0xc7, 0x45, 0x25, 0x39, 0xcd, 0x98, 0x05, +- 0xb6, 0x6b, 0x9c, 0x73, 0x7d, 0xb1, 0x2e, 0xce, 0xfc, 0x9f, 0xba, 0x38, +- 0x63, 0x7d, 0xa4, 0xbc, 0x13, 0xd6, 0x3c, 0xd6, 0xe7, 0xd3, 0xb5, 0x58, +- 0x43, 0x57, 0xbf, 0x76, 0x1f, 0xad, 0xd0, 0xf1, 0x87, 0x05, 0xda, 0xab, +- 0x94, 0xe6, 0x94, 0xff, 0x3e, 0xc5, 0xb3, 0xe5, 0x1e, 0xaf, 0x72, 0x8f, +- 0xc3, 0x4b, 0x8a, 0x83, 0x7c, 0x58, 0x65, 0xf8, 0x74, 0x81, 0x3a, 0xa6, +- 0x45, 0xe6, 0x67, 0x7c, 0x3d, 0x33, 0xe6, 0xf9, 0xb8, 0xf9, 0xf5, 0x0d, +- 0xaa, 0x67, 0xe0, 0xdd, 0x38, 0x23, 0x9e, 0x7d, 0xe9, 0x92, 0xb9, 0x0b, +- 0xb4, 0xbb, 0x49, 0xf4, 0x45, 0x03, 0x73, 0x0b, 0xac, 0x4d, 0x12, 0x8b, +- 0x32, 0x2c, 0xac, 0xfb, 0x8f, 0xd8, 0xa7, 0x20, 0x6f, 0x31, 0x79, 0x7f, +- 0x8a, 0x3e, 0x7d, 0x03, 0x7c, 0xe3, 0xd6, 0xba, 0xf3, 0xdd, 0x51, 0xf1, +- 0x09, 0x6b, 0xe9, 0x1e, 0xef, 0x90, 0x66, 0xf2, 0xb9, 0x63, 0xdf, 0x10, +- 0xfa, 0x60, 0xbc, 0xce, 0x22, 0x16, 0x60, 0xec, 0x11, 0xd7, 0xd8, 0x63, +- 0xae, 0xc8, 0xbe, 0x16, 0x2f, 0xaf, 0xd4, 0xa2, 0xbc, 0x42, 0x7e, 0xcb, +- 0xa8, 0xff, 0x3d, 0xa4, 0x3a, 0x2b, 0x3f, 0xd5, 0x6b, 0x70, 0x2c, 0x76, +- 0x4c, 0x79, 0x4f, 0x6a, 0x78, 0x2f, 0xe6, 0xad, 0x3d, 0xd6, 0x61, 0x7c, +- 0x2b, 0x5b, 0xf5, 0x4d, 0x58, 0xc7, 0xd1, 0xae, 0x70, 0x7e, 0xf2, 0x06, +- 0x79, 0x84, 0x3a, 0xcf, 0x1f, 0xe7, 0xd3, 0xc3, 0x6f, 0x73, 0x3c, 0xf9, +- 0xbf, 0x1a, 0x8b, 0xe0, 0xcb, 0xaa, 0xdf, 0xe7, 0xcb, 0x1d, 0xef, 0x55, +- 0xdb, 0x04, 0xca, 0x5d, 0x75, 0x7d, 0xd2, 0x96, 0xc8, 0xf4, 0x0a, 0x5d, +- 0xd2, 0xfd, 0xdc, 0xff, 0xf3, 0xcc, 0xed, 0x42, 0xde, 0x56, 0xa3, 0xcd, +- 0x09, 0xa5, 0x4d, 0x06, 0xb4, 0x89, 0x28, 0x6d, 0x18, 0xef, 0x3d, 0xe5, +- 0xf1, 0x5b, 0x0b, 0xce, 0x8b, 0xb9, 0x5a, 0xe8, 0xba, 0x7d, 0xd4, 0xf9, +- 0xcf, 0x76, 0x68, 0x7d, 0xd0, 0xa1, 0xee, 0x5b, 0x0b, 0x7d, 0xc6, 0xf6, +- 0x56, 0xf5, 0x47, 0x4c, 0xbc, 0x15, 0xd7, 0x3c, 0x68, 0x10, 0xfa, 0x79, +- 0x6e, 0x0a, 0xbe, 0x1a, 0x71, 0x6f, 0x35, 0xb4, 0xfa, 0x8e, 0x77, 0x5e, +- 0xf3, 0x4a, 0x1b, 0xca, 0x00, 0xf5, 0xe6, 0x3a, 0xcc, 0xb7, 0x27, 0xda, +- 0x07, 0xfe, 0xfa, 0x19, 0xfa, 0x37, 0x6b, 0x3c, 0x11, 0x84, 0xcc, 0xdf, +- 0x9c, 0x6a, 0xf7, 0x62, 0x38, 0x07, 0x6d, 0xc4, 0xad, 0x53, 0x11, 0xc6, +- 0x14, 0x68, 0xf7, 0x48, 0xc3, 0x34, 0xe2, 0x57, 0xe8, 0xf1, 0x25, 0xb5, +- 0x47, 0x7d, 0xb8, 0x7f, 0x07, 0x71, 0x7e, 0xb8, 0x3e, 0x8a, 0xe7, 0x7a, +- 0x0d, 0x16, 0x21, 0xba, 0x45, 0xcf, 0x74, 0x6e, 0x2a, 0x11, 0x3b, 0x2c, +- 0x5e, 0xdf, 0xb8, 0xab, 0xfa, 0x60, 0x65, 0x5f, 0x0f, 0xca, 0x9e, 0x8a, +- 0xbd, 0x60, 0x1c, 0x0d, 0x1f, 0x7e, 0xc6, 0xd8, 0x83, 0x7c, 0xb1, 0x4f, +- 0xf1, 0x51, 0xc1, 0xa1, 0x45, 0x9c, 0x25, 0x7d, 0xd2, 0x65, 0xf8, 0xe1, +- 0x2e, 0xce, 0x90, 0x7e, 0x77, 0xf9, 0xe4, 0xa4, 0x9b, 0x62, 0x7d, 0x0c, +- 0xfa, 0xe0, 0xa4, 0x8c, 0x20, 0x2e, 0x18, 0x09, 0xb6, 0x32, 0xaf, 0x0c, +- 0xdf, 0x30, 0xe7, 0xe5, 0x1e, 0xfb, 0x98, 0x33, 0x95, 0x73, 0x0b, 0xdc, +- 0x3b, 0x65, 0xdb, 0xc4, 0xde, 0x73, 0x53, 0xdc, 0xaf, 0xc9, 0x43, 0xb0, +- 0x6d, 0x4d, 0xbb, 0xf8, 0xe5, 0x59, 0x0c, 0xe0, 0x77, 0x10, 0xf2, 0xc0, +- 0xb1, 0xf8, 0x5d, 0x58, 0x96, 0x77, 0x2f, 0xf8, 0xb6, 0x3d, 0x20, 0x6f, +- 0x3b, 0xe5, 0x93, 0xa7, 0xdc, 0xf5, 0x3c, 0x03, 0x37, 0xc7, 0x9a, 0xb5, +- 0xe3, 0xb8, 0x79, 0x29, 0x97, 0x97, 0xdc, 0xa5, 0xf5, 0x96, 0xd2, 0x92, +- 0xf2, 0xbf, 0x8c, 0x33, 0xbc, 0x7e, 0xaf, 0x25, 0x86, 0x7e, 0xa4, 0xcd, +- 0x67, 0x6b, 0x7f, 0xd5, 0xb6, 0xc0, 0xd7, 0x7f, 0xe4, 0x47, 0xf2, 0xe5, +- 0xb2, 0xec, 0x52, 0xfd, 0xbf, 0xda, 0x73, 0xd5, 0xba, 0xdf, 0xf7, 0x6f, +- 0xa9, 0xdf, 0xb5, 0xfe, 0xa3, 0xf1, 0xc1, 0x96, 0xe9, 0x7a, 0x9d, 0xf0, +- 0x98, 0x57, 0x57, 0x58, 0x8d, 0xf7, 0x0e, 0x78, 0x7a, 0x21, 0xa5, 0xbe, +- 0x73, 0xca, 0xa6, 0x7e, 0xe0, 0x7e, 0x9a, 0xe5, 0xe0, 0xec, 0x6d, 0xd0, +- 0xc4, 0xd7, 0xc1, 0x8c, 0xfb, 0x7c, 0xdd, 0xd1, 0xea, 0xf9, 0xc2, 0x96, +- 0x74, 0x9f, 0xa3, 0xef, 0xe4, 0x40, 0x8f, 0xb6, 0x49, 0x66, 0x3c, 0x28, +- 0xc9, 0x73, 0x1b, 0x62, 0xc6, 0xd7, 0x25, 0xff, 0x41, 0xde, 0xb4, 0x4f, +- 0x7d, 0x51, 0xf4, 0xdf, 0x29, 0x5c, 0xdb, 0xf0, 0x33, 0xe4, 0x79, 0x9f, +- 0x7f, 0xcf, 0xae, 0xe3, 0xd1, 0x9d, 0x1e, 0x8f, 0xf2, 0xbe, 0x65, 0xea, +- 0x1f, 0x18, 0xdb, 0x7d, 0x8e, 0x7b, 0x34, 0xcf, 0x75, 0x9f, 0x33, 0xf1, +- 0x7a, 0xed, 0x73, 0x7d, 0x95, 0xe7, 0x70, 0xbf, 0x47, 0xb1, 0x61, 0x98, +- 0x7b, 0xd7, 0x20, 0x7c, 0xba, 0x3e, 0xda, 0x1c, 0xda, 0xef, 0xcd, 0xee, +- 0x2e, 0x21, 0xbf, 0x27, 0x3c, 0x9e, 0xa3, 0xbe, 0x89, 0x78, 0xfa, 0x66, +- 0xc5, 0xbe, 0x8c, 0x18, 0xfc, 0x09, 0x73, 0x22, 0x55, 0xf6, 0xe5, 0x71, +- 0xf3, 0x6e, 0x35, 0xf6, 0xe5, 0x4e, 0x6f, 0x1e, 0xff, 0x9e, 0xaf, 0x57, +- 0xfc, 0xb6, 0xaf, 0x57, 0xea, 0x7d, 0x5a, 0x9f, 0xf6, 0xb5, 0xb8, 0xaf, +- 0xea, 0x98, 0x2f, 0xbf, 0x6a, 0xde, 0x25, 0x8b, 0x98, 0x8d, 0x3e, 0x65, +- 0x22, 0x67, 0x30, 0xd3, 0xd6, 0x59, 0x8b, 0xb8, 0x0f, 0xe7, 0xc7, 0x92, +- 0x8e, 0xdc, 0xd6, 0xd8, 0xfa, 0xf4, 0xec, 0x98, 0xe6, 0x79, 0xe6, 0x5c, +- 0x4f, 0xef, 0x44, 0x77, 0x43, 0xae, 0x5e, 0x89, 0xac, 0x60, 0x8a, 0x66, +- 0x4e, 0xa4, 0x61, 0x87, 0x52, 0x5a, 0x2f, 0xfb, 0x2e, 0xf6, 0x3b, 0xa8, +- 0x78, 0xae, 0x35, 0xce, 0x73, 0xf2, 0x90, 0x5d, 0xd6, 0xda, 0x4d, 0xd3, +- 0x50, 0xf1, 0x44, 0xd3, 0x8b, 0x3e, 0xdf, 0x93, 0x9f, 0x66, 0x4e, 0x1c, +- 0x9c, 0x29, 0x0f, 0x87, 0xb6, 0xf7, 0xda, 0x79, 0x21, 0x66, 0x7f, 0x58, +- 0x8e, 0x28, 0x76, 0xf8, 0x15, 0xdc, 0xdf, 0xc7, 0xf8, 0x32, 0x11, 0x52, +- 0x4c, 0x70, 0x22, 0x36, 0x01, 0x59, 0xcc, 0xba, 0xc4, 0xf8, 0xaf, 0x55, +- 0xac, 0xff, 0x9c, 0xd0, 0xcf, 0x22, 0xa6, 0xe0, 0x59, 0x39, 0xec, 0x6e, +- 0x76, 0x97, 0xc4, 0xf8, 0xbf, 0x59, 0xad, 0x09, 0x35, 0xca, 0x84, 0x1b, +- 0x6a, 0x4a, 0x97, 0x8c, 0x0c, 0x8c, 0x06, 0x53, 0x6b, 0x26, 0x9d, 0x68, +- 0xd3, 0xae, 0x12, 0x64, 0xbc, 0x04, 0xfd, 0x5f, 0x8a, 0x05, 0x46, 0x14, +- 0x9b, 0xf6, 0x65, 0x49, 0xb7, 0xd3, 0xcf, 0xa7, 0x3e, 0xf9, 0x8a, 0xdc, +- 0xb4, 0xb7, 0xca, 0xcd, 0x1e, 0xe2, 0x31, 0xfb, 0xd1, 0xa6, 0x2e, 0x19, +- 0x44, 0x5f, 0x12, 0x7d, 0x4d, 0xca, 0x8f, 0x1a, 0x9f, 0x41, 0x67, 0xdd, +- 0xb4, 0xa9, 0xab, 0xee, 0xe2, 0x2f, 0xde, 0xf5, 0x6f, 0xa0, 0x09, 0xb1, +- 0x1d, 0xdb, 0xd0, 0xa6, 0x8e, 0xb3, 0xeb, 0xfa, 0x3b, 0xd1, 0xbe, 0x17, +- 0x73, 0x34, 0xe8, 0xfb, 0x59, 0xce, 0x76, 0x53, 0xe7, 0xac, 0x19, 0xb3, +- 0xae, 0xae, 0xfd, 0xfb, 0x36, 0x83, 0x4f, 0xf8, 0x94, 0xf4, 0xce, 0xa5, +- 0xe4, 0xe1, 0x8e, 0xda, 0xf6, 0xbf, 0xea, 0xda, 0xad, 0xb2, 0xa6, 0x8d, +- 0x64, 0x38, 0xd6, 0x5e, 0xdb, 0xef, 0xf3, 0x93, 0xdf, 0xee, 0xc0, 0xfb, +- 0x42, 0x66, 0xac, 0xa4, 0xc6, 0x52, 0x37, 0xa3, 0x5c, 0xeb, 0xc3, 0xba, +- 0x67, 0x78, 0xcd, 0x67, 0xf8, 0x2c, 0xf3, 0x7a, 0xb7, 0xd9, 0x8f, 0x67, +- 0x98, 0x13, 0x60, 0x5e, 0x83, 0x3c, 0xbb, 0x5a, 0x9c, 0xc5, 0x31, 0x9f, +- 0xcd, 0x37, 0x64, 0x2a, 0xbc, 0xe7, 0xeb, 0x95, 0x58, 0x05, 0xab, 0xb6, +- 0xab, 0xe0, 0xe7, 0x84, 0x49, 0x3b, 0xad, 0x49, 0xc5, 0x6e, 0x80, 0xce, +- 0x87, 0x40, 0xe7, 0x07, 0x83, 0x8c, 0x0b, 0x9b, 0x3d, 0x5a, 0x3b, 0x32, +- 0x52, 0xfa, 0x0d, 0x64, 0x9c, 0x3c, 0x0a, 0x9f, 0xa2, 0x64, 0x79, 0xf8, +- 0x8c, 0x01, 0xd8, 0x34, 0x57, 0x82, 0x9a, 0x77, 0x40, 0x7c, 0x3f, 0x7f, +- 0x5d, 0x46, 0xa6, 0x98, 0x13, 0x20, 0x3f, 0x33, 0xae, 0x4f, 0xe1, 0xde, +- 0x2d, 0x8c, 0x75, 0x21, 0xc3, 0x63, 0xe0, 0xd7, 0x90, 0x38, 0xd3, 0xdb, +- 0x24, 0x37, 0x3e, 0xa6, 0x3e, 0x40, 0x37, 0x6c, 0xd4, 0x29, 0x77, 0x54, +- 0x26, 0xaf, 0x6c, 0x82, 0xac, 0x32, 0xee, 0xd7, 0x9c, 0x46, 0x39, 0xac, +- 0xbe, 0x39, 0x7d, 0x0e, 0xe6, 0xe1, 0x4c, 0x8d, 0xd9, 0xc8, 0xed, 0xa1, +- 0x98, 0xb4, 0x8e, 0xca, 0xcc, 0xac, 0xad, 0x78, 0x97, 0x94, 0xdc, 0x2e, +- 0x93, 0x76, 0xd9, 0x7d, 0x71, 0xe8, 0x2a, 0xfa, 0xf2, 0x3f, 0x88, 0x98, +- 0xb3, 0xdc, 0xbd, 0x81, 0x31, 0x71, 0x72, 0xba, 0x7a, 0x0e, 0xc5, 0xc8, +- 0xe0, 0xde, 0x2f, 0xdb, 0x8c, 0xcc, 0x30, 0x3e, 0xfe, 0xa0, 0x9c, 0x8a, +- 0x72, 0x4d, 0x8e, 0x65, 0xed, 0x96, 0x3c, 0xc2, 0xbd, 0xfd, 0xc7, 0xe3, +- 0xe5, 0x97, 0x31, 0x5f, 0x5c, 0xba, 0x5f, 0x1d, 0xd3, 0xb8, 0xfe, 0x54, +- 0x4d, 0x0c, 0x6b, 0xf2, 0x05, 0x26, 0x8e, 0xbd, 0x2e, 0x13, 0x8b, 0xa4, +- 0x0f, 0x6d, 0x7c, 0x40, 0x7e, 0xe1, 0xf4, 0xda, 0x4f, 0x68, 0xad, 0x31, +- 0x91, 0x62, 0x7d, 0xa6, 0xd9, 0x49, 0xda, 0xf3, 0x12, 0x1a, 0xfc, 0x1a, +- 0xae, 0x19, 0xd7, 0xe6, 0xdd, 0x5e, 0xf7, 0x09, 0xf1, 0x71, 0x20, 0x9b, +- 0x53, 0x8d, 0x81, 0x4f, 0xca, 0xd7, 0xf7, 0x71, 0x8c, 0xc1, 0x81, 0x48, +- 0x80, 0xb4, 0x7a, 0xef, 0x2e, 0xe2, 0x67, 0x6a, 0xf3, 0x7f, 0x0f, 0x1c, +- 0xdb, 0x3b, 0x90, 0x38, 0xc3, 0x18, 0x36, 0xec, 0x3c, 0xba, 0xc1, 0xbc, +- 0x6b, 0x2e, 0xb7, 0x4e, 0xb4, 0x7e, 0x76, 0xfc, 0x1f, 0x0e, 0xf1, 0x10, +- 0x89, 0x58, 0xa3, 0xc5, 0x3c, 0x38, 0x75, 0x1c, 0x6b, 0x2a, 0xcc, 0xb9, +- 0x11, 0xcb, 0xdf, 0x24, 0x97, 0xfb, 0x2c, 0x79, 0x20, 0x94, 0x8a, 0x5b, +- 0xb2, 0x25, 0x7e, 0x4e, 0xb0, 0x26, 0xeb, 0x2b, 0x8b, 0x89, 0x1c, 0xc7, +- 0x87, 0xa6, 0x39, 0x5f, 0x5c, 0xe3, 0x95, 0xe4, 0x96, 0x72, 0xf9, 0x29, +- 0x57, 0x02, 0xc9, 0x7b, 0x3e, 0x2c, 0xb3, 0x16, 0x6e, 0xbd, 0xfa, 0x79, +- 0x38, 0x05, 0xea, 0x0a, 0x7b, 0xc2, 0x60, 0x0e, 0x27, 0x8f, 0x77, 0x2f, +- 0xb2, 0xfd, 0xe4, 0x43, 0xa6, 0x7d, 0x06, 0xed, 0x06, 0x0f, 0xeb, 0x34, +- 0x75, 0xbc, 0xbb, 0x78, 0x6c, 0x83, 0x89, 0xbf, 0x97, 0x15, 0xff, 0xf5, +- 0x56, 0x4d, 0x4c, 0x93, 0x0a, 0x8c, 0x17, 0xc6, 0x02, 0x63, 0x05, 0xab, +- 0xaf, 0x09, 0xb4, 0x5a, 0x70, 0x99, 0xab, 0xf1, 0x73, 0x56, 0xcc, 0xf7, +- 0x8b, 0x3c, 0xa9, 0x18, 0x29, 0xd6, 0x14, 0x2d, 0xf5, 0x85, 0x0e, 0x2d, +- 0x30, 0xc7, 0x1f, 0x51, 0x7d, 0x70, 0x78, 0xb1, 0x55, 0xf2, 0xf6, 0x7a, +- 0xc9, 0xab, 0x8c, 0x47, 0x55, 0x07, 0x58, 0xce, 0x3d, 0xe8, 0xe3, 0xbe, +- 0x1f, 0x57, 0x5c, 0xc4, 0xeb, 0x85, 0x4e, 0xb4, 0x99, 0x6b, 0xde, 0x51, +- 0xd7, 0x5f, 0x5d, 0x97, 0x4d, 0xd8, 0x96, 0x55, 0x5f, 0x93, 0x65, 0x5f, +- 0x7d, 0x2d, 0xf6, 0xb4, 0x5c, 0x27, 0xdf, 0x94, 0xfc, 0x9c, 0xbb, 0xeb, +- 0xe5, 0xdc, 0x1f, 0xc3, 0x9c, 0x9c, 0x5b, 0x32, 0xa1, 0xa1, 0xa6, 0xbe, +- 0x53, 0x53, 0xc1, 0x5b, 0x2b, 0xf9, 0x53, 0xb4, 0x17, 0x2b, 0xb5, 0x72, +- 0xdc, 0x7b, 0x06, 0xbe, 0x48, 0x1e, 0x7e, 0x45, 0xce, 0xfb, 0xfe, 0x80, +- 0xf7, 0x2b, 0xcf, 0x7f, 0xc1, 0x9e, 0x9a, 0xb5, 0xce, 0x6e, 0xd5, 0xd4, +- 0xd9, 0xbf, 0x8d, 0x67, 0x59, 0x63, 0xcf, 0x95, 0x1b, 0xc0, 0xbb, 0x0d, +- 0xc4, 0x89, 0x54, 0xc6, 0x53, 0xc7, 0xab, 0x2e, 0xd7, 0xb9, 0x76, 0x79, +- 0x73, 0x05, 0xa1, 0xe7, 0x0f, 0x4e, 0xf9, 0x63, 0x4e, 0x4a, 0x63, 0x7f, +- 0x22, 0x16, 0xb4, 0x38, 0xc6, 0xe8, 0xfb, 0xb4, 0x7b, 0x12, 0x7a, 0x9c, +- 0x3a, 0x9f, 0xef, 0xed, 0xc0, 0xd7, 0xa3, 0x2e, 0xa0, 0x3e, 0x57, 0x1b, +- 0x10, 0xcf, 0x43, 0xd7, 0x8f, 0x94, 0x34, 0x97, 0x1f, 0xfb, 0x6a, 0x30, +- 0x31, 0x93, 0x55, 0xdd, 0x00, 0x7f, 0xaf, 0xf4, 0x26, 0xf3, 0x41, 0x67, +- 0x24, 0x50, 0x5d, 0xa7, 0x61, 0x6c, 0xc6, 0x9a, 0x46, 0x0b, 0x74, 0x83, +- 0xc8, 0x55, 0xf0, 0xc6, 0x6b, 0x0b, 0xe4, 0xd7, 0x60, 0xbb, 0x89, 0xaf, +- 0x96, 0x76, 0x58, 0xd2, 0xae, 0xb5, 0xcf, 0xbc, 0x13, 0xa1, 0x7f, 0x32, +- 0x9c, 0xec, 0x87, 0x9f, 0xad, 0xd8, 0x03, 0xe6, 0x2b, 0x0f, 0x22, 0x1e, +- 0xab, 0xce, 0xb1, 0x40, 0xbe, 0xc6, 0xd9, 0x9f, 0x85, 0x5f, 0xb9, 0x52, +- 0xf7, 0xc8, 0x17, 0x27, 0x35, 0xb7, 0x39, 0xb7, 0xd0, 0xa2, 0x3a, 0x76, +- 0xae, 0x38, 0x86, 0x73, 0x91, 0xad, 0xd6, 0x50, 0xde, 0xeb, 0x0f, 0x4b, +- 0xb1, 0xc8, 0xb6, 0x74, 0x35, 0xe8, 0xb9, 0xfb, 0xb5, 0x1d, 0x5b, 0xe6, +- 0xe1, 0x2b, 0x16, 0x17, 0x1d, 0xfc, 0xf7, 0xe0, 0xbf, 0x0f, 0xff, 0xbb, +- 0x25, 0x3d, 0x4d, 0xff, 0x95, 0xb5, 0x9c, 0x96, 0xba, 0xf5, 0xe9, 0x23, +- 0x75, 0x29, 0x0e, 0x2c, 0xef, 0xc5, 0x39, 0xf9, 0x62, 0xbd, 0x9c, 0x30, +- 0x4f, 0xea, 0xeb, 0x08, 0xe6, 0x4b, 0xfd, 0x5a, 0x5f, 0x75, 0x0d, 0xcb, +- 0xf2, 0xea, 0x5e, 0xe4, 0xe9, 0x66, 0x39, 0x5c, 0xf4, 0x6b, 0x57, 0x31, +- 0x39, 0x52, 0xa9, 0x5d, 0x49, 0x26, 0x38, 0xf4, 0xc9, 0x23, 0xd9, 0x29, +- 0xc5, 0x13, 0x58, 0xd6, 0xd0, 0xf5, 0x47, 0x26, 0x16, 0xdf, 0x7e, 0x64, +- 0x05, 0x13, 0x8e, 0x7b, 0x8b, 0xab, 0x61, 0x86, 0x88, 0xa5, 0xe3, 0xb7, +- 0x72, 0xea, 0xbb, 0x61, 0xdf, 0x7e, 0xcc, 0x43, 0x9c, 0x1d, 0xf4, 0x4c, +- 0xf3, 0x0a, 0x76, 0xd7, 0xc4, 0xa3, 0xc4, 0x91, 0xf2, 0xb9, 0x6a, 0xec, +- 0x47, 0x08, 0xe7, 0x2f, 0x01, 0xcb, 0xc9, 0x61, 0x1f, 0x3f, 0xed, 0x34, +- 0x7e, 0x20, 0x71, 0xa6, 0x89, 0x2a, 0xec, 0x91, 0x8f, 0x35, 0x7d, 0x09, +- 0x73, 0x65, 0xe4, 0x77, 0xa5, 0x47, 0xe5, 0x57, 0xa5, 0x31, 0xc8, 0xf7, +- 0x04, 0xe6, 0x3c, 0x20, 0x6f, 0x96, 0xf6, 0xc9, 0xb5, 0xd2, 0xb8, 0xbc, +- 0x51, 0xda, 0x8d, 0x98, 0x6a, 0x94, 0x58, 0x4f, 0x0f, 0x2b, 0x3d, 0x2c, +- 0x07, 0xcf, 0x2b, 0x06, 0xf0, 0x16, 0xfd, 0x9e, 0xe3, 0xea, 0x67, 0x13, +- 0x5f, 0x9f, 0xf8, 0x35, 0xe3, 0x79, 0x62, 0x33, 0x8b, 0x25, 0x1f, 0xc3, +- 0x71, 0xb4, 0x0b, 0x6b, 0xdb, 0xfc, 0x36, 0x65, 0xe4, 0x7c, 0x24, 0x30, +- 0x7a, 0x3e, 0x14, 0x78, 0x50, 0xbf, 0x73, 0x61, 0xbd, 0xb3, 0x2c, 0x93, +- 0xae, 0x43, 0xde, 0x1c, 0x1c, 0x81, 0x2c, 0x8c, 0x42, 0xd5, 0x3f, 0xe4, +- 0xac, 0x17, 0x90, 0x34, 0xf5, 0x11, 0xfc, 0xcc, 0xe4, 0x8b, 0xae, 0x64, +- 0x0b, 0xf3, 0x01, 0x83, 0x47, 0xb3, 0xd1, 0xee, 0x43, 0xfb, 0xe7, 0x5e, +- 0x7b, 0xa7, 0x64, 0x67, 0x25, 0xf5, 0xbe, 0xfa, 0xc3, 0x2f, 0x7b, 0x7d, +- 0x83, 0xe8, 0x03, 0x67, 0x5e, 0x64, 0xdf, 0x45, 0xaf, 0x8f, 0x67, 0xc2, +- 0x5a, 0x7d, 0x5c, 0xf9, 0x2a, 0x6b, 0x8f, 0x8b, 0x7e, 0xd7, 0xa0, 0xb5, +- 0xf8, 0x0f, 0x3a, 0x8d, 0x6e, 0x23, 0x26, 0xf0, 0x9f, 0x9d, 0x8c, 0xc1, +- 0x8a, 0x90, 0xaf, 0xbb, 0xa0, 0x13, 0xff, 0xba, 0x75, 0xa5, 0x6d, 0x0d, +- 0x7d, 0x5c, 0x85, 0xd1, 0xfe, 0x58, 0xba, 0x17, 0xff, 0xed, 0xe1, 0x79, +- 0x9f, 0xc0, 0xbb, 0xe1, 0xac, 0x0a, 0xc4, 0x8d, 0xc7, 0x21, 0xdb, 0x2d, +- 0xb2, 0xfe, 0x2c, 0xe9, 0xd5, 0x0b, 0x5d, 0x9d, 0x82, 0xdc, 0xba, 0xb2, +- 0x50, 0x0a, 0x05, 0x46, 0x0a, 0x29, 0x31, 0x78, 0x6a, 0x4b, 0x32, 0xd1, +- 0x94, 0x9c, 0x1e, 0x48, 0xf4, 0x30, 0x0f, 0x99, 0xed, 0x77, 0xe5, 0x52, +- 0x89, 0xf6, 0x38, 0x27, 0x97, 0x07, 0x12, 0x6e, 0x51, 0x88, 0x8b, 0x71, +- 0xe5, 0x32, 0x64, 0xf3, 0x9d, 0xf3, 0xbb, 0xe5, 0x48, 0x41, 0xfd, 0xe0, +- 0xde, 0xb0, 0xbc, 0x20, 0x97, 0x06, 0x5e, 0xb8, 0x75, 0xc9, 0x3d, 0x84, +- 0x33, 0x25, 0x1f, 0x1e, 0xee, 0x32, 0xfb, 0x56, 0x1c, 0x92, 0x30, 0x1f, +- 0xa2, 0x35, 0x35, 0xa7, 0x51, 0xd2, 0xfb, 0x23, 0x5e, 0x5c, 0x0e, 0x9f, +- 0x3b, 0x30, 0x60, 0xea, 0x29, 0x01, 0x7f, 0x9f, 0x61, 0xf8, 0x31, 0x7c, +- 0xce, 0xa7, 0x8d, 0x3f, 0x4f, 0x67, 0x20, 0x3d, 0xdb, 0x2a, 0xa1, 0x8b, +- 0xf7, 0x81, 0xae, 0x21, 0x39, 0xd4, 0x5f, 0x2e, 0x7f, 0xd3, 0x0d, 0xc5, +- 0x27, 0x10, 0xa3, 0x60, 0xff, 0xb2, 0xee, 0xc5, 0x36, 0xd0, 0xa4, 0x49, +- 0xa2, 0x2f, 0xfa, 0xeb, 0x35, 0x7a, 0x58, 0x86, 0x8b, 0xeb, 0x8c, 0x2d, +- 0xf3, 0xb1, 0x0d, 0xfe, 0x7c, 0x06, 0x53, 0xd6, 0x6d, 0xf5, 0x07, 0xbc, +- 0xef, 0x24, 0xbc, 0xf6, 0x3d, 0x81, 0x07, 0x42, 0xed, 0x12, 0x72, 0x9e, +- 0xdf, 0x48, 0x6c, 0xe4, 0x52, 0xc1, 0xef, 0x87, 0x9f, 0x18, 0xf2, 0xfd, +- 0x61, 0xd9, 0xbe, 0x72, 0xd6, 0xb2, 0xbd, 0x7b, 0xf1, 0x5b, 0xde, 0x9c, +- 0x29, 0x6f, 0x2c, 0x62, 0x8e, 0xd8, 0x5a, 0xb5, 0x4f, 0x66, 0xec, 0xa7, +- 0xf2, 0x74, 0x7f, 0xe2, 0x15, 0xc5, 0xc9, 0x56, 0x9e, 0xe1, 0x7d, 0xc4, +- 0x90, 0x25, 0x7d, 0x26, 0xb6, 0x07, 0xf4, 0xcd, 0xc4, 0xee, 0xb6, 0xe7, +- 0xad, 0x60, 0xc0, 0xf8, 0x23, 0x0d, 0xf2, 0xbd, 0x28, 0xec, 0x36, 0xbf, +- 0x61, 0x61, 0xfe, 0xcb, 0xbd, 0xed, 0xf9, 0x29, 0xec, 0x4b, 0x9c, 0x49, +- 0x5a, 0x13, 0xd8, 0x1f, 0xcf, 0x80, 0x18, 0x50, 0x0b, 0x74, 0xea, 0xc4, +- 0xfb, 0x21, 0x7e, 0xea, 0xf7, 0xdf, 0x7f, 0x1d, 0x74, 0x18, 0xf7, 0x6f, +- 0x70, 0x61, 0x62, 0x31, 0x17, 0x32, 0xec, 0x61, 0x60, 0xab, 0xe5, 0xd6, +- 0xc7, 0xc6, 0xfa, 0x78, 0x3a, 0x62, 0x94, 0x62, 0xf0, 0x03, 0x29, 0x13, +- 0xe4, 0xcd, 0x0e, 0xf4, 0xaf, 0xf9, 0x24, 0xa5, 0xaf, 0xee, 0xf7, 0x7d, +- 0x58, 0xc1, 0x76, 0x4f, 0x14, 0xf6, 0x19, 0x6c, 0x9e, 0xb5, 0x2c, 0xa9, +- 0xae, 0xa4, 0x3d, 0x89, 0xfd, 0xa6, 0x43, 0x89, 0x62, 0x4e, 0x62, 0x32, +- 0x0f, 0x7d, 0xf1, 0x1a, 0x64, 0xff, 0x5a, 0x29, 0x1e, 0x48, 0x63, 0x4f, +- 0x87, 0x0b, 0x43, 0x32, 0x31, 0xab, 0xdf, 0x7e, 0x41, 0xef, 0x0f, 0xc9, +- 0x5c, 0x21, 0xd1, 0x33, 0x0f, 0xfe, 0x9b, 0x2f, 0x10, 0x5f, 0xd4, 0x1b, +- 0x1f, 0xc5, 0x8c, 0x4b, 0x85, 0xcd, 0xb0, 0x0f, 0x92, 0xba, 0x04, 0xff, +- 0xe7, 0x52, 0xa9, 0x07, 0x7c, 0x86, 0xfb, 0x25, 0x07, 0xbf, 0xd0, 0x99, +- 0xa5, 0x01, 0xc8, 0x39, 0xf7, 0x62, 0xcb, 0xc2, 0x56, 0x9c, 0x1d, 0x71, +- 0x44, 0x8a, 0x1f, 0xff, 0x2f, 0xce, 0xd7, 0x7f, 0xef, 0x1d, 0x6a, 0xa7, +- 0xe7, 0x75, 0x5f, 0xb0, 0xcb, 0x88, 0x01, 0xb2, 0xfd, 0xc6, 0x6e, 0xa7, +- 0x23, 0x6d, 0x92, 0xbe, 0x9b, 0x76, 0xbc, 0x5d, 0x63, 0x44, 0xe5, 0xc5, +- 0x08, 0xef, 0xbf, 0xb3, 0xd1, 0xd0, 0x2f, 0x5c, 0xd7, 0xbe, 0x8e, 0xdf, +- 0x56, 0xe9, 0x70, 0xf8, 0x6b, 0xe3, 0xf7, 0xed, 0x8d, 0xac, 0xef, 0x76, +- 0x38, 0x49, 0xac, 0xf5, 0x5b, 0x2f, 0x5f, 0x80, 0xeb, 0x79, 0x3e, 0xb3, +- 0xc1, 0x5b, 0x97, 0xf3, 0xb6, 0x62, 0x9e, 0x16, 0x6f, 0xad, 0x56, 0xcd, +- 0x4f, 0x9a, 0xb5, 0x10, 0xe3, 0x16, 0xfe, 0xb2, 0x51, 0xbf, 0x35, 0x86, +- 0xbd, 0xa8, 0x6d, 0xff, 0x79, 0x23, 0x71, 0x73, 0x1d, 0x4e, 0xab, 0x62, +- 0x3c, 0x6f, 0xb6, 0xb7, 0xe3, 0x9a, 0x6b, 0x72, 0x8c, 0xc9, 0x87, 0xcf, +- 0x95, 0x38, 0x3f, 0xdb, 0x29, 0x39, 0xa1, 0xf9, 0x0c, 0x83, 0xe5, 0x9b, +- 0x2b, 0xdc, 0x2f, 0x13, 0xe7, 0x15, 0x5f, 0x37, 0x93, 0xb7, 0xf8, 0xdd, +- 0x0b, 0xbf, 0x97, 0xa3, 0x2f, 0x31, 0x26, 0x07, 0x71, 0x7e, 0x97, 0xe1, +- 0x53, 0x2d, 0x99, 0xef, 0x62, 0xf1, 0x77, 0x00, 0xe7, 0x12, 0x82, 0x8c, +- 0x51, 0x46, 0x29, 0x53, 0x38, 0xbf, 0x71, 0x5b, 0xde, 0x1d, 0xa0, 0x3c, +- 0x0f, 0xc8, 0x95, 0x8a, 0x3c, 0xe7, 0x20, 0xcf, 0x94, 0xe5, 0x1c, 0x64, +- 0xda, 0xf0, 0xf5, 0x7e, 0x7e, 0x67, 0x1d, 0x83, 0xbd, 0x52, 0x1f, 0xe2, +- 0x25, 0xf0, 0xb5, 0xed, 0x7d, 0x2b, 0x15, 0xd0, 0x1c, 0x4e, 0x76, 0xb6, +- 0xc1, 0xfb, 0x0e, 0x00, 0xd7, 0x57, 0x9e, 0x93, 0xf4, 0x6c, 0x33, 0xbf, +- 0xe7, 0xea, 0xe2, 0x99, 0x65, 0xaf, 0xf0, 0xdf, 0xe7, 0x45, 0xe2, 0x4d, +- 0xe9, 0xcf, 0xf2, 0x9a, 0x71, 0xde, 0x26, 0x8c, 0x19, 0x04, 0x9d, 0x9b, +- 0x31, 0x3f, 0xf7, 0xb8, 0xda, 0x38, 0xde, 0x0f, 0x55, 0xe1, 0x53, 0x7d, +- 0x7a, 0xaf, 0xd5, 0x35, 0xb3, 0xfd, 0xcd, 0xde, 0xfb, 0xf1, 0x1c, 0x94, +- 0xef, 0xc1, 0xb7, 0xf4, 0x89, 0xc9, 0x2f, 0x29, 0x3d, 0x87, 0xb9, 0x02, +- 0xf9, 0x37, 0xa4, 0x39, 0x8c, 0x2c, 0x6c, 0xcb, 0x5e, 0x1d, 0x1f, 0x5b, +- 0x91, 0xef, 0xae, 0x80, 0xc6, 0xdd, 0xd9, 0xc2, 0x1a, 0xe9, 0x56, 0x1d, +- 0xd4, 0xe5, 0xf1, 0x36, 0xec, 0x85, 0x62, 0xb9, 0x0f, 0xc8, 0xf1, 0xd2, +- 0x20, 0xe8, 0x10, 0x93, 0xa7, 0xe0, 0x37, 0x3f, 0x53, 0xba, 0x43, 0x96, +- 0x23, 0xd8, 0x57, 0x45, 0xc6, 0x86, 0xe5, 0xfb, 0xf3, 0x09, 0xef, 0x3a, +- 0xe1, 0x2e, 0x5b, 0x3b, 0xb0, 0x07, 0xca, 0x13, 0xe5, 0x8a, 0xe3, 0x82, +- 0x88, 0x45, 0x38, 0xef, 0xd3, 0x46, 0xb7, 0x61, 0xde, 0x62, 0x84, 0xf2, +- 0xcb, 0xbd, 0x85, 0x3c, 0x99, 0x65, 0x5c, 0xc5, 0x77, 0x36, 0x36, 0x29, +- 0x53, 0x73, 0x16, 0x09, 0xc5, 0x81, 0xae, 0x9c, 0x81, 0x3f, 0x8f, 0x2f, +- 0x97, 0xfe, 0x77, 0x14, 0xd4, 0xa3, 0xb0, 0x95, 0x05, 0xd8, 0xca, 0x02, +- 0x6c, 0x24, 0x64, 0xe1, 0x5a, 0x01, 0x36, 0xb2, 0x00, 0x1b, 0x09, 0x7d, +- 0xf6, 0x3a, 0x62, 0xbb, 0xd7, 0xc0, 0x43, 0xc6, 0xd7, 0x3e, 0x4a, 0x5f, +- 0x1b, 0x7f, 0xff, 0x03, 0x4c, 0x03, 0x3a, 0xe1, 0xd4, 0x71, 0x00, 0x00, +- 0x00 }; ++ 0xec, 0x5c, 0x6f, 0x6c, 0x1c, 0xc7, 0x75, 0x7f, 0xbb, 0xb7, 0xa4, 0x4e, ++ 0x14, 0x49, 0xad, 0xa8, 0x33, 0x75, 0x92, 0x19, 0xe7, 0x8e, 0x5c, 0x8a, ++ 0xac, 0xc8, 0x3a, 0x2b, 0xe2, 0x24, 0xb3, 0xe9, 0x21, 0x5e, 0x2f, 0xa9, ++ 0x98, 0x31, 0x94, 0x9a, 0xb6, 0x85, 0xd4, 0x48, 0x8d, 0xf6, 0x70, 0x94, ++ 0x63, 0x7f, 0x48, 0x01, 0xc9, 0xa9, 0x1d, 0x37, 0x75, 0xab, 0xcb, 0x91, ++ 0xb6, 0x54, 0xf7, 0xa4, 0x65, 0x23, 0x41, 0x2a, 0x90, 0x16, 0xa5, 0xf9, ++ 0x47, 0x54, 0xdc, 0x93, 0x57, 0x72, 0x93, 0x56, 0x4d, 0x21, 0x8b, 0x90, ++ 0x65, 0xd5, 0x1f, 0x82, 0xc0, 0x68, 0x5a, 0xc0, 0x08, 0x82, 0x56, 0xa5, ++ 0x6a, 0xd9, 0x40, 0x81, 0x42, 0x49, 0xe0, 0x56, 0x4d, 0x14, 0x6d, 0x7f, ++ 0xbf, 0xd9, 0x5d, 0xea, 0x4c, 0xa8, 0x88, 0xbf, 0xf4, 0xdb, 0x0e, 0x70, ++ 0x98, 0x9d, 0xd9, 0x37, 0x6f, 0xde, 0x7b, 0xf3, 0xfe, 0xcd, 0x5b, 0x4a, ++ 0xcf, 0xb5, 0x4a, 0x8b, 0x44, 0xad, 0x0d, 0xbf, 0x1d, 0xfb, 0x9e, 0x7f, ++ 0xc6, 0xbe, 0xd7, 0xbe, 0x17, 0x8f, 0x4f, 0xa5, 0x44, 0x9a, 0x38, 0xaf, ++ 0x49, 0xd2, 0x92, 0x96, 0xb4, 0xa4, 0x25, 0x2d, 0x69, 0x49, 0x4b, 0x5a, ++ 0xd2, 0x92, 0x96, 0xb4, 0xa4, 0x25, 0x2d, 0x69, 0x49, 0x4b, 0x5a, 0xd2, ++ 0x92, 0x96, 0xb4, 0xa4, 0x25, 0x2d, 0x69, 0x49, 0x4b, 0x5a, 0xd2, 0x92, ++ 0x96, 0xb4, 0xa4, 0x25, 0x2d, 0x69, 0x49, 0x4b, 0x5a, 0xd2, 0x92, 0x96, ++ 0xb4, 0xa4, 0x25, 0x2d, 0x69, 0x49, 0x4b, 0x5a, 0xd2, 0x92, 0x96, 0xb4, ++ 0xa4, 0x25, 0x2d, 0x69, 0x49, 0x4b, 0x5a, 0xd2, 0xfe, 0x3f, 0x5a, 0x4a, ++ 0xc4, 0x64, 0xdf, 0x16, 0xfd, 0x24, 0xad, 0x17, 0x4b, 0xfb, 0x5d, 0x4b, ++ 0xd2, 0xa9, 0xa2, 0x3c, 0x37, 0x61, 0x89, 0x38, 0xf5, 0x81, 0xdc, 0x88, ++ 0xfc, 0x22, 0xa8, 0x64, 0x0c, 0xe1, 0xfc, 0x27, 0x8a, 0x37, 0x0f, 0x9c, ++ 0xbf, 0x2f, 0x7f, 0x7d, 0x26, 0x25, 0x69, 0xb3, 0xf8, 0xee, 0x76, 0x73, ++ 0xab, 0xa4, 0xbb, 0xb0, 0xe6, 0xcf, 0xfb, 0x02, 0x53, 0xda, 0x63, 0x5c, ++ 0x41, 0xb0, 0x60, 0x07, 0x72, 0xd9, 0xae, 0x68, 0x23, 0x7d, 0xe7, 0x34, ++ 0xd7, 0xbb, 0x15, 0x38, 0x86, 0x2e, 0x3a, 0xf0, 0xed, 0xad, 0xa7, 0xe5, ++ 0xc9, 0xf9, 0x16, 0xf9, 0xd2, 0xcc, 0x3a, 0x29, 0xcf, 0x88, 0xa9, 0x17, ++ 0xb3, 0xf2, 0x14, 0xe6, 0xae, 0xa4, 0x00, 0xe7, 0x4b, 0x29, 0x55, 0xbc, ++ 0xf1, 0x70, 0xb9, 0x46, 0x78, 0xd1, 0xf5, 0xe2, 0xd2, 0xc3, 0x7b, 0xeb, ++ 0x97, 0x1e, 0x2e, 0xd7, 0x09, 0x47, 0x18, 0xbc, 0xab, 0xb7, 0x4a, 0xf5, ++ 0x58, 0x46, 0x5e, 0xb2, 0xf2, 0xc3, 0x33, 0xa2, 0x6f, 0xd4, 0xa5, 0x62, ++ 0xea, 0x92, 0x77, 0xaa, 0x32, 0x60, 0xbe, 0x2d, 0xbf, 0x29, 0x8e, 0x19, ++ 0x72, 0xf6, 0xe6, 0xf4, 0x5a, 0x29, 0x0f, 0x3e, 0x22, 0xce, 0xb8, 0x26, ++ 0x17, 0xa7, 0x2b, 0x26, 0x38, 0x05, 0x4f, 0xd6, 0xfe, 0x09, 0x2b, 0x6f, ++ 0x8e, 0xe0, 0xbd, 0x5b, 0x4b, 0x8b, 0xa3, 0x20, 0x35, 0xc0, 0xb6, 0x80, ++ 0xb6, 0x4f, 0x4b, 0x39, 0xc3, 0x71, 0x8f, 0xd9, 0xac, 0xb5, 0x88, 0x3b, ++ 0xb8, 0x53, 0x9c, 0x8c, 0x2e, 0x97, 0x41, 0xf3, 0x72, 0x4d, 0x34, 0xb7, ++ 0x80, 0xbe, 0x2e, 0xc0, 0x45, 0x78, 0x5d, 0x2e, 0x4d, 0xa7, 0xe4, 0xad, ++ 0x69, 0xe9, 0x02, 0xde, 0x4e, 0x5d, 0x7a, 0x89, 0xb3, 0xdb, 0x40, 0x3f, ++ 0x8a, 0xdf, 0x2e, 0x31, 0xb0, 0xce, 0xb8, 0x13, 0x3c, 0x60, 0xb9, 0xe6, ++ 0x4e, 0xf0, 0xaf, 0xb6, 0x4a, 0x4b, 0x1a, 0x6b, 0x08, 0x0f, 0xe6, 0xad, ++ 0x4e, 0xd0, 0x13, 0xee, 0x4f, 0x1c, 0x97, 0xa6, 0x45, 0xae, 0xd6, 0xa4, ++ 0x43, 0x57, 0x6b, 0x0c, 0x99, 0x28, 0xf0, 0x5d, 0x2b, 0xe0, 0x5f, 0x55, ++ 0xff, 0x3e, 0xe7, 0xaa, 0x5a, 0x97, 0xc2, 0xba, 0xf4, 0xca, 0x3a, 0xd0, ++ 0x8d, 0x39, 0x0d, 0xcf, 0x69, 0x71, 0x0b, 0xa6, 0x5c, 0x9d, 0x09, 0x61, ++ 0x97, 0x95, 0xbc, 0x35, 0xc0, 0x86, 0xb4, 0xe9, 0x96, 0x2e, 0x65, 0x48, ++ 0xf1, 0x92, 0x95, 0xcf, 0x89, 0x46, 0x98, 0xbc, 0x5d, 0x11, 0xf6, 0x5c, ++ 0x4b, 0xf9, 0x85, 0x73, 0x17, 0x85, 0xeb, 0xf2, 0x90, 0xf0, 0x07, 0xc1, ++ 0xf9, 0xbe, 0x8c, 0x5c, 0xf0, 0x4d, 0x39, 0xe3, 0x9b, 0x1d, 0xd2, 0x9e, ++ 0xaf, 0x54, 0xa4, 0x49, 0xca, 0x47, 0x6f, 0x05, 0x29, 0xe2, 0xd0, 0x2d, ++ 0xf0, 0x87, 0xf7, 0x1e, 0xde, 0x7b, 0x98, 0x9f, 0xdb, 0xdc, 0x21, 0x2d, ++ 0x59, 0x39, 0xdf, 0xc7, 0x75, 0x5c, 0xc3, 0xb5, 0xd9, 0xf5, 0xe1, 0x3a, ++ 0xc1, 0xba, 0x71, 0x49, 0x59, 0x81, 0xb8, 0xb6, 0x21, 0x23, 0x19, 0xd1, ++ 0x74, 0xab, 0x02, 0x5d, 0xe8, 0x6e, 0xc3, 0x9e, 0xc0, 0x55, 0xd1, 0x1c, ++ 0x9f, 0x7d, 0x8c, 0xef, 0xf8, 0xfa, 0x10, 0x57, 0x05, 0xb8, 0x9e, 0x97, ++ 0x37, 0xfc, 0xdf, 0x93, 0xbf, 0xf5, 0xf7, 0xca, 0x5f, 0xfb, 0x2f, 0x00, ++ 0xe7, 0x3e, 0xf9, 0x1b, 0xff, 0xcb, 0xf2, 0x1d, 0xff, 0x69, 0xf9, 0xb6, ++ 0x5f, 0x92, 0xd7, 0xfd, 0x27, 0xe4, 0xac, 0xff, 0x38, 0xf6, 0xeb, 0xd7, ++ 0xc6, 0xbd, 0xfb, 0x65, 0xe2, 0x28, 0x69, 0xcc, 0x5f, 0x87, 0x7e, 0xca, ++ 0x57, 0xec, 0x3e, 0x70, 0xac, 0x61, 0xcf, 0xfc, 0x39, 0x91, 0x2f, 0xe1, ++ 0xac, 0xc7, 0x65, 0xc6, 0xef, 0xd4, 0xdc, 0xa3, 0x1d, 0xda, 0xc8, 0x51, ++ 0xd2, 0x12, 0xc8, 0x84, 0x9d, 0xcf, 0xb9, 0xe0, 0x77, 0x24, 0x25, 0xce, ++ 0x2e, 0x2b, 0x2b, 0x55, 0x2f, 0x4b, 0xfd, 0x72, 0xfe, 0xd4, 0x32, 0xa0, ++ 0xd3, 0x9a, 0x40, 0x9f, 0xc0, 0xe7, 0xc6, 0x48, 0xe7, 0x5a, 0x65, 0xae, ++ 0x66, 0x4b, 0xd9, 0xfb, 0x8e, 0x56, 0xce, 0x50, 0xb6, 0x26, 0xc6, 0x83, ++ 0x18, 0x9f, 0x8d, 0xc6, 0xd0, 0xaf, 0x13, 0xe2, 0x4c, 0x1e, 0x0b, 0x02, ++ 0xd7, 0xae, 0x47, 0x73, 0xc3, 0x98, 0xd3, 0xa5, 0xe7, 0x38, 0xe7, 0x16, ++ 0xa3, 0x39, 0xca, 0x23, 0x90, 0x11, 0x9b, 0x62, 0x04, 0xbd, 0xe6, 0x38, ++ 0xfa, 0x66, 0xf4, 0xdc, 0xe3, 0xcb, 0x6d, 0xe1, 0xbf, 0xc5, 0xa2, 0x8d, ++ 0x3d, 0x8b, 0x67, 0x1b, 0x34, 0x4b, 0xfa, 0x9e, 0xe2, 0xd2, 0xfe, 0x7f, ++ 0xe9, 0xbb, 0x3d, 0xd6, 0x8b, 0x3f, 0x82, 0x7e, 0x6b, 0xca, 0x5e, 0x35, ++ 0x3c, 0x77, 0xd7, 0x7f, 0xd8, 0x11, 0xda, 0x66, 0x0a, 0xb2, 0x83, 0x9c, ++ 0x3c, 0xd2, 0x9f, 0x03, 0xfd, 0x6d, 0x52, 0xf8, 0x06, 0x79, 0x18, 0xc8, ++ 0xe9, 0xe2, 0xe4, 0x0d, 0xb1, 0x65, 0xde, 0x37, 0xb4, 0x11, 0xcf, 0x11, ++ 0xbd, 0x68, 0x65, 0xcb, 0xa2, 0x4b, 0x29, 0xe3, 0xc8, 0xc1, 0x42, 0x7e, ++ 0xb8, 0x22, 0x39, 0xa9, 0x0e, 0xd9, 0xb2, 0xe8, 0x03, 0x32, 0x53, 0x91, ++ 0x6b, 0x85, 0xbc, 0x7d, 0x45, 0xd6, 0xc9, 0x92, 0x69, 0xcb, 0x49, 0x3f, ++ 0x2d, 0x6f, 0x1d, 0xdd, 0x2d, 0x4f, 0x79, 0x3c, 0x27, 0x19, 0x68, 0x92, ++ 0xaf, 0xcb, 0x42, 0xe1, 0xeb, 0xd7, 0x17, 0xec, 0xc3, 0xad, 0xd2, 0x4e, ++ 0x3f, 0x20, 0xeb, 0x43, 0xba, 0x3f, 0x03, 0xde, 0x1c, 0xc8, 0xb6, 0x1d, ++ 0x32, 0x33, 0x42, 0xbe, 0xbe, 0xd0, 0x81, 0x9e, 0xeb, 0xae, 0x6e, 0x84, ++ 0x3e, 0xd8, 0x39, 0x3d, 0xa6, 0x11, 0xbc, 0x77, 0x72, 0xcd, 0xc6, 0x36, ++ 0xcc, 0xe7, 0x6e, 0xd3, 0xbe, 0x45, 0x1b, 0x39, 0xd1, 0x2e, 0xd6, 0xf1, ++ 0x1d, 0xc0, 0x65, 0xc8, 0x8b, 0x43, 0x41, 0xf0, 0x9c, 0x6d, 0xe4, 0x46, ++ 0x65, 0x0f, 0x69, 0x97, 0xa1, 0x23, 0x77, 0xc9, 0x8c, 0x99, 0x96, 0x1d, ++ 0x47, 0xe2, 0xbd, 0xd6, 0x44, 0xe7, 0xb3, 0x8d, 0xf8, 0x73, 0x8e, 0xde, ++ 0x16, 0xfb, 0x88, 0x88, 0xa6, 0x51, 0x9c, 0x51, 0x8f, 0xe9, 0xea, 0xbb, ++ 0x34, 0xf8, 0x1c, 0xb4, 0xb1, 0x68, 0xfc, 0x80, 0xf6, 0x80, 0xd1, 0x29, ++ 0x86, 0x95, 0x6a, 0x97, 0x16, 0x43, 0x2e, 0x7a, 0xf1, 0x3c, 0xfc, 0x86, ++ 0x82, 0xa3, 0x9c, 0x65, 0xfb, 0x6d, 0x39, 0xcb, 0xf6, 0xee, 0xfa, 0x87, ++ 0xed, 0x21, 0x4e, 0x27, 0x82, 0x5d, 0x2b, 0x4e, 0xb6, 0x95, 0x67, 0x1a, ++ 0xc1, 0xde, 0x94, 0x63, 0x43, 0xf9, 0x33, 0xf4, 0x39, 0xb7, 0xd7, 0xf0, ++ 0xbd, 0x2d, 0xb3, 0xbe, 0x5a, 0x93, 0x7b, 0x14, 0x67, 0x5b, 0xc9, 0x6e, ++ 0x33, 0x2f, 0xe9, 0x9d, 0x9a, 0xa3, 0xfc, 0x51, 0xb3, 0x1c, 0xcf, 0xf4, ++ 0x60, 0xac, 0x49, 0xf5, 0xd3, 0xd4, 0x57, 0x33, 0x9a, 0xe7, 0x5c, 0x7e, ++ 0x7a, 0x54, 0xff, 0x0f, 0x9c, 0x7b, 0x10, 0x7c, 0xc1, 0xa6, 0x8c, 0x74, ++ 0x9c, 0xd1, 0x16, 0xf0, 0x67, 0xa2, 0x8f, 0xf9, 0xdf, 0x00, 0x1f, 0x48, ++ 0xfa, 0x95, 0x9d, 0x42, 0xce, 0x59, 0xec, 0x77, 0x3f, 0x6c, 0x72, 0xb5, ++ 0xbd, 0xc2, 0x46, 0xdb, 0x69, 0xab, 0xbf, 0x06, 0x9e, 0xf3, 0xfd, 0x90, ++ 0x3b, 0xe4, 0x95, 0x95, 0x66, 0x4b, 0x5f, 0x4f, 0x3f, 0xa0, 0x5b, 0x9b, ++ 0x30, 0xbf, 0xf6, 0x46, 0xe8, 0x33, 0xe3, 0xb9, 0x1b, 0x91, 0x2c, 0x77, ++ 0xcb, 0x84, 0xb7, 0x47, 0xf1, 0x3c, 0xab, 0xff, 0x54, 0x9c, 0xae, 0x1e, ++ 0x73, 0x0e, 0xf4, 0xba, 0x46, 0xfe, 0x54, 0x49, 0xb2, 0x38, 0x17, 0x13, ++ 0xb6, 0x98, 0x81, 0x6d, 0xe6, 0x60, 0x5f, 0x8e, 0x3c, 0xe9, 0x15, 0x65, ++ 0xe2, 0x04, 0x6d, 0x2c, 0x6f, 0xd2, 0xbe, 0xd4, 0xd9, 0x79, 0x41, 0x30, ++ 0x61, 0x8b, 0xe3, 0x5a, 0x03, 0xd9, 0x49, 0xea, 0x21, 0xf4, 0x73, 0xd6, ++ 0xef, 0x97, 0x05, 0xbf, 0x37, 0xa7, 0xc6, 0xbe, 0x85, 0xe7, 0x41, 0xe8, ++ 0x77, 0x01, 0xf6, 0x4d, 0xde, 0xd2, 0x11, 0x6f, 0xf0, 0x8f, 0xd0, 0xbb, ++ 0x9c, 0x3e, 0x2c, 0x0b, 0x7d, 0xf3, 0xd0, 0xb7, 0x61, 0xc0, 0xac, 0x13, ++ 0x67, 0x0f, 0xe7, 0x87, 0x65, 0xd6, 0x83, 0xef, 0xa6, 0x0e, 0x28, 0xb8, ++ 0xa2, 0xcc, 0x79, 0x25, 0x45, 0x67, 0x19, 0x67, 0x30, 0x62, 0x94, 0x64, ++ 0xc2, 0xe7, 0x3c, 0xf9, 0x32, 0x65, 0xbe, 0x0f, 0xe7, 0xe0, 0xe9, 0xc0, ++ 0xab, 0x61, 0xfd, 0x2d, 0x9c, 0x55, 0x2c, 0xc3, 0xfb, 0xc0, 0x67, 0x06, ++ 0x6b, 0xc9, 0xe3, 0x16, 0x99, 0xed, 0xc4, 0x59, 0x0c, 0x65, 0x94, 0x8d, ++ 0x97, 0x3b, 0xee, 0x92, 0xf2, 0xb6, 0x66, 0xbc, 0xef, 0xc4, 0x98, 0x67, ++ 0xb9, 0x06, 0x73, 0x7c, 0xff, 0x3b, 0x91, 0x2e, 0x34, 0xad, 0x1a, 0x7f, ++ 0x11, 0x7d, 0xbb, 0x6c, 0xb2, 0xd8, 0x9b, 0xe8, 0x7f, 0x1b, 0x7d, 0x07, ++ 0xfa, 0x1e, 0xec, 0x75, 0x1e, 0xe7, 0xc1, 0xb3, 0xc0, 0xf3, 0x1c, 0xd7, ++ 0x6c, 0x8e, 0xf6, 0x25, 0xde, 0x76, 0xe0, 0x69, 0x8b, 0xf6, 0x6a, 0xc7, ++ 0xb8, 0x25, 0xda, 0xcb, 0x02, 0xcd, 0x5f, 0x6d, 0xe7, 0x79, 0xb8, 0xf4, ++ 0xfd, 0x1f, 0x19, 0x3f, 0xdb, 0xce, 0x98, 0xb2, 0xc9, 0x6a, 0x57, 0x3e, ++ 0x7e, 0xb9, 0xb3, 0x13, 0xcf, 0xdc, 0x93, 0x30, 0x7c, 0x8f, 0xde, 0x27, ++ 0x7e, 0x8e, 0x1d, 0xf9, 0x8a, 0xc7, 0xd8, 0x08, 0x3d, 0xf4, 0xf7, 0x60, ++ 0xbc, 0x53, 0xf6, 0x82, 0xf7, 0x09, 0x2f, 0x7f, 0x68, 0x56, 0x0f, 0x02, ++ 0xbd, 0x60, 0x98, 0x55, 0xc9, 0xc3, 0x27, 0x8c, 0x41, 0x66, 0xb0, 0x79, ++ 0x2f, 0x2d, 0x17, 0x95, 0x1d, 0x93, 0xa7, 0xc7, 0x21, 0x17, 0x43, 0xba, ++ 0x3b, 0x69, 0xeb, 0x5b, 0x34, 0xf7, 0x04, 0xe4, 0x37, 0x6e, 0xca, 0xe5, ++ 0x02, 0xfd, 0x42, 0x41, 0x16, 0x57, 0xfc, 0x42, 0x05, 0x7e, 0x81, 0x3e, ++ 0xa1, 0x02, 0xdf, 0x10, 0xda, 0xc8, 0x63, 0xb2, 0x09, 0x36, 0x92, 0xe5, ++ 0x39, 0xc1, 0x46, 0xfe, 0x0c, 0x36, 0x62, 0x42, 0xde, 0xb0, 0x1b, 0x93, ++ 0xfa, 0xf5, 0x34, 0xfc, 0x23, 0xf8, 0xcd, 0x44, 0xcf, 0x8b, 0x5f, 0x13, ++ 0xf7, 0x04, 0x62, 0xb3, 0xf5, 0xf7, 0x4a, 0x66, 0xe5, 0x45, 0xfe, 0x62, ++ 0xbd, 0xfe, 0x43, 0xc8, 0x0f, 0x3e, 0x59, 0xe9, 0x33, 0x78, 0x2b, 0xfc, ++ 0x1d, 0x60, 0xc6, 0x65, 0xce, 0x6f, 0x01, 0x7e, 0xd2, 0x78, 0x27, 0x38, ++ 0xbe, 0x47, 0x5e, 0x53, 0xa0, 0xee, 0x63, 0x7e, 0x2e, 0x3e, 0xef, 0x56, ++ 0xb5, 0x67, 0x75, 0xa8, 0x25, 0xe2, 0x8f, 0x72, 0xa0, 0x0d, 0x65, 0x61, ++ 0x03, 0x9a, 0x4c, 0x28, 0x3b, 0x70, 0x94, 0x1c, 0xa0, 0x2f, 0xeb, 0xe9, ++ 0x1f, 0x5c, 0x9b, 0x32, 0x30, 0xe5, 0x11, 0x05, 0x9f, 0xbd, 0xed, 0x2b, ++ 0xba, 0x34, 0xac, 0xe1, 0x78, 0xad, 0xb8, 0xca, 0x9f, 0x75, 0x45, 0x76, ++ 0xd2, 0x14, 0xf9, 0x91, 0xc7, 0x65, 0xbf, 0x3f, 0x0e, 0xfd, 0xce, 0xca, ++ 0x33, 0x7e, 0x97, 0x3c, 0x0b, 0xdd, 0xbd, 0xd2, 0x31, 0x0e, 0xbc, 0x31, ++ 0xbd, 0xf7, 0xcb, 0x57, 0x19, 0x3f, 0xd5, 0x33, 0x7c, 0xae, 0x7e, 0x1f, ++ 0xf0, 0xd1, 0x36, 0x69, 0xa3, 0x84, 0x4b, 0x45, 0x34, 0x7e, 0xb3, 0x35, ++ 0x84, 0x69, 0x92, 0xa5, 0x8e, 0x3c, 0x38, 0x26, 0x6d, 0x46, 0x64, 0x23, ++ 0x79, 0xb3, 0x24, 0xe4, 0x99, 0xb4, 0xf2, 0xb9, 0x51, 0x16, 0xec, 0x1b, ++ 0x65, 0x10, 0xe3, 0x89, 0x6d, 0x7c, 0x54, 0x1c, 0x9f, 0x3d, 0x7d, 0x2f, ++ 0xe2, 0xad, 0x87, 0x78, 0xeb, 0x21, 0xce, 0x7a, 0x88, 0xb3, 0x1e, 0xe2, ++ 0xac, 0x87, 0xd8, 0x0b, 0x9b, 0x7a, 0xdd, 0x43, 0xac, 0xf5, 0x10, 0x6b, ++ 0x3d, 0xe6, 0x08, 0x15, 0xc4, 0x67, 0x43, 0x0e, 0x22, 0xff, 0x78, 0xa9, ++ 0xc6, 0x7c, 0x21, 0x3f, 0xfc, 0x9e, 0x0c, 0xf4, 0xbf, 0x27, 0xcc, 0x21, ++ 0xf2, 0xf6, 0x5b, 0xc8, 0x5f, 0x0e, 0xaa, 0x1c, 0x04, 0xef, 0xeb, 0x71, ++ 0x7e, 0x88, 0xf3, 0xb7, 0x98, 0x03, 0x86, 0xf3, 0x70, 0xaf, 0x88, 0x41, ++ 0xf9, 0x7e, 0x37, 0x35, 0x26, 0xb3, 0x88, 0x99, 0x53, 0xf6, 0xdd, 0xe0, ++ 0xb3, 0x43, 0xa6, 0xac, 0x70, 0xec, 0xda, 0xdb, 0xe0, 0x37, 0xa0, 0x3b, ++ 0x26, 0x73, 0x9e, 0x2d, 0xf8, 0xe5, 0x10, 0xb7, 0xff, 0x44, 0x73, 0xe7, ++ 0x04, 0x71, 0x9a, 0xb1, 0x1b, 0xbe, 0x44, 0xe9, 0xd1, 0xad, 0x60, 0x62, ++ 0x65, 0xcd, 0x00, 0xf4, 0x1b, 0x72, 0x47, 0x2e, 0x5b, 0xf5, 0x8e, 0x69, ++ 0x23, 0x8b, 0x45, 0xc5, 0xa3, 0x5b, 0xe0, 0xf8, 0x56, 0x64, 0x7b, 0xdc, ++ 0x1f, 0x63, 0x3f, 0xcc, 0xa5, 0xae, 0xa4, 0x88, 0xf3, 0x0a, 0x72, 0x8d, ++ 0xac, 0xf2, 0x61, 0x67, 0x55, 0xce, 0xd3, 0x85, 0x5c, 0x23, 0x08, 0xce, ++ 0xda, 0x41, 0xf0, 0x0e, 0x7e, 0x3f, 0xb1, 0x57, 0x78, 0x40, 0xab, 0x68, ++ 0xa3, 0x7e, 0x4e, 0x46, 0xfd, 0x7b, 0xd6, 0x87, 0x72, 0x14, 0x99, 0xc4, ++ 0x39, 0x4c, 0x79, 0x35, 0xed, 0x91, 0xc5, 0x23, 0xda, 0xf8, 0xe2, 0x34, ++ 0xf6, 0x4d, 0x63, 0x4e, 0x2a, 0x55, 0xfb, 0x94, 0x36, 0xe2, 0x1f, 0xd2, ++ 0x1e, 0x5d, 0x0c, 0xe3, 0x61, 0xd5, 0x63, 0xfe, 0x71, 0x53, 0xe5, 0x41, ++ 0x2e, 0xf2, 0xd4, 0x2f, 0x42, 0xf1, 0xdc, 0x1a, 0xe9, 0x6e, 0x8e, 0x68, ++ 0x86, 0x1d, 0x16, 0x83, 0x03, 0x6e, 0xc1, 0x82, 0x2d, 0x92, 0x46, 0x35, ++ 0x77, 0x21, 0xa4, 0xfb, 0xa4, 0xe6, 0x2e, 0xb6, 0x22, 0x36, 0x32, 0xb6, ++ 0x33, 0xc7, 0xe4, 0xba, 0x5e, 0xd8, 0x6b, 0x1d, 0x7b, 0x30, 0x7f, 0xa6, ++ 0x6c, 0x41, 0x37, 0x74, 0xf8, 0x75, 0x0f, 0x7c, 0xa8, 0x5c, 0x8a, 0xfc, ++ 0xe5, 0x70, 0x56, 0x31, 0x7f, 0x41, 0xf0, 0x8f, 0x76, 0x4c, 0x3f, 0x63, ++ 0x65, 0xcc, 0x6f, 0x10, 0xfc, 0xd8, 0x26, 0xcf, 0xe4, 0x29, 0x08, 0xce, ++ 0x80, 0xbe, 0x49, 0xec, 0xab, 0x5b, 0x35, 0xf0, 0xc3, 0x3c, 0x81, 0x32, ++ 0x3f, 0x02, 0x3e, 0x0e, 0x81, 0xc7, 0x93, 0xe0, 0x6f, 0x1a, 0xb4, 0xfc, ++ 0xb2, 0x3d, 0x69, 0xef, 0xc3, 0xc8, 0x53, 0xde, 0xc6, 0xde, 0xfd, 0xd8, ++ 0xdb, 0x06, 0xfe, 0x41, 0xe4, 0x71, 0x16, 0xf6, 0xcc, 0x61, 0xcf, 0xfc, ++ 0x34, 0x95, 0xa0, 0x1d, 0x30, 0xdf, 0xef, 0x65, 0xce, 0x11, 0x04, 0x9f, ++ 0xb7, 0xf2, 0x4f, 0x53, 0xc2, 0x53, 0x9e, 0x38, 0x55, 0x5b, 0xd9, 0x26, ++ 0x64, 0x98, 0x63, 0xae, 0x02, 0x79, 0x34, 0xd3, 0xc7, 0x63, 0xbc, 0x22, ++ 0x13, 0xc4, 0x91, 0xef, 0x32, 0xc6, 0x9b, 0x6e, 0x81, 0xb0, 0x31, 0xdc, ++ 0x9a, 0x48, 0xd6, 0x41, 0x90, 0x82, 0x2c, 0x27, 0x0a, 0x84, 0x93, 0x8a, ++ 0xd2, 0x01, 0xc4, 0x82, 0x49, 0xe4, 0x90, 0x63, 0x5e, 0x07, 0xce, 0x01, ++ 0xba, 0xe9, 0x31, 0x46, 0x55, 0xfb, 0x71, 0x84, 0xda, 0x45, 0x7b, 0x44, ++ 0xe9, 0xda, 0xbc, 0x25, 0xce, 0x45, 0xdb, 0xe4, 0xde, 0xb9, 0x8b, 0x76, ++ 0x05, 0x98, 0xc2, 0x73, 0x1a, 0xa9, 0x19, 0x78, 0xc7, 0x31, 0xf2, 0x3e, ++ 0x3f, 0x3e, 0xbb, 0x0c, 0xfc, 0x6b, 0x7c, 0xa6, 0xf1, 0xdc, 0xbf, 0xa9, ++ 0xfc, 0x75, 0xd6, 0xff, 0x14, 0x70, 0xfc, 0xb2, 0xf5, 0x59, 0xc4, 0x32, ++ 0xe2, 0xc8, 0xca, 0xb7, 0xbc, 0xfc, 0x30, 0xec, 0x28, 0x47, 0xbb, 0x68, ++ 0x85, 0x0f, 0xff, 0x2b, 0xc8, 0xaf, 0xa5, 0x28, 0xda, 0x43, 0xbd, 0x79, ++ 0x73, 0xaf, 0x96, 0x12, 0x6c, 0xb5, 0xcd, 0x00, 0xb3, 0xb9, 0x0d, 0xe1, ++ 0xfd, 0xc7, 0x45, 0xde, 0x3f, 0x85, 0x78, 0x34, 0x39, 0x98, 0x37, 0x67, ++ 0xc3, 0x3b, 0x92, 0xf9, 0x90, 0xba, 0xf7, 0xfc, 0x34, 0x28, 0x65, 0xb6, ++ 0x0e, 0x2f, 0x03, 0x91, 0x51, 0x34, 0xb6, 0x4f, 0xd5, 0xf6, 0x09, 0x73, ++ 0xc1, 0xc9, 0xc1, 0xb5, 0x52, 0x32, 0x7b, 0x9c, 0x31, 0x75, 0x4f, 0x4a, ++ 0x6f, 0x9f, 0xb0, 0x42, 0xda, 0x46, 0xe0, 0x37, 0x26, 0x91, 0x93, 0x8e, ++ 0xd5, 0x99, 0xaf, 0x18, 0xdb, 0x7b, 0xea, 0xad, 0x26, 0x63, 0xca, 0x41, ++ 0xff, 0x1e, 0xe8, 0x5a, 0x17, 0x7c, 0xbd, 0x8a, 0xdb, 0xb8, 0x71, 0x50, ++ 0xd7, 0xa0, 0xd7, 0x7e, 0x2b, 0xe6, 0xc0, 0x0f, 0xe4, 0x3b, 0x6a, 0x33, ++ 0x6e, 0xa4, 0xa2, 0x7b, 0x55, 0x16, 0xeb, 0x72, 0x82, 0xf0, 0xe4, 0xb8, ++ 0x2a, 0x26, 0x33, 0xc6, 0x9a, 0x1c, 0x9b, 0x17, 0xed, 0x8c, 0xba, 0xa7, ++ 0x3d, 0xba, 0x33, 0x87, 0x98, 0x82, 0xd8, 0x9d, 0xa1, 0xee, 0x58, 0xe6, ++ 0x45, 0x24, 0xad, 0xe1, 0xbc, 0xb4, 0xe3, 0xac, 0xda, 0x98, 0x93, 0xbe, ++ 0x49, 0xbd, 0x2e, 0xd0, 0x8e, 0xd7, 0xc4, 0xef, 0xa0, 0x47, 0x83, 0x0d, ++ 0xf9, 0xee, 0x20, 0xf2, 0xdd, 0x26, 0x35, 0xdf, 0x54, 0x2c, 0xc8, 0x42, ++ 0x6d, 0xb3, 0xcc, 0xec, 0xa1, 0xce, 0xb4, 0xd2, 0xbe, 0x54, 0x5e, 0x30, ++ 0xe5, 0xf1, 0xfc, 0xe9, 0x1f, 0x3a, 0xa2, 0xb1, 0xf6, 0xc9, 0x70, 0x3f, ++ 0x31, 0x99, 0x13, 0x8f, 0xa8, 0x39, 0xd1, 0x95, 0x8e, 0x65, 0xf8, 0xdc, ++ 0xae, 0x7d, 0x16, 0x79, 0xfa, 0x83, 0x3b, 0x29, 0x7f, 0xde, 0xd5, 0x82, ++ 0xe0, 0xb2, 0xfd, 0xfb, 0xb0, 0x05, 0x5d, 0x9a, 0xac, 0x1b, 0x26, 0xf3, ++ 0xee, 0x0b, 0x88, 0xa7, 0xa1, 0x7e, 0xb5, 0x52, 0x37, 0x40, 0x3f, 0xe9, ++ 0x7a, 0x17, 0x74, 0x71, 0x6d, 0x45, 0xc5, 0x0d, 0x57, 0xad, 0xe3, 0x1a, ++ 0xd2, 0xf9, 0x2e, 0xe8, 0xfc, 0x10, 0x6b, 0x53, 0xb2, 0xc6, 0xe2, 0xba, ++ 0x5d, 0x71, 0x5e, 0x8a, 0x75, 0x36, 0xd6, 0xb5, 0x45, 0x7a, 0x4a, 0x3a, ++ 0x95, 0xae, 0xaf, 0xc7, 0x7d, 0x83, 0xba, 0xaa, 0xe9, 0xc5, 0xd8, 0x8f, ++ 0x11, 0x3c, 0xa6, 0xed, 0x27, 0xc0, 0xc5, 0x7d, 0xda, 0x90, 0xff, 0x8a, ++ 0x56, 0xa5, 0x1c, 0xb1, 0x26, 0xa4, 0x49, 0xf4, 0x54, 0x71, 0x8d, 0x8c, ++ 0x20, 0x2f, 0xae, 0x7a, 0x96, 0xf9, 0x79, 0x9c, 0xeb, 0x6f, 0x80, 0x0f, ++ 0x77, 0x9a, 0x7e, 0xe6, 0x2f, 0xb0, 0x6e, 0x29, 0xaf, 0x87, 0x6a, 0x03, ++ 0x9d, 0xa7, 0xdc, 0xde, 0x81, 0xdc, 0xf4, 0xce, 0x66, 0xa4, 0xc8, 0xe3, ++ 0x38, 0xa7, 0xd9, 0x61, 0xd0, 0x3e, 0xd8, 0x2a, 0xa9, 0x7b, 0xe9, 0x67, ++ 0x70, 0x07, 0xca, 0x2c, 0xc1, 0xa9, 0xdf, 0x0c, 0xf4, 0xad, 0x58, 0x3f, ++ 0x88, 0xb3, 0xdb, 0x13, 0xe6, 0x9e, 0x21, 0x1c, 0x61, 0x18, 0x93, 0xdc, ++ 0x8e, 0x66, 0x21, 0x6e, 0xbe, 0x1b, 0xc0, 0xe1, 0x73, 0x1e, 0xfe, 0x78, ++ 0x9c, 0x6b, 0x49, 0x73, 0xb8, 0xa6, 0xc9, 0x8a, 0xe5, 0xf9, 0x00, 0xe4, ++ 0xf9, 0xf3, 0xe0, 0xc1, 0xa1, 0xf8, 0x3d, 0xf9, 0x21, 0x5f, 0x4a, 0x5f, ++ 0xd2, 0x1b, 0x8a, 0x96, 0x6c, 0x3f, 0x42, 0xbd, 0x19, 0x53, 0xb9, 0x41, ++ 0xf7, 0x50, 0xbe, 0x92, 0xd3, 0x37, 0x81, 0x57, 0x43, 0x1e, 0x1b, 0x22, ++ 0xbf, 0x77, 0x45, 0x39, 0x43, 0x23, 0xcf, 0xeb, 0x23, 0x9e, 0xd5, 0x7e, ++ 0xc3, 0x8e, 0x7e, 0x9b, 0xf7, 0xd1, 0xe9, 0x78, 0x5f, 0xf8, 0x66, 0x6b, ++ 0x09, 0x77, 0x9f, 0x07, 0xa2, 0xf3, 0xbc, 0x15, 0xe8, 0x96, 0x55, 0xe9, ++ 0xd6, 0x7f, 0x1e, 0x3c, 0x3a, 0xa4, 0xa9, 0x1c, 0x0b, 0xa9, 0xb8, 0xe8, ++ 0x43, 0xe0, 0x75, 0x88, 0x79, 0x8d, 0x0e, 0xdd, 0x22, 0xbe, 0x1f, 0x93, ++ 0x37, 0xe0, 0x6c, 0x09, 0xef, 0x32, 0x43, 0xf1, 0x1e, 0x8d, 0x3a, 0x12, ++ 0xe3, 0x24, 0x2e, 0xc2, 0xa8, 0x33, 0xe1, 0x99, 0xa6, 0x5d, 0x3b, 0x1d, ++ 0x9d, 0x77, 0xbc, 0x4e, 0x34, 0xc3, 0x5a, 0xbd, 0x2e, 0x2b, 0xa5, 0x4e, ++ 0xea, 0x56, 0x63, 0x1d, 0x45, 0x72, 0xea, 0x8e, 0x3f, 0xcf, 0x7b, 0x3b, ++ 0x6b, 0x28, 0xa6, 0x94, 0xe6, 0x63, 0x5f, 0x1b, 0xeb, 0x22, 0x69, 0x62, ++ 0x7f, 0x27, 0xbd, 0x25, 0x5e, 0xe2, 0xe7, 0xde, 0x84, 0x81, 0xcf, 0xf5, ++ 0xe0, 0x7f, 0x91, 0x03, 0x9e, 0x85, 0x1f, 0x38, 0xe3, 0x31, 0x5e, 0xd3, ++ 0x47, 0x0f, 0x37, 0xdc, 0xd7, 0x5b, 0x4b, 0x46, 0x91, 0x77, 0x76, 0x19, ++ 0xaf, 0xd6, 0x0e, 0x20, 0x4e, 0x4a, 0x65, 0x8b, 0xba, 0xfb, 0xb6, 0x0e, ++ 0xbb, 0x05, 0xcc, 0xd5, 0x19, 0x2b, 0xe1, 0x3e, 0x8a, 0xc8, 0xc9, 0xfd, ++ 0x74, 0x5a, 0x3f, 0x92, 0xae, 0xdc, 0x5d, 0xa4, 0x8e, 0xe7, 0x24, 0x57, ++ 0xbf, 0x8e, 0x38, 0x84, 0x9c, 0x4e, 0xe9, 0x86, 0x7b, 0x37, 0xef, 0x14, ++ 0x55, 0xc4, 0x13, 0xa3, 0x28, 0x86, 0x5e, 0x6c, 0x4e, 0x4f, 0x16, 0x5a, ++ 0x11, 0x7f, 0xc7, 0x36, 0xeb, 0xaf, 0xed, 0xde, 0x9c, 0x7a, 0xad, 0xb3, ++ 0xd4, 0x54, 0xac, 0x6c, 0xd6, 0x8f, 0x08, 0xee, 0xce, 0xa2, 0x23, 0xce, ++ 0x65, 0xf7, 0x0a, 0xc6, 0xaf, 0x3d, 0xf6, 0x98, 0x5e, 0x54, 0x7e, 0xe4, ++ 0x85, 0x79, 0xf8, 0xe9, 0xd9, 0x5a, 0x3e, 0x37, 0x2e, 0x2f, 0x48, 0xb5, ++ 0xf6, 0xbc, 0x4c, 0xc2, 0xf1, 0x55, 0x11, 0xa3, 0x26, 0x7d, 0xa9, 0xe8, ++ 0x45, 0xf8, 0xb2, 0x82, 0xc8, 0x48, 0x0d, 0xf2, 0x44, 0x9e, 0x35, 0xe9, ++ 0xe7, 0xed, 0x12, 0xb8, 0xfc, 0xa0, 0x46, 0x9d, 0xbe, 0x09, 0x9d, 0xa6, ++ 0xcf, 0xbb, 0x21, 0x53, 0xb5, 0x1e, 0xbb, 0x59, 0x53, 0x79, 0x49, 0xff, ++ 0x49, 0x19, 0xb0, 0x4f, 0xc2, 0xaf, 0x22, 0xb7, 0xcd, 0xbd, 0x24, 0xa4, ++ 0xf9, 0xa6, 0xf4, 0x2a, 0x5f, 0x77, 0x43, 0xac, 0x3a, 0x32, 0x2c, 0xe4, ++ 0x57, 0xfa, 0xd0, 0x7f, 0x06, 0x8e, 0x99, 0xb7, 0xf9, 0xdf, 0x9c, 0x5c, ++ 0xbb, 0x03, 0xae, 0xb7, 0x15, 0x1e, 0xe2, 0x6b, 0xc4, 0xa5, 0xc9, 0x9a, ++ 0xa1, 0x18, 0x5f, 0x97, 0x1c, 0xf2, 0x63, 0x9c, 0x7b, 0xe5, 0x0a, 0xbc, ++ 0xb1, 0x3e, 0xd4, 0xaf, 0xee, 0xe0, 0xae, 0xaf, 0xe2, 0x35, 0xee, 0xdc, ++ 0xd0, 0x0b, 0x55, 0x13, 0x31, 0xc8, 0x8b, 0xf2, 0x9f, 0x7a, 0xa1, 0x39, ++ 0xf2, 0x9d, 0xed, 0xda, 0xae, 0x13, 0xdc, 0xef, 0x3a, 0x74, 0xf5, 0x77, ++ 0x37, 0x44, 0xff, 0x1f, 0x4b, 0xe4, 0x47, 0xd7, 0xad, 0xe8, 0x51, 0x08, ++ 0xf3, 0x01, 0x60, 0xda, 0x55, 0x9c, 0x5e, 0xb0, 0xe3, 0xb9, 0xb7, 0xb7, ++ 0x4f, 0x59, 0x53, 0x2b, 0xeb, 0x46, 0x10, 0x87, 0xab, 0xd0, 0x91, 0x10, ++ 0xb7, 0x81, 0x31, 0x64, 0xe8, 0xad, 0xde, 0xeb, 0x5c, 0xc3, 0x9a, 0x78, ++ 0xee, 0x4a, 0x03, 0x6e, 0xfa, 0xa9, 0xa5, 0xb0, 0x8e, 0x66, 0x2a, 0x7f, ++ 0x89, 0xf1, 0xa5, 0x06, 0x3f, 0x7c, 0x09, 0xfe, 0xed, 0x6c, 0xb4, 0xde, ++ 0x8c, 0x7c, 0x63, 0x8b, 0xca, 0x63, 0x26, 0x15, 0x6c, 0xae, 0x01, 0x36, ++ 0x07, 0xd8, 0xe3, 0x61, 0xbe, 0x24, 0x7e, 0xb4, 0x86, 0xf9, 0x85, 0x65, ++ 0x32, 0xa6, 0x84, 0xfc, 0x05, 0x07, 0x57, 0xc6, 0x99, 0x52, 0x84, 0xaf, ++ 0x29, 0x7a, 0xb7, 0xb5, 0x2d, 0xd4, 0xe7, 0x78, 0xed, 0xcf, 0x36, 0x84, ++ 0xe3, 0x66, 0x55, 0xaf, 0x01, 0x2c, 0xe4, 0x9b, 0x2b, 0xe9, 0xd0, 0xe1, ++ 0x91, 0x7a, 0x28, 0x03, 0xe4, 0x1e, 0xac, 0x37, 0xf2, 0x2e, 0x8b, 0xb3, ++ 0xd8, 0x1f, 0x30, 0x97, 0xd0, 0x8b, 0x0e, 0xcf, 0xc2, 0x31, 0x48, 0x9b, ++ 0x3f, 0xc6, 0x33, 0xd9, 0x17, 0xd6, 0x41, 0x7e, 0x55, 0xf6, 0xaa, 0x7d, ++ 0x06, 0xcc, 0x49, 0xe2, 0xcc, 0x08, 0x70, 0xc1, 0x0e, 0xe1, 0x53, 0xcb, ++ 0x0a, 0xff, 0x7f, 0x45, 0xfb, 0xf6, 0x45, 0x75, 0x1a, 0x35, 0xc6, 0xfc, ++ 0x18, 0xf0, 0x19, 0xcc, 0xbb, 0x11, 0x1f, 0x99, 0x4b, 0xac, 0x93, 0x91, ++ 0x0c, 0xf2, 0xab, 0x3e, 0x07, 0xb8, 0x63, 0x7b, 0xee, 0x52, 0x35, 0x9f, ++ 0xc9, 0xfa, 0x3a, 0xa9, 0xce, 0xc4, 0x76, 0x1c, 0xaf, 0x6f, 0xcc, 0x2b, ++ 0x89, 0x8b, 0x78, 0xe0, 0xcf, 0x22, 0xdb, 0xaf, 0xce, 0x70, 0x0e, 0x67, ++ 0x39, 0x3f, 0x8a, 0xde, 0x92, 0x6a, 0x7d, 0xf5, 0xfa, 0x7b, 0xa2, 0xba, ++ 0x4f, 0x3c, 0x7e, 0xf8, 0xee, 0x70, 0xcc, 0xe7, 0xe7, 0x23, 0xfe, 0x07, ++ 0xf8, 0x0e, 0xbc, 0x43, 0x97, 0xbc, 0xcf, 0x84, 0xf7, 0x05, 0x75, 0xdf, ++ 0x82, 0x9f, 0xf5, 0x39, 0xb7, 0xb4, 0xc6, 0xb5, 0x63, 0x39, 0xef, 0xc6, ++ 0xdc, 0x38, 0x7e, 0x71, 0xfd, 0x70, 0x0f, 0x9e, 0x9d, 0x08, 0x4e, 0x86, ++ 0xc3, 0x98, 0x1e, 0xdf, 0x17, 0xe2, 0x3c, 0x5e, 0xa6, 0xf5, 0x22, 0x73, ++ 0xec, 0x5e, 0xd8, 0x05, 0xf3, 0x4a, 0xc8, 0x76, 0x85, 0xa7, 0x15, 0x98, ++ 0xca, 0x6d, 0x98, 0x30, 0x3f, 0x1c, 0xf5, 0xe3, 0x9c, 0x94, 0x79, 0x67, ++ 0x9c, 0x87, 0x3a, 0xda, 0xb8, 0x37, 0xa6, 0x3d, 0xe2, 0x11, 0x5e, 0x3f, ++ 0xb6, 0x41, 0xac, 0x5c, 0xb7, 0x1e, 0xc8, 0xc8, 0x10, 0xef, 0xb7, 0x2f, ++ 0x43, 0xf6, 0xeb, 0xa5, 0xdc, 0x8f, 0x98, 0x6e, 0xde, 0x87, 0xbe, 0x19, ++ 0x73, 0xbf, 0x8e, 0x39, 0x9c, 0x51, 0x3f, 0x73, 0xbe, 0xb5, 0xea, 0x9e, ++ 0x50, 0x52, 0x31, 0xa2, 0x37, 0x3a, 0xa7, 0x1f, 0x74, 0x84, 0xe7, 0xf6, ++ 0x07, 0x18, 0xaf, 0xc3, 0xfc, 0x6f, 0xa1, 0x0f, 0x82, 0xee, 0xa1, 0x78, ++ 0x9e, 0xba, 0x37, 0x8c, 0xf9, 0x1d, 0xc0, 0x51, 0xc1, 0xf3, 0x27, 0xf1, ++ 0xfc, 0x47, 0xab, 0xd6, 0x7e, 0x0d, 0xe3, 0x0a, 0xe6, 0xdd, 0x55, 0xf3, ++ 0xf1, 0xd9, 0x71, 0xbf, 0x8a, 0x36, 0xee, 0x4f, 0x69, 0x8e, 0xca, 0xf5, ++ 0x5f, 0xc6, 0x7d, 0x82, 0xe7, 0xc7, 0x7b, 0xc5, 0x34, 0xf2, 0x65, 0x9e, ++ 0xdd, 0xf7, 0xb1, 0x66, 0x1e, 0xe7, 0xd1, 0xa2, 0x32, 0x35, 0x5d, 0xd9, ++ 0xc4, 0x99, 0xfd, 0xdd, 0x33, 0xec, 0xcf, 0xed, 0xb7, 0xeb, 0x84, 0xe1, ++ 0xf3, 0xb7, 0xf7, 0x77, 0xd7, 0xff, 0x19, 0xb0, 0xcc, 0xa9, 0x1b, 0xeb, ++ 0xea, 0xe7, 0x56, 0xed, 0x19, 0xde, 0x43, 0xc6, 0x55, 0x2d, 0xf0, 0xcc, ++ 0x7e, 0x77, 0x9a, 0xf1, 0x98, 0x77, 0x42, 0xe6, 0x76, 0xe7, 0xf6, 0x4f, ++ 0xd4, 0xa6, 0xa2, 0x7b, 0x47, 0xfc, 0x9e, 0xef, 0x28, 0xff, 0x3b, 0xd1, ++ 0x46, 0xba, 0x1a, 0xf1, 0x84, 0xb9, 0x4d, 0x0a, 0xb4, 0x4c, 0xd4, 0x78, ++ 0x7f, 0x51, 0x75, 0x7b, 0x45, 0x6f, 0x6e, 0xe6, 0x4e, 0xb4, 0x11, 0x17, ++ 0xf7, 0x8a, 0xf1, 0x7d, 0x03, 0x77, 0x83, 0x77, 0x48, 0x2f, 0xf0, 0x7c, ++ 0x22, 0xca, 0x61, 0x9a, 0x54, 0x2d, 0x4f, 0xd5, 0x59, 0xd4, 0x38, 0xbe, ++ 0x9f, 0x36, 0xad, 0xba, 0x9f, 0x36, 0x45, 0x75, 0x2b, 0xc2, 0xea, 0x11, ++ 0xac, 0xfa, 0x6e, 0x81, 0xb9, 0x5c, 0x54, 0x43, 0x4e, 0xb3, 0x86, 0xdc, ++ 0x20, 0x8b, 0xa6, 0x48, 0xfe, 0xea, 0x6e, 0x18, 0xd9, 0x47, 0x23, 0x7d, ++ 0xac, 0x2f, 0x4f, 0xe1, 0x7d, 0x7c, 0x36, 0x31, 0xef, 0xf3, 0x98, 0x27, ++ 0xbd, 0xa7, 0x00, 0x1f, 0xd3, 0xfb, 0x71, 0xcf, 0x94, 0x6b, 0x4f, 0xe1, ++ 0x17, 0xef, 0x17, 0xcb, 0x85, 0xb4, 0xfe, 0x5f, 0xf7, 0xa1, 0x30, 0xd6, ++ 0x86, 0x75, 0xf1, 0xf0, 0xfc, 0x1c, 0xe8, 0xfc, 0x05, 0xd6, 0x4e, 0x24, ++ 0xae, 0x79, 0xf3, 0x1e, 0x4c, 0xdf, 0xcb, 0xf3, 0x5a, 0x03, 0x5d, 0x21, ++ 0x9c, 0x26, 0x55, 0xca, 0xc2, 0x74, 0x73, 0xc8, 0xd7, 0xb3, 0x4f, 0xca, ++ 0x35, 0xec, 0xe5, 0xf4, 0x37, 0x45, 0xb5, 0xfa, 0x12, 0xfc, 0xd5, 0x12, ++ 0x74, 0x9a, 0xdf, 0x03, 0x66, 0x71, 0xc7, 0x58, 0x40, 0x5f, 0xad, 0x5f, ++ 0xef, 0x60, 0xcd, 0x62, 0xca, 0xba, 0x7d, 0xd7, 0x9e, 0x01, 0xcc, 0x9c, ++ 0xc5, 0xfb, 0x78, 0x94, 0x08, 0x22, 0xcf, 0xd6, 0x91, 0x2f, 0x4c, 0x58, ++ 0x3f, 0x0b, 0xca, 0x99, 0x46, 0xd8, 0x3b, 0xd5, 0xfe, 0xe3, 0x3a, 0x42, ++ 0xae, 0xa1, 0x8e, 0x90, 0x6f, 0xa8, 0xd9, 0x7f, 0xb3, 0x35, 0xa2, 0x5f, ++ 0x26, 0xed, 0x40, 0xe2, 0x6f, 0x43, 0x0f, 0xf6, 0x35, 0xea, 0x6b, 0xbf, ++ 0xf2, 0xbd, 0x13, 0xea, 0x3b, 0x0b, 0xe5, 0x6b, 0xc8, 0x95, 0x7a, 0x5a, ++ 0xae, 0xce, 0xb7, 0xc8, 0xf2, 0x4c, 0xe8, 0xef, 0x96, 0x95, 0x7f, 0x34, ++ 0xe5, 0x3d, 0x5c, 0xc2, 0xae, 0xd4, 0xfb, 0xf1, 0xeb, 0x90, 0x6b, 0xf3, ++ 0xf1, 0xb7, 0xa3, 0x58, 0x7e, 0xf7, 0x83, 0x96, 0x8e, 0x48, 0x17, 0x90, ++ 0xcb, 0x9b, 0xfc, 0x96, 0x11, 0xd6, 0x78, 0x55, 0xfc, 0x31, 0x28, 0x53, ++ 0xd6, 0x72, 0xe3, 0x3a, 0x67, 0x0f, 0xf2, 0x7e, 0x64, 0x7f, 0x46, 0x87, ++ 0x34, 0xab, 0xba, 0x4a, 0x18, 0xaf, 0x54, 0x3e, 0xaf, 0x78, 0x26, 0xdd, ++ 0xbc, 0xa3, 0x0e, 0xc2, 0x07, 0xe5, 0x0f, 0xcd, 0x20, 0x67, 0x7a, 0x1d, ++ 0xbc, 0x2f, 0xf4, 0xe5, 0xa7, 0x2b, 0xc2, 0xba, 0x63, 0x3f, 0xe4, 0x50, ++ 0x50, 0xf2, 0x98, 0xf1, 0x59, 0x7f, 0xcc, 0x57, 0x84, 0x79, 0xae, 0xc9, ++ 0xfb, 0x73, 0x5a, 0xba, 0x8f, 0x4c, 0x49, 0xd9, 0x37, 0x80, 0xd7, 0x91, ++ 0x92, 0x3f, 0x8c, 0x3d, 0x0f, 0x23, 0xff, 0xfa, 0xe1, 0x46, 0xd6, 0xaf, ++ 0x9a, 0xad, 0xb8, 0x8e, 0x49, 0xbf, 0x99, 0x12, 0xd3, 0x2a, 0x60, 0x7c, ++ 0x9f, 0x4c, 0x1c, 0x9d, 0x92, 0xbd, 0xde, 0xca, 0x37, 0x88, 0xec, 0x3e, ++ 0xa9, 0x64, 0x53, 0xc8, 0x31, 0x58, 0xa7, 0x9f, 0x97, 0x75, 0xd1, 0xb9, ++ 0xb3, 0x86, 0x0a, 0xdc, 0xaa, 0x6e, 0xda, 0x63, 0xee, 0x42, 0x8e, 0x5d, ++ 0x06, 0x1f, 0x25, 0xa5, 0xfb, 0x9c, 0x7f, 0x06, 0x7b, 0xf4, 0x54, 0x76, ++ 0x01, 0xae, 0x8c, 0x3b, 0xda, 0x38, 0x72, 0xb0, 0x39, 0xc4, 0xa2, 0xb2, ++ 0x0d, 0x1b, 0x1e, 0xcf, 0xea, 0xfa, 0xbd, 0x5d, 0x32, 0xeb, 0x0d, 0x98, ++ 0x3a, 0xeb, 0x50, 0x99, 0xd0, 0xc6, 0xca, 0x4a, 0x8f, 0xb2, 0xba, 0x61, ++ 0x75, 0xc9, 0xbc, 0x57, 0x91, 0xea, 0x20, 0xc7, 0x3c, 0xdf, 0x0a, 0x68, ++ 0x0b, 0x6d, 0xd2, 0xd1, 0x35, 0x55, 0xe7, 0x2c, 0xab, 0x1a, 0xec, 0x01, ++ 0xd0, 0x88, 0x7e, 0xce, 0x00, 0x9f, 0x8c, 0xe5, 0xac, 0x1d, 0x16, 0x65, ++ 0xdf, 0x62, 0xcc, 0xd7, 0x7a, 0x55, 0x8b, 0x5e, 0xa9, 0xc1, 0xaa, 0x5a, ++ 0x66, 0x5c, 0x7f, 0x4d, 0x47, 0xf5, 0xd7, 0xbf, 0xdc, 0x18, 0xfa, 0xae, ++ 0x12, 0xe4, 0xc3, 0x75, 0xff, 0x1d, 0xd5, 0x61, 0x88, 0x77, 0x1c, 0xb0, ++ 0xed, 0xd2, 0x73, 0xdc, 0xc9, 0x99, 0xea, 0x2e, 0xfa, 0x38, 0xf0, 0x73, ++ 0x8e, 0x35, 0xe3, 0x27, 0x28, 0x57, 0xec, 0x9b, 0x45, 0x4f, 0x39, 0x77, ++ 0xa1, 0xe7, 0x5e, 0xdc, 0x17, 0xe7, 0xbc, 0x27, 0x27, 0xb3, 0x47, 0x77, ++ 0x4a, 0x69, 0x6e, 0x27, 0x70, 0xfe, 0x2b, 0x70, 0xee, 0x88, 0xea, 0x7b, ++ 0x31, 0xee, 0xef, 0x6e, 0xe4, 0x3d, 0xb6, 0xfb, 0x08, 0xe7, 0xd9, 0xef, ++ 0xc6, 0x7a, 0x0b, 0xb8, 0x55, 0xcd, 0x13, 0x30, 0xd0, 0x11, 0xbf, 0xf1, ++ 0xdb, 0x54, 0x07, 0x63, 0x37, 0x73, 0x5f, 0xf8, 0xc2, 0x99, 0xed, 0x6e, ++ 0x2d, 0x6f, 0xba, 0xaa, 0x6e, 0xde, 0x2f, 0xa1, 0x7f, 0xe4, 0x5c, 0x5a, ++ 0xac, 0x23, 0xb8, 0x27, 0x15, 0xf9, 0xee, 0xc0, 0x4a, 0x7d, 0x7b, 0x44, ++ 0xde, 0x95, 0x51, 0xe8, 0x72, 0xcf, 0x11, 0xc4, 0x68, 0xff, 0x47, 0xc8, ++ 0x41, 0x36, 0x47, 0xb2, 0x1c, 0x8e, 0x74, 0xb0, 0xa5, 0x41, 0xf7, 0xa0, ++ 0x4b, 0x1e, 0x74, 0x0c, 0x79, 0xf9, 0x59, 0xe4, 0xe5, 0x67, 0x56, 0xf4, ++ 0x70, 0xb8, 0xc1, 0x47, 0xb4, 0xc9, 0x3f, 0x4c, 0xe7, 0xfb, 0x97, 0xa0, ++ 0xa7, 0xd7, 0xc0, 0xeb, 0x12, 0xee, 0x1f, 0xcb, 0xf0, 0x7b, 0x73, 0x35, ++ 0xd6, 0xa7, 0xf9, 0xad, 0x88, 0xe3, 0x4d, 0x38, 0xd7, 0xd8, 0x7f, 0x6c, ++ 0x6c, 0x0b, 0xed, 0xaf, 0x4d, 0xd5, 0xd0, 0xae, 0x42, 0x17, 0x96, 0x4c, ++ 0xbe, 0x8b, 0xd7, 0xb4, 0x49, 0xfc, 0x3d, 0x2a, 0xd4, 0x4f, 0xd2, 0x42, ++ 0xfd, 0x6c, 0xce, 0xb0, 0x46, 0x7d, 0xc1, 0xe3, 0x37, 0x1a, 0xe6, 0xdf, ++ 0x7c, 0x7e, 0x60, 0x63, 0x88, 0xab, 0xd1, 0x3e, 0x6e, 0x80, 0xae, 0x8a, ++ 0xe6, 0xf6, 0xc1, 0xc7, 0xf8, 0x81, 0xbc, 0x6c, 0x7f, 0xd4, 0xae, 0x3f, ++ 0xeb, 0xc5, 0xf2, 0xa1, 0xfc, 0x76, 0xcb, 0x4b, 0x7e, 0x1e, 0x36, 0x47, ++ 0xd9, 0x59, 0x0d, 0xb2, 0x13, 0xf9, 0x16, 0x72, 0xe0, 0x53, 0x1e, 0xdf, ++ 0x29, 0xd9, 0x65, 0xdd, 0x54, 0x0b, 0x6b, 0x80, 0xd0, 0xeb, 0x7f, 0x92, ++ 0xbd, 0xc7, 0x44, 0x16, 0xf1, 0x7e, 0xc1, 0xa3, 0x2f, 0xb0, 0x90, 0x23, ++ 0xaf, 0x93, 0xd9, 0x19, 0xdc, 0x13, 0x3c, 0x29, 0xb9, 0x3b, 0xe8, 0x17, ++ 0xd3, 0xb2, 0xac, 0xee, 0x41, 0xc8, 0x06, 0x4f, 0x1b, 0x62, 0x9c, 0xc6, ++ 0x85, 0x04, 0x32, 0x3f, 0xdf, 0x17, 0xd7, 0x14, 0x43, 0x9f, 0x52, 0xad, ++ 0x61, 0xad, 0xd7, 0xa3, 0xbe, 0xb9, 0x56, 0xeb, 0x13, 0x52, 0x9e, 0xe6, ++ 0x5e, 0xe8, 0x67, 0x72, 0x78, 0x37, 0x28, 0x93, 0x47, 0x2d, 0x79, 0x91, ++ 0xdf, 0x00, 0x0a, 0x0e, 0xf6, 0xf8, 0x8c, 0x54, 0x16, 0x31, 0x5f, 0xff, ++ 0x77, 0x99, 0x99, 0x9f, 0x90, 0xd9, 0xe9, 0x0b, 0x0d, 0x35, 0x42, 0x8c, ++ 0x67, 0x1a, 0xef, 0x65, 0xbb, 0x79, 0xaf, 0x93, 0x72, 0xdd, 0x52, 0x39, ++ 0x5f, 0xb9, 0x3e, 0x59, 0xfa, 0xe8, 0x3d, 0x2d, 0xfe, 0x86, 0x4d, 0x7a, ++ 0x1c, 0x39, 0x84, 0xf3, 0xad, 0x1e, 0xb5, 0x54, 0x2e, 0xbc, 0xa6, 0xf8, ++ 0xbd, 0x67, 0xdf, 0xb7, 0x7a, 0xcc, 0x31, 0x95, 0x23, 0xde, 0x94, 0xcf, ++ 0xd9, 0x87, 0xe4, 0x49, 0x6b, 0x14, 0x77, 0xf1, 0x94, 0x3c, 0x64, 0xaf, ++ 0x95, 0xdc, 0x06, 0x9e, 0x21, 0xe8, 0xb5, 0x78, 0x2f, 0x0a, 0x64, 0xd4, ++ 0xde, 0x66, 0xfe, 0xb1, 0xf0, 0x9b, 0x2f, 0xfd, 0xf9, 0xff, 0x04, 0xcc, ++ 0xa9, 0xdf, 0xb7, 0xe0, 0x73, 0x14, 0x9c, 0x16, 0xc2, 0x4d, 0x13, 0x6e, ++ 0xc0, 0x7c, 0x99, 0x70, 0x33, 0x5a, 0x04, 0xa7, 0x01, 0x2e, 0x25, 0x17, ++ 0x71, 0xe7, 0x75, 0x32, 0x0e, 0xf8, 0xc4, 0xdd, 0x66, 0x7b, 0xfc, 0x3d, ++ 0x6c, 0x2d, 0x62, 0xc0, 0xed, 0xf5, 0x6f, 0x46, 0xeb, 0x5f, 0x8c, 0xd6, ++ 0x5f, 0x5e, 0x59, 0x1f, 0xc7, 0x81, 0x5f, 0x04, 0xd2, 0x40, 0xd7, 0x9b, ++ 0xb5, 0x10, 0xfe, 0x50, 0x44, 0xd7, 0xe5, 0x15, 0xba, 0x62, 0x78, 0xc8, ++ 0x53, 0xf1, 0x4c, 0xdf, 0xcf, 0x18, 0xd0, 0x03, 0x39, 0xf2, 0x3b, 0x27, ++ 0x6c, 0xc2, 0xe3, 0xf7, 0x45, 0xda, 0x89, 0x2e, 0x4b, 0x99, 0x43, 0x32, ++ 0x66, 0xe5, 0x87, 0x27, 0x25, 0x05, 0x1d, 0xa6, 0x6f, 0x4a, 0xc9, 0x2c, ++ 0x7d, 0x16, 0xfa, 0xb2, 0x7d, 0x67, 0x5a, 0xaf, 0x36, 0xd0, 0x9a, 0x7a, ++ 0x85, 0x34, 0x86, 0xb4, 0xa6, 0x7b, 0x6f, 0xd3, 0x1a, 0xc2, 0x87, 0xb4, ++ 0x5e, 0xad, 0x35, 0xc0, 0x9f, 0x36, 0x22, 0x78, 0xa3, 0x01, 0x9e, 0xfa, ++ 0xcc, 0xf8, 0x47, 0x7d, 0x26, 0x6d, 0x9f, 0x52, 0x35, 0x9b, 0xb5, 0xc5, ++ 0xef, 0xed, 0xff, 0x95, 0xde, 0x40, 0xd2, 0x88, 0x8b, 0xcd, 0xfc, 0xbe, ++ 0x3e, 0xcd, 0x98, 0xa9, 0x77, 0x37, 0xcb, 0x56, 0xe8, 0x2c, 0xcf, 0x2e, ++ 0xac, 0xb3, 0x7d, 0x4e, 0x58, 0x67, 0x0b, 0xe4, 0x49, 0x9b, 0xb4, 0x7c, ++ 0x18, 0x9c, 0xca, 0x6c, 0xb5, 0xab, 0xd2, 0x67, 0x36, 0x63, 0xff, 0x59, ++ 0x5f, 0xe1, 0xec, 0x27, 0x2d, 0x27, 0xfb, 0x7a, 0xcc, 0xb7, 0xc0, 0xe7, ++ 0xe8, 0xb4, 0x26, 0xb3, 0x56, 0x3e, 0x7b, 0x1e, 0x38, 0x76, 0xe1, 0x6c, ++ 0x66, 0x07, 0x49, 0x8f, 0xc8, 0x5e, 0xe8, 0xf7, 0xac, 0xca, 0x0f, 0xa8, ++ 0xc7, 0xf9, 0xb1, 0x0a, 0x62, 0xf2, 0xab, 0x2a, 0x76, 0x06, 0xc1, 0xfb, ++ 0x88, 0x9f, 0x63, 0xab, 0x74, 0x4f, 0x3f, 0x1d, 0xea, 0x9e, 0x7e, 0x1a, ++ 0xf7, 0xa9, 0xc3, 0x69, 0x59, 0xb3, 0x00, 0xfb, 0x79, 0xa5, 0x53, 0xe9, ++ 0x9f, 0xfe, 0x0a, 0xeb, 0xe3, 0xf0, 0x73, 0x87, 0x0d, 0xb1, 0x0e, 0xab, ++ 0xb8, 0xa2, 0xfc, 0xe0, 0xe4, 0x09, 0xfa, 0x52, 0x4b, 0x7a, 0x0f, 0xf3, ++ 0x3c, 0x98, 0xd7, 0xcd, 0x6c, 0x9f, 0x80, 0x8d, 0xb0, 0x5e, 0xa6, 0x2f, ++ 0x7c, 0x20, 0x13, 0x16, 0xe5, 0xd0, 0x2e, 0x2d, 0x0b, 0xa6, 0xa4, 0x16, ++ 0xe0, 0x13, 0x16, 0xb2, 0xd2, 0x04, 0xdb, 0xd2, 0x4f, 0x67, 0xb4, 0xea, ++ 0x31, 0xfa, 0x6a, 0xd6, 0x99, 0xfb, 0x31, 0xce, 0x6a, 0xb4, 0x1f, 0xfd, ++ 0x34, 0xf5, 0xdc, 0x16, 0x39, 0x4d, 0x3d, 0x27, 0x1d, 0xb1, 0xbd, 0xe0, ++ 0xf9, 0xb4, 0xa5, 0xea, 0xae, 0xef, 0xdb, 0xe4, 0xe5, 0x07, 0xe2, 0x4e, ++ 0xc7, 0x7f, 0x27, 0x22, 0x1b, 0x74, 0x91, 0xf5, 0xae, 0xdd, 0x3b, 0xbc, ++ 0x2c, 0x1f, 0x97, 0xaf, 0x4d, 0x1f, 0x8b, 0xaf, 0x29, 0xaf, 0x91, 0x2f, ++ 0xf2, 0xd4, 0x2e, 0x4d, 0x8a, 0xaf, 0x98, 0x1f, 0x08, 0x1a, 0x74, 0x75, ++ 0x1f, 0xce, 0x02, 0xff, 0x13, 0xf0, 0x01, 0xb8, 0x8f, 0x9d, 0x7e, 0x1c, ++ 0x3d, 0x42, 0xe2, 0x69, 0xf2, 0x4e, 0x5e, 0xaf, 0x49, 0xf5, 0x58, 0xcc, ++ 0x67, 0x09, 0xcf, 0x6f, 0xc8, 0xe4, 0xb1, 0xe0, 0x00, 0xe2, 0x33, 0x6b, ++ 0x9f, 0x1d, 0xba, 0xd2, 0xdd, 0xd5, 0xbc, 0xbf, 0x21, 0xa1, 0x7c, 0x58, ++ 0x7f, 0xc5, 0xf3, 0xfc, 0x6a, 0x59, 0x34, 0xfa, 0x8e, 0x6c, 0xf4, 0xb7, ++ 0x31, 0xf4, 0x13, 0x94, 0xd1, 0x35, 0x71, 0x8f, 0x99, 0xf0, 0x1d, 0x21, ++ 0xbe, 0xd2, 0xca, 0xdf, 0xc7, 0x34, 0xae, 0xe9, 0x07, 0x5c, 0x17, 0xe0, ++ 0x48, 0xd7, 0x12, 0xe5, 0x07, 0x9f, 0xb3, 0xb9, 0xc1, 0xd7, 0x34, 0xae, ++ 0xb3, 0xe5, 0x20, 0xf2, 0x89, 0x37, 0xed, 0x8f, 0xc8, 0xb5, 0xc4, 0x5c, ++ 0x6b, 0xb6, 0x3e, 0x06, 0x9b, 0x6c, 0x82, 0x2f, 0x33, 0x65, 0xb9, 0xd6, ++ 0x2c, 0xb3, 0xc8, 0xa7, 0xe6, 0xe6, 0xe9, 0x0b, 0x49, 0x7b, 0x0b, 0xe6, ++ 0x43, 0xff, 0x45, 0x5f, 0xbb, 0x5c, 0x43, 0x7c, 0x85, 0x6d, 0x2f, 0xb3, ++ 0xae, 0x5d, 0xef, 0x42, 0x6f, 0xa1, 0xcf, 0xa1, 0xef, 0x47, 0x3f, 0xf8, ++ 0xbf, 0x9d, 0x5b, 0x5f, 0x6c, 0x5b, 0x57, 0x19, 0xff, 0x7c, 0x6d, 0xa7, ++ 0x49, 0x69, 0xd2, 0x9b, 0xc4, 0x49, 0x9d, 0x36, 0xac, 0x76, 0x7c, 0xd3, ++ 0x5a, 0x4a, 0x8a, 0x6e, 0xdb, 0x88, 0x85, 0x29, 0x5b, 0x3c, 0xbb, 0x49, ++ 0x3b, 0x36, 0x50, 0x5a, 0xb6, 0xb1, 0x07, 0x34, 0x2c, 0x67, 0x1b, 0xdd, ++ 0x1e, 0xd8, 0x3a, 0x28, 0x9a, 0x44, 0x51, 0x2c, 0x27, 0x65, 0x19, 0x32, ++ 0x8e, 0x17, 0x32, 0xba, 0x47, 0xe3, 0x84, 0x6d, 0x48, 0x51, 0xb2, 0x69, ++ 0x7b, 0xe0, 0x61, 0xa5, 0x55, 0x3a, 0x21, 0x04, 0x13, 0x12, 0xf0, 0xc2, ++ 0xc3, 0x10, 0x55, 0xd4, 0x31, 0xde, 0x40, 0x48, 0x08, 0xa4, 0x69, 0x5c, ++ 0x7e, 0xbf, 0xef, 0xdc, 0x9b, 0x38, 0x5e, 0xb6, 0x0a, 0x1e, 0xac, 0xeb, ++ 0x73, 0xff, 0x9c, 0x7b, 0xce, 0xf9, 0xbe, 0xf3, 0xfb, 0x7e, 0xdf, 0x9f, ++ 0x8b, 0xe3, 0x30, 0x8e, 0x18, 0x7f, 0x39, 0x8e, 0x63, 0xc0, 0x7d, 0xd9, ++ 0xd7, 0xf6, 0xbc, 0x4b, 0xfa, 0x3e, 0xe6, 0xa2, 0x68, 0xcb, 0x22, 0x6e, ++ 0x0e, 0x3e, 0x61, 0x76, 0x38, 0xa8, 0x09, 0xf9, 0x8f, 0x67, 0x3b, 0xf4, ++ 0x35, 0x8b, 0xa1, 0x09, 0xcd, 0x0f, 0x54, 0x61, 0x17, 0x7e, 0xda, 0x23, ++ 0x7b, 0x1d, 0x7b, 0x52, 0xe3, 0xa2, 0x4b, 0x68, 0xf3, 0x3f, 0xb8, 0x44, ++ 0x6c, 0x0e, 0xf6, 0x89, 0xf8, 0xe9, 0xe1, 0x99, 0x02, 0x70, 0x7c, 0x3f, ++ 0xf6, 0x5f, 0x06, 0xb8, 0x8d, 0xff, 0xb5, 0x0b, 0x3d, 0xc6, 0x96, 0x26, ++ 0xed, 0x6d, 0x0e, 0x1a, 0xd8, 0xaa, 0x34, 0x9e, 0xd9, 0x2d, 0x9f, 0x03, ++ 0x1b, 0x58, 0x4d, 0x56, 0x6b, 0xd8, 0x83, 0xbf, 0x73, 0x67, 0x94, 0x3b, ++ 0x52, 0x16, 0x97, 0xc1, 0xd5, 0x73, 0x15, 0x72, 0xa0, 0x4b, 0xe0, 0xcf, ++ 0xf0, 0x3d, 0x62, 0xf4, 0x35, 0x69, 0x0b, 0xc8, 0x75, 0x7f, 0x8b, 0xb1, ++ 0xd1, 0x0e, 0x2c, 0xe1, 0x7d, 0x98, 0xd7, 0xb2, 0x87, 0x35, 0x3b, 0x0d, ++ 0xce, 0xe9, 0x79, 0x11, 0x67, 0x42, 0x12, 0xe7, 0x88, 0x39, 0x82, 0xe7, ++ 0x4d, 0xfc, 0x83, 0xfc, 0x2c, 0x33, 0xa5, 0x79, 0x2d, 0x28, 0xd7, 0x9f, ++ 0xf0, 0x6c, 0x8f, 0x98, 0x98, 0x46, 0x9b, 0xe6, 0xa7, 0x27, 0x2a, 0x86, ++ 0x33, 0x5b, 0x4e, 0x63, 0x7f, 0x27, 0xfd, 0xfe, 0x78, 0xdd, 0xd2, 0x7e, ++ 0xea, 0xd2, 0x6b, 0x62, 0x8e, 0x63, 0x69, 0xd8, 0x88, 0x98, 0x6c, 0x40, ++ 0x2e, 0x37, 0x20, 0x93, 0x77, 0xca, 0xd4, 0xf5, 0x21, 0xe8, 0x7d, 0x94, ++ 0x39, 0x3f, 0xf4, 0x35, 0xac, 0xef, 0xde, 0x28, 0x03, 0x3b, 0x89, 0x7f, ++ 0x56, 0x47, 0x2f, 0x79, 0x27, 0xed, 0xa0, 0xe9, 0xa7, 0xdf, 0xdc, 0x27, ++ 0xc1, 0xb5, 0x6e, 0x1d, 0x4f, 0x5d, 0xe3, 0x26, 0x5c, 0x27, 0xe8, 0x60, ++ 0xb9, 0xdb, 0xbf, 0xa7, 0xb5, 0xd7, 0xd4, 0xe3, 0xf0, 0x1c, 0xe7, 0x31, ++ 0x2c, 0xd9, 0x4a, 0xf0, 0x5c, 0x27, 0x9e, 0x6b, 0x6b, 0xe8, 0xeb, 0x40, ++ 0xd3, 0x1c, 0x2c, 0x7f, 0x0e, 0xbc, 0xde, 0xec, 0xff, 0x24, 0xe1, 0x3d, ++ 0x07, 0x3e, 0x10, 0xed, 0x2f, 0x65, 0x33, 0x82, 0xe7, 0x03, 0xf9, 0xf4, ++ 0xfb, 0xbe, 0x46, 0x72, 0xbe, 0x28, 0xe0, 0x9d, 0x31, 0xca, 0xc8, 0xc5, ++ 0xbe, 0xbe, 0x1a, 0x93, 0x0e, 0x57, 0xaa, 0xe5, 0x3d, 0x62, 0x75, 0x45, ++ 0xb5, 0x86, 0x24, 0x61, 0x35, 0xbe, 0xf3, 0xeb, 0xfe, 0x3b, 0xe1, 0x2b, ++ 0x2e, 0x92, 0x8f, 0xab, 0x9d, 0xc1, 0x3d, 0xfb, 0x9a, 0xc6, 0xf6, 0x90, ++ 0x7f, 0x1f, 0xaf, 0x27, 0xa4, 0x08, 0x2e, 0x9b, 0xab, 0xc0, 0x63, 0x00, ++ 0x7e, 0x5b, 0x63, 0xcc, 0x35, 0x30, 0xfe, 0x33, 0x94, 0x98, 0xc5, 0x18, ++ 0x8b, 0xf6, 0x28, 0x63, 0x8a, 0xe8, 0xa3, 0xaf, 0xa9, 0x8f, 0x53, 0x7e, ++ 0x1f, 0xf7, 0x48, 0xe9, 0x4a, 0x06, 0x7b, 0x6d, 0x14, 0xf6, 0x3d, 0x65, ++ 0x9f, 0x96, 0x2f, 0x88, 0x74, 0xe2, 0xdc, 0xab, 0x0e, 0x73, 0x49, 0xde, ++ 0x84, 0xfb, 0x00, 0xc6, 0xfd, 0x36, 0x6c, 0x6b, 0xc0, 0x79, 0x4a, 0xe0, ++ 0xf5, 0x21, 0x79, 0xc6, 0x65, 0xcc, 0xb0, 0x68, 0x93, 0xe3, 0x5a, 0xa1, ++ 0xa1, 0x74, 0x1d, 0xbc, 0xae, 0x06, 0x4b, 0x5a, 0x72, 0x38, 0xcf, 0x76, ++ 0x29, 0xd9, 0xa1, 0xf1, 0x30, 0x78, 0x4d, 0xb6, 0xc2, 0x7d, 0x24, 0x83, ++ 0xe1, 0xb1, 0x16, 0x70, 0x51, 0x4f, 0xde, 0x07, 0xd4, 0x94, 0xca, 0xf3, ++ 0xb2, 0xb1, 0x6a, 0xe3, 0xf8, 0x4d, 0xc8, 0xe1, 0x65, 0xfc, 0x5f, 0x8c, ++ 0xb1, 0x8e, 0x46, 0x64, 0x14, 0xba, 0x9b, 0x50, 0x3e, 0x43, 0x1e, 0x51, ++ 0x87, 0xbd, 0xb5, 0x60, 0x6b, 0xc0, 0xab, 0x46, 0xb9, 0xe7, 0x9e, 0x5f, ++ 0xbe, 0x25, 0xef, 0x2c, 0x25, 0xf1, 0x2e, 0xda, 0xe5, 0x53, 0xc4, 0x03, ++ 0x7b, 0x6e, 0x04, 0xe7, 0x56, 0x88, 0x65, 0x68, 0xaf, 0x63, 0x03, 0x75, ++ 0x81, 0x23, 0x80, 0x63, 0x6f, 0x3a, 0xd8, 0xb7, 0xb8, 0x7f, 0x63, 0x29, ++ 0x22, 0xcb, 0x0e, 0x79, 0x91, 0x24, 0xb2, 0xb8, 0x77, 0x63, 0xa5, 0x62, ++ 0x74, 0x82, 0xf7, 0x83, 0x37, 0x17, 0xc1, 0xeb, 0x4e, 0xeb, 0xb3, 0xb7, ++ 0x93, 0x33, 0xc7, 0xd4, 0xe8, 0x47, 0x4e, 0xcb, 0x06, 0xf7, 0x93, 0xc6, ++ 0xc4, 0xc9, 0x0d, 0x2e, 0x41, 0x67, 0xc9, 0xd9, 0xe9, 0x53, 0xe0, 0xff, ++ 0x2a, 0xaf, 0x73, 0xee, 0x38, 0xd6, 0x52, 0x58, 0x1b, 0xee, 0x7b, 0xf8, ++ 0xdf, 0x47, 0x61, 0x47, 0x2d, 0xee, 0xf5, 0x92, 0x62, 0x41, 0x69, 0x61, ++ 0x1a, 0x36, 0x85, 0xf9, 0xfb, 0x3e, 0xe8, 0xe2, 0x19, 0xc8, 0xd2, 0xc5, ++ 0x7d, 0x4d, 0xb6, 0x64, 0xad, 0xa4, 0xbc, 0xcc, 0x7a, 0xc5, 0xe0, 0x9a, ++ 0x55, 0x07, 0x47, 0xc3, 0xfe, 0xb1, 0xd6, 0xa0, 0x5b, 0xd8, 0x43, 0xd6, ++ 0x5a, 0x0c, 0x47, 0xe0, 0xf1, 0x1a, 0xfc, 0x0a, 0xe0, 0x9b, 0xb5, 0x06, ++ 0x9f, 0x00, 0xf8, 0x66, 0xad, 0xa5, 0x71, 0x04, 0xc6, 0xaf, 0x05, 0xb8, ++ 0xc6, 0xfe, 0x39, 0x8e, 0x00, 0x5f, 0xc8, 0x25, 0x89, 0x2f, 0x01, 0x9f, ++ 0x34, 0xba, 0xf0, 0xfd, 0x05, 0x62, 0x08, 0xf5, 0x3a, 0x05, 0xdc, 0xa2, ++ 0x2e, 0x18, 0x2e, 0xb9, 0x52, 0x35, 0x6b, 0x36, 0xbb, 0x7e, 0x4d, 0x6d, ++ 0xc4, 0xa4, 0x38, 0xd0, 0x31, 0xae, 0x1d, 0xae, 0xa9, 0x0d, 0xb8, 0x2a, ++ 0x19, 0x3d, 0x72, 0xcd, 0x7e, 0x21, 0x19, 0xf8, 0xbc, 0x3f, 0x50, 0xdc, ++ 0xda, 0x8a, 0x85, 0x41, 0xc7, 0xe2, 0x58, 0xbf, 0x84, 0xbc, 0xf0, 0xa3, ++ 0x5b, 0x92, 0x7d, 0x89, 0xb8, 0x35, 0x14, 0x6f, 0x0b, 0x11, 0xab, 0x3c, ++ 0x59, 0x85, 0x6d, 0x3a, 0xed, 0x26, 0x1f, 0x61, 0x8d, 0x67, 0x1e, 0xba, ++ 0xd2, 0x72, 0x3c, 0xe9, 0x26, 0x42, 0xa9, 0x47, 0xda, 0x42, 0xb4, 0x8d, ++ 0x43, 0xf6, 0x79, 0x39, 0xe1, 0xc7, 0x4f, 0xf6, 0xc8, 0x79, 0xe5, 0xfe, ++ 0xd8, 0xb6, 0x95, 0x0f, 0x35, 0xb6, 0xff, 0xc1, 0x08, 0xd7, 0x1a, 0xed, ++ 0x35, 0x8d, 0x73, 0xb4, 0x7e, 0x30, 0x12, 0x95, 0x52, 0x8f, 0xe7, 0x3d, ++ 0x7e, 0x7c, 0x33, 0x66, 0xe2, 0x32, 0xa9, 0x03, 0x06, 0x0b, 0xba, 0x7b, ++ 0x4c, 0xfb, 0x61, 0x1c, 0xa9, 0xdb, 0xb4, 0xb7, 0xb4, 0x8f, 0x94, 0x1b, ++ 0x8e, 0x2b, 0xfc, 0x4f, 0xdb, 0x3b, 0x0f, 0xdb, 0x4b, 0x7b, 0xb9, 0x5f, ++ 0x72, 0xcc, 0x15, 0x59, 0x7a, 0xbe, 0x68, 0xb8, 0xb4, 0x7f, 0x5f, 0x35, ++ 0x2f, 0xb3, 0x55, 0x72, 0xa8, 0x0d, 0xd8, 0x32, 0xd6, 0xe6, 0xd1, 0xa6, ++ 0xcd, 0xc0, 0x9e, 0x33, 0xaf, 0x88, 0x6b, 0x35, 0x3e, 0x97, 0x4c, 0x27, ++ 0x2c, 0xcc, 0x79, 0x4b, 0xa7, 0x5e, 0xea, 0x65, 0x4e, 0xf1, 0xea, 0x51, ++ 0xc8, 0xfd, 0x45, 0xfa, 0x16, 0x83, 0xaa, 0x23, 0xd9, 0x9f, 0x70, 0xed, ++ 0x3d, 0xef, 0x8c, 0x0b, 0x35, 0xec, 0x34, 0x7b, 0x80, 0x3c, 0xe0, 0x7e, ++ 0xac, 0xcb, 0xa4, 0x7b, 0x8b, 0xb6, 0xfb, 0x6f, 0x96, 0x33, 0x94, 0x3e, ++ 0x1f, 0xe2, 0xde, 0x46, 0x7b, 0x25, 0x2c, 0xb5, 0x18, 0xe7, 0x8f, 0xf5, ++ 0x0a, 0x71, 0xef, 0xec, 0xb6, 0x0e, 0xcd, 0x6b, 0x70, 0x3f, 0xd6, 0x80, ++ 0x6b, 0x19, 0xac, 0x01, 0xff, 0x67, 0x20, 0x2f, 0xfa, 0x0c, 0x29, 0xad, ++ 0xa3, 0x29, 0xad, 0x9b, 0x77, 0xb3, 0x6e, 0x70, 0x7b, 0xcc, 0x1c, 0x2f, ++ 0x65, 0x7a, 0x55, 0x72, 0x2a, 0xdf, 0x79, 0xc9, 0x55, 0xaf, 0xca, 0x44, ++ 0x75, 0x5e, 0xee, 0x73, 0xc6, 0x31, 0xdf, 0x9b, 0xde, 0xb4, 0xa3, 0xbe, ++ 0xca, 0x68, 0x01, 0xef, 0x9e, 0x1e, 0xee, 0x93, 0xbf, 0x62, 0x1e, 0x97, ++ 0x97, 0x6d, 0xc9, 0xdb, 0xae, 0xbc, 0xa0, 0x79, 0x0e, 0xfa, 0x27, 0x21, ++ 0x70, 0xd2, 0x10, 0xf4, 0xbe, 0x55, 0xa4, 0xc7, 0x89, 0x6f, 0x0a, 0x39, ++ 0x65, 0x14, 0xb2, 0x4e, 0x18, 0xde, 0x6c, 0x9b, 0xeb, 0x47, 0x5e, 0x04, ++ 0x77, 0x77, 0x37, 0x7b, 0x83, 0x78, 0xa6, 0xe1, 0xb7, 0x7f, 0xf4, 0xf3, ++ 0x3a, 0xc0, 0x4f, 0x8c, 0xe7, 0x2d, 0xc5, 0x59, 0x07, 0xba, 0xd4, 0x2f, ++ 0x6f, 0xae, 0xc7, 0x35, 0xbe, 0x11, 0xad, 0x68, 0xcc, 0x0f, 0x18, 0x35, ++ 0x42, 0xec, 0x1a, 0x5f, 0x76, 0x19, 0x5f, 0x88, 0xc9, 0x1f, 0xca, 0xc4, ++ 0xe1, 0x84, 0xfc, 0xbe, 0xfc, 0x1c, 0xc6, 0x93, 0xac, 0x31, 0xfe, 0x76, ++ 0xa3, 0x5a, 0x24, 0x4f, 0x52, 0x3e, 0x9f, 0x75, 0xbf, 0xa5, 0x76, 0x20, ++ 0x61, 0x95, 0xba, 0xa3, 0x8a, 0x37, 0x4f, 0x6b, 0x7e, 0x30, 0x61, 0xf5, ++ 0xcb, 0x8d, 0x25, 0xce, 0x37, 0x8d, 0xbe, 0x63, 0xa1, 0xdc, 0x0a, 0xed, ++ 0x52, 0x2a, 0x5e, 0xb0, 0xf6, 0xc8, 0xe3, 0xb1, 0xc3, 0xea, 0x7b, 0x02, ++ 0x9f, 0x61, 0x0b, 0x87, 0xec, 0x02, 0xeb, 0x66, 0xd4, 0xfe, 0xc4, 0x9b, ++ 0x70, 0xf6, 0x69, 0x1f, 0x67, 0x79, 0x6d, 0x14, 0x32, 0xa5, 0x2d, 0x62, ++ 0x0d, 0x5c, 0x0a, 0x36, 0xcf, 0xa6, 0xef, 0xa5, 0x18, 0xfe, 0xec, 0xea, ++ 0x79, 0xf0, 0xef, 0x21, 0xfb, 0x9c, 0xc6, 0x61, 0x46, 0x70, 0x2f, 0xdf, ++ 0xff, 0xd9, 0xa6, 0xbe, 0xbe, 0xe6, 0xf7, 0xc5, 0xeb, 0xd8, 0xe7, 0xf0, ++ 0xcd, 0xa7, 0xcb, 0xcc, 0x91, 0x9a, 0xb1, 0xee, 0xbc, 0xf7, 0xec, 0xd6, ++ 0x7b, 0xa9, 0xe3, 0xa5, 0xb2, 0xa9, 0x9d, 0x2a, 0x81, 0x0b, 0x7d, 0xa5, ++ 0x8b, 0xef, 0xe4, 0xfb, 0x3a, 0x24, 0xfb, 0x30, 0xf0, 0xa5, 0xc2, 0x5f, ++ 0xd1, 0xaf, 0x0d, 0x85, 0xbf, 0x12, 0x3b, 0xb8, 0x8b, 0x6d, 0xba, 0xdb, ++ 0xef, 0xef, 0xcf, 0xd0, 0xa1, 0x58, 0xc3, 0xfd, 0x8c, 0xcd, 0xb0, 0x0d, ++ 0x3b, 0xb4, 0xca, 0xa3, 0xe7, 0x75, 0x39, 0x2d, 0x72, 0xce, 0x3e, 0xd4, ++ 0xd4, 0xc7, 0x31, 0x9c, 0x33, 0x9c, 0x20, 0x5c, 0x09, 0xf9, 0xdc, 0xe2, ++ 0x30, 0x79, 0x93, 0xff, 0xbf, 0x55, 0x63, 0x3a, 0x09, 0xeb, 0x60, 0xd3, ++ 0x3c, 0x0e, 0x6f, 0xd9, 0xe1, 0x84, 0x45, 0xec, 0x7c, 0x0b, 0xd7, 0xa8, ++ 0x43, 0x9e, 0xf2, 0xf8, 0x08, 0x78, 0x7e, 0x0e, 0x58, 0x10, 0x73, 0x62, ++ 0x71, 0x70, 0x2e, 0x8d, 0x1d, 0x24, 0xac, 0x76, 0xf5, 0xb7, 0xaf, 0x51, ++ 0x4f, 0xc0, 0x37, 0xdf, 0xdc, 0x81, 0xe9, 0x69, 0xe8, 0x32, 0xfa, 0xdf, ++ 0xcb, 0xfe, 0xd3, 0xfe, 0x3a, 0x27, 0xdd, 0xa2, 0xf5, 0x79, 0x29, 0x2c, ++ 0x19, 0xfd, 0xcb, 0x3a, 0xd0, 0xbd, 0x0e, 0xb4, 0x57, 0x68, 0x13, 0x3e, ++ 0xa9, 0x9f, 0xc0, 0x36, 0xa4, 0xd5, 0x36, 0xcc, 0x2e, 0x50, 0x3f, 0xa9, ++ 0x97, 0x81, 0x3e, 0x06, 0x98, 0x47, 0x1d, 0x25, 0xce, 0xba, 0xf2, 0xe2, ++ 0x02, 0xd7, 0x26, 0xa3, 0xf9, 0xbe, 0xc1, 0xc5, 0x69, 0xcd, 0x83, 0x0e, ++ 0x54, 0x92, 0x2f, 0x17, 0x65, 0x5c, 0x5e, 0x77, 0xb9, 0x66, 0xc9, 0x5a, ++ 0x3e, 0xdc, 0xde, 0x30, 0xff, 0x73, 0xfe, 0x9a, 0x39, 0xaa, 0x57, 0x03, ++ 0x95, 0x4b, 0x5b, 0xf2, 0xce, 0x5b, 0x1d, 0x4d, 0xeb, 0x14, 0x70, 0xb8, ++ 0x84, 0x90, 0x3f, 0x44, 0xba, 0xf8, 0x0c, 0xdf, 0x4b, 0xce, 0xc7, 0x77, ++ 0xd1, 0xb6, 0xde, 0xc1, 0x3c, 0xbb, 0xd0, 0x8f, 0x8b, 0x3c, 0x6c, 0xb8, ++ 0x45, 0xde, 0x7a, 0x14, 0xeb, 0xb6, 0x57, 0x6b, 0xf3, 0x66, 0x7f, 0xfc, ++ 0x11, 0x9e, 0xcf, 0xfb, 0xfc, 0x7c, 0x04, 0xfd, 0x71, 0xee, 0xdc, 0x53, ++ 0xe5, 0xe3, 0xd4, 0xcd, 0x09, 0xcd, 0x23, 0xf1, 0x19, 0xee, 0x5b, 0xae, ++ 0x11, 0xe5, 0x70, 0x39, 0x6e, 0xec, 0xe9, 0xb1, 0xa6, 0xf1, 0xa4, 0xfc, ++ 0xf1, 0x04, 0xd7, 0xa3, 0x12, 0xe9, 0x25, 0xa6, 0xc5, 0x24, 0x55, 0xa1, ++ 0x8f, 0x02, 0x5b, 0x35, 0xc5, 0xbe, 0x6e, 0x8f, 0xbd, 0xf9, 0xff, 0x13, ++ 0x7b, 0xf3, 0xd6, 0x4b, 0x3a, 0xc6, 0xa8, 0xf3, 0xbf, 0xc8, 0xb1, 0xb1, ++ 0xde, 0xdb, 0xc8, 0xed, 0xf9, 0x05, 0xda, 0xa7, 0x8c, 0xd6, 0xa3, 0xff, ++ 0xa5, 0xcc, 0xb5, 0xe4, 0x18, 0x5f, 0xe7, 0x18, 0xc7, 0x37, 0xb4, 0x3e, ++ 0xeb, 0xcb, 0xba, 0x67, 0x2f, 0x2f, 0x10, 0x53, 0xda, 0x65, 0xb9, 0x1a, ++ 0xe0, 0xca, 0x7d, 0x3e, 0xa7, 0x2d, 0x75, 0xb7, 0x60, 0x9f, 0x9c, 0x71, ++ 0x2d, 0xad, 0x4d, 0xb3, 0x1e, 0xe2, 0xb9, 0x7e, 0xa9, 0x2f, 0xd1, 0xce, ++ 0xa6, 0xe0, 0x57, 0xc4, 0x42, 0xf5, 0x15, 0xe6, 0x69, 0x59, 0xbf, 0x30, ++ 0xce, 0x7a, 0x59, 0xac, 0xdd, 0x2c, 0xf6, 0x57, 0x1c, 0x7e, 0x3f, 0x39, ++ 0x3c, 0xe3, 0x63, 0xcd, 0xf2, 0x1e, 0xdd, 0xe2, 0x80, 0x3b, 0xe5, 0xfc, ++ 0x6b, 0xac, 0x37, 0xf5, 0xda, 0xb1, 0x6f, 0xc0, 0x4e, 0xe6, 0x62, 0xfc, ++ 0x5f, 0x00, 0xf7, 0xa7, 0xaf, 0x91, 0x50, 0x5f, 0xa3, 0x5e, 0x1b, 0x93, ++ 0x79, 0xd5, 0xfd, 0x76, 0x3f, 0x96, 0xd4, 0xae, 0xfa, 0x41, 0x1d, 0xcb, ++ 0x2b, 0xe7, 0x1e, 0x51, 0x9c, 0x2a, 0x95, 0x87, 0x4c, 0xfd, 0x83, 0x1d, ++ 0xf7, 0xeb, 0x9d, 0x1b, 0xdf, 0x1f, 0xf7, 0xdf, 0xff, 0x0f, 0x5f, 0xbe, ++ 0xb6, 0x62, 0x8c, 0xae, 0xb5, 0x95, 0xd2, 0x18, 0xe3, 0xec, 0x02, 0xf5, ++ 0x83, 0x7a, 0x42, 0x9c, 0x0b, 0xee, 0x0b, 0x64, 0x12, 0xb4, 0x79, 0x3f, ++ 0x75, 0x3e, 0xe0, 0x24, 0xf1, 0x86, 0xfd, 0x19, 0x9c, 0x0b, 0x64, 0xc4, ++ 0x6b, 0x8d, 0x76, 0x80, 0x7b, 0x2d, 0xc1, 0xfc, 0xc3, 0xd6, 0x7e, 0xeb, ++ 0xaa, 0x6c, 0xcb, 0x26, 0x7b, 0x82, 0xe3, 0xbf, 0xc4, 0x78, 0x30, 0xf6, ++ 0xd8, 0x6e, 0xf2, 0xf9, 0x8e, 0xca, 0x27, 0x0f, 0xf9, 0x74, 0x29, 0xee, ++ 0xd3, 0xc7, 0xbb, 0xe0, 0xeb, 0x5c, 0x3b, 0xd6, 0x8c, 0x71, 0x59, 0xe0, ++ 0xdb, 0x83, 0xc4, 0xf9, 0x81, 0x3e, 0xe2, 0x0b, 0x63, 0x8a, 0x99, 0xa9, ++ 0x7d, 0xc0, 0x30, 0xb6, 0x8f, 0x2a, 0x07, 0x31, 0x3e, 0x56, 0x42, 0x63, ++ 0x8b, 0x61, 0x60, 0x72, 0xbd, 0x0c, 0x7e, 0xc6, 0xda, 0xad, 0x1d, 0xf2, ++ 0x7a, 0xca, 0x5f, 0xaf, 0x2f, 0xf5, 0x51, 0x3e, 0xdc, 0x07, 0xc4, 0xca, ++ 0x4e, 0xf4, 0x77, 0x36, 0xe6, 0x40, 0xc7, 0xce, 0xe0, 0xfc, 0xa0, 0xfa, ++ 0x10, 0x61, 0xec, 0xf3, 0xcd, 0x72, 0xaf, 0xef, 0xb7, 0x39, 0x68, 0xc3, ++ 0x57, 0x2d, 0x77, 0xd1, 0x8f, 0x40, 0x3b, 0x2d, 0x2d, 0x15, 0xf8, 0xac, ++ 0xc0, 0xee, 0x0d, 0xb5, 0x41, 0xc3, 0xb8, 0xfe, 0x19, 0xd6, 0x41, 0x69, ++ 0xbd, 0xe9, 0x66, 0xd9, 0xaf, 0x33, 0x8a, 0x1d, 0xd1, 0x35, 0xad, 0x97, ++ 0x93, 0xf1, 0x27, 0x24, 0xa8, 0x3d, 0xe2, 0x7b, 0x07, 0x1a, 0xc6, 0x35, ++ 0x21, 0x67, 0xb7, 0x6c, 0x04, 0x7d, 0x67, 0xf0, 0xf6, 0xaa, 0xb1, 0x01, ++ 0xa5, 0x9a, 0xa3, 0x75, 0x35, 0xe1, 0xb1, 0x55, 0xac, 0x25, 0x79, 0xe8, ++ 0x4d, 0x70, 0xef, 0x34, 0xd6, 0x90, 0x5c, 0xdb, 0x9b, 0x99, 0x73, 0x33, ++ 0xcc, 0xdd, 0xc0, 0x86, 0xcd, 0x48, 0x0e, 0xbe, 0x40, 0x2e, 0xdc, 0xc1, ++ 0x18, 0x32, 0xf8, 0x60, 0xd1, 0x8f, 0x37, 0x0e, 0x33, 0x4e, 0x2a, 0x8b, ++ 0x2b, 0x1c, 0x3b, 0xf7, 0xb7, 0xf1, 0xb7, 0xeb, 0x65, 0x8e, 0xd7, 0xc4, ++ 0x1e, 0xd8, 0xb6, 0x2a, 0x2e, 0x8e, 0x5c, 0x8b, 0x11, 0x1c, 0xef, 0xc2, ++ 0x9e, 0xe0, 0xbd, 0x38, 0xae, 0xdc, 0x94, 0x5f, 0x2e, 0x05, 0xf6, 0x3c, ++ 0x24, 0xef, 0x38, 0xde, 0xcc, 0xac, 0xdb, 0xcd, 0x35, 0x70, 0x8b, 0xcc, ++ 0xbd, 0x3a, 0x8e, 0x5b, 0x12, 0xcf, 0xdb, 0x70, 0x37, 0xba, 0x4d, 0x9e, ++ 0x9a, 0x18, 0xf0, 0x03, 0xac, 0xe1, 0xf5, 0x93, 0x96, 0x18, 0xf9, 0x51, ++ 0x36, 0xd7, 0x3e, 0x15, 0xff, 0x03, 0x0c, 0xa4, 0x3e, 0x52, 0x2f, 0x6f, ++ 0xca, 0xa4, 0x62, 0xfe, 0x6e, 0xcf, 0x35, 0xe2, 0x44, 0xc0, 0x69, 0x89, ++ 0xe9, 0xd4, 0xc5, 0xb8, 0xfa, 0x04, 0x47, 0x2a, 0xcd, 0xb8, 0xf0, 0xa8, ++ 0x9f, 0x8b, 0xd8, 0x4d, 0xf7, 0x1e, 0xf1, 0xb1, 0x61, 0x54, 0xf9, 0x72, ++ 0xc6, 0x26, 0x46, 0x38, 0x5a, 0xe3, 0x30, 0x7d, 0xa5, 0x11, 0x87, 0xe9, ++ 0xeb, 0x19, 0xfc, 0xd0, 0x6f, 0x10, 0x94, 0xff, 0x5a, 0x32, 0xb0, 0x18, ++ 0x55, 0xff, 0x30, 0x55, 0xe9, 0x91, 0xfc, 0x54, 0x58, 0x52, 0x8b, 0x37, ++ 0xfa, 0x0c, 0xbf, 0xa5, 0xfe, 0x61, 0xbf, 0xe9, 0x39, 0xb6, 0x7f, 0x83, ++ 0xf3, 0xfb, 0x85, 0xef, 0x36, 0xfa, 0xdc, 0xa6, 0x79, 0x1b, 0x73, 0xcd, ++ 0x6e, 0xd2, 0xd1, 0xbb, 0x7c, 0x1d, 0xe5, 0x75, 0xcb, 0xe4, 0x4c, 0x70, ++ 0xef, 0xc0, 0x22, 0xc7, 0x68, 0x9e, 0x1b, 0x58, 0x34, 0x3e, 0xfa, 0xce, ++ 0xe7, 0x86, 0xb7, 0x9e, 0xc3, 0x75, 0xf0, 0x5d, 0xd3, 0xf7, 0xe4, 0x28, ++ 0x78, 0xdc, 0x30, 0x6b, 0x68, 0x68, 0xb3, 0x07, 0xdd, 0x49, 0xa1, 0xbe, ++ 0x27, 0x7d, 0x9d, 0x23, 0xde, 0x74, 0xf9, 0x78, 0xb3, 0x6d, 0x63, 0x72, ++ 0xa6, 0x56, 0x81, 0x71, 0x90, 0x06, 0x1b, 0xd3, 0x76, 0xf0, 0xe3, 0x36, ++ 0x66, 0xbf, 0xdf, 0x4f, 0x70, 0x2d, 0xc0, 0x95, 0xa0, 0x1d, 0xe0, 0x4a, ++ 0x33, 0x8f, 0x0d, 0x64, 0xdf, 0x78, 0xbe, 0xd1, 0xcf, 0x1b, 0xf3, 0xfd, ++ 0x79, 0x4b, 0xf7, 0xcf, 0x1b, 0x5b, 0x7e, 0x3c, 0x65, 0xcc, 0x3c, 0x59, ++ 0x19, 0x7b, 0xfb, 0x23, 0xf5, 0x9b, 0x2f, 0x5f, 0xc9, 0x68, 0x2c, 0xa7, ++ 0xae, 0xb2, 0xfe, 0x9e, 0xd6, 0x11, 0xcc, 0x2d, 0x3c, 0x14, 0xf3, 0xeb, ++ 0x15, 0x30, 0xa7, 0x77, 0x2f, 0x66, 0x7d, 0xde, 0x92, 0x91, 0x43, 0xbd, ++ 0xf4, 0xfd, 0x59, 0x47, 0xd4, 0xe6, 0x7c, 0x57, 0xee, 0x33, 0x5c, 0xa8, ++ 0xb5, 0x75, 0xec, 0xbd, 0x8b, 0xad, 0x3f, 0x0c, 0xf4, 0x9c, 0xfa, 0xf3, ++ 0xee, 0xc5, 0xe9, 0xaa, 0x37, 0x1e, 0x39, 0x3e, 0x64, 0x97, 0x84, 0xf5, ++ 0xc3, 0xe3, 0xf2, 0x0d, 0xad, 0x5b, 0x79, 0x0d, 0xd7, 0x1f, 0xa0, 0x0f, ++ 0x99, 0x8c, 0x68, 0x4d, 0x7b, 0x32, 0xfe, 0x18, 0xf6, 0x5e, 0xc1, 0x65, ++ 0xbd, 0xf1, 0x3e, 0xad, 0x3b, 0xae, 0x0b, 0xb9, 0x14, 0x73, 0xe2, 0xcf, ++ 0xc9, 0x13, 0xee, 0xa0, 0xbb, 0x21, 0x86, 0xe3, 0x16, 0x34, 0xdf, 0xb3, ++ 0x47, 0x1e, 0x73, 0x23, 0xad, 0xd9, 0x75, 0xa3, 0xf3, 0xa7, 0xc2, 0x99, ++ 0xb6, 0x39, 0x27, 0xd6, 0x3a, 0xb9, 0x8e, 0x3d, 0xbd, 0x0e, 0xbc, 0x5f, ++ 0x8f, 0x87, 0x72, 0xab, 0x9c, 0x7b, 0xd8, 0xd4, 0x20, 0xa8, 0x7f, 0x45, ++ 0x0c, 0xb9, 0x5b, 0x36, 0xed, 0xa3, 0xb2, 0x99, 0xe6, 0x37, 0x43, 0x27, ++ 0xd0, 0x1e, 0x50, 0xde, 0xbb, 0x09, 0xbc, 0xd9, 0x4c, 0xb7, 0xaa, 0x0e, ++ 0xaa, 0x1f, 0x06, 0x9c, 0xda, 0xb4, 0x89, 0x4f, 0x77, 0xf0, 0x88, 0x39, ++ 0xcf, 0x43, 0x0e, 0xac, 0x4f, 0x38, 0x86, 0x36, 0x71, 0xcd, 0x6e, 0x3a, ++ 0x7f, 0x10, 0xed, 0x93, 0xe8, 0xa3, 0x45, 0xe7, 0x68, 0x39, 0xc7, 0x4d, ++ 0xbe, 0x74, 0xc7, 0x3d, 0x9d, 0x4d, 0xed, 0x8b, 0x07, 0xe8, 0xb7, 0x24, ++ 0xac, 0x65, 0xca, 0xb8, 0x98, 0x91, 0x7f, 0xc5, 0x77, 0xb6, 0x5f, 0xee, ++ 0xdb, 0xd9, 0xee, 0x90, 0xb6, 0x1e, 0x8a, 0xa2, 0xbf, 0xe9, 0xbe, 0x40, ++ 0x87, 0x82, 0xf6, 0x01, 0xe2, 0x0a, 0xed, 0x96, 0xfa, 0x4c, 0x9b, 0x31, ++ 0xbe, 0xab, 0xd2, 0xf4, 0x0c, 0xff, 0xf3, 0x19, 0x3e, 0xcb, 0xf8, 0xdd, ++ 0x8a, 0xd1, 0x33, 0x8b, 0xbe, 0x3f, 0xe3, 0x17, 0x21, 0xcd, 0x8d, 0x7e, ++ 0xdc, 0x9f, 0x4a, 0xea, 0xf7, 0x2b, 0xbb, 0xeb, 0x5a, 0x80, 0x23, 0x71, ++ 0x3f, 0xa6, 0x60, 0xf2, 0x4e, 0x26, 0xee, 0x4b, 0xd9, 0x69, 0xde, 0x29, ++ 0x7e, 0x03, 0x72, 0x7e, 0x1c, 0x72, 0x9e, 0x08, 0xd3, 0xf7, 0x63, 0x7e, ++ 0xc9, 0x91, 0xdc, 0x3a, 0xe5, 0x4d, 0xbb, 0x4e, 0xdd, 0x04, 0x8f, 0x58, ++ 0x27, 0xa6, 0x58, 0xe0, 0x40, 0x63, 0x18, 0xe3, 0xdb, 0x38, 0x6f, 0xf9, ++ 0xf5, 0x06, 0x23, 0xb0, 0x69, 0x2e, 0x7e, 0x94, 0x3b, 0x7c, 0xfa, 0x65, ++ 0xca, 0x98, 0x35, 0x50, 0x8c, 0x05, 0x64, 0xb4, 0x1e, 0x9b, 0xdf, 0xf2, ++ 0x14, 0xec, 0x8c, 0xd6, 0x98, 0x3a, 0x95, 0x63, 0x52, 0x9c, 0xca, 0xa8, ++ 0xfd, 0x1f, 0x80, 0x7d, 0x9a, 0x75, 0xef, 0x91, 0xb9, 0x57, 0x0f, 0x63, ++ 0x9f, 0xd2, 0xcf, 0xd7, 0x18, 0x86, 0x17, 0x55, 0x9d, 0x26, 0xe7, 0x60, ++ 0xdc, 0xcd, 0xe4, 0xac, 0xcd, 0x9e, 0xdd, 0x7f, 0x50, 0x3a, 0xee, 0x91, ++ 0xea, 0x15, 0x5b, 0x6b, 0x37, 0x32, 0xf2, 0x91, 0x47, 0x19, 0x16, 0x1e, ++ 0x4c, 0x00, 0xa7, 0xc8, 0xdd, 0x4f, 0xc6, 0xcc, 0x9a, 0xfe, 0xf3, 0x20, ++ 0x7d, 0xe0, 0x54, 0xa5, 0xb1, 0x0f, 0xad, 0xf7, 0xc0, 0xb5, 0xaf, 0x1e, ++ 0x30, 0xfb, 0x87, 0xfe, 0xf0, 0x2d, 0x2f, 0x13, 0xe3, 0x3b, 0x79, 0x2f, ++ 0x73, 0xbd, 0xd4, 0x15, 0x8e, 0xed, 0x43, 0x5f, 0xaf, 0x4f, 0xa3, 0xbf, ++ 0x84, 0x0c, 0xac, 0x65, 0xd4, 0xc7, 0x99, 0xdd, 0xe1, 0xb3, 0x9a, 0xf8, ++ 0x80, 0xf1, 0x5b, 0xaf, 0xcb, 0x63, 0xab, 0x94, 0x13, 0xed, 0x7b, 0x48, ++ 0x7e, 0xe6, 0x0c, 0xd9, 0x4f, 0x6a, 0xcd, 0x6b, 0x32, 0xc3, 0x7c, 0xcc, ++ 0x5e, 0x27, 0x65, 0x2f, 0x4b, 0x64, 0xf4, 0x8b, 0xc2, 0xef, 0x24, 0x58, ++ 0x9b, 0x30, 0xe4, 0x3e, 0x29, 0x41, 0x7d, 0xc2, 0x60, 0x66, 0x4f, 0xe8, ++ 0xdf, 0xde, 0xf5, 0x07, 0x79, 0x8f, 0xff, 0x2d, 0x61, 0x88, 0x72, 0x7b, ++ 0xef, 0x0e, 0x7e, 0x07, 0xba, 0x33, 0xde, 0x77, 0xef, 0xd3, 0xe7, 0x46, ++ 0x92, 0xf3, 0xf4, 0x59, 0xa3, 0x4e, 0xf4, 0x90, 0x99, 0x6b, 0xb1, 0xd8, ++ 0x29, 0x9a, 0x2f, 0xbb, 0xf0, 0x81, 0xc3, 0x6f, 0x29, 0x93, 0xf1, 0x3d, ++ 0x16, 0xe3, 0xde, 0xc4, 0x37, 0xe6, 0x50, 0x18, 0x63, 0x43, 0x1b, 0x9c, ++ 0xe1, 0x95, 0x61, 0x4b, 0xee, 0x8d, 0x64, 0x12, 0x96, 0x1c, 0x49, 0x2c, ++ 0x0a, 0xde, 0xc9, 0x7c, 0xca, 0x6a, 0xb2, 0xc8, 0xfb, 0x23, 0x15, 0xf6, ++ 0x97, 0x50, 0xff, 0x24, 0x75, 0xc4, 0xf3, 0x2e, 0xb8, 0x12, 0x4a, 0x7d, ++ 0xee, 0x7d, 0x8f, 0xb9, 0x73, 0x6b, 0xed, 0xd3, 0xea, 0xd5, 0x5f, 0x7b, ++ 0xca, 0xd4, 0xab, 0x5d, 0xbf, 0x30, 0xb0, 0xca, 0xb6, 0x33, 0xe5, 0xd7, ++ 0xba, 0xa1, 0xdd, 0xe2, 0xd7, 0xed, 0xfc, 0xea, 0xc2, 0x40, 0x2d, 0x7e, ++ 0xc8, 0xf8, 0xdb, 0xe4, 0x57, 0x81, 0x0f, 0x93, 0xd8, 0x51, 0xc7, 0x74, ++ 0x76, 0xe1, 0x4c, 0xe8, 0xcc, 0x82, 0xb5, 0xd4, 0xca, 0x1c, 0xd8, 0x09, ++ 0x4f, 0xba, 0x8f, 0x07, 0x71, 0x2a, 0xc6, 0xb5, 0x44, 0x3a, 0xd7, 0x4e, ++ 0x99, 0x9c, 0xc7, 0x9a, 0xa5, 0x5c, 0xa8, 0xeb, 0x15, 0xc6, 0xaa, 0x62, ++ 0x8a, 0x0d, 0xdd, 0x6b, 0xac, 0x5f, 0xea, 0x91, 0x82, 0x62, 0x46, 0x8f, ++ 0xe2, 0x81, 0xd1, 0xbb, 0x2e, 0x8d, 0xc3, 0x92, 0x2f, 0x5d, 0x5b, 0xc8, ++ 0xf6, 0xb3, 0xe6, 0xe4, 0xcd, 0x85, 0x67, 0xd0, 0x26, 0xce, 0xdc, 0xd9, ++ 0x74, 0xbe, 0x31, 0x27, 0x9b, 0xb4, 0x07, 0xac, 0xe6, 0x7c, 0x2c, 0xcf, ++ 0x35, 0xe7, 0x61, 0xdf, 0x96, 0x7c, 0x2f, 0x73, 0xaf, 0x41, 0xbc, 0xdd, ++ 0xf5, 0xe3, 0xed, 0xf7, 0xf6, 0x53, 0x07, 0xe1, 0xdf, 0xe4, 0x23, 0x63, ++ 0xad, 0xc3, 0xb3, 0xe5, 0xf0, 0xdf, 0xb7, 0x63, 0xa7, 0x68, 0xaf, 0x6e, ++ 0xe5, 0xc7, 0x71, 0xed, 0xdb, 0xe0, 0x24, 0x25, 0xf0, 0x8b, 0x62, 0x50, ++ 0x33, 0x8e, 0xeb, 0x5b, 0xcf, 0xdf, 0x66, 0x4c, 0x7b, 0x35, 0xb7, 0x3e, ++ 0xb0, 0x23, 0xb7, 0x9e, 0xe9, 0x27, 0x97, 0x2c, 0xad, 0x6f, 0x3f, 0x1b, ++ 0xf5, 0x9f, 0x9d, 0xb8, 0xed, 0x7c, 0x1a, 0xf7, 0xcc, 0x65, 0xc5, 0xdf, ++ 0xd9, 0xf5, 0x79, 0x29, 0x38, 0x5d, 0x92, 0x5b, 0x0a, 0xec, 0x84, 0x37, ++ 0x3e, 0xed, 0x16, 0xfb, 0xc2, 0xc2, 0xe7, 0xf9, 0xbe, 0x80, 0xa3, 0xb1, ++ 0xff, 0x7d, 0x3e, 0x4f, 0xa3, 0x4d, 0x30, 0x7c, 0xcf, 0xf4, 0xf5, 0xac, ++ 0xc6, 0x2f, 0xe6, 0xf4, 0x9c, 0x6d, 0x62, 0x20, 0x31, 0xce, 0x6f, 0xda, ++ 0xcf, 0x4b, 0x34, 0xe6, 0xc7, 0x3f, 0x49, 0xd6, 0x94, 0x73, 0xb0, 0x2e, ++ 0x45, 0xaf, 0x05, 0x7b, 0xf4, 0x08, 0xeb, 0x6b, 0xb6, 0xe6, 0x43, 0xbb, ++ 0xa6, 0xf6, 0x4b, 0xe7, 0x3a, 0xe9, 0xcf, 0x35, 0x8c, 0x31, 0x4f, 0x97, ++ 0x83, 0x7b, 0x66, 0xe4, 0xe8, 0x89, 0x64, 0x3c, 0x65, 0xe9, 0xd8, 0xd5, ++ 0xc6, 0x65, 0xdd, 0x19, 0xd8, 0x2e, 0xda, 0x39, 0xc5, 0x3e, 0xf0, 0x59, ++ 0x62, 0x1f, 0x6d, 0x98, 0xda, 0xbd, 0x44, 0x09, 0x73, 0xc9, 0xad, 0x6b, ++ 0x8e, 0x22, 0x7e, 0x3a, 0x9c, 0xac, 0x16, 0x14, 0x0f, 0x39, 0x17, 0x8e, ++ 0x1d, 0x36, 0x3b, 0xd4, 0x98, 0x7f, 0xa2, 0x0f, 0xca, 0x5c, 0x4d, 0xbb, ++ 0x64, 0xab, 0x22, 0x6f, 0x60, 0x0f, 0xbc, 0xbe, 0xc2, 0x7d, 0x19, 0xee, ++ 0x35, 0x7e, 0xe4, 0xc6, 0x9d, 0x96, 0xf4, 0x6a, 0x4e, 0xb7, 0x84, 0x35, ++ 0x05, 0x07, 0x1b, 0x0f, 0x9f, 0x80, 0x2f, 0xa1, 0xb5, 0x14, 0x8c, 0xc3, ++ 0x4e, 0xc3, 0xef, 0x6c, 0x8c, 0x1d, 0x01, 0x47, 0xa6, 0x78, 0xbe, 0x80, ++ 0x75, 0xdb, 0xce, 0xe7, 0x94, 0x6a, 0x73, 0x1a, 0xb3, 0xad, 0xaf, 0xb4, ++ 0xab, 0x4d, 0xa9, 0xd7, 0x86, 0xb0, 0x2e, 0x72, 0xd4, 0x1a, 0x2b, 0xf9, ++ 0xe7, 0xa3, 0x52, 0xab, 0xb1, 0x2d, 0xfd, 0x2d, 0xaa, 0x53, 0x41, 0xce, ++ 0xca, 0x96, 0x65, 0xf0, 0xe1, 0xda, 0xaa, 0x83, 0x5f, 0x1a, 0xbf, 0x61, ++ 0xfc, 0x1e, 0x90, 0x6c, 0x85, 0x1c, 0x9d, 0x39, 0xaa, 0xf6, 0xa6, 0xf7, ++ 0x47, 0xf5, 0x3b, 0x11, 0xd6, 0x69, 0x95, 0x7c, 0x5f, 0xae, 0x54, 0xdb, ++ 0x8d, 0xbf, 0x32, 0x06, 0x9c, 0xf6, 0xf1, 0xf0, 0xe7, 0x7e, 0x1d, 0xe5, ++ 0x7f, 0x01, 0x0e, 0x6c, 0x69, 0x8b, 0x28, 0x71, 0x00, 0x00, 0x00 }; + + static const u32 bnx2_RXP_b06FwData[(0x0/4) + 1] = { 0x0 }; + static const u32 bnx2_RXP_b06FwRodata[(0x24/4) + 1] = { +- 0x08004590, 0x08004590, 0x08004508, 0x08004540, 0x08004574, 0x08004598, +- 0x08004598, 0x08004598, 0x08004478, 0x00000000 }; ++ 0x080033f8, 0x080033f8, 0x08003370, 0x080033a8, 0x080033dc, 0x08003400, ++ 0x08003400, 0x08003400, 0x080032e0, 0x00000000 }; + + static struct fw_info bnx2_rxp_fw_06 = { +- /* Firmware version: 4.1.1 */ +- .ver_major = 0x4, +- .ver_minor = 0x1, +- .ver_fix = 0x1, +- +- .start_addr = 0x080031d0, ++ /* Firmware version: 5.0.0g */ ++ .ver_major = 0x5, ++ .ver_minor = 0x0, ++ .ver_fix = 0x0, ++ ++ .start_addr = 0x080031d8, + + .text_addr = 0x08000000, +- .text_len = 0x71d0, ++ .text_len = 0x7124, + .text_index = 0x0, + .gz_text = bnx2_RXP_b06FwText, + .gz_text_len = sizeof(bnx2_RXP_b06FwText), +@@ -2965,15 +2971,15 @@ + .data_index = 0x0, + .data = bnx2_RXP_b06FwData, + +- .sbss_addr = 0x08007220, +- .sbss_len = 0x58, +- .sbss_index = 0x0, +- +- .bss_addr = 0x08007278, +- .bss_len = 0x44c, +- .bss_index = 0x0, +- +- .rodata_addr = 0x080071d0, ++ .sbss_addr = 0x08007160, ++ .sbss_len = 0x50, ++ .sbss_index = 0x0, ++ ++ .bss_addr = 0x080071b0, ++ .bss_len = 0x450, ++ .bss_index = 0x0, ++ ++ .rodata_addr = 0x08007124, + .rodata_len = 0x24, + .rodata_index = 0x0, + .rodata = bnx2_RXP_b06FwRodata, +@@ -2996,687 +3002,571 @@ + }; + + static u8 bnx2_rv2p_proc1[] = { +- /* Date: 12/07/2007 15:02 */ +- 0xd5, 0x56, 0x41, 0x6b, 0x13, 0x51, 0x10, 0x9e, 0xdd, 0x6c, 0xbb, 0xdb, +- 0x64, 0xb3, 0x59, 0xaa, 0xd6, 0x50, 0x53, 0x93, 0x06, 0x2f, 0xad, 0x29, +- 0x6d, 0xaa, 0x82, 0x42, 0xa1, 0x92, 0x4b, 0xc1, 0xf6, 0x20, 0xf5, 0x22, +- 0x22, 0xd8, 0x46, 0xd1, 0x5f, 0x21, 0x06, 0xdb, 0xd4, 0x73, 0x05, 0x0b, +- 0xf5, 0xa0, 0x3d, 0x59, 0x11, 0xc1, 0x04, 0x14, 0x44, 0x04, 0x41, 0x45, +- 0x04, 0x3d, 0x78, 0xa8, 0x60, 0x2f, 0xad, 0x22, 0x56, 0x3c, 0x78, 0xd4, +- 0x93, 0x26, 0xbe, 0x37, 0x33, 0xaf, 0xdd, 0xdd, 0x66, 0x9b, 0x2a, 0x82, +- 0x18, 0x68, 0x3f, 0xde, 0xec, 0xbc, 0x37, 0x33, 0xdf, 0xcc, 0x9b, 0x79, +- 0x2e, 0x00, 0xe8, 0x50, 0xaa, 0xa6, 0x05, 0x82, 0xa5, 0x69, 0x96, 0x00, +- 0x0d, 0xe0, 0xae, 0x8d, 0x58, 0xea, 0x77, 0x05, 0xda, 0xda, 0x70, 0x46, +- 0x62, 0x04, 0x86, 0xbb, 0x25, 0xee, 0x87, 0x27, 0x99, 0xa4, 0xc0, 0x9f, +- 0x75, 0x28, 0xc9, 0xf5, 0xee, 0xca, 0xc3, 0x6a, 0x0c, 0xcf, 0x59, 0xed, +- 0x07, 0xfc, 0xbd, 0x8b, 0x10, 0x1e, 0xce, 0x59, 0x88, 0x25, 0x46, 0xe8, +- 0x73, 0x11, 0x96, 0x66, 0x2d, 0x34, 0x57, 0xea, 0xb3, 0x70, 0x1f, 0xe8, +- 0x24, 0x5f, 0x99, 0x4d, 0x88, 0xff, 0x29, 0x78, 0x5f, 0x90, 0x6b, 0x2b, +- 0x3a, 0x8d, 0x7a, 0x15, 0xde, 0x2f, 0xfe, 0x50, 0xff, 0xb8, 0xd8, 0x07, +- 0xfc, 0x53, 0xfb, 0x5c, 0x3c, 0xa7, 0x98, 0x93, 0x7e, 0xb5, 0x0b, 0x83, +- 0xca, 0x1f, 0x9b, 0xe2, 0x4b, 0x93, 0xb6, 0x89, 0xdf, 0xd7, 0x84, 0xdf, +- 0xca, 0x6e, 0x33, 0x7b, 0x41, 0x7f, 0x83, 0x76, 0xe5, 0x79, 0x86, 0xb0, +- 0xe7, 0xb7, 0x03, 0x20, 0xe5, 0xcb, 0xf5, 0x75, 0x79, 0x8f, 0xff, 0xfb, +- 0x6a, 0xaf, 0x3c, 0xaf, 0x05, 0xa0, 0x57, 0xea, 0x2d, 0xb1, 0x3f, 0x83, +- 0xb0, 0x4f, 0x4f, 0xe2, 0x77, 0x03, 0xf7, 0xef, 0x11, 0xe7, 0x4a, 0xec, +- 0x62, 0xec, 0x66, 0x1c, 0x67, 0xbc, 0xca, 0xb8, 0x8b, 0x71, 0x27, 0xe3, +- 0x0e, 0xc6, 0x76, 0xc6, 0x97, 0x8c, 0x2e, 0x63, 0x82, 0xd1, 0x61, 0x7c, +- 0xce, 0x68, 0x33, 0xc6, 0x18, 0x5f, 0x30, 0xbe, 0x62, 0xb4, 0x18, 0x6f, +- 0x30, 0x7e, 0x61, 0xfc, 0xaa, 0xfc, 0xd0, 0x08, 0x1f, 0xf1, 0xfa, 0x10, +- 0xaf, 0x8f, 0x30, 0x02, 0xf3, 0xa4, 0x05, 0x78, 0xba, 0xcf, 0x75, 0x24, +- 0x79, 0xe6, 0xef, 0x3d, 0x4a, 0x8f, 0xf3, 0x84, 0x3c, 0xdd, 0x63, 0xbd, +- 0xf6, 0xca, 0x42, 0xa0, 0xde, 0x32, 0x5b, 0xd6, 0x59, 0xaa, 0x41, 0xde, +- 0x12, 0x18, 0xcf, 0xc4, 0x48, 0x02, 0xed, 0x38, 0xad, 0x24, 0x57, 0x6e, +- 0x9d, 0x4c, 0x10, 0x9e, 0x8b, 0x12, 0x7e, 0x62, 0x3c, 0x1f, 0x23, 0x9c, +- 0x8c, 0x2b, 0x9e, 0xd5, 0x39, 0xca, 0x9f, 0x66, 0x7e, 0x84, 0xd9, 0x53, +- 0x7e, 0x35, 0xb3, 0x4b, 0x58, 0xd4, 0xfd, 0xf1, 0x5f, 0x1f, 0x20, 0x34, +- 0xf2, 0x44, 0xea, 0x9c, 0xdd, 0x26, 0xa0, 0x5e, 0x9f, 0xb7, 0x0d, 0xb9, +- 0x3e, 0x38, 0xff, 0x1a, 0xef, 0xc7, 0xe0, 0x5c, 0x95, 0xfd, 0x4b, 0x28, +- 0x9e, 0xe9, 0xde, 0x64, 0x81, 0xd6, 0xe3, 0xc8, 0xbb, 0xa8, 0xb0, 0x1e, +- 0xee, 0x03, 0x59, 0x7f, 0xbe, 0xa8, 0x6e, 0x23, 0x9c, 0x8f, 0x8b, 0x9c, +- 0x8f, 0xae, 0x90, 0x7c, 0x84, 0xdd, 0xa3, 0xcd, 0xf7, 0xf7, 0x4c, 0x26, +- 0xc8, 0x5b, 0xd8, 0x7d, 0x53, 0x7c, 0x93, 0xf4, 0x77, 0x79, 0xbc, 0xc0, +- 0x3c, 0x16, 0x89, 0xc7, 0xe4, 0xe7, 0x86, 0x3c, 0x65, 0x3c, 0x3c, 0xc9, +- 0x38, 0xf7, 0x86, 0xe4, 0x39, 0x2c, 0xbe, 0xdc, 0x1f, 0xe7, 0x39, 0xe0, +- 0x1f, 0x9c, 0xc5, 0xfe, 0xe4, 0x42, 0x71, 0x44, 0xf9, 0xeb, 0xe7, 0xb9, +- 0x93, 0xf2, 0x0d, 0xd3, 0x79, 0x29, 0xaf, 0x03, 0x3c, 0xd5, 0x71, 0x6d, +- 0x14, 0x34, 0x09, 0x56, 0x31, 0x4f, 0xfb, 0x1d, 0x5d, 0xe7, 0xf5, 0x76, +- 0xeb, 0x42, 0xe5, 0x5d, 0x62, 0x2b, 0x14, 0x26, 0x39, 0xce, 0x2c, 0xd9, +- 0xa3, 0x3a, 0x30, 0xb8, 0x0e, 0x86, 0xb8, 0x7f, 0x05, 0xf9, 0xb0, 0x2a, +- 0x0b, 0xb3, 0xde, 0x7b, 0x9d, 0x84, 0x62, 0x9e, 0xea, 0x6a, 0x73, 0x5e, +- 0xd5, 0xdc, 0x51, 0x7d, 0x09, 0xc5, 0x95, 0x52, 0xc4, 0x17, 0xef, 0x51, +- 0xc8, 0x79, 0x79, 0xd6, 0x1a, 0xd4, 0x47, 0x33, 0x3b, 0xbe, 0xf3, 0x1c, +- 0xc8, 0x35, 0xea, 0x37, 0x26, 0xc7, 0xd5, 0xcd, 0xf5, 0xdd, 0xb1, 0xa9, +- 0xbe, 0xd5, 0x7c, 0xfb, 0x7b, 0x75, 0xce, 0xf1, 0x9b, 0xa8, 0x97, 0x5a, +- 0x79, 0xe0, 0x9d, 0x67, 0x51, 0xcf, 0x3c, 0xa3, 0x6d, 0xa6, 0xf2, 0x3b, +- 0xed, 0x9d, 0x43, 0xb1, 0x90, 0x3c, 0x78, 0xe7, 0x57, 0x30, 0x5e, 0x7f, +- 0x3d, 0x52, 0x5e, 0xa3, 0x1c, 0xbf, 0xd6, 0xa4, 0x2f, 0xb7, 0xb1, 0xde, +- 0x8f, 0x5a, 0xb8, 0x1e, 0x9d, 0x5b, 0xe8, 0xf1, 0xf6, 0xf1, 0xef, 0x35, +- 0x9a, 0x07, 0xdf, 0x6a, 0x8a, 0xdf, 0xc7, 0x21, 0xfc, 0x0e, 0xfd, 0x53, +- 0x7e, 0x21, 0xc0, 0xef, 0x6a, 0x6d, 0x7b, 0xfc, 0x02, 0xc7, 0x0f, 0x21, +- 0xfc, 0xb6, 0x32, 0x0f, 0x6f, 0xb7, 0xe0, 0x4d, 0xea, 0xc5, 0x58, 0xef, +- 0x8d, 0x47, 0x0f, 0xfd, 0x1e, 0xa2, 0x7b, 0x65, 0x16, 0xd7, 0x02, 0xbc, +- 0xe5, 0x73, 0xf2, 0x7e, 0x5f, 0x82, 0x2a, 0xc7, 0xbf, 0xec, 0xe3, 0x21, +- 0x2e, 0xfc, 0x73, 0xd1, 0xfe, 0xed, 0xaa, 0xe2, 0x8b, 0x3e, 0x67, 0x72, +- 0x84, 0x8b, 0xa8, 0xef, 0x7a, 0x78, 0xf3, 0xbe, 0xaf, 0x5c, 0xb8, 0x55, +- 0x55, 0xfd, 0x4c, 0xf6, 0x15, 0x13, 0x06, 0x78, 0x4e, 0x4e, 0x70, 0xff, +- 0xfa, 0x10, 0xa5, 0x3e, 0x59, 0x1c, 0xc5, 0x3e, 0x03, 0x1d, 0xeb, 0xfd, +- 0x8c, 0xd6, 0x9d, 0x71, 0x7a, 0x47, 0x0e, 0x98, 0x36, 0xea, 0x75, 0xc6, +- 0x09, 0x3b, 0x62, 0x72, 0x5f, 0x12, 0x3e, 0x8e, 0xa1, 0x7a, 0x6e, 0xa3, +- 0x3f, 0x05, 0xfb, 0x12, 0xc7, 0x79, 0x40, 0xca, 0x3b, 0x02, 0xfd, 0x48, +- 0xe8, 0xf4, 0x92, 0x7f, 0x37, 0x81, 0xe3, 0x52, 0xfb, 0xd2, 0x92, 0xc7, +- 0xc5, 0x9a, 0xea, 0xe3, 0xd9, 0x11, 0xe9, 0x4f, 0x02, 0x1c, 0x93, 0xf2, +- 0x48, 0x28, 0xf4, 0x74, 0x53, 0x6e, 0x4b, 0x95, 0x75, 0x5a, 0x97, 0x2f, +- 0xe3, 0x31, 0x63, 0x65, 0x25, 0x2f, 0x60, 0x61, 0x8e, 0xdf, 0x79, 0x86, +- 0x72, 0xa7, 0x1a, 0x21, 0xb9, 0x39, 0xaa, 0xf8, 0x48, 0x60, 0x7c, 0x73, +- 0xc4, 0xc7, 0xe9, 0x6b, 0x84, 0xa7, 0xe0, 0x18, 0x62, 0x74, 0x63, 0x2e, +- 0x5b, 0x88, 0x10, 0xf7, 0xf6, 0xdf, 0x16, 0xe1, 0x1e, 0xf6, 0x4d, 0x4f, +- 0x7e, 0x82, 0x73, 0xb5, 0x59, 0x9e, 0xbc, 0x73, 0x5d, 0xe6, 0xa9, 0xd1, +- 0xfc, 0x8e, 0x73, 0x5d, 0x95, 0x9b, 0xd4, 0x9f, 0xea, 0x83, 0x25, 0xae, +- 0xfb, 0x46, 0xef, 0x1a, 0x89, 0x4e, 0xc8, 0xfc, 0x4f, 0xad, 0xfb, 0x95, +- 0x0e, 0x7d, 0x77, 0x91, 0xfe, 0xf6, 0xde, 0x5b, 0x6e, 0xc8, 0x1c, 0xfe, +- 0x1f, 0xde, 0x55, 0x5b, 0xbd, 0xa7, 0x1c, 0xe6, 0xf9, 0x04, 0xf3, 0x6c, +- 0x40, 0x4b, 0x04, 0x89, 0xb1, 0x8d, 0x29, 0x3c, 0x57, 0x2f, 0xd3, 0x58, +- 0xb7, 0x5b, 0x66, 0x70, 0xae, 0x3b, 0xf6, 0x0c, 0xe9, 0x19, 0x24, 0x4f, +- 0x2a, 0xbc, 0x32, 0x45, 0xef, 0x6c, 0x1d, 0x7e, 0x01, 0x50, 0xb6, 0x82, +- 0xa7, 0xd8, 0x0d, 0x00, 0x00, 0x00 }; ++ /* Date: 02/03/2009 14:20 */ ++ 0xa5, 0x56, 0x4f, 0x68, 0x14, 0x67, 0x14, 0x7f, 0x33, 0xbb, 0xb3, 0xb3, ++ 0x99, 0x9d, 0xd9, 0xdd, 0x92, 0x18, 0x96, 0x18, 0xcc, 0x1a, 0x84, 0x92, ++ 0x75, 0xb7, 0x6e, 0x6c, 0x0f, 0x42, 0x03, 0x29, 0xb9, 0x08, 0x35, 0x87, ++ 0x12, 0x11, 0x8a, 0x2d, 0x68, 0xb7, 0x22, 0x14, 0x0a, 0xa5, 0x07, 0x8f, ++ 0xa5, 0x83, 0x71, 0x53, 0x5a, 0xbc, 0xe4, 0xd0, 0x80, 0x42, 0x35, 0x27, ++ 0x5b, 0x62, 0x0e, 0x3b, 0xe0, 0xa1, 0x88, 0xe0, 0x41, 0x8f, 0x7a, 0xaa, ++ 0x7f, 0x5a, 0x28, 0x46, 0x29, 0xb5, 0x87, 0x82, 0xc7, 0xde, 0x9a, 0xe9, ++ 0xf7, 0xfe, 0x7c, 0xbb, 0x33, 0x5f, 0x66, 0x13, 0xa1, 0x42, 0xfc, 0xf1, ++ 0xbd, 0x79, 0xef, 0xfb, 0xde, 0x9f, 0xdf, 0x7b, 0x6f, 0xab, 0x00, 0x60, ++ 0x43, 0x18, 0x4d, 0x29, 0x04, 0x2b, 0x67, 0x15, 0x11, 0x00, 0x36, 0x81, ++ 0xff, 0x39, 0x3e, 0x9d, 0xc3, 0x23, 0x72, 0x3e, 0xcc, 0x10, 0x1e, 0xae, ++ 0xaa, 0xff, 0x3f, 0x85, 0xf9, 0x3a, 0x62, 0x0e, 0xe6, 0x0f, 0x22, 0x1e, ++ 0x85, 0xbb, 0xf5, 0x9a, 0xc2, 0x7f, 0x63, 0x08, 0xf1, 0x1c, 0xf4, 0x7e, ++ 0x8e, 0x4a, 0x74, 0xff, 0x96, 0xd8, 0xff, 0x9a, 0x63, 0x3c, 0xd6, 0xac, ++ 0x12, 0x3e, 0x5a, 0xc5, 0xf7, 0x4e, 0x9d, 0x82, 0x02, 0xda, 0x5d, 0x50, ++ 0x17, 0x23, 0x96, 0xd4, 0x83, 0x45, 0xb2, 0x03, 0xbb, 0xa2, 0x70, 0x12, ++ 0x9e, 0x2f, 0xa0, 0xfe, 0x1b, 0xde, 0xa5, 0x55, 0xc4, 0x12, 0x74, 0x9a, ++ 0xa8, 0x77, 0x00, 0xb2, 0xf5, 0x6a, 0x4a, 0x0f, 0xe5, 0x11, 0x84, 0x4d, ++ 0xc4, 0x11, 0x80, 0x56, 0xf2, 0x3d, 0xd7, 0x0a, 0x5b, 0x68, 0xff, 0x85, ++ 0xbc, 0xb7, 0x4f, 0xee, 0x51, 0x71, 0x47, 0x88, 0x3d, 0xb1, 0x53, 0x7f, ++ 0x2d, 0x96, 0xb3, 0xfe, 0x67, 0x4a, 0x4f, 0xc7, 0xe3, 0x73, 0xde, 0xa6, ++ 0x38, 0x1e, 0x57, 0xe2, 0x79, 0xb6, 0xaa, 0xf3, 0x86, 0xfa, 0xbf, 0xc7, ++ 0x69, 0x7d, 0xd8, 0x43, 0xff, 0x89, 0xd2, 0x4f, 0xdf, 0xcb, 0xf2, 0x5f, ++ 0x06, 0xf2, 0x99, 0xf4, 0xf7, 0xad, 0x06, 0xfa, 0xe7, 0x00, 0x34, 0x24, ++ 0x8f, 0xa4, 0xff, 0x30, 0xe6, 0x78, 0xe6, 0xe0, 0x90, 0x5d, 0x23, 0xbd, ++ 0x3c, 0xd4, 0x28, 0x3f, 0x1c, 0xef, 0x01, 0xc1, 0x25, 0xc1, 0x6b, 0x82, ++ 0x3f, 0x08, 0xc2, 0xff, 0xc4, 0xad, 0x21, 0xf2, 0x7d, 0x82, 0xfb, 0x0d, ++ 0xf9, 0x2d, 0xc1, 0xb7, 0x0c, 0x7b, 0xcf, 0x62, 0x7c, 0xac, 0xbf, 0xcb, ++ 0xf9, 0x5d, 0xc3, 0xfe, 0x4b, 0xe0, 0xfc, 0x58, 0x46, 0xde, 0x36, 0x85, ++ 0x87, 0x58, 0x77, 0xf9, 0x3e, 0xa3, 0xf5, 0x84, 0x37, 0x8d, 0xa4, 0xfe, ++ 0x8d, 0x5d, 0xf4, 0x59, 0x6d, 0x61, 0x26, 0xcb, 0xee, 0x7a, 0x2c, 0x79, ++ 0x14, 0x7b, 0xaf, 0x77, 0x67, 0x08, 0xef, 0xe7, 0x32, 0x79, 0x3f, 0x2e, ++ 0x71, 0xa8, 0xa6, 0x23, 0xfb, 0xdb, 0x16, 0xf3, 0xdb, 0x11, 0x5e, 0xee, ++ 0xc6, 0x63, 0xe1, 0xd5, 0x8c, 0xe6, 0x57, 0x9a, 0x57, 0xcc, 0x8f, 0x82, ++ 0xc1, 0x8f, 0x6f, 0xf7, 0xc8, 0x4b, 0xc9, 0x88, 0x6f, 0x39, 0xd6, 0xf9, ++ 0xb6, 0x45, 0x7c, 0xb1, 0x50, 0xa5, 0x7b, 0xbf, 0x8b, 0xe8, 0x38, 0xe6, ++ 0xaf, 0xe0, 0x39, 0x0f, 0x97, 0x23, 0x6d, 0x27, 0xfd, 0xd4, 0xd0, 0xef, ++ 0xb0, 0x7d, 0x20, 0x9f, 0x6d, 0x47, 0xfb, 0xc9, 0x72, 0x0f, 0xf0, 0x3c, ++ 0xda, 0x5b, 0x37, 0xf2, 0x56, 0xa7, 0xb8, 0x41, 0xe2, 0x07, 0x23, 0x7e, ++ 0x9d, 0xbf, 0x57, 0xc2, 0xf7, 0x49, 0x95, 0x0f, 0xfe, 0x3e, 0x05, 0xfa, ++ 0x7e, 0x9c, 0x0b, 0x45, 0x38, 0x7b, 0xbc, 0x42, 0xfe, 0x94, 0x0b, 0x7c, ++ 0xcd, 0x87, 0x15, 0xc6, 0x73, 0x1e, 0xe3, 0x9f, 0x9e, 0xca, 0x2d, 0xc4, ++ 0xf1, 0xf9, 0x12, 0x9f, 0x3f, 0x09, 0xf0, 0xde, 0x51, 0xf5, 0xb0, 0xb6, ++ 0xd7, 0x7e, 0xed, 0xe6, 0x0f, 0xbe, 0xaf, 0xdf, 0xd1, 0x7e, 0xe8, 0xf7, ++ 0xd2, 0x75, 0x19, 0xfe, 0x2e, 0x63, 0xc7, 0x4e, 0xe7, 0x21, 0x3f, 0xcb, ++ 0x78, 0xb5, 0x4d, 0x50, 0x5b, 0xf3, 0xd9, 0xee, 0x8a, 0x9f, 0xc7, 0xf3, ++ 0x3b, 0x57, 0x1e, 0xe0, 0xfd, 0xf6, 0xd1, 0xb5, 0x48, 0xfc, 0xab, 0xe8, ++ 0xba, 0x92, 0x1c, 0xa6, 0x81, 0xcf, 0x4b, 0xc2, 0x93, 0x25, 0xe2, 0x71, ++ 0x59, 0x7d, 0x42, 0x9c, 0x80, 0xd0, 0x26, 0x3d, 0xef, 0x3e, 0xd9, 0xe7, ++ 0x44, 0xae, 0xea, 0x37, 0x9d, 0xe6, 0xff, 0x16, 0xf3, 0xa2, 0x98, 0xe6, ++ 0xd3, 0x7c, 0x62, 0xce, 0x25, 0xf3, 0x61, 0xf5, 0x79, 0xb4, 0xb3, 0x8e, ++ 0xe9, 0x7a, 0x3d, 0x5a, 0xd5, 0xf9, 0x61, 0xbe, 0xb2, 0x9e, 0x2a, 0x56, ++ 0x8b, 0xd5, 0xc3, 0xb6, 0x24, 0x72, 0x56, 0xbe, 0xb7, 0x4c, 0xde, 0x66, ++ 0xf1, 0xbe, 0x6a, 0xf0, 0xb8, 0x21, 0xbc, 0x1f, 0xe9, 0xad, 0xbf, 0xd6, ++ 0x7e, 0xb8, 0x29, 0xbc, 0xaf, 0x0e, 0xf6, 0xc3, 0x26, 0xed, 0x27, 0x75, ++ 0x26, 0xf5, 0x5e, 0x98, 0x4b, 0xd5, 0xe9, 0x3d, 0xc8, 0xec, 0xef, 0xab, ++ 0x72, 0x4f, 0x5b, 0xfa, 0xbc, 0x90, 0xd8, 0x23, 0xa4, 0x5e, 0x06, 0xf2, ++ 0xc3, 0x35, 0xfa, 0x74, 0x2c, 0x96, 0x77, 0x54, 0xbf, 0x65, 0xc5, 0xeb, ++ 0xc2, 0x5f, 0xc2, 0x83, 0x0e, 0xf5, 0x93, 0x33, 0xf6, 0xf9, 0xed, 0x54, ++ 0x9d, 0x00, 0x0e, 0xea, 0xfd, 0x90, 0xf4, 0x2b, 0xb9, 0xdf, 0xf0, 0xbe, ++ 0x1a, 0x74, 0x66, 0x93, 0x7b, 0xee, 0x72, 0xbf, 0xdf, 0x03, 0xea, 0xa3, ++ 0xf2, 0x8e, 0xbe, 0xd4, 0xf3, 0xac, 0xde, 0x4c, 0xf6, 0xf7, 0x98, 0xcc, ++ 0x2f, 0x5b, 0xf6, 0x73, 0xc9, 0x8c, 0x53, 0xed, 0xbd, 0xec, 0x7a, 0x71, ++ 0xbc, 0xff, 0x6c, 0xbf, 0xde, 0xbc, 0xdb, 0xab, 0xee, 0x9e, 0x51, 0xf7, ++ 0xbf, 0xb7, 0x75, 0x1e, 0x6d, 0x27, 0x6b, 0xbf, 0x7f, 0xa0, 0xee, 0x15, ++ 0x7d, 0x99, 0x1b, 0x67, 0xea, 0x59, 0x7c, 0x2d, 0xee, 0xd0, 0x4b, 0xcf, ++ 0x2f, 0xed, 0xe7, 0xc6, 0x06, 0xd7, 0xfd, 0xa3, 0xb8, 0xbf, 0x97, 0x52, ++ 0xf3, 0x75, 0x44, 0xea, 0xac, 0xf4, 0xc8, 0xbf, 0xa7, 0xdb, 0x83, 0x79, ++ 0x9c, 0xe4, 0xcd, 0x49, 0xe1, 0xab, 0x3d, 0xb7, 0x4e, 0xfd, 0xe1, 0x76, ++ 0x5e, 0x1a, 0x75, 0x98, 0x6d, 0x62, 0xfd, 0xbf, 0x86, 0x48, 0xfc, 0xfc, ++ 0x2d, 0xe5, 0x6f, 0x20, 0xfd, 0x55, 0x80, 0x9f, 0x22, 0x1d, 0x97, 0xae, ++ 0x1b, 0xe3, 0x8f, 0x4d, 0xe9, 0x93, 0x7e, 0x7c, 0xf8, 0xee, 0xa2, 0xbc, ++ 0x5b, 0x85, 0x1b, 0x91, 0x9e, 0x63, 0x38, 0xd7, 0x5c, 0x68, 0xcb, 0xdc, ++ 0x3c, 0x2b, 0xf3, 0xeb, 0x85, 0xc7, 0xf3, 0xb1, 0x73, 0x82, 0x78, 0x08, ++ 0xe3, 0x32, 0xc7, 0x3a, 0x01, 0x9f, 0x27, 0x02, 0xfe, 0x7d, 0xd8, 0x76, ++ 0x7d, 0xd2, 0x9b, 0x08, 0x18, 0xc7, 0x4b, 0x68, 0x57, 0x83, 0x3f, 0x16, ++ 0x49, 0xbd, 0x39, 0x98, 0x63, 0xe6, 0xfc, 0x92, 0x38, 0xdf, 0x46, 0xb9, ++ 0xda, 0x93, 0xd3, 0x7c, 0xe6, 0x3a, 0xfb, 0x7d, 0x5e, 0x5f, 0x97, 0xaa, ++ 0xd4, 0x2b, 0xc9, 0x3c, 0xeb, 0x3e, 0xba, 0x69, 0xe4, 0x57, 0xd7, 0xe7, ++ 0xcd, 0x58, 0xcf, 0xf7, 0xe9, 0xe3, 0xe8, 0x6f, 0x05, 0xca, 0x2e, 0xf3, ++ 0x82, 0x51, 0xdd, 0x63, 0xbb, 0x68, 0x36, 0xd9, 0x95, 0x79, 0xd8, 0xbd, ++ 0x48, 0xd7, 0x2c, 0x76, 0xb5, 0x7c, 0x81, 0x1a, 0x61, 0x69, 0xe3, 0x1e, ++ 0xc9, 0xcb, 0x51, 0x8e, 0xe5, 0xee, 0x09, 0x9d, 0xaf, 0x0a, 0xc5, 0xbf, ++ 0xc6, 0xf9, 0xfa, 0xf8, 0x7b, 0xc6, 0xd3, 0xf0, 0x3e, 0xa1, 0x37, 0x98, ++ 0xe3, 0x45, 0x42, 0x08, 0x92, 0x73, 0xdc, 0x51, 0xee, 0x55, 0xc9, 0x9f, ++ 0x41, 0xfd, 0xcc, 0xfd, 0xb8, 0x5b, 0x1d, 0x47, 0x13, 0xfc, 0xd3, 0x75, ++ 0x34, 0xe7, 0x39, 0xf1, 0xc4, 0xe0, 0x63, 0x77, 0x08, 0x1f, 0xad, 0x21, ++ 0x7c, 0x36, 0xe7, 0xd6, 0x57, 0xd2, 0xc7, 0x79, 0x70, 0x72, 0xb4, 0x70, ++ 0xfd, 0xfc, 0x32, 0xd5, 0xd5, 0xee, 0xf2, 0x0f, 0x08, 0xdf, 0x59, 0xb1, ++ 0x28, 0x5f, 0xfe, 0x0a, 0xeb, 0xe5, 0x59, 0x5e, 0xd3, 0xf8, 0xcd, 0xb2, ++ 0xfe, 0xbd, 0xf1, 0x1f, 0xb6, 0x34, 0x9b, 0xb9, 0xa0, 0x0c, 0x00, 0x00, ++ 0x00 }; + + static u8 bnx2_rv2p_proc2[] = { +- /* Date: 12/07/2007 15:02 */ +- 0xed, 0x59, 0x5d, 0x6c, 0x54, 0xc7, 0x15, 0x9e, 0xbd, 0xbb, 0x7b, 0xf7, +- 0x7a, 0x7d, 0xf7, 0xae, 0x71, 0xa8, 0xff, 0xf9, 0xb3, 0x09, 0xd8, 0xa9, +- 0x21, 0xce, 0x9a, 0x98, 0x02, 0x55, 0x63, 0x39, 0x95, 0x81, 0xa6, 0x55, +- 0x0c, 0x49, 0x9b, 0xbe, 0x35, 0x76, 0x02, 0xb6, 0xa9, 0x4d, 0x2d, 0x43, +- 0x83, 0x4a, 0x1b, 0x65, 0x85, 0xd7, 0xf6, 0xcb, 0x26, 0xea, 0x22, 0xc0, +- 0x24, 0xaa, 0xa8, 0x1b, 0xa4, 0x28, 0xea, 0xdb, 0x56, 0x6a, 0x6d, 0xda, +- 0x97, 0xfe, 0x10, 0xb7, 0x4a, 0xa4, 0x42, 0xa5, 0xf6, 0xa1, 0x52, 0x85, +- 0x44, 0xda, 0x62, 0x99, 0xc4, 0x20, 0x63, 0xba, 0x79, 0x21, 0x75, 0x67, +- 0xce, 0x77, 0xe6, 0xee, 0xbd, 0xeb, 0xb5, 0x21, 0x2d, 0x8f, 0xdd, 0x07, +- 0x1f, 0x66, 0xee, 0x99, 0x33, 0xe7, 0xe7, 0x9b, 0x33, 0x67, 0x0e, 0x65, +- 0x42, 0x08, 0x43, 0x24, 0xb3, 0x1b, 0x24, 0x15, 0x56, 0x20, 0x20, 0xf0, +- 0x7b, 0xac, 0x8c, 0xc8, 0x9f, 0xb3, 0x96, 0xfc, 0x1b, 0x16, 0xcf, 0x1b, +- 0x55, 0x34, 0x0e, 0x09, 0x45, 0x1d, 0x21, 0x92, 0x5e, 0x5a, 0xce, 0xf4, +- 0x67, 0x4c, 0x77, 0x1b, 0xa0, 0x3d, 0x4c, 0xeb, 0x98, 0x9e, 0x64, 0xba, +- 0x91, 0xe9, 0x56, 0xa6, 0x27, 0x98, 0x7e, 0x8f, 0xe9, 0x07, 0x4c, 0x77, +- 0xb2, 0x3c, 0xf9, 0x4b, 0xda, 0xf2, 0x4f, 0x40, 0x24, 0x9b, 0xb4, 0x7e, +- 0x36, 0xa6, 0x9b, 0xa0, 0xe7, 0x73, 0x1b, 0x15, 0xdf, 0xcd, 0xa5, 0x3c, +- 0x1f, 0xe6, 0xaf, 0x65, 0x40, 0x37, 0x60, 0xd5, 0x4f, 0x93, 0x8f, 0xeb, +- 0xf5, 0x20, 0xdd, 0x31, 0xd0, 0x9e, 0x20, 0x68, 0x7b, 0x33, 0x91, 0xf4, +- 0x4b, 0x06, 0xc6, 0x9d, 0x5b, 0x2c, 0xb2, 0x2f, 0x64, 0x28, 0x39, 0xeb, +- 0x2d, 0xf3, 0x12, 0xe6, 0xbf, 0x19, 0x07, 0x7d, 0x39, 0x0a, 0xfa, 0x4f, +- 0xa6, 0x87, 0x4b, 0x59, 0xbe, 0xcd, 0x6a, 0x97, 0x62, 0xfd, 0x8c, 0xad, +- 0x68, 0x50, 0x24, 0x79, 0x9d, 0x10, 0xd0, 0xeb, 0xc7, 0x02, 0xdf, 0xd7, +- 0x6c, 0xc5, 0xec, 0x0f, 0x0f, 0x63, 0x5c, 0x7b, 0xb1, 0x8c, 0xf8, 0xcf, +- 0x67, 0xb5, 0xfe, 0x16, 0x79, 0x3f, 0x19, 0x87, 0x1c, 0x51, 0x6f, 0xd1, +- 0x26, 0xc9, 0x66, 0x50, 0xb1, 0x4d, 0xcb, 0xc3, 0xef, 0xdc, 0xa3, 0xda, +- 0x3f, 0x18, 0xaf, 0x4d, 0x80, 0x9e, 0x65, 0x5a, 0xd1, 0x4a, 0x64, 0xfb, +- 0xdf, 0x9f, 0xb0, 0x48, 0x97, 0xe4, 0x36, 0xaf, 0x1f, 0x7f, 0x23, 0xfd, +- 0xc8, 0x82, 0x1a, 0x40, 0x6e, 0x3c, 0xaa, 0xf8, 0xa4, 0x71, 0xf5, 0x90, +- 0x7b, 0xb0, 0xbf, 0x98, 0xff, 0x7f, 0xf9, 0x19, 0xfc, 0xaf, 0xe4, 0xb5, +- 0xb3, 0xfe, 0x1b, 0xa5, 0xfe, 0x8a, 0xd6, 0x05, 0x92, 0xdb, 0xfc, 0xfe, +- 0xb9, 0x96, 0x89, 0xd3, 0xbf, 0x6f, 0x76, 0x94, 0x91, 0xfd, 0xcf, 0x62, +- 0xfe, 0x74, 0xe7, 0x14, 0xfc, 0xb4, 0x9f, 0xe2, 0x22, 0xa2, 0xa9, 0x9f, +- 0x63, 0x55, 0x77, 0x4c, 0x8d, 0x5f, 0xd8, 0x71, 0x23, 0x8b, 0xef, 0xe1, +- 0x11, 0x35, 0x36, 0xe4, 0x3a, 0xfc, 0xf6, 0x07, 0x09, 0xe0, 0x69, 0x73, +- 0x84, 0x86, 0xf6, 0x0c, 0x7d, 0xb7, 0xc5, 0x78, 0x16, 0xdf, 0x8f, 0x96, +- 0xaa, 0xf1, 0xb3, 0xcd, 0x73, 0x18, 0x37, 0xf7, 0x8f, 0xf1, 0x42, 0xa3, +- 0x44, 0xfe, 0x59, 0x5a, 0xba, 0x69, 0x40, 0x1e, 0x87, 0x37, 0x1a, 0x32, +- 0xe2, 0x64, 0xaf, 0xdd, 0x09, 0x3a, 0x4a, 0xdf, 0xef, 0x05, 0xd2, 0x64, +- 0x77, 0xa7, 0x13, 0x9a, 0x02, 0x23, 0xe3, 0xca, 0xc5, 0x8d, 0xc6, 0xdd, +- 0x83, 0xe2, 0x67, 0xcc, 0xc5, 0x0f, 0xfb, 0xbf, 0x69, 0x25, 0xfc, 0x80, +- 0x76, 0x6e, 0x01, 0x35, 0x1b, 0x14, 0x5f, 0xb8, 0x08, 0x8e, 0xfc, 0x7e, +- 0xe6, 0xf8, 0x14, 0xe2, 0x44, 0xe2, 0x03, 0x63, 0xc6, 0x8b, 0xc4, 0x95, +- 0xe2, 0xaf, 0x96, 0xfe, 0xd2, 0xf1, 0x57, 0x82, 0x22, 0xe2, 0xdb, 0x2c, +- 0xaf, 0x9f, 0xed, 0x1a, 0x60, 0x7b, 0xe6, 0xa3, 0xda, 0xaf, 0xda, 0x1e, +- 0xd0, 0x71, 0x9f, 0x3d, 0x01, 0x89, 0x27, 0x8d, 0x23, 0x9f, 0x3e, 0xe9, +- 0xf7, 0xea, 0xf1, 0x8f, 0x5a, 0xc6, 0xa1, 0x6b, 0xe7, 0x16, 0xc5, 0x67, +- 0x26, 0x26, 0xb2, 0x7e, 0x1c, 0x6e, 0x10, 0x5a, 0x8e, 0x96, 0xaf, 0x70, +- 0x99, 0x93, 0xb8, 0x44, 0xdc, 0xce, 0x67, 0xbd, 0xe7, 0xa8, 0xa6, 0xc8, +- 0x39, 0xf2, 0x9f, 0x07, 0xed, 0x97, 0xa3, 0x31, 0x4a, 0x10, 0x3b, 0xae, +- 0xcc, 0xfa, 0xf7, 0x03, 0xbe, 0x23, 0x2e, 0x7e, 0xd6, 0xb6, 0xb1, 0xff, +- 0x98, 0x56, 0xec, 0x54, 0xf2, 0xba, 0x58, 0x7e, 0x0b, 0xcb, 0xb7, 0x0b, +- 0xce, 0xdb, 0x73, 0xee, 0x79, 0xd3, 0x71, 0xcb, 0x9f, 0x3b, 0xed, 0x3f, +- 0xda, 0xbf, 0xf9, 0xca, 0xac, 0x5a, 0x5f, 0x7b, 0x9f, 0x73, 0xb8, 0xbf, +- 0xc8, 0x39, 0x84, 0x9c, 0xbf, 0x3c, 0xee, 0xb7, 0x6b, 0x88, 0xf3, 0x5c, +- 0x0f, 0xe2, 0x66, 0xbd, 0xf4, 0x2b, 0xfe, 0xf0, 0x18, 0xe1, 0x5d, 0xbc, +- 0x18, 0x41, 0x7c, 0x1d, 0xd2, 0x5f, 0xb0, 0x1d, 0x2f, 0x7b, 0xce, 0x6b, +- 0x09, 0xf9, 0xb5, 0xc3, 0xc4, 0x7e, 0x1d, 0xdd, 0x58, 0xde, 0xce, 0x78, +- 0xc8, 0xf1, 0x79, 0x99, 0xb5, 0x49, 0xff, 0xe8, 0x9d, 0x53, 0x98, 0x1f, +- 0xdd, 0x43, 0x24, 0x7d, 0xd5, 0xd0, 0xf6, 0x86, 0xd4, 0xdf, 0xc9, 0x41, +- 0x7c, 0x9f, 0x0c, 0xf1, 0xf9, 0x7c, 0xaf, 0x9e, 0xd6, 0x5b, 0xf3, 0x19, +- 0xac, 0xcf, 0xb1, 0x7e, 0x27, 0x82, 0xc4, 0x1f, 0x1d, 0x63, 0xbe, 0xf1, +- 0x11, 0xbf, 0x9d, 0x3f, 0x40, 0x3e, 0xb7, 0xbf, 0x3f, 0x42, 0xe7, 0xdd, +- 0x31, 0x5d, 0x3e, 0xa2, 0xce, 0xe8, 0x29, 0xc5, 0x5f, 0x29, 0xc6, 0xb2, +- 0x4a, 0xd1, 0x2a, 0xd1, 0xbd, 0x17, 0xeb, 0xde, 0x30, 0x91, 0x6f, 0x7a, +- 0xf7, 0x82, 0x7e, 0x88, 0xf9, 0xf5, 0xce, 0xb8, 0xe2, 0x5f, 0x53, 0xe3, +- 0x4c, 0x29, 0x1a, 0x97, 0xf6, 0x28, 0xfb, 0xa5, 0xed, 0x8c, 0xcf, 0xc1, +- 0x46, 0xf0, 0xf7, 0x1d, 0xa2, 0x8d, 0xcf, 0x0c, 0xe4, 0x28, 0x5f, 0x4d, +- 0x0e, 0x5f, 0x52, 0x7e, 0xa9, 0x16, 0xb3, 0xc7, 0x14, 0x0d, 0x89, 0x8e, +- 0x4d, 0xec, 0x97, 0x3d, 0xfe, 0xfc, 0x3c, 0xbf, 0x53, 0x8d, 0x6b, 0x24, +- 0x9f, 0x17, 0xbf, 0x16, 0xc7, 0x39, 0xe4, 0xfa, 0xf5, 0x13, 0x03, 0x76, +- 0xa7, 0x48, 0xff, 0x3d, 0xd1, 0x14, 0x9d, 0xeb, 0x98, 0xe8, 0x25, 0x3c, +- 0x85, 0xac, 0xc1, 0x4b, 0xf8, 0x3e, 0xff, 0x0b, 0x2d, 0x57, 0xe1, 0x61, +- 0x17, 0xdf, 0x9f, 0xc2, 0x95, 0x13, 0xda, 0xc9, 0x71, 0xd0, 0xfb, 0xb6, +- 0xe2, 0xbe, 0xe9, 0x08, 0xa8, 0xf1, 0x3a, 0x39, 0xb6, 0x29, 0x6e, 0x1d, +- 0xdd, 0x6a, 0xbd, 0x4c, 0x02, 0x74, 0x7e, 0x1c, 0x29, 0x5f, 0xcd, 0x47, +- 0xa4, 0x1d, 0xfe, 0x7d, 0x06, 0x11, 0x0f, 0xfb, 0x28, 0xf9, 0xe7, 0xf3, +- 0xf6, 0xad, 0x8c, 0xb6, 0x07, 0xf3, 0xb7, 0x5d, 0x7d, 0x6c, 0xb2, 0xab, +- 0x63, 0x13, 0xf6, 0x9b, 0x75, 0x78, 0x9f, 0x4d, 0xbc, 0xef, 0x31, 0xb5, +- 0x5f, 0x83, 0x47, 0x5f, 0xc5, 0x67, 0x45, 0x6f, 0x91, 0xdc, 0x75, 0xd6, +- 0x77, 0x2e, 0x91, 0x7f, 0xad, 0xa3, 0x53, 0xd8, 0xff, 0xf6, 0xd4, 0x6a, +- 0x7a, 0xd7, 0xb0, 0x9c, 0x75, 0xec, 0xd7, 0xd8, 0x43, 0x8c, 0xdb, 0xea, +- 0x71, 0xca, 0xfb, 0x57, 0xfb, 0x87, 0xe4, 0xdb, 0x0b, 0xd3, 0xab, 0xe9, +- 0x2b, 0x6d, 0x4a, 0x82, 0x3f, 0x65, 0xd0, 0xc1, 0xa8, 0x82, 0x5f, 0xf2, +- 0x71, 0xd3, 0xfa, 0xce, 0x1f, 0xc2, 0x7d, 0x34, 0xe8, 0xe6, 0x0b, 0x25, +- 0xb7, 0x9d, 0xf1, 0x20, 0xe5, 0x05, 0xe0, 0x9f, 0x85, 0x69, 0x9c, 0x9b, +- 0x13, 0x74, 0x3e, 0xbe, 0x68, 0x87, 0x68, 0xff, 0xa8, 0x75, 0x83, 0xef, +- 0xa5, 0xfc, 0xfd, 0x03, 0x79, 0x7d, 0x36, 0x68, 0x2f, 0xe7, 0xe9, 0x1b, +- 0x4c, 0x53, 0xb6, 0x5a, 0x57, 0x2a, 0xf3, 0xad, 0x45, 0xf2, 0x91, 0x57, +- 0x4b, 0x5c, 0x7d, 0x8f, 0xb0, 0x9c, 0x8f, 0x98, 0x0a, 0x96, 0x33, 0xc0, +- 0xeb, 0xe7, 0x7c, 0x72, 0x0c, 0x8f, 0x1c, 0x7f, 0x3e, 0x1a, 0xe3, 0x7b, +- 0xef, 0xbc, 0xb9, 0x52, 0xbd, 0xa4, 0x68, 0xb9, 0x5c, 0x8f, 0x59, 0x7d, +- 0x2f, 0xa4, 0x1a, 0x89, 0xb4, 0x85, 0x0c, 0xb2, 0x77, 0x32, 0x35, 0x02, +- 0x3f, 0x8d, 0xb3, 0x9f, 0x22, 0xf0, 0x53, 0x4d, 0xfe, 0x9e, 0xe4, 0x8d, +- 0xf8, 0xfc, 0xcd, 0x6c, 0xf6, 0x9f, 0xc7, 0xf3, 0xa6, 0x8e, 0x2f, 0x91, +- 0x34, 0xf2, 0x90, 0xbe, 0x3f, 0xf5, 0xbd, 0x72, 0x4b, 0xe7, 0x6d, 0xb9, +- 0x6f, 0x81, 0x3e, 0x41, 0x8a, 0x73, 0x74, 0x9c, 0xf3, 0xd1, 0xd5, 0xa0, +- 0x8e, 0x27, 0xf4, 0x1b, 0xff, 0x8c, 0xfa, 0xe5, 0xef, 0xe5, 0xb0, 0x22, +- 0xcd, 0xb3, 0xc7, 0x88, 0xb6, 0xf4, 0x1d, 0xc7, 0x7c, 0x65, 0xab, 0xd2, +- 0xe7, 0x27, 0x01, 0x9c, 0xd3, 0xb0, 0x98, 0xc9, 0xe0, 0x9e, 0x13, 0x11, +- 0xd2, 0xa3, 0xee, 0x32, 0xe1, 0xc2, 0x8c, 0xa6, 0x32, 0x3e, 0x7f, 0x79, +- 0xec, 0x2e, 0x66, 0xef, 0x84, 0xc4, 0x93, 0xfa, 0x6e, 0xf2, 0x79, 0x95, +- 0x78, 0xb5, 0xf9, 0xbc, 0x3c, 0x4d, 0x7c, 0xf6, 0x22, 0xd9, 0xf9, 0x0d, +- 0x6b, 0x9c, 0xeb, 0xb4, 0x8f, 0x3b, 0xd5, 0xf8, 0x79, 0xfb, 0x75, 0x9c, +- 0x77, 0xfb, 0x75, 0xe4, 0x5b, 0x2b, 0x7c, 0x11, 0x79, 0xb8, 0xf3, 0xa2, +- 0x6f, 0xff, 0x74, 0xc8, 0xd0, 0xe7, 0xe7, 0x7f, 0xf2, 0x9b, 0xfd, 0x5d, +- 0xf6, 0xdb, 0xdd, 0xd5, 0xe3, 0x9a, 0x36, 0xf9, 0x1c, 0xf6, 0xdd, 0x2d, +- 0xb4, 0x57, 0xf9, 0xef, 0x43, 0xf7, 0x1e, 0x0e, 0xed, 0x62, 0x7d, 0x76, +- 0x71, 0x1e, 0xe0, 0xfa, 0x67, 0x7d, 0x50, 0xdf, 0x8b, 0x1a, 0x0f, 0x7c, +- 0x3f, 0x02, 0xa7, 0xd6, 0x28, 0xec, 0x15, 0xaf, 0xf2, 0x39, 0xf8, 0x37, +- 0xd3, 0xd7, 0x18, 0xff, 0x27, 0xb9, 0x3e, 0xd2, 0xf5, 0xdd, 0x3d, 0xcc, +- 0x3b, 0x13, 0x6e, 0x3d, 0xa4, 0xef, 0x1f, 0x35, 0x0e, 0x08, 0x27, 0x52, +- 0x4a, 0xfb, 0x25, 0x7f, 0x07, 0x80, 0x8d, 0x3f, 0x0d, 0x3f, 0xce, 0xb6, +- 0x82, 0xef, 0x0d, 0xf8, 0xc7, 0xd1, 0xfa, 0x2d, 0x36, 0xfa, 0xde, 0x01, +- 0x6d, 0xf0, 0xaf, 0xe9, 0xfa, 0x57, 0xe3, 0x73, 0x89, 0x69, 0xed, 0x66, +- 0xb6, 0xf3, 0xbf, 0xf3, 0xbb, 0xa7, 0x1e, 0x5b, 0xc9, 0xef, 0xb4, 0xbe, +- 0xad, 0xef, 0x2e, 0xe6, 0xcb, 0x76, 0x83, 0x66, 0x76, 0xd3, 0xfc, 0x66, +- 0xe4, 0xdb, 0x70, 0xdb, 0xe9, 0xfb, 0xd4, 0xa7, 0xfa, 0x5d, 0x53, 0xf9, +- 0x25, 0xd0, 0x33, 0x4c, 0x3f, 0xf7, 0x14, 0xe8, 0xb9, 0xa7, 0xfc, 0x79, +- 0xc4, 0x8c, 0xfb, 0xe2, 0xdb, 0x86, 0xf8, 0xbe, 0xe3, 0xc6, 0x77, 0x3d, +- 0xea, 0x03, 0x19, 0xaf, 0x55, 0xe3, 0xe9, 0xc6, 0xe9, 0x7e, 0xf1, 0x7c, +- 0xd8, 0x71, 0x4c, 0xed, 0xc2, 0x3d, 0x37, 0xcc, 0xef, 0xcd, 0x45, 0xf7, +- 0x9e, 0x2a, 0x16, 0xdf, 0xc8, 0xff, 0xe3, 0x4b, 0xf1, 0x3d, 0xb2, 0xa4, +- 0xf3, 0x1f, 0xee, 0x79, 0x5d, 0xd7, 0x0f, 0x79, 0xea, 0x7a, 0xff, 0xbe, +- 0xdf, 0xa2, 0x7a, 0x79, 0x34, 0xe0, 0xe2, 0x82, 0xf8, 0xa7, 0x79, 0x5d, +- 0x19, 0xaf, 0xdb, 0xb7, 0x6c, 0xdd, 0xb5, 0x8c, 0x5a, 0xf7, 0xb7, 0x4f, +- 0x97, 0xf7, 0x25, 0x7c, 0x7a, 0x26, 0x45, 0x1c, 0xf1, 0xc1, 0x7d, 0x61, +- 0x16, 0xe9, 0x63, 0xf8, 0x71, 0xb7, 0x37, 0x8e, 0x7c, 0xa8, 0xdf, 0x79, +- 0xfe, 0xba, 0xfe, 0x8f, 0x9f, 0xae, 0x5c, 0xd7, 0x6b, 0x79, 0x88, 0x5f, +- 0xb7, 0x11, 0x23, 0xbe, 0xeb, 0x43, 0x6a, 0x5d, 0xbf, 0x6b, 0x5f, 0x3b, +- 0xd9, 0x75, 0x99, 0xed, 0xab, 0x63, 0xfb, 0xe4, 0xe7, 0x6d, 0x74, 0x9f, +- 0x58, 0xd7, 0x87, 0xbc, 0xf6, 0xfd, 0x7a, 0x95, 0xfd, 0x1e, 0xf4, 0x1d, +- 0xc1, 0xfb, 0xc6, 0xf5, 0xfe, 0x4a, 0x5e, 0x2d, 0xd7, 0x63, 0x8e, 0xe0, +- 0xe7, 0x54, 0x91, 0xba, 0x46, 0xed, 0xff, 0x7b, 0xe9, 0x00, 0xbe, 0xc7, +- 0xe8, 0x1d, 0x11, 0xb4, 0x2e, 0x67, 0x8a, 0xf9, 0xe5, 0x6b, 0x01, 0xf0, +- 0x15, 0x8b, 0x9b, 0xfa, 0x1e, 0x66, 0x39, 0xc5, 0xec, 0x66, 0x3d, 0x5d, +- 0x3c, 0xf0, 0x3a, 0xe2, 0xeb, 0x63, 0xbe, 0x50, 0x91, 0xbe, 0x04, 0x46, +- 0xb9, 0xad, 0x54, 0x2f, 0x5e, 0x38, 0x39, 0xad, 0xf8, 0x62, 0xee, 0xbb, +- 0xcc, 0xaf, 0xdf, 0xc4, 0x43, 0xf0, 0x23, 0xbd, 0x3f, 0x44, 0xaf, 0xb3, +- 0x92, 0xbf, 0xf0, 0x7e, 0x5a, 0x98, 0xd6, 0xfe, 0xb6, 0xc9, 0x4e, 0xd4, +- 0xd3, 0x17, 0x0a, 0xfc, 0x68, 0x78, 0xfc, 0x08, 0xfe, 0x95, 0x71, 0xef, +- 0x7f, 0x97, 0x03, 0x17, 0xaf, 0x16, 0xc1, 0x3d, 0xf5, 0xf7, 0x1e, 0xd8, +- 0xce, 0x03, 0xad, 0x5e, 0xbb, 0x1a, 0xc4, 0x4c, 0x16, 0xf8, 0xef, 0x62, +- 0x9c, 0xbc, 0xc8, 0x79, 0xf6, 0x7a, 0x54, 0x4d, 0x58, 0xa2, 0xe7, 0x19, +- 0xe4, 0xe9, 0x8a, 0x52, 0xd8, 0xdd, 0xf3, 0x55, 0xed, 0x27, 0xcc, 0xd7, +- 0xc4, 0x50, 0x57, 0x77, 0x45, 0xf0, 0xbe, 0xa8, 0x89, 0x81, 0x56, 0x70, +- 0x9e, 0x9e, 0x71, 0xfb, 0x29, 0xa0, 0xf9, 0xfa, 0x12, 0x7d, 0xa5, 0xdf, +- 0x9a, 0xa8, 0xc3, 0x45, 0x13, 0xd7, 0xcf, 0x94, 0xef, 0x82, 0xe2, 0x60, +- 0x13, 0x70, 0x22, 0xea, 0xfd, 0x79, 0x8a, 0xf3, 0xec, 0xb2, 0x7a, 0x0d, +- 0x7d, 0x99, 0x12, 0x4f, 0x5f, 0x42, 0xef, 0xa7, 0xfd, 0xa8, 0xe5, 0xd2, +- 0x70, 0x85, 0xba, 0x72, 0x91, 0xf3, 0xd8, 0x23, 0xe2, 0x0f, 0x59, 0xd8, +- 0x35, 0x93, 0x2d, 0xc4, 0x95, 0xde, 0x4f, 0xcb, 0x83, 0xde, 0xda, 0x8e, +- 0xbc, 0x7c, 0xec, 0x7f, 0x88, 0xf5, 0xfc, 0x07, 0xf5, 0x33, 0x2b, 0xd8, +- 0x1e, 0x25, 0x17, 0xf3, 0xfb, 0xb8, 0x4f, 0x94, 0x74, 0xc7, 0xfe, 0xfe, +- 0x4e, 0x17, 0xe9, 0xb5, 0x86, 0x71, 0x54, 0xe1, 0xc1, 0x39, 0xf8, 0xd7, +- 0xb6, 0x80, 0x9e, 0x6d, 0xd1, 0x71, 0xd0, 0xf1, 0xd2, 0xf1, 0x41, 0x1c, +- 0x2b, 0xd0, 0x4f, 0xda, 0xd1, 0xf3, 0x04, 0xdd, 0x0f, 0x2d, 0x3d, 0x0b, +- 0xfa, 0xdc, 0x61, 0xfd, 0x81, 0x66, 0xc5, 0xff, 0x9a, 0xf8, 0x13, 0xf7, +- 0x1b, 0xfe, 0xca, 0xb4, 0xb0, 0x6f, 0x82, 0xbe, 0x8b, 0x8c, 0x5b, 0x98, +- 0x03, 0xd2, 0xaa, 0xf3, 0xac, 0xf7, 0x9d, 0xa0, 0xcf, 0xdf, 0xd6, 0x65, +- 0x78, 0xcd, 0xe7, 0x4b, 0x6d, 0x9f, 0xe2, 0x6f, 0x66, 0x1c, 0xca, 0xf7, +- 0xe9, 0x5e, 0xa5, 0x47, 0x5c, 0xde, 0xdb, 0xc8, 0xc7, 0x4e, 0xc4, 0x1b, +- 0x27, 0x89, 0x87, 0x92, 0x88, 0x1a, 0xd6, 0x95, 0x97, 0x90, 0x1d, 0xa7, +- 0xdf, 0xff, 0x80, 0x3e, 0xbf, 0x3d, 0x51, 0x8a, 0xf9, 0xca, 0x67, 0xe2, +- 0xe4, 0x87, 0x73, 0xc0, 0xf1, 0x8f, 0xce, 0x82, 0xbe, 0x25, 0xbe, 0x82, +- 0xf5, 0xe5, 0xa7, 0xe8, 0xfe, 0xb7, 0x2a, 0x19, 0x97, 0x55, 0x38, 0xf7, +- 0x69, 0xd4, 0x0f, 0x4b, 0x4b, 0x22, 0x86, 0xba, 0x4d, 0xdf, 0x03, 0xc0, +- 0x65, 0xc8, 0x13, 0xdf, 0xfb, 0xe1, 0x54, 0x51, 0xbb, 0xf0, 0x9d, 0x64, +- 0x15, 0xe2, 0x55, 0xfb, 0xa3, 0xca, 0x28, 0x8a, 0xcf, 0x36, 0x3f, 0x3e, +- 0x4d, 0xc6, 0xe7, 0x5d, 0xb7, 0x8e, 0x5a, 0x2e, 0x97, 0xde, 0x89, 0x12, +- 0xb7, 0x0f, 0x0b, 0xaf, 0xa0, 0xfb, 0x1a, 0xd4, 0xfe, 0x95, 0xcb, 0xf2, +- 0xeb, 0x06, 0x5f, 0x9c, 0x6f, 0xde, 0xd3, 0x7a, 0x9d, 0x32, 0xbd, 0xdf, +- 0x5b, 0xdc, 0x7b, 0x66, 0x98, 0xfb, 0xfc, 0x39, 0xf4, 0xa3, 0x12, 0xf3, +- 0x69, 0x1a, 0xda, 0xd5, 0xef, 0x52, 0xdf, 0x22, 0x31, 0xcc, 0xf9, 0xf3, +- 0xfd, 0xa0, 0xae, 0xb7, 0x30, 0xbe, 0xc2, 0x79, 0xe3, 0x0e, 0xeb, 0x75, +- 0x80, 0x61, 0x39, 0xdf, 0x48, 0x79, 0x37, 0xa1, 0xeb, 0xb4, 0x61, 0x7e, +- 0x5f, 0xe8, 0x3e, 0xd5, 0x97, 0x83, 0x9c, 0x4f, 0xc9, 0x8f, 0xa1, 0xc4, +- 0xed, 0x29, 0xdd, 0x4f, 0xd0, 0xfd, 0x05, 0xd6, 0x07, 0xfd, 0x30, 0x71, +- 0x30, 0x02, 0x2a, 0x9a, 0xfc, 0xf1, 0x11, 0xae, 0x9d, 0x18, 0x99, 0x05, +- 0xfd, 0x86, 0x08, 0xf7, 0x09, 0x27, 0x58, 0xbf, 0x33, 0xfc, 0xbe, 0x73, +- 0xc8, 0x4f, 0x65, 0xd2, 0x7e, 0xea, 0x5b, 0x25, 0x8e, 0x4d, 0xc3, 0xae, +- 0x01, 0xf7, 0xfd, 0x06, 0x3e, 0xa6, 0xce, 0x9b, 0xdc, 0x2f, 0xe3, 0xbe, +- 0x9a, 0x63, 0x8e, 0xc0, 0x9e, 0x81, 0x1c, 0xc6, 0x8b, 0x78, 0x17, 0x39, +- 0xff, 0xe2, 0x3a, 0xef, 0xf8, 0x49, 0xfd, 0x1e, 0x2c, 0xbe, 0x4e, 0xd7, +- 0x85, 0x83, 0xf4, 0x2e, 0x79, 0x61, 0x92, 0xfb, 0xea, 0xa2, 0x9f, 0xea, +- 0xd1, 0xaf, 0xdb, 0x39, 0x1e, 0xe7, 0xfb, 0x07, 0xfe, 0xbe, 0x81, 0xae, +- 0xbf, 0xe7, 0xd0, 0xff, 0x9c, 0xcc, 0xa5, 0x81, 0x97, 0x64, 0x89, 0x17, +- 0xe7, 0x25, 0x89, 0x4a, 0x8e, 0xdb, 0xda, 0x27, 0x41, 0xcf, 0x3e, 0x89, +- 0x77, 0xf2, 0xc0, 0x2b, 0xec, 0x97, 0x1d, 0x14, 0xa7, 0xed, 0xe8, 0xbf, +- 0x78, 0xeb, 0x50, 0x85, 0x9b, 0x4f, 0x5c, 0x3c, 0xcf, 0x91, 0x5e, 0xb5, +- 0x93, 0x39, 0xe2, 0xab, 0x11, 0x8f, 0xd0, 0xbd, 0x57, 0xed, 0x2c, 0x40, +- 0xcf, 0xc4, 0x04, 0xdb, 0x37, 0xf4, 0x05, 0xd0, 0x57, 0x38, 0xce, 0x3a, +- 0x7e, 0x57, 0xdd, 0x3e, 0x1e, 0xf4, 0xd5, 0xf7, 0xf1, 0xf2, 0xf7, 0x3b, +- 0xc6, 0xd5, 0xad, 0x48, 0x60, 0x7d, 0xc7, 0x8b, 0xf7, 0xa7, 0xfc, 0x78, +- 0x50, 0x78, 0xd1, 0xb8, 0xf4, 0xe2, 0xa8, 0xf0, 0x9c, 0xe5, 0x71, 0xe1, +- 0x34, 0x55, 0x91, 0xbf, 0x70, 0x9f, 0x98, 0x89, 0x89, 0xcc, 0xea, 0x7e, +- 0x7a, 0x13, 0x7e, 0x4a, 0xb0, 0xde, 0x76, 0xff, 0x08, 0xee, 0xa1, 0x31, +- 0x8e, 0xd3, 0x5c, 0x23, 0xd7, 0x11, 0xac, 0xdf, 0xc7, 0xfc, 0xce, 0x40, +- 0x3c, 0x23, 0xf6, 0xe1, 0x69, 0x8e, 0x1f, 0xe3, 0xea, 0x08, 0xdb, 0xfd, +- 0x11, 0xec, 0xb6, 0xb5, 0xdd, 0xfd, 0xae, 0xdd, 0xba, 0x4e, 0xf1, 0xca, +- 0x29, 0x97, 0xb8, 0xa0, 0x7a, 0xc7, 0xbe, 0x4a, 0x79, 0x24, 0xcc, 0x76, +- 0x4a, 0xbe, 0x56, 0xfd, 0xff, 0x8e, 0xf0, 0x57, 0xef, 0x76, 0xef, 0xba, +- 0x52, 0x5e, 0x17, 0x95, 0xeb, 0x30, 0x8f, 0xf3, 0x67, 0xaf, 0xe0, 0x4f, +- 0xe5, 0x37, 0x2d, 0xb7, 0xf0, 0x7c, 0x79, 0xfd, 0x47, 0x95, 0x1d, 0xfd, +- 0x90, 0x57, 0x64, 0x9c, 0xe8, 0x1e, 0xb2, 0xdd, 0xbc, 0x72, 0x87, 0xea, +- 0xc0, 0xe8, 0x85, 0x41, 0xe4, 0x81, 0x0b, 0x83, 0xef, 0x72, 0x1d, 0xce, +- 0x7e, 0xe9, 0xa2, 0xff, 0xaf, 0x92, 0xb1, 0xab, 0xf7, 0xe7, 0x15, 0xbf, +- 0x1e, 0xb5, 0x1e, 0x3d, 0xf4, 0xbe, 0xff, 0x01, 0xfe, 0xf0, 0x11, 0xdc, +- 0xa0, 0x1d, 0x00, 0x00, 0x00 }; ++ /* Date: 02/03/2009 14:20 */ ++ 0xad, 0x57, 0x4d, 0x68, 0x5c, 0x55, 0x14, 0x3e, 0xf3, 0xe6, 0xef, 0xcd, ++ 0xcc, 0x9b, 0xcc, 0x34, 0x8d, 0x93, 0x31, 0x29, 0x26, 0x4d, 0x68, 0xea, ++ 0xc8, 0x44, 0xf3, 0x47, 0x05, 0x5d, 0x18, 0x46, 0x48, 0x7f, 0x2c, 0x34, ++ 0x8d, 0x2e, 0x8a, 0x9b, 0x36, 0x53, 0x3b, 0x3a, 0x6d, 0xed, 0xc2, 0xec, ++ 0xdc, 0xf8, 0xb0, 0x35, 0x41, 0x98, 0x45, 0x53, 0x4c, 0x13, 0x44, 0xa8, ++ 0xe8, 0xce, 0xdd, 0x88, 0x9a, 0xd6, 0x8d, 0x50, 0x68, 0x28, 0x76, 0x51, ++ 0x04, 0x05, 0xed, 0x42, 0x10, 0xad, 0xa1, 0x15, 0x41, 0x51, 0xb3, 0x92, ++ 0x8c, 0xf7, 0x9e, 0xef, 0xdc, 0x37, 0xef, 0x4d, 0xa6, 0xa4, 0x0b, 0x67, ++ 0xf3, 0xe5, 0xdc, 0x77, 0xee, 0xb9, 0xe7, 0xe7, 0x3b, 0xe7, 0xde, 0x64, ++ 0x89, 0x28, 0x42, 0x6e, 0xbd, 0x4f, 0x21, 0x85, 0xc2, 0x21, 0x5b, 0x41, ++ 0x83, 0x28, 0x9a, 0xd7, 0x32, 0x59, 0x24, 0xbf, 0x27, 0xb2, 0x0c, 0xdf, ++ 0xd6, 0x1d, 0xad, 0x46, 0x6e, 0x41, 0xeb, 0xd9, 0xf4, 0x92, 0x05, 0xbd, ++ 0x08, 0x69, 0x54, 0x3a, 0xae, 0xc6, 0x1d, 0x82, 0xcf, 0x08, 0x46, 0x42, ++ 0xc0, 0xb0, 0xa0, 0xd5, 0x82, 0x24, 0x7a, 0x5d, 0x22, 0x6f, 0x8a, 0xec, ++ 0x08, 0xe6, 0x65, 0xfd, 0xb4, 0xe0, 0xab, 0xb2, 0x7e, 0x47, 0x70, 0x5d, ++ 0xa1, 0xf1, 0x53, 0xcb, 0xbf, 0x35, 0x9a, 0xb2, 0x03, 0xf3, 0x05, 0xf8, ++ 0xff, 0x62, 0x3f, 0xeb, 0x37, 0x82, 0xfa, 0x77, 0x1b, 0xc6, 0x0f, 0x13, ++ 0xaf, 0x15, 0xd5, 0xfa, 0xbb, 0x27, 0x2e, 0x2f, 0x62, 0xdf, 0xf1, 0x7e, ++ 0xac, 0x3f, 0x56, 0xd4, 0x71, 0xc7, 0xc8, 0x15, 0xa4, 0x61, 0x9b, 0xe3, ++ 0x70, 0x87, 0x4d, 0xa2, 0xa0, 0xff, 0xe3, 0x22, 0xa4, 0xd9, 0x34, 0xec, ++ 0x26, 0x03, 0x76, 0x73, 0x5b, 0xec, 0x7e, 0x9f, 0xf0, 0xdb, 0xff, 0x54, ++ 0xec, 0x27, 0xb7, 0xb5, 0x5f, 0x4e, 0x03, 0x77, 0x16, 0xdb, 0x9d, 0x93, ++ 0xd8, 0xc6, 0xff, 0xd3, 0xdb, 0xda, 0x7f, 0xd3, 0xf3, 0xdf, 0xac, 0x03, ++ 0xfb, 0xf0, 0xf9, 0x13, 0xf7, 0x29, 0x93, 0x47, 0x13, 0xaf, 0xf8, 0x15, ++ 0x06, 0x4e, 0x16, 0x19, 0x6a, 0x27, 0x25, 0xb1, 0x53, 0x43, 0xfa, 0xbc, ++ 0x4e, 0x8a, 0x58, 0xda, 0xce, 0x5e, 0x3b, 0x76, 0x0d, 0xeb, 0xc7, 0x32, ++ 0xc0, 0x57, 0x24, 0x80, 0xbb, 0x49, 0x9d, 0x90, 0x46, 0xa3, 0x92, 0x12, ++ 0xfb, 0x28, 0x23, 0xb9, 0x29, 0xec, 0x5f, 0x73, 0xb4, 0x5f, 0xb7, 0x54, ++ 0xdd, 0xb4, 0x1c, 0x26, 0x37, 0x13, 0xf4, 0xff, 0x0a, 0x41, 0x6f, 0xc7, ++ 0x5e, 0xac, 0x5e, 0xac, 0x40, 0xee, 0xfd, 0x38, 0xcb, 0xfa, 0x2b, 0x75, ++ 0x13, 0x87, 0x5e, 0x57, 0xfc, 0xcf, 0xc0, 0x0e, 0x0d, 0xd8, 0x7c, 0x18, ++ 0xf2, 0xa3, 0x0e, 0x1d, 0x36, 0xf6, 0xf0, 0xbb, 0xbc, 0xc7, 0xf0, 0x09, ++ 0x72, 0x25, 0xc6, 0x90, 0x9f, 0x9d, 0xd7, 0xfe, 0x66, 0xe8, 0x84, 0xa5, ++ 0x1d, 0xb1, 0x24, 0xbe, 0xb0, 0xed, 0x7c, 0x01, 0xfd, 0xaf, 0xfa, 0x1c, ++ 0xf6, 0xad, 0x32, 0x8e, 0x7d, 0x5d, 0x63, 0xc0, 0xa5, 0xb1, 0xa8, 0x86, ++ 0x62, 0x65, 0x8e, 0xc5, 0x27, 0x7f, 0x1e, 0xb5, 0x59, 0xcf, 0x1d, 0x36, ++ 0x7c, 0x35, 0x79, 0xd7, 0xf1, 0x5e, 0x6c, 0xf2, 0x76, 0x10, 0xf9, 0xf9, ++ 0x75, 0x8f, 0xd6, 0x57, 0x49, 0x1a, 0xc0, 0x39, 0x33, 0xd5, 0x76, 0x7c, ++ 0x7f, 0x57, 0xed, 0x7b, 0xb8, 0xfa, 0x4d, 0x72, 0xdc, 0x93, 0x12, 0x7f, ++ 0xbf, 0xf0, 0x63, 0x57, 0x1b, 0x7e, 0x64, 0xf8, 0xef, 0xfb, 0xa5, 0x2c, ++ 0xe7, 0xef, 0x08, 0xd6, 0x2f, 0x4d, 0xad, 0x22, 0xcf, 0x07, 0x39, 0x7e, ++ 0x4a, 0x5e, 0xf8, 0x1c, 0xbb, 0x66, 0xd3, 0x5a, 0x7e, 0x79, 0xa2, 0xf2, ++ 0x25, 0xe4, 0x72, 0x58, 0xcb, 0xc7, 0x9c, 0x93, 0x57, 0xa1, 0x1f, 0x3d, ++ 0x9f, 0xe5, 0xbc, 0x1d, 0x91, 0x53, 0x0e, 0xaa, 0x51, 0xa1, 0x7e, 0xb5, ++ 0xd8, 0x79, 0x16, 0x9d, 0x35, 0xfe, 0x9e, 0xa5, 0x85, 0x3a, 0xbe, 0x9f, ++ 0x4b, 0xe9, 0xb8, 0xce, 0xa8, 0xb8, 0x58, 0xaf, 0xab, 0x1a, 0xc3, 0xfe, ++ 0xda, 0xa2, 0xb6, 0x17, 0xa2, 0x7b, 0x9f, 0x69, 0xf9, 0x70, 0xf1, 0x1e, ++ 0xf4, 0x8b, 0xd5, 0x79, 0x31, 0x6c, 0x21, 0x6f, 0xf7, 0x2d, 0xe8, 0x0b, ++ 0xad, 0x92, 0x11, 0xae, 0x5b, 0x88, 0x9c, 0x29, 0xe0, 0x3b, 0xfc, 0xfd, ++ 0xdf, 0x50, 0x8d, 0xf3, 0xf5, 0x7c, 0x47, 0x64, 0xd5, 0xe4, 0x47, 0x30, ++ 0x63, 0xe2, 0x02, 0x3e, 0x2c, 0x6f, 0xe7, 0x1d, 0xc3, 0x57, 0xa9, 0x57, ++ 0xe1, 0x41, 0x7c, 0x05, 0x4e, 0x0d, 0x01, 0x63, 0x83, 0x5a, 0x2f, 0xda, ++ 0x86, 0xb7, 0xc1, 0xba, 0x48, 0x5d, 0x7d, 0xfc, 0x62, 0x50, 0xbc, 0x0a, ++ 0xf0, 0x4c, 0xf1, 0x98, 0xe7, 0x90, 0xca, 0xa7, 0xe1, 0x8b, 0x36, 0x14, ++ 0xa7, 0x33, 0x62, 0xaf, 0x2a, 0x71, 0x9d, 0x95, 0xb8, 0x7e, 0x4f, 0x9a, ++ 0xbc, 0x9b, 0x78, 0x80, 0x0b, 0x5e, 0x3c, 0x86, 0x6f, 0xb8, 0x1f, 0x66, ++ 0xaa, 0x01, 0x7f, 0x6a, 0x37, 0x06, 0xf0, 0x47, 0xef, 0x20, 0xd0, 0x8b, ++ 0x73, 0x88, 0xfb, 0xa4, 0xa3, 0xfb, 0xaa, 0xf1, 0x43, 0xd7, 0x75, 0x43, ++ 0xf8, 0x6a, 0xa9, 0x78, 0xfd, 0xfd, 0xd9, 0xd3, 0xa6, 0x3f, 0x83, 0xfd, ++ 0x62, 0xe2, 0x3f, 0x97, 0xe6, 0x01, 0x34, 0x71, 0x7b, 0x3d, 0xd8, 0x0f, ++ 0xe0, 0x7f, 0xdc, 0xe3, 0x51, 0xd7, 0x3e, 0xc9, 0x93, 0x60, 0xee, 0x69, ++ 0x6d, 0x6f, 0x5a, 0xec, 0x8f, 0x88, 0x7d, 0xc7, 0xd7, 0x8f, 0xda, 0xbf, ++ 0x3e, 0xaf, 0x0f, 0x4d, 0x7d, 0x9a, 0xfd, 0x68, 0xf2, 0xc4, 0xe7, 0x17, ++ 0x6f, 0xaf, 0xeb, 0xfd, 0xbd, 0xdb, 0xf4, 0xe7, 0x23, 0x9e, 0xbd, 0xef, ++ 0xbc, 0x7e, 0xd4, 0xdf, 0x53, 0xf4, 0x9c, 0x88, 0xc1, 0x39, 0xf3, 0x87, ++ 0x9a, 0x33, 0x1c, 0x87, 0xed, 0xac, 0xca, 0x5c, 0x99, 0xd3, 0xe7, 0xe4, ++ 0xc5, 0xef, 0xbc, 0x99, 0xeb, 0xca, 0x6f, 0x99, 0x3f, 0xc7, 0xfd, 0x73, ++ 0x24, 0xde, 0xe6, 0x3c, 0xc0, 0x64, 0xb1, 0x35, 0x5f, 0xc8, 0x3b, 0xec, ++ 0xaa, 0xfc, 0x9b, 0x39, 0x30, 0x6e, 0xec, 0x43, 0x74, 0x47, 0xfd, 0xfa, ++ 0xad, 0xf5, 0x89, 0x3c, 0x60, 0x9e, 0x6d, 0x6c, 0xe2, 0xde, 0xfd, 0x67, ++ 0xb3, 0x79, 0x1f, 0x07, 0xea, 0xe8, 0x12, 0xd7, 0x3d, 0xae, 0xea, 0xcf, ++ 0xef, 0x03, 0xef, 0x9e, 0xb7, 0xa2, 0x7a, 0x5d, 0xe5, 0x42, 0x78, 0xf5, ++ 0xfa, 0xe3, 0xb2, 0xbf, 0x80, 0xb9, 0xf4, 0xda, 0x29, 0xce, 0xff, 0x7b, ++ 0x67, 0x37, 0x78, 0x3e, 0x7d, 0xf8, 0xc6, 0x35, 0x1d, 0xd7, 0xa3, 0xb4, ++ 0x3e, 0xe7, 0xb0, 0x3f, 0xa5, 0xdd, 0x50, 0xdf, 0x78, 0xb6, 0xb5, 0x1e, ++ 0x78, 0xd7, 0xa0, 0x5e, 0x4a, 0x6f, 0x36, 0x78, 0xaf, 0x36, 0xfd, 0x43, ++ 0xbf, 0xec, 0xcf, 0x40, 0xdf, 0xf4, 0x73, 0xb0, 0xae, 0x77, 0x36, 0x9b, ++ 0x73, 0xd7, 0xe4, 0x3b, 0xc8, 0xd3, 0xa3, 0xe3, 0x7e, 0xbb, 0x83, 0xb4, ++ 0x56, 0x87, 0xdd, 0x69, 0xe9, 0xc3, 0x13, 0x72, 0xf0, 0x4f, 0xc9, 0x0c, ++ 0x9f, 0x53, 0x7e, 0x81, 0x79, 0x46, 0xb9, 0x14, 0xe2, 0x2c, 0x1f, 0xc6, ++ 0xf7, 0x72, 0x1a, 0xeb, 0x3d, 0x69, 0xdc, 0x6f, 0xd3, 0x71, 0x87, 0xf5, ++ 0x7b, 0xd2, 0xc0, 0x9c, 0xf4, 0xeb, 0x9a, 0x37, 0x8f, 0x80, 0x2b, 0x31, ++ 0x7f, 0xff, 0x46, 0xe8, 0x7a, 0x4c, 0x2b, 0xa8, 0xcb, 0xba, 0x80, 0xfe, ++ 0x2b, 0x0d, 0x39, 0xfc, 0x7d, 0xa6, 0x80, 0xb9, 0x4a, 0x03, 0xc1, 0xfb, ++ 0x50, 0xfa, 0xb9, 0xa7, 0x39, 0xb7, 0xfc, 0x73, 0x2d, 0x31, 0xb6, 0x5c, ++ 0x0f, 0xde, 0x97, 0x2b, 0x31, 0xff, 0x9c, 0xd0, 0x76, 0x59, 0x54, 0xf3, ++ 0xc1, 0x3f, 0xd7, 0xc2, 0x52, 0xef, 0xbf, 0x64, 0x0e, 0xec, 0xa4, 0x9b, ++ 0x75, 0xc4, 0xb5, 0x56, 0x6f, 0xcd, 0xb3, 0x39, 0xcf, 0xd8, 0x83, 0xdf, ++ 0x26, 0x8e, 0xa6, 0x7d, 0x9c, 0x7f, 0x4a, 0xfc, 0xfc, 0x85, 0xdf, 0x21, ++ 0x39, 0x89, 0x47, 0xdb, 0xc5, 0xfa, 0x01, 0x99, 0xb3, 0xae, 0x27, 0x07, ++ 0xe7, 0xe3, 0x34, 0xfb, 0xd5, 0x49, 0x78, 0x77, 0xe4, 0xbc, 0xbe, 0x36, ++ 0xf1, 0x75, 0x8d, 0x00, 0x97, 0x46, 0x4c, 0x1d, 0x4c, 0xbd, 0x4c, 0x7d, ++ 0x50, 0xc7, 0xdc, 0x28, 0xab, 0x4d, 0x94, 0x47, 0x99, 0xa7, 0x23, 0xe5, ++ 0x3f, 0x83, 0xef, 0xb4, 0xa3, 0x45, 0xad, 0xff, 0x16, 0x7d, 0xc3, 0x7d, ++ 0x44, 0xf4, 0x83, 0x60, 0x73, 0x1e, 0x49, 0x01, 0x02, 0xef, 0xb2, 0x30, ++ 0x5d, 0x8f, 0xca, 0xf2, 0xb8, 0xe9, 0x9b, 0x60, 0xdf, 0x5d, 0xe1, 0x77, ++ 0xfa, 0xc2, 0xe6, 0xd6, 0xfe, 0x37, 0xf1, 0x69, 0xbd, 0x61, 0xe1, 0xa1, ++ 0x4d, 0xa5, 0xfd, 0x78, 0xd7, 0x74, 0xc4, 0xc1, 0xf3, 0x8e, 0xb8, 0xbf, ++ 0x4e, 0x8a, 0x0f, 0x89, 0xb8, 0x16, 0x77, 0x75, 0x26, 0x38, 0x8e, 0x4b, ++ 0x5f, 0xdf, 0xe2, 0xcf, 0x1f, 0x2d, 0xa7, 0xb0, 0xde, 0x5d, 0x82, 0xf9, ++ 0x08, 0xf3, 0x35, 0x4c, 0x17, 0xc0, 0xe7, 0x0f, 0x96, 0x80, 0xef, 0xd3, ++ 0x21, 0xd8, 0xe9, 0x7c, 0x9b, 0xef, 0x71, 0xbb, 0x1b, 0xe9, 0xac, 0x2d, ++ 0x0b, 0x4f, 0xf3, 0x16, 0xff, 0x3f, 0xd2, 0xa0, 0xb4, 0xbc, 0x5b, 0xa5, ++ 0xcf, 0xc0, 0xcf, 0x88, 0xaf, 0xce, 0xdb, 0xf1, 0x55, 0xa3, 0xa3, 0xf8, ++ 0x88, 0xed, 0xc2, 0x5b, 0xbb, 0x95, 0xb7, 0xa6, 0x8e, 0x79, 0xab, 0x2d, ++ 0x4f, 0xf7, 0x05, 0x79, 0x1a, 0x13, 0x9e, 0xfe, 0xed, 0xcd, 0xd3, 0xad, ++ 0x76, 0x31, 0xc7, 0x6f, 0xfe, 0x6f, 0xbc, 0x05, 0x1e, 0x18, 0xd4, 0xe7, ++ 0x77, 0xfb, 0xf8, 0x67, 0xfc, 0xf2, 0xcf, 0x9f, 0x43, 0x6a, 0xae, 0xfe, ++ 0x07, 0x92, 0xe2, 0x88, 0x7c, 0xe0, 0x0d, 0x00, 0x00, 0x00 }; + + static u8 bnx2_TPAT_b06FwText[] = { +- 0xbd, 0x59, 0x6f, 0x70, 0x5c, 0xd5, 0x7d, 0x3d, 0x6f, 0xf7, 0xed, 0xee, +- 0x93, 0xb4, 0x92, 0x9e, 0x90, 0x0c, 0xab, 0x56, 0x8d, 0xf6, 0x59, 0x6f, +- 0xa5, 0xc5, 0xab, 0xd8, 0x6f, 0x2d, 0xb9, 0xac, 0x87, 0x37, 0xcd, 0xb3, +- 0x2c, 0x29, 0x8b, 0xec, 0xd8, 0xeb, 0x42, 0x66, 0xe4, 0x09, 0x1d, 0x0b, +- 0x59, 0xd8, 0xc2, 0x18, 0xa2, 0x12, 0x3e, 0xa8, 0x13, 0x4f, 0xbd, 0xe8, +- 0x9f, 0x85, 0xbd, 0xd2, 0x23, 0x02, 0x2c, 0x3b, 0x93, 0x0e, 0x1e, 0xf9, +- 0x8f, 0x18, 0x58, 0x6b, 0xa1, 0xfd, 0x92, 0x69, 0xc3, 0x44, 0x13, 0x1b, +- 0xec, 0x90, 0x38, 0x4e, 0xa7, 0x5f, 0xcc, 0xb4, 0x9d, 0xaa, 0x80, 0x29, +- 0x50, 0x70, 0xdc, 0xce, 0xa4, 0x63, 0x0a, 0xf5, 0xed, 0xb9, 0x6f, 0x57, +- 0x46, 0x38, 0x4e, 0x3f, 0xd6, 0x33, 0x8b, 0x76, 0xef, 0x7b, 0xf7, 0xde, +- 0xdf, 0xbd, 0xbf, 0x73, 0xce, 0xef, 0xdc, 0xcb, 0x6a, 0x1f, 0xca, 0x51, +- 0xfa, 0x57, 0xc9, 0x4f, 0xfb, 0x23, 0x43, 0x4f, 0x6f, 0x58, 0x6b, 0xad, +- 0x95, 0xbf, 0x95, 0x00, 0x54, 0xfc, 0x3f, 0xfe, 0xf3, 0x03, 0xfa, 0x72, +- 0x1c, 0xf2, 0x03, 0xcd, 0x67, 0x2f, 0xae, 0xee, 0x30, 0xa1, 0xf9, 0xed, +- 0x87, 0x5a, 0x76, 0x9b, 0x80, 0x93, 0x4f, 0x44, 0x37, 0xe3, 0x7f, 0x44, +- 0xb6, 0x4e, 0x85, 0x6c, 0xff, 0x23, 0xfb, 0x8b, 0x75, 0x6f, 0xdc, 0x67, +- 0x5c, 0x3f, 0xe1, 0x87, 0xa6, 0xdb, 0x93, 0x9a, 0xde, 0x0c, 0xad, 0x81, +- 0x7d, 0x7e, 0xd4, 0xb2, 0x2b, 0x88, 0xaa, 0xe5, 0xb1, 0x80, 0x93, 0x39, +- 0xc3, 0xda, 0x83, 0x84, 0x7e, 0x8e, 0x0b, 0x72, 0x38, 0xc7, 0x99, 0x3c, +- 0x70, 0x28, 0xa7, 0xe0, 0x2a, 0xc7, 0x1c, 0xcf, 0x6b, 0x58, 0xf2, 0x7b, +- 0xd3, 0xf5, 0x95, 0xd9, 0xc8, 0x98, 0x53, 0x07, 0x45, 0xc8, 0x44, 0xf6, +- 0x0f, 0x6c, 0x33, 0x7e, 0x08, 0xe1, 0xd4, 0x5c, 0x3b, 0x32, 0xab, 0xcf, +- 0x6a, 0xd8, 0xe9, 0x36, 0xf4, 0x69, 0x36, 0xf8, 0x8e, 0x82, 0xd4, 0x7d, +- 0x1a, 0x7a, 0x0b, 0x71, 0x64, 0x0b, 0x59, 0x38, 0x85, 0x31, 0x7e, 0x34, +- 0x84, 0xa6, 0x34, 0x6d, 0xdd, 0xd4, 0xdd, 0xf2, 0x1d, 0x84, 0xa7, 0xae, +- 0x8b, 0x6b, 0x49, 0x1d, 0x6f, 0x6f, 0x14, 0xa2, 0xd2, 0x46, 0xb6, 0xa2, +- 0x3d, 0x0b, 0xbf, 0x6d, 0x58, 0x5b, 0xfc, 0x0a, 0x3a, 0xbf, 0x6e, 0xc6, +- 0xa7, 0x94, 0x07, 0x1f, 0xf4, 0xd9, 0xd0, 0x14, 0x3b, 0xaa, 0x35, 0xe5, +- 0x1b, 0x30, 0x51, 0xd0, 0x71, 0xa8, 0x50, 0x87, 0xb1, 0x02, 0x0e, 0xf8, +- 0x37, 0x04, 0x31, 0xa7, 0xc3, 0xf9, 0x4e, 0xcb, 0x01, 0xec, 0xcb, 0x0d, +- 0x63, 0x77, 0x2e, 0x85, 0xc3, 0x05, 0x19, 0x63, 0x14, 0xa3, 0x05, 0x15, +- 0xc1, 0x29, 0x23, 0xf2, 0x73, 0xdc, 0xe9, 0x99, 0x10, 0x63, 0x56, 0x08, +- 0x23, 0x56, 0x1c, 0xe3, 0xae, 0x8f, 0xeb, 0x0c, 0x61, 0xd4, 0xbc, 0x21, +- 0x06, 0x2c, 0xc3, 0x1a, 0x87, 0x68, 0x3c, 0x6f, 0x19, 0x91, 0x4e, 0x3f, +- 0x9c, 0xef, 0x9b, 0x11, 0x8c, 0x33, 0xf6, 0x31, 0xaf, 0xdf, 0x18, 0x3a, +- 0x6f, 0xf5, 0x73, 0xd8, 0x4f, 0xc7, 0xc4, 0x57, 0xfb, 0x46, 0xc7, 0x91, +- 0x88, 0x4c, 0xc0, 0x87, 0xbe, 0xba, 0x56, 0xf6, 0x6b, 0x8a, 0x4e, 0xc0, +- 0x88, 0x73, 0x9c, 0x6c, 0xb0, 0xdd, 0xe1, 0x18, 0x59, 0xf6, 0x37, 0xa2, +- 0x67, 0x20, 0xc7, 0x6a, 0xe0, 0xef, 0x76, 0xf6, 0x57, 0xe0, 0xb3, 0x63, +- 0xd1, 0x11, 0xf6, 0x39, 0x67, 0xa9, 0x78, 0x93, 0x9f, 0x3e, 0xdd, 0x90, +- 0x99, 0x55, 0x42, 0x6c, 0x3f, 0x04, 0x3e, 0x37, 0x2b, 0x70, 0x22, 0x63, +- 0x61, 0x84, 0xeb, 0xd6, 0xd8, 0x36, 0xc9, 0xb6, 0x80, 0x69, 0x71, 0x7c, +- 0xe8, 0x9d, 0x85, 0x95, 0x98, 0x58, 0xce, 0xcd, 0xef, 0x6b, 0xe7, 0x18, +- 0x6e, 0x31, 0xa7, 0xf2, 0x9d, 0xcd, 0xee, 0x4d, 0xf1, 0x88, 0xba, 0xf2, +- 0xf9, 0xb0, 0xd2, 0xc1, 0x36, 0x47, 0x6d, 0xc0, 0x21, 0x17, 0x5a, 0xd0, +- 0xd4, 0x38, 0x8f, 0x86, 0xf7, 0x72, 0xc3, 0x4a, 0x77, 0xc1, 0x51, 0xba, +- 0xe6, 0x3b, 0x14, 0x67, 0x5e, 0x55, 0x3a, 0x67, 0x65, 0xdc, 0x42, 0x3c, +- 0x6b, 0x29, 0x8c, 0xf9, 0x07, 0x32, 0x5e, 0x27, 0xaa, 0xdc, 0x14, 0x6b, +- 0x62, 0x3e, 0x54, 0x98, 0xdd, 0xca, 0x96, 0x79, 0x21, 0xd2, 0xc9, 0xb4, +- 0xd2, 0x33, 0x0f, 0x2d, 0x6c, 0xdb, 0x5a, 0x6e, 0xea, 0x30, 0xb2, 0xab, +- 0x4c, 0x1c, 0x77, 0xa3, 0xb8, 0x64, 0xf9, 0x70, 0x62, 0x55, 0x19, 0x54, +- 0x53, 0xe1, 0x07, 0xe1, 0xcb, 0x16, 0xd4, 0x2a, 0x7e, 0xbf, 0xb6, 0x43, +- 0xc5, 0x58, 0x7b, 0x8f, 0xd2, 0xc9, 0x3e, 0x01, 0xe6, 0xf9, 0x74, 0x2e, +- 0x8d, 0x30, 0xb1, 0x53, 0x61, 0xc7, 0x22, 0x79, 0xee, 0xcd, 0xdb, 0x56, +- 0x2c, 0xfe, 0xb8, 0xc4, 0x63, 0x8d, 0x11, 0x91, 0x7b, 0x53, 0x69, 0xc7, +- 0xe2, 0x67, 0xb9, 0x0f, 0x7e, 0x53, 0xc5, 0xaf, 0xac, 0x00, 0x16, 0x77, +- 0x58, 0xcc, 0xa9, 0x8e, 0x20, 0xdb, 0xcf, 0x78, 0xed, 0xf2, 0x37, 0xf4, +- 0xae, 0xaf, 0xec, 0x43, 0x71, 0x0f, 0x46, 0xdd, 0x26, 0xc6, 0x5c, 0xdc, +- 0x83, 0xed, 0x5c, 0xef, 0xbf, 0x06, 0xe4, 0xd7, 0xaf, 0xdd, 0x6a, 0xdb, +- 0xc9, 0x38, 0x7d, 0xb6, 0xb9, 0xb8, 0xda, 0x5f, 0x0f, 0xd4, 0xb6, 0xe3, +- 0x30, 0x73, 0xdc, 0x99, 0xbc, 0x1b, 0x59, 0xef, 0x79, 0x9d, 0xbe, 0x65, +- 0xb6, 0x16, 0x7d, 0xab, 0xbc, 0x7d, 0xd3, 0xb7, 0xcd, 0x0a, 0xf1, 0x66, +- 0x32, 0x88, 0xb3, 0xe6, 0x48, 0xa4, 0x12, 0x59, 0xcb, 0xcf, 0x7c, 0x5f, +- 0xe0, 0xfc, 0xf9, 0xa4, 0x1f, 0x27, 0x93, 0x27, 0x90, 0xad, 0x01, 0xe6, +- 0x72, 0x92, 0x57, 0xc6, 0xe2, 0x05, 0xfe, 0xd7, 0x57, 0x90, 0xeb, 0xb3, +- 0xb8, 0x3e, 0x05, 0x67, 0x4c, 0x89, 0x69, 0x4b, 0x6b, 0x26, 0xbf, 0xf6, +- 0x71, 0x3f, 0xeb, 0xdb, 0xc3, 0xc4, 0x27, 0xf0, 0x6e, 0x6e, 0x00, 0x3b, +- 0x8b, 0xb1, 0xe0, 0x46, 0x8e, 0xc2, 0xd2, 0x96, 0xc6, 0x89, 0xe2, 0x6f, +- 0x72, 0x3c, 0xad, 0x75, 0xe4, 0x8c, 0x4c, 0x1a, 0x89, 0x8b, 0x1d, 0x8a, +- 0xec, 0x9f, 0xd6, 0xd6, 0xe4, 0x83, 0x88, 0xd6, 0x16, 0x9f, 0x57, 0xd8, +- 0x5b, 0xb5, 0xc7, 0xa7, 0x14, 0xec, 0x8d, 0xc9, 0x67, 0x5b, 0xb5, 0x96, +- 0x3c, 0xb4, 0x4a, 0x7b, 0x48, 0x3b, 0x3b, 0x65, 0xf4, 0xbd, 0xac, 0x24, +- 0xa2, 0x53, 0x5e, 0x9f, 0x21, 0xad, 0x35, 0x1f, 0xe2, 0x7a, 0xe2, 0xcc, +- 0x09, 0xb4, 0x2a, 0xfb, 0x69, 0xed, 0x57, 0x7c, 0x70, 0xd1, 0xeb, 0xf3, +- 0xb4, 0x16, 0xcf, 0xcb, 0x76, 0xc3, 0x8a, 0x2a, 0x21, 0xdc, 0x9b, 0xd4, +- 0xb0, 0xa6, 0x45, 0x34, 0x76, 0x25, 0x8d, 0xc5, 0x2e, 0x7f, 0x04, 0xc7, +- 0xc9, 0x05, 0xe2, 0xce, 0xf9, 0xc3, 0x96, 0x31, 0x74, 0x15, 0xfc, 0x88, +- 0xd6, 0x38, 0x38, 0xe2, 0x86, 0xf0, 0x33, 0xe2, 0xbf, 0xdb, 0xd2, 0x31, +- 0xe6, 0x1a, 0xf1, 0x5f, 0x20, 0x91, 0x3a, 0xc5, 0x9c, 0x2d, 0x91, 0x03, +- 0x47, 0x0a, 0x4d, 0xf1, 0x53, 0x30, 0x06, 0xbb, 0xc8, 0x01, 0xad, 0x5d, +- 0xc6, 0x00, 0x5d, 0xb5, 0xc9, 0x9d, 0x42, 0x03, 0x72, 0xe4, 0x43, 0x97, +- 0xc7, 0xab, 0x61, 0xa5, 0xb3, 0xf0, 0x4b, 0x6a, 0x6b, 0x37, 0xf1, 0x85, +- 0xea, 0x88, 0x19, 0x44, 0xaa, 0x36, 0x8a, 0xf3, 0xc4, 0x4a, 0xb6, 0xae, +- 0x8c, 0xb9, 0x94, 0xf9, 0x7c, 0x87, 0xcf, 0x7b, 0x94, 0xcd, 0xf3, 0x51, +- 0xfc, 0xcc, 0xfa, 0x42, 0x38, 0x75, 0x95, 0x6c, 0x0b, 0xac, 0x68, 0xd7, +- 0x70, 0xf5, 0x85, 0x72, 0x7c, 0xfc, 0x42, 0x18, 0x9f, 0xbd, 0x40, 0x7e, +- 0xbb, 0x68, 0x2f, 0x87, 0x10, 0xa9, 0x36, 0x21, 0x0a, 0x56, 0x2b, 0xde, +- 0xab, 0x89, 0x45, 0xaf, 0x40, 0x6a, 0xa3, 0xa3, 0xed, 0xce, 0x19, 0x43, +- 0x83, 0x48, 0x38, 0xe7, 0xbc, 0xbd, 0x70, 0xb4, 0xb5, 0xf9, 0xf3, 0x02, +- 0x3b, 0x8a, 0x7b, 0x11, 0xb4, 0x3b, 0xb5, 0xb7, 0x98, 0x9b, 0xcb, 0x5e, +- 0x6e, 0x3a, 0xb5, 0x75, 0xf9, 0xfb, 0xfd, 0x28, 0x2f, 0x3e, 0x53, 0xed, +- 0x8c, 0x36, 0x96, 0x33, 0x7a, 0x27, 0xb9, 0xbe, 0x01, 0xaf, 0x6f, 0x46, +- 0x4b, 0x70, 0xef, 0x97, 0x4a, 0xb9, 0xa9, 0xb4, 0x1f, 0xe2, 0x3e, 0x33, +- 0xf7, 0xde, 0x3e, 0x3e, 0xc4, 0x3d, 0x96, 0xf3, 0x0d, 0xdf, 0x36, 0xdf, +- 0x30, 0xe7, 0x7b, 0x79, 0xc5, 0x7c, 0x07, 0x56, 0xcc, 0x77, 0x60, 0xc5, +- 0x7c, 0x29, 0x72, 0xf5, 0x1f, 0xc4, 0x48, 0x5d, 0x71, 0x6c, 0xd5, 0x1e, +- 0xbc, 0x6d, 0xee, 0x41, 0xce, 0x7d, 0x54, 0x2c, 0x65, 0x8a, 0xe3, 0x54, +- 0xda, 0xfb, 0x57, 0xcc, 0xbd, 0x9f, 0x73, 0x2f, 0x8f, 0xa3, 0x53, 0x8b, +- 0x84, 0xd8, 0x66, 0x09, 0xa1, 0xda, 0xa6, 0xde, 0x89, 0xe6, 0x4c, 0x27, +- 0xb1, 0x53, 0x8e, 0xc4, 0xa2, 0x0f, 0xe6, 0x70, 0xbd, 0x3f, 0x80, 0xa5, +- 0x9a, 0x65, 0x6e, 0x54, 0x96, 0xfe, 0xbe, 0xa4, 0x80, 0x5a, 0xff, 0x6a, +- 0xae, 0x9a, 0x63, 0xc4, 0xf4, 0x01, 0x45, 0x88, 0x73, 0x1b, 0x13, 0x83, +- 0x7e, 0x24, 0xfa, 0xaa, 0x60, 0x12, 0x43, 0x81, 0x12, 0x17, 0x56, 0xf6, +- 0x79, 0xd9, 0xeb, 0x53, 0xf0, 0xfa, 0x08, 0xf1, 0xee, 0x86, 0x0f, 0xc5, +- 0x1b, 0x2d, 0x75, 0xf8, 0x29, 0x39, 0xf9, 0x5a, 0x61, 0x59, 0x57, 0xa4, +- 0x6e, 0xc0, 0x77, 0xce, 0x0a, 0x32, 0xa6, 0x91, 0x7d, 0xc1, 0xaf, 0xf4, +- 0x27, 0x60, 0x4c, 0xd9, 0xe6, 0xc7, 0x2b, 0x49, 0x3c, 0x52, 0x0e, 0xa3, +- 0xf7, 0xb0, 0x92, 0x4d, 0x57, 0xc0, 0x70, 0xd6, 0x28, 0xd9, 0x94, 0x06, +- 0xc9, 0x1b, 0xb5, 0xe9, 0xb4, 0x69, 0x64, 0xaf, 0xf2, 0x65, 0x75, 0xfa, +- 0x4e, 0x31, 0xa8, 0x1c, 0x23, 0x8c, 0x27, 0xdd, 0x0b, 0x58, 0x0c, 0x34, +- 0x50, 0x9f, 0xa5, 0x76, 0x72, 0xe0, 0x05, 0x8d, 0x35, 0x2d, 0x44, 0x22, +- 0xaa, 0x38, 0xe8, 0xfa, 0xce, 0x37, 0x42, 0x20, 0xd8, 0x16, 0xc0, 0x3b, +- 0xe6, 0xa8, 0x55, 0x8f, 0x4d, 0xb8, 0xdc, 0xca, 0x3d, 0x58, 0xa5, 0x22, +- 0x32, 0xb7, 0x72, 0xac, 0x08, 0xc7, 0xfa, 0xb3, 0x10, 0xaa, 0xea, 0xa0, +- 0x36, 0xab, 0xd8, 0xeb, 0x6a, 0x4a, 0x97, 0x2b, 0xb1, 0x6b, 0x46, 0x4e, +- 0xe1, 0x14, 0xb5, 0x82, 0x35, 0xec, 0x8c, 0xaa, 0x6c, 0x99, 0x0d, 0xa1, +- 0x7c, 0xe6, 0x13, 0xf1, 0x18, 0xb5, 0x2f, 0xbd, 0x41, 0x08, 0x33, 0x19, +- 0x82, 0xc6, 0x79, 0x86, 0xc9, 0xe7, 0xea, 0xb6, 0x5a, 0x5c, 0xfb, 0x3a, +- 0xb5, 0xe9, 0xdb, 0x21, 0xf8, 0x67, 0x42, 0x08, 0xce, 0x28, 0x78, 0xa7, +- 0x3d, 0x84, 0xfa, 0x39, 0xf9, 0x5b, 0x41, 0xa3, 0x79, 0x14, 0x07, 0x75, +- 0x3f, 0x63, 0xfc, 0x2b, 0xf4, 0xeb, 0x0d, 0x98, 0xa4, 0x36, 0x3f, 0xea, +- 0x6a, 0xa8, 0x3a, 0x4a, 0x2d, 0xb0, 0x85, 0x38, 0x49, 0xfc, 0x1f, 0x64, +- 0x8c, 0x32, 0xde, 0x0b, 0x56, 0x36, 0x1a, 0x42, 0x00, 0xc1, 0x39, 0x23, +- 0x3d, 0xc9, 0xe8, 0x52, 0x53, 0xaa, 0xb2, 0x7d, 0x96, 0xb5, 0xd7, 0x36, +- 0x7b, 0xeb, 0xfd, 0x42, 0x7c, 0x9a, 0x6c, 0xea, 0x5b, 0xa0, 0x06, 0x8f, +- 0xc4, 0x62, 0x99, 0x7e, 0x05, 0x58, 0x73, 0x96, 0x76, 0x64, 0xe6, 0xbf, +- 0x44, 0x98, 0xe3, 0x1c, 0xd9, 0x20, 0x30, 0x6e, 0x65, 0x23, 0x01, 0x18, +- 0x37, 0x86, 0x50, 0x87, 0x0f, 0x9e, 0x17, 0x42, 0xb4, 0x57, 0xe3, 0x1d, +- 0xcb, 0x18, 0x34, 0xfd, 0x02, 0x3f, 0x4e, 0x66, 0x87, 0x22, 0x30, 0x86, +- 0x7f, 0xad, 0x44, 0xf1, 0xf1, 0x94, 0x91, 0xbe, 0xa8, 0x04, 0x51, 0x39, +- 0x67, 0xea, 0x5b, 0x94, 0x30, 0xca, 0x17, 0xc2, 0x58, 0x7d, 0x36, 0x88, +- 0xc0, 0x4c, 0x18, 0xc1, 0x69, 0xf3, 0xe2, 0x2e, 0x78, 0xe3, 0x2c, 0x0e, +- 0xa1, 0x19, 0xd5, 0xb3, 0x66, 0xf4, 0x5f, 0x20, 0xb1, 0x1d, 0x86, 0xba, +- 0x10, 0x45, 0x7d, 0xc1, 0x44, 0x35, 0xf3, 0x7d, 0xf9, 0xac, 0xcc, 0xb3, +- 0x8e, 0xb0, 0xe9, 0xe3, 0xda, 0x1c, 0x65, 0xab, 0x57, 0x37, 0x3a, 0xf9, +- 0xe9, 0x56, 0x3a, 0xe6, 0xe5, 0x9e, 0x29, 0x28, 0xe3, 0xb3, 0x8b, 0xd6, +- 0x4d, 0xb1, 0x2f, 0x26, 0xeb, 0x44, 0x19, 0x02, 0x76, 0x8f, 0xf2, 0xc0, +- 0x3c, 0x8b, 0x90, 0xa7, 0xef, 0x65, 0x4a, 0xc0, 0x2e, 0x6a, 0xfb, 0x25, +- 0x6a, 0xfb, 0x89, 0x92, 0xb6, 0x57, 0x51, 0xdb, 0x17, 0xfe, 0x4f, 0x6d, +- 0x67, 0xbd, 0x9f, 0xf1, 0xe1, 0xbc, 0x19, 0xc2, 0x71, 0xab, 0x69, 0xb1, +- 0x1e, 0x21, 0x54, 0xb7, 0xe9, 0xa8, 0x5e, 0xb0, 0xf0, 0x1c, 0xf7, 0x16, +- 0x77, 0x15, 0xf5, 0xfd, 0x9b, 0x52, 0xf3, 0x4b, 0x5e, 0xed, 0x71, 0x77, +- 0x59, 0x13, 0xc2, 0xd4, 0x2a, 0x55, 0xe9, 0xa1, 0x9e, 0x3f, 0x90, 0xbc, +- 0x29, 0xe2, 0x31, 0x23, 0x4e, 0xce, 0xde, 0x38, 0x89, 0xa2, 0x46, 0xc4, +- 0xa8, 0x97, 0x4b, 0xb5, 0x71, 0x1c, 0x73, 0x65, 0x4d, 0xeb, 0x64, 0x4d, +- 0x53, 0x30, 0x12, 0x2b, 0x6a, 0xc4, 0xea, 0xbc, 0x6c, 0xd7, 0x51, 0x4f, +- 0x9d, 0x5c, 0xd7, 0x16, 0xc1, 0x31, 0x6a, 0xa4, 0x4b, 0x9f, 0xb3, 0x9d, +- 0xe3, 0x6d, 0x9b, 0x35, 0xb2, 0xdb, 0x99, 0x9f, 0xf3, 0xc4, 0xc5, 0x14, +- 0xab, 0xc3, 0x89, 0x1a, 0x6a, 0x67, 0x73, 0x08, 0x13, 0xd4, 0xcb, 0xf3, +- 0xf4, 0x10, 0x2f, 0xb1, 0xdf, 0xb8, 0x6b, 0x44, 0x5f, 0x22, 0xaf, 0xc7, +- 0x4b, 0x9a, 0xf9, 0x12, 0x7d, 0xc3, 0x38, 0xf3, 0xf4, 0x53, 0x3e, 0x7b, +- 0xcd, 0x35, 0x1c, 0xe9, 0x1f, 0xfc, 0x9e, 0x7f, 0x30, 0xe2, 0x7e, 0x45, +- 0x7a, 0x88, 0x08, 0xde, 0x68, 0x91, 0x58, 0x24, 0xc6, 0x6f, 0xe9, 0xa7, +- 0xaa, 0x7c, 0x6b, 0xf6, 0xba, 0xc8, 0xc7, 0xca, 0x55, 0xc9, 0xbf, 0xb1, +- 0xa4, 0xc4, 0x93, 0x10, 0x65, 0x76, 0x98, 0x5e, 0xcb, 0x8c, 0x7f, 0x84, +- 0x18, 0x71, 0x1b, 0xe1, 0xb3, 0x30, 0xfc, 0x67, 0xb7, 0xa8, 0x9e, 0x8f, +- 0x5d, 0x90, 0x7e, 0x8b, 0x79, 0x9a, 0x32, 0x7b, 0xa7, 0x94, 0x58, 0x66, +- 0x40, 0x91, 0xcf, 0x75, 0x94, 0x9f, 0x5d, 0x22, 0x77, 0x23, 0xe4, 0x6e, +- 0x1d, 0x5e, 0xbf, 0x8d, 0xbf, 0xd4, 0x55, 0xdf, 0x00, 0xf9, 0x9b, 0xad, +- 0x1b, 0xe9, 0xf7, 0x7f, 0x85, 0x7b, 0x87, 0x24, 0x7f, 0xd9, 0xe6, 0xc7, +- 0xb3, 0x49, 0xec, 0x2c, 0x83, 0x91, 0x79, 0x4c, 0xc9, 0x3a, 0xe4, 0x71, +- 0xaa, 0x4c, 0xc9, 0xd2, 0x31, 0x7d, 0xc9, 0xdf, 0x37, 0xf9, 0xb6, 0x9f, +- 0xfc, 0xed, 0xab, 0xbb, 0x9d, 0xbf, 0x47, 0x38, 0x86, 0x8a, 0x27, 0xdc, +- 0xe3, 0x98, 0x0b, 0x04, 0x11, 0x99, 0x09, 0x20, 0x34, 0xa3, 0xa2, 0x92, +- 0x5c, 0x09, 0xdb, 0xd9, 0x78, 0x08, 0x46, 0xfa, 0x35, 0x44, 0x90, 0x98, +- 0xd2, 0xf0, 0xe7, 0x2d, 0x01, 0x9c, 0x89, 0x19, 0x99, 0xfd, 0x4a, 0x84, +- 0x58, 0x1f, 0x61, 0x44, 0x46, 0x34, 0xea, 0x2b, 0xf2, 0x35, 0xd0, 0x1c, +- 0x84, 0x36, 0x23, 0xb9, 0x2e, 0x0e, 0xfa, 0xec, 0x6c, 0x54, 0x23, 0x46, +- 0x7f, 0x40, 0x6c, 0x5c, 0x99, 0x12, 0x62, 0x73, 0xbb, 0x79, 0xf1, 0x3d, +- 0xbf, 0x41, 0xdd, 0x53, 0x89, 0xd3, 0xe2, 0xf8, 0x15, 0x33, 0x1a, 0x82, +- 0x47, 0xbd, 0xf1, 0x6f, 0xbc, 0xce, 0x28, 0x3e, 0x75, 0x55, 0x65, 0x2b, +- 0x71, 0x40, 0x6e, 0x45, 0xe6, 0xa9, 0x7d, 0x87, 0x93, 0x46, 0x7a, 0x8b, +- 0xd2, 0xe4, 0x34, 0xf3, 0xbb, 0x2f, 0x19, 0x8b, 0xf6, 0xf3, 0x9d, 0xf7, +- 0x0b, 0x45, 0x0e, 0xd7, 0x9b, 0xbb, 0xf1, 0x17, 0xe4, 0x70, 0x95, 0xf9, +- 0x14, 0x9e, 0xf4, 0xf4, 0x88, 0x38, 0x98, 0x2e, 0x27, 0xb7, 0x1d, 0x65, +- 0x17, 0x71, 0xbf, 0x73, 0x9e, 0xba, 0x32, 0xd3, 0xee, 0x69, 0x51, 0xc8, +- 0xec, 0x54, 0x7a, 0xe7, 0xbb, 0x3d, 0x0f, 0xb5, 0x7d, 0xd6, 0x87, 0xd7, +- 0xad, 0x4d, 0xf4, 0x2b, 0x69, 0x65, 0xfb, 0xbc, 0xc4, 0x7c, 0x8f, 0xf2, +- 0x4d, 0xe2, 0x3f, 0x7a, 0x97, 0x8a, 0x39, 0x6b, 0x93, 0x12, 0xf4, 0xf0, +- 0x1f, 0x80, 0x93, 0x29, 0x62, 0xdf, 0x6f, 0xc7, 0xac, 0x73, 0x2b, 0xb0, +- 0xdf, 0x7d, 0x07, 0x5f, 0x23, 0xf5, 0x03, 0x45, 0x2d, 0xd7, 0x3b, 0x99, +- 0xaf, 0x67, 0x4a, 0x18, 0x7f, 0x92, 0xed, 0x81, 0x19, 0x68, 0xe5, 0xc4, +- 0x71, 0xcf, 0x54, 0x18, 0xd3, 0x1e, 0x56, 0x04, 0x5e, 0x65, 0x4d, 0xc8, +- 0x27, 0x0d, 0x6b, 0xbf, 0x62, 0xa4, 0xbb, 0x95, 0x44, 0x76, 0x4d, 0xa9, +- 0x1e, 0xde, 0xcb, 0x9a, 0x86, 0xbb, 0xa8, 0x0b, 0x16, 0xb4, 0x10, 0xf1, +- 0xfd, 0x6f, 0xac, 0x4f, 0xff, 0x51, 0xaa, 0x87, 0xc9, 0x7c, 0x39, 0xaa, +- 0x5b, 0xa8, 0xef, 0xc4, 0x73, 0x97, 0xc4, 0x33, 0x3d, 0xc4, 0x18, 0xeb, +- 0xff, 0x4e, 0xe2, 0x79, 0x75, 0x9b, 0x91, 0xed, 0xa4, 0x77, 0xf6, 0xad, +- 0x8f, 0x10, 0xab, 0x71, 0xfa, 0xd5, 0x31, 0x74, 0x70, 0xae, 0xf4, 0xac, +- 0x11, 0xe9, 0x20, 0x07, 0x54, 0xf6, 0x79, 0x89, 0x7d, 0x96, 0x6a, 0xa5, +- 0xaf, 0x0e, 0xe1, 0x59, 0xf6, 0x31, 0x93, 0x8e, 0xa7, 0x15, 0x92, 0x03, +- 0x13, 0x48, 0x64, 0x24, 0x07, 0x9c, 0x55, 0xad, 0xf4, 0xf8, 0x92, 0x03, +- 0xc4, 0xa0, 0x4b, 0x0c, 0x16, 0x79, 0x30, 0x28, 0x79, 0x50, 0x45, 0x0f, +- 0xb1, 0x40, 0x0f, 0x51, 0x61, 0x47, 0xc9, 0x01, 0xc9, 0x89, 0xa2, 0x8f, +- 0xe8, 0x2c, 0xf1, 0x60, 0x8b, 0x37, 0x9f, 0x4a, 0xed, 0x0b, 0xa3, 0x69, +- 0xda, 0xd0, 0x55, 0xe5, 0x3f, 0xc5, 0x2e, 0xd3, 0x5c, 0xdc, 0x4b, 0x2f, +- 0xf0, 0x59, 0x5b, 0x8c, 0x79, 0x0f, 0x63, 0xdd, 0x42, 0x79, 0x40, 0xe2, +- 0xbc, 0x7e, 0x3a, 0x8c, 0xea, 0x69, 0xc9, 0x83, 0xec, 0x24, 0xf5, 0x6f, +- 0xc8, 0xf2, 0xfd, 0x13, 0xf1, 0x1f, 0x25, 0x2e, 0x54, 0xa5, 0x8b, 0x63, +- 0x54, 0xcd, 0xe8, 0x68, 0x9d, 0x36, 0x06, 0x17, 0x70, 0x4d, 0xbc, 0x1a, +- 0x33, 0x33, 0x87, 0x98, 0xff, 0x3d, 0xc9, 0x18, 0xf7, 0x4a, 0xc7, 0xbd, +- 0xb7, 0xc6, 0xf0, 0x38, 0xe1, 0xf4, 0x5b, 0xe1, 0x92, 0xaf, 0xd6, 0xd0, +- 0xef, 0x02, 0x7b, 0x5c, 0x1a, 0x5b, 0xd3, 0xb7, 0x36, 0x88, 0xeb, 0x38, +- 0x49, 0xf4, 0x0f, 0xe8, 0x0e, 0xf3, 0x1f, 0xc2, 0xde, 0xd2, 0x3b, 0x45, +- 0xbf, 0xfd, 0xe3, 0xd2, 0x79, 0xf2, 0x17, 0xfe, 0xe2, 0xdf, 0xbf, 0x55, +- 0x97, 0xcf, 0x97, 0xfd, 0xc4, 0xe0, 0x66, 0x62, 0xb0, 0x9b, 0x39, 0xda, +- 0x6b, 0x91, 0xdf, 0xcc, 0x67, 0x56, 0x0d, 0x51, 0x0f, 0x9b, 0xfa, 0x2a, +- 0xa9, 0x6b, 0x87, 0xa9, 0x51, 0x3f, 0x37, 0xcb, 0xe9, 0xb7, 0x1d, 0xfa, +- 0xed, 0x0e, 0x6a, 0x68, 0x27, 0xf5, 0x53, 0x62, 0x2b, 0x4d, 0x1c, 0x69, +- 0x4a, 0x9a, 0x1e, 0x36, 0x90, 0xa4, 0xd7, 0xae, 0x5b, 0xf6, 0xda, 0x32, +- 0x4e, 0xe9, 0xaf, 0x8d, 0xb8, 0x2c, 0xb5, 0x4f, 0x32, 0x0f, 0x8b, 0x35, +- 0x9b, 0xa0, 0xda, 0x9b, 0x14, 0xd5, 0x96, 0xe7, 0x09, 0x15, 0xdf, 0xa5, +- 0xd6, 0x2e, 0xed, 0x90, 0xe7, 0x0a, 0xae, 0x8b, 0x6d, 0x11, 0x33, 0x16, +- 0x3d, 0x4e, 0x5c, 0x1d, 0xfb, 0x9d, 0x73, 0x46, 0x11, 0x6f, 0xa3, 0xae, +- 0x7a, 0xcb, 0x33, 0x4b, 0x7d, 0xd8, 0x74, 0x0b, 0x6f, 0x1a, 0x9e, 0x68, +- 0x89, 0x12, 0x8f, 0x12, 0x6b, 0x1a, 0xf2, 0x2f, 0x96, 0xe3, 0xd5, 0x17, +- 0xc3, 0x78, 0xe5, 0x45, 0x21, 0xc6, 0x93, 0xe0, 0x69, 0x46, 0x6a, 0xec, +- 0x46, 0xbc, 0xac, 0xc7, 0xa2, 0xcf, 0x7a, 0x9e, 0xd5, 0xa1, 0x67, 0x35, +- 0x06, 0x2f, 0xe0, 0x26, 0xf5, 0x4b, 0x72, 0x3a, 0x41, 0xbe, 0x15, 0xb1, +- 0xe8, 0x79, 0xdb, 0x1a, 0x0d, 0x57, 0x88, 0xbf, 0x6a, 0xe2, 0xef, 0x37, +- 0xd4, 0xdd, 0x6b, 0x25, 0xdd, 0x5d, 0x9b, 0x27, 0x1f, 0xdb, 0x42, 0xe8, +- 0x96, 0x6b, 0x21, 0x0e, 0x47, 0x6f, 0xe1, 0x50, 0x88, 0x0f, 0xb8, 0xe7, +- 0x17, 0x2c, 0x23, 0xbe, 0x99, 0x78, 0x9c, 0xb3, 0x0c, 0xa7, 0x83, 0xde, +- 0x75, 0xd4, 0xc3, 0x24, 0xf5, 0x37, 0x26, 0x71, 0x49, 0x1c, 0x32, 0x27, +- 0x87, 0xd9, 0xe7, 0x3c, 0xfb, 0x4c, 0x94, 0xbc, 0xeb, 0xdb, 0x48, 0xa4, +- 0xa5, 0x77, 0x8d, 0x12, 0x83, 0x87, 0x3d, 0xef, 0x2a, 0xbd, 0xaa, 0xf4, +- 0xa9, 0x32, 0xce, 0x76, 0x2f, 0xce, 0xae, 0x5b, 0x38, 0xa4, 0x86, 0xd5, +- 0x48, 0xfc, 0x7d, 0x03, 0x13, 0xcf, 0x57, 0xa1, 0xda, 0xbc, 0x07, 0x97, +- 0x33, 0xdf, 0x50, 0x23, 0x26, 0xf4, 0x7a, 0xbb, 0x88, 0xc7, 0x9d, 0x85, +- 0x14, 0x5c, 0xf7, 0x2d, 0xe1, 0xd6, 0x19, 0xce, 0x05, 0xcf, 0x7f, 0x0e, +- 0xb2, 0xd6, 0xdc, 0x14, 0xbe, 0x98, 0x71, 0xb1, 0x9f, 0x1e, 0xac, 0xc9, +- 0x5f, 0xf4, 0x72, 0x1b, 0xf3, 0xbf, 0x14, 0xa8, 0x2d, 0xae, 0x53, 0xa5, +- 0x7f, 0x1b, 0x23, 0xe7, 0xc6, 0xcd, 0xa2, 0x97, 0x8b, 0xe5, 0xaf, 0x06, +- 0xa4, 0xa6, 0xfb, 0xda, 0xe4, 0xb8, 0x69, 0x6a, 0xc8, 0xf2, 0xd8, 0x5f, +- 0xea, 0xf2, 0x18, 0x31, 0x38, 0x2a, 0x7d, 0x15, 0x7d, 0x09, 0xcf, 0xe5, +- 0x2b, 0x34, 0x75, 0xd8, 0x0f, 0x53, 0xb6, 0x39, 0xca, 0x03, 0x5c, 0x83, +- 0x66, 0x0e, 0x2b, 0x69, 0x9e, 0x3b, 0x0f, 0x11, 0x5f, 0xdd, 0xac, 0xc3, +- 0x57, 0xad, 0x66, 0x72, 0x98, 0xf5, 0x89, 0xb5, 0xf8, 0xb0, 0xb9, 0x7c, +- 0x7e, 0x93, 0x35, 0x99, 0x35, 0xcc, 0xad, 0x64, 0xfd, 0xee, 0x61, 0xcd, +- 0xe6, 0x28, 0xcc, 0xe9, 0x67, 0x31, 0xd1, 0xb8, 0xb6, 0xcd, 0x18, 0xdc, +- 0xe6, 0x0f, 0x21, 0x47, 0xbc, 0x1f, 0x63, 0x1d, 0x72, 0xb9, 0xa7, 0xd3, +- 0x05, 0x23, 0x95, 0xc5, 0x18, 0xb6, 0x71, 0x4f, 0x79, 0xde, 0x71, 0xfe, +- 0x2e, 0x56, 0x3c, 0x0f, 0xef, 0x65, 0x7d, 0x9b, 0x2c, 0x71, 0xfb, 0x43, +- 0x24, 0x2c, 0xc9, 0xed, 0x45, 0xd6, 0xb7, 0x49, 0x8f, 0xdb, 0x46, 0x4a, +- 0xf2, 0xb9, 0xac, 0x54, 0xd7, 0x3e, 0x82, 0xe4, 0xf0, 0xed, 0x35, 0x4d, +- 0xe2, 0xd9, 0x0e, 0x4a, 0x1f, 0xeb, 0xba, 0xb2, 0x26, 0xc9, 0x5a, 0xb4, +- 0x5c, 0x97, 0x34, 0x79, 0x77, 0x90, 0x69, 0x9c, 0x3a, 0x28, 0x7c, 0xc5, +- 0xfb, 0x87, 0x8b, 0xef, 0xfa, 0xc3, 0xa9, 0xd4, 0x7d, 0xc8, 0x44, 0xce, +- 0x6a, 0xd8, 0xe1, 0x36, 0xf4, 0x85, 0x6c, 0xf0, 0x1d, 0x05, 0xd6, 0x1f, +- 0x6b, 0xc8, 0xdc, 0x76, 0xff, 0xf0, 0x41, 0x4e, 0xd3, 0xaa, 0xa7, 0xee, +- 0x96, 0xef, 0xe0, 0x93, 0xdc, 0x1d, 0xef, 0x1f, 0xd2, 0xbf, 0xef, 0xfe, +- 0xe1, 0x59, 0xf2, 0x63, 0xa2, 0x78, 0xff, 0xe0, 0x7c, 0xa7, 0xc5, 0x8f, +- 0xb9, 0x3a, 0x1c, 0x78, 0xaf, 0x5d, 0xc5, 0xd5, 0x9c, 0x11, 0x79, 0x19, +- 0x07, 0x30, 0xe0, 0xdd, 0x35, 0xf0, 0xcc, 0x6f, 0x0f, 0xe1, 0xd7, 0xed, +- 0xf2, 0xae, 0x21, 0x25, 0xd7, 0x38, 0xc9, 0xe5, 0x43, 0xa3, 0xde, 0x6c, +- 0x61, 0x2d, 0xd8, 0xb7, 0x51, 0xc1, 0x03, 0xc9, 0x7b, 0x3c, 0x6c, 0x4f, +- 0x16, 0x8c, 0x74, 0x94, 0xcf, 0xd6, 0x4d, 0xc9, 0x1a, 0xf9, 0x30, 0xcf, +- 0x86, 0xd0, 0x1a, 0xed, 0x5e, 0x4d, 0xb8, 0x4d, 0x91, 0x0f, 0x15, 0xc3, +- 0x39, 0x09, 0x79, 0x1f, 0x90, 0xb8, 0xe8, 0x57, 0x8c, 0xc5, 0x77, 0xfd, +- 0x46, 0xaa, 0xde, 0xc3, 0xcc, 0xc3, 0x3c, 0xa7, 0xc9, 0xbf, 0xbd, 0xf2, +- 0x8c, 0x87, 0x6d, 0x1c, 0xf3, 0xd2, 0x46, 0x79, 0xee, 0xfc, 0x54, 0x64, +- 0x57, 0x19, 0xce, 0x92, 0xa2, 0x31, 0x37, 0xa0, 0x3e, 0x49, 0x0d, 0x7f, +- 0x98, 0x1a, 0x2e, 0xcf, 0x08, 0xbd, 0x3c, 0x23, 0x34, 0x2d, 0xc6, 0xfd, +- 0x46, 0xe6, 0x06, 0xf5, 0x8e, 0x63, 0xf6, 0xf5, 0x2a, 0x46, 0xef, 0x02, +- 0xf5, 0x7f, 0xbf, 0x52, 0x1c, 0x73, 0x4d, 0x69, 0xcc, 0x7b, 0xf3, 0x9a, +- 0xb2, 0xd9, 0x05, 0x75, 0x07, 0xd1, 0x3d, 0x16, 0xb5, 0xa3, 0x50, 0x4e, +- 0x8e, 0x99, 0x72, 0xcd, 0x8c, 0xad, 0x95, 0xb1, 0x29, 0xf8, 0xb0, 0x45, +- 0xbe, 0xdb, 0x2a, 0xe3, 0x70, 0x2a, 0xec, 0x14, 0xb5, 0xf7, 0xb9, 0x60, +- 0x49, 0xbf, 0x7c, 0xfd, 0xd6, 0x2a, 0x38, 0x75, 0xa8, 0x0e, 0x98, 0xb5, +- 0x18, 0xd7, 0x51, 0x19, 0x36, 0x9b, 0x91, 0xd3, 0x83, 0xe8, 0xb7, 0x7e, +- 0x2b, 0xa8, 0x93, 0x7c, 0x1f, 0x78, 0xec, 0x79, 0x9e, 0xd7, 0xcd, 0xeb, +- 0x88, 0x25, 0x9f, 0xc6, 0x19, 0x7d, 0x08, 0xe5, 0xac, 0xa5, 0xaf, 0x78, +- 0x7a, 0x62, 0x13, 0xcf, 0x0a, 0x31, 0x64, 0xcb, 0x5a, 0x77, 0xdb, 0xd8, +- 0xf2, 0xfe, 0xe1, 0x7d, 0x91, 0x2d, 0x8e, 0xe1, 0xec, 0xb1, 0x32, 0x8c, +- 0xeb, 0x4b, 0xdd, 0xdd, 0x47, 0xdd, 0xa5, 0xb7, 0xfc, 0x5a, 0x39, 0x75, +- 0x77, 0xb7, 0xf5, 0x6d, 0x3c, 0x46, 0x8e, 0x57, 0x98, 0x9f, 0x88, 0xc7, +- 0xeb, 0xe4, 0x98, 0xd4, 0xd7, 0xaa, 0x95, 0xe3, 0xff, 0x33, 0xc7, 0x94, +- 0x73, 0xc8, 0x7a, 0x78, 0x59, 0x48, 0x6f, 0x56, 0x61, 0x0f, 0x2b, 0xdb, +- 0xc8, 0xa9, 0x45, 0x96, 0xde, 0xef, 0x92, 0x4f, 0x4b, 0xcc, 0x4f, 0xe3, +- 0x1d, 0xf8, 0xd4, 0x48, 0x3e, 0xed, 0x5a, 0xc1, 0xa7, 0xe3, 0xe4, 0x53, +- 0x2f, 0xf9, 0xd4, 0xd2, 0xf6, 0x27, 0xd4, 0x15, 0x21, 0x82, 0x6d, 0x37, +- 0xc5, 0x9b, 0x9e, 0xff, 0x95, 0x9e, 0x37, 0xad, 0x74, 0xcd, 0x4b, 0x7d, +- 0xaa, 0xa4, 0x27, 0xee, 0xa1, 0x1f, 0x06, 0x06, 0xc8, 0xa7, 0xc7, 0x4d, +- 0xd1, 0xb8, 0x2f, 0x69, 0xa4, 0x16, 0xe9, 0x6b, 0x7a, 0xc8, 0xa9, 0xb7, +- 0xc8, 0xa9, 0xb1, 0x42, 0x51, 0xa7, 0x0e, 0x73, 0xdd, 0xf7, 0x53, 0xa7, +- 0x7a, 0x0a, 0x52, 0xdb, 0x1c, 0xe2, 0x3f, 0x84, 0x4f, 0xc9, 0xa9, 0xf9, +- 0xa4, 0xa7, 0x53, 0xd6, 0x6f, 0x90, 0x18, 0x3a, 0x2f, 0xf9, 0x44, 0x9d, +- 0x72, 0x0b, 0x4d, 0xd6, 0x79, 0xae, 0x69, 0xd2, 0x35, 0x6e, 0x74, 0x93, +- 0x53, 0x81, 0x76, 0xe3, 0xe2, 0x55, 0x62, 0x37, 0x14, 0x83, 0x1e, 0xb1, +- 0xe5, 0x9a, 0x58, 0x63, 0x59, 0x27, 0x8f, 0x13, 0xff, 0xdd, 0xd4, 0x8c, +- 0xde, 0x82, 0x8d, 0x43, 0x85, 0x95, 0x7b, 0xca, 0x3a, 0x74, 0xc7, 0x7d, +- 0x19, 0x0d, 0xdd, 0xb9, 0x9d, 0xf5, 0xea, 0x8e, 0xed, 0x92, 0xaf, 0x7a, +- 0x48, 0xf2, 0x75, 0xd4, 0xfd, 0x61, 0xe0, 0xce, 0xef, 0xc8, 0xfb, 0x33, +- 0x21, 0x4e, 0x5b, 0xf2, 0xfe, 0x41, 0xfa, 0x1e, 0xfa, 0x68, 0x4b, 0xde, +- 0xa1, 0x75, 0x44, 0x55, 0x18, 0x91, 0x47, 0xf1, 0xb9, 0xc8, 0xd6, 0x39, +- 0xf1, 0x80, 0x57, 0x23, 0x0d, 0xbd, 0x8f, 0xb5, 0x6e, 0xb1, 0x74, 0xce, +- 0x9b, 0xcb, 0x09, 0xf1, 0x16, 0xeb, 0xd4, 0x69, 0x9e, 0xe9, 0x46, 0xf2, +- 0x9f, 0x8b, 0xc5, 0x3a, 0x15, 0x63, 0xe6, 0xad, 0xfb, 0x48, 0x4f, 0xc7, +- 0x4e, 0xf2, 0xd9, 0x44, 0x7e, 0xb9, 0x46, 0x51, 0x33, 0x4d, 0x21, 0x76, +- 0x9b, 0xff, 0x2d, 0xfa, 0xbf, 0xf2, 0xae, 0x10, 0xd3, 0x8c, 0xe1, 0x8a, +- 0x85, 0x03, 0x01, 0xc4, 0xfa, 0x6e, 0xb0, 0xae, 0x5f, 0xda, 0x68, 0x64, +- 0xf2, 0x4a, 0xa2, 0x77, 0xab, 0x22, 0xbd, 0x9e, 0xaf, 0xb3, 0x8c, 0xef, +- 0xb4, 0xd0, 0x1b, 0x7d, 0xc8, 0x0c, 0x06, 0xf9, 0xfd, 0x4d, 0xcb, 0xa0, +- 0x7f, 0x16, 0xa2, 0x3f, 0x25, 0xc7, 0x10, 0xa2, 0xc3, 0x92, 0xe7, 0x80, +- 0x31, 0x9e, 0x03, 0xb2, 0xa2, 0xc2, 0xbc, 0x42, 0x6d, 0x32, 0x32, 0x63, +- 0x8a, 0xc9, 0xbe, 0x51, 0x78, 0x3a, 0xcb, 0x67, 0xda, 0x54, 0x04, 0x7f, +- 0xed, 0xf9, 0xe7, 0x28, 0x35, 0xab, 0x01, 0x7f, 0xe3, 0xe9, 0x96, 0x8a, +- 0x3d, 0xcf, 0x1b, 0x29, 0x55, 0x39, 0x88, 0xf7, 0x2d, 0x43, 0xff, 0x21, +- 0xe3, 0xa6, 0xd6, 0x3c, 0xb7, 0x19, 0x51, 0x70, 0x8e, 0x6c, 0x9f, 0xbf, +- 0x46, 0xd1, 0x58, 0x3b, 0xbe, 0xdf, 0x22, 0x6b, 0xf7, 0x10, 0xba, 0x9b, +- 0xf7, 0xf3, 0xa3, 0xa2, 0x76, 0x46, 0x55, 0x76, 0xd0, 0x93, 0x54, 0xcf, +- 0x54, 0x63, 0xef, 0x7a, 0x21, 0xd6, 0xae, 0x77, 0xc0, 0x33, 0x5f, 0xfc, +- 0x02, 0x6b, 0xd0, 0x89, 0x1a, 0x23, 0x0d, 0xfc, 0x04, 0x3b, 0xe9, 0x65, +- 0x53, 0x6d, 0x39, 0xe0, 0x1e, 0xb9, 0xc6, 0x9f, 0x60, 0xb3, 0xf4, 0xc0, +- 0x56, 0xb5, 0xf4, 0x5b, 0x1e, 0x7e, 0x8b, 0x77, 0x48, 0x4c, 0xf5, 0xd1, +- 0xac, 0x28, 0x37, 0x8d, 0xbe, 0x79, 0xd6, 0xdb, 0x4b, 0xb1, 0xbb, 0xf5, +- 0x6f, 0xcd, 0x4b, 0x0f, 0x6c, 0x46, 0xb7, 0x28, 0x82, 0xb9, 0x78, 0x86, +- 0xb9, 0x88, 0x39, 0x61, 0x5a, 0x86, 0x6a, 0x3b, 0xe6, 0x54, 0x2b, 0xc3, +- 0xca, 0x83, 0xe4, 0x43, 0x5f, 0xb0, 0x9c, 0x1e, 0xc2, 0xa1, 0x7f, 0xf0, +- 0xa1, 0xf2, 0xa8, 0xf4, 0x14, 0x21, 0x6a, 0x4d, 0x53, 0x2f, 0x4f, 0x17, +- 0xd8, 0x97, 0x94, 0xfe, 0x83, 0x58, 0x3f, 0x7a, 0x53, 0x6c, 0xa6, 0xc7, +- 0xdd, 0x5c, 0xf2, 0xb8, 0xbb, 0x66, 0xd3, 0xf4, 0xc0, 0x9a, 0x22, 0xef, +- 0xd3, 0x52, 0x6d, 0x3c, 0x94, 0x3e, 0x28, 0x7d, 0x88, 0x5c, 0x83, 0x8e, +- 0x6b, 0x49, 0x89, 0x5d, 0x1d, 0xa3, 0xed, 0x46, 0x24, 0x0b, 0x79, 0x7f, +- 0x73, 0xbb, 0xbf, 0x80, 0x9e, 0xfe, 0x1d, 0xcf, 0x01, 0x7d, 0x07, 0x63, +- 0x31, 0x82, 0x42, 0xd4, 0x26, 0xfd, 0xe8, 0xf3, 0xce, 0x73, 0x11, 0x3d, +- 0x4d, 0xde, 0x5f, 0xa4, 0x4f, 0xf0, 0xf3, 0xdc, 0x7c, 0x90, 0x58, 0xfa, +- 0xac, 0x65, 0xe4, 0x58, 0x3d, 0xb2, 0x93, 0xb5, 0x30, 0xac, 0xfb, 0xa9, +- 0xab, 0x57, 0x72, 0x0f, 0xb2, 0x9e, 0xfb, 0xda, 0x23, 0x3c, 0x03, 0x34, +- 0xce, 0x64, 0x45, 0x3d, 0xfd, 0xe0, 0x37, 0x78, 0xee, 0xad, 0x69, 0x8b, +- 0xd3, 0x6f, 0x2f, 0xef, 0x95, 0x0f, 0x4f, 0x59, 0x26, 0x1c, 0xef, 0x77, +- 0x58, 0xef, 0x9a, 0xbd, 0x29, 0xe6, 0xcc, 0xbb, 0xf5, 0x8e, 0x62, 0x5c, +- 0x6a, 0x99, 0x6d, 0xa1, 0x65, 0x03, 0xcf, 0x8e, 0x77, 0x88, 0xa9, 0x47, +- 0x7a, 0x9f, 0x40, 0xb1, 0xdf, 0x9f, 0xce, 0x36, 0xe8, 0xdb, 0x59, 0xef, +- 0x16, 0x89, 0x95, 0x5d, 0xeb, 0x2d, 0x19, 0xcb, 0xa2, 0x8c, 0x85, 0xfe, +- 0xd2, 0xb9, 0xdf, 0x47, 0x5f, 0x92, 0x04, 0xaa, 0xcf, 0x3e, 0x45, 0x5e, +- 0xf9, 0x5a, 0xab, 0x91, 0x1d, 0x62, 0x8c, 0xc7, 0xfe, 0x91, 0x5b, 0x33, +- 0x30, 0x8d, 0x01, 0x1f, 0xfb, 0x4c, 0x59, 0xc0, 0x13, 0x0b, 0x3c, 0x97, +- 0x4e, 0xc7, 0xe8, 0xcb, 0xe9, 0x23, 0x17, 0x34, 0x3c, 0x3a, 0x5b, 0x8e, +- 0xef, 0xcd, 0x86, 0xb1, 0x6f, 0xd6, 0xbb, 0xd7, 0xda, 0x5a, 0xcb, 0xf7, +- 0x3a, 0x92, 0x42, 0xcc, 0x5b, 0xeb, 0xf1, 0x1e, 0x3d, 0xd4, 0x6a, 0xc5, +- 0x87, 0xc8, 0x51, 0xe8, 0x3a, 0x71, 0x53, 0xd3, 0xf2, 0x3d, 0x26, 0x58, +- 0x08, 0x73, 0xbd, 0xd4, 0xc9, 0x67, 0xbc, 0xef, 0x63, 0xf4, 0x8f, 0x19, +- 0x89, 0x41, 0x97, 0x18, 0x74, 0x89, 0xc9, 0x5b, 0x9e, 0x5a, 0x62, 0x39, +- 0x4e, 0x1f, 0xfd, 0xb4, 0x28, 0x62, 0xe3, 0x0b, 0x71, 0xda, 0x7c, 0x95, +- 0xfc, 0x55, 0xa9, 0xa1, 0xc0, 0xdf, 0xe7, 0x22, 0xfa, 0x8e, 0x82, 0xcc, +- 0xff, 0x5f, 0x96, 0xf2, 0xbf, 0x18, 0x2a, 0xea, 0x85, 0xe1, 0xcc, 0xa3, +- 0x01, 0xd3, 0x6e, 0x83, 0xbe, 0xd5, 0x1d, 0x19, 0xd6, 0x90, 0x8d, 0x56, +- 0xc3, 0x18, 0x9c, 0x86, 0xaf, 0x35, 0x0c, 0xb9, 0x76, 0x20, 0xef, 0xad, +- 0x51, 0x88, 0x09, 0xea, 0x9b, 0xcc, 0xc1, 0xbf, 0xe7, 0xd0, 0xea, 0x63, +- 0x3e, 0x1c, 0xc6, 0xbe, 0x8f, 0x7b, 0xf0, 0x71, 0x5e, 0xde, 0x73, 0xc6, +- 0xd2, 0x5d, 0xb8, 0xee, 0x8d, 0xf9, 0x51, 0x3e, 0x85, 0x23, 0xee, 0x25, +- 0x71, 0xa4, 0xae, 0xa8, 0xf1, 0x69, 0x9e, 0x8f, 0xaa, 0x8f, 0x96, 0xbc, +- 0x10, 0x39, 0x5c, 0xc9, 0xf5, 0x5e, 0x4b, 0x7a, 0xde, 0x9f, 0x35, 0x72, +- 0x50, 0x3b, 0x6d, 0x6e, 0xe4, 0xda, 0x6e, 0x8a, 0x89, 0x58, 0xb3, 0x56, +- 0x8c, 0x29, 0xa1, 0x9f, 0x42, 0x19, 0xb1, 0x2b, 0xcf, 0x48, 0x52, 0x3f, +- 0xe4, 0x6f, 0x9e, 0x4f, 0x54, 0x27, 0xe2, 0xe7, 0xba, 0x9c, 0x87, 0x64, +- 0x5b, 0xa8, 0xe4, 0x57, 0x97, 0xbd, 0x48, 0x07, 0x9f, 0x49, 0x2f, 0xf2, +- 0xb9, 0xe8, 0xab, 0xeb, 0xb8, 0xa5, 0x39, 0x59, 0xbe, 0x31, 0xee, 0xca, +- 0xfb, 0xab, 0x16, 0x3a, 0x62, 0x05, 0xe7, 0x18, 0xf9, 0xa9, 0xd6, 0x98, +- 0x3e, 0xca, 0xf1, 0x1c, 0x5d, 0x27, 0x97, 0x0f, 0xd2, 0x2f, 0xf3, 0x9d, +- 0x42, 0x0b, 0xfb, 0x48, 0x2d, 0xdb, 0xc1, 0xb5, 0xfe, 0xb6, 0x59, 0x62, +- 0x7b, 0xd4, 0x7d, 0xc3, 0xa7, 0x9a, 0x72, 0x9d, 0x89, 0xd4, 0x28, 0xe3, +- 0x59, 0xd2, 0xa5, 0xb7, 0x76, 0xa8, 0x6d, 0x09, 0xaf, 0x7f, 0x56, 0x95, +- 0x71, 0x78, 0xf1, 0xb0, 0x4d, 0x6a, 0x96, 0x91, 0x39, 0x87, 0x84, 0x33, +- 0x20, 0xcd, 0xc1, 0x2a, 0x19, 0x43, 0x53, 0x64, 0x80, 0xf1, 0x9c, 0xa8, +- 0xf3, 0xf4, 0x90, 0xcf, 0x38, 0x9f, 0xeb, 0xdb, 0x5a, 0x0e, 0x81, 0xd5, +- 0x49, 0xef, 0xdc, 0x5f, 0xfa, 0x7f, 0x18, 0x2a, 0x7d, 0x88, 0xc4, 0xe2, +- 0xff, 0x02, 0xc7, 0x2a, 0x26, 0xcf, 0x94, 0x1a, 0x00, 0x00, 0x00 }; ++ 0xbd, 0x58, 0x6d, 0x70, 0x5c, 0xd5, 0x79, 0x7e, 0xce, 0xbd, 0x77, 0xb5, ++ 0xd7, 0xd2, 0x4a, 0xba, 0xb2, 0xd6, 0x66, 0x5d, 0xdc, 0xfa, 0x1e, 0x74, ++ 0x57, 0x52, 0x58, 0x01, 0x77, 0x6d, 0x01, 0xeb, 0xe6, 0xb6, 0xbe, 0xc8, ++ 0xb2, 0xbc, 0xfe, 0x00, 0xe4, 0xc0, 0x4c, 0xe4, 0x96, 0x8e, 0x37, 0xc6, ++ 0x18, 0xd9, 0x90, 0xa9, 0x28, 0xfc, 0x58, 0x37, 0x4c, 0xbd, 0x95, 0x65, ++ 0x63, 0xc3, 0x4a, 0x6b, 0x0c, 0xb1, 0x4c, 0xda, 0x99, 0x78, 0x84, 0xb1, ++ 0x4c, 0x22, 0x7b, 0x0d, 0xe4, 0x07, 0x49, 0xc3, 0xa0, 0xc1, 0x0e, 0x08, ++ 0x06, 0xf3, 0x31, 0x6d, 0x67, 0x98, 0xe9, 0xa4, 0xf5, 0x18, 0xf3, 0x11, ++ 0x92, 0x18, 0x87, 0x4e, 0x3a, 0xa2, 0x10, 0x9f, 0x3e, 0x67, 0x77, 0xc5, ++ 0x57, 0x32, 0xd3, 0xfe, 0xaa, 0x66, 0x56, 0x7b, 0xf7, 0xec, 0xf9, 0x78, ++ 0xcf, 0xfb, 0x3e, 0xef, 0xf3, 0x3e, 0xef, 0x5e, 0x21, 0x50, 0x8f, 0xda, ++ 0x5f, 0x23, 0x5f, 0xd7, 0x7e, 0x6b, 0xe8, 0x3e, 0xff, 0x6a, 0xff, 0x6a, ++ 0x3e, 0xde, 0x29, 0x80, 0x08, 0xfe, 0x1f, 0xff, 0x4c, 0xc0, 0x99, 0xb3, ++ 0x43, 0xbf, 0x60, 0x1b, 0x41, 0xe1, 0xf2, 0x1e, 0x0f, 0xb6, 0x19, 0xc4, ++ 0xdd, 0xdb, 0x3d, 0x20, 0x9c, 0x4a, 0xb9, 0x2b, 0xf1, 0x3b, 0x55, 0x88, ++ 0x5b, 0xd0, 0xe3, 0x7f, 0x1c, 0x7c, 0x7a, 0xcd, 0x73, 0xd7, 0xcb, 0x8b, ++ 0x87, 0x4d, 0xd8, 0x4e, 0xb0, 0xd7, 0x72, 0xda, 0x61, 0x2f, 0xe6, 0x9a, ++ 0x7f, 0xec, 0xf8, 0x0b, 0x81, 0xa6, 0xb9, 0xbd, 0x94, 0x1a, 0xf1, 0xa3, ++ 0x18, 0xf6, 0x13, 0xd8, 0x5d, 0x32, 0x10, 0x3a, 0x51, 0xec, 0xf2, 0x66, ++ 0xd5, 0x16, 0x5f, 0xfa, 0xbb, 0xa1, 0x96, 0x9c, 0xf6, 0x65, 0xa2, 0xd7, ++ 0x44, 0xf8, 0x1d, 0x6f, 0x31, 0x76, 0x97, 0x13, 0x18, 0x29, 0xdb, 0x38, ++ 0x6b, 0x8e, 0xa0, 0xb7, 0x3c, 0xb7, 0xce, 0xe5, 0xba, 0x4e, 0xec, 0xf9, ++ 0xf2, 0x5a, 0x77, 0x37, 0x52, 0x89, 0x3d, 0x30, 0x90, 0x8b, 0x7b, 0x5c, ++ 0xd7, 0xe6, 0xee, 0x81, 0xec, 0xe4, 0x3e, 0x85, 0xba, 0x6e, 0x97, 0x7b, ++ 0x14, 0xb8, 0x5e, 0xba, 0x47, 0xa1, 0xf7, 0xca, 0xf0, 0xf3, 0x5b, 0xea, ++ 0xb9, 0x8e, 0xc5, 0x78, 0x86, 0xfb, 0x3f, 0x5d, 0x76, 0x70, 0xb2, 0xec, ++ 0xe1, 0xf9, 0xb2, 0x8b, 0x1f, 0x95, 0xe3, 0x78, 0xaa, 0x6c, 0xe7, 0xec, ++ 0x00, 0xfd, 0xf1, 0xd1, 0x9d, 0x2a, 0xe1, 0xa1, 0xf0, 0x47, 0x81, 0x77, ++ 0xe8, 0x90, 0x11, 0xcb, 0xfc, 0xcd, 0x75, 0xe8, 0x9f, 0x7f, 0xdc, 0xc6, ++ 0x86, 0xd2, 0xe2, 0x5c, 0x34, 0x00, 0xe7, 0x08, 0xf8, 0xd7, 0xd9, 0xe8, ++ 0xe7, 0x1e, 0x05, 0xee, 0x1f, 0x96, 0x47, 0xf8, 0xb2, 0xf1, 0x6e, 0xd1, ++ 0xb6, 0x9b, 0x47, 0x17, 0xea, 0x39, 0xf8, 0x55, 0xf1, 0xa2, 0xba, 0x90, ++ 0x76, 0xf0, 0xca, 0x72, 0xa5, 0x1a, 0x03, 0x14, 0x1a, 0xba, 0x0b, 0x30, ++ 0x03, 0x99, 0x5d, 0x67, 0x0a, 0xf4, 0x5e, 0xe5, 0x75, 0x8e, 0x8a, 0x5b, ++ 0x6e, 0x31, 0x02, 0xd8, 0x22, 0x70, 0xad, 0xb6, 0xa9, 0x0c, 0xf6, 0x95, ++ 0x79, 0x2f, 0xda, 0x33, 0x52, 0x46, 0xf8, 0x97, 0x1d, 0x26, 0x26, 0xe2, ++ 0xb8, 0xff, 0xed, 0x6e, 0x0b, 0x1f, 0x17, 0x65, 0xa2, 0xd3, 0xbc, 0x1f, ++ 0x3b, 0x8b, 0x79, 0xdc, 0x51, 0x44, 0xc1, 0x08, 0x86, 0xf0, 0x8d, 0xee, ++ 0x80, 0xf7, 0x0c, 0xf1, 0xfd, 0x32, 0xec, 0xd6, 0xe0, 0xf4, 0xe5, 0xf7, ++ 0xb6, 0xcb, 0xc3, 0xa1, 0x01, 0x64, 0xc7, 0x80, 0xbe, 0x92, 0xc0, 0xa9, ++ 0x8c, 0xc0, 0x16, 0xff, 0x32, 0x14, 0x9c, 0x6e, 0xec, 0x2d, 0xcb, 0x6c, ++ 0x81, 0xdf, 0x5d, 0x35, 0x0a, 0x7b, 0x51, 0x70, 0x9b, 0xb5, 0xbc, 0x04, ++ 0xbb, 0x25, 0x18, 0xb0, 0xd2, 0x63, 0x6d, 0xb3, 0xc7, 0x84, 0xcc, 0xaf, ++ 0x30, 0x65, 0x08, 0xc8, 0x4c, 0xa7, 0x91, 0x2a, 0x28, 0x21, 0x87, 0x2e, ++ 0x42, 0xdb, 0x74, 0x9b, 0x75, 0xcd, 0x94, 0x7e, 0x1f, 0xb0, 0xae, 0x9e, ++ 0x02, 0xd6, 0x73, 0xcf, 0x87, 0x96, 0x0b, 0x6c, 0x4f, 0xff, 0x5a, 0x85, ++ 0x0b, 0x64, 0x78, 0x58, 0x74, 0x63, 0xb4, 0x0c, 0xdc, 0x34, 0x06, 0x3b, ++ 0xc6, 0xb9, 0x45, 0xee, 0x5d, 0xcf, 0xb9, 0x6b, 0x47, 0xdb, 0x06, 0x67, ++ 0x84, 0xe4, 0xdd, 0xe4, 0x00, 0x90, 0xf2, 0x8f, 0x43, 0xba, 0xeb, 0x84, ++ 0x74, 0xf6, 0xd4, 0xf6, 0x4c, 0xd6, 0xf6, 0xbc, 0x62, 0xca, 0x16, 0xab, ++ 0x4a, 0x10, 0xbd, 0x25, 0xb8, 0x4f, 0xfa, 0xe0, 0x5d, 0x62, 0xbc, 0x77, ++ 0x3d, 0xdc, 0x16, 0xe9, 0x1f, 0xe6, 0xdc, 0x68, 0xd0, 0x65, 0xbd, 0x57, ++ 0x14, 0xf8, 0xd0, 0xd3, 0xf3, 0xbb, 0xb4, 0x2d, 0xa1, 0x13, 0x64, 0x44, ++ 0x7f, 0x79, 0xff, 0x5c, 0x8e, 0x18, 0x27, 0xfd, 0x38, 0xb0, 0x10, 0xcd, ++ 0x2d, 0xde, 0x7c, 0x3c, 0xec, 0xa0, 0x31, 0xea, 0x2d, 0x33, 0x1e, 0x70, ++ 0xea, 0x70, 0xd2, 0xff, 0xad, 0xc2, 0x37, 0xf4, 0x7c, 0xe0, 0xdb, 0x8f, ++ 0x38, 0x88, 0x79, 0x17, 0x71, 0x34, 0xbd, 0xcd, 0x78, 0xd5, 0x19, 0x42, ++ 0x93, 0xf7, 0x73, 0xe3, 0x35, 0x27, 0x8e, 0x87, 0x78, 0x9f, 0x3b, 0x93, ++ 0x71, 0x3c, 0x50, 0xfe, 0xea, 0xbe, 0x96, 0xc8, 0x8e, 0xbf, 0xa3, 0xd0, ++ 0x52, 0x59, 0x1f, 0x3e, 0xeb, 0x4f, 0x00, 0x97, 0xe9, 0xf1, 0xbc, 0xd8, ++ 0x58, 0xba, 0xa4, 0xdc, 0x68, 0x06, 0x0f, 0x94, 0x6c, 0xcc, 0xa3, 0x5d, ++ 0x11, 0xcf, 0xc6, 0xdb, 0xc5, 0xbc, 0x58, 0x55, 0x0e, 0xc5, 0x9a, 0xc9, ++ 0x1e, 0x11, 0x4e, 0x5a, 0xa2, 0x67, 0x1c, 0xc4, 0xa6, 0x52, 0x6b, 0x7c, ++ 0x81, 0xff, 0xf0, 0xff, 0xd5, 0x38, 0xdb, 0x2a, 0x43, 0x57, 0x5c, 0x52, ++ 0x5e, 0xd2, 0x40, 0xbd, 0xd7, 0x27, 0xd6, 0x4e, 0x2a, 0xb5, 0xd7, 0xcf, ++ 0x8a, 0xde, 0x49, 0xd8, 0x0d, 0x41, 0x60, 0xdd, 0x35, 0x7a, 0xda, 0xc8, ++ 0x2d, 0x88, 0xa1, 0x54, 0x72, 0x71, 0xca, 0xd7, 0xf8, 0x9d, 0x07, 0xcb, ++ 0x13, 0x7c, 0x21, 0x76, 0xc6, 0x87, 0x15, 0xe3, 0xf3, 0xd4, 0x06, 0x0b, ++ 0x23, 0xdd, 0x6b, 0x2b, 0x6b, 0x22, 0xc4, 0xca, 0x13, 0xc5, 0x2c, 0x0c, ++ 0xe2, 0x6f, 0x51, 0x90, 0x9c, 0x9d, 0x20, 0xe6, 0xdf, 0xf2, 0x93, 0x9d, ++ 0x1f, 0x9b, 0x16, 0xd0, 0x2a, 0x13, 0x34, 0x54, 0x58, 0x41, 0xb2, 0xf3, ++ 0x08, 0x04, 0x4c, 0xcf, 0xc2, 0x2b, 0x7e, 0x04, 0xe1, 0x06, 0x1b, 0xbb, ++ 0x88, 0xab, 0x3a, 0x8e, 0x1f, 0xad, 0x8c, 0xeb, 0xcf, 0x70, 0x56, 0x95, ++ 0xbf, 0x9a, 0xf3, 0x1c, 0x2f, 0xb5, 0x21, 0x57, 0xc9, 0x7b, 0x38, 0xeb, ++ 0x78, 0xdf, 0x6f, 0x55, 0x38, 0xe7, 0x4f, 0x3e, 0x1b, 0xbb, 0x91, 0x76, ++ 0x9a, 0x81, 0x97, 0x7b, 0x5c, 0x2c, 0x42, 0xa1, 0x05, 0xb4, 0xdb, 0xc0, ++ 0x85, 0xf4, 0x42, 0x4c, 0xb7, 0xe8, 0xaf, 0xe3, 0x4e, 0xff, 0x78, 0xab, ++ 0x8e, 0x89, 0xde, 0xcb, 0x59, 0x35, 0xae, 0xd4, 0xf3, 0x7e, 0x1d, 0x66, ++ 0x3b, 0x86, 0x67, 0x98, 0x25, 0xfe, 0x22, 0xe6, 0xe4, 0x4b, 0x3c, 0xbf, ++ 0x65, 0x99, 0x09, 0x73, 0x99, 0x6b, 0xba, 0xf3, 0x81, 0x89, 0xa2, 0xe6, ++ 0x04, 0x39, 0xfb, 0x12, 0xff, 0x9f, 0x2b, 0x6b, 0x7c, 0xfa, 0xc4, 0xa7, ++ 0x40, 0x7b, 0x87, 0x8e, 0xbb, 0x6f, 0xb5, 0x13, 0x7b, 0xdb, 0xe9, 0xcf, ++ 0x08, 0xf3, 0xe0, 0x41, 0xda, 0x7b, 0xae, 0xf8, 0x3d, 0x63, 0x95, 0x23, ++ 0x5d, 0x7d, 0xc2, 0x3b, 0x45, 0x88, 0xe7, 0xfd, 0xbf, 0xd3, 0x3e, 0x76, ++ 0xb9, 0x2d, 0x31, 0x73, 0x1f, 0x31, 0xa3, 0xb9, 0x67, 0xbd, 0xe5, 0x8c, ++ 0xc9, 0x81, 0xf7, 0x69, 0x44, 0x22, 0x18, 0xb2, 0x12, 0xa5, 0xd4, 0xde, ++ 0x41, 0x7e, 0x6f, 0x07, 0x59, 0xcb, 0x1e, 0x95, 0x79, 0x9e, 0x97, 0xb3, ++ 0x0c, 0x99, 0x68, 0x36, 0x53, 0x43, 0x23, 0x42, 0x0e, 0x36, 0x0b, 0xd9, ++ 0x7f, 0x0f, 0xa4, 0x73, 0x42, 0xe8, 0x33, 0xd7, 0x5b, 0x5d, 0x15, 0x8c, ++ 0x66, 0x89, 0x51, 0xfd, 0x7e, 0x9f, 0x95, 0xaa, 0xbc, 0x0f, 0x59, 0x57, ++ 0x4e, 0x25, 0x30, 0x5a, 0x92, 0xbe, 0x2b, 0xa2, 0xf8, 0x5a, 0xda, 0xc6, ++ 0x89, 0xa4, 0x5a, 0xf2, 0x42, 0x5a, 0xe6, 0x7a, 0xcc, 0xc5, 0xcc, 0x85, ++ 0x04, 0x86, 0x89, 0xa5, 0x7f, 0x48, 0x8e, 0xa0, 0xa7, 0x6c, 0x12, 0xc7, ++ 0x2e, 0xf6, 0x97, 0xa2, 0x98, 0x21, 0x3f, 0xd5, 0xa5, 0x3b, 0x31, 0x52, ++ 0x92, 0x9d, 0x6f, 0x20, 0x95, 0x3f, 0xc2, 0x78, 0x9d, 0x5d, 0xe0, 0x61, ++ 0x7f, 0xb9, 0x8d, 0x31, 0x92, 0xee, 0x2a, 0x72, 0x94, 0xd9, 0x2d, 0x9d, ++ 0x5d, 0xf4, 0x6d, 0x5d, 0x40, 0x6e, 0x2b, 0x67, 0xb8, 0x4f, 0x01, 0xab, ++ 0xca, 0x79, 0xd1, 0x57, 0x9e, 0xc3, 0xe9, 0xcf, 0x89, 0x4d, 0x8d, 0x55, ++ 0x1b, 0x9b, 0x4b, 0x2c, 0x05, 0x25, 0x1f, 0x2d, 0x9e, 0xf1, 0x62, 0x14, ++ 0x17, 0xe9, 0xc7, 0x09, 0xdc, 0xe3, 0x84, 0x58, 0xe4, 0xad, 0x53, 0x3b, ++ 0xe2, 0x7a, 0x7e, 0x5e, 0xac, 0x65, 0xdc, 0xc2, 0x08, 0x8c, 0x49, 0xdf, ++ 0xc4, 0xd9, 0xf8, 0xf0, 0xfc, 0x48, 0x85, 0x77, 0xf5, 0xbb, 0x89, 0x7e, ++ 0x1f, 0x6b, 0x1c, 0xc8, 0x21, 0x5f, 0x14, 0x06, 0x9b, 0xe8, 0x87, 0x93, ++ 0xa2, 0x30, 0x10, 0x83, 0x2c, 0xdc, 0xcb, 0xf2, 0x62, 0x8f, 0x91, 0x24, ++ 0x16, 0xcc, 0xf1, 0xb4, 0x85, 0xbf, 0x2e, 0x3d, 0x65, 0x9c, 0x8b, 0xd4, ++ 0xc1, 0x3c, 0x10, 0x41, 0xf4, 0x80, 0x85, 0xe6, 0x03, 0x82, 0xb8, 0x2b, ++ 0x74, 0x46, 0xf5, 0x3a, 0x24, 0xb0, 0x6f, 0xd4, 0xc6, 0x3d, 0x1d, 0x11, ++ 0x5c, 0x48, 0xca, 0xc1, 0x2b, 0xc4, 0xb0, 0xdf, 0xc4, 0xb1, 0xd1, 0xe3, ++ 0xd2, 0x75, 0x8d, 0x42, 0x04, 0x4d, 0x71, 0x44, 0xda, 0xeb, 0xd0, 0xc0, ++ 0x75, 0x3b, 0x4b, 0x6a, 0xa7, 0x1d, 0x14, 0xdc, 0x06, 0x48, 0xff, 0x61, ++ 0xee, 0x7b, 0xaa, 0xa8, 0x54, 0xfd, 0xb5, 0xde, 0xcc, 0x07, 0xa6, 0x9c, ++ 0xde, 0xc1, 0xcf, 0x6f, 0x4d, 0x55, 0xf7, 0x9f, 0x77, 0xc0, 0x46, 0xe3, ++ 0xc1, 0xca, 0xfe, 0xb3, 0x4f, 0xd1, 0x82, 0x0f, 0x4b, 0x3a, 0x9f, 0x94, ++ 0x8a, 0x06, 0x5e, 0xff, 0x7b, 0x42, 0xa9, 0x9b, 0x7c, 0x99, 0x7b, 0x59, ++ 0xb4, 0x0d, 0x8c, 0xf2, 0x79, 0x30, 0x9d, 0x74, 0xb3, 0xb4, 0xf9, 0x7c, ++ 0x39, 0x4a, 0xfb, 0x98, 0x0b, 0xde, 0x36, 0x63, 0x87, 0x63, 0xa2, 0xce, ++ 0xdb, 0x61, 0x6c, 0xad, 0x60, 0xd5, 0xc1, 0xa2, 0xb1, 0x7a, 0x2c, 0xf1, ++ 0x42, 0xb1, 0x89, 0xb9, 0xb9, 0x71, 0xd2, 0xe2, 0x3c, 0x9d, 0x9b, 0x02, ++ 0x51, 0xaf, 0x57, 0xac, 0x9c, 0xec, 0xab, 0xe4, 0xeb, 0xc0, 0xb8, 0x81, ++ 0x37, 0xfd, 0x1b, 0x10, 0x09, 0xb2, 0x62, 0x60, 0x52, 0xe7, 0xcf, 0x5a, ++ 0xb1, 0x7a, 0x92, 0xf1, 0x9b, 0xaf, 0x73, 0xe7, 0x06, 0x11, 0x09, 0x74, ++ 0xbe, 0x7c, 0x9e, 0x43, 0x36, 0x73, 0xe8, 0xd8, 0xff, 0x92, 0x43, 0x0f, ++ 0x95, 0x2c, 0xe4, 0x5a, 0xaa, 0xf9, 0xd2, 0xcb, 0x58, 0xfc, 0xbd, 0x55, ++ 0xfd, 0x66, 0x3b, 0xc7, 0xa3, 0x07, 0x74, 0x0e, 0xf7, 0x32, 0x87, 0x35, ++ 0x9e, 0x2d, 0xb1, 0x69, 0x1c, 0x76, 0x73, 0x10, 0x5a, 0x1f, 0x8e, 0x2a, ++ 0xbc, 0xed, 0x2b, 0xf5, 0xf1, 0x32, 0xed, 0x13, 0x39, 0xf8, 0x2c, 0xf1, ++ 0x08, 0x12, 0xd2, 0xbb, 0x9e, 0x52, 0x33, 0x7e, 0x2a, 0xfb, 0x2c, 0x79, ++ 0xf9, 0x9c, 0xd0, 0xf7, 0x8f, 0xc2, 0x49, 0x6b, 0x3c, 0xf6, 0x5a, 0x57, ++ 0x55, 0x70, 0x19, 0x12, 0xaf, 0xac, 0xd5, 0xf3, 0x35, 0x36, 0xa3, 0x68, ++ 0x48, 0xce, 0xd2, 0x37, 0x72, 0xa8, 0x51, 0xa8, 0x25, 0xaf, 0xa6, 0xab, ++ 0xb8, 0x2c, 0xb2, 0x36, 0xad, 0xe7, 0x59, 0xbd, 0xe3, 0xb2, 0xb0, 0xde, ++ 0xac, 0xd6, 0xd1, 0xbd, 0xc4, 0x86, 0xe6, 0xb8, 0xcb, 0xdb, 0xa3, 0xd8, ++ 0x47, 0x8c, 0x7a, 0x69, 0x17, 0xc3, 0xac, 0xab, 0xbb, 0x4b, 0xd2, 0x1d, ++ 0x26, 0x4e, 0x77, 0xd7, 0x70, 0x3a, 0xcc, 0x5a, 0xba, 0x1b, 0x72, 0xaf, ++ 0xae, 0xa5, 0x11, 0xe2, 0x94, 0x34, 0x56, 0xc1, 0xe9, 0x48, 0x0d, 0xa7, ++ 0xbd, 0x15, 0x9c, 0xee, 0x36, 0x34, 0x3e, 0x35, 0xf6, 0x36, 0xf1, 0xbe, ++ 0x67, 0xa3, 0x30, 0x7e, 0xc0, 0xfd, 0xc3, 0x05, 0xc3, 0x3d, 0x35, 0xec, ++ 0xf5, 0x68, 0xec, 0x19, 0x69, 0xdc, 0x63, 0xf0, 0x6e, 0x2f, 0x88, 0x42, ++ 0xae, 0x11, 0x32, 0x3b, 0x2c, 0x0a, 0x9d, 0xf3, 0x88, 0xbd, 0x67, 0x38, ++ 0xa3, 0x81, 0xd8, 0xab, 0xfa, 0x4c, 0xcf, 0x8f, 0x11, 0x7b, 0xff, 0x29, ++ 0xce, 0x46, 0x34, 0xd7, 0xea, 0xd8, 0x02, 0x8b, 0x4e, 0x68, 0xae, 0x8d, ++ 0x92, 0x30, 0x2c, 0xe4, 0x4b, 0xc6, 0xe2, 0x04, 0x14, 0xb6, 0x92, 0xdb, ++ 0xde, 0xf4, 0x86, 0xfd, 0x16, 0xdc, 0x80, 0xd3, 0x5d, 0x06, 0xb4, 0x0e, ++ 0x31, 0x27, 0xaa, 0xd8, 0xbd, 0x8b, 0x9c, 0xd1, 0x14, 0xc8, 0xce, 0xb3, ++ 0xd4, 0x1b, 0x5b, 0xd2, 0x0d, 0x28, 0x79, 0xc3, 0x61, 0x33, 0xab, 0xa1, ++ 0xcd, 0x73, 0x57, 0x43, 0xd7, 0xc2, 0x38, 0xac, 0x76, 0x1b, 0x0d, 0x47, ++ 0xbd, 0xdc, 0x09, 0xa1, 0xf1, 0x0a, 0x74, 0x1d, 0xb7, 0x69, 0x3f, 0x9c, ++ 0xfa, 0xc0, 0xcb, 0x7c, 0x60, 0x3e, 0x2e, 0xce, 0x3a, 0xd5, 0x7a, 0xd0, ++ 0x37, 0xae, 0x31, 0xf6, 0x2b, 0xf5, 0xa6, 0x67, 0xe0, 0x8e, 0x6e, 0xa5, ++ 0xbc, 0xa5, 0x51, 0x44, 0x26, 0x6c, 0xd4, 0x1d, 0x6c, 0xc5, 0x4b, 0x5d, ++ 0x11, 0x9c, 0xbd, 0x55, 0x7f, 0x1f, 0x45, 0x3d, 0x71, 0xb8, 0xe9, 0xda, ++ 0x28, 0x96, 0x4c, 0x54, 0x31, 0xd9, 0xe0, 0xfd, 0x44, 0xdc, 0x45, 0x4c, ++ 0xce, 0xf3, 0xce, 0x88, 0x6d, 0x4e, 0x06, 0x7b, 0x69, 0xd3, 0xeb, 0xe4, ++ 0xf8, 0xf3, 0xc9, 0x5d, 0x33, 0x16, 0xed, 0x5f, 0xb1, 0xac, 0xd0, 0xb9, ++ 0x84, 0xa2, 0x6e, 0xd1, 0x84, 0x1c, 0x38, 0xa6, 0x2b, 0xcc, 0xa8, 0x25, ++ 0x36, 0x10, 0xef, 0x9a, 0x5f, 0x4d, 0xc6, 0xe9, 0x8a, 0xa5, 0x6d, 0x43, ++ 0x37, 0xe3, 0x92, 0x3a, 0x93, 0x4c, 0x66, 0x47, 0x89, 0xf5, 0x6d, 0xc7, ++ 0x23, 0xa8, 0x3b, 0xf0, 0x5f, 0xca, 0x08, 0x98, 0x0b, 0xdd, 0x8a, 0xf8, ++ 0x2c, 0x64, 0xea, 0xc9, 0x21, 0x17, 0x11, 0xc7, 0x63, 0xfb, 0x77, 0xaa, ++ 0x25, 0x1c, 0x7f, 0xef, 0xfa, 0x66, 0xb4, 0x2d, 0x93, 0xf9, 0xad, 0xdc, ++ 0x7f, 0x36, 0x5d, 0xe8, 0x4c, 0x30, 0x76, 0x27, 0xe1, 0xe2, 0xaa, 0x31, ++ 0x99, 0x3b, 0x86, 0x3a, 0x34, 0x4f, 0x78, 0xd9, 0x13, 0x22, 0x86, 0xc6, ++ 0x13, 0x31, 0xec, 0x3b, 0xae, 0xf3, 0x33, 0x06, 0x6b, 0xcc, 0x9b, 0xed, ++ 0x10, 0x85, 0x7e, 0xe6, 0xe7, 0x4c, 0xbf, 0x68, 0x47, 0xfb, 0xb8, 0x9c, ++ 0xce, 0x0a, 0x2f, 0x7c, 0x00, 0x1e, 0xda, 0x59, 0x97, 0xed, 0x13, 0x2e, ++ 0x56, 0xe8, 0xfa, 0x51, 0xd6, 0xf9, 0xa3, 0xeb, 0xa9, 0xc1, 0x3b, 0x85, ++ 0x62, 0x7d, 0xa5, 0xe6, 0xf5, 0xf2, 0xd5, 0xc7, 0xfa, 0x67, 0x89, 0x75, ++ 0xe3, 0x3a, 0xb7, 0x0c, 0xcc, 0xf8, 0x97, 0xd4, 0xf6, 0x64, 0x96, 0xb5, ++ 0x6e, 0x1e, 0xf3, 0xaa, 0x9a, 0x4f, 0x68, 0xd1, 0xb9, 0x35, 0xaf, 0x96, ++ 0x4f, 0x16, 0xce, 0x30, 0x76, 0x87, 0xff, 0xcf, 0x75, 0xc9, 0x42, 0xe2, ++ 0x80, 0x81, 0x96, 0x8e, 0x28, 0xae, 0x59, 0xda, 0xe6, 0x34, 0x23, 0x8a, ++ 0x9b, 0x7c, 0x07, 0x4d, 0xc4, 0xc4, 0x7e, 0xe6, 0x14, 0xe6, 0x57, 0x73, ++ 0x6d, 0xa5, 0xae, 0x57, 0xb5, 0x5c, 0xcb, 0x97, 0x12, 0xac, 0x4d, 0xba, ++ 0x16, 0xf4, 0xb2, 0x16, 0x58, 0x38, 0x54, 0xd6, 0xbe, 0x75, 0xf0, 0x2e, ++ 0x39, 0xfb, 0x15, 0x5f, 0xfb, 0x76, 0x31, 0x4a, 0xcc, 0x8d, 0x07, 0x99, ++ 0x1b, 0x6b, 0xcb, 0x97, 0xd4, 0x1a, 0x4f, 0xd7, 0xe3, 0x90, 0xf5, 0xd8, ++ 0x12, 0x37, 0x8d, 0xcb, 0x41, 0x57, 0x9c, 0xba, 0x93, 0xd8, 0xec, 0x6c, ++ 0x34, 0x94, 0x7a, 0x39, 0x9d, 0x0a, 0xa9, 0x63, 0x32, 0x77, 0x0b, 0xe9, ++ 0xbe, 0x4f, 0x6e, 0x5a, 0x6b, 0x46, 0xb1, 0xbc, 0x96, 0x83, 0xc9, 0x5a, ++ 0x0e, 0x7a, 0xcc, 0x41, 0xb7, 0x15, 0xe1, 0x27, 0xb4, 0xb1, 0x8d, 0x39, ++ 0xb8, 0x8d, 0x3a, 0xf5, 0xfb, 0xa5, 0x0a, 0xef, 0x67, 0x56, 0x88, 0xd4, ++ 0xcc, 0x79, 0xe6, 0x93, 0x7b, 0x99, 0x47, 0xbd, 0xd6, 0x96, 0x39, 0xcf, ++ 0x98, 0xad, 0xae, 0xe5, 0xd3, 0xee, 0x1a, 0xef, 0x3f, 0x50, 0xcb, 0xa7, ++ 0xd5, 0x5f, 0xca, 0x27, 0xcd, 0x4f, 0x2f, 0xfc, 0x0e, 0xad, 0x5a, 0x8b, ++ 0xe4, 0x85, 0xbe, 0x5f, 0xce, 0x42, 0xf8, 0x63, 0x5f, 0x9f, 0x65, 0xc3, ++ 0x0a, 0x1a, 0x2b, 0x7c, 0x63, 0x05, 0xa1, 0xe8, 0x65, 0xed, 0xb4, 0xbd, ++ 0xbc, 0xc8, 0xd2, 0x77, 0x7a, 0xdd, 0x5a, 0xc6, 0x62, 0x67, 0xfa, 0x17, ++ 0x38, 0xdb, 0xaa, 0x54, 0x5f, 0xfa, 0x92, 0x7a, 0x83, 0x71, 0x89, 0x51, ++ 0x7f, 0xac, 0x9f, 0xcc, 0x8a, 0xfe, 0x49, 0xed, 0x9b, 0x46, 0x44, 0xbc, ++ 0xb5, 0x62, 0xd5, 0x24, 0x70, 0x0f, 0xf5, 0xcc, 0x39, 0xfa, 0x65, 0x8d, ++ 0x2f, 0x87, 0xd6, 0xf0, 0x6e, 0x67, 0x7c, 0x0b, 0x0f, 0x97, 0xab, 0xfe, ++ 0xd9, 0x57, 0x96, 0x99, 0x69, 0x8c, 0x60, 0x0d, 0x6b, 0xda, 0x61, 0xf2, ++ 0xc5, 0xbf, 0x25, 0xa3, 0x78, 0x91, 0x7c, 0xf1, 0x12, 0xef, 0x77, 0xa8, ++ 0x7a, 0x3f, 0x7f, 0x16, 0xa9, 0xcc, 0x69, 0xcd, 0x17, 0xd4, 0xde, 0x87, ++ 0xca, 0x6d, 0xfe, 0x69, 0xe2, 0xf1, 0xc1, 0x92, 0x1c, 0xe8, 0xe3, 0x1d, ++ 0xed, 0x6e, 0x39, 0x3b, 0x28, 0x04, 0x36, 0x26, 0xe1, 0x98, 0x81, 0xbe, ++ 0x87, 0x4b, 0x8d, 0x9b, 0xa1, 0x1f, 0x0a, 0xe8, 0xe3, 0x5d, 0x57, 0xb2, ++ 0xc6, 0x3d, 0x56, 0xfe, 0x92, 0xae, 0xc3, 0xb6, 0x92, 0xe6, 0x2a, 0xa5, ++ 0x3a, 0xd2, 0x5a, 0x2b, 0xe5, 0xc5, 0xcd, 0x9a, 0x53, 0x22, 0x51, 0x28, ++ 0xbf, 0x2d, 0xb1, 0x84, 0xb1, 0xcf, 0x13, 0x5f, 0xef, 0x7a, 0xf5, 0xe4, ++ 0x85, 0x90, 0xbc, 0xde, 0x43, 0xde, 0xee, 0x15, 0x7d, 0x15, 0x3e, 0xcf, ++ 0x8a, 0xec, 0xa4, 0x2d, 0x7a, 0xa8, 0x51, 0x36, 0x30, 0xcf, 0xdc, 0x85, ++ 0xf3, 0x88, 0x29, 0x8d, 0x2b, 0x03, 0x3f, 0xf0, 0xd7, 0x92, 0xf3, 0x6f, ++ 0xa0, 0xaf, 0xc8, 0x4b, 0x15, 0x2c, 0xde, 0x40, 0x9d, 0x54, 0xc5, 0xe2, ++ 0x0f, 0x89, 0xc5, 0x5c, 0x0d, 0x8b, 0x91, 0x20, 0x49, 0xbe, 0xfb, 0x1c, ++ 0x8b, 0xbd, 0x7f, 0x80, 0xdf, 0xbf, 0x88, 0xb9, 0xf5, 0x9a, 0xdf, 0x23, ++ 0x73, 0x98, 0x63, 0x7d, 0xee, 0x08, 0xc8, 0xc3, 0x1a, 0x6f, 0x36, 0xfa, ++ 0x1e, 0xad, 0xc7, 0x86, 0x47, 0x63, 0xb8, 0xf9, 0x51, 0xa5, 0x5e, 0xf3, ++ 0xe1, 0xb5, 0x90, 0x8b, 0x7e, 0x91, 0x9e, 0xc0, 0x99, 0x96, 0xa4, 0xbb, ++ 0x0f, 0xba, 0x8f, 0xea, 0xb5, 0x6e, 0x2f, 0x6a, 0x8d, 0x12, 0x52, 0xa3, ++ 0xc8, 0xfe, 0xf7, 0x99, 0xeb, 0x9b, 0x92, 0x32, 0xbf, 0xb3, 0xc2, 0xfd, ++ 0x29, 0x9f, 0x5a, 0x7c, 0xaf, 0x61, 0xca, 0x6c, 0xbb, 0x51, 0xc5, 0xda, ++ 0x35, 0x35, 0xac, 0x7d, 0x6d, 0xca, 0xc6, 0x2f, 0x59, 0x17, 0x36, 0xa7, ++ 0xa3, 0x58, 0xad, 0x6b, 0xbc, 0xa3, 0x7b, 0xa9, 0x28, 0xfa, 0x19, 0x17, ++ 0x63, 0xa9, 0xa2, 0xde, 0xa0, 0xee, 0x60, 0x2c, 0x57, 0xb1, 0x9f, 0x3a, ++ 0x43, 0x7d, 0x72, 0xa3, 0x59, 0xed, 0xa5, 0x46, 0x6b, 0xfa, 0xe4, 0xc6, ++ 0xb2, 0xce, 0x47, 0x97, 0x18, 0x88, 0xe2, 0x34, 0xd7, 0xec, 0xf1, 0xab, ++ 0xfa, 0xe4, 0x75, 0xa4, 0xb2, 0x5a, 0x9f, 0xb8, 0xe4, 0xfd, 0x52, 0x45, ++ 0x9f, 0x68, 0x3d, 0xa2, 0xb5, 0x88, 0xee, 0x17, 0xba, 0xd9, 0x2f, 0xc8, ++ 0x69, 0xad, 0x57, 0x8c, 0x6e, 0xe9, 0x1b, 0x66, 0x84, 0x35, 0x32, 0xc3, ++ 0x58, 0x5e, 0x86, 0x5d, 0x8f, 0x34, 0x31, 0x16, 0x8d, 0xd8, 0xe1, 0xac, ++ 0xb0, 0x96, 0x78, 0x9a, 0x3f, 0xa9, 0x41, 0x7e, 0x4f, 0xbb, 0x1c, 0xd5, ++ 0x1c, 0xcb, 0xf8, 0xcf, 0x8d, 0xff, 0x7b, 0x6d, 0x5c, 0xcf, 0xcf, 0xb2, ++ 0x46, 0xeb, 0x35, 0x3f, 0xb2, 0xaa, 0xb8, 0x47, 0x73, 0x93, 0xf7, 0x67, ++ 0xb8, 0x40, 0x1b, 0xdf, 0xfc, 0x52, 0x1c, 0x6d, 0xe6, 0x85, 0x8e, 0xe3, ++ 0x27, 0x5c, 0xab, 0xe3, 0x6d, 0xe3, 0x1d, 0xfa, 0xf8, 0x1c, 0x7d, 0xfc, ++ 0xcb, 0x47, 0x03, 0x72, 0x13, 0x3e, 0x35, 0xe8, 0xe3, 0xed, 0xc4, 0xcd, ++ 0x8f, 0xfd, 0xeb, 0xd1, 0xde, 0x9a, 0x74, 0x3f, 0x30, 0xe7, 0xea, 0x2d, ++ 0xec, 0x25, 0xf4, 0x9d, 0xa2, 0x9f, 0x75, 0xaf, 0x73, 0x8c, 0xfe, 0x65, ++ 0x2e, 0x57, 0x34, 0x48, 0xbb, 0x59, 0xf5, 0x6f, 0x47, 0xcd, 0xbf, 0x99, ++ 0xa9, 0x6d, 0x3c, 0x47, 0xd7, 0x53, 0xad, 0x47, 0xef, 0xaf, 0xf4, 0x4b, ++ 0x66, 0x70, 0x6b, 0x25, 0x56, 0x75, 0x41, 0xde, 0x7a, 0xb1, 0xa8, 0x6b, ++ 0x76, 0x3f, 0x6b, 0x36, 0x7b, 0x26, 0x53, 0x0e, 0x0e, 0x22, 0x35, 0xcd, ++ 0xbd, 0xf6, 0x9e, 0x46, 0x2a, 0x64, 0x3f, 0x35, 0x74, 0x9e, 0xbd, 0x4f, ++ 0xc6, 0x90, 0xb9, 0x99, 0x8a, 0x9e, 0xbc, 0xb5, 0x56, 0xa7, 0xfb, 0x6b, ++ 0xba, 0xf2, 0xfe, 0xda, 0x39, 0x79, 0xea, 0xca, 0xb9, 0x73, 0xf4, 0x5d, ++ 0x2e, 0xb7, 0xf4, 0xb3, 0xee, 0x03, 0xde, 0xf0, 0x7f, 0xa6, 0xb0, 0xb0, ++ 0xb1, 0xa2, 0x3b, 0x3e, 0xbf, 0xb3, 0x25, 0x36, 0x8e, 0x5f, 0x54, 0x99, ++ 0x8e, 0xbb, 0x4c, 0xd4, 0x2b, 0x65, 0x2d, 0x0b, 0x51, 0x2c, 0xcd, 0xa8, ++ 0x62, 0x5c, 0x16, 0x34, 0x28, 0x5b, 0x82, 0xbb, 0x19, 0x1f, 0xd8, 0x56, ++ 0x30, 0x68, 0x8d, 0x14, 0xe5, 0x10, 0x7b, 0xb9, 0x3c, 0xfb, 0xb0, 0x70, ++ 0x3f, 0xb4, 0xbe, 0xd5, 0xe7, 0xdd, 0xad, 0xfb, 0x38, 0xbe, 0x0f, 0xd2, ++ 0x9e, 0xb9, 0x73, 0x43, 0x3c, 0x56, 0xfa, 0x2b, 0xf5, 0x58, 0x5c, 0xe6, ++ 0xf4, 0x1e, 0x11, 0xce, 0x79, 0xa2, 0xa2, 0x9f, 0x07, 0xb5, 0x7e, 0x76, ++ 0x35, 0x1e, 0xc7, 0x3c, 0x39, 0x7b, 0x02, 0xa9, 0x81, 0x0b, 0xa6, 0xec, ++ 0x8f, 0x51, 0x33, 0xaf, 0xab, 0xed, 0xb5, 0xa2, 0xb6, 0x57, 0xdb, 0xd4, ++ 0x43, 0xb4, 0x5b, 0xe3, 0xb1, 0x5a, 0xdf, 0x8c, 0x20, 0x86, 0xa6, 0x51, ++ 0x8f, 0x35, 0x3e, 0x99, 0x3b, 0xc2, 0x3a, 0x13, 0x3b, 0xbe, 0xa3, 0x62, ++ 0xef, 0xeb, 0xfe, 0x93, 0x66, 0x25, 0xbf, 0x4f, 0xe8, 0x3a, 0x61, 0xc1, ++ 0x62, 0xdd, 0xb9, 0x72, 0x4c, 0x86, 0x5b, 0xc4, 0x47, 0x6a, 0x49, 0xd2, ++ 0x4b, 0xac, 0x16, 0x5a, 0xfb, 0x24, 0xa9, 0x7d, 0x62, 0xc8, 0x9c, 0xf8, ++ 0x17, 0xda, 0xa7, 0xf5, 0x9b, 0xae, 0x85, 0x0e, 0x5a, 0x46, 0xbd, 0xce, ++ 0x36, 0x23, 0x49, 0xed, 0xec, 0xa0, 0xf9, 0xb3, 0xfd, 0x2c, 0xb1, 0x8a, ++ 0xfb, 0xd4, 0x1d, 0x70, 0x70, 0xcd, 0x98, 0x74, 0x8e, 0xe2, 0x02, 0x39, ++ 0xdc, 0x1b, 0xd4, 0x3a, 0xf1, 0xea, 0x74, 0x92, 0x35, 0xdd, 0x41, 0xd7, ++ 0x67, 0xfb, 0xc4, 0x50, 0x37, 0xa6, 0xcf, 0x2e, 0x4c, 0x9b, 0x8c, 0x93, ++ 0x63, 0x1e, 0xe5, 0xb8, 0x8b, 0xf6, 0x13, 0x8d, 0xec, 0xb7, 0x94, 0xea, ++ 0x67, 0x3d, 0xb0, 0x58, 0x73, 0x7b, 0xd1, 0x3e, 0x38, 0x22, 0x52, 0x03, ++ 0x8d, 0x48, 0xf5, 0xc7, 0xe0, 0x39, 0xeb, 0x84, 0xfe, 0x8d, 0x61, 0x4e, ++ 0x93, 0x00, 0x8f, 0x17, 0xff, 0x9c, 0xeb, 0x92, 0xce, 0x16, 0x62, 0xac, ++ 0xe5, 0x4f, 0x53, 0xf9, 0x16, 0xa4, 0x86, 0x1c, 0x78, 0xee, 0xeb, 0x9c, ++ 0x57, 0xf8, 0xc2, 0xbc, 0x67, 0x2b, 0xf3, 0xe8, 0x8b, 0xeb, 0xb5, 0xd6, ++ 0x52, 0xea, 0x09, 0xea, 0xad, 0x82, 0xa3, 0x39, 0x47, 0x60, 0xd8, 0xd7, ++ 0x7b, 0xf6, 0xb8, 0x16, 0x64, 0xe2, 0x0e, 0x7c, 0xa2, 0x0a, 0xf1, 0xb0, ++ 0x33, 0x52, 0xf9, 0x5d, 0x42, 0x3a, 0x39, 0x72, 0xdb, 0x74, 0xb5, 0xcf, ++ 0x62, 0x5f, 0xa4, 0xd4, 0x8b, 0xe4, 0xa6, 0x27, 0xa8, 0x7d, 0x86, 0xa7, ++ 0x3e, 0x51, 0xd3, 0xd4, 0x36, 0x23, 0x9e, 0x9e, 0x57, 0xe5, 0xa0, 0xc3, ++ 0x8e, 0x52, 0x8f, 0xf3, 0xbb, 0x3d, 0x53, 0x73, 0xbc, 0xc4, 0xf3, 0xc8, ++ 0x09, 0xb7, 0x7b, 0xff, 0xad, 0x36, 0x7f, 0x69, 0xae, 0x52, 0x63, 0xb4, ++ 0xe1, 0x2d, 0x1f, 0xf7, 0x47, 0x90, 0xcc, 0xcd, 0xd2, 0x3f, 0x67, 0x96, ++ 0xcb, 0xfe, 0x29, 0xde, 0x73, 0xbd, 0x90, 0x59, 0xde, 0xb1, 0x77, 0x1e, ++ 0x34, 0xd7, 0x4a, 0xe6, 0x83, 0xe1, 0xd5, 0xf1, 0xf9, 0x67, 0xbe, 0x4c, ++ 0x1c, 0xe1, 0xfb, 0xe6, 0x8c, 0xde, 0x43, 0xa9, 0x1e, 0x5f, 0xf7, 0xf8, ++ 0x23, 0xec, 0xf1, 0x0b, 0xaa, 0xc1, 0x7b, 0x43, 0x3d, 0xd7, 0x21, 0xfb, ++ 0x47, 0x84, 0xc7, 0xb5, 0x2e, 0xeb, 0x82, 0xee, 0xab, 0x46, 0xd8, 0x57, ++ 0xb9, 0x78, 0x9a, 0x1c, 0x73, 0xb2, 0xdc, 0x89, 0xe7, 0xcb, 0x1e, 0x9e, ++ 0x61, 0xfd, 0x78, 0xaa, 0x6c, 0x61, 0xeb, 0x23, 0x32, 0x63, 0x89, 0x9d, ++ 0x38, 0xef, 0x4b, 0xe7, 0x7b, 0xb4, 0xdb, 0x0c, 0xe4, 0xfe, 0x95, 0xe4, ++ 0x15, 0x9e, 0x51, 0xc8, 0x99, 0x2d, 0xc2, 0x0e, 0x6c, 0x7c, 0xa7, 0xc3, ++ 0xc0, 0xe1, 0xf8, 0x10, 0xfa, 0xda, 0xef, 0xe6, 0xcb, 0x42, 0xeb, 0x01, ++ 0x5d, 0xab, 0x75, 0xbf, 0xd1, 0x8c, 0x3b, 0xc9, 0x67, 0x57, 0x2f, 0x0d, ++ 0xf1, 0xeb, 0x74, 0x5b, 0xe7, 0x4b, 0x82, 0x9a, 0xa1, 0x45, 0x66, 0x81, ++ 0x9f, 0x62, 0x23, 0xfb, 0x85, 0xcc, 0xb2, 0xfd, 0xb5, 0xde, 0xfc, 0xa7, ++ 0x58, 0xa9, 0xfb, 0x0c, 0xbf, 0x99, 0xf5, 0xae, 0x1a, 0x87, 0xc3, 0x15, ++ 0x3f, 0x1a, 0x68, 0x3a, 0x58, 0x50, 0xf5, 0x9e, 0xcc, 0x4d, 0x56, 0x74, ++ 0xd4, 0x42, 0xe7, 0x46, 0xf6, 0x01, 0x0d, 0x07, 0x3c, 0x77, 0x9d, 0x50, ++ 0x8c, 0xc5, 0x6e, 0xc6, 0x22, 0x19, 0xc6, 0xd8, 0x6e, 0x37, 0x07, 0xc9, ++ 0xb0, 0x59, 0xe4, 0xc5, 0x2d, 0xba, 0xc6, 0xd6, 0xd5, 0xb3, 0xff, 0x66, ++ 0x4d, 0x9d, 0x34, 0xd8, 0x8f, 0xe8, 0x7e, 0x3c, 0x8a, 0xa9, 0x74, 0x1b, ++ 0xfb, 0xa4, 0x28, 0xb6, 0xa7, 0x7b, 0xa8, 0x6b, 0x0c, 0x18, 0x07, 0x2f, ++ 0xa9, 0x95, 0x5f, 0xe8, 0x23, 0x36, 0x8d, 0x6b, 0x0e, 0xb3, 0xc5, 0x46, ++ 0xe6, 0x6f, 0x66, 0x19, 0xc5, 0xda, 0x2d, 0xba, 0x87, 0xd7, 0x77, 0x70, ++ 0xd8, 0x1f, 0x1b, 0x98, 0x5e, 0xe0, 0x60, 0x57, 0xb7, 0x4c, 0x14, 0xa0, ++ 0x73, 0xf9, 0xab, 0x35, 0x05, 0x4e, 0xf6, 0xf7, 0xea, 0x0c, 0x9c, 0x0d, ++ 0xb4, 0x45, 0xd6, 0x29, 0xd5, 0x9a, 0x36, 0x91, 0xab, 0xd4, 0x9b, 0x84, ++ 0x93, 0x65, 0xff, 0x37, 0x33, 0xc5, 0x9e, 0xec, 0xa0, 0x52, 0x3b, 0x89, ++ 0xa5, 0x8f, 0x3b, 0x86, 0x0f, 0xb1, 0x13, 0xdf, 0xdb, 0xca, 0xde, 0xea, ++ 0xeb, 0x6c, 0xdf, 0xde, 0x2a, 0x7e, 0x93, 0xfc, 0x6d, 0x74, 0x27, 0xa0, ++ 0xfb, 0x9d, 0x82, 0x8a, 0x78, 0xde, 0xec, 0xe3, 0xd4, 0x82, 0xbf, 0x59, ++ 0xd6, 0x05, 0x77, 0x7e, 0xd5, 0x57, 0xab, 0xa9, 0xa5, 0x3e, 0x22, 0xe7, ++ 0x87, 0x95, 0xcf, 0x31, 0x67, 0xdd, 0xf8, 0x25, 0xb5, 0x99, 0xbe, 0xe9, ++ 0xa9, 0xda, 0x65, 0xd5, 0x07, 0x6c, 0x12, 0xaf, 0x85, 0xb3, 0xe6, 0x0f, ++ 0xd8, 0xf4, 0x79, 0xbd, 0x8b, 0x39, 0x6b, 0xc6, 0x17, 0xd3, 0x46, 0xe9, ++ 0x4e, 0x57, 0xf0, 0xe3, 0xe3, 0x23, 0x6f, 0x38, 0x31, 0x1f, 0x85, 0x4e, ++ 0xe6, 0xd8, 0xec, 0x3f, 0x71, 0xac, 0x7d, 0x29, 0xf0, 0x9b, 0xf2, 0x77, ++ 0xc9, 0xfb, 0x46, 0x57, 0x0b, 0x0a, 0x33, 0xb4, 0xf1, 0xd0, 0xd7, 0x89, ++ 0xc9, 0xfc, 0x18, 0xee, 0x63, 0x1b, 0x81, 0x67, 0x59, 0x6f, 0x8f, 0x91, ++ 0x33, 0x9a, 0xd3, 0x0e, 0xca, 0x7c, 0x3e, 0x52, 0x4a, 0x0e, 0x9e, 0x66, ++ 0xde, 0x1e, 0xe7, 0xf3, 0x51, 0xde, 0x73, 0x2b, 0xf5, 0xdd, 0xbd, 0xe3, ++ 0xf5, 0xf8, 0xf6, 0x78, 0x0c, 0x5b, 0xc7, 0x03, 0x6a, 0x0a, 0xdc, 0xd6, ++ 0xc8, 0x7d, 0x5f, 0x25, 0x9e, 0x37, 0x2f, 0xbd, 0x0e, 0x6b, 0x9d, 0xa4, ++ 0x7b, 0x37, 0x73, 0xaf, 0xee, 0x20, 0x1c, 0x87, 0x38, 0xfa, 0x67, 0x6f, ++ 0xb9, 0x40, 0x13, 0xf5, 0xfe, 0x52, 0x4b, 0xac, 0x1f, 0x5f, 0x5d, 0x79, ++ 0x1e, 0x49, 0xe7, 0xa9, 0x2d, 0x88, 0xc9, 0x12, 0x31, 0xc9, 0xd8, 0x3c, ++ 0x5d, 0x22, 0x2e, 0xa9, 0x0d, 0x4f, 0x96, 0x34, 0xb6, 0x7d, 0x3c, 0xd7, ++ 0x31, 0xa4, 0xaa, 0x58, 0xf9, 0x54, 0x3d, 0xe1, 0xbd, 0x16, 0x41, 0xbd, ++ 0xa5, 0x7f, 0xdb, 0xc1, 0x9b, 0xc5, 0x84, 0xb3, 0xa1, 0xac, 0xf1, 0xf0, ++ 0xb7, 0x35, 0x3c, 0xbc, 0x1d, 0xa9, 0xea, 0x13, 0x39, 0x33, 0x09, 0xcd, ++ 0x75, 0x8b, 0x9d, 0x9b, 0x4a, 0xc3, 0xd3, 0xf4, 0x7d, 0x9e, 0x1a, 0xdb, ++ 0x7d, 0x9f, 0x21, 0x1f, 0x9b, 0x32, 0xba, 0xd8, 0x53, 0xd3, 0x1f, 0xfa, ++ 0xce, 0xcc, 0xdf, 0xb4, 0xec, 0xd4, 0x31, 0x39, 0x5e, 0xc4, 0xad, 0xec, ++ 0x7b, 0xfc, 0x10, 0xd5, 0xbb, 0x4d, 0xf1, 0xce, 0x0f, 0xf1, 0xce, 0x3f, ++ 0xe4, 0xf3, 0x44, 0x29, 0x99, 0xed, 0xe1, 0x9d, 0x9f, 0xe4, 0xf3, 0x64, ++ 0xa9, 0xb5, 0x4e, 0x9f, 0x31, 0x39, 0x15, 0xb2, 0x0e, 0xbc, 0xac, 0x4a, ++ 0xf1, 0x4a, 0x38, 0xd8, 0x03, 0x1b, 0x68, 0x38, 0x38, 0xc7, 0xcf, 0xfa, ++ 0xb7, 0x25, 0x5d, 0xe3, 0x34, 0xe7, 0x0f, 0xea, 0x9a, 0x9c, 0xb9, 0x52, ++ 0x5c, 0x52, 0x1f, 0x79, 0x32, 0x7c, 0x1a, 0xa7, 0xd4, 0x7c, 0xa4, 0x66, ++ 0xe6, 0x0b, 0x39, 0xbd, 0xc2, 0x90, 0xee, 0x22, 0xb3, 0xca, 0xd5, 0x9d, ++ 0x35, 0xae, 0xf6, 0xa6, 0x6e, 0xac, 0xab, 0xde, 0x21, 0xe5, 0x1c, 0xc1, ++ 0x3c, 0x62, 0x5f, 0xd7, 0x54, 0xcd, 0x3f, 0xfa, 0x33, 0xf5, 0x9d, 0x15, ++ 0x26, 0x4c, 0xfa, 0x21, 0xbc, 0x55, 0x8f, 0x45, 0x6b, 0xbf, 0xf9, 0xa4, ++ 0x7c, 0xdd, 0x0b, 0x4e, 0xc7, 0x7b, 0xf8, 0x9d, 0xee, 0x05, 0x3f, 0x51, ++ 0xb9, 0x78, 0xcf, 0x67, 0x9c, 0x55, 0x40, 0x17, 0xb5, 0xc7, 0xfb, 0xe4, ++ 0x84, 0x0e, 0xaa, 0x28, 0x81, 0x53, 0xec, 0xc3, 0x8e, 0x74, 0x25, 0x9d, ++ 0x5d, 0xdc, 0x2f, 0x74, 0x1c, 0x72, 0xc1, 0x4e, 0xea, 0x4c, 0xce, 0x29, ++ 0x77, 0x70, 0x8d, 0xe6, 0xc2, 0xfb, 0xe8, 0x9b, 0xdf, 0xb6, 0x5b, 0x9e, ++ 0x8f, 0x5d, 0xa5, 0xe7, 0x0c, 0xcb, 0xd3, 0x7e, 0x49, 0x65, 0x76, 0xd1, ++ 0x9e, 0xb3, 0xb4, 0x27, 0xe2, 0x85, 0xe4, 0xc6, 0x54, 0x65, 0x7d, 0xc1, ++ 0xd2, 0x76, 0x54, 0xec, 0xe1, 0x98, 0xe6, 0x3c, 0xd9, 0x7f, 0x8a, 0x35, ++ 0x76, 0x0b, 0xf4, 0xef, 0x14, 0xda, 0x86, 0xb6, 0xc4, 0x16, 0xda, 0x73, ++ 0x38, 0x5e, 0xe1, 0x53, 0x7e, 0xc7, 0xf3, 0x4a, 0xc6, 0xfa, 0x7a, 0xe2, ++ 0xfd, 0x8a, 0x74, 0x82, 0xb1, 0xed, 0xa2, 0xbe, 0xaf, 0xc6, 0x79, 0x5f, ++ 0x05, 0xcb, 0xff, 0x03, 0x49, 0xf3, 0x2d, 0xe4, 0x60, 0x17, 0x00, 0x00, ++ 0x00 }; + + static const u32 bnx2_TPAT_b06FwData[(0x0/4) + 1] = { 0x0 }; + static const u32 bnx2_TPAT_b06FwRodata[(0x0/4) + 1] = { 0x0 }; + + static struct fw_info bnx2_tpat_fw_06 = { +- /* Firmware version: 4.0.5 */ +- .ver_major = 0x4, +- .ver_minor = 0x0, +- .ver_fix = 0x5, +- +- .start_addr = 0x08000888, +- +- .text_addr = 0x08000800, +- .text_len = 0x1a90, ++ /* Firmware version: 5.0.0g */ ++ .ver_major = 0x5, ++ .ver_minor = 0x0, ++ .ver_fix = 0x0, ++ ++ .start_addr = 0x08000488, ++ ++ .text_addr = 0x08000400, ++ .text_len = 0x175c, + .text_index = 0x0, + .gz_text = bnx2_TPAT_b06FwText, + .gz_text_len = sizeof(bnx2_TPAT_b06FwText), +@@ -3686,11 +3576,11 @@ + .data_index = 0x0, + .data = bnx2_TPAT_b06FwData, + +- .sbss_addr = 0x080022c0, ++ .sbss_addr = 0x08001b80, + .sbss_len = 0x44, + .sbss_index = 0x0, + +- .bss_addr = 0x08002304, ++ .bss_addr = 0x08001bc4, + .bss_len = 0x450, + .bss_index = 0x0, + +@@ -3717,862 +3607,876 @@ + }; + + static u8 bnx2_TXP_b06FwText[] = { +- 0xad, 0x7b, 0x7f, 0x70, 0x9b, 0x75, 0x7a, 0xe7, 0xe7, 0xd5, 0x0f, 0x5b, +- 0xb2, 0x65, 0x59, 0x0e, 0x4a, 0x90, 0x77, 0xbd, 0x8d, 0x5e, 0xf4, 0xca, +- 0x16, 0xd8, 0x49, 0x5e, 0x25, 0xce, 0xc6, 0x59, 0xab, 0x44, 0x75, 0x1c, +- 0xdb, 0x71, 0x1c, 0x30, 0xc1, 0xdd, 0x3a, 0x3d, 0xae, 0xf1, 0x25, 0x26, +- 0x31, 0x10, 0xc0, 0xe9, 0xa6, 0x7b, 0x62, 0x8f, 0xd6, 0xc2, 0x76, 0x82, +- 0x43, 0x64, 0xbf, 0xce, 0x2a, 0x59, 0x87, 0x4e, 0x67, 0xd6, 0x60, 0x07, +- 0x07, 0x56, 0x8e, 0x60, 0xdb, 0x6b, 0xbb, 0x73, 0xbb, 0x83, 0x8e, 0x40, +- 0xf0, 0x72, 0x01, 0xb6, 0xfd, 0xa3, 0x47, 0x6f, 0xee, 0xda, 0xcc, 0x02, +- 0x59, 0xa0, 0x4b, 0xa0, 0x3b, 0x7b, 0x53, 0x67, 0x0b, 0xbc, 0xf7, 0x79, +- 0xde, 0x57, 0x4a, 0xb2, 0x94, 0x4e, 0x67, 0x3a, 0xe7, 0x19, 0x8f, 0xac, +- 0xf7, 0xc7, 0xf3, 0x7d, 0x7e, 0x3f, 0x9f, 0xe7, 0xf9, 0x7e, 0x5d, 0x0f, +- 0x54, 0xa0, 0xf8, 0x53, 0xc5, 0xdf, 0xe6, 0xe1, 0xd4, 0xe1, 0x8d, 0x6b, +- 0xf5, 0xb5, 0xd6, 0x05, 0x37, 0x5c, 0x72, 0xf3, 0xab, 0x0a, 0x30, 0xf0, +- 0x01, 0xfe, 0x5d, 0x3f, 0x5f, 0xf9, 0xf7, 0xbd, 0x66, 0xfd, 0x38, 0x81, +- 0x40, 0x89, 0x2f, 0xf9, 0x85, 0xc7, 0x91, 0x40, 0x6b, 0x9b, 0x06, 0x8f, +- 0x33, 0xf1, 0x67, 0x89, 0x7d, 0x1a, 0x90, 0xcc, 0x35, 0x86, 0xb7, 0xe2, +- 0x53, 0x33, 0x1d, 0x74, 0x41, 0xae, 0x7f, 0x25, 0xf1, 0xc9, 0xc8, 0x8f, +- 0x36, 0xa9, 0x1f, 0xcf, 0x3a, 0xe1, 0x09, 0x24, 0x4e, 0x23, 0x50, 0x0f, +- 0x4f, 0x1d, 0xdf, 0xf9, 0x93, 0x86, 0x6a, 0x27, 0xfc, 0x25, 0x5a, 0x2d, +- 0x18, 0x33, 0x90, 0xf6, 0x24, 0x86, 0x51, 0xbe, 0x11, 0x78, 0x37, 0x13, +- 0xd5, 0xc7, 0x80, 0x69, 0x47, 0x22, 0x1a, 0x7e, 0x09, 0x3a, 0x8e, 0xe4, +- 0xc3, 0x68, 0xe7, 0xef, 0x76, 0xe3, 0x33, 0x33, 0xec, 0x46, 0xda, 0xc9, +- 0xe7, 0xf6, 0x36, 0x03, 0xdb, 0x32, 0x3a, 0x8e, 0x1a, 0xf0, 0xd4, 0x26, +- 0x1e, 0xc5, 0x66, 0x7e, 0xfa, 0x13, 0x29, 0xbc, 0x31, 0x19, 0x09, 0x3f, +- 0x03, 0xb5, 0x5f, 0x73, 0xaa, 0x29, 0xa0, 0x71, 0x68, 0x50, 0x51, 0x07, +- 0xde, 0x54, 0xd4, 0xde, 0x49, 0x05, 0x1e, 0x85, 0xcf, 0x35, 0xe6, 0xe4, +- 0x33, 0x85, 0xdb, 0x72, 0x1e, 0x5c, 0x72, 0xca, 0xfa, 0xbf, 0x49, 0x7d, +- 0x2b, 0x70, 0x69, 0x2d, 0x18, 0x27, 0x0f, 0xee, 0x84, 0x82, 0xa7, 0x9b, +- 0xa3, 0xa1, 0x51, 0xc8, 0xfd, 0x30, 0xb6, 0xe6, 0xe5, 0x53, 0xa5, 0xd4, +- 0xa6, 0x39, 0xae, 0x9b, 0xe6, 0x19, 0xbd, 0x1c, 0xe9, 0x80, 0x1a, 0x02, +- 0x14, 0x8c, 0xea, 0x0e, 0x24, 0x03, 0x6d, 0x61, 0x17, 0xd4, 0xd0, 0xbd, +- 0xf8, 0x67, 0xca, 0x9c, 0x8c, 0xb9, 0x61, 0x3f, 0x3f, 0x80, 0x72, 0x14, +- 0x02, 0xb6, 0xd6, 0x9e, 0xce, 0x98, 0xe6, 0x05, 0xcd, 0x85, 0x33, 0xd4, +- 0xcf, 0x68, 0xee, 0x9f, 0xcd, 0x02, 0x75, 0x33, 0xae, 0x95, 0xd6, 0xf7, +- 0x60, 0x36, 0x60, 0x9a, 0x73, 0xbc, 0x77, 0x34, 0x57, 0xd2, 0xb3, 0x69, +- 0x3a, 0x34, 0xd3, 0xdc, 0xa7, 0xfd, 0xca, 0xdc, 0xfb, 0x6b, 0xcf, 0x9a, +- 0xe6, 0x13, 0xfa, 0x4d, 0x38, 0x9b, 0x6d, 0x57, 0xba, 0x17, 0x56, 0xf9, +- 0xb7, 0xcf, 0x98, 0xb8, 0xa0, 0x23, 0xe0, 0x48, 0x74, 0x28, 0xdb, 0x17, +- 0xba, 0x94, 0x6d, 0xf9, 0x5d, 0x4a, 0xc7, 0xdc, 0xef, 0x2a, 0x5d, 0x0b, +- 0x03, 0x4a, 0x67, 0x3e, 0x84, 0x79, 0x23, 0x88, 0x39, 0xa3, 0x5f, 0x69, +- 0x5f, 0xe8, 0x53, 0x6c, 0x39, 0x52, 0x4a, 0x5b, 0xbe, 0x44, 0xeb, 0xba, +- 0x1e, 0xb7, 0x67, 0x12, 0x98, 0x30, 0xca, 0xb9, 0xce, 0xb2, 0xf9, 0xa3, +- 0x86, 0x65, 0xca, 0xa9, 0xe3, 0x58, 0xfe, 0x09, 0xec, 0x9c, 0x31, 0xcd, +- 0x5c, 0x1c, 0xc8, 0xe5, 0x81, 0xef, 0x19, 0x91, 0xde, 0x21, 0xc5, 0x34, +- 0x3b, 0xa3, 0xe6, 0xea, 0xcb, 0x7a, 0x63, 0xec, 0x65, 0xfc, 0x93, 0x39, +- 0x1b, 0x44, 0xda, 0x47, 0x1a, 0xc7, 0x69, 0xb3, 0xfb, 0x27, 0xe1, 0x29, +- 0x4f, 0x8c, 0xe3, 0x67, 0x19, 0x78, 0xca, 0x12, 0x69, 0x5c, 0xc8, 0x8c, +- 0x06, 0x3c, 0x88, 0x84, 0xb6, 0x2b, 0xe9, 0x94, 0x03, 0xea, 0xf0, 0xdb, +- 0x50, 0xc3, 0xb4, 0xc7, 0xd2, 0x79, 0x45, 0x2d, 0xbc, 0x0c, 0x35, 0xf9, +- 0x2b, 0x45, 0xed, 0xaa, 0x75, 0x22, 0xe9, 0x88, 0x7a, 0xf0, 0xa3, 0x06, +- 0xb1, 0xc9, 0x38, 0xd6, 0x5a, 0xb6, 0x49, 0xe3, 0xd6, 0x6b, 0xb6, 0x49, +- 0x60, 0x94, 0x7c, 0x1d, 0x25, 0x5f, 0xaf, 0xe8, 0x6a, 0xe8, 0x69, 0x98, +- 0xab, 0x07, 0x75, 0xb9, 0x97, 0xc0, 0x78, 0xde, 0x0c, 0xfb, 0x13, 0x97, +- 0xc8, 0x2f, 0xd2, 0x5f, 0x4a, 0x78, 0xd2, 0xd5, 0x89, 0x4f, 0xcd, 0xd7, +- 0x37, 0x86, 0xf0, 0x62, 0x3e, 0x88, 0x17, 0xf2, 0x01, 0x3c, 0x9f, 0x6f, +- 0x87, 0x91, 0x87, 0x7f, 0x67, 0xfe, 0x8b, 0xfc, 0xd8, 0x84, 0x8f, 0xcf, +- 0x93, 0x6f, 0xff, 0x8e, 0xbc, 0x6b, 0xa0, 0x2c, 0x81, 0xde, 0x1f, 0x67, +- 0x46, 0xcc, 0x0a, 0x0d, 0x03, 0x35, 0x09, 0x2d, 0x79, 0x9b, 0xe2, 0x6b, +- 0xa1, 0x1f, 0xf6, 0xbe, 0x9a, 0x6b, 0x71, 0x69, 0x53, 0x5e, 0xb8, 0xa9, +- 0xff, 0x6d, 0x79, 0xd3, 0x1c, 0xd3, 0x0f, 0xad, 0xdb, 0xdb, 0xf2, 0xa7, +- 0x85, 0x5e, 0xad, 0x07, 0xe9, 0xfc, 0x20, 0xe0, 0x4f, 0xf0, 0x93, 0xa1, +- 0xb8, 0xab, 0xa9, 0x3d, 0x7c, 0xee, 0x41, 0x97, 0xed, 0xcf, 0xe4, 0x81, +- 0x7a, 0x7f, 0xc1, 0x20, 0x0f, 0xc6, 0xb4, 0x1f, 0x15, 0x61, 0xca, 0xf7, +- 0x13, 0xf2, 0x19, 0xc3, 0xf7, 0xf3, 0x1a, 0x79, 0x6b, 0x22, 0x8f, 0x61, +- 0xf2, 0xe7, 0xc1, 0xde, 0xac, 0x3a, 0x9d, 0x86, 0x3a, 0x31, 0x8b, 0x35, +- 0x48, 0x06, 0x03, 0xf4, 0xc1, 0x3f, 0x86, 0x4d, 0xa3, 0x07, 0x53, 0x06, +- 0xd6, 0x07, 0x12, 0xb4, 0x6f, 0x1c, 0x8f, 0x96, 0x21, 0x3a, 0xf0, 0xb1, +- 0xa2, 0xe0, 0xf5, 0x68, 0x0f, 0x26, 0x29, 0x4f, 0x4f, 0xce, 0x8b, 0x07, +- 0xb2, 0x15, 0xb8, 0x2f, 0x6b, 0xe2, 0xfe, 0x38, 0x12, 0x15, 0x94, 0x27, +- 0x16, 0x8f, 0x86, 0xdf, 0x83, 0x0b, 0xed, 0xb9, 0x1e, 0xc6, 0xd2, 0x56, +- 0x24, 0xcb, 0x3c, 0xd8, 0x9a, 0xf3, 0x31, 0x1e, 0x93, 0x38, 0x3d, 0xe3, +- 0x81, 0x7b, 0x83, 0x03, 0xb3, 0xc1, 0x32, 0xc4, 0xea, 0x1d, 0xfc, 0x0d, +- 0xfa, 0xdb, 0x66, 0xea, 0xfc, 0xdb, 0x0c, 0x17, 0x0e, 0x18, 0x0e, 0x8c, +- 0x64, 0x4d, 0xb3, 0x5d, 0x37, 0x71, 0x75, 0x43, 0x00, 0x3f, 0xa0, 0xfe, +- 0x0e, 0x19, 0x21, 0x9c, 0xcd, 0x3f, 0x4e, 0x5e, 0x82, 0x36, 0xbf, 0x06, +- 0x79, 0x37, 0xc8, 0xbb, 0x41, 0xbe, 0x0d, 0xe1, 0xf3, 0x3c, 0x63, 0x46, +- 0xa7, 0x5c, 0x5e, 0xf2, 0x50, 0x89, 0x21, 0xf2, 0x11, 0x89, 0x9b, 0x70, +- 0xc4, 0xd5, 0xf4, 0x5e, 0x26, 0xaf, 0xd5, 0xf5, 0xa6, 0xf9, 0xf1, 0x06, +- 0x91, 0x85, 0x36, 0x77, 0xf4, 0x48, 0x8c, 0xfe, 0x56, 0x15, 0xe3, 0xea, +- 0x6f, 0xa9, 0xb7, 0x27, 0xf3, 0x5e, 0xa4, 0xb2, 0x96, 0xdf, 0x1e, 0x2e, +- 0x23, 0xdf, 0xc2, 0x57, 0x5e, 0x8b, 0x32, 0x46, 0xa3, 0xfd, 0x8c, 0x51, +- 0xec, 0x20, 0xcf, 0xf7, 0x1b, 0xd1, 0x96, 0x5d, 0x8a, 0x0b, 0x9d, 0xb9, +- 0xa0, 0xbf, 0xfd, 0x06, 0x3e, 0x29, 0xaf, 0xc4, 0x20, 0x65, 0x0d, 0x90, +- 0xbf, 0x20, 0xf6, 0x91, 0xcf, 0x17, 0x8a, 0x7c, 0xce, 0xe5, 0x65, 0xad, +- 0xcf, 0xf3, 0x5a, 0xe2, 0x13, 0xe9, 0x15, 0x89, 0xa0, 0x82, 0x0a, 0x1f, +- 0x76, 0xe5, 0xde, 0xa2, 0x2d, 0xea, 0xf0, 0xa7, 0xb4, 0xc1, 0x8b, 0x8c, +- 0x91, 0xef, 0x5f, 0xf3, 0x17, 0xb1, 0xc7, 0x63, 0xb4, 0x83, 0x7a, 0x3a, +- 0x0d, 0x1f, 0x06, 0xf2, 0x49, 0x1c, 0x99, 0x41, 0x72, 0x5e, 0x3f, 0xce, +- 0x78, 0x5f, 0x05, 0xa7, 0x56, 0x9e, 0x0c, 0x68, 0x15, 0xd8, 0x37, 0x17, +- 0xc4, 0x70, 0xbe, 0x0d, 0x46, 0x36, 0x88, 0x83, 0xf4, 0xcd, 0x2b, 0xf1, +- 0xe4, 0xfd, 0x7e, 0x08, 0xef, 0x41, 0x3c, 0xc0, 0x77, 0x9e, 0x98, 0x09, +- 0x62, 0x88, 0x3a, 0xda, 0x1e, 0x8f, 0xb6, 0x78, 0x79, 0xed, 0x00, 0xaf, +- 0x1d, 0xa5, 0xfe, 0xcf, 0xeb, 0x93, 0x18, 0xe8, 0x55, 0x63, 0x40, 0x10, +- 0xfb, 0x0d, 0x04, 0xe8, 0xc2, 0x8f, 0x31, 0xbf, 0xc5, 0xce, 0xf3, 0xfb, +- 0xbd, 0xf9, 0x0a, 0xca, 0xe9, 0x47, 0x48, 0xfb, 0xc4, 0x74, 0x37, 0x9b, +- 0xe6, 0x77, 0xf5, 0xe8, 0xd2, 0x4f, 0x9d, 0x2e, 0x3c, 0x92, 0x77, 0x20, +- 0x35, 0x57, 0x81, 0xdf, 0xcf, 0xba, 0x70, 0x57, 0x7d, 0x05, 0x0e, 0xcd, +- 0x25, 0x31, 0x36, 0x53, 0x81, 0xc1, 0x2c, 0x56, 0xef, 0xd7, 0xc7, 0x6a, +- 0xca, 0xa0, 0x2e, 0xb7, 0x23, 0x86, 0xab, 0xb4, 0xc3, 0x23, 0x73, 0x3e, +- 0x7f, 0xff, 0x4c, 0x00, 0xa9, 0x05, 0x2f, 0x9f, 0x77, 0xf0, 0xf9, 0x72, +- 0xe8, 0xeb, 0x23, 0xa9, 0x00, 0x84, 0xc7, 0x4a, 0x3c, 0x34, 0xe7, 0xc5, +- 0x83, 0xd9, 0x00, 0x0e, 0xce, 0x34, 0x63, 0xda, 0x48, 0xe2, 0x18, 0x73, +- 0xc7, 0xf7, 0xe2, 0x6a, 0xef, 0x41, 0x45, 0x4d, 0x6e, 0x53, 0x92, 0x68, +- 0x88, 0xbb, 0x71, 0x89, 0x79, 0xc8, 0x1d, 0x6f, 0x6c, 0x79, 0x9e, 0xb9, +- 0xa1, 0x2c, 0x11, 0xe4, 0x77, 0x75, 0x82, 0x31, 0x9b, 0x74, 0x3b, 0x36, +- 0x00, 0x2b, 0x25, 0x7e, 0x83, 0xfe, 0x6e, 0x23, 0xe0, 0xef, 0xce, 0xd7, +- 0xf9, 0xb7, 0x1b, 0x21, 0xff, 0x76, 0xc6, 0xd7, 0x36, 0xf1, 0x47, 0xc3, +- 0x83, 0xe3, 0xf1, 0x4f, 0xcd, 0x81, 0x1a, 0x2b, 0x9f, 0xf9, 0x77, 0xce, +- 0xa8, 0xe9, 0x59, 0xa8, 0x3a, 0xab, 0x01, 0x26, 0x17, 0x5c, 0xb4, 0x9f, +- 0x82, 0x1a, 0xad, 0x99, 0x79, 0x3c, 0x80, 0x87, 0x98, 0x53, 0xfe, 0x9a, +- 0x39, 0x65, 0x70, 0x2a, 0x12, 0x98, 0x86, 0x97, 0xfa, 0x06, 0xf6, 0x9e, +- 0x0b, 0xd2, 0xe6, 0x5d, 0x78, 0x9c, 0x7c, 0x6d, 0xdf, 0x18, 0xc4, 0x7d, +- 0xf9, 0x80, 0xbf, 0x8b, 0xf6, 0x7b, 0x2f, 0x17, 0xf2, 0x6f, 0xa5, 0x2d, +- 0xdf, 0xce, 0xa9, 0xe1, 0x02, 0xfe, 0xaf, 0xf8, 0x53, 0x0c, 0x0e, 0x60, +- 0xff, 0x94, 0x1b, 0x85, 0xa0, 0xac, 0x45, 0x9d, 0x1b, 0x2f, 0x9a, 0x3e, +- 0x4d, 0x3b, 0x7d, 0x90, 0xba, 0xfe, 0x46, 0xde, 0x87, 0x07, 0x0d, 0x35, +- 0xf6, 0x7d, 0xc5, 0x47, 0x9d, 0x7a, 0xa8, 0x07, 0x26, 0x98, 0x55, 0xf2, +- 0x5c, 0x1c, 0xe1, 0x55, 0x76, 0xae, 0x3d, 0x34, 0x27, 0x7e, 0x42, 0xdb, +- 0x1b, 0xf4, 0x01, 0xfa, 0xcf, 0xf7, 0xaf, 0xc5, 0xaa, 0x1a, 0x48, 0x5b, +- 0xb9, 0x3b, 0x46, 0x7f, 0xb1, 0x75, 0x74, 0x62, 0x46, 0xf4, 0xa0, 0x4e, +- 0xc3, 0x91, 0xc4, 0xba, 0xf5, 0x7f, 0x6d, 0x5e, 0x5a, 0x29, 0xfa, 0x08, +- 0x60, 0x84, 0x3a, 0x3c, 0x6d, 0x98, 0xe6, 0xd5, 0x0d, 0x1f, 0x9a, 0x2d, +- 0x37, 0x8b, 0x5e, 0x44, 0xd6, 0x1f, 0x28, 0x52, 0x47, 0x6a, 0x34, 0xff, +- 0xff, 0x07, 0x5f, 0xf9, 0xa6, 0x39, 0x60, 0xc9, 0x27, 0xfe, 0xe2, 0xa2, +- 0x2f, 0x3e, 0x4e, 0xda, 0x0e, 0x0c, 0x90, 0xde, 0xc3, 0x86, 0xf9, 0x51, +- 0x6d, 0xe2, 0x33, 0xb3, 0x65, 0x93, 0x36, 0xbc, 0xac, 0xfc, 0x4f, 0x5e, +- 0x0f, 0xe2, 0xa1, 0x7c, 0x0b, 0x75, 0xd7, 0x8e, 0x27, 0xa8, 0xc3, 0xa3, +- 0x86, 0xe4, 0xc4, 0x10, 0xfd, 0xb9, 0x8e, 0xfe, 0xed, 0x52, 0xb6, 0x19, +- 0x39, 0x6c, 0x9f, 0x4c, 0xa3, 0x93, 0xfe, 0xbe, 0x94, 0x89, 0xb4, 0x3c, +- 0x0b, 0x35, 0x4d, 0x19, 0xfc, 0x5d, 0xd4, 0x71, 0xbb, 0xa1, 0x76, 0x89, +- 0x4d, 0xdb, 0x99, 0x97, 0x5e, 0xca, 0x84, 0xfc, 0x6d, 0x79, 0xd1, 0x77, +- 0x9d, 0x7f, 0x6b, 0xfe, 0xab, 0xb4, 0xbd, 0x82, 0xcd, 0x6b, 0x3c, 0xcc, +- 0x33, 0x77, 0xc1, 0xb6, 0xab, 0x6d, 0xbb, 0xd7, 0xe3, 0x8d, 0x03, 0x1f, +- 0x32, 0x3f, 0xa5, 0x57, 0xda, 0xd7, 0x52, 0xbc, 0x56, 0xbd, 0x01, 0xfe, +- 0x3b, 0xe9, 0x07, 0x7b, 0xe8, 0x07, 0x57, 0x37, 0x7c, 0x6a, 0x86, 0x6f, +- 0xb2, 0xfd, 0xa0, 0x6d, 0xc6, 0xe5, 0xef, 0xa0, 0x9e, 0xb6, 0xe9, 0x0a, +- 0xe6, 0xf4, 0x0c, 0x06, 0xae, 0x61, 0x87, 0xe4, 0xec, 0x59, 0x3d, 0xc9, +- 0x3c, 0xf2, 0x9b, 0x70, 0xd5, 0x60, 0xf6, 0x59, 0xfd, 0x71, 0x84, 0x6d, +- 0xdf, 0xc1, 0xc1, 0xac, 0x17, 0xe9, 0xbb, 0x02, 0x98, 0x6f, 0x08, 0xe0, +- 0x61, 0xd2, 0xbe, 0x12, 0x6f, 0x1c, 0x7a, 0x83, 0x3a, 0x98, 0xad, 0x91, +- 0x6b, 0x49, 0xfc, 0xa5, 0xfe, 0x28, 0x70, 0x93, 0xbd, 0xf6, 0x82, 0xc4, +- 0xe8, 0x42, 0x33, 0x8e, 0xe6, 0xfb, 0x15, 0x3b, 0x6f, 0xaa, 0x5d, 0x49, +- 0xfc, 0xc4, 0x94, 0x5c, 0xba, 0x60, 0x30, 0xc7, 0x51, 0x1f, 0xe3, 0xf4, +- 0xa3, 0xd1, 0x5c, 0x9d, 0xbf, 0x93, 0x7e, 0xf4, 0x78, 0x4e, 0x64, 0x8a, +- 0xea, 0xba, 0xb3, 0x96, 0xb5, 0x99, 0xfa, 0x31, 0xac, 0x9a, 0x5f, 0x1d, +- 0xd0, 0x8e, 0x61, 0xda, 0xe2, 0x2d, 0xa5, 0xf4, 0x13, 0x63, 0x30, 0x64, +- 0xaa, 0xcb, 0xb5, 0x43, 0x78, 0xdc, 0xba, 0x16, 0xf4, 0xef, 0x9e, 0x49, +- 0x3a, 0x1c, 0x1a, 0x02, 0x95, 0x89, 0x76, 0x65, 0x37, 0xeb, 0x6e, 0xc7, +- 0x4c, 0x87, 0xd2, 0xb1, 0x20, 0x31, 0xd0, 0xa5, 0x6c, 0x67, 0xcd, 0x4d, +- 0xb2, 0xe6, 0x26, 0x59, 0x73, 0x93, 0xe4, 0x23, 0xc9, 0x5a, 0xdb, 0x96, +- 0x4f, 0x29, 0x3b, 0x44, 0xff, 0xf4, 0xaf, 0xe7, 0x0d, 0x1b, 0x47, 0x30, +- 0x07, 0xf9, 0x3b, 0xf3, 0x6b, 0x1d, 0x36, 0xb6, 0x4b, 0x29, 0x45, 0x2c, +- 0xe3, 0xa9, 0xd0, 0x58, 0xcb, 0x8c, 0x94, 0xd2, 0xcd, 0x7a, 0xdb, 0x6f, +- 0xe9, 0x32, 0x32, 0xfc, 0x0e, 0xeb, 0xec, 0xeb, 0xac, 0xb3, 0xb9, 0x38, +- 0xe3, 0x6a, 0xcd, 0x55, 0x73, 0x60, 0xa5, 0x5d, 0x13, 0xc6, 0xc8, 0xef, +- 0x77, 0x69, 0xb3, 0x02, 0x6b, 0x69, 0xbb, 0x53, 0xc1, 0x7e, 0x0d, 0xd5, +- 0xb5, 0xcc, 0xa9, 0x47, 0xf3, 0xac, 0x03, 0x7a, 0xa4, 0xe5, 0x7d, 0x2a, +- 0xf6, 0xa8, 0xe6, 0xc6, 0xd5, 0x9b, 0x08, 0x76, 0xb4, 0x36, 0x1c, 0xcf, +- 0x96, 0x63, 0x28, 0x9e, 0x5c, 0xe1, 0x21, 0x56, 0xe9, 0x6a, 0xc6, 0xa3, +- 0x5c, 0x5a, 0x09, 0x25, 0xa2, 0xf4, 0x1b, 0x24, 0xa7, 0x58, 0x27, 0x26, +- 0x8d, 0xaf, 0x22, 0xc7, 0x7a, 0x3a, 0xaf, 0xbb, 0xf0, 0x7a, 0x6e, 0x2d, +- 0xf3, 0x5c, 0x54, 0xf7, 0x29, 0x15, 0x8c, 0xdf, 0x04, 0x32, 0x86, 0xe4, +- 0x27, 0xd3, 0x9c, 0x17, 0x1e, 0xa2, 0xd1, 0xe4, 0x28, 0x24, 0x67, 0x99, +- 0xab, 0xef, 0x8d, 0x97, 0x61, 0x73, 0xd4, 0x8f, 0xd5, 0xda, 0x80, 0xd2, +- 0x95, 0x8f, 0xea, 0xe7, 0xf1, 0xbb, 0xca, 0x9e, 0x85, 0x04, 0x63, 0xbb, +- 0x9f, 0xba, 0xa9, 0xc0, 0xa5, 0xa0, 0xf0, 0x88, 0x6a, 0xb7, 0xe6, 0xc0, +- 0xbb, 0x77, 0x2b, 0x08, 0x68, 0x49, 0x5c, 0x68, 0x0e, 0xd0, 0xaf, 0xba, +- 0x88, 0x31, 0xc2, 0x70, 0x2e, 0x86, 0xfc, 0x3b, 0x68, 0x8b, 0xca, 0xc5, +- 0x3a, 0xda, 0x87, 0xbe, 0x47, 0x1d, 0xb6, 0x51, 0x87, 0xdd, 0x73, 0x08, +- 0x54, 0x24, 0xfa, 0x94, 0x8e, 0x7c, 0xbb, 0xd2, 0x9e, 0x57, 0xa9, 0x27, +- 0xd1, 0xc9, 0x37, 0x89, 0x95, 0xc4, 0x57, 0x4a, 0xb6, 0x14, 0x7f, 0xbd, +- 0xd1, 0x9e, 0xfd, 0x0e, 0x89, 0xb9, 0xcd, 0x6b, 0x12, 0x8c, 0x47, 0x07, +- 0xf9, 0x12, 0x1e, 0x3c, 0xa8, 0x6e, 0x30, 0x57, 0x5f, 0x89, 0x33, 0x79, +- 0x56, 0x24, 0x30, 0x95, 0xef, 0xa1, 0x5d, 0x36, 0x14, 0xfd, 0x2b, 0xe0, +- 0xdf, 0x36, 0xd3, 0xae, 0x6c, 0x5b, 0x58, 0xe1, 0xef, 0xa5, 0x0d, 0x7b, +- 0x17, 0x42, 0x42, 0x97, 0xeb, 0x8b, 0x6d, 0x93, 0x70, 0x68, 0xff, 0x9a, +- 0x2d, 0xbf, 0x41, 0x5a, 0x62, 0x4f, 0x6f, 0xc9, 0x4f, 0xfd, 0x7b, 0x66, +- 0x92, 0x78, 0x77, 0x83, 0x9b, 0x35, 0xb5, 0x84, 0x29, 0xaa, 0x8a, 0x9f, +- 0xa7, 0x1d, 0xd0, 0x52, 0x4a, 0x97, 0xf8, 0x91, 0xdb, 0x5e, 0xf3, 0xce, +- 0x19, 0xb8, 0x09, 0x15, 0xc2, 0x4e, 0x62, 0xba, 0x0f, 0xe3, 0xd1, 0x81, +- 0x73, 0x4a, 0x8f, 0xd2, 0x93, 0x97, 0x1a, 0x6c, 0xfb, 0x54, 0x1b, 0x7d, +- 0xaa, 0x9d, 0xfc, 0xb4, 0xd3, 0xa7, 0xba, 0xc9, 0x4f, 0xb7, 0xe5, 0x53, +- 0xe2, 0x9b, 0xbf, 0xce, 0xcb, 0xd6, 0xfc, 0x1e, 0x4b, 0x2f, 0x3b, 0xf8, +- 0x6e, 0x17, 0xe5, 0xe8, 0xe2, 0x7b, 0x7b, 0xf8, 0xde, 0x9e, 0x85, 0xff, +- 0x2d, 0xfc, 0x51, 0x16, 0x3b, 0xf6, 0xaf, 0xd7, 0x34, 0xc9, 0x01, 0xaf, +- 0x15, 0x31, 0x05, 0xd2, 0x8e, 0x84, 0xe4, 0x88, 0x61, 0xf4, 0x36, 0xc3, +- 0xb3, 0x22, 0xf1, 0x93, 0xd6, 0x5d, 0xf5, 0xcc, 0x67, 0xcc, 0xa7, 0x9e, +- 0x29, 0x62, 0x69, 0xe6, 0xe8, 0xf9, 0x16, 0x05, 0x63, 0xfa, 0xcd, 0x8c, +- 0x53, 0x1d, 0x13, 0x79, 0xb5, 0x2b, 0xcc, 0x7b, 0x4d, 0x93, 0x82, 0xf1, +- 0x0f, 0xa2, 0x8d, 0xb8, 0x2e, 0x94, 0x18, 0x42, 0xc8, 0x88, 0x84, 0x26, +- 0x14, 0x75, 0x68, 0x2b, 0xd4, 0x25, 0xd6, 0x86, 0xd4, 0x9c, 0xa2, 0x0e, +- 0xd7, 0x3a, 0xd5, 0xe4, 0x9b, 0x16, 0xbe, 0x3e, 0x88, 0x35, 0x16, 0x86, +- 0x1b, 0x42, 0x8c, 0x58, 0x76, 0x07, 0x69, 0x1e, 0xd8, 0xac, 0xe0, 0xb2, +- 0xfe, 0x21, 0xed, 0xa8, 0x26, 0xd3, 0x8a, 0x8e, 0x0c, 0xf3, 0x44, 0x68, +- 0x4a, 0xb0, 0xfa, 0x41, 0x62, 0x75, 0x78, 0x7c, 0x7c, 0x36, 0x33, 0x19, +- 0x49, 0x79, 0x9c, 0x6a, 0x8c, 0x38, 0x3d, 0x49, 0x9a, 0x7a, 0x9e, 0xf8, +- 0x9d, 0x6b, 0x84, 0xf7, 0x17, 0x69, 0x46, 0x8b, 0x34, 0xb5, 0x1c, 0x18, +- 0x37, 0x13, 0xe8, 0x8c, 0xb2, 0x56, 0x30, 0xe7, 0x1d, 0x93, 0x9e, 0x80, +- 0xf4, 0xca, 0xa7, 0x74, 0x7e, 0x4f, 0x29, 0xbb, 0x25, 0xa6, 0xca, 0x6d, +- 0x2b, 0x54, 0x73, 0x8d, 0xaa, 0xc4, 0x61, 0x2c, 0x5a, 0x6b, 0x0c, 0xcb, +- 0x1a, 0xc3, 0x3f, 0x53, 0xd4, 0xd8, 0x39, 0x45, 0x72, 0x75, 0x63, 0xff, +- 0x39, 0xc6, 0xd0, 0x51, 0x45, 0x6d, 0x39, 0x4e, 0xf1, 0xbd, 0x9a, 0xd0, +- 0x3f, 0x5c, 0x5c, 0x67, 0x18, 0x0d, 0x39, 0xc6, 0x67, 0xde, 0xa3, 0x6c, +- 0xcd, 0xb6, 0x61, 0x6c, 0xae, 0x0d, 0xa3, 0x59, 0x05, 0x7b, 0xf4, 0x95, +- 0xb8, 0x74, 0xb3, 0xd5, 0xa7, 0x54, 0xad, 0xd6, 0x6a, 0x31, 0x12, 0x40, +- 0xb5, 0x43, 0xfb, 0x0a, 0xf6, 0x16, 0x31, 0x7e, 0xe7, 0x89, 0x5e, 0xe6, +- 0x7d, 0x13, 0xef, 0x33, 0x96, 0x22, 0x35, 0x48, 0xba, 0x13, 0x2d, 0xc4, +- 0xe3, 0x75, 0x4e, 0x3b, 0xde, 0xff, 0xc9, 0x63, 0xdb, 0x40, 0xf4, 0xff, +- 0xf9, 0x7b, 0x6d, 0x78, 0x32, 0x5b, 0x86, 0x96, 0x0d, 0xb8, 0x2b, 0x84, +- 0x2a, 0x07, 0x6b, 0xdc, 0x5b, 0xbb, 0x94, 0x14, 0xef, 0x59, 0xcf, 0x7a, +- 0xbe, 0x9c, 0xe8, 0x4d, 0xfc, 0x97, 0x06, 0xb9, 0x6e, 0xe5, 0x8d, 0x1b, +- 0xae, 0x0f, 0x7f, 0xc1, 0x75, 0x05, 0xcf, 0x31, 0x91, 0x7d, 0x8f, 0x35, +- 0x25, 0x97, 0x31, 0xe1, 0x4c, 0xb8, 0x30, 0x34, 0x19, 0xc6, 0xc1, 0xc5, +- 0x20, 0x16, 0x33, 0xea, 0xc0, 0x25, 0xf6, 0x0f, 0x7b, 0x9b, 0x35, 0x3c, +- 0xb8, 0x18, 0xc2, 0x42, 0x06, 0xa6, 0x37, 0xa1, 0x15, 0xbc, 0x4a, 0x0c, +- 0x07, 0x16, 0xeb, 0x70, 0x2e, 0xa3, 0x2d, 0x8d, 0x2a, 0xd1, 0x54, 0x2d, +- 0x71, 0xc7, 0xc3, 0x8b, 0x4d, 0x78, 0x68, 0xd1, 0xc3, 0x77, 0x4c, 0x74, +- 0xc7, 0xeb, 0xf8, 0xbc, 0x03, 0xcf, 0x9e, 0x34, 0x4d, 0xc1, 0x5d, 0x43, +- 0x8b, 0xc0, 0xc2, 0x34, 0x6b, 0xd1, 0x19, 0xd6, 0xa5, 0xa7, 0x80, 0x03, +- 0x4f, 0x39, 0x30, 0x37, 0x6d, 0x62, 0xaf, 0x3e, 0x5a, 0xeb, 0xa0, 0xc3, +- 0x0f, 0xb0, 0x6e, 0xb8, 0x59, 0x03, 0xef, 0x0d, 0xd8, 0xf9, 0xfc, 0x12, +- 0xf3, 0xd4, 0xfd, 0x4f, 0xc5, 0xf0, 0x56, 0x26, 0x8d, 0x6e, 0xe2, 0xf3, +- 0x14, 0x79, 0x79, 0x33, 0xc3, 0x3a, 0xb6, 0xa8, 0xe3, 0x8d, 0x8c, 0x87, +- 0xeb, 0x34, 0xe1, 0xe5, 0x8c, 0x3c, 0x23, 0xcf, 0xfa, 0x30, 0x48, 0x5e, +- 0x5e, 0xcf, 0x84, 0xb8, 0x66, 0x10, 0x3f, 0xe6, 0x73, 0xf7, 0x2d, 0x6a, +- 0xac, 0x5b, 0x1e, 0xae, 0x1b, 0xc6, 0xab, 0x19, 0x1f, 0x79, 0x0d, 0xb2, +- 0x56, 0x0d, 0x62, 0x2c, 0xd3, 0xb8, 0xb4, 0x95, 0x89, 0xda, 0xae, 0x35, +- 0x72, 0xed, 0x1d, 0xb3, 0xc7, 0x8a, 0x45, 0x59, 0xa7, 0xb4, 0xee, 0x20, +- 0x46, 0x33, 0x6f, 0x38, 0x4b, 0xfd, 0xf4, 0x73, 0xd3, 0xcb, 0x16, 0xf6, +- 0x7b, 0xd6, 0xe0, 0xdf, 0x73, 0xc0, 0x39, 0x23, 0x6d, 0x56, 0x27, 0x88, +- 0x75, 0x59, 0xa3, 0x7e, 0xba, 0xb1, 0x89, 0xeb, 0x6a, 0x03, 0x2f, 0x29, +- 0xd2, 0xef, 0xb8, 0x10, 0x7e, 0x4a, 0xf4, 0x45, 0xcc, 0xbc, 0x00, 0xfc, +- 0x25, 0xf1, 0x67, 0xc3, 0xa4, 0x2a, 0x7e, 0xdf, 0x4f, 0x5c, 0xd3, 0x5b, +- 0x40, 0x7d, 0xec, 0x41, 0x8c, 0x98, 0x65, 0xc4, 0xe7, 0xd5, 0xc4, 0xb5, +- 0x8b, 0x4d, 0xac, 0x53, 0x1b, 0x4d, 0xf3, 0x6f, 0x9b, 0x61, 0x3a, 0x12, +- 0x9a, 0x5e, 0xeb, 0x2c, 0x7c, 0xa5, 0x0a, 0xda, 0x92, 0x5f, 0xd1, 0x0a, +- 0x3f, 0x45, 0x74, 0xf8, 0x3c, 0x44, 0xaf, 0xc0, 0xda, 0x45, 0x17, 0xd6, +- 0x51, 0x9e, 0x6d, 0x93, 0x5c, 0x9b, 0xf8, 0x24, 0x4a, 0x99, 0x76, 0x4e, +- 0x12, 0x73, 0x69, 0x3e, 0xac, 0xa1, 0x8e, 0x87, 0x4e, 0x99, 0x66, 0x39, +- 0x75, 0xdc, 0x40, 0xfb, 0xec, 0x3f, 0x61, 0xe2, 0x25, 0xfd, 0x25, 0xea, +- 0x54, 0x21, 0x6e, 0x6c, 0xe6, 0x3b, 0x41, 0x3e, 0xef, 0xc1, 0x81, 0x49, +- 0xe9, 0x97, 0xea, 0xf8, 0xcc, 0x45, 0x1c, 0xcf, 0xc4, 0xd0, 0x44, 0xfd, +- 0x85, 0x49, 0xb3, 0x91, 0xef, 0x84, 0x49, 0x2f, 0xbc, 0xf8, 0x35, 0x6c, +- 0x3f, 0xa5, 0x40, 0x8b, 0x8a, 0x0e, 0xbe, 0x86, 0xf6, 0x33, 0x5f, 0x94, +- 0x13, 0x98, 0xa5, 0xa6, 0xd5, 0x89, 0x02, 0xf1, 0x77, 0x55, 0x62, 0x04, +- 0xac, 0xdf, 0x78, 0x73, 0x56, 0xc1, 0xd4, 0x34, 0xfb, 0xbd, 0x8d, 0x30, +- 0x2b, 0x28, 0xd3, 0x1b, 0xb3, 0xbf, 0x81, 0x67, 0x4e, 0x52, 0x0f, 0x4f, +- 0x07, 0xf1, 0xbd, 0x8c, 0x0b, 0xb7, 0x4e, 0x09, 0xa6, 0xd3, 0x62, 0x07, +- 0x15, 0xe9, 0x8f, 0xa4, 0x6f, 0x89, 0x86, 0xdd, 0x8a, 0x03, 0xf5, 0xcf, +- 0xb8, 0xa0, 0x9d, 0x0b, 0xc3, 0x5d, 0xef, 0x81, 0x56, 0xff, 0xfb, 0xcc, +- 0x35, 0x0e, 0x94, 0xb1, 0x97, 0xed, 0xfc, 0x76, 0x8c, 0xd7, 0x82, 0xbc, +- 0x86, 0xdf, 0x28, 0x87, 0x73, 0x95, 0x93, 0x35, 0xbc, 0x4c, 0x23, 0x1e, +- 0x73, 0x99, 0xa6, 0x93, 0xb5, 0x61, 0xf7, 0x77, 0x4c, 0x33, 0xb2, 0x41, +- 0x9e, 0x0f, 0x20, 0x72, 0x4e, 0xe3, 0x73, 0x76, 0xbd, 0xbc, 0x8e, 0xc7, +- 0x9c, 0xf4, 0x23, 0x89, 0x55, 0xd6, 0x7b, 0xab, 0x87, 0xb2, 0x71, 0xfb, +- 0x0b, 0x79, 0xc1, 0x36, 0x61, 0x4b, 0x86, 0xb3, 0xd3, 0x0a, 0x73, 0x76, +- 0x82, 0xcf, 0x6e, 0x81, 0x33, 0xae, 0x4e, 0xa4, 0xe9, 0x07, 0x7b, 0x03, +- 0x2d, 0x78, 0xce, 0x70, 0xa3, 0x52, 0x5b, 0x85, 0x07, 0x7a, 0x03, 0x78, +- 0x8e, 0x7d, 0x01, 0x6d, 0x16, 0x2b, 0x80, 0x8d, 0xb4, 0x9f, 0xf4, 0x1c, +- 0x3f, 0x84, 0xf6, 0x6d, 0x07, 0xf3, 0x9c, 0xd3, 0xca, 0x73, 0x65, 0xf5, +- 0x40, 0x21, 0xe7, 0xc2, 0x05, 0xcd, 0xc6, 0x84, 0x2f, 0x58, 0x35, 0x5b, +- 0x0d, 0x14, 0xae, 0x61, 0x41, 0xb5, 0x25, 0xa9, 0x90, 0x19, 0xbf, 0xe8, +- 0xae, 0xdf, 0x65, 0xfb, 0xd2, 0xdf, 0x38, 0xa5, 0xe7, 0xb8, 0xfe, 0xbd, +- 0x02, 0x8e, 0x84, 0x1a, 0x6a, 0x73, 0xc2, 0xe3, 0x4a, 0x0c, 0xb5, 0x8e, +- 0x6b, 0x5f, 0xba, 0x81, 0xf7, 0x26, 0x8c, 0xe5, 0xaf, 0xf7, 0xda, 0x5d, +- 0x19, 0xcb, 0x87, 0xba, 0x44, 0xf7, 0x4f, 0xe8, 0x92, 0x67, 0x53, 0x4a, +- 0x3b, 0xf3, 0x56, 0xda, 0x85, 0x74, 0x15, 0x9f, 0xa1, 0xfe, 0x71, 0x74, +- 0x52, 0xe8, 0x1c, 0xc6, 0x78, 0x46, 0x66, 0x1b, 0xc3, 0xd8, 0x6c, 0x44, +- 0x62, 0x4b, 0xec, 0xa1, 0x8f, 0x40, 0xe6, 0x10, 0x8d, 0x85, 0x57, 0x14, +- 0x35, 0x75, 0x8b, 0x53, 0x1d, 0x5a, 0x56, 0xec, 0xbc, 0xb5, 0xb6, 0x98, +- 0xb7, 0xd6, 0xe4, 0x56, 0xf9, 0x7b, 0x58, 0x0f, 0x7a, 0x16, 0x4a, 0xf5, +- 0xa1, 0x47, 0xe9, 0xb4, 0x6a, 0x6b, 0xbf, 0xb2, 0x63, 0xc1, 0xa3, 0x74, +- 0x64, 0x3d, 0x78, 0x85, 0x58, 0x6c, 0xb6, 0x0f, 0x81, 0x5b, 0x37, 0xc2, +- 0xbb, 0x23, 0xdb, 0x8b, 0x72, 0x4d, 0x7a, 0xc8, 0x72, 0x74, 0x5a, 0x75, +- 0xad, 0xce, 0xdf, 0xc3, 0xfa, 0xd3, 0x93, 0xef, 0x63, 0xfe, 0x43, 0xc0, +- 0x9b, 0xb0, 0x67, 0x06, 0x92, 0x0b, 0xef, 0xe0, 0xbb, 0x4b, 0xf1, 0x15, +- 0x80, 0x5d, 0xff, 0x94, 0x7e, 0xf6, 0x12, 0xd5, 0x1b, 0x14, 0x5c, 0xba, +- 0xcb, 0x03, 0xd2, 0x62, 0xcf, 0x7f, 0xb1, 0xf5, 0xc2, 0x74, 0xaf, 0xd2, +- 0x31, 0x37, 0xef, 0xdd, 0x66, 0xc8, 0x2c, 0x62, 0xd6, 0xdb, 0x4e, 0x1e, +- 0xda, 0x17, 0x9e, 0xf6, 0x6e, 0x25, 0x4f, 0x5b, 0x17, 0x3e, 0x4f, 0x53, +- 0xea, 0xca, 0x44, 0x6b, 0x1b, 0x63, 0x7b, 0xb7, 0xfe, 0x91, 0x19, 0xfe, +- 0x1d, 0xa1, 0xb3, 0x58, 0xd4, 0x67, 0x92, 0x7c, 0x05, 0x3d, 0x9d, 0xf9, +- 0x80, 0x27, 0x99, 0x6f, 0xf7, 0xb6, 0x19, 0xbd, 0xde, 0xad, 0x46, 0x9f, +- 0xb7, 0xdd, 0xb8, 0x87, 0xb4, 0x7b, 0xbc, 0x1d, 0x06, 0xe3, 0x3a, 0xdf, +- 0x47, 0xbd, 0xf6, 0x62, 0x3c, 0x7f, 0x0f, 0xb1, 0x87, 0xd0, 0x1c, 0x20, +- 0x0e, 0xf2, 0x52, 0xc6, 0x11, 0xca, 0x58, 0x08, 0xb9, 0x91, 0x54, 0xdd, +- 0xd4, 0xd7, 0x98, 0x65, 0xc7, 0x09, 0x6b, 0x16, 0x55, 0x91, 0x98, 0x6c, +- 0xed, 0x3e, 0xc1, 0x7c, 0x9f, 0x38, 0xda, 0x7a, 0xeb, 0x29, 0xd4, 0xb8, +- 0x13, 0xd2, 0x3b, 0xb3, 0x1f, 0x8e, 0x46, 0xf5, 0xf7, 0x10, 0x0d, 0xbd, +- 0xc2, 0x67, 0x47, 0xe9, 0xbb, 0x63, 0xd6, 0xfc, 0x81, 0x06, 0xc9, 0x35, +- 0xa1, 0xdb, 0xf0, 0x78, 0x77, 0xb2, 0x37, 0xf3, 0x27, 0xd4, 0x96, 0x3b, +- 0x9c, 0x32, 0x0f, 0x29, 0xfc, 0x96, 0x0f, 0x4d, 0xe8, 0xca, 0x7b, 0x28, +- 0xd7, 0x97, 0xf0, 0x0f, 0x27, 0x59, 0xd7, 0x20, 0x7e, 0x68, 0x9a, 0xf7, +- 0xb1, 0xaf, 0x39, 0x96, 0xab, 0xc3, 0x65, 0xcb, 0xc6, 0x2e, 0x1c, 0xcd, +- 0x85, 0xf1, 0x0e, 0xe5, 0x73, 0x2d, 0xd6, 0xe2, 0xed, 0x69, 0x27, 0xf6, +- 0xe9, 0xb7, 0x17, 0xeb, 0x85, 0x03, 0xf7, 0xc6, 0x0e, 0x11, 0x3b, 0x38, +- 0x50, 0x4d, 0xfc, 0xf6, 0xb0, 0x75, 0xcd, 0xc9, 0xfe, 0xef, 0xb7, 0x91, +- 0xb2, 0xeb, 0x09, 0x79, 0x7c, 0x94, 0x3c, 0x36, 0x7b, 0xb7, 0x66, 0x55, +- 0xef, 0x9d, 0x59, 0x78, 0xdc, 0x89, 0xd1, 0xd6, 0x33, 0x27, 0x4d, 0x0c, +- 0xea, 0xb7, 0xe1, 0xca, 0xc9, 0xd1, 0x21, 0x17, 0xfd, 0xe7, 0xe7, 0xf1, +- 0x7e, 0x18, 0x33, 0xb8, 0x40, 0xe4, 0x71, 0xd1, 0xc7, 0xdc, 0xde, 0x10, +- 0x8f, 0x06, 0x58, 0x8b, 0xf5, 0x05, 0xc6, 0x66, 0x07, 0xd4, 0x21, 0xd6, +- 0xe4, 0xa4, 0x33, 0x11, 0x1d, 0x18, 0x23, 0x78, 0xac, 0x22, 0x3f, 0x5e, +- 0xe6, 0x6e, 0xdf, 0x62, 0xd8, 0xbb, 0x9b, 0xf5, 0x26, 0xc4, 0xfe, 0xce, +- 0x1b, 0xc5, 0xed, 0xb5, 0x88, 0xc6, 0x96, 0x29, 0xb7, 0x7b, 0xb1, 0xc9, +- 0x7b, 0x07, 0xeb, 0xc7, 0xe5, 0xa8, 0x39, 0xf2, 0x92, 0xee, 0x83, 0x7f, +- 0x51, 0xa7, 0xbe, 0xfb, 0x31, 0xba, 0xc0, 0x96, 0x2b, 0xca, 0x9e, 0x7f, +- 0xb1, 0xc5, 0xbb, 0x93, 0xb1, 0x59, 0x45, 0x13, 0x35, 0x2e, 0x26, 0xbd, +- 0xd2, 0xf3, 0x35, 0x2d, 0x6e, 0x22, 0x7f, 0xe2, 0xa3, 0x99, 0xd6, 0xcd, +- 0xf4, 0x87, 0xf0, 0x22, 0x3a, 0x99, 0xe6, 0x5e, 0x26, 0xcd, 0xfe, 0x10, +- 0x31, 0xec, 0x81, 0x8d, 0x3e, 0xe6, 0x29, 0xd1, 0x25, 0xf5, 0x98, 0x2f, +- 0xc9, 0x24, 0x75, 0xf9, 0x68, 0xeb, 0xe2, 0x29, 0xa9, 0xcb, 0xa9, 0xd6, +- 0xcc, 0x29, 0x0d, 0xef, 0xb0, 0xb6, 0xac, 0x8d, 0xab, 0xfa, 0x39, 0x25, +- 0x12, 0xba, 0x48, 0x59, 0x5c, 0xf8, 0x85, 0xb9, 0x57, 0x8b, 0x16, 0x6e, +- 0x61, 0x3c, 0x55, 0x33, 0x37, 0x86, 0x98, 0xf3, 0xab, 0x17, 0xa9, 0x98, +- 0x45, 0xa7, 0x1b, 0x15, 0x21, 0x78, 0xa2, 0x1a, 0xde, 0x3d, 0x19, 0xa3, +- 0x1e, 0xae, 0xd1, 0x3c, 0x48, 0xa8, 0x35, 0xc8, 0x52, 0xf8, 0xd8, 0x33, +- 0xf4, 0xc5, 0x71, 0xae, 0x5b, 0xb6, 0x28, 0x3c, 0xcb, 0xf3, 0x41, 0x3e, +- 0x7f, 0x7d, 0xed, 0x6a, 0xae, 0xfd, 0xd1, 0x29, 0xf1, 0xd7, 0x54, 0xeb, +- 0x85, 0x93, 0xf6, 0xda, 0xd1, 0x78, 0x0c, 0x1f, 0x9e, 0x54, 0x87, 0xdf, +- 0x55, 0x22, 0x03, 0x17, 0x14, 0x59, 0x1f, 0x75, 0x55, 0xb8, 0x62, 0x8e, +- 0x46, 0xa3, 0xa9, 0xbd, 0xa4, 0xd9, 0xb2, 0x89, 0xfa, 0xb7, 0xf8, 0xa0, +- 0xcf, 0x33, 0xcf, 0xba, 0xc9, 0x8f, 0xcd, 0x4b, 0x1d, 0x69, 0x9f, 0x2c, +- 0xf6, 0x6a, 0xec, 0x53, 0xaf, 0xf3, 0x13, 0xa4, 0x1e, 0x3c, 0xbb, 0x9b, +- 0x7d, 0xa8, 0xb5, 0x9e, 0x0b, 0xf0, 0x39, 0xd1, 0xc3, 0x2f, 0x15, 0x87, +- 0xf6, 0x1e, 0xf3, 0x98, 0xe4, 0x92, 0x20, 0x73, 0xd8, 0x3d, 0xd2, 0xd3, +- 0xa6, 0xd3, 0xf4, 0x77, 0x37, 0xfd, 0x7d, 0x9b, 0xf8, 0xb4, 0x41, 0x9f, +- 0x36, 0xe8, 0xd3, 0x86, 0x1a, 0x1a, 0x46, 0x24, 0x30, 0x48, 0xbb, 0x25, +- 0x43, 0xe2, 0xeb, 0x7d, 0xd8, 0xc7, 0xdf, 0xfd, 0xbc, 0x7f, 0x94, 0x7d, +- 0x2e, 0x56, 0xc8, 0x9a, 0x87, 0xd1, 0x6e, 0x3c, 0x86, 0xa1, 0x2c, 0x7e, +- 0xe5, 0x6d, 0x2e, 0x47, 0xf9, 0x1a, 0xe9, 0xe1, 0xd5, 0xc0, 0x31, 0x3c, +- 0xc6, 0x3e, 0xea, 0x97, 0x4a, 0xa5, 0xe6, 0xea, 0x3d, 0xae, 0xa8, 0x81, +- 0x76, 0xf6, 0xc3, 0x7b, 0xf3, 0xf7, 0xd0, 0xbe, 0x91, 0xa1, 0x57, 0x14, +- 0xf6, 0x52, 0xb5, 0x5c, 0x9b, 0xb1, 0x74, 0x27, 0xd7, 0x31, 0x84, 0x0f, +- 0x2b, 0xdf, 0xfe, 0x1e, 0x44, 0xb7, 0x3f, 0x6a, 0x18, 0xe4, 0xfa, 0x36, +- 0x1f, 0xa3, 0xec, 0x29, 0x07, 0x19, 0x63, 0xfb, 0xac, 0xf8, 0xea, 0x23, +- 0x8d, 0xeb, 0x79, 0x6c, 0x6b, 0x46, 0x6a, 0xa9, 0x89, 0xc7, 0x75, 0x13, +- 0xcf, 0xf2, 0x77, 0x89, 0xb9, 0x6c, 0xec, 0x86, 0x5c, 0xe6, 0xe0, 0x73, +- 0xbb, 0xf9, 0x5c, 0x0b, 0x53, 0xe7, 0xc2, 0x9c, 0xcc, 0x06, 0x0f, 0xcb, +- 0x6c, 0x10, 0x39, 0x43, 0x74, 0x3f, 0x8c, 0x0b, 0x99, 0x48, 0xca, 0xe9, +- 0x34, 0x47, 0x18, 0x57, 0x4b, 0x1f, 0xd1, 0x77, 0x5f, 0xdf, 0xa8, 0xf6, +- 0x52, 0x87, 0xb1, 0x49, 0x45, 0x0d, 0xbd, 0x86, 0x42, 0xa7, 0x07, 0x8d, +- 0xe1, 0x75, 0xce, 0x68, 0xe0, 0x2c, 0xd4, 0xc2, 0x20, 0x25, 0x7d, 0x3a, +- 0x6f, 0xe7, 0xba, 0xcd, 0xc5, 0x5c, 0xd7, 0x92, 0xab, 0x50, 0xee, 0xcc, +- 0xb2, 0x3e, 0xcf, 0x99, 0x69, 0x3f, 0xeb, 0x55, 0x7e, 0x4e, 0x68, 0x8f, +- 0xa0, 0x31, 0x2e, 0xb4, 0xb4, 0xae, 0x49, 0x05, 0x5f, 0xaf, 0x44, 0x94, +- 0xb5, 0x0a, 0x7a, 0xb9, 0x96, 0x36, 0x59, 0x93, 0x02, 0xee, 0x84, 0xd4, +- 0xce, 0x1e, 0xf6, 0x2d, 0x7d, 0xcc, 0x8b, 0x82, 0xa9, 0x65, 0x5e, 0x6a, +- 0xe7, 0xa3, 0x6d, 0x79, 0xb1, 0x8b, 0xd8, 0x44, 0x6c, 0x73, 0x18, 0x07, +- 0xac, 0x79, 0xb4, 0x89, 0x69, 0x5d, 0x72, 0x83, 0xd8, 0xe9, 0x30, 0xf6, +- 0xe7, 0xdd, 0xb8, 0x97, 0x79, 0x70, 0xbe, 0x99, 0xba, 0xf2, 0xbb, 0x31, +- 0x38, 0x77, 0x3b, 0xf6, 0x65, 0x65, 0x9e, 0xe0, 0xa6, 0xfd, 0x92, 0xc4, +- 0x40, 0xcc, 0x3a, 0xc4, 0x3f, 0x65, 0x5a, 0x49, 0xa7, 0x42, 0x5b, 0x74, +- 0x5a, 0xfa, 0xbe, 0xe0, 0xb6, 0x75, 0x6c, 0xcf, 0x2d, 0x9d, 0x09, 0x59, +- 0xab, 0x34, 0xb3, 0xb4, 0xf5, 0xda, 0x99, 0x91, 0x35, 0x4d, 0x9c, 0xd5, +- 0x6d, 0x4c, 0x5b, 0xd2, 0x67, 0x88, 0x32, 0xd7, 0x6c, 0x02, 0xd6, 0xdd, +- 0x80, 0x6b, 0x2b, 0x78, 0xad, 0xfb, 0x3a, 0xae, 0xed, 0x17, 0xec, 0x4c, +- 0x5c, 0xdb, 0xb5, 0x83, 0xb8, 0xb6, 0x5e, 0x29, 0x61, 0x5a, 0x99, 0x59, +- 0x94, 0x70, 0x6d, 0x75, 0x31, 0x7f, 0x1f, 0xc6, 0x5e, 0x62, 0x9e, 0xda, +- 0xfa, 0x11, 0x78, 0xd6, 0x3b, 0x3e, 0x73, 0x60, 0x84, 0xbd, 0x4c, 0x19, +- 0xb0, 0xd2, 0xc4, 0x2d, 0x1b, 0xd2, 0x66, 0xb9, 0x56, 0x1f, 0x2e, 0x77, +- 0xc8, 0x4c, 0x3a, 0x9a, 0x1e, 0x63, 0x9e, 0x71, 0xac, 0x57, 0xd3, 0x49, +- 0x78, 0x02, 0x35, 0xda, 0x3d, 0xc5, 0x5e, 0x22, 0xe4, 0xd9, 0x4e, 0x4c, +- 0x14, 0x8d, 0x7f, 0x6a, 0xce, 0x06, 0x85, 0x46, 0xa1, 0xe0, 0x41, 0xf2, +- 0x11, 0x0f, 0x6b, 0xd4, 0xb2, 0x32, 0x81, 0xd7, 0xa3, 0x21, 0xcf, 0xce, +- 0x7c, 0xda, 0xdb, 0xdd, 0x70, 0x0b, 0x7a, 0x4e, 0x49, 0x3d, 0x0a, 0x63, +- 0xc7, 0xa9, 0x76, 0xd6, 0x20, 0x0d, 0x1d, 0x93, 0x5d, 0xec, 0xf1, 0x7a, +- 0x95, 0xde, 0x39, 0xd1, 0xa1, 0xd8, 0x40, 0x0d, 0x84, 0x1d, 0x37, 0xce, +- 0x4c, 0x4b, 0xfd, 0xf2, 0x7b, 0x96, 0x7f, 0x8d, 0xeb, 0x01, 0xea, 0xe7, +- 0xaa, 0x1b, 0x7e, 0x13, 0x67, 0x74, 0xf1, 0x4b, 0x7e, 0x37, 0x92, 0xd8, +- 0xd6, 0x3c, 0x6d, 0xba, 0x34, 0x99, 0x7d, 0x87, 0x2c, 0x9b, 0x6e, 0x65, +- 0x9d, 0x6b, 0x9f, 0xeb, 0xa3, 0x1d, 0x4b, 0x73, 0xee, 0x1b, 0xed, 0xb9, +- 0xc5, 0xbb, 0x8d, 0x39, 0x8f, 0x3d, 0xbc, 0xc7, 0xc3, 0x3c, 0xea, 0x39, +- 0x65, 0x62, 0x4e, 0x7f, 0xcb, 0x7c, 0x5c, 0x73, 0xd1, 0x6e, 0x5f, 0x65, +- 0x4e, 0x16, 0xcc, 0x92, 0xf0, 0xde, 0x31, 0xe3, 0x72, 0x54, 0x25, 0xd0, +- 0x5c, 0x46, 0x7f, 0xbc, 0x18, 0xb7, 0xe7, 0x91, 0xc7, 0x73, 0xb7, 0x7b, +- 0xbb, 0xb3, 0xec, 0x33, 0xd8, 0x07, 0xdb, 0xbd, 0xdf, 0x57, 0xbd, 0x7b, +- 0xb2, 0x4e, 0xa5, 0x36, 0x01, 0x67, 0xcb, 0x26, 0x13, 0x1f, 0x6f, 0x88, +- 0xa6, 0x42, 0x0e, 0xe6, 0x4f, 0xd2, 0x32, 0x72, 0xcd, 0xde, 0x7e, 0xe6, +- 0xeb, 0x9d, 0x59, 0xba, 0x01, 0x7d, 0xc7, 0xbf, 0x61, 0x74, 0xc0, 0x0f, +- 0x99, 0xb3, 0xe1, 0xeb, 0x8c, 0xd8, 0x20, 0xfd, 0x31, 0xd4, 0xa6, 0x44, +- 0x97, 0x87, 0x10, 0x5d, 0xfa, 0xd8, 0xf9, 0x96, 0xf9, 0x64, 0x6e, 0x13, +- 0x9f, 0xef, 0x62, 0x2e, 0x4d, 0x32, 0xb7, 0x8e, 0xa6, 0xdc, 0x90, 0x77, +- 0xd4, 0xfe, 0x37, 0x95, 0x08, 0xe3, 0x00, 0xbf, 0xc3, 0xe7, 0x03, 0x1d, +- 0xcc, 0xa3, 0x73, 0x7a, 0x34, 0xb9, 0x15, 0xe9, 0xae, 0x6a, 0xa8, 0x7a, +- 0x83, 0x22, 0x73, 0x31, 0xb1, 0x43, 0x0c, 0x3f, 0xe1, 0x9a, 0x2e, 0x4d, +- 0xf4, 0xb8, 0x85, 0xbe, 0x48, 0x6c, 0xe0, 0xf8, 0xbc, 0xdf, 0xfd, 0x5e, +- 0x19, 0x2a, 0x56, 0x50, 0xb6, 0x9f, 0x58, 0x39, 0xc7, 0xab, 0x69, 0xf8, +- 0xaf, 0xc4, 0x4e, 0x7f, 0x96, 0x97, 0xf9, 0x67, 0x09, 0x0f, 0x8a, 0x6f, +- 0x64, 0x5a, 0x6f, 0x9d, 0x8d, 0x15, 0xe7, 0xa1, 0x1e, 0x6f, 0xd7, 0x8c, +- 0x89, 0xac, 0xee, 0x87, 0xf4, 0xff, 0xe5, 0xf1, 0x02, 0xd1, 0x41, 0x13, +- 0x3a, 0x78, 0xbd, 0x7d, 0xa6, 0x52, 0x69, 0xcf, 0x9a, 0xf8, 0x33, 0x5d, +- 0x4d, 0xb7, 0x39, 0x19, 0xef, 0xba, 0x7a, 0x16, 0xf8, 0x19, 0x71, 0x94, +- 0xf8, 0x98, 0x0b, 0x3e, 0xcd, 0xa6, 0xd5, 0x34, 0x7b, 0x3b, 0xb1, 0x85, +- 0xc4, 0x9f, 0x73, 0x6d, 0x05, 0x9a, 0x95, 0x59, 0x97, 0xe8, 0xad, 0x0b, +- 0xc9, 0x7c, 0xa5, 0xb2, 0x8b, 0xba, 0xbc, 0x73, 0xbd, 0x17, 0x97, 0x2c, +- 0x5d, 0xde, 0x4e, 0x5d, 0xe2, 0x8d, 0xd5, 0x70, 0x5e, 0xa8, 0x05, 0xc1, +- 0x44, 0xb9, 0x1a, 0x1e, 0x70, 0x88, 0x4d, 0x18, 0x27, 0x82, 0xd5, 0x50, +- 0xc9, 0x7a, 0x9e, 0x24, 0x0e, 0x26, 0x6e, 0x0c, 0xf4, 0xe1, 0xdb, 0xcc, +- 0x4b, 0x8f, 0xd3, 0x6f, 0x7f, 0xa1, 0x35, 0xa1, 0xe2, 0x3b, 0xcd, 0xb4, +- 0xe9, 0x26, 0xef, 0xf6, 0x6c, 0x3f, 0x9e, 0x58, 0x30, 0xf1, 0x0c, 0x63, +- 0xa6, 0x21, 0x9e, 0x0e, 0x94, 0xb3, 0xaf, 0x63, 0xed, 0x5b, 0x3e, 0x61, +- 0xf9, 0xfc, 0x68, 0xeb, 0x96, 0xf9, 0x10, 0x9c, 0xdf, 0xb6, 0xf6, 0x7e, +- 0x5a, 0xc3, 0xf3, 0xd6, 0xde, 0x0f, 0x3f, 0x4d, 0x0c, 0xeb, 0x6a, 0xf2, +- 0x63, 0x67, 0x05, 0x2a, 0xa3, 0xa6, 0x39, 0x1c, 0xb7, 0xf6, 0x1f, 0x5a, +- 0x63, 0xd6, 0xfd, 0xa3, 0xfc, 0x2c, 0xcd, 0xae, 0xff, 0x46, 0x30, 0x63, +- 0x38, 0x49, 0xf9, 0x77, 0x10, 0x07, 0xf4, 0x13, 0x07, 0xd4, 0x26, 0xd4, +- 0xe4, 0x6e, 0xa7, 0xcc, 0x69, 0x0a, 0x87, 0xaa, 0x79, 0xfd, 0x8e, 0x22, +- 0x0e, 0xa8, 0x3a, 0x25, 0xb3, 0x3f, 0x62, 0x45, 0xd8, 0x7b, 0x26, 0x3d, +- 0xc4, 0x01, 0x15, 0x93, 0x2e, 0x74, 0x13, 0x03, 0xb8, 0x89, 0xd9, 0xb7, +- 0xe5, 0x6a, 0xe1, 0x3d, 0xe1, 0x44, 0x24, 0xfe, 0x23, 0x1c, 0xa2, 0xbf, +- 0x1d, 0x8a, 0x79, 0x94, 0xf0, 0x2a, 0x07, 0x75, 0xf6, 0x2b, 0x1c, 0x0c, +- 0x38, 0x51, 0xa5, 0xbd, 0x86, 0x07, 0xbf, 0xa0, 0xf6, 0xf7, 0x67, 0x25, +- 0xce, 0x47, 0x5b, 0xbb, 0x4f, 0xd9, 0xb5, 0xdf, 0x77, 0x6a, 0x74, 0x59, +- 0x6a, 0x7f, 0xed, 0x86, 0x7e, 0x9c, 0x9e, 0xc1, 0x37, 0x57, 0x13, 0x64, +- 0xd6, 0x72, 0xcd, 0xfa, 0x78, 0x94, 0x3d, 0xb8, 0x3a, 0xd4, 0xa1, 0x44, +- 0x27, 0xaa, 0x98, 0x0f, 0x4e, 0xb3, 0xf6, 0x7b, 0x12, 0xd1, 0x40, 0xcc, +- 0x81, 0x1e, 0x37, 0x6d, 0xf3, 0x3e, 0xfb, 0xf1, 0x9f, 0xe6, 0xc2, 0xa4, +- 0x59, 0x06, 0x17, 0x6b, 0xff, 0xfb, 0x1a, 0x3e, 0x73, 0xd2, 0x0f, 0xdf, +- 0x71, 0x7a, 0x70, 0x35, 0x67, 0xd7, 0xfe, 0xea, 0x06, 0x73, 0xe4, 0x72, +- 0xdc, 0x87, 0x2b, 0x39, 0x9d, 0xfe, 0xd8, 0x8f, 0xa3, 0xac, 0xfd, 0x97, +- 0xb5, 0x00, 0x3e, 0xcc, 0xb5, 0xd0, 0x47, 0x83, 0xf8, 0x39, 0x71, 0xf2, +- 0x7a, 0xd6, 0xfe, 0xbb, 0xe8, 0x5f, 0x71, 0xd6, 0xfe, 0x36, 0x0b, 0x97, +- 0x64, 0x5a, 0xcf, 0x4c, 0x5b, 0xb5, 0xbf, 0xc1, 0xc1, 0xba, 0xe9, 0x46, +- 0x74, 0x99, 0x39, 0xc3, 0xfc, 0xc5, 0x26, 0x1f, 0x9f, 0xa5, 0xde, 0xf2, +- 0x1b, 0x30, 0x6b, 0xd5, 0xaa, 0x2d, 0xde, 0x5d, 0x5c, 0x7b, 0xa5, 0x15, +- 0x73, 0x26, 0x76, 0xac, 0xff, 0x6b, 0xfc, 0x41, 0x8d, 0x83, 0x3e, 0x99, +- 0xf0, 0xde, 0xc9, 0xb8, 0xf3, 0x27, 0x4a, 0xb3, 0x91, 0x18, 0xd7, 0xb9, +- 0xdd, 0x7b, 0x17, 0xfd, 0xe4, 0x96, 0xf5, 0xcc, 0x2a, 0x01, 0x3b, 0xe6, +- 0xda, 0x19, 0x73, 0x21, 0xc6, 0xdc, 0x6a, 0xc6, 0xdc, 0x93, 0x7a, 0x34, +- 0xb6, 0x85, 0xf8, 0xec, 0x95, 0x9c, 0xc4, 0x5d, 0x33, 0xe9, 0xaa, 0x94, +- 0x6b, 0x74, 0x40, 0xe2, 0x67, 0xc7, 0xfa, 0xd1, 0xb3, 0x95, 0x10, 0x5d, +- 0xe1, 0xb3, 0x95, 0xc4, 0x22, 0xcc, 0x52, 0x4b, 0xcb, 0xce, 0x68, 0xea, +- 0x36, 0x67, 0x74, 0xf8, 0x3d, 0xe5, 0x2d, 0xf3, 0x0d, 0xc6, 0xdc, 0x4e, +- 0xc6, 0xdc, 0x2e, 0xc6, 0x5c, 0x9b, 0x61, 0xe2, 0x85, 0xb8, 0xda, 0xdf, +- 0xe4, 0x88, 0xe8, 0x6d, 0x0e, 0xac, 0xae, 0x64, 0x09, 0xf1, 0x22, 0xda, +- 0xf5, 0x07, 0xe4, 0x7f, 0x49, 0x8f, 0xf6, 0xc6, 0x14, 0x89, 0xb3, 0x30, +- 0x3e, 0xa0, 0xdc, 0xe5, 0xc5, 0x38, 0x3b, 0x30, 0x77, 0xbe, 0xe8, 0x1b, +- 0x25, 0xd9, 0x9d, 0x78, 0x5e, 0x67, 0x5e, 0x5d, 0x21, 0xbe, 0xdb, 0x87, +- 0x09, 0xea, 0xd1, 0x1b, 0xed, 0xc3, 0x31, 0xd6, 0xcd, 0xfb, 0x58, 0xaf, +- 0xef, 0x37, 0x22, 0x2d, 0xdb, 0xd9, 0x27, 0x5d, 0x0a, 0xa9, 0xe1, 0xb0, +- 0xd2, 0x87, 0x41, 0xfa, 0xf0, 0x20, 0xeb, 0x4b, 0x9b, 0xf1, 0x4b, 0xa5, +- 0x83, 0x98, 0x62, 0x7f, 0x5e, 0xde, 0x53, 0x63, 0x69, 0xc7, 0x10, 0x06, +- 0x16, 0x24, 0xcf, 0x21, 0x70, 0x53, 0xa2, 0x0f, 0x53, 0x46, 0x19, 0xfa, +- 0x9a, 0x7b, 0x94, 0x3b, 0xf2, 0x32, 0xa7, 0x63, 0x6c, 0x1a, 0x8c, 0x5d, +- 0x8b, 0x5f, 0x05, 0xb9, 0x68, 0x0f, 0x32, 0x12, 0xab, 0xc6, 0x2e, 0xe5, +- 0xae, 0x39, 0x89, 0xf7, 0x3e, 0xa5, 0x4f, 0xe2, 0xd9, 0x48, 0x29, 0x77, +- 0x4b, 0x7c, 0x5b, 0xb3, 0x6d, 0xc9, 0x01, 0xb2, 0xf7, 0x71, 0x3b, 0xf1, +- 0x1e, 0x18, 0x5f, 0xce, 0xef, 0x84, 0x18, 0x83, 0x6d, 0x65, 0x0e, 0xfa, +- 0x69, 0x84, 0xb6, 0x73, 0xa0, 0x5d, 0xff, 0xb2, 0x99, 0x0e, 0x0c, 0x30, +- 0xa6, 0xfa, 0x70, 0xd4, 0x08, 0x99, 0x97, 0x2d, 0x1c, 0x53, 0xca, 0xf1, +- 0x5b, 0x58, 0xeb, 0x56, 0xc1, 0xa3, 0x49, 0x7d, 0xf7, 0x21, 0x56, 0xe3, +- 0x41, 0x85, 0x26, 0xb5, 0x27, 0xd3, 0xba, 0x78, 0x42, 0x91, 0x3e, 0xa5, +- 0x18, 0xeb, 0x5b, 0xf0, 0x00, 0x73, 0xc2, 0xbe, 0xf8, 0xbd, 0xb8, 0x3f, +- 0x50, 0x01, 0x3f, 0xf5, 0xf4, 0x50, 0xc0, 0xc7, 0x5c, 0xfb, 0x7b, 0x45, +- 0x3a, 0x7f, 0x51, 0x56, 0xec, 0xbf, 0xaf, 0x61, 0xb0, 0x5a, 0xc6, 0xd8, +- 0xe6, 0x19, 0x99, 0x27, 0xa5, 0x5a, 0x43, 0x33, 0x1a, 0xfc, 0xec, 0x7b, +- 0xb7, 0xc4, 0xd5, 0xd4, 0x16, 0x67, 0x44, 0x7a, 0x9a, 0x8c, 0x9f, 0xf8, +- 0x2f, 0x17, 0x8d, 0xf6, 0x36, 0x89, 0x8e, 0xb5, 0x10, 0x3a, 0xa9, 0xa7, +- 0xee, 0x5c, 0x90, 0x31, 0xe4, 0x28, 0x17, 0x2c, 0x95, 0xcc, 0x5d, 0xa7, +- 0x15, 0x22, 0xad, 0xd0, 0x8c, 0xe0, 0xba, 0x14, 0x71, 0x9d, 0xc6, 0x38, +- 0x34, 0xcd, 0xcd, 0xc4, 0x73, 0xbe, 0x53, 0x32, 0x97, 0x8a, 0x4c, 0x10, +- 0x03, 0x37, 0x11, 0x1f, 0xf7, 0xd1, 0xab, 0xcd, 0x5b, 0xea, 0xa3, 0x7a, +- 0x9b, 0x82, 0xc7, 0xe6, 0x9b, 0xe1, 0x71, 0x92, 0xe6, 0x3b, 0xb9, 0x00, +- 0x2e, 0xe7, 0x42, 0x78, 0x9b, 0xb4, 0x2f, 0x59, 0xb4, 0xeb, 0xf0, 0xb3, +- 0x62, 0x0e, 0x8b, 0x33, 0x87, 0x6d, 0xcd, 0x2a, 0xf4, 0xd7, 0x30, 0x46, +- 0xf4, 0xbf, 0xfa, 0xec, 0xd2, 0xcd, 0x1e, 0xea, 0x4d, 0x64, 0x71, 0xf1, +- 0x73, 0x1c, 0x0f, 0x59, 0x39, 0xfb, 0xb5, 0xcf, 0x66, 0x6b, 0x68, 0x2b, +- 0xea, 0xbe, 0xba, 0xf8, 0xde, 0xba, 0xd9, 0x3f, 0x2f, 0xca, 0xdb, 0x53, +- 0xb4, 0x35, 0x71, 0x9b, 0x71, 0x9e, 0xd7, 0x04, 0x47, 0x69, 0x70, 0x9c, +- 0x8a, 0xa1, 0xec, 0xd4, 0x35, 0xfe, 0x35, 0x89, 0x19, 0x56, 0xde, 0xc7, +- 0xbe, 0x4b, 0x9e, 0x1e, 0x21, 0x5e, 0x34, 0xc9, 0xd3, 0x55, 0x8b, 0x97, +- 0x20, 0x79, 0xf9, 0xe4, 0xb3, 0x12, 0xb6, 0x0c, 0x5d, 0x7b, 0x27, 0x40, +- 0x7d, 0xe0, 0xd1, 0x10, 0xf5, 0x79, 0x65, 0xa3, 0x3c, 0xe7, 0xc3, 0x1d, +- 0xb9, 0x44, 0xb9, 0xe4, 0x79, 0xaf, 0xb6, 0x05, 0x7b, 0xe7, 0x3e, 0xaf, +- 0xf7, 0x20, 0x6d, 0x11, 0xa0, 0xf1, 0xe4, 0xde, 0x17, 0xd5, 0xd4, 0x3f, +- 0x42, 0x8a, 0x3d, 0xd3, 0x23, 0xd9, 0x34, 0x1e, 0xca, 0x7e, 0xcb, 0xda, +- 0xcb, 0x5b, 0xb7, 0x01, 0xfb, 0x49, 0xff, 0x60, 0x35, 0xe3, 0xe8, 0x7f, +- 0xc4, 0xa3, 0x82, 0xa5, 0x76, 0x55, 0x42, 0xea, 0x6e, 0xb4, 0xe5, 0x36, +- 0xc5, 0x44, 0x59, 0x1c, 0xc3, 0xed, 0xcd, 0xd1, 0xd8, 0x65, 0x3c, 0x66, +- 0xca, 0x5c, 0xdc, 0x59, 0xac, 0xc1, 0xc4, 0xaf, 0x4a, 0x3b, 0xeb, 0x70, +- 0x5b, 0x11, 0x53, 0x6d, 0xcd, 0xbf, 0xf5, 0xb9, 0xd9, 0x83, 0xf4, 0xed, +- 0x52, 0x7b, 0xbc, 0x4a, 0x1b, 0xd7, 0x39, 0xca, 0x9c, 0xfd, 0xbc, 0xfe, +- 0x52, 0x88, 0x95, 0x19, 0xae, 0xf5, 0x0a, 0x0e, 0x11, 0x3f, 0xa5, 0x83, +- 0x26, 0x76, 0xf1, 0xf3, 0x00, 0x71, 0xd6, 0xbb, 0x7a, 0x15, 0x66, 0x03, +- 0x01, 0x62, 0x4b, 0xe6, 0x60, 0xc7, 0xdf, 0x49, 0x4d, 0x88, 0x85, 0x1d, +- 0xb2, 0x57, 0xff, 0x6f, 0xed, 0xdf, 0xac, 0x27, 0x96, 0x11, 0xd9, 0xbd, +- 0x0a, 0x73, 0x68, 0x0c, 0xc4, 0x37, 0x7b, 0xf5, 0x42, 0xd8, 0x81, 0xe4, +- 0x55, 0x07, 0xd4, 0xd3, 0xef, 0xb0, 0x1f, 0x7c, 0xa4, 0x5e, 0x3d, 0xdd, +- 0xea, 0xd4, 0x90, 0x9a, 0xf2, 0xe0, 0xe1, 0xa9, 0x0e, 0x54, 0x5b, 0x73, +- 0xa4, 0x71, 0xda, 0xcc, 0xc1, 0x3e, 0x6c, 0xf4, 0x53, 0x17, 0xfb, 0xb1, +- 0xab, 0x1b, 0x1e, 0x45, 0x8b, 0x75, 0x7d, 0x0c, 0xfb, 0xb3, 0x5e, 0xa5, +- 0x3b, 0xeb, 0x42, 0xc7, 0x5d, 0x8f, 0xc2, 0xbd, 0x7e, 0x80, 0x7c, 0xc9, +- 0x75, 0xf9, 0xfb, 0x6e, 0xf6, 0x71, 0xc2, 0x5f, 0x19, 0xc2, 0xab, 0xc8, +- 0xdb, 0x7a, 0x0d, 0x23, 0x53, 0x2e, 0x65, 0xb7, 0xf1, 0x37, 0xe6, 0x55, +- 0x6b, 0x6f, 0x48, 0xae, 0x55, 0xc8, 0x99, 0x01, 0x3e, 0x23, 0x39, 0x67, +- 0x10, 0x59, 0xc6, 0xf6, 0xdd, 0xd6, 0xfb, 0xa7, 0xca, 0x6c, 0x99, 0x92, +- 0xec, 0x6f, 0xdb, 0xe9, 0x1f, 0xf2, 0x4c, 0x5b, 0xf1, 0xda, 0x76, 0x8f, +- 0x7d, 0x2e, 0x41, 0xec, 0x3e, 0x88, 0x5b, 0x69, 0x84, 0xfa, 0xa8, 0xf8, +- 0xd8, 0x20, 0xea, 0x73, 0x4c, 0xa8, 0xab, 0x6c, 0x7e, 0x1f, 0x34, 0x0a, +- 0xec, 0x4d, 0x35, 0xe6, 0x4d, 0xea, 0x6e, 0xa5, 0xbc, 0x4f, 0x47, 0xfd, +- 0xb5, 0xf7, 0x4b, 0xf5, 0x54, 0x70, 0xe9, 0x17, 0xdd, 0xff, 0x4d, 0xc8, +- 0x3d, 0x97, 0xf6, 0x87, 0x8c, 0xe3, 0x68, 0x6f, 0xa5, 0x43, 0xfc, 0xe7, +- 0x0f, 0x71, 0xff, 0x1c, 0x1b, 0xd7, 0x0a, 0xa1, 0x4f, 0xdc, 0x6b, 0xb8, +- 0x94, 0x2e, 0xe6, 0x9f, 0x03, 0x53, 0x8e, 0x3b, 0xca, 0xf0, 0xe7, 0x66, +- 0xf9, 0xca, 0x11, 0xd4, 0xc7, 0xc7, 0xf8, 0xbc, 0x82, 0x76, 0x62, 0xc8, +- 0x27, 0xf4, 0xad, 0xe8, 0xa8, 0x91, 0x1c, 0xf0, 0xbc, 0x39, 0xd8, 0x27, +- 0x3a, 0x54, 0xb0, 0x8d, 0xd7, 0x5f, 0xa0, 0x7d, 0x9f, 0xd6, 0x5d, 0xa8, +- 0x5f, 0x21, 0x33, 0x41, 0x75, 0x3a, 0x89, 0x3d, 0x1e, 0x7b, 0x8f, 0x2c, +- 0x6d, 0x56, 0x6b, 0xda, 0xf0, 0x9d, 0x8e, 0xfa, 0xe9, 0x37, 0xe9, 0x4f, +- 0x6d, 0xeb, 0x6f, 0xbc, 0x57, 0xd2, 0x89, 0x8e, 0xd0, 0xfa, 0xe7, 0x4c, +- 0xdc, 0x34, 0x8a, 0xc0, 0xfa, 0x1b, 0xed, 0x5f, 0xe2, 0xfb, 0x30, 0x63, +- 0x10, 0xe9, 0xea, 0x84, 0xcc, 0x89, 0xa2, 0xa4, 0x73, 0x18, 0xbf, 0x9f, +- 0x1f, 0xc3, 0xa1, 0xac, 0xc8, 0xb9, 0x60, 0xf9, 0xb6, 0xb6, 0xfe, 0xba, +- 0x6c, 0x0f, 0x66, 0xa3, 0x03, 0x55, 0x45, 0xd9, 0x0e, 0xb2, 0x1f, 0xa9, +- 0x64, 0x8e, 0x7d, 0x80, 0x3a, 0x1d, 0xb6, 0x74, 0xda, 0x07, 0x3d, 0x77, +- 0x9d, 0xee, 0x10, 0xe9, 0x7a, 0x13, 0xa2, 0x37, 0xd9, 0x97, 0x63, 0x2f, +- 0x40, 0xba, 0xfb, 0x6e, 0xa0, 0x3b, 0xa8, 0x5f, 0xa7, 0xbb, 0x37, 0x1b, +- 0x3d, 0xed, 0x28, 0xd2, 0xfd, 0xc6, 0x5c, 0x89, 0x46, 0x1a, 0x3b, 0xd7, +- 0xa7, 0x91, 0xdb, 0x7c, 0xd0, 0x3c, 0x68, 0xe9, 0xe3, 0xfb, 0xd6, 0xf5, +- 0x6d, 0xf5, 0x12, 0x0f, 0xfc, 0x33, 0xa1, 0x59, 0x67, 0x00, 0x6c, 0x1c, +- 0x76, 0x63, 0x7c, 0xa8, 0x6f, 0x75, 0x3b, 0x93, 0x8c, 0xe3, 0xa0, 0x67, +- 0xfb, 0xe7, 0x66, 0x1f, 0x1d, 0xec, 0xd7, 0x3a, 0x8d, 0x1e, 0x6f, 0x97, +- 0xe1, 0x21, 0x06, 0xab, 0x54, 0xb6, 0x65, 0x65, 0x06, 0x22, 0xb1, 0x5c, +- 0xc4, 0xc5, 0x79, 0xe9, 0x0b, 0xef, 0x61, 0xcf, 0xb0, 0x81, 0xf6, 0x1d, +- 0xc0, 0x44, 0x7e, 0x40, 0x49, 0x06, 0xb9, 0x8e, 0x21, 0x75, 0x05, 0xac, +- 0x79, 0xbd, 0xa8, 0xa4, 0x2f, 0x05, 0x13, 0xd3, 0x89, 0x93, 0xf5, 0x26, +- 0x88, 0x51, 0x3c, 0x2b, 0x12, 0xb3, 0x89, 0x5d, 0xf5, 0x4e, 0x1c, 0xb7, +- 0xb0, 0x98, 0x3a, 0xcb, 0xdf, 0x69, 0x89, 0x99, 0x3b, 0xb3, 0x52, 0xc7, +- 0x08, 0x27, 0xb5, 0x11, 0xfc, 0x63, 0xbc, 0x30, 0x5c, 0x83, 0xe4, 0x7d, +- 0x35, 0x90, 0x1e, 0x63, 0x02, 0x7f, 0xa9, 0x85, 0x3c, 0xfd, 0x79, 0x97, +- 0xd2, 0x6d, 0xcc, 0x7b, 0x77, 0x18, 0x7e, 0xf8, 0xd8, 0xbf, 0xf5, 0x38, +- 0x23, 0xec, 0x39, 0xac, 0x19, 0x7d, 0xeb, 0xad, 0xb9, 0x7e, 0x6f, 0xbb, +- 0x61, 0xe7, 0xc2, 0x5b, 0x66, 0x3d, 0xde, 0x8e, 0x99, 0x48, 0x68, 0xc2, +- 0xc2, 0x62, 0x07, 0x5b, 0x23, 0x39, 0xd3, 0x7c, 0x55, 0x2f, 0x5c, 0x2d, +- 0xb7, 0xbe, 0x4f, 0xb7, 0xc6, 0x72, 0x4d, 0xd8, 0x43, 0xfc, 0xd4, 0x36, +- 0xd3, 0x04, 0x7d, 0x06, 0x38, 0x31, 0x15, 0xc2, 0xba, 0xac, 0x7a, 0x3a, +- 0xe5, 0xec, 0xc7, 0xf4, 0x42, 0x17, 0xb2, 0x79, 0xef, 0x72, 0xd8, 0x41, +- 0x8c, 0x1d, 0x77, 0xe0, 0x0e, 0x7d, 0x83, 0x52, 0xb0, 0x62, 0x5a, 0xc1, +- 0xdd, 0xfa, 0x2e, 0x65, 0xc0, 0xc2, 0x14, 0xf3, 0xc4, 0x22, 0x0a, 0x6e, +- 0xb2, 0x72, 0xef, 0xc9, 0xd6, 0x38, 0xf1, 0xf7, 0x1d, 0x59, 0xa9, 0xef, +- 0x26, 0x2e, 0xc6, 0xa9, 0x97, 0x78, 0xba, 0xdf, 0xcd, 0x7e, 0xe8, 0xa0, +- 0xa2, 0xf6, 0xea, 0x8a, 0x8d, 0xf1, 0x6e, 0x9b, 0xb7, 0x71, 0xe1, 0xad, +- 0xf3, 0xcd, 0x5e, 0xc9, 0x41, 0xed, 0xba, 0x1a, 0x72, 0x39, 0x02, 0x18, +- 0xb6, 0x68, 0xa4, 0x5b, 0xf5, 0xf9, 0x32, 0xac, 0xd6, 0xfa, 0x70, 0xda, +- 0x92, 0x61, 0xa2, 0x75, 0x0b, 0xb1, 0xf6, 0x93, 0x46, 0x3f, 0x7b, 0x65, +- 0xd9, 0x37, 0x8d, 0xc4, 0x5a, 0x9c, 0x6d, 0xc4, 0xb3, 0x91, 0xf0, 0xb2, +- 0x92, 0x54, 0xd2, 0xae, 0xc6, 0xe4, 0x3c, 0x58, 0x51, 0x6a, 0xec, 0xfa, +- 0x26, 0x32, 0x46, 0x89, 0xb3, 0xda, 0xa6, 0xbc, 0xcb, 0x49, 0xd8, 0x73, +- 0x9e, 0x4e, 0xfd, 0xff, 0xe0, 0x52, 0x50, 0x9d, 0x48, 0x92, 0xef, 0x0e, +- 0xe6, 0xdd, 0x42, 0x9f, 0x8b, 0xf7, 0x65, 0xbe, 0x37, 0xdc, 0x3a, 0x9e, +- 0x41, 0xc1, 0x99, 0x90, 0x1e, 0x0b, 0xfe, 0xde, 0x3c, 0x64, 0xd6, 0xc4, +- 0x3e, 0xe3, 0x53, 0xb3, 0xb4, 0xc7, 0xd4, 0x33, 0x63, 0xef, 0x9f, 0x65, +- 0x16, 0x5c, 0xfe, 0x1d, 0x46, 0x33, 0x8e, 0xe7, 0x5d, 0x37, 0xd0, 0x8e, +- 0x4e, 0xdc, 0xe2, 0x70, 0x20, 0xba, 0xfe, 0x6e, 0xa5, 0xb8, 0x07, 0xc5, +- 0x3c, 0x91, 0xb2, 0x6a, 0x62, 0x19, 0xe5, 0xbc, 0x70, 0x52, 0xd6, 0xf8, +- 0x56, 0xeb, 0xf8, 0x49, 0xa9, 0x91, 0xc3, 0xad, 0x21, 0x43, 0xed, 0x95, +- 0x9e, 0xb0, 0x9a, 0x7a, 0xfa, 0x68, 0x52, 0x6a, 0xf0, 0x14, 0x6b, 0xb0, +- 0xba, 0xdc, 0xae, 0x48, 0x1d, 0x53, 0x63, 0x5e, 0xa7, 0x03, 0x57, 0x1a, +- 0xd4, 0xfe, 0x1f, 0x40, 0x1d, 0xb0, 0xe7, 0x8a, 0x8f, 0xb6, 0x36, 0x16, +- 0xf1, 0xf0, 0x6d, 0xf3, 0x83, 0x72, 0xee, 0xc4, 0xd2, 0x71, 0x53, 0x4e, +- 0xb0, 0xb1, 0x69, 0xbe, 0x1c, 0xef, 0x21, 0x6e, 0x10, 0x6c, 0x2c, 0xd7, +- 0x27, 0x5b, 0x1b, 0x66, 0x3d, 0xe4, 0x4d, 0xc1, 0x7b, 0x5a, 0x0f, 0x7d, +- 0xaf, 0xc4, 0xa3, 0x8d, 0x9b, 0xb7, 0x13, 0x37, 0x3b, 0x13, 0x6a, 0xcb, +- 0x56, 0xe2, 0x66, 0x8d, 0xfd, 0x84, 0x0b, 0x7d, 0x78, 0xc2, 0xb0, 0x7b, +- 0x0a, 0xc1, 0xce, 0xe6, 0x49, 0x35, 0x29, 0xb8, 0xf9, 0xea, 0x06, 0x60, +- 0x37, 0x71, 0xf3, 0x72, 0xc6, 0x85, 0x7e, 0xe2, 0xe6, 0x8f, 0x98, 0x82, +- 0xee, 0x24, 0x6e, 0xbe, 0x42, 0x8c, 0x75, 0x3e, 0xfe, 0x73, 0x7c, 0xa3, +- 0x38, 0x3b, 0xdb, 0x4b, 0xec, 0x9c, 0x0c, 0xde, 0x88, 0x9d, 0xff, 0xe2, +- 0x5f, 0x60, 0xe7, 0x3d, 0xc4, 0x84, 0x3d, 0x59, 0xd9, 0x67, 0x1a, 0x6d, +- 0x7d, 0xe3, 0x94, 0x9c, 0x6d, 0xb9, 0x0d, 0xef, 0x9e, 0x1c, 0x1d, 0x22, +- 0x56, 0xc6, 0x58, 0xbc, 0x1f, 0x99, 0x19, 0xac, 0x22, 0x2e, 0x78, 0xd9, +- 0xc9, 0x75, 0xd7, 0xc5, 0x55, 0xfd, 0x4d, 0x25, 0xda, 0xd5, 0x8f, 0x28, +- 0xfb, 0x66, 0x75, 0x99, 0x26, 0x4c, 0xba, 0x12, 0xc4, 0xc6, 0xac, 0x81, +- 0xab, 0x89, 0x9d, 0xab, 0x16, 0x81, 0xda, 0x45, 0x1b, 0x3b, 0xcb, 0xdc, +- 0xac, 0x2a, 0x8a, 0x3f, 0x22, 0x76, 0x66, 0xaf, 0xcb, 0x50, 0x5b, 0x6c, +- 0x62, 0x8c, 0x2a, 0x38, 0x1a, 0xf5, 0xa1, 0x67, 0x8a, 0xb8, 0xc7, 0x9a, +- 0x9b, 0x99, 0x23, 0x3f, 0xd6, 0xfb, 0x71, 0x6c, 0xc1, 0x9e, 0x9b, 0x75, +- 0x12, 0xbf, 0xb9, 0xa2, 0x41, 0x94, 0x2f, 0xba, 0xf0, 0x1c, 0xf1, 0xf3, +- 0x36, 0xda, 0xf9, 0x0c, 0xf1, 0xf3, 0x9e, 0x1b, 0x66, 0x67, 0xb3, 0x8b, +- 0x78, 0x95, 0x58, 0xbe, 0xae, 0x16, 0x51, 0x99, 0x8b, 0x98, 0x57, 0x36, +- 0xfa, 0x70, 0xce, 0xc2, 0xcf, 0xde, 0xe5, 0xb4, 0x62, 0xcb, 0x56, 0x46, +- 0x5b, 0x88, 0x5d, 0x1d, 0xb4, 0x6b, 0xdb, 0x49, 0xb5, 0xeb, 0x25, 0xea, +- 0xa2, 0x31, 0x7a, 0xde, 0xb2, 0xc7, 0x60, 0x5c, 0x66, 0x2c, 0x43, 0xad, +- 0x72, 0xfe, 0xaa, 0x82, 0xf6, 0xee, 0x9e, 0x8c, 0x24, 0x3f, 0x80, 0x1d, +- 0x93, 0xb1, 0x5c, 0x59, 0xb1, 0x1e, 0xca, 0xbd, 0x09, 0xde, 0x4b, 0xa2, +- 0x6b, 0xa3, 0xed, 0xdf, 0xb1, 0xdc, 0x71, 0x62, 0x57, 0xd9, 0x5b, 0x0d, +- 0xf8, 0x3b, 0x8d, 0x2e, 0x4c, 0x1b, 0x61, 0x94, 0x9f, 0x2b, 0xee, 0xd1, +- 0x9e, 0x93, 0x33, 0x7b, 0x8f, 0xb6, 0x06, 0xbe, 0x53, 0xc2, 0x84, 0x49, +- 0xe2, 0xbb, 0xa0, 0xe7, 0x8e, 0xbc, 0xe0, 0xc5, 0x5e, 0x1c, 0x33, 0xd4, +- 0xd0, 0x4f, 0x18, 0x13, 0xf7, 0xc9, 0xfe, 0xfc, 0x0d, 0x33, 0xaa, 0x87, +- 0x79, 0xcf, 0xf8, 0xdc, 0x8c, 0x2a, 0x95, 0xc5, 0xaf, 0x9c, 0xcd, 0xe5, +- 0x70, 0xac, 0x93, 0x19, 0x89, 0x1a, 0x1a, 0xc3, 0x63, 0xc4, 0x1c, 0xbf, +- 0x54, 0x7c, 0x9a, 0x6b, 0xa8, 0xc9, 0xa9, 0x86, 0xe6, 0x15, 0x1f, 0xdf, +- 0xbd, 0x87, 0xf9, 0xed, 0x1e, 0xfa, 0x46, 0x64, 0xb9, 0x42, 0x71, 0xe2, +- 0xd2, 0x97, 0x2d, 0x3c, 0xea, 0xed, 0xe5, 0xb5, 0xe9, 0x7c, 0x09, 0xd7, +- 0xf4, 0x09, 0xaf, 0xe8, 0x9c, 0xb2, 0x73, 0x88, 0x96, 0xf3, 0x2e, 0x5f, +- 0x82, 0x2d, 0x5b, 0x25, 0x65, 0x7d, 0x60, 0x32, 0x60, 0x0e, 0xac, 0x94, +- 0x18, 0xd6, 0xb0, 0xd3, 0x10, 0xff, 0x1a, 0x24, 0x9f, 0x7d, 0x38, 0x62, +- 0xac, 0x66, 0xef, 0x26, 0xf3, 0xd2, 0x26, 0x62, 0xeb, 0x5e, 0xd6, 0x60, +- 0xd3, 0x4c, 0xe9, 0x69, 0xb3, 0x69, 0x93, 0xa6, 0xe7, 0x94, 0x42, 0x4d, +- 0x88, 0xf8, 0x66, 0x3d, 0x6b, 0x77, 0x5b, 0xbe, 0x09, 0x6f, 0x9e, 0xd1, +- 0xe8, 0x9b, 0xed, 0xc4, 0xef, 0xbd, 0xb8, 0x97, 0xf2, 0x7c, 0x23, 0xff, +- 0x4d, 0x24, 0xbf, 0xee, 0xc2, 0xc4, 0x54, 0x12, 0x5b, 0xd6, 0x8f, 0xe0, +- 0xd2, 0xef, 0x78, 0x98, 0xab, 0x7c, 0x78, 0x72, 0x4a, 0xf2, 0x6b, 0x09, +- 0x6f, 0xdf, 0x88, 0x45, 0x3c, 0x08, 0x5b, 0x38, 0xe4, 0x8b, 0xef, 0xd9, +- 0x18, 0xc5, 0xcb, 0x5e, 0xb8, 0xf4, 0x3e, 0xf3, 0xd0, 0xfa, 0x7f, 0x81, +- 0x67, 0x88, 0x5b, 0x88, 0x05, 0x2a, 0x62, 0xd6, 0xf9, 0xb8, 0x12, 0xde, +- 0x75, 0xd1, 0x07, 0x24, 0xa6, 0x57, 0x33, 0xd6, 0x4d, 0x62, 0xe7, 0xe5, +- 0xe2, 0xfc, 0xf2, 0xed, 0x93, 0xea, 0xd2, 0x11, 0x44, 0x88, 0xa1, 0x31, +- 0x28, 0xd8, 0xcd, 0x49, 0xbc, 0x7b, 0x25, 0x1a, 0xd5, 0xcf, 0x11, 0xef, +- 0x8e, 0xd2, 0xd6, 0x2e, 0x4d, 0x7c, 0x33, 0x80, 0xb2, 0xc5, 0x10, 0x7d, +- 0x52, 0xe6, 0x97, 0x7f, 0xe5, 0xb5, 0xe7, 0x97, 0x32, 0x33, 0x97, 0xf3, +- 0x23, 0xe8, 0x28, 0x63, 0xef, 0x56, 0xae, 0xa4, 0x99, 0x93, 0x67, 0xbd, +- 0xbb, 0x99, 0xdf, 0xfb, 0x8d, 0xa0, 0x7f, 0x77, 0x3e, 0xc0, 0xdf, 0x3a, +- 0x7f, 0x7f, 0x7e, 0x07, 0x9f, 0x0f, 0xf1, 0x33, 0x8c, 0x6c, 0x2e, 0x52, +- 0x21, 0xcd, 0x40, 0x36, 0x67, 0xe7, 0xbc, 0x70, 0xee, 0x90, 0x57, 0xb0, +- 0x66, 0xdb, 0x94, 0xfd, 0x5d, 0xbb, 0xe1, 0xfb, 0xe7, 0x31, 0xbf, 0x9b, +- 0x7c, 0x9f, 0x39, 0xa9, 0xe1, 0xa3, 0x93, 0x16, 0xe6, 0x2f, 0x10, 0xf3, +- 0x0f, 0xbb, 0x9d, 0x82, 0x35, 0x7f, 0x61, 0x9e, 0x8f, 0x46, 0x07, 0xe6, +- 0xe8, 0x07, 0x3d, 0xa4, 0xeb, 0xd0, 0x82, 0x16, 0xbf, 0x36, 0x9f, 0xf6, +- 0xcc, 0xf7, 0xf2, 0xc9, 0x18, 0xde, 0xb9, 0x3e, 0x63, 0xfd, 0xa4, 0xcc, +- 0x9a, 0x15, 0xe3, 0xb1, 0x77, 0x37, 0xc1, 0xd3, 0xc2, 0x7e, 0xd3, 0xcd, +- 0xe7, 0x43, 0xd6, 0xf3, 0x32, 0xf3, 0xbd, 0x8e, 0x9d, 0x3f, 0xba, 0xfe, +- 0xce, 0x61, 0x76, 0x6a, 0x9e, 0xf3, 0x8c, 0x2d, 0xa7, 0xf5, 0x9c, 0xcc, +- 0x65, 0xbd, 0xcb, 0xb0, 0xe2, 0x6b, 0x88, 0x32, 0x89, 0x7d, 0x0f, 0x99, +- 0xb6, 0xdf, 0x06, 0xfd, 0x3b, 0x19, 0x0f, 0xdf, 0xa6, 0x7d, 0x76, 0x9e, +- 0xab, 0xf3, 0xdf, 0x6d, 0xec, 0xb2, 0x64, 0xbe, 0xfb, 0x9c, 0xd4, 0x24, +- 0xb9, 0xff, 0x40, 0x85, 0x60, 0xef, 0x27, 0x59, 0xb3, 0x46, 0x0d, 0xd9, +- 0x03, 0x80, 0xe2, 0x4a, 0x1c, 0x41, 0xe7, 0x74, 0x18, 0x6f, 0xeb, 0xde, +- 0xe2, 0x59, 0x17, 0x89, 0xc9, 0x69, 0xc6, 0x64, 0x10, 0x63, 0x46, 0x24, +- 0xfc, 0x36, 0xf1, 0x69, 0x9a, 0x0c, 0x1f, 0xcb, 0x3a, 0xf1, 0x36, 0x31, +- 0x23, 0x14, 0xfb, 0xac, 0xa8, 0xfd, 0x6e, 0xe9, 0xef, 0x4a, 0x84, 0x6b, +- 0x22, 0x2d, 0x07, 0x50, 0x87, 0x0c, 0x73, 0xbe, 0x57, 0xfb, 0x21, 0x8e, +- 0x9f, 0x70, 0xe0, 0x7e, 0xf6, 0x7d, 0xc9, 0xbb, 0x74, 0x7e, 0x6f, 0x1c, +- 0x7a, 0x1f, 0xff, 0x68, 0xce, 0xca, 0x79, 0x2c, 0x45, 0xce, 0x7c, 0x7c, +- 0x62, 0xd6, 0x6a, 0x5a, 0xe1, 0x07, 0xd0, 0x52, 0x57, 0xd1, 0x38, 0xbc, +- 0x8c, 0x0f, 0xcc, 0x02, 0xef, 0xbd, 0xc7, 0xf8, 0x79, 0x49, 0x8f, 0x84, +- 0x1c, 0x14, 0xa6, 0x10, 0x74, 0xe2, 0x3e, 0x5d, 0xe6, 0x29, 0xea, 0xf0, +- 0xb3, 0x50, 0x87, 0x2e, 0x28, 0x72, 0x86, 0xe7, 0x92, 0x99, 0xae, 0x91, +- 0x75, 0x15, 0xac, 0x5b, 0xd3, 0xd8, 0x55, 0x06, 0xb5, 0xc5, 0xad, 0x68, +- 0xfa, 0xfb, 0xca, 0xff, 0x32, 0x0b, 0xc1, 0x4f, 0xcc, 0x77, 0xb4, 0x12, +- 0x5d, 0x35, 0xec, 0x71, 0x96, 0x78, 0xab, 0xc3, 0x71, 0x43, 0xf6, 0xf1, +- 0x7e, 0x88, 0xfb, 0x4f, 0xb8, 0xd0, 0x1e, 0xff, 0xb9, 0x99, 0x0e, 0x0a, +- 0xcd, 0x50, 0x25, 0x2a, 0x84, 0xbe, 0x3d, 0xdb, 0x7e, 0x31, 0x0f, 0xa5, +- 0xc3, 0x10, 0xbc, 0x2c, 0x7e, 0x3a, 0x0d, 0xd3, 0x90, 0x99, 0xa2, 0x89, +- 0x3b, 0xe3, 0x23, 0x78, 0x2f, 0x9e, 0xfc, 0x4f, 0x1e, 0xa8, 0x4b, 0x97, +- 0x9d, 0x6a, 0xa1, 0xc9, 0x19, 0x56, 0xbc, 0x0d, 0xda, 0x70, 0x83, 0x55, +- 0x6f, 0x2e, 0xb2, 0x77, 0xf2, 0x31, 0xb7, 0x48, 0x8f, 0x39, 0x8d, 0xc5, +- 0xc9, 0x34, 0x5c, 0xc4, 0x76, 0xa3, 0xcd, 0x6a, 0xff, 0x33, 0x8a, 0x1a, +- 0x3a, 0xa8, 0x84, 0x95, 0x7b, 0xb5, 0x14, 0x9e, 0xd3, 0xa3, 0xc9, 0x36, +- 0xa5, 0xce, 0xd3, 0x95, 0x2f, 0xd1, 0x6e, 0x27, 0x56, 0x51, 0x0b, 0x97, +- 0x9d, 0xe5, 0xa8, 0xdd, 0xa0, 0x75, 0x95, 0x3b, 0xd5, 0xd4, 0xd7, 0x18, +- 0x5f, 0xdb, 0xf3, 0x05, 0xef, 0xfb, 0x51, 0x07, 0xd6, 0x5a, 0xfb, 0x0d, +- 0x99, 0xe2, 0xbc, 0x74, 0x1a, 0xdd, 0x93, 0xe6, 0x96, 0x8b, 0x71, 0x35, +- 0xf4, 0x8c, 0x92, 0xde, 0xed, 0x23, 0xa6, 0x79, 0x00, 0x5a, 0x78, 0x81, +- 0x75, 0xaa, 0x3d, 0xef, 0xc0, 0x2d, 0xa7, 0x84, 0x66, 0x86, 0x34, 0x8f, +- 0xa0, 0xfc, 0x84, 0xb9, 0x65, 0xb7, 0xae, 0xa6, 0x2e, 0x3b, 0xd3, 0xff, +- 0xbd, 0x96, 0x7a, 0xeb, 0x50, 0x64, 0xbf, 0x6d, 0x84, 0xb8, 0x62, 0x44, +- 0xce, 0xcd, 0xc5, 0xfe, 0x98, 0x98, 0xe2, 0x5b, 0xf4, 0x55, 0x67, 0xc2, +- 0x4f, 0x3e, 0xd5, 0xd8, 0x1c, 0x64, 0xce, 0x1e, 0xc6, 0x65, 0x3d, 0xed, +- 0xed, 0x6c, 0x88, 0x11, 0x9b, 0x85, 0x58, 0x07, 0xc3, 0x38, 0x46, 0x8c, +- 0x77, 0x24, 0x5f, 0x86, 0x42, 0x40, 0x23, 0x36, 0xeb, 0x85, 0x63, 0xd2, +- 0xa7, 0xcc, 0x67, 0x22, 0x7a, 0x3b, 0xfe, 0x33, 0x0a, 0x21, 0x71, 0x91, +- 0x23, 0xf0, 0x9d, 0xf8, 0x7b, 0xb3, 0x4a, 0xd3, 0x5a, 0x26, 0x15, 0xae, +- 0xfb, 0x54, 0x88, 0x3a, 0xe6, 0x7b, 0x72, 0xbe, 0xc5, 0xe8, 0xc1, 0xbd, +- 0x93, 0x41, 0xbe, 0x5f, 0x85, 0x75, 0x27, 0xc2, 0xb8, 0x12, 0xbf, 0x19, +- 0x85, 0x1a, 0x1b, 0x03, 0x79, 0x35, 0xfa, 0x11, 0xfb, 0xac, 0x34, 0x7b, +- 0x4a, 0xd9, 0x63, 0x3a, 0x62, 0x48, 0x7f, 0xee, 0xe2, 0x77, 0x1f, 0x7f, +- 0x45, 0x9f, 0xdf, 0x2a, 0x62, 0x9d, 0xa9, 0xd6, 0xf0, 0xfc, 0xcf, 0x2b, +- 0xec, 0x79, 0x5a, 0x98, 0xcf, 0x05, 0xac, 0x19, 0xe1, 0x28, 0x69, 0x9e, +- 0x9d, 0x96, 0xbe, 0xad, 0x6d, 0xb3, 0xa7, 0xb8, 0x4f, 0xff, 0x53, 0xdd, +- 0x81, 0x2d, 0xec, 0xed, 0x43, 0x9a, 0xd4, 0xcb, 0x51, 0xb5, 0x16, 0x9b, +- 0x71, 0x3a, 0xc0, 0x26, 0x5c, 0xfb, 0x0f, 0x98, 0x08, 0xc4, 0x98, 0xf3, +- 0x35, 0xbc, 0x9b, 0xf9, 0x32, 0xfb, 0x9d, 0x3a, 0x39, 0xe3, 0x83, 0x5b, +- 0x4e, 0xb8, 0xb9, 0xe6, 0x16, 0xe2, 0x9a, 0x4e, 0xbc, 0x16, 0xb0, 0x7b, +- 0x8d, 0xa3, 0xbc, 0x3e, 0x3e, 0xe7, 0x23, 0x16, 0xf5, 0xf0, 0xf7, 0x46, +- 0xde, 0xbe, 0x88, 0x27, 0x91, 0xe5, 0xdf, 0xe2, 0xc9, 0x43, 0x3c, 0xa0, +- 0xe1, 0x6a, 0xe6, 0x65, 0x5c, 0x21, 0xed, 0xf4, 0x9c, 0x4d, 0x73, 0x2a, +- 0x2f, 0x74, 0x65, 0xbd, 0x48, 0xaa, 0xd6, 0x29, 0xf4, 0x7d, 0x72, 0xde, +- 0xf7, 0xdf, 0xb9, 0x06, 0x91, 0xdd, 0x09, 0xf6, 0xc7, 0x7a, 0x03, 0xda, +- 0x03, 0xb4, 0x97, 0x21, 0x6b, 0xa8, 0xec, 0x45, 0xe5, 0xdd, 0x10, 0xd6, +- 0x4e, 0x9a, 0x23, 0xa1, 0x84, 0x5c, 0x37, 0xcd, 0xea, 0x4d, 0x5a, 0xe8, +- 0x4d, 0xc5, 0xc5, 0x5a, 0xe7, 0xa2, 0x0e, 0xc6, 0x71, 0x36, 0xd3, 0xb8, +- 0xf4, 0x1e, 0xb1, 0x53, 0x98, 0xbd, 0xde, 0x25, 0xe7, 0x38, 0xe6, 0x33, +- 0x0b, 0x95, 0x32, 0x23, 0x18, 0xcf, 0xfb, 0x94, 0xb9, 0xcc, 0x91, 0x4a, +- 0xc9, 0x45, 0x63, 0xf4, 0x85, 0xa6, 0x49, 0xe1, 0xd5, 0x1c, 0xa9, 0x22, +- 0x9d, 0x63, 0xa4, 0x33, 0xb7, 0x51, 0xeb, 0x1f, 0x53, 0x44, 0x67, 0x3e, +- 0xe2, 0xba, 0x8b, 0x32, 0x3f, 0xa3, 0xde, 0xfe, 0x94, 0xcf, 0x8b, 0xde, +- 0x82, 0x78, 0xad, 0x48, 0xe7, 0x89, 0xfc, 0x12, 0xe6, 0x32, 0x1f, 0x58, +- 0x7f, 0x8f, 0xe5, 0x63, 0xac, 0x7d, 0x83, 0xc8, 0x31, 0x9f, 0x4c, 0x66, +- 0x1a, 0xfb, 0x27, 0xc9, 0x87, 0x7d, 0x36, 0x6f, 0x10, 0x4f, 0x17, 0x9f, +- 0x19, 0xe5, 0xbb, 0xa3, 0xd7, 0xfe, 0x16, 0x1d, 0xd9, 0xfb, 0xff, 0xf6, +- 0x1e, 0x43, 0x39, 0x6d, 0x67, 0xf7, 0xe1, 0x47, 0x0d, 0xb7, 0xcc, 0xc3, +- 0xf1, 0xf2, 0xf4, 0x16, 0x8c, 0xe9, 0x7f, 0x8e, 0xbd, 0x94, 0x7b, 0x9c, +- 0xfa, 0x3c, 0x61, 0x58, 0xfb, 0xfc, 0x72, 0xfe, 0x8b, 0xb9, 0xfa, 0x60, +- 0xeb, 0x19, 0x62, 0xb1, 0xe3, 0x8c, 0x99, 0xfd, 0xf1, 0xc6, 0xde, 0x57, +- 0xe8, 0x77, 0xc9, 0xdf, 0x96, 0xbd, 0x74, 0x60, 0x32, 0xfb, 0x0d, 0xcc, +- 0xd6, 0x34, 0x2e, 0x3f, 0xcf, 0x9c, 0x70, 0x9a, 0x79, 0xca, 0xc5, 0x9c, +- 0x50, 0x9d, 0x25, 0x86, 0x64, 0x9e, 0x2a, 0x30, 0x4f, 0xb9, 0xb4, 0xc6, +- 0xa5, 0x79, 0xfc, 0x15, 0xf5, 0x22, 0xfc, 0x45, 0x62, 0xf3, 0x90, 0x67, +- 0xed, 0xf9, 0xab, 0x36, 0x3f, 0x84, 0x4b, 0x37, 0xdb, 0x33, 0x34, 0x27, +- 0x6b, 0xf6, 0xbe, 0x4c, 0x63, 0x60, 0x4c, 0x68, 0xf7, 0xa9, 0xa1, 0x34, +- 0x6d, 0x35, 0x61, 0x61, 0xef, 0x61, 0xf6, 0x0b, 0x72, 0xde, 0xab, 0x0a, +- 0x2e, 0xfa, 0xfe, 0x98, 0x2e, 0xe7, 0x20, 0x42, 0xfe, 0xed, 0xb4, 0xe1, +- 0x98, 0xd1, 0xd8, 0x12, 0x51, 0x76, 0xe3, 0x52, 0x31, 0xc7, 0xda, 0x58, +- 0x5a, 0xed, 0x3f, 0x86, 0xc6, 0xde, 0x07, 0xf0, 0x75, 0x24, 0x6b, 0x1a, +- 0x07, 0xa6, 0x11, 0xd1, 0xef, 0x83, 0x9c, 0x1b, 0xb5, 0x69, 0xd5, 0xe7, +- 0x9c, 0xc4, 0x23, 0x9f, 0x98, 0xab, 0xb5, 0x27, 0x30, 0x4d, 0xcc, 0xd8, +- 0xb0, 0x5e, 0x5b, 0xfa, 0x6e, 0xf1, 0x9e, 0xbd, 0xa7, 0x24, 0xfe, 0xe2, +- 0xa1, 0x0e, 0xca, 0xe1, 0x5a, 0x51, 0xc7, 0x35, 0xa8, 0x0b, 0xeb, 0x4c, +- 0xf1, 0x45, 0x1c, 0xa2, 0xbf, 0x4d, 0xe7, 0x15, 0xe8, 0xf5, 0x17, 0x31, +- 0x2c, 0xb5, 0x89, 0xef, 0xb4, 0x65, 0x7c, 0xc4, 0x29, 0x21, 0x94, 0x6b, +- 0x91, 0xf0, 0x28, 0xe5, 0x6b, 0x63, 0x2e, 0x1f, 0x67, 0x0e, 0x49, 0x07, +- 0x7c, 0xd6, 0x39, 0xd7, 0x72, 0x2d, 0x64, 0xfd, 0x6f, 0x82, 0xf4, 0x41, +- 0x0d, 0xb3, 0xb2, 0x9f, 0x7d, 0x04, 0x17, 0xa7, 0x0b, 0x38, 0x1e, 0x4f, +- 0xe2, 0x40, 0x4d, 0x00, 0x93, 0xc6, 0x4a, 0x6b, 0x6e, 0x20, 0xfd, 0x56, +- 0x77, 0xf6, 0xb0, 0x35, 0x8b, 0xdc, 0x16, 0x77, 0xd4, 0xcb, 0x79, 0x8f, +- 0x39, 0xf6, 0x5d, 0xd3, 0xfa, 0x08, 0x0e, 0xe9, 0xdf, 0x82, 0xbe, 0x42, +- 0x72, 0xe7, 0x18, 0xce, 0xcf, 0x4a, 0x0d, 0x9b, 0x68, 0xbd, 0x75, 0x52, +- 0xf4, 0xe3, 0x20, 0xe6, 0xf5, 0xa0, 0xc9, 0xc2, 0x70, 0xaf, 0xb7, 0xae, +- 0x99, 0xb5, 0xb1, 0x5c, 0x53, 0x4e, 0xce, 0x66, 0x57, 0xc1, 0x4f, 0x7d, +- 0x5d, 0x88, 0xbb, 0x99, 0x73, 0x44, 0x9f, 0x72, 0x16, 0xd0, 0x96, 0x33, +- 0x96, 0x53, 0x30, 0xd6, 0x7c, 0xe3, 0x5e, 0x8b, 0xfc, 0x9f, 0xc2, 0xb5, +- 0xf3, 0x89, 0xc5, 0xd9, 0xf8, 0x1f, 0x9b, 0x97, 0x6e, 0x12, 0xb9, 0x5b, +- 0x7d, 0xcc, 0xe9, 0xe1, 0xd9, 0x6b, 0xfa, 0x15, 0x9d, 0x9e, 0x93, 0x9a, +- 0x61, 0xe9, 0xdc, 0x9e, 0xb7, 0xa9, 0xc3, 0xef, 0x28, 0x8d, 0xac, 0x27, +- 0xf4, 0xab, 0x1a, 0xfa, 0x5b, 0x13, 0x06, 0x56, 0x27, 0x5c, 0x7d, 0x57, +- 0x8d, 0x2d, 0x68, 0xd9, 0xf0, 0xae, 0x89, 0x9b, 0xdb, 0xe0, 0xd4, 0xe4, +- 0xfa, 0xac, 0x99, 0x0c, 0xc8, 0xdf, 0x4f, 0xfa, 0xa4, 0x96, 0xbf, 0x68, +- 0x14, 0xcc, 0x35, 0x2b, 0x6d, 0x6c, 0xf8, 0xf7, 0x19, 0xd9, 0x07, 0x4b, +- 0x9b, 0xec, 0xb5, 0x97, 0xde, 0x76, 0x1e, 0xc6, 0xdf, 0xe6, 0x8e, 0xe0, +- 0xad, 0x69, 0x17, 0x71, 0xa6, 0xc8, 0xb2, 0x05, 0xd5, 0x1b, 0xa2, 0xc9, +- 0x77, 0x99, 0x17, 0x97, 0x66, 0x4b, 0x7e, 0xf1, 0x7a, 0xeb, 0xda, 0x59, +- 0x85, 0xb4, 0xaa, 0x50, 0x46, 0x39, 0x7f, 0xac, 0x3b, 0x11, 0x2e, 0x62, +- 0x5b, 0x27, 0xf9, 0xdc, 0x97, 0xb1, 0x31, 0x6f, 0x24, 0x37, 0xed, 0xb3, +- 0xe7, 0x5f, 0x3e, 0xe6, 0xd1, 0x71, 0x4c, 0x64, 0x1a, 0x63, 0xef, 0xc9, +- 0x79, 0x1e, 0xf6, 0x62, 0x97, 0x30, 0x8e, 0x13, 0x99, 0x52, 0x0e, 0x0d, +- 0xc9, 0x39, 0xd8, 0x58, 0xd8, 0x61, 0xe7, 0xc8, 0xb0, 0x43, 0x4d, 0xf3, +- 0xd7, 0x27, 0xd8, 0x60, 0x34, 0x1f, 0x09, 0x95, 0xc3, 0x89, 0xfd, 0xba, +- 0xed, 0x1f, 0xf5, 0xf3, 0x6e, 0x84, 0x57, 0x48, 0x5d, 0x96, 0x9a, 0xec, +- 0x62, 0x4d, 0x5e, 0x89, 0xe4, 0x4a, 0x17, 0x5e, 0xd7, 0x44, 0x1f, 0x53, +- 0x25, 0x7d, 0xe8, 0xe7, 0xf0, 0x90, 0x59, 0xe8, 0x15, 0x5f, 0x72, 0xe3, +- 0x48, 0xd3, 0x9c, 0x39, 0x1b, 0x14, 0xd9, 0x9d, 0x38, 0xcd, 0xfc, 0x8a, +- 0x9b, 0x23, 0xa1, 0xd3, 0xac, 0xd9, 0x63, 0x5a, 0xc9, 0xc7, 0xff, 0x63, +- 0x91, 0x4f, 0xad, 0x7f, 0x01, 0x47, 0xf8, 0x77, 0x7d, 0xe8, 0x80, 0x62, +- 0xaf, 0xb7, 0x66, 0xfe, 0x43, 0x5f, 0x69, 0x76, 0x2a, 0xcf, 0x86, 0x73, +- 0xa7, 0xf9, 0x5d, 0x68, 0xf9, 0xe8, 0x9f, 0xe5, 0x18, 0x08, 0xca, 0x79, +- 0x10, 0xd1, 0x8b, 0xec, 0x3f, 0x82, 0xfa, 0x30, 0xf1, 0x32, 0xf5, 0x71, +- 0xe4, 0xda, 0xd9, 0x2b, 0x3b, 0x7f, 0x55, 0xf0, 0xfa, 0xf6, 0xf8, 0x4b, +- 0x9b, 0xbd, 0xf8, 0x95, 0x79, 0x29, 0x18, 0x62, 0x4e, 0x10, 0x9b, 0xa6, +- 0x2c, 0x1c, 0xe9, 0x24, 0x3e, 0xd9, 0x67, 0x9f, 0x33, 0x69, 0x95, 0xff, +- 0xa1, 0x29, 0xca, 0x51, 0x18, 0x24, 0xce, 0x5e, 0xcc, 0x58, 0x67, 0xfb, +- 0x06, 0xde, 0x54, 0x22, 0xcc, 0x35, 0x5f, 0xc2, 0x40, 0xad, 0xd0, 0x0b, +- 0xf8, 0x77, 0xce, 0xc4, 0xa8, 0x83, 0x3a, 0xa1, 0x6b, 0x3e, 0xc3, 0x6e, +- 0xee, 0xc8, 0xa4, 0xd0, 0x07, 0xc6, 0x26, 0x23, 0x43, 0x3f, 0x06, 0x36, +- 0x57, 0x41, 0x4d, 0x2d, 0x14, 0xff, 0xdf, 0xe3, 0x67, 0x8a, 0xd0, 0x12, +- 0x3a, 0x2e, 0x18, 0xcc, 0x71, 0x53, 0x8b, 0x15, 0xd4, 0x9d, 0xda, 0xfb, +- 0x3d, 0xa5, 0x02, 0x4f, 0x3c, 0x15, 0x23, 0xef, 0x2b, 0xfc, 0xdb, 0x67, +- 0x3c, 0xf0, 0x9e, 0xa9, 0x62, 0xcd, 0xf5, 0xe0, 0x72, 0x33, 0xed, 0xfa, +- 0x54, 0x89, 0x77, 0x6b, 0x9f, 0x14, 0x8f, 0x67, 0xc3, 0x30, 0xe8, 0xb3, +- 0x8b, 0x86, 0xec, 0x17, 0x7b, 0xac, 0xfc, 0xb9, 0xb4, 0xb1, 0xce, 0xda, +- 0xaf, 0x7a, 0x3e, 0xaf, 0x85, 0xce, 0x2a, 0x55, 0xf8, 0xe0, 0x44, 0xe1, +- 0xe6, 0x72, 0x98, 0x2f, 0xae, 0x4e, 0x44, 0xfb, 0xf7, 0xd2, 0xe7, 0xd7, +- 0xae, 0x09, 0xb2, 0x97, 0x61, 0x4f, 0xb9, 0x49, 0xfa, 0xdf, 0x69, 0xf6, +- 0xbf, 0xa5, 0xbd, 0x7f, 0x6d, 0xe8, 0x11, 0x25, 0xdd, 0xe9, 0x87, 0xf9, +- 0x51, 0x79, 0xc2, 0xfc, 0xd8, 0x9d, 0x88, 0xf2, 0x7d, 0xd9, 0xdf, 0x33, +- 0xcd, 0x9f, 0x36, 0x9b, 0x66, 0xae, 0x39, 0xd2, 0x1f, 0x70, 0x06, 0x70, +- 0xa6, 0x41, 0xf6, 0x04, 0x1d, 0xf8, 0x20, 0xaa, 0x85, 0xf6, 0x42, 0xf6, +- 0xe8, 0x99, 0xe3, 0x57, 0xca, 0xf9, 0xc4, 0x3a, 0x7f, 0x97, 0xb1, 0x02, +- 0xcf, 0x2d, 0x6c, 0xc2, 0x80, 0x1b, 0xd6, 0xf9, 0x19, 0x53, 0xc7, 0x9b, +- 0xab, 0x21, 0x75, 0x3b, 0xda, 0xf2, 0x08, 0x82, 0x58, 0xc8, 0x1f, 0xc1, +- 0xc3, 0x27, 0x64, 0xaf, 0x71, 0xb2, 0xd5, 0x73, 0xc2, 0xfc, 0xfb, 0x50, +- 0xa2, 0xc0, 0xbc, 0x68, 0x9a, 0x15, 0x9b, 0x1a, 0x43, 0x2c, 0x47, 0xc4, +- 0x18, 0x69, 0xc1, 0xee, 0x43, 0x1f, 0xa0, 0x06, 0x67, 0xe7, 0x92, 0x37, +- 0xb3, 0x97, 0xec, 0x7a, 0x5a, 0x09, 0xe0, 0x07, 0x94, 0xf1, 0xd9, 0xbc, +- 0xe0, 0x14, 0xa3, 0xb5, 0xfb, 0xc4, 0x2a, 0xbc, 0xb8, 0x10, 0xc4, 0x59, +- 0x43, 0x23, 0x4e, 0x82, 0x52, 0x99, 0x30, 0xab, 0xab, 0xc9, 0x6b, 0xa5, +- 0xd3, 0x89, 0xce, 0xb8, 0xf4, 0x87, 0xda, 0x90, 0x4f, 0xc1, 0xaa, 0x72, +- 0x68, 0xcb, 0x0f, 0x01, 0xc3, 0x5e, 0xf6, 0xab, 0x4f, 0x2b, 0xd1, 0xfe, +- 0xf7, 0x9d, 0x41, 0xfc, 0x80, 0xf9, 0xe7, 0x7b, 0x79, 0x39, 0x5b, 0xc5, +- 0x1c, 0x33, 0x17, 0xa6, 0xad, 0x3c, 0x70, 0xd4, 0x57, 0xe1, 0x28, 0xe3, +- 0xe5, 0x65, 0xbd, 0x8c, 0x39, 0x4a, 0xce, 0x5a, 0x49, 0x7e, 0x7f, 0x54, +- 0xce, 0x94, 0x98, 0xcf, 0x6b, 0x76, 0xbf, 0xaf, 0xcf, 0xdf, 0x78, 0x5e, +- 0x39, 0xc0, 0xbc, 0xde, 0xd8, 0x1b, 0x52, 0x5e, 0x35, 0x93, 0xbf, 0xad, +- 0x50, 0xce, 0x07, 0xab, 0x50, 0x61, 0xc9, 0x8a, 0xd1, 0x6c, 0xa9, 0xa6, +- 0x54, 0x4b, 0x2f, 0xd7, 0x9b, 0x2e, 0xfa, 0x60, 0x25, 0x63, 0xfd, 0x18, +- 0x6b, 0x74, 0xf9, 0x09, 0xa9, 0x25, 0xec, 0x5f, 0x94, 0x2d, 0xc4, 0xc2, +- 0x82, 0x1b, 0x3c, 0x78, 0x20, 0xa0, 0xb6, 0xc8, 0x99, 0xed, 0x67, 0xf3, +- 0x1d, 0x2e, 0x39, 0x3b, 0xf5, 0x5c, 0x5e, 0x6a, 0xb9, 0xe4, 0x82, 0xd2, +- 0x7a, 0x21, 0xd4, 0x4e, 0x8a, 0x8d, 0x86, 0x5b, 0x3f, 0x9a, 0xf4, 0xc9, +- 0xf9, 0xfa, 0x11, 0x07, 0x7b, 0x6d, 0xcf, 0xa4, 0x69, 0xee, 0x69, 0xd6, +- 0x86, 0xb6, 0x38, 0x65, 0x6f, 0x39, 0x32, 0x70, 0x4e, 0x51, 0x5b, 0x26, +- 0x94, 0x1b, 0xe9, 0xfc, 0xb7, 0x2a, 0x89, 0x91, 0x34, 0xe5, 0x7c, 0xdc, +- 0x92, 0x69, 0x8a, 0x32, 0x95, 0xce, 0x16, 0x55, 0xe1, 0xf2, 0x34, 0x34, +- 0x46, 0x2d, 0xce, 0xeb, 0x4c, 0x4e, 0x81, 0x68, 0xb2, 0x1d, 0xe2, 0xff, +- 0xea, 0x80, 0x60, 0xa8, 0x4a, 0xe6, 0xe4, 0xb9, 0x69, 0xa9, 0x31, 0x8a, +- 0xe0, 0x93, 0x34, 0xd7, 0xc6, 0x95, 0x8d, 0xc0, 0xab, 0x93, 0xf6, 0xde, +- 0x7b, 0xf1, 0x2c, 0xb8, 0x75, 0xe6, 0xe1, 0x11, 0xeb, 0x2c, 0x83, 0xd0, +- 0x3f, 0x8c, 0x33, 0x19, 0xc1, 0x94, 0xc3, 0xc4, 0x94, 0x91, 0x14, 0xf1, +- 0x66, 0x4b, 0xde, 0x3e, 0x97, 0xa5, 0x7f, 0x44, 0x9f, 0x7f, 0x9a, 0x58, +- 0xf5, 0x28, 0xec, 0xbd, 0xf7, 0x86, 0xe2, 0x59, 0x85, 0x48, 0xae, 0x4b, +- 0xd9, 0x91, 0x97, 0x18, 0x9b, 0x66, 0x8c, 0xb5, 0x2b, 0xdb, 0x17, 0x3a, +- 0x94, 0xee, 0x85, 0x1e, 0x65, 0x77, 0x5e, 0x7a, 0xd6, 0xc9, 0xd6, 0x07, +- 0x4e, 0xec, 0x52, 0x76, 0xcc, 0xf5, 0x29, 0xc4, 0xb4, 0x01, 0x4f, 0xa2, +- 0x5f, 0xe9, 0x59, 0xb0, 0xe7, 0xe7, 0x5d, 0xec, 0xbb, 0x76, 0x18, 0xa5, +- 0x7e, 0x5e, 0xfe, 0xdf, 0x2b, 0x28, 0xff, 0x5b, 0x31, 0xb0, 0x4d, 0x31, +- 0xcd, 0xdb, 0xe2, 0x7f, 0x27, 0xf6, 0x30, 0x9f, 0x8d, 0xb3, 0x36, 0x1a, +- 0x55, 0x18, 0x64, 0xdf, 0x31, 0xaa, 0xdf, 0x5a, 0xdc, 0x2f, 0x13, 0x99, +- 0xe4, 0x3c, 0x85, 0xf8, 0x2b, 0xd2, 0xe5, 0xe4, 0xe1, 0x1f, 0xc8, 0xff, +- 0x81, 0xa2, 0x5c, 0x3d, 0x72, 0xa6, 0xc0, 0x7d, 0xfd, 0xbc, 0xd9, 0xf1, +- 0xc9, 0xeb, 0x72, 0x31, 0xd7, 0x63, 0x9c, 0xf8, 0xf4, 0x80, 0xa2, 0xa6, +- 0x9e, 0xb1, 0xe5, 0x5a, 0xba, 0xcc, 0x18, 0x1e, 0xb5, 0x62, 0xd8, 0x96, +- 0x6b, 0x5d, 0x51, 0xae, 0xb5, 0xb9, 0x2e, 0xeb, 0x1c, 0x17, 0xf1, 0x7a, +- 0xeb, 0xe2, 0xa4, 0x9c, 0x37, 0x93, 0xd9, 0xa5, 0xc8, 0x26, 0x72, 0x9c, +- 0x30, 0x2b, 0xb4, 0x1e, 0x65, 0xa7, 0x75, 0xfe, 0x4c, 0xce, 0x7e, 0xc9, +- 0x5e, 0x7f, 0x49, 0x2e, 0xa9, 0xe3, 0x2b, 0xfc, 0x1d, 0x33, 0x72, 0x1e, +- 0xdb, 0x34, 0x5f, 0xd3, 0x83, 0x7e, 0x91, 0xe5, 0xac, 0x2e, 0xb2, 0xc8, +- 0xb9, 0x92, 0x92, 0x3c, 0x5f, 0x2b, 0xca, 0x23, 0xb6, 0xba, 0x6e, 0xa7, +- 0xd2, 0xff, 0x09, 0xbe, 0x9d, 0xb1, 0xcf, 0x9c, 0x94, 0xe4, 0xf1, 0x27, +- 0x84, 0xff, 0x8b, 0xad, 0xe3, 0xd3, 0xc3, 0x78, 0x95, 0xf7, 0x7f, 0x9e, +- 0x29, 0xc9, 0xe5, 0xc4, 0xfc, 0x5c, 0xe9, 0x2c, 0x1d, 0x5b, 0x4a, 0x23, +- 0xa2, 0x8f, 0xd1, 0x8f, 0x6c, 0xf9, 0xe4, 0x2c, 0x5d, 0x63, 0xe1, 0xb2, +- 0x35, 0xf7, 0x8a, 0x26, 0xd9, 0x2f, 0xe3, 0x6c, 0xfe, 0xd7, 0xed, 0xd7, +- 0x94, 0xab, 0x60, 0x8f, 0x2c, 0xb4, 0x5f, 0x27, 0x6d, 0x39, 0x73, 0xa2, +- 0xe0, 0x99, 0x39, 0x60, 0xce, 0xe0, 0xb2, 0x89, 0x11, 0x3c, 0xa9, 0x9b, +- 0xe6, 0xd3, 0xcd, 0x9a, 0x9c, 0x15, 0xba, 0x50, 0x6b, 0xcd, 0x85, 0xa0, +- 0x57, 0x69, 0xb2, 0x77, 0x27, 0xe7, 0x4d, 0xfa, 0xa8, 0x03, 0x91, 0x5d, +- 0x7c, 0xa0, 0x64, 0x7b, 0x39, 0x07, 0x97, 0xa6, 0x7e, 0x44, 0x37, 0xa5, +- 0xf3, 0x70, 0x32, 0x73, 0xb9, 0x51, 0x27, 0x5d, 0x96, 0x4e, 0x9e, 0xd5, +- 0xc5, 0x5f, 0x99, 0x7d, 0xe8, 0xab, 0xf3, 0xc4, 0x0f, 0x63, 0xba, 0xdb, +- 0xc2, 0x6a, 0x47, 0x89, 0x4f, 0x26, 0x18, 0x3b, 0x8f, 0x1b, 0x4b, 0x58, +- 0xca, 0xbd, 0x8c, 0x57, 0xaf, 0xfd, 0xcf, 0x9c, 0xf8, 0x8b, 0xde, 0xd2, +- 0x6d, 0x9d, 0x79, 0xfa, 0xa4, 0xe5, 0xd6, 0xa8, 0xe4, 0xa1, 0x1f, 0x36, +- 0xc9, 0x19, 0xa8, 0xf2, 0x44, 0xe0, 0x6b, 0xb2, 0xbf, 0x55, 0x96, 0x98, +- 0xfd, 0xea, 0x05, 0x4d, 0x74, 0xa3, 0x35, 0x9f, 0xd1, 0x44, 0xae, 0x1e, +- 0x7d, 0xdc, 0xfa, 0x1f, 0xce, 0x96, 0x4d, 0xfb, 0x34, 0x89, 0x1d, 0xdf, +- 0xc6, 0x36, 0x2b, 0x27, 0x9c, 0x4e, 0xdc, 0x66, 0xe9, 0xe0, 0x64, 0xe2, +- 0x56, 0xeb, 0x73, 0x3a, 0x11, 0xb3, 0x3e, 0xff, 0x24, 0x61, 0xeb, 0x26, +- 0x97, 0xa8, 0xb7, 0x3e, 0xe7, 0x13, 0xf6, 0xd9, 0xe9, 0xd9, 0x84, 0x66, +- 0x7d, 0x3e, 0x9f, 0x88, 0x58, 0x9f, 0x67, 0x13, 0xb7, 0x5c, 0xe7, 0x8b, +- 0x3f, 0xff, 0x0f, 0x4c, 0xd3, 0x85, 0x76, 0xdc, 0x3a, 0x00, 0x00, 0x00 }; ++ 0x9d, 0x7b, 0x0d, 0x70, 0x5c, 0xd5, 0x95, 0xe6, 0x77, 0xbb, 0x5b, 0x52, ++ 0xb7, 0x2c, 0xb5, 0x5a, 0xa6, 0x6d, 0x5a, 0x33, 0xce, 0xb8, 0x1f, 0xfd, ++ 0x9e, 0xd4, 0x20, 0xd9, 0xbc, 0x96, 0x65, 0x2c, 0x26, 0x2f, 0xb8, 0x23, ++ 0xcb, 0xb6, 0xfc, 0x07, 0xb2, 0x51, 0x32, 0xf2, 0x2c, 0xbb, 0x68, 0x6c, ++ 0x81, 0x05, 0x36, 0x46, 0x04, 0x6d, 0x56, 0x64, 0x33, 0xa3, 0x46, 0x92, ++ 0x8d, 0xc1, 0x2d, 0x3d, 0x09, 0x99, 0xc8, 0xa4, 0xa6, 0x26, 0xc2, 0x92, ++ 0x91, 0x21, 0x2d, 0x35, 0x04, 0x92, 0x22, 0x5b, 0x64, 0xd2, 0x0b, 0xc6, ++ 0x28, 0x8c, 0xf9, 0x09, 0x93, 0x9a, 0x62, 0xb6, 0x66, 0x2b, 0x2e, 0x7e, ++ 0x8c, 0x61, 0x13, 0x48, 0xa6, 0x66, 0x77, 0x4d, 0x02, 0x7e, 0xfb, 0x9d, ++ 0xd7, 0xdd, 0xb6, 0xa1, 0x32, 0x53, 0x5b, 0xa3, 0xaa, 0xae, 0xd7, 0xfd, ++ 0x7e, 0xce, 0xbd, 0xf7, 0xfc, 0x7c, 0xe7, 0x3b, 0xe7, 0x5d, 0x5d, 0x03, ++ 0x94, 0xa3, 0xf0, 0x57, 0xc9, 0xcf, 0xea, 0xde, 0xfe, 0x3e, 0x73, 0xa5, ++ 0xb9, 0x92, 0x5f, 0xf7, 0xf0, 0x53, 0x22, 0x17, 0xaf, 0x53, 0x40, 0xd7, ++ 0x87, 0xf8, 0x77, 0xfd, 0x2d, 0xfd, 0xf7, 0x3d, 0x86, 0x43, 0x57, 0xe4, ++ 0x8f, 0xff, 0x54, 0x72, 0xe9, 0x9c, 0x17, 0x08, 0x15, 0xe7, 0x29, 0x1f, ++ 0xf8, 0x3d, 0x56, 0xd7, 0x97, 0x5b, 0x74, 0xf8, 0xbd, 0x56, 0xf8, 0x2b, ++ 0xbb, 0x75, 0x20, 0x99, 0xa9, 0x8f, 0xae, 0xc3, 0x67, 0x4e, 0x2a, 0xec, ++ 0x83, 0x9c, 0xff, 0x92, 0xf5, 0xe9, 0xc0, 0x4f, 0xd6, 0x68, 0xbf, 0x99, ++ 0xf2, 0xc2, 0x1f, 0xb2, 0x4e, 0x20, 0x54, 0x0b, 0xff, 0x32, 0x3e, 0xf3, ++ 0xd7, 0x75, 0xff, 0xcd, 0x83, 0x60, 0x51, 0x56, 0x33, 0x86, 0x6c, 0xa4, ++ 0xfc, 0x56, 0x2f, 0xca, 0x56, 0x03, 0xef, 0xa5, 0x0d, 0x73, 0x08, 0x18, ++ 0xf3, 0x58, 0x46, 0xf4, 0x05, 0x98, 0x38, 0x90, 0x8d, 0xa2, 0x95, 0x9f, ++ 0x4d, 0xf6, 0x05, 0x27, 0x5a, 0x82, 0x94, 0x97, 0xf7, 0xed, 0x6a, 0x02, ++ 0xd6, 0xa7, 0x4d, 0x1c, 0xb4, 0xe1, 0xaf, 0xb1, 0xbe, 0x8d, 0xeb, 0x79, ++ 0x0c, 0x5a, 0xfd, 0x78, 0x6d, 0x24, 0x16, 0x7d, 0x1c, 0x5a, 0xa7, 0xee, ++ 0xd5, 0xfa, 0x81, 0xfa, 0x9e, 0x6e, 0xa5, 0x75, 0xbd, 0xae, 0xb4, 0xf6, ++ 0x11, 0x05, 0xbf, 0xe2, 0x7d, 0xf5, 0x19, 0x39, 0xf6, 0xe3, 0x9a, 0x8c, ++ 0x1f, 0x67, 0xbc, 0x32, 0xfe, 0x57, 0xa9, 0x7f, 0x05, 0x9f, 0xde, 0x8c, ++ 0x61, 0xce, 0xa1, 0xc4, 0x52, 0x38, 0xd6, 0x64, 0x44, 0x06, 0x21, 0xd7, ++ 0xa3, 0x58, 0x97, 0x95, 0xa3, 0xc6, 0x55, 0x3b, 0xce, 0xb0, 0xe9, 0x38, ++ 0xc7, 0xcd, 0x32, 0xa4, 0x42, 0x5a, 0x04, 0x50, 0x18, 0x34, 0x3d, 0x48, ++ 0x86, 0x5a, 0xa2, 0x3e, 0x68, 0x91, 0xdb, 0xf0, 0x7b, 0xae, 0x39, 0x19, ++ 0x2f, 0x41, 0xfe, 0xfe, 0x2e, 0x94, 0x21, 0x17, 0xca, 0x6b, 0xed, 0x58, ++ 0xda, 0x71, 0x4e, 0xe9, 0x3e, 0x1c, 0xa7, 0x7e, 0x06, 0x33, 0xbf, 0x77, ++ 0x72, 0xd4, 0xcd, 0xb0, 0x5e, 0x1c, 0xdf, 0x8f, 0xa9, 0x90, 0xe3, 0x4c, ++ 0xf3, 0xda, 0xc1, 0x4c, 0x51, 0xcf, 0x8e, 0xe3, 0xd1, 0x1d, 0x67, 0xb7, ++ 0xfe, 0x3b, 0x67, 0xd7, 0xe7, 0xee, 0x75, 0x9c, 0x87, 0xcc, 0x2b, 0x70, ++ 0x62, 0xa2, 0x55, 0x6d, 0x9e, 0x5d, 0x1a, 0xdc, 0x34, 0xe9, 0xe0, 0x94, ++ 0x89, 0x90, 0xc7, 0xda, 0xa0, 0x36, 0xcd, 0xb6, 0xa9, 0xf5, 0xd9, 0x1d, ++ 0x6a, 0xc3, 0xf4, 0x9f, 0xab, 0xb6, 0xd9, 0x2e, 0xb5, 0x31, 0x1b, 0xc1, ++ 0x8c, 0x1d, 0xc6, 0xb4, 0xdd, 0xa9, 0x5a, 0x67, 0x3b, 0x54, 0x7e, 0x1d, ++ 0xfd, 0xaa, 0x25, 0x5b, 0x94, 0x75, 0x49, 0x8f, 0x9b, 0xd2, 0xb4, 0xb6, ++ 0x5d, 0xc6, 0x71, 0xce, 0x3b, 0x3f, 0xa9, 0x3b, 0xcf, 0x75, 0x9a, 0x78, ++ 0x30, 0xfb, 0x10, 0xb6, 0x4d, 0x3a, 0x4e, 0x26, 0x01, 0x64, 0xb2, 0xc0, ++ 0xf7, 0xed, 0x58, 0x7b, 0x8f, 0x72, 0x9c, 0x8d, 0x86, 0xb3, 0xfc, 0xac, ++ 0x59, 0x1f, 0x3f, 0x89, 0xff, 0xeb, 0x4c, 0x85, 0x91, 0xaa, 0xa0, 0x8c, ++ 0xc3, 0xb4, 0xd9, 0x9d, 0x23, 0xf0, 0x97, 0x59, 0xc3, 0x78, 0x3f, 0x0d, ++ 0x7f, 0xa9, 0x95, 0xc2, 0xa9, 0xf4, 0x60, 0xc8, 0x8f, 0x58, 0x64, 0x93, ++ 0x4a, 0xf5, 0x7b, 0xa0, 0xf5, 0xbe, 0x03, 0x2d, 0x4a, 0x7b, 0x2c, 0xbc, ++ 0xa8, 0xb4, 0xdc, 0x49, 0x68, 0xc9, 0xdf, 0x29, 0xad, 0xad, 0xc6, 0x8b, ++ 0xa4, 0xc7, 0xf0, 0xe3, 0x27, 0x75, 0x62, 0x93, 0x61, 0xac, 0x74, 0x6d, ++ 0x93, 0xc2, 0xd5, 0x17, 0x6d, 0x43, 0x7d, 0x71, 0x5e, 0x07, 0x39, 0xaf, ++ 0x97, 0x4c, 0x2d, 0x72, 0x0c, 0xce, 0xf2, 0x6e, 0x33, 0x7f, 0x6d, 0x38, ++ 0xdb, 0x8c, 0x07, 0xec, 0x24, 0x1e, 0xb2, 0x9f, 0xe3, 0x9c, 0x5b, 0xe9, ++ 0x07, 0x49, 0xfc, 0x28, 0xdb, 0x8a, 0x9f, 0x66, 0x2d, 0xfc, 0x90, 0xd7, ++ 0x9e, 0xcd, 0x36, 0xe1, 0x99, 0xac, 0x89, 0x1f, 0x64, 0x1b, 0xf0, 0x74, ++ 0x36, 0x8e, 0xa7, 0xb2, 0x3e, 0xb5, 0xde, 0xce, 0x60, 0xd3, 0x48, 0x0a, ++ 0x1b, 0xe9, 0x4b, 0x0b, 0xe9, 0x58, 0xf3, 0x13, 0xd0, 0x9e, 0xa2, 0x43, ++ 0x07, 0xdb, 0xb2, 0xa1, 0x60, 0xab, 0xad, 0xb5, 0x01, 0xe1, 0x60, 0x6b, ++ 0x56, 0xc7, 0x0b, 0xe9, 0x48, 0xb0, 0x25, 0x1b, 0x09, 0xae, 0xb3, 0x97, ++ 0x05, 0xd7, 0x65, 0x0d, 0x75, 0x26, 0xa4, 0x10, 0x5b, 0xe1, 0xc7, 0xde, ++ 0x89, 0x5f, 0xa0, 0xab, 0x5a, 0x66, 0x15, 0xc2, 0x7e, 0xea, 0xe6, 0xd5, ++ 0x44, 0x7d, 0xd7, 0xaf, 0xf1, 0x3a, 0x52, 0x4b, 0xf2, 0xe7, 0x7a, 0x79, ++ 0xae, 0xaa, 0x11, 0xc1, 0x9b, 0xa8, 0xaf, 0x1d, 0xb6, 0x1f, 0xdb, 0x1b, ++ 0x3f, 0x73, 0xa2, 0x8b, 0x5d, 0x1b, 0x07, 0x3b, 0x26, 0x7d, 0xc1, 0x0d, ++ 0xb6, 0xe3, 0x1c, 0x68, 0x54, 0x78, 0xc6, 0x6c, 0x54, 0x5d, 0x8b, 0x8b, ++ 0xbe, 0x9f, 0x9c, 0x7a, 0xce, 0x4c, 0x62, 0x89, 0x9e, 0xc3, 0x92, 0x2b, ++ 0x30, 0xf5, 0x84, 0xb9, 0x42, 0x45, 0xab, 0xf3, 0x7e, 0x31, 0x30, 0xc1, ++ 0xb5, 0x5e, 0x91, 0x97, 0xbd, 0x9b, 0xb2, 0xf7, 0x9a, 0xf5, 0xc9, 0xbf, ++ 0x93, 0x18, 0xac, 0x4e, 0x22, 0x63, 0xc6, 0x54, 0xca, 0xbd, 0xcf, 0xc2, ++ 0x81, 0xd9, 0x26, 0x1c, 0xa4, 0x5d, 0x6f, 0x9f, 0xd0, 0xe2, 0x67, 0x10, ++ 0xc5, 0x6c, 0x56, 0x57, 0xb9, 0x70, 0x14, 0xcf, 0xd4, 0x55, 0xa0, 0x8b, ++ 0xfa, 0x18, 0x9c, 0x44, 0x72, 0x23, 0x7d, 0xf5, 0x4c, 0x78, 0x29, 0xbc, ++ 0x7a, 0x90, 0x9f, 0xb2, 0x64, 0x8d, 0x5e, 0x8e, 0xdd, 0xd3, 0x61, 0xdc, ++ 0x97, 0xbd, 0x01, 0x0f, 0x4d, 0x84, 0xd1, 0x47, 0x3d, 0x77, 0x26, 0x92, ++ 0x4f, 0x46, 0x60, 0x8c, 0x3d, 0xe2, 0x09, 0xe3, 0x1b, 0x7c, 0x6e, 0x78, ++ 0x32, 0x8c, 0x5e, 0x3b, 0x84, 0x71, 0xd3, 0xe8, 0xaf, 0xe6, 0xb9, 0xbb, ++ 0x79, 0x6e, 0x74, 0xd2, 0x8f, 0x57, 0x13, 0x1b, 0xd5, 0x54, 0xb5, 0x16, ++ 0xa7, 0xbe, 0xb0, 0xc7, 0x16, 0xff, 0xc3, 0xfd, 0x15, 0x96, 0x11, 0x7f, ++ 0x9b, 0xbf, 0x6f, 0xcb, 0x96, 0x07, 0x37, 0x4c, 0x06, 0xe1, 0xd7, 0x3f, ++ 0x75, 0x4a, 0x9a, 0x1c, 0xe7, 0x45, 0xd3, 0xe8, 0xdc, 0x07, 0x1f, 0xf6, ++ 0x66, 0x3d, 0xe8, 0x99, 0x2e, 0xe7, 0x9a, 0x7c, 0xf8, 0xa0, 0xae, 0x1c, ++ 0x77, 0x4c, 0x5b, 0x38, 0x38, 0xc9, 0x39, 0x4c, 0x60, 0xf9, 0x69, 0x73, ++ 0x68, 0x67, 0x05, 0x7d, 0x62, 0xb7, 0x8a, 0x63, 0xb9, 0x11, 0xc0, 0xc0, ++ 0x74, 0x05, 0x7d, 0x3b, 0x84, 0x3b, 0x66, 0x03, 0xb8, 0x6f, 0xc2, 0x83, ++ 0x6b, 0xea, 0x64, 0x6e, 0xb1, 0x13, 0x11, 0xc6, 0xd4, 0xd3, 0x8d, 0x8b, ++ 0x70, 0xcf, 0x74, 0x00, 0x7d, 0x13, 0x21, 0x74, 0x4f, 0x36, 0x61, 0xdc, ++ 0xb6, 0x60, 0x33, 0x0e, 0x1e, 0x6e, 0xd4, 0x52, 0xad, 0x1e, 0xad, 0xb7, ++ 0xc4, 0x93, 0xc4, 0xaf, 0x13, 0x25, 0x98, 0xaa, 0x76, 0x9c, 0x93, 0x89, ++ 0xfa, 0xf8, 0x38, 0xfd, 0x7c, 0xb1, 0x15, 0x66, 0x8c, 0x69, 0x53, 0xf4, ++ 0xbf, 0x66, 0xdd, 0xf3, 0xc7, 0xea, 0x0c, 0x75, 0x73, 0xdc, 0x0e, 0x07, ++ 0xb7, 0xd9, 0xa1, 0xe0, 0xb6, 0xec, 0xb2, 0x60, 0x8b, 0x2d, 0xf6, 0x06, ++ 0x6d, 0x0f, 0xdc, 0x44, 0xbb, 0x7d, 0x94, 0xf8, 0xcc, 0xc9, 0x55, 0x17, ++ 0xed, 0xa6, 0x1d, 0x4a, 0x41, 0x1b, 0x13, 0x3d, 0x1f, 0x99, 0xf5, 0x05, ++ 0xdb, 0x6d, 0x85, 0xb0, 0xde, 0x84, 0xb1, 0xac, 0x8c, 0xef, 0x38, 0x8f, ++ 0x98, 0x40, 0xcf, 0x68, 0xec, 0x7c, 0xb5, 0x0a, 0xe0, 0xcc, 0x95, 0xc0, ++ 0xc0, 0x3c, 0x75, 0x60, 0xb7, 0xe2, 0x30, 0xfd, 0xf1, 0xf1, 0xa6, 0x30, ++ 0x6e, 0xa7, 0x6f, 0x6d, 0xb5, 0xa3, 0xd8, 0x37, 0x27, 0xfe, 0xa4, 0x63, ++ 0xf7, 0x9c, 0x1f, 0x7b, 0x26, 0xde, 0xa4, 0x2d, 0x44, 0xfe, 0xdf, 0x00, ++ 0xc1, 0x10, 0xb1, 0xa7, 0x0d, 0x0f, 0xda, 0x68, 0xf4, 0x5b, 0x5a, 0x3c, ++ 0x09, 0x07, 0xb5, 0x09, 0x7c, 0x5a, 0x0a, 0xa3, 0xfd, 0x9c, 0x57, 0xe1, ++ 0x7a, 0xa3, 0x0d, 0x8f, 0x72, 0x5e, 0x9b, 0x33, 0x01, 0xf4, 0x4f, 0x94, ++ 0xa3, 0x77, 0xc2, 0x81, 0x6f, 0x15, 0xfa, 0x7c, 0xbc, 0xaf, 0xaa, 0xd1, ++ 0xe8, 0x79, 0x5d, 0xf9, 0xb0, 0x2d, 0xd3, 0xc6, 0x38, 0xf9, 0x10, 0xc9, ++ 0x52, 0x3f, 0x8e, 0x65, 0x2a, 0x30, 0x95, 0xb1, 0x30, 0x44, 0x3b, 0xed, ++ 0xa5, 0xcd, 0xbb, 0x96, 0x94, 0x22, 0x5e, 0xeb, 0xe1, 0x27, 0x1c, 0xbc, ++ 0x71, 0x72, 0x59, 0x70, 0xbd, 0xed, 0xa3, 0xcd, 0x3c, 0xb8, 0x6b, 0x42, ++ 0xf4, 0xe3, 0xe0, 0x58, 0x22, 0x84, 0x63, 0xd9, 0x30, 0xf6, 0xd9, 0x11, ++ 0x9c, 0xc8, 0x1e, 0xe6, 0x7c, 0xc2, 0x8c, 0x77, 0x99, 0xd3, 0xcb, 0xc8, ++ 0xe3, 0x33, 0xf0, 0x8d, 0xd1, 0x12, 0x24, 0xdd, 0x34, 0x12, 0x46, 0xb7, ++ 0xfd, 0x53, 0xa7, 0x44, 0xd7, 0x8f, 0x1e, 0xe0, 0xf7, 0x7b, 0xb3, 0x15, ++ 0xb8, 0xcf, 0xd6, 0x9a, 0x57, 0x7b, 0x2b, 0xb0, 0x87, 0xfe, 0xf7, 0x9f, ++ 0xe9, 0xaf, 0x53, 0xee, 0x7d, 0xa5, 0x54, 0x7a, 0xfe, 0xfe, 0x01, 0xdb, ++ 0xf9, 0x78, 0x91, 0x75, 0xc1, 0xe9, 0x59, 0xad, 0xb7, 0x9d, 0xf3, 0x86, ++ 0x71, 0x07, 0xef, 0xeb, 0x9b, 0x16, 0xfd, 0x6f, 0xf0, 0xa0, 0x5c, 0x8b, ++ 0x46, 0x99, 0x05, 0x36, 0x66, 0xff, 0x77, 0x21, 0x07, 0xf6, 0xab, 0x9d, ++ 0x82, 0xf1, 0x65, 0xf0, 0x2f, 0x27, 0x1e, 0x0e, 0xdb, 0xfd, 0xea, 0x56, ++ 0xe2, 0xd0, 0x16, 0xea, 0xf9, 0xce, 0x44, 0xac, 0xad, 0x95, 0xf8, 0x13, ++ 0x27, 0xfe, 0x78, 0x12, 0x7e, 0xac, 0x6b, 0xf8, 0xc4, 0xe9, 0x72, 0x75, ++ 0xd8, 0x86, 0x51, 0xbb, 0x19, 0x23, 0x8c, 0xdf, 0x1c, 0x31, 0xa6, 0x95, ++ 0x3a, 0x3b, 0x65, 0xa0, 0xaa, 0x82, 0x3a, 0x3d, 0x98, 0x8d, 0x35, 0x7f, ++ 0xc0, 0x00, 0x3b, 0xa8, 0x3b, 0x78, 0x85, 0x3e, 0x91, 0xa9, 0x66, 0x12, ++ 0xd0, 0x6f, 0xc0, 0xf8, 0x44, 0x19, 0xcc, 0xc6, 0xe4, 0xb7, 0x42, 0xc4, ++ 0xf0, 0x73, 0xab, 0x91, 0xe1, 0xd0, 0x2a, 0x62, 0x19, 0x53, 0xcf, 0x11, ++ 0xce, 0x8f, 0x50, 0x97, 0x13, 0xf6, 0x75, 0xf8, 0x01, 0x71, 0x66, 0xc6, ++ 0xf4, 0xe1, 0xef, 0x33, 0x93, 0xc4, 0x7b, 0xc3, 0x5c, 0xac, 0xca, 0xa9, ++ 0x3f, 0x70, 0x1c, 0xdc, 0xef, 0xb1, 0x1c, 0xe7, 0x34, 0xe7, 0xf0, 0x7d, ++ 0xc3, 0x48, 0x0e, 0x2a, 0x84, 0xbc, 0x96, 0xb3, 0xfc, 0xb6, 0x44, 0x29, ++ 0x6d, 0x15, 0xc4, 0x72, 0xbd, 0x4b, 0xb5, 0x65, 0x0d, 0xf3, 0x45, 0xfc, ++ 0xb9, 0xba, 0x75, 0x16, 0xcc, 0x5d, 0x9d, 0x6a, 0xe7, 0x6c, 0x39, 0xed, ++ 0xdd, 0x4c, 0xb9, 0xa8, 0x5a, 0xac, 0x7b, 0xf0, 0x8d, 0x1d, 0x0a, 0x4b, ++ 0xf5, 0x24, 0x4e, 0x35, 0x85, 0x82, 0x9d, 0xf4, 0x95, 0x23, 0xf4, 0x8f, ++ 0xa3, 0xf3, 0x91, 0xe0, 0xd7, 0xe8, 0x1f, 0x8f, 0xcc, 0x87, 0x69, 0xa3, ++ 0x56, 0x62, 0xf9, 0xb2, 0xe0, 0x4e, 0xbb, 0x4d, 0xed, 0x24, 0xa6, 0x6f, ++ 0x9e, 0x46, 0xa8, 0xdc, 0xea, 0x50, 0x1b, 0xb2, 0xfd, 0x6a, 0x73, 0xf6, ++ 0x7f, 0x5e, 0x38, 0x13, 0x16, 0x3c, 0x32, 0xa6, 0xbe, 0x89, 0x2b, 0xa9, ++ 0x67, 0x62, 0x9e, 0xed, 0xe6, 0xae, 0xaa, 0xa5, 0xfa, 0x30, 0xbe, 0x13, ++ 0xca, 0xeb, 0x71, 0x3d, 0xf5, 0x38, 0xe5, 0x43, 0xd5, 0x12, 0x7d, 0x3f, ++ 0x1e, 0x71, 0xcf, 0x85, 0x83, 0x1b, 0xed, 0xa4, 0xc7, 0xa3, 0x23, 0xb4, ++ 0xdc, 0x6a, 0x65, 0x7e, 0x58, 0x46, 0xcc, 0x6b, 0x53, 0xad, 0x94, 0x9f, ++ 0x64, 0xce, 0x48, 0x32, 0x67, 0x24, 0x39, 0xd7, 0x24, 0x73, 0x45, 0x4b, ++ 0x56, 0xf4, 0x2e, 0x72, 0x89, 0xa9, 0x8c, 0xaf, 0x1f, 0x52, 0xfe, 0xb3, ++ 0x36, 0xf1, 0xd4, 0x26, 0x9e, 0xda, 0xc4, 0x53, 0x9b, 0x78, 0x6a, 0x0b, ++ 0x0e, 0xb7, 0x11, 0xbb, 0xdf, 0xb8, 0x90, 0x0b, 0x0b, 0x86, 0x85, 0x19, ++ 0x47, 0xad, 0x9c, 0x87, 0xe0, 0x68, 0x94, 0x79, 0x6e, 0x59, 0x70, 0x3b, ++ 0xd7, 0x33, 0x9e, 0x09, 0x7a, 0x24, 0xbf, 0xc6, 0x56, 0xe4, 0x63, 0xf5, ++ 0xa1, 0x49, 0x89, 0x47, 0xed, 0x44, 0x94, 0x71, 0xda, 0x99, 0x30, 0x1d, ++ 0x5c, 0x29, 0x71, 0xc9, 0x58, 0x67, 0x2c, 0x3f, 0x4c, 0x7c, 0xbc, 0x3e, ++ 0xb1, 0x1a, 0x8d, 0x57, 0x48, 0xae, 0xd0, 0xda, 0x52, 0x98, 0xba, 0x90, ++ 0x0a, 0x6b, 0xcd, 0x53, 0x28, 0xca, 0xfe, 0x43, 0x72, 0x03, 0xb8, 0x73, ++ 0x62, 0x11, 0x63, 0xc3, 0x41, 0x3b, 0xfd, 0xb9, 0x6a, 0x95, 0xd6, 0x5b, ++ 0xe5, 0x29, 0xc7, 0x0b, 0x86, 0xe3, 0xb4, 0x9b, 0x12, 0x5f, 0x94, 0xe5, ++ 0x69, 0x13, 0x9e, 0xf0, 0xd5, 0xe5, 0xcc, 0xed, 0xaf, 0xd2, 0x2f, 0x46, ++ 0xb2, 0x01, 0xec, 0x9b, 0x70, 0x73, 0x67, 0x6b, 0x29, 0xe3, 0x68, 0x28, ++ 0xe1, 0xc1, 0x5e, 0xdd, 0x68, 0x5b, 0xa4, 0x8c, 0x85, 0xb5, 0x64, 0x5a, ++ 0x3b, 0x19, 0x43, 0x7b, 0x88, 0x0f, 0xad, 0x93, 0x46, 0xfc, 0x9f, 0x89, ++ 0x5d, 0xeb, 0x33, 0x97, 0xe2, 0xe6, 0xce, 0x09, 0x97, 0x07, 0x70, 0xee, ++ 0x21, 0x3c, 0xc7, 0xb8, 0xb9, 0x9b, 0x71, 0xf3, 0x74, 0x21, 0x6e, 0xb2, ++ 0xd9, 0xc7, 0x95, 0xf8, 0x34, 0x3c, 0x3e, 0xe2, 0xee, 0x0d, 0xfc, 0xce, ++ 0xf8, 0x9b, 0xce, 0xfb, 0x39, 0x5c, 0x0c, 0xe9, 0x55, 0x32, 0xe7, 0xb0, ++ 0x2e, 0x3a, 0x78, 0x84, 0xdf, 0x2b, 0xf0, 0x03, 0xe6, 0xfc, 0x71, 0xca, ++ 0xd5, 0x0d, 0xc9, 0xd3, 0x7e, 0x98, 0xb5, 0xce, 0xf2, 0xaa, 0xc6, 0x4f, ++ 0x94, 0xc4, 0x83, 0x9d, 0xdd, 0x4a, 0x9b, 0x34, 0x20, 0x9f, 0x0f, 0x42, ++ 0xf4, 0x87, 0x56, 0xfa, 0x83, 0xe0, 0x48, 0x12, 0x79, 0x3b, 0xb6, 0x31, ++ 0xaf, 0xff, 0x6b, 0xf6, 0xab, 0xe3, 0xb8, 0x62, 0xc3, 0xd2, 0xc2, 0xf3, ++ 0x7e, 0xe2, 0x72, 0x12, 0xa7, 0x89, 0x09, 0xf9, 0x7c, 0x55, 0xe9, 0xfa, ++ 0xc9, 0x36, 0xf1, 0x93, 0x92, 0xbc, 0xfc, 0x9b, 0x27, 0x51, 0xb2, 0xd8, ++ 0x42, 0x34, 0x48, 0xee, 0x71, 0x67, 0xa3, 0x91, 0xdb, 0xa1, 0xb6, 0xaa, ++ 0xce, 0x6c, 0x38, 0x78, 0x93, 0x8b, 0xf1, 0xad, 0xea, 0x26, 0xfa, 0x4c, ++ 0x3b, 0x7d, 0xa6, 0xdd, 0x1d, 0x53, 0x7c, 0xee, 0xf3, 0xe3, 0xde, 0x98, ++ 0x5d, 0xc2, 0x31, 0x85, 0x63, 0x84, 0x83, 0x9b, 0x38, 0xd7, 0x4d, 0xbc, ++ 0x7f, 0x9d, 0x3d, 0xca, 0x73, 0x32, 0x5f, 0x27, 0x1a, 0xb4, 0xce, 0x30, ++ 0x57, 0x23, 0xf5, 0x47, 0x96, 0x3f, 0x55, 0x65, 0x7d, 0xe6, 0xbc, 0xba, ++ 0x7a, 0x19, 0xf3, 0x75, 0x84, 0x39, 0x3a, 0x4c, 0x1d, 0x86, 0x98, 0xa3, ++ 0x93, 0x5c, 0x33, 0x88, 0xc9, 0x7f, 0x88, 0x8f, 0x3a, 0xa8, 0xe0, 0x33, ++ 0xe4, 0x1a, 0xc1, 0x2d, 0x59, 0x5f, 0x57, 0xa9, 0x85, 0xf6, 0x9f, 0xa5, ++ 0x07, 0x9c, 0x72, 0x9d, 0x29, 0xd9, 0xd2, 0x93, 0xd7, 0xa8, 0x8a, 0x66, ++ 0x72, 0xc7, 0xf6, 0x97, 0x33, 0xcd, 0x3e, 0x7d, 0x34, 0x80, 0x12, 0x72, ++ 0xa6, 0xf5, 0x59, 0xc7, 0x19, 0x32, 0xef, 0xb9, 0x76, 0x57, 0xf3, 0x33, ++ 0xb9, 0x76, 0xda, 0x3d, 0x95, 0xed, 0x71, 0x31, 0x2d, 0x95, 0xa5, 0x91, ++ 0x77, 0x34, 0xb4, 0x46, 0xe7, 0x57, 0xfb, 0xf8, 0x3b, 0x55, 0x6d, 0x9d, ++ 0x08, 0x22, 0xd8, 0x0b, 0xf3, 0x3a, 0xe1, 0x13, 0xf0, 0x2f, 0xb6, 0x16, ++ 0xbe, 0xbc, 0xa3, 0x56, 0x3b, 0x04, 0x0f, 0xb5, 0x36, 0x0a, 0xdc, 0x4a, ++ 0xcc, 0xff, 0xe4, 0xcb, 0x0a, 0xcd, 0xab, 0x08, 0xf0, 0x57, 0x98, 0x38, ++ 0x94, 0xd5, 0xda, 0x88, 0x5b, 0xa8, 0x23, 0xe7, 0xa9, 0xb2, 0xf6, 0xe1, ++ 0x63, 0x1e, 0x2b, 0xac, 0x1e, 0xa4, 0x47, 0x62, 0xb9, 0x73, 0xd0, 0xe2, ++ 0xe7, 0x95, 0xc6, 0x81, 0xea, 0xcd, 0xe7, 0xc8, 0x43, 0x47, 0x94, 0x96, ++ 0xbc, 0xdd, 0xe5, 0x9e, 0xfb, 0x60, 0xb8, 0xfc, 0xa6, 0x07, 0x71, 0xda, ++ 0xbc, 0x95, 0x32, 0x87, 0x9a, 0x15, 0x76, 0x99, 0xbf, 0x76, 0x92, 0x61, ++ 0x2d, 0x79, 0x86, 0x3c, 0xf7, 0x01, 0xae, 0xbb, 0x62, 0x14, 0xfe, 0x12, ++ 0xde, 0x7b, 0x9c, 0x3c, 0xca, 0xc7, 0x7b, 0x87, 0xd3, 0x31, 0xf3, 0x90, ++ 0xd2, 0x9a, 0xc9, 0x69, 0x19, 0xc5, 0xf5, 0xc9, 0xb3, 0xe4, 0x9a, 0x83, ++ 0xd0, 0xce, 0x73, 0x00, 0x57, 0x66, 0x5d, 0x41, 0xe6, 0xda, 0x0c, 0xd4, ++ 0x26, 0xfb, 0x10, 0x76, 0x1a, 0xad, 0xcc, 0x17, 0xcd, 0xe4, 0x6f, 0xe4, ++ 0xcb, 0x94, 0x57, 0x36, 0x2a, 0x72, 0x2f, 0xb7, 0x33, 0xd1, 0x99, 0x63, ++ 0x2c, 0xb2, 0xfa, 0xb0, 0x77, 0x44, 0xc6, 0xe8, 0x95, 0x31, 0xe2, 0x2f, ++ 0x53, 0xe6, 0x6d, 0x2a, 0x3f, 0xc6, 0x7b, 0x5e, 0xad, 0x99, 0x63, 0x2c, ++ 0x9c, 0xe3, 0x18, 0x01, 0x5d, 0xe4, 0xf7, 0x89, 0x7c, 0x1e, 0x7b, 0x71, ++ 0x7d, 0xa6, 0x9f, 0x76, 0xf5, 0xab, 0xce, 0x89, 0x1b, 0x70, 0x74, 0xfa, ++ 0x06, 0xd8, 0x13, 0x8a, 0xf9, 0x72, 0x09, 0x72, 0x4b, 0x5c, 0x0e, 0x5f, ++ 0x19, 0xd4, 0x6b, 0xb0, 0x3f, 0x84, 0xaa, 0x2a, 0xfd, 0x4b, 0xb8, 0xbb, ++ 0xc0, 0x7f, 0x77, 0x8e, 0xb7, 0x23, 0x42, 0x0c, 0xbe, 0x7a, 0x95, 0x0f, ++ 0xcd, 0xd5, 0x48, 0x2e, 0xb7, 0x9a, 0xe9, 0x9f, 0xef, 0x7b, 0xf2, 0x98, ++ 0xff, 0x91, 0x3f, 0x9f, 0x67, 0x5c, 0xdd, 0x7f, 0xe1, 0xda, 0x0d, 0x18, ++ 0x99, 0x28, 0x05, 0x39, 0xe8, 0xf6, 0x0a, 0xbc, 0x26, 0xb1, 0xfc, 0xd6, ++ 0x0e, 0xb5, 0xce, 0x2b, 0xfe, 0x24, 0x76, 0xfa, 0x63, 0xab, 0xcd, 0xfa, ++ 0xaf, 0x75, 0xaf, 0x15, 0xf2, 0xd4, 0xe5, 0xe7, 0x7b, 0xfe, 0xc0, 0x79, ++ 0x85, 0x27, 0xc7, 0x42, 0xe4, 0xb1, 0x21, 0x64, 0xd2, 0x0e, 0xbc, 0x96, ++ 0x0f, 0x3d, 0x23, 0x92, 0x97, 0xc3, 0x98, 0x4b, 0x6b, 0x5d, 0x67, 0xc8, ++ 0xad, 0x77, 0x35, 0xe9, 0xb8, 0x6b, 0x2e, 0x82, 0xd9, 0x34, 0x9c, 0x80, ++ 0xa5, 0xe7, 0x02, 0xe4, 0x23, 0x7b, 0xe6, 0x96, 0x61, 0x3e, 0xad, 0x2f, ++ 0x0c, 0x2a, 0xa3, 0xbf, 0xc6, 0xeb, 0xc3, 0xdd, 0x73, 0x0d, 0xd8, 0xcf, ++ 0x1c, 0x3e, 0x47, 0x19, 0x9b, 0x13, 0xcb, 0x78, 0xbf, 0x07, 0x4f, 0x1c, ++ 0x61, 0x5e, 0x22, 0x1e, 0xf4, 0xcc, 0x01, 0xb3, 0x63, 0x8c, 0xf9, 0xe3, ++ 0x8c, 0xff, 0xc7, 0x58, 0xbe, 0x3d, 0xe6, 0xc1, 0xf4, 0x98, 0x43, 0x1b, ++ 0x0f, 0xd6, 0x78, 0x50, 0x82, 0x2e, 0xf2, 0xc8, 0x12, 0xf2, 0xaf, 0xdb, ++ 0x42, 0x79, 0x7e, 0x77, 0x86, 0xb9, 0xea, 0xce, 0xc7, 0xe2, 0x78, 0x2b, ++ 0x9d, 0xc2, 0xe6, 0xd5, 0x11, 0xf4, 0x73, 0x2e, 0xaf, 0xa7, 0x89, 0x29, ++ 0x73, 0x26, 0x5e, 0x4b, 0xfb, 0x39, 0x4e, 0x03, 0x4e, 0xa6, 0xe5, 0x1e, ++ 0xb9, 0xb7, 0x02, 0xdd, 0x9c, 0xcb, 0xab, 0xe9, 0x08, 0xc7, 0x0c, 0xe3, ++ 0x67, 0xbc, 0xef, 0x8e, 0x39, 0x9d, 0x3c, 0xd6, 0xcf, 0x71, 0xa3, 0x78, ++ 0x39, 0x4d, 0xcc, 0xe2, 0xf9, 0x17, 0xd2, 0xdd, 0x18, 0x4a, 0xd7, 0x2f, ++ 0xac, 0x23, 0x57, 0x8a, 0x5e, 0x91, 0xcf, 0xc1, 0x2f, 0xa4, 0xdf, 0x75, ++ 0xb6, 0xba, 0xb9, 0x52, 0xc6, 0x29, 0x8e, 0xdb, 0x8d, 0xc1, 0xf4, 0xa3, ++ 0xde, 0x62, 0xed, 0xf9, 0xe4, 0x98, 0x70, 0xff, 0x65, 0x78, 0xc2, 0xe6, ++ 0xf7, 0x69, 0x60, 0xde, 0x4e, 0x39, 0x55, 0x16, 0x39, 0x01, 0x31, 0xf9, ++ 0xed, 0xd5, 0x0d, 0x1c, 0x57, 0xef, 0x7a, 0x41, 0x49, 0x2d, 0xe0, 0x43, ++ 0xf4, 0x31, 0xd1, 0x97, 0x07, 0x53, 0xcc, 0x6f, 0xcf, 0x11, 0x17, 0xeb, ++ 0x46, 0xb4, 0x08, 0x7d, 0xb4, 0x73, 0x0a, 0x5a, 0x7b, 0x0e, 0xb5, 0xf1, ++ 0xbb, 0x30, 0xe0, 0x94, 0x5a, 0xc4, 0x62, 0xe2, 0xed, 0x5c, 0x83, 0xe3, ++ 0x7c, 0xb4, 0xda, 0x71, 0xfe, 0xb1, 0x09, 0x8e, 0xc7, 0xd2, 0xcd, 0x1a, ++ 0x6f, 0xee, 0x4b, 0x95, 0xd0, 0x17, 0x82, 0x4a, 0xcf, 0xbd, 0x0d, 0xa3, ++ 0xf7, 0x45, 0x88, 0x5e, 0x81, 0x95, 0x73, 0x3e, 0x5c, 0xcb, 0xf5, 0xac, ++ 0x1f, 0xe1, 0xd8, 0xe4, 0x08, 0x06, 0xd7, 0xb4, 0x6d, 0xc4, 0x21, 0xd7, ++ 0xa8, 0xc0, 0x0a, 0xea, 0xb8, 0xe7, 0x11, 0xc7, 0x29, 0xa3, 0x8e, 0xeb, ++ 0x68, 0x9f, 0xdb, 0xc7, 0x1d, 0xbc, 0x60, 0xbe, 0x40, 0x9d, 0x2a, 0x74, ++ 0xb5, 0x37, 0xf1, 0x99, 0x30, 0xef, 0x27, 0xaf, 0x1a, 0x91, 0x5a, 0x62, ++ 0x19, 0xef, 0x39, 0x8d, 0xc3, 0xe9, 0x38, 0x1a, 0xa8, 0xbf, 0x28, 0x65, ++ 0xd6, 0xf3, 0x99, 0xe8, 0x5c, 0xbe, 0x9e, 0x8b, 0xce, 0x09, 0x06, 0x5d, ++ 0x8e, 0x39, 0x82, 0x41, 0xc0, 0xd1, 0x31, 0xed, 0x50, 0x8e, 0x18, 0x53, ++ 0x69, 0x0d, 0x30, 0x87, 0x00, 0xaf, 0x4f, 0x29, 0x8c, 0x8e, 0xb1, 0xfe, ++ 0x59, 0x0d, 0xa7, 0x9c, 0xeb, 0x78, 0x6d, 0xea, 0x4f, 0xf0, 0xf8, 0x11, ++ 0xae, 0xfd, 0x58, 0x18, 0xdf, 0x4f, 0xfb, 0x70, 0xf5, 0xa8, 0x96, 0x9a, ++ 0x82, 0x1e, 0xdf, 0xa7, 0x04, 0x7b, 0xb4, 0xb1, 0x14, 0x8c, 0x68, 0x89, ++ 0xf2, 0xa0, 0xf6, 0x71, 0x1f, 0xf4, 0xf9, 0x28, 0x4a, 0x6a, 0xfd, 0xd0, ++ 0x6b, 0xbf, 0x49, 0x1f, 0xf4, 0xa0, 0x94, 0x5c, 0x66, 0xe3, 0xc3, 0x71, ++ 0x9e, 0x0b, 0xf3, 0x1c, 0xfe, 0xa4, 0x0c, 0xde, 0xa5, 0x5e, 0xe6, 0x95, ++ 0x52, 0x9d, 0x05, 0x90, 0xcf, 0x71, 0xbc, 0xe4, 0x04, 0x3b, 0xbf, 0xe3, ++ 0x38, 0xb1, 0x55, 0xdf, 0x74, 0xf9, 0x60, 0x6c, 0x5e, 0xe7, 0x7d, 0x9c, ++ 0x17, 0x73, 0xcb, 0x0f, 0x58, 0xc3, 0x3d, 0x4d, 0x9f, 0x7d, 0xca, 0xf6, ++ 0xd2, 0x77, 0x34, 0x53, 0x6c, 0x88, 0xf2, 0x28, 0xd7, 0xf9, 0x96, 0x6b, ++ 0xaf, 0xa7, 0x89, 0x9f, 0x4f, 0x31, 0xd6, 0x65, 0x0d, 0x27, 0xc6, 0x14, ++ 0x71, 0xd6, 0xe2, 0xbd, 0x6b, 0xe1, 0x4d, 0x08, 0x6f, 0x0d, 0x63, 0x57, ++ 0xa8, 0x19, 0x4f, 0xda, 0x25, 0x58, 0xa4, 0x2f, 0xc5, 0xde, 0xf6, 0x10, ++ 0x9e, 0xcc, 0x6a, 0x51, 0xda, 0x29, 0x9e, 0xc3, 0x3f, 0x79, 0x19, 0x4f, ++ 0x26, 0x3c, 0xcf, 0x43, 0x7f, 0xd8, 0x83, 0x21, 0xd3, 0x4b, 0xff, 0x34, ++ 0x51, 0x5a, 0x0b, 0xe4, 0x32, 0x3e, 0x9c, 0xd2, 0x29, 0xd3, 0xa6, 0x7c, ++ 0xce, 0xe1, 0x29, 0x5b, 0x0b, 0xe5, 0x5c, 0x7f, 0x8d, 0x73, 0x5c, 0xad, ++ 0x39, 0xa9, 0xfe, 0xdc, 0x2b, 0xf3, 0xe4, 0xb8, 0xbe, 0xbc, 0xff, 0x3c, ++ 0xe6, 0x95, 0xfc, 0x77, 0xe9, 0x77, 0x39, 0x3c, 0x96, 0x16, 0x69, 0xf1, ++ 0x0a, 0xbe, 0x64, 0xac, 0x61, 0xfd, 0x8f, 0x2e, 0x9b, 0x7b, 0x07, 0x86, ++ 0xb2, 0x97, 0x6a, 0xcf, 0xb6, 0xb4, 0xeb, 0x37, 0x6d, 0xa2, 0xfb, 0x87, ++ 0x4c, 0xc1, 0xd6, 0x7e, 0xd5, 0x4a, 0xac, 0x4a, 0xf9, 0xf2, 0xb5, 0xe5, ++ 0x41, 0xd6, 0x96, 0x2f, 0xa5, 0xa5, 0xbf, 0xd0, 0x87, 0xdd, 0x3c, 0x46, ++ 0x78, 0x2e, 0x62, 0xc7, 0xa2, 0x27, 0xa0, 0xf5, 0x74, 0x13, 0xa3, 0x88, ++ 0x57, 0xfd, 0x33, 0x4a, 0xeb, 0xad, 0xf1, 0x4a, 0x9d, 0x9f, 0xc7, 0xaa, ++ 0x15, 0x05, 0xac, 0x6a, 0xc8, 0x84, 0x83, 0x6d, 0xcc, 0x43, 0x6d, 0xcc, ++ 0xa3, 0x1b, 0x5d, 0x1e, 0xd5, 0xa9, 0xb6, 0xcc, 0xfa, 0xd5, 0x06, 0xf2, ++ 0xd4, 0x97, 0x4c, 0x85, 0xa9, 0x0e, 0x84, 0xae, 0x5e, 0x8d, 0xc0, 0x96, ++ 0x89, 0x76, 0x94, 0x11, 0x9f, 0xee, 0x4c, 0x94, 0x61, 0xa3, 0x9b, 0x2b, ++ 0x25, 0xdf, 0x4b, 0x3d, 0xdd, 0x41, 0xac, 0x43, 0x28, 0x60, 0xe5, 0x6b, ++ 0x67, 0xc1, 0xbd, 0x6d, 0x7c, 0xf6, 0x04, 0xfd, 0x10, 0xf9, 0x9c, 0xaa, ++ 0x6e, 0x62, 0x1d, 0xf2, 0x51, 0x42, 0x21, 0xb7, 0xdd, 0x0f, 0xca, 0xe2, ++ 0x7a, 0x43, 0x5f, 0x19, 0x1e, 0x6b, 0x57, 0xad, 0xd3, 0x33, 0x81, 0x75, ++ 0xb6, 0xe4, 0xe7, 0xa9, 0x00, 0xb9, 0x0b, 0x73, 0xe2, 0x17, 0x65, 0x49, ++ 0xdf, 0xe2, 0xb4, 0x75, 0x3d, 0x79, 0x54, 0xf3, 0xaa, 0xdf, 0x3a, 0xf8, ++ 0x33, 0x79, 0xfe, 0xde, 0x82, 0xfe, 0x92, 0x9c, 0x4f, 0xd8, 0xbf, 0x31, ++ 0x1b, 0xf2, 0x27, 0xb3, 0xad, 0x7c, 0xbe, 0x9d, 0xb2, 0x3a, 0x02, 0xad, ++ 0xf6, 0x2d, 0x81, 0xf5, 0xf6, 0xd6, 0xc0, 0x06, 0x9b, 0xb1, 0x9b, 0x6d, ++ 0xa7, 0x1e, 0xb7, 0xb2, 0x0e, 0xbe, 0x85, 0x1c, 0x53, 0x64, 0x76, 0x91, ++ 0xef, 0x06, 0xb8, 0xb6, 0x01, 0xae, 0x2d, 0x17, 0x21, 0x63, 0xd7, 0x4a, ++ 0x98, 0x33, 0x86, 0x5c, 0xbb, 0x1d, 0x72, 0x7b, 0x31, 0xe5, 0xd6, 0xcf, ++ 0xad, 0xcd, 0xe3, 0xc4, 0x74, 0xeb, 0x15, 0xeb, 0xea, 0x47, 0x50, 0x5d, ++ 0x62, 0xc1, 0xa2, 0xa5, 0x10, 0x37, 0x0c, 0xf3, 0x1c, 0x8c, 0xc8, 0x4b, ++ 0xbc, 0x77, 0x90, 0xbe, 0x3a, 0xe4, 0xd6, 0xdf, 0x34, 0x40, 0xa6, 0x01, ++ 0x9b, 0x6d, 0x7f, 0xe0, 0x46, 0xd6, 0x73, 0x55, 0x96, 0xd6, 0x7c, 0x93, ++ 0x57, 0x6a, 0xde, 0xdc, 0x57, 0x2b, 0xd1, 0x80, 0xb6, 0xac, 0x3f, 0xb0, ++ 0x6e, 0xf2, 0x8f, 0xf0, 0xab, 0x23, 0x5a, 0x32, 0x05, 0xf1, 0x3b, 0xc7, ++ 0x39, 0x9c, 0x00, 0x0e, 0x67, 0x96, 0xe1, 0x83, 0xbc, 0x4d, 0xbb, 0x72, ++ 0xf4, 0xf1, 0x07, 0x33, 0x51, 0xbc, 0x4b, 0x8c, 0xf2, 0xcd, 0xd5, 0xe0, ++ 0x9d, 0x31, 0x2f, 0x76, 0xb3, 0xd6, 0xdd, 0xe5, 0xe2, 0x9f, 0x07, 0xb7, ++ 0xc5, 0xef, 0xc5, 0x54, 0x58, 0xe2, 0xe3, 0x46, 0xdc, 0xee, 0x9e, 0xf3, ++ 0x32, 0x4f, 0xfc, 0x19, 0xfa, 0xf3, 0x79, 0x83, 0xf3, 0xcc, 0x71, 0x9e, ++ 0x4d, 0x81, 0xf5, 0x13, 0x5a, 0x60, 0xc3, 0x84, 0xf4, 0x77, 0x4e, 0x59, ++ 0xaf, 0x3d, 0xc2, 0x9a, 0xc5, 0x1c, 0x5c, 0x60, 0x55, 0x88, 0xf7, 0x8e, ++ 0x38, 0x38, 0x69, 0x76, 0xe2, 0x81, 0x49, 0x9c, 0xaa, 0xa1, 0xd1, 0x58, ++ 0x13, 0x39, 0xd7, 0x26, 0x8c, 0x90, 0xd7, 0xab, 0xb1, 0x2e, 0x32, 0x16, ++ 0xb6, 0xb1, 0x1e, 0x20, 0x44, 0x25, 0x4b, 0x2d, 0x23, 0x57, 0xeb, 0xc5, ++ 0x56, 0x1f, 0xe7, 0x13, 0x20, 0x46, 0x47, 0xe6, 0xa2, 0x81, 0x9b, 0x98, ++ 0x57, 0xbc, 0xac, 0x0b, 0x03, 0x06, 0xbe, 0x59, 0x05, 0xa3, 0xe7, 0x45, ++ 0xe5, 0x47, 0xe5, 0x5c, 0x03, 0x75, 0xad, 0xf0, 0x9e, 0xee, 0x0c, 0x3c, ++ 0x6e, 0x56, 0xc0, 0x33, 0x67, 0x06, 0x76, 0x92, 0xeb, 0x7a, 0x8c, 0x4e, ++ 0x1c, 0x9c, 0x0d, 0xa1, 0x66, 0xae, 0x99, 0x36, 0x08, 0x73, 0x2d, 0x3e, ++ 0x62, 0x4a, 0x32, 0xd0, 0x29, 0xb6, 0x9b, 0x5b, 0x43, 0x59, 0xf0, 0x57, ++ 0x5a, 0x6f, 0x58, 0x73, 0xe3, 0x21, 0xe2, 0x8b, 0x43, 0x7f, 0xd0, 0x22, ++ 0xa7, 0x15, 0xf6, 0x10, 0xd6, 0x5a, 0x2b, 0x61, 0x74, 0x1e, 0x62, 0xdd, ++ 0xb2, 0x67, 0x75, 0x05, 0x71, 0x49, 0xf4, 0x4a, 0x9d, 0x66, 0x8b, 0x6b, ++ 0x93, 0x5c, 0xff, 0x8a, 0x75, 0xfc, 0x88, 0xf0, 0x88, 0xe7, 0xad, 0x8f, ++ 0x1f, 0xd1, 0xf1, 0x2e, 0x73, 0x49, 0x6d, 0x42, 0xeb, 0x7d, 0x1c, 0x31, ++ 0xae, 0x41, 0xd6, 0xf4, 0xcf, 0xce, 0x31, 0xc3, 0x58, 0xd8, 0x45, 0x7d, ++ 0x44, 0x88, 0x85, 0x35, 0xc4, 0xf8, 0xc8, 0x1c, 0x15, 0x34, 0xb7, 0x40, ++ 0x5f, 0x89, 0xc0, 0x6f, 0xe8, 0x38, 0x7b, 0x24, 0x4e, 0x5d, 0x5c, 0x94, ++ 0xf9, 0xed, 0x52, 0xa0, 0x8f, 0xa9, 0xfe, 0xfe, 0x5f, 0xd3, 0x1f, 0x4f, ++ 0x72, 0xdc, 0x4a, 0xde, 0xef, 0x73, 0xef, 0x0f, 0xf3, 0xfe, 0x4b, 0x63, ++ 0x7b, 0x38, 0x76, 0xcb, 0x11, 0xe9, 0xd7, 0x3c, 0x6f, 0x9d, 0x3a, 0x92, ++ 0x1f, 0xdb, 0x48, 0xc4, 0x71, 0xfe, 0x88, 0xb6, 0xb0, 0x1e, 0xb1, 0x7e, ++ 0xea, 0x6c, 0x59, 0x04, 0xd8, 0xe7, 0xc3, 0x47, 0xce, 0x47, 0x9c, 0xc3, ++ 0x7e, 0xca, 0x3c, 0xb6, 0x3a, 0x3f, 0x0f, 0xcf, 0x9c, 0xe8, 0x23, 0xc2, ++ 0xb9, 0x84, 0x0b, 0x73, 0x59, 0x46, 0xd9, 0x0f, 0x17, 0x6a, 0x32, 0x1d, ++ 0xef, 0x5c, 0x9a, 0x4f, 0x98, 0x7a, 0xf0, 0xef, 0x6c, 0x92, 0xb9, 0xcb, ++ 0x7d, 0x21, 0xde, 0x27, 0x7a, 0xf8, 0x17, 0xe5, 0xd1, 0xcf, 0x11, 0xc3, ++ 0x04, 0x47, 0xc2, 0xc4, 0xaf, 0x2e, 0xc9, 0xef, 0xa9, 0x14, 0x7d, 0xbf, ++ 0x84, 0xbe, 0xbf, 0x5e, 0xfc, 0xdb, 0xa6, 0x7f, 0xdb, 0xf4, 0x6f, 0x5b, ++ 0x8b, 0xf4, 0x22, 0x16, 0xea, 0xa6, 0xfd, 0x92, 0x11, 0xf1, 0xfb, 0x0e, ++ 0xec, 0xe6, 0xe7, 0x76, 0x5e, 0x3f, 0xc8, 0x1a, 0x14, 0x6e, 0xad, 0xd9, ++ 0x47, 0x4e, 0x75, 0x3f, 0x7a, 0x26, 0xf0, 0xbb, 0x40, 0x53, 0x19, 0xca, ++ 0x56, 0x94, 0xe0, 0x4c, 0x48, 0x0b, 0x3d, 0x88, 0xfb, 0xc9, 0xf5, 0xff, ++ 0x45, 0x2d, 0xd2, 0x7d, 0xed, 0x87, 0xc9, 0x6f, 0x5a, 0x55, 0x05, 0x76, ++ 0x65, 0x6f, 0x09, 0xdc, 0x68, 0xc7, 0x7a, 0x5e, 0x62, 0xed, 0x3c, 0x55, ++ 0xc3, 0xb1, 0x19, 0x57, 0x37, 0x71, 0x1c, 0x5b, 0xe6, 0xe1, 0x62, 0x2d, ++ 0xb5, 0x4d, 0xdd, 0xfe, 0xa4, 0xae, 0x9b, 0xe3, 0xe7, 0xe7, 0x31, 0xc8, ++ 0xfa, 0xa3, 0x9b, 0x73, 0xda, 0xed, 0xc6, 0x5a, 0x07, 0x65, 0x5c, 0xc2, ++ 0xb0, 0x75, 0x69, 0xc9, 0x9d, 0x0e, 0x1e, 0x60, 0x5d, 0xf0, 0x04, 0x3f, ++ 0x0b, 0xc4, 0xb1, 0xa1, 0xcb, 0x70, 0xcc, 0xc3, 0xfb, 0x76, 0xf2, 0xbe, ++ 0x66, 0x62, 0xf8, 0xec, 0xb4, 0xf4, 0xc9, 0xfa, 0xa4, 0x4f, 0x86, 0x8c, ++ 0x2d, 0xba, 0xef, 0xc5, 0xa9, 0x74, 0xac, 0xdf, 0xeb, 0x75, 0x06, 0x82, ++ 0x96, 0xb6, 0xf0, 0x31, 0x7d, 0xf8, 0xd5, 0xd5, 0x5a, 0x3b, 0x75, 0x18, ++ 0x27, 0x77, 0x8c, 0xbc, 0x82, 0xdc, 0x46, 0x3f, 0xea, 0xa3, 0xd7, 0x7a, ++ 0x8d, 0x10, 0x31, 0x2f, 0xd7, 0xcd, 0x95, 0x1e, 0xcb, 0xe6, 0x71, 0xee, ++ 0xfa, 0x02, 0xce, 0x35, 0x67, 0xca, 0x89, 0x43, 0xcc, 0xc7, 0xd3, 0x4e, ++ 0x2a, 0xc8, 0x5c, 0x95, 0x9d, 0x16, 0xd9, 0x03, 0xa8, 0x4f, 0x88, 0x2c, ++ 0xbd, 0x6d, 0x44, 0xe1, 0xeb, 0x8b, 0x60, 0x30, 0x4f, 0xc1, 0x2c, 0xd3, ++ 0x53, 0x0e, 0xf3, 0x51, 0xa8, 0xc4, 0x92, 0x5c, 0xb9, 0x95, 0xd8, 0xd8, ++ 0x41, 0x6c, 0x14, 0xfe, 0x2e, 0xbd, 0xc3, 0x3c, 0x36, 0xad, 0xcf, 0x8a, ++ 0x5d, 0xc4, 0x26, 0x62, 0x9b, 0x3e, 0xdc, 0x66, 0x23, 0x25, 0xf9, 0x7c, ++ 0xcc, 0x34, 0xa2, 0x8f, 0x43, 0xec, 0xd4, 0x47, 0x5d, 0x94, 0x60, 0x37, ++ 0xb1, 0x70, 0x57, 0x13, 0x75, 0x15, 0x2c, 0xc1, 0xae, 0x69, 0xa9, 0x7b, ++ 0x8a, 0xfa, 0x2b, 0xa1, 0x0d, 0x15, 0xe3, 0x7a, 0x7f, 0x49, 0x5e, 0x8f, ++ 0x79, 0xde, 0xef, 0xb5, 0x44, 0x5e, 0x84, 0x72, 0x25, 0xf7, 0xe6, 0x75, ++ 0xb7, 0x31, 0x2d, 0x72, 0x1d, 0x9c, 0x30, 0xf3, 0x3c, 0xb5, 0xa8, 0x33, ++ 0xc1, 0xf9, 0xea, 0x35, 0xc0, 0xb5, 0xa3, 0x12, 0x5b, 0x7d, 0x98, 0x1b, ++ 0x11, 0xfc, 0xea, 0xc5, 0xe6, 0x91, 0x58, 0xef, 0xfb, 0x4a, 0x8b, 0xcf, ++ 0x93, 0x6f, 0x08, 0xc7, 0x9e, 0x67, 0xee, 0xd8, 0x42, 0x7e, 0x5c, 0x5b, ++ 0xc0, 0x7e, 0x23, 0x43, 0xde, 0x8e, 0xbc, 0x5e, 0xea, 0x32, 0x55, 0x05, ++ 0x9c, 0xee, 0xc3, 0x2e, 0xf2, 0x98, 0x9a, 0xda, 0x01, 0xf8, 0x1b, 0x3d, ++ 0x17, 0x3c, 0x18, 0xc0, 0x7b, 0xab, 0x18, 0x25, 0x4b, 0x1c, 0x5c, 0xb5, ++ 0x2a, 0xe5, 0x94, 0xe9, 0xb5, 0xd1, 0x32, 0x8f, 0xf4, 0x60, 0x8d, 0xd4, ++ 0x10, 0xf3, 0x90, 0xa7, 0x51, 0x4b, 0x25, 0xe1, 0x0f, 0x55, 0xeb, 0x5d, ++ 0x05, 0x0e, 0x19, 0xf1, 0x6f, 0x22, 0xcf, 0x31, 0x12, 0x9f, 0x39, 0x53, ++ 0xe1, 0x01, 0x44, 0x1a, 0x73, 0xfd, 0x11, 0x24, 0xef, 0x89, 0x40, 0x70, ++ 0xe6, 0x10, 0x32, 0x46, 0xc4, 0xbf, 0x35, 0x9b, 0x0a, 0x6c, 0xae, 0x8b, ++ 0x62, 0xcb, 0x48, 0xab, 0xda, 0x92, 0xd5, 0xb1, 0x61, 0xa4, 0x8d, 0xf5, ++ 0x7a, 0xbb, 0x6a, 0x9f, 0x16, 0xfd, 0x88, 0x7e, 0xb5, 0x50, 0xd4, 0xc3, ++ 0xb5, 0x5f, 0xcc, 0xe7, 0x79, 0x3e, 0xf2, 0x93, 0xba, 0x73, 0xae, 0xef, ++ 0x0c, 0x9b, 0x21, 0xea, 0xe5, 0xc7, 0x25, 0x08, 0x3a, 0x38, 0x6e, 0x8a, ++ 0xcf, 0x85, 0xdc, 0xfa, 0x7b, 0x7d, 0xd3, 0x98, 0xe3, 0xd3, 0xa5, 0xfe, ++ 0x8a, 0xb8, 0xf6, 0x92, 0x7a, 0xaf, 0x75, 0xba, 0x83, 0x36, 0x2a, 0xf6, ++ 0x73, 0x6f, 0x08, 0xac, 0x13, 0x3b, 0x98, 0x95, 0x48, 0x86, 0x94, 0x0a, ++ 0x58, 0xe5, 0xfe, 0x38, 0x73, 0xe6, 0xa1, 0x4c, 0x1f, 0x36, 0x72, 0xce, ++ 0x0f, 0x64, 0xc4, 0xc7, 0xde, 0xb0, 0x4e, 0x91, 0xfb, 0xbe, 0x64, 0x96, ++ 0x62, 0xaa, 0xdd, 0x4f, 0x5c, 0xef, 0xc2, 0x9d, 0x1c, 0xff, 0x21, 0xd6, ++ 0xb9, 0xf9, 0xde, 0xb2, 0x16, 0x4a, 0x21, 0x5a, 0x2a, 0xf5, 0xe8, 0xb0, ++ 0x7e, 0xb9, 0xed, 0xd7, 0x12, 0x77, 0xb5, 0xf6, 0x29, 0xa4, 0xe2, 0x25, ++ 0x88, 0x35, 0x1f, 0x80, 0xf0, 0x2e, 0xe2, 0xa6, 0x2e, 0xb1, 0x7d, 0x8a, ++ 0xb1, 0xfd, 0x96, 0x73, 0x4e, 0xf7, 0xd1, 0xd6, 0x6b, 0xb0, 0x2e, 0x24, ++ 0x38, 0x6e, 0x05, 0xda, 0x27, 0x7d, 0x9e, 0x2a, 0x0b, 0x4d, 0xac, 0xab, ++ 0x9d, 0xa0, 0xdb, 0x9f, 0x02, 0x46, 0x32, 0x37, 0x04, 0xb6, 0x4e, 0x44, ++ 0x71, 0x38, 0xe1, 0x2f, 0xf4, 0x4f, 0xaf, 0xe3, 0x9c, 0xbd, 0xca, 0x63, ++ 0xc1, 0x7b, 0x6b, 0x93, 0x83, 0xfb, 0x4c, 0x23, 0xb7, 0xd6, 0xeb, 0xa7, ++ 0x1c, 0x1f, 0x8e, 0x66, 0x9a, 0x78, 0x4d, 0x0b, 0xec, 0x9c, 0x18, 0x3c, ++ 0x5f, 0x02, 0x97, 0x3b, 0xe7, 0x3c, 0x3c, 0x5e, 0xbb, 0x0a, 0xfb, 0x89, ++ 0x45, 0x7d, 0xc4, 0xea, 0xae, 0x79, 0x65, 0x44, 0x1f, 0x54, 0x48, 0x06, ++ 0x2c, 0x23, 0xf5, 0x20, 0xde, 0x72, 0x7e, 0x93, 0x59, 0xc3, 0x67, 0xda, ++ 0x18, 0xc3, 0x82, 0xc9, 0xf2, 0x8c, 0xb6, 0xb0, 0x19, 0x5a, 0xef, 0x5a, ++ 0x6f, 0xac, 0xeb, 0xbc, 0xc2, 0xdd, 0x41, 0x18, 0xed, 0x8f, 0x13, 0x83, ++ 0x0f, 0x24, 0x52, 0x9d, 0xcb, 0x61, 0xb4, 0xad, 0xa7, 0xbf, 0xf4, 0xa8, ++ 0x28, 0x73, 0x81, 0xd8, 0x37, 0x8e, 0xdf, 0x70, 0x5c, 0x9f, 0x2e, 0x76, ++ 0x5a, 0x8b, 0xee, 0x69, 0xd6, 0x40, 0x17, 0xfd, 0x58, 0x74, 0x23, 0x7a, ++ 0xa7, 0xb3, 0x94, 0x2f, 0xe6, 0xfa, 0xde, 0x70, 0xf1, 0x2a, 0xa0, 0xc7, ++ 0xf1, 0x23, 0xda, 0xf8, 0x87, 0xe4, 0x5d, 0xcf, 0x5e, 0xe4, 0x91, 0xe2, ++ 0x73, 0x6f, 0x58, 0x57, 0x4f, 0x35, 0x50, 0x77, 0xcb, 0xf0, 0x8c, 0x5b, ++ 0xd7, 0xfa, 0x03, 0x6d, 0x93, 0x0e, 0x1e, 0x31, 0x83, 0x90, 0x9e, 0x51, ++ 0x59, 0x22, 0x47, 0x86, 0xd1, 0x80, 0x0d, 0x3c, 0xdf, 0x3a, 0xb9, 0x48, ++ 0xb5, 0x4e, 0x38, 0x78, 0xd6, 0xd4, 0x52, 0x2d, 0x5e, 0xe2, 0x85, 0x29, ++ 0xbd, 0xe8, 0x32, 0xd5, 0x15, 0x12, 0xff, 0xf5, 0xa1, 0x42, 0xcf, 0xcb, ++ 0x6b, 0x98, 0xba, 0x81, 0xfc, 0x44, 0xe2, 0xd7, 0xbb, 0xb2, 0x1c, 0x5b, ++ 0xd4, 0x94, 0x2f, 0xdf, 0xf3, 0x4a, 0x66, 0x17, 0x31, 0xe6, 0xa3, 0xcc, ++ 0x35, 0xa5, 0xc8, 0xf7, 0x2a, 0x6f, 0x08, 0x74, 0x4e, 0xe0, 0x6f, 0x22, ++ 0xf0, 0x7e, 0xe7, 0x0a, 0xec, 0x55, 0xc9, 0x52, 0x39, 0x27, 0x63, 0x24, ++ 0x0b, 0xdc, 0xae, 0x1d, 0x13, 0xc4, 0xb2, 0x41, 0xc6, 0xc1, 0xcd, 0xfa, ++ 0x0d, 0x81, 0x8d, 0xf4, 0x99, 0xb3, 0xa6, 0x07, 0x39, 0xa2, 0xf3, 0x62, ++ 0x5d, 0x7a, 0x13, 0x0d, 0xa8, 0xf9, 0x4e, 0x13, 0x65, 0x48, 0x3e, 0xeb, ++ 0xc4, 0xa3, 0xb3, 0xac, 0xb7, 0x57, 0xb9, 0xb9, 0xac, 0xe7, 0x46, 0x4f, ++ 0xaa, 0xb3, 0x92, 0xdc, 0x7e, 0x1f, 0x6b, 0xd9, 0xed, 0x6e, 0x9c, 0x9d, ++ 0xb2, 0xe2, 0x33, 0x11, 0x94, 0x3c, 0x2c, 0x78, 0xa7, 0x45, 0x02, 0xee, ++ 0xb9, 0x05, 0x2b, 0xc6, 0x73, 0xd5, 0x0f, 0x7b, 0x11, 0x5d, 0x5a, 0x8e, ++ 0x3d, 0x7a, 0xa5, 0xcb, 0x03, 0xf7, 0x90, 0x17, 0xfc, 0xc6, 0x94, 0xeb, ++ 0xaf, 0xf0, 0xba, 0x1c, 0x73, 0x56, 0xd4, 0x3d, 0x3e, 0xcf, 0x63, 0xb1, ++ 0x3f, 0xf3, 0x5d, 0x9f, 0x1c, 0x93, 0x9c, 0xc3, 0x16, 0xf2, 0x8d, 0xcd, ++ 0xe4, 0x1b, 0x15, 0xe4, 0x1b, 0x5b, 0xc9, 0x37, 0xd6, 0x27, 0x72, 0x9b, ++ 0x4a, 0x78, 0x7e, 0x53, 0x81, 0x6f, 0xfc, 0x96, 0x7c, 0x23, 0x49, 0xbe, ++ 0xb1, 0x9c, 0x72, 0x6b, 0x1b, 0x81, 0x0d, 0xe4, 0x1b, 0x6f, 0x93, 0x8f, ++ 0x7b, 0xe6, 0xbe, 0xc8, 0x33, 0xfe, 0x01, 0x03, 0xf4, 0xc9, 0xbb, 0xe2, ++ 0xcb, 0xd4, 0xd4, 0x12, 0x0f, 0x82, 0x7a, 0x50, 0xed, 0x0f, 0x79, 0x51, ++ 0xa5, 0xbf, 0x53, 0xac, 0x4b, 0x2f, 0xf2, 0x8b, 0x1b, 0xe9, 0x6f, 0xdb, ++ 0x27, 0x04, 0x5f, 0x4e, 0x59, 0x9b, 0xc9, 0x2f, 0x5e, 0x4d, 0x5c, 0x83, ++ 0x4f, 0x8e, 0x0c, 0x46, 0x2a, 0x21, 0xdc, 0xc2, 0x41, 0x43, 0x23, 0x56, ++ 0x32, 0x87, 0x31, 0xeb, 0x49, 0x6e, 0x76, 0x9c, 0x96, 0x84, 0x71, 0x7e, ++ 0x86, 0xb8, 0xb3, 0x81, 0xb5, 0xcb, 0x07, 0x5e, 0xad, 0xb7, 0x8e, 0x34, ++ 0x3e, 0x62, 0x19, 0x3d, 0xf4, 0xb5, 0xb4, 0xc0, 0x45, 0x25, 0xf9, 0x41, ++ 0x35, 0x39, 0xc6, 0xd6, 0x02, 0xc7, 0xa8, 0x36, 0xb0, 0xb2, 0x02, 0x46, ++ 0x88, 0xd0, 0xcf, 0x79, 0x36, 0x04, 0x36, 0x91, 0x63, 0xbc, 0x4b, 0x8e, ++ 0xf1, 0x3d, 0x72, 0x8c, 0x00, 0x39, 0xc6, 0x06, 0x72, 0x8c, 0x00, 0x39, ++ 0xc6, 0xf7, 0xc8, 0x31, 0x4a, 0xc9, 0x31, 0x76, 0xda, 0x9a, 0x19, 0x55, ++ 0x61, 0xe6, 0x4b, 0x1f, 0x56, 0xcd, 0x17, 0x78, 0xc6, 0x7c, 0x9e, 0x67, ++ 0x54, 0xd0, 0x27, 0xd2, 0xc2, 0x33, 0xe6, 0xf3, 0xb6, 0x79, 0x53, 0xe1, ++ 0x5a, 0x6a, 0x7a, 0x59, 0x5e, 0xbe, 0xe3, 0x6c, 0x64, 0x9e, 0xad, 0x9b, ++ 0xa7, 0x1e, 0xb3, 0xe2, 0x37, 0x7e, 0xdc, 0x9b, 0xa8, 0x44, 0xd7, 0x62, ++ 0xa5, 0xaa, 0x88, 0x0b, 0xef, 0xaf, 0x8e, 0xa3, 0x6c, 0xae, 0x8f, 0x3a, ++ 0x16, 0xfe, 0x02, 0xff, 0x15, 0x94, 0x75, 0xef, 0xc3, 0xac, 0x5b, 0x1b, ++ 0xb9, 0x3a, 0xf2, 0xd7, 0x28, 0xe3, 0xa1, 0xdf, 0xe5, 0x34, 0x15, 0xa8, ++ 0x35, 0x9a, 0x91, 0x73, 0xf3, 0xea, 0xda, 0xc0, 0xad, 0x5c, 0xc7, 0x52, ++ 0xc6, 0x88, 0x70, 0xe4, 0x4f, 0x56, 0xbd, 0x89, 0xeb, 0xae, 0xf0, 0xc0, ++ 0xcf, 0x58, 0x5f, 0xc7, 0x58, 0xaf, 0xa0, 0x5f, 0x77, 0x9b, 0x46, 0x9c, ++ 0xe9, 0x0c, 0x2f, 0x31, 0xce, 0x5b, 0xe8, 0x93, 0x9b, 0x4c, 0x7f, 0xa1, ++ 0xe7, 0x74, 0x1d, 0xe7, 0xe0, 0x55, 0x57, 0x30, 0xce, 0xf7, 0x5f, 0xe7, ++ 0xe0, 0xae, 0x84, 0x71, 0x68, 0x9e, 0x39, 0xf7, 0xe7, 0xe4, 0x97, 0x65, ++ 0x7a, 0x53, 0x60, 0x93, 0x1b, 0xe7, 0x8e, 0xb3, 0x25, 0xe1, 0x60, 0x6d, ++ 0x62, 0xf0, 0xa9, 0xe5, 0x8c, 0xf3, 0xe6, 0x55, 0xf8, 0xfa, 0x52, 0xe0, ++ 0xdb, 0x11, 0x18, 0x47, 0x6f, 0x52, 0xa9, 0xf8, 0x62, 0x72, 0xb3, 0xbd, ++ 0x1e, 0x24, 0x83, 0x56, 0xac, 0xfd, 0x25, 0xc8, 0xf3, 0x6f, 0x39, 0xdb, ++ 0xe7, 0xf2, 0xf1, 0x7e, 0x2b, 0xe3, 0x7d, 0x13, 0xe3, 0x7d, 0x9f, 0xa9, ++ 0x85, 0x1e, 0x56, 0x83, 0xd1, 0x32, 0xd6, 0x03, 0xad, 0xe4, 0x2d, 0x1f, ++ 0x78, 0xf1, 0x32, 0xf9, 0xe0, 0xb3, 0xac, 0x22, 0x93, 0x4b, 0xe9, 0x43, ++ 0xef, 0x27, 0x0c, 0x93, 0x91, 0x45, 0x5f, 0x3b, 0xef, 0x6c, 0xa0, 0x4e, ++ 0x17, 0x17, 0x62, 0xfd, 0x1b, 0xd3, 0x2f, 0x17, 0xfc, 0x4f, 0x7a, 0x3e, ++ 0x6f, 0x58, 0x3b, 0xe8, 0xbb, 0xed, 0x8d, 0xcc, 0x19, 0x8b, 0x59, 0x23, ++ 0x79, 0x24, 0x56, 0x14, 0x36, 0xea, 0xed, 0xcc, 0x4b, 0xed, 0xd8, 0x43, ++ 0xbe, 0xd1, 0x63, 0xc7, 0x28, 0x87, 0x31, 0x13, 0xd1, 0xa2, 0x67, 0xd0, ++ 0x81, 0x6e, 0x9b, 0x1f, 0xe6, 0xc7, 0xad, 0xf6, 0xbf, 0xa8, 0x61, 0x83, ++ 0xf5, 0xb9, 0xd4, 0x56, 0x1e, 0x2d, 0x9e, 0xf2, 0xf4, 0xa0, 0x6b, 0x56, ++ 0xb0, 0x1c, 0xa1, 0xb0, 0xd5, 0x8e, 0x11, 0xbb, 0x14, 0x5f, 0x6b, 0xda, ++ 0xaa, 0xb6, 0x65, 0xdb, 0x30, 0x6e, 0x13, 0x1f, 0x68, 0xef, 0x1f, 0x51, ++ 0x76, 0xac, 0xb6, 0x8d, 0x3c, 0x81, 0x58, 0x61, 0xef, 0x50, 0xdb, 0xa7, ++ 0xa5, 0xd6, 0xeb, 0x50, 0x5f, 0x13, 0x3c, 0xb1, 0xfb, 0x55, 0x87, 0xe0, ++ 0x8b, 0x4d, 0x7c, 0xb9, 0x88, 0x43, 0x26, 0x71, 0xe8, 0xf2, 0x18, 0xdf, ++ 0x8e, 0x96, 0x52, 0x0f, 0xaa, 0xf5, 0x58, 0xa0, 0x75, 0x42, 0xea, 0xb7, ++ 0xdf, 0x5f, 0xe8, 0x0a, 0xb1, 0x06, 0x70, 0x63, 0xfc, 0xfc, 0x85, 0x17, ++ 0x5c, 0x1e, 0x56, 0xcc, 0x5f, 0x6b, 0x71, 0xc7, 0xc4, 0x52, 0xd7, 0x7e, ++ 0xf1, 0x44, 0x05, 0xca, 0xaa, 0x05, 0x6b, 0x8b, 0xbe, 0xa4, 0xe4, 0xfd, ++ 0x9d, 0x8b, 0x35, 0xf5, 0x53, 0x6b, 0xa5, 0xbf, 0x89, 0x75, 0x89, 0xdb, ++ 0x70, 0x5b, 0xa8, 0x1c, 0x95, 0xfa, 0x7f, 0xc2, 0x5d, 0x21, 0x72, 0x3d, ++ 0x57, 0x5f, 0x22, 0x67, 0xb4, 0xb4, 0xd0, 0x2f, 0xb8, 0xc8, 0x21, 0x7d, ++ 0x8c, 0xeb, 0x61, 0x72, 0xbd, 0xe5, 0x8c, 0x67, 0x67, 0x52, 0x27, 0x77, ++ 0x64, 0x1d, 0x9b, 0xd0, 0x16, 0x86, 0x68, 0x87, 0xb5, 0x5e, 0xec, 0x8b, ++ 0x90, 0xbf, 0x92, 0x3b, 0x12, 0xb3, 0x19, 0x5f, 0x8c, 0xa0, 0x0a, 0xf2, ++ 0xc5, 0x72, 0x97, 0xbf, 0x9e, 0x29, 0xcd, 0xf3, 0xd7, 0x4b, 0xb2, 0x96, ++ 0x53, 0x96, 0x33, 0x29, 0x75, 0xd1, 0xf3, 0xd6, 0xf5, 0x94, 0xf5, 0x31, ++ 0x65, 0xe9, 0xe4, 0xa3, 0x1f, 0x1d, 0xd1, 0x72, 0xef, 0x7a, 0x63, 0x3d, ++ 0x35, 0x5e, 0x34, 0xd0, 0x3a, 0x1d, 0x41, 0xf2, 0xd1, 0x8c, 0x61, 0x1c, ++ 0xda, 0xaa, 0xc8, 0x47, 0x9b, 0x98, 0xdf, 0x0a, 0x7c, 0xb4, 0x9a, 0x7c, ++ 0xb4, 0xd4, 0xe5, 0xa3, 0x22, 0x5b, 0xf8, 0xe8, 0x30, 0xf6, 0xd3, 0x47, ++ 0xb6, 0xd9, 0xcf, 0x5c, 0x98, 0xaa, 0x6e, 0xc7, 0x28, 0x75, 0x5b, 0x55, ++ 0xc0, 0xd5, 0x6b, 0xa7, 0x46, 0x2e, 0xae, 0x45, 0x7e, 0x27, 0x88, 0xb3, ++ 0xb7, 0x4e, 0x48, 0x5f, 0x3e, 0x4a, 0x1f, 0x3f, 0x71, 0x21, 0x7a, 0xa5, ++ 0x9f, 0xba, 0x95, 0xf5, 0x32, 0x96, 0x75, 0x9d, 0xfc, 0x3a, 0x4e, 0xec, ++ 0xb9, 0xc4, 0x69, 0xc9, 0xaf, 0x9b, 0xe8, 0xe2, 0xf7, 0xb7, 0x72, 0xfc, ++ 0x17, 0x19, 0x73, 0x3e, 0x8e, 0xef, 0x75, 0xc7, 0x15, 0x8e, 0x7d, 0xee, ++ 0x42, 0x91, 0x07, 0x3b, 0x97, 0x9e, 0x39, 0xbd, 0x9c, 0x63, 0x35, 0xaf, ++ 0xa9, 0x20, 0x67, 0x96, 0xfb, 0x84, 0x07, 0xaf, 0x2c, 0x93, 0xbc, 0xe2, ++ 0xd7, 0xb7, 0x62, 0x80, 0xbe, 0x34, 0x40, 0x1f, 0xbb, 0xcf, 0x9e, 0xe4, ++ 0xb5, 0x76, 0xdc, 0x97, 0x5d, 0x4b, 0x4e, 0xf5, 0x45, 0xbd, 0x87, 0x69, ++ 0x8b, 0x32, 0x3f, 0xca, 0xe5, 0xda, 0x1f, 0xe2, 0x0d, 0x7f, 0x85, 0x7e, ++ 0xd6, 0x7f, 0xf7, 0x4d, 0xa4, 0xb0, 0x7f, 0xe2, 0x5b, 0xe4, 0xc2, 0x6e, ++ 0xde, 0xbc, 0x5d, 0x38, 0x7c, 0x15, 0x63, 0xeb, 0xef, 0x12, 0x86, 0x70, ++ 0xc1, 0x1d, 0x8b, 0x20, 0xdc, 0xc2, 0x68, 0xbe, 0x46, 0x39, 0x28, 0x4d, ++ 0xa0, 0xb7, 0xb5, 0xc9, 0x88, 0x9f, 0xc5, 0xfd, 0x8e, 0xf4, 0x94, 0xbd, ++ 0x05, 0x9e, 0x21, 0xb5, 0xaf, 0xbc, 0x1b, 0x68, 0x29, 0x70, 0xc2, 0x75, ++ 0xd9, 0xb7, 0xbe, 0xd0, 0x37, 0x89, 0x16, 0xf2, 0x5c, 0x40, 0xb5, 0x70, ++ 0x9c, 0x83, 0xe4, 0x70, 0x4f, 0x99, 0x2f, 0x44, 0x4a, 0x19, 0x4c, 0xbe, ++ 0x46, 0x85, 0x7b, 0xcc, 0x12, 0xa4, 0xc2, 0x0e, 0x76, 0xf0, 0xb8, 0x87, ++ 0x38, 0xf4, 0x1e, 0xf9, 0xc9, 0x54, 0x28, 0x44, 0x6e, 0x4c, 0x9c, 0xf7, ++ 0x1c, 0xe7, 0x7c, 0xb5, 0x78, 0xd4, 0x23, 0xef, 0xdd, 0xf3, 0x7d, 0x86, ++ 0x67, 0x3e, 0xd7, 0xeb, 0x10, 0x3e, 0x52, 0xec, 0x37, 0x10, 0xe4, 0xdd, ++ 0x7e, 0x75, 0x40, 0x91, 0x17, 0xc4, 0x41, 0xee, 0xb6, 0xcb, 0xcc, 0x45, ++ 0x09, 0x09, 0x9f, 0x78, 0xa0, 0x1d, 0x7d, 0x97, 0xb5, 0xed, 0x7d, 0xb5, ++ 0xda, 0xd1, 0x2f, 0x93, 0x94, 0xf4, 0x8f, 0xfa, 0x71, 0xf7, 0xe8, 0x06, ++ 0x54, 0xb9, 0x7d, 0xaf, 0x61, 0xc6, 0xa7, 0x87, 0xf5, 0xe4, 0xe0, 0x67, ++ 0x3e, 0xd6, 0x95, 0x9f, 0xac, 0xfa, 0x36, 0x9a, 0xdd, 0xf3, 0x43, 0xb8, ++ 0x7d, 0x22, 0xa0, 0x36, 0x4f, 0xf8, 0xb0, 0x61, 0xfb, 0xb7, 0x51, 0xd2, ++ 0xd8, 0xc5, 0x79, 0xc9, 0x79, 0xf9, 0x7e, 0x33, 0xeb, 0x51, 0x99, 0x5f, ++ 0x29, 0x73, 0x18, 0xe7, 0xd6, 0xa8, 0x63, 0x60, 0xd4, 0xa7, 0x76, 0xda, ++ 0xff, 0xe0, 0x7c, 0x72, 0x25, 0x71, 0x02, 0x72, 0xae, 0x5c, 0xde, 0xff, ++ 0xf3, 0x9e, 0x24, 0x6b, 0xc5, 0x6e, 0xe6, 0xd4, 0x52, 0xdc, 0xec, 0x3e, ++ 0xbf, 0xb7, 0x34, 0xbf, 0xa6, 0x24, 0x6b, 0xf5, 0x56, 0xd6, 0x09, 0x72, ++ 0x0f, 0x8a, 0xe7, 0xfc, 0xf9, 0x3d, 0x06, 0xe2, 0x0b, 0xdd, 0xb8, 0x9a, ++ 0x46, 0xa8, 0x35, 0xc4, 0xef, 0xba, 0x51, 0x9b, 0x59, 0x5c, 0xd8, 0xa2, ++ 0x31, 0x8c, 0xbb, 0xec, 0x1c, 0x82, 0x96, 0xce, 0x58, 0xa1, 0xee, 0x96, ++ 0xc8, 0xf3, 0x41, 0xff, 0xe7, 0x9f, 0x17, 0xae, 0x45, 0x4e, 0x1d, 0x14, ++ 0x6e, 0xfd, 0x87, 0xae, 0x7f, 0x15, 0x72, 0xcd, 0xa7, 0xff, 0x25, 0xf6, ++ 0x4e, 0x18, 0xed, 0x8b, 0x3c, 0xe2, 0x3f, 0x7f, 0x89, 0x3b, 0xa7, 0x87, ++ 0x78, 0x5d, 0xe4, 0xf7, 0xb1, 0x66, 0xf2, 0xa9, 0x36, 0x5b, 0xc7, 0x9e, ++ 0x51, 0xcf, 0x8d, 0xa5, 0xf8, 0x91, 0x53, 0xb6, 0x64, 0x00, 0xb5, 0x89, ++ 0x21, 0xde, 0xaf, 0xd0, 0x4a, 0x7e, 0xfc, 0x90, 0xb9, 0x0e, 0x1b, 0xaa, ++ 0x1d, 0xec, 0x4e, 0x3c, 0xe5, 0x74, 0x77, 0x88, 0x0e, 0x15, 0xd6, 0xf3, ++ 0xfc, 0xd3, 0xa6, 0xd4, 0xdd, 0x3e, 0xd4, 0x2e, 0x96, 0x1e, 0xa6, 0x36, ++ 0x96, 0xc4, 0xd7, 0xdd, 0x31, 0xab, 0x59, 0x4f, 0x54, 0xe9, 0x7a, 0xef, ++ 0x4d, 0x9e, 0xda, 0xb1, 0xd7, 0xe9, 0x4f, 0x2d, 0x8d, 0x97, 0x5f, 0x2b, ++ 0xea, 0xc4, 0x24, 0x67, 0x7e, 0xd2, 0xc1, 0x15, 0x83, 0x08, 0x35, 0x5e, ++ 0x6e, 0xff, 0xe2, 0xbc, 0xfb, 0x18, 0xa7, 0x48, 0x55, 0x59, 0xd2, 0xe3, ++ 0x32, 0x28, 0xa7, 0x0f, 0xdf, 0xc8, 0x0e, 0xe1, 0x9e, 0x89, 0x42, 0x0d, ++ 0x41, 0xdf, 0xd6, 0x1b, 0x2f, 0xad, 0xed, 0xae, 0x09, 0xa3, 0xab, 0xb2, ++ 0xb0, 0xb6, 0x7d, 0xd3, 0xd2, 0xcb, 0xee, 0xc0, 0x5e, 0xea, 0xb4, 0xd7, ++ 0xd5, 0x69, 0x07, 0xcc, 0xcc, 0x25, 0xb9, 0x3d, 0x94, 0x1b, 0xb0, 0x44, ++ 0x6f, 0x46, 0x73, 0x80, 0x72, 0xf7, 0x50, 0xee, 0xee, 0xcb, 0xe4, 0x76, ++ 0x9b, 0x97, 0xe4, 0xee, 0x9a, 0x30, 0x8e, 0x7a, 0x0a, 0x72, 0xef, 0x9d, ++ 0x2e, 0xca, 0x48, 0x61, 0x5b, 0x63, 0x0a, 0x99, 0xeb, 0xf7, 0x39, 0xfb, ++ 0x5c, 0x7d, 0x3c, 0xe1, 0x9e, 0x5f, 0x5f, 0xbb, 0xc0, 0x78, 0xe0, 0x57, ++ 0xcb, 0x64, 0x1c, 0x34, 0x90, 0x0b, 0xc6, 0xc9, 0x05, 0x75, 0xc6, 0x43, ++ 0x94, 0x31, 0x52, 0xec, 0xcb, 0x69, 0x6f, 0x6d, 0xf6, 0x26, 0xc9, 0x17, ++ 0xc3, 0xfe, 0x4d, 0x5f, 0xe8, 0xe5, 0x6c, 0x60, 0xcd, 0xb9, 0xd1, 0xde, ++ 0x1a, 0x68, 0xb3, 0xfd, 0xe4, 0x68, 0x8b, 0xd4, 0xfa, 0x09, 0xe9, 0xe9, ++ 0x48, 0x3c, 0x17, 0xf8, 0x7f, 0x56, 0x6a, 0xdb, 0x5b, 0x98, 0x7b, 0xae, ++ 0xa1, 0x8d, 0xbb, 0x70, 0x28, 0xdb, 0xa7, 0x92, 0x61, 0x8e, 0x65, 0x4b, ++ 0x6e, 0x41, 0x60, 0xdb, 0x44, 0x3b, 0x16, 0xd1, 0x9f, 0x96, 0x58, 0x87, ++ 0xac, 0x1f, 0xd6, 0x3a, 0xd2, 0x23, 0x67, 0x0e, 0x3b, 0x6a, 0xed, 0x60, ++ 0xd1, 0x7e, 0xd8, 0xcd, 0xbd, 0xda, 0x89, 0xfc, 0x3b, 0xa7, 0x80, 0xda, ++ 0xce, 0x7b, 0xbf, 0x67, 0xcb, 0x3b, 0xdd, 0x01, 0xac, 0x6c, 0xcc, 0xf5, ++ 0x04, 0x91, 0xfc, 0x8b, 0x20, 0x34, 0xd6, 0x97, 0x87, 0xf0, 0xac, 0x1e, ++ 0xf1, 0x77, 0x64, 0x7d, 0x6a, 0x93, 0x3d, 0x13, 0xd8, 0x6c, 0x07, 0xb1, ++ 0xc8, 0xd2, 0x72, 0x5b, 0xbc, 0xb1, 0xd0, 0x35, 0x2e, 0xa7, 0xcb, 0x58, ++ 0x57, 0x65, 0x3a, 0x39, 0xdf, 0x3c, 0x46, 0xea, 0x53, 0xfe, 0xc0, 0xc6, ++ 0xc9, 0x98, 0x39, 0xe0, 0x62, 0xe6, 0x53, 0x56, 0x6d, 0xc6, 0x71, 0xce, ++ 0x99, 0xb9, 0x9f, 0xf9, 0xdd, 0xdf, 0xbf, 0xb0, 0xd6, 0x66, 0x1a, 0xb0, ++ 0x93, 0x3c, 0xad, 0x65, 0xb2, 0x01, 0xa1, 0x49, 0xe0, 0xe9, 0xd1, 0x08, ++ 0xaa, 0x26, 0xb4, 0xa3, 0x7d, 0xde, 0x4e, 0x8c, 0xcd, 0xb6, 0x62, 0x22, ++ 0x1b, 0x38, 0x1f, 0xf5, 0x38, 0xf8, 0x4d, 0xc2, 0x83, 0x1b, 0xcd, 0x27, ++ 0x54, 0x6e, 0x89, 0xc2, 0x4d, 0xe6, 0x7f, 0x54, 0x67, 0x0a, 0xfc, 0x55, ++ 0xea, 0x98, 0xdb, 0x0b, 0x9c, 0x34, 0xac, 0xcb, 0x7b, 0xc1, 0x19, 0x72, ++ 0x1f, 0x85, 0x2b, 0x5c, 0xcc, 0x7e, 0xcb, 0x6a, 0x66, 0x6d, 0x70, 0x13, ++ 0xf9, 0xe9, 0x76, 0xe2, 0xcd, 0xaf, 0xc8, 0x19, 0x56, 0x36, 0x6a, 0x3d, ++ 0xa3, 0x9e, 0x54, 0x5c, 0xb8, 0x69, 0x06, 0x5a, 0x67, 0x7b, 0x81, 0x87, ++ 0xd6, 0xcf, 0xe4, 0x39, 0xea, 0x35, 0x33, 0xc2, 0x31, 0x58, 0xe3, 0x25, ++ 0xb4, 0xa8, 0xc7, 0x13, 0xc2, 0x98, 0x2b, 0xe7, 0xa4, 0x65, 0xce, 0x94, ++ 0x32, 0x17, 0x8a, 0x4e, 0xe4, 0xf7, 0x69, 0xab, 0x2e, 0x73, 0x0b, 0x0e, ++ 0xd9, 0x9d, 0xc2, 0xbb, 0x52, 0x40, 0x2c, 0xbe, 0x5c, 0x6d, 0x27, 0xcf, ++ 0x8e, 0x45, 0xd7, 0x7a, 0xc9, 0x40, 0x7c, 0xf5, 0xe6, 0x0c, 0xb6, 0xab, ++ 0xc2, 0x5e, 0x1e, 0x77, 0xdd, 0x46, 0x06, 0x68, 0x19, 0x0d, 0x9c, 0x4f, ++ 0x22, 0xdf, 0xc7, 0x5a, 0x67, 0xfe, 0x16, 0x5d, 0x61, 0xed, 0x90, 0xf0, ++ 0xd2, 0x56, 0xe2, 0x71, 0xaa, 0xc3, 0xc7, 0xeb, 0x12, 0xeb, 0xcf, 0x5a, ++ 0x57, 0x8f, 0x20, 0x57, 0xce, 0x3a, 0x85, 0xfa, 0x0c, 0xb6, 0x67, 0x81, ++ 0xf5, 0xcc, 0xe5, 0xdf, 0x37, 0x3f, 0x73, 0xba, 0x0a, 0xef, 0xe4, 0xb6, ++ 0x4d, 0x2a, 0x84, 0x74, 0x0b, 0x23, 0xb3, 0xbe, 0xe0, 0x56, 0xbb, 0x09, ++ 0xe9, 0xac, 0xef, 0x32, 0xd9, 0xc6, 0xa1, 0xab, 0x3c, 0x1e, 0xae, 0xf3, ++ 0x6e, 0xea, 0xaa, 0x98, 0x77, 0x9f, 0x77, 0x73, 0x65, 0x29, 0xd7, 0x79, ++ 0xea, 0x88, 0xe4, 0xdf, 0xbf, 0x75, 0xf3, 0x6f, 0x84, 0x63, 0x45, 0x6c, ++ 0xad, 0x53, 0xea, 0xe0, 0x2a, 0xea, 0x4a, 0xde, 0x49, 0x2d, 0xb7, 0xde, ++ 0x64, 0x3e, 0xd5, 0x22, 0xdd, 0x4a, 0x72, 0xa0, 0xb6, 0x10, 0xf0, 0x7a, ++ 0xb0, 0x5f, 0xd7, 0xe2, 0x6b, 0xbd, 0x9a, 0xd4, 0x45, 0x2e, 0x27, 0xaf, ++ 0x9f, 0xe9, 0xc6, 0x48, 0x36, 0xaf, 0xdf, 0x86, 0x4c, 0x9e, 0x9f, 0x1b, ++ 0x2e, 0x2f, 0x97, 0xfd, 0x01, 0x6d, 0x78, 0xc0, 0x16, 0x5e, 0x2e, 0xe7, ++ 0x7f, 0x6e, 0xd5, 0x4d, 0xf9, 0x39, 0x37, 0x85, 0x73, 0x7a, 0x1b, 0xfd, ++ 0xb1, 0x38, 0xc7, 0x3c, 0x67, 0xdf, 0x44, 0xce, 0x5e, 0x4e, 0xce, 0xbe, ++ 0xd9, 0x2b, 0x39, 0x3b, 0x57, 0xe3, 0x43, 0x3b, 0x1e, 0x22, 0xd7, 0x59, ++ 0x57, 0xe0, 0xed, 0x67, 0x5d, 0xde, 0xee, 0x38, 0xbf, 0x34, 0x81, 0x5b, ++ 0xc9, 0xd9, 0x3f, 0x21, 0x67, 0xdf, 0x99, 0x89, 0xe2, 0x3c, 0x39, 0x7b, ++ 0x67, 0xa6, 0x06, 0x1f, 0x93, 0xb3, 0xbf, 0x93, 0xf8, 0x3d, 0xee, 0x2d, ++ 0xf4, 0x06, 0x77, 0xc5, 0xaf, 0xa4, 0xbf, 0x7b, 0x18, 0xb7, 0x01, 0x75, ++ 0x1b, 0x79, 0x7b, 0x85, 0xfe, 0x3c, 0xf6, 0x7d, 0x81, 0xb7, 0xdf, 0x4a, ++ 0xfe, 0xb8, 0xd5, 0xed, 0xbd, 0x9d, 0xb2, 0xe6, 0x1e, 0x11, 0x6e, 0x2a, ++ 0x3d, 0xc1, 0xc1, 0x5c, 0x0d, 0x73, 0x9d, 0x9d, 0xe8, 0x44, 0x7a, 0x12, ++ 0x4b, 0xf3, 0x35, 0xa3, 0xcc, 0xc9, 0x68, 0xbe, 0x11, 0x9a, 0x39, 0xa3, ++ 0x8c, 0xf3, 0x67, 0xc9, 0x13, 0x69, 0xc2, 0xa4, 0xd7, 0x32, 0x72, 0xef, ++ 0x78, 0xb1, 0xb5, 0x46, 0x2a, 0xfc, 0x39, 0xe9, 0x0d, 0xe6, 0xfb, 0x82, ++ 0xc1, 0x7c, 0x5f, 0x70, 0x3f, 0x6b, 0xcd, 0xf8, 0xbc, 0x22, 0x57, 0x22, ++ 0x67, 0xdf, 0x40, 0x3f, 0x1c, 0x34, 0x9c, 0x81, 0x8d, 0xe4, 0xec, 0xa5, ++ 0xe4, 0xec, 0xad, 0x36, 0x6b, 0x83, 0xd9, 0x38, 0x4a, 0x0d, 0xe9, 0xad, ++ 0x35, 0x33, 0x46, 0xb4, 0x68, 0x8e, 0xf9, 0xd9, 0x4b, 0x39, 0xd7, 0xcc, ++ 0x25, 0xc9, 0x4d, 0xfd, 0x58, 0x4b, 0x9e, 0xba, 0xd3, 0xed, 0x5b, 0xbe, ++ 0x61, 0xbd, 0x56, 0xe8, 0x0d, 0x36, 0xaf, 0xd2, 0xfa, 0xe9, 0xde, 0x7b, ++ 0xc8, 0x63, 0xf6, 0xb1, 0x2e, 0x65, 0x0c, 0x3a, 0xce, 0x31, 0xf2, 0x87, ++ 0xab, 0xe6, 0xf2, 0x9c, 0x5d, 0xea, 0xb2, 0x0f, 0xcd, 0x2a, 0x24, 0xb7, ++ 0x57, 0xa0, 0x73, 0x54, 0x29, 0x2f, 0x79, 0xfb, 0x1d, 0x4d, 0xac, 0x0f, ++ 0xc8, 0xdb, 0x37, 0x93, 0xb7, 0xbf, 0x92, 0x11, 0xbc, 0x7b, 0xc3, 0xda, ++ 0x4b, 0x79, 0x3d, 0x89, 0x3c, 0x6f, 0xcf, 0xb1, 0x9e, 0xbf, 0x8d, 0xe3, ++ 0xbd, 0xc4, 0x7a, 0xfe, 0xa4, 0x2e, 0xcf, 0x05, 0xce, 0x23, 0xbf, 0x7f, ++ 0x8a, 0xbe, 0xf0, 0x8a, 0xf5, 0xb1, 0xdb, 0xeb, 0xfb, 0x5b, 0xab, 0xe5, ++ 0x88, 0xd6, 0xfb, 0x36, 0xf9, 0xeb, 0x49, 0xe3, 0x65, 0xd7, 0xbe, 0xc3, ++ 0xa6, 0xf8, 0x51, 0xc6, 0x3a, 0x95, 0x16, 0x1d, 0x3e, 0x6b, 0xcd, 0x8d, ++ 0xc4, 0x9a, 0x5f, 0x45, 0x3e, 0xee, 0xeb, 0x32, 0xa5, 0x85, 0x3d, 0x2a, ++ 0xc5, 0x3e, 0x35, 0xab, 0xb3, 0x35, 0xf9, 0x78, 0x69, 0xc8, 0x1c, 0x20, ++ 0x47, 0x96, 0x3d, 0x2e, 0x21, 0xe9, 0xaf, 0x63, 0x8c, 0x3c, 0xd5, 0x3f, ++ 0x1f, 0x09, 0xde, 0xca, 0xbc, 0xb2, 0x7c, 0x5e, 0xf6, 0xf9, 0xe5, 0xac, ++ 0xd0, 0x77, 0x8a, 0xdc, 0xf3, 0xf3, 0xfd, 0xbc, 0x07, 0xf3, 0xbd, 0xbc, ++ 0xf6, 0x3b, 0xa4, 0x97, 0x57, 0x73, 0xa9, 0x97, 0xb7, 0x87, 0xd7, 0x1e, ++ 0xf8, 0x42, 0x2f, 0xef, 0xae, 0x09, 0xfc, 0x2e, 0xd8, 0x54, 0x86, 0xc7, ++ 0x57, 0x94, 0x20, 0x17, 0xd2, 0x22, 0xa3, 0xb8, 0x9f, 0xfc, 0x46, 0xfa, ++ 0x86, 0xbe, 0x7e, 0x8f, 0x57, 0x8b, 0xbc, 0xab, 0x2a, 0xf8, 0xec, 0x2d, ++ 0x81, 0xad, 0xf6, 0x2d, 0x78, 0xd4, 0x8e, 0x45, 0x1f, 0x55, 0x5e, 0xa4, ++ 0x22, 0xf2, 0xfc, 0x2d, 0x81, 0x76, 0x9e, 0x1b, 0xcb, 0x16, 0xf9, 0x53, ++ 0xbb, 0xcc, 0x15, 0x6d, 0xa3, 0x79, 0x9c, 0xaa, 0xcf, 0x50, 0x3f, 0x2a, ++ 0xbf, 0xb6, 0xe5, 0x5c, 0xab, 0x63, 0x7f, 0x7a, 0xe1, 0xcc, 0x95, 0x82, ++ 0x09, 0xba, 0xc4, 0x27, 0xf1, 0xab, 0x9b, 0xbe, 0xdb, 0x8e, 0x23, 0xf6, ++ 0x72, 0x54, 0x59, 0x52, 0x03, 0x76, 0xb8, 0x73, 0x9f, 0x60, 0xed, 0xbc, ++ 0xcd, 0x4c, 0x39, 0x1f, 0xad, 0xd6, 0xdb, 0xe6, 0x91, 0x63, 0x65, 0x15, ++ 0x42, 0x23, 0x39, 0xc2, 0x06, 0xe2, 0xff, 0x9e, 0x19, 0x9d, 0x35, 0x6a, ++ 0x2b, 0xee, 0xe4, 0x3a, 0xfb, 0xb8, 0x9e, 0x7b, 0xb3, 0x7f, 0x85, 0xe4, ++ 0xd7, 0x7d, 0x78, 0x6e, 0x34, 0xc9, 0xdc, 0xd5, 0x48, 0x4c, 0xf0, 0x13, ++ 0x0f, 0x2b, 0x90, 0xa1, 0x6d, 0x52, 0xee, 0xd8, 0x82, 0xe5, 0xcc, 0x1b, ++ 0xac, 0x05, 0x9e, 0xa5, 0xde, 0x9e, 0xa1, 0x0e, 0x7f, 0x70, 0xf1, 0x7d, ++ 0x8b, 0x70, 0x9f, 0x66, 0x77, 0x5f, 0xdc, 0xbf, 0xcd, 0xb3, 0xe3, 0xe4, ++ 0xc8, 0x2e, 0xd7, 0xee, 0x25, 0xd7, 0x6e, 0xe0, 0xd2, 0xbb, 0xab, 0xc8, ++ 0x8d, 0x5f, 0x35, 0x0c, 0x73, 0xa4, 0xc0, 0x8d, 0xbd, 0x05, 0x6e, 0x5c, ++ 0x4a, 0x6e, 0xec, 0x75, 0xb9, 0xf1, 0x6b, 0x81, 0x3c, 0x37, 0x0e, 0xa8, ++ 0x8d, 0x13, 0xcd, 0xc4, 0x3d, 0x5c, 0x28, 0x83, 0xb1, 0x70, 0xce, 0x9b, ++ 0x22, 0x76, 0x4f, 0x11, 0x6f, 0x67, 0x02, 0x37, 0xdb, 0xee, 0xde, 0x86, ++ 0x60, 0x27, 0x79, 0x1e, 0xeb, 0x8f, 0x60, 0x47, 0x76, 0x59, 0xf0, 0xe6, ++ 0x6c, 0x0b, 0x9f, 0x8b, 0xf0, 0x28, 0x18, 0x2e, 0xf3, 0xbf, 0x7c, 0x2d, ++ 0x03, 0xe5, 0x28, 0x97, 0xf5, 0x44, 0xd1, 0x75, 0xfc, 0x2a, 0xdc, 0x7b, ++ 0xbc, 0x89, 0xbf, 0x75, 0xdc, 0x3b, 0x97, 0xc7, 0xcb, 0x68, 0x66, 0x7f, ++ 0x40, 0xf8, 0x6b, 0xcb, 0x68, 0xfe, 0xb7, 0x7e, 0xd9, 0xef, 0x7f, 0x9b, ++ 0xfb, 0xbb, 0xbc, 0xbf, 0x97, 0xbc, 0x9f, 0xeb, 0xfa, 0x67, 0x59, 0x17, ++ 0xe3, 0xa5, 0x02, 0xeb, 0x19, 0x03, 0x1e, 0x3d, 0xec, 0xae, 0x2b, 0xbf, ++ 0x9e, 0x4b, 0x7d, 0xf0, 0xcb, 0xfa, 0xce, 0x7a, 0x29, 0xf0, 0x29, 0xc3, ++ 0xe0, 0xfe, 0x47, 0xa9, 0x87, 0xf3, 0x6b, 0xa4, 0xff, 0x1c, 0x62, 0x9c, ++ 0xcb, 0xfd, 0xc2, 0xd1, 0x7f, 0x7d, 0x91, 0xa3, 0x7f, 0x7c, 0xe9, 0x19, ++ 0x62, 0x05, 0xfc, 0xaf, 0xba, 0x3d, 0x73, 0xb9, 0x2f, 0xe4, 0xea, 0x69, ++ 0x87, 0xcb, 0x3b, 0x85, 0xcb, 0x39, 0x68, 0x6d, 0xfc, 0xff, 0xb1, 0x5b, ++ 0x31, 0xfe, 0xee, 0x2b, 0x97, 0x77, 0xcf, 0x7a, 0xe3, 0x1d, 0x4e, 0xde, ++ 0xaf, 0xc3, 0xc1, 0x0e, 0xc6, 0xcb, 0xc3, 0x7c, 0xa6, 0x63, 0x9e, 0x3a, ++ 0xb5, 0x77, 0xbb, 0x7a, 0xba, 0x79, 0x7e, 0x19, 0x6b, 0x36, 0x79, 0x8f, ++ 0x02, 0xe5, 0xb3, 0x0e, 0x60, 0xe3, 0x58, 0x14, 0xef, 0x98, 0x01, 0x74, ++ 0x15, 0xf0, 0xae, 0x8c, 0x3e, 0xfb, 0x7e, 0x3a, 0x42, 0x1f, 0x8c, 0x45, ++ 0xdf, 0x21, 0x2f, 0x4e, 0xf9, 0x7c, 0x78, 0x70, 0x82, 0x78, 0x49, 0xae, ++ 0x0a, 0x55, 0xec, 0xdf, 0xc9, 0xb3, 0xc5, 0xef, 0x8b, 0x58, 0x7f, 0xc7, ++ 0x9a, 0xf7, 0x20, 0x8a, 0x34, 0x73, 0x4a, 0x80, 0xd8, 0x79, 0x78, 0xdc, ++ 0x83, 0x3b, 0x13, 0x8a, 0xb8, 0x62, 0xf2, 0x77, 0x7d, 0xcf, 0x07, 0xf8, ++ 0xad, 0x33, 0xb5, 0x44, 0x9e, 0x97, 0x3d, 0x52, 0x9f, 0x3a, 0x35, 0xba, ++ 0x9e, 0xfb, 0x31, 0xf4, 0xfe, 0x4f, 0x50, 0xdf, 0x7b, 0x1e, 0x1f, 0x3a, ++ 0x39, 0x5e, 0x3b, 0xc7, 0x78, 0x7a, 0xc1, 0x8c, 0x45, 0x3c, 0x9c, 0xbc, ++ 0xe4, 0xe4, 0x3b, 0x4c, 0x79, 0x87, 0xa7, 0xf5, 0x3e, 0x01, 0xad, 0xe7, ++ 0x94, 0x92, 0xbd, 0x8f, 0x67, 0x9c, 0x54, 0xb5, 0x8c, 0xab, 0x70, 0xed, ++ 0x8a, 0xfa, 0xb6, 0x52, 0x68, 0xcd, 0x25, 0x4a, 0x37, 0x3f, 0x50, 0xff, ++ 0xc3, 0xc9, 0x85, 0x3f, 0x75, 0xde, 0xd5, 0x8b, 0x72, 0xb5, 0xa8, 0xdf, ++ 0x7b, 0xb1, 0xcf, 0xc8, 0x58, 0x94, 0x77, 0x9f, 0xcf, 0xe3, 0xce, 0x71, ++ 0x1f, 0x5a, 0x13, 0xbf, 0x72, 0x52, 0x61, 0x91, 0xb9, 0x62, 0x11, 0xca, ++ 0x45, 0x7e, 0xfe, 0x9d, 0xc0, 0x4f, 0xb3, 0x50, 0x1b, 0x6c, 0xe1, 0xe9, ++ 0xe2, 0x1b, 0x63, 0x70, 0x6c, 0xe9, 0xd3, 0x3a, 0xb8, 0x29, 0x31, 0x80, ++ 0x73, 0x89, 0xe4, 0x5f, 0xf8, 0x89, 0xe1, 0x67, 0xbd, 0x5a, 0xae, 0xc1, ++ 0x1b, 0x55, 0x81, 0x3a, 0xbd, 0xb7, 0xce, 0xcd, 0x67, 0xa1, 0xaf, 0x5c, ++ 0x3b, 0x55, 0xe1, 0xbf, 0x31, 0x2b, 0x78, 0x36, 0x86, 0xb9, 0x91, 0x14, ++ 0x7c, 0xe4, 0x94, 0x83, 0x4d, 0x5a, 0xe7, 0xe3, 0x4a, 0x8b, 0xec, 0x53, ++ 0x51, 0x75, 0x9b, 0xde, 0x8f, 0x27, 0x4d, 0x23, 0xd9, 0xa2, 0x96, 0xf9, ++ 0xdb, 0xb2, 0x45, 0xd9, 0x49, 0xc6, 0x81, 0x96, 0x3b, 0xeb, 0x2d, 0x43, ++ 0xcd, 0x2a, 0xbd, 0xad, 0xcc, 0xab, 0xf5, 0xff, 0x29, 0x6b, 0x8f, 0x4d, ++ 0xd9, 0x5c, 0xe0, 0x03, 0x83, 0xf9, 0xf7, 0x11, 0x91, 0x97, 0x2e, 0xf4, ++ 0xa0, 0xc7, 0xb0, 0x79, 0xc4, 0x59, 0x7b, 0x3a, 0xa1, 0x45, 0x1e, 0x57, ++ 0x29, 0xd9, 0xb7, 0x18, 0xdf, 0x0b, 0x3d, 0x3a, 0xcb, 0x3c, 0xd8, 0x9a, ++ 0xf5, 0xe0, 0x2a, 0xd7, 0x97, 0xd3, 0x94, 0x79, 0x00, 0x65, 0xe3, 0xce, ++ 0xda, 0x9d, 0xa6, 0xd6, 0x7f, 0xd6, 0x9b, 0xfa, 0xef, 0x35, 0xd4, 0xdb, ++ 0x06, 0xa5, 0xf5, 0x9c, 0x57, 0x03, 0x38, 0xcd, 0x35, 0x7c, 0x3f, 0xa1, ++ 0xc5, 0xbf, 0xab, 0xb4, 0xf6, 0x6f, 0xd1, 0x9f, 0xbd, 0x56, 0x90, 0xf3, ++ 0xd4, 0xe2, 0xd3, 0x90, 0xf7, 0x13, 0x51, 0x9c, 0x35, 0x53, 0x81, 0x8d, ++ 0x75, 0x0d, 0xe4, 0x83, 0xcb, 0x98, 0x67, 0x75, 0x77, 0x2f, 0xc7, 0x81, ++ 0x6c, 0x29, 0x31, 0x30, 0xee, 0xf6, 0x22, 0x3c, 0x23, 0x15, 0x6a, 0x26, ++ 0x1d, 0x33, 0x5b, 0xf1, 0x5f, 0x90, 0x73, 0xf1, 0xee, 0x00, 0x2a, 0xc6, ++ 0x7f, 0xe9, 0x54, 0xea, 0x7a, 0xf3, 0x88, 0xe2, 0xb8, 0x8f, 0x2d, 0xa3, ++ 0x8e, 0xf9, 0x1c, 0x7d, 0xf4, 0x01, 0xe2, 0xd6, 0x6d, 0x23, 0x11, 0x3e, ++ 0x5f, 0x89, 0x6b, 0xc7, 0xa5, 0x5f, 0x78, 0x65, 0xa1, 0x5f, 0xa8, 0xe8, ++ 0x07, 0xf4, 0xa3, 0xe9, 0x0a, 0xa4, 0x38, 0xc6, 0xbb, 0xe9, 0x0a, 0x1c, ++ 0xa0, 0xff, 0x96, 0xeb, 0xf4, 0x2f, 0xc6, 0x7d, 0xca, 0xe5, 0x04, 0x7f, ++ 0x4b, 0x0e, 0x25, 0xc7, 0x37, 0xad, 0xe8, 0x8c, 0x5a, 0xe4, 0xbe, 0x2f, ++ 0x66, 0xbc, 0x1c, 0x70, 0x7b, 0xd3, 0x61, 0xce, 0xaf, 0x12, 0x27, 0xc6, ++ 0xa4, 0x5e, 0x6c, 0xb9, 0xde, 0x5f, 0xd8, 0xcf, 0xf0, 0x36, 0xf9, 0xdb, ++ 0xda, 0x71, 0xe5, 0xee, 0xf7, 0xf8, 0x64, 0xd5, 0xa0, 0x56, 0x83, 0xeb, ++ 0x71, 0x34, 0x24, 0xfd, 0xa2, 0xff, 0x80, 0x43, 0xa1, 0x06, 0x1c, 0xe4, ++ 0xbc, 0xde, 0x4b, 0xff, 0x31, 0xeb, 0xac, 0xa8, 0xf0, 0x2f, 0x5c, 0x35, ++ 0x5e, 0xc2, 0x31, 0xd7, 0x62, 0x83, 0xb9, 0x11, 0xaf, 0x84, 0x84, 0x6f, ++ 0xfb, 0x79, 0x8f, 0x0f, 0xc3, 0xd3, 0x21, 0xf7, 0xdd, 0xce, 0xc1, 0xcf, ++ 0xcd, 0xed, 0x0f, 0xcd, 0x29, 0x1f, 0xc3, 0xff, 0xf6, 0x9c, 0xfc, 0xe4, ++ 0x19, 0x3a, 0x39, 0xc7, 0x49, 0x7c, 0x44, 0xd9, 0xa9, 0xe9, 0xbc, 0xcc, ++ 0xd1, 0x6c, 0x5e, 0xee, 0x41, 0x3b, 0xd6, 0x5f, 0xe3, 0x15, 0xf9, 0x21, ++ 0xd9, 0x7f, 0xf4, 0xef, 0x1c, 0x83, 0xcc, 0x71, 0x9c, 0x75, 0xb9, 0x59, ++ 0x87, 0xd6, 0x10, 0xed, 0x65, 0xcb, 0x18, 0x1a, 0x6b, 0x60, 0x79, 0x36, ++ 0x82, 0x95, 0x23, 0xce, 0x40, 0xc4, 0x92, 0xf3, 0x8e, 0x53, 0xb5, 0x46, ++ 0x8f, 0xbc, 0xce, 0xb8, 0x1d, 0xca, 0xfa, 0xa9, 0x83, 0x61, 0x9c, 0x48, ++ 0xd7, 0x13, 0x7f, 0x3d, 0x88, 0xb2, 0xc6, 0x3c, 0xe3, 0x1d, 0xc6, 0x4c, ++ 0xfa, 0x79, 0xc6, 0x82, 0x1f, 0xc3, 0xd9, 0x0a, 0x35, 0x9d, 0xfe, 0xee, ++ 0x22, 0xc1, 0xb7, 0x21, 0xd6, 0x13, 0x0d, 0x23, 0x32, 0x57, 0x67, 0xa0, ++ 0x92, 0x72, 0x1e, 0xa4, 0x9c, 0xe9, 0xd5, 0x7a, 0xe7, 0x90, 0x12, 0x9d, ++ 0x85, 0x70, 0x38, 0x7b, 0x9a, 0xfc, 0x42, 0xf4, 0xb6, 0xb0, 0x48, 0xfa, ++ 0xf8, 0x07, 0x59, 0xa7, 0xbf, 0x52, 0x90, 0xf3, 0x50, 0x76, 0x01, 0xd3, ++ 0x69, 0xc7, 0xfd, 0x3e, 0xc4, 0x5c, 0x35, 0xcc, 0xba, 0x35, 0x93, 0x0e, ++ 0x63, 0x24, 0x5d, 0xdf, 0x39, 0xa2, 0x7c, 0x85, 0x9e, 0x7c, 0xb7, 0xec, ++ 0x53, 0x77, 0xef, 0x19, 0xe4, 0xb3, 0x83, 0x17, 0xbf, 0x8b, 0x8e, 0xf2, ++ 0x7b, 0x26, 0xf2, 0xef, 0x6d, 0xca, 0x68, 0x3b, 0xa9, 0xff, 0x75, 0xce, ++ 0xa5, 0x44, 0xf6, 0xa1, 0xe1, 0xe4, 0xd8, 0x5a, 0x0c, 0x99, 0x3f, 0xc2, ++ 0x2e, 0xae, 0x7b, 0x98, 0xfa, 0x1c, 0xb7, 0x65, 0x6f, 0x44, 0x9c, 0xd8, ++ 0x23, 0xef, 0x37, 0x9f, 0xb2, 0x8e, 0x93, 0xeb, 0x1d, 0x66, 0xcc, 0xdc, ++ 0x9e, 0xa8, 0x6f, 0x7f, 0x89, 0x7e, 0x97, 0xfc, 0x9a, 0xec, 0x3f, 0xf0, ++ 0x61, 0x64, 0xe2, 0x5e, 0x4c, 0x55, 0xd7, 0x9f, 0x7f, 0x8a, 0x98, 0x70, ++ 0x94, 0x38, 0xe5, 0x23, 0x26, 0x54, 0x4d, 0x78, 0x0a, 0xef, 0xd3, 0x4d, ++ 0xfe, 0xae, 0x5f, 0x98, 0xc1, 0xcf, 0xa9, 0x17, 0x99, 0x5f, 0x2c, 0x3e, ++ 0x03, 0xb9, 0x37, 0xdf, 0x3b, 0xd6, 0x67, 0x7a, 0x70, 0xe6, 0xca, 0x7c, ++ 0xef, 0xce, 0xcb, 0x1c, 0xbe, 0x3b, 0x5d, 0x1f, 0x1a, 0x12, 0xd9, 0x1d, ++ 0x5a, 0x24, 0x45, 0x5b, 0x1d, 0x72, 0xb9, 0xfd, 0xb3, 0x56, 0x2c, 0x23, ++ 0xfb, 0x11, 0x2b, 0xe1, 0xa3, 0xef, 0x0f, 0x99, 0xb2, 0x5f, 0x24, 0x12, ++ 0xdc, 0x44, 0x1b, 0x0e, 0xd9, 0xf5, 0xcd, 0x31, 0xb5, 0x13, 0x67, 0x0a, ++ 0x18, 0xeb, 0xe3, 0xbd, 0xc3, 0x69, 0xad, 0xf3, 0x41, 0xd4, 0xb7, 0xef, ++ 0xc5, 0xd7, 0x91, 0xac, 0xae, 0xef, 0x1a, 0x43, 0xcc, 0xbc, 0x03, 0xc2, ++ 0xeb, 0xf2, 0xb2, 0x6a, 0x33, 0x04, 0xf5, 0xc5, 0x9f, 0x3a, 0xcb, 0xf5, ++ 0x87, 0x30, 0x46, 0x4e, 0x5a, 0xd7, 0xa8, 0x2f, 0x7c, 0xaf, 0x70, 0x2d, ++ 0xff, 0x2e, 0x4e, 0xfc, 0xa5, 0x82, 0x3a, 0x28, 0x83, 0x6f, 0x31, 0xc7, ++ 0x13, 0x5d, 0x64, 0x65, 0x8e, 0xa7, 0x71, 0x0f, 0xfd, 0x6d, 0x2c, 0xab, ++ 0x60, 0xd6, 0x9e, 0x46, 0xaf, 0xe4, 0x2f, 0x3e, 0xd3, 0x92, 0x0e, 0x91, ++ 0x67, 0x44, 0xc8, 0x3b, 0x62, 0xd1, 0x41, 0xae, 0xaf, 0x85, 0x58, 0x30, ++ 0x4c, 0x0c, 0x49, 0x85, 0x42, 0x8c, 0xd7, 0x10, 0xcf, 0x2f, 0x73, 0xff, ++ 0xbf, 0x41, 0x6a, 0xaf, 0xba, 0x29, 0xd9, 0x13, 0x70, 0x00, 0xa7, 0xc7, ++ 0x72, 0x38, 0x9c, 0x48, 0x62, 0x4f, 0x35, 0xed, 0x67, 0x2f, 0x71, 0xfb, ++ 0x15, 0x52, 0xe3, 0x6d, 0x9e, 0xe8, 0x63, 0x6d, 0xe9, 0x60, 0x7d, 0xc2, ++ 0x53, 0x2b, 0xfb, 0x62, 0xa6, 0x59, 0xeb, 0x8d, 0xb1, 0x52, 0xbb, 0xc7, ++ 0xfc, 0x16, 0xcc, 0xc5, 0x82, 0x9d, 0x43, 0x78, 0x71, 0x4a, 0xf2, 0xdc, ++ 0x69, 0xd6, 0x24, 0xa2, 0x1f, 0x0f, 0x2a, 0x19, 0x6b, 0x0d, 0x6e, 0xef, ++ 0xaf, 0xfa, 0x2b, 0x2b, 0xa6, 0x8a, 0xdc, 0x4e, 0xea, 0xc4, 0x4a, 0x04, ++ 0xa9, 0xaf, 0x53, 0x89, 0x3c, 0xef, 0x92, 0xf7, 0xfb, 0x7e, 0x3d, 0xbf, ++ 0xce, 0x78, 0x46, 0x61, 0xa8, 0xe9, 0xf2, 0xf7, 0x58, 0xf2, 0xbf, 0x0e, ++ 0xc5, 0x77, 0x59, 0xc5, 0xbe, 0xfe, 0x77, 0x9d, 0x33, 0xb2, 0x87, 0xd3, ++ 0xd3, 0x5e, 0x21, 0x7b, 0x1f, 0xa7, 0x2e, 0xea, 0x57, 0x74, 0x3a, 0xef, ++ 0xe4, 0xf7, 0xad, 0x17, 0xdf, 0x79, 0x6b, 0xbd, 0xef, 0xaa, 0x7a, 0xe6, ++ 0x13, 0xfa, 0x55, 0xb5, 0x0f, 0x83, 0x0d, 0xe8, 0x5a, 0x6e, 0xf9, 0x3a, ++ 0x3e, 0xb1, 0xd7, 0x92, 0x2b, 0xbf, 0xe7, 0xe0, 0xca, 0x16, 0x78, 0x75, ++ 0x39, 0x3f, 0xe5, 0x24, 0x43, 0xf2, 0x7d, 0xbe, 0x42, 0xe2, 0xe1, 0xa7, ++ 0x76, 0xce, 0x59, 0xb1, 0x24, 0xcf, 0x15, 0x7f, 0x99, 0x96, 0x77, 0x8b, ++ 0x29, 0x87, 0x35, 0xfe, 0xc2, 0x3b, 0xde, 0x3e, 0xfc, 0x23, 0xf9, 0xe9, ++ 0x5b, 0x63, 0x3e, 0x04, 0x75, 0x59, 0xcb, 0x5a, 0x54, 0xad, 0x32, 0x92, ++ 0xef, 0x11, 0x17, 0x17, 0xa6, 0x8a, 0x7e, 0x51, 0xfd, 0x95, 0x95, 0x53, ++ 0x8a, 0xb2, 0x2a, 0x51, 0xca, 0x75, 0xfe, 0xcc, 0xf4, 0x22, 0x5a, 0xa8, ++ 0xaf, 0xbc, 0x9c, 0xa7, 0xec, 0x33, 0x11, 0x0e, 0x1c, 0xcb, 0x1c, 0xaf, ++ 0xc8, 0xf7, 0xdd, 0x42, 0xc4, 0xd1, 0x61, 0x1c, 0x4a, 0xd7, 0xc7, 0xcf, ++ 0xc9, 0xbe, 0x27, 0xd6, 0x7a, 0x67, 0x30, 0x8c, 0xf1, 0x74, 0x11, 0x43, ++ 0x23, 0xf2, 0xff, 0x03, 0xd2, 0xcf, 0x72, 0x31, 0x32, 0xea, 0xd1, 0x52, ++ 0x51, 0xcf, 0x75, 0x15, 0xc2, 0x33, 0x06, 0xb3, 0xb1, 0x48, 0x19, 0xc9, ++ 0xc0, 0xed, 0x66, 0xde, 0x3f, 0x6a, 0x67, 0x4a, 0x10, 0x5d, 0x2c, 0x79, ++ 0x59, 0x72, 0xb2, 0x8f, 0x39, 0x79, 0x09, 0x92, 0x4b, 0x7c, 0x78, 0x55, ++ 0x17, 0x7d, 0xbc, 0x59, 0xd4, 0x87, 0x39, 0x8f, 0xfd, 0x4e, 0xae, 0x5d, ++ 0x7c, 0xa9, 0x04, 0x07, 0x1a, 0xa6, 0x9d, 0xa9, 0xb0, 0xac, 0xdd, 0x8b, ++ 0xa3, 0xc4, 0x57, 0x5c, 0x19, 0x8b, 0x1c, 0x65, 0xce, 0x1e, 0xd2, 0x8b, ++ 0x3e, 0xfe, 0x8d, 0xc2, 0x3c, 0xf5, 0xce, 0x59, 0x7c, 0x97, 0xdf, 0x6b, ++ 0x23, 0x7b, 0x54, 0x7e, 0xbc, 0x15, 0x33, 0x9e, 0xca, 0x4b, 0x7d, 0xce, ++ 0x67, 0xc9, 0xc5, 0xe6, 0x78, 0x5d, 0x64, 0x85, 0xe8, 0x9f, 0x65, 0x52, ++ 0xb7, 0x86, 0xe0, 0xc6, 0x8b, 0xbc, 0xb3, 0x25, 0xc9, 0x19, 0x97, 0x3d, ++ 0x15, 0x5e, 0x1c, 0xb8, 0xb8, 0x47, 0x2d, 0x8f, 0x5f, 0xe5, 0x3c, 0xbf, ++ 0x29, 0xf1, 0xc2, 0xf5, 0x01, 0xfc, 0xce, 0x39, 0x13, 0x5e, 0x46, 0x4c, ++ 0x10, 0x9b, 0x3e, 0xef, 0x72, 0x52, 0x2f, 0xf9, 0x89, 0xe8, 0xac, 0x46, ++ 0xe2, 0xc0, 0xbe, 0xb8, 0x8e, 0x5c, 0x37, 0x3a, 0x64, 0x6f, 0x5d, 0x61, ++ 0x6f, 0x4e, 0x8c, 0x58, 0xf3, 0x25, 0x74, 0x49, 0xb1, 0x85, 0x65, 0xf4, ++ 0xaf, 0x06, 0xea, 0x20, 0x14, 0xdc, 0x32, 0x29, 0xef, 0x5b, 0x7c, 0x38, ++ 0x30, 0x12, 0x33, 0xef, 0x22, 0x97, 0x3c, 0x34, 0xe2, 0x38, 0xaf, 0x99, ++ 0xd8, 0x1e, 0x64, 0x7e, 0x7f, 0x92, 0x7c, 0x82, 0x7c, 0x23, 0x5a, 0xa6, ++ 0xea, 0x23, 0xd7, 0x30, 0xd7, 0x0f, 0x11, 0x33, 0x1e, 0x9d, 0x03, 0x8e, ++ 0xce, 0x95, 0xc3, 0x1e, 0x97, 0x77, 0xaf, 0xe5, 0x18, 0x79, 0xac, 0x81, ++ 0x73, 0x5f, 0x4c, 0x39, 0x7e, 0x2c, 0x3a, 0xde, 0x8c, 0xf2, 0x47, 0x14, ++ 0x36, 0x19, 0xcd, 0x08, 0x1c, 0xaf, 0x64, 0xfe, 0xf5, 0xe3, 0x6c, 0x13, ++ 0x6d, 0xfc, 0x58, 0x71, 0x1d, 0x82, 0x63, 0x3e, 0x3c, 0x30, 0xa1, 0xc3, ++ 0xa6, 0xff, 0xce, 0xd9, 0xf2, 0xce, 0xbd, 0xc2, 0xc5, 0xd2, 0x85, 0xc2, ++ 0x5e, 0x54, 0xe2, 0x5a, 0xe4, 0x84, 0xaa, 0xc4, 0x87, 0xe3, 0xb9, 0x2b, ++ 0xcb, 0xe0, 0xfc, 0x74, 0xb9, 0x65, 0x74, 0xee, 0xa2, 0xff, 0xaf, 0x5c, ++ 0x11, 0x61, 0x9d, 0xe3, 0x38, 0x9f, 0xac, 0x91, 0x5a, 0xfb, 0x17, 0xac, ++ 0xb5, 0x8b, 0xb5, 0x95, 0xde, 0x73, 0x9f, 0x4a, 0x6d, 0x0c, 0xc2, 0xf9, ++ 0xb8, 0xcc, 0x72, 0x7e, 0x53, 0x62, 0x19, 0x7c, 0x3e, 0x4a, 0x5d, 0x39, ++ 0xce, 0xdb, 0x4d, 0x8e, 0x93, 0x69, 0x8a, 0x75, 0x86, 0xbc, 0x21, 0x1c, ++ 0xaf, 0x93, 0xf7, 0xa3, 0x1e, 0x7c, 0x68, 0xe8, 0x91, 0x5d, 0x90, 0x7d, ++ 0x0e, 0xc4, 0xfb, 0x25, 0x5a, 0x52, 0xf6, 0x1a, 0xb5, 0xd9, 0x8b, 0xf1, ++ 0xe4, 0xec, 0x1a, 0x74, 0x95, 0xc0, 0xed, 0xd1, 0x3b, 0x26, 0x5e, 0x5f, ++ 0x0e, 0xc9, 0xe1, 0x46, 0xf3, 0x7d, 0xac, 0x29, 0x67, 0xb3, 0x07, 0x70, ++ 0xf7, 0x38, 0xfc, 0x7e, 0xd6, 0xe0, 0xfe, 0x71, 0xe7, 0x97, 0x11, 0x2b, ++ 0x47, 0x8c, 0x74, 0x9c, 0xf2, 0x35, 0xf5, 0x91, 0xa0, 0x5b, 0xc3, 0x9c, ++ 0x94, 0x9a, 0xa0, 0xe7, 0x43, 0x54, 0xe3, 0xc4, 0x74, 0xf2, 0x4a, 0x2f, ++ 0x8c, 0xb6, 0x63, 0x2a, 0x84, 0x1f, 0x73, 0x8d, 0x4f, 0x64, 0x85, 0xb3, ++ 0xfc, 0xbd, 0xb5, 0x79, 0x7c, 0x29, 0x7e, 0x3a, 0x1b, 0xc6, 0x09, 0x5b, ++ 0x27, 0x67, 0x82, 0x5a, 0x64, 0x39, 0x55, 0x55, 0x9c, 0xeb, 0x22, 0xaf, ++ 0x17, 0x1b, 0x13, 0xb2, 0x47, 0x4f, 0xef, 0xa9, 0x50, 0x58, 0x5a, 0x06, ++ 0xfd, 0xfc, 0x7e, 0xa0, 0x37, 0x60, 0x19, 0x0b, 0xc7, 0x94, 0xd1, 0xf9, ++ 0x81, 0x37, 0x8c, 0x1f, 0x13, 0x8b, 0xbe, 0x9f, 0x95, 0xbd, 0x69, 0xc4, ++ 0x1b, 0xe6, 0xce, 0x34, 0x71, 0xcd, 0x53, 0x5b, 0x89, 0x83, 0x8c, 0x9d, ++ 0x93, 0x66, 0x29, 0xf1, 0x4a, 0xf6, 0xaa, 0x09, 0xd6, 0xe7, 0xac, 0xe3, ++ 0xe4, 0xed, 0x4f, 0xe9, 0xf9, 0x3e, 0x82, 0x39, 0x13, 0xb9, 0xec, 0x3d, ++ 0x77, 0x98, 0x18, 0x5f, 0xdf, 0x1e, 0x51, 0x2f, 0x3b, 0xc9, 0xaf, 0x29, ++ 0xc1, 0x32, 0xfa, 0xa5, 0xac, 0x95, 0xb1, 0x3d, 0x51, 0xcc, 0x2f, 0xac, ++ 0x7b, 0x43, 0x5a, 0x7b, 0xaa, 0xe0, 0x8f, 0x8b, 0x88, 0x4f, 0x0f, 0x92, ++ 0x23, 0x94, 0x8d, 0x4b, 0x5e, 0x21, 0x07, 0x57, 0x6b, 0xc9, 0x8b, 0x85, ++ 0x43, 0xf8, 0xb1, 0x37, 0x24, 0xbe, 0x11, 0xe2, 0xfa, 0x82, 0x3e, 0xd9, ++ 0x7b, 0xf6, 0x64, 0x56, 0xf2, 0xba, 0xe0, 0x42, 0x71, 0xbc, 0x08, 0x6a, ++ 0xdc, 0xfd, 0xb9, 0xcf, 0x5a, 0x1f, 0x8f, 0x84, 0x38, 0xb6, 0x33, 0xe0, ++ 0x61, 0x5d, 0xef, 0xa7, 0x7f, 0xdd, 0xda, 0xa4, 0xf7, 0xac, 0xf5, 0x6a, ++ 0xbd, 0xe7, 0x55, 0xac, 0x6b, 0x5e, 0x69, 0xcd, 0x87, 0xd4, 0xe5, 0x72, ++ 0xfe, 0xbe, 0x52, 0x7a, 0xfe, 0xc2, 0x11, 0x1e, 0x70, 0xd7, 0xf4, 0xa6, ++ 0xbb, 0x3f, 0xc7, 0x43, 0x6c, 0x6c, 0x49, 0x57, 0xe2, 0xec, 0x18, 0x74, ++ 0x46, 0x30, 0x5e, 0xe4, 0x3c, 0xba, 0x42, 0x46, 0xb2, 0x15, 0x12, 0x0b, ++ 0x5a, 0x97, 0xf0, 0xa9, 0x45, 0xc4, 0xe7, 0xe9, 0x31, 0xc9, 0x37, 0x4a, ++ 0xb8, 0x4a, 0xaa, 0xca, 0xea, 0xc5, 0x47, 0xab, 0x81, 0x97, 0x47, 0xf2, ++ 0x7b, 0x1b, 0x3a, 0xed, 0x0b, 0x0e, 0xca, 0xf2, 0xfb, 0x46, 0xee, 0x73, ++ 0xf7, 0x83, 0x88, 0xfc, 0x3e, 0x77, 0xaf, 0x6f, 0x25, 0xcf, 0xb1, 0xfe, ++ 0xee, 0x27, 0xf7, 0x6c, 0xce, 0xe6, 0xf7, 0xfa, 0x9a, 0x1f, 0xd3, 0xf7, ++ 0x8f, 0x91, 0xb7, 0x1e, 0x44, 0x7e, 0x6f, 0x43, 0x5d, 0x61, 0xbf, 0x47, ++ 0x2c, 0xd3, 0xa6, 0xb6, 0xb8, 0xfb, 0xc7, 0x7e, 0xc1, 0x78, 0x6b, 0x55, ++ 0x9b, 0x66, 0x37, 0xa8, 0xcd, 0xb3, 0x5b, 0xd5, 0xce, 0xac, 0xf4, 0x06, ++ 0x7e, 0x6e, 0xed, 0x1d, 0xdf, 0xa1, 0xb6, 0x4c, 0x77, 0x28, 0xf2, 0xdb, ++ 0x90, 0xdf, 0xea, 0x54, 0x5b, 0x67, 0xf3, 0x3d, 0xfc, 0x36, 0xd6, 0x71, ++ 0x5b, 0x6c, 0xf1, 0x87, 0x67, 0xad, 0xcd, 0x23, 0xf2, 0xff, 0x63, 0xe1, ++ 0xe0, 0xb6, 0x49, 0xad, 0x6b, 0xbd, 0x72, 0x9c, 0x6b, 0x12, 0xff, 0x47, ++ 0xec, 0xe1, 0x3c, 0x91, 0xd0, 0x89, 0x0b, 0x95, 0xe8, 0x66, 0x0d, 0x32, ++ 0x68, 0x5e, 0x4d, 0x7b, 0xb8, 0xbd, 0x44, 0xae, 0x49, 0xf6, 0xa4, 0x88, ++ 0xbf, 0x22, 0x55, 0xc6, 0x39, 0xfc, 0x2f, 0xce, 0x7f, 0x4f, 0x61, 0x5d, ++ 0x5b, 0x65, 0xcf, 0x46, 0x09, 0x52, 0xb2, 0x86, 0x0c, 0xd7, 0x7b, 0x78, ++ 0xe4, 0xd2, 0xba, 0x0a, 0xfb, 0x8b, 0xcd, 0x3d, 0x4a, 0xeb, 0x2f, 0xec, ++ 0x61, 0x5e, 0x38, 0xab, 0xb4, 0xdc, 0x20, 0x04, 0x17, 0xf2, 0xeb, 0xba, ++ 0xb6, 0xb0, 0xae, 0x95, 0x5c, 0xd7, 0x26, 0x97, 0xbb, 0xff, 0xc2, 0x9a, ++ 0x1b, 0x69, 0x55, 0x6d, 0xb3, 0xd2, 0x3b, 0x95, 0xb5, 0xc9, 0x3a, 0xc6, ++ 0x9d, 0x72, 0x5d, 0xde, 0xa1, 0xc9, 0x3e, 0x3e, 0xd9, 0x4b, 0x27, 0x7b, ++ 0x2a, 0x8a, 0xeb, 0x92, 0x9c, 0xbe, 0x38, 0xb8, 0x61, 0x32, 0x14, 0x5c, ++ 0x3f, 0xe9, 0x38, 0xaf, 0x98, 0x0d, 0x41, 0x59, 0xcb, 0x09, 0x53, 0xd6, ++ 0x22, 0x7b, 0x73, 0x8a, 0xeb, 0xf9, 0xd3, 0xc2, 0x7a, 0xc4, 0x56, 0x97, ++ 0xec, 0x54, 0xfc, 0xbf, 0xc3, 0x77, 0xd2, 0xf9, 0x7d, 0x3b, 0xc5, 0xf5, ++ 0x04, 0xad, 0xe2, 0x7e, 0xbe, 0x5e, 0xbc, 0xcc, 0xeb, 0xbf, 0x4a, 0x17, ++ 0xd7, 0xe5, 0xc5, 0xcc, 0xb4, 0xe8, 0xbf, 0x57, 0xfe, 0xef, 0x90, 0x38, ++ 0x12, 0x33, 0x87, 0x2e, 0xee, 0xd1, 0xd6, 0xfa, 0xaf, 0xf2, 0xd6, 0xe7, ++ 0xce, 0x42, 0x7a, 0x6c, 0x46, 0x72, 0x9e, 0x98, 0x76, 0x22, 0xfb, 0x79, ++ 0xfb, 0x35, 0x64, 0xca, 0x95, 0xec, 0x67, 0xf3, 0x31, 0x0f, 0x0d, 0x8f, ++ 0xc9, 0xbe, 0x1d, 0x85, 0xc7, 0xa7, 0x81, 0x69, 0x9b, 0xc3, 0x5a, 0x03, ++ 0x78, 0xd4, 0x94, 0x9e, 0x90, 0xde, 0xbf, 0x0b, 0xb2, 0xaf, 0xcd, 0xa0, ++ 0x9f, 0xc2, 0xac, 0xe4, 0xda, 0x6f, 0xcc, 0xca, 0x9e, 0x9d, 0x0e, 0xea, ++ 0x40, 0xd6, 0x2e, 0x3e, 0x50, 0xb4, 0xbd, 0xec, 0x2b, 0x4c, 0x51, 0x3f, ++ 0xa2, 0x9b, 0xe2, 0xfe, 0xc2, 0x08, 0x6d, 0x7d, 0xb9, 0x4e, 0xba, 0x5c, ++ 0x9d, 0x3c, 0x61, 0x8a, 0xbf, 0x12, 0x7d, 0xe8, 0xab, 0x33, 0xe4, 0x12, ++ 0x43, 0x66, 0x89, 0xcb, 0xdb, 0x24, 0xa6, 0x0e, 0xd9, 0x15, 0xf4, 0xf9, ++ 0x05, 0x2c, 0x64, 0x4e, 0xe2, 0xe5, 0x4b, 0xff, 0x83, 0x27, 0x35, 0x4f, ++ 0xf3, 0x66, 0xf7, 0x3d, 0xdd, 0x2d, 0xd7, 0x5f, 0x6d, 0x08, 0x0e, 0x85, ++ 0x56, 0xc8, 0x7b, 0x3b, 0xfa, 0xc1, 0x9f, 0xbe, 0xaf, 0x4b, 0x0f, 0x09, ++ 0x6b, 0x4e, 0xe9, 0xa2, 0x9b, 0xfe, 0xa6, 0xe3, 0xba, 0xac, 0x6b, 0xca, ++ 0x1c, 0x76, 0xff, 0x27, 0xf4, 0xe8, 0x9a, 0xdd, 0xba, 0xc4, 0xce, 0xbe, ++ 0xd5, 0x2d, 0x2e, 0x26, 0x8c, 0x59, 0xd7, 0xb8, 0x3a, 0x48, 0x5b, 0x57, ++ 0xbb, 0xc7, 0x43, 0xe4, 0x13, 0x72, 0x3c, 0x62, 0xe5, 0x75, 0x33, 0x43, ++ 0x8e, 0x25, 0xc7, 0xbf, 0xb6, 0xf2, 0x7b, 0xe5, 0x8f, 0x5a, 0xba, 0x7b, ++ 0x3c, 0xc1, 0x1c, 0x27, 0xc7, 0x29, 0xeb, 0xaa, 0xcb, 0xfe, 0x37, 0x10, ++ 0xf8, 0x7f, 0x3d, 0xd8, 0xab, 0x1c, 0x3c, 0x3b, 0x00, 0x00, 0x00 }; + + static const u32 bnx2_TXP_b06FwData[(0x0/4) + 1] = { 0x0 }; + static const u32 bnx2_TXP_b06FwRodata[(0x0/4) + 1] = { 0x0 }; + + static struct fw_info bnx2_txp_fw_06 = { +- /* Firmware version: 4.0.5 */ +- .ver_major = 0x4, +- .ver_minor = 0x0, +- .ver_fix = 0x5, +- +- .start_addr = 0x08000098, ++ /* Firmware version: 5.0.0g */ ++ .ver_major = 0x5, ++ .ver_minor = 0x0, ++ .ver_fix = 0x0, ++ ++ .start_addr = 0x080000a8, + + .text_addr = 0x08000000, +- .text_len = 0x3ad8, ++ .text_len = 0x3b38, + .text_index = 0x0, + .gz_text = bnx2_TXP_b06FwText, + .gz_text_len = sizeof(bnx2_TXP_b06FwText), +@@ -4582,11 +4486,11 @@ + .data_index = 0x0, + .data = bnx2_TXP_b06FwData, + +- .sbss_addr = 0x08003b00, ++ .sbss_addr = 0x08003b60, + .sbss_len = 0x68, + .sbss_index = 0x0, + +- .bss_addr = 0x08003b68, ++ .bss_addr = 0x08003bc8, + .bss_len = 0x14c, + .bss_index = 0x0, + +@@ -4611,3 +4515,4 @@ + .spad_base = BNX2_TXP_SCRATCH, + .mips_view_base = 0x8000000, + }; ++ +diff -r 19900e8f54d8 drivers/net/bnx2_fw2.h +--- a/drivers/net/bnx2_fw2.h Mon Jun 15 16:27:59 2009 +0100 ++++ b/drivers/net/bnx2_fw2.h Mon Jun 15 16:38:18 2009 +0100 +@@ -15,848 +15,853 @@ + */ + + static u8 bnx2_COM_b09FwText[] = { +- 0xcd, 0x7c, 0x7f, 0x6c, 0x5c, 0xd7, 0x75, 0xe6, 0x79, 0x6f, 0xde, 0x90, +- 0x43, 0x8a, 0xa2, 0x1e, 0x99, 0x31, 0x33, 0x8e, 0xd8, 0x7a, 0x86, 0xf3, +- 0x48, 0xd1, 0x21, 0xe3, 0x3e, 0x33, 0x63, 0x99, 0x76, 0xa6, 0xd6, 0x64, +- 0x66, 0x28, 0x2b, 0x0e, 0x69, 0xd0, 0x8e, 0x82, 0x4d, 0x01, 0x03, 0xe5, +- 0x0e, 0xa9, 0x54, 0xd9, 0xf5, 0x22, 0xda, 0x34, 0x45, 0x8a, 0xa2, 0x88, +- 0x26, 0x24, 0xe5, 0x2a, 0xcd, 0x88, 0x1c, 0xcb, 0x34, 0x1b, 0x14, 0x5e, +- 0x64, 0x3c, 0xa4, 0x14, 0xb7, 0x1d, 0x89, 0x72, 0xe2, 0x2d, 0xbc, 0x58, +- 0x07, 0x66, 0xa9, 0x1f, 0x4e, 0x83, 0x14, 0xf0, 0x2e, 0xbc, 0x68, 0x60, +- 0xa4, 0x80, 0x20, 0xbb, 0x8d, 0xb3, 0xc8, 0x62, 0x83, 0xdd, 0x00, 0x71, +- 0x02, 0x27, 0x6f, 0xbf, 0xef, 0xde, 0xfb, 0xc8, 0xd1, 0x88, 0x76, 0xd2, +- 0xfc, 0xb5, 0x04, 0x06, 0xf7, 0xfd, 0xb8, 0x3f, 0xce, 0x3d, 0xf7, 0xdc, +- 0x73, 0xbe, 0x73, 0xee, 0x79, 0x7c, 0x40, 0xa4, 0x53, 0xcc, 0xdf, 0x5e, +- 0xfc, 0x32, 0xff, 0xe1, 0xb3, 0xb3, 0x63, 0x77, 0x65, 0xee, 0xc2, 0xe5, +- 0x87, 0xed, 0xf7, 0x3b, 0x0e, 0x9f, 0x47, 0xf0, 0x8b, 0xe3, 0x37, 0x66, +- 0xae, 0x77, 0xfb, 0x73, 0xf1, 0x3b, 0x68, 0x89, 0xcc, 0xfc, 0x4f, 0x11, +- 0xab, 0xe5, 0x5d, 0xec, 0x5d, 0xda, 0xbc, 0xd7, 0x9f, 0xfd, 0x1b, 0xb4, +- 0xf9, 0xd7, 0xfe, 0x45, 0x34, 0xd9, 0x6a, 0xde, 0xfc, 0x49, 0xcc, 0xce, +- 0xce, 0x4c, 0xe6, 0x3d, 0x89, 0x45, 0xb2, 0x47, 0xa7, 0x66, 0x3d, 0x91, +- 0x5c, 0x63, 0x24, 0x59, 0x90, 0x5f, 0x04, 0xe5, 0xb8, 0x23, 0x7c, 0xfe, +- 0x5b, 0xd9, 0x77, 0xbe, 0xf6, 0xad, 0x7b, 0x53, 0x3f, 0xae, 0x45, 0x24, +- 0xe6, 0x66, 0xdf, 0x16, 0x77, 0x48, 0x62, 0xfd, 0x68, 0xf3, 0xcc, 0x81, +- 0x57, 0x6d, 0xe9, 0x0e, 0xfb, 0x72, 0x67, 0x22, 0x59, 0x99, 0x3e, 0x56, +- 0x39, 0x19, 0xd8, 0x9e, 0x94, 0x9d, 0xac, 0x37, 0x5c, 0x97, 0xae, 0xf1, +- 0x73, 0x99, 0x7b, 0x05, 0xf7, 0xd3, 0xc7, 0x1a, 0x31, 0x99, 0x6f, 0x94, +- 0xbb, 0x6c, 0xcf, 0x43, 0x29, 0xb1, 0xb6, 0xec, 0x62, 0xec, 0x9a, 0xc7, +- 0xb1, 0xbf, 0x8a, 0xb1, 0xf7, 0x4b, 0xd4, 0x0b, 0x82, 0x73, 0x18, 0xfb, +- 0x70, 0xe3, 0x17, 0xc1, 0xb3, 0x8e, 0x1e, 0xd7, 0xce, 0x9e, 0x88, 0xb0, +- 0xb4, 0xb2, 0xb5, 0xc9, 0x81, 0x06, 0xef, 0x8b, 0xed, 0x9a, 0x4e, 0xbf, +- 0x13, 0x74, 0xc6, 0x9c, 0xec, 0x89, 0xce, 0x45, 0x94, 0xd1, 0x6c, 0x7c, +- 0xec, 0x9c, 0xaa, 0xb7, 0x6e, 0xea, 0x3d, 0x1e, 0xd5, 0xed, 0xde, 0x9a, +- 0x1c, 0x6a, 0xb0, 0xfc, 0xc9, 0xe4, 0xa0, 0x2a, 0xdf, 0x99, 0x4c, 0xab, +- 0x52, 0xa6, 0x06, 0x54, 0xe9, 0x4c, 0x79, 0xaa, 0x7c, 0xc6, 0x3c, 0x7f, +- 0x6e, 0x32, 0xa9, 0xca, 0x86, 0x29, 0x2f, 0x99, 0xf2, 0x05, 0x53, 0xbe, +- 0x68, 0xca, 0x97, 0x4c, 0xb9, 0x69, 0xca, 0x2b, 0x93, 0xba, 0x9f, 0x6f, +- 0x9b, 0xfb, 0xef, 0x9a, 0xf2, 0x55, 0x53, 0xbe, 0x66, 0xca, 0xef, 0x99, +- 0xf2, 0xfb, 0x86, 0xae, 0xeb, 0xa6, 0x7c, 0xd3, 0x94, 0x3f, 0x32, 0xef, +- 0x7f, 0x6c, 0xe8, 0x7d, 0x1b, 0x74, 0xfd, 0x49, 0xd4, 0xc8, 0x2a, 0xe6, +- 0x9d, 0x94, 0xd9, 0x8a, 0x23, 0xf3, 0xcb, 0x11, 0x29, 0xa8, 0x35, 0xfc, +- 0xca, 0x5e, 0xe9, 0x74, 0x64, 0x61, 0x23, 0x26, 0xd7, 0x95, 0x88, 0xbe, +- 0x15, 0x7c, 0xeb, 0x80, 0x94, 0xed, 0xac, 0x2b, 0x97, 0x36, 0xe2, 0xf2, +- 0xf2, 0x86, 0x58, 0xd3, 0x99, 0x0e, 0xb1, 0xcf, 0x7e, 0x40, 0x72, 0xae, +- 0x25, 0x11, 0xc5, 0xd3, 0xa4, 0xe4, 0x2b, 0x7d, 0xb8, 0x4f, 0x25, 0x44, +- 0xae, 0xee, 0xd5, 0xeb, 0x17, 0x93, 0xc8, 0x2a, 0xd7, 0xe4, 0xfe, 0xa9, +- 0x6b, 0x2b, 0x09, 0x71, 0x96, 0x46, 0x31, 0x46, 0x97, 0x44, 0x57, 0xa5, +- 0x3f, 0x22, 0x83, 0x89, 0x4f, 0xa3, 0x46, 0xb1, 0xe1, 0xc8, 0x44, 0xc3, +- 0x12, 0xc7, 0x8b, 0x41, 0x3e, 0xba, 0xf0, 0x73, 0xf1, 0x8b, 0xe3, 0x97, +- 0xc0, 0xef, 0x47, 0xe8, 0xa7, 0x5f, 0x0a, 0x0d, 0xf6, 0x89, 0x71, 0x97, +- 0x31, 0xfe, 0x72, 0xca, 0x9d, 0x11, 0xd2, 0x95, 0x90, 0x6f, 0x1d, 0x20, +- 0x5d, 0x2e, 0xe9, 0x01, 0x6d, 0x31, 0x2b, 0xbf, 0x22, 0x27, 0x0a, 0xbe, +- 0x24, 0x6d, 0xaf, 0x53, 0x4a, 0xae, 0x95, 0x9c, 0x1b, 0xee, 0x95, 0xf2, +- 0x51, 0xbc, 0x5f, 0x96, 0x9c, 0x8d, 0xfe, 0x4b, 0xae, 0xcc, 0xe8, 0x77, +- 0x7c, 0xf6, 0x36, 0xf6, 0x6a, 0xca, 0xa5, 0xd0, 0xbe, 0xbc, 0xfc, 0xb7, +- 0xb8, 0x66, 0x7f, 0x3f, 0x77, 0x34, 0xdd, 0x3f, 0xc5, 0x3d, 0x9f, 0x0f, +- 0x99, 0x79, 0xf0, 0x9a, 0x75, 0xc3, 0x71, 0xc3, 0xf9, 0x72, 0xfc, 0x61, +- 0xcc, 0x99, 0x34, 0x84, 0x73, 0x96, 0x72, 0x14, 0xb4, 0xd4, 0x57, 0xba, +- 0xac, 0xb5, 0x95, 0x51, 0x79, 0x62, 0xf9, 0x01, 0xc9, 0xfb, 0x41, 0x30, +- 0xeb, 0x4b, 0xdc, 0x96, 0x41, 0xb7, 0x80, 0x0a, 0x5b, 0x0d, 0xb1, 0xea, +- 0x15, 0x89, 0xb5, 0x83, 0x2f, 0x3f, 0x58, 0x61, 0xdf, 0x0e, 0x9e, 0xf5, +- 0xa1, 0x7e, 0xb7, 0xb5, 0xbe, 0x02, 0xfa, 0xb3, 0xe4, 0x4f, 0x10, 0x2c, +- 0xfa, 0x83, 0x89, 0x39, 0x8c, 0x79, 0xb9, 0x31, 0x38, 0x7e, 0x43, 0x5c, +- 0xf4, 0xd9, 0x8b, 0x3a, 0xe4, 0x15, 0xfb, 0x62, 0x9f, 0xec, 0xaf, 0x0b, +- 0x6d, 0xe3, 0x78, 0x47, 0xba, 0x82, 0x20, 0xef, 0xbb, 0xbc, 0x97, 0x4d, +- 0xf0, 0x6f, 0x93, 0xfc, 0xeb, 0xec, 0x97, 0x57, 0x1a, 0x1c, 0x63, 0x37, +- 0xda, 0x47, 0xfe, 0x3f, 0xa4, 0x3d, 0x81, 0xfe, 0xe3, 0x28, 0xf7, 0x58, +- 0xf5, 0x6a, 0x80, 0xf1, 0x13, 0xb8, 0xde, 0x6d, 0x1e, 0xd7, 0xd5, 0xda, +- 0x5f, 0xc2, 0xda, 0xbb, 0xd9, 0xb8, 0x3c, 0xbf, 0xd1, 0x8f, 0x79, 0x24, +- 0xe4, 0x1b, 0x90, 0xcd, 0x9e, 0x83, 0x7b, 0x24, 0x0d, 0xd9, 0xe4, 0x9a, +- 0x8f, 0xad, 0xce, 0x49, 0x29, 0x9e, 0x1a, 0xa6, 0x1e, 0xcd, 0x8f, 0xed, +- 0xc3, 0x7c, 0xb5, 0xb6, 0x1a, 0x58, 0xca, 0xed, 0xb7, 0xe5, 0x90, 0xd8, +- 0x59, 0x8c, 0x9b, 0x19, 0x01, 0x2d, 0x11, 0xbc, 0x8b, 0x8b, 0xb7, 0x9a, +- 0xc3, 0xb3, 0x54, 0xa2, 0x04, 0x1a, 0xe7, 0x41, 0x63, 0x49, 0xca, 0x62, +- 0x5f, 0x7c, 0xce, 0x0a, 0xf7, 0x8a, 0xe6, 0xdd, 0xb0, 0xe9, 0x67, 0x5b, +- 0xce, 0x2d, 0x7b, 0xb5, 0xcb, 0x8a, 0xac, 0x8e, 0xca, 0xa9, 0x5d, 0x78, +- 0x56, 0x07, 0xcf, 0xec, 0xa5, 0x70, 0x1f, 0x38, 0xb8, 0xef, 0x43, 0xdd, +- 0x6e, 0xcb, 0x59, 0xbd, 0x95, 0x5f, 0x6b, 0x8d, 0x41, 0x7f, 0x0b, 0xfc, +- 0xb2, 0x57, 0x7b, 0x51, 0xe7, 0x56, 0x7e, 0xd5, 0xc1, 0x2f, 0x7b, 0x55, +- 0xf3, 0xaa, 0x0e, 0x5e, 0xd9, 0x4b, 0x71, 0x94, 0x7b, 0x2c, 0xfb, 0xac, +- 0xe6, 0x55, 0xdd, 0xec, 0x99, 0xf3, 0x4a, 0x5f, 0xe5, 0x40, 0xab, 0x25, +- 0x5a, 0x67, 0xe5, 0x84, 0xba, 0x29, 0x92, 0x2d, 0x62, 0xaf, 0xdb, 0xe0, +- 0x85, 0x23, 0xc5, 0x31, 0x4b, 0x66, 0xd5, 0xbb, 0xa2, 0xa4, 0x1b, 0x1f, +- 0x00, 0x23, 0x47, 0x86, 0x61, 0x29, 0xca, 0x6d, 0xd9, 0x17, 0xed, 0xad, +- 0x4a, 0x4c, 0x0a, 0x4e, 0x52, 0xbc, 0x25, 0xa5, 0xc7, 0x9b, 0xfa, 0x99, +- 0x41, 0x3f, 0xdf, 0x01, 0x3f, 0x2c, 0xe8, 0x56, 0xbe, 0x7b, 0x4c, 0xed, +- 0xfb, 0xf4, 0xaa, 0x23, 0x83, 0x4b, 0xac, 0x53, 0xb6, 0xaf, 0x34, 0xde, +- 0x09, 0x74, 0xbf, 0x8f, 0x71, 0x4c, 0xd7, 0xce, 0x2e, 0xda, 0x97, 0xd7, +- 0x4f, 0xdb, 0x57, 0x1b, 0xe8, 0xb7, 0xc1, 0xb5, 0xc0, 0x5a, 0x2d, 0x63, +- 0xad, 0x96, 0xb1, 0x6e, 0x66, 0x4f, 0xd7, 0xd4, 0xde, 0x4a, 0x9a, 0x75, +- 0x25, 0x0d, 0x5c, 0xdb, 0x04, 0xd6, 0x94, 0x6b, 0x2b, 0xd6, 0xab, 0x99, +- 0x3d, 0x12, 0x39, 0x1b, 0x51, 0x6b, 0xda, 0xb3, 0xfa, 0x91, 0xed, 0x35, +- 0x1d, 0x68, 0x5a, 0x53, 0xfb, 0x5d, 0xd6, 0xd4, 0xd9, 0x65, 0x4d, 0xb7, +- 0x1a, 0x3f, 0x31, 0x6b, 0xfa, 0x73, 0x31, 0xb2, 0xff, 0x9e, 0xfc, 0x1a, +- 0x00, 0xbf, 0xbc, 0x5f, 0x83, 0x5f, 0xce, 0xae, 0xfc, 0xea, 0xb3, 0x5b, +- 0xf9, 0x15, 0x01, 0xbf, 0xa2, 0xbf, 0x36, 0xbf, 0xc0, 0x87, 0x5d, 0x79, +- 0x15, 0x83, 0xde, 0x2b, 0x4b, 0x3e, 0x23, 0x92, 0xaf, 0x6a, 0x5d, 0x5d, +- 0x56, 0x3a, 0x9b, 0xba, 0x2a, 0xd4, 0xd9, 0xd4, 0xd7, 0x6a, 0x9f, 0x58, +- 0x85, 0x4a, 0x12, 0xba, 0xd4, 0x41, 0xf9, 0x1c, 0xca, 0x3d, 0xd6, 0x74, +- 0xb5, 0x1f, 0x76, 0x36, 0x10, 0x77, 0x2c, 0xb4, 0x97, 0xe5, 0x84, 0x8b, +- 0xb5, 0x71, 0xef, 0x8a, 0x8a, 0xf4, 0xa5, 0xc0, 0xa7, 0x14, 0xde, 0xa7, +- 0x12, 0x39, 0xc9, 0xda, 0x21, 0xae, 0xc9, 0x57, 0x3a, 0xde, 0xce, 0xa9, +- 0x2b, 0x3e, 0x67, 0xbb, 0x0c, 0x9e, 0x45, 0x65, 0x06, 0x76, 0xa0, 0xe8, +- 0x71, 0x3c, 0xf6, 0x9f, 0x9c, 0xe1, 0xb8, 0x85, 0x46, 0xa8, 0xb3, 0x25, +- 0x07, 0x1b, 0x8e, 0x77, 0xdc, 0xb7, 0xe3, 0x56, 0x41, 0xd9, 0xa0, 0x8c, +- 0x78, 0x8d, 0x66, 0xfb, 0xb2, 0x4d, 0x27, 0xf6, 0x73, 0x0e, 0x72, 0x4d, +- 0xda, 0x92, 0xd8, 0x7b, 0xc7, 0x22, 0xe1, 0xfa, 0x38, 0xd9, 0x71, 0x81, +- 0x5d, 0x96, 0xf9, 0x0a, 0xfb, 0xfb, 0x63, 0x2b, 0x72, 0x31, 0xec, 0x9f, +- 0x7c, 0x64, 0xdf, 0xba, 0xbf, 0xf9, 0xc6, 0x5b, 0x46, 0x37, 0x28, 0x5b, +- 0x85, 0xfe, 0xca, 0x4d, 0xfd, 0x95, 0xad, 0xc8, 0x92, 0xec, 0x53, 0xf6, +- 0xe0, 0x28, 0xf9, 0x77, 0x1a, 0xef, 0xae, 0x4b, 0x84, 0x32, 0xa3, 0xf6, +- 0x18, 0xf7, 0xfb, 0x97, 0x38, 0xdf, 0x26, 0xde, 0x4e, 0xc3, 0xc6, 0x71, +- 0x7f, 0x61, 0x8d, 0xe3, 0x7c, 0x7e, 0xc8, 0xd0, 0xe4, 0x48, 0x4e, 0xdd, +- 0x7f, 0x63, 0x4f, 0xa8, 0x3f, 0xb1, 0x9f, 0x41, 0xdb, 0x8b, 0x6a, 0x8e, +- 0x76, 0x36, 0x0b, 0xde, 0x34, 0xd3, 0xc8, 0x79, 0x67, 0xb1, 0xc6, 0xa1, +- 0x0e, 0x0b, 0xd7, 0x8a, 0xb8, 0xc6, 0xb1, 0x16, 0x2a, 0x5d, 0xb0, 0x8f, +- 0x31, 0x63, 0x83, 0xd9, 0x7e, 0x11, 0xed, 0xf9, 0x9c, 0x6d, 0xbb, 0x60, +- 0x8f, 0xd9, 0x7e, 0xd1, 0xb4, 0xdf, 0xb1, 0xcb, 0xdc, 0x2b, 0xb4, 0xc9, +- 0x57, 0x32, 0xc0, 0x42, 0x2b, 0xb6, 0x14, 0x7c, 0xe0, 0x1c, 0xbf, 0xdf, +- 0xec, 0x0b, 0x2d, 0x9b, 0x1f, 0x75, 0x2c, 0x69, 0xf7, 0x76, 0x93, 0xcd, +- 0x7f, 0xb0, 0xb5, 0xad, 0xdb, 0x91, 0xcd, 0x05, 0xe8, 0xa8, 0x53, 0x90, +- 0x95, 0xc5, 0xed, 0x7a, 0x94, 0x4b, 0x25, 0xa3, 0x90, 0xcd, 0xd4, 0x38, +- 0xa7, 0x79, 0xa5, 0xd1, 0x2c, 0xa3, 0x61, 0x1f, 0x31, 0x25, 0x07, 0x7a, +- 0x9c, 0xc5, 0xa6, 0x71, 0x16, 0x9b, 0xc6, 0x59, 0x32, 0xd8, 0x8e, 0xfd, +- 0x68, 0xbb, 0x7a, 0xfd, 0x26, 0x7b, 0xce, 0x35, 0xfb, 0x24, 0xf6, 0xa4, +- 0x96, 0x05, 0x60, 0x35, 0xbd, 0x06, 0x15, 0x57, 0xe6, 0x37, 0x2e, 0x84, +- 0x7b, 0xb5, 0xdc, 0x8e, 0xe7, 0x3f, 0xc4, 0xf3, 0xe1, 0x33, 0x2e, 0xec, +- 0x14, 0xb1, 0xda, 0x4b, 0x72, 0xae, 0x42, 0x19, 0x79, 0x11, 0x74, 0xa7, +- 0xfd, 0x36, 0x8b, 0x7c, 0x4d, 0x0d, 0x9f, 0x97, 0x54, 0x72, 0x5e, 0x46, +- 0x7c, 0x96, 0x4f, 0x88, 0xc2, 0x58, 0xa2, 0x31, 0xd0, 0x8b, 0x90, 0x3f, +- 0x91, 0x1f, 0x57, 0xda, 0xc5, 0x1e, 0xfb, 0x61, 0x40, 0x3b, 0x78, 0x7a, +- 0xa3, 0xb5, 0x1f, 0x91, 0xa1, 0x33, 0xaa, 0x1f, 0xf4, 0x91, 0xf6, 0xbf, +- 0xad, 0xfa, 0x0b, 0xfb, 0xc2, 0x3c, 0xc7, 0x5a, 0xfb, 0x73, 0xe4, 0xba, +- 0x6b, 0xa3, 0xbf, 0xb4, 0x99, 0x23, 0xaf, 0x21, 0x23, 0xae, 0x83, 0xf2, +- 0x61, 0x3b, 0x94, 0x19, 0x7b, 0xec, 0x3b, 0x41, 0x6e, 0x9a, 0x73, 0x2b, +- 0x99, 0x67, 0xff, 0xc3, 0xc8, 0x9b, 0x54, 0xed, 0x2c, 0x78, 0x96, 0x19, +- 0xc4, 0x78, 0xbc, 0x4f, 0x02, 0x1f, 0x49, 0x99, 0xf8, 0xac, 0x54, 0xf9, +- 0x65, 0x90, 0x73, 0x34, 0xa6, 0xd2, 0x6b, 0xcf, 0xf7, 0x96, 0x14, 0x50, +- 0x77, 0xc1, 0xe8, 0x83, 0x62, 0xe3, 0xba, 0xe2, 0xdf, 0xf3, 0x6a, 0x1f, +- 0xa5, 0x4e, 0x97, 0xa9, 0x37, 0x36, 0xdc, 0x08, 0xf7, 0xf8, 0x25, 0xff, +- 0xa5, 0x60, 0x61, 0x39, 0x95, 0x4c, 0xda, 0x83, 0x52, 0xaa, 0x0e, 0x96, +- 0x6d, 0x94, 0x27, 0x6a, 0x09, 0x39, 0x51, 0x61, 0x3f, 0xfb, 0x51, 0x07, +- 0x8a, 0xc8, 0xc6, 0x26, 0xef, 0xa3, 0xae, 0xe1, 0x98, 0x6f, 0x5b, 0x7a, +- 0x4c, 0xcc, 0xc1, 0xdb, 0xb4, 0xfe, 0x63, 0xe3, 0x8a, 0x55, 0xaa, 0x71, +- 0xfd, 0xf1, 0xbc, 0xd1, 0xac, 0x8f, 0x42, 0x5d, 0xb4, 0x83, 0xc5, 0x22, +- 0xd9, 0x45, 0xab, 0xb4, 0x22, 0x76, 0xde, 0x8f, 0x12, 0x0f, 0x26, 0x45, +- 0xee, 0x75, 0xf5, 0x3c, 0x3f, 0x19, 0xa1, 0x1e, 0x74, 0xbc, 0xd3, 0xe8, +- 0xbb, 0x53, 0x72, 0x0e, 0xd7, 0x9f, 0xd7, 0x12, 0x44, 0xb2, 0x1e, 0x6d, +- 0xa5, 0x13, 0xc9, 0x3a, 0xd8, 0x63, 0xac, 0xf3, 0x52, 0xc0, 0xbd, 0x90, +- 0xaf, 0x6a, 0x19, 0x29, 0xef, 0x60, 0x2f, 0xd0, 0x9b, 0x83, 0x8e, 0x11, +- 0x1b, 0x7b, 0xcc, 0x8d, 0x64, 0xf9, 0x7c, 0x1c, 0xd7, 0x9b, 0xa8, 0x4f, +- 0x1d, 0x0b, 0x4c, 0x5a, 0x53, 0xbc, 0xc3, 0x58, 0x39, 0xab, 0x58, 0x09, +- 0x79, 0xf2, 0x52, 0xf0, 0xe4, 0x72, 0x88, 0x11, 0x94, 0x6c, 0xc9, 0xc0, +- 0xd9, 0xa4, 0xd9, 0xd7, 0x5d, 0xdc, 0x73, 0xe4, 0x3f, 0x9e, 0xf9, 0xe6, +- 0x59, 0x7b, 0xd3, 0xb3, 0x70, 0xff, 0x7f, 0x09, 0xb4, 0xf5, 0x2b, 0xfe, +- 0xd8, 0xd9, 0x23, 0x56, 0x5e, 0xe1, 0x93, 0x20, 0x28, 0x78, 0x51, 0x29, +- 0x8d, 0xfe, 0x09, 0xe6, 0xca, 0x77, 0x65, 0x30, 0x9c, 0x76, 0x63, 0x78, +- 0x72, 0xd6, 0x4b, 0x29, 0xfb, 0x9f, 0xc7, 0xfe, 0xd3, 0x3a, 0x53, 0xca, +- 0x3d, 0xa0, 0xdd, 0x5b, 0xe2, 0x9a, 0xbc, 0x14, 0x9c, 0x05, 0x16, 0x9e, +- 0x5e, 0x2a, 0x5a, 0x03, 0xd8, 0x12, 0x76, 0x9f, 0x05, 0x3e, 0x77, 0x49, +- 0xfe, 0x22, 0xd7, 0x82, 0x75, 0xf8, 0xbc, 0x4d, 0xa6, 0xe3, 0xad, 0xb6, +- 0xf2, 0xdc, 0x3e, 0xe9, 0x24, 0xbf, 0x51, 0x77, 0xe9, 0xff, 0x46, 0xb4, +- 0x5e, 0x76, 0x65, 0x60, 0x95, 0x7c, 0x2f, 0x5a, 0xb3, 0x15, 0xea, 0xb1, +- 0x0e, 0xd8, 0x47, 0x3e, 0x67, 0x9f, 0x78, 0x77, 0xbe, 0xb5, 0x8f, 0xdf, +- 0x8b, 0xe8, 0x3e, 0xd8, 0x2e, 0xec, 0xa3, 0x99, 0x1f, 0x7b, 0x94, 0x9e, +- 0xeb, 0xcd, 0xf6, 0xb6, 0xf4, 0x9b, 0x68, 0xea, 0x17, 0xef, 0xce, 0x7f, +- 0x37, 0x42, 0x5c, 0xf6, 0xf2, 0x32, 0xf8, 0xac, 0xe6, 0xc4, 0x77, 0x6c, +- 0x53, 0xb4, 0x0a, 0x4b, 0x41, 0x30, 0xed, 0xdb, 0x12, 0xe9, 0x0b, 0xeb, +- 0xea, 0x79, 0x15, 0x31, 0xaf, 0x3c, 0xe6, 0x65, 0xf7, 0xb5, 0xd2, 0xf4, +- 0xfb, 0x86, 0xa6, 0xde, 0x26, 0x9a, 0xe2, 0xef, 0x31, 0xaf, 0xf8, 0x2e, +- 0xf3, 0x7a, 0xa9, 0x57, 0xf7, 0x11, 0x6f, 0xea, 0xa3, 0xaf, 0xa5, 0x0f, +- 0xe8, 0xfd, 0x38, 0xdb, 0xf7, 0xed, 0xd2, 0xfe, 0x87, 0x1d, 0xba, 0x3d, +- 0xdb, 0xb4, 0x41, 0xb7, 0xf7, 0x1b, 0xbd, 0x78, 0xa2, 0x49, 0x97, 0x9d, +- 0x80, 0x2e, 0x6b, 0x6e, 0xd3, 0x2c, 0xff, 0xa1, 0x8f, 0x44, 0xff, 0x28, +- 0xc4, 0x8a, 0x1f, 0x50, 0x18, 0x64, 0x07, 0x63, 0xc7, 0x80, 0x47, 0xba, +- 0x60, 0xff, 0xbb, 0xe9, 0x07, 0x19, 0x4c, 0x48, 0xbf, 0x88, 0x38, 0x50, +- 0x3c, 0xa0, 0x28, 0xe8, 0x96, 0xc1, 0xc4, 0x31, 0x11, 0xe5, 0x07, 0x11, +- 0x5f, 0xd3, 0x27, 0xe2, 0x38, 0xf4, 0x89, 0xb8, 0xee, 0xbc, 0x2f, 0x6c, +- 0xfb, 0x48, 0xfd, 0xd8, 0xf7, 0xc4, 0xc7, 0xdc, 0x33, 0xa1, 0xad, 0x69, +- 0xd6, 0xa7, 0xbb, 0xd1, 0xd4, 0xdf, 0x42, 0x13, 0x74, 0x12, 0x7c, 0xb3, +- 0x05, 0xc8, 0x23, 0x30, 0x29, 0x74, 0xe0, 0xfd, 0x53, 0xe7, 0x56, 0x44, +- 0x4a, 0x0d, 0xda, 0xc7, 0x51, 0x81, 0x5f, 0x05, 0xba, 0xd8, 0xb7, 0xb2, +- 0x91, 0xd0, 0x4d, 0xdd, 0x39, 0x3b, 0x3b, 0x08, 0x3f, 0xdc, 0x91, 0x39, +- 0x43, 0xdb, 0x8c, 0xf2, 0xe1, 0xba, 0x50, 0x26, 0x94, 0x5c, 0xcd, 0x80, +- 0x3e, 0x5e, 0xcf, 0x18, 0xec, 0x7e, 0xac, 0xd1, 0x4a, 0xdb, 0xf7, 0x40, +- 0x9b, 0x07, 0x1a, 0x92, 0xf2, 0x02, 0xb0, 0xfb, 0x37, 0xd5, 0xbe, 0x0c, +- 0x75, 0x17, 0x65, 0x29, 0x55, 0x2d, 0xcb, 0x66, 0xb0, 0xb2, 0xcc, 0x7d, +- 0x4b, 0x1b, 0xde, 0x25, 0x65, 0xac, 0xd7, 0xc0, 0x52, 0x2a, 0x99, 0xb3, +- 0xc5, 0x7a, 0xdf, 0x41, 0xca, 0xd3, 0xe3, 0x32, 0x70, 0x51, 0x2c, 0x67, +- 0x09, 0x7b, 0xbd, 0x3b, 0xc4, 0x57, 0x9c, 0xdf, 0x6f, 0x63, 0x7e, 0xe8, +- 0x7b, 0x39, 0x9c, 0x5f, 0x97, 0x94, 0x56, 0x39, 0xbf, 0xed, 0xb9, 0xc5, +- 0x19, 0x11, 0xf9, 0x1c, 0xf4, 0x35, 0xe6, 0x08, 0x1a, 0xc7, 0x81, 0x73, +- 0xef, 0x30, 0x73, 0xea, 0xc2, 0x9c, 0x60, 0xa3, 0x97, 0xd8, 0x1e, 0x74, +- 0x81, 0xe6, 0x12, 0xea, 0xcd, 0x2f, 0x71, 0xcd, 0x41, 0x2b, 0xd6, 0xbd, +- 0xd4, 0xe0, 0xda, 0x73, 0x6e, 0xda, 0xae, 0x3b, 0x1e, 0xe7, 0xc7, 0x79, +- 0x0e, 0x63, 0x5e, 0xac, 0xc3, 0x76, 0xad, 0x32, 0x32, 0xfc, 0x1e, 0xeb, +- 0xf1, 0xdb, 0x2d, 0xeb, 0x21, 0x66, 0x3d, 0x62, 0xd2, 0xb6, 0xaa, 0xfc, +- 0x65, 0x45, 0x03, 0x7d, 0x08, 0x07, 0xf4, 0x2f, 0xae, 0xc8, 0x68, 0x54, +- 0x48, 0x7b, 0x82, 0xcf, 0x32, 0x6d, 0x32, 0xe8, 0x5f, 0x81, 0x5c, 0x95, +- 0x20, 0x0b, 0xf4, 0x07, 0x5e, 0x5e, 0xd6, 0x6b, 0x51, 0x6a, 0x74, 0xc2, +- 0x47, 0xe7, 0xf8, 0xe4, 0x37, 0xe7, 0xe6, 0xaa, 0x75, 0x68, 0x5e, 0x97, +- 0x4f, 0xdf, 0xb2, 0x2e, 0xd4, 0xbb, 0xd4, 0x03, 0xc4, 0x3d, 0xd4, 0x05, +- 0x61, 0x4c, 0xa0, 0xe6, 0xea, 0xfd, 0x14, 0xda, 0x9f, 0xeb, 0xdb, 0xf8, +- 0x52, 0xaf, 0x59, 0xc2, 0xc4, 0x05, 0xba, 0xc4, 0x5e, 0xbd, 0x83, 0x7a, +- 0x1f, 0xf6, 0x27, 0x9c, 0xdf, 0xef, 0xe0, 0x3e, 0x71, 0xd3, 0x7a, 0xd8, +- 0x98, 0x93, 0xa3, 0xe6, 0xa8, 0xd6, 0x62, 0x5b, 0xe6, 0xe6, 0x1a, 0x7a, +- 0x5e, 0xce, 0xd2, 0x1e, 0xb3, 0x1e, 0x31, 0x3c, 0xe3, 0xbc, 0x42, 0x9b, +- 0xc3, 0x79, 0x91, 0x5e, 0xd7, 0xc8, 0x1c, 0xe7, 0xc3, 0xfd, 0xd7, 0x2c, +- 0x6b, 0x2f, 0x05, 0xd5, 0xe5, 0xa8, 0x9a, 0x7b, 0xde, 0xef, 0x26, 0x46, +- 0xa3, 0x8e, 0x34, 0xfa, 0x89, 0xcf, 0x69, 0x07, 0xf1, 0x2e, 0x43, 0x19, +- 0xc2, 0x7d, 0x9d, 0xf7, 0xcd, 0x36, 0xed, 0x79, 0x47, 0xeb, 0x01, 0xc6, +- 0x9f, 0xde, 0xdb, 0xd6, 0x45, 0xb3, 0x62, 0xad, 0x57, 0xe8, 0x33, 0x07, +- 0xc0, 0x5d, 0x77, 0x40, 0xaf, 0x1c, 0x92, 0x92, 0x0b, 0x7b, 0x3d, 0x7c, +- 0x3b, 0xe6, 0x3c, 0x2e, 0x2a, 0xde, 0x30, 0xbc, 0x17, 0xd7, 0x7b, 0x94, +- 0xef, 0x52, 0x1a, 0xfe, 0x90, 0xe4, 0xa6, 0x69, 0xd3, 0x7e, 0x5f, 0x66, +- 0x60, 0x5b, 0x4b, 0xc3, 0x77, 0x82, 0x3e, 0xde, 0x43, 0x27, 0x7a, 0x43, +- 0x8c, 0x51, 0xe0, 0xef, 0x71, 0x13, 0x9b, 0x39, 0x80, 0xfb, 0x3d, 0xa8, +- 0xf3, 0x49, 0x53, 0xa7, 0x1b, 0x75, 0x06, 0x5b, 0xea, 0x70, 0xbc, 0xfb, +- 0x50, 0x07, 0xf6, 0x14, 0x56, 0xd2, 0xf6, 0x0e, 0xe2, 0x37, 0x81, 0x67, +- 0xf7, 0xe2, 0xd9, 0x3d, 0x78, 0x76, 0x0f, 0xee, 0x7f, 0xd7, 0xc4, 0x3c, +- 0xc2, 0x36, 0xdd, 0xb8, 0xff, 0x12, 0xde, 0x43, 0xc7, 0xb9, 0xdf, 0xc6, +- 0xfb, 0xfb, 0xf0, 0x1b, 0x6b, 0xa9, 0xe3, 0xb6, 0xdc, 0x9f, 0x76, 0x74, +- 0x8c, 0x84, 0xcf, 0x82, 0xc8, 0xce, 0xf5, 0x7f, 0x35, 0xcf, 0xbd, 0xa6, +- 0xf7, 0x1f, 0x37, 0xd7, 0xad, 0xb2, 0x94, 0x86, 0x2c, 0xf1, 0xfd, 0x57, +- 0xf6, 0xe9, 0xb5, 0xb8, 0x43, 0xc7, 0x1f, 0x6e, 0xc2, 0x1b, 0x4a, 0xfc, +- 0x71, 0xbd, 0x09, 0x9c, 0x41, 0xec, 0xd1, 0x8c, 0x3b, 0x48, 0x8b, 0xab, +- 0xe4, 0xf5, 0xe5, 0xe5, 0xd7, 0xba, 0xf5, 0x18, 0x62, 0xd5, 0x21, 0x73, +- 0x13, 0x2a, 0x16, 0xf1, 0x33, 0xf3, 0xcc, 0xdb, 0xb7, 0xf3, 0x6e, 0xaf, +- 0x4c, 0x54, 0xff, 0x68, 0xdf, 0x0e, 0x6d, 0x93, 0x4d, 0xd7, 0x3b, 0x98, +- 0x02, 0xfe, 0x84, 0xbd, 0x83, 0x77, 0x72, 0xf6, 0x5c, 0xa3, 0x68, 0xeb, +- 0x71, 0x59, 0x07, 0xef, 0x1a, 0x9b, 0x3d, 0x8e, 0x92, 0xfd, 0x9c, 0x4d, +- 0x5f, 0xa3, 0xbc, 0xc6, 0xeb, 0xdb, 0x51, 0x36, 0xb7, 0xed, 0x87, 0x1e, +- 0xcf, 0xd9, 0x9a, 0xee, 0xd6, 0xf6, 0xe1, 0xbe, 0xf1, 0x65, 0xa1, 0x0a, +- 0x99, 0xf3, 0x52, 0xc3, 0x65, 0xac, 0xdd, 0xac, 0x9f, 0x9a, 0xa6, 0x4c, +- 0xc2, 0x9f, 0xfd, 0x94, 0xc8, 0xa4, 0xcc, 0x57, 0x1f, 0x06, 0xfe, 0x0e, +- 0xe4, 0x21, 0xe0, 0x8a, 0x7f, 0x0f, 0x5c, 0x52, 0x83, 0xac, 0xd7, 0x1a, +- 0x1e, 0x7e, 0xfd, 0xf2, 0x57, 0x95, 0x84, 0x3c, 0x07, 0x7f, 0x02, 0xb2, +- 0x06, 0x3d, 0x9c, 0x76, 0x1f, 0x12, 0xe9, 0xb1, 0xe5, 0xf2, 0xbd, 0xb6, +- 0x8c, 0x24, 0x07, 0xac, 0x74, 0x02, 0x3f, 0xb7, 0x0d, 0xbf, 0x22, 0x7c, +- 0xb8, 0xb5, 0x06, 0x63, 0x01, 0x71, 0xf9, 0xeb, 0xf5, 0x24, 0x7e, 0x7d, +- 0xf2, 0x37, 0xeb, 0x1c, 0x7f, 0xc0, 0x94, 0x6a, 0x1f, 0xc3, 0xe7, 0x28, +- 0xcb, 0x62, 0x26, 0x21, 0x0b, 0x95, 0xe0, 0xa4, 0xf6, 0x99, 0x3d, 0xf8, +- 0xc8, 0xdc, 0xb3, 0x2f, 0x60, 0xcf, 0xe2, 0xb9, 0xc2, 0x9e, 0xa1, 0xdd, +- 0x7b, 0x01, 0x76, 0x2f, 0x5c, 0x23, 0xce, 0xb3, 0x75, 0x7d, 0xd8, 0x2f, +- 0xd7, 0x88, 0x7a, 0x9d, 0xba, 0x3c, 0x06, 0xfc, 0x10, 0xea, 0x76, 0xea, +- 0x08, 0x6f, 0xdb, 0x0f, 0x7d, 0xe4, 0x60, 0x17, 0xb0, 0x86, 0xc4, 0xe2, +- 0xd9, 0x9f, 0xca, 0xca, 0x59, 0xee, 0x1b, 0xda, 0xe3, 0xbb, 0x21, 0x6f, +- 0xa9, 0xaf, 0x96, 0x89, 0x99, 0xbd, 0x0c, 0xf8, 0x51, 0x96, 0xe9, 0x83, +- 0xab, 0xbd, 0x5a, 0x4e, 0x26, 0xc5, 0x39, 0xfb, 0x85, 0xa8, 0x74, 0x9f, +- 0x94, 0x45, 0x1f, 0x7e, 0xa9, 0x5d, 0x0e, 0x22, 0x9e, 0x97, 0x28, 0x28, +- 0xbf, 0x69, 0x05, 0x74, 0xc6, 0x64, 0xe2, 0x2c, 0xeb, 0x9c, 0x84, 0x8c, +- 0xb5, 0x81, 0xe6, 0x76, 0x39, 0x15, 0x4f, 0x95, 0x0b, 0xf0, 0xf7, 0x6d, +- 0xaf, 0x47, 0x06, 0xea, 0x2c, 0x89, 0x41, 0xfe, 0x37, 0xe4, 0x87, 0xd7, +- 0xf0, 0x03, 0x57, 0xf9, 0x7c, 0x00, 0x25, 0x9f, 0x7b, 0xd0, 0x2f, 0xe4, +- 0x07, 0x70, 0xc3, 0xc5, 0xb2, 0x9c, 0xca, 0x4c, 0x4a, 0xbd, 0x2a, 0xd6, +- 0x42, 0x06, 0x7b, 0xa0, 0x96, 0x95, 0x3a, 0x78, 0x51, 0x6a, 0x1c, 0x87, +- 0xdf, 0xf9, 0x26, 0xca, 0x39, 0x94, 0xd7, 0x51, 0x3e, 0x8e, 0xf2, 0x2d, +- 0x94, 0xa4, 0xfd, 0xb8, 0xd4, 0x6b, 0x7b, 0xda, 0xa4, 0x93, 0x7d, 0x6c, +- 0x18, 0x9a, 0xe1, 0x3b, 0x1e, 0x3c, 0x0e, 0x2c, 0x1a, 0x3e, 0x3f, 0x2e, +- 0x52, 0xff, 0x0c, 0x7e, 0x0f, 0xaa, 0x7b, 0xfa, 0x96, 0x0b, 0x99, 0x71, +- 0xe0, 0x7a, 0xb1, 0x4e, 0x65, 0x1e, 0x37, 0xfd, 0x7c, 0x06, 0xe3, 0x5d, +- 0xc5, 0xd8, 0x31, 0xc8, 0x48, 0x20, 0x8f, 0xf8, 0x27, 0xe5, 0x73, 0xfe, +- 0x7e, 0x19, 0xeb, 0x8d, 0x95, 0x63, 0x59, 0xce, 0x9f, 0x7a, 0x6a, 0xb7, +- 0xf9, 0x87, 0xf3, 0xe6, 0x9c, 0xa1, 0x5b, 0x97, 0xf6, 0x6a, 0xdc, 0x6d, +- 0x7f, 0x39, 0xaa, 0x69, 0xb1, 0x64, 0x60, 0x88, 0xfd, 0x65, 0x25, 0x72, +- 0x76, 0xc8, 0xcd, 0xd8, 0x23, 0xf0, 0x52, 0xd2, 0xf8, 0x9d, 0x84, 0xfc, +- 0x79, 0xa7, 0x07, 0xec, 0xdb, 0x40, 0x13, 0xde, 0xd5, 0x39, 0x0e, 0xec, +- 0xe9, 0x3d, 0xaf, 0x62, 0x6e, 0x65, 0x69, 0xbf, 0x27, 0x2b, 0x37, 0x1a, +- 0xbc, 0x86, 0x3d, 0xba, 0x30, 0x29, 0xff, 0x5c, 0xbd, 0x2a, 0x4f, 0x54, +- 0x27, 0xe5, 0x0d, 0x94, 0x8b, 0xd5, 0x32, 0xf8, 0xc8, 0x58, 0x3c, 0xfb, +- 0x08, 0xb0, 0x2e, 0x83, 0xf0, 0x8d, 0x3e, 0x98, 0x98, 0xc3, 0xfa, 0xcd, +- 0xb8, 0x81, 0x9c, 0xf3, 0xcb, 0x72, 0x6e, 0x1c, 0x6d, 0x6a, 0x1d, 0x12, +- 0x7d, 0x96, 0xf3, 0xed, 0x96, 0x02, 0x2c, 0x7a, 0x31, 0x43, 0x9d, 0xd9, +- 0x29, 0x85, 0x5a, 0xab, 0xdc, 0x51, 0xde, 0xde, 0xb6, 0xea, 0xdb, 0x3a, +- 0x60, 0xd3, 0xfa, 0x66, 0x83, 0x36, 0x78, 0x37, 0x7b, 0xaa, 0xe5, 0xae, +- 0x5e, 0xa3, 0x4d, 0xdd, 0x91, 0xbd, 0x3a, 0xfc, 0xb9, 0x7a, 0xf5, 0xba, +- 0x91, 0x3f, 0x25, 0xb7, 0x58, 0x17, 0x62, 0xf1, 0x9f, 0x08, 0xb0, 0x1f, +- 0x78, 0x14, 0xc6, 0x09, 0xb5, 0x7f, 0x54, 0x03, 0xad, 0x85, 0x38, 0x71, +- 0x06, 0xac, 0x5b, 0xed, 0x0b, 0x8a, 0x57, 0xde, 0xd9, 0x7e, 0xa9, 0x2e, +- 0x93, 0xbf, 0x29, 0xd7, 0xb6, 0x95, 0x4f, 0x02, 0xbe, 0x7a, 0x58, 0x9f, +- 0xf0, 0x7d, 0x0a, 0x7e, 0xd2, 0x49, 0x71, 0xc7, 0x3a, 0x31, 0x27, 0x5e, +- 0x8b, 0x4c, 0x5f, 0x6c, 0xc5, 0x91, 0xa1, 0x9d, 0x68, 0x83, 0x3f, 0x1e, +- 0xc5, 0x5a, 0x76, 0xc1, 0x9f, 0x86, 0x9f, 0x0a, 0x39, 0xfa, 0x33, 0x60, +- 0xaf, 0xd3, 0xca, 0xb7, 0xe6, 0x9e, 0xea, 0x9e, 0x1a, 0x58, 0x67, 0xb9, +- 0x77, 0x2a, 0x5d, 0x63, 0x19, 0x9f, 0xd2, 0xbe, 0x64, 0x62, 0x4a, 0xc7, +- 0xed, 0x93, 0x53, 0x07, 0x54, 0xe9, 0x4d, 0x0d, 0xab, 0x72, 0x78, 0x6a, +- 0x27, 0x66, 0x42, 0x9e, 0x8a, 0x95, 0xcf, 0x64, 0xa4, 0x58, 0x21, 0x8d, +- 0xe2, 0x1c, 0x83, 0x3c, 0xcd, 0x01, 0xcb, 0xe4, 0x2b, 0xbe, 0x9c, 0xda, +- 0xc8, 0x82, 0x66, 0xe8, 0x99, 0xac, 0x8f, 0x52, 0xcc, 0x5f, 0xd8, 0xb6, +- 0x8d, 0x31, 0x32, 0xae, 0x99, 0xf1, 0x33, 0x7d, 0xfa, 0x99, 0xcd, 0x7f, +- 0xec, 0x0f, 0xb2, 0x49, 0xfb, 0xf9, 0x0b, 0xf8, 0xc6, 0xe2, 0x94, 0x32, +- 0x6c, 0xeb, 0xc3, 0x07, 0x17, 0xd9, 0x5a, 0x91, 0x58, 0x2c, 0xfb, 0x1d, +- 0x89, 0x3d, 0x1d, 0x04, 0x3f, 0xf0, 0x53, 0x47, 0xca, 0x02, 0x5e, 0x59, +- 0x78, 0xbe, 0xce, 0x77, 0xd4, 0x4d, 0x23, 0xee, 0x0d, 0xc8, 0x5c, 0xee, +- 0xa8, 0xc8, 0x2b, 0x78, 0x56, 0x5f, 0xe1, 0x1a, 0x7c, 0x17, 0x6b, 0x60, +- 0xd6, 0x44, 0x3d, 0x63, 0x3d, 0xf8, 0x58, 0x71, 0xce, 0x63, 0xc4, 0x6d, +- 0x47, 0xfb, 0xda, 0x3a, 0xdb, 0xa4, 0xc6, 0x79, 0xe4, 0xf5, 0xca, 0xba, +- 0x9e, 0xdf, 0xe1, 0xcc, 0xb0, 0x5c, 0xae, 0xa8, 0x3e, 0x20, 0xeb, 0xbf, +- 0x44, 0x9b, 0x4d, 0xc8, 0x2d, 0x63, 0x53, 0x59, 0x99, 0x07, 0x4e, 0x9b, +- 0xaf, 0xa4, 0x21, 0x3b, 0x8e, 0xcc, 0x24, 0x48, 0xb6, 0x27, 0x5b, 0x95, +- 0x37, 0xdb, 0x88, 0x85, 0xf3, 0x1e, 0xaf, 0xc7, 0x51, 0x67, 0x5a, 0x88, +- 0xb7, 0xf2, 0x19, 0xce, 0xa9, 0x99, 0x17, 0xfa, 0xaf, 0x84, 0xb5, 0x30, +- 0x73, 0x54, 0x7f, 0x7a, 0x1c, 0xb4, 0x37, 0xe3, 0x14, 0x01, 0x53, 0xe0, +- 0x6b, 0x4a, 0xfa, 0x82, 0xe3, 0xe4, 0x2b, 0x8e, 0x0c, 0x5c, 0xc0, 0xb6, +- 0xca, 0x1a, 0x5e, 0x34, 0x42, 0x59, 0x0b, 0x31, 0x10, 0x65, 0x8b, 0x3c, +- 0x48, 0x95, 0x37, 0xc1, 0xec, 0xde, 0xec, 0x35, 0x79, 0x74, 0x55, 0xcf, +- 0xd9, 0x3e, 0x2f, 0x3c, 0x0b, 0x91, 0x1b, 0x2b, 0x29, 0xff, 0x3a, 0xf4, +- 0x7d, 0x21, 0xee, 0x43, 0x56, 0xfe, 0x4b, 0x1b, 0xf6, 0xf4, 0x78, 0xce, +- 0xde, 0xdf, 0xae, 0x6d, 0xac, 0x83, 0x3d, 0x01, 0xac, 0x59, 0xc9, 0xa1, +- 0x4d, 0xbb, 0xfc, 0x5b, 0x07, 0xd7, 0xc4, 0x9e, 0x78, 0x66, 0xec, 0x22, +- 0xae, 0x75, 0x7f, 0xf3, 0x98, 0x87, 0x8e, 0x03, 0x5b, 0xf2, 0x28, 0x2c, +- 0x88, 0xa0, 0xff, 0x01, 0x33, 0xd6, 0xc0, 0xf9, 0x50, 0x36, 0x40, 0xf7, +- 0x6a, 0x16, 0xf8, 0xdd, 0x31, 0x7e, 0x2b, 0x75, 0x8c, 0xec, 0xe2, 0xf7, +- 0x34, 0xc7, 0x5e, 0x63, 0x2a, 0x4e, 0x47, 0x2c, 0x47, 0xd9, 0x3a, 0x62, +- 0x64, 0xeb, 0x33, 0x90, 0xad, 0xe3, 0x4a, 0xb6, 0x02, 0xf9, 0x81, 0xef, +- 0xcb, 0x97, 0x77, 0x95, 0xaf, 0xd6, 0xbf, 0x2e, 0xd0, 0xcb, 0x5f, 0x9f, +- 0x2c, 0xfc, 0x05, 0xc6, 0xbd, 0xe0, 0xe2, 0x3a, 0x95, 0x9b, 0x11, 0xf2, +- 0x31, 0x81, 0xeb, 0x18, 0xca, 0x7e, 0x55, 0x67, 0xe0, 0x02, 0xec, 0x1a, +- 0xe4, 0x8d, 0xfc, 0x9d, 0x87, 0x8d, 0x1b, 0xb8, 0x10, 0x85, 0x2d, 0xe4, +- 0x9e, 0x95, 0x5e, 0x1b, 0xba, 0x81, 0xf5, 0xeb, 0xd8, 0x3b, 0x03, 0x17, +- 0xba, 0x50, 0x26, 0x55, 0x5f, 0xf5, 0x8a, 0xa7, 0xda, 0xd7, 0x2b, 0xc3, +- 0xaa, 0x5d, 0xbd, 0x32, 0x8a, 0x12, 0xfa, 0x3d, 0xe3, 0xcb, 0xd0, 0x85, +- 0x8c, 0x24, 0x2f, 0x58, 0x52, 0x9a, 0x0e, 0x82, 0x18, 0x68, 0x1f, 0xbe, +- 0xd0, 0x23, 0xd7, 0xa7, 0x39, 0x37, 0xea, 0x62, 0xb1, 0x16, 0x33, 0xd3, +- 0xd8, 0x9b, 0xe4, 0x1f, 0xb0, 0xfe, 0x85, 0x22, 0x6c, 0x6e, 0x51, 0x4e, +- 0xad, 0x90, 0x3f, 0x8c, 0xb5, 0x6f, 0x25, 0x22, 0x92, 0x82, 0x2e, 0x3b, +- 0x2a, 0x73, 0xd5, 0x76, 0xe8, 0x32, 0xc7, 0xad, 0xcb, 0x13, 0x58, 0xa3, +- 0x41, 0xca, 0x03, 0xf8, 0x92, 0x45, 0xdf, 0x45, 0x29, 0xa0, 0x4d, 0x71, +- 0x65, 0xa7, 0x7e, 0x49, 0xda, 0xb1, 0xa7, 0x8e, 0xca, 0xb1, 0x2a, 0xfb, +- 0x71, 0xdc, 0x79, 0x39, 0x00, 0x19, 0xf2, 0xdc, 0x09, 0xf4, 0x03, 0x1b, +- 0xd9, 0xf4, 0xc7, 0xfd, 0x97, 0x7b, 0x0f, 0x99, 0x0c, 0xf7, 0x5d, 0xac, +- 0xdc, 0x96, 0x9d, 0xb6, 0xb6, 0x32, 0xe2, 0xcc, 0x66, 0x1e, 0xb2, 0x5e, +- 0xc9, 0x64, 0xac, 0x2b, 0x99, 0x9c, 0x75, 0x35, 0x53, 0xb4, 0xae, 0xc1, +- 0x36, 0xd5, 0x37, 0xde, 0x81, 0xfc, 0x00, 0x4f, 0x10, 0x7b, 0x6f, 0xaf, +- 0x61, 0xdc, 0xf8, 0x39, 0x6f, 0xc9, 0xb9, 0x0a, 0xed, 0x74, 0x70, 0x68, +- 0xd6, 0x2f, 0xdf, 0x0e, 0xfa, 0x40, 0x07, 0xe3, 0x11, 0x3b, 0xb6, 0x23, +- 0x9a, 0x1d, 0x06, 0x4e, 0xa0, 0xed, 0xe8, 0xa2, 0xed, 0xf0, 0x0b, 0xb2, +- 0x57, 0xb6, 0xaa, 0x3a, 0x2e, 0x97, 0x07, 0x6e, 0xda, 0xaa, 0xc5, 0xe5, +- 0xcb, 0xcb, 0xa1, 0x2c, 0x71, 0xbe, 0xf3, 0xef, 0xeb, 0x90, 0x88, 0x1c, +- 0x51, 0xf6, 0xba, 0x5b, 0x2e, 0xaf, 0x03, 0xd3, 0x02, 0x81, 0xd8, 0x77, +- 0x32, 0xce, 0x63, 0xab, 0xf8, 0x85, 0xf4, 0xf0, 0x3c, 0xf0, 0x1f, 0xc0, +- 0x2b, 0x9e, 0xd9, 0x61, 0x9e, 0x3d, 0x9c, 0x51, 0x78, 0x3f, 0x8a, 0x3d, +- 0xc9, 0x6b, 0x4b, 0x0a, 0xc0, 0xed, 0x5b, 0x15, 0x96, 0x09, 0x94, 0x26, +- 0x56, 0x0f, 0x5d, 0x10, 0xc9, 0xfe, 0xa3, 0x7a, 0xdf, 0xee, 0x89, 0x35, +- 0x0b, 0x3b, 0x5c, 0x5a, 0xa1, 0x4c, 0xa3, 0x5c, 0xd7, 0x63, 0x17, 0x7c, +- 0x60, 0xe6, 0xd1, 0x0e, 0xda, 0x37, 0xe0, 0x27, 0xec, 0x7b, 0x85, 0xed, +- 0x33, 0xd8, 0x73, 0x3f, 0x68, 0xa7, 0x6d, 0x3f, 0xec, 0x8f, 0xcb, 0xb5, +- 0x0a, 0xaf, 0xf9, 0x3e, 0xe5, 0x8b, 0x8a, 0x1b, 0xc7, 0xa6, 0x16, 0x3d, +- 0xdf, 0xec, 0x31, 0x15, 0xd3, 0xb1, 0x3e, 0x06, 0xcc, 0x38, 0x70, 0xa6, +- 0x4d, 0xd2, 0x4f, 0xdb, 0x7d, 0xfa, 0x7c, 0xe5, 0x90, 0x14, 0xfd, 0x03, +- 0x98, 0xc3, 0x3e, 0x99, 0x87, 0x2f, 0xb6, 0xb0, 0x31, 0x2c, 0xf3, 0xc3, +- 0xf0, 0xb9, 0xdd, 0xbb, 0x89, 0xd5, 0xf0, 0xeb, 0xc0, 0xf3, 0x41, 0x94, +- 0xed, 0x28, 0x6f, 0x97, 0xf9, 0xa7, 0xba, 0x63, 0xba, 0xbf, 0x68, 0xcb, +- 0xfd, 0xb3, 0x1c, 0x3b, 0x99, 0xb4, 0x7e, 0x15, 0x2e, 0x6c, 0xc6, 0x84, +- 0xa4, 0x23, 0x2a, 0xde, 0x93, 0x5d, 0x32, 0x78, 0xc6, 0x95, 0xa1, 0x33, +- 0x09, 0x39, 0x70, 0xa6, 0x5f, 0x86, 0xcf, 0x24, 0xe5, 0xce, 0x33, 0x21, +- 0xfe, 0xea, 0x9e, 0x4a, 0x1b, 0x5b, 0xe1, 0xfd, 0x9a, 0xb6, 0xe2, 0xce, +- 0x86, 0xc6, 0xa8, 0xf3, 0x6b, 0xc4, 0x74, 0xaf, 0x62, 0xef, 0x6e, 0xaa, +- 0xf3, 0xca, 0x4b, 0x1b, 0x41, 0x70, 0xc9, 0x6f, 0x77, 0xa7, 0x85, 0xfc, +- 0xce, 0x00, 0x9f, 0xf9, 0xd0, 0x61, 0xa3, 0xd0, 0x61, 0xe3, 0xca, 0x36, +- 0xd6, 0xbf, 0x2e, 0xd6, 0xb1, 0xcc, 0x03, 0xb2, 0x06, 0xd9, 0x7e, 0xd0, +- 0x4f, 0x7d, 0x75, 0x53, 0xf1, 0x47, 0x62, 0x3d, 0xd0, 0x67, 0x77, 0xaf, +- 0xb6, 0xcb, 0x1b, 0xf1, 0x20, 0x38, 0x0b, 0x1d, 0x50, 0xaf, 0x68, 0xf9, +- 0xcd, 0x7b, 0xd4, 0x05, 0x0f, 0x61, 0xfe, 0xa3, 0x78, 0x96, 0x33, 0xba, +- 0xbd, 0x43, 0x6e, 0xc4, 0x13, 0xb2, 0x7e, 0x60, 0xbc, 0xa5, 0x5e, 0x06, +- 0xf7, 0xc0, 0x3d, 0x8d, 0xdf, 0x23, 0xbf, 0xf0, 0xdc, 0x95, 0x73, 0xf0, +- 0x99, 0xcf, 0x1f, 0x48, 0x8d, 0x27, 0x6d, 0xea, 0xc3, 0xa4, 0xd4, 0xbe, +- 0x9e, 0x90, 0xb5, 0x65, 0x6d, 0x97, 0x66, 0xbd, 0x71, 0x29, 0x00, 0xfb, +- 0xae, 0x2d, 0x67, 0x51, 0xb2, 0x7e, 0xa8, 0x73, 0xb4, 0x5c, 0x16, 0x33, +- 0x79, 0xec, 0x63, 0xee, 0x0f, 0x6d, 0x77, 0x6c, 0xbb, 0x1d, 0x72, 0xc4, +- 0x3d, 0xf1, 0x30, 0x9e, 0xe7, 0xb1, 0xaf, 0x69, 0xc7, 0xd3, 0x90, 0xaf, +- 0xcf, 0xc6, 0x28, 0x1f, 0x05, 0x9f, 0xf8, 0x9a, 0x6d, 0x52, 0x89, 0x34, +- 0x9e, 0x4f, 0x4b, 0x5a, 0x9d, 0x0b, 0xcd, 0xfa, 0x61, 0x7f, 0x59, 0xa3, +- 0x17, 0x22, 0x8c, 0x81, 0xe1, 0xef, 0x64, 0x8c, 0xf2, 0x18, 0xf1, 0xc2, +- 0xe7, 0x23, 0xb0, 0x3d, 0x51, 0x35, 0xc6, 0xfc, 0x32, 0x9f, 0xa5, 0x5d, +- 0xb6, 0x2f, 0xf8, 0xbc, 0x17, 0xf9, 0x44, 0x83, 0xf1, 0x9a, 0x98, 0x3c, +- 0xda, 0xe8, 0x02, 0xbd, 0x6d, 0xbf, 0xc2, 0xf6, 0xec, 0xec, 0x73, 0x3b, +- 0xbb, 0x95, 0x70, 0x95, 0x6e, 0xa1, 0x1e, 0xa1, 0x0e, 0x69, 0x17, 0x67, +- 0x8c, 0xfb, 0x0c, 0x6b, 0xb2, 0x8c, 0x35, 0x5a, 0xc6, 0x1a, 0x2d, 0x63, +- 0x8d, 0x96, 0xb1, 0x7e, 0xcb, 0xd4, 0x2d, 0x83, 0xd8, 0xcf, 0x39, 0x73, +- 0x86, 0x40, 0xfd, 0xf2, 0x1c, 0xd6, 0x76, 0x5a, 0xfe, 0x76, 0x63, 0x52, +- 0xfe, 0xf3, 0xc6, 0x11, 0xe0, 0xee, 0x22, 0xd6, 0x35, 0x87, 0x75, 0xcd, +- 0x62, 0x5d, 0x8f, 0x62, 0x5d, 0xc7, 0x55, 0xcc, 0xb3, 0x5a, 0x49, 0x5d, +- 0x2a, 0x2b, 0x8c, 0xff, 0x16, 0xe4, 0x61, 0x4c, 0x9c, 0xd5, 0x7e, 0xe8, +- 0x8b, 0x72, 0x10, 0xf7, 0x82, 0x43, 0xc0, 0xd6, 0x18, 0xbb, 0x9c, 0x72, +- 0x94, 0xee, 0xf3, 0xdc, 0xcf, 0x63, 0xaf, 0xbc, 0x2f, 0x9b, 0xaa, 0x52, +- 0x75, 0x9d, 0xab, 0x0e, 0x4b, 0xe9, 0x22, 0xea, 0x9f, 0xed, 0x02, 0xad, +- 0xc4, 0x7c, 0xa9, 0xd3, 0x25, 0xd9, 0x84, 0xbe, 0xcb, 0x81, 0xc6, 0x0f, +- 0xc9, 0x7c, 0x3c, 0xf5, 0x9c, 0xc8, 0xb8, 0xdc, 0x03, 0x3f, 0x9d, 0xf1, +- 0xcc, 0x9c, 0x8a, 0xb1, 0xe1, 0xfa, 0x62, 0x16, 0xfe, 0x36, 0x6d, 0xec, +- 0x3e, 0xe3, 0x87, 0x6b, 0x1c, 0x5b, 0x13, 0x8e, 0xcb, 0xf1, 0xfe, 0x58, +- 0xe6, 0x80, 0x15, 0xe1, 0xeb, 0x03, 0x8b, 0x78, 0x09, 0x8c, 0x19, 0x9b, +- 0xbd, 0xe8, 0xc6, 0xe6, 0x2e, 0xb2, 0x9f, 0x98, 0x44, 0x96, 0xa8, 0xb3, +- 0xd8, 0x0f, 0x74, 0x3b, 0xfa, 0x4e, 0xab, 0x33, 0xb3, 0x11, 0xb4, 0xfb, +- 0x5d, 0xe0, 0x4c, 0xcd, 0xc7, 0xfc, 0x59, 0x6d, 0xf7, 0xf2, 0xf5, 0x66, +- 0xac, 0x07, 0xdd, 0x02, 0xbb, 0x98, 0xab, 0x6b, 0xdc, 0x56, 0x54, 0xb8, +- 0x4e, 0x63, 0xba, 0xa3, 0x72, 0xa8, 0x43, 0x3a, 0x3d, 0x35, 0x9f, 0xc8, +- 0xd9, 0x4d, 0xe2, 0x58, 0x8c, 0xc1, 0x36, 0xd1, 0x26, 0xba, 0x33, 0xb0, +- 0xa7, 0xb7, 0x77, 0x50, 0x66, 0x3e, 0x09, 0xdc, 0x38, 0xb0, 0xa4, 0xcf, +- 0x98, 0x06, 0x2e, 0xfa, 0x98, 0x8f, 0xf4, 0x31, 0xb2, 0x69, 0x63, 0x0e, +- 0x1f, 0x55, 0x76, 0x79, 0x0c, 0xb6, 0xd8, 0x85, 0xac, 0x53, 0xe7, 0xf4, +- 0x61, 0xff, 0xf0, 0x9e, 0xba, 0x87, 0x7a, 0x8c, 0x32, 0x13, 0x07, 0x6e, +- 0x82, 0xfe, 0xe9, 0xee, 0x97, 0xda, 0x06, 0xdf, 0xf5, 0x2b, 0x1d, 0xed, +- 0x60, 0x0d, 0x16, 0x2b, 0xc1, 0xa1, 0xbc, 0x5f, 0x86, 0x16, 0x25, 0xcf, +- 0xc9, 0x0f, 0xf2, 0x7d, 0x14, 0xb4, 0x91, 0xc7, 0xdd, 0x65, 0x7d, 0x6e, +- 0xb9, 0x57, 0x4a, 0x55, 0xea, 0x69, 0x94, 0xb5, 0xbd, 0xf0, 0x9d, 0x5c, +- 0x85, 0x65, 0x73, 0xd3, 0x9c, 0x7b, 0xac, 0xec, 0x42, 0x6e, 0xdd, 0x83, +- 0x93, 0x2a, 0xa6, 0x72, 0x79, 0x29, 0xe5, 0xd7, 0x6c, 0x8c, 0x09, 0x9d, +- 0x69, 0x9f, 0x1f, 0x93, 0xb9, 0x95, 0x6e, 0x19, 0x5c, 0xe5, 0xf9, 0xf2, +- 0x50, 0x4c, 0xba, 0x83, 0xe0, 0x9c, 0x9f, 0x57, 0xb1, 0xc7, 0x81, 0x55, +- 0x60, 0x82, 0xa3, 0x9a, 0x77, 0x9c, 0x2f, 0x74, 0xc4, 0xbf, 0x82, 0x8f, +- 0xef, 0x8e, 0x8f, 0x8b, 0xbb, 0xe0, 0xe3, 0x57, 0x2f, 0x42, 0xfe, 0x96, +- 0x21, 0x9b, 0xcb, 0x90, 0xcd, 0x65, 0xc8, 0xe6, 0x32, 0x64, 0x73, 0x19, +- 0xb2, 0x89, 0xfd, 0xf3, 0xfc, 0xf2, 0xb8, 0xc1, 0x1f, 0x9f, 0x82, 0x2c, +- 0x7f, 0xdb, 0xe0, 0x8f, 0x51, 0xc8, 0x70, 0x12, 0xb2, 0xeb, 0x43, 0x6e, +- 0x87, 0x21, 0xcb, 0x1e, 0x64, 0xb9, 0x1f, 0x72, 0x9c, 0x50, 0xfe, 0xe3, +- 0x04, 0xb0, 0xe8, 0x83, 0xf0, 0x41, 0xce, 0x57, 0xfb, 0x65, 0x51, 0xd1, +- 0x12, 0xc8, 0x96, 0xbf, 0x49, 0x1e, 0x62, 0x5f, 0xd0, 0x3f, 0x77, 0xe5, +- 0xfc, 0x5a, 0x48, 0xdb, 0xab, 0xf2, 0xcd, 0xca, 0x6b, 0xf2, 0x42, 0x85, +- 0x34, 0xe6, 0x64, 0x11, 0xef, 0xd6, 0x9e, 0xa2, 0x1f, 0xa9, 0xe8, 0x83, +- 0xcc, 0x9d, 0x94, 0xff, 0x03, 0x5e, 0xae, 0x6f, 0x7c, 0x58, 0x3e, 0xe7, +- 0x52, 0x86, 0xe3, 0xd0, 0x35, 0xb8, 0x3f, 0x40, 0xbd, 0x04, 0x3f, 0xb4, +- 0x92, 0x2a, 0x97, 0xa0, 0x27, 0xaa, 0xf6, 0x08, 0x30, 0x58, 0x39, 0xe8, +- 0xa1, 0x0e, 0xab, 0x7a, 0xee, 0x80, 0x4d, 0xde, 0xec, 0x87, 0xbc, 0xa4, +- 0xbe, 0x0a, 0xe1, 0xc5, 0x33, 0xda, 0x73, 0x94, 0x35, 0xe8, 0xcf, 0xa7, +- 0xc8, 0x47, 0xfa, 0xb5, 0xb8, 0x56, 0xba, 0xf7, 0x27, 0x2a, 0x7e, 0x5c, +- 0x9a, 0x86, 0x2f, 0xbf, 0x46, 0x3e, 0x41, 0x56, 0x9e, 0x22, 0x1f, 0x49, +- 0x9f, 0xe6, 0xe3, 0x23, 0x12, 0xf2, 0x90, 0xef, 0x5a, 0x79, 0x08, 0x27, +- 0xaa, 0x33, 0x8e, 0xb9, 0x7f, 0x2d, 0x66, 0x62, 0xc8, 0xc6, 0x26, 0xbf, +- 0x2a, 0xd3, 0x0d, 0xce, 0xc7, 0x92, 0xdb, 0xbc, 0xab, 0xf0, 0xa9, 0x38, +- 0xf6, 0xab, 0xc1, 0xa3, 0x71, 0xce, 0x81, 0xeb, 0xba, 0x47, 0xea, 0x7d, +- 0xbe, 0x89, 0xaf, 0xfc, 0x2a, 0x5b, 0xc4, 0x7a, 0xe0, 0x3b, 0xf4, 0xcb, +- 0x0b, 0xcb, 0xe0, 0x37, 0xfc, 0xae, 0x6f, 0xc0, 0xef, 0x62, 0x9c, 0x53, +- 0xaf, 0xcf, 0xb8, 0x89, 0xd9, 0xb6, 0xc6, 0x6a, 0x93, 0x58, 0x23, 0xfa, +- 0xed, 0xa9, 0xf2, 0x75, 0xe8, 0xc1, 0xe7, 0x7d, 0xc6, 0xf8, 0x02, 0xf9, +- 0xef, 0x7e, 0xb3, 0xa6, 0x53, 0xf1, 0x6d, 0x79, 0x04, 0xba, 0xf1, 0x51, +- 0xe8, 0xc6, 0x4f, 0xdc, 0x92, 0xe7, 0x43, 0x79, 0xbb, 0x7f, 0x6a, 0x76, +- 0x65, 0xb0, 0x1c, 0xb1, 0xfb, 0x31, 0xa7, 0xe6, 0xb6, 0x8c, 0xf1, 0x25, +- 0x4d, 0x2c, 0xb6, 0x19, 0xb3, 0x86, 0xf1, 0x56, 0xca, 0x74, 0x20, 0xd7, +- 0xfc, 0x72, 0x57, 0x44, 0x9d, 0x3f, 0x7b, 0xb4, 0x13, 0xbb, 0xfc, 0xbd, +- 0xd8, 0xa1, 0xed, 0xf3, 0x5b, 0x46, 0xc6, 0x76, 0x72, 0x99, 0x26, 0x32, +- 0xe1, 0x99, 0x73, 0x37, 0x6c, 0x1e, 0xf7, 0x6d, 0x2a, 0x99, 0xc3, 0xde, +- 0x9e, 0xdf, 0xa0, 0x5d, 0x20, 0x9e, 0x6c, 0x63, 0x4c, 0x6f, 0xa6, 0x3d, +- 0xcb, 0xd8, 0x41, 0x37, 0xfc, 0x97, 0xd7, 0xe5, 0xdc, 0xca, 0x3f, 0x75, +- 0xe8, 0xfd, 0xa4, 0x73, 0xcf, 0xec, 0x8b, 0xad, 0x71, 0x54, 0xbd, 0x46, +- 0x85, 0x4c, 0x37, 0x30, 0x0c, 0xfd, 0xa5, 0x6b, 0xca, 0x5f, 0x3a, 0xec, +- 0x3b, 0xb2, 0x19, 0x67, 0x9f, 0xaf, 0xcb, 0xb1, 0x95, 0xe1, 0x4e, 0xc6, +- 0x2b, 0x17, 0x97, 0x0f, 0xc8, 0x96, 0xd2, 0x65, 0x0f, 0xa3, 0x6e, 0x16, +- 0x7b, 0x36, 0x08, 0x26, 0xfc, 0xb4, 0x7b, 0x5e, 0x46, 0x12, 0xe7, 0xc1, +- 0xd3, 0x3f, 0x43, 0x1b, 0xf8, 0xd4, 0x41, 0x11, 0xcf, 0xae, 0xc2, 0x6f, +- 0xbf, 0x21, 0xbc, 0x1e, 0x71, 0x4f, 0x43, 0x18, 0x72, 0x6e, 0xda, 0x7d, +- 0x4b, 0x42, 0xdb, 0x45, 0x3b, 0xc5, 0x33, 0xeb, 0x3e, 0x29, 0xac, 0x6b, +- 0x5a, 0xe7, 0x41, 0xeb, 0xa9, 0x15, 0x8e, 0xc1, 0x79, 0x91, 0xde, 0x7f, +- 0xe2, 0x19, 0x07, 0xe6, 0xf2, 0x41, 0x60, 0x59, 0xe2, 0x28, 0x1d, 0x8b, +- 0x28, 0xa0, 0x8d, 0xc2, 0x5a, 0x3e, 0xcf, 0x2b, 0xc9, 0xc7, 0x2f, 0xc2, +- 0x6f, 0x88, 0x43, 0x8e, 0xf1, 0x7c, 0xbd, 0x39, 0xe6, 0xcb, 0xfa, 0xfa, +- 0x1c, 0xed, 0x92, 0xf2, 0x11, 0xf2, 0xc0, 0x85, 0x93, 0xa8, 0xcb, 0x78, +- 0x67, 0x10, 0x1c, 0xf7, 0xe1, 0xc7, 0x3f, 0x45, 0xd9, 0xbb, 0x53, 0x4a, +- 0xca, 0xe7, 0x20, 0x86, 0x65, 0xfe, 0xc6, 0x96, 0x1b, 0xc3, 0xfe, 0x9c, +- 0x86, 0x6d, 0xcb, 0xc3, 0xb6, 0x45, 0xee, 0x3e, 0x02, 0x3c, 0xab, 0xce, +- 0xd9, 0x60, 0x3f, 0x39, 0xee, 0xc3, 0xd6, 0xdf, 0x67, 0x46, 0x81, 0x6f, +- 0x1f, 0x00, 0xbe, 0x65, 0x1e, 0x59, 0x1e, 0x18, 0x97, 0xf8, 0xd6, 0x95, +- 0xbf, 0xda, 0xc8, 0x43, 0xb7, 0x4d, 0x74, 0x52, 0x17, 0x1f, 0xd9, 0xb6, +- 0xd3, 0x45, 0x63, 0xc7, 0xf7, 0x49, 0x41, 0x9d, 0xbb, 0x15, 0x95, 0xbd, +- 0x9f, 0x5f, 0x27, 0xae, 0x87, 0xed, 0x5f, 0x87, 0xef, 0x57, 0xa1, 0x8f, +- 0x96, 0xc3, 0xfd, 0x03, 0xb8, 0x7f, 0x08, 0xe5, 0x11, 0x94, 0xda, 0xf7, +- 0xb9, 0xb4, 0x1c, 0xe9, 0xd4, 0x31, 0xde, 0x44, 0x93, 0xff, 0x43, 0x39, +- 0x8c, 0x4f, 0xcd, 0x56, 0xc3, 0x38, 0xfd, 0x21, 0x39, 0xee, 0xeb, 0xb3, +- 0xf5, 0x09, 0xf8, 0xeb, 0x9d, 0xc0, 0x60, 0x0f, 0x3d, 0x0d, 0x9b, 0x71, +- 0xdf, 0x21, 0xb1, 0xef, 0xb3, 0x64, 0x76, 0x14, 0x74, 0x8f, 0x0e, 0x42, +- 0x3f, 0xf7, 0xc3, 0xdf, 0x56, 0x7e, 0xb0, 0xc1, 0x9c, 0xd4, 0xfb, 0x71, +- 0xf9, 0xf3, 0x8d, 0x10, 0x7b, 0xb6, 0x01, 0xa7, 0x32, 0x56, 0x98, 0x54, +- 0xb8, 0xd9, 0xbe, 0x8d, 0xeb, 0xdf, 0x25, 0xf9, 0xdb, 0xc8, 0x53, 0x3e, +- 0x03, 0xa6, 0x51, 0xd7, 0x71, 0x49, 0x9f, 0xe1, 0xba, 0xb5, 0x9b, 0x18, +- 0x2f, 0x6d, 0x06, 0xcb, 0xbf, 0xec, 0xdc, 0xc6, 0x96, 0x8c, 0x01, 0x59, +- 0xe3, 0x9d, 0x3b, 0x79, 0x69, 0xa1, 0xdc, 0x87, 0xf9, 0x04, 0x94, 0xff, +- 0x4b, 0xa0, 0x9f, 0xf6, 0x9e, 0xb6, 0xc1, 0xb5, 0xa2, 0x07, 0x89, 0x05, +- 0x22, 0xd2, 0xe6, 0x71, 0x9f, 0xd2, 0x4e, 0x1d, 0xc1, 0x9c, 0x88, 0x0d, +- 0x3e, 0xdf, 0x2d, 0xdd, 0xc4, 0x07, 0x49, 0x3c, 0xbb, 0x8e, 0x7a, 0xbc, +- 0x67, 0x3d, 0xf8, 0x52, 0xcb, 0x62, 0x45, 0x0e, 0xce, 0x41, 0xae, 0x3d, +- 0x5c, 0x1f, 0x47, 0x39, 0x8c, 0xf2, 0x71, 0x94, 0xd4, 0x4f, 0x57, 0x65, +- 0x56, 0xc7, 0x7f, 0x14, 0x0e, 0xa1, 0xed, 0x9c, 0xf6, 0xa9, 0x53, 0x4f, +- 0x8a, 0x3d, 0xf6, 0x41, 0x3c, 0xa3, 0x1f, 0x8f, 0x91, 0xee, 0xff, 0x82, +- 0x89, 0x3f, 0x6d, 0xc7, 0xac, 0x8c, 0x4e, 0x5e, 0x51, 0x31, 0xfc, 0xf5, +- 0xa7, 0xe8, 0x23, 0xff, 0x54, 0x1e, 0xbd, 0x29, 0xb6, 0xb7, 0x1d, 0xcb, +- 0x1a, 0x2f, 0x28, 0x5d, 0x4c, 0x7e, 0x40, 0x0f, 0xbb, 0x19, 0xf9, 0xfa, +- 0x46, 0x0f, 0xf4, 0x5b, 0x5c, 0xde, 0x58, 0x09, 0x80, 0xd5, 0xb9, 0x37, +- 0x47, 0x60, 0x33, 0x5d, 0x83, 0x03, 0xe2, 0xf2, 0x2f, 0x90, 0xf3, 0x7f, +- 0xae, 0x24, 0xe4, 0xcd, 0x4a, 0x10, 0x5c, 0xf3, 0xd3, 0xfe, 0x61, 0x91, +- 0xbb, 0xdb, 0x74, 0x0e, 0x00, 0x6a, 0xe8, 0x73, 0xfb, 0x79, 0x75, 0x76, +- 0x8f, 0x7a, 0xd0, 0x3b, 0x6f, 0x36, 0x7e, 0x01, 0xbe, 0xea, 0x3e, 0x5b, +- 0xdb, 0x6e, 0xe9, 0xb6, 0x3c, 0xfb, 0x4f, 0x6c, 0x4a, 0xda, 0xe4, 0x10, +- 0xa4, 0xd1, 0x36, 0x3d, 0xbc, 0xb6, 0xdd, 0x9e, 0x6d, 0x33, 0xca, 0x5e, +- 0x94, 0xd6, 0x7b, 0xa5, 0xfe, 0x17, 0xdc, 0x2b, 0xf0, 0x63, 0xd5, 0x99, +- 0x11, 0x4b, 0x9e, 0x55, 0xb0, 0x4e, 0xd2, 0xbc, 0x1f, 0x30, 0xef, 0x3d, +- 0x85, 0x5f, 0x9d, 0xed, 0x18, 0x20, 0x7c, 0xdb, 0xe5, 0xd4, 0x69, 0x65, +- 0x47, 0x18, 0xb7, 0x5d, 0xa6, 0x7f, 0x4f, 0x5d, 0x3e, 0x69, 0xec, 0x09, +- 0x7c, 0x8f, 0xda, 0x71, 0x99, 0x51, 0xd7, 0x9f, 0x90, 0x47, 0x5c, 0xf2, +- 0xee, 0xa4, 0xf8, 0x63, 0x1a, 0x4b, 0x89, 0x89, 0x09, 0x76, 0x78, 0x27, +- 0xe1, 0x9b, 0x29, 0x7b, 0xec, 0x7e, 0x4c, 0xc8, 0xe3, 0x36, 0xda, 0x8f, +- 0x9c, 0x6d, 0x01, 0x83, 0x3d, 0x99, 0x91, 0xe7, 0x36, 0x50, 0x17, 0xeb, +- 0xf5, 0x31, 0xc1, 0xfd, 0xb3, 0xb8, 0x67, 0x1c, 0xed, 0xe9, 0xb8, 0x44, +- 0x9e, 0xee, 0x97, 0xf6, 0x33, 0xc4, 0x29, 0xe4, 0x69, 0x42, 0xda, 0xce, +- 0x10, 0x2f, 0x33, 0xb6, 0x9c, 0x1a, 0xbf, 0x21, 0x8c, 0xe5, 0xa4, 0xfc, +- 0x2b, 0xf8, 0x6d, 0x61, 0xde, 0xed, 0xf0, 0xc3, 0xdb, 0x2e, 0xe8, 0x76, +- 0xf6, 0xb9, 0x3e, 0x00, 0xc3, 0x98, 0xd8, 0xf0, 0x59, 0xec, 0x0b, 0x2c, +- 0xbb, 0x50, 0xf2, 0x1d, 0x48, 0x3a, 0x37, 0x60, 0xde, 0x41, 0x37, 0x5e, +- 0xe0, 0xf8, 0xb0, 0x8f, 0xbe, 0xce, 0x17, 0x1d, 0x18, 0xf2, 0xe5, 0xd2, +- 0x1a, 0x65, 0x93, 0x71, 0x74, 0x62, 0x97, 0x57, 0xc5, 0x5e, 0xca, 0x48, +- 0xe4, 0x4c, 0x06, 0x72, 0xe8, 0xc3, 0xee, 0x12, 0xf3, 0xd1, 0xd6, 0xe1, +- 0x39, 0xf0, 0x56, 0xfd, 0x29, 0xce, 0xe9, 0xaa, 0xd8, 0xf5, 0x5f, 0x65, +- 0xc3, 0xc2, 0x7d, 0xc1, 0x31, 0x4e, 0xc2, 0xfe, 0x46, 0xe5, 0x73, 0x71, +- 0xca, 0x8a, 0x96, 0xbd, 0xb4, 0x3d, 0xa4, 0x64, 0xb5, 0x48, 0xbb, 0xfc, +- 0xd4, 0xed, 0x7b, 0xe0, 0xa7, 0x9d, 0x2e, 0x6f, 0xcb, 0x18, 0xf3, 0x42, +- 0x03, 0xa9, 0x02, 0xef, 0xcc, 0x7b, 0x96, 0x2c, 0x78, 0x27, 0x15, 0x1e, +- 0x7c, 0x14, 0xed, 0x4f, 0x98, 0xf6, 0x0b, 0x32, 0x64, 0x64, 0x5d, 0xc5, +- 0x11, 0xa0, 0xc7, 0xb8, 0x66, 0xbc, 0xff, 0x2d, 0xf1, 0x7b, 0xb9, 0x9e, +- 0x27, 0x65, 0x60, 0x4c, 0xe3, 0x90, 0x92, 0x4d, 0x1c, 0xf2, 0xae, 0x71, +- 0x5a, 0x95, 0xcb, 0x57, 0xa8, 0xd0, 0xce, 0xec, 0x85, 0xfc, 0xc2, 0x27, +- 0xda, 0x08, 0x63, 0xb5, 0x6a, 0x5f, 0x25, 0x06, 0x6c, 0x4b, 0xbc, 0xa1, +- 0xa1, 0xe1, 0x12, 0xf0, 0xc9, 0x3c, 0x7c, 0x5e, 0xd2, 0xb1, 0x00, 0x3b, +- 0xb7, 0xe6, 0xff, 0x4b, 0x70, 0x22, 0x9e, 0x3a, 0x3d, 0xf3, 0xae, 0xf1, +- 0xfb, 0x30, 0x6e, 0xdf, 0x7c, 0x9e, 0xb2, 0x69, 0xfd, 0x61, 0xe3, 0x88, +- 0xd2, 0x91, 0x37, 0xe3, 0xae, 0x30, 0x7e, 0x3f, 0x7d, 0x53, 0x1c, 0xb5, +- 0xd4, 0x08, 0x73, 0xf0, 0x42, 0x3d, 0x7f, 0x1a, 0xba, 0x3a, 0x22, 0x37, +- 0x80, 0x41, 0x27, 0xc0, 0xbb, 0x73, 0x6b, 0x65, 0xeb, 0x4a, 0x45, 0xd4, +- 0x7d, 0xc1, 0x67, 0x4e, 0xde, 0x47, 0xc0, 0x3b, 0xd8, 0x98, 0x0d, 0xc7, +- 0x9c, 0x29, 0x39, 0x78, 0x66, 0x2b, 0x9f, 0xb9, 0xa4, 0x74, 0xf3, 0xe1, +- 0x2e, 0x9e, 0xb9, 0x5c, 0x5a, 0xfe, 0x28, 0xee, 0x79, 0xf6, 0x71, 0xa4, +- 0xe5, 0xf9, 0x66, 0x4f, 0x54, 0x63, 0x37, 0xf0, 0x5d, 0xf3, 0xcd, 0x01, +- 0xbf, 0x8b, 0x8c, 0xe7, 0x35, 0x88, 0x83, 0x3b, 0x0d, 0x0e, 0x26, 0xce, +- 0xc2, 0x7a, 0x6d, 0x30, 0x0e, 0x43, 0xac, 0x15, 0x57, 0x7e, 0xa1, 0xc2, +- 0x5e, 0xfe, 0x31, 0x93, 0x7f, 0x71, 0xab, 0x5c, 0xcd, 0x56, 0x42, 0x3c, +- 0xd7, 0x2c, 0x57, 0xee, 0x6f, 0x20, 0x57, 0x13, 0x5d, 0x3a, 0xdf, 0x81, +- 0x36, 0xcd, 0x92, 0x37, 0xaa, 0x7b, 0x64, 0xab, 0xfa, 0x20, 0x70, 0xb4, +- 0xca, 0xfb, 0x90, 0x2d, 0xac, 0xc5, 0x83, 0x95, 0x49, 0x99, 0xa8, 0xc6, +- 0xe4, 0x5a, 0xd5, 0x7e, 0xa0, 0x5d, 0x18, 0x07, 0x27, 0x36, 0xf9, 0x1b, +- 0xa5, 0xdf, 0x7e, 0xe0, 0xef, 0xb4, 0xe7, 0xb9, 0xca, 0x0d, 0xb4, 0x9f, +- 0xad, 0xde, 0x2b, 0x25, 0xd5, 0xbe, 0x7e, 0xcb, 0x18, 0x51, 0x33, 0x46, +- 0xbd, 0x7a, 0x97, 0x89, 0xdf, 0x95, 0xe5, 0x12, 0xb0, 0xaf, 0x7d, 0x96, +- 0xf3, 0xbd, 0xc3, 0xe4, 0x77, 0xc5, 0x9a, 0xfc, 0x91, 0xa8, 0xf1, 0x47, +- 0x7e, 0x06, 0x3d, 0xfe, 0x94, 0x44, 0xbd, 0xb0, 0x2f, 0xe6, 0x6a, 0x27, +- 0x4c, 0x6e, 0xc7, 0x5e, 0xf4, 0x75, 0x10, 0xef, 0xee, 0xc3, 0xef, 0x49, +- 0xd4, 0xa3, 0xbd, 0xe2, 0xd9, 0x28, 0x31, 0x02, 0xcf, 0xeb, 0x7a, 0x51, +- 0xaf, 0x03, 0x58, 0x72, 0xbf, 0x79, 0x16, 0xf6, 0x11, 0xd6, 0x0d, 0xef, +- 0x9b, 0xcf, 0x53, 0x59, 0x2f, 0xd9, 0x74, 0x9e, 0x0a, 0x45, 0xa5, 0xda, +- 0x86, 0xb6, 0x36, 0xb4, 0x51, 0xc9, 0x26, 0x1b, 0xf5, 0x56, 0x53, 0x9e, +- 0xa7, 0xc6, 0x61, 0x57, 0x33, 0x9c, 0x6b, 0x5f, 0x53, 0x0e, 0x4a, 0xaa, +- 0x4c, 0xfb, 0xc8, 0x78, 0xdf, 0x7a, 0x25, 0xb4, 0x1f, 0xb9, 0x1e, 0x9e, +- 0x5b, 0x2c, 0xfa, 0x2a, 0x16, 0x97, 0x8c, 0x64, 0x69, 0x7f, 0xfc, 0xd8, +- 0x16, 0x70, 0x65, 0x5d, 0x9d, 0xeb, 0x47, 0xf0, 0x83, 0x5d, 0x76, 0x2c, +- 0x71, 0x3d, 0x3e, 0x2b, 0x1b, 0xbd, 0x03, 0x5d, 0x6e, 0xab, 0x3a, 0xc9, +- 0xbc, 0xdf, 0x67, 0xee, 0x13, 0xb2, 0x56, 0xf9, 0x50, 0xbf, 0x9d, 0xfd, +- 0x5f, 0xb7, 0xe7, 0x33, 0x3d, 0x3c, 0x7f, 0xc2, 0x33, 0xe2, 0xf5, 0xd7, +- 0x54, 0x4e, 0xa3, 0xc6, 0x46, 0x0e, 0xcf, 0x2f, 0x81, 0x73, 0x7e, 0x04, +- 0x9e, 0x84, 0xb8, 0xfb, 0x75, 0x99, 0x50, 0x98, 0xaa, 0x0d, 0xb6, 0xd2, +- 0x60, 0xaa, 0xee, 0x14, 0x30, 0x15, 0xdb, 0xb7, 0xe2, 0x40, 0xbd, 0x97, +- 0x22, 0x59, 0x1d, 0x57, 0x6d, 0x89, 0x15, 0x5b, 0x8f, 0x64, 0xc4, 0x3a, +- 0x81, 0x1f, 0x65, 0xd4, 0x5e, 0x7a, 0x4d, 0xbc, 0xa5, 0x54, 0x95, 0xf9, +- 0xb1, 0x0b, 0x1b, 0x3c, 0xc7, 0x03, 0x16, 0x4b, 0x50, 0x96, 0xf9, 0x6e, +- 0x1a, 0x63, 0xbc, 0x06, 0xff, 0x73, 0x0f, 0xf8, 0x6d, 0x1b, 0x1e, 0xf9, +- 0x26, 0x46, 0x11, 0x63, 0x2c, 0x18, 0x7b, 0x71, 0x5e, 0x61, 0x89, 0x52, +- 0x7c, 0x11, 0xe5, 0x0f, 0x0d, 0x76, 0x78, 0xbd, 0x2b, 0x3c, 0xb7, 0x2f, +- 0xc5, 0xbf, 0x84, 0xe7, 0xaf, 0xc3, 0x1f, 0x8c, 0x4a, 0x9b, 0x5a, 0xb3, +- 0x10, 0x3b, 0xff, 0x3d, 0xea, 0x90, 0xfe, 0x3b, 0x4d, 0x7e, 0x0d, 0xf3, +- 0x06, 0xd8, 0x1f, 0xec, 0x96, 0xca, 0xe1, 0xca, 0xa1, 0x64, 0x3b, 0xb6, +- 0x79, 0x05, 0x75, 0x73, 0x98, 0x37, 0x9f, 0x4b, 0x5f, 0x44, 0x9a, 0x9f, +- 0x7f, 0x14, 0xcf, 0x29, 0x87, 0xef, 0x37, 0x72, 0x18, 0xbe, 0xcb, 0x1b, +- 0x3e, 0xdd, 0x8e, 0x31, 0xc8, 0xab, 0x66, 0xba, 0x38, 0x9f, 0x70, 0xcd, +- 0xdb, 0x4c, 0xae, 0x01, 0x9f, 0xbd, 0xdf, 0x3c, 0x73, 0xcc, 0x1c, 0x3f, +- 0xde, 0x65, 0xb0, 0x04, 0x76, 0x7b, 0xb8, 0x1f, 0x49, 0x67, 0xac, 0x09, +- 0xb3, 0xfe, 0x61, 0xef, 0x4e, 0x1e, 0x26, 0x65, 0xce, 0x53, 0xb1, 0x23, +- 0xe6, 0x8f, 0xe5, 0x6c, 0x9d, 0xb3, 0xf1, 0x8d, 0x9b, 0xe2, 0xdd, 0x4a, +- 0xd7, 0xf2, 0x0c, 0xa4, 0x6a, 0x67, 0xdb, 0x7f, 0xed, 0xbc, 0xbb, 0x48, +- 0x36, 0x6c, 0x07, 0x9c, 0xa6, 0xda, 0x24, 0x65, 0xae, 0xf1, 0x6e, 0x39, +- 0x7a, 0xca, 0xbf, 0x30, 0x79, 0x10, 0xfb, 0x55, 0x1e, 0x04, 0xf5, 0xe2, +- 0x5a, 0x35, 0x02, 0x5e, 0xf7, 0x31, 0x37, 0x0a, 0x7e, 0x4c, 0x0c, 0x73, +- 0x45, 0x5f, 0xf1, 0xf7, 0xab, 0x5c, 0xa9, 0x88, 0x17, 0xe6, 0xf5, 0x72, +- 0x1f, 0xde, 0xa1, 0xde, 0x7f, 0x7d, 0xa5, 0x9d, 0xf9, 0xaa, 0x28, 0xb9, +- 0x47, 0x7f, 0x09, 0xfd, 0x18, 0x95, 0x42, 0xd5, 0x03, 0xfe, 0x89, 0x52, +- 0x2e, 0xf1, 0x7c, 0x3f, 0xfc, 0x61, 0xc1, 0x3e, 0x69, 0x83, 0x6f, 0xa2, +- 0x7c, 0x1d, 0xcc, 0x68, 0x87, 0x0e, 0x62, 0x70, 0x9d, 0x1f, 0x1a, 0x40, +- 0x87, 0xcf, 0xcb, 0xda, 0xf8, 0xa2, 0xd4, 0xc7, 0x9b, 0x31, 0x2c, 0x30, +- 0xaa, 0x5b, 0x0e, 0xea, 0x9e, 0x8a, 0x65, 0x1a, 0xdd, 0x72, 0xc2, 0xe0, +- 0x4e, 0xae, 0x83, 0x2d, 0x85, 0xd1, 0x05, 0x25, 0x5f, 0x75, 0xb5, 0x1e, +- 0x8e, 0x75, 0x59, 0xe5, 0xf9, 0x72, 0x0c, 0xe6, 0xfa, 0x46, 0x0c, 0x0e, +- 0x3b, 0x65, 0xd6, 0xd5, 0xd9, 0x1b, 0xe6, 0xcc, 0x47, 0xb3, 0x87, 0x99, +- 0xdb, 0x01, 0x6c, 0x3d, 0x3d, 0x35, 0x5b, 0xa1, 0x2d, 0x0c, 0x82, 0xba, +- 0xbf, 0x89, 0x1e, 0x7f, 0xac, 0x30, 0xe4, 0x96, 0x68, 0xdd, 0xbe, 0xa0, +- 0x72, 0x66, 0x27, 0xa7, 0xf2, 0x2a, 0x5e, 0xd8, 0x7c, 0x76, 0xf3, 0x5e, +- 0xe7, 0x36, 0x31, 0xf8, 0xfe, 0x1d, 0x66, 0xfd, 0x63, 0x4e, 0xa9, 0xd2, +- 0xe5, 0xcc, 0xaa, 0xb3, 0xb5, 0xac, 0xf9, 0x16, 0x27, 0x37, 0x95, 0x6e, +- 0x7c, 0x76, 0x2f, 0xb1, 0x3e, 0xcf, 0x31, 0x0a, 0x15, 0x9e, 0xe3, 0xe8, +- 0xf7, 0x69, 0xf3, 0x7e, 0xa0, 0xa1, 0xde, 0xa9, 0x78, 0x23, 0x63, 0x8c, +- 0xed, 0x28, 0x6f, 0x54, 0xa8, 0x6b, 0xd0, 0x7f, 0x5c, 0xcf, 0x21, 0x92, +- 0x2d, 0xc2, 0x3f, 0x25, 0x7d, 0x47, 0xa6, 0xf2, 0x2b, 0xcc, 0xdb, 0x7a, +- 0x68, 0xea, 0x1a, 0xfc, 0xa5, 0x73, 0x9e, 0xce, 0x2b, 0x5f, 0x67, 0x1c, +- 0x8c, 0xed, 0x54, 0x9f, 0x45, 0x13, 0xab, 0x3d, 0x3c, 0x35, 0xb8, 0x1e, +- 0x91, 0x27, 0x4c, 0x1f, 0xbc, 0x4f, 0x6e, 0xfb, 0x52, 0x4a, 0xff, 0xc1, +- 0x3f, 0x18, 0x85, 0x7f, 0xd0, 0x09, 0x5d, 0x4f, 0x3f, 0x83, 0xf8, 0xbb, +- 0x13, 0x7b, 0x85, 0xe3, 0xdc, 0xa5, 0xc6, 0x89, 0x60, 0x9c, 0x59, 0xf8, +- 0x38, 0x8c, 0x47, 0xe6, 0x3d, 0x07, 0x58, 0x02, 0xb6, 0xde, 0x63, 0xbc, +- 0xdc, 0xc6, 0x9c, 0x87, 0xa1, 0x27, 0x98, 0xa3, 0x32, 0x11, 0xe6, 0x0d, +- 0xa1, 0x9d, 0x6f, 0xda, 0x1d, 0x44, 0x3b, 0xfa, 0x07, 0x6c, 0x2b, 0xb7, +- 0xd9, 0x32, 0xa8, 0xb0, 0x81, 0xf6, 0x6b, 0x48, 0x43, 0x0d, 0x73, 0xa5, +- 0x5d, 0xc5, 0x9e, 0x53, 0xf3, 0x3a, 0xa8, 0xda, 0x59, 0xd9, 0x31, 0xd0, +- 0x4e, 0xfc, 0x87, 0xbe, 0x97, 0x75, 0xbc, 0xb3, 0xa0, 0xe4, 0x08, 0x72, +- 0x32, 0x1e, 0xe6, 0xbd, 0xe8, 0x76, 0x61, 0xfd, 0x81, 0xf5, 0x86, 0x19, +- 0xff, 0xe7, 0x41, 0xee, 0x68, 0xa7, 0xf2, 0xad, 0x5f, 0xbe, 0x29, 0x07, +- 0x8d, 0x6d, 0xc2, 0x3a, 0x91, 0x30, 0x2f, 0xb9, 0x89, 0xe6, 0xac, 0x59, +- 0x73, 0xb6, 0x63, 0x6c, 0x58, 0xe5, 0xe2, 0xf3, 0x99, 0x33, 0x97, 0x61, +- 0x1f, 0xcd, 0x67, 0x4d, 0xa3, 0xc0, 0x19, 0xda, 0x86, 0x94, 0x37, 0x3c, +- 0xd8, 0xeb, 0x36, 0xac, 0x1d, 0x6d, 0xc2, 0xa0, 0xf1, 0x2d, 0xde, 0x2b, +- 0xce, 0xca, 0x73, 0xcc, 0x51, 0xf8, 0xf5, 0x61, 0x7b, 0xae, 0x63, 0x6e, +- 0xea, 0x5a, 0xc5, 0x93, 0x53, 0xcb, 0x3a, 0x3f, 0x4c, 0xf3, 0x81, 0x3a, +- 0x9b, 0x6b, 0x9b, 0x94, 0x59, 0x8f, 0xb1, 0x9c, 0xa4, 0xbc, 0xe2, 0x35, +- 0xe7, 0x39, 0xa1, 0xfe, 0xc6, 0xa8, 0xc9, 0xc7, 0x3e, 0x88, 0xf9, 0x13, +- 0x37, 0x6a, 0x59, 0x3a, 0x00, 0x3b, 0xf4, 0x77, 0x0e, 0x70, 0x21, 0xf6, +- 0xd3, 0x75, 0xa7, 0x79, 0x7e, 0xdb, 0xf9, 0xdf, 0x4a, 0x2e, 0x1d, 0xc8, +- 0xc8, 0xe2, 0x36, 0xdf, 0xe1, 0xb7, 0xdf, 0x35, 0x04, 0x7d, 0x6f, 0x49, +- 0x71, 0xd4, 0x4b, 0x2c, 0xf0, 0x5c, 0xc3, 0x1d, 0x01, 0xca, 0xa7, 0x1f, +- 0x9d, 0x04, 0xbd, 0xbc, 0x1e, 0x04, 0x3e, 0x62, 0x4e, 0x22, 0xee, 0x99, +- 0x13, 0x18, 0xf7, 0x40, 0xaf, 0xab, 0xce, 0x2b, 0xb4, 0xce, 0xfe, 0xfe, +- 0x5e, 0xe6, 0xc0, 0xf5, 0x78, 0xe1, 0xda, 0xab, 0xef, 0xda, 0xd0, 0x77, +- 0xc4, 0xbc, 0x9f, 0xd8, 0xe6, 0xbf, 0xf4, 0xb1, 0xdc, 0xce, 0x35, 0x33, +- 0xb1, 0x17, 0xd6, 0x1f, 0x57, 0xb4, 0xcc, 0x42, 0x57, 0xcf, 0xa9, 0xf9, +- 0xdc, 0x0f, 0x59, 0x88, 0xc8, 0xfc, 0xb6, 0xfc, 0xde, 0x0f, 0xf9, 0xdd, +- 0xc3, 0x14, 0xcf, 0x5d, 0x64, 0x2d, 0x94, 0x31, 0xca, 0x17, 0x65, 0xeb, +- 0xe3, 0xdd, 0xdc, 0x73, 0xe5, 0xed, 0x75, 0x77, 0x94, 0xcd, 0x4d, 0xda, +- 0xe1, 0xba, 0xf3, 0x7a, 0xb7, 0xdc, 0xaa, 0x70, 0x7f, 0x64, 0x7e, 0x83, +- 0xb5, 0xf5, 0xcd, 0xda, 0x66, 0x9a, 0xbe, 0x83, 0x08, 0xfb, 0x63, 0x0c, +- 0x94, 0x36, 0x88, 0xe7, 0x50, 0xed, 0x52, 0x56, 0x32, 0x68, 0x29, 0x6c, +- 0x9d, 0x73, 0xf3, 0x49, 0xc6, 0xbc, 0x8f, 0xc9, 0xbf, 0x03, 0xcd, 0xb9, +- 0xe1, 0xa8, 0xe8, 0xb6, 0x33, 0xe0, 0xf7, 0xa6, 0x0b, 0x7f, 0x90, 0x67, +- 0xd6, 0x15, 0x47, 0xce, 0xa9, 0x73, 0x57, 0xec, 0xd1, 0x4e, 0x47, 0x16, +- 0xbd, 0xed, 0x73, 0x78, 0xa9, 0xa1, 0xce, 0x1a, 0xde, 0x3d, 0xb1, 0x4d, +- 0x1b, 0xfd, 0x09, 0xf8, 0x52, 0xde, 0xcf, 0x83, 0x52, 0xfc, 0xa6, 0xba, +- 0x46, 0xaf, 0x33, 0x4e, 0xc3, 0xf3, 0x01, 0x57, 0x0a, 0xf0, 0x0b, 0x0b, +- 0xf0, 0x09, 0x0b, 0x4a, 0x2f, 0x30, 0x6e, 0xc3, 0x18, 0x5b, 0x19, 0x3e, +- 0x48, 0x39, 0x68, 0xf7, 0x4e, 0xaa, 0x18, 0xe2, 0xa5, 0x8d, 0x54, 0xb9, +- 0x2c, 0x5e, 0xf2, 0xc1, 0xed, 0x7c, 0xba, 0xee, 0x72, 0x2c, 0xdb, 0x1c, +- 0x87, 0x4b, 0xaa, 0x5c, 0xb4, 0x0e, 0x60, 0xe4, 0xe3, 0xd0, 0xd5, 0xcf, +- 0xfb, 0x8c, 0xbf, 0xdd, 0x49, 0x7e, 0x7f, 0x95, 0x93, 0xb4, 0x87, 0x46, +- 0xc5, 0xbb, 0xe0, 0x0d, 0x3f, 0x28, 0xf4, 0x3f, 0x52, 0xc9, 0x23, 0xe4, +- 0xdb, 0xf6, 0x37, 0x0d, 0xa1, 0x7d, 0x1d, 0x95, 0xc1, 0x0b, 0xaf, 0xab, +- 0x33, 0x8e, 0x4f, 0xf8, 0xad, 0xb2, 0xa1, 0xe2, 0x77, 0xa3, 0x3d, 0x32, +- 0x08, 0xdf, 0x57, 0x60, 0xa1, 0xf8, 0x8d, 0x83, 0x05, 0xdf, 0x43, 0xdd, +- 0xcb, 0x74, 0x23, 0x69, 0xf2, 0x54, 0x69, 0x5f, 0x19, 0xdf, 0xd3, 0x79, +- 0x7a, 0xcc, 0x4d, 0x65, 0xfe, 0x64, 0x51, 0xe5, 0xeb, 0x31, 0xd6, 0xc7, +- 0x58, 0x1e, 0xe3, 0x7d, 0x8c, 0xdb, 0xe9, 0x5c, 0xbd, 0x89, 0xc6, 0x6e, +- 0xb1, 0xbd, 0x30, 0x5f, 0x52, 0xdb, 0xad, 0xad, 0xcc, 0x3e, 0xd8, 0x3a, +- 0x57, 0xc5, 0x4e, 0x4a, 0x6e, 0x8f, 0x1c, 0x1b, 0x6e, 0x07, 0xcf, 0x7b, +- 0x55, 0x3e, 0x9d, 0xed, 0xdd, 0x0f, 0x1c, 0xcb, 0xf8, 0x1c, 0xb1, 0x69, +- 0xc8, 0xe7, 0x7b, 0xf0, 0xec, 0x1d, 0xf0, 0x9e, 0xcf, 0x80, 0x5b, 0x95, +- 0x1d, 0xfa, 0xbc, 0x6c, 0x55, 0x98, 0x03, 0x5f, 0xdb, 0x97, 0x57, 0xeb, +- 0x41, 0xdf, 0x3c, 0xd4, 0x4d, 0x61, 0xfe, 0x28, 0x7d, 0x2a, 0xd7, 0x9c, +- 0x93, 0xd3, 0x37, 0xef, 0x85, 0xbf, 0x4e, 0xfd, 0x63, 0xa9, 0xb1, 0xae, +- 0x47, 0x3e, 0x20, 0xe5, 0xda, 0x6e, 0x67, 0xfe, 0x41, 0xf0, 0x0d, 0x5f, +- 0xe5, 0xac, 0xc2, 0x9f, 0xd4, 0x6b, 0xac, 0xbf, 0x8f, 0x74, 0x76, 0xf2, +- 0xcb, 0xe3, 0xda, 0x67, 0xcc, 0xf5, 0x02, 0xb3, 0x78, 0xa7, 0xbb, 0x77, +- 0xb0, 0xf3, 0x2f, 0x0d, 0xae, 0x25, 0x6e, 0xee, 0x55, 0xd8, 0xc0, 0xae, +- 0x87, 0x72, 0xc2, 0x7c, 0x1f, 0x62, 0xea, 0x03, 0x92, 0xab, 0x41, 0x6f, +- 0xf6, 0xf1, 0xfe, 0x47, 0xa6, 0x2d, 0xaf, 0x03, 0x39, 0x3c, 0xd6, 0x7a, +- 0x96, 0x3f, 0xae, 0x71, 0x7d, 0x67, 0x78, 0x9e, 0x1f, 0xe6, 0xbc, 0xdf, +- 0x94, 0x5b, 0x0b, 0x79, 0x0a, 0x69, 0xd0, 0x63, 0x4d, 0x80, 0xde, 0x7a, +- 0x35, 0x21, 0xbd, 0x1e, 0xf3, 0x84, 0x22, 0x32, 0xd6, 0x9b, 0x82, 0x13, +- 0xaf, 0xe9, 0xa9, 0xd7, 0x60, 0xf3, 0xab, 0x21, 0x9d, 0x1a, 0xe3, 0xd7, +- 0x6b, 0x7c, 0x9f, 0xc4, 0x58, 0xed, 0x32, 0xd6, 0x47, 0x3e, 0xb7, 0xd2, +- 0x91, 0x34, 0xf9, 0xdc, 0xad, 0xcf, 0xef, 0x6b, 0xa2, 0xef, 0xd6, 0xef, +- 0x4a, 0xf3, 0x8c, 0x8b, 0xad, 0xd0, 0x3f, 0x21, 0x8d, 0xbd, 0xd0, 0x73, +- 0x98, 0xa3, 0x1f, 0xfa, 0x1a, 0x21, 0x5f, 0x42, 0x1f, 0x25, 0xaa, 0xe4, +- 0x62, 0x36, 0xc3, 0xb9, 0x44, 0x8d, 0xcf, 0x42, 0xba, 0x14, 0x6d, 0x11, +- 0x9e, 0x25, 0x46, 0xbd, 0xcf, 0xec, 0xd3, 0xeb, 0xff, 0xa4, 0x99, 0xaf, +- 0x6b, 0xea, 0xb0, 0xaf, 0xfd, 0x68, 0xff, 0xb5, 0x00, 0x63, 0x31, 0x08, +- 0x87, 0xfd, 0x1f, 0x62, 0xf7, 0xfd, 0xba, 0xaf, 0xce, 0x10, 0xbf, 0x87, +- 0xdf, 0xa1, 0x91, 0x4e, 0xee, 0xaf, 0x90, 0x87, 0xec, 0xa3, 0xd7, 0xc4, +- 0x5c, 0x49, 0x43, 0x47, 0x0b, 0x0d, 0x29, 0xff, 0x66, 0x1d, 0x77, 0x4f, +- 0xd3, 0xdc, 0x29, 0x6b, 0xdd, 0xb2, 0x50, 0xed, 0x94, 0xf9, 0xaa, 0xf2, +- 0x75, 0x86, 0x45, 0x88, 0xed, 0xb8, 0x2f, 0x55, 0x2e, 0xb3, 0xc9, 0x99, +- 0x0c, 0xf7, 0x67, 0x37, 0xea, 0xd1, 0x86, 0xa0, 0xac, 0x69, 0xfd, 0x54, +- 0x93, 0x5b, 0xbf, 0xd3, 0x98, 0x6b, 0xb4, 0xe6, 0xe3, 0x5d, 0x6f, 0xca, +- 0xc7, 0x6b, 0xce, 0x7f, 0x2a, 0xcb, 0x23, 0x07, 0x3b, 0x64, 0xe0, 0x6c, +- 0xa7, 0x91, 0xd1, 0xfb, 0xcd, 0x38, 0x18, 0x6f, 0x69, 0x5c, 0x06, 0x96, +- 0xbe, 0x28, 0xa5, 0x69, 0x95, 0xff, 0xde, 0xf4, 0xfd, 0xc3, 0xa0, 0xf9, +- 0xfe, 0x29, 0x67, 0x31, 0x17, 0xa6, 0xb0, 0x84, 0xf5, 0x3a, 0x98, 0x1a, +- 0x4e, 0xda, 0xfc, 0x46, 0xf7, 0x31, 0x19, 0x58, 0x1d, 0x97, 0xf4, 0x12, +- 0x31, 0x03, 0xb3, 0x01, 0x52, 0x2a, 0x2e, 0x9a, 0xbe, 0xa8, 0xfb, 0xf3, +- 0x96, 0xf8, 0x3e, 0x0d, 0xbc, 0xca, 0xf7, 0x85, 0x44, 0x44, 0x65, 0x0c, +- 0x7c, 0x10, 0xf2, 0xd4, 0x66, 0xf0, 0x80, 0x23, 0xf9, 0x25, 0xb6, 0x27, +- 0xf6, 0xf8, 0x47, 0xac, 0x59, 0x21, 0x69, 0x0b, 0xdb, 0xa8, 0xfe, 0x70, +- 0x1d, 0xc6, 0xd3, 0xc9, 0xeb, 0x51, 0x59, 0x6f, 0x78, 0xd8, 0x13, 0xfa, +- 0x9b, 0x89, 0x52, 0x2d, 0xcc, 0x27, 0x7d, 0xc4, 0xc4, 0x00, 0x34, 0x8d, +- 0xc5, 0x4a, 0xab, 0xec, 0x3d, 0x63, 0xbe, 0x9d, 0xe8, 0x50, 0x67, 0x68, +- 0x4d, 0xfa, 0xcf, 0xd4, 0xbf, 0xdd, 0x65, 0xde, 0x80, 0x08, 0xdf, 0x37, +- 0xf9, 0x24, 0xf1, 0xb8, 0xda, 0x07, 0x03, 0xf5, 0xb0, 0xde, 0xa8, 0xab, +- 0x7d, 0x60, 0xf2, 0x29, 0x6b, 0x68, 0x1e, 0x83, 0xcf, 0xc3, 0x67, 0x07, +- 0xd0, 0x96, 0xeb, 0x84, 0xb2, 0x7e, 0x40, 0xe5, 0x39, 0x46, 0xb2, 0x47, +- 0xcc, 0x59, 0x5a, 0x9f, 0x1a, 0xcb, 0xcd, 0xb2, 0xff, 0x50, 0x37, 0x74, +- 0x34, 0x8d, 0xdf, 0x4a, 0x2f, 0x7d, 0xf8, 0x9f, 0x19, 0x79, 0xe1, 0x7b, +- 0xde, 0xb7, 0xd6, 0xf9, 0xa3, 0x7d, 0xe1, 0x7b, 0x67, 0xfb, 0x1b, 0x0c, +- 0xf2, 0x92, 0x67, 0x80, 0x28, 0x2f, 0x32, 0x97, 0x9d, 0xd7, 0x28, 0xcd, +- 0xb7, 0x25, 0xce, 0x12, 0x7f, 0xad, 0xfd, 0x38, 0xe8, 0x3b, 0xdc, 0xb3, +- 0xbb, 0xe5, 0x06, 0x51, 0x17, 0x9f, 0xb6, 0xb6, 0x2a, 0x8c, 0x5d, 0x94, +- 0xe5, 0x58, 0xa6, 0x5b, 0x66, 0xab, 0x36, 0xbf, 0x4d, 0x65, 0x2c, 0x96, +- 0x67, 0x95, 0x32, 0xa7, 0x74, 0xdc, 0x90, 0xe8, 0xef, 0x76, 0x3b, 0xa4, +- 0xe8, 0x52, 0x9e, 0x87, 0x64, 0xbd, 0x36, 0xdd, 0x94, 0x03, 0xdc, 0x66, +- 0xe4, 0xec, 0xef, 0xa2, 0xd2, 0xc9, 0x38, 0x52, 0xb8, 0xa7, 0x87, 0xa4, +- 0x58, 0x6b, 0x3e, 0x67, 0x60, 0x9e, 0x11, 0xe5, 0xb6, 0xbf, 0x69, 0xef, +- 0x31, 0x57, 0x0f, 0xb8, 0x2a, 0x4e, 0x9f, 0x95, 0xf5, 0xf6, 0x1a, 0x7b, +- 0xfb, 0x15, 0xac, 0xc7, 0xfb, 0x2d, 0xf1, 0x48, 0x1b, 0x6c, 0x84, 0xc9, +- 0x35, 0x3e, 0x1c, 0x2f, 0xc3, 0x3f, 0x1b, 0x32, 0xe3, 0xde, 0x81, 0x7b, +- 0xd6, 0xdd, 0x67, 0xde, 0xef, 0x37, 0xf7, 0x9d, 0xe6, 0x3e, 0x82, 0x7b, +- 0xe6, 0x8d, 0xb3, 0x4f, 0x96, 0xfc, 0x9e, 0x88, 0xdf, 0xeb, 0x64, 0x25, +- 0x7a, 0x11, 0xe8, 0xa9, 0xd1, 0x29, 0x9f, 0xae, 0x29, 0xfe, 0x5a, 0xde, +- 0x12, 0x01, 0xc1, 0x7e, 0x73, 0x7d, 0xeb, 0x1e, 0xfc, 0xdc, 0x4d, 0xdf, +- 0x4a, 0x55, 0x8c, 0xac, 0x34, 0xd3, 0x9b, 0x03, 0xad, 0xef, 0x96, 0x83, +- 0x45, 0x1b, 0xa5, 0xfd, 0xc6, 0x62, 0x45, 0xe7, 0x1a, 0x1d, 0x83, 0xdf, +- 0x78, 0xb8, 0xfa, 0xa8, 0xab, 0xf3, 0x62, 0xc2, 0x5c, 0xca, 0x4e, 0xcc, +- 0x6b, 0xc8, 0x9c, 0x5b, 0xb3, 0x2d, 0x73, 0x3a, 0xc3, 0xf3, 0x99, 0x66, +- 0xac, 0x4a, 0x5b, 0x44, 0x3b, 0xc3, 0xef, 0x9a, 0x7c, 0xd4, 0x5d, 0xa4, +- 0xae, 0x69, 0xca, 0xcd, 0xff, 0x52, 0x4b, 0x6e, 0x3e, 0xbf, 0xfb, 0x16, +- 0xf9, 0x6f, 0x0d, 0xc6, 0x95, 0x3a, 0x24, 0x72, 0x36, 0xcc, 0xc1, 0xe2, +- 0x1a, 0x13, 0x87, 0xf1, 0x7b, 0xef, 0xa9, 0x5d, 0x62, 0x4e, 0xa1, 0x9c, +- 0x7f, 0xc7, 0x65, 0x7e, 0xab, 0x9b, 0x0d, 0xe3, 0x54, 0xcc, 0xeb, 0x21, +- 0xe6, 0x3a, 0x60, 0x62, 0x0a, 0x7c, 0x57, 0x96, 0x9e, 0x83, 0x53, 0xdc, +- 0x1b, 0xbf, 0x1d, 0xd9, 0xce, 0xfd, 0x57, 0xe3, 0xc4, 0x35, 0x86, 0xe4, +- 0x77, 0xe3, 0x3e, 0xf6, 0xd5, 0x9e, 0xcd, 0xf0, 0x9b, 0x8c, 0xcb, 0x8d, +- 0x8c, 0xfa, 0xf6, 0x83, 0x67, 0x1e, 0x5b, 0x0d, 0xee, 0x3b, 0x7e, 0x23, +- 0x9e, 0x55, 0x39, 0x01, 0x5b, 0xe6, 0x9b, 0xe7, 0xab, 0x0d, 0xfd, 0x1d, +- 0xcb, 0xe2, 0xb2, 0xca, 0xcb, 0x07, 0x56, 0x4b, 0xe2, 0x3d, 0x73, 0xe8, +- 0xfa, 0x55, 0x2e, 0xc1, 0x7c, 0xe3, 0x53, 0x28, 0x3f, 0x2f, 0x6b, 0x15, +- 0x1d, 0x7f, 0x9d, 0x6f, 0x30, 0xa7, 0xc0, 0x55, 0x67, 0x44, 0x03, 0x4b, +- 0x45, 0x8c, 0x17, 0x7e, 0xb3, 0x1d, 0xc7, 0x33, 0xd2, 0x57, 0x36, 0x7b, +- 0x34, 0xcc, 0x05, 0xe9, 0xea, 0xa1, 0x4d, 0x28, 0x37, 0xba, 0x54, 0x1e, +- 0x82, 0xc6, 0x23, 0xc4, 0x7a, 0x31, 0xd4, 0xe5, 0x5c, 0x3b, 0x69, 0xaf, +- 0x02, 0xea, 0xa4, 0x34, 0xc6, 0xa9, 0xab, 0xdc, 0x44, 0xf2, 0xd9, 0x73, +- 0x4b, 0xf4, 0xd7, 0x94, 0x8e, 0x4f, 0x0d, 0xcf, 0x48, 0xc1, 0x8d, 0xc2, +- 0x17, 0x9b, 0x57, 0x7e, 0xce, 0xfd, 0xc0, 0xd0, 0x5d, 0x9b, 0x91, 0x2c, +- 0xe7, 0xc6, 0xb1, 0xe9, 0x87, 0xe8, 0xf9, 0xe8, 0x33, 0x02, 0xb1, 0xe6, +- 0xd5, 0xf7, 0x8f, 0x7c, 0xce, 0x78, 0x6f, 0xf8, 0xcd, 0x90, 0xfe, 0x26, +- 0x64, 0xa6, 0x71, 0x44, 0x4e, 0x55, 0xf6, 0xf2, 0x5b, 0x09, 0x7f, 0x0b, +- 0x7c, 0x3b, 0xd6, 0xe8, 0x52, 0xdf, 0xa5, 0xcc, 0x34, 0x98, 0x3f, 0x17, +- 0xda, 0x1e, 0xae, 0x55, 0xdc, 0x7c, 0x37, 0x91, 0x30, 0xdf, 0x4d, 0xf0, +- 0xdb, 0x8f, 0x1f, 0xed, 0x0d, 0xf7, 0xfb, 0xad, 0x38, 0x9c, 0x32, 0xf8, +- 0xa7, 0xf0, 0x0d, 0xc3, 0x3c, 0x4c, 0xe6, 0x8b, 0x06, 0xc1, 0x31, 0x9f, +- 0xf1, 0xdb, 0xe9, 0xc3, 0x6b, 0x98, 0xe3, 0x95, 0x1a, 0x78, 0x78, 0x94, +- 0xcf, 0x98, 0x37, 0xd6, 0x2e, 0xf9, 0xd1, 0x76, 0xea, 0xf2, 0xce, 0x35, +- 0x6f, 0xaf, 0x5c, 0xae, 0xc6, 0x55, 0x0e, 0x5c, 0x09, 0x38, 0xbf, 0x2e, +- 0x1f, 0xeb, 0xe1, 0xd9, 0xdd, 0x84, 0x6a, 0x1f, 0xee, 0x77, 0x1d, 0x37, +- 0x98, 0x58, 0xd7, 0xfa, 0xe4, 0x78, 0x06, 0xb8, 0xe5, 0x82, 0x58, 0x7f, +- 0x90, 0xe9, 0x87, 0xef, 0xcd, 0xb1, 0xd2, 0x68, 0x07, 0xd9, 0x49, 0x70, +- 0xaf, 0xbf, 0x13, 0xd4, 0x41, 0xef, 0x8d, 0x06, 0xf1, 0x3a, 0x30, 0xd4, +- 0x34, 0xdb, 0x64, 0xc5, 0x3e, 0xc3, 0x3a, 0xbd, 0x90, 0xbf, 0x28, 0xe6, +- 0xe3, 0xc0, 0x17, 0xd8, 0x27, 0x75, 0x97, 0xef, 0x1c, 0x7d, 0xa6, 0x12, +- 0x0f, 0xfd, 0x94, 0xef, 0x81, 0x7f, 0x49, 0xa5, 0x93, 0xc2, 0xf3, 0x4e, +- 0xe6, 0xb3, 0xce, 0x56, 0x27, 0xb1, 0x87, 0x1c, 0x83, 0xcd, 0x1c, 0xf4, +- 0xf1, 0xe1, 0x1e, 0x8d, 0x15, 0x78, 0x1e, 0xaa, 0xb1, 0x88, 0xb6, 0x31, +- 0x3c, 0xdf, 0x71, 0xe0, 0x0b, 0x84, 0xfb, 0xf2, 0x99, 0x7d, 0x37, 0x7f, +- 0x0b, 0x43, 0x1c, 0x93, 0x4e, 0x9c, 0xe7, 0x79, 0xdc, 0xc6, 0xc3, 0x32, +- 0x03, 0x9a, 0x4f, 0x9b, 0x79, 0x3e, 0x98, 0xf1, 0xe4, 0x7a, 0x8d, 0xe7, +- 0x95, 0x07, 0x50, 0x32, 0xd7, 0x91, 0x34, 0x8f, 0x98, 0x7c, 0xce, 0x2c, +- 0xe6, 0xfa, 0x98, 0xbc, 0x01, 0x7c, 0xfd, 0x66, 0x25, 0xed, 0x4f, 0xa8, +- 0x3c, 0xa4, 0x54, 0xe2, 0xb2, 0x8c, 0x24, 0xe9, 0x03, 0x96, 0xdd, 0x54, +- 0xe2, 0x3a, 0xe4, 0xe1, 0x46, 0xe5, 0x99, 0x1e, 0xfe, 0xaf, 0x8a, 0x3a, +- 0xec, 0xe1, 0x0d, 0x95, 0x83, 0x94, 0x62, 0xcc, 0x04, 0xf7, 0xfd, 0x26, +- 0x0f, 0x8a, 0xe3, 0xf0, 0x5d, 0xbf, 0xbc, 0x51, 0xd9, 0xb6, 0xbf, 0x1c, +- 0xc7, 0x7c, 0x03, 0xcf, 0xb1, 0x2e, 0xf4, 0x50, 0x0f, 0x71, 0x3c, 0xdd, +- 0x47, 0x58, 0x87, 0x7c, 0x0d, 0xe3, 0x9a, 0xea, 0x5b, 0xcb, 0xa4, 0x58, +- 0x96, 0xb4, 0x79, 0x9c, 0xfb, 0x54, 0x8f, 0xc6, 0x40, 0x6c, 0x97, 0x76, +- 0x0f, 0xab, 0xfe, 0x78, 0xb6, 0xc7, 0xf3, 0xaf, 0xb0, 0x1f, 0xe6, 0x43, +- 0x31, 0xe7, 0x8a, 0xba, 0xaf, 0x99, 0x06, 0x6d, 0xff, 0xdf, 0x50, 0xb1, +- 0xf4, 0x71, 0xd4, 0xa7, 0x8d, 0x86, 0xbc, 0xd4, 0x12, 0xdb, 0xdf, 0x7c, +- 0x68, 0x5e, 0xf2, 0xfa, 0x99, 0xed, 0x6f, 0x32, 0xec, 0xbb, 0x5d, 0xf3, +- 0x3e, 0xc4, 0xa5, 0xfd, 0xd8, 0xaf, 0x8f, 0x49, 0x7d, 0x25, 0x9d, 0xf8, +- 0xb4, 0x84, 0xfd, 0x06, 0x87, 0x78, 0xde, 0x51, 0xcc, 0x8c, 0xb8, 0x0b, +- 0x8a, 0x9e, 0x54, 0x82, 0x39, 0xc8, 0x97, 0x31, 0x5e, 0xbd, 0xd1, 0x1a, +- 0x7b, 0x48, 0xe5, 0x36, 0x25, 0xed, 0xeb, 0xb5, 0x19, 0x92, 0x4d, 0xac, +- 0xcd, 0x9f, 0x9b, 0xb5, 0xf9, 0x18, 0xfa, 0xf6, 0xce, 0x8c, 0x4a, 0xfa, +- 0x4c, 0x3a, 0x79, 0x5a, 0x78, 0x96, 0xb8, 0x8f, 0x31, 0x2c, 0xeb, 0xc1, +- 0x4c, 0x12, 0xf3, 0x4d, 0x61, 0xbe, 0x28, 0x1b, 0xbc, 0x1e, 0x81, 0x6f, +- 0xbe, 0x87, 0x7b, 0xfb, 0x10, 0x75, 0x26, 0x79, 0x51, 0x54, 0xef, 0x80, +- 0x4f, 0x9e, 0x26, 0x4d, 0x00, 0xca, 0x9d, 0x29, 0x15, 0x07, 0xbc, 0xde, +- 0xe0, 0xf9, 0xa2, 0xa6, 0xaf, 0x00, 0xfa, 0xe6, 0x34, 0x7d, 0xc9, 0x99, +- 0x6d, 0xec, 0x9a, 0x4a, 0x9c, 0x12, 0xe2, 0x25, 0xe2, 0x17, 0xe2, 0xfa, +- 0x47, 0x7a, 0xc3, 0x6f, 0x5a, 0xf2, 0x77, 0xe7, 0xb6, 0xe7, 0xde, 0x86, +- 0xba, 0x57, 0x32, 0x2a, 0xbf, 0xd9, 0x3d, 0x22, 0x1f, 0x91, 0xdc, 0xa7, +- 0x52, 0xc9, 0x9c, 0xe5, 0x19, 0x0c, 0x88, 0xb2, 0xc6, 0x6b, 0xea, 0x5c, +- 0xcf, 0x60, 0x0b, 0xae, 0x4d, 0x06, 0x63, 0x29, 0xde, 0xc2, 0x67, 0xea, +- 0x87, 0xcc, 0x53, 0xd6, 0x7e, 0x07, 0x7b, 0x48, 0xff, 0x9f, 0x8e, 0xcb, +- 0xe0, 0xe3, 0x3c, 0xf8, 0x78, 0xfc, 0x16, 0x0c, 0x16, 0xdd, 0xc6, 0x60, +- 0x5b, 0x6a, 0xbc, 0x7b, 0x41, 0x53, 0xc1, 0x25, 0xfe, 0x9a, 0xdf, 0x96, +- 0x15, 0xd2, 0x34, 0xca, 0xff, 0xb5, 0x23, 0x57, 0x33, 0x5c, 0x0f, 0x60, +- 0x30, 0xf4, 0xb7, 0xb6, 0x23, 0x4b, 0x98, 0xbf, 0x92, 0x5f, 0xc8, 0x6e, +- 0xca, 0x75, 0x2c, 0xae, 0x05, 0xfb, 0x13, 0xeb, 0x1a, 0x68, 0xd9, 0x52, +- 0x72, 0xa0, 0x65, 0x60, 0xab, 0xd6, 0xf9, 0x1e, 0x32, 0xc0, 0x79, 0x52, +- 0xfe, 0x42, 0xd9, 0xdb, 0xc9, 0xa7, 0xe8, 0x00, 0x4f, 0x3e, 0x78, 0x4f, +- 0x56, 0xf2, 0x67, 0x78, 0x16, 0x26, 0xd6, 0xc8, 0x3d, 0x94, 0x49, 0xe2, +- 0x04, 0x60, 0xc8, 0x04, 0x79, 0xac, 0xf1, 0xe0, 0xcc, 0xb3, 0x7b, 0xf1, +- 0x7b, 0xb3, 0x87, 0x39, 0x33, 0xf9, 0x73, 0xd4, 0x57, 0x62, 0xdd, 0x79, +- 0x8f, 0xf6, 0x0f, 0x6f, 0xc4, 0xc1, 0x73, 0xbc, 0x1f, 0x78, 0xb2, 0x0d, +- 0xfa, 0xca, 0x31, 0xf3, 0xe6, 0x3d, 0xf9, 0x8a, 0xf2, 0xd9, 0x29, 0xa3, +- 0x03, 0xa8, 0x47, 0xc4, 0xec, 0x8b, 0xb2, 0xcc, 0x31, 0x46, 0x9f, 0xe9, +- 0x94, 0x09, 0xe8, 0xb5, 0x23, 0x95, 0x71, 0xf9, 0x72, 0xa5, 0x4b, 0xe1, +- 0x86, 0xbf, 0xf6, 0xd3, 0x89, 0x61, 0x2b, 0x90, 0x07, 0x81, 0x7f, 0x66, +- 0xfa, 0xdb, 0xe4, 0xcd, 0x51, 0x9d, 0xfb, 0x7b, 0x83, 0xc9, 0x8d, 0x2e, +- 0xf3, 0x55, 0x39, 0x1f, 0xe8, 0x7d, 0x0b, 0xbe, 0x80, 0xd5, 0x2e, 0x33, +- 0xf1, 0x2e, 0xf9, 0xb8, 0x8f, 0xf2, 0x36, 0x5f, 0x7d, 0x63, 0x9c, 0x8b, +- 0x37, 0xeb, 0x91, 0x37, 0xcd, 0xd8, 0x5f, 0x34, 0xe5, 0xbf, 0xe9, 0x6d, +- 0xa2, 0xc5, 0x9a, 0xcb, 0x44, 0xd4, 0xfc, 0xe6, 0x6b, 0xd4, 0x6f, 0x6c, +- 0x03, 0x7d, 0xd2, 0xe0, 0x39, 0x51, 0x59, 0xd6, 0xa0, 0x5f, 0x4a, 0x55, +- 0xb1, 0xce, 0x65, 0x80, 0xa8, 0x3d, 0x8d, 0x3f, 0x4b, 0x90, 0xaf, 0xd9, +- 0xaa, 0x8a, 0x59, 0xaa, 0xbc, 0xed, 0x59, 0x60, 0x5d, 0xf8, 0xc4, 0xc0, +- 0x10, 0x26, 0x7f, 0xa5, 0x93, 0xf1, 0x90, 0x66, 0x1d, 0x16, 0xfe, 0x2f, +- 0x9d, 0xff, 0xd4, 0x2b, 0xdd, 0x65, 0xac, 0x4b, 0x88, 0xb9, 0xc1, 0x53, +- 0x8c, 0x99, 0x57, 0xeb, 0x14, 0xae, 0x09, 0x75, 0x4f, 0x73, 0xbe, 0x78, +- 0x88, 0x39, 0xb8, 0x67, 0x69, 0x2f, 0xa4, 0x1c, 0x03, 0xa6, 0xed, 0x38, +- 0x03, 0xdb, 0x5d, 0xcd, 0x42, 0x56, 0xc6, 0x55, 0xde, 0xe7, 0x3c, 0xb0, +- 0xdb, 0x1f, 0xf8, 0x7f, 0x2a, 0xf6, 0xd3, 0x07, 0x64, 0xad, 0xda, 0x01, +- 0x7e, 0xd0, 0x2e, 0x44, 0x95, 0x7f, 0x7d, 0xe3, 0x28, 0xed, 0x1d, 0x6d, +- 0x89, 0x5e, 0x8b, 0xad, 0xda, 0xf7, 0x7a, 0xf5, 0xb7, 0x33, 0x7b, 0x65, +- 0xb3, 0x16, 0xda, 0x42, 0xf8, 0x87, 0xd5, 0xa8, 0xb1, 0xcb, 0x9d, 0xd0, +- 0xdd, 0xdf, 0x8f, 0xd6, 0x95, 0xaf, 0xce, 0xf9, 0xd3, 0x06, 0x45, 0x99, +- 0x17, 0xd7, 0x59, 0xf7, 0x38, 0xf7, 0x66, 0x1b, 0xa4, 0x71, 0x87, 0x7b, +- 0x90, 0xe3, 0x31, 0x87, 0x82, 0x73, 0x8c, 0x4b, 0xf4, 0xfc, 0x63, 0x62, +- 0xc3, 0x6f, 0x89, 0x2c, 0x11, 0xeb, 0xdd, 0xec, 0xbb, 0x44, 0x2e, 0xba, +- 0xe6, 0x5b, 0xec, 0x41, 0x8d, 0x65, 0x32, 0x28, 0xeb, 0xe1, 0xf7, 0xd9, +- 0xfc, 0x35, 0xdb, 0xcd, 0xd0, 0xb7, 0xd8, 0xd5, 0x96, 0xe2, 0xef, 0xff, +- 0x01, 0x37, 0x64, 0x26, 0x2b, 0x1c, 0x4c, 0x00, 0x00, 0x00 }; ++ 0xcd, 0x7c, 0x7d, 0x70, 0x1c, 0xe7, 0x79, 0xdf, 0xb3, 0x7b, 0x7b, 0xc0, ++ 0x01, 0x04, 0x81, 0x25, 0x7c, 0x82, 0x8f, 0x14, 0x2c, 0xdf, 0xe1, 0x16, ++ 0x1f, 0x12, 0x60, 0x79, 0x85, 0x1e, 0x69, 0xd8, 0xd9, 0x58, 0xa7, 0xbb, ++ 0x23, 0x45, 0x99, 0xb4, 0x03, 0x4a, 0xf4, 0x44, 0xad, 0x35, 0x0d, 0x72, ++ 0x00, 0x65, 0xca, 0xa3, 0x4c, 0x18, 0x49, 0x7f, 0xc8, 0x1d, 0x8d, 0xb9, ++ 0x3a, 0x80, 0x32, 0xdd, 0x39, 0xe2, 0x4e, 0x20, 0x44, 0x3b, 0x33, 0xae, ++ 0x73, 0x3e, 0x80, 0x94, 0xdb, 0x2c, 0x09, 0x4a, 0x56, 0x12, 0xcd, 0x34, ++ 0xae, 0x30, 0x20, 0x29, 0x3b, 0x9d, 0x64, 0xaa, 0xb4, 0x9e, 0xd4, 0xe3, ++ 0xb4, 0x53, 0x96, 0x72, 0x6a, 0xb5, 0x93, 0x64, 0xec, 0x19, 0xa7, 0x71, ++ 0x6b, 0xd9, 0xd7, 0xdf, 0xef, 0x7d, 0x77, 0xc1, 0x23, 0x48, 0x49, 0x4e, ++ 0xfe, 0x2a, 0x66, 0x6e, 0x76, 0xf7, 0xfd, 0xda, 0xe7, 0x7d, 0xbe, 0x9f, ++ 0xe7, 0x7d, 0x16, 0x25, 0x91, 0x6e, 0x09, 0xff, 0xb6, 0xe3, 0xb7, 0xfb, ++ 0xb7, 0x7e, 0x7b, 0xd6, 0xbd, 0xdb, 0xbd, 0x1b, 0xb7, 0x9f, 0x35, 0x45, ++ 0xe2, 0x6c, 0x8f, 0xe1, 0x97, 0xc4, 0x6f, 0x32, 0xbc, 0xbf, 0xd5, 0x9f, ++ 0x8d, 0xdf, 0x1e, 0x43, 0x64, 0xe6, 0x7f, 0x85, 0x93, 0xda, 0xfe, 0x12, ++ 0xef, 0x30, 0xe7, 0xdd, 0xfe, 0xcc, 0x5f, 0x72, 0x9c, 0xfd, 0x8f, 0x58, ++ 0xfb, 0xbd, 0xfe, 0x62, 0xe1, 0xb2, 0xdb, 0xc3, 0x9f, 0x24, 0x4c, 0x4f, ++ 0x0e, 0x14, 0x1c, 0x49, 0xc4, 0x3c, 0xef, 0xe0, 0xac, 0x23, 0x92, 0x0f, ++ 0xc6, 0xd3, 0x45, 0xf9, 0x79, 0xcb, 0x4f, 0x5a, 0xc2, 0xf6, 0x0f, 0x78, ++ 0x6f, 0xff, 0xde, 0xb7, 0x3e, 0x92, 0xf9, 0x51, 0x23, 0x26, 0x09, 0xdb, ++ 0xb3, 0x0d, 0x7b, 0x44, 0x12, 0x83, 0x98, 0xf3, 0xd5, 0xd1, 0xdf, 0x30, ++ 0xa5, 0x37, 0x5a, 0xeb, 0x6a, 0xeb, 0x5b, 0xa3, 0x29, 0x79, 0x6d, 0x2d, ++ 0x29, 0x2f, 0xad, 0xd9, 0x72, 0x71, 0x4d, 0x7c, 0xcb, 0x4b, 0x18, 0x95, ++ 0x65, 0x39, 0x56, 0x74, 0x25, 0x6d, 0x3a, 0xdb, 0xa4, 0x6c, 0x1b, 0xe9, ++ 0xf2, 0xd8, 0x1e, 0xc9, 0x27, 0x33, 0x84, 0x20, 0x6f, 0x3a, 0x13, 0x68, ++ 0x53, 0x40, 0xcd, 0x98, 0xce, 0x87, 0x70, 0xcf, 0xf6, 0x7f, 0x05, 0x9a, ++ 0x61, 0x9d, 0x9a, 0x18, 0xcf, 0xe7, 0xba, 0xc4, 0x59, 0x4a, 0x89, 0xbb, ++ 0x98, 0x16, 0xdf, 0x36, 0x24, 0xe6, 0x74, 0x89, 0xe9, 0x74, 0x48, 0x25, ++ 0x99, 0x96, 0x4a, 0x2d, 0xe1, 0x9b, 0xde, 0x2e, 0x29, 0x2c, 0x4b, 0xd2, ++ 0x94, 0x61, 0xdf, 0x34, 0xd9, 0xd6, 0x23, 0x85, 0xea, 0x6d, 0x92, 0xb7, ++ 0x33, 0x29, 0x91, 0x27, 0xb6, 0x6b, 0xd8, 0xd2, 0x32, 0x5f, 0x4b, 0x88, ++ 0x73, 0x66, 0x10, 0xfd, 0x77, 0xc8, 0xec, 0x72, 0x8f, 0x0c, 0x9f, 0x11, ++ 0xc7, 0x92, 0xe1, 0xf4, 0x3c, 0x7a, 0xa7, 0x03, 0x4b, 0xf6, 0x06, 0x09, ++ 0xec, 0xb9, 0x07, 0x3f, 0x1b, 0xbf, 0x24, 0x7e, 0x29, 0xfc, 0x06, 0xa5, ++ 0x14, 0xfc, 0x2e, 0xd6, 0x30, 0xc4, 0x72, 0xb8, 0xde, 0x57, 0x01, 0x57, ++ 0xc6, 0x9e, 0x91, 0x07, 0x2d, 0xbd, 0xae, 0x7e, 0x16, 0x39, 0xd3, 0xa3, ++ 0x9f, 0x79, 0x4f, 0xb8, 0xb1, 0xff, 0x1a, 0xf6, 0x8f, 0x77, 0x5e, 0x8d, ++ 0xa5, 0xe5, 0x5b, 0xa3, 0x84, 0x8b, 0xb8, 0x21, 0x4e, 0x22, 0xfc, 0x10, ++ 0x4e, 0x6c, 0xc9, 0x13, 0x63, 0xc7, 0x62, 0x0e, 0xf0, 0x72, 0x5e, 0x04, ++ 0xef, 0xa0, 0x9c, 0xa8, 0xb5, 0x8e, 0x5b, 0xce, 0x78, 0xfa, 0x79, 0x3c, ++ 0xbd, 0x14, 0x58, 0x46, 0x6c, 0x31, 0x61, 0x98, 0x67, 0x64, 0x30, 0x26, ++ 0xad, 0x56, 0xc1, 0x1d, 0x4e, 0x95, 0xc5, 0x92, 0x95, 0xa0, 0xdb, 0x30, ++ 0x97, 0x92, 0x46, 0xec, 0x4c, 0x4b, 0x0a, 0x6e, 0xab, 0x35, 0xeb, 0x2a, ++ 0x3c, 0xd8, 0x45, 0xf0, 0x63, 0x33, 0xe8, 0x41, 0x7b, 0xef, 0x96, 0x39, ++ 0x3d, 0x98, 0x63, 0xa3, 0xbd, 0x7f, 0x4b, 0xbb, 0x8d, 0xf6, 0x94, 0x61, ++ 0x2e, 0x26, 0x31, 0x6f, 0x10, 0xd7, 0x14, 0xae, 0x09, 0xf1, 0x15, 0x8e, ++ 0x45, 0x2a, 0x5f, 0x8e, 0xa7, 0x2d, 0x6f, 0x38, 0x55, 0x12, 0x03, 0xbc, ++ 0x30, 0x88, 0xb1, 0x7f, 0xa9, 0x64, 0xaa, 0xf2, 0x62, 0x2a, 0x1f, 0xf3, ++ 0xee, 0x00, 0xfe, 0xf9, 0xce, 0x41, 0xcc, 0x89, 0x70, 0xd5, 0x8e, 0x03, ++ 0xe2, 0x24, 0xc2, 0x83, 0xf8, 0x1d, 0xde, 0xab, 0xe6, 0x46, 0x95, 0x74, ++ 0x4c, 0xc8, 0x7d, 0x56, 0x66, 0xcc, 0x57, 0xbc, 0x37, 0x03, 0x5c, 0x18, ++ 0x8a, 0xcf, 0x0c, 0xdc, 0x0f, 0x05, 0x1c, 0x4f, 0x3c, 0x83, 0x6e, 0xd5, ++ 0x01, 0xa9, 0x2c, 0xfb, 0xe6, 0xa5, 0xe0, 0xed, 0x56, 0xc1, 0x59, 0x30, ++ 0x37, 0x56, 0x39, 0xfe, 0x11, 0x8c, 0xb7, 0x64, 0xa1, 0xda, 0x2b, 0x2b, ++ 0xcb, 0xd1, 0xbc, 0x47, 0x30, 0x4f, 0x6c, 0xd3, 0x7b, 0xce, 0xbc, 0xb4, ++ 0x7a, 0xd2, 0xbc, 0x1c, 0x90, 0x5e, 0x78, 0xd7, 0xe6, 0x5a, 0x11, 0xfe, ++ 0x89, 0xf3, 0x94, 0xbc, 0xbc, 0x36, 0x18, 0xd2, 0x41, 0x8c, 0xfe, 0x3d, ++ 0xdb, 0xa4, 0xb8, 0xb4, 0x0b, 0x7c, 0x95, 0x90, 0x43, 0x67, 0xfe, 0x99, ++ 0x94, 0x93, 0x99, 0x31, 0xc1, 0x5e, 0x87, 0x26, 0xc1, 0x03, 0xb6, 0xc6, ++ 0x41, 0x61, 0x31, 0x9f, 0x35, 0xe5, 0x5e, 0x31, 0x3d, 0xe0, 0x2c, 0x37, ++ 0x6e, 0x97, 0x80, 0xff, 0xbc, 0x9d, 0x97, 0x98, 0x97, 0x94, 0xc2, 0x19, ++ 0xc7, 0x00, 0x1f, 0x90, 0x97, 0x40, 0x27, 0x31, 0xc8, 0x9f, 0xe5, 0xc3, ++ 0x6c, 0x27, 0x7f, 0x42, 0x7e, 0xea, 0x7d, 0xa0, 0x8f, 0x0c, 0x9b, 0xc2, ++ 0xb6, 0x61, 0xbb, 0x22, 0xbe, 0x98, 0x17, 0x7e, 0xdd, 0xd0, 0x7a, 0x89, ++ 0x7c, 0x30, 0x86, 0xb5, 0x78, 0x1f, 0xd1, 0x9f, 0xb4, 0x26, 0xfd, 0xc8, ++ 0x07, 0x1f, 0xdf, 0x42, 0x5b, 0x01, 0x9e, 0xf1, 0x8e, 0x45, 0x0b, 0xd7, ++ 0x01, 0x45, 0x63, 0xeb, 0x8c, 0x82, 0x51, 0xd1, 0x73, 0x01, 0xf4, 0x9c, ++ 0x03, 0xbe, 0x23, 0x3a, 0x5b, 0x67, 0xee, 0x90, 0x7d, 0xcb, 0xed, 0x7d, ++ 0xe4, 0x01, 0xc8, 0xa2, 0x37, 0xec, 0x6e, 0x48, 0x12, 0xef, 0x21, 0xbd, ++ 0xc8, 0x07, 0x36, 0xd6, 0x8b, 0x78, 0x60, 0x1b, 0xf8, 0x8a, 0x3c, 0x95, ++ 0x0a, 0x69, 0x3a, 0x28, 0xe7, 0x02, 0xe2, 0x3d, 0xdf, 0x46, 0xa7, 0x3c, ++ 0xf1, 0x0d, 0x7d, 0x51, 0x92, 0xd9, 0xaa, 0x09, 0x5c, 0x59, 0xe2, 0x4c, ++ 0x1a, 0x32, 0xab, 0xfa, 0x4a, 0x92, 0x25, 0xff, 0xd8, 0xe3, 0x63, 0xa6, ++ 0x64, 0xd2, 0x79, 0x13, 0xb8, 0xae, 0x01, 0xe7, 0x9b, 0x3c, 0xf1, 0x26, ++ 0xf8, 0x87, 0xfc, 0xb0, 0xb5, 0x3d, 0x63, 0x37, 0x36, 0x79, 0xe5, 0xbd, ++ 0xe8, 0x15, 0x03, 0xbd, 0x3e, 0x07, 0x5a, 0x91, 0x66, 0xa4, 0xd5, 0xfb, ++ 0x37, 0x69, 0x55, 0x5c, 0x8c, 0xe8, 0x94, 0xcf, 0xc6, 0x84, 0xb4, 0x8a, ++ 0x4b, 0x7e, 0x9a, 0x74, 0x21, 0xfe, 0x49, 0xb3, 0xc5, 0x90, 0x5e, 0xbf, ++ 0x0c, 0x9d, 0xfe, 0x5d, 0x1b, 0x9d, 0x86, 0xff, 0x3f, 0xa1, 0x53, 0x52, ++ 0x1a, 0xd0, 0x4f, 0x8d, 0xf7, 0xa0, 0x8d, 0x09, 0x3a, 0x50, 0x4e, 0xb2, ++ 0x93, 0x51, 0x7b, 0x49, 0xc9, 0xd6, 0x8c, 0x4d, 0x7a, 0xbd, 0x1b, 0x5d, ++ 0xa8, 0x3f, 0xd9, 0x47, 0xfd, 0x6d, 0x19, 0xf3, 0xd5, 0xf4, 0x8c, 0x09, ++ 0x3e, 0x2f, 0x42, 0x4f, 0x16, 0xaa, 0xbf, 0x30, 0x62, 0x4e, 0x2b, 0x56, ++ 0x70, 0x7b, 0xa4, 0x98, 0x54, 0x63, 0x8c, 0x4a, 0x75, 0x63, 0xa7, 0x29, ++ 0x6f, 0xb7, 0xca, 0x90, 0x9f, 0xc2, 0x44, 0x0c, 0x73, 0x4d, 0xc0, 0xfa, ++ 0x73, 0x3c, 0x5b, 0xe9, 0x12, 0xf5, 0xba, 0x97, 0x7c, 0xac, 0x14, 0xdc, ++ 0x4c, 0xeb, 0x76, 0xbd, 0x60, 0x41, 0x0f, 0xce, 0x57, 0x49, 0xa3, 0x98, ++ 0x94, 0xa7, 0x49, 0x0f, 0xda, 0x13, 0x4d, 0x97, 0x62, 0x9d, 0x63, 0xfb, ++ 0x04, 0xb8, 0xfd, 0x40, 0x4c, 0xcd, 0xf1, 0x65, 0x3e, 0x78, 0xb6, 0x73, ++ 0x61, 0xa2, 0x1b, 0xcc, 0x41, 0x59, 0x15, 0x8c, 0x4b, 0x18, 0xb0, 0x03, ++ 0xe9, 0x98, 0x23, 0xc7, 0x0a, 0x6e, 0x1c, 0xb0, 0xbd, 0xd2, 0x9a, 0x1f, ++ 0xe5, 0xfc, 0x38, 0xe8, 0xda, 0x92, 0xbd, 0x2e, 0x9f, 0xfd, 0x74, 0x5c, ++ 0x48, 0xf7, 0x75, 0x3b, 0x2e, 0x59, 0x7b, 0x2f, 0x26, 0x2e, 0x54, 0xc9, ++ 0xc3, 0x7f, 0x7a, 0x60, 0xd6, 0x59, 0x07, 0xd4, 0x19, 0xd2, 0xcd, 0x8f, ++ 0x79, 0x75, 0x99, 0x0b, 0x34, 0x6c, 0x95, 0x35, 0xad, 0x3f, 0x34, 0xac, ++ 0xca, 0x66, 0x19, 0xd4, 0x13, 0x95, 0xa4, 0x84, 0x76, 0xf3, 0xed, 0x36, ++ 0xbc, 0xbf, 0x0d, 0xfc, 0x3a, 0x26, 0x71, 0xd8, 0x74, 0xd9, 0xb7, 0xd0, ++ 0xd6, 0xb7, 0x80, 0x3e, 0xb6, 0xc3, 0xce, 0xd8, 0xd0, 0xb7, 0xaa, 0x1f, ++ 0x30, 0x6f, 0xf6, 0x27, 0x0c, 0xad, 0xf7, 0xd4, 0xb2, 0xa0, 0x51, 0xb4, ++ 0xbe, 0xd5, 0x36, 0xc6, 0x6a, 0x1b, 0xa3, 0x6c, 0x76, 0x5b, 0x9f, 0xb4, ++ 0xf5, 0xbd, 0xd5, 0x26, 0x3b, 0x49, 0xc8, 0x8d, 0x18, 0xd6, 0x9e, 0x84, ++ 0xcc, 0x2f, 0x5b, 0x52, 0x06, 0x6e, 0x48, 0x9f, 0x47, 0x5d, 0xb4, 0x6f, ++ 0xd2, 0x3c, 0x05, 0x1a, 0x74, 0x00, 0x2b, 0x99, 0xb1, 0x19, 0xec, 0xcf, ++ 0x5a, 0x4c, 0x86, 0x36, 0xfd, 0x33, 0xd8, 0x8b, 0xa1, 0xf4, 0x62, 0xa5, ++ 0x46, 0x1b, 0xd4, 0x29, 0x45, 0x5b, 0xe3, 0xe0, 0xfa, 0x18, 0x0b, 0x3c, ++ 0x8e, 0xfe, 0x35, 0xb6, 0x47, 0x6b, 0x12, 0x0e, 0xae, 0xf9, 0x3d, 0xc2, ++ 0x31, 0x13, 0xf3, 0x06, 0xe5, 0x9b, 0x6b, 0x69, 0xc0, 0x41, 0x39, 0xde, ++ 0xf4, 0x0d, 0xa6, 0xe7, 0xaa, 0xc7, 0x5b, 0x26, 0x60, 0x7f, 0x9f, 0xe7, ++ 0x1e, 0x78, 0x72, 0xc4, 0x49, 0x57, 0xa4, 0x67, 0x6a, 0x21, 0x87, 0xf6, ++ 0x80, 0xf4, 0xfc, 0x88, 0xb2, 0x11, 0x45, 0xf0, 0x71, 0x87, 0x97, 0x4f, ++ 0xbc, 0xee, 0x40, 0x87, 0x83, 0x5f, 0x29, 0x03, 0x0b, 0xf0, 0x4f, 0xf6, ++ 0x05, 0x3f, 0x6f, 0x3d, 0x6b, 0x69, 0xdf, 0xc4, 0xf4, 0x1e, 0x37, 0x34, ++ 0x0e, 0xa6, 0x0e, 0x68, 0xbe, 0x7f, 0x35, 0xae, 0x9f, 0xbd, 0xf0, 0x79, ++ 0xc1, 0xd4, 0xcf, 0x4f, 0x87, 0xcf, 0x09, 0x4b, 0xfb, 0x3a, 0xfb, 0x13, ++ 0xd4, 0x57, 0x96, 0xf7, 0x93, 0x04, 0xd6, 0x4c, 0xc4, 0xbd, 0x9f, 0x4c, ++ 0x9c, 0x55, 0xe3, 0xbe, 0x12, 0x8e, 0x5b, 0xed, 0xd4, 0xf3, 0xfc, 0x03, ++ 0x23, 0x01, 0xaf, 0xd5, 0x03, 0xc3, 0xea, 0xba, 0x7c, 0x20, 0xab, 0xae, ++ 0x5f, 0x3d, 0xe0, 0xa8, 0x6b, 0x43, 0x8d, 0x37, 0xbc, 0x5c, 0xd8, 0x9e, ++ 0x3f, 0x90, 0x56, 0xd7, 0x52, 0x78, 0xdd, 0x1f, 0x5e, 0x0f, 0x86, 0xd7, ++ 0xe9, 0xf0, 0x7a, 0x38, 0xbc, 0x3e, 0x1c, 0x5e, 0x1f, 0x09, 0xd7, 0x9b, ++ 0x09, 0x9f, 0xe7, 0xc2, 0xeb, 0xd1, 0xf0, 0xfa, 0x78, 0x78, 0x3d, 0x16, ++ 0x5e, 0x9f, 0x0a, 0xe1, 0x7a, 0x26, 0xbc, 0x2e, 0x84, 0xed, 0x27, 0x43, ++ 0x38, 0xeb, 0x80, 0xe7, 0xd9, 0xb8, 0xa6, 0x13, 0x71, 0x7a, 0x4c, 0x0a, ++ 0x39, 0xd8, 0xb2, 0x6a, 0x0f, 0xe8, 0x65, 0xc1, 0x27, 0xe2, 0x1e, 0xd3, ++ 0x78, 0xfe, 0x20, 0xfd, 0xae, 0x93, 0x22, 0xaf, 0xb4, 0x96, 0x46, 0xe9, ++ 0xdf, 0xfd, 0xe9, 0x01, 0xfa, 0x77, 0xba, 0xcf, 0x90, 0xb8, 0x63, 0xa5, ++ 0x86, 0x4d, 0x07, 0xfe, 0xa0, 0x05, 0x3e, 0x70, 0x20, 0x23, 0x3d, 0x52, ++ 0x9a, 0x36, 0xe4, 0x9e, 0x11, 0xea, 0xf8, 0xb4, 0xd4, 0xd7, 0xa8, 0x73, ++ 0xb9, 0x7e, 0x1d, 0xf4, 0x82, 0xe0, 0xf6, 0xf6, 0x48, 0xfc, 0xc2, 0x35, ++ 0xc5, 0x3b, 0xf7, 0x8c, 0xf4, 0x88, 0x5c, 0xe0, 0x15, 0x3a, 0xe7, 0xee, ++ 0x29, 0xb1, 0x47, 0xfe, 0x67, 0x2b, 0x0f, 0x9f, 0xf2, 0xc1, 0xcd, 0xf5, ++ 0xb1, 0xa6, 0xe2, 0xd3, 0x63, 0xd2, 0xb9, 0x07, 0x9c, 0x0b, 0xd8, 0x9e, ++ 0xab, 0x91, 0x16, 0x7f, 0x2c, 0x67, 0xab, 0xa4, 0xcd, 0xab, 0x90, 0xd1, ++ 0xac, 0xdb, 0x61, 0x90, 0xbf, 0x32, 0x63, 0xe7, 0x20, 0xbf, 0x15, 0x19, ++ 0x77, 0x79, 0x7d, 0x8e, 0x0a, 0x18, 0xe3, 0xf4, 0x5e, 0x5f, 0x15, 0xe0, ++ 0x4e, 0x76, 0x80, 0x47, 0x87, 0x26, 0xbf, 0xd3, 0xca, 0xdb, 0x3d, 0x72, ++ 0x12, 0x70, 0xfd, 0x8f, 0xea, 0xcd, 0x6b, 0x7d, 0x47, 0xaf, 0x83, 0xf5, ++ 0xf4, 0x3a, 0x15, 0xb5, 0x96, 0x21, 0xa3, 0x93, 0x5b, 0xd7, 0xcb, 0xc8, ++ 0x55, 0xa5, 0x2b, 0xa9, 0xc7, 0xd3, 0xb0, 0x05, 0xe4, 0xf5, 0x6f, 0xe0, ++ 0xfa, 0xbf, 0x0d, 0xe0, 0x14, 0x32, 0xa0, 0xed, 0x64, 0xd1, 0xfd, 0x80, ++ 0x94, 0x27, 0xe0, 0x0f, 0x1c, 0xf6, 0xed, 0x18, 0x5c, 0x10, 0xe9, 0x85, ++ 0xd9, 0xe9, 0xd6, 0xfe, 0xe0, 0x43, 0x42, 0x7c, 0x77, 0xfd, 0x34, 0xaf, ++ 0x48, 0x40, 0x9f, 0x81, 0x78, 0xb2, 0x8c, 0xe2, 0xa6, 0x4e, 0x25, 0x1e, ++ 0x72, 0xf4, 0x05, 0xf3, 0xd0, 0x81, 0xd0, 0x3d, 0x94, 0xe7, 0x29, 0x63, ++ 0x4e, 0xf3, 0x13, 0x74, 0x06, 0xdf, 0x0f, 0x9f, 0xd4, 0xb6, 0x08, 0x07, ++ 0xf0, 0x94, 0x0f, 0x61, 0x21, 0x0c, 0x79, 0xc0, 0xf0, 0x6f, 0x63, 0x21, ++ 0x7d, 0xf3, 0xa6, 0xf7, 0xb4, 0x61, 0x5e, 0xe0, 0x7a, 0x53, 0x6d, 0x7a, ++ 0x67, 0x0a, 0x6b, 0x70, 0xae, 0xdf, 0xd2, 0xef, 0xe6, 0x1a, 0x7e, 0xdb, ++ 0x1a, 0x3e, 0xd6, 0xf0, 0xe9, 0xb7, 0xf4, 0x99, 0x4e, 0x27, 0xec, 0x21, ++ 0x75, 0xe6, 0x49, 0xf4, 0x5f, 0x85, 0x9d, 0x54, 0xfe, 0x21, 0xe8, 0xfd, ++ 0x1b, 0xd8, 0x0f, 0x6d, 0xa1, 0xaf, 0xf9, 0xa7, 0x3e, 0x0d, 0xd9, 0xa4, ++ 0x7f, 0x00, 0x7d, 0xa0, 0xf4, 0xe0, 0x57, 0x42, 0x18, 0xa0, 0xfb, 0xd5, ++ 0xf3, 0x97, 0xba, 0x42, 0x98, 0x00, 0x8b, 0xb7, 0x65, 0x6f, 0xaf, 0x86, ++ 0x7b, 0xf3, 0x00, 0xd7, 0x25, 0xf0, 0x88, 0x82, 0xa9, 0x6e, 0xb2, 0x2f, ++ 0x37, 0x0c, 0x5a, 0xf0, 0x39, 0x0d, 0xbf, 0x9b, 0xe3, 0xd3, 0x52, 0xae, ++ 0xfe, 0xa2, 0x95, 0xb7, 0xb4, 0x4e, 0x0c, 0xf5, 0x9e, 0xcf, 0xb1, 0xc5, ++ 0x1c, 0x7d, 0x77, 0xad, 0xa3, 0x4b, 0x01, 0x7d, 0x85, 0x48, 0xaf, 0x64, ++ 0x4e, 0xfa, 0xf4, 0xc1, 0xd7, 0x1e, 0x03, 0x4c, 0x2d, 0xb9, 0xe8, 0x06, ++ 0xad, 0xf9, 0x5a, 0x26, 0x9d, 0x36, 0x87, 0xa5, 0x5c, 0x67, 0x8c, 0x30, ++ 0x2c, 0xc7, 0x1a, 0x29, 0x39, 0x56, 0xe5, 0x3a, 0x4f, 0x61, 0x8c, 0x83, ++ 0x36, 0x10, 0x6b, 0x40, 0xc5, 0x1b, 0x78, 0xe7, 0x4f, 0x0d, 0xfd, 0x4e, ++ 0x13, 0x7a, 0x6f, 0xdd, 0xf8, 0x9d, 0xe0, 0xb2, 0x51, 0x6e, 0xd0, 0xaf, ++ 0x44, 0x7b, 0x70, 0x2b, 0xdf, 0x5e, 0xeb, 0x5a, 0xe8, 0x58, 0xcc, 0x5d, ++ 0x30, 0xca, 0xcb, 0x62, 0x16, 0x94, 0x8e, 0xcd, 0xa4, 0x45, 0xbe, 0xdf, ++ 0xa7, 0xf1, 0x70, 0x21, 0x46, 0x59, 0xb0, 0x9c, 0x93, 0x58, 0xbb, 0x1b, ++ 0xc8, 0xc0, 0xf8, 0x1a, 0xef, 0xa5, 0x15, 0xf3, 0x28, 0x4f, 0x62, 0xc5, ++ 0x68, 0xe7, 0x92, 0x1c, 0x13, 0xb4, 0x10, 0xd7, 0x00, 0xc7, 0x1c, 0x93, ++ 0xb1, 0x7d, 0x89, 0x74, 0xe9, 0x45, 0xb4, 0xd3, 0x6f, 0xa6, 0x3c, 0xee, ++ 0x92, 0x7c, 0x83, 0xe3, 0x06, 0xa4, 0xb8, 0xca, 0x7d, 0x7c, 0x1e, 0xeb, ++ 0xe7, 0x8d, 0x52, 0x35, 0x68, 0x9d, 0x50, 0x71, 0xc6, 0xe0, 0x56, 0x5d, ++ 0x2b, 0x4d, 0xd8, 0xc0, 0x92, 0x0b, 0x7f, 0x7a, 0xca, 0x95, 0xca, 0xd4, ++ 0x78, 0x8a, 0x7e, 0x91, 0x29, 0x0e, 0x7c, 0xff, 0x38, 0x6d, 0x0d, 0xd6, ++ 0x98, 0xc6, 0x7e, 0x9f, 0x85, 0x5d, 0xd3, 0x76, 0xdf, 0xf4, 0xf6, 0x1b, ++ 0xb4, 0x9b, 0xf4, 0x69, 0x8a, 0x4e, 0x1c, 0xfc, 0xfd, 0x2f, 0x42, 0x9f, ++ 0x80, 0x3c, 0x4e, 0xdd, 0xb9, 0xfe, 0x89, 0x59, 0x47, 0xd9, 0x4b, 0xd0, ++ 0x17, 0x36, 0x4d, 0x07, 0x96, 0xfe, 0x0e, 0xf0, 0xa7, 0xb3, 0x48, 0xdc, ++ 0x07, 0xad, 0x25, 0xc4, 0x62, 0xd3, 0x8b, 0x25, 0x63, 0x68, 0x11, 0xb8, ++ 0x1c, 0xa0, 0x1d, 0x81, 0x0f, 0x75, 0x81, 0x38, 0xe7, 0x18, 0xb6, 0x77, ++ 0xc8, 0x74, 0x72, 0xab, 0x5f, 0xf0, 0x89, 0x3e, 0xed, 0x83, 0x60, 0xec, ++ 0xe2, 0x3e, 0x4b, 0xcb, 0x11, 0x7c, 0x9e, 0x65, 0xfa, 0x08, 0x25, 0xf8, ++ 0x08, 0xe4, 0xc9, 0x2e, 0xf8, 0x7d, 0x6c, 0xe7, 0x9a, 0xe8, 0x5b, 0xcd, ++ 0xc3, 0x07, 0x11, 0xb3, 0xa2, 0xfc, 0xff, 0x29, 0x5c, 0x3f, 0x89, 0x79, ++ 0x83, 0xca, 0x16, 0x35, 0x97, 0xa3, 0x35, 0xc0, 0xef, 0x4e, 0x2f, 0xed, ++ 0x36, 0x60, 0xec, 0x57, 0xeb, 0xc1, 0x77, 0x35, 0x66, 0xd5, 0x7a, 0xf1, ++ 0xb6, 0xf5, 0xd0, 0xb7, 0x9a, 0x0e, 0xe7, 0xf7, 0xb7, 0xcd, 0x6f, 0xdf, ++ 0x57, 0x3f, 0xfc, 0xc3, 0x92, 0x91, 0x5d, 0x6c, 0xb5, 0xa6, 0x5d, 0x53, ++ 0x62, 0x03, 0x7a, 0x5e, 0xe1, 0xdc, 0x8d, 0x7b, 0x33, 0x07, 0xb6, 0xee, ++ 0xed, 0xe5, 0x98, 0xde, 0x1b, 0xe7, 0x47, 0xeb, 0x26, 0xb7, 0xc0, 0x92, ++ 0x00, 0x2c, 0x9c, 0xc7, 0x35, 0xdb, 0xe7, 0x62, 0xdc, 0xea, 0x4c, 0xbf, ++ 0x9e, 0x9f, 0x6c, 0x83, 0x6b, 0xe0, 0x16, 0xf3, 0x39, 0x77, 0xeb, 0xbb, ++ 0x31, 0x6e, 0xf5, 0xae, 0x6d, 0x7a, 0x3e, 0xe7, 0x74, 0x40, 0x56, 0x15, ++ 0xad, 0x13, 0xca, 0x2e, 0x6c, 0xea, 0x8b, 0x63, 0x90, 0xcb, 0xf6, 0x79, ++ 0x11, 0x9f, 0x7f, 0x4f, 0xc5, 0xf6, 0x2f, 0xaf, 0x71, 0xff, 0xe4, 0x2b, ++ 0xda, 0x73, 0xda, 0x75, 0xed, 0x67, 0xd0, 0x17, 0x39, 0x94, 0x13, 0x63, ++ 0xba, 0x0a, 0x7e, 0x58, 0xea, 0x92, 0xec, 0x12, 0xf9, 0xed, 0x83, 0x80, ++ 0xe3, 0xf7, 0x61, 0x5b, 0x20, 0xc7, 0x63, 0x3b, 0xc1, 0x3f, 0x53, 0x78, ++ 0xee, 0xc6, 0xfd, 0x76, 0xdc, 0x6f, 0x53, 0x7e, 0x45, 0x79, 0xec, 0xee, ++ 0xd0, 0x6f, 0x8f, 0x19, 0x33, 0x90, 0xb9, 0xf2, 0xd8, 0x5d, 0x80, 0x8b, ++ 0xcf, 0xc0, 0x9f, 0x33, 0xa2, 0xe6, 0xbe, 0x56, 0x3b, 0x16, 0x27, 0x3d, ++ 0xbe, 0x59, 0x9b, 0xc1, 0xf3, 0x36, 0x8c, 0xf9, 0x3f, 0x6a, 0xcc, 0x6b, ++ 0xb5, 0x5e, 0x8c, 0x79, 0x5a, 0x8d, 0xa9, 0x6c, 0x8e, 0xf9, 0x73, 0x3c, ++ 0x7f, 0x14, 0x63, 0x20, 0x67, 0x90, 0x1e, 0xd3, 0xd9, 0x83, 0xdf, 0x0f, ++ 0xd0, 0xf6, 0x11, 0xb4, 0x6d, 0xa0, 0x6d, 0x37, 0x9e, 0xbf, 0xb7, 0x65, ++ 0x5d, 0xe6, 0x1d, 0x9e, 0x45, 0x3f, 0x70, 0x62, 0x7f, 0x07, 0xfd, 0x1f, ++ 0xc5, 0xef, 0x3b, 0x5b, 0xc6, 0x34, 0xb7, 0x3c, 0x47, 0xb9, 0x86, 0xbf, ++ 0x50, 0xf0, 0x5f, 0x8f, 0xdd, 0x49, 0x0b, 0x31, 0x66, 0xa1, 0x27, 0xcb, ++ 0x55, 0xc6, 0x05, 0x09, 0xf9, 0xec, 0x72, 0x8f, 0x3c, 0xba, 0xcc, 0x78, ++ 0xc0, 0x92, 0xb9, 0xaa, 0x8a, 0x01, 0x72, 0x1d, 0xb0, 0x05, 0xab, 0xc1, ++ 0x1d, 0xb2, 0x7f, 0x39, 0x85, 0x71, 0xe2, 0x75, 0xca, 0xf0, 0xd4, 0x5b, ++ 0x2a, 0x6e, 0x1f, 0xc4, 0x33, 0xf5, 0x40, 0x0f, 0xee, 0xbb, 0xa9, 0xb3, ++ 0xe0, 0xff, 0xdb, 0xf0, 0xf1, 0x23, 0x9f, 0x7f, 0x50, 0x5e, 0x0c, 0x3e, ++ 0x1c, 0x27, 0x1d, 0x5f, 0xdb, 0x84, 0xe1, 0x0f, 0xb6, 0xc0, 0xa0, 0x72, ++ 0x23, 0xe2, 0x9c, 0x61, 0x9e, 0xe3, 0x0e, 0x29, 0x2e, 0x9b, 0x43, 0x4c, ++ 0x58, 0x8c, 0xa8, 0xfc, 0x87, 0x8c, 0x84, 0x79, 0x8f, 0x89, 0x38, 0xe2, ++ 0x9b, 0x98, 0x37, 0x0c, 0x5b, 0xa8, 0xf3, 0x20, 0x79, 0xc0, 0x97, 0x6f, ++ 0xcb, 0x83, 0xec, 0xbd, 0x21, 0x0f, 0x72, 0x77, 0x5c, 0xeb, 0xb0, 0x1e, ++ 0x19, 0x3a, 0x93, 0x0a, 0xf5, 0x3c, 0x7c, 0xeb, 0x25, 0x1b, 0x3a, 0x22, ++ 0x19, 0x3e, 0x53, 0x3e, 0xa0, 0xf7, 0x4c, 0xb6, 0xf3, 0x8a, 0xbe, 0x1c, ++ 0x65, 0x02, 0xcf, 0x4d, 0xf2, 0x45, 0x3a, 0xb4, 0x1b, 0x27, 0xe9, 0x47, ++ 0xa2, 0x9f, 0x30, 0x13, 0x97, 0xed, 0xfc, 0x56, 0xb4, 0xa5, 0x7b, 0x0c, ++ 0xfc, 0x46, 0xff, 0xff, 0xb7, 0xc3, 0x7d, 0x72, 0x8f, 0xcf, 0x6c, 0xd9, ++ 0x23, 0x6c, 0xda, 0xe2, 0xa0, 0x2c, 0xa0, 0x2f, 0x7b, 0x46, 0xa4, 0x12, ++ 0xd0, 0x6e, 0x4d, 0xc8, 0xde, 0xe5, 0xeb, 0x31, 0xd6, 0x59, 0x97, 0x31, ++ 0x55, 0x2f, 0xec, 0xe2, 0x70, 0xea, 0x88, 0x10, 0x8f, 0xf0, 0x79, 0x18, ++ 0x97, 0x62, 0x7f, 0x3e, 0xf6, 0xe7, 0x63, 0x7f, 0x3e, 0xf6, 0xe7, 0x63, ++ 0x7f, 0xcf, 0x6d, 0xee, 0x2f, 0xda, 0xc3, 0xc5, 0xd6, 0xe9, 0x1a, 0xaf, ++ 0x84, 0xbf, 0x47, 0x66, 0xce, 0xf1, 0x1e, 0x7a, 0xb6, 0x97, 0xfa, 0x37, ++ 0xc2, 0xfb, 0xaf, 0x6f, 0x81, 0x89, 0xb8, 0x19, 0xa4, 0x5f, 0x95, 0x64, ++ 0x76, 0xef, 0x18, 0xf0, 0x59, 0x66, 0xbc, 0x15, 0x4c, 0x49, 0x69, 0x51, ++ 0xcf, 0x99, 0x0b, 0x3c, 0xd9, 0xb7, 0x78, 0x07, 0xe0, 0xfc, 0x20, 0xe0, ++ 0xb2, 0xe5, 0xd1, 0x60, 0x78, 0xac, 0x09, 0xb8, 0xca, 0x8b, 0x7c, 0x77, ++ 0x52, 0x68, 0x63, 0x66, 0x00, 0xcf, 0x91, 0xe0, 0x56, 0xb8, 0x41, 0xbc, ++ 0xa7, 0x70, 0x93, 0x56, 0x3c, 0x5a, 0xb1, 0xd9, 0xef, 0x86, 0x36, 0x26, ++ 0x17, 0xc2, 0x72, 0xb3, 0x0d, 0x3b, 0x76, 0x83, 0x0d, 0x8b, 0x70, 0xfa, ++ 0x4e, 0xf8, 0xff, 0x7c, 0xaf, 0x7e, 0x07, 0x79, 0xe7, 0x9d, 0xc6, 0x7c, ++ 0x2d, 0x1c, 0xc3, 0xfe, 0xad, 0x7d, 0x7f, 0xd2, 0x1b, 0xd1, 0x6f, 0x78, ++ 0xe9, 0x56, 0xfd, 0xbb, 0xfa, 0xae, 0xcf, 0xbd, 0xd5, 0xda, 0x3f, 0xee, ++ 0x8d, 0xf6, 0x78, 0x73, 0x1f, 0x75, 0xd1, 0x98, 0x8a, 0x17, 0x63, 0xde, ++ 0xd3, 0xe6, 0xf5, 0x3d, 0xe6, 0xcd, 0xb9, 0xa0, 0x64, 0xea, 0x3d, 0x72, ++ 0x0c, 0xfa, 0x82, 0xf5, 0x1d, 0x96, 0xb2, 0x9d, 0x79, 0xf8, 0xfe, 0xa0, ++ 0xf3, 0x0a, 0xef, 0x6f, 0xc3, 0xb5, 0x7d, 0x6e, 0x0a, 0x34, 0xc9, 0x63, ++ 0x2c, 0xd7, 0xd8, 0x3a, 0x3f, 0xf2, 0x37, 0x5c, 0x99, 0xaf, 0xc7, 0xd1, ++ 0x9f, 0xc9, 0xfb, 0x72, 0x2f, 0x62, 0xd0, 0xcc, 0x7e, 0xf2, 0x7d, 0x39, ++ 0x99, 0x99, 0x16, 0x39, 0x28, 0x95, 0xfa, 0xa7, 0x10, 0x57, 0xb5, 0xe4, ++ 0x01, 0xd8, 0xc9, 0xcf, 0x21, 0x26, 0x96, 0xf3, 0x70, 0x2b, 0xcf, 0x23, ++ 0x40, 0x39, 0x9f, 0x14, 0xf3, 0x85, 0x41, 0x89, 0x9f, 0x4a, 0x89, 0x75, ++ 0x8a, 0x7a, 0x39, 0x6b, 0x3f, 0x00, 0xf7, 0xd4, 0x94, 0x4b, 0x1f, 0x41, ++ 0x9c, 0x39, 0x95, 0x97, 0x2c, 0x7c, 0xce, 0x71, 0xbb, 0x89, 0x6b, 0x45, ++ 0xb2, 0x63, 0x2f, 0x0a, 0xc6, 0x9e, 0xc7, 0x58, 0xcc, 0xeb, 0x3a, 0x9b, ++ 0xc6, 0x6f, 0x40, 0xba, 0xcf, 0x12, 0x86, 0xa1, 0xf0, 0x4a, 0x58, 0x22, ++ 0x1d, 0x9c, 0xf0, 0xfb, 0xe1, 0x1b, 0xbd, 0xa2, 0xf4, 0x2f, 0x75, 0xb1, ++ 0x03, 0x5d, 0xac, 0xf4, 0xb0, 0x71, 0x68, 0x0f, 0x78, 0x70, 0x49, 0x12, ++ 0x49, 0xef, 0xef, 0x65, 0x59, 0xf9, 0xa6, 0xb4, 0x05, 0xf7, 0xd0, 0xbf, ++ 0xff, 0x0a, 0xb4, 0x21, 0xee, 0x73, 0x80, 0xdd, 0x97, 0xe9, 0x3d, 0x1f, ++ 0xeb, 0xd7, 0x7c, 0x73, 0x50, 0xac, 0xa5, 0x2f, 0x20, 0x46, 0x38, 0x2e, ++ 0x0b, 0x6e, 0xc6, 0x2e, 0x9b, 0x7e, 0x2b, 0xe6, 0x38, 0x29, 0xc6, 0xc1, ++ 0x96, 0xb7, 0xac, 0xe4, 0x65, 0xef, 0x12, 0xc7, 0x1c, 0x87, 0xdc, 0x76, ++ 0x00, 0x77, 0x9d, 0x72, 0x22, 0x99, 0xf1, 0x8b, 0x90, 0x2f, 0xd3, 0xd9, ++ 0x21, 0x43, 0x4d, 0x5e, 0xfb, 0x65, 0xe8, 0xdc, 0x7f, 0x07, 0x5f, 0xf1, ++ 0x1e, 0x64, 0x3d, 0xc3, 0xf6, 0x21, 0x5c, 0xd9, 0xee, 0x08, 0xe2, 0x43, ++ 0xac, 0x95, 0x94, 0x21, 0xf8, 0x8f, 0x27, 0x72, 0x07, 0xe1, 0x8b, 0x20, ++ 0xd6, 0xcf, 0xd9, 0x52, 0x6e, 0x78, 0xd2, 0xac, 0x42, 0xff, 0x05, 0x47, ++ 0xa5, 0x52, 0x85, 0x8e, 0x0e, 0xe6, 0x70, 0xbd, 0x8a, 0xeb, 0xe3, 0xb8, ++ 0xbe, 0x85, 0x2b, 0x61, 0x3f, 0x2a, 0xcd, 0xc6, 0xcf, 0xb1, 0x36, 0xd7, ++ 0x78, 0x28, 0x84, 0x19, 0x7e, 0xe8, 0x9e, 0xa3, 0xf0, 0x81, 0xa2, 0xf6, ++ 0xa3, 0x50, 0xae, 0x8f, 0xe1, 0xf7, 0xd1, 0x0e, 0x3e, 0x9b, 0x9e, 0x2f, ++ 0xf3, 0xb9, 0x29, 0xea, 0x55, 0xe3, 0x44, 0xee, 0xf1, 0x70, 0x9d, 0xc7, ++ 0xf0, 0xbe, 0x2b, 0x78, 0x37, 0xe2, 0x60, 0xf8, 0x35, 0x87, 0xdc, 0xe3, ++ 0xf2, 0x84, 0x7b, 0xbb, 0x4c, 0xf6, 0x27, 0xfc, 0x84, 0xc7, 0xfd, 0xd3, ++ 0x47, 0xbc, 0xd5, 0xfe, 0xa3, 0x7d, 0x73, 0xcf, 0x3d, 0xd8, 0xcb, 0x76, ++ 0xed, 0xdb, 0x99, 0xf5, 0x30, 0xae, 0x32, 0x64, 0x68, 0x84, 0xeb, 0x79, ++ 0x12, 0x5b, 0x1a, 0xb1, 0x73, 0x26, 0xfd, 0xaa, 0x2c, 0x7e, 0xc7, 0xc1, ++ 0x2b, 0xce, 0xc9, 0x21, 0xb3, 0x13, 0x30, 0xa1, 0xaf, 0xc9, 0xf7, 0x20, ++ 0x66, 0xd8, 0xfd, 0x06, 0xf6, 0xe6, 0x4b, 0xe7, 0x6e, 0x4f, 0xae, 0x05, ++ 0xbc, 0x17, 0x31, 0xcf, 0x1f, 0x94, 0xbf, 0xaa, 0x5f, 0x91, 0xe7, 0xea, ++ 0x07, 0xe5, 0x4d, 0x5c, 0x17, 0xea, 0x3e, 0xf0, 0xe8, 0x40, 0x2f, 0x70, ++ 0x8d, 0x16, 0xe8, 0x42, 0x1d, 0x7d, 0x57, 0x6a, 0x0e, 0xf4, 0x9b, 0xb1, ++ 0x5b, 0x72, 0xd6, 0xf5, 0xe5, 0xec, 0x14, 0xe6, 0x34, 0xba, 0x24, 0xfe, ++ 0x75, 0xee, 0xb7, 0x57, 0x8a, 0x75, 0x5f, 0x4a, 0x39, 0xf1, 0xe3, 0x5e, ++ 0xb7, 0x14, 0xe1, 0xdf, 0xc2, 0x4f, 0x3a, 0xae, 0x73, 0x60, 0xf4, 0xf1, ++ 0xf0, 0x1c, 0xfc, 0xd4, 0x68, 0x6e, 0xfa, 0xd2, 0xeb, 0xc6, 0x37, 0x03, ++ 0x47, 0xd9, 0x8f, 0x57, 0x6e, 0x92, 0x31, 0xf2, 0xc8, 0x65, 0xa3, 0xd9, ++ 0x50, 0x72, 0x16, 0xca, 0x03, 0xe6, 0x06, 0xf4, 0x21, 0xaf, 0x86, 0xfc, ++ 0xa7, 0x7c, 0x05, 0xd0, 0x85, 0x7e, 0xe0, 0x4f, 0x04, 0x7e, 0x87, 0xb2, ++ 0x01, 0x2f, 0xa9, 0x1c, 0x9d, 0xf6, 0xc1, 0x1b, 0x80, 0xb5, 0x98, 0xcc, ++ 0x00, 0x2a, 0x91, 0x46, 0xe3, 0x0b, 0x0a, 0x57, 0xcc, 0xe3, 0xd7, 0x6b, ++ 0xc4, 0x6f, 0xc6, 0x36, 0x4d, 0x27, 0xcc, 0xb5, 0x38, 0xa0, 0x4f, 0xd4, ++ 0x9f, 0x81, 0x2f, 0x7e, 0x5c, 0xec, 0xc9, 0x6e, 0xec, 0x89, 0xf7, 0x22, ++ 0xd3, 0x17, 0xb6, 0xfa, 0x31, 0x91, 0x3f, 0xd2, 0x21, 0x95, 0xe5, 0x38, ++ 0x68, 0xd9, 0x23, 0x27, 0xaa, 0xb6, 0x3c, 0x07, 0x3e, 0xfa, 0x22, 0xec, ++ 0xed, 0x49, 0xd8, 0x57, 0xe6, 0x74, 0x0c, 0xef, 0xc2, 0x81, 0xa1, 0x55, ++ 0x5e, 0xcf, 0x1f, 0xc8, 0x36, 0x78, 0x7d, 0x25, 0x8c, 0x89, 0x5f, 0x0d, ++ 0x63, 0xe5, 0xf5, 0x03, 0xa3, 0xea, 0x7a, 0xf9, 0xc0, 0x98, 0xba, 0x7e, ++ 0x07, 0xb1, 0xf7, 0x66, 0xfe, 0x45, 0xf9, 0x33, 0x85, 0x5c, 0x4e, 0x4a, ++ 0x55, 0x65, 0xcf, 0xad, 0x23, 0xe0, 0xa7, 0xb9, 0x80, 0x71, 0x95, 0x23, ++ 0x27, 0xd6, 0x3c, 0xc0, 0x0c, 0x9d, 0xe0, 0xb9, 0xb8, 0x4a, 0xf8, 0x17, ++ 0xcd, 0xed, 0x60, 0xee, 0x91, 0x34, 0x0b, 0x63, 0x19, 0x97, 0xb1, 0x4c, ++ 0xfb, 0x1f, 0xd7, 0x03, 0x6f, 0xd2, 0x6e, 0xfe, 0x9c, 0x31, 0x99, 0x55, ++ 0xce, 0x71, 0xae, 0xc3, 0x38, 0x58, 0x36, 0x96, 0x25, 0x91, 0xf0, 0xfe, ++ 0xbd, 0x24, 0x5e, 0x68, 0xb5, 0x7e, 0x08, 0x5d, 0xe3, 0x23, 0x86, 0x34, ++ 0x0d, 0xb4, 0xaf, 0xb2, 0x8f, 0x7a, 0x64, 0xdc, 0xbe, 0x06, 0x9e, 0xcb, ++ 0x1f, 0x16, 0xf9, 0x36, 0xda, 0xe0, 0xfb, 0x31, 0x7f, 0x05, 0x1a, 0x84, ++ 0x34, 0x51, 0x6d, 0x1c, 0xc7, 0xd8, 0x8c, 0xfb, 0x18, 0xb7, 0x3b, 0x31, ++ 0xbf, 0xb1, 0xca, 0x39, 0x99, 0x29, 0x4c, 0xc5, 0x3c, 0xbd, 0xbf, 0x7d, ++ 0xb9, 0x31, 0xb9, 0x54, 0x95, 0xd0, 0xb7, 0xfe, 0x05, 0xe6, 0xe8, 0x1c, ++ 0x58, 0x59, 0x3c, 0xd8, 0x53, 0xfc, 0xaa, 0x59, 0x75, 0xce, 0x30, 0x93, ++ 0x22, 0xd8, 0x8e, 0x6c, 0x54, 0xff, 0xa2, 0x83, 0x36, 0xb2, 0xe0, 0xf0, ++ 0x7e, 0x0a, 0x63, 0x10, 0x33, 0x78, 0xb4, 0xf1, 0xdc, 0x53, 0x3b, 0x2e, ++ 0xf4, 0x5f, 0x19, 0xb4, 0x08, 0xf7, 0xa8, 0xfe, 0xf4, 0x7b, 0x30, 0x3f, ++ 0x7c, 0x4f, 0x09, 0x46, 0xbc, 0x88, 0xf7, 0x67, 0xcf, 0x5b, 0x16, 0xf3, ++ 0x00, 0x43, 0xe7, 0x21, 0x56, 0x8a, 0xdf, 0x10, 0xa3, 0x04, 0x11, 0xaf, ++ 0x45, 0x31, 0x0c, 0x79, 0x8b, 0x38, 0xc8, 0xf8, 0xeb, 0x40, 0x76, 0xbf, ++ 0xf7, 0xba, 0x3c, 0x78, 0x46, 0xef, 0xd9, 0x3c, 0x87, 0xc8, 0x13, 0x3e, ++ 0xc0, 0xb5, 0xe5, 0x8c, 0x7b, 0x55, 0x98, 0xfb, 0x73, 0xc1, 0x2b, 0xbf, ++ 0xdf, 0x01, 0x99, 0x9e, 0xca, 0x9b, 0xdb, 0x3b, 0xb5, 0x9f, 0x0c, 0xdb, ++ 0xcf, 0x5c, 0x43, 0x35, 0x8f, 0x39, 0x9d, 0xf2, 0x9b, 0x16, 0xee, 0x03, ++ 0x3e, 0xc3, 0xe7, 0xb1, 0x34, 0x7c, 0x95, 0x10, 0x87, 0x88, 0x23, 0xa0, ++ 0xbb, 0x88, 0x43, 0x43, 0x1e, 0x84, 0x96, 0x17, 0xac, 0x3f, 0x14, 0xbe, ++ 0x6b, 0xe8, 0x5c, 0xc4, 0x1b, 0x80, 0xfb, 0x0c, 0x62, 0xdb, 0x65, 0x2b, ++ 0xcc, 0x83, 0x52, 0xc7, 0xb0, 0xff, 0x9d, 0xf8, 0x95, 0xfb, 0xe1, 0xdc, ++ 0x94, 0xca, 0xc7, 0x91, 0xb7, 0xf6, 0x87, 0xbc, 0xf5, 0x18, 0x78, 0xeb, ++ 0xa8, 0xe2, 0xad, 0x96, 0xfc, 0xd0, 0x75, 0xe4, 0x4b, 0xb7, 0xe4, 0xaf, ++ 0xad, 0x7f, 0x3d, 0x80, 0x97, 0xbf, 0x7e, 0x99, 0xff, 0x32, 0xde, 0x0b, ++ 0xbb, 0x53, 0xa9, 0x66, 0xf2, 0x33, 0xf4, 0x8b, 0x60, 0x47, 0x2a, 0x88, ++ 0xc9, 0x86, 0xce, 0x0f, 0xaa, 0x31, 0x43, 0xb0, 0x29, 0x4d, 0xf0, 0x1b, ++ 0xf1, 0x5b, 0xa9, 0x42, 0x0f, 0x9f, 0x8f, 0xc3, 0x6e, 0x51, 0x66, 0xa5, ++ 0xdf, 0x84, 0x6e, 0xe0, 0xf8, 0x26, 0x64, 0x67, 0xe8, 0x3c, 0x7c, 0x4e, ++ 0xd0, 0x8c, 0x6b, 0x35, 0xc1, 0xe7, 0x9c, 0xdf, 0xac, 0x8e, 0xa9, 0x79, ++ 0xcd, 0xea, 0x04, 0xae, 0xd0, 0xef, 0x39, 0x57, 0x46, 0xce, 0xe7, 0x24, ++ 0x7d, 0xde, 0x90, 0xf2, 0x74, 0xab, 0x95, 0x00, 0xec, 0x63, 0xe7, 0x77, ++ 0xc8, 0x55, 0x95, 0xb3, 0x4d, 0xa8, 0x3c, 0xee, 0x42, 0x6e, 0x1a, 0xb2, ++ 0x49, 0xfc, 0x21, 0xc6, 0x3f, 0x5f, 0x82, 0x7d, 0x2c, 0xc9, 0x89, 0x65, ++ 0xe2, 0x87, 0xf9, 0xf1, 0x0d, 0xc4, 0x9e, 0x19, 0xe8, 0xb2, 0xc3, 0x32, ++ 0x57, 0xef, 0x84, 0x2e, 0xb3, 0x60, 0x03, 0x9f, 0x06, 0x8d, 0x86, 0xc9, ++ 0x0f, 0xc0, 0x8b, 0x87, 0xb5, 0x4b, 0xf0, 0x59, 0x4b, 0x52, 0x5a, 0xbe, ++ 0x3e, 0xbe, 0x2c, 0x9d, 0x90, 0xa9, 0xc3, 0x72, 0xa4, 0xce, 0x75, 0x2c, ++ 0xbb, 0x22, 0xa3, 0x8c, 0x5f, 0xed, 0xbd, 0x58, 0x07, 0x76, 0xbb, 0xed, ++ 0x8f, 0xf2, 0x97, 0x7f, 0x17, 0x9e, 0x8c, 0xe4, 0x2e, 0xe1, 0x77, 0x78, ++ 0xd3, 0xc6, 0x46, 0x4e, 0xac, 0xd9, 0xdc, 0x27, 0x8c, 0x6f, 0xe7, 0x72, ++ 0xc6, 0xe5, 0x5c, 0xde, 0xb8, 0x92, 0x2b, 0x19, 0xaf, 0xc3, 0x36, 0x35, ++ 0xd7, 0xfe, 0x16, 0xfc, 0xe3, 0xc8, 0x3c, 0xcf, 0xeb, 0x36, 0x69, 0x68, ++ 0xab, 0x9c, 0x59, 0xdc, 0x7b, 0x4b, 0xce, 0x56, 0xe9, 0x3b, 0xb4, 0xee, ++ 0x9d, 0x75, 0xfd, 0x9d, 0x80, 0x0f, 0x70, 0x30, 0x16, 0xbe, 0x6e, 0x3b, ++ 0xe2, 0xde, 0x98, 0xac, 0x28, 0xdb, 0xd1, 0x43, 0xdb, 0xe1, 0x16, 0x65, ++ 0xbb, 0x6c, 0xd4, 0x21, 0x7f, 0x42, 0x79, 0xc1, 0x7d, 0xc3, 0x96, 0x2f, ++ 0xd5, 0x22, 0x5e, 0xe2, 0x7e, 0x2b, 0xef, 0xeb, 0x92, 0x98, 0xec, 0x57, ++ 0xf6, 0xba, 0x57, 0x2e, 0xad, 0x22, 0x3e, 0x82, 0xb7, 0x60, 0xde, 0xa9, ++ 0xf3, 0xb5, 0x8c, 0x73, 0x65, 0x07, 0xe3, 0xff, 0x4b, 0xc0, 0x15, 0xcf, ++ 0xb6, 0xba, 0xd1, 0xcf, 0x1d, 0x45, 0xcf, 0x5c, 0xdf, 0xa2, 0xad, 0xe2, ++ 0xd9, 0x2a, 0x9e, 0x27, 0x20, 0xa3, 0xec, 0x33, 0xa4, 0x08, 0xff, 0x87, ++ 0x67, 0x6e, 0x45, 0xc4, 0x93, 0x1b, 0xd5, 0x71, 0xc0, 0xc9, 0x3c, 0x4d, ++ 0x02, 0x70, 0xfd, 0x99, 0xea, 0xef, 0x74, 0x18, 0xaf, 0x1c, 0x94, 0xb2, ++ 0x3a, 0x4b, 0xc3, 0x75, 0x55, 0xc3, 0x52, 0x44, 0x6c, 0x5b, 0x9e, 0xe8, ++ 0xa2, 0xbd, 0x1b, 0xf3, 0xa9, 0x07, 0x92, 0xda, 0xcf, 0xdc, 0x58, 0xfe, ++ 0xaf, 0x9d, 0xb4, 0xf5, 0xfb, 0xdc, 0x29, 0x79, 0xbd, 0xca, 0x7b, 0xf6, ++ 0x67, 0x5c, 0x2a, 0x41, 0xcb, 0xfb, 0xc6, 0x81, 0x05, 0x67, 0x28, 0x94, ++ 0xb9, 0x3a, 0x78, 0xfe, 0xa8, 0xfc, 0xe1, 0xda, 0x9c, 0xfc, 0xc1, 0xda, ++ 0x0c, 0xfc, 0x95, 0x47, 0xe0, 0xaf, 0x3c, 0x0c, 0x99, 0x3e, 0x0c, 0x99, ++ 0x7e, 0x1c, 0x72, 0x30, 0xad, 0x72, 0x13, 0xf5, 0x6a, 0xe6, 0xa2, 0xaf, ++ 0x72, 0x45, 0x6f, 0x41, 0x06, 0x26, 0xc5, 0x42, 0x7c, 0x31, 0x0f, 0x3b, ++ 0x91, 0x74, 0x5a, 0xf7, 0xc2, 0x27, 0x01, 0xed, 0xfd, 0x8c, 0xa5, 0x78, ++ 0xc6, 0xb1, 0x9f, 0x02, 0x6e, 0xdf, 0xe7, 0x65, 0xea, 0x24, 0xf9, 0xd9, ++ 0xfa, 0x98, 0x94, 0x2f, 0x60, 0xfc, 0x52, 0x0f, 0xf0, 0x48, 0x5b, 0x99, ++ 0x39, 0x59, 0x96, 0x75, 0xf0, 0x49, 0x5e, 0x78, 0x96, 0x5c, 0x49, 0x66, ++ 0xbe, 0x21, 0x32, 0x25, 0xbb, 0x17, 0xc1, 0xe3, 0x8b, 0x26, 0xf6, 0xac, ++ 0x63, 0xea, 0xa1, 0x0b, 0x9e, 0x98, 0x4b, 0xd4, 0x4d, 0x7d, 0x61, 0xdc, ++ 0xa2, 0xed, 0x7f, 0x83, 0x76, 0xb2, 0xc6, 0xf7, 0x3d, 0x2d, 0x73, 0xb0, ++ 0xb1, 0x88, 0x1b, 0xa0, 0xc3, 0x9d, 0x14, 0xde, 0x99, 0x98, 0xbd, 0x60, ++ 0x27, 0xe6, 0x2e, 0x70, 0x9d, 0x84, 0xc4, 0x16, 0x49, 0x6b, 0xae, 0x03, ++ 0x99, 0xc0, 0xda, 0xd9, 0x45, 0xe2, 0x6d, 0x1c, 0xf3, 0x7e, 0x35, 0xca, ++ 0xdb, 0x23, 0xd6, 0xd1, 0xfa, 0x02, 0x71, 0x4f, 0x9b, 0x8d, 0x04, 0x0d, ++ 0xa0, 0x4f, 0xf2, 0x4d, 0x6d, 0xef, 0x4a, 0xca, 0x1e, 0x6a, 0x5b, 0x78, ++ 0x58, 0xde, 0x4c, 0x48, 0xb7, 0xa3, 0xf6, 0x13, 0x5b, 0x5a, 0xa7, 0xfd, ++ 0xc7, 0x3b, 0x38, 0x27, 0xde, 0x06, 0x77, 0x0e, 0x7a, 0xe8, 0x9f, 0x26, ++ 0x88, 0xfb, 0x4f, 0xc3, 0xde, 0x0e, 0xa9, 0xf7, 0xb2, 0xdd, 0xc5, 0x7e, ++ 0x64, 0x80, 0x99, 0x08, 0x13, 0x7e, 0xe4, 0x7d, 0x4a, 0x9f, 0x4d, 0x42, ++ 0x87, 0xd9, 0xb2, 0x3a, 0x4a, 0xda, 0x20, 0xde, 0x7f, 0x91, 0xcf, 0xa4, ++ 0x11, 0xe9, 0xad, 0xcf, 0x91, 0x2a, 0x6b, 0xa0, 0x53, 0xef, 0xa0, 0x34, ++ 0xd6, 0xd8, 0x97, 0x52, 0xbc, 0x6d, 0x81, 0x06, 0x0b, 0xd5, 0xd6, 0xbd, ++ 0x05, 0xd7, 0x07, 0xf7, 0x11, 0xe7, 0xc4, 0x07, 0xf1, 0x3e, 0x01, 0xd8, ++ 0x88, 0xe3, 0x5e, 0xda, 0x66, 0xb4, 0x6d, 0x47, 0x6c, 0x4a, 0xfe, 0xc6, ++ 0xb5, 0xb1, 0x1d, 0x3e, 0x27, 0xe5, 0xea, 0x69, 0x9e, 0xb3, 0x61, 0xef, ++ 0x9a, 0xaf, 0x4b, 0xe0, 0xa9, 0x0a, 0xe2, 0xde, 0x4b, 0x8b, 0xcc, 0xf1, ++ 0xbf, 0x2e, 0x4f, 0x52, 0xa7, 0x82, 0xbf, 0x2a, 0xab, 0x93, 0xe0, 0xb5, ++ 0x5e, 0xe8, 0xcf, 0x56, 0xeb, 0x30, 0xfc, 0xe6, 0x63, 0x2e, 0x71, 0xf4, ++ 0x06, 0x70, 0xd4, 0x99, 0x3a, 0x06, 0x7a, 0xad, 0xbc, 0xf8, 0x71, 0xa5, ++ 0x3f, 0xe0, 0xfb, 0x28, 0x3b, 0xa6, 0x73, 0x33, 0x2e, 0x7d, 0x25, 0x25, ++ 0xd3, 0x05, 0x87, 0xfa, 0xf1, 0x59, 0xe0, 0x61, 0x42, 0xe9, 0x73, 0xad, ++ 0x6b, 0xba, 0xa4, 0x7c, 0x38, 0x8f, 0xfd, 0x4e, 0x6d, 0x19, 0x97, 0xc3, ++ 0x33, 0x7c, 0xc1, 0x00, 0x8e, 0x5f, 0x37, 0xdb, 0xa7, 0xe4, 0xec, 0xe8, ++ 0x7e, 0x39, 0x37, 0x9a, 0x99, 0x9a, 0x31, 0x69, 0x23, 0xf6, 0x4b, 0xe3, ++ 0xc5, 0xbc, 0xac, 0xd4, 0xb4, 0xad, 0x9e, 0x75, 0xa6, 0xa4, 0x18, 0x94, ++ 0xf0, 0xec, 0x31, 0x37, 0x8b, 0xf1, 0x91, 0x1e, 0x8e, 0xf6, 0x54, 0xe0, ++ 0x9e, 0xa0, 0x33, 0xb4, 0x2d, 0x36, 0xcd, 0x4e, 0xd0, 0x87, 0x7a, 0xe2, ++ 0x53, 0x68, 0x2f, 0x40, 0xd7, 0x91, 0x9e, 0x59, 0xd0, 0xee, 0x9c, 0xa2, ++ 0x53, 0xd1, 0x65, 0x7c, 0xc0, 0x39, 0x99, 0xd4, 0x2c, 0xda, 0xa7, 0x85, ++ 0x36, 0x95, 0x7b, 0x8b, 0xd6, 0xf3, 0x42, 0xf8, 0x63, 0x61, 0x2e, 0xf5, ++ 0x0f, 0x13, 0x94, 0xc9, 0x98, 0x13, 0xb5, 0x8f, 0xdb, 0xcc, 0xd1, 0xf1, ++ 0x1d, 0x95, 0x1a, 0xdb, 0xb2, 0x36, 0xe7, 0x17, 0x5d, 0x47, 0x9d, 0x75, ++ 0x7e, 0x3a, 0x8c, 0xd9, 0x0f, 0x23, 0xa6, 0x2d, 0x06, 0x1d, 0xef, 0x61, ++ 0x8f, 0xaf, 0xeb, 0x3e, 0xad, 0xa7, 0x37, 0x52, 0x76, 0xa8, 0x8b, 0x8f, ++ 0x40, 0x17, 0x9b, 0x93, 0x86, 0x74, 0x40, 0xb7, 0xee, 0x93, 0xe1, 0x50, ++ 0xaf, 0x72, 0x3f, 0xbd, 0xca, 0xf6, 0x15, 0xa7, 0x93, 0xf2, 0xdc, 0xca, ++ 0x3f, 0x84, 0xaf, 0xdf, 0xd9, 0xcf, 0x2b, 0xdd, 0xc2, 0xcf, 0x7b, 0xe3, ++ 0x02, 0xf4, 0x41, 0x0d, 0xba, 0xa2, 0x06, 0x5d, 0x51, 0x83, 0xae, 0xa8, ++ 0x41, 0x57, 0xd4, 0xa0, 0x2b, 0x6a, 0xd0, 0x15, 0xb5, 0xe9, 0xd0, 0x8e, ++ 0x1e, 0x0b, 0xf3, 0x50, 0x8c, 0x7b, 0xda, 0x7d, 0x03, 0xe6, 0xa2, 0x18, ++ 0xdf, 0x64, 0xfc, 0xab, 0xc0, 0xcd, 0x4b, 0x2e, 0xe3, 0xf1, 0x96, 0xfc, ++ 0x47, 0xb7, 0x7d, 0xf7, 0xcc, 0x7d, 0xb0, 0x0e, 0x44, 0xe4, 0x10, 0x70, ++ 0xf6, 0x20, 0x70, 0xf6, 0xd0, 0x4d, 0xf5, 0x1e, 0xac, 0x0d, 0x19, 0xf6, ++ 0x63, 0x88, 0x59, 0xa7, 0x6f, 0xc0, 0x1d, 0x63, 0xf3, 0x77, 0x8b, 0xc7, ++ 0x99, 0x6b, 0xf8, 0x09, 0xe9, 0x2d, 0xaf, 0x87, 0x74, 0x2d, 0xe6, 0x7a, ++ 0xc1, 0xe3, 0xf4, 0xe5, 0x5e, 0x57, 0xbe, 0xdc, 0x3e, 0xd7, 0x92, 0xf5, ++ 0x24, 0xed, 0xe7, 0xf7, 0xe5, 0xc8, 0xf2, 0x7d, 0x5d, 0x3c, 0x73, 0x5b, ++ 0xa8, 0x8d, 0xca, 0x86, 0xd2, 0x17, 0x9f, 0xc2, 0x58, 0x4f, 0xe6, 0x40, ++ 0xef, 0xbd, 0x88, 0x13, 0xcf, 0xc9, 0x78, 0xea, 0x1c, 0xf6, 0xf1, 0x45, ++ 0xcc, 0x81, 0xbf, 0xdf, 0x2a, 0xa1, 0xed, 0x0a, 0x62, 0x8a, 0x6b, 0xc2, ++ 0xfb, 0x71, 0xfb, 0x24, 0x90, 0x98, 0xb7, 0xb3, 0xf6, 0x5b, 0x12, 0xf1, ++ 0x10, 0xf9, 0x85, 0xb9, 0x79, 0xe6, 0x83, 0x19, 0x83, 0xf5, 0x42, 0xc6, ++ 0xbe, 0x0f, 0x9b, 0xcb, 0x77, 0x50, 0xe6, 0x09, 0xdf, 0x4e, 0xbc, 0x33, ++ 0x3d, 0xd3, 0xe9, 0xdd, 0x05, 0x3b, 0x4b, 0x9d, 0xae, 0xe3, 0xa4, 0x22, ++ 0xe6, 0x28, 0xbd, 0xef, 0x46, 0x67, 0x13, 0x5f, 0x80, 0x4f, 0x93, 0x04, ++ 0x8d, 0xd1, 0xbe, 0x1a, 0xf9, 0xb4, 0x91, 0xef, 0xa2, 0xf3, 0xca, 0x17, ++ 0x95, 0xff, 0x52, 0x80, 0xcd, 0x3a, 0x88, 0xb1, 0xcc, 0xeb, 0xb5, 0x5a, ++ 0x47, 0xa1, 0x8f, 0xe6, 0x4f, 0x53, 0x4f, 0xdd, 0x19, 0xe6, 0x2f, 0x69, ++ 0x5f, 0xc5, 0x78, 0x23, 0xb7, 0x61, 0x27, 0x60, 0x1b, 0xa7, 0xc1, 0x4f, ++ 0x05, 0xf0, 0x58, 0xec, 0x9e, 0xfd, 0xb0, 0xb5, 0xea, 0xec, 0x00, 0x7c, ++ 0xcc, 0xf7, 0x7e, 0xca, 0xf8, 0x93, 0xdc, 0x04, 0x6c, 0xef, 0xc7, 0x61, ++ 0x7b, 0x07, 0xb0, 0x56, 0x01, 0xf6, 0x97, 0xb6, 0xd7, 0x96, 0x7f, 0xbd, ++ 0x56, 0x80, 0x5e, 0xfa, 0xe7, 0x5d, 0x94, 0xa3, 0xfd, 0x9b, 0xf2, 0x52, ++ 0x0a, 0xe5, 0xa9, 0x4f, 0x8a, 0x2a, 0x1f, 0x5d, 0x52, 0x72, 0x57, 0x59, ++ 0xa5, 0xcf, 0x01, 0x19, 0x5c, 0xa5, 0xfc, 0xd3, 0x7f, 0xa4, 0x5e, 0x80, ++ 0x1e, 0x59, 0xfd, 0x04, 0xae, 0xfb, 0x71, 0xd5, 0x7e, 0xd9, 0xc5, 0xda, ++ 0x60, 0x97, 0xce, 0x81, 0xa6, 0xda, 0x7c, 0xb3, 0x06, 0xf6, 0x77, 0x90, ++ 0xb5, 0x05, 0xfe, 0x0e, 0xef, 0x61, 0xec, 0xf1, 0x30, 0xf8, 0x6b, 0x1a, ++ 0xfc, 0xb5, 0x1f, 0x7b, 0x3d, 0x69, 0x8c, 0xec, 0x89, 0xc1, 0xb6, 0x1e, ++ 0x97, 0x12, 0x74, 0xe6, 0xea, 0x8a, 0x6f, 0x4c, 0x2e, 0x8a, 0x7a, 0x2e, ++ 0xba, 0xac, 0x41, 0xf8, 0x15, 0xc4, 0xd6, 0x29, 0x59, 0x5a, 0xb3, 0xc2, ++ 0xfc, 0xa1, 0x85, 0x36, 0xda, 0x6b, 0xe8, 0x23, 0x1b, 0x6b, 0xd5, 0x86, ++ 0xb7, 0x49, 0x37, 0xd6, 0xab, 0x1d, 0xc0, 0x33, 0xf3, 0x08, 0x07, 0x8d, ++ 0x1b, 0xdb, 0x99, 0xa7, 0xc8, 0xd8, 0x05, 0xc4, 0x9d, 0x96, 0xc3, 0x5c, ++ 0x85, 0x03, 0xfa, 0xe4, 0xa5, 0x38, 0x02, 0xff, 0x4b, 0xe9, 0xdb, 0xee, ++ 0x50, 0xdf, 0x42, 0x97, 0xd5, 0x3d, 0x59, 0x59, 0xa3, 0x9f, 0xe4, 0xa9, ++ 0xd8, 0x99, 0x3a, 0xaa, 0x5c, 0x87, 0xaf, 0xe3, 0x7e, 0xce, 0xc8, 0xab, ++ 0x35, 0x13, 0xea, 0xbc, 0xd7, 0x5f, 0x11, 0xc3, 0xde, 0xf3, 0x06, 0x62, ++ 0xd5, 0x1c, 0xe4, 0xd3, 0x83, 0x4e, 0xb4, 0xa1, 0xf3, 0x68, 0xb3, 0xfe, ++ 0x1b, 0xf4, 0x3d, 0xda, 0x2f, 0xc0, 0xbf, 0x39, 0x4d, 0x99, 0xbc, 0x22, ++ 0x66, 0xf3, 0xdd, 0x72, 0x21, 0xcc, 0x83, 0x1c, 0x0a, 0xcf, 0x72, 0x1c, ++ 0xc0, 0xab, 0xdf, 0x11, 0x87, 0x0f, 0x7f, 0xa9, 0xbe, 0x0d, 0xf1, 0xe0, ++ 0x41, 0xa3, 0x98, 0x64, 0x9b, 0x2f, 0xab, 0x39, 0xfa, 0x9c, 0xcc, 0x87, ++ 0x24, 0xd0, 0xbe, 0x35, 0xfe, 0xa4, 0x6d, 0x7f, 0x05, 0xb6, 0x9d, 0x71, ++ 0x68, 0x74, 0x0e, 0xa4, 0x62, 0x32, 0x19, 0x0a, 0xa2, 0x5c, 0x15, 0xdf, ++ 0xbf, 0x6e, 0x94, 0x83, 0xbf, 0xee, 0x96, 0x6e, 0xc2, 0xc0, 0xbd, 0xe8, ++ 0xf7, 0x98, 0x4b, 0x93, 0xe1, 0x7b, 0x6c, 0x23, 0xbe, 0x27, 0x85, 0xfd, ++ 0xec, 0xec, 0x95, 0xde, 0x18, 0x74, 0xd5, 0x18, 0xee, 0xaf, 0xa2, 0xed, ++ 0xfa, 0x73, 0xb3, 0x26, 0x46, 0x6c, 0x0f, 0x22, 0x65, 0xd8, 0xe6, 0x26, ++ 0xf4, 0x89, 0x09, 0xdb, 0xd8, 0xac, 0x3d, 0x8e, 0x2b, 0xe6, 0x9d, 0xbe, ++ 0x22, 0xb3, 0x3a, 0xb6, 0x86, 0xff, 0x38, 0xac, 0xec, 0xeb, 0xb4, 0xcb, ++ 0xbc, 0xc7, 0x71, 0xe8, 0xbe, 0xbb, 0xd0, 0xc6, 0x18, 0xc9, 0x17, 0xfb, ++ 0x63, 0x5f, 0x88, 0x47, 0xf5, 0x5c, 0x05, 0x9d, 0x0f, 0xc0, 0xd8, 0x65, ++ 0xd0, 0x83, 0x6b, 0xd0, 0x96, 0xfd, 0xbd, 0x3c, 0xd9, 0x96, 0x33, 0x29, ++ 0x98, 0x9b, 0x39, 0x82, 0x3c, 0xeb, 0xa0, 0x56, 0x6a, 0x94, 0xc1, 0x1c, ++ 0xe8, 0x9d, 0x97, 0x6f, 0xac, 0xed, 0x04, 0xae, 0x93, 0x12, 0x7b, 0x81, ++ 0xf9, 0x70, 0xea, 0xfd, 0x71, 0xe8, 0x5b, 0x3b, 0xf4, 0x13, 0x92, 0x62, ++ 0xbd, 0x30, 0x28, 0x9d, 0xa7, 0x52, 0xd2, 0x71, 0x8a, 0x75, 0x1f, 0x59, ++ 0xd6, 0x4b, 0xd0, 0xd7, 0x99, 0xfa, 0x81, 0x3e, 0x9f, 0x4c, 0xe3, 0xea, ++ 0x6e, 0xe0, 0x77, 0x19, 0xeb, 0x76, 0xc2, 0x4f, 0xef, 0x38, 0xbf, 0x17, ++ 0xf8, 0xd1, 0x6b, 0x6e, 0x9d, 0x5b, 0xd1, 0x73, 0x79, 0x4e, 0x9a, 0xf2, ++ 0x25, 0x8b, 0x79, 0x9c, 0x9f, 0xc5, 0xdc, 0xec, 0xd4, 0x9b, 0x9b, 0xf3, ++ 0x39, 0x97, 0xf6, 0x2e, 0x09, 0xf9, 0xde, 0x25, 0xcd, 0x2f, 0x53, 0xce, ++ 0xe1, 0xe7, 0x43, 0x9f, 0x95, 0x03, 0x5e, 0x7b, 0x70, 0xe5, 0x98, 0x74, ++ 0xd8, 0x3f, 0x14, 0xf6, 0x3b, 0xca, 0x06, 0x5a, 0x9b, 0xb9, 0x15, 0xc4, ++ 0x04, 0xb5, 0xcc, 0x49, 0x18, 0x1c, 0xb4, 0xf3, 0x9e, 0x71, 0x13, 0xe2, ++ 0x88, 0xd3, 0xf0, 0x1f, 0x1b, 0xbc, 0x76, 0x49, 0xa5, 0x71, 0x54, 0x66, ++ 0xd4, 0xfd, 0x83, 0x72, 0xc8, 0x26, 0xee, 0x8e, 0x8b, 0x3b, 0xa9, 0x7d, ++ 0x2d, 0x31, 0x35, 0x6e, 0x3b, 0x9d, 0xe3, 0xb2, 0xcf, 0x55, 0xf6, 0xc1, ++ 0xbe, 0x1f, 0x38, 0x2e, 0x07, 0x1d, 0xe4, 0x77, 0xc0, 0xee, 0x41, 0xc6, ++ 0xf2, 0x72, 0x6e, 0x0d, 0x63, 0x41, 0xab, 0xfb, 0xf9, 0xdc, 0x00, 0x3e, ++ 0x99, 0x9f, 0x78, 0x81, 0xf8, 0xe4, 0xde, 0x69, 0x1f, 0x89, 0x53, 0xe2, ++ 0x80, 0x36, 0x97, 0xf9, 0xb5, 0xcc, 0xd4, 0x35, 0x61, 0x8c, 0x4c, 0x9c, ++ 0x71, 0x9d, 0x68, 0xdf, 0x7a, 0x9e, 0x79, 0x76, 0x00, 0x8e, 0x63, 0x42, ++ 0xcc, 0x53, 0xb6, 0x98, 0xe7, 0x79, 0xed, 0xc1, 0x95, 0x7d, 0x00, 0xe9, ++ 0xec, 0x50, 0xd8, 0xe7, 0xa0, 0x0d, 0x3e, 0xe2, 0xf3, 0x94, 0xad, 0x5d, ++ 0x90, 0x69, 0xe6, 0x78, 0xa6, 0xe4, 0xe2, 0xca, 0xcd, 0xf2, 0x15, 0x3b, ++ 0xa5, 0x7d, 0x8e, 0x1b, 0xe5, 0x6b, 0xea, 0x1f, 0x21, 0x5f, 0x7c, 0x07, ++ 0x75, 0x8a, 0x25, 0x4f, 0x26, 0x33, 0xe9, 0xbc, 0x8e, 0x25, 0xec, 0xac, ++ 0x39, 0x92, 0xa6, 0xaf, 0xd9, 0x3c, 0xfd, 0x9b, 0xdd, 0xb4, 0x2f, 0xcf, ++ 0xbb, 0x11, 0x7f, 0x75, 0x83, 0xbf, 0x5a, 0x52, 0x87, 0xed, 0xad, 0x38, ++ 0x86, 0xcc, 0x3b, 0xc7, 0x95, 0xaf, 0xf8, 0x50, 0xb2, 0x25, 0xc7, 0x5c, ++ 0x3d, 0x77, 0x5e, 0x46, 0x42, 0x1e, 0x57, 0xb1, 0x19, 0xf4, 0x2f, 0xe9, ++ 0xc5, 0xe7, 0x9d, 0xe2, 0xf6, 0x1f, 0x97, 0xa1, 0xc9, 0x75, 0xe2, 0x0b, ++ 0x74, 0xa0, 0xde, 0x79, 0xc7, 0xbc, 0x97, 0x3a, 0xef, 0x2f, 0x56, 0x09, ++ 0xd3, 0x36, 0xf0, 0x6d, 0x1e, 0xb1, 0xd1, 0xf5, 0xdc, 0x57, 0x76, 0xc4, ++ 0x6f, 0xc5, 0xf1, 0xee, 0x32, 0x62, 0x85, 0x87, 0x92, 0x4e, 0x7a, 0xd8, ++ 0x1c, 0x49, 0x9d, 0x90, 0x2b, 0x0a, 0xd6, 0xdf, 0x71, 0x35, 0xbf, 0x2c, ++ 0xe4, 0x6e, 0x95, 0x8f, 0x6a, 0xcf, 0x53, 0x73, 0xad, 0x75, 0xe3, 0x89, ++ 0x40, 0xe7, 0x9e, 0xae, 0xe7, 0xaa, 0xaf, 0xeb, 0x1c, 0x2b, 0xd4, 0x05, ++ 0x95, 0xfa, 0x87, 0x25, 0xd2, 0x39, 0xf5, 0x1c, 0x68, 0xb5, 0x44, 0x1a, ++ 0xa5, 0xc3, 0xba, 0xac, 0x44, 0x9b, 0x1f, 0x1c, 0x67, 0x7d, 0x61, 0x3a, ++ 0x6f, 0x7e, 0x0d, 0xba, 0xe1, 0xb4, 0xc4, 0x9d, 0x68, 0xad, 0x2e, 0x8c, ++ 0x49, 0x85, 0xe7, 0x10, 0xdb, 0x99, 0xa3, 0xc2, 0x98, 0x8f, 0xa2, 0x7f, ++ 0x0f, 0xc6, 0xd1, 0x56, 0x32, 0xff, 0x4f, 0xbb, 0xc9, 0xf3, 0xd5, 0x7e, ++ 0x55, 0x6f, 0x5a, 0x6c, 0x3c, 0x15, 0xb6, 0x45, 0x6b, 0xec, 0x69, 0x1b, ++ 0x1f, 0xb5, 0xe9, 0x73, 0x83, 0xbc, 0x19, 0x57, 0xeb, 0x2f, 0xc0, 0xd7, ++ 0x88, 0xce, 0x3e, 0xcc, 0x66, 0xd1, 0xd6, 0xf3, 0x39, 0x8e, 0x3a, 0x1f, ++ 0xb6, 0xa5, 0x06, 0x7b, 0x53, 0xdb, 0x1f, 0xda, 0xa0, 0x19, 0xd1, 0xf6, ++ 0x55, 0x8c, 0xbd, 0x39, 0xda, 0xe0, 0xbc, 0x51, 0x50, 0xb5, 0x8d, 0x5c, ++ 0x9f, 0x78, 0x07, 0xef, 0xac, 0x69, 0x7f, 0xd8, 0xcc, 0x75, 0xf0, 0x1c, ++ 0x0a, 0x76, 0x5c, 0xdb, 0xf9, 0x26, 0xec, 0xfc, 0xd9, 0xe5, 0x9d, 0xca, ++ 0x46, 0x9e, 0x75, 0x23, 0x7b, 0xbd, 0xde, 0x62, 0x8e, 0xbc, 0xcb, 0xa3, ++ 0xae, 0xce, 0xc9, 0x1f, 0xc1, 0x3f, 0x7a, 0x79, 0x6d, 0x0a, 0x76, 0xcd, ++ 0x45, 0x2c, 0x36, 0x81, 0x58, 0x6c, 0x0c, 0xb1, 0x98, 0x03, 0x1b, 0x37, ++ 0x08, 0x9b, 0xa7, 0xed, 0xf9, 0xe4, 0x6e, 0x31, 0xbe, 0x91, 0x13, 0x63, ++ 0xf4, 0x14, 0x6c, 0xff, 0xe2, 0x77, 0xc1, 0xd7, 0x99, 0x57, 0xa9, 0x9f, ++ 0xfc, 0x15, 0xca, 0xd5, 0xa7, 0x25, 0x9f, 0x4a, 0xc9, 0x17, 0xd7, 0xd8, ++ 0x47, 0x3e, 0xc9, 0xcb, 0x0f, 0x9c, 0xef, 0x2a, 0xf9, 0x39, 0x57, 0xbf, ++ 0x22, 0xf1, 0xe7, 0xb5, 0x0e, 0xfd, 0x4f, 0x6e, 0x4b, 0x9a, 0xae, 0xe6, ++ 0xa9, 0x6b, 0x42, 0x9e, 0x82, 0xdd, 0x59, 0xa1, 0xee, 0x7c, 0x43, 0x92, ++ 0xa7, 0xbe, 0x2b, 0xb7, 0x9d, 0x72, 0x54, 0x6e, 0x61, 0xe5, 0xb4, 0xb2, ++ 0x69, 0xd0, 0x57, 0x49, 0x59, 0x5d, 0xfb, 0x27, 0xf2, 0xa4, 0x9d, 0xb9, ++ 0xc8, 0x77, 0x51, 0x27, 0x69, 0x5b, 0x05, 0xdd, 0x59, 0xcd, 0xf8, 0x15, ++ 0xf8, 0xcb, 0x17, 0xcd, 0x71, 0xc9, 0x5b, 0x7e, 0x6b, 0x07, 0x7d, 0xf9, ++ 0xba, 0x63, 0x0f, 0x99, 0xa4, 0xdb, 0xed, 0x8c, 0x71, 0x1b, 0x4a, 0xf7, ++ 0xd0, 0xfe, 0xe5, 0x68, 0x0f, 0x69, 0xd3, 0x68, 0x57, 0x98, 0xf3, 0xc6, ++ 0xfd, 0x0a, 0x6d, 0xce, 0x4f, 0xd4, 0xb9, 0x66, 0x79, 0xda, 0x96, 0xc6, ++ 0x0a, 0xf5, 0x0e, 0xec, 0xf7, 0x69, 0xfa, 0xa6, 0xa2, 0xf8, 0x9a, 0xbe, ++ 0xe9, 0x21, 0x89, 0xfc, 0x52, 0xf6, 0x6d, 0xf5, 0x4b, 0x7f, 0x17, 0xb4, ++ 0x4d, 0x02, 0x3f, 0x94, 0x6b, 0xc5, 0x5f, 0x61, 0xbc, 0xfe, 0x06, 0xfc, ++ 0x43, 0xee, 0xc3, 0x90, 0x01, 0xe7, 0x0a, 0xf8, 0x83, 0xef, 0x7e, 0xa3, ++ 0xf5, 0x50, 0x92, 0x7b, 0x30, 0x94, 0xed, 0xdf, 0x18, 0x78, 0xaf, 0x73, ++ 0x06, 0xca, 0xfe, 0x36, 0xf8, 0xd3, 0x66, 0xc8, 0x8b, 0x4f, 0x84, 0xfe, ++ 0x3f, 0xe4, 0xf4, 0x0c, 0xf7, 0x50, 0xe1, 0xb9, 0x06, 0x7c, 0xa9, 0x05, ++ 0xe6, 0x95, 0xd4, 0x7b, 0x1f, 0xc8, 0xf5, 0xc8, 0xd0, 0xa9, 0x0e, 0xc9, ++ 0xbe, 0x60, 0x82, 0xbf, 0xc9, 0x0f, 0xf7, 0xc2, 0xa6, 0x8c, 0xa2, 0xbf, ++ 0x4f, 0x2a, 0xb6, 0x8d, 0x18, 0x64, 0x4c, 0x2a, 0x63, 0xac, 0x2f, 0xbb, ++ 0x87, 0xe7, 0x15, 0x0a, 0x8e, 0x8a, 0x3d, 0x2c, 0xac, 0xeb, 0xa8, 0xd8, ++ 0xb7, 0x49, 0xe5, 0xf4, 0xf7, 0xb6, 0xe9, 0xb8, 0x7c, 0xeb, 0xf3, 0xe9, ++ 0x4e, 0x95, 0xff, 0x36, 0x1e, 0xee, 0x09, 0x6b, 0xe5, 0x7f, 0x09, 0xd8, ++ 0xa3, 0xb1, 0x84, 0x27, 0x2e, 0xce, 0xf3, 0x3d, 0x32, 0x0c, 0x9d, 0x3a, ++ 0x02, 0x7b, 0x34, 0x7a, 0x6a, 0x50, 0xc6, 0x4e, 0xa5, 0xe5, 0xce, 0x53, ++ 0x91, 0x9d, 0xbf, 0x70, 0x20, 0x1b, 0xe6, 0x62, 0x9d, 0x5f, 0x32, 0x17, ++ 0x7b, 0xa7, 0x5a, 0x1f, 0x30, 0xae, 0x40, 0xcf, 0x25, 0x9f, 0x55, 0xfe, ++ 0x80, 0xc6, 0xfd, 0xf7, 0x65, 0xef, 0x72, 0x5c, 0xf6, 0x29, 0x19, 0x23, ++ 0xcf, 0xd3, 0xe7, 0xde, 0x89, 0xb1, 0x19, 0xc8, 0xc4, 0x23, 0x61, 0xac, ++ 0xd8, 0x0d, 0xbc, 0x12, 0x87, 0xb0, 0x61, 0x88, 0x1f, 0x59, 0xa7, 0x5b, ++ 0x76, 0xdb, 0xe7, 0x73, 0xee, 0xfb, 0x31, 0x27, 0x0f, 0x9f, 0x81, 0xfd, ++ 0x32, 0x10, 0x93, 0x5b, 0xf5, 0xdf, 0x87, 0x7e, 0xea, 0x92, 0x7d, 0xd0, ++ 0x25, 0x5b, 0xfb, 0x0b, 0xe8, 0x53, 0x7e, 0x35, 0xde, 0xbb, 0x33, 0xd4, ++ 0xe1, 0x11, 0x4e, 0x48, 0xd7, 0x01, 0xd6, 0xaa, 0xa9, 0x7c, 0x4c, 0xc9, ++ 0x66, 0xdd, 0x33, 0xdb, 0xde, 0x1f, 0xd2, 0x7a, 0x32, 0xa4, 0xb5, 0xc0, ++ 0xe7, 0xdd, 0xa6, 0x6a, 0x33, 0x0a, 0xee, 0x36, 0x29, 0x25, 0x33, 0x3e, ++ 0xcf, 0x6e, 0x99, 0x83, 0x5b, 0xad, 0x46, 0x7e, 0x47, 0x7e, 0x07, 0xcf, ++ 0x12, 0x16, 0x5c, 0x95, 0x1f, 0x4b, 0xc7, 0x3c, 0xfa, 0x2d, 0x6e, 0x82, ++ 0x75, 0xcd, 0x4d, 0x55, 0xf7, 0x1e, 0xc3, 0x0f, 0x78, 0xb6, 0x0c, 0xb1, ++ 0x1d, 0xb6, 0xf9, 0xda, 0x66, 0x4d, 0x43, 0x7e, 0x4d, 0x35, 0x26, 0x5d, ++ 0x70, 0x07, 0xc2, 0xe7, 0x94, 0xac, 0x54, 0x3f, 0x34, 0x68, 0x7a, 0x7f, ++ 0xb3, 0xb3, 0x90, 0xdb, 0xc1, 0x33, 0x21, 0xb4, 0x51, 0x4e, 0xbe, 0x0b, ++ 0x39, 0x89, 0x87, 0x31, 0x81, 0x05, 0x18, 0xb9, 0xcf, 0xbf, 0x06, 0x5f, ++ 0x6f, 0xdd, 0x73, 0x47, 0xb4, 0x67, 0xec, 0x97, 0xf8, 0xe6, 0xfc, 0xc8, ++ 0x7e, 0x11, 0xe7, 0x89, 0x30, 0x8e, 0xc8, 0xd8, 0x57, 0xcd, 0xf7, 0xf7, ++ 0x47, 0x3e, 0xd4, 0x55, 0x13, 0xba, 0xa7, 0x06, 0x3d, 0x54, 0x83, 0xfe, ++ 0xa9, 0x41, 0xff, 0xd4, 0xa0, 0x7f, 0xe0, 0x4f, 0xf0, 0x0c, 0xfd, 0x65, ++ 0xc4, 0x54, 0x2f, 0xd5, 0x22, 0x5f, 0x3c, 0x0f, 0x3d, 0xa8, 0xfc, 0x33, ++ 0xfa, 0x32, 0x75, 0xd3, 0xeb, 0xfc, 0xa5, 0x6b, 0x82, 0x62, 0x5e, 0x34, ++ 0xaf, 0x53, 0xca, 0x6a, 0x4e, 0x5a, 0xe6, 0x82, 0x5b, 0x8d, 0xd5, 0x35, ++ 0xa1, 0xd7, 0xf7, 0xa8, 0x65, 0xab, 0xa0, 0x72, 0x06, 0xd4, 0xb3, 0xef, ++ 0xc5, 0xf7, 0xed, 0x35, 0x96, 0xa4, 0xab, 0xaa, 0xfd, 0x01, 0x1d, 0x89, ++ 0x6b, 0xfa, 0x78, 0x15, 0x99, 0x9f, 0x5a, 0x90, 0xca, 0x94, 0x21, 0xb3, ++ 0x13, 0xa0, 0xcb, 0x04, 0xeb, 0xeb, 0x3f, 0x04, 0xbb, 0x39, 0x8f, 0x75, ++ 0x28, 0x73, 0x7b, 0x40, 0x0b, 0x3b, 0xac, 0xbb, 0x78, 0xe5, 0x40, 0xa1, ++ 0x2e, 0xc6, 0xe5, 0xaa, 0x24, 0x3a, 0x21, 0x23, 0x3f, 0x5c, 0xbe, 0x17, ++ 0xbe, 0xd0, 0xa4, 0x5c, 0x9a, 0xba, 0x57, 0x36, 0x6e, 0x98, 0x0f, 0xdc, ++ 0x23, 0xce, 0xfd, 0xe2, 0x1a, 0xcf, 0x2f, 0x3b, 0x65, 0x26, 0xc9, 0x5c, ++ 0x55, 0x5a, 0xd5, 0x9c, 0x6c, 0x28, 0x3e, 0xa2, 0x5d, 0xe8, 0x93, 0x6b, ++ 0xea, 0x9e, 0xed, 0xf1, 0xb0, 0x1d, 0xfa, 0xa8, 0x4a, 0x3b, 0xb1, 0x4d, ++ 0xe9, 0xc0, 0xd7, 0x6a, 0x51, 0x7e, 0x8e, 0x76, 0x85, 0xb9, 0x1f, 0xe6, ++ 0x82, 0xfe, 0x0c, 0x3c, 0xcb, 0xbe, 0xd3, 0xa1, 0x8e, 0xe3, 0xfd, 0xa1, ++ 0xae, 0xa8, 0x26, 0xb4, 0x92, 0xf4, 0x5b, 0x15, 0xc7, 0x32, 0x2e, 0x6d, ++ 0xd6, 0xab, 0x99, 0xdb, 0xf5, 0x78, 0xf2, 0xac, 0x09, 0xf8, 0x48, 0xef, ++ 0x21, 0x95, 0x9f, 0x7c, 0xad, 0xf6, 0xab, 0xdb, 0xf4, 0x3c, 0x2b, 0xfc, ++ 0x3e, 0x83, 0x6d, 0x0b, 0x3d, 0xba, 0x8d, 0xe7, 0xe5, 0x77, 0xa8, 0xda, ++ 0x57, 0xda, 0xe0, 0x15, 0xc4, 0x08, 0xaa, 0xd6, 0x37, 0x39, 0x80, 0xeb, ++ 0xdf, 0x62, 0x4c, 0x02, 0x34, 0x61, 0xae, 0xe7, 0xfd, 0x6a, 0x5f, 0x31, ++ 0x47, 0xc7, 0xa7, 0x85, 0x1c, 0xed, 0xef, 0xcf, 0x54, 0xff, 0x8b, 0xcb, ++ 0xaa, 0x3e, 0x0d, 0x57, 0xda, 0xe6, 0x5f, 0x20, 0x5e, 0x8a, 0x4b, 0xb1, ++ 0xee, 0xc0, 0x9f, 0x8e, 0x93, 0x57, 0xd1, 0x7e, 0x3b, 0xec, 0x91, 0x40, ++ 0x76, 0x3a, 0x60, 0x13, 0xd5, 0x7e, 0xc1, 0x41, 0x8c, 0xcb, 0xf9, 0xfe, ++ 0xa8, 0x8e, 0x2a, 0x2d, 0x27, 0x54, 0x5d, 0xf3, 0x5d, 0xa0, 0x57, 0x0e, ++ 0xf8, 0x59, 0xc7, 0x2e, 0x7e, 0xa4, 0x62, 0x82, 0x0d, 0xd1, 0x71, 0xd6, ++ 0x7c, 0x80, 0x98, 0xa1, 0xaa, 0x73, 0x45, 0xd7, 0xcf, 0x38, 0xde, 0xed, ++ 0x7c, 0x23, 0x21, 0x1b, 0xcc, 0xbb, 0xaa, 0xf8, 0x39, 0x61, 0x29, 0xdf, ++ 0x38, 0xe8, 0xc1, 0x75, 0x78, 0x3b, 0x73, 0x7a, 0xcd, 0x80, 0xe7, 0x1c, ++ 0x69, 0x59, 0x09, 0x78, 0xce, 0xc1, 0xe7, 0xb4, 0xc4, 0x3c, 0x9d, 0x6f, ++ 0x62, 0x8e, 0xc9, 0xf2, 0x98, 0xdb, 0xa2, 0xac, 0x63, 0x2d, 0xe0, 0xed, ++ 0xb9, 0x5a, 0x5e, 0xe5, 0x9c, 0x2a, 0xc1, 0x5d, 0x72, 0x69, 0x79, 0x4c, ++ 0x36, 0x96, 0x27, 0xe4, 0xf2, 0xf2, 0xdd, 0x72, 0x65, 0x99, 0xf5, 0xf5, ++ 0x3c, 0x37, 0x69, 0xb5, 0xe6, 0x5c, 0xb4, 0xaf, 0x9a, 0x72, 0x22, 0x89, ++ 0x31, 0xab, 0x77, 0xc9, 0xfa, 0x66, 0xac, 0x9e, 0x86, 0x9c, 0x92, 0x37, ++ 0x2d, 0xd8, 0x7e, 0x5b, 0x16, 0x48, 0x97, 0x35, 0xc6, 0x47, 0xdd, 0x90, ++ 0x5d, 0xf6, 0xf5, 0x23, 0x1e, 0xbe, 0x1b, 0x31, 0x34, 0x6b, 0xdd, 0x63, ++ 0xd0, 0xcf, 0x16, 0x7c, 0x3e, 0xf8, 0x66, 0x0e, 0xf3, 0xc2, 0xa6, 0xf2, ++ 0xa3, 0xe6, 0x03, 0xd6, 0x5e, 0x58, 0x6d, 0xdf, 0xce, 0xd8, 0x2a, 0x76, ++ 0x66, 0xdd, 0x51, 0x79, 0x79, 0x97, 0xcc, 0xaa, 0xb9, 0x72, 0x9b, 0x29, ++ 0xe4, 0x4d, 0xb5, 0x67, 0xbc, 0xbb, 0x81, 0xbd, 0x70, 0xac, 0x85, 0x67, ++ 0xe8, 0x3c, 0x8c, 0x2b, 0x2f, 0x8b, 0x1c, 0xa9, 0x0e, 0xc8, 0xdc, 0x6a, ++ 0x56, 0xc1, 0xcc, 0x5c, 0xd6, 0x5e, 0x25, 0x87, 0xe0, 0xeb, 0xa9, 0xa8, ++ 0x6e, 0x4e, 0x8f, 0x2f, 0xaa, 0xba, 0x8d, 0xcf, 0xe0, 0x9d, 0xcc, 0x61, ++ 0xfc, 0xac, 0x95, 0x3f, 0xcc, 0x76, 0x3b, 0xcc, 0xbd, 0xa7, 0xda, 0xea, ++ 0xec, 0x3e, 0xb3, 0x59, 0xff, 0xc1, 0x7a, 0x87, 0x13, 0xb5, 0x47, 0x37, ++ 0xe1, 0x3c, 0x51, 0xd3, 0xe7, 0x29, 0xe5, 0x1c, 0xf5, 0xe7, 0x20, 0x64, ++ 0x99, 0xf3, 0x79, 0x6e, 0xe7, 0xa8, 0x73, 0xe6, 0x6f, 0x8d, 0xb6, 0x9f, ++ 0xab, 0x70, 0x5d, 0x4b, 0x1a, 0x41, 0x5a, 0xe9, 0x35, 0xd6, 0xdf, 0x55, ++ 0xaa, 0xd4, 0xb5, 0xc3, 0x61, 0xbe, 0xea, 0xdd, 0xf2, 0x67, 0x7c, 0x87, ++ 0x25, 0xbe, 0x5a, 0x83, 0xef, 0x21, 0xcd, 0xda, 0x6b, 0x10, 0x79, 0xc6, ++ 0x63, 0xc9, 0x25, 0xd0, 0xfa, 0x0a, 0xe1, 0xa8, 0xd1, 0x4f, 0xdf, 0x05, ++ 0x1a, 0x92, 0x7e, 0xe0, 0x19, 0xf8, 0xeb, 0x0b, 0xb8, 0xbe, 0xe8, 0x60, ++ 0x4c, 0xc0, 0xf9, 0xe8, 0x5b, 0x75, 0xe4, 0xdb, 0x41, 0x87, 0x7c, 0xdd, ++ 0x62, 0x1d, 0x6e, 0x5c, 0xae, 0x59, 0xbb, 0x40, 0xf7, 0xb4, 0xca, 0xdb, ++ 0x17, 0x30, 0x76, 0x23, 0xe0, 0xf3, 0x18, 0xf8, 0xc1, 0x10, 0xeb, 0x6e, ++ 0xfa, 0xf5, 0xd4, 0x0d, 0x4e, 0xf8, 0x6d, 0x03, 0xfb, 0x74, 0x9d, 0xf6, ++ 0xf5, 0x71, 0xe3, 0x69, 0x5b, 0xa2, 0x71, 0xb4, 0x1d, 0x9d, 0x61, 0xae, ++ 0x1b, 0x63, 0x78, 0xe6, 0x95, 0xb4, 0x79, 0x8e, 0x02, 0x18, 0xfb, 0x20, ++ 0x73, 0xc4, 0xdd, 0x49, 0xf5, 0xed, 0xce, 0x0e, 0x55, 0xdb, 0x32, 0x06, ++ 0x7a, 0xf0, 0xbb, 0xaa, 0x28, 0x27, 0x69, 0x6d, 0xe2, 0x5c, 0x06, 0x38, ++ 0xf6, 0x89, 0x36, 0x9c, 0xdf, 0x01, 0x39, 0x1a, 0x94, 0x55, 0x75, 0x76, ++ 0xc0, 0xbc, 0xa4, 0x29, 0x73, 0x49, 0xb4, 0xad, 0xde, 0x21, 0x8d, 0x55, ++ 0x18, 0xc3, 0x7e, 0xad, 0x87, 0x9a, 0x58, 0x6f, 0xe5, 0x26, 0xbe, 0x21, ++ 0xcf, 0xfc, 0x68, 0x3b, 0x65, 0xbb, 0x11, 0xb4, 0xd3, 0x35, 0x63, 0xa7, ++ 0xcd, 0x88, 0xae, 0xbc, 0xbf, 0x55, 0xdd, 0x65, 0xc4, 0xef, 0x63, 0xaa, ++ 0x56, 0x2c, 0xe6, 0xfd, 0x43, 0x68, 0xe7, 0x84, 0x75, 0xfd, 0x63, 0xe2, ++ 0xdf, 0x50, 0xdf, 0xaf, 0x75, 0xe9, 0x82, 0x4b, 0x1b, 0xc7, 0x33, 0x94, ++ 0x4e, 0xf1, 0x6d, 0x1d, 0xe7, 0x54, 0x5c, 0xca, 0x46, 0x21, 0xcd, 0x73, ++ 0x88, 0x23, 0xd2, 0xd7, 0x0b, 0xdf, 0x61, 0x2c, 0x2e, 0xd1, 0xb7, 0x45, ++ 0xac, 0x9d, 0x6f, 0xb5, 0x5e, 0xe7, 0xf9, 0x2b, 0x70, 0x7b, 0x56, 0x9d, ++ 0x21, 0x42, 0xe6, 0xba, 0x2d, 0xd0, 0xf9, 0x7a, 0x4d, 0x7f, 0x03, 0x63, ++ 0x56, 0xd0, 0xf7, 0xdc, 0x26, 0x6c, 0xd4, 0xcd, 0xf0, 0xe3, 0x9c, 0xff, ++ 0xdb, 0x2a, 0x27, 0x6f, 0x18, 0x1b, 0xea, 0x3e, 0xe6, 0xf5, 0x98, 0xd7, ++ 0xb5, 0x21, 0x13, 0xfd, 0xf8, 0x41, 0xff, 0x2a, 0x39, 0xa7, 0x8c, 0x90, ++ 0x4e, 0xef, 0x94, 0x0b, 0xed, 0x91, 0xfb, 0xab, 0x3e, 0xe2, 0x42, 0xbf, ++ 0xd5, 0xe5, 0xf4, 0xfa, 0x09, 0x8f, 0x71, 0x65, 0xc6, 0x87, 0x73, 0xe1, ++ 0x77, 0x7b, 0x4e, 0xfa, 0x01, 0xec, 0xe1, 0x28, 0xe2, 0xc2, 0x97, 0x5c, ++ 0xe6, 0x48, 0xef, 0x94, 0xab, 0x76, 0xe6, 0x2b, 0xdc, 0xa4, 0x39, 0x32, ++ 0x21, 0xa5, 0xf3, 0xce, 0xd8, 0x03, 0xc2, 0xd8, 0x2f, 0x93, 0xde, 0x4f, ++ 0xbc, 0x6d, 0xd6, 0xfa, 0x5a, 0x21, 0x2f, 0x4c, 0xc8, 0xde, 0xf3, 0xdf, ++ 0x57, 0xb9, 0xe9, 0x87, 0xdc, 0xf6, 0x7a, 0x33, 0x55, 0xf7, 0x34, 0xb1, ++ 0x43, 0xf8, 0x3d, 0x98, 0x40, 0x83, 0x83, 0xc7, 0x73, 0xac, 0x6d, 0x62, ++ 0x5d, 0xb2, 0xba, 0xca, 0x31, 0x55, 0xd3, 0x64, 0xc9, 0x8c, 0xaa, 0x2f, ++ 0x4c, 0xc8, 0x93, 0x01, 0x69, 0xda, 0xa3, 0xea, 0x9d, 0xbe, 0x09, 0xda, ++ 0xce, 0x05, 0xba, 0xce, 0x71, 0x26, 0xd0, 0xdf, 0x90, 0xcd, 0x04, 0xcc, ++ 0xad, 0x32, 0xc7, 0xfa, 0x4e, 0xf5, 0x50, 0xd7, 0xeb, 0x81, 0x98, 0x6b, ++ 0xdc, 0x80, 0x0d, 0x2c, 0xd6, 0x6d, 0x75, 0x7e, 0x56, 0xb6, 0x77, 0xc8, ++ 0x91, 0xb1, 0x4e, 0xe0, 0xbc, 0x5f, 0xc9, 0x85, 0xe9, 0x7c, 0x0c, 0x31, ++ 0x1b, 0x63, 0x27, 0xda, 0xbe, 0x08, 0xcf, 0xbb, 0xd1, 0xf6, 0x36, 0x70, ++ 0xcf, 0x36, 0xc4, 0x73, 0xca, 0x77, 0x7b, 0x0a, 0xf2, 0xc1, 0x9a, 0xe1, ++ 0x46, 0x5f, 0x41, 0xd1, 0x83, 0xf9, 0x90, 0x48, 0xf7, 0x44, 0xf5, 0x5f, ++ 0x8c, 0x47, 0xed, 0xf0, 0xcc, 0x97, 0xf9, 0x90, 0x7e, 0x29, 0xaf, 0x52, ++ 0xbf, 0x68, 0x19, 0xbc, 0x1a, 0xdb, 0x25, 0x7e, 0xe3, 0x56, 0xe7, 0xd7, ++ 0xad, 0xd6, 0xcb, 0xae, 0x8a, 0x13, 0x4f, 0xfa, 0x21, 0x8d, 0xa7, 0x73, ++ 0x8c, 0x47, 0xad, 0x10, 0xc7, 0x3d, 0xe1, 0x99, 0x3d, 0x7c, 0xf8, 0xfe, ++ 0x6e, 0x9e, 0x61, 0xf5, 0x6a, 0xfc, 0x32, 0xa6, 0xfc, 0x45, 0xe8, 0x0f, ++ 0x32, 0x9e, 0xec, 0x57, 0xbe, 0xbd, 0xd9, 0x8c, 0xf8, 0x84, 0xb5, 0x2b, ++ 0x8c, 0x35, 0x47, 0x25, 0xdf, 0x88, 0x49, 0x7e, 0x80, 0xcf, 0xcf, 0x87, ++ 0x73, 0x79, 0xdf, 0x92, 0x7d, 0x93, 0x5b, 0xcf, 0xa5, 0xa7, 0x74, 0x0c, ++ 0xdb, 0x1d, 0x9d, 0x4d, 0x6f, 0xad, 0x19, 0x56, 0x70, 0x82, 0x67, 0x22, ++ 0x18, 0xf4, 0xbb, 0xf6, 0x02, 0x5e, 0xe6, 0xf7, 0xfa, 0x1d, 0xd6, 0xbc, ++ 0xc4, 0x64, 0xb2, 0x3f, 0x03, 0x87, 0x43, 0xc3, 0xd3, 0x6c, 0xc4, 0xd1, ++ 0x17, 0xc1, 0xa9, 0x63, 0xdf, 0x66, 0x23, 0xa3, 0xea, 0xbc, 0xe2, 0xb0, ++ 0xed, 0x93, 0x03, 0xc4, 0xf3, 0x56, 0x38, 0x3e, 0x1f, 0xbb, 0xf5, 0xb7, ++ 0x60, 0x1f, 0x6d, 0x83, 0x4f, 0xfb, 0x5a, 0xb4, 0x07, 0x17, 0xd7, 0x92, ++ 0xe1, 0xf9, 0x39, 0xfc, 0x89, 0x65, 0xc6, 0xe1, 0x84, 0xb1, 0x1f, 0xfa, ++ 0x0c, 0x7b, 0x54, 0xb8, 0x6d, 0x97, 0x9f, 0x28, 0x7e, 0x8f, 0x2b, 0xbe, ++ 0x98, 0xcd, 0x71, 0x2f, 0xf1, 0x30, 0x9e, 0x27, 0x5c, 0x99, 0xb0, 0xa6, ++ 0x8f, 0xf0, 0xf5, 0xf6, 0x69, 0xfa, 0xef, 0x09, 0xf7, 0x1b, 0xd5, 0x01, ++ 0x72, 0xad, 0xdb, 0x31, 0xff, 0xf7, 0x5a, 0x78, 0x17, 0x9d, 0x2b, 0xc8, ++ 0x7f, 0xf4, 0x9d, 0xcb, 0xed, 0x7a, 0x2d, 0xe5, 0x5f, 0x6c, 0xfd, 0xf6, ++ 0x95, 0xf2, 0x15, 0xe1, 0x90, 0x6b, 0xf4, 0x87, 0x39, 0x7a, 0xc2, 0xd0, ++ 0xb5, 0x05, 0x86, 0x8c, 0x7b, 0xa3, 0x8e, 0xdb, 0xdd, 0xb6, 0x77, 0xf2, ++ 0x5a, 0xaf, 0xcc, 0xd7, 0xbb, 0xa5, 0x52, 0xdf, 0xc6, 0x7c, 0xc5, 0x98, ++ 0x08, 0xfd, 0x9f, 0xe9, 0xb0, 0x16, 0x5c, 0x44, 0xd7, 0x69, 0x47, 0xf2, ++ 0xd9, 0x8b, 0x71, 0xd4, 0xc5, 0xb8, 0x36, 0xb4, 0x7e, 0x6a, 0xc8, 0xcd, ++ 0x35, 0x81, 0x73, 0x9b, 0x35, 0x81, 0xba, 0xbe, 0xa7, 0xbc, 0x59, 0x6f, ++ 0xc1, 0xda, 0xb2, 0xf6, 0x5a, 0x1e, 0x5f, 0x0e, 0xed, 0xe9, 0x92, 0xa1, ++ 0xa5, 0xee, 0x90, 0x47, 0x3f, 0x16, 0xd9, 0x04, 0x29, 0x2e, 0x4e, 0xc9, ++ 0xd0, 0xe2, 0x33, 0xf0, 0x2d, 0x55, 0x1d, 0x31, 0xc6, 0x44, 0xba, 0x62, ++ 0x98, 0x63, 0xc2, 0x3c, 0x06, 0xc7, 0x81, 0x5e, 0x7b, 0x32, 0x63, 0x69, ++ 0x73, 0x10, 0xba, 0xec, 0x11, 0x19, 0x3a, 0x33, 0x25, 0xac, 0x9d, 0x2e, ++ 0xb8, 0x3c, 0xd9, 0xa6, 0xcf, 0x35, 0x28, 0xd9, 0x0b, 0x7a, 0x3d, 0x67, ++ 0x91, 0xfd, 0x59, 0xf8, 0x74, 0xec, 0x2f, 0xa6, 0xf4, 0xd7, 0x64, 0x77, ++ 0x81, 0x9f, 0x3a, 0xc2, 0x1c, 0x8f, 0x25, 0x85, 0x45, 0xce, 0x67, 0x5e, ++ 0xe2, 0x19, 0xd0, 0xac, 0x98, 0x36, 0x85, 0x73, 0xd4, 0x7a, 0xb8, 0x8f, ++ 0xce, 0x5f, 0x88, 0xeb, 0x09, 0x59, 0x85, 0xed, 0xcf, 0x37, 0x74, 0xed, ++ 0x79, 0xb9, 0x11, 0xd5, 0x4a, 0xfe, 0xda, 0xe6, 0xf7, 0x6d, 0x84, 0xb1, ++ 0x54, 0xdd, 0xca, 0x7b, 0xf7, 0x85, 0x35, 0xe8, 0x5d, 0xea, 0x5c, 0xb3, ++ 0x4d, 0xff, 0x85, 0xe3, 0xff, 0xb8, 0x8f, 0x67, 0xde, 0x22, 0xec, 0x1f, ++ 0x08, 0xfb, 0xe1, 0xc3, 0x20, 0xfe, 0xa7, 0x1c, 0x0c, 0x35, 0xa3, 0x71, ++ 0xff, 0xa1, 0x4f, 0xd7, 0x91, 0x13, 0x4f, 0x5e, 0x08, 0xb3, 0x8b, 0x58, ++ 0x92, 0x6d, 0xa3, 0x98, 0x4b, 0x3a, 0xe1, 0xda, 0xe4, 0x7d, 0x4b, 0xe5, ++ 0xfe, 0x18, 0x23, 0x20, 0x86, 0xf5, 0x6d, 0xaf, 0x4b, 0xb5, 0xf1, 0x5c, ++ 0xf3, 0xfa, 0x7b, 0xb7, 0xc2, 0xc9, 0xbc, 0xd6, 0xd7, 0x42, 0x3e, 0x61, ++ 0x3f, 0x9f, 0xb7, 0x8e, 0xd9, 0xd5, 0x17, 0xf5, 0x5b, 0x8b, 0x91, 0x7c, ++ 0x10, 0x87, 0x3c, 0x8b, 0xc5, 0xf5, 0x82, 0x07, 0xd8, 0x78, 0x8f, 0x6b, ++ 0x58, 0x9b, 0x6f, 0x2d, 0xf2, 0xb7, 0x75, 0x1d, 0x0b, 0x6b, 0x47, 0xb2, ++ 0x7a, 0xab, 0xfa, 0x16, 0xea, 0xe0, 0x93, 0xc6, 0x46, 0x95, 0x75, 0x05, ++ 0xbe, 0x1c, 0xc9, 0xf5, 0xca, 0x6c, 0xdd, 0x44, 0x6c, 0xaa, 0xf2, 0xde, ++ 0x3c, 0x37, 0x86, 0x5f, 0x40, 0xda, 0x8c, 0x84, 0xf1, 0x6e, 0x17, 0xe2, ++ 0x62, 0xf2, 0xf1, 0x88, 0xac, 0x36, 0xc8, 0x37, 0x11, 0x1f, 0x77, 0x84, ++ 0xfc, 0xf5, 0xcd, 0xb8, 0x74, 0xfb, 0x88, 0x8d, 0x22, 0x59, 0x1e, 0x91, ++ 0x52, 0xa3, 0xfd, 0x3c, 0x8a, 0xb5, 0x32, 0xed, 0xdf, 0x85, 0xaa, 0xba, ++ 0xb3, 0xba, 0x0f, 0x3e, 0xb9, 0x9a, 0x64, 0x4e, 0x80, 0xe3, 0xb6, 0x87, ++ 0x76, 0xf6, 0x6e, 0x5b, 0xba, 0x77, 0x1a, 0xe2, 0x10, 0x36, 0xd8, 0x06, ++ 0xf5, 0x9e, 0xac, 0xec, 0x4b, 0xfa, 0x88, 0x15, 0x47, 0xc2, 0xf7, 0x7e, ++ 0x10, 0xcf, 0x1c, 0xdb, 0x17, 0xf6, 0xdf, 0x1e, 0x3e, 0x77, 0x87, 0xcf, ++ 0x31, 0x3c, 0x07, 0xad, 0x7a, 0x8d, 0x6b, 0xf2, 0xca, 0xef, 0x31, 0x78, ++ 0x5e, 0xe4, 0x49, 0xfc, 0x82, 0xc8, 0xde, 0xa0, 0x5b, 0x1e, 0x6d, 0x28, ++ 0xfc, 0x1a, 0xce, 0x22, 0x1d, 0x81, 0xa7, 0xc2, 0xfb, 0x9b, 0x65, 0xef, ++ 0x89, 0x1b, 0xea, 0x71, 0x3f, 0x6c, 0x6b, 0x1e, 0x69, 0x87, 0xb7, 0x00, ++ 0x58, 0xdf, 0xa9, 0x8e, 0x88, 0xb6, 0x49, 0xc7, 0xac, 0xa5, 0xaa, 0xae, ++ 0x97, 0x39, 0x52, 0x05, 0xac, 0xf5, 0xbf, 0xeb, 0xd3, 0xb5, 0x1c, 0x51, ++ 0x3d, 0x20, 0xe2, 0xf1, 0xfa, 0x48, 0x58, 0x43, 0xc0, 0xb9, 0xac, 0x4b, ++ 0x8c, 0xce, 0xf1, 0xda, 0xfd, 0x54, 0xda, 0x20, 0xda, 0x17, 0x17, 0x34, ++ 0x70, 0x31, 0xf6, 0x04, 0x75, 0x0c, 0xec, 0x53, 0x54, 0xe3, 0x5c, 0xb9, ++ 0xe9, 0xdb, 0xf4, 0xe7, 0x00, 0xeb, 0x9f, 0x07, 0xcc, 0xb5, 0x76, 0x49, ++ 0x6c, 0x29, 0xaa, 0x23, 0x22, 0x8d, 0xe9, 0x7f, 0x59, 0xf0, 0x41, 0x3f, ++ 0xb9, 0x25, 0x0f, 0xab, 0x36, 0xc5, 0xef, 0xed, 0x64, 0xb6, 0xfa, 0x5b, ++ 0x36, 0x6b, 0x34, 0x6d, 0x2f, 0xca, 0xdd, 0xc6, 0xc2, 0x7a, 0x95, 0x51, ++ 0xd1, 0xdf, 0x52, 0xb1, 0xcf, 0x97, 0x1d, 0x7b, 0x3e, 0xc9, 0x3a, 0xd6, ++ 0x3b, 0x62, 0x0a, 0x7e, 0xf5, 0x4d, 0x2d, 0xf4, 0x44, 0x02, 0xfe, 0xb2, ++ 0x0b, 0x1d, 0xa1, 0x61, 0xbb, 0x1c, 0xe4, 0x64, 0x78, 0x91, 0xf5, 0xed, ++ 0xdb, 0xd6, 0x69, 0x1b, 0xae, 0x04, 0x1c, 0x43, 0x59, 0x83, 0x4e, 0x85, ++ 0x8e, 0xde, 0x08, 0x3c, 0x55, 0x9f, 0xb1, 0x11, 0x7e, 0x27, 0x7b, 0x29, ++ 0x80, 0x7c, 0xa9, 0x9a, 0x71, 0xd6, 0xe7, 0xd0, 0x47, 0x4b, 0xa3, 0x9f, ++ 0x75, 0x60, 0x83, 0xaa, 0xae, 0xa3, 0x12, 0x3c, 0x8c, 0xeb, 0x53, 0x88, ++ 0x09, 0x75, 0xce, 0xbb, 0x12, 0xb0, 0xbe, 0xc3, 0x56, 0x67, 0x89, 0x43, ++ 0x8b, 0x25, 0xc8, 0x6f, 0xf4, 0x6d, 0x6f, 0x12, 0x6d, 0x84, 0xcf, 0xdf, ++ 0xe2, 0x1b, 0xb1, 0x96, 0xfc, 0x25, 0x9b, 0x32, 0x42, 0xf8, 0x58, 0x17, ++ 0xa2, 0x7d, 0x11, 0xfa, 0x79, 0x09, 0x8c, 0xe7, 0x7e, 0xbb, 0x69, 0xab, ++ 0x5a, 0xd4, 0x47, 0x59, 0xbc, 0xab, 0xa9, 0x6a, 0xec, 0x98, 0x0b, 0x70, ++ 0xec, 0x32, 0xe3, 0x2f, 0xa5, 0xdf, 0xf9, 0x1d, 0x66, 0xd1, 0x8e, 0x33, ++ 0xef, 0x1b, 0x70, 0x2d, 0xee, 0x87, 0xfb, 0xec, 0x59, 0x67, 0x2d, 0x7b, ++ 0x59, 0x9d, 0x65, 0xeb, 0x3d, 0x15, 0x83, 0x84, 0xfa, 0xde, 0xa0, 0xac, ++ 0xbe, 0xeb, 0xe3, 0xf7, 0x06, 0x3e, 0xec, 0x9c, 0xfa, 0x96, 0x49, 0x7d, ++ 0x6f, 0xd0, 0x08, 0xf6, 0x87, 0xdf, 0x1c, 0x90, 0x8f, 0x12, 0xd0, 0x87, ++ 0x3d, 0x68, 0xb3, 0xf1, 0x8b, 0x43, 0x3e, 0x59, 0x1f, 0xbf, 0x1d, 0xfe, ++ 0x19, 0xf1, 0xac, 0xbe, 0x33, 0xe6, 0xf7, 0xc8, 0xe0, 0x35, 0x7e, 0x67, ++ 0x40, 0x1f, 0x8c, 0xdf, 0x16, 0xd3, 0xff, 0xd2, 0x32, 0x7f, 0xb3, 0x0f, ++ 0x4e, 0x3e, 0x7c, 0x06, 0x70, 0x45, 0xf5, 0x84, 0xac, 0x7b, 0x6c, 0xb5, ++ 0x8e, 0xb8, 0x3c, 0xe7, 0x9c, 0xde, 0xb7, 0x82, 0x3d, 0x5e, 0x6e, 0x00, ++ 0x8f, 0x87, 0xd9, 0xc6, 0xfa, 0xa4, 0x4e, 0xc4, 0x22, 0x2a, 0xdf, 0xd6, ++ 0xbd, 0xe2, 0x6c, 0x97, 0x4b, 0xf5, 0xa4, 0xaa, 0xe5, 0x2a, 0xc3, 0xc7, ++ 0x6f, 0xca, 0xdf, 0xd8, 0xcc, 0x61, 0xef, 0x55, 0xf3, 0x23, 0x99, 0xe7, ++ 0x7b, 0x92, 0xb2, 0x77, 0x55, 0xeb, 0x94, 0xa3, 0x39, 0xf8, 0x2c, 0xe7, ++ 0xc5, 0xf8, 0x6c, 0x6e, 0x50, 0xae, 0x55, 0xf9, 0xae, 0x2c, 0xe6, 0x81, ++ 0x7f, 0x52, 0x94, 0xf7, 0xb7, 0x5b, 0x4d, 0xc0, 0x7b, 0x2d, 0xa0, 0xaf, ++ 0x0e, 0xff, 0x69, 0x9a, 0x73, 0x3c, 0x31, 0x4f, 0x71, 0x4c, 0x3f, 0x78, ++ 0x30, 0x8e, 0xfd, 0x58, 0x88, 0x03, 0xfa, 0xa4, 0x69, 0xb3, 0x8f, 0xf7, ++ 0x29, 0x69, 0x6e, 0x7e, 0xc7, 0xfb, 0x3d, 0xe0, 0x2f, 0xad, 0xf4, 0x52, ++ 0x74, 0x36, 0xce, 0xba, 0xcc, 0xd9, 0xfa, 0x41, 0xc8, 0x91, 0x15, 0xfa, ++ 0x65, 0x16, 0xd6, 0xf8, 0xcf, 0xb6, 0xf6, 0x13, 0x78, 0x76, 0xae, 0xfd, ++ 0x10, 0x6d, 0x5f, 0x78, 0x9e, 0x66, 0x21, 0x0e, 0x88, 0x64, 0xf3, 0xbe, ++ 0xd0, 0x9f, 0x68, 0xcf, 0x17, 0x65, 0x53, 0xe7, 0x98, 0x5f, 0x59, 0xfb, ++ 0x94, 0xcc, 0x00, 0xe6, 0x93, 0xe1, 0x3e, 0xef, 0x47, 0x3c, 0x72, 0xb5, ++ 0xc1, 0xb3, 0xed, 0x51, 0x5c, 0x59, 0xb3, 0x47, 0x98, 0xc7, 0xc3, 0xba, ++ 0x44, 0x0f, 0x7b, 0x7d, 0x44, 0xde, 0x5c, 0x9e, 0x90, 0x1f, 0x54, 0xb3, ++ 0xee, 0x5e, 0x95, 0xf7, 0xcd, 0xa4, 0x2e, 0xc9, 0x78, 0x7a, 0x1e, 0xb2, ++ 0xe6, 0xdb, 0x99, 0xd4, 0x55, 0xf8, 0xe4, 0xd7, 0x10, 0xbb, 0xf2, 0x7f, ++ 0x51, 0x34, 0x61, 0x0b, 0xaf, 0xa9, 0xba, 0x91, 0x0c, 0xf3, 0x19, 0x78, ++ 0x1e, 0x0c, 0x6b, 0x57, 0xf8, 0x1e, 0xf6, 0x0d, 0xca, 0x9b, 0xd5, 0x4d, ++ 0xdb, 0xcb, 0xf7, 0xe8, 0x7a, 0x30, 0x65, 0x5b, 0x0f, 0xed, 0xa0, 0x2e, ++ 0xe2, 0xfb, 0xf4, 0x1a, 0xd1, 0x18, 0xe2, 0x35, 0xca, 0x05, 0xda, 0xfa, ++ 0xdb, 0x01, 0x83, 0xb5, 0x22, 0xdc, 0xfb, 0x8f, 0x6d, 0xed, 0xff, 0x70, ++ 0x5e, 0xd6, 0xde, 0xa7, 0xd6, 0xe3, 0x39, 0xea, 0xa0, 0xfc, 0x55, 0x10, ++ 0xad, 0xc3, 0x1a, 0x16, 0xc6, 0x9f, 0xd4, 0x7f, 0xed, 0x30, 0x68, 0xdb, ++ 0xff, 0xa6, 0xca, 0xb1, 0x4d, 0x61, 0x3c, 0xed, 0x33, 0xf8, 0xa5, 0x91, ++ 0x0a, 0xf3, 0x44, 0x11, 0x2e, 0x79, 0x4f, 0x7c, 0xa6, 0x54, 0x0d, 0x9e, ++ 0x79, 0x8f, 0x1d, 0xf6, 0x47, 0x3e, 0xe9, 0x20, 0x64, 0xf6, 0x11, 0xc4, ++ 0x98, 0xd9, 0xd4, 0xa3, 0x12, 0xad, 0xdb, 0xba, 0x97, 0xe7, 0x4d, 0xa5, ++ 0xdc, 0xb8, 0x3d, 0xaf, 0xe0, 0xe1, 0x99, 0x68, 0xc6, 0xbe, 0xa4, 0xfe, ++ 0x4f, 0xc5, 0xd6, 0xbc, 0x42, 0x26, 0xbf, 0x2e, 0x59, 0x57, 0xd3, 0x66, ++ 0x44, 0xd6, 0x41, 0x9b, 0x7f, 0x19, 0xd2, 0xe6, 0x01, 0xac, 0xed, 0x9c, ++ 0x9a, 0x90, 0xec, 0xa9, 0x6c, 0xfa, 0xa4, 0xf0, 0xec, 0xb6, 0x8f, 0x67, ++ 0xb7, 0xc6, 0xfd, 0xb9, 0x34, 0xf6, 0x9b, 0xc1, 0x7e, 0x71, 0x0d, 0x78, ++ 0xcf, 0xff, 0x33, 0xb0, 0x8d, 0xb2, 0x7d, 0x2f, 0x73, 0x95, 0xc4, 0x45, ++ 0x49, 0xf5, 0xc1, 0x37, 0x79, 0x81, 0x30, 0x9d, 0x23, 0x7d, 0x54, 0x5e, ++ 0xf2, 0x6a, 0xc0, 0xef, 0x4d, 0x35, 0x7c, 0x45, 0xc0, 0x37, 0xa7, 0xe1, ++ 0x4b, 0xcf, 0x6c, 0xfa, 0xad, 0x99, 0xd4, 0x09, 0xa1, 0x6c, 0xd3, 0x77, ++ 0xa1, 0x4f, 0xff, 0x77, 0x3b, 0x74, 0xce, 0x0d, 0x31, 0xec, 0x3d, 0xf9, ++ 0xcd, 0xbd, 0x77, 0x60, 0xec, 0xe5, 0x9c, 0xaa, 0xd3, 0xb5, 0xf7, 0xcb, ++ 0xaf, 0x48, 0xfe, 0xe1, 0x4c, 0x3a, 0x6f, 0x38, 0xa1, 0xff, 0x87, 0x6b, ++ 0x83, 0xf7, 0xd4, 0xbb, 0x4e, 0x58, 0xa7, 0x43, 0xda, 0xe4, 0xf0, 0x2e, ++ 0x85, 0x5b, 0xc4, 0x4b, 0x83, 0xe0, 0x79, 0xf2, 0xda, 0x87, 0x21, 0x43, ++ 0xb6, 0x8a, 0xcd, 0x2e, 0x01, 0x8f, 0x15, 0xe0, 0xf1, 0xe8, 0x4d, 0xfe, ++ 0x57, 0x7c, 0xd3, 0xff, 0xda, 0x50, 0xef, 0xfb, 0x4b, 0xc0, 0x54, 0xb4, ++ 0xe9, 0x7b, 0x55, 0x36, 0x79, 0x85, 0x30, 0x4d, 0x40, 0x67, 0xf9, 0x72, ++ 0x25, 0x47, 0x7a, 0xc0, 0xff, 0xc2, 0x7a, 0x2b, 0xd7, 0x79, 0x09, 0xfb, ++ 0x57, 0xfc, 0x0b, 0xde, 0xcd, 0xd8, 0x96, 0x31, 0xa8, 0x74, 0xd4, 0x06, ++ 0xec, 0xd8, 0xeb, 0x80, 0x65, 0x43, 0xf1, 0x81, 0xe6, 0x81, 0x8d, 0x46, ++ 0xf7, 0xbb, 0xf0, 0x00, 0xf7, 0x49, 0xfe, 0x8b, 0x78, 0x2f, 0xa2, 0x65, ++ 0xc2, 0xef, 0x02, 0x4e, 0xee, 0xda, 0xed, 0x49, 0xe1, 0x54, 0x4b, 0xe6, ++ 0x5d, 0x31, 0xc6, 0x77, 0x93, 0x27, 0xe9, 0x2b, 0xc0, 0x7f, 0x4c, 0x11, ++ 0xc7, 0xda, 0x17, 0x9c, 0xf9, 0xfa, 0x76, 0xfc, 0x4e, 0xee, 0xe0, 0xf9, ++ 0x4e, 0xe1, 0x2c, 0xf5, 0x95, 0x18, 0x77, 0xee, 0xd6, 0xb1, 0xe1, 0xb5, ++ 0x24, 0x70, 0x8e, 0xfe, 0xa1, 0xe7, 0x3b, 0xc2, 0xfc, 0xa6, 0xb6, 0xcd, ++ 0x43, 0xcf, 0x13, 0xaf, 0xb8, 0x7e, 0xfd, 0xc7, 0xa1, 0x0e, 0x50, 0xba, ++ 0x37, 0x94, 0x0b, 0x5f, 0xe6, 0x72, 0xac, 0xa3, 0xec, 0x96, 0xbd, 0xd0, ++ 0x6b, 0xfb, 0xab, 0x53, 0xf2, 0xa5, 0x6a, 0x8f, 0xf2, 0x1d, 0xfe, 0x8d, ++ 0x9b, 0x4d, 0x8d, 0x19, 0x2d, 0xb9, 0x1f, 0x3e, 0xd0, 0xcc, 0x60, 0x87, ++ 0xfc, 0x60, 0x42, 0xd7, 0xb0, 0x5e, 0x63, 0x41, 0x9a, 0xcd, 0x3a, 0x4b, ++ 0xee, 0x07, 0x7a, 0xdf, 0x40, 0x1c, 0x60, 0x30, 0xbf, 0xdb, 0x23, 0x07, ++ 0x5c, 0x5c, 0x6f, 0x73, 0xd5, 0x37, 0xb6, 0x51, 0xde, 0x46, 0xeb, 0x11, ++ 0xc2, 0xcc, 0xeb, 0x50, 0x78, 0xfd, 0xd9, 0x8e, 0x36, 0x58, 0x8c, 0xb9, ++ 0x5c, 0x4c, 0xed, 0xaf, 0xd2, 0xa0, 0x7e, 0x0b, 0xf3, 0x53, 0x01, 0xcf, ++ 0x01, 0x7d, 0x59, 0x81, 0x7e, 0x29, 0xd7, 0xc5, 0x38, 0x9b, 0x83, 0x37, ++ 0xed, 0x68, 0xdf, 0xb3, 0x0c, 0xfe, 0x9a, 0xad, 0x53, 0xff, 0xed, 0x57, ++ 0xf5, 0xc7, 0xb3, 0xb0, 0x65, 0x88, 0x87, 0x67, 0x3a, 0xbd, 0x5b, 0x9d, ++ 0x2b, 0x5e, 0xff, 0xd6, 0xd5, 0xf4, 0xee, 0xeb, 0xe7, 0xb7, 0xc3, 0xa5, ++ 0x6a, 0xe4, 0x6f, 0x03, 0xa7, 0x0d, 0xfe, 0x7f, 0x88, 0x28, 0x57, 0xa8, ++ 0xdf, 0xad, 0xe3, 0x8a, 0xa8, 0xee, 0x39, 0xf2, 0x3b, 0x28, 0xb3, 0xb4, ++ 0x17, 0xe2, 0x27, 0xe0, 0xd7, 0x76, 0x9d, 0xea, 0x81, 0x2d, 0xf0, 0xc0, ++ 0x2b, 0x53, 0xb0, 0x87, 0x53, 0x52, 0x81, 0xff, 0xf6, 0x59, 0xf7, 0x19, ++ 0x31, 0x5f, 0x18, 0x95, 0x95, 0x7a, 0x17, 0xf0, 0x41, 0xbb, 0x10, 0x57, ++ 0xb1, 0xf5, 0xb5, 0xc3, 0x8c, 0x87, 0x68, 0x4b, 0x34, 0x2d, 0x36, 0x1a, ++ 0xcf, 0xf4, 0xeb, 0x6f, 0x40, 0xb6, 0xcb, 0x7a, 0x43, 0xd7, 0xb5, 0x55, ++ 0x18, 0x1b, 0xd6, 0xe3, 0xa1, 0x6d, 0xee, 0x86, 0xee, 0xfe, 0x2f, 0xf1, ++ 0xa6, 0x8a, 0xd3, 0xb9, 0x7f, 0xda, 0x20, 0xf5, 0xff, 0x40, 0xba, 0x9b, ++ 0x0e, 0xf7, 0xde, 0x6e, 0x83, 0xb4, 0xef, 0x61, 0xef, 0xe1, 0xfb, 0x78, ++ 0x1e, 0xc6, 0x3d, 0x26, 0x25, 0x7e, 0xee, 0x11, 0x31, 0x11, 0xb3, 0xc4, ++ 0x16, 0xe9, 0xef, 0xdd, 0x18, 0xb7, 0xc4, 0x2e, 0x3c, 0x16, 0x7e, 0xf3, ++ 0x39, 0xac, 0xfd, 0x99, 0x1c, 0xae, 0xcd, 0xe8, 0x3b, 0x50, 0xfe, 0xda, ++ 0xed, 0x66, 0x14, 0x57, 0xdc, 0xd2, 0x96, 0xe2, 0xef, 0xff, 0x01, 0xd2, ++ 0x6e, 0x3d, 0x16, 0xac, 0x4a, 0x00, 0x00, 0x00 }; + + static const u32 bnx2_COM_b09FwData[(0x0/4) + 1] = { 0x0 }; +-static const u32 bnx2_COM_b09FwRodata[(0x30/4) + 1] = { +- 0x80080100, 0x80080080, 0x80080000, 0x80080240, 0x08000e20, 0x08000e78, +- 0x08000ebc, 0x08000f50, 0x08000f94, 0x80080100, 0x80080080, 0x80080000, +- 0x00000000 }; ++static const u32 bnx2_COM_b09FwRodata[(0x38/4) + 1] = { ++ 0x80080100, 0x80080080, 0x80080000, 0x00000c80, 0x00003200, 0x80080240, ++ 0x08000f6c, 0x08000fc4, 0x08001008, 0x080010a0, 0x080010e0, 0x80080100, ++ 0x80080080, 0x80080000, 0x00000000 }; + + static struct fw_info bnx2_com_fw_09 = { +- /* Firmware version: 4.4.23 */ +- .ver_major = 0x4, +- .ver_minor = 0x4, +- .ver_fix = 0x17, +- +- .start_addr = 0x080000f8, ++ /* Firmware version: 5.0.0g */ ++ .ver_major = 0x5, ++ .ver_minor = 0x0, ++ .ver_fix = 0x0, ++ ++ .start_addr = 0x08000110, + + .text_addr = 0x08000000, +- .text_len = 0x4c18, ++ .text_len = 0x4aa8, + .text_index = 0x0, + .gz_text = bnx2_COM_b09FwText, + .gz_text_len = sizeof(bnx2_COM_b09FwText), +@@ -866,1210 +871,1217 @@ + .data_index = 0x0, + .data = bnx2_COM_b09FwData, + +- .sbss_addr = 0x08004c60, +- .sbss_len = 0x38, +- .sbss_index = 0x0, +- +- .bss_addr = 0x08004c98, +- .bss_len = 0xbc, +- .bss_index = 0x0, +- +- .rodata_addr = 0x08004c18, +- .rodata_len = 0x30, ++ .sbss_addr = 0x08004b00, ++ .sbss_len = 0x2c, ++ .sbss_index = 0x0, ++ ++ .bss_addr = 0x08004b30, ++ .bss_len = 0x10c, ++ .bss_index = 0x0, ++ ++ .rodata_addr = 0x08004aa8, ++ .rodata_len = 0x38, + .rodata_index = 0x0, + .rodata = bnx2_COM_b09FwRodata, + }; + + static u8 bnx2_CP_b09FwText[] = { +- 0xad, 0xbc, 0x0b, 0x74, 0x1c, 0xd5, 0x95, 0x2e, 0xfc, 0x55, 0x75, 0xb7, +- 0xd4, 0x92, 0xda, 0x52, 0x4b, 0x6e, 0xcb, 0x6d, 0xd0, 0xe0, 0x6a, 0xab, +- 0xda, 0x6a, 0x2c, 0x01, 0xd5, 0xb2, 0x0c, 0x4d, 0xa6, 0xc0, 0x1d, 0x5b, +- 0x80, 0x0c, 0x26, 0x11, 0xc6, 0xb9, 0x23, 0xe6, 0x7a, 0xfe, 0xf4, 0x18, +- 0x03, 0x86, 0x90, 0x5c, 0x33, 0x93, 0x9b, 0x71, 0xb8, 0x9e, 0xeb, 0x8a, +- 0xe4, 0x87, 0xc0, 0xa5, 0xee, 0x96, 0x90, 0x1f, 0xac, 0x35, 0xeb, 0xa7, +- 0x2d, 0xcb, 0x92, 0x21, 0xad, 0x16, 0x49, 0x98, 0x19, 0xe7, 0xe6, 0x81, +- 0xc6, 0xd8, 0x60, 0x93, 0xf0, 0xc8, 0x6b, 0xfd, 0x4c, 0xfe, 0xb9, 0x7f, +- 0x3c, 0xb6, 0x79, 0x83, 0xe3, 0x3c, 0x47, 0x9e, 0xc1, 0xa9, 0xff, 0xdb, +- 0xd5, 0xdd, 0xb6, 0xec, 0x40, 0x1e, 0xeb, 0x8e, 0xd6, 0xaa, 0xa5, 0xee, +- 0xaa, 0x73, 0xf6, 0x39, 0x67, 0x9f, 0xbd, 0xbf, 0xfd, 0xed, 0x73, 0x4e, +- 0xb5, 0x06, 0x54, 0xa3, 0xf4, 0x37, 0x8b, 0xd7, 0xd5, 0x1d, 0x1b, 0xee, +- 0x5e, 0xdc, 0x7e, 0x75, 0x87, 0x7c, 0xf7, 0xce, 0xf5, 0x7a, 0xf1, 0x61, +- 0x7f, 0x26, 0x12, 0x97, 0xde, 0xd2, 0x3e, 0xb4, 0xe0, 0x47, 0xfc, 0x25, +- 0x10, 0x91, 0x7f, 0xad, 0xa5, 0xaf, 0x1e, 0x20, 0x58, 0x6e, 0x5f, 0x2e, +- 0xf8, 0x55, 0xb3, 0xf3, 0xbf, 0x2e, 0xd3, 0xe1, 0xf7, 0x98, 0x9f, 0xff, +- 0x8b, 0xbb, 0x75, 0x20, 0x99, 0x6f, 0xd5, 0x96, 0xe3, 0x9c, 0x63, 0x85, +- 0xbc, 0x90, 0xfb, 0x7f, 0x62, 0x7e, 0xf0, 0xc4, 0xb7, 0xae, 0x8b, 0x9c, +- 0xc9, 0x79, 0xe0, 0x0f, 0x9a, 0x16, 0x82, 0x0b, 0xe1, 0x6f, 0x62, 0x9d, +- 0xbf, 0x6b, 0xd9, 0xa6, 0xa2, 0xb6, 0x2c, 0x2b, 0x12, 0xce, 0x21, 0x12, +- 0xb4, 0x10, 0x89, 0x59, 0x40, 0xca, 0x6b, 0x22, 0x55, 0x69, 0xfa, 0x51, +- 0xa1, 0x57, 0x20, 0x15, 0xdc, 0xa8, 0x6d, 0xe1, 0x18, 0x97, 0xd9, 0x7e, +- 0xed, 0x44, 0x1e, 0xb8, 0xdb, 0xf6, 0xe3, 0xb8, 0x27, 0xa0, 0x9d, 0xcc, +- 0xef, 0xab, 0x2b, 0xea, 0x23, 0x09, 0x8f, 0x8e, 0x94, 0x6a, 0xca, 0x7d, +- 0x68, 0xcb, 0xf3, 0x48, 0xf9, 0xcc, 0xcf, 0x6b, 0xe3, 0x36, 0xd0, 0x9b, +- 0x69, 0x36, 0x4e, 0xa0, 0x35, 0x7c, 0x18, 0x95, 0x48, 0x85, 0x22, 0x31, +- 0xe0, 0x83, 0x73, 0x8f, 0x66, 0x14, 0xf8, 0xf4, 0xd9, 0xe8, 0xdc, 0x0b, +- 0x3c, 0x92, 0x89, 0x24, 0x75, 0x05, 0xe8, 0x9f, 0x94, 0xba, 0x91, 0x60, +- 0x8e, 0xcf, 0xb7, 0x64, 0x80, 0xad, 0x99, 0xd9, 0xd8, 0x96, 0x75, 0xf0, +- 0x9c, 0xd1, 0x1c, 0xdc, 0xc7, 0x16, 0x7a, 0xdd, 0xe7, 0xb3, 0x61, 0xe5, +- 0xe4, 0xf9, 0x5b, 0xce, 0xb7, 0x5a, 0x82, 0x78, 0x7a, 0x32, 0x84, 0x67, +- 0x27, 0xeb, 0xf1, 0x48, 0xb6, 0x1e, 0xdb, 0xb3, 0x31, 0xa8, 0xba, 0x83, +- 0x58, 0x3c, 0x86, 0x8a, 0xeb, 0x1d, 0x9c, 0x34, 0xda, 0xb0, 0x95, 0x82, +- 0x5f, 0x6d, 0x6b, 0xc4, 0xda, 0x60, 0x13, 0xb6, 0xe8, 0xd7, 0xa1, 0x38, +- 0xd6, 0x0f, 0xce, 0x65, 0x32, 0xd2, 0x3f, 0xaf, 0xaa, 0xea, 0x37, 0xe2, +- 0xf4, 0x4e, 0x13, 0xef, 0xef, 0xc4, 0x9a, 0x5a, 0x38, 0x4e, 0x3e, 0x1e, +- 0xed, 0x7e, 0x50, 0x09, 0x6a, 0x4f, 0xe5, 0xd9, 0xa1, 0x55, 0x5e, 0xca, +- 0x83, 0x36, 0x92, 0x9f, 0x39, 0x15, 0x6c, 0x2f, 0xc3, 0x76, 0x33, 0xd2, +- 0x97, 0x30, 0xbe, 0xd5, 0xf2, 0xdf, 0x68, 0x0f, 0xc5, 0x31, 0x6d, 0xcd, +- 0xbc, 0xc6, 0x3e, 0x69, 0xec, 0x4f, 0x13, 0xbe, 0x36, 0x19, 0xc6, 0x57, +- 0xd9, 0xb7, 0xaf, 0x4c, 0x4a, 0x1f, 0x23, 0x7b, 0x2c, 0xd4, 0x63, 0x34, +- 0xdb, 0x84, 0xa7, 0xf5, 0x36, 0x7c, 0x85, 0x7d, 0xec, 0x33, 0x62, 0x58, +- 0x9b, 0xb8, 0x8b, 0xfd, 0x51, 0xb0, 0xaa, 0xed, 0x2f, 0x4b, 0xfd, 0x8a, +- 0x68, 0x50, 0x55, 0x24, 0x1b, 0x22, 0x31, 0x4d, 0x15, 0x99, 0x17, 0xfa, +- 0x3b, 0x90, 0x81, 0xe5, 0x37, 0xa5, 0xcf, 0x37, 0x22, 0xcf, 0xfe, 0x7e, +- 0x79, 0x67, 0xd4, 0x58, 0xaf, 0x62, 0x65, 0x80, 0x7d, 0x7e, 0x20, 0x1e, +- 0x4d, 0x2c, 0x62, 0x9f, 0xc7, 0xf3, 0x2a, 0xc7, 0x13, 0xd2, 0xc6, 0xd8, +- 0xf7, 0xe4, 0x2a, 0x95, 0x7d, 0x67, 0x5f, 0x32, 0xec, 0x4b, 0x86, 0x7d, +- 0xc9, 0xb0, 0x2f, 0x6e, 0xbf, 0x63, 0xec, 0x73, 0x71, 0x8e, 0x46, 0xf2, +- 0xc7, 0xd9, 0xdf, 0x99, 0xfd, 0x6c, 0x62, 0xdf, 0x91, 0xaa, 0xe7, 0xbc, +- 0x35, 0xa7, 0x65, 0xde, 0x1c, 0xe7, 0x55, 0xc3, 0x71, 0x7e, 0x6e, 0x04, +- 0xa8, 0xbf, 0x0c, 0xed, 0xa0, 0xdc, 0x9f, 0xf9, 0x56, 0x85, 0x89, 0x4e, +- 0x9a, 0xa0, 0x73, 0xa4, 0x23, 0x9a, 0x68, 0x50, 0x54, 0x78, 0xf5, 0xa0, +- 0xd6, 0x52, 0x88, 0x18, 0xd4, 0x8f, 0x16, 0x2d, 0x40, 0xd3, 0x0b, 0x94, +- 0x75, 0x51, 0xbb, 0x91, 0xe0, 0x14, 0xa4, 0x5d, 0x8d, 0xed, 0x1f, 0x2f, +- 0xcd, 0x9d, 0xc8, 0x0f, 0xb3, 0x4d, 0x69, 0x5f, 0x64, 0x3b, 0xce, 0xcf, +- 0x0c, 0xe8, 0x41, 0x44, 0xad, 0x41, 0xda, 0x9f, 0xc7, 0x0c, 0x6a, 0x1b, +- 0xf2, 0x7c, 0x7e, 0x5e, 0x46, 0x71, 0x3e, 0xd6, 0xe6, 0xb5, 0xd2, 0x18, +- 0x22, 0xec, 0x82, 0xd8, 0x41, 0x38, 0x15, 0x30, 0x83, 0xd2, 0xf7, 0xee, +- 0x3d, 0x03, 0x9b, 0x9d, 0x79, 0xba, 0xe8, 0x4a, 0xdf, 0x38, 0xcf, 0x13, +- 0x48, 0x9c, 0x5e, 0xf2, 0x90, 0x35, 0xab, 0x23, 0x8e, 0x6a, 0x1d, 0x81, +- 0x2a, 0x1d, 0xdd, 0xe9, 0x89, 0x6a, 0xab, 0xc6, 0xfc, 0xe6, 0x9d, 0x03, +- 0x13, 0x7e, 0x54, 0x4f, 0xe8, 0xa8, 0x9a, 0x78, 0xdc, 0x8b, 0x5a, 0x03, +- 0x3b, 0x26, 0xff, 0xcc, 0x5b, 0x1c, 0xdb, 0xcd, 0xa5, 0x31, 0xba, 0xb6, +- 0xef, 0x7f, 0xdd, 0x3e, 0xe3, 0x54, 0xe8, 0x55, 0x7f, 0xe6, 0x31, 0x75, +- 0x6d, 0x0c, 0x38, 0xb3, 0xb6, 0x63, 0x39, 0x7a, 0x83, 0x0a, 0xe6, 0xeb, +- 0x7f, 0x32, 0x0b, 0xb5, 0x26, 0xac, 0xc9, 0xc6, 0x54, 0x85, 0x19, 0x4a, +- 0x71, 0x6e, 0xf0, 0x82, 0x9d, 0x83, 0x6f, 0xc0, 0x71, 0xa4, 0xec, 0x49, +- 0xdc, 0x79, 0xa7, 0x6a, 0x1e, 0xba, 0xc6, 0x87, 0x4e, 0x96, 0xc7, 0xa6, +- 0xa3, 0x1d, 0x3f, 0x57, 0xd4, 0x9d, 0xdd, 0xb0, 0xc6, 0x3d, 0x48, 0x06, +- 0x53, 0xfc, 0x7f, 0xc5, 0x15, 0x2b, 0x13, 0xdd, 0xb0, 0xc7, 0xa7, 0x79, +- 0xdf, 0xcb, 0x7b, 0x26, 0xd2, 0x99, 0x2b, 0xae, 0xb8, 0x3d, 0x91, 0xc2, +- 0xc0, 0xb8, 0x7c, 0xf6, 0x62, 0xaa, 0x3e, 0x85, 0xed, 0xbb, 0x35, 0xd4, +- 0xe9, 0xdd, 0xc8, 0x8c, 0xcb, 0x67, 0xc7, 0x39, 0x65, 0x7c, 0x09, 0x7b, +- 0xda, 0xe8, 0xff, 0x73, 0xbb, 0xb1, 0x6d, 0xb7, 0x85, 0x4a, 0xdd, 0xa2, +- 0xee, 0x15, 0xef, 0x3f, 0xb7, 0x29, 0xd0, 0xee, 0x84, 0xb7, 0x42, 0x17, +- 0xbd, 0x25, 0xbc, 0xf7, 0xd8, 0x66, 0x70, 0xbe, 0xee, 0x38, 0x23, 0xc6, +- 0x22, 0x7c, 0xba, 0x7b, 0x2d, 0xac, 0x7d, 0x01, 0x58, 0xab, 0xe5, 0x7f, +- 0x37, 0x75, 0xb8, 0x16, 0xbd, 0xfb, 0xd6, 0xa2, 0xff, 0x31, 0x3a, 0x6e, +- 0x7d, 0xd0, 0x9d, 0xa7, 0x6f, 0xb5, 0x48, 0x9f, 0xa4, 0x7f, 0x3d, 0xbc, +- 0x44, 0xb7, 0x5f, 0xe0, 0x7f, 0x29, 0x33, 0xed, 0x60, 0xce, 0x85, 0x32, +- 0xdb, 0x59, 0x66, 0xdb, 0x45, 0x65, 0x4c, 0x3c, 0x31, 0x29, 0xba, 0x10, +- 0x95, 0xfd, 0x3e, 0x5d, 0x7c, 0xdb, 0xe9, 0x0d, 0x89, 0x2e, 0xac, 0x1e, +- 0x1f, 0x22, 0xdd, 0xf7, 0x2a, 0x5e, 0xac, 0x18, 0x00, 0xeb, 0xd0, 0x09, +- 0xaa, 0x23, 0xc9, 0x85, 0x8a, 0x89, 0xea, 0x01, 0x05, 0x2b, 0xe2, 0x55, +- 0xd0, 0xea, 0x45, 0xde, 0x8f, 0x1c, 0x2b, 0x28, 0xfd, 0x3d, 0x8a, 0x1a, +- 0xde, 0x5f, 0x17, 0xff, 0x01, 0xf1, 0x4c, 0xfa, 0x14, 0x67, 0xf9, 0x3b, +- 0x78, 0xff, 0x95, 0x19, 0xdf, 0xa5, 0x9c, 0xe3, 0xf4, 0x19, 0x06, 0xfa, +- 0x33, 0x6d, 0xd8, 0x9e, 0x49, 0x46, 0xa8, 0x25, 0xcb, 0x67, 0xf2, 0xbe, +- 0x19, 0xed, 0xea, 0x85, 0xb4, 0x03, 0xa5, 0xda, 0x84, 0x37, 0xdf, 0x71, +- 0xdc, 0xff, 0x92, 0xad, 0xf7, 0x3c, 0xa5, 0xf8, 0x68, 0xec, 0xd2, 0xce, +- 0x71, 0xff, 0x2b, 0xb6, 0x82, 0x37, 0xf5, 0xe8, 0x86, 0x77, 0x94, 0xe3, +- 0xfe, 0x97, 0xf3, 0x41, 0xcc, 0x1b, 0x88, 0xf4, 0x58, 0x4a, 0x02, 0x5f, +- 0xcf, 0x87, 0x10, 0x1e, 0x30, 0x71, 0x30, 0x6f, 0xe0, 0xc9, 0x8b, 0x70, +- 0xe0, 0x43, 0xff, 0x2c, 0x0f, 0xc7, 0xbe, 0xce, 0xd6, 0xd0, 0x6b, 0x9c, +- 0x73, 0x92, 0x41, 0xa4, 0xea, 0xcc, 0xe3, 0xfe, 0xf7, 0x07, 0xa0, 0xd4, +- 0x9a, 0x7a, 0xb8, 0xa0, 0xfc, 0xab, 0x93, 0x0a, 0x49, 0x31, 0xf6, 0xcf, +- 0xc5, 0xb2, 0x24, 0xed, 0xce, 0x20, 0xce, 0x9d, 0x71, 0x6a, 0x68, 0xb3, +- 0x15, 0xe6, 0x65, 0x18, 0x1f, 0xd6, 0xf1, 0xa4, 0xed, 0x38, 0xef, 0x19, +- 0x53, 0x89, 0x00, 0xf4, 0xee, 0x77, 0x11, 0x49, 0x2e, 0xa2, 0x5e, 0x8e, +- 0xe6, 0x75, 0x8c, 0xda, 0x26, 0x9e, 0xb3, 0x9b, 0x83, 0x7d, 0x58, 0x8c, +- 0x64, 0xb8, 0x18, 0x43, 0x26, 0xd8, 0xef, 0x91, 0x68, 0x37, 0xea, 0xcc, +- 0x04, 0x0e, 0xb1, 0xdf, 0xa7, 0x97, 0x88, 0x1c, 0x03, 0x2f, 0xff, 0x01, +- 0x7d, 0x25, 0xbe, 0xe3, 0x71, 0xf6, 0x35, 0xb1, 0xf8, 0x9c, 0x83, 0xd9, +- 0x7e, 0x9c, 0x30, 0xe6, 0xd2, 0x0e, 0x61, 0x55, 0x99, 0x7e, 0x6f, 0xbf, +- 0x1d, 0xc4, 0x81, 0x7c, 0xc0, 0xdb, 0x67, 0x87, 0xb0, 0x8f, 0xfe, 0x36, +- 0x8f, 0xa6, 0x1e, 0xa6, 0xdc, 0x79, 0xc4, 0xb5, 0xc2, 0x70, 0x13, 0x26, +- 0x87, 0x23, 0xc6, 0x2b, 0x4a, 0x18, 0x63, 0xa3, 0x97, 0x61, 0x62, 0x58, +- 0xc1, 0x78, 0x94, 0x7d, 0xe7, 0xe7, 0x2f, 0x0f, 0x5f, 0x81, 0xfc, 0xb0, +- 0x07, 0x3b, 0x5c, 0xbd, 0xba, 0x38, 0x53, 0xfa, 0x7f, 0x19, 0x72, 0xa3, +- 0xf0, 0x2e, 0x1a, 0x08, 0xe2, 0xa9, 0xbc, 0xd7, 0xab, 0x0f, 0x84, 0x30, +- 0x9a, 0xff, 0x36, 0xe7, 0x4d, 0x64, 0x6b, 0x18, 0xb1, 0xc7, 0xdc, 0x39, +- 0xac, 0x33, 0x29, 0xac, 0x18, 0x5f, 0x19, 0xcb, 0x34, 0xc6, 0x99, 0x04, +- 0x71, 0x48, 0x7c, 0xdc, 0x4f, 0x0c, 0x12, 0x1f, 0x7f, 0x4d, 0x41, 0x6d, +- 0x02, 0x7d, 0x93, 0xe5, 0xe7, 0x0a, 0xed, 0xdf, 0x8b, 0x75, 0x41, 0x03, +- 0x76, 0x46, 0xec, 0xb4, 0x8c, 0xcb, 0xf2, 0x59, 0xe6, 0xbf, 0x1a, 0xd6, +- 0xfe, 0x6a, 0xec, 0xa0, 0x8f, 0x3d, 0xba, 0x53, 0xee, 0x3b, 0xce, 0x7d, +- 0xf1, 0x3a, 0xda, 0x18, 0x6e, 0xaa, 0x42, 0xd4, 0x78, 0xcb, 0xed, 0x9b, +- 0x85, 0xb1, 0xbc, 0xc4, 0x50, 0x8d, 0xf1, 0xed, 0x28, 0xdb, 0xea, 0x60, +- 0x3b, 0x06, 0xbe, 0x3d, 0xd9, 0x86, 0x7f, 0x9c, 0x8c, 0xe1, 0x1f, 0x26, +- 0x75, 0xfc, 0xfd, 0xa4, 0x86, 0x67, 0x2e, 0xc2, 0xf5, 0x3b, 0xa9, 0x2b, +- 0xc1, 0x30, 0x03, 0x5b, 0x32, 0x15, 0xd8, 0x36, 0x5c, 0x8d, 0xbe, 0xe1, +- 0xe6, 0xd8, 0x73, 0xc4, 0xe3, 0x7f, 0x30, 0x6e, 0xc7, 0x54, 0x43, 0x87, +- 0xeb, 0x33, 0x8f, 0xf0, 0xfe, 0xa3, 0xc3, 0xcd, 0x9c, 0x43, 0xc7, 0x51, +- 0xe3, 0xad, 0x89, 0x43, 0xc4, 0xf7, 0xe3, 0xa1, 0x88, 0x36, 0xa5, 0x46, +- 0xb4, 0x24, 0x7c, 0xb0, 0xdb, 0x54, 0x58, 0x73, 0x22, 0x39, 0x7a, 0x31, +- 0x42, 0xfa, 0x7d, 0x1c, 0x5b, 0x44, 0xb3, 0x54, 0x83, 0xf6, 0xcb, 0x98, +- 0xa1, 0x76, 0x10, 0x5f, 0xaa, 0xf1, 0xfe, 0x70, 0xa4, 0xdf, 0x52, 0xef, +- 0x80, 0xd5, 0xe0, 0x38, 0x5f, 0x8d, 0x63, 0xc3, 0x5c, 0x13, 0xc9, 0x39, +- 0x8c, 0x05, 0x57, 0x98, 0x49, 0x30, 0x8e, 0xe1, 0xf4, 0x80, 0x1e, 0xfe, +- 0x7f, 0x94, 0x3b, 0xf1, 0xdf, 0xbb, 0x23, 0x9a, 0xa6, 0xb6, 0x5a, 0xfb, +- 0x54, 0x92, 0x8d, 0x46, 0x68, 0x61, 0xf3, 0x56, 0x6c, 0x74, 0x79, 0x82, +- 0x82, 0xa0, 0xde, 0x81, 0xbe, 0x0c, 0x2b, 0x85, 0x9a, 0x7b, 0x06, 0xd5, +- 0xe6, 0x69, 0x43, 0x8d, 0x1c, 0xed, 0x56, 0x89, 0xb7, 0x8b, 0x4f, 0x3b, +- 0x5a, 0xa3, 0xe3, 0xb4, 0x2f, 0x96, 0x36, 0x35, 0x34, 0x70, 0x9e, 0xeb, +- 0x39, 0xcf, 0xed, 0x85, 0x6a, 0xbc, 0x33, 0x0c, 0x6b, 0xae, 0x19, 0xe9, +- 0x7a, 0x40, 0xad, 0xc6, 0xdb, 0xa3, 0xd5, 0x38, 0x39, 0xec, 0xc5, 0x5b, +- 0xc3, 0x8e, 0x73, 0x8f, 0x51, 0x87, 0x8a, 0x38, 0xe6, 0x54, 0x20, 0x7a, +- 0x66, 0x04, 0x16, 0x7e, 0xc3, 0xb2, 0xbf, 0x1c, 0x0e, 0xe3, 0x57, 0xc3, +- 0x1f, 0xc3, 0x33, 0x0d, 0xc9, 0x63, 0xb3, 0x19, 0x23, 0xa7, 0x69, 0x3f, +- 0xa7, 0xed, 0x48, 0xcf, 0x3c, 0x4f, 0x64, 0x23, 0x79, 0xcb, 0xfa, 0x2f, +- 0x2a, 0x91, 0xd4, 0x2b, 0x4a, 0x44, 0x1b, 0x50, 0x42, 0x78, 0x97, 0x76, +- 0x7a, 0x2a, 0xdf, 0x9c, 0xf8, 0x01, 0xdb, 0xff, 0xb5, 0xf1, 0x0f, 0xce, +- 0x54, 0xa3, 0xe8, 0x50, 0xf4, 0x45, 0x9d, 0xd3, 0x77, 0xff, 0x91, 0x31, +- 0xea, 0x1f, 0x32, 0xd4, 0x39, 0xfb, 0xf3, 0xcc, 0x6f, 0xc5, 0x2f, 0x99, +- 0xaf, 0x04, 0xe7, 0xf1, 0x72, 0xfc, 0x4f, 0x77, 0x6c, 0xc7, 0x9c, 0xbf, +- 0x09, 0xc9, 0xf8, 0x3a, 0x1b, 0x8b, 0x18, 0x24, 0xe3, 0x3c, 0xea, 0xa4, +- 0x82, 0x32, 0x46, 0x19, 0xab, 0xab, 0x4b, 0x6d, 0x83, 0xf2, 0x90, 0x8a, +- 0x6a, 0xc7, 0x79, 0xcc, 0x28, 0x3d, 0x0f, 0x95, 0xc7, 0xfa, 0x31, 0xde, +- 0x97, 0xf1, 0xbe, 0xe3, 0x11, 0xdd, 0x6b, 0xea, 0xd5, 0xfc, 0x1e, 0xb1, +- 0x92, 0xb8, 0x33, 0xc0, 0xef, 0xb1, 0xe4, 0xf9, 0xef, 0xde, 0xba, 0x8b, +- 0x9f, 0xd3, 0x4e, 0xdd, 0xf6, 0xee, 0xe4, 0x77, 0x19, 0xcb, 0xab, 0xb4, +- 0x9b, 0x0f, 0xb3, 0x13, 0xb1, 0x91, 0x18, 0xed, 0xe9, 0x94, 0xc4, 0x15, +- 0x2b, 0x64, 0xfa, 0x2d, 0xd5, 0x84, 0x46, 0x9c, 0xf0, 0x2b, 0xe6, 0x06, +- 0x68, 0x79, 0x0b, 0x9f, 0xea, 0xf0, 0xe0, 0xaf, 0x3a, 0x14, 0xcc, 0xd6, +- 0x37, 0x20, 0x7b, 0xad, 0xe5, 0xd4, 0xeb, 0x7b, 0x55, 0xf1, 0x81, 0x8a, +- 0x34, 0x2c, 0xfa, 0x1d, 0x12, 0xe4, 0x4a, 0x75, 0x7f, 0xaa, 0xe0, 0x44, +- 0x3c, 0x4a, 0x9b, 0xdb, 0x82, 0x6d, 0x9c, 0xf3, 0x59, 0x69, 0xf8, 0x03, +- 0xa6, 0x09, 0x7b, 0x00, 0xfe, 0x2a, 0xfa, 0xfe, 0x95, 0x03, 0xcd, 0x1b, +- 0xc6, 0x94, 0x48, 0x22, 0xad, 0x44, 0xba, 0xa9, 0x6f, 0xe3, 0xb4, 0x8b, +- 0x1b, 0x11, 0xad, 0x42, 0x91, 0x76, 0x4c, 0xb4, 0xe4, 0xb7, 0x60, 0x60, +- 0x52, 0x3e, 0x27, 0xa0, 0xe7, 0x7f, 0x5c, 0xea, 0x3b, 0xfc, 0x3e, 0xf6, +- 0x61, 0xbf, 0xfd, 0xba, 0x93, 0x0b, 0x46, 0xb4, 0x9c, 0xfb, 0x7d, 0x3d, +- 0xbf, 0xc3, 0x5f, 0x61, 0x3e, 0x88, 0xe7, 0xed, 0x37, 0xe7, 0x94, 0xcb, +- 0x15, 0xfb, 0x7a, 0x69, 0x7f, 0xfe, 0xb7, 0x93, 0x0c, 0xb9, 0xfd, 0xf1, +- 0xd7, 0xb0, 0x8d, 0xcf, 0x0c, 0xb0, 0x8d, 0x4c, 0xb9, 0x3f, 0x40, 0x20, +- 0x2d, 0x71, 0x38, 0xa2, 0x2d, 0x50, 0x9a, 0x8d, 0x01, 0x25, 0x12, 0xbb, +- 0x57, 0x69, 0x4d, 0x8c, 0x91, 0x5f, 0x6e, 0x47, 0xb1, 0x4f, 0xd1, 0x7c, +- 0xb1, 0x3f, 0x0b, 0xf2, 0x50, 0x3c, 0x03, 0x08, 0xcc, 0xd7, 0x17, 0x62, +- 0xb3, 0x3b, 0xa7, 0x50, 0xc2, 0x03, 0x1a, 0x6a, 0xc9, 0x5f, 0xc2, 0x13, +- 0xc0, 0xe4, 0x10, 0xb9, 0x5c, 0xbc, 0x19, 0x9f, 0x63, 0x2c, 0x98, 0xc7, +- 0x32, 0x5f, 0x0c, 0x9e, 0xc7, 0x2f, 0xa5, 0xdf, 0x26, 0xc0, 0xcc, 0x29, +- 0xf2, 0xb2, 0xd4, 0x7f, 0x41, 0x52, 0xee, 0x3d, 0x6e, 0x43, 0xc9, 0xd8, +- 0x91, 0x3d, 0x80, 0x3e, 0x15, 0xf7, 0x24, 0xef, 0x0f, 0x63, 0x33, 0x4e, +- 0xc7, 0xa3, 0xa9, 0x82, 0x12, 0x35, 0x86, 0x14, 0xc3, 0xbf, 0x8d, 0xed, +- 0xed, 0x60, 0x99, 0xed, 0xbc, 0x1e, 0x88, 0xea, 0x5d, 0x77, 0x28, 0xc9, +- 0x2b, 0xab, 0x58, 0xe6, 0xa4, 0x11, 0x25, 0xcf, 0x8c, 0x4e, 0xaf, 0x82, +- 0xe1, 0x7f, 0x22, 0x2f, 0xb2, 0x12, 0xca, 0x96, 0xc2, 0xe3, 0x6a, 0x11, +- 0x8f, 0x7e, 0x5d, 0xd2, 0xd9, 0x49, 0xf9, 0xee, 0xb6, 0xed, 0x1d, 0x68, +- 0xaa, 0xf9, 0xed, 0x7b, 0xda, 0x9c, 0x8b, 0xef, 0xb5, 0x06, 0x47, 0xe9, +- 0x7f, 0x1e, 0xbd, 0x8a, 0x73, 0x27, 0xfc, 0x28, 0x19, 0xf3, 0x41, 0xee, +- 0x79, 0x90, 0xf3, 0x26, 0xc3, 0x1e, 0x7c, 0xe0, 0x24, 0x57, 0xcb, 0xbd, +- 0x6a, 0xa4, 0xba, 0x5b, 0xc3, 0x5e, 0xb4, 0x26, 0xb6, 0x12, 0x0b, 0x8e, +- 0xaf, 0x5e, 0xc6, 0x67, 0x51, 0xe3, 0x39, 0x34, 0x6b, 0x5b, 0x21, 0x9f, +- 0xcf, 0xd2, 0x66, 0x97, 0x49, 0x5d, 0x96, 0x29, 0x72, 0x1f, 0xc1, 0x9a, +- 0x2d, 0x86, 0x83, 0xe7, 0x0d, 0x58, 0x95, 0xe6, 0x41, 0xe5, 0x84, 0xfd, +- 0x1b, 0x27, 0xe9, 0xc5, 0x4a, 0xfa, 0xa5, 0x41, 0xda, 0xab, 0xf9, 0xcd, +- 0xa8, 0x76, 0x94, 0x99, 0x82, 0xc7, 0xb4, 0x94, 0xe3, 0xf9, 0x2d, 0xca, +- 0xeb, 0xf9, 0x7e, 0xe5, 0x54, 0x5e, 0xea, 0x1e, 0x54, 0x4e, 0xe6, 0x25, +- 0x1e, 0x36, 0x69, 0x47, 0xc8, 0x6f, 0xc8, 0xa9, 0xd4, 0x3e, 0x03, 0xca, +- 0x36, 0xa3, 0x96, 0x3c, 0x5f, 0x8f, 0x8d, 0xb0, 0xbf, 0xfb, 0x3b, 0x60, +- 0x6c, 0x37, 0x7c, 0x38, 0x1e, 0x44, 0xa0, 0xcf, 0xf0, 0xca, 0x77, 0xe6, +- 0x03, 0x52, 0xb7, 0x49, 0xdb, 0x9a, 0x3f, 0x47, 0xff, 0x2a, 0x7e, 0xdf, +- 0xdf, 0x51, 0xbe, 0xf7, 0x0b, 0x67, 0x6a, 0xb5, 0xca, 0xef, 0x7f, 0xea, +- 0xe1, 0x50, 0x58, 0x77, 0x26, 0x3f, 0x17, 0x2e, 0xa5, 0x92, 0x3f, 0xd6, +- 0xc3, 0x0a, 0x46, 0xac, 0x1c, 0x73, 0x85, 0xbe, 0x4c, 0x3b, 0xfd, 0x2d, +- 0xcc, 0x58, 0x99, 0x24, 0xbe, 0x93, 0xf7, 0xb2, 0xcd, 0x0a, 0x3d, 0x80, +- 0x9b, 0xec, 0x66, 0x4f, 0x51, 0x7f, 0x2a, 0x31, 0xcc, 0xc3, 0x98, 0x2e, +- 0x1c, 0xef, 0x52, 0xce, 0xdd, 0xa4, 0xbd, 0xc5, 0x7e, 0x57, 0xe9, 0x7a, +- 0xac, 0x4a, 0x69, 0xd2, 0x5e, 0xcf, 0x27, 0xe9, 0xe3, 0x3d, 0x6c, 0x37, +- 0x80, 0xd7, 0xed, 0x5a, 0xe6, 0x20, 0x91, 0xa4, 0x45, 0x81, 0x37, 0x77, +- 0x84, 0x41, 0xce, 0x37, 0xe3, 0xaf, 0x1b, 0x8c, 0xff, 0x12, 0xa3, 0xd5, +- 0x5b, 0x96, 0x24, 0xb0, 0x3e, 0x0f, 0xef, 0xba, 0x0e, 0x13, 0xf7, 0x30, +- 0xb6, 0xdf, 0xc7, 0x78, 0xf9, 0x20, 0x63, 0xe1, 0x8e, 0x38, 0xc7, 0x56, +- 0xef, 0x38, 0x95, 0xfa, 0x66, 0xc9, 0x67, 0x30, 0xc0, 0x58, 0x7c, 0x37, +- 0xe3, 0xcb, 0x16, 0x7e, 0x7e, 0x29, 0xff, 0x1f, 0xce, 0x7d, 0xcc, 0xa7, +- 0x9e, 0xbf, 0x48, 0x26, 0xd4, 0x51, 0xbd, 0x35, 0xb6, 0x95, 0xb1, 0x98, +- 0x72, 0xad, 0x5a, 0xd3, 0x71, 0xae, 0x8c, 0x46, 0x92, 0x3e, 0xc5, 0xc0, +- 0x73, 0x13, 0xc7, 0x1d, 0x6d, 0x8e, 0xe4, 0x52, 0xe5, 0x38, 0x28, 0x63, +- 0x95, 0x1c, 0x41, 0xf0, 0x41, 0xf2, 0x84, 0x99, 0x18, 0xa1, 0xe2, 0xe6, +- 0x61, 0xc9, 0x13, 0xc2, 0x58, 0x65, 0x7f, 0x09, 0xcf, 0xb5, 0x79, 0xd1, +- 0xc5, 0x1c, 0xeb, 0x16, 0x3b, 0x80, 0x3b, 0x88, 0xa5, 0x2b, 0x6c, 0xe6, +- 0x4e, 0xc1, 0x10, 0x6e, 0xb5, 0xbd, 0x38, 0xdc, 0xc6, 0x1c, 0x28, 0x54, +- 0x89, 0x77, 0x0d, 0x0f, 0x8e, 0x18, 0x41, 0xe4, 0x5c, 0x7f, 0xd8, 0x41, +- 0x0c, 0xa4, 0x1e, 0x55, 0xc9, 0x1d, 0x44, 0x87, 0x1e, 0xea, 0x53, 0x45, +- 0xea, 0xbc, 0x0e, 0x3f, 0x2c, 0x17, 0x90, 0x7e, 0x49, 0x3e, 0xf0, 0x33, +- 0x27, 0x35, 0x47, 0xea, 0xc3, 0x0a, 0x98, 0x32, 0x0e, 0xe1, 0xb7, 0x06, +- 0xfa, 0x26, 0x3a, 0xc8, 0xed, 0x66, 0x0e, 0xf5, 0x0c, 0xb9, 0x75, 0x1d, +- 0x5e, 0xd3, 0x85, 0x5b, 0xbf, 0x8a, 0x20, 0x7d, 0xb7, 0x7f, 0x22, 0xba, +- 0xe1, 0x8c, 0xe2, 0xc1, 0x4b, 0x7a, 0x2d, 0x79, 0x9f, 0x89, 0xed, 0x13, +- 0xf0, 0x6e, 0x5d, 0x62, 0x20, 0x3d, 0xd1, 0x9b, 0x98, 0xc5, 0xb4, 0xd7, +- 0xbb, 0xa4, 0xc8, 0x89, 0x3e, 0x43, 0xdd, 0xae, 0x8d, 0xbb, 0x9c, 0xa8, +- 0xc8, 0x07, 0x82, 0x8e, 0x73, 0x52, 0x17, 0x3d, 0x03, 0x07, 0x4a, 0x3a, +- 0xde, 0xcf, 0xcf, 0xfd, 0x25, 0x1d, 0x6f, 0xa1, 0x3c, 0xfa, 0x1f, 0xb6, +- 0x5d, 0xc4, 0x63, 0x34, 0x54, 0x9a, 0xc2, 0x6f, 0x88, 0xc3, 0xc4, 0x93, +- 0x24, 0x75, 0xfc, 0x42, 0x7e, 0xbd, 0xe0, 0x36, 0xa7, 0xbb, 0xdd, 0xc5, +- 0xef, 0xa4, 0x7a, 0x80, 0x76, 0x20, 0x7a, 0x78, 0xad, 0x94, 0xdb, 0x38, +- 0xce, 0x90, 0x21, 0x3a, 0x2e, 0xe7, 0x65, 0xa2, 0xeb, 0x36, 0xc9, 0xb1, +- 0xfa, 0x81, 0xdf, 0xb0, 0xac, 0x87, 0xb8, 0x6b, 0xe2, 0x6b, 0xdd, 0x62, +- 0x3b, 0xb3, 0xdc, 0x58, 0x79, 0xd5, 0x42, 0xc7, 0xf9, 0x4a, 0x5c, 0xc3, +- 0x7b, 0x7a, 0x6b, 0xa2, 0x5d, 0x8d, 0xb0, 0xaf, 0x49, 0xd8, 0x93, 0x1d, +- 0x9c, 0xbb, 0x2b, 0x90, 0x0c, 0x89, 0xad, 0x61, 0x43, 0x45, 0x11, 0xc3, +- 0x71, 0xca, 0xd6, 0x63, 0xdb, 0x38, 0x67, 0xfb, 0x42, 0x5d, 0xe4, 0x71, +- 0x6a, 0x27, 0xd3, 0x7f, 0xf2, 0x27, 0xdd, 0x7a, 0x04, 0xef, 0x38, 0xb9, +- 0x90, 0xc3, 0x38, 0x29, 0xb9, 0xd1, 0x7c, 0x1c, 0x0e, 0x7a, 0xf0, 0x62, +- 0xac, 0x11, 0xc9, 0x7a, 0x05, 0x35, 0xfa, 0x9b, 0xce, 0x77, 0x42, 0xd2, +- 0x0e, 0x73, 0x3c, 0xf5, 0x56, 0x8f, 0xe4, 0x80, 0x5e, 0x5d, 0xe4, 0x76, +- 0x31, 0xc7, 0xbd, 0xb4, 0xfd, 0x7f, 0x75, 0x8e, 0x87, 0xa4, 0xfd, 0x48, +- 0x50, 0x53, 0x7f, 0xd7, 0x1c, 0x7e, 0xdf, 0xf9, 0x81, 0x2b, 0x33, 0xe3, +- 0xea, 0x01, 0xaa, 0xc8, 0x23, 0x54, 0x54, 0x8b, 0xcc, 0x72, 0x3b, 0xe2, +- 0x67, 0x73, 0x79, 0x4f, 0x9e, 0x89, 0x8d, 0x6c, 0x61, 0xbb, 0xcf, 0x39, +- 0x68, 0x94, 0xef, 0xd3, 0x1e, 0x29, 0x6b, 0x4d, 0x1e, 0x5a, 0xe1, 0xc5, +- 0x52, 0xb4, 0xc4, 0x97, 0x2d, 0x97, 0xb1, 0xa8, 0x66, 0x52, 0xf3, 0xc3, +- 0x6a, 0xf4, 0x10, 0x8b, 0xdf, 0x68, 0x6b, 0xc3, 0x72, 0xe6, 0x8c, 0xef, +- 0x10, 0x5c, 0x7a, 0x75, 0x0f, 0xa6, 0x38, 0xbe, 0x27, 0x0d, 0x59, 0x2f, +- 0x70, 0x70, 0x4b, 0xdc, 0x4a, 0xd1, 0x63, 0xad, 0x59, 0xb4, 0x9d, 0x6a, +- 0x5d, 0xe2, 0x7c, 0x2d, 0x6a, 0x4c, 0x6f, 0xec, 0x1d, 0x44, 0x8c, 0x1d, +- 0xe4, 0x39, 0x5a, 0x7d, 0x4b, 0xc2, 0x47, 0xed, 0xbe, 0x6c, 0x47, 0x13, +- 0x47, 0x94, 0xa2, 0x3f, 0xbc, 0xc0, 0xb9, 0x7d, 0xcd, 0xd6, 0x37, 0x56, +- 0x7a, 0x8a, 0xdf, 0x5f, 0x71, 0xf3, 0xd1, 0xb2, 0x3f, 0x84, 0x4b, 0xb8, +- 0xe1, 0xf7, 0x9f, 0xb2, 0x71, 0x86, 0x54, 0x88, 0x79, 0x29, 0xce, 0xf4, +- 0x19, 0x53, 0x8a, 0x4f, 0xaf, 0x25, 0xae, 0x0a, 0x96, 0x56, 0x90, 0x13, +- 0x4a, 0xec, 0xf7, 0xfb, 0xdf, 0x61, 0x19, 0x72, 0xba, 0xe3, 0xb1, 0xeb, +- 0x5b, 0x13, 0x7e, 0x24, 0xad, 0x4a, 0xfa, 0xe5, 0x2c, 0x33, 0xe4, 0xbf, +- 0xaa, 0x60, 0x35, 0x06, 0x68, 0xd7, 0x35, 0xcc, 0x57, 0x5b, 0xd2, 0x13, +- 0x8c, 0xe1, 0x6d, 0x78, 0x70, 0x82, 0x23, 0x6b, 0x18, 0x6c, 0x54, 0x4d, +- 0x59, 0x83, 0x08, 0xc2, 0xd7, 0xf0, 0xe0, 0x0d, 0xaa, 0x79, 0x1c, 0x3d, +- 0x1d, 0xfe, 0xce, 0x44, 0x01, 0xfe, 0x7a, 0x73, 0x13, 0xe2, 0x69, 0xc9, +- 0x3b, 0x05, 0x23, 0x93, 0x5b, 0x89, 0x5a, 0x8d, 0x75, 0xd7, 0x96, 0xf5, +- 0x0d, 0xb5, 0xd6, 0x94, 0xfc, 0x53, 0xeb, 0x7c, 0xc5, 0xc5, 0xd2, 0x20, +- 0xf3, 0x85, 0x1f, 0x87, 0xff, 0xcf, 0xea, 0x27, 0x38, 0x27, 0xd2, 0x17, +- 0xf9, 0x2f, 0x79, 0x3f, 0xbc, 0x2a, 0xb1, 0xb0, 0x77, 0xdc, 0xcb, 0xfc, +- 0x4a, 0xe6, 0x4c, 0xe2, 0xf1, 0x6b, 0xff, 0xf5, 0x79, 0xfa, 0x8b, 0x8f, +- 0xba, 0x7f, 0x44, 0xb7, 0x08, 0xf3, 0x8e, 0xa3, 0xc7, 0x23, 0xe1, 0x0a, +- 0x45, 0xc3, 0xf6, 0xb6, 0x7f, 0xa7, 0x8d, 0x80, 0x38, 0x06, 0x12, 0xeb, +- 0x5a, 0x6c, 0x19, 0xaf, 0x98, 0x51, 0xaf, 0x67, 0x4d, 0xb9, 0xde, 0x80, +- 0x6e, 0xa5, 0xa4, 0xde, 0x68, 0x3c, 0xd2, 0xb3, 0x8d, 0xf5, 0x1e, 0x65, +- 0xbd, 0x24, 0x63, 0xe7, 0x3d, 0x13, 0x41, 0x37, 0x9f, 0xb3, 0xc6, 0xab, +- 0x67, 0xb6, 0x77, 0xbe, 0xde, 0xe3, 0xba, 0x35, 0xe5, 0xb6, 0xb7, 0x38, +- 0xb2, 0xb1, 0xc2, 0xe3, 0x45, 0x9a, 0xf5, 0xa6, 0x58, 0xef, 0xf5, 0x09, +- 0x59, 0x8f, 0xc0, 0x0d, 0xe3, 0x76, 0xe6, 0xb8, 0x47, 0xd7, 0x83, 0x27, +- 0x91, 0x24, 0xe6, 0xba, 0x73, 0x79, 0xc3, 0x58, 0x7e, 0x33, 0xb6, 0xeb, +- 0x87, 0xe2, 0x95, 0xac, 0x77, 0x44, 0x3f, 0x14, 0xf6, 0xd1, 0xaf, 0xd6, +- 0x51, 0x5e, 0x2f, 0xf3, 0x1a, 0x95, 0xfe, 0xb2, 0x65, 0x5c, 0x62, 0xbf, +- 0x41, 0x5e, 0x12, 0xa2, 0xcd, 0xc9, 0x98, 0xa5, 0x5d, 0x99, 0x53, 0x19, +- 0x5f, 0x24, 0x36, 0xee, 0x8e, 0x4f, 0x99, 0x7b, 0x40, 0x72, 0xdd, 0x7a, +- 0x0b, 0x7d, 0x6d, 0x12, 0xff, 0x14, 0x62, 0x6f, 0x03, 0xf3, 0x4f, 0x69, +- 0x23, 0x84, 0x6d, 0xf4, 0xed, 0xfd, 0x86, 0xe3, 0x3c, 0x6f, 0xcc, 0xc7, +- 0x01, 0x23, 0x92, 0x12, 0x3b, 0x7c, 0xd3, 0x58, 0x76, 0xa5, 0xe4, 0x96, +- 0xc0, 0x9f, 0x60, 0x8a, 0xb6, 0x51, 0xa5, 0x8b, 0xbf, 0x29, 0x08, 0x47, +- 0xbd, 0x5a, 0x8d, 0xe2, 0xc0, 0xbf, 0x78, 0xe1, 0xc6, 0x85, 0x1c, 0x7b, +- 0xed, 0xf5, 0x0a, 0xde, 0xbf, 0x4a, 0xc1, 0xa1, 0xab, 0xa2, 0xe1, 0x11, +- 0x65, 0x16, 0xb1, 0x35, 0xda, 0xdd, 0xa9, 0x58, 0x47, 0x59, 0x37, 0xd9, +- 0xe6, 0x89, 0x84, 0xa1, 0xd4, 0xd1, 0xef, 0x5b, 0x34, 0x09, 0xfd, 0xde, +- 0x81, 0x68, 0xf8, 0x51, 0xfe, 0xf7, 0x4c, 0x28, 0x98, 0xd0, 0x23, 0x49, +- 0xb8, 0xf2, 0xd9, 0x36, 0xd3, 0xce, 0xab, 0xa3, 0x8e, 0x73, 0x2c, 0xde, +- 0x1a, 0x3c, 0x86, 0x37, 0x89, 0x6d, 0xd2, 0x4e, 0x19, 0xeb, 0xc1, 0x5c, +- 0x56, 0x4f, 0x76, 0x2a, 0x8e, 0x57, 0xf8, 0xc3, 0xfa, 0xbc, 0xc4, 0xc3, +- 0x72, 0x7f, 0xcb, 0x71, 0xd1, 0x71, 0xde, 0x34, 0x8a, 0xb2, 0x82, 0x1d, +- 0x91, 0x14, 0x30, 0x1f, 0x93, 0x7a, 0xa4, 0x6b, 0x8a, 0x3a, 0x08, 0xd3, +- 0xdf, 0xe6, 0xe9, 0x8d, 0x38, 0xee, 0x8b, 0x04, 0x8f, 0x2b, 0xcb, 0xcf, +- 0xaa, 0x58, 0xb4, 0xfe, 0x09, 0xa5, 0x75, 0x43, 0x15, 0xf4, 0x64, 0x41, +- 0x99, 0x2b, 0x3a, 0x09, 0x07, 0xc8, 0xa5, 0xd6, 0xc1, 0x8d, 0xd1, 0xb8, +- 0xcd, 0xf6, 0x26, 0xa7, 0xd1, 0x4c, 0xdb, 0xd7, 0x7b, 0xee, 0x23, 0x0f, +- 0x04, 0x3e, 0xce, 0x24, 0x41, 0xfa, 0xda, 0x88, 0xd4, 0xa7, 0x1c, 0xe7, +- 0x7e, 0xf6, 0x75, 0x07, 0xfb, 0xfa, 0x60, 0xfc, 0x3d, 0xe7, 0x5f, 0x5d, +- 0x99, 0x37, 0x62, 0x44, 0xbf, 0x54, 0xee, 0xbb, 0xcc, 0xf5, 0x45, 0xae, +- 0x0f, 0x37, 0xcf, 0x61, 0xbe, 0xd2, 0x21, 0xb8, 0x71, 0xd2, 0x4b, 0xdc, +- 0xa0, 0x3c, 0xc6, 0x10, 0xf5, 0xd2, 0x38, 0xec, 0x01, 0xe3, 0x5b, 0x38, +- 0xa5, 0xa8, 0x24, 0x42, 0x41, 0xf8, 0x75, 0x07, 0x0f, 0x90, 0x33, 0x24, +- 0xe7, 0xd4, 0xe1, 0x73, 0x86, 0x1f, 0xb3, 0xa2, 0xea, 0x65, 0x1e, 0xce, +- 0xc9, 0x81, 0xb8, 0x7c, 0xf7, 0x61, 0x6a, 0x8e, 0x07, 0x9b, 0xc9, 0x25, +- 0x82, 0x51, 0x75, 0x9e, 0xdc, 0xf7, 0xb7, 0xcb, 0x77, 0xf6, 0x7f, 0xae, +- 0x82, 0xfb, 0x69, 0x15, 0x6a, 0xb4, 0x37, 0x2c, 0xf7, 0xbb, 0x0c, 0xf9, +- 0xae, 0xa0, 0x39, 0xee, 0xe5, 0xbc, 0x38, 0xf0, 0x48, 0x7a, 0x1f, 0xe5, +- 0xfd, 0xb8, 0x7c, 0x4e, 0xde, 0xcf, 0x71, 0x27, 0xf7, 0x29, 0x82, 0x33, +- 0x3f, 0x72, 0x5e, 0x64, 0x1c, 0x09, 0xf2, 0xf9, 0xe7, 0xd8, 0xf6, 0xd1, +- 0xf8, 0xf3, 0xce, 0x3c, 0xe2, 0xeb, 0xb1, 0x84, 0x86, 0xf9, 0x57, 0x35, +- 0xe1, 0xf8, 0x9d, 0x32, 0x66, 0x05, 0xb3, 0xf4, 0x2f, 0xf8, 0x24, 0xcf, +- 0xac, 0xd5, 0xe7, 0xe2, 0xe6, 0x3b, 0x8a, 0xf7, 0xaa, 0xa2, 0xb2, 0x4e, +- 0xa8, 0xa1, 0xea, 0xaa, 0x06, 0x68, 0xa5, 0x7b, 0xcb, 0xa3, 0xde, 0xee, +- 0x59, 0x8a, 0x1e, 0xbc, 0x4d, 0x91, 0xe7, 0xbf, 0x24, 0xb7, 0x75, 0x9c, +- 0x07, 0x38, 0x5f, 0x2d, 0xf1, 0x00, 0x4e, 0xb3, 0x9d, 0x5e, 0xea, 0x6f, +- 0xe5, 0xf9, 0xf9, 0x2a, 0xd7, 0xff, 0xb9, 0xa3, 0x7d, 0x4a, 0xea, 0x8a, +- 0x8c, 0x85, 0x5d, 0x37, 0x2b, 0x1c, 0x50, 0xb5, 0xe8, 0xd9, 0xd5, 0x19, +- 0xcb, 0xf6, 0xba, 0xdf, 0x83, 0x1d, 0xaf, 0x9d, 0x5f, 0xf3, 0x3a, 0xe3, +- 0xc6, 0xa3, 0x65, 0xd7, 0x07, 0x71, 0xdc, 0xa9, 0x6f, 0xb7, 0x82, 0x95, +- 0x90, 0xb8, 0xd4, 0x1c, 0xfb, 0x0a, 0xe5, 0xfe, 0xc0, 0x28, 0xc6, 0xac, +- 0xfd, 0x46, 0x24, 0x6b, 0xd1, 0x1f, 0x52, 0xcc, 0x13, 0x3b, 0x25, 0x76, +- 0x4f, 0xd6, 0xfa, 0x50, 0x3b, 0x1f, 0x95, 0xed, 0x91, 0xfe, 0x05, 0xcc, +- 0x9b, 0x3c, 0x1d, 0x12, 0xeb, 0x64, 0x7e, 0xdc, 0x32, 0x6c, 0xab, 0x0a, +- 0xcb, 0xd9, 0xc7, 0x78, 0xfb, 0xef, 0x8b, 0x13, 0x22, 0x47, 0xac, 0x33, +- 0xd2, 0x9f, 0xc4, 0xef, 0x2b, 0x0b, 0x46, 0x65, 0x59, 0x4f, 0xf2, 0xdf, +- 0x90, 0xca, 0xab, 0xe4, 0x19, 0x15, 0xc1, 0xde, 0x8e, 0x46, 0x5e, 0xf2, +- 0xdc, 0x7b, 0xc3, 0xda, 0xfc, 0xf9, 0x75, 0x3c, 0x64, 0x8d, 0x0a, 0xa8, +- 0x57, 0x0b, 0x66, 0x13, 0x7d, 0x83, 0x32, 0x3e, 0x8b, 0x56, 0x2e, 0x39, +- 0x7a, 0xe7, 0x5d, 0x77, 0xd3, 0x9f, 0x9f, 0x63, 0x8b, 0xa3, 0xe4, 0x33, +- 0x96, 0xeb, 0x19, 0xe2, 0xeb, 0x33, 0xd7, 0xf5, 0x24, 0x86, 0x94, 0xd7, +- 0x06, 0x1b, 0x30, 0xb8, 0xfb, 0x0e, 0x68, 0x8d, 0x45, 0x1c, 0x52, 0xcd, +- 0xc5, 0x58, 0x96, 0x7d, 0xdb, 0x57, 0xe4, 0xe0, 0xb5, 0x18, 0xd8, 0x1d, +- 0x47, 0x6e, 0x8e, 0x3c, 0x93, 0x7b, 0x7e, 0x08, 0x4e, 0x6e, 0xdf, 0x7d, +- 0x99, 0xe4, 0xd4, 0x61, 0x91, 0x9b, 0xa2, 0xef, 0xa8, 0xfa, 0xdb, 0x8e, +- 0x15, 0x14, 0xf9, 0x87, 0xae, 0xf4, 0x52, 0x87, 0x37, 0xa1, 0xb5, 0x67, +- 0x0c, 0xa7, 0xc8, 0xeb, 0xdc, 0x35, 0x54, 0xad, 0xd2, 0x9c, 0xba, 0xdf, +- 0x87, 0x68, 0x6a, 0x9c, 0x38, 0x10, 0x98, 0xf0, 0x93, 0x9f, 0xcc, 0x77, +- 0xd7, 0x8e, 0x96, 0x91, 0x7f, 0xa4, 0xc8, 0x6d, 0x3f, 0xee, 0xf5, 0xe2, +- 0x6e, 0x62, 0xc6, 0x7e, 0xbd, 0x75, 0xc3, 0x18, 0x7e, 0x45, 0xac, 0x93, +- 0xf2, 0x3f, 0x60, 0x7b, 0x22, 0xd3, 0xcb, 0xf6, 0xe0, 0xf7, 0x12, 0x8f, +- 0xc9, 0x09, 0xbd, 0x3e, 0x3d, 0xed, 0x93, 0xf8, 0x2d, 0xdc, 0x75, 0xc7, +- 0x6e, 0x05, 0x9d, 0x94, 0xf3, 0x28, 0x6d, 0xe6, 0xfe, 0x28, 0xbc, 0x5d, +- 0x57, 0x91, 0xa3, 0x90, 0xf3, 0x61, 0x4e, 0x00, 0x8f, 0x8c, 0x23, 0x91, +- 0xd7, 0xa7, 0xe6, 0x05, 0xf0, 0x26, 0xe5, 0x08, 0xae, 0x57, 0x94, 0xe4, +- 0xf4, 0xac, 0xb9, 0x58, 0x4e, 0x2d, 0x1e, 0x2f, 0xc9, 0xd9, 0x43, 0x39, +- 0xd7, 0xb4, 0xc0, 0x5b, 0x7b, 0x8d, 0xcc, 0x55, 0x1b, 0xfd, 0xa7, 0x16, +- 0x19, 0x17, 0xdb, 0xc9, 0xe9, 0x3e, 0x06, 0x45, 0x5f, 0x28, 0xfc, 0xff, +- 0x1b, 0x6e, 0xbd, 0x9b, 0xda, 0xa6, 0xa6, 0xeb, 0x09, 0x9e, 0x67, 0x5a, +- 0xa6, 0xe8, 0xa8, 0x65, 0xdd, 0x34, 0x62, 0xeb, 0xee, 0xea, 0x72, 0x7f, +- 0xd9, 0x4e, 0xb9, 0x8d, 0x06, 0xde, 0x0b, 0xe1, 0x11, 0xe6, 0x71, 0x37, +- 0xb1, 0x9d, 0x03, 0x86, 0x70, 0xb1, 0x56, 0xa3, 0x4a, 0x91, 0xbc, 0x36, +- 0xcc, 0xb8, 0xde, 0x80, 0x3e, 0x37, 0x16, 0x84, 0x59, 0x7f, 0x77, 0x5d, +- 0x91, 0x4f, 0xc0, 0x77, 0x2b, 0xcb, 0x76, 0xc6, 0x8b, 0xed, 0xf9, 0x74, +- 0xc9, 0x15, 0xdb, 0xb1, 0x7f, 0xf8, 0xfc, 0xf3, 0xc8, 0x4d, 0xfa, 0xcc, +- 0xf9, 0x9a, 0x8a, 0x10, 0x4b, 0x2b, 0x50, 0x5d, 0x21, 0x58, 0x7f, 0xd1, +- 0xd8, 0xb7, 0x8c, 0xff, 0x29, 0xef, 0x57, 0x63, 0xeb, 0xb8, 0x83, 0x2d, +- 0x6e, 0x9e, 0x50, 0x81, 0xde, 0x36, 0xc1, 0x43, 0xb1, 0xa5, 0x39, 0x92, +- 0x27, 0x25, 0x72, 0x90, 0x18, 0x27, 0xf6, 0xb3, 0xc6, 0xb5, 0x1f, 0x8f, +- 0x32, 0xd3, 0x7e, 0x36, 0xe3, 0xbb, 0xfa, 0xa1, 0x3b, 0x2a, 0x71, 0xe8, +- 0x2e, 0x59, 0xff, 0xde, 0x10, 0xc7, 0xe1, 0x5b, 0xe8, 0x9b, 0xaf, 0x13, +- 0x5b, 0xb6, 0xb4, 0x30, 0x86, 0xb8, 0x98, 0xa5, 0xa0, 0x92, 0xb1, 0x7d, +- 0xdb, 0x6e, 0xe6, 0xc0, 0x6a, 0x90, 0x6d, 0x5e, 0x8a, 0x5d, 0xd2, 0x7f, +- 0x83, 0xb9, 0xee, 0xa1, 0x2f, 0x56, 0x22, 0x20, 0x39, 0xc7, 0x4f, 0x4e, +- 0x51, 0xc6, 0x4d, 0x46, 0x59, 0x57, 0xa2, 0xa7, 0xb2, 0x9c, 0x06, 0xa4, +- 0x77, 0x97, 0xeb, 0x2b, 0x78, 0x29, 0x1a, 0x2e, 0xad, 0x3f, 0x37, 0x60, +- 0x60, 0xfc, 0xd0, 0x31, 0x72, 0x0d, 0x27, 0xd1, 0x72, 0x68, 0x63, 0x98, +- 0x7d, 0x39, 0x13, 0x2f, 0xcf, 0xa9, 0xf8, 0xe6, 0x4c, 0x19, 0x62, 0xbb, +- 0x50, 0x6a, 0x17, 0x62, 0x4b, 0x2d, 0x6d, 0x34, 0x1f, 0x45, 0xaa, 0xc6, +- 0xac, 0x85, 0x3d, 0x4e, 0xdf, 0x9a, 0xa8, 0x80, 0xf7, 0x5a, 0x89, 0x7d, +- 0xc2, 0x77, 0xbc, 0x37, 0x9c, 0xb0, 0x2b, 0xf0, 0x69, 0xe3, 0x9c, 0x23, +- 0xb8, 0x78, 0x4c, 0xc7, 0xe5, 0x15, 0xc4, 0xc4, 0x85, 0xf1, 0x68, 0x72, +- 0x1d, 0xf3, 0xc2, 0x23, 0x6d, 0xde, 0x1b, 0xde, 0xca, 0xff, 0x9a, 0xdc, +- 0xf2, 0xd2, 0xf1, 0x88, 0x3e, 0x70, 0x74, 0x45, 0x54, 0xda, 0x94, 0xf6, +- 0xca, 0x36, 0x2a, 0xed, 0x3b, 0x4e, 0x34, 0x1e, 0x70, 0xe7, 0xbc, 0x3c, +- 0x86, 0x37, 0xf4, 0xf2, 0x18, 0x02, 0x8c, 0xa7, 0x49, 0x72, 0x57, 0xe1, +- 0xd5, 0x7e, 0xe6, 0x91, 0x5e, 0xf2, 0xf1, 0x6e, 0x08, 0xdf, 0x3b, 0x4a, +- 0x7e, 0xf2, 0xa4, 0x0d, 0xbc, 0x93, 0x75, 0xb0, 0x2c, 0x3e, 0x8b, 0xf8, +- 0xd2, 0x4f, 0xd9, 0xb2, 0xa6, 0x76, 0x50, 0x19, 0x67, 0xae, 0x79, 0xdc, +- 0x5b, 0x95, 0x54, 0x99, 0x5b, 0x1e, 0xc8, 0x47, 0xc3, 0x87, 0x98, 0x67, +- 0xfa, 0x99, 0xeb, 0x72, 0x06, 0x94, 0x27, 0x99, 0x67, 0xee, 0x2b, 0xe5, +- 0x99, 0x07, 0xf2, 0x01, 0xe4, 0xb3, 0xc4, 0xc6, 0x38, 0xf3, 0x5b, 0x37, +- 0x4f, 0x0f, 0x60, 0x32, 0xab, 0x32, 0x1f, 0x7f, 0xdf, 0x99, 0xaa, 0x77, +- 0xf7, 0x0b, 0xf0, 0x75, 0xbb, 0x01, 0x07, 0x87, 0x9b, 0x70, 0x36, 0x3f, +- 0x45, 0xbb, 0xb8, 0x0c, 0xd3, 0xa3, 0xb5, 0x98, 0x18, 0x7e, 0x95, 0x9f, +- 0xdb, 0xf0, 0xfe, 0xa8, 0x9b, 0xe3, 0x12, 0x0f, 0xa5, 0x7f, 0x07, 0x95, +- 0x43, 0x6e, 0x8e, 0x6b, 0x25, 0x99, 0xdb, 0x26, 0xfa, 0x4b, 0xb9, 0xed, +- 0x14, 0x73, 0xdb, 0x23, 0x6c, 0xf3, 0x85, 0x52, 0x9b, 0xcf, 0xb9, 0xff, +- 0xa5, 0x2f, 0x52, 0x77, 0x66, 0xbd, 0x44, 0x52, 0xd6, 0xa6, 0xc7, 0xed, +- 0x68, 0xac, 0x5c, 0xf7, 0x05, 0xd6, 0x3b, 0x72, 0xbe, 0xde, 0x6a, 0x0c, +- 0x64, 0xd6, 0x90, 0xe7, 0xcb, 0xda, 0xca, 0x7b, 0x6b, 0x6c, 0xea, 0xf2, +- 0xcb, 0xd1, 0xa9, 0xee, 0x59, 0xa8, 0xc3, 0xfa, 0xb8, 0x70, 0xa2, 0xb7, +- 0xc8, 0x89, 0x22, 0x89, 0x95, 0x8c, 0x0f, 0x9e, 0x68, 0x84, 0x58, 0x0f, +- 0x44, 0x27, 0x98, 0x03, 0xe4, 0xeb, 0x70, 0x37, 0x73, 0x31, 0xb5, 0x7e, +- 0x75, 0x69, 0x0f, 0xab, 0x94, 0xe3, 0x78, 0xd6, 0xa0, 0x6f, 0x52, 0xe4, +- 0xad, 0x26, 0xbf, 0xae, 0xc1, 0x2d, 0xc5, 0x75, 0x0b, 0xbf, 0x9f, 0xb2, +- 0xfd, 0xd1, 0xa9, 0x18, 0x5d, 0xc6, 0x38, 0xc0, 0x1b, 0xcf, 0xd9, 0x0a, +- 0x96, 0xe9, 0x3e, 0xac, 0x0b, 0xd6, 0x61, 0x99, 0xf1, 0xef, 0xce, 0x2d, +- 0xab, 0xe5, 0xd9, 0x79, 0x1e, 0xe1, 0xaf, 0x64, 0xbb, 0x6f, 0x92, 0x53, +- 0x8f, 0xf3, 0xcb, 0x54, 0xbe, 0x78, 0xdf, 0xca, 0x53, 0x36, 0xe5, 0x6e, +- 0xa3, 0xdc, 0x7b, 0x83, 0x6e, 0xbe, 0x5b, 0x2a, 0x37, 0x15, 0xf3, 0x10, +- 0xd7, 0xa5, 0x6c, 0x27, 0xe5, 0xde, 0x4d, 0xb9, 0xfd, 0x41, 0xe9, 0xdf, +- 0xbf, 0x3b, 0xf7, 0xae, 0x96, 0x67, 0xe5, 0x7d, 0x13, 0x29, 0xff, 0x9e, +- 0xc8, 0x35, 0xc6, 0x4b, 0x6d, 0x1d, 0xb2, 0x91, 0x95, 0xdc, 0x6f, 0x6d, +- 0x47, 0x54, 0xeb, 0x75, 0xd7, 0xb2, 0x35, 0xac, 0xcb, 0x6b, 0xb8, 0x87, +- 0xba, 0xcb, 0x79, 0xcb, 0x63, 0x72, 0xfb, 0x64, 0x09, 0x77, 0x5e, 0xce, +- 0x72, 0x7d, 0x25, 0xdc, 0xee, 0xcc, 0x8b, 0x0d, 0xcd, 0xdc, 0x4f, 0x6a, +- 0x2a, 0xf9, 0xb3, 0x17, 0x4f, 0xdb, 0x1f, 0x9c, 0x1b, 0xcc, 0x48, 0x3c, +- 0x93, 0xf5, 0x10, 0x0d, 0xd9, 0xfc, 0xe5, 0x68, 0x1e, 0x0a, 0x62, 0xad, +- 0x31, 0x9b, 0xbe, 0xfe, 0xa5, 0xf3, 0x36, 0x75, 0x80, 0xed, 0xc0, 0xe7, +- 0x8a, 0x57, 0x9e, 0xce, 0xb7, 0x06, 0x1b, 0x70, 0xe9, 0x1e, 0xd2, 0xfc, +- 0x64, 0x8d, 0x19, 0xed, 0xfe, 0x0e, 0xe7, 0xae, 0xca, 0xe5, 0xd0, 0x5b, +- 0x94, 0x1c, 0xe7, 0xef, 0xa9, 0xd2, 0xfc, 0x3d, 0x99, 0xbf, 0xae, 0xb2, +- 0x88, 0x45, 0x97, 0xa3, 0x65, 0x48, 0xfe, 0x07, 0xf1, 0x46, 0xc7, 0xc7, +- 0x79, 0xef, 0x72, 0x2c, 0x1c, 0xf9, 0x54, 0x25, 0xb9, 0xb5, 0x51, 0xcc, +- 0xc1, 0x2f, 0xcd, 0x33, 0x22, 0xfd, 0x16, 0x16, 0xb0, 0x5c, 0x13, 0x75, +- 0x26, 0x18, 0x28, 0xfd, 0x7a, 0xe4, 0x7c, 0xbf, 0xbe, 0xcc, 0x7e, 0xa5, +- 0x7c, 0xb2, 0xd6, 0x2a, 0xfd, 0x52, 0x92, 0xb5, 0x66, 0x13, 0xde, 0x1f, +- 0x40, 0x30, 0x68, 0x46, 0x53, 0x2f, 0xd3, 0xde, 0x27, 0xd8, 0xd7, 0x7a, +- 0xf4, 0x2b, 0x79, 0x77, 0xaf, 0xea, 0x20, 0xcb, 0xcc, 0x8c, 0xa3, 0xd2, +- 0x4f, 0xaf, 0xe4, 0x59, 0x3e, 0xd9, 0x67, 0xf2, 0xe9, 0x22, 0xff, 0x6d, +- 0x72, 0xc5, 0x3e, 0xca, 0x4f, 0x72, 0xfe, 0xfc, 0x6c, 0x03, 0x56, 0xb5, +- 0xd9, 0xed, 0x72, 0x55, 0x2f, 0xfd, 0x6e, 0x19, 0x6d, 0xea, 0xc9, 0x9c, +- 0x82, 0x51, 0x2a, 0xfd, 0x68, 0x56, 0xd6, 0x89, 0xc3, 0x38, 0x90, 0xf3, +- 0xe1, 0x85, 0xec, 0x3c, 0x8c, 0xe7, 0x2a, 0xf0, 0x5c, 0xf6, 0x32, 0xec, +- 0xcb, 0x11, 0xfd, 0xb2, 0x97, 0x63, 0x24, 0xe7, 0xc7, 0x4f, 0xb2, 0xd4, +- 0x53, 0xae, 0x0a, 0xff, 0x9c, 0xfd, 0x13, 0x7c, 0x3d, 0x57, 0x8d, 0xd7, +- 0xb2, 0x57, 0xe0, 0x60, 0xae, 0x06, 0xaf, 0x64, 0xc9, 0x27, 0x73, 0x01, +- 0xbc, 0x9c, 0xd5, 0x50, 0xc8, 0xcd, 0xc2, 0x4b, 0xd9, 0x08, 0x26, 0x72, +- 0xb5, 0xf8, 0x6e, 0x76, 0x01, 0xf2, 0xb9, 0x3a, 0x7c, 0x27, 0xdb, 0x8c, +- 0x2f, 0xe7, 0x82, 0x78, 0x31, 0xab, 0xe3, 0xa9, 0x5c, 0x3d, 0x8e, 0x65, +- 0xa3, 0x6c, 0x37, 0x84, 0xa3, 0xc3, 0x31, 0x1c, 0x18, 0x6d, 0xc4, 0x0b, +- 0xc3, 0x8b, 0x30, 0x3e, 0x1a, 0xc6, 0x73, 0xc3, 0x6d, 0xd8, 0x37, 0xfa, +- 0x6f, 0x15, 0xa2, 0x9f, 0x23, 0xf6, 0xff, 0x38, 0xaf, 0xc7, 0x6d, 0x1f, +- 0x31, 0xdf, 0xaf, 0xda, 0xa2, 0x37, 0xbf, 0x55, 0xcf, 0x39, 0x7a, 0x3a, +- 0xef, 0xce, 0x3b, 0xf4, 0x21, 0x77, 0x7f, 0x06, 0x7d, 0xc6, 0x65, 0xcc, +- 0xd9, 0xfa, 0x25, 0x7e, 0xd0, 0x16, 0x0e, 0x2a, 0xdb, 0x5d, 0x1c, 0xa9, +- 0x4d, 0xce, 0xa2, 0x2e, 0x39, 0xec, 0x60, 0x0d, 0x7d, 0x32, 0x4b, 0x7f, +- 0xb6, 0x38, 0xaf, 0x76, 0xfe, 0xa0, 0xb2, 0x83, 0x39, 0xe2, 0x95, 0x43, +- 0x96, 0x53, 0xed, 0xe2, 0x69, 0x34, 0xb9, 0x88, 0x3e, 0x17, 0x1b, 0x11, +- 0x7d, 0xde, 0x59, 0x21, 0xfa, 0xac, 0xd0, 0x3f, 0xcc, 0x4e, 0xca, 0x7a, +- 0x0f, 0x94, 0xec, 0xe1, 0xfb, 0x95, 0xc5, 0xbc, 0xaa, 0x3c, 0xef, 0x8e, +- 0x33, 0x68, 0x94, 0xe7, 0x9e, 0xfc, 0xaf, 0x41, 0xd6, 0xa4, 0xc0, 0x58, +- 0x50, 0x8f, 0x5c, 0x48, 0xf2, 0xf5, 0x99, 0x98, 0x81, 0x64, 0xa5, 0x19, +- 0xd5, 0x5a, 0xd4, 0x99, 0x7c, 0x45, 0xb0, 0x43, 0xe4, 0x5b, 0x2e, 0xee, +- 0x1c, 0x3e, 0x8f, 0x1f, 0x67, 0x2b, 0x85, 0xa7, 0xec, 0xb7, 0xa5, 0x6f, +- 0x50, 0x2b, 0xa4, 0xcf, 0x28, 0xde, 0x43, 0xa1, 0xac, 0xaf, 0x99, 0x76, +- 0xa7, 0x52, 0xb7, 0x62, 0x7b, 0x5e, 0xfa, 0xc2, 0x72, 0x89, 0x7b, 0xec, +- 0x47, 0x13, 0x5e, 0xb0, 0x8b, 0x7b, 0x33, 0xe3, 0x79, 0xd1, 0xb7, 0x86, +- 0xad, 0xe4, 0x5e, 0x87, 0x87, 0x15, 0xea, 0xee, 0x2f, 0x51, 0xdc, 0x3f, +- 0xf2, 0xd2, 0x57, 0xd7, 0xb2, 0x3c, 0x63, 0x7c, 0x61, 0xda, 0xdd, 0x1b, +- 0xae, 0x73, 0xf3, 0xee, 0x30, 0x0a, 0x03, 0x1f, 0x9c, 0xdb, 0x96, 0xf9, +- 0xe5, 0xb9, 0x3d, 0x99, 0x68, 0x4a, 0xf6, 0x67, 0xf2, 0x13, 0x3e, 0xe4, +- 0xf6, 0x06, 0xf0, 0xd4, 0x84, 0x1f, 0x35, 0x69, 0xc9, 0xf3, 0x83, 0x78, +- 0x6a, 0xff, 0xa1, 0x15, 0x35, 0x68, 0xe0, 0xff, 0x10, 0xaf, 0x46, 0x5e, +- 0x01, 0x1c, 0x1b, 0xf5, 0xe3, 0x2d, 0x5b, 0x7c, 0x58, 0xfc, 0xa3, 0x8d, +- 0xd8, 0x1f, 0x60, 0xbc, 0x55, 0x19, 0x47, 0x9a, 0x70, 0x38, 0x1f, 0xc4, +- 0xf2, 0x6c, 0x3d, 0x9e, 0xcb, 0x25, 0xf1, 0x44, 0xa6, 0x1e, 0x67, 0x1f, +- 0xf3, 0x63, 0xde, 0x3e, 0xf1, 0x87, 0x06, 0x9c, 0x1e, 0xfc, 0x04, 0x0a, +- 0x7b, 0x93, 0xb0, 0x33, 0xb3, 0xb1, 0x63, 0xb0, 0x01, 0xdf, 0x61, 0x99, +- 0x7e, 0xea, 0xa9, 0x7a, 0xa7, 0x89, 0x17, 0x69, 0x43, 0x55, 0x3b, 0x6f, +- 0xa4, 0xec, 0x30, 0x7c, 0x03, 0x21, 0x1c, 0xc9, 0x7b, 0x85, 0xd7, 0x71, +- 0x1e, 0x7f, 0x5a, 0x9c, 0x17, 0x08, 0x6f, 0xbd, 0x98, 0x07, 0x1e, 0x3f, +- 0xcf, 0x03, 0x81, 0x5c, 0x5e, 0xd6, 0x18, 0xdb, 0x3a, 0xfb, 0xec, 0x89, +- 0xff, 0xcf, 0x6f, 0xfe, 0xf4, 0xdb, 0x15, 0x4b, 0x0c, 0x62, 0x9d, 0x8c, +- 0x7f, 0xed, 0x83, 0xd5, 0xe6, 0x86, 0x2f, 0xae, 0x58, 0x52, 0x89, 0xfb, +- 0xdd, 0xf9, 0xea, 0x81, 0xbd, 0xbb, 0x9b, 0xf1, 0xb5, 0xb5, 0x67, 0x40, +- 0xb9, 0x02, 0xa9, 0xfa, 0x21, 0xde, 0x53, 0x4b, 0x3e, 0x07, 0x55, 0x6c, +- 0xad, 0x8e, 0xfa, 0x54, 0x0b, 0x1a, 0x4e, 0xd0, 0xc8, 0x6a, 0xd3, 0x11, +- 0x4c, 0xd5, 0xcb, 0x38, 0x63, 0xcc, 0xb3, 0x3c, 0xb2, 0x77, 0x8d, 0x4f, +- 0x33, 0xc6, 0x9d, 0x5d, 0xac, 0x20, 0xf1, 0x67, 0xe2, 0x83, 0xb7, 0x96, +- 0xf6, 0x80, 0x65, 0x3f, 0x4c, 0xe6, 0xad, 0xac, 0xff, 0xbd, 0xb2, 0xee, +- 0xc9, 0x3f, 0xc1, 0x0a, 0x2f, 0x0e, 0xdb, 0x39, 0xe6, 0x08, 0x32, 0x07, +- 0x32, 0xa6, 0xed, 0xac, 0x27, 0xe3, 0x92, 0xe7, 0xad, 0x89, 0xfa, 0x8f, +- 0x1c, 0x97, 0x8c, 0x67, 0xad, 0x1f, 0xd5, 0x32, 0x86, 0xb2, 0x2e, 0xfa, +- 0x58, 0xf7, 0x51, 0xde, 0x93, 0x7a, 0x8e, 0xb3, 0xfd, 0xa2, 0x98, 0x55, +- 0x91, 0xac, 0x66, 0xdf, 0x9f, 0xb4, 0xa3, 0xc9, 0x77, 0x88, 0x8b, 0xc7, +- 0xa8, 0xc3, 0x51, 0x5b, 0xec, 0x6f, 0x0b, 0xed, 0xae, 0x5f, 0x39, 0x7a, +- 0xde, 0xf6, 0x80, 0x83, 0xb6, 0xcc, 0xaf, 0xf0, 0x29, 0x19, 0xaf, 0x86, +- 0xe9, 0x89, 0xa0, 0xcb, 0xc7, 0xdf, 0xb6, 0xc5, 0x26, 0x62, 0xcc, 0xcf, +- 0xa6, 0xcf, 0xf5, 0x66, 0x0c, 0x1c, 0xe3, 0xdc, 0x9e, 0xb6, 0xab, 0x88, +- 0x37, 0x1d, 0x90, 0xbd, 0xce, 0xf7, 0xed, 0x04, 0x5e, 0x22, 0x66, 0xbd, +- 0x47, 0x5b, 0xfb, 0x2e, 0x31, 0xec, 0x5d, 0x5b, 0xc7, 0x77, 0x68, 0x7b, +- 0xef, 0xd8, 0x31, 0xbc, 0x98, 0xaf, 0xc7, 0x51, 0xe2, 0xd0, 0x49, 0x7e, +- 0x5e, 0x9e, 0xf7, 0xc1, 0x0a, 0xc9, 0xbe, 0xda, 0x1e, 0x3f, 0x6a, 0x7b, +- 0xd9, 0xe7, 0x48, 0x97, 0x1c, 0x44, 0x79, 0x96, 0xe3, 0xd3, 0x94, 0x32, +- 0x0f, 0x29, 0xe7, 0x04, 0x49, 0x64, 0x33, 0x33, 0xb1, 0x21, 0xd2, 0x9f, +- 0xa3, 0xdd, 0xfa, 0xd2, 0xe5, 0x38, 0xc0, 0xd8, 0x59, 0x10, 0xdb, 0xf6, +- 0xc0, 0x33, 0x24, 0xf6, 0x7f, 0x0d, 0x75, 0x3d, 0x7d, 0x4e, 0xf6, 0xd2, +- 0x54, 0x7d, 0x8a, 0xfe, 0x5e, 0x85, 0xde, 0xdc, 0xe5, 0xa8, 0x19, 0x5a, +- 0x8a, 0xfb, 0xe3, 0xe2, 0xf7, 0x7e, 0xf4, 0xe7, 0x3c, 0xa8, 0x1c, 0x22, +- 0x77, 0x61, 0xd9, 0xa9, 0x50, 0x31, 0x1e, 0xa9, 0x69, 0xc3, 0xf5, 0x83, +- 0x05, 0x85, 0x0f, 0xce, 0xd9, 0x99, 0x43, 0xf3, 0x54, 0x4c, 0x9f, 0x4b, +- 0x67, 0x02, 0xe8, 0xa3, 0x4d, 0xab, 0x69, 0x05, 0x75, 0x7a, 0x88, 0xf9, +- 0x5f, 0x1b, 0x7a, 0xa9, 0x8b, 0xf9, 0xe9, 0x26, 0x3c, 0x31, 0xd1, 0x88, +- 0x79, 0xbb, 0x4c, 0x3c, 0x4e, 0xdb, 0x0f, 0xef, 0xba, 0x11, 0x7b, 0x58, +- 0xee, 0x15, 0x3e, 0x7b, 0x65, 0x7f, 0x03, 0xaf, 0x10, 0xaf, 0x46, 0x5e, +- 0xf5, 0x18, 0xd8, 0xab, 0x97, 0xce, 0x61, 0x78, 0xd0, 0x30, 0x24, 0xf8, +- 0xa2, 0xe2, 0x8e, 0x76, 0x05, 0xc6, 0xd5, 0x6c, 0x73, 0xe1, 0x87, 0x61, +- 0x4d, 0xc3, 0x1f, 0xd0, 0xef, 0x1f, 0x38, 0x53, 0xe7, 0xed, 0xc7, 0x0f, +- 0x6f, 0xfa, 0xfb, 0xae, 0xfd, 0x2c, 0x28, 0x48, 0x3b, 0xef, 0x12, 0x33, +- 0xc4, 0x86, 0x7e, 0x17, 0x9e, 0x95, 0xf5, 0xfe, 0xdb, 0x67, 0x2b, 0x70, +- 0xde, 0xbe, 0x2e, 0x5a, 0x77, 0x47, 0x9e, 0x36, 0xb1, 0xc3, 0x3d, 0x3b, +- 0x22, 0xb9, 0x4e, 0xa4, 0x2b, 0x47, 0xfd, 0xf4, 0x33, 0x87, 0xb9, 0x87, +- 0x38, 0xb1, 0x3d, 0x13, 0xb1, 0x2c, 0xb6, 0xe5, 0x23, 0x36, 0x3c, 0x30, +- 0xe8, 0x97, 0xf5, 0x6e, 0xcd, 0xa7, 0xcf, 0xc3, 0x3b, 0x39, 0xb1, 0xf9, +- 0x2a, 0x1c, 0xce, 0x86, 0x71, 0xca, 0xfd, 0x5c, 0xcd, 0x58, 0xe3, 0xa0, +- 0xd3, 0x98, 0x85, 0xbe, 0x60, 0x15, 0x06, 0x62, 0x37, 0x22, 0x77, 0x07, +- 0x73, 0x6c, 0xfa, 0x58, 0xad, 0xee, 0x47, 0x3a, 0x28, 0xf9, 0x8b, 0x07, +- 0x99, 0xd8, 0xed, 0x38, 0x5e, 0xef, 0xc5, 0x3c, 0x59, 0x6f, 0xe1, 0xb3, +- 0x3d, 0x41, 0x28, 0xf4, 0xbd, 0xa4, 0x8f, 0xb8, 0x34, 0x6b, 0x00, 0x4e, +- 0xad, 0xa9, 0xcb, 0x1e, 0x4c, 0xcf, 0x56, 0xe2, 0x52, 0xcd, 0x44, 0x0d, +- 0xe3, 0x4e, 0x0b, 0xaa, 0xf7, 0xca, 0x5e, 0x40, 0x00, 0xeb, 0x86, 0xaf, +- 0x95, 0xbd, 0x81, 0x98, 0xa6, 0x04, 0x70, 0xef, 0xb0, 0xc4, 0x8f, 0x35, +- 0xa8, 0xd8, 0x5f, 0x8b, 0x2f, 0x66, 0xbd, 0xc4, 0x78, 0xe2, 0x0d, 0xcb, +- 0xed, 0xc9, 0xd4, 0xa1, 0xee, 0xb1, 0x67, 0x9d, 0x30, 0x75, 0x5c, 0xb7, +- 0x57, 0xb0, 0x88, 0xb6, 0x9b, 0xf9, 0x3c, 0x0a, 0x76, 0x33, 0xe5, 0xf6, +- 0x70, 0x7c, 0x21, 0xbc, 0x4b, 0xec, 0xaa, 0x99, 0x08, 0xe3, 0x9d, 0xdd, +- 0x92, 0xab, 0x24, 0xe1, 0x9d, 0xb8, 0x0c, 0x6f, 0xf2, 0xf3, 0x09, 0xa3, +- 0x13, 0xea, 0x44, 0x13, 0x4e, 0x66, 0xba, 0xe0, 0x99, 0xa8, 0x2d, 0x62, +- 0xd8, 0x5e, 0x3f, 0xea, 0x06, 0xf5, 0xd8, 0x34, 0xe7, 0xc8, 0xb7, 0x97, +- 0x04, 0xa7, 0x51, 0xda, 0x3f, 0x6f, 0xdb, 0xc6, 0x85, 0x7d, 0x87, 0xf2, +- 0xd9, 0x15, 0xb1, 0xef, 0xef, 0x3a, 0x4f, 0x04, 0xd9, 0xbf, 0x8e, 0x08, +- 0xfa, 0x62, 0xc7, 0x64, 0x3f, 0x9f, 0xe3, 0x4b, 0x72, 0xee, 0x9f, 0x77, +- 0xe4, 0x5c, 0x88, 0xcf, 0x94, 0x33, 0x19, 0xcf, 0x39, 0xdb, 0x57, 0xcb, +- 0xfd, 0xdb, 0xab, 0x50, 0xcd, 0xc4, 0xc9, 0x14, 0x99, 0x3b, 0x64, 0x6e, +- 0x19, 0x75, 0x3e, 0x4c, 0xe6, 0x3f, 0x3a, 0x8f, 0x9f, 0x2f, 0x8f, 0xa0, +- 0xcf, 0x5d, 0x13, 0xbf, 0xe0, 0xcb, 0x35, 0x9c, 0xbb, 0xf5, 0x25, 0x5f, +- 0x7e, 0xc7, 0x96, 0xf9, 0x93, 0xf3, 0x4b, 0x01, 0x72, 0x30, 0x03, 0xd5, +- 0x9c, 0xbb, 0xf7, 0x6d, 0x28, 0xb7, 0x76, 0x74, 0x63, 0xd6, 0x44, 0x80, +- 0xbe, 0x1e, 0x59, 0x6f, 0xc1, 0x66, 0x5b, 0x1d, 0xa8, 0x62, 0x9d, 0x93, +- 0xb6, 0x87, 0x7e, 0x9e, 0xe0, 0x98, 0x83, 0x70, 0x5c, 0x5e, 0xbf, 0x1a, +- 0xf3, 0xa9, 0xa7, 0xb3, 0xb6, 0x89, 0x79, 0xd4, 0xd3, 0xb4, 0xed, 0x25, +- 0x4e, 0x34, 0x11, 0x0f, 0x34, 0xd4, 0x12, 0x1b, 0x2b, 0x06, 0x1d, 0x1c, +- 0x32, 0xea, 0xc8, 0xf5, 0xc5, 0x4e, 0x3b, 0x10, 0x1e, 0x30, 0x30, 0x6f, +- 0xa0, 0x79, 0xe3, 0x3c, 0x8f, 0x07, 0xc7, 0x7d, 0xc5, 0xd8, 0x93, 0x9b, +- 0x23, 0xfa, 0x91, 0x31, 0xb9, 0xb9, 0xfc, 0x87, 0x60, 0xc0, 0x6a, 0x80, +- 0xb2, 0x0a, 0xc4, 0x8c, 0xcf, 0xb1, 0xad, 0x37, 0xec, 0x57, 0x71, 0xf3, +- 0x84, 0xe0, 0xcb, 0x0f, 0xb1, 0x92, 0xfd, 0x78, 0x97, 0xb8, 0x76, 0x5f, +- 0xf4, 0x1b, 0x1c, 0x6b, 0x13, 0x6e, 0x99, 0x98, 0x3e, 0xd7, 0xe7, 0x8e, +- 0xb3, 0x9c, 0xff, 0xf9, 0x71, 0x5f, 0xb6, 0x7c, 0x06, 0x2d, 0x49, 0x9f, +- 0x91, 0x38, 0xe1, 0x87, 0xf8, 0x4d, 0xb7, 0xbd, 0x0d, 0xc5, 0x78, 0x2e, +- 0x57, 0x59, 0x8f, 0x3b, 0xbd, 0x92, 0x97, 0x17, 0x7d, 0x43, 0xfa, 0xf3, +- 0xbb, 0xca, 0x14, 0x7d, 0x43, 0xfc, 0xe2, 0xcb, 0xae, 0x7e, 0x85, 0x77, +- 0x69, 0xb8, 0x6d, 0xe2, 0x97, 0xc4, 0xc7, 0x48, 0x32, 0x47, 0xcc, 0x7e, +- 0x9d, 0xfa, 0xdd, 0x4e, 0xfd, 0x32, 0x07, 0x60, 0xbc, 0x4a, 0x50, 0x9f, +- 0x3e, 0x72, 0x15, 0x2f, 0x31, 0xd3, 0xa4, 0x2e, 0x41, 0x0c, 0x64, 0xee, +- 0x1e, 0x2c, 0x8e, 0x37, 0x77, 0x7e, 0xfe, 0xd8, 0x96, 0x92, 0xc0, 0x09, +- 0xfb, 0x87, 0x55, 0x72, 0x26, 0xe8, 0xa4, 0xed, 0x3e, 0x97, 0x35, 0xcd, +- 0x19, 0x65, 0x2e, 0xb4, 0xbd, 0xcf, 0x16, 0xfe, 0x5c, 0x49, 0xbb, 0xd6, +- 0x28, 0xaf, 0xa6, 0x84, 0xa9, 0x52, 0x57, 0xf6, 0x60, 0xa5, 0xfd, 0x6e, +- 0xe1, 0x20, 0x78, 0x83, 0x3e, 0x77, 0xc4, 0xa8, 0xc0, 0xa8, 0x3b, 0x17, +- 0x62, 0x8f, 0xc5, 0x76, 0x2f, 0xd8, 0x4d, 0xba, 0xae, 0x74, 0x1e, 0xab, +- 0xba, 0xc8, 0xc9, 0x2e, 0x6d, 0xa3, 0xe2, 0x3f, 0xb1, 0x8d, 0x44, 0xa9, +- 0x8d, 0x8f, 0x3a, 0xe3, 0x06, 0x3c, 0x65, 0x4b, 0xec, 0x97, 0xfd, 0x0f, +- 0x0d, 0x8b, 0x26, 0x04, 0x5f, 0xe8, 0xbb, 0x03, 0xd3, 0x2e, 0xf7, 0xcf, +- 0x41, 0xf6, 0xb6, 0x42, 0xf0, 0x45, 0x35, 0x9c, 0xd2, 0x63, 0x58, 0x58, +- 0x90, 0xfd, 0xa9, 0x7d, 0x75, 0xc2, 0xe1, 0xce, 0xe8, 0xc2, 0x3b, 0x64, +- 0xbe, 0xca, 0xf7, 0xfc, 0xd8, 0xaf, 0x17, 0xfb, 0x9a, 0x54, 0x8b, 0xdc, +- 0xd1, 0x43, 0xee, 0xd8, 0x6b, 0xf8, 0x69, 0x97, 0xad, 0xc1, 0xd9, 0xbf, +- 0x73, 0x2f, 0xab, 0xdc, 0xdf, 0xdf, 0x57, 0xee, 0xc2, 0x7a, 0x5c, 0xf6, +- 0xa2, 0xfd, 0x21, 0x19, 0xd3, 0x5c, 0xa0, 0x41, 0xe2, 0x55, 0x91, 0xa3, +- 0x6e, 0x3d, 0x9f, 0xff, 0x58, 0xca, 0x60, 0xfe, 0x31, 0xd4, 0xeb, 0x0b, +- 0x50, 0xdf, 0x50, 0xc3, 0xb8, 0x1c, 0xed, 0xa2, 0x7b, 0x4b, 0x2c, 0xb3, +- 0x82, 0xa6, 0xe4, 0xbf, 0xc2, 0x5b, 0xa5, 0xcd, 0x7e, 0xa5, 0xaa, 0x20, +- 0xed, 0x1e, 0x54, 0xfc, 0x85, 0x0f, 0x6b, 0x5b, 0xce, 0xfb, 0x4d, 0x9f, +- 0x1b, 0xca, 0x74, 0xbb, 0x7b, 0x8c, 0xcb, 0x86, 0x1c, 0xdc, 0x69, 0x34, +- 0xe1, 0xee, 0x06, 0x69, 0xa3, 0x98, 0xc3, 0x68, 0xea, 0x34, 0x39, 0xdc, +- 0x6f, 0x1c, 0x55, 0x97, 0xcf, 0x3e, 0x78, 0x1e, 0xd3, 0xa7, 0xd7, 0x42, +- 0xc5, 0xd9, 0xeb, 0x24, 0x9f, 0xf1, 0x91, 0x7f, 0x6d, 0xaa, 0x2e, 0xee, +- 0x2f, 0x8b, 0x1d, 0x4b, 0x3f, 0xfc, 0xf4, 0xb3, 0x0b, 0xfd, 0xd8, 0xf6, +- 0x07, 0xf5, 0xc3, 0x8f, 0x9b, 0x86, 0x92, 0x18, 0x35, 0x4e, 0x38, 0x56, +- 0x68, 0x66, 0xdb, 0x3e, 0xac, 0x1c, 0xfa, 0x8d, 0x33, 0xcb, 0x6d, 0x5b, +- 0x27, 0xa7, 0x52, 0xf1, 0xc0, 0x12, 0x1f, 0x6e, 0x1d, 0x89, 0x62, 0xc5, +- 0x90, 0x8a, 0xd8, 0x12, 0xe9, 0x43, 0x14, 0x5d, 0x23, 0xbb, 0xbd, 0xc5, +- 0xf2, 0xc0, 0x2d, 0x1c, 0xc3, 0x1b, 0x46, 0x0d, 0x7e, 0x40, 0x0c, 0xac, +- 0x75, 0xb9, 0xfd, 0x46, 0x25, 0x23, 0xdc, 0xde, 0xa7, 0x62, 0xb6, 0x8e, +- 0x60, 0x83, 0x99, 0xa4, 0xee, 0x3a, 0x95, 0xc7, 0x72, 0x1b, 0x95, 0xa1, +- 0x7c, 0xb9, 0xef, 0x01, 0x7c, 0xa2, 0x10, 0xc4, 0x27, 0xc6, 0x1a, 0x78, +- 0x85, 0x78, 0x35, 0xf2, 0x7a, 0xf1, 0xfc, 0xb8, 0xca, 0x67, 0x3c, 0x9f, +- 0x65, 0x4e, 0xb1, 0xcd, 0xf5, 0x4b, 0x89, 0x0b, 0x9a, 0x9c, 0xd5, 0xc1, +- 0x5b, 0x59, 0xc9, 0x27, 0xb6, 0xd1, 0x86, 0x65, 0x4d, 0xb8, 0x92, 0x39, +- 0x45, 0x24, 0x36, 0x85, 0xbf, 0xaa, 0x2e, 0xce, 0x7d, 0xd1, 0x86, 0x71, +- 0xde, 0x86, 0x7d, 0x78, 0x3b, 0xab, 0xa2, 0x25, 0xfe, 0x6f, 0xce, 0xf1, +- 0xa0, 0xe0, 0xc9, 0xa5, 0xcf, 0xcb, 0x9c, 0x65, 0xfa, 0x5c, 0x36, 0xd3, +- 0x34, 0x63, 0x5f, 0x56, 0x41, 0xc5, 0x90, 0xf0, 0xf3, 0xeb, 0x5c, 0xbe, +- 0xf7, 0x7d, 0xc3, 0x07, 0xef, 0xd0, 0xa1, 0x2b, 0xe5, 0x68, 0x93, 0x6f, +- 0x8c, 0x71, 0xab, 0x83, 0xf3, 0x32, 0xf2, 0xf1, 0x92, 0xce, 0xca, 0xba, +- 0x50, 0xdc, 0x35, 0x49, 0xd5, 0x8d, 0xe9, 0x41, 0xa8, 0x63, 0xc2, 0x43, +- 0xc9, 0x0d, 0xc6, 0x24, 0x1f, 0x08, 0xf1, 0xbf, 0xe4, 0x06, 0x8d, 0xfc, +- 0xcf, 0xc4, 0xa2, 0x51, 0xe2, 0x78, 0x0f, 0xfa, 0x19, 0x9f, 0x2a, 0xa3, +- 0x3d, 0xd8, 0x3e, 0xfe, 0x61, 0x31, 0xbf, 0x98, 0x63, 0x3d, 0x7b, 0xde, +- 0xcf, 0xdc, 0x39, 0x62, 0x9f, 0xa6, 0xcf, 0x89, 0xcf, 0xc8, 0x5c, 0xed, +- 0xcb, 0x4a, 0x1f, 0x1c, 0x6c, 0x30, 0x6e, 0x64, 0xdb, 0x3e, 0xa8, 0x0d, +- 0x33, 0xb9, 0xe7, 0x79, 0x3e, 0x4d, 0xdd, 0x6d, 0x54, 0x46, 0x39, 0x27, +- 0x96, 0xb7, 0x52, 0xd6, 0x87, 0x82, 0x15, 0x9c, 0x93, 0xaf, 0xe4, 0x45, +- 0x46, 0xa7, 0x32, 0x9e, 0x9b, 0x59, 0x67, 0xa3, 0x32, 0x96, 0xff, 0x55, +- 0xb5, 0xac, 0x99, 0x5f, 0xd0, 0x4d, 0xb9, 0x0f, 0x62, 0x63, 0x1a, 0xea, +- 0xd3, 0xa2, 0x67, 0x19, 0xb3, 0x06, 0x2f, 0x79, 0x5c, 0x7d, 0xe1, 0x43, +- 0xdb, 0x6c, 0xac, 0x72, 0xcf, 0x62, 0xc6, 0x18, 0x8b, 0x02, 0x56, 0x25, +- 0x39, 0x1f, 0x6d, 0x34, 0xe5, 0x33, 0xbb, 0x3a, 0xf7, 0xd9, 0x0b, 0x83, +- 0x87, 0x4b, 0x6b, 0x11, 0x6b, 0x21, 0xbc, 0x54, 0x71, 0x71, 0xd6, 0xa3, +- 0x47, 0xb1, 0x9c, 0xb9, 0xee, 0x4d, 0xb9, 0x62, 0x7f, 0xc7, 0xd8, 0xdf, +- 0x29, 0xd7, 0xf7, 0x92, 0xca, 0x68, 0x5e, 0x75, 0xfb, 0xed, 0x35, 0xa5, +- 0xbf, 0x52, 0x97, 0xe3, 0xc9, 0xbf, 0x56, 0xca, 0xa9, 0x92, 0x18, 0xcc, +- 0xcc, 0xf4, 0x61, 0xe9, 0x73, 0x2d, 0xda, 0x86, 0x3e, 0xa0, 0x9f, 0xc9, +- 0xbc, 0x0a, 0xfe, 0xcc, 0xc3, 0xca, 0x91, 0x59, 0x68, 0x1d, 0x0a, 0xe3, +- 0xb6, 0x91, 0x06, 0x2c, 0xda, 0xb5, 0x06, 0xd5, 0x63, 0x41, 0x5c, 0xb9, +- 0x4b, 0xd6, 0xf8, 0x57, 0xa3, 0xb2, 0x70, 0x5b, 0x8d, 0xe4, 0xb8, 0x7a, +- 0x3a, 0xc1, 0xf9, 0x4b, 0xa0, 0x22, 0x1d, 0x49, 0x24, 0x21, 0x6b, 0xa4, +- 0x26, 0x2a, 0x0a, 0x26, 0xf9, 0xa4, 0xb3, 0x79, 0xbe, 0xe9, 0x73, 0xcf, +- 0x9b, 0x2d, 0x2b, 0xd0, 0xe6, 0x39, 0x6e, 0x1f, 0x2f, 0x4f, 0xda, 0x71, +- 0xce, 0x5e, 0x87, 0xcd, 0x35, 0x66, 0x13, 0x3c, 0x85, 0xcb, 0x91, 0x1c, +- 0x69, 0xc3, 0xbc, 0x42, 0x03, 0x3a, 0x47, 0x42, 0x88, 0xa5, 0xc5, 0xc7, +- 0x23, 0x5a, 0x4a, 0xed, 0x80, 0xbf, 0xc0, 0x78, 0x9a, 0xfe, 0x8d, 0xf3, +- 0x16, 0xed, 0xa0, 0x87, 0xfa, 0xba, 0x26, 0xdd, 0x85, 0xba, 0x42, 0x00, +- 0x57, 0x0f, 0x7d, 0x02, 0xb5, 0x23, 0x7e, 0xcc, 0x1a, 0xd2, 0x90, 0x5f, +- 0xe2, 0x47, 0x60, 0x24, 0x8c, 0xea, 0xb4, 0xde, 0x75, 0x9b, 0x82, 0xe4, +- 0xc2, 0x25, 0x61, 0xb6, 0x4d, 0x7b, 0xa3, 0x7f, 0x8d, 0x90, 0x7f, 0x2d, +- 0xef, 0x06, 0x36, 0xa7, 0x05, 0x1b, 0x45, 0x27, 0x9f, 0x72, 0xcf, 0x9f, +- 0xac, 0x4b, 0x7f, 0x18, 0xce, 0x95, 0xed, 0x5b, 0xfc, 0xdc, 0x72, 0xcf, +- 0xc4, 0x32, 0x07, 0x52, 0xa6, 0x5b, 0xf4, 0xec, 0x3c, 0xde, 0xfb, 0x39, +- 0xe3, 0xf3, 0x43, 0xe9, 0x80, 0x55, 0x6b, 0x6e, 0xc6, 0x55, 0xed, 0x11, +- 0xab, 0xa0, 0xbc, 0xca, 0xf1, 0xff, 0x90, 0x41, 0xbb, 0x89, 0xfd, 0xfc, +- 0x63, 0xe5, 0x5f, 0xba, 0xce, 0xb6, 0xe4, 0xa2, 0xf5, 0xb9, 0x23, 0xcc, +- 0xe7, 0xa7, 0x2e, 0x5a, 0x9f, 0x13, 0xbc, 0x2f, 0x9f, 0x83, 0x90, 0xb9, +- 0xd2, 0x66, 0xd8, 0xb7, 0xac, 0x17, 0x09, 0x36, 0xca, 0x7c, 0x95, 0xd7, +- 0x8b, 0x7c, 0x58, 0x3e, 0x24, 0xb9, 0x92, 0xca, 0x3c, 0xa1, 0x05, 0xc9, +- 0xd0, 0xa3, 0x9c, 0x03, 0x77, 0x4d, 0x89, 0xf7, 0x06, 0xf8, 0x59, 0xd6, +- 0x7b, 0x34, 0xe2, 0x8f, 0x56, 0xca, 0x0b, 0xaa, 0x70, 0xeb, 0x50, 0x83, +- 0xbb, 0x1f, 0xb5, 0x22, 0x7e, 0x39, 0x62, 0xf5, 0x5f, 0x62, 0x99, 0x0b, +- 0x6b, 0x43, 0x57, 0x31, 0xdf, 0xa8, 0x71, 0xcf, 0x4a, 0x2c, 0xa3, 0xbe, +- 0x2f, 0x47, 0xdb, 0x48, 0x11, 0xcf, 0x6e, 0x1b, 0x29, 0xe2, 0x56, 0x5a, +- 0x6c, 0xce, 0x57, 0xb4, 0xb9, 0x2c, 0x6d, 0x2e, 0xa8, 0x77, 0x2a, 0xd9, +- 0xdc, 0x47, 0xc5, 0x13, 0x04, 0xeb, 0xcc, 0xf2, 0x99, 0x6a, 0x62, 0x5e, +- 0xfe, 0x48, 0xcd, 0x1f, 0x16, 0x7f, 0x2e, 0xd5, 0xd9, 0xb5, 0x7f, 0xa4, +- 0xce, 0xca, 0x31, 0xeb, 0x82, 0xce, 0x06, 0x2f, 0xd1, 0xd9, 0x02, 0xea, +- 0xa0, 0x41, 0x2f, 0xea, 0x6d, 0xb9, 0x71, 0x19, 0x52, 0xae, 0xde, 0xaa, +- 0x64, 0x6d, 0x8c, 0xf7, 0x04, 0xaf, 0xe7, 0xe0, 0xfb, 0xc1, 0x2f, 0xb9, +- 0xf7, 0x16, 0x51, 0x27, 0x45, 0x7d, 0x05, 0xa9, 0xaf, 0x0b, 0xb1, 0x00, +- 0xea, 0x07, 0xcc, 0xa7, 0x8a, 0xb1, 0x40, 0x74, 0xf7, 0xda, 0xa0, 0x86, +- 0xba, 0xeb, 0x2e, 0xc7, 0x2b, 0x7b, 0xab, 0xd0, 0x3e, 0xe2, 0xa3, 0x7f, +- 0x49, 0x7c, 0x28, 0xc6, 0xa4, 0xd6, 0x11, 0x77, 0x3f, 0x8a, 0xf8, 0xda, +- 0x10, 0xf8, 0xc3, 0x63, 0xb0, 0x8c, 0x47, 0xce, 0xe5, 0xc9, 0xb9, 0x39, +- 0x19, 0x97, 0x3e, 0xc3, 0x16, 0x1c, 0xe7, 0x19, 0xce, 0x77, 0xaa, 0x21, +- 0x92, 0x95, 0xf5, 0xa6, 0x2c, 0x39, 0x99, 0x27, 0x2d, 0x3a, 0x13, 0xbe, +- 0xad, 0xde, 0xe8, 0x81, 0xda, 0xe6, 0xc1, 0x66, 0x9c, 0x32, 0xf4, 0xfe, +- 0x7b, 0xf1, 0x27, 0xe8, 0x0d, 0x39, 0xd8, 0x6f, 0xac, 0x64, 0x3e, 0x51, +- 0x8d, 0xf5, 0x6d, 0x34, 0xcf, 0x3b, 0x3a, 0x88, 0x09, 0x56, 0x8f, 0x07, +- 0xb2, 0x9e, 0xbb, 0xf1, 0x2e, 0x3b, 0x1a, 0xe9, 0x7e, 0x50, 0x01, 0x56, +- 0x0c, 0xf8, 0xa1, 0x29, 0x2e, 0xdf, 0x89, 0x0d, 0xa9, 0xb2, 0xb6, 0xfc, +- 0x2f, 0x15, 0xc5, 0xb3, 0x10, 0x2a, 0xb4, 0x46, 0x69, 0x67, 0x25, 0xac, +- 0xc9, 0x0e, 0x17, 0x4f, 0x6a, 0x16, 0x2a, 0xb8, 0x75, 0x61, 0xc4, 0x4a, +- 0x29, 0x8e, 0xb3, 0x2a, 0xee, 0x75, 0x9f, 0xef, 0x98, 0x6c, 0x4d, 0xdd, +- 0xa9, 0xfe, 0x8b, 0x63, 0xb9, 0xeb, 0xd9, 0x91, 0x60, 0x52, 0x65, 0x9f, +- 0x3f, 0xf2, 0xac, 0xa2, 0x8c, 0x93, 0x5c, 0x9c, 0xbc, 0xfb, 0xc9, 0xd2, +- 0xfa, 0xaf, 0xcf, 0x5c, 0xff, 0x17, 0xfb, 0x75, 0xc9, 0xf7, 0xbe, 0xe4, +- 0x9e, 0xfb, 0xc8, 0x66, 0x64, 0xfd, 0xf0, 0xe1, 0x00, 0xaa, 0x57, 0xa2, +- 0x77, 0xf2, 0x3a, 0x4c, 0xb4, 0xfd, 0xab, 0x93, 0x2b, 0xf6, 0x5d, 0xcc, +- 0xd0, 0x3f, 0xcf, 0xcc, 0xdd, 0x75, 0x7d, 0x4b, 0x84, 0x1c, 0x5c, 0xce, +- 0x7a, 0x92, 0x0b, 0x2b, 0x45, 0x1e, 0x3e, 0x5f, 0xbf, 0x09, 0xcf, 0x5e, +- 0x24, 0x53, 0xd6, 0x12, 0xca, 0x32, 0x77, 0x51, 0x9e, 0xc8, 0x65, 0x3c, +- 0xd0, 0xff, 0xcd, 0x19, 0x09, 0xcd, 0x2c, 0x17, 0xab, 0x2a, 0xc6, 0x2a, +- 0x29, 0x57, 0x6e, 0xb7, 0x82, 0xf5, 0xde, 0x77, 0x46, 0x2f, 0x2a, 0xf7, +- 0xd3, 0x52, 0xb9, 0x67, 0x02, 0x72, 0x66, 0x24, 0x9b, 0x11, 0xce, 0x7a, +- 0xca, 0x19, 0xbb, 0xa8, 0x4c, 0x4b, 0xf5, 0xc5, 0x65, 0x9a, 0x89, 0xd1, +- 0xff, 0xaf, 0x33, 0x7e, 0x51, 0x99, 0xe4, 0x25, 0x65, 0x16, 0x10, 0x13, +- 0xbf, 0xef, 0xec, 0xbb, 0xa8, 0x4c, 0xed, 0x25, 0x65, 0x16, 0xd3, 0x1e, +- 0x9f, 0x71, 0x0e, 0x5c, 0x54, 0x66, 0xcc, 0x7f, 0x71, 0x19, 0xd9, 0xe3, +- 0x58, 0xff, 0x17, 0x5b, 0xf4, 0x75, 0x25, 0x9f, 0xbb, 0x70, 0xbf, 0x58, +- 0xfe, 0xf1, 0x4b, 0xfa, 0x1f, 0xb1, 0x64, 0xbe, 0x7d, 0xed, 0xe5, 0xf9, +- 0x7e, 0xb8, 0x74, 0xff, 0x7b, 0x35, 0x17, 0x97, 0xbb, 0x22, 0x70, 0x69, +- 0x3b, 0x45, 0x79, 0x47, 0x2f, 0x69, 0xff, 0xe6, 0xca, 0x8b, 0xbf, 0xbf, +- 0x5d, 0x51, 0xfc, 0x5e, 0xd6, 0xe9, 0xa1, 0x4b, 0x9e, 0xff, 0x7d, 0xc5, +- 0xc5, 0xdf, 0x37, 0x54, 0x7e, 0x78, 0x3b, 0xb5, 0x97, 0xb4, 0xa3, 0xf4, +- 0xca, 0xbb, 0x38, 0x1e, 0x53, 0xad, 0xed, 0xed, 0x58, 0x7f, 0x43, 0x2a, +- 0xbf, 0x89, 0xf6, 0x29, 0xb6, 0xf5, 0xe0, 0x0d, 0x6b, 0xf3, 0x6f, 0xcd, +- 0xe0, 0xb1, 0xcb, 0xc2, 0x41, 0x7c, 0x1c, 0x6b, 0xdd, 0xbd, 0x34, 0x95, +- 0x38, 0x69, 0xb9, 0xb6, 0x40, 0x8e, 0xe9, 0x57, 0xcc, 0x14, 0x0c, 0xf7, +- 0xbc, 0xe5, 0x3a, 0x34, 0xe7, 0xdd, 0x3d, 0xbb, 0x58, 0x0a, 0xcf, 0xaa, +- 0x5d, 0xba, 0x55, 0x3a, 0x47, 0x67, 0x5d, 0x1f, 0x44, 0x72, 0x66, 0x7e, +- 0xaa, 0x8d, 0x23, 0x12, 0xde, 0x86, 0x75, 0xee, 0x59, 0x6b, 0xc5, 0xec, +- 0x29, 0x9d, 0xd7, 0x5c, 0x03, 0x3d, 0x5f, 0xe6, 0x4d, 0xb2, 0x9e, 0x2b, +- 0xe7, 0x19, 0x1c, 0xfa, 0xa0, 0xc4, 0xf9, 0x83, 0x8a, 0x3a, 0xe0, 0xae, +- 0x99, 0xae, 0xf6, 0x20, 0x9a, 0xe8, 0x54, 0x90, 0xaa, 0x32, 0xa3, 0xda, +- 0xdb, 0x25, 0x4c, 0xf3, 0x4d, 0x6c, 0x51, 0x2a, 0x26, 0xfa, 0x15, 0xef, +- 0x44, 0x11, 0xd3, 0x3c, 0x13, 0xb2, 0xb6, 0xd0, 0xc0, 0x32, 0x41, 0xb4, +- 0x2c, 0xf1, 0xe2, 0x3b, 0x76, 0xad, 0xfb, 0x1e, 0xc7, 0xd6, 0x25, 0x15, +- 0x78, 0x20, 0xae, 0xa0, 0xeb, 0xaa, 0xc3, 0x78, 0x2b, 0x2f, 0xeb, 0x6c, +- 0x56, 0x7c, 0x94, 0x6d, 0x1e, 0xb2, 0x65, 0xbd, 0x74, 0x4b, 0x7c, 0xc4, +- 0x6d, 0xff, 0xf3, 0xe8, 0x73, 0xf7, 0xad, 0xba, 0x9d, 0xed, 0x99, 0x1e, +- 0x67, 0x1b, 0x73, 0x8d, 0x82, 0xdd, 0x90, 0xaa, 0x63, 0xfd, 0xb7, 0x96, +- 0xac, 0xc7, 0x69, 0x96, 0x99, 0xb0, 0x1f, 0xc4, 0xfb, 0xf9, 0x20, 0xf2, +- 0xf6, 0x4a, 0x7c, 0x37, 0x1f, 0x60, 0xce, 0xd7, 0x85, 0xef, 0xe4, 0x57, +- 0xe3, 0xc5, 0x61, 0xf7, 0x7d, 0x29, 0x2c, 0xb3, 0x15, 0xac, 0x88, 0xae, +- 0xc6, 0xb1, 0xd1, 0xd5, 0x38, 0x3c, 0x2c, 0xef, 0x0e, 0xcc, 0x25, 0x8f, +- 0x2c, 0xda, 0x9b, 0x4a, 0x8c, 0x59, 0x66, 0xaf, 0xc2, 0xa1, 0xd1, 0x30, +- 0x73, 0x29, 0x03, 0x27, 0xf3, 0x21, 0x8c, 0xd8, 0x6d, 0x38, 0x91, 0x0f, +- 0xe3, 0xeb, 0x76, 0x02, 0x67, 0xf9, 0xfd, 0xa0, 0x2d, 0x9c, 0xa5, 0x03, +- 0xd3, 0xf9, 0x6f, 0x32, 0xcf, 0x99, 0x87, 0x23, 0xdd, 0xcf, 0x30, 0x1c, +- 0x1d, 0xe4, 0xd5, 0x85, 0x13, 0xa3, 0x5d, 0x38, 0x35, 0x7c, 0x2b, 0x4e, +- 0x8d, 0xfe, 0x18, 0x6f, 0x0d, 0x4b, 0x7f, 0xe5, 0xfc, 0xb7, 0xc8, 0xd5, +- 0x29, 0x77, 0x35, 0xa6, 0x46, 0xff, 0x18, 0xd9, 0xef, 0x3a, 0x47, 0x56, +- 0x8b, 0xdc, 0x67, 0x7e, 0x87, 0x6c, 0xd1, 0xa5, 0x60, 0xbf, 0x1f, 0xc7, +- 0x6c, 0x3f, 0x8e, 0xda, 0x53, 0x57, 0x56, 0x61, 0xea, 0x7a, 0x22, 0x1d, +- 0xb6, 0xe7, 0x2b, 0xf1, 0x5c, 0x56, 0xd6, 0xd8, 0x3e, 0x86, 0x64, 0x70, +- 0x23, 0xb6, 0x4e, 0x56, 0xe2, 0x3b, 0x59, 0x3f, 0x75, 0x7c, 0x3d, 0x92, +- 0xf5, 0xab, 0xa9, 0xbf, 0x00, 0x5e, 0xb2, 0x43, 0x78, 0xd9, 0x6e, 0x4d, +- 0x15, 0x94, 0x76, 0x58, 0x2e, 0xfe, 0x07, 0xa8, 0xef, 0x0d, 0x6e, 0x9f, +- 0xbe, 0x63, 0x77, 0x3b, 0x5b, 0xa9, 0xe3, 0xfe, 0xcc, 0xe7, 0xdd, 0xb3, +- 0xdb, 0x2f, 0xda, 0xd3, 0x8e, 0xbc, 0x93, 0xf1, 0x14, 0x75, 0x7a, 0xcc, +- 0x4e, 0x91, 0xdb, 0x35, 0x71, 0x8e, 0xa6, 0x30, 0x4a, 0xbb, 0x3c, 0x99, +- 0xd5, 0x8f, 0xae, 0xc5, 0x26, 0x9c, 0xcd, 0x55, 0xe2, 0x35, 0xb6, 0x51, +- 0xb7, 0xd8, 0x8b, 0xe3, 0xae, 0xbc, 0x4d, 0x78, 0x3f, 0xab, 0x30, 0xde, +- 0x6e, 0xc2, 0x7b, 0x7c, 0xf6, 0x0a, 0x3f, 0x9f, 0x8e, 0xb3, 0x87, 0xa5, +- 0x67, 0xa7, 0xc8, 0xcf, 0x65, 0xcd, 0xa8, 0xb7, 0x63, 0x13, 0x4e, 0xe4, +- 0xde, 0x23, 0xa7, 0x75, 0xf0, 0x45, 0x63, 0x36, 0x12, 0xb3, 0xc9, 0x9b, +- 0xf4, 0x4a, 0x1c, 0xe3, 0xf3, 0x85, 0xc4, 0xdf, 0xe2, 0xfa, 0xd9, 0x26, +- 0xbc, 0xcb, 0xf1, 0x3c, 0x40, 0x59, 0xef, 0xe4, 0xfe, 0x96, 0x72, 0x97, +- 0x22, 0x1f, 0xff, 0x5b, 0xca, 0xfd, 0x31, 0xc6, 0x4b, 0xfa, 0x38, 0x61, +- 0xc8, 0xb8, 0xbe, 0x31, 0x0b, 0xd5, 0x21, 0x8e, 0xe3, 0x9b, 0xfc, 0xbf, +- 0x01, 0xc7, 0xf3, 0xff, 0x9b, 0xff, 0xbf, 0x8b, 0x03, 0x79, 0x59, 0xaf, +- 0x9e, 0x19, 0x4b, 0xc5, 0x7f, 0xca, 0x1c, 0x64, 0x0e, 0x32, 0x83, 0xb5, +- 0xa9, 0xd9, 0xb4, 0xa3, 0xbf, 0xbe, 0xb6, 0x0e, 0xef, 0xc6, 0x2d, 0xec, +- 0xd8, 0xe7, 0x45, 0x86, 0xb8, 0xbb, 0x63, 0xa0, 0x01, 0x4f, 0xec, 0x0c, +- 0xe2, 0xf1, 0x9d, 0x97, 0x61, 0xcb, 0xce, 0x2b, 0xb0, 0x67, 0x67, 0x13, +- 0xd2, 0x3b, 0x1d, 0xe7, 0xfd, 0xc5, 0x8e, 0xb3, 0x88, 0xd7, 0x23, 0xf4, +- 0x05, 0x3f, 0xff, 0xbf, 0x10, 0x17, 0x3f, 0xd1, 0x71, 0x95, 0xeb, 0x2f, +- 0x9d, 0xb8, 0xd2, 0xfd, 0x9f, 0xc4, 0xa2, 0xfc, 0xc6, 0xf8, 0xfa, 0xc2, +- 0xa6, 0xf8, 0x7d, 0x85, 0x39, 0xd8, 0x3a, 0xd8, 0x88, 0xc1, 0x9d, 0x0d, +- 0xa9, 0x06, 0xb6, 0xb3, 0xea, 0x5a, 0xe1, 0x76, 0x8e, 0x63, 0xb4, 0xf7, +- 0xc7, 0xd7, 0x16, 0x9e, 0x41, 0x77, 0x21, 0x84, 0xbe, 0xc1, 0x30, 0xdb, +- 0x92, 0xbd, 0x5c, 0xef, 0xd1, 0x7b, 0xe1, 0x38, 0xd3, 0x8b, 0x0f, 0xe2, +- 0xae, 0xc2, 0x37, 0xc9, 0x1b, 0x43, 0x48, 0x0f, 0xae, 0x47, 0x66, 0xb2, +- 0x22, 0xe5, 0x37, 0x1d, 0xbc, 0x14, 0x9f, 0xc2, 0xed, 0x94, 0xf7, 0xe8, +- 0x60, 0x2d, 0xfb, 0x54, 0x9d, 0xaa, 0x34, 0x25, 0x86, 0x3f, 0xc8, 0x18, +- 0x25, 0xfc, 0xe2, 0x28, 0x56, 0x30, 0xbf, 0xaa, 0x5f, 0xa2, 0xcf, 0x42, +- 0x6d, 0xd0, 0x7b, 0xa6, 0x43, 0xec, 0x2f, 0x45, 0xfb, 0x93, 0x7d, 0xf5, +- 0x75, 0xb8, 0xdb, 0x3d, 0xe7, 0xdd, 0x83, 0xe7, 0x6d, 0xc1, 0x9d, 0x35, +- 0xd8, 0x6f, 0xaf, 0x63, 0xce, 0x25, 0xf1, 0x7a, 0x25, 0x9a, 0x0b, 0x7f, +- 0x17, 0xbf, 0xa7, 0xb0, 0x9a, 0x7c, 0xf6, 0x5f, 0x70, 0x53, 0x21, 0xc7, +- 0x7e, 0x8d, 0xc6, 0xef, 0x2e, 0xec, 0x89, 0xdf, 0x5b, 0xe8, 0xc2, 0x02, +- 0x37, 0xa7, 0x64, 0xfe, 0x55, 0x90, 0x38, 0x77, 0x9c, 0x5c, 0xf8, 0x14, +- 0x96, 0x17, 0x5e, 0xc3, 0xcd, 0x05, 0xc1, 0x0d, 0x89, 0x7f, 0x2f, 0x7a, +- 0x51, 0x2d, 0x71, 0xef, 0x0b, 0xd8, 0xba, 0x3b, 0x85, 0xbe, 0xdd, 0x65, +- 0x8c, 0x6a, 0x0d, 0xee, 0x13, 0x7c, 0x99, 0xf4, 0x95, 0x62, 0xd4, 0xa7, +- 0x68, 0x8f, 0x2a, 0x63, 0xa3, 0xac, 0xd3, 0xaf, 0xa3, 0x2f, 0x6f, 0x24, +- 0x66, 0xca, 0x7a, 0xfc, 0x27, 0x4b, 0xf7, 0x25, 0xd6, 0xcb, 0x5a, 0xbc, +- 0x86, 0x43, 0x79, 0x77, 0x4f, 0x5b, 0xf3, 0xeb, 0xb7, 0xf3, 0x99, 0xd4, +- 0xff, 0x02, 0xd2, 0xbb, 0x57, 0x3b, 0x8f, 0x66, 0x8a, 0xfb, 0x66, 0x47, +- 0xa2, 0x6c, 0x6b, 0x9c, 0xb1, 0x7d, 0x2f, 0xfc, 0xb3, 0x38, 0xb6, 0x89, +- 0x01, 0x58, 0x1e, 0xbd, 0xdb, 0xd9, 0x92, 0xc1, 0xbd, 0xb3, 0x10, 0xc6, +- 0xca, 0x89, 0x0a, 0x24, 0xf7, 0x57, 0xe3, 0xb6, 0x9d, 0x3d, 0xb4, 0x65, +- 0x8b, 0xf6, 0xab, 0x1b, 0x77, 0x2b, 0xd5, 0xb8, 0x99, 0xf7, 0x3e, 0x3d, +- 0x28, 0x6b, 0x58, 0xd1, 0xa3, 0x27, 0x3c, 0xd5, 0xb8, 0x6b, 0xaf, 0x1f, +- 0xb9, 0xdc, 0x4a, 0x24, 0xf7, 0x1e, 0x81, 0x95, 0xa3, 0x4d, 0xee, 0x22, +- 0xce, 0x30, 0xcd, 0x51, 0xcd, 0x1f, 0x63, 0xcf, 0xa8, 0x8a, 0xba, 0x5d, +- 0xb2, 0xfe, 0xa8, 0xe8, 0xa7, 0xa3, 0x05, 0xa4, 0x47, 0xbd, 0x98, 0x95, +- 0xee, 0xc4, 0x04, 0xb1, 0x26, 0x90, 0x4e, 0x22, 0x9f, 0xef, 0x46, 0x8e, +- 0x58, 0x92, 0x1b, 0x0d, 0xa0, 0x26, 0x6d, 0x20, 0xa0, 0xc7, 0xb0, 0x83, +- 0xfe, 0x52, 0x91, 0xd6, 0xb1, 0x2d, 0x7f, 0x23, 0xac, 0xd1, 0x4f, 0x60, +- 0xfb, 0x68, 0x37, 0x2f, 0x13, 0x7d, 0xa3, 0x9f, 0xc7, 0xb2, 0x89, 0xa3, +- 0xe8, 0xcf, 0xa7, 0x68, 0x8f, 0xef, 0x61, 0x7b, 0xee, 0x30, 0x9e, 0xc8, +- 0x6e, 0xc6, 0xd9, 0xc5, 0x87, 0xf1, 0x38, 0x3f, 0x67, 0xb3, 0xfa, 0xc6, +- 0xb0, 0x7a, 0x18, 0x99, 0xdc, 0x26, 0x7c, 0x62, 0x50, 0xc1, 0x4b, 0xb4, +- 0xf5, 0xdb, 0xf7, 0xd2, 0x16, 0x1f, 0xdb, 0x80, 0xae, 0x89, 0xef, 0xc2, +- 0xce, 0x3f, 0x8f, 0x1d, 0xb9, 0x07, 0xd1, 0x9f, 0x59, 0xcf, 0xfc, 0xff, +- 0x19, 0xca, 0x39, 0x48, 0x3f, 0xdf, 0xc8, 0x31, 0x3e, 0xcc, 0xeb, 0xc2, +- 0x1a, 0xe3, 0x85, 0x35, 0x39, 0xfa, 0x7d, 0x46, 0x72, 0xcf, 0x75, 0xc4, +- 0x89, 0x27, 0x6b, 0x65, 0x5d, 0xb2, 0x4a, 0x9f, 0xb9, 0x56, 0x2f, 0xb6, +- 0x1f, 0x76, 0x73, 0xed, 0xaa, 0xb4, 0xe4, 0x75, 0x53, 0x91, 0x2a, 0x72, +- 0x0c, 0x7f, 0x5a, 0x74, 0xd8, 0xe3, 0xf4, 0x66, 0x04, 0x4b, 0x64, 0x3e, +- 0x34, 0xbc, 0x90, 0xff, 0x31, 0xb6, 0x0e, 0xcf, 0xc6, 0xf2, 0x6c, 0x1b, +- 0x39, 0xa5, 0xe3, 0x7c, 0x85, 0xbe, 0x66, 0x93, 0xeb, 0xec, 0x18, 0x4c, +- 0x12, 0x53, 0x66, 0x23, 0x39, 0xa7, 0xc8, 0x4f, 0xc2, 0x69, 0x69, 0xcb, +- 0x57, 0xda, 0xab, 0x9b, 0xba, 0x32, 0xcc, 0x7b, 0x75, 0x69, 0x99, 0xb7, +- 0x88, 0xa1, 0xb9, 0xfb, 0x69, 0x8e, 0xf3, 0x52, 0xb4, 0xcc, 0x95, 0xa6, +- 0xae, 0xac, 0xc3, 0x6c, 0x59, 0x77, 0x4d, 0xc8, 0x39, 0xdf, 0x6f, 0xb5, +- 0x2c, 0xa7, 0xaf, 0x7e, 0x01, 0x03, 0xe3, 0xe5, 0x77, 0x23, 0xff, 0xb3, +- 0xe4, 0xdd, 0xf5, 0x9f, 0x2c, 0xaf, 0xbc, 0x07, 0x2a, 0xe7, 0x8c, 0xcb, +- 0xef, 0x50, 0x8a, 0x2e, 0xaf, 0x90, 0xfd, 0x03, 0xab, 0xb8, 0x4f, 0x0a, +- 0x1c, 0xb1, 0x2b, 0x18, 0x87, 0xd5, 0xa5, 0x64, 0x63, 0x21, 0x1f, 0x2a, +- 0x19, 0x2f, 0x1b, 0xd1, 0x47, 0xbe, 0x7a, 0x93, 0x51, 0x81, 0x03, 0x6d, +- 0x49, 0x39, 0xcf, 0xd7, 0xe3, 0x73, 0x79, 0xea, 0xa6, 0x3f, 0xff, 0x6d, +- 0x9e, 0xba, 0x09, 0xe9, 0x8c, 0x9c, 0x63, 0xeb, 0xc6, 0x4b, 0xf5, 0xf2, +- 0x5e, 0xe7, 0x26, 0xf7, 0x9c, 0x70, 0xd5, 0x42, 0x62, 0x46, 0x5c, 0xc3, +- 0x51, 0xbd, 0x55, 0x6b, 0x50, 0x23, 0x06, 0x94, 0xd7, 0x1d, 0x2b, 0x94, +- 0x44, 0xff, 0xa4, 0x9c, 0xd5, 0xfb, 0xa8, 0x3d, 0x84, 0xb5, 0xd8, 0xfe, +- 0x58, 0x07, 0x8e, 0xaf, 0x96, 0xb5, 0xbc, 0x9f, 0x95, 0xde, 0xdb, 0x93, +- 0x3e, 0x46, 0xea, 0xe4, 0x0c, 0xaa, 0xc8, 0xde, 0x9e, 0x51, 0x19, 0x7b, +- 0xe2, 0x78, 0x3d, 0xe8, 0x8e, 0x37, 0x56, 0x3e, 0x97, 0x59, 0xa9, 0x2f, +- 0x2f, 0x95, 0x5f, 0x50, 0x27, 0xbc, 0x64, 0x5b, 0x66, 0x13, 0xb9, 0xb6, +- 0xf4, 0xe7, 0xd7, 0xce, 0xda, 0x50, 0x03, 0xcb, 0x8e, 0x95, 0x9e, 0x8b, +- 0xad, 0x45, 0x8c, 0x24, 0xe4, 0x9e, 0xd4, 0x11, 0x9d, 0xcd, 0xac, 0xe3, +- 0x41, 0xbd, 0x7e, 0x25, 0x1e, 0xa2, 0x8f, 0xcf, 0xd7, 0x5f, 0x76, 0x36, +- 0xcb, 0x39, 0xcd, 0x85, 0xc1, 0x19, 0x6d, 0x2d, 0x75, 0xfb, 0x52, 0xc9, +- 0xbe, 0x0c, 0x66, 0xe4, 0xbd, 0x81, 0xb3, 0xce, 0xc2, 0x46, 0x79, 0x7e, +- 0x5b, 0x6d, 0x51, 0x7e, 0xb3, 0x7b, 0x0e, 0x7b, 0x4f, 0xa6, 0xdc, 0x6f, +- 0x39, 0xe3, 0x1e, 0x2a, 0xb7, 0x15, 0xbb, 0x30, 0x1e, 0xe9, 0xdb, 0xd7, +- 0x6a, 0x2f, 0xee, 0xf3, 0x9d, 0xb3, 0xca, 0xef, 0x17, 0xcc, 0x73, 0xeb, +- 0x94, 0xdb, 0x94, 0x3e, 0x6e, 0xc2, 0xe3, 0x93, 0x97, 0x8e, 0xf1, 0xee, +- 0x19, 0x63, 0x92, 0x3a, 0x32, 0xae, 0x60, 0xc9, 0x0e, 0x36, 0xb2, 0x8c, +- 0xd4, 0x91, 0x75, 0x82, 0xa0, 0x9b, 0x3f, 0xd4, 0xed, 0x16, 0x79, 0x22, +- 0xc3, 0x71, 0xde, 0x70, 0x63, 0xf2, 0x02, 0xb7, 0xcc, 0xe0, 0xe4, 0x6a, +- 0xfa, 0x91, 0xb3, 0x99, 0xf8, 0xec, 0xbc, 0xd1, 0x11, 0xc6, 0x56, 0x5b, +- 0x74, 0xad, 0x87, 0xc7, 0x88, 0x4d, 0x7d, 0x2e, 0x9f, 0xf1, 0xa1, 0x37, +- 0x57, 0x3e, 0xeb, 0x52, 0x29, 0x7b, 0x21, 0x61, 0xd1, 0x79, 0xaf, 0x41, +- 0x1e, 0x17, 0x5c, 0xa6, 0x79, 0xc9, 0xc5, 0xee, 0xc1, 0x7f, 0xc8, 0xfc, +- 0xc6, 0x7c, 0xa5, 0x75, 0x93, 0x14, 0xed, 0xa8, 0x18, 0x0f, 0x41, 0xfe, +- 0x40, 0x1e, 0x56, 0x3a, 0x43, 0xdf, 0x9b, 0xff, 0x0f, 0x67, 0xca, 0x3d, +- 0x43, 0x7f, 0xe1, 0x2c, 0x4a, 0x2e, 0xe8, 0x38, 0xfb, 0xf8, 0xec, 0xc2, +- 0x79, 0x7a, 0x72, 0x06, 0x5d, 0xce, 0xdd, 0xff, 0x3b, 0xe7, 0x6e, 0x66, +- 0xd9, 0xa9, 0xfa, 0xe2, 0xfb, 0x25, 0x49, 0x75, 0x99, 0x5e, 0xc6, 0x6d, +- 0xd9, 0x27, 0x12, 0xdc, 0x3e, 0x58, 0x57, 0x5c, 0x3f, 0x8e, 0x74, 0x75, +- 0x43, 0xf6, 0xe4, 0xcb, 0x38, 0xa3, 0x1b, 0x8b, 0x94, 0xcd, 0x68, 0x89, +- 0x57, 0xcb, 0xf9, 0xba, 0x88, 0xd7, 0x8c, 0x04, 0xdf, 0x42, 0x34, 0x76, +- 0xd8, 0x3d, 0x43, 0x22, 0xd8, 0xa3, 0xe3, 0x9e, 0xbc, 0x4e, 0x9b, 0x95, +- 0xf7, 0xd2, 0xe5, 0x73, 0xf1, 0xdd, 0xc7, 0x64, 0x5e, 0xb0, 0xba, 0x87, +- 0x58, 0x6d, 0xfd, 0xa5, 0xcf, 0x95, 0x17, 0xe9, 0x19, 0x55, 0x22, 0x5d, +- 0x0f, 0x2a, 0x65, 0x79, 0x81, 0x0f, 0x91, 0x17, 0x63, 0x7d, 0xad, 0xf4, +- 0x2e, 0xb8, 0x4e, 0x19, 0x97, 0x9e, 0x0d, 0x9a, 0x93, 0x92, 0x3c, 0xfa, +- 0x40, 0x89, 0x73, 0x1e, 0xfe, 0xad, 0x3c, 0xfa, 0x43, 0xdb, 0x4c, 0xb2, +- 0xcd, 0xae, 0x6a, 0x25, 0x19, 0x97, 0xf7, 0x80, 0x2a, 0xe3, 0xd1, 0xd8, +- 0x0b, 0x74, 0x72, 0xaf, 0x19, 0x0d, 0x8f, 0xba, 0x67, 0x5d, 0x0c, 0xff, +- 0xf2, 0x7c, 0xd1, 0x7f, 0xac, 0xc9, 0xdf, 0xad, 0x93, 0x1a, 0x5d, 0xef, +- 0x6e, 0x55, 0x92, 0xd7, 0x57, 0x53, 0x4e, 0x2c, 0x0e, 0xad, 0xc2, 0x2c, +- 0xeb, 0x28, 0x1a, 0x7b, 0x8b, 0xf3, 0x79, 0xa8, 0x23, 0x1a, 0x1e, 0x71, +- 0x73, 0x74, 0xd1, 0x8b, 0xe1, 0x2f, 0xce, 0xbd, 0x2e, 0x7c, 0xde, 0xf2, +- 0x31, 0x36, 0x8f, 0xdb, 0x7e, 0x8e, 0xa5, 0x35, 0xb8, 0x1d, 0xf5, 0xb4, +- 0x71, 0x24, 0xfb, 0xda, 0x18, 0x1f, 0x6c, 0x24, 0x3d, 0x57, 0xd5, 0x21, +- 0x45, 0x82, 0xee, 0xd1, 0x53, 0xe4, 0x5c, 0xad, 0xb1, 0x47, 0x68, 0xbf, +- 0xb9, 0x50, 0x24, 0x6c, 0x21, 0x85, 0xe7, 0xec, 0x65, 0x7f, 0xee, 0x81, +- 0x65, 0xd4, 0x70, 0xa2, 0xab, 0xcd, 0xa9, 0x3f, 0xbf, 0x35, 0x1a, 0xd1, +- 0x5e, 0x2c, 0x9d, 0xd5, 0xe9, 0xb5, 0x7f, 0xe1, 0xee, 0x51, 0x79, 0xf4, +- 0xdf, 0x55, 0x46, 0xda, 0xf6, 0x63, 0x2c, 0x9b, 0xc5, 0x96, 0xc7, 0xd8, +- 0x47, 0xdd, 0xc1, 0x32, 0x63, 0x33, 0x96, 0x1b, 0x01, 0xac, 0x0b, 0xb6, +- 0x24, 0xe4, 0x2c, 0xd2, 0x48, 0xae, 0xb8, 0x36, 0x52, 0x5c, 0x0b, 0xef, +- 0xc7, 0xa3, 0x19, 0x37, 0x3e, 0x07, 0xfd, 0x66, 0x52, 0x79, 0x34, 0xdf, +- 0xa9, 0x3c, 0x52, 0x5a, 0x8f, 0xeb, 0xcf, 0xdf, 0x10, 0x44, 0xb5, 0x85, +- 0x13, 0x86, 0xbc, 0x47, 0x29, 0x72, 0x2d, 0x8c, 0x76, 0xfc, 0x21, 0xef, +- 0x53, 0x8a, 0x4e, 0x37, 0xa2, 0x6f, 0xf8, 0x61, 0xf4, 0x0e, 0xbf, 0xe4, +- 0x9e, 0x65, 0xf5, 0xe9, 0x7e, 0xeb, 0x0a, 0x33, 0x72, 0xd0, 0xc2, 0xbc, +- 0x7a, 0x59, 0x13, 0x6e, 0x34, 0x8f, 0xe2, 0xd1, 0xa0, 0xbc, 0x27, 0xd8, +- 0x4f, 0x9e, 0x22, 0xef, 0x9c, 0xad, 0xc1, 0x67, 0x06, 0x64, 0x0e, 0x6b, +- 0xad, 0x4a, 0x33, 0x92, 0x5c, 0xe7, 0xce, 0x61, 0x1b, 0x8e, 0x15, 0x1e, +- 0xc6, 0x1b, 0xbb, 0x36, 0x43, 0x8d, 0x47, 0xc2, 0xb7, 0xc0, 0xd9, 0x7c, +- 0xc4, 0x48, 0x5a, 0x3e, 0x44, 0x0e, 0x78, 0x54, 0xe0, 0xd9, 0x5d, 0x92, +- 0x4f, 0xf7, 0xe0, 0x7a, 0x72, 0x80, 0x3a, 0xdd, 0x59, 0xfa, 0xab, 0xc5, +- 0x91, 0x7e, 0xdd, 0x63, 0xfd, 0xd3, 0x1c, 0x44, 0xb2, 0x09, 0x55, 0xef, +- 0xf9, 0xa4, 0x0a, 0x25, 0x60, 0xca, 0x6f, 0x00, 0x6c, 0xc6, 0x27, 0xda, +- 0x03, 0xd6, 0x2c, 0x33, 0x92, 0x7d, 0x49, 0x89, 0xc4, 0x2c, 0xf5, 0x1b, +- 0x9c, 0xe7, 0x18, 0x5e, 0x24, 0xc7, 0xe9, 0x62, 0x6c, 0x5f, 0x21, 0x31, +- 0xdd, 0xc5, 0xbe, 0xe6, 0x44, 0x95, 0x12, 0xc4, 0x2d, 0x05, 0xe0, 0x50, +- 0x6e, 0x0d, 0x4e, 0xee, 0x32, 0xd0, 0xc9, 0x67, 0x83, 0x19, 0x02, 0x16, +- 0x31, 0x60, 0x83, 0x61, 0xb5, 0xaa, 0xe4, 0x16, 0x3e, 0x15, 0xcb, 0xe6, +- 0x9b, 0xd1, 0xa9, 0xa5, 0x1e, 0x2f, 0x12, 0x05, 0x2f, 0xee, 0x60, 0x99, +- 0xed, 0x8c, 0x0b, 0x9f, 0x4c, 0xfb, 0xc9, 0x6f, 0x9b, 0xf0, 0x33, 0xf2, +- 0xec, 0x9f, 0x92, 0x4f, 0x1f, 0x27, 0x5f, 0x38, 0x9e, 0xaf, 0x46, 0xf7, +- 0x90, 0x4f, 0xce, 0x1f, 0x4d, 0xf9, 0x38, 0x17, 0xb5, 0xed, 0x21, 0x9c, +- 0x1e, 0xf5, 0xe3, 0xf6, 0x5d, 0x91, 0x3d, 0xc7, 0xd5, 0x46, 0xbc, 0x3f, +- 0x5a, 0x8d, 0x95, 0x43, 0x7e, 0xf6, 0xcd, 0xc1, 0x0e, 0xe2, 0xff, 0xbb, +- 0x7c, 0xd6, 0xb9, 0x0b, 0x4a, 0x7e, 0xc9, 0x02, 0xe6, 0x04, 0x3a, 0xeb, +- 0xd7, 0xe0, 0xd6, 0x21, 0xe1, 0x81, 0x2a, 0xde, 0x1e, 0x55, 0xf0, 0x56, +- 0xce, 0xc0, 0x32, 0xb6, 0xd7, 0x97, 0x79, 0xd6, 0xf1, 0xd3, 0xcf, 0xd7, +- 0xe6, 0x0d, 0xdc, 0x9b, 0xd3, 0x19, 0x53, 0x7e, 0xe2, 0x78, 0xf4, 0x76, +- 0xfc, 0x64, 0xa7, 0x7e, 0xf4, 0x75, 0x4f, 0x74, 0x6a, 0x89, 0xa7, 0x1d, +- 0xaf, 0xed, 0x6f, 0xc7, 0xf7, 0x06, 0x97, 0xe2, 0x9a, 0xf6, 0x24, 0xce, +- 0x2c, 0x69, 0xc7, 0xab, 0x7b, 0x75, 0x3c, 0x92, 0xe9, 0x80, 0x36, 0x31, +- 0x45, 0xfe, 0x9b, 0x40, 0xeb, 0x84, 0x09, 0x7d, 0xd0, 0xd9, 0x5c, 0x63, +- 0x6e, 0xc6, 0xa3, 0x86, 0x89, 0x45, 0x7b, 0x45, 0x0f, 0x8e, 0xb3, 0x6e, +- 0x89, 0x89, 0x17, 0xb2, 0x3a, 0xfd, 0xd4, 0xa4, 0x1e, 0x74, 0x3c, 0x9e, +- 0x31, 0x11, 0x7d, 0x4c, 0x9f, 0xde, 0xc7, 0xef, 0x4b, 0xf7, 0x75, 0xa0, +- 0x87, 0xed, 0xdb, 0xc4, 0xeb, 0x3d, 0x13, 0x6d, 0x1c, 0xb3, 0xc1, 0xf1, +- 0x37, 0x5b, 0x3f, 0x53, 0x3a, 0x91, 0x9d, 0xe8, 0x22, 0x9f, 0xdd, 0x4c, +- 0x1e, 0xdb, 0xe5, 0xee, 0xb9, 0x6f, 0xcd, 0x18, 0xb8, 0x35, 0xdd, 0x85, +- 0x27, 0x6d, 0x39, 0x3b, 0xaf, 0x27, 0xae, 0x55, 0xe4, 0x1d, 0xdd, 0x2e, +- 0x8c, 0x51, 0x27, 0xcb, 0x86, 0x56, 0xba, 0xe7, 0x9d, 0x96, 0xef, 0xd2, +- 0xf1, 0x44, 0xe6, 0x13, 0x38, 0x39, 0x6e, 0xa0, 0x3b, 0x2d, 0xfa, 0x96, +- 0xf3, 0x9b, 0x29, 0x1c, 0x61, 0x6c, 0xf9, 0xd9, 0x50, 0xf2, 0x9f, 0x38, +- 0xcd, 0xc7, 0x54, 0xc8, 0x7a, 0x89, 0x8a, 0xab, 0xdb, 0xe5, 0x0c, 0xae, +- 0x87, 0xa8, 0x16, 0xb1, 0xea, 0x54, 0x4b, 0xe3, 0x7d, 0xcb, 0xab, 0x6e, +- 0xc2, 0x67, 0x87, 0xbc, 0xcc, 0x19, 0x54, 0xe6, 0x3a, 0xd6, 0x06, 0xda, +- 0x86, 0x55, 0xab, 0x16, 0xe7, 0xcd, 0xdd, 0x63, 0xd0, 0x3d, 0xd8, 0x61, +- 0x34, 0x77, 0xd7, 0xb0, 0xde, 0x8a, 0x78, 0x24, 0x59, 0xa5, 0x76, 0x30, +- 0x0f, 0x7d, 0x18, 0xeb, 0x76, 0x3d, 0x8c, 0xb5, 0xbc, 0x36, 0xec, 0x72, +- 0x36, 0xdf, 0x6c, 0x28, 0x78, 0x4e, 0x77, 0x36, 0x6f, 0x36, 0x74, 0xce, +- 0xad, 0xcc, 0xeb, 0xc3, 0xd8, 0x38, 0xf6, 0x30, 0x1e, 0xa2, 0x7d, 0x35, +- 0xd0, 0x8f, 0x57, 0xa5, 0x9d, 0xcd, 0xd7, 0xb4, 0xc7, 0xf0, 0x73, 0x37, +- 0xbf, 0x11, 0x7b, 0x3d, 0xe3, 0xe6, 0xdc, 0x39, 0xd5, 0xb5, 0xdd, 0xa0, +- 0x7c, 0xb6, 0xd4, 0x25, 0xc1, 0x72, 0x6c, 0xf9, 0x05, 0xe5, 0xfe, 0x72, +- 0x57, 0x1d, 0x1e, 0x6b, 0x90, 0xf8, 0xe1, 0xb7, 0xaa, 0x4c, 0x28, 0xfa, +- 0x12, 0xe6, 0x71, 0x8f, 0x1d, 0xc1, 0x76, 0xf2, 0xc2, 0x50, 0x5c, 0x72, +- 0xec, 0x56, 0x63, 0x8b, 0x7a, 0x23, 0xb1, 0x5d, 0xc1, 0xa3, 0x0b, 0xb3, +- 0x18, 0xa0, 0xaf, 0xee, 0x58, 0x18, 0x49, 0x0d, 0xc0, 0x74, 0x76, 0xcc, +- 0xe9, 0xff, 0x23, 0xde, 0xa1, 0x2d, 0xef, 0x4b, 0xca, 0x7b, 0xb4, 0x0f, +- 0x63, 0xf3, 0x2e, 0x99, 0xff, 0x87, 0xf1, 0x45, 0xf6, 0x7f, 0xe3, 0xd0, +- 0xc3, 0xf8, 0x1c, 0x6d, 0xa7, 0x7e, 0xf1, 0xa1, 0x2f, 0xd6, 0xa3, 0x25, +- 0x5b, 0x87, 0xa9, 0xfb, 0x1b, 0xe4, 0xbc, 0x2d, 0x31, 0x71, 0x40, 0x79, +- 0x18, 0xf7, 0x8c, 0xd4, 0xd2, 0x17, 0xdd, 0x31, 0x10, 0x8b, 0xcb, 0xf1, +- 0x2a, 0x8c, 0x75, 0xf9, 0xa6, 0x12, 0xae, 0x87, 0xb0, 0xd6, 0x3e, 0xe0, +- 0xfa, 0x7e, 0x85, 0xb9, 0x9a, 0x7e, 0xdf, 0x4d, 0xbf, 0x5f, 0x49, 0xbf, +- 0xef, 0xa2, 0xdf, 0x77, 0xd2, 0xef, 0x93, 0xf4, 0x7b, 0x93, 0x7e, 0x9f, +- 0xa0, 0xdf, 0x77, 0xd0, 0xef, 0x0d, 0xd9, 0x3b, 0x54, 0x8e, 0x76, 0x1c, +- 0x81, 0x6f, 0xd0, 0x4f, 0x1b, 0x2a, 0xbe, 0xd3, 0xb8, 0x9f, 0xf8, 0x73, +- 0xc2, 0x58, 0x14, 0xbe, 0x89, 0xaa, 0x1a, 0x25, 0x46, 0xe4, 0xc6, 0xff, +- 0xce, 0x7d, 0xff, 0x2d, 0x47, 0xdc, 0x7f, 0x91, 0xfa, 0x58, 0x11, 0x6f, +- 0x36, 0x9e, 0x64, 0x0c, 0xfb, 0xa1, 0xde, 0xda, 0x1f, 0x62, 0x99, 0xaf, +- 0x65, 0x5a, 0xb3, 0xb3, 0xa1, 0x5b, 0xed, 0xea, 0x56, 0x60, 0x55, 0x88, +- 0x63, 0x96, 0x73, 0xdd, 0xab, 0xf0, 0xc5, 0xe1, 0x6e, 0xfc, 0xcf, 0xe1, +- 0x20, 0x75, 0xd1, 0x3c, 0x75, 0xa3, 0x07, 0xdf, 0x0c, 0xc3, 0x13, 0x9a, +- 0x0b, 0x7c, 0xd0, 0x88, 0x45, 0x07, 0xe4, 0x5d, 0xec, 0x5c, 0xa3, 0xa7, +- 0x6d, 0x3e, 0xc4, 0x46, 0x40, 0xa4, 0xf6, 0x30, 0xd3, 0x5c, 0xe4, 0xbe, +- 0xaf, 0x99, 0x5c, 0x2d, 0x98, 0x5e, 0x85, 0xad, 0x31, 0x17, 0x67, 0x9f, +- 0x96, 0xf3, 0xe9, 0x8d, 0xc4, 0xa3, 0x80, 0xd9, 0x85, 0x6d, 0x03, 0xd6, +- 0x5d, 0x8d, 0x58, 0x89, 0xfe, 0x81, 0xa2, 0x0e, 0xee, 0x8f, 0x13, 0xf2, +- 0xcc, 0xa8, 0xb6, 0x48, 0x81, 0x77, 0x43, 0x47, 0x02, 0xf7, 0xe6, 0x6d, +- 0x64, 0x39, 0xc6, 0xf5, 0xf4, 0xb3, 0x75, 0xbf, 0xff, 0x3d, 0x7c, 0x7c, +- 0xce, 0xd6, 0x68, 0xff, 0xe7, 0x9c, 0x5c, 0xfd, 0xa2, 0x6c, 0x23, 0xf4, +- 0x8d, 0x77, 0xa8, 0xd7, 0x32, 0x67, 0x8e, 0x1c, 0xe4, 0x23, 0x6b, 0x8e, +- 0x7b, 0x8e, 0xce, 0x8f, 0x05, 0x43, 0x50, 0x46, 0xd3, 0xf2, 0xce, 0xda, +- 0x66, 0xfc, 0x5f, 0xc6, 0x37, 0x5c, 0x5b, 0x9a, 0xf2, 0xc8, 0x99, 0x16, +- 0xb9, 0xef, 0x2c, 0x3d, 0xbb, 0x38, 0x12, 0xd3, 0x3c, 0x3f, 0xa8, 0x93, +- 0xfd, 0x8b, 0xaf, 0x33, 0xce, 0x86, 0x87, 0x96, 0x42, 0x5d, 0xec, 0xc7, +- 0x9d, 0x6d, 0xb3, 0x90, 0x5a, 0x25, 0x3c, 0xd4, 0xdd, 0x5f, 0xa1, 0x3e, +- 0xff, 0x02, 0xf7, 0x19, 0x5f, 0xc1, 0xf1, 0x90, 0x8d, 0x21, 0xe2, 0xd7, +- 0x3a, 0xe3, 0x76, 0xc5, 0xe2, 0x67, 0xe6, 0x44, 0x58, 0x6f, 0x30, 0xd7, +- 0xfa, 0x54, 0x03, 0x1a, 0x76, 0x49, 0x79, 0x91, 0x7b, 0xc6, 0x95, 0xb7, +- 0x3f, 0x23, 0x9f, 0x8b, 0x36, 0x3b, 0xe5, 0xf9, 0x24, 0xd0, 0x20, 0xe7, +- 0x84, 0x15, 0xbc, 0xbd, 0xd0, 0xc6, 0x63, 0x19, 0x7c, 0xb3, 0x0a, 0xcd, +- 0xb9, 0x41, 0xd5, 0xf3, 0xcd, 0xb9, 0x58, 0x64, 0xfc, 0x5a, 0x95, 0xf9, +- 0x48, 0xe2, 0xbe, 0x85, 0x72, 0x1e, 0x4d, 0x3f, 0xf3, 0x3d, 0xfa, 0xd6, +- 0x71, 0xd8, 0xd8, 0x3e, 0xf9, 0x92, 0x33, 0x35, 0x37, 0x84, 0xa7, 0x26, +- 0xa5, 0x6e, 0x37, 0x4e, 0x70, 0x4e, 0xbe, 0xec, 0xee, 0xe7, 0x45, 0x92, +- 0x27, 0x54, 0x79, 0xe7, 0xb0, 0x1b, 0x6f, 0x8d, 0x1a, 0xd8, 0xc7, 0x1c, +- 0xea, 0x57, 0xc3, 0xab, 0xf0, 0xeb, 0xe1, 0x66, 0xed, 0x6f, 0x14, 0x39, +- 0x03, 0xff, 0x71, 0xfc, 0xa8, 0x21, 0x88, 0x83, 0xb4, 0xa1, 0x69, 0xbb, +- 0x0b, 0x6f, 0xdb, 0x56, 0x64, 0x2e, 0x22, 0x7b, 0xbc, 0x9e, 0xc8, 0x01, +- 0x79, 0xcf, 0x79, 0x9d, 0x1a, 0x39, 0xb8, 0x44, 0x89, 0x58, 0x6f, 0xa8, +- 0x2b, 0xf1, 0x8b, 0x7c, 0x17, 0xce, 0xe4, 0x67, 0xda, 0xc2, 0x66, 0x07, +- 0x8d, 0x62, 0x07, 0x62, 0x0f, 0xb4, 0x45, 0xe6, 0x8a, 0xdf, 0x26, 0x8f, +- 0xee, 0xfd, 0x18, 0xed, 0x31, 0x43, 0x7b, 0xcc, 0xd0, 0x1e, 0x89, 0x49, +- 0xcf, 0x10, 0xab, 0xbe, 0x96, 0xa1, 0x3d, 0xd2, 0x7f, 0xbe, 0x42, 0xff, +- 0x29, 0x72, 0xe5, 0x1e, 0x77, 0x4d, 0xff, 0x15, 0xc6, 0x44, 0xfb, 0x31, +- 0x79, 0x7f, 0xb8, 0x79, 0x7d, 0x01, 0x91, 0x9e, 0x01, 0x65, 0x5d, 0xbd, +- 0xbc, 0xcf, 0xf1, 0xf9, 0xa8, 0xf8, 0x80, 0xbc, 0x7b, 0x46, 0xbf, 0x1a, +- 0x3f, 0x55, 0x27, 0xef, 0xb2, 0xee, 0xdf, 0xfd, 0x51, 0x3a, 0xfb, 0x7b, +- 0xf6, 0x43, 0xf4, 0xf5, 0xc7, 0x8e, 0x5d, 0x74, 0xf9, 0x4f, 0xce, 0x8f, +- 0x1a, 0x65, 0xfc, 0xab, 0xf1, 0xf3, 0xe1, 0x4e, 0x9c, 0x65, 0xfc, 0xfd, +- 0x74, 0xfb, 0x94, 0x45, 0x9b, 0xdd, 0x68, 0x78, 0x4c, 0x4c, 0xe6, 0x3b, +- 0x71, 0xda, 0x36, 0x91, 0xb7, 0x9b, 0xd7, 0x7f, 0x57, 0x79, 0x53, 0xcd, +- 0xcd, 0x2b, 0xf2, 0xf9, 0xdf, 0x90, 0x5f, 0x1e, 0x6a, 0x91, 0xf7, 0x5d, +- 0x13, 0x18, 0xc9, 0x8b, 0x9d, 0x06, 0x71, 0xd3, 0x12, 0x43, 0xde, 0x11, +- 0xfb, 0xbd, 0x7f, 0xf7, 0xd9, 0xb2, 0x97, 0x72, 0xce, 0x99, 0x0a, 0xfa, +- 0xad, 0x20, 0x7d, 0xd8, 0xb3, 0x4b, 0x7e, 0x07, 0x40, 0xfc, 0x59, 0xc1, +- 0x67, 0x8c, 0x29, 0xad, 0x06, 0x91, 0xa7, 0x77, 0x33, 0x81, 0x7a, 0x2d, +- 0x2d, 0x67, 0x88, 0x3b, 0xf1, 0x26, 0xcb, 0x57, 0xd1, 0x2f, 0x5e, 0xcb, +- 0x7b, 0xbd, 0x3f, 0x4a, 0xcb, 0x7b, 0xec, 0x2b, 0xf1, 0xa3, 0xfc, 0xcb, +- 0xea, 0x2f, 0x82, 0x06, 0xde, 0x2e, 0xac, 0xc2, 0xfc, 0x5d, 0xb2, 0xbe, +- 0x90, 0xc4, 0x7e, 0x3b, 0x72, 0xf4, 0x59, 0xac, 0xc2, 0xbc, 0xb1, 0xd5, +- 0xcc, 0xa3, 0x15, 0xbc, 0x17, 0x5d, 0x8d, 0x00, 0x3f, 0xd7, 0xee, 0x72, +- 0x9c, 0xc3, 0xf1, 0x3a, 0x67, 0xfb, 0x6a, 0x99, 0x3b, 0xc1, 0x93, 0x65, +- 0xf5, 0xa8, 0x5d, 0x0d, 0x8c, 0x09, 0x57, 0xd1, 0x71, 0xeb, 0xc0, 0x2a, +- 0x5c, 0xb1, 0xab, 0x39, 0x76, 0x2b, 0x9a, 0xb3, 0x47, 0x3c, 0xab, 0xd0, +- 0x30, 0x76, 0x2f, 0xe7, 0x40, 0xca, 0x6a, 0xb4, 0x3f, 0x0b, 0x95, 0xe4, +- 0x84, 0x9d, 0xe9, 0x9f, 0x3a, 0xf3, 0x4d, 0x77, 0x1f, 0x0e, 0xeb, 0x0a, +- 0x3a, 0xe3, 0x5d, 0x35, 0x52, 0x23, 0x4f, 0x38, 0x75, 0xa6, 0x17, 0x6b, +- 0x0b, 0x6d, 0xb8, 0x69, 0xc8, 0x71, 0x4e, 0x2f, 0x49, 0x22, 0x60, 0x06, +- 0x88, 0x61, 0x01, 0x3c, 0x94, 0xae, 0xe1, 0x7f, 0x07, 0x15, 0x8c, 0xc9, +- 0x2d, 0xaa, 0xbe, 0x7e, 0x9e, 0x47, 0xef, 0x29, 0x28, 0x12, 0xf7, 0x03, +- 0x78, 0x80, 0xf1, 0x79, 0x45, 0x3a, 0x8c, 0x54, 0xc1, 0x71, 0x5e, 0xed, +- 0x08, 0xe1, 0x7e, 0xd6, 0xef, 0x4a, 0xf7, 0xa3, 0x97, 0x76, 0x91, 0x1a, +- 0xd3, 0xb5, 0x20, 0xe3, 0xfd, 0xba, 0x82, 0x9f, 0x31, 0xac, 0x01, 0xb7, +- 0xec, 0xd2, 0xf0, 0x50, 0x21, 0xc0, 0xf8, 0xe6, 0x2c, 0x3d, 0x69, 0x58, +- 0x57, 0x7a, 0xa0, 0x63, 0x63, 0x21, 0x84, 0x95, 0xe9, 0xc8, 0xb4, 0xbc, +- 0x47, 0x7d, 0xd6, 0x88, 0xe1, 0xc1, 0x42, 0x18, 0xb7, 0xa5, 0x0f, 0x3d, +- 0x34, 0x1f, 0xd6, 0xff, 0x98, 0x87, 0x36, 0x7c, 0xa6, 0xd0, 0x44, 0xf9, +- 0x91, 0xf5, 0xaf, 0x28, 0x4d, 0xf8, 0xec, 0x98, 0x41, 0xf9, 0x2a, 0x6e, +- 0xa5, 0x9c, 0x9b, 0xd3, 0x57, 0xe0, 0x81, 0xb1, 0x0e, 0xdc, 0x5b, 0x58, +- 0x8c, 0xe5, 0x8c, 0x4f, 0x1b, 0x98, 0x1b, 0xe2, 0xbf, 0x00, 0xb7, 0x0d, +- 0x89, 0xee, 0xa1, 0xbc, 0xda, 0x31, 0xc5, 0x7c, 0xdc, 0x00, 0x0d, 0x91, +- 0xf7, 0x74, 0x72, 0x30, 0x03, 0xb7, 0xed, 0x5d, 0xec, 0xee, 0xc9, 0x37, +- 0xc7, 0x2b, 0x91, 0xea, 0x56, 0xd0, 0x39, 0x24, 0x71, 0x56, 0xb8, 0x8d, +- 0xc1, 0xb8, 0x1a, 0x65, 0x1b, 0x06, 0xe3, 0x6a, 0xf1, 0x7e, 0x6f, 0x46, +- 0xd6, 0x2e, 0x7e, 0x42, 0xbe, 0x14, 0x47, 0xa7, 0x1b, 0xa3, 0xfd, 0xe4, +- 0xd7, 0x16, 0xbc, 0x8c, 0xdd, 0x71, 0xda, 0xf8, 0xd2, 0x76, 0x89, 0xd5, +- 0x3a, 0x06, 0xe8, 0x0f, 0x93, 0x83, 0xfa, 0x86, 0x69, 0xc5, 0x44, 0x61, +- 0xaf, 0xc4, 0xc4, 0x10, 0x1e, 0x4c, 0x9b, 0x38, 0x29, 0xe7, 0xf8, 0xaf, +- 0x4a, 0xae, 0xa8, 0x81, 0x6e, 0x3c, 0x80, 0xa8, 0x75, 0x8c, 0xb1, 0xfd, +- 0x4c, 0xae, 0x01, 0x37, 0xed, 0x92, 0x32, 0xed, 0x78, 0x7d, 0xd4, 0x8b, +- 0x9b, 0xd2, 0x9b, 0xf0, 0x44, 0xd6, 0x83, 0x11, 0xa3, 0xb9, 0x5f, 0x65, +- 0xfc, 0xbc, 0xbe, 0x3d, 0x12, 0xfc, 0x3a, 0xb9, 0xea, 0xf4, 0x62, 0x46, +- 0xe5, 0xb9, 0x1d, 0xe8, 0x64, 0xbf, 0x3a, 0x75, 0xf1, 0x49, 0x0b, 0xf7, +- 0x76, 0x6c, 0xc2, 0xb1, 0xac, 0x6e, 0x3d, 0x29, 0xeb, 0x0c, 0xed, 0x7c, +- 0x3e, 0xc7, 0x8b, 0x3e, 0x5d, 0x38, 0xad, 0x4e, 0xdf, 0x22, 0xeb, 0xd4, +- 0x3b, 0x70, 0x92, 0xf6, 0xda, 0x9f, 0x5b, 0xca, 0xd8, 0x2f, 0x31, 0xdf, +- 0x6f, 0x85, 0x59, 0xaf, 0xee, 0x3a, 0x05, 0x27, 0xf6, 0x09, 0xc7, 0x5a, +- 0x8a, 0xbb, 0xa8, 0xa7, 0xce, 0xb4, 0x8a, 0xeb, 0xc7, 0xd6, 0xe0, 0xf4, +- 0xce, 0x22, 0xe7, 0x7a, 0x35, 0x6e, 0x7d, 0x86, 0x9c, 0xab, 0x67, 0x16, +- 0x39, 0x17, 0xb9, 0x5c, 0xec, 0x41, 0xc5, 0x8b, 0x68, 0x21, 0x41, 0x5e, +- 0x21, 0xfc, 0x22, 0x8c, 0xa7, 0xf2, 0x1d, 0xb8, 0x25, 0xdd, 0x84, 0x71, +- 0xf2, 0xad, 0x1c, 0xf1, 0x22, 0x97, 0x67, 0x5c, 0x19, 0x6d, 0xe4, 0xa5, +- 0xf1, 0x5a, 0xc0, 0x4b, 0x77, 0xef, 0xad, 0xa5, 0x2d, 0x27, 0xbb, 0x25, +- 0x4f, 0x23, 0xff, 0xcd, 0x4b, 0xac, 0x56, 0x98, 0xb7, 0xfe, 0xaf, 0x7a, +- 0xc9, 0x4d, 0x83, 0xba, 0x82, 0xaf, 0x65, 0x35, 0xfc, 0x55, 0xfb, 0x76, +- 0x25, 0xd9, 0xe0, 0xbe, 0x83, 0x4a, 0xdf, 0xb6, 0x70, 0x92, 0x63, 0xba, +- 0x37, 0x2b, 0x76, 0x49, 0x19, 0xcc, 0xd1, 0x8f, 0x19, 0xf5, 0xd0, 0xea, +- 0x35, 0x39, 0xd7, 0xc4, 0xd8, 0xc1, 0xf8, 0x6b, 0xa7, 0xc8, 0xa3, 0x5a, +- 0xbb, 0x5b, 0x55, 0x8f, 0xbc, 0x9f, 0x67, 0x68, 0xaa, 0xf8, 0x58, 0x0a, +- 0x15, 0x69, 0xbf, 0x55, 0x27, 0xf5, 0x97, 0x6c, 0x60, 0x3c, 0x68, 0x5d, +- 0xff, 0xb2, 0xf0, 0xfb, 0x39, 0x11, 0x6d, 0x0a, 0x1b, 0xb0, 0xce, 0xd6, +- 0x19, 0x03, 0xd7, 0x38, 0xbd, 0x9c, 0x87, 0x51, 0x7b, 0x03, 0xee, 0xb2, +- 0x5b, 0xa7, 0x1e, 0xa7, 0x6d, 0xe1, 0xce, 0x0d, 0xe8, 0xe4, 0xb3, 0x91, +- 0x4c, 0xf3, 0x74, 0x2f, 0x75, 0x7d, 0x7c, 0x76, 0xcc, 0x5d, 0xf7, 0x97, +- 0x33, 0xe4, 0xa3, 0xe4, 0xd7, 0x5f, 0xcd, 0xb4, 0x26, 0x87, 0xd4, 0x1e, +- 0x05, 0x73, 0x24, 0x97, 0x4c, 0x90, 0x53, 0x05, 0xf0, 0x99, 0xb4, 0x45, +- 0x1f, 0x00, 0x6d, 0xae, 0x83, 0x79, 0xc5, 0x13, 0x4e, 0xbd, 0x19, 0x35, +- 0x44, 0x3f, 0xeb, 0x0b, 0x4b, 0xf1, 0x14, 0x63, 0x6f, 0xf3, 0xb5, 0x7a, +- 0xf0, 0x39, 0x68, 0xf0, 0x99, 0x3f, 0x75, 0x1a, 0xcc, 0x1a, 0x3c, 0x30, +- 0x12, 0x4d, 0xdc, 0xc4, 0x38, 0xdb, 0x79, 0xad, 0x7e, 0xf4, 0x14, 0x63, +- 0xe0, 0x7c, 0xd3, 0x96, 0xf3, 0x26, 0xe4, 0x3b, 0x01, 0xd7, 0xce, 0x4f, +- 0xdb, 0xe2, 0x27, 0x3a, 0x71, 0x33, 0x84, 0xcf, 0xd1, 0xce, 0xdf, 0xb7, +- 0x63, 0x98, 0x24, 0xdf, 0xf8, 0x2c, 0xfd, 0xe3, 0x8c, 0x1d, 0x49, 0x5d, +- 0xa3, 0xea, 0xd8, 0x40, 0xff, 0x78, 0xd7, 0x4e, 0xd0, 0x77, 0x3e, 0xc6, +- 0xab, 0x8d, 0xfe, 0x10, 0x63, 0x1d, 0x8d, 0x7e, 0x10, 0x72, 0xcf, 0x95, +- 0x8e, 0x65, 0x9a, 0xbb, 0x1f, 0x42, 0x73, 0xec, 0x66, 0xa5, 0x8e, 0x79, +- 0x6a, 0x10, 0xf7, 0x14, 0x6e, 0xc0, 0x89, 0x6c, 0x64, 0x9a, 0x39, 0xf9, +- 0xc6, 0xa5, 0x0a, 0xee, 0x20, 0x67, 0x5b, 0x5f, 0xad, 0xb4, 0x4e, 0x3d, +- 0xa5, 0x44, 0x68, 0x93, 0x8c, 0x97, 0xf4, 0xcf, 0xcf, 0xb2, 0xcc, 0x99, +- 0x6c, 0x35, 0x36, 0x8c, 0xd8, 0xe8, 0xcf, 0x54, 0xa0, 0x6a, 0xa7, 0x1f, +- 0xf7, 0x8f, 0xe9, 0xc8, 0x64, 0x64, 0x1d, 0xd9, 0x6f, 0xd5, 0x12, 0x37, +- 0x46, 0x89, 0x0d, 0x2f, 0x2d, 0x01, 0xa6, 0xf7, 0xae, 0xc1, 0x81, 0x9d, +- 0x3a, 0xe3, 0x5d, 0xd1, 0x3e, 0x82, 0x71, 0x97, 0x93, 0xa7, 0x84, 0x93, +- 0x57, 0x99, 0x12, 0xfb, 0xa2, 0x3d, 0x8f, 0x50, 0x07, 0xb7, 0x15, 0xc4, +- 0xee, 0x12, 0x9c, 0xa3, 0x30, 0x06, 0x69, 0x23, 0xfb, 0xec, 0x26, 0xe6, +- 0xe6, 0x01, 0x58, 0xb4, 0x11, 0x4b, 0xde, 0x53, 0xa5, 0x8d, 0x58, 0xb4, +- 0x11, 0x8b, 0x36, 0x62, 0xd1, 0x46, 0xac, 0xfc, 0x52, 0xe6, 0x4c, 0x3a, +- 0xc6, 0xd9, 0xe6, 0xb6, 0x51, 0x72, 0xf7, 0xa0, 0xd8, 0x4a, 0x0c, 0x5f, +- 0xcf, 0xf4, 0x2b, 0xda, 0x9d, 0x37, 0x60, 0x24, 0x7b, 0x23, 0x2f, 0x05, +- 0xb7, 0xd2, 0x56, 0x1e, 0xcd, 0x89, 0xed, 0xe9, 0xee, 0xef, 0xd3, 0x3c, +- 0x9b, 0xdf, 0x33, 0x1b, 0xd5, 0xe2, 0x03, 0x8c, 0x45, 0xee, 0x7d, 0x39, +- 0x73, 0xec, 0xc7, 0x68, 0xfe, 0x82, 0x5f, 0x7c, 0x4f, 0xce, 0xab, 0xb4, +- 0xcb, 0x6f, 0xc5, 0x74, 0x30, 0x0f, 0x90, 0x73, 0xee, 0x32, 0x4e, 0x19, +- 0x57, 0x71, 0x4c, 0x55, 0x83, 0x9b, 0xf0, 0xf5, 0x41, 0x9d, 0xb1, 0xca, +- 0xc0, 0x93, 0x39, 0x89, 0xe5, 0xe2, 0xdf, 0x32, 0x0f, 0xe2, 0xeb, 0x1e, +- 0xd4, 0xb4, 0x7b, 0x11, 0x70, 0xfd, 0xbc, 0x39, 0xbc, 0x43, 0xb1, 0xe9, +- 0x3b, 0xba, 0x9c, 0x03, 0x9d, 0x0a, 0xeb, 0x0d, 0x38, 0xbd, 0xbb, 0x1d, +- 0xff, 0x6d, 0xa7, 0x87, 0x3c, 0xc0, 0x59, 0xfa, 0x52, 0x5c, 0x4f, 0x4e, +- 0x2b, 0xd1, 0xd8, 0x2c, 0xa5, 0x1d, 0xf7, 0x90, 0xfb, 0x6f, 0x18, 0x8c, +- 0x74, 0x33, 0x66, 0x1b, 0xb7, 0x28, 0x4b, 0x51, 0xc5, 0x1c, 0xa0, 0x8d, +- 0x39, 0xc0, 0x83, 0xc4, 0x80, 0xaf, 0x66, 0xbc, 0x68, 0x59, 0x2c, 0xbf, +- 0x4d, 0xa6, 0xbb, 0x6b, 0x3b, 0x2f, 0x90, 0xa3, 0xce, 0x37, 0x3b, 0xe4, +- 0x2c, 0x8e, 0x72, 0xf6, 0xba, 0x29, 0x24, 0x28, 0x7f, 0xcc, 0xcd, 0x2f, +- 0x12, 0x38, 0x98, 0x27, 0x6e, 0x70, 0xdc, 0xaf, 0xb4, 0xfd, 0x84, 0xf9, +- 0xb0, 0x70, 0x7b, 0x13, 0x13, 0x39, 0x97, 0xff, 0x47, 0xea, 0x88, 0x19, +- 0xd9, 0x41, 0xbd, 0xcb, 0xaf, 0x9a, 0x78, 0x64, 0xaf, 0xf8, 0xb0, 0x89, +- 0xf6, 0x21, 0x3d, 0x7c, 0x9b, 0x1a, 0x0d, 0xae, 0xe3, 0xb3, 0x05, 0x9c, +- 0xcf, 0xc7, 0x33, 0x32, 0x8f, 0x1a, 0x5a, 0x18, 0x9b, 0xdf, 0x9c, 0xd0, +- 0xb1, 0x88, 0x71, 0xfa, 0x9d, 0x89, 0x18, 0x96, 0x32, 0x66, 0x3b, 0xcc, +- 0x1f, 0x12, 0x19, 0xf1, 0x45, 0xf2, 0x81, 0x09, 0x8d, 0x71, 0x56, 0xd6, +- 0x87, 0x9e, 0xc0, 0xd8, 0x6a, 0x0d, 0xfb, 0xdc, 0xf3, 0x7c, 0x7e, 0xab, +- 0x81, 0x58, 0xd9, 0x39, 0xe0, 0xc7, 0xa7, 0x87, 0x36, 0xe3, 0xf5, 0xc5, +- 0xc2, 0x95, 0xd6, 0x38, 0xa2, 0x9f, 0xc7, 0x29, 0x73, 0x8c, 0xbc, 0x78, +- 0x94, 0x79, 0xd7, 0xc2, 0x7d, 0x6b, 0xf0, 0xc9, 0x5d, 0x17, 0xf2, 0xb4, +- 0x33, 0x71, 0xeb, 0x6e, 0xda, 0xc4, 0xfa, 0x00, 0x6d, 0xa2, 0x96, 0x36, +- 0x61, 0x67, 0xa2, 0xc9, 0x02, 0x6d, 0x22, 0x46, 0xdc, 0xc8, 0x0e, 0x48, +- 0x39, 0xf7, 0x9d, 0x99, 0xbb, 0xe4, 0xdd, 0x65, 0x83, 0xbe, 0xb3, 0x75, +- 0xc0, 0xd9, 0xec, 0x65, 0xbc, 0x79, 0xa4, 0xa3, 0x89, 0xd8, 0x72, 0x23, +- 0xf6, 0x0c, 0x36, 0xa1, 0x85, 0x31, 0x63, 0x61, 0x1a, 0x77, 0x84, 0xa1, +- 0xce, 0x0f, 0x23, 0xb2, 0xe1, 0x1d, 0x44, 0xa7, 0xef, 0x56, 0x5a, 0x8f, +- 0xbe, 0xa8, 0x44, 0x36, 0xfe, 0x84, 0x36, 0x7c, 0x56, 0x91, 0xb6, 0x9b, +- 0x70, 0x35, 0xfd, 0xe4, 0x2a, 0xfa, 0x84, 0xc6, 0x5c, 0x52, 0x63, 0xdd, +- 0xfe, 0x41, 0x1f, 0xe6, 0x33, 0xd7, 0x93, 0xb3, 0xca, 0xb1, 0x31, 0x2f, +- 0xb2, 0x3b, 0xf5, 0xa9, 0x47, 0xd0, 0x08, 0x63, 0xec, 0x46, 0x6c, 0x1d, +- 0xd4, 0x10, 0xe5, 0xbd, 0xbe, 0x9d, 0x0b, 0xd0, 0x4c, 0xfb, 0xd6, 0xe8, +- 0xa7, 0xbd, 0x83, 0x2a, 0x16, 0x8c, 0xdd, 0x80, 0x1d, 0x83, 0x0a, 0xee, +- 0x8b, 0x2a, 0x68, 0x19, 0x91, 0x1c, 0x2c, 0x86, 0xa7, 0x32, 0xc2, 0x15, +- 0xa1, 0xb4, 0x5c, 0x4b, 0x8e, 0x4c, 0xee, 0xf9, 0x93, 0x9c, 0xcc, 0xb9, +- 0xe8, 0x53, 0x7e, 0x53, 0xa6, 0x1d, 0x9f, 0xdb, 0xd9, 0x80, 0xab, 0x76, +- 0xeb, 0xd6, 0x69, 0xc5, 0x59, 0x7a, 0x80, 0x7c, 0xde, 0xaf, 0x16, 0xe7, +- 0xfc, 0xc1, 0xc1, 0x67, 0x19, 0x2f, 0x7e, 0xe2, 0x04, 0xf5, 0xa5, 0xe8, +- 0x8b, 0x27, 0xb1, 0xb6, 0xa3, 0x1d, 0x6b, 0xf7, 0x8a, 0xbe, 0x1c, 0xe6, +- 0x87, 0xcc, 0xfd, 0x26, 0xa7, 0xf0, 0x0e, 0xfd, 0x77, 0x11, 0x39, 0xed, +- 0x52, 0xc6, 0x89, 0x37, 0x16, 0x9b, 0xd4, 0x9f, 0xee, 0x9e, 0xf5, 0x9b, +- 0x67, 0x9a, 0xa8, 0x1d, 0xd4, 0x19, 0x67, 0x4c, 0xcc, 0xda, 0x2b, 0xed, +- 0x99, 0xb8, 0x67, 0x50, 0x4f, 0x3d, 0xcd, 0xb9, 0x14, 0xbb, 0x11, 0xcc, +- 0xae, 0x61, 0xec, 0x3f, 0x39, 0x29, 0x38, 0xd5, 0x89, 0x13, 0xcc, 0x03, +- 0xde, 0x7c, 0x2c, 0xda, 0xfd, 0x33, 0xe6, 0x74, 0xef, 0x50, 0x46, 0x96, +- 0xfd, 0x1b, 0xe0, 0xbc, 0x56, 0xa4, 0xf5, 0x8d, 0xff, 0x8c, 0x28, 0xfd, +- 0xbb, 0x0b, 0xb5, 0xd4, 0xc9, 0x81, 0xc1, 0x95, 0xf0, 0xd3, 0x16, 0x1e, +- 0xc9, 0x88, 0xdd, 0x10, 0xbf, 0x77, 0x7e, 0x02, 0x5b, 0xf7, 0x17, 0xf3, +- 0xbc, 0x7b, 0x06, 0x36, 0xd1, 0xc6, 0x85, 0xb3, 0xc7, 0x68, 0xef, 0x98, +- 0xe7, 0x43, 0xb2, 0x9e, 0x18, 0x91, 0x58, 0x4e, 0xcc, 0x7c, 0xd4, 0x20, +- 0xae, 0xd6, 0x47, 0xc2, 0x2d, 0xaa, 0x95, 0x60, 0x5e, 0x17, 0xbe, 0x0f, +- 0xd2, 0xbe, 0x85, 0x75, 0x4b, 0x36, 0x61, 0x4f, 0xd6, 0x8b, 0xaa, 0xc5, +- 0x1e, 0xe2, 0xb1, 0x60, 0x94, 0x15, 0x94, 0xe7, 0x6b, 0x21, 0x7e, 0x22, +- 0xf3, 0xeb, 0xc1, 0x99, 0x78, 0xf3, 0x86, 0xac, 0xfc, 0x96, 0x05, 0x73, +- 0xbe, 0xcf, 0xa2, 0x83, 0x73, 0x2f, 0xfe, 0x98, 0xc0, 0x3d, 0x63, 0xc2, +- 0xd5, 0xc8, 0xe7, 0x6c, 0x3f, 0xfe, 0x3a, 0x2b, 0x9c, 0x6e, 0x33, 0xee, +- 0x69, 0x2f, 0xe7, 0x6e, 0x62, 0x77, 0xad, 0xd3, 0x1e, 0x34, 0x93, 0x93, +- 0xe9, 0xb9, 0xac, 0x1a, 0xb1, 0x52, 0x88, 0xf4, 0xa7, 0x20, 0x71, 0xa2, +- 0xd5, 0xe2, 0x0c, 0x53, 0x36, 0xb9, 0xa5, 0xed, 0x41, 0x1d, 0x7d, 0x5c, +- 0x7e, 0x44, 0xae, 0x9d, 0xf6, 0xf3, 0xac, 0x5d, 0x0d, 0xcd, 0xb5, 0x75, +- 0x2f, 0x96, 0x16, 0x2c, 0xe2, 0xed, 0x52, 0xb4, 0x3d, 0x16, 0xc0, 0x35, +- 0xe4, 0x26, 0x57, 0xa7, 0x9f, 0x70, 0x66, 0x11, 0x7b, 0xdb, 0x46, 0xa2, +- 0xc1, 0x23, 0xe4, 0x81, 0x07, 0x96, 0xfc, 0xd4, 0xf1, 0x98, 0xae, 0x5f, +- 0x68, 0xf4, 0x00, 0xe7, 0x33, 0x1d, 0xfa, 0xd4, 0x0e, 0x04, 0x90, 0x20, +- 0x7e, 0x5e, 0x99, 0x69, 0x40, 0xfb, 0xee, 0x7e, 0xce, 0x7f, 0x10, 0x57, +- 0xf2, 0xfb, 0x62, 0xc6, 0x37, 0x8d, 0xd8, 0xaa, 0xc9, 0xe7, 0x82, 0xd8, +- 0x4b, 0x98, 0x7e, 0xe4, 0x2c, 0xbd, 0xb3, 0xdd, 0xba, 0x63, 0x36, 0xf5, +- 0xd5, 0x42, 0x5c, 0x5e, 0x9a, 0x89, 0x6c, 0xbc, 0x59, 0x51, 0xb0, 0xb2, +- 0xdd, 0x60, 0xdb, 0x01, 0xc4, 0x32, 0xb2, 0x36, 0x70, 0xe8, 0xa1, 0x3a, +- 0x58, 0xad, 0x01, 0xda, 0xe9, 0x11, 0x45, 0xd6, 0x35, 0x44, 0x6f, 0x4d, +- 0xb8, 0x8a, 0x7c, 0x44, 0x23, 0x66, 0xc7, 0x0a, 0xa2, 0x43, 0x60, 0x6d, +- 0x6e, 0x0d, 0xf6, 0x0c, 0x8b, 0x7f, 0x0a, 0x76, 0x3a, 0x4e, 0xe5, 0xe2, +- 0xa8, 0xf1, 0x36, 0x75, 0xf8, 0xc6, 0x84, 0x60, 0x90, 0x82, 0x79, 0xb4, +- 0x63, 0x55, 0x97, 0x58, 0x2b, 0xb8, 0x15, 0xa6, 0xdf, 0x76, 0xe0, 0xd3, +- 0x8c, 0x6d, 0xd5, 0x9c, 0x83, 0x55, 0x4b, 0x9a, 0xe8, 0xbf, 0xc4, 0xc9, +- 0x89, 0x20, 0xaf, 0x10, 0x8e, 0xef, 0x6f, 0xe4, 0xa5, 0xf1, 0x5a, 0xc0, +- 0x4b, 0xe7, 0x3d, 0x15, 0x67, 0xf6, 0x93, 0x33, 0xed, 0x15, 0x0e, 0x22, +- 0x3e, 0xe8, 0xc7, 0xd3, 0x13, 0x20, 0x8f, 0x31, 0xc8, 0x43, 0x04, 0xff, +- 0x64, 0x9e, 0x98, 0xc7, 0x0c, 0xc6, 0x11, 0x1d, 0x29, 0x72, 0x8e, 0x93, +- 0xc3, 0x7a, 0xcf, 0x5a, 0x44, 0xb5, 0xbf, 0x26, 0x7e, 0x9d, 0x1a, 0x6d, +- 0xc7, 0x74, 0x96, 0xb8, 0xb5, 0xb8, 0x1d, 0x6f, 0xe7, 0x36, 0xd1, 0xff, +- 0x55, 0x9c, 0x25, 0x66, 0x69, 0x73, 0x05, 0xd7, 0x05, 0x43, 0xfd, 0xb4, +- 0xd7, 0x0e, 0x59, 0x03, 0x55, 0xe2, 0xc4, 0xac, 0x6b, 0xd2, 0xcf, 0x3a, +- 0xb5, 0x3a, 0x73, 0x2a, 0x35, 0x81, 0x0c, 0x31, 0xcb, 0xce, 0xca, 0x7c, +- 0x6d, 0xc6, 0x56, 0xe2, 0xd5, 0xd6, 0x9c, 0xd8, 0x37, 0x6d, 0x7a, 0x50, +- 0x0f, 0x16, 0x68, 0xdb, 0xea, 0x5e, 0x91, 0x61, 0xa2, 0x8f, 0xb1, 0xfd, +- 0x33, 0x1d, 0x26, 0x76, 0xe4, 0x24, 0x0e, 0x0a, 0x07, 0xd3, 0x98, 0x97, +- 0x24, 0xd1, 0x43, 0x9c, 0x7a, 0xdb, 0xee, 0xc4, 0x0a, 0xe2, 0xd4, 0x2f, +- 0x98, 0xa7, 0xdc, 0x49, 0x9c, 0x7a, 0xc3, 0x2e, 0xe2, 0xd4, 0xcd, 0x13, +- 0x62, 0x0b, 0x45, 0x5e, 0x7e, 0xc2, 0x6e, 0x6b, 0x90, 0xdf, 0x39, 0xab, +- 0x36, 0x7f, 0x57, 0x5c, 0x58, 0x85, 0x97, 0x86, 0xcb, 0x7b, 0xc5, 0x91, +- 0xe4, 0xed, 0xe4, 0xcc, 0x47, 0x47, 0xcb, 0x9c, 0xf7, 0xb8, 0x9b, 0x5b, +- 0xcf, 0x32, 0xcb, 0xfb, 0x96, 0xe5, 0xfd, 0x06, 0x0b, 0x5f, 0x5d, 0x22, +- 0x3c, 0x53, 0xd6, 0x81, 0x2a, 0xc8, 0x27, 0xbb, 0x31, 0xbe, 0xf3, 0x3d, +- 0x3c, 0x32, 0xa8, 0xde, 0x5c, 0xc3, 0xd8, 0x7a, 0x8b, 0xb2, 0x19, 0x9e, +- 0xb8, 0xbc, 0x47, 0x2a, 0x6b, 0xe5, 0xcc, 0x5d, 0x26, 0xb3, 0xe8, 0xdb, +- 0x57, 0x83, 0x43, 0x41, 0xc7, 0x79, 0xda, 0x98, 0x27, 0x3f, 0x13, 0x20, +- 0xb8, 0x19, 0xa8, 0xa0, 0x2f, 0xdc, 0xfc, 0x5b, 0xbf, 0xdd, 0x58, 0xde, +- 0x3b, 0xd8, 0x88, 0xbb, 0x76, 0x3d, 0x8c, 0x9e, 0x5d, 0x7f, 0x8b, 0x4f, +- 0x0e, 0x2d, 0xec, 0x9f, 0xe7, 0x71, 0x9c, 0xab, 0xdb, 0xa7, 0x70, 0x2a, +- 0xce, 0xd8, 0x18, 0x52, 0xf0, 0xbd, 0xab, 0x16, 0x8a, 0x1c, 0xfe, 0xbd, +- 0xef, 0x68, 0xae, 0xbc, 0x5b, 0x4b, 0x3e, 0x92, 0x98, 0xc3, 0xf1, 0x53, +- 0xf6, 0x8a, 0xfa, 0xd2, 0xbb, 0xc2, 0x7f, 0x40, 0x5b, 0x3f, 0x16, 0x19, +- 0xfc, 0x2b, 0xcb, 0x78, 0xcd, 0x49, 0xae, 0x96, 0x7a, 0x15, 0xa5, 0x36, +- 0xfe, 0x96, 0x9c, 0x90, 0xbc, 0xd0, 0xe0, 0xff, 0x91, 0xeb, 0x44, 0x3e, +- 0x9f, 0x95, 0xe5, 0xbf, 0xe4, 0x24, 0xbb, 0xe5, 0xbb, 0x94, 0x59, 0xc7, +- 0x67, 0x52, 0xae, 0xfc, 0xec, 0xf9, 0x92, 0x9c, 0x4a, 0x68, 0x0d, 0x45, +- 0x39, 0x9f, 0xa6, 0x9c, 0x33, 0x8b, 0x93, 0x50, 0xaf, 0x9d, 0x29, 0xab, +- 0xdc, 0xee, 0xff, 0x3a, 0x2f, 0xab, 0x58, 0xee, 0x6f, 0xe6, 0xc8, 0xbe, +- 0x80, 0x7a, 0xed, 0xcc, 0x75, 0xf2, 0x0a, 0xfa, 0x6f, 0x34, 0xb8, 0xd5, +- 0x5d, 0x9f, 0x36, 0xb0, 0xf6, 0xe2, 0x1c, 0x4b, 0xb0, 0x03, 0xe3, 0x76, +- 0xb0, 0x94, 0x53, 0xc9, 0x2d, 0x13, 0x5f, 0x66, 0xce, 0xf6, 0x94, 0x1d, +- 0xe9, 0x5a, 0xa7, 0xb4, 0x26, 0x17, 0x31, 0xce, 0xa0, 0x5e, 0xd6, 0xb0, +- 0x13, 0xee, 0xef, 0xf9, 0xe5, 0xa3, 0x09, 0xe4, 0x69, 0x8f, 0xaf, 0xd8, +- 0x91, 0x0d, 0xa7, 0xdc, 0xfd, 0x3b, 0x13, 0x2f, 0xe7, 0x5f, 0x2d, 0xed, +- 0x33, 0x95, 0x7f, 0x4f, 0x6c, 0xe6, 0x1a, 0xaa, 0xcc, 0xbf, 0x9c, 0xb1, +- 0x6e, 0x90, 0xb5, 0x0a, 0xcb, 0xa2, 0x9f, 0xf7, 0x66, 0xac, 0xb0, 0x8a, +- 0xeb, 0x90, 0x0a, 0xc9, 0xbe, 0xc4, 0xd6, 0xd2, 0x6f, 0x52, 0xb1, 0xde, +- 0xef, 0x58, 0x13, 0x02, 0x8c, 0xd2, 0x39, 0xb6, 0x18, 0xac, 0xc9, 0x2b, +- 0xc8, 0xc5, 0x64, 0xbd, 0x01, 0xd6, 0x6c, 0x53, 0x43, 0x48, 0x3f, 0xcc, +- 0x71, 0xfb, 0x30, 0x87, 0xf9, 0x54, 0x7c, 0x61, 0x6b, 0x77, 0xbb, 0x3a, +- 0x57, 0x70, 0x36, 0x98, 0x54, 0x63, 0x12, 0x07, 0x50, 0x99, 0x96, 0xb3, +- 0x26, 0x56, 0x97, 0x9f, 0x98, 0xba, 0x98, 0xd8, 0x52, 0x11, 0x85, 0xf7, +- 0xbe, 0xbc, 0x17, 0xc1, 0x85, 0xbf, 0x70, 0x7e, 0x18, 0x8a, 0x61, 0xdb, +- 0x64, 0xb9, 0x0f, 0x06, 0xfe, 0x7b, 0xe1, 0xd2, 0x8c, 0xb3, 0x2c, 0xf3, +- 0x3d, 0x27, 0x39, 0x47, 0xda, 0x2e, 0xca, 0xfd, 0xe8, 0xbe, 0x4a, 0x1f, +- 0xa5, 0xaf, 0xcd, 0x1a, 0x51, 0x15, 0x5b, 0x8d, 0x89, 0x39, 0xf2, 0x9b, +- 0x3f, 0xf7, 0xb8, 0x67, 0xd3, 0x65, 0x0e, 0xe4, 0xfd, 0xf1, 0x04, 0xee, +- 0x93, 0xf7, 0x30, 0x19, 0xb3, 0xee, 0xcd, 0xbb, 0xef, 0x77, 0x42, 0x7e, +- 0x17, 0xf1, 0xde, 0x7c, 0x51, 0x7f, 0x0f, 0xe5, 0x03, 0xe4, 0xdd, 0x01, +- 0xcb, 0x6b, 0x6e, 0x80, 0x4f, 0x97, 0x33, 0x67, 0x65, 0x5d, 0xfe, 0xdf, +- 0x73, 0x24, 0x97, 0xff, 0x2a, 0xfd, 0xc9, 0xbb, 0x50, 0x3e, 0x5b, 0xf2, +- 0xae, 0xa2, 0x52, 0xfc, 0x7c, 0xc6, 0x7d, 0xef, 0x5d, 0x35, 0xd7, 0xd1, +- 0x2f, 0x67, 0xbb, 0xef, 0xeb, 0x89, 0x7e, 0x42, 0xa6, 0xe5, 0xcc, 0xd6, +- 0x03, 0xb4, 0x91, 0xde, 0x39, 0xa5, 0x77, 0x0f, 0xba, 0xee, 0x20, 0x8e, +- 0x2c, 0x22, 0xb7, 0x5a, 0xac, 0x44, 0xb4, 0x55, 0x4a, 0x37, 0xeb, 0x51, +- 0x4f, 0x05, 0x91, 0xa1, 0xb8, 0xbf, 0xbd, 0xeb, 0xa3, 0x8c, 0xfd, 0x76, +- 0xab, 0xe6, 0x53, 0x7f, 0x5e, 0x3a, 0x7b, 0x2d, 0x7b, 0xf1, 0x29, 0x3c, +- 0x6f, 0xcf, 0xc1, 0xd4, 0x6f, 0xc9, 0x3d, 0xbf, 0x66, 0xfd, 0x4f, 0x41, +- 0x62, 0x88, 0x4f, 0x8f, 0x6c, 0x8c, 0x7b, 0x22, 0xeb, 0xa7, 0xe9, 0xd3, +- 0x85, 0xb8, 0x9e, 0xfa, 0x1a, 0xdb, 0xf8, 0x3e, 0xb9, 0x85, 0x3d, 0x43, +- 0x7e, 0x51, 0x56, 0x6b, 0x4f, 0x85, 0x7a, 0xc6, 0x29, 0xbe, 0x77, 0x2d, +- 0xbf, 0xfb, 0xbb, 0x06, 0xc1, 0xb4, 0xe5, 0x84, 0x28, 0x73, 0xbe, 0x19, +- 0xd9, 0x53, 0xaf, 0xea, 0xd9, 0xcf, 0xab, 0x9b, 0xb1, 0x56, 0x8e, 0x7c, +- 0x98, 0x11, 0xed, 0xd3, 0xb4, 0x8f, 0x76, 0x57, 0x46, 0x32, 0x56, 0x81, +- 0x8f, 0x3a, 0xd3, 0xc6, 0xf1, 0x41, 0xd6, 0x28, 0x59, 0xce, 0xdd, 0xe3, +- 0x97, 0xf7, 0x77, 0x98, 0x63, 0xdb, 0xf2, 0xbb, 0xa6, 0x6e, 0x33, 0xa5, +- 0x7d, 0x24, 0xe6, 0xc8, 0x8c, 0x97, 0xf7, 0xc8, 0x6f, 0xc8, 0x55, 0x07, +- 0x70, 0xaf, 0x2d, 0xeb, 0x0e, 0xff, 0x3f, 0x45, 0x18, 0xff, 0x64, 0x3c, +- 0x59, 0x00, 0x00, 0x00 }; ++ 0xc5, 0xbc, 0x7f, 0x74, 0x53, 0xe7, 0x95, 0x2e, 0xfc, 0x9c, 0x23, 0xc9, ++ 0x96, 0x6d, 0xd9, 0x3e, 0x36, 0xc2, 0x11, 0x89, 0x1b, 0x24, 0x7c, 0x64, ++ 0x14, 0xec, 0xa4, 0x47, 0xc6, 0x24, 0xa2, 0x3d, 0x09, 0xaa, 0x31, 0xc4, ++ 0x49, 0x48, 0x6a, 0x08, 0x4d, 0x0d, 0x37, 0xeb, 0x46, 0x17, 0x48, 0x42, ++ 0x52, 0x3a, 0x97, 0x74, 0x32, 0xfd, 0xdc, 0x7c, 0xf4, 0xf3, 0x29, 0x06, ++ 0xec, 0x80, 0x2c, 0xd9, 0x8e, 0xf9, 0x91, 0x75, 0xb3, 0x26, 0x02, 0x0c, ++ 0x26, 0xa9, 0x24, 0x27, 0x6d, 0x66, 0x86, 0xae, 0xdb, 0x4e, 0x3c, 0x04, ++ 0x12, 0x68, 0x9a, 0x5f, 0x9d, 0xce, 0x6d, 0xda, 0x75, 0x67, 0xea, 0x21, ++ 0x81, 0x90, 0x9f, 0xa5, 0x69, 0x6f, 0x2f, 0x4c, 0x87, 0x9e, 0xef, 0xd9, ++ 0x47, 0x16, 0x38, 0x34, 0x6d, 0xe7, 0xae, 0xef, 0x8f, 0xcf, 0x6b, 0x69, ++ 0x59, 0xe7, 0x9c, 0xf7, 0xc7, 0x7e, 0xf7, 0xbb, 0xf7, 0xb3, 0x9f, 0xfd, ++ 0xbe, 0xef, 0xd1, 0x1c, 0xa0, 0x1c, 0x53, 0x7f, 0x95, 0xfc, 0x5c, 0xb7, ++ 0x60, 0xe3, 0xda, 0xfb, 0x8d, 0xeb, 0x0c, 0xb9, 0x76, 0x03, 0x1e, 0x7c, ++ 0xda, 0x9f, 0x89, 0xd8, 0xe5, 0xb7, 0x82, 0x9f, 0x5a, 0xf0, 0x8f, 0xfc, ++ 0xc5, 0x10, 0x52, 0xf8, 0xaf, 0xe9, 0xb2, 0xdb, 0x2e, 0x40, 0x2b, 0xca, ++ 0x21, 0x1f, 0x78, 0x55, 0xf3, 0x68, 0x57, 0x9b, 0x0e, 0xaf, 0xcb, 0xfc, ++ 0xcd, 0xea, 0xb5, 0x3a, 0x10, 0xcf, 0x36, 0x05, 0x17, 0xe3, 0x82, 0x6d, ++ 0xf9, 0xdd, 0x90, 0xfb, 0x9f, 0x31, 0xff, 0xfd, 0xc9, 0x1f, 0xdc, 0x10, ++ 0x3a, 0x9b, 0x71, 0xc1, 0xab, 0x99, 0xfd, 0xd0, 0x1a, 0xe1, 0xad, 0x67, ++ 0x9d, 0x27, 0xe6, 0xa6, 0x54, 0x54, 0x15, 0xdb, 0x0a, 0x05, 0x32, 0x08, ++ 0x69, 0x16, 0x42, 0x11, 0x0b, 0x48, 0xb8, 0x4d, 0x24, 0x4a, 0x4d, 0x2f, ++ 0x4a, 0xf4, 0x12, 0x24, 0xb4, 0xee, 0xe0, 0x96, 0x56, 0xa0, 0x2d, 0xe9, ++ 0x0d, 0x9e, 0xcc, 0x02, 0x6b, 0x93, 0x5e, 0x4c, 0xba, 0x7c, 0xc1, 0xb7, ++ 0xb2, 0x5f, 0xa9, 0x2a, 0xe8, 0x25, 0x0e, 0x97, 0x8e, 0x84, 0x6a, 0xca, ++ 0x7d, 0x04, 0x17, 0x67, 0xa5, 0x2e, 0xb0, 0x2d, 0xfd, 0x70, 0xf0, 0x54, ++ 0x32, 0xa4, 0x6d, 0x43, 0x53, 0x60, 0x1f, 0x4a, 0x91, 0xf0, 0x87, 0x22, ++ 0x40, 0xe6, 0xc2, 0xf6, 0xb4, 0x02, 0x8f, 0x3e, 0x03, 0xed, 0x7b, 0x81, ++ 0x47, 0xd3, 0xa1, 0xb8, 0xce, 0x61, 0xf6, 0x8f, 0x4b, 0xdd, 0x90, 0x96, ++ 0xe1, 0xf3, 0x2d, 0x69, 0x60, 0x6b, 0x7a, 0x06, 0xb6, 0x0d, 0xda, 0x78, ++ 0xc1, 0x68, 0xd0, 0xf6, 0xb3, 0x87, 0xcd, 0xce, 0xf3, 0x19, 0xb0, 0x32, ++ 0xf2, 0xfc, 0x8c, 0xfd, 0x83, 0xb9, 0x1a, 0x9e, 0x19, 0xf7, 0xe3, 0xf9, ++ 0xf1, 0x1a, 0x3c, 0x3a, 0x58, 0x83, 0xbe, 0xc1, 0x08, 0x54, 0xdd, 0x46, ++ 0x24, 0x1a, 0x41, 0xc9, 0x42, 0x1b, 0x6f, 0x19, 0xcd, 0xd8, 0xca, 0x86, ++ 0x5f, 0x6f, 0xae, 0xc3, 0x1a, 0xad, 0x1e, 0x5b, 0xf4, 0x85, 0x28, 0x8c, ++ 0x35, 0x73, 0x21, 0x9d, 0x46, 0xc2, 0x63, 0xba, 0x55, 0x55, 0xbf, 0x09, ++ 0x1f, 0xed, 0x34, 0xf1, 0xe1, 0x4e, 0xdc, 0x5d, 0x05, 0xdb, 0xce, 0x46, ++ 0xc3, 0x9d, 0x1b, 0x14, 0x2d, 0xf8, 0x74, 0x96, 0x02, 0xad, 0x70, 0xb3, ++ 0x3d, 0x04, 0xf7, 0x65, 0xa7, 0xeb, 0x9e, 0xfd, 0xa5, 0xd9, 0x6f, 0x5a, ++ 0x64, 0x09, 0xe0, 0x07, 0x73, 0x1f, 0xa2, 0x5d, 0x14, 0xc6, 0xb4, 0x35, ++ 0xfd, 0x26, 0x65, 0x0a, 0x52, 0x9e, 0x7a, 0x7c, 0x77, 0x3c, 0x80, 0xef, ++ 0x50, 0xb6, 0x67, 0xc7, 0x45, 0xc6, 0xd0, 0x1e, 0x0b, 0x35, 0x18, 0x1d, ++ 0xac, 0xc7, 0x33, 0x7a, 0x33, 0x9e, 0xa5, 0x8c, 0xbd, 0x46, 0x04, 0x6b, ++ 0x62, 0xff, 0x89, 0xf2, 0x28, 0x58, 0xd1, 0xbc, 0x76, 0x4a, 0xae, 0x50, ++ 0x10, 0xaa, 0x8a, 0x78, 0x6d, 0x28, 0x12, 0x54, 0xa5, 0xcd, 0x4b, 0xf2, ++ 0x0e, 0xa4, 0x61, 0x79, 0x4d, 0x91, 0xf9, 0x26, 0x64, 0x29, 0xef, 0xb7, ++ 0x77, 0x86, 0x8d, 0xf5, 0x2a, 0x96, 0xf9, 0x28, 0xf3, 0x83, 0xd1, 0x70, ++ 0x6c, 0x1e, 0x65, 0x1e, 0xcb, 0xaa, 0x1c, 0x8f, 0x3f, 0x78, 0x90, 0xb2, ++ 0xc7, 0x57, 0xa8, 0x94, 0x9d, 0xb2, 0xa4, 0x29, 0x4b, 0x9a, 0xb2, 0xa4, ++ 0x29, 0x8b, 0x23, 0x77, 0x84, 0x32, 0x17, 0xe6, 0x68, 0x5f, 0x76, 0x92, ++ 0xf2, 0x4e, 0x97, 0xb3, 0x9e, 0xb2, 0x23, 0x51, 0x63, 0x3e, 0x1c, 0x6c, ++ 0x48, 0x51, 0xdf, 0x69, 0xdb, 0x7e, 0xdd, 0xb0, 0xed, 0x8f, 0x0d, 0x1f, ++ 0xf5, 0x97, 0xa6, 0x1d, 0x14, 0xe5, 0x99, 0x6d, 0x95, 0x98, 0x68, 0xa7, ++ 0x09, 0xda, 0xc7, 0x5a, 0xc3, 0xb1, 0x5a, 0x45, 0x85, 0x5b, 0xd7, 0x82, ++ 0x73, 0xf3, 0x21, 0x7a, 0x83, 0x3f, 0x18, 0xce, 0x23, 0xa8, 0xe7, 0xd9, ++ 0xd6, 0x27, 0xfa, 0x0d, 0x69, 0x13, 0x90, 0x7e, 0x83, 0xec, 0x7f, 0x72, ++ 0x6a, 0xee, 0xa4, 0xfd, 0x00, 0xfb, 0x94, 0xfe, 0xa5, 0x6d, 0xdb, 0xfe, ++ 0x95, 0x01, 0x5d, 0x43, 0xd8, 0x1a, 0xa2, 0xfd, 0xb9, 0x4c, 0x2d, 0xb8, ++ 0x31, 0xcb, 0xe7, 0x17, 0xdb, 0x28, 0xcc, 0xc7, 0x9a, 0x6c, 0x70, 0x6a, ++ 0x0c, 0x21, 0x8a, 0x20, 0x76, 0x10, 0x48, 0x54, 0x98, 0x9a, 0xc8, 0xde, ++ 0xf9, 0x5f, 0x07, 0x7a, 0xec, 0x80, 0xfe, 0x90, 0xe5, 0x6b, 0xd5, 0x37, ++ 0x9e, 0x53, 0x7c, 0xb1, 0x57, 0x16, 0x44, 0x51, 0xae, 0xc3, 0x2a, 0x33, ++ 0xd1, 0xf9, 0xd5, 0x5c, 0x39, 0x75, 0xf8, 0xfd, 0x3b, 0x37, 0xe4, 0xbc, ++ 0x98, 0x97, 0xfb, 0x27, 0x37, 0xaa, 0x0c, 0xda, 0xdc, 0x63, 0xee, 0xc2, ++ 0x98, 0x3a, 0xa6, 0xc6, 0xe6, 0xd8, 0xbc, 0xf7, 0x54, 0xf2, 0xac, 0x5d, ++ 0xa2, 0x97, 0x7d, 0xd9, 0x65, 0xea, 0xc1, 0x83, 0xc0, 0xd9, 0x35, 0xad, ++ 0x9d, 0xd8, 0xac, 0x29, 0x98, 0xa5, 0xc7, 0x60, 0x8d, 0x5f, 0xa8, 0x28, ++ 0x94, 0xad, 0x4b, 0x50, 0x0f, 0x38, 0x9a, 0xf4, 0xb3, 0x4e, 0x06, 0xa7, ++ 0x92, 0xb6, 0xcd, 0xf2, 0x5a, 0x2f, 0xee, 0xbc, 0x73, 0xb6, 0x79, 0x64, ++ 0xb6, 0x07, 0x37, 0xe2, 0x1e, 0x0d, 0x9b, 0x8e, 0xb5, 0x7e, 0xac, 0xec, ++ 0x1b, 0xe9, 0x84, 0x35, 0xe6, 0x42, 0x5c, 0x4b, 0xf0, 0xff, 0xd5, 0x57, ++ 0xdf, 0x16, 0xeb, 0xc4, 0x8e, 0xb1, 0x73, 0xbc, 0xef, 0xe6, 0xbd, 0x18, ++ 0x06, 0xd2, 0x57, 0x5f, 0xbd, 0x2c, 0x96, 0x40, 0x72, 0x4c, 0xbe, 0xbb, ++ 0x91, 0xa9, 0x49, 0x60, 0xcb, 0xee, 0x20, 0xaa, 0xf4, 0x4e, 0xa4, 0xc6, ++ 0xe4, 0xfb, 0xb7, 0x90, 0x6e, 0x56, 0x30, 0xb9, 0xdc, 0xa2, 0xae, 0x3b, ++ 0xb1, 0x75, 0xb7, 0xe2, 0x3e, 0xcc, 0x6b, 0xdc, 0x09, 0xb7, 0xc7, 0xf1, ++ 0xbb, 0x98, 0x7b, 0x71, 0xd2, 0xd4, 0x66, 0xe9, 0xb6, 0xdd, 0x63, 0xb8, ++ 0x70, 0x7e, 0x86, 0x6d, 0xf7, 0x19, 0xd5, 0x98, 0xec, 0xec, 0xe4, 0xbc, ++ 0xad, 0x81, 0xb5, 0x7f, 0x0d, 0xfa, 0x1f, 0xa3, 0xba, 0x96, 0xb3, 0xad, ++ 0x31, 0x91, 0x21, 0xc1, 0x36, 0xa8, 0xb3, 0xb4, 0xc8, 0xd5, 0xc5, 0xcf, ++ 0xd7, 0xf9, 0x81, 0x57, 0x31, 0x2d, 0x84, 0xb3, 0x45, 0xdb, 0x5e, 0x83, ++ 0x6d, 0x4e, 0xbd, 0xdf, 0xd8, 0xf8, 0x52, 0xa1, 0xce, 0x96, 0x31, 0xf6, ++ 0x3d, 0x26, 0xf5, 0xa4, 0xfe, 0x1f, 0xab, 0x67, 0x75, 0xba, 0x10, 0xea, ++ 0x58, 0xaa, 0xb8, 0x11, 0x19, 0x00, 0x75, 0x54, 0xad, 0x88, 0x8f, 0x94, ++ 0x28, 0x2e, 0xfe, 0x8f, 0xe1, 0x71, 0xce, 0x7b, 0xaf, 0x41, 0xdd, 0xa7, ++ 0x9b, 0xd1, 0x97, 0x8e, 0x87, 0x88, 0x66, 0x96, 0xc7, 0xec, 0x84, 0x6a, ++ 0x86, 0x3b, 0x36, 0x43, 0xca, 0x43, 0x29, 0x37, 0xe1, 0xce, 0xb6, 0x4e, ++ 0x7a, 0x5f, 0x49, 0xea, 0x5d, 0x4f, 0x2b, 0x1e, 0x1a, 0xa5, 0xe8, 0x7b, ++ 0xd2, 0xfb, 0x5a, 0x52, 0xc1, 0x3b, 0x7a, 0x78, 0xe3, 0x7b, 0xca, 0xa4, ++ 0xf7, 0xd5, 0xac, 0x86, 0x59, 0x03, 0xa1, 0x2e, 0x4b, 0x89, 0xe1, 0x7b, ++ 0x59, 0x3f, 0x02, 0x03, 0x26, 0x0e, 0x67, 0x0d, 0x3c, 0xf5, 0x09, 0x7f, ++ 0xfd, 0xd4, 0x3f, 0xcb, 0xc5, 0x79, 0x5b, 0x97, 0x0c, 0x62, 0xb3, 0x71, ++ 0xc1, 0x8e, 0x6b, 0x48, 0x54, 0x9b, 0x93, 0xde, 0x0f, 0x07, 0xa0, 0x54, ++ 0x99, 0x7a, 0x20, 0xaf, 0xfc, 0xab, 0x9d, 0xf0, 0x4b, 0x31, 0xca, 0xe7, ++ 0x60, 0x8e, 0x89, 0x1d, 0xe3, 0x06, 0xf1, 0xe8, 0xac, 0x5d, 0x41, 0x5b, ++ 0x2a, 0x31, 0xaf, 0xc4, 0xd8, 0x88, 0x8e, 0xa7, 0x38, 0xdf, 0x1f, 0x18, ++ 0x13, 0x31, 0x1f, 0xf4, 0xce, 0xf7, 0x11, 0x8a, 0xcf, 0x53, 0x4c, 0x1c, ++ 0xcf, 0xea, 0x18, 0x4d, 0x9a, 0x78, 0x21, 0xd9, 0x40, 0x3b, 0x98, 0x8f, ++ 0x78, 0x40, 0xda, 0x09, 0x22, 0x47, 0xb9, 0xf7, 0x85, 0x3b, 0x51, 0x6d, ++ 0xc6, 0x70, 0x84, 0x72, 0x7f, 0xb4, 0x40, 0xda, 0x31, 0xf0, 0xea, 0x7f, ++ 0x40, 0x56, 0xe2, 0x30, 0x1e, 0xa7, 0xac, 0xb1, 0xf9, 0x17, 0x6c, 0xcc, ++ 0xf0, 0xe2, 0xa4, 0x71, 0x05, 0x6d, 0x46, 0x6c, 0xda, 0xeb, 0xee, 0x4f, ++ 0x6a, 0x38, 0x94, 0xf5, 0xb9, 0x7b, 0x93, 0x7e, 0xec, 0xa7, 0x5f, 0xcc, ++ 0x32, 0x61, 0x05, 0xd8, 0xee, 0x2c, 0xe2, 0x4f, 0x7e, 0xa4, 0x1e, 0xe3, ++ 0x23, 0x21, 0xe3, 0x35, 0x25, 0x80, 0x83, 0xa3, 0x57, 0x22, 0x37, 0xa2, ++ 0x60, 0x2c, 0x4c, 0xd9, 0xf9, 0xfd, 0xdb, 0x23, 0x57, 0x23, 0x3b, 0xe2, ++ 0xc2, 0x0e, 0x47, 0xaf, 0x0e, 0x1e, 0x4c, 0xfd, 0xbf, 0x12, 0x99, 0x51, ++ 0xb8, 0xe7, 0x0d, 0x68, 0x78, 0x3a, 0xeb, 0x76, 0xeb, 0x03, 0x7e, 0x8c, ++ 0x66, 0x9f, 0xe6, 0xbc, 0x49, 0xdb, 0x41, 0xec, 0x4b, 0x0e, 0xf3, 0xbb, ++ 0x8c, 0xc3, 0x52, 0x0a, 0xb8, 0x5f, 0xc0, 0xe1, 0xe7, 0xc7, 0x8f, 0x2a, ++ 0x05, 0x9f, 0x30, 0x88, 0xe7, 0x62, 0x1f, 0xa2, 0xe3, 0x72, 0x04, 0x0f, ++ 0x94, 0x23, 0xb2, 0xd3, 0x8d, 0xb9, 0x3b, 0xc5, 0x2e, 0x6c, 0xdb, 0x13, ++ 0xad, 0xc6, 0x69, 0x03, 0x33, 0x4b, 0x10, 0x0e, 0xee, 0x73, 0xfa, 0xb3, ++ 0xb0, 0x2e, 0x0b, 0xaf, 0x87, 0x6d, 0x1f, 0x48, 0xba, 0xd1, 0xfb, 0x09, ++ 0x5c, 0xd7, 0xb0, 0x5f, 0x0b, 0x31, 0x14, 0x29, 0xb4, 0x79, 0xb7, 0xe1, ++ 0x56, 0xc5, 0x17, 0x75, 0xed, 0x05, 0x94, 0xa0, 0xbd, 0x53, 0x61, 0x0c, ++ 0xb3, 0x02, 0x1a, 0x46, 0x2f, 0xf4, 0xcd, 0x2d, 0x87, 0xe5, 0x0f, 0x05, ++ 0xee, 0x87, 0xdc, 0x53, 0x51, 0x76, 0xdd, 0xaf, 0xed, 0xe0, 0x97, 0xa4, ++ 0x2d, 0x37, 0xb6, 0x8e, 0x5f, 0x8e, 0xd7, 0xc0, 0xfa, 0xa4, 0xd8, 0x9b, ++ 0x4e, 0xbd, 0xbd, 0xa8, 0x08, 0xfe, 0x4a, 0x2c, 0x2c, 0xf4, 0xff, 0x3e, ++ 0xc7, 0x24, 0xf5, 0x25, 0x36, 0xb9, 0x03, 0x5b, 0xa9, 0x10, 0x37, 0xef, ++ 0x6f, 0x49, 0x1e, 0xa7, 0x4c, 0xad, 0x94, 0x47, 0x7c, 0xdb, 0xc0, 0xdf, ++ 0x8f, 0x37, 0xe3, 0xef, 0xc6, 0x23, 0xf8, 0xdb, 0x71, 0x1d, 0x7f, 0x33, ++ 0x1e, 0xc4, 0x73, 0x9f, 0xc0, 0xfb, 0x15, 0x9c, 0x1b, 0x91, 0xdf, 0xc0, ++ 0x96, 0x74, 0x09, 0xfa, 0x46, 0xca, 0xd1, 0x3f, 0xd2, 0x60, 0x9c, 0x21, ++ 0x4e, 0xff, 0x0f, 0x63, 0x19, 0x26, 0x6a, 0x5b, 0x1d, 0x5c, 0xdc, 0xc1, ++ 0xfb, 0xc9, 0x91, 0x06, 0xc6, 0x1a, 0xdb, 0x6e, 0x8b, 0x36, 0x75, 0x1c, ++ 0x21, 0xee, 0x07, 0x67, 0x86, 0x82, 0x13, 0x6a, 0x28, 0x18, 0x27, 0x99, ++ 0x48, 0x37, 0xab, 0x98, 0x9c, 0x19, 0xca, 0xd0, 0xdb, 0xe1, 0xd7, 0xef, ++ 0xa4, 0x9c, 0xa1, 0xa0, 0xa5, 0x1a, 0xf4, 0x17, 0xc6, 0x12, 0xb5, 0x95, ++ 0x18, 0x54, 0x8e, 0xb3, 0x23, 0xa1, 0x7e, 0x4b, 0xa5, 0xff, 0xd6, 0xda, ++ 0x76, 0x6d, 0x0b, 0x36, 0x5e, 0x61, 0x22, 0x3e, 0x93, 0x31, 0xe2, 0x6a, ++ 0xd3, 0xc4, 0xe3, 0x8c, 0x9f, 0xb1, 0xb4, 0x1e, 0xb8, 0xc2, 0xb5, 0x02, ++ 0x7f, 0xa5, 0x35, 0x9d, 0xdb, 0xaf, 0xc6, 0x30, 0x79, 0x05, 0x82, 0xaa, ++ 0x79, 0x2b, 0xb1, 0x5c, 0xe6, 0x89, 0xe3, 0xd6, 0x5b, 0xa9, 0x23, 0x56, ++ 0xf0, 0x37, 0x6c, 0x1c, 0x52, 0x1b, 0x02, 0x06, 0xfb, 0xee, 0x54, 0x6d, ++ 0xfb, 0x21, 0xe3, 0x97, 0x76, 0xb0, 0xce, 0xb6, 0x87, 0x0d, 0xe9, 0x2f, ++ 0x88, 0x5a, 0xda, 0x54, 0x0d, 0x6d, 0xaa, 0x25, 0x5f, 0x8e, 0x0f, 0x46, ++ 0x60, 0x5d, 0x61, 0x86, 0xba, 0x36, 0xa8, 0xe5, 0x78, 0x7f, 0xb4, 0x1c, ++ 0xef, 0x11, 0xbf, 0xde, 0x1d, 0xb1, 0xed, 0x25, 0x9c, 0xd7, 0x48, 0x14, ++ 0x0b, 0xbc, 0x08, 0x9f, 0x3d, 0x08, 0x0b, 0xbf, 0x67, 0xd9, 0xdf, 0x8c, ++ 0x04, 0xf0, 0xbf, 0x46, 0x3e, 0x8f, 0xe7, 0x6a, 0xe3, 0x35, 0x33, 0x18, ++ 0x37, 0xdf, 0xa6, 0xad, 0x9e, 0x4b, 0x86, 0x36, 0x6e, 0x46, 0xe8, 0x38, ++ 0x39, 0x8d, 0x75, 0x44, 0x09, 0x75, 0xcf, 0x72, 0x85, 0xd6, 0x9f, 0x55, ++ 0xfc, 0xf8, 0x88, 0x3e, 0xf1, 0x61, 0xb6, 0x21, 0xf6, 0x8f, 0xec, 0xff, ++ 0xb7, 0xc6, 0xdf, 0xd9, 0x13, 0x75, 0xa2, 0x3f, 0xd1, 0x15, 0xf5, 0x4d, ++ 0x9c, 0xf8, 0x3b, 0xc6, 0xad, 0xbf, 0x4d, 0x53, 0xdf, 0x94, 0xe7, 0xb9, ++ 0x3f, 0x88, 0x69, 0x32, 0xb7, 0x31, 0xce, 0x6d, 0x3d, 0xfe, 0x1f, 0x67, ++ 0x6c, 0x27, 0xec, 0xff, 0xcb, 0x2f, 0xe3, 0x1b, 0x98, 0x59, 0xb0, 0x49, ++ 0x19, 0xe7, 0x71, 0x3b, 0xd1, 0x29, 0x63, 0x94, 0xb1, 0x3a, 0x7a, 0x5c, ++ 0xff, 0xba, 0xd2, 0xad, 0xa2, 0xdc, 0xb6, 0xbf, 0x1b, 0x9d, 0x7a, 0xee, ++ 0x2f, 0x8e, 0xf5, 0x0b, 0xbc, 0x2f, 0xe3, 0xfd, 0xbd, 0x4b, 0xf4, 0x1e, ++ 0x54, 0x17, 0xf0, 0x3a, 0x64, 0xc5, 0x21, 0xdf, 0x67, 0x7a, 0x79, 0x2f, ++ 0x12, 0xbf, 0x78, 0xef, 0x47, 0x95, 0x9f, 0x2c, 0x63, 0x4d, 0xf9, 0xc1, ++ 0x6a, 0x5e, 0xcb, 0x78, 0x5e, 0xa7, 0xed, 0xfc, 0x31, 0x5b, 0x69, 0x76, ++ 0x6c, 0xfc, 0x99, 0xf1, 0xd3, 0x12, 0x7b, 0xac, 0x5a, 0xd3, 0x6b, 0xa9, ++ 0x26, 0x82, 0x84, 0x1b, 0xe2, 0xe9, 0x46, 0x04, 0xb3, 0x16, 0xee, 0x6a, ++ 0x75, 0xe1, 0xe1, 0x56, 0x05, 0x33, 0xf5, 0x8d, 0x58, 0x7e, 0xbd, 0x65, ++ 0xcf, 0xd0, 0x9f, 0x52, 0xc5, 0xef, 0x1a, 0x19, 0x9f, 0x03, 0x29, 0x05, ++ 0xd5, 0x9f, 0x57, 0x70, 0x32, 0xaa, 0xd3, 0xe6, 0xb6, 0x90, 0x6b, 0x01, ++ 0x73, 0x53, 0xf0, 0x56, 0x72, 0xfe, 0x73, 0x03, 0xf0, 0x96, 0x13, 0x6b, ++ 0x6e, 0x1d, 0x68, 0xd8, 0x78, 0x9a, 0xd8, 0x94, 0x57, 0x42, 0x5d, 0xd4, ++ 0xb9, 0x51, 0xa5, 0x84, 0x3a, 0x6e, 0x53, 0x42, 0xc1, 0x46, 0x45, 0xfa, ++ 0x30, 0x11, 0xc9, 0x6e, 0x21, 0xc6, 0xc9, 0xf7, 0x18, 0xf4, 0xec, 0x4f, ++ 0x45, 0x76, 0x4b, 0x33, 0xc5, 0x1f, 0x36, 0xd2, 0x1f, 0x4e, 0xdb, 0x19, ++ 0x2d, 0x14, 0xcc, 0x40, 0xae, 0xd7, 0xf3, 0x1a, 0xde, 0x12, 0x73, 0x03, ++ 0x5e, 0x4c, 0x1a, 0x53, 0x7a, 0x2d, 0xca, 0x39, 0x5d, 0x96, 0x7f, 0xb1, ++ 0xe3, 0xfe, 0x82, 0x2c, 0x4d, 0xa9, 0x2d, 0x48, 0xa6, 0xe1, 0x2d, 0x65, ++ 0x3f, 0xef, 0xb0, 0x6e, 0x19, 0xfb, 0xb8, 0x66, 0x40, 0x6c, 0x3e, 0x14, ++ 0x79, 0x8f, 0x5c, 0x73, 0x8e, 0xd2, 0x14, 0x7c, 0x1a, 0xa1, 0x73, 0xeb, ++ 0x50, 0x90, 0x25, 0x9c, 0x75, 0x38, 0x8e, 0x23, 0xcb, 0xa2, 0x2c, 0x94, ++ 0x59, 0x03, 0xf0, 0xb9, 0xf4, 0x32, 0x34, 0xcc, 0x70, 0xfa, 0x52, 0x2a, ++ 0x07, 0x2c, 0x63, 0xdf, 0xb5, 0xf3, 0x10, 0x5f, 0xe9, 0x60, 0xa2, 0x52, ++ 0x35, 0xf0, 0xad, 0xe8, 0xf1, 0x6b, 0x1b, 0x41, 0x6a, 0xe5, 0x5c, 0x57, ++ 0xa7, 0xdc, 0x78, 0xab, 0x86, 0x1c, 0x8a, 0x65, 0x03, 0xa9, 0x6f, 0xd9, ++ 0xda, 0x5c, 0x1b, 0xee, 0x16, 0x28, 0xab, 0x52, 0xbf, 0xe3, 0xb8, 0x74, ++ 0xac, 0xca, 0x17, 0xca, 0x6d, 0x4b, 0xba, 0x30, 0xe1, 0x2f, 0x70, 0xb9, ++ 0xcc, 0x5d, 0x88, 0xcb, 0xbd, 0xde, 0x24, 0x94, 0x27, 0x93, 0xa1, 0x43, ++ 0x80, 0x1e, 0xf9, 0x4b, 0xc4, 0xff, 0xc1, 0x83, 0x1e, 0x9c, 0x9f, 0x1f, ++ 0xb6, 0x66, 0xb9, 0xc2, 0xdd, 0x7e, 0xd5, 0xf0, 0xa6, 0x29, 0x4f, 0x8a, ++ 0x65, 0x06, 0xf8, 0x39, 0x1e, 0xd6, 0xb5, 0x19, 0x4a, 0x7c, 0x95, 0xca, ++ 0x32, 0x05, 0xbe, 0x18, 0x8e, 0xad, 0x54, 0x0c, 0x6f, 0x5f, 0x56, 0xda, ++ 0x8a, 0x29, 0xed, 0xf9, 0x7d, 0xea, 0x54, 0xae, 0xc0, 0x76, 0x83, 0x98, ++ 0x4d, 0x1e, 0xd6, 0x4b, 0x1d, 0x1d, 0x1b, 0xb6, 0xb1, 0xdf, 0xf0, 0xa2, ++ 0x47, 0xeb, 0x44, 0x99, 0xfe, 0xcf, 0xf6, 0x03, 0x53, 0xe3, 0xd8, 0x92, ++ 0xec, 0xf0, 0x17, 0xf4, 0xf9, 0xb1, 0xd4, 0x73, 0xee, 0x6d, 0x4d, 0xbe, ++ 0x54, 0x8a, 0x2a, 0x89, 0xf5, 0xc5, 0x7b, 0x4d, 0xda, 0x28, 0x7d, 0x56, ++ 0xf4, 0x11, 0xd7, 0x84, 0x67, 0xc5, 0x23, 0x1e, 0xc8, 0x3d, 0x17, 0x32, ++ 0xee, 0x78, 0xc0, 0x85, 0x7f, 0xb7, 0xe3, 0x2b, 0xe5, 0x5e, 0x39, 0x12, ++ 0x9d, 0x4d, 0x01, 0x37, 0x9a, 0x62, 0x5b, 0x89, 0x1d, 0x93, 0x2b, 0xdb, ++ 0xf8, 0x2c, 0x6c, 0xbc, 0x80, 0x86, 0xe0, 0x56, 0xc8, 0xf7, 0xf3, 0xb4, ++ 0xf3, 0x36, 0xa9, 0xcb, 0x32, 0x05, 0x0e, 0xf5, 0x02, 0xb1, 0x69, 0x8b, ++ 0x61, 0xe3, 0x45, 0x03, 0x56, 0xa9, 0x79, 0x58, 0x39, 0x99, 0xfc, 0xbd, ++ 0x1d, 0x77, 0x63, 0x19, 0x31, 0xda, 0x20, 0x7d, 0x0e, 0x7a, 0xcd, 0x70, ++ 0x90, 0x0e, 0xab, 0xb9, 0x88, 0xf9, 0x93, 0xd9, 0x2d, 0xca, 0xa9, 0x6c, ++ 0xbf, 0xf2, 0xb6, 0x13, 0xeb, 0x0f, 0x2b, 0x6f, 0x65, 0x25, 0x5e, 0xd7, ++ 0x07, 0x8f, 0x91, 0x2f, 0x91, 0x9b, 0xa9, 0xbd, 0x06, 0xf5, 0x6b, 0x54, ++ 0x31, 0x5f, 0xd0, 0x23, 0xfb, 0x28, 0xef, 0x81, 0x56, 0x18, 0x7d, 0x86, ++ 0x07, 0x93, 0x1a, 0x7c, 0xbd, 0x86, 0x5b, 0xae, 0x99, 0x57, 0x48, 0xdd, ++ 0xfa, 0xe0, 0xd6, 0xec, 0x05, 0x3b, 0xa1, 0x15, 0xae, 0x0f, 0xb4, 0x16, ++ 0xef, 0xfd, 0xda, 0x9e, 0x58, 0xa9, 0xf2, 0xfa, 0x8b, 0x2e, 0x0e, 0x85, ++ 0x75, 0xa7, 0xc7, 0x03, 0xe1, 0x66, 0x2a, 0xf9, 0x0c, 0x27, 0x9c, 0x71, ++ 0x21, 0xc3, 0xf4, 0xaa, 0x37, 0xbd, 0x94, 0x3e, 0x1a, 0x60, 0x2c, 0x37, ++ 0xc9, 0x57, 0x65, 0xee, 0x15, 0x3e, 0xf7, 0x61, 0x49, 0xf2, 0x06, 0x57, ++ 0x41, 0xa7, 0x2a, 0x69, 0x9a, 0x8b, 0xbc, 0x51, 0xb8, 0xe2, 0xe5, 0xb1, ++ 0xa0, 0x3e, 0x78, 0x86, 0x72, 0x97, 0xe9, 0x7a, 0xa4, 0x4c, 0xa9, 0x0f, ++ 0x9e, 0xca, 0x9a, 0xc4, 0x85, 0x0d, 0xec, 0xd7, 0x47, 0x2e, 0x57, 0x45, ++ 0x4e, 0x15, 0x8a, 0x4b, 0xf0, 0x59, 0xda, 0x1a, 0xe0, 0x7c, 0x4d, 0x0f, ++ 0xc9, 0x9d, 0x20, 0x3f, 0x11, 0x0e, 0xa1, 0xde, 0xbc, 0x20, 0x86, 0xf5, ++ 0x59, 0xb8, 0xd7, 0xb5, 0x9a, 0xb8, 0x97, 0xdc, 0xe3, 0x7e, 0xce, 0xf3, ++ 0x06, 0xce, 0xf9, 0x8e, 0x28, 0xc7, 0x56, 0x63, 0xdb, 0xa5, 0x7a, 0x8f, ++ 0xe4, 0x45, 0x18, 0x20, 0x57, 0x58, 0xab, 0xbb, 0x99, 0x83, 0x00, 0xaf, ++ 0x64, 0x7f, 0x67, 0xdf, 0xcf, 0xbc, 0xec, 0xc5, 0x4f, 0xb4, 0x09, 0x75, ++ 0x54, 0x6f, 0x8a, 0x6c, 0x25, 0x57, 0x60, 0xbb, 0x56, 0x95, 0x69, 0xdb, ++ 0xd7, 0x84, 0x43, 0x71, 0x8f, 0x62, 0xe0, 0x85, 0xdc, 0xa4, 0xcd, 0xd8, ++ 0xc0, 0x9c, 0xac, 0x18, 0xa7, 0x65, 0xac, 0x92, 0x6b, 0x08, 0x96, 0x48, ++ 0xbe, 0x31, 0x9d, 0xc3, 0xab, 0x58, 0x3a, 0x22, 0xf9, 0x46, 0x00, 0x2b, ++ 0x92, 0xdf, 0xc2, 0x0b, 0xcd, 0x6e, 0x74, 0x30, 0x57, 0xbb, 0x39, 0xe9, ++ 0xc3, 0x72, 0xe2, 0xef, 0x2d, 0x49, 0xe6, 0x60, 0x9a, 0x1f, 0xb7, 0x32, ++ 0xd6, 0x1e, 0x6d, 0x66, 0x2e, 0xe5, 0x2f, 0xc5, 0xfb, 0xe4, 0x8b, 0xc7, ++ 0x0c, 0x0d, 0x19, 0x07, 0x3b, 0x77, 0x10, 0x37, 0xa9, 0x47, 0x55, 0x72, ++ 0x10, 0xd1, 0xa1, 0x8b, 0xfa, 0x54, 0x91, 0xb8, 0xa8, 0xc3, 0x4f, 0xcb, ++ 0x29, 0x44, 0x2e, 0xc9, 0x2b, 0x7e, 0x65, 0x27, 0x66, 0x4a, 0x7d, 0x58, ++ 0x3e, 0x53, 0xc6, 0xa1, 0xd0, 0xf6, 0x0d, 0xf4, 0xe6, 0x5a, 0xf1, 0xe4, ++ 0xf8, 0xf4, 0xa1, 0x9e, 0xb5, 0x67, 0xe9, 0xd5, 0x78, 0x53, 0xd7, 0x89, ++ 0xff, 0xaf, 0x43, 0xa3, 0xbf, 0xf7, 0xe7, 0xc2, 0x1b, 0xcf, 0x2a, 0x2e, ++ 0xbc, 0xa2, 0x57, 0x25, 0xbc, 0xc4, 0x82, 0xbe, 0x1c, 0xdc, 0x5b, 0x17, ++ 0x18, 0x48, 0xe5, 0x36, 0xc7, 0x2a, 0x39, 0x5e, 0xf7, 0x82, 0x02, 0x67, ++ 0xfb, 0x0a, 0x75, 0xbb, 0x26, 0xea, 0x70, 0xb6, 0x02, 0x5f, 0xd1, 0x6c, ++ 0xfb, 0x2d, 0x5d, 0xf4, 0x0c, 0x1c, 0x9a, 0xd2, 0xf1, 0x01, 0x7e, 0xef, ++ 0x9f, 0xd2, 0xf1, 0x16, 0xb6, 0x47, 0x9f, 0xc4, 0xb6, 0x4f, 0xf0, 0xac, ++ 0x20, 0x98, 0x9b, 0x92, 0x7f, 0x11, 0xb7, 0x89, 0x45, 0x71, 0xea, 0xf8, ++ 0xa5, 0xec, 0x26, 0xc1, 0x7a, 0x4e, 0xf7, 0x52, 0x07, 0xf3, 0xe3, 0xea, ++ 0xf7, 0x69, 0x07, 0xa2, 0x87, 0x62, 0x8e, 0x24, 0xf1, 0x50, 0x74, 0x5c, ++ 0x3f, 0x85, 0xd9, 0x95, 0x88, 0xd7, 0x85, 0xfa, 0x89, 0x72, 0x6e, 0x96, ++ 0xd3, 0x82, 0xaa, 0x8b, 0x9c, 0x61, 0x2e, 0xb6, 0x76, 0x8a, 0xed, 0x54, ++ 0x3a, 0xf1, 0xb5, 0xb9, 0xd1, 0xb6, 0x87, 0xa2, 0x41, 0xbc, 0xaf, 0x37, ++ 0x75, 0xb6, 0xa8, 0xb3, 0x10, 0xaf, 0x11, 0x1e, 0xd9, 0xca, 0xb9, 0xab, ++ 0x43, 0xdc, 0x2f, 0xb6, 0x86, 0x8d, 0x25, 0x05, 0xbc, 0x67, 0x1d, 0xe1, ++ 0x36, 0x1a, 0x7a, 0xfd, 0xed, 0x8c, 0x7b, 0x6a, 0xbb, 0x07, 0xc2, 0xef, ++ 0x74, 0xeb, 0x29, 0xbc, 0xcb, 0x1c, 0xde, 0x46, 0x49, 0xb4, 0x02, 0x3f, ++ 0x6c, 0x7e, 0xdf, 0x8e, 0xd7, 0x48, 0xbb, 0xd6, 0xfa, 0x12, 0x0e, 0xbe, ++ 0xca, 0xdc, 0x78, 0xd7, 0xab, 0xe1, 0x50, 0x22, 0xcf, 0x34, 0x60, 0xc7, ++ 0x80, 0x17, 0x09, 0x59, 0x2a, 0x80, 0xc8, 0x72, 0x79, 0xee, 0x55, 0xcc, ++ 0xbb, 0x64, 0x3e, 0xb7, 0x10, 0x53, 0xde, 0xb4, 0x51, 0x27, 0xfd, 0xfb, ++ 0x28, 0x7b, 0x3b, 0xb9, 0x04, 0x73, 0x4d, 0xf5, 0x3f, 0xbb, 0x84, 0x0b, ++ 0xb9, 0xf5, 0x4b, 0xf7, 0x37, 0x5f, 0xbc, 0x2f, 0x7e, 0xf5, 0x79, 0xb7, ++ 0x18, 0x7d, 0x5f, 0x7a, 0x7f, 0xe1, 0x5a, 0x9d, 0x5e, 0xce, 0xb6, 0xc7, ++ 0x8d, 0x89, 0x59, 0xd5, 0x0e, 0x57, 0x3d, 0xac, 0x0c, 0x12, 0x3f, 0x50, ++ 0xe2, 0x0e, 0x92, 0x8b, 0x6a, 0x01, 0x62, 0x46, 0x2f, 0x31, 0xc3, 0x22, ++ 0x66, 0x3c, 0x9e, 0x3d, 0xac, 0xec, 0xc9, 0x56, 0xb2, 0x8e, 0x8c, 0x41, ++ 0xc5, 0xc9, 0x41, 0x17, 0xec, 0x41, 0x07, 0xaf, 0x3f, 0xa7, 0x22, 0x1c, ++ 0xb1, 0x21, 0x6b, 0x0d, 0x45, 0xbf, 0xfd, 0x67, 0xbb, 0xe0, 0xb7, 0xd2, ++ 0x8f, 0xd8, 0x5d, 0xb1, 0x2f, 0x15, 0xa7, 0x9c, 0x3a, 0xab, 0x79, 0x5d, ++ 0xc6, 0xf2, 0x6e, 0x9c, 0x22, 0x8f, 0x7d, 0x77, 0x50, 0xc5, 0x5b, 0x83, ++ 0x68, 0xa5, 0xde, 0xda, 0xca, 0x20, 0x78, 0x15, 0x8e, 0xf4, 0x12, 0x40, ++ 0x4a, 0x74, 0x29, 0x27, 0xe5, 0xa7, 0xd7, 0xab, 0xe0, 0xfd, 0x23, 0xb7, ++ 0xb8, 0xb1, 0x08, 0x73, 0xa3, 0x6d, 0x8b, 0xdd, 0x94, 0x5b, 0x35, 0xe3, ++ 0x41, 0x2f, 0xac, 0x3a, 0x17, 0xb1, 0xfa, 0x74, 0x73, 0x33, 0x16, 0x33, ++ 0x37, 0x7e, 0x8f, 0xe0, 0xb7, 0x59, 0x97, 0x58, 0x61, 0xe3, 0x29, 0x43, ++ 0xd6, 0x45, 0x6c, 0xdc, 0x1c, 0xb5, 0x12, 0x44, 0x14, 0xab, 0x92, 0xb6, ++ 0x5d, 0x4e, 0x3f, 0x19, 0x50, 0xaa, 0x50, 0x61, 0xba, 0x25, 0x9e, 0x19, ++ 0x3b, 0xc8, 0xdb, 0x82, 0x35, 0x73, 0x63, 0xb2, 0x14, 0xf4, 0x6a, 0x32, ++ 0x1c, 0x3b, 0xa6, 0x14, 0xfc, 0xf5, 0x25, 0xda, 0xde, 0x9b, 0x49, 0xbd, ++ 0xbb, 0xd4, 0x55, 0xb8, 0x7e, 0xcd, 0xc9, 0xbb, 0x8b, 0xfe, 0x1a, 0x98, ++ 0xc2, 0x35, 0xaf, 0xf7, 0xed, 0x24, 0xce, 0x92, 0xda, 0x31, 0xff, 0xc6, ++ 0xd9, 0x5e, 0x63, 0x42, 0xf1, 0xe8, 0x55, 0xd4, 0xa7, 0x60, 0x7d, 0x09, ++ 0x39, 0x9b, 0xf0, 0x19, 0xaf, 0xf7, 0x3d, 0x96, 0xb9, 0x25, 0x8a, 0xc9, ++ 0xc8, 0xc2, 0xa6, 0x98, 0x17, 0x71, 0xab, 0x94, 0x03, 0xab, 0x34, 0xfd, ++ 0xde, 0x6b, 0xf3, 0x56, 0x9d, 0x8f, 0x7e, 0x57, 0xc1, 0xbc, 0x7c, 0x6e, ++ 0xea, 0xaf, 0xaa, 0x50, 0xd5, 0x8c, 0x0d, 0x39, 0x8e, 0xac, 0x76, 0xa8, ++ 0x4e, 0x35, 0x85, 0xcf, 0x6a, 0xf0, 0xd4, 0x6e, 0xb8, 0x51, 0x35, 0x27, ++ 0xd1, 0xd5, 0xea, 0x6d, 0x8f, 0xe5, 0xe1, 0xad, 0x31, 0x37, 0x21, 0x9a, ++ 0x92, 0xfc, 0x5a, 0x30, 0x3c, 0xbe, 0x95, 0xa8, 0x5a, 0x57, 0x7d, 0x7d, ++ 0xd1, 0x66, 0xa0, 0x56, 0x99, 0x62, 0x33, 0xc1, 0xf6, 0xd7, 0x1c, 0xac, ++ 0xd7, 0x98, 0x6f, 0xfd, 0x3c, 0xf0, 0xff, 0xad, 0xfe, 0xc3, 0xce, 0xdc, ++ 0x7b, 0x74, 0xf9, 0x2f, 0xeb, 0x1b, 0x20, 0xa5, 0xd7, 0xb0, 0x79, 0x8c, ++ 0x9a, 0x1f, 0x73, 0xec, 0x80, 0xfc, 0xa2, 0x6b, 0xd5, 0x8b, 0xf4, 0x67, ++ 0x0f, 0x75, 0xff, 0xa8, 0x6e, 0x31, 0x0c, 0xd9, 0xb6, 0x1e, 0x0d, 0x05, ++ 0x4a, 0x94, 0x20, 0xfa, 0x9a, 0xff, 0xcd, 0x9e, 0x64, 0xdc, 0xbe, 0x97, ++ 0x78, 0xeb, 0xd6, 0x6b, 0x99, 0x8b, 0x96, 0x4f, 0xab, 0xf7, 0xe6, 0xc5, ++ 0x7a, 0x03, 0xba, 0x95, 0x90, 0x7a, 0xa3, 0xd1, 0x50, 0xd7, 0x36, 0xd6, ++ 0xdb, 0xce, 0x7a, 0xf1, 0x99, 0xac, 0x97, 0xf3, 0xb3, 0xbc, 0x8f, 0x9f, ++ 0xaa, 0xe9, 0xfd, 0xad, 0x2e, 0xd6, 0x7b, 0x5c, 0xb7, 0x26, 0x9c, 0xfe, ++ 0xe6, 0x87, 0xba, 0x4b, 0x5c, 0x6e, 0xa4, 0x58, 0x6f, 0x82, 0xf5, 0x4e, ++ 0xe5, 0x64, 0xdd, 0x05, 0x37, 0x8e, 0x25, 0xd3, 0x93, 0x2e, 0x5d, 0xd7, ++ 0xde, 0x42, 0x9c, 0x31, 0xc1, 0x99, 0xcb, 0x1b, 0x0f, 0x66, 0x7b, 0xd0, ++ 0xa7, 0x1f, 0x89, 0x96, 0xb2, 0xde, 0x31, 0xfd, 0x48, 0xc0, 0x43, 0xbf, ++ 0x5f, 0xc7, 0xf6, 0x36, 0x33, 0x2f, 0x54, 0x51, 0x4f, 0x19, 0x85, 0xcf, ++ 0x18, 0x98, 0x9b, 0x0d, 0x14, 0xfc, 0x4c, 0xd6, 0x78, 0x20, 0x73, 0x2a, ++ 0xe3, 0x0b, 0x45, 0xc6, 0x9c, 0xf1, 0x29, 0x57, 0x1c, 0x6a, 0xa6, 0x61, ++ 0xd4, 0x58, 0xe8, 0x6d, 0x96, 0xf8, 0xac, 0x30, 0x36, 0x84, 0x22, 0x13, ++ 0xc4, 0xf0, 0x6d, 0xe3, 0x9f, 0xc1, 0x84, 0x56, 0x87, 0x6d, 0x63, 0xb6, ++ 0xfd, 0x43, 0xbd, 0xad, 0x86, 0xb4, 0xc2, 0xeb, 0xa5, 0xcc, 0xde, 0x70, ++ 0xb9, 0xf0, 0x00, 0xa7, 0xad, 0x38, 0x04, 0xff, 0x14, 0xa4, 0x74, 0x6b, ++ 0xbd, 0xc8, 0x7f, 0x34, 0x1a, 0x4a, 0x1c, 0x52, 0x9a, 0xba, 0xb6, 0xe1, ++ 0xdf, 0x88, 0xc7, 0x20, 0x96, 0xce, 0xc6, 0x3e, 0xf2, 0x8e, 0x78, 0xa7, ++ 0xc5, 0x08, 0x2c, 0x1c, 0xc2, 0x7d, 0x7c, 0x31, 0x23, 0xa8, 0x1b, 0xa1, ++ 0xee, 0x0e, 0x96, 0x8f, 0x15, 0xd6, 0x83, 0x70, 0x2e, 0x17, 0xa2, 0xdf, ++ 0x88, 0x2e, 0x80, 0xad, 0xd9, 0x62, 0xac, 0xb1, 0xed, 0x03, 0x86, 0x6d, ++ 0xbf, 0x68, 0xcc, 0xc6, 0x21, 0x23, 0x94, 0x10, 0x1f, 0x78, 0xc7, 0x68, ++ 0xbb, 0xc6, 0x83, 0x50, 0x27, 0x20, 0xb2, 0x29, 0x8c, 0x8d, 0x0a, 0x2a, ++ 0xf8, 0x09, 0x84, 0xdd, 0xc1, 0x0a, 0x85, 0x5e, 0x3c, 0xbf, 0xb1, 0xbb, ++ 0x91, 0x7a, 0xaf, 0x5a, 0xa8, 0xe0, 0xc3, 0x6b, 0x15, 0x1c, 0xb9, 0x36, ++ 0x1c, 0xd8, 0xa7, 0x54, 0x32, 0xee, 0x84, 0x3b, 0xdb, 0x15, 0xeb, 0x38, ++ 0xeb, 0xc6, 0x9b, 0x5d, 0xa1, 0x00, 0x19, 0x1b, 0xf1, 0x7b, 0x6e, 0x50, ++ 0xa8, 0x92, 0x7b, 0x20, 0x1c, 0xd8, 0xce, 0xff, 0xae, 0x9c, 0x82, 0x9c, ++ 0x1e, 0x8a, 0xc3, 0x69, 0x9f, 0x7d, 0x47, 0x15, 0x5c, 0x17, 0xb6, 0xed, ++ 0x13, 0xd1, 0x26, 0xed, 0x04, 0xde, 0x21, 0xee, 0x4b, 0x3f, 0x45, 0xd9, ++ 0x80, 0xf2, 0x01, 0x3d, 0xde, 0xae, 0xac, 0x16, 0xda, 0xc3, 0x38, 0x2c, ++ 0x5c, 0xa1, 0x28, 0x6f, 0x91, 0x33, 0xd8, 0xf6, 0x3b, 0x46, 0xa1, 0x2d, ++ 0xad, 0x35, 0x94, 0x00, 0x66, 0x63, 0x5c, 0x0f, 0x75, 0x4c, 0x50, 0x0f, ++ 0x01, 0xfa, 0xfa, 0x2c, 0xbd, 0x0e, 0x93, 0x9e, 0x90, 0x36, 0xa9, 0x2c, ++ 0x3e, 0xaf, 0x62, 0xde, 0xfa, 0x27, 0x95, 0xa6, 0x8d, 0x65, 0xd0, 0xc9, ++ 0x97, 0xaf, 0x90, 0xf9, 0x08, 0xf8, 0x88, 0xa7, 0xeb, 0xe0, 0xf0, 0x17, ++ 0xdc, 0x96, 0x74, 0xc7, 0xcf, 0xa1, 0x81, 0x7e, 0xa7, 0x77, 0xdd, 0xaf, ++ 0x84, 0x62, 0xc0, 0x17, 0x98, 0x70, 0x89, 0xac, 0x75, 0x48, 0x7c, 0xc9, ++ 0xb6, 0x1f, 0xa0, 0xac, 0x3b, 0x28, 0xeb, 0x86, 0xe8, 0x07, 0xf6, 0xbf, ++ 0x3a, 0x6d, 0xde, 0x84, 0x7d, 0xfa, 0xe5, 0xed, 0xbe, 0x6f, 0x63, 0xa6, ++ 0xb4, 0xeb, 0xc1, 0xd2, 0x99, 0xb6, 0xad, 0xb6, 0x0a, 0xc6, 0xde, 0xe4, ++ 0x21, 0xa6, 0xc6, 0x04, 0xbb, 0xa1, 0x5e, 0xce, 0x51, 0x5c, 0x92, 0x17, ++ 0x06, 0x12, 0x8a, 0x5a, 0x5f, 0xc1, 0xf8, 0xe0, 0xd5, 0x6d, 0x3c, 0x48, ++ 0x3e, 0x15, 0x9f, 0x59, 0x8d, 0xbf, 0xe0, 0x9c, 0x56, 0x86, 0xd5, 0x2b, ++ 0x89, 0xa2, 0x38, 0x14, 0x95, 0x6b, 0x0f, 0x26, 0x66, 0xba, 0xd0, 0xc3, ++ 0x59, 0xd6, 0xc2, 0xea, 0x2c, 0xb9, 0xef, 0x6d, 0x91, 0x6b, 0xca, 0x7f, ++ 0x85, 0x82, 0x07, 0x68, 0x91, 0x6a, 0x78, 0x73, 0x40, 0xee, 0x77, 0x18, ++ 0x72, 0xad, 0xa0, 0x21, 0xea, 0xe6, 0xbc, 0xd8, 0x70, 0x51, 0xf6, 0xf2, ++ 0x30, 0xef, 0x47, 0xe5, 0x7b, 0xfc, 0x01, 0x8e, 0x3b, 0xbe, 0x5f, 0x11, ++ 0x8c, 0xfb, 0x27, 0xfb, 0x87, 0x8c, 0xb1, 0x1a, 0x9f, 0xff, 0x05, 0xfb, ++ 0x3e, 0x1e, 0x7d, 0xd1, 0x9e, 0xc5, 0x18, 0x74, 0x22, 0x46, 0x5e, 0x7b, ++ 0x6d, 0x3d, 0x26, 0xef, 0x94, 0x31, 0x2b, 0xa8, 0xd4, 0xdf, 0xf0, 0xc8, ++ 0x1a, 0x41, 0x95, 0x7e, 0x05, 0x96, 0x2e, 0x2f, 0xdc, 0x2b, 0x0b, 0xcb, ++ 0x5a, 0x6c, 0x10, 0x65, 0xd7, 0xd6, 0x22, 0x38, 0x75, 0x6f, 0x71, 0xd8, ++ 0xdd, 0x59, 0xa9, 0xe8, 0xda, 0x6d, 0x8a, 0x3c, 0xff, 0x0d, 0x73, 0x05, ++ 0xdb, 0x7e, 0x90, 0xf3, 0x35, 0x37, 0xea, 0xc3, 0x47, 0xec, 0x67, 0x33, ++ 0xf5, 0xb7, 0xec, 0xe2, 0x7c, 0x15, 0xeb, 0x7f, 0xcc, 0x7c, 0x5e, 0xea, ++ 0x4a, 0x1b, 0x8d, 0x1d, 0x4b, 0x95, 0x1d, 0x1e, 0xc9, 0xdb, 0x36, 0x44, ++ 0x1d, 0x9d, 0xb1, 0xec, 0x3f, 0x3b, 0xd7, 0x5a, 0xeb, 0x9b, 0x17, 0xd7, ++ 0x15, 0xcf, 0x3a, 0xb1, 0xba, 0x6d, 0xa1, 0x86, 0x49, 0xbb, 0xa6, 0xc5, ++ 0xd2, 0x4a, 0x21, 0x5c, 0xa9, 0x21, 0xf2, 0x2c, 0xdb, 0xfd, 0x47, 0xa3, ++ 0x10, 0xcf, 0x0f, 0x18, 0xa1, 0x41, 0x8b, 0xfe, 0x93, 0x60, 0xde, 0xdb, ++ 0x2e, 0xbc, 0x66, 0xfc, 0x01, 0xce, 0xc3, 0x6c, 0x94, 0xb6, 0x84, 0xfa, ++ 0xe7, 0x30, 0x0f, 0x75, 0xb5, 0x0a, 0x0f, 0x90, 0xf9, 0x71, 0xca, 0xb0, ++ 0xaf, 0x32, 0x2c, 0xa6, 0x8c, 0xd1, 0x16, 0x89, 0xb1, 0x7f, 0x8a, 0x07, ++ 0x49, 0x3b, 0x4e, 0x2c, 0xee, 0x8f, 0xe3, 0xcf, 0x95, 0x05, 0x23, 0x98, ++ 0xac, 0x75, 0x7a, 0x6f, 0x4c, 0x64, 0x55, 0x72, 0xb0, 0x12, 0x6d, 0x73, ++ 0x6b, 0x1d, 0x3f, 0xf2, 0xdc, 0x7d, 0xe3, 0x9a, 0xec, 0xc5, 0xb5, 0x52, ++ 0x0c, 0x1a, 0x25, 0x50, 0xaf, 0x93, 0x78, 0x41, 0x5f, 0xd6, 0x64, 0x7c, ++ 0x16, 0xad, 0x5c, 0xd6, 0xfc, 0x9f, 0xb8, 0x6b, 0x2d, 0xf1, 0xe2, 0x05, ++ 0xf6, 0x38, 0x4a, 0xae, 0x67, 0x39, 0x9e, 0x21, 0xd8, 0x30, 0x7d, 0xed, ++ 0x54, 0xe2, 0x57, 0x91, 0x07, 0xd4, 0x61, 0x68, 0xf7, 0x72, 0x04, 0xeb, ++ 0x0a, 0x18, 0xa8, 0x9a, 0xf3, 0xd1, 0x36, 0xd8, 0x5e, 0x52, 0xc8, 0x59, ++ 0x6a, 0x31, 0xb0, 0x3b, 0x8a, 0xcc, 0x4c, 0x79, 0x26, 0xf7, 0xbc, 0x10, ++ 0x8c, 0xee, 0xdb, 0x7d, 0x25, 0x26, 0xfd, 0xf4, 0x59, 0xb6, 0x9b, 0xa0, ++ 0xef, 0xa8, 0x3a, 0x79, 0x89, 0x26, 0xed, 0x1f, 0xb9, 0x86, 0x38, 0x62, ++ 0x2c, 0x41, 0x53, 0xd7, 0x41, 0xbc, 0x4d, 0xce, 0xeb, 0xe4, 0x70, 0xc1, ++ 0x52, 0x73, 0x82, 0x4a, 0x08, 0x27, 0xc6, 0x88, 0x03, 0xbe, 0x9c, 0x97, ++ 0xdc, 0x6d, 0xb6, 0xac, 0xcd, 0xdb, 0x6d, 0xc4, 0x96, 0x04, 0x79, 0xff, ++ 0x17, 0xdc, 0x6e, 0xac, 0x25, 0x66, 0x1c, 0xd0, 0x9b, 0x36, 0x1e, 0xc4, ++ 0xff, 0x22, 0xce, 0x4a, 0xf9, 0xeb, 0xd8, 0x9f, 0xb4, 0xe9, 0x65, 0x7f, ++ 0xb2, 0xf6, 0xd2, 0xb5, 0x8a, 0x7c, 0xd9, 0xed, 0xd1, 0xdf, 0xf5, 0x08, ++ 0x37, 0x29, 0xa1, 0x1c, 0x3b, 0x76, 0x2b, 0x68, 0x67, 0x3b, 0xdb, 0x69, ++ 0x33, 0x0f, 0x84, 0xe1, 0xee, 0xb8, 0x96, 0xfc, 0x0d, 0x74, 0xc1, 0x99, ++ 0x1a, 0x1e, 0x1d, 0x43, 0x2c, 0xab, 0x4f, 0xcc, 0xf2, 0xa1, 0xcd, 0x91, ++ 0xdb, 0x62, 0x7c, 0x28, 0xb4, 0xf3, 0xe6, 0x65, 0xed, 0xd4, 0xe2, 0xf1, ++ 0xa9, 0x76, 0xf6, 0xb0, 0x9d, 0xcf, 0xce, 0x85, 0xbb, 0xea, 0xb3, 0x32, ++ 0x57, 0xcd, 0xf4, 0x9f, 0x5a, 0xa4, 0x9d, 0xb8, 0x42, 0xee, 0xf1, 0x39, ++ 0x28, 0x7a, 0xa3, 0xe4, 0x46, 0x75, 0x25, 0x52, 0x6f, 0x49, 0xf3, 0xc4, ++ 0xb9, 0x1a, 0x02, 0xf7, 0xd9, 0xb9, 0x13, 0x74, 0xd4, 0xa2, 0x6e, 0xae, ++ 0xc4, 0xd6, 0xdd, 0x55, 0x45, 0x79, 0x57, 0x6f, 0xb9, 0xd8, 0x47, 0x1d, ++ 0xef, 0x05, 0xf0, 0x68, 0x9a, 0xf5, 0xd8, 0xcf, 0x21, 0x43, 0x78, 0x6a, ++ 0x93, 0x51, 0xa6, 0xc8, 0x1a, 0x41, 0x80, 0x9c, 0xa2, 0x0e, 0xbd, 0x4e, ++ 0x1c, 0xaa, 0x67, 0xfd, 0x7b, 0xaa, 0x0a, 0x9c, 0x0a, 0x9e, 0x5b, 0x59, ++ 0xb6, 0x3d, 0x5a, 0xe8, 0x8f, 0x38, 0xcc, 0xbc, 0xbb, 0x05, 0x07, 0x46, ++ 0x2e, 0x3e, 0x0f, 0x2d, 0xd1, 0xa7, 0xcf, 0xd7, 0x44, 0xc8, 0x83, 0x4d, ++ 0xfc, 0x5f, 0x2e, 0x71, 0xe6, 0x13, 0x63, 0xdf, 0x32, 0xb6, 0x8b, 0xff, ++ 0xab, 0xb0, 0x75, 0xcc, 0xc6, 0x16, 0x27, 0x87, 0x2a, 0xc1, 0xe6, 0x66, ++ 0xff, 0x14, 0x77, 0x9d, 0x29, 0xb1, 0x23, 0x96, 0x81, 0xc4, 0x57, 0xb1, ++ 0x9f, 0xe7, 0x1c, 0xfb, 0x71, 0x29, 0xd3, 0xed, 0xa7, 0x07, 0x3f, 0xd2, ++ 0x8f, 0x2c, 0x2f, 0xc5, 0x91, 0x55, 0xb2, 0xc7, 0xb0, 0x31, 0x8a, 0xa3, ++ 0x37, 0xd3, 0x37, 0x4f, 0x11, 0x73, 0xb6, 0xcc, 0x65, 0xfc, 0x72, 0x30, ++ 0x4b, 0x41, 0xa9, 0xee, 0xc7, 0xb6, 0xdd, 0xa1, 0x60, 0x09, 0x71, 0x6b, ++ 0xcb, 0xd8, 0x1f, 0xac, 0xb5, 0x51, 0x7e, 0x03, 0x07, 0x92, 0x47, 0xbe, ++ 0x51, 0x4a, 0x9a, 0x4b, 0x9f, 0xf8, 0xc5, 0xdb, 0x6c, 0x63, 0x89, 0x51, ++ 0xd4, 0x95, 0xe8, 0xa9, 0xd8, 0x4e, 0x1d, 0x52, 0xbb, 0x8b, 0xf5, 0x15, ++ 0xbc, 0x12, 0x0e, 0x4c, 0xad, 0xf1, 0xd7, 0x61, 0x60, 0xec, 0xc8, 0x09, ++ 0xf2, 0x1c, 0xc6, 0xa9, 0x23, 0xdd, 0x01, 0xca, 0x72, 0x36, 0x5a, 0x9c, ++ 0x53, 0xf1, 0xcd, 0xe9, 0x6d, 0x88, 0xed, 0x42, 0xa9, 0x6a, 0xc4, 0x96, ++ 0x2a, 0xda, 0x68, 0x36, 0x8c, 0x44, 0x85, 0x59, 0x8b, 0xe4, 0x18, 0x7d, ++ 0x2b, 0x57, 0x02, 0xf7, 0xf5, 0x12, 0x77, 0x85, 0x6b, 0xb9, 0x6f, 0x3c, ++ 0x99, 0x2c, 0xc1, 0x3d, 0xc6, 0x05, 0x5b, 0x70, 0xf1, 0x84, 0x8e, 0xab, ++ 0x4a, 0x88, 0x89, 0x8d, 0xd1, 0x70, 0x7c, 0x1d, 0x73, 0xe6, 0x63, 0xcd, ++ 0xee, 0x1b, 0xcf, 0x64, 0x7f, 0x6b, 0x67, 0xfc, 0x97, 0x8f, 0x47, 0xf4, ++ 0x81, 0xe3, 0xb7, 0x84, 0xa5, 0x4f, 0xe9, 0xaf, 0x68, 0xa3, 0xd2, 0xbf, ++ 0x6d, 0x87, 0xa3, 0xe2, 0x27, 0x97, 0xc6, 0x70, 0x5a, 0x2f, 0x8e, 0x41, ++ 0x73, 0xe2, 0x37, 0x73, 0x6c, 0x62, 0x8e, 0xe4, 0x1d, 0x87, 0x95, 0x23, ++ 0x4e, 0x8e, 0x6d, 0xc5, 0x99, 0x5b, 0xc7, 0xfa, 0xa7, 0x72, 0xeb, 0x09, ++ 0xf2, 0xe4, 0x63, 0xe4, 0xc9, 0x2f, 0x4d, 0xe5, 0xd6, 0x2f, 0x64, 0xa5, ++ 0xce, 0xf4, 0xf2, 0x31, 0x96, 0x07, 0xc6, 0x92, 0xe1, 0x48, 0xb1, 0xce, ++ 0x4b, 0x2c, 0x7f, 0xec, 0x62, 0xf9, 0xbb, 0x99, 0x0f, 0xaf, 0xc4, 0xb6, ++ 0x74, 0x05, 0xee, 0xd3, 0x9c, 0xdc, 0xd5, 0x5b, 0x6a, 0xae, 0x5f, 0xfd, ++ 0x8e, 0x3e, 0x11, 0x71, 0x11, 0x87, 0xc6, 0x38, 0xf8, 0xf6, 0xa4, 0x42, ++ 0xbf, 0xf3, 0xa0, 0x5f, 0xab, 0xc6, 0x5a, 0xe3, 0xdf, 0xec, 0xfb, 0x56, ++ 0xca, 0xb3, 0xe2, 0x5e, 0x8a, 0x94, 0xdf, 0xc0, 0xf2, 0x21, 0x63, 0x6c, ++ 0x2a, 0xd7, 0x3c, 0x92, 0xc4, 0xa0, 0xe4, 0x71, 0x6b, 0x5a, 0xc3, 0xc1, ++ 0xcd, 0xce, 0xba, 0x79, 0x10, 0xeb, 0xb2, 0x41, 0xdc, 0x4b, 0x79, 0x32, ++ 0xee, 0xa9, 0x1c, 0xac, 0x10, 0x8b, 0x2d, 0xe1, 0x99, 0x8b, 0x59, 0xae, ++ 0x77, 0x0a, 0x67, 0xda, 0x2f, 0xf2, 0x5c, 0xe6, 0x41, 0x46, 0x91, 0xeb, ++ 0x32, 0x16, 0xd4, 0x4a, 0xee, 0x0e, 0xda, 0x45, 0x0d, 0x32, 0x7e, 0xd9, ++ 0x3b, 0x9a, 0x3e, 0x46, 0xc4, 0x4b, 0xcd, 0x70, 0x70, 0xae, 0x3a, 0x1d, ++ 0xbb, 0x64, 0xac, 0x82, 0x5b, 0x96, 0xa3, 0x9f, 0xa3, 0x17, 0xc7, 0xfb, ++ 0xe5, 0x52, 0xc1, 0xac, 0x03, 0xc9, 0x3c, 0xfd, 0x05, 0x6a, 0x89, 0xd8, ++ 0x03, 0x0a, 0xf7, 0x90, 0x97, 0xfd, 0x8f, 0xe9, 0xed, 0x96, 0xc4, 0x99, ++ 0xbe, 0xe0, 0xa9, 0x64, 0x38, 0xfe, 0x1e, 0x2c, 0xe5, 0x44, 0xd6, 0x4d, ++ 0x5b, 0x97, 0x76, 0xb7, 0xb0, 0xbd, 0x7e, 0xe5, 0xf8, 0xc5, 0x36, 0x9f, ++ 0xb8, 0x50, 0x58, 0x83, 0x2e, 0xfa, 0x8a, 0x17, 0xf7, 0x0f, 0x16, 0xf7, ++ 0x44, 0xe3, 0x38, 0x6d, 0x08, 0x2e, 0x7a, 0xc9, 0x7b, 0x80, 0xce, 0x24, ++ 0x67, 0xc1, 0xf1, 0x4b, 0xf9, 0x14, 0xe7, 0xfd, 0x0d, 0xb7, 0x60, 0xd8, ++ 0x0f, 0xe6, 0x6e, 0x28, 0x2d, 0xc4, 0x80, 0x3f, 0x55, 0xa6, 0x88, 0xed, ++ 0x4f, 0x5c, 0x18, 0x4c, 0xd7, 0x4f, 0xcb, 0xe3, 0x69, 0x5f, 0xc3, 0xa1, ++ 0x7e, 0x0b, 0x37, 0xb1, 0x0d, 0x37, 0x7e, 0xcc, 0xf8, 0xed, 0x1e, 0x3e, ++ 0x72, 0x8d, 0x2c, 0xd5, 0x7b, 0x0e, 0xc6, 0xd1, 0xcb, 0x2c, 0xc7, 0xb5, ++ 0xaf, 0xa3, 0xb4, 0xb0, 0xee, 0xf8, 0x8f, 0xee, 0xc2, 0x7f, 0xc1, 0x64, ++ 0x1f, 0xd4, 0xbc, 0xe4, 0xed, 0xa4, 0x11, 0x07, 0x45, 0xaf, 0xb5, 0xfc, ++ 0x2f, 0x7a, 0xf1, 0xf3, 0xbf, 0xe8, 0xa8, 0x8e, 0xff, 0xab, 0x99, 0xb7, ++ 0x4a, 0x7e, 0xd8, 0x85, 0x24, 0x31, 0xab, 0xc2, 0xec, 0xc6, 0x57, 0x06, ++ 0x6c, 0xbb, 0x9f, 0x7e, 0x59, 0xc6, 0x18, 0xff, 0x60, 0xb8, 0x29, 0x36, ++ 0x4f, 0x29, 0x21, 0xdf, 0xe9, 0x42, 0xff, 0x58, 0x49, 0xa2, 0xda, 0xac, ++ 0x63, 0x4c, 0xd7, 0xf0, 0xe1, 0x82, 0x4e, 0xe4, 0x73, 0x7f, 0x2c, 0xaf, ++ 0x2c, 0xce, 0x73, 0x60, 0x4a, 0x67, 0x6e, 0x59, 0x9f, 0xe9, 0x27, 0xbe, ++ 0x50, 0xa6, 0x52, 0x6c, 0xbe, 0xb8, 0x57, 0x3d, 0x7d, 0x4e, 0x8b, 0x75, ++ 0x6f, 0x72, 0xc6, 0x91, 0xc1, 0x13, 0x17, 0xb6, 0xa5, 0x65, 0x1c, 0x1e, ++ 0x1c, 0x1b, 0x94, 0xb1, 0xd9, 0x78, 0xc6, 0xb8, 0x89, 0x5c, 0xf5, 0x57, ++ 0x36, 0x21, 0xc0, 0xb1, 0x2f, 0x8f, 0xd9, 0xad, 0x8c, 0x72, 0x2e, 0x2d, ++ 0x77, 0x29, 0x79, 0x10, 0xb4, 0x52, 0x33, 0xae, 0x3c, 0x9b, 0x95, 0x3a, ++ 0xed, 0xca, 0xa1, 0xcc, 0xf4, 0xb6, 0xbb, 0x95, 0xb1, 0xec, 0xce, 0x52, ++ 0xe1, 0x23, 0x97, 0x74, 0x5c, 0xdc, 0x67, 0x94, 0xf5, 0xcd, 0x20, 0x6a, ++ 0x52, 0xd2, 0xa4, 0xe8, 0x2e, 0x08, 0x77, 0x9e, 0xd7, 0xf9, 0x4f, 0x93, ++ 0xed, 0x72, 0xff, 0x5b, 0xf0, 0x09, 0x7f, 0x3d, 0x46, 0x7f, 0x9d, 0xf8, ++ 0x93, 0xfe, 0x7a, 0xfd, 0x9f, 0x29, 0x2f, 0x6b, 0xc3, 0xb2, 0x2e, 0x6c, ++ 0xdb, 0x3b, 0x0d, 0x59, 0x23, 0x96, 0xf5, 0xe1, 0xe6, 0x4f, 0xd9, 0x3f, ++ 0xb6, 0xed, 0xbf, 0x35, 0xe6, 0x22, 0x53, 0x1b, 0xca, 0xc8, 0xda, 0xcf, ++ 0x70, 0x1a, 0x58, 0x9c, 0x92, 0x7e, 0xe2, 0xd4, 0xaf, 0x7a, 0x13, 0x23, ++ 0x15, 0xb3, 0x87, 0x1e, 0xbc, 0x6d, 0xe8, 0x7b, 0xee, 0x23, 0x27, 0xdf, ++ 0xcc, 0x7c, 0xf5, 0x80, 0xb1, 0x8c, 0x58, 0x50, 0x8e, 0xf5, 0xcd, 0xb2, ++ 0xe7, 0xd7, 0x4a, 0x4c, 0xb0, 0xba, 0xe8, 0xa6, 0x5e, 0x9f, 0xf9, 0xfa, ++ 0x5d, 0xc9, 0x70, 0xa8, 0x73, 0x03, 0xb1, 0xfe, 0x96, 0x01, 0x2f, 0x82, ++ 0x85, 0x35, 0x83, 0x8e, 0x9f, 0xa8, 0x0e, 0x7e, 0x95, 0x16, 0xd6, 0x07, ++ 0x64, 0xbd, 0x47, 0xfa, 0x59, 0xc6, 0x9c, 0x45, 0xea, 0x06, 0xd1, 0xd5, ++ 0xa8, 0x20, 0xdd, 0x18, 0x1a, 0x84, 0xcb, 0xb6, 0x7f, 0x43, 0xce, 0x38, ++ 0xe1, 0x37, 0xb1, 0x67, 0xbc, 0x29, 0xb2, 0x53, 0xfd, 0x9f, 0xc4, 0xc9, ++ 0xc2, 0xba, 0x83, 0xa5, 0x52, 0xf6, 0x3f, 0xbb, 0x4e, 0x6f, 0x40, 0xf6, ++ 0x52, 0x4a, 0xf5, 0xa5, 0xca, 0x98, 0x53, 0xaf, 0x0a, 0x37, 0x0f, 0x67, ++ 0x2e, 0x3c, 0x9e, 0x16, 0x1f, 0x40, 0x5d, 0x40, 0x9f, 0x85, 0xb9, 0xfb, ++ 0x2b, 0x71, 0xeb, 0xb0, 0xf0, 0x08, 0x9f, 0x55, 0x6a, 0x06, 0x30, 0x6f, ++ 0x7f, 0x2d, 0xda, 0x77, 0xc9, 0x1e, 0x9d, 0xdd, 0x53, 0x63, 0xde, 0x0d, ++ 0xf7, 0x41, 0x0d, 0xf7, 0xec, 0xb2, 0xed, 0x39, 0xd7, 0x93, 0xf6, 0x31, ++ 0x5e, 0x9e, 0x9a, 0xbf, 0x12, 0x9e, 0x7c, 0x3d, 0x96, 0xa6, 0x22, 0x08, ++ 0xe4, 0x80, 0x77, 0x93, 0x1d, 0xed, 0x1f, 0x0d, 0x34, 0xae, 0x6f, 0x54, ++ 0x42, 0xc6, 0x2b, 0x4a, 0x0c, 0x25, 0xf9, 0x18, 0x5c, 0x29, 0x05, 0x2f, ++ 0xeb, 0xe8, 0xa9, 0x32, 0x4d, 0xb8, 0xf2, 0x26, 0x7c, 0x29, 0x37, 0x9a, ++ 0xa9, 0xef, 0x0a, 0xce, 0xfd, 0x8c, 0x54, 0x3d, 0x66, 0xe4, 0xaf, 0x42, ++ 0x70, 0x7f, 0x33, 0xfd, 0xa7, 0x96, 0xfd, 0xf9, 0xd1, 0x9e, 0xea, 0xc4, ++ 0x0c, 0xbd, 0x95, 0xb6, 0xd1, 0x8a, 0xd9, 0x29, 0x3f, 0x16, 0x71, 0x3e, ++ 0x96, 0xa4, 0x3a, 0xd8, 0x8f, 0x0f, 0x5d, 0xc3, 0x77, 0x20, 0xb0, 0xcf, ++ 0x8b, 0xea, 0xe1, 0x20, 0xde, 0x5d, 0xe0, 0x45, 0xd9, 0xbe, 0x00, 0x2a, ++ 0x53, 0xb2, 0x6f, 0x88, 0xf8, 0x86, 0xd6, 0x00, 0x7c, 0x79, 0xa0, 0x62, ++ 0xd8, 0xc6, 0xd7, 0xa2, 0x39, 0xf5, 0xce, 0x5a, 0x59, 0xb3, 0x97, 0x38, ++ 0x71, 0x86, 0xf1, 0xee, 0x91, 0x29, 0x4c, 0x70, 0xd3, 0xae, 0x15, 0xb1, ++ 0x61, 0xc6, 0xc7, 0x33, 0xab, 0x0f, 0x24, 0x65, 0xdd, 0x24, 0x4c, 0x9f, ++ 0xf6, 0xc0, 0xbb, 0xaf, 0x7b, 0x6a, 0xfd, 0x44, 0xf4, 0xaf, 0xca, 0xb2, ++ 0xb5, 0x56, 0x49, 0x3b, 0xdf, 0x9a, 0x6d, 0x57, 0x52, 0x99, 0x6e, 0x65, ++ 0x20, 0x7b, 0x93, 0x17, 0xe5, 0x32, 0x2f, 0x37, 0x20, 0xd7, 0xfc, 0xb8, ++ 0x9d, 0xa9, 0x71, 0xe6, 0xd6, 0xf2, 0x40, 0xf2, 0xf1, 0x73, 0x77, 0x45, ++ 0x1b, 0x43, 0xdd, 0x35, 0x2a, 0xf0, 0x11, 0xe7, 0x76, 0x42, 0x29, 0xf4, ++ 0xa5, 0xe9, 0x29, 0x3c, 0xe3, 0x97, 0xb5, 0x5d, 0x99, 0xff, 0x33, 0xab, ++ 0x93, 0x03, 0xe2, 0x6b, 0x41, 0x7c, 0x40, 0x3b, 0xbc, 0x2d, 0x95, 0xb9, ++ 0xb0, 0x27, 0x2d, 0xeb, 0xd1, 0x06, 0x5e, 0xe6, 0xf5, 0x62, 0x8e, 0xfb, ++ 0x85, 0x2c, 0x59, 0x44, 0xaa, 0xd5, 0xd9, 0xa7, 0xbc, 0x35, 0x15, 0xc3, ++ 0x0f, 0xf9, 0xbf, 0x3d, 0xb5, 0x12, 0x47, 0xb3, 0x7e, 0xdc, 0x93, 0x32, ++ 0xf1, 0x0b, 0xe6, 0xb2, 0xab, 0xa8, 0xbf, 0x59, 0xb4, 0xd3, 0x2f, 0xa6, ++ 0x82, 0x78, 0x2d, 0x0b, 0xbc, 0x31, 0x68, 0x23, 0xdc, 0xf2, 0x4d, 0xf5, ++ 0x29, 0xc7, 0xd7, 0x5b, 0xf1, 0x46, 0xd2, 0xc0, 0x6b, 0xc9, 0x06, 0xe3, ++ 0xb3, 0xea, 0xaf, 0x31, 0xe1, 0x4e, 0xd2, 0xa6, 0xce, 0x22, 0x51, 0x2b, ++ 0xeb, 0x39, 0x05, 0xf9, 0x37, 0x8f, 0x7b, 0x98, 0x7f, 0xad, 0xc7, 0x61, ++ 0xbf, 0xb3, 0x66, 0xf1, 0x09, 0xb9, 0x64, 0xdd, 0x62, 0x31, 0xe5, 0x7a, ++ 0x32, 0x4d, 0x1e, 0xa9, 0xd7, 0x53, 0x1e, 0x2f, 0xda, 0x86, 0xbd, 0xa8, ++ 0xa5, 0x6d, 0x9c, 0xdc, 0x6f, 0x62, 0x7b, 0xba, 0x0c, 0xed, 0x43, 0x01, ++ 0xbc, 0xcd, 0xef, 0x5b, 0x69, 0xe3, 0xdf, 0x63, 0xdf, 0xfa, 0x7c, 0x0d, ++ 0xc3, 0x5a, 0x19, 0xfa, 0x23, 0xdf, 0x27, 0x17, 0x54, 0x99, 0x8f, 0x30, ++ 0x6f, 0xd0, 0x2b, 0xf0, 0xa8, 0xc6, 0x71, 0xb7, 0x86, 0x30, 0x14, 0xa1, ++ 0xad, 0xd7, 0x31, 0xb6, 0xe8, 0x71, 0x54, 0x33, 0xfe, 0xa5, 0x99, 0x47, ++ 0x96, 0x9a, 0x16, 0x65, 0x50, 0xb1, 0x47, 0x53, 0x65, 0x3d, 0x90, 0xcf, ++ 0x02, 0x38, 0x9a, 0x84, 0x5d, 0x6e, 0xea, 0xe7, 0xb6, 0x23, 0x7c, 0xfc, ++ 0x1d, 0xc6, 0xfc, 0x9f, 0x65, 0x2b, 0xf0, 0x9d, 0xc1, 0xb9, 0xf8, 0x71, ++ 0x46, 0xd6, 0x9a, 0x7d, 0xb8, 0x77, 0x24, 0xaa, 0x16, 0xd6, 0x49, 0x7d, ++ 0xb8, 0x7f, 0x04, 0xd6, 0x6c, 0xda, 0xe3, 0x4b, 0xa3, 0x55, 0x58, 0x33, ++ 0xf8, 0xbc, 0xcd, 0xbc, 0x9a, 0x76, 0xed, 0xc5, 0x91, 0x8c, 0xc8, 0x58, ++ 0x4d, 0x19, 0xcb, 0x70, 0x94, 0xdf, 0xfb, 0x69, 0xfb, 0xb5, 0x03, 0x0f, ++ 0xe3, 0x7c, 0xba, 0x21, 0xb2, 0x4a, 0xed, 0xc2, 0x31, 0x67, 0xaf, 0xba, ++ 0x19, 0x6f, 0x52, 0x8f, 0xd5, 0x3b, 0x6d, 0xfb, 0x57, 0xd1, 0x38, 0xde, ++ 0xc8, 0x5e, 0x89, 0x32, 0x7e, 0x37, 0xa2, 0xed, 0x78, 0x3d, 0x5b, 0x8f, ++ 0xaa, 0x81, 0x0e, 0xbc, 0xca, 0x7c, 0xa0, 0x72, 0x67, 0x37, 0x5e, 0x61, ++ 0xfb, 0xbe, 0x21, 0x2f, 0x7e, 0x94, 0xf1, 0xe2, 0xe5, 0x41, 0x5d, 0x5b, ++ 0xab, 0xfc, 0x54, 0x49, 0xd4, 0x16, 0xfa, 0x19, 0x4e, 0x17, 0xf4, 0xd9, ++ 0x37, 0x5e, 0x02, 0xc1, 0xf9, 0x83, 0x7e, 0x59, 0x3b, 0x96, 0x33, 0x3e, ++ 0x67, 0x56, 0x6b, 0xa9, 0x3d, 0x17, 0x92, 0xd4, 0xe7, 0xeb, 0xb9, 0x00, ++ 0x6e, 0x4f, 0x89, 0x6e, 0x33, 0x17, 0x76, 0x10, 0x3b, 0x06, 0x72, 0x31, ++ 0x1c, 0x4f, 0x7a, 0x64, 0x4f, 0x15, 0xfd, 0x39, 0xd9, 0xab, 0xfe, 0x16, ++ 0xe7, 0x06, 0x58, 0x9b, 0x2b, 0xb4, 0xb5, 0x65, 0xbc, 0x94, 0xba, 0xbb, ++ 0x0d, 0x4f, 0x69, 0x25, 0x12, 0x9b, 0x0b, 0x36, 0xaa, 0xdf, 0x4e, 0xdb, ++ 0xfd, 0x96, 0xb3, 0x3e, 0x38, 0x9c, 0x6e, 0xd2, 0x66, 0xa0, 0x38, 0x8f, ++ 0x0d, 0x98, 0xad, 0xff, 0xd6, 0x7e, 0xde, 0x2f, 0x6b, 0xbe, 0xc2, 0x25, ++ 0xcf, 0xac, 0x5e, 0x9b, 0x94, 0x7e, 0x82, 0xe8, 0xcd, 0x3d, 0x71, 0x61, ++ 0x28, 0xed, 0xa6, 0x5f, 0x92, 0x33, 0x84, 0xfd, 0x58, 0xd2, 0x18, 0x41, ++ 0x63, 0x5e, 0xd6, 0x93, 0xbf, 0x52, 0x25, 0x67, 0x2f, 0x36, 0x86, 0x9d, ++ 0xb5, 0x3d, 0xc6, 0xc5, 0xe2, 0x3d, 0x2f, 0x4e, 0xfd, 0x81, 0xaf, 0x00, ++ 0x73, 0x86, 0x3b, 0xd9, 0xaf, 0x8d, 0x5b, 0x8d, 0x7f, 0xb5, 0xdb, 0xbf, ++ 0x24, 0xfd, 0xdf, 0x55, 0x55, 0x78, 0xb6, 0xb8, 0x4c, 0xd6, 0x24, 0x87, ++ 0xd3, 0xf3, 0xe9, 0x4b, 0x2d, 0x38, 0xe4, 0x17, 0x0e, 0x22, 0x7e, 0x70, ++ 0x66, 0x75, 0x94, 0xf6, 0xf3, 0x28, 0x65, 0x58, 0x4e, 0xdb, 0xb9, 0x95, ++ 0xb8, 0x50, 0xad, 0x3f, 0x71, 0x61, 0x20, 0x6d, 0x60, 0x5e, 0xce, 0x47, ++ 0x5b, 0x96, 0x75, 0xc3, 0x56, 0xe8, 0x39, 0xe2, 0x08, 0xed, 0x7b, 0x51, ++ 0xce, 0x4f, 0x7b, 0x0e, 0x62, 0x61, 0x4e, 0x7c, 0x5c, 0x47, 0x98, 0x71, ++ 0xae, 0x8b, 0x75, 0x62, 0xb9, 0x1a, 0x7c, 0x76, 0xaf, 0x1b, 0x77, 0xa4, ++ 0xa2, 0xd4, 0x4f, 0x84, 0xf1, 0xef, 0x92, 0xbe, 0xb7, 0x8d, 0xcf, 0x41, ++ 0x8d, 0x7e, 0xd8, 0x7e, 0xd6, 0xc1, 0xb0, 0x52, 0x47, 0x4f, 0x01, 0xf6, ++ 0x1b, 0x48, 0xc3, 0xaa, 0x66, 0x7c, 0x39, 0x97, 0x7b, 0xf6, 0xf7, 0x89, ++ 0xbb, 0x44, 0x97, 0xd3, 0xc7, 0x23, 0x98, 0xf2, 0xc4, 0x05, 0xd9, 0x9b, ++ 0x6d, 0x79, 0xcc, 0xc6, 0x92, 0x96, 0x0d, 0xca, 0x77, 0x1d, 0x5b, 0x92, ++ 0x76, 0x85, 0x57, 0x14, 0xf5, 0x5f, 0xd4, 0xf9, 0x67, 0xa6, 0x74, 0x5e, ++ 0x1c, 0x67, 0x68, 0x8f, 0xe0, 0xf4, 0xbd, 0x2d, 0x45, 0x9c, 0x96, 0xf2, ++ 0x72, 0x7f, 0xb9, 0x3d, 0xa0, 0xc1, 0x5d, 0xaa, 0xbb, 0xd0, 0x17, 0x79, ++ 0x5a, 0x99, 0xd4, 0xc4, 0xe7, 0x65, 0xcb, 0xeb, 0x36, 0x9b, 0x6e, 0x4b, ++ 0xbb, 0x3e, 0xcf, 0x72, 0x50, 0x4a, 0x2f, 0xce, 0xa5, 0x70, 0x93, 0xcd, ++ 0x53, 0x73, 0x29, 0x9c, 0xb8, 0x38, 0xa6, 0xa2, 0xac, 0x31, 0xf2, 0x3e, ++ 0x91, 0x57, 0x6c, 0x43, 0xca, 0x3c, 0x5e, 0x56, 0x58, 0x43, 0xdd, 0x3c, ++ 0xcd, 0x1e, 0x8a, 0xfc, 0xc6, 0x69, 0x43, 0xc3, 0x45, 0x7b, 0x70, 0xa3, ++ 0x33, 0x25, 0xf3, 0x0e, 0xab, 0x9c, 0x7a, 0xe8, 0xcc, 0x79, 0x38, 0x7f, ++ 0xc2, 0xd3, 0x55, 0x2c, 0x35, 0xfa, 0x94, 0x09, 0xff, 0x76, 0xb6, 0x91, ++ 0xb9, 0xc0, 0x3a, 0xbc, 0x37, 0xc0, 0xef, 0x57, 0xe1, 0x36, 0xe2, 0xe8, ++ 0xda, 0xa8, 0xa5, 0x14, 0xce, 0x5c, 0x94, 0xe1, 0xda, 0xe1, 0x5a, 0xf8, ++ 0x74, 0x59, 0xd3, 0xf8, 0xbf, 0x15, 0x5f, 0x8d, 0x8c, 0xbf, 0xc0, 0x11, ++ 0xa0, 0x5e, 0x85, 0x25, 0xc3, 0x0c, 0xd9, 0xce, 0xfe, 0x44, 0x1b, 0x9e, ++ 0x6a, 0xbd, 0x0a, 0xb7, 0x38, 0x3c, 0x28, 0x8c, 0xeb, 0xf6, 0x09, 0x86, ++ 0x76, 0x2b, 0x43, 0xc4, 0x4e, 0x26, 0x23, 0xf4, 0xeb, 0xb8, 0x32, 0x48, ++ 0xcc, 0xdc, 0xe3, 0xf8, 0x08, 0xb4, 0x6a, 0x3e, 0x4b, 0x67, 0xdb, 0x39, ++ 0x0e, 0xb1, 0xdd, 0x4b, 0x32, 0xce, 0xa6, 0x8c, 0x67, 0x89, 0x45, 0x0b, ++ 0xa7, 0x64, 0x9c, 0x3b, 0x5f, 0xf2, 0x5c, 0x91, 0xb1, 0x0c, 0x8d, 0x94, ++ 0xa3, 0x96, 0x72, 0x1c, 0x35, 0x6a, 0x94, 0x61, 0xad, 0x20, 0x5b, 0x03, ++ 0xfb, 0x67, 0xcc, 0xc1, 0x1a, 0xc3, 0xa7, 0xdc, 0xea, 0xdc, 0x2b, 0xca, ++ 0x96, 0xb9, 0xd0, 0x9f, 0xfe, 0xbd, 0xed, 0xd3, 0x0b, 0x72, 0x56, 0x0d, ++ 0x05, 0xf1, 0xca, 0x82, 0xab, 0x50, 0xb9, 0xb7, 0x0c, 0x2d, 0xc4, 0xf5, ++ 0xa6, 0x61, 0x7d, 0x70, 0x83, 0x22, 0xb2, 0x7a, 0x78, 0xed, 0xac, 0x29, ++ 0x50, 0x9f, 0x65, 0xde, 0x4f, 0xda, 0xb1, 0x1b, 0xcb, 0x53, 0x05, 0x1b, ++ 0x76, 0xfc, 0xb7, 0x51, 0xec, 0x57, 0xd6, 0x0f, 0x69, 0xcf, 0x59, 0x17, ++ 0x96, 0xb2, 0xef, 0xa3, 0xc6, 0x03, 0x8a, 0xa5, 0x3d, 0x71, 0x41, 0xce, ++ 0x16, 0xa8, 0x94, 0x71, 0x73, 0xe6, 0x2a, 0xdc, 0x3e, 0x3c, 0x61, 0x7b, ++ 0xf5, 0x45, 0xb2, 0x17, 0xd9, 0xd5, 0xaf, 0x78, 0xb1, 0x23, 0xe3, 0xc2, ++ 0xe2, 0x61, 0x72, 0x39, 0x23, 0xa1, 0xc8, 0xba, 0xa7, 0xf0, 0xd5, 0xb6, ++ 0x14, 0x73, 0xd5, 0xbc, 0xe4, 0x8e, 0x67, 0x57, 0xb7, 0x25, 0xef, 0x51, ++ 0xe2, 0x5a, 0xe6, 0x42, 0x2a, 0x7d, 0xe4, 0x5b, 0x2a, 0x79, 0xd7, 0x56, ++ 0xe2, 0xda, 0xeb, 0x07, 0x7c, 0xf4, 0x05, 0x85, 0x7e, 0xe2, 0xa7, 0xef, ++ 0x37, 0xe3, 0x17, 0xf4, 0x8d, 0x55, 0x8c, 0x8b, 0x3f, 0xcb, 0xd5, 0xe1, ++ 0xe6, 0x5d, 0x26, 0x5e, 0x3a, 0xe0, 0x47, 0xd7, 0xae, 0x9b, 0xf0, 0x26, ++ 0xcb, 0x8d, 0x33, 0x1e, 0x8c, 0x8f, 0xd6, 0xf2, 0xe3, 0xe7, 0xa7, 0x8e, ++ 0x9f, 0xb5, 0xc4, 0xa3, 0x1a, 0x9c, 0xd8, 0xeb, 0x42, 0xfb, 0xb0, 0x8a, ++ 0x61, 0x43, 0xc1, 0x9d, 0xd7, 0xc9, 0x78, 0xbc, 0x58, 0xd3, 0x78, 0xc9, ++ 0x2e, 0x96, 0xa6, 0x84, 0xc3, 0x79, 0x2d, 0x39, 0x53, 0x71, 0x90, 0x7e, ++ 0x79, 0x33, 0x39, 0xd8, 0xa3, 0x83, 0x9d, 0xf4, 0x23, 0x1b, 0x73, 0xa2, ++ 0xdf, 0xc7, 0x72, 0xad, 0x5f, 0x72, 0x5e, 0x67, 0x0f, 0x21, 0xcd, 0x79, ++ 0x9c, 0xf4, 0x34, 0x59, 0x33, 0x50, 0x16, 0x0f, 0x98, 0x61, 0xed, 0x30, ++ 0x96, 0x61, 0x70, 0x1c, 0x9a, 0x46, 0x1e, 0xb5, 0x8d, 0x3c, 0xaa, 0x8f, ++ 0x3c, 0x6a, 0x73, 0xf6, 0x30, 0xe7, 0x78, 0x11, 0xdb, 0x97, 0x18, 0xe8, ++ 0xa6, 0xef, 0x0a, 0x27, 0xf2, 0x5a, 0x65, 0x6c, 0xff, 0x18, 0x63, 0xd2, ++ 0xa2, 0xa1, 0x02, 0x6e, 0x9c, 0x9f, 0xff, 0x1c, 0xf4, 0x19, 0xfd, 0xf4, ++ 0xf9, 0x42, 0xdb, 0xdb, 0x85, 0x9b, 0x79, 0xaa, 0xe2, 0x55, 0x66, 0x78, ++ 0xfd, 0xab, 0xe4, 0x66, 0x5e, 0xb6, 0xb9, 0x75, 0x6a, 0x8f, 0x62, 0x80, ++ 0x6d, 0xf6, 0xb3, 0x6e, 0xd3, 0x90, 0xc5, 0xb9, 0x74, 0xb3, 0x7e, 0x38, ++ 0xb0, 0x41, 0x31, 0x58, 0xd7, 0xc9, 0x31, 0xd0, 0xb0, 0xf7, 0xd2, 0x5c, ++ 0x75, 0x12, 0x63, 0x86, 0xa6, 0xfc, 0xfd, 0x6c, 0xee, 0x2a, 0x84, 0x69, ++ 0x24, 0x4f, 0x19, 0x9b, 0x10, 0xa4, 0xcd, 0xba, 0xa6, 0xfa, 0xea, 0x93, ++ 0x71, 0xb8, 0x67, 0xc7, 0x67, 0xb3, 0x8f, 0xc1, 0x6c, 0x58, 0xeb, 0x41, ++ 0xd3, 0xf1, 0x19, 0x90, 0x71, 0x48, 0x7f, 0xcb, 0xf0, 0xf8, 0xf8, 0xe5, ++ 0xe3, 0xa8, 0x27, 0x3e, 0x5d, 0x33, 0xe5, 0x5b, 0xff, 0xee, 0xe4, 0xe9, ++ 0x71, 0xc7, 0xc7, 0x1e, 0x75, 0xe4, 0xf7, 0xb0, 0xcd, 0x3c, 0xdb, 0x9c, ++ 0x70, 0xce, 0x9b, 0x5a, 0xe4, 0xb9, 0xf5, 0x94, 0x43, 0x89, 0xd7, 0x98, ++ 0x4d, 0xdd, 0x33, 0x10, 0x8e, 0xbd, 0xc1, 0xb6, 0x67, 0xb0, 0xed, 0x67, ++ 0xd8, 0x76, 0x9a, 0x6d, 0x8f, 0xb1, 0xed, 0xef, 0x5e, 0x6c, 0x5b, 0xc5, ++ 0xaa, 0x5d, 0x45, 0xdb, 0x72, 0x23, 0x36, 0x9f, 0x19, 0xe1, 0x0c, 0xd9, ++ 0x7f, 0xad, 0xe7, 0xdc, 0x8b, 0xee, 0x82, 0x8c, 0xed, 0x05, 0x7b, 0x5b, ++ 0xc4, 0xd8, 0xf3, 0xc5, 0x5d, 0x0a, 0xde, 0x89, 0xbe, 0x83, 0x49, 0x7f, ++ 0x81, 0x47, 0x14, 0x6d, 0x48, 0xa3, 0x0d, 0x69, 0xa9, 0x7f, 0x96, 0xa5, ++ 0x22, 0xd6, 0x11, 0xfb, 0x91, 0xbd, 0x09, 0xf2, 0xe7, 0xa4, 0xe8, 0x63, ++ 0x0f, 0x71, 0x37, 0x7c, 0xfc, 0x34, 0x63, 0xe7, 0xf7, 0xb2, 0x1e, 0x64, ++ 0x32, 0x3e, 0x3c, 0x93, 0x15, 0x6c, 0x3c, 0x4b, 0x6c, 0x14, 0xbc, 0x27, ++ 0x0f, 0x1c, 0x3d, 0xf2, 0x8d, 0x00, 0x2b, 0x3f, 0x43, 0xfb, 0x79, 0x86, ++ 0xf6, 0xf3, 0xcc, 0xa8, 0x0f, 0x9f, 0x3d, 0xe8, 0xc5, 0x47, 0xc4, 0x9a, ++ 0x01, 0x96, 0x49, 0xa6, 0x9b, 0x71, 0x1d, 0x79, 0xd6, 0xa1, 0x01, 0xc6, ++ 0x65, 0xc6, 0xff, 0x48, 0x5e, 0xc3, 0x8e, 0xa1, 0x1a, 0x34, 0xed, 0x93, ++ 0x18, 0x5c, 0x83, 0x07, 0x07, 0xbd, 0x98, 0xb7, 0x57, 0xf6, 0x40, 0xc9, ++ 0x0b, 0x07, 0xef, 0xc0, 0xa8, 0xe3, 0xe3, 0x33, 0xe8, 0x1f, 0xb5, 0x68, ++ 0xdc, 0x27, 0xdf, 0xc9, 0x53, 0x68, 0xb3, 0x8b, 0x0e, 0xd6, 0x71, 0xbc, ++ 0x37, 0x61, 0xe1, 0xc1, 0x00, 0xf1, 0xdc, 0x8f, 0x58, 0x7e, 0xd9, 0x05, ++ 0xc1, 0xe4, 0xbe, 0xf1, 0xe9, 0x31, 0x4d, 0xfc, 0xd0, 0xc1, 0xb0, 0x58, ++ 0x11, 0xc3, 0x2e, 0x3d, 0x9f, 0x8e, 0x93, 0x8d, 0x82, 0x81, 0x2c, 0x53, ++ 0x8c, 0x3d, 0xd3, 0x71, 0xf1, 0x12, 0x3e, 0xb5, 0x0c, 0xcb, 0x7f, 0x0d, ++ 0x5d, 0xd7, 0x8b, 0xaf, 0x5f, 0x85, 0x98, 0x23, 0x4f, 0xb2, 0x9c, 0xe5, ++ 0x02, 0x05, 0x7f, 0x9f, 0x8e, 0xe7, 0xbe, 0x29, 0x3f, 0x75, 0x21, 0x5e, ++ 0x53, 0xe0, 0xc2, 0xb7, 0xed, 0x6a, 0xc6, 0x0e, 0xea, 0xa3, 0x83, 0x7e, ++ 0xe4, 0x8b, 0x9a, 0xb6, 0x55, 0x23, 0x39, 0x6d, 0x2d, 0xee, 0xd8, 0xe5, ++ 0x67, 0x0c, 0xbf, 0x12, 0xa9, 0xd1, 0xd5, 0x6c, 0xab, 0x1e, 0x03, 0x53, ++ 0xb9, 0x7e, 0x5f, 0xfa, 0x56, 0xfb, 0x7e, 0xe7, 0x3c, 0x80, 0xec, 0x0b, ++ 0x6c, 0x58, 0xed, 0x0d, 0x4f, 0x04, 0x99, 0xeb, 0x1b, 0xcc, 0x39, 0xc8, ++ 0xc1, 0x8e, 0x23, 0x5c, 0xcb, 0xdc, 0x5d, 0xaf, 0xc6, 0x62, 0xe6, 0xfa, ++ 0xf7, 0xfb, 0xe5, 0xd9, 0x43, 0x22, 0x8b, 0x53, 0xfe, 0xd2, 0x18, 0x77, ++ 0x4c, 0x1b, 0x63, 0x53, 0x6c, 0x06, 0x8a, 0x7c, 0xec, 0xf7, 0xf6, 0xcf, ++ 0x74, 0x28, 0x43, 0x61, 0x5a, 0x6d, 0x4b, 0x68, 0xf0, 0x7e, 0x45, 0xd7, ++ 0xe6, 0xab, 0x84, 0xae, 0xdc, 0xeb, 0x58, 0x9a, 0xff, 0x09, 0xe2, 0x79, ++ 0x3a, 0x38, 0x65, 0x59, 0x95, 0x5f, 0x89, 0x89, 0xac, 0x9c, 0xef, 0x38, ++ 0xb3, 0xfa, 0x9a, 0x01, 0x1f, 0x6d, 0x14, 0xca, 0xa1, 0xd6, 0x08, 0xde, ++ 0x25, 0xcf, 0xe9, 0x4c, 0xbd, 0x0e, 0x8d, 0xf1, 0xf5, 0x8e, 0xd4, 0x4f, ++ 0x50, 0x45, 0x4c, 0xb9, 0x3d, 0xf5, 0x7b, 0x7b, 0x2c, 0xfc, 0xb2, 0x53, ++ 0xaf, 0x34, 0xb7, 0xff, 0xc2, 0xe0, 0xa5, 0xf8, 0xa4, 0x95, 0xea, 0x17, ++ 0x4a, 0x3f, 0x89, 0x87, 0xcd, 0xed, 0xbd, 0xc9, 0xdc, 0xbf, 0x78, 0xcc, ++ 0x5f, 0xfe, 0xfd, 0x77, 0x5a, 0x0b, 0x76, 0x19, 0xcc, 0x7e, 0x11, 0x5f, ++ 0x73, 0x70, 0x77, 0xcd, 0x06, 0xb7, 0xb9, 0xf1, 0x1b, 0xb2, 0x4e, 0xba, ++ 0xc6, 0x59, 0x43, 0xe8, 0xc2, 0xf6, 0xdd, 0x9d, 0xe8, 0xdd, 0x2d, 0xd8, ++ 0xda, 0xd4, 0xb1, 0x58, 0x99, 0x45, 0x3f, 0x1c, 0x76, 0x72, 0x19, 0xb7, ++ 0x7e, 0xb5, 0xb3, 0x3e, 0xe0, 0x71, 0xf6, 0xc7, 0x82, 0x58, 0x93, 0x2b, ++ 0xb4, 0x35, 0x27, 0x5b, 0x49, 0xff, 0x32, 0x91, 0x62, 0xce, 0xe2, 0x63, ++ 0xec, 0x74, 0x33, 0xcf, 0x7d, 0x65, 0x48, 0xe2, 0x8e, 0x02, 0xdf, 0x97, ++ 0x64, 0x2f, 0x74, 0x19, 0x8a, 0x7c, 0x3d, 0xae, 0xf5, 0xf2, 0xfa, 0xfb, ++ 0xe5, 0x05, 0xb9, 0x7a, 0x2f, 0xe3, 0x45, 0x45, 0x7b, 0x10, 0xdd, 0x15, ++ 0x6d, 0x28, 0xcc, 0xb2, 0xcc, 0xbf, 0xc9, 0x07, 0x2f, 0xf9, 0x73, 0xb4, ++ 0xdc, 0x59, 0x33, 0xcc, 0x4f, 0x8f, 0xef, 0x7d, 0x53, 0xba, 0xbf, 0xa3, ++ 0xbc, 0x18, 0x9b, 0x0a, 0xf2, 0x1a, 0xc4, 0xc2, 0x2b, 0x10, 0xf7, 0x17, ++ 0xfd, 0x7f, 0x2f, 0x9f, 0xf7, 0x0a, 0x06, 0x4c, 0xd5, 0xdd, 0x56, 0x81, ++ 0xf2, 0x3e, 0x87, 0xc3, 0x5d, 0x6a, 0xff, 0xc8, 0x65, 0xed, 0x4f, 0xb7, ++ 0x5f, 0x69, 0x5f, 0xe2, 0xb4, 0xe8, 0xf4, 0x5e, 0xd6, 0x15, 0xfd, 0x39, ++ 0x18, 0x2d, 0xeb, 0xb5, 0xe4, 0x6e, 0x9d, 0xce, 0x1e, 0x4e, 0x39, 0x79, ++ 0xf3, 0x66, 0xe6, 0x50, 0x15, 0x7b, 0xf9, 0x9d, 0xdc, 0xe7, 0x96, 0xe1, ++ 0x00, 0xca, 0xf6, 0x7a, 0x88, 0xeb, 0xb3, 0xe0, 0xde, 0x5b, 0x42, 0x7b, ++ 0x15, 0x8e, 0xb0, 0x81, 0x1c, 0xe1, 0x4a, 0xb8, 0xf6, 0x96, 0x92, 0x97, ++ 0x0b, 0xe7, 0x5b, 0xbf, 0x7a, 0x2d, 0xe3, 0xb8, 0xba, 0xd7, 0xcb, 0xf8, ++ 0x5c, 0x0f, 0x0f, 0x63, 0xde, 0xd2, 0xe1, 0xcf, 0xa0, 0x84, 0x22, 0xdf, ++ 0x33, 0x7c, 0x35, 0x66, 0xef, 0xad, 0xc0, 0xaa, 0xe1, 0xd9, 0x98, 0xb5, ++ 0x57, 0x72, 0xa7, 0x20, 0x02, 0x7b, 0x2b, 0xb1, 0x7c, 0x38, 0x84, 0x9a, ++ 0xbd, 0x55, 0xe8, 0x1c, 0x9e, 0x03, 0x6d, 0x6f, 0x35, 0xbe, 0x38, 0xdc, ++ 0x80, 0xea, 0xbd, 0x1a, 0xee, 0x18, 0xd6, 0x51, 0xb5, 0xb7, 0x86, 0x31, ++ 0x2d, 0xcc, 0xd8, 0xe9, 0xc7, 0xb2, 0x5d, 0x9c, 0x9b, 0x03, 0x75, 0xf4, ++ 0x8b, 0x95, 0xe4, 0xd4, 0x77, 0x63, 0x4f, 0x7a, 0x1e, 0x2a, 0x0e, 0x04, ++ 0x70, 0xcb, 0xae, 0x09, 0x8d, 0x94, 0x06, 0x4b, 0xc2, 0xcd, 0x28, 0x3b, ++ 0x20, 0xb9, 0x5f, 0xe8, 0x78, 0x3b, 0x42, 0xe7, 0x16, 0xa3, 0x9a, 0xb9, ++ 0x2f, 0x70, 0x7a, 0x1c, 0x98, 0x3b, 0xee, 0xc2, 0x61, 0x6d, 0x25, 0xb6, ++ 0x8e, 0xef, 0x9d, 0xb2, 0x79, 0xd9, 0x5b, 0xaa, 0xe6, 0xfc, 0xca, 0x77, ++ 0xb9, 0x77, 0x37, 0xfa, 0xc7, 0x8b, 0x6b, 0x64, 0xa1, 0xc1, 0x3e, 0x6a, ++ 0x70, 0x22, 0x2b, 0xcf, 0xc4, 0x47, 0x40, 0xfb, 0x56, 0x36, 0xcb, 0x19, ++ 0x78, 0x97, 0xa9, 0x56, 0x6d, 0x6e, 0x5d, 0x7f, 0x63, 0x22, 0xbb, 0x89, ++ 0x79, 0x97, 0xe4, 0xb0, 0x1b, 0x6e, 0x5c, 0x93, 0x3d, 0x73, 0x71, 0xaf, ++ 0x61, 0xd0, 0x68, 0x0b, 0x68, 0xf8, 0x02, 0xd6, 0x38, 0xeb, 0xab, 0x2a, ++ 0xe7, 0x4c, 0xce, 0xed, 0x38, 0xe7, 0xe1, 0x69, 0x67, 0x09, 0x18, 0x0e, ++ 0xa6, 0xae, 0x43, 0x43, 0xd6, 0x59, 0xc7, 0x8d, 0x24, 0xf0, 0xbc, 0xda, ++ 0xa1, 0x5b, 0x53, 0xe7, 0x4e, 0xac, 0x85, 0x1a, 0xe2, 0x86, 0x76, 0xf1, ++ 0x6c, 0x4a, 0x28, 0x38, 0x86, 0x50, 0x60, 0x1b, 0xd6, 0xa1, 0xd7, 0x39, ++ 0x97, 0xd5, 0x25, 0xe7, 0xa2, 0xf8, 0xff, 0x6e, 0xe8, 0x17, 0xcf, 0xd7, ++ 0xca, 0xf9, 0x71, 0xd9, 0xe3, 0xb2, 0x99, 0xf3, 0x4b, 0x9e, 0x7c, 0x58, ++ 0x51, 0x07, 0x9c, 0xb5, 0xb3, 0x95, 0x2e, 0xc6, 0x80, 0x76, 0x05, 0x89, ++ 0x32, 0x33, 0x1c, 0x7c, 0x77, 0x6a, 0xdd, 0xc1, 0x93, 0xdb, 0xa2, 0x94, ++ 0xe4, 0xfa, 0x15, 0x77, 0xae, 0xb0, 0xee, 0xe0, 0x22, 0x8f, 0xdd, 0x96, ++ 0xae, 0x65, 0x19, 0x0d, 0x73, 0x17, 0xb8, 0xf1, 0x72, 0xb2, 0x2a, 0xe1, ++ 0xe3, 0xf7, 0xad, 0x0b, 0x4a, 0xf0, 0x20, 0x6d, 0xbf, 0xe3, 0xda, 0xa3, ++ 0x38, 0x93, 0x25, 0xd7, 0x48, 0x5a, 0xd1, 0x51, 0xf6, 0x79, 0x24, 0xa9, ++ 0xe2, 0x85, 0x91, 0x2d, 0xd1, 0x7d, 0x4e, 0xff, 0x0f, 0xa3, 0x77, 0x4c, ++ 0xf2, 0xae, 0x88, 0xdd, 0x97, 0x36, 0x6c, 0x89, 0xbb, 0xf9, 0x64, 0x2d, ++ 0x73, 0x73, 0x0d, 0x67, 0x16, 0xac, 0xc7, 0x47, 0x2c, 0x93, 0x4b, 0x6e, ++ 0xc0, 0x87, 0xe4, 0x08, 0xd9, 0xe4, 0x32, 0xfc, 0x88, 0xb9, 0xe4, 0xb7, ++ 0x93, 0x1d, 0xcc, 0x2d, 0x57, 0xe2, 0x87, 0x23, 0xc2, 0x3f, 0xda, 0xd1, ++ 0x96, 0x54, 0x70, 0x4b, 0x78, 0x25, 0x4e, 0x8c, 0x32, 0xa7, 0x1c, 0x91, ++ 0xb3, 0xc0, 0x57, 0x4c, 0x9d, 0x49, 0x94, 0xe7, 0x71, 0x3e, 0x5f, 0x81, ++ 0x23, 0xa3, 0x01, 0xec, 0x67, 0x0e, 0xf9, 0x16, 0x31, 0x64, 0x5f, 0xb2, ++ 0x19, 0x27, 0x99, 0x2b, 0x7d, 0x2f, 0x19, 0xc3, 0x79, 0x5e, 0x1f, 0x4e, ++ 0xca, 0xda, 0x78, 0x2b, 0xce, 0x65, 0xbf, 0x8f, 0x92, 0x81, 0x59, 0x38, ++ 0xd6, 0xf9, 0x1c, 0xa9, 0xe4, 0x61, 0x7e, 0x3a, 0x70, 0x72, 0xb4, 0x03, ++ 0x6f, 0x8f, 0xdc, 0x8a, 0xb7, 0x47, 0x7f, 0x8e, 0x33, 0x23, 0x22, 0xaf, ++ 0x6d, 0xab, 0x51, 0x69, 0x57, 0x67, 0xbb, 0xc4, 0xa9, 0xd1, 0xff, 0x93, ++ 0xb6, 0xdf, 0xb7, 0x8f, 0xad, 0x94, 0x76, 0x9f, 0xfb, 0x13, 0x6d, 0x8b, ++ 0x2e, 0x25, 0xd6, 0x7b, 0x71, 0x22, 0xe9, 0x65, 0x5e, 0x35, 0x71, 0x4d, ++ 0x19, 0x26, 0x16, 0x32, 0xdb, 0x44, 0x5f, 0xb6, 0x14, 0x2f, 0x0c, 0xba, ++ 0xc9, 0x15, 0x3f, 0x47, 0xfc, 0xe8, 0xa6, 0x1d, 0x96, 0x32, 0x7f, 0xf3, ++ 0x52, 0xc7, 0x0b, 0x89, 0xf7, 0xcd, 0xd4, 0x9f, 0x0f, 0xaf, 0x24, 0xfd, ++ 0x78, 0x35, 0xd9, 0x94, 0xc8, 0x2b, 0x2d, 0xb0, 0x6a, 0x0a, 0x79, 0xe5, ++ 0x91, 0xe4, 0x46, 0x47, 0xa6, 0x97, 0x93, 0x11, 0x7b, 0x2b, 0x75, 0xdc, ++ 0x9f, 0x7e, 0x18, 0xef, 0x53, 0x9f, 0x3f, 0x4c, 0x9e, 0xb3, 0x55, 0xfd, ++ 0x38, 0x9e, 0xa6, 0x4e, 0x4f, 0x24, 0x13, 0x28, 0x63, 0x9e, 0x72, 0x34, ++ 0x39, 0x81, 0x51, 0xda, 0xe5, 0x5b, 0x83, 0xfa, 0xf1, 0x35, 0xd8, 0x84, ++ 0xf3, 0x99, 0x52, 0xbc, 0xc9, 0x3e, 0xaa, 0xe7, 0xbb, 0x31, 0xe9, 0xb4, ++ 0xb7, 0x09, 0x1f, 0x0e, 0x2a, 0xc8, 0x2e, 0xd8, 0x84, 0x0f, 0xf8, 0xec, ++ 0x35, 0x7e, 0xff, 0x28, 0x4a, 0x09, 0xa7, 0x9e, 0xbd, 0x3d, 0xa8, 0x3a, ++ 0x39, 0xf0, 0xe6, 0xd6, 0x4d, 0x38, 0x99, 0xf9, 0x00, 0xfb, 0x99, 0x4b, ++ 0x7f, 0xc3, 0x98, 0x81, 0xd8, 0x0c, 0x02, 0xae, 0x5e, 0x8a, 0x13, 0x7c, ++ 0xde, 0x28, 0xeb, 0x3d, 0x5a, 0xa1, 0xfc, 0xfb, 0x1c, 0xcf, 0x83, 0x6c, ++ 0xeb, 0xbd, 0xcc, 0x37, 0xd9, 0xae, 0x70, 0xce, 0x6f, 0xb2, 0xdd, 0x9f, ++ 0x63, 0x6c, 0x4a, 0x1f, 0x27, 0x0d, 0x19, 0xd7, 0x7f, 0xf3, 0xa1, 0xdc, ++ 0xcf, 0x71, 0x3c, 0xc1, 0xff, 0x1b, 0x31, 0x99, 0xfd, 0x01, 0xff, 0xff, ++ 0x08, 0x87, 0xb2, 0x12, 0xdb, 0x8b, 0xe7, 0x96, 0x64, 0x7d, 0x4b, 0xfc, ++ 0x27, 0x38, 0xb5, 0x2e, 0x37, 0x13, 0xe9, 0xa1, 0xaa, 0xc4, 0x0c, 0xda, ++ 0xd1, 0x5f, 0x5e, 0x5f, 0x8d, 0xf7, 0xa3, 0x16, 0x76, 0xec, 0x77, 0x23, ++ 0x3d, 0x40, 0x3e, 0x3b, 0x50, 0x8b, 0x27, 0x77, 0x6a, 0x78, 0x7c, 0xe7, ++ 0x95, 0xd8, 0xb2, 0xf3, 0x6a, 0xec, 0xd9, 0x59, 0x8f, 0x14, 0x73, 0xe5, ++ 0x0f, 0xe7, 0xdb, 0xf6, 0x3c, 0x7e, 0x1e, 0xa5, 0x2f, 0x78, 0xf9, 0xff, ++ 0xa5, 0xa8, 0xf8, 0x89, 0x8e, 0x6b, 0x1d, 0x7f, 0x69, 0xc7, 0x35, 0xce, ++ 0xff, 0x38, 0xe6, 0x65, 0xbb, 0xa3, 0xeb, 0xf3, 0x9b, 0xa2, 0xf7, 0xe7, ++ 0x67, 0x62, 0xeb, 0x50, 0x1d, 0x86, 0x76, 0xd6, 0x26, 0x6a, 0xd9, 0xcf, ++ 0x8a, 0xeb, 0x6d, 0xec, 0x63, 0x5d, 0xa3, 0xa5, 0x3f, 0xba, 0x26, 0xff, ++ 0x1c, 0x3a, 0xf3, 0x7e, 0xf4, 0x0e, 0x05, 0xd8, 0x97, 0xac, 0xef, 0xbb, ++ 0x8f, 0xdf, 0x07, 0xdb, 0x3e, 0x37, 0xff, 0x30, 0xe3, 0xdb, 0xf7, 0xd1, ++ 0xc5, 0x67, 0xa9, 0xa1, 0xf5, 0xe4, 0x54, 0x25, 0x09, 0xaf, 0x69, 0xe3, ++ 0x95, 0xe8, 0x04, 0x6e, 0x67, 0x7b, 0xdb, 0x87, 0xaa, 0x28, 0x53, 0x79, ++ 0xa2, 0x94, 0xf7, 0x6e, 0x89, 0x6e, 0xc0, 0x8e, 0x71, 0x59, 0x03, 0x3c, ++ 0x8e, 0x5b, 0xc8, 0x59, 0x6a, 0x16, 0xb8, 0x7d, 0xa8, 0xd2, 0xdc, 0x67, ++ 0x5b, 0xc5, 0xfe, 0x12, 0xb4, 0x3f, 0xc1, 0xca, 0x75, 0x58, 0xeb, 0x9c, ++ 0xa3, 0xec, 0xc2, 0x8b, 0x49, 0xc1, 0xe9, 0xbb, 0x71, 0x20, 0xb9, 0x0e, ++ 0x5b, 0xd2, 0xb2, 0x47, 0xb8, 0x0c, 0x0d, 0xf9, 0x27, 0xa2, 0xf7, 0x32, ++ 0x9e, 0xba, 0xf2, 0xff, 0x13, 0x4b, 0xf2, 0x19, 0xca, 0x35, 0x1a, 0x5d, ++ 0x9b, 0xdf, 0x13, 0xbd, 0x2f, 0xdf, 0x81, 0x39, 0x79, 0x59, 0x4f, 0xeb, ++ 0x24, 0xbe, 0xcb, 0x7a, 0xda, 0x24, 0xda, 0xf2, 0x6f, 0x63, 0x71, 0xfe, ++ 0x4d, 0xc6, 0x62, 0xc1, 0x0d, 0x59, 0x67, 0x2b, 0xf1, 0xa0, 0x5c, 0xf6, ++ 0x14, 0xbf, 0x8e, 0xad, 0xbb, 0x13, 0x8c, 0x85, 0x45, 0x8c, 0x6a, 0xd2, ++ 0xf6, 0x0b, 0xbe, 0x8c, 0x7b, 0x9c, 0x58, 0x30, 0x98, 0xfe, 0x12, 0xed, ++ 0x51, 0x25, 0xcf, 0x97, 0x38, 0xb3, 0x8e, 0xbe, 0xdc, 0x4d, 0x7e, 0x2e, ++ 0xf1, 0xef, 0x8b, 0x53, 0xf7, 0x85, 0xd7, 0x49, 0xec, 0x0b, 0xe2, 0x48, ++ 0xd6, 0xd9, 0xe7, 0x08, 0x7a, 0xf5, 0xdb, 0xf9, 0x4c, 0xea, 0x7f, 0x1d, ++ 0xa9, 0xdd, 0xcd, 0xf6, 0x76, 0x67, 0xcd, 0x48, 0xc1, 0xb1, 0x30, 0xfb, ++ 0x22, 0x8d, 0xbc, 0x65, 0xaf, 0x9c, 0x3b, 0x5d, 0x27, 0xe7, 0x4e, 0x2d, ++ 0x97, 0x1e, 0xb1, 0xb7, 0xa4, 0x71, 0x5f, 0x25, 0x02, 0x58, 0x96, 0x2b, ++ 0x41, 0xfc, 0x40, 0x39, 0x6e, 0xdb, 0x69, 0xd0, 0x96, 0x2d, 0xda, 0xaf, ++ 0x6e, 0xac, 0x55, 0xca, 0xb1, 0x94, 0xf7, 0xee, 0x19, 0x0a, 0x75, 0x00, ++ 0xe1, 0xe3, 0x27, 0x5d, 0xe5, 0x58, 0xc5, 0xd8, 0x91, 0xc9, 0x2c, 0x43, ++ 0x7c, 0xef, 0x31, 0x58, 0x19, 0xda, 0xe4, 0x2e, 0xe2, 0xcc, 0x6e, 0x37, ++ 0x54, 0xf3, 0xe7, 0xd8, 0x33, 0xaa, 0xa2, 0x7a, 0xd7, 0xf3, 0x76, 0x40, ++ 0x57, 0xf4, 0x8f, 0xc2, 0x79, 0x72, 0x20, 0x37, 0x2a, 0x53, 0xed, 0xc8, ++ 0x11, 0x6b, 0x7c, 0xa9, 0x38, 0xb2, 0xd9, 0x4e, 0x64, 0x88, 0x25, 0x19, ++ 0xf2, 0xa6, 0x8a, 0x94, 0xc1, 0x58, 0x1e, 0xc1, 0x0e, 0xfa, 0x4b, 0x09, ++ 0x73, 0xf9, 0x6d, 0xd9, 0x9b, 0x60, 0x8d, 0xde, 0x81, 0xbe, 0xd1, 0x4e, ++ 0x7e, 0xc8, 0x1f, 0x47, 0x1f, 0x46, 0x5b, 0xee, 0x38, 0xfa, 0xb3, 0x09, ++ 0xda, 0xe3, 0x07, 0xe8, 0xcb, 0x1c, 0xc5, 0x93, 0x83, 0x72, 0xd6, 0xf3, ++ 0x28, 0x1e, 0xe7, 0xf7, 0xc1, 0x41, 0xbd, 0x3b, 0xa0, 0x1e, 0x45, 0x3a, ++ 0xb3, 0x09, 0x77, 0x0c, 0x29, 0xcc, 0xe1, 0x36, 0xe1, 0xf6, 0xbd, 0xb4, ++ 0xc5, 0xc7, 0x36, 0xa2, 0x23, 0xf7, 0x23, 0x24, 0xb3, 0x2f, 0x32, 0xbf, ++ 0xda, 0x80, 0xfe, 0xf4, 0x7a, 0x72, 0xaf, 0xe7, 0xd8, 0xce, 0x61, 0xfa, ++ 0x79, 0x37, 0xc7, 0xf8, 0x08, 0x3f, 0x17, 0x31, 0x5c, 0x0b, 0x2a, 0x45, ++ 0xac, 0xa6, 0xdf, 0xa7, 0xf3, 0x8e, 0x9e, 0xb7, 0xa5, 0x1f, 0xad, 0x74, ++ 0xce, 0x97, 0xeb, 0xc5, 0x35, 0x69, 0x99, 0x8b, 0xe2, 0xba, 0xb9, 0x1b, ++ 0x65, 0x29, 0x59, 0x8f, 0x9e, 0x08, 0x95, 0x91, 0x03, 0x78, 0x53, 0xa2, ++ 0x43, 0xc3, 0xde, 0x9c, 0x16, 0x2c, 0x29, 0x70, 0xf3, 0x97, 0xb2, 0x3f, ++ 0xc7, 0xd6, 0x91, 0x19, 0x58, 0x3c, 0x58, 0x8f, 0x84, 0xdf, 0xb6, 0x9f, ++ 0xa5, 0xaf, 0x25, 0x49, 0xc1, 0x76, 0x0c, 0xc5, 0x89, 0x29, 0x15, 0x28, ++ 0xe4, 0x7a, 0xa2, 0x9b, 0x90, 0x11, 0xfc, 0xc4, 0xfe, 0xc9, 0x1c, 0xce, ++ 0x9b, 0x70, 0xd7, 0x89, 0x6b, 0x2a, 0xd1, 0xe0, 0x2b, 0xac, 0x8b, 0xaf, ++ 0xbd, 0xc8, 0x6d, 0xfe, 0x63, 0xe5, 0xff, 0xd3, 0xff, 0x61, 0xf9, 0xe9, ++ 0xe7, 0xe6, 0x8a, 0xef, 0x16, 0xc9, 0x58, 0xaf, 0x96, 0xf7, 0x9b, 0x2c, ++ 0xe1, 0x4b, 0x72, 0x46, 0xf8, 0x58, 0xb2, 0x84, 0x71, 0x52, 0x5d, 0xe4, ++ 0x81, 0xea, 0xf7, 0xa0, 0x94, 0xf1, 0xac, 0x0e, 0xbd, 0x7e, 0x1b, 0x4b, ++ 0x8c, 0x12, 0x1c, 0x6a, 0x8e, 0xcb, 0x19, 0x8c, 0x2e, 0x8f, 0xc3, 0x47, ++ 0x7f, 0xf2, 0xe5, 0x3f, 0x5c, 0xb7, 0xde, 0x44, 0xee, 0x26, 0x67, 0x0f, ++ 0x3a, 0xf1, 0x4a, 0x8d, 0xbc, 0xef, 0xb4, 0x89, 0x76, 0xac, 0xa0, 0xac, ++ 0x51, 0xd6, 0xd1, 0x82, 0x38, 0xae, 0x37, 0x05, 0x6b, 0x55, 0xc6, 0x73, ++ 0xe5, 0x94, 0x6d, 0xf9, 0x4d, 0xc6, 0x7a, 0x39, 0x5f, 0xf1, 0xc7, 0xf6, ++ 0x30, 0xd6, 0xa0, 0xef, 0xb1, 0x56, 0x4c, 0xae, 0x94, 0xf8, 0xff, 0x86, ++ 0xaf, 0xc8, 0xe9, 0xb6, 0xa5, 0xdf, 0xad, 0x94, 0x33, 0x4b, 0xd2, 0x76, ++ 0x1f, 0xf3, 0x27, 0x8f, 0x1e, 0xc5, 0x29, 0x61, 0x69, 0xce, 0x5e, 0x53, ++ 0x81, 0x53, 0x94, 0xea, 0x0d, 0x53, 0xe5, 0xdf, 0xab, 0x14, 0x7e, 0xb8, ++ 0x2d, 0xbd, 0x89, 0xdc, 0x5c, 0xe4, 0xf9, 0xad, 0xbd, 0xc6, 0x5f, 0xcb, ++ 0xb2, 0xdb, 0xa6, 0x9e, 0x8b, 0x2d, 0xc8, 0x79, 0x1d, 0xb9, 0x27, 0x75, ++ 0x44, 0x67, 0xd3, 0xeb, 0xb8, 0x98, 0x0b, 0x5f, 0x83, 0x87, 0xe8, 0x83, ++ 0xb3, 0xf5, 0x57, 0xed, 0x1e, 0x39, 0x5b, 0xd3, 0xa8, 0x4d, 0xeb, 0xab, ++ 0xb4, 0x4a, 0x64, 0x29, 0xa5, 0x2c, 0x43, 0x69, 0x39, 0x07, 0x7b, 0xde, ++ 0x6e, 0xac, 0x93, 0xe7, 0x4d, 0x95, 0x85, 0xf6, 0x1b, 0x9c, 0x73, 0x85, ++ 0x7b, 0xd2, 0x45, 0xb9, 0x65, 0xbd, 0xd5, 0x5f, 0xec, 0x2b, 0x72, 0x69, ++ 0x3c, 0x22, 0xdb, 0x63, 0x95, 0x9f, 0x94, 0x79, 0xbe, 0xaf, 0x78, 0x5e, ++ 0x76, 0x96, 0x53, 0xa7, 0xd8, 0xa7, 0xc8, 0xb8, 0x89, 0x79, 0xea, 0xe5, ++ 0x63, 0x5c, 0x3c, 0x6d, 0x4c, 0x52, 0x47, 0xc6, 0xa5, 0x4d, 0xd9, 0x41, ++ 0x9c, 0x72, 0x4a, 0x1d, 0xe1, 0xae, 0x9a, 0xc3, 0xc1, 0xab, 0x85, 0x97, ++ 0x8b, 0x6d, 0x54, 0xd9, 0xf6, 0x69, 0x27, 0x66, 0x4a, 0x3b, 0x1c, 0xc7, ++ 0x78, 0x33, 0xed, 0xdc, 0xee, 0x21, 0x7e, 0xda, 0xa7, 0x5b, 0x03, 0xd8, ++ 0x9a, 0x14, 0x5d, 0xeb, 0x81, 0x83, 0xc4, 0x8e, 0x5e, 0x87, 0x6f, 0x78, ++ 0xb0, 0x39, 0x53, 0xdc, 0x3b, 0x2d, 0x95, 0x7d, 0xa5, 0x80, 0xe8, 0x7c, ++ 0xb3, 0x41, 0x9e, 0xa5, 0xb5, 0x05, 0xdd, 0xe4, 0x4a, 0xf7, 0xe2, 0x77, ++ 0x9c, 0x5f, 0x39, 0xfb, 0x5c, 0xd8, 0xc7, 0x4c, 0xd0, 0x8e, 0x0a, 0xf1, ++ 0x0a, 0x8c, 0xef, 0xe4, 0x49, 0x53, 0x67, 0x42, 0x37, 0x67, 0x7f, 0x67, ++ 0x4f, 0x38, 0x67, 0x42, 0x2f, 0xbd, 0xef, 0x92, 0xd1, 0x6c, 0x7b, 0x3f, ++ 0x9f, 0x5d, 0x3a, 0x1f, 0xca, 0x98, 0xae, 0xcb, 0x39, 0xd2, 0x7f, 0xe3, ++ 0xdc, 0x4d, 0x2f, 0x3b, 0x51, 0x53, 0x38, 0x2f, 0x1d, 0x57, 0xdb, 0xf4, ++ 0x22, 0xae, 0x86, 0x2c, 0xcb, 0xc1, 0x55, 0xab, 0xaa, 0xb0, 0x87, 0x15, ++ 0xea, 0xe8, 0x84, 0x65, 0x97, 0xeb, 0x45, 0x1c, 0xd0, 0x8d, 0x79, 0x4a, ++ 0x0f, 0xe6, 0x46, 0xe5, 0xbd, 0x33, 0x84, 0xdc, 0x66, 0x48, 0x3b, 0x83, ++ 0x70, 0xe4, 0xa8, 0xb3, 0x8f, 0x2a, 0xd8, 0xa0, 0xe3, 0xde, 0xac, 0x4e, ++ 0x9b, 0x95, 0xf7, 0x35, 0xe5, 0xbb, 0xd3, 0x3e, 0xbf, 0x0b, 0x96, 0x76, ++ 0x11, 0x4b, 0xad, 0xff, 0xe2, 0x71, 0xda, 0x0b, 0x75, 0x8d, 0x2a, 0xa1, ++ 0x8e, 0x0d, 0x4a, 0xb1, 0x3d, 0xdf, 0xa7, 0xb4, 0x17, 0x61, 0xfd, 0xe0, ++ 0xd4, 0x3b, 0x92, 0x3a, 0xdb, 0xb8, 0x7c, 0xaf, 0x79, 0x66, 0x42, 0xf6, ++ 0xa2, 0x0e, 0x4d, 0x71, 0xc2, 0xa3, 0x7f, 0xb0, 0x17, 0xf5, 0xa9, 0x7d, ++ 0xc6, 0xd9, 0x67, 0x47, 0xb9, 0x12, 0x27, 0x63, 0xe8, 0x41, 0x69, 0x34, ++ 0x1c, 0x79, 0x09, 0x08, 0xba, 0xcd, 0x70, 0x60, 0xd4, 0xd9, 0xef, 0x35, ++ 0xbc, 0x8b, 0xb3, 0x05, 0xff, 0xb1, 0xc6, 0xff, 0xb4, 0x4e, 0x2a, 0x74, ++ 0xbd, 0xb3, 0x49, 0x89, 0x2f, 0x2c, 0x67, 0x3b, 0x91, 0x28, 0x82, 0x25, ++ 0x66, 0x51, 0x47, 0xe1, 0xc8, 0x19, 0xce, 0xe7, 0x91, 0xd6, 0x70, 0x60, ++ 0x9f, 0x73, 0x7e, 0x54, 0xf4, 0x62, 0x78, 0x0b, 0x73, 0xaf, 0x0b, 0xdf, ++ 0x66, 0x3e, 0x99, 0xc0, 0x58, 0xd2, 0xcb, 0xb1, 0x34, 0x69, 0x7d, 0xa8, ++ 0xa1, 0x8d, 0x23, 0xde, 0xdb, 0x4c, 0xfc, 0x4e, 0x22, 0xee, 0xba, 0xb6, ++ 0x1a, 0x09, 0x12, 0x68, 0x97, 0x9e, 0x20, 0x27, 0x6a, 0x8a, 0x3c, 0x4a, ++ 0xfb, 0xcd, 0xf8, 0x43, 0x01, 0x0b, 0x09, 0xbc, 0x90, 0x6c, 0x5b, 0xed, ++ 0x82, 0x65, 0x54, 0x40, 0xde, 0x85, 0x88, 0x77, 0xdd, 0x1a, 0x0e, 0x05, ++ 0x7f, 0x38, 0xb5, 0x5f, 0xbd, 0x39, 0xf9, 0x6b, 0x79, 0xc7, 0x8b, 0xf5, ++ 0xfe, 0x54, 0x19, 0xe9, 0xdb, 0x8b, 0x83, 0x83, 0x83, 0xd8, 0xf2, 0x18, ++ 0x65, 0xd4, 0x6d, 0xb4, 0x19, 0x3d, 0xcc, 0xa5, 0x7d, 0x58, 0xa7, 0xcd, ++ 0x8d, 0xa9, 0x2c, 0xb7, 0x2f, 0x53, 0x58, 0x77, 0xdc, 0xea, 0xec, 0x87, ++ 0xf7, 0x33, 0x47, 0x71, 0xe2, 0xa7, 0xe6, 0x35, 0xe3, 0xca, 0xf6, 0x6c, ++ 0xbb, 0xf2, 0x68, 0x46, 0xda, 0xea, 0x56, 0xfa, 0xb3, 0x9e, 0x6a, 0x94, ++ 0x5b, 0x38, 0x69, 0xbc, 0x39, 0x85, 0x8b, 0x49, 0xe6, 0x5e, 0xc5, 0x77, ++ 0x45, 0x0b, 0x67, 0xd5, 0x9e, 0x25, 0x17, 0x7a, 0x8c, 0xb9, 0xe8, 0xaa, ++ 0x94, 0x05, 0xcd, 0xfc, 0xa5, 0x5d, 0x65, 0x02, 0xdf, 0xc8, 0xeb, 0xe8, ++ 0x4a, 0x95, 0x23, 0xb1, 0xcf, 0xb6, 0x5f, 0x21, 0x57, 0xef, 0xce, 0x37, ++ 0x33, 0x77, 0x7a, 0xd2, 0xae, 0xa0, 0xbf, 0x3c, 0xb8, 0xc0, 0x87, 0x87, ++ 0xf6, 0xf9, 0xf0, 0x5f, 0x19, 0x03, 0xbd, 0x66, 0x05, 0xbf, 0x87, 0x13, ++ 0x67, 0x39, 0x5f, 0x03, 0x8a, 0x1e, 0x9b, 0xa7, 0x84, 0x8d, 0x33, 0xe4, ++ 0x92, 0xf7, 0xe5, 0x65, 0x5d, 0x2c, 0x80, 0x44, 0xde, 0x86, 0x9b, 0x3a, ++ 0xbf, 0x97, 0xf5, 0x17, 0xa7, 0x6c, 0x5b, 0xf2, 0xe6, 0xc4, 0x41, 0xfd, ++ 0xdc, 0x1a, 0xfa, 0x67, 0x4f, 0xde, 0xcb, 0x3e, 0xfb, 0x19, 0x8b, 0x64, ++ 0x9d, 0x21, 0xc8, 0x3e, 0x7d, 0x58, 0x9e, 0xb2, 0x17, 0xbd, 0x19, 0xb5, ++ 0xbe, 0x11, 0x80, 0x8e, 0x87, 0xf2, 0xb2, 0xf6, 0x10, 0x62, 0xdb, 0x0a, ++ 0x5e, 0x8e, 0x46, 0xf0, 0xd5, 0x7c, 0x00, 0xb7, 0xa6, 0x8e, 0x7c, 0xc1, ++ 0x07, 0xeb, 0xb6, 0x0a, 0x34, 0xe3, 0x41, 0x67, 0xef, 0x2d, 0x14, 0x2b, ++ 0x53, 0xea, 0x71, 0xff, 0x41, 0x83, 0x7d, 0xaa, 0x58, 0xc2, 0x76, 0xda, ++ 0x53, 0x57, 0xe3, 0xde, 0x83, 0xad, 0x58, 0x97, 0x9f, 0xcf, 0xbc, 0x51, ++ 0x78, 0x70, 0x89, 0xbc, 0xbb, 0x81, 0x9b, 0x87, 0x9d, 0xf7, 0x5c, 0x94, ++ 0xc5, 0xad, 0x13, 0xe8, 0x21, 0x0f, 0xef, 0xc9, 0xcb, 0x3d, 0xc6, 0xea, ++ 0xb4, 0x81, 0x97, 0x32, 0xf3, 0x99, 0x43, 0xaa, 0x18, 0x15, 0x5f, 0xef, ++ 0x54, 0x38, 0x56, 0x9d, 0xb1, 0x56, 0xec, 0xc7, 0x40, 0xf9, 0x50, 0xb8, ++ 0xe3, 0x36, 0xc5, 0x60, 0x3e, 0x5a, 0xb8, 0x3f, 0x98, 0x7e, 0xde, 0xf6, ++ 0xe9, 0xbf, 0xb0, 0xdd, 0xc4, 0xe4, 0x9a, 0x7d, 0x3a, 0x06, 0x98, 0xcb, ++ 0x06, 0x4c, 0x0b, 0x35, 0x37, 0x98, 0x18, 0x1f, 0xea, 0x21, 0xcf, 0x35, ++ 0x91, 0xdf, 0xab, 0xe3, 0x51, 0xe2, 0x61, 0xd3, 0x90, 0xce, 0xd8, 0x61, ++ 0x62, 0x1e, 0xaf, 0x9f, 0x24, 0xf6, 0xaf, 0x4f, 0x99, 0x38, 0xcd, 0x39, ++ 0x2d, 0xbd, 0x36, 0x5e, 0x53, 0x0a, 0x9d, 0x3e, 0x24, 0xf6, 0x67, 0xe2, ++ 0x2d, 0x82, 0x41, 0x1f, 0xf5, 0xb0, 0x6a, 0x57, 0x0b, 0xce, 0x8f, 0x8a, ++ 0xee, 0x36, 0xe1, 0xba, 0x61, 0x17, 0x9e, 0x31, 0x1a, 0xba, 0x35, 0xb8, ++ 0xf0, 0x61, 0x34, 0xa4, 0xe5, 0x68, 0x63, 0x3f, 0x8a, 0xaa, 0xb0, 0x66, ++ 0xb6, 0x62, 0x29, 0xe5, 0x5a, 0xaa, 0xcb, 0x78, 0x2c, 0x2c, 0x26, 0x87, ++ 0xee, 0x21, 0x0f, 0x7f, 0x1e, 0xb2, 0xb6, 0xa6, 0x02, 0x57, 0xb8, 0x69, ++ 0x33, 0xf2, 0xde, 0xab, 0x4e, 0x4c, 0x16, 0x8c, 0x6c, 0x85, 0xbc, 0x3b, ++ 0x3d, 0x6b, 0xff, 0x22, 0xe6, 0xbb, 0x3a, 0x63, 0x97, 0x97, 0x79, 0x37, ++ 0xb9, 0xc5, 0x02, 0x05, 0xaf, 0x51, 0xae, 0xa1, 0xf4, 0x22, 0xe6, 0xbd, ++ 0x92, 0xcf, 0xab, 0xb8, 0xf6, 0xe0, 0xdd, 0x78, 0x70, 0xe7, 0xbf, 0x54, ++ 0x09, 0x5e, 0x76, 0x46, 0xad, 0xdb, 0x54, 0xe6, 0x75, 0x86, 0x82, 0x36, ++ 0xfa, 0x30, 0xfd, 0xc5, 0x8d, 0x70, 0x3e, 0xc6, 0x72, 0x3a, 0xb1, 0x37, ++ 0x40, 0xfe, 0x4f, 0x39, 0x52, 0xf5, 0x38, 0xc8, 0xbc, 0x20, 0x43, 0xde, ++ 0x93, 0x61, 0x1e, 0x93, 0x19, 0xad, 0xe3, 0x27, 0xc8, 0xcf, 0x1c, 0x7e, ++ 0x74, 0xe7, 0xde, 0x9a, 0x94, 0x82, 0x78, 0xa7, 0xf2, 0x47, 0xde, 0x0b, ++ 0xa6, 0x2d, 0x67, 0x2f, 0x54, 0x15, 0xf8, 0xa3, 0xbc, 0xef, 0x26, 0xb6, ++ 0x6f, 0x61, 0xb4, 0x55, 0xde, 0x7b, 0xfb, 0x73, 0xef, 0xbc, 0x89, 0xfd, ++ 0x76, 0xa3, 0x77, 0xe4, 0x11, 0x6c, 0x1e, 0xe9, 0x70, 0xce, 0xc8, 0x79, ++ 0xf4, 0xd0, 0x59, 0x0b, 0xa1, 0xc3, 0x16, 0x64, 0x3d, 0x16, 0x8a, 0xbe, ++ 0xc0, 0x6b, 0x95, 0xd3, 0x97, 0x3a, 0x86, 0x8e, 0xa1, 0x8f, 0x7c, 0xcb, ++ 0x1f, 0x95, 0xdc, 0xb5, 0xc9, 0xd8, 0xa2, 0xde, 0x42, 0xac, 0x1e, 0x44, ++ 0x8a, 0x73, 0xb1, 0xa3, 0x71, 0x21, 0x76, 0x68, 0xfd, 0xc2, 0x0b, 0xbc, ++ 0x01, 0xf2, 0xe2, 0x00, 0xe7, 0xbd, 0x86, 0x10, 0x50, 0x67, 0xca, 0x79, ++ 0x5c, 0xdd, 0xfa, 0x95, 0xd2, 0x8c, 0xd7, 0xf3, 0x8f, 0xe0, 0xa3, 0x5d, ++ 0x3d, 0xf8, 0x20, 0x5a, 0x65, 0x55, 0x9a, 0x76, 0xcf, 0xcb, 0xd1, 0x50, ++ 0xe7, 0x80, 0x12, 0xef, 0xa8, 0x40, 0xe8, 0xd0, 0x3c, 0x39, 0xbf, 0xb4, ++ 0xcb, 0x39, 0x1f, 0x0b, 0xef, 0x80, 0x45, 0x19, 0xec, 0x45, 0x3b, 0x0d, ++ 0x39, 0x3b, 0x6c, 0x2d, 0x9c, 0x89, 0xd0, 0xf1, 0xfb, 0xa1, 0x9f, 0x0b, ++ 0xbb, 0xa0, 0xa8, 0x66, 0x78, 0xf0, 0xa4, 0xab, 0x87, 0x73, 0xe4, 0xb3, ++ 0x6a, 0x88, 0x9b, 0x3f, 0xce, 0x87, 0x06, 0x6b, 0x5c, 0x95, 0xe8, 0xa4, ++ 0xee, 0xab, 0x5b, 0x6e, 0x65, 0xde, 0x14, 0xda, 0x33, 0xa9, 0x3e, 0x82, ++ 0xb7, 0x76, 0x3d, 0x82, 0x33, 0xfc, 0x9c, 0xda, 0x45, 0x1f, 0xd7, 0x19, ++ 0xa3, 0x98, 0x1b, 0xbf, 0xc5, 0xff, 0x6b, 0x0c, 0xfd, 0xdc, 0xa8, 0xc3, ++ 0x5b, 0x1f, 0xc1, 0xf9, 0x83, 0x8f, 0xe0, 0x63, 0xf6, 0xe9, 0x27, 0x46, ++ 0x8d, 0xa4, 0xec, 0x9e, 0xbb, 0x5a, 0x7e, 0x82, 0x9f, 0xd4, 0x3a, 0xfb, ++ 0xe1, 0xc1, 0x09, 0x1c, 0x76, 0xf2, 0xfd, 0x8c, 0xda, 0x8d, 0x7f, 0xda, ++ 0xfd, 0x08, 0x7e, 0xb2, 0xfb, 0xfb, 0xf6, 0xce, 0x3a, 0x89, 0x83, 0xff, ++ 0xd1, 0xf7, 0xda, 0xe4, 0x5d, 0xf8, 0xe2, 0xbb, 0x6d, 0x0a, 0x92, 0x8d, ++ 0xa1, 0xf5, 0x29, 0x9c, 0xb5, 0xb3, 0x35, 0xff, 0x7f, 0xeb, 0xe8, 0xb0, ++ 0x3d, 0x39, 0x53, 0x74, 0x24, 0x63, 0xec, 0x75, 0xc6, 0x68, 0xa9, 0x1a, ++ 0x6e, 0x23, 0xf7, 0x5e, 0x46, 0x9b, 0xdc, 0xe2, 0x60, 0xa0, 0xbc, 0xe7, ++ 0xa5, 0xe1, 0x56, 0xfa, 0xf6, 0xa3, 0x99, 0xbb, 0xa9, 0x4b, 0xc3, 0xb1, ++ 0xd7, 0xa1, 0x74, 0xc1, 0xa6, 0x37, 0x1a, 0xd6, 0x62, 0x39, 0xf3, 0x4f, ++ 0x8a, 0xd3, 0x56, 0x6a, 0x86, 0xb5, 0x31, 0xda, 0xf4, 0x1c, 0x62, 0xd5, ++ 0x3d, 0x2c, 0xb3, 0x9d, 0xbc, 0x70, 0x55, 0xca, 0x8b, 0x0a, 0xbd, 0x1e, ++ 0xf7, 0xe4, 0x02, 0x58, 0x95, 0xf3, 0x21, 0x9e, 0x23, 0xc8, 0xe7, 0xca, ++ 0xd1, 0x35, 0x2c, 0x39, 0x08, 0x26, 0xe4, 0x1c, 0x6c, 0xc9, 0x7c, 0x3f, ++ 0xf3, 0x08, 0x2f, 0x96, 0xef, 0xaa, 0xc3, 0x72, 0xe6, 0x13, 0x9d, 0xc4, ++ 0x95, 0x1a, 0xe6, 0x61, 0xd5, 0x2d, 0x41, 0x7c, 0x91, 0xf7, 0xef, 0xd8, ++ 0x05, 0xc5, 0xb8, 0x7e, 0x0e, 0xee, 0x60, 0xf0, 0x8f, 0xe7, 0x2a, 0xe8, ++ 0x5b, 0x36, 0xf3, 0x55, 0x15, 0xcb, 0x0e, 0x28, 0xb8, 0x6d, 0xaf, 0x81, ++ 0x5b, 0xd8, 0x57, 0x2f, 0x31, 0xa4, 0x82, 0x31, 0xfe, 0x81, 0xac, 0x81, ++ 0x75, 0x19, 0xc1, 0xa0, 0x5f, 0xd8, 0x2e, 0xbd, 0x05, 0x2f, 0x8d, 0xe8, ++ 0xf4, 0xb3, 0xb0, 0xf6, 0x37, 0x68, 0xc1, 0x91, 0xd1, 0x16, 0xfc, 0x82, ++ 0xb9, 0xee, 0xf9, 0xf9, 0x71, 0xc4, 0x6e, 0x68, 0xc1, 0x9b, 0x2c, 0x97, ++ 0x4c, 0xb7, 0xc2, 0xca, 0x4d, 0xa0, 0x3a, 0x15, 0x43, 0x3a, 0x67, 0x32, ++ 0x37, 0xb4, 0x7b, 0xaa, 0xcd, 0x1e, 0xe6, 0x85, 0x26, 0x06, 0xf6, 0x8a, ++ 0x0e, 0x6c, 0xfb, 0xa3, 0x05, 0x26, 0xb6, 0x0f, 0xea, 0xc4, 0x2c, 0x93, ++ 0x3a, 0x10, 0x5f, 0x35, 0x71, 0x68, 0x50, 0x8f, 0xb9, 0x78, 0x3d, 0x96, ++ 0x69, 0x45, 0x5b, 0x4a, 0x30, 0x4c, 0xce, 0x46, 0xc6, 0x99, 0xd3, 0x35, ++ 0x73, 0xcc, 0x06, 0xc7, 0xdf, 0x30, 0xb1, 0xc8, 0xd5, 0x8e, 0x00, 0xf3, ++ 0xbd, 0x92, 0xe1, 0x1e, 0xbc, 0x61, 0x74, 0x38, 0xd8, 0xd6, 0x4f, 0x7b, ++ 0xb9, 0x3d, 0xd5, 0x01, 0xdf, 0x80, 0xde, 0x95, 0x57, 0xf4, 0xce, 0x5d, ++ 0x8a, 0x60, 0x61, 0x07, 0xca, 0xa8, 0x93, 0xf6, 0xe1, 0x65, 0x70, 0x33, ++ 0x7f, 0xba, 0x79, 0x97, 0xf4, 0x71, 0x07, 0xc6, 0x46, 0x0d, 0xdc, 0x95, ++ 0x12, 0x7d, 0xcb, 0x99, 0xbb, 0x04, 0xee, 0x4d, 0x6e, 0xc2, 0xf9, 0xe1, ++ 0xf8, 0x79, 0x15, 0x72, 0x56, 0x12, 0x64, 0xca, 0xa1, 0x89, 0x93, 0x2e, ++ 0xe6, 0xf5, 0xf3, 0x5d, 0xf4, 0xbd, 0x90, 0xf5, 0xa6, 0x6a, 0x3d, 0xe3, ++ 0x41, 0xc8, 0xaa, 0x53, 0x37, 0xe1, 0xab, 0x9c, 0xdf, 0xef, 0x52, 0x47, ++ 0x89, 0x5a, 0x6b, 0xa3, 0xdc, 0xab, 0x52, 0x0d, 0xce, 0x2b, 0x2c, 0x8f, ++ 0xee, 0x62, 0x8e, 0xd1, 0xd0, 0x51, 0x4e, 0x0c, 0x94, 0xf3, 0xf8, 0x6e, ++ 0x55, 0x64, 0x6f, 0x65, 0x9e, 0xfa, 0x08, 0xde, 0x9e, 0xf2, 0x93, 0x5f, ++ 0xed, 0x2a, 0xf8, 0xc8, 0x49, 0xfa, 0xc8, 0x3d, 0x86, 0x7e, 0x3c, 0xac, ++ 0x86, 0x39, 0x96, 0x47, 0x70, 0x8e, 0x3e, 0x72, 0x9a, 0x36, 0x57, 0x4b, ++ 0x1f, 0x59, 0x41, 0x1f, 0x79, 0xcd, 0x98, 0x85, 0x8f, 0x9d, 0xf5, 0x87, ++ 0x7e, 0xea, 0xa9, 0xe8, 0x23, 0xf2, 0xfd, 0xf8, 0x94, 0x2d, 0x5d, 0x98, ++ 0x5a, 0x63, 0xaf, 0xd6, 0x0a, 0x67, 0x52, 0xa5, 0x6d, 0xdd, 0xd2, 0xe9, ++ 0x93, 0x67, 0xd9, 0xd6, 0x2f, 0x87, 0x1f, 0xc1, 0xfb, 0x9c, 0xcb, 0x8f, ++ 0xa2, 0x47, 0x1e, 0xa8, 0xc2, 0xdc, 0x44, 0x25, 0x26, 0x96, 0xfb, 0xc8, ++ 0x2b, 0x1e, 0x88, 0x86, 0x83, 0xf3, 0x14, 0xca, 0xb3, 0xaf, 0x52, 0x93, ++ 0x75, 0xf9, 0x09, 0xd6, 0x3b, 0xb7, 0x4b, 0x37, 0x3c, 0x94, 0xe1, 0xf4, ++ 0x54, 0xbd, 0x5f, 0xb3, 0xde, 0xc7, 0xd1, 0x23, 0x0f, 0xd5, 0x62, 0xee, ++ 0xfa, 0x2a, 0x4c, 0x3c, 0x5b, 0xc9, 0x7a, 0x1b, 0x5a, 0xc2, 0x91, 0x5d, ++ 0xac, 0x77, 0x6a, 0xdf, 0xff, 0x60, 0x3d, 0x91, 0x43, 0xf8, 0x54, 0x91, ++ 0x73, 0x06, 0xb0, 0x2e, 0x5b, 0x3f, 0xc5, 0xcd, 0x88, 0xa1, 0xc9, 0x43, ++ 0x0e, 0x36, 0x96, 0x98, 0x9d, 0xc4, 0xc4, 0x95, 0xc4, 0xc6, 0x65, 0xc4, ++ 0xc5, 0x0e, 0xe2, 0x62, 0x3b, 0x71, 0x31, 0x4e, 0x5c, 0x34, 0x89, 0x8b, ++ 0x31, 0xe2, 0x62, 0x2b, 0x71, 0xd1, 0x20, 0x2e, 0x42, 0x39, 0xde, 0x7a, ++ 0x0c, 0x9e, 0x21, 0x2f, 0x5e, 0x1a, 0xb4, 0xed, 0xbf, 0x36, 0xe4, 0x6c, ++ 0x4e, 0x0f, 0x79, 0xc0, 0xbc, 0xc0, 0x12, 0x79, 0xff, 0x70, 0xec, 0x6a, ++ 0x7e, 0xee, 0x24, 0x87, 0x21, 0x6e, 0x93, 0xbb, 0x9d, 0x20, 0x36, 0x36, ++ 0x46, 0x1b, 0x82, 0x07, 0xc9, 0x43, 0x1f, 0xd3, 0x65, 0xff, 0xab, 0xa9, ++ 0xff, 0x6a, 0xe8, 0xdd, 0x35, 0xea, 0x16, 0x4c, 0x2e, 0xd7, 0x88, 0x0f, ++ 0x5e, 0x6b, 0x96, 0xb9, 0x02, 0xd7, 0xef, 0xee, 0xc4, 0x0d, 0xbb, 0x71, ++ 0xf4, 0x6a, 0x34, 0x1c, 0xfa, 0x29, 0xc3, 0xe5, 0x4c, 0xb8, 0xfc, 0x7e, ++ 0xcc, 0x1b, 0x3c, 0xc2, 0x79, 0x8d, 0xd7, 0xb9, 0x9a, 0x03, 0x85, 0xb9, ++ 0xf6, 0xcf, 0x90, 0xec, 0x0a, 0xf3, 0xce, 0xc9, 0xbb, 0x83, 0x93, 0x5f, ++ 0x16, 0x3e, 0x56, 0x86, 0xde, 0x88, 0x2a, 0xbf, 0xc3, 0x91, 0x91, 0xf3, ++ 0xc0, 0x7e, 0x5d, 0x70, 0xb9, 0x03, 0x4b, 0x06, 0xac, 0x5b, 0xfc, 0x58, ++ 0x86, 0x8e, 0x81, 0xc2, 0xd8, 0xf5, 0x28, 0xf3, 0x67, 0xf2, 0xc5, 0x6d, ++ 0x4c, 0xf8, 0x1e, 0x6a, 0x8d, 0x71, 0xfc, 0x49, 0x72, 0x75, 0x13, 0xeb, ++ 0xa7, 0xde, 0x71, 0xfb, 0x73, 0x7f, 0x97, 0xde, 0x81, 0x9b, 0xb7, 0xde, ++ 0x0f, 0x5d, 0x7b, 0x46, 0x59, 0x28, 0x7b, 0x59, 0xa4, 0x9f, 0x5e, 0x62, ++ 0x95, 0x17, 0x3f, 0x1d, 0x96, 0xf7, 0x5d, 0xa1, 0xb4, 0xa7, 0x7a, 0xf0, ++ 0xdb, 0x96, 0x02, 0x86, 0x4c, 0x10, 0x43, 0x3e, 0x9b, 0x92, 0x7b, 0xa1, ++ 0x41, 0xf2, 0xf0, 0x45, 0xff, 0x3b, 0xfa, 0xdf, 0x9c, 0xfb, 0x93, 0x0c, ++ 0xa5, 0xd7, 0x0d, 0x2f, 0xc2, 0x91, 0xa8, 0x17, 0x9d, 0x72, 0x9e, 0x69, ++ 0x85, 0xbc, 0x77, 0x65, 0x9d, 0x53, 0x9d, 0xb3, 0xab, 0xff, 0xfe, 0xe5, ++ 0xb5, 0x7a, 0xe8, 0xf8, 0x5b, 0x2e, 0x79, 0xdf, 0xd9, 0xeb, 0xfc, 0x34, ++ 0x8a, 0xf0, 0xfa, 0x57, 0xc9, 0xd9, 0x76, 0x3c, 0x26, 0xfe, 0xd8, 0x90, ++ 0xc8, 0x41, 0xf2, 0xc6, 0xcf, 0xd4, 0xc8, 0x19, 0xf1, 0x3b, 0xc3, 0x52, ++ 0xd7, 0x79, 0xc7, 0x55, 0x71, 0xa7, 0x0e, 0x17, 0xdb, 0xe7, 0xf7, 0xe3, ++ 0x53, 0x32, 0x54, 0x23, 0x58, 0x2b, 0x7a, 0x4f, 0x42, 0x7e, 0xa3, 0xe4, ++ 0xa9, 0x46, 0x64, 0xcb, 0xd0, 0xb0, 0xe7, 0x6b, 0xaa, 0x2b, 0x3b, 0x13, ++ 0x71, 0x2c, 0x09, 0xcf, 0x7b, 0xe6, 0x39, 0x55, 0x9e, 0x2b, 0xb8, 0x42, ++ 0x97, 0x33, 0x6e, 0xba, 0xf6, 0xba, 0x9a, 0xc4, 0xd6, 0xf1, 0x13, 0x76, ++ 0xdc, 0xaf, 0xd1, 0x16, 0xbc, 0x56, 0x29, 0x6d, 0xe3, 0x57, 0x23, 0xb2, ++ 0x57, 0x17, 0xa4, 0x0e, 0x43, 0xc7, 0x9f, 0x55, 0x3b, 0xc9, 0x25, 0x0c, ++ 0xc6, 0xe7, 0x4e, 0xfc, 0x66, 0x64, 0x05, 0xde, 0x1a, 0x69, 0x48, 0xfc, ++ 0x93, 0xeb, 0x33, 0x78, 0x98, 0x71, 0xf2, 0xaf, 0xa3, 0xcb, 0x70, 0x2a, ++ 0xd9, 0x81, 0x77, 0x93, 0xd6, 0x7f, 0x21, 0xfe, 0x3e, 0x93, 0x85, 0x9c, ++ 0xf1, 0x6a, 0x3a, 0xf4, 0x23, 0x35, 0xd4, 0xd9, 0xaa, 0x84, 0x0e, 0x7f, ++ 0x49, 0x59, 0x86, 0xdf, 0x66, 0x3b, 0xf0, 0xbf, 0xb3, 0x45, 0x3b, 0xb0, ++ 0x88, 0xbd, 0x62, 0x03, 0x62, 0x0b, 0x2b, 0x9d, 0xdf, 0x6f, 0xf8, 0x7b, ++ 0xca, 0xb9, 0xe6, 0x73, 0xb4, 0xc3, 0x34, 0xed, 0x30, 0x4d, 0x3b, 0x4c, ++ 0xd3, 0x0e, 0x89, 0x35, 0xdf, 0x4d, 0xd3, 0x0e, 0xe9, 0xa3, 0xcf, 0x12, ++ 0x3b, 0x0a, 0x79, 0x6e, 0x17, 0xe3, 0xc8, 0x4a, 0x7c, 0x3c, 0xd2, 0x8e, ++ 0x5f, 0x92, 0xaf, 0xde, 0xd3, 0x32, 0x31, 0x31, 0x1b, 0xa1, 0x8d, 0xe7, ++ 0x88, 0x47, 0xf9, 0x6c, 0x3b, 0xde, 0x4f, 0x9a, 0xc8, 0x25, 0x1b, 0xe2, ++ 0x5f, 0x55, 0x3e, 0x4f, 0x92, 0x22, 0x7a, 0x8c, 0xe3, 0x24, 0xf3, 0xb1, ++ 0x36, 0xe6, 0xd7, 0xa5, 0xec, 0xef, 0xed, 0x56, 0xb1, 0x8d, 0x18, 0x79, ++ 0x82, 0x21, 0xef, 0xec, 0xff, 0xd9, 0xbf, 0xaf, 0xd3, 0x06, 0x7e, 0xda, ++ 0x72, 0xc1, 0x9e, 0xac, 0x15, 0x5c, 0x5e, 0x89, 0xc8, 0x2e, 0x39, 0x13, ++ 0x20, 0xbe, 0xa3, 0x60, 0x56, 0x74, 0x22, 0x31, 0x8b, 0x63, 0xdd, 0xae, ++ 0xc0, 0xdd, 0x9b, 0x92, 0x35, 0xf8, 0x76, 0xbc, 0xc3, 0xf2, 0x33, 0x69, ++ 0x8b, 0x2f, 0x64, 0xdd, 0xee, 0x47, 0x53, 0xb2, 0x0e, 0xbb, 0x0c, 0x27, ++ 0xb2, 0xab, 0xd4, 0x53, 0x9a, 0x81, 0x2f, 0xe5, 0x56, 0x60, 0xd1, 0x2e, ++ 0x59, 0x2f, 0x8b, 0xe3, 0x40, 0x32, 0x34, 0xf1, 0x3c, 0x56, 0x20, 0x76, ++ 0x70, 0x25, 0x3e, 0xbb, 0x4b, 0xc1, 0x47, 0xe1, 0x95, 0xb8, 0x8e, 0xdf, ++ 0x1b, 0x77, 0xd9, 0xf6, 0x51, 0xa3, 0xd5, 0xee, 0x5b, 0x29, 0xba, 0x12, ++ 0xdf, 0xfd, 0x9d, 0x86, 0xaa, 0x95, 0xa0, 0x33, 0x79, 0xdd, 0x26, 0x31, ++ 0x39, 0xb9, 0x02, 0x73, 0x77, 0x35, 0x68, 0xed, 0x68, 0x18, 0x3c, 0xc9, ++ 0xfa, 0x2d, 0x07, 0x67, 0xd3, 0x26, 0xa4, 0xac, 0x8c, 0x73, 0xa2, 0x46, ++ 0x7e, 0xd7, 0xa0, 0x94, 0xb2, 0x45, 0x86, 0x25, 0xc7, 0x6e, 0xd3, 0xbc, ++ 0xa8, 0xc7, 0xcd, 0xfe, 0xab, 0x91, 0xdd, 0x4d, 0xcf, 0x4a, 0x61, 0xa2, ++ 0x82, 0xb1, 0xb2, 0x3d, 0xaa, 0x77, 0xec, 0x50, 0x64, 0xfd, 0x2e, 0x81, ++ 0x17, 0x93, 0xe1, 0x88, 0xae, 0xd8, 0x8b, 0x46, 0x8d, 0xa6, 0xfe, 0x6d, ++ 0xcc, 0x4b, 0x82, 0xb5, 0x57, 0xe3, 0xc0, 0x98, 0x9c, 0x3f, 0xe9, 0x42, ++ 0x94, 0x7c, 0x7a, 0x73, 0xda, 0xfa, 0x82, 0x9b, 0xb9, 0x4f, 0xa9, 0x1e, ++ 0x0a, 0xcc, 0x51, 0x43, 0xe7, 0xd6, 0x43, 0x3f, 0xfe, 0x0e, 0x63, 0xea, ++ 0x2f, 0xe7, 0xcb, 0x6f, 0x34, 0x54, 0xd1, 0xfe, 0x9b, 0x31, 0x6b, 0x3c, ++ 0xb4, 0xfe, 0x63, 0xa5, 0x12, 0xf9, 0x21, 0x37, 0x5e, 0x5f, 0x50, 0x89, ++ 0x67, 0xf6, 0xd6, 0x56, 0xcb, 0x59, 0xe6, 0x5a, 0x5d, 0x81, 0xc4, 0xf5, ++ 0x3f, 0x6e, 0xa7, 0x5d, 0x76, 0xb0, 0x4e, 0x6c, 0x74, 0xbb, 0x8c, 0xc1, ++ 0xb1, 0xd7, 0x6d, 0xb4, 0x83, 0x13, 0x83, 0x41, 0x84, 0xa3, 0xdb, 0x95, ++ 0x4c, 0xe1, 0x7d, 0x31, 0xe6, 0x26, 0x16, 0x92, 0xe4, 0xa5, 0x3b, 0x86, ++ 0x82, 0x8c, 0xbd, 0xe2, 0x57, 0x0a, 0x71, 0xbc, 0x1a, 0xf1, 0x9a, 0xa0, ++ 0x93, 0x73, 0xbc, 0x9e, 0x4c, 0x20, 0x95, 0x6c, 0x5a, 0x5f, 0xa5, 0xba, ++ 0xe4, 0xcc, 0x7f, 0x0c, 0x6a, 0x02, 0x7d, 0xc9, 0x42, 0xbd, 0xde, 0xd6, ++ 0x8d, 0xf8, 0x5a, 0xb2, 0xa9, 0xfb, 0x63, 0x38, 0xbf, 0x45, 0x10, 0x9c, ++ 0xc4, 0x46, 0xac, 0x4b, 0xca, 0x3b, 0x13, 0x62, 0xe3, 0x16, 0x4e, 0xb5, ++ 0xfa, 0xf1, 0xb3, 0xe4, 0x46, 0x3c, 0x9f, 0x6c, 0x22, 0xce, 0x0b, 0xdf, ++ 0x0d, 0x05, 0x83, 0xae, 0x8d, 0x18, 0x4d, 0x36, 0x04, 0x86, 0xe9, 0x88, ++ 0x09, 0x2d, 0x82, 0xfd, 0xe3, 0xcc, 0x92, 0xc8, 0x37, 0x0f, 0x91, 0x33, ++ 0x1e, 0x48, 0x37, 0x69, 0xf7, 0xaa, 0x7f, 0x23, 0x7b, 0x5a, 0x01, 0xf9, ++ 0x69, 0xa3, 0xa3, 0x49, 0x1f, 0xfd, 0xdd, 0x42, 0x80, 0x79, 0x8e, 0x9e, ++ 0x6f, 0xc5, 0xab, 0xc9, 0x27, 0x6d, 0xcd, 0x0c, 0x27, 0xce, 0x29, 0x6e, ++ 0x5c, 0x97, 0x5f, 0x84, 0x97, 0x89, 0x97, 0x95, 0xd7, 0x4b, 0x3e, 0x13, ++ 0x44, 0x39, 0xf3, 0xa1, 0x12, 0xe6, 0x38, 0x4d, 0xfb, 0xe4, 0xb7, 0x6e, ++ 0x6c, 0xfb, 0x58, 0xab, 0x1e, 0x3f, 0x45, 0x3f, 0x57, 0xcd, 0x24, 0xf9, ++ 0x7a, 0x38, 0xa8, 0x2a, 0x3e, 0xb6, 0xe1, 0xc7, 0x5b, 0xc9, 0x00, 0x82, ++ 0xf9, 0x08, 0xc6, 0xc9, 0xa1, 0x1a, 0x98, 0xa7, 0x9c, 0x4b, 0xfe, 0xce, ++ 0x9e, 0x4d, 0x3c, 0x3b, 0x7f, 0x43, 0x3d, 0x62, 0x79, 0xd9, 0x63, 0xd6, ++ 0xd7, 0x3f, 0xce, 0xb8, 0xf6, 0x45, 0xc6, 0x2f, 0xd9, 0x63, 0xfe, 0x80, ++ 0x32, 0x5c, 0x4b, 0x2e, 0x1d, 0x3c, 0xf8, 0x39, 0x7e, 0x9a, 0x61, 0xe4, ++ 0x83, 0x68, 0x66, 0xfd, 0x20, 0xdb, 0x7a, 0x3f, 0x19, 0xc1, 0xd3, 0xe9, ++ 0x86, 0x8e, 0xaf, 0x29, 0x0d, 0xcc, 0xbb, 0x6b, 0x18, 0x2b, 0x35, 0x34, ++ 0xe6, 0x6f, 0xc4, 0xd9, 0x41, 0x37, 0x9a, 0x53, 0x10, 0x9b, 0x78, 0x40, ++ 0x23, 0xce, 0x0e, 0x28, 0xb2, 0xaf, 0xd6, 0x64, 0x10, 0x67, 0x3a, 0xda, ++ 0x98, 0x33, 0x37, 0x2a, 0xc2, 0xcf, 0x81, 0x08, 0xcb, 0xbe, 0x35, 0x58, ++ 0x8e, 0x86, 0x7d, 0x49, 0xe6, 0x1c, 0x25, 0x38, 0xbf, 0xdb, 0x8b, 0x85, ++ 0x07, 0x75, 0x27, 0x47, 0x54, 0x75, 0xf1, 0x03, 0xa0, 0x6d, 0xaf, 0x85, ++ 0x13, 0xad, 0x77, 0x23, 0xbc, 0x53, 0xde, 0x35, 0x91, 0x98, 0x2a, 0xef, ++ 0x0a, 0x08, 0x47, 0xd2, 0xa9, 0x33, 0x1d, 0xfb, 0xd3, 0xd6, 0xef, 0x54, ++ 0xce, 0xed, 0xd6, 0x34, 0xda, 0x98, 0x77, 0x13, 0xe7, 0xc2, 0x13, 0xba, ++ 0xcb, 0x4d, 0x7e, 0x20, 0x1c, 0x23, 0x86, 0x71, 0x8e, 0x37, 0x4d, 0xfe, ++ 0x9f, 0x4f, 0xd6, 0x23, 0x45, 0xfe, 0x6f, 0x91, 0xff, 0x5b, 0xe4, 0xfa, ++ 0x16, 0xf9, 0xbf, 0x45, 0xfe, 0x6f, 0x91, 0xff, 0x5b, 0xe4, 0xff, 0x56, ++ 0x76, 0x11, 0xc6, 0x06, 0x55, 0xf4, 0x8d, 0x26, 0x95, 0xf8, 0x0a, 0xb1, ++ 0xef, 0x08, 0xbe, 0x4d, 0x39, 0x12, 0xcb, 0x6f, 0xc4, 0xbe, 0xc1, 0x9b, ++ 0xf8, 0x51, 0xb0, 0x8c, 0x36, 0x97, 0xcc, 0x48, 0xbb, 0x5e, 0x0c, 0x67, ++ 0x0b, 0xb9, 0x94, 0x76, 0xc3, 0x26, 0x54, 0x33, 0x1f, 0xfb, 0x88, 0x9c, ++ 0x60, 0x62, 0xa6, 0x9c, 0xdb, 0x34, 0xf8, 0x11, 0x79, 0x64, 0xdf, 0xd0, ++ 0x42, 0xd9, 0x02, 0x60, 0xff, 0xe0, 0x26, 0x44, 0x86, 0x5c, 0x58, 0xd5, ++ 0x62, 0xa0, 0x37, 0x23, 0x63, 0x95, 0x71, 0xc8, 0x3e, 0xa6, 0x82, 0x73, ++ 0x8f, 0x35, 0x74, 0x3f, 0x0e, 0x4c, 0x54, 0x32, 0x47, 0x0b, 0x90, 0xc7, ++ 0x3c, 0x9e, 0x4e, 0x32, 0xef, 0x71, 0xe1, 0x54, 0xb4, 0x05, 0xcd, 0xbb, ++ 0x6b, 0xf1, 0xf2, 0xce, 0x50, 0xc7, 0xc7, 0xd0, 0xc9, 0x4f, 0xed, 0x45, ++ 0x6b, 0xa2, 0x61, 0xa3, 0x4d, 0x69, 0x41, 0xe3, 0x58, 0x0b, 0x1a, 0x1e, ++ 0x0b, 0xc5, 0xc2, 0xd4, 0xa3, 0x37, 0xba, 0x08, 0x3d, 0x46, 0x1c, 0x6f, ++ 0x93, 0x77, 0xe9, 0xfb, 0xe5, 0xb7, 0x91, 0x84, 0xe3, 0x84, 0x62, 0x67, ++ 0x20, 0xb9, 0x53, 0x2b, 0xc6, 0xb2, 0x50, 0x76, 0x2c, 0x98, 0xc0, 0x9a, ++ 0x01, 0x05, 0xed, 0xd7, 0x09, 0x77, 0x13, 0x7c, 0x32, 0xf1, 0xf4, 0x60, ++ 0xfc, 0x84, 0x9b, 0xb1, 0x7d, 0x29, 0xf9, 0xd8, 0xc1, 0x8c, 0xe4, 0x80, ++ 0xcf, 0x93, 0xeb, 0x9a, 0x98, 0x3b, 0x24, 0x76, 0x63, 0x22, 0x42, 0x8e, ++ 0x96, 0x26, 0x46, 0xda, 0x43, 0xfa, 0x04, 0x75, 0x6a, 0xcd, 0x72, 0x99, ++ 0x38, 0xbb, 0x37, 0x89, 0x1d, 0x69, 0x99, 0x9f, 0x20, 0xfe, 0x62, 0x20, ++ 0x8e, 0x3b, 0x72, 0x3a, 0xbe, 0x3a, 0xd0, 0x8e, 0xdb, 0x73, 0x11, 0x6c, ++ 0x18, 0xe8, 0xc0, 0xb2, 0x5c, 0x33, 0xfb, 0x11, 0x6e, 0xb2, 0x0c, 0x6d, ++ 0xb9, 0x20, 0x0e, 0xa6, 0xe5, 0x7c, 0x42, 0x0d, 0x5e, 0xd2, 0x82, 0x9c, ++ 0xa7, 0x26, 0x92, 0xad, 0x06, 0xcb, 0x0d, 0x7d, 0xcf, 0x46, 0x35, 0x64, ++ 0x25, 0x10, 0x1a, 0x4c, 0xe0, 0x2f, 0x1d, 0x7c, 0xd1, 0x40, 0xb6, 0xb1, ++ 0x4b, 0x78, 0x85, 0x13, 0xd7, 0xec, 0x53, 0x86, 0x1f, 0x63, 0x63, 0xd9, ++ 0x2a, 0xf1, 0xf3, 0x1a, 0xfd, 0xea, 0x5a, 0x79, 0xbf, 0x9f, 0x7e, 0x4e, ++ 0x4c, 0x2f, 0xe4, 0xc5, 0x3a, 0xf5, 0xdf, 0x35, 0x28, 0x31, 0xb1, 0x07, ++ 0x9e, 0xf9, 0x92, 0x27, 0x06, 0x69, 0xcf, 0x11, 0x8c, 0x92, 0x17, 0xbf, ++ 0xb6, 0xb7, 0x60, 0x1b, 0x83, 0x94, 0x33, 0x97, 0xb6, 0x3e, 0x4f, 0xaf, ++ 0x6b, 0xab, 0x30, 0xc3, 0xf1, 0x0f, 0x51, 0xf0, 0x83, 0x0a, 0xea, 0xcc, ++ 0x4d, 0x7b, 0x3e, 0x95, 0x94, 0x32, 0xf2, 0x6e, 0x14, 0x66, 0x95, 0x23, ++ 0x00, 0x0f, 0xfd, 0xeb, 0x83, 0xa4, 0xdd, 0xe3, 0xa5, 0x2f, 0xb8, 0x17, ++ 0xd4, 0xc3, 0x97, 0xbf, 0x09, 0xef, 0x0e, 0xd6, 0x63, 0x76, 0x2a, 0x80, ++ 0x40, 0x0a, 0x27, 0xca, 0xa0, 0xde, 0x50, 0x86, 0xd0, 0xfa, 0xf3, 0xae, ++ 0xb0, 0x76, 0x1f, 0x9a, 0xba, 0xbf, 0xa7, 0x84, 0x36, 0xaa, 0xae, 0x50, ++ 0xd7, 0x6b, 0xcc, 0xe9, 0x2b, 0xe9, 0x47, 0x15, 0xf4, 0x15, 0xe4, 0x69, ++ 0xe6, 0xac, 0x77, 0x6a, 0x50, 0xfc, 0xcb, 0x43, 0x31, 0xfc, 0xf0, 0x1c, ++ 0x74, 0xcb, 0x6f, 0x82, 0x4c, 0x78, 0x74, 0xbd, 0xeb, 0x6d, 0xa5, 0x0e, ++ 0xbe, 0x83, 0x37, 0xe1, 0xbd, 0x41, 0x62, 0x85, 0xf8, 0x2c, 0x9f, 0x9d, ++ 0x1e, 0x99, 0x83, 0x12, 0xda, 0x3c, 0xe8, 0xcf, 0x6f, 0xd1, 0xfe, 0x5c, ++ 0x07, 0xa5, 0xdf, 0x1b, 0x61, 0x0f, 0x36, 0x1c, 0x7f, 0xd7, 0xa5, 0x20, ++ 0xc6, 0xbc, 0x26, 0x30, 0x95, 0xbb, 0x6b, 0xe4, 0x05, 0xe3, 0x39, 0xc3, ++ 0xc9, 0xd9, 0xf7, 0xd0, 0x4e, 0x36, 0xa7, 0xa1, 0x54, 0x5f, 0xdf, 0x02, ++ 0x1f, 0xed, 0xe4, 0xd6, 0x11, 0xcb, 0xd6, 0x74, 0x3d, 0x96, 0x25, 0x2f, ++ 0x58, 0x1a, 0x0d, 0x07, 0x4e, 0x93, 0x97, 0xbb, 0x68, 0x27, 0x65, 0x8f, ++ 0xc9, 0xbc, 0xca, 0xbc, 0x2f, 0xc2, 0xa2, 0x68, 0x1c, 0xe7, 0x69, 0x27, ++ 0xb3, 0xf6, 0x0b, 0x3f, 0xb7, 0xed, 0x80, 0x5e, 0xe0, 0xe8, 0x1f, 0x0d, ++ 0xc4, 0x90, 0x22, 0x47, 0x1f, 0x18, 0xea, 0xc1, 0x3e, 0xda, 0xc3, 0xe6, ++ 0xbd, 0x92, 0xe3, 0x9b, 0x94, 0x53, 0x37, 0x96, 0x30, 0xf6, 0x9d, 0xce, ++ 0x88, 0x5d, 0x9a, 0xb8, 0xe6, 0x31, 0xfd, 0x5c, 0x03, 0xaf, 0x17, 0xed, ++ 0x2f, 0xc8, 0x33, 0x9b, 0xb1, 0xe6, 0x70, 0xae, 0x1d, 0xdf, 0xc9, 0x75, ++ 0x60, 0x7c, 0x48, 0xf8, 0x8a, 0xbc, 0xa3, 0xde, 0xe1, 0xc8, 0xd7, 0x97, ++ 0x16, 0xbc, 0xed, 0xa0, 0x4e, 0x75, 0x6d, 0x58, 0x09, 0x77, 0xde, 0x86, ++ 0x0e, 0xbc, 0x97, 0xbd, 0x09, 0xc7, 0x06, 0x19, 0xcf, 0xe9, 0x03, 0xfd, ++ 0x69, 0xdd, 0xf9, 0xfd, 0x99, 0xb2, 0x9d, 0x77, 0xe0, 0x81, 0xd1, 0x04, ++ 0x4e, 0xa5, 0x83, 0x53, 0xef, 0x35, 0xb7, 0xda, 0x8f, 0x73, 0x2e, 0xf3, ++ 0xe9, 0xf8, 0xb7, 0x54, 0x6c, 0xc2, 0x67, 0x1f, 0xc3, 0x3f, 0x90, 0x8f, ++ 0xaf, 0x0f, 0xa8, 0x2a, 0x79, 0xa9, 0x70, 0xb6, 0xa7, 0xe5, 0xbd, 0x72, ++ 0xe3, 0x15, 0x45, 0x78, 0x99, 0x85, 0xc5, 0x0b, 0x36, 0xe1, 0x01, 0xe2, ++ 0xcd, 0xa2, 0xa8, 0x0b, 0x93, 0x33, 0xa4, 0x9e, 0x95, 0x20, 0x2f, 0x37, ++ 0x7e, 0x24, 0xeb, 0xf0, 0xba, 0xcc, 0xb1, 0x0b, 0x2f, 0x45, 0x1b, 0xba, ++ 0xc6, 0x14, 0x17, 0xd6, 0x47, 0xe5, 0xfd, 0x4d, 0x39, 0xb3, 0x2c, 0xd8, ++ 0x12, 0x43, 0xf8, 0x20, 0x9c, 0xb3, 0x18, 0xf2, 0x4e, 0xcf, 0x1b, 0x83, ++ 0xc7, 0x1d, 0x7b, 0x0a, 0xb7, 0x14, 0xb9, 0xb5, 0x77, 0x86, 0xac, 0xd3, ++ 0xef, 0xa7, 0x6d, 0x6d, 0x4d, 0xcb, 0x79, 0x3f, 0x17, 0x02, 0xcc, 0x83, ++ 0x32, 0xa3, 0xa0, 0xff, 0xb4, 0xe2, 0x17, 0xc9, 0x72, 0x64, 0x32, 0x49, ++ 0xe7, 0x9c, 0xd3, 0xf3, 0x59, 0x0b, 0x6e, 0x53, 0xd6, 0x2c, 0x7c, 0x38, ++ 0x9c, 0xf1, 0x11, 0x6b, 0x9e, 0xb4, 0x2b, 0x89, 0xc5, 0xe3, 0x99, 0x70, ++ 0xfc, 0x28, 0xb1, 0xf8, 0xdb, 0x0b, 0x7e, 0x69, 0xd7, 0x10, 0x87, 0xf7, ++ 0xa4, 0x75, 0xa3, 0x82, 0xd7, 0x0b, 0xaf, 0xd7, 0x13, 0x3f, 0x83, 0x0f, ++ 0x59, 0xe2, 0x90, 0x2b, 0x5d, 0x8b, 0xd9, 0xbb, 0xfb, 0x9d, 0x73, 0x3f, ++ 0xfb, 0x79, 0x5d, 0xc6, 0xfc, 0x36, 0x93, 0x0d, 0x3a, 0xeb, 0x11, 0x4f, ++ 0x65, 0x65, 0x5d, 0x22, 0x80, 0xf2, 0xb4, 0xbd, 0xe8, 0xdd, 0xf9, 0x56, ++ 0x4d, 0x19, 0x88, 0xb7, 0xe4, 0xd9, 0xb5, 0xe9, 0x50, 0xf7, 0xcd, 0x8c, ++ 0x53, 0x1f, 0xcd, 0x37, 0xf0, 0x1d, 0x62, 0x9a, 0x37, 0x2d, 0xf3, 0x73, ++ 0xe4, 0x81, 0x6a, 0x58, 0x0d, 0x55, 0x90, 0x75, 0x49, 0x95, 0x7e, 0x23, ++ 0x63, 0xac, 0xc7, 0xb7, 0x47, 0x5b, 0x29, 0x73, 0x33, 0x0e, 0x91, 0x8f, ++ 0x44, 0xf7, 0x5b, 0xf8, 0x19, 0xb1, 0xb4, 0x79, 0xb7, 0xf8, 0x36, 0xda, ++ 0x84, 0xc7, 0x6e, 0x8f, 0x86, 0x63, 0x8b, 0xe9, 0x13, 0xef, 0xe4, 0xc4, ++ 0x9e, 0xe4, 0x9d, 0x4f, 0x4c, 0xd4, 0x10, 0x23, 0xee, 0x49, 0x0a, 0x96, ++ 0x05, 0x60, 0xe7, 0x5a, 0xb1, 0x82, 0xd8, 0xf9, 0x31, 0x73, 0xcc, 0x49, ++ 0xe6, 0x98, 0x93, 0x39, 0x3f, 0x26, 0x0f, 0xd4, 0xf1, 0x13, 0xe4, 0x67, ++ 0x0e, 0x3f, 0x3a, 0xef, 0xa9, 0x38, 0xcb, 0x9c, 0xf1, 0x1c, 0xe7, 0x7d, ++ 0x87, 0x83, 0x5f, 0x5e, 0x6c, 0xcc, 0x01, 0xaf, 0x0c, 0x19, 0xf8, 0xea, ++ 0xde, 0xc2, 0x5c, 0x6f, 0x91, 0xdf, 0xb3, 0x1b, 0x8a, 0x62, 0x2b, 0x6d, ++ 0x69, 0x38, 0xdd, 0x82, 0x65, 0xbb, 0xf4, 0xce, 0x21, 0x25, 0x1c, 0xb8, ++ 0x85, 0x78, 0xb6, 0xf8, 0x60, 0x0b, 0xee, 0x21, 0x7f, 0x3d, 0x39, 0xbf, ++ 0x05, 0x6d, 0xfb, 0x36, 0x21, 0xf6, 0x98, 0x8a, 0xea, 0xf9, 0x12, 0x53, ++ 0xa5, 0x9e, 0xe0, 0xa9, 0xf8, 0x7d, 0x2b, 0xfa, 0x88, 0x65, 0x2b, 0x5a, ++ 0x27, 0x98, 0x03, 0x3e, 0x6f, 0x57, 0xe9, 0xc4, 0x0a, 0x35, 0x86, 0x27, ++ 0x89, 0x65, 0x7b, 0x98, 0x13, 0x54, 0xcf, 0x37, 0x91, 0xce, 0x48, 0x1e, ++ 0x68, 0xa2, 0x72, 0x48, 0x72, 0x40, 0x13, 0x15, 0x7b, 0x25, 0x5f, 0x35, ++ 0x39, 0xb7, 0x41, 0x2c, 0xbc, 0xde, 0xc4, 0xcf, 0x32, 0xc2, 0x07, 0x04, ++ 0x1f, 0x05, 0x73, 0x82, 0x58, 0x36, 0x20, 0x7b, 0x63, 0x3a, 0x16, 0x13, ++ 0xc3, 0xf6, 0x67, 0x23, 0xb8, 0x85, 0x18, 0xf6, 0x54, 0xb6, 0x19, 0x37, ++ 0x0f, 0x2c, 0x23, 0x6e, 0x3a, 0x76, 0x40, 0x9f, 0x7b, 0xb8, 0xa6, 0x90, ++ 0x63, 0xad, 0xc0, 0x2b, 0x23, 0xf2, 0x3e, 0x88, 0x8e, 0xaf, 0x0c, 0x84, ++ 0xfa, 0xbf, 0xaa, 0xac, 0xc0, 0x1b, 0xa3, 0x45, 0x7e, 0xa4, 0xa0, 0x2f, ++ 0x53, 0x18, 0x63, 0x25, 0x6d, 0x64, 0x20, 0xfb, 0x03, 0x62, 0x96, 0x13, ++ 0x1f, 0xe8, 0xd1, 0x4f, 0xcc, 0x90, 0xb3, 0x15, 0x3f, 0xc6, 0xa4, 0x93, ++ 0x17, 0x55, 0x9a, 0xc5, 0x7d, 0xdd, 0xe2, 0x7e, 0x8f, 0x85, 0xef, 0x2c, ++ 0x08, 0x60, 0x19, 0x79, 0xfd, 0xa1, 0x05, 0x25, 0xb8, 0x6d, 0x57, 0x27, ++ 0xc6, 0x76, 0x7e, 0x80, 0xb2, 0x21, 0xf5, 0x2e, 0x1f, 0x1a, 0x22, 0xf7, ++ 0x2b, 0x3d, 0x58, 0x1c, 0x95, 0x77, 0xaf, 0x64, 0xaf, 0x62, 0x10, 0xbd, ++ 0xfb, 0x89, 0x93, 0xe3, 0x57, 0xe1, 0x08, 0xb9, 0xf1, 0x33, 0xc6, 0x07, ++ 0x28, 0x19, 0xf2, 0x38, 0x67, 0x30, 0x8f, 0x18, 0xf3, 0xb1, 0x62, 0xea, ++ 0x0c, 0x26, 0xea, 0x2e, 0xdf, 0xc3, 0x81, 0xaf, 0x72, 0xea, 0x37, 0x27, ++ 0x0a, 0xef, 0x5b, 0xd1, 0x7f, 0x73, 0x6a, 0x4d, 0xe1, 0x4c, 0xd6, 0x7f, ++ 0xa4, 0x6c, 0x37, 0xba, 0x98, 0xbf, 0x2e, 0xdf, 0xf5, 0x4d, 0xdc, 0x31, ++ 0xdc, 0xd8, 0x1d, 0x53, 0x6d, 0xfb, 0x4c, 0x74, 0x02, 0x47, 0xa3, 0x65, ++ 0xb0, 0xfc, 0xc4, 0xe8, 0x6b, 0x6f, 0x90, 0x57, 0x7c, 0xf9, 0x77, 0xd2, ++ 0x0e, 0xde, 0x25, 0xed, 0xfd, 0xf7, 0xea, 0x82, 0x0f, 0xad, 0xf3, 0xcb, ++ 0x39, 0xa6, 0xe7, 0xd3, 0x3f, 0x27, 0x17, 0x93, 0xeb, 0xe2, 0xfd, 0x37, ++ 0x99, 0x0b, 0xc8, 0xfd, 0x39, 0x53, 0xf5, 0xbe, 0x39, 0x35, 0xff, 0xdf, ++ 0xe4, 0xfc, 0x5f, 0xac, 0x43, 0x6c, 0x90, 0x3d, 0x41, 0x79, 0xaf, 0x48, ++ 0xd6, 0x34, 0x64, 0x8f, 0x50, 0xf6, 0xad, 0xbe, 0x8e, 0xde, 0xdd, 0xb2, ++ 0xa6, 0x6c, 0xdb, 0xf7, 0xea, 0xb2, 0xb7, 0x5a, 0x3c, 0xaf, 0x28, 0xed, ++ 0x58, 0x8a, 0x95, 0x95, 0xba, 0x5b, 0x94, 0xc1, 0xec, 0xf4, 0x31, 0xcd, ++ 0x90, 0xdf, 0x5a, 0xd4, 0x2a, 0xcc, 0xe9, 0x63, 0xeb, 0x57, 0xfa, 0xb2, ++ 0x87, 0x95, 0x1d, 0xd9, 0xcb, 0xf5, 0xf1, 0xac, 0x1d, 0xef, 0x94, 0x36, ++ 0x44, 0xa6, 0x21, 0xca, 0x22, 0x72, 0x15, 0x9f, 0x3d, 0x3d, 0x25, 0x77, ++ 0x29, 0xb9, 0x6c, 0x41, 0xee, 0x55, 0x94, 0xdb, 0x98, 0x1f, 0x87, 0x7a, ++ 0xfd, 0x74, 0xd9, 0x8b, 0xe3, 0xfc, 0xeb, 0x8b, 0x6d, 0x15, 0xca, 0x4d, ++ 0xf0, 0xb9, 0x94, 0x9d, 0xbe, 0x57, 0x52, 0x02, 0x8f, 0x19, 0xd6, 0xb6, ++ 0x3a, 0x7b, 0x14, 0x06, 0xd6, 0x7c, 0x32, 0x6f, 0x10, 0x7c, 0xc2, 0x58, ++ 0x52, 0xc3, 0x69, 0xe3, 0x82, 0x3d, 0x31, 0x75, 0x16, 0xfa, 0xdb, 0xcc, ++ 0x43, 0x9e, 0x4e, 0x86, 0x3a, 0xd6, 0x29, 0x4d, 0xf1, 0x79, 0xf4, 0x5d, ++ 0xf9, 0x7d, 0x1f, 0xc1, 0x33, 0xf9, 0x0d, 0xb5, 0x6c, 0x38, 0x46, 0x9b, ++ 0x36, 0xf1, 0x5a, 0x32, 0xb4, 0xf1, 0x6d, 0xa5, 0xf0, 0xdb, 0x6c, 0xaf, ++ 0x3a, 0xef, 0xd1, 0x14, 0xed, 0x2e, 0x22, 0xbf, 0xd3, 0x35, 0x6d, 0x8d, ++ 0x52, 0x6c, 0x30, 0x34, 0x98, 0x61, 0x0c, 0xce, 0xf8, 0x65, 0x6f, 0x22, ++ 0x22, 0xbc, 0x3c, 0xa0, 0xe2, 0x06, 0xe6, 0xc0, 0xb2, 0x37, 0xf5, 0xea, ++ 0xd4, 0x6f, 0xef, 0xb0, 0xde, 0x9f, 0x58, 0x87, 0x93, 0xdf, 0x35, 0x2b, ++ 0xd8, 0x4b, 0x04, 0xd6, 0x38, 0x73, 0x76, 0xad, 0x90, 0x47, 0xce, 0xa0, ++ 0xae, 0xfd, 0x7a, 0xe5, 0x4c, 0x94, 0x7b, 0x98, 0xbb, 0xb8, 0x11, 0x6d, ++ 0x94, 0xdf, 0xfa, 0xb8, 0x82, 0xfc, 0x3a, 0xa4, 0xc5, 0xd5, 0x08, 0xfd, ++ 0x15, 0x28, 0x4d, 0xc9, 0x79, 0x20, 0xab, 0xc3, 0x8b, 0x50, 0x60, 0xbe, ++ 0xa2, 0xa0, 0x24, 0x0c, 0xf7, 0xfd, 0x59, 0x37, 0xb4, 0xc6, 0x5f, 0xdb, ++ 0x3f, 0xf1, 0x47, 0xb0, 0x6d, 0xbc, 0x28, 0x83, 0x81, 0xbf, 0xca, 0x5f, ++ 0x9e, 0x45, 0x15, 0xdb, 0xfc, 0xc0, 0x8e, 0xcf, 0x94, 0xbe, 0x0b, 0xed, ++ 0xfe, 0x71, 0x59, 0x8b, 0xef, 0xd8, 0x34, 0x30, 0xe0, 0x54, 0x63, 0xab, ++ 0xf1, 0x5b, 0xbf, 0xac, 0x85, 0xdc, 0x0b, 0xd9, 0x77, 0x90, 0x39, 0x90, ++ 0xf7, 0x3e, 0x63, 0xcc, 0xe1, 0x45, 0x2f, 0x26, 0xee, 0xcb, 0xca, 0x7b, ++ 0x66, 0x8c, 0xd1, 0x9c, 0x9b, 0xfb, 0xb2, 0x05, 0xfd, 0x3d, 0x94, 0xf5, ++ 0x11, 0x17, 0x7c, 0xb4, 0xc1, 0x8d, 0xcc, 0xc1, 0x74, 0xea, 0xb3, 0xa8, ++ 0xcb, 0x77, 0xfc, 0xf2, 0x5b, 0x3b, 0xdf, 0xa1, 0x4f, 0xbb, 0x1b, 0xe5, ++ 0xbb, 0x25, 0xe7, 0x75, 0x95, 0xc2, 0xf7, 0xb3, 0xce, 0xfb, 0xaa, 0xaa, ++ 0xb9, 0x0e, 0x6d, 0xc9, 0x19, 0x92, 0xeb, 0x5b, 0xa2, 0x1f, 0xbf, 0x29, ++ 0xef, 0xbf, 0xf8, 0x18, 0x3b, 0x5f, 0xf6, 0x4f, 0xbd, 0x07, 0xd7, 0xb1, ++ 0x9c, 0xbc, 0x6c, 0x5e, 0x54, 0x8f, 0xcf, 0x57, 0x42, 0xc1, 0x15, 0x4a, ++ 0x27, 0xeb, 0x51, 0x4f, 0x79, 0x69, 0xa3, 0xf8, 0x5b, 0x6c, 0xeb, 0x98, ++ 0xe3, 0x35, 0x05, 0x3d, 0xea, 0xc7, 0xb6, 0xe5, 0x9c, 0x3d, 0x2d, 0xe6, ++ 0x5b, 0x33, 0x9d, 0xf5, 0xaa, 0x4f, 0xb6, 0x0b, 0xef, 0x2c, 0xe6, 0x5b, ++ 0x0b, 0xd3, 0xd6, 0x3f, 0x68, 0xcc, 0xe3, 0x3c, 0x7a, 0xa8, 0x3b, 0xea, ++ 0x0a, 0xad, 0x3f, 0x47, 0x5c, 0xc9, 0x47, 0xf5, 0xc4, 0x77, 0xd9, 0xc7, ++ 0x8f, 0x95, 0x08, 0x92, 0xd3, 0xda, 0x2f, 0xb4, 0xd5, 0xd4, 0x55, 0xa2, ++ 0x9e, 0x75, 0x7e, 0x1f, 0x41, 0xda, 0xd7, 0xcc, 0xbb, 0xa1, 0xa5, 0x2c, ++ 0xdb, 0xcf, 0x36, 0x67, 0x9b, 0xa1, 0x3d, 0x35, 0x04, 0xa3, 0x87, 0xd5, ++ 0x1e, 0xac, 0x91, 0x63, 0x39, 0x66, 0x28, 0x78, 0x0f, 0xed, 0xa3, 0xc5, ++ 0x69, 0x23, 0x1e, 0x29, 0x01, 0x75, 0xf2, 0xe9, 0x76, 0x12, 0x04, 0x64, ++ 0x7d, 0x97, 0xe5, 0x9c, 0x75, 0x74, 0xd3, 0xe1, 0x00, 0x6b, 0x92, 0xf2, ++ 0xbb, 0x8f, 0x85, 0x75, 0x89, 0xc2, 0x5e, 0xa2, 0xc6, 0x3c, 0xca, 0x8b, ++ 0x7b, 0xe5, 0x77, 0xb4, 0xca, 0x7d, 0xb8, 0x2f, 0x29, 0xb9, 0xf4, 0xff, ++ 0x0b, 0x59, 0xe7, 0x45, 0xc2, 0x60, 0x56, 0x00, 0x00, 0x00 }; + + static const u32 bnx2_CP_b09FwData[(0x84/4) + 1] = { + 0x00000000, 0x0000001b, 0x0000000f, 0x0000000a, 0x00000008, 0x00000006, +@@ -2078,1077 +2090,1157 @@ + 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002, + 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002, + 0x00000001, 0x00000001, 0x00000001, 0x00000000 }; +-static const u32 bnx2_CP_b09FwRodata[(0x16c/4) + 1] = { +- 0x80080100, 0x80080080, 0x80080000, 0x08001744, 0x08001744, 0x0800177c, +- 0x0800177c, 0x08001790, 0x08001760, 0x080019b8, 0x08001984, 0x08001a10, +- 0x08001a10, 0x08001a98, 0x080019c8, 0x80080240, 0x08003260, 0x080031cc, +- 0x08003288, 0x080032b0, 0x080032d8, 0x080032fc, 0x08003344, 0x08003320, +- 0x08003368, 0x08003234, 0x0800345c, 0x0800344c, 0x080031e8, 0x080031e8, +- 0x080031e8, 0x080033bc, 0x080033bc, 0x080031e8, 0x080031e8, 0x0800343c, +- 0x080031e8, 0x080031e8, 0x080031e8, 0x080031e8, 0x0800342c, 0x080031e8, +- 0x080031e8, 0x080031e8, 0x080031e8, 0x080031e8, 0x080031e8, 0x080031e8, +- 0x080031e8, 0x080031e8, 0x080031e8, 0x080031e8, 0x080031e8, 0x080031e8, +- 0x080031e8, 0x0800341c, 0x080031e8, 0x080031e8, 0x0800340c, 0x080031e8, +- 0x080031e8, 0x080031e8, 0x080031e8, 0x080031e8, 0x080031e8, 0x080031e8, +- 0x080031e8, 0x080031e8, 0x080031e8, 0x080031e8, 0x080031e8, 0x080031e8, +- 0x080031e8, 0x080031e8, 0x080031e8, 0x080031e8, 0x080033f4, 0x080031e8, +- 0x080031e8, 0x080033e4, 0x080033d4, 0x08003d6c, 0x08003d40, 0x08003d0c, +- 0x08003ce0, 0x08003cc0, 0x08003c74, 0x80080100, 0x80080080, 0x80080000, +- 0x80080080, 0x00000000 }; ++static const u32 bnx2_CP_b09FwRodata[(0x1c0/4) + 1] = { ++ 0x80080100, 0x80080080, 0x80080000, 0x00000c00, 0x00003080, 0x08001030, ++ 0x080010dc, 0x080010f4, 0x08001108, 0x0800111c, 0x08001030, 0x08001030, ++ 0x08001150, 0x08001188, 0x08001198, 0x080011c0, 0x080018b0, 0x080018b0, ++ 0x080018e8, 0x080018e8, 0x080018fc, 0x080018cc, 0x08001b24, 0x08001af0, ++ 0x08001b7c, 0x08001b7c, 0x08001c04, 0x08001b34, 0x80080240, 0x08002290, ++ 0x080020dc, 0x080022b8, 0x08002350, 0x080024a0, 0x080024ec, 0x08002610, ++ 0x08002518, 0x0800259c, 0x0800214c, 0x08002ac4, 0x08002a68, 0x080020f8, ++ 0x080020f8, 0x080020f8, 0x08002684, 0x08002684, 0x080020f8, 0x080020f8, ++ 0x08002940, 0x080020f8, 0x080020f8, 0x080020f8, 0x080020f8, 0x080029a0, ++ 0x080020f8, 0x080020f8, 0x080020f8, 0x080020f8, 0x080020f8, 0x080020f8, ++ 0x080020f8, 0x080020f8, 0x080020f8, 0x080020f8, 0x080020f8, 0x080020f8, ++ 0x080020f8, 0x080020f8, 0x0800250c, 0x080020f8, 0x080020f8, 0x08002a10, ++ 0x080020f8, 0x080020f8, 0x080020f8, 0x080020f8, 0x080020f8, 0x080020f8, ++ 0x080020f8, 0x080020f8, 0x080020f8, 0x080020f8, 0x080020f8, 0x080020f8, ++ 0x080020f8, 0x080020f8, 0x080020f8, 0x080020f8, 0x080020f8, 0x08002864, ++ 0x080020f8, 0x080020f8, 0x080027cc, 0x08002728, 0x0800388c, 0x08003860, ++ 0x0800382c, 0x08003800, 0x080037e0, 0x08003794, 0x80080100, 0x80080080, ++ 0x80080000, 0x80080080, 0x08004868, 0x080048a0, 0x080047e8, 0x08004868, ++ 0x08004868, 0x080045c8, 0x08004868, 0x08004c3c, 0x00000000 }; + + static struct fw_info bnx2_cp_fw_09 = { +- /* Firmware version: 4.4.23 */ +- .ver_major = 0x4, +- .ver_minor = 0x4, +- .ver_fix = 0x17, +- +- .start_addr = 0x08000080, ++ /* Firmware version: 5.0.0g */ ++ .ver_major = 0x5, ++ .ver_minor = 0x0, ++ .ver_fix = 0x0, ++ ++ .start_addr = 0x08000088, + + .text_addr = 0x08000000, +- .text_len = 0x5938, ++ .text_len = 0x565c, + .text_index = 0x0, + .gz_text = bnx2_CP_b09FwText, + .gz_text_len = sizeof(bnx2_CP_b09FwText), + +- .data_addr = 0x08005ac0, ++ .data_addr = 0x08005840, + .data_len = 0x84, + .data_index = 0x0, + .data = bnx2_CP_b09FwData, + +- .sbss_addr = 0x08005b44, ++ .sbss_addr = 0x080058c4, + .sbss_len = 0x91, + .sbss_index = 0x0, + +- .bss_addr = 0x08005bd8, ++ .bss_addr = 0x08005958, + .bss_len = 0x19c, + .bss_index = 0x0, + +- .rodata_addr = 0x08005938, +- .rodata_len = 0x16c, ++ .rodata_addr = 0x0800565c, ++ .rodata_len = 0x1c0, + .rodata_index = 0x0, + .rodata = bnx2_CP_b09FwRodata, + }; + + static u8 bnx2_RXP_b09FwText[] = { +- 0xec, 0x5c, 0x7f, 0x70, 0x1c, 0xd5, 0x7d, 0xff, 0xbc, 0xbd, 0xbd, 0xbb, +- 0x95, 0x74, 0x3e, 0xed, 0x9d, 0x4e, 0xb2, 0x04, 0x06, 0xef, 0xa2, 0x95, +- 0x74, 0x58, 0xc6, 0xec, 0x9d, 0x4e, 0xb6, 0x48, 0xb7, 0xc9, 0xd5, 0x36, +- 0x20, 0x17, 0x52, 0x84, 0xa1, 0xc1, 0xcc, 0x30, 0x9d, 0x1b, 0x63, 0x8c, +- 0xb0, 0x1d, 0xa2, 0x00, 0x33, 0xc8, 0x29, 0x13, 0x16, 0xfc, 0xb3, 0xf8, +- 0xa4, 0x93, 0x8d, 0x8c, 0xc9, 0xf4, 0xd7, 0x21, 0xcb, 0x8a, 0x81, 0x93, +- 0xce, 0x04, 0xda, 0x98, 0x69, 0xa8, 0x15, 0x6c, 0x53, 0x87, 0x5f, 0x21, +- 0x19, 0x68, 0x4d, 0x9b, 0x99, 0xa8, 0x06, 0x1c, 0xd3, 0xa6, 0xd4, 0xb4, +- 0x0e, 0xb5, 0x8b, 0xeb, 0xd7, 0xef, 0x77, 0x4f, 0x97, 0x50, 0x42, 0xcb, +- 0x64, 0xa6, 0x7f, 0xee, 0x77, 0xe6, 0xe6, 0xf6, 0xde, 0xfb, 0xbe, 0xef, +- 0x7b, 0xdf, 0xdf, 0x9f, 0xb7, 0x1a, 0xfb, 0xbe, 0x08, 0x6a, 0x31, 0x4b, +- 0x73, 0xe8, 0x93, 0x19, 0x18, 0xbc, 0x27, 0xbd, 0x28, 0xb3, 0x88, 0x1e, +- 0xbb, 0x02, 0x73, 0x55, 0x95, 0xc7, 0x05, 0x7c, 0xf2, 0xc9, 0x27, 0x9f, +- 0x7c, 0xf2, 0xc9, 0x27, 0x9f, 0x7c, 0xf2, 0xc9, 0x27, 0x9f, 0x7c, 0xf2, +- 0xc9, 0x27, 0x9f, 0x7c, 0xf2, 0xc9, 0x27, 0x9f, 0x7c, 0xf2, 0xc9, 0x27, +- 0x9f, 0x7c, 0xf2, 0xc9, 0x27, 0x9f, 0x7c, 0xf2, 0xc9, 0x27, 0x9f, 0x7c, +- 0xf2, 0xc9, 0x27, 0x9f, 0x7c, 0xf2, 0xc9, 0x27, 0x9f, 0x7c, 0xf2, 0xc9, +- 0x27, 0x9f, 0x7c, 0xf2, 0xc9, 0x27, 0x9f, 0x7c, 0xfa, 0xff, 0xa4, 0x00, +- 0xa0, 0xf3, 0xf7, 0x9c, 0xd9, 0x0f, 0x34, 0xc5, 0x71, 0x37, 0x2e, 0xb5, +- 0xa0, 0x05, 0x9c, 0x33, 0x1b, 0x6f, 0xb7, 0x80, 0x6c, 0xa9, 0xd3, 0x58, +- 0x86, 0xff, 0x92, 0x6e, 0x42, 0x05, 0x8f, 0x5f, 0xe2, 0x9c, 0xff, 0xf3, +- 0x17, 0x96, 0x98, 0xa7, 0x8b, 0x01, 0x68, 0xba, 0xf3, 0x46, 0x4a, 0x6f, +- 0x87, 0x36, 0x8f, 0xd6, 0xfc, 0x49, 0xc7, 0x95, 0x71, 0x44, 0xab, 0xb2, +- 0xe0, 0x2a, 0x8e, 0x94, 0xfb, 0x6c, 0x89, 0x97, 0x6c, 0x57, 0xf4, 0x66, +- 0xe0, 0x06, 0x9c, 0x83, 0xe2, 0xae, 0xfc, 0x05, 0x69, 0x04, 0x2b, 0x3b, +- 0xab, 0x93, 0x1a, 0x82, 0xfb, 0xa0, 0xab, 0x8e, 0x82, 0xa0, 0x55, 0x8b, +- 0xd0, 0x13, 0x75, 0x08, 0x3e, 0xd1, 0x8c, 0xf0, 0xe4, 0x01, 0x91, 0x2b, +- 0x6a, 0x98, 0x09, 0x1c, 0x14, 0x6b, 0x4a, 0xc8, 0x05, 0x9d, 0xb3, 0x37, +- 0x8c, 0xd1, 0xba, 0xac, 0xf7, 0xef, 0x4b, 0xa6, 0x6f, 0x18, 0x2f, 0x41, +- 0x0f, 0x38, 0x50, 0x54, 0xe7, 0x08, 0x3d, 0x33, 0xdf, 0xd9, 0x1b, 0xf6, +- 0x96, 0x4e, 0xc9, 0x17, 0x3a, 0x12, 0x38, 0x54, 0xd6, 0x71, 0xa0, 0xfc, +- 0x10, 0x9d, 0xc3, 0x74, 0x5d, 0x68, 0xae, 0xea, 0xb8, 0xd8, 0x92, 0x09, +- 0x62, 0x62, 0xe4, 0x82, 0x0c, 0x58, 0xa6, 0x01, 0xc5, 0xd2, 0x0f, 0x83, +- 0xf8, 0x0a, 0xc4, 0x57, 0x08, 0x62, 0xac, 0xb8, 0x23, 0x8e, 0xda, 0x66, +- 0xbc, 0xd0, 0xc1, 0xeb, 0x79, 0x2d, 0xcb, 0xf8, 0x38, 0x5a, 0x5d, 0x1f, +- 0xa2, 0xf5, 0x47, 0x33, 0xc0, 0xf8, 0x48, 0x1f, 0x2d, 0x95, 0xd8, 0x64, +- 0x87, 0xb1, 0x5a, 0x87, 0x5b, 0xe3, 0xb0, 0xac, 0xaa, 0x1c, 0x57, 0x18, +- 0x93, 0xff, 0x5c, 0x5f, 0x91, 0x03, 0xa1, 0x59, 0x70, 0xc3, 0x9f, 0x9a, +- 0x3f, 0x55, 0xaa, 0xce, 0x6f, 0xa7, 0x7d, 0x34, 0x9a, 0xef, 0xc7, 0x5f, +- 0x96, 0xd7, 0xe0, 0x2f, 0xca, 0xb7, 0xe1, 0xd9, 0x72, 0x1f, 0xed, 0x7b, +- 0x1f, 0xed, 0x3b, 0x80, 0xbf, 0x2e, 0x6f, 0xc0, 0x77, 0xcb, 0x39, 0x3c, +- 0x57, 0x5e, 0x85, 0xef, 0x94, 0x6f, 0xc6, 0x33, 0x65, 0x78, 0x67, 0x38, +- 0x95, 0x49, 0x8a, 0x1f, 0xe5, 0x6b, 0xa0, 0xee, 0xdc, 0x8c, 0xe9, 0x52, +- 0x10, 0xc1, 0x9d, 0x12, 0x23, 0xb6, 0xf9, 0x38, 0xd0, 0xa1, 0x07, 0x21, +- 0xb0, 0xcc, 0x36, 0xf7, 0x03, 0x5f, 0x40, 0x2e, 0x61, 0x1e, 0x00, 0x9a, +- 0xc4, 0x8f, 0x47, 0x9b, 0xc4, 0x6b, 0xa3, 0xaa, 0x78, 0x3d, 0x2f, 0x50, +- 0xef, 0x20, 0xf2, 0x72, 0x46, 0xca, 0xeb, 0xd2, 0x52, 0x96, 0x52, 0x56, +- 0xef, 0x0f, 0x85, 0x69, 0x3f, 0x22, 0x2e, 0x85, 0xd1, 0x68, 0x66, 0xd7, +- 0x09, 0xcd, 0xad, 0x25, 0xf9, 0x2b, 0xba, 0x01, 0x6b, 0xa7, 0x41, 0x7e, +- 0x60, 0x1d, 0x37, 0xe1, 0x0e, 0x2f, 0x26, 0xfa, 0xd0, 0x60, 0x2d, 0xc5, +- 0xbd, 0x7d, 0x36, 0x8a, 0x65, 0x68, 0x31, 0xe7, 0x0c, 0x52, 0xc3, 0x02, +- 0x36, 0xf9, 0x5b, 0xd0, 0xb3, 0x5d, 0x5a, 0xdf, 0x50, 0xf1, 0x37, 0x9d, +- 0xbd, 0x40, 0x67, 0x2f, 0xd0, 0xd9, 0x0b, 0xa4, 0x57, 0x81, 0xf4, 0x2a, +- 0x90, 0x0e, 0x05, 0xd2, 0xad, 0x40, 0x7a, 0x14, 0x48, 0x8f, 0x02, 0xe9, +- 0x58, 0x60, 0x5f, 0x0d, 0x92, 0x0d, 0x22, 0xf8, 0xbb, 0xfc, 0x3c, 0x9c, +- 0xe1, 0xcf, 0x4a, 0x1d, 0xc7, 0xe9, 0x8c, 0x8a, 0xf5, 0x9b, 0xca, 0xf8, +- 0x6e, 0x84, 0x7c, 0x64, 0xfc, 0xe6, 0x7b, 0x2f, 0xc4, 0xc9, 0xfc, 0xbb, +- 0x32, 0x34, 0x97, 0xf7, 0xfc, 0x22, 0xe4, 0x28, 0x70, 0xe9, 0x6e, 0x29, +- 0xcf, 0x75, 0xcd, 0xc8, 0xb7, 0x6f, 0x61, 0x59, 0x0e, 0x4e, 0x8c, 0x2a, +- 0x08, 0xd0, 0xd8, 0xb5, 0xf6, 0xdf, 0xcb, 0x3b, 0x13, 0xcc, 0xf7, 0x51, +- 0x04, 0xb5, 0x6c, 0x27, 0x68, 0x0d, 0xce, 0xbb, 0x1b, 0xef, 0x6d, 0x87, +- 0x1b, 0x75, 0x54, 0xf1, 0xe6, 0x90, 0x81, 0xb9, 0x4e, 0x16, 0x73, 0x1c, +- 0x6b, 0x64, 0x8f, 0xd2, 0x39, 0x18, 0x47, 0xf6, 0xf2, 0x7a, 0xd8, 0xd8, +- 0x57, 0x56, 0xc5, 0xab, 0x43, 0x73, 0x10, 0xdf, 0x69, 0xad, 0x1a, 0x12, +- 0x0a, 0x72, 0x8d, 0x59, 0x8c, 0x67, 0x4c, 0xa3, 0x08, 0x03, 0xab, 0xd2, +- 0x0a, 0x30, 0xd7, 0xc5, 0xd6, 0x8c, 0x69, 0xbb, 0x78, 0x08, 0xd3, 0x09, +- 0x1b, 0x13, 0x65, 0x8d, 0x72, 0xc3, 0xc5, 0x9d, 0x19, 0x0d, 0x72, 0x24, +- 0x8b, 0x93, 0x5d, 0x21, 0x4c, 0xf7, 0x71, 0x8c, 0xa8, 0xb4, 0xf7, 0x56, +- 0x28, 0xf1, 0x38, 0xf9, 0xe5, 0xb0, 0x0c, 0xc6, 0x79, 0x0c, 0xe2, 0x5f, +- 0x32, 0xbc, 0xff, 0x45, 0xe2, 0xd5, 0xdd, 0x51, 0xd4, 0xee, 0xd6, 0xf0, +- 0xf4, 0x4e, 0x15, 0x2b, 0xc8, 0xb7, 0x7b, 0x52, 0xaa, 0xb1, 0x4e, 0x38, +- 0x18, 0x2f, 0xab, 0x48, 0x0c, 0xb5, 0xc0, 0x88, 0x69, 0xb8, 0x74, 0xc8, +- 0xc5, 0x3b, 0x24, 0x77, 0x90, 0xe4, 0xd6, 0x77, 0xe9, 0x98, 0x69, 0xac, +- 0xf8, 0xf5, 0xeb, 0xf9, 0x56, 0x77, 0xa7, 0x12, 0x02, 0x42, 0x70, 0x35, +- 0x27, 0x83, 0xfb, 0xf3, 0xad, 0xa4, 0xc3, 0xad, 0x58, 0x1a, 0xd2, 0xb0, +- 0x7a, 0x98, 0xc7, 0x96, 0x03, 0x93, 0x73, 0xe7, 0xa0, 0x96, 0xf5, 0xe7, +- 0x7c, 0x5e, 0x4a, 0xcf, 0x1c, 0x07, 0xbf, 0x9d, 0x60, 0xbb, 0xbb, 0xca, +- 0x7f, 0xc8, 0x6c, 0x82, 0xf9, 0x2a, 0x39, 0x72, 0x38, 0x93, 0xc1, 0xc6, +- 0x7c, 0x6b, 0xf6, 0x5b, 0x4a, 0x03, 0x10, 0x34, 0x0d, 0x43, 0x81, 0x96, +- 0x70, 0x90, 0x1a, 0xa5, 0x78, 0x79, 0xd4, 0x8b, 0x17, 0xa4, 0xba, 0x4a, +- 0x9c, 0x97, 0x9a, 0xab, 0x13, 0xff, 0xfc, 0xc5, 0x6d, 0xf8, 0xe8, 0x51, +- 0xe6, 0x53, 0xf1, 0x03, 0x7a, 0x7e, 0x7f, 0xef, 0x8e, 0xd9, 0xda, 0xf1, +- 0xa7, 0x9e, 0x5f, 0x0d, 0xa5, 0xba, 0xb7, 0x8d, 0x3b, 0xf3, 0xad, 0x67, +- 0xb7, 0x29, 0xe4, 0xbf, 0x8b, 0x23, 0xa8, 0xa1, 0xfa, 0x13, 0x24, 0x59, +- 0xfb, 0xf2, 0xe7, 0xb1, 0x32, 0x6d, 0x1e, 0xe4, 0x7f, 0x6f, 0x36, 0x66, +- 0x55, 0xe4, 0x5f, 0x56, 0xb2, 0xf1, 0x64, 0xd9, 0xc6, 0xed, 0x74, 0x8e, +- 0xfb, 0xf0, 0x8f, 0x40, 0xcb, 0x02, 0xe3, 0x94, 0x72, 0x42, 0xba, 0x37, +- 0xb3, 0xbc, 0x79, 0x38, 0x15, 0x6f, 0xcd, 0x9d, 0x52, 0xcc, 0xe2, 0x76, +- 0x85, 0x6d, 0xa5, 0xe0, 0xcb, 0xe9, 0x0c, 0x8a, 0x31, 0x1d, 0xb7, 0xa6, +- 0x35, 0xf7, 0x52, 0x3a, 0xd3, 0x1b, 0x4b, 0x34, 0x34, 0xed, 0xca, 0xe2, +- 0xad, 0xf4, 0x9b, 0x28, 0xae, 0x64, 0x3b, 0xf0, 0x3a, 0x3e, 0x73, 0x33, +- 0xe2, 0x56, 0x0d, 0xe2, 0x63, 0x41, 0xd4, 0xef, 0xba, 0x20, 0x9b, 0x2d, +- 0x1e, 0xb7, 0x06, 0xce, 0x0a, 0x3e, 0x73, 0x10, 0xd1, 0xb1, 0xab, 0xa0, +- 0x5a, 0x66, 0x92, 0x1c, 0x9b, 0x60, 0xde, 0x90, 0x55, 0x3d, 0xbb, 0xc0, +- 0x75, 0x5f, 0x10, 0x58, 0x97, 0xfa, 0xbe, 0xcc, 0x36, 0xf2, 0x9a, 0x67, +- 0x68, 0x9c, 0xcf, 0x50, 0x73, 0x36, 0x8b, 0x26, 0x5a, 0x53, 0xe5, 0x8b, +- 0xa0, 0x7f, 0x57, 0xe5, 0x0c, 0x6f, 0x2f, 0xc1, 0xb3, 0x1a, 0x7a, 0xd0, +- 0x51, 0x78, 0x08, 0x6f, 0x2d, 0xf6, 0xf6, 0x3f, 0xbd, 0x2f, 0xbd, 0x83, +- 0x6c, 0xc2, 0x75, 0xf4, 0xd3, 0x7e, 0xe1, 0xf9, 0xff, 0x64, 0x7f, 0x24, +- 0x21, 0x9a, 0x69, 0x8c, 0xe3, 0x77, 0xa7, 0x34, 0x6e, 0xaa, 0xf8, 0x25, +- 0x4c, 0xf2, 0xde, 0xcf, 0xf4, 0xa0, 0x75, 0x48, 0x85, 0xcc, 0xb7, 0xda, +- 0x3f, 0x0d, 0x3c, 0x22, 0xa7, 0x6f, 0xe3, 0xb9, 0x56, 0xfd, 0x70, 0x40, +- 0x60, 0xa9, 0x6a, 0x9e, 0xce, 0xa1, 0x19, 0xfb, 0xa9, 0xc6, 0xb4, 0x38, +- 0x3a, 0xd5, 0x9c, 0x04, 0xd5, 0x1e, 0x43, 0x74, 0xec, 0xb1, 0xb1, 0x60, +- 0xe8, 0x36, 0x7c, 0x69, 0xb7, 0x83, 0x83, 0x05, 0x1b, 0x4f, 0x17, 0xa4, +- 0x3c, 0x69, 0x4b, 0xf9, 0xaf, 0x5d, 0x66, 0xff, 0x31, 0x6a, 0x07, 0x8b, +- 0x96, 0x74, 0xe6, 0xea, 0x03, 0x2a, 0xd9, 0xa7, 0xcd, 0xd8, 0x20, 0xcc, +- 0xe6, 0x29, 0x61, 0x53, 0xcc, 0xf5, 0x92, 0xed, 0x0d, 0xec, 0x2d, 0x27, +- 0xf1, 0x54, 0xd9, 0xa2, 0xcf, 0x42, 0x8a, 0x95, 0x0c, 0xd5, 0x33, 0xd6, +- 0x55, 0xc7, 0x78, 0x07, 0xe5, 0x45, 0x41, 0xc1, 0x7e, 0x9b, 0xe2, 0x3f, +- 0x46, 0xbc, 0x85, 0x0b, 0xe4, 0x3f, 0x0d, 0xc9, 0x9d, 0x59, 0xd4, 0xa4, +- 0x1a, 0x60, 0xdc, 0x68, 0x61, 0xbc, 0xa0, 0xb9, 0x41, 0x8a, 0xf9, 0xb1, +- 0xfc, 0x38, 0xfe, 0x40, 0x4f, 0xa0, 0x96, 0xec, 0xb7, 0x2a, 0x1d, 0x01, +- 0x6e, 0xe2, 0xb9, 0x08, 0x5a, 0xac, 0xef, 0xa3, 0x25, 0x3e, 0x07, 0xa1, +- 0x05, 0x7f, 0x85, 0x69, 0x3d, 0x8a, 0x30, 0xf5, 0x8c, 0xf9, 0xc4, 0x33, +- 0x9f, 0x7c, 0xd5, 0x68, 0x59, 0x24, 0x53, 0xc0, 0x6a, 0x23, 0x5e, 0xca, +- 0xa7, 0x66, 0xd2, 0x3d, 0xb8, 0x24, 0x81, 0x32, 0x9d, 0x7f, 0x2a, 0x2f, +- 0x65, 0x24, 0x63, 0xf6, 0x17, 0x28, 0x37, 0x27, 0x4b, 0x3d, 0x98, 0x2a, +- 0xff, 0x1e, 0xd5, 0x73, 0x1b, 0x7b, 0xf3, 0x0e, 0xc6, 0x0a, 0xea, 0xaa, +- 0x3c, 0xcc, 0xbe, 0xf5, 0xc8, 0xe0, 0x29, 0x8a, 0x9f, 0x89, 0x82, 0x69, +- 0xbc, 0x18, 0xd0, 0x70, 0xcc, 0xae, 0xa3, 0x73, 0x52, 0xde, 0x92, 0x4e, +- 0xcf, 0xe7, 0x47, 0x60, 0x35, 0xb0, 0xfd, 0xd9, 0x4f, 0x19, 0x7c, 0xbb, +- 0xe0, 0xc5, 0xf7, 0x75, 0x1a, 0x5c, 0xd8, 0xdd, 0xec, 0x1b, 0xf7, 0x74, +- 0x30, 0x5d, 0xa9, 0xa3, 0x7d, 0xdd, 0x36, 0xc2, 0xc3, 0x3d, 0x24, 0xb7, +- 0xd5, 0x3e, 0x81, 0x3b, 0x30, 0xdd, 0xec, 0x62, 0x11, 0xc5, 0xbf, 0xea, +- 0x3c, 0x9e, 0xda, 0x9c, 0x77, 0x65, 0xbd, 0x65, 0xf5, 0xff, 0x50, 0x3c, +- 0x88, 0x57, 0x53, 0x5c, 0xd7, 0x55, 0xca, 0x7b, 0x1d, 0x3b, 0xec, 0x11, +- 0xbc, 0x56, 0xfa, 0x2d, 0xe4, 0x62, 0x66, 0x72, 0x93, 0x58, 0x8f, 0x83, +- 0x23, 0x57, 0x01, 0xb7, 0x70, 0x9e, 0x90, 0x6e, 0xd6, 0x7a, 0x1c, 0x2a, +- 0x7e, 0x03, 0x47, 0x47, 0x6b, 0xf1, 0xbc, 0x15, 0x47, 0xcb, 0x44, 0x65, +- 0x9f, 0xab, 0xbb, 0x35, 0x8c, 0x51, 0x4e, 0x5f, 0x6b, 0xab, 0x98, 0x49, +- 0x70, 0xfd, 0xa0, 0x58, 0x4b, 0x6f, 0xa0, 0x5a, 0xe3, 0xb5, 0x5e, 0xac, +- 0xc9, 0x18, 0xc8, 0xe7, 0xb3, 0x54, 0xff, 0x6a, 0xb0, 0x2b, 0x06, 0x71, +- 0x3b, 0xf5, 0xb0, 0xbb, 0xf3, 0xad, 0xfd, 0xc3, 0x4a, 0x1c, 0xc5, 0x96, +- 0x2c, 0xf9, 0x42, 0xa0, 0xc9, 0x32, 0xb0, 0xa5, 0x44, 0x15, 0xb4, 0xa4, +- 0xe2, 0x9b, 0xa5, 0x2b, 0x50, 0x6c, 0xe2, 0xb5, 0x1d, 0x98, 0xf6, 0xbe, +- 0x83, 0x98, 0x89, 0x9b, 0xcd, 0x20, 0x9b, 0x8d, 0x17, 0x54, 0xec, 0xb6, +- 0xf7, 0x5c, 0x28, 0xae, 0x34, 0xf5, 0x1c, 0xe5, 0x5b, 0xc0, 0x8b, 0x5b, +- 0x7e, 0x06, 0xbe, 0x96, 0xff, 0x50, 0x9e, 0xf1, 0xf6, 0x54, 0x39, 0xff, +- 0xa7, 0xdf, 0x0e, 0xbc, 0x2f, 0x45, 0x98, 0xe5, 0xdf, 0x1f, 0xad, 0xfc, +- 0x5b, 0xd1, 0x67, 0x99, 0x37, 0x0b, 0x70, 0x1c, 0xcc, 0xfd, 0x44, 0xcc, +- 0x57, 0xea, 0x80, 0xbe, 0x98, 0xcf, 0x51, 0xcd, 0xb3, 0x38, 0x9a, 0x26, +- 0xda, 0x50, 0xb3, 0x8b, 0x7f, 0xf3, 0xb8, 0xc0, 0x65, 0xdd, 0x9c, 0x63, +- 0x6d, 0x50, 0xc6, 0x56, 0x47, 0x2b, 0x35, 0xb8, 0x5a, 0x1f, 0xfe, 0x70, +- 0x56, 0xbe, 0xd7, 0xeb, 0xe9, 0x77, 0xa5, 0x86, 0x7e, 0x33, 0xc3, 0xcf, +- 0xbc, 0xa6, 0x06, 0x6f, 0xed, 0x35, 0xed, 0xa2, 0xb2, 0x84, 0xf7, 0xac, +- 0xe4, 0x08, 0x36, 0xce, 0xae, 0xa1, 0x98, 0x2f, 0x4c, 0x49, 0xdc, 0xca, +- 0xf2, 0xaa, 0xeb, 0xdb, 0x10, 0xfa, 0xe5, 0xbe, 0x2a, 0x5e, 0xcc, 0x7c, +- 0x7a, 0xdf, 0xdb, 0x64, 0xed, 0xca, 0x38, 0xc5, 0x59, 0x23, 0xd4, 0x05, +- 0xd4, 0xe0, 0xf5, 0x26, 0xd4, 0x51, 0xde, 0x06, 0xac, 0x5b, 0x64, 0xe0, +- 0x2b, 0x1c, 0xa7, 0x9a, 0x1b, 0x71, 0x2e, 0xc6, 0xf0, 0xce, 0x17, 0xc8, +- 0xc7, 0x51, 0x8e, 0x47, 0xf2, 0xf3, 0xc5, 0x18, 0x7a, 0xe2, 0x92, 0x28, +- 0xeb, 0xbb, 0x2a, 0x0d, 0x77, 0x3e, 0xd5, 0xec, 0xf7, 0xf6, 0xdc, 0x2d, +- 0x8b, 0x7d, 0x3a, 0x5e, 0xca, 0xfc, 0x0e, 0x8d, 0x73, 0x3c, 0xd9, 0x78, +- 0x2e, 0xaf, 0xe1, 0xfe, 0xe1, 0x66, 0x3a, 0x27, 0xd7, 0xca, 0x9a, 0xb3, +- 0x33, 0x8a, 0x8d, 0x67, 0x29, 0x16, 0x9f, 0x29, 0xb0, 0xad, 0x54, 0x5c, +- 0x96, 0x5e, 0x21, 0xc3, 0x4d, 0x1c, 0xdf, 0x49, 0x5a, 0xa3, 0x93, 0xec, +- 0x28, 0x74, 0x6b, 0x99, 0x3c, 0xb0, 0x92, 0x9f, 0x3b, 0x68, 0xac, 0x89, +- 0xbe, 0xbb, 0x65, 0xdd, 0xaf, 0x9d, 0x43, 0xff, 0xac, 0x73, 0x50, 0xdc, +- 0x9b, 0xf6, 0x5a, 0x74, 0x12, 0x0e, 0x52, 0x91, 0xa5, 0x3e, 0x3f, 0x41, +- 0x31, 0xb0, 0x8d, 0x7a, 0xf0, 0x7b, 0x84, 0xf5, 0xb6, 0x78, 0x78, 0xca, +- 0x83, 0x67, 0x1e, 0x5e, 0x5b, 0x5d, 0xc1, 0x5d, 0x9a, 0x6a, 0x31, 0x16, +- 0xab, 0xce, 0x71, 0x9e, 0xf6, 0x62, 0x6c, 0x54, 0xca, 0xcd, 0x76, 0x0b, +- 0xc9, 0x88, 0x63, 0xb3, 0x45, 0x39, 0x3d, 0xca, 0x6b, 0xa4, 0x4c, 0xa6, +- 0x16, 0xf4, 0xa8, 0xa2, 0x01, 0x33, 0xba, 0x2b, 0xd6, 0x66, 0x0c, 0xf1, +- 0xd5, 0x51, 0x15, 0xf9, 0xc2, 0x45, 0x64, 0x2f, 0x29, 0x9f, 0x4a, 0x21, +- 0xbb, 0x29, 0x55, 0x87, 0x57, 0x8a, 0x3a, 0x72, 0xfa, 0x05, 0xb9, 0xbc, +- 0xad, 0x17, 0x65, 0x92, 0xf3, 0x41, 0xaa, 0x33, 0x79, 0x44, 0x44, 0x50, +- 0x4c, 0x44, 0xf0, 0x78, 0x21, 0x81, 0x23, 0xe3, 0x11, 0x6c, 0xa5, 0x18, +- 0x7d, 0x31, 0xc3, 0x7b, 0x46, 0xf0, 0x70, 0x99, 0x31, 0x55, 0x80, 0x6c, +- 0xe4, 0x8a, 0x13, 0xde, 0x58, 0x1d, 0x96, 0x17, 0x99, 0xf7, 0x82, 0x6c, +- 0xb1, 0x2c, 0xbd, 0x25, 0x50, 0xe5, 0x3b, 0x4e, 0xf8, 0xca, 0xa0, 0x5a, +- 0x36, 0x8f, 0x70, 0x55, 0x33, 0x61, 0xa8, 0x04, 0x61, 0x28, 0x6b, 0x16, +- 0x17, 0x9a, 0x94, 0x8d, 0x52, 0x3e, 0x4b, 0xb5, 0xec, 0xc7, 0xf4, 0x39, +- 0x43, 0xf5, 0x34, 0x46, 0x3a, 0x5e, 0x36, 0xcc, 0x3a, 0xba, 0xc2, 0xa6, +- 0x7a, 0x9b, 0x55, 0x94, 0x7a, 0xee, 0x43, 0x81, 0x29, 0xde, 0x5f, 0xc5, +- 0x96, 0x02, 0xb0, 0xa9, 0x00, 0xf7, 0x08, 0xe5, 0x7e, 0xc3, 0x44, 0x14, +- 0xf1, 0x09, 0x1d, 0xc1, 0x89, 0x24, 0xcd, 0x6b, 0x48, 0xd0, 0x6f, 0x97, +- 0xb0, 0x60, 0xbd, 0xd3, 0x24, 0x16, 0x3e, 0x76, 0x5e, 0xee, 0x48, 0xa9, +- 0x58, 0xd7, 0x66, 0xf6, 0xde, 0x28, 0x90, 0x4d, 0x0e, 0x49, 0x19, 0x4e, +- 0x85, 0x29, 0x37, 0xe5, 0xa1, 0x04, 0xe9, 0x1d, 0x75, 0xe4, 0x83, 0xaf, +- 0x75, 0x5b, 0xf6, 0x6b, 0x20, 0xb9, 0x65, 0x5e, 0xc3, 0xe3, 0xae, 0xf8, +- 0xb0, 0xdb, 0x7a, 0xfc, 0x4d, 0xb4, 0xa3, 0x6b, 0x42, 0x15, 0xff, 0x36, +- 0xb4, 0x10, 0xe9, 0x29, 0xe8, 0x21, 0xe7, 0x80, 0x98, 0x79, 0xe2, 0xa0, +- 0x38, 0x39, 0x49, 0xe7, 0x2e, 0x90, 0x2e, 0x05, 0xd2, 0xa5, 0x40, 0xba, +- 0x90, 0x5d, 0x9e, 0xf1, 0xf0, 0x24, 0xeb, 0x9a, 0x24, 0x2c, 0x73, 0xdc, +- 0xc3, 0xbc, 0x8c, 0x11, 0x63, 0x8e, 0x99, 0x75, 0xc1, 0x7a, 0xb3, 0x9e, +- 0x52, 0xbe, 0x69, 0x57, 0xf4, 0x71, 0xa9, 0xdc, 0x6a, 0x53, 0x55, 0x5b, +- 0x48, 0xf9, 0xef, 0x36, 0xdb, 0x82, 0x75, 0x94, 0xf2, 0x3b, 0xa4, 0xd3, +- 0x16, 0xd2, 0x71, 0x53, 0x41, 0x1e, 0x0a, 0x59, 0x96, 0x31, 0x41, 0x67, +- 0x8b, 0x93, 0x4e, 0x89, 0x09, 0x8d, 0x74, 0x6d, 0x87, 0x4a, 0xba, 0x06, +- 0x26, 0xa0, 0x2b, 0x74, 0x1e, 0x63, 0x8c, 0xec, 0x34, 0xf5, 0x79, 0xe7, +- 0x61, 0xcc, 0xef, 0x8a, 0xab, 0x09, 0x9f, 0xa8, 0x64, 0xd7, 0x4d, 0x14, +- 0x3b, 0x39, 0x15, 0x46, 0xd8, 0x52, 0xa8, 0x27, 0x6a, 0xf8, 0xf6, 0x78, +- 0x1d, 0x26, 0xc8, 0xef, 0xc5, 0x71, 0xe8, 0x41, 0x92, 0xe9, 0x16, 0x0f, +- 0x8a, 0x4f, 0xc6, 0x5b, 0xd0, 0x19, 0x20, 0x9c, 0x04, 0x3c, 0x92, 0x8f, +- 0x8b, 0x89, 0x11, 0x15, 0x9b, 0x0b, 0xa7, 0x49, 0x3f, 0x89, 0xc3, 0xf6, +- 0xc3, 0xcd, 0xc4, 0x22, 0x1e, 0xb6, 0xcd, 0x1e, 0xe0, 0x2a, 0x8a, 0xb7, +- 0x00, 0xd6, 0x5a, 0xc8, 0x6e, 0xb3, 0xaf, 0xc2, 0x4c, 0x1f, 0x8c, 0xed, +- 0xb6, 0xab, 0x87, 0x60, 0x1e, 0xbb, 0x9a, 0x7a, 0xd3, 0x95, 0xa4, 0xcf, +- 0xa0, 0xe5, 0x0e, 0x50, 0xe1, 0x42, 0xb9, 0x6c, 0xf6, 0x1f, 0x25, 0x5f, +- 0x94, 0xa8, 0xff, 0x95, 0xca, 0x4d, 0xe2, 0xe9, 0xd1, 0xf3, 0xf2, 0xae, +- 0x94, 0x99, 0x6d, 0xa3, 0xb1, 0xe0, 0x90, 0x46, 0x38, 0x4d, 0xa3, 0x9c, +- 0x32, 0x6d, 0x80, 0x6b, 0x03, 0xb4, 0x30, 0xd5, 0xe2, 0x9f, 0x59, 0x47, +- 0x08, 0xa7, 0x6b, 0x20, 0x0c, 0x8f, 0xa5, 0x23, 0x02, 0xfb, 0x28, 0xc7, +- 0x27, 0x17, 0x9a, 0xc7, 0x56, 0xc3, 0x9d, 0x6e, 0x81, 0x39, 0x18, 0x0e, +- 0x9c, 0xc6, 0x07, 0x43, 0x21, 0xc2, 0x0d, 0xed, 0xf6, 0xeb, 0x30, 0xf5, +- 0x7d, 0x81, 0x5f, 0xc8, 0xfd, 0x09, 0x5c, 0x14, 0xc4, 0x19, 0x69, 0xfc, +- 0x3e, 0xaf, 0x61, 0xdd, 0x07, 0xb0, 0x2d, 0xc3, 0x38, 0x45, 0x25, 0x9c, +- 0x02, 0xbc, 0x93, 0x37, 0xb0, 0x7f, 0x61, 0x0d, 0xf5, 0x93, 0xd6, 0x9e, +- 0x75, 0x70, 0x57, 0xd1, 0xf5, 0x47, 0x8b, 0xd0, 0x5e, 0x79, 0x8a, 0x95, +- 0x0d, 0x42, 0xe0, 0x29, 0xeb, 0xac, 0xdd, 0x31, 0xc9, 0x18, 0x46, 0x4d, +- 0x2d, 0xa0, 0x5c, 0xdc, 0x5a, 0x16, 0xd4, 0xdb, 0x4c, 0x7d, 0x06, 0x6c, +- 0x1b, 0x9d, 0xec, 0x7a, 0x5e, 0x22, 0xc6, 0xba, 0xbb, 0x39, 0xd2, 0x73, +- 0xd5, 0x16, 0x3a, 0xff, 0x1a, 0xd2, 0xe9, 0x2e, 0xcb, 0xed, 0x21, 0xa9, +- 0xd4, 0xa3, 0xcc, 0xe6, 0xf7, 0x48, 0xf7, 0xb5, 0x54, 0x47, 0x8a, 0xe5, +- 0xe7, 0xea, 0xb9, 0x66, 0x4c, 0x94, 0xf9, 0x1e, 0xd7, 0x83, 0xa5, 0xf9, +- 0x6a, 0x3e, 0xb0, 0xff, 0xd9, 0xf7, 0x1c, 0x0b, 0x1c, 0x33, 0x1c, 0x27, +- 0x8c, 0xd1, 0x7a, 0x30, 0xda, 0xae, 0x20, 0x9b, 0x90, 0x72, 0xa5, 0x65, +- 0x8e, 0x70, 0x1d, 0xa7, 0x98, 0xcf, 0xee, 0xb5, 0xeb, 0x29, 0x3f, 0xe1, +- 0x3e, 0x69, 0x1b, 0x08, 0x39, 0x1c, 0x1b, 0x75, 0x14, 0xeb, 0x11, 0x6c, +- 0xa3, 0x58, 0xd1, 0x2c, 0x2b, 0x49, 0x97, 0x0d, 0xfd, 0x9d, 0x0c, 0xf1, +- 0x96, 0x61, 0x94, 0xed, 0x5a, 0xc2, 0x95, 0x2a, 0x62, 0xce, 0x21, 0xd9, +- 0x60, 0x35, 0xea, 0xd4, 0xb8, 0xf5, 0x7b, 0xb1, 0x9a, 0xee, 0x17, 0x06, +- 0xea, 0x1c, 0x9e, 0x3f, 0x27, 0x67, 0x62, 0x11, 0x8a, 0x33, 0xe6, 0xb1, +- 0xdc, 0x67, 0xf0, 0x91, 0x44, 0x9c, 0x79, 0xb3, 0x58, 0x9d, 0x81, 0x38, +- 0x48, 0x7b, 0xa1, 0x81, 0x73, 0xd7, 0xc0, 0x7c, 0xc7, 0x3a, 0x76, 0x88, +- 0x7a, 0x8f, 0xd1, 0x00, 0xaa, 0xb9, 0x2a, 0x02, 0x8e, 0xa5, 0xef, 0xc5, +- 0x51, 0xaf, 0x4e, 0x11, 0x52, 0x17, 0x2b, 0x76, 0xcf, 0x13, 0xbd, 0x84, +- 0xcd, 0xdb, 0x53, 0x70, 0x34, 0xb4, 0x19, 0x7f, 0x43, 0xa3, 0x9b, 0x29, +- 0xfe, 0xe7, 0x38, 0x11, 0x51, 0xda, 0x0d, 0xfd, 0x69, 0x5b, 0xa3, 0x3e, +- 0x2a, 0xe5, 0xd6, 0x94, 0x81, 0x29, 0x9b, 0x70, 0x74, 0x63, 0x10, 0x31, +- 0x0b, 0xba, 0xee, 0x58, 0x83, 0x07, 0x30, 0xc0, 0xf8, 0x37, 0x3a, 0x9f, +- 0x7a, 0x25, 0x8d, 0x89, 0x31, 0xbb, 0x06, 0xd9, 0x9b, 0x05, 0x22, 0x4e, +- 0x82, 0xce, 0x16, 0x42, 0xce, 0x7b, 0x66, 0x1d, 0x91, 0x7d, 0xd7, 0xde, +- 0x43, 0xfa, 0x8a, 0xf9, 0xb5, 0x0e, 0x8f, 0x59, 0x76, 0x09, 0x77, 0x11, +- 0x56, 0xa7, 0x21, 0x9a, 0xdf, 0x4c, 0xf3, 0x8f, 0x92, 0xec, 0x5c, 0xdc, +- 0xbb, 0x87, 0xd6, 0xb7, 0x38, 0xd6, 0xf4, 0xf3, 0xd8, 0x4e, 0x3a, 0x70, +- 0x8d, 0xe7, 0x31, 0x3e, 0xf3, 0x42, 0x3e, 0x33, 0xf5, 0x78, 0x8e, 0x2b, +- 0x1b, 0x3f, 0xcb, 0xd3, 0xde, 0x09, 0x64, 0xb7, 0xdb, 0x10, 0x13, 0xf6, +- 0x6e, 0xc2, 0x2f, 0xa8, 0x8f, 0x3a, 0x56, 0xff, 0x14, 0xa0, 0x44, 0x9c, +- 0x9d, 0x28, 0xc5, 0x80, 0x47, 0x0b, 0x96, 0x7b, 0x8f, 0x62, 0x0e, 0x26, +- 0x08, 0x13, 0x9f, 0x21, 0x4c, 0xbf, 0xab, 0x7d, 0xda, 0x8c, 0x83, 0xb1, +- 0x7e, 0x54, 0xbc, 0xb4, 0x5b, 0x41, 0xc7, 0x62, 0xea, 0x4b, 0x54, 0x4b, +- 0xae, 0xb1, 0xf9, 0xbe, 0x7c, 0x79, 0x7d, 0x05, 0x2f, 0xff, 0x6f, 0x39, +- 0x69, 0x92, 0xc5, 0xaa, 0x79, 0x69, 0xf5, 0x3d, 0x8d, 0x3f, 0x93, 0xd9, +- 0x18, 0xfb, 0x22, 0x42, 0xb5, 0xf8, 0x97, 0xf5, 0x28, 0x39, 0x49, 0xf2, +- 0x37, 0x75, 0x07, 0x75, 0x8e, 0x19, 0xf2, 0x65, 0xf6, 0x8d, 0x3c, 0x44, +- 0x7d, 0x9a, 0xf2, 0x2a, 0xc6, 0x7e, 0xe1, 0xfb, 0x3d, 0x19, 0x6f, 0x38, +- 0x41, 0xba, 0xa9, 0xe8, 0x4a, 0xa3, 0x5e, 0x71, 0xac, 0xb3, 0x63, 0x74, +- 0xe6, 0x16, 0xa7, 0x1e, 0xe7, 0x1a, 0xb8, 0x36, 0x46, 0xc5, 0x0f, 0x46, +- 0xcd, 0x1e, 0xc2, 0xc3, 0xab, 0xee, 0x21, 0x1c, 0x75, 0x9f, 0x50, 0xd1, +- 0x4b, 0x67, 0xb7, 0xda, 0xc8, 0x07, 0x84, 0x4d, 0x12, 0x6d, 0xd3, 0x66, +- 0x02, 0xd5, 0xf3, 0x5e, 0x90, 0x71, 0xcb, 0x72, 0xe3, 0xca, 0xc7, 0x32, +- 0x95, 0xe6, 0x18, 0xdf, 0x80, 0x70, 0x5c, 0x20, 0x94, 0x1e, 0xf2, 0x6c, +- 0x4b, 0x77, 0x2a, 0xd4, 0xa7, 0x1f, 0x62, 0x1f, 0x11, 0x7e, 0x7b, 0x59, +- 0xe6, 0xbe, 0xc2, 0xba, 0x6d, 0x9f, 0xd5, 0x73, 0x2d, 0xc7, 0x15, 0xfd, +- 0x96, 0x73, 0xd8, 0xde, 0x87, 0xa8, 0x8e, 0x77, 0x2d, 0xe9, 0xdc, 0x3e, +- 0xa8, 0x0c, 0x49, 0x63, 0x25, 0xfb, 0x93, 0x2e, 0x37, 0xb5, 0x9e, 0xaf, +- 0xb5, 0xa8, 0x73, 0x1c, 0xaf, 0x0f, 0x45, 0x45, 0xfd, 0x63, 0xae, 0xd7, +- 0x53, 0x5f, 0xa3, 0xb3, 0x9c, 0x4c, 0xf1, 0x19, 0x38, 0xc7, 0x8e, 0xe3, +- 0x8a, 0xd2, 0xed, 0xc4, 0x1b, 0xa0, 0xfd, 0xa1, 0x51, 0xbc, 0x41, 0x52, +- 0x9f, 0x39, 0xd7, 0x35, 0x25, 0x8d, 0x06, 0x96, 0x4f, 0xb6, 0x1e, 0x65, +- 0x5b, 0xf3, 0xdd, 0xb2, 0x6a, 0x6f, 0xe6, 0xe7, 0xf5, 0x74, 0xe9, 0x8e, +- 0xb1, 0xff, 0x50, 0x5f, 0xe7, 0xb0, 0x4d, 0x21, 0x6a, 0x9c, 0x4e, 0x63, +- 0x81, 0xd8, 0x21, 0xdd, 0x44, 0xb5, 0x86, 0x45, 0xc5, 0x84, 0xb7, 0x9e, +- 0xf7, 0xfe, 0xf4, 0xfa, 0x26, 0xf1, 0xce, 0x9e, 0xdf, 0xa5, 0x67, 0x2f, +- 0x46, 0x7a, 0x9f, 0xa2, 0x1c, 0xd2, 0x9c, 0x7e, 0x99, 0x6c, 0xe4, 0x18, +- 0x83, 0xf2, 0x8a, 0xbd, 0x56, 0xe6, 0x1a, 0x39, 0xd6, 0xe0, 0x26, 0x48, +- 0xce, 0xae, 0xc7, 0x7e, 0x75, 0x8e, 0xab, 0xdb, 0xa5, 0x9c, 0xb0, 0xd7, +- 0x90, 0x2d, 0x58, 0x4e, 0xd5, 0x16, 0x7b, 0x66, 0x6d, 0xd3, 0x5e, 0xf1, +- 0x5f, 0xc1, 0x3b, 0x83, 0x16, 0x72, 0xde, 0xc0, 0x4b, 0x79, 0xa5, 0x89, +- 0x6e, 0x2b, 0xe8, 0xb3, 0x05, 0x7e, 0xda, 0x43, 0xfa, 0x5d, 0x49, 0x58, +- 0x65, 0x91, 0x35, 0xdd, 0x1a, 0x58, 0x2f, 0x31, 0x77, 0x9a, 0x82, 0xe3, +- 0xbc, 0xd4, 0xda, 0x55, 0x84, 0xaf, 0xe0, 0x1e, 0xc5, 0xb6, 0x57, 0xf0, +- 0x32, 0xf1, 0xad, 0xb8, 0xc2, 0x32, 0x5a, 0x05, 0xf5, 0xb5, 0xbe, 0xa5, +- 0xe9, 0xe0, 0x2f, 0x63, 0x8f, 0xcf, 0x90, 0xf3, 0x74, 0xe0, 0x18, 0xec, +- 0x22, 0xdf, 0xe5, 0x56, 0x2a, 0x48, 0x2d, 0x06, 0x61, 0x8d, 0xa8, 0xd8, +- 0xba, 0x9b, 0xfd, 0xff, 0x3d, 0x9a, 0x67, 0xbe, 0xce, 0x66, 0x1d, 0xd6, +- 0xaa, 0xc3, 0x74, 0xb1, 0x24, 0x2c, 0x4a, 0xf6, 0xe0, 0xbd, 0xaa, 0x72, +- 0xaa, 0x32, 0xa2, 0x62, 0x72, 0x94, 0x79, 0x59, 0x17, 0xaa, 0xcd, 0x1c, +- 0x2b, 0x29, 0x8e, 0x8f, 0x8f, 0x65, 0x47, 0x3a, 0x1a, 0x43, 0x2d, 0xaf, +- 0x89, 0x0a, 0x7d, 0x0f, 0xcb, 0x85, 0x60, 0x3b, 0xc6, 0x48, 0xff, 0xf6, +- 0xf4, 0xe5, 0xb3, 0xfa, 0xff, 0xb1, 0x5e, 0xc1, 0x71, 0x51, 0x71, 0xd4, +- 0xdb, 0xbb, 0x62, 0xa3, 0x49, 0xb2, 0xf5, 0x44, 0xaa, 0xca, 0xf3, 0x38, +- 0xf1, 0x70, 0x9c, 0x7d, 0x66, 0x4f, 0x22, 0xea, 0x15, 0x8f, 0xe4, 0xe9, +- 0x92, 0x6a, 0x29, 0xd7, 0xd7, 0x52, 0x9e, 0x3c, 0x49, 0xbd, 0x69, 0x7f, +- 0xb1, 0x57, 0x6c, 0xcb, 0xeb, 0xd4, 0xa7, 0x96, 0x8b, 0xad, 0x79, 0x8b, +- 0x71, 0xd1, 0x6c, 0x9f, 0xaa, 0xbc, 0x8b, 0xda, 0x52, 0xfa, 0xe4, 0x3b, +- 0xa2, 0x48, 0x4e, 0x77, 0xd0, 0x37, 0x7f, 0xf8, 0x41, 0xa9, 0x58, 0xfc, +- 0x3e, 0xc8, 0x3a, 0x76, 0x22, 0x10, 0xe9, 0xe9, 0x59, 0x12, 0x40, 0xbd, +- 0x85, 0xbe, 0x66, 0xc2, 0x07, 0x57, 0x7a, 0x35, 0xdd, 0x80, 0x51, 0x6a, +- 0x6f, 0xac, 0xf8, 0x89, 0xf3, 0x0e, 0x6a, 0xad, 0x83, 0x5c, 0x0d, 0xd5, +- 0x91, 0x6b, 0xba, 0x43, 0xda, 0xd1, 0xee, 0xde, 0x96, 0xf6, 0xc9, 0xa6, +- 0x5c, 0xad, 0x73, 0x7d, 0x4b, 0xdb, 0xa4, 0xdb, 0xb2, 0x70, 0x08, 0xf8, +- 0xf2, 0x90, 0x0e, 0xcd, 0xb9, 0xd1, 0x0d, 0x74, 0x23, 0xa7, 0x52, 0x5c, +- 0xec, 0xe8, 0xb6, 0x7a, 0xa6, 0xc4, 0x4d, 0x37, 0x91, 0x1e, 0x2d, 0x9d, +- 0x93, 0x86, 0xb1, 0x39, 0xf3, 0xc0, 0x4d, 0x81, 0x29, 0xee, 0x2f, 0x1b, +- 0x06, 0xf7, 0xf1, 0x7b, 0x33, 0xba, 0x9b, 0x9e, 0xd0, 0xf1, 0xc0, 0xb2, +- 0xee, 0x41, 0x0c, 0xe4, 0x1f, 0x40, 0x7f, 0x9e, 0xdf, 0x3b, 0x69, 0x18, +- 0xe1, 0x1a, 0x5f, 0xe0, 0x77, 0x4e, 0x0f, 0x35, 0x30, 0x6e, 0xdc, 0x5e, +- 0x56, 0x71, 0xed, 0x10, 0xcf, 0x99, 0xcd, 0xef, 0xa3, 0xca, 0xfb, 0x59, +- 0x7c, 0x9f, 0xd4, 0x93, 0x6b, 0x1e, 0xb2, 0x81, 0x61, 0x29, 0x95, 0x0c, +- 0xdf, 0x63, 0x4e, 0x13, 0xd6, 0xe3, 0xbd, 0x7f, 0x4e, 0xbd, 0x71, 0x2e, +- 0xbf, 0x0b, 0x63, 0xca, 0x86, 0x87, 0x79, 0xee, 0xd4, 0xec, 0xdc, 0xbb, +- 0x34, 0x07, 0x71, 0x92, 0xea, 0xfa, 0x74, 0x25, 0x2f, 0xb2, 0xb5, 0xc3, +- 0x1a, 0xfe, 0xa8, 0xc0, 0x3c, 0x33, 0xb3, 0x3c, 0x3f, 0x21, 0x9e, 0x04, +- 0x56, 0xc4, 0xb8, 0x76, 0x53, 0xce, 0xec, 0xae, 0xbe, 0x2b, 0x93, 0xf2, +- 0x25, 0xfb, 0xc3, 0x68, 0xe5, 0x5d, 0x59, 0x54, 0x68, 0x8f, 0xd1, 0x33, +- 0x61, 0x95, 0x50, 0x2a, 0x2a, 0x42, 0x8f, 0xf1, 0xfa, 0x57, 0x53, 0x95, +- 0xf5, 0xc7, 0x52, 0xbc, 0xfe, 0xd7, 0xd7, 0xa8, 0xd9, 0xc8, 0x30, 0xdd, +- 0xa9, 0x0a, 0xff, 0x24, 0x77, 0x34, 0x56, 0x64, 0x57, 0xd6, 0x7d, 0x6f, +- 0x76, 0xdd, 0x41, 0x5a, 0xb7, 0x8f, 0x62, 0x8c, 0xd7, 0xb2, 0x9e, 0x1c, +- 0xa3, 0xd5, 0xf7, 0x86, 0x49, 0x71, 0x80, 0x7a, 0xf5, 0x81, 0x92, 0x2a, +- 0xf6, 0x52, 0x1d, 0x1c, 0xcf, 0x13, 0x36, 0xf2, 0xde, 0x05, 0x52, 0xcd, +- 0x2f, 0x7f, 0x23, 0x56, 0xf1, 0x21, 0xf7, 0xd5, 0x69, 0xea, 0xab, 0xed, +- 0x54, 0xdf, 0x55, 0x4f, 0xa7, 0xb0, 0x73, 0x84, 0xea, 0xbb, 0xc0, 0x49, +- 0xaf, 0xbe, 0x1c, 0x41, 0x7b, 0x89, 0xfb, 0x80, 0x25, 0xce, 0x15, 0x8c, +- 0x5c, 0x33, 0xc9, 0x6e, 0x29, 0x57, 0x6a, 0x03, 0xf5, 0x82, 0x2c, 0xf5, +- 0x64, 0xf1, 0x62, 0x89, 0x7f, 0x52, 0xf1, 0x8c, 0xf3, 0x19, 0xb2, 0x62, +- 0x4e, 0xbb, 0x8b, 0xfa, 0x76, 0x97, 0x71, 0xec, 0xc0, 0xf3, 0xc2, 0x9a, +- 0x3e, 0x27, 0xb2, 0xb7, 0x36, 0xe3, 0x41, 0xfc, 0x3c, 0x95, 0x5d, 0x11, +- 0xa5, 0x6f, 0xc2, 0xcc, 0x86, 0xc6, 0xef, 0x48, 0xbb, 0xdb, 0x7a, 0x36, +- 0x88, 0x36, 0xaa, 0x37, 0x6d, 0xee, 0x16, 0xb4, 0x51, 0xcf, 0xb7, 0xb5, +- 0xc3, 0x25, 0x5b, 0x7b, 0xa3, 0x54, 0xb5, 0x03, 0xc7, 0x29, 0xdb, 0x80, +- 0x42, 0xdf, 0xb1, 0xb2, 0x0b, 0x04, 0xf5, 0x55, 0xea, 0xbb, 0xc3, 0xd4, +- 0xb3, 0x2b, 0xf7, 0xce, 0x30, 0xe1, 0x16, 0xde, 0x7b, 0xdd, 0xec, 0xbb, +- 0x96, 0x7f, 0x90, 0x95, 0x1e, 0xf5, 0x0a, 0xd9, 0x83, 0xcf, 0xfc, 0xa3, +- 0x48, 0x65, 0xfc, 0x4c, 0x6c, 0xf6, 0xff, 0xf9, 0x21, 0x9c, 0x42, 0xf7, +- 0xc8, 0x21, 0x81, 0x1d, 0x6d, 0x95, 0x58, 0xee, 0xe4, 0xf7, 0x98, 0xde, +- 0x7b, 0xb7, 0x2a, 0x4f, 0xc5, 0x86, 0x0a, 0xe1, 0x99, 0x43, 0xe5, 0xac, +- 0xb8, 0x26, 0x8f, 0x01, 0xea, 0x89, 0xd9, 0x20, 0xf1, 0x5e, 0x53, 0xea, +- 0x15, 0xcb, 0xf3, 0x96, 0xb1, 0x89, 0x74, 0xdd, 0xa2, 0x77, 0xea, 0xe3, +- 0x84, 0x21, 0x68, 0x3f, 0x23, 0x4c, 0xf1, 0xaf, 0x39, 0x73, 0xb1, 0x7d, +- 0x36, 0x76, 0x28, 0x1f, 0x28, 0x7f, 0x06, 0xc5, 0x82, 0x49, 0xfe, 0xa9, +- 0x7b, 0xb1, 0x5b, 0xd1, 0xe3, 0x9c, 0xdc, 0x76, 0x33, 0xcf, 0x5f, 0x31, +- 0x6b, 0xfb, 0xa6, 0x38, 0xed, 0x49, 0xbf, 0x47, 0x66, 0xcf, 0xff, 0x7f, +- 0xad, 0xbd, 0xf6, 0x92, 0xff, 0xb9, 0x66, 0x86, 0xce, 0xc9, 0x18, 0x08, +- 0x6e, 0xdc, 0x61, 0xfc, 0x33, 0x6f, 0xd6, 0xe7, 0xd4, 0x15, 0xa3, 0x03, +- 0xb8, 0x71, 0x31, 0xdd, 0x7c, 0xe9, 0x0e, 0xb6, 0x8d, 0x7c, 0x95, 0x1c, +- 0x66, 0xbd, 0xcf, 0x93, 0xde, 0xd0, 0x6a, 0x9c, 0xb3, 0xb8, 0x7c, 0xa8, +- 0xb5, 0x3f, 0x2c, 0xcc, 0xe4, 0x90, 0x30, 0xfb, 0xa8, 0xbe, 0xd9, 0x93, +- 0x30, 0x9b, 0x17, 0x08, 0xd3, 0x58, 0x0b, 0xb6, 0xc9, 0x79, 0xb4, 0x95, +- 0xf8, 0xfb, 0x2c, 0x2c, 0xf2, 0x6b, 0xdf, 0x70, 0x00, 0x4a, 0xfa, 0x03, +- 0xb2, 0x2b, 0xe1, 0x35, 0xd1, 0x4c, 0xb9, 0xc4, 0xb1, 0x77, 0x1e, 0x9b, +- 0xf3, 0xd0, 0x5a, 0x88, 0xe7, 0x2a, 0xaa, 0xd1, 0xad, 0xc3, 0xe6, 0x59, +- 0xc2, 0x9c, 0x83, 0x5f, 0x0a, 0xb4, 0x26, 0xfb, 0x61, 0x0e, 0x6c, 0x41, +- 0xe7, 0xf4, 0x51, 0x61, 0x66, 0xcf, 0x12, 0x16, 0x0c, 0xa7, 0x2b, 0x32, +- 0x17, 0xcd, 0xca, 0x4c, 0x32, 0x3e, 0xf6, 0x72, 0x88, 0x30, 0x74, 0xfa, +- 0x6f, 0xe5, 0xb4, 0x67, 0xb3, 0xe0, 0xac, 0xfe, 0x4b, 0xe2, 0x15, 0x1f, +- 0x3c, 0x37, 0x6b, 0x1f, 0x42, 0x24, 0xb5, 0xcc, 0xc7, 0xf7, 0x30, 0x88, +- 0x35, 0xf9, 0x2f, 0xe2, 0x61, 0xc2, 0x43, 0x59, 0x6f, 0x7d, 0x2f, 0x72, +- 0x25, 0x88, 0xb5, 0xf9, 0xe9, 0xf0, 0x51, 0x3b, 0x88, 0xa2, 0x27, 0xe7, +- 0x7a, 0x1a, 0xeb, 0xa3, 0x0f, 0xdb, 0x8c, 0xef, 0xe4, 0x37, 0xd3, 0x73, +- 0xd6, 0xe3, 0xeb, 0xcf, 0xa3, 0x27, 0x9c, 0x22, 0xdc, 0xe6, 0xf1, 0x79, +- 0xf7, 0x75, 0xe2, 0x59, 0xce, 0x73, 0x23, 0xfc, 0xae, 0x61, 0x75, 0xa6, +- 0xcd, 0x78, 0xd8, 0xbb, 0x23, 0x1a, 0x58, 0x53, 0x32, 0x70, 0x07, 0xd5, +- 0xd5, 0xa2, 0x57, 0x57, 0x7f, 0x85, 0xe7, 0x15, 0xe2, 0x5b, 0x46, 0x7c, +- 0x9b, 0xbc, 0x31, 0x03, 0xcb, 0x4b, 0xc7, 0xbd, 0x58, 0x51, 0x1d, 0xf6, +- 0x03, 0xdb, 0x9e, 0xf1, 0x68, 0xf5, 0xae, 0xc6, 0x3e, 0xc9, 0x8a, 0x47, +- 0xf3, 0xbd, 0x62, 0x67, 0x3e, 0x4a, 0xfb, 0xb9, 0x62, 0x24, 0xa3, 0x8c, +- 0xc6, 0x20, 0xb1, 0x2c, 0x7d, 0x35, 0xd5, 0x19, 0x2b, 0x69, 0xd1, 0xb5, +- 0x65, 0x6d, 0x72, 0x2e, 0x61, 0xa7, 0x25, 0x58, 0x97, 0x0c, 0x51, 0xff, +- 0xfe, 0x16, 0xee, 0xd4, 0xc3, 0xe8, 0x4f, 0xde, 0x0b, 0xdc, 0x58, 0x43, +- 0xfd, 0xf6, 0x61, 0x0f, 0xb3, 0x86, 0x68, 0xdf, 0x1a, 0xaa, 0x0d, 0x77, +- 0x79, 0x7a, 0x4f, 0xb1, 0xae, 0x74, 0xce, 0xe5, 0x62, 0x84, 0xea, 0x7d, +- 0xa2, 0x82, 0x01, 0x36, 0x66, 0x8a, 0xfc, 0x3d, 0xb3, 0xb1, 0xcb, 0xb3, +- 0xf3, 0x4f, 0x36, 0xda, 0xa5, 0x5f, 0xc4, 0x2b, 0x3d, 0x75, 0x29, 0xb2, +- 0x8d, 0xdd, 0x58, 0x9f, 0xec, 0xc1, 0x1c, 0x6b, 0x39, 0xbe, 0xaa, 0xbb, +- 0x88, 0x5a, 0x63, 0xb8, 0xdb, 0x93, 0xc1, 0xf2, 0xbc, 0xbf, 0x6d, 0x10, +- 0x4d, 0x13, 0xc8, 0xf9, 0xbc, 0xfb, 0x50, 0xe5, 0xdd, 0x42, 0x4e, 0x09, +- 0x62, 0xd3, 0x2e, 0xfe, 0x56, 0x71, 0x77, 0xa6, 0xf2, 0xce, 0x70, 0x78, +- 0x2c, 0x88, 0xa1, 0x5d, 0xd4, 0xfb, 0x52, 0x21, 0xb8, 0x8d, 0x9f, 0x96, +- 0xdd, 0x4f, 0xb2, 0x2b, 0xf7, 0xef, 0xaf, 0x91, 0x5d, 0x67, 0x82, 0x41, +- 0x34, 0x13, 0x0c, 0x4b, 0x10, 0x4f, 0xc3, 0x54, 0x1d, 0x9a, 0xc7, 0xf8, +- 0xef, 0x23, 0x07, 0xc5, 0x7d, 0xa5, 0x0a, 0xcf, 0x46, 0xfe, 0x9b, 0x4a, +- 0x58, 0xc1, 0x7c, 0x8b, 0xd5, 0x55, 0x89, 0x47, 0xa3, 0x7b, 0x5c, 0x2d, +- 0xe6, 0x8f, 0xd5, 0xd1, 0x47, 0x47, 0x6c, 0x82, 0x26, 0xa6, 0x96, 0x8b, +- 0xaf, 0xe7, 0x93, 0x88, 0xd1, 0xfd, 0x32, 0xee, 0x54, 0xd6, 0xdf, 0x53, +- 0xfa, 0xbc, 0xf3, 0x07, 0xff, 0xbb, 0xb2, 0x6f, 0x01, 0x8e, 0xea, 0xbc, +- 0xd2, 0xfc, 0x6e, 0x3f, 0xa4, 0xd6, 0x93, 0xab, 0x27, 0x2d, 0x1e, 0xa6, +- 0x9b, 0xbe, 0x2d, 0xb5, 0xad, 0x4e, 0xb8, 0x0d, 0xa2, 0x90, 0x3d, 0xbd, +- 0xa5, 0x06, 0x0b, 0x5b, 0x04, 0x63, 0xcb, 0xb6, 0x32, 0x83, 0x67, 0x53, +- 0x63, 0x05, 0x03, 0xc6, 0xd8, 0x33, 0x91, 0x09, 0x35, 0x25, 0xef, 0xce, +- 0x44, 0x77, 0x25, 0x10, 0x02, 0xf5, 0x4b, 0x12, 0x04, 0x98, 0xaa, 0x2d, +- 0x37, 0x92, 0x40, 0xd8, 0x69, 0x49, 0x78, 0x92, 0xec, 0x90, 0x4c, 0xd5, +- 0x58, 0x01, 0x61, 0x20, 0x04, 0xe3, 0xec, 0x4e, 0x6d, 0x91, 0x5d, 0xcf, +- 0x98, 0xc2, 0x06, 0x9c, 0x18, 0x3f, 0x33, 0x59, 0x8b, 0x78, 0xe2, 0xbb, +- 0xdf, 0xb9, 0xdd, 0x0d, 0x82, 0x21, 0x99, 0x1a, 0x57, 0x75, 0x89, 0xee, +- 0x7b, 0xff, 0xff, 0x9e, 0xff, 0xfc, 0xe7, 0x7c, 0xe7, 0x3b, 0xe7, 0xfc, +- 0xb7, 0x4c, 0x2e, 0x2d, 0xfb, 0xb5, 0x08, 0xc5, 0xda, 0x94, 0xf9, 0x42, +- 0x96, 0xe3, 0x48, 0x1c, 0xed, 0xbe, 0xd9, 0x8f, 0x11, 0x99, 0x84, 0xcb, +- 0x41, 0xad, 0x08, 0x4b, 0x9e, 0xc7, 0x1f, 0xad, 0x3c, 0x51, 0x64, 0x90, +- 0xb9, 0x0b, 0x91, 0x3f, 0x2c, 0x73, 0x17, 0x21, 0xef, 0xa6, 0x2c, 0xf2, +- 0x1c, 0xa6, 0x5c, 0x13, 0x12, 0x5b, 0xe5, 0x79, 0xc7, 0x95, 0xa1, 0xb4, +- 0xc8, 0x90, 0x7b, 0xee, 0x59, 0x73, 0xa3, 0x5a, 0xc4, 0x18, 0x3e, 0x62, +- 0x6e, 0x62, 0x5e, 0xe2, 0x5f, 0xfa, 0x86, 0x99, 0x6a, 0x93, 0xb5, 0xba, +- 0xcd, 0xbd, 0x09, 0x27, 0xfa, 0xa9, 0xb7, 0xad, 0xa1, 0xa3, 0xc2, 0x67, +- 0xb3, 0xff, 0xe5, 0xf4, 0xf6, 0x97, 0xd4, 0xdb, 0xa9, 0xec, 0x3e, 0x1e, +- 0x57, 0x4e, 0xde, 0x8c, 0xf5, 0x22, 0xa3, 0xc8, 0xa5, 0xa0, 0x42, 0x13, +- 0xb9, 0x6c, 0x28, 0x67, 0xdc, 0xac, 0xa0, 0x7e, 0xca, 0x2d, 0x99, 0x9a, +- 0x95, 0x9f, 0x47, 0xa1, 0xce, 0x21, 0x17, 0x2c, 0x9b, 0xc8, 0xc8, 0x35, +- 0x45, 0xfd, 0x5c, 0xb8, 0x69, 0x13, 0xb3, 0xf5, 0x2c, 0x74, 0x46, 0x7c, +- 0xfa, 0xe2, 0x4b, 0x3b, 0x92, 0x32, 0xaf, 0x5d, 0xf2, 0x04, 0x2b, 0xdf, +- 0xb3, 0xd1, 0x9e, 0x56, 0x45, 0x33, 0x3a, 0xb0, 0x59, 0x7b, 0x20, 0x3e, +- 0x20, 0xeb, 0xcf, 0xad, 0xbd, 0x59, 0x79, 0x3a, 0x2a, 0xe3, 0x35, 0x2c, +- 0xb2, 0xc6, 0x59, 0xfb, 0xce, 0x71, 0x6f, 0x73, 0x5c, 0x80, 0x63, 0x32, +- 0xb6, 0xe9, 0x49, 0x7d, 0x26, 0x7e, 0xcd, 0x7d, 0x3a, 0xae, 0x74, 0xf2, +- 0x99, 0xb0, 0xf6, 0xf6, 0xfd, 0xac, 0xaf, 0x1f, 0xa7, 0x6f, 0xf2, 0x37, +- 0xa7, 0x8d, 0xf6, 0x5e, 0x04, 0xc7, 0xb0, 0xcb, 0xaa, 0x49, 0xc8, 0xdc, +- 0xcf, 0x45, 0xcb, 0x51, 0x70, 0x24, 0x37, 0x36, 0x13, 0xc3, 0x33, 0xbd, +- 0xac, 0x9c, 0x3f, 0x0a, 0x3e, 0x0a, 0x76, 0x1b, 0x4a, 0xe4, 0x66, 0x3f, +- 0x4a, 0x6a, 0x38, 0xd2, 0xa7, 0xcb, 0xa7, 0x3c, 0x52, 0xef, 0x53, 0x88, +- 0x19, 0xcc, 0x07, 0xd5, 0x55, 0x1e, 0x07, 0x71, 0x6e, 0x13, 0xbe, 0x20, +- 0xb7, 0x8d, 0x04, 0x9c, 0x96, 0x0f, 0x4b, 0xcd, 0x2f, 0x1f, 0x19, 0x0c, +- 0x02, 0x86, 0xa3, 0x8c, 0xbb, 0x5c, 0x2b, 0x63, 0x3d, 0xba, 0xd3, 0x5f, +- 0x98, 0x53, 0x95, 0xcc, 0xd9, 0xb5, 0x9b, 0x35, 0x22, 0xfa, 0x9d, 0x69, +- 0x8e, 0xf0, 0x5a, 0x6f, 0x3a, 0xb7, 0x4f, 0xe4, 0x10, 0xe4, 0x68, 0xcf, +- 0x68, 0xbf, 0x35, 0x37, 0xdc, 0x76, 0x6f, 0x0e, 0x9b, 0x73, 0x79, 0xa9, +- 0x60, 0x73, 0x31, 0x7a, 0xf7, 0x7a, 0x93, 0x29, 0x54, 0x22, 0xa9, 0xd9, +- 0xe6, 0xd3, 0x4b, 0x98, 0xf5, 0x7b, 0xfb, 0x9a, 0x61, 0xe5, 0xeb, 0x9e, +- 0x14, 0xfa, 0x2b, 0xc4, 0x8f, 0x9c, 0x5a, 0xbd, 0xa7, 0xcc, 0x56, 0x2e, +- 0xb2, 0x5b, 0x52, 0xd9, 0x07, 0x0b, 0xb0, 0x89, 0xb9, 0x76, 0xaa, 0x95, +- 0x98, 0x35, 0x68, 0xb4, 0x70, 0x7a, 0x57, 0x61, 0x38, 0xd5, 0xf9, 0x35, +- 0xbf, 0x97, 0xf1, 0x10, 0xc8, 0x67, 0xde, 0x7f, 0x09, 0x59, 0x4c, 0x1b, +- 0xf4, 0x1a, 0x36, 0x9b, 0x8c, 0xff, 0xcc, 0x34, 0xda, 0x64, 0xac, 0xcc, +- 0xc1, 0x67, 0xff, 0x1b, 0x5f, 0xf0, 0x50, 0x4f, 0x87, 0x2b, 0xa4, 0x7e, +- 0xa6, 0xd6, 0x92, 0xab, 0x0f, 0x16, 0xa3, 0x88, 0xb9, 0x6b, 0x7f, 0x95, +- 0xaf, 0x43, 0xb7, 0x15, 0xe2, 0xfc, 0x57, 0xfe, 0x13, 0x52, 0x55, 0x79, +- 0x70, 0xd5, 0x02, 0x0f, 0xc6, 0x6d, 0xb0, 0xd5, 0x12, 0x7b, 0x1b, 0x80, +- 0xe6, 0x09, 0xee, 0xdb, 0xa0, 0x82, 0xa7, 0x92, 0x36, 0x3c, 0x9a, 0xb4, +- 0x63, 0x6d, 0x12, 0xdf, 0x59, 0x04, 0x4c, 0xd7, 0xc0, 0xdf, 0x3e, 0xa3, +- 0x60, 0x6b, 0x29, 0xfc, 0xad, 0x31, 0xc5, 0xdf, 0xb2, 0x96, 0x39, 0xd3, +- 0x9a, 0x09, 0xe2, 0x19, 0xef, 0x75, 0x0e, 0x70, 0x5f, 0x07, 0xec, 0xa8, +- 0x19, 0xc0, 0x3d, 0xf9, 0x40, 0x83, 0x13, 0xfe, 0x19, 0xc6, 0x99, 0x72, +- 0x07, 0xfc, 0x53, 0x97, 0xed, 0xfe, 0xce, 0x1a, 0x3b, 0x37, 0xb7, 0x56, +- 0x64, 0x71, 0xe1, 0x31, 0xda, 0xf3, 0xa2, 0x41, 0xde, 0xcf, 0xfc, 0x5d, +- 0x65, 0x9e, 0xf3, 0xc9, 0x9f, 0x48, 0xfd, 0x52, 0xae, 0x49, 0xef, 0x52, +- 0x41, 0xe9, 0xa0, 0x9d, 0x18, 0x76, 0xce, 0x3c, 0x5f, 0x25, 0xf8, 0x0d, +- 0x3c, 0x45, 0xd9, 0xdc, 0xfc, 0x4d, 0xad, 0x25, 0x37, 0x5d, 0xa1, 0x62, +- 0xfd, 0xb0, 0xdc, 0x0b, 0x6b, 0x1e, 0x27, 0x7d, 0x2a, 0x8f, 0x3e, 0x7e, +- 0xc4, 0xea, 0x77, 0xd9, 0xb8, 0x46, 0x3b, 0x8a, 0x06, 0x81, 0x35, 0x71, +- 0x3c, 0x51, 0x0c, 0x7f, 0x44, 0x64, 0xac, 0x5b, 0xee, 0xe0, 0xd8, 0x62, +- 0xb4, 0x4c, 0x64, 0xc6, 0x3d, 0x3c, 0xf1, 0xa3, 0x8a, 0x4c, 0x2d, 0xf7, +- 0xf7, 0xf7, 0x5e, 0x7b, 0x1a, 0xfc, 0xd8, 0x94, 0xa4, 0xcd, 0xd9, 0x3c, +- 0x18, 0xce, 0xd6, 0x54, 0x37, 0xa4, 0xbc, 0xb3, 0x7a, 0xa3, 0xff, 0xbd, +- 0x38, 0xdb, 0x37, 0xa5, 0x2f, 0xcc, 0x70, 0x1e, 0x43, 0xd9, 0x40, 0xdd, +- 0x0d, 0x4f, 0x9a, 0x88, 0xea, 0x26, 0xc6, 0xf9, 0x79, 0x53, 0x87, 0x51, +- 0x44, 0x5f, 0xd8, 0x18, 0xfb, 0xd2, 0x34, 0xb2, 0xfe, 0xfc, 0x4a, 0x22, +- 0xa0, 0x6c, 0x21, 0x57, 0x7e, 0x95, 0xf1, 0x74, 0x8c, 0x9f, 0x51, 0xe6, +- 0x70, 0x4e, 0xca, 0x6d, 0xa3, 0x5f, 0xef, 0x4c, 0x01, 0x23, 0xcc, 0xd1, +- 0x0f, 0x2e, 0x17, 0xfe, 0x5e, 0xc4, 0xe7, 0xd1, 0x6b, 0x78, 0x4f, 0x9a, +- 0x9f, 0x23, 0xfc, 0x4c, 0x72, 0x4f, 0xf9, 0x3c, 0x04, 0xc6, 0x1d, 0x88, +- 0x8c, 0x13, 0x68, 0xc7, 0x03, 0x98, 0x62, 0x0c, 0xbc, 0x31, 0xaa, 0xa2, +- 0x64, 0xac, 0x1c, 0x1f, 0x1d, 0x26, 0x3e, 0x1e, 0xca, 0x70, 0xfe, 0x4d, +- 0xe3, 0xd2, 0xdf, 0x92, 0xf5, 0x49, 0x1f, 0x58, 0xfc, 0xa9, 0x00, 0x63, +- 0xa4, 0x1f, 0xd2, 0x0b, 0x7e, 0x57, 0xe7, 0xdc, 0xaa, 0xf4, 0xf1, 0x5a, +- 0x71, 0x34, 0xea, 0xf3, 0xf4, 0xd1, 0xe6, 0x0d, 0x87, 0xf8, 0x58, 0x03, +- 0x5e, 0x8d, 0xe6, 0x7a, 0x42, 0xbe, 0x96, 0x9f, 0x4a, 0x3d, 0x83, 0x21, +- 0x3b, 0x4f, 0x93, 0x6b, 0xb9, 0x58, 0x2a, 0x6b, 0x96, 0xba, 0x74, 0x8e, +- 0xb7, 0xcc, 0xfe, 0xfd, 0x8c, 0x29, 0x7d, 0xca, 0xd7, 0x26, 0xbd, 0x7d, +- 0x29, 0xe8, 0x56, 0xac, 0x3c, 0x5c, 0xe7, 0x4d, 0x1a, 0x90, 0xfd, 0x6d, +- 0xa0, 0x0c, 0xdf, 0xa5, 0xed, 0x07, 0x44, 0xd7, 0x8c, 0xed, 0x52, 0xef, +- 0x2d, 0x43, 0xff, 0x40, 0x39, 0xf6, 0x0c, 0x18, 0xe8, 0x5d, 0xde, 0x86, +- 0x33, 0x51, 0x13, 0x9b, 0x42, 0x26, 0xd6, 0x84, 0xbc, 0x81, 0x57, 0x50, +- 0xdf, 0x78, 0x14, 0x8f, 0x91, 0x43, 0xa8, 0xd4, 0xc9, 0x37, 0xf0, 0xce, +- 0x5e, 0x07, 0x36, 0xeb, 0x7f, 0x4c, 0x1f, 0x36, 0xcd, 0xf7, 0x96, 0x2d, +- 0xc0, 0x70, 0xa2, 0x5e, 0xed, 0xa6, 0x7c, 0x91, 0x36, 0xee, 0x55, 0xd0, +- 0x81, 0x67, 0xf5, 0xef, 0xf0, 0x5e, 0xb7, 0xcd, 0xa1, 0xc9, 0x77, 0x1b, +- 0xe3, 0xa9, 0xec, 0xa5, 0x41, 0xfb, 0xca, 0xc4, 0xb2, 0x48, 0xb6, 0xce, +- 0xbe, 0xb9, 0x41, 0x30, 0xbf, 0x18, 0xa7, 0xa9, 0xb7, 0x13, 0xc9, 0x08, +- 0xc3, 0x2e, 0x94, 0x67, 0x1b, 0xba, 0xf0, 0x34, 0xf9, 0xc6, 0x3b, 0x24, +- 0x02, 0xf7, 0xc7, 0x15, 0x34, 0xd6, 0xe9, 0xb8, 0x98, 0xfe, 0x06, 0xde, +- 0x1a, 0x0d, 0xe3, 0x4d, 0xc6, 0xf4, 0x25, 0xdf, 0xf5, 0x92, 0x83, 0x7a, +- 0x70, 0x3e, 0x1d, 0xc6, 0xb9, 0xa8, 0xb7, 0xf5, 0x05, 0x65, 0x01, 0x7e, +- 0x9a, 0x76, 0xe0, 0xde, 0x38, 0xf0, 0x4b, 0xce, 0xe3, 0x8f, 0x3b, 0x70, +- 0x25, 0xad, 0xe2, 0x28, 0xf7, 0xc7, 0x11, 0x5a, 0x02, 0xa3, 0xcd, 0x83, +- 0x23, 0x43, 0x8f, 0x62, 0x2a, 0xf5, 0x28, 0x4e, 0x25, 0xdf, 0x31, 0x5d, +- 0x9a, 0xf4, 0x75, 0x5c, 0xb8, 0xc2, 0x7c, 0x6c, 0x9a, 0xda, 0x28, 0x5e, +- 0xd1, 0xca, 0x38, 0xaf, 0x19, 0xa2, 0xf7, 0xb7, 0xf8, 0xdb, 0xfd, 0xf1, +- 0x46, 0x1c, 0x1c, 0xa7, 0x4a, 0x13, 0x3a, 0x12, 0x31, 0x79, 0x56, 0x03, +- 0x62, 0xe4, 0x85, 0xfd, 0x4c, 0xdb, 0xb7, 0x86, 0xee, 0x95, 0x5c, 0x43, +- 0x69, 0xa9, 0xed, 0xcf, 0xae, 0xa3, 0x71, 0x56, 0xcf, 0x4e, 0x72, 0x28, +- 0xea, 0x95, 0xe3, 0xfe, 0x36, 0x11, 0xb4, 0x62, 0xd3, 0xb1, 0x9b, 0xfb, +- 0xd1, 0xc8, 0xfd, 0xf8, 0x06, 0x2e, 0xee, 0x6d, 0xc3, 0x5b, 0xc4, 0xbb, +- 0xd2, 0x65, 0xbe, 0x4e, 0xa7, 0xad, 0x9e, 0x73, 0xa7, 0xcd, 0x54, 0x95, +- 0xe8, 0xb4, 0x0d, 0xbf, 0x88, 0x8a, 0x4e, 0xd3, 0xc4, 0x3f, 0x9f, 0xc7, +- 0x6f, 0xff, 0xcb, 0x4a, 0xda, 0xb3, 0xad, 0x3b, 0x98, 0xe9, 0x41, 0x15, +- 0xaf, 0x70, 0xe1, 0xaa, 0x25, 0x9b, 0xc8, 0xfa, 0x87, 0xe4, 0xfb, 0x85, +- 0xb9, 0xa6, 0x4a, 0xe4, 0x33, 0xcc, 0x3c, 0x4d, 0x0b, 0xe4, 0x29, 0x12, +- 0x67, 0x03, 0x56, 0x3d, 0xbe, 0x2e, 0xde, 0x05, 0x7b, 0xa8, 0x98, 0x79, +- 0x98, 0x77, 0xa6, 0x03, 0x6f, 0xe1, 0xda, 0xa4, 0x0b, 0x8b, 0xe3, 0x1a, +- 0x5e, 0x9e, 0x7c, 0x8d, 0xcf, 0xfa, 0x47, 0x5c, 0xe6, 0x77, 0x5f, 0x3c, +- 0xe3, 0x6f, 0xdd, 0x0d, 0x6d, 0x78, 0x30, 0x2d, 0xeb, 0xcb, 0xe3, 0x83, +- 0x74, 0x44, 0xd2, 0xb2, 0xce, 0x18, 0x7d, 0x43, 0xd6, 0x59, 0xfe, 0xef, +- 0xac, 0xf3, 0xbf, 0x72, 0xbe, 0x05, 0xf4, 0xa5, 0x5c, 0xec, 0x28, 0xc1, +- 0x91, 0xa4, 0x8a, 0xd3, 0x7a, 0x31, 0x2e, 0xa9, 0x52, 0x5f, 0x76, 0x31, +- 0x86, 0x38, 0xd0, 0xcc, 0x9c, 0x71, 0x84, 0x9f, 0x8d, 0xcc, 0x7f, 0xce, +- 0xea, 0x0e, 0x9c, 0xd2, 0x17, 0x10, 0xeb, 0xef, 0xb4, 0x61, 0xb9, 0x46, +- 0xb2, 0x5f, 0x56, 0x8e, 0x73, 0x52, 0xff, 0xb3, 0xae, 0xbb, 0xa4, 0x2f, +- 0x89, 0x31, 0xea, 0x2b, 0x2f, 0xf6, 0x1b, 0xf3, 0xaa, 0x85, 0x35, 0x77, +- 0xca, 0x77, 0xe7, 0x3c, 0x12, 0x82, 0x7f, 0x69, 0x6e, 0xad, 0xca, 0xc6, +- 0x2e, 0xe5, 0x4f, 0x2b, 0x33, 0x78, 0x21, 0x71, 0xec, 0xef, 0x72, 0xd8, +- 0x21, 0xf9, 0x64, 0x1b, 0xe3, 0x10, 0xe3, 0xf2, 0xf1, 0x6d, 0x92, 0xe7, +- 0xd9, 0xc2, 0xef, 0xb5, 0xad, 0xd2, 0xf2, 0x60, 0xb7, 0xf8, 0xde, 0x7b, +- 0x2f, 0x65, 0x38, 0xfa, 0xfb, 0x2f, 0x69, 0xd6, 0xdf, 0xeb, 0x2f, 0x2d, +- 0xb6, 0xfe, 0x7e, 0xf2, 0x92, 0x2f, 0x75, 0x2b, 0x5e, 0x65, 0x38, 0xb0, +- 0x75, 0x6e, 0x05, 0x7d, 0xba, 0xa1, 0x3c, 0xdc, 0x20, 0x5c, 0x72, 0x36, +- 0x8f, 0x08, 0x28, 0x67, 0xa3, 0x92, 0xa7, 0x15, 0x1a, 0xcc, 0xe3, 0x95, +- 0x46, 0xbf, 0x46, 0x3c, 0xee, 0x42, 0xc9, 0x32, 0x0d, 0x17, 0xa8, 0x73, +- 0xc2, 0x28, 0xed, 0xf8, 0xff, 0x20, 0xba, 0x17, 0xed, 0x85, 0x16, 0xf6, +- 0x98, 0x66, 0x7f, 0x48, 0x6a, 0x0c, 0x32, 0xaf, 0x03, 0x1f, 0x70, 0x2f, +- 0x7f, 0x35, 0x5a, 0x84, 0xf7, 0x53, 0x1a, 0x2e, 0xa5, 0xdb, 0xb0, 0x7b, +- 0x32, 0xc3, 0x33, 0x4e, 0x59, 0xfc, 0x5b, 0x63, 0x8e, 0xe9, 0xc0, 0xc1, +- 0xa8, 0x86, 0x58, 0xe2, 0x75, 0xb3, 0x40, 0xf3, 0x4d, 0xf9, 0xed, 0x0e, +- 0x1c, 0x48, 0x4f, 0x63, 0x72, 0xe0, 0x63, 0xd3, 0xae, 0x75, 0xe1, 0xa3, +- 0xd0, 0x34, 0x26, 0x0e, 0x49, 0x5f, 0x4f, 0x47, 0xff, 0x90, 0x86, 0xde, +- 0x84, 0x0d, 0x7b, 0x96, 0xb7, 0xa0, 0x7f, 0xb2, 0x19, 0xc6, 0x98, 0x07, +- 0x7b, 0xd2, 0x69, 0x4c, 0x8d, 0x4e, 0xe3, 0x4c, 0x52, 0x6b, 0x2c, 0x50, +- 0xa6, 0x71, 0x9a, 0xcf, 0xd9, 0x91, 0x78, 0x1b, 0x06, 0xe7, 0xd8, 0x99, +- 0x94, 0x9a, 0xa4, 0x3c, 0x67, 0x1a, 0xdd, 0xa9, 0xbb, 0xd5, 0x44, 0x28, +- 0x4f, 0xa2, 0xa7, 0x3d, 0x53, 0xab, 0x27, 0xbe, 0xa6, 0x35, 0xa5, 0x8f, +- 0xfb, 0x74, 0x34, 0x9d, 0xab, 0xdb, 0xdf, 0x59, 0x0b, 0xd1, 0xd1, 0x37, +- 0xd4, 0xc2, 0x31, 0x1a, 0xba, 0x13, 0xd2, 0x1b, 0xf5, 0xf1, 0x99, 0x26, +- 0x7e, 0xa9, 0x7b, 0xdd, 0x8b, 0xf9, 0xf7, 0xb0, 0xde, 0x89, 0x2d, 0x9c, +- 0x6b, 0x8a, 0x79, 0x90, 0xa6, 0x78, 0x1b, 0x0d, 0xd8, 0xf1, 0x9e, 0x4e, +- 0xce, 0x53, 0x69, 0xc7, 0xab, 0x7a, 0x09, 0x22, 0x65, 0x76, 0xd4, 0x87, +- 0x18, 0xa7, 0xb3, 0x71, 0xfb, 0xc3, 0xa4, 0x82, 0x47, 0x89, 0xa9, 0x27, +- 0x42, 0xf5, 0xed, 0xab, 0x85, 0xd1, 0x1d, 0x52, 0x70, 0x4d, 0xbb, 0x61, +- 0x1a, 0x8c, 0x5d, 0x2e, 0x7f, 0x6e, 0x8f, 0x7e, 0x6d, 0x66, 0xfa, 0x9b, +- 0x5f, 0x98, 0xb9, 0x71, 0x33, 0x94, 0xf1, 0x29, 0x8e, 0x5b, 0xbc, 0xac, +- 0xbe, 0x53, 0xc6, 0xb9, 0x89, 0xe9, 0x32, 0x4e, 0xea, 0xd1, 0xb7, 0xc6, +- 0xe9, 0xd8, 0x39, 0x14, 0xb1, 0xe4, 0xdd, 0x95, 0xc0, 0x52, 0x07, 0xc4, +- 0x9f, 0xea, 0xd5, 0x2b, 0x40, 0xd7, 0xb4, 0x3e, 0x87, 0x5c, 0xc7, 0x1f, +- 0xd8, 0x08, 0xd1, 0x95, 0xe4, 0x92, 0x6f, 0x63, 0x4f, 0x74, 0x14, 0xcc, +- 0x27, 0x89, 0x73, 0xfe, 0xf5, 0x23, 0x48, 0xe1, 0xf9, 0x74, 0x0a, 0x2f, +- 0x50, 0x47, 0x86, 0x75, 0x6e, 0x29, 0x8d, 0x3f, 0x8f, 0xbe, 0x8d, 0x98, +- 0xb5, 0x67, 0x47, 0xb1, 0x21, 0xfa, 0xf7, 0x55, 0xc2, 0x11, 0x77, 0x24, +- 0x56, 0x72, 0x7e, 0xd1, 0xab, 0xb7, 0xd5, 0xc0, 0x97, 0x9c, 0x7f, 0x25, +- 0x7a, 0x46, 0x4c, 0xf3, 0x7b, 0x8c, 0x5f, 0x3f, 0x23, 0xbf, 0xba, 0x96, +- 0x3d, 0x03, 0x55, 0x40, 0x7d, 0x6b, 0x56, 0x1c, 0x6b, 0xe3, 0x3e, 0x57, +- 0x0b, 0xaf, 0x47, 0xc9, 0xb8, 0xa6, 0x2c, 0x8e, 0xc9, 0xbe, 0x93, 0x37, +- 0x8e, 0x7b, 0xf0, 0x14, 0x39, 0x4a, 0xfe, 0xe1, 0x1f, 0x28, 0x12, 0xcb, +- 0x6a, 0x0e, 0x91, 0xef, 0x1f, 0xf2, 0x28, 0x4b, 0xf6, 0xb9, 0xf0, 0x68, +- 0x4c, 0xea, 0x37, 0xcd, 0xe8, 0xd9, 0xaf, 0xf1, 0x1e, 0xaf, 0x7e, 0x81, +- 0x39, 0xe9, 0x69, 0xf8, 0x3c, 0x23, 0xe4, 0x55, 0x6e, 0x62, 0xb1, 0xe3, +- 0x70, 0x29, 0x8a, 0x0e, 0xab, 0xb0, 0x1d, 0x2e, 0x47, 0xf1, 0x61, 0x37, +- 0x6a, 0x18, 0xdb, 0xdc, 0xe3, 0x17, 0x31, 0xb9, 0x0f, 0x6a, 0x51, 0xf8, +- 0x73, 0x33, 0x5f, 0x93, 0x3e, 0x5b, 0x00, 0xa5, 0xe3, 0xdb, 0x91, 0x8e, +- 0x05, 0x51, 0x3c, 0x4e, 0x2a, 0x35, 0x7e, 0x5c, 0xa9, 0xe7, 0x33, 0x1f, +- 0x8a, 0x69, 0x9c, 0x2b, 0xc3, 0x75, 0x56, 0x73, 0x5c, 0x5f, 0xc2, 0xbb, +- 0x5e, 0x7a, 0x65, 0xd7, 0xf4, 0x37, 0x50, 0x30, 0x70, 0xeb, 0x2c, 0x97, +- 0x16, 0xc2, 0x3c, 0x72, 0x91, 0xd6, 0x67, 0x91, 0x39, 0xd7, 0xf5, 0x70, +- 0x76, 0x4d, 0x41, 0x59, 0x93, 0xb3, 0x8d, 0xb6, 0x30, 0x57, 0xea, 0x5f, +- 0xb8, 0x4c, 0xfb, 0xb9, 0x9f, 0xf2, 0xde, 0x60, 0x6e, 0xd8, 0x19, 0x13, +- 0xbb, 0xff, 0x81, 0x42, 0xbf, 0xc1, 0x4c, 0xaa, 0x08, 0x1f, 0xa7, 0x3c, +- 0x8a, 0x8f, 0xeb, 0xf9, 0x0b, 0x5e, 0xff, 0x73, 0xae, 0x67, 0xc7, 0x7e, +- 0x6f, 0xeb, 0x49, 0xc5, 0xdb, 0xbe, 0x4e, 0xf1, 0xa9, 0x3b, 0x94, 0x62, +- 0x5c, 0x1e, 0x2d, 0xc5, 0x15, 0xc6, 0xe2, 0x1b, 0xa3, 0xe5, 0xb8, 0x3a, +- 0x5a, 0x49, 0x5f, 0xd1, 0x38, 0x87, 0x69, 0x96, 0x68, 0x6e, 0xcc, 0xa4, +- 0x5f, 0xc0, 0x9c, 0xd8, 0x02, 0x7c, 0x9c, 0xde, 0x82, 0xd2, 0x98, 0x70, +- 0x76, 0x0f, 0x3e, 0xe2, 0xf5, 0x0f, 0xd3, 0x13, 0x28, 0xdc, 0xf7, 0x39, +- 0xef, 0x31, 0xcd, 0x87, 0xb8, 0xc6, 0xab, 0xe9, 0x0e, 0x14, 0xef, 0xdb, +- 0x06, 0xc7, 0x3e, 0xb3, 0xab, 0x27, 0x84, 0x9f, 0xda, 0xb9, 0x96, 0x6e, +- 0xdd, 0x3b, 0xb5, 0xd8, 0x1e, 0xe4, 0x1c, 0x3a, 0xe7, 0x3c, 0xae, 0x2c, +- 0x19, 0xdf, 0x86, 0xd2, 0x7d, 0x1e, 0x6c, 0xa5, 0x2e, 0x27, 0xa0, 0x05, +- 0xd6, 0x29, 0xdb, 0x90, 0x77, 0x38, 0xa3, 0x83, 0x4d, 0xe3, 0x19, 0x1f, +- 0x79, 0xa8, 0x41, 0xea, 0x43, 0xc7, 0x95, 0x11, 0xcb, 0x47, 0xdc, 0x72, +- 0xfe, 0x04, 0xd3, 0xe9, 0x22, 0x9c, 0x4d, 0x89, 0x8e, 0xe4, 0xec, 0xda, +- 0x04, 0xf2, 0xf7, 0x11, 0x23, 0x47, 0x75, 0x8b, 0x43, 0x88, 0x6f, 0x8c, +- 0xa6, 0xef, 0xe6, 0x5f, 0x41, 0xec, 0x49, 0xd4, 0xd0, 0xb7, 0x16, 0x60, +- 0xcd, 0x3e, 0xe9, 0x91, 0x4e, 0xdd, 0xef, 0xa2, 0x35, 0x8d, 0xa5, 0xef, +- 0xe6, 0x5b, 0x0d, 0xb4, 0x53, 0x6f, 0x8b, 0x01, 0x39, 0xab, 0x61, 0x62, +- 0x5a, 0x3f, 0xae, 0xd8, 0x62, 0x92, 0x6f, 0xb5, 0xd1, 0xe7, 0x5b, 0xd1, +- 0x33, 0x84, 0xf6, 0x83, 0x0d, 0xd2, 0xb7, 0x75, 0x62, 0x84, 0xf9, 0xd3, +- 0x65, 0xe6, 0x1c, 0xd4, 0xb9, 0x9a, 0x17, 0xce, 0xc3, 0xf0, 0xa8, 0x0b, +- 0x3f, 0x1a, 0xf5, 0xa0, 0x31, 0xf6, 0x39, 0x31, 0xa3, 0x10, 0xc7, 0xa9, +- 0xef, 0x49, 0xf2, 0x9f, 0x8f, 0xa2, 0x2a, 0x26, 0x18, 0x6b, 0x3f, 0x8c, +- 0x56, 0x62, 0x9c, 0xb9, 0xd6, 0x75, 0xe2, 0x4c, 0x9a, 0x7b, 0xf3, 0x01, +- 0xf3, 0x8e, 0xef, 0xa5, 0x83, 0xf8, 0x55, 0x34, 0x88, 0x57, 0xa9, 0xc7, +- 0xba, 0x98, 0x9b, 0x32, 0x1d, 0x53, 0x70, 0xe8, 0xb8, 0x92, 0x47, 0xbb, +- 0xf0, 0xc7, 0x34, 0xcf, 0x48, 0xd6, 0x2e, 0xb4, 0xf1, 0x56, 0xfa, 0x91, +- 0xf4, 0xff, 0x25, 0x3e, 0x38, 0xf4, 0x11, 0x90, 0xd3, 0x05, 0x73, 0x75, +- 0x42, 0xaf, 0x7b, 0x0a, 0x15, 0xf4, 0xa5, 0x2f, 0x4d, 0x55, 0x93, 0x9a, +- 0x58, 0x32, 0x74, 0x2d, 0xaa, 0xa9, 0x57, 0xad, 0x35, 0x18, 0x8a, 0x73, +- 0x39, 0x39, 0x46, 0xe5, 0x0e, 0xae, 0x5f, 0x23, 0x66, 0x38, 0xe8, 0x32, +- 0x26, 0xef, 0xbb, 0x8e, 0xfb, 0x0e, 0xfd, 0x69, 0x75, 0x86, 0x03, 0xd1, +- 0x9f, 0x6d, 0x77, 0xd6, 0xb1, 0xa4, 0x96, 0xbd, 0x37, 0xf4, 0x46, 0x34, +- 0x56, 0x2d, 0x3d, 0xa5, 0x93, 0x08, 0x52, 0x2f, 0x77, 0xcb, 0x15, 0x4c, +- 0xbc, 0x45, 0x4c, 0xb9, 0x9a, 0x14, 0xbe, 0x24, 0x3c, 0xa9, 0x8b, 0x31, +- 0xa9, 0x84, 0x3c, 0x41, 0xc3, 0x4e, 0x72, 0x79, 0x5f, 0x7c, 0x8a, 0xb9, +- 0xca, 0x57, 0xc9, 0xd5, 0x4a, 0x39, 0x8d, 0xc1, 0xe7, 0xb5, 0x62, 0x0f, +- 0x7d, 0xb3, 0x40, 0x5b, 0x8c, 0x35, 0xe4, 0x41, 0x0e, 0x8d, 0xa1, 0xe4, +- 0x09, 0x89, 0x27, 0x40, 0x6d, 0x5c, 0x95, 0x7e, 0xcf, 0xfa, 0x9f, 0xe1, +- 0x7e, 0xb4, 0x57, 0xb9, 0x20, 0x3d, 0x9a, 0x37, 0xd1, 0x84, 0xd4, 0xd7, +- 0xad, 0xde, 0x30, 0xdc, 0x61, 0xcd, 0xb8, 0x88, 0x45, 0x16, 0x23, 0x2f, +- 0x0c, 0x8b, 0x3c, 0x95, 0xd4, 0xbf, 0x8a, 0x77, 0xa9, 0xd7, 0x2b, 0x51, +- 0xdf, 0xcc, 0x83, 0xa8, 0x3f, 0x73, 0xc5, 0x2e, 0xfd, 0x2b, 0xb9, 0x3f, +- 0x08, 0x8d, 0xf3, 0x7d, 0x1a, 0x0d, 0x61, 0x40, 0x95, 0xef, 0xc2, 0x1b, +- 0x5b, 0xd1, 0x3d, 0x22, 0x32, 0x98, 0x66, 0x39, 0xf1, 0xf1, 0x09, 0xeb, +- 0xf9, 0xf2, 0xec, 0x3b, 0xf3, 0x0e, 0xaf, 0x6a, 0x20, 0x97, 0x7b, 0x4c, +- 0xe3, 0x68, 0xd2, 0x03, 0xc7, 0xf2, 0xff, 0x41, 0x3d, 0x4c, 0x63, 0x34, +- 0xa5, 0x91, 0x53, 0x16, 0xc1, 0x53, 0x15, 0x44, 0x3f, 0xe3, 0x78, 0x8c, +- 0xf7, 0xa7, 0x63, 0x45, 0x30, 0xaa, 0x32, 0xcf, 0xfc, 0x6a, 0xfc, 0xba, +- 0x39, 0xf5, 0xb8, 0xcc, 0x29, 0xdf, 0x7f, 0xce, 0x31, 0x73, 0xe5, 0xd8, +- 0x23, 0x36, 0xc7, 0xae, 0x9a, 0x53, 0xad, 0xb3, 0x7f, 0x2f, 0xb3, 0xce, +- 0x10, 0x45, 0x6c, 0x55, 0x52, 0x6f, 0xb1, 0xf4, 0xd2, 0x4d, 0xbd, 0xcc, +- 0xd1, 0xde, 0x36, 0x1f, 0xb3, 0xe4, 0x9a, 0xaa, 0x16, 0x9e, 0x5f, 0x1b, +- 0xff, 0xbc, 0x5a, 0xea, 0xa5, 0x12, 0xc3, 0x5c, 0x61, 0xad, 0xf1, 0x0c, +- 0xfe, 0xd1, 0xbc, 0x74, 0xdb, 0x3c, 0x15, 0xbc, 0x26, 0xf1, 0xe8, 0x52, +- 0xb6, 0x1f, 0xed, 0xce, 0xe6, 0x02, 0xd3, 0x38, 0x99, 0x94, 0x58, 0xe0, +- 0xc1, 0x06, 0xa9, 0x43, 0xa9, 0xde, 0x3e, 0x03, 0x53, 0xe4, 0x7e, 0xef, +- 0x50, 0xf7, 0x4c, 0x80, 0xfc, 0x53, 0xe4, 0x7f, 0xb3, 0xe3, 0x55, 0x04, +- 0xa9, 0x4a, 0xe9, 0x29, 0x08, 0x9e, 0x4e, 0x63, 0x57, 0xf2, 0x75, 0xe2, +- 0xda, 0xc7, 0xe4, 0x43, 0x5d, 0xe4, 0xda, 0xd3, 0xe8, 0x49, 0x35, 0xe3, +- 0xe5, 0xfd, 0x2d, 0xc4, 0x18, 0xc1, 0x4a, 0xdf, 0x99, 0xcb, 0xf6, 0x66, +- 0x1c, 0x1c, 0x4b, 0x23, 0x75, 0x58, 0x62, 0xa4, 0x9c, 0xc7, 0x92, 0xf8, +- 0xa8, 0x21, 0x9a, 0x38, 0x0d, 0x83, 0x7f, 0xf7, 0x24, 0xb6, 0x21, 0x72, +- 0xf8, 0x6d, 0x72, 0xfc, 0x69, 0xac, 0x1e, 0xd0, 0xd6, 0x1f, 0xc1, 0x34, +- 0xd6, 0x32, 0x7e, 0x26, 0x13, 0x2d, 0x9c, 0xbf, 0x19, 0xbd, 0xfb, 0xbd, +- 0x01, 0x87, 0x6d, 0x0e, 0x63, 0x94, 0x07, 0x3b, 0x27, 0x23, 0x30, 0x46, +- 0xe4, 0x8c, 0x81, 0x0b, 0xc1, 0xb8, 0x47, 0xf9, 0x90, 0x3c, 0xb9, 0x3e, +- 0xee, 0x65, 0x7e, 0xe6, 0x35, 0xd6, 0x2a, 0x3e, 0x4f, 0x9e, 0x4d, 0xfa, +- 0x59, 0x73, 0x70, 0x46, 0x57, 0x50, 0x70, 0xbf, 0x82, 0x10, 0x63, 0x97, +- 0xa7, 0x9a, 0x31, 0x65, 0x44, 0x47, 0xef, 0x10, 0xd7, 0x7b, 0x73, 0xdf, +- 0x64, 0xbf, 0x1e, 0xe1, 0x7c, 0xb2, 0x77, 0x2d, 0xe8, 0x9d, 0xf4, 0x75, +- 0x9c, 0x81, 0xdb, 0xe2, 0x5c, 0xbd, 0x43, 0xb9, 0x7b, 0x50, 0xfc, 0x71, +- 0x83, 0x37, 0x30, 0x47, 0x91, 0x7b, 0x77, 0x10, 0xbf, 0x66, 0xdf, 0x6f, +- 0x28, 0xc9, 0xe5, 0xe4, 0xa5, 0x36, 0xf1, 0x8b, 0x6e, 0xcb, 0x5f, 0x44, +- 0x17, 0xbd, 0xc9, 0x08, 0x6d, 0xfa, 0xc7, 0x66, 0xaa, 0xb5, 0x95, 0x72, +- 0x36, 0x48, 0xaf, 0xc7, 0xe2, 0x26, 0xe7, 0xa5, 0xee, 0xe6, 0x94, 0xd8, +- 0xdd, 0xdd, 0xee, 0xa2, 0x3d, 0xe5, 0x13, 0x9f, 0x0a, 0x26, 0x5c, 0x70, +- 0x1d, 0x29, 0x42, 0xfe, 0xb0, 0xf0, 0x34, 0xa8, 0xa5, 0xcc, 0xfb, 0xe5, +- 0x3c, 0xc3, 0x30, 0x6d, 0xd4, 0x36, 0x41, 0x1f, 0x8b, 0xba, 0xb1, 0x68, +- 0xc2, 0x8d, 0x1f, 0x11, 0x03, 0x6a, 0x26, 0x34, 0x1c, 0x27, 0x06, 0xb8, +- 0x27, 0x02, 0x98, 0x24, 0x06, 0xcc, 0xc9, 0xd6, 0x3e, 0xde, 0x4c, 0xcf, +- 0x9f, 0x8b, 0x42, 0x79, 0x96, 0xe8, 0x31, 0xb7, 0xaf, 0xb2, 0xa7, 0x2d, +- 0xc4, 0x3d, 0xd9, 0xdf, 0x00, 0x76, 0x0f, 0xa5, 0xb1, 0x6a, 0x9f, 0x89, +- 0x9f, 0xeb, 0xf5, 0xee, 0x02, 0x45, 0xf2, 0x04, 0x13, 0x69, 0x5d, 0xce, +- 0x4d, 0x7a, 0xd7, 0xcb, 0xb9, 0xe2, 0xf6, 0x4a, 0x13, 0x79, 0x21, 0xaf, +- 0x4e, 0xb4, 0x5f, 0x5f, 0xa0, 0x48, 0xdc, 0xaa, 0xf7, 0x6c, 0xc1, 0x7c, +- 0x64, 0x7a, 0x65, 0x0f, 0x62, 0x8b, 0xaa, 0xd0, 0x1f, 0x5b, 0xb0, 0xa7, +- 0xcc, 0x70, 0x5d, 0x6b, 0x30, 0xcd, 0x4d, 0xa1, 0xdf, 0x56, 0x59, 0xb5, +- 0x65, 0xdb, 0x1f, 0x71, 0xed, 0x6d, 0x5c, 0xb7, 0xac, 0xbd, 0x03, 0xb1, +- 0xbd, 0x0a, 0xd2, 0xfe, 0x0e, 0x44, 0x47, 0x3b, 0xd0, 0xbf, 0x57, 0x30, +- 0xa1, 0x8f, 0x98, 0x60, 0x76, 0x3d, 0x1b, 0x7a, 0x0c, 0x57, 0x2d, 0x16, +- 0x20, 0x63, 0xbc, 0x01, 0x8f, 0x6d, 0xf6, 0x3e, 0xe4, 0x53, 0xfe, 0x8c, +- 0xef, 0x34, 0x0f, 0x08, 0xa7, 0xf6, 0xf7, 0xf5, 0x72, 0xff, 0x1f, 0x3f, +- 0x24, 0xf1, 0xc6, 0x34, 0xfb, 0xc8, 0x59, 0x51, 0x26, 0x6b, 0xd0, 0xa4, +- 0x3e, 0xfe, 0x71, 0x8d, 0xe6, 0x9b, 0xe9, 0x67, 0x6c, 0xbf, 0xb8, 0xaf, +- 0x7e, 0xcb, 0x16, 0xe1, 0x31, 0xcb, 0x84, 0xdb, 0xa5, 0x71, 0xe1, 0xf0, +- 0x7d, 0x48, 0x3d, 0xce, 0xf5, 0x70, 0xaf, 0x9c, 0xf1, 0x2f, 0x4c, 0xe1, +- 0x72, 0x76, 0x4d, 0x53, 0x8f, 0x12, 0xfb, 0x6c, 0x13, 0x7e, 0xf4, 0x94, +- 0xc1, 0xb8, 0xd6, 0x20, 0xcf, 0xbf, 0x29, 0x3f, 0xd7, 0xdb, 0x8c, 0xfe, +- 0xfd, 0xc2, 0x35, 0x84, 0x97, 0xf9, 0x8c, 0x0f, 0xd0, 0x82, 0xe4, 0x64, +- 0xe6, 0x59, 0xd1, 0xc4, 0x9d, 0xb6, 0x22, 0xfb, 0x7e, 0x1a, 0xbb, 0x69, +- 0x97, 0x2e, 0xce, 0xcf, 0xf8, 0xc2, 0xf9, 0xb4, 0x40, 0x81, 0x3c, 0x6f, +- 0xe2, 0xc7, 0xe6, 0x9e, 0x2a, 0xd1, 0x8d, 0xcc, 0x7f, 0xba, 0x4a, 0x30, +- 0x63, 0x53, 0xe8, 0x0f, 0xad, 0xf5, 0x75, 0xfe, 0xf5, 0xb6, 0x64, 0xf4, +- 0x21, 0xf7, 0x9e, 0xfe, 0x3d, 0xf2, 0x5c, 0xe0, 0x7d, 0x22, 0x53, 0x07, +- 0x76, 0xef, 0x85, 0x51, 0xa8, 0x49, 0xaf, 0xa0, 0x03, 0x7d, 0xd4, 0xef, +- 0xce, 0x64, 0x07, 0x0e, 0xd2, 0x67, 0x87, 0xf5, 0x13, 0x35, 0x36, 0xd4, +- 0xcd, 0xd8, 0x31, 0xf5, 0x93, 0x45, 0xc4, 0xd3, 0x25, 0xcb, 0xfc, 0xf4, +- 0xaf, 0x0e, 0xc4, 0x53, 0x63, 0x73, 0xad, 0x3e, 0x9f, 0x4d, 0xe2, 0x9f, +- 0xe8, 0xa2, 0x13, 0x85, 0x03, 0xa7, 0xe1, 0x1c, 0xe8, 0x44, 0x81, 0xbf, +- 0x09, 0x0f, 0x87, 0x2e, 0x99, 0x57, 0x35, 0x87, 0xfb, 0x24, 0xf5, 0x73, +- 0x22, 0x58, 0xc3, 0x7c, 0x92, 0x39, 0xcc, 0xc8, 0x3c, 0xfa, 0x7e, 0x03, +- 0xf9, 0xae, 0xf4, 0xf4, 0x6d, 0x58, 0xbb, 0x5c, 0x72, 0x75, 0x85, 0xb6, +- 0x5d, 0xcd, 0x5c, 0x53, 0x53, 0x9f, 0xb7, 0xce, 0x5f, 0x90, 0x87, 0x55, +- 0x7a, 0xf0, 0x8c, 0x75, 0xee, 0x40, 0xae, 0x6f, 0x67, 0x8e, 0xb0, 0x1d, +- 0x35, 0x31, 0xc3, 0x14, 0x7d, 0x9f, 0x44, 0xe4, 0x25, 0x1b, 0xe5, 0x68, +- 0x5c, 0xe6, 0xdf, 0x32, 0xa3, 0x88, 0x4d, 0xfb, 0xdb, 0x27, 0x14, 0xdd, +- 0xf5, 0xc8, 0xb8, 0x82, 0xc0, 0x00, 0xe7, 0x0a, 0xfd, 0xf5, 0xdc, 0x4c, +- 0x7d, 0x2c, 0xc7, 0xf9, 0xb6, 0x93, 0x27, 0x6c, 0x47, 0x09, 0xc7, 0xbb, +- 0x35, 0xc1, 0x86, 0xc8, 0x4a, 0xe9, 0xa5, 0xa4, 0x43, 0xfe, 0xd6, 0x62, +- 0x45, 0xf8, 0x90, 0xbf, 0x71, 0xad, 0x22, 0xdc, 0x45, 0xc6, 0xe9, 0xae, +- 0xba, 0xf1, 0x8b, 0xd9, 0x9e, 0x57, 0x03, 0xf1, 0xc1, 0x63, 0x9d, 0x85, +- 0x7c, 0xed, 0xe6, 0x79, 0x89, 0x4c, 0xbd, 0xda, 0x19, 0x97, 0xbc, 0xe2, +- 0x58, 0x68, 0x55, 0xb4, 0x91, 0x58, 0x67, 0x36, 0x8d, 0xd1, 0xee, 0x2f, +- 0xa3, 0x12, 0xff, 0x33, 0x2a, 0xb8, 0xe6, 0xc1, 0xff, 0x8a, 0xe6, 0x4b, +- 0xbe, 0x9c, 0x92, 0x7a, 0xe4, 0xb9, 0xa4, 0x61, 0x52, 0xaf, 0x2d, 0x6b, +- 0x69, 0x4b, 0x81, 0x50, 0x31, 0x50, 0xd5, 0xfd, 0x8c, 0xd3, 0xca, 0xdf, +- 0x4b, 0x50, 0xc6, 0x18, 0x30, 0x30, 0xf2, 0xfb, 0x6a, 0xaf, 0xc4, 0xe1, +- 0x42, 0xa9, 0x81, 0xda, 0xb1, 0x33, 0xf4, 0x2f, 0x66, 0x2a, 0x7b, 0x76, +- 0xf5, 0xc2, 0x5e, 0xb1, 0xd3, 0x00, 0xf2, 0xe3, 0x17, 0x69, 0x93, 0x2a, +- 0xce, 0x47, 0x7d, 0xfa, 0x3a, 0xdb, 0x37, 0x68, 0xff, 0x8b, 0x6e, 0xc3, +- 0xee, 0x45, 0xda, 0xa3, 0x78, 0xda, 0xc2, 0xee, 0x30, 0x7a, 0x18, 0x1b, +- 0xc8, 0xe3, 0x0e, 0x3c, 0x63, 0x53, 0x51, 0x10, 0xf3, 0xa9, 0x3e, 0xe6, +- 0xdb, 0x3d, 0x7c, 0x86, 0x70, 0xcc, 0x0a, 0x72, 0xc0, 0x67, 0xa3, 0xf5, +- 0x9e, 0x5f, 0x63, 0x03, 0xfd, 0x51, 0x9e, 0x21, 0x6b, 0xd2, 0x50, 0xcc, +- 0xbc, 0xf2, 0x14, 0xd7, 0xb1, 0xb3, 0x2c, 0xf3, 0xdc, 0xd2, 0xec, 0xdc, +- 0xf1, 0x11, 0xe1, 0x5f, 0x2b, 0xb0, 0xce, 0x9a, 0x3b, 0x68, 0xf9, 0xe6, +- 0x01, 0x39, 0x5b, 0x5e, 0xa7, 0x21, 0x91, 0x6e, 0xc6, 0xb6, 0xf2, 0x05, +- 0x38, 0x98, 0xd8, 0x8e, 0xa5, 0xe4, 0xc1, 0x4f, 0x96, 0x1b, 0x8c, 0x8d, +- 0xc4, 0xa1, 0xb8, 0xa6, 0xde, 0xa7, 0x3c, 0x90, 0xed, 0x3f, 0x54, 0xc2, +- 0x11, 0x97, 0x98, 0x97, 0x87, 0x41, 0x75, 0x3e, 0x8a, 0xac, 0x33, 0x7f, +- 0x99, 0xb9, 0xfb, 0x47, 0xbc, 0xd9, 0x38, 0x48, 0xd4, 0x88, 0x5b, 0xe7, +- 0x2d, 0x02, 0x2f, 0x90, 0x4b, 0xa4, 0x18, 0x01, 0xf3, 0xc2, 0x5a, 0x6a, +- 0x33, 0x0a, 0x60, 0x54, 0x0b, 0x26, 0xca, 0x98, 0x79, 0x77, 0xc8, 0x54, +- 0x9e, 0x95, 0x29, 0x77, 0x3d, 0xc5, 0x6b, 0x62, 0x5b, 0xc2, 0x2f, 0xe4, +- 0xf7, 0x42, 0xb4, 0xd2, 0x9e, 0x2a, 0x29, 0x73, 0xc2, 0x3a, 0xb7, 0xe9, +- 0xd5, 0x0d, 0x5b, 0x03, 0x3e, 0xdb, 0x97, 0xb1, 0xc1, 0xf5, 0xb5, 0xdc, +- 0xff, 0xd2, 0x06, 0xcc, 0x1c, 0x96, 0x78, 0xf6, 0xfb, 0xcf, 0x52, 0x18, +- 0x37, 0xcf, 0x52, 0x88, 0x5e, 0xbd, 0x67, 0xde, 0x45, 0xfd, 0xd4, 0x53, +- 0xb6, 0xa3, 0x26, 0x2a, 0x44, 0xc7, 0x9b, 0xdd, 0x92, 0x87, 0xda, 0xc8, +- 0x23, 0x8c, 0x74, 0xd2, 0x2d, 0xb1, 0xd2, 0x11, 0x07, 0x16, 0xc5, 0x0d, +- 0xe4, 0x87, 0xb5, 0x03, 0xd7, 0xec, 0x37, 0xcc, 0xf6, 0xea, 0x79, 0xcc, +- 0x03, 0x6f, 0xad, 0xb9, 0x8f, 0xb2, 0xdb, 0xb5, 0x1f, 0x9b, 0x0f, 0x56, +- 0x8a, 0x8c, 0x3f, 0x72, 0x67, 0xea, 0xcc, 0x0b, 0xa9, 0x97, 0x9c, 0x4e, +- 0x4c, 0xda, 0xcf, 0xdf, 0x98, 0x5f, 0xbb, 0xed, 0xba, 0xf0, 0x19, 0xb1, +- 0xd3, 0xd9, 0x67, 0xdb, 0xc4, 0x66, 0x3d, 0xb4, 0xd3, 0x69, 0x8c, 0x25, +- 0x1b, 0x30, 0x90, 0x10, 0x1d, 0x47, 0x70, 0x99, 0xfc, 0xb0, 0x76, 0x70, +- 0x1a, 0xc3, 0xe4, 0x87, 0xbe, 0xb8, 0xf7, 0x00, 0x35, 0x89, 0x6d, 0x6a, +- 0x93, 0xc5, 0x93, 0x5c, 0x5a, 0x4e, 0x86, 0xaf, 0x5a, 0x7a, 0x97, 0x18, +- 0xb3, 0x87, 0xeb, 0xbd, 0x97, 0x3c, 0xa9, 0x39, 0x96, 0x0f, 0xad, 0xac, +- 0x14, 0xc5, 0x9a, 0xf4, 0x2b, 0x32, 0xf7, 0x45, 0x29, 0x4b, 0x91, 0xe6, +- 0xc3, 0x5a, 0xeb, 0x5e, 0x8f, 0x75, 0xae, 0xc1, 0x51, 0x2e, 0x31, 0x58, +- 0xe2, 0x2e, 0xf9, 0xf7, 0x72, 0x89, 0xbb, 0x61, 0xca, 0xb6, 0x98, 0x7b, +- 0xb6, 0x14, 0xee, 0x07, 0x3c, 0xa8, 0x79, 0x80, 0x31, 0x72, 0x89, 0x82, +- 0xf2, 0x25, 0x7e, 0x63, 0xa9, 0xad, 0x19, 0xa8, 0xd6, 0x88, 0x3f, 0x6e, +- 0xb3, 0x27, 0xf1, 0x3b, 0xce, 0xd1, 0x01, 0x73, 0x6f, 0x21, 0x36, 0xec, +- 0x9d, 0x43, 0x5b, 0xf5, 0x48, 0x7d, 0xdd, 0xe5, 0x0a, 0x47, 0x43, 0xae, +- 0x58, 0xbd, 0xee, 0x54, 0x16, 0x33, 0x1e, 0xcb, 0xfe, 0xc9, 0xf3, 0xbf, +- 0x72, 0x1b, 0x5f, 0xaa, 0x60, 0x7c, 0x7b, 0xd2, 0x92, 0x41, 0x6a, 0xc0, +- 0x32, 0xee, 0xdf, 0xee, 0xd3, 0xd4, 0xcd, 0x7d, 0xba, 0x0f, 0x8e, 0x27, +- 0x2a, 0xc9, 0xbf, 0xee, 0x1e, 0x43, 0x0a, 0x18, 0x43, 0xee, 0x8d, 0x99, +- 0x5d, 0x5b, 0x43, 0x45, 0x52, 0x17, 0xb2, 0x62, 0x48, 0xbb, 0x8d, 0x38, +- 0x5a, 0x2a, 0x76, 0xe1, 0xab, 0x21, 0xc6, 0xe9, 0x99, 0xdf, 0xc4, 0x3e, +- 0xac, 0x3a, 0x5e, 0xf6, 0xb7, 0x0e, 0xec, 0x22, 0x66, 0xca, 0xd9, 0x6e, +- 0xa7, 0xa6, 0xd1, 0xff, 0x3b, 0xd0, 0xc3, 0x39, 0x5f, 0x26, 0x6e, 0x0e, +- 0x10, 0x37, 0x6f, 0x2c, 0x3b, 0xf1, 0x93, 0x1a, 0xd4, 0xd1, 0x08, 0xa6, +- 0xfe, 0x5b, 0xb9, 0xe0, 0xe6, 0x52, 0x7f, 0xc7, 0x27, 0x16, 0x6e, 0xca, +- 0xdc, 0x32, 0xdf, 0xec, 0xb9, 0x17, 0xf2, 0xdf, 0x85, 0x52, 0x4b, 0x34, +- 0x9d, 0xda, 0xff, 0x36, 0x77, 0x56, 0x8a, 0xac, 0x77, 0x93, 0x43, 0xb0, +- 0x76, 0x76, 0x4f, 0x7e, 0x9a, 0x98, 0x6b, 0xe5, 0x08, 0x8c, 0xb9, 0x11, +- 0xac, 0x59, 0xae, 0xe2, 0x6a, 0x74, 0x1a, 0x05, 0x87, 0x72, 0xf8, 0x64, +- 0x36, 0x9d, 0x22, 0x36, 0x0d, 0x43, 0xf0, 0xa8, 0x91, 0xfb, 0x62, 0xd0, +- 0x4f, 0x4a, 0x30, 0x91, 0xd4, 0x88, 0x99, 0x26, 0xfa, 0x43, 0x2e, 0x72, +- 0xdb, 0xee, 0x93, 0x79, 0x56, 0x9c, 0x28, 0x21, 0x86, 0xe7, 0x78, 0xb7, +- 0x70, 0x6e, 0xc1, 0x1f, 0xe6, 0x18, 0x23, 0x76, 0xe4, 0x2d, 0x93, 0xbc, +- 0xe2, 0x73, 0xf3, 0x42, 0x9b, 0xdc, 0xb7, 0x00, 0xc3, 0x7b, 0xc5, 0xfe, +- 0x7c, 0xa8, 0xd1, 0x2e, 0x32, 0xcf, 0x00, 0xde, 0x8f, 0xda, 0xee, 0x71, +- 0x91, 0x1b, 0x77, 0xe9, 0xcb, 0x71, 0xa3, 0xa2, 0x87, 0x3e, 0xef, 0xe6, +- 0x6f, 0x53, 0x38, 0x12, 0x75, 0x21, 0xcf, 0xd2, 0x69, 0x29, 0xd7, 0x90, +- 0xb1, 0xa1, 0x9d, 0xb4, 0xa1, 0x7c, 0xe6, 0x6f, 0x0f, 0x5b, 0xbe, 0x2a, +- 0xf3, 0x4c, 0xe3, 0x15, 0x72, 0x5a, 0x6d, 0xb9, 0xf0, 0xd9, 0x20, 0xe3, +- 0x62, 0x09, 0xe2, 0x03, 0x5d, 0x38, 0x1f, 0x2a, 0x41, 0xec, 0x90, 0xf8, +- 0xd8, 0x02, 0xc1, 0x52, 0x3e, 0xb7, 0x91, 0x3a, 0x51, 0x89, 0x35, 0xf5, +- 0x9d, 0x76, 0x7b, 0x09, 0x2e, 0x95, 0x31, 0xaf, 0xb5, 0xde, 0xe3, 0x69, +- 0xc5, 0xc1, 0xac, 0x5d, 0xa8, 0xb4, 0x8b, 0xd6, 0x9b, 0x3c, 0x3a, 0xb7, +- 0x96, 0x9c, 0xcf, 0x66, 0xfa, 0xe1, 0xbd, 0xe4, 0x36, 0x2f, 0x4b, 0xfd, +- 0xc8, 0xe6, 0x63, 0x2c, 0x61, 0xce, 0x34, 0x29, 0xfa, 0xfd, 0xeb, 0xb9, +- 0x19, 0xac, 0x78, 0xa5, 0x26, 0x73, 0x76, 0x25, 0xa7, 0xf7, 0xdc, 0x77, +- 0x6d, 0x7d, 0xa1, 0xf2, 0x0b, 0x73, 0x6b, 0x95, 0xc8, 0x77, 0x9d, 0x79, +- 0xda, 0x77, 0xf9, 0xfb, 0x2a, 0xf4, 0x8e, 0xcc, 0x8e, 0x15, 0xe2, 0x87, +- 0x9e, 0xdb, 0xce, 0xd5, 0x95, 0xc5, 0xe5, 0xdd, 0xa9, 0x63, 0xa1, 0x67, +- 0xb8, 0x0f, 0xfe, 0xa5, 0xf5, 0x56, 0xdd, 0x85, 0xdc, 0x97, 0x79, 0x89, +- 0x60, 0xac, 0xc1, 0x18, 0x5f, 0x82, 0x9f, 0x26, 0x25, 0xe6, 0x9a, 0xc8, +- 0xa7, 0xfd, 0x5d, 0xaa, 0xec, 0x7e, 0xbe, 0xcc, 0xe2, 0xd2, 0x25, 0x28, +- 0xa7, 0xbd, 0x0f, 0x8e, 0xdc, 0xcd, 0xb6, 0x6f, 0xc5, 0x85, 0x74, 0x48, +- 0x21, 0x4e, 0xfc, 0x8b, 0xd9, 0xff, 0xf5, 0xcc, 0x98, 0x0b, 0x49, 0x17, +- 0x3e, 0x0a, 0xb5, 0x63, 0xaa, 0x2c, 0x8c, 0xa1, 0x44, 0x01, 0xda, 0xab, +- 0xeb, 0xac, 0x77, 0x0a, 0x6a, 0xe2, 0x1e, 0x5c, 0x8c, 0x3a, 0xd1, 0x38, +- 0xd7, 0x63, 0xd5, 0xd3, 0x6c, 0xf4, 0x85, 0x77, 0xa2, 0x11, 0xcb, 0xe7, +- 0x66, 0xc7, 0x8c, 0x3c, 0x6d, 0x19, 0x1e, 0xca, 0xe2, 0xfa, 0xc1, 0xc4, +- 0xe7, 0xc4, 0x9d, 0x52, 0xa3, 0x22, 0x5c, 0x82, 0x7b, 0x87, 0x0c, 0xc1, +- 0x64, 0xa3, 0x24, 0xac, 0xcd, 0xdc, 0xa7, 0x94, 0xa0, 0x69, 0x44, 0x30, +- 0x5e, 0x7c, 0x35, 0x4d, 0x5f, 0x6d, 0xe3, 0x1e, 0x75, 0xa2, 0x6e, 0xbf, +- 0xa5, 0x57, 0xd5, 0xae, 0x98, 0x5d, 0x57, 0xf4, 0x88, 0xce, 0x18, 0xd7, +- 0xf9, 0x10, 0xed, 0x7e, 0x26, 0xe4, 0x6d, 0xaf, 0xb0, 0x6b, 0x1d, 0xef, +- 0x29, 0x41, 0x4c, 0x8c, 0x03, 0x03, 0x87, 0x03, 0xf8, 0x20, 0x21, 0x9c, +- 0x3f, 0x80, 0x5f, 0x4d, 0x06, 0xf1, 0x2e, 0x63, 0x53, 0x41, 0xdc, 0x1b, +- 0x79, 0x8e, 0x39, 0xdd, 0xfb, 0xfc, 0x9e, 0x1f, 0xd7, 0x71, 0x8d, 0xfa, +- 0x73, 0xc6, 0x1b, 0x70, 0x65, 0xf2, 0x01, 0x5c, 0xdd, 0xaf, 0xe0, 0x84, +- 0xf6, 0x00, 0x2e, 0x8f, 0x75, 0x62, 0xd9, 0x7e, 0x39, 0x87, 0x76, 0x2c, +- 0xa4, 0x32, 0x36, 0x3c, 0x53, 0x6b, 0x76, 0xbd, 0xa8, 0xd7, 0x41, 0x2f, +- 0xf7, 0xea, 0xed, 0xcc, 0x99, 0x04, 0xd3, 0x23, 0x36, 0xd9, 0x33, 0xd9, +- 0xbb, 0x4e, 0x5c, 0xb5, 0x70, 0xfc, 0xee, 0xd8, 0x70, 0x0b, 0xc3, 0xe5, +- 0x39, 0x82, 0x27, 0x0b, 0xf1, 0x7d, 0x26, 0xab, 0x3d, 0xbc, 0xcf, 0x45, +- 0xec, 0x7b, 0x36, 0x5a, 0x80, 0xfc, 0xaa, 0x52, 0x2b, 0x97, 0x29, 0x8c, +- 0x07, 0x70, 0x96, 0xba, 0x5b, 0x53, 0xe5, 0xe5, 0x77, 0x89, 0xbb, 0x41, +- 0xe6, 0x2d, 0x15, 0xf8, 0xe0, 0xb6, 0x78, 0xfb, 0x7d, 0xf3, 0x49, 0x0b, +- 0x9f, 0xeb, 0xe7, 0x09, 0xff, 0x7a, 0x3d, 0xf1, 0xeb, 0x1a, 0xc1, 0x69, +- 0xa9, 0x21, 0x96, 0x6a, 0xda, 0x96, 0xbf, 0x80, 0xbc, 0x6f, 0x75, 0xe2, +- 0x3f, 0x17, 0x93, 0x17, 0xbf, 0x18, 0xaa, 0x33, 0xca, 0xa0, 0xf1, 0xbe, +- 0xa9, 0x65, 0x2a, 0x56, 0xf1, 0xaf, 0x9f, 0xf7, 0x05, 0x29, 0xc7, 0x75, +- 0x33, 0xa5, 0xfa, 0xf8, 0xef, 0x05, 0x8c, 0xef, 0xdb, 0x71, 0x3e, 0x56, +- 0xdf, 0x7e, 0x58, 0xb9, 0x66, 0x1a, 0x55, 0xb5, 0xfc, 0xad, 0x12, 0x17, +- 0xa2, 0xde, 0xa9, 0x31, 0xd4, 0x7b, 0x66, 0x94, 0x83, 0xa6, 0xa1, 0xca, +- 0xfe, 0xc8, 0x7a, 0x65, 0xfc, 0x62, 0x5e, 0xbf, 0x34, 0xcb, 0x0e, 0x6f, +- 0xe5, 0x5d, 0xce, 0x9b, 0xf6, 0x27, 0xbc, 0xc4, 0x6c, 0x1a, 0xd5, 0xeb, +- 0xd5, 0x1e, 0x62, 0x41, 0x44, 0xbd, 0x9b, 0xfd, 0x15, 0xd0, 0xfe, 0xc2, +- 0xcc, 0x23, 0x4b, 0xa0, 0x5a, 0xf1, 0xa9, 0x15, 0xc9, 0x91, 0xd9, 0xdc, +- 0x52, 0xec, 0x2e, 0xc3, 0x53, 0xdb, 0xcb, 0xba, 0x4f, 0x3a, 0x89, 0x45, +- 0x09, 0xe2, 0x78, 0x9c, 0x38, 0x9e, 0x4f, 0x1c, 0xbf, 0xbe, 0xaf, 0x10, +- 0xe7, 0xf7, 0x35, 0x22, 0x5d, 0x26, 0x63, 0xec, 0x70, 0x72, 0x75, 0xa9, +- 0xec, 0x79, 0x85, 0x9a, 0xc1, 0x95, 0x72, 0x8e, 0x13, 0x82, 0x5f, 0x79, +- 0x71, 0xe6, 0x59, 0xad, 0x76, 0x38, 0xac, 0x33, 0xf6, 0x73, 0x6e, 0xb3, +- 0x3f, 0x97, 0x96, 0x8f, 0x96, 0x4a, 0xc1, 0x87, 0xd7, 0xe7, 0x49, 0x1c, +- 0x7d, 0x9d, 0xb2, 0x9c, 0xa4, 0x4d, 0x6f, 0xd4, 0x57, 0x48, 0x5f, 0x8f, +- 0xf7, 0xcb, 0x38, 0xc9, 0x6d, 0x4c, 0xec, 0xa6, 0x85, 0xd5, 0x55, 0x99, +- 0x48, 0xe8, 0x61, 0xc6, 0xac, 0x10, 0x22, 0x65, 0x41, 0xc6, 0x2a, 0xf9, +- 0xae, 0xe2, 0x0a, 0xf3, 0xb2, 0xf1, 0xa0, 0x82, 0x8f, 0xbe, 0x22, 0x5c, +- 0xc0, 0xaf, 0x9f, 0x57, 0x84, 0x0b, 0xc8, 0x78, 0xc1, 0x88, 0x52, 0x0b, +- 0x23, 0xf2, 0x2d, 0x5e, 0x34, 0xd7, 0xc2, 0x16, 0x79, 0x47, 0xa9, 0x86, +- 0x71, 0xe7, 0xfe, 0x44, 0xfd, 0x94, 0xcf, 0x4e, 0x8e, 0xf6, 0x27, 0x5f, +- 0x21, 0x37, 0xb3, 0x38, 0x02, 0xf1, 0x3e, 0x87, 0x0d, 0x72, 0xee, 0x76, +- 0xb6, 0x3e, 0x72, 0xe7, 0x72, 0x3d, 0x19, 0xac, 0x2c, 0x15, 0x2e, 0xf7, +- 0xff, 0xcc, 0xd6, 0xdb, 0xe4, 0xcf, 0xe1, 0xc8, 0x3f, 0xf0, 0xbb, 0x8c, +- 0x17, 0xbf, 0xa3, 0x5d, 0xc4, 0x7f, 0x62, 0x3e, 0x6d, 0xf1, 0xb9, 0x97, +- 0xe7, 0xc9, 0xf9, 0x43, 0xc7, 0xe0, 0xd0, 0x3c, 0x39, 0x6f, 0x65, 0x9b, +- 0xc5, 0x0b, 0x32, 0xb1, 0xf6, 0x5d, 0x73, 0xad, 0x25, 0xeb, 0x91, 0xec, +- 0x7d, 0x92, 0x43, 0x8b, 0x2c, 0x0a, 0x5e, 0xd1, 0xea, 0xd5, 0xb3, 0x28, +- 0x16, 0x3c, 0x89, 0x48, 0x0f, 0xb3, 0x50, 0xf3, 0xb9, 0x8f, 0xf0, 0x6f, +- 0x3f, 0xaf, 0xbf, 0xa1, 0x39, 0x1a, 0xb7, 0x42, 0xfa, 0xb6, 0x36, 0xee, +- 0x55, 0xbd, 0xfb, 0x2c, 0xfc, 0x91, 0x7c, 0x65, 0xc6, 0x6c, 0xaf, 0x94, +- 0x7b, 0x32, 0xfd, 0x5b, 0x28, 0x17, 0xad, 0xfa, 0x49, 0xc6, 0x66, 0x16, +- 0xd0, 0x66, 0x04, 0xbb, 0x84, 0x8b, 0x2c, 0xe1, 0xda, 0x55, 0x8c, 0x4c, +- 0x02, 0x79, 0x83, 0x2e, 0x8b, 0x1b, 0xa9, 0xb5, 0xb5, 0x9e, 0xcd, 0xf8, +- 0xe7, 0x79, 0xf2, 0xee, 0xd1, 0x0e, 0x1d, 0xf7, 0xd8, 0xf0, 0xf6, 0x3d, +- 0xb6, 0xf0, 0xca, 0x6f, 0x3d, 0xd4, 0x90, 0x37, 0x5f, 0xde, 0xff, 0x20, +- 0xc3, 0x93, 0xfa, 0xad, 0x5b, 0x7a, 0x8d, 0xab, 0x19, 0xc3, 0x86, 0x99, +- 0xe3, 0xaf, 0x0e, 0xfe, 0xd6, 0xfc, 0xa6, 0x23, 0xe2, 0xb1, 0xa3, 0xd6, +- 0xd3, 0x8b, 0x1b, 0x66, 0xaa, 0x52, 0xae, 0xcb, 0x1c, 0xf2, 0x6e, 0xa1, +- 0xf4, 0x4b, 0x4c, 0xf3, 0xde, 0x5a, 0x93, 0xf9, 0xb3, 0x6d, 0x95, 0x9d, +- 0x7e, 0x91, 0xaf, 0x5d, 0x36, 0xeb, 0xaa, 0x6b, 0xdd, 0x36, 0xa5, 0x8e, +- 0xd6, 0x51, 0x89, 0x57, 0x69, 0xbf, 0xaf, 0x4e, 0x4a, 0xcc, 0x53, 0x71, +- 0x94, 0x7e, 0x3a, 0x56, 0xe7, 0xeb, 0xbc, 0xca, 0x5c, 0xf2, 0x43, 0x72, +- 0xfc, 0x37, 0x35, 0x6f, 0xfb, 0x19, 0xa9, 0x3b, 0x86, 0x1c, 0x38, 0x17, +- 0xbc, 0x61, 0xd5, 0x82, 0x63, 0x87, 0x54, 0x0c, 0x27, 0x32, 0xfe, 0xfe, +- 0x1a, 0xfd, 0xf8, 0xd6, 0xd9, 0x05, 0x1d, 0x3d, 0x43, 0xe2, 0x1f, 0x0d, +- 0x96, 0x1f, 0xdd, 0xaa, 0x15, 0x09, 0x5e, 0x8b, 0x5f, 0x6c, 0x90, 0xde, +- 0x9d, 0x91, 0x02, 0xb9, 0xcc, 0xe0, 0x6a, 0x72, 0x60, 0x89, 0xb1, 0x01, +- 0xe6, 0xbb, 0x0e, 0xfa, 0xcf, 0x19, 0xe6, 0x1e, 0x94, 0x2d, 0x6c, 0x9a, +- 0xef, 0x32, 0x17, 0x1b, 0x41, 0xbd, 0x7a, 0x0a, 0xeb, 0xc8, 0x63, 0xc9, +- 0x71, 0x26, 0x9b, 0xb1, 0xc7, 0xca, 0xa5, 0x7c, 0xea, 0xc3, 0xca, 0x52, +- 0xae, 0xbf, 0x19, 0xdd, 0x63, 0x0b, 0x70, 0x80, 0xeb, 0x7a, 0x44, 0xff, +- 0x2b, 0x94, 0x0f, 0x75, 0x77, 0x96, 0x53, 0x1f, 0x9f, 0x86, 0x8c, 0x0e, +- 0x62, 0xfa, 0x96, 0x53, 0x4a, 0xfd, 0xfa, 0x98, 0xf2, 0x4d, 0xee, 0x87, +- 0xd4, 0x47, 0x3c, 0xcc, 0xd3, 0x1f, 0x61, 0x3c, 0xfb, 0x33, 0xec, 0x56, +- 0x95, 0x26, 0x5b, 0x58, 0x38, 0x22, 0xfc, 0xaa, 0x75, 0x76, 0xf0, 0xbf, +- 0x40, 0x9f, 0xdb, 0xc0, 0x6b, 0x12, 0xd7, 0xe5, 0x5e, 0x39, 0x37, 0xde, +- 0x89, 0x93, 0x69, 0xda, 0x75, 0xb4, 0x0f, 0xa7, 0xd2, 0xf2, 0x4c, 0xe1, +- 0x58, 0x01, 0xc4, 0x86, 0xec, 0x98, 0xd0, 0x7d, 0x91, 0x52, 0xea, 0xa5, +- 0x30, 0xe4, 0x8d, 0xac, 0x53, 0x02, 0xe4, 0x72, 0x69, 0x9c, 0xdb, 0xeb, +- 0x6d, 0xaf, 0x63, 0xde, 0x18, 0x9d, 0x84, 0xfa, 0xdc, 0xf2, 0x34, 0xce, +- 0x8e, 0x3e, 0x0e, 0x4f, 0xb5, 0xd7, 0xb3, 0x5a, 0x69, 0xc1, 0x8e, 0xc9, +- 0x7f, 0xaf, 0xc6, 0xe4, 0xe1, 0xb3, 0x5b, 0x60, 0x50, 0xf7, 0xbb, 0xf0, +- 0xad, 0xf9, 0xe2, 0xf3, 0xbd, 0x93, 0xc5, 0x58, 0xc4, 0x78, 0xf4, 0xb2, +- 0x15, 0x67, 0x33, 0x7e, 0x54, 0xa3, 0x7d, 0x64, 0x3e, 0x95, 0x8d, 0xe1, +- 0x7f, 0x58, 0x5f, 0x3f, 0x34, 0x23, 0xaa, 0xe8, 0x4b, 0xc6, 0xd5, 0xa0, +- 0x80, 0xf3, 0xec, 0xce, 0xc6, 0xeb, 0x32, 0xed, 0x9f, 0xcc, 0xc7, 0xad, +- 0x39, 0x56, 0xce, 0x97, 0x44, 0x61, 0xa7, 0x95, 0xe7, 0xcb, 0xba, 0x75, +- 0x7c, 0x16, 0x95, 0x5a, 0x87, 0x8a, 0x53, 0xba, 0xe0, 0x48, 0x0b, 0x7d, +- 0xd5, 0x89, 0x2d, 0x41, 0xba, 0xa3, 0x55, 0xf7, 0x9f, 0xc6, 0x9e, 0xe4, +- 0xbf, 0x9a, 0xcf, 0xd3, 0x8e, 0xd6, 0x90, 0xc3, 0x78, 0x88, 0x03, 0x1b, +- 0x43, 0x8f, 0x90, 0x87, 0x72, 0xcd, 0x09, 0x07, 0x31, 0x48, 0x41, 0xa2, +- 0x91, 0xfe, 0x1f, 0x5a, 0x82, 0x29, 0xeb, 0xfe, 0x4f, 0xe7, 0x65, 0x6a, +- 0x8b, 0x67, 0xe6, 0x67, 0x72, 0x43, 0xd1, 0xff, 0x7f, 0x44, 0x7f, 0xaf, +- 0x99, 0x9e, 0x72, 0xd1, 0x9f, 0x03, 0x6e, 0xc6, 0xad, 0x03, 0xbc, 0xe7, +- 0xc2, 0x5e, 0x07, 0x06, 0xb5, 0x16, 0x0c, 0x4e, 0xc2, 0xf3, 0x29, 0xef, +- 0xf9, 0xf9, 0x68, 0xc7, 0xfc, 0x0c, 0x57, 0x78, 0x1b, 0xdd, 0xd1, 0x17, +- 0xcc, 0x55, 0xe5, 0xb2, 0x5e, 0x39, 0xaf, 0xd3, 0xca, 0xfb, 0x73, 0x75, +- 0xbe, 0xcd, 0xe6, 0x13, 0x56, 0x9c, 0x78, 0x71, 0xbe, 0xf4, 0xd7, 0x5e, +- 0x4f, 0x98, 0xb8, 0xa2, 0xf7, 0x58, 0xb9, 0xb9, 0x60, 0x43, 0x6f, 0x42, +- 0xf6, 0x56, 0x64, 0xfb, 0x66, 0x56, 0x1f, 0x13, 0x55, 0xb7, 0xcb, 0xbd, +- 0x2a, 0x6b, 0xcb, 0xd2, 0xdf, 0xce, 0xf1, 0x7e, 0xb1, 0x65, 0xb1, 0x63, +- 0xeb, 0xbd, 0x96, 0xa4, 0xbc, 0xd3, 0xb9, 0x41, 0xfd, 0x1d, 0x9f, 0x21, +- 0x75, 0x96, 0x16, 0xce, 0x61, 0x9a, 0x9b, 0xf5, 0x7a, 0xcf, 0x29, 0xfc, +- 0x31, 0x6d, 0x5b, 0xc7, 0xae, 0x21, 0xa9, 0xc3, 0x7a, 0x14, 0xc7, 0xbe, +- 0x75, 0xb8, 0xc2, 0xf8, 0xbf, 0xc7, 0xb2, 0x43, 0xc1, 0x15, 0x91, 0x43, +- 0xb0, 0xa5, 0x8d, 0x71, 0x5c, 0x6a, 0xdd, 0x46, 0xa4, 0x26, 0xdc, 0xa9, +- 0x7c, 0x58, 0xd7, 0x89, 0x63, 0x21, 0xc3, 0x2c, 0xd5, 0xfc, 0xeb, 0x6b, +- 0x6c, 0x28, 0x98, 0x6c, 0xc8, 0xc7, 0xf1, 0x90, 0xf0, 0x47, 0xb8, 0xd2, +- 0x69, 0xaf, 0x31, 0xc7, 0xae, 0xba, 0xbe, 0x97, 0xce, 0x62, 0xa5, 0xad, +- 0x7e, 0xbe, 0xe4, 0x50, 0x49, 0x0b, 0x47, 0xbe, 0x8a, 0x07, 0xad, 0xbd, +- 0x55, 0x19, 0x43, 0xa5, 0x0e, 0x7c, 0x2c, 0x74, 0x2d, 0x2a, 0x98, 0x62, +- 0x36, 0x35, 0x87, 0xea, 0xd5, 0x5d, 0xb8, 0x87, 0xd8, 0xd5, 0x84, 0x73, +- 0xba, 0xf4, 0x3f, 0x8c, 0x6f, 0x3a, 0xac, 0xb3, 0x34, 0x47, 0x43, 0x3b, +- 0xa2, 0x2b, 0x71, 0x60, 0xc8, 0x50, 0x9c, 0x61, 0x6f, 0x24, 0x46, 0x2e, +- 0xc4, 0x1c, 0xdd, 0xaa, 0x03, 0x4a, 0x8d, 0x61, 0xb8, 0xa1, 0x13, 0xbb, +- 0xf4, 0x7c, 0xf4, 0xea, 0x91, 0x82, 0x9e, 0xe5, 0x5d, 0x38, 0xa8, 0x17, +- 0x1b, 0x8b, 0xc2, 0x06, 0x31, 0x5d, 0xdb, 0x92, 0x84, 0xbf, 0xe5, 0x32, +- 0x39, 0xc7, 0x49, 0x78, 0x3b, 0x9a, 0xec, 0xc4, 0xdc, 0x15, 0x0e, 0x57, +- 0x6c, 0xbc, 0x11, 0x89, 0xc9, 0x4a, 0xd7, 0xee, 0xf1, 0x20, 0xe2, 0x93, +- 0xdc, 0x6f, 0xe6, 0xba, 0x8e, 0xf1, 0x95, 0xe4, 0xa0, 0xa2, 0x47, 0x3b, +- 0x6d, 0xb1, 0x0e, 0xcf, 0xb5, 0x5e, 0x32, 0x9f, 0xf1, 0x0b, 0x7e, 0x2e, +- 0xc0, 0x56, 0xd5, 0x67, 0x71, 0xca, 0x88, 0xed, 0x0f, 0xf9, 0x87, 0x9d, +- 0x36, 0xf7, 0x7d, 0xd3, 0xf3, 0x75, 0xd1, 0x9b, 0x63, 0x01, 0x0a, 0x1f, +- 0x21, 0x7e, 0xca, 0xbf, 0x45, 0x77, 0xa2, 0x43, 0x13, 0x9b, 0x74, 0xa9, +- 0xf1, 0x35, 0xd0, 0x67, 0xdc, 0x78, 0x47, 0xbd, 0xb5, 0x0f, 0xcf, 0xea, +- 0x3e, 0x7d, 0x0c, 0x52, 0xdb, 0x5b, 0xc1, 0x71, 0x52, 0x83, 0x69, 0xc4, +- 0x4b, 0xd9, 0x9c, 0xc3, 0x63, 0x2b, 0x22, 0xee, 0xe6, 0xe2, 0x88, 0x5c, +- 0xf7, 0x26, 0x23, 0xb4, 0xd3, 0x6d, 0xc1, 0x19, 0x33, 0x52, 0x6e, 0x74, +- 0xca, 0xf9, 0x15, 0x77, 0x78, 0xba, 0xd3, 0x5d, 0xe7, 0xed, 0x98, 0x51, +- 0x80, 0x73, 0x31, 0xc6, 0x61, 0xeb, 0x7f, 0xb1, 0x28, 0x73, 0x3b, 0x31, +- 0x12, 0x5c, 0x88, 0xf6, 0x36, 0x79, 0x56, 0x33, 0xfa, 0xf6, 0x9b, 0x66, +- 0x71, 0xc8, 0xa7, 0xa6, 0xe1, 0xc4, 0xc3, 0x41, 0x3b, 0x2e, 0xa9, 0x26, +- 0x1c, 0xa1, 0x7f, 0x35, 0xc7, 0x19, 0x1f, 0x47, 0xe9, 0x27, 0xbb, 0x69, +- 0x63, 0xf2, 0xbe, 0x8f, 0x9f, 0x7e, 0x12, 0xa7, 0x9f, 0x9c, 0x0b, 0xdd, +- 0x97, 0x7d, 0x5f, 0x50, 0x23, 0xaf, 0x98, 0x46, 0xd3, 0x90, 0x8a, 0x4f, +- 0x57, 0x4c, 0x23, 0x34, 0x92, 0x93, 0x5d, 0xfc, 0x32, 0x27, 0xbf, 0xf4, +- 0x11, 0x45, 0x76, 0x91, 0x51, 0xd6, 0x22, 0xff, 0xce, 0x5d, 0xcb, 0xfd, +- 0x26, 0x71, 0xd6, 0x89, 0x56, 0x6b, 0x6d, 0x7f, 0x56, 0x93, 0xc1, 0x8c, +- 0xdc, 0x9a, 0x2e, 0xb9, 0x6f, 0xff, 0x7e, 0xe2, 0x8e, 0xeb, 0x2b, 0xee, +- 0xb8, 0xbe, 0x71, 0xde, 0xed, 0xdf, 0x73, 0x3e, 0x71, 0x4b, 0xaf, 0x1d, +- 0xba, 0x6f, 0xea, 0x18, 0xd7, 0x3a, 0x67, 0xc9, 0x98, 0x79, 0xa9, 0x4c, +- 0x64, 0x91, 0x3c, 0x36, 0x23, 0xeb, 0xaa, 0xf1, 0xd9, 0xb2, 0xbe, 0x95, +- 0xed, 0x19, 0x58, 0x67, 0x7c, 0xe9, 0x37, 0x1a, 0x7e, 0x78, 0xdb, 0xb9, +- 0x43, 0xb1, 0xb5, 0x80, 0xd2, 0x17, 0x93, 0xf7, 0x33, 0x0b, 0xad, 0x77, +- 0xac, 0x55, 0xbf, 0x81, 0x22, 0xbf, 0xb6, 0x65, 0x8e, 0xad, 0x0b, 0xce, +- 0xa5, 0x5a, 0xc7, 0xb7, 0x94, 0x24, 0xe2, 0xe3, 0xde, 0xc0, 0x18, 0x75, +- 0x15, 0x1b, 0xbf, 0xce, 0x5c, 0xbb, 0x0b, 0xcf, 0x85, 0x1c, 0x46, 0x61, +- 0x58, 0xce, 0x82, 0xae, 0xc2, 0xae, 0x91, 0xbf, 0xc2, 0xe6, 0xa4, 0x70, +- 0xfc, 0x05, 0xe8, 0x99, 0xb4, 0xe1, 0x04, 0xed, 0xbb, 0x8f, 0xcf, 0x21, +- 0xfe, 0xb9, 0x53, 0x90, 0xf7, 0x6b, 0x1a, 0x98, 0x37, 0xeb, 0xd6, 0x67, +- 0xc7, 0xc8, 0xcf, 0xb0, 0x39, 0x6a, 0xe2, 0x53, 0x9d, 0xb1, 0x47, 0x13, +- 0xf9, 0x1c, 0xd0, 0xca, 0x5b, 0x2d, 0x2c, 0x7d, 0x32, 0xce, 0xfd, 0xac, +- 0x16, 0x5f, 0x5d, 0x49, 0x9f, 0x55, 0xf0, 0x99, 0xf4, 0x27, 0xcb, 0x29, +- 0x33, 0xb9, 0xe1, 0xf1, 0xe8, 0x76, 0x8c, 0x5a, 0xfd, 0x67, 0xad, 0xaf, +- 0xc6, 0x1e, 0x79, 0xb1, 0x8c, 0x3c, 0x3b, 0xa1, 0xfb, 0xdb, 0x2f, 0x28, +- 0xf0, 0x94, 0x84, 0xfd, 0x8c, 0x33, 0x5f, 0xe2, 0x37, 0xba, 0xd4, 0xd8, +- 0x74, 0xd7, 0x5a, 0xda, 0xfb, 0xbe, 0x91, 0x80, 0x55, 0x33, 0xf8, 0xe1, +- 0x5d, 0x6b, 0x1a, 0x99, 0x77, 0xab, 0x33, 0xf5, 0xc7, 0x9f, 0xe1, 0x48, +- 0xda, 0x85, 0xa7, 0xe2, 0x1e, 0x65, 0xd1, 0x3e, 0x15, 0x0f, 0xc5, 0xbd, +- 0x53, 0x4d, 0x76, 0xf2, 0x8f, 0x65, 0x73, 0x38, 0x9f, 0x82, 0x1f, 0x2c, +- 0x95, 0x58, 0xf0, 0x47, 0x30, 0xaa, 0x23, 0x9c, 0x13, 0xc5, 0x79, 0xcb, +- 0xbd, 0xea, 0x11, 0x9b, 0xcf, 0xfd, 0x1b, 0xec, 0x80, 0x7d, 0xfc, 0x11, +- 0x74, 0x53, 0xfe, 0x35, 0x71, 0xe9, 0x69, 0xd5, 0x03, 0x65, 0xcd, 0xd8, +- 0x3d, 0x26, 0xbe, 0x09, 0xa3, 0x2a, 0x0c, 0x4f, 0x65, 0xd8, 0xbf, 0x10, +- 0x85, 0x5f, 0x92, 0x6b, 0x4f, 0x4b, 0xfe, 0xb9, 0xa5, 0xd4, 0x66, 0x32, +- 0x7f, 0xb9, 0x2f, 0xdb, 0xab, 0x58, 0x89, 0x1d, 0x43, 0x52, 0x87, 0x27, +- 0x6e, 0xeb, 0xcc, 0x83, 0xca, 0xb4, 0xc0, 0x46, 0x9b, 0xf4, 0x87, 0xb6, +- 0xc3, 0x17, 0xdb, 0x8e, 0x40, 0x4c, 0x7c, 0x56, 0x53, 0x3b, 0x10, 0x39, +- 0x2b, 0xb5, 0xbf, 0x45, 0x21, 0x3f, 0xe5, 0xf2, 0xf7, 0x55, 0xda, 0x75, +- 0xd7, 0x6b, 0x13, 0x2a, 0xa6, 0xd4, 0x4c, 0x1e, 0x39, 0x96, 0xd4, 0xd6, +- 0xe7, 0xdb, 0xe4, 0x0c, 0xc5, 0x55, 0xeb, 0x3d, 0xeb, 0x88, 0xed, 0x9f, +- 0x89, 0x47, 0xcd, 0x18, 0xd8, 0xff, 0x3e, 0x63, 0x90, 0x3c, 0xe3, 0x77, +- 0xcc, 0xaf, 0x9d, 0x58, 0xdd, 0xe6, 0xc1, 0x83, 0x71, 0xa9, 0x9d, 0xae, +- 0xaf, 0xca, 0x9c, 0x01, 0x91, 0xef, 0x0e, 0x74, 0xe8, 0x04, 0xd9, 0xea, +- 0x2f, 0xcc, 0x4a, 0x2b, 0x2f, 0xfd, 0xbf, 0x19, 0x9b, 0x49, 0xe4, 0x2d, +- 0x14, 0x1f, 0xef, 0x9d, 0x64, 0x02, 0x69, 0xd9, 0x5d, 0x15, 0xbf, 0xcb, +- 0x5c, 0xda, 0x81, 0xed, 0xd8, 0x56, 0x25, 0x7c, 0xe6, 0xc9, 0x89, 0xd9, +- 0xf7, 0xe7, 0xea, 0x32, 0x95, 0x59, 0x4e, 0x95, 0xb3, 0x37, 0xe9, 0x05, +- 0x46, 0x94, 0x27, 0xa2, 0x2d, 0xca, 0xda, 0xa8, 0xf4, 0x03, 0x6d, 0xd1, +- 0x22, 0x72, 0x18, 0xdf, 0x52, 0x13, 0xdf, 0x0e, 0x1d, 0x57, 0x76, 0x5a, +- 0xe7, 0x66, 0xe5, 0xac, 0x2b, 0x50, 0x3e, 0xd1, 0xac, 0xec, 0x8a, 0x7e, +- 0x62, 0x6e, 0xb4, 0x7a, 0xf0, 0x79, 0xd6, 0x79, 0x9c, 0xfc, 0x09, 0x17, +- 0xca, 0x8e, 0xc8, 0xf9, 0x41, 0x0d, 0x15, 0x13, 0x8f, 0x91, 0xb7, 0x0a, +- 0xd7, 0x31, 0x5a, 0x1c, 0xd6, 0xb9, 0xb6, 0xe6, 0x97, 0x72, 0xe7, 0xda, +- 0x1c, 0x31, 0x79, 0x1b, 0xd9, 0xfa, 0x8f, 0xb9, 0xd2, 0x51, 0xe6, 0x4a, +- 0x66, 0xd3, 0xb7, 0x43, 0xc6, 0xee, 0x0a, 0x78, 0x03, 0xe5, 0x36, 0xc3, +- 0x94, 0x7a, 0xce, 0x6b, 0x24, 0x8c, 0xeb, 0x6a, 0x0d, 0x3c, 0x5c, 0x2b, +- 0xef, 0x1f, 0xca, 0xbb, 0xc7, 0x5d, 0x38, 0x1a, 0xea, 0xc2, 0x2f, 0xf5, +- 0x2e, 0xec, 0xd1, 0xe5, 0x4c, 0x43, 0x31, 0x65, 0xd5, 0xa6, 0xa2, 0xd0, +- 0xf4, 0xb4, 0xa2, 0x9d, 0xb9, 0x0e, 0xef, 0x01, 0x9f, 0xe2, 0x35, 0x56, +- 0x29, 0x1a, 0xae, 0x8e, 0x7b, 0x67, 0x4a, 0xe9, 0x03, 0x37, 0xc6, 0x03, +- 0x98, 0x21, 0xae, 0x26, 0x27, 0xe5, 0xfc, 0xc9, 0x02, 0x0c, 0x4d, 0x7e, +- 0x4d, 0xb8, 0x81, 0x41, 0x4c, 0xb2, 0xce, 0x48, 0x3e, 0x2f, 0xbd, 0x4e, +- 0x67, 0x30, 0xcb, 0x61, 0x0c, 0x65, 0x53, 0x43, 0x09, 0x6e, 0x30, 0x3a, +- 0xfd, 0x6d, 0xba, 0x93, 0xf9, 0x1c, 0xde, 0xa8, 0x81, 0xfd, 0x3b, 0x6e, +- 0xd4, 0x25, 0xe7, 0xe0, 0x44, 0x5d, 0x39, 0xf2, 0x70, 0x6c, 0xf4, 0x45, +- 0x72, 0xfc, 0xee, 0xf6, 0x52, 0xe6, 0xa7, 0x13, 0xa3, 0x4e, 0xa4, 0x52, +- 0x52, 0x73, 0xb0, 0x7a, 0x96, 0xd3, 0x0e, 0xfa, 0x52, 0x7f, 0x02, 0x75, +- 0x35, 0x61, 0x7f, 0xb2, 0xc6, 0xae, 0x72, 0x8e, 0x4a, 0xa4, 0xd2, 0x1a, +- 0x3f, 0x01, 0x7e, 0x82, 0xfc, 0x34, 0xe2, 0xdb, 0xf4, 0xd9, 0x32, 0xe2, +- 0xed, 0xf7, 0xd3, 0x25, 0xf8, 0x24, 0xa9, 0x05, 0x74, 0xda, 0xc1, 0x28, +- 0x73, 0x04, 0xc3, 0xd2, 0x53, 0x09, 0xae, 0xd3, 0x4f, 0x5f, 0x0e, 0x95, +- 0xc0, 0x4c, 0xdd, 0x2d, 0x27, 0x94, 0xdc, 0x16, 0x6a, 0x61, 0x58, 0xf8, +- 0xe2, 0x31, 0x25, 0x95, 0x3d, 0xf3, 0xf5, 0xea, 0x38, 0xda, 0xcb, 0xc3, +- 0xae, 0xe0, 0xea, 0xb8, 0xfd, 0x13, 0x79, 0x9f, 0x75, 0x43, 0x83, 0xbc, +- 0xf3, 0xe4, 0x0a, 0x3e, 0x3d, 0xe1, 0x0a, 0xae, 0x8f, 0x1f, 0x53, 0x28, +- 0xcf, 0x81, 0x1a, 0xbb, 0x2b, 0xf8, 0xe4, 0xc4, 0xb1, 0x85, 0x99, 0xbc, +- 0x0f, 0xca, 0xd3, 0xb5, 0x06, 0x6d, 0x8c, 0x79, 0xef, 0x32, 0xe9, 0xcb, +- 0x68, 0x9d, 0x57, 0xec, 0x85, 0x46, 0x4d, 0xd8, 0xeb, 0xa9, 0xb1, 0xcb, +- 0xd9, 0x90, 0x69, 0xc4, 0x93, 0xf2, 0xae, 0x97, 0xd8, 0xfe, 0x3f, 0x99, +- 0x46, 0x99, 0x9c, 0xf5, 0xe8, 0x44, 0x5c, 0x2b, 0x67, 0xee, 0x24, 0x67, +- 0xcd, 0x8f, 0x86, 0xa2, 0xb1, 0x62, 0x79, 0x77, 0xb6, 0xe9, 0x7b, 0x21, +- 0x6f, 0xcb, 0xa0, 0x62, 0x3c, 0x5e, 0x04, 0xd9, 0xd7, 0x2e, 0xe2, 0xb7, +- 0xa6, 0x3a, 0x15, 0x6f, 0x63, 0x0f, 0x02, 0x38, 0x91, 0x16, 0x5d, 0x07, +- 0xe5, 0x8c, 0xba, 0xa5, 0xeb, 0x5b, 0x67, 0xae, 0x33, 0xb6, 0xb3, 0x2d, +- 0xea, 0xe0, 0x5f, 0xb1, 0x17, 0x1b, 0x63, 0x0a, 0xe3, 0x8a, 0x65, 0x33, +- 0xb7, 0x64, 0x5c, 0x57, 0xdb, 0x85, 0xc9, 0x50, 0xa1, 0xbc, 0x77, 0xcd, +- 0xb8, 0xee, 0x0d, 0x7c, 0xa2, 0x58, 0xf1, 0xdc, 0x28, 0x62, 0x9c, 0x7d, +- 0x61, 0xfc, 0xef, 0xcc, 0xf6, 0x6a, 0xc1, 0x2b, 0x3b, 0xc7, 0x5e, 0xc7, +- 0x6b, 0xa9, 0x5b, 0xe3, 0x5a, 0x38, 0xae, 0x90, 0xe3, 0x8a, 0xc2, 0x92, +- 0x3b, 0x7a, 0xf5, 0xb5, 0x8a, 0xe6, 0x29, 0x50, 0xa4, 0x57, 0xa6, 0xe1, +- 0xbd, 0xf4, 0xe4, 0x42, 0xc9, 0x79, 0x7b, 0x27, 0xcb, 0xb1, 0x6e, 0xaf, +- 0xd9, 0xb4, 0x68, 0xa9, 0xd9, 0x94, 0x0e, 0x45, 0xcd, 0x97, 0xab, 0x64, +- 0x4f, 0xa5, 0xff, 0x27, 0x63, 0x34, 0xd5, 0xc7, 0x5c, 0xf3, 0x6b, 0x7a, +- 0x6f, 0xf6, 0xcc, 0x2e, 0xed, 0x9a, 0xcf, 0x38, 0x9d, 0x12, 0x3b, 0xd9, +- 0xd1, 0xee, 0x62, 0x3e, 0x2a, 0xef, 0x87, 0x1e, 0xe5, 0xfe, 0x1f, 0x49, +- 0xfd, 0xcd, 0x42, 0x39, 0xc3, 0x2e, 0x67, 0x08, 0x80, 0xff, 0x0f, 0x1d, +- 0xab, 0x22, 0x97, 0x70, 0x78, 0x00, 0x00, 0x00 }; ++ 0xec, 0x5c, 0x7d, 0x70, 0x1c, 0xe5, 0x79, 0xff, 0xbd, 0x7b, 0x7b, 0xd2, ++ 0x4a, 0x3a, 0x9d, 0x56, 0x27, 0x59, 0x3e, 0x1b, 0x17, 0x76, 0xd1, 0x9e, ++ 0x74, 0xb6, 0x14, 0xb3, 0x77, 0x3e, 0xd9, 0x72, 0x67, 0x4b, 0xb6, 0xd8, ++ 0x10, 0x67, 0xda, 0xc2, 0x19, 0x03, 0x15, 0x53, 0x5a, 0x6e, 0xfc, 0x0d, ++ 0x86, 0x22, 0x30, 0x93, 0x98, 0x8c, 0x6b, 0x6f, 0x30, 0xfe, 0x00, 0x4e, ++ 0x3a, 0x59, 0x16, 0xae, 0x33, 0xcd, 0x24, 0x8a, 0xbe, 0x6c, 0xc3, 0xc9, ++ 0x67, 0x1b, 0x1b, 0x9c, 0x74, 0xb0, 0xaf, 0x60, 0x8c, 0x81, 0x82, 0xa1, ++ 0xa5, 0x19, 0x33, 0xed, 0x14, 0x0d, 0x14, 0xdb, 0x33, 0x25, 0x60, 0x3e, ++ 0xd2, 0x9a, 0xe2, 0xea, 0xed, 0xf3, 0xdc, 0x59, 0x49, 0xa6, 0x49, 0x27, ++ 0x93, 0x3f, 0xfa, 0xdf, 0x3e, 0x33, 0x37, 0x7b, 0xb7, 0xfb, 0x7e, 0x3c, ++ 0x1f, 0xbf, 0xe7, 0xf7, 0x3c, 0xef, 0xce, 0x48, 0xdf, 0x0a, 0xa1, 0x1a, ++ 0x57, 0xa4, 0x96, 0x3e, 0x1d, 0xdd, 0x1b, 0x1e, 0xb2, 0xe7, 0xda, 0x73, ++ 0xe9, 0xeb, 0x9a, 0x00, 0x10, 0xe4, 0xfb, 0x02, 0xbe, 0xf8, 0xe2, 0x8b, ++ 0x2f, 0xbe, 0xf8, 0xe2, 0x8b, 0x2f, 0xbe, 0xf8, 0xe2, 0x8b, 0x2f, 0xbe, ++ 0xf8, 0xe2, 0x8b, 0x2f, 0xbe, 0xf8, 0xe2, 0x8b, 0x2f, 0xbe, 0xf8, 0xe2, ++ 0x8b, 0x2f, 0xbe, 0xf8, 0xe2, 0x8b, 0x2f, 0xbe, 0xf8, 0xe2, 0x8b, 0x2f, ++ 0xbe, 0xf8, 0xe2, 0x8b, 0x2f, 0xbe, 0xf8, 0xe2, 0x8b, 0x2f, 0xbe, 0xf8, ++ 0xe2, 0x8b, 0x2f, 0xbe, 0xf8, 0xe2, 0x8b, 0x2f, 0xbe, 0xfc, 0x7f, 0x48, ++ 0x00, 0xd0, 0xf9, 0x5a, 0x7b, 0xe5, 0x03, 0x4d, 0x71, 0x8a, 0x7f, 0x75, ++ 0x83, 0x05, 0x2d, 0xe0, 0x78, 0x9b, 0x56, 0x58, 0x80, 0x9b, 0x6f, 0x33, ++ 0x16, 0xe1, 0xbf, 0xa5, 0xd7, 0xa8, 0x82, 0xef, 0xff, 0x9e, 0x73, 0xf9, ++ 0x87, 0x2f, 0x2c, 0x30, 0x2f, 0x0e, 0x06, 0xa0, 0xe9, 0xce, 0xd9, 0x84, ++ 0xde, 0x02, 0x6d, 0x16, 0xcd, 0xf9, 0x7e, 0xeb, 0x64, 0x3d, 0xc2, 0x53, ++ 0x6b, 0xc1, 0x53, 0x1c, 0x29, 0x47, 0x6d, 0x89, 0x53, 0xb6, 0x27, 0x16, ++ 0xa5, 0xe0, 0x69, 0xce, 0x31, 0x51, 0xd5, 0x33, 0x29, 0x8d, 0x60, 0x79, ++ 0xe7, 0x95, 0x79, 0x05, 0xaa, 0xa5, 0x61, 0xd5, 0x48, 0x35, 0x56, 0x0f, ++ 0xd6, 0x60, 0xe5, 0x60, 0x14, 0x6b, 0xf2, 0xd0, 0x03, 0x8e, 0x86, 0x89, ++ 0xc0, 0x31, 0x11, 0x18, 0x47, 0x26, 0xe8, 0x5c, 0xba, 0x65, 0x28, 0x3b, ++ 0x29, 0x5d, 0x95, 0x67, 0x14, 0x6f, 0x19, 0x29, 0x3d, 0x87, 0xa2, 0x3a, ++ 0x27, 0xe9, 0x3b, 0x8f, 0xbb, 0x74, 0xcb, 0x70, 0x3e, 0x84, 0x6d, 0x03, ++ 0x66, 0x7a, 0x10, 0x8d, 0xd8, 0x61, 0x29, 0x6d, 0x15, 0xf0, 0xf4, 0x20, ++ 0xcc, 0x25, 0x8b, 0xd1, 0x16, 0xad, 0x12, 0xf5, 0xc8, 0xe8, 0x57, 0x2c, ++ 0xdd, 0x59, 0x85, 0x95, 0xed, 0x55, 0xf0, 0xd2, 0x02, 0x33, 0x76, 0x7a, ++ 0x19, 0xb2, 0x5c, 0xab, 0x75, 0xee, 0xdb, 0x38, 0x1e, 0x33, 0xbb, 0x7a, ++ 0x04, 0xb0, 0xa6, 0x87, 0xd6, 0x2b, 0x8d, 0xe4, 0xe7, 0xa6, 0x3b, 0x43, ++ 0xb4, 0xd9, 0x55, 0xe2, 0x33, 0x59, 0xbc, 0x8d, 0xe7, 0xf2, 0x5e, 0x26, ++ 0xad, 0x74, 0x3c, 0x84, 0x6a, 0x01, 0x2d, 0x26, 0x50, 0xb7, 0xb3, 0x1a, ++ 0x61, 0xcb, 0xc5, 0xc7, 0xd3, 0x9a, 0x4f, 0xc7, 0x45, 0x35, 0x3a, 0xaf, ++ 0xfb, 0x03, 0x60, 0xba, 0x82, 0xda, 0x18, 0xd0, 0xd5, 0x53, 0x81, 0xba, ++ 0x18, 0x44, 0x78, 0x01, 0x70, 0xf3, 0xb8, 0x82, 0xd0, 0x4e, 0x81, 0x67, ++ 0x76, 0x2a, 0x18, 0xd9, 0x19, 0xc0, 0xd8, 0x4e, 0xcc, 0x0d, 0x01, 0x4e, ++ 0x0d, 0x62, 0xfa, 0x5e, 0x60, 0xa6, 0x8a, 0xd8, 0xe9, 0x45, 0x88, 0x15, ++ 0x5b, 0x02, 0x2a, 0xba, 0xc6, 0x2b, 0x10, 0xa6, 0xb1, 0x3f, 0xa3, 0xb1, ++ 0xe7, 0x69, 0xec, 0x87, 0x3b, 0xf1, 0x17, 0xe4, 0xd2, 0x95, 0xb5, 0x88, ++ 0xd9, 0xf7, 0x09, 0x5c, 0x5b, 0x49, 0x73, 0x4e, 0x22, 0x16, 0xbd, 0x11, ++ 0xd5, 0xa4, 0x03, 0xeb, 0xa2, 0x61, 0xd1, 0x38, 0xeb, 0x42, 0xbe, 0x8c, ++ 0x29, 0xd0, 0x2c, 0x81, 0x0b, 0xb7, 0x9b, 0x86, 0x21, 0xf8, 0x99, 0xe9, ++ 0x7a, 0x64, 0x4b, 0x88, 0xd6, 0xa9, 0xb1, 0x9a, 0xf0, 0xe4, 0xb4, 0xb2, ++ 0x1f, 0xba, 0x7a, 0x14, 0xda, 0x83, 0x82, 0x17, 0xd3, 0x50, 0xbb, 0x40, ++ 0xc7, 0xcd, 0x3f, 0x3a, 0x5e, 0xfa, 0xfb, 0x9e, 0x3f, 0x19, 0x67, 0xbb, ++ 0x55, 0xd4, 0x59, 0x35, 0xb8, 0x6e, 0x3a, 0x8f, 0x54, 0x50, 0x49, 0xe3, ++ 0xd4, 0x9d, 0xc0, 0xa2, 0x1e, 0xcc, 0xe1, 0xbd, 0x47, 0xa0, 0x62, 0x75, ++ 0x4a, 0xa5, 0xb9, 0x21, 0xdc, 0x30, 0x5e, 0x9e, 0x77, 0xd3, 0x38, 0xfb, ++ 0x46, 0x40, 0xb1, 0x2e, 0xc8, 0x17, 0x5a, 0x1b, 0x71, 0xa2, 0xa0, 0xe3, ++ 0x60, 0xe1, 0x27, 0x0d, 0x08, 0x9b, 0x9e, 0x07, 0xcd, 0x53, 0x1d, 0x0f, ++ 0x5b, 0x53, 0x41, 0x8c, 0xf5, 0x4d, 0xca, 0x80, 0x65, 0x1a, 0x34, 0x50, ++ 0x7f, 0x89, 0x62, 0x75, 0x22, 0x47, 0xe3, 0x72, 0x41, 0x0c, 0x0d, 0x9e, ++ 0x6c, 0x40, 0x75, 0x14, 0x2f, 0xb4, 0xf2, 0x7c, 0x9e, 0xcb, 0x6b, 0xdc, ++ 0x5c, 0x37, 0x35, 0xbf, 0x82, 0xe6, 0xbf, 0x9c, 0x02, 0x46, 0xfa, 0xd2, ++ 0x34, 0x55, 0x62, 0x8b, 0x5d, 0x89, 0xe5, 0x3a, 0xbc, 0x2a, 0x87, 0xd7, ++ 0x9a, 0x5a, 0xc7, 0x13, 0xc6, 0xb8, 0xac, 0x2b, 0xaf, 0x03, 0xa1, 0x59, ++ 0xf0, 0x2a, 0xff, 0xd7, 0xf3, 0x0b, 0xf9, 0xa9, 0xe7, 0xdd, 0xb4, 0x8f, ++ 0x46, 0x78, 0xf4, 0xf0, 0x5c, 0x61, 0x23, 0x8e, 0x16, 0xee, 0xc3, 0xa1, ++ 0x42, 0x96, 0xf6, 0xdc, 0x81, 0xe3, 0x85, 0xc7, 0xf0, 0x7c, 0x61, 0x03, ++ 0x8e, 0x14, 0x1e, 0xc6, 0xb3, 0x85, 0x6e, 0x1c, 0x2e, 0xac, 0x25, 0x7d, ++ 0x3c, 0x04, 0x3b, 0x78, 0xbd, 0xb8, 0xf8, 0x2c, 0x5b, 0x45, 0x7a, 0x3c, ++ 0x86, 0x89, 0x3c, 0xdb, 0x23, 0xb1, 0xd3, 0x36, 0xf7, 0x01, 0xad, 0xd1, ++ 0x0a, 0xf2, 0xf3, 0x72, 0xdb, 0x3c, 0x48, 0x28, 0x82, 0xdb, 0x98, 0xc6, ++ 0x60, 0x01, 0xd8, 0xdf, 0x67, 0x20, 0x48, 0xfa, 0x5a, 0x89, 0x26, 0x6c, ++ 0xd5, 0xd3, 0xa8, 0xb6, 0xb2, 0x78, 0xa2, 0x8c, 0x45, 0x2d, 0xe4, 0xfc, ++ 0x0b, 0xb2, 0x04, 0xba, 0x27, 0x63, 0xd0, 0x04, 0x7d, 0x6f, 0xcb, 0x1f, ++ 0x6c, 0x2c, 0xe7, 0x0e, 0xe9, 0x91, 0x23, 0x3d, 0x72, 0xa4, 0x47, 0x8e, ++ 0xf4, 0xcb, 0x91, 0x7e, 0x39, 0xd2, 0x27, 0x47, 0xfa, 0xe4, 0x48, 0x9f, ++ 0x1c, 0xe9, 0x9a, 0x23, 0x9d, 0x72, 0xec, 0xf3, 0x3e, 0xb2, 0xa5, 0x9c, ++ 0x6b, 0xba, 0x63, 0xd3, 0x9e, 0x4d, 0xe2, 0x9a, 0xdd, 0xaa, 0x98, 0xd1, ++ 0x6b, 0xe0, 0x6a, 0x07, 0xa1, 0x86, 0xf9, 0x56, 0xf1, 0xfa, 0x40, 0xdb, ++ 0xb1, 0x28, 0xdc, 0xc4, 0x74, 0xd8, 0x18, 0x2b, 0xa8, 0x22, 0xdc, 0x2b, ++ 0xe5, 0x17, 0xf3, 0x5c, 0xd4, 0x39, 0xa6, 0xb7, 0x4b, 0xb1, 0xd6, 0x9e, ++ 0x11, 0xb5, 0x68, 0xe8, 0x5f, 0x82, 0xc1, 0x7a, 0x17, 0x27, 0x53, 0x06, ++ 0x96, 0x27, 0x15, 0xd2, 0xdf, 0xc3, 0xb6, 0x94, 0x69, 0x7b, 0xd8, 0x85, ++ 0x62, 0x23, 0xcf, 0xd3, 0xbc, 0x20, 0xf9, 0x6a, 0x5f, 0x4a, 0x23, 0x3c, ++ 0xb8, 0x38, 0x67, 0x57, 0xa0, 0x98, 0xe6, 0xb8, 0xa8, 0xa8, 0xb2, 0x86, ++ 0x30, 0x3b, 0x12, 0x21, 0xdb, 0x66, 0x63, 0x4e, 0x84, 0xef, 0x41, 0xbc, ++ 0x43, 0xb9, 0x3e, 0xdd, 0x99, 0x29, 0x3e, 0xd9, 0x1d, 0x46, 0xed, 0x6e, ++ 0x0d, 0xbd, 0xfd, 0x2a, 0xd6, 0x25, 0xa5, 0xfc, 0xcf, 0x84, 0x9a, 0x79, ++ 0x43, 0xdc, 0x86, 0x7c, 0x41, 0x45, 0x63, 0x6f, 0x02, 0x99, 0x7a, 0x0d, ++ 0x57, 0xf7, 0x7a, 0x78, 0x89, 0xd6, 0x7d, 0xa4, 0xcf, 0x45, 0xe7, 0xbc, ++ 0x38, 0xe5, 0x0f, 0x9b, 0x93, 0xc6, 0xfa, 0x6c, 0x73, 0xdf, 0x2e, 0xa5, ++ 0x02, 0x2e, 0x25, 0x73, 0xc8, 0x49, 0x61, 0x53, 0xb6, 0xd9, 0xfb, 0x81, ++ 0xb2, 0x05, 0x4a, 0x85, 0x86, 0xa1, 0x5e, 0xbe, 0xb7, 0x18, 0xde, 0x38, ++ 0x63, 0xee, 0x77, 0xf5, 0xd7, 0xcc, 0x5a, 0xc2, 0x95, 0xf1, 0xbb, 0xfb, ++ 0xf9, 0x3b, 0xb5, 0x94, 0x4f, 0x46, 0x11, 0xf5, 0xd3, 0x78, 0xbe, 0xa7, ++ 0xbc, 0x27, 0xdd, 0x46, 0xd6, 0x43, 0xf3, 0x88, 0x27, 0xb1, 0x22, 0x95, ++ 0xc2, 0xf2, 0x6c, 0xf3, 0xa5, 0x47, 0x95, 0xe9, 0x98, 0xa8, 0x2c, 0xc7, ++ 0x78, 0x9a, 0x83, 0xc4, 0xd1, 0x5e, 0x81, 0x43, 0x2d, 0x1c, 0x63, 0x24, ++ 0x12, 0xf9, 0x52, 0x4e, 0x18, 0xae, 0xa2, 0x79, 0x35, 0x34, 0xa7, 0xbb, ++ 0x23, 0x86, 0xea, 0x7e, 0xfe, 0x4d, 0xbc, 0xda, 0x41, 0x39, 0x10, 0x8e, ++ 0x41, 0x19, 0xfa, 0x41, 0xa8, 0x3c, 0x66, 0x6f, 0x2d, 0xf3, 0x8c, 0x62, ++ 0xf1, 0x3a, 0xdd, 0x9b, 0x8e, 0xb6, 0xdc, 0x43, 0xbf, 0xcb, 0x71, 0x5e, ++ 0x9d, 0x6d, 0x36, 0xb6, 0x29, 0x1a, 0xbc, 0x68, 0x88, 0xfc, 0x0f, 0x4d, ++ 0xa3, 0xb5, 0xb5, 0x9e, 0xcb, 0x58, 0x9f, 0x34, 0x8f, 0x31, 0x77, 0x55, ++ 0xc6, 0xca, 0xfb, 0xb5, 0xe6, 0x6d, 0xec, 0x2f, 0xd8, 0x58, 0x95, 0x6d, ++ 0xee, 0x3c, 0x82, 0x7f, 0xc6, 0x44, 0x74, 0x4e, 0xfa, 0xbc, 0xf2, 0xaf, ++ 0xd2, 0x2d, 0xf1, 0xc0, 0x1c, 0x9c, 0x8f, 0x34, 0xaf, 0x3d, 0xaf, 0x98, ++ 0x83, 0xdb, 0x15, 0x29, 0x9f, 0x4f, 0x28, 0xf8, 0xcb, 0x64, 0x0a, 0xc5, ++ 0x7a, 0x1d, 0x9b, 0x93, 0x9a, 0xd7, 0x48, 0xfa, 0xf5, 0xcd, 0xd7, 0x50, ++ 0xd7, 0xef, 0xe2, 0x3f, 0x12, 0x6f, 0xa2, 0x78, 0x2b, 0xfb, 0x9d, 0xf5, ++ 0x62, 0x1b, 0xa2, 0x68, 0xb0, 0xaa, 0xd0, 0x30, 0x14, 0x44, 0xb4, 0x7f, ++ 0x52, 0xce, 0xb0, 0xf8, 0xbe, 0x75, 0x6c, 0x46, 0x80, 0x6d, 0x08, 0x62, ++ 0xfa, 0xd0, 0x42, 0xe2, 0x75, 0x93, 0x82, 0xf9, 0x51, 0x23, 0x8f, 0xad, ++ 0xb0, 0xa6, 0x6c, 0x09, 0xe1, 0xb9, 0xfe, 0x32, 0x1f, 0x6c, 0x49, 0x75, ++ 0x62, 0x4d, 0x16, 0xcf, 0x34, 0xe1, 0xbb, 0x38, 0x34, 0x9f, 0xe7, 0x7f, ++ 0xf7, 0x62, 0x2c, 0xd9, 0x43, 0xb6, 0x73, 0xbd, 0x98, 0x8a, 0xef, 0xd4, ++ 0x3c, 0x81, 0xfb, 0x7e, 0x9f, 0x72, 0x25, 0x51, 0x90, 0x99, 0x69, 0xac, ++ 0xef, 0xa5, 0xda, 0xf2, 0xdf, 0x23, 0x56, 0x5d, 0x72, 0xd1, 0x44, 0x7b, ++ 0x4d, 0x8d, 0xe3, 0x75, 0xbe, 0xe4, 0xf8, 0xc4, 0xa1, 0xdc, 0x45, 0xf7, ++ 0x38, 0xc6, 0x0f, 0xcb, 0x89, 0x86, 0x72, 0x8c, 0xd6, 0xd2, 0x9e, 0x6a, ++ 0x8f, 0xca, 0xfe, 0xd3, 0x4f, 0x05, 0x1e, 0x90, 0xee, 0x2c, 0xde, 0xa7, ++ 0x39, 0x7e, 0x92, 0xb8, 0x6b, 0x48, 0x35, 0x2f, 0x7a, 0x54, 0x08, 0x8f, ++ 0x10, 0xf7, 0x3c, 0x5f, 0x88, 0x62, 0x6f, 0x01, 0xde, 0x35, 0x8e, 0x21, ++ 0x3e, 0xf8, 0x6b, 0x1b, 0x55, 0x3d, 0x77, 0xa1, 0xe2, 0xa9, 0xdb, 0xf0, ++ 0xe3, 0x9c, 0x8d, 0x7c, 0x4e, 0xca, 0xe5, 0xb6, 0x94, 0x67, 0x6d, 0xb3, ++ 0xfb, 0x1b, 0x54, 0x1a, 0x3f, 0x59, 0xd0, 0xb6, 0xb6, 0x33, 0x60, 0x76, ++ 0x9d, 0x11, 0xb1, 0x74, 0x8f, 0x30, 0xf0, 0x4c, 0x21, 0x5e, 0xf2, 0xf9, ++ 0xd3, 0x05, 0x8b, 0xae, 0xed, 0x94, 0x93, 0x29, 0xe2, 0x14, 0xce, 0x1b, ++ 0x0d, 0xff, 0x66, 0xe7, 0xe0, 0x35, 0x32, 0x27, 0xa9, 0xe4, 0x4b, 0xd6, ++ 0x5d, 0xc7, 0x48, 0x2b, 0xc5, 0x28, 0xa7, 0x20, 0x9e, 0xa0, 0x02, 0x74, ++ 0xfb, 0x24, 0xc5, 0xb0, 0xec, 0x9f, 0x2c, 0xe5, 0xc4, 0x93, 0x94, 0x6b, ++ 0xf7, 0x26, 0x22, 0x70, 0x97, 0x5a, 0x18, 0xc9, 0xa9, 0xe8, 0xc9, 0x1e, ++ 0xc7, 0xf1, 0x7a, 0x72, 0x29, 0xf9, 0x63, 0x55, 0x32, 0x84, 0x41, 0x9d, ++ 0xef, 0x87, 0xc8, 0xfe, 0x77, 0x60, 0x45, 0x6a, 0xd1, 0x3a, 0xe7, 0x4d, ++ 0x4c, 0xe8, 0x61, 0xc2, 0x44, 0x75, 0xa9, 0x0e, 0xc4, 0x29, 0x66, 0x4d, ++ 0x96, 0x85, 0xa1, 0x9c, 0xc0, 0x62, 0xba, 0x8e, 0x90, 0x6d, 0x63, 0xb9, ++ 0xb2, 0x2f, 0x56, 0xa5, 0xcc, 0x4b, 0xdb, 0x88, 0x13, 0x0e, 0x65, 0x6d, ++ 0x9c, 0xc8, 0xdf, 0x8c, 0x1f, 0xf7, 0xd9, 0x38, 0x90, 0x95, 0x32, 0x9a, ++ 0x52, 0x37, 0x90, 0x3d, 0xc4, 0x0b, 0x29, 0x8c, 0x13, 0x7e, 0xc6, 0x72, ++ 0x94, 0xaf, 0x94, 0x03, 0xaf, 0xd9, 0x66, 0xd7, 0xdf, 0x07, 0x42, 0x70, ++ 0xeb, 0xbb, 0xc8, 0x46, 0x03, 0x23, 0xd9, 0x2e, 0xca, 0x8d, 0x01, 0xf4, ++ 0xe9, 0x1c, 0xaf, 0x10, 0x86, 0xfa, 0x53, 0xd8, 0x9b, 0x63, 0xff, 0xe3, ++ 0x8f, 0x14, 0x78, 0x88, 0x77, 0x70, 0x2c, 0xbd, 0x8b, 0xc1, 0x84, 0x46, ++ 0x3e, 0x26, 0x2c, 0x75, 0xd8, 0xa8, 0xe9, 0x6d, 0x4e, 0x3f, 0x28, 0xba, ++ 0xe1, 0xce, 0xf0, 0x70, 0x27, 0xe5, 0x44, 0xd4, 0xd9, 0x93, 0x88, 0xe6, ++ 0x3c, 0x79, 0x8d, 0x65, 0x6d, 0xf8, 0x7a, 0x60, 0x33, 0xbe, 0x36, 0x0f, ++ 0xcc, 0x29, 0x5e, 0xd8, 0xd1, 0x51, 0x3f, 0xaf, 0x0f, 0x67, 0xf2, 0x29, ++ 0x18, 0x11, 0x33, 0x7e, 0x40, 0xac, 0xc3, 0x70, 0x5f, 0x12, 0x99, 0xdb, ++ 0x34, 0xc2, 0x3f, 0xe1, 0xdb, 0x5a, 0x87, 0xbd, 0x83, 0xdf, 0xc1, 0xc9, ++ 0x81, 0x6a, 0x6c, 0xb3, 0x22, 0xa8, 0x18, 0xd3, 0xbc, 0x5a, 0xda, 0x63, ++ 0xb4, 0x43, 0xc3, 0x21, 0xe2, 0x91, 0xf6, 0xa4, 0x0a, 0x6f, 0x1a, 0xdb, ++ 0x29, 0x08, 0xd3, 0xcb, 0x51, 0x2c, 0xe1, 0xdd, 0xc3, 0x4a, 0xe2, 0xb7, ++ 0x1c, 0xe9, 0xfd, 0x6c, 0xae, 0x1a, 0x9f, 0xd7, 0x43, 0xac, 0xa0, 0x9a, ++ 0xf2, 0x48, 0xb6, 0xb9, 0xf8, 0x3d, 0xe5, 0xdb, 0xc0, 0x55, 0x5d, 0xd8, ++ 0x97, 0x33, 0xb0, 0x23, 0x0f, 0x3c, 0x9c, 0x17, 0x68, 0xb4, 0x54, 0x6c, ++ 0xca, 0xa7, 0x09, 0x0f, 0x0b, 0x50, 0x6c, 0x2a, 0x73, 0xd2, 0x08, 0xc5, ++ 0xdf, 0x6b, 0xe4, 0xef, 0x41, 0x4c, 0x44, 0xcc, 0x28, 0xc0, 0xb1, 0x53, ++ 0xb1, 0x20, 0xd1, 0x3f, 0x39, 0x71, 0xab, 0xa9, 0x67, 0x28, 0xf7, 0x02, ++ 0xd6, 0x9f, 0x31, 0x4f, 0xd0, 0xf7, 0x2f, 0xf9, 0xda, 0x59, 0xc6, 0xe8, ++ 0xf4, 0x5f, 0xc1, 0x28, 0xdb, 0x40, 0x48, 0x9b, 0x2f, 0x28, 0x4e, 0x53, ++ 0xf9, 0x14, 0x41, 0xd5, 0x18, 0x25, 0x6d, 0xbf, 0xa0, 0x7a, 0x91, 0xc6, ++ 0x68, 0x81, 0xc6, 0x75, 0xf0, 0xb3, 0x29, 0x4e, 0xd8, 0x1f, 0xa6, 0x3a, ++ 0x4f, 0x36, 0x76, 0x62, 0xb4, 0x35, 0x83, 0x7d, 0x85, 0x7d, 0xe4, 0xdb, ++ 0x4e, 0xc2, 0xd6, 0xfd, 0xc4, 0x41, 0xf4, 0x3b, 0x47, 0xf7, 0x73, 0x10, ++ 0x07, 0xed, 0x7b, 0x25, 0x6e, 0x65, 0x6c, 0x39, 0x18, 0xce, 0x75, 0xa1, ++ 0xb2, 0xa7, 0xd9, 0x58, 0x83, 0x95, 0x72, 0x8b, 0xda, 0x85, 0xc0, 0xf8, ++ 0xed, 0xb4, 0x06, 0x3f, 0x9b, 0xe2, 0x97, 0x93, 0xe1, 0x72, 0x0e, 0xfd, ++ 0x92, 0x93, 0x98, 0xe3, 0x87, 0x53, 0x53, 0xfb, 0x56, 0xe1, 0x5b, 0x83, ++ 0xa6, 0x5d, 0x54, 0x16, 0x90, 0xee, 0x9c, 0xc7, 0x9c, 0xcf, 0x2f, 0xd2, ++ 0x1c, 0xf6, 0x43, 0x94, 0x30, 0x35, 0x2c, 0xdd, 0x2e, 0xd6, 0x69, 0x6a, ++ 0x3e, 0x73, 0x99, 0xa0, 0x3e, 0x23, 0x4d, 0xf8, 0x60, 0x3e, 0xfb, 0x4d, ++ 0xfa, 0xdb, 0x78, 0x2e, 0xab, 0xe1, 0x78, 0x6f, 0x94, 0xd6, 0x14, 0xf8, ++ 0xa7, 0x96, 0xaa, 0x4b, 0xc5, 0x80, 0x8d, 0xa3, 0x84, 0xb3, 0xc3, 0x39, ++ 0xf6, 0x1b, 0xcd, 0x4b, 0x72, 0x9d, 0x9d, 0x29, 0x3e, 0x1c, 0xb8, 0x57, ++ 0x0e, 0xa6, 0x75, 0x9c, 0x4a, 0x3d, 0x4e, 0x73, 0x19, 0x5f, 0x73, 0x30, ++ 0x37, 0x32, 0x0d, 0xd7, 0xcd, 0xb9, 0x1a, 0x13, 0xf5, 0x4d, 0x98, 0x41, ++ 0x5c, 0x12, 0xb5, 0xae, 0x97, 0x9d, 0x77, 0x70, 0x2e, 0x68, 0x94, 0xab, ++ 0x57, 0xe1, 0x83, 0x5d, 0x2f, 0x48, 0xdd, 0x0a, 0x33, 0xe6, 0xed, 0x6e, ++ 0x5c, 0x85, 0x73, 0xc3, 0xab, 0xc2, 0xec, 0xf3, 0x55, 0x49, 0x60, 0x73, ++ 0xb6, 0x47, 0x7e, 0x51, 0xaa, 0x2d, 0x2a, 0xf1, 0x4e, 0xb3, 0xfd, 0x4a, ++ 0xe0, 0x31, 0xf9, 0x77, 0x2a, 0xc7, 0xfc, 0xc4, 0x15, 0x3f, 0xcc, 0x97, ++ 0xb3, 0x9b, 0x38, 0x57, 0xba, 0xe9, 0xb7, 0x4e, 0x6b, 0x84, 0x51, 0x6f, ++ 0xd9, 0xf2, 0xed, 0x5b, 0xf9, 0xfb, 0x03, 0x74, 0xaf, 0x89, 0xae, 0xd7, ++ 0xca, 0x85, 0xbf, 0xb6, 0x9f, 0xfe, 0x1b, 0xf6, 0x5b, 0x49, 0xd7, 0x08, ++ 0xdd, 0x07, 0x61, 0xf0, 0x98, 0x58, 0x5e, 0xee, 0x5f, 0x35, 0xd5, 0x3a, ++ 0x26, 0x56, 0x96, 0x7a, 0xd6, 0x52, 0x79, 0x20, 0x7f, 0x2f, 0xc1, 0xd0, ++ 0x80, 0x94, 0x8f, 0xd9, 0x33, 0xe0, 0xea, 0x11, 0x3c, 0x66, 0x2d, 0xc1, ++ 0xfe, 0x01, 0x9e, 0x23, 0x65, 0x3c, 0x31, 0xa7, 0x53, 0x15, 0x0d, 0x94, ++ 0xcf, 0x9e, 0x58, 0x9d, 0x32, 0xc4, 0xfd, 0x03, 0x54, 0xb1, 0x72, 0x33, ++ 0xc9, 0xbf, 0x52, 0x3e, 0x9d, 0x80, 0xbb, 0x25, 0x51, 0x83, 0xd7, 0x07, ++ 0x75, 0xea, 0x6d, 0x27, 0xe5, 0xe2, 0xd8, 0x12, 0x14, 0x68, 0x9d, 0x8f, ++ 0x13, 0x6d, 0xf1, 0x93, 0x82, 0x78, 0x81, 0xfa, 0xf4, 0x3d, 0xb9, 0x46, ++ 0x9c, 0x1c, 0x51, 0xb1, 0x8d, 0x72, 0xff, 0xc5, 0x14, 0xef, 0xa9, 0xe2, ++ 0xd1, 0x02, 0xfb, 0x96, 0xfa, 0x39, 0xcb, 0x13, 0xef, 0x97, 0xee, 0xd5, ++ 0x60, 0xf1, 0x20, 0x8f, 0x65, 0x0e, 0xb7, 0xf4, 0x19, 0x81, 0xa9, 0x71, ++ 0x67, 0xa9, 0x3f, 0x32, 0x08, 0xfb, 0xb3, 0xa8, 0x07, 0x6a, 0xa4, 0xde, ++ 0x88, 0x7b, 0x32, 0x8b, 0xfa, 0xa3, 0x28, 0xf5, 0x43, 0x66, 0xd4, 0x83, ++ 0x94, 0x47, 0x88, 0x03, 0xdf, 0xa6, 0xcf, 0xe7, 0x36, 0xd7, 0xa4, 0x63, ++ 0x42, 0xe9, 0x65, 0x1b, 0x3d, 0x11, 0x99, 0x4f, 0xbd, 0xe2, 0x01, 0xea, ++ 0x3f, 0x95, 0xdb, 0xa9, 0x7f, 0x33, 0x10, 0x38, 0xe0, 0x62, 0x45, 0x72, ++ 0xe1, 0x95, 0x1e, 0xdc, 0x10, 0xd5, 0xbb, 0x99, 0xdf, 0x5c, 0xec, 0x20, ++ 0x7d, 0xbf, 0x99, 0x98, 0x94, 0xad, 0x31, 0x29, 0x83, 0x89, 0x36, 0xfb, ++ 0x43, 0x3a, 0x87, 0x14, 0x75, 0x33, 0x3e, 0x01, 0x17, 0x4f, 0xd2, 0xb3, ++ 0x55, 0x09, 0x70, 0x4e, 0x8b, 0x91, 0x8e, 0xe6, 0x4c, 0x4c, 0x09, 0x63, ++ 0xeb, 0x88, 0x85, 0x6c, 0xc9, 0x1e, 0x60, 0x27, 0xf1, 0x51, 0x5f, 0x8e, ++ 0x6d, 0xf1, 0xc4, 0x27, 0xd4, 0x6b, 0xbc, 0x49, 0xfc, 0xf3, 0xc5, 0xa8, ++ 0x8e, 0x4f, 0x47, 0xe3, 0xb8, 0x48, 0xbd, 0xe8, 0xe7, 0xa3, 0xb5, 0x28, ++ 0x2e, 0xe5, 0xe7, 0x4d, 0x42, 0x0e, 0x5c, 0x96, 0x5f, 0xce, 0x53, 0xd1, ++ 0xd9, 0x6a, 0x0e, 0x56, 0x06, 0xe0, 0xee, 0xa2, 0xfe, 0xe7, 0xa1, 0x64, ++ 0x10, 0x6e, 0x13, 0x3f, 0x97, 0x92, 0x7c, 0xbd, 0x79, 0x79, 0xca, 0xb2, ++ 0x5f, 0x24, 0x5c, 0x6c, 0x2b, 0xc8, 0x13, 0xd5, 0xe4, 0x9b, 0x0f, 0x53, ++ 0xd6, 0x92, 0xd7, 0xd0, 0x82, 0xfd, 0x23, 0xaa, 0xb8, 0x90, 0x6d, 0xc7, ++ 0x3e, 0x3a, 0x73, 0x54, 0x90, 0x8d, 0xe7, 0xf2, 0xe4, 0x03, 0xe2, 0x88, ++ 0x23, 0x39, 0xf2, 0x0b, 0xe5, 0xc0, 0x61, 0xf2, 0xf1, 0xa1, 0x52, 0x6f, ++ 0xc9, 0x7e, 0x8b, 0x53, 0x8f, 0x10, 0xc6, 0xd2, 0xb1, 0xe1, 0x3a, 0xc6, ++ 0xf1, 0xb6, 0xdc, 0xd9, 0x52, 0x2f, 0x7c, 0x88, 0x7c, 0x5e, 0xef, 0x70, ++ 0x1f, 0xce, 0xfe, 0x64, 0x3f, 0x4a, 0xf9, 0x0e, 0x9d, 0x87, 0xec, 0xf9, ++ 0xdc, 0x43, 0x10, 0x0a, 0x0e, 0x18, 0x88, 0x1f, 0x60, 0x3f, 0xb3, 0x6f, ++ 0xd9, 0x9f, 0xec, 0x67, 0xf6, 0x9d, 0x94, 0x87, 0x6d, 0x15, 0x5b, 0xc9, ++ 0xde, 0x2d, 0x39, 0x79, 0xa2, 0xc2, 0xb2, 0x8c, 0x31, 0x84, 0x10, 0x19, ++ 0x0b, 0xa3, 0x71, 0x4c, 0x43, 0xc3, 0x58, 0x0b, 0xd4, 0x31, 0x1d, 0x81, ++ 0x31, 0xe8, 0x0a, 0xe9, 0x76, 0xed, 0x81, 0xdf, 0xa6, 0x1b, 0x9f, 0xc7, ++ 0x3c, 0x71, 0x23, 0xf9, 0x4b, 0xa5, 0xf1, 0x5b, 0x08, 0x93, 0x19, 0x15, ++ 0x46, 0xa5, 0xa5, 0x50, 0x7d, 0xd6, 0xb0, 0x77, 0xa4, 0x06, 0x63, 0x84, ++ 0xa7, 0xc1, 0x11, 0xe8, 0x41, 0x7a, 0xbe, 0xf5, 0x17, 0x38, 0x05, 0xd9, ++ 0x72, 0x9a, 0x6c, 0xa1, 0x3a, 0x51, 0x80, 0xfb, 0xa2, 0xdd, 0x4e, 0xba, ++ 0xc6, 0x49, 0x57, 0x8b, 0x6c, 0x33, 0xc8, 0x9e, 0xcd, 0x84, 0x5d, 0xe6, ++ 0x39, 0x03, 0xaa, 0x63, 0x45, 0x4f, 0x62, 0x23, 0xc7, 0xda, 0x7b, 0xb5, ++ 0xa4, 0xbb, 0x3c, 0xa1, 0x51, 0x6e, 0x9c, 0xa6, 0x13, 0xe6, 0x30, 0x71, ++ 0xed, 0xb6, 0x02, 0x8c, 0x33, 0xf6, 0x77, 0x30, 0x31, 0x4d, 0x45, 0xbd, ++ 0x73, 0x42, 0x46, 0x2c, 0xab, 0xeb, 0x21, 0x6a, 0x58, 0xfe, 0xd1, 0x26, ++ 0x1c, 0x47, 0x54, 0x3c, 0x49, 0xeb, 0xcd, 0x70, 0xac, 0xe2, 0xbb, 0xa8, ++ 0x00, 0x1a, 0x18, 0x57, 0x2a, 0x14, 0xc7, 0xba, 0xf4, 0x22, 0xde, 0xc2, ++ 0x04, 0xfd, 0x0e, 0x3a, 0x7c, 0xef, 0x6a, 0x51, 0xb7, 0x7b, 0x96, 0x08, ++ 0xed, 0x96, 0xf2, 0x42, 0x02, 0x7f, 0x1c, 0x42, 0x2c, 0x5e, 0x25, 0x34, ++ 0x6c, 0x2d, 0xf0, 0xf3, 0x90, 0x78, 0x76, 0x00, 0xee, 0x61, 0xaa, 0x63, ++ 0xf5, 0xa9, 0xbf, 0xc5, 0xd2, 0x88, 0x94, 0x6b, 0x93, 0x70, 0xc7, 0xb3, ++ 0x10, 0xc7, 0xb8, 0xbe, 0xfe, 0xa9, 0x4e, 0xb5, 0x03, 0xfa, 0xbb, 0xb6, ++ 0x06, 0xa3, 0x41, 0xe0, 0x22, 0xd5, 0x83, 0xf7, 0xec, 0xbf, 0xc1, 0xc4, ++ 0x74, 0xe8, 0x61, 0xc7, 0xd2, 0xdf, 0x44, 0x3f, 0xf5, 0xbe, 0x08, 0x55, ++ 0x39, 0xfc, 0x0c, 0xe2, 0x8c, 0x5d, 0x4d, 0xba, 0x0a, 0x5c, 0xe3, 0xc0, ++ 0x7d, 0x30, 0x41, 0x73, 0x9a, 0xac, 0xd3, 0xef, 0x41, 0x5c, 0x13, 0x75, ++ 0xac, 0x3d, 0x67, 0xc9, 0xa6, 0x88, 0x73, 0x01, 0x0f, 0x45, 0xa0, 0xd4, ++ 0x26, 0x78, 0x0c, 0x3f, 0xeb, 0x83, 0x41, 0x6b, 0x55, 0x3b, 0x96, 0xf1, ++ 0x1a, 0x98, 0x2f, 0x2b, 0x49, 0x61, 0x73, 0x07, 0x9d, 0xa3, 0xe6, 0xd2, ++ 0x69, 0x10, 0x87, 0x6c, 0x2f, 0x5a, 0x4f, 0x21, 0xaf, 0x72, 0x8c, 0x4d, ++ 0xb3, 0x63, 0x66, 0xfc, 0x1e, 0x3a, 0x03, 0x6d, 0xcf, 0xdd, 0x44, 0x39, ++ 0x6e, 0xf6, 0x41, 0xd9, 0x45, 0x63, 0xcb, 0xfe, 0x1e, 0xee, 0x23, 0x7f, ++ 0x52, 0x7f, 0x97, 0xd1, 0xcd, 0x3d, 0x7c, 0x3e, 0x0f, 0x59, 0xdd, 0xe2, ++ 0x3e, 0x5d, 0xa1, 0xdc, 0x17, 0xd8, 0xd7, 0xf7, 0x0d, 0x51, 0x43, 0xbd, ++ 0xfa, 0xbb, 0x76, 0xf1, 0x7b, 0xf5, 0x88, 0xe2, 0x09, 0xca, 0x6f, 0x77, ++ 0xa9, 0x8b, 0xca, 0xf9, 0x8c, 0x33, 0xb8, 0xb3, 0x7b, 0x21, 0xec, 0xc4, ++ 0xcf, 0x80, 0xc8, 0x57, 0xf2, 0xa2, 0x0d, 0x2d, 0xe8, 0x58, 0x18, 0xcd, ++ 0xaa, 0x18, 0xb6, 0x3f, 0x43, 0x86, 0x78, 0xe1, 0x33, 0x9b, 0xc6, 0xdf, ++ 0xa1, 0x52, 0xfd, 0x09, 0x8b, 0xce, 0xdd, 0xa6, 0x91, 0x51, 0x78, 0x2f, ++ 0x3a, 0xf3, 0xb5, 0x4a, 0x79, 0x2e, 0xb1, 0x91, 0x70, 0xa7, 0x50, 0x0d, ++ 0x3a, 0x0e, 0x37, 0xc2, 0x9a, 0x98, 0x2e, 0xd7, 0xb8, 0x13, 0x39, 0x8a, ++ 0x79, 0x8e, 0x62, 0x9e, 0xa3, 0x98, 0x13, 0xc6, 0x0e, 0xe6, 0xe8, 0x1c, ++ 0x2c, 0x18, 0x1f, 0x9d, 0x25, 0x5c, 0xbd, 0x6a, 0xd7, 0xc0, 0x98, 0x66, ++ 0xa0, 0xc6, 0xe1, 0xf8, 0x3e, 0x2e, 0x27, 0xea, 0x55, 0xc2, 0x2c, 0xc7, ++ 0xd8, 0xf2, 0xde, 0xc6, 0x76, 0x89, 0x26, 0x17, 0xeb, 0x52, 0x1c, 0xef, ++ 0xe9, 0x3a, 0x1d, 0x14, 0x28, 0xe6, 0x56, 0xfa, 0x75, 0xfc, 0x5c, 0xba, ++ 0xf5, 0x3c, 0x5e, 0x25, 0x5e, 0x93, 0x32, 0x4c, 0x79, 0xf8, 0x46, 0x87, ++ 0x65, 0xbf, 0x41, 0x85, 0x7a, 0x4b, 0x47, 0x44, 0x67, 0x4e, 0x26, 0xbc, ++ 0x68, 0x0d, 0x54, 0xf3, 0xd6, 0xf7, 0x42, 0xab, 0xa4, 0xeb, 0x79, 0xe2, ++ 0xc7, 0x0c, 0xc5, 0x74, 0x65, 0xcb, 0x69, 0x0c, 0xa6, 0x4b, 0x78, 0xa0, ++ 0xde, 0x97, 0x8c, 0xec, 0xa9, 0x02, 0xa8, 0x9e, 0xbf, 0x66, 0xc3, 0x7d, ++ 0x24, 0x51, 0x41, 0xb1, 0x45, 0x5d, 0x39, 0x9e, 0x14, 0x2c, 0xa7, 0xad, ++ 0xeb, 0xfd, 0x80, 0x2e, 0x32, 0x4b, 0x19, 0xf7, 0x59, 0xea, 0x5f, 0x50, ++ 0x47, 0x3e, 0x89, 0xbe, 0x4c, 0x41, 0xa9, 0x72, 0x76, 0xe0, 0x1e, 0x5d, ++ 0x23, 0xfe, 0xb3, 0x36, 0xa8, 0x01, 0x33, 0x73, 0x5e, 0xa8, 0xd8, 0x4e, ++ 0xe7, 0xdf, 0x73, 0x56, 0xd1, 0x24, 0x04, 0x92, 0x3f, 0xc3, 0xa2, 0x65, ++ 0x37, 0x9d, 0x81, 0xe7, 0xab, 0x78, 0x9d, 0x78, 0x77, 0x75, 0x82, 0x7d, ++ 0xc3, 0x3e, 0x62, 0xdf, 0xfc, 0x1f, 0x7e, 0xc1, 0x94, 0x5f, 0x64, 0x0d, ++ 0xef, 0xf3, 0x2a, 0x71, 0xe5, 0xd3, 0xa9, 0x36, 0x63, 0x91, 0x58, 0x27, ++ 0xf9, 0xbd, 0x03, 0xe1, 0x8a, 0xce, 0x7e, 0xed, 0x74, 0xf6, 0x0b, 0xd2, ++ 0x77, 0x81, 0xed, 0xa5, 0x5e, 0xbd, 0x1d, 0xad, 0xf9, 0xeb, 0xd9, 0x66, ++ 0xc2, 0x1c, 0xeb, 0x19, 0x16, 0xbd, 0x03, 0xfc, 0x1e, 0xe6, 0x2c, 0x6e, ++ 0xc8, 0x7a, 0xc4, 0xd7, 0x52, 0x9e, 0x22, 0x8c, 0xa5, 0x2d, 0xde, 0x9f, ++ 0xc7, 0x9f, 0x85, 0x9d, 0x67, 0x3d, 0x02, 0x84, 0xe7, 0x53, 0x34, 0x8f, ++ 0x75, 0x99, 0x47, 0x57, 0x83, 0x7e, 0x8f, 0xe8, 0x7c, 0x4e, 0xe1, 0x02, ++ 0x13, 0x24, 0x9c, 0x8d, 0x5a, 0x77, 0x95, 0x7c, 0x39, 0xdc, 0xd7, 0x8d, ++ 0xfd, 0x94, 0x83, 0x73, 0x7b, 0x22, 0x62, 0xa4, 0x0f, 0xee, 0x69, 0x9b, ++ 0xcf, 0xd1, 0x8f, 0x46, 0x03, 0xf8, 0x11, 0xf9, 0x2e, 0x80, 0x95, 0x96, ++ 0x77, 0x5a, 0x85, 0x59, 0x8c, 0x11, 0x47, 0x46, 0x28, 0x76, 0xeb, 0x2d, ++ 0x6f, 0x47, 0x03, 0xf5, 0xa7, 0xc4, 0xf7, 0x5e, 0x8c, 0x8e, 0x84, 0x75, ++ 0xbd, 0x8d, 0x28, 0xd0, 0xf9, 0x72, 0x9c, 0xf8, 0x34, 0x9f, 0x30, 0xd3, ++ 0x5b, 0x09, 0x46, 0x37, 0xf6, 0x44, 0xa9, 0x57, 0x89, 0x62, 0x3c, 0xc7, ++ 0x38, 0x61, 0xbc, 0x6b, 0x84, 0x55, 0xc6, 0x37, 0xc4, 0xec, 0x18, 0x41, ++ 0x9d, 0xea, 0xe8, 0xd3, 0xad, 0x40, 0x57, 0x9f, 0xc0, 0x28, 0xd5, 0xeb, ++ 0x42, 0xbb, 0xb9, 0x67, 0x03, 0xbc, 0xbe, 0x06, 0x98, 0x3b, 0xbe, 0x49, ++ 0xdc, 0x67, 0xf7, 0x56, 0x50, 0x2d, 0x6f, 0x71, 0x75, 0x61, 0xea, 0x37, ++ 0x8a, 0x9f, 0xcb, 0x7c, 0x23, 0x66, 0x06, 0xf1, 0x85, 0x1c, 0xbc, 0x9d, ++ 0xe7, 0x30, 0x5f, 0xb1, 0x0d, 0x6a, 0x62, 0x34, 0xdb, 0x8d, 0xbb, 0x49, ++ 0xf7, 0x2f, 0xc9, 0xc7, 0xe3, 0xed, 0x55, 0x74, 0x56, 0x6d, 0x5e, 0x32, ++ 0x37, 0xe0, 0xa5, 0x83, 0xe0, 0x77, 0x54, 0x5a, 0x62, 0x05, 0xf5, 0x51, ++ 0x8b, 0x84, 0x00, 0x51, 0x20, 0x1e, 0xcf, 0xb3, 0x7f, 0xd4, 0xc4, 0xdc, ++ 0xfc, 0x6c, 0x9d, 0xdf, 0x8d, 0xec, 0x28, 0xcc, 0xa0, 0xf5, 0x4a, 0x39, ++ 0x4c, 0xe7, 0xfd, 0xb0, 0xa8, 0x79, 0x8a, 0xe3, 0xc9, 0xfe, 0xa1, 0x73, ++ 0x00, 0xd5, 0x9e, 0x53, 0xf6, 0x1b, 0x57, 0x30, 0x3f, 0xe5, 0xc7, 0x4f, ++ 0xaf, 0xc4, 0x77, 0x33, 0xfb, 0xd1, 0x45, 0x69, 0x8f, 0xb7, 0xb0, 0x22, ++ 0x4b, 0x4c, 0x33, 0x57, 0x60, 0x7d, 0xa7, 0xc0, 0xfd, 0x73, 0xad, 0xbe, ++ 0x51, 0xf1, 0x6d, 0xe9, 0x36, 0x15, 0xcd, 0x7a, 0x5c, 0x96, 0x0b, 0x5b, ++ 0x54, 0xc4, 0xaf, 0xfb, 0x73, 0xea, 0xdf, 0x19, 0x33, 0x0a, 0x96, 0xd3, ++ 0x98, 0xbb, 0xdb, 0xad, 0xae, 0x0f, 0x03, 0x5d, 0xc8, 0x94, 0xee, 0xdd, ++ 0x70, 0x6d, 0x05, 0xda, 0xd2, 0xf5, 0xb0, 0xba, 0x9f, 0xc0, 0xc3, 0xdc, ++ 0x8f, 0x12, 0x76, 0x79, 0xee, 0x14, 0xc6, 0x8a, 0xb4, 0x17, 0xeb, 0x15, ++ 0x16, 0x5f, 0x23, 0xbc, 0x7d, 0x9a, 0xe2, 0xbc, 0x54, 0x71, 0x98, 0xf4, ++ 0xbb, 0x89, 0xce, 0xcd, 0xad, 0xc9, 0xa9, 0xbc, 0x9c, 0xd2, 0x29, 0x2c, ++ 0xda, 0x77, 0x43, 0xa8, 0x25, 0x3c, 0x10, 0x66, 0x69, 0xdc, 0x39, 0x9b, ++ 0xc7, 0x70, 0x2e, 0xaf, 0xd7, 0xaf, 0xfc, 0xaf, 0x16, 0xb7, 0x40, 0xbc, ++ 0xf7, 0x51, 0xe2, 0x46, 0xda, 0x04, 0xe2, 0x2c, 0xa5, 0x09, 0xe5, 0x23, ++ 0x12, 0x14, 0x47, 0x34, 0xa8, 0x68, 0x48, 0xa2, 0x4e, 0x73, 0xac, 0xb5, ++ 0xc4, 0xcd, 0x4a, 0x85, 0x53, 0x87, 0x31, 0x3a, 0x8b, 0x3f, 0x91, 0x0b, ++ 0x8b, 0x13, 0x03, 0xbc, 0xa6, 0xd5, 0xbd, 0x98, 0x62, 0xf2, 0x0a, 0xe5, ++ 0xc3, 0x9d, 0x7d, 0x2a, 0xfe, 0xbd, 0xb5, 0xcc, 0x11, 0xc9, 0xd6, 0xa2, ++ 0x19, 0xc1, 0xc6, 0x52, 0x6d, 0x5a, 0x4d, 0xb5, 0xbb, 0xd2, 0xb2, 0x76, ++ 0xb4, 0x2a, 0x5f, 0xc9, 0x48, 0x52, 0x40, 0xb7, 0xee, 0x84, 0x1d, 0x11, ++ 0x68, 0x4e, 0x66, 0x88, 0x67, 0xe0, 0xd5, 0x11, 0x77, 0x77, 0x52, 0x1f, ++ 0x4e, 0x3c, 0xce, 0x35, 0x5b, 0x7b, 0xdb, 0x5e, 0x41, 0xfc, 0xc9, 0x35, ++ 0x37, 0x29, 0x33, 0x77, 0xfc, 0xaa, 0x9f, 0xa7, 0xfc, 0x0e, 0xe3, 0x3d, ++ 0x3b, 0x37, 0x39, 0xb1, 0x8c, 0x7d, 0xe3, 0x51, 0x69, 0x2a, 0x63, 0x6c, ++ 0x31, 0x9d, 0xd7, 0xee, 0xb1, 0xbc, 0x68, 0x15, 0x9f, 0x95, 0x0a, 0xa6, ++ 0xbb, 0x8a, 0xec, 0x52, 0x08, 0x77, 0x83, 0x85, 0x4a, 0xc2, 0x57, 0x23, ++ 0x86, 0x0a, 0xec, 0x3f, 0x8e, 0xe7, 0x94, 0x0f, 0x7f, 0x32, 0x69, 0x34, ++ 0x30, 0x6f, 0x72, 0x1e, 0xe9, 0x94, 0x47, 0x4a, 0xa9, 0xc7, 0x7a, 0x2f, ++ 0x71, 0x64, 0xf2, 0xee, 0x34, 0x73, 0xe6, 0x1a, 0x9d, 0xdf, 0x01, 0x3d, ++ 0x41, 0x3a, 0x51, 0xad, 0xc1, 0x42, 0xe2, 0xcf, 0xe4, 0xbc, 0x5a, 0xe9, ++ 0x46, 0x58, 0x87, 0xb0, 0x18, 0x1b, 0xf8, 0x25, 0x3e, 0xca, 0x39, 0xff, ++ 0x52, 0x69, 0xdd, 0xa0, 0x15, 0x16, 0xdb, 0x4a, 0xcf, 0x38, 0x1f, 0x7f, ++ 0xfd, 0xd9, 0xf0, 0x00, 0xcf, 0x29, 0xc7, 0xe3, 0x1e, 0x7a, 0xd6, 0x52, ++ 0xe2, 0xd2, 0xaf, 0x64, 0x65, 0xf2, 0x0e, 0xd2, 0x93, 0x63, 0x2d, 0x28, ++ 0x07, 0x05, 0xea, 0xac, 0x67, 0x26, 0x1f, 0xd0, 0x05, 0x9d, 0xcf, 0x14, ++ 0xea, 0x2f, 0x73, 0x93, 0x0f, 0x36, 0xb2, 0xae, 0x2e, 0xfe, 0xc1, 0xee, ++ 0x99, 0x74, 0x23, 0x25, 0xbd, 0xe8, 0x0c, 0xa4, 0x8b, 0x37, 0x68, 0xaf, ++ 0x63, 0xa4, 0xf7, 0xb3, 0x89, 0x1f, 0x4e, 0x36, 0x94, 0xec, 0x59, 0x73, ++ 0x25, 0xae, 0x2a, 0x96, 0x25, 0x03, 0xc8, 0x34, 0xf1, 0xfb, 0x2f, 0x05, ++ 0x8b, 0xe7, 0x4b, 0xd9, 0x6f, 0x93, 0x0f, 0x9e, 0x32, 0x3b, 0x5d, 0xe5, ++ 0x85, 0xfa, 0x72, 0xee, 0x87, 0xc5, 0x47, 0xa5, 0xdf, 0x65, 0x3b, 0xb6, ++ 0x12, 0x3e, 0xc6, 0xec, 0x29, 0x0c, 0xf5, 0xd0, 0x98, 0xaf, 0xe4, 0xad, ++ 0xc9, 0xb0, 0xb8, 0x30, 0xc0, 0x18, 0xe2, 0x71, 0x2a, 0x6a, 0x79, 0xcc, ++ 0x2f, 0xf8, 0x7f, 0x57, 0x7d, 0x79, 0xaf, 0xb7, 0xae, 0xbc, 0x8f, 0x6b, ++ 0xa7, 0xda, 0x1f, 0xca, 0xe8, 0x4e, 0x1c, 0xcf, 0x51, 0xdd, 0x3f, 0x5a, ++ 0x98, 0xea, 0x0d, 0xb9, 0x67, 0x29, 0xf5, 0x38, 0xe9, 0x50, 0xef, 0x66, ++ 0x59, 0x6b, 0xb1, 0xee, 0x56, 0x57, 0x8f, 0x08, 0x75, 0xde, 0xdb, 0x11, ++ 0xe0, 0x77, 0x13, 0xe9, 0xea, 0x03, 0x1a, 0x5e, 0x2d, 0xe5, 0xa4, 0x01, ++ 0x23, 0x1f, 0x6b, 0x2a, 0xc7, 0xbc, 0x29, 0x53, 0xe1, 0x00, 0xaf, 0x64, ++ 0x75, 0x04, 0xa9, 0x07, 0xd3, 0x9c, 0xa5, 0xde, 0x70, 0xca, 0x32, 0x2e, ++ 0x60, 0xd9, 0x32, 0xc5, 0xd9, 0xb8, 0x2c, 0x70, 0x80, 0x7a, 0xd0, 0x46, ++ 0x6c, 0x7c, 0x39, 0xa5, 0xe2, 0x4c, 0x16, 0x99, 0xb0, 0x63, 0xc6, 0x3f, ++ 0x16, 0x1b, 0x71, 0x38, 0xbb, 0x01, 0x47, 0xe8, 0xf7, 0x34, 0xc7, 0x30, ++ 0x46, 0xe6, 0xeb, 0xe8, 0x2f, 0x28, 0x68, 0x28, 0x71, 0xc4, 0xf7, 0x37, ++ 0x8e, 0xd2, 0x99, 0xb7, 0x82, 0xf6, 0x8f, 0x38, 0xa1, 0x0c, 0xd5, 0x41, ++ 0x8d, 0xc6, 0x6c, 0x3a, 0xda, 0x72, 0x8a, 0xce, 0x2d, 0x21, 0x0c, 0x50, ++ 0x1d, 0x69, 0x72, 0xae, 0xdd, 0xf4, 0xd3, 0x96, 0xcb, 0xcb, 0xe6, 0x1d, ++ 0xe8, 0xc6, 0x32, 0xea, 0x51, 0x57, 0xf7, 0xce, 0xe2, 0xfa, 0x82, 0xb5, ++ 0xbd, 0x3c, 0xff, 0x32, 0xd5, 0x48, 0xae, 0x31, 0x97, 0x70, 0x9e, 0xce, ++ 0x06, 0x15, 0xc2, 0xbc, 0x34, 0x06, 0xe6, 0xf2, 0x36, 0xef, 0x5c, 0xc0, ++ 0x34, 0xde, 0x87, 0x79, 0xba, 0x0f, 0x6c, 0xc3, 0x65, 0x7c, 0xbd, 0x64, ++ 0xcb, 0x25, 0x2c, 0xa4, 0x73, 0x62, 0xba, 0x37, 0x80, 0x68, 0xf2, 0x63, ++ 0x89, 0x06, 0xd3, 0xe6, 0x7f, 0x7f, 0xf4, 0x08, 0xad, 0xd5, 0x48, 0x63, ++ 0x06, 0xe8, 0x1a, 0xa6, 0x31, 0x6f, 0xf6, 0x34, 0x17, 0xe3, 0x01, 0xb3, ++ 0x6b, 0x8f, 0x62, 0x6e, 0xa0, 0xb5, 0xd6, 0x6e, 0x10, 0x66, 0xe6, 0x8c, ++ 0x30, 0xd3, 0x3d, 0xc4, 0x55, 0x55, 0xc9, 0xf2, 0x7a, 0x6d, 0xf9, 0x59, ++ 0xc4, 0x51, 0xe5, 0x35, 0xe7, 0xd0, 0x39, 0xdc, 0x98, 0x56, 0xe6, 0x90, ++ 0x8a, 0xe4, 0x4f, 0x25, 0x21, 0x9a, 0x7b, 0x65, 0x31, 0x90, 0x75, 0x29, ++ 0xbf, 0x0c, 0x0c, 0xe4, 0x97, 0x88, 0xed, 0x59, 0x65, 0xb2, 0x12, 0xdd, ++ 0xf8, 0x60, 0xde, 0x02, 0xd1, 0xad, 0xff, 0x21, 0xd6, 0xb5, 0x0f, 0x20, ++ 0xb3, 0x34, 0x43, 0x98, 0x34, 0xc8, 0xdf, 0x41, 0xaa, 0x67, 0x54, 0xe2, ++ 0x1c, 0xce, 0xbf, 0x0d, 0xe2, 0xd3, 0xf1, 0x54, 0xa4, 0x1c, 0xc7, 0x25, ++ 0x22, 0x4b, 0x3d, 0x00, 0xf7, 0xb6, 0x3b, 0x52, 0x0a, 0xf5, 0x4c, 0x12, ++ 0xb1, 0x84, 0x4b, 0x3d, 0xe0, 0xe7, 0x78, 0x5a, 0xff, 0x2f, 0x79, 0xc8, ++ 0xaa, 0xc0, 0x75, 0x73, 0x23, 0x98, 0x58, 0xca, 0xb9, 0xb7, 0x58, 0x6c, ++ 0xcb, 0x4a, 0x3a, 0xc7, 0x4a, 0xf0, 0xbb, 0xfb, 0x77, 0xe9, 0x73, 0xd6, ++ 0xae, 0x11, 0x01, 0xe2, 0x8c, 0xd6, 0x56, 0xca, 0x42, 0x6b, 0x12, 0x07, ++ 0xf5, 0x6a, 0x9c, 0x88, 0xff, 0x4f, 0x65, 0xdf, 0x02, 0x1c, 0xd5, 0x79, ++ 0xa5, 0xf9, 0xdd, 0xee, 0x96, 0xd4, 0x7a, 0x72, 0x25, 0x5a, 0xd0, 0x02, ++ 0x19, 0xba, 0xad, 0xdb, 0xa8, 0x8d, 0x64, 0x73, 0x1b, 0xa4, 0x58, 0xce, ++ 0x76, 0x2d, 0x1d, 0x5b, 0xc2, 0x72, 0xc0, 0x8e, 0xb0, 0x95, 0x1d, 0xb9, ++ 0x26, 0x3b, 0x56, 0x30, 0x60, 0x05, 0xe3, 0x58, 0x26, 0x64, 0x4b, 0x99, ++ 0xca, 0xa2, 0x5b, 0xe2, 0x25, 0xa0, 0x5f, 0xbc, 0x0c, 0xec, 0x4c, 0x6d, ++ 0x1a, 0x49, 0x20, 0x62, 0xb7, 0xd4, 0x76, 0x1e, 0xb5, 0x72, 0x76, 0xb6, ++ 0xac, 0x01, 0x61, 0xf0, 0x13, 0x67, 0xe2, 0xc9, 0x92, 0x5d, 0x6f, 0x99, ++ 0xe5, 0x69, 0x3b, 0xf8, 0x99, 0x64, 0x2c, 0xc6, 0x89, 0xef, 0x7e, 0xe7, ++ 0xde, 0x6e, 0x10, 0x14, 0xf6, 0xd4, 0xba, 0xaa, 0xab, 0xe9, 0xee, 0x7b, ++ 0xff, 0xc7, 0x79, 0x7c, 0xe7, 0x3b, 0xe7, 0xfc, 0x57, 0xfe, 0x03, 0x39, ++ 0x59, 0x11, 0x39, 0x89, 0x9b, 0xb9, 0xb2, 0x07, 0xbf, 0x50, 0x3d, 0xe4, ++ 0x7b, 0xe3, 0x55, 0x05, 0x90, 0x31, 0xc6, 0x94, 0x61, 0xf2, 0xcb, 0x33, ++ 0x2e, 0x87, 0xd4, 0xaf, 0x98, 0x7b, 0xba, 0x51, 0x78, 0xa8, 0x18, 0x8e, ++ 0x83, 0xad, 0xca, 0x68, 0x34, 0xb7, 0x3e, 0x15, 0x65, 0x87, 0x9a, 0x95, ++ 0x9f, 0x46, 0x35, 0x14, 0x8e, 0x40, 0x95, 0xde, 0xc0, 0x91, 0xf4, 0xd4, ++ 0x35, 0x3b, 0xd6, 0xe4, 0xc3, 0xe8, 0x2e, 0xa0, 0x60, 0x9f, 0xd1, 0xfc, ++ 0x9d, 0xff, 0xac, 0x70, 0x3d, 0x8c, 0x81, 0x2e, 0x8e, 0x17, 0x3b, 0x78, ++ 0xc1, 0x1c, 0xf2, 0x78, 0xb0, 0x3d, 0x23, 0xf3, 0xed, 0xa8, 0x10, 0x7f, ++ 0xde, 0x9c, 0x09, 0x2a, 0xed, 0x71, 0x1f, 0xda, 0x47, 0x5d, 0xca, 0xbd, ++ 0xe4, 0x40, 0xcd, 0x71, 0x60, 0xab, 0x55, 0x43, 0x76, 0x61, 0x13, 0x79, ++ 0xeb, 0x23, 0xe4, 0xfd, 0xee, 0x86, 0x0d, 0x78, 0x77, 0xba, 0x8d, 0x8d, ++ 0xb5, 0xbc, 0xe6, 0xbc, 0xbe, 0x2a, 0xcb, 0xb9, 0xca, 0x94, 0xc5, 0x4f, ++ 0x0b, 0x1e, 0x5c, 0x26, 0x1e, 0x94, 0x29, 0x41, 0xfe, 0x7b, 0x1a, 0xb9, ++ 0xdd, 0x47, 0x31, 0xb1, 0x8d, 0xd7, 0x18, 0x7f, 0x4c, 0x73, 0x72, 0x11, ++ 0xdc, 0x45, 0xe1, 0x93, 0xa1, 0x6f, 0xc6, 0x4c, 0xb3, 0x24, 0xe4, 0x6f, ++ 0x6d, 0x72, 0x0a, 0xaf, 0xb3, 0x6c, 0xa4, 0xbb, 0x49, 0xf1, 0x77, 0x7d, ++ 0xa2, 0xf8, 0x83, 0x69, 0xf8, 0x3b, 0x46, 0x95, 0x3a, 0x9d, 0xef, 0xde, ++ 0xbb, 0x15, 0xbf, 0x6f, 0xb5, 0x65, 0x33, 0x97, 0x71, 0x9b, 0x65, 0x33, ++ 0xef, 0x52, 0xd7, 0xf2, 0xfe, 0x5a, 0x28, 0x60, 0xbd, 0x9f, 0x0c, 0x69, ++ 0x69, 0x89, 0x2d, 0xe3, 0x8c, 0x2d, 0x75, 0x56, 0x7e, 0xb4, 0x29, 0x21, ++ 0xdc, 0x60, 0xc2, 0xaa, 0x0b, 0x6f, 0xb7, 0x78, 0xc1, 0x04, 0x6d, 0x42, ++ 0xe3, 0x5e, 0x7c, 0x9d, 0x73, 0xc3, 0x1e, 0x9c, 0xcf, 0x58, 0x6b, 0x97, ++ 0x1a, 0x6b, 0x84, 0x7c, 0x48, 0x39, 0x91, 0x96, 0x8f, 0x3f, 0x34, 0x8d, ++ 0x07, 0xc5, 0x5e, 0x22, 0x4a, 0x62, 0x9e, 0x81, 0xfd, 0xf3, 0x0c, 0x93, ++ 0x9c, 0xbb, 0xff, 0x5d, 0x45, 0x3b, 0xe9, 0x76, 0x46, 0xaa, 0xaa, 0xd0, ++ 0x0b, 0xc7, 0xa2, 0xc8, 0x53, 0xe5, 0x7c, 0xbf, 0x10, 0x82, 0xaf, 0x94, ++ 0xb6, 0xf5, 0x4c, 0x63, 0xa0, 0x75, 0x05, 0x02, 0x9d, 0xc7, 0x95, 0x40, ++ 0x6a, 0xbb, 0x12, 0xe8, 0x98, 0xaf, 0xe8, 0xee, 0x57, 0xd3, 0xba, 0xfb, ++ 0xad, 0xf4, 0x7f, 0xac, 0x10, 0x3c, 0xcb, 0x5f, 0xf8, 0xa4, 0xb9, 0xd2, ++ 0x23, 0x7a, 0x5a, 0x3c, 0xc7, 0xf6, 0xd7, 0x1b, 0xed, 0x49, 0x45, 0x69, ++ 0x58, 0xd3, 0x63, 0x68, 0x21, 0xea, 0xba, 0xac, 0xfc, 0x64, 0x9a, 0xa6, ++ 0x05, 0x9f, 0x24, 0xdf, 0x4d, 0xa9, 0xe6, 0x56, 0x2f, 0xe7, 0xef, 0xe1, ++ 0x85, 0xbe, 0x19, 0x9d, 0x60, 0x8c, 0x39, 0xd9, 0xcf, 0xef, 0x7d, 0x96, ++ 0xdc, 0x1b, 0x4a, 0xed, 0xf1, 0x4e, 0x99, 0x11, 0x55, 0xf6, 0xf1, 0x4e, ++ 0x76, 0xbc, 0xc1, 0xe9, 0xf6, 0xf7, 0x9e, 0xe9, 0xb9, 0xd8, 0x55, 0x1b, ++ 0x2f, 0xa1, 0x3c, 0xbe, 0x86, 0xf3, 0x59, 0xfd, 0xdc, 0x47, 0x9d, 0x14, ++ 0x87, 0xcf, 0xe3, 0x71, 0xea, 0x64, 0x6e, 0xf8, 0x0c, 0x4c, 0x72, 0xc6, ++ 0xda, 0x90, 0x7f, 0xfc, 0x31, 0x45, 0x30, 0xae, 0x2e, 0x52, 0xe0, 0xf4, ++ 0x9f, 0x3c, 0x4f, 0x9d, 0x04, 0x9d, 0x22, 0xb7, 0xf3, 0x68, 0xb2, 0x64, ++ 0x7c, 0x06, 0xa1, 0xf4, 0x6f, 0xb3, 0x73, 0x94, 0x29, 0x8f, 0x3c, 0x5d, ++ 0xa6, 0xb4, 0x5a, 0x7a, 0xfe, 0x23, 0xf5, 0x9c, 0xd3, 0xad, 0xe8, 0xfa, ++ 0x63, 0x4b, 0xd7, 0x39, 0xfd, 0x4e, 0x2e, 0xba, 0x51, 0xc7, 0xa2, 0xdb, ++ 0x9c, 0x9e, 0xaf, 0xea, 0x97, 0xba, 0x96, 0x39, 0xfe, 0x98, 0xd5, 0xef, ++ 0xc7, 0xd4, 0xef, 0x3f, 0x55, 0x08, 0xfe, 0x8a, 0xde, 0xcb, 0x88, 0x77, ++ 0x6f, 0x50, 0x8f, 0x47, 0x03, 0x36, 0xf6, 0xdd, 0x2a, 0xbd, 0x07, 0xab, ++ 0xee, 0x9c, 0xdb, 0xa3, 0x8b, 0x5c, 0x5d, 0xc5, 0x0e, 0xe6, 0x56, 0x75, ++ 0x95, 0xf6, 0xfa, 0x16, 0x3c, 0x2d, 0x6b, 0xfa, 0x07, 0x6b, 0x4d, 0xa5, ++ 0xe1, 0xb1, 0xd0, 0x48, 0x4c, 0x72, 0x7a, 0x7f, 0xdb, 0xa8, 0x6d, 0x67, ++ 0xfa, 0x03, 0xc4, 0x8f, 0x01, 0xc5, 0xef, 0xdd, 0x62, 0xcd, 0xfb, 0x0f, ++ 0xa1, 0xf9, 0xd6, 0xbc, 0x63, 0xa1, 0x9a, 0xab, 0x7b, 0x8c, 0x28, 0x9b, ++ 0xa2, 0xe4, 0x61, 0x8a, 0x5d, 0x77, 0x78, 0x82, 0x3e, 0x98, 0xca, 0xab, ++ 0xb6, 0x7c, 0x70, 0x28, 0x5d, 0x8c, 0x81, 0x94, 0xe4, 0x39, 0x63, 0xca, ++ 0xf7, 0xd3, 0x37, 0xc3, 0x08, 0x0f, 0x9e, 0x55, 0x8d, 0x54, 0x01, 0x8a, ++ 0x89, 0xa3, 0x65, 0xe6, 0x61, 0x8f, 0xf8, 0x96, 0x11, 0x2c, 0x80, 0x5f, ++ 0xff, 0xa5, 0xe5, 0x63, 0x0a, 0xc6, 0x53, 0x1e, 0xe6, 0xde, 0x86, 0x97, ++ 0xdf, 0xf5, 0xfc, 0x90, 0xbc, 0xf6, 0xd6, 0x79, 0xc0, 0x99, 0x83, 0x0e, ++ 0x33, 0x42, 0x5f, 0xec, 0x9b, 0xe2, 0x8b, 0x46, 0xa6, 0x8f, 0xef, 0xc2, ++ 0x4d, 0xfd, 0x9d, 0x7b, 0x1d, 0xe2, 0xc7, 0x0a, 0x7d, 0x16, 0x9d, 0xde, ++ 0xb0, 0xcf, 0x5b, 0xcc, 0x78, 0x5b, 0xa4, 0xb9, 0x7c, 0xef, 0x23, 0x70, ++ 0x72, 0xa5, 0xe2, 0x37, 0x9e, 0x76, 0x38, 0xfe, 0x9c, 0x0f, 0x0b, 0x37, ++ 0x30, 0xf7, 0xb0, 0xcf, 0x5b, 0x95, 0x89, 0xca, 0x7a, 0x88, 0x21, 0x2f, ++ 0x8b, 0x4d, 0xdc, 0x64, 0x9d, 0xb2, 0x37, 0x28, 0x2b, 0xa3, 0xff, 0x1e, ++ 0x7d, 0xcc, 0xe3, 0x22, 0x56, 0x3d, 0x8e, 0x79, 0x41, 0x1a, 0xca, 0xea, ++ 0xe8, 0x78, 0xc1, 0x71, 0x3d, 0x8f, 0x36, 0x28, 0xdf, 0x2d, 0xe3, 0x77, ++ 0x6d, 0x7c, 0xe5, 0x7a, 0x53, 0xed, 0xfc, 0x77, 0xc4, 0xba, 0xae, 0x2b, ++ 0x8a, 0xa6, 0x82, 0xd0, 0x15, 0xf3, 0x8c, 0x75, 0x9d, 0x55, 0x93, 0xe3, ++ 0x35, 0xcd, 0xf2, 0x5b, 0x52, 0x6a, 0x86, 0x2b, 0x1a, 0x02, 0xbe, 0x3e, ++ 0x6b, 0x1e, 0x1f, 0x56, 0xa6, 0x7d, 0x58, 0x25, 0x72, 0xb4, 0xfa, 0x8f, ++ 0x57, 0x73, 0x62, 0x72, 0x53, 0x05, 0xf7, 0xf0, 0xba, 0x8d, 0xd6, 0x77, ++ 0x3e, 0x34, 0xa7, 0xaf, 0xe5, 0xfb, 0x2e, 0xde, 0xf7, 0xe2, 0xd5, 0xf8, ++ 0x28, 0xf1, 0x33, 0xa2, 0xec, 0x8a, 0xb6, 0x2a, 0xc9, 0x68, 0x19, 0xe7, ++ 0x72, 0x30, 0xea, 0x99, 0xe4, 0x49, 0x0f, 0x63, 0x85, 0xaa, 0x05, 0x5d, ++ 0x8e, 0x69, 0x58, 0x1d, 0x9c, 0x4e, 0x3f, 0xba, 0x13, 0x6b, 0x82, 0xf9, ++ 0x94, 0x59, 0x9c, 0x91, 0xbe, 0x00, 0x5d, 0xc1, 0xdb, 0x81, 0xe5, 0x85, ++ 0xc4, 0xbb, 0x1e, 0x2b, 0x9f, 0xce, 0x0f, 0x4b, 0xbd, 0xf0, 0x39, 0xc1, ++ 0x77, 0xd8, 0xfd, 0x55, 0xce, 0xf1, 0xa5, 0xb9, 0xfe, 0xc3, 0x14, 0x5c, ++ 0x13, 0x4a, 0xb5, 0x46, 0x3c, 0x1e, 0xcc, 0x43, 0x67, 0xb9, 0xc8, 0x73, ++ 0x2e, 0xb9, 0xf9, 0x27, 0xe6, 0x5a, 0x8f, 0xbd, 0x7e, 0xc1, 0xe8, 0x31, ++ 0xee, 0x0b, 0x05, 0x86, 0xf2, 0x02, 0xb9, 0xf5, 0xc2, 0x0c, 0x39, 0x32, ++ 0x39, 0x49, 0x85, 0x26, 0xf5, 0x04, 0x17, 0x7c, 0x19, 0x37, 0x42, 0xc3, ++ 0x45, 0x58, 0x3c, 0x58, 0x8c, 0x85, 0x83, 0x2a, 0xf4, 0x61, 0x8d, 0xdf, ++ 0x05, 0xf9, 0x1a, 0x53, 0x06, 0xd2, 0x5f, 0x35, 0x77, 0x0d, 0x56, 0xaa, ++ 0xc5, 0xe4, 0x10, 0xbf, 0x35, 0x57, 0x79, 0x4c, 0xd3, 0xbb, 0xd0, 0x27, ++ 0x3d, 0x1d, 0xce, 0xf7, 0xd6, 0x17, 0xbb, 0x13, 0x79, 0xe8, 0xdd, 0xe5, ++ 0xc2, 0x95, 0x45, 0xa7, 0x4c, 0xdf, 0xcc, 0xa9, 0xb5, 0x47, 0xc6, 0xad, ++ 0x6c, 0x1f, 0x24, 0xd8, 0x68, 0xf7, 0x10, 0xba, 0x06, 0xf2, 0xf0, 0x18, ++ 0xaf, 0x3d, 0xab, 0x3b, 0xb2, 0x3a, 0xb6, 0xfa, 0x5c, 0x78, 0x7c, 0x97, ++ 0x8f, 0xf6, 0x69, 0x62, 0x4d, 0xa8, 0x08, 0x4b, 0x2a, 0xed, 0x7d, 0x0c, ++ 0x71, 0x1f, 0x86, 0xcb, 0x50, 0x46, 0x1a, 0xf2, 0x50, 0xc6, 0xf5, 0x97, ++ 0x90, 0x5b, 0xfc, 0x6c, 0xa4, 0x18, 0xa3, 0x07, 0xc7, 0x94, 0x74, 0xda, ++ 0xbe, 0x66, 0xd0, 0xaa, 0x77, 0x18, 0x4a, 0xa6, 0x81, 0x9c, 0x81, 0xfe, ++ 0xf0, 0xe9, 0x08, 0x73, 0x61, 0xc6, 0xa5, 0x4f, 0x0e, 0x15, 0xe1, 0x0f, ++ 0x07, 0x8b, 0xf9, 0x52, 0xf1, 0xf1, 0x21, 0x0d, 0x67, 0x46, 0x9a, 0x95, ++ 0xe7, 0xa3, 0x50, 0x85, 0xeb, 0x7c, 0x32, 0x32, 0xa6, 0x3c, 0xf7, 0x95, ++ 0x7b, 0x1d, 0x31, 0x9f, 0x50, 0x0d, 0xce, 0xf9, 0x77, 0xe6, 0xf7, 0xa7, ++ 0xc8, 0x75, 0xea, 0x5c, 0x15, 0x5a, 0x31, 0x3e, 0x3d, 0x28, 0xf3, 0xc8, ++ 0xf8, 0xcd, 0xca, 0xcf, 0xa3, 0x22, 0xdf, 0x0a, 0xfc, 0xe1, 0x90, 0xc8, ++ 0x31, 0xcf, 0x23, 0x39, 0xdb, 0x8b, 0x89, 0x31, 0xe5, 0x58, 0xf6, 0x9e, ++ 0xdf, 0x50, 0x17, 0xeb, 0xc8, 0x7f, 0x3a, 0x09, 0x2e, 0x15, 0xb4, 0xcb, ++ 0xa7, 0x0e, 0x0b, 0x4f, 0x2c, 0xc2, 0xba, 0x81, 0x62, 0x3c, 0x35, 0xa0, ++ 0xa2, 0xfb, 0x70, 0xb3, 0xf2, 0x26, 0xc7, 0x98, 0x46, 0xee, 0xda, 0x3d, ++ 0x1a, 0xe4, 0x75, 0x63, 0xca, 0xa9, 0x74, 0x24, 0x3b, 0x8e, 0xed, 0xf7, ++ 0xab, 0x39, 0xd6, 0x38, 0xc7, 0x5a, 0xc1, 0x5c, 0x33, 0x3f, 0xdc, 0xb9, ++ 0xe1, 0x25, 0x92, 0x97, 0x07, 0xd3, 0x56, 0x7d, 0xad, 0x49, 0x8c, 0xb8, ++ 0x20, 0xdc, 0xb5, 0xe1, 0x52, 0xd4, 0xe2, 0xd9, 0xca, 0x33, 0x0d, 0x0e, ++ 0xab, 0x16, 0xfb, 0x1a, 0xb9, 0xd6, 0xbd, 0xf4, 0x95, 0xe5, 0x94, 0xc7, ++ 0x32, 0xca, 0xa3, 0x99, 0xf2, 0x68, 0xe3, 0x7a, 0x9f, 0x8d, 0x0a, 0x66, ++ 0xf9, 0x83, 0x11, 0x45, 0xc3, 0xd2, 0x11, 0x19, 0xc3, 0x9a, 0xc7, 0xed, ++ 0x0a, 0xaf, 0xdc, 0xb0, 0x29, 0x7a, 0xa3, 0x5c, 0x04, 0x5f, 0xa4, 0x6e, ++ 0x27, 0xb2, 0x09, 0x12, 0x73, 0xc6, 0x94, 0xd1, 0x11, 0xc1, 0xa8, 0xce, ++ 0x0d, 0xbe, 0x54, 0xce, 0x77, 0x8a, 0xc5, 0x3f, 0x69, 0xcf, 0xcd, 0xca, ++ 0xfe, 0xa8, 0x03, 0x55, 0x9a, 0xfd, 0xfb, 0x5d, 0x29, 0x79, 0xef, 0xda, ++ 0xb0, 0xd0, 0xc2, 0xb4, 0x95, 0x1b, 0x9a, 0xae, 0xee, 0x69, 0x4c, 0x79, ++ 0x47, 0xb8, 0x04, 0xed, 0xf4, 0x04, 0xd7, 0x5a, 0x28, 0xba, 0x4b, 0x53, ++ 0x77, 0x5c, 0xeb, 0x27, 0x43, 0x45, 0x78, 0x2f, 0x55, 0xcc, 0x17, 0x65, ++ 0x3b, 0x44, 0xdd, 0xa5, 0x9b, 0x95, 0x93, 0x96, 0x7c, 0x83, 0x78, 0x97, ++ 0x73, 0x1f, 0xbd, 0x3a, 0x86, 0xdd, 0x57, 0xb6, 0x7b, 0xca, 0x39, 0xff, ++ 0xe5, 0xe7, 0x84, 0xec, 0xcd, 0x50, 0x22, 0x57, 0xfb, 0xc2, 0x52, 0x8b, ++ 0x95, 0x33, 0x0b, 0x56, 0xdd, 0xc6, 0x2b, 0xd8, 0xd0, 0x27, 0xf6, 0xa7, ++ 0xde, 0xed, 0x63, 0x3e, 0xe2, 0x5d, 0x85, 0xcf, 0x4d, 0xc3, 0x13, 0xa1, ++ 0x47, 0xd9, 0x67, 0x01, 0x3a, 0x19, 0xd7, 0xc6, 0xb3, 0x35, 0x9b, 0x01, ++ 0x72, 0x84, 0x97, 0xc8, 0xfd, 0x69, 0x42, 0xe8, 0x4b, 0x7f, 0x6e, 0x8e, ++ 0x7b, 0xc8, 0x3b, 0xb4, 0xab, 0xb5, 0x5e, 0x89, 0x8b, 0xe6, 0x20, 0x7f, ++ 0xdb, 0x92, 0x46, 0xf6, 0x3f, 0xd3, 0x74, 0x30, 0x4f, 0x78, 0x54, 0xfb, ++ 0x57, 0x73, 0xc5, 0x75, 0xd7, 0x7e, 0x79, 0x0f, 0x7d, 0x63, 0x43, 0x00, ++ 0xab, 0x92, 0x5c, 0xb3, 0xc3, 0x87, 0x81, 0x06, 0xbb, 0xb6, 0xbe, 0x22, ++ 0xe5, 0x9f, 0xd2, 0xe3, 0xfe, 0xaf, 0x25, 0xd9, 0xfe, 0x37, 0xed, 0x60, ++ 0x92, 0xe3, 0x58, 0x36, 0xc0, 0x1c, 0xc9, 0x44, 0x94, 0x3c, 0x6e, 0x84, ++ 0xaf, 0x37, 0x74, 0x18, 0xc5, 0xb4, 0x91, 0x95, 0x31, 0xf1, 0x19, 0x7b, ++ 0x25, 0x3f, 0x4d, 0x04, 0x95, 0xae, 0x18, 0xf0, 0x4c, 0x02, 0x18, 0xe6, ++ 0x6b, 0x28, 0x21, 0x7d, 0x08, 0xe1, 0x6e, 0x45, 0xd8, 0x9c, 0x62, 0x74, ++ 0x4e, 0x20, 0x72, 0xa0, 0x51, 0xea, 0x82, 0xc5, 0x9c, 0x0f, 0x18, 0xe3, ++ 0x35, 0x69, 0xbe, 0x0e, 0xf3, 0x95, 0xa1, 0x2f, 0x70, 0x3e, 0x04, 0xe9, ++ 0x4f, 0x91, 0x11, 0x12, 0xf0, 0x91, 0x20, 0xc6, 0xa9, 0x9b, 0x2b, 0x43, ++ 0xe4, 0x08, 0xc3, 0x15, 0xf8, 0xf0, 0x90, 0x7d, 0x96, 0x63, 0xd5, 0x88, ++ 0xf4, 0x86, 0x65, 0x6f, 0xd2, 0xcb, 0x17, 0x5d, 0x14, 0x62, 0x38, 0x59, ++ 0x61, 0xf5, 0xf3, 0xcf, 0xe9, 0x1c, 0x57, 0x95, 0x7e, 0x73, 0x1b, 0x8e, ++ 0x44, 0x6b, 0x7c, 0xfd, 0x94, 0x97, 0xe1, 0x12, 0xfd, 0x34, 0xe0, 0x99, ++ 0x68, 0xae, 0x97, 0x58, 0xd3, 0xfa, 0x0a, 0xf2, 0xe0, 0xcb, 0xab, 0xa0, ++ 0xff, 0xcb, 0x6f, 0x39, 0xdc, 0x96, 0xfd, 0x5e, 0xce, 0xf6, 0xce, 0x6f, ++ 0xfc, 0x5e, 0xea, 0x96, 0xf5, 0xc4, 0x64, 0x7f, 0x7f, 0x0a, 0xba, 0x85, ++ 0xc5, 0x87, 0x6a, 0xfd, 0x49, 0x03, 0x52, 0x9f, 0x0e, 0x52, 0xbe, 0x0d, ++ 0x96, 0x9c, 0x53, 0x56, 0x3f, 0xc5, 0x6f, 0x00, 0x29, 0x62, 0x8d, 0xdd, ++ 0x1f, 0x5b, 0xdd, 0xe0, 0xc6, 0x89, 0xa4, 0x1b, 0x17, 0xf4, 0xa7, 0x90, ++ 0xb2, 0x7c, 0xbb, 0x1c, 0x4f, 0x70, 0xbd, 0x4f, 0x26, 0xdb, 0xf1, 0x32, ++ 0xf9, 0xf1, 0xb3, 0x21, 0x13, 0x8c, 0xcd, 0x9d, 0x6f, 0x2a, 0x46, 0x5b, ++ 0x09, 0xfd, 0x63, 0x8d, 0x52, 0x17, 0xf9, 0x29, 0xd6, 0xf1, 0x32, 0x7f, ++ 0xd3, 0x38, 0xbe, 0x83, 0x77, 0xf6, 0xb4, 0xe3, 0x77, 0xb4, 0x89, 0x8f, ++ 0x17, 0xd5, 0x8c, 0x07, 0x9c, 0x75, 0xba, 0xd7, 0x31, 0x94, 0xb5, 0x95, ++ 0xef, 0xe0, 0x2c, 0xf3, 0xba, 0x66, 0x5d, 0xa5, 0x5c, 0x5d, 0x58, 0xa5, ++ 0x3b, 0x69, 0x1b, 0x5e, 0x47, 0x5f, 0x7d, 0x35, 0x65, 0x5f, 0xa7, 0x6e, ++ 0xe5, 0x1e, 0x23, 0xed, 0xd4, 0x75, 0xbd, 0x0b, 0x5d, 0xfa, 0x5e, 0xa0, ++ 0xd2, 0xeb, 0x70, 0x69, 0xf2, 0xd9, 0x21, 0xf5, 0x40, 0xda, 0x82, 0x41, ++ 0x0e, 0x7e, 0xad, 0x67, 0x23, 0x67, 0x23, 0x26, 0x1a, 0x24, 0xaf, 0x2c, ++ 0x41, 0x82, 0x72, 0x8f, 0x27, 0x7b, 0xf1, 0x7a, 0xc8, 0x8d, 0x18, 0x03, ++ 0x56, 0x7d, 0x5c, 0xce, 0x17, 0xe8, 0xd8, 0x91, 0xfe, 0x0e, 0x92, 0x43, ++ 0xcc, 0xef, 0xb9, 0x9f, 0xfb, 0x88, 0x9b, 0xbe, 0x72, 0xb7, 0xe1, 0xa5, ++ 0xfd, 0xbf, 0x90, 0x80, 0xd2, 0xb4, 0xe8, 0x87, 0xcc, 0xd1, 0x3d, 0x56, ++ 0xbf, 0xa8, 0x2f, 0x5a, 0x33, 0xb9, 0x82, 0x36, 0x7f, 0xae, 0xa0, 0x03, ++ 0x1b, 0xd3, 0x72, 0x8d, 0x81, 0xfc, 0x3b, 0xc3, 0x78, 0x83, 0x71, 0x6b, ++ 0xc1, 0xd3, 0x11, 0xa1, 0xa8, 0x4a, 0xc1, 0x9d, 0xd2, 0x1b, 0xf4, 0xe1, ++ 0xf5, 0x74, 0x18, 0xaf, 0x46, 0xfd, 0x6d, 0x6b, 0x95, 0x6a, 0xbc, 0x42, ++ 0x7f, 0xbc, 0x8d, 0x7c, 0xfb, 0x3d, 0xce, 0x5f, 0x13, 0x77, 0xe1, 0x5c, ++ 0xda, 0xc6, 0x48, 0xd7, 0xc2, 0x10, 0x8c, 0x76, 0x1f, 0x0e, 0xef, 0x7e, ++ 0x80, 0xdc, 0xe1, 0x01, 0x1c, 0x4f, 0xbe, 0x63, 0x4a, 0xff, 0xab, 0x38, ++ 0x4c, 0xb9, 0x12, 0x0f, 0xde, 0xa1, 0x26, 0x56, 0x36, 0xb6, 0x31, 0xe6, ++ 0x69, 0x27, 0xcf, 0x3a, 0xdd, 0xf8, 0x1d, 0xbf, 0xab, 0x8f, 0x37, 0x21, ++ 0x9a, 0xf6, 0x60, 0x4d, 0x4c, 0xc7, 0xc6, 0xa8, 0xbf, 0xf5, 0x1e, 0xa5, ++ 0x41, 0x6a, 0x3a, 0x48, 0x26, 0x4d, 0xb8, 0x17, 0xd6, 0x81, 0x59, 0xbf, ++ 0xf2, 0xc8, 0xbc, 0x89, 0xec, 0xfe, 0x9b, 0xa6, 0xf4, 0x99, 0x25, 0xff, ++ 0xa3, 0x3e, 0x13, 0xd2, 0x4b, 0xa2, 0xce, 0x13, 0xd4, 0xef, 0x55, 0x5b, ++ 0x90, 0x7a, 0x5c, 0x4e, 0x7f, 0x4e, 0xca, 0xcf, 0xd6, 0xa1, 0xad, 0x3f, ++ 0xd1, 0xe5, 0x54, 0x1d, 0x72, 0xa2, 0x4a, 0x5b, 0x87, 0x47, 0xf7, 0x7c, ++ 0xbb, 0x12, 0x45, 0xa2, 0x2b, 0xbb, 0x5f, 0xbf, 0xb2, 0xd1, 0x8d, 0x8b, ++ 0xd6, 0x1a, 0x65, 0xcd, 0x5f, 0xb5, 0xce, 0xff, 0x69, 0x16, 0x54, 0xca, ++ 0x3a, 0x0d, 0x33, 0x5f, 0xd3, 0xd4, 0x8b, 0x4e, 0xc1, 0xda, 0x20, 0x06, ++ 0x28, 0x9f, 0x05, 0xf1, 0x5e, 0x4c, 0x2e, 0x2a, 0x31, 0xaa, 0xc2, 0xfe, ++ 0xae, 0x2a, 0xe7, 0x9b, 0xc8, 0x30, 0x06, 0xdd, 0x11, 0x0f, 0x22, 0x96, ++ 0x19, 0xe2, 0x5c, 0x6f, 0x61, 0x74, 0x44, 0x64, 0x68, 0xfb, 0x7b, 0x5f, ++ 0x43, 0x3b, 0xee, 0x49, 0xcb, 0x3e, 0xff, 0x37, 0xf7, 0xa7, 0x23, 0x92, ++ 0x96, 0xfd, 0xc6, 0xe8, 0x9b, 0xb2, 0xdf, 0x8a, 0x7f, 0x63, 0xbf, 0x1d, ++ 0x30, 0x38, 0xdf, 0xd6, 0xe4, 0x67, 0x92, 0x0f, 0x04, 0xdf, 0xa5, 0x4f, ++ 0x6d, 0x4e, 0x6d, 0xa8, 0x94, 0x3e, 0x9c, 0x37, 0xdc, 0xc9, 0xf7, 0x6a, ++ 0xfa, 0x79, 0x3b, 0xce, 0x46, 0x65, 0x8f, 0x35, 0xbe, 0x16, 0xe4, 0x30, ++ 0xb2, 0x14, 0x87, 0x93, 0x2a, 0x4e, 0xe8, 0x25, 0x52, 0x97, 0x8e, 0x08, ++ 0xf6, 0x08, 0x1f, 0x68, 0x8e, 0xba, 0x31, 0xc8, 0xd7, 0x4a, 0xf2, 0x7d, ++ 0xa9, 0xed, 0x1f, 0xd7, 0xab, 0x69, 0xb7, 0x37, 0xfa, 0x9b, 0xfc, 0xa6, ++ 0xd2, 0xbe, 0x2a, 0xf0, 0xaa, 0x2e, 0xfc, 0x4a, 0x7e, 0x97, 0x73, 0x36, ++ 0x6e, 0x0c, 0x33, 0xff, 0xcc, 0x8f, 0xfd, 0xc9, 0xbc, 0xe8, 0x91, 0xeb, ++ 0x6f, 0xdc, 0xc7, 0x8d, 0xe3, 0xc8, 0x79, 0x92, 0xf7, 0xcc, 0x35, 0x95, ++ 0x59, 0x8c, 0x56, 0xee, 0xa8, 0xb4, 0x71, 0x4d, 0xf0, 0x7a, 0x56, 0x69, ++ 0x16, 0xe3, 0xc8, 0x95, 0x4f, 0x77, 0x10, 0x6f, 0x19, 0x8b, 0xf6, 0xff, ++ 0xa7, 0x4d, 0x9a, 0xd4, 0x4b, 0xcf, 0x74, 0xdc, 0xcd, 0x5c, 0xd6, 0x69, ++ 0xc5, 0x94, 0xee, 0x0d, 0x76, 0x9e, 0xb5, 0x7e, 0x83, 0x66, 0xbd, 0xf7, ++ 0x6c, 0xb8, 0xd5, 0x7a, 0xff, 0xf1, 0x86, 0x9a, 0xd4, 0x35, 0x5c, 0xb6, ++ 0xb9, 0xa1, 0x75, 0x56, 0x0d, 0xfd, 0xba, 0xa1, 0xdc, 0xdb, 0x20, 0xb1, ++ 0x29, 0x17, 0x8f, 0xe5, 0x9a, 0xa0, 0x72, 0x3c, 0x6a, 0x98, 0x5e, 0xad, ++ 0x88, 0x71, 0x0d, 0x4a, 0x46, 0xd3, 0xba, 0x27, 0x95, 0x5e, 0x5c, 0x0e, ++ 0x69, 0x78, 0x83, 0xba, 0x91, 0x73, 0x63, 0x17, 0xd2, 0xff, 0x0b, 0x3b, ++ 0x98, 0x86, 0x17, 0x36, 0xca, 0xf9, 0x2b, 0xd3, 0x5c, 0x13, 0x72, 0xe1, ++ 0xfd, 0xb4, 0xbd, 0x9f, 0xf7, 0x86, 0x8a, 0xf1, 0x6e, 0x4a, 0x62, 0x13, ++ 0xd4, 0x02, 0x8e, 0x7b, 0x22, 0x1d, 0x64, 0x3e, 0x2a, 0xf3, 0x76, 0x30, ++ 0x67, 0x75, 0xe1, 0x40, 0x94, 0xba, 0x4f, 0xbc, 0x68, 0x16, 0x6a, 0x82, ++ 0x13, 0x2e, 0xec, 0x4f, 0x4f, 0x20, 0xb3, 0xf3, 0x23, 0xd3, 0xa9, 0xf5, ++ 0xd2, 0x3e, 0x27, 0xc8, 0x61, 0x7c, 0x88, 0x46, 0x1b, 0xb0, 0x63, 0x77, ++ 0x10, 0x5b, 0x12, 0x0e, 0x6c, 0x6f, 0x5c, 0x86, 0x1d, 0x99, 0x56, 0x18, ++ 0xc3, 0x3e, 0x6c, 0x27, 0xb9, 0x19, 0x1f, 0x9a, 0xc0, 0xc9, 0xa4, 0xd6, ++ 0x54, 0xa8, 0x4c, 0xe0, 0x44, 0x8a, 0x63, 0x27, 0xde, 0xa6, 0xde, 0x27, ++ 0xb0, 0x39, 0xa9, 0xa9, 0x83, 0xd6, 0xfe, 0x26, 0xd0, 0x97, 0xba, 0x59, ++ 0xef, 0xa7, 0x03, 0xdb, 0x12, 0x1b, 0x3b, 0xed, 0xfe, 0x0f, 0x63, 0x00, ++ 0xf3, 0xcc, 0x7e, 0xea, 0xe8, 0x48, 0x3a, 0xd7, 0x0b, 0x12, 0xbc, 0xb7, ++ 0xb1, 0x7b, 0x73, 0xba, 0x01, 0xfd, 0xbb, 0x97, 0xf1, 0xfa, 0x20, 0xfa, ++ 0x12, 0xd2, 0xef, 0xaf, 0xe1, 0x7c, 0x26, 0xde, 0xd3, 0xfd, 0xde, 0x5b, ++ 0x25, 0x2f, 0xd7, 0x7b, 0xd0, 0xc5, 0x71, 0x84, 0x5f, 0x68, 0x8a, 0xbf, ++ 0xc9, 0x80, 0x13, 0xe7, 0x89, 0x6b, 0x86, 0xc7, 0x89, 0x67, 0xf4, 0x52, ++ 0x72, 0x51, 0x27, 0xea, 0x42, 0x85, 0xb4, 0x17, 0xbf, 0x85, 0x80, 0x1f, ++ 0x24, 0x15, 0x3c, 0x40, 0xdc, 0x3f, 0x1a, 0xaa, 0xeb, 0x6c, 0x11, 0x66, ++ 0x77, 0x50, 0xc1, 0x25, 0xed, 0x8a, 0x69, 0x54, 0x2a, 0xd6, 0x99, 0x34, ++ 0x5b, 0x37, 0x7f, 0x30, 0x3b, 0xad, 0xbc, 0xe8, 0x73, 0x33, 0x77, 0xdf, ++ 0x24, 0xd7, 0xf7, 0x30, 0xef, 0xbb, 0x75, 0x51, 0x5d, 0x8f, 0xdc, 0xe7, ++ 0x65, 0xcc, 0x91, 0xfb, 0xa4, 0x9f, 0x74, 0xed, 0xbe, 0x06, 0x6c, 0xde, ++ 0xdd, 0x6c, 0xad, 0x77, 0x6b, 0x02, 0x0b, 0x5d, 0xcc, 0x7b, 0x9d, 0xa1, ++ 0x3a, 0xf5, 0x02, 0xd0, 0x3b, 0xa1, 0x4f, 0x63, 0x2c, 0x0f, 0x04, 0x57, ++ 0x42, 0xe4, 0x24, 0xf5, 0xb3, 0xb7, 0xb1, 0x3d, 0x3a, 0x84, 0xf9, 0x23, ++ 0x12, 0x2f, 0x03, 0x1d, 0x83, 0xc4, 0xff, 0xc7, 0xd3, 0x29, 0xac, 0x15, ++ 0x3e, 0x69, 0x9d, 0x51, 0x4c, 0xe3, 0x89, 0xe8, 0xdb, 0x88, 0x59, 0x39, ++ 0xc4, 0x11, 0xac, 0x88, 0x8e, 0xcd, 0x40, 0x91, 0xdc, 0xdb, 0xc2, 0xf1, ++ 0x45, 0xa6, 0xfe, 0x36, 0x03, 0x5f, 0x70, 0xfc, 0x16, 0x6c, 0x1c, 0x34, ++ 0xcd, 0x67, 0x19, 0x5f, 0x5f, 0x23, 0x7f, 0xb8, 0x44, 0x3b, 0x6a, 0x6d, ++ 0x90, 0xf1, 0xc7, 0x14, 0xcd, 0x8a, 0xb3, 0x1d, 0xd4, 0xf1, 0x0c, 0x78, ++ 0x29, 0xe7, 0xd2, 0x11, 0x4d, 0xb9, 0x35, 0x26, 0x3a, 0x77, 0xc1, 0x31, ++ 0xe2, 0xc3, 0xc3, 0x31, 0x37, 0x0a, 0x0e, 0xfd, 0x42, 0x91, 0x58, 0x5b, ++ 0x45, 0xde, 0xe5, 0x3d, 0xe8, 0x53, 0x16, 0xec, 0x75, 0xe3, 0x81, 0x18, ++ 0xf9, 0x58, 0xac, 0x15, 0x1b, 0xf7, 0x69, 0xbc, 0xc6, 0xaf, 0x9f, 0x52, ++ 0xfc, 0xc1, 0x13, 0xa8, 0xf1, 0x0d, 0x92, 0x37, 0x78, 0x89, 0xf5, 0xae, ++ 0x43, 0x65, 0x28, 0x26, 0xa7, 0x74, 0x1c, 0xaa, 0x40, 0xc9, 0x21, 0x2f, ++ 0xaa, 0x18, 0x7b, 0xbd, 0x23, 0xa7, 0x91, 0xd9, 0x0b, 0xb5, 0x38, 0xfc, ++ 0x99, 0x59, 0xa0, 0x49, 0xee, 0x18, 0x44, 0xd9, 0xc8, 0x7a, 0xa4, 0x63, ++ 0xf5, 0x28, 0x21, 0x97, 0xad, 0xe3, 0x7c, 0x4b, 0x62, 0x1a, 0xc7, 0xb1, ++ 0x73, 0x96, 0x16, 0xc6, 0xea, 0xfe, 0x84, 0xbf, 0x43, 0xfa, 0xb9, 0x97, ++ 0xf4, 0x97, 0x50, 0xb8, 0xf3, 0xda, 0x99, 0x4d, 0x2d, 0x64, 0x9d, 0x4b, ++ 0x6c, 0x7b, 0x0c, 0xf6, 0xf9, 0xcd, 0x7b, 0xb3, 0xfb, 0xa9, 0x97, 0xfd, ++ 0xe4, 0x31, 0x56, 0x24, 0x66, 0x32, 0xe6, 0x00, 0x67, 0x69, 0x37, 0x77, ++ 0x71, 0xad, 0x57, 0xc8, 0x93, 0x7b, 0xb8, 0x97, 0xf7, 0x87, 0x7e, 0xa1, ++ 0x54, 0x71, 0x2f, 0x93, 0xe4, 0x65, 0x1f, 0xa5, 0x7c, 0x4a, 0x0d, 0xf7, ++ 0xf2, 0x7d, 0xfe, 0xfe, 0x04, 0xf7, 0xb2, 0x69, 0x9f, 0xbf, 0xed, 0x18, ++ 0x73, 0xd8, 0xfb, 0x95, 0x1a, 0x75, 0x93, 0x52, 0x82, 0xb3, 0x43, 0x65, ++ 0xb8, 0x40, 0x9e, 0x70, 0x65, 0xa8, 0x02, 0x17, 0x87, 0x3c, 0xf4, 0x11, ++ 0x8d, 0x63, 0x98, 0x66, 0xa9, 0xe6, 0xc5, 0x64, 0x7a, 0x2d, 0xa6, 0xc5, ++ 0xaa, 0xf1, 0x51, 0xba, 0x0b, 0x65, 0x31, 0xe1, 0xbb, 0x3e, 0x7c, 0xc8, ++ 0xdf, 0x3f, 0x48, 0x8f, 0xa2, 0x68, 0xef, 0x67, 0xbc, 0xc6, 0x34, 0x97, ++ 0x70, 0x7f, 0x17, 0xd3, 0xdd, 0x28, 0xd9, 0xbb, 0x0e, 0xae, 0xbd, 0x66, ++ 0xef, 0xc6, 0x10, 0x5e, 0x71, 0x72, 0x2f, 0x7d, 0xba, 0x7f, 0xfc, 0x56, ++ 0x67, 0x3d, 0xc7, 0x18, 0x53, 0x16, 0x8c, 0xac, 0x43, 0xd9, 0x5e, 0x1f, ++ 0x71, 0xda, 0xaf, 0x8f, 0x42, 0x0b, 0xde, 0xaf, 0xac, 0x43, 0xfe, 0x21, ++ 0x7b, 0xff, 0xab, 0x46, 0x6c, 0xbf, 0x58, 0xd2, 0x30, 0x95, 0xb7, 0x7b, ++ 0x2d, 0x8e, 0x39, 0xc1, 0x7c, 0xf9, 0xe5, 0x94, 0xc8, 0x07, 0xaa, 0x2b, ++ 0x3c, 0x8a, 0x82, 0xbd, 0xc4, 0xc4, 0x21, 0xdd, 0xe2, 0x36, 0xe2, 0x13, ++ 0x43, 0xe9, 0x9b, 0xf9, 0x94, 0x8e, 0xed, 0x89, 0x2a, 0xfa, 0x53, 0x35, ++ 0xee, 0xdb, 0x2b, 0x3d, 0xfc, 0xf1, 0xbb, 0xdc, 0xb4, 0xa2, 0xe1, 0xf4, ++ 0x8d, 0xfe, 0xd4, 0x44, 0xdb, 0x14, 0x6c, 0x35, 0x31, 0xa1, 0xdb, 0x78, ++ 0x73, 0xd4, 0x3a, 0x23, 0x20, 0x3e, 0xd9, 0x8e, 0x8d, 0xbb, 0xd1, 0x79, ++ 0xa0, 0x41, 0x7c, 0x32, 0x0f, 0x83, 0xe4, 0xb6, 0x67, 0xc9, 0x93, 0xa7, ++ 0x69, 0x9f, 0x11, 0x13, 0xf2, 0x31, 0xc0, 0x38, 0xfe, 0xc2, 0x90, 0x0f, ++ 0xde, 0x58, 0x11, 0xc6, 0x28, 0xe3, 0x0c, 0xf9, 0xd8, 0x87, 0xcc, 0x28, ++ 0x47, 0x19, 0x83, 0x3f, 0x88, 0x7a, 0x30, 0x92, 0xae, 0xc6, 0xe5, 0xa8, ++ 0x86, 0x34, 0xf5, 0xf1, 0x7b, 0x62, 0xcb, 0xb3, 0xe9, 0x7a, 0xbc, 0x1f, ++ 0x15, 0xec, 0xa9, 0xc7, 0x33, 0x94, 0x5f, 0x61, 0xcc, 0xcb, 0x71, 0x05, ++ 0x87, 0x7c, 0xc8, 0x8b, 0x69, 0xbe, 0xc1, 0xac, 0x2d, 0xb8, 0x46, 0xda, ++ 0xe9, 0x37, 0x72, 0x7e, 0x45, 0xe2, 0x80, 0x4b, 0x1f, 0x64, 0x7e, 0x39, ++ 0x50, 0x9f, 0x3b, 0x8b, 0xe9, 0xf7, 0x8e, 0x63, 0x3a, 0x7d, 0xe7, 0x0b, ++ 0x53, 0xd5, 0x24, 0x7f, 0x48, 0x86, 0x2e, 0x45, 0x19, 0xd7, 0x20, 0x3d, ++ 0x15, 0x43, 0xc9, 0x6b, 0x24, 0x67, 0xf1, 0x6c, 0xe2, 0xbe, 0x83, 0x5c, ++ 0xbf, 0xd4, 0x19, 0x4d, 0x5e, 0x77, 0x19, 0xf3, 0x0f, 0xb6, 0xcf, 0xb4, ++ 0x79, 0x19, 0xfd, 0xf7, 0x2a, 0x47, 0xcd, 0x61, 0xbc, 0xe4, 0x26, 0x7b, ++ 0x42, 0x2f, 0x45, 0xb7, 0xcc, 0xe4, 0x0d, 0xea, 0x31, 0xf2, 0xb3, 0xad, ++ 0x89, 0x33, 0x9c, 0x3b, 0x57, 0x53, 0x96, 0xb9, 0xab, 0x39, 0xb7, 0x89, ++ 0x37, 0x89, 0x21, 0x17, 0x93, 0xc2, 0xe1, 0x84, 0xbb, 0xf5, 0x32, 0xf6, ++ 0x94, 0x92, 0x3f, 0x04, 0xb1, 0x99, 0xb9, 0x47, 0x4d, 0x7c, 0x9c, 0xdc, ++ 0xfb, 0x0e, 0xf2, 0xc7, 0x32, 0x0e, 0xf3, 0x23, 0xce, 0xd7, 0x8e, 0xed, ++ 0xf4, 0xc5, 0x42, 0xed, 0x56, 0xdc, 0x47, 0xce, 0x2d, 0x75, 0x51, 0x3c, ++ 0x28, 0x71, 0x03, 0x98, 0x17, 0x57, 0x51, 0x12, 0xd6, 0x3a, 0x5e, 0xc3, ++ 0x5d, 0xe8, 0xac, 0x74, 0xa3, 0x2c, 0xac, 0x75, 0xbd, 0x81, 0xc5, 0x48, ++ 0x7d, 0x5b, 0x62, 0xac, 0x03, 0xde, 0xb0, 0x66, 0x9c, 0xc6, 0x5c, 0xa0, ++ 0x82, 0x7b, 0x08, 0xcb, 0x7a, 0x3c, 0x94, 0xbd, 0x8a, 0x73, 0x94, 0xeb, ++ 0x05, 0x72, 0xa3, 0x7b, 0x50, 0x77, 0xf2, 0x82, 0x93, 0x1c, 0x74, 0xba, ++ 0x5c, 0x5f, 0x0f, 0x8d, 0xe3, 0x7d, 0x12, 0x0d, 0x61, 0xa7, 0x2a, 0x9f, ++ 0x2b, 0xac, 0x1a, 0x43, 0xdf, 0xa0, 0xac, 0xc1, 0x34, 0x2b, 0x88, 0x87, ++ 0x0f, 0x5a, 0xf3, 0xcb, 0xdc, 0xdc, 0xc7, 0x75, 0x79, 0x92, 0x9f, 0x59, ++ 0xa3, 0x2d, 0xf7, 0xff, 0x51, 0x3b, 0x81, 0x23, 0x49, 0xca, 0xbf, 0x31, ++ 0x43, 0x39, 0x4c, 0x60, 0x28, 0x25, 0x67, 0x0f, 0xa4, 0x9f, 0x4a, 0xde, ++ 0xc6, 0xd8, 0x1e, 0xe3, 0xf5, 0xe9, 0x58, 0x31, 0x8c, 0x4a, 0x7b, 0xce, ++ 0x3b, 0xe2, 0x97, 0xcd, 0xf1, 0xe5, 0x56, 0x4e, 0xc6, 0xcf, 0xaf, 0xf0, ++ 0x9e, 0x99, 0x72, 0x9c, 0x16, 0xab, 0x63, 0x17, 0xcd, 0xf1, 0xb6, 0xa9, ++ 0xdf, 0x97, 0x67, 0xcf, 0xc3, 0x55, 0xf2, 0xdd, 0x96, 0x4b, 0x1f, 0xe5, ++ 0x32, 0x4d, 0x7b, 0xdb, 0xfc, 0x96, 0xb5, 0xae, 0x17, 0x66, 0x4a, 0x3d, ++ 0x65, 0x5e, 0xfc, 0xe3, 0x99, 0xd2, 0x47, 0x71, 0x30, 0x77, 0x71, 0x87, ++ 0xb5, 0xa6, 0x93, 0x78, 0xcb, 0x3c, 0x73, 0xdd, 0x38, 0xd3, 0xf9, 0x9b, ++ 0xc4, 0x9e, 0x33, 0xd9, 0xfa, 0x86, 0x37, 0x9b, 0x9b, 0x4c, 0xe0, 0x58, ++ 0x52, 0xb0, 0xdf, 0x87, 0x15, 0x52, 0x87, 0x51, 0xfd, 0xfd, 0x06, 0xc6, ++ 0xc9, 0x09, 0xdf, 0xa1, 0xec, 0x15, 0xac, 0x09, 0x8c, 0x93, 0x17, 0x4e, ++ 0x8d, 0x4d, 0x11, 0xe1, 0xd1, 0x46, 0x49, 0x58, 0xf0, 0x73, 0x82, 0xbc, ++ 0xe4, 0x45, 0xe2, 0xd8, 0x47, 0xe4, 0x47, 0xbd, 0xe4, 0xff, 0x13, 0xd8, ++ 0x98, 0x6a, 0xc5, 0x4f, 0xf6, 0x2d, 0x23, 0xae, 0x08, 0x36, 0xd6, 0x90, ++ 0x0f, 0xb6, 0xe2, 0xc0, 0x70, 0x1a, 0xa9, 0x43, 0x12, 0x0f, 0x25, 0xe6, ++ 0x4a, 0x2c, 0x0c, 0x22, 0x9a, 0x38, 0x01, 0x83, 0xef, 0xdb, 0x13, 0xeb, ++ 0x10, 0x39, 0xf4, 0x36, 0x73, 0x8e, 0x09, 0xb4, 0xec, 0xd4, 0x3a, 0x0e, ++ 0x63, 0x02, 0x4b, 0x0f, 0x6a, 0x48, 0x26, 0x96, 0x71, 0xfc, 0x56, 0x6c, ++ 0xd9, 0xe7, 0xb7, 0x6a, 0x2b, 0xe3, 0x34, 0xd8, 0xcd, 0x99, 0x66, 0x18, ++ 0x83, 0xd2, 0x7b, 0x12, 0xee, 0xe6, 0x53, 0x3e, 0xd8, 0xe3, 0x42, 0x5d, ++ 0x5c, 0xea, 0xf0, 0x7e, 0x63, 0xa9, 0x52, 0xe3, 0xcb, 0x77, 0x98, 0xe6, ++ 0x16, 0xc6, 0x86, 0x93, 0xba, 0x82, 0xc2, 0xbb, 0x14, 0x84, 0x18, 0xab, ++ 0x7c, 0x33, 0x18, 0x43, 0x06, 0x1b, 0xb0, 0x65, 0x37, 0xf7, 0x7b, 0x55, ++ 0x6f, 0xa2, 0xaf, 0x36, 0x8e, 0x27, 0xba, 0x5b, 0x86, 0x2d, 0x99, 0x9a, ++ 0xee, 0x93, 0xf0, 0x5a, 0x79, 0xca, 0x96, 0xdd, 0x57, 0x73, 0xe0, 0x92, ++ 0x8f, 0x1a, 0xfc, 0xc1, 0x69, 0x8a, 0x5c, 0xbb, 0x89, 0x98, 0x35, 0xf5, ++ 0x7a, 0x43, 0x49, 0x36, 0xca, 0xd9, 0x44, 0xf1, 0x8b, 0x3e, 0xcb, 0x5f, ++ 0x44, 0x16, 0x5b, 0x92, 0x11, 0xda, 0xf4, 0xaf, 0xcc, 0x54, 0x5b, 0x3b, ++ 0xd7, 0xd9, 0x24, 0x67, 0x3e, 0x2c, 0x4c, 0x78, 0xdd, 0xaa, 0xdf, 0x09, ++ 0x26, 0xf4, 0x75, 0x4a, 0xbf, 0xa8, 0x80, 0xb8, 0x54, 0x38, 0xea, 0x86, ++ 0xfb, 0x70, 0x31, 0x0a, 0x06, 0x84, 0x8f, 0x49, 0xbe, 0xad, 0xc2, 0x39, ++ 0x5a, 0x42, 0x1f, 0xa0, 0x0e, 0x47, 0xe9, 0x63, 0x51, 0x2f, 0xe6, 0x8e, ++ 0x7a, 0xf1, 0x02, 0x31, 0xa0, 0x6a, 0x54, 0xc3, 0x18, 0x31, 0xc0, 0x3b, ++ 0x1a, 0x44, 0x26, 0x5a, 0x8f, 0x69, 0xa3, 0x63, 0xca, 0x1b, 0x69, 0x8f, ++ 0x17, 0x45, 0x32, 0x8f, 0xc8, 0x30, 0xa7, 0x53, 0xd1, 0xe7, 0x32, 0x62, ++ 0x9d, 0xe8, 0xb6, 0x1e, 0xdb, 0x76, 0xa7, 0x71, 0xf7, 0x5e, 0x13, 0xbf, ++ 0xd6, 0xe5, 0xfc, 0xbc, 0xe4, 0x1c, 0x26, 0xd2, 0x8c, 0x6b, 0xf7, 0xea, ++ 0xfe, 0x0e, 0x39, 0x8f, 0xd0, 0xe9, 0x31, 0x91, 0x1f, 0xf2, 0xeb, 0x44, ++ 0xf7, 0x8e, 0x42, 0x45, 0x62, 0x54, 0x9d, 0xaf, 0x0b, 0xb3, 0xb3, 0x67, ++ 0xe3, 0xee, 0x41, 0x97, 0x2a, 0x35, 0xbe, 0x56, 0x6c, 0x2f, 0x37, 0xdc, ++ 0x97, 0x1a, 0xe4, 0x2c, 0xcf, 0xbf, 0xcc, 0xb0, 0x6a, 0x9f, 0x8e, 0xaf, ++ 0x71, 0xdf, 0x1d, 0xdc, 0xb3, 0xec, 0xbb, 0x1b, 0xb1, 0x3d, 0x0a, 0xd2, ++ 0x81, 0x6e, 0x44, 0x87, 0xba, 0x85, 0x3f, 0x11, 0x0f, 0xfa, 0x89, 0x07, ++ 0x66, 0xef, 0x63, 0xa1, 0x6f, 0xe1, 0xa2, 0x15, 0xf1, 0xe5, 0x1e, 0x7f, ++ 0xd0, 0xe7, 0x98, 0xaa, 0x03, 0x0a, 0xbc, 0xc8, 0xf6, 0x9b, 0xe6, 0x9d, ++ 0xc2, 0xaf, 0x03, 0xfd, 0x5b, 0xa8, 0xfb, 0xe5, 0x07, 0x25, 0xbe, 0x98, ++ 0x66, 0x3f, 0x79, 0x29, 0xca, 0x65, 0x0f, 0x41, 0xc4, 0x13, 0xe6, 0x47, ++ 0x55, 0x5a, 0xcd, 0xe4, 0x0e, 0xc6, 0xf1, 0xd3, 0x7b, 0xeb, 0xba, 0xba, ++ 0x84, 0xb3, 0x2c, 0xd2, 0x7a, 0xaa, 0x9c, 0x69, 0x9c, 0x3a, 0x34, 0x1f, ++ 0xa9, 0xe5, 0xdc, 0x0f, 0xf5, 0x94, 0x17, 0xff, 0xdc, 0x94, 0xf3, 0x92, ++ 0x4e, 0x72, 0xf5, 0x23, 0xc4, 0x3d, 0xc7, 0x68, 0x00, 0x1b, 0xcb, 0x61, ++ 0x5c, 0x6a, 0x90, 0xf9, 0xaf, 0xae, 0x9f, 0xfb, 0x6d, 0xc5, 0x8e, 0x7d, ++ 0xc2, 0x2b, 0x84, 0x7f, 0xd5, 0x18, 0xbf, 0xc7, 0x32, 0x24, 0x33, 0xf6, ++ 0x5c, 0xd1, 0xc4, 0x8d, 0x76, 0x22, 0x3a, 0x3f, 0x81, 0x6d, 0xe4, 0x6f, ++ 0x6e, 0x8e, 0xcf, 0x98, 0xc2, 0xf1, 0xb4, 0x60, 0xa1, 0xcc, 0x37, 0xfa, ++ 0x2b, 0x73, 0x7b, 0xa5, 0xc8, 0x46, 0xc6, 0x9f, 0x98, 0x21, 0x78, 0xb1, ++ 0x2a, 0xf4, 0x55, 0x7b, 0xfd, 0x6f, 0x7c, 0xf7, 0xb7, 0xda, 0xf2, 0x90, ++ 0x6b, 0x27, 0xbe, 0x64, 0x3d, 0x27, 0x78, 0x9d, 0xac, 0xa9, 0x1b, 0xdb, ++ 0xf6, 0xc0, 0x28, 0xd2, 0xb4, 0xc8, 0x7c, 0xa5, 0x1b, 0xfd, 0x94, 0xef, ++ 0xe6, 0x64, 0x37, 0x0e, 0xd0, 0x5f, 0x07, 0xf4, 0xa3, 0x55, 0x0e, 0xd4, ++ 0x4e, 0x3a, 0x31, 0xfe, 0x8f, 0x73, 0x89, 0xa5, 0x0b, 0x16, 0x05, 0xe8, ++ 0x5b, 0xdd, 0x88, 0xa7, 0x7e, 0xe2, 0xb5, 0x7a, 0x87, 0x0e, 0x89, 0x79, ++ 0x22, 0x8b, 0x1e, 0x14, 0xed, 0x3c, 0x81, 0xbc, 0x9d, 0x3d, 0x28, 0x0c, ++ 0x2c, 0xc6, 0xbd, 0xa1, 0x33, 0xe6, 0x45, 0xcd, 0xe5, 0x3d, 0x46, 0xf9, ++ 0x1c, 0xad, 0xaf, 0xc2, 0x63, 0x7a, 0x3d, 0x36, 0x0f, 0xce, 0xa2, 0xdf, ++ 0x37, 0x61, 0x5b, 0x86, 0x73, 0x85, 0x1d, 0x58, 0xda, 0x28, 0x75, 0x03, ++ 0x85, 0x76, 0x3d, 0x03, 0x67, 0x3c, 0x9a, 0xfa, 0xb8, 0x75, 0x26, 0x80, ++ 0x9c, 0xcb, 0xe3, 0xc3, 0xa3, 0xf4, 0xaf, 0x4e, 0x55, 0x7e, 0x5f, 0xcf, ++ 0x3c, 0x60, 0x3d, 0xaa, 0x62, 0x86, 0x29, 0xf2, 0x3e, 0x86, 0xc8, 0x8f, ++ 0x1c, 0x5c, 0x47, 0xd3, 0xa2, 0x40, 0xd7, 0xa4, 0x22, 0xf6, 0x1c, 0xe8, ++ 0x1c, 0x55, 0x74, 0xf7, 0xb2, 0x11, 0x05, 0xc1, 0x9d, 0x1c, 0x2b, 0xf4, ++ 0x43, 0xaf, 0x5d, 0xf7, 0xcd, 0xf1, 0xbb, 0xf5, 0xe4, 0x05, 0xeb, 0x51, ++ 0x1a, 0x13, 0x4e, 0x2e, 0xb8, 0x10, 0xf9, 0x46, 0x19, 0xef, 0x4f, 0x87, ++ 0x02, 0x6d, 0x25, 0x8a, 0x70, 0x9f, 0x40, 0xd3, 0x52, 0x45, 0xb8, 0x8a, ++ 0xdc, 0xa7, 0xbb, 0x6b, 0x47, 0x4e, 0x67, 0x7b, 0x98, 0x4d, 0xc4, 0x06, ++ 0x9f, 0x75, 0xbe, 0xf7, 0x79, 0xeb, 0x2c, 0xdb, 0xb5, 0xfa, 0x6c, 0x5e, ++ 0x5c, 0x72, 0x87, 0xe7, 0x42, 0x77, 0x47, 0xc3, 0xc4, 0x39, 0x73, 0xf1, ++ 0x30, 0xed, 0xfe, 0x2c, 0x3c, 0xf8, 0xa7, 0xa8, 0x60, 0x9a, 0x0f, 0xbf, ++ 0x89, 0x16, 0x48, 0xee, 0x9d, 0x92, 0x1a, 0xe4, 0xab, 0x49, 0xc3, 0xa4, ++ 0x5c, 0x5b, 0x97, 0xd2, 0x96, 0x82, 0xa1, 0x12, 0xe6, 0xe7, 0x7d, 0x8f, ++ 0xe6, 0x59, 0xf5, 0x84, 0x52, 0x94, 0x13, 0xff, 0x77, 0x0e, 0x7e, 0xd9, ++ 0x39, 0x2c, 0x62, 0x70, 0x91, 0xd4, 0xc5, 0x9c, 0xd8, 0x1c, 0xfa, 0xa3, ++ 0x99, 0x6a, 0x97, 0x7b, 0xaa, 0x71, 0x6a, 0x8f, 0xd8, 0x69, 0x10, 0x05, ++ 0xf1, 0xd3, 0xb4, 0x49, 0x15, 0xaf, 0x47, 0x6b, 0xf4, 0xfb, 0x1d, 0xdf, ++ 0xa1, 0xfd, 0xcf, 0xbd, 0x0e, 0xb7, 0xe7, 0x6a, 0x0f, 0xe0, 0x11, 0x0b, ++ 0xb7, 0x23, 0xd8, 0xc8, 0xb8, 0x40, 0xde, 0xb6, 0xff, 0x51, 0x87, 0xca, ++ 0x78, 0x5e, 0xa3, 0xd6, 0xd0, 0xa6, 0x36, 0x72, 0x0e, 0xe1, 0x93, 0xd3, ++ 0xc9, 0xf7, 0x1e, 0x8b, 0xd6, 0xf9, 0xfe, 0x80, 0x15, 0xd6, 0x59, 0x63, ++ 0x9f, 0x43, 0xf6, 0xa4, 0xa1, 0x24, 0xae, 0xe1, 0x38, 0xf7, 0xb1, 0xb9, ++ 0xdc, 0x9e, 0xb7, 0x2c, 0x3b, 0x76, 0x7c, 0x50, 0xf8, 0xd6, 0x9d, 0xb8, ++ 0xdf, 0x1a, 0x5b, 0xa7, 0x5f, 0x6a, 0xd8, 0x1f, 0x55, 0x30, 0xad, 0x56, ++ 0x43, 0x22, 0xdd, 0x8c, 0x75, 0x15, 0x3e, 0x1c, 0x48, 0xac, 0xc7, 0xc2, ++ 0xc4, 0x37, 0xf0, 0x50, 0x85, 0xc1, 0xb8, 0x48, 0x0c, 0x8a, 0x6b, 0xea, ++ 0x7c, 0xe5, 0xeb, 0xd9, 0xba, 0xac, 0x07, 0xae, 0xb8, 0xc4, 0xbb, 0x7c, ++ 0xec, 0x52, 0x67, 0xa3, 0x58, 0x93, 0xf1, 0xed, 0xb1, 0x77, 0x0c, 0xfa, ++ 0xb3, 0x31, 0x90, 0xa8, 0x11, 0x57, 0x24, 0xf6, 0x06, 0xd7, 0x92, 0x47, ++ 0xa4, 0x18, 0xfd, 0xf2, 0xc3, 0x5a, 0x6a, 0x35, 0x0a, 0x61, 0xcc, 0x10, ++ 0x3c, 0x94, 0x7b, 0x66, 0xdd, 0xb0, 0xa6, 0x8a, 0xec, 0x9a, 0x72, 0xbf, ++ 0x1f, 0xe0, 0x6f, 0x62, 0x5b, 0xc2, 0x2d, 0xe4, 0xfb, 0x22, 0xb4, 0xa9, ++ 0x72, 0x4e, 0x57, 0x47, 0x22, 0x21, 0xbf, 0xfb, 0x75, 0xc3, 0xd1, 0x80, ++ 0x4f, 0xf7, 0xda, 0x36, 0xd8, 0x31, 0x8f, 0xfa, 0x2f, 0x6b, 0xc0, 0xe4, ++ 0x21, 0x89, 0x65, 0x5f, 0xa6, 0x93, 0x5c, 0x1c, 0x16, 0xbd, 0x88, 0x5c, ++ 0xfd, 0x27, 0xcf, 0xa1, 0x6e, 0xfc, 0x61, 0xc7, 0x11, 0x13, 0xd3, 0x45, ++ 0xc6, 0x7f, 0x53, 0x25, 0xb9, 0xa6, 0x83, 0x1c, 0xc2, 0x48, 0xf7, 0x57, ++ 0x49, 0x9c, 0x74, 0xc5, 0x81, 0xb9, 0x71, 0x03, 0x05, 0x61, 0x6d, 0xff, ++ 0x25, 0xe7, 0x15, 0xb3, 0x73, 0xc6, 0x2c, 0xe6, 0x7c, 0xd7, 0xf6, 0xdc, ++ 0xcf, 0xb5, 0x3b, 0xb5, 0x5f, 0x99, 0xf7, 0x78, 0x64, 0x8d, 0xcf, 0xf3, ++ 0x1e, 0x99, 0xfb, 0x16, 0xca, 0x25, 0x27, 0x13, 0x93, 0xf6, 0xf3, 0x5f, ++ 0xcc, 0x6f, 0x5e, 0xf7, 0xbb, 0x70, 0x19, 0xb1, 0xd3, 0xa9, 0x3d, 0x75, ++ 0xb1, 0x59, 0xe9, 0x23, 0x4c, 0x60, 0x38, 0x29, 0xb6, 0x2b, 0x32, 0x8e, ++ 0xe0, 0x2c, 0x79, 0x61, 0xfe, 0xae, 0x09, 0x0c, 0x90, 0x17, 0x3a, 0xe3, ++ 0xfe, 0xfd, 0x94, 0x24, 0xd6, 0xa9, 0x8b, 0x89, 0xd5, 0xa5, 0x5c, 0x47, ++ 0x6e, 0x0d, 0xf3, 0x2c, 0xb9, 0x4b, 0x7c, 0xd9, 0xce, 0xfd, 0x16, 0x92, ++ 0x23, 0x35, 0xc7, 0x0a, 0xa0, 0x95, 0x97, 0xa1, 0x44, 0x93, 0xb3, 0x25, ++ 0xf6, 0x75, 0x51, 0xae, 0xa5, 0x58, 0x9b, 0x8d, 0xa5, 0xd6, 0xb5, 0x3e, ++ 0xeb, 0x5c, 0x83, 0x56, 0x21, 0xf1, 0x57, 0x62, 0x2e, 0xf9, 0x76, 0xa3, ++ 0xc4, 0xdc, 0x08, 0xd7, 0x36, 0x2b, 0xdb, 0x53, 0x59, 0x6a, 0xfd, 0xbe, ++ 0x3f, 0xf1, 0xd6, 0x17, 0xbb, 0x12, 0x7f, 0xe1, 0x3d, 0xdd, 0x50, 0xf7, ++ 0x15, 0x61, 0xf9, 0xd3, 0xc5, 0xd0, 0x2b, 0xec, 0xba, 0xf0, 0xdc, 0x70, ++ 0x34, 0x64, 0x26, 0x84, 0x27, 0xcd, 0x81, 0x6f, 0xa6, 0x75, 0xbe, 0x8c, ++ 0x18, 0x20, 0xba, 0x10, 0xdd, 0xf9, 0xf5, 0x9b, 0xf7, 0x2d, 0xfc, 0xea, ++ 0xf8, 0x55, 0x3d, 0xcc, 0x87, 0xf6, 0xa0, 0x87, 0x7b, 0xb3, 0x63, 0xc4, ++ 0x36, 0xc6, 0x88, 0x60, 0xc0, 0xc6, 0xb0, 0xad, 0x7b, 0x24, 0xe7, 0xef, ++ 0x97, 0x7e, 0x6c, 0xef, 0x59, 0xbd, 0x0c, 0x2d, 0xd9, 0x18, 0xd1, 0x49, ++ 0xea, 0x26, 0xe3, 0xe7, 0x69, 0xd3, 0x67, 0x11, 0xc3, 0x38, 0xc7, 0xed, ++ 0xd7, 0x71, 0xb1, 0xe9, 0xda, 0xff, 0x35, 0x1f, 0xf2, 0xc8, 0x1e, 0x3d, ++ 0xb3, 0xec, 0x7a, 0x70, 0x37, 0xf6, 0x13, 0x1f, 0xab, 0x34, 0xb9, 0x47, ++ 0x4b, 0x56, 0x39, 0xbb, 0xb1, 0x8b, 0xe3, 0xef, 0x24, 0x46, 0xc6, 0x88, ++ 0x91, 0xfa, 0xc2, 0xa3, 0x3f, 0x52, 0x51, 0xdb, 0x4d, 0xf6, 0xf0, 0x5d, ++ 0xc1, 0x96, 0x67, 0x89, 0x2d, 0x6b, 0x89, 0x91, 0xdb, 0x53, 0x32, 0x8f, ++ 0xcc, 0x97, 0x9b, 0x47, 0xc6, 0xfc, 0xad, 0xb9, 0xda, 0x23, 0x6b, 0xbd, ++ 0xd9, 0x3a, 0xe4, 0xbb, 0xdb, 0xf9, 0xef, 0x22, 0x8b, 0x43, 0xf5, 0x27, ++ 0xa6, 0x3e, 0xdf, 0x34, 0x41, 0x7c, 0xb5, 0xf2, 0x00, 0xc6, 0xd7, 0x08, ++ 0xee, 0x6b, 0x54, 0x71, 0x31, 0x3a, 0x81, 0xc2, 0x83, 0x39, 0x2c, 0x32, ++ 0x17, 0x1f, 0x27, 0x0e, 0x0d, 0x40, 0xb0, 0x27, 0x4c, 0x1d, 0x18, 0xf4, ++ 0x89, 0x52, 0x8c, 0x26, 0x35, 0xe2, 0xa3, 0x89, 0x1d, 0x21, 0x37, 0x39, ++ 0x6c, 0xdf, 0xb1, 0x7c, 0x2b, 0x26, 0x94, 0x12, 0xaf, 0x73, 0xfc, 0x5a, ++ 0xb8, 0xb5, 0x60, 0x0d, 0xf3, 0x88, 0x41, 0x27, 0xf2, 0x17, 0xd9, 0xb9, ++ 0xc3, 0xa9, 0x76, 0xb9, 0xae, 0x1a, 0x03, 0x7b, 0xc4, 0xd6, 0x6a, 0x50, ++ 0xa5, 0x9d, 0x66, 0x2e, 0x01, 0xbc, 0x1b, 0x75, 0xcc, 0x71, 0x93, 0x03, ++ 0xf7, 0xea, 0x8d, 0xb8, 0x32, 0x7d, 0x23, 0xfd, 0xdb, 0xcb, 0xef, 0xc6, ++ 0x71, 0x38, 0xea, 0x46, 0x7e, 0xb9, 0xc8, 0xb7, 0x8c, 0xfb, 0xb1, 0xed, ++ 0x65, 0x33, 0xed, 0xa5, 0x80, 0xb9, 0xd9, 0xbd, 0x96, 0x5f, 0xca, 0x38, ++ 0x13, 0xd6, 0x33, 0x4e, 0x5a, 0xa3, 0xf0, 0x56, 0x9d, 0x31, 0xb0, 0x14, ++ 0xf1, 0x9d, 0x52, 0x7f, 0x2c, 0x45, 0xec, 0xa0, 0xf8, 0x53, 0xb5, 0xe0, ++ 0x26, 0xe7, 0x0d, 0x53, 0x3e, 0x2a, 0x71, 0xa5, 0xae, 0xc7, 0xe9, 0x2c, ++ 0xc5, 0x99, 0x72, 0xe6, 0xab, 0xd6, 0x73, 0x60, 0xed, 0x38, 0x90, 0xd5, ++ 0x91, 0x4a, 0x7e, 0xd3, 0x76, 0x95, 0x2f, 0xe7, 0xf6, 0x92, 0xf3, 0x4f, ++ 0xd9, 0x93, 0x8a, 0x2d, 0x51, 0x1d, 0x3f, 0x91, 0x7a, 0x90, 0xa3, 0x86, ++ 0x71, 0x83, 0x79, 0x51, 0x46, 0x64, 0x9d, 0xb3, 0xad, 0xbf, 0x9f, 0x95, ++ 0x3d, 0xf7, 0x96, 0xd5, 0x41, 0xee, 0xb3, 0xd6, 0x51, 0xa4, 0xfc, 0xce, ++ 0x5c, 0x53, 0x29, 0xeb, 0xbb, 0xcc, 0x3c, 0x6c, 0x1b, 0xbf, 0x5f, 0x82, ++ 0x2d, 0x83, 0x53, 0xe3, 0x82, 0xf8, 0x5c, 0xae, 0x67, 0x67, 0xfb, 0x5e, ++ 0x79, 0x5c, 0x7a, 0xf3, 0xcf, 0x85, 0x1e, 0xa5, 0x1e, 0x02, 0x0b, 0xeb, ++ 0xac, 0x5a, 0x0a, 0x39, 0x2e, 0xf3, 0x0f, 0xc1, 0x53, 0x83, 0xf1, 0xbc, ++ 0x14, 0xaf, 0x24, 0x25, 0xbe, 0x9a, 0x28, 0x08, 0x15, 0x33, 0xde, 0xf5, ++ 0x3d, 0x5e, 0x6e, 0x71, 0xe6, 0x52, 0x54, 0xd0, 0xf6, 0x76, 0x0d, 0xde, ++ 0xcc, 0xce, 0xaf, 0xc5, 0x80, 0x74, 0x48, 0xce, 0xca, 0xff, 0xd1, 0xdc, ++ 0xf1, 0x6d, 0xfb, 0x9e, 0x53, 0x49, 0x37, 0x3e, 0x0c, 0x75, 0x62, 0xbc, ++ 0x3c, 0x82, 0xdd, 0x89, 0x42, 0x74, 0xce, 0xa8, 0xb5, 0x9e, 0x97, 0x91, ++ 0x67, 0xb9, 0x4e, 0x47, 0xf3, 0xd0, 0x34, 0xd3, 0x67, 0xd5, 0x93, 0x1c, ++ 0xc4, 0xf1, 0x77, 0xa2, 0x11, 0xc6, 0x02, 0xdf, 0x75, 0xf1, 0x21, 0x5f, ++ 0x5b, 0x84, 0x25, 0x59, 0x0c, 0x3f, 0x90, 0xf8, 0x8c, 0x18, 0x53, 0x66, ++ 0x4c, 0x0f, 0x97, 0xe2, 0xb6, 0xdd, 0x86, 0xe0, 0xaf, 0x51, 0x1a, 0xd6, ++ 0x26, 0xe7, 0x2b, 0xa5, 0x58, 0x3c, 0x28, 0x78, 0x2e, 0xe7, 0x26, 0xd3, ++ 0x21, 0x77, 0xac, 0x83, 0x3a, 0xea, 0x41, 0xed, 0x3e, 0x4b, 0xae, 0xaa, ++ 0x53, 0x31, 0x7b, 0x2f, 0xe8, 0x11, 0x9d, 0xf1, 0xac, 0x67, 0x09, 0xed, ++ 0x7e, 0x32, 0xe4, 0xef, 0x9c, 0xee, 0xd4, 0xba, 0xcf, 0x2b, 0xf5, 0x18, ++ 0x1d, 0x01, 0x76, 0x1e, 0x0a, 0xe2, 0xf7, 0x09, 0xe1, 0xf6, 0x41, 0xbc, ++ 0x4f, 0xde, 0x73, 0x2e, 0x51, 0x4f, 0x6c, 0xf1, 0x47, 0xbe, 0x87, 0x7a, ++ 0xbc, 0xcb, 0xcf, 0x05, 0x71, 0x1d, 0x97, 0x28, 0xbf, 0xbc, 0x78, 0x03, ++ 0x2e, 0x64, 0xbe, 0x8e, 0x8b, 0xfb, 0x14, 0x1c, 0xd5, 0xbe, 0x8e, 0xb3, ++ 0xc3, 0x3d, 0x58, 0xb4, 0x4f, 0x9e, 0x15, 0x7d, 0x2e, 0xa4, 0x32, 0x0e, ++ 0x3c, 0x3a, 0xcf, 0xec, 0x7d, 0x4a, 0xaf, 0x25, 0x66, 0xf8, 0xf5, 0x4e, ++ 0xe2, 0x41, 0xc2, 0x7a, 0x6e, 0x44, 0x74, 0x26, 0xba, 0xeb, 0xc1, 0x45, ++ 0x0b, 0xb3, 0x6f, 0x8e, 0x13, 0xd7, 0xf0, 0x5a, 0xe6, 0x11, 0xdf, 0xbe, ++ 0x05, 0x3f, 0x57, 0x83, 0xdc, 0x87, 0x97, 0x3c, 0x6b, 0x9c, 0xb1, 0xaf, ++ 0x10, 0x05, 0x95, 0xd2, 0x67, 0xd5, 0x50, 0x44, 0x0c, 0x79, 0x99, 0xb2, ++ 0xbb, 0xaf, 0xd2, 0x6f, 0xf9, 0x5f, 0x41, 0xbc, 0x9e, 0xf9, 0xc9, 0x74, ++ 0xfc, 0xfe, 0xba, 0xd8, 0xfa, 0x73, 0x0b, 0x1b, 0x5c, 0xda, 0x9c, 0xd9, ++ 0x36, 0x36, 0x5c, 0x9c, 0x25, 0x98, 0x2c, 0x35, 0xc1, 0x32, 0x4d, 0xeb, ++ 0xfa, 0x3e, 0x7d, 0x3c, 0x1d, 0x3a, 0xfa, 0xd7, 0x72, 0x66, 0xe6, 0xa9, ++ 0x50, 0xad, 0x51, 0x8e, 0x99, 0xbc, 0x6e, 0x7c, 0x91, 0x8a, 0x46, 0xbe, ++ 0x07, 0x78, 0x5d, 0x3d, 0xd7, 0x71, 0xd9, 0x4c, 0xa9, 0x35, 0x56, 0x9c, ++ 0x88, 0x33, 0x56, 0xbe, 0x1e, 0xab, 0xeb, 0x3c, 0xa4, 0x5c, 0x32, 0x8d, ++ 0xca, 0x79, 0xfc, 0xce, 0x83, 0x53, 0x51, 0xff, 0xf8, 0x30, 0xea, 0x7c, ++ 0x93, 0xca, 0x01, 0xd3, 0x50, 0x45, 0x3f, 0xb2, 0x5f, 0xb9, 0xff, 0x56, ++ 0xfe, 0x7e, 0x66, 0x8a, 0x1d, 0x5e, 0xcb, 0xaf, 0xf2, 0xae, 0xda, 0x9f, ++ 0x70, 0x10, 0x73, 0xf1, 0x90, 0x5e, 0xa7, 0x6e, 0x24, 0x16, 0x44, 0xd4, ++ 0x9b, 0xd9, 0x5f, 0x21, 0xed, 0x2f, 0xc2, 0x7c, 0xb1, 0x14, 0xaa, 0x15, ++ 0x8b, 0xda, 0x91, 0x1c, 0x9c, 0xca, 0x23, 0xc5, 0xee, 0x6c, 0x4e, 0xda, ++ 0x59, 0xde, 0x77, 0x2c, 0x0f, 0x41, 0xca, 0xfc, 0xad, 0x2f, 0xe2, 0xc4, ++ 0xf0, 0x02, 0x62, 0xf8, 0xe5, 0xbd, 0x45, 0x78, 0x7d, 0x6f, 0x13, 0xd2, ++ 0xe5, 0x72, 0x8f, 0x13, 0x79, 0xdc, 0x9d, 0xdd, 0xf3, 0x70, 0xa0, 0x6a, ++ 0xd7, 0x37, 0xb2, 0x67, 0x37, 0x34, 0xe4, 0xc7, 0x89, 0x88, 0x6d, 0x4e, ++ 0xb8, 0x76, 0xc9, 0x1c, 0xd3, 0xae, 0xb3, 0x3f, 0xb7, 0x56, 0x80, 0x56, ++ 0x8f, 0xe0, 0xc3, 0xcf, 0x66, 0x4b, 0xcc, 0x7c, 0x91, 0x6b, 0x39, 0x46, ++ 0x9b, 0x5e, 0xa9, 0xdf, 0x29, 0xbd, 0x34, 0x5e, 0x2f, 0xf7, 0x49, 0x0e, ++ 0x63, 0x62, 0x1b, 0x2d, 0xac, 0xb6, 0xd2, 0x44, 0x42, 0x8f, 0x30, 0x3e, ++ 0x85, 0x10, 0x21, 0x5f, 0x2f, 0xd1, 0xe4, 0xb3, 0x8a, 0x0b, 0xcc, 0xbf, ++ 0x46, 0xea, 0x15, 0x7c, 0x78, 0xbb, 0xc4, 0xfd, 0x80, 0xfe, 0xba, 0x22, ++ 0x71, 0x5f, 0xee, 0x37, 0xad, 0x67, 0x3b, 0x04, 0x23, 0x0a, 0x2c, 0x0e, ++ 0x34, 0xd3, 0xc2, 0x16, 0x9f, 0x43, 0xce, 0x73, 0x44, 0x43, 0x77, 0x25, ++ 0xea, 0xc6, 0x6b, 0x9c, 0xe4, 0x63, 0x7f, 0x75, 0x3b, 0x79, 0x98, 0xc5, ++ 0x07, 0xa6, 0xc6, 0x9d, 0x26, 0x60, 0xaa, 0x3c, 0xfc, 0xea, 0x99, 0xab, ++ 0xf9, 0xb7, 0xbd, 0x87, 0x9d, 0x83, 0xff, 0x62, 0xb6, 0x5d, 0xb7, 0xfe, ++ 0x1c, 0x8e, 0x3c, 0x3f, 0xdb, 0x7e, 0x8e, 0x47, 0xfc, 0x8e, 0x76, 0x11, ++ 0xff, 0x47, 0xf3, 0x11, 0x8b, 0xbb, 0xed, 0x9a, 0x2d, 0x67, 0x1c, 0x5c, ++ 0xbb, 0xb6, 0xcc, 0x96, 0x73, 0xae, 0x8e, 0x29, 0x1c, 0xc0, 0x8e, 0xab, ++ 0xe7, 0xcc, 0xa5, 0xd6, 0x5a, 0x0f, 0x64, 0xaf, 0x93, 0x5c, 0x59, 0xd6, ++ 0xa2, 0xe0, 0xa7, 0x5a, 0x9d, 0xfa, 0x32, 0x4a, 0x04, 0x4f, 0x22, 0xd2, ++ 0x63, 0x2c, 0xd2, 0x6a, 0xbc, 0x87, 0xf9, 0xbe, 0x83, 0xbf, 0xbf, 0xa4, ++ 0xb9, 0x9a, 0xd6, 0x40, 0xfa, 0x8d, 0x0e, 0xea, 0xaa, 0xce, 0xfb, 0x32, ++ 0x02, 0x91, 0x02, 0x65, 0xd2, 0xec, 0xf4, 0xc8, 0x35, 0xd9, 0x67, 0x90, ++ 0x95, 0xd3, 0x56, 0x9d, 0xc4, 0xb6, 0x99, 0x6a, 0xeb, 0x1c, 0xfe, 0x8b, ++ 0x19, 0xe1, 0x1d, 0x0b, 0xb8, 0x77, 0x15, 0x83, 0x19, 0xe1, 0x08, 0x6e, ++ 0x8b, 0x07, 0xa9, 0xf3, 0xe6, 0xf9, 0x56, 0xe3, 0xd7, 0xb3, 0xe5, 0xb9, ++ 0xba, 0x4d, 0x3a, 0xe6, 0x38, 0xf0, 0xf6, 0x1c, 0x47, 0xf8, 0x1b, 0x4f, ++ 0x2e, 0x69, 0xb8, 0x22, 0xfb, 0x62, 0x04, 0xb5, 0xea, 0xb2, 0x5e, 0x79, ++ 0x4e, 0xb8, 0x85, 0xbc, 0x6a, 0x80, 0xb9, 0x7c, 0x4b, 0xfd, 0xbf, 0x9a, ++ 0xdf, 0x75, 0x45, 0x7c, 0x4e, 0xcc, 0xf3, 0x6d, 0xc1, 0x15, 0x33, 0xe5, ++ 0x91, 0xdf, 0x65, 0x0c, 0x79, 0x9e, 0x55, 0xfa, 0x56, 0xa6, 0x79, 0xdb, ++ 0x3c, 0x93, 0x79, 0xb2, 0xe3, 0x6e, 0x27, 0xfd, 0xa2, 0x40, 0x3b, 0x6b, ++ 0xd6, 0xce, 0x98, 0xe7, 0x75, 0x28, 0xb5, 0xb4, 0x0e, 0x0f, 0x9e, 0xa1, ++ 0xfd, 0x3e, 0x93, 0x91, 0xf8, 0xa7, 0xe2, 0x08, 0xfd, 0x74, 0xb8, 0xb6, ++ 0xa6, 0xe7, 0x22, 0xf3, 0xc6, 0x0f, 0xc8, 0xe7, 0xdf, 0xd0, 0xfc, 0x9d, ++ 0x27, 0xa5, 0xa6, 0x18, 0x72, 0xe1, 0xd5, 0xfa, 0x2b, 0x56, 0x8d, 0x37, ++ 0x76, 0x50, 0xc5, 0x40, 0xc2, 0xf6, 0xf7, 0xe7, 0xe9, 0xc7, 0xd7, 0xfa, ++ 0xeb, 0x0d, 0xd8, 0xb8, 0x5b, 0xfc, 0xa3, 0xc1, 0xf2, 0xa3, 0x6b, 0x35, ++ 0x21, 0xeb, 0x39, 0x14, 0xfa, 0xc5, 0x0a, 0xe9, 0x1b, 0x1a, 0x29, 0xb8, ++ 0x28, 0xdf, 0x16, 0xf2, 0x5d, 0x89, 0xb1, 0xf5, 0xcc, 0x6d, 0x5d, 0xf4, ++ 0x9f, 0x93, 0xcc, 0x33, 0xb8, 0xb6, 0xb0, 0x69, 0x9e, 0x63, 0xde, 0x35, ++ 0x88, 0x3a, 0xf5, 0x38, 0xee, 0x27, 0x67, 0x25, 0x9f, 0xc9, 0x30, 0x37, ++ 0xb5, 0xf2, 0xa6, 0x1a, 0xf5, 0x5e, 0x65, 0x21, 0xf7, 0xdf, 0x8a, 0xbe, ++ 0x61, 0x1f, 0x79, 0x8d, 0x69, 0x2e, 0xd3, 0x7f, 0x8c, 0x8a, 0xdd, 0x7d, ++ 0x3d, 0x15, 0x94, 0xc7, 0x27, 0x21, 0xa3, 0x9b, 0x98, 0xde, 0x75, 0x5c, ++ 0xa9, 0xeb, 0x88, 0x29, 0xdf, 0xa5, 0x3e, 0x82, 0x16, 0x97, 0xde, 0x96, ++ 0x68, 0x63, 0x3c, 0xfb, 0x1b, 0x6c, 0x53, 0x95, 0xc5, 0x0c, 0x6d, 0xe4, ++ 0x83, 0x08, 0xa8, 0x61, 0xe9, 0x61, 0xfd, 0x2d, 0xf4, 0x99, 0x4d, 0xfc, ++ 0x4d, 0xe2, 0x7a, 0xd0, 0x7a, 0x56, 0xe5, 0x5c, 0xb4, 0x07, 0xc7, 0xd2, ++ 0xb4, 0xeb, 0x68, 0x3f, 0x8e, 0xa7, 0x65, 0x4e, 0xe1, 0x53, 0xf5, 0x88, ++ 0xed, 0x76, 0x62, 0x54, 0xaf, 0x89, 0x94, 0x51, 0x2e, 0x45, 0x21, 0x7f, ++ 0xe4, 0x7e, 0x62, 0x6c, 0xff, 0x60, 0x1a, 0xaf, 0xee, 0xf1, 0x77, 0xd6, ++ 0x2a, 0x1a, 0xa2, 0x19, 0xa8, 0xdf, 0x6b, 0x4c, 0xe3, 0xe5, 0xa1, 0xe5, ++ 0xf0, 0xcd, 0xf0, 0xfb, 0x5a, 0x94, 0x65, 0xd8, 0x94, 0xf9, 0xb7, 0x6a, ++ 0x49, 0x1a, 0xe7, 0x5e, 0x06, 0x83, 0xb2, 0xdf, 0x8a, 0x15, 0xd5, 0x82, ++ 0x63, 0x5b, 0x32, 0x25, 0x98, 0xcb, 0x78, 0xf4, 0x13, 0x2b, 0xce, 0xda, ++ 0x7e, 0x54, 0xa5, 0x7d, 0x68, 0x3e, 0x9c, 0x8d, 0xe1, 0x5f, 0x2d, 0xaf, ++ 0x5f, 0x9a, 0x11, 0x55, 0xe4, 0x25, 0xf7, 0x55, 0xa1, 0x90, 0xe3, 0x6c, ++ 0xcb, 0xc6, 0xeb, 0x72, 0xed, 0xff, 0x98, 0xcb, 0xad, 0x31, 0x1a, 0x38, ++ 0x8f, 0xec, 0x29, 0x98, 0xdd, 0xb7, 0x8e, 0x4f, 0xa3, 0x52, 0xd3, 0x50, ++ 0x71, 0x5c, 0x17, 0x1c, 0x59, 0x46, 0x5f, 0xcd, 0x43, 0x57, 0x3d, 0xdd, ++ 0xd1, 0xaa, 0xe7, 0x4f, 0x60, 0x7b, 0xf2, 0xcf, 0xe6, 0xe3, 0xb4, 0xa3, ++ 0xfb, 0xe4, 0x99, 0x0a, 0xe2, 0xc0, 0xca, 0x50, 0x1b, 0x39, 0x27, 0xf7, ++ 0x9c, 0x70, 0x11, 0x83, 0x14, 0x24, 0x9a, 0xe8, 0xff, 0xa1, 0x05, 0xd9, ++ 0xe7, 0xf6, 0xce, 0xcf, 0xb6, 0x6b, 0x88, 0xff, 0xbd, 0xda, 0xce, 0x03, ++ 0x45, 0xfe, 0xff, 0x3f, 0xf2, 0x7b, 0xde, 0xf4, 0x55, 0x88, 0xfc, 0x5c, ++ 0xf0, 0x06, 0xea, 0xb1, 0x9f, 0xd7, 0x9c, 0xda, 0xe3, 0xc2, 0x2e, 0x6d, ++ 0x19, 0x76, 0x65, 0xe0, 0xfb, 0x84, 0xd7, 0xfc, 0x7a, 0xe8, 0xd1, 0x6a, ++ 0x9b, 0x2b, 0xbc, 0x8d, 0xbe, 0xe8, 0x5a, 0xf3, 0xee, 0x0a, 0xd9, 0x6f, ++ 0x1e, 0xbc, 0xdc, 0xef, 0xfe, 0xab, 0xf5, 0xbc, 0xd5, 0xe6, 0x83, 0x56, ++ 0x9c, 0x58, 0x59, 0x2d, 0xbd, 0xb3, 0x17, 0x13, 0x26, 0x2e, 0xe8, 0x86, ++ 0x95, 0x87, 0x03, 0xa2, 0x6b, 0xd1, 0xad, 0xac, 0xad, 0x3d, 0x2b, 0x8f, ++ 0x67, 0x67, 0x5c, 0xbf, 0xee, 0x25, 0x59, 0x5b, 0x96, 0xbe, 0x7a, 0x8e, ++ 0xe3, 0x8b, 0x2d, 0x8b, 0x1d, 0x8b, 0x5d, 0xfb, 0x93, 0x72, 0x80, 0x7c, ++ 0x85, 0xfa, 0x17, 0xce, 0x21, 0x35, 0x95, 0x65, 0xf2, 0xfc, 0x8c, 0xb9, ++ 0x5a, 0xaf, 0xf3, 0x1d, 0xc7, 0x5f, 0xd3, 0xb6, 0x1b, 0xb0, 0x75, 0xb7, ++ 0xd4, 0x5b, 0x7d, 0x8a, 0x6b, 0xef, 0x83, 0xb8, 0xa0, 0x6a, 0xc4, 0x4e, ++ 0xb1, 0x43, 0xc1, 0x15, 0x59, 0x87, 0x60, 0x4b, 0x07, 0xe3, 0xb8, 0x75, ++ 0xae, 0x23, 0x52, 0x15, 0xee, 0x51, 0x3e, 0xa8, 0xed, 0xc1, 0x73, 0x21, ++ 0xc3, 0x2c, 0xd3, 0x02, 0x1d, 0x4c, 0xfa, 0x0b, 0x33, 0x0d, 0x05, 0x18, ++ 0x0b, 0x09, 0x7f, 0x84, 0x3b, 0x9d, 0xf6, 0x1b, 0xd3, 0x9c, 0xaa, 0xfb, ++ 0xd9, 0x74, 0x16, 0x2b, 0x1d, 0x73, 0xaa, 0xe5, 0x99, 0xc2, 0xa4, 0x85, ++ 0x23, 0x8b, 0x70, 0x8f, 0xa5, 0x5b, 0x95, 0x79, 0xa3, 0xd4, 0x7b, 0x9f, ++ 0x0b, 0x5d, 0x8a, 0x0a, 0xa6, 0x98, 0x8b, 0x37, 0x85, 0xa4, 0x47, 0x5d, ++ 0x43, 0xec, 0x5a, 0x8c, 0xd7, 0xf5, 0x0e, 0xfa, 0x8c, 0xf1, 0x94, 0x0b, ++ 0xd2, 0x83, 0x3b, 0x12, 0xda, 0x14, 0x95, 0xb8, 0xd4, 0x82, 0xe4, 0x6e, ++ 0x7f, 0x64, 0x3f, 0xb9, 0x50, 0x99, 0xa2, 0x75, 0x6f, 0x43, 0x64, 0x39, ++ 0xc5, 0xc0, 0x7c, 0xbc, 0x17, 0x07, 0x74, 0x03, 0xd3, 0xc2, 0x62, 0x73, ++ 0x91, 0xc2, 0x40, 0xa3, 0x82, 0xb3, 0x8d, 0x81, 0xa6, 0x87, 0x95, 0x1e, ++ 0xe2, 0x5e, 0x01, 0xb6, 0xe8, 0xf2, 0x77, 0x1d, 0x4a, 0x8c, 0xb9, 0x61, ++ 0xff, 0xf8, 0x71, 0x04, 0x3a, 0x56, 0x28, 0x81, 0xb6, 0x73, 0xe4, 0x21, ++ 0x8b, 0x9d, 0xc4, 0xe0, 0xaf, 0xb9, 0xdc, 0x77, 0x8c, 0x84, 0xb1, 0x3f, ++ 0xe3, 0x71, 0xd7, 0x8d, 0x30, 0xdf, 0xcb, 0x04, 0x71, 0x07, 0xf3, 0x5c, ++ 0xd7, 0x88, 0xee, 0x9e, 0x3f, 0xd2, 0x42, 0x5e, 0x2a, 0xb2, 0x95, 0xbe, ++ 0x6e, 0x2d, 0xba, 0xdb, 0xce, 0x98, 0x83, 0x01, 0xe6, 0x9a, 0x5a, 0x35, ++ 0xd6, 0x32, 0x26, 0xe7, 0x5b, 0x35, 0xd0, 0xaf, 0xf2, 0x19, 0x27, 0xed, ++ 0x70, 0xd4, 0xf4, 0x7d, 0x5b, 0x64, 0xf9, 0x59, 0xb5, 0x3c, 0xdf, 0x98, ++ 0xcc, 0xca, 0x75, 0xd5, 0x55, 0xb9, 0x4a, 0xff, 0xad, 0x81, 0xd8, 0xe7, ++ 0xc5, 0xaa, 0xf2, 0x6b, 0xba, 0x59, 0xa1, 0xd7, 0x74, 0x0c, 0x40, 0xfa, ++ 0x71, 0x0b, 0x6e, 0x41, 0x91, 0xd4, 0x60, 0xee, 0xc4, 0xe1, 0x72, 0x3b, ++ 0x27, 0xf1, 0x39, 0x8a, 0x89, 0xc5, 0xb9, 0xd8, 0x22, 0xbf, 0xfb, 0x93, ++ 0x11, 0x72, 0x9a, 0x75, 0xf5, 0x93, 0x66, 0xa4, 0xc2, 0x98, 0x74, 0x5a, ++ 0xe7, 0x70, 0x26, 0x7e, 0x7c, 0x49, 0xf3, 0x9f, 0xbc, 0xc4, 0x0f, 0xb7, ++ 0x13, 0xf3, 0x52, 0xd6, 0xff, 0x42, 0x55, 0xc6, 0xce, 0xc3, 0x40, 0xfd, ++ 0x2d, 0x88, 0xb4, 0xcb, 0x98, 0x82, 0x55, 0xa6, 0xd9, 0x1a, 0xaa, 0x69, ++ 0x3d, 0x82, 0x3c, 0x2c, 0xb8, 0xdd, 0x49, 0xfe, 0x6c, 0xa2, 0x39, 0xf4, ++ 0x67, 0x73, 0x94, 0x31, 0x73, 0x22, 0x24, 0xeb, 0x65, 0xce, 0x4e, 0xdf, ++ 0xf1, 0x56, 0x28, 0x38, 0x40, 0xdf, 0xb9, 0x7d, 0xd1, 0x6d, 0x48, 0x59, ++ 0xbe, 0x13, 0xc4, 0x4e, 0x72, 0xf4, 0xc0, 0x2e, 0x62, 0x76, 0xc3, 0x04, ++ 0x6a, 0x06, 0x72, 0x6b, 0x17, 0x5f, 0xcd, 0xad, 0x5f, 0xfa, 0x85, 0x32, ++ 0x8f, 0xac, 0x51, 0xf6, 0x92, 0xfb, 0xfe, 0xda, 0x67, 0xa7, 0x96, 0x27, ++ 0xf5, 0x30, 0xfe, 0xb7, 0x7c, 0x96, 0x8d, 0x21, 0xb9, 0xfd, 0x9c, 0xae, ++ 0xba, 0xfe, 0xf3, 0x2f, 0x6f, 0xf8, 0x7d, 0xc1, 0x0d, 0xbf, 0xff, 0xd5, ++ 0xec, 0xeb, 0x3f, 0xe7, 0x7c, 0xe4, 0x9a, 0x4c, 0xd7, 0xea, 0x35, 0x4d, ++ 0x69, 0xee, 0xd3, 0xac, 0x3f, 0x62, 0x9e, 0x79, 0x48, 0xd6, 0x22, 0xbe, ++ 0x25, 0xeb, 0x7b, 0x1b, 0x47, 0xd3, 0x37, 0xae, 0xed, 0xcd, 0x6c, 0xbf, ++ 0x40, 0xfc, 0x27, 0x48, 0x5f, 0x9a, 0x7a, 0x36, 0xdd, 0x3e, 0x8b, 0x57, ++ 0x12, 0x0e, 0x2a, 0xfd, 0x31, 0xc3, 0x9c, 0xa6, 0x15, 0x19, 0x05, 0x61, ++ 0x28, 0x6a, 0xc0, 0x40, 0x71, 0x40, 0xeb, 0x9a, 0xe6, 0xe8, 0x45, 0xde, ++ 0x42, 0xad, 0xfb, 0x49, 0x25, 0x89, 0xf8, 0x88, 0x3f, 0x38, 0x4c, 0x5c, ++ 0x89, 0x8d, 0x5c, 0x66, 0xae, 0xdd, 0x8b, 0xef, 0x85, 0x5c, 0x46, 0x51, ++ 0xd8, 0xef, 0x9d, 0xaf, 0x2c, 0xc1, 0xd6, 0xc1, 0x1f, 0x63, 0x75, 0x52, ++ 0x78, 0xbf, 0x0f, 0x1b, 0x33, 0x0e, 0x1c, 0xa5, 0xcd, 0xf7, 0x73, 0x2e, ++ 0x62, 0xa2, 0x37, 0x05, 0x39, 0x9b, 0xd6, 0x00, 0xe1, 0xdc, 0xc4, 0x41, ++ 0x6c, 0x1a, 0x7c, 0x0d, 0xab, 0xa3, 0x26, 0x3e, 0xd1, 0x19, 0x8f, 0x34, ++ 0xa9, 0xf7, 0x4a, 0x3e, 0xdd, 0x6e, 0xe1, 0xeb, 0x43, 0xf1, 0x5b, 0xac, ++ 0x33, 0xfb, 0xee, 0x70, 0x0b, 0xfd, 0x58, 0xc1, 0xa7, 0xd2, 0x8b, 0x64, ++ 0x2e, 0xfd, 0x22, 0xf9, 0xe2, 0x58, 0x74, 0x3d, 0x86, 0xe8, 0x3b, 0x55, ++ 0x9a, 0xd6, 0x5f, 0xe5, 0xb4, 0xcf, 0xea, 0x26, 0xf4, 0x40, 0xe7, 0x29, ++ 0x45, 0xce, 0xeb, 0x06, 0x18, 0x7b, 0xbe, 0xc0, 0x9f, 0x74, 0xa9, 0xb1, ++ 0xe9, 0xee, 0xa5, 0xb4, 0xf7, 0xbd, 0x83, 0x72, 0x1f, 0xf7, 0x7a, 0xd3, ++ 0x9a, 0x86, 0xf4, 0x9d, 0xf5, 0x6c, 0xfd, 0xf1, 0x35, 0x1c, 0x4e, 0xbb, ++ 0xf1, 0x70, 0xdc, 0xa7, 0xcc, 0xdd, 0xab, 0x62, 0x49, 0xdc, 0x3f, 0xbe, ++ 0xd8, 0x49, 0x4e, 0xb2, 0x68, 0x1a, 0xc7, 0x53, 0xf0, 0x8b, 0x85, 0x12, ++ 0x1f, 0xfe, 0x1d, 0x8c, 0x19, 0xcd, 0x1c, 0x13, 0x25, 0xf9, 0x8d, 0x7e, ++ 0xf5, 0xb0, 0xa3, 0xc6, 0xfb, 0x27, 0x6c, 0x82, 0x73, 0xa4, 0x0d, 0x7d, ++ 0x5c, 0xff, 0x7d, 0x71, 0xe9, 0x63, 0xd5, 0x01, 0xb4, 0xfb, 0x6d, 0xc3, ++ 0x86, 0xf4, 0x7f, 0x8c, 0xca, 0x30, 0x7c, 0x9e, 0xf0, 0x2d, 0x73, 0x50, ++ 0xf4, 0x05, 0xf9, 0xf7, 0x84, 0xe4, 0xa4, 0x5d, 0x65, 0x0e, 0x93, 0x39, ++ 0xcd, 0xfc, 0x6c, 0x9f, 0xa2, 0x05, 0x9b, 0x76, 0x4b, 0x0d, 0x9e, 0x58, ++ 0xae, 0x33, 0x37, 0x2a, 0xd7, 0x82, 0x2b, 0x1d, 0xd2, 0x1b, 0x5a, 0x8f, ++ 0x9a, 0xd8, 0x7a, 0x04, 0x63, 0xe2, 0xb3, 0x9a, 0xda, 0x8d, 0xc8, 0xcb, ++ 0x52, 0xfb, 0x9b, 0x1b, 0x0a, 0x70, 0x5d, 0x81, 0x7e, 0x8f, 0x53, 0x77, ++ 0x3f, 0x3f, 0xaa, 0x62, 0x5c, 0xb5, 0x73, 0xcb, 0xe1, 0xa4, 0xd6, 0x51, ++ 0xe0, 0x90, 0xb3, 0x7e, 0x17, 0xcd, 0x88, 0x35, 0xee, 0xaf, 0x89, 0x51, ++ 0xad, 0xd8, 0xb9, 0xef, 0x5d, 0xc6, 0x25, 0x99, 0xe3, 0x2f, 0x66, 0x1e, ++ 0x6d, 0xb3, 0xa5, 0xdd, 0x87, 0x7b, 0xe2, 0x52, 0x3b, 0xfd, 0x0f, 0x33, ++ 0xec, 0x73, 0x21, 0xf2, 0xd9, 0x85, 0x6e, 0x9d, 0xc0, 0x3b, 0xe3, 0x73, ++ 0xd3, 0x63, 0xe5, 0xaa, 0xbf, 0xb1, 0x6c, 0x66, 0x4b, 0xe2, 0x8b, 0x5b, ++ 0xc4, 0xc7, 0xb7, 0x64, 0x3e, 0xf7, 0x66, 0xff, 0x56, 0x0d, 0xf7, 0x21, ++ 0x63, 0x69, 0xfb, 0xd7, 0xa3, 0x7b, 0x86, 0x70, 0x9c, 0x87, 0x46, 0xa7, ++ 0x5e, 0x9f, 0xab, 0xcb, 0x78, 0xb2, 0x3c, 0x2b, 0x67, 0x6f, 0xd2, 0xff, ++ 0x8b, 0x28, 0x0f, 0x46, 0x5b, 0x95, 0xa5, 0x51, 0xe9, 0x01, 0x3a, 0xa2, ++ 0xc5, 0xd6, 0xb9, 0x4e, 0x13, 0x3f, 0x08, 0x8d, 0x29, 0x9b, 0xad, 0x33, ++ 0xa3, 0x86, 0x92, 0x6c, 0x00, 0x2a, 0x46, 0x9b, 0x95, 0xad, 0xd1, 0x8f, ++ 0xcd, 0x95, 0x56, 0xaf, 0x7d, 0xba, 0x75, 0xb6, 0xa7, 0x60, 0xd4, 0x8d, ++ 0xf2, 0xc3, 0xc5, 0xc8, 0x1f, 0xd0, 0x30, 0x7d, 0xf4, 0x5b, 0xe4, 0xb2, ++ 0xc2, 0x7f, 0x8c, 0x56, 0xc1, 0xd2, 0xa2, 0x70, 0xf3, 0x7f, 0xfe, 0x66, ++ 0xc0, 0x4f, 0x6e, 0x0f, 0xb8, 0x62, 0x6e, 0x18, 0xb0, 0xfe, 0x63, 0xfe, ++ 0x74, 0x84, 0xf9, 0x93, 0xb9, 0xf8, 0x07, 0x21, 0x63, 0xdb, 0x74, 0xf8, ++ 0x4f, 0x56, 0x38, 0x0c, 0xee, 0xdf, 0xef, 0x0b, 0x39, 0xa1, 0x2c, 0x9b, ++ 0x67, 0xe0, 0xde, 0x79, 0xf2, 0x37, 0x0b, 0x34, 0xef, 0x05, 0xb1, 0x9f, ++ 0x50, 0x2f, 0xde, 0xd3, 0x7b, 0xb1, 0x5d, 0x2f, 0x32, 0xbc, 0xd6, 0x33, ++ 0xf5, 0x25, 0x92, 0x03, 0xaa, 0x9b, 0xa1, 0xe9, 0x9b, 0x15, 0xbf, 0x71, ++ 0x3f, 0x63, 0xe4, 0xc5, 0x8c, 0x3f, 0x32, 0x49, 0xfb, 0x3f, 0x97, 0xf1, ++ 0xef, 0xbf, 0x43, 0x09, 0x32, 0x9f, 0xd6, 0x89, 0xff, 0xc4, 0x67, 0xee, ++ 0x73, 0x77, 0xa6, 0x45, 0xf8, 0x82, 0xd1, 0x99, 0x3d, 0x4b, 0xfc, 0xb8, ++ 0xf4, 0x37, 0xf3, 0xa4, 0x27, 0x66, 0x28, 0xab, 0x1a, 0xc4, 0x27, 0x4b, ++ 0x71, 0x8e, 0x11, 0xeb, 0x67, 0xe9, 0x7c, 0x3c, 0x37, 0x84, 0x19, 0x4e, ++ 0x38, 0xbf, 0x70, 0xa0, 0x36, 0x39, 0x17, 0x47, 0x6b, 0x2b, 0xf0, 0xb7, ++ 0xe4, 0xfc, 0x3d, 0xcc, 0xfd, 0xfa, 0x3a, 0xab, 0x34, 0xe9, 0x57, 0xe6, ++ 0x21, 0x95, 0x72, 0x90, 0x87, 0x14, 0xe3, 0xc5, 0x14, 0xaa, 0x5d, 0xf4, ++ 0xa5, 0x1d, 0x09, 0xd4, 0x3a, 0xc2, 0x81, 0xe4, 0x0a, 0x79, 0xc6, 0x2c, ++ 0xed, 0x41, 0x2a, 0xad, 0xf1, 0x15, 0xe4, 0xab, 0x9e, 0xaf, 0x26, 0xfc, ++ 0x20, 0x26, 0xb6, 0xe6, 0xc5, 0xcf, 0xd3, 0xa5, 0x38, 0x9f, 0xd4, 0xfa, ++ 0x5d, 0xb4, 0x83, 0xc0, 0x42, 0x39, 0xdb, 0xeb, 0xb3, 0x72, 0x8b, 0xcb, ++ 0xf4, 0xd3, 0xfe, 0x50, 0x29, 0xde, 0x4d, 0xdd, 0x2c, 0x4f, 0x84, 0x5a, ++ 0x1a, 0x16, 0x7f, 0x09, 0x66, 0xfd, 0x60, 0x4c, 0xb9, 0x7f, 0xc4, 0x3e, ++ 0x8f, 0x93, 0xa7, 0xc9, 0xf9, 0x1b, 0xeb, 0x39, 0x95, 0x9e, 0x0b, 0xce, ++ 0x22, 0x39, 0x87, 0xe3, 0xab, 0x72, 0x6a, 0x38, 0x95, 0x9e, 0x40, 0x9c, ++ 0x76, 0x3c, 0x2a, 0xbd, 0x8e, 0xd0, 0xfb, 0xa6, 0x51, 0x2e, 0xe7, 0x34, ++ 0x7a, 0x10, 0xd7, 0x2a, 0x98, 0x1b, 0xc9, 0xb9, 0xfc, 0x23, 0xa1, 0x68, ++ 0xcc, 0x5c, 0xfc, 0x6c, 0xc8, 0xdf, 0xba, 0x4b, 0x31, 0x96, 0x17, 0x43, ++ 0xf4, 0xa3, 0xf9, 0xf2, 0x28, 0xb7, 0x89, 0x74, 0x2f, 0x73, 0xb0, 0x12, ++ 0x8e, 0xe9, 0xf7, 0x5d, 0x44, 0x29, 0x36, 0x5a, 0x67, 0x2f, 0x4c, 0xb4, ++ 0xe8, 0xa7, 0x99, 0x17, 0xea, 0x1c, 0xa7, 0x14, 0xfb, 0xc9, 0x87, 0xa6, ++ 0x2d, 0xfa, 0x67, 0xf3, 0x4c, 0xa5, 0xac, 0xb7, 0x65, 0x66, 0xee, 0x1c, ++ 0xa2, 0xc8, 0xf6, 0x47, 0x94, 0xad, 0xcf, 0xfe, 0x9b, 0x21, 0x96, 0xad, ++ 0xac, 0x8b, 0xba, 0xf8, 0x2e, 0xf6, 0x21, 0x67, 0x3f, 0x19, 0x47, 0x2c, ++ 0x1b, 0x39, 0x32, 0x27, 0x7b, 0xc6, 0xb3, 0xb3, 0x22, 0xec, 0xae, 0x6f, ++ 0x89, 0x3b, 0x3f, 0x96, 0xe7, 0xc4, 0x57, 0x34, 0x68, 0x93, 0x03, 0x70, ++ 0xd7, 0x3f, 0x32, 0xea, 0xae, 0xef, 0x88, 0x3f, 0xa7, 0x54, 0x85, 0x03, ++ 0xfb, 0xab, 0x9c, 0xee, 0xfa, 0x87, 0xae, 0x5d, 0xaf, 0xdc, 0x3f, 0xaf, ++ 0x17, 0x99, 0x50, 0x91, 0xfc, 0xdd, 0x01, 0x72, 0x01, 0x7f, 0xf0, 0x63, ++ 0xc5, 0xe2, 0x00, 0x46, 0x71, 0x58, 0xc3, 0xda, 0x91, 0x8c, 0xd9, 0x39, ++ 0x43, 0xf0, 0xcc, 0xc9, 0xb9, 0x2e, 0xe3, 0xf9, 0xd4, 0xb5, 0xfb, 0x5a, ++ 0x79, 0x5f, 0x11, 0xef, 0x2b, 0x0e, 0x4b, 0x5c, 0xf7, 0xeb, 0x4b, 0xb9, ++ 0xdf, 0x42, 0x45, 0xfa, 0x68, 0x1a, 0xce, 0xa7, 0x87, 0xe7, 0x48, 0x2d, ++ 0x63, 0x4b, 0xa6, 0x02, 0xdf, 0xdc, 0x63, 0x2e, 0x76, 0x2f, 0x34, 0x17, ++ 0x2f, 0x0b, 0x6d, 0x32, 0xfb, 0x2b, 0x45, 0xe7, 0x13, 0x38, 0x95, 0x94, ++ 0xb9, 0xb4, 0xd6, 0x53, 0xcc, 0x4f, 0x6f, 0x0f, 0x6d, 0x30, 0x53, 0x56, ++ 0xfc, 0xa0, 0xdd, 0x73, 0x8e, 0x13, 0x29, 0xb1, 0xa3, 0x4d, 0x9d, 0x5e, ++ 0xe6, 0xb0, 0xf2, 0xec, 0xf1, 0x18, 0xed, 0xe3, 0x70, 0x6a, 0xd7, 0x1c, ++ 0x79, 0xf6, 0x60, 0xae, 0x26, 0x72, 0xf8, 0x7f, 0xc9, 0x7c, 0x92, 0x64, ++ 0x70, 0x7c, 0x00, 0x00, 0x00 }; + + static const u32 bnx2_RXP_b09FwData[(0x0/4) + 1] = { 0x0 }; +-static const u32 bnx2_RXP_b09FwRodata[(0xf0/4) + 1] = { ++static const u32 bnx2_RXP_b09FwRodata[(0x124/4) + 1] = { ++ 0x0800330c, 0x0800330c, 0x080033e8, 0x080033bc, 0x080033a0, 0x080032f0, ++ 0x080032f0, 0x080032f0, 0x08003314, 0x80080100, 0x80080080, 0x80080000, + 0x5f865437, 0xe4ac62cc, 0x50103a45, 0x36621985, 0xbf14c0e8, 0x1bc27a1e, +- 0x84f4b556, 0x094ea6fe, 0x7dda01e7, 0xc04d7481, 0x80080100, 0x80080080, +- 0x80080000, 0x08004efc, 0x08004efc, 0x08004fd8, 0x08004fac, 0x08004f90, +- 0x08004ecc, 0x08004ecc, 0x08004ecc, 0x08004f04, 0x08007220, 0x0800726c, +- 0x0800722c, 0x08007150, 0x0800722c, 0x0800725c, 0x0800722c, 0x08007150, +- 0x08007150, 0x08007150, 0x08007150, 0x08007150, 0x08007150, 0x08007150, +- 0x08007150, 0x08007150, 0x08007150, 0x0800724c, 0x0800723c, 0x08007150, +- 0x08007150, 0x08007150, 0x08007150, 0x08007150, 0x08007150, 0x08007150, +- 0x08007150, 0x08007150, 0x08007150, 0x08007150, 0x08007150, 0x0800723c, +- 0x080077f4, 0x080076bc, 0x080077bc, 0x08007718, 0x080076e8, 0x080075a4, +- 0x00000000 }; ++ 0x84f4b556, 0x094ea6fe, 0x7dda01e7, 0xc04d7481, 0x080075fc, 0x08007648, ++ 0x08007608, 0x08007530, 0x08007608, 0x08007638, 0x08007608, 0x08007530, ++ 0x08007530, 0x08007530, 0x08007530, 0x08007530, 0x08007530, 0x08007530, ++ 0x08007530, 0x08007530, 0x08007530, 0x08007628, 0x08007618, 0x08007530, ++ 0x08007530, 0x08007530, 0x08007530, 0x08007530, 0x08007530, 0x08007530, ++ 0x08007530, 0x08007530, 0x08007530, 0x08007530, 0x08007530, 0x08007618, ++ 0x08007bf4, 0x08007a9c, 0x08007bbc, 0x08007a9c, 0x08007b8c, 0x08007984, ++ 0x08007a9c, 0x08007a9c, 0x08007a9c, 0x08007a9c, 0x08007a9c, 0x08007a9c, ++ 0x08007a9c, 0x08007a9c, 0x08007a9c, 0x08007a9c, 0x08007a9c, 0x08007a9c, ++ 0x08007ac4, 0x00000000 }; + + static struct fw_info bnx2_rxp_fw_09 = { +- /* Firmware version: 4.4.23 */ +- .ver_major = 0x4, +- .ver_minor = 0x4, +- .ver_fix = 0x17, +- +- .start_addr = 0x080031d0, ++ /* Firmware version: 5.0.0g */ ++ .ver_major = 0x5, ++ .ver_minor = 0x0, ++ .ver_fix = 0x0, ++ ++ .start_addr = 0x080031d8, + + .text_addr = 0x08000000, +- .text_len = 0x786c, ++ .text_len = 0x7c6c, + .text_index = 0x0, + .gz_text = bnx2_RXP_b09FwText, + .gz_text_len = sizeof(bnx2_RXP_b09FwText), +@@ -3158,548 +3250,558 @@ + .data_index = 0x0, + .data = bnx2_RXP_b09FwData, + +- .sbss_addr = 0x08007980, +- .sbss_len = 0x58, +- .sbss_index = 0x0, +- +- .bss_addr = 0x080079d8, +- .bss_len = 0x1c, +- .bss_index = 0x0, +- +- .rodata_addr = 0x0800786c, +- .rodata_len = 0xf0, ++ .sbss_addr = 0x08007dc0, ++ .sbss_len = 0x5c, ++ .sbss_index = 0x0, ++ ++ .bss_addr = 0x08007e20, ++ .bss_len = 0x60, ++ .bss_index = 0x0, ++ ++ .rodata_addr = 0x08007c6c, ++ .rodata_len = 0x124, + .rodata_index = 0x0, + .rodata = bnx2_RXP_b09FwRodata, + }; + + static u8 bnx2_xi_rv2p_proc1[] = { +- /* Date: 06/17/2008 16:52 */ +- 0xbd, 0x56, 0xcf, 0x6b, 0x1c, 0x75, 0x14, 0x7f, 0x3b, 0xbb, 0x33, 0x3b, +- 0x99, 0x9d, 0xdd, 0x99, 0xda, 0x34, 0x4c, 0xb7, 0x2b, 0xd9, 0x86, 0x5e, +- 0x36, 0x99, 0x62, 0xa2, 0x11, 0x0a, 0x46, 0x5b, 0x72, 0x09, 0xd8, 0x9e, +- 0x02, 0x95, 0x22, 0x82, 0x71, 0xa9, 0x3d, 0xd8, 0x96, 0xe2, 0x5f, 0xe0, +- 0x90, 0x9a, 0x08, 0x45, 0x0f, 0x0b, 0x36, 0x90, 0x20, 0x1a, 0x7b, 0x50, +- 0x09, 0x0a, 0x3b, 0x07, 0x41, 0x44, 0x2d, 0xa8, 0x88, 0x60, 0x3d, 0x08, +- 0x85, 0xda, 0x8b, 0x51, 0x8b, 0x8a, 0x07, 0x0f, 0x01, 0x8f, 0x9a, 0xf1, +- 0xfb, 0x7e, 0x7c, 0x37, 0x33, 0x93, 0xdd, 0x24, 0x27, 0x03, 0xed, 0x87, +- 0xf7, 0x9d, 0xf7, 0x7d, 0xdf, 0xf7, 0xde, 0xf7, 0xf3, 0x3e, 0xdf, 0xf5, +- 0x01, 0xc0, 0x80, 0x28, 0x1e, 0x55, 0x08, 0x87, 0x8c, 0xa2, 0xad, 0xa0, +- 0x00, 0xf0, 0x21, 0xf0, 0x9f, 0xe9, 0x92, 0x1d, 0x3d, 0x22, 0xf6, 0x04, +- 0x43, 0x34, 0xe1, 0xab, 0xff, 0xaf, 0xc2, 0xe9, 0x26, 0x62, 0x11, 0x4e, +- 0x1f, 0x47, 0x7c, 0x12, 0x6e, 0x37, 0x03, 0x85, 0xff, 0x26, 0x10, 0xa1, +- 0x3d, 0xdc, 0xfd, 0x24, 0xae, 0x50, 0xfc, 0x4d, 0xd9, 0xff, 0x63, 0x91, +- 0xf1, 0x54, 0x68, 0x73, 0x1c, 0x41, 0x38, 0xe9, 0x13, 0xdc, 0xed, 0xa0, +- 0x7d, 0xfe, 0x3c, 0x58, 0x18, 0xe7, 0x6d, 0xe5, 0x80, 0x76, 0xa3, 0x10, +- 0x9d, 0x94, 0xbc, 0x0c, 0xf6, 0xfb, 0xa9, 0xe3, 0xe1, 0x3a, 0xfc, 0x3c, +- 0x8b, 0xf6, 0x51, 0xe7, 0xd5, 0x0e, 0x62, 0x00, 0x97, 0x6c, 0x97, 0xeb, +- 0x19, 0xe5, 0xb0, 0x9b, 0xe3, 0xb8, 0x4f, 0xf9, 0x8e, 0x4b, 0x5c, 0x13, +- 0xe3, 0xfe, 0x99, 0x70, 0x5c, 0x8c, 0x97, 0x8e, 0xd3, 0x50, 0x71, 0x70, +- 0xdd, 0x92, 0xbc, 0xac, 0x5c, 0x5e, 0x96, 0xca, 0x43, 0xfa, 0x00, 0x3a, +- 0x0f, 0xc4, 0x23, 0xea, 0x5c, 0x8c, 0xbb, 0x25, 0x75, 0x03, 0x3c, 0xdf, +- 0x94, 0xf8, 0x31, 0xa2, 0x5b, 0xe0, 0x78, 0xea, 0x9f, 0xd4, 0xb1, 0x3b, +- 0x8e, 0xee, 0x53, 0x36, 0xff, 0x72, 0xa8, 0xbf, 0xeb, 0xfb, 0xc0, 0x73, +- 0x7e, 0x50, 0xe7, 0xa4, 0xfd, 0x61, 0x1f, 0xff, 0xef, 0x94, 0x7f, 0x36, +- 0x2e, 0xaf, 0x7f, 0xbb, 0xb3, 0xde, 0xea, 0xd7, 0x37, 0x33, 0xd7, 0xb7, +- 0x2f, 0xa5, 0x6f, 0x73, 0x70, 0xc2, 0x08, 0xc8, 0xaf, 0x04, 0x88, 0xc7, +- 0x54, 0x02, 0x88, 0x0f, 0x0b, 0x5e, 0x13, 0xbc, 0x25, 0xf8, 0xae, 0xe0, +- 0x11, 0xc1, 0x61, 0xc1, 0xc3, 0x82, 0x0f, 0x09, 0x6e, 0x09, 0xfa, 0x82, +- 0x9e, 0x60, 0x4d, 0xf0, 0x2f, 0x41, 0x57, 0xb0, 0x92, 0x8b, 0x57, 0x17, +- 0xb4, 0x05, 0x3f, 0x17, 0x7c, 0x22, 0xb7, 0xff, 0x68, 0x81, 0xf1, 0x81, +- 0xd8, 0x4f, 0x89, 0x7d, 0x41, 0x6c, 0x6c, 0xa8, 0xf0, 0x3e, 0xd3, 0xaf, +- 0x5b, 0xbd, 0xfb, 0xbd, 0xdb, 0x91, 0xef, 0x2d, 0xed, 0x67, 0x53, 0xff, +- 0x60, 0x3c, 0xed, 0xff, 0xd6, 0x1e, 0xfe, 0xec, 0x36, 0xdb, 0xea, 0xb7, +- 0xef, 0x66, 0xc2, 0x79, 0xbc, 0x29, 0xfb, 0x83, 0xee, 0x67, 0x03, 0xe6, +- 0x68, 0x26, 0xcc, 0xf3, 0xab, 0xdf, 0x1c, 0x3d, 0x2e, 0x73, 0x34, 0xbd, +- 0x8b, 0xbf, 0xcc, 0xd3, 0x33, 0xb2, 0x7f, 0x46, 0xf8, 0xd9, 0x18, 0xe0, +- 0x17, 0xa5, 0xe6, 0x95, 0xce, 0x1b, 0x30, 0x0f, 0x1f, 0x15, 0xda, 0x61, +- 0xc0, 0xfc, 0x89, 0xf6, 0xca, 0x0f, 0xf7, 0x0b, 0x7f, 0x5b, 0x9a, 0xc7, +- 0x59, 0xfe, 0x32, 0x0f, 0xad, 0x1c, 0x0f, 0x5f, 0xde, 0xe7, 0x1e, 0x2a, +- 0xb9, 0x7e, 0x5e, 0x56, 0xfe, 0x6c, 0x1a, 0x06, 0xe3, 0x1a, 0x63, 0xe8, +- 0x5a, 0x25, 0xc4, 0x69, 0xf7, 0x1b, 0x8e, 0x37, 0x4a, 0x75, 0xb8, 0xc1, +- 0x0a, 0xcd, 0x6d, 0x09, 0x56, 0xac, 0x21, 0x85, 0xff, 0x24, 0x6f, 0xb0, +- 0x5f, 0xdd, 0xfc, 0x9e, 0x30, 0x58, 0xbb, 0xc3, 0xfe, 0xf7, 0x9a, 0x9c, +- 0xf7, 0x33, 0x13, 0x90, 0xfb, 0xd3, 0xdf, 0x65, 0xde, 0x3d, 0xb4, 0xff, +- 0x2e, 0x44, 0xb1, 0x3e, 0x47, 0xf6, 0x5d, 0xd6, 0x73, 0xc4, 0x7f, 0x8b, +- 0x96, 0x4f, 0xf5, 0xde, 0x88, 0xc9, 0x1c, 0x76, 0x97, 0x7d, 0xfa, 0xfa, +- 0x7a, 0xac, 0xeb, 0x11, 0x5d, 0x19, 0xd7, 0xf5, 0xf3, 0xfe, 0x2a, 0x9d, +- 0x77, 0xb8, 0xbb, 0x9e, 0xe3, 0x49, 0xf3, 0x40, 0x3a, 0xbb, 0x95, 0xec, +- 0xe8, 0x6c, 0xba, 0x0f, 0x5a, 0x67, 0x6d, 0x58, 0x98, 0xf3, 0xe8, 0xdc, +- 0x9a, 0xc5, 0x61, 0x2e, 0x78, 0x8c, 0x17, 0x1d, 0xc6, 0xdf, 0x1c, 0xec, +- 0x53, 0x92, 0x5c, 0xaa, 0xb0, 0xfd, 0x42, 0x55, 0xcf, 0xb7, 0xde, 0xaf, +- 0xf3, 0xda, 0x2b, 0x1f, 0x3c, 0x5f, 0x9f, 0xa3, 0xf3, 0xd0, 0xe7, 0x65, +- 0x79, 0x31, 0xf8, 0x5c, 0xc6, 0xb6, 0x91, 0xed, 0xc3, 0xda, 0x24, 0x63, +- 0x69, 0x0a, 0xf3, 0xba, 0x9d, 0xf4, 0xe6, 0xbb, 0xe5, 0x93, 0xdf, 0x18, +- 0xb0, 0x3d, 0x2f, 0x3c, 0x9c, 0xa7, 0xb9, 0x54, 0xba, 0x63, 0x20, 0xd6, +- 0x21, 0xa2, 0x77, 0xc7, 0x70, 0xbe, 0x26, 0x5e, 0x14, 0x65, 0x5d, 0xdd, +- 0xc3, 0x58, 0x76, 0x9e, 0x37, 0x99, 0x77, 0x76, 0x96, 0xaf, 0xc7, 0x84, +- 0xaf, 0x4e, 0x77, 0xbd, 0xb3, 0xdf, 0x3c, 0x48, 0xc1, 0xbd, 0xfe, 0x6b, +- 0x3d, 0xd4, 0xef, 0xb2, 0xd6, 0x3d, 0xfa, 0xdc, 0x8d, 0x8a, 0x99, 0x3a, +- 0xcf, 0x40, 0xd8, 0xef, 0x7e, 0x3f, 0x16, 0x3d, 0x99, 0x16, 0x7d, 0x53, +- 0x97, 0x18, 0x65, 0xf6, 0xd5, 0x80, 0xf2, 0x29, 0xe7, 0xe6, 0xac, 0xd4, +- 0x9b, 0x9b, 0x45, 0x6b, 0x80, 0xde, 0x99, 0xfc, 0x7e, 0x2e, 0xcc, 0xe1, +- 0xb9, 0x76, 0xe3, 0x06, 0xcd, 0x7f, 0x19, 0xfe, 0x70, 0xf9, 0x5e, 0xda, +- 0x26, 0xda, 0xe6, 0xf0, 0x95, 0x4f, 0x33, 0xfd, 0x01, 0x38, 0xae, 0xdf, +- 0x97, 0xf4, 0x1c, 0x07, 0xd0, 0x9e, 0x3a, 0xe8, 0x7b, 0x99, 0xe6, 0x7d, +- 0x6d, 0x17, 0xef, 0xb5, 0x3e, 0x36, 0xc3, 0xf4, 0x9c, 0xe0, 0x3b, 0xc1, +- 0xf7, 0xcd, 0xfa, 0x54, 0xc9, 0xf7, 0x41, 0xbd, 0x9f, 0xba, 0xbe, 0x7e, +- 0xef, 0xe8, 0xaf, 0xdb, 0x07, 0xd3, 0xb3, 0x74, 0x9f, 0xfa, 0xe9, 0x99, +- 0x93, 0xd3, 0xa7, 0x7b, 0xdb, 0x3d, 0x7d, 0x32, 0xfb, 0xd5, 0xff, 0x7f, +- 0xe8, 0x36, 0xf7, 0xd3, 0x81, 0x74, 0x3d, 0x1b, 0x1b, 0xcc, 0x9f, 0xab, +- 0xa9, 0x79, 0x49, 0xdf, 0xff, 0x90, 0xf0, 0x45, 0xf9, 0x51, 0x1d, 0x5f, +- 0x6c, 0xef, 0xe8, 0x72, 0x9a, 0x7f, 0x2f, 0x0a, 0xff, 0x8d, 0x99, 0x75, +- 0xe6, 0x47, 0xfb, 0xf7, 0xdc, 0x7d, 0x4d, 0x85, 0xc8, 0x97, 0x57, 0x20, +- 0x96, 0x3c, 0xef, 0x67, 0xf2, 0xad, 0x8a, 0x2e, 0x95, 0xe1, 0x83, 0x58, +- 0xd7, 0xc5, 0x9f, 0x9b, 0x21, 0xe3, 0xfb, 0xe4, 0xef, 0xef, 0xf3, 0x2e, +- 0xf9, 0xf0, 0x5e, 0x4f, 0x7f, 0x3d, 0x8a, 0x37, 0x29, 0x3a, 0xb6, 0x20, +- 0x7a, 0xf2, 0x8b, 0xc3, 0x7a, 0xd5, 0x3e, 0x4b, 0xfc, 0x85, 0x11, 0xd1, +- 0x95, 0x76, 0x95, 0xed, 0x7a, 0x95, 0x7f, 0xef, 0x4e, 0x96, 0x5d, 0xf2, +- 0xab, 0x57, 0x19, 0x47, 0x2a, 0xb8, 0x2f, 0x80, 0x07, 0xe7, 0xc8, 0x3d, +- 0x5c, 0x75, 0xf9, 0x5d, 0x59, 0xbd, 0x23, 0x7a, 0xe7, 0xe9, 0xfe, 0x49, +- 0xbd, 0x8f, 0xe1, 0xfa, 0x88, 0xd2, 0x0f, 0xb6, 0x99, 0x17, 0x6e, 0x6f, +- 0x1e, 0xde, 0x91, 0xec, 0x9b, 0x5e, 0xba, 0xdf, 0x7a, 0x2e, 0x3b, 0xb9, +- 0x3e, 0xeb, 0x7b, 0x3a, 0x95, 0x68, 0xbd, 0x1d, 0x9b, 0xc3, 0x7c, 0x3d, +- 0xa8, 0x95, 0x99, 0x47, 0x8c, 0x2a, 0x8e, 0x51, 0xc6, 0x6d, 0x8d, 0x25, +- 0xd1, 0xaf, 0xa5, 0x45, 0x0a, 0x73, 0x6e, 0x49, 0xaf, 0xcf, 0xd2, 0xe0, +- 0xcc, 0x6f, 0x7c, 0x45, 0xeb, 0xb5, 0xb8, 0xc8, 0xeb, 0xe5, 0xb3, 0xba, +- 0x5f, 0x1e, 0xd5, 0xbf, 0xc2, 0xfd, 0x7a, 0xee, 0x26, 0xe3, 0xb3, 0xf0, +- 0x34, 0xa1, 0xb3, 0x22, 0x73, 0xbf, 0xea, 0xda, 0x84, 0x40, 0xfd, 0x32, +- 0x1e, 0xe5, 0xf7, 0xd4, 0x94, 0x77, 0x70, 0x28, 0x75, 0x8f, 0xf9, 0xf7, +- 0xea, 0xa0, 0xf7, 0x99, 0xd6, 0x6f, 0xfd, 0x9e, 0x16, 0x72, 0xbf, 0x5f, +- 0xab, 0x39, 0x7e, 0xbe, 0x34, 0x80, 0x9f, 0x87, 0x06, 0xf0, 0x3b, 0xaf, +- 0x87, 0x6d, 0x99, 0xff, 0x12, 0x98, 0x45, 0x7a, 0x08, 0xdd, 0xd2, 0x75, +- 0xba, 0x5f, 0x63, 0x89, 0x7f, 0x4f, 0xb8, 0xe6, 0x72, 0x81, 0xfa, 0xe6, +- 0x2e, 0xb3, 0x5f, 0x89, 0xd7, 0x03, 0x8d, 0xaf, 0x5d, 0xe7, 0x39, 0x33, +- 0xe0, 0x3f, 0xdd, 0xd1, 0x99, 0x07, 0x78, 0x0d, 0x00, 0x00, 0x00 }; ++ /* Date: 01/27/2009 19:01 */ ++#define XI_RV2P_PROC1_POST_WAIT_TIMEOUT_MSK 0xffff ++ 0xa5, 0x56, 0xdd, 0x6b, 0x1c, 0x55, 0x14, 0x3f, 0x33, 0xbb, 0x33, 0xb3, ++ 0xd9, 0x9d, 0xd9, 0x5d, 0x9a, 0x34, 0x8e, 0xb1, 0x34, 0xdb, 0x20, 0xca, ++ 0xa6, 0x13, 0xdd, 0x68, 0x1f, 0x04, 0x03, 0x2d, 0x01, 0x29, 0x98, 0xe2, ++ 0x43, 0xa0, 0x52, 0x8a, 0x60, 0x5c, 0xb4, 0x08, 0xf6, 0x2f, 0x10, 0xc1, ++ 0x21, 0x31, 0x11, 0xc4, 0xaf, 0x7d, 0xe8, 0x42, 0x02, 0x6a, 0x40, 0x50, ++ 0x09, 0x11, 0x77, 0xdf, 0x24, 0x16, 0x7c, 0x68, 0xf1, 0x41, 0xda, 0xa7, ++ 0x16, 0xd4, 0x97, 0x46, 0x11, 0xbf, 0x5e, 0x04, 0xd1, 0xc7, 0x9a, 0xf1, ++ 0x9e, 0x8f, 0xbb, 0x3b, 0x73, 0xb3, 0x9b, 0x14, 0x5c, 0x48, 0x7e, 0x9c, ++ 0x7b, 0xcf, 0x39, 0xf7, 0x7c, 0x9f, 0xa9, 0x02, 0x80, 0x0d, 0x71, 0x77, ++ 0x52, 0x21, 0x58, 0xb9, 0x5c, 0x01, 0x01, 0x60, 0x1b, 0xf8, 0xe7, 0xf8, ++ 0x44, 0xc7, 0x8f, 0x0a, 0x7d, 0x92, 0x21, 0x3e, 0x59, 0x55, 0xff, 0x2f, ++ 0xc3, 0xe9, 0x1a, 0x62, 0x0e, 0x4e, 0x9f, 0x40, 0x7c, 0x12, 0xbe, 0xae, ++ 0x85, 0x0a, 0xff, 0x4d, 0x20, 0x46, 0xfa, 0x68, 0xe7, 0xcb, 0x6e, 0x89, ++ 0xf4, 0xef, 0x8a, 0xfc, 0xf7, 0x39, 0xc6, 0x27, 0xa2, 0x02, 0xeb, 0x11, ++ 0x84, 0x99, 0x2a, 0xc1, 0xed, 0x16, 0xd2, 0xe7, 0xcf, 0x83, 0x8b, 0x7a, ++ 0xde, 0x53, 0x0c, 0x48, 0x1f, 0xb3, 0xe2, 0x19, 0xb1, 0xcb, 0x66, 0xbe, ++ 0x3b, 0xad, 0x0a, 0x9e, 0xc3, 0x8f, 0xf3, 0x48, 0xdf, 0x57, 0x7c, 0xa3, ++ 0x85, 0x38, 0x0e, 0x97, 0x0a, 0x3e, 0xfb, 0x53, 0x17, 0x9c, 0x64, 0xf5, ++ 0xbb, 0xd3, 0x28, 0xaf, 0x64, 0xa6, 0x45, 0xbf, 0x83, 0xfa, 0x7f, 0x4f, ++ 0x58, 0x3f, 0xea, 0x4d, 0xeb, 0xbb, 0x5f, 0xe9, 0xc3, 0x73, 0x57, 0xec, ++ 0x73, 0x0d, 0xfb, 0x5c, 0x65, 0x0f, 0xca, 0xaf, 0x00, 0xfb, 0x39, 0xaa, ++ 0xde, 0x45, 0xfa, 0xaf, 0xbe, 0xbe, 0x2e, 0xa2, 0x6f, 0xb1, 0xbc, 0xfa, ++ 0x13, 0xfb, 0x59, 0xee, 0x35, 0x25, 0xa7, 0xe3, 0x92, 0xb5, 0xd3, 0x8b, ++ 0xb4, 0x7f, 0x3a, 0xfe, 0xc8, 0x7f, 0x2b, 0xc9, 0xf2, 0xc3, 0x21, 0xfc, ++ 0x37, 0x15, 0x7f, 0x56, 0x2f, 0x9f, 0x7f, 0xdb, 0x3f, 0x1f, 0x18, 0x1f, ++ 0xc7, 0x88, 0xcf, 0x75, 0xf1, 0xe7, 0x29, 0x78, 0xd0, 0x0e, 0x89, 0x2f, ++ 0x0f, 0x21, 0xc5, 0x09, 0x62, 0xc4, 0xe3, 0x82, 0x2f, 0x09, 0x7e, 0x2e, ++ 0xb8, 0x2d, 0x08, 0xff, 0x13, 0xff, 0x1e, 0x72, 0x7e, 0x54, 0xf0, 0x01, ++ 0xe3, 0xfc, 0x9a, 0xe0, 0x23, 0x86, 0xfc, 0x71, 0x8b, 0xf1, 0x0f, 0xa1, ++ 0xe7, 0x85, 0x7e, 0xc6, 0x90, 0x8f, 0x81, 0xe3, 0x63, 0x19, 0x71, 0xfb, ++ 0x58, 0xea, 0x19, 0xf3, 0x2f, 0xf7, 0x75, 0xcd, 0x57, 0xa0, 0x38, 0xc2, ++ 0x74, 0x9a, 0xff, 0x83, 0x03, 0xf8, 0x99, 0x6d, 0xbe, 0x3e, 0x48, 0xae, ++ 0x9d, 0xb0, 0x1d, 0x57, 0x44, 0xbe, 0xd8, 0xb9, 0x3a, 0xa4, 0x7f, 0xe6, ++ 0xa2, 0x41, 0xfd, 0x52, 0x17, 0x3f, 0xbe, 0x92, 0xba, 0xdc, 0xb1, 0x9a, ++ 0x51, 0xc8, 0x79, 0xa5, 0x3c, 0x06, 0x52, 0x8f, 0x23, 0x46, 0x3d, 0x7b, ++ 0xaa, 0x9e, 0xa5, 0xae, 0xea, 0xba, 0xbe, 0xb2, 0x75, 0xc5, 0xf5, 0xe1, ++ 0x1a, 0xf5, 0x11, 0x1f, 0x12, 0x97, 0x92, 0xe1, 0xdf, 0xab, 0x09, 0x86, ++ 0x18, 0x7f, 0xb6, 0xcd, 0xb8, 0xc1, 0x18, 0xf9, 0x6e, 0x1e, 0xf1, 0x94, ++ 0xff, 0x0d, 0xeb, 0x9b, 0x04, 0x44, 0x3f, 0x6c, 0x53, 0x1f, 0xe5, 0xa1, ++ 0xed, 0x2a, 0x9b, 0xe1, 0x6e, 0xf2, 0x0e, 0xf3, 0x4d, 0x38, 0x37, 0x09, ++ 0xc3, 0x8d, 0x1b, 0xcc, 0xff, 0x5d, 0x8d, 0xed, 0x7e, 0x56, 0xe6, 0x53, ++ 0xff, 0xa7, 0xef, 0xa5, 0xff, 0x2a, 0x48, 0xff, 0x63, 0xc5, 0x5d, 0xfd, ++ 0x8e, 0xc8, 0xbd, 0xa2, 0xeb, 0x9b, 0x7f, 0xcb, 0x6e, 0x95, 0xfc, 0x7d, ++ 0xab, 0x4b, 0xe4, 0x98, 0xbf, 0x56, 0xa5, 0xdb, 0xb7, 0xbb, 0xda, 0x1f, ++ 0xe9, 0xf3, 0x69, 0xed, 0x3f, 0xcb, 0x07, 0x72, 0x6d, 0x3b, 0x3a, 0x7e, ++ 0x7c, 0x5e, 0x24, 0x3b, 0x46, 0x3b, 0x9b, 0x46, 0x3e, 0x6b, 0xf7, 0x34, ++ 0x07, 0xff, 0x4c, 0xfa, 0x73, 0x30, 0x1d, 0x1f, 0x3d, 0x07, 0x0b, 0xb0, ++ 0x74, 0xb6, 0x42, 0xf6, 0x94, 0x5d, 0x56, 0x73, 0xa1, 0xc2, 0xf8, 0x62, ++ 0x91, 0xf1, 0x97, 0x22, 0xc6, 0x2f, 0x49, 0x2e, 0x95, 0x98, 0x7e, 0x21, ++ 0x40, 0xbd, 0xa3, 0xea, 0x61, 0x2d, 0xaf, 0xed, 0x3a, 0xc8, 0x1e, 0x7c, ++ 0x5f, 0xbf, 0xa3, 0xed, 0xd0, 0xef, 0x65, 0xeb, 0x65, 0xf8, 0xbb, 0x8c, ++ 0x4d, 0x3b, 0x1b, 0x87, 0xfc, 0x2c, 0xe3, 0x46, 0x03, 0xed, 0xba, 0x9a, ++ 0xf4, 0xfa, 0xb0, 0x5e, 0x25, 0xbe, 0x29, 0x60, 0x7a, 0x51, 0xea, 0x73, ++ 0x91, 0xfa, 0xa7, 0xac, 0xae, 0x10, 0x27, 0x20, 0xa6, 0xbd, 0x60, 0x17, ++ 0xaf, 0x53, 0xbd, 0xe4, 0xe4, 0x5c, 0xe5, 0x67, 0x2a, 0xdb, 0x77, 0xbb, ++ 0x5c, 0x8f, 0x85, 0x6c, 0x1d, 0x3f, 0x9c, 0x9a, 0xaf, 0x69, 0x7f, 0xad, ++ 0x5e, 0xfd, 0xee, 0xcf, 0x53, 0x36, 0x1f, 0xb7, 0x5b, 0xda, 0x7f, 0x73, ++ 0x6f, 0x30, 0x7b, 0xdc, 0x90, 0x40, 0xcd, 0xca, 0xfd, 0x8c, 0xd9, 0x2f, ++ 0x83, 0xfa, 0xad, 0x6a, 0xf4, 0xcf, 0x11, 0xe9, 0xb7, 0x91, 0xce, 0x66, ++ 0xeb, 0xb0, 0x7e, 0x46, 0xfe, 0x2f, 0x64, 0x9e, 0x54, 0xa1, 0xb7, 0x97, ++ 0xb6, 0x91, 0x2e, 0x81, 0xf4, 0x61, 0x27, 0xce, 0x65, 0xf2, 0x70, 0x06, ++ 0x06, 0xce, 0x95, 0x0f, 0x45, 0x4f, 0x43, 0xe6, 0x8b, 0x9b, 0xda, 0x5f, ++ 0xc4, 0x5e, 0x06, 0xb2, 0xc3, 0x33, 0xe6, 0xc3, 0xdd, 0x3d, 0xdd, 0xef, ++ 0xcb, 0xee, 0x20, 0x7f, 0x3d, 0xf8, 0xcd, 0xe7, 0xfa, 0x68, 0x52, 0xbf, ++ 0x38, 0x63, 0x97, 0x77, 0x32, 0x79, 0x02, 0x38, 0xa1, 0xf7, 0x52, 0xda, ++ 0xae, 0xf4, 0x5e, 0x45, 0x7d, 0x21, 0x34, 0x67, 0xd3, 0xfb, 0xf5, 0xfd, ++ 0x44, 0xcf, 0xf5, 0x80, 0xfa, 0xa4, 0xbc, 0xaf, 0xef, 0xf4, 0x1c, 0xad, ++ 0x45, 0xe9, 0xfe, 0x1d, 0x93, 0xb9, 0x69, 0x03, 0xcf, 0xcd, 0x92, 0xe9, ++ 0xa7, 0xda, 0xb7, 0x83, 0xf3, 0xc5, 0xfe, 0xde, 0xd9, 0xbb, 0xb7, 0x39, ++ 0x7b, 0x58, 0xde, 0x8b, 0x46, 0xde, 0x6f, 0xf5, 0xe2, 0x68, 0x3b, 0x83, ++ 0xbe, 0x2b, 0x4e, 0x29, 0xbd, 0xc2, 0x2f, 0x73, 0xe1, 0x79, 0x9a, 0x77, ++ 0x67, 0x84, 0x6f, 0x2e, 0x55, 0xaf, 0x83, 0xf8, 0x62, 0xa3, 0xae, 0x0b, ++ 0xfb, 0xf8, 0xb2, 0x73, 0x4c, 0xfb, 0xb3, 0xb5, 0xc5, 0xf5, 0x71, 0x31, ++ 0xd5, 0xaf, 0xe9, 0xf9, 0x3f, 0x22, 0xf5, 0xa0, 0xf8, 0xc8, 0x8f, 0x9d, ++ 0xbd, 0xfe, 0xbe, 0x48, 0xd7, 0xd7, 0xa2, 0xd4, 0xb5, 0x3d, 0xb7, 0x49, ++ 0x7d, 0xe4, 0x35, 0x7f, 0x35, 0xf2, 0x35, 0x1b, 0x61, 0x9d, 0xbc, 0x0e, ++ 0x5d, 0xb1, 0xf3, 0x87, 0x8c, 0xbd, 0x81, 0xf4, 0xa1, 0x0b, 0x9f, 0x75, ++ 0xb5, 0x5f, 0x7c, 0x5d, 0x8b, 0x18, 0x3f, 0x8d, 0xa4, 0x9f, 0x7a, 0xfe, ++ 0xe1, 0xbb, 0x0b, 0xf2, 0x6e, 0x15, 0x3e, 0xe9, 0xed, 0x03, 0x9c, 0x6f, ++ 0x1e, 0x34, 0x64, 0x7e, 0x2e, 0xc9, 0x1c, 0xfb, 0xa9, 0xc8, 0x73, 0xb2, ++ 0xb9, 0x40, 0xf5, 0x0a, 0xe3, 0x32, 0xcf, 0x9a, 0x01, 0xd3, 0x13, 0x01, ++ 0x7f, 0x07, 0x37, 0x3c, 0x9f, 0xf8, 0x26, 0x02, 0xc6, 0xf1, 0x12, 0xca, ++ 0x85, 0xf0, 0xf3, 0x39, 0x62, 0x8f, 0xd6, 0x7d, 0xde, 0x73, 0xeb, 0x37, ++ 0x64, 0x9e, 0x54, 0x74, 0xdc, 0xc4, 0xcf, 0xc7, 0xf1, 0x7c, 0x5c, 0xcd, ++ 0x2d, 0xa6, 0xb9, 0x1e, 0xfc, 0x5e, 0xfd, 0x7f, 0x24, 0x59, 0xa9, 0x55, ++ 0xd2, 0x71, 0xd6, 0xfd, 0xf6, 0xae, 0x11, 0x5f, 0x9d, 0x9f, 0x87, 0x12, ++ 0x3d, 0xe7, 0xa7, 0xce, 0xa2, 0xbd, 0x15, 0x28, 0x7b, 0x5c, 0x3f, 0x8c, ++ 0x4a, 0x8f, 0xed, 0xa1, 0xd8, 0xb1, 0x55, 0x99, 0x9b, 0xab, 0xcb, 0xa4, ++ 0xe6, 0xdc, 0xaa, 0x3e, 0x9f, 0xa7, 0x86, 0x59, 0xdc, 0xba, 0x46, 0xe7, ++ 0xe5, 0x6e, 0x8e, 0xcf, 0xbd, 0x05, 0x1d, 0xaf, 0x0a, 0xf9, 0xdf, 0xe6, ++ 0x78, 0x3d, 0x77, 0x85, 0xf1, 0x22, 0x3c, 0x4d, 0x58, 0x6c, 0x4b, 0x9f, ++ 0xaf, 0xfb, 0x05, 0x42, 0xa0, 0x78, 0xd9, 0x8f, 0xf1, 0x7e, 0x77, 0x64, ++ 0x2f, 0x17, 0x52, 0xf9, 0x33, 0xf7, 0xe4, 0x41, 0x79, 0x3c, 0x62, 0xec, ++ 0x0b, 0xbd, 0xd7, 0x2d, 0xe3, 0xfb, 0x36, 0x30, 0xea, 0xf1, 0xe5, 0x21, ++ 0xf5, 0x08, 0x43, 0xea, 0xd9, 0x9c, 0x6f, 0x4b, 0xd2, 0xef, 0x79, 0x70, ++ 0x72, 0xb4, 0x78, 0xfd, 0xfc, 0x0a, 0xe5, 0xd5, 0x5e, 0xe5, 0xef, 0x1a, ++ 0xdf, 0x59, 0xb3, 0x28, 0x5e, 0xfe, 0x1a, 0xf3, 0xe5, 0xf9, 0x3c, 0xd4, ++ 0xf8, 0xe6, 0x0a, 0xf7, 0x95, 0x0d, 0xff, 0x01, 0xd7, 0x0e, 0x41, 0x60, ++ 0x88, 0x0d, 0x00, 0x00, 0x00 }; + + static u8 bnx2_xi_rv2p_proc2[] = { +- /* Date: 06/17/2008 16:52 */ ++ /* Date: 01/27/2009 19:01 */ + #define XI_RV2P_PROC2_MAX_BD_PAGE_LOC 5 + #define XI_RV2P_PROC2_BD_PAGE_SIZE_MSK 0xffff + #define XI_RV2P_PROC2_BD_PAGE_SIZE ((BCM_PAGE_SIZE / 16) - 1) +- 0xad, 0x58, 0x4d, 0x4c, 0x54, 0x57, 0x14, 0xbe, 0xf3, 0xc3, 0xcc, 0x30, +- 0xbc, 0x99, 0x41, 0x98, 0x0e, 0x7f, 0xa6, 0x22, 0x28, 0x82, 0x1d, 0x14, +- 0x06, 0xd4, 0xb6, 0x36, 0xa9, 0xc1, 0x06, 0xb5, 0xb5, 0x11, 0x69, 0x63, +- 0xba, 0x68, 0x8a, 0x60, 0x45, 0x06, 0xc1, 0x10, 0x31, 0x2e, 0xdc, 0x74, +- 0x02, 0x16, 0xbb, 0x98, 0x85, 0x98, 0xe2, 0x60, 0xd3, 0x18, 0x52, 0x37, +- 0xa6, 0x3b, 0x92, 0xb6, 0x62, 0xbb, 0x30, 0x31, 0x2d, 0xb1, 0xb6, 0x89, +- 0x36, 0xb1, 0x7f, 0x9b, 0xa6, 0xa6, 0x5a, 0x8a, 0x4a, 0x2d, 0xda, 0xb2, +- 0xaa, 0xd0, 0x77, 0xcf, 0x77, 0xee, 0x9b, 0x37, 0x33, 0x6f, 0x44, 0x53, +- 0xd9, 0x1c, 0xee, 0x7d, 0xe7, 0x9e, 0x7b, 0xce, 0x77, 0x7e, 0xef, 0xe4, +- 0x0b, 0x21, 0x9c, 0x22, 0x36, 0xbe, 0x4c, 0xa7, 0x62, 0x89, 0xdd, 0xe1, +- 0xd1, 0xc9, 0x82, 0x10, 0x39, 0xc5, 0x72, 0x2d, 0xec, 0x82, 0xff, 0x56, +- 0xe7, 0x13, 0xb9, 0x36, 0x2e, 0xbf, 0xbb, 0xc5, 0xeb, 0x76, 0x7c, 0x77, +- 0x0a, 0x49, 0x03, 0x42, 0xc4, 0x24, 0xcd, 0x67, 0xba, 0x9d, 0xe9, 0x4a, +- 0x1b, 0xe8, 0x46, 0xa6, 0x51, 0xa6, 0x2b, 0x98, 0xd6, 0xdb, 0x41, 0x57, +- 0x31, 0xad, 0xe6, 0x7d, 0x8d, 0xcf, 0xd7, 0xf2, 0xfe, 0x7b, 0x4c, 0x8f, +- 0xf2, 0xbe, 0xa6, 0xf3, 0x29, 0xbd, 0xe4, 0x7a, 0x66, 0x41, 0xc4, 0xf4, +- 0x33, 0x42, 0xdf, 0xae, 0x51, 0xfb, 0x1a, 0x91, 0x58, 0x0d, 0xf4, 0x7e, +- 0xad, 0x5c, 0xf2, 0xfd, 0x61, 0xc1, 0x27, 0xf7, 0x6f, 0x2e, 0x28, 0x79, +- 0x03, 0x0e, 0xb9, 0xfe, 0x55, 0x5f, 0xdb, 0xe4, 0x32, 0x18, 0x82, 0x98, +- 0x60, 0x71, 0x5c, 0xca, 0x71, 0x88, 0xd1, 0x61, 0x0f, 0xa1, 0x72, 0x52, +- 0xc3, 0x3a, 0x46, 0x78, 0xd8, 0xf4, 0x35, 0xcb, 0x63, 0x5a, 0xe2, 0xc3, +- 0xbd, 0xbb, 0xca, 0x71, 0xdf, 0x8f, 0xcf, 0x80, 0x2f, 0x16, 0x50, 0x80, +- 0xe2, 0xfb, 0x32, 0xc1, 0xdf, 0xf7, 0xcb, 0xf5, 0xac, 0xad, 0xd0, 0x06, +- 0x5c, 0xdd, 0xcc, 0x65, 0xcf, 0x91, 0xfb, 0xcb, 0x1b, 0x4f, 0x0e, 0x83, +- 0xbf, 0xad, 0x1c, 0xfb, 0x4f, 0x87, 0xa5, 0x3c, 0x97, 0x88, 0x31, 0x15, +- 0xb5, 0xa4, 0x97, 0x2d, 0x56, 0x9b, 0x2a, 0xff, 0x97, 0x61, 0xac, 0xda, +- 0x7d, 0x90, 0xeb, 0x4d, 0x91, 0x1b, 0xca, 0x90, 0xfb, 0x53, 0xae, 0x59, +- 0xbe, 0xdf, 0x06, 0xf9, 0xde, 0x45, 0xe5, 0x77, 0xf8, 0x40, 0x0b, 0xc3, +- 0x56, 0xf7, 0xe4, 0x2e, 0xa2, 0x7f, 0xf7, 0xa2, 0xf2, 0x8f, 0x18, 0xfa, +- 0x2b, 0xff, 0xa9, 0xef, 0xe9, 0x38, 0xd2, 0xf2, 0xe3, 0xd8, 0x5a, 0x16, +- 0xb3, 0x5a, 0xd9, 0xcf, 0x7a, 0x3a, 0x40, 0x37, 0x85, 0x89, 0xc4, 0xf7, +- 0x70, 0x80, 0x37, 0x57, 0xc9, 0xfb, 0x0b, 0x84, 0xd3, 0x2e, 0xe5, 0xd5, +- 0x79, 0x5c, 0xe7, 0xb1, 0xff, 0x06, 0xfb, 0xeb, 0x6d, 0x36, 0xe8, 0xa6, +- 0x57, 0x02, 0xb4, 0xb0, 0xd0, 0x99, 0xc7, 0xf2, 0xd9, 0xdf, 0xb1, 0x3c, +- 0x9c, 0x9f, 0xd4, 0xa4, 0x9e, 0x5f, 0xeb, 0xf1, 0x63, 0xe5, 0x7f, 0xc7, +- 0x43, 0xfc, 0x8f, 0xf3, 0x4b, 0x56, 0xe1, 0xeb, 0xf1, 0x4e, 0xac, 0xcb, +- 0xce, 0xe4, 0x13, 0x4e, 0xa3, 0xe3, 0x56, 0xf1, 0x92, 0x2e, 0x5f, 0xcf, +- 0xe3, 0x00, 0xee, 0x11, 0x15, 0x1e, 0x52, 0x0e, 0xf8, 0xea, 0x3c, 0xb5, +- 0x96, 0x38, 0x89, 0x93, 0x2b, 0xe5, 0xbe, 0x5d, 0xb4, 0x3a, 0x34, 0xba, +- 0xa7, 0x35, 0xaa, 0xf2, 0x06, 0xdf, 0x3b, 0x5d, 0x44, 0x8a, 0xdb, 0x87, +- 0xa4, 0xdd, 0x01, 0xb1, 0xdb, 0x1e, 0x20, 0x7e, 0xe0, 0xe4, 0xf0, 0x68, +- 0x9f, 0x81, 0xff, 0xc2, 0x32, 0x8d, 0x6c, 0xea, 0x6c, 0xc0, 0xb9, 0x60, +- 0x04, 0x74, 0x24, 0x92, 0x23, 0x49, 0xb8, 0xb3, 0x9f, 0x96, 0x6b, 0x7e, +- 0xab, 0xf7, 0x10, 0x5f, 0xac, 0x56, 0xe5, 0xa5, 0xf2, 0xa3, 0xc4, 0xed, +- 0x90, 0x91, 0x87, 0xa2, 0x12, 0x38, 0xff, 0xbe, 0x52, 0xf2, 0xeb, 0x60, +- 0x57, 0xe0, 0x9e, 0xa4, 0x7e, 0xe6, 0xbc, 0xee, 0x35, 0xe5, 0xf5, 0xe3, +- 0xc5, 0xc5, 0x26, 0xc2, 0x67, 0x13, 0xe3, 0x54, 0xce, 0x71, 0xb8, 0xd4, +- 0x22, 0x0e, 0x03, 0xf4, 0xff, 0xad, 0xa6, 0x7c, 0xc2, 0x79, 0x07, 0xf6, +- 0x4f, 0x34, 0x9f, 0x83, 0x9f, 0xb6, 0x11, 0x1e, 0xc2, 0x7b, 0xf4, 0x53, +- 0x9c, 0x6a, 0xa7, 0xfc, 0xef, 0x6d, 0xec, 0xfc, 0x1c, 0xeb, 0x0e, 0x87, +- 0x5c, 0xef, 0xd7, 0xf6, 0x4c, 0x80, 0x3f, 0x67, 0x10, 0xb8, 0xef, 0xe0, +- 0x5b, 0xb6, 0x39, 0xa8, 0xde, 0xc4, 0x5d, 0x83, 0xb4, 0xd4, 0x26, 0xe9, +- 0x7b, 0xbe, 0x38, 0x36, 0x8e, 0xef, 0x07, 0xf2, 0xa4, 0x9d, 0xaf, 0x1a, +- 0x75, 0x29, 0xea, 0xc2, 0xf9, 0xf8, 0x30, 0xea, 0xca, 0xf4, 0x27, 0x72, +- 0xdd, 0x16, 0x9e, 0x06, 0x7f, 0x38, 0x3a, 0xc4, 0x82, 0xed, 0xc0, 0xf1, +- 0x96, 0x1d, 0xfc, 0x1c, 0xae, 0x5e, 0x27, 0xf9, 0xd1, 0x26, 0xb4, 0x66, +- 0xd0, 0x77, 0xe9, 0xfb, 0xbf, 0xb6, 0x38, 0xe1, 0xb6, 0xcb, 0xef, 0x3c, +- 0xa7, 0xf0, 0x61, 0x1a, 0x50, 0x76, 0x81, 0x3e, 0x6a, 0x3e, 0x0c, 0x69, +- 0xd9, 0xf2, 0x80, 0xfd, 0x59, 0xb3, 0x58, 0x1e, 0x80, 0x36, 0x57, 0x81, +- 0xba, 0x2a, 0xa9, 0x9e, 0x3c, 0x46, 0x3e, 0xb0, 0x5e, 0x19, 0xf9, 0x86, +- 0xdd, 0x64, 0x9c, 0x12, 0xd1, 0xe3, 0x33, 0x25, 0x5e, 0x39, 0x3f, 0x96, +- 0xeb, 0x7e, 0x50, 0x71, 0x27, 0x05, 0xba, 0xc5, 0x7e, 0x96, 0x1b, 0x65, +- 0x3c, 0x7a, 0x18, 0x8f, 0x19, 0xa6, 0x07, 0xf2, 0x14, 0x0e, 0xa0, 0xc7, +- 0x34, 0xdc, 0xdb, 0x1a, 0x95, 0x7e, 0x0c, 0x5a, 0xf4, 0x17, 0xd5, 0x47, +- 0xe0, 0xa7, 0x51, 0xf6, 0xeb, 0x29, 0xa3, 0x9f, 0x28, 0x7c, 0xb3, 0xf5, +- 0x95, 0xd4, 0x7c, 0x4a, 0xb3, 0x33, 0xfe, 0x55, 0x05, 0x8e, 0x17, 0x54, +- 0x82, 0x1a, 0xf8, 0x56, 0x51, 0x1e, 0xfb, 0x8b, 0x26, 0x94, 0x7d, 0x52, +- 0xbf, 0x3b, 0x2a, 0x0f, 0xfd, 0x89, 0x01, 0xa2, 0xde, 0x82, 0x33, 0xf2, +- 0x9e, 0x52, 0x8b, 0xba, 0x92, 0x9a, 0xcf, 0xe9, 0xf8, 0x1e, 0xf0, 0x51, +- 0xc1, 0x6d, 0xbc, 0x32, 0x95, 0x9a, 0xb7, 0xc8, 0x4f, 0xb7, 0x11, 0xdf, +- 0xc1, 0xf5, 0xec, 0x07, 0xa6, 0xa1, 0x0d, 0x52, 0x6e, 0x0b, 0xdf, 0x53, +- 0xc7, 0xf7, 0x68, 0xa6, 0xba, 0x21, 0xf5, 0xfc, 0x73, 0x5e, 0xd5, 0x0b, +- 0x15, 0x1f, 0xc9, 0xba, 0xa1, 0xfc, 0x40, 0xf7, 0x87, 0xaf, 0x4c, 0xc9, +- 0xf3, 0x65, 0x8b, 0xd4, 0x91, 0x1b, 0x86, 0xbc, 0xef, 0x8d, 0x3a, 0x21, +- 0xbf, 0xe7, 0x89, 0x17, 0x79, 0x99, 0x5a, 0x0f, 0xff, 0xd2, 0xeb, 0x21, +- 0xd9, 0xe1, 0xd1, 0xce, 0x71, 0xfd, 0xeb, 0x97, 0xf7, 0x14, 0xb3, 0xde, +- 0xc5, 0xaa, 0xaf, 0xe9, 0x7a, 0x73, 0x9d, 0x6c, 0x33, 0xd7, 0xbb, 0x1f, +- 0xe6, 0x93, 0x75, 0x4b, 0xae, 0xaf, 0xcd, 0x67, 0xce, 0x27, 0x96, 0xb8, +- 0xc6, 0x44, 0x00, 0x73, 0x58, 0x2c, 0x20, 0xcf, 0xe5, 0xd8, 0x32, 0xeb, +- 0x5f, 0xba, 0x1d, 0xc0, 0xa5, 0xdd, 0xee, 0x23, 0xbe, 0xeb, 0x7d, 0xf2, +- 0xdc, 0xb4, 0x50, 0xf6, 0xa2, 0x0e, 0x96, 0x73, 0xbf, 0x5f, 0xca, 0x7a, +- 0xeb, 0xf2, 0x6a, 0x29, 0x1f, 0x3c, 0xd7, 0xfb, 0xcc, 0x7a, 0x5f, 0x98, +- 0xcf, 0x7e, 0x9f, 0x75, 0x1c, 0xf4, 0x71, 0x9f, 0xe5, 0x39, 0xc1, 0xb3, +- 0xe7, 0x0b, 0xa5, 0x17, 0xdf, 0x1f, 0x50, 0x7a, 0x68, 0xe4, 0xa7, 0xa9, +- 0x7e, 0x29, 0xa7, 0x50, 0x70, 0xd8, 0x88, 0xde, 0x6a, 0xd4, 0xdf, 0x99, +- 0xbd, 0xb0, 0xa3, 0xb7, 0x4a, 0xea, 0xa1, 0x7b, 0x25, 0x86, 0x3c, 0x17, +- 0xdc, 0x8f, 0xbe, 0x1c, 0xb6, 0xf2, 0xeb, 0xb7, 0xcc, 0x17, 0x64, 0xfb, +- 0xf2, 0xd9, 0xbe, 0xb0, 0x48, 0xaf, 0xf3, 0x6d, 0xe5, 0xd4, 0x0f, 0x98, +- 0xef, 0x05, 0xd5, 0x0f, 0x74, 0x3e, 0xc2, 0x99, 0xe5, 0x58, 0xe1, 0x64, +- 0x25, 0x67, 0x82, 0xe3, 0xa0, 0x8b, 0xf9, 0x9c, 0x59, 0xe7, 0x9b, 0xb9, +- 0x55, 0xd4, 0x57, 0x4e, 0x1f, 0xa1, 0xfe, 0xe0, 0x33, 0xe2, 0x34, 0xd5, +- 0x8e, 0xe3, 0x4f, 0x10, 0x77, 0x9a, 0xff, 0xc4, 0x3e, 0x7f, 0x36, 0x7c, +- 0x9d, 0x72, 0x7b, 0x6c, 0x76, 0x42, 0xf9, 0x47, 0x23, 0x7b, 0xa7, 0xfa, +- 0xd5, 0x9c, 0x6f, 0xc6, 0xdd, 0x6e, 0xc2, 0x1d, 0xfc, 0x98, 0xef, 0xfe, +- 0x0f, 0xde, 0x56, 0xf3, 0x41, 0x9f, 0x91, 0x9f, 0x03, 0x2e, 0xab, 0xfa, +- 0xbf, 0xd6, 0x88, 0x97, 0x83, 0x3c, 0xe7, 0xcd, 0x69, 0xf4, 0x4f, 0x64, +- 0x26, 0x4e, 0x4b, 0xad, 0xe4, 0xac, 0xe4, 0x5b, 0x1d, 0x39, 0xc8, 0x76, +- 0x5d, 0x76, 0xc0, 0xee, 0xae, 0xbd, 0x58, 0x5f, 0xe1, 0x7a, 0x7d, 0x8f, +- 0xeb, 0xe3, 0x4e, 0x0f, 0xe8, 0x4c, 0x35, 0xe1, 0x11, 0x39, 0x78, 0x5e, +- 0xc9, 0x27, 0xb9, 0xda, 0x1c, 0xe3, 0xf9, 0x92, 0x83, 0xed, 0xac, 0x20, +- 0x3f, 0x46, 0xee, 0x52, 0x3d, 0x70, 0x8a, 0xa6, 0xe5, 0x92, 0x96, 0xe8, +- 0xb8, 0xb1, 0x3e, 0x1b, 0x41, 0x5b, 0xd5, 0x80, 0x5f, 0x93, 0xee, 0x67, +- 0x6c, 0xbb, 0x2a, 0xf8, 0x7c, 0x3b, 0xd6, 0x6e, 0xae, 0x67, 0x09, 0xd6, +- 0xeb, 0xfd, 0x6a, 0x50, 0x7f, 0x0d, 0xe6, 0x84, 0x29, 0xea, 0x0b, 0x81, +- 0x48, 0xff, 0x04, 0xec, 0xe9, 0xd9, 0x0c, 0x7b, 0xef, 0x33, 0x0e, 0x4c, +- 0xfd, 0xa7, 0x06, 0xa9, 0xef, 0xf8, 0x87, 0x30, 0x67, 0xf8, 0x5d, 0x83, +- 0xb0, 0xa3, 0x67, 0x0e, 0xeb, 0xfb, 0xcf, 0x81, 0xfe, 0xf3, 0x3c, 0xce, +- 0x1d, 0x3a, 0xc2, 0xf8, 0x6c, 0xb6, 0x3e, 0xd7, 0xf5, 0x37, 0xf8, 0x7a, +- 0xab, 0xe5, 0xfd, 0x6f, 0x8d, 0xf1, 0xfc, 0x21, 0xa2, 0x34, 0xef, 0xbc, +- 0xa9, 0xcd, 0xf1, 0xba, 0x9b, 0xfb, 0xe2, 0x6d, 0x9e, 0x17, 0x7a, 0xd2, +- 0xe6, 0x85, 0x69, 0xd4, 0xe9, 0xb1, 0xb9, 0xb8, 0xdc, 0xd0, 0xeb, 0x65, +- 0xae, 0x95, 0x7f, 0x7d, 0x91, 0x22, 0xf6, 0x5b, 0x70, 0x1d, 0xe8, 0xc8, +- 0x3a, 0xf4, 0xeb, 0x9e, 0xc3, 0x8c, 0x4f, 0x23, 0xf9, 0x69, 0xcd, 0xec, +- 0x44, 0xfa, 0x79, 0x19, 0x3f, 0xed, 0xf3, 0x78, 0x3f, 0x6e, 0xd6, 0xa9, +- 0xba, 0x0f, 0xe7, 0x3a, 0xe8, 0x7d, 0x71, 0xcf, 0x98, 0x3f, 0xa7, 0x49, +- 0xff, 0xb2, 0xb1, 0x39, 0x92, 0x53, 0x2a, 0x0a, 0x29, 0x0e, 0x4b, 0xfc, +- 0xb3, 0xb0, 0x27, 0x92, 0x60, 0x1c, 0xfa, 0x9e, 0x05, 0x3d, 0xcc, 0x71, +- 0xa0, 0xfc, 0x7b, 0x75, 0x83, 0x46, 0xe7, 0xa6, 0xfa, 0x71, 0x8f, 0xca, +- 0xa3, 0xf4, 0xb9, 0x58, 0xc5, 0x45, 0x49, 0x03, 0xad, 0x45, 0xd7, 0x21, +- 0xb2, 0x53, 0xf7, 0xa7, 0x8c, 0x27, 0x1d, 0x2b, 0xee, 0xdb, 0xa9, 0xf1, +- 0x22, 0xe3, 0x49, 0xc5, 0xad, 0x39, 0xce, 0xcc, 0x71, 0x94, 0x1a, 0x3f, +- 0x7e, 0xea, 0x2f, 0x7a, 0x31, 0xa0, 0x77, 0x89, 0x2b, 0x92, 0x18, 0x7e, +- 0x38, 0x8e, 0xa7, 0x80, 0x63, 0x84, 0xf5, 0xd6, 0xa2, 0x34, 0x8f, 0x3e, +- 0x25, 0x86, 0xd8, 0x9f, 0xd3, 0xd5, 0x9c, 0xff, 0x15, 0xf0, 0x67, 0xdf, +- 0x0a, 0xe8, 0xd3, 0xc7, 0x79, 0x74, 0x87, 0xe7, 0x0c, 0xc4, 0x81, 0x5b, +- 0xeb, 0x9c, 0x60, 0xbf, 0x73, 0x3c, 0x76, 0x33, 0x0e, 0xb7, 0x81, 0x83, +- 0xa6, 0x70, 0x88, 0x1a, 0x38, 0xa8, 0x7a, 0x63, 0x96, 0x53, 0xa0, 0xc7, +- 0x93, 0xa4, 0x4b, 0xb4, 0xab, 0x34, 0x8f, 0xe5, 0xb0, 0xdd, 0x3a, 0x5f, +- 0x83, 0xb4, 0xcf, 0xcf, 0xf6, 0xf9, 0xc4, 0xbe, 0x35, 0xe6, 0x73, 0x79, +- 0x7c, 0xce, 0xab, 0x9f, 0xc3, 0x3e, 0xf2, 0x55, 0xcb, 0x82, 0xaf, 0xc4, +- 0x51, 0xc9, 0x4d, 0xcf, 0x4b, 0x33, 0x9e, 0x54, 0xa9, 0xe9, 0x0f, 0xf5, +- 0x48, 0xf7, 0x1b, 0xd5, 0x2d, 0xcd, 0xa8, 0x43, 0xf7, 0xa8, 0xae, 0x7b, +- 0x4f, 0xf7, 0xa2, 0x6e, 0x9c, 0xee, 0x3d, 0xcb, 0x7d, 0x98, 0x71, 0x69, +- 0xa1, 0xf7, 0x83, 0x8e, 0x5d, 0x45, 0x6a, 0x1d, 0x4a, 0xd5, 0xa3, 0xcc, +- 0xa4, 0x87, 0xba, 0x77, 0xb1, 0x39, 0x01, 0x73, 0xea, 0x16, 0x9a, 0x13, +- 0x3c, 0xc6, 0xbc, 0x9d, 0xda, 0x4f, 0x26, 0x1f, 0x3c, 0x6e, 0x3f, 0xd9, +- 0xd9, 0x60, 0xbe, 0xaf, 0x46, 0x4c, 0x8e, 0xe3, 0x9e, 0x16, 0xee, 0xdf, +- 0xbb, 0x39, 0xcf, 0xaf, 0x7b, 0x03, 0x74, 0x6f, 0xc7, 0x2b, 0x64, 0xaf, +- 0x08, 0xe5, 0xc1, 0xbe, 0x8e, 0xed, 0xf8, 0xde, 0xe1, 0xc3, 0x7e, 0xa9, +- 0x0f, 0xbf, 0xa3, 0xb4, 0xb8, 0x35, 0xe2, 0x2f, 0xf5, 0x81, 0x86, 0xb8, +- 0x3e, 0x4c, 0x1a, 0xef, 0x09, 0xd0, 0x51, 0x57, 0xb6, 0xf7, 0x04, 0xde, +- 0x65, 0x17, 0x5d, 0xa8, 0x1f, 0xa2, 0x06, 0x73, 0x74, 0x53, 0x95, 0x46, +- 0xdf, 0x5b, 0x6b, 0xd0, 0xa7, 0x51, 0x9f, 0x33, 0xed, 0x2a, 0x43, 0xbc, +- 0x96, 0x26, 0xdf, 0x1d, 0xe6, 0xf7, 0x89, 0x16, 0x49, 0x18, 0xf3, 0x7f, +- 0xaa, 0x1e, 0xc8, 0x33, 0x29, 0x9f, 0x96, 0xfa, 0x9c, 0xfd, 0x28, 0xef, +- 0x12, 0x07, 0xcf, 0x6d, 0x77, 0xf9, 0x77, 0x82, 0x42, 0x71, 0x69, 0x1c, +- 0x38, 0x4c, 0x8e, 0x5b, 0xe5, 0xb1, 0xd4, 0x43, 0xdd, 0x03, 0xbb, 0x94, +- 0x9d, 0xc9, 0x7b, 0xa1, 0xd7, 0x5e, 0xd6, 0xff, 0x06, 0xfd, 0x9e, 0x11, +- 0x62, 0x7b, 0xa5, 0x5c, 0xec, 0x6f, 0xa5, 0xf7, 0x53, 0x8e, 0x88, 0x19, +- 0xeb, 0xd4, 0x77, 0x4d, 0x0b, 0xe9, 0x55, 0xc0, 0xfd, 0x3d, 0x64, 0x9a, +- 0x43, 0xc0, 0x1f, 0xac, 0x03, 0x1d, 0xa9, 0x53, 0x7e, 0x53, 0xfe, 0x55, +- 0xfe, 0x84, 0xdf, 0x43, 0xf5, 0xc4, 0xd6, 0xd8, 0x51, 0x4f, 0x09, 0x5f, +- 0xd7, 0x31, 0xab, 0xfa, 0x3d, 0xce, 0xef, 0x0c, 0x4b, 0xfe, 0x77, 0xc4, +- 0x77, 0x61, 0x34, 0xd8, 0x9f, 0x99, 0x26, 0xe7, 0x7c, 0xc1, 0x7f, 0xe6, +- 0xf7, 0x82, 0x43, 0x5c, 0xcc, 0xe1, 0xed, 0x06, 0x35, 0xff, 0x66, 0x7b, +- 0xf7, 0x48, 0x3b, 0xba, 0x1f, 0xa4, 0xcf, 0xd3, 0xc9, 0x79, 0x58, 0xd9, +- 0x2b, 0xcf, 0xd5, 0x71, 0x1c, 0x7b, 0x44, 0xd3, 0x16, 0xfc, 0xce, 0xe1, +- 0x77, 0x23, 0x6f, 0xfc, 0x6e, 0xab, 0xf7, 0xa9, 0x1e, 0x47, 0xb9, 0x54, +- 0x30, 0x96, 0x16, 0xe4, 0x92, 0x7d, 0x27, 0x2e, 0x7f, 0x43, 0x6c, 0x1f, +- 0x25, 0xf2, 0xb0, 0x5f, 0xd4, 0x84, 0x6b, 0x9c, 0x14, 0xf7, 0x0e, 0x71, +- 0x14, 0x79, 0xf1, 0xe1, 0x08, 0xe8, 0x07, 0xe2, 0x65, 0xc8, 0x29, 0x18, +- 0xa0, 0xbe, 0xea, 0x29, 0x02, 0xcc, 0xf1, 0x04, 0xc7, 0x7b, 0xb1, 0x9d, +- 0x7e, 0x87, 0x5d, 0x10, 0x3e, 0xfe, 0x9d, 0x8c, 0xf3, 0x17, 0x71, 0xed, +- 0x34, 0xf9, 0xff, 0x51, 0xe3, 0x1c, 0xfd, 0x33, 0xc1, 0x7e, 0xe7, 0x78, +- 0xf7, 0xa4, 0xc7, 0xbb, 0xc2, 0xa9, 0xd8, 0x6e, 0x19, 0xdf, 0xeb, 0x33, +- 0xe3, 0x5b, 0xe9, 0x97, 0xda, 0x3f, 0x33, 0xe5, 0xe3, 0x1d, 0x75, 0xe9, +- 0x89, 0xc5, 0x37, 0xe8, 0xd6, 0x4a, 0x79, 0x7f, 0x51, 0xc6, 0xbc, 0x9c, +- 0x9e, 0x7f, 0xa8, 0x77, 0xd5, 0x7a, 0x3c, 0xfc, 0x07, 0xd7, 0x0d, 0x36, +- 0x4f, 0xf0, 0x16, 0x00, 0x00, 0x00 }; ++ 0xad, 0x57, 0x4d, 0x68, 0x5c, 0x55, 0x14, 0xbe, 0x33, 0x6f, 0x7e, 0xde, ++ 0xcc, 0xbc, 0xc9, 0x4c, 0x93, 0x38, 0x99, 0x26, 0xc5, 0xa4, 0x09, 0x8d, ++ 0x4e, 0x9d, 0x69, 0x27, 0x3f, 0x44, 0xb0, 0x42, 0x43, 0x90, 0xb4, 0xb5, ++ 0x4a, 0xd3, 0x28, 0xc5, 0x5d, 0x92, 0xa9, 0x1d, 0x8c, 0x69, 0x23, 0x18, ++ 0x70, 0xe1, 0xc6, 0x47, 0x5a, 0xd3, 0xcd, 0x2c, 0x4c, 0x31, 0x3f, 0x8a, ++ 0xa0, 0xd8, 0x9d, 0xb8, 0x19, 0x50, 0xdb, 0x8a, 0x22, 0x14, 0x0c, 0x52, ++ 0x17, 0x45, 0xb0, 0x58, 0x37, 0x8a, 0x58, 0x1b, 0x1a, 0x11, 0x8d, 0x8b, ++ 0xae, 0x24, 0xe3, 0xbd, 0xe7, 0x3b, 0xf7, 0xcd, 0xbc, 0xc9, 0x8b, 0x89, ++ 0x62, 0x36, 0x27, 0xe7, 0xbe, 0x73, 0xcf, 0x39, 0xf7, 0x9c, 0xef, 0x7c, ++ 0xf7, 0x4e, 0x52, 0x08, 0x11, 0x10, 0x76, 0xb9, 0x5d, 0x4a, 0xe1, 0x33, ++ 0x0c, 0x53, 0x8a, 0x8a, 0x10, 0xc1, 0xb4, 0xd2, 0x85, 0x5f, 0xf0, 0xdf, ++ 0xfe, 0x24, 0x89, 0x6f, 0xcb, 0x96, 0x32, 0x13, 0x76, 0x46, 0xd9, 0x45, ++ 0xc4, 0xb3, 0xfe, 0x88, 0x94, 0x87, 0xc5, 0x68, 0x06, 0xf6, 0x01, 0xa1, ++ 0xa4, 0xb4, 0xb5, 0x95, 0xdc, 0xc5, 0xf2, 0x38, 0xcb, 0xc7, 0x7d, 0x90, ++ 0x87, 0x58, 0x3e, 0x56, 0x27, 0x05, 0xdb, 0x3d, 0xcd, 0xfa, 0x00, 0x4b, ++ 0x8b, 0xd7, 0x47, 0x59, 0xff, 0x90, 0xa5, 0xcd, 0xeb, 0x61, 0xd6, 0x1f, ++ 0xf0, 0xa9, 0x25, 0xe4, 0xab, 0xf4, 0xb5, 0x4a, 0x55, 0xb7, 0xe0, 0x3e, ++ 0x83, 0x73, 0x3c, 0xd3, 0xa1, 0xbe, 0xdf, 0xad, 0xb8, 0xed, 0xef, 0x38, ++ 0xfa, 0xac, 0xa1, 0xf4, 0x1f, 0xa5, 0xee, 0x53, 0x6a, 0x73, 0x0a, 0xdb, ++ 0x9b, 0xd3, 0x25, 0xb5, 0xdf, 0x10, 0xcb, 0xf3, 0x26, 0x55, 0x67, 0xd1, ++ 0x82, 0x6e, 0x97, 0x4d, 0xaa, 0xcb, 0xa2, 0xc5, 0xfe, 0x58, 0xee, 0x8e, ++ 0x23, 0xde, 0xa9, 0x0e, 0xd4, 0xed, 0xbb, 0x47, 0x60, 0x67, 0x27, 0x74, ++ 0x61, 0xf1, 0xbd, 0x5d, 0xf0, 0xf7, 0x29, 0xa5, 0xaf, 0xfb, 0x9a, 0x7c, ++ 0xa8, 0x47, 0x98, 0xad, 0xfc, 0x41, 0xb5, 0xbe, 0xb7, 0x7f, 0x71, 0x1e, ++ 0xf6, 0x63, 0x1d, 0x58, 0x7f, 0x30, 0xab, 0xfc, 0x85, 0x84, 0xcd, 0x52, ++ 0xe4, 0x28, 0x2f, 0x9f, 0x9d, 0x73, 0xfb, 0xff, 0x61, 0x1e, 0xda, 0x44, ++ 0x1c, 0x7e, 0xa3, 0x2e, 0xbf, 0xa9, 0x4d, 0x7e, 0x6f, 0x47, 0x6a, 0xfd, ++ 0x37, 0xf8, 0xe0, 0x3f, 0xba, 0xad, 0xff, 0x42, 0x1c, 0xb2, 0x29, 0xeb, ++ 0x15, 0x27, 0xb2, 0x4d, 0xfe, 0x2f, 0x6e, 0xeb, 0xff, 0x55, 0x27, 0x7f, ++ 0xbd, 0x5e, 0x5f, 0x3f, 0x52, 0x3f, 0xb0, 0x0f, 0xf2, 0xf6, 0xfd, 0xfa, ++ 0xdc, 0x9c, 0x9f, 0x01, 0x39, 0x98, 0x25, 0x51, 0x3a, 0xcd, 0x00, 0x1f, ++ 0xee, 0x56, 0x71, 0x1b, 0x45, 0xc0, 0xaf, 0xfc, 0x1d, 0x30, 0x43, 0xd7, ++ 0xb0, 0xfe, 0x1c, 0xf7, 0xe9, 0x79, 0x3e, 0xc8, 0x2f, 0x51, 0x55, 0x98, ++ 0x4a, 0xa5, 0x18, 0x63, 0xff, 0xdc, 0x67, 0x3b, 0x86, 0xfd, 0x2b, 0x96, ++ 0xca, 0xef, 0x86, 0xc4, 0x8d, 0x57, 0xdf, 0x8d, 0x7f, 0xe8, 0x3b, 0xf6, ++ 0xef, 0x7a, 0x08, 0x5f, 0xdf, 0x28, 0x42, 0x6f, 0xbb, 0x9c, 0xa4, 0xfa, ++ 0x2c, 0x97, 0xbd, 0x70, 0x52, 0xef, 0x5f, 0xce, 0x71, 0x02, 0x71, 0x44, ++ 0xa7, 0x49, 0xc9, 0xa1, 0xae, 0xd2, 0x26, 0xe7, 0x59, 0x27, 0xb1, 0xb8, ++ 0x4f, 0xcf, 0x05, 0xf4, 0x62, 0x88, 0x44, 0x7a, 0x62, 0x4e, 0x9d, 0x33, ++ 0x21, 0xc6, 0xfd, 0x2a, 0x61, 0x3f, 0xd7, 0xc5, 0x30, 0xad, 0x4f, 0x60, ++ 0xff, 0x45, 0xbb, 0x45, 0x67, 0x28, 0xf6, 0x61, 0x5f, 0x73, 0x2f, 0xe4, ++ 0x42, 0x6f, 0x50, 0x89, 0x6c, 0x71, 0x86, 0xd4, 0x03, 0x3f, 0xf7, 0x98, ++ 0x64, 0x67, 0xe7, 0xf4, 0xdc, 0xe9, 0xbe, 0xa9, 0x3a, 0xbd, 0x52, 0x9d, ++ 0xbf, 0x2e, 0xd4, 0xf5, 0xee, 0x3e, 0x65, 0x2f, 0x8b, 0xdb, 0x89, 0x38, ++ 0xa3, 0x93, 0x5e, 0x73, 0xfb, 0x92, 0x53, 0xdf, 0x9d, 0xf6, 0x7f, 0x90, ++ 0xea, 0x30, 0xc8, 0xf5, 0xe8, 0x60, 0x9c, 0xed, 0xf1, 0xc0, 0x59, 0x82, ++ 0xfe, 0x5f, 0x1b, 0x4a, 0x52, 0x3d, 0x4f, 0x60, 0xfd, 0xd2, 0xf0, 0x15, ++ 0xf4, 0xe3, 0x18, 0xd5, 0x41, 0x44, 0x2f, 0x7c, 0x8c, 0x5d, 0x13, 0x34, ++ 0xdf, 0xe7, 0xfa, 0x8b, 0x9f, 0x42, 0x2f, 0x18, 0x4a, 0x9f, 0xb2, 0x4e, ++ 0x5f, 0x85, 0x7d, 0xf0, 0x7c, 0x92, 0xea, 0x77, 0x82, 0xa3, 0x1c, 0x33, ++ 0x88, 0x4f, 0x4a, 0xa1, 0xf3, 0xa4, 0x5a, 0x2b, 0xf4, 0x3d, 0x29, 0x2e, ++ 0x96, 0xf1, 0x7d, 0x3a, 0xa6, 0xce, 0x37, 0xe2, 0xf0, 0xce, 0x64, 0x08, ++ 0xfb, 0x4b, 0xf3, 0xe0, 0x8d, 0x7b, 0x1f, 0x29, 0x7d, 0x2c, 0x7b, 0x0f, ++ 0xf6, 0xd9, 0xc9, 0x39, 0x76, 0xec, 0x47, 0xfd, 0xd6, 0xfc, 0xb0, 0x67, ++ 0x58, 0x46, 0x03, 0xd4, 0x3f, 0x9f, 0xb0, 0x86, 0x21, 0x5f, 0xa7, 0xef, ++ 0x7f, 0xf9, 0x4a, 0x54, 0xb7, 0x53, 0x0d, 0x81, 0x2b, 0xba, 0x3e, 0x2c, ++ 0x13, 0xfa, 0x5c, 0x90, 0x3b, 0xc5, 0xfd, 0x9c, 0xb5, 0x15, 0xde, 0xb9, ++ 0x8f, 0x99, 0xed, 0xf0, 0x0e, 0x39, 0xdc, 0x0d, 0x19, 0xea, 0x22, 0xbe, ++ 0xf8, 0x17, 0xb8, 0xe7, 0xbc, 0x36, 0xcd, 0x15, 0x56, 0xab, 0xf8, 0x24, ++ 0x21, 0x71, 0xe9, 0xc2, 0xa9, 0x9c, 0x03, 0xe2, 0x57, 0xd9, 0x07, 0x8d, ++ 0x37, 0xe5, 0x30, 0x2c, 0xa6, 0xd8, 0xef, 0x24, 0xd7, 0xe3, 0x2c, 0xd7, ++ 0xe3, 0x37, 0x96, 0xd3, 0x31, 0x5d, 0x07, 0xc8, 0x8b, 0x34, 0xff, 0x69, ++ 0x8f, 0x7b, 0x43, 0xdf, 0x0f, 0xe8, 0xcf, 0x32, 0xf7, 0xf3, 0x2d, 0xe7, ++ 0x9e, 0xd0, 0x75, 0xdd, 0xea, 0xbe, 0xd0, 0xf8, 0xc7, 0xfa, 0xe8, 0xa4, ++ 0xe7, 0x39, 0x4b, 0x5f, 0x76, 0xc2, 0x4d, 0x63, 0x17, 0xa4, 0x53, 0xdf, ++ 0x6e, 0x9a, 0xdf, 0x86, 0x96, 0xab, 0xfa, 0x7c, 0x2a, 0xcf, 0x5f, 0xf5, ++ 0xfc, 0x35, 0x2c, 0xcd, 0x92, 0x8c, 0x36, 0x5e, 0x56, 0xf1, 0x5a, 0x3d, ++ 0xf8, 0xc3, 0x3d, 0xc7, 0xf5, 0xf5, 0x9d, 0x8e, 0x13, 0xb1, 0xf6, 0xdf, ++ 0x5c, 0x75, 0xcf, 0x2b, 0xe6, 0x33, 0xec, 0xe0, 0xbb, 0x79, 0x80, 0xfb, ++ 0xc0, 0x32, 0xf5, 0xa8, 0xf2, 0x3b, 0xc2, 0x71, 0xf2, 0x1c, 0xc7, 0xaa, ++ 0xe1, 0x0b, 0x95, 0xe7, 0xfa, 0x86, 0xe6, 0x09, 0x8d, 0x8f, 0x2a, 0x5f, ++ 0xe8, 0x3e, 0x50, 0xfc, 0xec, 0xcd, 0x55, 0xb5, 0xbf, 0x6d, 0x1b, 0xfe, ++ 0x58, 0x75, 0xfc, 0xdd, 0x72, 0x78, 0x22, 0x49, 0x71, 0x0f, 0xb3, 0xea, ++ 0xe6, 0xc1, 0x3f, 0x24, 0x0f, 0xaa, 0xef, 0xa6, 0x69, 0x39, 0xf3, 0xc2, ++ 0xfc, 0x37, 0xa3, 0xe2, 0xa5, 0x39, 0xff, 0xb4, 0xbe, 0xbf, 0x64, 0xfe, ++ 0xcc, 0x93, 0x63, 0xb5, 0x7c, 0x77, 0xdb, 0x23, 0xee, 0x7f, 0xf5, 0xc7, ++ 0xf3, 0x95, 0x65, 0xbe, 0xcf, 0x51, 0x9e, 0x95, 0xf1, 0x3c, 0xe3, 0x25, ++ 0x57, 0xdf, 0x07, 0xf4, 0x15, 0xf6, 0xb2, 0xbf, 0x9a, 0xf7, 0xfa, 0xb4, ++ 0x7f, 0xa8, 0x76, 0x4f, 0xad, 0x7d, 0x7d, 0xff, 0x03, 0x5b, 0xf0, 0xf8, ++ 0xe7, 0x1b, 0x78, 0x7f, 0x7d, 0xb6, 0x51, 0x7d, 0x4f, 0x79, 0xe2, 0xc4, ++ 0x16, 0x74, 0x3f, 0x85, 0x25, 0x9e, 0xe9, 0xbd, 0x26, 0xb4, 0xbd, 0x3f, ++ 0x88, 0xf7, 0xa4, 0x60, 0xfc, 0x9e, 0x7b, 0x98, 0xfd, 0x64, 0xc0, 0xc7, ++ 0x2f, 0x9c, 0xa1, 0xfe, 0xbe, 0x79, 0xf6, 0x3e, 0xf1, 0xf2, 0x7b, 0x2f, ++ 0x5f, 0x53, 0x7e, 0x77, 0x8b, 0xd5, 0x19, 0x8b, 0xf2, 0x1a, 0xda, 0x0b, ++ 0xf3, 0xfb, 0x87, 0xea, 0xfb, 0xad, 0xfc, 0x9a, 0x8c, 0x07, 0x69, 0x37, ++ 0xe1, 0x7e, 0x97, 0x6c, 0xce, 0x13, 0x73, 0x7f, 0x24, 0x81, 0x7d, 0x9a, ++ 0xbf, 0xdc, 0xf8, 0x79, 0x77, 0xa3, 0x7a, 0xff, 0xc0, 0xcd, 0xad, 0x83, ++ 0xde, 0x73, 0x71, 0xb2, 0xaf, 0x36, 0x4e, 0x46, 0xac, 0x94, 0xe1, 0x7f, ++ 0x84, 0x79, 0x65, 0x9c, 0x13, 0xf9, 0x29, 0x9a, 0xa0, 0x78, 0x85, 0xe3, ++ 0x84, 0x6b, 0x91, 0x8a, 0xe1, 0xdc, 0x85, 0xa7, 0xf0, 0xbd, 0x10, 0xc7, ++ 0x7a, 0x6b, 0x1c, 0xef, 0xcd, 0x91, 0xb0, 0x45, 0xf6, 0xad, 0x71, 0xc8, ++ 0x14, 0xf3, 0xcf, 0x8a, 0xc3, 0xcb, 0x90, 0xcb, 0xa1, 0xad, 0x78, 0x19, ++ 0xf7, 0xdb, 0xf5, 0x90, 0x5a, 0x97, 0x8f, 0xa0, 0x0c, 0x78, 0x69, 0xa8, ++ 0xdb, 0xa2, 0xef, 0xa3, 0x19, 0xe0, 0x48, 0x74, 0x7a, 0x9f, 0xab, 0x0d, ++ 0xfc, 0xd2, 0x5a, 0xe5, 0xef, 0x5a, 0x9e, 0xb7, 0x7a, 0x97, 0x1c, 0x1e, ++ 0x75, 0xe7, 0x01, 0xfe, 0x52, 0xfe, 0x49, 0x95, 0x7c, 0xb5, 0x13, 0x7e, ++ 0x37, 0x18, 0x2f, 0xbf, 0xf3, 0xbd, 0xdf, 0x24, 0xbe, 0x2a, 0xa3, 0x0e, ++ 0x2b, 0xe5, 0xfa, 0xfe, 0xe8, 0x3c, 0x74, 0x1c, 0x9c, 0x4b, 0x9f, 0xb3, ++ 0x1a, 0x17, 0x79, 0x9d, 0xe1, 0xfc, 0xef, 0xd0, 0xfb, 0x2f, 0xc5, 0xe7, ++ 0x55, 0x7e, 0xb1, 0x7e, 0x94, 0xee, 0xa1, 0xa0, 0x7c, 0xdf, 0x6b, 0xdd, ++ 0x7d, 0x3f, 0x8c, 0x50, 0x5e, 0x8d, 0x72, 0x41, 0xef, 0x77, 0x9f, 0xbb, ++ 0x39, 0x0f, 0xb9, 0x90, 0xd7, 0x7d, 0xd3, 0xfd, 0xd5, 0xfd, 0x44, 0xdf, ++ 0x53, 0x3d, 0x64, 0xd6, 0x5f, 0xe8, 0x21, 0x9c, 0xe7, 0x0b, 0xeb, 0xee, ++ 0x77, 0xf2, 0xc9, 0xac, 0xb2, 0x7f, 0x4d, 0x7c, 0x43, 0xf3, 0x28, 0xc4, ++ 0xf7, 0x2c, 0xab, 0x7c, 0x29, 0xf8, 0xaf, 0x96, 0x77, 0x0d, 0x71, 0x3d, ++ 0xc8, 0xcb, 0x7d, 0x7a, 0xee, 0xdc, 0xf3, 0x5b, 0xad, 0xbb, 0x3a, 0xc7, ++ 0x13, 0x1e, 0xfc, 0xa4, 0xcf, 0xa9, 0xec, 0xf3, 0x8c, 0x5f, 0x53, 0x0c, ++ 0x1d, 0xc1, 0xfb, 0xb0, 0x21, 0x8c, 0x39, 0x69, 0x08, 0x7b, 0xdd, 0xef, ++ 0x12, 0x3f, 0x11, 0xfa, 0x05, 0xb3, 0xa7, 0x31, 0x42, 0xe7, 0xba, 0x74, ++ 0xe3, 0x6b, 0x32, 0x7b, 0x7f, 0x29, 0x86, 0xf5, 0x96, 0x21, 0x84, 0x09, ++ 0x10, 0xde, 0x0d, 0x71, 0x01, 0xf3, 0xf0, 0xce, 0x02, 0xe4, 0xdb, 0xe2, ++ 0x49, 0xf8, 0x69, 0x9c, 0xa5, 0xfb, 0xd4, 0x6c, 0x41, 0x79, 0x4b, 0x4b, ++ 0x8c, 0xf3, 0xb4, 0x9f, 0x7e, 0xaf, 0x56, 0x44, 0x9c, 0x7f, 0x47, 0xf0, ++ 0xbc, 0x02, 0xcf, 0x81, 0x9a, 0xbe, 0xef, 0x14, 0xdf, 0x4a, 0x8f, 0x4b, ++ 0xfc, 0xc2, 0x0d, 0xe3, 0xdc, 0xac, 0xc7, 0xb9, 0xee, 0x6f, 0xda, 0xef, ++ 0x89, 0xeb, 0x81, 0xcd, 0xb8, 0xd6, 0xf9, 0xa9, 0x3a, 0xff, 0xe9, 0xbc, ++ 0x7b, 0x37, 0xfb, 0x57, 0xfb, 0x62, 0x12, 0xdf, 0xff, 0x17, 0xae, 0x21, ++ 0x8f, 0x76, 0xa9, 0xf8, 0x2d, 0x35, 0xf8, 0xf4, 0x9e, 0x3b, 0xf0, 0x9b, ++ 0x21, 0x79, 0xfc, 0x6f, 0x6a, 0x8c, 0x09, 0xd0, 0x18, 0x10, 0x00, 0x00, ++ 0x00 }; + + static u8 bnx2_TPAT_b09FwText[] = { +- 0xbd, 0x58, 0x5d, 0x6c, 0x1c, 0x57, 0x15, 0x3e, 0x73, 0xe7, 0xee, 0x7a, +- 0x6d, 0x39, 0xf1, 0xb8, 0x99, 0x96, 0x4d, 0x63, 0xd4, 0x99, 0x78, 0xfc, +- 0x43, 0x6d, 0x95, 0x69, 0x59, 0x15, 0x17, 0x56, 0x68, 0xba, 0xbb, 0x71, +- 0xad, 0xaa, 0xaa, 0x5c, 0x29, 0x88, 0x4a, 0x8d, 0x90, 0x59, 0x37, 0x6d, +- 0x79, 0x4b, 0x11, 0x0f, 0x48, 0x45, 0xca, 0xb2, 0x76, 0xd2, 0x08, 0x2d, +- 0x99, 0xd6, 0x85, 0x44, 0x42, 0x7d, 0x88, 0x9c, 0x3a, 0xee, 0xc3, 0xca, +- 0x9b, 0x8a, 0x07, 0x24, 0xa4, 0xa8, 0x55, 0x80, 0xc0, 0x1b, 0x7d, 0xa8, +- 0xf8, 0x79, 0x22, 0x12, 0x0f, 0x54, 0x08, 0x90, 0x85, 0x04, 0x2a, 0xa5, +- 0xe4, 0xf2, 0x7d, 0x77, 0x67, 0x92, 0xc5, 0x4d, 0x41, 0xe5, 0x81, 0x95, +- 0x56, 0x77, 0xe6, 0xde, 0x73, 0xce, 0x3d, 0xf7, 0xfc, 0x7c, 0xe7, 0xdc, +- 0x39, 0xec, 0xc8, 0x88, 0x64, 0xbf, 0x7d, 0xf8, 0x57, 0xbe, 0x72, 0xe2, +- 0xeb, 0x0f, 0xdc, 0x57, 0xb9, 0x0f, 0x8f, 0x0f, 0x3a, 0x77, 0x6b, 0x2d, +- 0xff, 0xc7, 0x9f, 0x2b, 0xe2, 0xe5, 0x7a, 0xf0, 0x2f, 0x25, 0x55, 0x4d, +- 0x0e, 0xd6, 0x22, 0x29, 0xb9, 0xd5, 0xea, 0xfc, 0x6a, 0x24, 0x92, 0x74, +- 0xe7, 0x82, 0xba, 0xfc, 0xd3, 0xb4, 0x7c, 0x2d, 0x9c, 0xff, 0x64, 0xf5, +- 0x83, 0x4f, 0x5f, 0xf9, 0x6c, 0xb8, 0x7b, 0xc1, 0x95, 0x92, 0x57, 0x3d, +- 0xa3, 0xbd, 0x69, 0x29, 0x4d, 0x80, 0xe7, 0xd5, 0x99, 0x6f, 0x17, 0x64, +- 0x7f, 0x2e, 0xab, 0x65, 0x54, 0x74, 0xdd, 0x5c, 0x99, 0x89, 0xbc, 0x36, +- 0x36, 0xb8, 0xdc, 0x0b, 0xa4, 0xd6, 0x2b, 0xcb, 0x9b, 0x3d, 0x5f, 0xde, +- 0xe8, 0x69, 0x39, 0xfe, 0xca, 0x49, 0x59, 0x8f, 0xc3, 0x72, 0xc3, 0x2d, +- 0x89, 0xaa, 0x86, 0xe5, 0xa6, 0x04, 0xb2, 0x15, 0x87, 0xad, 0x15, 0x77, +- 0xdc, 0x29, 0x55, 0x4b, 0xf2, 0xc2, 0x8c, 0x92, 0x0b, 0xfe, 0x31, 0x79, +- 0x26, 0x7a, 0x12, 0x7f, 0x2d, 0x6a, 0x43, 0x3b, 0xf5, 0xf3, 0x5a, 0xf4, +- 0xc6, 0x98, 0x3c, 0x12, 0x1b, 0xb3, 0x1a, 0x27, 0xe0, 0x9f, 0x9c, 0x7d, +- 0x56, 0x86, 0xa5, 0xe5, 0x85, 0x4b, 0x22, 0x05, 0xd2, 0x48, 0x2d, 0x2e, +- 0x48, 0xe2, 0xf5, 0xcf, 0x75, 0xc1, 0x8e, 0x1f, 0x98, 0x2d, 0xf0, 0x0f, +- 0x47, 0xf9, 0xfa, 0x1d, 0xd9, 0xba, 0x97, 0xad, 0x2b, 0x51, 0xe7, 0xc2, +- 0x60, 0x5b, 0xa6, 0x12, 0xed, 0xdc, 0x30, 0xb5, 0xe8, 0x2e, 0xaf, 0xb6, +- 0xad, 0xc5, 0xdd, 0xa0, 0xfe, 0x91, 0x57, 0x17, 0x03, 0x1e, 0x97, 0x3c, +- 0x5a, 0x55, 0xbf, 0x06, 0xbf, 0x4d, 0x25, 0xca, 0x11, 0xb9, 0xda, 0x29, +- 0x7b, 0xb5, 0xde, 0x37, 0x9c, 0x5a, 0x7a, 0xc3, 0x24, 0x7a, 0x44, 0x54, +- 0x94, 0x38, 0xb5, 0x6d, 0xca, 0x1a, 0x16, 0x1d, 0x0d, 0x81, 0x67, 0xd2, +- 0x53, 0xc2, 0xb1, 0x96, 0xcd, 0x53, 0x76, 0x03, 0xcf, 0x8b, 0x4e, 0xb2, +- 0xad, 0x9d, 0xda, 0xf9, 0x25, 0x3c, 0x97, 0xc0, 0x0f, 0xbb, 0xc4, 0x8e, +- 0x24, 0xcb, 0x0e, 0xf8, 0x78, 0x4e, 0x0f, 0xef, 0x4a, 0x12, 0xdf, 0x93, +- 0xb5, 0x4a, 0x58, 0x6e, 0xc9, 0xa3, 0x4e, 0x7d, 0xfb, 0x43, 0x4e, 0xf3, +- 0x96, 0x7a, 0x1f, 0x9e, 0xa3, 0x2e, 0x0f, 0x6b, 0x63, 0xd4, 0xfd, 0x43, +- 0xd9, 0x19, 0x29, 0x2f, 0xe9, 0xeb, 0xef, 0xf3, 0x1d, 0x3a, 0xa7, 0xd0, +- 0xbd, 0x5b, 0x84, 0x3e, 0xc6, 0x70, 0x9f, 0x5a, 0x54, 0x87, 0x9e, 0x09, +- 0xfe, 0xe1, 0x99, 0x26, 0x42, 0xe1, 0xf0, 0xb9, 0x7d, 0x12, 0x8c, 0x1b, +- 0xd3, 0x88, 0x43, 0x6f, 0x5b, 0x26, 0x64, 0x2d, 0x9d, 0xf0, 0x8e, 0xa4, +- 0x6d, 0xac, 0xb7, 0x48, 0x03, 0x7b, 0x88, 0x1c, 0xe9, 0x1a, 0x73, 0x29, +- 0x3e, 0x50, 0x94, 0xfd, 0x6a, 0xbe, 0x20, 0x61, 0x90, 0x60, 0xee, 0xf0, +- 0xa5, 0xbd, 0x36, 0xbb, 0x27, 0xd3, 0x81, 0x76, 0xc7, 0x3e, 0xf1, 0xa1, +- 0xec, 0x7d, 0xd4, 0xab, 0x9d, 0xcf, 0xed, 0x6c, 0xf5, 0x86, 0x5d, 0x63, +- 0xa9, 0x55, 0xa0, 0xff, 0x47, 0x9e, 0x29, 0xe7, 0xa3, 0x2e, 0xd4, 0x1b, +- 0xf4, 0xd1, 0x2d, 0x9d, 0x9e, 0xfa, 0x90, 0x4e, 0xd4, 0x47, 0x89, 0x3e, +- 0x57, 0x92, 0xf5, 0xe8, 0x71, 0x25, 0xfb, 0x8d, 0x59, 0x8f, 0xb5, 0xd3, +- 0x38, 0x7f, 0x2c, 0x7b, 0x46, 0x1c, 0xa6, 0x88, 0xc3, 0x14, 0x71, 0x99, +- 0x8a, 0xa7, 0xaa, 0x81, 0x5c, 0x99, 0x29, 0xc9, 0x75, 0x17, 0xfe, 0xec, +- 0xcd, 0x79, 0xaf, 0x21, 0xa6, 0x12, 0xcf, 0x11, 0x37, 0x4a, 0x66, 0x0b, +- 0xc2, 0x77, 0xc4, 0x92, 0x4e, 0xca, 0x2e, 0x62, 0x29, 0x39, 0xca, 0xb9, +- 0x21, 0x59, 0xb1, 0x67, 0x99, 0xf3, 0x4e, 0x09, 0x7d, 0x55, 0xc3, 0xda, +- 0x64, 0x70, 0x4a, 0x76, 0x11, 0x1f, 0x35, 0xac, 0x53, 0x56, 0xe8, 0xb5, +- 0x40, 0xd1, 0x4e, 0xdf, 0x45, 0x0e, 0xf8, 0x88, 0xfb, 0x99, 0xb2, 0x12, +- 0x47, 0x56, 0xe7, 0x61, 0x8b, 0xf9, 0x29, 0xd8, 0x88, 0x39, 0xc1, 0xb8, +- 0xfa, 0xeb, 0xb4, 0x8e, 0x4e, 0x22, 0x7e, 0x40, 0x8b, 0xf3, 0x9f, 0x4a, +- 0x67, 0xc0, 0x1f, 0x15, 0xa9, 0xe7, 0x56, 0xac, 0x65, 0x3d, 0xbd, 0xa2, +- 0x0a, 0xd1, 0xef, 0x1d, 0xd9, 0x1f, 0xb6, 0x12, 0x09, 0x5b, 0x4a, 0x29, +- 0x9f, 0x5b, 0xbf, 0x84, 0x3c, 0x7a, 0xd3, 0xea, 0xaf, 0xc1, 0x57, 0xce, +- 0xf4, 0xa7, 0xdd, 0x45, 0x36, 0x3b, 0x61, 0xbc, 0x08, 0xdd, 0xae, 0xc2, +- 0xff, 0xb4, 0xf9, 0xa5, 0x2e, 0x64, 0x77, 0x1c, 0xe6, 0xae, 0xb4, 0xbb, +- 0xa4, 0xb3, 0x69, 0xbe, 0xa2, 0xab, 0xb2, 0xdc, 0xee, 0x9c, 0x34, 0x6e, +- 0x24, 0x2b, 0x85, 0x2a, 0xfd, 0x36, 0xba, 0x00, 0x3f, 0x2c, 0xb7, 0xbb, +- 0x13, 0x8f, 0x6d, 0x76, 0xa4, 0x75, 0x77, 0x55, 0x5a, 0x6e, 0x45, 0xdd, +- 0xa5, 0x64, 0x0c, 0x72, 0xab, 0xd8, 0x87, 0x71, 0x15, 0x06, 0x75, 0x77, +- 0xe2, 0xb1, 0x8b, 0x9d, 0x7b, 0x90, 0xb7, 0xf2, 0x41, 0xad, 0x12, 0x21, +- 0x77, 0xaf, 0x1e, 0x74, 0x25, 0x92, 0xb5, 0x5e, 0x49, 0x6a, 0xe9, 0x84, +- 0xac, 0xf7, 0x24, 0x79, 0x6a, 0x06, 0xfb, 0x55, 0xf0, 0xde, 0x9b, 0x97, +- 0x56, 0x6f, 0x62, 0x45, 0x55, 0x5b, 0x92, 0xf4, 0xd6, 0xf1, 0x2f, 0x49, +- 0xa3, 0x53, 0x2a, 0x5d, 0xec, 0xb4, 0xc8, 0x5f, 0x72, 0xaa, 0x81, 0x3e, +- 0xdc, 0xdd, 0x65, 0xdc, 0x40, 0xce, 0xf0, 0x97, 0x54, 0x55, 0x4b, 0xd3, +- 0xf7, 0x21, 0xc3, 0x81, 0x4d, 0xa8, 0xeb, 0x2c, 0xf6, 0xed, 0x8f, 0xad, +- 0x1e, 0x7d, 0x37, 0x24, 0xed, 0x78, 0x1e, 0x76, 0x62, 0xd4, 0x0e, 0xc9, +- 0x5a, 0xf4, 0x9e, 0x79, 0x1a, 0xb1, 0xfa, 0x9a, 0x98, 0x7b, 0x6a, 0xc0, +- 0x93, 0x1a, 0x4c, 0xfa, 0x42, 0x54, 0x96, 0x53, 0xd8, 0xb7, 0xcf, 0xb7, +- 0x0e, 0x1d, 0xc8, 0x37, 0x06, 0xbe, 0x06, 0xf8, 0x7c, 0x39, 0x6d, 0x79, +- 0xc7, 0xc0, 0xbb, 0x9b, 0xf1, 0xce, 0x95, 0x17, 0x25, 0x06, 0xcf, 0x64, +- 0xb0, 0x08, 0x7f, 0xae, 0xf8, 0x0d, 0xf0, 0x36, 0xa0, 0x03, 0xc6, 0x54, +- 0x5a, 0xba, 0x42, 0xb9, 0x61, 0xf9, 0x69, 0xe6, 0x83, 0x95, 0xd9, 0x82, +- 0x4c, 0xe8, 0x95, 0x96, 0x20, 0x67, 0x01, 0xe3, 0x3b, 0xa6, 0x9d, 0x02, +- 0x77, 0x7c, 0x3e, 0xbf, 0x69, 0x54, 0x15, 0x31, 0x5a, 0x89, 0x82, 0xb6, +- 0xf0, 0xbd, 0x28, 0x75, 0xe4, 0x99, 0x8a, 0xc6, 0xa4, 0xe9, 0x39, 0x8e, +- 0xaa, 0xba, 0xd2, 0x44, 0x84, 0x26, 0xcb, 0xda, 0xce, 0xad, 0x20, 0xce, +- 0x54, 0xf5, 0x7b, 0xaa, 0x5f, 0x0f, 0x0a, 0xa0, 0x41, 0x6e, 0x46, 0xa3, +- 0xb0, 0xc1, 0x38, 0x68, 0xcf, 0x62, 0x7e, 0x0a, 0xf8, 0x39, 0x0e, 0x1a, +- 0x8e, 0xcc, 0x11, 0xda, 0x85, 0xf4, 0x15, 0xe8, 0x98, 0xcf, 0x55, 0x60, +- 0x9b, 0xc1, 0xb4, 0xc9, 0x7d, 0x0c, 0x9a, 0x54, 0x67, 0x79, 0x37, 0x98, +- 0x4b, 0xf9, 0x7a, 0x80, 0xf5, 0xab, 0x9f, 0x52, 0xb2, 0x6b, 0x2e, 0x46, +- 0x8c, 0x61, 0x79, 0xaf, 0x11, 0x25, 0xe3, 0xae, 0xcd, 0xf3, 0x3c, 0xdf, +- 0x39, 0xb2, 0x16, 0x9c, 0x39, 0xb8, 0x1a, 0x39, 0xee, 0xfa, 0xfc, 0x01, +- 0x69, 0xf9, 0x61, 0x5c, 0x87, 0xbf, 0xd7, 0x53, 0xe6, 0xc6, 0x18, 0xce, +- 0x1d, 0x22, 0xea, 0x26, 0xf1, 0x9c, 0x1c, 0x04, 0x0f, 0xfc, 0xd8, 0x82, +- 0x2c, 0x8e, 0x88, 0x99, 0x34, 0x84, 0x8e, 0xb0, 0x47, 0x34, 0xe7, 0x1d, +- 0x61, 0x3c, 0xfa, 0x5c, 0x63, 0x8d, 0x79, 0xf5, 0x50, 0x2d, 0x0a, 0xe3, +- 0x66, 0x96, 0x2b, 0x6f, 0xc1, 0xb6, 0xed, 0x94, 0xf5, 0x22, 0xaf, 0x11, +- 0xcc, 0x0f, 0xc6, 0x4a, 0x8e, 0xb1, 0xe0, 0x89, 0x98, 0x9f, 0xa5, 0x0c, +- 0x6b, 0x6b, 0x19, 0x8e, 0x2e, 0x40, 0x0f, 0x63, 0x9e, 0x00, 0x86, 0xb6, +- 0x63, 0x1b, 0x9f, 0xad, 0x40, 0xdd, 0x30, 0x93, 0xd3, 0xb4, 0xb9, 0x31, +- 0x27, 0xe2, 0x45, 0xd0, 0xfe, 0x16, 0xf6, 0x5a, 0x02, 0x8e, 0x12, 0x7b, +- 0xb9, 0x77, 0x55, 0xd7, 0x3a, 0xfb, 0xa0, 0x4b, 0x00, 0x7c, 0x83, 0x0d, +- 0x2c, 0xde, 0x0e, 0x23, 0xdf, 0x99, 0xf3, 0x61, 0xb0, 0x22, 0x9c, 0x97, +- 0x61, 0x85, 0xf7, 0x26, 0xfc, 0xb4, 0x5e, 0x79, 0xd4, 0x69, 0x6c, 0xbf, +- 0x9f, 0xf9, 0x48, 0xc6, 0x14, 0x6a, 0x49, 0xd3, 0x27, 0x5f, 0x11, 0x7c, +- 0xfb, 0xc0, 0xf3, 0x77, 0xac, 0x15, 0x30, 0x0e, 0xca, 0xb1, 0xb8, 0x8d, +- 0xbd, 0x02, 0xec, 0xb5, 0x24, 0xba, 0xfa, 0x3c, 0xb0, 0x67, 0x2a, 0x68, +- 0xc8, 0xf7, 0x55, 0xbf, 0x46, 0xd2, 0x37, 0x5f, 0x18, 0xf0, 0x4d, 0x20, +- 0xae, 0xcd, 0xc1, 0x87, 0xb2, 0x98, 0x22, 0x66, 0x3e, 0x98, 0xad, 0xfb, +- 0xc0, 0xbe, 0xcf, 0x64, 0x18, 0x5e, 0x22, 0x0e, 0xca, 0x19, 0x8b, 0x83, +- 0x45, 0xe2, 0x20, 0x70, 0xa5, 0xb5, 0x00, 0x7b, 0xc7, 0xef, 0x02, 0x5f, +- 0xea, 0xf0, 0xc4, 0x4f, 0x3a, 0x1a, 0x71, 0xe5, 0x82, 0x9f, 0x75, 0xf8, +- 0xf3, 0xae, 0x8c, 0x84, 0xde, 0xbb, 0xc0, 0x9b, 0xe4, 0x28, 0xf3, 0xc0, +- 0x18, 0xe4, 0x3a, 0xb0, 0x6a, 0xba, 0x7c, 0x0a, 0x71, 0xef, 0x02, 0x27, +- 0xb4, 0x70, 0xdf, 0xbc, 0x6e, 0xe6, 0xf5, 0x9b, 0xbf, 0xb7, 0x1d, 0xb8, +- 0x19, 0xb5, 0xee, 0x73, 0x90, 0x31, 0x15, 0x1c, 0x81, 0x1f, 0xd7, 0x16, +- 0xfe, 0x1b, 0xcf, 0x6f, 0x32, 0x1e, 0xd4, 0x90, 0x0a, 0xf7, 0x15, 0x69, +- 0x74, 0x69, 0x87, 0x18, 0x76, 0xb0, 0x18, 0x84, 0x9c, 0x8f, 0x91, 0xf3, +- 0x22, 0x4d, 0x62, 0x05, 0x30, 0x8c, 0xb8, 0xb7, 0x06, 0x7a, 0x55, 0x19, +- 0x82, 0x5d, 0x11, 0x4b, 0x4a, 0x4a, 0xba, 0x7a, 0x54, 0xaf, 0x83, 0xb6, +- 0x50, 0x5d, 0xd6, 0x5b, 0xd1, 0x31, 0x37, 0xef, 0x97, 0xda, 0x1d, 0x71, +- 0x6a, 0x7d, 0x3f, 0x67, 0x74, 0x8f, 0x65, 0x74, 0x4b, 0x83, 0x74, 0x98, +- 0x6f, 0x64, 0xf3, 0x09, 0xe6, 0x3f, 0x91, 0xd9, 0x9c, 0xb5, 0xa0, 0x84, +- 0x3a, 0xcb, 0x3a, 0x10, 0x06, 0x81, 0xfa, 0x4f, 0x75, 0x60, 0x61, 0x00, +- 0xbb, 0x45, 0xd9, 0xbe, 0xc2, 0x67, 0x4c, 0x0e, 0x9e, 0x75, 0x58, 0x49, +- 0x74, 0x33, 0x3e, 0xf1, 0xdb, 0xcc, 0xf6, 0x21, 0x2d, 0xf1, 0x7a, 0x90, +- 0x16, 0x69, 0x04, 0xbb, 0xa8, 0xb3, 0xb7, 0xb3, 0xd9, 0x01, 0xac, 0x21, +- 0xe7, 0x53, 0x57, 0x1e, 0xd6, 0xcc, 0xef, 0x7b, 0xb5, 0x3d, 0xc7, 0x0e, +- 0xe8, 0x77, 0x26, 0x2c, 0xce, 0x2c, 0x75, 0x86, 0x20, 0x7e, 0x54, 0x8e, +- 0x23, 0x9f, 0x9f, 0x86, 0xef, 0x2f, 0xc6, 0x0a, 0xdd, 0x02, 0x6b, 0x8e, +- 0x41, 0x1c, 0x86, 0xd6, 0x17, 0xb5, 0x68, 0x0d, 0x91, 0xfc, 0x2d, 0xb9, +- 0x3a, 0x3f, 0x22, 0x85, 0x4b, 0xd4, 0x01, 0xfd, 0xd2, 0xe6, 0xe0, 0x3e, +- 0x73, 0xd8, 0x67, 0x02, 0x18, 0x78, 0x3f, 0xea, 0x8b, 0x2f, 0x7a, 0x1a, +- 0x58, 0x9b, 0x96, 0x9c, 0x3a, 0xe4, 0xab, 0x4b, 0x3c, 0x3f, 0x31, 0xb8, +- 0x94, 0xd5, 0x36, 0xe6, 0xd6, 0x10, 0x6a, 0xfa, 0x1f, 0x91, 0xbb, 0x4a, +- 0x56, 0x2b, 0xc6, 0x1c, 0x89, 0x7f, 0x00, 0xfb, 0x62, 0x6e, 0x93, 0x6b, +- 0xbb, 0x98, 0xe7, 0x1c, 0x65, 0x30, 0x16, 0x0f, 0xa0, 0xae, 0x61, 0xcf, +- 0xa3, 0xe4, 0x19, 0x42, 0xcd, 0x27, 0xfe, 0x63, 0xdc, 0xe4, 0x3b, 0xcf, +- 0x44, 0x6c, 0x73, 0x31, 0x8e, 0x60, 0xe4, 0x99, 0x7e, 0x91, 0xf9, 0x8a, +- 0xcf, 0xc6, 0xe8, 0xea, 0xa8, 0xd4, 0x3b, 0x11, 0x30, 0x76, 0xaa, 0x7c, +- 0x5c, 0xb8, 0x86, 0xf7, 0x2e, 0xe7, 0xbd, 0x81, 0x79, 0x3c, 0x77, 0xad, +- 0xce, 0xa8, 0xed, 0x79, 0xff, 0xb2, 0x06, 0xc3, 0xa2, 0xc7, 0xd8, 0x64, +- 0xaf, 0xc2, 0xfa, 0x67, 0x71, 0x6b, 0x96, 0x7d, 0xca, 0xeb, 0x1d, 0xd6, +- 0x42, 0xcd, 0xbc, 0x44, 0x00, 0x1c, 0x92, 0xba, 0x9f, 0x9f, 0x0b, 0x71, +- 0x1c, 0x53, 0x36, 0x65, 0x4c, 0xc2, 0x76, 0xec, 0x47, 0xa2, 0xb2, 0x76, +- 0xa6, 0x92, 0x26, 0xf9, 0xba, 0x05, 0x29, 0x6c, 0xcc, 0x8b, 0x7b, 0xd6, +- 0xc8, 0x66, 0x5f, 0x9e, 0xb7, 0x2c, 0xbe, 0xd4, 0x5e, 0xa2, 0x1e, 0x98, +- 0xdf, 0x61, 0x3d, 0x0c, 0x81, 0x67, 0xc5, 0x6c, 0xdf, 0xb2, 0x34, 0x3b, +- 0x91, 0xd7, 0x10, 0x8c, 0xdd, 0x3b, 0xe0, 0xbb, 0x22, 0xce, 0xac, 0xe5, +- 0x62, 0xa7, 0xbf, 0x17, 0x73, 0xee, 0xb9, 0xb8, 0xbf, 0x57, 0x43, 0x7e, +- 0x89, 0xbd, 0xc4, 0x57, 0xc2, 0x3e, 0x12, 0x7d, 0xe3, 0x39, 0x8d, 0xfd, +- 0x68, 0xa3, 0x02, 0x7a, 0xdb, 0xd9, 0xec, 0x3c, 0x21, 0xe8, 0x34, 0x6c, +- 0x4e, 0x5b, 0x73, 0x0f, 0xc6, 0xe2, 0x3f, 0x0c, 0xf1, 0x05, 0x75, 0x05, +- 0xfa, 0xe2, 0xbd, 0xc7, 0x3d, 0x26, 0xe4, 0xc5, 0xd4, 0x62, 0xad, 0x77, +- 0x02, 0x98, 0xd5, 0xe8, 0xfc, 0x2d, 0xaf, 0x3d, 0x49, 0x1b, 0xf8, 0xfb, +- 0xac, 0x8c, 0x8a, 0xde, 0x19, 0x95, 0xe7, 0xd0, 0xef, 0x15, 0x36, 0x50, +- 0xe7, 0x61, 0x63, 0x75, 0xb6, 0x35, 0xcb, 0x9e, 0xed, 0x32, 0x72, 0x79, +- 0xb5, 0x12, 0xc5, 0xae, 0x33, 0x2d, 0x67, 0xbe, 0x1b, 0xce, 0x6e, 0xdb, +- 0x7c, 0xc6, 0xfa, 0x4e, 0x20, 0xa7, 0xbb, 0x91, 0x9c, 0xe9, 0x7a, 0xd0, +- 0xcb, 0xbb, 0xd5, 0xd7, 0x46, 0xc4, 0xdb, 0x06, 0xfe, 0xc4, 0x53, 0x9e, +- 0x0b, 0x3e, 0xa8, 0xd2, 0x6e, 0xec, 0x63, 0xe9, 0x5f, 0xe2, 0xdb, 0xa3, +- 0x78, 0x1e, 0x11, 0xf7, 0x1c, 0xfb, 0x4e, 0xc6, 0x24, 0xfd, 0x33, 0xd8, +- 0x0b, 0x13, 0xfb, 0x20, 0x73, 0x87, 0xb9, 0x9f, 0xe7, 0x66, 0x9e, 0xab, +- 0xc4, 0x01, 0xed, 0x2c, 0xc2, 0x5e, 0xd7, 0x62, 0xe6, 0xeb, 0x0d, 0x73, +- 0xcd, 0xf6, 0x6e, 0x1e, 0xfb, 0xe2, 0x81, 0xde, 0x2d, 0xef, 0x7b, 0x18, +- 0xaf, 0xe5, 0x81, 0x7c, 0xbd, 0x6e, 0x73, 0xf5, 0x0d, 0xe4, 0xed, 0xcb, +- 0x69, 0xd9, 0xe6, 0xec, 0xe1, 0x07, 0x6e, 0x97, 0xb3, 0x97, 0x3f, 0x46, +- 0xce, 0xfe, 0x30, 0xcb, 0xd9, 0xa2, 0x8d, 0x6b, 0xb5, 0x31, 0xb8, 0xf6, +- 0x23, 0xac, 0x0d, 0x65, 0x77, 0x0a, 0x6d, 0x3b, 0xe8, 0xc3, 0x0f, 0xd2, +- 0x47, 0xb9, 0x7f, 0xfa, 0x71, 0x5a, 0xd7, 0xa4, 0x81, 0x0f, 0x37, 0x46, +- 0x11, 0x4f, 0xcc, 0xe9, 0x3c, 0x9e, 0x02, 0xc4, 0x72, 0xce, 0x8f, 0x7e, +- 0xf3, 0x28, 0x63, 0xa1, 0x60, 0xf3, 0xc6, 0xad, 0xe6, 0x34, 0x65, 0x59, +- 0x44, 0x2f, 0xf7, 0x63, 0x8e, 0xdd, 0x7e, 0xac, 0x14, 0x37, 0x4a, 0xf2, +- 0xfc, 0x0c, 0xb1, 0x2b, 0x8c, 0xaf, 0x42, 0xe7, 0x6b, 0x91, 0x2f, 0x85, +- 0x69, 0xe6, 0x33, 0xab, 0x51, 0x11, 0x31, 0x84, 0xbb, 0x55, 0x6a, 0x4e, +- 0xa2, 0xdf, 0x0a, 0x34, 0xfc, 0xfc, 0x32, 0xe2, 0x88, 0xd8, 0x8a, 0x98, +- 0x98, 0xdd, 0x44, 0x4c, 0x1c, 0xe7, 0xbb, 0xdd, 0xb7, 0x60, 0x69, 0x5d, +- 0xbb, 0xbf, 0x0f, 0xfd, 0x4b, 0x32, 0x74, 0xce, 0xe0, 0x4e, 0x75, 0x8b, +- 0xef, 0xb4, 0x8d, 0x5f, 0x60, 0x09, 0xe6, 0x57, 0x6d, 0xfc, 0xd2, 0xa7, +- 0x8c, 0x7b, 0x63, 0x7e, 0x67, 0xf3, 0xe6, 0xd7, 0x16, 0x03, 0xae, 0xc5, +- 0x36, 0x9e, 0x63, 0xf6, 0x9b, 0xa7, 0xbb, 0x3f, 0xd7, 0x16, 0x23, 0x36, +- 0x8c, 0x9c, 0x8a, 0x6d, 0xac, 0xcd, 0xbe, 0x81, 0x63, 0xbf, 0xd6, 0xcf, +- 0x85, 0x01, 0x39, 0x93, 0xde, 0x23, 0x90, 0x83, 0x9a, 0x17, 0xac, 0xb1, +- 0x3f, 0x88, 0xa7, 0xd0, 0x2f, 0x81, 0xae, 0xbb, 0x17, 0x2f, 0xc6, 0x31, +- 0xd2, 0xde, 0x7f, 0x80, 0x5c, 0x0f, 0x36, 0xa4, 0x1c, 0xea, 0x4d, 0xbd, +- 0x46, 0x25, 0x3a, 0x9b, 0xeb, 0xf4, 0x17, 0xab, 0xcb, 0xbf, 0xcb, 0xc3, +- 0xfa, 0xce, 0xed, 0xf8, 0xbc, 0x01, 0xbe, 0x3f, 0xdf, 0x86, 0x0f, 0xeb, +- 0x3b, 0xe4, 0x19, 0xb9, 0xd9, 0x6b, 0xd4, 0x6f, 0xc6, 0x75, 0x82, 0xb8, +- 0x27, 0xef, 0xde, 0xbb, 0xdc, 0x60, 0x0e, 0xe4, 0x35, 0x9e, 0x71, 0xce, +- 0x3d, 0xf3, 0x58, 0xcf, 0x63, 0x3c, 0x8f, 0xf9, 0x3c, 0xd6, 0xc3, 0xf8, +- 0x19, 0xe9, 0xfb, 0x57, 0x6f, 0x84, 0xd8, 0x7f, 0xe4, 0x7f, 0xb8, 0xb7, +- 0x10, 0x23, 0x24, 0xb9, 0x75, 0xd7, 0xfb, 0x69, 0xd6, 0xaf, 0x94, 0x98, +- 0x6b, 0xf8, 0xb3, 0x8f, 0xdf, 0x45, 0x7f, 0x10, 0x67, 0xb6, 0x4d, 0xb2, +- 0xb1, 0x4f, 0xd3, 0xef, 0x07, 0xbf, 0x9a, 0x61, 0xf2, 0x17, 0xfb, 0xf5, +- 0x47, 0xf2, 0x9c, 0x62, 0x0e, 0xd9, 0x9c, 0xe2, 0x79, 0x70, 0x0f, 0x37, +- 0x66, 0x19, 0x7e, 0x7c, 0x3e, 0xce, 0xf3, 0x08, 0xf1, 0xf4, 0x40, 0x9e, +- 0xe3, 0xb0, 0x53, 0x74, 0xc3, 0xe8, 0xe9, 0x04, 0x36, 0xe3, 0xdd, 0xb7, +- 0x81, 0xde, 0x89, 0x76, 0x5a, 0x72, 0x9e, 0xb8, 0x79, 0xdf, 0xdd, 0xdb, +- 0x27, 0xd1, 0x6e, 0xb4, 0xeb, 0xa0, 0xdd, 0xc2, 0x78, 0x5c, 0x11, 0x03, +- 0x6e, 0x87, 0x13, 0x79, 0x3d, 0x07, 0x06, 0x4d, 0xe7, 0x76, 0xfa, 0xd8, +- 0x35, 0x3d, 0xe9, 0x7f, 0x2b, 0xd8, 0x8b, 0x0f, 0xdb, 0xee, 0x00, 0x3e, +- 0xdc, 0xa6, 0xe7, 0xa4, 0x0c, 0xda, 0x00, 0xf5, 0xcd, 0xf6, 0x21, 0xec, +- 0x31, 0x6f, 0x18, 0xd7, 0xf6, 0x9b, 0xc4, 0x46, 0xf6, 0x99, 0xdf, 0x2c, +- 0xc8, 0xc8, 0x3e, 0xfb, 0x9e, 0x6c, 0x73, 0x64, 0x4c, 0x48, 0xbf, 0x6e, +- 0x59, 0xfd, 0x1f, 0xcf, 0xf4, 0xef, 0xeb, 0x2c, 0xea, 0xa3, 0x30, 0x8d, +- 0xba, 0x7a, 0xd0, 0x35, 0xcc, 0xed, 0xd2, 0x52, 0xd5, 0x13, 0xd2, 0xa8, +- 0xb0, 0x5f, 0x12, 0xdc, 0xb5, 0xa0, 0xc3, 0x02, 0xf5, 0x28, 0x43, 0x8f, +- 0x51, 0xdc, 0x4d, 0xc2, 0xa5, 0x96, 0x84, 0xc9, 0x0a, 0x08, 0x67, 0xbe, +- 0x43, 0xbb, 0x1d, 0xd3, 0x5b, 0x1d, 0xda, 0xed, 0x49, 0xbd, 0xde, 0x99, +- 0x44, 0x7f, 0x18, 0xc2, 0xdb, 0xe1, 0xec, 0x25, 0x61, 0x8c, 0xcd, 0xc5, +- 0x1c, 0x4f, 0x0b, 0xfb, 0xb1, 0x63, 0x7a, 0xaa, 0xcb, 0xf1, 0x49, 0x1d, +- 0x75, 0x07, 0xe5, 0xfe, 0xc9, 0x00, 0x13, 0x93, 0xeb, 0xc8, 0xa3, 0x17, +- 0x7b, 0xfd, 0xbd, 0x71, 0x3f, 0xcc, 0xe4, 0x62, 0x2e, 0xcd, 0x65, 0x0b, +- 0x71, 0x8a, 0xb2, 0x21, 0x77, 0x32, 0xfe, 0x99, 0xdd, 0x83, 0xf7, 0xa3, +- 0x8f, 0xda, 0xe3, 0xae, 0xfc, 0xfb, 0x04, 0x72, 0xa7, 0x60, 0xb1, 0x67, +- 0x2d, 0xc5, 0x9d, 0xda, 0x37, 0xa6, 0x19, 0xbd, 0x0d, 0xdb, 0xa1, 0x47, +- 0x98, 0xf7, 0xf0, 0x07, 0xae, 0x2e, 0x73, 0x0d, 0x7d, 0x38, 0xee, 0x82, +- 0xbc, 0xcf, 0xad, 0xa5, 0x5c, 0x63, 0x8c, 0xa3, 0x57, 0x9c, 0xff, 0x15, +- 0x68, 0xdf, 0x31, 0xad, 0x9e, 0xb2, 0xf7, 0x75, 0x15, 0xe1, 0x1e, 0xd6, +- 0x63, 0x3f, 0x23, 0x4e, 0x23, 0x95, 0xa0, 0x19, 0x2f, 0xd8, 0xfb, 0x5a, +- 0xe2, 0x05, 0xbc, 0x93, 0xa2, 0x07, 0x9d, 0x1f, 0xe8, 0x41, 0xe7, 0xd1, +- 0x83, 0x8e, 0x15, 0x11, 0xe7, 0x09, 0xee, 0xa1, 0xaa, 0xd9, 0xcf, 0x9b, +- 0x31, 0xde, 0x39, 0xdb, 0xbe, 0xec, 0x43, 0x77, 0x05, 0xdd, 0x22, 0xec, +- 0xcf, 0xf5, 0x3b, 0xb3, 0xef, 0x5a, 0xa3, 0xa0, 0x4f, 0x6c, 0x3f, 0xd6, +- 0xf6, 0x8b, 0xd2, 0x8c, 0x49, 0x73, 0x28, 0xa3, 0xf9, 0xf2, 0x1e, 0x9a, +- 0x3b, 0x79, 0x46, 0xca, 0x96, 0xe6, 0x2b, 0xcc, 0x3b, 0xd6, 0xd2, 0x62, +- 0x96, 0x6f, 0x27, 0xf0, 0x3c, 0x94, 0x3d, 0xe7, 0xf4, 0xf7, 0xee, 0xe1, +- 0x7f, 0xc8, 0xe9, 0xbf, 0xf3, 0x99, 0x3a, 0x27, 0xec, 0x93, 0x21, 0x6f, +- 0xc1, 0xe9, 0x7f, 0x27, 0xc1, 0x85, 0x73, 0x84, 0x3e, 0xe9, 0xf7, 0x17, +- 0xc0, 0x60, 0x74, 0x5f, 0x53, 0xb0, 0xbb, 0x31, 0xed, 0x05, 0xe2, 0xda, +- 0xdc, 0xec, 0x11, 0x8b, 0x6f, 0x6a, 0x42, 0x49, 0x8e, 0xb9, 0x83, 0xcf, +- 0x18, 0x17, 0xec, 0x37, 0x03, 0xbc, 0xf7, 0x65, 0x6c, 0xe1, 0xfe, 0x2c, +- 0xc8, 0xe1, 0x96, 0xd5, 0xcb, 0xe9, 0xdf, 0x8b, 0xbc, 0x1a, 0xeb, 0x01, +- 0xea, 0xc6, 0x0c, 0xf5, 0xba, 0xf9, 0x6d, 0x63, 0x05, 0xb5, 0xe6, 0x2d, +- 0xc4, 0x3e, 0xf2, 0xd3, 0xf6, 0x58, 0x5b, 0xf6, 0xdb, 0x02, 0xea, 0xd0, +- 0x08, 0xee, 0x4b, 0xd1, 0xcd, 0x6f, 0x0c, 0x72, 0x01, 0x34, 0x17, 0xb1, +- 0x76, 0xba, 0x9b, 0xf7, 0xbc, 0xe8, 0xf3, 0x81, 0x7b, 0xab, 0xd1, 0xfb, +- 0xa6, 0xe9, 0x0f, 0xd2, 0xf2, 0xf7, 0x2f, 0x97, 0xa2, 0x15, 0x3a, 0x18, +- 0x15, 0x00, 0x00, 0x00 }; ++ 0xbd, 0x58, 0x5d, 0x6c, 0x1c, 0xd5, 0x15, 0x3e, 0x33, 0x3b, 0xde, 0x1d, ++ 0x3b, 0x76, 0x32, 0x86, 0x25, 0xdd, 0x50, 0x63, 0x66, 0xec, 0xb1, 0xbd, ++ 0xd4, 0x56, 0x18, 0xca, 0x02, 0x8b, 0x3a, 0xb4, 0xd3, 0xdd, 0xb5, 0xe3, ++ 0x86, 0x3c, 0x38, 0x6a, 0x2a, 0x42, 0xc9, 0x83, 0x59, 0x27, 0x84, 0x8a, ++ 0x56, 0x0a, 0xb4, 0x0f, 0x51, 0x79, 0xc8, 0x76, 0xed, 0x84, 0xb4, 0xdd, ++ 0x78, 0x5b, 0x53, 0x25, 0x2f, 0x7d, 0x88, 0x9c, 0x38, 0xe6, 0x61, 0xc9, ++ 0x86, 0xf6, 0xa9, 0x0f, 0x08, 0x2b, 0x94, 0x00, 0x0f, 0x15, 0xa2, 0xa2, ++ 0x55, 0x1f, 0x23, 0x40, 0x40, 0xa5, 0xb6, 0x8a, 0xaa, 0x82, 0x10, 0x4d, ++ 0x33, 0xfd, 0xbe, 0x3b, 0x33, 0xce, 0xe6, 0x4f, 0x7d, 0xeb, 0x4a, 0xab, ++ 0xb9, 0x33, 0xf7, 0x9e, 0x73, 0xcf, 0x3d, 0x3f, 0xdf, 0x39, 0xe7, 0x0e, ++ 0x69, 0xd2, 0x23, 0xf1, 0xaf, 0x0f, 0xff, 0x07, 0x9e, 0x3c, 0xf0, 0x23, ++ 0x6f, 0xab, 0xb7, 0x15, 0xc3, 0xfd, 0x9a, 0x48, 0x97, 0xfc, 0x1f, 0x7f, ++ 0x29, 0x11, 0x2b, 0x91, 0x83, 0x7f, 0x31, 0x75, 0x7f, 0x6d, 0xa0, 0xe4, ++ 0x8a, 0x99, 0xf2, 0x2b, 0xf6, 0x9c, 0x2b, 0x12, 0xb4, 0xc6, 0xed, 0xb2, ++ 0xfc, 0x27, 0xac, 0x65, 0x0d, 0xe1, 0xf7, 0xbb, 0xfc, 0xcb, 0xf7, 0xbe, ++ 0xfa, 0x90, 0x73, 0xe9, 0x64, 0x4a, 0x4c, 0xcb, 0x3f, 0x6a, 0x58, 0xa3, ++ 0x62, 0x0e, 0x80, 0xe6, 0xd7, 0x63, 0xef, 0xeb, 0xb2, 0x31, 0xe1, 0x55, ++ 0x0b, 0x75, 0xf7, 0x62, 0xf8, 0xea, 0x98, 0x6b, 0xd5, 0xb1, 0xc1, 0xb9, ++ 0xb6, 0x2d, 0xa5, 0x76, 0x4e, 0x5e, 0x6b, 0x67, 0xe5, 0x95, 0xb6, 0x21, ++ 0xfb, 0x5e, 0x3c, 0x24, 0x0b, 0x9e, 0x93, 0xab, 0xa4, 0x4c, 0xd1, 0x7d, ++ 0x27, 0x57, 0x15, 0x5b, 0x56, 0x3c, 0xa7, 0x36, 0x9b, 0xea, 0xd7, 0x4c, ++ 0xdf, 0x94, 0xe7, 0xc7, 0x74, 0x39, 0x99, 0xdd, 0x23, 0x4f, 0xb9, 0xbb, ++ 0xf1, 0x37, 0x44, 0x5f, 0x32, 0xb4, 0xf2, 0x09, 0x43, 0x8c, 0xa5, 0x4d, ++ 0xb2, 0xcd, 0x0b, 0xc3, 0x39, 0x2f, 0x00, 0xfd, 0x70, 0x7e, 0xbf, 0x74, ++ 0x4b, 0xcd, 0x72, 0xa6, 0xa9, 0x34, 0xac, 0x91, 0x92, 0xd7, 0x25, 0x81, ++ 0x15, 0x9d, 0xeb, 0xa4, 0x7a, 0x5e, 0x0e, 0x57, 0x40, 0xdf, 0xed, 0x26, ++ 0xf3, 0xb7, 0xc5, 0xf3, 0x56, 0x3c, 0xaf, 0x8b, 0x7e, 0xdc, 0xb1, 0x57, ++ 0x65, 0x24, 0x30, 0xb4, 0x2b, 0x61, 0xc9, 0xdd, 0x6c, 0x95, 0x56, 0x0d, ++ 0x49, 0x2d, 0x51, 0x7e, 0xd7, 0x2a, 0x4b, 0x08, 0x9a, 0x14, 0x69, 0x0c, ++ 0xdd, 0x7f, 0x0e, 0x76, 0x1b, 0x09, 0x74, 0x98, 0xe8, 0x7c, 0x23, 0x67, ++ 0x95, 0xda, 0x07, 0xb5, 0x52, 0xf3, 0x4a, 0x18, 0x18, 0x3d, 0xa2, 0xbb, ++ 0x81, 0x56, 0x5a, 0x25, 0xaf, 0x6e, 0x31, 0xdc, 0x0c, 0x68, 0x86, 0x2d, ++ 0x5d, 0xf8, 0x2c, 0xc5, 0xdf, 0xc9, 0xbb, 0x82, 0xf1, 0x94, 0x16, 0xac, ++ 0x1a, 0x5a, 0xe9, 0xc4, 0x34, 0xc6, 0x26, 0xe8, 0xa1, 0x17, 0x4f, 0x93, ++ 0x60, 0x46, 0x03, 0x1d, 0xcf, 0x69, 0xe1, 0x5d, 0x97, 0x20, 0x6b, 0xc9, ++ 0x7c, 0xc1, 0xc9, 0xd5, 0x64, 0xbb, 0x56, 0x5e, 0xbd, 0xc1, 0x68, 0xd6, ++ 0x74, 0xfb, 0xc6, 0x6f, 0x94, 0xe5, 0x9b, 0x46, 0x18, 0xea, 0xf7, 0x65, ++ 0xe2, 0x33, 0x92, 0x5f, 0x10, 0xc9, 0x9f, 0xe5, 0x3b, 0x64, 0x6e, 0x42, ++ 0xf6, 0x56, 0x1a, 0xf2, 0x84, 0x21, 0xf7, 0x29, 0xb9, 0x65, 0xc8, 0x19, ++ 0xe0, 0xef, 0x1c, 0xad, 0xc2, 0x15, 0x86, 0x8e, 0xf7, 0x89, 0xdd, 0x1f, ++ 0x86, 0x15, 0xcf, 0xb1, 0x56, 0xc5, 0x97, 0xf9, 0xe6, 0x80, 0x35, 0xd9, ++ 0xac, 0x63, 0xbe, 0xc6, 0x35, 0xd0, 0x87, 0xc8, 0x64, 0x2b, 0x0c, 0xcf, ++ 0x78, 0xef, 0xc2, 0xd6, 0xfa, 0x44, 0x97, 0x38, 0x76, 0x80, 0x6f, 0x43, ++ 0x67, 0xae, 0xd7, 0xd9, 0xdd, 0xb1, 0x0c, 0xd4, 0x3b, 0xf6, 0xf1, 0xbe, ++ 0x1c, 0xbf, 0xf7, 0x5a, 0xa5, 0x13, 0x89, 0x9e, 0x95, 0xdc, 0xd0, 0xab, ++ 0x27, 0xa5, 0x02, 0xe4, 0xbf, 0xe5, 0x99, 0x12, 0x3a, 0xca, 0x42, 0xb9, ++ 0xb1, 0xde, 0xbd, 0x2a, 0xd3, 0x13, 0x37, 0xc8, 0x44, 0x79, 0x74, 0x31, ++ 0x8e, 0x9b, 0xb2, 0xe0, 0x7e, 0xac, 0xc9, 0xc6, 0x30, 0x5c, 0xf0, 0x0c, ++ 0xad, 0x72, 0xe2, 0xd3, 0x78, 0x0c, 0x3f, 0x6c, 0xc2, 0x0f, 0x9b, 0xf0, ++ 0xcb, 0xa6, 0x58, 0xba, 0x6f, 0xcb, 0xab, 0x63, 0xa6, 0x5c, 0x4c, 0xc1, ++ 0x9e, 0x6d, 0xce, 0x67, 0xa4, 0xee, 0xb9, 0x72, 0xb8, 0x49, 0xcd, 0x64, ++ 0x64, 0xde, 0xfd, 0x3c, 0xdc, 0x0b, 0x7d, 0x9c, 0x96, 0xf0, 0xee, 0x12, ++ 0x7c, 0xb6, 0x04, 0x75, 0x3e, 0xef, 0xe6, 0xe5, 0x70, 0xdb, 0x95, 0x7a, ++ 0x9b, 0x74, 0x0b, 0x12, 0xd1, 0x6d, 0x02, 0xdd, 0x04, 0xe8, 0x0a, 0x72, ++ 0x44, 0xd1, 0x6e, 0x02, 0xed, 0xa5, 0x98, 0x76, 0x3c, 0x37, 0x25, 0x1e, ++ 0x68, 0x86, 0xed, 0x29, 0xf8, 0xdc, 0x6c, 0x76, 0x02, 0xb4, 0x13, 0xb2, ++ 0x80, 0x7f, 0xbd, 0x29, 0x35, 0xa3, 0x40, 0xbe, 0x4e, 0x6e, 0x2f, 0x75, ++ 0xae, 0x78, 0xd6, 0xc0, 0x33, 0x8b, 0x39, 0x13, 0x7c, 0x0c, 0x3c, 0x3f, ++ 0x0c, 0xeb, 0x4d, 0xf8, 0x76, 0x96, 0xe3, 0xd7, 0x42, 0xdd, 0x87, 0x1e, ++ 0x0a, 0xae, 0x5d, 0x17, 0xbe, 0xa7, 0xa5, 0x0c, 0x5b, 0xea, 0xee, 0x26, ++ 0xa9, 0x5a, 0x9a, 0xa6, 0xfb, 0x29, 0xa9, 0x42, 0x0b, 0xc1, 0x8c, 0xa1, ++ 0xbe, 0xcd, 0x5a, 0x1a, 0x62, 0x6c, 0xab, 0x1e, 0x61, 0x4e, 0x17, 0xd6, ++ 0xc0, 0xfe, 0x6e, 0xaf, 0x54, 0xb3, 0xfd, 0x58, 0x8b, 0x40, 0xeb, 0x19, ++ 0x41, 0x8c, 0xf6, 0x63, 0x0d, 0x9f, 0xb4, 0x03, 0xd6, 0xbb, 0x5c, 0xdf, ++ 0x0b, 0x19, 0x93, 0x6f, 0xbd, 0x52, 0xbb, 0xc6, 0x3e, 0x94, 0x51, 0xd9, ++ 0x05, 0xfb, 0x1b, 0xb1, 0x6d, 0x3b, 0xed, 0x95, 0xcc, 0x5b, 0x3c, 0xdf, ++ 0xe7, 0x65, 0xf7, 0xfc, 0x3d, 0xba, 0x5c, 0x0a, 0x97, 0x5d, 0x2d, 0x35, ++ 0x37, 0x91, 0x82, 0x4c, 0x25, 0xd8, 0xee, 0x3b, 0x4a, 0xa6, 0x7a, 0x2b, ++ 0x07, 0x3f, 0x1b, 0xb7, 0x4e, 0xc9, 0x06, 0x9c, 0xcf, 0x29, 0x8a, 0x0c, ++ 0x63, 0xac, 0xc9, 0x94, 0x3b, 0x00, 0x5a, 0xc7, 0xaa, 0x0a, 0xce, 0xea, ++ 0x8e, 0x5b, 0x93, 0x38, 0x6b, 0xb0, 0x0b, 0xfe, 0xed, 0x46, 0x74, 0x47, ++ 0x5a, 0x1c, 0x7f, 0x37, 0xe6, 0x81, 0x7f, 0x83, 0x98, 0x25, 0x77, 0xcd, ++ 0xb9, 0x41, 0x3f, 0xfc, 0xa2, 0x58, 0x56, 0x32, 0x38, 0xd6, 0x45, 0x08, ++ 0xd3, 0xed, 0xbb, 0x83, 0xf7, 0x1c, 0x0b, 0x76, 0x42, 0x34, 0x73, 0x0b, ++ 0xd6, 0x3c, 0x3c, 0xe6, 0x1c, 0x5c, 0x13, 0x67, 0xb6, 0x06, 0xde, 0x1b, ++ 0x5d, 0xee, 0xe9, 0x04, 0x8f, 0x6b, 0x0f, 0xc2, 0xf7, 0x1d, 0x8f, 0xc2, ++ 0xe7, 0x7c, 0x7f, 0x30, 0x37, 0x26, 0x66, 0x9f, 0x1f, 0x0c, 0xbe, 0x3c, ++ 0x32, 0xbe, 0x7b, 0x93, 0xd4, 0xfa, 0xd3, 0xf0, 0xb5, 0x29, 0x59, 0xcb, ++ 0xd1, 0xe7, 0x0e, 0x62, 0x51, 0xa9, 0x61, 0x4b, 0xfd, 0x0e, 0xc7, 0xfe, ++ 0x01, 0xc6, 0xcb, 0x8d, 0x6e, 0xc8, 0x96, 0x13, 0xfd, 0x18, 0xf1, 0x33, ++ 0x3f, 0x58, 0x6a, 0x68, 0xc4, 0x4a, 0xca, 0x65, 0x6a, 0x78, 0x1f, 0x6a, ++ 0xbd, 0x03, 0x39, 0x1d, 0x5b, 0x80, 0x73, 0xdb, 0x9a, 0xdc, 0x63, 0x0d, ++ 0x32, 0x6e, 0x97, 0xd9, 0x7e, 0xe2, 0xe2, 0x80, 0x98, 0xc7, 0x4c, 0xe9, ++ 0xf6, 0x45, 0x4e, 0x35, 0x9c, 0xdc, 0x53, 0x52, 0xcb, 0xa5, 0xb0, 0xc7, ++ 0x8f, 0xf1, 0xff, 0x16, 0x78, 0x57, 0xc0, 0xeb, 0x82, 0xeb, 0xe4, 0x9e, ++ 0x96, 0x71, 0xeb, 0x1d, 0xf9, 0x2c, 0x64, 0x2c, 0xef, 0x6d, 0xfd, 0x41, ++ 0x4f, 0x72, 0xc8, 0x42, 0x63, 0xdc, 0x5a, 0xa4, 0x6e, 0x66, 0xd4, 0xba, ++ 0x03, 0x35, 0x9c, 0x7d, 0x4d, 0x38, 0x1e, 0xb7, 0xde, 0x96, 0x3f, 0x62, ++ 0x3d, 0x65, 0xa7, 0x4d, 0x21, 0x67, 0x8b, 0xf2, 0xd9, 0x90, 0x8f, 0xba, ++ 0x72, 0x07, 0xe7, 0x40, 0x5b, 0x96, 0xaf, 0x40, 0xef, 0x57, 0x42, 0xc3, ++ 0x75, 0xac, 0xc7, 0xb5, 0x1c, 0xce, 0x35, 0x0a, 0x7b, 0x86, 0x78, 0xaf, ++ 0x39, 0x19, 0xe8, 0xa2, 0x0b, 0xf2, 0xaf, 0x34, 0x1c, 0xfb, 0x05, 0xc9, ++ 0x49, 0xfa, 0xd8, 0x9a, 0x6d, 0xa8, 0x1c, 0xe1, 0x0f, 0x96, 0xb0, 0x1e, ++ 0xbe, 0x01, 0x3e, 0xc1, 0x20, 0xf3, 0xc4, 0x8e, 0x96, 0x26, 0x2b, 0x90, ++ 0x73, 0x5e, 0xcd, 0x57, 0x06, 0x79, 0xfe, 0x7d, 0xad, 0xb5, 0xfb, 0xd2, ++ 0x12, 0xe9, 0x60, 0xa4, 0xe5, 0xc0, 0x5f, 0x79, 0xfe, 0x01, 0x31, 0x5e, ++ 0xb6, 0x65, 0xaa, 0xdd, 0x23, 0x17, 0x95, 0xbe, 0x55, 0x0e, 0xc8, 0x23, ++ 0xae, 0xa0, 0x47, 0x25, 0x77, 0xee, 0x1d, 0xa1, 0xee, 0x0c, 0xf0, 0xfb, ++ 0x22, 0x9c, 0x85, 0xcf, 0x2f, 0xb8, 0xa0, 0x6b, 0x53, 0x7f, 0x91, 0x4d, ++ 0x69, 0xb7, 0x05, 0xe4, 0x81, 0x0b, 0x9e, 0xc0, 0xd3, 0x47, 0xf2, 0x67, ++ 0xf0, 0x5e, 0x2f, 0x3a, 0xf0, 0x91, 0xf1, 0xfc, 0xa4, 0xf0, 0xa9, 0x0f, ++ 0xe8, 0xf4, 0x1b, 0x8f, 0x98, 0xd5, 0x39, 0xc6, 0xb3, 0x48, 0x1e, 0x7c, ++ 0x7f, 0x0b, 0xf9, 0xc9, 0x43, 0x4e, 0x9a, 0x90, 0xdf, 0xb6, 0xf3, 0xf2, ++ 0x1b, 0xc4, 0xf3, 0x2b, 0xc8, 0x53, 0xe7, 0xda, 0xe6, 0xac, 0xe1, 0xcb, ++ 0x4c, 0xbd, 0x71, 0x28, 0x4c, 0xb9, 0x32, 0x9b, 0xf6, 0x89, 0x69, 0xbd, ++ 0x45, 0x60, 0xd4, 0x4c, 0xbd, 0x35, 0xb0, 0xe3, 0x7c, 0x43, 0x6a, 0x77, ++ 0xfa, 0xfa, 0x66, 0x5d, 0x36, 0x01, 0xd7, 0x88, 0xb5, 0xf0, 0xd3, 0xf6, ++ 0xc0, 0x8e, 0xd7, 0x1b, 0x77, 0xe3, 0x1c, 0x72, 0x19, 0x71, 0x89, 0x7c, ++ 0x76, 0x7e, 0x4b, 0x0a, 0xfa, 0x62, 0x2c, 0x03, 0x73, 0x83, 0x27, 0xc6, ++ 0xe0, 0x0f, 0x05, 0x8c, 0xb1, 0x47, 0xad, 0x3d, 0x30, 0xab, 0xfb, 0x35, ++ 0x09, 0xda, 0x0b, 0xf8, 0x9b, 0x32, 0xd9, 0x30, 0xcd, 0xd7, 0xc1, 0x53, ++ 0x2f, 0x38, 0x76, 0x29, 0x75, 0x89, 0x18, 0x0a, 0xfa, 0x1a, 0x79, 0x41, ++ 0x6f, 0xb6, 0x31, 0xd4, 0xea, 0x7e, 0x0c, 0xfa, 0x06, 0x56, 0x18, 0x88, ++ 0xd9, 0x02, 0x30, 0x84, 0xb6, 0xcc, 0xa6, 0xa4, 0x07, 0xf8, 0x00, 0x8c, ++ 0xa8, 0xb5, 0x1f, 0x91, 0x14, 0x73, 0x87, 0xcb, 0xf5, 0x45, 0xf8, 0x1a, ++ 0x9f, 0x85, 0xc1, 0x61, 0xf5, 0xf4, 0xe2, 0xe7, 0x84, 0x7a, 0xde, 0x0e, ++ 0xdf, 0xff, 0xe1, 0x28, 0xf2, 0xa8, 0x4b, 0x1b, 0xe5, 0xee, 0x2a, 0xb9, ++ 0x26, 0x68, 0x91, 0x4f, 0x41, 0x1f, 0xb4, 0x98, 0xeb, 0x2f, 0x87, 0x4f, ++ 0x1a, 0xf0, 0x49, 0x77, 0x0d, 0xa8, 0xe3, 0x58, 0x15, 0x79, 0x44, 0xe5, ++ 0x7c, 0xf2, 0x1b, 0x6a, 0x69, 0xf1, 0x1e, 0x36, 0xc6, 0x8c, 0x3d, 0x8e, ++ 0xfd, 0x78, 0xbf, 0xfc, 0xa0, 0xdd, 0xc2, 0x19, 0xfc, 0x03, 0x52, 0x29, ++ 0x88, 0xcc, 0x37, 0x10, 0x1f, 0x4d, 0x9c, 0xb9, 0x88, 0x3f, 0xf0, 0x36, ++ 0xb0, 0x8a, 0xd0, 0x85, 0x13, 0xc0, 0x37, 0xbd, 0x59, 0xd8, 0x36, 0x73, ++ 0x8c, 0x7e, 0xb5, 0xc7, 0x58, 0x81, 0x1f, 0x1a, 0xfe, 0x6e, 0x63, 0xa1, ++ 0x31, 0xec, 0x7d, 0x84, 0xfd, 0x10, 0x87, 0xb0, 0xe5, 0xb8, 0x77, 0x46, ++ 0xe8, 0x2b, 0x8e, 0x7d, 0x44, 0xf9, 0xce, 0x1e, 0x63, 0x44, 0xed, 0xb1, ++ 0xdb, 0x70, 0x5b, 0x9d, 0x7c, 0xff, 0x0e, 0xdf, 0x76, 0xbc, 0x8b, 0x52, ++ 0x94, 0x17, 0xda, 0xd1, 0xde, 0xb0, 0x91, 0x6c, 0x6b, 0x14, 0x81, 0xbf, ++ 0x37, 0xf0, 0x2f, 0x26, 0xfc, 0x57, 0x15, 0x6f, 0x62, 0xeb, 0xb8, 0xb7, ++ 0x7a, 0xd3, 0x3d, 0x36, 0x27, 0xf9, 0x13, 0x79, 0x3a, 0xaa, 0x27, 0xe6, ++ 0x9b, 0x19, 0x60, 0x76, 0x18, 0x56, 0xdd, 0x83, 0xd0, 0x7b, 0x0f, 0xf0, ++ 0xd5, 0xc2, 0x9f, 0x31, 0xc7, 0x39, 0x4d, 0xaa, 0x8c, 0xf5, 0x36, 0xc7, ++ 0x9c, 0x63, 0xbe, 0xcd, 0xe0, 0x79, 0x08, 0x6b, 0x3f, 0x0c, 0x6b, 0x6d, ++ 0xe6, 0x02, 0xea, 0x0e, 0x18, 0xde, 0x36, 0xb5, 0x72, 0x53, 0xb4, 0x4a, ++ 0x53, 0xec, 0xaa, 0x67, 0x28, 0xff, 0x08, 0x2c, 0x0b, 0xb6, 0xa5, 0x3d, ++ 0x26, 0x8c, 0x18, 0x37, 0x68, 0x2f, 0xd8, 0xdd, 0xc8, 0x20, 0xc6, 0x03, ++ 0xf8, 0x81, 0xbe, 0x0f, 0x39, 0xfc, 0x64, 0x56, 0x36, 0xe9, 0x6e, 0x77, ++ 0xaa, 0x9e, 0x95, 0x3e, 0xdd, 0xa5, 0x6c, 0xcf, 0xa6, 0x20, 0x1b, 0xe7, ++ 0x83, 0xaa, 0xf7, 0x32, 0xf6, 0xf4, 0x55, 0xbe, 0xa8, 0x34, 0x92, 0xba, ++ 0x04, 0x3c, 0x5d, 0xe6, 0x34, 0x33, 0xae, 0x4f, 0x4a, 0x71, 0xed, 0x81, ++ 0x78, 0x42, 0x1e, 0xdd, 0x89, 0xba, 0xa3, 0xae, 0xfc, 0xd7, 0xa9, 0xd9, ++ 0xfa, 0x95, 0x70, 0x78, 0x94, 0x39, 0x24, 0x0c, 0x0f, 0x78, 0x53, 0x58, ++ 0xdb, 0x82, 0xec, 0xd3, 0xa8, 0x3d, 0x58, 0xaf, 0xa8, 0x78, 0x87, 0x6c, ++ 0x7d, 0x51, 0x5d, 0x82, 0x9a, 0xa5, 0xae, 0x6a, 0x94, 0x6e, 0xf8, 0x8e, ++ 0x86, 0xbf, 0x63, 0xcf, 0x0a, 0xbf, 0x4b, 0xb7, 0x8e, 0xf7, 0x2a, 0xf2, ++ 0xce, 0x42, 0x61, 0xbb, 0x56, 0x59, 0x7d, 0x33, 0x15, 0x63, 0x14, 0xe4, ++ 0x46, 0xde, 0xc9, 0x92, 0x2e, 0x0d, 0xba, 0x3e, 0xd0, 0x5c, 0xc0, 0x5c, ++ 0x17, 0x9e, 0x9d, 0x7c, 0x54, 0xad, 0x43, 0x7c, 0xc2, 0x5e, 0xd3, 0x62, ++ 0xf8, 0x3d, 0xc8, 0xe7, 0x23, 0x76, 0x45, 0xee, 0x8f, 0xeb, 0x4a, 0xe6, ++ 0x9a, 0xaf, 0x77, 0xe4, 0x1a, 0x5b, 0x52, 0x2a, 0x36, 0x1f, 0x8e, 0x73, ++ 0x24, 0xeb, 0x8c, 0x07, 0xe3, 0xf9, 0x2c, 0xea, 0x85, 0xfb, 0xe3, 0xba, ++ 0xc7, 0xc4, 0xd8, 0x97, 0xa3, 0xaa, 0x76, 0x48, 0xb3, 0x76, 0x00, 0x86, ++ 0xd7, 0x8a, 0xc0, 0x58, 0xef, 0x13, 0xe0, 0x62, 0x19, 0x08, 0xf4, 0xfb, ++ 0x86, 0x81, 0x9c, 0x94, 0x02, 0x3d, 0x6b, 0x57, 0xd3, 0x00, 0x56, 0x5b, ++ 0x9f, 0xe0, 0x4c, 0xcc, 0x37, 0xc4, 0x99, 0x2e, 0xdf, 0xb5, 0x0f, 0xcb, ++ 0x68, 0xee, 0x30, 0xf2, 0x78, 0x0a, 0x38, 0x6c, 0x08, 0xf7, 0x4d, 0x6a, ++ 0x4d, 0xfe, 0xfa, 0xe2, 0x27, 0xa0, 0xc6, 0x65, 0x7d, 0x98, 0x01, 0x8f, ++ 0x11, 0x7b, 0x12, 0x78, 0x33, 0x5f, 0xfc, 0x5f, 0x34, 0x23, 0x31, 0x0d, ++ 0xea, 0xae, 0x02, 0xf7, 0x05, 0xe6, 0x2b, 0x9c, 0xf6, 0x3a, 0xfc, 0xc1, ++ 0x83, 0x3f, 0x88, 0x54, 0x9b, 0xc0, 0x01, 0xd8, 0x58, 0xf9, 0x1a, 0xd6, ++ 0xeb, 0x05, 0xe4, 0xfc, 0x2c, 0xfd, 0x9a, 0xfe, 0xbe, 0x2b, 0xf6, 0xf7, ++ 0x19, 0xf8, 0xbb, 0x93, 0x3f, 0x87, 0x38, 0x3a, 0x77, 0x4d, 0x1c, 0xed, ++ 0x8a, 0x7d, 0x7c, 0x06, 0x3e, 0xfe, 0x45, 0x5a, 0x7a, 0x4c, 0xe2, 0x00, ++ 0xf3, 0xa6, 0x56, 0x42, 0xed, 0x02, 0x3f, 0x88, 0xf9, 0xec, 0x88, 0xf9, ++ 0x4c, 0xdf, 0x82, 0xcf, 0x8e, 0x98, 0xcf, 0x74, 0x27, 0x1f, 0xd0, 0x55, ++ 0x62, 0xba, 0xe0, 0x16, 0x74, 0x95, 0x98, 0x2e, 0xe8, 0xa0, 0x33, 0x71, ++ 0x26, 0x9e, 0x8b, 0x78, 0x7a, 0x09, 0xb6, 0xf0, 0x44, 0xf9, 0x8a, 0x15, ++ 0xe0, 0xf9, 0x8c, 0x56, 0xb5, 0x6c, 0xda, 0x15, 0x71, 0x40, 0x3d, 0x74, ++ 0x31, 0x06, 0xae, 0xd3, 0xdd, 0x0c, 0x74, 0xb7, 0xee, 0xef, 0xf8, 0x7d, ++ 0x0d, 0xbe, 0x62, 0xc9, 0xe9, 0x31, 0xd6, 0x4a, 0x4e, 0x2d, 0xb8, 0x66, ++ 0xed, 0x63, 0x4a, 0xcf, 0xfa, 0xe2, 0xcd, 0x6c, 0x80, 0x3a, 0x82, 0x35, ++ 0x51, 0x33, 0x25, 0x65, 0x83, 0xb1, 0xfa, 0xb3, 0x2e, 0xe5, 0xbb, 0x67, ++ 0xb1, 0xfe, 0x6c, 0x14, 0x57, 0x93, 0x0d, 0x64, 0xc3, 0xe5, 0x5e, 0xd9, ++ 0x87, 0x7a, 0x67, 0x2f, 0x7c, 0xe9, 0x94, 0x87, 0x28, 0x94, 0x61, 0xf8, ++ 0x45, 0x08, 0xbf, 0x76, 0x94, 0x6d, 0x4b, 0xee, 0xfc, 0x51, 0x5d, 0x7e, ++ 0x22, 0x43, 0x5b, 0x7b, 0xa4, 0xeb, 0x4c, 0x54, 0xaf, 0x19, 0xcb, 0x9d, ++ 0xfb, 0x3c, 0x47, 0x19, 0xcc, 0x0c, 0x72, 0xef, 0xc7, 0x0d, 0x4b, 0x5e, ++ 0x02, 0x9f, 0x6e, 0xd7, 0x01, 0x8a, 0xdc, 0x2e, 0x17, 0xad, 0xa8, 0xf6, ++ 0xe8, 0x45, 0x3e, 0x6d, 0x8c, 0x38, 0xf9, 0x9a, 0xe6, 0xe4, 0xd8, 0xbf, ++ 0x2c, 0x37, 0xee, 0x15, 0x7d, 0xa7, 0x93, 0xfb, 0x3e, 0x26, 0x4f, 0x37, ++ 0x4c, 0x7d, 0x0e, 0x79, 0xfd, 0xa7, 0xc2, 0x9e, 0xc4, 0xd4, 0x91, 0x6f, ++ 0xa7, 0x81, 0xa9, 0x33, 0x49, 0xbe, 0x7f, 0x53, 0xfe, 0x15, 0x06, 0xbb, ++ 0x48, 0x43, 0x7b, 0xb8, 0x83, 0xb4, 0x47, 0x92, 0xef, 0xbb, 0x7d, 0xe3, ++ 0xae, 0x7b, 0x46, 0x98, 0xaf, 0xfd, 0x41, 0xf2, 0x58, 0x5e, 0xdf, 0x8b, ++ 0x36, 0xcb, 0x0f, 0x2e, 0x60, 0xcd, 0x06, 0xe4, 0xed, 0x67, 0x46, 0xee, ++ 0x04, 0xef, 0xe0, 0x3e, 0x13, 0x35, 0x4f, 0x97, 0xca, 0xa5, 0x6b, 0xac, ++ 0xb3, 0x8b, 0x6f, 0x63, 0x8f, 0x05, 0xd7, 0xf1, 0x1e, 0x15, 0x27, 0x57, ++ 0x16, 0x95, 0xeb, 0xad, 0x1d, 0x90, 0xe9, 0x69, 0xd4, 0x6f, 0x1f, 0xc5, ++ 0x39, 0x80, 0xf8, 0x5c, 0x51, 0x63, 0x17, 0xf9, 0xfe, 0x4f, 0x88, 0x01, ++ 0xe4, 0xfa, 0xc5, 0x6b, 0x6a, 0xa2, 0xb8, 0x1e, 0x7a, 0xcf, 0xa0, 0x7e, ++ 0xab, 0xad, 0x5a, 0x7f, 0x0f, 0xf6, 0xd8, 0x1e, 0xed, 0x91, 0x67, 0x7f, ++ 0x81, 0x1a, 0xa8, 0xb8, 0x43, 0xed, 0x15, 0x6c, 0x61, 0x8c, 0xbe, 0x8d, ++ 0xfd, 0xbe, 0x87, 0x35, 0x8f, 0x62, 0xee, 0x25, 0xec, 0x35, 0xbb, 0xbe, ++ 0x57, 0x0e, 0xbd, 0x8c, 0xc8, 0x87, 0x2d, 0xee, 0xe1, 0xa3, 0xee, 0xbe, ++ 0x23, 0x23, 0x1b, 0x1d, 0xcf, 0xd6, 0x91, 0x27, 0x9b, 0xc4, 0x59, 0xe0, ++ 0xde, 0x19, 0xd6, 0xf7, 0xcc, 0xa7, 0x26, 0xe2, 0x3b, 0xc1, 0xf4, 0x0c, ++ 0x7a, 0x95, 0xbf, 0xa1, 0xa6, 0xd4, 0x65, 0xae, 0x10, 0x86, 0x93, 0xde, ++ 0x5f, 0x21, 0x0b, 0xbe, 0x2d, 0x73, 0xee, 0x12, 0xbe, 0xf3, 0x9b, 0x29, ++ 0xe9, 0xe3, 0xb7, 0xcb, 0x79, 0xd6, 0xd1, 0xbb, 0xb8, 0x3e, 0x83, 0x3e, ++ 0x86, 0x39, 0x1c, 0xcf, 0x65, 0xbe, 0x6b, 0xb1, 0x9f, 0xa6, 0xf0, 0xdc, ++ 0x80, 0x67, 0x18, 0xbe, 0xe9, 0x99, 0xf0, 0x19, 0x5d, 0xde, 0x77, 0xe9, ++ 0x2f, 0xa8, 0x9f, 0xfc, 0x5e, 0x29, 0x37, 0x5c, 0xd4, 0xf4, 0x23, 0xb9, ++ 0x7d, 0xc0, 0xae, 0x72, 0x2b, 0x83, 0x79, 0xae, 0x4b, 0xe6, 0xad, 0x8e, ++ 0x79, 0x8c, 0x5b, 0x9c, 0x23, 0xfd, 0x3c, 0x74, 0x81, 0xbe, 0x69, 0x99, ++ 0xfd, 0x17, 0x7b, 0x29, 0xd5, 0xe7, 0x78, 0xd4, 0xcd, 0x1b, 0x0d, 0xe2, ++ 0x84, 0x41, 0xdc, 0xfc, 0x92, 0x0e, 0x9f, 0x29, 0x67, 0x93, 0x33, 0x85, ++ 0x21, 0xb0, 0x30, 0x77, 0x4a, 0xd5, 0x39, 0xc3, 0xd6, 0x36, 0x61, 0x8f, ++ 0x35, 0x92, 0xaf, 0x92, 0xa6, 0xd5, 0x85, 0xbe, 0x79, 0x40, 0x52, 0x8b, ++ 0xf4, 0xd3, 0xab, 0x7d, 0x5c, 0xe9, 0x17, 0xac, 0x5f, 0x54, 0x8e, 0x87, ++ 0x5c, 0xe8, 0x09, 0x96, 0x0d, 0xe2, 0x20, 0x78, 0xf5, 0x48, 0x0a, 0xfd, ++ 0xe1, 0x61, 0x2f, 0xe1, 0xf5, 0x67, 0xf0, 0x92, 0xac, 0x8e, 0x3a, 0x6b, ++ 0x19, 0x75, 0xe6, 0x1b, 0x2d, 0xea, 0x82, 0x3c, 0xf3, 0x32, 0xe7, 0xce, ++ 0xb3, 0x56, 0xc5, 0x19, 0xd0, 0x5b, 0x17, 0xd2, 0xd0, 0x61, 0x46, 0xf1, ++ 0xa9, 0x37, 0xff, 0x1d, 0x12, 0xdb, 0x51, 0x0b, 0x61, 0x2f, 0xbc, 0xb7, ++ 0x31, 0x07, 0x19, 0x32, 0xb0, 0xd3, 0x91, 0x66, 0x54, 0xdf, 0xee, 0x87, ++ 0x4e, 0x2a, 0x8d, 0xcf, 0x92, 0x5e, 0x26, 0x0f, 0x9c, 0x40, 0xed, 0xdb, ++ 0x2b, 0xc6, 0x59, 0xc4, 0x58, 0x8b, 0xeb, 0x31, 0x5e, 0x3c, 0x14, 0xcf, ++ 0x93, 0xc6, 0xc5, 0xfe, 0xec, 0x79, 0x9c, 0xdc, 0xfe, 0x8e, 0x75, 0xfa, ++ 0x52, 0x74, 0xa6, 0x6d, 0x72, 0x9b, 0x4c, 0xfe, 0xca, 0x42, 0x2f, 0x78, ++ 0xf5, 0xdb, 0x94, 0xf0, 0xdd, 0x92, 0x65, 0xf4, 0x4e, 0xa9, 0x25, 0xf6, ++ 0x05, 0x6a, 0x6f, 0xd0, 0x3b, 0xf6, 0xb7, 0x21, 0x57, 0xb5, 0x81, 0x1a, ++ 0xad, 0xb1, 0x11, 0xb9, 0x3d, 0x8b, 0x38, 0x67, 0x6c, 0x78, 0xa8, 0x89, ++ 0xf1, 0x4d, 0xe1, 0x6f, 0x01, 0x3e, 0x3b, 0x8e, 0xfe, 0x63, 0x4b, 0x82, ++ 0x17, 0xf8, 0x56, 0xc4, 0x37, 0xf6, 0x24, 0x51, 0x6d, 0x35, 0x04, 0x1f, ++ 0xd4, 0x17, 0x6d, 0x99, 0x5e, 0xaf, 0xe9, 0x37, 0x88, 0x7d, 0x1b, 0x6b, ++ 0xfa, 0xa4, 0xa6, 0x75, 0xec, 0x8b, 0xac, 0x65, 0xe3, 0xba, 0xf6, 0x5d, ++ 0xf6, 0x0a, 0x2d, 0xd6, 0xb3, 0x51, 0x5d, 0xbb, 0x82, 0xba, 0x76, 0xba, ++ 0xfd, 0x73, 0xe8, 0xdf, 0x52, 0xf5, 0xf9, 0x55, 0x9c, 0x78, 0x0f, 0x38, ++ 0x61, 0x5d, 0xbd, 0x57, 0x70, 0x99, 0xbb, 0x2b, 0xf8, 0x33, 0x37, 0xd3, ++ 0x46, 0xc0, 0x4e, 0x9f, 0x36, 0xe6, 0x3d, 0x02, 0x7d, 0x91, 0xb9, 0x72, ++ 0x3b, 0xc6, 0xb4, 0x1d, 0xfb, 0x7e, 0x55, 0xf7, 0x22, 0xde, 0x3a, 0xef, ++ 0x22, 0xee, 0x57, 0xd8, 0x88, 0x73, 0x12, 0x73, 0x79, 0xbf, 0x63, 0xcc, ++ 0x01, 0x83, 0x88, 0xc1, 0xf5, 0x76, 0xe4, 0x43, 0x25, 0x8f, 0x3c, 0x9d, ++ 0x62, 0x20, 0xaf, 0x3f, 0xa4, 0xab, 0xf3, 0x06, 0xc8, 0x41, 0xd4, 0xd7, ++ 0x78, 0x7e, 0xbf, 0xd2, 0x27, 0xf1, 0x20, 0xc2, 0xf2, 0xe1, 0x18, 0xcb, ++ 0x87, 0x5a, 0x68, 0x40, 0xe3, 0xde, 0xf2, 0x46, 0x7c, 0x36, 0x52, 0x37, ++ 0xe2, 0x73, 0xf6, 0x16, 0xf8, 0xbc, 0x01, 0x6b, 0x0d, 0x49, 0x2f, 0x61, ++ 0xbe, 0x99, 0x93, 0x95, 0x31, 0x56, 0x0b, 0x7b, 0xb0, 0x3e, 0x27, 0x27, ++ 0xe1, 0x3f, 0xac, 0xb5, 0xf4, 0xc5, 0xce, 0xf5, 0xfd, 0xa9, 0x08, 0xcf, ++ 0xd3, 0x2a, 0x46, 0xf5, 0xa5, 0xce, 0xb9, 0xcd, 0x98, 0xcb, 0x74, 0xdc, ++ 0x09, 0xdd, 0xcc, 0x27, 0x89, 0x13, 0xdd, 0xc0, 0x7b, 0xae, 0xa3, 0xcf, ++ 0x30, 0x46, 0xe8, 0x73, 0x49, 0x8c, 0xf4, 0x12, 0xcb, 0x90, 0x03, 0x12, ++ 0x3e, 0xe8, 0x4f, 0x77, 0xf1, 0x9e, 0x83, 0xbe, 0x94, 0xc5, 0xba, 0x01, ++ 0xe9, 0x5a, 0xa4, 0x3f, 0xb1, 0xbf, 0x56, 0x79, 0x0e, 0x71, 0x8c, 0xef, ++ 0x67, 0x91, 0x1f, 0x5a, 0x5c, 0xd7, 0xc3, 0xbb, 0x25, 0xf8, 0x8a, 0xca, ++ 0x0b, 0xbf, 0xd0, 0xd1, 0x0f, 0x2c, 0x37, 0xfb, 0x88, 0xdb, 0xf2, 0xec, ++ 0x18, 0xcf, 0x58, 0x07, 0x7a, 0x0c, 0x7b, 0x25, 0x9d, 0x67, 0x8d, 0xce, ++ 0xb9, 0xac, 0xce, 0x49, 0xbe, 0x9d, 0x67, 0xf9, 0x06, 0xce, 0xc2, 0x6f, ++ 0x8e, 0x6d, 0xeb, 0x11, 0xc6, 0x05, 0x7a, 0x1a, 0xf1, 0x67, 0x20, 0x17, ++ 0x85, 0x87, 0xd0, 0x4b, 0xa0, 0x27, 0x73, 0xec, 0x5f, 0xe2, 0x4c, 0xac, ++ 0x09, 0x18, 0x4b, 0xcb, 0x4a, 0x16, 0xbc, 0xb7, 0x22, 0xd9, 0x29, 0x73, ++ 0x97, 0x3a, 0x43, 0x56, 0xed, 0x9f, 0x39, 0x1e, 0xca, 0x8a, 0x57, 0xcb, ++ 0x03, 0xdf, 0xf3, 0xaf, 0x60, 0xdd, 0xe9, 0x38, 0xee, 0xd3, 0xf8, 0x3e, ++ 0xe7, 0x25, 0xbd, 0x12, 0xed, 0x1d, 0x86, 0x1f, 0xc0, 0x7f, 0xca, 0xf2, ++ 0x17, 0x85, 0x8b, 0x0b, 0x9e, 0xc2, 0x01, 0x75, 0xef, 0x70, 0xba, 0x55, ++ 0x4e, 0x2b, 0xdc, 0x5c, 0xea, 0xe4, 0x25, 0x31, 0xaf, 0x4e, 0x3e, 0xc4, ++ 0x10, 0x85, 0x4f, 0xf6, 0xbc, 0xc2, 0x27, 0xd2, 0x63, 0x5d, 0x2b, 0xc1, ++ 0xd1, 0x34, 0xf0, 0x93, 0xe7, 0x24, 0x96, 0xf6, 0xc7, 0xe3, 0xa7, 0xd2, ++ 0x8c, 0x89, 0xd4, 0x62, 0x54, 0xaf, 0x52, 0x97, 0x5d, 0xc7, 0x7b, 0xc5, ++ 0x5d, 0x8c, 0xe4, 0x9a, 0x94, 0x7f, 0x2a, 0x79, 0xae, 0xe5, 0x89, 0xf9, ++ 0xb3, 0x37, 0xa3, 0xb3, 0x3a, 0xe8, 0xfe, 0x71, 0x13, 0x3a, 0xcc, 0x9f, ++ 0x25, 0x4d, 0xcf, 0x7a, 0x9d, 0x5c, 0x5e, 0x8f, 0xa3, 0x00, 0x71, 0x46, ++ 0xda, 0xeb, 0xef, 0xee, 0x3a, 0x63, 0x2e, 0xa9, 0x4f, 0x19, 0x57, 0xdc, ++ 0xd3, 0xb1, 0xd9, 0xa7, 0x46, 0x31, 0xa5, 0x74, 0x4a, 0x3d, 0x20, 0x07, ++ 0x39, 0xf9, 0x59, 0x49, 0xe2, 0xee, 0x6a, 0x6c, 0xed, 0x53, 0x7d, 0xd6, ++ 0x78, 0x71, 0x9f, 0xc2, 0xb0, 0xeb, 0x63, 0x8b, 0x77, 0x9e, 0xac, 0x9f, ++ 0x7a, 0x80, 0x19, 0xd4, 0x3f, 0xef, 0xb3, 0x22, 0xcc, 0xaf, 0x9c, 0xe0, ++ 0xfb, 0xa7, 0xf1, 0x3b, 0xf3, 0x1c, 0x6b, 0x7d, 0x0d, 0xb5, 0x12, 0x6b, ++ 0xa6, 0x31, 0xa9, 0x67, 0xa1, 0x57, 0x8f, 0x32, 0xec, 0x97, 0xab, 0x7d, ++ 0xc2, 0xcd, 0x6a, 0x9f, 0x3b, 0x8d, 0x8e, 0x18, 0xbd, 0x59, 0xcf, 0xc0, ++ 0x3b, 0x1e, 0xad, 0x7c, 0x42, 0x8b, 0xfb, 0x5d, 0xf6, 0x08, 0x57, 0xc2, ++ 0x94, 0xea, 0x17, 0x88, 0x47, 0xec, 0x13, 0x7e, 0x07, 0xbd, 0xf7, 0xa9, ++ 0xf7, 0x60, 0x95, 0x4f, 0xea, 0x85, 0xfa, 0x30, 0x63, 0x7c, 0x49, 0xe4, ++ 0x7e, 0x31, 0xad, 0xee, 0x41, 0xf4, 0x52, 0x22, 0x93, 0x54, 0x5f, 0x64, ++ 0xdd, 0x67, 0xc5, 0xf9, 0xf4, 0x00, 0x9e, 0x0f, 0xc4, 0x3e, 0x90, 0x9c, ++ 0x45, 0xe9, 0x15, 0xfb, 0x87, 0xe1, 0x0c, 0x7c, 0xea, 0x59, 0x2f, 0x91, ++ 0x15, 0xbe, 0xfd, 0xd5, 0x04, 0xdb, 0x60, 0x2f, 0xf7, 0x4a, 0x68, 0x8c, ++ 0x06, 0x90, 0x85, 0x77, 0xae, 0x15, 0xf4, 0x1f, 0x94, 0x65, 0x5a, 0xdb, ++ 0xb9, 0x7e, 0xcf, 0x7a, 0x7d, 0xaf, 0x41, 0xfb, 0xd1, 0xbe, 0xeb, 0xf6, ++ 0x43, 0x5d, 0x56, 0x31, 0x3e, 0x06, 0xbe, 0xf7, 0xeb, 0xc4, 0x41, 0x31, ++ 0xd3, 0xb0, 0xc1, 0x05, 0xd8, 0x28, 0x40, 0xfd, 0xf3, 0x81, 0xea, 0x1f, ++ 0x05, 0x31, 0x37, 0x1e, 0x60, 0xec, 0x9d, 0x87, 0x8d, 0x8d, 0x51, 0xc7, ++ 0x7b, 0x4b, 0xdd, 0x45, 0x98, 0xe8, 0xcb, 0x23, 0xdb, 0x8d, 0xc5, 0xb6, ++ 0x1b, 0x6d, 0x5d, 0x7b, 0x66, 0x5b, 0x7f, 0x38, 0x7e, 0xe7, 0x99, 0x58, ++ 0x0b, 0xd9, 0xac, 0xe3, 0xa1, 0x83, 0xa2, 0x16, 0xdd, 0x7d, 0x3e, 0xc4, ++ 0x7e, 0xa9, 0xc6, 0x7c, 0xc7, 0x9e, 0x63, 0xc5, 0x63, 0xfd, 0x97, 0x91, ++ 0x5a, 0xa4, 0x8b, 0xa8, 0xe7, 0xb2, 0x4a, 0x8c, 0x75, 0xf8, 0xcc, 0x06, ++ 0xe8, 0x26, 0x40, 0xcc, 0x45, 0xf7, 0x21, 0xb3, 0x92, 0x46, 0x05, 0x15, ++ 0x86, 0x17, 0x78, 0xc7, 0xd3, 0x60, 0x5e, 0xe1, 0xfd, 0x09, 0xb0, 0xa2, ++ 0x87, 0xb9, 0x26, 0xb9, 0x8b, 0x33, 0xe5, 0x24, 0xd6, 0x9c, 0x72, 0x79, ++ 0x77, 0x96, 0xf8, 0x00, 0xfb, 0x78, 0xf6, 0xff, 0x5f, 0x84, 0xd5, 0x6c, ++ 0xe7, 0x5a, 0xfe, 0xfe, 0x0b, 0xae, 0xa6, 0x8b, 0x18, 0xa8, 0x18, 0x00, ++ 0x00, 0x00 }; + + static const u32 bnx2_TPAT_b09FwData[(0x0/4) + 1] = { 0x0 }; + static const u32 bnx2_TPAT_b09FwRodata[(0x4/4) + 1] = { + 0x00000001, 0x00000000 }; + + static struct fw_info bnx2_tpat_fw_09 = { +- /* Firmware version: 4.4.26 */ +- .ver_major = 0x4, +- .ver_minor = 0x4, +- .ver_fix = 0x1a, ++ /* Firmware version: 5.0.0g */ ++ .ver_major = 0x5, ++ .ver_minor = 0x0, ++ .ver_fix = 0x0, + + .start_addr = 0x08000488, + + .text_addr = 0x08000400, +- .text_len = 0x1514, ++ .text_len = 0x18a4, + .text_index = 0x0, + .gz_text = bnx2_TPAT_b09FwText, + .gz_text_len = sizeof(bnx2_TPAT_b09FwText), +@@ -3709,871 +3811,883 @@ + .data_index = 0x0, + .data = bnx2_TPAT_b09FwData, + +- .sbss_addr = 0x08001940, +- .sbss_len = 0x48, +- .sbss_index = 0x0, +- +- .bss_addr = 0x08001988, +- .bss_len = 0x12b4, +- .bss_index = 0x0, +- +- .rodata_addr = 0x08001914, ++ .sbss_addr = 0x08001cc0, ++ .sbss_len = 0x40, ++ .sbss_index = 0x0, ++ ++ .bss_addr = 0x08001d00, ++ .bss_len = 0x344, ++ .bss_index = 0x0, ++ ++ .rodata_addr = 0x08001ca4, + .rodata_len = 0x4, + .rodata_index = 0x0, + .rodata = bnx2_TPAT_b09FwRodata, + }; + + static u8 bnx2_TXP_b09FwText[] = { +- 0xc5, 0x7b, 0x7b, 0x74, 0x1c, 0x55, 0x9a, 0xdf, 0xef, 0x56, 0x3f, 0x54, +- 0xdd, 0x6a, 0xb5, 0x4a, 0x72, 0xdb, 0x6e, 0xed, 0x68, 0xc6, 0x5d, 0xee, +- 0x6a, 0xb9, 0xb1, 0x84, 0x5d, 0x2d, 0xb5, 0xec, 0x66, 0x5d, 0xb1, 0x7b, +- 0x8c, 0xb0, 0x65, 0x10, 0x3b, 0xc2, 0xeb, 0x9d, 0x88, 0x09, 0x27, 0xf4, +- 0x18, 0x19, 0x64, 0x63, 0x40, 0x30, 0x64, 0xa3, 0xd9, 0x25, 0xeb, 0x1a, +- 0xf9, 0x81, 0x1f, 0xad, 0xee, 0xd6, 0xc3, 0xc8, 0xec, 0xd9, 0x13, 0x64, +- 0x49, 0xb6, 0xcc, 0xd0, 0x0f, 0x33, 0xc0, 0xcc, 0x30, 0x27, 0x13, 0x77, +- 0x8c, 0x01, 0x03, 0x63, 0x98, 0xdd, 0x6c, 0x92, 0x99, 0x3d, 0x49, 0xd6, +- 0x07, 0xf3, 0xb0, 0xc1, 0x60, 0x32, 0x43, 0x12, 0xb1, 0xcb, 0x4c, 0xe5, +- 0xfb, 0xaa, 0x25, 0x63, 0x58, 0xb2, 0x9b, 0x6c, 0xfe, 0x88, 0xce, 0xd1, +- 0xe9, 0xee, 0xaa, 0x5b, 0xf7, 0x7e, 0xef, 0xef, 0xf7, 0x7d, 0xf7, 0x56, +- 0x04, 0xf0, 0x62, 0xee, 0xaf, 0x86, 0xfe, 0xe3, 0xfd, 0x03, 0x0f, 0xb7, +- 0xae, 0x88, 0xaf, 0xa0, 0xaf, 0x6d, 0x58, 0xec, 0x74, 0xf2, 0xcd, 0x55, +- 0x02, 0x48, 0xbd, 0x87, 0x7f, 0xd4, 0xdf, 0x57, 0xff, 0x71, 0x8f, 0xc1, +- 0x01, 0x28, 0xf3, 0x34, 0xf1, 0x3f, 0x64, 0xc9, 0x30, 0xd7, 0xac, 0xd7, +- 0x20, 0x3b, 0x8c, 0xc4, 0xda, 0xbb, 0x34, 0x20, 0x99, 0x6f, 0x0e, 0xdd, +- 0x88, 0xdf, 0x58, 0x66, 0xc0, 0x09, 0xbe, 0xfe, 0x55, 0xe3, 0xd3, 0x5d, +- 0x3f, 0x5d, 0xad, 0x7e, 0x34, 0xe1, 0x80, 0xac, 0x18, 0x63, 0x50, 0x9a, +- 0x20, 0x37, 0xd2, 0x33, 0x7f, 0xb6, 0xec, 0x79, 0x27, 0xfc, 0xf3, 0x73, +- 0xc1, 0x74, 0x19, 0x3a, 0x76, 0x67, 0xfb, 0x31, 0x13, 0x07, 0x2e, 0xa6, +- 0x23, 0xfa, 0x6e, 0x20, 0x27, 0x19, 0x91, 0xd0, 0x69, 0x84, 0x30, 0x9d, +- 0x87, 0x59, 0x65, 0x68, 0xd8, 0x5f, 0x0a, 0xe1, 0x52, 0xfa, 0xb7, 0x56, +- 0xc8, 0xd5, 0x8f, 0xb7, 0xe2, 0x90, 0x83, 0xc6, 0x23, 0x08, 0x66, 0x21, +- 0xd7, 0x18, 0x03, 0x28, 0x0c, 0x01, 0x7b, 0xd3, 0x6a, 0x3f, 0xa0, 0xf6, +- 0x14, 0x45, 0xf8, 0xec, 0x09, 0xa8, 0xdd, 0x0d, 0x8e, 0xe6, 0xd4, 0xed, +- 0x42, 0x4d, 0xee, 0x14, 0x90, 0x05, 0x8d, 0x5d, 0x9e, 0xe7, 0xcf, 0x01, +- 0x44, 0xf3, 0x32, 0xce, 0x3b, 0x78, 0x59, 0x83, 0xe4, 0x2c, 0xe0, 0xd4, +- 0x74, 0xec, 0xcd, 0xc2, 0x74, 0x1a, 0x02, 0xbb, 0xe3, 0x11, 0x65, 0x0a, +- 0x7c, 0x3f, 0x84, 0x41, 0x7b, 0x9c, 0x4a, 0x1c, 0x5b, 0xd6, 0x1e, 0xdd, +- 0xb2, 0x8e, 0xe9, 0x55, 0x30, 0x15, 0x35, 0x08, 0x08, 0x0c, 0xea, 0x12, +- 0x92, 0xca, 0xfa, 0x90, 0x13, 0x6a, 0x70, 0x1b, 0xfe, 0x96, 0xf8, 0x4d, +- 0x46, 0x5d, 0xa8, 0x8c, 0x4f, 0xa1, 0x0a, 0x65, 0xa5, 0x22, 0xb1, 0xc9, +- 0xb4, 0x65, 0xbd, 0xa4, 0x39, 0x71, 0x8c, 0x64, 0x33, 0x98, 0xff, 0x5b, +- 0xab, 0x4c, 0x72, 0xd9, 0xa3, 0xcd, 0xaf, 0x2f, 0x63, 0x42, 0xb1, 0xac, +- 0x29, 0xba, 0xb7, 0x2f, 0x3f, 0x2f, 0x63, 0xcb, 0x92, 0x34, 0xcb, 0xba, +- 0x4b, 0xfb, 0x1b, 0x6b, 0xeb, 0xe7, 0xc6, 0xc6, 0xf0, 0xfd, 0x9c, 0x82, +- 0xa7, 0xb2, 0x49, 0xe4, 0xd3, 0x16, 0x1c, 0x86, 0x13, 0x7d, 0x43, 0x21, +- 0xec, 0x2c, 0x74, 0xa0, 0x90, 0x56, 0x53, 0xe7, 0xe9, 0xb9, 0xad, 0x71, +- 0x0d, 0xf7, 0x15, 0x3a, 0x31, 0x93, 0x86, 0xe5, 0x31, 0xb4, 0xb2, 0x47, +- 0x44, 0x71, 0x4f, 0xa1, 0x0b, 0xc5, 0xb4, 0x76, 0x76, 0x50, 0x44, 0x06, +- 0x1a, 0x1c, 0x4e, 0x3c, 0x50, 0x68, 0xc1, 0xfd, 0x85, 0x04, 0x3d, 0x63, +- 0xe1, 0xe6, 0x58, 0x23, 0x8d, 0x6f, 0xc5, 0x93, 0x63, 0x96, 0x15, 0x8d, +- 0x29, 0xe8, 0x2b, 0xe8, 0x98, 0xc9, 0x49, 0x48, 0x1d, 0x73, 0x22, 0x75, +- 0x14, 0xb8, 0xe7, 0x68, 0x2b, 0xa6, 0x72, 0x16, 0xb6, 0xea, 0x83, 0x0d, +- 0x12, 0x5c, 0x48, 0x29, 0x02, 0x2e, 0xcd, 0x8f, 0x6d, 0x4a, 0x85, 0xf6, +- 0xf3, 0x0e, 0x81, 0x1d, 0x47, 0xa3, 0xf8, 0x45, 0xda, 0xc4, 0xcd, 0xed, +- 0x41, 0x0c, 0x14, 0x02, 0x78, 0x23, 0x1d, 0xa0, 0x35, 0x74, 0xbc, 0x9e, +- 0x96, 0x69, 0x9d, 0x16, 0x9c, 0x49, 0xf3, 0x18, 0x1e, 0xeb, 0x43, 0x6f, +- 0xa1, 0x11, 0xe7, 0xd2, 0x41, 0x5a, 0x33, 0x80, 0x57, 0x68, 0xdc, 0xf6, +- 0x82, 0x86, 0xb3, 0x34, 0xae, 0xaf, 0x10, 0xc2, 0xcb, 0x69, 0x1f, 0xd1, +- 0x1a, 0xc0, 0xe9, 0x74, 0x3f, 0x76, 0xa7, 0x9b, 0xcf, 0xde, 0x48, 0x32, +- 0x0c, 0x2d, 0xe0, 0x75, 0xf8, 0xda, 0x5b, 0x56, 0x57, 0xc0, 0x36, 0x13, +- 0x5a, 0x67, 0x7e, 0xdd, 0x7e, 0x0c, 0xa6, 0xcf, 0xcc, 0xf9, 0x89, 0x8e, +- 0x03, 0xb9, 0x59, 0xeb, 0xa7, 0xcb, 0x1a, 0x71, 0x22, 0x0b, 0x3c, 0x39, +- 0x05, 0x4c, 0x65, 0x4d, 0xab, 0xc6, 0xb0, 0xac, 0xc9, 0xf6, 0x16, 0x92, +- 0x97, 0xd6, 0xb3, 0x95, 0x46, 0x3d, 0x55, 0x72, 0x02, 0x47, 0xd5, 0x9e, +- 0x32, 0x24, 0x4c, 0xcc, 0x38, 0xe1, 0x1e, 0x52, 0x3b, 0x27, 0xa0, 0x9e, +- 0xbd, 0x87, 0x3c, 0xe9, 0x58, 0x56, 0xed, 0x36, 0xb1, 0xcb, 0x0a, 0x1a, +- 0x4d, 0xa1, 0x16, 0x87, 0x05, 0x3f, 0xd9, 0x42, 0xba, 0xc5, 0xb2, 0x6a, +- 0x57, 0x5b, 0xd6, 0xb9, 0x76, 0x58, 0x92, 0xa1, 0x9d, 0x2d, 0x41, 0x2b, +- 0x7f, 0x00, 0x6d, 0xe0, 0x34, 0xca, 0x5f, 0xf5, 0x21, 0xd2, 0x17, 0x76, +- 0x44, 0xfa, 0x67, 0xe9, 0xd9, 0x9a, 0x02, 0x99, 0x32, 0xf1, 0xa2, 0x91, +- 0x0d, 0x16, 0x4a, 0x32, 0x9c, 0xc4, 0x4f, 0xcb, 0x90, 0x65, 0x39, 0x35, +- 0x1f, 0x7c, 0x24, 0xdf, 0x8d, 0x87, 0x2d, 0xeb, 0x1d, 0x5d, 0x81, 0x9b, +- 0x74, 0x73, 0xd3, 0xb0, 0x85, 0x49, 0xfd, 0x34, 0xc9, 0x53, 0x20, 0xd5, +- 0x1d, 0xa7, 0x67, 0x02, 0x34, 0x3e, 0x81, 0x8d, 0x43, 0x41, 0x7c, 0x3f, +- 0x2b, 0xe3, 0xa7, 0xcb, 0xa2, 0xa8, 0xa6, 0xb9, 0xbc, 0x24, 0xab, 0x2a, +- 0x92, 0x1f, 0x0a, 0x64, 0x6e, 0x85, 0x8a, 0x3d, 0xa2, 0x70, 0x9e, 0x78, +- 0x0c, 0xe2, 0x07, 0xa5, 0x00, 0x9e, 0x2e, 0x29, 0x38, 0x59, 0x6a, 0xc4, +- 0xa9, 0x92, 0x8e, 0x6c, 0x4e, 0xdd, 0x5f, 0x86, 0x85, 0x1a, 0x32, 0xe7, +- 0x37, 0x26, 0x62, 0xc8, 0xe4, 0x2c, 0x2b, 0x4f, 0x34, 0x7b, 0x89, 0x87, +- 0xd7, 0x27, 0xbe, 0x86, 0xe3, 0x63, 0x4e, 0x84, 0x26, 0x03, 0x78, 0x2a, +- 0xed, 0xc4, 0x75, 0x19, 0xd5, 0x9c, 0x80, 0x16, 0xdd, 0x29, 0xb4, 0xe4, +- 0x72, 0xa1, 0xe6, 0x4c, 0x44, 0x42, 0x2e, 0x21, 0xa1, 0xe9, 0xb8, 0x13, +- 0x5a, 0x31, 0x04, 0x57, 0x93, 0x0c, 0xad, 0x89, 0xdc, 0xc8, 0x2f, 0xc1, +- 0x4d, 0x7e, 0xb1, 0x71, 0x24, 0x4a, 0xd7, 0x02, 0x74, 0x0d, 0x5f, 0xab, +- 0x82, 0x63, 0x91, 0x03, 0x24, 0x37, 0xcd, 0x81, 0xa4, 0xd3, 0xb2, 0x1c, +- 0x5a, 0x2b, 0x7a, 0x1e, 0xa3, 0xcf, 0x36, 0x1e, 0xaf, 0x20, 0x5c, 0x24, +- 0x19, 0x34, 0x11, 0x4d, 0x59, 0xa2, 0x31, 0x4b, 0x34, 0x66, 0x89, 0xc6, +- 0xac, 0x83, 0x6c, 0x46, 0xd5, 0x81, 0x3f, 0x22, 0x5d, 0x85, 0x88, 0xbf, +- 0x5f, 0xd8, 0x7a, 0x7a, 0xba, 0x14, 0x24, 0xfa, 0x43, 0x36, 0xfd, 0x4f, +- 0xe6, 0x04, 0x24, 0x4d, 0xed, 0x3e, 0x8f, 0x75, 0x08, 0xc7, 0xd4, 0xe4, +- 0x04, 0x92, 0xf4, 0x9c, 0xba, 0xdf, 0x84, 0xda, 0x59, 0x26, 0xfd, 0x6f, +- 0x55, 0x12, 0x98, 0xc9, 0xba, 0x50, 0xad, 0xa9, 0x21, 0xd2, 0x57, 0xb4, +- 0x8c, 0x05, 0xb8, 0x57, 0xa1, 0x39, 0x25, 0xb7, 0xa8, 0xc4, 0x90, 0x47, +- 0x10, 0x19, 0x91, 0x30, 0xad, 0x3b, 0xc8, 0x3f, 0x75, 0x38, 0x9a, 0x68, +- 0xb9, 0x62, 0x9c, 0x3e, 0x69, 0xfe, 0x2c, 0xad, 0x45, 0xf4, 0xd0, 0x7c, +- 0xe4, 0x97, 0x2c, 0xc7, 0x28, 0xd1, 0xb0, 0xd7, 0xa6, 0xf7, 0x64, 0xa9, +- 0x4b, 0x54, 0xec, 0xc7, 0x20, 0x7b, 0x51, 0x43, 0x10, 0x6a, 0x34, 0x24, +- 0x54, 0x3d, 0x29, 0x14, 0x4c, 0x95, 0x7e, 0x46, 0x63, 0x02, 0xd7, 0x8c, +- 0xe9, 0xc6, 0x60, 0x56, 0xe0, 0x46, 0xcd, 0xc2, 0x7a, 0xbd, 0x1b, 0xbb, +- 0x4b, 0xf3, 0x7e, 0xc9, 0xb1, 0x4b, 0xf1, 0x4f, 0xa5, 0x3b, 0xb0, 0x27, +- 0x1b, 0xc2, 0xee, 0x7c, 0xd0, 0x3f, 0x99, 0xe6, 0x7b, 0x1a, 0xf9, 0x3b, +- 0xdf, 0x0b, 0x5c, 0x73, 0xaf, 0xf1, 0x9a, 0x7b, 0x09, 0x0c, 0x8e, 0x7e, +- 0x85, 0x62, 0x48, 0x2d, 0x76, 0x6b, 0x1f, 0x91, 0xad, 0x68, 0x89, 0x5e, +- 0x34, 0xe0, 0xbc, 0xd2, 0x82, 0x43, 0xe3, 0x5d, 0xd8, 0x33, 0xbe, 0x02, +- 0x07, 0x46, 0x1b, 0x53, 0x5e, 0x63, 0x88, 0xd6, 0x0f, 0x27, 0x7b, 0x85, +- 0xda, 0xef, 0x10, 0xe1, 0x68, 0x2f, 0xd9, 0x6e, 0x53, 0x9d, 0x65, 0x9d, +- 0x8e, 0x91, 0x6d, 0xeb, 0xcd, 0xfa, 0x46, 0x12, 0x40, 0xb9, 0x5b, 0xed, +- 0x7c, 0x0b, 0x3e, 0xdc, 0x4a, 0x36, 0x37, 0x15, 0x43, 0xaf, 0x03, 0x8e, +- 0x16, 0x1f, 0x7e, 0x6d, 0x1d, 0x75, 0xb2, 0xdc, 0xad, 0x5d, 0x77, 0xe9, +- 0x7b, 0x05, 0xc7, 0x39, 0xf7, 0xd5, 0x58, 0xc2, 0xf3, 0xf3, 0x33, 0x96, +- 0x15, 0xa6, 0x79, 0xfa, 0x62, 0xcd, 0x89, 0x3e, 0xcc, 0x5a, 0xe7, 0xb7, +- 0x74, 0x61, 0xf7, 0xcc, 0x0a, 0x1c, 0x1c, 0x75, 0x21, 0x59, 0x27, 0x50, +- 0xab, 0x85, 0xcb, 0xf7, 0x62, 0x05, 0xcc, 0x29, 0x7e, 0xae, 0x0b, 0x47, +- 0x66, 0x2a, 0xbf, 0xb3, 0x57, 0x7f, 0xcf, 0xcf, 0x77, 0x91, 0x74, 0xca, +- 0xf2, 0xe4, 0x38, 0x49, 0x2a, 0x30, 0x9a, 0x71, 0x62, 0x34, 0x40, 0xba, +- 0xed, 0x10, 0xce, 0xe3, 0x8b, 0xfc, 0xde, 0xc7, 0x2c, 0xbc, 0xa4, 0x93, +- 0x9e, 0xb3, 0x1b, 0x84, 0xf7, 0x78, 0xa7, 0x70, 0x15, 0x37, 0x0b, 0xf7, +- 0xe4, 0xb7, 0x84, 0x7c, 0x3c, 0x25, 0xaa, 0x8a, 0x2d, 0x24, 0xfb, 0x1e, +- 0xe1, 0x39, 0xae, 0x86, 0x42, 0xe2, 0xbb, 0xa4, 0xcf, 0x2d, 0xc2, 0x51, +- 0x84, 0x22, 0x19, 0x03, 0x42, 0x2a, 0xd2, 0x1c, 0xb6, 0x0d, 0xf1, 0x3a, +- 0x41, 0xd2, 0x1b, 0x4c, 0x87, 0xd1, 0x8f, 0xad, 0x94, 0x23, 0x6e, 0x49, +- 0x1b, 0x38, 0x98, 0xad, 0xa2, 0xf8, 0xc8, 0x7e, 0x3f, 0x4b, 0xeb, 0x6a, +- 0x38, 0x54, 0x82, 0xe9, 0x31, 0x0e, 0x62, 0x05, 0xf9, 0xdb, 0xb9, 0x18, +- 0xfb, 0x22, 0x90, 0xcf, 0x86, 0x93, 0x07, 0x85, 0x65, 0x55, 0x45, 0xac, +- 0x25, 0xef, 0xe8, 0xcd, 0xd1, 0x33, 0xf8, 0x9f, 0xd6, 0x44, 0xa0, 0x1f, +- 0xd1, 0x76, 0xc8, 0x55, 0xc6, 0x1e, 0xbc, 0x9b, 0x86, 0xec, 0x36, 0x4c, +- 0xbc, 0x94, 0x06, 0x7c, 0x43, 0x83, 0x8a, 0x17, 0x64, 0x07, 0x08, 0x07, +- 0x0f, 0x09, 0xb5, 0xfb, 0x02, 0xa5, 0xb3, 0x44, 0xbb, 0x39, 0x20, 0x81, +- 0xe2, 0x91, 0x50, 0x7b, 0xce, 0x90, 0x3d, 0x7e, 0x57, 0xa8, 0xca, 0xac, +- 0x60, 0x3f, 0xe5, 0x5c, 0xb2, 0x67, 0x2e, 0xa7, 0x98, 0xb8, 0xee, 0x9a, +- 0x9c, 0x32, 0x48, 0x74, 0xed, 0x23, 0xba, 0x5e, 0xd4, 0xd5, 0xe0, 0x24, +- 0xac, 0x25, 0xbd, 0x3a, 0xdf, 0x33, 0xb0, 0xa7, 0x64, 0x85, 0x1c, 0x06, +- 0xcb, 0x0a, 0xa9, 0x2a, 0x03, 0xa6, 0x6c, 0x28, 0xe4, 0x1b, 0xbf, 0xb1, +- 0x7a, 0xe3, 0xb2, 0xfe, 0x76, 0x5e, 0x21, 0x79, 0xc1, 0xef, 0x2c, 0x7c, +- 0x59, 0xde, 0xb5, 0x20, 0x19, 0xbf, 0xb1, 0xee, 0x8c, 0xc3, 0xbf, 0xa4, +- 0xe0, 0x4c, 0x55, 0x1b, 0xe8, 0x1e, 0x18, 0xda, 0x65, 0x35, 0x68, 0x12, +- 0xc5, 0x29, 0x8d, 0xe2, 0xba, 0x2f, 0x71, 0xb9, 0xdd, 0x23, 0xce, 0xb5, +- 0x07, 0xbb, 0x3e, 0xc8, 0x7b, 0x48, 0xcf, 0xe8, 0xde, 0x59, 0x48, 0x38, +- 0xdf, 0x23, 0x5b, 0x73, 0x53, 0x4c, 0x45, 0xa1, 0xb1, 0xeb, 0x12, 0xe5, +- 0xa1, 0x9b, 0x62, 0x9e, 0x7f, 0xea, 0x36, 0xa4, 0xaf, 0x79, 0xf0, 0xe0, +- 0xca, 0xe9, 0x44, 0x2d, 0xc5, 0x75, 0x05, 0x67, 0xe3, 0x9d, 0x18, 0x2c, +- 0x55, 0x91, 0x1d, 0x3e, 0x53, 0xde, 0xab, 0x35, 0x76, 0xbd, 0x9f, 0x5e, +- 0xc2, 0x71, 0xe4, 0xd3, 0x7c, 0xbb, 0xd6, 0xbd, 0x53, 0x9c, 0xde, 0xe4, +- 0x45, 0x1c, 0x07, 0x4a, 0xb2, 0xfc, 0x49, 0x1a, 0x1f, 0x2d, 0xd1, 0xb4, +- 0xf2, 0x3a, 0x47, 0x53, 0xbf, 0xec, 0x68, 0x1a, 0x70, 0x53, 0x0c, 0xbe, +- 0x78, 0xbd, 0xc0, 0x4b, 0xd7, 0x47, 0x12, 0x6e, 0xe1, 0xc1, 0xf9, 0xee, +- 0x04, 0xd9, 0x49, 0x63, 0xca, 0x63, 0x50, 0xfc, 0x20, 0x93, 0x75, 0x68, +- 0x09, 0xec, 0x9e, 0xc2, 0x23, 0x83, 0x7a, 0x17, 0xcc, 0x19, 0xb6, 0xa1, +- 0x16, 0x0c, 0xce, 0x74, 0xc3, 0x2c, 0x39, 0x30, 0x11, 0x20, 0xe6, 0x4b, +- 0x48, 0xb9, 0x8c, 0x96, 0x8e, 0x89, 0x7c, 0xaf, 0xab, 0xe2, 0xc3, 0xc4, +- 0x7f, 0xf6, 0xa8, 0x1f, 0x5e, 0xd6, 0xf3, 0x59, 0x92, 0x51, 0x0b, 0x9e, +- 0x29, 0x45, 0x29, 0xd6, 0xe9, 0x24, 0x17, 0x8d, 0xe2, 0x45, 0x88, 0xec, +- 0x4b, 0xc6, 0xd6, 0x51, 0xf5, 0x08, 0xc5, 0x85, 0xdc, 0x04, 0xda, 0x91, +- 0x0c, 0x28, 0x94, 0xbb, 0x5f, 0x9a, 0x8b, 0x01, 0xdb, 0xe8, 0x53, 0x35, +- 0x93, 0xc0, 0x19, 0x09, 0x68, 0x6d, 0x30, 0x22, 0xfb, 0x1b, 0x48, 0x1f, +- 0x75, 0x45, 0x0f, 0x1e, 0x18, 0xad, 0xc7, 0xfd, 0xe3, 0x5e, 0xec, 0x18, +- 0xb5, 0x70, 0x39, 0xc6, 0xb6, 0xa1, 0xf6, 0x10, 0x89, 0x1d, 0xd5, 0x24, +- 0xd7, 0x4d, 0xb1, 0x48, 0xc2, 0x23, 0x9c, 0xa8, 0x2a, 0x76, 0x13, 0x06, +- 0x48, 0xb2, 0x5f, 0xe8, 0x34, 0x47, 0x68, 0xb7, 0x7e, 0x2b, 0x52, 0x01, +- 0x19, 0xae, 0xa2, 0x8f, 0x62, 0x09, 0xfb, 0x31, 0xdf, 0xfb, 0x06, 0xb6, +- 0xba, 0x7d, 0x70, 0x64, 0x64, 0xe4, 0x28, 0xff, 0x63, 0x91, 0x1b, 0x9d, +- 0x4d, 0x12, 0xfd, 0x07, 0xfc, 0xd3, 0x63, 0x8d, 0xfe, 0x63, 0x14, 0x5f, +- 0xef, 0xc9, 0x4a, 0xbc, 0x0e, 0xe3, 0x05, 0x9a, 0x5b, 0xc1, 0x93, 0x14, +- 0xab, 0x1f, 0xa2, 0xf8, 0x73, 0xa2, 0x94, 0x17, 0x1c, 0x4f, 0x6c, 0x7e, +- 0xb2, 0xc4, 0x5b, 0x96, 0x78, 0xcb, 0x12, 0x5f, 0x14, 0x17, 0x4e, 0x66, +- 0x99, 0x8f, 0x2b, 0xe4, 0xa3, 0x09, 0xe2, 0xdd, 0x83, 0x6d, 0x44, 0xef, +- 0x83, 0xe3, 0xd5, 0xb8, 0x8f, 0xe8, 0x2d, 0xea, 0x6a, 0xcf, 0x9f, 0x0b, +- 0x0b, 0xf9, 0x98, 0x6a, 0xee, 0x14, 0x5e, 0x48, 0x4d, 0x96, 0xd5, 0xad, +- 0x33, 0xcf, 0x64, 0xa7, 0x92, 0xcd, 0xf3, 0xfe, 0x24, 0x3c, 0xe8, 0xa3, +- 0x67, 0x7a, 0xc7, 0xf1, 0xa9, 0x44, 0x3c, 0x79, 0x88, 0xc7, 0x83, 0xba, +- 0x9a, 0x58, 0x4e, 0x71, 0xfd, 0x82, 0x16, 0x29, 0x5f, 0x70, 0xe0, 0xeb, +- 0x24, 0x0f, 0x9d, 0xe5, 0xd1, 0x44, 0xfc, 0x3c, 0x40, 0x58, 0xc7, 0x6f, +- 0x30, 0x9f, 0x91, 0xe8, 0xaf, 0x89, 0xf7, 0x48, 0x31, 0xe0, 0x3f, 0x77, +- 0xb8, 0xd1, 0xff, 0xe2, 0x50, 0x85, 0xfe, 0x9d, 0x44, 0xff, 0x74, 0xcc, +- 0xc2, 0x21, 0xa2, 0xff, 0x29, 0xa2, 0xbf, 0x8f, 0xe3, 0xf9, 0x1c, 0xfd, +- 0x27, 0x4a, 0xbc, 0xee, 0x97, 0xf1, 0x30, 0x4f, 0x7f, 0x3d, 0xb6, 0x8e, +- 0xcf, 0xcb, 0xcb, 0xb2, 0xee, 0xd4, 0x9f, 0xb5, 0xbe, 0x4d, 0x32, 0x5b, +- 0x52, 0x64, 0xb9, 0x31, 0x8e, 0x8b, 0x1c, 0xb9, 0x07, 0x7d, 0x12, 0xbc, +- 0x3e, 0x2c, 0x28, 0x72, 0x2e, 0x08, 0xe1, 0x59, 0xd2, 0xef, 0x29, 0xca, +- 0x65, 0xcf, 0x94, 0xae, 0xcd, 0x6d, 0xac, 0xeb, 0x31, 0xd2, 0xb1, 0x3a, +- 0x61, 0x52, 0x6c, 0x4b, 0x95, 0x92, 0xd8, 0x3b, 0x8e, 0xe4, 0xb4, 0xfe, +- 0xaf, 0x29, 0xc0, 0x2c, 0x22, 0xfb, 0xaa, 0x4a, 0x2a, 0x9a, 0x17, 0x77, +- 0x4d, 0x05, 0xd0, 0x5f, 0x5a, 0x8f, 0x2c, 0xc5, 0x9b, 0x9d, 0x14, 0x9f, +- 0x3f, 0x8c, 0x25, 0x77, 0xf8, 0x11, 0x21, 0xfd, 0x06, 0x70, 0x2f, 0x3d, +- 0x73, 0x70, 0x9c, 0xe9, 0x57, 0xe6, 0xf4, 0x1c, 0xc0, 0x3d, 0x74, 0x6d, +- 0xdf, 0xb8, 0x8c, 0x17, 0xf4, 0x27, 0x08, 0xcf, 0x54, 0xf0, 0xc5, 0xdd, +- 0x59, 0x28, 0xe4, 0x9e, 0x84, 0xff, 0x22, 0xd1, 0x17, 0xe8, 0xf7, 0xb6, +- 0x92, 0xd7, 0x3f, 0x38, 0x86, 0xef, 0x2d, 0x31, 0xfc, 0x58, 0x40, 0x58, +- 0xec, 0x76, 0x3d, 0x42, 0x76, 0xef, 0xc4, 0x40, 0x49, 0xc2, 0x77, 0xa6, +- 0xbc, 0x78, 0x68, 0xf4, 0x53, 0xcb, 0x1d, 0x77, 0xe2, 0xb6, 0x26, 0x2f, +- 0x1e, 0x9c, 0x4a, 0x62, 0xff, 0x38, 0x42, 0x55, 0xb1, 0x61, 0x8a, 0xdd, +- 0x95, 0x7c, 0x50, 0x4d, 0xbc, 0x1f, 0x18, 0xf7, 0xf9, 0xfb, 0x0e, 0xb3, +- 0x0c, 0xd6, 0x07, 0x3d, 0x40, 0xb9, 0x2a, 0xe6, 0xc0, 0x36, 0xdd, 0xb1, +- 0xa0, 0x8a, 0x0c, 0xfd, 0x09, 0x9a, 0x6f, 0x12, 0x8e, 0x57, 0x97, 0x20, +- 0x72, 0xa4, 0xc1, 0x51, 0xce, 0x2d, 0x40, 0x3d, 0x1e, 0x9a, 0x49, 0x62, +- 0x98, 0x6c, 0xf4, 0x81, 0xd1, 0xc1, 0xef, 0xd5, 0x51, 0x0c, 0xf1, 0xb7, +- 0xaa, 0x7d, 0x6f, 0x08, 0x03, 0xf9, 0x88, 0x07, 0x3b, 0xa7, 0x7c, 0xfe, +- 0x1d, 0x87, 0xad, 0x75, 0x6c, 0x4f, 0xdb, 0x67, 0xea, 0x71, 0xdf, 0x38, +- 0x5d, 0x1b, 0x65, 0x1b, 0x26, 0x5b, 0x8b, 0x54, 0x11, 0x6f, 0xe1, 0xa4, +- 0x87, 0xf0, 0x92, 0x23, 0x56, 0x4d, 0xf2, 0xf0, 0xe0, 0x1e, 0xdb, 0x16, +- 0x14, 0x6c, 0x1b, 0xb7, 0xf0, 0xa6, 0x1e, 0x45, 0x8e, 0xec, 0xfa, 0xc8, +- 0xb8, 0x3a, 0xdb, 0x41, 0x58, 0xe7, 0x6d, 0x87, 0x7a, 0xa4, 0xc9, 0x91, +- 0x44, 0x7d, 0x1b, 0xc5, 0xf8, 0x7a, 0xcb, 0xba, 0xbb, 0xb5, 0xb9, 0xff, +- 0xe7, 0x44, 0x73, 0x9d, 0xb1, 0x08, 0xe5, 0x3a, 0x35, 0x07, 0x34, 0x0f, +- 0xb8, 0xa5, 0xeb, 0x71, 0x7e, 0x21, 0xc7, 0x41, 0x8e, 0xe5, 0x01, 0x7f, +- 0x7d, 0xa6, 0x92, 0xe3, 0xea, 0x8b, 0x8d, 0xfe, 0xba, 0x4c, 0xd0, 0x5f, +- 0x57, 0x84, 0xdf, 0x5d, 0x04, 0x7e, 0x4c, 0xf1, 0x65, 0x41, 0xdb, 0x6f, +- 0xac, 0x54, 0xbd, 0x8d, 0x07, 0xfd, 0xcf, 0x8f, 0xa9, 0x66, 0x19, 0xea, +- 0x7e, 0x0a, 0x9b, 0x78, 0x7c, 0xc6, 0xe9, 0x3f, 0x4e, 0xd8, 0xaf, 0x5e, +- 0x8b, 0x62, 0x1f, 0xe9, 0x73, 0x17, 0xd9, 0xc2, 0xaf, 0xdb, 0x80, 0x03, +- 0x99, 0x70, 0x48, 0x17, 0x3d, 0x34, 0x31, 0xb0, 0xa7, 0x48, 0x31, 0x5f, +- 0x4a, 0x52, 0x10, 0x53, 0xa3, 0x94, 0xd6, 0x90, 0xce, 0xb8, 0x60, 0x2e, +- 0xac, 0xe8, 0xe4, 0xbe, 0xec, 0x29, 0xcb, 0xaf, 0x69, 0x13, 0x45, 0xd2, +- 0xd9, 0xc3, 0x25, 0x1f, 0x06, 0x08, 0x0f, 0x2c, 0x20, 0x0c, 0xf9, 0x20, +- 0xd9, 0xc5, 0x03, 0xa3, 0x0e, 0xa2, 0x8f, 0xc7, 0x25, 0x91, 0x5c, 0x54, +- 0xc1, 0xa2, 0x0f, 0x4d, 0xb1, 0x5d, 0x92, 0x1d, 0x91, 0x2d, 0x3e, 0x4b, +- 0x39, 0xff, 0x99, 0xcf, 0x61, 0x10, 0x55, 0x31, 0xaf, 0xe6, 0xfe, 0x8a, +- 0x3c, 0x06, 0xc7, 0x99, 0x67, 0xf5, 0x08, 0xa4, 0x24, 0x6e, 0xd2, 0x7f, +- 0x49, 0x39, 0x81, 0x79, 0x27, 0x0c, 0x3c, 0x1e, 0xc5, 0xa3, 0x59, 0xc2, +- 0x34, 0xb1, 0xcb, 0xd6, 0x3d, 0x01, 0x96, 0x01, 0xf3, 0xb3, 0xca, 0xc1, +- 0xf9, 0xb3, 0x9e, 0xb0, 0xef, 0xff, 0xbb, 0xdd, 0xdd, 0x65, 0xa5, 0x6c, +- 0x2c, 0x4b, 0x18, 0x9b, 0xec, 0x29, 0x75, 0xd5, 0x7e, 0x1e, 0xb4, 0xce, +- 0x07, 0x38, 0x5f, 0xd7, 0x23, 0x75, 0xd5, 0x16, 0xd8, 0x96, 0xb0, 0x44, +- 0x6f, 0xdd, 0xfd, 0xa0, 0x02, 0xb6, 0x87, 0xe8, 0x35, 0xf6, 0x50, 0x45, +- 0x34, 0x29, 0xd8, 0x31, 0xc3, 0xf6, 0x6b, 0x5d, 0x59, 0x62, 0xfc, 0xd6, +- 0xfa, 0x64, 0xb5, 0x76, 0xe4, 0x97, 0xe8, 0xa2, 0xeb, 0x01, 0x7c, 0x87, +- 0xfc, 0xe8, 0x5e, 0xe2, 0x73, 0x47, 0xfb, 0xbd, 0xb6, 0xdf, 0xee, 0x28, +- 0xad, 0xa1, 0xeb, 0x2c, 0xef, 0x0e, 0xec, 0xcf, 0xea, 0x48, 0x67, 0xcb, +- 0x9c, 0x87, 0xc8, 0xe6, 0xe3, 0xf8, 0x11, 0xc5, 0xd9, 0x67, 0x4b, 0x8c, +- 0xc9, 0x12, 0x36, 0x1e, 0xfb, 0x61, 0xa9, 0x05, 0xcf, 0x91, 0x4f, 0x3e, +- 0x43, 0x31, 0xf7, 0x07, 0x36, 0x4e, 0x73, 0x8a, 0x43, 0x69, 0xc2, 0xa4, +- 0x43, 0x26, 0xd2, 0xf9, 0x10, 0x3c, 0x87, 0xc3, 0xfb, 0x77, 0x08, 0xf5, +- 0xc7, 0x24, 0x2f, 0xff, 0x81, 0xe9, 0xa5, 0xa8, 0x3a, 0xac, 0x4e, 0x10, +- 0xdd, 0xfe, 0x47, 0xa7, 0x35, 0xc2, 0xd4, 0x41, 0xff, 0xbe, 0xbc, 0xe2, +- 0xdf, 0x3b, 0x16, 0xf0, 0xef, 0x9d, 0xae, 0x27, 0x3f, 0x5a, 0xe4, 0x1f, +- 0x9c, 0x0e, 0xfa, 0x77, 0xa7, 0x1b, 0xfd, 0xbb, 0xf3, 0x6d, 0x08, 0xd5, +- 0xc3, 0x5c, 0x44, 0x39, 0xe2, 0xbe, 0xd1, 0x6f, 0x62, 0xa2, 0xae, 0x12, +- 0xf7, 0xfb, 0xc9, 0x36, 0x6a, 0xc9, 0x0e, 0x57, 0x4a, 0xb7, 0xa1, 0xbc, +- 0xb0, 0x72, 0xed, 0x3b, 0x74, 0xed, 0xa1, 0x56, 0xf8, 0xff, 0xc2, 0x8e, +- 0xbd, 0xc0, 0x73, 0x64, 0x6b, 0xcf, 0xb6, 0x52, 0x5d, 0x79, 0xd5, 0xd6, +- 0x9c, 0x14, 0x6f, 0x2d, 0x4b, 0x6f, 0x13, 0x08, 0xb6, 0x6e, 0x00, 0x16, +- 0xcc, 0xd7, 0x92, 0xc9, 0x09, 0x67, 0x6b, 0x12, 0x4b, 0xb4, 0x8d, 0x78, +- 0x42, 0xa1, 0x54, 0xd3, 0xfa, 0x75, 0xcc, 0x3d, 0x83, 0xef, 0x8c, 0x7a, +- 0x90, 0xda, 0xac, 0x60, 0x9a, 0xb0, 0xca, 0x76, 0x9a, 0x7f, 0x59, 0xac, +- 0x59, 0x99, 0x21, 0x3d, 0x24, 0x15, 0xbe, 0x46, 0x3e, 0xd1, 0xba, 0x8a, +- 0x7c, 0xa2, 0xb2, 0xfe, 0xd3, 0xa4, 0xaf, 0xdc, 0x4c, 0x14, 0x7b, 0x4b, +- 0x3f, 0x91, 0x2a, 0xf9, 0x45, 0x9d, 0x48, 0xe2, 0xac, 0x3d, 0xf6, 0xe9, +- 0xec, 0x1b, 0x56, 0xc8, 0xb6, 0x3b, 0x81, 0xc7, 0x56, 0x44, 0xf6, 0xff, +- 0x27, 0xa9, 0x81, 0xf8, 0x22, 0xd9, 0x65, 0xed, 0x3a, 0xb2, 0x76, 0xb1, +- 0xf6, 0x2f, 0xf0, 0x23, 0x85, 0x65, 0x3b, 0x20, 0xf6, 0x53, 0xbd, 0x4a, +- 0xa5, 0x53, 0xed, 0x02, 0xed, 0x30, 0x9e, 0xe9, 0xe6, 0x6b, 0x01, 0xff, +- 0x81, 0xb1, 0xa4, 0x14, 0xd0, 0xa0, 0xb8, 0x8c, 0x0e, 0x71, 0x60, 0x7a, +- 0x91, 0xff, 0xd1, 0xb1, 0x0d, 0xe2, 0xd1, 0xe9, 0x46, 0xff, 0x60, 0xba, +- 0x53, 0x0c, 0xe6, 0x37, 0x0b, 0x73, 0xe2, 0x5b, 0xc2, 0x9c, 0x4e, 0x09, +- 0x33, 0xdf, 0x43, 0x9f, 0x5b, 0xc4, 0x58, 0x7e, 0x40, 0xec, 0xcd, 0xf3, +- 0xfc, 0xa4, 0x2b, 0x5a, 0xe3, 0x87, 0x14, 0x7b, 0x9f, 0xa3, 0xd8, 0xfb, +- 0x2c, 0xc5, 0xde, 0x67, 0xc8, 0xde, 0x7f, 0x70, 0x15, 0xe3, 0xb2, 0x8d, +- 0x27, 0x19, 0x9b, 0xf8, 0xff, 0xbc, 0x78, 0x86, 0xf4, 0xcd, 0xb2, 0xfb, +- 0x37, 0x64, 0xdb, 0x2c, 0x93, 0x87, 0x38, 0x57, 0x90, 0x9e, 0xde, 0xb7, +- 0x6d, 0xf9, 0xb1, 0x15, 0x8c, 0xa5, 0x06, 0xc4, 0x56, 0xa2, 0x2f, 0xe9, +- 0x24, 0x0c, 0xa4, 0x11, 0x3e, 0xc9, 0x0e, 0x88, 0xbb, 0xf3, 0x7c, 0xfd, +- 0x20, 0x76, 0x52, 0x4d, 0x78, 0x28, 0x16, 0xee, 0xee, 0x25, 0xec, 0xb4, +- 0x89, 0xb0, 0xd3, 0xb2, 0x98, 0x8c, 0x8b, 0x2d, 0x9f, 0x58, 0x58, 0x88, +- 0xe4, 0xfd, 0x71, 0x75, 0x62, 0xa2, 0x92, 0x6f, 0x73, 0x19, 0x70, 0xdd, +- 0x8e, 0xda, 0x1a, 0x4d, 0x3d, 0x91, 0x44, 0x78, 0x7f, 0x5c, 0x82, 0xe9, +- 0x36, 0x5c, 0xb8, 0xcf, 0xae, 0x15, 0xd7, 0x63, 0x74, 0x54, 0x60, 0x5b, +- 0x6b, 0xf2, 0x8f, 0x5c, 0x24, 0xab, 0xb7, 0xdb, 0x11, 0x20, 0xf5, 0x0a, +- 0x99, 0xea, 0xfa, 0x4e, 0x92, 0x5e, 0x07, 0xe5, 0xdc, 0x27, 0xb2, 0xab, +- 0xd0, 0xd0, 0x2a, 0x93, 0x0e, 0x9d, 0xb8, 0xb3, 0x78, 0x13, 0xe9, 0x31, +- 0x72, 0xe4, 0x79, 0x78, 0xfd, 0x2f, 0x8c, 0x19, 0x18, 0xca, 0xe2, 0x7b, +- 0x3e, 0xaa, 0xe1, 0xee, 0x25, 0xfc, 0xf4, 0x03, 0xa2, 0x61, 0x63, 0x6b, +- 0xa4, 0x93, 0x6a, 0x79, 0xc5, 0x6b, 0xb8, 0x31, 0xd2, 0xe4, 0x87, 0xa2, +- 0xa5, 0xc4, 0x2b, 0xf9, 0xc8, 0x91, 0x1d, 0xd2, 0xb7, 0xc4, 0xcf, 0xa7, +- 0x0d, 0x3c, 0x5a, 0xea, 0x11, 0x7f, 0x31, 0x2d, 0x83, 0x74, 0x43, 0x71, +- 0x4b, 0xc7, 0x11, 0xa2, 0xcb, 0x45, 0x18, 0xc9, 0xf5, 0xfb, 0x02, 0x8b, +- 0xb5, 0x24, 0xbe, 0xb3, 0x8a, 0x7d, 0xa1, 0x12, 0xd3, 0x9c, 0xab, 0x80, +- 0xfd, 0x64, 0x93, 0x0d, 0x99, 0x0e, 0xb1, 0x84, 0xbe, 0x5f, 0xa4, 0xbc, +- 0x96, 0x94, 0x3a, 0x45, 0x03, 0x61, 0xd3, 0x85, 0x93, 0x5b, 0xc4, 0x82, +- 0x22, 0x63, 0x51, 0x28, 0x0b, 0x49, 0x46, 0x0b, 0x8b, 0x17, 0x1d, 0x95, +- 0x1a, 0xc0, 0xc5, 0xb6, 0x64, 0xfa, 0x0c, 0xd9, 0x7f, 0x88, 0x62, 0xfb, +- 0x8e, 0x58, 0x27, 0xe1, 0x64, 0xbe, 0x3e, 0x20, 0x86, 0x48, 0x8e, 0x13, +- 0x2e, 0xdb, 0x76, 0xfc, 0x4f, 0x8c, 0xc1, 0xd5, 0x60, 0x20, 0xe4, 0xa6, +- 0xdc, 0xf1, 0xdf, 0xdb, 0x22, 0xe6, 0xf3, 0x52, 0x97, 0xc8, 0xe5, 0x03, +- 0xfe, 0x23, 0x63, 0x9c, 0x67, 0x3a, 0xc4, 0x11, 0xd2, 0x79, 0x96, 0x74, +- 0x9e, 0x25, 0x9d, 0x67, 0x48, 0xe7, 0x99, 0x2f, 0xd1, 0xf9, 0x3e, 0xd2, +- 0xf9, 0xee, 0xfc, 0xaf, 0x6c, 0x1d, 0x3a, 0x0d, 0x03, 0x59, 0xca, 0xcb, +- 0x23, 0x4d, 0x15, 0xfe, 0x3e, 0x24, 0x59, 0xbc, 0x14, 0xfb, 0x86, 0x13, +- 0x5e, 0x83, 0x62, 0x6b, 0x17, 0x3d, 0xf3, 0x95, 0x39, 0x1b, 0x57, 0xfc, +- 0xc3, 0x63, 0x1d, 0x62, 0x98, 0xfc, 0x6e, 0x84, 0xe6, 0x1f, 0x21, 0xbf, +- 0x1b, 0x4c, 0xff, 0x9f, 0xd8, 0x0d, 0xdb, 0x1d, 0x4c, 0x2f, 0xe5, 0xad, +- 0x6a, 0xb2, 0x4b, 0xa7, 0xc1, 0x36, 0xb4, 0x59, 0x24, 0x8f, 0x7e, 0x4b, +- 0x24, 0x8f, 0xa5, 0x44, 0xb2, 0xd0, 0x43, 0x9f, 0x5b, 0xc4, 0x2d, 0x76, +- 0x1d, 0x3a, 0x20, 0x3a, 0x0a, 0x01, 0xff, 0x38, 0xad, 0x33, 0x4e, 0x7c, +- 0x3c, 0x46, 0xeb, 0x3c, 0x66, 0xdb, 0x2e, 0x15, 0x99, 0x5e, 0x5e, 0x8b, +- 0xed, 0x8c, 0xed, 0xeb, 0x32, 0xd1, 0xce, 0xbe, 0x71, 0xb5, 0xc7, 0x43, +- 0x7f, 0x37, 0x38, 0xa0, 0xed, 0x74, 0x56, 0x78, 0xe2, 0xdc, 0xcf, 0xb9, +- 0x9e, 0xe3, 0xb0, 0x62, 0xd7, 0x82, 0xcf, 0x5e, 0xc5, 0x00, 0x8c, 0x07, +- 0x20, 0x2f, 0x30, 0xb6, 0x18, 0xdf, 0x69, 0xfa, 0x1f, 0x34, 0x5f, 0x3f, +- 0xf4, 0x55, 0x90, 0x03, 0xc6, 0x5f, 0x1a, 0x63, 0x4d, 0x14, 0xa7, 0x69, +- 0x4e, 0x39, 0x03, 0x68, 0x19, 0x81, 0xdd, 0x09, 0x41, 0x38, 0x76, 0x11, +- 0xf9, 0x25, 0xd3, 0xaf, 0x76, 0x52, 0x36, 0xc1, 0xd2, 0x21, 0xc8, 0x4b, +- 0x8c, 0x9d, 0xb0, 0xb2, 0x90, 0x6b, 0x8d, 0x3e, 0x5c, 0x19, 0x0a, 0x07, +- 0x3b, 0xa1, 0xa6, 0x2e, 0x38, 0xd4, 0x32, 0xe5, 0xb7, 0xfe, 0xdd, 0x42, +- 0xed, 0x9b, 0x15, 0xdc, 0x27, 0x62, 0xec, 0xbe, 0x13, 0x2d, 0x36, 0x86, +- 0xef, 0x43, 0x73, 0x1e, 0x54, 0x87, 0x0b, 0xbc, 0x43, 0x73, 0xbe, 0xa8, +- 0x7f, 0xc0, 0x39, 0x21, 0x49, 0x58, 0xf0, 0x0b, 0x73, 0x81, 0x70, 0x0c, +- 0xcf, 0xc3, 0x73, 0x84, 0x95, 0x3e, 0x9a, 0xf7, 0x4d, 0x47, 0x73, 0xff, +- 0xa0, 0x50, 0x13, 0x5f, 0x9c, 0x6f, 0x59, 0x1e, 0x62, 0x59, 0xc6, 0xb4, +- 0xaa, 0x35, 0x2f, 0xe3, 0x21, 0xe9, 0x1d, 0x4d, 0x4b, 0xbe, 0x86, 0x10, +- 0x96, 0x51, 0x9d, 0x1c, 0x2d, 0x32, 0x0f, 0xbb, 0x70, 0x46, 0x57, 0xbb, +- 0xa9, 0x1a, 0xa5, 0xba, 0xa5, 0x03, 0x07, 0x29, 0xf6, 0x3e, 0x5a, 0xe2, +- 0x3e, 0xd7, 0x80, 0x58, 0x3e, 0x44, 0x7e, 0x69, 0xdb, 0x13, 0xe4, 0x06, +- 0xe3, 0x61, 0xdc, 0x40, 0xeb, 0xfb, 0xa9, 0xf6, 0x79, 0x9d, 0xd6, 0x97, +- 0x32, 0xea, 0x00, 0xad, 0x9f, 0x7a, 0x43, 0x84, 0x67, 0x89, 0xaf, 0x9e, +- 0x75, 0x8e, 0xe6, 0xbe, 0x5d, 0x42, 0x4d, 0x12, 0xe9, 0xe4, 0xc7, 0xbc, +- 0xf6, 0xc3, 0xcc, 0x0b, 0x7d, 0x52, 0x9d, 0x43, 0x76, 0xd4, 0x54, 0x90, +- 0x45, 0x64, 0x78, 0x3d, 0xf6, 0x4e, 0xad, 0xc7, 0x1e, 0xf2, 0xc7, 0x03, +- 0x7a, 0x2d, 0x42, 0x75, 0xa8, 0xa9, 0xd5, 0x30, 0x7b, 0x41, 0x13, 0x8e, +- 0x1d, 0x2d, 0x8d, 0x64, 0xc7, 0xa7, 0x1b, 0xaa, 0xf0, 0x91, 0xd5, 0xab, +- 0xad, 0xef, 0xa4, 0x88, 0x78, 0x83, 0x07, 0xe3, 0x0e, 0xf2, 0xef, 0x5f, +- 0xfc, 0x9a, 0x02, 0xaa, 0xc7, 0x60, 0xdc, 0x96, 0x10, 0x97, 0xf2, 0x67, +- 0x9d, 0x15, 0x3f, 0x68, 0xc2, 0x15, 0x05, 0xb5, 0x41, 0x6d, 0x39, 0x66, +- 0x15, 0x99, 0xe2, 0x85, 0x69, 0xd7, 0x64, 0x37, 0xe7, 0xba, 0xd1, 0x40, +- 0xf5, 0xf1, 0x9d, 0xb1, 0x5f, 0x5b, 0x9f, 0x2c, 0xe6, 0xe7, 0x4e, 0x7a, +- 0x2a, 0xb1, 0xf3, 0xcb, 0xe6, 0x88, 0x53, 0xbc, 0x69, 0xa6, 0x7a, 0xb6, +- 0x9a, 0x82, 0x74, 0x27, 0xe5, 0x23, 0xb5, 0x27, 0x4d, 0xf5, 0x68, 0x5f, +- 0xa4, 0x59, 0x77, 0x08, 0x37, 0xca, 0x81, 0x70, 0x7f, 0x2f, 0x92, 0xdb, +- 0xfd, 0x73, 0x74, 0x3c, 0x2b, 0x34, 0x17, 0x3d, 0xc7, 0xf3, 0x5c, 0x63, +- 0x4f, 0x27, 0xc9, 0x9e, 0xf8, 0x3e, 0x7f, 0xbf, 0x7a, 0x5f, 0xfe, 0x8a, +- 0xf1, 0x97, 0xff, 0xe4, 0x8f, 0x97, 0x7d, 0xd9, 0xf5, 0x8f, 0xbf, 0xe4, +- 0xfa, 0xff, 0xae, 0xae, 0x2f, 0xd7, 0x39, 0x6d, 0xcc, 0x90, 0x94, 0xb8, +- 0x8f, 0xe9, 0x34, 0x2e, 0xaf, 0xd9, 0xa3, 0xfd, 0x0e, 0xc5, 0x34, 0xee, +- 0x63, 0x70, 0x9e, 0x3e, 0x6f, 0xf7, 0x31, 0x4e, 0x7d, 0x0e, 0xb3, 0x72, +- 0x6c, 0xf1, 0x88, 0xea, 0x11, 0xd3, 0xaa, 0xd7, 0xbe, 0x4d, 0x75, 0xcd, +- 0x2e, 0xf4, 0xc6, 0x74, 0x0c, 0x67, 0xd5, 0xee, 0xdb, 0xa0, 0x25, 0x37, +- 0x0b, 0x9a, 0xa8, 0xe8, 0x11, 0x8e, 0x91, 0xb9, 0x7b, 0xba, 0x49, 0xb5, +- 0x5a, 0x19, 0x55, 0x14, 0x9b, 0x9c, 0x9a, 0x22, 0xa3, 0x18, 0x90, 0x9d, +- 0xc5, 0xa0, 0xec, 0x2e, 0x36, 0xca, 0x55, 0x34, 0xce, 0x37, 0xa2, 0xce, +- 0xde, 0x86, 0x5d, 0x98, 0x6d, 0xf3, 0x9a, 0x0d, 0x86, 0xaa, 0x34, 0x38, +- 0x76, 0x61, 0x4f, 0x8c, 0x9f, 0xed, 0xa0, 0x9a, 0x0d, 0xa2, 0x2e, 0x43, +- 0xc8, 0xd8, 0x10, 0xd8, 0xdb, 0xae, 0x0e, 0x2c, 0x95, 0xb4, 0xce, 0x5f, +- 0x09, 0xa7, 0xec, 0x29, 0x42, 0xf8, 0x33, 0x12, 0x8e, 0xb4, 0xc3, 0xe3, +- 0x59, 0xa5, 0xf6, 0x9d, 0x16, 0x03, 0x78, 0x2a, 0x16, 0xe9, 0xde, 0x26, +- 0x42, 0xb2, 0x97, 0xee, 0xb9, 0x32, 0x14, 0x7f, 0x33, 0xa6, 0xc7, 0xb5, +- 0x4a, 0x0d, 0x4a, 0x22, 0x89, 0x5e, 0x4d, 0xd3, 0x47, 0x20, 0xd3, 0x9a, +- 0x10, 0x55, 0x19, 0x75, 0xf6, 0x4d, 0xc2, 0x54, 0x9f, 0x2c, 0x1b, 0x40, +- 0x6b, 0x5b, 0x64, 0x7f, 0x8f, 0xa4, 0xc9, 0x84, 0xf5, 0x84, 0x33, 0xe3, +- 0xc3, 0xca, 0xc3, 0xf3, 0x7d, 0x1d, 0xcb, 0xfa, 0x30, 0x56, 0x26, 0xbd, +- 0x40, 0xae, 0x29, 0x46, 0x65, 0x1f, 0xe1, 0xfa, 0xe6, 0xc3, 0x8c, 0xb3, +- 0x2c, 0x6b, 0x47, 0xac, 0xfc, 0x75, 0x2f, 0x5a, 0x88, 0xc7, 0x6e, 0x4c, +- 0xa5, 0x19, 0x77, 0x19, 0x98, 0xa4, 0x9a, 0x48, 0x1b, 0x6a, 0xc4, 0x71, +- 0x8a, 0x43, 0x33, 0x69, 0xee, 0xff, 0xf4, 0x91, 0x8c, 0x7b, 0x88, 0xfe, +- 0x2d, 0x54, 0x0f, 0xa7, 0x28, 0x7e, 0xb1, 0x8c, 0x7b, 0xc9, 0xee, 0x21, +- 0x7b, 0x8d, 0x3a, 0xe3, 0xe6, 0x61, 0xc8, 0x1e, 0xc3, 0x6b, 0x5c, 0x77, +- 0x18, 0x75, 0x94, 0xf7, 0x0d, 0xaa, 0x78, 0x10, 0x8d, 0x44, 0xf4, 0x8b, +- 0x88, 0x04, 0x5f, 0x24, 0x7d, 0x0c, 0x6a, 0xc0, 0x6e, 0xbb, 0xd6, 0x76, +- 0xc2, 0xcc, 0x73, 0x0d, 0x0d, 0x4f, 0x55, 0x7b, 0x1d, 0xde, 0xc9, 0x45, +- 0xed, 0x1e, 0x92, 0x49, 0xf5, 0xcf, 0x0b, 0xba, 0x9a, 0x9a, 0xa0, 0xe7, +- 0xb6, 0x2a, 0xff, 0x65, 0x5f, 0x75, 0x1c, 0x32, 0xc5, 0x34, 0xb2, 0xbd, +- 0x3f, 0xf5, 0xbe, 0x49, 0x36, 0x7a, 0xfb, 0xd8, 0x9f, 0x79, 0xaf, 0xc4, +- 0x27, 0xbc, 0x1f, 0xc4, 0x2d, 0x2b, 0x41, 0x78, 0xb4, 0x87, 0xea, 0xed, +- 0x0f, 0x87, 0x4c, 0xef, 0xc5, 0x38, 0xf7, 0x81, 0x9d, 0xf8, 0x3d, 0xfa, +- 0xfd, 0xe4, 0x90, 0x8c, 0x4d, 0x85, 0x06, 0xb8, 0x86, 0x1d, 0x98, 0xd2, +- 0x6f, 0x44, 0xaf, 0x22, 0xe1, 0xee, 0xe8, 0x49, 0xb2, 0x49, 0x89, 0xc6, +- 0x1c, 0xa2, 0xdf, 0xdc, 0xd3, 0x7a, 0x0c, 0xdb, 0x94, 0x69, 0xef, 0x3b, +- 0x71, 0xa6, 0x17, 0x4c, 0xaf, 0x2c, 0x69, 0xb7, 0x62, 0xeb, 0x6d, 0x5c, +- 0x5b, 0xd9, 0xff, 0x9e, 0x17, 0xdb, 0xeb, 0x71, 0x3c, 0xd7, 0x80, 0xe7, +- 0x73, 0xa6, 0xe7, 0xb5, 0xf6, 0x28, 0xfa, 0x86, 0x2c, 0xbc, 0xac, 0x9b, +- 0x03, 0x55, 0x64, 0xe7, 0x09, 0xaa, 0xaf, 0xc2, 0x6d, 0xdc, 0x4b, 0x40, +- 0xc4, 0x81, 0x48, 0x3f, 0x81, 0xcc, 0x3b, 0x28, 0x74, 0xa5, 0x6a, 0xa8, +- 0x4e, 0x3b, 0x27, 0x2c, 0xf7, 0xf6, 0x76, 0x27, 0xd1, 0x00, 0x6c, 0x28, +- 0xb4, 0x90, 0xdc, 0xa2, 0xd8, 0x14, 0x91, 0xb1, 0xb1, 0xa0, 0xe3, 0xf9, +- 0xb4, 0x0f, 0xb7, 0x17, 0xe2, 0x84, 0xbd, 0x15, 0xa2, 0x3d, 0x81, 0x52, +- 0x3a, 0x80, 0x6f, 0x14, 0x1a, 0x49, 0xde, 0x41, 0xdc, 0x58, 0x08, 0xe1, +- 0x44, 0x9a, 0xf3, 0xb7, 0xe1, 0xd9, 0x1a, 0x6f, 0x44, 0x67, 0x41, 0xc3, +- 0x74, 0x1a, 0x9e, 0x07, 0xe2, 0x21, 0x74, 0x14, 0xa2, 0x28, 0x10, 0x86, +- 0xbb, 0x95, 0xe6, 0xbc, 0x9d, 0x74, 0xd2, 0x52, 0x08, 0x60, 0x69, 0x84, +- 0x22, 0x72, 0xc1, 0x27, 0x06, 0x08, 0x5b, 0x25, 0x0a, 0xf5, 0xb8, 0x38, +- 0xcc, 0x76, 0xae, 0x18, 0x7b, 0x72, 0x0a, 0x42, 0x05, 0xac, 0x94, 0x01, +- 0x0a, 0xd6, 0x91, 0x54, 0x81, 0xe8, 0x3d, 0xd8, 0x5e, 0xe9, 0xe1, 0x2e, +- 0x2f, 0x7c, 0xc6, 0x6f, 0x2d, 0xe9, 0xe9, 0xca, 0xe1, 0x69, 0xef, 0x27, +- 0x71, 0x8e, 0x4d, 0x9f, 0xae, 0x79, 0xfd, 0x30, 0x10, 0x1d, 0x67, 0xde, +- 0xec, 0xd8, 0xc8, 0xf1, 0xb0, 0x45, 0xc6, 0xaf, 0x2c, 0xaa, 0x41, 0x43, +- 0x53, 0xbc, 0x57, 0xa0, 0xf9, 0x88, 0x0e, 0x05, 0x49, 0x5a, 0xfb, 0x96, +- 0xc2, 0x0f, 0xad, 0xad, 0x0b, 0x83, 0xb8, 0x39, 0x52, 0x91, 0xd5, 0x39, +- 0xd2, 0xe1, 0xe4, 0x70, 0x03, 0x66, 0x88, 0x06, 0x97, 0xe1, 0x36, 0x8e, +- 0x8d, 0x59, 0xd8, 0xa0, 0x9b, 0xde, 0xd7, 0xda, 0x97, 0xe3, 0xfe, 0xc3, +- 0x83, 0x67, 0xdd, 0xa4, 0xd7, 0x59, 0xfd, 0x0e, 0x3c, 0x3a, 0x8e, 0xaf, +- 0x35, 0x00, 0x8f, 0x04, 0xc1, 0x3d, 0x6b, 0x35, 0x74, 0x02, 0x91, 0xce, +- 0x07, 0x10, 0x51, 0x34, 0xa1, 0xea, 0x2f, 0x0b, 0x24, 0xab, 0x8d, 0xc8, +- 0xd9, 0x5b, 0x80, 0x33, 0x6e, 0xf2, 0xe0, 0xdb, 0x0b, 0x4e, 0x92, 0x51, +- 0x10, 0xa5, 0x61, 0x37, 0x1c, 0xe4, 0x27, 0x97, 0x34, 0x6c, 0xa8, 0x25, +- 0x59, 0x3b, 0x84, 0x4c, 0x7a, 0x6e, 0xc1, 0xb1, 0xa1, 0x79, 0x59, 0xf9, +- 0x70, 0x13, 0xc9, 0xf0, 0xa9, 0x21, 0x6b, 0x97, 0x16, 0x0b, 0x90, 0xac, +- 0x15, 0xa2, 0x6f, 0x5e, 0x4e, 0x2c, 0xbf, 0x79, 0x39, 0xdd, 0x81, 0x3d, +- 0x33, 0x2c, 0xb7, 0xff, 0x1b, 0x79, 0x4d, 0xdb, 0x76, 0xb7, 0x61, 0x2c, +- 0x8a, 0x86, 0xc3, 0x57, 0x65, 0xc7, 0xf4, 0x3d, 0x42, 0x7c, 0x7c, 0xcf, +- 0xbf, 0x3a, 0xd2, 0xf7, 0xbe, 0xf0, 0x11, 0x3d, 0x0a, 0xe9, 0xe6, 0x03, +- 0x17, 0x63, 0x77, 0x92, 0xc9, 0x55, 0x19, 0x07, 0x49, 0xc6, 0xc1, 0x71, +- 0x96, 0xf5, 0xa7, 0x6b, 0xae, 0x90, 0x7c, 0x5f, 0x27, 0x5c, 0x76, 0x43, +- 0x2c, 0x8a, 0x9a, 0xc3, 0x6a, 0xb2, 0xc1, 0x11, 0x4e, 0xd4, 0x0a, 0x50, +- 0x55, 0x82, 0x96, 0x1a, 0x7c, 0xc8, 0x72, 0xd6, 0x49, 0xce, 0xdf, 0x1b, +- 0x24, 0x7e, 0xd6, 0xd3, 0x7c, 0x1b, 0x48, 0xce, 0x49, 0xe2, 0xff, 0x16, +- 0x7b, 0xde, 0x46, 0x9a, 0x77, 0x0b, 0xd5, 0x1e, 0xd3, 0xde, 0x4b, 0x44, +- 0x4f, 0xf4, 0x33, 0x5a, 0x08, 0x8d, 0x47, 0x82, 0xef, 0x53, 0x8d, 0x7d, +- 0xa3, 0x3d, 0x4e, 0xa1, 0x71, 0x4c, 0xfb, 0xcf, 0xab, 0x24, 0xed, 0xcb, +- 0xfa, 0xcd, 0xdf, 0x02, 0xf7, 0x1c, 0x4c, 0xf4, 0x50, 0x1d, 0xb1, 0x85, +- 0x6a, 0x25, 0x99, 0x72, 0x9b, 0x89, 0x1f, 0xc4, 0xd5, 0x68, 0x9d, 0xe0, +- 0xf8, 0x67, 0x92, 0x1f, 0x96, 0xa9, 0x4e, 0x0a, 0x87, 0x66, 0x10, 0x94, +- 0xa5, 0xa2, 0x4c, 0x78, 0xb0, 0x51, 0x76, 0x14, 0xc9, 0x5f, 0x83, 0x3d, +- 0x84, 0xa7, 0x9d, 0x78, 0x31, 0xef, 0xc4, 0x2b, 0xe9, 0x2d, 0x38, 0x50, +- 0xf2, 0x10, 0x6e, 0x36, 0x3d, 0xce, 0x55, 0x13, 0xee, 0x4a, 0x4c, 0x5e, +- 0x86, 0xae, 0x91, 0x87, 0x51, 0x9d, 0x71, 0x76, 0x53, 0x3e, 0xd5, 0x6f, +- 0x21, 0xb9, 0x6c, 0x28, 0xf2, 0xfd, 0x46, 0x64, 0xd2, 0x29, 0xc2, 0x40, +- 0x61, 0xaa, 0x81, 0x9c, 0x98, 0x68, 0x68, 0xb4, 0xfb, 0xba, 0x39, 0xba, +- 0x96, 0x2b, 0x7d, 0xb1, 0xdf, 0x7c, 0xc7, 0x5c, 0x9f, 0xb9, 0x0f, 0xfb, +- 0xb2, 0x3d, 0x84, 0x4d, 0xb7, 0x50, 0x7c, 0xaf, 0xd0, 0x38, 0x1d, 0xef, +- 0xc6, 0xbe, 0xbc, 0x71, 0x35, 0x7e, 0x4c, 0xda, 0xf1, 0xa3, 0x1f, 0x55, +- 0xed, 0xbc, 0x7f, 0xb5, 0x05, 0x77, 0xa5, 0x81, 0xf7, 0xd2, 0xdc, 0x4f, +- 0x24, 0x4c, 0x41, 0xf9, 0xe0, 0x90, 0xce, 0x39, 0x74, 0x0b, 0x96, 0xe6, +- 0x2d, 0xe4, 0x75, 0x0b, 0x67, 0x75, 0x8d, 0x72, 0x34, 0xe7, 0xea, 0x01, +- 0xa1, 0x51, 0x7e, 0x36, 0x9d, 0xfd, 0x88, 0xb4, 0xb3, 0x8e, 0x1e, 0x9e, +- 0xdb, 0x87, 0xea, 0xb7, 0xf7, 0xa1, 0x66, 0xd2, 0x0e, 0x3c, 0x45, 0x8a, +- 0x78, 0x3e, 0x1b, 0x0e, 0xbd, 0x07, 0x6b, 0x97, 0xc3, 0x50, 0x13, 0x4e, +- 0x07, 0xef, 0xcf, 0xf0, 0xfe, 0x94, 0xd6, 0xbd, 0xd4, 0xa1, 0xea, 0x45, +- 0xd1, 0xdc, 0xf3, 0x16, 0xca, 0x1b, 0x65, 0xa8, 0xa1, 0xd7, 0x10, 0x89, +- 0x76, 0xf2, 0x1e, 0x44, 0xa9, 0x92, 0xbb, 0x97, 0xcd, 0xe5, 0x6e, 0x2d, +- 0xef, 0x15, 0xe1, 0x61, 0x09, 0x13, 0x53, 0x96, 0x29, 0x91, 0xfd, 0x4e, +- 0xd1, 0x9c, 0x3f, 0xce, 0xee, 0x42, 0x36, 0x66, 0x59, 0xb7, 0xc7, 0xb5, +- 0xbe, 0x06, 0x07, 0xfe, 0x90, 0x32, 0x39, 0xc8, 0xe6, 0x53, 0xe4, 0x6b, +- 0xa1, 0x1d, 0xed, 0xa6, 0xe5, 0xb6, 0xeb, 0x0a, 0xee, 0x4f, 0x76, 0x89, +- 0x96, 0xc2, 0x16, 0xb1, 0x9c, 0xb0, 0x5b, 0xe8, 0xd8, 0x66, 0xd1, 0x74, +- 0xb4, 0x82, 0xdd, 0x22, 0x85, 0xcf, 0x7a, 0xa8, 0x37, 0xa7, 0x2d, 0xa4, +- 0x89, 0xaf, 0xa7, 0xfe, 0x0e, 0x5f, 0xac, 0x8b, 0x7e, 0x5c, 0xd7, 0xce, +- 0xbe, 0xf8, 0x30, 0x8e, 0xa5, 0xd9, 0xce, 0xfb, 0xb1, 0x87, 0xe4, 0xb3, +- 0x62, 0x88, 0xf7, 0xc3, 0xd4, 0xb3, 0x83, 0x08, 0xf7, 0xbd, 0x2a, 0xd4, +- 0x72, 0x01, 0xcd, 0x7a, 0x8d, 0x83, 0xe3, 0xab, 0x3a, 0xd0, 0xe4, 0xa8, +- 0xd0, 0x9f, 0xc8, 0x83, 0xe2, 0x69, 0x85, 0x87, 0x95, 0xf9, 0xa5, 0x64, +- 0xab, 0xa6, 0xe7, 0x52, 0xbc, 0xb9, 0xbf, 0x1a, 0x1b, 0xc4, 0x07, 0xd3, +- 0x21, 0x78, 0x0f, 0x27, 0x17, 0xfa, 0xd1, 0x21, 0xde, 0xb3, 0xeb, 0xc5, +- 0x4e, 0xf1, 0x4e, 0xbe, 0x5b, 0x5c, 0x9e, 0xe8, 0x42, 0x64, 0xf8, 0x3e, +- 0xf1, 0xf6, 0x04, 0xd3, 0xd9, 0x23, 0xce, 0x4f, 0x73, 0x9f, 0xd4, 0xc2, +- 0x1e, 0x9d, 0xfb, 0xa2, 0x8b, 0xab, 0xe0, 0xb7, 0x70, 0x4c, 0x67, 0x7d, +- 0x72, 0x9f, 0xb0, 0xd2, 0x5f, 0xda, 0x10, 0xcf, 0x59, 0x4e, 0x8d, 0x7b, +- 0xc5, 0x41, 0x9b, 0xdf, 0x29, 0xc2, 0xd1, 0xd3, 0x13, 0x5b, 0xc4, 0xf1, +- 0x7c, 0x85, 0xd7, 0xc9, 0x3c, 0xdb, 0xaf, 0x4c, 0x3a, 0xfe, 0x62, 0x9e, +- 0x36, 0xa1, 0xb4, 0x07, 0xe1, 0xb6, 0xfb, 0x51, 0x16, 0x46, 0xf4, 0x48, +- 0xe8, 0x65, 0x04, 0xe1, 0x2c, 0xb2, 0x6d, 0x5b, 0x78, 0x5a, 0x77, 0xc1, +- 0x31, 0x22, 0x93, 0x8c, 0xc8, 0x96, 0xfc, 0x2e, 0x48, 0x93, 0x5c, 0x1b, +- 0x7c, 0xbd, 0x8a, 0xfb, 0x14, 0x21, 0x89, 0xbf, 0x7f, 0xd1, 0xe6, 0x5c, +- 0x94, 0x0f, 0xb8, 0xbf, 0xfe, 0x57, 0xee, 0x8a, 0xed, 0xb1, 0x5d, 0xcd, +- 0xf7, 0xc4, 0x29, 0xd7, 0xb6, 0x73, 0x2f, 0xdc, 0x83, 0x99, 0x9c, 0x9b, +- 0x5b, 0x14, 0x1e, 0x77, 0xbb, 0x85, 0x0b, 0xba, 0x93, 0xea, 0x97, 0x87, +- 0x28, 0x47, 0x49, 0x90, 0xb5, 0x3b, 0x50, 0x1c, 0x73, 0x4a, 0xbc, 0x5f, +- 0xf5, 0xb3, 0x18, 0xf7, 0x10, 0x80, 0x43, 0xc4, 0xc3, 0xf7, 0x73, 0x21, +- 0x6c, 0xa2, 0xba, 0x2b, 0x64, 0xd7, 0x18, 0xbf, 0x87, 0x53, 0x39, 0x87, +- 0xa0, 0xba, 0xc2, 0x91, 0x58, 0x6d, 0xe1, 0x4a, 0x5b, 0x24, 0xca, 0x7d, +- 0x68, 0x85, 0x72, 0xd6, 0xde, 0x7c, 0x1d, 0x7e, 0x96, 0xab, 0xc3, 0x2b, +- 0x39, 0x0b, 0x07, 0x63, 0x83, 0x3d, 0x5e, 0x8a, 0x95, 0xcb, 0x62, 0x2e, +- 0xec, 0x88, 0x98, 0x8a, 0x17, 0x51, 0x5c, 0x48, 0x5c, 0x87, 0x54, 0x20, +- 0xdc, 0x39, 0x88, 0x7a, 0xbc, 0x91, 0x03, 0x61, 0x09, 0x78, 0x96, 0xd2, +- 0x1c, 0x6f, 0xc7, 0xcc, 0x7e, 0x17, 0xe1, 0xd8, 0x9f, 0x0b, 0xc4, 0x6b, +- 0x60, 0xb9, 0xcf, 0xc4, 0x29, 0x57, 0x17, 0xea, 0xd0, 0x95, 0xab, 0x47, +- 0x0f, 0xe5, 0xac, 0x75, 0xab, 0xe3, 0x78, 0x2b, 0xeb, 0x13, 0x2b, 0xb3, +- 0x83, 0x3d, 0x0a, 0xcd, 0xe9, 0x6a, 0x53, 0xfb, 0x9f, 0x22, 0xe0, 0x26, +- 0x23, 0x4c, 0xe6, 0x8e, 0x07, 0xfc, 0x14, 0x77, 0x8f, 0x8b, 0x4f, 0xf1, +- 0x04, 0xd9, 0xe3, 0x3d, 0xba, 0x5a, 0xbe, 0xe4, 0x88, 0x9c, 0xdd, 0x08, +- 0x75, 0xe0, 0x16, 0x61, 0x46, 0x6b, 0x29, 0x9e, 0x34, 0x54, 0x62, 0x85, +- 0x19, 0x11, 0x32, 0x61, 0x73, 0x27, 0x3c, 0x9a, 0x89, 0xce, 0x76, 0x96, +- 0xa9, 0x07, 0x9e, 0xa3, 0x64, 0x47, 0xd2, 0x17, 0xfb, 0xfb, 0x75, 0x78, +- 0x9d, 0xf2, 0xe5, 0xb9, 0x1c, 0xf7, 0xe6, 0xdd, 0xc6, 0xbb, 0x94, 0x03, +- 0x5e, 0x8a, 0x0d, 0x86, 0x38, 0xf6, 0xe7, 0x63, 0xf8, 0xe7, 0x64, 0x96, +- 0x8d, 0x3e, 0x5a, 0xf3, 0x2e, 0xc1, 0xeb, 0x20, 0xb9, 0xc4, 0xe0, 0xbe, +- 0x9c, 0xcd, 0x0f, 0xc5, 0x63, 0xe6, 0xe9, 0xff, 0x27, 0xed, 0x8f, 0x54, +- 0xc1, 0x5b, 0x4f, 0xba, 0x9c, 0xef, 0x69, 0x5e, 0xdb, 0xcf, 0xe4, 0x7a, +- 0xa6, 0x82, 0x0f, 0xdd, 0x46, 0xb5, 0x78, 0x21, 0xc7, 0x36, 0x67, 0xe1, +- 0x19, 0x5d, 0xa7, 0xda, 0x85, 0x6b, 0xf2, 0x7e, 0xaa, 0x5f, 0xb8, 0xcf, +- 0x64, 0x7a, 0xce, 0x10, 0x85, 0xfb, 0x73, 0x58, 0x2b, 0xc3, 0xb1, 0xa2, +- 0x0a, 0xe3, 0x98, 0x70, 0x3a, 0x09, 0x73, 0x70, 0xac, 0x65, 0x7f, 0x52, +- 0x0c, 0x6d, 0x82, 0xeb, 0xcf, 0x4e, 0x98, 0xb6, 0x1f, 0x57, 0x8b, 0xfb, +- 0xc9, 0x46, 0x5e, 0x8c, 0x55, 0x61, 0x82, 0xea, 0x1f, 0xc9, 0x30, 0x3d, +- 0xdf, 0xa5, 0xe7, 0x13, 0xa3, 0xd8, 0x17, 0x84, 0xe3, 0x4f, 0x14, 0xfc, +- 0x19, 0xde, 0x74, 0xc9, 0x74, 0x1d, 0x9e, 0xee, 0xb8, 0xe9, 0xdd, 0x18, +- 0xaf, 0x16, 0xb7, 0xe6, 0x5a, 0xf0, 0xfe, 0x58, 0x1d, 0xd9, 0x77, 0x3d, +- 0x96, 0x8c, 0x04, 0xf1, 0x36, 0xd1, 0x32, 0x40, 0xb4, 0x7c, 0xd2, 0x66, +- 0x0e, 0x34, 0x40, 0xed, 0xa7, 0xba, 0xa8, 0x9b, 0xfb, 0xcd, 0x4f, 0xeb, +- 0x6a, 0xe7, 0x6d, 0xc2, 0x0b, 0x2d, 0x92, 0x24, 0xd9, 0x5b, 0xd6, 0xb0, +- 0xde, 0xac, 0xfb, 0xc0, 0xfd, 0xa3, 0x3b, 0x70, 0x68, 0x86, 0x69, 0x71, +- 0x1b, 0xcb, 0xa7, 0xf9, 0x53, 0x36, 0xae, 0xb3, 0x3f, 0xbd, 0x73, 0x9f, +- 0x30, 0x42, 0xf6, 0xe7, 0xa7, 0x6b, 0x42, 0xd3, 0xdc, 0xa7, 0x0e, 0x9b, +- 0x6e, 0xf1, 0x53, 0x17, 0xf7, 0xab, 0x93, 0xe0, 0xff, 0x57, 0x5d, 0x95, +- 0x7e, 0xdf, 0x1d, 0x30, 0xed, 0x1e, 0xca, 0x15, 0xbb, 0x97, 0x1d, 0x22, +- 0x37, 0x90, 0x89, 0x3f, 0x99, 0x30, 0x57, 0x20, 0x46, 0x05, 0x7c, 0xbd, +- 0x6c, 0x2e, 0x31, 0x7a, 0xa8, 0x46, 0x90, 0x89, 0x5f, 0x13, 0xfb, 0xda, +- 0x05, 0x0e, 0x69, 0x06, 0x5e, 0xcb, 0x73, 0x2c, 0x77, 0xe2, 0xfb, 0x69, +- 0x35, 0x94, 0x12, 0xe1, 0xce, 0x5b, 0x84, 0x84, 0x50, 0x43, 0x0f, 0x0e, +- 0x51, 0x5e, 0x99, 0x4e, 0x73, 0x1e, 0x71, 0xda, 0xe7, 0x05, 0x6a, 0x29, +- 0x0e, 0x7d, 0x38, 0x54, 0x89, 0xfb, 0x85, 0xb8, 0xba, 0xff, 0xf7, 0x48, +- 0xa7, 0x4f, 0x17, 0x78, 0x4e, 0x13, 0x9f, 0xac, 0x66, 0x1f, 0x56, 0xa3, +- 0x29, 0xe9, 0x5e, 0x84, 0xa6, 0x38, 0xb6, 0xd0, 0x72, 0xb4, 0xd6, 0x91, +- 0xac, 0x1b, 0xdd, 0xf1, 0x2e, 0xd1, 0x53, 0xfc, 0x67, 0xbc, 0x27, 0xa1, +- 0x2c, 0x30, 0x36, 0x8b, 0xf5, 0x93, 0xdc, 0x53, 0xdc, 0x22, 0xba, 0x8b, +- 0xdc, 0x57, 0x1c, 0x10, 0xbf, 0x5f, 0x64, 0x9f, 0x9f, 0xef, 0x2f, 0xce, +- 0xeb, 0x9f, 0xfb, 0x8a, 0xa6, 0xe7, 0x05, 0x92, 0xfd, 0x03, 0x39, 0x8e, +- 0xc9, 0x8e, 0xfb, 0xfd, 0x68, 0xc3, 0x84, 0x0b, 0x9e, 0xd3, 0xf1, 0xaf, +- 0xe0, 0x76, 0xc2, 0x07, 0x4b, 0xb4, 0x8a, 0xfe, 0xd6, 0x4d, 0x48, 0x48, +- 0xb4, 0x91, 0xd0, 0x17, 0xb0, 0x4e, 0x7b, 0x29, 0x9e, 0x65, 0xac, 0xbe, +- 0x00, 0xeb, 0x92, 0xed, 0xcd, 0x2e, 0xf7, 0x28, 0x0e, 0x9b, 0x94, 0x57, +- 0x3c, 0x98, 0xce, 0x2d, 0xa2, 0xda, 0xc0, 0xc2, 0x7e, 0xbd, 0x06, 0x55, +- 0x76, 0x0c, 0xf0, 0x10, 0x9e, 0x84, 0xec, 0xa3, 0x79, 0xd2, 0xc3, 0x32, +- 0xbc, 0x74, 0xef, 0x8c, 0x4e, 0x72, 0x69, 0xaf, 0xcc, 0xdd, 0x3c, 0xb1, +- 0x12, 0x07, 0xc9, 0xe3, 0x6b, 0xb4, 0x28, 0x86, 0x14, 0x1f, 0xc5, 0x9a, +- 0x3b, 0xe6, 0xe6, 0xf4, 0xd0, 0x60, 0x5e, 0xaf, 0xbf, 0xaa, 0xa2, 0x87, +- 0x35, 0x72, 0xa5, 0x06, 0x93, 0xcd, 0x6a, 0x5a, 0x6b, 0x47, 0xfb, 0x16, +- 0x74, 0x0e, 0xf9, 0xc4, 0x2b, 0xe9, 0xbb, 0xad, 0x50, 0x1d, 0x8d, 0x23, +- 0x9b, 0x75, 0xcf, 0xd1, 0xdb, 0x34, 0x21, 0xf3, 0x58, 0xee, 0x79, 0xe0, +- 0xc1, 0x9c, 0x84, 0xc0, 0xdc, 0xf5, 0xf8, 0x44, 0x08, 0x7a, 0x6b, 0x35, +- 0x50, 0x2f, 0xe8, 0x1a, 0xcf, 0xcd, 0x6b, 0xc8, 0xa8, 0x23, 0x3f, 0xb9, +- 0x33, 0x9e, 0xc0, 0xbb, 0x59, 0x27, 0x36, 0x52, 0x9e, 0xbf, 0x31, 0x6d, +- 0xe0, 0x42, 0x29, 0x60, 0xcf, 0x21, 0x19, 0xf3, 0xe3, 0x9c, 0x34, 0xce, +- 0x83, 0xc9, 0x89, 0x2f, 0xd2, 0x17, 0x20, 0x9a, 0x7f, 0x42, 0xdf, 0xf9, +- 0xde, 0x45, 0xbb, 0x3f, 0x70, 0xea, 0x9a, 0xba, 0x4a, 0x1a, 0xe1, 0x9e, +- 0x52, 0x25, 0x17, 0x74, 0xe8, 0xac, 0x4b, 0x3f, 0x66, 0x47, 0x4d, 0x5c, +- 0x58, 0x5d, 0x8b, 0x4f, 0x46, 0x9b, 0x70, 0x7f, 0xce, 0x8b, 0x4b, 0xa3, +- 0x16, 0x56, 0xb6, 0xe1, 0xee, 0x20, 0x61, 0xb1, 0x5a, 0xf2, 0xfb, 0xd7, +- 0xa8, 0xf6, 0xa1, 0x78, 0x4a, 0x94, 0x46, 0x12, 0x1b, 0xc8, 0xae, 0xa3, +- 0x31, 0xa4, 0x6e, 0x8a, 0x47, 0x42, 0x17, 0xf1, 0x3d, 0x8b, 0x62, 0xb1, +- 0xe2, 0x30, 0xba, 0x84, 0xd3, 0xde, 0x67, 0xdc, 0x62, 0xef, 0x4b, 0x4a, +- 0x93, 0x03, 0xc2, 0x51, 0xbc, 0xd6, 0xaf, 0xbf, 0x2c, 0x0f, 0x71, 0xee, +- 0xe1, 0x1e, 0xc6, 0x88, 0xe5, 0xd2, 0xb8, 0x57, 0xb3, 0x59, 0xec, 0x9d, +- 0xb8, 0x9a, 0x9b, 0xae, 0xe6, 0xa3, 0xdd, 0x73, 0x79, 0x68, 0x30, 0xff, +- 0x8b, 0x2f, 0xe0, 0xa8, 0xd0, 0xdc, 0x7e, 0x07, 0xe7, 0x1f, 0x8f, 0x78, +- 0x93, 0xcc, 0x61, 0x1f, 0xf9, 0xe0, 0x49, 0xfd, 0x74, 0x90, 0x32, 0x04, +- 0x9c, 0xad, 0x02, 0x0f, 0xf2, 0x59, 0x93, 0x80, 0x85, 0xcd, 0x7a, 0xc5, +- 0x1e, 0xda, 0xda, 0x5d, 0xe8, 0xa3, 0x9c, 0xe4, 0x8a, 0xf9, 0xc8, 0xd7, +- 0x15, 0xbc, 0xaa, 0xb3, 0x0d, 0x6f, 0x9e, 0xcb, 0x49, 0xbc, 0x7f, 0x5e, +- 0xd9, 0xeb, 0xfe, 0x7c, 0xdf, 0x7b, 0xde, 0x36, 0x75, 0x24, 0x17, 0xc2, +- 0xfb, 0x76, 0x5c, 0xa3, 0xfa, 0x41, 0xa6, 0xda, 0x61, 0x23, 0x12, 0x0b, +- 0x54, 0x6e, 0x6d, 0x10, 0xf6, 0x36, 0xf1, 0xef, 0xdb, 0xfb, 0x70, 0xdf, +- 0x88, 0x84, 0x6a, 0x8d, 0xe3, 0xac, 0x89, 0x43, 0x75, 0x1c, 0xa7, 0xba, +- 0xb0, 0x6b, 0xc4, 0x23, 0xce, 0xe4, 0x9c, 0x78, 0xa2, 0xfb, 0x11, 0x2c, +- 0x68, 0xbd, 0x07, 0xb0, 0x6d, 0x90, 0xbf, 0x7f, 0x0b, 0xa9, 0x45, 0xbc, +- 0x3e, 0xf7, 0xda, 0x04, 0x7c, 0xad, 0xcc, 0x07, 0xbc, 0xef, 0xd3, 0xfc, +- 0xdb, 0x86, 0x9c, 0xe2, 0x62, 0xfa, 0x3f, 0x5b, 0x27, 0x02, 0x8c, 0x13, +- 0xf8, 0x5e, 0x0d, 0xcc, 0x3a, 0x1e, 0xcb, 0x3a, 0xf4, 0x51, 0x6d, 0xda, +- 0x87, 0x21, 0xa2, 0xeb, 0x9c, 0x3d, 0xd7, 0x95, 0x39, 0xfa, 0x7d, 0xa2, +- 0x36, 0x23, 0x9b, 0x41, 0xa2, 0x45, 0x59, 0xdd, 0x8d, 0xda, 0xe2, 0xb5, +- 0xf9, 0xb6, 0xc6, 0xc3, 0xfd, 0x4a, 0xd2, 0x15, 0xe5, 0x84, 0x5e, 0xbc, +- 0x9b, 0x16, 0x78, 0xc7, 0xb6, 0xc1, 0x5e, 0x34, 0xe5, 0x6b, 0x00, 0x3b, +- 0x86, 0xf0, 0xb8, 0xaf, 0x57, 0x6c, 0x5b, 0xea, 0xc3, 0x03, 0xc4, 0x4b, +- 0x0d, 0xf1, 0xf2, 0x61, 0x6c, 0x29, 0xad, 0xc3, 0xd7, 0xfe, 0x9d, 0x3c, +- 0x77, 0xd6, 0x68, 0x6e, 0x2e, 0x4a, 0x18, 0x7e, 0xae, 0xf7, 0x22, 0xd8, +- 0x39, 0x12, 0xe9, 0xf1, 0x49, 0x6c, 0x87, 0x11, 0xdc, 0x3b, 0x79, 0x2b, +- 0xdd, 0xe7, 0xb9, 0x82, 0xb8, 0x2b, 0xe3, 0x14, 0x6f, 0x51, 0xbd, 0x74, +- 0x2a, 0x2d, 0x2d, 0x72, 0xe0, 0x39, 0xeb, 0x89, 0xc0, 0x2e, 0xdc, 0xa4, +- 0x77, 0x61, 0x3b, 0xd9, 0x60, 0x47, 0xd3, 0x2e, 0x8c, 0x92, 0x0d, 0x6c, +- 0xab, 0xa7, 0x1a, 0x2e, 0x56, 0xb2, 0x7a, 0x03, 0x2c, 0x47, 0x81, 0x4e, +- 0xba, 0x5e, 0x47, 0x75, 0x9d, 0x14, 0x23, 0x6b, 0x23, 0xbf, 0x90, 0x35, +- 0x35, 0x97, 0xc4, 0xef, 0xd8, 0x6b, 0xd6, 0x51, 0x9e, 0x76, 0x31, 0x3e, +- 0xf0, 0x33, 0x4e, 0xf8, 0x22, 0x3d, 0xa6, 0x55, 0xa5, 0x69, 0xd1, 0x8d, +- 0x52, 0x53, 0x6e, 0x86, 0x6c, 0x76, 0x7d, 0xeb, 0xb5, 0xcf, 0xcd, 0xcb, +- 0x48, 0x87, 0xbb, 0x75, 0xca, 0x2a, 0x2b, 0x83, 0x50, 0x5a, 0xaf, 0xd5, +- 0xfd, 0xfc, 0x1c, 0x4c, 0x73, 0x25, 0xae, 0x85, 0xa4, 0x88, 0x72, 0x37, +- 0x2e, 0xd0, 0x1a, 0x41, 0x6c, 0x2d, 0x76, 0xa1, 0x77, 0xc4, 0xf1, 0x19, +- 0x3e, 0xf1, 0xb3, 0x2d, 0x7f, 0xc6, 0xff, 0x8e, 0x91, 0x48, 0xa7, 0x77, +- 0x8e, 0xff, 0xed, 0x93, 0x9f, 0xcd, 0x35, 0x90, 0xe1, 0xbc, 0xca, 0xf3, +- 0xf1, 0xb9, 0xa1, 0x79, 0xf9, 0x06, 0xf1, 0x80, 0x3d, 0xdf, 0x61, 0x0f, +- 0xfb, 0xb0, 0x8b, 0x7c, 0x7d, 0x43, 0xab, 0x89, 0x57, 0x13, 0xf7, 0x5b, +- 0x3b, 0x6c, 0x19, 0xdc, 0x6f, 0x3f, 0xdf, 0xd9, 0x74, 0x76, 0x0e, 0xfb, +- 0x54, 0xfa, 0xb0, 0xa7, 0x4a, 0x2d, 0xf6, 0x1e, 0xc3, 0x0f, 0x29, 0x0f, +- 0x3e, 0xf7, 0xb9, 0x3e, 0xdf, 0x76, 0x17, 0xef, 0x4d, 0x3c, 0x5d, 0x92, +- 0x85, 0x73, 0xa4, 0x5a, 0xb8, 0x46, 0x98, 0xb6, 0x8f, 0xe5, 0x8a, 0x8f, +- 0xfd, 0x57, 0x24, 0x03, 0xbc, 0xcf, 0x58, 0xb1, 0xff, 0x68, 0xfb, 0xbd, +- 0xc0, 0x51, 0xd3, 0x53, 0xb5, 0x0a, 0x54, 0xeb, 0x77, 0xdb, 0xf6, 0xb0, +- 0xd0, 0x08, 0xac, 0x7d, 0xae, 0x89, 0xeb, 0x7d, 0xee, 0x0d, 0x6a, 0x6b, +- 0xc7, 0x08, 0x80, 0x6e, 0x55, 0x78, 0x4d, 0xf5, 0x04, 0xf7, 0xeb, 0xb9, +- 0x8f, 0x4f, 0x71, 0xd7, 0x5b, 0xb7, 0xca, 0xf4, 0x2c, 0x58, 0xe5, 0x14, +- 0x8b, 0x33, 0x3d, 0x64, 0x7b, 0x1a, 0x12, 0x19, 0xd3, 0xdb, 0xb0, 0x2a, +- 0x84, 0x87, 0x32, 0xf3, 0x31, 0xb9, 0x05, 0x2d, 0xe3, 0xc0, 0x0f, 0x33, +- 0x41, 0x34, 0x8f, 0x86, 0xfb, 0x6f, 0x95, 0xc2, 0x03, 0xb3, 0x12, 0xdf, +- 0xbb, 0xbc, 0x66, 0xa5, 0x8d, 0xc5, 0x3f, 0x5a, 0xb3, 0xc2, 0xfe, 0x0c, +- 0x18, 0xd7, 0xe7, 0xef, 0x40, 0x7a, 0xc6, 0x33, 0x5b, 0x96, 0x2c, 0x3c, +- 0x14, 0x93, 0x70, 0xb3, 0xfe, 0x6f, 0xc9, 0xb7, 0x04, 0xd9, 0xc6, 0xab, +- 0x9c, 0x83, 0xed, 0x60, 0xb6, 0x64, 0x95, 0x86, 0x55, 0x99, 0x3a, 0x8a, +- 0x49, 0xf5, 0x14, 0x9f, 0xea, 0x70, 0x85, 0x62, 0xd2, 0x8a, 0x36, 0x0b, +- 0x8b, 0xdb, 0xcc, 0xbe, 0xc5, 0xe0, 0x3d, 0x68, 0xd5, 0x2c, 0x0a, 0xb5, +- 0xa7, 0x4b, 0x52, 0xbb, 0xeb, 0x25, 0x05, 0xdb, 0x23, 0x3c, 0x77, 0xd0, +- 0x58, 0x95, 0xaf, 0xe4, 0xd3, 0x4a, 0x5e, 0x75, 0xce, 0xe5, 0x53, 0xb7, +- 0xa1, 0x4f, 0xab, 0x3f, 0x4e, 0x49, 0xbc, 0x6f, 0xd2, 0x83, 0x91, 0x6c, +- 0x0a, 0x7b, 0xb3, 0x21, 0xfc, 0x3a, 0xe3, 0x26, 0xdb, 0x08, 0xeb, 0x3f, +- 0x00, 0x8f, 0xf1, 0x19, 0xb1, 0x7c, 0x38, 0xfa, 0x90, 0xf4, 0x13, 0x94, +- 0x9d, 0xea, 0x11, 0xaa, 0x12, 0x08, 0x37, 0x34, 0x87, 0x5e, 0xc4, 0x4f, +- 0xec, 0x7d, 0x36, 0xa0, 0xc2, 0x43, 0x53, 0x1e, 0xc8, 0x65, 0x3c, 0xb3, +- 0xb0, 0x7b, 0xb2, 0xbc, 0x6f, 0x2c, 0x61, 0xbd, 0x7e, 0x3f, 0xc9, 0x59, +- 0xa0, 0xa9, 0xb5, 0x0e, 0xe5, 0x2d, 0x4e, 0x8c, 0x64, 0x38, 0x0f, 0x7f, +- 0xbc, 0x46, 0x1e, 0x42, 0x79, 0x6e, 0x4f, 0x34, 0xe1, 0xa0, 0x0c, 0xfd, +- 0x72, 0x11, 0x38, 0x48, 0xb1, 0x63, 0x53, 0xec, 0x37, 0x56, 0x05, 0x8f, +- 0xca, 0xfe, 0xf4, 0x98, 0xc0, 0x02, 0x2d, 0x49, 0xf2, 0x70, 0xfa, 0x0f, +- 0xa5, 0xa3, 0x76, 0x0e, 0x1e, 0xa1, 0xf9, 0x93, 0xf6, 0xfc, 0x91, 0xfd, +- 0x4b, 0x25, 0x09, 0xd7, 0xb7, 0x1e, 0xc5, 0xc4, 0xc2, 0x0a, 0x0d, 0x41, +- 0xc2, 0x04, 0x5c, 0xcb, 0xd6, 0x13, 0x8f, 0x9b, 0x1f, 0xe3, 0xbe, 0xe6, +- 0x6f, 0xd7, 0xdc, 0x30, 0xce, 0x7e, 0xfd, 0xf1, 0x9a, 0x77, 0xd3, 0x6a, +- 0xb2, 0x9e, 0xea, 0x87, 0x6a, 0x92, 0xc3, 0xbd, 0x43, 0xdc, 0x4f, 0xa8, +- 0x37, 0x5e, 0x3f, 0xcc, 0x79, 0x59, 0x1d, 0x68, 0x10, 0x3e, 0x71, 0x73, +- 0x46, 0xed, 0x63, 0xc2, 0x2f, 0x47, 0xd4, 0x20, 0xc9, 0xae, 0xf3, 0x1e, +- 0xd1, 0xc7, 0x35, 0x8b, 0x2d, 0xb7, 0xeb, 0xf2, 0x15, 0xdc, 0x11, 0x9e, +- 0xc3, 0x21, 0x51, 0x1b, 0x77, 0x58, 0xd6, 0x9e, 0x18, 0xe7, 0x71, 0xfb, +- 0x4c, 0x00, 0x5d, 0xaf, 0x33, 0x96, 0x52, 0x6d, 0x31, 0xc8, 0xf4, 0xf1, +- 0x19, 0x0f, 0x89, 0x6a, 0xd1, 0xec, 0xab, 0x73, 0xb8, 0xc4, 0x87, 0x7d, +- 0x74, 0xbd, 0x6c, 0xe3, 0x13, 0x3e, 0xa7, 0xe8, 0x35, 0x94, 0xc7, 0xf8, +- 0x6c, 0xe3, 0x6f, 0xd7, 0xac, 0x1f, 0x53, 0x43, 0x12, 0xf1, 0xb1, 0x97, +- 0xf7, 0xe7, 0x69, 0xce, 0x69, 0x9d, 0xe9, 0xbe, 0xbc, 0x86, 0xfb, 0xb1, +- 0x4b, 0x88, 0x6e, 0x2b, 0x1b, 0x66, 0x0c, 0x6a, 0xdb, 0x4a, 0x22, 0x4f, +- 0x55, 0xfd, 0xe2, 0x0a, 0xaf, 0x2e, 0xd2, 0xc9, 0xb1, 0x74, 0x12, 0xa7, +- 0xe2, 0x15, 0xfd, 0xac, 0xcb, 0x7f, 0x03, 0xa9, 0xfa, 0x0e, 0xe4, 0xb2, +- 0x8a, 0x7f, 0x43, 0xa6, 0x03, 0xa3, 0xa4, 0xc3, 0xbb, 0x8b, 0x41, 0x7f, +- 0x47, 0x46, 0x43, 0x6f, 0x91, 0xeb, 0x2b, 0x18, 0x7b, 0xc6, 0x26, 0xe7, +- 0xea, 0xe0, 0x4a, 0x2e, 0x39, 0x90, 0xa9, 0xd8, 0x5c, 0x38, 0xef, 0x99, +- 0x0d, 0x89, 0xca, 0xbc, 0x32, 0xad, 0x23, 0x0f, 0xfd, 0x89, 0x85, 0x85, +- 0x6c, 0x0b, 0x77, 0x60, 0x6c, 0xdc, 0x6f, 0x2e, 0x36, 0x14, 0xac, 0x6a, +- 0xfd, 0x73, 0x7a, 0xb6, 0x05, 0x1f, 0x1f, 0xff, 0x3a, 0xca, 0xdf, 0x24, +- 0x7c, 0x94, 0x49, 0xa2, 0xb9, 0xf5, 0x16, 0xa4, 0xfe, 0x40, 0xc6, 0xd3, +- 0x19, 0x1f, 0x9e, 0xcf, 0x54, 0xf6, 0xec, 0x7f, 0x94, 0x25, 0x3f, 0x24, +- 0x1f, 0x78, 0xee, 0x4b, 0xf7, 0x49, 0x29, 0x9e, 0x3b, 0x78, 0x0f, 0xff, +- 0x1f, 0x1e, 0x77, 0xde, 0x1e, 0xe7, 0x11, 0x75, 0x23, 0xf3, 0xf3, 0x5a, +- 0xd0, 0x5a, 0xff, 0xbe, 0x67, 0x08, 0xf3, 0x81, 0x62, 0x48, 0xe5, 0x8c, +- 0x83, 0x90, 0x47, 0xec, 0x7d, 0x23, 0xc2, 0xb9, 0x11, 0xfd, 0x02, 0x4c, +- 0xb8, 0x09, 0x5f, 0x2d, 0x25, 0x59, 0x68, 0x99, 0x80, 0x5f, 0x2a, 0x2a, +- 0xf4, 0xdf, 0xe8, 0x77, 0x92, 0x7c, 0x9c, 0xc5, 0x8f, 0x28, 0xa6, 0xb0, +- 0x4f, 0x55, 0x72, 0x9c, 0x54, 0x7c, 0xc4, 0x4b, 0xc0, 0x87, 0x3e, 0x2b, +- 0x36, 0x1d, 0xca, 0x2f, 0xf6, 0x32, 0x96, 0xc9, 0x65, 0x2a, 0xbf, 0x23, +- 0x57, 0x7f, 0x93, 0x9e, 0x6d, 0x99, 0x8d, 0xd0, 0x6f, 0x96, 0xc5, 0x73, +- 0x56, 0x6a, 0x33, 0xcb, 0x2b, 0xe0, 0x7f, 0x83, 0xe4, 0x3f, 0x46, 0x34, +- 0x66, 0x69, 0x8d, 0xd7, 0x69, 0xcd, 0x4c, 0xf1, 0x10, 0x8d, 0xe1, 0x7b, +- 0x24, 0x67, 0xdb, 0x76, 0x0f, 0x7b, 0xf9, 0x7c, 0xc2, 0xf3, 0x19, 0x60, +- 0x30, 0x6b, 0xaa, 0xce, 0xb9, 0x73, 0x9d, 0x83, 0x94, 0x2f, 0xab, 0x28, +- 0x16, 0xbd, 0x19, 0xdf, 0x8e, 0x1b, 0x73, 0x6a, 0xd2, 0x24, 0x3c, 0x96, +- 0x52, 0x20, 0x48, 0x77, 0x64, 0xc3, 0x01, 0xe3, 0xdd, 0x74, 0x23, 0xf1, +- 0x14, 0x0e, 0x5d, 0xa0, 0xf1, 0xa6, 0x53, 0xc6, 0x81, 0x51, 0x07, 0x2e, +- 0xf0, 0x1e, 0xb2, 0xa8, 0x3c, 0x6f, 0x82, 0xc7, 0xce, 0x7f, 0xaf, 0xa6, +- 0xba, 0x2e, 0x9c, 0xa0, 0xac, 0x6a, 0xd6, 0x10, 0x6e, 0xcf, 0xb7, 0x3f, +- 0x82, 0x43, 0x54, 0xeb, 0xef, 0x88, 0x85, 0x90, 0xac, 0x8b, 0x53, 0xbd, +- 0xd1, 0xdc, 0x7f, 0x09, 0xff, 0xcd, 0x2a, 0xf3, 0x3e, 0xbc, 0x08, 0x27, +- 0x2e, 0xe1, 0x53, 0xcb, 0xa1, 0x69, 0x67, 0xa7, 0xa0, 0x95, 0x2f, 0xa0, +- 0x79, 0xe0, 0x13, 0xbc, 0x67, 0xf1, 0x1e, 0xbd, 0xec, 0x70, 0x10, 0x06, +- 0x0c, 0x2b, 0x4e, 0x04, 0x50, 0x0e, 0x38, 0xb0, 0x49, 0xe7, 0xde, 0xb4, +- 0x3a, 0xf0, 0x24, 0x61, 0xf9, 0x77, 0x44, 0x73, 0xdf, 0x87, 0x38, 0x6f, +- 0x4d, 0xd4, 0xf1, 0xba, 0x02, 0x89, 0xeb, 0x9b, 0xcf, 0xba, 0xa1, 0x76, +- 0xba, 0x84, 0x96, 0x68, 0x70, 0xfc, 0x95, 0x75, 0x3e, 0xf0, 0xa9, 0xa5, +- 0x45, 0x3e, 0x25, 0x1c, 0xa4, 0x05, 0x27, 0xc9, 0xf6, 0xfb, 0x30, 0x4f, +- 0x9b, 0xa8, 0x86, 0x57, 0x27, 0x1a, 0x18, 0xf7, 0x99, 0x9e, 0x7d, 0x44, +- 0xdb, 0x6b, 0x84, 0x03, 0x76, 0xc4, 0x2e, 0x59, 0xc9, 0x85, 0x7c, 0xfe, +- 0x4f, 0xa9, 0xae, 0xf4, 0xc0, 0xb9, 0x6f, 0x72, 0x07, 0xee, 0x4a, 0x3b, +- 0x49, 0x4e, 0xf3, 0x78, 0xcd, 0x45, 0x31, 0x98, 0x63, 0x7f, 0xf9, 0x3a, +- 0x2a, 0xcd, 0x24, 0x2a, 0xf1, 0xb1, 0x87, 0xe2, 0xc2, 0x6e, 0x3b, 0x17, +- 0xc0, 0xbb, 0x64, 0x55, 0x2b, 0x3e, 0x19, 0x7f, 0xd3, 0x4b, 0xbe, 0xb4, +- 0x4e, 0x6b, 0x83, 0x08, 0x66, 0x4c, 0x51, 0x6b, 0x38, 0xf0, 0x61, 0xbb, +- 0xda, 0x29, 0x39, 0x06, 0x70, 0x7d, 0xcc, 0xb4, 0x7c, 0x9a, 0xd6, 0xd3, +- 0x22, 0x22, 0xdd, 0x45, 0x11, 0x45, 0x75, 0xd1, 0x27, 0x57, 0x17, 0x5b, +- 0x64, 0x6f, 0xd1, 0xf4, 0x28, 0xab, 0xb6, 0x53, 0xdd, 0xb2, 0x8b, 0x6a, +- 0x5b, 0x1f, 0xd5, 0xd7, 0xaa, 0x7e, 0x11, 0x6e, 0x92, 0x7f, 0x08, 0xfb, +- 0x4a, 0x06, 0x9c, 0x99, 0x9d, 0x70, 0x65, 0xc2, 0xca, 0x5e, 0xec, 0x42, +- 0x32, 0x58, 0xc1, 0xb6, 0x32, 0xe9, 0xaa, 0xaa, 0x9d, 0xb1, 0xcc, 0x76, +- 0x9c, 0x9f, 0x60, 0x7c, 0x9e, 0xc0, 0xd6, 0x34, 0xff, 0x86, 0xf7, 0xc5, +- 0xb8, 0x81, 0x93, 0x54, 0x3b, 0x79, 0x5a, 0x1b, 0x48, 0x0f, 0x8d, 0x18, +- 0x2c, 0x09, 0x36, 0x2b, 0xd2, 0x05, 0xbc, 0x27, 0xdb, 0x65, 0x1c, 0x9c, +- 0xa2, 0x44, 0x42, 0xf9, 0xca, 0x99, 0x51, 0x28, 0x4e, 0xc8, 0xf0, 0x69, +- 0x3e, 0xfa, 0x1d, 0xe0, 0x73, 0x4b, 0x64, 0x67, 0xbf, 0x5d, 0xd3, 0x62, +- 0xc7, 0x9a, 0x7a, 0xaa, 0x75, 0xde, 0x21, 0x5e, 0x58, 0x16, 0x06, 0xaa, +- 0x47, 0xe6, 0x6b, 0xc2, 0xf5, 0xb7, 0x55, 0x23, 0x48, 0x73, 0x32, 0x0e, +- 0xac, 0x9c, 0x57, 0x5d, 0x1f, 0x6b, 0x45, 0x21, 0x27, 0xe6, 0x30, 0xd6, +- 0xa0, 0xea, 0xc3, 0x3a, 0x1c, 0xa2, 0xda, 0xdf, 0xaf, 0x6d, 0x45, 0x46, +- 0x29, 0x7b, 0x7f, 0x11, 0xe7, 0x1a, 0x00, 0xde, 0x5e, 0xc2, 0x50, 0x43, +- 0xe9, 0xaf, 0x72, 0xcc, 0xf4, 0xdc, 0x1d, 0xd7, 0x71, 0x24, 0x47, 0x21, +- 0x4a, 0x5b, 0x87, 0xda, 0xb6, 0x2e, 0x7c, 0x58, 0xc7, 0xf8, 0x97, 0x62, +- 0x15, 0xd1, 0xb3, 0x77, 0x2a, 0x60, 0x9f, 0xab, 0xd8, 0x57, 0x9a, 0xa7, +- 0xf9, 0x5a, 0x5a, 0xbf, 0x8c, 0x46, 0x96, 0xc9, 0x3f, 0x44, 0x23, 0xd9, +- 0x2c, 0x61, 0x9e, 0x5c, 0xba, 0x17, 0x2f, 0xa7, 0x79, 0xde, 0x70, 0x52, +- 0x17, 0x0a, 0xf7, 0xe6, 0x6d, 0x99, 0x98, 0x53, 0xbc, 0x06, 0xaf, 0x3f, +- 0xbf, 0x4e, 0x80, 0x6a, 0x85, 0x7f, 0xec, 0x5a, 0x14, 0x37, 0x72, 0xeb, +- 0xa8, 0xee, 0x8c, 0x42, 0xfb, 0xfd, 0x32, 0xe9, 0x83, 0x7b, 0xd5, 0x4b, +- 0x09, 0xf3, 0xc2, 0xf3, 0x4a, 0x9c, 0xcf, 0x30, 0x5b, 0xbb, 0x64, 0xc3, +- 0xb2, 0x5c, 0xed, 0x9a, 0xf2, 0x36, 0xd8, 0x0e, 0x7d, 0xbc, 0xe7, 0xe1, +- 0xd9, 0xdb, 0xee, 0xc3, 0x41, 0xca, 0x81, 0x4f, 0xa5, 0x9b, 0x4d, 0xae, +- 0xfd, 0xc0, 0x38, 0x54, 0xa4, 0xe8, 0xd9, 0x7f, 0x55, 0xcd, 0x3e, 0xbb, +- 0xa7, 0xb4, 0x13, 0x52, 0xa6, 0xa7, 0x9a, 0xeb, 0x0d, 0x37, 0xd5, 0xc9, +- 0x83, 0x69, 0xa6, 0xd7, 0xda, 0xe5, 0xa4, 0xb9, 0x76, 0xc7, 0xb5, 0xd9, +- 0x1b, 0xc9, 0x2e, 0x1a, 0x0c, 0x96, 0x63, 0x00, 0x4f, 0xd0, 0xd8, 0x50, +- 0x89, 0x65, 0x79, 0xa8, 0x9a, 0xfb, 0x9e, 0xfb, 0x48, 0xbf, 0xb5, 0xd9, +- 0xca, 0x3c, 0xd9, 0x52, 0x1f, 0x96, 0x0e, 0xbd, 0x58, 0x5d, 0xa9, 0x7d, +- 0xb8, 0x2e, 0xef, 0xc7, 0xbe, 0x74, 0x00, 0x53, 0xe9, 0x66, 0xe5, 0x05, +- 0xfb, 0xcc, 0x40, 0xa5, 0x47, 0x36, 0x98, 0x9e, 0x1f, 0x13, 0xc0, 0xe4, +- 0xd5, 0xef, 0x2c, 0x9f, 0x4a, 0xef, 0xf4, 0x94, 0x8d, 0xf9, 0x65, 0x4c, +- 0x04, 0x2a, 0x78, 0x88, 0x62, 0x85, 0xf7, 0x51, 0xd2, 0xeb, 0x3b, 0xa4, +- 0x57, 0x89, 0xf4, 0xfa, 0x82, 0xfe, 0x23, 0xc6, 0x2c, 0x9e, 0x3d, 0x71, +- 0x1f, 0xef, 0x13, 0x99, 0x04, 0x5a, 0xec, 0x31, 0x99, 0xb8, 0x13, 0xe7, +- 0x86, 0xf8, 0x6c, 0xe2, 0x47, 0x6b, 0x5e, 0x4a, 0x5b, 0xeb, 0x66, 0x62, +- 0xcd, 0xa9, 0x77, 0x08, 0x4f, 0x9b, 0x7f, 0xa0, 0xea, 0xe7, 0xc9, 0x4f, +- 0xb3, 0xa3, 0x7f, 0x88, 0xf3, 0x75, 0xcd, 0xca, 0xcf, 0x61, 0x7a, 0x1e, +- 0x8f, 0x3f, 0x42, 0x35, 0x3f, 0xd5, 0x0d, 0x6d, 0xff, 0x92, 0x9c, 0x2c, +- 0x0e, 0x87, 0xd6, 0x3c, 0xfb, 0x02, 0xfe, 0x23, 0xce, 0x2f, 0x0e, 0xeb, +- 0x2f, 0x80, 0xc7, 0x54, 0xea, 0xf1, 0xf0, 0xf4, 0x7d, 0x7c, 0x9e, 0x2a, +- 0x48, 0x69, 0xb4, 0xb2, 0x9f, 0x95, 0xe6, 0xfd, 0x37, 0x81, 0x89, 0x2d, +- 0x54, 0x4b, 0xdb, 0xe7, 0x58, 0xe1, 0x7d, 0x92, 0xfc, 0x22, 0x3a, 0xcc, +- 0xe3, 0x3f, 0x5e, 0xa3, 0xe5, 0x43, 0x70, 0x10, 0xc6, 0x49, 0x05, 0xd4, +- 0x4e, 0x20, 0xe8, 0x7f, 0x32, 0x1d, 0xa4, 0x1a, 0xad, 0xb9, 0x3b, 0x2a, +- 0xee, 0x9c, 0xdb, 0xf7, 0xe6, 0x3c, 0xf7, 0xf1, 0x9a, 0x63, 0x69, 0x35, +- 0xf5, 0x24, 0x9a, 0x7b, 0x7c, 0xe2, 0x0e, 0xa4, 0xea, 0x9a, 0xfb, 0x4e, +- 0x22, 0x9c, 0xf0, 0x08, 0x35, 0x7a, 0x1e, 0x95, 0x79, 0x96, 0xe5, 0x1d, +- 0x54, 0x27, 0x72, 0x9c, 0x49, 0xe3, 0xa4, 0xe2, 0xc0, 0xf2, 0x56, 0x6d, +- 0x76, 0x12, 0xf3, 0xf6, 0x52, 0x19, 0xb3, 0x2e, 0x4f, 0xe3, 0x1d, 0x0a, +- 0xd5, 0xfb, 0x6e, 0x38, 0xeb, 0x79, 0x4f, 0x71, 0x27, 0x76, 0xa4, 0x39, +- 0x4f, 0x93, 0x5c, 0xc8, 0x37, 0xbb, 0x23, 0x3b, 0xd1, 0x9f, 0x0f, 0xe0, +- 0x50, 0x36, 0xbc, 0x7f, 0x2f, 0xe1, 0xba, 0xe1, 0x52, 0x38, 0xb4, 0x4d, +- 0x04, 0x48, 0xdf, 0x54, 0xff, 0xd7, 0x07, 0xa9, 0x4e, 0x56, 0xe8, 0xbf, +- 0x52, 0xcf, 0xbc, 0x44, 0xf5, 0xcc, 0x39, 0xf2, 0x35, 0xdf, 0x5c, 0xad, +- 0xba, 0x6c, 0xc2, 0xc2, 0x4c, 0x6c, 0x23, 0x2e, 0xdb, 0x3a, 0x0b, 0x92, +- 0x8d, 0x71, 0x2e, 0xe2, 0xb3, 0x35, 0x1e, 0xb1, 0x6d, 0xd8, 0xf4, 0x3c, +- 0xd8, 0x1e, 0x44, 0x38, 0xc3, 0x98, 0x53, 0xfa, 0xa6, 0x83, 0xe4, 0x31, +- 0xa5, 0xed, 0xc2, 0x86, 0xd8, 0x2e, 0xf4, 0xeb, 0x7f, 0x02, 0x77, 0x3d, +- 0xc7, 0x23, 0xd9, 0xac, 0xa5, 0x79, 0x2f, 0xb5, 0x77, 0x21, 0x7c, 0x94, +- 0x73, 0x30, 0x55, 0xc3, 0x43, 0xec, 0xbb, 0x3c, 0xff, 0x6d, 0xc6, 0x0a, +- 0xc2, 0x15, 0x35, 0xed, 0x95, 0x3c, 0x7f, 0x7d, 0x9e, 0xcf, 0x74, 0x82, +- 0x6a, 0x53, 0x78, 0xdf, 0x5a, 0x6d, 0xe0, 0x71, 0x8a, 0x31, 0x89, 0x36, +- 0x17, 0xb0, 0x80, 0xcf, 0x2e, 0x57, 0xea, 0x18, 0xe6, 0x77, 0x69, 0x5e, +- 0x60, 0x3a, 0x4e, 0xf6, 0xf1, 0x77, 0xce, 0x28, 0x85, 0xe6, 0xce, 0x96, +- 0x72, 0xff, 0xe4, 0xb0, 0x95, 0xe4, 0xf7, 0x0d, 0xa4, 0xa0, 0x8f, 0xe2, +- 0x6d, 0xb0, 0x0c, 0x2a, 0xea, 0x29, 0x2e, 0x3b, 0xb4, 0x79, 0xb9, 0xb3, +- 0xac, 0x4f, 0x58, 0x13, 0x73, 0xba, 0x70, 0xd2, 0x33, 0x7b, 0xc6, 0xd4, +- 0x81, 0xbd, 0x68, 0xee, 0x7f, 0x57, 0x54, 0xd9, 0x3b, 0x98, 0x93, 0x2d, +- 0x48, 0x2d, 0x31, 0x9c, 0x5b, 0x3e, 0xc9, 0xae, 0x23, 0x3a, 0x2e, 0x10, +- 0x08, 0x5d, 0x6f, 0xef, 0x73, 0x4d, 0xb6, 0xfc, 0x29, 0xcd, 0xcd, 0xdf, +- 0xff, 0xd8, 0xc7, 0x67, 0x2e, 0x4f, 0x65, 0x9f, 0xb7, 0xa2, 0x0b, 0x2b, +- 0xf2, 0x39, 0x4d, 0xbe, 0x1f, 0x34, 0x24, 0x34, 0x68, 0x91, 0xd9, 0x1e, +- 0xfa, 0xfd, 0xd7, 0x79, 0x42, 0xfb, 0xab, 0xfb, 0xf0, 0xcb, 0x09, 0x03, +- 0x07, 0x28, 0x0f, 0xd4, 0x6a, 0xaa, 0x32, 0x81, 0x10, 0xd7, 0xd2, 0x36, +- 0xff, 0x2b, 0x27, 0xc8, 0x0f, 0xeb, 0x14, 0xbb, 0xc6, 0xa8, 0xf0, 0x77, +- 0x99, 0xf8, 0x7b, 0xd0, 0xc7, 0xbe, 0xb0, 0x84, 0xfc, 0x62, 0x3f, 0xf9, +- 0xeb, 0x01, 0xb2, 0x35, 0xaa, 0xe0, 0xc9, 0x0f, 0xd4, 0xfd, 0x20, 0x7f, +- 0x1d, 0x4e, 0xb3, 0xfc, 0x83, 0xfe, 0x5e, 0x3e, 0xde, 0xac, 0xd9, 0x7d, +- 0x55, 0x3d, 0x24, 0x71, 0xdc, 0xb5, 0xe3, 0xa9, 0x19, 0x92, 0xac, 0x6a, +- 0xa6, 0x6b, 0xb0, 0x14, 0x0e, 0x7a, 0xf9, 0x5d, 0x00, 0x02, 0x87, 0xbd, +- 0x7a, 0x25, 0x57, 0xce, 0x50, 0x3e, 0xba, 0x4c, 0x74, 0x1c, 0x8a, 0x35, +- 0x20, 0x45, 0xf9, 0x28, 0xa3, 0x55, 0x6c, 0x49, 0x9b, 0x66, 0x8c, 0x59, +- 0x6f, 0x04, 0xc7, 0xd5, 0x90, 0xcb, 0xd1, 0x3c, 0x70, 0x06, 0x3b, 0xad, +- 0xf3, 0x75, 0x6c, 0x53, 0x2e, 0x1c, 0x6f, 0x99, 0xb6, 0xca, 0x01, 0xe6, +- 0xd7, 0x81, 0xe7, 0x75, 0xb2, 0x99, 0xc5, 0xe1, 0xe0, 0xf3, 0x94, 0x53, +- 0xa7, 0xe6, 0xf4, 0x11, 0xce, 0xcf, 0xdb, 0xe3, 0x5a, 0x96, 0x75, 0x34, +- 0x05, 0x2d, 0x91, 0x47, 0x2f, 0x7d, 0x6f, 0x0a, 0x5e, 0x9e, 0xb3, 0xd5, +- 0x15, 0xd3, 0xaf, 0xfb, 0xe6, 0xde, 0xcb, 0xb1, 0x9f, 0x09, 0xe5, 0xff, +- 0x88, 0x7e, 0xf3, 0x9c, 0x01, 0xc6, 0x32, 0x7c, 0x56, 0xcb, 0xbb, 0xa3, +- 0xdd, 0xcd, 0xfe, 0xa2, 0xf0, 0x3b, 0x09, 0x1b, 0x86, 0xb9, 0x2f, 0xcc, +- 0x3d, 0x1a, 0x07, 0xf6, 0x5e, 0x7d, 0x67, 0x82, 0x3f, 0x3b, 0xb1, 0x69, +- 0x98, 0x7b, 0x11, 0xa7, 0x6f, 0x90, 0xf1, 0x37, 0x94, 0x87, 0x65, 0xf6, +- 0x79, 0xf2, 0xf5, 0x4f, 0xd7, 0xbc, 0x34, 0xc6, 0x39, 0x35, 0x60, 0xdc, +- 0x95, 0x9e, 0xd7, 0xf1, 0x55, 0x9e, 0xce, 0xde, 0x4d, 0x71, 0x27, 0x93, +- 0x56, 0x07, 0x22, 0x0e, 0x7b, 0x7f, 0x2d, 0x55, 0x14, 0x5f, 0xa5, 0x22, +- 0x8d, 0xe7, 0x53, 0xfc, 0x03, 0x87, 0x43, 0xc8, 0x64, 0xbb, 0xf0, 0x8d, +- 0x61, 0xcb, 0x72, 0xb7, 0x39, 0xf1, 0xca, 0x90, 0x85, 0x0f, 0x62, 0xc0, +- 0xcb, 0x43, 0xe1, 0x81, 0x73, 0xc0, 0xb7, 0x6b, 0xa9, 0x46, 0x6e, 0x11, +- 0x6a, 0x37, 0x61, 0x83, 0xd0, 0x7b, 0x68, 0x0e, 0xe6, 0xa1, 0x9e, 0xdd, +- 0x4d, 0xf3, 0xbd, 0x58, 0x00, 0x7e, 0x59, 0xf0, 0xe2, 0x17, 0xc3, 0x3c, +- 0xa7, 0x17, 0xe7, 0x8e, 0xd6, 0xfb, 0x77, 0xd2, 0x5c, 0x07, 0x29, 0xbe, +- 0x77, 0x1d, 0x4b, 0x60, 0xd3, 0x61, 0x81, 0x68, 0x24, 0x81, 0xce, 0x63, +- 0x35, 0xd8, 0x38, 0x2c, 0xe3, 0xfd, 0x78, 0x0d, 0x6e, 0x39, 0x3a, 0xcf, +- 0x47, 0xa5, 0xaf, 0xc1, 0x67, 0x35, 0xf9, 0x1c, 0xdc, 0xc9, 0x2c, 0xc7, +- 0x6c, 0xca, 0x17, 0x59, 0x8e, 0x81, 0x96, 0x15, 0x6c, 0xaf, 0xf4, 0x39, +- 0x9e, 0xa6, 0xfc, 0xf1, 0x78, 0xbb, 0x16, 0x0c, 0x4a, 0x06, 0x96, 0x8f, +- 0x96, 0xef, 0xac, 0x85, 0x75, 0x8a, 0xf7, 0x33, 0x3e, 0x6a, 0xb1, 0xac, +- 0x4d, 0xf1, 0xc8, 0xec, 0xbd, 0x36, 0xae, 0x0d, 0x90, 0x4f, 0x35, 0xe2, +- 0xf1, 0xec, 0xfc, 0x9e, 0x97, 0xd6, 0x73, 0xc9, 0x61, 0xee, 0x52, 0x60, +- 0x5d, 0xa9, 0x32, 0xac, 0x8f, 0x5c, 0x46, 0x24, 0xf8, 0x80, 0xe0, 0xb3, +- 0x22, 0xdc, 0x13, 0xb7, 0xac, 0x37, 0xe3, 0x96, 0x55, 0x88, 0x9b, 0x9e, +- 0x15, 0xab, 0x14, 0x1c, 0x5b, 0xc6, 0xef, 0x2a, 0x84, 0x93, 0x0d, 0x64, +- 0x5f, 0xde, 0x65, 0x5a, 0x70, 0x2b, 0x54, 0xd3, 0xa4, 0x20, 0x17, 0x5a, +- 0xa8, 0xf6, 0x00, 0x8d, 0xfe, 0x43, 0x43, 0xf5, 0xf8, 0xfe, 0xcc, 0xef, +- 0xf2, 0xf1, 0x1d, 0xbb, 0x9f, 0x76, 0x45, 0xc7, 0xba, 0x5a, 0x44, 0x92, +- 0xf7, 0x80, 0x7b, 0xa3, 0x7c, 0xa6, 0xd5, 0xc4, 0x2d, 0xf1, 0x3e, 0xec, +- 0x18, 0xe6, 0x7d, 0xb6, 0x3a, 0xe3, 0xca, 0xb0, 0xf5, 0xd7, 0x1e, 0xa2, +- 0x7f, 0x5d, 0x7b, 0x73, 0xca, 0x6b, 0xbf, 0xe3, 0xe4, 0x34, 0xd6, 0x8f, +- 0xd5, 0xa1, 0x34, 0xa5, 0x95, 0x97, 0x88, 0xe4, 0x1b, 0x3e, 0x44, 0x82, +- 0x0d, 0x14, 0xab, 0x66, 0xc8, 0x77, 0xa7, 0x4a, 0x5c, 0x07, 0x2c, 0x30, +- 0xac, 0xd1, 0x45, 0x98, 0x9c, 0xa1, 0xb9, 0xb2, 0x5a, 0xe7, 0x07, 0x84, +- 0xf3, 0xaa, 0x0d, 0xab, 0xd6, 0x6b, 0x44, 0xce, 0x36, 0x0b, 0x07, 0x66, +- 0xdb, 0x2c, 0xab, 0xab, 0x5d, 0x1b, 0xa8, 0x11, 0xe8, 0x97, 0x0c, 0x2d, +- 0xd1, 0xe2, 0xc0, 0xd7, 0x82, 0x88, 0x74, 0xbe, 0x89, 0x48, 0xcf, 0x05, +- 0x8a, 0x61, 0x4f, 0x95, 0xf8, 0x9c, 0xf0, 0x23, 0xf8, 0xeb, 0xe1, 0x85, +- 0x38, 0x35, 0xd5, 0x3f, 0xd7, 0x13, 0x83, 0xf7, 0xfa, 0x55, 0x06, 0x8e, +- 0x0f, 0x87, 0xc8, 0x7e, 0xdc, 0x14, 0xd7, 0x65, 0x48, 0x4d, 0x90, 0xeb, +- 0xa8, 0x4e, 0x88, 0x3d, 0x66, 0x59, 0x2b, 0x9a, 0x2a, 0x35, 0xcf, 0x8a, +- 0xe9, 0x6b, 0xdf, 0x71, 0x98, 0xef, 0xf7, 0x04, 0x49, 0x7f, 0xcd, 0xa9, +- 0x1d, 0xe2, 0x8c, 0x65, 0xfe, 0x81, 0x20, 0x9e, 0x7b, 0x6a, 0xe0, 0x65, +- 0xbe, 0x65, 0xec, 0x1e, 0xe5, 0x3e, 0x1c, 0xeb, 0x0d, 0xde, 0xce, 0x38, +- 0xef, 0x97, 0xb3, 0x8e, 0xca, 0xde, 0x0d, 0x71, 0x8a, 0x89, 0xc2, 0x4f, +- 0x78, 0xca, 0xf4, 0x74, 0x50, 0x7e, 0xaa, 0x1a, 0xe6, 0xf7, 0x2d, 0x7c, +- 0x38, 0x40, 0x71, 0xe3, 0xb2, 0x5e, 0x8d, 0x43, 0x75, 0x6a, 0x82, 0xeb, +- 0xe9, 0x27, 0x4b, 0xdc, 0x33, 0xdc, 0x89, 0xed, 0xfc, 0xbe, 0x4a, 0x69, +- 0xb5, 0x7d, 0xb6, 0x90, 0xae, 0x11, 0x36, 0x60, 0x3a, 0xe6, 0xd7, 0xef, +- 0xc4, 0x92, 0x21, 0xd6, 0xe3, 0xc7, 0x6b, 0x82, 0x24, 0xa3, 0xc7, 0xc9, +- 0x2e, 0x24, 0xa3, 0x03, 0xf2, 0x90, 0x65, 0xdd, 0x18, 0xbf, 0x76, 0x0e, +- 0xad, 0xff, 0x82, 0x83, 0xea, 0x3b, 0x07, 0xef, 0xeb, 0xa9, 0x89, 0x13, +- 0xe2, 0xda, 0x39, 0x0b, 0x35, 0xdc, 0x4f, 0x34, 0xa7, 0x2a, 0x79, 0xe9, +- 0x38, 0xe5, 0xa5, 0x97, 0x73, 0xec, 0x23, 0xf5, 0x06, 0xfb, 0x88, 0x44, +- 0xb1, 0x76, 0x7d, 0x3a, 0x84, 0x0b, 0x3a, 0x34, 0x37, 0x62, 0x44, 0x77, +- 0xa4, 0xbb, 0x63, 0x0e, 0xf3, 0xb9, 0x28, 0xfe, 0x4f, 0xe5, 0x78, 0xaf, +- 0x4d, 0xa0, 0x46, 0x63, 0x1b, 0xb0, 0x73, 0x01, 0xc5, 0xb4, 0x7e, 0xd4, +- 0xae, 0x06, 0x2e, 0x0d, 0xf1, 0xfe, 0x8c, 0x86, 0x03, 0xa5, 0x01, 0xd1, +- 0x30, 0xf4, 0x5b, 0x2b, 0x54, 0x35, 0xbf, 0x07, 0xf8, 0x30, 0xef, 0x01, +- 0x92, 0x0d, 0xf4, 0xdb, 0xe7, 0x7c, 0xde, 0x4c, 0xf3, 0x39, 0x9f, 0x70, +- 0x68, 0x13, 0xf9, 0x4e, 0x2f, 0x9a, 0xf5, 0x69, 0xc2, 0xce, 0xb3, 0x44, +- 0x67, 0x93, 0xa8, 0xec, 0x73, 0x45, 0xe6, 0xf6, 0xe9, 0x96, 0xe5, 0x3b, +- 0x45, 0x4d, 0x81, 0x69, 0x0a, 0x10, 0x4d, 0x1d, 0xa2, 0xfa, 0xd8, 0x06, +- 0xe1, 0x3b, 0xd6, 0x25, 0xa4, 0x02, 0xc7, 0xe4, 0x3a, 0x63, 0x4f, 0x8e, +- 0xf3, 0xd9, 0x66, 0xe1, 0x3c, 0xba, 0x45, 0x78, 0x0b, 0x3d, 0xc2, 0x7f, +- 0xcc, 0xc4, 0xfd, 0xf1, 0x2e, 0x9c, 0x1b, 0xe6, 0xb3, 0x6c, 0xf7, 0x89, +- 0x9a, 0xb9, 0xbd, 0x39, 0x6f, 0xa1, 0xd1, 0x5f, 0x48, 0x73, 0x7f, 0xf7, +- 0xe3, 0x35, 0xe9, 0xa1, 0x45, 0xfe, 0xa7, 0xc6, 0x02, 0xfe, 0x27, 0xc7, +- 0xd4, 0xfe, 0x7d, 0xc2, 0xb2, 0x76, 0xc6, 0xfe, 0x03, 0xeb, 0xd0, 0x6a, +- 0x8e, 0x55, 0xf0, 0xc1, 0x6e, 0x92, 0xc7, 0x36, 0xca, 0x2d, 0x93, 0x7a, +- 0xf3, 0x1c, 0x16, 0x51, 0x53, 0xfc, 0xee, 0x1b, 0xfd, 0x77, 0x73, 0x6e, +- 0xe3, 0x7d, 0x4d, 0x67, 0x3b, 0x28, 0xee, 0x7e, 0xc6, 0x6b, 0xcd, 0x10, +- 0x9f, 0x51, 0xeb, 0x87, 0xff, 0x4b, 0xf6, 0xf5, 0xce, 0x7d, 0xb6, 0xaf, +- 0x97, 0x78, 0x52, 0xa8, 0xe5, 0x19, 0xe2, 0xb7, 0xca, 0xf1, 0xb9, 0x3d, +- 0xbd, 0xb9, 0xfd, 0xbc, 0x4e, 0xe1, 0x2b, 0x70, 0x7d, 0x1e, 0x30, 0x5e, +- 0x1f, 0xea, 0x10, 0xde, 0x63, 0xc3, 0x94, 0x1f, 0x37, 0x10, 0xcf, 0x7c, +- 0x76, 0xac, 0x4b, 0xf8, 0x0b, 0x9b, 0x85, 0x8f, 0xf8, 0xac, 0x26, 0x3e, +- 0x71, 0xcc, 0x23, 0xbc, 0xc4, 0xa3, 0x87, 0x78, 0xf4, 0xce, 0xf1, 0xe8, +- 0x29, 0x04, 0xfd, 0xe9, 0x74, 0xbd, 0xff, 0xd1, 0x31, 0xc5, 0xbf, 0x6f, +- 0xcc, 0xb2, 0xde, 0xd7, 0x15, 0x3f, 0xf3, 0xf5, 0xaa, 0xfe, 0x45, 0xbe, +- 0x6e, 0x20, 0xbe, 0x2a, 0x7b, 0xb1, 0xa4, 0xc3, 0x14, 0xeb, 0x90, 0xcf, +- 0x71, 0xcc, 0xf3, 0x75, 0x30, 0xcd, 0xfb, 0x95, 0xbc, 0x6f, 0x39, 0x20, +- 0x56, 0x10, 0x5f, 0x65, 0xe2, 0x6b, 0xe5, 0x97, 0xf0, 0xf5, 0xe1, 0x35, +- 0x7c, 0xbd, 0xfa, 0xf7, 0xf2, 0xe5, 0x11, 0xcb, 0x87, 0x39, 0x0e, 0xdd, +- 0x66, 0xc8, 0xc3, 0x16, 0x61, 0x47, 0x07, 0xbe, 0x3f, 0x05, 0x14, 0xb3, +- 0xbb, 0x20, 0x53, 0xbc, 0x39, 0x1d, 0x8f, 0x84, 0x5e, 0xa1, 0x7a, 0x72, +- 0xba, 0xe4, 0x15, 0xcb, 0xec, 0x3d, 0x59, 0xac, 0x90, 0x89, 0xa6, 0x19, +- 0xfb, 0x5d, 0x33, 0xe8, 0xb5, 0x1a, 0xeb, 0x52, 0x3b, 0xbb, 0x15, 0x91, +- 0x72, 0xc4, 0xd1, 0x25, 0x12, 0x05, 0xde, 0x83, 0xdd, 0x22, 0x56, 0xda, +- 0xfb, 0xaf, 0x9d, 0xe2, 0xfa, 0x42, 0x87, 0x68, 0x21, 0xbb, 0x68, 0x3e, +- 0xc6, 0xe7, 0xc1, 0x36, 0x8b, 0xe6, 0x39, 0x79, 0x2c, 0x27, 0x79, 0x0c, +- 0x7d, 0x4e, 0x1e, 0x1b, 0x6c, 0x79, 0xfc, 0x4c, 0xbf, 0x78, 0x4d, 0x0f, +- 0x8d, 0xeb, 0x2a, 0xca, 0x86, 0x54, 0x3b, 0xd5, 0xce, 0xd5, 0x4e, 0x6f, +- 0xc5, 0xf8, 0x9c, 0x8f, 0x69, 0xd5, 0x68, 0x08, 0x39, 0x0d, 0xb5, 0xe7, +- 0xb4, 0xd0, 0x52, 0xf7, 0x89, 0xe4, 0x26, 0x1f, 0xd5, 0x3f, 0x3b, 0x62, +- 0x91, 0xe4, 0x72, 0x11, 0x49, 0x38, 0x05, 0xe7, 0x15, 0x5d, 0xae, 0x2a, +- 0x9a, 0xd8, 0x47, 0xf1, 0xed, 0xc5, 0x9c, 0x44, 0xd8, 0x81, 0xdf, 0x3f, +- 0x73, 0xe2, 0x46, 0x82, 0x12, 0x4f, 0x10, 0xee, 0x78, 0x3c, 0xdb, 0x87, +- 0x27, 0xf2, 0xbd, 0x78, 0x3c, 0xff, 0x77, 0xde, 0xb5, 0x91, 0xbd, 0x46, +- 0x63, 0xa2, 0x72, 0x16, 0xe1, 0xe3, 0xc4, 0x75, 0x11, 0x96, 0xcd, 0x89, +- 0x16, 0x39, 0xc2, 0xb5, 0xae, 0xf3, 0x77, 0xdf, 0xd5, 0xd8, 0x17, 0x7b, +- 0x56, 0xbd, 0x64, 0x63, 0x91, 0x93, 0x6d, 0xc7, 0xec, 0x33, 0x52, 0xe5, +- 0x95, 0x7b, 0xec, 0x77, 0x41, 0x7d, 0xab, 0xef, 0xd2, 0xd8, 0x1f, 0x4e, +- 0xc4, 0xd7, 0xdb, 0xf9, 0xb5, 0x71, 0x6d, 0xe5, 0x3d, 0x99, 0xe0, 0xda, +- 0x4a, 0xaf, 0x26, 0xb0, 0x36, 0x6a, 0x7f, 0x86, 0xd6, 0x56, 0xf6, 0xba, +- 0xf5, 0xb5, 0x4d, 0xf6, 0x67, 0x74, 0x6d, 0xc5, 0xa7, 0xb4, 0xb5, 0x9a, +- 0xfd, 0x19, 0x5f, 0x5b, 0xc9, 0xcb, 0x2d, 0x6b, 0x97, 0x5e, 0x7d, 0xbf, +- 0x86, 0xff, 0xfe, 0x17, 0x9f, 0xed, 0x4e, 0xb2, 0x20, 0x3b, 0x00, 0x00, +- 0x00 }; ++ 0xbd, 0x7b, 0x7d, 0x74, 0x1b, 0x55, 0x96, 0xe7, 0xef, 0xa9, 0x64, 0xbb, ++ 0x24, 0xcb, 0xb2, 0xec, 0xc8, 0x41, 0x9e, 0x71, 0x77, 0x54, 0x51, 0xc9, ++ 0x11, 0xd8, 0x84, 0x92, 0x23, 0x27, 0x62, 0x5a, 0x26, 0x22, 0x98, 0xe0, ++ 0x34, 0x9e, 0xc1, 0xcd, 0xa6, 0x67, 0x4c, 0x1f, 0xce, 0x69, 0x4d, 0x70, ++ 0xc0, 0x84, 0x00, 0xa6, 0x61, 0x7a, 0xcc, 0x2c, 0xdb, 0x2e, 0x1c, 0xe7, ++ 0x83, 0x44, 0xb6, 0xfc, 0x95, 0x0e, 0x99, 0xed, 0xb3, 0x11, 0xb6, 0x13, ++ 0x27, 0x20, 0x59, 0x7c, 0x76, 0xc3, 0x39, 0xd3, 0x83, 0x37, 0x04, 0x48, ++ 0xd3, 0x40, 0x68, 0xba, 0x77, 0x0f, 0x33, 0x3b, 0x3b, 0xed, 0x25, 0x7c, ++ 0x24, 0x7c, 0x66, 0x66, 0xce, 0x6c, 0x3b, 0x33, 0x74, 0xd7, 0xfe, 0x5e, ++ 0x49, 0x0e, 0x69, 0x86, 0x39, 0x7b, 0xb6, 0xff, 0xd8, 0x9c, 0xe3, 0x94, ++ 0x54, 0xf5, 0xea, 0xbd, 0x7b, 0xef, 0xbb, 0xf7, 0xf7, 0xbb, 0xf7, 0xbd, ++ 0xa7, 0xcb, 0x00, 0x37, 0x4a, 0xff, 0xaa, 0xf8, 0xd7, 0xda, 0xd7, 0x7f, ++ 0x9f, 0xb1, 0xda, 0x58, 0xcd, 0x8f, 0xb7, 0xf1, 0xaf, 0x4c, 0x3e, 0x5c, ++ 0x2b, 0x80, 0xd4, 0x07, 0xf8, 0x9d, 0xfe, 0x2d, 0xff, 0xdd, 0x5e, 0xc3, ++ 0x9e, 0x65, 0xc5, 0xeb, 0xdf, 0x95, 0x7d, 0x7e, 0x4f, 0x01, 0x7c, 0x4b, ++ 0x72, 0xca, 0x3f, 0xa8, 0x8e, 0x44, 0xea, 0x6b, 0x1b, 0x74, 0xa8, 0x4a, ++ 0xc2, 0x7f, 0xd5, 0x2d, 0x3a, 0x90, 0xcc, 0x35, 0x05, 0xaf, 0xc1, 0xaf, ++ 0x2d, 0xd3, 0xef, 0x84, 0xbc, 0xff, 0x95, 0xc4, 0x67, 0x03, 0x3f, 0x5e, ++ 0xa7, 0x9d, 0xcb, 0x2a, 0x50, 0x7d, 0x89, 0xa3, 0xf0, 0x35, 0x42, 0x6d, ++ 0xe0, 0x3b, 0x3f, 0x58, 0x75, 0x85, 0x13, 0xde, 0xa5, 0xbe, 0x60, 0x96, ++ 0x25, 0x92, 0xd8, 0x91, 0xe9, 0xc3, 0xd1, 0x18, 0x50, 0x31, 0x1c, 0x36, ++ 0x76, 0x00, 0xa3, 0x8e, 0x44, 0x38, 0x78, 0x1c, 0x41, 0xcc, 0xe4, 0xe2, ++ 0xd8, 0x5d, 0x80, 0xe9, 0x4c, 0x04, 0xf1, 0x50, 0xfa, 0x37, 0x56, 0xd0, ++ 0x96, 0xa8, 0x0f, 0x43, 0x6c, 0xbb, 0x33, 0x0d, 0x35, 0x90, 0x78, 0x00, ++ 0x81, 0x0c, 0xd4, 0xaa, 0x44, 0x3f, 0xf2, 0xc3, 0xa1, 0x93, 0xb3, 0xd0, ++ 0xba, 0xea, 0x15, 0xad, 0x0f, 0x68, 0x4a, 0xdd, 0x24, 0xb4, 0xee, 0x39, ++ 0xa1, 0xc5, 0xb7, 0x0b, 0xa8, 0x82, 0xed, 0x2e, 0xcb, 0xc9, 0x6b, 0x3f, ++ 0x56, 0xe5, 0x54, 0x2c, 0x28, 0xb2, 0x9f, 0xab, 0x69, 0x7f, 0x01, 0xa7, ++ 0x9e, 0xc4, 0xce, 0x8c, 0x1c, 0x43, 0x60, 0x47, 0x2c, 0xec, 0x9b, 0x86, ++ 0x7c, 0x1e, 0xc4, 0xa0, 0xdd, 0x4e, 0xa3, 0xd6, 0x96, 0x35, 0x64, 0x58, ++ 0xd6, 0x61, 0xa3, 0x02, 0xa6, 0x4f, 0x0b, 0x00, 0x02, 0x83, 0x86, 0x03, ++ 0x49, 0xdf, 0x86, 0xa0, 0x13, 0x5a, 0x60, 0x2b, 0xfe, 0x95, 0x3a, 0x27, ++ 0x23, 0x65, 0x28, 0xb6, 0x4f, 0xa1, 0x02, 0xf3, 0xbe, 0xa2, 0xd5, 0xa6, ++ 0xd2, 0x96, 0xf5, 0x92, 0xee, 0xc4, 0x61, 0xda, 0x67, 0x30, 0xf7, 0xaf, ++ 0xd6, 0x3c, 0x6d, 0x33, 0xa4, 0x2f, 0x8d, 0xaf, 0x22, 0xeb, 0xb3, 0xac, ++ 0x69, 0x3e, 0xdb, 0x95, 0x5b, 0xb2, 0xb3, 0x65, 0x39, 0x74, 0xcb, 0xba, ++ 0x45, 0xff, 0x17, 0x6b, 0xcb, 0x6f, 0xb5, 0x8d, 0xe2, 0xd1, 0x51, 0x1f, ++ 0x1e, 0xcb, 0x24, 0x91, 0x4b, 0x5b, 0x50, 0x12, 0x4e, 0xf4, 0x0e, 0x07, ++ 0xb1, 0x3d, 0xdf, 0x8e, 0x7c, 0x5a, 0x4b, 0x2d, 0xf0, 0xbd, 0x2d, 0x31, ++ 0x1d, 0x77, 0xe6, 0x3b, 0x30, 0x9b, 0x86, 0xe5, 0x4a, 0xe8, 0xf3, 0x2e, ++ 0x11, 0xc1, 0x6d, 0xf9, 0x4e, 0xcc, 0xa5, 0xf5, 0x93, 0x83, 0x22, 0xdc, ++ 0x5f, 0xaf, 0x38, 0x71, 0x77, 0xbe, 0x19, 0x77, 0xe5, 0xe3, 0x7c, 0xc7, ++ 0xc2, 0xd7, 0xa3, 0x0d, 0x6c, 0xdf, 0x82, 0x63, 0x93, 0x96, 0x15, 0x89, ++ 0xfa, 0xd0, 0x9b, 0x37, 0x30, 0x3b, 0xea, 0x40, 0xea, 0xb0, 0x13, 0xa9, ++ 0x47, 0xe8, 0x82, 0x8f, 0xb4, 0x60, 0x7a, 0xd4, 0xc2, 0x16, 0x63, 0xb0, ++ 0xde, 0x81, 0x32, 0xa4, 0x7c, 0x02, 0x65, 0xba, 0x17, 0x5b, 0x7d, 0x45, ++ 0xd9, 0x17, 0x14, 0x81, 0x6d, 0x8f, 0x44, 0xf0, 0x56, 0xda, 0xc4, 0xd7, ++ 0x5b, 0x03, 0xe8, 0xcf, 0xfb, 0x71, 0x2a, 0xed, 0xe7, 0x18, 0x06, 0x5e, ++ 0x4f, 0xab, 0x1c, 0xa7, 0x19, 0x27, 0xd2, 0xb2, 0x8d, 0x6c, 0xeb, 0x41, ++ 0x4f, 0xbe, 0x01, 0xaf, 0xa5, 0x03, 0x1c, 0xd3, 0x8f, 0x9f, 0xb0, 0xdd, ++ 0xed, 0x79, 0x1d, 0x27, 0xd9, 0xae, 0x37, 0x1f, 0xc4, 0xcb, 0x69, 0x0f, ++ 0x65, 0xf5, 0xe3, 0x78, 0xba, 0x0f, 0x3b, 0xd2, 0x4d, 0x27, 0xaf, 0xa1, ++ 0x0d, 0x83, 0xb6, 0x17, 0xca, 0x7b, 0xef, 0x58, 0x9d, 0x7e, 0xdb, 0x55, ++ 0x38, 0xce, 0xd2, 0xb8, 0x7d, 0x18, 0x4c, 0xbf, 0x52, 0x8a, 0x1f, 0x03, ++ 0x0f, 0x8d, 0x2e, 0x5a, 0x3f, 0x5e, 0xd5, 0x80, 0xa3, 0x19, 0xe0, 0xd8, ++ 0x34, 0x30, 0x9d, 0x31, 0xad, 0xaa, 0x84, 0x65, 0x4d, 0xb5, 0x36, 0xd3, ++ 0x5e, 0x7a, 0xf7, 0x16, 0xb6, 0x7a, 0xac, 0xe0, 0x04, 0x1e, 0xd1, 0xba, ++ 0xe7, 0xe1, 0x40, 0x76, 0xd6, 0x89, 0xf2, 0x61, 0xad, 0x23, 0x0b, 0xed, ++ 0xe4, 0x6d, 0x8c, 0xb0, 0xc3, 0x19, 0xad, 0xcb, 0xc4, 0x80, 0x15, 0x48, ++ 0x34, 0x06, 0x9b, 0x15, 0x0b, 0x5e, 0xfa, 0x42, 0xba, 0xd9, 0xb2, 0xaa, ++ 0xd7, 0x59, 0xd6, 0x6b, 0xad, 0xb0, 0x1c, 0x09, 0xfd, 0x64, 0x01, 0xfa, ++ 0xfc, 0xc7, 0xd0, 0xfb, 0x8f, 0x63, 0xfe, 0x2b, 0x1e, 0x84, 0x7b, 0x43, ++ 0x4a, 0xb8, 0x6f, 0x91, 0xef, 0x56, 0xe5, 0xe9, 0xce, 0xd4, 0x45, 0x1f, ++ 0x06, 0xf2, 0x05, 0x15, 0x4e, 0xea, 0xd3, 0x3c, 0x6c, 0x59, 0x4e, 0xdd, ++ 0x03, 0x0f, 0xed, 0x7b, 0xdd, 0x7e, 0xcb, 0x7a, 0xcf, 0xf0, 0xa1, 0x9c, ++ 0x73, 0x73, 0xed, 0x98, 0x85, 0x29, 0xe3, 0x38, 0xed, 0x29, 0x90, 0xea, ++ 0x8a, 0xf1, 0x1d, 0x3f, 0xdb, 0xc7, 0x71, 0xdd, 0x70, 0x00, 0x8f, 0x66, ++ 0x54, 0xfc, 0x78, 0x55, 0x04, 0x95, 0xec, 0xcb, 0x4d, 0x5b, 0x55, 0xd0, ++ 0x7e, 0xc8, 0xd3, 0xdd, 0xf2, 0x45, 0x7f, 0x44, 0x7e, 0x81, 0x3a, 0x06, ++ 0xf0, 0x64, 0xc1, 0x8f, 0x27, 0x0a, 0x3e, 0x3c, 0x5e, 0x68, 0xc0, 0xf3, ++ 0x05, 0x03, 0x0f, 0x8f, 0x6a, 0x7b, 0xe6, 0x61, 0xa1, 0x2a, 0x31, 0x80, ++ 0xea, 0x35, 0xc0, 0xa9, 0x6c, 0x14, 0x23, 0xa3, 0x96, 0x95, 0xa3, 0xdc, ++ 0x6e, 0xea, 0xf1, 0x7a, 0xf6, 0xab, 0x38, 0x32, 0xe9, 0x44, 0x70, 0xca, ++ 0x8f, 0xc7, 0xd2, 0x4e, 0x5c, 0x3a, 0xa2, 0x99, 0x59, 0xe8, 0x91, 0xed, ++ 0x42, 0x4f, 0x5e, 0x26, 0xb4, 0x51, 0x13, 0xe1, 0x60, 0x99, 0x70, 0xa0, ++ 0xf1, 0x88, 0x13, 0xfa, 0x5c, 0x10, 0x65, 0x8d, 0x2a, 0xf4, 0xc6, 0xef, ++ 0x02, 0x5e, 0x07, 0xca, 0x75, 0x03, 0xd7, 0x8d, 0x47, 0x78, 0xcf, 0xcf, ++ 0x7b, 0xf8, 0x6a, 0x05, 0x94, 0xe5, 0x0a, 0x68, 0x3b, 0x5d, 0x41, 0xd2, ++ 0x69, 0x59, 0x8a, 0xde, 0x82, 0x9b, 0xbe, 0x6f, 0x59, 0xa1, 0x35, 0xb2, ++ 0xbd, 0x0f, 0xa1, 0x39, 0xda, 0xa1, 0x91, 0x72, 0x65, 0x28, 0x67, 0x86, ++ 0x72, 0x66, 0x28, 0x67, 0x46, 0xa1, 0xdf, 0x68, 0x86, 0x9c, 0x3f, 0xb8, ++ 0x83, 0xd4, 0xf1, 0x2d, 0x7b, 0xae, 0x9e, 0x28, 0x04, 0xa8, 0x43, 0xd0, ++ 0xd6, 0xe1, 0xd8, 0xa8, 0x80, 0x43, 0xd7, 0xba, 0x16, 0xb0, 0x1e, 0xa1, ++ 0xa8, 0x96, 0xcc, 0x22, 0xc9, 0xf7, 0xb4, 0x3d, 0x26, 0xb4, 0x8e, 0x79, ++ 0xfa, 0xc0, 0x16, 0x5f, 0x1c, 0xb3, 0x99, 0x32, 0x54, 0xea, 0x5a, 0x90, ++ 0x73, 0x16, 0x99, 0xc7, 0x32, 0xdc, 0xe1, 0x63, 0x9f, 0x0e, 0x8f, 0x28, ++ 0x62, 0xc9, 0x03, 0x08, 0x8f, 0x3b, 0x30, 0x63, 0x28, 0x8c, 0x51, 0x03, ++ 0x4a, 0x23, 0x87, 0x9b, 0x8b, 0xf1, 0xca, 0xfe, 0x33, 0x1c, 0x8b, 0xf2, ++ 0xb0, 0x3f, 0xc6, 0xa6, 0xb4, 0x65, 0x84, 0x32, 0xec, 0xb3, 0xe5, 0x7d, ++ 0xbc, 0xf0, 0x1f, 0x44, 0xd1, 0x87, 0x12, 0xf4, 0x19, 0x2d, 0x08, 0xa1, ++ 0x45, 0x82, 0x42, 0x33, 0x92, 0xc2, 0x87, 0xe9, 0xc2, 0x9b, 0x6c, 0xe3, ++ 0xbf, 0xa8, 0x8d, 0xc4, 0x2a, 0x9f, 0x77, 0x3a, 0xdd, 0x81, 0xa1, 0x4c, ++ 0x10, 0x3b, 0x72, 0x01, 0xef, 0x54, 0x5a, 0xf6, 0xa7, 0x33, 0xb6, 0xe5, ++ 0x33, 0xff, 0x45, 0xcf, 0x1a, 0x2e, 0x7a, 0xe6, 0xc1, 0xe0, 0xc4, 0xef, ++ 0x13, 0x2f, 0xaa, 0xb1, 0x43, 0x3f, 0x47, 0xbf, 0xd0, 0xe3, 0x3d, 0xa8, ++ 0xc7, 0x82, 0xcf, 0x87, 0x7d, 0x07, 0xbc, 0x18, 0x3a, 0x50, 0x85, 0x87, ++ 0x26, 0x1a, 0x52, 0xee, 0xc4, 0x08, 0xc7, 0x09, 0x25, 0x7b, 0x84, 0xd6, ++ 0xa7, 0x88, 0x50, 0xa4, 0x87, 0x7e, 0xda, 0x58, 0x63, 0x59, 0xc7, 0xa3, ++ 0xf4, 0x63, 0xa3, 0xc9, 0xb8, 0x8e, 0x8a, 0xce, 0x77, 0x69, 0x1d, 0xef, ++ 0xc0, 0x83, 0x3f, 0xa4, 0x7f, 0x4d, 0x47, 0xd1, 0xa3, 0x40, 0x69, 0xf6, ++ 0xe0, 0x9f, 0xac, 0x47, 0x9c, 0xd2, 0xbe, 0xd6, 0xc0, 0x2d, 0xc6, 0x2e, ++ 0x21, 0x31, 0xad, 0xfc, 0x02, 0x6e, 0xc8, 0xfe, 0xe5, 0x3b, 0x9c, 0x23, ++ 0xf6, 0xd3, 0x1b, 0x6d, 0x8a, 0xf7, 0x62, 0xd1, 0x5a, 0xd8, 0xec, 0xc5, ++ 0x8e, 0xd9, 0x2a, 0xec, 0x9d, 0x28, 0x43, 0xb2, 0x46, 0xa0, 0x5a, 0x0f, ++ 0xcd, 0xdf, 0x41, 0x3c, 0x36, 0xa7, 0xe5, 0x7b, 0x5e, 0x3c, 0x3c, 0x5b, ++ 0xfc, 0x9e, 0xb9, 0xf0, 0x7d, 0xa9, 0xbf, 0x33, 0x9c, 0x3b, 0x69, 0x37, ++ 0x89, 0x89, 0x34, 0x75, 0xa2, 0x09, 0x47, 0x27, 0xfc, 0x9c, 0xc3, 0x76, ++ 0xe1, 0x3c, 0xb2, 0xdc, 0xeb, 0xfe, 0xbe, 0x85, 0x97, 0x0c, 0xce, 0x67, ++ 0x66, 0xa3, 0x70, 0x1f, 0xe9, 0x10, 0x65, 0x73, 0x37, 0x8a, 0xf2, 0xa9, ++ 0x6f, 0x09, 0xf5, 0x48, 0x4a, 0x54, 0xcc, 0x35, 0xd3, 0xc6, 0xdd, 0xc2, ++ 0x75, 0x44, 0x0b, 0x06, 0xc5, 0x5f, 0x70, 0xde, 0x36, 0x0b, 0x65, 0x0e, ++ 0x3e, 0x47, 0xa2, 0x5f, 0x38, 0xe6, 0xd8, 0x87, 0xed, 0x2b, 0x72, 0x9c, ++ 0x00, 0xe7, 0x07, 0xa6, 0x92, 0xe8, 0xc3, 0x16, 0xe2, 0xfc, 0xa6, 0x34, ++ 0xb0, 0x3b, 0x53, 0x41, 0x2c, 0x94, 0x31, 0xbe, 0xc8, 0x71, 0xe3, 0x78, ++ 0x88, 0x9c, 0xa0, 0x26, 0xf6, 0xc2, 0xcb, 0xd8, 0x7a, 0x2d, 0x2a, 0xe3, ++ 0x0e, 0xc8, 0x65, 0x42, 0xdd, 0xbb, 0x85, 0x65, 0x6d, 0x0b, 0x5b, 0x2b, ++ 0x36, 0x46, 0x9b, 0x22, 0x27, 0xf0, 0x2b, 0x2b, 0xeb, 0xef, 0x43, 0x55, ++ 0x2b, 0x9f, 0x0d, 0x43, 0x2d, 0x4b, 0x0c, 0xe1, 0x30, 0x39, 0xc3, 0x9d, ++ 0x20, 0x8e, 0x0c, 0x87, 0xba, 0x1f, 0x12, 0x12, 0xdb, 0xb5, 0xf9, 0xc7, ++ 0x30, 0x78, 0xb2, 0x02, 0x5a, 0x70, 0x83, 0x68, 0x32, 0x2a, 0x15, 0x33, ++ 0x5e, 0x4f, 0x2a, 0x73, 0xb5, 0x6a, 0xfd, 0xbb, 0xa0, 0xf9, 0xce, 0x42, ++ 0xc6, 0xa4, 0xe4, 0x8d, 0x21, 0xc4, 0x6d, 0xfe, 0x30, 0x71, 0xc5, 0x05, ++ 0xfe, 0x20, 0xa6, 0x53, 0xae, 0x5d, 0x94, 0xeb, 0x45, 0x43, 0x0b, 0x4c, ++ 0xc1, 0x5a, 0xd1, 0x63, 0x14, 0x9f, 0x0d, 0x15, 0x3a, 0xc8, 0x29, 0x49, ++ 0xec, 0xcd, 0x3c, 0x6e, 0x49, 0x5d, 0x9c, 0x89, 0x76, 0xfc, 0xa8, 0x10, ++ 0xc7, 0xd3, 0x85, 0x66, 0xfa, 0x7d, 0x07, 0xed, 0x95, 0xc4, 0x0f, 0x0b, ++ 0x09, 0x3c, 0x53, 0x88, 0xe1, 0x29, 0xfa, 0xff, 0x93, 0x85, 0x08, 0x6d, ++ 0xea, 0x14, 0xbb, 0xd3, 0x3a, 0x8e, 0x11, 0x4f, 0xf7, 0xe6, 0x82, 0x38, ++ 0x9a, 0x0e, 0xed, 0x39, 0x0b, 0xed, 0x59, 0x12, 0xaf, 0x77, 0x4f, 0x4e, ++ 0xc7, 0x91, 0xb4, 0x96, 0x05, 0x02, 0xde, 0x5d, 0x39, 0x9f, 0x77, 0x30, ++ 0xed, 0xf7, 0x0e, 0xd2, 0xff, 0x76, 0xa4, 0x1b, 0xbc, 0x3b, 0x72, 0xff, ++ 0x8a, 0x60, 0x2d, 0xcc, 0xe5, 0x09, 0x15, 0x77, 0x4c, 0xfc, 0x03, 0x52, ++ 0x35, 0x52, 0x32, 0x1f, 0xee, 0x3a, 0x20, 0x6d, 0xd3, 0x94, 0xba, 0xdc, ++ 0xf1, 0x11, 0xcc, 0xba, 0xe2, 0xbd, 0x3e, 0xde, 0xab, 0x6e, 0x81, 0xf7, ++ 0xd4, 0x9c, 0xf4, 0x57, 0xe0, 0x29, 0xfa, 0xe8, 0x77, 0x5a, 0x7e, 0x6d, ++ 0x25, 0x6b, 0x6d, 0x4c, 0xf7, 0x3e, 0x33, 0xe9, 0xf4, 0xce, 0x92, 0xb3, ++ 0x0e, 0xb7, 0x08, 0x3c, 0x6d, 0xfc, 0x2f, 0x98, 0xb5, 0x4b, 0x3c, 0x9d, ++ 0xcc, 0x3e, 0x67, 0x24, 0x11, 0xd0, 0x2f, 0x11, 0xf1, 0x65, 0xc8, 0x3e, ++ 0x6d, 0xfc, 0x5d, 0xe9, 0x99, 0x8a, 0x7b, 0x27, 0x54, 0xa4, 0x6a, 0x8b, ++ 0xfd, 0xdf, 0xce, 0xfe, 0x57, 0x46, 0x9b, 0x82, 0x6f, 0x43, 0xc6, 0x61, ++ 0x12, 0x47, 0x8c, 0x37, 0x4b, 0x5c, 0xd8, 0x8e, 0x9d, 0xb3, 0x09, 0x72, ++ 0xb9, 0x8a, 0x6d, 0x13, 0x5a, 0x3c, 0xe8, 0x08, 0xd2, 0x0e, 0xff, 0x80, ++ 0x64, 0x5d, 0x10, 0x4f, 0xaf, 0xf2, 0x20, 0x55, 0xe0, 0xf3, 0x03, 0x48, ++ 0x3e, 0x41, 0x5e, 0x0d, 0x2e, 0x5f, 0x0e, 0x85, 0x3c, 0xa3, 0xe8, 0x15, ++ 0xc9, 0x3a, 0xdd, 0x8d, 0x5b, 0xa6, 0xfd, 0xf8, 0xb3, 0xc2, 0x46, 0x8c, ++ 0xd2, 0xcf, 0xee, 0xce, 0x08, 0xd4, 0xb7, 0x24, 0x8f, 0xd7, 0x23, 0x9c, ++ 0x5c, 0x14, 0x7e, 0xf4, 0xf2, 0xbd, 0xdd, 0x07, 0xfc, 0xb8, 0x85, 0xbe, ++ 0xf3, 0x89, 0x11, 0xee, 0xbd, 0x8b, 0x58, 0x71, 0x27, 0xef, 0xa5, 0x0f, ++ 0xa8, 0xd8, 0x17, 0xdd, 0x2a, 0x8a, 0xb6, 0xf0, 0x63, 0x6b, 0x06, 0xbe, ++ 0xca, 0x04, 0x4c, 0x77, 0x22, 0xbc, 0xe7, 0x31, 0x7e, 0xbf, 0xa7, 0xe0, ++ 0xf6, 0x6e, 0xdc, 0x8f, 0x07, 0x5d, 0x09, 0x2f, 0x96, 0x91, 0x6f, 0x8f, ++ 0x1b, 0xe1, 0xe0, 0x26, 0xe2, 0x5a, 0x4f, 0xc1, 0x81, 0x7b, 0xa7, 0xdd, ++ 0x18, 0x98, 0xf8, 0xcc, 0x2a, 0x8f, 0x39, 0xf1, 0x8f, 0xab, 0xdc, 0xf8, ++ 0xce, 0x74, 0x3b, 0x86, 0x0f, 0x20, 0x98, 0x8b, 0xfe, 0x89, 0x30, 0x6b, ++ 0x8a, 0x38, 0x50, 0x91, 0x90, 0xf7, 0x3c, 0xde, 0x8f, 0x26, 0xdb, 0x31, ++ 0x76, 0x60, 0x43, 0x37, 0x2d, 0x34, 0xbf, 0x33, 0xaa, 0x60, 0x5b, 0x54, ++ 0x59, 0xc6, 0x14, 0xc5, 0x77, 0x69, 0x4b, 0xf8, 0xe1, 0x0d, 0x42, 0x59, ++ 0xe9, 0x42, 0x78, 0xb1, 0xc7, 0x31, 0x3f, 0xba, 0x02, 0xb5, 0xf8, 0xce, ++ 0x6c, 0x3b, 0xf6, 0x1f, 0x70, 0xe3, 0xfe, 0x89, 0xc1, 0x07, 0xeb, 0x88, ++ 0x37, 0x81, 0x16, 0x8d, 0x9c, 0x9c, 0xc0, 0x99, 0xb0, 0x0b, 0xbd, 0xd3, ++ 0x1e, 0xef, 0x27, 0x93, 0xd6, 0xfa, 0x17, 0xc8, 0xc3, 0xb7, 0xcc, 0xd6, ++ 0xe2, 0x96, 0x03, 0x2e, 0xdc, 0x36, 0xa1, 0xf5, 0x9d, 0x26, 0x06, 0xbc, ++ 0x16, 0xae, 0x40, 0x2e, 0x1a, 0xea, 0xf6, 0x90, 0x13, 0xb7, 0x46, 0x2b, ++ 0xb1, 0x75, 0xda, 0x85, 0x7b, 0x26, 0x6a, 0xd1, 0x73, 0xc0, 0x87, 0x6d, ++ 0x07, 0x2c, 0xac, 0x6c, 0x49, 0x60, 0x2c, 0xd3, 0x8e, 0x43, 0x8c, 0xf3, ++ 0x76, 0x68, 0x0f, 0x4b, 0x4c, 0xbf, 0xd5, 0x91, 0xc4, 0x3f, 0xaf, 0x29, ++ 0x43, 0xb6, 0xd6, 0xb2, 0x36, 0xb6, 0x34, 0x25, 0x7f, 0x46, 0x99, 0x6b, ++ 0x13, 0xcc, 0x07, 0x6b, 0xb4, 0x87, 0x99, 0x1b, 0xf5, 0x37, 0x3a, 0xd6, ++ 0x8a, 0x05, 0xda, 0x7e, 0x96, 0x79, 0x4f, 0x80, 0xb8, 0xe5, 0xcb, 0x14, ++ 0xb1, 0xcd, 0x57, 0x68, 0xf0, 0xd6, 0x67, 0x02, 0xde, 0xfa, 0x02, 0xbc, ++ 0xe5, 0x8c, 0xa9, 0x27, 0xe9, 0x1f, 0xdf, 0xa4, 0x7f, 0x64, 0x4b, 0xfe, ++ 0xf1, 0xfc, 0xa4, 0xe4, 0x1a, 0x6d, 0x54, 0xce, 0xe7, 0xa1, 0x59, 0xa7, ++ 0xf7, 0x08, 0xf9, 0x7d, 0x99, 0x9e, 0xc0, 0xae, 0x42, 0x71, 0xee, 0x5b, ++ 0x19, 0x8b, 0xe9, 0x91, 0x50, 0x70, 0x4c, 0x04, 0x84, 0xc9, 0x79, 0x1f, ++ 0x9a, 0x53, 0xa9, 0xc7, 0x5b, 0x58, 0xb0, 0xf9, 0xfb, 0x65, 0x21, 0x31, ++ 0xd7, 0xa9, 0x77, 0x62, 0x24, 0x83, 0x16, 0x25, 0xa1, 0x45, 0x92, 0xe4, ++ 0xad, 0x97, 0xa2, 0x48, 0x94, 0x23, 0x9c, 0x3a, 0x4d, 0x4e, 0x7c, 0x2d, ++ 0xdc, 0x89, 0x61, 0x8e, 0xdb, 0x99, 0x73, 0x61, 0x8b, 0xad, 0xa3, 0x9c, ++ 0x0b, 0xe6, 0x2a, 0xcc, 0xbf, 0xf6, 0x19, 0x5a, 0xc7, 0xf5, 0x02, 0xaf, ++ 0xba, 0xf8, 0xce, 0xb9, 0x35, 0xe1, 0x79, 0x83, 0xf9, 0xcc, 0xb3, 0xb9, ++ 0x4e, 0x64, 0xa8, 0xfb, 0x1e, 0xce, 0x8f, 0x12, 0x55, 0x44, 0xca, 0xa7, ++ 0xa2, 0x90, 0xab, 0xc5, 0xdd, 0x94, 0xe5, 0x4c, 0x54, 0x88, 0x64, 0xb9, ++ 0x07, 0x47, 0x73, 0xed, 0x18, 0xa5, 0x3f, 0x94, 0xb5, 0x90, 0xf7, 0xfd, ++ 0xe5, 0x88, 0x34, 0x3a, 0xf8, 0x27, 0x63, 0xd2, 0xef, 0xdd, 0x37, 0xd9, ++ 0xe0, 0xdd, 0x49, 0x4e, 0xbc, 0x2d, 0xe3, 0xa0, 0x5f, 0x5a, 0x56, 0x4f, ++ 0xd4, 0xc2, 0x26, 0xce, 0xc1, 0x31, 0x72, 0xec, 0x00, 0x39, 0xe3, 0x68, ++ 0x41, 0x62, 0x5b, 0xbe, 0xc4, 0x31, 0x52, 0xf6, 0x73, 0xa5, 0xcf, 0xc0, ++ 0xf8, 0x08, 0xb1, 0x73, 0x79, 0xd1, 0xbf, 0xee, 0xcf, 0x3c, 0x6f, 0x95, ++ 0xe9, 0x7a, 0x36, 0xac, 0xf8, 0x71, 0x5f, 0xc1, 0x83, 0xdb, 0x33, 0xda, ++ 0x62, 0xab, 0xf0, 0x60, 0x80, 0xfe, 0xfe, 0x67, 0x8c, 0x8f, 0xac, 0xdd, ++ 0xae, 0xbc, 0x14, 0x27, 0x7e, 0xdc, 0x91, 0xb1, 0x3e, 0xf5, 0x24, 0x7e, ++ 0x63, 0x0d, 0xb5, 0xea, 0x5d, 0x3d, 0xf4, 0xe3, 0x6d, 0x6c, 0x77, 0xef, ++ 0xb4, 0x9c, 0x8f, 0xab, 0x14, 0xb8, 0x89, 0x8f, 0x0e, 0x78, 0x7f, 0x36, ++ 0xc7, 0xff, 0xdd, 0x72, 0x5e, 0x34, 0x6b, 0xc1, 0x2f, 0xe3, 0xef, 0x5e, ++ 0x8e, 0x2d, 0x31, 0x40, 0x60, 0x6c, 0x75, 0xf8, 0xf1, 0x75, 0x8e, 0x4b, ++ 0x30, 0x5f, 0x4b, 0x2c, 0xc9, 0xd8, 0xf9, 0x6b, 0xf5, 0x25, 0xfa, 0x6b, ++ 0xf8, 0x91, 0x4f, 0xea, 0xd5, 0x2f, 0x0e, 0xca, 0x5c, 0xb9, 0x02, 0xd5, ++ 0x75, 0xfa, 0x87, 0x78, 0xa6, 0xab, 0xa8, 0xeb, 0x43, 0xe9, 0xa4, 0xa3, ++ 0x4c, 0x87, 0xcf, 0x9f, 0x68, 0x17, 0x0f, 0x91, 0x9f, 0x0e, 0xa5, 0x3b, ++ 0xc4, 0xa1, 0xdc, 0x8d, 0xc2, 0xcc, 0x7e, 0x4b, 0x98, 0x33, 0x29, 0x61, ++ 0xe6, 0xba, 0x79, 0xdd, 0x2c, 0x76, 0xe6, 0xfa, 0xc5, 0x64, 0x4e, 0xf6, ++ 0x4b, 0xcc, 0x62, 0xdf, 0x3f, 0xcc, 0x10, 0xa7, 0x32, 0xc4, 0xae, 0x0c, ++ 0xb1, 0x2a, 0x43, 0xac, 0xca, 0x10, 0xc3, 0x32, 0x91, 0x12, 0x56, 0x77, ++ 0x11, 0x1f, 0x8b, 0xfe, 0x37, 0x71, 0x40, 0xfa, 0x98, 0x76, 0x34, 0x48, ++ 0xdf, 0xdb, 0xd6, 0xf2, 0x9f, 0xac, 0x64, 0x9d, 0xf4, 0x35, 0x1f, 0xee, ++ 0x38, 0x90, 0xa0, 0x7c, 0xcc, 0x4f, 0xa3, 0x53, 0xb8, 0xd6, 0x47, 0x8e, ++ 0x85, 0x96, 0x35, 0xf1, 0xae, 0xcc, 0xa5, 0xf7, 0x2c, 0xe0, 0xcd, 0xdf, ++ 0x04, 0x6d, 0xdb, 0x54, 0x2b, 0x92, 0xb7, 0xc6, 0x56, 0x4b, 0xdc, 0xef, ++ 0x17, 0x03, 0x94, 0x7f, 0xa1, 0x02, 0xaa, 0x53, 0xe6, 0xc6, 0x99, 0x7e, ++ 0xd1, 0x93, 0x93, 0xf7, 0xf7, 0x62, 0x3b, 0x73, 0xd5, 0x7d, 0xd1, 0x50, ++ 0xd7, 0xad, 0xc4, 0xf9, 0x4d, 0xc4, 0xf9, 0x48, 0x54, 0x85, 0xe3, 0xf2, ++ 0xf3, 0x56, 0xd2, 0xf6, 0x2f, 0xdb, 0xaf, 0x92, 0x77, 0xc7, 0x64, 0x3d, ++ 0xa1, 0x65, 0x17, 0xd8, 0x69, 0x95, 0x2e, 0xf0, 0x32, 0x7d, 0x6a, 0x77, ++ 0x41, 0x33, 0x4e, 0x21, 0xb4, 0x27, 0xe6, 0x90, 0xbc, 0x61, 0xe1, 0xbf, ++ 0x45, 0xcb, 0x70, 0x27, 0xf3, 0xd9, 0x0a, 0x7d, 0x23, 0x26, 0x26, 0x04, ++ 0x31, 0x30, 0x39, 0x58, 0x4b, 0xbb, 0x56, 0xac, 0x85, 0x9f, 0x50, 0x29, ++ 0x5c, 0x09, 0x89, 0x07, 0xc0, 0x09, 0xfa, 0xd7, 0xa1, 0xcc, 0x5a, 0x3c, ++ 0x47, 0x5c, 0x7f, 0xd6, 0x70, 0xe2, 0x97, 0x39, 0xba, 0xfe, 0xb2, 0xf0, ++ 0xc3, 0xe7, 0xe1, 0xf6, 0x56, 0xec, 0x87, 0x1c, 0xef, 0x41, 0x85, 0x79, ++ 0xe6, 0xc7, 0x7c, 0xfe, 0xd3, 0x70, 0x38, 0x32, 0x2d, 0xe0, 0xf3, 0x24, ++ 0xac, 0x15, 0xdb, 0xa2, 0xe5, 0x18, 0x6f, 0xf4, 0x92, 0x87, 0x53, 0xa2, ++ 0x2c, 0x1f, 0x7e, 0x78, 0xbb, 0xe3, 0x5b, 0xa2, 0xfc, 0x30, 0xb0, 0xb7, ++ 0xd0, 0x2d, 0x6a, 0x0f, 0xab, 0xc4, 0x38, 0xc9, 0x9d, 0x49, 0x1c, 0xe4, ++ 0xbc, 0x05, 0x74, 0x07, 0xe2, 0x4c, 0x31, 0x2e, 0x61, 0x1d, 0x72, 0xef, ++ 0xda, 0xed, 0xd2, 0xbf, 0xf8, 0xcc, 0xef, 0x5d, 0x31, 0xa2, 0x05, 0x93, ++ 0x8e, 0x76, 0xb1, 0x62, 0xae, 0xc1, 0x5b, 0x3b, 0xd2, 0x21, 0x6a, 0xc9, ++ 0xa5, 0x75, 0x53, 0x9b, 0xc5, 0xb2, 0x39, 0xc9, 0x9d, 0xf0, 0xd5, 0xd1, ++ 0x4e, 0x75, 0x73, 0x57, 0x2b, 0xc5, 0xdc, 0xc4, 0x85, 0xfe, 0x09, 0x89, ++ 0x1b, 0x95, 0xe8, 0x65, 0xbc, 0x54, 0xaf, 0xd1, 0xe2, 0xa7, 0x85, 0x05, ++ 0x47, 0x54, 0xeb, 0x7b, 0x9b, 0x0d, 0xde, 0x08, 0x5b, 0x96, 0xaf, 0x45, ++ 0xc6, 0x1f, 0xed, 0xef, 0xe8, 0xa4, 0x4d, 0x71, 0x75, 0x7d, 0x42, 0xe2, ++ 0x18, 0x63, 0x4e, 0x97, 0x31, 0xe7, 0xc2, 0x76, 0x3b, 0xde, 0x24, 0x7f, ++ 0x5b, 0xd8, 0x1b, 0xbd, 0x10, 0x6f, 0xcd, 0xe5, 0xc4, 0xa0, 0xf5, 0xe1, ++ 0xf0, 0xfc, 0xf3, 0x90, 0x35, 0x04, 0x70, 0x03, 0xf3, 0x99, 0xde, 0x8c, ++ 0x9f, 0x78, 0x15, 0x0e, 0xd4, 0x0a, 0x27, 0xae, 0xa1, 0x2f, 0xbd, 0x5b, ++ 0x8a, 0xa1, 0x3b, 0x19, 0x43, 0x27, 0x18, 0x43, 0x39, 0xc6, 0x50, 0x8e, ++ 0xb1, 0xb3, 0x85, 0x31, 0xf4, 0x84, 0x1d, 0x3f, 0x7e, 0x4c, 0x15, 0x3e, ++ 0x76, 0x48, 0xdf, 0x86, 0x83, 0xf5, 0x05, 0x71, 0x36, 0x75, 0x01, 0x57, ++ 0x1f, 0xfb, 0x8d, 0x59, 0x27, 0xf3, 0x97, 0x5a, 0xa4, 0x66, 0x65, 0xac, ++ 0xba, 0xa9, 0x8b, 0x9c, 0x6f, 0xac, 0xa8, 0x6f, 0xd9, 0x71, 0x7f, 0x3d, ++ 0x34, 0x62, 0x7d, 0x04, 0x15, 0xc4, 0xc9, 0xdb, 0x88, 0x93, 0x77, 0x4d, ++ 0xee, 0x62, 0x3f, 0xe4, 0xb7, 0x59, 0x3f, 0xee, 0xa2, 0x7f, 0xbe, 0xd6, ++ 0xba, 0xdd, 0xee, 0xff, 0xce, 0xc2, 0x73, 0x8e, 0xa2, 0x2d, 0x8a, 0x31, ++ 0xc4, 0x69, 0xb4, 0xae, 0x66, 0xfc, 0x67, 0x29, 0xef, 0xb3, 0x69, 0x98, ++ 0xf5, 0x89, 0xf0, 0x68, 0xbd, 0xf2, 0xb7, 0x6c, 0xe3, 0xc1, 0x93, 0x39, ++ 0x89, 0x61, 0xcf, 0x38, 0xa4, 0xcf, 0x2d, 0xd3, 0xcb, 0x24, 0x97, 0x99, ++ 0x55, 0x09, 0xd5, 0x7b, 0x64, 0x7f, 0x12, 0x3f, 0x37, 0x36, 0x94, 0xe2, ++ 0xb4, 0x5f, 0x8c, 0xd2, 0x0f, 0x19, 0xb6, 0x32, 0xf6, 0xbd, 0xe3, 0x93, ++ 0x28, 0xa3, 0x4c, 0xc1, 0x0a, 0xf2, 0x45, 0x77, 0x4b, 0xb8, 0x5f, 0x51, ++ 0x3a, 0x45, 0x26, 0xe7, 0xf7, 0xee, 0x49, 0xf3, 0x21, 0x63, 0x6a, 0x0f, ++ 0xed, 0x30, 0xc8, 0x98, 0x1a, 0xfc, 0x92, 0x98, 0xda, 0xcd, 0x98, 0x1a, ++ 0xc9, 0x2d, 0x97, 0x73, 0xc5, 0x58, 0x64, 0x81, 0x4b, 0x5b, 0x8d, 0x37, ++ 0x16, 0x7d, 0xa1, 0xba, 0xd1, 0x5a, 0x71, 0x26, 0xfa, 0x3d, 0x7b, 0x1e, ++ 0xf7, 0x14, 0x3a, 0xf9, 0x4e, 0x7d, 0x89, 0x5b, 0x7d, 0xde, 0xbd, 0xe9, ++ 0x76, 0xb1, 0xd7, 0xe6, 0x79, 0x98, 0x1e, 0xfa, 0xcb, 0x72, 0xbd, 0x43, ++ 0xec, 0xb0, 0x63, 0x93, 0x63, 0x3c, 0x22, 0xe3, 0x93, 0xe3, 0x1c, 0x96, ++ 0xf1, 0xc9, 0xb1, 0xf2, 0x32, 0x46, 0x39, 0xde, 0x61, 0x19, 0xa7, 0x9b, ++ 0xc5, 0xf7, 0xf3, 0x32, 0x56, 0x65, 0xfc, 0x2e, 0xc5, 0x2b, 0x7c, 0xce, ++ 0x84, 0x8c, 0x57, 0x19, 0xb7, 0xfd, 0x62, 0x28, 0x4f, 0xfc, 0x63, 0xff, ++ 0xfb, 0x28, 0xf7, 0x8e, 0xb4, 0xc7, 0x29, 0x65, 0xf3, 0x24, 0x24, 0xc6, ++ 0xc8, 0x38, 0xf4, 0x51, 0x1e, 0x89, 0x31, 0x17, 0xea, 0x74, 0xfe, 0xfb, ++ 0x03, 0x05, 0xfa, 0x99, 0x92, 0x0e, 0x32, 0x87, 0xb7, 0x82, 0x01, 0xd6, ++ 0xe5, 0x4f, 0x17, 0x90, 0xaa, 0xa0, 0x2f, 0xb9, 0x12, 0x3e, 0xd4, 0xeb, ++ 0xbf, 0xb6, 0xfc, 0xeb, 0x54, 0xe3, 0x3c, 0xf3, 0x95, 0xe7, 0x59, 0x9f, ++ 0x3c, 0x55, 0xb8, 0xb8, 0x5e, 0x81, 0x37, 0x96, 0xc7, 0x97, 0xfc, 0xb3, ++ 0xb0, 0x2c, 0xf1, 0x6b, 0xeb, 0x3b, 0x6b, 0xe1, 0x6d, 0xc9, 0x3b, 0x53, ++ 0xe4, 0xe9, 0xae, 0xbe, 0xe1, 0x01, 0xab, 0x86, 0x71, 0xe1, 0x4d, 0xe8, ++ 0xfd, 0x35, 0x0e, 0x4f, 0xfc, 0xa3, 0x56, 0x97, 0x78, 0xad, 0x35, 0xd0, ++ 0xf9, 0x31, 0x79, 0xc1, 0xad, 0xa3, 0x6b, 0x7b, 0x3e, 0xee, 0x3c, 0x43, ++ 0x6e, 0xba, 0x8c, 0x35, 0x63, 0x30, 0xdf, 0xd0, 0xf9, 0x2e, 0x73, 0x96, ++ 0xf2, 0xe8, 0x3d, 0x57, 0x9c, 0x88, 0x3b, 0xbe, 0x5a, 0x86, 0x6a, 0xd6, ++ 0xac, 0x4f, 0xcd, 0xef, 0xd2, 0x2b, 0x98, 0x73, 0xab, 0x18, 0x2c, 0x34, ++ 0x74, 0x9e, 0x4e, 0xaf, 0x00, 0xf3, 0x9d, 0xcf, 0xa6, 0x62, 0x7a, 0x70, ++ 0x0b, 0x8e, 0x9f, 0x77, 0x92, 0xeb, 0x0f, 0x15, 0x54, 0xf5, 0xd3, 0xb4, ++ 0xeb, 0x4f, 0xaa, 0x12, 0x38, 0xe7, 0xd3, 0xf5, 0xd4, 0x39, 0xe6, 0xfc, ++ 0x73, 0xad, 0x8d, 0x5d, 0x23, 0xa2, 0xb1, 0x7b, 0x58, 0x08, 0xf4, 0x5e, ++ 0x2e, 0xb0, 0xe9, 0xf2, 0x70, 0xdc, 0x25, 0x5c, 0x58, 0xe8, 0xf2, 0x30, ++ 0x37, 0x6e, 0x48, 0xf9, 0x99, 0x63, 0x8d, 0x8f, 0x48, 0x9f, 0xf1, 0x60, ++ 0x62, 0x1a, 0x0f, 0x7c, 0xa3, 0xc5, 0x87, 0xb1, 0x59, 0x06, 0xec, 0xac, ++ 0xcc, 0x9d, 0x3b, 0x61, 0x16, 0x14, 0xcc, 0x13, 0x8b, 0x4c, 0xda, 0xa4, ++ 0x3c, 0xd1, 0xdc, 0x3e, 0x9f, 0x0b, 0x94, 0xc9, 0x78, 0xae, 0x49, 0xfc, ++ 0x17, 0x2f, 0xbc, 0x7d, 0x30, 0xd6, 0x42, 0x5d, 0x96, 0x38, 0xf9, 0xb5, ++ 0x7b, 0x1b, 0xa1, 0xfa, 0x13, 0x1d, 0x89, 0xc9, 0x46, 0xfa, 0x21, 0x6d, ++ 0xac, 0x8e, 0x00, 0xeb, 0xd9, 0xef, 0xf9, 0xaf, 0x09, 0xc4, 0xd7, 0x10, ++ 0x10, 0x97, 0xc9, 0x5c, 0x45, 0xeb, 0x48, 0xf2, 0xd9, 0xaa, 0x61, 0xb9, ++ 0xce, 0xb1, 0xbd, 0xb4, 0xce, 0xd1, 0x2b, 0xd7, 0x39, 0x8c, 0x33, 0xac, ++ 0x81, 0xca, 0x4b, 0xeb, 0x1c, 0x47, 0x60, 0xaf, 0x73, 0x24, 0x8b, 0xeb, ++ 0x1c, 0xdb, 0x11, 0xb6, 0xf3, 0xd4, 0x5e, 0x44, 0x72, 0xc0, 0x86, 0x61, ++ 0x81, 0x6b, 0xe2, 0x02, 0x3d, 0xc6, 0xc7, 0x96, 0xe9, 0xd7, 0x92, 0xc4, ++ 0x44, 0x04, 0x46, 0x64, 0x2e, 0xbc, 0xdd, 0xce, 0x85, 0x3d, 0x6c, 0x97, ++ 0x1e, 0x0e, 0xf5, 0xab, 0x8a, 0x16, 0x2f, 0x40, 0xeb, 0x65, 0x7f, 0xdd, ++ 0x9f, 0x32, 0xde, 0x86, 0x99, 0x1b, 0x57, 0x96, 0xfa, 0x5b, 0x55, 0xea, ++ 0x6f, 0x65, 0x0e, 0x22, 0x32, 0x62, 0xb2, 0xe6, 0x73, 0x9b, 0x2b, 0x12, ++ 0x49, 0x87, 0x33, 0xac, 0x77, 0xec, 0x40, 0x10, 0x11, 0xd6, 0x7c, 0x97, ++ 0xce, 0x11, 0x81, 0x46, 0x06, 0x70, 0xd0, 0xd0, 0xba, 0xd6, 0x2b, 0x12, ++ 0x57, 0x3a, 0x88, 0x75, 0x49, 0xfa, 0xb3, 0xcc, 0xd5, 0xfb, 0xc5, 0x7b, ++ 0x8c, 0xa3, 0x79, 0x67, 0x71, 0xb6, 0x8b, 0xe3, 0xdf, 0x67, 0x8f, 0x5f, ++ 0xc5, 0x1c, 0x9f, 0xfa, 0xf4, 0xbb, 0x14, 0xad, 0x9b, 0xe3, 0xfb, 0xa4, ++ 0x3e, 0x77, 0x0b, 0xe6, 0xd2, 0x42, 0xeb, 0xd8, 0x0e, 0x1b, 0xff, 0x39, ++ 0xf6, 0x7d, 0x68, 0xb2, 0x65, 0xe8, 0xc3, 0xa5, 0x8c, 0xa3, 0x77, 0x72, ++ 0xaa, 0xb0, 0x46, 0x37, 0xe2, 0xd0, 0xf4, 0x46, 0x1c, 0x24, 0x76, 0x5f, ++ 0xb6, 0xa6, 0x9a, 0x35, 0x0c, 0xaa, 0x58, 0x6a, 0x2d, 0x96, 0x87, 0x85, ++ 0xf2, 0x72, 0x73, 0x03, 0x6b, 0xab, 0xe3, 0xf5, 0x2a, 0xce, 0x59, 0xf7, ++ 0xeb, 0x1b, 0xba, 0xea, 0x91, 0xbc, 0xda, 0x8d, 0x5f, 0x49, 0xec, 0x7b, ++ 0x6b, 0x99, 0x40, 0xd2, 0x9d, 0x90, 0x1c, 0x10, 0x17, 0xee, 0xfc, 0xa0, ++ 0xb3, 0x88, 0x17, 0x8d, 0x50, 0x6a, 0x50, 0xed, 0xd5, 0x2f, 0x83, 0xb7, ++ 0x46, 0x35, 0xcb, 0x99, 0xe3, 0xbf, 0xcc, 0xba, 0x63, 0x71, 0xb4, 0x8b, ++ 0x75, 0xab, 0xc4, 0xd2, 0x7f, 0xb2, 0xde, 0xad, 0x93, 0xef, 0xfd, 0xc0, ++ 0x55, 0xe2, 0xfe, 0x2f, 0xe9, 0xc3, 0xc9, 0xba, 0xaf, 0x69, 0xb1, 0x07, ++ 0x95, 0x58, 0xb8, 0x44, 0xc5, 0x70, 0x46, 0x4b, 0x0d, 0xb3, 0xe6, 0xda, ++ 0x17, 0x6e, 0xea, 0xb8, 0x45, 0x94, 0x23, 0x58, 0x17, 0xf2, 0xf5, 0x20, ++ 0xa9, 0x39, 0x4a, 0x72, 0x4c, 0xe2, 0xef, 0xe5, 0x7b, 0xb2, 0x9f, 0x8b, ++ 0xe2, 0x2b, 0xcf, 0xf8, 0xfa, 0x55, 0x29, 0xbf, 0xb8, 0xf0, 0x5c, 0xfd, ++ 0xfd, 0x44, 0x47, 0xdb, 0x7f, 0x5c, 0xf5, 0x65, 0xf7, 0x7b, 0xbf, 0xe4, ++ 0xfe, 0x7c, 0x8d, 0xd3, 0xae, 0x71, 0x93, 0x0e, 0xb9, 0x06, 0xe7, 0x4c, ++ 0xe4, 0xda, 0x86, 0xf4, 0xdf, 0xa3, 0x1e, 0x26, 0x6b, 0x6f, 0x89, 0xb1, ++ 0x0b, 0x76, 0xed, 0xfd, 0xfc, 0x6f, 0xc7, 0x25, 0xf9, 0xc6, 0x25, 0x2a, ++ 0xc7, 0x4d, 0xab, 0x56, 0xaf, 0xa3, 0xbf, 0x0e, 0xa0, 0x27, 0x9a, 0x24, ++ 0xa7, 0x6b, 0x5d, 0xdf, 0x80, 0x9e, 0xbc, 0x51, 0xb0, 0xa3, 0x39, 0x97, ++ 0x50, 0xc6, 0x4b, 0xcf, 0x0c, 0x93, 0xbc, 0x36, 0x4f, 0xee, 0x4c, 0x32, ++ 0x1f, 0x62, 0x80, 0xcd, 0xf9, 0x55, 0xe7, 0x5c, 0x40, 0x2d, 0x9f, 0x6b, ++ 0x50, 0x2b, 0xd8, 0xce, 0x33, 0xae, 0x2d, 0x7e, 0x03, 0x03, 0x58, 0x5c, ++ 0xe3, 0x26, 0xe6, 0x6a, 0xbe, 0x7a, 0x65, 0x00, 0x43, 0x51, 0xf9, 0x6e, ++ 0x07, 0x63, 0x11, 0xa2, 0x66, 0xc4, 0x84, 0x87, 0xbc, 0xb3, 0x93, 0x35, ++ 0xd6, 0x4a, 0x87, 0xde, 0xf1, 0x8f, 0xc2, 0xa9, 0xba, 0xe6, 0x20, 0xbc, ++ 0x23, 0x0e, 0x3c, 0xdc, 0x0a, 0x97, 0x6b, 0xad, 0xd6, 0x7b, 0x5c, 0xf4, ++ 0xe3, 0xb1, 0x68, 0xb8, 0x6b, 0xab, 0x08, 0xaa, 0x6e, 0x3e, 0x2b, 0x1b, ++ 0x81, 0x50, 0x47, 0x4c, 0x57, 0xd9, 0x5a, 0x2d, 0xe0, 0x10, 0x49, 0xf4, ++ 0xe8, 0xba, 0x31, 0x0e, 0x95, 0x63, 0x42, 0x54, 0x8c, 0x68, 0x8b, 0x6f, ++ 0x23, 0x89, 0xf3, 0xab, 0xfa, 0xd1, 0xb2, 0x26, 0xbc, 0xa7, 0xdb, 0xa1, ++ 0xab, 0x35, 0xbc, 0xef, 0x1c, 0xf1, 0xe0, 0x8a, 0xfd, 0x4b, 0x6b, 0x11, ++ 0x96, 0xf5, 0x49, 0x74, 0xfe, 0x76, 0x9a, 0x4a, 0xad, 0x9a, 0x8b, 0xa8, ++ 0x9e, 0x39, 0x0f, 0x9a, 0xf6, 0xcb, 0xf5, 0x09, 0xd6, 0x8b, 0xd1, 0x79, ++ 0xfa, 0x47, 0x33, 0x75, 0xec, 0xc2, 0x74, 0x5a, 0xd6, 0xa0, 0x09, 0x4c, ++ 0x91, 0xcf, 0xf4, 0xe1, 0x06, 0xd6, 0x5c, 0x71, 0xcc, 0xa6, 0xe5, 0x9a, ++ 0x45, 0x0f, 0x76, 0x14, 0x36, 0x53, 0xfe, 0x2e, 0xd6, 0x76, 0x37, 0x33, ++ 0xdf, 0x95, 0x36, 0x4e, 0xc9, 0xb5, 0x49, 0xd6, 0x93, 0x3f, 0x6b, 0xfb, ++ 0xfa, 0x18, 0x54, 0x57, 0xe2, 0x95, 0xb6, 0x4b, 0xf7, 0xa3, 0x86, 0x38, ++ 0x93, 0x70, 0x33, 0xa8, 0x23, 0xe1, 0x30, 0xe3, 0x34, 0x1c, 0x78, 0x91, ++ 0xf3, 0x31, 0xc8, 0x3c, 0x66, 0x87, 0x5d, 0x37, 0x3a, 0x61, 0xe6, 0x24, ++ 0x56, 0xc2, 0x15, 0x69, 0xad, 0x41, 0xc5, 0x58, 0xc4, 0x5e, 0xf7, 0x30, ++ 0x89, 0x81, 0xa7, 0x0d, 0xad, 0x37, 0x0b, 0x2d, 0x25, 0xd7, 0xa7, 0xb6, ++ 0xf8, 0xfe, 0xe7, 0xae, 0xca, 0x18, 0xd4, 0x4a, 0x5d, 0xc6, 0xd2, 0x5f, ++ 0xba, 0xdf, 0xa6, 0x3f, 0x5e, 0x33, 0xf9, 0x03, 0xf7, 0x62, 0x2c, 0xeb, ++ 0x7e, 0x2f, 0x66, 0x59, 0xf7, 0x73, 0x26, 0x6f, 0x22, 0x96, 0x56, 0x67, ++ 0x4c, 0xf7, 0x99, 0x98, 0x5c, 0xc3, 0x74, 0xe2, 0x06, 0x7e, 0x97, 0xeb, ++ 0x6e, 0x7f, 0x94, 0xaf, 0x47, 0xd9, 0x98, 0x82, 0x69, 0x63, 0x23, 0x7a, ++ 0x7c, 0x0e, 0xdc, 0x1e, 0x79, 0x86, 0xfe, 0xe7, 0x60, 0x9b, 0x51, 0x7e, ++ 0x97, 0x6b, 0x31, 0xff, 0x19, 0x5b, 0x7d, 0x33, 0xee, 0x77, 0x62, 0x52, ++ 0xe6, 0x79, 0x29, 0xb3, 0x5a, 0xa1, 0x77, 0xe1, 0xb6, 0x6f, 0xc8, 0x5a, ++ 0x00, 0xa6, 0x83, 0xb2, 0xdd, 0x14, 0xab, 0x45, 0x64, 0xa2, 0x1e, 0xab, ++ 0x27, 0x4c, 0x57, 0x77, 0x8c, 0x31, 0x10, 0x8d, 0xa0, 0x3c, 0xa3, 0x05, ++ 0x3e, 0x12, 0x66, 0x5c, 0xa1, 0x5f, 0xeb, 0xe4, 0xf8, 0x9f, 0x46, 0x35, ++ 0xdf, 0x3b, 0xc0, 0xe5, 0x95, 0x08, 0xcf, 0x1f, 0x01, 0x1e, 0x20, 0x54, ++ 0xa5, 0xd4, 0x44, 0x38, 0xa0, 0x2a, 0x56, 0xf9, 0x59, 0xd6, 0xdc, 0xd7, ++ 0xe4, 0x9d, 0xd8, 0x94, 0x6f, 0xc6, 0xea, 0x8c, 0xe4, 0xf2, 0x84, 0xab, ++ 0x3f, 0x26, 0x65, 0x33, 0xb0, 0x8a, 0x5c, 0xb4, 0x29, 0x0c, 0xd7, 0x5d, ++ 0x31, 0x0f, 0xae, 0xcb, 0xc7, 0xd0, 0xc4, 0xda, 0xed, 0x7a, 0x72, 0x97, ++ 0x9e, 0xf1, 0xa3, 0x3d, 0xdf, 0x80, 0x30, 0xe7, 0xeb, 0xda, 0x7c, 0x10, ++ 0x2b, 0x33, 0x0d, 0xd8, 0x90, 0xd7, 0xd1, 0xc8, 0xfb, 0x2b, 0xc3, 0x41, ++ 0x6c, 0xcc, 0x47, 0x10, 0xc9, 0xe8, 0xe8, 0xb0, 0xf5, 0x76, 0xe2, 0x72, ++ 0x5e, 0xaf, 0xc8, 0x7b, 0x44, 0x0f, 0x75, 0xd6, 0xf3, 0xb5, 0x78, 0x79, ++ 0x4c, 0xe2, 0xca, 0x1b, 0x6d, 0x87, 0x47, 0x7d, 0xe4, 0x04, 0x0b, 0x1f, ++ 0x1a, 0x9a, 0x41, 0x4c, 0xbc, 0x9b, 0xf4, 0xfd, 0x6a, 0x19, 0xeb, 0x8b, ++ 0xe7, 0x98, 0x33, 0xee, 0x6d, 0x2d, 0xae, 0x45, 0x5e, 0x96, 0xff, 0x5c, ++ 0xf7, 0x7a, 0xce, 0xdb, 0x95, 0x07, 0x66, 0xa4, 0x8d, 0xd5, 0xf2, 0xc4, ++ 0x5f, 0xb5, 0xbd, 0x34, 0xc9, 0x1c, 0x67, 0x52, 0xae, 0x97, 0x68, 0xf3, ++ 0x21, 0x25, 0xd4, 0x57, 0xae, 0x20, 0x51, 0x8d, 0x7f, 0xb4, 0x4e, 0x32, ++ 0xbf, 0x3b, 0x03, 0x69, 0x2b, 0x0f, 0xe5, 0xf3, 0x21, 0x49, 0xee, 0xb9, ++ 0x3e, 0xff, 0x94, 0x75, 0x5b, 0x5d, 0x00, 0x5f, 0x0f, 0xdb, 0xb6, 0x73, ++ 0xa9, 0xeb, 0x08, 0x24, 0x63, 0xf5, 0x9c, 0x57, 0xd3, 0xad, 0xac, 0xb3, ++ 0xf0, 0x49, 0x54, 0xf6, 0xff, 0x12, 0xfb, 0xbf, 0x0c, 0x77, 0x4f, 0x0e, ++ 0x76, 0x7b, 0x39, 0xcf, 0xef, 0x18, 0xdd, 0xac, 0x59, 0xb1, 0xbc, 0x12, ++ 0x68, 0x76, 0xd2, 0x96, 0x8d, 0x1c, 0xa7, 0x51, 0x09, 0x77, 0x5c, 0x8b, ++ 0x70, 0x5f, 0x5c, 0x68, 0xdd, 0xef, 0x13, 0xa3, 0x14, 0xe6, 0x9f, 0x2f, ++ 0x30, 0xf7, 0xaa, 0x94, 0x95, 0x33, 0xed, 0x78, 0x6d, 0x3e, 0x00, 0xc7, ++ 0x58, 0x39, 0xca, 0x13, 0x76, 0x5e, 0xf4, 0xba, 0x83, 0x36, 0x6f, 0x54, ++ 0x54, 0x74, 0xd3, 0xbe, 0xd5, 0xc3, 0xd2, 0xb6, 0x02, 0x67, 0x29, 0xd7, ++ 0x0d, 0xb4, 0x5f, 0xe5, 0xb0, 0x35, 0xb0, 0x3a, 0xea, 0xa7, 0x8d, 0xa5, ++ 0x5d, 0x97, 0x6c, 0xd5, 0x8d, 0x91, 0xd9, 0x25, 0x7b, 0x49, 0xdb, 0x4b, ++ 0x9b, 0xfe, 0x2e, 0x76, 0x9b, 0x71, 0x9f, 0xa5, 0x2f, 0xea, 0xfb, 0xe9, ++ 0xb7, 0xfb, 0x2f, 0xd8, 0xb0, 0x81, 0xd0, 0xfe, 0x2a, 0xe7, 0xff, 0xc1, ++ 0xfe, 0x58, 0xb8, 0xbf, 0x89, 0xed, 0xba, 0x69, 0x9f, 0x1b, 0xf2, 0x53, ++ 0x65, 0x70, 0xfb, 0xa5, 0x6d, 0x2e, 0xd8, 0xba, 0x8c, 0xb6, 0x3e, 0x3c, ++ 0xf9, 0xb9, 0x9d, 0x0f, 0xda, 0x76, 0x8e, 0x20, 0xb0, 0x5f, 0xf3, 0x4d, ++ 0x23, 0xd4, 0xbf, 0x11, 0x48, 0xd4, 0x53, 0xe5, 0x00, 0x3e, 0xb1, 0x3e, ++ 0xa1, 0xbd, 0x99, 0x8a, 0x3c, 0xf8, 0x0e, 0xfd, 0xa4, 0x9d, 0xfd, 0x5d, ++ 0x4b, 0x7b, 0x27, 0x69, 0x87, 0xeb, 0xed, 0x7e, 0x1b, 0xd8, 0xef, 0x0d, ++ 0x56, 0xca, 0x3f, 0xc3, 0x78, 0xa0, 0xdf, 0x4f, 0x5e, 0x18, 0xa3, 0xdd, ++ 0x8b, 0x70, 0xbc, 0x52, 0x48, 0xdf, 0x92, 0xed, 0x7c, 0x6c, 0x27, 0x65, ++ 0x7f, 0xa3, 0xc2, 0xa1, 0x7f, 0xd9, 0xfa, 0x69, 0x0a, 0xc4, 0xe3, 0x3d, ++ 0x26, 0x36, 0x63, 0x4f, 0xa6, 0x0b, 0xbb, 0x33, 0x2a, 0xeb, 0x2d, 0x13, ++ 0x4f, 0xc6, 0xb4, 0x48, 0x8d, 0x90, 0xb8, 0x68, 0x32, 0x3e, 0xe7, 0xa1, ++ 0xe8, 0xa1, 0xe0, 0x2c, 0x02, 0xaa, 0x63, 0x4e, 0xf2, 0x43, 0x83, 0xaa, ++ 0xcc, 0x31, 0x8e, 0x03, 0x9b, 0xb1, 0xb3, 0xe0, 0xc4, 0x8b, 0x39, 0x27, ++ 0x7e, 0x92, 0xee, 0x22, 0xcf, 0xb9, 0x10, 0xac, 0x35, 0x5d, 0xce, 0xb5, ++ 0xdf, 0x2a, 0x2f, 0x62, 0xf2, 0x2a, 0x74, 0x8e, 0xdf, 0x87, 0xca, 0x11, ++ 0x67, 0xd7, 0xa0, 0xd0, 0x8c, 0xeb, 0x29, 0xd3, 0xc6, 0x39, 0xf9, 0xbc, ++ 0x01, 0x23, 0xe9, 0x9b, 0x59, 0xb7, 0x86, 0x7a, 0x4f, 0x31, 0x7f, 0xce, ++ 0xd6, 0x37, 0xd8, 0x6b, 0x94, 0xa3, 0xbc, 0x37, 0x5a, 0xf8, 0xe2, 0xda, ++ 0xe9, 0x96, 0xd2, 0x9a, 0x69, 0x0f, 0x73, 0xf6, 0xcd, 0xac, 0x6b, 0xba, ++ 0x30, 0x58, 0x92, 0x71, 0x26, 0xd6, 0x85, 0x5d, 0xb9, 0xc4, 0x05, 0x5c, ++ 0x99, 0xca, 0x15, 0xd7, 0xcc, 0x6e, 0xa3, 0x3d, 0x4e, 0xa7, 0x2d, 0xec, ++ 0x36, 0x24, 0xfe, 0x6f, 0xc6, 0x50, 0x5a, 0xae, 0x9b, 0x59, 0x78, 0xd4, ++ 0x10, 0x12, 0x87, 0xc8, 0xa3, 0x9b, 0xc9, 0xe5, 0x16, 0x4e, 0x1a, 0x71, ++ 0x62, 0x9a, 0xc4, 0xa2, 0x7e, 0x11, 0x1e, 0xfe, 0x8d, 0x95, 0x75, 0xf6, ++ 0xa1, 0x89, 0x71, 0xbb, 0x75, 0x58, 0xc1, 0xec, 0xb4, 0xcc, 0x39, 0xee, ++ 0x93, 0x39, 0x07, 0x9e, 0xcb, 0x5c, 0xe0, 0xe9, 0xf8, 0x34, 0xac, 0x01, ++ 0x67, 0x42, 0xeb, 0x97, 0xfb, 0x0d, 0x83, 0x31, 0x2d, 0x5e, 0x61, 0xe7, ++ 0x20, 0x7a, 0xf7, 0x4a, 0x45, 0x33, 0xe6, 0x44, 0x53, 0xea, 0x53, 0xcc, ++ 0x5f, 0xa7, 0x42, 0x0b, 0xbc, 0x8a, 0x70, 0xa4, 0x57, 0xae, 0xab, 0x17, ++ 0x8a, 0xfc, 0xbd, 0xaa, 0xc4, 0xdf, 0xa1, 0x9c, 0x5b, 0xe8, 0x63, 0xac, ++ 0xc3, 0xa7, 0x2d, 0xe2, 0x8c, 0xc0, 0xcc, 0x34, 0xf0, 0x6c, 0x66, 0x00, ++ 0x37, 0xb0, 0xde, 0xb8, 0x29, 0xa6, 0xf7, 0xb2, 0xbe, 0xf8, 0x6e, 0x35, ++ 0x73, 0x8a, 0xca, 0x44, 0x38, 0x35, 0x27, 0x10, 0xdc, 0xd6, 0x6a, 0x5a, ++ 0x2a, 0x6b, 0xd6, 0xf2, 0x84, 0x5c, 0x87, 0xeb, 0x14, 0xcd, 0xf9, 0xcd, ++ 0xe2, 0xb2, 0x7c, 0xb7, 0x08, 0x1e, 0xbe, 0x51, 0x44, 0x1e, 0x29, 0xe6, ++ 0xb1, 0x8d, 0xf9, 0xcf, 0xd7, 0x0a, 0x3b, 0xa8, 0xf7, 0x5e, 0xd6, 0x2f, ++ 0xc7, 0xa8, 0xdb, 0x9e, 0x42, 0xb1, 0x16, 0xde, 0x99, 0x2e, 0xea, 0xb6, ++ 0x9b, 0xcf, 0x3f, 0x4c, 0x7f, 0x9e, 0x7b, 0xd4, 0xf3, 0x9d, 0x2b, 0x33, ++ 0xa1, 0x60, 0xaf, 0xd0, 0xfa, 0x66, 0x8a, 0xb9, 0xc7, 0xfc, 0x09, 0x41, ++ 0x4e, 0xb2, 0xf3, 0x17, 0xad, 0x77, 0x51, 0x14, 0x65, 0x5f, 0x9d, 0x83, ++ 0xf4, 0x31, 0x5b, 0xfe, 0xcb, 0x73, 0x41, 0xbc, 0x9a, 0x6e, 0xea, 0x76, ++ 0xd1, 0x6c, 0x67, 0x62, 0xed, 0xe2, 0x23, 0xe6, 0xb9, 0x3f, 0x49, 0x27, ++ 0xeb, 0x2a, 0xd1, 0x21, 0xce, 0xe6, 0xba, 0xc4, 0x07, 0xd9, 0x4e, 0x38, ++ 0xc7, 0xee, 0x14, 0xef, 0x64, 0xa5, 0x6c, 0xdd, 0x62, 0x61, 0xe6, 0x8c, ++ 0x6d, 0xfb, 0x21, 0xc3, 0x47, 0x5f, 0x7b, 0x93, 0x7e, 0x61, 0xe1, 0xb0, ++ 0x21, 0xe7, 0x91, 0xdf, 0x33, 0xc5, 0xbd, 0xaf, 0x8d, 0xb1, 0x51, 0x8b, ++ 0x79, 0x8e, 0xcf, 0x91, 0x08, 0xd8, 0x3a, 0x4e, 0xb3, 0x7e, 0x98, 0xc9, ++ 0x6e, 0x16, 0x47, 0x72, 0x45, 0xfd, 0xa6, 0x72, 0xd2, 0x6f, 0x55, 0xe6, ++ 0x1b, 0x5f, 0xe4, 0x6d, 0x13, 0xbe, 0xd6, 0x00, 0xca, 0x47, 0xa4, 0xbc, ++ 0x16, 0xc6, 0x8d, 0x70, 0xf0, 0x65, 0x04, 0xe0, 0x9c, 0x93, 0x3e, 0x6d, ++ 0xe1, 0x09, 0xa3, 0x0c, 0xca, 0xb8, 0x4a, 0xbb, 0xd0, 0x87, 0xbc, 0x65, ++ 0x70, 0x4c, 0xc9, 0x7a, 0xf2, 0x3c, 0x65, 0xd0, 0x22, 0x41, 0x87, 0xfc, ++ 0xfc, 0x45, 0x5f, 0x2b, 0x23, 0x37, 0xc8, 0xb5, 0xe3, 0xc9, 0xf2, 0xa2, ++ 0xcf, 0x49, 0xf9, 0x4c, 0xd7, 0x34, 0x71, 0xfb, 0xd6, 0x51, 0x15, 0xc7, ++ 0x0d, 0xe6, 0x59, 0x3e, 0x21, 0xdc, 0x09, 0xb7, 0xba, 0x89, 0x7e, 0xf2, ++ 0x50, 0xee, 0x3e, 0x1c, 0x25, 0x4f, 0xee, 0xe1, 0xdc, 0x56, 0x10, 0x3f, ++ 0xde, 0x27, 0x7e, 0xbc, 0xcb, 0x3a, 0x38, 0xdb, 0xa5, 0x92, 0xe3, 0x54, ++ 0xd6, 0x53, 0x26, 0x72, 0xad, 0xdd, 0xd8, 0x37, 0xac, 0x62, 0x1f, 0x6b, ++ 0xb0, 0xe2, 0x5e, 0x96, 0xe6, 0x33, 0x91, 0xa8, 0x90, 0x35, 0xd8, 0x90, ++ 0x7e, 0xc6, 0x5e, 0x1b, 0x55, 0x13, 0x52, 0x17, 0xb9, 0xce, 0x62, 0xba, ++ 0xca, 0x5b, 0x5d, 0x78, 0x79, 0x94, 0x15, 0xa7, 0xce, 0x3c, 0xa0, 0xd5, ++ 0xe6, 0x44, 0xd3, 0x24, 0x27, 0x66, 0x99, 0x5f, 0x55, 0xea, 0xf7, 0x93, ++ 0x17, 0x1d, 0xcc, 0x3b, 0x6e, 0xc6, 0xa9, 0x49, 0xa7, 0xc3, 0x2b, 0xeb, ++ 0x6e, 0xe6, 0x08, 0xf4, 0x13, 0xb8, 0xe7, 0x54, 0xbc, 0x38, 0x1a, 0xc4, ++ 0x0c, 0xc7, 0x37, 0xed, 0xf5, 0xc6, 0x3f, 0xc2, 0xf1, 0x51, 0x45, 0xac, ++ 0x48, 0x40, 0x39, 0x4f, 0x1c, 0xee, 0x36, 0xc2, 0x46, 0x3d, 0xf1, 0xb2, ++ 0x92, 0x3c, 0x59, 0x3e, 0x57, 0x83, 0x2b, 0xc7, 0x6a, 0xd1, 0x38, 0x56, ++ 0x03, 0x7d, 0xcc, 0x62, 0xbe, 0x3d, 0xd8, 0x17, 0x20, 0x2e, 0x9f, 0x62, ++ 0xee, 0x7a, 0x4a, 0x68, 0xbd, 0x9d, 0xac, 0x9b, 0xf7, 0x18, 0x96, 0xf5, ++ 0x28, 0x71, 0x49, 0xb9, 0xd2, 0x8c, 0xb8, 0xd1, 0x84, 0x94, 0x3f, 0x94, ++ 0x2c, 0x73, 0xd4, 0xb2, 0x3d, 0x4c, 0x2f, 0x6d, 0xf2, 0x37, 0x94, 0x6d, ++ 0xa7, 0xa1, 0x05, 0x18, 0x72, 0x64, 0x54, 0x6d, 0xf1, 0x7a, 0x60, 0x68, ++ 0x05, 0xac, 0x72, 0xd7, 0x5a, 0x27, 0x5c, 0x79, 0xb8, 0x7e, 0x42, 0x6e, ++ 0x6f, 0xe4, 0x18, 0x57, 0x8c, 0x0d, 0xce, 0x57, 0x42, 0x72, 0x9c, 0x85, ++ 0x8f, 0xa3, 0x1e, 0x71, 0x62, 0x58, 0x8b, 0xe4, 0x98, 0x5b, 0x3f, 0x8b, ++ 0xd0, 0x62, 0x8f, 0xc0, 0x50, 0x05, 0xb0, 0x82, 0x58, 0x7e, 0xb2, 0x8f, ++ 0xf1, 0x74, 0x76, 0xcd, 0x67, 0x94, 0x21, 0xdc, 0x77, 0xa9, 0xa2, 0x05, ++ 0xbb, 0x29, 0xc7, 0x19, 0x61, 0x76, 0x39, 0xe1, 0xc1, 0x5c, 0xde, 0xc6, ++ 0x28, 0xd3, 0x2d, 0x54, 0xce, 0x33, 0xef, 0x30, 0x97, 0xfb, 0xd0, 0x9e, ++ 0x53, 0xd6, 0xec, 0x8f, 0xd0, 0x6f, 0x1d, 0x5f, 0x5c, 0x3b, 0xaf, 0x41, ++ 0x98, 0x1c, 0x14, 0x1a, 0x93, 0x31, 0xfc, 0x52, 0x5b, 0xe0, 0x80, 0xdc, ++ 0x73, 0x1a, 0x5c, 0x74, 0x50, 0xc7, 0x3e, 0x03, 0xaf, 0xaf, 0x00, 0x3a, ++ 0x7d, 0x08, 0x1b, 0x97, 0x2a, 0xe1, 0xbe, 0xb7, 0x98, 0xcb, 0x56, 0x27, ++ 0xc2, 0xc4, 0x21, 0xa9, 0x97, 0xdc, 0xcb, 0xba, 0x58, 0x76, 0xa9, 0xa7, ++ 0x94, 0x5f, 0xca, 0x2e, 0x75, 0xf8, 0xff, 0x25, 0xff, 0x1f, 0xd1, 0x3f, ++ 0x6a, 0x39, 0xcf, 0x6f, 0xd0, 0x3f, 0x74, 0x3c, 0x53, 0x90, 0x35, 0xa6, ++ 0xac, 0x25, 0xa5, 0x9f, 0x44, 0x2e, 0x8a, 0x01, 0x10, 0x8b, 0x2b, 0xc5, ++ 0x0b, 0xa3, 0x16, 0x26, 0x18, 0xf3, 0x4f, 0x1b, 0x06, 0xeb, 0x3e, 0xed, ++ 0x28, 0x30, 0x48, 0x3f, 0xd5, 0x98, 0xf0, 0x9a, 0xae, 0x13, 0xf4, 0xdd, ++ 0x3d, 0xa3, 0xb8, 0x4a, 0x85, 0xb2, 0xba, 0x02, 0xc7, 0x90, 0x75, 0xb2, ++ 0xf2, 0xd3, 0x37, 0x13, 0xe7, 0x65, 0x3c, 0xbf, 0xd1, 0xa6, 0x67, 0x65, ++ 0xcd, 0xdb, 0x01, 0xd3, 0xc6, 0x90, 0x4a, 0x71, 0x17, 0x7d, 0xe8, 0xc5, ++ 0x68, 0x05, 0xb2, 0x3e, 0x79, 0xdf, 0xb4, 0x73, 0x96, 0xda, 0x09, 0x8c, ++ 0xd4, 0x42, 0xf9, 0x5e, 0x0d, 0xe6, 0xb0, 0x50, 0xa6, 0x12, 0xb7, 0x2a, ++ 0xc5, 0x3e, 0xda, 0x66, 0x17, 0x39, 0xf1, 0xc4, 0x68, 0x12, 0xdb, 0xa2, ++ 0x4d, 0x1d, 0x6e, 0xe6, 0x78, 0x7b, 0x0c, 0x05, 0xb2, 0x66, 0x45, 0x5d, ++ 0x68, 0xf4, 0x2c, 0xb4, 0x3d, 0x72, 0x9d, 0x58, 0x49, 0x98, 0xee, 0xfe, ++ 0x18, 0x5c, 0xdb, 0x62, 0xcd, 0xa8, 0x38, 0x50, 0x83, 0x76, 0xda, 0x75, ++ 0xd3, 0x58, 0x00, 0x65, 0x13, 0x16, 0x0e, 0x51, 0xe6, 0x08, 0x73, 0xa8, ++ 0x88, 0xc3, 0x3c, 0xe9, 0x60, 0xdc, 0x56, 0x4d, 0x68, 0xfd, 0xeb, 0x89, ++ 0xa7, 0xe7, 0xe8, 0x7f, 0x8f, 0xd3, 0xb7, 0xde, 0x10, 0xcc, 0x13, 0x66, ++ 0xa5, 0x9c, 0x2f, 0xb5, 0xad, 0x9e, 0x91, 0xd7, 0x93, 0x6d, 0xa1, 0x19, ++ 0x05, 0xd9, 0x3a, 0x37, 0xee, 0xd0, 0x65, 0xcd, 0x20, 0xaf, 0x96, 0xd5, ++ 0x17, 0x95, 0xcf, 0x5e, 0xe1, 0x33, 0x79, 0x9d, 0x6f, 0x0b, 0xda, 0xd7, ++ 0xbf, 0xe2, 0x75, 0x69, 0xbd, 0xe7, 0x9e, 0x32, 0x79, 0x4d, 0xc2, 0xfe, ++ 0x8b, 0x24, 0x1d, 0xdf, 0x93, 0xdf, 0x8d, 0xa0, 0x23, 0x52, 0x51, 0xbc, ++ 0xff, 0x6d, 0x64, 0x97, 0xcb, 0xeb, 0xb9, 0x52, 0x7b, 0xa8, 0x35, 0xb4, ++ 0x4d, 0x74, 0x5c, 0x41, 0x6b, 0xcb, 0x72, 0x64, 0x6b, 0x55, 0xd6, 0xa2, ++ 0x9b, 0x6d, 0x6e, 0xa4, 0xef, 0xe3, 0xb5, 0x56, 0x81, 0x8f, 0xf4, 0x04, ++ 0x72, 0x79, 0xc9, 0x43, 0x4e, 0xb9, 0x2f, 0x11, 0x34, 0x45, 0x68, 0xf4, ++ 0x55, 0xbe, 0x98, 0xfc, 0xbd, 0xcd, 0x48, 0x93, 0x13, 0x67, 0xd2, 0x92, ++ 0x03, 0x79, 0xcd, 0xc9, 0x75, 0x97, 0xfb, 0x10, 0xe7, 0xbb, 0xd5, 0x7c, ++ 0xf7, 0x5c, 0xab, 0x16, 0xe9, 0xa6, 0x4f, 0x94, 0xcd, 0xc9, 0x3e, 0x4d, ++ 0x6c, 0x68, 0xd5, 0x82, 0x29, 0x87, 0x16, 0x31, 0x1d, 0x77, 0x20, 0x99, ++ 0x95, 0xf8, 0x08, 0x73, 0x99, 0xe4, 0xac, 0x4c, 0x39, 0xbe, 0x1d, 0xeb, ++ 0x14, 0x3d, 0x73, 0x9d, 0xe4, 0x65, 0xb9, 0x66, 0x49, 0x3f, 0xc8, 0x08, ++ 0xb8, 0xc2, 0x9d, 0xe4, 0x59, 0x89, 0x59, 0x37, 0x8a, 0xde, 0x29, 0x89, ++ 0x5b, 0x9b, 0xc5, 0xc0, 0x9c, 0xf4, 0x9d, 0x7e, 0x71, 0xdf, 0x1c, 0x7d, ++ 0x23, 0x43, 0x5f, 0x21, 0x97, 0x3e, 0x65, 0xfb, 0x92, 0x41, 0x5f, 0x32, ++ 0x5d, 0x2f, 0x70, 0x0e, 0xef, 0x1e, 0x95, 0xbc, 0xa2, 0xdc, 0xe5, 0xc5, ++ 0x1a, 0x64, 0xcb, 0xe0, 0x3a, 0x1e, 0xfb, 0x7d, 0xdc, 0x44, 0xbc, 0x5a, ++ 0xa1, 0x17, 0xfd, 0x60, 0x7d, 0xd6, 0x41, 0x1c, 0xf8, 0x9e, 0x85, 0x65, ++ 0x52, 0xcf, 0x14, 0xf1, 0xf9, 0x01, 0xeb, 0x36, 0xbf, 0x9c, 0x3f, 0xe9, ++ 0xbb, 0xf6, 0xda, 0x37, 0x79, 0xd2, 0x44, 0x98, 0xf8, 0x34, 0x33, 0xba, ++ 0x9c, 0xbe, 0x29, 0x31, 0xa2, 0x0a, 0x15, 0x35, 0xc5, 0xb5, 0xb7, 0x23, ++ 0xa3, 0xb2, 0x96, 0x7e, 0xa3, 0x2d, 0x3d, 0xa6, 0xc2, 0xcd, 0x67, 0x27, ++ 0xc8, 0xb5, 0xfb, 0x5a, 0x8b, 0x7d, 0x37, 0x65, 0xaf, 0xc0, 0x5e, 0x9f, ++ 0x1b, 0x55, 0x7a, 0x04, 0xc3, 0x3e, 0x0f, 0xb1, 0x6d, 0x4b, 0xa9, 0xcf, ++ 0xd3, 0xf4, 0x73, 0x39, 0x5e, 0xb2, 0xa2, 0x88, 0xc9, 0x04, 0x48, 0x77, ++ 0x71, 0xac, 0x4a, 0x8e, 0xb5, 0xad, 0x75, 0x33, 0xae, 0x1b, 0xf6, 0x88, ++ 0x9f, 0xa4, 0x37, 0x5b, 0xc1, 0x1a, 0xb6, 0xa3, 0xcf, 0x97, 0x97, 0xe4, ++ 0x6d, 0xcc, 0xbe, 0x5d, 0x51, 0x5c, 0xaf, 0x51, 0x71, 0xcf, 0xa8, 0x03, ++ 0xb5, 0xa5, 0xfb, 0x2d, 0xd9, 0x20, 0x8c, 0x16, 0x66, 0x8d, 0xb5, 0x02, ++ 0x75, 0xb6, 0x9f, 0xcb, 0x31, 0x54, 0xf8, 0x18, 0x73, 0x37, 0xc5, 0xe2, ++ 0x08, 0x65, 0xe4, 0x7a, 0x9d, 0x13, 0xdf, 0x4e, 0x27, 0xb0, 0xbe, 0xf0, ++ 0x49, 0xa9, 0x8f, 0xa5, 0x76, 0x4e, 0xb6, 0x73, 0x61, 0x2a, 0xfb, 0x45, ++ 0xf9, 0xfc, 0x94, 0xf9, 0x08, 0x65, 0x93, 0xcf, 0x24, 0x66, 0x4b, 0xac, ++ 0xfe, 0xbc, 0x6e, 0x74, 0x8c, 0xcb, 0x73, 0x01, 0x45, 0x6e, 0x6b, 0x37, ++ 0x54, 0x73, 0x45, 0xc2, 0x8b, 0xc5, 0x09, 0x13, 0xa7, 0xd7, 0x55, 0xe3, ++ 0xfc, 0x44, 0x23, 0xee, 0x1a, 0x75, 0xe3, 0x2c, 0xfd, 0xfd, 0x8a, 0x35, ++ 0xb8, 0x35, 0x00, 0x6c, 0xaf, 0x86, 0xac, 0x1d, 0xc2, 0x5d, 0xc3, 0x02, ++ 0x94, 0x34, 0x1c, 0xdf, 0x28, 0x64, 0x1c, 0x20, 0x75, 0x6d, 0x2c, 0x1c, ++ 0x3c, 0x83, 0x07, 0x2d, 0x62, 0xbf, 0x4f, 0x49, 0x74, 0x0a, 0xa7, 0xbd, ++ 0x27, 0xb8, 0xd9, 0xde, 0x43, 0x74, 0x4c, 0xf5, 0x0b, 0x65, 0xee, 0x62, ++ 0x8c, 0xf8, 0x32, 0x5e, 0x95, 0x5c, 0x2a, 0x39, 0x7f, 0xdc, 0x2a, 0xd3, ++ 0x37, 0x8b, 0x5d, 0xe4, 0xd1, 0x9d, 0xd9, 0x0b, 0x5c, 0x7b, 0x81, 0x5f, ++ 0x77, 0x94, 0x78, 0x75, 0x30, 0xf7, 0xd6, 0x17, 0xf2, 0xc1, 0x60, 0x69, ++ 0xcd, 0x4a, 0xf2, 0xa9, 0x4b, 0xbc, 0x4d, 0x5c, 0xd9, 0x65, 0xc8, 0x58, ++ 0x3c, 0x1e, 0x90, 0x6b, 0xa0, 0xce, 0x16, 0x81, 0x7b, 0xe4, 0x19, 0x10, ++ 0xbf, 0x85, 0x1b, 0x8d, 0xa2, 0x3f, 0xac, 0x69, 0x2d, 0x43, 0x2f, 0x39, ++ 0xb6, 0x2c, 0xea, 0x21, 0x66, 0xf8, 0xf0, 0x8a, 0x21, 0x79, 0xd5, 0x5d, ++ 0x9a, 0x4f, 0xb9, 0xa7, 0x5d, 0xdc, 0x7f, 0x7e, 0xea, 0xb7, 0x78, 0x76, ++ 0x69, 0x0f, 0xda, 0x40, 0xb2, 0x0e, 0xee, 0x77, 0x63, 0x3a, 0x9e, 0x63, ++ 0x0d, 0xf3, 0x6c, 0xfa, 0x3a, 0xc4, 0x97, 0x69, 0x49, 0x39, 0xff, 0x32, ++ 0xce, 0x7e, 0xde, 0xda, 0x8b, 0x3b, 0xc7, 0x1d, 0xe4, 0x2c, 0xb9, 0x9e, ++ 0x6a, 0x62, 0x5f, 0x8d, 0xc4, 0xbb, 0x4e, 0x0c, 0x8c, 0xbb, 0xc4, 0x89, ++ 0x51, 0x27, 0x0e, 0x75, 0x3d, 0x80, 0x65, 0x2d, 0xb7, 0x01, 0xb6, 0x0f, ++ 0xca, 0xcf, 0xdf, 0x42, 0x4a, 0xc6, 0xb1, 0x43, 0xae, 0x2f, 0x0b, 0x78, ++ 0x5a, 0xa4, 0x1e, 0x70, 0x7f, 0xc8, 0xfe, 0xb7, 0x0e, 0x3b, 0xc5, 0x99, ++ 0xf4, 0xdf, 0x59, 0x47, 0xfd, 0x32, 0xcf, 0x91, 0xcf, 0xaa, 0x60, 0xd6, ++ 0xc8, 0xb6, 0x72, 0x0e, 0x3d, 0xac, 0xbd, 0x7b, 0x30, 0x4c, 0xb9, 0x5e, ++ 0xb3, 0xfb, 0x3a, 0x59, 0x92, 0xdf, 0x23, 0xaa, 0x47, 0x54, 0xd6, 0x35, ++ 0xcc, 0x33, 0xd6, 0x75, 0xa1, 0x7a, 0xee, 0xe2, 0xfc, 0xe1, 0xbc, 0x2a, ++ 0xd7, 0x4e, 0x39, 0x57, 0xe4, 0xfe, 0x1e, 0xbc, 0x9f, 0x16, 0x78, 0xcf, ++ 0xf6, 0xc1, 0x1e, 0x34, 0xe6, 0xaa, 0x4a, 0x47, 0x8f, 0xec, 0x76, 0xe5, ++ 0x36, 0xc6, 0x38, 0x7a, 0x71, 0x37, 0x75, 0xa9, 0xd2, 0x65, 0x4d, 0xb4, ++ 0x92, 0xe3, 0xc8, 0x7b, 0x79, 0xb5, 0xe8, 0x67, 0x4b, 0x7d, 0x5d, 0x0d, ++ 0xb9, 0xf6, 0xe8, 0xd4, 0xc3, 0xd8, 0x3e, 0x1e, 0xee, 0xf6, 0x38, 0xa4, ++ 0x1f, 0x86, 0x71, 0xc7, 0xd4, 0x95, 0x2e, 0xb8, 0x65, 0x5f, 0x01, 0xdc, ++ 0x32, 0xe2, 0x14, 0xef, 0xa4, 0x75, 0x3c, 0x9f, 0x76, 0x2c, 0x57, 0xf0, ++ 0x8c, 0x75, 0xc8, 0x3f, 0x80, 0x6b, 0x8d, 0x4e, 0xdc, 0x4e, 0x1f, 0x6c, ++ 0x6f, 0x1c, 0x20, 0x0f, 0x24, 0xb1, 0xb5, 0xd6, 0x42, 0x28, 0x5a, 0xb0, ++ 0x7a, 0xfc, 0xd2, 0x8e, 0x02, 0x1d, 0xbc, 0x5f, 0x13, 0x95, 0x6b, 0xe1, ++ 0xf4, 0x36, 0xc6, 0x85, 0xaa, 0x6b, 0x44, 0xed, 0x72, 0x97, 0x1c, 0xb3, ++ 0x86, 0xf9, 0x40, 0x99, 0xcc, 0x77, 0xbc, 0x32, 0xef, 0xf9, 0xa2, 0x3c, ++ 0xa6, 0x55, 0xa1, 0xeb, 0x91, 0xeb, 0x1c, 0x8d, 0xa3, 0xb3, 0xf4, 0xd9, ++ 0x0d, 0x2d, 0x17, 0xbf, 0xb7, 0x64, 0x23, 0x03, 0xe5, 0x2d, 0xd3, 0xd6, ++ 0xbc, 0x6f, 0x10, 0xbe, 0x96, 0x8b, 0xe7, 0x7e, 0xa9, 0x0f, 0x29, 0xb3, ++ 0xbc, 0x2f, 0xef, 0x85, 0x7d, 0xb7, 0xe2, 0x14, 0xc7, 0x08, 0x60, 0x0b, ++ 0x71, 0xad, 0x67, 0x5c, 0xf9, 0x3c, 0xdf, 0xf2, 0x4a, 0x5f, 0xfe, 0x5c, ++ 0xff, 0x6d, 0xe3, 0xe1, 0x0e, 0x77, 0x49, 0xff, 0xdb, 0xa7, 0x3e, 0xef, ++ 0xab, 0x7f, 0x44, 0xe2, 0xa9, 0xec, 0x4f, 0xae, 0xc5, 0x2f, 0xd9, 0x37, ++ 0x80, 0xbb, 0xed, 0xfe, 0x1e, 0x74, 0xc9, 0x18, 0x96, 0x6b, 0x3d, 0x1b, ++ 0x5b, 0x4c, 0xbc, 0x12, 0xbf, 0xcb, 0xda, 0x66, 0xdb, 0xe0, 0x5b, 0xb6, ++ 0xcc, 0x1d, 0x8d, 0xf3, 0xb6, 0xbf, 0x17, 0xe3, 0x36, 0x4e, 0x5f, 0x8f, ++ 0xe1, 0x47, 0x05, 0x03, 0x3f, 0x2c, 0x34, 0x93, 0x63, 0x23, 0xe4, 0x58, ++ 0x9d, 0xbe, 0x1f, 0x64, 0x3c, 0x7c, 0x85, 0xfc, 0x20, 0xcf, 0x67, 0xa8, ++ 0xc2, 0x39, 0x5e, 0x29, 0xca, 0xc6, 0xa5, 0x6c, 0x0b, 0x6a, 0x31, 0xc6, ++ 0x4e, 0x23, 0xe9, 0xe7, 0xbb, 0x99, 0xa2, 0xff, 0x47, 0x5a, 0xef, 0x00, ++ 0x1e, 0x31, 0x5d, 0x15, 0x6b, 0x81, 0xf7, 0x46, 0xbb, 0x6c, 0x7f, 0xb8, ++ 0x24, 0xb1, 0xa7, 0xed, 0x57, 0x8d, 0x16, 0x5e, 0x30, 0xe4, 0x5a, 0xe7, ++ 0xc3, 0x6d, 0xf7, 0x36, 0x2a, 0xcc, 0xdb, 0xe4, 0x98, 0x72, 0x2f, 0xbb, ++ 0xb8, 0x27, 0x44, 0xdc, 0x75, 0xd7, 0xac, 0x35, 0x5d, 0xfe, 0xb5, 0x4e, ++ 0xb1, 0x7c, 0x64, 0x33, 0x7d, 0x4f, 0x47, 0x7c, 0xc4, 0x74, 0xd7, 0xaf, ++ 0x0d, 0x62, 0x7c, 0x64, 0x09, 0x93, 0x9b, 0xd1, 0x7c, 0x00, 0xf8, 0xe7, ++ 0x91, 0x00, 0x9a, 0x26, 0x42, 0x7d, 0x7f, 0xe8, 0x08, 0xf5, 0xbf, 0xe5, ++ 0x90, 0xcf, 0x72, 0x6d, 0x57, 0xd8, 0xf5, 0xc4, 0xe3, 0x6d, 0xab, 0xed, ++ 0xeb, 0x2f, 0xda, 0x2e, 0xcf, 0x75, 0x23, 0x3d, 0xeb, 0x5a, 0xcc, 0x3a, ++ 0x2c, 0x7c, 0x27, 0xea, 0xc0, 0xd7, 0x8d, 0xf7, 0x18, 0x5b, 0x82, 0xbe, ++ 0xf1, 0x5f, 0x25, 0x97, 0x4b, 0x4c, 0xc5, 0x5e, 0xc6, 0x69, 0x17, 0x9f, ++ 0x81, 0x9e, 0xe3, 0xd7, 0xe5, 0x3e, 0x9a, 0x8c, 0x27, 0x30, 0x47, 0x80, ++ 0xfb, 0x05, 0xc6, 0xc8, 0x5d, 0xe9, 0x1a, 0xec, 0x1c, 0xad, 0xc5, 0xe0, ++ 0x68, 0x0d, 0x0e, 0x32, 0xf6, 0x9f, 0x65, 0xec, 0x7f, 0xc3, 0xd0, 0x16, ++ 0xc7, 0x1c, 0xe6, 0xe3, 0xcc, 0xed, 0x88, 0x5f, 0x5a, 0xf7, 0x5b, 0x0e, ++ 0xed, 0xe8, 0x0d, 0x0e, 0x1f, 0x72, 0x8d, 0x5a, 0xef, 0x77, 0x98, 0x33, ++ 0xd5, 0x25, 0xe4, 0xf8, 0x6f, 0x95, 0xe4, 0x38, 0xd9, 0x76, 0xb9, 0xcd, ++ 0xbd, 0x27, 0xda, 0x9a, 0x67, 0x8a, 0xbc, 0xdd, 0x34, 0x63, 0xba, 0x7e, ++ 0xb8, 0x56, 0x62, 0xe8, 0xcd, 0x78, 0x88, 0xdc, 0xf4, 0xe6, 0x48, 0x39, ++ 0xfd, 0x2f, 0x64, 0xac, 0x12, 0x21, 0xfa, 0x95, 0x6c, 0xf3, 0x6a, 0x5b, ++ 0x24, 0xf7, 0x14, 0xe6, 0x9d, 0x72, 0x3f, 0xe2, 0x09, 0xe6, 0x27, 0x4d, ++ 0xe6, 0x8b, 0x78, 0x4a, 0x6e, 0x85, 0xd8, 0x42, 0x4b, 0x1d, 0x1b, 0x73, ++ 0xc0, 0x3d, 0x23, 0xae, 0xc5, 0xa0, 0xbd, 0x16, 0x2f, 0x75, 0xbb, 0x8f, ++ 0xba, 0x69, 0x66, 0x92, 0x71, 0x7c, 0xbd, 0x51, 0x83, 0xd4, 0x37, 0x9d, ++ 0x7c, 0x2e, 0x6b, 0xb4, 0xa7, 0xdb, 0xf2, 0xc3, 0x98, 0x67, 0x1e, 0x47, ++ 0x0c, 0xb4, 0xeb, 0x27, 0x6f, 0x6e, 0x0e, 0x78, 0x98, 0xd8, 0x52, 0xbd, ++ 0xe6, 0xd7, 0xd6, 0x82, 0x1d, 0xdb, 0xaa, 0xf7, 0xd0, 0xa4, 0x20, 0x5f, ++ 0x14, 0xf7, 0x6f, 0x0f, 0x92, 0x07, 0x0e, 0x16, 0x9c, 0x17, 0xf5, 0x1f, ++ 0x36, 0x1d, 0x0e, 0x07, 0x1c, 0x2d, 0xc7, 0x50, 0xdc, 0x53, 0x83, 0xaa, ++ 0x32, 0x97, 0x50, 0xf7, 0xcb, 0x9c, 0xe0, 0x64, 0x5b, 0xf4, 0xfb, 0xb2, ++ 0xce, 0xfe, 0x6b, 0xbb, 0x96, 0x57, 0x38, 0xde, 0x2d, 0x69, 0xad, 0x97, ++ 0x75, 0xb2, 0xba, 0x82, 0x36, 0xb0, 0x32, 0x12, 0x0b, 0xde, 0x6c, 0x7b, ++ 0x7f, 0x52, 0xae, 0x77, 0x6b, 0xc1, 0x63, 0xc2, 0x23, 0xe2, 0x23, 0x5a, ++ 0xa4, 0x97, 0x32, 0x1f, 0xd4, 0xb5, 0xbe, 0x59, 0x68, 0xfd, 0xa7, 0x95, ++ 0x1e, 0x3c, 0x5c, 0x28, 0xda, 0xac, 0x38, 0x87, 0xf3, 0xa5, 0xdc, 0xe6, ++ 0x15, 0xda, 0x4e, 0xe6, 0x2b, 0x96, 0xa5, 0xaf, 0xe9, 0x44, 0x3a, 0x23, ++ 0xf3, 0x11, 0x79, 0xff, 0x67, 0x6d, 0xcd, 0xac, 0xa5, 0xb6, 0x8c, 0x90, ++ 0x4f, 0xc9, 0xfd, 0xfb, 0x0a, 0xae, 0xc5, 0xa4, 0x2d, 0x16, 0x6b, 0xef, ++ 0x8c, 0x66, 0x98, 0xc5, 0x5c, 0x86, 0x6d, 0x97, 0x72, 0x19, 0x0f, 0xb6, ++ 0x51, 0x97, 0xa4, 0x28, 0xbe, 0xaf, 0xb2, 0x5f, 0x75, 0xff, 0x92, 0xcc, ++ 0x5a, 0x9c, 0x6c, 0x45, 0x9c, 0x3a, 0x67, 0x8f, 0x73, 0xc2, 0x28, 0xad, ++ 0x8f, 0xa6, 0x97, 0x74, 0x09, 0x45, 0x76, 0xa0, 0xe8, 0x5f, 0xe1, 0x5c, ++ 0x39, 0xb2, 0x25, 0xfd, 0xdd, 0x9c, 0xa3, 0xaf, 0x0f, 0x93, 0x5b, 0x5a, ++ 0x8b, 0xf3, 0xd5, 0x98, 0xbb, 0x1a, 0xc9, 0xda, 0x0e, 0xca, 0xe8, 0xf3, ++ 0x36, 0x8d, 0x74, 0x60, 0x9c, 0xf3, 0x7a, 0xfd, 0x5c, 0xc0, 0xbb, 0x72, ++ 0x44, 0xc7, 0x86, 0x39, 0xd9, 0xe7, 0x7c, 0xdb, 0xd0, 0xe4, 0xcd, 0xa5, ++ 0x35, 0x80, 0xcd, 0x38, 0x48, 0xcc, 0xef, 0x1f, 0x29, 0xfa, 0xe9, 0x95, ++ 0x39, 0xd7, 0x22, 0x8a, 0x67, 0x47, 0xd4, 0x6a, 0x8e, 0xf3, 0xe9, 0xf0, ++ 0xfd, 0xd6, 0x42, 0x9d, 0xf4, 0x8f, 0x6e, 0x4c, 0x1e, 0xf0, 0x32, 0xf7, ++ 0xf1, 0xa1, 0xae, 0x65, 0x1f, 0xdf, 0x6d, 0xc6, 0x7d, 0x47, 0xda, 0x91, ++ 0xfd, 0x63, 0x27, 0xfe, 0xf7, 0x48, 0x12, 0x2b, 0x5a, 0xbe, 0x82, 0x85, ++ 0x3f, 0x51, 0x71, 0x6e, 0xc4, 0x83, 0xd3, 0xd4, 0x2f, 0x65, 0x77, 0x21, ++ 0xe3, 0x90, 0x31, 0x9c, 0x31, 0xec, 0x3d, 0x9e, 0x67, 0x32, 0x8c, 0x61, ++ 0xc6, 0xd1, 0x53, 0x94, 0xe7, 0xc9, 0x0b, 0x67, 0x9e, 0xec, 0xb5, 0x60, ++ 0x72, 0x8d, 0x4b, 0xb8, 0xc6, 0x93, 0x32, 0x97, 0xba, 0xca, 0x05, 0xb9, ++ 0x2e, 0x69, 0xb2, 0x0e, 0x0a, 0x22, 0x44, 0x99, 0xf5, 0x11, 0x79, 0xd6, ++ 0xc9, 0xef, 0x95, 0xfc, 0x3a, 0x45, 0x9d, 0x1c, 0x73, 0x0d, 0x5e, 0xe7, ++ 0xdc, 0xff, 0x20, 0x66, 0x04, 0x78, 0xa5, 0xbc, 0xb6, 0x5f, 0x5c, 0x3c, ++ 0xee, 0x98, 0x1b, 0x6e, 0x39, 0x36, 0xcd, 0x48, 0xfc, 0xaa, 0x22, 0xc7, ++ 0x99, 0x87, 0x57, 0x62, 0xe4, 0xf0, 0x9f, 0xb9, 0xe5, 0xe6, 0xcc, 0x70, ++ 0xbe, 0xe8, 0xb7, 0xc1, 0x5c, 0xa5, 0x5b, 0xe6, 0x33, 0xf7, 0x8c, 0x14, ++ 0xbf, 0x87, 0x2f, 0x7c, 0x77, 0x89, 0x9a, 0x71, 0x2d, 0x42, 0x9c, 0xb5, ++ 0x71, 0x4f, 0x6f, 0xf9, 0x7f, 0xd2, 0x63, 0x71, 0xde, 0x96, 0x67, 0x1f, ++ 0xfb, 0x92, 0x76, 0x79, 0xd2, 0x4a, 0xde, 0x28, 0x6d, 0xe7, 0xf7, 0xfe, ++ 0x90, 0x73, 0x31, 0xc1, 0x77, 0xbe, 0x4b, 0xf9, 0x9f, 0xa6, 0x5e, 0xf7, ++ 0xcd, 0x0d, 0xb1, 0x8d, 0xfd, 0x0c, 0x83, 0x19, 0x53, 0x73, 0x96, 0xce, ++ 0x67, 0x0e, 0x42, 0xd6, 0x21, 0x26, 0xde, 0x8e, 0xdd, 0x8e, 0x6b, 0x46, ++ 0xb5, 0xa4, 0xc9, 0xfc, 0x2d, 0xe5, 0x83, 0x70, 0x26, 0xa4, 0xff, 0xfe, ++ 0xa2, 0xed, 0xfd, 0xb4, 0xc1, 0x9c, 0x21, 0x14, 0x3c, 0xcd, 0xf6, 0xa6, ++ 0xb3, 0x01, 0x0f, 0x4d, 0x28, 0x38, 0xed, 0x67, 0x5e, 0x2c, 0x96, 0xea, ++ 0x57, 0xd9, 0x76, 0xe9, 0x73, 0x25, 0x82, 0x35, 0xa1, 0x38, 0x59, 0x58, ++ 0xd6, 0xbb, 0xae, 0x5c, 0xeb, 0x03, 0xd8, 0x37, 0xe6, 0x60, 0x4d, 0x10, ++ 0x44, 0xb2, 0x86, 0x89, 0xbf, 0xde, 0xd4, 0x77, 0x16, 0xff, 0x60, 0xcd, ++ 0xd7, 0xc9, 0xf7, 0x43, 0xf1, 0xb3, 0xf8, 0xcc, 0x52, 0x74, 0xfd, 0xe4, ++ 0x34, 0xf4, 0xf9, 0xd3, 0x68, 0xea, 0x3f, 0x8f, 0x0f, 0x38, 0xff, 0x5a, ++ 0x50, 0x55, 0x14, 0xe6, 0x8c, 0x21, 0x9f, 0x13, 0x7e, 0xcc, 0xfb, 0x15, ++ 0x6c, 0x32, 0xe4, 0x5a, 0xbd, 0xd6, 0x7f, 0x0c, 0x5a, 0xdf, 0x7b, 0xa2, ++ 0xa9, 0xf7, 0x13, 0x2c, 0x58, 0xd9, 0x1a, 0x39, 0xae, 0x40, 0xfc, 0xf2, ++ 0xa6, 0x93, 0xe5, 0xd0, 0x3a, 0xca, 0x84, 0x1e, 0xaf, 0x57, 0xfe, 0xd6, ++ 0x5a, 0xf0, 0x7f, 0x66, 0xe9, 0xe1, 0xcf, 0x98, 0x37, 0xe9, 0x81, 0x29, ++ 0xe6, 0xf8, 0xbd, 0x58, 0x92, 0xed, 0x3c, 0xf5, 0x37, 0x28, 0x43, 0xb1, ++ 0x96, 0xd9, 0x45, 0xd9, 0x7e, 0xca, 0xbc, 0x61, 0x5b, 0xf4, 0xac, 0x95, ++ 0xac, 0x93, 0x67, 0xf8, 0xd4, 0xca, 0xe2, 0x9e, 0x80, 0xf4, 0xff, 0x9b, ++ 0x71, 0x4b, 0x3a, 0x40, 0x3b, 0x2d, 0xe5, 0x77, 0x65, 0xc4, 0x6c, 0x99, ++ 0x13, 0xcd, 0x5f, 0xaa, 0xc0, 0x74, 0xcc, 0xe8, 0x7e, 0x0c, 0x31, 0xef, ++ 0xde, 0x61, 0x73, 0x07, 0xdc, 0xca, 0xda, 0x16, 0x6c, 0x9d, 0xfc, 0x5b, ++ 0x37, 0xe7, 0x6f, 0xfd, 0x8c, 0x21, 0xd7, 0xda, 0x4d, 0x04, 0x12, 0x0a, ++ 0xaa, 0xd7, 0x69, 0x27, 0x07, 0x61, 0x4a, 0x59, 0x52, 0x2b, 0x95, 0x01, ++ 0x5c, 0xba, 0x26, 0x79, 0xde, 0x83, 0x70, 0xf2, 0xac, 0xd2, 0x8f, 0xd5, ++ 0x6b, 0xe0, 0xab, 0x4a, 0x84, 0xbb, 0xaa, 0x44, 0xb8, 0xfb, 0x94, 0x88, ++ 0xc0, 0x33, 0x67, 0xba, 0xd4, 0xb5, 0x1e, 0xd5, 0x33, 0xd7, 0xac, 0x56, ++ 0xce, 0x19, 0xaa, 0x7b, 0xee, 0x76, 0x28, 0x63, 0x1e, 0x62, 0xb2, 0x16, ++ 0x6f, 0x14, 0xe5, 0x9c, 0x93, 0x18, 0x73, 0x5e, 0x02, 0xf4, 0xf0, 0x76, ++ 0x94, 0x0f, 0x87, 0x78, 0x6f, 0x00, 0x0b, 0x81, 0x62, 0x7e, 0x4c, 0x7d, ++ 0x64, 0x7e, 0xcd, 0x1a, 0xe2, 0x76, 0xa4, 0xc8, 0x3f, 0x5d, 0xad, 0x71, ++ 0x38, 0x46, 0x6c, 0x3c, 0x77, 0xbf, 0x18, 0x4b, 0x20, 0xcf, 0x3a, 0xee, ++ 0x68, 0xb4, 0x9e, 0xb9, 0x91, 0x81, 0xc1, 0x82, 0xf4, 0x53, 0xc9, 0x9b, ++ 0xb4, 0xc6, 0xba, 0x06, 0x8c, 0x4c, 0xf3, 0x0b, 0xb9, 0xce, 0x49, 0x1f, ++ 0xd9, 0x49, 0xbf, 0x0a, 0x48, 0xff, 0x25, 0xff, 0x99, 0x36, 0x2e, 0xfd, ++ 0x75, 0x5b, 0xdc, 0xc6, 0xa3, 0x37, 0x59, 0x3f, 0xfd, 0xbd, 0x5b, 0xd6, ++ 0x49, 0xf2, 0x6c, 0x60, 0xf5, 0xf8, 0x52, 0x8d, 0xba, 0xe1, 0x9e, 0x6a, ++ 0x34, 0xb3, 0xcf, 0x40, 0x69, 0x1f, 0x55, 0xe0, 0x78, 0xb4, 0x05, 0xcf, ++ 0x8d, 0xca, 0x33, 0x74, 0xf6, 0x5a, 0x82, 0x16, 0xc0, 0x7a, 0x64, 0x7c, ++ 0x0e, 0x72, 0xdc, 0x16, 0x1c, 0xf2, 0xcd, 0xbb, 0x8f, 0xc7, 0xec, 0x35, ++ 0x5b, 0x77, 0x0f, 0x39, 0xe6, 0x60, 0xfa, 0x2b, 0x08, 0x5e, 0x02, 0xd7, ++ 0xad, 0x31, 0xfa, 0xd8, 0x68, 0x19, 0xdb, 0xac, 0x67, 0xcd, 0xda, 0x89, ++ 0x6f, 0xdb, 0x67, 0x6b, 0x83, 0xd8, 0x45, 0x7f, 0xdf, 0x39, 0x1d, 0xc1, ++ 0x2e, 0xca, 0xb7, 0xab, 0xb0, 0x24, 0xf3, 0xc5, 0xb2, 0x7e, 0x99, 0x8c, ++ 0xd2, 0x26, 0xff, 0x37, 0x19, 0x59, 0x9f, 0x32, 0x6f, 0x1a, 0x4e, 0xf7, ++ 0xe0, 0xa7, 0xe9, 0xcf, 0xfb, 0xdd, 0xc7, 0x7c, 0xd7, 0x9c, 0x96, 0xfd, ++ 0xcb, 0xb1, 0xe5, 0x18, 0xa1, 0x54, 0x95, 0x90, 0xe3, 0x44, 0x58, 0xc7, ++ 0xfd, 0xae, 0x63, 0xc9, 0x73, 0xc4, 0xeb, 0x71, 0xda, 0x88, 0xa0, 0xa7, ++ 0x6b, 0x9e, 0xf3, 0xa1, 0xe3, 0xd1, 0xf4, 0x4a, 0x99, 0xeb, 0xba, 0x4e, ++ 0xc6, 0x3a, 0xf0, 0x58, 0xda, 0x1a, 0xf0, 0x24, 0x2c, 0x6b, 0x67, 0xab, ++ 0xee, 0xdb, 0x2a, 0xe4, 0xba, 0x79, 0x50, 0xee, 0x0b, 0xb9, 0xca, 0xd6, ++ 0x05, 0x31, 0xc2, 0xda, 0xab, 0x90, 0x6e, 0xea, 0x3d, 0x45, 0x9c, 0xce, ++ 0x32, 0x2e, 0xe6, 0x45, 0x8a, 0xb5, 0xe4, 0x5f, 0x54, 0xca, 0xf5, 0xa8, ++ 0xa1, 0xc2, 0x76, 0x38, 0x86, 0xbf, 0x59, 0x29, 0x6b, 0x96, 0x72, 0xd6, ++ 0xec, 0x0f, 0xa5, 0xa5, 0xcc, 0xd6, 0x80, 0x9b, 0x7d, 0x75, 0xb5, 0xea, ++ 0x71, 0x43, 0xa8, 0xf6, 0x19, 0xee, 0x32, 0xca, 0xbe, 0x9b, 0x6d, 0xcd, ++ 0x9c, 0xb4, 0xe5, 0x9e, 0x4a, 0x89, 0x49, 0xbb, 0x98, 0xe3, 0xb7, 0x5f, ++ 0xe8, 0x87, 0x8c, 0x34, 0x7c, 0xdc, 0xee, 0x87, 0xb9, 0x2d, 0xf9, 0xbf, ++ 0x0f, 0xbb, 0xd2, 0x7e, 0x3c, 0x9e, 0x6e, 0xea, 0x78, 0x03, 0x4e, 0xc6, ++ 0xb3, 0xd4, 0x51, 0x9e, 0x2f, 0x5e, 0x6a, 0xe3, 0xc7, 0xd4, 0x85, 0xcf, ++ 0xd2, 0x46, 0xc5, 0x75, 0xe4, 0xe7, 0xed, 0xba, 0x41, 0x25, 0x4f, 0x14, ++ 0x6b, 0x21, 0xe2, 0x87, 0x7b, 0x37, 0xe7, 0xf5, 0x3d, 0xce, 0xab, 0x83, ++ 0xf3, 0xfa, 0x82, 0xf1, 0x23, 0x99, 0xf7, 0xb8, 0x86, 0x62, 0x41, 0xb9, ++ 0x97, 0x66, 0x32, 0xe1, 0xb0, 0xdb, 0x8c, 0xc4, 0x9c, 0x78, 0x6d, 0x58, ++ 0xae, 0x81, 0x3f, 0xde, 0xf6, 0x52, 0xda, 0x5a, 0x3f, 0x1b, 0x6d, 0x4a, ++ 0xbd, 0x47, 0x2e, 0x37, 0xbf, 0xa9, 0x19, 0x0b, 0x68, 0x40, 0x66, 0xe2, ++ 0xbb, 0x58, 0xa8, 0x69, 0xf2, 0xbd, 0x01, 0xd3, 0x75, 0x30, 0xf6, 0x00, ++ 0xe2, 0x13, 0xac, 0x3d, 0xd6, 0xfc, 0x39, 0x03, 0x2f, 0x06, 0x45, 0x6f, ++ 0x5a, 0x7c, 0x01, 0xff, 0x1d, 0x0b, 0x97, 0x84, 0x8c, 0x17, 0x20, 0xdb, ++ 0x14, 0x6b, 0xfd, 0xd0, 0xcc, 0x9d, 0xe4, 0x6b, 0xba, 0x9e, 0x63, 0x89, ++ 0xd3, 0x9a, 0x22, 0x3d, 0xec, 0x33, 0xbb, 0x99, 0xf5, 0xb5, 0x7d, 0x6e, ++ 0x15, 0xee, 0x63, 0x8c, 0x8b, 0xc8, 0x98, 0x6c, 0xff, 0x74, 0x9b, 0x9e, ++ 0x0b, 0x42, 0x61, 0x2e, 0x94, 0xf2, 0x6b, 0x1d, 0xf2, 0x4c, 0xe1, 0xb1, ++ 0x74, 0x33, 0xb9, 0xa1, 0xa9, 0x2b, 0x22, 0xbe, 0x2d, 0xf7, 0x52, 0xed, ++ 0x20, 0x2b, 0x63, 0xbb, 0xc3, 0x69, 0x2d, 0x75, 0x0c, 0x4d, 0xdd, 0x1e, ++ 0x71, 0x33, 0x52, 0x35, 0x4d, 0xbd, 0x8f, 0x23, 0x44, 0x0e, 0xd5, 0x22, ++ 0x0b, 0x28, 0xf6, 0xb3, 0x2a, 0x47, 0x32, 0xab, 0x95, 0xd8, 0x93, 0xc6, ++ 0xe3, 0x3e, 0x05, 0x97, 0xb5, 0xe8, 0x8b, 0x53, 0x58, 0xf2, 0x97, 0x62, ++ 0x9b, 0xf5, 0x39, 0xb6, 0x57, 0x74, 0xbb, 0xa6, 0x77, 0xd6, 0xaa, 0x8c, ++ 0x85, 0xed, 0xd8, 0x96, 0x96, 0xeb, 0x0c, 0xb4, 0x0b, 0x63, 0xb3, 0x2b, ++ 0xbc, 0x1d, 0x7d, 0xb9, 0x08, 0xf6, 0x65, 0x42, 0x7b, 0x76, 0x42, 0xe7, ++ 0xbd, 0x50, 0x70, 0x2b, 0xf1, 0x61, 0xa8, 0xe0, 0x40, 0xb0, 0x36, 0xc0, ++ 0x5a, 0xdb, 0xc7, 0xbf, 0x62, 0x4d, 0xf4, 0x12, 0x6b, 0xa2, 0xd7, 0x18, ++ 0x6b, 0x9e, 0x52, 0xbd, 0xbb, 0x2a, 0x6b, 0x61, 0x36, 0x7a, 0x1d, 0x3e, ++ 0xb2, 0x73, 0xbc, 0x00, 0x6b, 0x33, 0xc9, 0x2b, 0x60, 0xfd, 0xec, 0x12, ++ 0x5b, 0xc7, 0x4c, 0xd7, 0x3d, 0xad, 0x01, 0x72, 0x9c, 0xcc, 0x5b, 0x1d, ++ 0x7f, 0xac, 0xd0, 0x1e, 0xd3, 0xfa, 0x00, 0x36, 0x46, 0x07, 0xd0, 0x67, ++ 0x7c, 0x0f, 0xe5, 0xb5, 0xa6, 0xe5, 0xd1, 0x8b, 0xeb, 0x12, 0x67, 0x5b, ++ 0x3b, 0x11, 0x7a, 0x44, 0xe6, 0x0b, 0xaf, 0xb6, 0xa9, 0xc3, 0x0e, 0x89, ++ 0x17, 0xec, 0xbf, 0xe6, 0xaa, 0xd5, 0xcc, 0x3d, 0xaa, 0x4a, 0xbc, 0x7f, ++ 0x79, 0xce, 0x47, 0xdf, 0x02, 0xeb, 0x5b, 0xb8, 0xdf, 0x59, 0xc7, 0xbc, ++ 0x89, 0x18, 0x13, 0x5f, 0x53, 0x06, 0x2c, 0x93, 0x67, 0x92, 0x8b, 0xb5, ++ 0x90, 0xd4, 0x77, 0x65, 0x4e, 0x60, 0x26, 0x46, 0xff, 0xb8, 0x50, 0xef, ++ 0x49, 0x2c, 0x2e, 0x9e, 0xe1, 0x2e, 0x9e, 0x25, 0x95, 0x6b, 0x33, 0xfb, ++ 0xad, 0xa4, 0xfc, 0x2d, 0x81, 0xa3, 0xce, 0x43, 0x0c, 0x0e, 0xcc, 0xa3, ++ 0xca, 0x23, 0xb1, 0x9a, 0x66, 0x2a, 0xd9, 0x5d, 0xda, 0xfa, 0xa8, 0xc4, ++ 0x7c, 0x7b, 0x2e, 0x9c, 0x7c, 0x67, 0x68, 0x52, 0xeb, 0xdf, 0x89, 0xa6, ++ 0xbe, 0xf7, 0x45, 0x05, 0xe4, 0x2e, 0xef, 0x54, 0x33, 0x52, 0x2b, 0x12, ++ 0xce, 0xcd, 0xe7, 0x33, 0xeb, 0x29, 0xc7, 0x69, 0x0b, 0x97, 0x6c, 0xb0, ++ 0xf7, 0x01, 0xa7, 0x9a, 0xff, 0x92, 0x7d, 0xcb, 0xcf, 0xfd, 0xec, 0x53, ++ 0xca, 0xf1, 0x9c, 0x15, 0xa9, 0x2b, 0xda, 0xe7, 0x78, 0x5a, 0xfa, 0xb0, ++ 0x03, 0xf5, 0x7a, 0x78, 0xb1, 0x9b, 0xdf, 0x7f, 0x99, 0x63, 0xc5, 0xb0, ++ 0xae, 0x17, 0x7f, 0x93, 0x4d, 0xe0, 0x21, 0x72, 0x43, 0xb5, 0xae, 0xf9, ++ 0xb2, 0x72, 0x4f, 0x3f, 0x5a, 0xd4, 0xff, 0x8a, 0x2c, 0xc9, 0xb6, 0xc6, ++ 0x67, 0xd7, 0x29, 0x45, 0xfd, 0x72, 0xd4, 0xef, 0x2e, 0x8f, 0x8c, 0x85, ++ 0x15, 0x89, 0x08, 0x7d, 0x26, 0xc5, 0x38, 0x6c, 0x8a, 0xc8, 0xbc, 0x2a, ++ 0xeb, 0xd7, 0xf6, 0x80, 0xf1, 0x3a, 0x96, 0x96, 0xf6, 0x0f, 0x78, 0x7b, ++ 0x58, 0xe0, 0xbb, 0x75, 0x7b, 0xad, 0xd9, 0x08, 0x3a, 0x1a, 0xb0, 0x77, ++ 0xda, 0xc6, 0x53, 0x33, 0xe8, 0xf8, 0x8c, 0xb1, 0x24, 0x31, 0x23, 0x14, ++ 0x70, 0xcb, 0x73, 0xfe, 0xb5, 0x0a, 0x7a, 0x8c, 0x22, 0x7f, 0xce, 0x92, ++ 0xa3, 0x3e, 0xa2, 0x1c, 0xfb, 0x88, 0xdd, 0x29, 0x72, 0xd4, 0x88, 0x5e, ++ 0xf4, 0x25, 0x7d, 0x46, 0xae, 0x65, 0xbe, 0xd9, 0x16, 0x38, 0xa0, 0x05, ++ 0xcb, 0x94, 0xa6, 0xfe, 0x13, 0xd8, 0xce, 0x7c, 0x56, 0xfa, 0x54, 0x19, ++ 0x8e, 0x34, 0xcf, 0x58, 0xf3, 0x7e, 0xa9, 0xaf, 0x82, 0xe7, 0xe4, 0xf9, ++ 0xd1, 0x4b, 0x42, 0x81, 0xe7, 0xc8, 0xb3, 0xd3, 0xa5, 0xf9, 0x08, 0xe5, ++ 0x96, 0xfc, 0xf1, 0x6b, 0xd2, 0xd6, 0x91, 0x14, 0xf4, 0x78, 0x0e, 0x7f, ++ 0xca, 0xcf, 0x8d, 0x81, 0x8f, 0x4a, 0xbe, 0xba, 0x7a, 0xe6, 0xa7, 0x9e, ++ 0xd2, 0x19, 0x6f, 0xfb, 0x9d, 0x60, 0xee, 0xcf, 0xf9, 0x5d, 0xf6, 0x19, ++ 0x61, 0x2e, 0x20, 0xf5, 0x81, 0x7b, 0x5b, 0x6b, 0xb9, 0x8c, 0x17, 0x9f, ++ 0xfc, 0xbd, 0xc1, 0xc6, 0xb1, 0x32, 0xfb, 0x6c, 0xc0, 0x09, 0x43, 0xc1, ++ 0xce, 0x0b, 0xbf, 0x87, 0x90, 0xd7, 0x0e, 0x6c, 0x1a, 0x93, 0xeb, 0x19, ++ 0xc7, 0xaf, 0x54, 0xf1, 0x2f, 0xe4, 0x66, 0x89, 0x49, 0x17, 0xf6, 0xbb, ++ 0xc8, 0xb3, 0xbf, 0x60, 0x9e, 0xb9, 0x34, 0xc7, 0x17, 0x74, 0x3a, 0x79, ++ 0x2b, 0x71, 0x67, 0x24, 0xad, 0xf5, 0x87, 0x15, 0xb9, 0xef, 0x10, 0x62, ++ 0xee, 0xfe, 0x15, 0x82, 0xb4, 0xec, 0xaf, 0x13, 0xdd, 0x63, 0x31, 0xd6, ++ 0x47, 0x3e, 0xef, 0x5d, 0xfb, 0xe5, 0x59, 0x04, 0x27, 0x8e, 0x0d, 0x87, ++ 0x8c, 0x53, 0x02, 0x78, 0x74, 0xd8, 0xb2, 0x4e, 0x19, 0xf8, 0xd3, 0x6a, ++ 0xd6, 0xd9, 0xcd, 0x42, 0x8b, 0x33, 0x5f, 0x08, 0x5e, 0x27, 0x9a, 0x02, ++ 0x39, 0x68, 0x27, 0x77, 0xb0, 0xbf, 0xc3, 0x79, 0xe0, 0xb9, 0xbc, 0x1b, ++ 0xcf, 0x8e, 0x69, 0x7d, 0x8b, 0xc2, 0x8d, 0xb9, 0x47, 0x6a, 0xbd, 0xdb, ++ 0xf7, 0xc7, 0xb0, 0x97, 0x3c, 0xd2, 0x79, 0x38, 0x8e, 0x4d, 0xfb, 0x05, ++ 0x22, 0xe1, 0x38, 0x3a, 0x0e, 0x57, 0xe1, 0xba, 0x31, 0x15, 0x1f, 0xc6, ++ 0xaa, 0x70, 0xfd, 0x23, 0x4b, 0x7a, 0xbc, 0x55, 0xaa, 0x15, 0x25, 0x1e, ++ 0x11, 0x1b, 0x89, 0xb3, 0x2a, 0xb1, 0x6f, 0x77, 0x46, 0xe6, 0x12, 0x96, ++ 0x15, 0x68, 0x2d, 0xae, 0x95, 0x3c, 0x51, 0x80, 0xfb, 0x60, 0xab, 0x1e, ++ 0x08, 0x38, 0x12, 0xb8, 0x6c, 0x62, 0xfe, 0xdb, 0xd5, 0xb0, 0x9e, 0x97, ++ 0xfb, 0x3a, 0xe7, 0x9a, 0x2d, 0x6b, 0x53, 0x2c, 0xbc, 0x78, 0x87, 0x9d, ++ 0x83, 0xff, 0x82, 0x31, 0x65, 0xc8, 0xb3, 0x6e, 0xd4, 0xf7, 0x15, 0xea, ++ 0xab, 0x77, 0x9f, 0x55, 0xcc, 0x01, 0x1f, 0xac, 0x4f, 0x2b, 0x12, 0xd6, ++ 0xb9, 0xb2, 0x44, 0x38, 0x70, 0xb7, 0x90, 0x35, 0x43, 0x10, 0x9b, 0xa2, ++ 0x96, 0xf5, 0x76, 0xcc, 0xb2, 0xf2, 0x31, 0xd3, 0xb5, 0x7a, 0xad, 0x0f, ++ 0x87, 0x57, 0xc9, 0xdf, 0x20, 0x84, 0x92, 0xf5, 0xf4, 0x2f, 0xf7, 0x2a, ++ 0x3d, 0xb0, 0x05, 0x72, 0x3f, 0x80, 0x73, 0x5c, 0xa7, 0x75, 0x03, 0x0d, ++ 0xde, 0x7d, 0xc3, 0xb5, 0x78, 0x74, 0xf6, 0x0f, 0x00, 0x86, 0xa1, 0x5c, ++ 0x93, 0xfb, 0xd4, 0xc0, 0xfa, 0x6a, 0xe6, 0x1b, 0xb7, 0x41, 0xae, 0xd3, ++ 0xfa, 0x71, 0xb4, 0x60, 0xe2, 0xfa, 0x58, 0x2f, 0xb6, 0x8d, 0xc9, 0x7c, ++ 0xfb, 0x67, 0x6d, 0x9f, 0x8e, 0x59, 0xbf, 0x74, 0x51, 0xfe, 0xf5, 0xad, ++ 0x4d, 0x29, 0xb7, 0xfd, 0x1b, 0xa6, 0x13, 0x6d, 0x1b, 0x26, 0x6b, 0x50, ++ 0x98, 0xd6, 0xe7, 0x57, 0x88, 0xe4, 0x29, 0xe6, 0x2a, 0x81, 0x7a, 0xc5, ++ 0x87, 0x59, 0xc6, 0xee, 0x74, 0x41, 0xd6, 0x35, 0x3f, 0x6f, 0xb3, 0x26, ++ 0x96, 0x63, 0x6a, 0x96, 0x7d, 0x65, 0xf4, 0x8e, 0x8f, 0x99, 0xfb, 0x55, ++ 0x26, 0xac, 0x6a, 0x77, 0x22, 0x7c, 0xb2, 0x49, 0x28, 0x58, 0x5c, 0x63, ++ 0x59, 0x9d, 0xad, 0x7a, 0x7f, 0x95, 0x40, 0x9f, 0x23, 0xa1, 0xc7, 0x9b, ++ 0x15, 0x7c, 0x35, 0x80, 0x70, 0xc7, 0xdb, 0x08, 0x77, 0x9f, 0x16, 0x7e, ++ 0x3c, 0x56, 0x90, 0x67, 0x49, 0x1f, 0xc0, 0x2f, 0xc7, 0xea, 0xf0, 0xfc, ++ 0xf4, 0x77, 0x4b, 0xeb, 0x6a, 0x70, 0x5f, 0xbe, 0x36, 0x81, 0x23, 0x63, ++ 0x41, 0xfa, 0x4f, 0x39, 0x71, 0x5d, 0x85, 0xa3, 0x51, 0xd6, 0x57, 0xf3, ++ 0xac, 0xaf, 0x2c, 0x6b, 0x75, 0xe3, 0x52, 0x5d, 0x74, 0xf1, 0x6f, 0x17, ++ 0x96, 0xd6, 0x8c, 0x9a, 0x39, 0x7f, 0x4d, 0xa9, 0x6d, 0xe2, 0x84, 0x65, ++ 0x7e, 0x53, 0x9e, 0x5f, 0xfc, 0x66, 0x15, 0xdc, 0x52, 0xef, 0x06, 0xec, ++ 0x98, 0x90, 0x7b, 0xf7, 0x72, 0xde, 0xe0, 0xee, 0x88, 0xc9, 0x33, 0x05, ++ 0x72, 0x8e, 0xe6, 0xdd, 0x1b, 0x63, 0xc4, 0x44, 0xe1, 0x65, 0x3e, 0x65, ++ 0xba, 0xda, 0xc9, 0x4f, 0x15, 0x63, 0xf2, 0x77, 0x14, 0x41, 0xd6, 0xa3, ++ 0xeb, 0xf1, 0x91, 0x51, 0x89, 0x7d, 0x35, 0xd2, 0x77, 0xa4, 0x9c, 0x72, ++ 0xdd, 0x71, 0x3b, 0x6e, 0x97, 0xbf, 0x45, 0x29, 0x5c, 0x65, 0x9f, 0xa9, ++ 0x3b, 0x66, 0xe7, 0x07, 0x52, 0x8e, 0xa5, 0xf1, 0x3b, 0xb0, 0xc2, 0x3e, ++ 0x8f, 0xf4, 0x74, 0x5b, 0x80, 0x79, 0xfa, 0x41, 0xfa, 0x85, 0x23, 0xd1, ++ 0x0e, 0x95, 0xbe, 0x78, 0x4d, 0xec, 0xe2, 0x3e, 0xf4, 0xbe, 0xd3, 0x8a, ++ 0x3c, 0xdf, 0x2c, 0xf7, 0x38, 0xb5, 0xf8, 0x51, 0x71, 0x71, 0x9f, 0x8f, ++ 0x56, 0xc9, 0xfd, 0x5b, 0x73, 0xba, 0xc8, 0x4b, 0x47, 0xc8, 0x4b, 0x2f, ++ 0x8f, 0xca, 0x18, 0x79, 0xd3, 0x8e, 0x11, 0x07, 0xb1, 0x76, 0x03, 0xb9, ++ 0xfd, 0xb4, 0x01, 0xbd, 0x1c, 0x51, 0xca, 0x1d, 0xee, 0xe0, 0x08, 0xa6, ++ 0x4a, 0x9c, 0x2e, 0x23, 0xfe, 0x4f, 0x8f, 0xca, 0x73, 0x4a, 0x92, 0x03, ++ 0xb4, 0x2e, 0x79, 0x95, 0x67, 0x24, 0x02, 0x89, 0x3e, 0xe6, 0x9e, 0xc0, ++ 0x99, 0x61, 0xb9, 0xe6, 0x25, 0xf7, 0xfe, 0xfa, 0xc5, 0x79, 0xfb, 0x0c, ++ 0x6c, 0x1f, 0xde, 0x8d, 0xc9, 0xdf, 0x61, 0xc9, 0xd8, 0xbb, 0x0f, 0x32, ++ 0xf6, 0xaa, 0xd9, 0xf6, 0xd3, 0xe1, 0x50, 0xb0, 0x83, 0x71, 0xd3, 0x03, ++ 0x6d, 0x1e, 0x68, 0x32, 0x66, 0x20, 0x63, 0x44, 0x4b, 0xbe, 0x54, 0xda, ++ 0xf3, 0x0b, 0x97, 0xf6, 0x2b, 0x23, 0xb9, 0x0e, 0xf1, 0x51, 0x4e, 0xca, ++ 0xf4, 0x0b, 0xca, 0xd4, 0x2e, 0x3e, 0x98, 0xd9, 0x28, 0x3e, 0x9c, 0xe9, ++ 0x14, 0x6f, 0xe7, 0x24, 0x26, 0xff, 0xac, 0x6d, 0x68, 0x54, 0xf2, 0xd9, ++ 0x8d, 0xe2, 0x9d, 0xec, 0x66, 0x71, 0x36, 0xd7, 0x2d, 0x3e, 0x9e, 0x31, ++ 0x71, 0x67, 0xac, 0x13, 0xb9, 0x31, 0xf8, 0x5c, 0x89, 0x3b, 0xc5, 0x47, ++ 0xd9, 0xe2, 0x5a, 0xe3, 0xd9, 0x5c, 0x83, 0x37, 0xc7, 0xb1, 0x2b, 0x69, ++ 0xb7, 0x3b, 0x86, 0x97, 0x7b, 0x1f, 0x9d, 0xf4, 0x7b, 0xe7, 0x26, 0xb5, ++ 0x5e, 0x79, 0x8e, 0xf5, 0xfa, 0xe8, 0x9b, 0x72, 0x0e, 0xad, 0x57, 0xa2, ++ 0xc5, 0xfc, 0x60, 0x07, 0xed, 0xb1, 0x95, 0xdc, 0x32, 0x65, 0x34, 0x21, ++ 0x69, 0x63, 0x8b, 0xf4, 0x75, 0xa9, 0xab, 0xe4, 0x6a, 0xb9, 0x5f, 0xd6, ++ 0x07, 0x67, 0x2b, 0x98, 0xcf, 0x7d, 0xae, 0xeb, 0x47, 0xd4, 0xd5, 0x2c, ++ 0xeb, 0xc3, 0x27, 0xd4, 0xf5, 0xb5, 0xe1, 0xcf, 0xf7, 0x38, 0x9d, 0x6c, ++ 0x3b, 0x94, 0x0e, 0xa5, 0x8e, 0x0a, 0x6d, 0x3e, 0x57, 0xdc, 0xe3, 0x34, ++ 0x3c, 0x8a, 0xcc, 0xd1, 0xb5, 0xfe, 0x46, 0xa5, 0xa8, 0x6b, 0xbc, 0xa4, ++ 0xeb, 0x15, 0xd4, 0xf5, 0x43, 0x7e, 0xf6, 0x52, 0xd7, 0xd7, 0x87, 0xc7, ++ 0xac, 0x2a, 0x3d, 0x49, 0xdb, 0xb6, 0x8b, 0xb3, 0xd4, 0xf9, 0x03, 0xea, ++ 0xfc, 0x49, 0xee, 0x46, 0xf1, 0x31, 0xf5, 0xfc, 0x30, 0x27, 0xf7, 0x35, ++ 0x5d, 0xe2, 0x83, 0xd1, 0xa2, 0x8e, 0x1f, 0x5c, 0xd0, 0x31, 0xe0, 0xdd, ++ 0x97, 0xae, 0xf5, 0xee, 0x9e, 0xf4, 0x79, 0x77, 0x4d, 0x5a, 0xd6, 0x07, ++ 0x46, 0x95, 0x57, 0xea, 0xf5, 0x13, 0xe3, 0x8b, 0x7a, 0x5d, 0x49, 0xbd, ++ 0xe4, 0x9e, 0xf4, 0x6f, 0xcf, 0xe1, 0x92, 0x5e, 0x0f, 0xa5, 0xed, 0xb3, ++ 0x55, 0xf6, 0xb9, 0xb1, 0x2a, 0xb9, 0x2f, 0x4d, 0xbd, 0xbc, 0xbc, 0xff, ++ 0xf2, 0xbf, 0xd5, 0xab, 0xf7, 0x2c, 0xe7, 0x2f, 0x5f, 0xd2, 0xab, 0xea, ++ 0xdf, 0xd5, 0x8b, 0xb5, 0xef, 0x98, 0xd4, 0xab, 0xe6, 0xaa, 0xd7, 0xc7, ++ 0x2c, 0xce, 0x97, 0x62, 0xff, 0x46, 0x2c, 0x9f, 0x19, 0xc0, 0xcb, 0x51, ++ 0xf9, 0xbb, 0xb9, 0x70, 0xf0, 0x28, 0xf1, 0x74, 0xa6, 0xe0, 0x16, 0xe5, ++ 0xf6, 0xde, 0x34, 0x5e, 0xaf, 0xa0, 0x4c, 0x47, 0xa6, 0xe5, 0xef, 0xc2, ++ 0x60, 0x30, 0x17, 0xf0, 0xc9, 0xdf, 0xd3, 0x4d, 0xd9, 0xe7, 0x5f, 0x3b, ++ 0x45, 0x75, 0x5e, 0xee, 0x45, 0x6f, 0x16, 0xde, 0x7c, 0xb7, 0xc0, 0xe1, ++ 0x0e, 0xe1, 0xc9, 0xb7, 0x0b, 0xf7, 0x61, 0xd3, 0x72, 0xeb, 0x1b, 0x45, ++ 0xe5, 0xe1, 0x1b, 0x85, 0xbb, 0xb4, 0x2f, 0xed, 0xca, 0x07, 0xbc, 0xe9, ++ 0x8b, 0xec, 0xf1, 0xa1, 0x71, 0x8d, 0x6d, 0x8f, 0x57, 0x8c, 0xa5, 0xdf, ++ 0xd0, 0xd8, 0xe7, 0x7c, 0x19, 0xa3, 0x64, 0x69, 0xd6, 0x53, 0xd5, 0x07, ++ 0x8a, 0xf5, 0xd4, 0x3b, 0x51, 0x79, 0x16, 0xca, 0xa4, 0xfd, 0x11, 0x74, ++ 0x26, 0xb4, 0xee, 0xe3, 0x42, 0x4f, 0xdd, 0x29, 0x92, 0x9b, 0x3c, 0x18, ++ 0x60, 0xed, 0x16, 0x4e, 0x5e, 0x26, 0xc2, 0x71, 0xa7, 0x9d, 0xeb, 0x1a, ++ 0x6a, 0xc5, 0x9c, 0x89, 0x5d, 0xc4, 0xb7, 0x17, 0x47, 0x1d, 0xcc, 0x1d, ++ 0xe4, 0x3e, 0x9f, 0x13, 0xd7, 0xf8, 0x82, 0x38, 0xc4, 0x5c, 0xfe, 0x60, ++ 0xa6, 0x17, 0x87, 0x72, 0x3d, 0x38, 0x98, 0xfb, 0x37, 0xbf, 0xad, 0x51, ++ 0xdd, 0x09, 0x5f, 0xbc, 0x78, 0x2e, 0xe3, 0x4c, 0xfc, 0xd2, 0xb0, 0xc4, ++ 0xe8, 0x3d, 0xcd, 0x6a, 0x58, 0xd6, 0xbf, 0x8b, 0x57, 0xbe, 0xaf, 0xcb, ++ 0x58, 0xec, 0x5c, 0xfb, 0x92, 0x9d, 0x8b, 0xcc, 0xac, 0x39, 0x6c, 0x9f, ++ 0x23, 0x7b, 0xfa, 0x8a, 0x21, 0xfb, 0xb7, 0x9e, 0x58, 0x77, 0x8b, 0x2e, ++ 0xe3, 0xe1, 0x07, 0xb1, 0x0d, 0x36, 0xbf, 0x8e, 0xb6, 0x15, 0x7f, 0x57, ++ 0x99, 0x6e, 0xbb, 0xd4, 0xbe, 0xee, 0x69, 0x8b, 0xd8, 0xd7, 0xc9, 0xb6, ++ 0xe2, 0x9e, 0xff, 0x8c, 0x5c, 0xbf, 0xe2, 0xf5, 0x07, 0x6d, 0xc5, 0x98, ++ 0x7a, 0x98, 0xb9, 0xa7, 0xbc, 0x1e, 0x2d, 0xf1, 0x72, 0x96, 0xf9, 0xc4, ++ 0xe7, 0xbf, 0xa7, 0x01, 0xfe, 0x0f, 0xcf, 0x95, 0x53, 0x72, 0x14, 0x3b, ++ 0x00, 0x00, 0x00 }; + + static const u32 bnx2_TXP_b09FwData[(0x0/4) + 1] = { 0x0 }; + static const u32 bnx2_TXP_b09FwRodata[(0x30/4) + 1] = { +@@ -4582,15 +4696,15 @@ + 0x00000000 }; + + static struct fw_info bnx2_txp_fw_09 = { +- /* Firmware version: 4.4.23 */ +- .ver_major = 0x4, +- .ver_minor = 0x4, +- .ver_fix = 0x17, +- +- .start_addr = 0x08000094, ++ /* Firmware version: 5.0.0g */ ++ .ver_major = 0x5, ++ .ver_minor = 0x0, ++ .ver_fix = 0x0, ++ ++ .start_addr = 0x080000a8, + + .text_addr = 0x08000000, +- .text_len = 0x3b1c, ++ .text_len = 0x3b10, + .text_index = 0x0, + .gz_text = bnx2_TXP_b09FwText, + .gz_text_len = sizeof(bnx2_TXP_b09FwText), +@@ -4600,15 +4714,15 @@ + .data_index = 0x0, + .data = bnx2_TXP_b09FwData, + +- .sbss_addr = 0x08003b80, +- .sbss_len = 0x6c, +- .sbss_index = 0x0, +- +- .bss_addr = 0x08003bec, ++ .sbss_addr = 0x08003b60, ++ .sbss_len = 0x68, ++ .sbss_index = 0x0, ++ ++ .bss_addr = 0x08003bc8, + .bss_len = 0x24c, + .bss_index = 0x0, + +- .rodata_addr = 0x08003b1c, ++ .rodata_addr = 0x08003b10, + .rodata_len = 0x30, + .rodata_index = 0x0, + .rodata = bnx2_TXP_b09FwRodata, +diff -r 19900e8f54d8 drivers/net/cnic.c +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/cnic.c Mon Jun 15 16:38:18 2009 +0100 +@@ -0,0 +1,4731 @@ ++/* cnic.c: Broadcom CNIC core network driver. ++ * ++ * Copyright (c) 2006-2009 Broadcom Corporation ++ * ++ * 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. ++ * ++ * Written by: John(Zongxi) Chen (zongxi@broadcom.com) ++ * Modified and maintained by: Michael Chan ++ */ ++ ++#include ++#if (LINUX_VERSION_CODE < 0x020612) ++#include ++#endif ++ ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) ++#define BCM_VLAN 1 ++#endif ++#include ++#include ++#ifndef __VMKLNX__ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#ifdef HAVE_NETEVENT ++#include ++#endif ++#endif ++ ++#ifndef __VMKLNX__ ++#define NEW_BNX2X_HSI 1 ++#endif ++#include "cnic_drv.h" ++#include "bnx2.h" ++#include "../../bnx2x/src/bnx2x_reg.h" ++#include "../../bnx2x/src/bnx2x_fw_defs.h" ++#include "../../bnx2x/src/bnx2x_hsi.h" ++#include "cnic_if.h" ++#include "cnic.h" ++#include "cnic_defs.h" ++#include "5710_hsi_cnic.h" ++#include "57xx_iscsi_constants.h" ++ ++#define DRV_MODULE_NAME "cnic" ++#define PFX DRV_MODULE_NAME ": " ++ ++static char version[] __devinitdata = ++ "Broadcom NetXtreme II CNIC Driver " DRV_MODULE_NAME " v" CNIC_MODULE_VERSION " (" CNIC_MODULE_RELDATE ")\n"; ++ ++MODULE_AUTHOR("John(Zongxi) Chen "); ++MODULE_DESCRIPTION("Broadcom NetXtreme II CNIC Driver"); ++MODULE_LICENSE("GPL"); ++MODULE_VERSION(CNIC_MODULE_VERSION); ++ ++static LIST_HEAD(cnic_dev_list); ++static DEFINE_RWLOCK(cnic_dev_lock); ++static DEFINE_MUTEX(cnic_lock); ++ ++struct cnic_ulp_ops *cnic_ulp_tbl[MAX_CNIC_ULP_TYPE]; ++ ++static int cnic_service_bnx2(void *, void *); ++static int cnic_service_bnx2x(void *, void *); ++static int cnic_ctl(void *, struct cnic_ctl_info *); ++ ++static struct cnic_ops cnic_bnx2_ops = { ++ .cnic_owner = THIS_MODULE, ++ .cnic_handler = cnic_service_bnx2, ++ .cnic_ctl = cnic_ctl, ++}; ++ ++static struct cnic_ops cnic_bnx2x_ops = { ++ .cnic_owner = THIS_MODULE, ++ .cnic_handler = cnic_service_bnx2x, ++ .cnic_ctl = cnic_ctl, ++}; ++ ++static inline void cnic_hold(struct cnic_dev *dev) ++{ ++ atomic_inc(&dev->ref_count); ++} ++ ++static inline void cnic_put(struct cnic_dev *dev) ++{ ++ atomic_dec(&dev->ref_count); ++} ++ ++static inline void csk_hold(struct cnic_sock *csk) ++{ ++ atomic_inc(&csk->ref_count); ++} ++ ++static inline void csk_put(struct cnic_sock *csk) ++{ ++ atomic_dec(&csk->ref_count); ++} ++ ++static void cnic_ctx_wr(struct cnic_dev *dev, u32 cid_addr, u32 off, u32 val) ++{ ++ struct cnic_local *cp = dev->cnic_priv; ++ struct cnic_eth_dev *ethdev = cp->ethdev; ++ struct drv_ctl_info info; ++ struct drv_ctl_io *io = &info.data.io; ++ ++ info.cmd = DRV_CTL_CTX_WR_CMD; ++ io->cid_addr = cid_addr; ++ io->offset = off; ++ io->data = val; ++ ethdev->drv_ctl(dev->netdev, &info); ++} ++ ++static void cnic_ctx_tbl_wr(struct cnic_dev *dev, u32 off, dma_addr_t addr) ++{ ++ struct cnic_local *cp = dev->cnic_priv; ++ struct cnic_eth_dev *ethdev = cp->ethdev; ++ struct drv_ctl_info info; ++ struct drv_ctl_io *io = &info.data.io; ++ ++ info.cmd = DRV_CTL_CTXTBL_WR_CMD; ++ io->offset = off; ++ io->dma_addr = addr; ++ ethdev->drv_ctl(dev->netdev, &info); ++} ++ ++static void cnic_reg_wr_ind(struct cnic_dev *dev, u32 off, u32 val) ++{ ++ struct cnic_local *cp = dev->cnic_priv; ++ struct cnic_eth_dev *ethdev = cp->ethdev; ++ struct drv_ctl_info info; ++ struct drv_ctl_io *io = &info.data.io; ++ ++ info.cmd = DRV_CTL_IO_WR_CMD; ++ io->offset = off; ++ io->data = val; ++ ethdev->drv_ctl(dev->netdev, &info); ++} ++ ++static u32 cnic_reg_rd_ind(struct cnic_dev *dev, u32 off) ++{ ++ struct cnic_local *cp = dev->cnic_priv; ++ struct cnic_eth_dev *ethdev = cp->ethdev; ++ struct drv_ctl_info info; ++ struct drv_ctl_io *io = &info.data.io; ++ ++ info.cmd = DRV_CTL_IO_RD_CMD; ++ io->offset = off; ++ ethdev->drv_ctl(dev->netdev, &info); ++ return io->data; ++} ++ ++static void cnic_kwq_completion(struct cnic_dev *dev, u32 count) ++{ ++ struct cnic_local *cp = dev->cnic_priv; ++ struct cnic_eth_dev *ethdev = cp->ethdev; ++ struct drv_ctl_info info; ++ ++ info.cmd = DRV_CTL_COMPLETION_CMD; ++ info.data.comp.comp_count = count; ++ ethdev->drv_ctl(dev->netdev, &info); ++} ++ ++static int cnic_get_l5_cid(struct cnic_local *cp, u32 cid, u32 *l5_cid) ++{ ++ u32 i; ++ ++ for (i = 0; i < MAX_ISCSI_TBL_SZ; i++) { ++ if (cp->ctx_tbl[i].cid == cid) { ++ *l5_cid = i; ++ return 0; ++ } ++ } ++ return -EINVAL; ++} ++ ++ ++static int cnic_in_use(struct cnic_sock *csk) ++{ ++ return (test_bit(SK_F_INUSE, &csk->flags)); ++} ++ ++static int cnic_offld_prep(struct cnic_sock *csk) ++{ ++ if (!test_bit(SK_F_CONNECT_START, &csk->flags)) ++ return 0; ++ ++ if (test_and_set_bit(SK_F_OFFLD_SCHED, &csk->flags)) ++ return 0; ++ ++ return 1; ++} ++ ++static int cnic_close_prep(struct cnic_sock *csk) ++{ ++ if (test_and_clear_bit(SK_F_OFFLD_COMPLETE, &csk->flags)) ++ return 1; ++ ++ return 0; ++} ++ ++static int cnic_abort_prep(struct cnic_sock *csk) ++{ ++ while (test_and_set_bit(SK_F_OFFLD_SCHED, &csk->flags)) ++ msleep(1); ++ ++ if (cnic_close_prep(csk)) { ++ csk->state = L4_KCQE_OPCODE_VALUE_RESET_COMP; ++ return 1; ++ } ++ ++ return 0; ++} ++ ++int cnic_register_driver(int ulp_type, struct cnic_ulp_ops *ulp_ops) ++{ ++ struct cnic_dev *dev; ++ ++ if (ulp_type >= MAX_CNIC_ULP_TYPE) { ++ printk(KERN_ERR PFX "cnic_register_driver: Bad type %d\n", ++ ulp_type); ++ return -EINVAL; ++ } ++ mutex_lock(&cnic_lock); ++ if (cnic_ulp_tbl[ulp_type]) { ++ printk(KERN_ERR PFX "cnic_register_driver: Type %d has already " ++ "been registered\n", ulp_type); ++ mutex_unlock(&cnic_lock); ++ return -EBUSY; ++ } ++ ++#ifndef __VMKLNX__ ++ read_lock(&cnic_dev_lock); ++#endif ++ list_for_each_entry(dev, &cnic_dev_list, list) { ++ struct cnic_local *cp = dev->cnic_priv; ++ ++ clear_bit(ULP_F_INIT, &cp->ulp_flags[ulp_type]); ++ } ++#ifndef __VMKLNX__ ++ read_unlock(&cnic_dev_lock); ++#endif ++ ++ rcu_assign_pointer(cnic_ulp_tbl[ulp_type], ulp_ops); ++ mutex_unlock(&cnic_lock); ++ ++ /* Prevent race conditions with netdev_event */ ++#ifndef __VMKLNX__ ++ rtnl_lock(); ++ read_lock(&cnic_dev_lock); ++#endif ++ list_for_each_entry(dev, &cnic_dev_list, list) { ++ struct cnic_local *cp = dev->cnic_priv; ++ ++ if (!test_and_set_bit(ULP_F_INIT, &cp->ulp_flags[ulp_type])) ++ ulp_ops->cnic_init(dev); ++ } ++#ifndef __VMKLNX__ ++ read_unlock(&cnic_dev_lock); ++ rtnl_unlock(); ++#endif ++ ++ return 0; ++} ++ ++int cnic_unregister_driver(int ulp_type) ++{ ++ struct cnic_dev *dev; ++ ++ if (ulp_type >= MAX_CNIC_ULP_TYPE) { ++ printk(KERN_ERR PFX "cnic_unregister_driver: Bad type %d\n", ++ ulp_type); ++ return -EINVAL; ++ } ++ mutex_lock(&cnic_lock); ++ if (!cnic_ulp_tbl[ulp_type]) { ++ printk(KERN_ERR PFX "cnic_unregister_driver: Type %d has not " ++ "been registered\n", ulp_type); ++ goto out_unlock; ++ } ++#ifndef __VMKLNX__ ++ read_lock(&cnic_dev_lock); ++#endif ++ list_for_each_entry(dev, &cnic_dev_list, list) { ++ struct cnic_local *cp = dev->cnic_priv; ++ ++ if (rcu_dereference(cp->ulp_ops[ulp_type])) { ++ printk(KERN_ERR PFX "cnic_unregister_driver: Type %d " ++ "still has devices registered\n", ulp_type); ++#ifndef __VMKLNX__ ++ read_unlock(&cnic_dev_lock); ++#endif ++ goto out_unlock; ++ } ++ } ++#ifndef __VMKLNX__ ++ read_unlock(&cnic_dev_lock); ++#endif ++ ++ rcu_assign_pointer(cnic_ulp_tbl[ulp_type], NULL); ++ ++ mutex_unlock(&cnic_lock); ++#ifndef __VMKLNX__ ++ synchronize_rcu(); ++#endif ++ return 0; ++ ++out_unlock: ++ mutex_unlock(&cnic_lock); ++ return -EINVAL; ++} ++ ++EXPORT_SYMBOL(cnic_register_driver); ++EXPORT_SYMBOL(cnic_unregister_driver); ++ ++static int cnic_start_hw(struct cnic_dev *); ++static void cnic_stop_hw(struct cnic_dev *); ++ ++static int cnic_register_device(struct cnic_dev *dev, int ulp_type, ++ void *ulp_ctx) ++{ ++ struct cnic_local *cp = dev->cnic_priv; ++ struct cnic_ulp_ops *ulp_ops; ++ ++ if (ulp_type >= MAX_CNIC_ULP_TYPE) { ++ printk(KERN_ERR PFX "cnic_register_device: Bad type %d\n", ++ ulp_type); ++ return -EINVAL; ++ } ++ mutex_lock(&cnic_lock); ++ if (cnic_ulp_tbl[ulp_type] == NULL) { ++ printk(KERN_ERR PFX "cnic_register_device: Driver with type %d " ++ "has not been registered\n", ulp_type); ++ mutex_unlock(&cnic_lock); ++ return -EAGAIN; ++ } ++ if (rcu_dereference(cp->ulp_ops[ulp_type])) { ++ printk(KERN_ERR PFX "cnic_register_device: Type %d has already " ++ "been registered to this device\n", ulp_type); ++ mutex_unlock(&cnic_lock); ++ return -EBUSY; ++ } ++#ifndef __VMKLNX__ ++ if (!try_module_get(cnic_ulp_tbl[ulp_type]->owner)) { ++ mutex_unlock(&cnic_lock); ++ return -EBUSY; ++ } ++#endif ++ ++ clear_bit(ULP_F_START, &cp->ulp_flags[ulp_type]); ++ cp->ulp_handle[ulp_type] = ulp_ctx; ++ ulp_ops = cnic_ulp_tbl[ulp_type]; ++ rcu_assign_pointer(cp->ulp_ops[ulp_type], ulp_ops); ++ cnic_hold(dev); ++ if (!dev->use_count) { ++ if (!test_bit(CNIC_F_IF_GOING_DOWN, &dev->flags)) { ++ if (dev->netdev->flags & IFF_UP) ++ set_bit(CNIC_F_IF_UP, &dev->flags); ++ } ++ } ++ dev->use_count++; ++ ++ if (dev->use_count == 1) { ++ if (test_bit(CNIC_F_IF_UP, &dev->flags)) ++ cnic_start_hw(dev); ++ } ++ ++ if (test_bit(CNIC_F_CNIC_UP, &dev->flags)) ++ if (!test_and_set_bit(ULP_F_START, &cp->ulp_flags[ulp_type])) ++ ulp_ops->cnic_start(cp->ulp_handle[ulp_type]); ++ ++ mutex_unlock(&cnic_lock); ++ ++ return 0; ++ ++} ++ ++static int cnic_unregister_device(struct cnic_dev *dev, int ulp_type) ++{ ++ struct cnic_local *cp = dev->cnic_priv; ++ ++ if (ulp_type >= MAX_CNIC_ULP_TYPE) { ++ printk(KERN_ERR PFX "cnic_unregister_device: Bad type %d\n", ++ ulp_type); ++ return -EINVAL; ++ } ++ mutex_lock(&cnic_lock); ++ if (rcu_dereference(cp->ulp_ops[ulp_type])) { ++ dev->use_count--; ++#ifndef __VMKLNX__ ++ module_put(cp->ulp_ops[ulp_type]->owner); ++#endif ++ rcu_assign_pointer(cp->ulp_ops[ulp_type], NULL); ++ if (dev->use_count == 0) { ++ cnic_stop_hw(dev); ++#ifdef __VMKLNX__ ++ if (cp->first_iscsiNetHandle.ptr) { ++ vmk_IscsiNetTcpPortFree( ++ cp->first_iscsiNetHandle, ++ &cp->cnic_local_port_nr, ++ &cp->cnic_local_port_min); ++ } ++#endif ++ } ++ cnic_put(dev); ++ } else { ++ printk(KERN_ERR PFX "cnic_unregister_device: device not " ++ "registered to this ulp type %d\n", ulp_type); ++ mutex_unlock(&cnic_lock); ++ return -EINVAL; ++ } ++ mutex_unlock(&cnic_lock); ++ ++#ifndef __VMKLNX__ ++ synchronize_rcu(); ++#endif ++ ++ return 0; ++} ++ ++static int cnic_init_id_tbl(struct cnic_id_tbl *id_tbl, u32 size, u32 start_id, ++ u32 next) ++{ ++ id_tbl->start = start_id; ++ id_tbl->max = size; ++ id_tbl->next = next; ++ spin_lock_init(&id_tbl->lock); ++ id_tbl->table = kzalloc(DIV_ROUND_UP(size, 32) * 4, GFP_KERNEL); ++ if (!id_tbl->table) ++ return -ENOMEM; ++ ++ return 0; ++} ++ ++static u32 cnic_free_id_tbl(struct cnic_id_tbl *id_tbl) ++{ ++ kfree(id_tbl->table); ++ id_tbl->table = NULL; ++ return id_tbl->next; ++} ++ ++/* Returns -1 if not successful */ ++static u32 cnic_alloc_new_id(struct cnic_id_tbl *id_tbl) ++{ ++ u32 id; ++ ++ spin_lock(&id_tbl->lock); ++ id = find_next_zero_bit(id_tbl->table, id_tbl->max, id_tbl->next); ++ if (id >= id_tbl->max) { ++ id = -1; ++ if (id_tbl->next != 0) { ++ id = find_first_zero_bit(id_tbl->table, id_tbl->next); ++ if (id >= id_tbl->next) ++ id = -1; ++ } ++ } ++ ++ if (id < id_tbl->max) { ++ set_bit(id, id_tbl->table); ++ id_tbl->next = (id + 1) & (id_tbl->max - 1); ++ id += id_tbl->start; ++ } ++ ++ spin_unlock(&id_tbl->lock); ++ ++ return id; ++} ++ ++void cnic_free_id(struct cnic_id_tbl *id_tbl, u32 id) ++{ ++ if (id == -1) ++ return; ++ ++ id -= id_tbl->start; ++ if (id >= id_tbl->max) ++ return; ++ ++ clear_bit(id, id_tbl->table); ++} ++ ++static void cnic_free_dma(struct cnic_dev *dev, struct cnic_dma *dma) ++{ ++ int i; ++ ++ if (!dma->pg_arr) ++ return; ++ ++ for (i = 0; i < dma->num_pages; i++) { ++ if (dma->pg_arr[i]) { ++ pci_free_consistent(dev->pcidev, BCM_PAGE_SIZE, ++ dma->pg_arr[i], dma->pg_map_arr[i]); ++ dma->pg_arr[i] = NULL; ++ } ++ } ++ if (dma->pgtbl) { ++ pci_free_consistent(dev->pcidev, dma->pgtbl_size, ++ dma->pgtbl, dma->pgtbl_map); ++ dma->pgtbl = NULL; ++ } ++ kfree(dma->pg_arr); ++ dma->pg_arr = NULL; ++ dma->num_pages = 0; ++} ++ ++static void cnic_setup_page_tbl(struct cnic_dev *dev, struct cnic_dma *dma) ++{ ++ int i; ++ u32 *page_table = dma->pgtbl; ++ ++ for (i = 0; i < dma->num_pages; i++) { ++ /* Each entry needs to be in big endian format. */ ++ *page_table = (u32) ((u64) dma->pg_map_arr[i] >> 32); ++ page_table++; ++ *page_table = (u32) dma->pg_map_arr[i]; ++ page_table++; ++ } ++} ++ ++static void cnic_setup_page_tbl_le(struct cnic_dev *dev, struct cnic_dma *dma) ++{ ++ int i; ++ u32 *page_table = dma->pgtbl; ++ ++ for (i = 0; i < dma->num_pages; i++) { ++ /* Each entry needs to be in little endian format. */ ++ *page_table = dma->pg_map_arr[i] & 0xffffffff; ++ page_table++; ++ *page_table = (u32) ((u64) dma->pg_map_arr[i] >> 32); ++ page_table++; ++ } ++} ++ ++static int cnic_alloc_dma(struct cnic_dev *dev, struct cnic_dma *dma, ++ int pages, int use_pg_tbl) ++{ ++ int i, size; ++ struct cnic_local *cp = dev->cnic_priv; ++ ++ size = pages * (sizeof(void *) + sizeof(dma_addr_t)); ++ dma->pg_arr = kzalloc(size, GFP_ATOMIC); ++ if (dma->pg_arr == NULL) ++ return -ENOMEM; ++ ++ dma->pg_map_arr = (dma_addr_t *) (dma->pg_arr + pages); ++ dma->num_pages = pages; ++ ++ for (i = 0; i < pages; i++) { ++ dma->pg_arr[i] = pci_alloc_consistent(dev->pcidev, ++ BCM_PAGE_SIZE, ++ &dma->pg_map_arr[i]); ++ if (dma->pg_arr[i] == NULL) ++ goto error; ++ } ++ if (!use_pg_tbl) ++ return 0; ++ ++ dma->pgtbl_size = ((pages * 8) + BCM_PAGE_SIZE - 1) & ++ ~(BCM_PAGE_SIZE - 1); ++ dma->pgtbl = pci_alloc_consistent(dev->pcidev, dma->pgtbl_size, ++ &dma->pgtbl_map); ++ if (dma->pgtbl == NULL) ++ goto error; ++ ++ cp->setup_pgtbl(dev, dma); ++ ++ return 0; ++ ++error: ++ cnic_free_dma(dev, dma); ++ return -ENOMEM; ++} ++ ++static void cnic_free_contex(struct cnic_dev *dev) ++{ ++ struct cnic_local *cp = dev->cnic_priv; ++ int i; ++ ++ for (i = 0; i < cp->ctx_blks; i++) { ++ if (cp->ctx_arr[i].ctx) { ++ pci_free_consistent(dev->pcidev, cp->ctx_blk_size, ++ cp->ctx_arr[i].ctx, ++ cp->ctx_arr[i].mapping); ++ cp->ctx_arr[i].ctx = NULL; ++ } ++ } ++} ++ ++static void cnic_free_resc(struct cnic_dev *dev) ++{ ++ struct cnic_local *cp = dev->cnic_priv; ++ ++ cnic_free_contex(dev); ++ kfree(cp->ctx_arr); ++ cp->ctx_arr = NULL; ++ cp->ctx_blks = 0; ++ ++ cnic_free_dma(dev, &cp->gbl_buf_info); ++ cnic_free_dma(dev, &cp->conn_buf_info); ++ cnic_free_dma(dev, &cp->kwq_info); ++ cnic_free_dma(dev, &cp->kwq_16_data_info); ++ cnic_free_dma(dev, &cp->kcq_info); ++ kfree(cp->iscsi_tbl); ++ cp->iscsi_tbl = NULL; ++ kfree(cp->ctx_tbl); ++ cp->ctx_tbl = NULL; ++ ++ cnic_free_id_tbl(&cp->cid_tbl); ++} ++ ++static int cnic_alloc_context(struct cnic_dev *dev) ++{ ++ struct cnic_local *cp = dev->cnic_priv; ++ ++ if (CHIP_NUM(cp) == CHIP_NUM_5709) { ++ int i, k, arr_size; ++ ++ cp->ctx_blk_size = BCM_PAGE_SIZE; ++ cp->cids_per_blk = BCM_PAGE_SIZE / 128; ++ arr_size = BNX2_MAX_CID / cp->cids_per_blk * ++ sizeof(struct cnic_ctx); ++ cp->ctx_arr = kmalloc(arr_size, GFP_KERNEL); ++ if (cp->ctx_arr == NULL) ++ return -ENOMEM; ++ ++ memset(cp->ctx_arr, 0, arr_size); ++ ++ k = 0; ++ for (i = 0; i < 2; i++) { ++ u32 j, reg, off, lo, hi; ++ ++ if (i == 0) ++ off = BNX2_PG_CTX_MAP; ++ else ++ off = BNX2_ISCSI_CTX_MAP; ++ ++ reg = cnic_reg_rd_ind(dev, off); ++ lo = reg >> 16; ++ hi = reg & 0xffff; ++ for (j = lo; j < hi; j += cp->cids_per_blk, k++) ++ cp->ctx_arr[k].cid = j; ++ } ++ ++ cp->ctx_blks = k; ++ if (cp->ctx_blks >= (BNX2_MAX_CID / cp->cids_per_blk)) { ++ cp->ctx_blks = 0; ++ return -ENOMEM; ++ } ++ ++ for (i = 0; i < cp->ctx_blks; i++) { ++ cp->ctx_arr[i].ctx = ++ pci_alloc_consistent(dev->pcidev, BCM_PAGE_SIZE, ++ &cp->ctx_arr[i].mapping); ++ if (cp->ctx_arr[i].ctx == NULL) ++ return -ENOMEM; ++ } ++ } ++ return 0; ++} ++ ++static int cnic_alloc_bnx2_resc(struct cnic_dev *dev) ++{ ++ struct cnic_local *cp = dev->cnic_priv; ++ int ret; ++ ++ ret = cnic_alloc_dma(dev, &cp->kwq_info, KWQ_PAGE_CNT, 1); ++ if (ret) ++ goto error; ++ cp->kwq = (struct kwqe **) cp->kwq_info.pg_arr; ++ ++ ret = cnic_alloc_dma(dev, &cp->kcq_info, KCQ_PAGE_CNT, 1); ++ if (ret) ++ goto error; ++ cp->kcq = (struct kcqe **) cp->kcq_info.pg_arr; ++ ++ ret = cnic_alloc_context(dev); ++ if (ret) ++ goto error; ++ ++ return 0; ++ ++error: ++ cnic_free_resc(dev); ++ return ret; ++} ++ ++static int cnic_alloc_bnx2x_context(struct cnic_dev *dev) ++{ ++ struct cnic_local *cp = dev->cnic_priv; ++ int ctx_blk_size = cp->ethdev->ctx_blk_size; ++ int total_mem, blks, i; ++ ++ total_mem = BNX2X_ISCSI_CONTEXT_MEM_SIZE * MAX_ISCSI_TBL_SZ; ++ blks = total_mem / ctx_blk_size; ++ if (total_mem % ctx_blk_size) ++ blks++; ++ ++ if (blks > cp->ethdev->ctx_tbl_len) ++ return -ENOMEM; ++ ++ cp->ctx_arr = kzalloc(blks * sizeof(struct cnic_ctx), GFP_KERNEL); ++ if (cp->ctx_arr == NULL) ++ return -ENOMEM; ++ ++ cp->ctx_blks = blks; ++ cp->ctx_blk_size = ctx_blk_size; ++ if (BNX2X_CHIP_IS_E1H(cp->chip_id)) ++ cp->ctx_align = 0; ++ else ++ cp->ctx_align = ctx_blk_size; ++ ++ cp->cids_per_blk = ctx_blk_size / BNX2X_ISCSI_CONTEXT_MEM_SIZE; ++ ++ for (i = 0; i < blks; i++) { ++ cp->ctx_arr[i].ctx = ++ pci_alloc_consistent(dev->pcidev, cp->ctx_blk_size, ++ &cp->ctx_arr[i].mapping); ++ if (cp->ctx_arr[i].ctx == NULL) ++ return -ENOMEM; ++ ++ if (cp->ctx_align && cp->ctx_blk_size == ctx_blk_size) { ++ if (cp->ctx_arr[i].mapping & (cp->ctx_align - 1)) { ++ cnic_free_contex(dev); ++ cp->ctx_blk_size += cp->ctx_align; ++ i = -1; ++ continue; ++ } ++ } ++ } ++ return 0; ++} ++ ++static int cnic_alloc_bnx2x_resc(struct cnic_dev *dev) ++{ ++ struct cnic_local *cp = dev->cnic_priv; ++ int i, j, n, ret, pages; ++ struct cnic_dma *kwq_16_dma = &cp->kwq_16_data_info; ++ ++ cp->iscsi_tbl = kzalloc(sizeof(struct cnic_iscsi) * MAX_ISCSI_TBL_SZ, ++ GFP_KERNEL); ++ if (!cp->iscsi_tbl) ++ goto error; ++ ++ cp->ctx_tbl = kzalloc(sizeof(struct cnic_context) * ++ MAX_CNIC_L5_CONTEXT, GFP_KERNEL); ++ if (!cp->ctx_tbl) ++ goto error; ++ ++ for (i = 0; i < MAX_ISCSI_TBL_SZ; i++) { ++ cp->ctx_tbl[i].proto.iscsi = &cp->iscsi_tbl[i]; ++ cp->ctx_tbl[i].ulp_proto_id = CNIC_ULP_ISCSI; ++ } ++ ++ pages = PAGE_ALIGN(MAX_CNIC_L5_CONTEXT * CNIC_KWQ16_DATA_SIZE) / ++ PAGE_SIZE; ++ ++ ret = cnic_alloc_dma(dev, kwq_16_dma, pages, 0); ++ if (ret) ++ return -ENOMEM; ++ ++ n = PAGE_SIZE / CNIC_KWQ16_DATA_SIZE; ++ for (i = 0, j = 0; i < MAX_ISCSI_TBL_SZ; i++) { ++ long off = CNIC_KWQ16_DATA_SIZE * (i % n); ++ ++ cp->ctx_tbl[i].kwqe_data = kwq_16_dma->pg_arr[j] + off; ++ cp->ctx_tbl[i].kwqe_data_mapping = kwq_16_dma->pg_map_arr[j] + ++ off; ++ ++ if ((i % n) == (n - 1)) ++ j++; ++ } ++ ++ ret = cnic_alloc_dma(dev, &cp->kcq_info, KCQ_PAGE_CNT, 0); ++ if (ret) ++ goto error; ++ cp->kcq = (struct kcqe **) cp->kcq_info.pg_arr; ++ ++ for (i = 0; i < KCQ_PAGE_CNT; i++) { ++ struct bnx2x_bd_chain_next *next = ++ (struct bnx2x_bd_chain_next *) ++ &cp->kcq[i][MAX_KCQE_CNT]; ++ int j = i + 1; ++ ++ if (j >= KCQ_PAGE_CNT) ++ j = 0; ++ next->addr_hi = (u64) cp->kcq_info.pg_map_arr[j] >> 32; ++ next->addr_lo = cp->kcq_info.pg_map_arr[j] & 0xffffffff; ++ } ++ ++ pages = PAGE_ALIGN(BNX2X_ISCSI_NUM_CONNECTIONS * ++ BNX2X_ISCSI_CONN_BUF_SIZE) / PAGE_SIZE; ++ ret = cnic_alloc_dma(dev, &cp->conn_buf_info, pages, 1); ++ if (ret) ++ goto error; ++ ++ pages = PAGE_ALIGN(BNX2X_ISCSI_GLB_BUF_SIZE) / PAGE_SIZE; ++ ret = cnic_alloc_dma(dev, &cp->gbl_buf_info, pages, 0); ++ if (ret) ++ goto error; ++ ++ ret = cnic_alloc_bnx2x_context(dev); ++ if (ret) ++ goto error; ++ ++ return 0; ++ ++error: ++ cnic_free_resc(dev); ++ return -ENOMEM; ++} ++ ++static inline u32 cnic_kwq_avail(struct cnic_local *cp) ++{ ++ return (cp->max_kwq_idx - ++ ((cp->kwq_prod_idx - cp->kwq_con_idx) & cp->max_kwq_idx)); ++} ++ ++static int cnic_submit_bnx2_kwqes(struct cnic_dev *dev, struct kwqe *wqes[], ++ u32 num_wqes) ++{ ++ struct cnic_local *cp = dev->cnic_priv; ++ struct kwqe *prod_qe; ++ u16 prod, sw_prod, i; ++ ++ if (!test_bit(CNIC_F_CNIC_UP, &dev->flags)) ++ return -EAGAIN; /* bnx2 is down */ ++ ++ spin_lock_bh(&cp->cnic_ulp_lock); ++ if (num_wqes > cnic_kwq_avail(cp) && ++ !(cp->cnic_local_flags & CNIC_LCL_FL_KWQ_INIT)) { ++ spin_unlock_bh(&cp->cnic_ulp_lock); ++ return -EAGAIN; ++ } ++ ++ cp->cnic_local_flags &= ~CNIC_LCL_FL_KWQ_INIT; ++ ++ prod = cp->kwq_prod_idx; ++ sw_prod = prod & MAX_KWQ_IDX; ++ for (i = 0; i < num_wqes; i++) { ++ prod_qe = &cp->kwq[KWQ_PG(sw_prod)][KWQ_IDX(sw_prod)]; ++ memcpy(prod_qe, wqes[i], sizeof(struct kwqe)); ++ prod++; ++ sw_prod = prod & MAX_KWQ_IDX; ++ } ++ cp->kwq_prod_idx = prod; ++ ++ CNIC_WR16(dev, cp->kwq_io_addr, cp->kwq_prod_idx); ++ ++ spin_unlock_bh(&cp->cnic_ulp_lock); ++ return 0; ++} ++ ++static void *cnic_get_kwqe_16_data(struct cnic_local *cp, u32 l5_cid, ++ union l5cm_specific_data *l5_data) ++{ ++ struct cnic_context *ctx = &cp->ctx_tbl[l5_cid]; ++ dma_addr_t map; ++ ++ map = ctx->kwqe_data_mapping; ++ l5_data->phy_address.lo = (u64) map & 0xffffffff; ++ l5_data->phy_address.hi = (u64) map >> 32; ++ return ctx->kwqe_data; ++} ++ ++static int cnic_submit_kwqe_16(struct cnic_dev *dev, u32 cmd, u32 cid, ++ u32 type, union l5cm_specific_data *l5_data) ++{ ++ struct cnic_local *cp = dev->cnic_priv; ++ struct l5cm_spe kwqe; ++ struct kwqe_16 *kwq[1]; ++ int ret; ++ ++ kwqe.hdr.conn_and_cmd_data = ++ cpu_to_le32(((cmd << SPE_HDR_CMD_ID_SHIFT) | ++ BNX2X_HW_CID(cid, cp->func))); ++ kwqe.hdr.type = cpu_to_le16(type); ++ kwqe.hdr.reserved = 0; ++ kwqe.data.phy_address.lo = cpu_to_le32(l5_data->phy_address.lo); ++ kwqe.data.phy_address.hi = cpu_to_le32(l5_data->phy_address.hi); ++ ++ kwq[0] = (struct kwqe_16 *) &kwqe; ++ spin_lock_bh(&cp->cnic_ulp_lock); ++ ret = cp->ethdev->drv_submit_kwqes_16(dev->netdev, kwq, 1); ++ spin_unlock_bh(&cp->cnic_ulp_lock); ++ ++ if (ret == 1) ++ return 0; ++ ++ return -EBUSY; ++} ++ ++static void cnic_reply_bnx2x_kcqes(struct cnic_dev *dev, int ulp_type, ++ struct kcqe *cqes[], u32 num_cqes) ++{ ++ struct cnic_local *cp = dev->cnic_priv; ++ struct cnic_ulp_ops *ulp_ops; ++ ++ rcu_read_lock(); ++ ulp_ops = rcu_dereference(cp->ulp_ops[ulp_type]); ++ if (likely(ulp_ops)) { ++ ulp_ops->indicate_kcqes(cp->ulp_handle[ulp_type], ++ cqes, num_cqes); ++ } ++ rcu_read_unlock(); ++} ++ ++static int cnic_bnx2x_iscsi_init1(struct cnic_dev *dev, struct kwqe *kwqe) ++{ ++ struct cnic_local *cp = dev->cnic_priv; ++ struct iscsi_kwqe_init1 *req1 = (struct iscsi_kwqe_init1 *) kwqe; ++ int func = cp->func, pages; ++ int hq_bds; ++ ++ cp->num_iscsi_tasks = req1->num_tasks_per_conn; ++ cp->num_ccells = req1->num_ccells_per_conn; ++ cp->task_array_size = BNX2X_ISCSI_TASK_CONTEXT_SIZE * ++ cp->num_iscsi_tasks; ++ cp->r2tq_size = cp->num_iscsi_tasks * BNX2X_ISCSI_MAX_PENDING_R2TS * ++ BNX2X_ISCSI_R2TQE_SIZE; ++ cp->hq_size = cp->num_ccells * BNX2X_ISCSI_HQ_BD_SIZE; ++ pages = PAGE_ALIGN(cp->hq_size) / PAGE_SIZE; ++ hq_bds = pages * (PAGE_SIZE / BNX2X_ISCSI_HQ_BD_SIZE); ++ cp->num_cqs = req1->num_cqs; ++ ++ if (!dev->max_iscsi_conn) ++ return 0; ++ ++ /* init Tstorm RAM */ ++ CNIC_WR16(dev, BAR_TSTRORM_INTMEM + TSTORM_ISCSI_RQ_SIZE_OFFSET(func), ++ req1->rq_num_wqes); ++ CNIC_WR16(dev, BAR_TSTRORM_INTMEM + TSTORM_ISCSI_PAGE_SIZE_OFFSET(func), ++ PAGE_SIZE); ++ CNIC_WR8(dev, BAR_TSTRORM_INTMEM + ++ TSTORM_ISCSI_PAGE_SIZE_LOG_OFFSET(func), PAGE_SHIFT); ++ CNIC_WR16(dev, BAR_TSTRORM_INTMEM + ++ TSTORM_ISCSI_NUM_OF_TASKS_OFFSET(func), ++ req1->num_tasks_per_conn); ++ ++ /* init Ustorm RAM */ ++ CNIC_WR16(dev, BAR_USTRORM_INTMEM + ++ USTORM_ISCSI_RQ_BUFFER_SIZE_OFFSET(func), ++ req1->rq_buffer_size); ++ CNIC_WR16(dev, BAR_USTRORM_INTMEM + USTORM_ISCSI_PAGE_SIZE_OFFSET(func), ++ PAGE_SIZE); ++ CNIC_WR8(dev, BAR_USTRORM_INTMEM + ++ USTORM_ISCSI_PAGE_SIZE_LOG_OFFSET(func), PAGE_SHIFT); ++ CNIC_WR16(dev, BAR_USTRORM_INTMEM + ++ USTORM_ISCSI_NUM_OF_TASKS_OFFSET(func), ++ req1->num_tasks_per_conn); ++ CNIC_WR16(dev, BAR_USTRORM_INTMEM + USTORM_ISCSI_RQ_SIZE_OFFSET(func), ++ req1->rq_num_wqes); ++ CNIC_WR16(dev, BAR_USTRORM_INTMEM + USTORM_ISCSI_CQ_SIZE_OFFSET(func), ++ req1->cq_num_wqes); ++ CNIC_WR16(dev, BAR_USTRORM_INTMEM + USTORM_ISCSI_R2TQ_SIZE_OFFSET(func), ++ cp->num_iscsi_tasks * BNX2X_ISCSI_MAX_PENDING_R2TS); ++ ++ /* init Xstorm RAM */ ++ CNIC_WR16(dev, BAR_XSTRORM_INTMEM + XSTORM_ISCSI_PAGE_SIZE_OFFSET(func), ++ PAGE_SIZE); ++ CNIC_WR8(dev, BAR_XSTRORM_INTMEM + ++ XSTORM_ISCSI_PAGE_SIZE_LOG_OFFSET(func), PAGE_SHIFT); ++ CNIC_WR16(dev, BAR_XSTRORM_INTMEM + ++ XSTORM_ISCSI_NUM_OF_TASKS_OFFSET(func), ++ req1->num_tasks_per_conn); ++ CNIC_WR16(dev, BAR_XSTRORM_INTMEM + XSTORM_ISCSI_HQ_SIZE_OFFSET(func), ++ hq_bds); ++ CNIC_WR16(dev, BAR_XSTRORM_INTMEM + XSTORM_ISCSI_SQ_SIZE_OFFSET(func), ++ req1->num_tasks_per_conn); ++ CNIC_WR16(dev, BAR_XSTRORM_INTMEM + XSTORM_ISCSI_R2TQ_SIZE_OFFSET(func), ++ cp->num_iscsi_tasks * BNX2X_ISCSI_MAX_PENDING_R2TS); ++ ++ /* init Cstorm RAM */ ++ CNIC_WR16(dev, BAR_CSTRORM_INTMEM + CSTORM_ISCSI_PAGE_SIZE_OFFSET(func), ++ PAGE_SIZE); ++ CNIC_WR8(dev, BAR_CSTRORM_INTMEM + ++ CSTORM_ISCSI_PAGE_SIZE_LOG_OFFSET(func), PAGE_SHIFT); ++ CNIC_WR16(dev, BAR_CSTRORM_INTMEM + ++ CSTORM_ISCSI_NUM_OF_TASKS_OFFSET(func), ++ req1->num_tasks_per_conn); ++ CNIC_WR16(dev, BAR_CSTRORM_INTMEM + CSTORM_ISCSI_CQ_SIZE_OFFSET(func), ++ req1->cq_num_wqes); ++ CNIC_WR16(dev, BAR_CSTRORM_INTMEM + CSTORM_ISCSI_HQ_SIZE_OFFSET(func), ++ hq_bds); ++ ++ return 0; ++} ++ ++static int cnic_bnx2x_iscsi_init2(struct cnic_dev *dev, struct kwqe *kwqe) ++{ ++ struct iscsi_kwqe_init2 *req2 = (struct iscsi_kwqe_init2 *) kwqe; ++ struct cnic_local *cp = dev->cnic_priv; ++ int func = cp->func; ++ struct iscsi_kcqe kcqe; ++ struct kcqe *cqes[1]; ++ ++ memset(&kcqe, 0, sizeof(kcqe)); ++ if (!dev->max_iscsi_conn) { ++ kcqe.completion_status = ++ ISCSI_KCQE_COMPLETION_STATUS_ISCSI_NOT_SUPPORTED; ++ goto done; ++ } ++ ++ CNIC_WR(dev, BAR_TSTRORM_INTMEM + ++ TSTORM_ISCSI_ERROR_BITMAP_OFFSET(func), req2->error_bit_map[0]); ++ CNIC_WR(dev, BAR_TSTRORM_INTMEM + ++ TSTORM_ISCSI_ERROR_BITMAP_OFFSET(func) + 4, ++ req2->error_bit_map[1]); ++ ++ CNIC_WR16(dev, BAR_USTRORM_INTMEM + ++ USTORM_ISCSI_CQ_SQN_SIZE_OFFSET(func), req2->max_cq_sqn); ++ CNIC_WR(dev, BAR_USTRORM_INTMEM + ++ USTORM_ISCSI_ERROR_BITMAP_OFFSET(func), req2->error_bit_map[0]); ++ CNIC_WR(dev, BAR_USTRORM_INTMEM + ++ USTORM_ISCSI_ERROR_BITMAP_OFFSET(func) + 4, ++ req2->error_bit_map[1]); ++ ++ CNIC_WR16(dev, BAR_CSTRORM_INTMEM + ++ CSTORM_ISCSI_CQ_SQN_SIZE_OFFSET(func), req2->max_cq_sqn); ++ ++ kcqe.completion_status = ISCSI_KCQE_COMPLETION_STATUS_SUCCESS; ++ ++done: ++ kcqe.op_code = ISCSI_KCQE_OPCODE_INIT; ++ cqes[0] = (struct kcqe *) &kcqe; ++ cnic_reply_bnx2x_kcqes(dev, CNIC_ULP_ISCSI, cqes, 1); ++ ++ return 0; ++} ++ ++static void cnic_free_bnx2x_conn_resc(struct cnic_dev *dev, u32 l5_cid) ++{ ++ struct cnic_local *cp = dev->cnic_priv; ++ struct cnic_context *ctx = &cp->ctx_tbl[l5_cid]; ++ ++ if (ctx->ulp_proto_id == CNIC_ULP_ISCSI) { ++ struct cnic_iscsi *iscsi = ctx->proto.iscsi; ++ ++ cnic_free_dma(dev, &iscsi->hq_info); ++ cnic_free_dma(dev, &iscsi->r2tq_info); ++ cnic_free_dma(dev, &iscsi->task_array_info); ++ } ++ cnic_free_id(&cp->cid_tbl, ctx->cid); ++ ctx->cid = 0; ++} ++ ++static int cnic_alloc_bnx2x_conn_resc(struct cnic_dev *dev, u32 l5_cid) ++{ ++ u32 cid; ++ int ret, pages; ++ struct cnic_local *cp = dev->cnic_priv; ++ struct cnic_context *ctx = &cp->ctx_tbl[l5_cid]; ++ struct cnic_iscsi *iscsi = ctx->proto.iscsi; ++ ++ cid = cnic_alloc_new_id(&cp->cid_tbl); ++ if (cid == -1) { ++ ret = -ENOMEM; ++ goto error; ++ } ++ ++ ctx->cid = cid; ++ pages = PAGE_ALIGN(cp->task_array_size) / PAGE_SIZE; ++ ++ ret = cnic_alloc_dma(dev, &iscsi->task_array_info, pages, 1); ++ if (ret) ++ goto error; ++ ++ pages = PAGE_ALIGN(cp->r2tq_size) / PAGE_SIZE; ++ ret = cnic_alloc_dma(dev, &iscsi->r2tq_info, pages, 1); ++ if (ret) ++ goto error; ++ ++ pages = PAGE_ALIGN(cp->hq_size) / PAGE_SIZE; ++ ret = cnic_alloc_dma(dev, &iscsi->hq_info, pages, 1); ++ if (ret) ++ goto error; ++ ++ return 0; ++ ++error: ++ cnic_free_bnx2x_conn_resc(dev, l5_cid); ++ return ret; ++} ++ ++static struct iscsi_context *cnic_get_bnx2x_ctx(struct cnic_dev *dev, u32 cid, ++ int init, ++ struct regpair *ctx_addr) ++{ ++ struct cnic_local *cp = dev->cnic_priv; ++ struct cnic_eth_dev *ethdev = cp->ethdev; ++ int blk = (cid - ethdev->starting_cid) / cp->cids_per_blk; ++ int off = (cid - ethdev->starting_cid) % cp->cids_per_blk; ++ unsigned long align_off = 0; ++ dma_addr_t ctx_map; ++ struct iscsi_context *ctx; ++ ++ if (cp->ctx_align) { ++ unsigned long mask = cp->ctx_align - 1; ++ ++ if (cp->ctx_arr[blk].mapping & mask) ++ align_off = cp->ctx_align - ++ (cp->ctx_arr[blk].mapping & mask); ++ } ++ ctx_map = cp->ctx_arr[blk].mapping + align_off + ++ (off * BNX2X_ISCSI_CONTEXT_MEM_SIZE); ++ ctx = (struct iscsi_context *) (cp->ctx_arr[blk].ctx + align_off + ++ (off * BNX2X_ISCSI_CONTEXT_MEM_SIZE)); ++ if (init) ++ memset(ctx, 0, sizeof(*ctx)); ++ ++ ctx_addr->lo = ctx_map & 0xffffffff; ++ ctx_addr->hi = (u64) ctx_map >> 32; ++ return ctx; ++} ++ ++static int cnic_setup_bnx2x_ctx(struct cnic_dev *dev, struct kwqe *wqes[], ++ u32 num) ++{ ++ struct cnic_local *cp = dev->cnic_priv; ++ struct iscsi_kwqe_conn_offload1 *req1 = ++ (struct iscsi_kwqe_conn_offload1 *) wqes[0]; ++ struct iscsi_kwqe_conn_offload2 *req2 = ++ (struct iscsi_kwqe_conn_offload2 *) wqes[1]; ++ struct iscsi_kwqe_conn_offload3 *req3; ++ struct cnic_context *ctx = &cp->ctx_tbl[req1->iscsi_conn_id]; ++ struct cnic_iscsi *iscsi = ctx->proto.iscsi; ++ u32 cid = ctx->cid; ++ u32 hw_cid = BNX2X_HW_CID(cid, cp->func); ++ struct iscsi_context *ictx; ++ struct regpair context_addr; ++ int i, j, n = 2, n_max; ++ ++ ctx->ctx_flags = 0; ++ if (!req2->num_additional_wqes) ++ return -EINVAL; ++ ++ n_max = req2->num_additional_wqes + 2; ++ ++ ictx = cnic_get_bnx2x_ctx(dev, cid, 1, &context_addr); ++ if (ictx == NULL) ++ return -ENOMEM; ++ ++ req3 = (struct iscsi_kwqe_conn_offload3 *) wqes[n++]; ++ ++ ictx->xstorm_ag_context.hq_prod = 1; ++ ++ ictx->xstorm_st_context.iscsi.first_burst_length = ++ ISCSI_DEFAULT_FIRST_BURST_LENGTH; ++ ictx->xstorm_st_context.iscsi.max_send_pdu_length = ++ ISCSI_DEFAULT_MAX_PDU_LENGTH; ++ ictx->xstorm_st_context.iscsi.sq_pbl_base.lo = ++ req1->sq_page_table_addr_lo; ++ ictx->xstorm_st_context.iscsi.sq_pbl_base.hi = ++ req1->sq_page_table_addr_hi; ++ ictx->xstorm_st_context.iscsi.sq_curr_pbe.lo = req2->sq_first_pte.hi; ++ ictx->xstorm_st_context.iscsi.sq_curr_pbe.hi = req2->sq_first_pte.lo; ++ ictx->xstorm_st_context.iscsi.hq_pbl_base.lo = ++ iscsi->hq_info.pgtbl_map & 0xffffffff; ++ ictx->xstorm_st_context.iscsi.hq_pbl_base.hi = ++ (u64) iscsi->hq_info.pgtbl_map >> 32; ++ ictx->xstorm_st_context.iscsi.hq_curr_pbe_base.lo = ++ iscsi->hq_info.pgtbl[0]; ++ ictx->xstorm_st_context.iscsi.hq_curr_pbe_base.hi = ++ iscsi->hq_info.pgtbl[1]; ++ ictx->xstorm_st_context.iscsi.r2tq_pbl_base.lo = ++ iscsi->r2tq_info.pgtbl_map & 0xffffffff; ++ ictx->xstorm_st_context.iscsi.r2tq_pbl_base.hi = ++ (u64) iscsi->r2tq_info.pgtbl_map >> 32; ++ ictx->xstorm_st_context.iscsi.r2tq_curr_pbe_base.lo = ++ iscsi->r2tq_info.pgtbl[0]; ++ ictx->xstorm_st_context.iscsi.r2tq_curr_pbe_base.hi = ++ iscsi->r2tq_info.pgtbl[1]; ++ ictx->xstorm_st_context.iscsi.task_pbl_base.lo = ++ iscsi->task_array_info.pgtbl_map & 0xffffffff; ++ ictx->xstorm_st_context.iscsi.task_pbl_base.hi = ++ (u64) iscsi->task_array_info.pgtbl_map >> 32; ++ ictx->xstorm_st_context.iscsi.task_pbl_cache_idx = ++ BNX2X_ISCSI_PBL_NOT_CACHED; ++/* ictx->xstorm_st_context.iscsi.max_outstanding_r2ts = ++ ISCSI_DEFAULT_MAX_OUTSTANDING_R2T;*/ ++ ictx->xstorm_st_context.iscsi.flags.flags |= ++ XSTORM_ISCSI_CONTEXT_FLAGS_B_IMMEDIATE_DATA; ++ ictx->xstorm_st_context.iscsi.flags.flags |= ++ XSTORM_ISCSI_CONTEXT_FLAGS_B_INITIAL_R2T; ++ ++ ictx->tstorm_st_context.iscsi.hdr_bytes_2_fetch = ISCSI_HEADER_SIZE; ++ /* TSTORM requires the base address of RQ DB & not PTE */ ++ ictx->tstorm_st_context.iscsi.rq_db_phy_addr.lo = ++ req2->rq_page_table_addr_lo & PAGE_MASK; ++ ictx->tstorm_st_context.iscsi.rq_db_phy_addr.hi = ++ req2->rq_page_table_addr_hi; ++ ictx->tstorm_st_context.iscsi.iscsi_conn_id = req1->iscsi_conn_id; ++ ictx->tstorm_st_context.tcp.cwnd = 0x5A8; ++ ictx->tstorm_st_context.tcp.flags2 |= ++ TSTORM_TCP_ST_CONTEXT_SECTION_DA_EN; ++ ++ ictx->timers_context.flags |= ISCSI_TIMERS_BLOCK_CONTEXT_CONN_VALID_FLG; ++ ++ ictx->ustorm_st_context.ring.rq.pbl_base.lo = ++ req2->rq_page_table_addr_lo & 0xffffffff; ++ ictx->ustorm_st_context.ring.rq.pbl_base.hi = ++ (u64) req2->rq_page_table_addr_hi >> 32; ++ ictx->ustorm_st_context.ring.rq.curr_pbe.lo = req3->qp_first_pte[0].hi; ++ ictx->ustorm_st_context.ring.rq.curr_pbe.hi = req3->qp_first_pte[0].lo; ++ ictx->ustorm_st_context.ring.r2tq.pbl_base.lo = ++ iscsi->r2tq_info.pgtbl_map & 0xffffffff; ++ ictx->ustorm_st_context.ring.r2tq.pbl_base.hi = ++ (u64) iscsi->r2tq_info.pgtbl_map >> 32; ++ ictx->ustorm_st_context.ring.r2tq.curr_pbe.lo = ++ iscsi->r2tq_info.pgtbl[0]; ++ ictx->ustorm_st_context.ring.r2tq.curr_pbe.hi = ++ iscsi->r2tq_info.pgtbl[1]; ++ ictx->ustorm_st_context.ring.cq_pbl_base.lo = ++ req1->cq_page_table_addr_lo; ++ ictx->ustorm_st_context.ring.cq_pbl_base.hi = ++ req1->cq_page_table_addr_hi; ++ ictx->ustorm_st_context.ring.cq[0].cq_sn = ISCSI_INITIAL_SN; ++ ictx->ustorm_st_context.ring.cq[0].curr_pbe.lo = req2->cq_first_pte.hi; ++ ictx->ustorm_st_context.ring.cq[0].curr_pbe.hi = req2->cq_first_pte.lo; ++ ictx->ustorm_st_context.task_pbe_cache_index = ++ BNX2X_ISCSI_PBL_NOT_CACHED; ++ ictx->ustorm_st_context.task_pdu_cache_index = ++ BNX2X_ISCSI_PDU_HEADER_NOT_CACHED; ++ ++ for (i = 1, j = 1; i < cp->num_cqs; i++, j++) { ++ if (j == 3) { ++ if (n >= n_max) ++ break; ++ req3 = (struct iscsi_kwqe_conn_offload3 *) wqes[n++]; ++ j = 0; ++ } ++ ictx->ustorm_st_context.ring.cq[i].cq_sn = ISCSI_INITIAL_SN; ++ ictx->ustorm_st_context.ring.cq[i].curr_pbe.lo = ++ req3->qp_first_pte[j].hi; ++ ictx->ustorm_st_context.ring.cq[i].curr_pbe.hi = ++ req3->qp_first_pte[j].lo; ++ } ++ ++ ictx->ustorm_st_context.task_pbl_base.lo = ++ iscsi->task_array_info.pgtbl_map & 0xffffffff; ++ ictx->ustorm_st_context.task_pbl_base.hi = ++ (u64) iscsi->task_array_info.pgtbl_map >> 32; ++ ictx->ustorm_st_context.tce_phy_addr.lo = ++ iscsi->task_array_info.pgtbl[0]; ++ ictx->ustorm_st_context.tce_phy_addr.hi = ++ iscsi->task_array_info.pgtbl[1]; ++ ictx->ustorm_st_context.iscsi_conn_id = req1->iscsi_conn_id; ++ ictx->ustorm_st_context.num_cqs = cp->num_cqs; ++ ictx->ustorm_st_context.negotiated_rx |= ISCSI_DEFAULT_MAX_PDU_LENGTH; ++ ictx->ustorm_st_context.negotiated_rx_and_flags |= ++ ISCSI_DEFAULT_MAX_BURST_LENGTH; ++ ictx->ustorm_st_context.negotiated_rx |= ++ ISCSI_DEFAULT_MAX_OUTSTANDING_R2T << ++ USTORM_ISCSI_ST_CONTEXT_MAX_OUTSTANDING_R2TS_SHIFT; ++ ++ ictx->cstorm_st_context.hq_pbl_base.lo = ++ iscsi->hq_info.pgtbl_map & 0xffffffff; ++ ictx->cstorm_st_context.hq_pbl_base.hi = ++ (u64) iscsi->hq_info.pgtbl_map >> 32; ++ ictx->cstorm_st_context.hq_curr_pbe.lo = iscsi->hq_info.pgtbl[0]; ++ ictx->cstorm_st_context.hq_curr_pbe.hi = iscsi->hq_info.pgtbl[1]; ++ ictx->cstorm_st_context.task_pbl_base.lo = ++ iscsi->task_array_info.pgtbl_map & 0xffffffff; ++ ictx->cstorm_st_context.task_pbl_base.hi = ++ (u64) iscsi->task_array_info.pgtbl_map >> 32; ++ /* CSTORM and USTORM initialization is different, CSTORM requires ++ * CQ DB base & not PTE addr */ ++ ictx->cstorm_st_context.cq_db_base.lo = ++ req1->cq_page_table_addr_lo & PAGE_MASK; ++ ictx->cstorm_st_context.cq_db_base.hi = req1->cq_page_table_addr_hi; ++ ictx->cstorm_st_context.iscsi_conn_id = req1->iscsi_conn_id; ++ ictx->cstorm_st_context.cq_proc_en_bit_map = (1 << cp->num_cqs) - 1; ++ for (i = 0; i < cp->num_cqs; i++) { ++ ictx->cstorm_st_context.cq_c_prod_sqn_arr.sqn[i] = ++ ISCSI_INITIAL_SN; ++ ictx->cstorm_st_context.cq_c_sqn_2_notify_arr.sqn[i] = ++ ISCSI_INITIAL_SN; ++ } ++ ++ ictx->xstorm_ag_context.cdu_reserved = ++ CDU_RSRVD_VALUE_TYPE_A(hw_cid, CDU_REGION_NUMBER_XCM_AG, ++ ISCSI_CONNECTION_TYPE); ++ ictx->ustorm_ag_context.cdu_usage = ++ CDU_RSRVD_VALUE_TYPE_A(hw_cid, CDU_REGION_NUMBER_UCM_AG, ++ ISCSI_CONNECTION_TYPE); ++ return 0; ++ ++} ++ ++static int cnic_bnx2x_iscsi_ofld1(struct cnic_dev *dev, struct kwqe *wqes[], ++ u32 num, int *work) ++{ ++ struct iscsi_kwqe_conn_offload1 *req1; ++ struct iscsi_kwqe_conn_offload2 *req2; ++ struct cnic_local *cp = dev->cnic_priv; ++ struct iscsi_kcqe kcqe; ++ struct kcqe *cqes[1]; ++ u32 l5_cid; ++ int ret; ++ ++ if (num < 2) { ++ *work = num; ++ return -EINVAL; ++ } ++ ++ req1 = (struct iscsi_kwqe_conn_offload1 *) wqes[0]; ++ req2 = (struct iscsi_kwqe_conn_offload2 *) wqes[1]; ++ if ((num - 2) < req2->num_additional_wqes) { ++ *work = num; ++ return -EINVAL; ++ } ++ *work = 2 + req2->num_additional_wqes;; ++ ++ l5_cid = req1->iscsi_conn_id; ++ if (l5_cid >= MAX_ISCSI_TBL_SZ) ++ return -EINVAL; ++ ++ memset(&kcqe, 0, sizeof(kcqe)); ++ kcqe.op_code = ISCSI_KCQE_OPCODE_OFFLOAD_CONN; ++ kcqe.iscsi_conn_id = l5_cid; ++ kcqe.completion_status = ISCSI_KCQE_COMPLETION_STATUS_CTX_ALLOC_FAILURE; ++ ++ if (atomic_inc_return(&cp->iscsi_conn) > dev->max_iscsi_conn) { ++ atomic_dec(&cp->iscsi_conn); ++ ret = 0; ++ goto done; ++ } ++ ret = cnic_alloc_bnx2x_conn_resc(dev, l5_cid); ++ if (ret) { ++ atomic_dec(&cp->iscsi_conn); ++ ret = 0; ++ goto done; ++ } ++ ret = cnic_setup_bnx2x_ctx(dev, wqes, num); ++ if (ret < 0) { ++ cnic_free_bnx2x_conn_resc(dev, l5_cid); ++ atomic_dec(&cp->iscsi_conn); ++ goto done; ++ } ++ ++ kcqe.completion_status = ISCSI_KCQE_COMPLETION_STATUS_SUCCESS; ++ kcqe.iscsi_conn_context_id = BNX2X_HW_CID(cp->ctx_tbl[l5_cid].cid, ++ cp->func); ++ ++done: ++ cqes[0] = (struct kcqe *) &kcqe; ++ cnic_reply_bnx2x_kcqes(dev, CNIC_ULP_ISCSI, cqes, 1); ++ return ret; ++} ++ ++ ++static int cnic_bnx2x_iscsi_update(struct cnic_dev *dev, struct kwqe *kwqe) ++{ ++ struct cnic_local *cp = dev->cnic_priv; ++ struct iscsi_kwqe_conn_update *req = ++ (struct iscsi_kwqe_conn_update *) kwqe; ++ void *data; ++ union l5cm_specific_data l5_data; ++ u32 l5_cid, cid = BNX2X_SW_CID(req->context_id); ++ int ret; ++ ++ if (cnic_get_l5_cid(cp, cid, &l5_cid) != 0) ++ return -EINVAL; ++ ++ data = cnic_get_kwqe_16_data(cp, l5_cid, &l5_data); ++ if (!data) ++ return -ENOMEM; ++ ++ memcpy(data, kwqe, sizeof(struct kwqe)); ++ ++ ret = cnic_submit_kwqe_16(dev, ISCSI_RAMROD_CMD_ID_UPDATE_CONN, ++ req->context_id, ISCSI_CONNECTION_TYPE, &l5_data); ++ return ret; ++} ++ ++static int cnic_bnx2x_iscsi_destroy(struct cnic_dev *dev, struct kwqe *kwqe) ++{ ++ struct cnic_local *cp = dev->cnic_priv; ++ struct iscsi_kwqe_conn_destroy *req = ++ (struct iscsi_kwqe_conn_destroy *) kwqe; ++ union l5cm_specific_data l5_data; ++ u32 l5_cid = req->iscsi_conn_id; ++ struct cnic_context *ctx = &cp->ctx_tbl[l5_cid]; ++ int ret = 0; ++ struct iscsi_kcqe kcqe; ++ struct kcqe *cqes[1]; ++ ++ if (!(ctx->ctx_flags & CTX_FL_OFFLD_START)) ++ goto skip_cfc_delete; ++ ++ while (!time_after(jiffies, ctx->timestamp + (2 * HZ))) ++ msleep(250); ++ ++ init_waitqueue_head(&ctx->waitq); ++ ctx->wait_cond = 0; ++ memset(&l5_data, 0, sizeof(l5_data)); ++ ret = cnic_submit_kwqe_16(dev, RAMROD_CMD_ID_ETH_CFC_DEL, ++ req->context_id, ++ ETH_CONNECTION_TYPE | ++ (1 << SPE_HDR_COMMON_RAMROD_SHIFT), ++ &l5_data); ++ if (ret == 0) ++ wait_event(ctx->waitq, ctx->wait_cond); ++ ++skip_cfc_delete: ++ cnic_free_bnx2x_conn_resc(dev, l5_cid); ++ ++ atomic_dec(&cp->iscsi_conn); ++ ++ memset(&kcqe, 0, sizeof(kcqe)); ++ kcqe.op_code = ISCSI_KCQE_OPCODE_DESTROY_CONN; ++ kcqe.iscsi_conn_id = l5_cid; ++ kcqe.completion_status = ISCSI_KCQE_COMPLETION_STATUS_SUCCESS; ++ kcqe.iscsi_conn_context_id = req->context_id; ++ ++ cqes[0] = (struct kcqe *) &kcqe; ++ cnic_reply_bnx2x_kcqes(dev, CNIC_ULP_ISCSI, cqes, 1); ++ ++ return ret; ++} ++ ++static void cnic_init_storm_conn_bufs(struct cnic_dev *dev, ++ struct l4_kwq_connect_req1 *kwqe1, ++ struct l4_kwq_connect_req3 *kwqe3, ++ struct l5cm_active_conn_buffer *conn_buf) ++{ ++ struct l5cm_conn_addr_params *conn_addr = &conn_buf->conn_addr_buf; ++ struct l5cm_xstorm_conn_buffer *xstorm_buf = ++ &conn_buf->xstorm_conn_buffer; ++ struct l5cm_tstorm_conn_buffer *tstorm_buf = ++ &conn_buf->tstorm_conn_buffer; ++ struct regpair context_addr; ++ u32 cid = BNX2X_SW_CID(kwqe1->cid); ++ struct in6_addr src_ip, dst_ip; ++ int i; ++ u32 *addrp; ++ ++ addrp = (u32 *) &conn_addr->local_ip_addr; ++ for (i = 0; i < 4; i++, addrp++) ++ src_ip.in6_u.u6_addr32[i] = cpu_to_be32(*addrp); ++ ++ addrp = (u32 *) &conn_addr->remote_ip_addr; ++ for (i = 0; i < 4; i++, addrp++) ++ dst_ip.in6_u.u6_addr32[i] = cpu_to_be32(*addrp); ++ ++ cnic_get_bnx2x_ctx(dev, cid, 0, &context_addr); ++ ++ xstorm_buf->context_addr.hi = context_addr.hi; ++ xstorm_buf->context_addr.lo = context_addr.lo; ++ xstorm_buf->mss = kwqe3->mss; ++ xstorm_buf->rcv_buf = kwqe3->rcv_buf; ++ if (kwqe1->tcp_flags & L4_KWQ_CONNECT_REQ1_NAGLE_ENABLE) ++ xstorm_buf->params |= L5CM_XSTORM_CONN_BUFFER_NAGLE_ENABLE; ++ xstorm_buf->pseudo_header_checksum = ++ swab16(~csum_ipv6_magic(&src_ip, &dst_ip, 0, IPPROTO_TCP, 0)); ++ ++ if (!(kwqe1->tcp_flags & L4_KWQ_CONNECT_REQ1_NO_DELAY_ACK)) ++ tstorm_buf->params |= ++ L5CM_TSTORM_CONN_BUFFER_DELAYED_ACK_ENABLE; ++ if (kwqe3->ka_timeout) { ++ tstorm_buf->ka_enable = 1; ++ tstorm_buf->ka_timeout = kwqe3->ka_timeout; ++ tstorm_buf->ka_interval = kwqe3->ka_interval; ++ tstorm_buf->ka_max_probe_count = kwqe3->ka_max_probe_count; ++ } ++ tstorm_buf->rcv_buf = kwqe3->rcv_buf; ++ tstorm_buf->snd_buf = kwqe3->snd_buf; ++ tstorm_buf->max_rt_time = 0xffffffff; ++} ++ ++static void cnic_init_bnx2x_mac(struct cnic_dev *dev, u8 *mac) ++{ ++ struct cnic_local *cp = dev->cnic_priv; ++ int func = CNIC_FUNC(cp); ++ ++ CNIC_WR8(dev, BAR_XSTRORM_INTMEM + ++ XSTORM_ISCSI_LOCAL_MAC_ADDR0_OFFSET(func), mac[0]); ++ CNIC_WR8(dev, BAR_XSTRORM_INTMEM + ++ XSTORM_ISCSI_LOCAL_MAC_ADDR1_OFFSET(func), mac[1]); ++ CNIC_WR8(dev, BAR_XSTRORM_INTMEM + ++ XSTORM_ISCSI_LOCAL_MAC_ADDR2_OFFSET(func), mac[2]); ++ CNIC_WR8(dev, BAR_XSTRORM_INTMEM + ++ XSTORM_ISCSI_LOCAL_MAC_ADDR3_OFFSET(func), mac[3]); ++ CNIC_WR8(dev, BAR_XSTRORM_INTMEM + ++ XSTORM_ISCSI_LOCAL_MAC_ADDR4_OFFSET(func), mac[4]); ++ CNIC_WR8(dev, BAR_XSTRORM_INTMEM + ++ XSTORM_ISCSI_LOCAL_MAC_ADDR5_OFFSET(func), mac[5]); ++ ++ CNIC_WR8(dev, BAR_TSTRORM_INTMEM + ++ TSTORM_ISCSI_TCP_VARS_LSB_LOCAL_MAC_ADDR_OFFSET(func), mac[5]); ++ CNIC_WR8(dev, BAR_TSTRORM_INTMEM + ++ TSTORM_ISCSI_TCP_VARS_LSB_LOCAL_MAC_ADDR_OFFSET(func) + 1, ++ mac[4]); ++ CNIC_WR8(dev, BAR_TSTRORM_INTMEM + ++ TSTORM_ISCSI_TCP_VARS_MSB_LOCAL_MAC_ADDR_OFFSET(func), mac[3]); ++ CNIC_WR8(dev, BAR_TSTRORM_INTMEM + ++ TSTORM_ISCSI_TCP_VARS_MSB_LOCAL_MAC_ADDR_OFFSET(func) + 1, ++ mac[2]); ++ CNIC_WR8(dev, BAR_TSTRORM_INTMEM + ++ TSTORM_ISCSI_TCP_VARS_MSB_LOCAL_MAC_ADDR_OFFSET(func) + 2, ++ mac[1]); ++ CNIC_WR8(dev, BAR_TSTRORM_INTMEM + ++ TSTORM_ISCSI_TCP_VARS_MSB_LOCAL_MAC_ADDR_OFFSET(func) + 3, ++ mac[0]); ++} ++ ++static int cnic_bnx2x_connect(struct cnic_dev *dev, struct kwqe *wqes[], ++ u32 num, int *work) ++{ ++ struct cnic_local *cp = dev->cnic_priv; ++ struct l4_kwq_connect_req1 *kwqe1 = ++ (struct l4_kwq_connect_req1 *) wqes[0]; ++ struct l4_kwq_connect_req3 *kwqe3; ++ struct l5cm_active_conn_buffer *conn_buf; ++ struct l5cm_conn_addr_params *conn_addr; ++ union l5cm_specific_data l5_data; ++ u32 l5_cid = kwqe1->pg_cid; ++ struct cnic_sock *csk = &cp->csk_tbl[l5_cid]; ++ struct cnic_context *ctx = &cp->ctx_tbl[l5_cid]; ++#ifdef __VMKLNX__ ++ char vmknic[VMK_VMKNIC_NAME_MAX]; ++ vmk_EthAddress srcMACAddr; ++#else ++ struct neighbour *neigh = csk->dst->neighbour; ++#endif ++ int ret; ++ ++ if (num < 2) { ++ *work = num; ++ return -EINVAL; ++ } ++ ++ if (kwqe1->conn_flags & L4_KWQ_CONNECT_REQ1_IP_V6) ++ *work = 3; ++ else ++ *work = 2; ++ ++ if (num < *work) { ++ *work = num; ++ return -EINVAL; ++ } ++ ++ if (sizeof(*conn_buf) > CNIC_KWQ16_DATA_SIZE) { ++ printk(KERN_ERR PFX "%s: conn_buf size too big\n", ++ dev->netdev->name); ++ return -ENOMEM; ++ } ++ conn_buf = cnic_get_kwqe_16_data(cp, l5_cid, &l5_data); ++ if (!conn_buf) ++ return -ENOMEM; ++ ++ memset(conn_buf, 0, sizeof(*conn_buf)); ++ ++ conn_addr = &conn_buf->conn_addr_buf; ++#ifdef __VMKLNX__ ++ conn_addr->remote_addr_0 = csk->ha[0]; ++ conn_addr->remote_addr_1 = csk->ha[1]; ++ conn_addr->remote_addr_2 = csk->ha[2]; ++ conn_addr->remote_addr_3 = csk->ha[3]; ++ conn_addr->remote_addr_4 = csk->ha[4]; ++ conn_addr->remote_addr_5 = csk->ha[5]; ++ ++ /* Retrieve the MAC of the vmknic */ ++ if (vmk_IscsiNetHandleGetVmknic(cp->iscsiNetHandle, vmknic) != VMK_OK) ++ return -EINVAL; ++ if (vmk_VmknicMACAddrGet(vmknic, srcMACAddr) != VMK_OK) ++ return -EINVAL; ++ ++ cnic_init_bnx2x_mac(dev, srcMACAddr); ++#else ++ conn_addr->remote_addr_0 = neigh->ha[0]; ++ conn_addr->remote_addr_1 = neigh->ha[1]; ++ conn_addr->remote_addr_2 = neigh->ha[2]; ++ conn_addr->remote_addr_3 = neigh->ha[3]; ++ conn_addr->remote_addr_4 = neigh->ha[4]; ++ conn_addr->remote_addr_5 = neigh->ha[5]; ++#endif ++ ++ if (kwqe1->conn_flags & L4_KWQ_CONNECT_REQ1_IP_V6) { ++ struct l4_kwq_connect_req2 *kwqe2 = ++ (struct l4_kwq_connect_req2 *) wqes[1]; ++ ++ conn_addr->local_ip_addr.ip_addr_hi_hi = kwqe2->src_ip_v6_4; ++ conn_addr->local_ip_addr.ip_addr_hi_lo = kwqe2->src_ip_v6_3; ++ conn_addr->local_ip_addr.ip_addr_lo_hi = kwqe2->src_ip_v6_2; ++ ++ conn_addr->remote_ip_addr.ip_addr_hi_hi = kwqe2->dst_ip_v6_4; ++ conn_addr->remote_ip_addr.ip_addr_hi_lo = kwqe2->dst_ip_v6_3; ++ conn_addr->remote_ip_addr.ip_addr_lo_hi = kwqe2->dst_ip_v6_2; ++ conn_addr->params |= L5CM_CONN_ADDR_PARAMS_IP_VERSION; ++ } ++ kwqe3 = (struct l4_kwq_connect_req3 *) wqes[*work - 1]; ++ ++ conn_addr->local_ip_addr.ip_addr_lo_lo = kwqe1->src_ip; ++ conn_addr->remote_ip_addr.ip_addr_lo_lo = kwqe1->dst_ip; ++ conn_addr->local_tcp_port = kwqe1->src_port; ++ conn_addr->remote_tcp_port = kwqe1->dst_port; ++ ++ conn_addr->pmtu = kwqe3->pmtu; ++ cnic_init_storm_conn_bufs(dev, kwqe1, kwqe3, conn_buf); ++ ++ CNIC_WR16(dev, BAR_XSTRORM_INTMEM + ++ XSTORM_ISCSI_LOCAL_VLAN_OFFSET(cp->func), csk->vlan_id); ++ ++ ret = cnic_submit_kwqe_16(dev, L5CM_RAMROD_CMD_ID_TCP_CONNECT, ++ kwqe1->cid, ISCSI_CONNECTION_TYPE, &l5_data); ++ if (!ret) ++ ctx->ctx_flags |= CTX_FL_OFFLD_START; ++ ++ return ret; ++} ++ ++static int cnic_bnx2x_close(struct cnic_dev *dev, struct kwqe *kwqe) ++{ ++ struct l4_kwq_close_req *req = (struct l4_kwq_close_req *) kwqe; ++ union l5cm_specific_data l5_data; ++ int ret; ++ ++ memset(&l5_data, 0, sizeof(l5_data)); ++ ret = cnic_submit_kwqe_16(dev, L5CM_RAMROD_CMD_ID_CLOSE, ++ req->cid, ISCSI_CONNECTION_TYPE, &l5_data); ++ return ret; ++} ++ ++static int cnic_bnx2x_reset(struct cnic_dev *dev, struct kwqe *kwqe) ++{ ++ struct l4_kwq_reset_req *req = (struct l4_kwq_reset_req *) kwqe; ++ union l5cm_specific_data l5_data; ++ int ret; ++ ++ memset(&l5_data, 0, sizeof(l5_data)); ++ ret = cnic_submit_kwqe_16(dev, L5CM_RAMROD_CMD_ID_ABORT, ++ req->cid, ISCSI_CONNECTION_TYPE, &l5_data); ++ return ret; ++} ++static int cnic_bnx2x_offload_pg(struct cnic_dev *dev, struct kwqe *kwqe) ++{ ++ struct l4_kwq_offload_pg *req = (struct l4_kwq_offload_pg *) kwqe; ++ struct l4_kcq kcqe; ++ struct kcqe *cqes[1]; ++ ++ memset(&kcqe, 0, sizeof(kcqe)); ++ kcqe.pg_host_opaque = req->host_opaque; ++ kcqe.pg_cid = req->host_opaque; ++ kcqe.op_code = L4_KCQE_OPCODE_VALUE_OFFLOAD_PG; ++ cqes[0] = (struct kcqe *) &kcqe; ++ cnic_reply_bnx2x_kcqes(dev, CNIC_ULP_L4, cqes, 1); ++ return 0; ++} ++ ++static int cnic_bnx2x_update_pg(struct cnic_dev *dev, struct kwqe *kwqe) ++{ ++ struct l4_kwq_update_pg *req = (struct l4_kwq_update_pg *) kwqe; ++ struct l4_kcq kcqe; ++ struct kcqe *cqes[1]; ++ ++ memset(&kcqe, 0, sizeof(kcqe)); ++ kcqe.pg_host_opaque = req->pg_host_opaque; ++ kcqe.pg_cid = req->pg_cid; ++ kcqe.op_code = L4_KCQE_OPCODE_VALUE_UPDATE_PG; ++ cqes[0] = (struct kcqe *) &kcqe; ++ cnic_reply_bnx2x_kcqes(dev, CNIC_ULP_L4, cqes, 1); ++ return 0; ++} ++ ++static int cnic_submit_bnx2x_kwqes(struct cnic_dev *dev, struct kwqe *wqes[], ++ u32 num_wqes) ++{ ++ int i, work, ret; ++ u32 opcode; ++ struct kwqe *kwqe; ++ ++ if (!test_bit(CNIC_F_CNIC_UP, &dev->flags)) ++ return -EAGAIN; /* bnx2 is down */ ++ ++ for (i = 0; i < num_wqes; ) { ++ kwqe = wqes[i]; ++ opcode = KWQE_OPCODE(kwqe->kwqe_op_flag); ++ work = 1; ++ ++ switch (opcode) { ++ case ISCSI_KWQE_OPCODE_INIT1: ++ ret = cnic_bnx2x_iscsi_init1(dev, kwqe); ++ break; ++ case ISCSI_KWQE_OPCODE_INIT2: ++ ret = cnic_bnx2x_iscsi_init2(dev, kwqe); ++ break; ++ case ISCSI_KWQE_OPCODE_OFFLOAD_CONN1: ++ ret = cnic_bnx2x_iscsi_ofld1(dev, &wqes[i], ++ num_wqes - i, &work); ++ break; ++ case ISCSI_KWQE_OPCODE_UPDATE_CONN: ++ ret = cnic_bnx2x_iscsi_update(dev, kwqe); ++ break; ++ case ISCSI_KWQE_OPCODE_DESTROY_CONN: ++ ret = cnic_bnx2x_iscsi_destroy(dev, kwqe); ++ break; ++ case L4_KWQE_OPCODE_VALUE_CONNECT1: ++ ret = cnic_bnx2x_connect(dev, &wqes[i], num_wqes - i, ++ &work); ++ break; ++ case L4_KWQE_OPCODE_VALUE_CLOSE: ++ ret = cnic_bnx2x_close(dev, kwqe); ++ break; ++ case L4_KWQE_OPCODE_VALUE_RESET: ++ ret = cnic_bnx2x_reset(dev, kwqe); ++ break; ++ case L4_KWQE_OPCODE_VALUE_OFFLOAD_PG: ++ ret = cnic_bnx2x_offload_pg(dev, kwqe); ++ break; ++ case L4_KWQE_OPCODE_VALUE_UPDATE_PG: ++ ret = cnic_bnx2x_update_pg(dev, kwqe); ++ break; ++ case L4_KWQE_OPCODE_VALUE_UPLOAD_PG: ++ ret = 0; ++ break; ++ default: ++ ret = 0; ++ printk(KERN_ERR PFX "%s: Unknown type of KWQE(0x%x)\n", ++ dev->netdev->name, opcode); ++ break; ++ } ++ if (ret < 0) ++ printk(KERN_ERR PFX "%s: KWQE(0x%x) failed\n", ++ dev->netdev->name, opcode); ++ i += work; ++ } ++ return 0; ++} ++ ++static void service_kcqes(struct cnic_dev *dev, int num_cqes) ++{ ++ struct cnic_local *cp = dev->cnic_priv; ++ int i, j; ++ ++ i = 0; ++ j = 1; ++ while (num_cqes) { ++ struct cnic_ulp_ops *ulp_ops; ++ int ulp_type; ++ u32 kcqe_op_flag = cp->completed_kcq[i]->kcqe_op_flag; ++ u32 kcqe_layer = kcqe_op_flag & KCQE_FLAGS_LAYER_MASK; ++ ++ if (unlikely(kcqe_op_flag & KCQE_RAMROD_COMPLETION)) ++ cnic_kwq_completion(dev, 1); ++ ++ while (j < num_cqes) { ++ u32 next_op = cp->completed_kcq[i + j]->kcqe_op_flag; ++ ++ if ((next_op & KCQE_FLAGS_LAYER_MASK) != kcqe_layer) ++ break; ++ ++ if (unlikely(next_op & KCQE_RAMROD_COMPLETION)) ++ cnic_kwq_completion(dev, 1); ++ j++; ++ } ++ ++ if (kcqe_layer == KCQE_FLAGS_LAYER_MASK_L5_RDMA) ++ ulp_type = CNIC_ULP_RDMA; ++ else if (kcqe_layer == KCQE_FLAGS_LAYER_MASK_L5_ISCSI) ++ ulp_type = CNIC_ULP_ISCSI; ++ else if (kcqe_layer == KCQE_FLAGS_LAYER_MASK_L4) ++ ulp_type = CNIC_ULP_L4; ++ else { ++ printk(KERN_ERR PFX "%s: Unknown type of KCQE(0x%x)\n", ++ dev->netdev->name, kcqe_op_flag); ++ goto end; ++ } ++ ++ rcu_read_lock(); ++ ulp_ops = rcu_dereference(cp->ulp_ops[ulp_type]); ++ if (likely(ulp_ops)) { ++ ulp_ops->indicate_kcqes(cp->ulp_handle[ulp_type], ++ cp->completed_kcq + i, j); ++ } ++ rcu_read_unlock(); ++end: ++ num_cqes -= j; ++ i += j; ++ j = 1; ++ } ++ return; ++} ++ ++static u16 cnic_bnx2_next_idx(u16 idx) ++{ ++ return (idx + 1); ++} ++ ++static u16 cnic_bnx2_hw_idx(u16 idx) ++{ ++ return idx; ++} ++ ++static u16 cnic_bnx2x_next_idx(u16 idx) ++{ ++ idx++; ++ if ((idx & MAX_KCQE_CNT) == MAX_KCQE_CNT) ++ idx++; ++ ++ return idx; ++} ++ ++static u16 cnic_bnx2x_hw_idx(u16 idx) ++{ ++ if ((idx & MAX_KCQE_CNT) == MAX_KCQE_CNT) ++ idx++; ++ return idx; ++} ++ ++static int cnic_get_kcqes(struct cnic_dev *dev, u16 hw_prod, u16 *sw_prod) ++{ ++ struct cnic_local *cp = dev->cnic_priv; ++ u16 i, ri, last; ++ struct kcqe *kcqe; ++ int kcqe_cnt = 0, last_cnt = 0; ++ ++ i = ri = last = *sw_prod; ++ ri &= MAX_KCQ_IDX; ++ ++ while ((i != hw_prod) && (kcqe_cnt < MAX_COMPLETED_KCQE)) { ++ kcqe = &cp->kcq[KCQ_PG(ri)][KCQ_IDX(ri)]; ++ cp->completed_kcq[kcqe_cnt++] = kcqe; ++ i = cp->next_idx(i); ++ ri = i & MAX_KCQ_IDX; ++ if (likely(!(kcqe->kcqe_op_flag & KCQE_FLAGS_NEXT))) { ++ last_cnt = kcqe_cnt; ++ last = i; ++ } ++ } ++ ++ *sw_prod = last; ++ return last_cnt; ++} ++ ++static int cnic_service_bnx2(void *data, void *status_blk) ++{ ++ struct cnic_dev *dev = data; ++ struct status_block *sblk = status_blk; ++ struct cnic_local *cp = dev->cnic_priv; ++ u32 status_idx = sblk->status_idx; ++ u16 hw_prod, sw_prod; ++ int kcqe_cnt; ++ ++ if (unlikely(!test_bit(CNIC_F_CNIC_UP, &dev->flags))) ++ return status_idx; ++ ++ cp->kwq_con_idx = *cp->kwq_con_idx_ptr; ++ ++ hw_prod = sblk->status_completion_producer_index; ++ sw_prod = cp->kcq_prod_idx; ++ while (sw_prod != hw_prod) { ++ kcqe_cnt = cnic_get_kcqes(dev, hw_prod, &sw_prod); ++ if (kcqe_cnt == 0) ++ goto done; ++ ++ service_kcqes(dev, kcqe_cnt); ++ ++ /* Tell compiler that status_blk fields can change. */ ++ barrier(); ++ if (status_idx != sblk->status_idx) { ++ status_idx = sblk->status_idx; ++ cp->kwq_con_idx = *cp->kwq_con_idx_ptr; ++ hw_prod = sblk->status_completion_producer_index; ++ } else ++ break; ++ } ++ ++done: ++ CNIC_WR16(dev, cp->kcq_io_addr, sw_prod); ++ ++ cp->kcq_prod_idx = sw_prod; ++ return status_idx; ++} ++ ++static void cnic_service_bnx2_msix(unsigned long data) ++{ ++ struct cnic_dev *dev = (struct cnic_dev *) data; ++ struct cnic_local *cp = dev->cnic_priv; ++ struct status_block_msix *status_blk = cp->bnx2_status_blk; ++ u32 status_idx = status_blk->status_idx; ++ u16 hw_prod, sw_prod; ++ int kcqe_cnt; ++ ++ cp->kwq_con_idx = status_blk->status_cmd_consumer_index; ++ ++ hw_prod = status_blk->status_completion_producer_index; ++ sw_prod = cp->kcq_prod_idx; ++ while (sw_prod != hw_prod) { ++ kcqe_cnt = cnic_get_kcqes(dev, hw_prod, &sw_prod); ++ if (kcqe_cnt == 0) ++ goto done; ++ ++ service_kcqes(dev, kcqe_cnt); ++ ++ /* Tell compiler that status_blk fields can change. */ ++ barrier(); ++ if (status_idx != status_blk->status_idx) { ++ status_idx = status_blk->status_idx; ++ cp->kwq_con_idx = status_blk->status_cmd_consumer_index; ++ hw_prod = status_blk->status_completion_producer_index; ++ } else ++ break; ++ } ++ ++done: ++ CNIC_WR16(dev, cp->kcq_io_addr, sw_prod); ++ ++ cp->kcq_prod_idx = sw_prod; ++ cp->last_status_idx = status_idx; ++ CNIC_WR(dev, BNX2_PCICFG_INT_ACK_CMD, cp->int_num | ++ BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID | cp->last_status_idx); ++} ++ ++#if (LINUX_VERSION_CODE >= 0x20613) ++static irqreturn_t cnic_irq(int irq, void *dev_instance) ++#else ++static irqreturn_t cnic_irq(int irq, void *dev_instance, struct pt_regs *regs) ++#endif ++{ ++ struct cnic_dev *dev = dev_instance; ++ struct cnic_local *cp = dev->cnic_priv; ++ u16 prod = cp->kcq_prod_idx & MAX_KCQ_IDX; ++ ++ if (cp->ack_int) ++ cp->ack_int(dev); ++ ++ prefetch(cp->status_blk); ++ prefetch(&cp->kcq[KCQ_PG(prod)][KCQ_IDX(prod)]); ++ ++ if (likely(test_bit(CNIC_F_CNIC_UP, &dev->flags))) ++ tasklet_schedule(&cp->cnic_irq_task); ++ ++ return IRQ_HANDLED; ++} ++ ++static inline void cnic_ack_bnx2x_int(struct cnic_dev *dev, u8 id, u8 storm, ++ u16 index, u8 op, u8 update) ++{ ++ struct cnic_local *cp = dev->cnic_priv; ++ u32 hc_addr = (HC_REG_COMMAND_REG + CNIC_PORT(cp) * 32 + ++ COMMAND_REG_INT_ACK); ++ struct igu_ack_register igu_ack; ++ ++ igu_ack.status_block_index = index; ++ igu_ack.sb_id_and_flags = ++ ((id << IGU_ACK_REGISTER_STATUS_BLOCK_ID_SHIFT) | ++ (storm << IGU_ACK_REGISTER_STORM_ID_SHIFT) | ++ (update << IGU_ACK_REGISTER_UPDATE_INDEX_SHIFT) | ++ (op << IGU_ACK_REGISTER_INTERRUPT_MODE_SHIFT)); ++ ++ CNIC_WR(dev, hc_addr, (*(u32 *)&igu_ack)); ++} ++ ++static void cnic_ack_bnx2x_msix(struct cnic_dev *dev) ++{ ++ struct cnic_local *cp = dev->cnic_priv; ++ ++ cnic_ack_bnx2x_int(dev, cp->status_blk_num, CSTORM_ID, 0, ++ IGU_INT_DISABLE, 0); ++} ++ ++static void cnic_service_bnx2x_bh(unsigned long data) ++{ ++ struct cnic_dev *dev = (struct cnic_dev *) data; ++ struct cnic_local *cp = dev->cnic_priv; ++ u16 hw_prod, sw_prod; ++#ifdef NEW_BNX2X_HSI ++ struct cstorm_status_block_c *sblk = ++ &cp->bnx2x_status_blk->c_status_block; ++#else ++ struct cstorm_status_block *sblk = ++ &cp->bnx2x_status_blk->c_status_block; ++#endif ++ u32 status_idx = sblk->status_block_index; ++ int kcqe_cnt; ++ ++ if (unlikely(!test_bit(CNIC_F_CNIC_UP, &dev->flags))) ++ return; ++ ++ hw_prod = sblk->index_values[HC_INDEX_C_ISCSI_EQ_CONS]; ++ hw_prod = cp->hw_idx(hw_prod); ++ sw_prod = cp->kcq_prod_idx; ++ while (sw_prod != hw_prod) { ++ kcqe_cnt = cnic_get_kcqes(dev, hw_prod, &sw_prod); ++ if (kcqe_cnt == 0) ++ goto done; ++ ++ service_kcqes(dev, kcqe_cnt); ++ ++ /* Tell compiler that sblk fields can change. */ ++ barrier(); ++ if (status_idx == sblk->status_block_index) ++ break; ++ ++ status_idx = sblk->status_block_index; ++ hw_prod = sblk->index_values[HC_INDEX_C_ISCSI_EQ_CONS]; ++ hw_prod = cp->hw_idx(hw_prod); ++ } ++ ++done: ++ CNIC_WR16(dev, cp->kcq_io_addr, sw_prod + MAX_KCQ_IDX); ++ cnic_ack_bnx2x_int(dev, cp->status_blk_num, CSTORM_ID, ++ status_idx, IGU_INT_ENABLE, 1); ++ ++ cp->kcq_prod_idx = sw_prod; ++ return; ++} ++ ++static int cnic_service_bnx2x(void *data, void *status_blk) ++{ ++ struct cnic_dev *dev = data; ++ struct cnic_local *cp = dev->cnic_priv; ++ u16 prod = cp->kcq_prod_idx & MAX_KCQ_IDX; ++ ++ prefetch(cp->status_blk); ++ prefetch(&cp->kcq[KCQ_PG(prod)][KCQ_IDX(prod)]); ++ ++ if (likely(test_bit(CNIC_F_CNIC_UP, &dev->flags))) ++ tasklet_schedule(&cp->cnic_irq_task); ++ return 0; ++} ++ ++static void cnic_ulp_stop(struct cnic_dev *dev) ++{ ++ struct cnic_local *cp = dev->cnic_priv; ++ int if_type; ++ ++ rcu_read_lock(); ++ for (if_type = 0; if_type < MAX_CNIC_ULP_TYPE; if_type++) { ++ struct cnic_ulp_ops *ulp_ops; ++ ++ ulp_ops = rcu_dereference(cp->ulp_ops[if_type]); ++ if (!ulp_ops) ++ continue; ++ ++ if (test_and_clear_bit(ULP_F_START, &cp->ulp_flags[if_type])) ++ ulp_ops->cnic_stop(cp->ulp_handle[if_type]); ++ } ++ rcu_read_unlock(); ++} ++ ++static void cnic_ulp_start(struct cnic_dev *dev) ++{ ++ struct cnic_local *cp = dev->cnic_priv; ++ int if_type; ++ ++ rcu_read_lock(); ++ for (if_type = 0; if_type < MAX_CNIC_ULP_TYPE; if_type++) { ++ struct cnic_ulp_ops *ulp_ops; ++ ++ ulp_ops = rcu_dereference(cp->ulp_ops[if_type]); ++ if (!ulp_ops) ++ continue; ++ ++ if (!test_and_set_bit(ULP_F_START, &cp->ulp_flags[if_type])) ++ ulp_ops->cnic_start(cp->ulp_handle[if_type]); ++ } ++ rcu_read_unlock(); ++} ++ ++static int cnic_ctl(void *data, struct cnic_ctl_info *info) ++{ ++ struct cnic_dev *dev = data; ++#ifdef __VMKLNX__ ++ int i; ++#endif ++ ++ switch (info->cmd) { ++ case CNIC_CTL_STOP_CMD: ++ cnic_hold(dev); ++ mutex_lock(&cnic_lock); ++ ++ if (test_bit(CNIC_F_IF_UP, &dev->flags)) { ++ clear_bit(CNIC_F_IF_UP, &dev->flags); ++ cnic_ulp_stop(dev); ++#ifndef __VMKLNX__ ++ cnic_stop_hw(dev); ++#endif ++ } ++ ++ mutex_unlock(&cnic_lock); ++#ifdef __VMKLNX__ ++ i = 0; ++ while ((atomic_read(&dev->ref_count) > 1) && i < 100) { ++ msleep(100); ++ i++; ++ } ++ if (atomic_read(&dev->ref_count) > 1) ++ printk(KERN_ERR PFX "%s: cnic device did not unregister" ++ " during stop event.\n", dev->netdev->name); ++#endif ++ cnic_put(dev); ++ break; ++ case CNIC_CTL_START_CMD: ++ cnic_hold(dev); ++ mutex_lock(&cnic_lock); ++ ++ set_bit(CNIC_F_IF_UP, &dev->flags); ++ if (dev->use_count) { ++ if (!cnic_start_hw(dev)) ++ cnic_ulp_start(dev); ++ } ++ mutex_unlock(&cnic_lock); ++ cnic_put(dev); ++ break; ++ case CNIC_CTL_COMPLETION_CMD: { ++ u32 cid = BNX2X_SW_CID(info->data.comp.cid); ++ u32 l5_cid; ++ struct cnic_local *cp = dev->cnic_priv; ++ ++ if (cnic_get_l5_cid(cp, cid, &l5_cid) == 0) { ++ struct cnic_context *ctx = &cp->ctx_tbl[l5_cid]; ++ ++ ctx->wait_cond = 1; ++ wake_up(&ctx->waitq); ++ } ++ break; ++ } ++ default: ++ return -EINVAL; ++ } ++ return 0; ++} ++ ++static void cnic_ulp_init(struct cnic_dev *dev) ++{ ++ int i; ++ struct cnic_local *cp = dev->cnic_priv; ++ ++ rcu_read_lock(); ++ for (i = 0; i < MAX_CNIC_ULP_TYPE_EXT; i++) { ++ struct cnic_ulp_ops *ulp_ops; ++ ++ ulp_ops = rcu_dereference(cnic_ulp_tbl[i]); ++#ifdef __VMKLNX__ ++ if (!ulp_ops) ++#else ++ if (!ulp_ops || !try_module_get(ulp_ops->owner)) ++#endif ++ continue; ++ ++ if (!test_and_set_bit(ULP_F_INIT, &cp->ulp_flags[i])) ++ ulp_ops->cnic_init(dev); ++ ++#ifndef __VMKLNX__ ++ module_put(ulp_ops->owner); ++#endif ++ } ++ rcu_read_unlock(); ++} ++ ++static void cnic_ulp_exit(struct cnic_dev *dev) ++{ ++ int i; ++ struct cnic_local *cp = dev->cnic_priv; ++ ++ rcu_read_lock(); ++ for (i = 0; i < MAX_CNIC_ULP_TYPE_EXT; i++) { ++ struct cnic_ulp_ops *ulp_ops; ++ ++ ulp_ops = rcu_dereference(cnic_ulp_tbl[i]); ++#ifdef __VMKLNX__ ++ if (!ulp_ops) ++#else ++ if (!ulp_ops || !try_module_get(ulp_ops->owner)) ++#endif ++ continue; ++ ++ if (test_and_clear_bit(ULP_F_INIT, &cp->ulp_flags[i])) ++ ulp_ops->cnic_exit(dev); ++ ++#ifndef __VMKLNX__ ++ module_put(ulp_ops->owner); ++#endif ++ } ++ rcu_read_unlock(); ++} ++ ++static int cnic_queue_work(struct cnic_local *cp, u32 work_type, void *data) ++{ ++ struct cnic_work_node *node; ++ int bytes = sizeof(u32 *); ++ ++ spin_lock_bh(&cp->wr_lock); ++ ++ node = &cp->cnic_work_ring[cp->cnic_wr_prod]; ++ node->work_type = work_type; ++ if (work_type == WORK_TYPE_KCQE) ++ bytes = sizeof(struct kcqe); ++ if (work_type == WORK_TYPE_REDIRECT) ++ bytes = sizeof(struct cnic_redirect_entry); ++ memcpy(&node->work_data, data, bytes); ++ cp->cnic_wr_prod++; ++ cp->cnic_wr_prod &= WORK_RING_SIZE_MASK; ++ ++ spin_unlock_bh(&cp->wr_lock); ++ return 0; ++} ++ ++static int cnic_cm_offload_pg(struct cnic_sock *csk) ++{ ++ struct cnic_dev *dev = csk->dev; ++ struct l4_kwq_offload_pg *l4kwqe; ++ struct kwqe *wqes[1]; ++#ifdef __VMKLNX__ ++ struct cnic_local *cp = dev->cnic_priv; ++ char vmknic[VMK_VMKNIC_NAME_MAX]; ++ vmk_EthAddress srcMACAddr; ++#else ++ struct neighbour *neigh = csk->dst->neighbour; ++ struct net_device *netdev = neigh->dev; ++#endif ++ ++#ifdef __VMKLNX__ ++ /* Retrieve the MAC of the vmknic */ ++ if (vmk_IscsiNetHandleGetVmknic(cp->iscsiNetHandle, vmknic) != VMK_OK) ++ return -EINVAL; ++ if (vmk_VmknicMACAddrGet(vmknic, srcMACAddr) != VMK_OK) ++ return -EINVAL; ++#endif ++ ++#ifndef HAVE_NETEVENT ++#ifndef __VMKLNX__ ++ memcpy(csk->old_ha, &neigh->ha[0], 6); ++#endif ++#endif ++ l4kwqe = (struct l4_kwq_offload_pg *) &csk->kwqe1; ++ memset(l4kwqe, 0, sizeof(*l4kwqe)); ++ wqes[0] = (struct kwqe *) l4kwqe; ++ ++ l4kwqe->op_code = L4_KWQE_OPCODE_VALUE_OFFLOAD_PG; ++ l4kwqe->flags = ++ L4_LAYER_CODE << L4_KWQ_OFFLOAD_PG_LAYER_CODE_SHIFT; ++ l4kwqe->l2hdr_nbytes = ETH_HLEN; ++#ifdef __VMKLNX__ ++ l4kwqe->da0 = csk->ha[0]; ++ l4kwqe->da1 = csk->ha[1]; ++ l4kwqe->da2 = csk->ha[2]; ++ l4kwqe->da3 = csk->ha[3]; ++ l4kwqe->da4 = csk->ha[4]; ++ l4kwqe->da5 = csk->ha[5]; ++ ++ l4kwqe->sa0 = srcMACAddr[0]; ++ l4kwqe->sa1 = srcMACAddr[1]; ++ l4kwqe->sa2 = srcMACAddr[2]; ++ l4kwqe->sa3 = srcMACAddr[3]; ++ l4kwqe->sa4 = srcMACAddr[4]; ++ l4kwqe->sa5 = srcMACAddr[5]; ++#else ++ l4kwqe->da0 = neigh->ha[0]; ++ l4kwqe->da1 = neigh->ha[1]; ++ l4kwqe->da2 = neigh->ha[2]; ++ l4kwqe->da3 = neigh->ha[3]; ++ l4kwqe->da4 = neigh->ha[4]; ++ l4kwqe->da5 = neigh->ha[5]; ++ ++ l4kwqe->sa0 = netdev->dev_addr[0]; ++ l4kwqe->sa1 = netdev->dev_addr[1]; ++ l4kwqe->sa2 = netdev->dev_addr[2]; ++ l4kwqe->sa3 = netdev->dev_addr[3]; ++ l4kwqe->sa4 = netdev->dev_addr[4]; ++ l4kwqe->sa5 = netdev->dev_addr[5]; ++#endif ++ ++ l4kwqe->etype = ETH_P_IP; ++ l4kwqe->ipid_count = DEF_IPID_COUNT; ++ l4kwqe->host_opaque = csk->l5_cid; ++ ++ if (csk->vlan_id) { ++ l4kwqe->pg_flags |= L4_KWQ_OFFLOAD_PG_VLAN_TAGGING; ++ l4kwqe->vlan_tag = csk->vlan_id; ++ l4kwqe->l2hdr_nbytes += 4; ++ } ++ ++ return (dev->submit_kwqes(dev, wqes, 1)); ++} ++ ++#ifndef __VMKLNX__ ++static int cnic_cm_update_pg(struct cnic_sock *csk) ++{ ++ struct cnic_dev *dev = csk->dev; ++ struct l4_kwq_update_pg *l4kwqe; ++ struct kwqe *wqes[1]; ++ struct neighbour *neigh = csk->dst->neighbour; ++ ++#ifndef HAVE_NETEVENT ++ memcpy(csk->old_ha, &neigh->ha[0], 6); ++#endif ++ l4kwqe = (struct l4_kwq_update_pg *) &csk->kwqe1; ++ memset(l4kwqe, 0, sizeof(*l4kwqe)); ++ wqes[0] = (struct kwqe *) l4kwqe; ++ ++ l4kwqe->opcode = L4_KWQE_OPCODE_VALUE_UPDATE_PG; ++ l4kwqe->flags = ++ L4_LAYER_CODE << L4_KWQ_UPDATE_PG_LAYER_CODE_SHIFT; ++ l4kwqe->pg_cid = csk->pg_cid; ++ l4kwqe->da0 = neigh->ha[0]; ++ l4kwqe->da1 = neigh->ha[1]; ++ l4kwqe->da2 = neigh->ha[2]; ++ l4kwqe->da3 = neigh->ha[3]; ++ l4kwqe->da4 = neigh->ha[4]; ++ l4kwqe->da5 = neigh->ha[5]; ++ ++ l4kwqe->pg_host_opaque = csk->l5_cid; ++ l4kwqe->pg_valids = L4_KWQ_UPDATE_PG_VALIDS_DA; ++ ++ return (dev->submit_kwqes(dev, wqes, 1)); ++} ++#endif ++ ++static int cnic_cm_upload_pg(struct cnic_sock *csk) ++{ ++ struct cnic_dev *dev = csk->dev; ++ struct l4_kwq_upload *l4kwqe; ++ struct kwqe *wqes[1]; ++ ++ l4kwqe = (struct l4_kwq_upload *) &csk->kwqe1; ++ memset(l4kwqe, 0, sizeof(*l4kwqe)); ++ wqes[0] = (struct kwqe *) l4kwqe; ++ ++ l4kwqe->opcode = L4_KWQE_OPCODE_VALUE_UPLOAD_PG; ++ l4kwqe->flags = ++ L4_LAYER_CODE << L4_KWQ_UPLOAD_LAYER_CODE_SHIFT; ++ l4kwqe->cid = csk->pg_cid; ++ ++ return (dev->submit_kwqes(dev, wqes, 1)); ++} ++ ++#ifdef HAVE_NETEVENT ++static void cnic_redirect(struct cnic_local *cp, struct dst_entry *new, ++ struct dst_entry *old) ++{ ++ int i, found = 0; ++ ++ for (i = 0; i < MAX_CM_SK_TBL_SZ && !found; i++) { ++ struct cnic_sock *csk; ++ struct cnic_redirect_entry cnic_redir; ++ ++ csk = &cp->csk_tbl[i]; ++ csk_hold(csk); ++ if (cnic_in_use(csk) && csk->dst == old) { ++ found = 1; ++ dst_hold(new); ++ dst_hold(old); ++ ++ cnic_redir.old_dst = old; ++ cnic_redir.new_dst = new; ++ cnic_queue_work(cp, WORK_TYPE_REDIRECT, &cnic_redir); ++ tasklet_schedule(&cp->cnic_task); ++ } ++ csk_put(csk); ++ } ++} ++ ++static void cnic_update_neigh(struct cnic_local *cp, struct neighbour *neigh) ++{ ++ int i, found = 0; ++ ++ for (i = 0; i < MAX_CM_SK_TBL_SZ && !found; i++) { ++ struct cnic_sock *csk; ++ ++ csk = &cp->csk_tbl[i]; ++ csk_hold(csk); ++ if (cnic_in_use(csk) && csk->dst) { ++ if (csk->dst->neighbour == neigh) { ++ found = 1; ++ neigh_hold(neigh); ++ ++ cnic_queue_work(cp, WORK_TYPE_NEIGH_UPDATE, ++ &neigh); ++ tasklet_schedule(&cp->cnic_task); ++ } ++ } ++ csk_put(csk); ++ } ++} ++ ++static int cnic_net_callback(struct notifier_block *this, unsigned long event, ++ void *ptr) ++{ ++ struct cnic_local *cp = container_of(this, struct cnic_local, cm_nb); ++ ++ if (event == NETEVENT_NEIGH_UPDATE) { ++ struct neighbour *neigh = ptr; ++ ++ cnic_update_neigh(cp, neigh); ++ ++ } else if (event == NETEVENT_REDIRECT) { ++ struct netevent_redirect *netevent = ptr; ++ struct dst_entry *old_dst = netevent->old; ++ struct dst_entry *new_dst = netevent->new; ++ ++ cnic_redirect(cp, new_dst, old_dst); ++ } ++ return 0; ++} ++#endif ++ ++static int cnic_cm_conn_req(struct cnic_sock *csk) ++{ ++ struct cnic_dev *dev = csk->dev; ++ struct l4_kwq_connect_req1 *l4kwqe1; ++ struct l4_kwq_connect_req2 *l4kwqe2; ++ struct l4_kwq_connect_req3 *l4kwqe3; ++ struct kwqe *wqes[3]; ++ u8 tcp_flags = 0; ++ int num_wqes = 2; ++ ++ l4kwqe1 = (struct l4_kwq_connect_req1 *) &csk->kwqe1; ++ l4kwqe2 = (struct l4_kwq_connect_req2 *) &csk->kwqe2; ++ l4kwqe3 = (struct l4_kwq_connect_req3 *) &csk->kwqe3; ++ memset(l4kwqe1, 0, sizeof(*l4kwqe1)); ++ memset(l4kwqe2, 0, sizeof(*l4kwqe2)); ++ memset(l4kwqe3, 0, sizeof(*l4kwqe3)); ++ ++ l4kwqe3->op_code = L4_KWQE_OPCODE_VALUE_CONNECT3; ++ l4kwqe3->flags = ++ L4_LAYER_CODE << L4_KWQ_CONNECT_REQ3_LAYER_CODE_SHIFT; ++ l4kwqe3->ka_timeout = csk->ka_timeout; ++ l4kwqe3->ka_interval = csk->ka_interval; ++ l4kwqe3->ka_max_probe_count = csk->ka_max_probe_count; ++ l4kwqe3->tos = csk->tos; ++ l4kwqe3->ttl = csk->ttl; ++ l4kwqe3->snd_seq_scale = csk->snd_seq_scale; ++ l4kwqe3->pmtu = csk->pmtu; ++ l4kwqe3->rcv_buf = csk->rcv_buf; ++ l4kwqe3->snd_buf = csk->snd_buf; ++ l4kwqe3->seed = csk->seed; ++ ++ wqes[0] = (struct kwqe *) l4kwqe1; ++ if (test_bit(SK_F_IPV6, &csk->flags)) { ++ wqes[1] = (struct kwqe *) l4kwqe2; ++ wqes[2] = (struct kwqe *) l4kwqe3; ++ num_wqes = 3; ++ ++ l4kwqe1->conn_flags = L4_KWQ_CONNECT_REQ1_IP_V6; ++ l4kwqe2->op_code = L4_KWQE_OPCODE_VALUE_CONNECT2; ++ l4kwqe2->flags = ++ L4_KWQ_CONNECT_REQ2_LINKED_WITH_NEXT | ++ L4_LAYER_CODE << L4_KWQ_CONNECT_REQ2_LAYER_CODE_SHIFT; ++ l4kwqe2->src_ip_v6_2 = be32_to_cpu(csk->src_ip[1]); ++ l4kwqe2->src_ip_v6_3 = be32_to_cpu(csk->src_ip[2]); ++ l4kwqe2->src_ip_v6_4 = be32_to_cpu(csk->src_ip[3]); ++ l4kwqe2->dst_ip_v6_2 = be32_to_cpu(csk->dst_ip[1]); ++ l4kwqe2->dst_ip_v6_3 = be32_to_cpu(csk->dst_ip[2]); ++ l4kwqe2->dst_ip_v6_4 = be32_to_cpu(csk->dst_ip[3]); ++ l4kwqe3->mss = l4kwqe3->pmtu - sizeof(struct ipv6hdr) - ++ sizeof(struct tcphdr); ++ } else { ++ wqes[1] = (struct kwqe *) l4kwqe3; ++ l4kwqe3->mss = l4kwqe3->pmtu - sizeof(struct iphdr) - ++ sizeof(struct tcphdr); ++ } ++ ++ l4kwqe1->op_code = L4_KWQE_OPCODE_VALUE_CONNECT1; ++ l4kwqe1->flags = ++ (L4_LAYER_CODE << L4_KWQ_CONNECT_REQ1_LAYER_CODE_SHIFT) | ++ L4_KWQ_CONNECT_REQ3_LINKED_WITH_NEXT; ++ l4kwqe1->cid = csk->cid; ++ l4kwqe1->pg_cid = csk->pg_cid; ++ l4kwqe1->src_ip = be32_to_cpu(csk->src_ip[0]); ++ l4kwqe1->dst_ip = be32_to_cpu(csk->dst_ip[0]); ++ l4kwqe1->src_port = be16_to_cpu(csk->src_port); ++ l4kwqe1->dst_port = be16_to_cpu(csk->dst_port); ++ if (csk->tcp_flags & SK_TCP_NO_DELAY_ACK) ++ tcp_flags |= L4_KWQ_CONNECT_REQ1_NO_DELAY_ACK; ++ if (csk->tcp_flags & SK_TCP_KEEP_ALIVE) ++ tcp_flags |= L4_KWQ_CONNECT_REQ1_KEEP_ALIVE; ++ if (csk->tcp_flags & SK_TCP_NAGLE) ++ tcp_flags |= L4_KWQ_CONNECT_REQ1_NAGLE_ENABLE; ++ if (csk->tcp_flags & SK_TCP_TIMESTAMP) ++ tcp_flags |= L4_KWQ_CONNECT_REQ1_TIME_STAMP; ++ if (csk->tcp_flags & SK_TCP_SACK) ++ tcp_flags |= L4_KWQ_CONNECT_REQ1_SACK; ++ if (csk->tcp_flags & SK_TCP_SEG_SCALING) ++ tcp_flags |= L4_KWQ_CONNECT_REQ1_SEG_SCALING; ++ ++ l4kwqe1->tcp_flags = tcp_flags; ++ ++ return (dev->submit_kwqes(dev, wqes, num_wqes)); ++} ++ ++static int cnic_cm_close_req(struct cnic_sock *csk) ++{ ++ struct cnic_dev *dev = csk->dev; ++ struct l4_kwq_close_req *l4kwqe; ++ struct kwqe *wqes[1]; ++ ++ l4kwqe = (struct l4_kwq_close_req *) &csk->kwqe2; ++ memset(l4kwqe, 0, sizeof(*l4kwqe)); ++ wqes[0] = (struct kwqe *) l4kwqe; ++ ++ l4kwqe->op_code = L4_KWQE_OPCODE_VALUE_CLOSE; ++ l4kwqe->flags = L4_LAYER_CODE << L4_KWQ_CLOSE_REQ_LAYER_CODE_SHIFT; ++ l4kwqe->cid = csk->cid; ++ ++ return (dev->submit_kwqes(dev, wqes, 1)); ++} ++ ++static int cnic_cm_abort_req(struct cnic_sock *csk) ++{ ++ struct cnic_dev *dev = csk->dev; ++ struct l4_kwq_reset_req *l4kwqe; ++ struct kwqe *wqes[1]; ++ ++ l4kwqe = (struct l4_kwq_reset_req *) &csk->kwqe2; ++ memset(l4kwqe, 0, sizeof(*l4kwqe)); ++ wqes[0] = (struct kwqe *) l4kwqe; ++ ++ l4kwqe->op_code = L4_KWQE_OPCODE_VALUE_RESET; ++ l4kwqe->flags = L4_LAYER_CODE << L4_KWQ_RESET_REQ_LAYER_CODE_SHIFT; ++ l4kwqe->cid = csk->cid; ++ ++ return (dev->submit_kwqes(dev, wqes, 1)); ++} ++ ++static int cnic_cm_create(struct cnic_dev *dev, int ulp_type, u32 cid, ++ u32 l5_cid, struct cnic_sock **csk, void *context) ++{ ++ struct cnic_local *cp = dev->cnic_priv; ++ struct cnic_sock *csk1; ++ ++ if (l5_cid >= MAX_CM_SK_TBL_SZ) ++ return -EINVAL; ++ ++ csk1 = &cp->csk_tbl[l5_cid]; ++ if (atomic_read(&csk1->ref_count)) ++ return -EAGAIN; ++ ++ if (test_and_set_bit(SK_F_INUSE, &csk1->flags)) ++ return -EBUSY; ++ ++ csk1->dev = dev; ++ csk1->cid = cid; ++ csk1->l5_cid = l5_cid; ++ csk1->ulp_type = ulp_type; ++ csk1->context = context; ++ ++ csk1->ka_timeout = DEF_KA_TIMEOUT; ++ csk1->ka_interval = DEF_KA_INTERVAL; ++ csk1->ka_max_probe_count = DEF_KA_MAX_PROBE_COUNT; ++ csk1->tos = DEF_TOS; ++ csk1->ttl = DEF_TTL; ++ csk1->snd_seq_scale = DEF_SND_SEQ_SCALE; ++ csk1->rcv_buf = DEF_RCV_BUF; ++ csk1->snd_buf = DEF_SND_BUF; ++ csk1->seed = DEF_SEED; ++ ++ *csk = csk1; ++ ++ return 0; ++} ++ ++static void cnic_cm_cleanup(struct cnic_sock *csk) ++{ ++#ifndef __VMKLNX__ ++ if (csk->dst) { ++ if (csk->dst->neighbour) ++ neigh_release(csk->dst->neighbour); ++ dst_release(csk->dst); ++ csk->dst = NULL; ++ } ++ csk->src_port = 0; ++#endif ++ if (csk->src_port) { ++ struct cnic_dev *dev = csk->dev; ++ struct cnic_local *cp = dev->cnic_priv; ++ ++ cnic_free_id(&cp->csk_port_tbl, ntohs(csk->src_port)); ++ csk->src_port = 0; ++ } ++} ++ ++static void cnic_close_conn(struct cnic_sock *csk) ++{ ++ if (test_bit(SK_F_PG_OFFLD_COMPLETE, &csk->flags)) { ++ cnic_cm_upload_pg(csk); ++ clear_bit(SK_F_PG_OFFLD_COMPLETE, &csk->flags); ++ } ++ cnic_cm_cleanup(csk); ++ smp_mb__before_clear_bit(); ++ clear_bit(SK_F_OFFLD_SCHED, &csk->flags); ++} ++ ++static int cnic_cm_destroy(struct cnic_sock *csk) ++{ ++ if (!cnic_in_use(csk)) ++ return -EINVAL; ++ ++ csk_hold(csk); ++ clear_bit(SK_F_INUSE, &csk->flags); ++ smp_mb__after_clear_bit(); ++ while (atomic_read(&csk->ref_count) != 1) ++ msleep(1); ++ cnic_cm_cleanup(csk); ++ ++ csk->flags = 0; ++ csk_put(csk); ++ return 0; ++} ++ ++static inline u16 cnic_get_vlan(struct net_device *dev, ++ struct net_device **vlan_dev) ++{ ++#ifndef __VMKLNX__ ++ if (dev->priv_flags & IFF_802_1Q_VLAN) { ++#ifdef VLAN_DEV_INFO ++ *vlan_dev = VLAN_DEV_INFO(dev)->real_dev; ++ return VLAN_DEV_INFO(dev)->vlan_id; ++#else ++#ifdef VLAN_TX_COOKIE_MAGIC ++ *vlan_dev = vlan_dev_info(dev)->real_dev; ++ return vlan_dev_info(dev)->vlan_id; ++#else ++ *vlan_dev = vlan_dev_real_dev(dev); ++ return vlan_dev_vlan_id(dev); ++#endif ++#endif ++ } ++#endif ++ *vlan_dev = dev; ++ return 0; ++} ++ ++#ifndef __VMKLNX__ ++static int cnic_get_v4_route(struct sockaddr_in *dst_addr, ++ struct sockaddr_in *src_addr, ++ struct dst_entry **dst) ++{ ++ struct flowi fl; ++ int err; ++ struct rtable *rt; ++ ++ memset(&fl, 0, sizeof(fl)); ++ fl.nl_u.ip4_u.daddr = dst_addr->sin_addr.s_addr; ++ if (src_addr) ++ fl.nl_u.ip4_u.saddr = src_addr->sin_addr.s_addr; ++ ++#if (LINUX_VERSION_CODE >= 0x020619) ++ err = ip_route_output_key(&init_net, &rt, &fl); ++#else ++ err = ip_route_output_key(&rt, &fl); ++#endif ++ if (!err) ++ *dst = &rt->u.dst; ++ return err; ++} ++ ++#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) ++static struct dst_entry *cnic_ip6_rte_output(struct sock *sk, struct flowi *fl) ++{ ++#if (LINUX_VERSION_CODE >= 0x02061a) ++ struct dst_entry *(*fn)(struct net *, struct sock *, struct flowi *); ++#else ++ struct dst_entry *(*fn)(struct sock *, struct flowi *); ++#endif ++ struct dst_entry *dst = NULL; ++ ++ fn = __symbol_get("ip6_route_output"); ++ if (fn) { ++#if (LINUX_VERSION_CODE >= 0x02061a) ++ dst = (*fn)(&init_net, sk, fl); ++#else ++ dst = (*fn)(sk, fl); ++#endif ++ __symbol_put("ip6_route_output"); ++ } ++ return dst; ++} ++ ++static int cnic_ipv6_addr_type(const struct in6_addr *addr) ++{ ++ int (*fn)(const struct in6_addr *addr); ++ int type = 0; ++ ++ fn = __symbol_get("__ipv6_addr_type"); ++ if (fn) { ++ type = fn(addr) & 0xffff; ++ __symbol_put("__ipv6_addr_type"); ++ } ++ return type; ++} ++ ++static int cnic_ipv6_get_saddr(struct dst_entry *dst, ++ const struct in6_addr *daddr, ++ struct in6_addr *saddr) ++{ ++ int rc = -ENOENT; ++ ++#if (LINUX_VERSION_CODE >= 0x02061b) ++ int (*fn)(struct net *, struct net_device *, ++ const struct in6_addr *daddr, unsigned int prefs, ++ struct in6_addr *saddr); ++ ++ fn = __symbol_get("ipv6_dev_get_saddr"); ++ if (fn) { ++ rc = fn(&init_net, dst->dev, daddr, 0, saddr); ++ __symbol_put("ipv6_dev_get_saddr"); ++ } ++ ++#elif (LINUX_VERSION_CODE >= 0x02061a) ++ int (*fn)(struct net_device *, ++ const struct in6_addr *daddr, unsigned int prefs, ++ struct in6_addr *saddr); ++ ++ fn = __symbol_get("ipv6_dev_get_saddr"); ++ if (fn) { ++ rc = fn(dst->dev, daddr, 0, saddr); ++ __symbol_put("ipv6_dev_get_saddr"); ++ } ++ ++#else ++ int (*fn)(struct dst_entry *, ++ const struct in6_addr *daddr, struct in6_addr *saddr); ++ ++ fn = __symbol_get("ipv6_get_saddr"); ++ if (fn) { ++ rc = fn(dst, daddr, saddr); ++ __symbol_put("ipv6_get_saddr"); ++ } ++#endif ++ return rc; ++} ++ ++#endif ++ ++static int cnic_get_v6_route(struct sockaddr_in6 *dst_addr, ++ struct sockaddr_in6 *src_addr, ++ struct dst_entry **dst) ++{ ++#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) ++ struct flowi fl; ++ ++ memset(&fl, 0, sizeof(fl)); ++ ipv6_addr_copy(&fl.fl6_dst, &dst_addr->sin6_addr); ++ if (cnic_ipv6_addr_type(&fl.fl6_dst) & IPV6_ADDR_LINKLOCAL) ++ fl.oif = dst_addr->sin6_scope_id; ++ ++ if (src_addr) ++ ipv6_addr_copy(&fl.fl6_src, &src_addr->sin6_addr); ++ ++ *dst = cnic_ip6_rte_output(NULL, &fl); ++ if (*dst) ++ return 0; ++#endif ++ ++ return -ENETUNREACH; ++} ++#endif /*__VMKLNX__*/ ++ ++#ifdef __VMKLNX__ ++static struct cnic_dev *cnic_cm_select_dev(vmk_IscsiNetHandle iscsiNetHandle, ++ struct sockaddr_in *dst_addr, ++ int ulp_type) ++{ ++ char vmknic[VMK_VMKNIC_NAME_MAX]; ++ char devName[VMK_UPLINK_DEVICE_NAME_MAX]; ++ struct cnic_dev *dev; ++ int found = 0; ++ VMK_ReturnStatus status; ++ ++ /* Retrieve the uplink device name corresponding to the vmknic */ ++ status = vmk_IscsiNetHandleGetVmknic(iscsiNetHandle, vmknic); ++ if (status != VMK_OK) ++ return NULL; ++ status = vmk_IscsiNetVmknicGetUplinkDevName(iscsiNetHandle, devName); ++ if (status != VMK_OK) ++ return NULL; ++ ++#ifndef __VMKLNX__ ++ read_lock(&cnic_dev_lock); ++#endif ++ list_for_each_entry(dev, &cnic_dev_list, list) { ++ struct cnic_local *cp = dev->cnic_priv; ++ ++ if (dev->netdev && test_bit(CNIC_F_IF_UP, &dev->flags)) { ++ if (!strcmp(dev->netdev->name, devName)) { ++ found = 1; ++ strcpy(cp->vmknic, vmknic); ++ memcpy(&cp->iscsiNetHandle, &iscsiNetHandle, ++ sizeof(iscsiNetHandle)); ++ cp->iscsiNetHandle.ptr = cp->vmknic; ++ ++ /* Allocate TCP ports, only once per device */ ++ if (cp->csk_port_tbl.table) ++ break; ++ ++ strcpy(cp->first_vmknic, vmknic); ++ memcpy(&cp->first_iscsiNetHandle, ++ &iscsiNetHandle, sizeof(iscsiNetHandle)); ++ cp->first_iscsiNetHandle.ptr = cp->first_vmknic; ++ cp->cnic_local_port_nr = MAX_CM_SK_TBL_SZ; ++ cp->cnic_local_port_min = 1; ++ status = vmk_IscsiNetTcpPortAlloc( ++ cp->first_iscsiNetHandle, ++ &cp->cnic_local_port_nr, ++ &cp->cnic_local_port_min); ++ if (status != VMK_OK) ++ printk(KERN_ALERT "%s TCP port alloc failed %d\n", ++ dev->netdev->name, status); ++ if (status == VMK_OK || status == VMK_EXISTS) { ++ cnic_init_id_tbl(&cp->csk_port_tbl, ++ cp->cnic_local_port_nr, ++ cp->cnic_local_port_min, ++ cp->next_tcp_port); ++ } else { ++ found = 0; ++ } ++ break; ++ } ++ } ++ } ++#ifndef __VMKLNX__ ++ read_unlock(&cnic_dev_lock); ++#endif ++ ++ if (!found) ++ dev = NULL; ++ return dev; ++} ++ ++#else ++static struct cnic_dev *cnic_cm_select_dev(struct sockaddr_in *dst_addr, ++ int ulp_type) ++{ ++ struct cnic_dev *dev = NULL; ++ struct dst_entry *dst; ++ struct net_device *netdev = NULL; ++ int err = -ENETUNREACH, found = 0; ++ ++ if (dst_addr->sin_family == AF_INET) ++ err = cnic_get_v4_route(dst_addr, NULL, &dst); ++ else if (dst_addr->sin_family == AF_INET6) { ++ struct sockaddr_in6 *dst_addr6 = ++ (struct sockaddr_in6 *) dst_addr; ++ ++ err = cnic_get_v6_route(dst_addr6, NULL, &dst); ++ } else ++ return NULL; ++ ++ if (err) ++ return NULL; ++ ++ if (!dst->dev) ++ goto done; ++ ++ cnic_get_vlan(dst->dev, &netdev); ++ ++ read_lock(&cnic_dev_lock); ++ list_for_each_entry(dev, &cnic_dev_list, list) { ++ if (netdev == dev->netdev) { ++ found = 1; ++ break; ++ } ++ } ++ read_unlock(&cnic_dev_lock); ++ ++done: ++ dst_release(dst); ++ if (!found) ++ dev = NULL; ++ return dev; ++} ++#endif /*__VMKLNX__*/ ++ ++#ifndef __VMKLNX__ ++static int cnic_resolve_addr(struct cnic_sock *csk) ++{ ++ struct neighbour *neigh = csk->dst->neighbour; ++ int err = 0; ++#ifndef HAVE_NETEVENT ++ int retry = 0; ++#endif ++ ++ if (neigh->nud_state & NUD_VALID) { ++ err = -EINVAL; ++ if (cnic_offld_prep(csk)) ++ err = cnic_cm_offload_pg(csk); ++ goto done; ++ } ++ ++ set_bit(SK_F_NDISC_WAITING, &csk->flags); ++ neigh_event_send(neigh, NULL); ++#ifndef HAVE_NETEVENT ++ while (!(neigh->nud_state & NUD_VALID) && (retry < 3)) { ++ msleep(1000); ++ retry++; ++ } ++ if (!(neigh->nud_state & NUD_VALID)) ++ err = -ETIMEDOUT; ++ else { ++ err = -EINVAL; ++ if (cnic_offld_prep(csk)) ++ err = cnic_cm_offload_pg(csk); ++ } ++ clear_bit(SK_F_NDISC_WAITING, &csk->flags); ++#endif ++done: ++ return err; ++} ++ ++static int cnic_get_route(struct cnic_sock *csk, struct cnic_sockaddr *saddr) ++{ ++ struct cnic_dev *dev = csk->dev; ++ int is_v6, err; ++ struct dst_entry *dst; ++ struct net_device *realdev; ++ ++ if (saddr->local.v6.sin6_family == AF_INET6 && ++ saddr->remote.v6.sin6_family == AF_INET6) ++ is_v6 = 1; ++ else if (saddr->local.v4.sin_family == AF_INET && ++ saddr->remote.v4.sin_family == AF_INET) ++ is_v6 = 0; ++ else ++ return -EINVAL; ++ ++ clear_bit(SK_F_IPV6, &csk->flags); ++ ++ if (is_v6) { ++#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) ++ set_bit(SK_F_IPV6, &csk->flags); ++ err = cnic_get_v6_route(&saddr->remote.v6, ++ &saddr->local.v6, &dst); ++ if (err) ++ return err; ++ ++ if (!dst || dst->error || !dst->dev) ++ goto err_out; ++ ++ cnic_ipv6_get_saddr(dst, &saddr->remote.v6.sin6_addr, ++ &saddr->local.v6.sin6_addr); ++ ++ memcpy(&csk->src_ip[0], &saddr->local.v6.sin6_addr, ++ sizeof(struct in6_addr)); ++ memcpy(&csk->dst_ip[0], &saddr->remote.v6.sin6_addr, ++ sizeof(struct in6_addr)); ++ csk->src_port = saddr->local.v6.sin6_port; ++ csk->dst_port = saddr->remote.v6.sin6_port; ++#else ++ return -ENETUNREACH; ++#endif ++ ++ } else { ++ err = cnic_get_v4_route(&saddr->remote.v4, &saddr->local.v4, ++ &dst); ++ if (err) ++ return err; ++ ++ if (!dst || dst->error || !dst->dev) ++ goto err_out; ++ ++ csk->dst_ip[0] = saddr->remote.v4.sin_addr.s_addr; ++ csk->src_ip[0] = saddr->local.v4.sin_addr.s_addr; ++ csk->src_port = saddr->local.v4.sin_port; ++ csk->dst_port = saddr->remote.v4.sin_port; ++ ++ if (csk->src_ip[0] == 0) { ++ csk->src_ip[0] = ++ inet_select_addr(dst->dev, csk->dst_ip[0], ++ RT_SCOPE_LINK); ++ } ++ } ++ ++ csk->vlan_id = cnic_get_vlan(dst->dev, &realdev); ++ if (realdev != dev->netdev) ++ goto err_out; ++ ++ csk->dst = dst; ++ csk->pmtu = dst_mtu(csk->dst); ++ return 0; ++ ++err_out: ++ dst_release(dst); ++ return -ENETUNREACH; ++} ++#else ++ ++static int cnic_get_route(struct cnic_sock *csk, struct cnic_sockaddr *saddr) ++{ ++ struct cnic_dev *dev = csk->dev; ++ struct cnic_local *cp = dev->cnic_priv; ++ char vmknic[VMK_VMKNIC_NAME_MAX]; ++ vmk_SocketAddress srcIPAddr, dstIPAddr; ++ vmk_EthAddress nextHopMAC; ++ vmk_int32 pmtu; ++ vmk_uint16 vlanId; ++ int err, retry = 0; ++ int local_port; ++ ++ if (saddr->local.v4.sin_family != AF_INET && ++ saddr->remote.v4.sin_family != AF_INET6) ++ return -EINVAL; ++ ++ /* Currently we only support IPv4 */ ++ memcpy(&dstIPAddr, &saddr->remote, sizeof(vmk_SocketIPAddress)); ++ dstIPAddr.sa_family = VMK_SOCKET_AF_INET; ++ ++ /* Next hop (arp) resolve */ ++ while (retry++ < 10) { ++ err = vmk_IscsiNetNextHopMACLookup(cp->iscsiNetHandle, dstIPAddr, nextHopMAC); ++ if (nextHopMAC[0] || nextHopMAC[1] || nextHopMAC[2]) { ++ if (!err) ++ break; ++ } ++ msleep(100); ++ } ++ ++ if (err) ++ return err; ++ ++ if (!nextHopMAC[0] && !nextHopMAC[1] && !nextHopMAC[2]) { ++ printk(KERN_ALERT "Zero next hop address, aborting\n"); ++ return -EINVAL; ++ } ++ ++ if (!cnic_offld_prep(csk)) ++ return -EINVAL; ++ ++ clear_bit(SK_F_IPV6, &csk->flags); ++ ++ memcpy(csk->ha, nextHopMAC, 6); ++ local_port = cnic_alloc_new_id(&cp->csk_port_tbl); ++ if (local_port == -1) { ++ clear_bit(SK_F_OFFLD_SCHED, &csk->flags); ++ return -ENOMEM; ++ } ++ ++ if (vmk_IscsiNetPmtuLookup(cp->iscsiNetHandle, dstIPAddr, &pmtu) == VMK_OK) ++ csk->pmtu = pmtu; ++ else ++ csk->pmtu = 1500; ++ ++ /* Retrieve the IP Address of the vmknic */ ++ srcIPAddr.sa_family = VMK_SOCKET_AF_INET; ++ if (vmk_IscsiNetHandleGetVmknic(cp->iscsiNetHandle, vmknic) != VMK_OK) ++ return -EINVAL; ++ if (vmk_VmknicIPAddrGet(vmknic, &srcIPAddr) != VMK_OK) ++ return -EINVAL; ++ ++ csk->src_ip[0] = ((vmk_SocketIPAddress *)&srcIPAddr)->sin_addr.s_addr; ++ csk->dst_ip[0] = saddr->remote.v4.sin_addr.s_addr; ++ csk->src_port = htons(local_port); ++ csk->dst_port = saddr->remote.v4.sin_port; ++ ++ if (vmk_IscsiNetVmknicGetVlanID(cp->iscsiNetHandle, &vlanId) != VMK_OK) ++ return -EINVAL; ++ ++ csk->vlan_id = vlanId; ++ ++ err = cnic_cm_offload_pg(csk); ++ ++ return err; ++} ++#endif /*__VMKLNX__*/ ++ ++static void cnic_init_csk_state(struct cnic_sock *csk) ++{ ++ csk->state = 0; ++ clear_bit(SK_F_OFFLD_SCHED, &csk->flags); ++ clear_bit(SK_F_CLOSING, &csk->flags); ++} ++ ++static int cnic_cm_connect(struct cnic_sock *csk, struct cnic_sockaddr *saddr) ++{ ++#ifndef __VMKLNX__ ++ struct neighbour *neigh; ++#endif ++ int err = 0; ++ ++ if (!cnic_in_use(csk)) ++ return -EINVAL; ++ ++ if (test_and_set_bit(SK_F_CONNECT_START, &csk->flags)) ++ return -EINVAL; ++ ++ cnic_init_csk_state(csk); ++ ++ err = cnic_get_route(csk, saddr); ++ if (err) ++ goto err_out; ++ ++#ifndef __VMKLNX__ ++ neigh = csk->dst->neighbour; ++ if (!neigh) ++ goto err_out; ++ ++ neigh_hold(neigh); ++ ++ err = cnic_resolve_addr(csk); ++ if (!err) ++ return 0; ++ ++ neigh_release(neigh); ++ ++#endif ++err_out: ++#ifndef __VMKLNX__ ++ if (csk->dst) { ++ dst_release(csk->dst); ++ csk->dst = NULL; ++ } ++#endif ++ clear_bit(SK_F_CONNECT_START, &csk->flags); ++ return err; ++} ++ ++static int cnic_cm_abort(struct cnic_sock *csk) ++{ ++ struct cnic_local *cp = csk->dev->cnic_priv; ++ u32 opcode; ++ ++ if (!cnic_in_use(csk)) ++ return -EINVAL; ++ ++ clear_bit(SK_F_NDISC_WAITING, &csk->flags); ++ clear_bit(SK_F_CONNECT_START, &csk->flags); ++ smp_mb__after_clear_bit(); ++ if (cnic_abort_prep(csk)) ++ return (cnic_cm_abort_req(csk)); ++ ++ /* Getting here means that we haven't started connect, or ++ * connect was not successful. ++ */ ++ ++ csk->state = L4_KCQE_OPCODE_VALUE_RESET_COMP; ++ if (test_bit(SK_F_PG_OFFLD_COMPLETE, &csk->flags)) ++ opcode = csk->state; ++ else ++ opcode = L5CM_RAMROD_CMD_ID_TERMINATE_OFFLOAD; ++ cp->close_conn(csk, opcode); ++ ++ return 0; ++} ++ ++static int cnic_cm_close(struct cnic_sock *csk) ++{ ++ if (!cnic_in_use(csk)) ++ return -EINVAL; ++ ++ if (cnic_close_prep(csk)) { ++ csk->state = L4_KCQE_OPCODE_VALUE_CLOSE_COMP; ++ return (cnic_cm_close_req(csk)); ++ } ++ return 0; ++} ++ ++static void cnic_cm_upcall(struct cnic_local *cp, struct cnic_sock *csk, ++ u8 opcode) ++{ ++ struct cnic_ulp_ops *ulp_ops; ++ int ulp_type = csk->ulp_type; ++ ++ rcu_read_lock(); ++ ulp_ops = rcu_dereference(cp->ulp_ops[ulp_type]); ++ if (ulp_ops) { ++ if (opcode == L4_KCQE_OPCODE_VALUE_CONNECT_COMPLETE) ++ ulp_ops->cm_connect_complete(csk); ++ else if (opcode == L4_KCQE_OPCODE_VALUE_CLOSE_COMP) ++ ulp_ops->cm_close_complete(csk); ++ else if (opcode == L4_KCQE_OPCODE_VALUE_RESET_RECEIVED) ++ ulp_ops->cm_remote_abort(csk); ++ else if (opcode == L4_KCQE_OPCODE_VALUE_RESET_COMP) ++ ulp_ops->cm_abort_complete(csk); ++ else if (opcode == L4_KCQE_OPCODE_VALUE_CLOSE_RECEIVED) ++ ulp_ops->cm_remote_close(csk); ++ } ++ rcu_read_unlock(); ++} ++ ++static int cnic_cm_set_pg(struct cnic_sock *csk) ++{ ++#ifndef __VMKLNX__ ++ struct neighbour *neigh = csk->dst->neighbour; ++ int valid = neigh->nud_state & NUD_VALID; ++ ++ if (!valid) { ++ if (test_and_clear_bit(SK_F_NDISC_WAITING, &csk->flags)) { ++ clear_bit(SK_F_CONNECT_START, &csk->flags); ++ cnic_cm_cleanup(csk); ++ return -ETIMEDOUT; ++ } ++ } ++ ++ if (cnic_offld_prep(csk)) { ++ if (test_bit(SK_F_PG_OFFLD_COMPLETE, &csk->flags)) ++ cnic_cm_update_pg(csk); ++ else ++ cnic_cm_offload_pg(csk); ++ } ++ clear_bit(SK_F_NDISC_WAITING, &csk->flags); ++#endif ++ return 0; ++} ++ ++static void cnic_cm_process_neigh(struct cnic_dev *dev, struct neighbour *neigh) ++{ ++#ifndef __VMKLNX__ ++ struct cnic_local *cp = dev->cnic_priv; ++ int i; ++ ++ for (i = 0; i < MAX_CM_SK_TBL_SZ; i++) { ++ struct cnic_sock *csk; ++ int abort = 0; ++ ++ csk = &cp->csk_tbl[i]; ++ csk_hold(csk); ++ if (cnic_in_use(csk) && csk->dst && ++ csk->dst->neighbour == neigh) { ++ if (cnic_cm_set_pg(csk)) ++ abort = 1; ++ } ++ if (abort) ++ cnic_cm_upcall(cp, csk, ++ L4_KCQE_OPCODE_VALUE_CONNECT_COMPLETE); ++ csk_put(csk); ++ } ++ neigh_release(neigh); ++#endif ++} ++ ++static void cnic_cm_process_redirect(struct cnic_dev *dev, ++ struct cnic_redirect_entry *redir) ++{ ++#ifndef __VMKLNX__ ++ struct cnic_local *cp = dev->cnic_priv; ++ int i; ++ ++ for (i = 0; i < MAX_CM_SK_TBL_SZ; i++) { ++ struct cnic_sock *csk; ++ int abort = 0; ++ ++ csk = &cp->csk_tbl[i]; ++ csk_hold(csk); ++ if (cnic_in_use(csk) && csk->dst == redir->old_dst) { ++ csk->dst = redir->new_dst; ++ dst_hold(csk->dst); ++ neigh_hold(csk->dst->neighbour); ++ if (redir->old_dst->neighbour); ++ neigh_release(redir->old_dst->neighbour); ++ dst_release(redir->old_dst); ++ if (cnic_cm_set_pg(csk)) ++ abort = 1; ++ } ++ if (abort) ++ cnic_cm_upcall(cp, csk, ++ L4_KCQE_OPCODE_VALUE_CONNECT_COMPLETE); ++ csk_put(csk); ++ } ++ ++ dst_release(redir->new_dst); ++ dst_release(redir->old_dst); ++#endif ++} ++ ++static void cnic_cm_process_offld_pg(struct cnic_dev *dev, struct l4_kcq *kcqe) ++{ ++ struct cnic_local *cp = dev->cnic_priv; ++ u32 l5_cid = kcqe->pg_host_opaque; ++ u8 opcode = kcqe->op_code; ++ struct cnic_sock *csk = &cp->csk_tbl[l5_cid]; ++ ++ csk_hold(csk); ++ if (!cnic_in_use(csk)) ++ goto done; ++ ++ if (opcode == L4_KCQE_OPCODE_VALUE_UPDATE_PG) { ++ clear_bit(SK_F_OFFLD_SCHED, &csk->flags); ++ goto done; ++ } ++ if (kcqe->status != 0) { ++ clear_bit(SK_F_OFFLD_SCHED, &csk->flags); ++ cnic_cm_upcall(cp, csk, ++ L4_KCQE_OPCODE_VALUE_CONNECT_COMPLETE); ++ goto done; ++ } ++ ++ csk->pg_cid = kcqe->pg_cid; ++ set_bit(SK_F_PG_OFFLD_COMPLETE, &csk->flags); ++ cnic_cm_conn_req(csk); ++ ++done: ++ csk_put(csk); ++} ++ ++static void cnic_cm_process_kcqe(struct cnic_dev *dev, struct kcqe *kcqe) ++{ ++ struct cnic_local *cp = dev->cnic_priv; ++ struct l4_kcq *l4kcqe = (struct l4_kcq *) kcqe; ++ u8 opcode = l4kcqe->op_code; ++ u32 l5_cid; ++ struct cnic_sock *csk; ++ ++ if (opcode == L4_KCQE_OPCODE_VALUE_OFFLOAD_PG || ++ opcode == L4_KCQE_OPCODE_VALUE_UPDATE_PG) { ++ cnic_cm_process_offld_pg(dev, l4kcqe); ++ return; ++ } ++ ++ l5_cid = l4kcqe->conn_id; ++ /* Hack */ ++ if (opcode & 0x80) ++ l5_cid = l4kcqe->cid; ++ if (l5_cid >= MAX_CM_SK_TBL_SZ) ++ return; ++ ++ csk = &cp->csk_tbl[l5_cid]; ++ csk_hold(csk); ++ ++ if (!cnic_in_use(csk)) { ++ csk_put(csk); ++ return; ++ } ++ ++ switch (opcode) { ++ case L5CM_RAMROD_CMD_ID_TCP_CONNECT: ++ if (l4kcqe->status != 0) { ++ clear_bit(SK_F_OFFLD_SCHED, &csk->flags); ++ cnic_cm_upcall(cp, csk, ++ L4_KCQE_OPCODE_VALUE_CONNECT_COMPLETE); ++ } ++ break; ++ case L4_KCQE_OPCODE_VALUE_CONNECT_COMPLETE: ++ if (l4kcqe->status == 0) ++ set_bit(SK_F_OFFLD_COMPLETE, &csk->flags); ++ ++ smp_mb__before_clear_bit(); ++ clear_bit(SK_F_OFFLD_SCHED, &csk->flags); ++ cnic_cm_upcall(cp, csk, opcode); ++ break; ++ ++ case L4_KCQE_OPCODE_VALUE_RESET_RECEIVED: ++ if (test_and_clear_bit(SK_F_OFFLD_COMPLETE, &csk->flags)) ++ csk->state = opcode; ++ /* fall through */ ++ case L4_KCQE_OPCODE_VALUE_CLOSE_COMP: ++ case L4_KCQE_OPCODE_VALUE_RESET_COMP: ++ case L5CM_RAMROD_CMD_ID_SEARCHER_DELETE: ++ case L5CM_RAMROD_CMD_ID_TERMINATE_OFFLOAD: ++ cp->close_conn(csk, opcode); ++ break; ++ ++ case L4_KCQE_OPCODE_VALUE_CLOSE_RECEIVED: ++ cnic_cm_upcall(cp, csk, opcode); ++ break; ++ } ++ csk_put(csk); ++} ++ ++static void cnic_cm_indicate_kcqe(void *data, struct kcqe *kcqe[], u32 num_cqe) ++{ ++ struct cnic_dev *dev = data; ++ int i; ++ struct cnic_local *cp = dev->cnic_priv; ++ ++ for (i = 0; i < num_cqe; i++) ++ cnic_queue_work(cp, WORK_TYPE_KCQE, kcqe[i]); ++ ++ tasklet_schedule(&cp->cnic_task); ++} ++ ++static void cnic_cm_indicate_event(void *data, unsigned long event) ++{ ++} ++ ++static void cnic_cm_dummy(void *data) ++{ ++} ++ ++static struct cnic_ulp_ops cm_ulp_ops = { ++ .cnic_start = cnic_cm_dummy, ++ .cnic_stop = cnic_cm_dummy, ++ .indicate_kcqes = cnic_cm_indicate_kcqe, ++ .indicate_netevent = cnic_cm_indicate_event, ++ .indicate_inetevent = cnic_cm_indicate_event, ++}; ++ ++static void cnic_task(unsigned long data) ++{ ++ struct cnic_local *cp = (struct cnic_local *) data; ++ struct cnic_dev *dev = cp->dev; ++ u32 cons = cp->cnic_wr_cons; ++ u32 prod = cp->cnic_wr_prod; ++ ++ while (cons != prod) { ++ struct cnic_work_node *node; ++ ++ node = &cp->cnic_work_ring[cons]; ++ if (node->work_type == WORK_TYPE_KCQE) ++ cnic_cm_process_kcqe(dev, &node->work_data.kcqe); ++ else if (node->work_type == WORK_TYPE_NEIGH_UPDATE) ++ cnic_cm_process_neigh(dev, node->work_data.neigh); ++ else if (node->work_type == WORK_TYPE_REDIRECT) ++ cnic_cm_process_redirect(dev, ++ &node->work_data.cnic_redir); ++ cons++; ++ cons &= WORK_RING_SIZE_MASK; ++ } ++ cp->cnic_wr_cons = cons; ++} ++ ++static void cnic_free_dev(struct cnic_dev *dev) ++{ ++ int i = 0; ++ ++ while ((atomic_read(&dev->ref_count) != 0) && i < 10) { ++ msleep(100); ++ i++; ++ } ++ if (atomic_read(&dev->ref_count) != 0) ++ printk(KERN_ERR PFX "%s: Failed waiting for ref count to go" ++ " to zero.\n", dev->netdev->name); ++ ++ printk(KERN_INFO PFX "Removed CNIC device: %s\n", dev->netdev->name); ++ dev_put(dev->netdev); ++ kfree(dev); ++} ++ ++static void cnic_cm_free_mem(struct cnic_dev *dev) ++{ ++ struct cnic_local *cp = dev->cnic_priv; ++ ++ kfree(cp->csk_tbl); ++ cp->csk_tbl = NULL; ++ cp->next_tcp_port = cnic_free_id_tbl(&cp->csk_port_tbl); ++} ++ ++static int cnic_cm_alloc_mem(struct cnic_dev *dev) ++{ ++ struct cnic_local *cp = dev->cnic_priv; ++ ++ cp->csk_tbl = kmalloc(sizeof(struct cnic_sock) * MAX_CM_SK_TBL_SZ, ++ GFP_KERNEL); ++ if (!cp->csk_tbl) ++ return -ENOMEM; ++ memset(cp->csk_tbl, 0, sizeof(struct cnic_sock) * MAX_CM_SK_TBL_SZ); ++ ++ return 0; ++} ++ ++#ifndef HAVE_NETEVENT ++#ifndef __VMKLNX__ ++static void cnic_timer(unsigned long data) ++{ ++ struct cnic_local *cp = (struct cnic_local *) data; ++ struct cnic_dev *dev = cp->dev; ++ int i, found = 0; ++ struct neighbour *neigh = NULL; ++ ++ if (!test_bit(CNIC_F_CNIC_UP, &dev->flags)) ++ return; ++ ++ for (i = 0; i < MAX_CM_SK_TBL_SZ && !found; i++) { ++ struct cnic_sock *csk; ++ ++ csk = &cp->csk_tbl[i]; ++ csk_hold(csk); ++ if (cnic_in_use(csk) && csk->dst && ++ test_bit(SK_F_PG_OFFLD_COMPLETE, &csk->flags)) { ++ neigh = csk->dst->neighbour; ++ if (memcmp(csk->old_ha, neigh->ha, 6)) { ++ found = 1; ++ neigh_hold(neigh); ++ ++ cnic_queue_work(cp, WORK_TYPE_NEIGH_UPDATE, ++ &neigh); ++ tasklet_schedule(&cp->cnic_task); ++ } ++ } ++ csk_put(csk); ++ } ++ ++ cp->cnic_timer.expires = jiffies + cp->cnic_timer_off; ++ add_timer(&cp->cnic_timer); ++} ++#endif ++#endif ++ ++static int cnic_ready_to_close(struct cnic_sock *csk, u32 opcode) ++{ ++ if ((opcode == csk->state) || ++ (opcode == L4_KCQE_OPCODE_VALUE_RESET_RECEIVED && ++ csk->state == L4_KCQE_OPCODE_VALUE_CLOSE_COMP)) { ++ if (!test_and_set_bit(SK_F_CLOSING, &csk->flags)) ++ return 1; ++ } ++ return 0; ++} ++ ++static void cnic_close_bnx2_conn(struct cnic_sock *csk, u32 opcode) ++{ ++ struct cnic_dev *dev = csk->dev; ++ struct cnic_local *cp = dev->cnic_priv; ++ ++ clear_bit(SK_F_CONNECT_START, &csk->flags); ++ if (cnic_ready_to_close(csk, opcode)) { ++ cnic_close_conn(csk); ++ cnic_cm_upcall(cp, csk, opcode); ++ } ++} ++ ++static void cnic_cm_stop_bnx2_hw(struct cnic_dev *dev) ++{ ++} ++ ++static int cnic_cm_init_bnx2_hw(struct cnic_dev *dev) ++{ ++ u32 seed; ++ ++#if (LINUX_VERSION_CODE >= 0x020612) ++ get_random_bytes(&seed, 4); ++#else ++ seed = 0x12345678; ++#endif ++ cnic_ctx_wr(dev, 45, 0, seed); ++ return 0; ++} ++ ++static void cnic_close_bnx2x_conn(struct cnic_sock *csk, u32 opcode) ++{ ++ struct cnic_dev *dev = csk->dev; ++ struct cnic_local *cp = dev->cnic_priv; ++ struct cnic_context *ctx = &cp->ctx_tbl[csk->l5_cid]; ++ union l5cm_specific_data l5_data; ++ u32 cmd = 0; ++ int close_complete = 0; ++ ++ switch (opcode) { ++ case L4_KCQE_OPCODE_VALUE_RESET_RECEIVED: ++ case L4_KCQE_OPCODE_VALUE_CLOSE_COMP: ++ case L4_KCQE_OPCODE_VALUE_RESET_COMP: ++ if (cnic_ready_to_close(csk, opcode)) ++ cmd = L5CM_RAMROD_CMD_ID_SEARCHER_DELETE; ++ break; ++ case L5CM_RAMROD_CMD_ID_SEARCHER_DELETE: ++ cmd = L5CM_RAMROD_CMD_ID_TERMINATE_OFFLOAD; ++ break; ++ case L5CM_RAMROD_CMD_ID_TERMINATE_OFFLOAD: ++ close_complete = 1; ++ break; ++ } ++ if (cmd) { ++ memset(&l5_data, 0, sizeof(l5_data)); ++ ++ cnic_submit_kwqe_16(dev, cmd, csk->cid, ISCSI_CONNECTION_TYPE, ++ &l5_data); ++ } else if (close_complete) { ++ ctx->timestamp = jiffies; ++ cnic_close_conn(csk); ++ cnic_cm_upcall(cp, csk, csk->state); ++ } ++} ++ ++static void cnic_cm_stop_bnx2x_hw(struct cnic_dev *dev) ++{ ++} ++ ++static int cnic_cm_init_bnx2x_hw(struct cnic_dev *dev) ++{ ++ struct cnic_local *cp = dev->cnic_priv; ++ int func = CNIC_FUNC(cp); ++ struct net_device *netdev = dev->netdev; ++ struct xstorm_l5cm_tcp_flags xstorm_flags; ++ struct tstorm_l5cm_tcp_flags tstorm_flags; ++ ++ cnic_init_bnx2x_mac(dev, netdev->dev_addr); ++ ++ CNIC_WR16(dev, BAR_XSTRORM_INTMEM + ++ XSTORM_ISCSI_LOCAL_VLAN_OFFSET(func), 0); ++ ++ CNIC_WR(dev, BAR_XSTRORM_INTMEM + ++ XSTORM_TCP_GLOBAL_DEL_ACK_COUNTER_ENABLED_OFFSET(func), 1); ++ CNIC_WR(dev, BAR_XSTRORM_INTMEM + ++ XSTORM_TCP_GLOBAL_DEL_ACK_COUNTER_MAX_COUNT_OFFSET(func), ++ DEF_MAX_DA_COUNT); ++ ++ memset(&xstorm_flags, 0, sizeof(xstorm_flags)); ++ xstorm_flags.flags |= XSTORM_L5CM_TCP_FLAGS_TS_ENABLED; ++ xstorm_flags.flags |= XSTORM_L5CM_TCP_FLAGS_WND_SCL_EN; ++ ++ CNIC_WR8(dev, BAR_XSTRORM_INTMEM + ++ XSTORM_ISCSI_TCP_VARS_TTL_OFFSET(func), DEF_TTL); ++ CNIC_WR8(dev, BAR_XSTRORM_INTMEM + ++ XSTORM_ISCSI_TCP_VARS_TOS_OFFSET(func), DEF_TOS); ++ CNIC_WR8(dev, BAR_XSTRORM_INTMEM + ++ XSTORM_ISCSI_TCP_VARS_ADV_WND_SCL_OFFSET(func), 2); ++ CNIC_WR8(dev, BAR_XSTRORM_INTMEM + ++ XSTORM_ISCSI_TCP_VARS_FLAGS_OFFSET(func), xstorm_flags.flags); ++ CNIC_WR(dev, BAR_XSTRORM_INTMEM + ++ XSTORM_TCP_TX_SWS_TIMER_VAL_OFFSET(func), DEF_SWS_TIMER); ++ ++ memset(&tstorm_flags, 0, sizeof(tstorm_flags)); ++ tstorm_flags.flags |= TSTORM_L5CM_TCP_FLAGS_TS_ENABLED; ++ ++ CNIC_WR16(dev, BAR_TSTRORM_INTMEM + ++ TSTORM_ISCSI_TCP_VARS_FLAGS_OFFSET(func), ++ tstorm_flags.flags); ++ ++ CNIC_WR(dev, BAR_TSTRORM_INTMEM + TSTORM_TCP_MAX_CWND_OFFSET(func), ++ DEF_MAX_CWND); ++ return 0; ++} ++ ++static int cnic_cm_open(struct cnic_dev *dev) ++{ ++ struct cnic_local *cp = dev->cnic_priv; ++ int err; ++ ++ err = cnic_cm_alloc_mem(dev); ++ if (err) ++ return err; ++ ++ err = cp->start_cm(dev); ++ ++ if (err) ++ goto err_out; ++ ++ spin_lock_init(&cp->wr_lock); ++ ++ tasklet_init(&cp->cnic_task, &cnic_task, (unsigned long) cp); ++ ++#ifdef HAVE_NETEVENT ++ cp->cm_nb.notifier_call = cnic_net_callback; ++ register_netevent_notifier(&cp->cm_nb); ++#else ++#ifndef __VMKLNX__ ++ init_timer(&cp->cnic_timer); ++ cp->cnic_timer_off = 2 * HZ; ++ cp->cnic_timer.expires = jiffies + cp->cnic_timer_off; ++ cp->cnic_timer.data = (unsigned long) cp; ++ cp->cnic_timer.function = cnic_timer; ++ add_timer(&cp->cnic_timer); ++#endif ++#endif ++ ++ dev->cm_create = cnic_cm_create; ++ dev->cm_destroy = cnic_cm_destroy; ++ dev->cm_connect = cnic_cm_connect; ++ dev->cm_abort = cnic_cm_abort; ++ dev->cm_close = cnic_cm_close; ++ dev->cm_select_dev = cnic_cm_select_dev; ++ ++ cp->ulp_handle[CNIC_ULP_L4] = dev; ++ rcu_assign_pointer(cp->ulp_ops[CNIC_ULP_L4], &cm_ulp_ops); ++ return 0; ++ ++err_out: ++ cnic_cm_free_mem(dev); ++ return err; ++} ++ ++static int cnic_cm_shutdown(struct cnic_dev *dev) ++{ ++ struct cnic_local *cp = dev->cnic_priv; ++ int i; ++ ++ cp->stop_cm(dev); ++ ++#ifdef HAVE_NETEVENT ++ unregister_netevent_notifier(&cp->cm_nb); ++#else ++#ifndef __VMKLNX__ ++ del_timer_sync(&cp->cnic_timer); ++#endif ++#endif ++ ++ tasklet_disable(&cp->cnic_task); ++ ++ if (!cp->csk_tbl) ++ return 0; ++ ++ for (i = 0; i < MAX_CM_SK_TBL_SZ; i++) { ++ struct cnic_sock *csk = &cp->csk_tbl[i]; ++ ++ clear_bit(SK_F_INUSE, &csk->flags); ++ cnic_cm_cleanup(csk); ++ } ++ cnic_cm_free_mem(dev); ++ ++ return 0; ++} ++ ++static void cnic_init_context(struct cnic_dev *dev, u32 cid) ++{ ++ u32 cid_addr; ++ int i; ++ ++ cid_addr = GET_CID_ADDR(cid); ++ ++ for (i = 0; i < CTX_SIZE; i += 4) ++ cnic_ctx_wr(dev, cid_addr, i, 0); ++} ++ ++static int cnic_setup_5709_context(struct cnic_dev *dev, int valid) ++{ ++ struct cnic_local *cp = dev->cnic_priv; ++ int ret = 0, i; ++ u32 valid_bit = valid ? BNX2_CTX_HOST_PAGE_TBL_DATA0_VALID : 0; ++ ++ if (CHIP_NUM(cp) != CHIP_NUM_5709) ++ return 0; ++ ++ for (i = 0; i < cp->ctx_blks; i++) { ++ int j; ++ u32 idx = cp->ctx_arr[i].cid / cp->cids_per_blk; ++ u32 val; ++ ++ memset(cp->ctx_arr[i].ctx, 0, BCM_PAGE_SIZE); ++ ++ CNIC_WR(dev, BNX2_CTX_HOST_PAGE_TBL_DATA0, ++ (cp->ctx_arr[i].mapping & 0xffffffff) | valid_bit); ++ CNIC_WR(dev, BNX2_CTX_HOST_PAGE_TBL_DATA1, ++ (u64) cp->ctx_arr[i].mapping >> 32); ++ CNIC_WR(dev, BNX2_CTX_HOST_PAGE_TBL_CTRL, idx | ++ BNX2_CTX_HOST_PAGE_TBL_CTRL_WRITE_REQ); ++ for (j = 0; j < 10; j++) { ++ ++ val = CNIC_RD(dev, BNX2_CTX_HOST_PAGE_TBL_CTRL); ++ if (!(val & BNX2_CTX_HOST_PAGE_TBL_CTRL_WRITE_REQ)) ++ break; ++ udelay(5); ++ } ++ if (val & BNX2_CTX_HOST_PAGE_TBL_CTRL_WRITE_REQ) { ++ ret = -EBUSY; ++ break; ++ } ++ } ++ return ret; ++} ++ ++static void cnic_free_irq(struct cnic_dev *dev) ++{ ++ struct cnic_local *cp = dev->cnic_priv; ++ struct cnic_eth_dev *ethdev = cp->ethdev; ++ ++ if (ethdev->drv_state & CNIC_DRV_STATE_USING_MSIX) { ++ cp->disable_int_sync(dev); ++ tasklet_disable(&cp->cnic_irq_task); ++ free_irq(ethdev->irq_arr[0].vector, dev); ++ } ++} ++ ++static int cnic_init_bnx2_irq(struct cnic_dev *dev) ++{ ++ struct cnic_local *cp = dev->cnic_priv; ++ struct cnic_eth_dev *ethdev = cp->ethdev; ++ ++ if (ethdev->drv_state & CNIC_DRV_STATE_USING_MSIX) { ++ int err, i = 0; ++ int sblk_num = cp->status_blk_num; ++ u32 base = ((sblk_num - 1) * BNX2_HC_SB_CONFIG_SIZE) + ++ BNX2_HC_SB_CONFIG_1; ++ ++ CNIC_WR(dev, base, BNX2_HC_SB_CONFIG_1_ONE_SHOT); ++ ++ CNIC_WR(dev, base + BNX2_HC_COMP_PROD_TRIP_OFF, (2 << 16) | 8); ++ CNIC_WR(dev, base + BNX2_HC_COM_TICKS_OFF, (64 << 16) | 220); ++ CNIC_WR(dev, base + BNX2_HC_CMD_TICKS_OFF, (64 << 16) | 220); ++ ++ cp->bnx2_status_blk = cp->status_blk; ++ cp->last_status_idx = cp->bnx2_status_blk->status_idx; ++ tasklet_init(&cp->cnic_irq_task, &cnic_service_bnx2_msix, ++ (unsigned long) dev); ++ err = request_irq(ethdev->irq_arr[0].vector, cnic_irq, 0, ++ "cnic", dev); ++ if (err) { ++ tasklet_disable(&cp->cnic_irq_task); ++ return err; ++ } ++ while (cp->bnx2_status_blk->status_completion_producer_index && ++ i < 10) { ++ CNIC_WR(dev, BNX2_HC_COALESCE_NOW, ++ 1 << (11 + sblk_num)); ++ udelay(10); ++ i++; ++ barrier(); ++ } ++ if (cp->bnx2_status_blk->status_completion_producer_index) { ++ cnic_free_irq(dev); ++ goto failed; ++ } ++ ++ } else { ++ struct status_block *sblk = cp->status_blk; ++ u32 hc_cmd = CNIC_RD(dev, BNX2_HC_COMMAND); ++ int i = 0; ++ ++ while (sblk->status_completion_producer_index && i < 10) { ++ CNIC_WR(dev, BNX2_HC_COMMAND, ++ hc_cmd | BNX2_HC_COMMAND_COAL_NOW_WO_INT); ++ udelay(10); ++ i++; ++ barrier(); ++ } ++ if (sblk->status_completion_producer_index) ++ goto failed; ++ ++ } ++ return 0; ++ ++failed: ++ printk(KERN_ERR PFX "%s: " "KCQ index not resetting to 0.\n", ++ dev->netdev->name); ++ return -EBUSY; ++} ++ ++static void cnic_enable_bnx2_int(struct cnic_dev *dev) ++{ ++ struct cnic_local *cp = dev->cnic_priv; ++ struct cnic_eth_dev *ethdev = cp->ethdev; ++ ++ if (!(ethdev->drv_state & CNIC_DRV_STATE_USING_MSIX)) ++ return; ++ ++ CNIC_WR(dev, BNX2_PCICFG_INT_ACK_CMD, cp->int_num | ++ BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID | cp->last_status_idx); ++} ++ ++static void cnic_disable_bnx2_int_sync(struct cnic_dev *dev) ++{ ++ struct cnic_local *cp = dev->cnic_priv; ++ struct cnic_eth_dev *ethdev = cp->ethdev; ++ ++ if (!(ethdev->drv_state & CNIC_DRV_STATE_USING_MSIX)) ++ return; ++ ++ CNIC_WR(dev, BNX2_PCICFG_INT_ACK_CMD, cp->int_num | ++ BNX2_PCICFG_INT_ACK_CMD_MASK_INT); ++ CNIC_RD(dev, BNX2_PCICFG_INT_ACK_CMD); ++ synchronize_irq(ethdev->irq_arr[0].vector); ++} ++ ++static void cnic_get_bnx2_iscsi_info(struct cnic_dev *dev) ++{ ++ u32 max_conn; ++ ++ max_conn = cnic_reg_rd_ind(dev, BNX2_FW_MAX_ISCSI_CONN); ++ dev->max_iscsi_conn = max_conn; ++} ++ ++static int cnic_start_bnx2_hw(struct cnic_dev *dev) ++{ ++ struct cnic_local *cp = dev->cnic_priv; ++ struct cnic_eth_dev *ethdev = cp->ethdev; ++ struct status_block *sblk = cp->status_blk; ++ u32 val; ++ int err; ++ ++ val = CNIC_RD(dev, BNX2_MQ_CONFIG); ++ val &= ~BNX2_MQ_CONFIG_KNL_BYP_BLK_SIZE; ++ if (BCM_PAGE_BITS > 12) ++ val |= (12 - 8) << 4; ++ else ++ val |= (BCM_PAGE_BITS - 8) << 4; ++ ++ CNIC_WR(dev, BNX2_MQ_CONFIG, val); ++ ++ CNIC_WR(dev, BNX2_HC_COMP_PROD_TRIP, (2 << 16) | 8); ++ CNIC_WR(dev, BNX2_HC_COM_TICKS, (64 << 16) | 220); ++ CNIC_WR(dev, BNX2_HC_CMD_TICKS, (64 << 16) | 220); ++ ++ err = cnic_setup_5709_context(dev, 1); ++ if (err) ++ return err; ++ ++ cnic_init_context(dev, KWQ_CID); ++ cnic_init_context(dev, KCQ_CID); ++ ++ cp->kwq_cid_addr = GET_CID_ADDR(KWQ_CID); ++ cp->kwq_io_addr = MB_GET_CID_ADDR(KWQ_CID) + L5_KRNLQ_HOST_QIDX; ++ ++ cp->max_kwq_idx = MAX_KWQ_IDX; ++ cp->kwq_prod_idx = 0; ++ cp->kwq_con_idx = 0; ++ cp->cnic_local_flags |= CNIC_LCL_FL_KWQ_INIT; ++ ++ if (CHIP_NUM(cp) == CHIP_NUM_5706 || CHIP_NUM(cp) == CHIP_NUM_5708) ++ cp->kwq_con_idx_ptr = &sblk->status_rx_quick_consumer_index15; ++ else ++ cp->kwq_con_idx_ptr = &sblk->status_cmd_consumer_index; ++ ++ /* Initialize the kernel work queue context. */ ++ val = KRNLQ_TYPE_TYPE_KRNLQ | KRNLQ_SIZE_TYPE_SIZE | ++ (BCM_PAGE_BITS - 8) | KRNLQ_FLAGS_QE_SELF_SEQ; ++ cnic_ctx_wr(dev, cp->kwq_cid_addr, L5_KRNLQ_TYPE, val); ++ ++ val = (BCM_PAGE_SIZE / sizeof(struct kwqe) - 1) << 16; ++ cnic_ctx_wr(dev, cp->kwq_cid_addr, L5_KRNLQ_QE_SELF_SEQ_MAX, val); ++ ++ val = ((BCM_PAGE_SIZE / sizeof(struct kwqe)) << 16) | KWQ_PAGE_CNT; ++ cnic_ctx_wr(dev, cp->kwq_cid_addr, L5_KRNLQ_PGTBL_NPAGES, val); ++ ++ val = (u32) ((u64) cp->kwq_info.pgtbl_map >> 32); ++ cnic_ctx_wr(dev, cp->kwq_cid_addr, L5_KRNLQ_PGTBL_HADDR_HI, val); ++ ++ val = (u32) cp->kwq_info.pgtbl_map; ++ cnic_ctx_wr(dev, cp->kwq_cid_addr, L5_KRNLQ_PGTBL_HADDR_LO, val); ++ ++ cp->kcq_cid_addr = GET_CID_ADDR(KCQ_CID); ++ cp->kcq_io_addr = MB_GET_CID_ADDR(KCQ_CID) + L5_KRNLQ_HOST_QIDX; ++ ++ cp->kcq_prod_idx = 0; ++ ++ /* Initialize the kernel complete queue context. */ ++ val = KRNLQ_TYPE_TYPE_KRNLQ | KRNLQ_SIZE_TYPE_SIZE | ++ (BCM_PAGE_BITS - 8) | KRNLQ_FLAGS_QE_SELF_SEQ; ++ cnic_ctx_wr(dev, cp->kcq_cid_addr, L5_KRNLQ_TYPE, val); ++ ++ val = (BCM_PAGE_SIZE / sizeof(struct kcqe) - 1) << 16; ++ cnic_ctx_wr(dev, cp->kcq_cid_addr, L5_KRNLQ_QE_SELF_SEQ_MAX, val); ++ ++ val = ((BCM_PAGE_SIZE / sizeof(struct kcqe)) << 16) | KCQ_PAGE_CNT; ++ cnic_ctx_wr(dev, cp->kcq_cid_addr, L5_KRNLQ_PGTBL_NPAGES, val); ++ ++ val = (u32) ((u64) cp->kcq_info.pgtbl_map >> 32); ++ cnic_ctx_wr(dev, cp->kcq_cid_addr, L5_KRNLQ_PGTBL_HADDR_HI, val); ++ ++ val = (u32) cp->kcq_info.pgtbl_map; ++ cnic_ctx_wr(dev, cp->kcq_cid_addr, L5_KRNLQ_PGTBL_HADDR_LO, val); ++ ++ if (ethdev->drv_state & CNIC_DRV_STATE_USING_MSIX) { ++ u32 sb_id = cp->status_blk_num; ++ u32 sb = BNX2_L2CTX_STATUSB_NUM(sb_id); ++ ++ cp->int_num = sb_id << BNX2_PCICFG_INT_ACK_CMD_INT_NUM_SHIFT; ++ cnic_ctx_wr(dev, cp->kwq_cid_addr, L5_KRNLQ_HOST_QIDX, sb); ++ cnic_ctx_wr(dev, cp->kcq_cid_addr, L5_KRNLQ_HOST_QIDX, sb); ++ } ++ ++ /* Enable Commnad Scheduler notification when we write to the ++ * host producer index of the kernel contexts. */ ++ CNIC_WR(dev, BNX2_MQ_KNL_CMD_MASK1, 2); ++ ++ /* Enable Command Scheduler notification when we write to either ++ * the Send Queue or Receive Queue producer indexes of the kernel ++ * bypass contexts. */ ++ CNIC_WR(dev, BNX2_MQ_KNL_BYP_CMD_MASK1, 7); ++ CNIC_WR(dev, BNX2_MQ_KNL_BYP_WRITE_MASK1, 7); ++ ++ /* Notify COM when the driver post an application buffer. */ ++ CNIC_WR(dev, BNX2_MQ_KNL_RX_V2P_MASK2, 0x2000); ++ ++ /* Set the CP and COM doorbells. These two processors polls the ++ * doorbell for a non zero value before running. This must be done ++ * after setting up the kernel queue contexts. */ ++ val = cnic_reg_rd_ind(dev, BNX2_CP_SCRATCH + 0x20); ++ cnic_reg_wr_ind(dev, BNX2_CP_SCRATCH + 0x20, val | 1); ++ ++ val = cnic_reg_rd_ind(dev, BNX2_COM_SCRATCH + 0x20); ++ cnic_reg_wr_ind(dev, BNX2_COM_SCRATCH + 0x20, val | 1); ++ ++ err = cnic_init_bnx2_irq(dev); ++ if (err) { ++ printk(KERN_ERR PFX "%s: cnic_init_irq failed\n", ++ dev->netdev->name); ++ ++ val = cnic_reg_rd_ind(dev, BNX2_CP_SCRATCH + 0x20); ++ cnic_reg_wr_ind(dev, BNX2_CP_SCRATCH + 0x20, val & ~0x1); ++ ++ val = cnic_reg_rd_ind(dev, BNX2_COM_SCRATCH + 0x20); ++ cnic_reg_wr_ind(dev, BNX2_COM_SCRATCH + 0x20, val & ~0x1); ++ ++ return err; ++ } ++ ++ cnic_get_bnx2_iscsi_info(dev); ++ ++ return 0; ++} ++ ++static void cnic_setup_bnx2x_context(struct cnic_dev *dev) ++{ ++ struct cnic_local *cp = dev->cnic_priv; ++ struct cnic_eth_dev *ethdev = cp->ethdev; ++ u32 start_offset = ethdev->ctx_tbl_offset; ++ int i; ++ ++ for (i = 0; i < cp->ctx_blks; i++) { ++ struct cnic_ctx *ctx = &cp->ctx_arr[i]; ++ dma_addr_t map = ctx->mapping; ++ ++ if (cp->ctx_align) { ++ unsigned long mask = cp->ctx_align - 1; ++ ++ map = (map + mask) & ~mask; ++ } ++ ++ cnic_ctx_tbl_wr(dev, start_offset + i, map); ++ } ++} ++ ++static int cnic_init_bnx2x_irq(struct cnic_dev *dev) ++{ ++ struct cnic_local *cp = dev->cnic_priv; ++ struct cnic_eth_dev *ethdev = cp->ethdev; ++ int err = 0; ++ ++ cp->bnx2x_status_blk = cp->status_blk; ++ ++ tasklet_init(&cp->cnic_irq_task, &cnic_service_bnx2x_bh, ++ (unsigned long) dev); ++ if (ethdev->drv_state & CNIC_DRV_STATE_USING_MSIX) { ++ err = request_irq(ethdev->irq_arr[0].vector, cnic_irq, 0, ++ "cnic", dev); ++ if (err) ++ tasklet_disable(&cp->cnic_irq_task); ++ } ++ return err; ++} ++ ++static void cnic_enable_bnx2x_int(struct cnic_dev *dev) ++{ ++ struct cnic_local *cp = dev->cnic_priv; ++ u8 sb_id = cp->status_blk_num; ++ int port = CNIC_PORT(cp); ++ ++#ifdef NEW_BNX2X_HSI ++ CNIC_WR8(dev, BAR_CSTRORM_INTMEM + ++ CSTORM_SB_HC_TIMEOUT_C_OFFSET(port, sb_id, ++ HC_INDEX_C_ISCSI_EQ_CONS), ++ 64 / 12); ++ CNIC_WR16(dev, BAR_CSTRORM_INTMEM + ++ CSTORM_SB_HC_DISABLE_C_OFFSET(port, sb_id, ++ HC_INDEX_C_ISCSI_EQ_CONS), 0); ++#else ++ CNIC_WR8(dev, BAR_CSTRORM_INTMEM + ++ CSTORM_SB_HC_TIMEOUT_OFFSET(port, sb_id, ++ HC_INDEX_C_ISCSI_EQ_CONS), ++ 64 / 12); ++ CNIC_WR16(dev, BAR_CSTRORM_INTMEM + ++ CSTORM_SB_HC_DISABLE_OFFSET(port, sb_id, ++ HC_INDEX_C_ISCSI_EQ_CONS), 0); ++#endif ++} ++ ++static void cnic_disable_bnx2x_int_sync(struct cnic_dev *dev) ++{ ++} ++ ++static void cnic_get_bnx2x_iscsi_info(struct cnic_dev *dev) ++{ ++ struct cnic_local *cp = dev->cnic_priv; ++ u32 base, addr, val; ++ int port = CNIC_PORT(cp); ++ ++ dev->max_iscsi_conn = 0; ++ base = CNIC_RD(dev, MISC_REG_SHARED_MEM_ADDR); ++ if (base < 0xa0000 || base >= 0xc0000) ++ return; ++ ++ addr = BNX2X_SHMEM_ADDR(base, validity_map[port]); ++ val = CNIC_RD(dev, addr); ++ ++ if (!(val & SHR_MEM_VALIDITY_LIC_NO_KEY_IN_EFFECT)) { ++ u16 val16; ++ ++ addr = BNX2X_SHMEM_ADDR(base, ++ drv_lic_key[port].max_iscsi_init_conn); ++ val16 = CNIC_RD16(dev, addr); ++ ++ if (val16) ++ val16 ^= 0x1e1e; ++ dev->max_iscsi_conn = val16; ++ } ++ if (BNX2X_CHIP_IS_E1H(cp->chip_id)) { ++ int func = CNIC_FUNC(cp); ++ ++ addr = BNX2X_SHMEM_ADDR(base, ++ mf_cfg.func_mf_config[func].e1hov_tag); ++ val = CNIC_RD(dev, addr); ++ val &= FUNC_MF_CFG_E1HOV_TAG_MASK; ++ if (val != FUNC_MF_CFG_E1HOV_TAG_DEFAULT) { ++ addr = BNX2X_SHMEM_ADDR(base, ++ mf_cfg.func_mf_config[func].config); ++ val = CNIC_RD(dev, addr); ++ val &= FUNC_MF_CFG_PROTOCOL_MASK; ++ if (val != FUNC_MF_CFG_PROTOCOL_ISCSI) ++ dev->max_iscsi_conn = 0; ++ } ++ } ++} ++ ++static int cnic_start_bnx2x_hw(struct cnic_dev *dev) ++{ ++ struct cnic_local *cp = dev->cnic_priv; ++ struct cnic_eth_dev *ethdev = cp->ethdev; ++ int func = CNIC_FUNC(cp), ret, i; ++ int port = CNIC_PORT(cp); ++ u32 start_cid = ethdev->starting_cid; ++ u16 eq_idx; ++ u8 sb_id = cp->status_blk_num; ++ ++ ret = cnic_init_id_tbl(&cp->cid_tbl, MAX_ISCSI_TBL_SZ, start_cid, 0); ++ ++ if (ret) ++ return -ENOMEM; ++ ++ cp->kcq_io_addr = BAR_CSTRORM_INTMEM + ++ CSTORM_ISCSI_EQ_PROD_OFFSET(func, 0); ++ cp->kcq_prod_idx = 0; ++ ++ cnic_get_bnx2x_iscsi_info(dev); ++ ++ /* Only 1 EQ */ ++ CNIC_WR16(dev, cp->kcq_io_addr, MAX_KCQ_IDX); ++ CNIC_WR(dev, BAR_CSTRORM_INTMEM + ++ CSTORM_ISCSI_EQ_CONS_OFFSET(func, 0), 0); ++ CNIC_WR(dev, BAR_CSTRORM_INTMEM + ++ CSTORM_ISCSI_EQ_NEXT_PAGE_ADDR_OFFSET(func, 0), ++ cp->kcq_info.pg_map_arr[1] & 0xffffffff); ++ CNIC_WR(dev, BAR_CSTRORM_INTMEM + ++ CSTORM_ISCSI_EQ_NEXT_PAGE_ADDR_OFFSET(func, 0) + 4, ++ (u64) cp->kcq_info.pg_map_arr[1] >> 32); ++ CNIC_WR(dev, BAR_CSTRORM_INTMEM + ++ CSTORM_ISCSI_EQ_NEXT_EQE_ADDR_OFFSET(func, 0), ++ cp->kcq_info.pg_map_arr[0] & 0xffffffff); ++ CNIC_WR(dev, BAR_CSTRORM_INTMEM + ++ CSTORM_ISCSI_EQ_NEXT_EQE_ADDR_OFFSET(func, 0) + 4, ++ (u64) cp->kcq_info.pg_map_arr[0] >> 32); ++ CNIC_WR8(dev, BAR_CSTRORM_INTMEM + ++ CSTORM_ISCSI_EQ_NEXT_PAGE_ADDR_VALID_OFFSET(func, 0), 1); ++ CNIC_WR16(dev, BAR_CSTRORM_INTMEM + ++ CSTORM_ISCSI_EQ_SB_NUM_OFFSET(func, 0), cp->status_blk_num); ++ CNIC_WR8(dev, BAR_CSTRORM_INTMEM + ++ CSTORM_ISCSI_EQ_SB_INDEX_OFFSET(func, 0), ++ HC_INDEX_C_ISCSI_EQ_CONS); ++ ++ for (i = 0; i < cp->conn_buf_info.num_pages; i++) { ++ CNIC_WR(dev, BAR_TSTRORM_INTMEM + ++ TSTORM_ISCSI_CONN_BUF_PBL_OFFSET(func, i), ++ cp->conn_buf_info.pgtbl[2 * i]); ++ CNIC_WR(dev, BAR_TSTRORM_INTMEM + ++ TSTORM_ISCSI_CONN_BUF_PBL_OFFSET(func, i) + 4, ++ cp->conn_buf_info.pgtbl[(2 * i) + 1]); ++ } ++ ++ CNIC_WR(dev, BAR_USTRORM_INTMEM + ++ USTORM_ISCSI_GLOBAL_BUF_PHYS_ADDR_OFFSET(func), ++ cp->gbl_buf_info.pg_map_arr[0] & 0xffffffff); ++ CNIC_WR(dev, BAR_USTRORM_INTMEM + ++ USTORM_ISCSI_GLOBAL_BUF_PHYS_ADDR_OFFSET(func) + 4, ++ (u64) cp->gbl_buf_info.pg_map_arr[0] >> 32); ++ ++ cnic_setup_bnx2x_context(dev); ++ ++#ifdef NEW_BNX2X_HSI ++ eq_idx = CNIC_RD16(dev, BAR_CSTRORM_INTMEM + ++ CSTORM_SB_HOST_STATUS_BLOCK_C_OFFSET(port, sb_id) + ++ offsetof(struct cstorm_status_block_c, ++ index_values[HC_INDEX_C_ISCSI_EQ_CONS])); ++#else ++ eq_idx = CNIC_RD16(dev, BAR_CSTRORM_INTMEM + ++ CSTORM_SB_HOST_STATUS_BLOCK_OFFSET(port, sb_id) + ++ offsetof(struct cstorm_status_block, ++ index_values[HC_INDEX_C_ISCSI_EQ_CONS])); ++#endif ++ if (eq_idx != 0) { ++ printk(KERN_ERR PFX "%s: EQ cons index %x != 0\n", ++ dev->netdev->name, eq_idx); ++ return -EBUSY; ++ } ++ ret = cnic_init_bnx2x_irq(dev); ++ if (ret) ++ return ret; ++ ++ return 0; ++} ++ ++static int cnic_start_hw(struct cnic_dev *dev) ++{ ++ struct cnic_local *cp = dev->cnic_priv; ++ struct cnic_eth_dev *ethdev = cp->ethdev; ++ int err; ++ ++ if (test_bit(CNIC_F_CNIC_UP, &dev->flags)) ++ return -EALREADY; ++ ++#ifndef __VMKLNX__ ++ if (!try_module_get(ethdev->drv_owner)) ++ return -EBUSY; ++#endif ++ err = ethdev->drv_register_cnic(dev->netdev, cp->cnic_ops, dev); ++ if (err) { ++ printk(KERN_ERR PFX "%s: register_cnic failed\n", ++ dev->netdev->name); ++ goto err2; ++ } ++ ++ dev->regview = ethdev->io_base; ++ cp->chip_id = ethdev->chip_id; ++ pci_dev_get(dev->pcidev); ++ cp->func = PCI_FUNC(dev->pcidev->devfn); ++ cp->status_blk = ethdev->irq_arr[0].status_blk; ++ cp->status_blk_num = ethdev->irq_arr[0].status_blk_num; ++ ++ err = cp->alloc_resc(dev); ++ if (err) { ++ printk(KERN_ERR PFX "%s: allocate resource failure\n", ++ dev->netdev->name); ++ goto err1; ++ } ++ ++ err = cp->start_hw(dev); ++ if (err) ++ goto err1; ++ ++ err = cnic_cm_open(dev); ++ if (err) ++ goto err1; ++ ++ set_bit(CNIC_F_CNIC_UP, &dev->flags); ++ ++ cp->enable_int(dev); ++ ++ return 0; ++ ++err1: ++ ethdev->drv_unregister_cnic(dev->netdev); ++ cp->free_resc(dev); ++ pci_dev_put(dev->pcidev); ++err2: ++#ifndef __VMKLNX__ ++ module_put(ethdev->drv_owner); ++#endif ++ return err; ++} ++ ++static void cnic_stop_bnx2_hw(struct cnic_dev *dev) ++{ ++ struct cnic_local *cp = dev->cnic_priv; ++ struct cnic_eth_dev *ethdev = cp->ethdev; ++ u32 val; ++ ++ cnic_disable_bnx2_int_sync(dev); ++ ++ val = cnic_reg_rd_ind(dev, BNX2_CP_SCRATCH + 0x20); ++ cnic_reg_wr_ind(dev, BNX2_CP_SCRATCH + 0x20, val & ~0x1); ++ ++ val = cnic_reg_rd_ind(dev, BNX2_COM_SCRATCH + 0x20); ++ cnic_reg_wr_ind(dev, BNX2_COM_SCRATCH + 0x20, val & ~0x1); ++ ++ cnic_init_context(dev, KWQ_CID); ++ cnic_init_context(dev, KCQ_CID); ++ ++ cnic_setup_5709_context(dev, 0); ++ cnic_free_irq(dev); ++ ++ ethdev->drv_unregister_cnic(dev->netdev); ++ ++ cnic_free_resc(dev); ++} ++ ++static void cnic_stop_bnx2x_hw(struct cnic_dev *dev) ++{ ++ struct cnic_local *cp = dev->cnic_priv; ++ struct cnic_eth_dev *ethdev = cp->ethdev; ++ u8 sb_id = cp->status_blk_num; ++ int port = CNIC_PORT(cp); ++ ++ cnic_free_irq(dev); ++ ethdev->drv_unregister_cnic(dev->netdev); ++#ifdef NEW_BNX2X_HSI ++ CNIC_WR16(dev, BAR_CSTRORM_INTMEM + ++ CSTORM_SB_HOST_STATUS_BLOCK_C_OFFSET(port, sb_id) + ++ offsetof(struct cstorm_status_block_c, ++ index_values[HC_INDEX_C_ISCSI_EQ_CONS]), ++ 0); ++#else ++ CNIC_WR16(dev, BAR_CSTRORM_INTMEM + ++ CSTORM_SB_HOST_STATUS_BLOCK_OFFSET(port, sb_id) + ++ offsetof(struct cstorm_status_block, ++ index_values[HC_INDEX_C_ISCSI_EQ_CONS]), ++ 0); ++#endif ++ cnic_free_resc(dev); ++} ++ ++static void cnic_stop_hw(struct cnic_dev *dev) ++{ ++ if (test_bit(CNIC_F_CNIC_UP, &dev->flags)) { ++ struct cnic_local *cp = dev->cnic_priv; ++ ++ clear_bit(CNIC_F_CNIC_UP, &dev->flags); ++ rcu_assign_pointer(cp->ulp_ops[CNIC_ULP_L4], NULL); ++#ifndef __VMKLNX__ ++ synchronize_rcu(); ++#endif ++ cnic_cm_shutdown(dev); ++ cp->stop_hw(dev); ++ pci_dev_put(dev->pcidev); ++#ifndef __VMKLNX__ ++ module_put(cp->ethdev->drv_owner); ++#endif ++ } ++} ++ ++static struct cnic_dev *alloc_cnic(struct net_device *dev) ++{ ++ struct cnic_dev *cdev; ++ struct cnic_local *cp; ++ int alloc_size; ++ ++ alloc_size = sizeof(struct cnic_dev) + sizeof(struct cnic_local); ++ ++ cdev = kmalloc(alloc_size , GFP_KERNEL); ++ if (cdev == NULL) { ++ printk(KERN_ERR PFX "%s: allocate dev struct failure\n", ++ dev->name); ++ return NULL; ++ } ++ memset(cdev, 0, alloc_size); ++ ++ cdev->netdev = dev; ++ cdev->cnic_priv = (char *)cdev + sizeof(struct cnic_dev); ++ cdev->register_device = cnic_register_device; ++ cdev->unregister_device = cnic_unregister_device; ++ cp = cdev->cnic_priv; ++ cp->dev = cdev; ++ ++ spin_lock_init(&cp->cnic_ulp_lock); ++ printk(KERN_INFO PFX "Added CNIC device: %s\n", dev->name); ++ ++ return cdev; ++} ++ ++static struct cnic_dev *init_bnx2_cnic(struct net_device *dev) ++{ ++ struct pci_dev *pdev; ++ struct cnic_dev *cdev; ++ struct cnic_local *cp; ++ struct cnic_eth_dev *ethdev = NULL; ++#ifdef __VMKLNX__ ++ vmk_IscsiNetDriverData iscsinet_drv_data; ++ struct cnic_eth_dev *(*bnx2_cnic_probe)(struct net_device *); ++ VMK_ReturnStatus vm_err; ++ ++ vm_err = vmk_IscsiNetDriverRegistered(vmk_ModuleGetID("bnx2"), &iscsinet_drv_data); ++ if (vm_err != VMK_OK) ++ return NULL; ++ ++ bnx2_cnic_probe = iscsinet_drv_data.drvData; ++ ++ if (!bnx2_cnic_probe) ++ return NULL; ++ ++ ethdev = bnx2_cnic_probe(dev); ++#else ++ struct cnic_eth_dev *(*probe)(void *) = NULL; ++ ++ probe = __symbol_get("bnx2_cnic_probe"); ++ if (probe) { ++ ethdev = (*probe)(dev); ++#if (LINUX_VERSION_CODE > 0x020610) ++ symbol_put_addr(probe); ++#else ++ __symbol_put("bnx2_cnic_probe"); ++#endif ++ } ++#endif ++ if (!ethdev) ++ return NULL; ++ ++ pdev = ethdev->pdev; ++ if (!pdev) ++ return NULL; ++ ++ dev_hold(dev); ++ pci_dev_get(pdev); ++ if (pdev->device == PCI_DEVICE_ID_NX2_5709 || ++ pdev->device == PCI_DEVICE_ID_NX2_5709S) { ++ u8 rev; ++ ++ pci_read_config_byte(pdev, PCI_REVISION_ID, &rev); ++ if (rev < 0x10) { ++ pci_dev_put(pdev); ++ goto cnic_err; ++ } ++ } ++ pci_dev_put(pdev); ++ ++ cdev = alloc_cnic(dev); ++ if (cdev == NULL) ++ goto cnic_err; ++ ++ set_bit(CNIC_F_BNX2_CLASS, &cdev->flags); ++ cdev->submit_kwqes = cnic_submit_bnx2_kwqes; ++ ++ cp = cdev->cnic_priv; ++ cp->ethdev = ethdev; ++ cdev->pcidev = pdev; ++ ++ cp->cnic_ops = &cnic_bnx2_ops; ++ cp->start_hw = cnic_start_bnx2_hw; ++ cp->stop_hw = cnic_stop_bnx2_hw; ++ cp->setup_pgtbl = cnic_setup_page_tbl; ++ cp->alloc_resc = cnic_alloc_bnx2_resc; ++ cp->free_resc = cnic_free_resc; ++ cp->start_cm = cnic_cm_init_bnx2_hw; ++ cp->stop_cm = cnic_cm_stop_bnx2_hw; ++ cp->enable_int = cnic_enable_bnx2_int; ++ cp->disable_int_sync = cnic_disable_bnx2_int_sync; ++ cp->close_conn = cnic_close_bnx2_conn; ++ cp->next_idx = cnic_bnx2_next_idx; ++ cp->hw_idx = cnic_bnx2_hw_idx; ++ return cdev; ++ ++cnic_err: ++ dev_put(dev); ++ return NULL; ++} ++ ++static struct cnic_dev *init_bnx2x_cnic(struct net_device *dev) ++{ ++ struct pci_dev *pdev; ++ struct cnic_dev *cdev; ++ struct cnic_local *cp; ++ struct cnic_eth_dev *ethdev = NULL; ++#ifdef __VMKLNX__ ++ vmk_IscsiNetDriverData iscsinet_drv_data; ++ struct cnic_eth_dev *(*bnx2x_cnic_probe)(struct net_device *); ++ VMK_ReturnStatus vm_err; ++ ++ vm_err = vmk_IscsiNetDriverRegistered(vmk_ModuleGetID("bnx2x"), &iscsinet_drv_data); ++ if (vm_err != VMK_OK) ++ return NULL; ++ ++ bnx2x_cnic_probe = iscsinet_drv_data.drvData; ++ ++ if (!bnx2x_cnic_probe) ++ return NULL; ++ ++ ethdev = bnx2x_cnic_probe(dev); ++#else ++ struct cnic_eth_dev *(*probe)(void *) = NULL; ++ ++ probe = __symbol_get("bnx2x_cnic_probe"); ++ if (probe) { ++ ethdev = (*probe)(dev); ++#if (LINUX_VERSION_CODE > 0x020610) ++ symbol_put_addr(probe); ++#else ++ __symbol_put("bnx2x_cnic_probe"); ++#endif ++ } ++#endif ++ if (!ethdev) ++ return NULL; ++ ++ pdev = ethdev->pdev; ++ if (!pdev) ++ return NULL; ++ ++ dev_hold(dev); ++ cdev = alloc_cnic(dev); ++ if (cdev == NULL) { ++ dev_put(dev); ++ return NULL; ++ } ++ ++ set_bit(CNIC_F_BNX2X_CLASS, &cdev->flags); ++ cdev->submit_kwqes = cnic_submit_bnx2x_kwqes; ++ ++ cp = cdev->cnic_priv; ++ cp->ethdev = ethdev; ++ cdev->pcidev = pdev; ++ ++ cp->cnic_ops = &cnic_bnx2x_ops; ++ cp->start_hw = cnic_start_bnx2x_hw; ++ cp->stop_hw = cnic_stop_bnx2x_hw; ++ cp->setup_pgtbl = cnic_setup_page_tbl_le; ++ cp->alloc_resc = cnic_alloc_bnx2x_resc; ++ cp->free_resc = cnic_free_resc; ++ cp->start_cm = cnic_cm_init_bnx2x_hw; ++ cp->stop_cm = cnic_cm_stop_bnx2x_hw; ++ cp->enable_int = cnic_enable_bnx2x_int; ++ cp->disable_int_sync = cnic_disable_bnx2x_int_sync; ++ cp->ack_int = cnic_ack_bnx2x_msix; ++ cp->close_conn = cnic_close_bnx2x_conn; ++ cp->next_idx = cnic_bnx2x_next_idx; ++ cp->hw_idx = cnic_bnx2x_hw_idx; ++ return cdev; ++} ++ ++static struct cnic_dev *is_cnic_dev(struct net_device *dev) ++{ ++ struct ethtool_drvinfo drvinfo; ++ struct cnic_dev *cdev = NULL; ++ ++ if (dev->ethtool_ops && dev->ethtool_ops->get_drvinfo) { ++ memset(&drvinfo, 0, sizeof(drvinfo)); ++ dev->ethtool_ops->get_drvinfo(dev, &drvinfo); ++ ++ if (!strcmp(drvinfo.driver, "bnx2")) ++ cdev = init_bnx2_cnic(dev); ++ if (!strcmp(drvinfo.driver, "bnx2x")) ++ cdev = init_bnx2x_cnic(dev); ++ if (cdev) { ++#ifndef __VMKLNX__ ++ write_lock(&cnic_dev_lock); ++#endif ++ list_add(&cdev->list, &cnic_dev_list); ++#ifndef __VMKLNX__ ++ write_unlock(&cnic_dev_lock); ++#endif ++ } ++ } ++ return cdev; ++} ++ ++/** ++ * IP event handler ++ */ ++#ifndef __VMKLNX__ ++static int cnic_ip_event(struct notifier_block *this, unsigned long event, ++ void *ptr) ++{ ++ struct in_ifaddr *ifa = (struct in_ifaddr *) ptr; ++ struct net_device *netdev = (struct net_device *) ifa->ifa_dev->dev; ++ struct cnic_dev *dev; ++ int if_type; ++ u32 my_dev = 0; ++ ++ read_lock(&cnic_dev_lock); ++ list_for_each_entry(dev, &cnic_dev_list, list) { ++ if (netdev == dev->netdev) { ++ my_dev = 1; ++ cnic_hold(dev); ++ break; ++ } ++ } ++ read_unlock(&cnic_dev_lock); ++ ++ if (my_dev) { ++ struct cnic_local *cp = dev->cnic_priv; ++ ++ rcu_read_lock(); ++ for (if_type = 0; if_type < MAX_CNIC_ULP_TYPE; if_type++) { ++ struct cnic_ulp_ops *ulp_ops; ++ ++ ulp_ops = rcu_dereference(cp->ulp_ops[if_type]); ++ if (ulp_ops) { ++ void *ctx = cp->ulp_handle[if_type]; ++ ++ ulp_ops->indicate_inetevent(ctx, event); ++ } ++ } ++ rcu_read_unlock(); ++ ++ cnic_put(dev); ++ } ++ ++ return NOTIFY_DONE; ++} ++ ++/** ++ * netdev event handler ++ */ ++static int cnic_netdev_event(struct notifier_block *this, unsigned long event, ++ void *ptr) ++{ ++ struct net_device *netdev = ptr; ++ struct cnic_dev *dev; ++ int if_type; ++ int my_dev = 0, new_dev = 0; ++ ++ read_lock(&cnic_dev_lock); ++ list_for_each_entry(dev, &cnic_dev_list, list) { ++ if (netdev == dev->netdev) { ++ my_dev = 1; ++ cnic_hold(dev); ++ break; ++ } ++ } ++ read_unlock(&cnic_dev_lock); ++ ++ if (!my_dev && (event == NETDEV_REGISTER || event == NETDEV_UP)) { ++ /* Check for the hot-plug device */ ++ dev = is_cnic_dev(netdev); ++ if (dev) { ++ my_dev = 1; ++ new_dev = 1; ++ cnic_hold(dev); ++ } ++ } ++ if (my_dev) { ++ struct cnic_local *cp = dev->cnic_priv; ++ ++ if (new_dev) ++ cnic_ulp_init(dev); ++ if (event == NETDEV_UNREGISTER) ++ cnic_ulp_exit(dev); ++ else if (event == NETDEV_UP) { ++ mutex_lock(&cnic_lock); ++ set_bit(CNIC_F_IF_UP, &dev->flags); ++ if (dev->use_count) { ++ if (!cnic_start_hw(dev)) ++ cnic_ulp_start(dev); ++ } ++ mutex_unlock(&cnic_lock); ++ } ++ ++ rcu_read_lock(); ++ for (if_type = 0; if_type < MAX_CNIC_ULP_TYPE; if_type++) { ++ struct cnic_ulp_ops *ulp_ops; ++ void *ctx; ++ ++ ulp_ops = rcu_dereference(cp->ulp_ops[if_type]); ++ if (!ulp_ops) ++ continue; ++ ++ ctx = cp->ulp_handle[if_type]; ++ ++ ulp_ops->indicate_netevent(ctx, event); ++ } ++ rcu_read_unlock(); ++ ++ if (event == NETDEV_GOING_DOWN) { ++ mutex_lock(&cnic_lock); ++ clear_bit(CNIC_F_IF_UP, &dev->flags); ++ set_bit(CNIC_F_IF_GOING_DOWN, &dev->flags); ++ cnic_ulp_stop(dev); ++ cnic_stop_hw(dev); ++ mutex_unlock(&cnic_lock); ++ } else if (event == NETDEV_DOWN) { ++ mutex_lock(&cnic_lock); ++ clear_bit(CNIC_F_IF_GOING_DOWN, &dev->flags); ++ mutex_unlock(&cnic_lock); ++ } else if (event == NETDEV_UNREGISTER) { ++ write_lock(&cnic_dev_lock); ++ list_del_init(&dev->list); ++ write_unlock(&cnic_dev_lock); ++ ++ cnic_put(dev); ++ cnic_free_dev(dev); ++ goto done; ++ } ++ cnic_put(dev); ++ } ++done: ++ return NOTIFY_DONE; ++} ++ ++static struct notifier_block cnic_ip_notifier = { ++ cnic_ip_event, ++ 0 ++}; ++ ++static struct notifier_block cnic_netdev_notifier = { ++ cnic_netdev_event, ++ 0 ++}; ++#endif ++ ++static void cnic_release(void) ++{ ++ struct cnic_dev *dev; ++ ++ while (!list_empty(&cnic_dev_list)) { ++ dev = list_entry(cnic_dev_list.next, struct cnic_dev, list); ++ if (test_bit(CNIC_F_CNIC_UP, &dev->flags)) ++ cnic_stop_hw(dev); ++ ++ list_del_init(&dev->list); ++ cnic_free_dev(dev); ++ } ++} ++ ++static int __init cnic_init(void) ++{ ++ int rc = 0; ++#ifdef __VMKLNX__ ++ struct net_device *dev; ++#endif ++ ++ printk(KERN_INFO "%s", version); ++ ++#ifdef __VMKLNX__ ++ /* Find Teton devices */ ++#if (LINUX_VERSION_CODE >= 0x020618) ++ for_each_netdev(&init_net, dev) ++#elif (LINUX_VERSION_CODE >= 0x20616) ++ for_each_netdev(dev) ++#else ++ for (dev = dev_base; dev; dev = dev->next) ++#endif ++ is_cnic_dev(dev); ++ ++#else ++ ++ rc = register_inetaddr_notifier(&cnic_ip_notifier); ++ if (rc) ++ cnic_release(); ++ rc = register_netdevice_notifier(&cnic_netdev_notifier); ++ if (rc) { ++ unregister_inetaddr_notifier(&cnic_ip_notifier); ++ cnic_release(); ++ } ++#endif ++ return rc; ++} ++ ++static void __exit cnic_exit(void) ++{ ++#ifndef __VMKLNX__ ++ unregister_inetaddr_notifier(&cnic_ip_notifier); ++ unregister_netdevice_notifier(&cnic_netdev_notifier); ++#endif ++ cnic_release(); ++ return; ++} ++ ++module_init(cnic_init); ++module_exit(cnic_exit); +diff -r 19900e8f54d8 drivers/net/cnic.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/cnic.h Mon Jun 15 16:38:18 2009 +0100 +@@ -0,0 +1,404 @@ ++/* cnic.h: Broadcom CNIC core network driver. ++ * ++ * Copyright (c) 2006 Broadcom Corporation ++ * ++ * 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. ++ * ++ * Written by: John(Zongxi) Chen (zongxic@broadcom.com) ++ */ ++ ++ ++#ifndef CNIC_H ++#define CNIC_H ++ ++#if !defined(__LITTLE_ENDIAN) && !defined(__BIG_ENDIAN) ++ #error "Missing either LITTLE_ENDIAN or BIG_ENDIAN definition." ++#endif ++ ++#ifndef DIV_ROUND_UP ++#define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d)) ++#endif ++ ++#define KWQ_PAGE_CNT 4 ++#define KCQ_PAGE_CNT 16 ++ ++#define KWQ_CID 24 ++#define KCQ_CID 25 ++ ++/* ++ * krnlq_context definition ++ */ ++#define L5_KRNLQ_FLAGS 0x00000000 ++#define L5_KRNLQ_SIZE 0x00000000 ++#define L5_KRNLQ_TYPE 0x00000000 ++#define KRNLQ_FLAGS_PG_SZ (0xf<<0) ++#define KRNLQ_FLAGS_PG_SZ_256 (0<<0) ++#define KRNLQ_FLAGS_PG_SZ_512 (1<<0) ++#define KRNLQ_FLAGS_PG_SZ_1K (2<<0) ++#define KRNLQ_FLAGS_PG_SZ_2K (3<<0) ++#define KRNLQ_FLAGS_PG_SZ_4K (4<<0) ++#define KRNLQ_FLAGS_PG_SZ_8K (5<<0) ++#define KRNLQ_FLAGS_PG_SZ_16K (6<<0) ++#define KRNLQ_FLAGS_PG_SZ_32K (7<<0) ++#define KRNLQ_FLAGS_PG_SZ_64K (8<<0) ++#define KRNLQ_FLAGS_PG_SZ_128K (9<<0) ++#define KRNLQ_FLAGS_PG_SZ_256K (10<<0) ++#define KRNLQ_FLAGS_PG_SZ_512K (11<<0) ++#define KRNLQ_FLAGS_PG_SZ_1M (12<<0) ++#define KRNLQ_FLAGS_PG_SZ_2M (13<<0) ++#define KRNLQ_FLAGS_QE_SELF_SEQ (1<<15) ++#define KRNLQ_SIZE_TYPE_SIZE ((((0x28 + 0x1f) & ~0x1f) / 0x20) << 16) ++#define KRNLQ_TYPE_TYPE (0xf<<28) ++#define KRNLQ_TYPE_TYPE_EMPTY (0<<28) ++#define KRNLQ_TYPE_TYPE_KRNLQ (6<<28) ++ ++#define L5_KRNLQ_HOST_QIDX 0x00000004 ++#define L5_KRNLQ_HOST_FW_QIDX 0x00000008 ++#define L5_KRNLQ_NX_QE_SELF_SEQ 0x0000000c ++#define L5_KRNLQ_QE_SELF_SEQ_MAX 0x0000000c ++#define L5_KRNLQ_NX_QE_HADDR_HI 0x00000010 ++#define L5_KRNLQ_NX_QE_HADDR_LO 0x00000014 ++#define L5_KRNLQ_PGTBL_PGIDX 0x00000018 ++#define L5_KRNLQ_NX_PG_QIDX 0x00000018 ++#define L5_KRNLQ_PGTBL_NPAGES 0x0000001c ++#define L5_KRNLQ_QIDX_INCR 0x0000001c ++#define L5_KRNLQ_PGTBL_HADDR_HI 0x00000020 ++#define L5_KRNLQ_PGTBL_HADDR_LO 0x00000024 ++ ++#define BNX2_PG_CTX_MAP 0x1a0034 ++#define BNX2_ISCSI_CTX_MAP 0x1a0074 ++ ++struct cnic_redirect_entry { ++ struct dst_entry *old_dst; ++ struct dst_entry *new_dst; ++}; ++ ++struct cnic_work_node { ++ u32 work_type; ++#define WORK_TYPE_KCQE 1 ++#define WORK_TYPE_NEIGH_UPDATE 2 ++#define WORK_TYPE_REDIRECT 3 ++ union { ++ struct kcqe kcqe; ++ struct neighbour *neigh; ++ struct cnic_redirect_entry cnic_redir; ++ } work_data; ++}; ++ ++#define MAX_CNIC_L5_CONTEXT 256 ++ ++#define WORK_RING_SIZE 128 ++#define WORK_RING_SIZE_MASK 127 ++#define MAX_CM_SK_TBL_SZ MAX_CNIC_L5_CONTEXT ++#define MAX_COMPLETED_KCQE 64 ++ ++#define MAX_ISCSI_TBL_SZ 256 ++ ++#define KWQE_CNT (BCM_PAGE_SIZE / sizeof(struct kwqe)) ++#define KCQE_CNT (BCM_PAGE_SIZE / sizeof(struct kcqe)) ++#define MAX_KWQE_CNT (KWQE_CNT - 1) ++#define MAX_KCQE_CNT (KCQE_CNT - 1) ++ ++#define MAX_KWQ_IDX ((KWQ_PAGE_CNT * KWQE_CNT) - 1) ++#define MAX_KCQ_IDX ((KCQ_PAGE_CNT * KCQE_CNT) - 1) ++ ++#define KWQ_PG(x) (((x) & ~MAX_KWQE_CNT) >> (BCM_PAGE_BITS - 5)) ++#define KWQ_IDX(x) ((x) & MAX_KWQE_CNT) ++ ++#define KCQ_PG(x) (((x) & ~MAX_KCQE_CNT) >> (BCM_PAGE_BITS - 5)) ++#define KCQ_IDX(x) ((x) & MAX_KCQE_CNT) ++ ++#define BNX2X_NEXT_KCQE(x) (((x) & (MAX_KCQE_CNT - 1)) == \ ++ (MAX_KCQE_CNT - 1)) ? \ ++ (x) + 2 : (x) + 1 ++ ++#define BNX2X_KWQ_DATA_PG(cp, x) ((x) / (cp)->kwq_16_data_pp) ++#define BNX2X_KWQ_DATA_IDX(cp, x) ((x) % (cp)->kwq_16_data_pp) ++#define BNX2X_KWQ_DATA(cp, x) \ ++ &(cp)->kwq_16_data[BNX2X_KWQ_DATA_PG(cp, x)][BNX2X_KWQ_DATA_IDX(cp, x)] ++ ++#define DEF_IPID_COUNT 0xc001 ++ ++#define DEF_KA_TIMEOUT 10000 ++#define DEF_KA_INTERVAL 300000 ++#define DEF_KA_MAX_PROBE_COUNT 3 ++#define DEF_TOS 0 ++#define DEF_TTL 0xfe ++#define DEF_SND_SEQ_SCALE 0 ++#define DEF_RCV_BUF 0xffff ++#define DEF_SND_BUF 0xffff ++#define DEF_SEED 0 ++#define DEF_MAX_RT_TIME 500 ++#define DEF_MAX_DA_COUNT 2 ++#define DEF_SWS_TIMER 1000 ++#define DEF_MAX_CWND 0xffff ++ ++struct cnic_ctx { ++ u32 cid; ++ void *ctx; ++ dma_addr_t mapping; ++}; ++ ++#define BNX2_MAX_CID 0x2000 ++ ++struct cnic_dma { ++ int num_pages; ++ void **pg_arr; ++ dma_addr_t *pg_map_arr; ++ int pgtbl_size; ++ u32 *pgtbl; ++ dma_addr_t pgtbl_map; ++}; ++ ++struct cnic_id_tbl { ++ spinlock_t lock; ++ u32 start; ++ u32 max; ++ u32 next; ++ unsigned long *table; ++}; ++ ++#define CNIC_KWQ16_DATA_SIZE 128 ++ ++struct kwqe_16_data { ++ u8 data[CNIC_KWQ16_DATA_SIZE]; ++}; ++ ++struct cnic_iscsi { ++ struct cnic_dma task_array_info; ++ struct cnic_dma r2tq_info; ++ struct cnic_dma hq_info; ++}; ++ ++struct cnic_context { ++ u32 cid; ++ struct kwqe_16_data *kwqe_data; ++ dma_addr_t kwqe_data_mapping; ++ wait_queue_head_t waitq; ++ int wait_cond; ++ unsigned long timestamp; ++ u32 ctx_flags; ++#define CTX_FL_OFFLD_START 0x00000001 ++ u8 ulp_proto_id; ++ union { ++ struct cnic_iscsi *iscsi; ++ } proto; ++}; ++ ++struct l5cm_spe; ++ ++struct cnic_local { ++ ++ spinlock_t cnic_ulp_lock; ++ void *ulp_handle[MAX_CNIC_ULP_TYPE]; ++ unsigned long ulp_flags[MAX_CNIC_ULP_TYPE]; ++#define ULP_F_INIT 0 ++#define ULP_F_START 1 ++ struct cnic_ulp_ops *ulp_ops[MAX_CNIC_ULP_TYPE]; ++ ++ /* protected by ulp_lock */ ++ u32 cnic_local_flags; ++#define CNIC_LCL_FL_KWQ_INIT 0x00000001 ++ ++ struct cnic_dev *dev; ++ ++ struct cnic_eth_dev *ethdev; ++ ++ u32 kwq_cid_addr; ++ u32 kcq_cid_addr; ++ ++ struct cnic_dma kwq_info; ++ struct kwqe **kwq; ++ ++ struct cnic_dma kwq_16_data_info; ++ ++ u16 max_kwq_idx; ++ ++ u16 kwq_prod_idx; ++ u32 kwq_io_addr; ++ ++ volatile u16 *kwq_con_idx_ptr; ++ u16 kwq_con_idx; ++ ++ struct cnic_dma kcq_info; ++ struct kcqe **kcq; ++ ++ u16 kcq_prod_idx; ++ u32 kcq_io_addr; ++ ++ void *status_blk; ++ struct status_block_msix *bnx2_status_blk; ++ struct host_status_block *bnx2x_status_blk; ++ ++ u32 status_blk_num; ++ u32 int_num; ++ u32 last_status_idx; ++ struct tasklet_struct cnic_irq_task; ++ ++ struct kcqe *completed_kcq[MAX_COMPLETED_KCQE]; ++ ++ struct cnic_sock *csk_tbl; ++ struct cnic_id_tbl csk_port_tbl; ++ u32 next_tcp_port; ++ ++ struct cnic_dma conn_buf_info; ++ struct cnic_dma gbl_buf_info; ++ ++ struct cnic_iscsi *iscsi_tbl; ++ struct cnic_context *ctx_tbl; ++ struct cnic_id_tbl cid_tbl; ++ atomic_t iscsi_conn; ++ ++ /* per connection parameters */ ++ int num_iscsi_tasks; ++ int num_ccells; ++ int task_array_size; ++ int r2tq_size; ++ int hq_size; ++ int num_cqs; ++ ++ struct notifier_block cm_nb; ++ ++ struct cnic_work_node cnic_work_ring[WORK_RING_SIZE]; ++ int cnic_wr_cons; ++ int cnic_wr_prod; ++ spinlock_t wr_lock; ++ ++ struct tasklet_struct cnic_task; ++ ++#ifndef HAVE_NETEVENT ++ struct timer_list cnic_timer; ++ u32 cnic_timer_off; ++#endif ++ struct cnic_ctx *ctx_arr; ++ int ctx_blks; ++ int ctx_blk_size; ++ unsigned long ctx_align; ++ int cids_per_blk; ++ ++ u32 chip_id; ++ int func; ++#ifdef __VMKLNX__ ++ uint8_t vmknic[VMK_VMKNIC_NAME_MAX]; ++ vmk_IscsiNetHandle iscsiNetHandle; ++ ++ /* For TCP port alloc/free. */ ++ uint8_t first_vmknic[VMK_VMKNIC_NAME_MAX]; ++ vmk_IscsiNetHandle first_iscsiNetHandle; ++ ++ vmk_uint32 cnic_local_port_min; ++ vmk_uint32 cnic_local_port_nr; ++#endif ++ ++ struct cnic_ops *cnic_ops; ++ int (*start_hw)(struct cnic_dev *); ++ void (*stop_hw)(struct cnic_dev *); ++ void (*setup_pgtbl)(struct cnic_dev *, ++ struct cnic_dma *); ++ int (*alloc_resc)(struct cnic_dev *); ++ void (*free_resc)(struct cnic_dev *); ++ int (*start_cm)(struct cnic_dev *); ++ void (*stop_cm)(struct cnic_dev *); ++ void (*enable_int)(struct cnic_dev *); ++ void (*disable_int_sync)(struct cnic_dev *); ++ void (*ack_int)(struct cnic_dev *); ++ void (*close_conn)(struct cnic_sock *, u32 opcode); ++ u16 (*next_idx)(u16); ++ u16 (*hw_idx)(u16); ++}; ++ ++struct bnx2x_bd_chain_next { ++ u32 addr_lo; ++ u32 addr_hi; ++ u8 reserved[8]; ++}; ++ ++#define ISCSI_RAMROD_CMD_ID_UPDATE_CONN (ISCSI_KCQE_OPCODE_UPDATE_CONN) ++#define ISCSI_RAMROD_CMD_ID_INIT (ISCSI_KCQE_OPCODE_INIT) ++ ++#define CDU_REGION_NUMBER_XCM_AG 2 ++#define CDU_REGION_NUMBER_UCM_AG 4 ++ ++#ifndef NEW_BNX2X_HSI ++static u8 calc_crc8( u32 data, u8 crc) ++{ ++ u8 D[32]; ++ u8 NewCRC[8]; ++ u8 C[8]; ++ u8 crc_res; ++ u8 i; ++ ++ /* split the data into 31 bits */ ++ for (i = 0; i < 32; i++) { ++ D[i] = (u8)(data & 1); ++ data = data >> 1; ++ } ++ ++ /* split the crc into 8 bits */ ++ for (i = 0; i < 8; i++ ) { ++ C[i] = crc & 1; ++ crc = crc >> 1; ++ } ++ ++ NewCRC[0] = D[31] ^ D[30] ^ D[28] ^ D[23] ^ D[21] ^ D[19] ^ D[18] ^ D[16] ^ D[14] ^ D[12] ^ D[8] ^ D[7] ^ D[6] ^ D[0] ^ C[4] ^ C[6] ^ C[7]; ++ NewCRC[1] = D[30] ^ D[29] ^ D[28] ^ D[24] ^ D[23] ^ D[22] ^ D[21] ^ D[20] ^ D[18] ^ D[17] ^ D[16] ^ D[15] ^ D[14] ^ D[13] ^ D[12] ^ D[9] ^ D[6] ^ D[1] ^ D[0] ^ C[0] ^ C[4] ^ C[5] ^ C[6]; ++ NewCRC[2] = D[29] ^ D[28] ^ D[25] ^ D[24] ^ D[22] ^ D[17] ^ D[15] ^ D[13] ^ D[12] ^ D[10] ^ D[8] ^ D[6] ^ D[2] ^ D[1] ^ D[0] ^ C[0] ^ C[1] ^ C[4] ^ C[5]; ++ NewCRC[3] = D[30] ^ D[29] ^ D[26] ^ D[25] ^ D[23] ^ D[18] ^ D[16] ^ D[14] ^ D[13] ^ D[11] ^ D[9] ^ D[7] ^ D[3] ^ D[2] ^ D[1] ^ C[1] ^ C[2] ^ C[5] ^ C[6]; ++ NewCRC[4] = D[31] ^ D[30] ^ D[27] ^ D[26] ^ D[24] ^ D[19] ^ D[17] ^ D[15] ^ D[14] ^ D[12] ^ D[10] ^ D[8] ^ D[4] ^ D[3] ^ D[2] ^ C[0] ^ C[2] ^ C[3] ^ C[6] ^ C[7]; ++ NewCRC[5] = D[31] ^ D[28] ^ D[27] ^ D[25] ^ D[20] ^ D[18] ^ D[16] ^ D[15] ^ D[13] ^ D[11] ^ D[9] ^ D[5] ^ D[4] ^ D[3] ^ C[1] ^ C[3] ^ C[4] ^ C[7]; ++ NewCRC[6] = D[29] ^ D[28] ^ D[26] ^ D[21] ^ D[19] ^ D[17] ^ D[16] ^ D[14] ^ D[12] ^ D[10] ^ D[6] ^ D[5] ^ D[4] ^ C[2] ^ C[4] ^ C[5]; ++ NewCRC[7] = D[30] ^ D[29] ^ D[27] ^ D[22] ^ D[20] ^ D[18] ^ D[17] ^ D[15] ^ D[13] ^ D[11] ^ D[7] ^ D[6] ^ D[5] ^ C[3] ^ C[5] ^ C[6]; ++ ++ crc_res = 0; ++ for (i = 0; i < 8; i++) { ++ crc_res |= (NewCRC[i] << i); ++ } ++ ++ return crc_res; ++} ++#endif ++ ++#define CDU_VALID_DATA(_cid, _region, _type) \ ++ (((_cid) << 8) | (((_region)&0xf)<<4) | (((_type)&0xf))) ++ ++#define CDU_CRC8(_cid, _region, _type) \ ++ (calc_crc8(CDU_VALID_DATA(_cid, _region, _type), 0xff)) ++ ++#define CDU_RSRVD_VALUE_TYPE_A(_cid, _region, _type) \ ++ (0x80 | ((CDU_CRC8(_cid, _region, _type)) & 0x7f)) ++ ++#define BNX2X_ISCSI_NUM_CONNECTIONS 128 ++#define BNX2X_ISCSI_TASK_CONTEXT_SIZE 128 ++#define BNX2X_ISCSI_CONTEXT_MEM_SIZE 1024 ++#define BNX2X_ISCSI_MAX_PENDING_R2TS 4 ++#define BNX2X_ISCSI_R2TQE_SIZE 8 ++#define BNX2X_ISCSI_HQ_BD_SIZE 64 ++#define BNX2X_ISCSI_CONN_BUF_SIZE 64 ++#define BNX2X_ISCSI_GLB_BUF_SIZE 64 ++#define BNX2X_ISCSI_PBL_NOT_CACHED 0xff ++#define BNX2X_ISCSI_PDU_HEADER_NOT_CACHED 0xff ++#define BNX2X_HW_CID(x, func) ((x) | (((func) % PORT_MAX) << 23) | \ ++ (((func) >> 1) << 17)) ++#define BNX2X_SW_CID(x) (x & 0x1ffff) ++#define BNX2X_CHIP_NUM_57711 0x164f ++#define BNX2X_CHIP_NUM_57711E 0x1650 ++#define BNX2X_CHIP_NUM(x) (x >> 16) ++#define BNX2X_CHIP_IS_57711(x) \ ++ (BNX2X_CHIP_NUM(x) == BNX2X_CHIP_NUM_57711) ++#define BNX2X_CHIP_IS_57711E(x) \ ++ (BNX2X_CHIP_NUM(x) == BNX2X_CHIP_NUM_57711E) ++#define BNX2X_CHIP_IS_E1H(x) \ ++ (BNX2X_CHIP_IS_57711(x) || BNX2X_CHIP_IS_57711E(x)) ++#define IS_E1H_OFFSET BNX2X_CHIP_IS_E1H(cp->chip_id) ++ ++#define BNX2X_SHMEM_ADDR(base, field) (base + \ ++ offsetof(struct shmem_region, field)) ++ ++#define CNIC_PORT(cp) ((cp)->func % PORT_MAX) ++#define CNIC_FUNC(cp) ((cp)->func) ++#define CNIC_E1HVN(cp) ((cp)->func >> 1) ++ ++#endif ++ +diff -r 19900e8f54d8 drivers/net/cnic_cm.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/cnic_cm.h Mon Jun 15 16:38:18 2009 +0100 +@@ -0,0 +1,552 @@ ++#ifndef __57XX_L5CM_HSI_LINUX_LE__ ++#define __57XX_L5CM_HSI_LINUX_LE__ ++ ++/* KWQ (kernel work queue) request op codes */ ++#define L4_KWQE_OPCODE_VALUE_CONNECT1 (50) ++#define L4_KWQE_OPCODE_VALUE_CONNECT2 (51) ++#define L4_KWQE_OPCODE_VALUE_CONNECT3 (52) ++#define L4_KWQE_OPCODE_VALUE_RESET (53) ++#define L4_KWQE_OPCODE_VALUE_CLOSE (54) ++#define L4_KWQE_OPCODE_VALUE_UPDATE_SECRET (60) ++#define L4_KWQE_OPCODE_VALUE_INIT_ULP (61) ++ ++#define L4_KWQE_OPCODE_VALUE_OFFLOAD_PG (1) ++#define L4_KWQE_OPCODE_VALUE_UPDATE_PG (9) ++#define L4_KWQE_OPCODE_VALUE_UPLOAD_PG (14) ++ ++/* KCQ (kernel completion queue) response op codes */ ++#define L4_KCQE_OPCODE_VALUE_CLOSE_COMP (53) ++#define L4_KCQE_OPCODE_VALUE_RESET_COMP (54) ++#define L4_KCQE_OPCODE_VALUE_FW_TCP_UPDATE (55) ++#define L4_KCQE_OPCODE_VALUE_CONNECT_COMPLETE (56) ++#define L4_KCQE_OPCODE_VALUE_RESET_RECEIVED (57) ++#define L4_KCQE_OPCODE_VALUE_CLOSE_RECEIVED (58) ++#define L4_KCQE_OPCODE_VALUE_INIT_ULP (61) ++ ++#define L4_KCQE_OPCODE_VALUE_OFFLOAD_PG (1) ++#define L4_KCQE_OPCODE_VALUE_UPLOAD_PG (14) ++ ++/* KCQ (kernel completion queue) completion status */ ++#define L4_KCQE_COMPLETION_STATUS_SUCCESS (0) ++#define L4_KCQE_COMPLETION_STATUS_TIMEOUT (0x93) ++ ++#define L4_LAYER_CODE (4) ++ ++/* ++ * L4 KCQ CQE ++ */ ++struct l4_kcq { ++ u32 cid; ++ u32 pg_cid; ++ u32 conn_id; ++ u32 pg_host_opaque; ++#if defined(__BIG_ENDIAN) ++ u16 status; ++ u16 reserved1; ++#elif defined(__LITTLE_ENDIAN) ++ u16 reserved1; ++ u16 status; ++#endif ++ u32 reserved2[2]; ++#if defined(__BIG_ENDIAN) ++ u8 flags; ++#define L4_KCQ_RESERVED3 (0xF<<0) ++#define L4_KCQ_RESERVED3_SHIFT 0 ++#define L4_KCQ_LAYER_CODE (0x7<<4) ++#define L4_KCQ_LAYER_CODE_SHIFT 4 ++#define L4_KCQ_RESERVED4 (0x1<<7) ++#define L4_KCQ_RESERVED4_SHIFT 7 ++ u8 op_code; ++ u16 qe_self_seq; ++#elif defined(__LITTLE_ENDIAN) ++ u16 qe_self_seq; ++ u8 op_code; ++ u8 flags; ++#define L4_KCQ_RESERVED3 (0xF<<0) ++#define L4_KCQ_RESERVED3_SHIFT 0 ++#define L4_KCQ_LAYER_CODE (0x7<<4) ++#define L4_KCQ_LAYER_CODE_SHIFT 4 ++#define L4_KCQ_RESERVED4 (0x1<<7) ++#define L4_KCQ_RESERVED4_SHIFT 7 ++#endif ++}; ++ ++ ++/* ++ * L4 KCQ CQE PG upload ++ */ ++struct l4_kcq_upload_pg { ++ u32 pg_cid; ++#if defined(__BIG_ENDIAN) ++ u16 pg_status; ++ u16 pg_ipid_count; ++#elif defined(__LITTLE_ENDIAN) ++ u16 pg_ipid_count; ++ u16 pg_status; ++#endif ++ u32 reserved1[5]; ++#if defined(__BIG_ENDIAN) ++ u8 flags; ++#define L4_KCQ_UPLOAD_PG_RESERVED3 (0xF<<0) ++#define L4_KCQ_UPLOAD_PG_RESERVED3_SHIFT 0 ++#define L4_KCQ_UPLOAD_PG_LAYER_CODE (0x7<<4) ++#define L4_KCQ_UPLOAD_PG_LAYER_CODE_SHIFT 4 ++#define L4_KCQ_UPLOAD_PG_RESERVED4 (0x1<<7) ++#define L4_KCQ_UPLOAD_PG_RESERVED4_SHIFT 7 ++ u8 op_code; ++ u16 qe_self_seq; ++#elif defined(__LITTLE_ENDIAN) ++ u16 qe_self_seq; ++ u8 op_code; ++ u8 flags; ++#define L4_KCQ_UPLOAD_PG_RESERVED3 (0xF<<0) ++#define L4_KCQ_UPLOAD_PG_RESERVED3_SHIFT 0 ++#define L4_KCQ_UPLOAD_PG_LAYER_CODE (0x7<<4) ++#define L4_KCQ_UPLOAD_PG_LAYER_CODE_SHIFT 4 ++#define L4_KCQ_UPLOAD_PG_RESERVED4 (0x1<<7) ++#define L4_KCQ_UPLOAD_PG_RESERVED4_SHIFT 7 ++#endif ++}; ++ ++ ++/* ++ * Gracefully close the connection request ++ */ ++struct l4_kwq_close_req { ++#if defined(__BIG_ENDIAN) ++ u8 flags; ++#define L4_KWQ_CLOSE_REQ_RESERVED1 (0xF<<0) ++#define L4_KWQ_CLOSE_REQ_RESERVED1_SHIFT 0 ++#define L4_KWQ_CLOSE_REQ_LAYER_CODE (0x7<<4) ++#define L4_KWQ_CLOSE_REQ_LAYER_CODE_SHIFT 4 ++#define L4_KWQ_CLOSE_REQ_LINKED_WITH_NEXT (0x1<<7) ++#define L4_KWQ_CLOSE_REQ_LINKED_WITH_NEXT_SHIFT 7 ++ u8 op_code; ++ u16 reserved0; ++#elif defined(__LITTLE_ENDIAN) ++ u16 reserved0; ++ u8 op_code; ++ u8 flags; ++#define L4_KWQ_CLOSE_REQ_RESERVED1 (0xF<<0) ++#define L4_KWQ_CLOSE_REQ_RESERVED1_SHIFT 0 ++#define L4_KWQ_CLOSE_REQ_LAYER_CODE (0x7<<4) ++#define L4_KWQ_CLOSE_REQ_LAYER_CODE_SHIFT 4 ++#define L4_KWQ_CLOSE_REQ_LINKED_WITH_NEXT (0x1<<7) ++#define L4_KWQ_CLOSE_REQ_LINKED_WITH_NEXT_SHIFT 7 ++#endif ++ u32 cid; ++ u32 reserved2[6]; ++}; ++ ++ ++/* ++ * The first request to be passed in order to establish connection in option2 ++ */ ++struct l4_kwq_connect_req1 { ++#if defined(__BIG_ENDIAN) ++ u8 flags; ++#define L4_KWQ_CONNECT_REQ1_RESERVED1 (0xF<<0) ++#define L4_KWQ_CONNECT_REQ1_RESERVED1_SHIFT 0 ++#define L4_KWQ_CONNECT_REQ1_LAYER_CODE (0x7<<4) ++#define L4_KWQ_CONNECT_REQ1_LAYER_CODE_SHIFT 4 ++#define L4_KWQ_CONNECT_REQ1_LINKED_WITH_NEXT (0x1<<7) ++#define L4_KWQ_CONNECT_REQ1_LINKED_WITH_NEXT_SHIFT 7 ++ u8 op_code; ++ u8 reserved0; ++ u8 conn_flags; ++#define L4_KWQ_CONNECT_REQ1_IS_PG_HOST_OPAQUE (0x1<<0) ++#define L4_KWQ_CONNECT_REQ1_IS_PG_HOST_OPAQUE_SHIFT 0 ++#define L4_KWQ_CONNECT_REQ1_IP_V6 (0x1<<1) ++#define L4_KWQ_CONNECT_REQ1_IP_V6_SHIFT 1 ++#define L4_KWQ_CONNECT_REQ1_PASSIVE_FLAG (0x1<<2) ++#define L4_KWQ_CONNECT_REQ1_PASSIVE_FLAG_SHIFT 2 ++#define L4_KWQ_CONNECT_REQ1_RSRV (0x1F<<3) ++#define L4_KWQ_CONNECT_REQ1_RSRV_SHIFT 3 ++#elif defined(__LITTLE_ENDIAN) ++ u8 conn_flags; ++#define L4_KWQ_CONNECT_REQ1_IS_PG_HOST_OPAQUE (0x1<<0) ++#define L4_KWQ_CONNECT_REQ1_IS_PG_HOST_OPAQUE_SHIFT 0 ++#define L4_KWQ_CONNECT_REQ1_IP_V6 (0x1<<1) ++#define L4_KWQ_CONNECT_REQ1_IP_V6_SHIFT 1 ++#define L4_KWQ_CONNECT_REQ1_PASSIVE_FLAG (0x1<<2) ++#define L4_KWQ_CONNECT_REQ1_PASSIVE_FLAG_SHIFT 2 ++#define L4_KWQ_CONNECT_REQ1_RSRV (0x1F<<3) ++#define L4_KWQ_CONNECT_REQ1_RSRV_SHIFT 3 ++ u8 reserved0; ++ u8 op_code; ++ u8 flags; ++#define L4_KWQ_CONNECT_REQ1_RESERVED1 (0xF<<0) ++#define L4_KWQ_CONNECT_REQ1_RESERVED1_SHIFT 0 ++#define L4_KWQ_CONNECT_REQ1_LAYER_CODE (0x7<<4) ++#define L4_KWQ_CONNECT_REQ1_LAYER_CODE_SHIFT 4 ++#define L4_KWQ_CONNECT_REQ1_LINKED_WITH_NEXT (0x1<<7) ++#define L4_KWQ_CONNECT_REQ1_LINKED_WITH_NEXT_SHIFT 7 ++#endif ++ u32 cid; ++ u32 pg_cid; ++ u32 src_ip; ++ u32 dst_ip; ++#if defined(__BIG_ENDIAN) ++ u16 dst_port; ++ u16 src_port; ++#elif defined(__LITTLE_ENDIAN) ++ u16 src_port; ++ u16 dst_port; ++#endif ++#if defined(__BIG_ENDIAN) ++ u8 rsrv1[3]; ++ u8 tcp_flags; ++#define L4_KWQ_CONNECT_REQ1_NO_DELAY_ACK (0x1<<0) ++#define L4_KWQ_CONNECT_REQ1_NO_DELAY_ACK_SHIFT 0 ++#define L4_KWQ_CONNECT_REQ1_KEEP_ALIVE (0x1<<1) ++#define L4_KWQ_CONNECT_REQ1_KEEP_ALIVE_SHIFT 1 ++#define L4_KWQ_CONNECT_REQ1_NAGLE_ENABLE (0x1<<2) ++#define L4_KWQ_CONNECT_REQ1_NAGLE_ENABLE_SHIFT 2 ++#define L4_KWQ_CONNECT_REQ1_TIME_STAMP (0x1<<3) ++#define L4_KWQ_CONNECT_REQ1_TIME_STAMP_SHIFT 3 ++#define L4_KWQ_CONNECT_REQ1_SACK (0x1<<4) ++#define L4_KWQ_CONNECT_REQ1_SACK_SHIFT 4 ++#define L4_KWQ_CONNECT_REQ1_SEG_SCALING (0x1<<5) ++#define L4_KWQ_CONNECT_REQ1_SEG_SCALING_SHIFT 5 ++#define L4_KWQ_CONNECT_REQ1_RESERVED2 (0x3<<6) ++#define L4_KWQ_CONNECT_REQ1_RESERVED2_SHIFT 6 ++#elif defined(__LITTLE_ENDIAN) ++ u8 tcp_flags; ++#define L4_KWQ_CONNECT_REQ1_NO_DELAY_ACK (0x1<<0) ++#define L4_KWQ_CONNECT_REQ1_NO_DELAY_ACK_SHIFT 0 ++#define L4_KWQ_CONNECT_REQ1_KEEP_ALIVE (0x1<<1) ++#define L4_KWQ_CONNECT_REQ1_KEEP_ALIVE_SHIFT 1 ++#define L4_KWQ_CONNECT_REQ1_NAGLE_ENABLE (0x1<<2) ++#define L4_KWQ_CONNECT_REQ1_NAGLE_ENABLE_SHIFT 2 ++#define L4_KWQ_CONNECT_REQ1_TIME_STAMP (0x1<<3) ++#define L4_KWQ_CONNECT_REQ1_TIME_STAMP_SHIFT 3 ++#define L4_KWQ_CONNECT_REQ1_SACK (0x1<<4) ++#define L4_KWQ_CONNECT_REQ1_SACK_SHIFT 4 ++#define L4_KWQ_CONNECT_REQ1_SEG_SCALING (0x1<<5) ++#define L4_KWQ_CONNECT_REQ1_SEG_SCALING_SHIFT 5 ++#define L4_KWQ_CONNECT_REQ1_RESERVED2 (0x3<<6) ++#define L4_KWQ_CONNECT_REQ1_RESERVED2_SHIFT 6 ++ u8 rsrv1[3]; ++#endif ++ u32 rsrv2; ++}; ++ ++ ++/* ++ * The second ( optional )request to be passed in order to establish connection in option2 - for IPv6 only ++ */ ++struct l4_kwq_connect_req2 { ++#if defined(__BIG_ENDIAN) ++ u8 flags; ++#define L4_KWQ_CONNECT_REQ2_RESERVED1 (0xF<<0) ++#define L4_KWQ_CONNECT_REQ2_RESERVED1_SHIFT 0 ++#define L4_KWQ_CONNECT_REQ2_LAYER_CODE (0x7<<4) ++#define L4_KWQ_CONNECT_REQ2_LAYER_CODE_SHIFT 4 ++#define L4_KWQ_CONNECT_REQ2_LINKED_WITH_NEXT (0x1<<7) ++#define L4_KWQ_CONNECT_REQ2_LINKED_WITH_NEXT_SHIFT 7 ++ u8 op_code; ++ u8 reserved0; ++ u8 rsrv; ++#elif defined(__LITTLE_ENDIAN) ++ u8 rsrv; ++ u8 reserved0; ++ u8 op_code; ++ u8 flags; ++#define L4_KWQ_CONNECT_REQ2_RESERVED1 (0xF<<0) ++#define L4_KWQ_CONNECT_REQ2_RESERVED1_SHIFT 0 ++#define L4_KWQ_CONNECT_REQ2_LAYER_CODE (0x7<<4) ++#define L4_KWQ_CONNECT_REQ2_LAYER_CODE_SHIFT 4 ++#define L4_KWQ_CONNECT_REQ2_LINKED_WITH_NEXT (0x1<<7) ++#define L4_KWQ_CONNECT_REQ2_LINKED_WITH_NEXT_SHIFT 7 ++#endif ++ u32 reserved2; ++ u32 src_ip_v6_2; ++ u32 src_ip_v6_3; ++ u32 src_ip_v6_4; ++ u32 dst_ip_v6_2; ++ u32 dst_ip_v6_3; ++ u32 dst_ip_v6_4; ++}; ++ ++ ++/* ++ * The third ( and last )request to be passed in order to establish connection in option2 ++ */ ++struct l4_kwq_connect_req3 { ++#if defined(__BIG_ENDIAN) ++ u8 flags; ++#define L4_KWQ_CONNECT_REQ3_RESERVED1 (0xF<<0) ++#define L4_KWQ_CONNECT_REQ3_RESERVED1_SHIFT 0 ++#define L4_KWQ_CONNECT_REQ3_LAYER_CODE (0x7<<4) ++#define L4_KWQ_CONNECT_REQ3_LAYER_CODE_SHIFT 4 ++#define L4_KWQ_CONNECT_REQ3_LINKED_WITH_NEXT (0x1<<7) ++#define L4_KWQ_CONNECT_REQ3_LINKED_WITH_NEXT_SHIFT 7 ++ u8 op_code; ++ u16 reserved0; ++#elif defined(__LITTLE_ENDIAN) ++ u16 reserved0; ++ u8 op_code; ++ u8 flags; ++#define L4_KWQ_CONNECT_REQ3_RESERVED1 (0xF<<0) ++#define L4_KWQ_CONNECT_REQ3_RESERVED1_SHIFT 0 ++#define L4_KWQ_CONNECT_REQ3_LAYER_CODE (0x7<<4) ++#define L4_KWQ_CONNECT_REQ3_LAYER_CODE_SHIFT 4 ++#define L4_KWQ_CONNECT_REQ3_LINKED_WITH_NEXT (0x1<<7) ++#define L4_KWQ_CONNECT_REQ3_LINKED_WITH_NEXT_SHIFT 7 ++#endif ++ u32 ka_timeout; ++ u32 ka_interval ; ++#if defined(__BIG_ENDIAN) ++ u8 snd_seq_scale; ++ u8 ttl; ++ u8 tos; ++ u8 ka_max_probe_count; ++#elif defined(__LITTLE_ENDIAN) ++ u8 ka_max_probe_count; ++ u8 tos; ++ u8 ttl; ++ u8 snd_seq_scale; ++#endif ++#if defined(__BIG_ENDIAN) ++ u16 pmtu; ++ u16 mss; ++#elif defined(__LITTLE_ENDIAN) ++ u16 mss; ++ u16 pmtu; ++#endif ++ u32 rcv_buf; ++ u32 snd_buf; ++ u32 seed; ++}; ++ ++ ++/* ++ * a KWQE request to offload a PG connection ++ */ ++struct l4_kwq_offload_pg { ++#if defined(__BIG_ENDIAN) ++ u8 flags; ++#define L4_KWQ_OFFLOAD_PG_RESERVED1 (0xF<<0) ++#define L4_KWQ_OFFLOAD_PG_RESERVED1_SHIFT 0 ++#define L4_KWQ_OFFLOAD_PG_LAYER_CODE (0x7<<4) ++#define L4_KWQ_OFFLOAD_PG_LAYER_CODE_SHIFT 4 ++#define L4_KWQ_OFFLOAD_PG_LINKED_WITH_NEXT (0x1<<7) ++#define L4_KWQ_OFFLOAD_PG_LINKED_WITH_NEXT_SHIFT 7 ++ u8 op_code; ++ u16 reserved0; ++#elif defined(__LITTLE_ENDIAN) ++ u16 reserved0; ++ u8 op_code; ++ u8 flags; ++#define L4_KWQ_OFFLOAD_PG_RESERVED1 (0xF<<0) ++#define L4_KWQ_OFFLOAD_PG_RESERVED1_SHIFT 0 ++#define L4_KWQ_OFFLOAD_PG_LAYER_CODE (0x7<<4) ++#define L4_KWQ_OFFLOAD_PG_LAYER_CODE_SHIFT 4 ++#define L4_KWQ_OFFLOAD_PG_LINKED_WITH_NEXT (0x1<<7) ++#define L4_KWQ_OFFLOAD_PG_LINKED_WITH_NEXT_SHIFT 7 ++#endif ++#if defined(__BIG_ENDIAN) ++ u8 l2hdr_nbytes; ++ u8 pg_flags; ++#define L4_KWQ_OFFLOAD_PG_SNAP_ENCAP (0x1<<0) ++#define L4_KWQ_OFFLOAD_PG_SNAP_ENCAP_SHIFT 0 ++#define L4_KWQ_OFFLOAD_PG_VLAN_TAGGING (0x1<<1) ++#define L4_KWQ_OFFLOAD_PG_VLAN_TAGGING_SHIFT 1 ++#define L4_KWQ_OFFLOAD_PG_RESERVED2 (0x3F<<2) ++#define L4_KWQ_OFFLOAD_PG_RESERVED2_SHIFT 2 ++ u8 da0; ++ u8 da1; ++#elif defined(__LITTLE_ENDIAN) ++ u8 da1; ++ u8 da0; ++ u8 pg_flags; ++#define L4_KWQ_OFFLOAD_PG_SNAP_ENCAP (0x1<<0) ++#define L4_KWQ_OFFLOAD_PG_SNAP_ENCAP_SHIFT 0 ++#define L4_KWQ_OFFLOAD_PG_VLAN_TAGGING (0x1<<1) ++#define L4_KWQ_OFFLOAD_PG_VLAN_TAGGING_SHIFT 1 ++#define L4_KWQ_OFFLOAD_PG_RESERVED2 (0x3F<<2) ++#define L4_KWQ_OFFLOAD_PG_RESERVED2_SHIFT 2 ++ u8 l2hdr_nbytes; ++#endif ++#if defined(__BIG_ENDIAN) ++ u8 da2; ++ u8 da3; ++ u8 da4; ++ u8 da5; ++#elif defined(__LITTLE_ENDIAN) ++ u8 da5; ++ u8 da4; ++ u8 da3; ++ u8 da2; ++#endif ++#if defined(__BIG_ENDIAN) ++ u8 sa0; ++ u8 sa1; ++ u8 sa2; ++ u8 sa3; ++#elif defined(__LITTLE_ENDIAN) ++ u8 sa3; ++ u8 sa2; ++ u8 sa1; ++ u8 sa0; ++#endif ++#if defined(__BIG_ENDIAN) ++ u8 sa4; ++ u8 sa5; ++ u16 etype; ++#elif defined(__LITTLE_ENDIAN) ++ u16 etype; ++ u8 sa5; ++ u8 sa4; ++#endif ++#if defined(__BIG_ENDIAN) ++ u16 vlan_tag; ++ u16 ipid_start; ++#elif defined(__LITTLE_ENDIAN) ++ u16 ipid_start; ++ u16 vlan_tag; ++#endif ++#if defined(__BIG_ENDIAN) ++ u16 ipid_count; ++ u16 reserved3; ++#elif defined(__LITTLE_ENDIAN) ++ u16 reserved3; ++ u16 ipid_count; ++#endif ++ u32 host_opaque; ++}; ++ ++ ++/* ++ * Abortively close the connection request ++ */ ++struct l4_kwq_reset_req { ++#if defined(__BIG_ENDIAN) ++ u8 flags; ++#define L4_KWQ_RESET_REQ_RESERVED1 (0xF<<0) ++#define L4_KWQ_RESET_REQ_RESERVED1_SHIFT 0 ++#define L4_KWQ_RESET_REQ_LAYER_CODE (0x7<<4) ++#define L4_KWQ_RESET_REQ_LAYER_CODE_SHIFT 4 ++#define L4_KWQ_RESET_REQ_LINKED_WITH_NEXT (0x1<<7) ++#define L4_KWQ_RESET_REQ_LINKED_WITH_NEXT_SHIFT 7 ++ u8 op_code; ++ u16 reserved0; ++#elif defined(__LITTLE_ENDIAN) ++ u16 reserved0; ++ u8 op_code; ++ u8 flags; ++#define L4_KWQ_RESET_REQ_RESERVED1 (0xF<<0) ++#define L4_KWQ_RESET_REQ_RESERVED1_SHIFT 0 ++#define L4_KWQ_RESET_REQ_LAYER_CODE (0x7<<4) ++#define L4_KWQ_RESET_REQ_LAYER_CODE_SHIFT 4 ++#define L4_KWQ_RESET_REQ_LINKED_WITH_NEXT (0x1<<7) ++#define L4_KWQ_RESET_REQ_LINKED_WITH_NEXT_SHIFT 7 ++#endif ++ u32 cid; ++ u32 reserved2[6]; ++}; ++ ++ ++/* ++ * a KWQE request to update a PG connection ++ */ ++struct l4_kwq_update_pg { ++#if defined(__BIG_ENDIAN) ++ u8 flags; ++#define L4_KWQ_UPDATE_PG_RESERVED1 (0xF<<0) ++#define L4_KWQ_UPDATE_PG_RESERVED1_SHIFT 0 ++#define L4_KWQ_UPDATE_PG_LAYER_CODE (0x7<<4) ++#define L4_KWQ_UPDATE_PG_LAYER_CODE_SHIFT 4 ++#define L4_KWQ_UPDATE_PG_LINKED_WITH_NEXT (0x1<<7) ++#define L4_KWQ_UPDATE_PG_LINKED_WITH_NEXT_SHIFT 7 ++ u8 opcode; ++ u16 oper16; ++#elif defined(__LITTLE_ENDIAN) ++ u16 oper16; ++ u8 opcode; ++ u8 flags; ++#define L4_KWQ_UPDATE_PG_RESERVED1 (0xF<<0) ++#define L4_KWQ_UPDATE_PG_RESERVED1_SHIFT 0 ++#define L4_KWQ_UPDATE_PG_LAYER_CODE (0x7<<4) ++#define L4_KWQ_UPDATE_PG_LAYER_CODE_SHIFT 4 ++#define L4_KWQ_UPDATE_PG_LINKED_WITH_NEXT (0x1<<7) ++#define L4_KWQ_UPDATE_PG_LINKED_WITH_NEXT_SHIFT 7 ++#endif ++ u32 pg_cid; ++ u32 pg_host_opaque; ++#if defined(__BIG_ENDIAN) ++ u8 pg_valids; ++#define L4_KWQ_UPDATE_PG_VALIDS_IPID_COUNT (0x1<<0) ++#define L4_KWQ_UPDATE_PG_VALIDS_IPID_COUNT_SHIFT 0 ++#define L4_KWQ_UPDATE_PG_VALIDS_DA (0x1<<1) ++#define L4_KWQ_UPDATE_PG_VALIDS_DA_SHIFT 1 ++#define L4_KWQ_UPDATE_PG_RESERVERD2 (0x3F<<2) ++#define L4_KWQ_UPDATE_PG_RESERVERD2_SHIFT 2 ++ u8 pg_unused_a; ++ u16 pg_ipid_count; ++#elif defined(__LITTLE_ENDIAN) ++ u16 pg_ipid_count; ++ u8 pg_unused_a; ++ u8 pg_valids; ++#define L4_KWQ_UPDATE_PG_VALIDS_IPID_COUNT (0x1<<0) ++#define L4_KWQ_UPDATE_PG_VALIDS_IPID_COUNT_SHIFT 0 ++#define L4_KWQ_UPDATE_PG_VALIDS_DA (0x1<<1) ++#define L4_KWQ_UPDATE_PG_VALIDS_DA_SHIFT 1 ++#define L4_KWQ_UPDATE_PG_RESERVERD2 (0x3F<<2) ++#define L4_KWQ_UPDATE_PG_RESERVERD2_SHIFT 2 ++#endif ++#if defined(__BIG_ENDIAN) ++ u16 reserverd3; ++ u8 da0; ++ u8 da1; ++#elif defined(__LITTLE_ENDIAN) ++ u8 da1; ++ u8 da0; ++ u16 reserverd3; ++#endif ++#if defined(__BIG_ENDIAN) ++ u8 da2; ++ u8 da3; ++ u8 da4; ++ u8 da5; ++#elif defined(__LITTLE_ENDIAN) ++ u8 da5; ++ u8 da4; ++ u8 da3; ++ u8 da2; ++#endif ++ u32 reserved4; ++ u32 reserved5; ++}; ++ ++ ++/* ++ * a KWQE request to upload a PG or L4 context ++ */ ++struct l4_kwq_upload { ++#if defined(__BIG_ENDIAN) ++ u8 flags; ++#define L4_KWQ_UPLOAD_RESERVED1 (0xF<<0) ++#define L4_KWQ_UPLOAD_RESERVED1_SHIFT 0 ++#define L4_KWQ_UPLOAD_LAYER_CODE (0x7<<4) ++#define L4_KWQ_UPLOAD_LAYER_CODE_SHIFT 4 ++#define L4_KWQ_UPLOAD_LINKED_WITH_NEXT (0x1<<7) ++#define L4_KWQ_UPLOAD_LINKED_WITH_NEXT_SHIFT 7 ++ u8 opcode; ++ u16 oper16; ++#elif defined(__LITTLE_ENDIAN) ++ u16 oper16; ++ u8 opcode; ++ u8 flags; ++#define L4_KWQ_UPLOAD_RESERVED1 (0xF<<0) ++#define L4_KWQ_UPLOAD_RESERVED1_SHIFT 0 ++#define L4_KWQ_UPLOAD_LAYER_CODE (0x7<<4) ++#define L4_KWQ_UPLOAD_LAYER_CODE_SHIFT 4 ++#define L4_KWQ_UPLOAD_LINKED_WITH_NEXT (0x1<<7) ++#define L4_KWQ_UPLOAD_LINKED_WITH_NEXT_SHIFT 7 ++#endif ++ u32 cid; ++ u32 reserved2[6]; ++}; ++ ++#endif /* __57XX_L5CM_HSI_LINUX_LE__ */ +diff -r 19900e8f54d8 drivers/net/cnic_defs.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/cnic_defs.h Mon Jun 15 16:38:18 2009 +0100 +@@ -0,0 +1,567 @@ ++#ifndef __57XX_L5CM_HSI_LINUX_LE__ ++#define __57XX_L5CM_HSI_LINUX_LE__ ++ ++/* KWQ (kernel work queue) request op codes */ ++#define L2_KWQE_OPCODE_VALUE_FLUSH (4) ++ ++#define L4_KWQE_OPCODE_VALUE_CONNECT1 (50) ++#define L4_KWQE_OPCODE_VALUE_CONNECT2 (51) ++#define L4_KWQE_OPCODE_VALUE_CONNECT3 (52) ++#define L4_KWQE_OPCODE_VALUE_RESET (53) ++#define L4_KWQE_OPCODE_VALUE_CLOSE (54) ++#define L4_KWQE_OPCODE_VALUE_UPDATE_SECRET (60) ++#define L4_KWQE_OPCODE_VALUE_INIT_ULP (61) ++ ++#define L4_KWQE_OPCODE_VALUE_OFFLOAD_PG (1) ++#define L4_KWQE_OPCODE_VALUE_UPDATE_PG (9) ++#define L4_KWQE_OPCODE_VALUE_UPLOAD_PG (14) ++ ++#define L5CM_RAMROD_CMD_ID_BASE (0x80) ++#define L5CM_RAMROD_CMD_ID_TCP_CONNECT (L5CM_RAMROD_CMD_ID_BASE + 3) ++#define L5CM_RAMROD_CMD_ID_CLOSE (L5CM_RAMROD_CMD_ID_BASE + 12) ++#define L5CM_RAMROD_CMD_ID_ABORT (L5CM_RAMROD_CMD_ID_BASE + 13) ++#define L5CM_RAMROD_CMD_ID_SEARCHER_DELETE (L5CM_RAMROD_CMD_ID_BASE + 14) ++#define L5CM_RAMROD_CMD_ID_TERMINATE_OFFLOAD (L5CM_RAMROD_CMD_ID_BASE + 15) ++ ++/* KCQ (kernel completion queue) response op codes */ ++#define L4_KCQE_OPCODE_VALUE_CLOSE_COMP (53) ++#define L4_KCQE_OPCODE_VALUE_RESET_COMP (54) ++#define L4_KCQE_OPCODE_VALUE_FW_TCP_UPDATE (55) ++#define L4_KCQE_OPCODE_VALUE_CONNECT_COMPLETE (56) ++#define L4_KCQE_OPCODE_VALUE_RESET_RECEIVED (57) ++#define L4_KCQE_OPCODE_VALUE_CLOSE_RECEIVED (58) ++#define L4_KCQE_OPCODE_VALUE_INIT_ULP (61) ++ ++#define L4_KCQE_OPCODE_VALUE_OFFLOAD_PG (1) ++#define L4_KCQE_OPCODE_VALUE_UPDATE_PG (9) ++#define L4_KCQE_OPCODE_VALUE_UPLOAD_PG (14) ++ ++/* KCQ (kernel completion queue) completion status */ ++#define L4_KCQE_COMPLETION_STATUS_SUCCESS (0) ++#define L4_KCQE_COMPLETION_STATUS_TIMEOUT (0x93) ++ ++#define L4_LAYER_CODE (4) ++#define L2_LAYER_CODE (2) ++ ++/* ++ * L4 KCQ CQE ++ */ ++struct l4_kcq { ++ u32 cid; ++ u32 pg_cid; ++ u32 conn_id; ++ u32 pg_host_opaque; ++#if defined(__BIG_ENDIAN) ++ u16 status; ++ u16 reserved1; ++#elif defined(__LITTLE_ENDIAN) ++ u16 reserved1; ++ u16 status; ++#endif ++ u32 reserved2[2]; ++#if defined(__BIG_ENDIAN) ++ u8 flags; ++#define L4_KCQ_RESERVED3 (0x7<<0) ++#define L4_KCQ_RESERVED3_SHIFT 0 ++#define L4_KCQ_RAMROD_COMPLETION (0x1<<3) /* Everest only */ ++#define L4_KCQ_RAMROD_COMPLETION_SHIFT 3 ++#define L4_KCQ_LAYER_CODE (0x7<<4) ++#define L4_KCQ_LAYER_CODE_SHIFT 4 ++#define L4_KCQ_RESERVED4 (0x1<<7) ++#define L4_KCQ_RESERVED4_SHIFT 7 ++ u8 op_code; ++ u16 qe_self_seq; ++#elif defined(__LITTLE_ENDIAN) ++ u16 qe_self_seq; ++ u8 op_code; ++ u8 flags; ++#define L4_KCQ_RESERVED3 (0xF<<0) ++#define L4_KCQ_RESERVED3_SHIFT 0 ++#define L4_KCQ_RAMROD_COMPLETION (0x1<<3) /* Everest only */ ++#define L4_KCQ_RAMROD_COMPLETION_SHIFT 3 ++#define L4_KCQ_LAYER_CODE (0x7<<4) ++#define L4_KCQ_LAYER_CODE_SHIFT 4 ++#define L4_KCQ_RESERVED4 (0x1<<7) ++#define L4_KCQ_RESERVED4_SHIFT 7 ++#endif ++}; ++ ++ ++/* ++ * L4 KCQ CQE PG upload ++ */ ++struct l4_kcq_upload_pg { ++ u32 pg_cid; ++#if defined(__BIG_ENDIAN) ++ u16 pg_status; ++ u16 pg_ipid_count; ++#elif defined(__LITTLE_ENDIAN) ++ u16 pg_ipid_count; ++ u16 pg_status; ++#endif ++ u32 reserved1[5]; ++#if defined(__BIG_ENDIAN) ++ u8 flags; ++#define L4_KCQ_UPLOAD_PG_RESERVED3 (0xF<<0) ++#define L4_KCQ_UPLOAD_PG_RESERVED3_SHIFT 0 ++#define L4_KCQ_UPLOAD_PG_LAYER_CODE (0x7<<4) ++#define L4_KCQ_UPLOAD_PG_LAYER_CODE_SHIFT 4 ++#define L4_KCQ_UPLOAD_PG_RESERVED4 (0x1<<7) ++#define L4_KCQ_UPLOAD_PG_RESERVED4_SHIFT 7 ++ u8 op_code; ++ u16 qe_self_seq; ++#elif defined(__LITTLE_ENDIAN) ++ u16 qe_self_seq; ++ u8 op_code; ++ u8 flags; ++#define L4_KCQ_UPLOAD_PG_RESERVED3 (0xF<<0) ++#define L4_KCQ_UPLOAD_PG_RESERVED3_SHIFT 0 ++#define L4_KCQ_UPLOAD_PG_LAYER_CODE (0x7<<4) ++#define L4_KCQ_UPLOAD_PG_LAYER_CODE_SHIFT 4 ++#define L4_KCQ_UPLOAD_PG_RESERVED4 (0x1<<7) ++#define L4_KCQ_UPLOAD_PG_RESERVED4_SHIFT 7 ++#endif ++}; ++ ++ ++/* ++ * Gracefully close the connection request ++ */ ++struct l4_kwq_close_req { ++#if defined(__BIG_ENDIAN) ++ u8 flags; ++#define L4_KWQ_CLOSE_REQ_RESERVED1 (0xF<<0) ++#define L4_KWQ_CLOSE_REQ_RESERVED1_SHIFT 0 ++#define L4_KWQ_CLOSE_REQ_LAYER_CODE (0x7<<4) ++#define L4_KWQ_CLOSE_REQ_LAYER_CODE_SHIFT 4 ++#define L4_KWQ_CLOSE_REQ_LINKED_WITH_NEXT (0x1<<7) ++#define L4_KWQ_CLOSE_REQ_LINKED_WITH_NEXT_SHIFT 7 ++ u8 op_code; ++ u16 reserved0; ++#elif defined(__LITTLE_ENDIAN) ++ u16 reserved0; ++ u8 op_code; ++ u8 flags; ++#define L4_KWQ_CLOSE_REQ_RESERVED1 (0xF<<0) ++#define L4_KWQ_CLOSE_REQ_RESERVED1_SHIFT 0 ++#define L4_KWQ_CLOSE_REQ_LAYER_CODE (0x7<<4) ++#define L4_KWQ_CLOSE_REQ_LAYER_CODE_SHIFT 4 ++#define L4_KWQ_CLOSE_REQ_LINKED_WITH_NEXT (0x1<<7) ++#define L4_KWQ_CLOSE_REQ_LINKED_WITH_NEXT_SHIFT 7 ++#endif ++ u32 cid; ++ u32 reserved2[6]; ++}; ++ ++ ++/* ++ * The first request to be passed in order to establish connection in option2 ++ */ ++struct l4_kwq_connect_req1 { ++#if defined(__BIG_ENDIAN) ++ u8 flags; ++#define L4_KWQ_CONNECT_REQ1_RESERVED1 (0xF<<0) ++#define L4_KWQ_CONNECT_REQ1_RESERVED1_SHIFT 0 ++#define L4_KWQ_CONNECT_REQ1_LAYER_CODE (0x7<<4) ++#define L4_KWQ_CONNECT_REQ1_LAYER_CODE_SHIFT 4 ++#define L4_KWQ_CONNECT_REQ1_LINKED_WITH_NEXT (0x1<<7) ++#define L4_KWQ_CONNECT_REQ1_LINKED_WITH_NEXT_SHIFT 7 ++ u8 op_code; ++ u8 reserved0; ++ u8 conn_flags; ++#define L4_KWQ_CONNECT_REQ1_IS_PG_HOST_OPAQUE (0x1<<0) ++#define L4_KWQ_CONNECT_REQ1_IS_PG_HOST_OPAQUE_SHIFT 0 ++#define L4_KWQ_CONNECT_REQ1_IP_V6 (0x1<<1) ++#define L4_KWQ_CONNECT_REQ1_IP_V6_SHIFT 1 ++#define L4_KWQ_CONNECT_REQ1_PASSIVE_FLAG (0x1<<2) ++#define L4_KWQ_CONNECT_REQ1_PASSIVE_FLAG_SHIFT 2 ++#define L4_KWQ_CONNECT_REQ1_RSRV (0x1F<<3) ++#define L4_KWQ_CONNECT_REQ1_RSRV_SHIFT 3 ++#elif defined(__LITTLE_ENDIAN) ++ u8 conn_flags; ++#define L4_KWQ_CONNECT_REQ1_IS_PG_HOST_OPAQUE (0x1<<0) ++#define L4_KWQ_CONNECT_REQ1_IS_PG_HOST_OPAQUE_SHIFT 0 ++#define L4_KWQ_CONNECT_REQ1_IP_V6 (0x1<<1) ++#define L4_KWQ_CONNECT_REQ1_IP_V6_SHIFT 1 ++#define L4_KWQ_CONNECT_REQ1_PASSIVE_FLAG (0x1<<2) ++#define L4_KWQ_CONNECT_REQ1_PASSIVE_FLAG_SHIFT 2 ++#define L4_KWQ_CONNECT_REQ1_RSRV (0x1F<<3) ++#define L4_KWQ_CONNECT_REQ1_RSRV_SHIFT 3 ++ u8 reserved0; ++ u8 op_code; ++ u8 flags; ++#define L4_KWQ_CONNECT_REQ1_RESERVED1 (0xF<<0) ++#define L4_KWQ_CONNECT_REQ1_RESERVED1_SHIFT 0 ++#define L4_KWQ_CONNECT_REQ1_LAYER_CODE (0x7<<4) ++#define L4_KWQ_CONNECT_REQ1_LAYER_CODE_SHIFT 4 ++#define L4_KWQ_CONNECT_REQ1_LINKED_WITH_NEXT (0x1<<7) ++#define L4_KWQ_CONNECT_REQ1_LINKED_WITH_NEXT_SHIFT 7 ++#endif ++ u32 cid; ++ u32 pg_cid; ++ u32 src_ip; ++ u32 dst_ip; ++#if defined(__BIG_ENDIAN) ++ u16 dst_port; ++ u16 src_port; ++#elif defined(__LITTLE_ENDIAN) ++ u16 src_port; ++ u16 dst_port; ++#endif ++#if defined(__BIG_ENDIAN) ++ u8 rsrv1[3]; ++ u8 tcp_flags; ++#define L4_KWQ_CONNECT_REQ1_NO_DELAY_ACK (0x1<<0) ++#define L4_KWQ_CONNECT_REQ1_NO_DELAY_ACK_SHIFT 0 ++#define L4_KWQ_CONNECT_REQ1_KEEP_ALIVE (0x1<<1) ++#define L4_KWQ_CONNECT_REQ1_KEEP_ALIVE_SHIFT 1 ++#define L4_KWQ_CONNECT_REQ1_NAGLE_ENABLE (0x1<<2) ++#define L4_KWQ_CONNECT_REQ1_NAGLE_ENABLE_SHIFT 2 ++#define L4_KWQ_CONNECT_REQ1_TIME_STAMP (0x1<<3) ++#define L4_KWQ_CONNECT_REQ1_TIME_STAMP_SHIFT 3 ++#define L4_KWQ_CONNECT_REQ1_SACK (0x1<<4) ++#define L4_KWQ_CONNECT_REQ1_SACK_SHIFT 4 ++#define L4_KWQ_CONNECT_REQ1_SEG_SCALING (0x1<<5) ++#define L4_KWQ_CONNECT_REQ1_SEG_SCALING_SHIFT 5 ++#define L4_KWQ_CONNECT_REQ1_RESERVED2 (0x3<<6) ++#define L4_KWQ_CONNECT_REQ1_RESERVED2_SHIFT 6 ++#elif defined(__LITTLE_ENDIAN) ++ u8 tcp_flags; ++#define L4_KWQ_CONNECT_REQ1_NO_DELAY_ACK (0x1<<0) ++#define L4_KWQ_CONNECT_REQ1_NO_DELAY_ACK_SHIFT 0 ++#define L4_KWQ_CONNECT_REQ1_KEEP_ALIVE (0x1<<1) ++#define L4_KWQ_CONNECT_REQ1_KEEP_ALIVE_SHIFT 1 ++#define L4_KWQ_CONNECT_REQ1_NAGLE_ENABLE (0x1<<2) ++#define L4_KWQ_CONNECT_REQ1_NAGLE_ENABLE_SHIFT 2 ++#define L4_KWQ_CONNECT_REQ1_TIME_STAMP (0x1<<3) ++#define L4_KWQ_CONNECT_REQ1_TIME_STAMP_SHIFT 3 ++#define L4_KWQ_CONNECT_REQ1_SACK (0x1<<4) ++#define L4_KWQ_CONNECT_REQ1_SACK_SHIFT 4 ++#define L4_KWQ_CONNECT_REQ1_SEG_SCALING (0x1<<5) ++#define L4_KWQ_CONNECT_REQ1_SEG_SCALING_SHIFT 5 ++#define L4_KWQ_CONNECT_REQ1_RESERVED2 (0x3<<6) ++#define L4_KWQ_CONNECT_REQ1_RESERVED2_SHIFT 6 ++ u8 rsrv1[3]; ++#endif ++ u32 rsrv2; ++}; ++ ++ ++/* ++ * The second ( optional )request to be passed in order to establish connection in option2 - for IPv6 only ++ */ ++struct l4_kwq_connect_req2 { ++#if defined(__BIG_ENDIAN) ++ u8 flags; ++#define L4_KWQ_CONNECT_REQ2_RESERVED1 (0xF<<0) ++#define L4_KWQ_CONNECT_REQ2_RESERVED1_SHIFT 0 ++#define L4_KWQ_CONNECT_REQ2_LAYER_CODE (0x7<<4) ++#define L4_KWQ_CONNECT_REQ2_LAYER_CODE_SHIFT 4 ++#define L4_KWQ_CONNECT_REQ2_LINKED_WITH_NEXT (0x1<<7) ++#define L4_KWQ_CONNECT_REQ2_LINKED_WITH_NEXT_SHIFT 7 ++ u8 op_code; ++ u8 reserved0; ++ u8 rsrv; ++#elif defined(__LITTLE_ENDIAN) ++ u8 rsrv; ++ u8 reserved0; ++ u8 op_code; ++ u8 flags; ++#define L4_KWQ_CONNECT_REQ2_RESERVED1 (0xF<<0) ++#define L4_KWQ_CONNECT_REQ2_RESERVED1_SHIFT 0 ++#define L4_KWQ_CONNECT_REQ2_LAYER_CODE (0x7<<4) ++#define L4_KWQ_CONNECT_REQ2_LAYER_CODE_SHIFT 4 ++#define L4_KWQ_CONNECT_REQ2_LINKED_WITH_NEXT (0x1<<7) ++#define L4_KWQ_CONNECT_REQ2_LINKED_WITH_NEXT_SHIFT 7 ++#endif ++ u32 reserved2; ++ u32 src_ip_v6_2; ++ u32 src_ip_v6_3; ++ u32 src_ip_v6_4; ++ u32 dst_ip_v6_2; ++ u32 dst_ip_v6_3; ++ u32 dst_ip_v6_4; ++}; ++ ++ ++/* ++ * The third ( and last )request to be passed in order to establish connection in option2 ++ */ ++struct l4_kwq_connect_req3 { ++#if defined(__BIG_ENDIAN) ++ u8 flags; ++#define L4_KWQ_CONNECT_REQ3_RESERVED1 (0xF<<0) ++#define L4_KWQ_CONNECT_REQ3_RESERVED1_SHIFT 0 ++#define L4_KWQ_CONNECT_REQ3_LAYER_CODE (0x7<<4) ++#define L4_KWQ_CONNECT_REQ3_LAYER_CODE_SHIFT 4 ++#define L4_KWQ_CONNECT_REQ3_LINKED_WITH_NEXT (0x1<<7) ++#define L4_KWQ_CONNECT_REQ3_LINKED_WITH_NEXT_SHIFT 7 ++ u8 op_code; ++ u16 reserved0; ++#elif defined(__LITTLE_ENDIAN) ++ u16 reserved0; ++ u8 op_code; ++ u8 flags; ++#define L4_KWQ_CONNECT_REQ3_RESERVED1 (0xF<<0) ++#define L4_KWQ_CONNECT_REQ3_RESERVED1_SHIFT 0 ++#define L4_KWQ_CONNECT_REQ3_LAYER_CODE (0x7<<4) ++#define L4_KWQ_CONNECT_REQ3_LAYER_CODE_SHIFT 4 ++#define L4_KWQ_CONNECT_REQ3_LINKED_WITH_NEXT (0x1<<7) ++#define L4_KWQ_CONNECT_REQ3_LINKED_WITH_NEXT_SHIFT 7 ++#endif ++ u32 ka_timeout; ++ u32 ka_interval ; ++#if defined(__BIG_ENDIAN) ++ u8 snd_seq_scale; ++ u8 ttl; ++ u8 tos; ++ u8 ka_max_probe_count; ++#elif defined(__LITTLE_ENDIAN) ++ u8 ka_max_probe_count; ++ u8 tos; ++ u8 ttl; ++ u8 snd_seq_scale; ++#endif ++#if defined(__BIG_ENDIAN) ++ u16 pmtu; ++ u16 mss; ++#elif defined(__LITTLE_ENDIAN) ++ u16 mss; ++ u16 pmtu; ++#endif ++ u32 rcv_buf; ++ u32 snd_buf; ++ u32 seed; ++}; ++ ++ ++/* ++ * a KWQE request to offload a PG connection ++ */ ++struct l4_kwq_offload_pg { ++#if defined(__BIG_ENDIAN) ++ u8 flags; ++#define L4_KWQ_OFFLOAD_PG_RESERVED1 (0xF<<0) ++#define L4_KWQ_OFFLOAD_PG_RESERVED1_SHIFT 0 ++#define L4_KWQ_OFFLOAD_PG_LAYER_CODE (0x7<<4) ++#define L4_KWQ_OFFLOAD_PG_LAYER_CODE_SHIFT 4 ++#define L4_KWQ_OFFLOAD_PG_LINKED_WITH_NEXT (0x1<<7) ++#define L4_KWQ_OFFLOAD_PG_LINKED_WITH_NEXT_SHIFT 7 ++ u8 op_code; ++ u16 reserved0; ++#elif defined(__LITTLE_ENDIAN) ++ u16 reserved0; ++ u8 op_code; ++ u8 flags; ++#define L4_KWQ_OFFLOAD_PG_RESERVED1 (0xF<<0) ++#define L4_KWQ_OFFLOAD_PG_RESERVED1_SHIFT 0 ++#define L4_KWQ_OFFLOAD_PG_LAYER_CODE (0x7<<4) ++#define L4_KWQ_OFFLOAD_PG_LAYER_CODE_SHIFT 4 ++#define L4_KWQ_OFFLOAD_PG_LINKED_WITH_NEXT (0x1<<7) ++#define L4_KWQ_OFFLOAD_PG_LINKED_WITH_NEXT_SHIFT 7 ++#endif ++#if defined(__BIG_ENDIAN) ++ u8 l2hdr_nbytes; ++ u8 pg_flags; ++#define L4_KWQ_OFFLOAD_PG_SNAP_ENCAP (0x1<<0) ++#define L4_KWQ_OFFLOAD_PG_SNAP_ENCAP_SHIFT 0 ++#define L4_KWQ_OFFLOAD_PG_VLAN_TAGGING (0x1<<1) ++#define L4_KWQ_OFFLOAD_PG_VLAN_TAGGING_SHIFT 1 ++#define L4_KWQ_OFFLOAD_PG_RESERVED2 (0x3F<<2) ++#define L4_KWQ_OFFLOAD_PG_RESERVED2_SHIFT 2 ++ u8 da0; ++ u8 da1; ++#elif defined(__LITTLE_ENDIAN) ++ u8 da1; ++ u8 da0; ++ u8 pg_flags; ++#define L4_KWQ_OFFLOAD_PG_SNAP_ENCAP (0x1<<0) ++#define L4_KWQ_OFFLOAD_PG_SNAP_ENCAP_SHIFT 0 ++#define L4_KWQ_OFFLOAD_PG_VLAN_TAGGING (0x1<<1) ++#define L4_KWQ_OFFLOAD_PG_VLAN_TAGGING_SHIFT 1 ++#define L4_KWQ_OFFLOAD_PG_RESERVED2 (0x3F<<2) ++#define L4_KWQ_OFFLOAD_PG_RESERVED2_SHIFT 2 ++ u8 l2hdr_nbytes; ++#endif ++#if defined(__BIG_ENDIAN) ++ u8 da2; ++ u8 da3; ++ u8 da4; ++ u8 da5; ++#elif defined(__LITTLE_ENDIAN) ++ u8 da5; ++ u8 da4; ++ u8 da3; ++ u8 da2; ++#endif ++#if defined(__BIG_ENDIAN) ++ u8 sa0; ++ u8 sa1; ++ u8 sa2; ++ u8 sa3; ++#elif defined(__LITTLE_ENDIAN) ++ u8 sa3; ++ u8 sa2; ++ u8 sa1; ++ u8 sa0; ++#endif ++#if defined(__BIG_ENDIAN) ++ u8 sa4; ++ u8 sa5; ++ u16 etype; ++#elif defined(__LITTLE_ENDIAN) ++ u16 etype; ++ u8 sa5; ++ u8 sa4; ++#endif ++#if defined(__BIG_ENDIAN) ++ u16 vlan_tag; ++ u16 ipid_start; ++#elif defined(__LITTLE_ENDIAN) ++ u16 ipid_start; ++ u16 vlan_tag; ++#endif ++#if defined(__BIG_ENDIAN) ++ u16 ipid_count; ++ u16 reserved3; ++#elif defined(__LITTLE_ENDIAN) ++ u16 reserved3; ++ u16 ipid_count; ++#endif ++ u32 host_opaque; ++}; ++ ++ ++/* ++ * Abortively close the connection request ++ */ ++struct l4_kwq_reset_req { ++#if defined(__BIG_ENDIAN) ++ u8 flags; ++#define L4_KWQ_RESET_REQ_RESERVED1 (0xF<<0) ++#define L4_KWQ_RESET_REQ_RESERVED1_SHIFT 0 ++#define L4_KWQ_RESET_REQ_LAYER_CODE (0x7<<4) ++#define L4_KWQ_RESET_REQ_LAYER_CODE_SHIFT 4 ++#define L4_KWQ_RESET_REQ_LINKED_WITH_NEXT (0x1<<7) ++#define L4_KWQ_RESET_REQ_LINKED_WITH_NEXT_SHIFT 7 ++ u8 op_code; ++ u16 reserved0; ++#elif defined(__LITTLE_ENDIAN) ++ u16 reserved0; ++ u8 op_code; ++ u8 flags; ++#define L4_KWQ_RESET_REQ_RESERVED1 (0xF<<0) ++#define L4_KWQ_RESET_REQ_RESERVED1_SHIFT 0 ++#define L4_KWQ_RESET_REQ_LAYER_CODE (0x7<<4) ++#define L4_KWQ_RESET_REQ_LAYER_CODE_SHIFT 4 ++#define L4_KWQ_RESET_REQ_LINKED_WITH_NEXT (0x1<<7) ++#define L4_KWQ_RESET_REQ_LINKED_WITH_NEXT_SHIFT 7 ++#endif ++ u32 cid; ++ u32 reserved2[6]; ++}; ++ ++ ++/* ++ * a KWQE request to update a PG connection ++ */ ++struct l4_kwq_update_pg { ++#if defined(__BIG_ENDIAN) ++ u8 flags; ++#define L4_KWQ_UPDATE_PG_RESERVED1 (0xF<<0) ++#define L4_KWQ_UPDATE_PG_RESERVED1_SHIFT 0 ++#define L4_KWQ_UPDATE_PG_LAYER_CODE (0x7<<4) ++#define L4_KWQ_UPDATE_PG_LAYER_CODE_SHIFT 4 ++#define L4_KWQ_UPDATE_PG_LINKED_WITH_NEXT (0x1<<7) ++#define L4_KWQ_UPDATE_PG_LINKED_WITH_NEXT_SHIFT 7 ++ u8 opcode; ++ u16 oper16; ++#elif defined(__LITTLE_ENDIAN) ++ u16 oper16; ++ u8 opcode; ++ u8 flags; ++#define L4_KWQ_UPDATE_PG_RESERVED1 (0xF<<0) ++#define L4_KWQ_UPDATE_PG_RESERVED1_SHIFT 0 ++#define L4_KWQ_UPDATE_PG_LAYER_CODE (0x7<<4) ++#define L4_KWQ_UPDATE_PG_LAYER_CODE_SHIFT 4 ++#define L4_KWQ_UPDATE_PG_LINKED_WITH_NEXT (0x1<<7) ++#define L4_KWQ_UPDATE_PG_LINKED_WITH_NEXT_SHIFT 7 ++#endif ++ u32 pg_cid; ++ u32 pg_host_opaque; ++#if defined(__BIG_ENDIAN) ++ u8 pg_valids; ++#define L4_KWQ_UPDATE_PG_VALIDS_IPID_COUNT (0x1<<0) ++#define L4_KWQ_UPDATE_PG_VALIDS_IPID_COUNT_SHIFT 0 ++#define L4_KWQ_UPDATE_PG_VALIDS_DA (0x1<<1) ++#define L4_KWQ_UPDATE_PG_VALIDS_DA_SHIFT 1 ++#define L4_KWQ_UPDATE_PG_RESERVERD2 (0x3F<<2) ++#define L4_KWQ_UPDATE_PG_RESERVERD2_SHIFT 2 ++ u8 pg_unused_a; ++ u16 pg_ipid_count; ++#elif defined(__LITTLE_ENDIAN) ++ u16 pg_ipid_count; ++ u8 pg_unused_a; ++ u8 pg_valids; ++#define L4_KWQ_UPDATE_PG_VALIDS_IPID_COUNT (0x1<<0) ++#define L4_KWQ_UPDATE_PG_VALIDS_IPID_COUNT_SHIFT 0 ++#define L4_KWQ_UPDATE_PG_VALIDS_DA (0x1<<1) ++#define L4_KWQ_UPDATE_PG_VALIDS_DA_SHIFT 1 ++#define L4_KWQ_UPDATE_PG_RESERVERD2 (0x3F<<2) ++#define L4_KWQ_UPDATE_PG_RESERVERD2_SHIFT 2 ++#endif ++#if defined(__BIG_ENDIAN) ++ u16 reserverd3; ++ u8 da0; ++ u8 da1; ++#elif defined(__LITTLE_ENDIAN) ++ u8 da1; ++ u8 da0; ++ u16 reserverd3; ++#endif ++#if defined(__BIG_ENDIAN) ++ u8 da2; ++ u8 da3; ++ u8 da4; ++ u8 da5; ++#elif defined(__LITTLE_ENDIAN) ++ u8 da5; ++ u8 da4; ++ u8 da3; ++ u8 da2; ++#endif ++ u32 reserved4; ++ u32 reserved5; ++}; ++ ++ ++/* ++ * a KWQE request to upload a PG or L4 context ++ */ ++struct l4_kwq_upload { ++#if defined(__BIG_ENDIAN) ++ u8 flags; ++#define L4_KWQ_UPLOAD_RESERVED1 (0xF<<0) ++#define L4_KWQ_UPLOAD_RESERVED1_SHIFT 0 ++#define L4_KWQ_UPLOAD_LAYER_CODE (0x7<<4) ++#define L4_KWQ_UPLOAD_LAYER_CODE_SHIFT 4 ++#define L4_KWQ_UPLOAD_LINKED_WITH_NEXT (0x1<<7) ++#define L4_KWQ_UPLOAD_LINKED_WITH_NEXT_SHIFT 7 ++ u8 opcode; ++ u16 oper16; ++#elif defined(__LITTLE_ENDIAN) ++ u16 oper16; ++ u8 opcode; ++ u8 flags; ++#define L4_KWQ_UPLOAD_RESERVED1 (0xF<<0) ++#define L4_KWQ_UPLOAD_RESERVED1_SHIFT 0 ++#define L4_KWQ_UPLOAD_LAYER_CODE (0x7<<4) ++#define L4_KWQ_UPLOAD_LAYER_CODE_SHIFT 4 ++#define L4_KWQ_UPLOAD_LINKED_WITH_NEXT (0x1<<7) ++#define L4_KWQ_UPLOAD_LINKED_WITH_NEXT_SHIFT 7 ++#endif ++ u32 cid; ++ u32 reserved2[6]; ++}; ++ ++#endif /* __57XX_L5CM_HSI_LINUX_LE__ */ +diff -r 19900e8f54d8 drivers/net/cnic_drv.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/cnic_drv.h Mon Jun 15 16:38:18 2009 +0100 +@@ -0,0 +1,125 @@ ++/* cnic_drv.h: Broadcom CNIC core network driver. ++ * ++ * Copyright (c) 2008 Broadcom Corporation ++ * ++ * 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. ++ * ++ */ ++ ++ ++#ifndef CNIC_DRV_H ++#define CNIC_DRV_H ++ ++#if !defined(__iomem) ++#define __iomem ++#endif ++ ++struct kwqe; ++struct kcqe; ++struct kwqe_16; ++ ++#define MAX_CNIC_CTL_DATA 64 ++#define MAX_DRV_CTL_DATA 64 ++ ++#define CNIC_CTL_STOP_CMD 1 ++#define CNIC_CTL_START_CMD 2 ++#define CNIC_CTL_COMPLETION_CMD 3 ++ ++#define DRV_CTL_IO_WR_CMD 0x101 ++#define DRV_CTL_IO_RD_CMD 0x102 ++#define DRV_CTL_CTX_WR_CMD 0x103 ++#define DRV_CTL_CTXTBL_WR_CMD 0x104 ++#define DRV_CTL_COMPLETION_CMD 0x105 ++ ++struct cnic_ctl_completion { ++ u32 cid; ++}; ++ ++struct drv_ctl_completion { ++ u32 comp_count; ++}; ++ ++struct cnic_ctl_info { ++ int cmd; ++ union { ++ struct cnic_ctl_completion comp; ++ char bytes[MAX_CNIC_CTL_DATA]; ++ } data; ++}; ++ ++struct drv_ctl_io { ++ u32 cid_addr; ++ u32 offset; ++ u32 data; ++ dma_addr_t dma_addr; ++}; ++ ++struct drv_ctl_info { ++ int cmd; ++ union { ++ struct drv_ctl_completion comp; ++ struct drv_ctl_io io; ++ char bytes[MAX_DRV_CTL_DATA]; ++ } data; ++}; ++ ++struct cnic_ops { ++ struct module *cnic_owner; ++ /* Calls to these functions are protected by RCU. When ++ * unregistering, we wait for any calls to complete before ++ * continuing. ++ */ ++ int (*cnic_handler)(void *, void *); ++ int (*cnic_ctl)(void *, struct cnic_ctl_info *); ++ unsigned long reserved[2]; ++}; ++ ++#define MAX_CNIC_VEC 8 ++ ++struct cnic_irq { ++ unsigned int vector; ++ void *status_blk; ++ u32 status_blk_num; ++ u32 irq_flags; ++#define CNIC_IRQ_FL_MSIX 0x00000001 ++}; ++ ++struct cnic_eth_dev { ++ struct module *drv_owner; ++ u32 drv_state; ++#define CNIC_DRV_STATE_REGD 0x00000001 ++#define CNIC_DRV_STATE_USING_MSIX 0x00000002 ++ u32 chip_id; ++ u32 max_kwqe_pending; ++ struct pci_dev *pdev; ++ void __iomem *io_base; ++ ++ u32 ctx_tbl_offset; ++ u32 ctx_tbl_len; ++ int ctx_blk_size; ++ u32 starting_cid; ++ u32 max_iscsi_conn; ++ u32 max_fcoe_conn; ++ u32 max_rdma_conn; ++ u32 reserved0[2]; ++ ++ int num_irq; ++ struct cnic_irq irq_arr[MAX_CNIC_VEC]; ++ int (*drv_register_cnic)(struct net_device *, ++ struct cnic_ops *, void *); ++ int (*drv_unregister_cnic)(struct net_device *); ++ int (*drv_submit_kwqes_32)(struct net_device *, ++ struct kwqe *[], u32); ++ int (*drv_submit_kwqes_16)(struct net_device *, ++ struct kwqe_16 *[], u32); ++ int (*drv_ctl)(struct net_device *, struct drv_ctl_info *); ++ unsigned long reserved1[2]; ++}; ++ ++#ifdef __VMKLNX__ ++extern struct cnic_eth_dev *bnx2_cnic_probe(struct net_device *); ++#endif ++ ++#endif +diff -r 19900e8f54d8 drivers/net/cnic_if.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/cnic_if.h Mon Jun 15 16:38:18 2009 +0100 +@@ -0,0 +1,209 @@ ++/* cnic_if.h: Broadcom CNIC core network driver. ++ * ++ * Copyright (c) 2006 - 2009 Broadcom Corporation ++ * ++ * 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. ++ * ++ * Written by: John(Zongxi) Chen (zongxic@broadcom.com) ++ */ ++ ++ ++#ifndef CNIC_IF_H ++#define CNIC_IF_H ++ ++#define CNIC_MODULE_VERSION "1.9.0" ++#define CNIC_MODULE_RELDATE "June 10, 2009" ++ ++#define CNIC_ULP_RDMA 0 ++#define CNIC_ULP_ISCSI 1 ++#define CNIC_ULP_L4 2 ++#define MAX_CNIC_ULP_TYPE_EXT 2 ++#define MAX_CNIC_ULP_TYPE 3 ++ ++struct kwqe { ++ u32 kwqe_op_flag; ++ ++#define KWQE_OPCODE_MASK 0x00ff0000 ++#define KWQE_OPCODE_SHIFT 16 ++#define KWQE_OPCODE(x) ((x & KWQE_OPCODE_MASK) >> KWQE_OPCODE_SHIFT) ++ ++ u32 kwqe_info0; ++ u32 kwqe_info1; ++ u32 kwqe_info2; ++ u32 kwqe_info3; ++ u32 kwqe_info4; ++ u32 kwqe_info5; ++ u32 kwqe_info6; ++}; ++ ++struct kwqe_16 { ++ u32 kwqe_info0; ++ u32 kwqe_info1; ++ u32 kwqe_info2; ++ u32 kwqe_info3; ++}; ++ ++struct kcqe { ++ u32 kcqe_info0; ++ u32 kcqe_info1; ++ u32 kcqe_info2; ++ u32 kcqe_info3; ++ u32 kcqe_info4; ++ u32 kcqe_info5; ++ u32 kcqe_info6; ++ u32 kcqe_op_flag; ++ #define KCQE_RAMROD_COMPLETION (0x1<<27) /* Everest */ ++ #define KCQE_FLAGS_LAYER_MASK (0x7<<28) ++ #define KCQE_FLAGS_LAYER_MASK_MISC (0<<28) ++ #define KCQE_FLAGS_LAYER_MASK_L2 (2<<28) ++ #define KCQE_FLAGS_LAYER_MASK_L3 (3<<28) ++ #define KCQE_FLAGS_LAYER_MASK_L4 (4<<28) ++ #define KCQE_FLAGS_LAYER_MASK_L5_RDMA (5<<28) ++ #define KCQE_FLAGS_LAYER_MASK_L5_ISCSI (6<<28) ++ #define KCQE_FLAGS_NEXT (1<<31) ++ #define KCQE_FLAGS_OPCODE_MASK (0xff<<16) ++ #define KCQE_FLAGS_OPCODE_SHIFT (16) ++ #define KCQE_OPCODE(op) \ ++ (((op) & KCQE_FLAGS_OPCODE_MASK) >> KCQE_FLAGS_OPCODE_SHIFT) ++}; ++ ++struct cnic_sockaddr { ++ union { ++ struct sockaddr_in v4; ++ struct sockaddr_in6 v6; ++ } local; ++ union { ++ struct sockaddr_in v4; ++ struct sockaddr_in6 v6; ++ } remote; ++}; ++ ++struct cnic_sock { ++ struct cnic_dev *dev; ++ void *context; ++ u32 src_ip[4]; ++ u32 dst_ip[4]; ++ u16 src_port; ++ u16 dst_port; ++ u16 vlan_id; ++ unsigned char old_ha[6]; ++#ifdef __VMKLNX__ ++ unsigned char ha[6]; ++#endif ++ u16 pmtu; ++ struct dst_entry *dst; ++ u32 cid; ++ u32 l5_cid; ++ u32 pg_cid; ++ int ulp_type; ++ ++ u32 ka_timeout; ++ u32 ka_interval; ++ u8 ka_max_probe_count; ++ u8 tos; ++ u8 ttl; ++ u8 snd_seq_scale; ++ u32 rcv_buf; ++ u32 snd_buf; ++ u32 seed; ++ ++ unsigned long tcp_flags; ++#define SK_TCP_NO_DELAY_ACK 0x1 ++#define SK_TCP_KEEP_ALIVE 0x2 ++#define SK_TCP_NAGLE 0x4 ++#define SK_TCP_TIMESTAMP 0x8 ++#define SK_TCP_SACK 0x10 ++#define SK_TCP_SEG_SCALING 0x20 ++ ++ unsigned long flags; ++#define SK_F_INUSE 0 ++#define SK_F_OFFLD_COMPLETE 1 ++#define SK_F_OFFLD_SCHED 2 ++#define SK_F_PG_OFFLD_COMPLETE 3 ++#define SK_F_CONNECT_START 4 ++#define SK_F_IPV6 5 ++#define SK_F_NDISC_WAITING 6 ++#define SK_F_CLOSING 7 ++ ++ atomic_t ref_count; ++ u32 state; ++ struct kwqe kwqe1; ++ struct kwqe kwqe2; ++ struct kwqe kwqe3; ++}; ++ ++struct cnic_dev { ++ struct net_device *netdev; ++ struct pci_dev *pcidev; ++ void __iomem *regview; ++ struct list_head list; ++ ++ int (*register_device)(struct cnic_dev *dev, int ulp_type, ++ void *ulp_ctx); ++ int (*unregister_device)(struct cnic_dev *dev, int ulp_type); ++ int (*submit_kwqes)(struct cnic_dev *dev, struct kwqe *wqes[], ++ u32 num_wqes); ++ ++ int (*cm_create)(struct cnic_dev *, int, u32, u32, struct cnic_sock **, ++ void *); ++ int (*cm_destroy)(struct cnic_sock *); ++ int (*cm_connect)(struct cnic_sock *, struct cnic_sockaddr *); ++ int (*cm_abort)(struct cnic_sock *); ++ int (*cm_close)(struct cnic_sock *); ++#ifdef __VMKLNX__ ++ struct cnic_dev *(*cm_select_dev)(vmk_IscsiNetHandle iscsiNetHandle, ++ struct sockaddr_in *, int ulp_type); ++#else ++ struct cnic_dev *(*cm_select_dev)(struct sockaddr_in *, int ulp_type); ++#endif ++ unsigned long flags; ++#define CNIC_F_IF_UP 0 ++#define CNIC_F_CNIC_UP 1 ++#define CNIC_F_IF_GOING_DOWN 2 ++#define CNIC_F_BNX2_CLASS 3 ++#define CNIC_F_BNX2X_CLASS 4 ++ atomic_t ref_count; ++ int use_count; ++ ++ int max_iscsi_conn; ++ int max_fcoe_conn; ++ int max_rdma_conn; ++ ++ void *cnic_priv; ++}; ++ ++#define CNIC_WR(dev, off, val) writel(val, dev->regview + off) ++#define CNIC_WR16(dev, off, val) writew(val, dev->regview + off) ++#define CNIC_WR8(dev, off, val) writeb(val, dev->regview + off) ++#define CNIC_RD(dev, off) readl(dev->regview + off) ++#define CNIC_RD16(dev, off) readw(dev->regview + off) ++ ++struct cnic_ulp_ops { ++ /* Calls to these functions are protected by RCU. When ++ * unregistering, we wait for any calls to complete before ++ * continuing. ++ */ ++ ++ void (*cnic_init)(struct cnic_dev *dev); ++ void (*cnic_exit)(struct cnic_dev *dev); ++ void (*cnic_start)(void *ulp_ctx); ++ void (*cnic_stop)(void *ulp_ctx); ++ void (*indicate_kcqes)(void *ulp_ctx, struct kcqe *cqes[], ++ u32 num_cqes); ++ void (*indicate_netevent)(void *ulp_ctx, unsigned long event); ++ void (*indicate_inetevent)(void *ulp_ctx, unsigned long event); ++ void (*cm_connect_complete)(struct cnic_sock *); ++ void (*cm_close_complete)(struct cnic_sock *); ++ void (*cm_abort_complete)(struct cnic_sock *); ++ void (*cm_remote_close)(struct cnic_sock *); ++ void (*cm_remote_abort)(struct cnic_sock *); ++ struct module *owner; ++}; ++ ++extern int cnic_register_driver(int ulp_type, struct cnic_ulp_ops *ulp_ops); ++ ++extern int cnic_unregister_driver(int ulp_type); ++ ++#endif diff --git a/master/bnx2i-1.8.9k b/master/bnx2i-1.8.9k new file mode 100644 index 0000000..32b4269 --- /dev/null +++ b/master/bnx2i-1.8.9k @@ -0,0 +1,12992 @@ +diff -r 14194bd97e8c drivers/scsi/Kconfig +--- a/drivers/scsi/Kconfig Tue Jun 16 11:03:38 2009 +0100 ++++ b/drivers/scsi/Kconfig Tue Jun 16 11:09:42 2009 +0100 +@@ -1811,4 +1811,6 @@ + + source "drivers/scsi/device_handler/Kconfig" + ++source "drivers/scsi/bnx2i/Kconfig" ++ + endmenu +diff -r 14194bd97e8c drivers/scsi/Makefile +--- a/drivers/scsi/Makefile Tue Jun 16 11:03:38 2009 +0100 ++++ b/drivers/scsi/Makefile Tue Jun 16 11:09:42 2009 +0100 +@@ -127,6 +127,7 @@ + obj-$(CONFIG_SCSI_STEX) += stex.o + obj-$(CONFIG_SCSI_MVSAS) += mvsas.o + obj-$(CONFIG_PS3_ROM) += ps3rom.o ++obj-$(CONFIG_SCSI_BNX2_ISCSI) += bnx2i/ + + obj-$(CONFIG_ARM) += arm/ + +diff -r 14194bd97e8c drivers/scsi/bnx2i/57xx_iscsi_constants.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/scsi/bnx2i/57xx_iscsi_constants.h Tue Jun 16 11:09:42 2009 +0100 +@@ -0,0 +1,153 @@ ++/* 57xx_iscsi_constants.h: Broadcom NetXtreme II iSCSI driver. ++ * ++ * Copyright (c) 2006 - 2009 Broadcom Corporation ++ * ++ * 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. ++ */ ++#ifndef __57XX_ISCSI_CONSTANTS_H_ ++#define __57XX_ISCSI_CONSTANTS_H_ ++ ++/** ++* This file defines HSI constants for the iSCSI flows ++*/ ++ ++/* iSCSI request op codes */ ++#define ISCSI_OPCODE_CLEANUP_REQUEST (7) ++ ++/* iSCSI response/messages op codes */ ++#define ISCSI_OPCODE_CLEANUP_RESPONSE (0x27) ++#define ISCSI_OPCODE_NOPOUT_LOCAL_COMPLETION (0) ++ ++/* iSCSI task types */ ++#define ISCSI_TASK_TYPE_READ (0) ++#define ISCSI_TASK_TYPE_WRITE (1) ++#define ISCSI_TASK_TYPE_MPATH (2) ++ ++/* initial CQ sequence numbers */ ++#define ISCSI_INITIAL_SN (1) ++ ++/* KWQ (kernel work queue) layer codes */ ++#define ISCSI_KWQE_LAYER_CODE (6) ++ ++/* KWQ (kernel work queue) request op codes */ ++#define ISCSI_KWQE_OPCODE_OFFLOAD_CONN1 (0) ++#define ISCSI_KWQE_OPCODE_OFFLOAD_CONN2 (1) ++#define ISCSI_KWQE_OPCODE_UPDATE_CONN (2) ++#define ISCSI_KWQE_OPCODE_DESTROY_CONN (3) ++#define ISCSI_KWQE_OPCODE_INIT1 (4) ++#define ISCSI_KWQE_OPCODE_INIT2 (5) ++ ++/* KCQ (kernel completion queue) response op codes */ ++#define ISCSI_KCQE_OPCODE_OFFLOAD_CONN (0x10) ++#define ISCSI_KCQE_OPCODE_UPDATE_CONN (0x12) ++#define ISCSI_KCQE_OPCODE_DESTROY_CONN (0x13) ++#define ISCSI_KCQE_OPCODE_INIT (0x14) ++#define ISCSI_KCQE_OPCODE_FW_CLEAN_TASK (0x15) ++#define ISCSI_KCQE_OPCODE_TCP_RESET (0x16) ++#define ISCSI_KCQE_OPCODE_TCP_SYN (0x17) ++#define ISCSI_KCQE_OPCODE_TCP_FIN (0X18) ++#define ISCSI_KCQE_OPCODE_TCP_ERROR (0x19) ++#define ISCSI_KCQE_OPCODE_CQ_EVENT_NOTIFICATION (0x20) ++#define ISCSI_KCQE_OPCODE_ISCSI_ERROR (0x21) ++ ++/* KCQ (kernel completion queue) completion status */ ++#define ISCSI_KCQE_COMPLETION_STATUS_SUCCESS (0x0) ++#define ISCSI_KCQE_COMPLETION_STATUS_INVALID_OPCODE (0x1) ++#define ISCSI_KCQE_COMPLETION_STATUS_CTX_ALLOC_FAILURE (0x2) ++#define ISCSI_KCQE_COMPLETION_STATUS_CTX_FREE_FAILURE (0x3) ++#define ISCSI_KCQE_COMPLETION_STATUS_NIC_ERROR (0x4) ++ ++#define ISCSI_KCQE_COMPLETION_STATUS_HDR_DIG_ERR (0x5) ++#define ISCSI_KCQE_COMPLETION_STATUS_DATA_DIG_ERR (0x6) ++ ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_UNEXPECTED_OPCODE (0xa) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_OPCODE (0xb) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_AHS_LEN (0xc) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_ITT (0xd) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_STATSN (0xe) ++ ++/* Response */ ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_EXP_DATASN (0xf) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_PEND_R2T (0x10) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_DATA_SEG_LEN_IS_ZERO (0x2c) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_DATA_SEG_LEN_TOO_BIG (0x2d) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_O_U_0 (0x11) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_O_U_1 (0x12) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_O_U_2 (0x13) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_O_U_3 (0x14) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_O_U_4 (0x15) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_O_U_5 (0x16) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_O_U_6 (0x17) ++ ++/* Data-In */ ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_REMAIN_RCV_LEN (0x18) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_MAX_RCV_PDU_LEN (0x19) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_F_BIT_ZERO (0x1a) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_TTT_NOT_RSRV (0x1b) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_DATASN (0x1c) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_REMAIN_BURST_LEN (0x1d) ++ ++/* R2T */ ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_BUFFER_OFF (0x1f) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_LUN (0x20) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_R2TSN (0x21) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_DESIRED_DATA_TRNS_LEN_0 (0x22) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_DESIRED_DATA_TRNS_LEN_1 (0x23) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_PEND_R2T_EXCEED (0x24) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_TTT_IS_RSRV (0x25) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_MAX_BURST_LEN (0x26) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_DATA_SEG_LEN_NOT_ZERO (0x27) ++ ++/* TMF */ ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_REJECT_PDU_LEN (0x28) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_ASYNC_PDU_LEN (0x29) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_NOPIN_PDU_LEN (0x2a) ++#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_PEND_R2T_IN_CLEANUP (0x2b) ++ ++/* IP/TCP processing errors: */ ++#define ISCI_KCQE_COMPLETION_STATUS_TCP_ERROR_IP_FRAGMENT (0x40) ++#define ISCI_KCQE_COMPLETION_STATUS_TCP_ERROR_IP_OPTIONS (0x41) ++#define ISCI_KCQE_COMPLETION_STATUS_TCP_ERROR_URGENT_FLAG (0x42) ++#define ISCI_KCQE_COMPLETION_STATUS_TCP_ERROR_MAX_RTRANS (0x43) ++ ++/* iSCSI licensing errors */ ++/* general iSCSI license not installed */ ++#define ISCSI_KCQE_COMPLETION_STATUS_ISCSI_NOT_SUPPORTED (0x50) ++/* additional LOM specific iSCSI license not installed */ ++#define ISCSI_KCQE_COMPLETION_STATUS_LOM_ISCSI_NOT_ENABLED (0x51) ++ ++/* SQ/RQ/CQ DB structure sizes */ ++#define ISCSI_SQ_DB_SIZE (16) ++#define ISCSI_RQ_DB_SIZE (16) ++#define ISCSI_CQ_DB_SIZE (80) ++ ++#define ISCSI_SQN_TO_NOTIFY_NOT_VALID 0xFFFF ++ ++/* Page size codes (for flags field in connection offload request) */ ++#define ISCSI_PAGE_SIZE_256 (0) ++#define ISCSI_PAGE_SIZE_512 (1) ++#define ISCSI_PAGE_SIZE_1K (2) ++#define ISCSI_PAGE_SIZE_2K (3) ++#define ISCSI_PAGE_SIZE_4K (4) ++#define ISCSI_PAGE_SIZE_8K (5) ++#define ISCSI_PAGE_SIZE_16K (6) ++#define ISCSI_PAGE_SIZE_32K (7) ++#define ISCSI_PAGE_SIZE_64K (8) ++#define ISCSI_PAGE_SIZE_128K (9) ++#define ISCSI_PAGE_SIZE_256K (10) ++#define ISCSI_PAGE_SIZE_512K (11) ++#define ISCSI_PAGE_SIZE_1M (12) ++#define ISCSI_PAGE_SIZE_2M (13) ++#define ISCSI_PAGE_SIZE_4M (14) ++#define ISCSI_PAGE_SIZE_8M (15) ++ ++/* Iscsi PDU related defines */ ++#define ISCSI_HEADER_SIZE (48) ++#define ISCSI_DIGEST_SHIFT (2) ++#define ISCSI_DIGEST_SIZE (4) ++ ++#define B577XX_ISCSI_CONNECTION_TYPE 3 ++ ++#endif /*__57XX_ISCSI_CONSTANTS_H_ */ +diff -r 14194bd97e8c drivers/scsi/bnx2i/57xx_iscsi_hsi.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/scsi/bnx2i/57xx_iscsi_hsi.h Tue Jun 16 11:09:42 2009 +0100 +@@ -0,0 +1,1524 @@ ++/* 57xx_iscsi_hsi.h: Broadcom NetXtreme II iSCSI driver. ++ * ++ * Copyright (c) 2006 - 2009 Broadcom Corporation ++ * ++ * 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. ++ */ ++#ifndef __57XX_ISCSI_HSI_LINUX_LE__ ++#define __57XX_ISCSI_HSI_LINUX_LE__ ++ ++/* ++ * iSCSI Async CQE ++ */ ++struct iscsi_async_msg { ++#if defined(__BIG_ENDIAN) ++ u8 op_code; ++ u8 reserved1; ++ u16 reserved0; ++#elif defined(__LITTLE_ENDIAN) ++ u16 reserved0; ++ u8 reserved1; ++ u8 op_code; ++#endif ++ u32 reserved2; ++ u32 exp_cmd_sn; ++ u32 max_cmd_sn; ++ u32 reserved3[2]; ++#if defined(__BIG_ENDIAN) ++ u16 reserved5; ++ u8 err_code; ++ u8 reserved4; ++#elif defined(__LITTLE_ENDIAN) ++ u8 reserved4; ++ u8 err_code; ++ u16 reserved5; ++#endif ++ u32 reserved6; ++ u32 lun[2]; ++#if defined(__BIG_ENDIAN) ++ u8 async_event; ++ u8 async_vcode; ++ u16 param1; ++#elif defined(__LITTLE_ENDIAN) ++ u16 param1; ++ u8 async_vcode; ++ u8 async_event; ++#endif ++#if defined(__BIG_ENDIAN) ++ u16 param2; ++ u16 param3; ++#elif defined(__LITTLE_ENDIAN) ++ u16 param3; ++ u16 param2; ++#endif ++ u32 reserved7[3]; ++ u32 cq_req_sn; ++}; ++ ++ ++/* ++ * iSCSI Buffer Descriptor (BD) ++ */ ++struct iscsi_bd { ++ u32 buffer_addr_hi; ++ u32 buffer_addr_lo; ++#if defined(__BIG_ENDIAN) ++ u16 reserved0; ++ u16 buffer_length; ++#elif defined(__LITTLE_ENDIAN) ++ u16 buffer_length; ++ u16 reserved0; ++#endif ++#if defined(__BIG_ENDIAN) ++ u16 reserved3; ++ u16 flags; ++#define ISCSI_BD_RESERVED1 (0x3F<<0) ++#define ISCSI_BD_RESERVED1_SHIFT 0 ++#define ISCSI_BD_LAST_IN_BD_CHAIN (0x1<<6) ++#define ISCSI_BD_LAST_IN_BD_CHAIN_SHIFT 6 ++#define ISCSI_BD_FIRST_IN_BD_CHAIN (0x1<<7) ++#define ISCSI_BD_FIRST_IN_BD_CHAIN_SHIFT 7 ++#define ISCSI_BD_RESERVED2 (0xFF<<8) ++#define ISCSI_BD_RESERVED2_SHIFT 8 ++#elif defined(__LITTLE_ENDIAN) ++ u16 flags; ++#define ISCSI_BD_RESERVED1 (0x3F<<0) ++#define ISCSI_BD_RESERVED1_SHIFT 0 ++#define ISCSI_BD_LAST_IN_BD_CHAIN (0x1<<6) ++#define ISCSI_BD_LAST_IN_BD_CHAIN_SHIFT 6 ++#define ISCSI_BD_FIRST_IN_BD_CHAIN (0x1<<7) ++#define ISCSI_BD_FIRST_IN_BD_CHAIN_SHIFT 7 ++#define ISCSI_BD_RESERVED2 (0xFF<<8) ++#define ISCSI_BD_RESERVED2_SHIFT 8 ++ u16 reserved3; ++#endif ++}; ++ ++ ++/* ++ * iSCSI Cleanup SQ WQE ++ */ ++struct iscsi_cleanup_request { ++#if defined(__BIG_ENDIAN) ++ u8 op_code; ++ u8 reserved1; ++ u16 reserved0; ++#elif defined(__LITTLE_ENDIAN) ++ u16 reserved0; ++ u8 reserved1; ++ u8 op_code; ++#endif ++ u32 reserved2[3]; ++#if defined(__BIG_ENDIAN) ++ u16 reserved3; ++ u16 itt; ++#define ISCSI_CLEANUP_REQUEST_INDEX (0x3FFF<<0) ++#define ISCSI_CLEANUP_REQUEST_INDEX_SHIFT 0 ++#define ISCSI_CLEANUP_REQUEST_TYPE (0x3<<14) ++#define ISCSI_CLEANUP_REQUEST_TYPE_SHIFT 14 ++#elif defined(__LITTLE_ENDIAN) ++ u16 itt; ++#define ISCSI_CLEANUP_REQUEST_INDEX (0x3FFF<<0) ++#define ISCSI_CLEANUP_REQUEST_INDEX_SHIFT 0 ++#define ISCSI_CLEANUP_REQUEST_TYPE (0x3<<14) ++#define ISCSI_CLEANUP_REQUEST_TYPE_SHIFT 14 ++ u16 reserved3; ++#endif ++ u32 reserved4[10]; ++#if defined(__BIG_ENDIAN) ++ u8 cq_index; ++ u8 reserved6; ++ u16 reserved5; ++#elif defined(__LITTLE_ENDIAN) ++ u16 reserved5; ++ u8 reserved6; ++ u8 cq_index; ++#endif ++}; ++ ++ ++/* ++ * iSCSI Cleanup CQE ++ */ ++struct iscsi_cleanup_response { ++#if defined(__BIG_ENDIAN) ++ u8 op_code; ++ u8 status; ++ u16 reserved0; ++#elif defined(__LITTLE_ENDIAN) ++ u16 reserved0; ++ u8 status; ++ u8 op_code; ++#endif ++ u32 reserved1[3]; ++ u32 reserved2[2]; ++#if defined(__BIG_ENDIAN) ++ u16 reserved4; ++ u8 err_code; ++ u8 reserved3; ++#elif defined(__LITTLE_ENDIAN) ++ u8 reserved3; ++ u8 err_code; ++ u16 reserved4; ++#endif ++ u32 reserved5[7]; ++#if defined(__BIG_ENDIAN) ++ u16 reserved6; ++ u16 itt; ++#define ISCSI_CLEANUP_RESPONSE_INDEX (0x3FFF<<0) ++#define ISCSI_CLEANUP_RESPONSE_INDEX_SHIFT 0 ++#define ISCSI_CLEANUP_RESPONSE_TYPE (0x3<<14) ++#define ISCSI_CLEANUP_RESPONSE_TYPE_SHIFT 14 ++#elif defined(__LITTLE_ENDIAN) ++ u16 itt; ++#define ISCSI_CLEANUP_RESPONSE_INDEX (0x3FFF<<0) ++#define ISCSI_CLEANUP_RESPONSE_INDEX_SHIFT 0 ++#define ISCSI_CLEANUP_RESPONSE_TYPE (0x3<<14) ++#define ISCSI_CLEANUP_RESPONSE_TYPE_SHIFT 14 ++ u16 reserved6; ++#endif ++ u32 cq_req_sn; ++}; ++ ++ ++/* ++ * SCSI read/write SQ WQE ++ */ ++struct iscsi_cmd_request { ++#if defined(__BIG_ENDIAN) ++ u8 op_code; ++ u8 op_attr; ++#define ISCSI_CMD_REQUEST_TASK_ATTR (0x7<<0) ++#define ISCSI_CMD_REQUEST_TASK_ATTR_SHIFT 0 ++#define ISCSI_CMD_REQUEST_RESERVED1 (0x3<<3) ++#define ISCSI_CMD_REQUEST_RESERVED1_SHIFT 3 ++#define ISCSI_CMD_REQUEST_WRITE (0x1<<5) ++#define ISCSI_CMD_REQUEST_WRITE_SHIFT 5 ++#define ISCSI_CMD_REQUEST_READ (0x1<<6) ++#define ISCSI_CMD_REQUEST_READ_SHIFT 6 ++#define ISCSI_CMD_REQUEST_FINAL (0x1<<7) ++#define ISCSI_CMD_REQUEST_FINAL_SHIFT 7 ++ u16 reserved0; ++#elif defined(__LITTLE_ENDIAN) ++ u16 reserved0; ++ u8 op_attr; ++#define ISCSI_CMD_REQUEST_TASK_ATTR (0x7<<0) ++#define ISCSI_CMD_REQUEST_TASK_ATTR_SHIFT 0 ++#define ISCSI_CMD_REQUEST_RESERVED1 (0x3<<3) ++#define ISCSI_CMD_REQUEST_RESERVED1_SHIFT 3 ++#define ISCSI_CMD_REQUEST_WRITE (0x1<<5) ++#define ISCSI_CMD_REQUEST_WRITE_SHIFT 5 ++#define ISCSI_CMD_REQUEST_READ (0x1<<6) ++#define ISCSI_CMD_REQUEST_READ_SHIFT 6 ++#define ISCSI_CMD_REQUEST_FINAL (0x1<<7) ++#define ISCSI_CMD_REQUEST_FINAL_SHIFT 7 ++ u8 op_code; ++#endif ++#if defined(__BIG_ENDIAN) ++ u16 ud_buffer_offset; ++ u16 sd_buffer_offset; ++#elif defined(__LITTLE_ENDIAN) ++ u16 sd_buffer_offset; ++ u16 ud_buffer_offset; ++#endif ++ u32 lun[2]; ++#if defined(__BIG_ENDIAN) ++ u16 reserved2; ++ u16 itt; ++#define ISCSI_CMD_REQUEST_INDEX (0x3FFF<<0) ++#define ISCSI_CMD_REQUEST_INDEX_SHIFT 0 ++#define ISCSI_CMD_REQUEST_TYPE (0x3<<14) ++#define ISCSI_CMD_REQUEST_TYPE_SHIFT 14 ++#elif defined(__LITTLE_ENDIAN) ++ u16 itt; ++#define ISCSI_CMD_REQUEST_INDEX (0x3FFF<<0) ++#define ISCSI_CMD_REQUEST_INDEX_SHIFT 0 ++#define ISCSI_CMD_REQUEST_TYPE (0x3<<14) ++#define ISCSI_CMD_REQUEST_TYPE_SHIFT 14 ++ u16 reserved2; ++#endif ++ u32 total_data_transfer_length; ++ u32 cmd_sn; ++ u32 reserved3; ++ u32 cdb[4]; ++ u32 zero_fill; ++ u32 bd_list_addr_lo; ++ u32 bd_list_addr_hi; ++#if defined(__BIG_ENDIAN) ++ u8 cq_index; ++ u8 sd_start_bd_index; ++ u8 ud_start_bd_index; ++ u8 num_bds; ++#elif defined(__LITTLE_ENDIAN) ++ u8 num_bds; ++ u8 ud_start_bd_index; ++ u8 sd_start_bd_index; ++ u8 cq_index; ++#endif ++}; ++ ++ ++/* ++ * task statistics for write response ++ */ ++struct iscsi_write_resp_task_stat { ++ u32 num_data_ins; ++}; ++ ++/* ++ * task statistics for read response ++ */ ++struct iscsi_read_resp_task_stat { ++#if defined(__BIG_ENDIAN) ++ u16 num_data_outs; ++ u16 num_r2ts; ++#elif defined(__LITTLE_ENDIAN) ++ u16 num_r2ts; ++ u16 num_data_outs; ++#endif ++}; ++ ++/* ++ * task statistics for iSCSI cmd response ++ */ ++union iscsi_cmd_resp_task_stat { ++ struct iscsi_write_resp_task_stat write_stat; ++ struct iscsi_read_resp_task_stat read_stat; ++}; ++ ++/* ++ * SCSI Command CQE ++ */ ++struct iscsi_cmd_response { ++#if defined(__BIG_ENDIAN) ++ u8 op_code; ++ u8 response_flags; ++#define ISCSI_CMD_RESPONSE_RESERVED0 (0x1<<0) ++#define ISCSI_CMD_RESPONSE_RESERVED0_SHIFT 0 ++#define ISCSI_CMD_RESPONSE_RESIDUAL_UNDERFLOW (0x1<<1) ++#define ISCSI_CMD_RESPONSE_RESIDUAL_UNDERFLOW_SHIFT 1 ++#define ISCSI_CMD_RESPONSE_RESIDUAL_OVERFLOW (0x1<<2) ++#define ISCSI_CMD_RESPONSE_RESIDUAL_OVERFLOW_SHIFT 2 ++#define ISCSI_CMD_RESPONSE_BR_RESIDUAL_UNDERFLOW (0x1<<3) ++#define ISCSI_CMD_RESPONSE_BR_RESIDUAL_UNDERFLOW_SHIFT 3 ++#define ISCSI_CMD_RESPONSE_BR_RESIDUAL_OVERFLOW (0x1<<4) ++#define ISCSI_CMD_RESPONSE_BR_RESIDUAL_OVERFLOW_SHIFT 4 ++#define ISCSI_CMD_RESPONSE_RESERVED1 (0x7<<5) ++#define ISCSI_CMD_RESPONSE_RESERVED1_SHIFT 5 ++ u8 response; ++ u8 status; ++#elif defined(__LITTLE_ENDIAN) ++ u8 status; ++ u8 response; ++ u8 response_flags; ++#define ISCSI_CMD_RESPONSE_RESERVED0 (0x1<<0) ++#define ISCSI_CMD_RESPONSE_RESERVED0_SHIFT 0 ++#define ISCSI_CMD_RESPONSE_RESIDUAL_UNDERFLOW (0x1<<1) ++#define ISCSI_CMD_RESPONSE_RESIDUAL_UNDERFLOW_SHIFT 1 ++#define ISCSI_CMD_RESPONSE_RESIDUAL_OVERFLOW (0x1<<2) ++#define ISCSI_CMD_RESPONSE_RESIDUAL_OVERFLOW_SHIFT 2 ++#define ISCSI_CMD_RESPONSE_BR_RESIDUAL_UNDERFLOW (0x1<<3) ++#define ISCSI_CMD_RESPONSE_BR_RESIDUAL_UNDERFLOW_SHIFT 3 ++#define ISCSI_CMD_RESPONSE_BR_RESIDUAL_OVERFLOW (0x1<<4) ++#define ISCSI_CMD_RESPONSE_BR_RESIDUAL_OVERFLOW_SHIFT 4 ++#define ISCSI_CMD_RESPONSE_RESERVED1 (0x7<<5) ++#define ISCSI_CMD_RESPONSE_RESERVED1_SHIFT 5 ++ u8 op_code; ++#endif ++ u32 data_length; ++ u32 exp_cmd_sn; ++ u32 max_cmd_sn; ++ u32 reserved2; ++ u32 residual_count; ++#if defined(__BIG_ENDIAN) ++ u16 reserved4; ++ u8 err_code; ++ u8 reserved3; ++#elif defined(__LITTLE_ENDIAN) ++ u8 reserved3; ++ u8 err_code; ++ u16 reserved4; ++#endif ++ u32 reserved5[5]; ++ union iscsi_cmd_resp_task_stat task_stat; ++ u32 reserved6; ++#if defined(__BIG_ENDIAN) ++ u16 reserved7; ++ u16 itt; ++#define ISCSI_CMD_RESPONSE_INDEX (0x3FFF<<0) ++#define ISCSI_CMD_RESPONSE_INDEX_SHIFT 0 ++#define ISCSI_CMD_RESPONSE_TYPE (0x3<<14) ++#define ISCSI_CMD_RESPONSE_TYPE_SHIFT 14 ++#elif defined(__LITTLE_ENDIAN) ++ u16 itt; ++#define ISCSI_CMD_RESPONSE_INDEX (0x3FFF<<0) ++#define ISCSI_CMD_RESPONSE_INDEX_SHIFT 0 ++#define ISCSI_CMD_RESPONSE_TYPE (0x3<<14) ++#define ISCSI_CMD_RESPONSE_TYPE_SHIFT 14 ++ u16 reserved7; ++#endif ++ u32 cq_req_sn; ++}; ++ ++ ++ ++/* ++ * firmware middle-path request SQ WQE ++ */ ++struct iscsi_fw_mp_request { ++#if defined(__BIG_ENDIAN) ++ u8 op_code; ++ u8 op_attr; ++ u16 hdr_opaque1; ++#elif defined(__LITTLE_ENDIAN) ++ u16 hdr_opaque1; ++ u8 op_attr; ++ u8 op_code; ++#endif ++ u32 data_length; ++ u32 hdr_opaque2[2]; ++#if defined(__BIG_ENDIAN) ++ u16 reserved0; ++ u16 itt; ++#define ISCSI_FW_MP_REQUEST_INDEX (0x3FFF<<0) ++#define ISCSI_FW_MP_REQUEST_INDEX_SHIFT 0 ++#define ISCSI_FW_MP_REQUEST_TYPE (0x3<<14) ++#define ISCSI_FW_MP_REQUEST_TYPE_SHIFT 14 ++#elif defined(__LITTLE_ENDIAN) ++ u16 itt; ++#define ISCSI_FW_MP_REQUEST_INDEX (0x3FFF<<0) ++#define ISCSI_FW_MP_REQUEST_INDEX_SHIFT 0 ++#define ISCSI_FW_MP_REQUEST_TYPE (0x3<<14) ++#define ISCSI_FW_MP_REQUEST_TYPE_SHIFT 14 ++ u16 reserved0; ++#endif ++ u32 hdr_opaque3[4]; ++ u32 resp_bd_list_addr_lo; ++ u32 resp_bd_list_addr_hi; ++ u32 resp_buffer; ++#define ISCSI_FW_MP_REQUEST_RESP_BUFFER_LENGTH (0xFFFFFF<<0) ++#define ISCSI_FW_MP_REQUEST_RESP_BUFFER_LENGTH_SHIFT 0 ++#define ISCSI_FW_MP_REQUEST_NUM_RESP_BDS (0xFF<<24) ++#define ISCSI_FW_MP_REQUEST_NUM_RESP_BDS_SHIFT 24 ++#if defined(__BIG_ENDIAN) ++ u16 reserved4; ++ u8 reserved3; ++ u8 flags; ++#define ISCSI_FW_MP_REQUEST_RESERVED1 (0x1<<0) ++#define ISCSI_FW_MP_REQUEST_RESERVED1_SHIFT 0 ++#define ISCSI_FW_MP_REQUEST_LOCAL_COMPLETION (0x1<<1) ++#define ISCSI_FW_MP_REQUEST_LOCAL_COMPLETION_SHIFT 1 ++#define ISCSI_FW_MP_REQUEST_UPDATE_EXP_STAT_SN (0x1<<2) ++#define ISCSI_FW_MP_REQUEST_UPDATE_EXP_STAT_SN_SHIFT 2 ++#define ISCSI_FW_MP_REQUEST_RESERVED2 (0x1F<<3) ++#define ISCSI_FW_MP_REQUEST_RESERVED2_SHIFT 3 ++#elif defined(__LITTLE_ENDIAN) ++ u8 flags; ++#define ISCSI_FW_MP_REQUEST_RESERVED1 (0x1<<0) ++#define ISCSI_FW_MP_REQUEST_RESERVED1_SHIFT 0 ++#define ISCSI_FW_MP_REQUEST_LOCAL_COMPLETION (0x1<<1) ++#define ISCSI_FW_MP_REQUEST_LOCAL_COMPLETION_SHIFT 1 ++#define ISCSI_FW_MP_REQUEST_UPDATE_EXP_STAT_SN (0x1<<2) ++#define ISCSI_FW_MP_REQUEST_UPDATE_EXP_STAT_SN_SHIFT 2 ++#define ISCSI_FW_MP_REQUEST_RESERVED2 (0x1F<<3) ++#define ISCSI_FW_MP_REQUEST_RESERVED2_SHIFT 3 ++ u8 reserved3; ++ u16 reserved4; ++#endif ++ u32 bd_list_addr_lo; ++ u32 bd_list_addr_hi; ++#if defined(__BIG_ENDIAN) ++ u8 cq_index; ++ u8 reserved6; ++ u8 reserved5; ++ u8 num_bds; ++#elif defined(__LITTLE_ENDIAN) ++ u8 num_bds; ++ u8 reserved5; ++ u8 reserved6; ++ u8 cq_index; ++#endif ++}; ++ ++ ++/* ++ * firmware response - CQE: used only by firmware ++ */ ++struct iscsi_fw_response { ++ u32 hdr_dword1[2]; ++ u32 hdr_exp_cmd_sn; ++ u32 hdr_max_cmd_sn; ++ u32 hdr_ttt; ++ u32 hdr_res_cnt; ++ u32 cqe_flags; ++#define ISCSI_FW_RESPONSE_RESERVED2 (0xFF<<0) ++#define ISCSI_FW_RESPONSE_RESERVED2_SHIFT 0 ++#define ISCSI_FW_RESPONSE_ERR_CODE (0xFF<<8) ++#define ISCSI_FW_RESPONSE_ERR_CODE_SHIFT 8 ++#define ISCSI_FW_RESPONSE_RESERVED3 (0xFFFF<<16) ++#define ISCSI_FW_RESPONSE_RESERVED3_SHIFT 16 ++ u32 stat_sn; ++ u32 hdr_dword2[2]; ++ u32 hdr_dword3[2]; ++ u32 task_stat; ++ u32 reserved0; ++ u32 hdr_itt; ++ u32 cq_req_sn; ++}; ++ ++ ++/* ++ * iSCSI KCQ CQE parameters ++ */ ++union iscsi_kcqe_params { ++ u32 reserved0[4]; ++}; ++ ++/* ++ * iSCSI KCQ CQE ++ */ ++struct iscsi_kcqe { ++ u32 iscsi_conn_id; ++ u32 completion_status; ++ u32 iscsi_conn_context_id; ++ union iscsi_kcqe_params params; ++#if defined(__BIG_ENDIAN) ++ u8 flags; ++#define ISCSI_KCQE_RESERVED0 (0xF<<0) ++#define ISCSI_KCQE_RESERVED0_SHIFT 0 ++#define ISCSI_KCQE_LAYER_CODE (0x7<<4) ++#define ISCSI_KCQE_LAYER_CODE_SHIFT 4 ++#define ISCSI_KCQE_RESERVED1 (0x1<<7) ++#define ISCSI_KCQE_RESERVED1_SHIFT 7 ++ u8 op_code; ++ u16 qe_self_seq; ++#elif defined(__LITTLE_ENDIAN) ++ u16 qe_self_seq; ++ u8 op_code; ++ u8 flags; ++#define ISCSI_KCQE_RESERVED0 (0xF<<0) ++#define ISCSI_KCQE_RESERVED0_SHIFT 0 ++#define ISCSI_KCQE_LAYER_CODE (0x7<<4) ++#define ISCSI_KCQE_LAYER_CODE_SHIFT 4 ++#define ISCSI_KCQE_RESERVED1 (0x1<<7) ++#define ISCSI_KCQE_RESERVED1_SHIFT 7 ++#endif ++}; ++ ++ ++ ++/* ++ * iSCSI KWQE header ++ */ ++struct iscsi_kwqe_header { ++#if defined(__BIG_ENDIAN) ++ u8 flags; ++#define ISCSI_KWQE_HEADER_RESERVED0 (0xF<<0) ++#define ISCSI_KWQE_HEADER_RESERVED0_SHIFT 0 ++#define ISCSI_KWQE_HEADER_LAYER_CODE (0x7<<4) ++#define ISCSI_KWQE_HEADER_LAYER_CODE_SHIFT 4 ++#define ISCSI_KWQE_HEADER_RESERVED1 (0x1<<7) ++#define ISCSI_KWQE_HEADER_RESERVED1_SHIFT 7 ++ u8 op_code; ++#elif defined(__LITTLE_ENDIAN) ++ u8 op_code; ++ u8 flags; ++#define ISCSI_KWQE_HEADER_RESERVED0 (0xF<<0) ++#define ISCSI_KWQE_HEADER_RESERVED0_SHIFT 0 ++#define ISCSI_KWQE_HEADER_LAYER_CODE (0x7<<4) ++#define ISCSI_KWQE_HEADER_LAYER_CODE_SHIFT 4 ++#define ISCSI_KWQE_HEADER_RESERVED1 (0x1<<7) ++#define ISCSI_KWQE_HEADER_RESERVED1_SHIFT 7 ++#endif ++}; ++ ++/* ++ * iSCSI firmware init request 1 ++ */ ++struct iscsi_kwqe_init1 { ++#if defined(__BIG_ENDIAN) ++ struct iscsi_kwqe_header hdr; ++ u8 reserved0; ++ u8 num_cqs; ++#elif defined(__LITTLE_ENDIAN) ++ u8 num_cqs; ++ u8 reserved0; ++ struct iscsi_kwqe_header hdr; ++#endif ++ u32 dummy_buffer_addr_lo; ++ u32 dummy_buffer_addr_hi; ++#if defined(__BIG_ENDIAN) ++ u16 num_ccells_per_conn; ++ u16 num_tasks_per_conn; ++#elif defined(__LITTLE_ENDIAN) ++ u16 num_tasks_per_conn; ++ u16 num_ccells_per_conn; ++#endif ++#if defined(__BIG_ENDIAN) ++ u16 sq_wqes_per_page; ++ u16 sq_num_wqes; ++#elif defined(__LITTLE_ENDIAN) ++ u16 sq_num_wqes; ++ u16 sq_wqes_per_page; ++#endif ++#if defined(__BIG_ENDIAN) ++ u8 cq_log_wqes_per_page; ++ u8 flags; ++#define ISCSI_KWQE_INIT1_PAGE_SIZE (0xF<<0) ++#define ISCSI_KWQE_INIT1_PAGE_SIZE_SHIFT 0 ++#define ISCSI_KWQE_INIT1_DELAYED_ACK_ENABLE (0x1<<4) ++#define ISCSI_KWQE_INIT1_DELAYED_ACK_ENABLE_SHIFT 4 ++#define ISCSI_KWQE_INIT1_KEEP_ALIVE_ENABLE (0x1<<5) ++#define ISCSI_KWQE_INIT1_KEEP_ALIVE_ENABLE_SHIFT 5 ++#define ISCSI_KWQE_INIT1_RESERVED1 (0x3<<6) ++#define ISCSI_KWQE_INIT1_RESERVED1_SHIFT 6 ++ u16 cq_num_wqes; ++#elif defined(__LITTLE_ENDIAN) ++ u16 cq_num_wqes; ++ u8 flags; ++#define ISCSI_KWQE_INIT1_PAGE_SIZE (0xF<<0) ++#define ISCSI_KWQE_INIT1_PAGE_SIZE_SHIFT 0 ++#define ISCSI_KWQE_INIT1_DELAYED_ACK_ENABLE (0x1<<4) ++#define ISCSI_KWQE_INIT1_DELAYED_ACK_ENABLE_SHIFT 4 ++#define ISCSI_KWQE_INIT1_KEEP_ALIVE_ENABLE (0x1<<5) ++#define ISCSI_KWQE_INIT1_KEEP_ALIVE_ENABLE_SHIFT 5 ++#define ISCSI_KWQE_INIT1_RESERVED1 (0x3<<6) ++#define ISCSI_KWQE_INIT1_RESERVED1_SHIFT 6 ++ u8 cq_log_wqes_per_page; ++#endif ++#if defined(__BIG_ENDIAN) ++ u16 cq_num_pages; ++ u16 sq_num_pages; ++#elif defined(__LITTLE_ENDIAN) ++ u16 sq_num_pages; ++ u16 cq_num_pages; ++#endif ++#if defined(__BIG_ENDIAN) ++ u16 rq_buffer_size; ++ u16 rq_num_wqes; ++#elif defined(__LITTLE_ENDIAN) ++ u16 rq_num_wqes; ++ u16 rq_buffer_size; ++#endif ++}; ++ ++/* ++ * iSCSI firmware init request 2 ++ */ ++struct iscsi_kwqe_init2 { ++#if defined(__BIG_ENDIAN) ++ struct iscsi_kwqe_header hdr; ++ u16 max_cq_sqn; ++#elif defined(__LITTLE_ENDIAN) ++ u16 max_cq_sqn; ++ struct iscsi_kwqe_header hdr; ++#endif ++ u32 error_bit_map[2]; ++ u32 reserved1[5]; ++}; ++ ++/* ++ * Initial iSCSI connection offload request 1 ++ */ ++struct iscsi_kwqe_conn_offload1 { ++#if defined(__BIG_ENDIAN) ++ struct iscsi_kwqe_header hdr; ++ u16 iscsi_conn_id; ++#elif defined(__LITTLE_ENDIAN) ++ u16 iscsi_conn_id; ++ struct iscsi_kwqe_header hdr; ++#endif ++ u32 sq_page_table_addr_lo; ++ u32 sq_page_table_addr_hi; ++ u32 cq_page_table_addr_lo; ++ u32 cq_page_table_addr_hi; ++ u32 reserved0[3]; ++}; ++ ++/* ++ * iSCSI Page Table Entry (PTE) ++ */ ++struct iscsi_pte { ++ u32 hi; ++ u32 lo; ++}; ++ ++/* ++ * Initial iSCSI connection offload request 2 ++ */ ++struct iscsi_kwqe_conn_offload2 { ++#if defined(__BIG_ENDIAN) ++ struct iscsi_kwqe_header hdr; ++ u16 reserved0; ++#elif defined(__LITTLE_ENDIAN) ++ u16 reserved0; ++ struct iscsi_kwqe_header hdr; ++#endif ++ u32 rq_page_table_addr_lo; ++ u32 rq_page_table_addr_hi; ++ struct iscsi_pte sq_first_pte; ++ struct iscsi_pte cq_first_pte; ++ u32 num_additional_wqes; ++}; ++ ++ ++/* ++ * Initial iSCSI connection offload request 3 ++ */ ++struct iscsi_kwqe_conn_offload3 { ++#if defined(__BIG_ENDIAN) ++ struct iscsi_kwqe_header hdr; ++ u16 reserved0; ++#elif defined(__LITTLE_ENDIAN) ++ u16 reserved0; ++ struct iscsi_kwqe_header hdr; ++#endif ++ u32 reserved1; ++ struct iscsi_pte qp_first_pte[3]; ++}; ++ ++ ++/* ++ * iSCSI connection update request ++ */ ++struct iscsi_kwqe_conn_update { ++#if defined(__BIG_ENDIAN) ++ struct iscsi_kwqe_header hdr; ++ u16 reserved0; ++#elif defined(__LITTLE_ENDIAN) ++ u16 reserved0; ++ struct iscsi_kwqe_header hdr; ++#endif ++#if defined(__BIG_ENDIAN) ++ u8 session_error_recovery_level; ++ u8 max_outstanding_r2ts; ++ u8 reserved2; ++ u8 conn_flags; ++#define ISCSI_KWQE_CONN_UPDATE_HEADER_DIGEST (0x1<<0) ++#define ISCSI_KWQE_CONN_UPDATE_HEADER_DIGEST_SHIFT 0 ++#define ISCSI_KWQE_CONN_UPDATE_DATA_DIGEST (0x1<<1) ++#define ISCSI_KWQE_CONN_UPDATE_DATA_DIGEST_SHIFT 1 ++#define ISCSI_KWQE_CONN_UPDATE_INITIAL_R2T (0x1<<2) ++#define ISCSI_KWQE_CONN_UPDATE_INITIAL_R2T_SHIFT 2 ++#define ISCSI_KWQE_CONN_UPDATE_IMMEDIATE_DATA (0x1<<3) ++#define ISCSI_KWQE_CONN_UPDATE_IMMEDIATE_DATA_SHIFT 3 ++#define ISCSI_KWQE_CONN_UPDATE_RESERVED1 (0xF<<4) ++#define ISCSI_KWQE_CONN_UPDATE_RESERVED1_SHIFT 4 ++#elif defined(__LITTLE_ENDIAN) ++ u8 conn_flags; ++#define ISCSI_KWQE_CONN_UPDATE_HEADER_DIGEST (0x1<<0) ++#define ISCSI_KWQE_CONN_UPDATE_HEADER_DIGEST_SHIFT 0 ++#define ISCSI_KWQE_CONN_UPDATE_DATA_DIGEST (0x1<<1) ++#define ISCSI_KWQE_CONN_UPDATE_DATA_DIGEST_SHIFT 1 ++#define ISCSI_KWQE_CONN_UPDATE_INITIAL_R2T (0x1<<2) ++#define ISCSI_KWQE_CONN_UPDATE_INITIAL_R2T_SHIFT 2 ++#define ISCSI_KWQE_CONN_UPDATE_IMMEDIATE_DATA (0x1<<3) ++#define ISCSI_KWQE_CONN_UPDATE_IMMEDIATE_DATA_SHIFT 3 ++#define ISCSI_KWQE_CONN_UPDATE_RESERVED1 (0xF<<4) ++#define ISCSI_KWQE_CONN_UPDATE_RESERVED1_SHIFT 4 ++ u8 reserved2; ++ u8 max_outstanding_r2ts; ++ u8 session_error_recovery_level; ++#endif ++ u32 context_id; ++ u32 max_send_pdu_length; ++ u32 max_recv_pdu_length; ++ u32 first_burst_length; ++ u32 max_burst_length; ++ u32 exp_stat_sn; ++}; ++ ++/* ++ * iSCSI destroy connection request ++ */ ++struct iscsi_kwqe_conn_destroy { ++#if defined(__BIG_ENDIAN) ++ struct iscsi_kwqe_header hdr; ++ u16 reserved0; ++#elif defined(__LITTLE_ENDIAN) ++ u16 reserved0; ++ struct iscsi_kwqe_header hdr; ++#endif ++ u32 context_id; ++ u32 reserved1[6]; ++}; ++ ++/* ++ * iSCSI KWQ WQE ++ */ ++union iscsi_kwqe { ++ struct iscsi_kwqe_init1 init1; ++ struct iscsi_kwqe_init2 init2; ++ struct iscsi_kwqe_conn_offload1 conn_offload1; ++ struct iscsi_kwqe_conn_offload2 conn_offload2; ++ struct iscsi_kwqe_conn_update conn_update; ++ struct iscsi_kwqe_conn_destroy conn_destroy; ++}; ++ ++ ++ ++ ++ ++ ++ ++ ++ ++/* ++ * iSCSI Login SQ WQE ++ */ ++struct iscsi_login_request { ++#if defined(__BIG_ENDIAN) ++ u8 op_code; ++ u8 op_attr; ++#define ISCSI_LOGIN_REQUEST_NEXT_STAGE (0x3<<0) ++#define ISCSI_LOGIN_REQUEST_NEXT_STAGE_SHIFT 0 ++#define ISCSI_LOGIN_REQUEST_CURRENT_STAGE (0x3<<2) ++#define ISCSI_LOGIN_REQUEST_CURRENT_STAGE_SHIFT 2 ++#define ISCSI_LOGIN_REQUEST_RESERVED0 (0x3<<4) ++#define ISCSI_LOGIN_REQUEST_RESERVED0_SHIFT 4 ++#define ISCSI_LOGIN_REQUEST_CONT (0x1<<6) ++#define ISCSI_LOGIN_REQUEST_CONT_SHIFT 6 ++#define ISCSI_LOGIN_REQUEST_TRANSIT (0x1<<7) ++#define ISCSI_LOGIN_REQUEST_TRANSIT_SHIFT 7 ++ u8 version_max; ++ u8 version_min; ++#elif defined(__LITTLE_ENDIAN) ++ u8 version_min; ++ u8 version_max; ++ u8 op_attr; ++#define ISCSI_LOGIN_REQUEST_NEXT_STAGE (0x3<<0) ++#define ISCSI_LOGIN_REQUEST_NEXT_STAGE_SHIFT 0 ++#define ISCSI_LOGIN_REQUEST_CURRENT_STAGE (0x3<<2) ++#define ISCSI_LOGIN_REQUEST_CURRENT_STAGE_SHIFT 2 ++#define ISCSI_LOGIN_REQUEST_RESERVED0 (0x3<<4) ++#define ISCSI_LOGIN_REQUEST_RESERVED0_SHIFT 4 ++#define ISCSI_LOGIN_REQUEST_CONT (0x1<<6) ++#define ISCSI_LOGIN_REQUEST_CONT_SHIFT 6 ++#define ISCSI_LOGIN_REQUEST_TRANSIT (0x1<<7) ++#define ISCSI_LOGIN_REQUEST_TRANSIT_SHIFT 7 ++ u8 op_code; ++#endif ++ u32 data_length; ++ u32 isid_lo; ++#if defined(__BIG_ENDIAN) ++ u16 isid_hi; ++ u16 tsih; ++#elif defined(__LITTLE_ENDIAN) ++ u16 tsih; ++ u16 isid_hi; ++#endif ++#if defined(__BIG_ENDIAN) ++ u16 reserved2; ++ u16 itt; ++#define ISCSI_LOGIN_REQUEST_INDEX (0x3FFF<<0) ++#define ISCSI_LOGIN_REQUEST_INDEX_SHIFT 0 ++#define ISCSI_LOGIN_REQUEST_TYPE (0x3<<14) ++#define ISCSI_LOGIN_REQUEST_TYPE_SHIFT 14 ++#elif defined(__LITTLE_ENDIAN) ++ u16 itt; ++#define ISCSI_LOGIN_REQUEST_INDEX (0x3FFF<<0) ++#define ISCSI_LOGIN_REQUEST_INDEX_SHIFT 0 ++#define ISCSI_LOGIN_REQUEST_TYPE (0x3<<14) ++#define ISCSI_LOGIN_REQUEST_TYPE_SHIFT 14 ++ u16 reserved2; ++#endif ++#if defined(__BIG_ENDIAN) ++ u16 cid; ++ u16 reserved3; ++#elif defined(__LITTLE_ENDIAN) ++ u16 reserved3; ++ u16 cid; ++#endif ++ u32 cmd_sn; ++ u32 exp_stat_sn; ++ u32 reserved4; ++ u32 resp_bd_list_addr_lo; ++ u32 resp_bd_list_addr_hi; ++ u32 resp_buffer; ++#define ISCSI_LOGIN_REQUEST_RESP_BUFFER_LENGTH (0xFFFFFF<<0) ++#define ISCSI_LOGIN_REQUEST_RESP_BUFFER_LENGTH_SHIFT 0 ++#define ISCSI_LOGIN_REQUEST_NUM_RESP_BDS (0xFF<<24) ++#define ISCSI_LOGIN_REQUEST_NUM_RESP_BDS_SHIFT 24 ++#if defined(__BIG_ENDIAN) ++ u16 reserved8; ++ u8 reserved7; ++ u8 flags; ++#define ISCSI_LOGIN_REQUEST_RESERVED5 (0x3<<0) ++#define ISCSI_LOGIN_REQUEST_RESERVED5_SHIFT 0 ++#define ISCSI_LOGIN_REQUEST_UPDATE_EXP_STAT_SN (0x1<<2) ++#define ISCSI_LOGIN_REQUEST_UPDATE_EXP_STAT_SN_SHIFT 2 ++#define ISCSI_LOGIN_REQUEST_RESERVED6 (0x1F<<3) ++#define ISCSI_LOGIN_REQUEST_RESERVED6_SHIFT 3 ++#elif defined(__LITTLE_ENDIAN) ++ u8 flags; ++#define ISCSI_LOGIN_REQUEST_RESERVED5 (0x3<<0) ++#define ISCSI_LOGIN_REQUEST_RESERVED5_SHIFT 0 ++#define ISCSI_LOGIN_REQUEST_UPDATE_EXP_STAT_SN (0x1<<2) ++#define ISCSI_LOGIN_REQUEST_UPDATE_EXP_STAT_SN_SHIFT 2 ++#define ISCSI_LOGIN_REQUEST_RESERVED6 (0x1F<<3) ++#define ISCSI_LOGIN_REQUEST_RESERVED6_SHIFT 3 ++ u8 reserved7; ++ u16 reserved8; ++#endif ++ u32 bd_list_addr_lo; ++ u32 bd_list_addr_hi; ++#if defined(__BIG_ENDIAN) ++ u8 cq_index; ++ u8 reserved10; ++ u8 reserved9; ++ u8 num_bds; ++#elif defined(__LITTLE_ENDIAN) ++ u8 num_bds; ++ u8 reserved9; ++ u8 reserved10; ++ u8 cq_index; ++#endif ++}; ++ ++ ++/* ++ * iSCSI Login CQE ++ */ ++struct iscsi_login_response { ++#if defined(__BIG_ENDIAN) ++ u8 op_code; ++ u8 response_flags; ++#define ISCSI_LOGIN_RESPONSE_NEXT_STAGE (0x3<<0) ++#define ISCSI_LOGIN_RESPONSE_NEXT_STAGE_SHIFT 0 ++#define ISCSI_LOGIN_RESPONSE_CURRENT_STAGE (0x3<<2) ++#define ISCSI_LOGIN_RESPONSE_CURRENT_STAGE_SHIFT 2 ++#define ISCSI_LOGIN_RESPONSE_RESERVED0 (0x3<<4) ++#define ISCSI_LOGIN_RESPONSE_RESERVED0_SHIFT 4 ++#define ISCSI_LOGIN_RESPONSE_CONT (0x1<<6) ++#define ISCSI_LOGIN_RESPONSE_CONT_SHIFT 6 ++#define ISCSI_LOGIN_RESPONSE_TRANSIT (0x1<<7) ++#define ISCSI_LOGIN_RESPONSE_TRANSIT_SHIFT 7 ++ u8 version_max; ++ u8 version_active; ++#elif defined(__LITTLE_ENDIAN) ++ u8 version_active; ++ u8 version_max; ++ u8 response_flags; ++#define ISCSI_LOGIN_RESPONSE_NEXT_STAGE (0x3<<0) ++#define ISCSI_LOGIN_RESPONSE_NEXT_STAGE_SHIFT 0 ++#define ISCSI_LOGIN_RESPONSE_CURRENT_STAGE (0x3<<2) ++#define ISCSI_LOGIN_RESPONSE_CURRENT_STAGE_SHIFT 2 ++#define ISCSI_LOGIN_RESPONSE_RESERVED0 (0x3<<4) ++#define ISCSI_LOGIN_RESPONSE_RESERVED0_SHIFT 4 ++#define ISCSI_LOGIN_RESPONSE_CONT (0x1<<6) ++#define ISCSI_LOGIN_RESPONSE_CONT_SHIFT 6 ++#define ISCSI_LOGIN_RESPONSE_TRANSIT (0x1<<7) ++#define ISCSI_LOGIN_RESPONSE_TRANSIT_SHIFT 7 ++ u8 op_code; ++#endif ++ u32 data_length; ++ u32 exp_cmd_sn; ++ u32 max_cmd_sn; ++ u32 reserved1[2]; ++#if defined(__BIG_ENDIAN) ++ u16 reserved3; ++ u8 err_code; ++ u8 reserved2; ++#elif defined(__LITTLE_ENDIAN) ++ u8 reserved2; ++ u8 err_code; ++ u16 reserved3; ++#endif ++ u32 stat_sn; ++ u32 isid_lo; ++#if defined(__BIG_ENDIAN) ++ u16 isid_hi; ++ u16 tsih; ++#elif defined(__LITTLE_ENDIAN) ++ u16 tsih; ++ u16 isid_hi; ++#endif ++#if defined(__BIG_ENDIAN) ++ u8 status_class; ++ u8 status_detail; ++ u16 reserved4; ++#elif defined(__LITTLE_ENDIAN) ++ u16 reserved4; ++ u8 status_detail; ++ u8 status_class; ++#endif ++ u32 reserved5[3]; ++#if defined(__BIG_ENDIAN) ++ u16 reserved6; ++ u16 itt; ++#define ISCSI_LOGIN_RESPONSE_INDEX (0x3FFF<<0) ++#define ISCSI_LOGIN_RESPONSE_INDEX_SHIFT 0 ++#define ISCSI_LOGIN_RESPONSE_TYPE (0x3<<14) ++#define ISCSI_LOGIN_RESPONSE_TYPE_SHIFT 14 ++#elif defined(__LITTLE_ENDIAN) ++ u16 itt; ++#define ISCSI_LOGIN_RESPONSE_INDEX (0x3FFF<<0) ++#define ISCSI_LOGIN_RESPONSE_INDEX_SHIFT 0 ++#define ISCSI_LOGIN_RESPONSE_TYPE (0x3<<14) ++#define ISCSI_LOGIN_RESPONSE_TYPE_SHIFT 14 ++ u16 reserved6; ++#endif ++ u32 cq_req_sn; ++}; ++ ++ ++/* ++ * iSCSI Logout SQ WQE ++ */ ++struct iscsi_logout_request { ++#if defined(__BIG_ENDIAN) ++ u8 op_code; ++ u8 op_attr; ++#define ISCSI_LOGOUT_REQUEST_REASON (0x7F<<0) ++#define ISCSI_LOGOUT_REQUEST_REASON_SHIFT 0 ++#define ISCSI_LOGOUT_REQUEST_ALWAYS_ONE (0x1<<7) ++#define ISCSI_LOGOUT_REQUEST_ALWAYS_ONE_SHIFT 7 ++ u16 reserved0; ++#elif defined(__LITTLE_ENDIAN) ++ u16 reserved0; ++ u8 op_attr; ++#define ISCSI_LOGOUT_REQUEST_REASON (0x7F<<0) ++#define ISCSI_LOGOUT_REQUEST_REASON_SHIFT 0 ++#define ISCSI_LOGOUT_REQUEST_ALWAYS_ONE (0x1<<7) ++#define ISCSI_LOGOUT_REQUEST_ALWAYS_ONE_SHIFT 7 ++ u8 op_code; ++#endif ++ u32 data_length; ++ u32 reserved1[2]; ++#if defined(__BIG_ENDIAN) ++ u16 reserved2; ++ u16 itt; ++#define ISCSI_LOGOUT_REQUEST_INDEX (0x3FFF<<0) ++#define ISCSI_LOGOUT_REQUEST_INDEX_SHIFT 0 ++#define ISCSI_LOGOUT_REQUEST_TYPE (0x3<<14) ++#define ISCSI_LOGOUT_REQUEST_TYPE_SHIFT 14 ++#elif defined(__LITTLE_ENDIAN) ++ u16 itt; ++#define ISCSI_LOGOUT_REQUEST_INDEX (0x3FFF<<0) ++#define ISCSI_LOGOUT_REQUEST_INDEX_SHIFT 0 ++#define ISCSI_LOGOUT_REQUEST_TYPE (0x3<<14) ++#define ISCSI_LOGOUT_REQUEST_TYPE_SHIFT 14 ++ u16 reserved2; ++#endif ++#if defined(__BIG_ENDIAN) ++ u16 cid; ++ u16 reserved3; ++#elif defined(__LITTLE_ENDIAN) ++ u16 reserved3; ++ u16 cid; ++#endif ++ u32 cmd_sn; ++ u32 reserved4[5]; ++ u32 zero_fill; ++ u32 bd_list_addr_lo; ++ u32 bd_list_addr_hi; ++#if defined(__BIG_ENDIAN) ++ u8 cq_index; ++ u8 reserved6; ++ u8 reserved5; ++ u8 num_bds; ++#elif defined(__LITTLE_ENDIAN) ++ u8 num_bds; ++ u8 reserved5; ++ u8 reserved6; ++ u8 cq_index; ++#endif ++}; ++ ++ ++/* ++ * iSCSI Logout CQE ++ */ ++struct iscsi_logout_response { ++#if defined(__BIG_ENDIAN) ++ u8 op_code; ++ u8 reserved1; ++ u8 response; ++ u8 reserved0; ++#elif defined(__LITTLE_ENDIAN) ++ u8 reserved0; ++ u8 response; ++ u8 reserved1; ++ u8 op_code; ++#endif ++ u32 reserved2; ++ u32 exp_cmd_sn; ++ u32 max_cmd_sn; ++ u32 reserved3[2]; ++#if defined(__BIG_ENDIAN) ++ u16 reserved5; ++ u8 err_code; ++ u8 reserved4; ++#elif defined(__LITTLE_ENDIAN) ++ u8 reserved4; ++ u8 err_code; ++ u16 reserved5; ++#endif ++ u32 reserved6[3]; ++#if defined(__BIG_ENDIAN) ++ u16 time_to_wait; ++ u16 time_to_retain; ++#elif defined(__LITTLE_ENDIAN) ++ u16 time_to_retain; ++ u16 time_to_wait; ++#endif ++ u32 reserved7[3]; ++#if defined(__BIG_ENDIAN) ++ u16 reserved8; ++ u16 itt; ++#define ISCSI_LOGOUT_RESPONSE_INDEX (0x3FFF<<0) ++#define ISCSI_LOGOUT_RESPONSE_INDEX_SHIFT 0 ++#define ISCSI_LOGOUT_RESPONSE_TYPE (0x3<<14) ++#define ISCSI_LOGOUT_RESPONSE_TYPE_SHIFT 14 ++#elif defined(__LITTLE_ENDIAN) ++ u16 itt; ++#define ISCSI_LOGOUT_RESPONSE_INDEX (0x3FFF<<0) ++#define ISCSI_LOGOUT_RESPONSE_INDEX_SHIFT 0 ++#define ISCSI_LOGOUT_RESPONSE_TYPE (0x3<<14) ++#define ISCSI_LOGOUT_RESPONSE_TYPE_SHIFT 14 ++ u16 reserved8; ++#endif ++ u32 cq_req_sn; ++}; ++ ++ ++/* ++ * iSCSI Nop-In CQE ++ */ ++struct iscsi_nop_in_msg { ++#if defined(__BIG_ENDIAN) ++ u8 op_code; ++ u8 reserved1; ++ u16 reserved0; ++#elif defined(__LITTLE_ENDIAN) ++ u16 reserved0; ++ u8 reserved1; ++ u8 op_code; ++#endif ++ u32 data_length; ++ u32 exp_cmd_sn; ++ u32 max_cmd_sn; ++ u32 ttt; ++ u32 reserved2; ++#if defined(__BIG_ENDIAN) ++ u16 reserved4; ++ u8 err_code; ++ u8 reserved3; ++#elif defined(__LITTLE_ENDIAN) ++ u8 reserved3; ++ u8 err_code; ++ u16 reserved4; ++#endif ++ u32 reserved5; ++ u32 lun[2]; ++ u32 reserved6[4]; ++#if defined(__BIG_ENDIAN) ++ u16 reserved7; ++ u16 itt; ++#define ISCSI_NOP_IN_MSG_INDEX (0x3FFF<<0) ++#define ISCSI_NOP_IN_MSG_INDEX_SHIFT 0 ++#define ISCSI_NOP_IN_MSG_TYPE (0x3<<14) ++#define ISCSI_NOP_IN_MSG_TYPE_SHIFT 14 ++#elif defined(__LITTLE_ENDIAN) ++ u16 itt; ++#define ISCSI_NOP_IN_MSG_INDEX (0x3FFF<<0) ++#define ISCSI_NOP_IN_MSG_INDEX_SHIFT 0 ++#define ISCSI_NOP_IN_MSG_TYPE (0x3<<14) ++#define ISCSI_NOP_IN_MSG_TYPE_SHIFT 14 ++ u16 reserved7; ++#endif ++ u32 cq_req_sn; ++}; ++ ++ ++/* ++ * iSCSI NOP-OUT SQ WQE ++ */ ++struct iscsi_nop_out_request { ++#if defined(__BIG_ENDIAN) ++ u8 op_code; ++ u8 op_attr; ++#define ISCSI_NOP_OUT_REQUEST_RESERVED1 (0x7F<<0) ++#define ISCSI_NOP_OUT_REQUEST_RESERVED1_SHIFT 0 ++#define ISCSI_NOP_OUT_REQUEST_ALWAYS_ONE (0x1<<7) ++#define ISCSI_NOP_OUT_REQUEST_ALWAYS_ONE_SHIFT 7 ++ u16 reserved0; ++#elif defined(__LITTLE_ENDIAN) ++ u16 reserved0; ++ u8 op_attr; ++#define ISCSI_NOP_OUT_REQUEST_RESERVED1 (0x7F<<0) ++#define ISCSI_NOP_OUT_REQUEST_RESERVED1_SHIFT 0 ++#define ISCSI_NOP_OUT_REQUEST_ALWAYS_ONE (0x1<<7) ++#define ISCSI_NOP_OUT_REQUEST_ALWAYS_ONE_SHIFT 7 ++ u8 op_code; ++#endif ++ u32 data_length; ++ u32 lun[2]; ++#if defined(__BIG_ENDIAN) ++ u16 reserved2; ++ u16 itt; ++#define ISCSI_NOP_OUT_REQUEST_INDEX (0x3FFF<<0) ++#define ISCSI_NOP_OUT_REQUEST_INDEX_SHIFT 0 ++#define ISCSI_NOP_OUT_REQUEST_TYPE (0x3<<14) ++#define ISCSI_NOP_OUT_REQUEST_TYPE_SHIFT 14 ++#elif defined(__LITTLE_ENDIAN) ++ u16 itt; ++#define ISCSI_NOP_OUT_REQUEST_INDEX (0x3FFF<<0) ++#define ISCSI_NOP_OUT_REQUEST_INDEX_SHIFT 0 ++#define ISCSI_NOP_OUT_REQUEST_TYPE (0x3<<14) ++#define ISCSI_NOP_OUT_REQUEST_TYPE_SHIFT 14 ++ u16 reserved2; ++#endif ++ u32 ttt; ++ u32 cmd_sn; ++ u32 reserved3[2]; ++ u32 resp_bd_list_addr_lo; ++ u32 resp_bd_list_addr_hi; ++ u32 resp_buffer; ++#define ISCSI_NOP_OUT_REQUEST_RESP_BUFFER_LENGTH (0xFFFFFF<<0) ++#define ISCSI_NOP_OUT_REQUEST_RESP_BUFFER_LENGTH_SHIFT 0 ++#define ISCSI_NOP_OUT_REQUEST_NUM_RESP_BDS (0xFF<<24) ++#define ISCSI_NOP_OUT_REQUEST_NUM_RESP_BDS_SHIFT 24 ++#if defined(__BIG_ENDIAN) ++ u16 reserved7; ++ u8 reserved6; ++ u8 flags; ++#define ISCSI_NOP_OUT_REQUEST_RESERVED4 (0x1<<0) ++#define ISCSI_NOP_OUT_REQUEST_RESERVED4_SHIFT 0 ++#define ISCSI_NOP_OUT_REQUEST_LOCAL_COMPLETION (0x1<<1) ++#define ISCSI_NOP_OUT_REQUEST_LOCAL_COMPLETION_SHIFT 1 ++#define ISCSI_NOP_OUT_REQUEST_ZERO_FILL (0x3F<<2) ++#define ISCSI_NOP_OUT_REQUEST_ZERO_FILL_SHIFT 2 ++#elif defined(__LITTLE_ENDIAN) ++ u8 flags; ++#define ISCSI_NOP_OUT_REQUEST_RESERVED4 (0x1<<0) ++#define ISCSI_NOP_OUT_REQUEST_RESERVED4_SHIFT 0 ++#define ISCSI_NOP_OUT_REQUEST_LOCAL_COMPLETION (0x1<<1) ++#define ISCSI_NOP_OUT_REQUEST_LOCAL_COMPLETION_SHIFT 1 ++#define ISCSI_NOP_OUT_REQUEST_ZERO_FILL (0x3F<<2) ++#define ISCSI_NOP_OUT_REQUEST_ZERO_FILL_SHIFT 2 ++ u8 reserved6; ++ u16 reserved7; ++#endif ++ u32 bd_list_addr_lo; ++ u32 bd_list_addr_hi; ++#if defined(__BIG_ENDIAN) ++ u8 cq_index; ++ u8 reserved9; ++ u8 reserved8; ++ u8 num_bds; ++#elif defined(__LITTLE_ENDIAN) ++ u8 num_bds; ++ u8 reserved8; ++ u8 reserved9; ++ u8 cq_index; ++#endif ++}; ++ ++ ++ ++ ++/* ++ * iSCSI Reject CQE ++ */ ++struct iscsi_reject_msg { ++#if defined(__BIG_ENDIAN) ++ u8 op_code; ++ u8 reserved1; ++ u8 reason; ++ u8 reserved0; ++#elif defined(__LITTLE_ENDIAN) ++ u8 reserved0; ++ u8 reason; ++ u8 reserved1; ++ u8 op_code; ++#endif ++ u32 data_length; ++ u32 exp_cmd_sn; ++ u32 max_cmd_sn; ++ u32 reserved2[2]; ++#if defined(__BIG_ENDIAN) ++ u16 reserved4; ++ u8 err_code; ++ u8 reserved3; ++#elif defined(__LITTLE_ENDIAN) ++ u8 reserved3; ++ u8 err_code; ++ u16 reserved4; ++#endif ++ u32 reserved5[8]; ++ u32 cq_req_sn; ++}; ++ ++ ++/* ++ * iSCSI TMF SQ WQE ++ */ ++struct iscsi_tmf_request { ++#if defined(__BIG_ENDIAN) ++ u8 op_code; ++ u8 op_attr; ++#define ISCSI_TMF_REQUEST_FUNCTION (0x7F<<0) ++#define ISCSI_TMF_REQUEST_FUNCTION_SHIFT 0 ++#define ISCSI_TMF_REQUEST_ALWAYS_ONE (0x1<<7) ++#define ISCSI_TMF_REQUEST_ALWAYS_ONE_SHIFT 7 ++ u16 reserved0; ++#elif defined(__LITTLE_ENDIAN) ++ u16 reserved0; ++ u8 op_attr; ++#define ISCSI_TMF_REQUEST_FUNCTION (0x7F<<0) ++#define ISCSI_TMF_REQUEST_FUNCTION_SHIFT 0 ++#define ISCSI_TMF_REQUEST_ALWAYS_ONE (0x1<<7) ++#define ISCSI_TMF_REQUEST_ALWAYS_ONE_SHIFT 7 ++ u8 op_code; ++#endif ++ u32 data_length; ++ u32 lun[2]; ++#if defined(__BIG_ENDIAN) ++ u16 reserved1; ++ u16 itt; ++#define ISCSI_TMF_REQUEST_INDEX (0x3FFF<<0) ++#define ISCSI_TMF_REQUEST_INDEX_SHIFT 0 ++#define ISCSI_TMF_REQUEST_TYPE (0x3<<14) ++#define ISCSI_TMF_REQUEST_TYPE_SHIFT 14 ++#elif defined(__LITTLE_ENDIAN) ++ u16 itt; ++#define ISCSI_TMF_REQUEST_INDEX (0x3FFF<<0) ++#define ISCSI_TMF_REQUEST_INDEX_SHIFT 0 ++#define ISCSI_TMF_REQUEST_TYPE (0x3<<14) ++#define ISCSI_TMF_REQUEST_TYPE_SHIFT 14 ++ u16 reserved1; ++#endif ++ u32 ref_itt; ++ u32 cmd_sn; ++ u32 reserved2; ++ u32 ref_cmd_sn; ++ u32 reserved3[3]; ++ u32 zero_fill; ++ u32 bd_list_addr_lo; ++ u32 bd_list_addr_hi; ++#if defined(__BIG_ENDIAN) ++ u8 cq_index; ++ u8 reserved5; ++ u8 reserved4; ++ u8 num_bds; ++#elif defined(__LITTLE_ENDIAN) ++ u8 num_bds; ++ u8 reserved4; ++ u8 reserved5; ++ u8 cq_index; ++#endif ++}; ++ ++/* ++ * iSCSI Text SQ WQE ++ */ ++struct iscsi_text_request { ++#if defined(__BIG_ENDIAN) ++ u8 op_code; ++ u8 op_attr; ++#define ISCSI_TEXT_REQUEST_RESERVED1 (0x3F<<0) ++#define ISCSI_TEXT_REQUEST_RESERVED1_SHIFT 0 ++#define ISCSI_TEXT_REQUEST_CONT (0x1<<6) ++#define ISCSI_TEXT_REQUEST_CONT_SHIFT 6 ++#define ISCSI_TEXT_REQUEST_FINAL (0x1<<7) ++#define ISCSI_TEXT_REQUEST_FINAL_SHIFT 7 ++ u16 reserved0; ++#elif defined(__LITTLE_ENDIAN) ++ u16 reserved0; ++ u8 op_attr; ++#define ISCSI_TEXT_REQUEST_RESERVED1 (0x3F<<0) ++#define ISCSI_TEXT_REQUEST_RESERVED1_SHIFT 0 ++#define ISCSI_TEXT_REQUEST_CONT (0x1<<6) ++#define ISCSI_TEXT_REQUEST_CONT_SHIFT 6 ++#define ISCSI_TEXT_REQUEST_FINAL (0x1<<7) ++#define ISCSI_TEXT_REQUEST_FINAL_SHIFT 7 ++ u8 op_code; ++#endif ++ u32 data_length; ++ u32 lun[2]; ++#if defined(__BIG_ENDIAN) ++ u16 reserved3; ++ u16 itt; ++#define ISCSI_TEXT_REQUEST_INDEX (0x3FFF<<0) ++#define ISCSI_TEXT_REQUEST_INDEX_SHIFT 0 ++#define ISCSI_TEXT_REQUEST_TYPE (0x3<<14) ++#define ISCSI_TEXT_REQUEST_TYPE_SHIFT 14 ++#elif defined(__LITTLE_ENDIAN) ++ u16 itt; ++#define ISCSI_TEXT_REQUEST_INDEX (0x3FFF<<0) ++#define ISCSI_TEXT_REQUEST_INDEX_SHIFT 0 ++#define ISCSI_TEXT_REQUEST_TYPE (0x3<<14) ++#define ISCSI_TEXT_REQUEST_TYPE_SHIFT 14 ++ u16 reserved3; ++#endif ++ u32 ttt; ++ u32 cmd_sn; ++ u32 reserved4[2]; ++ u32 resp_bd_list_addr_lo; ++ u32 resp_bd_list_addr_hi; ++ u32 resp_buffer; ++#define ISCSI_TEXT_REQUEST_RESP_BUFFER_LENGTH (0xFFFFFF<<0) ++#define ISCSI_TEXT_REQUEST_RESP_BUFFER_LENGTH_SHIFT 0 ++#define ISCSI_TEXT_REQUEST_NUM_RESP_BDS (0xFF<<24) ++#define ISCSI_TEXT_REQUEST_NUM_RESP_BDS_SHIFT 24 ++ u32 zero_fill; ++ u32 bd_list_addr_lo; ++ u32 bd_list_addr_hi; ++#if defined(__BIG_ENDIAN) ++ u8 cq_index; ++ u8 reserved7; ++ u8 reserved6; ++ u8 num_bds; ++#elif defined(__LITTLE_ENDIAN) ++ u8 num_bds; ++ u8 reserved6; ++ u8 reserved7; ++ u8 cq_index; ++#endif ++}; ++ ++/* ++ * iSCSI SQ WQE ++ */ ++union iscsi_request { ++ struct iscsi_cmd_request cmd; ++ struct iscsi_tmf_request tmf; ++ struct iscsi_nop_out_request nop_out; ++ struct iscsi_login_request login_req; ++ struct iscsi_text_request text; ++ struct iscsi_logout_request logout_req; ++ struct iscsi_cleanup_request cleanup; ++}; ++ ++ ++/* ++ * iSCSI TMF CQE ++ */ ++struct iscsi_tmf_response { ++#if defined(__BIG_ENDIAN) ++ u8 op_code; ++ u8 reserved1; ++ u8 response; ++ u8 reserved0; ++#elif defined(__LITTLE_ENDIAN) ++ u8 reserved0; ++ u8 response; ++ u8 reserved1; ++ u8 op_code; ++#endif ++ u32 reserved2; ++ u32 exp_cmd_sn; ++ u32 max_cmd_sn; ++ u32 reserved3[2]; ++#if defined(__BIG_ENDIAN) ++ u16 reserved5; ++ u8 err_code; ++ u8 reserved4; ++#elif defined(__LITTLE_ENDIAN) ++ u8 reserved4; ++ u8 err_code; ++ u16 reserved5; ++#endif ++ u32 reserved6[7]; ++#if defined(__BIG_ENDIAN) ++ u16 reserved7; ++ u16 itt; ++#define ISCSI_TMF_RESPONSE_INDEX (0x3FFF<<0) ++#define ISCSI_TMF_RESPONSE_INDEX_SHIFT 0 ++#define ISCSI_TMF_RESPONSE_TYPE (0x3<<14) ++#define ISCSI_TMF_RESPONSE_TYPE_SHIFT 14 ++#elif defined(__LITTLE_ENDIAN) ++ u16 itt; ++#define ISCSI_TMF_RESPONSE_INDEX (0x3FFF<<0) ++#define ISCSI_TMF_RESPONSE_INDEX_SHIFT 0 ++#define ISCSI_TMF_RESPONSE_TYPE (0x3<<14) ++#define ISCSI_TMF_RESPONSE_TYPE_SHIFT 14 ++ u16 reserved7; ++#endif ++ u32 cq_req_sn; ++}; ++ ++/* ++ * iSCSI Text CQE ++ */ ++struct iscsi_text_response { ++#if defined(__BIG_ENDIAN) ++ u8 op_code; ++ u8 response_flags; ++#define ISCSI_TEXT_RESPONSE_RESERVED1 (0x3F<<0) ++#define ISCSI_TEXT_RESPONSE_RESERVED1_SHIFT 0 ++#define ISCSI_TEXT_RESPONSE_CONT (0x1<<6) ++#define ISCSI_TEXT_RESPONSE_CONT_SHIFT 6 ++#define ISCSI_TEXT_RESPONSE_FINAL (0x1<<7) ++#define ISCSI_TEXT_RESPONSE_FINAL_SHIFT 7 ++ u16 reserved0; ++#elif defined(__LITTLE_ENDIAN) ++ u16 reserved0; ++ u8 response_flags; ++#define ISCSI_TEXT_RESPONSE_RESERVED1 (0x3F<<0) ++#define ISCSI_TEXT_RESPONSE_RESERVED1_SHIFT 0 ++#define ISCSI_TEXT_RESPONSE_CONT (0x1<<6) ++#define ISCSI_TEXT_RESPONSE_CONT_SHIFT 6 ++#define ISCSI_TEXT_RESPONSE_FINAL (0x1<<7) ++#define ISCSI_TEXT_RESPONSE_FINAL_SHIFT 7 ++ u8 op_code; ++#endif ++ u32 data_length; ++ u32 exp_cmd_sn; ++ u32 max_cmd_sn; ++ u32 ttt; ++ u32 reserved2; ++#if defined(__BIG_ENDIAN) ++ u16 reserved4; ++ u8 err_code; ++ u8 reserved3; ++#elif defined(__LITTLE_ENDIAN) ++ u8 reserved3; ++ u8 err_code; ++ u16 reserved4; ++#endif ++ u32 reserved5; ++ u32 lun[2]; ++ u32 reserved6[4]; ++#if defined(__BIG_ENDIAN) ++ u16 reserved7; ++ u16 itt; ++#define ISCSI_TEXT_RESPONSE_INDEX (0x3FFF<<0) ++#define ISCSI_TEXT_RESPONSE_INDEX_SHIFT 0 ++#define ISCSI_TEXT_RESPONSE_TYPE (0x3<<14) ++#define ISCSI_TEXT_RESPONSE_TYPE_SHIFT 14 ++#elif defined(__LITTLE_ENDIAN) ++ u16 itt; ++#define ISCSI_TEXT_RESPONSE_INDEX (0x3FFF<<0) ++#define ISCSI_TEXT_RESPONSE_INDEX_SHIFT 0 ++#define ISCSI_TEXT_RESPONSE_TYPE (0x3<<14) ++#define ISCSI_TEXT_RESPONSE_TYPE_SHIFT 14 ++ u16 reserved7; ++#endif ++ u32 cq_req_sn; ++}; ++ ++/* ++ * iSCSI CQE ++ */ ++union iscsi_response { ++ struct iscsi_cmd_response cmd; ++ struct iscsi_tmf_response tmf; ++ struct iscsi_login_response login_resp; ++ struct iscsi_text_response text; ++ struct iscsi_logout_response logout_resp; ++ struct iscsi_cleanup_response cleanup; ++ struct iscsi_reject_msg reject; ++ struct iscsi_async_msg async; ++ struct iscsi_nop_in_msg nop_in; ++}; ++ ++ ++ ++ ++ ++ ++#endif /* __57XX_ISCSI_HSI_LINUX_LE__ */ +diff -r 14194bd97e8c drivers/scsi/bnx2i/Kconfig +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/scsi/bnx2i/Kconfig Tue Jun 16 11:09:42 2009 +0100 +@@ -0,0 +1,7 @@ ++config SCSI_BNX2_ISCSI ++ tristate "Broadcom NetXtreme II iSCSI support" ++ select CNIC ++ select SCSI_ISCSI_ATTRS ++ ---help--- ++ This driver supports iSCSI offload for the Broadcom NetXtreme II ++ devices. +diff -r 14194bd97e8c drivers/scsi/bnx2i/Makefile +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/scsi/bnx2i/Makefile Tue Jun 16 11:09:42 2009 +0100 +@@ -0,0 +1,8 @@ ++bnx2i-y := bnx2i_init.o bnx2i_hwi.o bnx2i_iscsi.o bnx2i_sysfs.o ++ ++obj-$(CONFIG_SCSI_BNX2_ISCSI) += bnx2i.o ++ ++EXTRA_CFLAGS += -I$(srctree)/drivers/net ++EXTRA_CFLAGS += -D_SYSFS_INCL_ ++EXTRA_CFLAGS += -D__BNX2I_CONN_WORKER__ ++EXTRA_CFLAGS += -D_CREATE_SESS_NEW_ +diff -r 14194bd97e8c drivers/scsi/bnx2i/bnx2i.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/scsi/bnx2i/bnx2i.h Tue Jun 16 11:09:42 2009 +0100 +@@ -0,0 +1,1371 @@ ++/* bnx2i.h: Broadcom NetXtreme II iSCSI driver. ++ * ++ * Copyright (c) 2006 - 2009 Broadcom Corporation ++ * ++ * 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. ++ * ++ * Written by: Anil Veerabhadrappa (anilgv@broadcom.com) ++ */ ++ ++#ifndef _BNX2I_H_ ++#define _BNX2I_H_ ++ ++#include ++ ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#ifndef __VMKLNX__ ++#include ++#include ++#endif ++ ++#include ++#include ++#include ++#ifdef __VMKLNX__ ++#include ++#endif ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23) ++#include ++#endif ++ ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27) ++#include "../../net/cnic_if.h" ++#else ++#include ++#endif ++#include "57xx_iscsi_hsi.h" ++#include "57xx_iscsi_constants.h" ++#include "bnx2i_ioctl.h" ++ ++#define BNX2_ISCSI_DRIVER_NAME "bnx2i" ++ ++#ifndef PCI_DEVICE_ID_NX2_5709 ++#define PCI_DEVICE_ID_NX2_5709 0x1639 ++#endif ++ ++#ifndef PCI_DEVICE_ID_NX2_5709S ++#define PCI_DEVICE_ID_NX2_5709S 0x163a ++#endif ++ ++#ifndef PCI_DEVICE_ID_NX2_57710 ++#define PCI_DEVICE_ID_NX2_57710 0x164e ++#endif ++ ++#ifndef PCI_DEVICE_ID_NX2_57711 ++#define PCI_DEVICE_ID_NX2_57711 0x164f ++#endif ++ ++#ifndef PCI_DEVICE_ID_NX2_57711E ++#define PCI_DEVICE_ID_NX2_57711E 0x1650 ++#endif ++ ++#define BNX2I_REGISTER_HBA_SUPPORTED 0 ++#define BNX2I_REGISTER_HBA_FORCED 1 ++ ++#define ISCSI_MAX_ADAPTERS 8 ++#define ISCSI_MAX_CONNS_PER_HBA 128 ++#define ISCSI_MAX_SESS_PER_HBA ISCSI_MAX_CONNS_PER_HBA ++#define ISCSI_MAX_CMDS_PER_SESS 128 ++ ++#define ISCSI_MAX_BDS_PER_CMD 32 ++ ++#define MAX_PAGES_PER_CTRL_STRUCT_POOL 16 ++#define BNX2I_RESERVED_SLOW_PATH_CMD_SLOTS 4 ++ ++/* 5706/08 hardware has limit on maximum buffer size per BD it can handle */ ++#define MAX_BD_LENGTH 65535 ++#define BD_SPLIT_SIZE 32768 ++ ++/* min, max & default values for SQ/RQ/CQ size, configurable via' modparam */ ++#define BNX2I_SQ_WQES_MIN 16 ++#define BNX2I_570X_SQ_WQES_MAX 128 ++#define BNX2I_5770X_SQ_WQES_MAX 512 ++#define BNX2I_570X_SQ_WQES_DEFAULT 128 ++#define BNX2I_5770X_SQ_WQES_DEFAULT 256 ++#define BNX2I_5770X_SQ_WQES_DEFAULT_X86 64 ++ ++#define BNX2I_CQ_WQES_MIN 16 ++#define BNX2I_CQ_WQES_MAX 256 ++#define BNX2I_CQ_WQES_DEFAULT 128 ++ ++#define BNX2I_RQ_WQES_MIN 16 ++#define BNX2I_RQ_WQES_MAX 32 ++#define BNX2I_RQ_WQES_DEFAULT 16 ++ ++/* CCELLs per conn */ ++#define BNX2I_CCELLS_MIN 16 ++#define BNX2I_CCELLS_MAX 96 ++#define BNX2I_CCELLS_DEFAULT 64 ++ ++#define ISCSI_CONN_LOGIN_BUF_SIZE 16384 ++#define ITT_INVALID_SIGNATURE 0xFFFF ++ ++#define ISCSI_CMD_CLEANUP_TIMEOUT 100 ++ ++#define BNX2I_CONN_CTX_BUF_SIZE 16384 ++ ++#define BNX2I_SQ_WQE_SIZE 64 ++#define BNX2I_RQ_WQE_SIZE 256 ++#define BNX2I_CQE_SIZE 64 ++ ++#define MB_KERNEL_CTX_SHIFT 8 ++#define MB_KERNEL_CTX_SIZE (1 << MB_KERNEL_CTX_SHIFT) ++ ++#define CTX_SHIFT 7 ++#define GET_CID_NUM(cid_addr) ((cid_addr) >> CTX_SHIFT) ++ ++#define CTX_OFFSET 0x10000 ++#define MAX_CID_CNT 0x4000 ++ ++#define BNX2_TXP_SCRATCH 0x00060000 ++#define BNX2_TPAT_SCRATCH 0x000a0000 ++#define BNX2_RXP_SCRATCH 0x000e0000 ++#define BNX2_COM_SCRATCH 0x00120000 ++#define BNX2_CP_SCRATCH 0x001a0000 ++ ++#define BNX2_PCICFG_REG_WINDOW_ADDRESS 0x00000078 ++#define BNX2_PCICFG_REG_WINDOW_ADDRESS_VAL (0xfffffL<<2) ++#define BNX2_PCICFG_REG_WINDOW 0x00000080 ++ ++/* 5709 context registers */ ++#define BNX2_MQ_CONFIG2 0x00003d00 ++#define BNX2_MQ_CONFIG2_CONT_SZ (0x7L<<4) ++#define BNX2_MQ_CONFIG2_FIRST_L4L5 (0x1fL<<8) ++ ++/* 57710's BAR2 is mapped to doorbell registers */ ++#define BNX2X_DOORBELL_PCI_BAR 2 ++#define BNX2X_MAX_CQS 8 ++ ++#ifndef DMA_64BIT_MASK ++#define DMA_64BIT_MASK ((u64) 0xffffffffffffffffULL) ++#define DMA_32BIT_MASK ((u64) 0x00000000ffffffffULL) ++#endif ++ ++#ifndef DMA_40BIT_MASK ++#define DMA_40BIT_MASK ((u64) 0x000000ffffffffffULL) ++#endif ++ ++#define CNIC_ARM_CQE 1 ++#define CNIC_DISARM_CQE 0 ++ ++#define BNX2I_TBL_TYPE_NONE 0 ++#define BNX2I_TBL_TYPE_PG 1 ++#define BNX2I_TBL_TYPE_BD 2 ++#define REG_RD(__hba, offset) \ ++ readl(__hba->regview + offset) ++#define REG_WR(__hba, offset, val) \ ++ writel(val, __hba->regview + offset) ++ ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23) ++ ++#define scsi_sg_count(cmd) ((cmd)->use_sg) ++#define scsi_sglist(cmd) ((struct scatterlist *)(cmd)->request_buffer) ++#define scsi_bufflen(cmd) ((cmd)->request_bufflen) ++ ++#ifdef __VMKLNX__ ++#undef _DEFINE_SCSI_SET_RESID ++#define _DEFINE_SCSI_GET_RESID 1 ++#endif ++ ++struct bnx2i_hba; ++struct bnx2i_sess; ++struct bnx2i_conn; ++ ++#ifdef _DEFINE_SCSI_SET_RESID ++static inline void scsi_set_resid(struct scsi_cmnd *cmd, int resid) ++{ ++ cmd->resid = resid; ++} ++#endif ++ ++#ifdef _DEFINE_SCSI_GET_RESID ++static inline int scsi_get_resid(struct scsi_cmnd *cmd) ++{ ++ return cmd->resid; ++} ++#endif ++ ++#define scsi_for_each_sg(cmd, sg, nseg, __i) \ ++ for (__i = 0, sg = scsi_sglist(cmd); __i < (nseg); __i++, (sg)++) ++ ++#endif ++ ++struct bnx2i_dma { ++ struct list_head link; ++ int size; ++ char *mem; ++ dma_addr_t mapping; ++ int pgtbl_type; ++ int pgtbl_size; ++ char *pgtbl; ++ dma_addr_t pgtbl_map; ++}; ++ ++/** ++ * struct bd_resc_page - tracks DMA'able memory allocated for BD tables ++ * ++ * @link: list head to link elements ++ * @max_ptrs: maximun pointers that can be stored in this page ++ * @num_valid: number of pointer valid in this page ++ * @page: base addess for page pointer array ++ * ++ * structure to track DMA'able memory allocated for command BD tables ++ */ ++struct bd_resc_page { ++ struct list_head link; ++ u32 max_ptrs; ++ u32 num_valid; ++ void *page[1]; ++}; ++ ++/** ++ * struct io_bdt - I/O buffer destricptor table ++ * ++ * @link: list head to link elements ++ * @bd_tbl: BD table's virtual address ++ * @bd_tbl_dma: BD table's dma address ++ * @cmdp: command structure this BD is allocated ++ * @max_bd_cnt: max BD entries in this table ++ * @bd_valid: num valid BD entries ++ * ++ * IO BD table ++ */ ++struct io_bdt { ++ struct list_head link; ++ struct iscsi_bd *bd_tbl; ++ dma_addr_t bd_tbl_dma; ++ struct bnx2i_cmd *cmdp; ++ u16 max_bd_cnt; ++ u16 bd_valid; ++}; ++ ++/** ++ * struct generic_pdu_resc - login pdu resource structure ++ * ++ * @pdu_hdr: buffer to copy iscsi header prepared by 'iscsid' ++ * @cmd: iSCSI command pointer ++ * @login_itt: iSCSI ITT to be used with login exchanges ++ * @req_buf: driver buffer used to stage payload associated with ++ * the login request ++ * @req_dma_addr: dma address for iscsi login request payload buffer ++ * @req_buf_size: actual login request payload length ++ * @req_wr_ptr: pointer into login request buffer when next data is ++ * to be written ++ * @resp_hdr: iscsi header where iscsi login response header is to ++ * be recreated ++ * @resp_buf: buffer to stage login response payload ++ * @resp_dma_addr: login response payload buffer dma address ++ * @resp_buf_size: login response paylod length ++ * @resp_wr_ptr: pointer into login response buffer when next data is ++ * to be written ++ * @req_bd_tbl: BD table to indicate login request payload buffer details ++ * @req_bd_dma: login request BD table dma address ++ * @resp_bd_tbl: BD table to indicate login response payload buffer details ++ * @resp_bd_dma: login request BD table dma address ++ * ++ * following structure defines buffer info for generic pdus such as iSCSI Login, ++ * Logout and NOP ++ */ ++struct generic_pdu_resc { ++ struct iscsi_hdr pdu_hdr; ++ u32 login_itt; ++ struct bnx2i_dma login_req; ++#define req_buf login_req.mem ++ u32 req_buf_size; ++ char *req_wr_ptr; ++ struct iscsi_hdr resp_hdr; ++ struct bnx2i_dma login_resp; ++#define resp_buf login_resp.mem ++ u32 resp_buf_size; ++ char *resp_wr_ptr; ++ struct iscsi_hdr nopout_hdr; ++ struct iscsi_hdr nopin_hdr; ++ struct iscsi_hdr async_hdr; ++}; ++ ++ ++/** ++ * bnx2i_cmd - iscsi command structure ++ * ++ * @link: list head to link elements ++ * @iscsi_opcode: iscsi command opcode, NOPIN, LOGIN, SCSICMD, etc' ++ * @cmd_state: command state tracking flag ++ * @scsi_status_rcvd: flag determines whether SCSI response is received ++ * for this task or not ++ * @scsi_cmd: SCSI-ML task pointer corresponding to this iscsi cmd ++ * @tmf_ref_itt: reference ITT of the command being aborted ++ * @tmf_ref_cmd: pointer of the command being aborted by this command ++ * @tmf_ref_sc: SCSI-ML's task pointer of aborted command ++ * @sg: SG list ++ * @bd_tbl: buffer descriptor (BD) table ++ * @bd_tbl_dma: buffer descriptor (BD) table's dma address ++ */ ++struct bnx2i_cmd { ++ struct list_head link; ++ u8 iscsi_opcode; ++ u8 rsvd1; ++ u16 itt; ++ atomic_t cmd_state; ++ #define ISCSI_CMD_STATE_INITIATED 0x001 ++ #define ISCSI_CMD_STATE_ABORT_PEND 0x002 ++ #define ISCSI_CMD_STATE_ABORT_COMPL 0x004 ++ #define ISCSI_CMD_STATE_CLEANUP_START 0x008 ++ #define ISCSI_CMD_STATE_CLEANUP_PEND 0x010 ++ #define ISCSI_CMD_STATE_CLEANUP_CMPL 0x020 ++ #define ISCSI_CMD_STATE_FAILED 0x100 ++ #define ISCSI_CMD_STATE_TMF_TIMEOUT 0x200 ++ #define ISCSI_CMD_STATE_CMPL_RCVD 0x400 ++ #define ISCSI_CMD_STATE_COMPLETED 0x800 ++ int scsi_status_rcvd; ++ ++ struct bnx2i_conn *conn; ++ struct scsi_cmnd *scsi_cmd; ++ struct scatterlist *sg; ++ struct io_bdt *bd_tbl; ++ dma_addr_t bd_tbl_dma; ++ u32 reserved0; ++ ++ struct iscsi_cmd_request req; ++ /* TMF RELATED */ ++ u8 tmf_func; ++ u8 tmf_response; ++ int tmf_lun; ++ u32 tmf_ref_itt; ++ struct bnx2i_cmd *tmf_ref_cmd; ++ struct scsi_cmnd *tmf_ref_sc; ++ /* useful for nop-in processing */ ++ u32 ttt; ++ ++}; ++ ++ ++/* ++ * TCP port manager ++ */ ++struct tcp_port_mngt { ++ int num_required; ++ u32 port_tbl_size; ++ u32 num_free_ports; ++ u32 prod_idx; ++ u32 cons_idx; ++ u32 max_idx; ++ u16 *free_q; ++}; ++ ++struct bnx2i_scsi_task { ++ struct list_head link; ++ struct scsi_cmnd *scsi_cmd; ++}; ++ ++/** ++ * struct bnx2i_conn - iscsi connection structure ++ * ++ * @link: list head to link elements ++ * @sess: iscsi session pointer ++ * @cls_conn: pointer to iscsi cls conn ++ * @state: flag to trace command state ++ * @stop_state: stop state request by open-iscsi ++ * @stage: iscsi login state ++ * @in_shutdown: flags to indicate connection is in shutdown mode ++ * @lead_conn: lead iscsi connection of session ++ * @conn_cid: iscsi cid per rfc ++ * @exp_statsn: iscsi expected statsn ++ * @header_digest_en: header digest parameter ++ * @data_digest_en: data digest parameter ++ * @max_data_seg_len_xmit: iscsi initiator's mrdsl ++ * @max_data_seg_len_recv: iscsi target's mrdsl ++ * @ifmarker_enable: ifmarker parameter ++ * @ofmarker_enable: ofmarker parameter ++ * @persist_port: iscsi target side TCP port number ++ * @persist_address: iscsi target's IP address ++ * @iscsi_conn_cid: iscsi conn id ++ * @fw_cid: firmware iscsi context id ++ * @lock: lock to synchronize access ++ * @ep: endpoint structure pointer ++ * @gen_pdu: login/nopout/logout pdu resources ++ * @nopout_num_scsi_cmds: scsi cmds issue counter to detect idle link ++ * @total_data_octets_sent:conn stats - data bytes sent on this conn ++ * @total_data_octets_rcvd:conn stats - data bytes received on this conn ++ * @num_login_req_pdus: conn stats - num login pdus sent ++ * @num_login_resp_pdus: conn stats - num login pdus received ++ * @num_scsi_cmd_pdus: conn stats - num scsicmd pdus sent ++ * @num_scsi_resp_pdus: conn stats - num scsicmd pdus received ++ * @num_nopout_pdus: conn stats - num nopout pdus sent ++ * @num_nopin_pdus conn stats - num nopout pdus received: ++ * @num_reject_pdus: conn stats - num reject pdus received ++ * @num_async_pdus: conn stats - num async pdus received ++ * @num_dataout_pdus: conn stats - num dout pdus sent ++ * @num_r2t_pdus: conn stats - num r2t pdus received ++ * @num_datain_pdus: conn stats - num din pdus received ++ * @num_snack_pdus: conn stats - num snack pdus received ++ * @num_text_req_pdus: conn stats - num text pdus sent ++ * @num_text_resp_pdus: conn stats - num text pdus received ++ * @num_tmf_req_pdus: conn stats - num tmf pdus sent ++ * @num_tmf_resp_pdus: conn stats - num tmf pdus received ++ * @num_logout_req_pdus: conn stats - num logout pdus sent ++ * @num_logout_resp_pdus: conn stats - num logout pdus received ++ * ++ * iSCSI connection structure ++ */ ++struct bnx2i_conn { ++ struct list_head link; ++ struct bnx2i_sess *sess; ++ struct iscsi_cls_conn *cls_conn; ++ ++ u32 state; ++ #define CONN_STATE_IDLE 0x00 ++ #define CONN_STATE_XPORT_READY 0x01 ++ #define CONN_STATE_IN_LOGIN 0x02 ++ #define CONN_STATE_FFP_STATE 0x04 ++ #define CONN_STATE_IN_LOGOUT 0x08 ++ #define CONN_STATE_IN_CLEANUP 0x10 ++ #define CONN_STATE_XPORT_FREEZE 0x20 ++ #define CONN_STATE_STOPPED 0x80 ++ atomic_t stop_state; ++ u32 stage; ++ u32 in_shutdown; ++ ++ u32 lead_conn; ++ u32 conn_cid; ++ ++ struct timer_list poll_timer; ++ void (*ring_doorbell)(struct bnx2i_conn *); ++ /* ++ * Following are iSCSI sequencing & operational parameters ++ */ ++ u32 exp_statsn; ++ #define STATSN_UPDATE_SIGNATURE 0xFABCAFE ++ u32 header_digest_en; ++ u32 data_digest_en; ++ u32 max_data_seg_len_xmit; /* Target */ ++ u32 max_data_seg_len_recv; /* Initiator */ ++ int ifmarker_enable; ++ int ofmarker_enable; ++ int persist_port; ++ char *persist_address; ++ ++ u32 iscsi_conn_cid; ++ #define BNX2I_CID_RESERVED 0x5AFF ++ u32 fw_cid; ++ ++ /* ++ * Queue Pair (QP) related structure elements. ++ */ ++ struct bnx2i_endpoint *ep; ++ ++ atomic_t worker_running; ++ atomic_t worker_enabled; ++ atomic_t worker_enabled_cnt; ++ atomic_t worker_disabled_cnt; ++#ifdef __VMKLNX__ ++ struct tasklet_struct conn_tasklet; ++ char isid[13]; ++#else ++ struct work_struct conn_worker; ++#endif ++/* DEBUG ONLY */ ++ u32 tasklet_freeze; ++ int tasklet_state; ++ int tasklet_tmf_exit; ++ int tasklet_timeslice_exit; ++ int tasklet_reschedule; ++ int tasklet_entry; ++ int cqe_process_state; ++ unsigned long cqe_process_jiffies; ++ int tasklet_loop; ++ unsigned long que_jiff; ++ unsigned long cqe_jiff; ++ unsigned long task_jiff; ++ ++ /* ++ * Buffer for login negotiation process ++ */ ++ struct generic_pdu_resc gen_pdu; ++ ++ u32 nopout_num_scsi_cmds; ++ /* ++ * Connection Statistics ++ */ ++ u64 total_data_octets_sent; ++ u64 total_data_octets_rcvd; ++ u32 num_login_req_pdus; ++ u32 num_login_resp_pdus; ++ u32 num_scsi_cmd_pdus; ++ u32 num_scsi_resp_pdus; ++ u32 num_nopout_pdus; ++ u32 num_nopin_pdus; ++ u32 num_reject_pdus; ++ u32 num_async_pdus; ++ u32 num_dataout_pdus; ++ u32 num_r2t_pdus; ++ u32 num_datain_pdus; ++ u32 num_snack_pdus; ++ u32 num_text_req_pdus; ++ u32 num_text_resp_pdus; ++ u32 num_tmf_req_pdus; ++ u32 num_tmf_resp_pdus; ++ u32 num_logout_req_pdus; ++ u32 num_logout_resp_pdus; ++}; ++ ++ ++ ++/** ++ * struct bnx2i_sess - iscsi session structure ++ * ++ * @link: list head to link elements ++ * @hba: adapter structure pointer ++ * @shost: scsi host pointer ++ * @state: flag to track session state ++ * @recovery_state: recovery state identifier ++ * @old_recovery_state: old recovery state identifier ++ * @tmf_active: TMF is active on this session ++ * @lock: session lock to synchronize access ++ * @abort_timer: TMF timer ++ * @er_wait: wait queue for recovery process ++ * @cmd_pages: table to track pages allocated for cmd struct ++ * @pend_cmds: pend command list ++ * @num_pend_cmds: number of pend command ++ * @free_cmds: free command list ++ * @num_free_cmds: num free commands ++ * @allocated_cmds: total number of allocated commands ++ * @sq_size: SQ size ++ * @itt_q: ITT queue ++ * @bd_resc_page: table to track BD resource page memory ++ * @bd_tbl_list: BD table list ++ * @bd_tbl_active: active BD table list ++ * @active_cmds: active command list ++ * @num_active_cmds: num active commands ++ * @cmdsn: iscsi command sequence number ++ * @exp_cmdsn: iscsi expected command sequence number ++ * @max_cmdsn: iscsi max command sequence number ++ * @initial_r2t: intial R2T is enabled/disable ++ * @max_r2t: maximun outstanding T2T ++ * @imm_data: indicates if immediate data is enabled ++ * @first_burst_len: negotiated first burst length ++ * @max_burst_len: negotiated max burst length ++ * @time2wait: time 2 wait value ++ * @time2retain: time 2 retain value ++ * @pdu_inorder: indicated if PDU order needs to be maintained ++ * @dataseq_inorder: indicated if data sequence order needs to be ++ * maintained ++ * @erl: supported error recovery level ++ * @tgt_prtl_grp: target portal group tag ++ * @target_name: target name ++ * @isid: isid for this session ++ * @tsih: target returned TSIH ++ * @lead_conn: points to lead connection pointer ++ * @conn_list: list of connection belonging to this session ++ * @num_active_conn: num active connections ++ * @max_conns: maximun connection per session ++ * @violation_notified: bit mask used to track iscsi error/warning messages ++ * already printed out ++ * iSCSI Session Structure ++ */ ++struct bnx2i_sess { ++ struct list_head link; ++ struct bnx2i_hba *hba; ++#ifdef __VMKLNX__ ++ struct iscsi_cls_session *cls_sess; ++#else ++ struct Scsi_Host *shost; ++#endif ++ unsigned long timestamp; ++ unsigned long worker_time_slice; ++ u32 state; ++ #define BNX2I_SESS_INITIAL 0x01 ++ #define BNX2I_SESS_IN_FFP 0x02 ++ #define BNX2I_SESS_IN_RECOVERY 0x04 ++ #define BNX2I_SESS_IN_SHUTDOWN 0x08 ++ #define BNX2I_SESS_IN_LOGOUT 0x40 ++#ifdef __VMKLNX__ ++ /* Do not notify device offline to vmkernel to until ++ * iscsi transport calls destroy_session() ++ */ ++ #define BNX2I_SESS_DESTROYED 0x80 ++ /* if session encounters an error before transitioning ++ * to FFP, target_destroy() will be called before ++ * session_destroy() and this requires another flag ++ * to identify this to make adjustments as to how ++ * resources will be freed ++ */ ++ #define BNX2I_SESS_TARGET_DESTROYED 0x100 ++#endif ++ #define is_sess_active(_sess) \ ++ (((_sess)->state & BNX2I_SESS_IN_FFP)) ++ unsigned long recovery_state; ++ #define ISCSI_SESS_RECOVERY_START 0x01 ++ #define ISCSI_SESS_RECOVERY_OPEN_ISCSI 0x02 ++ #define ISCSI_SESS_RECOVERY_COMPLETE 0x04 ++ #define ISCSI_SESS_RECOVERY_FAILED 0x08 ++ unsigned long old_recovery_state; ++ atomic_t tmf_active; ++ ++#ifndef _USE_ITT_QUE ++ struct bnx2i_cmd **itt_cmd; ++ #define get_cmnd(sess, itt) sess->itt_cmd[itt] ++#endif ++ ++ spinlock_t lock; /* protects session structure */ ++ struct mutex tmf_mutex; ++ ++ /* Command abort timer */ ++ struct timer_list abort_timer; ++ /* event wait queue used during error recovery */ ++ wait_queue_head_t er_wait; ++ ++ /* ++ * Per session command (task) structure management ++ */ ++ void *cmd_pages[MAX_PAGES_PER_CTRL_STRUCT_POOL]; ++ struct list_head free_cmds; ++ int num_free_cmds; ++ int allocated_cmds; ++ ++ int sq_size; ++#ifdef _USE_ITT_QUEUE ++ struct itt_queue itt_q; ++ #define MAX_BD_RESOURCE_PAGES 8 ++#endif ++ ++ struct list_head bd_resc_page; ++ void *bdt_dma_info; ++ struct list_head bdt_dma_resc; ++ struct list_head bd_tbl_list; ++ struct list_head bd_tbl_active; ++ ++ /* ++ * command queue management ++ */ ++ atomic_t login_noop_pending; ++ atomic_t tmf_pending; ++ atomic_t logout_pending; ++ atomic_t nop_resp_pending; ++ struct bnx2i_cmd *login_nopout_cmd; ++ struct bnx2i_cmd *scsi_tmf_cmd; ++ struct bnx2i_cmd *nopout_resp_cmd; ++ ++ void *task_list_mem; ++ struct list_head scsi_task_list; ++ struct list_head pend_cmd_list; ++ u32 pend_cmd_count; ++ struct list_head active_cmd_list; ++ u32 active_cmd_count; ++ ++ /* ++ * iSCSI session related sequencing parameters. ++ */ ++ unsigned int cmdsn; ++ unsigned int exp_cmdsn; ++ unsigned int max_cmdsn; ++ ++ /* ++ * Following pointers are linked to corresponding entry in ++ * operational parameter table associated with this session. ++ * These are to be filled when session becomes operational (FFP). ++ */ ++ int initial_r2t; ++ int max_r2t; ++ int imm_data; ++ u32 first_burst_len; ++ u32 max_burst_len; ++ int time2wait; ++ int time2retain; ++ int pdu_inorder; ++ int dataseq_inorder; ++ int erl; ++ int tgt_prtl_grp; ++ char *target_name; ++ ++ unsigned char isid[13]; ++ unsigned short tsih; ++ ++ struct bnx2i_conn *lead_conn; ++ struct list_head conn_list; ++ u32 num_active_conn; ++ u32 max_conns; ++ ++ /* Driver private statistics */ ++ u64 violation_notified; ++ ++ unsigned long last_nooput_requested; ++ unsigned long last_nooput_posted; ++ unsigned long last_noopin_indicated; ++ unsigned long last_noopin_processed; ++ u32 last_nooput_sn; ++ u32 noopout_resp_count; ++ u32 unsol_noopout_count; ++ int noopout_requested_count; ++ int noopout_posted_count; ++ int noopin_indicated_count; ++ int noopin_processed_count; ++ int tgt_noopin_count; ++}; ++ ++ ++ ++/** ++ * struct iscsi_cid_queue - Per adapter iscsi cid queue ++ * ++ * @cid_que_base: queue base memory ++ * @cid_que: queue memory pointer ++ * @cid_q_prod_idx: produce index ++ * @cid_q_cons_idx: consumer index ++ * @cid_q_max_idx: max index. used to detect wrap around condition ++ * @cid_free_cnt: queue size ++ * @conn_cid_tbl: iscsi cid to conn structure mapping table ++ * ++ * Per adapter iSCSI CID Queue ++ */ ++struct iscsi_cid_queue { ++ void *cid_que_base; ++ u32 *cid_que; ++ u32 cid_q_prod_idx; ++ u32 cid_q_cons_idx; ++ u32 cid_q_max_idx; ++ u32 cid_free_cnt; ++ struct bnx2i_conn **conn_cid_tbl; ++}; ++ ++ ++/** ++ * struct bnx2i_hba - bnx2i adapter structure ++ * ++ * @link: list head to link elements ++ * @cnic: pointer to cnic device ++ * @pcidev: pointer to pci dev ++ * @netdev: pointer to netdev structure ++ * @regview: mapped PCI register space ++ * @class_dev: class dev to operate sysfs node ++ * @age: age, incremented by every recovery ++ * @cnic_dev_type: cnic device type, 5706/5708/5709/57710 ++ * @mail_queue_access: mailbox queue access mode, applicable to 5709 only ++ * @reg_with_cnic: indicates whether the device is register with CNIC ++ * @adapter_state: adapter state, UP, GOING_DOWN, LINK_DOWN ++ * @mtu_supported: Ethernet MTU supported ++ * @scsi_template: pointer to scsi host template ++ * @iscsi_transport: pointer to iscsi transport template ++ * @shost_template: pointer to shost template ++ * @max_sqes: SQ size ++ * @max_rqes: RQ size ++ * @max_cqes: CQ size ++ * @num_ccell: number of command cells per connection ++ * @active_sess: active session list head ++ * @num_active_sess: number of active connections ++ * @ofld_conns_active: active connection list ++ * @max_active_conns: max offload connections supported by this device ++ * @cid_que: iscsi cid queue ++ * @ep_rdwr_lock: read / write lock to synchronize various ep lists ++ * @ep_ofld_list: connection list for pending offload completion ++ * @ep_destroy_list: connection list for pending offload completion ++ * @mp_bd_tbl: BD table to be used with middle path requests ++ * @mp_bd_dma: DMA address of 'mp_bd_tbl' memory buffer ++ * @dummy_buffer: Dummy buffer to be used with zero length scsicmd reqs ++ * @dummy_buf_dma: DMA address of 'dummy_buffer' memory buffer ++ * @lock: lock to synchonize access to hba structure ++ * @hba_timer: timer block ++ * @eh_wait: wait queue to be used during error handling ++ * @err_rec_task: error handling worker ++ * @sess_recov_list: session list which are queued for recovery ++ * @sess_recov_prod_idx: producer index to manage session recovery list ++ * @sess_recov_cons_idx: producer index to manage session recovery list ++ * @sess_recov_max_idx: max index to manage session recovery list ++ * @mac_addr: MAC address ++ * @conn_teardown_tmo: connection teardown timeout ++ * @conn_ctx_destroy_tmo: connection context destroy timeout ++ * @hba_shutdown_tmo: hba shutdown cleanup timeout ++ * @pci_did: PCI device ID ++ * @pci_vid: PCI vendor ID ++ * @pci_sdid: PCI subsystem device ID ++ * @pci_svid: PCI subsystem vendor ID ++ * @pci_func: PCI function number in system pci tree ++ * @pci_devno: PCI device number in system pci tree ++ * @num_wqe_sent: statistic counter, total wqe's sent ++ * @num_cqe_rcvd: statistic counter, total cqe's received ++ * @num_intr_claimed: statistic counter, total interrupts claimed ++ * @link_changed_count: statistic counter, num of link change notifications ++ * received ++ * @ipaddr_changed_count: statistic counter, num times IP address changed while ++ * at least one connection is offloaded ++ * @num_sess_opened: statistic counter, total num sessions opened ++ * @num_conn_opened: statistic counter, total num conns opened on this hba ++ * ++ * Adapter Data Structure ++ */ ++struct bnx2i_hba { ++ struct list_head link; ++ struct cnic_dev *cnic; ++ struct pci_dev *pcidev; ++ struct net_device *netdev; ++ void __iomem *regview; ++ struct class_device class_dev; ++ u32 age; ++ unsigned long cnic_dev_type; ++ #define BNX2I_NX2_DEV_5706 0x0 ++ #define BNX2I_NX2_DEV_5708 0x1 ++ #define BNX2I_NX2_DEV_5709 0x2 ++ #define BNX2I_NX2_DEV_57710 0x3 ++ u32 mail_queue_access; ++ #define BNX2I_MQ_KERNEL_MODE 0x0 ++ #define BNX2I_MQ_KERNEL_BYPASS_MODE 0x1 ++ #define BNX2I_MQ_BIN_MODE 0x2 ++ unsigned long reg_with_cnic; ++ #define BNX2I_CNIC_REGISTERED 1 ++ ++ unsigned long adapter_state; ++ #define ADAPTER_STATE_UP 0 ++ #define ADAPTER_STATE_GOING_DOWN 1 ++ #define ADAPTER_STATE_LINK_DOWN 2 ++ #define ADAPTER_STATE_INIT_FAILED 31 ++ unsigned int mtu_supported; ++ #define BNX2I_MAX_MTU_SUPPORTED 9000 ++ ++ struct scsi_host_template *scsi_template; ++ struct iscsi_transport *iscsi_transport; ++#ifdef __VMKLNX__ ++ #define BRCM_ISCSI_XPORT_NAME_PREFIX "bnx2i" ++#else ++ #define BRCM_ISCSI_XPORT_NAME_PREFIX "bcm570x" ++#endif ++ #define BRCM_ISCSI_XPORT_NAME_SIZE_MAX 128 ++ struct scsi_transport_template *shost_template; ++ ++#ifdef __VMKLNX__ ++ struct Scsi_Host *shost; ++ u32 target_id; ++ u32 channel_id; ++ struct device vm_pcidev; ++#endif ++ ++ u32 max_sqes; ++ u32 max_rqes; ++ u32 max_cqes; ++ u32 num_ccell; ++ ++#ifdef __VMKLNX__ ++ struct timer_list hba_poll_timer; ++#endif ++ ++ /* different page table setup requirments for 5771x and 570x */ ++ void (*setup_pgtbl)(struct bnx2i_hba *hba, ++ struct bnx2i_dma *dma, ++ int pgtbl_off); ++ ++ struct list_head active_sess; ++ int num_active_sess; ++ int ofld_conns_active; ++ ++ int max_active_conns; ++ struct iscsi_cid_queue cid_que; ++ ++#ifndef __VMKLNX__ ++ rwlock_t ep_rdwr_lock; ++#endif ++ struct list_head ep_ofld_list; ++ struct list_head ep_destroy_list; ++ ++ /* ++ * BD table to be used with MP (Middle Path requests. ++ */ ++ struct bnx2i_dma mp_dma_buf; ++ ++ spinlock_t lock; /* protects hba structure access */ ++ spinlock_t net_dev_lock;/* sync net device access */ ++ ++ /* Error handling */ ++ struct timer_list hba_timer; ++ wait_queue_head_t eh_wait; ++ struct work_struct err_rec_task; ++ struct bnx2i_sess **sess_recov_list; ++ int sess_recov_prod_idx; ++ int sess_recov_cons_idx; ++ int sess_recov_max_idx; ++ ++ unsigned char mac_addr[MAX_ADDR_LEN]; ++ ++ int conn_teardown_tmo; ++ int conn_ctx_destroy_tmo; ++ int hba_shutdown_tmo; ++ unsigned int ctx_ccell_tasks; ++ /* ++ * PCI related info. ++ */ ++ u16 pci_did; ++ u16 pci_vid; ++ u16 pci_sdid; ++ u16 pci_svid; ++ u16 pci_func; ++ u16 pci_devno; ++ ++ /* ++ * Following are a bunch of statistics useful during development ++ * and later stage for score boarding. ++ */ ++ u32 num_wqe_sent; ++ u32 num_cqe_rcvd; ++ u32 num_intr_claimed; ++ u32 link_changed_count; ++ u32 ipaddr_changed_count; ++ u32 num_sess_opened; ++ u32 num_conn_opened; ++}; ++ ++ ++/******************************************************************************* ++ * QP [ SQ / RQ / CQ ] info. ++ ******************************************************************************/ ++ ++/* ++ * SQ/RQ/CQ generic structure definition ++ */ ++struct sqe { ++ u8 sqe_byte[BNX2I_SQ_WQE_SIZE]; ++}; ++ ++struct rqe { ++ u8 rqe_byte[BNX2I_RQ_WQE_SIZE]; ++}; ++ ++struct cqe { ++ u8 cqe_byte[BNX2I_CQE_SIZE]; ++}; ++ ++ ++enum { ++#if defined(__LITTLE_ENDIAN) ++ CNIC_EVENT_COAL_INDEX = 0x0, ++ CNIC_SEND_DOORBELL = 0x4, ++ CNIC_EVENT_CQ_ARM = 0x7, ++ CNIC_RECV_DOORBELL = 0x8 ++#elif defined(__BIG_ENDIAN) ++ CNIC_EVENT_COAL_INDEX = 0x2, ++ CNIC_SEND_DOORBELL = 0x6, ++ CNIC_EVENT_CQ_ARM = 0x4, ++ CNIC_RECV_DOORBELL = 0xa ++#endif ++}; ++ ++ ++ ++/* ++ * CQ DB ++ */ ++struct bnx2x_iscsi_cq_pend_cmpl { ++ /* CQ producer, updated by Ustorm */ ++ u16 ustrom_prod; ++ /* CQ pending completion counter */ ++ u16 pend_cntr; ++}; ++ ++ ++struct bnx2i_5771x_cq_db { ++ struct bnx2x_iscsi_cq_pend_cmpl qp_pend_cmpl[BNX2X_MAX_CQS]; ++ /* CQ pending completion ITT array */ ++ u16 itt[BNX2X_MAX_CQS]; ++ /* Cstorm CQ sequence to notify array, updated by driver */; ++ u16 sqn[BNX2X_MAX_CQS]; ++ u32 reserved[4] /* 16 byte allignment */; ++}; ++ ++ ++struct bnx2i_5771x_sq_rq_db { ++ u16 prod_idx; ++ u8 reserved0[14]; /* Pad structure size to 16 bytes */ ++}; ++ ++ ++struct bnx2i_5771x_dbell_hdr { ++ u8 header; ++ /* 1 for rx doorbell, 0 for tx doorbell */ ++#define B577XX_DOORBELL_HDR_RX (0x1<<0) ++#define B577XX_DOORBELL_HDR_RX_SHIFT 0 ++ /* 0 for normal doorbell, 1 for advertise wnd doorbell */ ++#define B577XX_DOORBELL_HDR_DB_TYPE (0x1<<1) ++#define B577XX_DOORBELL_HDR_DB_TYPE_SHIFT 1 ++ /* rdma tx only: DPM transaction size specifier (64/128/256/512B) */ ++#define B577XX_DOORBELL_HDR_DPM_SIZE (0x3<<2) ++#define B577XX_DOORBELL_HDR_DPM_SIZE_SHIFT 2 ++ /* connection type */ ++#define B577XX_DOORBELL_HDR_CONN_TYPE (0xF<<4) ++#define B577XX_DOORBELL_HDR_CONN_TYPE_SHIFT 4 ++}; ++ ++struct bnx2i_5771x_dbell { ++ struct bnx2i_5771x_dbell_hdr dbell; ++ u8 pad[3]; ++ ++}; ++ ++ ++/** ++ * struct qp_info - QP (share queue region) atrributes structure ++ * ++ * @ctx_base: ioremapped pci register base to access doorbell register ++ * pertaining to this offloaded connection ++ * @sq_virt: virtual address of send queue (SQ) region ++ * @sq_phys: DMA address of SQ memory region ++ * @sq_mem_size: SQ size ++ * @sq_prod_qe: SQ producer entry pointer ++ * @sq_cons_qe: SQ consumer entry pointer ++ * @sq_first_qe: virtaul address of first entry in SQ ++ * @sq_last_qe: virtaul address of last entry in SQ ++ * @sq_prod_idx: SQ producer index ++ * @sq_cons_idx: SQ consumer index ++ * @sqe_left: number sq entry left ++ * @sq_pgtbl_virt: page table describing buffer consituting SQ region ++ * @sq_pgtbl_phys: dma address of 'sq_pgtbl_virt' ++ * @sq_pgtbl_size: SQ page table size ++ * @cq_virt: virtual address of completion queue (CQ) region ++ * @cq_phys: DMA address of RQ memory region ++ * @cq_mem_size: CQ size ++ * @cq_prod_qe: CQ producer entry pointer ++ * @cq_cons_qe: CQ consumer entry pointer ++ * @cq_first_qe: virtaul address of first entry in CQ ++ * @cq_last_qe: virtaul address of last entry in CQ ++ * @cq_prod_idx: CQ producer index ++ * @cq_cons_idx: CQ consumer index ++ * @cqe_left: number cq entry left ++ * @cqe_size: size of each CQ entry ++ * @cqe_exp_seq_sn: next expected CQE sequence number ++ * @cq_pgtbl_virt: page table describing buffer consituting CQ region ++ * @cq_pgtbl_phys: dma address of 'cq_pgtbl_virt' ++ * @cq_pgtbl_size: CQ page table size ++ * @rq_virt: virtual address of receive queue (RQ) region ++ * @rq_phys: DMA address of RQ memory region ++ * @rq_mem_size: RQ size ++ * @rq_prod_qe: RQ producer entry pointer ++ * @rq_cons_qe: RQ consumer entry pointer ++ * @rq_first_qe: virtaul address of first entry in RQ ++ * @rq_last_qe: virtaul address of last entry in RQ ++ * @rq_prod_idx: RQ producer index ++ * @rq_cons_idx: RQ consumer index ++ * @rqe_left: number rq entry left ++ * @rq_pgtbl_virt: page table describing buffer consituting RQ region ++ * @rq_pgtbl_phys: dma address of 'rq_pgtbl_virt' ++ * @rq_pgtbl_size: RQ page table size ++ * ++ * queue pair (QP) is a per connection shared data structure which is used ++ * to send work requests (SQ), receive completion notifications (CQ) ++ * and receive asynchoronous / scsi sense info (RQ). 'qp_info' structure ++ * below holds queue memory, consumer/producer indexes and page table ++ * information ++ */ ++struct qp_info { ++ void __iomem *ctx_base; ++#define DPM_TRIGER_TYPE 0x40 ++ ++#define BNX2I_570x_QUE_DB_SIZE 0 ++#define BNX2I_5771x_QUE_DB_SIZE 16 ++ struct bnx2i_dma sq_dma; ++#define sq_virt sq_dma.mem ++ struct sqe *sq_prod_qe; ++ struct sqe *sq_first_qe; ++ struct sqe *sq_last_qe; ++ u16 sq_prod_idx; ++ ++ struct bnx2i_dma cq_dma; ++#define cq_virt cq_dma.mem ++ struct cqe *cq_cons_qe; ++ struct cqe *cq_first_qe; ++ struct cqe *cq_last_qe; ++ u16 cq_cons_idx; ++ u32 cqe_left; ++ u32 cqe_size; ++ u32 cqe_exp_seq_sn; ++ ++ struct bnx2i_dma rq_dma; ++#define rq_virt rq_dma.mem ++ ++ struct rqe *rq_prod_qe; ++ struct rqe *rq_cons_qe; ++ struct rqe *rq_first_qe; ++ struct rqe *rq_last_qe; ++ u16 rq_prod_idx; ++ u16 rq_cons_idx; ++ u32 rqe_left; ++}; ++ ++ ++ ++/* ++ * CID handles ++ */ ++struct ep_handles { ++ u32 fw_cid; ++ u32 drv_iscsi_cid; ++ u16 pg_cid; ++ u16 rsvd; ++}; ++ ++ ++/** ++ * struct bnx2i_endpoint - representation of tcp connection in NX2 world ++ * ++ * @link: list head to link elements ++ * @hba: adapter to which this connection belongs ++ * @conn: iscsi connection this EP is linked to ++ * @sess: iscsi session this EP is linked to ++ * @cm_sk: cnic sock struct ++ * @hba_age: age to detect if 'iscsid' issues ep_disconnect() ++ * after HBA reset is completed by bnx2i/cnic/bnx2 ++ * modules ++ * @state: tracks offload connection state machine ++ * @tcp_port: Local TCP port number used in this connection ++ * @qp: QP information ++ * @ids: contains chip allocated *context id* & driver assigned ++ * *iscsi cid* ++ * @ofld_timer: offload timer to detect timeout ++ * @ofld_wait: wait queue ++ * ++ * Endpoint Structure - equivalent of tcp socket structure ++ */ ++struct bnx2i_endpoint { ++ struct list_head link; ++ struct bnx2i_hba *hba; ++ struct bnx2i_conn *conn; ++ struct bnx2i_sess *sess; ++ struct cnic_sock *cm_sk; ++ u32 hba_age; ++ u32 state; ++ #define EP_STATE_IDLE 0x00000000 ++ #define EP_STATE_PG_OFLD_START 0x00000001 ++ #define EP_STATE_PG_OFLD_COMPL 0x00000002 ++ #define EP_STATE_OFLD_START 0x00000004 ++ #define EP_STATE_OFLD_COMPL 0x00000008 ++ #define EP_STATE_CONNECT_START 0x00000010 ++ #define EP_STATE_CONNECT_COMPL 0x00000020 ++ #define EP_STATE_ULP_UPDATE_START 0x00000040 ++ #define EP_STATE_ULP_UPDATE_COMPL 0x00000080 ++ #define EP_STATE_DISCONN_START 0x00000100 ++ #define EP_STATE_DISCONN_COMPL 0x00000200 ++ #define EP_STATE_CLEANUP_START 0x00000400 ++ #define EP_STATE_CLEANUP_CMPL 0x00000800 ++ #define EP_STATE_TCP_FIN_RCVD 0x00001000 ++ #define EP_STATE_TCP_RST_RCVD 0x00002000 ++ #define EP_STATE_PG_OFLD_FAILED 0x01000000 ++ #define EP_STATE_ULP_UPDATE_FAILED 0x02000000 ++ #define EP_STATE_CLEANUP_FAILED 0x04000000 ++ #define EP_STATE_OFLD_FAILED 0x08000000 ++ #define EP_STATE_CONNECT_FAILED 0x10000000 ++ #define EP_STATE_DISCONN_TIMEDOUT 0x20000000 ++ ++ unsigned long timestamp; ++ int teardown_mode; ++#define BNX2I_ABORTIVE_SHUTDOWN 0 ++#define BNX2I_GRACEFUL_SHUTDOWN 1 ++ u16 tcp_port; ++ ++ struct qp_info qp; ++ struct ep_handles ids; ++ #define ep_iscsi_cid ids.drv_iscsi_cid ++ #define ep_cid ids.fw_cid ++ #define ep_pg_cid ids.pg_cid ++ struct timer_list ofld_timer; ++ wait_queue_head_t ofld_wait; ++}; ++ ++ ++static inline struct Scsi_Host *bnx2i_conn_get_shost(struct bnx2i_conn *conn) ++{ ++ struct Scsi_Host *shost; ++ ++#if defined(__VMKLNX__) ++ shost = conn->sess->hba->shost; ++#else ++ shost = conn->sess->shost; ++#endif ++ return shost; ++} ++ ++static inline struct Scsi_Host *bnx2i_sess_get_shost(struct bnx2i_sess *sess) ++{ ++ struct Scsi_Host *shost; ++ ++#if defined(__VMKLNX__) ++ shost = sess->hba->shost; ++#else ++ shost = sess->shost; ++#endif ++ return shost; ++} ++ ++extern unsigned int cmd_cmpl_per_work; ++ ++/* ++ * Function Prototypes ++ */ ++extern int bnx2i_reg_device; ++void bnx2i_identify_device(struct bnx2i_hba *hba); ++void bnx2i_register_device(struct bnx2i_hba *hba, int force); ++void bnx2i_check_nx2_dev_busy(void); ++#ifdef __VMKLNX__ ++void bnx2i_ep_disconnect(vmk_int64 ep_handle); ++#else ++void bnx2i_ep_disconnect(uint64_t ep_handle); ++#endif ++ ++void bnx2i_ulp_init(struct cnic_dev *dev); ++void bnx2i_ulp_exit(struct cnic_dev *dev); ++void bnx2i_start(void *handle); ++void bnx2i_stop(void *handle); ++void bnx2i_reg_dev_all(void); ++void bnx2i_unreg_dev_all(void); ++struct bnx2i_hba *get_adapter_list_head(void); ++ ++int bnx2i_ioctl_init(void); ++void bnx2i_ioctl_cleanup(void); ++ ++struct bnx2i_conn *bnx2i_get_conn_from_id(struct bnx2i_hba *hba, ++ u16 iscsi_cid); ++ ++int bnx2i_alloc_ep_pool(void); ++void bnx2i_release_ep_pool(void); ++struct bnx2i_endpoint *bnx2i_ep_ofld_list_next(struct bnx2i_hba *hba); ++struct bnx2i_endpoint *bnx2i_ep_destroy_list_next(struct bnx2i_hba *hba); ++ ++struct bnx2i_cmd *bnx2i_alloc_cmd(struct bnx2i_sess *sess); ++void bnx2i_free_cmd(struct bnx2i_sess *sess, struct bnx2i_cmd *cmd); ++int bnx2i_tcp_conn_active(struct bnx2i_conn *conn); ++ ++struct bnx2i_hba *bnx2i_find_hba_for_cnic(struct cnic_dev *cnic); ++struct bnx2i_hba *bnx2i_get_hba_from_template( ++ struct scsi_transport_template *scsit); ++ ++struct bnx2i_hba *bnx2i_alloc_hba(struct cnic_dev *cnic); ++void bnx2i_free_hba(struct bnx2i_hba *hba); ++int bnx2i_process_new_cqes(struct bnx2i_conn *conn, int soft_irq, int num_cqes); ++void bnx2i_process_scsi_resp(struct bnx2i_cmd *cmd, ++ struct iscsi_cmd_response *resp_cqe); ++int bnx2i_process_nopin(struct bnx2i_conn *conn, ++ struct bnx2i_cmd *cmnd, char *data_buf, int data_len); ++ ++ ++void bnx2i_update_cmd_sequence(struct bnx2i_sess *sess, u32 expsn, u32 maxsn); ++ ++void bnx2i_get_rq_buf(struct bnx2i_conn *conn, char *ptr, int len); ++void bnx2i_put_rq_buf(struct bnx2i_conn *conn, int count); ++ ++int bnx2i_indicate_login_resp(struct bnx2i_conn *conn); ++int bnx2i_indicate_logout_resp(struct bnx2i_conn *conn); ++int bnx2i_indicate_async_mesg(struct bnx2i_conn *conn); ++ ++void bnx2i_iscsi_unmap_sg_list(struct bnx2i_hba *hba, struct bnx2i_cmd *cmd); ++ ++void bnx2i_start_iscsi_hba_shutdown(struct bnx2i_hba *hba); ++void bnx2i_iscsi_handle_ip_event(struct bnx2i_hba *hba); ++int bnx2i_do_iscsi_sess_recovery(struct bnx2i_sess *sess, int err_code); ++void bnx2i_return_failed_command(struct bnx2i_sess *sess, ++ struct scsi_cmnd *cmd, int resid, int err_code); ++ ++int bnx2i_get_tcp_port_requirements(void); ++void bnx2i_cleanup_tcp_port_mngr(void); ++void bnx2i_init_tcp_port_mngr(void); ++ ++int bnx2i_alloc_dma(struct bnx2i_hba *hba, struct bnx2i_dma *dma, ++ int size, int pgtbl_type, int pgtbl_off); ++void bnx2i_free_dma(struct bnx2i_hba *hba, struct bnx2i_dma *dma); ++int bnx2i_setup_mp_bdt(struct bnx2i_hba *hba); ++void bnx2i_free_mp_bdt(struct bnx2i_hba *hba); ++void bnx2i_init_ctx_dump_mem(struct bnx2i_hba *hba); ++void bnx2i_free_ctx_dump_mem(struct bnx2i_hba *hba); ++ ++extern int bnx2i_send_fw_iscsi_init_msg(struct bnx2i_hba *hba); ++extern int bnx2i_send_iscsi_login(struct bnx2i_conn *conn, ++ struct bnx2i_cmd *cmnd); ++extern int bnx2i_send_iscsi_text(struct bnx2i_conn *conn, ++ struct bnx2i_cmd *cmnd); ++extern int bnx2i_send_iscsi_tmf(struct bnx2i_conn *conn, ++ struct bnx2i_cmd *cmnd); ++extern int bnx2i_send_iscsi_scsicmd(struct bnx2i_conn *conn, ++ struct bnx2i_cmd *cmnd); ++extern int bnx2i_send_iscsi_nopout(struct bnx2i_conn *conn, ++ struct bnx2i_cmd *cmnd, ++ char *datap, int data_len); ++extern int bnx2i_send_iscsi_logout(struct bnx2i_conn *conn, ++ struct bnx2i_cmd *cmnd); ++extern void bnx2i_send_cmd_cleanup_req(struct bnx2i_hba *hba, ++ struct bnx2i_cmd *cmd); ++extern void bnx2i_send_conn_ofld_req(struct bnx2i_hba *hba, ++ struct bnx2i_endpoint *ep); ++extern void bnx2i_update_iscsi_conn(struct bnx2i_conn *conn); ++extern void bnx2i_send_conn_destroy(struct bnx2i_hba *hba, ++ struct bnx2i_endpoint *ep); ++extern void bnx2i_recovery_que_add_conn(struct bnx2i_hba *hba, ++ struct bnx2i_conn *conn); ++ ++extern int bnx2i_alloc_qp_resc(struct bnx2i_hba *hba, ++ struct bnx2i_endpoint *ep); ++extern void bnx2i_free_qp_resc(struct bnx2i_hba *hba, ++ struct bnx2i_endpoint *ep); ++extern void bnx2i_ep_ofld_timer(unsigned long data); ++struct bnx2i_endpoint *bnx2i_find_ep_in_ofld_list(struct bnx2i_hba *hba, ++ u32 iscsi_cid); ++struct bnx2i_endpoint *bnx2i_find_ep_in_destroy_list(struct bnx2i_hba *hba, ++ u32 iscsi_cid); ++void bnx2i_ring_sq_dbell_bnx2(struct bnx2i_conn *conn); ++void bnx2i_ring_sq_dbell_bnx2x(struct bnx2i_conn *conn); ++void bnx2i_map_ep_dbell_regs(struct bnx2i_endpoint *ep); ++ ++void bnx2i_arm_cq_event_coalescing(struct bnx2i_endpoint *ep, u8 action); ++ ++int bnx2i_register_xport(struct bnx2i_hba *hba); ++int bnx2i_deregister_xport(struct bnx2i_hba *hba); ++int bnx2i_free_iscsi_scsi_template(struct bnx2i_hba *hba); ++ ++/* Debug related function prototypes */ ++extern void bnx2i_print_pend_cmd_queue(struct bnx2i_conn *conn); ++extern void bnx2i_print_active_cmd_queue(struct bnx2i_conn *conn); ++extern void bnx2i_print_xmit_pdu_queue(struct bnx2i_conn *conn); ++extern void bnx2i_print_recv_state(struct bnx2i_conn *conn); ++ ++#ifndef _SYSFS_INCL_ ++#define bnx2i_setup_ictx_dump(__hba, __conn) do { } while (0) ++#define bnx2i_sysfs_setup() do { } while (0) ++#define bnx2i_sysfs_cleanup() do { } while (0) ++#define bnx2i_register_sysfs(__hba) 0 ++#define bnx2i_unregister_sysfs(__hba) do { } while (0) ++#define bnx2i_init_mips_idle_counters(__hba) do { } while (0) ++#else ++extern void bnx2i_setup_ictx_dump(struct bnx2i_hba *hba, ++ struct bnx2i_conn *conn); ++extern int bnx2i_sysfs_setup(void); ++extern void bnx2i_sysfs_cleanup(void); ++extern int bnx2i_register_sysfs(struct bnx2i_hba *hba); ++extern void bnx2i_unregister_sysfs(struct bnx2i_hba *hba); ++void bnx2i_init_mips_idle_counters(struct bnx2i_hba *hba); ++void bnx2i_tcp_port_new_entry(u16 tcp_port); ++ ++#endif ++ ++#endif +diff -r 14194bd97e8c drivers/scsi/bnx2i/bnx2i_hwi.c +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/scsi/bnx2i/bnx2i_hwi.c Tue Jun 16 11:09:42 2009 +0100 +@@ -0,0 +1,2584 @@ ++/* bnx2i_hwi.c: Broadcom NetXtreme II iSCSI driver. ++ * ++ * Copyright (c) 2006 - 2009 Broadcom Corporation ++ * ++ * 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. ++ * ++ * Written by: Anil Veerabhadrappa (anilgv@broadcom.com) ++ */ ++ ++#include "bnx2i.h" ++ ++extern unsigned int event_coal_min; ++ ++/** ++ * bnx2i_get_cid_num - ++ * @ep: endpoint pointer ++ * ++ * Only applicable to 57710 family of devices ++ **/ ++static u32 bnx2i_get_cid_num(struct bnx2i_endpoint *ep) ++{ ++ u32 cid; ++ ++ if (test_bit(BNX2I_NX2_DEV_57710, &ep->hba->cnic_dev_type)) ++ cid = ep->ep_cid; ++ else ++ cid = GET_CID_NUM(ep->ep_cid); ++ return cid; ++} ++ ++ ++/** ++ * bnx2i_adjust_qp_size - Adjust SQ/RQ/CQ size for 57710 device type ++ * @hba: Adapter for which adjustments is to be made ++ * ++ * Only applicable to 57710 family of devices ++ **/ ++static void bnx2i_adjust_qp_size(struct bnx2i_hba *hba) ++{ ++ u32 num_elements_per_pg; ++ ++ /* Only 5771x family requires SQ/CQ to be integral number of pages */ ++ if (test_bit(BNX2I_NX2_DEV_5706, &hba->cnic_dev_type) || ++ test_bit(BNX2I_NX2_DEV_5708, &hba->cnic_dev_type) || ++ test_bit(BNX2I_NX2_DEV_5709, &hba->cnic_dev_type)) ++ return; ++ ++ /* Adjust each queue size if the user selection does not ++ * yield integral num of page buffers ++ */ ++ /* adjust SQ */ ++ num_elements_per_pg = PAGE_SIZE / BNX2I_SQ_WQE_SIZE; ++ if (hba->max_sqes < num_elements_per_pg) ++ hba->max_sqes = num_elements_per_pg; ++ else if (hba->max_sqes % num_elements_per_pg) ++ hba->max_sqes = (hba->max_sqes + num_elements_per_pg - 1) & ++ ~(num_elements_per_pg - 1); ++ ++ /* adjust CQ */ ++ num_elements_per_pg = PAGE_SIZE / BNX2I_CQE_SIZE; ++ if (hba->max_cqes < num_elements_per_pg) ++ hba->max_cqes = num_elements_per_pg; ++ else if (hba->max_cqes % num_elements_per_pg) ++ hba->max_cqes = (hba->max_cqes + num_elements_per_pg - 1) & ++ ~(num_elements_per_pg - 1); ++ ++ /* adjust RQ */ ++ num_elements_per_pg = PAGE_SIZE / BNX2I_RQ_WQE_SIZE; ++ if (hba->max_rqes < num_elements_per_pg) ++ hba->max_rqes = num_elements_per_pg; ++ else if (hba->max_rqes % num_elements_per_pg) ++ hba->max_rqes = (hba->max_rqes + num_elements_per_pg - 1) & ++ ~(num_elements_per_pg - 1); ++} ++ ++ ++/** ++ * bnx2i_tcp_conn_active - check if underlying TCP connection is alive ++ * @conn: connection pointer ++ * ++ **/ ++int bnx2i_tcp_conn_active(struct bnx2i_conn *conn) ++{ ++ return (conn->ep && (conn->ep->state == EP_STATE_ULP_UPDATE_COMPL)); ++} ++ ++ ++/** ++ * bnx2i_get_link_state - get network interface link state ++ * @hba: adapter instance pointer ++ * ++ * updates adapter structure flag based on netdev state ++ **/ ++static void bnx2i_get_link_state(struct bnx2i_hba *hba) ++{ ++ if (test_bit(__LINK_STATE_NOCARRIER, &hba->netdev->state)) { ++ set_bit(ADAPTER_STATE_LINK_DOWN, &hba->adapter_state); ++ printk(KERN_ALERT "bnx2i: link down, hba %p, state %lx\n", hba, hba->adapter_state); ++ } else { ++ clear_bit(ADAPTER_STATE_LINK_DOWN, &hba->adapter_state); ++ printk(KERN_ALERT "bnx2i: link up, hba %p, state %lx\n", hba, hba->adapter_state); ++ } ++} ++ ++ ++/** ++ * bnx2i_iscsi_license_error - displays iscsi license related error message ++ * ++ * @hba: adapter instance pointer ++ * @error_code: error classification ++ * ++ * Puts out an error log when driver is unable to offload iscsi connection ++ * due to license restrictions ++ **/ ++static void bnx2i_iscsi_license_error(struct bnx2i_hba *hba, u32 error_code) ++{ ++ if (error_code == ISCSI_KCQE_COMPLETION_STATUS_ISCSI_NOT_SUPPORTED) ++ /* iSCSI offload not supported on this device */ ++ printk(KERN_ERR "bnx2i: iSCSI not supported, dev=%s\n", ++ hba->netdev->name); ++ if (error_code == ISCSI_KCQE_COMPLETION_STATUS_LOM_ISCSI_NOT_ENABLED) ++ /* iSCSI offload not supported on this LOM device */ ++ printk(KERN_ERR "bnx2i: LOM is not enable to " ++ "offload iSCSI connections, dev=%s\n", ++ hba->netdev->name); ++ set_bit(ADAPTER_STATE_INIT_FAILED, &hba->adapter_state); ++} ++ ++ ++extern unsigned int event_coal_div; ++ ++/** ++ * bnx2i_arm_cq_event_coalescing - arms CQ to enable EQ notification ++ * ++ * @ep: endpoint (transport indentifier) structure ++ * @action: action, ARM or DISARM. For now only ARM_CQE is used ++ * ++ * Arm'ing CQ will enable chip to generate global EQ events inorder to interrupt ++ * the driver. EQ event is generated CQ index is hit or at least 1 CQ is ++ * outstanding and on chip timer expires ++ **/ ++void bnx2i_arm_cq_event_coalescing(struct bnx2i_endpoint *ep, u8 action) ++{ ++ struct bnx2i_5771x_cq_db *cq_db; ++ u16 cq_index; ++ u16 next_index; ++ u32 num_active_cmds; ++ ++#ifndef _570X_ENABLE_EC_ ++ if (!test_bit(BNX2I_NX2_DEV_57710, &ep->hba->cnic_dev_type)) ++ return; ++#endif ++ ++ if (test_bit(BNX2I_NX2_DEV_57710, &ep->hba->cnic_dev_type)) { ++ cq_db = (struct bnx2i_5771x_cq_db*)ep->qp.cq_dma.pgtbl; ++ if (cq_db->sqn[0] && cq_db->sqn[0] != 0xFFFF) { ++ return; ++ } ++ } ++ ++ if ((action == CNIC_ARM_CQE) && ep->sess) { ++ num_active_cmds = ep->sess->active_cmd_count; ++ if (num_active_cmds <= event_coal_min) ++ next_index = 1; ++ else ++ next_index = event_coal_min + (num_active_cmds - event_coal_min) / event_coal_div ; ++ if (!next_index) ++ next_index = 1; ++ cq_index = ep->qp.cqe_exp_seq_sn + next_index - 1; ++ if (cq_index > ep->qp.cqe_size * 2) ++ cq_index -= ep->qp.cqe_size * 2; ++ if (!cq_index) ++ cq_index = 1; ++ ++#ifdef _570X_ENABLE_EC_ ++ if (test_bit(BNX2I_NX2_DEV_57710, &ep->hba->cnic_dev_type)) { ++#endif ++ cq_db = (struct bnx2i_5771x_cq_db*)ep->qp.cq_dma.pgtbl; ++ cq_db->sqn[0] = cq_index; ++#ifdef _570X_ENABLE_EC_ ++ return; ++ } ++ writew(cq_index, ep->qp.ctx_base + CNIC_EVENT_COAL_INDEX); ++#endif ++ } ++#ifdef _570X_ENABLE_EC_ ++ writeb(action, ep->qp.ctx_base + CNIC_EVENT_CQ_ARM); ++#endif ++} ++ ++ ++/** ++ * bnx2i_iscsi_license_error - copy RQ buffer contents to driver buffer ++ * ++ * @conn: iscsi connection on which RQ event occured ++ * @ptr: driver buffer to which RQ buffer contents is to ++ * be copied ++ * @len: length of valid data inside RQ buf ++ * ++ * Copies RQ buffer contents from shared (DMA'able) memory region to ++ * driver buffer. RQ is used to DMA unsolicitated iscsi pdu's and ++ * scsi sense info ++ **/ ++void bnx2i_get_rq_buf(struct bnx2i_conn *conn, char *ptr, int len) ++{ ++ if (conn->ep->qp.rqe_left) { ++ conn->ep->qp.rqe_left--; ++ memcpy(ptr, (u8 *) conn->ep->qp.rq_cons_qe, len); ++ ++ if (conn->ep->qp.rq_cons_qe == conn->ep->qp.rq_last_qe) { ++ conn->ep->qp.rq_cons_qe = conn->ep->qp.rq_first_qe; ++ conn->ep->qp.rq_cons_idx = 0; ++ } else { ++ conn->ep->qp.rq_cons_qe++; ++ conn->ep->qp.rq_cons_idx++; ++ } ++ } ++} ++ ++/** ++ * bnx2i_ring_577xx_doorbell - ring doorbell register to wake-up the ++ * processing engine ++ * @conn: iscsi connection ++ * ++ * Only applicable to 57710 family of devices ++ **/ ++void bnx2i_ring_577xx_doorbell(void __iomem *ctx_addr) ++{ ++ struct bnx2i_5771x_dbell dbell; ++ u32 msg; ++ ++ memset(&dbell, 0, sizeof(dbell)); ++ dbell.dbell.header = (B577XX_ISCSI_CONNECTION_TYPE << ++ B577XX_DOORBELL_HDR_CONN_TYPE_SHIFT); ++ msg = *((u32 *)&dbell); ++ /* TODO : get doorbell register mapping */ ++ writel(cpu_to_le32(msg), ctx_addr); ++} ++ ++ ++/** ++ * bnx2i_put_rq_buf - Replenish RQ buffer, if required ring on chip doorbell ++ * @conn: iscsi connection on which event to post ++ * @count: number of RQ buffer being posted to chip ++ * ++ * No need to ring hardware doorbell for 57710 family of devices ++ **/ ++void bnx2i_put_rq_buf(struct bnx2i_conn *conn, int count) ++{ ++ struct bnx2i_5771x_sq_rq_db *rq_db; ++ u16 hi_bit = (conn->ep->qp.rq_prod_idx & 0x8000); ++ ++ conn->ep->qp.rqe_left += count; ++ conn->ep->qp.rq_prod_idx &= 0x7FFF; ++ conn->ep->qp.rq_prod_idx += count; ++ ++ if (conn->ep->qp.rq_prod_idx > conn->sess->hba->max_rqes) { ++ conn->ep->qp.rq_prod_idx %= conn->sess->hba->max_rqes; ++ if (!hi_bit) ++ conn->ep->qp.rq_prod_idx |= 0x8000; ++ } else ++ conn->ep->qp.rq_prod_idx |= hi_bit; ++ ++ if (test_bit(BNX2I_NX2_DEV_57710, &conn->ep->hba->cnic_dev_type)) { ++ rq_db = (struct bnx2i_5771x_sq_rq_db *) ++ conn->ep->qp.rq_dma.pgtbl; ++ rq_db->prod_idx = conn->ep->qp.rq_prod_idx; ++ /* no need to ring hardware doorbell for 57710 */ ++ } else { ++ writew(conn->ep->qp.rq_prod_idx, ++ conn->ep->qp.ctx_base + CNIC_RECV_DOORBELL); ++ } ++ mmiowb(); ++} ++ ++ ++void bnx2i_ring_sq_dbell_bnx2(struct bnx2i_conn *conn) ++{ ++ struct qp_info *qp = &conn->ep->qp; ++ ++ wmb(); /* flush SQ WQE memory before the doorbell is rung */ ++ writew(qp->sq_prod_idx, qp->ctx_base + CNIC_SEND_DOORBELL); ++ mmiowb(); /* flush posted PCI writes */ ++} ++ ++ ++void bnx2i_ring_sq_dbell_bnx2x(struct bnx2i_conn *conn) ++{ ++ struct bnx2i_5771x_sq_rq_db *sq_db; ++ struct qp_info *qp = &conn->ep->qp; ++ ++ wmb(); /* flush SQ WQE memory before the doorbell is rung */ ++ sq_db = (struct bnx2i_5771x_sq_rq_db *) qp->sq_dma.pgtbl; ++ sq_db->prod_idx = qp->sq_prod_idx; ++ bnx2i_ring_577xx_doorbell(conn->ep->qp.ctx_base); ++ mmiowb(); /* flush posted PCI writes */ ++} ++ ++ ++/** ++ * bnx2i_ring_dbell_update_sq_params - update SQ driver parameters ++ * ++ * @conn: iscsi connection to which new SQ entries belong ++ * @count: number of SQ WQEs to post ++ * ++ * this routine will update SQ driver parameters and ring the doorbell ++ **/ ++void bnx2i_ring_dbell_update_sq_params(struct bnx2i_conn *conn, int count) ++{ ++ int tmp_cnt; ++ struct qp_info *qp = &conn->ep->qp; ++ ++ if (count == 1) { ++ if (qp->sq_prod_qe == qp->sq_last_qe) ++ qp->sq_prod_qe = qp->sq_first_qe; ++ else ++ qp->sq_prod_qe++; ++ } else { ++ if ((qp->sq_prod_qe + count) <= qp->sq_last_qe) ++ qp->sq_prod_qe += count; ++ else { ++ tmp_cnt = qp->sq_last_qe - qp->sq_prod_qe; ++ qp->sq_prod_qe = ++ &qp->sq_first_qe[count - (tmp_cnt + 1)]; ++ } ++ } ++ qp->sq_prod_idx += count; ++ /* Ring the doorbell */ ++ conn->ring_doorbell(conn); ++} ++ ++ ++/** ++ * bnx2i_send_iscsi_login - post iSCSI login request MP WQE to hardware ++ * ++ * @conn: iscsi connection ++ * @cmd: driver command structure which is requesting ++ * a WQE to sent to chip for further processing ++ * ++ * prepare and post an iSCSI Login request WQE to CNIC firmware ++ */ ++int bnx2i_send_iscsi_login(struct bnx2i_conn *conn, struct bnx2i_cmd *cmd) ++{ ++ struct iscsi_login_request *login_wqe; ++ struct iscsi_login *login_hdr; ++ u32 dword; ++ ++ if (!conn->gen_pdu.req_buf || !conn->gen_pdu.resp_buf) ++ return -EINVAL; ++ ++ login_hdr = (struct iscsi_login *) &conn->gen_pdu.pdu_hdr; ++ login_wqe = (struct iscsi_login_request *) conn->ep->qp.sq_prod_qe; ++ ++ login_wqe->op_code = ISCSI_OP_LOGIN | ISCSI_OP_IMMEDIATE; ++ login_wqe->op_attr = login_hdr->flags; ++ login_wqe->version_max = login_hdr->max_version; ++ login_wqe->version_min = login_hdr->min_version; ++ login_wqe->data_length = ((login_hdr->dlength[0] << 16) | ++ (login_hdr->dlength[1] << 8) | ++ login_hdr->dlength[2]); ++ ++ login_wqe->isid_lo = *((u32 *) login_hdr->isid); ++ login_wqe->isid_hi = *((u16 *) login_hdr->isid + 2); ++ login_wqe->tsih = login_hdr->tsih; ++ login_wqe->itt = (cmd->req.itt | ++ (ISCSI_TASK_TYPE_MPATH << ++ ISCSI_LOGIN_REQUEST_TYPE_SHIFT)); ++ login_wqe->cid = login_hdr->cid; ++ ++ login_wqe->cmd_sn = ntohl(login_hdr->cmdsn); ++ login_wqe->exp_stat_sn = ntohl(login_hdr->exp_statsn); ++ ++ login_wqe->resp_bd_list_addr_lo = ++ (u32) conn->gen_pdu.login_resp.pgtbl_map; ++ login_wqe->resp_bd_list_addr_hi = ++ (u32) ((u64) conn->gen_pdu.login_resp.pgtbl_map >> 32); ++ ++ dword = ((1 << ISCSI_LOGIN_REQUEST_NUM_RESP_BDS_SHIFT) | ++ (conn->gen_pdu.resp_buf_size << ++ ISCSI_LOGIN_REQUEST_RESP_BUFFER_LENGTH_SHIFT)); ++ login_wqe->resp_buffer = dword; ++ login_wqe->flags = 0; ++ login_wqe->bd_list_addr_lo = (u32) conn->gen_pdu.login_req.pgtbl_map; ++ login_wqe->bd_list_addr_hi = ++ (u32) ((u64) conn->gen_pdu.login_req.pgtbl_map >> 32); ++ login_wqe->num_bds = 1; ++ login_wqe->cq_index = 0; /* CQ# used for completion, 5771x only */ ++ conn->num_login_req_pdus++; ++ ++ bnx2i_ring_dbell_update_sq_params(conn, 1); ++ return 0; ++} ++ ++ ++/** ++ * bnx2i_send_iscsi_text - post iSCSI text request MP WQE to hardware ++ * ++ * @conn: iscsi connection ++ * @cmd: driver command structure which is requesting ++ * a WQE to sent to chip for further processing ++ * ++ * prepare and post an iSCSI Text request WQE to CNIC firmware ++ */ ++int bnx2i_send_iscsi_text(struct bnx2i_conn *conn, struct bnx2i_cmd *cmd) ++{ ++ conn->num_text_req_pdus++; ++ return 0; ++} ++ ++ ++ ++/** ++ * bnx2i_send_iscsi_tmf - post iSCSI task management request MP WQE to hardware ++ * ++ * @conn: iscsi connection ++ * @cmd: driver command structure which is requesting ++ * a WQE to sent to chip for further processing ++ * ++ * prepare and post an iSCSI Login request WQE to CNIC firmware ++ */ ++int bnx2i_send_iscsi_tmf(struct bnx2i_conn *conn, struct bnx2i_cmd *cmd) ++{ ++ struct bnx2i_hba *hba = conn->sess->hba; ++ u32 dword; ++ u32 scsi_lun[2]; ++ struct iscsi_tmf_request *tmfabort_wqe; ++ tmfabort_wqe = (struct iscsi_tmf_request *) conn->ep->qp.sq_prod_qe; ++ ++ memset(tmfabort_wqe, 0x00, sizeof(struct iscsi_tmf_request)); ++ tmfabort_wqe->op_code = cmd->iscsi_opcode; ++ tmfabort_wqe->op_attr = ++ ISCSI_TMF_REQUEST_ALWAYS_ONE | cmd->tmf_func; ++ ++ int_to_scsilun(cmd->tmf_lun, (struct scsi_lun *) scsi_lun); ++ tmfabort_wqe->lun[0] = ntohl(scsi_lun[0]); ++ tmfabort_wqe->lun[1] = ntohl(scsi_lun[1]); ++ ++ tmfabort_wqe->itt = (cmd->req.itt | (ISCSI_TASK_TYPE_MPATH << 14)); ++ tmfabort_wqe->reserved2 = 0; ++ tmfabort_wqe->cmd_sn = conn->sess->cmdsn; ++ printk("%s: TMF - CMDSN %x\n", __FUNCTION__, tmfabort_wqe->cmd_sn); ++ ++ if (cmd->tmf_func == ISCSI_TM_FUNC_ABORT_TASK) { ++ if (cmd->tmf_ref_cmd->req.op_attr & ISCSI_CMD_REQUEST_READ) ++ dword = (ISCSI_TASK_TYPE_READ << ISCSI_CMD_REQUEST_TYPE_SHIFT); ++ else ++ dword = (ISCSI_TASK_TYPE_WRITE << ISCSI_CMD_REQUEST_TYPE_SHIFT); ++ tmfabort_wqe->ref_itt = (dword |= cmd->tmf_ref_itt); ++ tmfabort_wqe->ref_cmd_sn = cmd->tmf_ref_cmd->req.cmd_sn; ++ } else if (cmd->tmf_func == ISCSI_TM_FUNC_LOGICAL_UNIT_RESET) { ++ } ++ ++ tmfabort_wqe->bd_list_addr_lo = (u32) hba->mp_dma_buf.pgtbl_map; ++ tmfabort_wqe->bd_list_addr_hi = ++ (u32) ((u64) hba->mp_dma_buf.pgtbl_map >> 32); ++ tmfabort_wqe->num_bds = 1; ++ tmfabort_wqe->cq_index = 0; /* CQ# used for completion, 5771x only */ ++ conn->num_tmf_req_pdus++; ++ ++ bnx2i_ring_dbell_update_sq_params(conn, 1); ++ return 0; ++} ++ ++/** ++ * bnx2i_send_iscsi_scsicmd - post iSCSI scsicmd request WQE to hardware ++ * ++ * @conn: iscsi connection ++ * @cmd: driver command structure which is requesting ++ * a WQE to sent to chip for further processing ++ * ++ * prepare and post an iSCSI SCSI-CMD request WQE to CNIC firmware ++ */ ++int bnx2i_send_iscsi_scsicmd(struct bnx2i_conn *conn, struct bnx2i_cmd *cmd) ++{ ++ struct iscsi_cmd_request *scsi_cmd_wqe; ++ ++ if (!conn->ep) ++ return -1; ++ ++ scsi_cmd_wqe = (struct iscsi_cmd_request *) conn->ep->qp.sq_prod_qe; ++ memcpy(scsi_cmd_wqe, &cmd->req, sizeof(struct iscsi_cmd_request)); ++ scsi_cmd_wqe->cq_index = 0; /* CQ# used for completion, 5771x only */ ++ ++ conn->num_scsi_cmd_pdus++; ++ bnx2i_ring_dbell_update_sq_params(conn, 1); ++ return 0; ++} ++ ++/** ++ * bnx2i_send_iscsi_nopout - post iSCSI NOPOUT request WQE to hardware ++ * ++ * @conn: iscsi connection ++ * @cmd: driver command structure which is requesting ++ * a WQE to sent to chip for further processing ++ * @ttt: TTT to be used when building pdu header ++ * @datap: payload buffer pointer ++ * @data_len: payload data length ++ * @unsol: indicated whether nopout pdu is unsolicited pdu or ++ * in response to target's NOPIN w/ TTT != FFFFFFFF ++ * ++ * prepare and post a nopout request WQE to CNIC firmware ++ */ ++/* ++ */ ++int bnx2i_send_iscsi_nopout(struct bnx2i_conn *conn, struct bnx2i_cmd *cmd, ++ char *datap, int data_len) ++{ ++ u8 wqe_flags; ++ int unsol; ++ struct iscsi_nop_out_request *nopout_wqe; ++ struct iscsi_nopout *nop_hdr; ++ ++ if (!conn->ep) ++ return -1; ++ ++ /* Check if it's an unsolicited pdu or a response to target's nopin */ ++ if (cmd->ttt == ISCSI_RESERVED_TAG) { ++conn->sess->unsol_noopout_count++; ++ nop_hdr = (struct iscsi_nopout *) &conn->gen_pdu.nopout_hdr; ++ unsol = 1; ++ wqe_flags = 0; ++ } else { ++conn->sess->noopout_resp_count++; ++ nop_hdr = (struct iscsi_nopout *) &conn->gen_pdu.nopin_hdr; ++ unsol = 0; ++ wqe_flags = ISCSI_NOP_OUT_REQUEST_LOCAL_COMPLETION; ++ } ++ ++ nopout_wqe = (struct iscsi_nop_out_request *) conn->ep->qp.sq_prod_qe; ++ memset(nopout_wqe, 0, sizeof(struct iscsi_nop_out_request)); ++ nopout_wqe->op_code = (ISCSI_OP_NOOP_OUT | ISCSI_OP_IMMEDIATE); ++ nopout_wqe->op_attr = ISCSI_FLAG_CMD_FINAL; ++ memcpy(nopout_wqe->lun, nop_hdr->lun, 8); ++ ++ if (test_bit(BNX2I_NX2_DEV_57710, &conn->ep->hba->cnic_dev_type)) { ++ u32 tmp = nopout_wqe->lun[0]; ++ /* 57710 requires LUN field to be swapped */ ++ nopout_wqe->lun[0] = nopout_wqe->lun[1]; ++ nopout_wqe->lun[1] = tmp; ++ } ++ nopout_wqe->ttt = cmd->ttt; ++ nopout_wqe->itt = ((u16) cmd->req.itt | ++ (ISCSI_TASK_TYPE_MPATH << ++ ISCSI_TMF_REQUEST_TYPE_SHIFT)); ++ nopout_wqe->flags = wqe_flags; ++ nopout_wqe->cmd_sn = conn->sess->cmdsn; ++ nopout_wqe->data_length = data_len; ++ if (data_len) { ++ /* handle payload data, not required in first release */ ++ printk(KERN_ALERT "NOPOUT: WARNING!! payload len != 0\n"); ++ } else { ++ nopout_wqe->bd_list_addr_lo = ++ (u32) conn->sess->hba->mp_dma_buf.pgtbl_map; ++ nopout_wqe->bd_list_addr_hi = ++ (u32) ((u64) conn->sess->hba->mp_dma_buf.pgtbl_map >> 32); ++ nopout_wqe->num_bds = 1; ++ } ++ nopout_wqe->cq_index = 0; /* CQ# used for completion, 5771x only */ ++ ++ conn->num_nopout_pdus++; ++ bnx2i_ring_dbell_update_sq_params(conn, 1); ++ ++ conn->sess->last_nooput_sn = conn->sess->cmdsn; ++ conn->sess->last_nooput_posted = jiffies; ++ conn->sess->noopout_posted_count++; ++ return 0; ++} ++ ++ ++/** ++ * bnx2i_send_iscsi_logout - post iSCSI logout request WQE to hardware ++ * ++ * @conn: iscsi connection ++ * @cmd: driver command structure which is requesting ++ * a WQE to sent to chip for further processing ++ * ++ * prepare and post logout request WQE to CNIC firmware ++ */ ++int bnx2i_send_iscsi_logout(struct bnx2i_conn *conn, struct bnx2i_cmd *cmd) ++{ ++ struct iscsi_logout_request *logout_wqe; ++ struct iscsi_logout *logout_hdr; ++ struct bnx2i_hba *hba = conn->sess->hba; ++ struct Scsi_Host *shost; ++ ++ if (!conn->ep) ++ return -1; ++ ++ shost = bnx2i_conn_get_shost(conn); ++ ++ conn->sess->state = BNX2I_SESS_IN_LOGOUT; ++ ++ logout_hdr = (struct iscsi_logout *) &conn->gen_pdu.pdu_hdr; ++ ++ logout_wqe = (struct iscsi_logout_request *) conn->ep->qp.sq_prod_qe; ++ memset(logout_wqe, 0x00, sizeof(struct iscsi_logout_request)); ++ ++ logout_wqe->op_code = (logout_hdr->opcode | ISCSI_OP_IMMEDIATE); ++ logout_wqe->op_attr = ++ logout_hdr->flags | ISCSI_LOGOUT_REQUEST_ALWAYS_ONE; ++ logout_wqe->itt = ((u16) cmd->req.itt | ++ (ISCSI_TASK_TYPE_MPATH << ++ ISCSI_LOGOUT_REQUEST_TYPE_SHIFT)); ++ logout_wqe->data_length = 0; ++ logout_wqe->cmd_sn = conn->sess->cmdsn; ++ logout_wqe->cid = conn->conn_cid; ++ ++ logout_wqe->bd_list_addr_lo = (u32) hba->mp_dma_buf.pgtbl_map; ++ logout_wqe->bd_list_addr_hi = ++ (u32) ((u64) hba->mp_dma_buf.pgtbl_map >> 32); ++ logout_wqe->num_bds = 1; ++ logout_wqe->cq_index = 0; /* CQ# used for completion, 5771x only */ ++ ++ conn->num_logout_req_pdus++; ++ bnx2i_ring_dbell_update_sq_params(conn, 1); ++ return 0; ++} ++ ++ ++/** ++ * bnx2i_update_iscsi_conn - post iSCSI logout request WQE to hardware ++ * ++ * @conn: iscsi connection which requires iscsi parameter update ++ * ++ * sends down iSCSI Conn Update request to move iSCSI conn to FFP ++ */ ++void bnx2i_update_iscsi_conn(struct bnx2i_conn *conn) ++{ ++ struct bnx2i_hba *hba = conn->sess->hba; ++ struct kwqe *kwqe_arr[2]; ++ struct iscsi_kwqe_conn_update *update_wqe; ++ struct iscsi_kwqe_conn_update conn_update_kwqe; ++ ++ update_wqe = &conn_update_kwqe; ++ ++ update_wqe->hdr.op_code = ISCSI_KWQE_OPCODE_UPDATE_CONN; ++ update_wqe->hdr.flags = ++ (ISCSI_KWQE_LAYER_CODE << ISCSI_KWQE_HEADER_LAYER_CODE_SHIFT); ++ ++ /* 57710 requires conn context id to be passed as is */ ++ if (test_bit(BNX2I_NX2_DEV_57710, &conn->ep->hba->cnic_dev_type)) ++ update_wqe->context_id = conn->ep->ep_cid; ++ else ++ update_wqe->context_id = (conn->ep->ep_cid >> 7); ++ update_wqe->conn_flags = 0; ++ if (conn->header_digest_en) ++ update_wqe->conn_flags |= ISCSI_KWQE_CONN_UPDATE_HEADER_DIGEST; ++ if (conn->data_digest_en) ++ update_wqe->conn_flags |= ISCSI_KWQE_CONN_UPDATE_DATA_DIGEST; ++ if (conn->sess->initial_r2t) ++ update_wqe->conn_flags |= ISCSI_KWQE_CONN_UPDATE_INITIAL_R2T; ++ if (conn->sess->imm_data) ++ update_wqe->conn_flags |= ISCSI_KWQE_CONN_UPDATE_IMMEDIATE_DATA; ++ ++ update_wqe->max_send_pdu_length = conn->max_data_seg_len_xmit; ++ update_wqe->max_recv_pdu_length = conn->max_data_seg_len_recv; ++ update_wqe->first_burst_length = conn->sess->first_burst_len; ++ update_wqe->max_burst_length = conn->sess->max_burst_len; ++ update_wqe->exp_stat_sn = conn->exp_statsn; ++ update_wqe->max_outstanding_r2ts = conn->sess->max_r2t; ++ update_wqe->session_error_recovery_level = conn->sess->erl; ++ printk(KERN_ALERT "bnx2i: conn update - MBL 0x%x FBL 0x%x" ++ "MRDSL_I 0x%x MRDSL_T 0x%x \n", ++ update_wqe->max_burst_length, ++ update_wqe->first_burst_length, ++ update_wqe->max_recv_pdu_length, ++ update_wqe->max_send_pdu_length); ++ ++ kwqe_arr[0] = (struct kwqe *) update_wqe; ++ if (hba->cnic && hba->cnic->submit_kwqes) ++ hba->cnic->submit_kwqes(hba->cnic, kwqe_arr, 1); ++} ++ ++ ++/** ++ * bnx2i_ep_ofld_timer - post iSCSI logout request WQE to hardware ++ * ++ * @data: endpoint (transport handle) structure pointer ++ * ++ * routine to handle connection offload/destroy request timeout ++ */ ++void bnx2i_ep_ofld_timer(unsigned long data) ++{ ++ struct bnx2i_endpoint *ep = (struct bnx2i_endpoint *) data; ++ ++ if (ep->state == EP_STATE_OFLD_START) { ++ printk(KERN_ALERT "bnx2i: ofld_timer: CONN_OFLD timeout\n"); ++ ep->state = EP_STATE_OFLD_FAILED; ++ } else if (ep->state == EP_STATE_DISCONN_START) { ++ printk(KERN_ALERT "bnx2i: ofld_timer: CONN_DISCON timeout\n"); ++ ep->state = EP_STATE_DISCONN_TIMEDOUT; ++ } else if (ep->state == EP_STATE_CLEANUP_START) { ++ printk(KERN_ALERT "bnx2i: ofld_timer: CONN_CLEANUP timeout\n"); ++ ep->state = EP_STATE_CLEANUP_FAILED; ++ } ++ ++ wake_up_interruptible(&ep->ofld_wait); ++} ++ ++ ++static int bnx2i_power_of2(u32 val) ++{ ++ u32 power = 0; ++ if (val & (val - 1)) ++ return power; ++ val--; ++ while (val) { ++ val = val >> 1; ++ power++; ++ } ++ return power; ++} ++ ++ ++/** ++ * bnx2i_send_cmd_cleanup_req - send iscsi cmd context clean-up request ++ * ++ * @hba: adapter structure pointer ++ * @cmd: driver command structure which is requesting ++ * a WQE to sent to chip for further processing ++ * ++ * prepares and posts CONN_OFLD_REQ1/2 KWQE ++ */ ++void bnx2i_send_cmd_cleanup_req(struct bnx2i_hba *hba, struct bnx2i_cmd *cmd) ++{ ++ struct iscsi_cleanup_request *cmd_cleanup; ++ ++ cmd_cleanup = ++ (struct iscsi_cleanup_request *) cmd->conn->ep->qp.sq_prod_qe; ++ memset(cmd_cleanup, 0x00, sizeof(struct iscsi_cleanup_request)); ++ ++ cmd_cleanup->op_code = ISCSI_OPCODE_CLEANUP_REQUEST; ++ cmd_cleanup->itt = cmd->req.itt; ++ cmd_cleanup->cq_index = 0; /* CQ# used for completion, 5771x only */ ++ ++ bnx2i_ring_dbell_update_sq_params(cmd->conn, 1); ++} ++ ++ ++/** ++ * bnx2i_send_conn_destroy - initiates iscsi connection teardown process ++ * ++ * @hba: adapter structure pointer ++ * @ep: endpoint (transport indentifier) structure ++ * ++ * this routine prepares and posts CONN_OFLD_REQ1/2 KWQE to initiate ++ * iscsi connection context clean-up process ++ */ ++void bnx2i_send_conn_destroy(struct bnx2i_hba *hba, struct bnx2i_endpoint *ep) ++{ ++ struct kwqe *kwqe_arr[2]; ++ struct iscsi_kwqe_conn_destroy conn_cleanup; ++ ++ memset(&conn_cleanup, 0x00, sizeof(struct iscsi_kwqe_conn_destroy)); ++ ++ conn_cleanup.hdr.op_code = ISCSI_KWQE_OPCODE_DESTROY_CONN; ++ conn_cleanup.hdr.flags = ++ (ISCSI_KWQE_LAYER_CODE << ISCSI_KWQE_HEADER_LAYER_CODE_SHIFT); ++ /* 57710 requires conn context id to be passed as is */ ++ if (test_bit(BNX2I_NX2_DEV_57710, &ep->hba->cnic_dev_type)) ++ conn_cleanup.context_id = ep->ep_cid; ++ else ++ conn_cleanup.context_id = (ep->ep_cid >> 7); ++ ++ conn_cleanup.reserved0 = (u16)ep->ep_iscsi_cid; ++ ++ kwqe_arr[0] = (struct kwqe *) &conn_cleanup; ++ if (hba->cnic && hba->cnic->submit_kwqes) ++ hba->cnic->submit_kwqes(hba->cnic, kwqe_arr, 1); ++} ++ ++ ++/** ++ * bnx2i_570x_send_conn_ofld_req - initiates iscsi connection context setup process ++ * ++ * @hba: adapter structure pointer ++ * @ep: endpoint (transport indentifier) structure ++ * ++ * 5706/5708/5709 specific - prepares and posts CONN_OFLD_REQ1/2 KWQE ++ */ ++void bnx2i_570x_send_conn_ofld_req(struct bnx2i_hba *hba, struct bnx2i_endpoint *ep) ++{ ++ struct kwqe *kwqe_arr[2]; ++ struct iscsi_kwqe_conn_offload1 ofld_req1; ++ struct iscsi_kwqe_conn_offload2 ofld_req2; ++ dma_addr_t dma_addr; ++ int num_kwqes = 2; ++ u32 *ptbl; ++ ++ ofld_req1.hdr.op_code = ISCSI_KWQE_OPCODE_OFFLOAD_CONN1; ++ ofld_req1.hdr.flags = ++ (ISCSI_KWQE_LAYER_CODE << ISCSI_KWQE_HEADER_LAYER_CODE_SHIFT); ++ ++ ofld_req1.iscsi_conn_id = (u16) ep->ep_iscsi_cid; ++ ++ dma_addr = ep->qp.sq_dma.pgtbl_map; ++ ofld_req1.sq_page_table_addr_lo = (u32) dma_addr; ++ ofld_req1.sq_page_table_addr_hi = (u32) ((u64) dma_addr >> 32); ++ ++ dma_addr = ep->qp.cq_dma.pgtbl_map; ++ ofld_req1.cq_page_table_addr_lo = (u32) dma_addr; ++ ofld_req1.cq_page_table_addr_hi = (u32) ((u64) dma_addr >> 32); ++ ++ ofld_req2.hdr.op_code = ISCSI_KWQE_OPCODE_OFFLOAD_CONN2; ++ ofld_req2.hdr.flags = ++ (ISCSI_KWQE_LAYER_CODE << ISCSI_KWQE_HEADER_LAYER_CODE_SHIFT); ++ ++ dma_addr = ep->qp.rq_dma.pgtbl_map; ++ ofld_req2.rq_page_table_addr_lo = (u32) dma_addr; ++ ofld_req2.rq_page_table_addr_hi = (u32) ((u64) dma_addr >> 32); ++ ++ ptbl = (u32 *) ep->qp.sq_dma.pgtbl; ++ ++ ofld_req2.sq_first_pte.hi = *ptbl++; ++ ofld_req2.sq_first_pte.lo = *ptbl; ++ ++ ptbl = (u32 *) ep->qp.cq_dma.pgtbl; ++ ofld_req2.cq_first_pte.hi = *ptbl++; ++ ofld_req2.cq_first_pte.lo = *ptbl; ++ ++ kwqe_arr[0] = (struct kwqe *) &ofld_req1; ++ kwqe_arr[1] = (struct kwqe *) &ofld_req2; ++ ofld_req2.num_additional_wqes = 0; ++ ++ if (hba->cnic && hba->cnic->submit_kwqes) ++ hba->cnic->submit_kwqes(hba->cnic, kwqe_arr, num_kwqes); ++} ++ ++ ++/** ++ * bnx2i_5771x_send_conn_ofld_req - initiates iscsi connection context setup process ++ * ++ * @hba: adapter structure pointer ++ * @ep: endpoint (transport indentifier) structure ++ * ++ * 57710 specific - prepares and posts CONN_OFLD_REQ1/2 KWQE ++ */ ++void bnx2i_5771x_send_conn_ofld_req(struct bnx2i_hba *hba, struct bnx2i_endpoint *ep) ++{ ++ struct kwqe *kwqe_arr[5]; ++ struct iscsi_kwqe_conn_offload1 ofld_req1; ++ struct iscsi_kwqe_conn_offload2 ofld_req2; ++ struct iscsi_kwqe_conn_offload3 ofld_req3[1]; ++ dma_addr_t dma_addr; ++ int num_kwqes = 2; ++ u32 *ptbl; ++ ++ ofld_req1.hdr.op_code = ISCSI_KWQE_OPCODE_OFFLOAD_CONN1; ++ ofld_req1.hdr.flags = ++ (ISCSI_KWQE_LAYER_CODE << ISCSI_KWQE_HEADER_LAYER_CODE_SHIFT); ++ ++ ofld_req1.iscsi_conn_id = (u16) ep->ep_iscsi_cid; ++ ++ dma_addr = ep->qp.sq_dma.pgtbl_map + ISCSI_SQ_DB_SIZE; ++ ofld_req1.sq_page_table_addr_lo = (u32) dma_addr; ++ ofld_req1.sq_page_table_addr_hi = (u32) ((u64) dma_addr >> 32); ++ ++ dma_addr = ep->qp.cq_dma.pgtbl_map + ISCSI_CQ_DB_SIZE; ++ ofld_req1.cq_page_table_addr_lo = (u32) dma_addr; ++ ofld_req1.cq_page_table_addr_hi = (u32) ((u64) dma_addr >> 32); ++ ++ ofld_req2.hdr.op_code = ISCSI_KWQE_OPCODE_OFFLOAD_CONN2; ++ ofld_req2.hdr.flags = ++ (ISCSI_KWQE_LAYER_CODE << ISCSI_KWQE_HEADER_LAYER_CODE_SHIFT); ++ ++ dma_addr = ep->qp.rq_dma.pgtbl_map + ISCSI_RQ_DB_SIZE; ++ ofld_req2.rq_page_table_addr_lo = (u32) dma_addr; ++ ofld_req2.rq_page_table_addr_hi = (u32) ((u64) dma_addr >> 32); ++ ++ ptbl = (u32 *)((u8 *)ep->qp.sq_dma.pgtbl + ISCSI_SQ_DB_SIZE); ++ ofld_req2.sq_first_pte.hi = *ptbl++; ++ ofld_req2.sq_first_pte.lo = *ptbl; ++ ++ ptbl = (u32 *)((u8 *)ep->qp.cq_dma.pgtbl + ISCSI_CQ_DB_SIZE); ++ ofld_req2.cq_first_pte.hi = *ptbl++; ++ ofld_req2.cq_first_pte.lo = *ptbl; ++ ++ kwqe_arr[0] = (struct kwqe *) &ofld_req1; ++ kwqe_arr[1] = (struct kwqe *) &ofld_req2; ++ ++ ofld_req2.num_additional_wqes = 1; ++ memset(ofld_req3, 0x00, sizeof(ofld_req3[0])); ++ ptbl = (u32 *)((u8 *)ep->qp.rq_dma.pgtbl + ISCSI_RQ_DB_SIZE); ++ ofld_req3[0].qp_first_pte[0].hi = *ptbl++; ++ ofld_req3[0].qp_first_pte[0].lo = *ptbl; ++ ++ kwqe_arr[2] = (struct kwqe *) ofld_req3; ++ /* need if we decide to go with multiple KCQE's per conn */ ++ num_kwqes += 1; ++ ++ if (hba->cnic && hba->cnic->submit_kwqes) ++ hba->cnic->submit_kwqes(hba->cnic, kwqe_arr, num_kwqes); ++} ++ ++/** ++ * bnx2i_send_conn_ofld_req - initiates iscsi connection context setup process ++ * ++ * @hba: adapter structure pointer ++ * @ep: endpoint (transport indentifier) structure ++ * ++ * this routine prepares and posts CONN_OFLD_REQ1/2 KWQE ++ */ ++void bnx2i_send_conn_ofld_req(struct bnx2i_hba *hba, struct bnx2i_endpoint *ep) ++{ ++ if (test_bit(BNX2I_NX2_DEV_57710, &hba->cnic_dev_type)) ++ bnx2i_5771x_send_conn_ofld_req(hba, ep); ++ else ++ bnx2i_570x_send_conn_ofld_req(hba, ep); ++} ++ ++ ++/** ++ * bnx2i_alloc_qp_resc - allocates requires resources for QP (transport layer ++ * for iSCSI connection) ++ * ++ * @hba: adapter structure pointer ++ * @ep: endpoint (transport indentifier) structure ++ * ++ * Allocate QP resources, DMA'able memory for SQ/RQ/CQ and page tables. ++ * EP structure elements such as producer/consumer indexes/pointers, ++ * queue sizes and page table contents are setup ++ */ ++int bnx2i_alloc_qp_resc(struct bnx2i_hba *hba, struct bnx2i_endpoint *ep) ++{ ++ struct bnx2i_5771x_cq_db *cq_db; ++ u32 num_que_elements; ++ int mem_size; ++ int sq_pgtbl_off = 0; ++ int cq_pgtbl_off = 0; ++ int rq_pgtbl_off = 0; ++ ++ if (test_bit(BNX2I_NX2_DEV_57710, &ep->hba->cnic_dev_type)) { ++ sq_pgtbl_off = ISCSI_SQ_DB_SIZE; ++ cq_pgtbl_off = ISCSI_CQ_DB_SIZE; ++ rq_pgtbl_off = ISCSI_RQ_DB_SIZE; ++ } ++ ++ ep->hba = hba; ++ ep->conn = NULL; ++ ep->ep_cid = ep->ep_iscsi_cid = ep->ep_pg_cid = 0; ++ ++ /* Allocate page table memory for SQ which is page aligned */ ++ mem_size = hba->max_sqes * BNX2I_SQ_WQE_SIZE; ++ mem_size = (mem_size + (PAGE_SIZE - 1)) & PAGE_MASK; ++ num_que_elements = hba->max_sqes; ++ ++ if (bnx2i_alloc_dma(hba, &ep->qp.sq_dma, mem_size, ++ BNX2I_TBL_TYPE_PG, sq_pgtbl_off)) ++ goto error; ++ ++ memset(ep->qp.sq_virt, 0x00, mem_size); ++ ++ ep->qp.sq_first_qe = (struct sqe *) ep->qp.sq_virt; ++ ep->qp.sq_prod_qe = ep->qp.sq_first_qe; ++ ep->qp.sq_last_qe = &ep->qp.sq_first_qe[num_que_elements - 1]; ++ ep->qp.sq_prod_idx = 0; ++ ++ /* Allocate page table memory for CQ which is page aligned */ ++ mem_size = hba->max_cqes * BNX2I_CQE_SIZE; ++ mem_size = (mem_size + (PAGE_SIZE - 1)) & PAGE_MASK; ++ num_que_elements = hba->max_cqes; ++ ++ if (bnx2i_alloc_dma(hba, &ep->qp.cq_dma, mem_size, ++ BNX2I_TBL_TYPE_PG, cq_pgtbl_off)) ++ goto error; ++ ++ memset (ep->qp.cq_virt, 0x00, mem_size); ++ ++ ep->qp.cq_first_qe = (struct cqe *) ep->qp.cq_virt; ++ ep->qp.cq_cons_qe = ep->qp.cq_first_qe; ++ ep->qp.cq_last_qe = &ep->qp.cq_first_qe[num_que_elements - 1]; ++ ep->qp.cq_cons_idx = 0; ++ ep->qp.cqe_left = num_que_elements; ++ ep->qp.cqe_exp_seq_sn = ISCSI_INITIAL_SN; ++ ep->qp.cqe_size = hba->max_cqes; ++ ++ /* Invalidate all EQ CQE index, req only for 57710 */ ++ cq_db = (struct bnx2i_5771x_cq_db *) ep->qp.cq_dma.pgtbl; ++ memset(cq_db->sqn, 0xFF, sizeof(cq_db->sqn[0]) * BNX2X_MAX_CQS); ++ ++ /* Allocate page table memory for RQ which is page aligned */ ++ mem_size = hba->max_rqes * BNX2I_RQ_WQE_SIZE; ++ mem_size = (mem_size + (PAGE_SIZE - 1)) & PAGE_MASK; ++ num_que_elements = hba->max_rqes; ++ ++ if (bnx2i_alloc_dma(hba, &ep->qp.rq_dma, mem_size, ++ BNX2I_TBL_TYPE_PG, rq_pgtbl_off)) ++ goto error; ++ ++ ep->qp.rq_first_qe = (struct rqe *) ep->qp.rq_virt; ++ ep->qp.rq_prod_qe = ep->qp.rq_first_qe; ++ ep->qp.rq_cons_qe = ep->qp.rq_first_qe; ++ ep->qp.rq_last_qe = &ep->qp.rq_first_qe[num_que_elements - 1]; ++ ep->qp.rq_prod_idx = 0x8000; ++ ep->qp.rq_cons_idx = 0; ++ ep->qp.rqe_left = num_que_elements; ++ ++ return 0; ++ ++error: ++ bnx2i_free_qp_resc(hba, ep); ++ return -ENOMEM; ++} ++ ++ ++ ++/** ++ * bnx2i_free_qp_resc - free memory resources held by QP ++ * ++ * @hba: adapter structure pointer ++ * @ep: endpoint (transport indentifier) structure ++ * ++ * Free QP resources - SQ/RQ/CQ memory and page tables. ++ */ ++void bnx2i_free_qp_resc(struct bnx2i_hba *hba, struct bnx2i_endpoint *ep) ++{ ++ if (ep->qp.ctx_base) { ++ iounmap(ep->qp.ctx_base); ++ ep->qp.ctx_base = NULL; ++ } ++ ++ bnx2i_free_dma(hba, &ep->qp.sq_dma); ++ bnx2i_free_dma(hba, &ep->qp.cq_dma); ++ bnx2i_free_dma(hba, &ep->qp.rq_dma); ++} ++ ++extern unsigned int error_mask1, error_mask2; ++extern unsigned int en_tcp_dack; ++extern u64 iscsi_error_mask; ++ ++/** ++ * bnx2i_send_fw_iscsi_init_msg - initiates initial handshake with iscsi f/w ++ * ++ * @hba: adapter structure pointer ++ * ++ * Send down iscsi_init KWQEs which initiates the initial handshake with the f/w ++ * This results in iSCSi support validation and on-chip context manager ++ * initialization. Firmware completes this handshake with a CQE carrying ++ * the result of iscsi support validation. Parameter carried by ++ * iscsi init request determines the number of offloaded connection and ++ * tolerance level for iscsi protocol violation this hba/chip can support ++ */ ++int bnx2i_send_fw_iscsi_init_msg(struct bnx2i_hba *hba) ++{ ++ struct kwqe *kwqe_arr[3]; ++ struct iscsi_kwqe_init1 iscsi_init; ++ struct iscsi_kwqe_init2 iscsi_init2; ++ int rc = 0; ++ u64 mask64; ++ ++ bnx2i_adjust_qp_size(hba); ++ ++ iscsi_init.flags = ++ ISCSI_PAGE_SIZE_4K << ISCSI_KWQE_INIT1_PAGE_SIZE_SHIFT; ++ if (en_tcp_dack) ++ iscsi_init.flags |= ISCSI_KWQE_INIT1_DELAYED_ACK_ENABLE; ++ iscsi_init.reserved0 = 0; ++ iscsi_init.num_cqs = 1; ++ iscsi_init.hdr.op_code = ISCSI_KWQE_OPCODE_INIT1; ++ iscsi_init.hdr.flags = ++ (ISCSI_KWQE_LAYER_CODE << ISCSI_KWQE_HEADER_LAYER_CODE_SHIFT); ++ ++ iscsi_init.dummy_buffer_addr_lo = (u32) hba->mp_dma_buf.mapping; ++ iscsi_init.dummy_buffer_addr_hi = ++ (u32) ((u64) hba->mp_dma_buf.mapping >> 32); ++ ++ hba->ctx_ccell_tasks = ++ ((hba->num_ccell & 0xFFFF) | (hba->max_sqes << 16)); ++ iscsi_init.num_ccells_per_conn = hba->num_ccell; ++ iscsi_init.num_tasks_per_conn = hba->max_sqes; ++ iscsi_init.sq_wqes_per_page = PAGE_SIZE / BNX2I_SQ_WQE_SIZE; ++ iscsi_init.sq_num_wqes = hba->max_sqes; ++ iscsi_init.cq_log_wqes_per_page = ++ (u8) bnx2i_power_of2(PAGE_SIZE / BNX2I_CQE_SIZE); ++ iscsi_init.cq_num_wqes = hba->max_cqes; ++ printk("%s: max sqe %d, max cqe %d\n", __FUNCTION__, ++ iscsi_init.sq_num_wqes, iscsi_init.cq_num_wqes); ++ iscsi_init.cq_num_pages = (hba->max_cqes * BNX2I_CQE_SIZE + ++ (PAGE_SIZE - 1)) / PAGE_SIZE; ++ iscsi_init.sq_num_pages = (hba->max_sqes * BNX2I_SQ_WQE_SIZE + ++ (PAGE_SIZE - 1)) / PAGE_SIZE; ++ iscsi_init.rq_buffer_size = BNX2I_RQ_WQE_SIZE; ++ iscsi_init.rq_num_wqes = hba->max_rqes; ++ ++ ++ iscsi_init2.hdr.op_code = ISCSI_KWQE_OPCODE_INIT2; ++ iscsi_init2.hdr.flags = ++ (ISCSI_KWQE_LAYER_CODE << ISCSI_KWQE_HEADER_LAYER_CODE_SHIFT); ++ iscsi_init2.max_cq_sqn = hba->max_cqes * 2 + 1; ++ mask64 = 0x0ULL; ++ mask64 |= ( ++ /* CISCO MDS */ ++ (1UL << ++ ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_TTT_NOT_RSRV) | ++ /* HP MSA1510i */ ++ (1UL << ++ ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_EXP_DATASN) | ++ /* EMC */ ++ (1ULL << ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_LUN)); ++ if (error_mask1) ++ iscsi_init2.error_bit_map[0] = error_mask1; ++ else { ++ iscsi_init2.error_bit_map[0] = (u32) mask64; ++ } ++ if (error_mask2) ++ iscsi_init2.error_bit_map[1] = error_mask2; ++ else ++ iscsi_init2.error_bit_map[1] = (u32) (mask64 >> 32); ++ ++ iscsi_error_mask = mask64; ++ ++ kwqe_arr[0] = (struct kwqe *) &iscsi_init; ++ kwqe_arr[1] = (struct kwqe *) &iscsi_init2; ++ ++ if (hba->cnic && hba->cnic->submit_kwqes) { ++ rc = hba->cnic->submit_kwqes(hba->cnic, kwqe_arr, 2); ++ } ++ return rc; ++} ++ ++ ++/** ++ * bnx2i_process_scsi_cmd_resp - this function handles scsi command ++ * completion CQE processing ++ * ++ * @conn: iscsi connection ++ * @cqe: pointer to newly DMA'ed CQE entry for processing ++ * ++ * process SCSI CMD Response CQE & complete the request to SCSI-ML ++ */ ++static int bnx2i_process_scsi_cmd_resp(struct bnx2i_conn *conn, ++ struct cqe *cqe) ++{ ++ struct iscsi_cmd_response *resp_cqe; ++ struct bnx2i_cmd *cmd; ++ struct scsi_cmnd *sc; ++ u32 itt; ++ struct Scsi_Host *shost; ++ unsigned long flags; ++ ++ if (conn->sess->recovery_state) ++ return -1; ++ resp_cqe = (struct iscsi_cmd_response *) cqe; ++ ++ bnx2i_update_cmd_sequence(conn->sess, resp_cqe->exp_cmd_sn, ++ resp_cqe->max_cmd_sn); ++ ++ itt = (resp_cqe->itt & ISCSI_CMD_RESPONSE_INDEX); ++ cmd = get_cmnd(conn->sess, itt); ++ if (!cmd || !cmd->scsi_cmd) { ++ printk(KERN_ALERT "bnx2i: scsi rsp ITT=%x not active\n", itt); ++ return 0; ++ } else if (atomic_read(&cmd->cmd_state) != ISCSI_CMD_STATE_INITIATED) { ++ printk(KERN_ALERT "%s: WaTcH: ITT=%x is being aborted\n", ++ __FUNCTION__, itt); ++ return 0; ++ } ++ atomic_set(&cmd->cmd_state, ISCSI_CMD_STATE_CMPL_RCVD); ++ ++ if (cmd->req.op_attr & ISCSI_CMD_REQUEST_READ) { ++ conn->num_datain_pdus += ++ resp_cqe->task_stat.read_stat.num_data_outs; ++ conn->total_data_octets_rcvd += ++ cmd->req.total_data_transfer_length; ++ } else { ++ conn->num_dataout_pdus += ++ resp_cqe->task_stat.read_stat.num_data_outs; ++ conn->num_r2t_pdus += ++ resp_cqe->task_stat.read_stat.num_r2ts; ++ conn->total_data_octets_sent += ++ cmd->req.total_data_transfer_length; ++ } ++ ++ sc = cmd->scsi_cmd; ++ cmd->scsi_status_rcvd = 1; ++ cmd->req.itt &= ISCSI_CMD_RESPONSE_INDEX; ++ ++ if (resp_cqe->op_code == ISCSI_OP_SCSI_DATA_IN) { ++ sc->result = (DID_OK << 16) | resp_cqe->status; ++ goto call_done; ++ } ++ ++ bnx2i_process_scsi_resp(cmd, resp_cqe); ++ ++call_done: ++ spin_lock_irqsave(&conn->sess->lock, flags); ++ list_del_init(&cmd->link); ++ cmd->scsi_cmd = NULL; ++ conn->sess->active_cmd_count--; ++ sc->SCp.ptr = NULL; ++ bnx2i_free_cmd(cmd->conn->sess, cmd); ++ spin_unlock_irqrestore(&conn->sess->lock, flags); ++ ++ bnx2i_iscsi_unmap_sg_list(conn->sess->hba, cmd); ++ ++ shost = bnx2i_conn_get_shost(conn); ++ spin_lock_irqsave(shost->host_lock, flags); ++ sc->scsi_done(sc); ++ spin_unlock_irqrestore(shost->host_lock, flags); ++ return 0; ++} ++ ++ ++/** ++ * bnx2i_process_login_resp - this function handles iscsi login response ++ * CQE processing ++ * ++ * @conn: iscsi connection ++ * @cqe: pointer to newly DMA'ed CQE entry for processing ++ * ++ * process Login Response CQE & complete it to open-iscsi user daemon ++ */ ++static int bnx2i_process_login_resp(struct bnx2i_conn *conn, struct cqe *cqe) ++{ ++ struct bnx2i_cmd *cmd; ++ struct iscsi_login_response *login; ++ struct iscsi_login_rsp *login_resp; ++ u32 itt; ++ u32 dword; ++ int pld_len; ++ int pad_len; ++ ++ login = (struct iscsi_login_response *) cqe; ++ login_resp = (struct iscsi_login_rsp *) &conn->gen_pdu.resp_hdr; ++ itt = (login->itt & ISCSI_LOGIN_RESPONSE_INDEX); ++ ++ cmd = get_cmnd(conn->sess, itt); ++ if (!cmd) { ++ printk(KERN_WARNING "bnx2i - itt=%x not valid\n", itt); ++ return 0; ++ } ++ ++ login_resp->opcode = login->op_code; ++ login_resp->flags = login->response_flags; ++ login_resp->max_version = login->version_max; ++ login_resp->active_version = login->version_active;; ++ login_resp->hlength = 0; ++ ++ dword = login->data_length; ++ login_resp->dlength[2] = (u8) dword; ++ login_resp->dlength[1] = (u8) (dword >> 8); ++ login_resp->dlength[0] = (u8) (dword >> 16); ++ ++ memcpy(login_resp->isid, &login->isid_lo, 6); ++ login_resp->tsih = htons(login->tsih); ++ login_resp->itt = conn->gen_pdu.pdu_hdr.itt; ++ login_resp->statsn = htonl(login->stat_sn); ++ ++ conn->sess->cmdsn = login->exp_cmd_sn; ++ login_resp->exp_cmdsn = htonl(login->exp_cmd_sn); ++ login_resp->max_cmdsn = htonl(login->max_cmd_sn); ++ login_resp->status_class = login->status_class; ++ login_resp->status_detail = login->status_detail; ++ pld_len = login->data_length; ++ conn->gen_pdu.resp_wr_ptr = conn->gen_pdu.resp_buf + pld_len; ++ ++ pad_len = 0; ++ if (pld_len & 0x3) ++ pad_len = 4 - (pld_len % 4); ++ ++ if (pad_len) { ++ int i = 0; ++ for (i = 0; i < pad_len; i++) { ++ conn->gen_pdu.resp_wr_ptr[0] = 0; ++ conn->gen_pdu.resp_wr_ptr++; ++ } ++ } ++ cmd->iscsi_opcode = 0; ++ ++ bnx2i_indicate_login_resp(conn); ++ return 0; ++} ++ ++/** ++ * bnx2i_process_tmf_resp - this function handles iscsi TMF response ++ * CQE processing ++ * ++ * @conn: iscsi connection ++ * @cqe: pointer to newly DMA'ed CQE entry for processing ++ * ++ * process iSCSI TMF Response CQE and wake up the driver eh thread. ++ */ ++static int bnx2i_process_tmf_resp(struct bnx2i_conn *conn, struct cqe *cqe) ++{ ++ u32 itt; ++ struct bnx2i_cmd *cmd; ++ struct bnx2i_cmd *aborted_cmd; ++ struct iscsi_tmf_response *tmf_cqe; ++ ++ tmf_cqe = (struct iscsi_tmf_response *) cqe; ++ printk("%s: ITT %x\n", __FUNCTION__, tmf_cqe->itt); ++ itt = (tmf_cqe->itt & ISCSI_TMF_RESPONSE_INDEX); ++ cmd = get_cmnd(conn->sess, itt); ++ if (!cmd) { ++ printk(KERN_ALERT "tmf_resp: ITT 0x%x is not active\n", ++ tmf_cqe->itt); ++ return 0; ++ } ++ ++ bnx2i_update_cmd_sequence(conn->sess, tmf_cqe->exp_cmd_sn, ++ tmf_cqe->max_cmd_sn); ++ ++ if (conn->sess->recovery_state) { ++ printk("%s: ignore TMF resp as sess is already in recovery mode\n", __FUNCTION__); ++ atomic_set(&cmd->cmd_state, ISCSI_CMD_STATE_FAILED); ++ wake_up(&cmd->conn->sess->er_wait); ++ return -1; ++ } ++ ++ printk("%s : TMF ABORT CMD RESP, status %x\n", __FUNCTION__, tmf_cqe->response); ++ cmd->tmf_response = tmf_cqe->response; ++ if (cmd->tmf_func == ISCSI_TM_FUNC_LOGICAL_UNIT_RESET || ++ cmd->tmf_func == ISCSI_TM_FUNC_TARGET_WARM_RESET) { ++ if (tmf_cqe->response == ISCSI_TMF_RSP_COMPLETE) ++ atomic_set(&cmd->cmd_state, ISCSI_CMD_STATE_COMPLETED); ++ else ++ atomic_set(&cmd->cmd_state, ISCSI_CMD_STATE_FAILED); ++ printk("%s : LUN RESET TMF RESP, status %x\n", ++ __FUNCTION__, tmf_cqe->response); ++ goto reset_done; ++ } ++ ++ aborted_cmd = cmd->tmf_ref_cmd; ++ /* decouple aborted command from active queue, this eliminates need ++ * to take lock in workq/tasklet ++ */ ++ list_del_init(&aborted_cmd->link); ++ ++ if (tmf_cqe->response == ISCSI_TMF_RSP_COMPLETE) { ++ if (aborted_cmd->scsi_cmd) { ++ aborted_cmd->scsi_cmd->result = DID_ABORT << 16; ++ aborted_cmd->scsi_cmd->resid = ++ aborted_cmd->scsi_cmd->request_bufflen; ++ atomic_set(&cmd->cmd_state, ISCSI_CMD_STATE_COMPLETED); ++ } ++ } else if (tmf_cqe->response == ISCSI_TMF_RSP_NO_TASK) { ++ if (aborted_cmd->scsi_cmd == cmd->tmf_ref_sc) ++ printk(KERN_ALERT "TMF_RESP: task still allegiant\n"); ++ atomic_set(&cmd->cmd_state, ISCSI_CMD_STATE_COMPLETED); ++ } else { ++ printk(KERN_ALERT "TMF_RESP: failed, ITT 0x%x REF ITT 0x%x\n", ++ cmd->req.itt, aborted_cmd->req.itt); ++ atomic_set(&cmd->cmd_state, ISCSI_CMD_STATE_FAILED); ++ } ++ ++reset_done: ++ cmd->iscsi_opcode = 0; ++ ++ if (cmd->conn && cmd->conn->sess ) { ++ if (atomic_read(&conn->worker_enabled)) { ++ atomic_set(&conn->worker_enabled, 0); ++ barrier(); ++#ifdef __VMKLNX__ ++ tasklet_disable_nosync(&conn->conn_tasklet); ++ ++#endif ++ atomic_inc(&conn->worker_disabled_cnt); ++ } ++ printk("%s: tasklet disabled, cid %d\n", __FUNCTION__, conn->ep->ep_iscsi_cid); ++ wake_up(&cmd->conn->sess->er_wait); ++ } ++ return SUCCESS; ++} ++ ++/** ++ * bnx2i_process_logout_resp - this function handles iscsi logout response ++ * CQE processing ++ * ++ * @conn: iscsi connection ++ * @cqe: pointer to newly DMA'ed CQE entry for processing ++ * ++ * process iSCSI Logout Response CQE & make function call to ++ * notify the user daemon. ++ */ ++static int bnx2i_process_logout_resp(struct bnx2i_conn *conn, struct cqe *cqe) ++{ ++ struct bnx2i_cmd *cmd; ++ struct iscsi_logout_response *logout; ++ struct iscsi_logout_rsp *logout_resp; ++ u32 itt; ++ ++ logout = (struct iscsi_logout_response *) cqe; ++ logout_resp = (struct iscsi_logout_rsp *) &conn->gen_pdu.resp_hdr; ++ itt = (logout->itt & ISCSI_LOGOUT_RESPONSE_INDEX); ++ ++ cmd = get_cmnd(conn->sess, itt); ++ if (!cmd || cmd != conn->sess->login_nopout_cmd) ++ return 0; ++ ++ logout_resp->opcode = logout->op_code; ++ logout_resp->flags = logout->response; ++ logout_resp->hlength = 0; ++ ++ logout_resp->itt = conn->gen_pdu.pdu_hdr.itt; ++ logout_resp->statsn = conn->gen_pdu.pdu_hdr.exp_statsn; ++ logout_resp->exp_cmdsn = htonl(logout->exp_cmd_sn); ++ logout_resp->max_cmdsn = htonl(logout->max_cmd_sn); ++ ++ logout_resp->t2wait = htonl(logout->time_to_wait); ++ logout_resp->t2retain = htonl(logout->time_to_retain); ++ ++ conn->ep->teardown_mode = BNX2I_GRACEFUL_SHUTDOWN; ++ cmd->iscsi_opcode = 0; ++ ++ bnx2i_indicate_logout_resp(conn); ++ return 0; ++} ++ ++/** ++ * bnx2i_process_nopin_local_cmpl - this function handles iscsi nopin CQE ++ * processing ++ * ++ * @conn: iscsi connection ++ * @cqe: pointer to newly DMA'ed CQE entry for processing ++ * ++ * process iSCSI NOPIN local completion CQE, frees IIT and command structures ++ */ ++void bnx2i_process_nopin_local_cmpl(struct bnx2i_conn *conn, struct cqe *cqe) ++{ ++ u32 itt; ++ struct Scsi_Host *shost; ++ struct bnx2i_cmd *cmd; ++ struct iscsi_nop_in_msg *nop_in; ++ ++ nop_in = (struct iscsi_nop_in_msg *) cqe; ++ shost = bnx2i_conn_get_shost(conn); ++ ++ itt = (nop_in->itt & ISCSI_NOP_IN_MSG_INDEX); ++ cmd = get_cmnd(conn->sess, itt); ++ if (!cmd || cmd != conn->sess->nopout_resp_cmd) { ++ printk(KERN_ALERT "nop_in_local: ITT %x not active\n", itt); ++ return; ++ } ++ cmd->iscsi_opcode = 0; ++ return; ++} ++ ++/** ++ * bnx2i_process_tgt_noop_resp - this function handles iscsi nopout CQE ++ * processing ++ * ++ * @conn: iscsi connection ++ * @cqe: pointer to newly DMA'ed CQE entry for processing ++ * ++ * Process iSCSI target's nopin response to initiator's proactive nopout ++ */ ++static int bnx2i_process_tgt_noop_resp(struct bnx2i_conn *conn, struct cqe *cqe) ++{ ++ struct iscsi_nopin *nopin_hdr; ++ u32 itt; ++ struct bnx2i_cmd *cmd; ++ struct iscsi_nop_in_msg *nop_in; ++ ++ nop_in = (struct iscsi_nop_in_msg *) cqe; ++ itt = (nop_in->itt & ISCSI_NOP_IN_MSG_INDEX); ++ nopin_hdr = (struct iscsi_nopin *) &conn->gen_pdu.nopin_hdr; ++ ++ cmd = get_cmnd(conn->sess, itt); ++ if (!cmd || cmd != conn->sess->login_nopout_cmd) { ++ printk(KERN_ALERT"bnx2i: nopout resp, invalid ITT, got %x" ++ " expected %x\n", itt, cmd->itt); ++ return 0; ++ } ++ ++ nopin_hdr->opcode = nop_in->op_code; ++ nopin_hdr->flags = ISCSI_FLAG_CMD_FINAL; ++ nopin_hdr->rsvd2 = nopin_hdr->rsvd3 = 0; ++ nopin_hdr->itt = conn->gen_pdu.nopout_hdr.itt; ++ nopin_hdr->ttt = ISCSI_RESERVED_TAG; ++ ++ memcpy(nopin_hdr->lun, conn->gen_pdu.nopout_hdr.lun, 8); ++ nopin_hdr->statsn = conn->gen_pdu.nopout_hdr.exp_statsn; ++ nopin_hdr->exp_cmdsn = htonl(nop_in->exp_cmd_sn); ++ nopin_hdr->max_cmdsn = htonl(nop_in->max_cmd_sn); ++ memset(nopin_hdr->rsvd4, 0x00, 12); ++ ++ bnx2i_process_nopin(conn, cmd, NULL, 0); ++ return 0; ++} ++ ++ ++/** ++ * bnx2i_unsol_pdu_adjust_rq - makes adjustments to RQ after unsolicited pdu ++ * is received ++ * ++ * @conn: iscsi connection ++ * ++ * Firmware advances RQ producer index for every unsolicited PDU even if ++ * payload data length is '0'. This function makes corresponding ++ * adjustments on the driver side to match this f/w behavior ++ */ ++static void bnx2i_unsol_pdu_adjust_rq(struct bnx2i_conn *conn) ++{ ++ char dummy_rq_data[2]; ++ bnx2i_get_rq_buf(conn, dummy_rq_data, 1); ++ bnx2i_put_rq_buf(conn, 1); ++} ++ ++ ++/** ++ * bnx2i_process_nopin_mesg - this function handles iscsi nopin CQE ++ * processing ++ * ++ * @conn: iscsi connection ++ * @cqe: pointer to newly DMA'ed CQE entry for processing ++ * ++ * process iSCSI target's proactive iSCSI NOPIN request ++ */ ++static void bnx2i_process_nopin_mesg(struct bnx2i_conn *conn, struct cqe *cqe) ++{ ++ u32 itt; ++ u32 ttt; ++#ifndef __VMKLNX__ ++ struct Scsi_Host *shost; ++#endif ++ struct iscsi_nop_in_msg *nop_in; ++ ++ nop_in = (struct iscsi_nop_in_msg *) cqe; ++ itt = nop_in->itt; ++ ttt = nop_in->ttt; ++ ++ bnx2i_update_cmd_sequence(conn->sess, ++ nop_in->exp_cmd_sn, nop_in->max_cmd_sn); ++ ++ conn->sess->last_noopin_processed = jiffies; ++ conn->sess->noopin_processed_count++; ++ ++ if (itt == (u16) ISCSI_RESERVED_TAG) { ++ struct bnx2i_cmd *cmd; ++ ++ bnx2i_unsol_pdu_adjust_rq(conn); ++ if (ttt == ISCSI_RESERVED_TAG) ++ return; ++conn->sess->tgt_noopin_count++; ++ ++ cmd = conn->sess->nopout_resp_cmd; ++ if (!cmd) { ++ /* should not happen as nopout-resp command is reserved ++ * during conn_bind() ++ */ ++ return; ++ } ++ cmd->conn = conn; ++ cmd->scsi_cmd = NULL; ++ cmd->req.total_data_transfer_length = 0; ++ cmd->iscsi_opcode = ISCSI_OP_NOOP_OUT; ++ cmd->ttt = ttt; ++ ++ /* requires reply in the form of Nop-Out */ ++ if (nop_in->data_length) ++ printk(KERN_ALERT "Tgt NOPIN with dlen > 0\n"); ++ ++ atomic_set(&conn->sess->nop_resp_pending, 1); ++ ++ if (atomic_read(&conn->worker_enabled)) { ++#ifdef __VMKLNX__ ++ printk("%s: tasklet scheduled , cid %d\n", ++ __FUNCTION__, conn->ep->ep_iscsi_cid); ++ tasklet_schedule(&conn->conn_tasklet); ++#else ++ shost = bnx2i_conn_get_shost(conn); ++ scsi_queue_work(shost, &conn->conn_worker); ++#endif /* __VMKLNX__ */ ++ } ++ } else /* target's reply to initiator's Nop-Out */ ++ bnx2i_process_tgt_noop_resp(conn, cqe); ++} ++ ++ ++/** ++ * bnx2i_process_async_mesg - this function handles iscsi async message ++ * processing ++ * ++ * @conn: iscsi connection ++ * @cqe: pointer to newly DMA'ed CQE entry for processing ++ * ++ * process iSCSI ASYNC Message ++ */ ++static void bnx2i_process_async_mesg(struct bnx2i_conn *conn, struct cqe *cqe) ++{ ++ struct iscsi_async_msg *async_cqe; ++ struct iscsi_async *async_hdr; ++ u8 async_event; ++ ++ bnx2i_unsol_pdu_adjust_rq(conn); ++ ++ async_cqe = (struct iscsi_async_msg *) cqe; ++ async_event = async_cqe->async_event; ++ ++ if (async_event == ISCSI_ASYNC_MSG_SCSI_EVENT) { ++ printk(KERN_ALERT "async: scsi events not supported\n"); ++ return; ++ } ++ ++ async_hdr = (struct iscsi_async *) &conn->gen_pdu.async_hdr; ++ async_hdr->opcode = async_cqe->op_code; ++ async_hdr->flags = 0x80; ++ async_hdr->rsvd2[0] = async_hdr->rsvd2[1] = async_hdr->rsvd3 = 0; ++ async_hdr->dlength[0] = async_hdr->dlength[1] = async_hdr->dlength[2] = 0; ++ ++ memcpy(async_hdr->lun, async_cqe->lun, 8); ++ async_hdr->statsn = htonl(0); ++ async_hdr->exp_cmdsn = htonl(async_cqe->exp_cmd_sn); ++ async_hdr->max_cmdsn = htonl(async_cqe->max_cmd_sn); ++ ++ async_hdr->async_event = async_cqe->async_event; ++ async_hdr->async_vcode = async_cqe->async_vcode; ++ ++ async_hdr->param1 = htons(async_cqe->param1); ++ async_hdr->param2 = htons(async_cqe->param2); ++ async_hdr->param3 = htons(async_cqe->param3); ++ async_hdr->rsvd5[0] = async_hdr->rsvd5[1] = 0; ++ async_hdr->rsvd5[2] = async_hdr->rsvd5[3] = 0; ++ ++ bnx2i_indicate_async_mesg(conn); ++} ++ ++ ++/** ++ * bnx2i_process_reject_mesg - process iscsi reject pdu ++ * ++ * @conn: iscsi connection ++ * @cqe: pointer to newly DMA'ed CQE entry for processing ++ * ++ * process iSCSI REJECT message ++ */ ++static void bnx2i_process_reject_mesg(struct bnx2i_conn *conn, struct cqe *cqe) ++{ ++ struct iscsi_reject_msg *reject; ++ char rej_pdu[BNX2I_RQ_WQE_SIZE]; ++ int rej_data_len, idx; ++ ++ reject = (struct iscsi_reject_msg *) cqe; ++ rej_data_len = reject->data_length; ++ if (rej_data_len) { ++ bnx2i_get_rq_buf(conn, rej_pdu, rej_data_len); ++ bnx2i_put_rq_buf(conn, 1); ++ printk(KERN_ALERT "bnx2i - printing rejected PDU contents"); ++ idx = 0; ++ printk(KERN_ALERT "\n[%x]: ", idx); ++ while (idx <= rej_data_len) { ++ printk(KERN_ALERT "%x ", rej_pdu[idx++]); ++ if (!(idx % 8)) ++ printk(KERN_ALERT "\n[%x]: ", idx); ++ } ++ } else ++ bnx2i_unsol_pdu_adjust_rq(conn); ++ ++ bnx2i_recovery_que_add_conn(conn->sess->hba, conn); ++} ++ ++/** ++ * bnx2i_process_cmd_cleanup_resp - process scsi command clean-up completion ++ * ++ * @conn: iscsi connection ++ * @cqe: pointer to newly DMA'ed CQE entry for processing ++ * ++ * process command cleanup response CQE during conn shutdown or error recovery ++ */ ++static void bnx2i_process_cmd_cleanup_resp(struct bnx2i_conn *conn, ++ struct cqe *cqe) ++{ ++ u32 itt; ++ struct bnx2i_cmd *cmd; ++ struct iscsi_cleanup_response *cmd_clean_rsp; ++ ++ cmd_clean_rsp = (struct iscsi_cleanup_response *) cqe; ++ itt = (cmd_clean_rsp->itt & ISCSI_CLEANUP_RESPONSE_INDEX); ++ cmd = get_cmnd(conn->sess, itt); ++ if (!cmd) ++ printk(KERN_ALERT "bnx2i: cmd clean ITT %x not active\n", itt); ++ /* may be completion & cleanup request crossed each other */ ++ else { ++ printk(KERN_ALERT "bnx2i: cmd cleaned, ITT %x, cmd %p \n", itt, cmd); ++ atomic_set(&cmd->cmd_state, ISCSI_CMD_STATE_CLEANUP_CMPL); ++ } ++ wake_up(&conn->sess->er_wait); ++} ++ ++void bnx2i_print_sqe(struct bnx2i_conn *conn) ++{ ++ struct qp_info *qp = &conn->ep->qp; ++ struct iscsi_nop_out_request *nopout_wqe; ++ int count = conn->sess->sq_size; ++ ++ printk(KERN_ALERT "bnx2i: dump SQE conn %p, sn %x, max_sn %x\n", ++ conn, conn->sess->cmdsn, conn->sess->exp_cmdsn); ++ printk(KERN_ALERT "\t: OPCODE, ATTR, DLEN, ITT, TTT, SN, flags\n"); ++ ++ nopout_wqe = (struct iscsi_nop_out_request *) conn->ep->qp.sq_prod_qe; ++ while (count--) { ++ printk(KERN_ALERT "\t: %.2x, %.4x, %.4x, %.2x, %.4x, %.4x, %.2x\n", ++ nopout_wqe->op_code, nopout_wqe->op_attr, ++ nopout_wqe->data_length, nopout_wqe->itt, ++ nopout_wqe->ttt, nopout_wqe->cmd_sn, nopout_wqe->flags); ++ if (qp->sq_first_qe == (struct sqe *)nopout_wqe) ++ nopout_wqe = (struct iscsi_nop_out_request *) qp->sq_last_qe; ++ else ++ nopout_wqe--; ++ } ++} ++ ++void bnx2i_print_cqe(struct bnx2i_conn *conn) ++{ ++ struct qp_info *qp = &conn->ep->qp; ++ volatile struct iscsi_nop_in_msg *nopin; ++ struct cqe *cq_cons; ++ int count = qp->cqe_size; ++ ++ printk(KERN_ALERT "bnx2i: dump CQE conn %p, exp_seq_sn %x\n", ++ conn, qp->cqe_exp_seq_sn); ++ printk(KERN_ALERT "\t: OPCODE, EXP_SN, MAX_SN, ITT, TTT, CQSN\n"); ++ ++ cq_cons = qp->cq_cons_qe; ++ while (count--) { ++ nopin = (struct iscsi_nop_in_msg *) cq_cons; ++ printk(KERN_ALERT "\t: %.2x, %.4x, %.4x, %.2x, %.4x, %.4x\n", ++ nopin->op_code, nopin->exp_cmd_sn, nopin->max_cmd_sn, ++ nopin->itt, nopin->ttt, nopin->cq_req_sn); ++ if (qp->cq_first_qe == cq_cons) ++ cq_cons = qp->cq_last_qe; ++ else ++ cq_cons--; ++ } ++} ++ ++ ++/** ++ * bnx2i_process_new_cqes - process newly DMA'ed CQE's ++ * ++ * @conn: iscsi connection ++ * @soft_irq: initial though was iscsi logout and command cleanup reponse will ++ * be directly processed in softirq. But I guess driver still needs ++ * flush the complete queue and cannot be picky ++ * @cqes_per_work: number of cqes to process per call ++ * ++ * this function is called by generic KCQ handler to process all pending CQE's ++ */ ++int bnx2i_process_new_cqes(struct bnx2i_conn *conn, int soft_irq, ++ int cqes_per_work) ++{ ++ struct qp_info *qp; ++ volatile struct iscsi_nop_in_msg *nopin; ++ volatile u32 *sess_state = &conn->sess->state; ++ struct cqe *cq_cons; ++ int num_cqe = 0; ++ int keep_processing = 1; ++ ++ if (!conn->ep) ++ return 0; ++ ++ qp = &conn->ep->qp; ++ while (keep_processing > 0) { ++ cq_cons = qp->cq_cons_qe; ++ barrier(); ++ nopin = (struct iscsi_nop_in_msg *) qp->cq_cons_qe; ++ if ((nopin->cq_req_sn != qp->cqe_exp_seq_sn) || ++ (*sess_state == BNX2I_SESS_IN_SHUTDOWN)) { ++ keep_processing = 0; ++ break; ++ } ++ if (num_cqe >= cqes_per_work) { ++ break; ++ } ++ ++ num_cqe++; ++ if (nopin->op_code == ISCSI_OP_SCSI_CMD_RSP) { ++ conn->num_scsi_resp_pdus++; ++ bnx2i_process_scsi_cmd_resp(conn, cq_cons); ++ } else if (nopin->op_code == ISCSI_OP_SCSI_DATA_IN) { ++ bnx2i_process_scsi_cmd_resp(conn, cq_cons); ++ } else if (nopin->op_code == ISCSI_OP_LOGIN_RSP) { ++ printk("%s: LOGIN RESP CQE, cid %d\n", ++ __FUNCTION__, conn->ep->ep_iscsi_cid); ++ conn->num_login_resp_pdus++; ++ bnx2i_process_login_resp(conn, cq_cons); ++ } else if (nopin->op_code == ISCSI_OP_LOGOUT_RSP) { ++ printk("%s: LOGOUT RESP CQE, cid %d\n", ++ __FUNCTION__, conn->ep->ep_iscsi_cid); ++ conn->num_logout_resp_pdus++; ++ bnx2i_process_logout_resp(conn, cq_cons); ++ keep_processing = -EAGAIN; ++ } else if (nopin->op_code == ISCSI_OP_SCSI_TMFUNC_RSP) { ++ conn->num_tmf_resp_pdus++; ++ printk("%s: TMF_RESP CQE, cid %d\n", ++ __FUNCTION__, conn->ep->ep_iscsi_cid); ++ bnx2i_process_tmf_resp(conn, cq_cons); ++ /* exit out of completion processing inorder to ++ * TMF condition asap ++ */ ++ keep_processing = -EAGAIN; ++ } else if (nopin->op_code == ISCSI_OP_NOOP_IN) { ++ conn->num_nopin_pdus++; ++ bnx2i_process_nopin_mesg(conn, cq_cons); ++ } else if (nopin->op_code == ++ ISCSI_OPCODE_NOPOUT_LOCAL_COMPLETION) { ++ bnx2i_process_nopin_local_cmpl(conn, cq_cons); ++ } else if (nopin->op_code == ISCSI_OP_ASYNC_EVENT) { ++ printk("%s: WaTcH: ASYNC CQE, cid %d\n", ++ __FUNCTION__, conn->ep->ep_iscsi_cid); ++ conn->num_async_pdus++; ++ bnx2i_process_async_mesg(conn, cq_cons); ++ } else if (nopin->op_code == ISCSI_OP_REJECT) { ++ printk("%s: WaTcH: ISCSI REJECT CQE, cid %d\n", ++ __FUNCTION__, conn->ep->ep_iscsi_cid); ++ conn->num_reject_pdus++; ++ bnx2i_process_reject_mesg(conn, cq_cons); ++ } else if (nopin->op_code == ISCSI_OPCODE_CLEANUP_RESPONSE) { ++ printk("%s: CMD CLEANUP CQE, cid %d\n", __FUNCTION__, conn->ep->ep_iscsi_cid); ++ bnx2i_process_cmd_cleanup_resp(conn, cq_cons); ++ } else ++ printk(KERN_ALERT "bnx2i: WaTcH: unknown opcode 0x%x\n", ++ nopin->op_code); ++ ++ /* clear out in production version only, till beta keep opcode ++ * field intact, will be helpful in debugging (context dump) ++ nopin->op_code = 0; ++ */ ++ qp->cqe_exp_seq_sn++; ++ if (qp->cqe_exp_seq_sn == (qp->cqe_size * 2 + 1)) ++ qp->cqe_exp_seq_sn = ISCSI_INITIAL_SN; ++ ++ if (qp->cq_cons_qe == qp->cq_last_qe) { ++ qp->cq_cons_qe = qp->cq_first_qe; ++ qp->cq_cons_idx = 0; ++ } else { ++ qp->cq_cons_qe++; ++ qp->cq_cons_idx++; ++ } ++ } ++ return keep_processing; ++} ++ ++/** ++ * bnx2i_fastpath_notification - process global event queue (KCQ) ++ * ++ * @hba: adapter structure pointer ++ * @new_cqe_kcqe: pointer to newly DMA'ed KCQE entry ++ * ++ * Fast path event notification handler, KCQ entry carries context id ++ * of the connection that has 1 or more pending CQ entries ++ */ ++static void bnx2i_fastpath_notification(struct bnx2i_hba *hba, ++ struct iscsi_kcqe *new_cqe_kcqe) ++{ ++ u32 iscsi_cid; ++ struct bnx2i_conn *conn; ++#ifndef __VMKLNX__ ++ struct Scsi_Host *shost; ++#endif ++ ++ iscsi_cid = new_cqe_kcqe->iscsi_conn_id; ++ conn = bnx2i_get_conn_from_id(hba, iscsi_cid); ++ ++ if (!conn) { ++ printk(KERN_ALERT "bnx2i: WaTcH: cid #%x not valid\n", ++ iscsi_cid); ++ return; ++ } ++ if (!conn->ep) { ++ printk(KERN_ALERT "bnx2i: WaTcH: cid #%x - ep not bound\n", ++ iscsi_cid); ++ return; ++ } ++ ++ if (atomic_read(&conn->worker_enabled)) { ++conn->cqe_jiff = jiffies; ++#ifdef __VMKLNX__ ++ tasklet_schedule(&conn->conn_tasklet); ++#else ++ shost = bnx2i_conn_get_shost(conn); ++ scsi_queue_work(shost, &conn->conn_worker); ++#endif /* __VMKLNX__ */ ++ } else { ++ /* command cleanup completions needs to be completed for ++ * flush command queue to drain out all active commands else ++ * this could lead to deadlock and PCPU lockup in ESX ++ */ ++ /* TODO: should tasklet_disable_sync() be called to make sure ++ * tasklet is not running... diabled flags could be aset because ++ * of tasklet_disable_nosync() in tmf_resp processing thead ++ */ ++ bnx2i_process_new_cqes(conn, 1, conn->ep->qp.cqe_size); ++ bnx2i_arm_cq_event_coalescing(conn->ep, CNIC_ARM_CQE); ++ } ++} ++ ++ ++/** ++ * bnx2i_process_update_conn_cmpl - process iscsi conn update completion KCQE ++ * ++ * @hba: adapter structure pointer ++ * @update_kcqe: kcqe pointer ++ * ++ * CONN_UPDATE completion handler, this completes iSCSI connection FFP migration ++ */ ++static void bnx2i_process_update_conn_cmpl(struct bnx2i_hba *hba, ++ struct iscsi_kcqe *update_kcqe) ++{ ++ struct bnx2i_conn *conn; ++ u32 iscsi_cid; ++ ++ iscsi_cid = update_kcqe->iscsi_conn_id; ++ conn = bnx2i_get_conn_from_id(hba, iscsi_cid); ++ ++ if (!conn) { ++ printk(KERN_ALERT "conn_update: cid %x not valid\n", iscsi_cid); ++ return; ++ } ++ if (!conn->ep) { ++ printk(KERN_ALERT "cid %x does not have ep bound\n", iscsi_cid); ++ return; ++ } ++ ++ if (update_kcqe->completion_status) { ++ printk(KERN_ALERT "request failed cid %x\n", iscsi_cid); ++ conn->ep->state = EP_STATE_ULP_UPDATE_FAILED; ++ } else ++ conn->ep->state = EP_STATE_ULP_UPDATE_COMPL; ++ ++ wake_up_interruptible(&conn->ep->ofld_wait); ++} ++ ++ ++/** ++ * bnx2i_recovery_que_add_conn - add connection to recovery queue ++ * ++ * @hba: adapter structure pointer ++ * @conn: iscsi connection ++ * ++ * Add connection to recovery queue and schedule adapter eh worker ++ */ ++void bnx2i_recovery_que_add_conn(struct bnx2i_hba *hba, ++ struct bnx2i_conn *conn) ++{ ++ int prod_idx = hba->sess_recov_prod_idx; ++ ++ if (conn->sess->recovery_state || ++ atomic_read(&conn->sess->tmf_active)) ++ return; ++ ++ spin_lock(&hba->lock); ++ conn->sess->recovery_state = ISCSI_SESS_RECOVERY_START; ++ hba->sess_recov_list[prod_idx] = conn->sess; ++ if (hba->sess_recov_max_idx == hba->sess_recov_prod_idx) ++ hba->sess_recov_prod_idx = 0; ++ else ++ hba->sess_recov_prod_idx++; ++ spin_unlock(&hba->lock); ++ ++ schedule_work(&hba->err_rec_task); ++} ++ ++ ++/** ++ * bnx2i_process_tcp_error - process error notification on a given connection ++ * ++ * @hba: adapter structure pointer ++ * @tcp_err: tcp error kcqe pointer ++ * ++ * handles tcp level error notifications from FW. ++ */ ++static void bnx2i_process_tcp_error(struct bnx2i_hba *hba, ++ struct iscsi_kcqe *tcp_err) ++{ ++ struct bnx2i_conn *conn; ++ u32 iscsi_cid; ++ ++ iscsi_cid = tcp_err->iscsi_conn_id; ++ conn = bnx2i_get_conn_from_id(hba, iscsi_cid); ++ ++ if (!conn) { ++ printk(KERN_ALERT "bnx2i - cid 0x%x not valid\n", iscsi_cid); ++ return; ++ } ++ ++ printk(KERN_ALERT "bnx2i - cid 0x%x had TCP errors, error code 0x%x\n", ++ iscsi_cid, tcp_err->completion_status); ++ bnx2i_recovery_que_add_conn(conn->sess->hba, conn); ++} ++ ++ ++/** ++ * bnx2i_process_iscsi_error - process error notification on a given connection ++ * ++ * @hba: adapter structure pointer ++ * @iscsi_err: iscsi error kcqe pointer ++ * ++ * handles iscsi error notifications from the FW. Firmware based in initial ++ * handshake classifies iscsi protocol / TCP rfc violation into either ++ * warning or error indications. If indication is of "Error" type, driver ++ * will initiate session recovery for that connection/session. For ++ * "Warning" type indication, driver will put out a system log message ++ * (there will be only one message for each type for the life of the ++ * session, this is to avoid un-necessarily overloading the system) ++ */ ++static void bnx2i_process_iscsi_error(struct bnx2i_hba *hba, ++ struct iscsi_kcqe *iscsi_err) ++{ ++ struct bnx2i_conn *conn; ++ u32 iscsi_cid; ++ char warn_notice[] = "iscsi_warning"; ++ char error_notice[] = "iscsi_error"; ++ char additional_notice[64]; ++ char *message; ++ int need_recovery; ++ u64 err_mask64; ++ struct Scsi_Host *shost; ++ ++ iscsi_cid = iscsi_err->iscsi_conn_id; ++ conn = bnx2i_get_conn_from_id(hba, iscsi_cid); ++ ++ if (!conn) { ++ printk(KERN_ALERT "bnx2i - cid 0x%x not valid\n", iscsi_cid); ++ return; ++ } ++ ++ err_mask64 = (0x1ULL << iscsi_err->completion_status); ++ ++ if (err_mask64 & iscsi_error_mask) { ++ need_recovery = 0; ++ message = warn_notice; ++ } else { ++ need_recovery = 1; ++ message = error_notice; ++ } ++ ++ switch (iscsi_err->completion_status) { ++ case ISCSI_KCQE_COMPLETION_STATUS_HDR_DIG_ERR: ++ strcpy(additional_notice, "hdr digest err"); ++ break; ++ case ISCSI_KCQE_COMPLETION_STATUS_DATA_DIG_ERR: ++ strcpy(additional_notice, "data digest err"); ++ break; ++ case ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_OPCODE: ++ strcpy(additional_notice, "wrong opcode rcvd"); ++ break; ++ case ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_AHS_LEN: ++ strcpy(additional_notice, "AHS len > 0 rcvd"); ++ break; ++ case ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_ITT: ++ strcpy(additional_notice, "invalid ITT rcvd"); ++ break; ++ case ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_STATSN: ++ strcpy(additional_notice, "wrong StatSN rcvd"); ++ break; ++ case ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_EXP_DATASN: ++ strcpy(additional_notice, "wrong DataSN rcvd"); ++ break; ++ case ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_PEND_R2T : ++ strcpy(additional_notice, "pend R2T violation"); ++ break; ++ case ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_O_U_0: ++ strcpy(additional_notice, "ERL0, UO"); ++ break; ++ case ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_O_U_1: ++ strcpy(additional_notice, "ERL0, U1"); ++ break; ++ case ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_O_U_2: ++ strcpy(additional_notice, "ERL0, U2"); ++ break; ++ case ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_O_U_3: ++ strcpy(additional_notice, "ERL0, U3"); ++ break; ++ case ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_O_U_4: ++ strcpy(additional_notice, "ERL0, U4"); ++ break; ++ case ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_O_U_5: ++ strcpy(additional_notice, "ERL0, U5"); ++ break; ++ case ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_O_U_6: ++ strcpy(additional_notice, "ERL0, U6"); ++ break; ++ case ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_REMAIN_RCV_LEN: ++ strcpy(additional_notice, "invalid resi len"); ++ break; ++ case ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_MAX_RCV_PDU_LEN: ++ strcpy(additional_notice, "MRDSL violation"); ++ break; ++ case ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_F_BIT_ZERO: ++ strcpy(additional_notice, "F-bit not set"); ++ break; ++ case ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_TTT_NOT_RSRV: ++ strcpy(additional_notice, "invalid TTT"); ++ break; ++ case ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_DATASN: ++ strcpy(additional_notice, "invalid DataSN"); ++ break; ++ case ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_REMAIN_BURST_LEN: ++ strcpy(additional_notice, "burst len violation"); ++ break; ++ case ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_BUFFER_OFF: ++ strcpy(additional_notice, "buf offset violation"); ++ break; ++ case ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_LUN: ++ strcpy(additional_notice, "invalid LUN field"); ++ break; ++ case ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_R2TSN: ++ strcpy(additional_notice, "invalid R2TSN field"); ++ break; ++#define BNX2I_ERR_DESIRED_DATA_TRNS_LEN_0 \ ++ ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_DESIRED_DATA_TRNS_LEN_0 ++ case BNX2I_ERR_DESIRED_DATA_TRNS_LEN_0: ++ strcpy(additional_notice, "invalid cmd len1"); ++ break; ++#define BNX2I_ERR_DESIRED_DATA_TRNS_LEN_1 \ ++ ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_DESIRED_DATA_TRNS_LEN_1 ++ case BNX2I_ERR_DESIRED_DATA_TRNS_LEN_1: ++ strcpy(additional_notice, "invalid cmd len2"); ++ break; ++ case ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_PEND_R2T_EXCEED: ++ strcpy(additional_notice, ++ "pend r2t exceeds MaxOutstandingR2T value"); ++ break; ++ case ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_TTT_IS_RSRV: ++ strcpy(additional_notice, "TTT is rsvd"); ++ break; ++ case ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_MAX_BURST_LEN: ++ strcpy(additional_notice, "MBL violation"); ++ break; ++#define BNX2I_ERR_DATA_SEG_LEN_NOT_ZERO \ ++ ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_DATA_SEG_LEN_NOT_ZERO ++ case BNX2I_ERR_DATA_SEG_LEN_NOT_ZERO: ++ strcpy(additional_notice, "data seg len != 0"); ++ break; ++ case ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_REJECT_PDU_LEN: ++ strcpy(additional_notice, "reject pdu len error"); ++ break; ++ case ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_ASYNC_PDU_LEN: ++ strcpy(additional_notice, "async pdu len error"); ++ break; ++ case ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_NOPIN_PDU_LEN: ++ strcpy(additional_notice, "nopin pdu len error"); ++ break; ++#define BNX2_ERR_PEND_R2T_IN_CLEANUP \ ++ ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_PEND_R2T_IN_CLEANUP ++ case BNX2_ERR_PEND_R2T_IN_CLEANUP: ++ strcpy(additional_notice, "pend r2t in cleanup"); ++ break; ++ ++ case ISCI_KCQE_COMPLETION_STATUS_TCP_ERROR_IP_FRAGMENT: ++ strcpy(additional_notice, "IP fragments rcvd"); ++ break; ++ case ISCI_KCQE_COMPLETION_STATUS_TCP_ERROR_IP_OPTIONS: ++ strcpy(additional_notice, "IP options error"); ++ break; ++ case ISCI_KCQE_COMPLETION_STATUS_TCP_ERROR_URGENT_FLAG: ++ strcpy(additional_notice, "urgent flag error"); ++ break; ++ default: ++ printk(KERN_ALERT "iscsi_err - unknown err %x\n", ++ iscsi_err->completion_status); ++ } ++ ++ if (need_recovery) { ++ shost = bnx2i_conn_get_shost(conn); ++ printk(KERN_ALERT "bnx2i: WaTcH: %s - %s\n", ++ message, additional_notice); ++ ++ printk(KERN_ALERT "conn_err - WaTcH: hostno %d conn %p, " ++ "iscsi_cid %x cid %x\n", ++ shost->host_no, conn, ++ conn->ep->ep_iscsi_cid, ++ conn->ep->ep_cid); ++ bnx2i_recovery_que_add_conn(conn->sess->hba, conn); ++ } else ++ if (!test_and_set_bit(iscsi_err->completion_status, ++ (void *) &conn->sess->violation_notified)) ++ printk(KERN_ALERT "bnx2i: WaTcH: %s - %s\n", ++ message, additional_notice); ++} ++ ++ ++/** ++ * bnx2i_process_conn_destroy_cmpl - process iscsi conn destroy completion ++ * ++ * @hba: adapter structure pointer ++ * @conn_destroy: conn destroy kcqe pointer ++ * ++ * handles connection destroy completion request. ++ */ ++static void bnx2i_process_conn_destroy_cmpl(struct bnx2i_hba *hba, ++ struct iscsi_kcqe *conn_destroy) ++{ ++ struct bnx2i_endpoint *ep; ++ ++ ep = bnx2i_find_ep_in_destroy_list(hba, conn_destroy->iscsi_conn_id); ++ if (!ep) { ++ printk(KERN_ALERT "bnx2i_conn_destroy_cmpl: no pending " ++ "offload request, unexpected complection\n"); ++ return; ++ } ++ ++ if (hba != ep->hba) { ++ printk(KERN_ALERT "conn destroy- error hba mis-match\n"); ++ return; ++ } ++ ++ if (conn_destroy->completion_status) { ++ printk(KERN_ALERT "conn_destroy_cmpl: op failed\n"); ++ ep->state = EP_STATE_CLEANUP_FAILED; ++ } else ++ ep->state = EP_STATE_CLEANUP_CMPL; ++ wake_up_interruptible(&ep->ofld_wait); ++ ++ if (test_bit(ADAPTER_STATE_GOING_DOWN, &hba->adapter_state)) ++ wake_up_interruptible(&hba->eh_wait); ++} ++ ++ ++/** ++ * bnx2i_process_ofld_cmpl - process initial iscsi conn offload completion ++ * ++ * @hba: adapter structure pointer ++ * @ofld_kcqe: conn offload kcqe pointer ++ * ++ * handles initial connection offload completion, ep_connect() thread is ++ * woken-up to continue with LLP connect process ++ */ ++static void bnx2i_process_ofld_cmpl(struct bnx2i_hba *hba, ++ struct iscsi_kcqe *ofld_kcqe) ++{ ++ u32 cid_addr; ++ struct bnx2i_endpoint *ep; ++ u32 cid_num; ++ ++ ep = bnx2i_find_ep_in_ofld_list(hba, ofld_kcqe->iscsi_conn_id); ++ if (!ep) { ++ printk(KERN_ALERT "ofld_cmpl: no pend offload request\n"); ++ return; ++ } ++ ++ if (hba != ep->hba) { ++ printk(KERN_ALERT "ofld_cmpl: error hba mis-match\n"); ++ return; ++ } ++ ++ if (ofld_kcqe->completion_status) { ++ if (ofld_kcqe->completion_status == ++ ISCSI_KCQE_COMPLETION_STATUS_CTX_ALLOC_FAILURE) ++ printk(KERN_ALERT "bnx2i: unable to allocate" ++ " iSCSI context resources\n"); ++ ep->state = EP_STATE_OFLD_FAILED; ++ } else { ++ ep->state = EP_STATE_OFLD_COMPL; ++ cid_addr = ofld_kcqe->iscsi_conn_context_id; ++ cid_num = bnx2i_get_cid_num(ep); ++ ep->ep_cid = cid_addr; ++ ep->qp.ctx_base = NULL; ++ } ++ wake_up_interruptible(&ep->ofld_wait); ++} ++ ++/** ++ * bnx2i_indicate_kcqe - process iscsi conn update completion KCQE ++ * ++ * @hba: adapter structure pointer ++ * @update_kcqe: kcqe pointer ++ * ++ * Generic KCQ event handler/dispatcher ++ */ ++static void bnx2i_indicate_kcqe(void *context, struct kcqe *kcqe[], ++ u32 num_cqe) ++{ ++ struct bnx2i_hba *hba = (struct bnx2i_hba *) context; ++ int i = 0; ++ struct iscsi_kcqe *ikcqe = NULL; ++ ++ while (i < num_cqe) { ++ ikcqe = (struct iscsi_kcqe *) kcqe[i++]; ++ ++ if (ikcqe->op_code == ++ ISCSI_KCQE_OPCODE_CQ_EVENT_NOTIFICATION) ++ bnx2i_fastpath_notification(hba, ikcqe); ++ else if (ikcqe->op_code == ISCSI_KCQE_OPCODE_OFFLOAD_CONN) ++ bnx2i_process_ofld_cmpl(hba, ikcqe); ++ else if (ikcqe->op_code == ISCSI_KCQE_OPCODE_UPDATE_CONN) ++ bnx2i_process_update_conn_cmpl(hba, ikcqe); ++ else if (ikcqe->op_code == ISCSI_KCQE_OPCODE_INIT) { ++ if (ikcqe->completion_status != ++ ISCSI_KCQE_COMPLETION_STATUS_SUCCESS) ++ bnx2i_iscsi_license_error(hba, ikcqe->\ ++ completion_status); ++ else { ++ set_bit(ADAPTER_STATE_UP, &hba->adapter_state); ++ bnx2i_get_link_state(hba); ++ printk(KERN_INFO "bnx2i [%.2x:%.2x.%.2x]: " ++ "ISCSI_INIT passed\n", ++ (u8)hba->pcidev->bus->number, ++ hba->pci_devno, ++ (u8)hba->pci_func); ++ } ++ printk(KERN_ALERT "bnx2i: after ISCSI_INIT, hba %p, state %lx\n", hba, hba->adapter_state); ++ } else if (ikcqe->op_code == ISCSI_KCQE_OPCODE_DESTROY_CONN) ++ bnx2i_process_conn_destroy_cmpl(hba, ikcqe); ++ else if (ikcqe->op_code == ISCSI_KCQE_OPCODE_ISCSI_ERROR) ++ bnx2i_process_iscsi_error(hba, ikcqe); ++ else if (ikcqe->op_code == ISCSI_KCQE_OPCODE_TCP_ERROR) ++ bnx2i_process_tcp_error(hba, ikcqe); ++ else ++ printk(KERN_ALERT "bnx2i: unknown opcode 0x%x\n", ++ ikcqe->op_code); ++ } ++} ++ ++ ++/** ++ * bnx2i_indicate_inetevent - Generic netstack event handler ++ * ++ * @context: adapter structure pointer ++ * @event: event type ++ * ++ * Only required to handle NETDEV_UP event at this time ++ */ ++static void bnx2i_indicate_inetevent(void *context, unsigned long event) ++{ ++ struct bnx2i_hba *hba = (struct bnx2i_hba *) context; ++ ++ printk("%s: WaTcH: received inet event, %lx for hba %p\n", ++ __FUNCTION__, event, hba); ++ ++ switch (event) { ++ case NETDEV_UP: ++ bnx2i_iscsi_handle_ip_event(hba); ++ break; ++ default: ++ ; ++ } ++} ++ ++/** ++ * bnx2i_indicate_netevent - Generic netdev event handler ++ * ++ * @context: adapter structure pointer ++ * @event: event type ++ * ++ * Handles four netdev events, NETDEV_UP, NETDEV_DOWN, ++ * NETDEV_GOING_DOWN and NETDEV_CHANGE ++ */ ++static void bnx2i_indicate_netevent(void *context, unsigned long event) ++{ ++ struct bnx2i_hba *hba = (struct bnx2i_hba *) context; ++ ++ printk("%s: WaTcH: received net event, %lx for hba %p\n", ++ __FUNCTION__, event, hba); ++ ++ switch (event) { ++ case NETDEV_UP: ++ if (!test_bit(ADAPTER_STATE_UP, &hba->adapter_state)) ++ bnx2i_send_fw_iscsi_init_msg(hba); ++ break; ++ case NETDEV_DOWN: ++ spin_lock(&hba->net_dev_lock); ++ clear_bit(ADAPTER_STATE_GOING_DOWN, &hba->adapter_state); ++ clear_bit(ADAPTER_STATE_UP, &hba->adapter_state); ++ spin_unlock(&hba->net_dev_lock); ++ break; ++ case NETDEV_GOING_DOWN: ++ spin_lock(&hba->net_dev_lock); ++ set_bit(ADAPTER_STATE_GOING_DOWN, &hba->adapter_state); ++ spin_unlock(&hba->net_dev_lock); ++ bnx2i_start_iscsi_hba_shutdown(hba); ++ break; ++ case NETDEV_CHANGE: ++ bnx2i_get_link_state(hba); ++ break; ++ default: ++ ; ++ } ++ printk("%s: WaTcH: net event end, %lx for hba %p, state %lx\n", ++ __FUNCTION__, event, hba, hba->adapter_state); ++} ++ ++ ++/** ++ * bnx2i_cm_connect_cmpl - process iscsi conn establishment completion ++ * ++ * @cm_sk: cnic sock structure pointer ++ * ++ * function callback exported via bnx2i - cnic driver interface to ++ * indicate completion of option-2 TCP connect request. ++ */ ++static void bnx2i_cm_connect_cmpl(struct cnic_sock *cm_sk) ++{ ++ struct bnx2i_endpoint *ep = (struct bnx2i_endpoint *) cm_sk->context; ++ ++ if (test_bit(ADAPTER_STATE_GOING_DOWN, &ep->hba->adapter_state)) ++ ep->state = EP_STATE_CONNECT_FAILED; ++ else if (test_bit(SK_F_OFFLD_COMPLETE, &cm_sk->flags)) ++ ep->state = EP_STATE_CONNECT_COMPL; ++ else { ++ ep->state = EP_STATE_CONNECT_FAILED; ++ printk("%s: WaTcH: cid %d failed to connect %x\n", ++ __FUNCTION__, ep->ep_iscsi_cid, ep->state); ++ } ++ ++ printk("%s: cid %d connection completed %x\n", __FUNCTION__, ep->ep_iscsi_cid, ep->state); ++ ++ wake_up_interruptible(&ep->ofld_wait); ++} ++ ++ ++/** ++ * bnx2i_cm_close_cmpl - process tcp conn close completion ++ * ++ * @cm_sk: cnic sock structure pointer ++ * ++ * function callback exported via bnx2i - cnic driver interface to ++ * indicate completion of option-2 graceful TCP connect shutdown ++ */ ++static void bnx2i_cm_close_cmpl(struct cnic_sock *cm_sk) ++{ ++ struct bnx2i_endpoint *ep = (struct bnx2i_endpoint *) cm_sk->context; ++ ++ ep->state = EP_STATE_DISCONN_COMPL; ++ ++ printk("%s: cid %d is gracefully shutdown\n", __FUNCTION__, ep->ep_iscsi_cid); ++ ++ wake_up_interruptible(&ep->ofld_wait); ++} ++ ++ ++/** ++ * bnx2i_cm_abort_cmpl - process abortive tcp conn teardown completion ++ * ++ * @cm_sk: cnic sock structure pointer ++ * ++ * function callback exported via bnx2i - cnic driver interface to ++ * indicate completion of option-2 abortive TCP connect termination ++ */ ++static void bnx2i_cm_abort_cmpl(struct cnic_sock *cm_sk) ++{ ++ struct bnx2i_endpoint *ep = (struct bnx2i_endpoint *) cm_sk->context; ++ ++ ep->state = EP_STATE_DISCONN_COMPL; ++ ++ printk("%s: cid %d is torn down successfully\n", __FUNCTION__, ep->ep_iscsi_cid); ++ ++ wake_up_interruptible(&ep->ofld_wait); ++} ++ ++ ++/** ++ * bnx2i_cm_remote_close - process received TCP FIN ++ * ++ * @hba: adapter structure pointer ++ * @update_kcqe: kcqe pointer ++ * ++ * function callback exported via bnx2i - cnic driver interface to indicate ++ * async TCP events such as FIN ++ */ ++static void bnx2i_cm_remote_close(struct cnic_sock *cm_sk) ++{ ++ struct bnx2i_endpoint *ep = (struct bnx2i_endpoint *) cm_sk->context; ++#ifndef __VMKLNX__ ++ struct Scsi_Host *shost; ++#endif ++ ++ ep->state = EP_STATE_TCP_FIN_RCVD; ++ ++ printk("%s: WaTcH: received TCP FIN on cid %d\n", ++ __FUNCTION__, ep->ep_iscsi_cid); ++ ++ ++ if (atomic_read(&ep->conn->worker_enabled)) { ++#ifdef __VMKLNX__ ++ tasklet_schedule(&ep->conn->conn_tasklet); ++#else ++ shost = bnx2i_conn_get_shost(ep->conn); ++ scsi_queue_work(shost, &ep->conn->conn_worker); ++#endif /* __VMKLNX__ */ ++ } ++} ++ ++ ++/** ++ * bnx2i_cm_remote_abort - process TCP RST and start conn cleanup ++ * ++ * @hba: adapter structure pointer ++ * @update_kcqe: kcqe pointer ++ * ++ * function callback exported via bnx2i - cnic driver interface to ++ * indicate async TCP events (RST) sent by the peer. ++ */ ++static void bnx2i_cm_remote_abort(struct cnic_sock *cm_sk) ++{ ++ struct bnx2i_endpoint *ep = (struct bnx2i_endpoint *) cm_sk->context; ++#ifndef __VMKLNX__ ++ struct Scsi_Host *shost; ++#endif ++ ++ ep->state = EP_STATE_TCP_RST_RCVD; ++ ++ printk("%s: WaTcH: received TCP RST on cid %d\n", ++ __FUNCTION__, ep->ep_iscsi_cid); ++ ++ ++ if (atomic_read(&ep->conn->worker_enabled)) { ++#ifdef __VMKLNX__ ++ tasklet_schedule(&ep->conn->conn_tasklet); ++#else ++ shost = bnx2i_conn_get_shost(ep->conn); ++ scsi_queue_work(shost, &ep->conn->conn_worker); ++#endif /* __VMKLNX__ */ ++ } ++} ++ ++ ++/** ++ * bnx2i_cnic_cb - global template of bnx2i - cnic driver interface structure ++ * carrying callback function pointers ++ * ++ */ ++struct cnic_ulp_ops bnx2i_cnic_cb = { ++ .cnic_init = bnx2i_ulp_init, ++ .cnic_exit = bnx2i_ulp_exit, ++ .cnic_start = bnx2i_start, ++ .cnic_stop = bnx2i_stop, ++ .indicate_kcqes = bnx2i_indicate_kcqe, ++ .indicate_netevent = bnx2i_indicate_netevent, ++ .indicate_inetevent = bnx2i_indicate_inetevent, ++ .cm_connect_complete = bnx2i_cm_connect_cmpl, ++ .cm_close_complete = bnx2i_cm_close_cmpl, ++ .cm_abort_complete = bnx2i_cm_abort_cmpl, ++ .cm_remote_close = bnx2i_cm_remote_close, ++ .cm_remote_abort = bnx2i_cm_remote_abort, ++ .owner = THIS_MODULE ++}; ++ ++ ++/** ++ * bnx2i_map_ep_dbell_regs - map connection doorbell registers ++ * ++ * maps connection's SQ and RQ doorbell registers, 5706/5708/5709 hosts these ++ * register in BAR #0. Whereas in 57710 these register are accessed by ++ * mapping BAR #1 ++ */ ++void bnx2i_map_ep_dbell_regs(struct bnx2i_endpoint *ep) ++{ ++ u32 cid_num; ++ u32 reg_off; ++ u32 first_l4l5; ++ u32 ctx_sz; ++ u32 config2; ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18) ++ resource_size_t reg_base; ++#else ++ unsigned long reg_base; ++#endif ++ ++ cid_num = bnx2i_get_cid_num(ep); ++ ++ if (test_bit(BNX2I_NX2_DEV_57710, &ep->hba->cnic_dev_type)) { ++ reg_base = pci_resource_start(ep->hba->pcidev, ++ BNX2X_DOORBELL_PCI_BAR); ++ reg_off = PAGE_SIZE * (cid_num & 0x1FFFF) + DPM_TRIGER_TYPE; ++ ep->qp.ctx_base = ioremap_nocache(reg_base + reg_off, 4); ++ goto arm_cq; ++ } ++ ++ reg_base = ep->hba->netdev->base_addr; ++ if ((test_bit(BNX2I_NX2_DEV_5709, &ep->hba->cnic_dev_type)) && ++ (ep->hba->mail_queue_access == BNX2I_MQ_BIN_MODE)) { ++ config2 = REG_RD(ep->hba, BNX2_MQ_CONFIG2); ++ first_l4l5 = config2 & BNX2_MQ_CONFIG2_FIRST_L4L5; ++ ctx_sz = (config2 & BNX2_MQ_CONFIG2_CONT_SZ) >> 3; ++ if (ctx_sz) ++ reg_off = CTX_OFFSET + MAX_CID_CNT * MB_KERNEL_CTX_SIZE ++ + PAGE_SIZE * ++ (((cid_num - first_l4l5) / ctx_sz) + 256); ++ else ++ reg_off = CTX_OFFSET + (MB_KERNEL_CTX_SIZE * cid_num); ++ } else ++ /* 5709 device in normal node and 5706/5708 devices */ ++ reg_off = CTX_OFFSET + (MB_KERNEL_CTX_SIZE * cid_num); ++ ++ ep->qp.ctx_base = ioremap_nocache(reg_base + reg_off, ++ MB_KERNEL_CTX_SIZE); ++arm_cq: ++ ; ++ bnx2i_arm_cq_event_coalescing(ep, CNIC_ARM_CQE); ++} +diff -r 14194bd97e8c drivers/scsi/bnx2i/bnx2i_init.c +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/scsi/bnx2i/bnx2i_init.c Tue Jun 16 11:09:42 2009 +0100 +@@ -0,0 +1,837 @@ ++/* bnx2i.c: Broadcom NetXtreme II iSCSI driver. ++ * ++ * Copyright (c) 2006 - 2009 Broadcom Corporation ++ * ++ * 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. ++ * ++ * Written by: Anil Veerabhadrappa (anilgv@broadcom.com) ++ */ ++ ++#include "bnx2i.h" ++#ifdef __VMKLNX__ ++#include ++#include ++#endif ++ ++static struct list_head adapter_list; ++static u32 adapter_count; ++int bnx2i_reg_device = 0; ++ ++#define DRV_MODULE_NAME "bnx2i" ++#define DRV_MODULE_VERSION "1.8.9k" ++#define DRV_MODULE_RELDATE "June 02, 2009" ++ ++static char version[] __devinitdata = ++ "Broadcom NetXtreme II iSCSI Driver " DRV_MODULE_NAME \ ++ " v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n"; ++ ++ ++MODULE_AUTHOR("Anil Veerabhadrappa "); ++MODULE_DESCRIPTION("Broadcom NetXtreme II BCM5706/5708/5709/57710 iSCSI Driver"); ++MODULE_LICENSE("GPL"); ++MODULE_VERSION(DRV_MODULE_VERSION); ++ ++#ifdef __VMKLNX__ ++spinlock_t bnx2i_dev_lock = SPIN_LOCK_UNLOCKED; ++#else ++DEFINE_RWLOCK(bnx2i_dev_lock); ++#endif ++ ++unsigned int event_coal_div = 1; ++module_param(event_coal_div, int, 0664); ++MODULE_PARM_DESC(event_coal_div, "Event Coalescing Divide Factor"); ++ ++unsigned int bnx2i_use_tasklets = 0; ++module_param(bnx2i_use_tasklets, int, 0664); ++MODULE_PARM_DESC(bnx2i_use_tasklets, "Use Tasklets For CQ Processing"); ++ ++unsigned int bnx2i_nopout_when_cmds_active = 1; ++module_param(bnx2i_nopout_when_cmds_active, int, 0664); ++MODULE_PARM_DESC(bnx2i_nopout_when_cmds_active, ++ "iSCSI NOOP even when connection is not idle"); ++ ++unsigned int en_tcp_dack = 1; ++module_param(en_tcp_dack, int, 0664); ++MODULE_PARM_DESC(en_tcp_dack, "Enable TCP Delayed ACK"); ++ ++unsigned int time_stamps = 0; ++module_param(time_stamps, int, 0664); ++MODULE_PARM_DESC(time_stamps, "Enable TCP TimeStamps"); ++ ++unsigned int error_mask1 = 0x00; ++module_param(error_mask1, int, 0664); ++MODULE_PARM_DESC(error_mask1, "Config FW iSCSI Error Mask #1"); ++ ++unsigned int error_mask2 = 0x00; ++module_param(error_mask2, int, 0664); ++MODULE_PARM_DESC(error_mask2, "Config FW iSCSI Error Mask #2"); ++ ++unsigned int sq_size = 0; ++module_param(sq_size, int, 0664); ++MODULE_PARM_DESC(sq_size, "Configure SQ size"); ++ ++unsigned int rq_size = BNX2I_RQ_WQES_DEFAULT; ++module_param(rq_size, int, 0664); ++MODULE_PARM_DESC(rq_size, "Configure RQ size"); ++ ++unsigned int tcp_buf_size = 65536; ++module_param(tcp_buf_size, int, 0664); ++MODULE_PARM_DESC(tcp_buf_size, "TCP send/receive buffer size"); ++ ++unsigned int event_coal_min = 24; ++module_param(event_coal_min, int, 0664); ++MODULE_PARM_DESC(event_coal_min, "Event Coalescing Minimum Commands"); ++ ++unsigned int cmd_cmpl_per_work = 24; ++module_param(cmd_cmpl_per_work, int, 0664); ++MODULE_PARM_DESC(cmd_cmpl_per_work, "Number of CQE's processed per work"); ++ ++u64 iscsi_error_mask = 0x00; ++ ++extern struct cnic_ulp_ops bnx2i_cnic_cb; ++extern spinlock_t bnx2i_resc_lock; /* protects global data structures */ ++extern struct tcp_port_mngt bnx2i_tcp_port_tbl; ++ ++static void bnx2i_unreg_one_device(struct bnx2i_hba *hba) ; ++#ifndef __VMKLNX__ ++static int bnx2i_bind_adapter_devices(struct bnx2i_hba *hba); ++static void bnx2i_unbind_adapter_devices(struct bnx2i_hba *hba); ++#else ++void bnx2i_unbind_adapter_devices(struct bnx2i_hba *hba); ++#endif ++ ++ ++/** ++ * bnx2i_identify_device - identifies NetXtreme II device type ++ * ++ * @hba: Adapter structure pointer ++ * ++ * This function identifies the NX2 device type and sets appropriate ++ * queue mailbox register access method, 5709 requires driver to ++ * access MBOX regs using *bin* mode ++ **/ ++void bnx2i_identify_device(struct bnx2i_hba *hba) ++{ ++ hba->cnic_dev_type = 0; ++ if ((hba->pci_did == PCI_DEVICE_ID_NX2_5706) || ++ (hba->pci_did == PCI_DEVICE_ID_NX2_5706S)) ++ set_bit(BNX2I_NX2_DEV_5706, &hba->cnic_dev_type); ++ else if ((hba->pci_did == PCI_DEVICE_ID_NX2_5708) || ++ (hba->pci_did == PCI_DEVICE_ID_NX2_5708S)) ++ set_bit(BNX2I_NX2_DEV_5708, &hba->cnic_dev_type); ++ else if ((hba->pci_did == PCI_DEVICE_ID_NX2_5709) || ++ (hba->pci_did == PCI_DEVICE_ID_NX2_5709S)) { ++ set_bit(BNX2I_NX2_DEV_5709, &hba->cnic_dev_type); ++ hba->mail_queue_access = 0| BNX2I_MQ_BIN_MODE; ++ } else if (hba->pci_did == PCI_DEVICE_ID_NX2_57710 || ++ hba->pci_did == PCI_DEVICE_ID_NX2_57711 || ++ hba->pci_did == PCI_DEVICE_ID_NX2_57711E) ++ set_bit(BNX2I_NX2_DEV_57710, &hba->cnic_dev_type); ++ else ++ printk(KERN_ERR "bnx2i- unknown device, 0x%x\n", hba->pci_did); ++} ++ ++/** ++ * bnx2i_get_tcp_port_requirements - returns num tcp ports to alloc/bind ++ * ++ * driver returns the number of TCP ports to be allocated/bound by 'bnx2id' ++ * daemon. Return value of '0' means driver has everything to support ++ * max iscsi connections on enumerated NX2 devices ++ **/ ++int bnx2i_get_tcp_port_requirements(void) ++{ ++ struct list_head *list; ++ struct list_head *temp; ++ struct bnx2i_hba *hba; ++ int count = 0; ++ ++#ifdef __VMKLNX__ ++ spin_lock(&bnx2i_dev_lock); ++#else ++ read_lock(&bnx2i_dev_lock); ++#endif ++ list_for_each_safe(list, temp, &adapter_list) { ++ hba = (struct bnx2i_hba *) list; ++ count += hba->max_active_conns; ++ } ++#ifdef __VMKLNX__ ++ spin_unlock(&bnx2i_dev_lock); ++#else ++ read_unlock(&bnx2i_dev_lock); ++#endif ++ return count; ++} ++ ++ ++/** ++ * get_adapter_list_head - returns head of adapter list ++ * ++ **/ ++struct bnx2i_hba *get_adapter_list_head(void) ++{ ++ struct list_head *list; ++ struct bnx2i_hba *hba = NULL; ++ ++ if (!adapter_count) ++ goto hba_not_found; ++ ++#ifdef __VMKLNX__ ++ spin_lock(&bnx2i_dev_lock); ++#else ++ read_lock(&bnx2i_dev_lock); ++#endif ++ list_for_each(list, &adapter_list) { ++ hba = (struct bnx2i_hba *) list; ++ if (hba && hba->cnic && hba->cnic->cm_select_dev) ++ break; ++ hba = NULL; ++ } ++#ifdef __VMKLNX__ ++ spin_unlock(&bnx2i_dev_lock); ++#else ++ read_unlock(&bnx2i_dev_lock); ++#endif ++hba_not_found: ++ return hba; ++} ++ ++/** ++ * bnx2i_get_hba_from_template - maps scsi_transport_template to ++ * bnx2i adapter pointer ++ * @scsit: scsi transport template pointer ++ * ++ **/ ++struct bnx2i_hba *bnx2i_get_hba_from_template( ++ struct scsi_transport_template *scsit) ++{ ++ struct list_head *list; ++ struct bnx2i_hba *hba = NULL; ++ int match_found = 0; ++ ++#ifdef __VMKLNX__ ++ spin_lock(&bnx2i_dev_lock); ++#else ++ read_lock(&bnx2i_dev_lock); ++#endif ++ list_for_each(list, &adapter_list) { ++ hba = (struct bnx2i_hba *) list; ++ if (hba->shost_template == scsit) { ++ match_found = 1; ++ break; ++ } ++ } ++#ifdef __VMKLNX__ ++ spin_unlock(&bnx2i_dev_lock); ++#else ++ read_unlock(&bnx2i_dev_lock); ++#endif ++ ++ if (match_found == 0) ++ hba = NULL; ++ return hba; ++} ++ ++ ++/** ++ * bnx2i_find_hba_for_cnic - maps cnic device instance to bnx2i adapter instance ++ * ++ * @cnic: pointer to cnic device instance ++ * ++ **/ ++struct bnx2i_hba *bnx2i_find_hba_for_cnic(struct cnic_dev *cnic) ++{ ++ struct list_head *list; ++ struct list_head *temp; ++ struct bnx2i_hba *hba; ++ ++#ifdef __VMKLNX__ ++ spin_lock(&bnx2i_dev_lock); ++#else ++ read_lock(&bnx2i_dev_lock); ++#endif ++ list_for_each_safe(list, temp, &adapter_list) { ++ hba = (struct bnx2i_hba *) list; ++ ++ if (hba->cnic == cnic) { ++#ifdef __VMKLNX__ ++ spin_unlock(&bnx2i_dev_lock); ++#else ++ read_unlock(&bnx2i_dev_lock); ++#endif ++ return hba; ++ } ++ } ++#ifdef __VMKLNX__ ++ spin_unlock(&bnx2i_dev_lock); ++#else ++ read_unlock(&bnx2i_dev_lock); ++#endif ++ return NULL; ++} ++ ++ ++#ifdef __VMKLNX__ ++static void bnx2i_check_iscsi_support(struct bnx2i_hba *hba) ++{ ++ if (hba->shost_template) ++ return; ++ ++ /* unless you register the device cnic can't get information ++ * to determine iscsi is supported or not ++ */ ++ bnx2i_register_device(hba, BNX2I_REGISTER_HBA_FORCED); ++ bnx2i_register_xport(hba); ++ bnx2i_unreg_one_device(hba); ++} ++ ++void bnx2i_lookup_iscsi_hba_vm(void) ++{ ++ struct list_head *list; ++ struct bnx2i_hba *hba = NULL; ++ ++ if (!adapter_count) ++ return; ++ ++ list_for_each(list, &adapter_list) { ++ hba = (struct bnx2i_hba *) list; ++ ++ bnx2i_check_iscsi_support(hba); ++ } ++} ++#endif /* __VMKLNX__ */ ++ ++/** ++ * bnx2i_start - cnic callback to initialize & start adapter instance ++ * ++ * @handle: transparent handle pointing to adapter structure ++ * ++ * This function maps adapter structure to pcidev structure and initiates ++ * firmware handshake to enable/initialize on chip iscsi components ++ * This bnx2i - cnic interface api callback is issued after following ++ * 2 conditions are met - ++ * a) underlying network interface is up (marked by event 'NETDEV_UP' ++ * from netdev ++ * b) bnx2i adapter instance is registered ++ **/ ++void bnx2i_start(void *handle) ++{ ++#define BNX2I_INIT_POLL_TIME (1000 / HZ) ++ struct bnx2i_hba *hba = handle; ++ int i = HZ; ++ ++#ifndef __VMKLNX__ ++ bnx2i_bind_adapter_devices(hba); ++#endif ++ bnx2i_send_fw_iscsi_init_msg(hba); ++ do { ++ if (test_bit(ADAPTER_STATE_UP, &hba->adapter_state) || ++ test_bit(ADAPTER_STATE_INIT_FAILED, &hba->adapter_state)) ++ break; ++ msleep(BNX2I_INIT_POLL_TIME); ++ } while (i--); ++} ++ ++ ++/** ++ * bnx2i_stop - cnic callback to shutdown adapter instance ++ * ++ * @handle: transparent handle pointing to adapter structure ++ * ++ * driver checks if adapter is already in shutdown mode, if not start ++ * the shutdown process ++ **/ ++void bnx2i_stop(void *handle) ++{ ++ struct bnx2i_hba *hba = handle; ++ ++ /* check if cleanup happened in GOING_DOWN context */ ++ if (!test_bit(ADAPTER_STATE_GOING_DOWN, &hba->adapter_state)) { ++ spin_lock(&hba->net_dev_lock); ++ set_bit(ADAPTER_STATE_GOING_DOWN, &hba->adapter_state); ++ spin_unlock(&hba->net_dev_lock); ++ bnx2i_start_iscsi_hba_shutdown(hba); ++ } ++ clear_bit(ADAPTER_STATE_GOING_DOWN, &hba->adapter_state); ++ clear_bit(ADAPTER_STATE_UP, &hba->adapter_state); ++ ++} ++ ++/** ++ * bnx2i_register_device - register bnx2i adapter instance with the cnic driver ++ * ++ * @hba: Adapter instance to register ++ * @reg_mode: 0 -> register only licensed hba, 1 -> all ++ * ++ * registers bnx2i adapter instance with the cnic driver while holding the ++ * adapter structure lock ++ **/ ++void bnx2i_register_device(struct bnx2i_hba *hba, int reg_mode) ++{ ++ spin_lock(&hba->lock); ++ if (test_bit(ADAPTER_STATE_GOING_DOWN, &hba->adapter_state) || ++ test_bit(BNX2I_CNIC_REGISTERED, &hba->reg_with_cnic) || ++ ((reg_mode == BNX2I_REGISTER_HBA_SUPPORTED) && ++ (!hba->cnic->max_iscsi_conn))) ++ goto rel_lock; ++ ++ spin_unlock(&hba->lock); ++ hba->cnic->register_device(hba->cnic, CNIC_ULP_ISCSI, (void *) hba); ++ spin_lock(&hba->lock); ++ bnx2i_reg_device++; ++ set_bit(BNX2I_CNIC_REGISTERED, &hba->reg_with_cnic); ++rel_lock: ++ spin_unlock(&hba->lock); ++} ++ ++ ++/** ++ * bnx2i_reg_dev_all - registers all bnx2i adapter instances with the ++ * cnic driver ++ * ++ * registers all bnx2i adapter instances with the cnic driver while holding ++ * the global resource lock ++ **/ ++void bnx2i_reg_dev_all(void) ++{ ++ struct list_head *list; ++ struct list_head *temp; ++ ++#ifdef __VMKLNX__ ++ spin_lock(&bnx2i_dev_lock); ++#else ++ read_lock(&bnx2i_dev_lock); ++#endif ++ list_for_each_safe(list, temp, &adapter_list) { ++ struct bnx2i_hba *hba = (struct bnx2i_hba *)list; ++#ifdef __VMKLNX__ ++ spin_unlock(&bnx2i_dev_lock); ++ bnx2i_register_device(hba, BNX2I_REGISTER_HBA_SUPPORTED); ++ spin_lock(&bnx2i_dev_lock); ++#else ++ read_unlock(&bnx2i_dev_lock); ++ bnx2i_register_device(hba, BNX2I_REGISTER_HBA_FORCED); ++ read_lock(&bnx2i_dev_lock); ++#endif ++ } ++#ifdef __VMKLNX__ ++ spin_unlock(&bnx2i_dev_lock); ++#else ++ read_unlock(&bnx2i_dev_lock); ++#endif ++} ++ ++ ++/** ++ * bnx2i_unreg_one_device - unregister bnx2i adapter instance with ++ * the cnic driver ++ * ++ * @hba: Adapter instance to unregister ++ * ++ * registers bnx2i adapter instance with the cnic driver while holding ++ * the adapter structure lock ++ **/ ++static void bnx2i_unreg_one_device(struct bnx2i_hba *hba) ++{ ++ spin_lock(&hba->lock); /* ep_connect/ep_disconnect() */ ++ if (hba->ofld_conns_active || ++ !test_bit(BNX2I_CNIC_REGISTERED, &hba->reg_with_cnic) || ++ test_bit(ADAPTER_STATE_GOING_DOWN, &hba->adapter_state)) { ++ spin_unlock(&hba->lock); ++ return; ++ } ++ ++ spin_unlock(&hba->lock); ++ hba->cnic->unregister_device(hba->cnic, CNIC_ULP_ISCSI); ++ spin_lock(&hba->lock); /* ep_connect/ep_disconnect() */ ++ barrier(); ++ bnx2i_reg_device--; ++ /* ep_disconnect could come before NETDEV_DOWN, driver won't ++ * see NETDEV_DOWN as it already unregistered itself. ++ */ ++ hba->adapter_state = 0; ++ clear_bit(BNX2I_CNIC_REGISTERED, &hba->reg_with_cnic); ++#ifndef __VMKLNX__ ++ bnx2i_unbind_adapter_devices(hba); ++#endif ++ spin_unlock(&hba->lock); ++} ++ ++/** ++ * bnx2i_unreg_dev_all - unregisters all bnx2i adapter instances with the ++ * cnic driver ++ * ++ * unregisters all bnx2i adapter instances with the cnic driver while holding ++ * the global resource lock ++ **/ ++void bnx2i_unreg_dev_all(void) ++{ ++ struct list_head *list; ++ struct list_head *temp; ++ ++#ifdef __VMKLNX__ ++ spin_lock(&bnx2i_dev_lock); ++#else ++ read_lock(&bnx2i_dev_lock); ++#endif ++ list_for_each_safe(list, temp, &adapter_list) ++ bnx2i_unreg_one_device((struct bnx2i_hba *) list); ++#ifdef __VMKLNX__ ++ spin_unlock(&bnx2i_dev_lock); ++#else ++ read_unlock(&bnx2i_dev_lock); ++#endif ++} ++ ++ ++/** ++ * bnx2i_bind_adapter_devices - binds bnx2i adapter with the associated ++ * pcidev structure ++ * ++ * @hba: Adapter instance ++ * ++ * With newly introduced changes to bnx2i - cnic interface, cnic_dev's 'pcidev' ++ * field will be valid only after bnx2i registers the device instance. ++ * Earlier this field was valid right during device enumeration process ++ **/ ++#ifndef __VMKLNX__ ++static ++#endif ++int bnx2i_bind_adapter_devices(struct bnx2i_hba *hba) ++{ ++ struct cnic_dev *cnic; ++ int nx2_10g_dev = 0; ++ ++ if (!hba->cnic) ++ return -ENODEV; ++ ++ cnic = hba->cnic; ++ hba->pcidev = cnic->pcidev; ++ if (hba->pcidev) { ++ pci_dev_get(hba->pcidev); ++ hba->pci_did = hba->pcidev->device; ++ hba->pci_vid = hba->pcidev->vendor; ++ hba->pci_sdid = hba->pcidev->subsystem_device; ++ hba->pci_svid = hba->pcidev->subsystem_vendor; ++ hba->pci_func = PCI_FUNC(hba->pcidev->devfn); ++ hba->pci_devno = PCI_SLOT(hba->pcidev->devfn); ++ } ++ ++ bnx2i_identify_device(hba); ++ ++ if (test_bit(BNX2I_NX2_DEV_5709, &hba->cnic_dev_type)) { ++ hba->regview = ioremap_nocache(hba->netdev->base_addr, ++ BNX2_MQ_CONFIG2); ++ if (!hba->regview) ++ goto mem_err; ++ } else if (test_bit(BNX2I_NX2_DEV_57710, &hba->cnic_dev_type)) { ++ nx2_10g_dev = 1; ++ hba->regview = ioremap_nocache(hba->netdev->base_addr, 4096); ++ if (!hba->regview) ++ goto mem_err; ++ } ++ ++ if (nx2_10g_dev) { ++ hba->conn_teardown_tmo = 15 * HZ; ++ hba->conn_ctx_destroy_tmo = 6 * HZ; ++ hba->hba_shutdown_tmo = 240 * HZ; ++ } else { ++ hba->conn_teardown_tmo = 6 * HZ; ++ hba->conn_ctx_destroy_tmo = 2 * HZ; ++ hba->hba_shutdown_tmo = 30 * HZ; ++ } ++ ++ if (bnx2i_setup_mp_bdt(hba)) ++ goto mem_err; ++ ++ return 0; ++ ++mem_err: ++ bnx2i_unbind_adapter_devices(hba); ++ return -ENOMEM; ++} ++ ++ ++/** ++ * bnx2i_unbind_adapter_devices - removes bnx2i adapter to pcidev mapping ++ * ++ * @hba: Adapter instance ++ * ++ **/ ++void bnx2i_unbind_adapter_devices(struct bnx2i_hba *hba) ++{ ++ if (hba->regview) { ++ iounmap(hba->regview); ++ hba->regview = NULL; ++ } ++ ++ bnx2i_free_mp_bdt(hba); ++ ++ if (hba->pcidev) ++ pci_dev_put(hba->pcidev); ++ hba->pcidev = NULL; ++#ifdef __VMKLNX__ ++ scsi_remove_host(hba->shost); ++#endif ++} ++ ++ ++/** ++ * bnx2i_init_one - initialize an adapter instance and allocate necessary ++ * memory resources ++ * ++ * @hba: bnx2i adapter instance ++ * @cnic: cnic device handle ++ * ++ * Global resource lock and host adapter lock is held during critical sections ++ * below. This routine is called from cnic_register_driver() context and ++ * work horse thread which does majority of device specific initialization ++ **/ ++static int bnx2i_init_one(struct bnx2i_hba *hba, struct cnic_dev *cnic) ++{ ++ int rc; ++ ++#ifdef __VMKLNX__ ++ spin_lock(&bnx2i_dev_lock); ++#else ++ read_lock(&bnx2i_dev_lock); ++#endif ++ hba->netdev = cnic->netdev; ++ if (bnx2i_reg_device && ++ !test_bit(BNX2I_CNIC_REGISTERED, &hba->reg_with_cnic)) { ++ rc = cnic->register_device(cnic, CNIC_ULP_ISCSI, ++ (void *) hba); ++ if (rc) /* duplicate registration */ ++ printk(KERN_ERR "bnx2i- dev reg failed\n"); ++ spin_lock(&hba->lock); /* hot plug */ ++ bnx2i_reg_device++; ++ hba->age++; ++ set_bit(BNX2I_CNIC_REGISTERED, &hba->reg_with_cnic); ++ spin_unlock(&hba->lock); ++ } ++#ifdef __VMKLNX__ ++ spin_unlock(&bnx2i_dev_lock); ++#else ++ read_unlock(&bnx2i_dev_lock); ++#endif ++ ++ if (cnic->netdev) ++ memcpy(hba->mac_addr, cnic->netdev->dev_addr, MAX_ADDR_LEN); ++ ++ /* Allocate memory & initialize the SCSI/iSCSI host templates */ ++ rc = bnx2i_register_xport(hba); ++#ifndef __VMKLNX__ ++ if (rc) ++ goto failed_xport_reg; ++#endif ++ ++ /* create 'sysfs' device objects */ ++ rc = bnx2i_register_sysfs(hba); ++ if (rc) ++ goto failed_sysfs_reg; ++ ++ bnx2i_tcp_port_tbl.num_required += hba->max_active_conns; ++ ++#ifdef __VMKLNX__ ++ spin_lock(&bnx2i_dev_lock); ++#else ++ write_lock(&bnx2i_dev_lock); ++#endif ++ list_add_tail(&hba->link, &adapter_list); ++ adapter_count++; ++#ifdef __VMKLNX__ ++ spin_unlock(&bnx2i_dev_lock); ++#else ++ write_unlock(&bnx2i_dev_lock); ++#endif ++ ++ return 0; ++ ++failed_sysfs_reg: ++ bnx2i_deregister_xport(hba); ++ bnx2i_free_iscsi_scsi_template(hba); ++ ++#ifndef __VMKLNX__ ++failed_xport_reg: ++ bnx2i_unbind_adapter_devices(hba); ++#endif ++ cnic->unregister_device(cnic, CNIC_ULP_ISCSI); ++ bnx2i_reg_device--; ++ clear_bit(BNX2I_CNIC_REGISTERED, &hba->reg_with_cnic); ++ return rc; ++} ++ ++ ++/** ++ * bnx2i_ulp_init - initialize an adapter instance ++ * ++ * @dev: cnic device handle ++ * ++ * Called from cnic_register_driver() context to initialize all enumerated ++ * cnic devices. This routine allocate adapter structure and other ++ * device specific resources. ++ **/ ++void bnx2i_ulp_init(struct cnic_dev *dev) ++{ ++ struct bnx2i_hba *hba; ++ ++ /* Allocate a HBA structure for this device */ ++ hba = bnx2i_alloc_hba(dev); ++ if (!hba) { ++ printk(KERN_ERR "init: hba initialization failed\n"); ++ return; ++ } ++ ++ /* Get PCI related information and update hba struct members */ ++ clear_bit(BNX2I_CNIC_REGISTERED, &hba->reg_with_cnic); ++ if (bnx2i_init_one(hba, dev)) ++ printk(KERN_ERR "bnx2i - hba %p init failed\n", hba); ++} ++ ++ ++/** ++ * bnx2i_ulp_exit - shuts down adapter instance and frees all resources ++ * ++ * @dev: cnic device handle ++ * ++ **/ ++void bnx2i_ulp_exit(struct cnic_dev *dev) ++{ ++ struct bnx2i_hba *hba; ++ ++ hba = bnx2i_find_hba_for_cnic(dev); ++ if (!hba) { ++ printk(KERN_INFO "bnx2i_ulp_exit: hba not " ++ "found, dev 0x%p\n", dev); ++ return; ++ } ++#ifdef __VMKLNX__ ++ spin_lock(&bnx2i_dev_lock); ++#else ++ write_lock(&bnx2i_dev_lock); ++#endif ++ list_del_init(&hba->link); ++ bnx2i_tcp_port_tbl.num_required -= hba->max_active_conns; ++ adapter_count--; ++ ++ /* cleanup 'sysfs' devices and classes */ ++ bnx2i_unregister_sysfs(hba); ++ ++ if (test_bit(BNX2I_CNIC_REGISTERED, &hba->reg_with_cnic)) { ++ hba->cnic->unregister_device(hba->cnic, CNIC_ULP_ISCSI); ++ spin_lock(&hba->lock); /* hot remove */ ++ clear_bit(BNX2I_CNIC_REGISTERED, &hba->reg_with_cnic); ++ bnx2i_reg_device--; ++#ifndef __VMKLNX__ ++ bnx2i_unbind_adapter_devices(hba); ++#endif ++ spin_unlock(&hba->lock); ++ } ++#ifdef __VMKLNX__ ++ spin_unlock(&bnx2i_dev_lock); ++#else ++ write_unlock(&bnx2i_dev_lock); ++#endif ++ ++ if (hba->pcidev) ++ pci_dev_put(hba->pcidev); ++ ++ bnx2i_deregister_xport(hba); ++ bnx2i_free_iscsi_scsi_template(hba); ++ bnx2i_free_hba(hba); ++} ++ ++ ++/** ++ * bnx2i_mod_init - module init entry point ++ * ++ * initialize any driver wide global data structures such as endpoint pool, ++ * tcp port manager/queue, sysfs. finally driver will register itself ++ * with the cnic module ++ **/ ++static int __init bnx2i_mod_init(void) ++{ ++ printk(KERN_INFO "%s", version); ++ ++ INIT_LIST_HEAD(&adapter_list); ++ adapter_count = 0; ++ ++ bnx2i_alloc_ep_pool(); ++ bnx2i_init_tcp_port_mngr(); ++ ++ /* create 'sysfs' class object */ ++ bnx2i_sysfs_setup(); ++ ++ cnic_register_driver(CNIC_ULP_ISCSI, &bnx2i_cnic_cb); ++ ++#ifdef __VMKLNX__ ++ bnx2i_lookup_iscsi_hba_vm(); ++#else ++ bnx2i_ioctl_init(); ++#endif ++ ++ return 0; ++} ++ ++ ++/** ++ * bnx2i_mod_exit - module cleanup/exit entry point ++ * ++ * Global resource lock and host adapter lock is held during critical sections ++ * in this function. Driver will browse through the adapter list, cleans-up ++ * each instance, unregisters iscsi transport name and finally driver will ++ * unregister itself with the cnic module ++ **/ ++static void __exit bnx2i_mod_exit(void) ++{ ++ struct list_head *list; ++ struct list_head *temp; ++ struct bnx2i_hba *hba; ++ ++#ifdef __VMKLNX__ ++ spin_lock(&bnx2i_dev_lock); ++#else ++ write_lock(&bnx2i_dev_lock); ++#endif ++ list_for_each_safe(list, temp, &adapter_list) { ++ list_del_init(list); ++ hba = (struct bnx2i_hba *) list; ++ ++ /* cleanup 'sysfs' devices and classes */ ++ bnx2i_unregister_sysfs(hba); ++ ++ if (test_bit(BNX2I_CNIC_REGISTERED, &hba->reg_with_cnic)) { ++ hba->cnic->unregister_device(hba->cnic, CNIC_ULP_ISCSI); ++ clear_bit(BNX2I_CNIC_REGISTERED, &hba->reg_with_cnic); ++ bnx2i_reg_device--; ++#ifndef __VMKLNX__ ++ bnx2i_unbind_adapter_devices(hba); ++#endif ++ } ++ ++ if (hba->pcidev) ++ pci_dev_put(hba->pcidev); ++ bnx2i_deregister_xport(hba); ++ bnx2i_free_iscsi_scsi_template(hba); ++ bnx2i_free_hba(hba); ++ adapter_count--; ++ } ++#ifdef __VMKLNX__ ++ spin_unlock(&bnx2i_dev_lock); ++#else ++ write_unlock(&bnx2i_dev_lock); ++#endif ++ ++#ifndef __VMKLNX__ ++ bnx2i_ioctl_cleanup(); ++#endif ++ cnic_unregister_driver(CNIC_ULP_ISCSI); ++ ++ bnx2i_sysfs_cleanup(); ++ bnx2i_cleanup_tcp_port_mngr(); ++ bnx2i_release_ep_pool(); ++} ++ ++module_init(bnx2i_mod_init); ++module_exit(bnx2i_mod_exit); +diff -r 14194bd97e8c drivers/scsi/bnx2i/bnx2i_ioctl.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/scsi/bnx2i/bnx2i_ioctl.h Tue Jun 16 11:09:42 2009 +0100 +@@ -0,0 +1,46 @@ ++/* bnx2i_ioctl.h: Broadcom NetXtreme II iSCSI driver. ++ * ++ * Copyright (c) 2006 - 2009 Broadcom Corporation ++ * ++ * 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. ++ * ++ * Written by: Anil Veerabhadrappa (anilgv@broadcom.com) ++ */ ++#ifndef _BNX2I_IOCTL_H ++#define _BNX2I_IOCTL_H ++ ++#define MAX_SIG_SIZE 32 ++#define MAX_XPORT_NAME 16 ++#define MAX_DEV_NAME_SIZE 16 ++ ++#define BNX2I_MGMT_SIGNATURE "bnx2i-mgmt:1.0" ++ ++ ++ ++struct bnx2i_ioctl_header { ++ char signature[MAX_SIG_SIZE]; ++ char xport_name[MAX_XPORT_NAME]; ++ char dev_name[MAX_DEV_NAME_SIZE]; ++}; ++ ++ ++struct bnx2i_get_port_count { ++ struct bnx2i_ioctl_header hdr; ++ unsigned int port_count; ++}; ++ ++struct bnx2i_set_port_num { ++ struct bnx2i_ioctl_header hdr; ++ unsigned int num_ports; ++ unsigned short tcp_port[1]; ++}; ++ ++ ++#define BNX2I_IOCTL_GET_PORT_REQ \ ++ _IOWR('I', 101, struct bnx2i_get_port_count) ++#define BNX2I_IOCTL_SET_TCP_PORT \ ++ _IOWR('I', 102, struct bnx2i_set_port_num) ++ ++#endif +diff -r 14194bd97e8c drivers/scsi/bnx2i/bnx2i_iscsi.c +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/scsi/bnx2i/bnx2i_iscsi.c Tue Jun 16 11:09:42 2009 +0100 +@@ -0,0 +1,6187 @@ ++/* bnx2i_iscsi.c: Broadcom NetXtreme II iSCSI driver. ++ * ++ * Copyright (c) 2006 - 2009 Broadcom Corporation ++ * ++ * 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. ++ * ++ * Written by: Anil Veerabhadrappa (anilgv@broadcom.com) ++ */ ++ ++#include "bnx2i.h" ++#include ++#ifdef __VMKLNX__ ++#include ++#include ++#endif ++#include ++#include ++ ++struct scsi_host_template bnx2i_host_template; ++struct iscsi_transport bnx2i_iscsi_transport; ++struct file_operations bnx2i_mgmt_fops; ++extern unsigned int bnx2i_nopout_when_cmds_active; ++extern unsigned int tcp_buf_size; ++extern unsigned int en_tcp_dack; ++extern unsigned int time_stamps; ++ ++/* ++ * Global endpoint resource info ++ */ ++static void *bnx2i_ep_pages[MAX_PAGES_PER_CTRL_STRUCT_POOL]; ++static struct list_head bnx2i_free_ep_list; ++static struct list_head bnx2i_unbound_ep; ++static u32 bnx2i_num_free_ep; ++static u32 bnx2i_max_free_ep; ++static DEFINE_SPINLOCK(bnx2i_resc_lock); /* protects global resources */ ++struct tcp_port_mngt bnx2i_tcp_port_tbl; ++ ++extern unsigned int sq_size; ++extern unsigned int rq_size; ++ ++ ++int use_poll_timer = 1; ++ ++/* Char device major number */ ++static int bnx2i_major_no; ++ ++static struct io_bdt *bnx2i_alloc_bd_table(struct bnx2i_sess *sess, ++ struct bnx2i_cmd *); ++ ++static struct scsi_host_template * ++bnx2i_alloc_scsi_host_template(struct bnx2i_hba *hba, struct cnic_dev *cnic); ++static void ++bnx2i_free_scsi_host_template(struct scsi_host_template *scsi_template); ++static struct iscsi_transport * ++bnx2i_alloc_iscsi_transport(struct bnx2i_hba *hba, struct cnic_dev *cnic, struct scsi_host_template *); ++static void bnx2i_free_iscsi_transport(struct iscsi_transport *iscsi_transport); ++static void bnx2i_release_session_resc(struct iscsi_cls_session *cls_session); ++ ++#ifdef __VMKLNX__ ++static void bnx2i_conn_main_worker(unsigned long data); ++vmk_int32 bnx2i_get_570x_limit(enum iscsi_param param, ++ TransportParamLimit *limit, vmk_int32 maxListLen); ++vmk_int32 bnx2i_get_5771x_limit(enum iscsi_param param, ++ TransportParamLimit *limit, ++ vmk_int32 maxListLen); ++extern int bnx2i_cqe_work_pending(struct bnx2i_conn *conn); ++#else ++#if defined(INIT_DELAYED_WORK_DEFERRABLE) || defined(INIT_WORK_NAR) ++static void bnx2i_conn_main_worker(struct work_struct *work); ++#else ++static void bnx2i_conn_main_worker(void *data); ++extern int bnx2i_cqe_work_pending(struct bnx2i_conn *conn); ++#endif ++#endif /*__VMKLNX__ */ ++static void bnx2i_xmit_work_send_cmd(struct bnx2i_conn *conn, struct bnx2i_cmd *cmd); ++static void bnx2i_cleanup_task_context(struct bnx2i_sess *sess, ++ struct bnx2i_cmd *cmd, ++ int reason, int clear_ctx); ++ ++ ++#ifdef __VMKLNX__ ++extern int bnx2i_bind_adapter_devices(struct bnx2i_hba *hba); ++#endif ++void bnx2i_unbind_adapter_devices(struct bnx2i_hba *hba); ++static void bnx2i_conn_poll(unsigned long data); ++ ++/* ++ * iSCSI Session's hostdata organization: ++ * ++ * *------------------* <== hostdata_session(host->hostdata) ++ * | ptr to class sess| ++ * |------------------| <== iscsi_hostdata(host->hostdata) ++ * | iscsi_session | ++ * *------------------* ++ */ ++ ++#define hostdata_privsize(_sz) (sizeof(unsigned long) + _sz + \ ++ _sz % sizeof(unsigned long)) ++#define hostdata_session(_hostdata) (iscsi_ptr(*(unsigned long *)_hostdata)) ++ ++#define session_to_cls(_sess) hostdata_session(_sess->shost->hostdata) ++ ++/** ++ * bnx2i_alloc_tcp_port - allocates a tcp port from the free list ++ * ++ * assumes this function is called with 'bnx2i_resc_lock' held ++ **/ ++#ifndef __VMKLNX__ ++static u16 bnx2i_alloc_tcp_port(void) ++{ ++ u16 tcp_port; ++ ++ if (!bnx2i_tcp_port_tbl.num_free_ports || !bnx2i_tcp_port_tbl.free_q) ++ return 0; ++ ++ tcp_port = bnx2i_tcp_port_tbl.free_q[bnx2i_tcp_port_tbl.cons_idx]; ++ bnx2i_tcp_port_tbl.cons_idx++; ++ bnx2i_tcp_port_tbl.cons_idx %= bnx2i_tcp_port_tbl.max_idx; ++ bnx2i_tcp_port_tbl.num_free_ports--; ++ ++ return tcp_port; ++} ++#endif ++ ++ ++/** ++ * bnx2i_free_tcp_port - Frees the given tcp port back to free pool ++ * ++ * @port: tcp port number being freed ++ * ++ * assumes this function is called with 'bnx2i_resc_lock' held ++ **/ ++static void bnx2i_free_tcp_port(u16 port) ++{ ++ if (!bnx2i_tcp_port_tbl.free_q) ++ return; ++ ++ bnx2i_tcp_port_tbl.free_q[bnx2i_tcp_port_tbl.prod_idx] = port; ++ bnx2i_tcp_port_tbl.prod_idx++; ++ bnx2i_tcp_port_tbl.prod_idx %= bnx2i_tcp_port_tbl.max_idx; ++ bnx2i_tcp_port_tbl.num_free_ports++; ++} ++ ++/** ++ * bnx2i_tcp_port_new_entry - place 'bnx2id' allocated tcp port number ++ * to free list ++ * ++ * @port: tcp port number being added to free pool ++ * ++ * 'bnx2i_resc_lock' is held while operating on global tcp port table ++ **/ ++void bnx2i_tcp_port_new_entry(u16 tcp_port) ++{ ++ u32 idx = bnx2i_tcp_port_tbl.prod_idx; ++ ++ spin_lock(&bnx2i_resc_lock); ++ bnx2i_tcp_port_tbl.free_q[idx] = tcp_port; ++ bnx2i_tcp_port_tbl.prod_idx++; ++ bnx2i_tcp_port_tbl.prod_idx %= bnx2i_tcp_port_tbl.max_idx; ++ bnx2i_tcp_port_tbl.num_free_ports++; ++ bnx2i_tcp_port_tbl.num_required--; ++ spin_unlock(&bnx2i_resc_lock); ++} ++ ++/** ++ * bnx2i_init_tcp_port_mngr - initializes tcp port manager ++ * ++ */ ++void bnx2i_init_tcp_port_mngr(void) ++{ ++ int mem_size; ++ ++ bnx2i_tcp_port_tbl.num_free_ports = 0; ++ bnx2i_tcp_port_tbl.prod_idx = 0; ++ bnx2i_tcp_port_tbl.cons_idx = 0; ++ bnx2i_tcp_port_tbl.max_idx = 0; ++ bnx2i_tcp_port_tbl.num_required = 0; ++ ++#define BNX2I_MAX_TCP_PORTS 1024 ++ ++ bnx2i_tcp_port_tbl.port_tbl_size = BNX2I_MAX_TCP_PORTS; ++ ++ mem_size = sizeof(u16) * bnx2i_tcp_port_tbl.port_tbl_size; ++ if (bnx2i_tcp_port_tbl.port_tbl_size) { ++ bnx2i_tcp_port_tbl.free_q = kmalloc(mem_size, GFP_KERNEL); ++ ++ if (bnx2i_tcp_port_tbl.free_q) ++ bnx2i_tcp_port_tbl.max_idx = ++ bnx2i_tcp_port_tbl.port_tbl_size; ++ } ++} ++ ++ ++/** ++ * bnx2i_cleanup_tcp_port_mngr - frees memory held by global tcp port table ++ * ++ */ ++void bnx2i_cleanup_tcp_port_mngr(void) ++{ ++ kfree(bnx2i_tcp_port_tbl.free_q); ++ bnx2i_tcp_port_tbl.free_q = NULL; ++ bnx2i_tcp_port_tbl.num_free_ports = 0; ++} ++ ++static int bnx2i_adapter_ready(struct bnx2i_hba *hba) ++{ ++ int retval = 0; ++ ++ if (!hba || !test_bit(ADAPTER_STATE_UP, &hba->adapter_state) || ++ test_bit(ADAPTER_STATE_GOING_DOWN, &hba->adapter_state) || ++ test_bit(ADAPTER_STATE_LINK_DOWN, &hba->adapter_state)) ++ retval = -EPERM; ++ return retval; ++} ++ ++ ++#ifdef __VMKLNX__ ++void bnx2i_hba_poll_timer(unsigned long data) ++{ ++ struct bnx2i_hba *hba = (struct bnx2i_hba *) data; ++ struct list_head *list; ++ struct list_head *tmp; ++ struct bnx2i_sess *sess; ++ u32 flags; ++ ++ spin_lock_irqsave(&hba->lock, flags); ++ list_for_each_safe(list, tmp, &hba->active_sess) { ++ sess = (struct bnx2i_sess *)list; ++ ++ /* could happen when user logs out and iscsid is in the ++ * process of cleaning up ++ */ ++ if (!sess || !sess->lead_conn) continue; ++ ++ if (sess->lead_conn->ep) ++ printk("%s: cid %d tasklet stats :: enabled %d, disabled %d \n", ++ __FUNCTION__, sess->lead_conn->ep->ep_iscsi_cid, ++ atomic_read(&sess->lead_conn->worker_enabled_cnt), ++ atomic_read(&sess->lead_conn->worker_disabled_cnt)); ++ else ++ printk("%s: dead cid, tasklet stats :: enabled %d, disabled %d \n", ++ __FUNCTION__, ++ atomic_read(&sess->lead_conn->worker_enabled_cnt), ++ atomic_read(&sess->lead_conn->worker_disabled_cnt)); ++ } ++ spin_unlock_irqrestore(&hba->lock, flags); ++ ++ hba->hba_poll_timer.expires = jiffies + 2 * HZ; ++ add_timer(&hba->hba_poll_timer); ++} ++#endif ++ ++/** ++ * bnx2i_get_write_cmd_bd_idx - identifies various BD bookmarks for a ++ * scsi write command ++ * ++ * @cmd: iscsi cmd struct pointer ++ * @buf_off: absolute buffer offset ++ * @start_bd_off: u32 pointer to return the offset within the BD ++ * indicated by 'start_bd_idx' on which 'buf_off' falls ++ * @start_bd_idx: index of the BD on which 'buf_off' falls ++ * ++ * identifies & marks various bd info for imm data, unsolicited data ++ * and the first solicited data seq. ++ */ ++static void bnx2i_get_write_cmd_bd_idx(struct bnx2i_cmd *cmd, u32 buf_off, ++ u32 *start_bd_off, u32 *start_bd_idx) ++{ ++ u32 cur_offset = 0; ++ u32 cur_bd_idx = 0; ++ struct iscsi_bd *bd_tbl; ++ ++ if (!cmd->bd_tbl || !cmd->bd_tbl->bd_tbl) ++ return; ++ ++ bd_tbl = cmd->bd_tbl->bd_tbl; ++ if (buf_off) { ++ while (buf_off >= (cur_offset + bd_tbl->buffer_length)) { ++ cur_offset += bd_tbl->buffer_length; ++ cur_bd_idx++; ++ bd_tbl++; ++ } ++ } ++ ++ *start_bd_off = buf_off - cur_offset; ++ *start_bd_idx = cur_bd_idx; ++} ++ ++/** ++ * bnx2i_setup_write_cmd_bd_info - sets up BD various information for ++ * scsi write command ++ * ++ * @cmd: iscsi cmd struct pointer ++ * ++ * identifies & marks various bd info for immediate data, unsolicited data ++ * and first solicited data seq which includes BD start index & BD buf off ++ * This function takes into account iscsi parameter such as immediate data ++ * and unsolicited data is support on this connection ++ * ++ */ ++static void bnx2i_setup_write_cmd_bd_info(struct bnx2i_cmd *cmd) ++{ ++ struct bnx2i_sess *sess; ++ u32 start_bd_offset; ++ u32 start_bd_idx; ++ u32 buffer_offset = 0; ++ u32 seq_len = 0; ++ u32 fbl, mrdsl; ++ u32 cmd_len = cmd->req.total_data_transfer_length; ++ ++ sess = cmd->conn->sess; ++ ++ /* if ImmediateData is turned off & IntialR2T is turned on, ++ * there will be no immediate or unsolicited data, just return. ++ */ ++ if (sess->initial_r2t && !sess->imm_data) ++ return; ++ ++ fbl = sess->first_burst_len; ++ mrdsl = cmd->conn->max_data_seg_len_xmit; ++ ++ /* Immediate data */ ++ if (sess->imm_data) { ++ seq_len = min(mrdsl, fbl); ++ seq_len = min(cmd_len, seq_len); ++ buffer_offset += seq_len; ++ } ++ ++ if (seq_len == cmd_len) ++ return; ++ ++ if (!sess->initial_r2t) { ++ if (seq_len >= fbl) ++ goto r2t_data; ++ seq_len = min(fbl, cmd_len) - seq_len; ++ bnx2i_get_write_cmd_bd_idx(cmd, buffer_offset, ++ &start_bd_offset, &start_bd_idx); ++ cmd->req.ud_buffer_offset = start_bd_offset; ++ cmd->req.ud_start_bd_index = start_bd_idx; ++ buffer_offset += seq_len; ++ } ++r2t_data: ++ if (buffer_offset != cmd_len) { ++ bnx2i_get_write_cmd_bd_idx(cmd, buffer_offset, ++ &start_bd_offset, &start_bd_idx); ++ if ((start_bd_offset > fbl) || ++ (start_bd_idx > scsi_sg_count(cmd->scsi_cmd))) { ++ int i = 0; ++ ++ printk(KERN_ALERT "bnx2i- error, buf offset 0x%x " ++ "bd_valid %d use_sg %d\n", ++ buffer_offset, cmd->bd_tbl->bd_valid, ++ scsi_sg_count(cmd->scsi_cmd)); ++ for (i = 0; i < cmd->bd_tbl->bd_valid; i++) ++ printk(KERN_ALERT "bnx2i err, bd[%d]: len %x\n", ++ i, cmd->bd_tbl->bd_tbl[i].\ ++ buffer_length); ++ } ++ cmd->req.sd_buffer_offset = start_bd_offset; ++ cmd->req.sd_start_bd_index = start_bd_idx; ++ } ++} ++ ++ ++/** ++ * bnx2i_split_bd - splits buffer > 64KB into 32KB chunks ++ * ++ * @cmd: iscsi cmd struct pointer ++ * @addr: base address of the buffer ++ * @sg_len: buffer length ++ * @bd_index: starting index into BD table ++ * ++ * This is not required as driver limits max buffer size of less than 64K by ++ * advertising 'max_sectors' within this limit. 5706/5708 hardware limits ++ * BD length to less than or equal to 0xFFFF ++ **/ ++static int bnx2i_split_bd(struct bnx2i_cmd *cmd, u64 addr, int sg_len, ++ int bd_index) ++{ ++ struct iscsi_bd *bd = cmd->bd_tbl->bd_tbl; ++ int frag_size, sg_frags; ++ ++ sg_frags = 0; ++ while (sg_len) { ++ if (sg_len >= BD_SPLIT_SIZE) ++ frag_size = BD_SPLIT_SIZE; ++ else ++ frag_size = sg_len; ++ bd[bd_index + sg_frags].buffer_addr_lo = (u32) addr; ++ bd[bd_index + sg_frags].buffer_addr_hi = addr >> 32; ++ bd[bd_index + sg_frags].buffer_length = frag_size; ++ bd[bd_index + sg_frags].flags = 0; ++ if ((bd_index + sg_frags) == 0) ++ bd[0].flags = ISCSI_BD_FIRST_IN_BD_CHAIN; ++ addr += (u64) frag_size; ++ sg_frags++; ++ sg_len -= frag_size; ++ } ++ return sg_frags; ++} ++ ++ ++/** ++ * bnx2i_map_single_buf - maps a single buffer and updates the BD table ++ * ++ * @hba: adapter instance ++ * @cmd: iscsi cmd struct pointer ++ * ++ */ ++static int bnx2i_map_single_buf(struct bnx2i_hba *hba, ++ struct bnx2i_cmd *cmd) ++{ ++ struct scsi_cmnd *sc = cmd->scsi_cmd; ++ struct iscsi_bd *bd = cmd->bd_tbl->bd_tbl; ++ int byte_count; ++ int bd_count; ++ u64 addr; ++ ++ byte_count = scsi_bufflen(sc); ++ sc->SCp.dma_handle = ++ pci_map_single(hba->pcidev, scsi_sglist(sc), ++ scsi_bufflen(sc), sc->sc_data_direction); ++ addr = sc->SCp.dma_handle; ++ ++ if (byte_count > MAX_BD_LENGTH) { ++ bd_count = bnx2i_split_bd(cmd, addr, byte_count, 0); ++ } else { ++ bd_count = 1; ++ bd[0].buffer_addr_lo = addr & 0xffffffff; ++ bd[0].buffer_addr_hi = addr >> 32; ++ bd[0].buffer_length = scsi_bufflen(sc); ++ bd[0].flags = ISCSI_BD_FIRST_IN_BD_CHAIN | ++ ISCSI_BD_LAST_IN_BD_CHAIN; ++ } ++ bd[bd_count - 1].flags |= ISCSI_BD_LAST_IN_BD_CHAIN; ++ ++ return bd_count; ++} ++ ++ ++/** ++ * bnx2i_map_sg - maps IO buffer and prepares the BD table ++ * ++ * @hba: adapter instance ++ * @cmd: iscsi cmd struct pointer ++ * ++ * map SG list ++ */ ++static int bnx2i_map_sg(struct bnx2i_hba *hba, struct bnx2i_cmd *cmd) ++{ ++ struct scsi_cmnd *sc = cmd->scsi_cmd; ++ struct iscsi_bd *bd = cmd->bd_tbl->bd_tbl; ++ struct scatterlist *sg; ++ int byte_count = 0; ++ int sg_frags; ++ int bd_count = 0; ++ int sg_count; ++ int sg_len; ++ u64 addr; ++ int i; ++ ++ sg = scsi_sglist(sc); ++#ifdef __VMKLNX__ ++ sg_count = scsi_sg_count(sc); ++#else ++ sg_count = pci_map_sg(hba->pcidev, sg, scsi_sg_count(sc), ++ sc->sc_data_direction); ++#endif ++ ++ for (i = 0; i < sg_count; i++) { ++ sg_len = sg_dma_len(sg); ++ addr = sg_dma_address(sg); ++ if (sg_len > MAX_BD_LENGTH) ++ sg_frags = bnx2i_split_bd(cmd, addr, sg_len, ++ bd_count); ++ else { ++ sg_frags = 1; ++ bd[bd_count].buffer_addr_lo = addr & 0xffffffff; ++ bd[bd_count].buffer_addr_hi = addr >> 32; ++ bd[bd_count].buffer_length = sg_len; ++ bd[bd_count].flags = 0; ++ if (bd_count == 0) ++ bd[bd_count].flags = ++ ISCSI_BD_FIRST_IN_BD_CHAIN; ++ } ++ byte_count += sg_len; ++ sg++; ++ bd_count += sg_frags; ++ } ++ bd[bd_count - 1].flags |= ISCSI_BD_LAST_IN_BD_CHAIN; ++ ++ BUG_ON(byte_count != scsi_bufflen(sc)); ++ return bd_count; ++} ++ ++/** ++ * bnx2i_iscsi_map_sg_list - maps SG list ++ * ++ * @cmd: iscsi cmd struct pointer ++ * ++ * creates BD list table for the command ++ */ ++static void bnx2i_iscsi_map_sg_list(struct bnx2i_hba *hba, struct bnx2i_cmd *cmd) ++{ ++ struct scsi_cmnd *sc = cmd->scsi_cmd; ++ int bd_count; ++ ++ if (scsi_sg_count(sc)) ++ bd_count = bnx2i_map_sg(hba, cmd); ++ else if (scsi_bufflen(sc)) ++ bd_count = bnx2i_map_single_buf(hba, cmd); ++ else { ++ struct iscsi_bd *bd = cmd->bd_tbl->bd_tbl; ++ bd_count = 0; ++ bd[0].buffer_addr_lo = bd[0].buffer_addr_hi = 0; ++ bd[0].buffer_length = bd[0].flags = 0; ++ } ++ cmd->bd_tbl->bd_valid = bd_count; ++} ++ ++ ++/** ++ * bnx2i_iscsi_unmap_sg_list - unmaps SG list ++ * ++ * @cmd: iscsi cmd struct pointer ++ * ++ * unmap IO buffers and invalidate the BD table ++ */ ++void bnx2i_iscsi_unmap_sg_list(struct bnx2i_hba *hba, struct bnx2i_cmd *cmd) ++{ ++ struct scsi_cmnd *sc = cmd->scsi_cmd; ++#ifndef __VMKLNX__ ++ struct scatterlist *sg; ++#endif ++ ++ if (cmd->bd_tbl->bd_valid && sc) { ++#ifndef __VMKLNX__ ++ if (scsi_sg_count(sc)) { ++ sg = scsi_sglist(sc); ++ pci_unmap_sg(hba->pcidev, sg, scsi_sg_count(sc), ++ sc->sc_data_direction); ++ } else { ++ pci_unmap_single(hba->pcidev, sc->SCp.dma_handle, ++ scsi_bufflen(sc), ++ sc->sc_data_direction); ++ } ++#endif ++ cmd->bd_tbl->bd_valid = 0; ++ } ++} ++ ++ ++ ++static void bnx2i_setup_cmd_wqe_template(struct bnx2i_cmd *cmd) ++{ ++ memset(&cmd->req, 0x00, sizeof(cmd->req)); ++ cmd->req.op_code = 0xFF; ++ cmd->req.bd_list_addr_lo = (u32) cmd->bd_tbl->bd_tbl_dma; ++ cmd->req.bd_list_addr_hi = ++ (u32) ((u64) cmd->bd_tbl->bd_tbl_dma >> 32); ++ ++} ++ ++ ++/** ++ * bnx2i_bind_conn_to_iscsi_cid - bind conn structure to 'iscsi_cid' ++ * ++ * @conn: pointer to iscsi connection ++ * @iscsi_cid: iscsi context ID, range 0 - (MAX_CONN - 1) ++ * ++ * update iscsi cid table entry with connection pointer. This enables ++ * driver to quickly get hold of connection structure pointer in ++ * completion/interrupt thread using iscsi context ID ++ */ ++static int bnx2i_bind_conn_to_iscsi_cid(struct bnx2i_conn *conn, ++ u32 iscsi_cid) ++{ ++ struct bnx2i_hba *hba; ++ ++ if (!conn || !conn->sess) ++ return -EINVAL; ++ ++ hba = conn->sess->hba; ++ ++ if (hba && hba->cid_que.conn_cid_tbl[iscsi_cid]) { ++ printk(KERN_ERR "bnx2i: conn bind - entry #%d not free\n", ++ iscsi_cid); ++ return -EBUSY; ++ } ++ ++ hba->cid_que.conn_cid_tbl[iscsi_cid] = conn; ++ return 0; ++} ++ ++ ++/** ++ * bnx2i_get_conn_from_id - maps an iscsi cid to corresponding conn ptr ++ * ++ * @hba: pointer to adapter instance ++ * @iscsi_cid: iscsi context ID, range 0 - (MAX_CONN - 1) ++ */ ++struct bnx2i_conn *bnx2i_get_conn_from_id(struct bnx2i_hba *hba, ++ u16 iscsi_cid) ++{ ++ if (!hba->cid_que.conn_cid_tbl) { ++ printk(KERN_ERR "bnx2i: ERROR - missing conn<->cid table\n"); ++ return NULL; ++ ++ } else if (iscsi_cid >= hba->max_active_conns) { ++ printk(KERN_ERR "bnx2i: wrong cid #%d\n", iscsi_cid); ++ return NULL; ++ } ++ return hba->cid_que.conn_cid_tbl[iscsi_cid]; ++} ++ ++ ++/** ++ * bnx2i_alloc_iscsi_cid - allocates a iscsi_cid from free pool ++ * ++ * @hba: pointer to adapter instance ++ */ ++static u32 bnx2i_alloc_iscsi_cid(struct bnx2i_hba *hba) ++{ ++ int idx; ++ ++ if (!hba->cid_que.cid_free_cnt) ++ return ISCSI_RESERVED_TAG; ++ ++ idx = hba->cid_que.cid_q_cons_idx; ++ hba->cid_que.cid_q_cons_idx++; ++ if (hba->cid_que.cid_q_cons_idx == hba->cid_que.cid_q_max_idx) ++ hba->cid_que.cid_q_cons_idx = 0; ++ ++ hba->cid_que.cid_free_cnt--; ++ return hba->cid_que.cid_que[idx]; ++} ++ ++ ++/** ++ * bnx2i_free_iscsi_cid - returns tcp port to free list ++ * ++ * @hba: pointer to adapter instance ++ * @iscsi_cid: iscsi context ID to free ++ */ ++static void bnx2i_free_iscsi_cid(struct bnx2i_hba *hba, u16 iscsi_cid) ++{ ++ int idx; ++ ++ if (iscsi_cid == (u16)ISCSI_RESERVED_TAG) ++ return; ++ ++ hba->cid_que.cid_free_cnt++; ++ ++ idx = hba->cid_que.cid_q_prod_idx; ++ hba->cid_que.cid_que[idx] = iscsi_cid; ++ hba->cid_que.conn_cid_tbl[iscsi_cid] = NULL; ++ hba->cid_que.cid_q_prod_idx++; ++ if (hba->cid_que.cid_q_prod_idx == hba->cid_que.cid_q_max_idx) ++ hba->cid_que.cid_q_prod_idx = 0; ++} ++ ++ ++/** ++ * bnx2i_setup_free_cid_que - sets up free iscsi cid queue ++ * ++ * @hba: pointer to adapter instance ++ * ++ * allocates memory for iscsi cid queue & 'cid - conn ptr' mapping table, ++ * and initialize table attributes ++ */ ++static int bnx2i_setup_free_cid_que(struct bnx2i_hba *hba) ++{ ++ int mem_size; ++ int i; ++ ++ mem_size = hba->max_active_conns * sizeof(u32); ++ mem_size = (mem_size + (PAGE_SIZE - 1)) & PAGE_MASK; ++ ++ hba->cid_que.cid_que_base = kmalloc(mem_size, GFP_KERNEL); ++ if (!hba->cid_que.cid_que_base) ++ return -ENOMEM; ++ ++ mem_size = hba->max_active_conns * sizeof(struct bnx2i_conn *); ++ mem_size = (mem_size + (PAGE_SIZE - 1)) & PAGE_MASK; ++ hba->cid_que.conn_cid_tbl = kmalloc(mem_size, GFP_KERNEL); ++ if (!hba->cid_que.conn_cid_tbl) { ++ kfree(hba->cid_que.cid_que_base); ++ hba->cid_que.cid_que_base = NULL; ++ return -ENOMEM; ++ } ++ ++ hba->cid_que.cid_que = (u32 *)hba->cid_que.cid_que_base; ++ hba->cid_que.cid_q_prod_idx = 0; ++ hba->cid_que.cid_q_cons_idx = 0; ++ hba->cid_que.cid_q_max_idx = hba->max_active_conns; ++ hba->cid_que.cid_free_cnt = hba->max_active_conns; ++ ++ for (i = 0; i < hba->max_active_conns; i++) { ++ hba->cid_que.cid_que[i] = i; ++ hba->cid_que.conn_cid_tbl[i] = NULL; ++ } ++ return 0; ++} ++ ++ ++/** ++ * bnx2i_release_free_cid_que - releases 'iscsi_cid' queue resources ++ * ++ * @hba: pointer to adapter instance ++ */ ++static void bnx2i_release_free_cid_que(struct bnx2i_hba *hba) ++{ ++ kfree(hba->cid_que.cid_que_base); ++ hba->cid_que.cid_que_base = NULL; ++ ++ kfree(hba->cid_que.conn_cid_tbl); ++ hba->cid_que.conn_cid_tbl = NULL; ++} ++ ++static void bnx2i_setup_bd_tbl(struct bnx2i_hba *hba, struct bnx2i_dma *dma) ++{ ++ struct iscsi_bd *mp_bdt; ++ int pages = dma->size / PAGE_SIZE; ++ u64 addr; ++ ++ mp_bdt = (struct iscsi_bd *) dma->pgtbl; ++ addr = (unsigned long) dma->mem; ++ mp_bdt->flags = ISCSI_BD_FIRST_IN_BD_CHAIN; ++ do { ++ mp_bdt->buffer_addr_lo = addr & 0xffffffff; ++ mp_bdt->buffer_addr_hi = addr >> 32; ++ mp_bdt->buffer_length = PAGE_SIZE; ++ ++ pages--; ++ if (!pages) ++ break; ++ ++ addr += PAGE_SIZE; ++ mp_bdt++; ++ mp_bdt->flags = 0; ++ } while (1); ++ mp_bdt->flags |= ISCSI_BD_LAST_IN_BD_CHAIN; ++} ++ ++ ++/** ++ * bnx2i_setup_570x_pgtbl - iscsi QP page table setup function ++ * ++ * @ep: endpoint (transport indentifier) structure ++ * ++ * Sets up page tables for SQ/RQ/CQ, 1G/sec (5706/5708/5709) devices requires ++ * 64-bit address in big endian format. Whereas 10G/sec (57710) requires ++ * PT in little endian format ++ */ ++void bnx2i_setup_570x_pgtbl(struct bnx2i_hba *hba, struct bnx2i_dma *dma, int pgtbl_off) ++{ ++ int num_pages; ++ u32 *ptbl; ++ dma_addr_t page; ++ char *pgtbl_virt; ++ ++ /* SQ page table */ ++ pgtbl_virt = dma->pgtbl; ++ memset(pgtbl_virt, 0, dma->pgtbl_size); ++ num_pages = dma->size / PAGE_SIZE; ++ page = dma->mapping; ++ ++ ptbl = (u32 *) ((u8 *) dma->pgtbl + pgtbl_off); ++ while (num_pages--) { ++ /* PTE is written in big endian format for ++ * 5706/5708/5709 devices */ ++ *ptbl = (u32) ((u64) page >> 32); ++ ptbl++; ++ *ptbl = (u32) page; ++ ptbl++; ++ page += PAGE_SIZE; ++ } ++} ++ ++/** ++ * bnx2i_setup_5771x_pgtbl - iscsi QP page table setup function ++ * ++ * @ep: endpoint (transport indentifier) structure ++ * ++ * Sets up page tables for SQ/RQ/CQ, 1G/sec (5706/5708/5709) devices requires ++ * 64-bit address in big endian format. Whereas 10G/sec (57710) requires ++ * PT in little endian format ++ */ ++void bnx2i_setup_5771x_pgtbl(struct bnx2i_hba *hba, struct bnx2i_dma *dma, int pgtbl_off) ++{ ++ int num_pages; ++ u32 *ptbl; ++ dma_addr_t page; ++ char *pgtbl_virt; ++ ++ /* SQ page table */ ++ pgtbl_virt = dma->pgtbl; ++ memset(pgtbl_virt, 0, dma->pgtbl_size); ++ num_pages = dma->size / PAGE_SIZE; ++ page = dma->mapping; ++ ++ ptbl = (u32 *) ((u8 *) dma->pgtbl + pgtbl_off); ++ while (num_pages--) { ++ /* PTE is written in little endian format for 57710 */ ++ *ptbl = (u32) page; ++ ptbl++; ++ *ptbl = (u32) ((u64) page >> 32); ++ ptbl++; ++ page += PAGE_SIZE; ++ } ++} ++ ++ ++void bnx2i_free_dma(struct bnx2i_hba *hba, struct bnx2i_dma *dma) ++{ ++ if (dma->mem) { ++ pci_free_consistent(hba->pcidev, PAGE_SIZE, dma->mem, dma->mapping); ++ dma->mem = NULL; ++ } ++ if (dma->pgtbl && dma->pgtbl_type) { ++ pci_free_consistent(hba->pcidev, dma->pgtbl_size, ++ dma->pgtbl, dma->pgtbl_map); ++ dma->pgtbl = NULL; ++ } ++} ++ ++ ++int bnx2i_alloc_dma(struct bnx2i_hba *hba, struct bnx2i_dma *dma, ++ int size, int pgtbl_type, int pgtbl_off) ++{ ++ int pages = (size + PAGE_SIZE - 1) / PAGE_SIZE; ++ ++ dma->size = size; ++ dma->pgtbl_type = pgtbl_type; ++ ++ dma->mem = pci_alloc_consistent(hba->pcidev, size, &dma->mapping); ++ if (dma->mem == NULL) ++ goto mem_err; ++ ++ if (!pgtbl_type) ++ return 0; ++ ++ dma->pgtbl_size = ((pages * 8) + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1); ++ dma->pgtbl = pci_alloc_consistent(hba->pcidev, dma->pgtbl_size, ++ &dma->pgtbl_map); ++ if (dma->pgtbl == NULL) ++ goto mem_err; ++ ++ if (pgtbl_type == BNX2I_TBL_TYPE_PG) ++ hba->setup_pgtbl(hba, dma, pgtbl_off); ++ if (pgtbl_type == BNX2I_TBL_TYPE_BD) ++ bnx2i_setup_bd_tbl(hba, dma); ++ ++ return 0; ++ ++mem_err: ++ bnx2i_free_dma(hba, dma); ++ return -ENOMEM; ++} ++ ++ ++ ++/** ++ * bnx2i_alloc_ep - allocates ep structure from global pool ++ * ++ * @hba: pointer to adapter instance ++ * ++ * routine allocates a free endpoint structure from global pool and ++ * a tcp port to be used for this connection. Global resource lock, ++ * 'bnx2i_resc_lock' is held while accessing shared global data structures ++ */ ++static struct bnx2i_endpoint *bnx2i_alloc_ep(struct bnx2i_hba *hba) ++{ ++ struct bnx2i_endpoint *endpoint; ++ struct list_head *listp; ++ u16 tcp_port; ++ u32 flags; ++ ++ spin_lock_irqsave(&bnx2i_resc_lock, flags); ++ ++#ifdef __VMKLNX__ ++ tcp_port = 0; ++#else ++ tcp_port = bnx2i_alloc_tcp_port(); ++ if (!tcp_port) { ++ printk(KERN_ERR "bnx2i: unable to allocate tcp ports, " ++ "make sure 'bnx2id' is running\n"); ++ spin_unlock_irqrestore(&bnx2i_resc_lock, flags); ++ return NULL; ++ } ++#endif ++ if (list_empty(&bnx2i_free_ep_list)) { ++ spin_unlock_irqrestore(&bnx2i_resc_lock, flags); ++ printk(KERN_ERR "bnx2i: ep struct pool empty\n"); ++ return NULL; ++ } ++ listp = (struct list_head *) bnx2i_free_ep_list.next; ++ list_del_init(listp); ++ bnx2i_num_free_ep--; ++ ++ endpoint = (struct bnx2i_endpoint *) listp; ++ endpoint->state = EP_STATE_IDLE; ++ endpoint->hba = hba; ++ endpoint->hba_age = hba->age; ++ hba->ofld_conns_active++; ++ endpoint->tcp_port = tcp_port; ++ init_waitqueue_head(&endpoint->ofld_wait); ++ ++ spin_unlock_irqrestore(&bnx2i_resc_lock, flags); ++ return endpoint; ++} ++ ++ ++/** ++ * bnx2i_free_ep - returns endpoint struct and tcp port to free pool ++ * ++ * @endpoint: pointer to endpoint structure ++ * ++ */ ++static void bnx2i_free_ep(struct bnx2i_endpoint *endpoint) ++{ ++ u32 flags; ++ ++ spin_lock_irqsave(&bnx2i_resc_lock, flags); ++ endpoint->state = EP_STATE_IDLE; ++ endpoint->hba->ofld_conns_active--; ++ ++ bnx2i_free_iscsi_cid(endpoint->hba, endpoint->ep_iscsi_cid); ++ if (endpoint->conn) { ++ endpoint->conn->ep = NULL; ++ endpoint->conn = NULL; ++ } ++ endpoint->sess = NULL; ++ ++ if (endpoint->tcp_port) ++ bnx2i_free_tcp_port(endpoint->tcp_port); ++ ++ endpoint->hba = NULL; ++ list_add_tail(&endpoint->link, &bnx2i_free_ep_list); ++ bnx2i_num_free_ep++; ++ spin_unlock_irqrestore(&bnx2i_resc_lock, flags); ++} ++ ++ ++/** ++ * bnx2i_alloc_ep_pool - alloccates a pool of endpoint structures ++ * ++ * allocates free pool of endpoint structures, which is used to store ++ * QP related control & PT info and other option-2 information ++ */ ++int bnx2i_alloc_ep_pool(void) ++{ ++ struct bnx2i_endpoint *endpoint; ++ int index; ++ int ret_val = 1; ++ int total_endpoints; ++ int page_count = 0; ++ void *mem_ptr; ++ int mem_size; ++ ++ spin_lock_init(&bnx2i_resc_lock); ++ INIT_LIST_HEAD(&bnx2i_free_ep_list); ++ INIT_LIST_HEAD(&bnx2i_unbound_ep); ++ ++ for (index = 0; index < MAX_PAGES_PER_CTRL_STRUCT_POOL; index++) { ++ bnx2i_ep_pages[index] = NULL; ++ } ++ ++ total_endpoints = ISCSI_MAX_CONNS_PER_HBA * ISCSI_MAX_ADAPTERS; ++ bnx2i_num_free_ep = 0; ++ mem_size = total_endpoints * sizeof(struct bnx2i_endpoint); ++ mem_ptr = vmalloc(mem_size); ++ if (!mem_ptr) { ++ printk(KERN_ERR "ep_pool: mem alloc failed\n"); ++ goto mem_alloc_err; ++ } ++ memset(mem_ptr, 0, mem_size); ++ ++ bnx2i_ep_pages[page_count++] = mem_ptr; ++ endpoint = mem_ptr; ++ ++ for (index = 0; index < total_endpoints; index++) { ++ INIT_LIST_HEAD(&endpoint->link); ++ list_add_tail(&endpoint->link, &bnx2i_free_ep_list); ++ endpoint++; ++ bnx2i_num_free_ep++; ++ } ++mem_alloc_err: ++ if (bnx2i_num_free_ep == 0) ++ ret_val = 0; ++ ++ bnx2i_max_free_ep = bnx2i_num_free_ep; ++ return ret_val; ++} ++ ++ ++/** ++ * bnx2i_release_ep_pool - releases memory resources held by endpoint structs ++ */ ++void bnx2i_release_ep_pool(void) ++{ ++ int index; ++ void *mem_ptr; ++ ++ for (index = 0; index < MAX_PAGES_PER_CTRL_STRUCT_POOL; index++) { ++ mem_ptr = bnx2i_ep_pages[index]; ++ vfree(mem_ptr); ++ bnx2i_ep_pages[index] = NULL; ++ } ++ bnx2i_num_free_ep = 0; ++ return; ++} ++ ++/** ++ * bnx2i_alloc_cmd - allocates a command structure from free pool ++ * ++ * @sess: iscsi session pointer ++ * ++ * allocates a command structures and ITT from free pool ++ */ ++struct bnx2i_cmd *bnx2i_alloc_cmd(struct bnx2i_sess *sess) ++{ ++ struct bnx2i_cmd *cmd; ++ struct list_head *listp; ++ ++ if (unlikely(!sess || (sess->num_free_cmds == 0))) { ++ return NULL; ++ } ++ ++ listp = (struct list_head *) sess->free_cmds.next; ++ list_del_init(listp); ++ sess->num_free_cmds--; ++ cmd = (struct bnx2i_cmd *) listp; ++ cmd->scsi_status_rcvd = 0; ++ ++ INIT_LIST_HEAD(&cmd->link); ++ bnx2i_setup_cmd_wqe_template(cmd); ++ ++ cmd->req.itt = cmd->itt; ++ ++ return cmd; ++} ++ ++ ++/** ++ * bnx2i_free_cmd - releases iscsi cmd struct & ITT to respective free pool ++ * ++ * @sess: iscsi session pointer ++ * @cmd: iscsi cmd pointer ++ * ++ * return command structure and ITT back to free pool. ++ */ ++void bnx2i_free_cmd(struct bnx2i_sess *sess, struct bnx2i_cmd *cmd) ++{ ++ list_del_init(&cmd->link); ++ list_add_tail(&cmd->link, &sess->free_cmds); ++ sess->num_free_cmds++; ++} ++ ++ ++/** ++ * bnx2i_alloc_cmd_pool - allocates and initializes iscsi command pool ++ * ++ * @sess: iscsi session pointer ++ * ++ * Allocate command structure pool for a given iSCSI session. Return 'ENOMEM' ++ * if memory allocation fails ++ */ ++int bnx2i_alloc_cmd_pool(struct bnx2i_sess *sess) ++{ ++ struct bnx2i_cmd *cmdp; ++ int index, count; ++ int ret_val = 0; ++ int total_cmds; ++ int num_cmds; ++ int page_count; ++ int num_cmds_per_page; ++ void *mem_ptr; ++ u32 mem_size; ++ int cmd_i; ++ ++ INIT_LIST_HEAD(&sess->free_cmds); ++ for (index = 0; index < MAX_PAGES_PER_CTRL_STRUCT_POOL; index++) ++ sess->cmd_pages[index] = NULL; ++ ++ num_cmds_per_page = PAGE_SIZE / sizeof(struct bnx2i_cmd); ++ ++ total_cmds = sess->sq_size; ++ mem_size = sess->sq_size * sizeof(struct bnx2i_cmd *); ++ mem_size = (mem_size + (PAGE_SIZE - 1)) & PAGE_MASK; ++ sess->itt_cmd = kmalloc(mem_size, GFP_KERNEL); ++ if (!sess->itt_cmd) ++ return -ENOMEM; ++ ++ memset(sess->itt_cmd, 0x00, mem_size); ++ ++ cmd_i = 0; ++ page_count = 0; ++ for (index = 0; index < total_cmds;) { ++ mem_ptr = kmalloc(PAGE_SIZE, GFP_KERNEL); ++ if (mem_ptr == NULL) ++ break; ++ ++ sess->cmd_pages[page_count++] = mem_ptr; ++ num_cmds = num_cmds_per_page; ++ if ((total_cmds - index) < num_cmds_per_page) ++ num_cmds = (total_cmds - index); ++ ++ memset(mem_ptr, 0, PAGE_SIZE); ++ cmdp = mem_ptr; ++ for (count = 0; count < num_cmds; count++) { ++ cmdp->req.itt = ITT_INVALID_SIGNATURE; ++ INIT_LIST_HEAD(&cmdp->link); ++ cmdp->itt = cmd_i; ++ sess->itt_cmd[cmd_i] = cmdp; ++ cmd_i++; ++ ++ /* Allocate BD table */ ++ cmdp->bd_tbl = bnx2i_alloc_bd_table(sess, cmdp); ++ if (!cmdp->bd_tbl) { ++ /* should never fail, as it's guaranteed to have ++ * (ISCSI_MAX_CMDS_PER_SESS + 1) BD tables ++ * allocated before calling this function. ++ */ ++ printk(KERN_ERR "no BD table cmd %p\n", cmdp); ++ goto bd_table_failed; ++ } ++ list_add_tail(&cmdp->link, &sess->free_cmds); ++ cmdp++; ++ } ++ ++ sess->num_free_cmds += num_cmds; ++ index += num_cmds; ++ } ++ sess->allocated_cmds = sess->num_free_cmds; ++ ++ if (sess->num_free_cmds == 0) ++ ret_val = -ENOMEM; ++ return ret_val; ++ ++bd_table_failed: ++ return -ENOMEM; ++} ++ ++ ++/** ++ * bnx2i_free_cmd_pool - releases memory held by free iscsi cmd pool ++ * ++ * @sess: iscsi session pointer ++ * ++ * Release memory held by command struct pool. ++ */ ++void bnx2i_free_cmd_pool(struct bnx2i_sess *sess) ++{ ++ int index; ++ void *mem_ptr; ++ ++ if (sess->num_free_cmds != sess->allocated_cmds) { ++ /* ++ * WARN: either there is some command struct leak or ++ * still some SCSI commands are pending. ++ */ ++ printk(KERN_ERR "bnx2i: missing cmd structs - %d, %d\n", ++ sess->num_free_cmds, sess->allocated_cmds); ++ } ++ for (index = 0; index < MAX_PAGES_PER_CTRL_STRUCT_POOL; index++) { ++ mem_ptr = sess->cmd_pages[index]; ++ kfree(mem_ptr); ++ sess->cmd_pages[index] = NULL; ++ } ++ sess->num_free_cmds = sess->allocated_cmds = 0; ++ ++ kfree(sess->itt_cmd); ++ sess->itt_cmd = NULL; ++ ++ return; ++} ++ ++static struct bnx2i_scsi_task *bnx2i_alloc_scsi_task(struct bnx2i_sess *sess) ++{ ++ struct list_head *listp; ++ if (list_empty(&sess->scsi_task_list)) { ++ return NULL; ++ } ++ listp = (struct list_head *) sess->scsi_task_list.next; ++ list_del_init(listp); ++ return (struct bnx2i_scsi_task *)listp; ++} ++ ++static void bnx2i_free_scsi_task(struct bnx2i_sess *sess, ++ struct bnx2i_scsi_task *scsi_task) ++{ ++ list_del_init((struct list_head *)scsi_task); ++ scsi_task->scsi_cmd = NULL; ++ list_add_tail(&scsi_task->link, &sess->scsi_task_list); ++} ++ ++static int bnx2i_alloc_scsi_task_pool(struct bnx2i_sess *sess) ++{ ++ struct bnx2i_scsi_task *scsi_task; ++ int mem_size = 2 * PAGE_SIZE; ++ int task_count; ++ int i; ++ ++ INIT_LIST_HEAD(&sess->scsi_task_list); ++ sess->task_list_mem = kmalloc(mem_size, GFP_KERNEL); ++ if (!sess->task_list_mem) ++ return -ENOMEM; ++ ++ scsi_task = (struct bnx2i_scsi_task *)sess->task_list_mem; ++ task_count = mem_size / sizeof(struct bnx2i_scsi_task); ++ for (i = 0; i < task_count; i++, scsi_task++) { ++ INIT_LIST_HEAD(&scsi_task->link); ++ scsi_task->scsi_cmd = NULL; ++ list_add_tail(&scsi_task->link, &sess->scsi_task_list); ++ } ++ return 0; ++} ++ ++static void bnx2i_free_scsi_task_pool(struct bnx2i_sess *sess) ++{ ++ kfree(sess->task_list_mem); ++ sess->task_list_mem = NULL; ++ INIT_LIST_HEAD(&sess->scsi_task_list); ++/*TODO - clear pend list too */ ++} ++ ++/** ++ * bnx2i_alloc_bd_table - Alloc BD table to associate with this iscsi cmd ++ * ++ * @sess: iscsi session pointer ++ * @cmd: iscsi cmd pointer ++ * ++ * allocates a BD table and assigns it to given command structure. There is ++ * no synchronization issue as this code is executed in initialization ++ * thread ++ */ ++static struct io_bdt *bnx2i_alloc_bd_table(struct bnx2i_sess *sess, ++ struct bnx2i_cmd *cmd) ++{ ++ struct io_bdt *bd_tbl; ++ ++ if (list_empty(&sess->bd_tbl_list)) ++ return NULL; ++ ++ bd_tbl = (struct io_bdt *)sess->bd_tbl_list.next; ++ list_del(&bd_tbl->link); ++ list_add_tail(&bd_tbl->link, &sess->bd_tbl_active); ++ bd_tbl->bd_valid = 0; ++ bd_tbl->cmdp = cmd; ++ ++ return bd_tbl; ++} ++ ++ ++/** ++ * bnx2i_free_all_bdt_resc_pages - releases memory held by BD memory tracker tbl ++ * ++ * @sess: iscsi session pointer ++ * ++ * Free up memory pages allocated held by BD resources ++ */ ++static void bnx2i_free_all_bdt_resc_pages(struct bnx2i_sess *sess) ++{ ++ int i; ++ struct bd_resc_page *resc_page; ++ ++ spin_lock_bh(&sess->lock); ++ while (!list_empty(&sess->bd_resc_page)) { ++ resc_page = (struct bd_resc_page *)sess->bd_resc_page.prev; ++ list_del(sess->bd_resc_page.prev); ++ for(i = 0; i < resc_page->num_valid; i++) ++ kfree(resc_page->page[i]); ++ kfree(resc_page); ++ } ++ spin_unlock_bh(&sess->lock); ++} ++ ++ ++ ++/** ++ * bnx2i_alloc_bdt_resc_page - allocated a page to track BD table memory ++ * ++ * @sess: iscsi session pointer ++ * ++ * allocated a page to track BD table memory ++ */ ++struct bd_resc_page *bnx2i_alloc_bdt_resc_page(struct bnx2i_sess *sess) ++{ ++ void *mem_ptr; ++ struct bd_resc_page *resc_page; ++ ++ mem_ptr = kmalloc(PAGE_SIZE, GFP_KERNEL); ++ if (!mem_ptr) ++ return NULL; ++ ++ resc_page = mem_ptr; ++ list_add_tail(&resc_page->link, &sess->bd_resc_page); ++ resc_page->max_ptrs = (PAGE_SIZE - ++ (u32) &((struct bd_resc_page *) 0)->page[0]) / sizeof(void *); ++ resc_page->num_valid = 0; ++ ++ return resc_page; ++} ++ ++ ++/** ++ * bnx2i_add_bdt_resc_page - add newly allocated memory page to list ++ * ++ * @sess: iscsi session pointer ++ * @bd_page: pointer to page memory ++ * ++ * link newly allocated memory page to tracker list ++ */ ++int bnx2i_add_bdt_resc_page(struct bnx2i_sess *sess, void *bd_page) ++{ ++ struct bd_resc_page *resc_page; ++ ++#define is_resc_page_full(_resc_pg) (_resc_pg->num_valid == _resc_pg->max_ptrs) ++#define active_resc_page(_resc_list) \ ++ (list_empty(_resc_list) ? NULL : (_resc_list)->prev) ++ if (list_empty(&sess->bd_resc_page)) { ++ resc_page = bnx2i_alloc_bdt_resc_page(sess); ++ } else { ++ resc_page = (struct bd_resc_page *) ++ active_resc_page(&sess->bd_resc_page); ++ } ++ ++ if (!resc_page) ++ return -ENOMEM; ++ ++ resc_page->page[resc_page->num_valid++] = bd_page; ++ if (is_resc_page_full(resc_page)) { ++ resc_page = bnx2i_alloc_bdt_resc_page(sess); ++ } ++ return 0; ++} ++ ++ ++/** ++ * bnx2i_alloc_bd_table_pool - Allocates buffer descriptor (BD) pool ++ * ++ * @sess: iscsi session pointer ++ * ++ * Allocate a pool of buffer descriptor tables and associated DMA'able memory ++ * to be used with the session. ++ */ ++static int bnx2i_alloc_bd_table_pool(struct bnx2i_sess *sess) ++{ ++ int index, count; ++ int ret_val = 0; ++ int num_elem_per_page; ++ int num_pages; ++ struct io_bdt *bdt_info; ++ void *mem_ptr; ++ int bd_tbl_size; ++ u32 mem_size; ++ int total_bd_tbl; ++ struct bnx2i_dma *dma; ++ ++ INIT_LIST_HEAD(&sess->bd_resc_page); ++ INIT_LIST_HEAD(&sess->bd_tbl_list); ++ INIT_LIST_HEAD(&sess->bd_tbl_active); ++ ++ total_bd_tbl = sess->sq_size; ++ mem_size = total_bd_tbl * sizeof(struct io_bdt); ++ num_elem_per_page = PAGE_SIZE / sizeof(struct io_bdt); ++ ++ for (index = 0; index < total_bd_tbl; index += num_elem_per_page) { ++ if (((total_bd_tbl - index) * sizeof(struct io_bdt)) ++ >= PAGE_SIZE) { ++ mem_size = PAGE_SIZE; ++ num_elem_per_page = PAGE_SIZE / sizeof(struct io_bdt); ++ } else { ++ mem_size = ++ (total_bd_tbl - index) * sizeof(struct io_bdt); ++ num_elem_per_page = (total_bd_tbl - index); ++ } ++ mem_ptr = kmalloc(mem_size, GFP_KERNEL); ++ if (mem_ptr == NULL) { ++ printk(KERN_ERR "alloc_bd_tbl: mem alloc failed\n"); ++ ret_val = -ENOMEM; ++ goto resc_alloc_failed; ++ } ++ bnx2i_add_bdt_resc_page(sess, mem_ptr); ++ ++ memset(mem_ptr, 0, mem_size); ++ bdt_info = mem_ptr; ++ for (count = 0; count < num_elem_per_page; count++) { ++ INIT_LIST_HEAD(&bdt_info->link); ++ list_add_tail(&bdt_info->link, &sess->bd_tbl_list); ++ bdt_info++; ++ } ++ } ++ ++ ++ INIT_LIST_HEAD(&sess->bdt_dma_resc); ++ ++ bd_tbl_size = ISCSI_MAX_BDS_PER_CMD * sizeof(struct iscsi_bd); ++ bdt_info = (struct io_bdt *)sess->bd_tbl_list.next; ++ num_elem_per_page = PAGE_SIZE / bd_tbl_size; ++ ++ num_pages = ((sess->sq_size * bd_tbl_size) + PAGE_SIZE - 1) & ++ ~(PAGE_SIZE - 1); ++ num_pages /= PAGE_SIZE; ++ sess->bdt_dma_info = kmalloc(sizeof(*dma) * num_pages, GFP_KERNEL); ++ if (sess->bdt_dma_info == NULL) ++ goto resc_alloc_failed; ++ ++ memset(sess->bdt_dma_info, 0, num_pages * sizeof(*dma)); ++ dma = (struct bnx2i_dma *)sess->bdt_dma_info; ++ while (bdt_info && (bdt_info != (struct io_bdt *)&sess->bd_tbl_list)) { ++ if (bnx2i_alloc_dma(sess->hba, dma, PAGE_SIZE, 0, 0)) { ++ printk(KERN_ERR "bd_tbl: DMA mem alloc failed\n"); ++ ret_val = -ENOMEM; ++ goto dma_alloc_failed; ++ } ++ list_add_tail(&dma->link, &sess->bdt_dma_resc); ++ ++ for (count = 0; count < num_elem_per_page; count++) { ++ bdt_info->bd_tbl = (struct iscsi_bd *)(dma->mem + ++ (count * bd_tbl_size)); ++ bdt_info->bd_tbl_dma = dma->mapping + count * bd_tbl_size; ++ bdt_info->max_bd_cnt = ISCSI_MAX_BDS_PER_CMD; ++ bdt_info->bd_valid = 0; ++ bdt_info->cmdp = NULL; ++ bdt_info = (struct io_bdt *)bdt_info->link.next; ++ if (bdt_info == (struct io_bdt *)&sess->bd_tbl_list) ++ break; ++ } ++ dma++; ++ } ++ return ret_val; ++ ++resc_alloc_failed: ++dma_alloc_failed: ++ return ret_val; ++} ++ ++ ++/** ++ * bnx2i_free_bd_table_pool - releases resources held by BD table pool ++ * ++ * @sess: iscsi session pointer ++ * ++ * releases BD table pool memory ++ */ ++void bnx2i_free_bd_table_pool(struct bnx2i_sess *sess) ++{ ++ struct list_head *list; ++ struct bnx2i_dma *dma; ++ ++ list_for_each(list, &sess->bdt_dma_resc) { ++ dma = list_entry(list, struct bnx2i_dma, link); ++ bnx2i_free_dma(sess->hba, dma); ++ } ++ ++ kfree(sess->bdt_dma_info); ++} ++ ++ ++/** ++ * bnx2i_setup_mp_bdt - allocated BD table resources to be used as ++ * the dummy buffer for '0' payload length iscsi requests ++ * ++ * @hba: pointer to adapter structure ++ * ++ * allocate memory for dummy buffer and associated BD table to be used by ++ * middle path (MP) requests ++ */ ++int bnx2i_setup_mp_bdt(struct bnx2i_hba *hba) ++{ ++ int rc = 0; ++ ++ if (bnx2i_alloc_dma(hba, &hba->mp_dma_buf, PAGE_SIZE, BNX2I_TBL_TYPE_BD, 0)) { ++ printk(KERN_ERR "unable to allocate Middle Path BDT\n"); ++ rc = -1; ++ } ++ return rc; ++} ++ ++ ++/** ++ * bnx2i_free_mp_bdt - releases ITT back to free pool ++ * ++ * @hba: pointer to adapter instance ++ * ++ * free MP dummy buffer and associated BD table ++ */ ++void bnx2i_free_mp_bdt(struct bnx2i_hba *hba) ++{ ++ bnx2i_free_dma(hba, &hba->mp_dma_buf); ++} ++ ++ ++/** ++ * bnx2i_start_iscsi_hba_shutdown - start hba shutdown by cleaning up ++ * all active sessions ++ * ++ * @hba: pointer to adapter instance ++ * ++ * interface is being brought down by the user, fail all active iSCSI sessions ++ * belonging to this adapter ++ */ ++void bnx2i_start_iscsi_hba_shutdown(struct bnx2i_hba *hba) ++{ ++ struct list_head *list; ++ struct list_head *tmp; ++ struct bnx2i_sess *sess; ++ int timeout_secs = hba->conn_ctx_destroy_tmo; ++ unsigned int flags; ++ int lpcnt; ++ int rc; ++ ++ spin_lock_irqsave(&hba->lock, flags); ++ list_for_each_safe(list, tmp, &hba->active_sess) { ++ sess = (struct bnx2i_sess *)list; ++ spin_unlock_irqrestore(&hba->lock, flags); ++ lpcnt = 4; ++ rc = bnx2i_do_iscsi_sess_recovery(sess, DID_NO_CONNECT); ++ while ((rc != SUCCESS) && lpcnt--) { ++ msleep(1000); ++ rc = bnx2i_do_iscsi_sess_recovery(sess, DID_NO_CONNECT); ++ } ++ spin_lock_irqsave(&hba->lock, flags); ++ } ++ spin_unlock_irqrestore(&hba->lock, flags); ++ ++ wait_event_interruptible_timeout(hba->eh_wait, ++ (hba->ofld_conns_active == 0), ++ timeout_secs); ++} ++ ++ ++/** ++ * bnx2i_iscsi_handle_ip_event - inetdev callback to handle ip address change ++ * ++ * @hba: pointer to adapter instance ++ * ++ * IP address change indication, fail all iSCSI connections on this adapter ++ * and let 'iscsid' reinstate the connections ++ */ ++void bnx2i_iscsi_handle_ip_event(struct bnx2i_hba *hba) ++{ ++ struct list_head *list; ++ struct list_head *tmp; ++ struct bnx2i_sess *sess; ++ u32 flags; ++ ++ spin_lock_irqsave(&hba->lock, flags); ++ list_for_each_safe(list, tmp, &hba->active_sess) { ++ sess = (struct bnx2i_sess *)list; ++ spin_unlock_irqrestore(&hba->lock, flags); ++ bnx2i_do_iscsi_sess_recovery(sess, DID_RESET); ++ spin_lock_irqsave(&hba->lock, flags); ++ } ++ spin_unlock_irqrestore(&hba->lock, flags); ++} ++ ++ ++static void bnx2i_withdraw_sess_recovery(struct bnx2i_sess *sess) ++{ ++ struct bnx2i_hba *hba = sess->hba; ++ int cons_idx = hba->sess_recov_cons_idx; ++ unsigned int long flags; ++ ++ spin_lock_irqsave(&hba->lock, flags); ++ while (hba->sess_recov_prod_idx != cons_idx) { ++ if (sess == hba->sess_recov_list[cons_idx]) { ++ hba->sess_recov_list[cons_idx] = NULL; ++ break; ++ } ++ if (cons_idx == hba->sess_recov_max_idx) ++ cons_idx = 0; ++ else ++ cons_idx++; ++ } ++ spin_unlock_irqrestore(&hba->lock, flags); ++} ++ ++/** ++ * conn_err_recovery_task - does recovery on all queued sessions ++ * ++ * @work: pointer to work struct ++ * ++ * iSCSI Session recovery queue manager ++ */ ++static void ++#if defined(INIT_DELAYED_WORK_DEFERRABLE) || defined(INIT_WORK_NAR) ++conn_err_recovery_task(struct work_struct *work) ++#else ++conn_err_recovery_task(void *data) ++#endif ++{ ++#if defined(INIT_DELAYED_WORK_DEFERRABLE) || defined(INIT_WORK_NAR) ++ struct bnx2i_hba *hba = container_of(work, struct bnx2i_hba, ++ err_rec_task); ++#else ++ struct bnx2i_hba *hba = data; ++#endif ++ struct bnx2i_sess *sess; ++ int cons_idx = hba->sess_recov_cons_idx; ++ unsigned int long flags; ++ ++ spin_lock_irqsave(&hba->lock, flags); ++ while (hba->sess_recov_prod_idx != cons_idx) { ++ sess = hba->sess_recov_list[cons_idx]; ++ if (cons_idx == hba->sess_recov_max_idx) ++ cons_idx = 0; ++ else ++ cons_idx++; ++ spin_unlock_irqrestore(&hba->lock, flags); ++ if (sess) { ++ if (sess->state == BNX2I_SESS_IN_LOGOUT) ++ bnx2i_do_iscsi_sess_recovery(sess, DID_NO_CONNECT); ++ else ++ bnx2i_do_iscsi_sess_recovery(sess, DID_RESET); ++ } ++ spin_lock_irqsave(&hba->lock, flags); ++ } ++ hba->sess_recov_cons_idx = cons_idx; ++ spin_unlock_irqrestore(&hba->lock, flags); ++} ++ ++/** ++ * bnx2i_ep_destroy_list_add - add an entry to EP destroy list ++ * ++ * @hba: pointer to adapter instance ++ * @ep: pointer to endpoint (transport indentifier) structure ++ * ++ * EP destroy queue manager ++ */ ++static int bnx2i_ep_destroy_list_add(struct bnx2i_hba *hba, ++ struct bnx2i_endpoint *ep) ++{ ++#ifdef __VMKLNX__ ++ spin_lock(&hba->lock); ++#else ++ write_lock(&hba->ep_rdwr_lock); ++#endif ++ list_add_tail(&ep->link, &hba->ep_destroy_list); ++#ifdef __VMKLNX__ ++ spin_unlock(&hba->lock); ++#else ++ write_unlock(&hba->ep_rdwr_lock); ++#endif ++ return 0; ++} ++ ++/** ++ * bnx2i_ep_destroy_list_del - add an entry to EP destroy list ++ * ++ * @hba: pointer to adapter instance ++ * @ep: pointer to endpoint (transport indentifier) structure ++ * ++ * EP destroy queue manager ++ */ ++static int bnx2i_ep_destroy_list_del(struct bnx2i_hba *hba, ++ struct bnx2i_endpoint *ep) ++{ ++#ifdef __VMKLNX__ ++ spin_lock(&hba->lock); ++#else ++ write_lock(&hba->ep_rdwr_lock); ++#endif ++ list_del_init(&ep->link); ++#ifdef __VMKLNX__ ++ spin_unlock(&hba->lock); ++#else ++ write_unlock(&hba->ep_rdwr_lock); ++#endif ++ ++ return 0; ++} ++ ++/** ++ * bnx2i_ep_ofld_list_add - add an entry to ep offload pending list ++ * ++ * @hba: pointer to adapter instance ++ * @ep: pointer to endpoint (transport indentifier) structure ++ * ++ * pending conn offload completion queue manager ++ */ ++static int bnx2i_ep_ofld_list_add(struct bnx2i_hba *hba, ++ struct bnx2i_endpoint *ep) ++{ ++#ifdef __VMKLNX__ ++ spin_lock(&hba->lock); ++#else ++ write_lock(&hba->ep_rdwr_lock); ++#endif ++ list_add_tail(&ep->link, &hba->ep_ofld_list); ++#ifdef __VMKLNX__ ++ spin_unlock(&hba->lock); ++#else ++ write_unlock(&hba->ep_rdwr_lock); ++#endif ++ return 0; ++} ++ ++/** ++ * bnx2i_ep_ofld_list_del - add an entry to ep offload pending list ++ * ++ * @hba: pointer to adapter instance ++ * @ep: pointer to endpoint (transport indentifier) structure ++ * ++ * pending conn offload completion queue manager ++ */ ++static int bnx2i_ep_ofld_list_del(struct bnx2i_hba *hba, ++ struct bnx2i_endpoint *ep) ++{ ++#ifdef __VMKLNX__ ++ spin_lock(&hba->lock); ++#else ++ write_lock(&hba->ep_rdwr_lock); ++#endif ++ list_del_init(&ep->link); ++#ifdef __VMKLNX__ ++ spin_unlock(&hba->lock); ++#else ++ write_unlock(&hba->ep_rdwr_lock); ++#endif ++ ++ return 0; ++} ++ ++ ++/** ++ * bnx2i_find_ep_in_ofld_list - find iscsi_cid in pending list of endpoints ++ * ++ * @hba: pointer to adapter instance ++ * @iscsi_cid: iscsi context ID to find ++ * ++ */ ++struct bnx2i_endpoint * ++bnx2i_find_ep_in_ofld_list(struct bnx2i_hba *hba, u32 iscsi_cid) ++{ ++ struct list_head *list; ++ struct list_head *tmp; ++ struct bnx2i_endpoint *ep; ++ ++#ifdef __VMKLNX__ ++ spin_lock(&hba->lock); ++#else ++ read_lock(&hba->ep_rdwr_lock); ++#endif ++ list_for_each_safe(list, tmp, &hba->ep_ofld_list) { ++ ep = (struct bnx2i_endpoint *)list; ++ ++ if (ep->ep_iscsi_cid == iscsi_cid) ++ break; ++ ep = NULL; ++ } ++#ifdef __VMKLNX__ ++ spin_unlock(&hba->lock); ++#else ++ read_unlock(&hba->ep_rdwr_lock); ++#endif ++ ++ if (!ep) ++ printk("bnx2i: ofld_list - icid %d not found\n", iscsi_cid); ++ return ep; ++} ++ ++ ++/** ++ * bnx2i_find_ep_in_destroy_list - find iscsi_cid in destroy list ++ * ++ * @hba: pointer to adapter instance ++ * @iscsi_cid: iscsi context ID to find ++ * ++ */ ++struct bnx2i_endpoint * ++bnx2i_find_ep_in_destroy_list(struct bnx2i_hba *hba, u32 iscsi_cid) ++{ ++ struct list_head *list; ++ struct list_head *tmp; ++ struct bnx2i_endpoint *ep; ++ ++#ifdef __VMKLNX__ ++ spin_lock(&hba->lock); ++#else ++ read_lock(&hba->ep_rdwr_lock); ++#endif ++ list_for_each_safe(list, tmp, &hba->ep_destroy_list) { ++ ep = (struct bnx2i_endpoint *)list; ++ ++ if (ep->ep_iscsi_cid == iscsi_cid) ++ break; ++ ep = NULL; ++ } ++#ifdef __VMKLNX__ ++ spin_unlock(&hba->lock); ++#else ++ read_unlock(&hba->ep_rdwr_lock); ++#endif ++ ++ if (!ep) ++ printk("bnx2i: destroy_list - icid %d not found\n", iscsi_cid); ++ ++ return ep; ++} ++ ++ ++#ifdef __VMKLNX__ ++struct Scsi_Host *bnx2i_alloc_shost(int priv_sz) ++{ ++ struct Scsi_Host *shost; ++ ++ shost = scsi_host_alloc(&bnx2i_host_template, priv_sz); ++ if (!shost) ++ return NULL; ++ ++ /* Vmware suggested values */ ++ shost->max_id = 256; ++ shost->max_channel = 64; ++ shost->max_lun = bnx2i_iscsi_transport.max_lun; ++ ++ return shost; ++} ++#endif ++ ++ ++/** ++ * bnx2i_alloc_hba - allocate and init adapter instance ++ * ++ * @cnic: cnic device pointer ++ * ++ * allocate & initialize adapter structure and call other ++ * support routines to do per adapter initialization ++ */ ++struct bnx2i_hba *bnx2i_alloc_hba(struct cnic_dev *cnic) ++{ ++ struct bnx2i_hba *hba; ++ struct scsi_host_template *scsi_template; ++ struct iscsi_transport *iscsi_transport; ++ ++#ifdef __VMKLNX__ ++ struct Scsi_Host *shost; ++ shost = bnx2i_alloc_shost(hostdata_privsize(sizeof(*hba))); ++ if (!shost) ++ return NULL; ++ hba = shost_priv(shost); ++ hba->shost = shost; ++#else ++ hba = kmalloc(sizeof(struct bnx2i_hba), GFP_KERNEL); ++ if (!hba) ++ return NULL; ++ ++ memset(hba, 0, sizeof(struct bnx2i_hba)); ++#endif ++ /* Get PCI related information and update hba struct members */ ++ hba->cnic = cnic; ++ hba->netdev = cnic->netdev; ++ ++ INIT_LIST_HEAD(&hba->active_sess); ++ INIT_LIST_HEAD(&hba->ep_ofld_list); ++ INIT_LIST_HEAD(&hba->ep_destroy_list); ++#ifndef __VMKLNX__ ++ rwlock_init(&hba->ep_rdwr_lock); ++#endif ++ ++ hba->mtu_supported = BNX2I_MAX_MTU_SUPPORTED; ++ ++ hba->max_active_conns = ISCSI_MAX_CONNS_PER_HBA; ++ ++ /* Get device type required to determine default SQ size */ ++ if (cnic->pcidev) { ++ hba->pci_did = cnic->pcidev->device; ++ bnx2i_identify_device(hba); ++ } ++ ++ /* SQ/RQ/CQ size can be changed via sysfs interface */ ++ if (test_bit(BNX2I_NX2_DEV_57710, &hba->cnic_dev_type)) { ++ hba->setup_pgtbl = bnx2i_setup_5771x_pgtbl; ++ if (sq_size && sq_size <= BNX2I_5770X_SQ_WQES_MAX) ++ hba->max_sqes = sq_size; ++ else ++ hba->max_sqes = BNX2I_5770X_SQ_WQES_DEFAULT; ++ ++#ifndef CONFIG_X86_64 ++ if (hba->max_sqes > BNX2I_5770X_SQ_WQES_DEFAULT_X86) ++ hba->max_sqes = BNX2I_5770X_SQ_WQES_DEFAULT_X86; ++#endif ++ } else { /* 5706/5708/5709 */ ++ hba->setup_pgtbl = bnx2i_setup_570x_pgtbl; ++ if (sq_size && sq_size <= BNX2I_570X_SQ_WQES_MAX) ++ hba->max_sqes = sq_size; ++ else ++ hba->max_sqes = BNX2I_570X_SQ_WQES_DEFAULT; ++ } ++ ++ hba->max_rqes = rq_size; ++ hba->max_cqes = hba->max_sqes + rq_size; ++ hba->num_ccell = hba->max_sqes / 2; ++ ++ scsi_template = bnx2i_alloc_scsi_host_template(hba, cnic); ++ if (!scsi_template) ++ return NULL; ++ ++ iscsi_transport = bnx2i_alloc_iscsi_transport(hba, cnic, scsi_template); ++ if (!iscsi_transport) ++ goto iscsi_transport_err; ++ ++ /* Get PCI related information and update hba struct members */ ++ hba->cnic = cnic; ++ hba->netdev = cnic->netdev; ++ ++ ++ if (bnx2i_setup_free_cid_que(hba)) ++ goto cid_que_err; ++ ++ hba->scsi_template = scsi_template; ++ hba->iscsi_transport = iscsi_transport; ++ ++ spin_lock_init(&hba->lock); ++ spin_lock_init(&hba->net_dev_lock); ++ ++ /* initialize timer and wait queue used for resource cleanup when ++ * interface is brought down */ ++ init_timer(&hba->hba_timer); ++ init_waitqueue_head(&hba->eh_wait); ++ ++#ifdef __VMKLNX__ ++ init_timer(&hba->hba_poll_timer); ++ hba->hba_poll_timer.expires = jiffies + 2 * HZ; ++ hba->hba_poll_timer.function = bnx2i_hba_poll_timer; ++ hba->hba_poll_timer.data = (unsigned long) hba; ++ add_timer(&hba->hba_poll_timer); ++#endif ++ ++ ++#if defined(INIT_DELAYED_WORK_DEFERRABLE) || defined(INIT_WORK_NAR) ++ INIT_WORK(&hba->err_rec_task, conn_err_recovery_task); ++#else ++ INIT_WORK(&hba->err_rec_task, conn_err_recovery_task, hba); ++#endif ++ hba->sess_recov_prod_idx = 0; ++ hba->sess_recov_cons_idx = 0; ++ hba->sess_recov_max_idx = 0; ++ hba->sess_recov_list = kmalloc(PAGE_SIZE, GFP_KERNEL); ++ if (!hba->sess_recov_list) ++ goto rec_que_err; ++ hba->sess_recov_max_idx = PAGE_SIZE / sizeof (struct bnx2i_sess *) - 1; ++#ifdef __VMKLNX__ ++ if (bnx2i_bind_adapter_devices(hba)) ++ goto pcidev_bind_err; ++#endif ++ ++ return hba; ++ ++#ifdef __VMKLNX__ ++pcidev_bind_err: ++#endif ++rec_que_err: ++ bnx2i_release_free_cid_que(hba); ++cid_que_err: ++ bnx2i_free_iscsi_transport(iscsi_transport); ++iscsi_transport_err: ++ bnx2i_free_scsi_host_template(scsi_template); ++#ifdef __VMKLNX__ ++ scsi_host_put(shost); ++#else ++ bnx2i_free_hba(hba); ++#endif ++ ++ return NULL; ++} ++ ++ ++/** ++ * bnx2i_free_hba- releases hba structure and resources held by the adapter ++ * ++ * @hba: pointer to adapter instance ++ * ++ * free adapter structure and call various cleanup routines. ++ */ ++void bnx2i_free_hba(struct bnx2i_hba *hba) ++{ ++ bnx2i_release_free_cid_que(hba); ++ INIT_LIST_HEAD(&hba->ep_ofld_list); ++ INIT_LIST_HEAD(&hba->ep_destroy_list); ++ ++#ifdef __VMKLNX__ ++ del_timer_sync(&hba->hba_poll_timer); ++#endif ++ ++ INIT_LIST_HEAD(&hba->active_sess); ++#ifdef __VMKLNX__ ++ bnx2i_unbind_adapter_devices(hba); ++ scsi_host_put(hba->shost); ++#else ++ kfree(hba); ++#endif ++} ++ ++ ++static int bnx2i_flush_pend_queue(struct bnx2i_sess *sess, ++ struct scsi_cmnd *sc, int reason) ++{ ++ int num_pend_cmds_returned = 0; ++ int in_pend_que = 0; ++ struct list_head *list; ++ struct list_head *tmp; ++ struct bnx2i_scsi_task *scsi_task; ++ ++ /* Don't take lock in here, bnx2i_flush_pend_queue() is called ++ * with sess->lock held ++ */ ++ list_for_each_safe(list, tmp, &sess->pend_cmd_list) { ++ scsi_task = (struct bnx2i_scsi_task *) list; ++ ++ /* cmd queue flush request could be due to LUN RESET or ++ * the session recovery. In former case just fail only the ++ * command belonging that particular LUN. ++ */ ++ if (sc) { ++ if (sc == scsi_task->scsi_cmd) { ++ list_del_init(&scsi_task->link); ++ scsi_task->scsi_cmd = NULL; ++ list_add_tail(&scsi_task->link, ++ &sess->scsi_task_list); ++ in_pend_que = 1; ++ } else if (scsi_task->scsi_cmd->device->lun ++ != sc->device->lun) ++ continue; ++ } ++ ++ num_pend_cmds_returned++; ++ list_del_init(&scsi_task->link); ++ bnx2i_return_failed_command(sess, scsi_task->scsi_cmd, ++ scsi_bufflen(scsi_task->scsi_cmd), ++ reason); ++ scsi_task->scsi_cmd = NULL; ++ list_add_tail(&scsi_task->link, &sess->scsi_task_list); ++ } ++ printk("%s: cid %d, cleaned %d out of %d commands from the pend queue\n", ++ __FUNCTION__, sess->lead_conn->ep->ep_iscsi_cid, ++ num_pend_cmds_returned, sess->pend_cmd_count); ++ sess->pend_cmd_count -= num_pend_cmds_returned; ++ return in_pend_que; ++} ++ ++/** ++ * bnx2i_flush_cmd_queue - flush active command queue ++ * ++ * @sess: iscsi session pointer ++ * @reason: SCSI ML error code, DID_BUS_BUSY ++ * ++ * return all commands in active queue which should already have been ++ * cleaned up by the cnic device. ++ */ ++static void bnx2i_flush_cmd_queue(struct bnx2i_sess *sess, ++ struct scsi_cmnd *scsi_cmd, ++ int reason, int clear_ctx) ++{ ++ struct list_head *list; ++ struct list_head *tmp; ++ struct bnx2i_cmd *cmd; ++ unsigned long flags; ++ struct Scsi_Host *shost; ++ int in_active_que = 0; ++ int in_pend_que = 0; ++ int cmd_cnt = 0; ++ ++ shost = bnx2i_sess_get_shost(sess); ++ ++ spin_lock_irqsave(&sess->lock, flags); ++ list_for_each_safe(list, tmp, &sess->active_cmd_list) { ++ cmd = (struct bnx2i_cmd *) list; ++ ++ if (!cmd->scsi_cmd) { ++ printk(KERN_ALERT "bnx2i: WaTcH - cid %d, flush que," ++ " cmd %p is not associated with any" ++ " scsi cmd\n", ++ sess->lead_conn->ep->ep_iscsi_cid, ++ cmd); ++ continue; ++ } ++ /* cmd queue flush request could be due to LUN RESET or ++ * the session recovery. In former case just fail only the ++ * command belonging that particular LUN. ++ */ ++ if (scsi_cmd) { ++ if (scsi_cmd == cmd->scsi_cmd) { ++ in_active_que = 1; ++ BUG_ON(1); ++ continue; ++ } else if (cmd->scsi_cmd->device->lun != ++ scsi_cmd->device->lun) ++ continue; ++ } ++ if (atomic_read(&cmd->cmd_state) == ISCSI_CMD_STATE_CMPL_RCVD){ ++ /* completion pdu is being processed and we will let ++ * it run to completion, fail the request here ++ */ ++ printk(KERN_ALERT "bnx2i: WaTcH - cid %d, completion & " ++ "TMF cleanup are running in parallel," ++ " cmd %p\n", ++ sess->lead_conn->ep->ep_iscsi_cid, cmd); ++ continue; ++ } ++ cmd->scsi_cmd->result = (reason << 16); ++ atomic_set(&cmd->cmd_state, ISCSI_CMD_STATE_CLEANUP_START); ++ spin_unlock_irqrestore(&sess->lock, flags); ++ printk("%s - task clean cmd %p, sc %p, lun %x\n", ++ __FUNCTION__, cmd, cmd->scsi_cmd, cmd->scsi_cmd->device->lun); ++ bnx2i_cleanup_task_context(sess, cmd, reason, clear_ctx); ++ cmd_cnt++; ++ spin_lock_irqsave(&sess->lock, flags); ++ } ++ printk("%s - cleaned up %d commands\n", __FUNCTION__, cmd_cnt); ++ ++ if (sess->lead_conn) ++ in_pend_que = bnx2i_flush_pend_queue(sess, scsi_cmd, reason); ++ ++ if (!scsi_cmd) ++ goto done; ++done: ++ spin_unlock_irqrestore(&sess->lock, flags); ++} ++ ++ ++/** ++ * bnx2i_session_recovery_start - start recovery process on given session ++ * ++ * @sess: iscsi session pointer ++ * @reason: SCSI ML error code, DID_BUS_BUSY ++ * ++ * initiate cleanup of outstanding commands for sess recovery ++ */ ++static int bnx2i_session_recovery_start(struct bnx2i_sess *sess, int reason) ++{ ++ if (sess->state == BNX2I_SESS_IN_LOGOUT || ++ sess->state == BNX2I_SESS_INITIAL) ++ return 0; ++ ++ if (!is_sess_active(sess) && ++ !sess->state & BNX2I_SESS_INITIAL) { ++ if (sess->recovery_state) ++ return -EPERM; ++ wait_event_interruptible_timeout(sess->er_wait, ++ (sess->state == ++ BNX2I_SESS_IN_FFP), 20 * HZ); ++ if (signal_pending(current)) ++ flush_signals(current); ++ if (!is_sess_active(sess) && ++ !sess->state & BNX2I_SESS_INITIAL) { ++ printk(KERN_ALERT "sess_reco: sess still not active\n"); ++ sess->lead_conn->state = CONN_STATE_XPORT_FREEZE; ++ return -EPERM; ++ } ++ } ++ ++ return 0; ++} ++ ++ ++/** ++ * bnx2i_do_iscsi_sess_recovery - implements session recovery code ++ * ++ * @sess: iscsi session pointer ++ * @reason: SCSI ML error code, DID_BUS_BUSY, DID_NO_CONNECT, ++ * DID_RESET ++ * ++ * SCSI host reset handler, which is translates to iSCSI session ++ * recovery. This routine starts internal driver session recovery, ++ * indicates connection error to 'iscsid' which does session reinstatement ++ * This is an synchronous call which waits for completion and returns ++ * the ultimate result of session recovery process to caller ++ */ ++int bnx2i_do_iscsi_sess_recovery(struct bnx2i_sess *sess, int reason) ++{ ++ struct bnx2i_hba *hba; ++ struct bnx2i_conn *conn = sess->lead_conn; ++ ++ if (!conn) ++ return FAILED; ++ ++ /* block scsi host to avoid any further command queuing */ ++#ifdef __VMKLNX__ ++ iscsi_block_session(sess->cls_sess); ++#else ++ iscsi_block_session(session_to_cls(sess)); ++#endif ++ ++ if (bnx2i_session_recovery_start(sess, reason)) { ++ printk(KERN_INFO "bnx2i: sess rec start returned error\n"); ++ return FAILED; ++ } ++ hba = sess->hba; ++ ++ sess->recovery_state = ISCSI_SESS_RECOVERY_OPEN_ISCSI; ++ iscsi_conn_error(conn->cls_conn, ISCSI_ERR_CONN_FAILED); ++ ++ /* if session teardown is because of net interface down, ++ * no need to wait for complete recovery */ ++ if (reason == DID_NO_CONNECT || ++ test_bit(ADAPTER_STATE_LINK_DOWN, &sess->hba->adapter_state)) ++ wait_event_interruptible_timeout(sess->er_wait, ++ !conn->ep, ++ msecs_to_jiffies(3000)); ++ else ++ wait_event_interruptible(sess->er_wait, ++ ((sess->recovery_state & ++ ISCSI_SESS_RECOVERY_COMPLETE) || ++ (sess->recovery_state & ++ ISCSI_SESS_RECOVERY_FAILED))); ++ ++ if (signal_pending(current)) ++ flush_signals(current); ++ ++ if (reason == DID_NO_CONNECT) ++ goto ret_success; ++ ++ if (sess->recovery_state & ISCSI_SESS_RECOVERY_COMPLETE) { ++ printk(KERN_INFO "bnx2i: sess recovery %p complete\n", sess); ++ sess->state = BNX2I_SESS_IN_FFP; ++ } else ++ return FAILED; ++ ++ret_success: ++ sess->recovery_state = 0; ++ return SUCCESS; ++} ++ ++ ++/** ++ * bnx2i_iscsi_sess_release - cleanup iscsi session & reclaim all resources ++ * ++ * @hba: pointer to adapter instance ++ * @sess: iscsi session pointer ++ * ++ * free up resources held by this session including ITT queue, cmd struct pool, ++ * BD table pool. HBA lock is held while manipulating active session list ++ */ ++void bnx2i_iscsi_sess_release(struct bnx2i_hba *hba, struct bnx2i_sess *sess) ++{ ++ u32 flags; ++ ++ printk("bnx2i: free_sess_resc: start\n"); ++ if (sess->login_nopout_cmd) ++ bnx2i_free_cmd(sess, sess->login_nopout_cmd); ++ if (sess->scsi_tmf_cmd) ++ bnx2i_free_cmd(sess, sess->scsi_tmf_cmd); ++ if (sess->nopout_resp_cmd) ++ bnx2i_free_cmd(sess, sess->nopout_resp_cmd); ++ ++ printk("bnx2i: free_sess_resc: freed all mp commands\n"); ++ sess->login_nopout_cmd = NULL; ++ sess->scsi_tmf_cmd = NULL; ++ sess->nopout_resp_cmd = NULL; ++ ++ printk("bnx2i: free_sess_resc: free BD table\n"); ++ bnx2i_free_bd_table_pool(sess); ++ printk("bnx2i: free_sess_resc: free BD resc pages\n"); ++ bnx2i_free_all_bdt_resc_pages(sess); ++ printk("bnx2i: free_sess_resc: free cmd pool\n"); ++ bnx2i_free_cmd_pool(sess); ++ printk("bnx2i: free_sess_resc: free scsi_task pool\n"); ++ bnx2i_free_scsi_task_pool(sess); ++ ++ spin_lock_irqsave(&hba->lock, flags); ++ list_del_init(&sess->link); ++ hba->num_active_sess--; ++ spin_unlock_irqrestore(&hba->lock, flags); ++ printk("bnx2i: free_sess_resc: done\n"); ++} ++ ++ ++/** ++ * bnx2i_iscsi_sess_new - initialize newly allocated session structure ++ * ++ * @hba: pointer to adapter instance ++ * @sess: iscsi session pointer ++ * ++ * initialize session structure elements and allocate per sess resources. ++ * Some of the per session resources allocated are command struct pool, ++ * BD table pool and ITT queue region ++ */ ++int bnx2i_iscsi_sess_new(struct bnx2i_hba *hba, struct bnx2i_sess *sess) ++{ ++ u32 flags; ++ ++ spin_lock_irqsave(&hba->lock, flags); ++ list_add_tail(&sess->link, &hba->active_sess); ++ hba->num_active_sess++; ++ spin_unlock_irqrestore(&hba->lock, flags); ++ ++ sess->sq_size = hba->max_sqes; ++ sess->tsih = 0; ++ sess->lead_conn = NULL; ++ sess->worker_time_slice = 2; ++ ++ spin_lock_init(&sess->lock); ++ mutex_init(&sess->tmf_mutex); ++ ++ /* initialize active connection list */ ++ INIT_LIST_HEAD(&sess->conn_list); ++ INIT_LIST_HEAD(&sess->free_cmds); ++ ++ INIT_LIST_HEAD(&sess->pend_cmd_list); ++ sess->pend_cmd_count = 0; ++ INIT_LIST_HEAD(&sess->active_cmd_list); ++ sess->active_cmd_count = 0; ++ ++ atomic_set(&sess->login_noop_pending, 0); ++ atomic_set(&sess->logout_pending, 0); ++ atomic_set(&sess->tmf_pending, 0); ++ ++ sess->login_nopout_cmd = NULL; ++ sess->scsi_tmf_cmd = NULL; ++ sess->nopout_resp_cmd = NULL; ++ ++ sess->num_active_conn = 0; ++ sess->max_conns = 1; ++ sess->target_name = NULL; ++ ++ sess->state = BNX2I_SESS_INITIAL; ++ sess->recovery_state = 0; ++ atomic_set(&sess->tmf_active, 0); ++ ++ if (bnx2i_alloc_bd_table_pool(sess) != 0) { ++ printk(KERN_ERR "sess_new: unable to alloc bd table pool\n"); ++ goto err_bd_pool; ++ } ++ ++ if (bnx2i_alloc_cmd_pool(sess) != 0) { ++ printk(KERN_ERR "sess_new: alloc cmd pool failed\n"); ++ goto err_cmd_pool; ++ } ++ ++ if (bnx2i_alloc_scsi_task_pool(sess) != 0) { ++ printk(KERN_ERR "sess_new: alloc scsi_task pool failed\n"); ++ goto err_sc_pool; ++ } ++ init_timer(&sess->abort_timer); ++ init_waitqueue_head(&sess->er_wait); ++ ++ return 0; ++ ++err_sc_pool: ++ bnx2i_free_cmd_pool(sess); ++err_cmd_pool: ++ bnx2i_free_bd_table_pool(sess); ++err_bd_pool: ++ return -ENOMEM; ++} ++ ++/** ++ * bnx2i_conn_free_login_resources - free DMA resources used for login process ++ * ++ * @hba: pointer to adapter instance ++ * @conn: iscsi connection pointer ++ * ++ * Login related resources, mostly BDT & payload DMA memory is freed ++ */ ++void bnx2i_conn_free_login_resources(struct bnx2i_hba *hba, ++ struct bnx2i_conn *conn) ++{ ++ bnx2i_free_dma(hba, &conn->gen_pdu.login_req); ++ bnx2i_free_dma(hba, &conn->gen_pdu.login_resp); ++} ++ ++/** ++ * bnx2i_conn_alloc_login_resources - alloc DMA resources used for ++ * login / nopout pdus ++ * ++ * @hba: pointer to adapter instance ++ * @conn: iscsi connection pointer ++ * ++ * Login & nop-in related resources is allocated in this routine. ++ */ ++static int bnx2i_conn_alloc_login_resources(struct bnx2i_hba *hba, ++ struct bnx2i_conn *conn) ++{ ++ /* Allocate memory for login request/response buffers */ ++ if (bnx2i_alloc_dma(hba, &conn->gen_pdu.login_req, ++ ISCSI_CONN_LOGIN_BUF_SIZE, BNX2I_TBL_TYPE_BD, 0)) ++ goto error; ++ ++ conn->gen_pdu.req_buf_size = 0; ++ conn->gen_pdu.req_wr_ptr = conn->gen_pdu.login_req.mem; ++ ++ if (bnx2i_alloc_dma(hba, &conn->gen_pdu.login_resp, ++ ISCSI_CONN_LOGIN_BUF_SIZE, BNX2I_TBL_TYPE_BD, 0)) ++ goto error; ++ ++ conn->gen_pdu.resp_buf_size = ISCSI_CONN_LOGIN_BUF_SIZE; ++ conn->gen_pdu.resp_wr_ptr = conn->gen_pdu.login_resp.mem; ++ ++ return 0; ++ ++error: ++ printk(KERN_ERR "bnx2i:a conn login resource alloc failed!!\n"); ++ bnx2i_conn_free_login_resources(hba, conn); ++ return -ENOMEM; ++ ++} ++ ++ ++/** ++ * bnx2i_iscsi_conn_new - initialize newly created connection structure ++ * ++ * @sess: iscsi session pointer ++ * @conn: iscsi connection pointer ++ * ++ * connection structure is initialized which mainly includes allocation of ++ * login resources and lock/time initialization ++ */ ++int bnx2i_iscsi_conn_new(struct bnx2i_sess *sess, struct bnx2i_conn *conn) ++{ ++ struct bnx2i_hba *hba = sess->hba; ++ ++ conn->sess = sess; ++ conn->header_digest_en = 0; ++ conn->data_digest_en = 0; ++ ++ INIT_LIST_HEAD(&conn->link); ++ ++ /* 'ep' ptr will be assigned in bind() call */ ++ conn->ep = NULL; ++ ++ if (test_bit(BNX2I_NX2_DEV_57710, &hba->cnic_dev_type)) ++ conn->ring_doorbell = bnx2i_ring_sq_dbell_bnx2x; ++ else ++ conn->ring_doorbell = bnx2i_ring_sq_dbell_bnx2; ++ ++ if (bnx2i_conn_alloc_login_resources(hba, conn)) { ++ printk(KERN_ALERT "conn_new: login resc alloc failed!!\n"); ++ return -ENOMEM; ++ } ++ ++ ++ atomic_set(&conn->stop_state, 0); ++ atomic_set(&conn->worker_running, 0); ++ atomic_set(&conn->worker_enabled_cnt, 0); ++ atomic_set(&conn->worker_disabled_cnt, 0); ++#ifdef __VMKLNX__ ++ tasklet_init(&conn->conn_tasklet, &bnx2i_conn_main_worker, ++ (unsigned long) conn); ++#else ++#if defined(INIT_DELAYED_WORK_DEFERRABLE) || defined(INIT_WORK_NAR) ++ INIT_WORK(&conn->conn_worker, bnx2i_conn_main_worker); ++#else ++ INIT_WORK(&conn->conn_worker, bnx2i_conn_main_worker, conn); ++#endif ++#endif /* __VMKLNX__ */ ++ atomic_set(&conn->worker_enabled, 1); ++ atomic_inc(&conn->worker_enabled_cnt); ++ ++ init_timer(&conn->poll_timer); ++ conn->poll_timer.expires = HZ + jiffies; /* 200 msec */ ++ conn->poll_timer.function = bnx2i_conn_poll; ++ conn->poll_timer.data = (unsigned long) conn; ++ ++ return 0; ++} ++ ++ ++/** ++ * bnx2i_login_resp_update_cmdsn - extracts SN & MAX_SN from login response header & ++ * updates driver 'cmdsn' with ++ * ++ * @conn: iscsi connection pointer ++ * ++ * extract & update SN counters from login response ++ */ ++static int bnx2i_login_resp_update_cmdsn(struct bnx2i_conn *conn) ++{ ++ u32 max_cmdsn; ++ u32 exp_cmdsn; ++ u32 stat_sn; ++ struct bnx2i_sess *sess = conn->sess; ++ struct iscsi_nopin *hdr; ++ ++ hdr = (struct iscsi_nopin *) &conn->gen_pdu.resp_hdr; ++ ++ max_cmdsn = ntohl(hdr->max_cmdsn); ++ exp_cmdsn = ntohl(hdr->exp_cmdsn); ++ stat_sn = ntohl(hdr->statsn); ++#define SN_DELTA_ISLAND 0xffff ++ if (max_cmdsn < exp_cmdsn -1 && ++ max_cmdsn > exp_cmdsn - SN_DELTA_ISLAND) ++ return -EINVAL; ++ ++ if (max_cmdsn > sess->max_cmdsn || ++ max_cmdsn < sess->max_cmdsn - SN_DELTA_ISLAND) ++ sess->max_cmdsn = max_cmdsn; ++ ++ if (exp_cmdsn > sess->exp_cmdsn || ++ exp_cmdsn < sess->exp_cmdsn - SN_DELTA_ISLAND) ++ sess->exp_cmdsn = exp_cmdsn; ++ ++ if (stat_sn == conn->exp_statsn) ++ conn->exp_statsn++; ++ ++ return 0; ++} ++ ++ ++/** ++ * bnx2i_update_cmd_sequence - update session sequencing parameter ++ * ++ * @sess: iscsi session pointer ++ * @exp_sn: iscsi expected command seq num ++ * @max_sn: iscsi max command seq num ++ * ++ * update iSCSI SN counters for the given session ++ */ ++void bnx2i_update_cmd_sequence(struct bnx2i_sess *sess, ++ u32 exp_sn, u32 max_sn) ++{ ++ u32 exp_cmdsn = exp_sn; ++ u32 max_cmdsn = max_sn; ++ ++ if (max_cmdsn < exp_cmdsn -1 && ++ max_cmdsn > exp_cmdsn - SN_DELTA_ISLAND) { ++ printk(KERN_ALERT "cmd_sequence: error, exp 0x%x, max 0x%x\n", ++ exp_cmdsn, max_cmdsn); ++ BUG_ON(1); ++ } ++ if (max_cmdsn > sess->max_cmdsn || ++ max_cmdsn < sess->max_cmdsn - SN_DELTA_ISLAND) ++ sess->max_cmdsn = max_cmdsn; ++ if (exp_cmdsn > sess->exp_cmdsn || ++ exp_cmdsn < sess->exp_cmdsn - SN_DELTA_ISLAND) ++ sess->exp_cmdsn = exp_cmdsn; ++} ++ ++ ++/** ++ * bnx2i_process_scsi_resp - complete SCSI command processing by calling ++ * 'scsi_done', free iscsi cmd structure to free list ++ * ++ * @cmd: iscsi cmd pointer ++ * @resp_cqe: scsi response cqe pointer ++ * ++ * validates scsi response indication for normal completion, sense data if any ++ * underflow/overflow condition and propogates SCSI response to SCSI-ML by ++ * calling scsi_done() and also returns command struct back to free pool ++ */ ++void bnx2i_process_scsi_resp(struct bnx2i_cmd *cmd, ++ struct iscsi_cmd_response *resp_cqe) ++{ ++ struct scsi_cmnd *sc = cmd->scsi_cmd; ++ u16 sense_data[128]; ++ int data_len; ++ u16 sense_len; ++ ++ sc->result = (DID_OK << 16) | resp_cqe->status; ++ ++ if (resp_cqe->response != ISCSI_STATUS_CMD_COMPLETED) { ++ sc->result = (DID_ERROR << 16); ++ goto out; ++ } ++ ++ if (resp_cqe->status == SAM_STAT_CHECK_CONDITION) { ++ data_len = resp_cqe->data_length; ++ if (data_len < 2) { ++ printk(KERN_ERR "bnx2i: CHK_CONDITION - invalid " ++ "data length %d\n", data_len); ++ goto out; ++ } ++ ++ if (data_len > BNX2I_RQ_WQE_SIZE) { ++ printk(KERN_ALERT "bnx2i: sense data len %d > RQ sz\n", ++ data_len); ++ data_len = BNX2I_RQ_WQE_SIZE; ++ } ++ if (data_len) { ++ memset(sc->sense_buffer, 0, sizeof(sc->sense_buffer)); ++ bnx2i_get_rq_buf(cmd->conn, (char *)sense_data, data_len); ++ bnx2i_put_rq_buf(cmd->conn, 1); ++ cmd->conn->total_data_octets_rcvd += data_len; ++ sense_len = be16_to_cpu(*((__be16 *) sense_data)); ++ ++ if (sense_len > SCSI_SENSE_BUFFERSIZE) ++ sense_len = SCSI_SENSE_BUFFERSIZE; ++ ++ memcpy(sc->sense_buffer, &sense_data[1], ++ (int) sense_len); ++ } ++ } ++ ++ ++ if (sc->sc_data_direction == DMA_TO_DEVICE) ++ goto out; ++ ++ ++ if (resp_cqe->response_flags & ++ ISCSI_CMD_RESPONSE_RESIDUAL_UNDERFLOW) { ++ if (resp_cqe->residual_count && ++ (resp_cqe->residual_count <= scsi_bufflen(sc))) { ++ scsi_set_resid(sc, resp_cqe->residual_count); ++ cmd->conn->total_data_octets_rcvd -= scsi_get_resid(sc); ++ } else ++ sc->result = (DID_BAD_TARGET << 16) | resp_cqe->status; ++ } else if (resp_cqe->response_flags & ++ ISCSI_CMD_RESPONSE_RESIDUAL_OVERFLOW) { ++ scsi_set_resid(sc, resp_cqe->residual_count); ++ cmd->conn->total_data_octets_rcvd += scsi_get_resid(sc); ++ } ++ ++out: ++ return; ++ ++} ++ ++/** ++ * bnx2i_indicate_login_resp - process iscsi login response ++ * ++ * @conn: iscsi connection pointer ++ * ++ * pushes login response PDU to application daemon, 'iscsid' by ++ * calling iscsi_recv_pdu() ++ */ ++int bnx2i_indicate_login_resp(struct bnx2i_conn *conn) ++{ ++ int data_len; ++ struct iscsi_login_rsp *login_resp = ++ (struct iscsi_login_rsp *) &conn->gen_pdu.resp_hdr; ++ ++ /* check if this is the first login response for this connection. ++ * If yes, we need to copy initial StatSN to connection structure. ++ */ ++ if (conn->exp_statsn == STATSN_UPDATE_SIGNATURE) { ++ conn->exp_statsn = ntohl(login_resp->statsn) + 1; ++ } ++ ++ if (bnx2i_login_resp_update_cmdsn(conn)) ++ return -EINVAL; ++ ++ data_len = conn->gen_pdu.resp_wr_ptr - conn->gen_pdu.resp_buf; ++ iscsi_recv_pdu(conn->cls_conn, (struct iscsi_hdr *) login_resp, ++ (char *) conn->gen_pdu.resp_buf, data_len); ++ ++ return 0; ++} ++ ++ ++/** ++ * bnx2i_indicate_logout_resp - process iscsi logout response ++ * ++ * @conn: iscsi connection pointer ++ * ++ * pushes logout response PDU to application daemon, 'iscsid' by ++ * calling iscsi_recv_pdu() ++ */ ++int bnx2i_indicate_logout_resp(struct bnx2i_conn *conn) ++{ ++ struct iscsi_logout_rsp *logout_resp = ++ (struct iscsi_logout_rsp *) &conn->gen_pdu.resp_hdr; ++ ++ printk("%s: indicate logout resp, cid %d, cls_conn %p, logout_hdr %p\n", ++ __FUNCTION__, conn->ep->ep_iscsi_cid, conn->cls_conn, logout_resp); ++ iscsi_recv_pdu(conn->cls_conn, (struct iscsi_hdr *) logout_resp, ++ (char *) NULL, 0); ++ return 0; ++} ++ ++ ++/** ++ * bnx2i_indicate_async_mesg - process iscsi ASYNC message indication ++ * ++ * @conn: iscsi connection pointer ++ * ++ * pushes iSCSI async PDU to application daemon, 'iscsid' by calling ++ * iscsi_recv_pdu() ++ */ ++int bnx2i_indicate_async_mesg(struct bnx2i_conn *conn) ++{ ++ struct iscsi_async *async_msg = ++ (struct iscsi_async *) &conn->gen_pdu.async_hdr; ++ ++ printk("%s: indicating async message on cid %d\n", __FUNCTION__, conn->ep->ep_iscsi_cid); ++ ++ iscsi_recv_pdu(conn->cls_conn, (struct iscsi_hdr *) async_msg, ++ (char *) NULL, 0); ++ return 0; ++} ++ ++ ++ ++/** ++ * bnx2i_process_nopin - process iscsi nopin pdu ++ * ++ * @conn: iscsi connection pointer ++ * @cmd: iscsi cmd pointer ++ * @data_buf: payload buffer pointer ++ * @data_len: payload length ++ * ++ * pushes nopin pdu to application daemon, 'iscsid' by calling iscsi_recv_pdu ++ */ ++int bnx2i_process_nopin(struct bnx2i_conn *conn, struct bnx2i_cmd *cmd, ++ char *data_buf, int data_len) ++{ ++ struct iscsi_nopin *nopin_msg = ++ (struct iscsi_nopin *) &conn->gen_pdu.nopin_hdr; ++ ++ iscsi_recv_pdu(conn->cls_conn, (struct iscsi_hdr *) nopin_msg, ++ (char *) data_buf, data_len); ++ ++ conn->sess->last_noopin_indicated = jiffies; ++ conn->sess->noopin_indicated_count++; ++ ++ cmd->iscsi_opcode = 0; ++ return 0; ++} ++ ++ ++ ++/** ++ * bnx2i_iscsi_prep_generic_pdu_bd - prepares BD table to be used with ++ * generic iscsi pdus ++ * ++ * @conn: iscsi connection pointer ++ * ++ * Allocates buffers and BD tables before shipping requests to cnic ++ * for PDUs prepared by 'iscsid' daemon ++ */ ++static void bnx2i_iscsi_prep_generic_pdu_bd(struct bnx2i_conn *conn) ++{ ++ struct iscsi_bd *bd_tbl; ++ ++ bd_tbl = (struct iscsi_bd *) conn->gen_pdu.login_req.pgtbl; ++ ++ bd_tbl->buffer_addr_hi = ++ (u32) ((u64) conn->gen_pdu.login_req.mapping >> 32); ++ bd_tbl->buffer_addr_lo = (u32) conn->gen_pdu.login_req.mapping; ++ bd_tbl->buffer_length = conn->gen_pdu.req_wr_ptr - ++ conn->gen_pdu.req_buf; ++ bd_tbl->reserved0 = 0; ++ bd_tbl->flags = ISCSI_BD_LAST_IN_BD_CHAIN | ++ ISCSI_BD_FIRST_IN_BD_CHAIN; ++ ++ bd_tbl = (struct iscsi_bd *) conn->gen_pdu.login_resp.pgtbl; ++ bd_tbl->buffer_addr_hi = (u64) conn->gen_pdu.login_resp.mapping >> 32; ++ bd_tbl->buffer_addr_lo = (u32) conn->gen_pdu.login_resp.mapping; ++ bd_tbl->buffer_length = ISCSI_CONN_LOGIN_BUF_SIZE; ++ bd_tbl->reserved0 = 0; ++ bd_tbl->flags = ISCSI_BD_LAST_IN_BD_CHAIN | ++ ISCSI_BD_FIRST_IN_BD_CHAIN; ++} ++ ++ ++/** ++ * bnx2i_nopout_check_active_cmds - checks if iscsi link is idle ++ * ++ * @hba: pointer to adapter instance ++ * ++ * called to check if iscsi connection is idle or not. Pro-active nopout ++ * is sent only if the link is idle ++ */ ++static int bnx2i_nopout_check_active_cmds(struct bnx2i_conn *conn, ++ struct bnx2i_cmd *cmnd) ++{ ++ struct iscsi_nopin *nopin_msg = ++ (struct iscsi_nopin *) &conn->gen_pdu.resp_hdr; ++ ++ if ((conn->nopout_num_scsi_cmds == conn->num_scsi_cmd_pdus) && ++ !conn->sess->active_cmd_count) { ++ return -1; ++ } ++ ++ memset(nopin_msg, 0x00, sizeof(struct iscsi_nopin)); ++ nopin_msg->opcode = ISCSI_OP_NOOP_IN; ++ nopin_msg->flags = ISCSI_FLAG_CMD_FINAL; ++ memcpy(nopin_msg->lun, conn->gen_pdu.nopout_hdr.lun, 8); ++ nopin_msg->itt = conn->gen_pdu.nopout_hdr.itt; ++ nopin_msg->ttt = ISCSI_RESERVED_TAG; ++ nopin_msg->statsn = conn->gen_pdu.nopout_hdr.exp_statsn;; ++ nopin_msg->exp_cmdsn = htonl(conn->sess->exp_cmdsn); ++ nopin_msg->max_cmdsn = htonl(conn->sess->max_cmdsn); ++ ++ iscsi_recv_pdu(conn->cls_conn, (struct iscsi_hdr *) nopin_msg, ++ (char *) NULL, 0); ++ ++ conn->nopout_num_scsi_cmds = conn->num_scsi_cmd_pdus; ++ return 0; ++} ++ ++ ++/** ++ * bnx2i_iscsi_send_generic_request - called to send iscsi login/nopout/logout ++ * pdus ++ * ++ * @hba: pointer to adapter instance ++ * ++ * called to transmit PDUs prepared by the 'iscsid' daemon. iSCSI login, ++ * Nop-out and Logout requests flow through this path. ++ */ ++static int bnx2i_iscsi_send_generic_request(struct bnx2i_cmd *cmnd) ++{ ++ int rc = 0; ++ struct bnx2i_conn *conn = cmnd->conn; ++ ++ bnx2i_iscsi_prep_generic_pdu_bd(conn); ++ switch (cmnd->iscsi_opcode & ISCSI_OPCODE_MASK) { ++ case ISCSI_OP_LOGIN: ++ bnx2i_send_iscsi_login(conn, cmnd); ++ break; ++ ++ case ISCSI_OP_NOOP_OUT: ++ if (!bnx2i_nopout_when_cmds_active) ++ if (!bnx2i_nopout_check_active_cmds(conn, cmnd)) { ++ return 0; ++ } ++ ++ conn->nopout_num_scsi_cmds = conn->num_scsi_cmd_pdus; ++ rc = bnx2i_send_iscsi_nopout(conn, cmnd, NULL, 0); ++ break; ++ ++ case ISCSI_OP_LOGOUT: ++ rc = bnx2i_send_iscsi_logout(conn, cmnd); ++ break; ++ ++ default: ++ printk(KERN_ALERT "send_gen: unsupported op 0x%x\n", ++ cmnd->iscsi_opcode); ++ } ++ return rc; ++} ++ ++ ++/********************************************************************** ++ * SCSI-ML Interface ++ **********************************************************************/ ++ ++/** ++ * bnx2i_cpy_scsi_cdb - copies LUN & CDB fields in required format to sq wqe ++ * ++ * @sc: SCSI-ML command pointer ++ * @cmd: iscsi cmd pointer ++ * ++ */ ++static void bnx2i_cpy_scsi_cdb(struct scsi_cmnd *sc, ++ struct bnx2i_cmd *cmd) ++{ ++ u32 dword; ++ int lpcnt; ++ u8 *srcp; ++ u32 *dstp; ++ u32 scsi_lun[2]; ++ ++ int_to_scsilun(sc->device->lun, (struct scsi_lun *) scsi_lun); ++ cmd->req.lun[0] = ntohl(scsi_lun[0]); ++ cmd->req.lun[1] = ntohl(scsi_lun[1]); ++ ++ lpcnt = cmd->scsi_cmd->cmd_len / sizeof(dword); ++ srcp = (u8 *) sc->cmnd; ++ dstp = (u32 *) cmd->req.cdb; ++ while (lpcnt--) { ++ memcpy(&dword, (const void *) srcp, 4); ++ *dstp = cpu_to_be32(dword); ++ srcp += 4; ++ dstp++; ++ } ++ if (sc->cmd_len & 0x3) { ++ dword = (u32) srcp[0] | ((u32) srcp[1] << 8); ++ *dstp = cpu_to_be32(dword); ++ } ++} ++ ++ ++#ifdef __VMKLNX__ ++static int bnx2i_slave_configure(struct scsi_device *sdev) ++{ ++ return 0; ++} ++ ++static int bnx2i_slave_alloc(struct scsi_device *sdev) ++{ ++ struct iscsi_cls_session *cls_sess; ++ ++ cls_sess = vmk_iscsi_getSessionFromTarget(sdev->host->host_no, ++ sdev->channel, sdev->id); ++ if (!cls_sess) ++ return FAILED; ++ ++ sdev->hostdata = cls_sess->dd_data; ++ return 0; ++} ++ ++static int bnx2i_target_alloc(struct scsi_target *starget) ++{ ++ struct iscsi_cls_session *cls_sess; ++ struct Scsi_Host *shost = dev_to_shost(starget->dev.parent); ++ ++ cls_sess = vmk_iscsi_getSessionFromTarget(shost->host_no, ++ starget->channel, starget->id); ++ if (!cls_sess) ++ return FAILED; ++ ++ starget->hostdata = cls_sess->dd_data; ++ return 0; ++} ++ ++static void bnx2i_target_destroy(struct scsi_target *starget) ++{ ++ struct bnx2i_sess *sess = starget->hostdata; ++ ++ if (!sess) ++ return; ++ ++ if (sess->state == BNX2I_SESS_DESTROYED) ++ bnx2i_release_session_resc(sess->cls_sess); ++ else ++ sess->state = BNX2I_SESS_TARGET_DESTROYED; ++} ++#endif ++ ++ ++#define BNX2I_SERIAL_32 2147483648UL ++ ++static int iscsi_cmd_win_closed(struct bnx2i_sess *sess) ++{ ++ u32 cmdsn = sess->cmdsn; ++ u32 maxsn = sess->max_cmdsn; ++ ++ return ((cmdsn < maxsn && (maxsn - cmdsn > BNX2I_SERIAL_32)) || ++ (cmdsn > maxsn && (cmdsn - maxsn < BNX2I_SERIAL_32))); ++ ++} ++ ++ ++/** ++ * bnx2i_queuecommand - SCSI ML - bnx2i interface function to issue new commands ++* to be shipped to iscsi target ++ * ++ * @sc: SCSI-ML command pointer ++ * @done: callback function pointer to complete the task ++ * ++ * handles SCSI command queued by SCSI-ML, allocates a command structure, ++ * assigning CMDSN, mapping SG buffers and delivers it to CNIC for further ++ * processing. This routine also takes care of iSCSI command window full ++ * condition, if session is in recovery process and other error conditions ++ */ ++int bnx2i_queuecommand(struct scsi_cmnd *sc, ++ void (*done) (struct scsi_cmnd *)) ++{ ++ struct bnx2i_scsi_task *scsi_task; ++ unsigned long flags; ++ struct bnx2i_sess *sess; ++ struct bnx2i_conn *conn; ++#if !defined(__VMKLNX__) ++ struct Scsi_Host *shost; ++#endif ++ ++#ifdef __VMKLNX__ ++ if (sc->device && sc->device->hostdata) ++ sess = (struct bnx2i_sess *)sc->device->hostdata; ++ else ++ goto dev_not_found; ++#else ++ sess = iscsi_hostdata(sc->device->host->hostdata); ++#endif ++ sc->scsi_done = done; ++ sc->result = 0; ++ ++ if (!sess) ++ goto dev_not_found; ++ ++#ifdef __VMKLNX__ ++ if (sess->state == BNX2I_SESS_DESTROYED) ++ goto dev_offline; ++#endif ++ if (sess->state == BNX2I_SESS_IN_SHUTDOWN || ++ sess->state == BNX2I_SESS_IN_LOGOUT || !sess->lead_conn) ++#ifdef __VMKLNX__ ++ /* delay offline indication till session is destroyed */ ++ goto cmd_not_accepted; ++#else ++ goto dev_not_found; ++#endif ++ ++ if (sess->recovery_state) { ++ if (sess->recovery_state & ISCSI_SESS_RECOVERY_FAILED) ++ goto dev_not_found; ++ else if (sess->recovery_state & ISCSI_SESS_RECOVERY_COMPLETE) ++ sess->recovery_state = 0; ++ } ++ ++ conn = sess->lead_conn; ++ /* Is connection stopped because of nopout timeout?. Don't accept scsi_cmds ++ * if connection is in stopped state because we don't know if it's going ++ * come online or taken offline after session recovery timeout */ ++ if (!atomic_read(&conn->worker_enabled)) ++ goto cmd_not_accepted; ++ ++conn->que_jiff = jiffies; ++ spin_lock_irqsave(&sess->lock, flags); ++ scsi_task = bnx2i_alloc_scsi_task(sess); ++ if (!scsi_task) { ++ spin_unlock_irqrestore(&sess->lock, flags); ++ goto cmd_not_accepted; ++ } ++ ++ scsi_task->scsi_cmd = sc; ++ list_add_tail(&scsi_task->link, &sess->pend_cmd_list); ++ sess->pend_cmd_count++; ++ spin_unlock_irqrestore(&sess->lock, flags); ++ ++ if (atomic_read(&conn->worker_enabled)) { ++#ifdef __VMKLNX__ ++ tasklet_schedule(&conn->conn_tasklet); ++#else ++ shost = bnx2i_conn_get_shost(conn); ++ scsi_queue_work(shost, &conn->conn_worker); ++#endif /* __VMKLNX__ */ ++ } ++ return 0; ++ ++cmd_not_accepted: ++ return SCSI_MLQUEUE_HOST_BUSY; ++ ++#ifdef __VMKLNX__ ++dev_offline: ++#endif ++dev_not_found: ++ sc->result = (DID_NO_CONNECT << 16); ++ scsi_set_resid(sc, scsi_bufflen(sc)); ++ sc->scsi_done(sc); ++ return 0; ++} ++ ++static void bnx2i_conn_poll(unsigned long data) ++{ ++ struct bnx2i_conn *conn = (struct bnx2i_conn *) data; ++ static int num_sched = 0; ++ static int timer_callback = 0; ++#if !defined(__VMKLNX__) ++ struct Scsi_Host *shost; ++#endif ++ ++ timer_callback++; ++ if (!(timer_callback++ % 100)) { ++ printk("bnx2i: cid %d, poll timer callback %d\n", conn->ep->ep_iscsi_cid, num_sched); ++ printk("\t bnx2i: cid %d tasklet stats :: disabled %d, enabled %d \n", ++ conn->ep->ep_iscsi_cid, ++ atomic_read(&conn->worker_enabled_cnt), atomic_read(&conn->worker_disabled_cnt)); ++ } ++ ++ if (!atomic_read(&conn->worker_enabled)) ++ goto exit; ++ if (bnx2i_cqe_work_pending(conn) || ++ !list_empty(&conn->sess->pend_cmd_list)) { ++#ifdef __VMKLNX__ ++ tasklet_schedule(&conn->conn_tasklet); ++ if (!(num_sched++ % 10)) { ++ printk("bnx2i: cid %d, scheduled tasklet %d\n", ++ conn->ep->ep_iscsi_cid, num_sched); ++ } ++#else ++ shost = bnx2i_conn_get_shost(conn); ++ scsi_queue_work(shost, &conn->conn_worker); ++#endif ++ } ++exit: ++ conn->poll_timer.expires = 50 + jiffies; /* 500 msec */ ++ add_timer(&conn->poll_timer); ++} ++ ++ ++struct bnx2i_scsi_task *bnx2i_scsi_cmd_in_pend_list(struct bnx2i_sess *sess, ++ struct scsi_cmnd *sc) ++{ ++ struct bnx2i_scsi_task *scsi_task; ++ struct list_head *list; ++ struct list_head *tmp; ++ ++ list_for_each_safe(list, tmp, &sess->pend_cmd_list) { ++ scsi_task = (struct bnx2i_scsi_task *) list; ++ if (scsi_task->scsi_cmd == sc) ++ return scsi_task; ++ } ++ return NULL; ++} ++ ++/** ++ * bnx2i_send_tmf_wait_cmpl - executes scsi command abort process ++ * ++ * @sc: SCSI-ML command pointer ++ * ++ * initiate command abort process by requesting CNIC to send ++ * an iSCSI TMF request to target ++ */ ++static int bnx2i_send_tmf_wait_cmpl(struct bnx2i_sess *sess) ++{ ++ int rc; ++ struct bnx2i_cmd *tmf_cmd = sess->scsi_tmf_cmd; ++ struct bnx2i_conn *conn = sess->lead_conn; ++#ifndef __VMKLNX__ ++ struct Scsi_Host *shost = bnx2i_conn_get_shost(conn); ++#endif ++ ++ tmf_cmd->tmf_response = ISCSI_TMF_RSP_REJECTED; ++ ++ /* Schedule the tasklet to send out the TMF pdu */ ++ atomic_set(&sess->tmf_pending, 1); ++ if (atomic_read(&conn->worker_enabled)) { ++#ifdef __VMKLNX__ ++ printk("bnx2i: scheduling TMF for cid %d\n", conn->ep->ep_iscsi_cid); ++ tasklet_schedule(&conn->conn_tasklet); ++#else ++ scsi_queue_work(shost, &conn->conn_worker); ++#endif ++ } ++ ++#define BNX2I_TMF_TIMEOUT 10 * HZ ++ /* Now we wait here */ ++ rc = wait_event_timeout(sess->er_wait, ++ (!conn->ep || ++ (atomic_read(&tmf_cmd->cmd_state) != ++ ISCSI_CMD_STATE_INITIATED)), ++ BNX2I_TMF_TIMEOUT); ++ ++ ++ /* make sure TCP connection did not have TCP events and only ++ * then enable tasklet. If we received TCP RST/FIN, keep tasklet ++ * disabled and let iscsid force the cleanup through ++ * conn_stop() --> ep_disconnect() and ep_connect() --> conn_bind() ++ */ ++ if (!atomic_read(&conn->worker_enabled) && ++ bnx2i_tcp_conn_active(conn)) { ++#ifdef __VMKLNX__ ++ printk("bnx2i: enable tasklet, cid %d\n", conn->ep->ep_iscsi_cid); ++ tasklet_enable(&conn->conn_tasklet); ++ barrier(); ++#endif ++ atomic_inc(&conn->worker_enabled_cnt); ++ atomic_set(&conn->worker_enabled, 1); ++ } ++ barrier(); ++#ifdef __VMKLNX__ ++ /** Make sure we schedulke the tasklet again */ ++ tasklet_schedule(&conn->conn_tasklet); ++#else ++ scsi_queue_work(shost, &conn->conn_worker); ++#endif ++ ++ if (!rc) { ++ atomic_set(&tmf_cmd->cmd_state, ISCSI_CMD_STATE_TMF_TIMEOUT); ++ sess->recovery_state = ISCSI_SESS_RECOVERY_OPEN_ISCSI; ++ iscsi_conn_error(conn->cls_conn, ISCSI_ERR_CONN_FAILED); ++ /* set conn->stop_state to non-zero so that further TMF will not ++ * be allowed to seek in, this halt is only required untill ++ * 'vmkiscsid' issues conn_stop() ++ */ ++ atomic_set(&conn->stop_state, 0xFF); ++ atomic_set(&sess->tmf_pending, 0); ++ atomic_set(&sess->tmf_active, 0); ++ return -1; ++ } ++ ++ if (signal_pending(current)) ++ flush_signals(current); ++ ++ if (atomic_read(&sess->tmf_pending)) ++ printk("%s:: WaTcH: is tmf still pending \n", __FUNCTION__); ++ ++ if (atomic_read(&tmf_cmd->cmd_state) == ISCSI_CMD_STATE_TMF_TIMEOUT || ++ (tmf_cmd->tmf_response != ISCSI_TMF_RSP_COMPLETE && ++ tmf_cmd->tmf_response != ISCSI_TMF_RSP_NO_TASK)) { ++ printk(KERN_ALERT "%s: WaTcH: tmf failed, cmd 0x%p\n", ++ __FUNCTION__, tmf_cmd); ++ /* TMF timed out, return error status and let SCSI-ML do ++ * session recovery. ++ */ ++ atomic_set(&sess->tmf_pending, 0); ++ atomic_set(&sess->tmf_active, 0); ++ return -1; ++ } ++ return 0; ++} ++ ++static void bnx2i_cleanup_task_context(struct bnx2i_sess *sess, ++ struct bnx2i_cmd *cmd, ++ int reason, int clear_ctx) ++{ ++ unsigned long flags; ++ ++ if (!cmd->scsi_cmd) ++ return; ++ ++ /* ABORT_TASK/LUN_RESET - cleanup on chip task context */ ++ if (clear_ctx) { ++ atomic_set(&cmd->cmd_state, ISCSI_CMD_STATE_CLEANUP_PEND); ++ ++ printk(KERN_ALERT "bnx2i: post task clean-up req to FW\n"); ++ bnx2i_send_cmd_cleanup_req(sess->hba, cmd); ++ wait_event_interruptible_timeout(sess->er_wait, ++ (atomic_read(&cmd->cmd_state) ++ == ++ ISCSI_CMD_STATE_CLEANUP_CMPL), ++ msecs_to_jiffies( ++ ISCSI_CMD_CLEANUP_TIMEOUT)); ++ if (signal_pending(current)) ++ flush_signals(current); ++ ++ if (atomic_read(&cmd->cmd_state) != ++ ISCSI_CMD_STATE_CLEANUP_CMPL) ++ printk(KERN_ALERT "bnx2i: WaTcH: task context clean-up" ++ " timed out\n"); ++ } ++ ++ cmd->req.itt &= ISCSI_CMD_RESPONSE_INDEX; ++ ++ bnx2i_iscsi_unmap_sg_list(sess->hba, cmd); ++ atomic_set(&cmd->cmd_state, ISCSI_CMD_STATE_COMPLETED); ++ ++ printk(KERN_ALERT "%s: failed scsi_cmd %p\n", __FUNCTION__, cmd->scsi_cmd); ++ if (cmd->scsi_cmd) ++ bnx2i_return_failed_command(sess, cmd->scsi_cmd, ++ scsi_bufflen(cmd->scsi_cmd), reason); ++ ++ printk(KERN_ALERT "bnx2i: free cmd %p, active cmds %d\n", ++ cmd, sess->active_cmd_count); ++ spin_lock_irqsave(&sess->lock, flags); ++ sess->active_cmd_count--; ++ cmd->scsi_cmd = NULL; ++ bnx2i_free_cmd(sess, cmd); ++ spin_unlock_irqrestore(&sess->lock, flags); ++} ++ ++/** ++ * bnx2i_initiate_target_reset- executes scsi command target reset ++ * ++ * @sc: SCSI-ML command pointer ++ * ++ * initiate command abort process by requesting CNIC to send ++ * an iSCSI TMF request to target ++ */ ++static int bnx2i_initiate_target_reset(struct bnx2i_sess *sess) ++{ ++ struct bnx2i_cmd *tmf_cmd; ++ struct bnx2i_hba *hba; ++ ++ hba = sess->hba; ++ tmf_cmd = sess->scsi_tmf_cmd; ++ atomic_set(&sess->tmf_active, 1); ++ tmf_cmd->conn = sess->lead_conn; ++ tmf_cmd->scsi_cmd = NULL; ++ tmf_cmd->iscsi_opcode = ISCSI_OP_SCSI_TMFUNC | ISCSI_OP_IMMEDIATE; ++ tmf_cmd->tmf_func = ISCSI_TM_FUNC_TARGET_WARM_RESET; ++ tmf_cmd->tmf_lun = 0; ++ tmf_cmd->tmf_ref_itt = ISCSI_RESERVED_TAG; ++ tmf_cmd->tmf_ref_cmd = NULL; ++ tmf_cmd->tmf_ref_sc = NULL; ++ atomic_set(&tmf_cmd->cmd_state, ISCSI_CMD_STATE_INITIATED); ++ ++ printk("%s: sess %p, conn %p\n", __FUNCTION__, sess, sess->lead_conn); ++ return 0; ++} ++ ++ ++/** ++ * bnx2i_initiate_lun_reset- executes scsi command abort process ++ * ++ * @sc: SCSI-ML command pointer ++ * ++ * initiate command abort process by requesting CNIC to send ++ * an iSCSI TMF request to target ++ */ ++static int bnx2i_initiate_lun_reset(struct bnx2i_sess *sess, struct scsi_cmnd *sc) ++{ ++ struct bnx2i_cmd *tmf_cmd; ++ struct bnx2i_conn *conn; ++ struct bnx2i_hba *hba; ++ ++ hba = sess->hba; ++ tmf_cmd = sess->scsi_tmf_cmd; ++ atomic_set(&sess->tmf_active, 1); ++ tmf_cmd->conn = conn = sess->lead_conn; ++ tmf_cmd->scsi_cmd = NULL; ++ tmf_cmd->iscsi_opcode = ISCSI_OP_SCSI_TMFUNC | ISCSI_OP_IMMEDIATE; ++ tmf_cmd->tmf_func = ISCSI_TM_FUNC_LOGICAL_UNIT_RESET; ++ tmf_cmd->tmf_lun = sc->device->lun; ++ tmf_cmd->tmf_ref_itt = ISCSI_RESERVED_TAG; ++ tmf_cmd->tmf_ref_cmd = NULL; ++ tmf_cmd->tmf_ref_sc = NULL; ++ atomic_set(&tmf_cmd->cmd_state, ISCSI_CMD_STATE_INITIATED); ++ ++ return 0; ++} ++ ++/** ++ * bnx2i_initiate_abort_cmd - executes scsi command abort process ++ * ++ * @sc: SCSI-ML command pointer ++ * ++ * initiate command abort process by requesting CNIC to send ++ * an iSCSI TMF request to target ++ */ ++static int bnx2i_initiate_abort_cmd(struct bnx2i_sess *sess, struct scsi_cmnd *sc, ++ struct bnx2i_cmd **aborted_cmd) ++{ ++ struct bnx2i_scsi_task *scsi_task; ++ struct bnx2i_cmd *cmd; ++ struct bnx2i_cmd *tmf_cmd; ++ struct bnx2i_conn *conn; ++ struct bnx2i_hba *hba; ++ unsigned int flags; ++ ++ *aborted_cmd = NULL; ++ hba = sess->hba; ++ /* Check if scsi_cmd is sitting in sess->pend_cmd_list */ ++ spin_lock_irqsave(&sess->lock, flags); ++ scsi_task = bnx2i_scsi_cmd_in_pend_list(sess, sc); ++ if (scsi_task) { ++ sc->result = (DID_ABORT << 16); ++ list_del_init(&scsi_task->link); ++ bnx2i_free_scsi_task(sess, scsi_task); ++ spin_unlock_irqrestore(&sess->lock, flags); ++ bnx2i_return_failed_command(sess, sc, ++ scsi_bufflen(sc), DID_ABORT); ++ return 0; ++ } ++ spin_unlock_irqrestore(&sess->lock, flags); ++ ++ cmd = (struct bnx2i_cmd *) sc->SCp.ptr; ++ ++ if (!cmd || !cmd->scsi_cmd || cmd->scsi_cmd != sc) { ++ /* command already completed to scsi mid-layer */ ++ printk("%s: WaTcH: sc %p on lun %x, already completed\n", ++ __FUNCTION__, sc, sc->device->lun); ++ return -ENOENT; ++ } ++ ++ *aborted_cmd = cmd; ++ tmf_cmd = sess->scsi_tmf_cmd; ++ *aborted_cmd = cmd; ++ atomic_set(&cmd->cmd_state, ISCSI_CMD_STATE_ABORT_PEND); ++ atomic_set(&tmf_cmd->cmd_state, ISCSI_CMD_STATE_INITIATED); ++ tmf_cmd = sess->scsi_tmf_cmd; ++ tmf_cmd->conn = conn = sess->lead_conn; ++ tmf_cmd->scsi_cmd = NULL; ++ tmf_cmd->iscsi_opcode = ISCSI_OP_SCSI_TMFUNC | ISCSI_OP_IMMEDIATE; ++ tmf_cmd->tmf_func = ISCSI_TM_FUNC_ABORT_TASK; ++ tmf_cmd->tmf_lun = sc->device->lun; ++ tmf_cmd->tmf_ref_itt = cmd->req.itt; ++ tmf_cmd->tmf_ref_cmd = cmd; ++ tmf_cmd->tmf_ref_sc = cmd->scsi_cmd; ++ printk("%s [ %lx ] : aborting active cmd sc %p, lun %x" ++ " ref_cmd %p, ref_scsi_cmd %p \n", __FUNCTION__, ++ jiffies, sc, sc->device->lun, tmf_cmd->tmf_ref_cmd, ++ tmf_cmd->tmf_ref_sc); ++ ++ return -EINPROGRESS; ++} ++ ++ ++/** ++ * bnx2i_execute_tmf_cmd - executes scsi tmf ++ * ++ * @sc: SCSI-ML command pointer ++ * ++ * initiate scsi tmf, support ABORT_TASK and LUN_RESET ++ */ ++static int bnx2i_execute_tmf_cmd(struct scsi_cmnd *sc, int tmf_func) ++{ ++ struct bnx2i_cmd *cmd = NULL; ++#ifndef __VMKLNX__ ++ struct Scsi_Host *shost; ++#endif ++ struct bnx2i_sess *sess = NULL; ++ struct bnx2i_conn *conn = NULL; ++ int rc; ++ ++ printk("%s: start, sc %p\n", __FUNCTION__, sc); ++ ++#ifdef __VMKLNX__ ++ if (sc->device && sc->device->hostdata) ++ sess = (struct bnx2i_sess *)sc->device->hostdata; ++#else ++ shost = sc->device->host; ++ sess = iscsi_hostdata(shost->hostdata); ++ BUG_ON(shost != sess->shost); ++#endif ++ ++ conn = sess->lead_conn; ++ if (sess->active_cmd_count) { ++ printk("%s: sess %p, conn %p, cid %d\n", ++ __FUNCTION__, sess, sess->lead_conn, conn->ep->ep_iscsi_cid); ++ printk("bnx2i: pend_cnt %d, active_cnt %d\n", ++ sess->pend_cmd_count, sess->active_cmd_count); ++ printk("bnx2i: state %d, FZ %d, TMFE %d, TSE %d, RSCH %d, ENTRY %d\n", ++ conn->tasklet_state, conn->tasklet_freeze, ++ conn->tasklet_tmf_exit, conn->tasklet_timeslice_exit, ++ conn->tasklet_reschedule, conn->tasklet_entry); ++ printk("bnx2i: cqe_state %d, cqe_jiff %lx, cqe_loop %x\n", ++ conn->cqe_process_state, conn->cqe_process_jiffies, conn->tasklet_loop); ++ printk("bnx2i: que_jif %lx, cqe_jiff %lx, task_jif %lx\n", ++ conn->que_jiff, conn->cqe_jiff, conn->task_jiff); ++ } ++ ++ mutex_lock(&sess->tmf_mutex); ++ if (!sess || atomic_read(&sess->lead_conn->stop_state)) { ++ mutex_unlock(&sess->tmf_mutex); ++ return FAILED; ++ } ++ ++ if (!is_sess_active(sess) || ++ test_bit(ADAPTER_STATE_GOING_DOWN, &sess->hba->adapter_state) || ++ test_bit(ADAPTER_STATE_LINK_DOWN, &sess->hba->adapter_state)) { ++ mutex_unlock(&sess->tmf_mutex); ++ return FAILED; ++ } ++ ++ atomic_set(&sess->tmf_active, 1); ++ if (tmf_func == ISCSI_TM_FUNC_ABORT_TASK) { ++ printk("%s [ %lx ] : TMF REQ, sc %p, lun %x\n", __FUNCTION__, jiffies, sc, sc->device->lun); ++ rc = bnx2i_initiate_abort_cmd(sess, sc, &cmd); ++ if (rc == 0) { ++ /* cmd failed from pending queue */ ++ rc = SUCCESS; ++ goto done; ++ } else if (rc == -ENOENT) { ++ /* cmd not active */ ++ rc = FAILED; ++ goto done; ++ } ++ } else if (tmf_func == ISCSI_TM_FUNC_LOGICAL_UNIT_RESET) { ++ bnx2i_initiate_lun_reset(sess, sc); ++ } else if (tmf_func == ISCSI_TM_FUNC_TARGET_WARM_RESET) { ++ printk("%s: tmf TGT_RESET, sess %p\n", __FUNCTION__, sess); ++ bnx2i_initiate_target_reset(sess); ++ } else { ++ printk(KERN_ALERT "bnx2i: unknown Task Mgmt Command %x\n", ++ tmf_func); ++ rc = FAILED; ++ goto done; ++ } ++ ++ printk("%s: tmf wait......., sess %p\n", __FUNCTION__, sess); ++ if (bnx2i_send_tmf_wait_cmpl(sess)) { ++ /* TMF request timeout */ ++ rc = FAILED; ++ goto done; ++ } ++ ++ if (sess->scsi_tmf_cmd->tmf_response == ISCSI_TMF_RSP_COMPLETE) { ++ if (tmf_func == ISCSI_TM_FUNC_ABORT_TASK) { ++ /* no need to check for ISCSI_CMD_STATE_CMPL_RCVD ++ * because completion thread won't process completion ++ * if state is set to ISCSI_CMD_STATE_ABORT_PEND ++ */ ++ bnx2i_cleanup_task_context(sess, cmd, DID_ABORT, 1); ++ } else if (tmf_func == ISCSI_TM_FUNC_LOGICAL_UNIT_RESET) ++ bnx2i_flush_cmd_queue(sess, sc, DID_RESET, 1); ++ else if (tmf_func == ISCSI_TM_FUNC_TARGET_WARM_RESET) ++ bnx2i_flush_cmd_queue(sess, NULL, DID_RESET, 1); ++ } else if (sess->scsi_tmf_cmd->tmf_response != ISCSI_TMF_RSP_NO_TASK) ++ rc = FAILED; ++ ++done: ++ atomic_set(&sess->tmf_active, 0); ++ mutex_unlock(&sess->tmf_mutex); ++ ++ /* resched the tasklet in case it got stopped due to tmf_active */ ++ if (sess->lead_conn && atomic_read(&sess->lead_conn->worker_enabled)) { ++ printk("%s: tasklet scheduled, conn cid %d\n", ++ __FUNCTION__, sess->lead_conn->ep->ep_iscsi_cid); ++#ifdef __VMKLNX__ ++ tasklet_schedule(&sess->lead_conn->conn_tasklet); ++#else ++ scsi_queue_work(shost, &conn->conn_worker); ++#endif ++ } ++ return rc; ++} ++ ++static void bnx2i_wait_for_tmf_completion(struct bnx2i_sess *sess) ++{ ++ int lpcnt = 20; ++ ++ while (lpcnt-- && atomic_read(&sess->tmf_active)) ++ msleep(1000); ++} ++ ++/** ++ * bnx2i_abort - 'eh_abort_handler' api function to abort an oustanding ++ * scsi command ++ * ++ * @sc: SCSI-ML command pointer ++ * ++ * SCSI abort request handler. ++ */ ++int bnx2i_abort(struct scsi_cmnd *sc) ++{ ++ int reason; ++ struct bnx2i_cmd *cmd = (struct bnx2i_cmd *) sc->SCp.ptr; ++ ++ if (unlikely(!cmd)) { ++ /* command already completed to scsi mid-layer */ ++ printk(KERN_INFO "bnx2i_abort: sc 0x%p, lun %d is not active\n", ++ sc, sc->device->lun); ++ return FAILED; ++ } ++ ++ if ((atomic_read(&cmd->cmd_state) != ISCSI_CMD_STATE_INITIATED) || ++ !cmd->conn->ep) ++ return FAILED; ++ ++ printk("%s [ %lx ] : ABORT CMD request, sc %p, lun %x\n", ++ __FUNCTION__, jiffies, sc, sc->device->lun); ++ ++ reason = bnx2i_execute_tmf_cmd(sc, ISCSI_TM_FUNC_ABORT_TASK); ++ return reason; ++} ++ ++ ++ ++/** ++ * bnx2i_return_failed_command - return failed command back to SCSI-ML ++ * ++ * @sess: iscsi session pointer ++ * @cmd: iscsi cmd pointer ++ * @reason: SCSI-ML error code, DID_ABORT, DID_BUS_BUSY ++ * ++ * completes scsi command with appropriate error code to SCSI-ML ++ */ ++void bnx2i_return_failed_command(struct bnx2i_sess *sess, struct scsi_cmnd *sc, ++ int resid, int reason) ++{ ++ sc->result = reason << 16; ++ scsi_set_resid(sc, resid); ++ sc->SCp.ptr = NULL; ++ sc->scsi_done(sc); ++} ++ ++ ++#ifdef __VMKLNX__ ++/** ++ * bnx2i_host_reset - 'eh_host_reset_handler' entry point ++ * ++ * @sc: SCSI-ML command pointer ++ * ++ * SCSI host reset handler - Do iSCSI session recovery on all active sessions ++ */ ++int bnx2i_host_reset(struct scsi_cmnd *sc) ++{ ++ struct Scsi_Host *shost; ++ struct bnx2i_sess *sess; ++ struct bnx2i_conn *conn; ++ struct bnx2i_hba *hba; ++ int i = 0; ++ ++ shost = sc->device->host; ++ sess = (struct bnx2i_sess *)sc->device->hostdata; ++ hba = sess->hba; ++ ++ printk(KERN_INFO "bnx2i: reseting host %d\n", shost->host_no); ++ ++ for (i = 0; i < hba->max_active_conns; i++) { ++ conn = bnx2i_get_conn_from_id(hba, i); ++ if (!conn) continue; ++ ++ printk(KERN_INFO "bnx2i: reseting sess %d\n", conn->ep->ep_iscsi_cid); ++ bnx2i_do_iscsi_sess_recovery(conn->sess, DID_RESET); ++ } ++ return 0; ++} ++ ++ ++/** ++ * bnx2i_device_reset - 'eh_device_reset_handler' entry point ++ * ++ * @sc: SCSI-ML command pointer ++ * ++ * SCSI host reset handler - iSCSI session recovery ++ */ ++int bnx2i_device_reset (struct scsi_cmnd *sc) ++{ ++ struct bnx2i_sess *sess; ++ int rc = 0; ++ ++ sess = (struct bnx2i_sess *)sc->device->hostdata; ++ if (!sess || !sess->lead_conn || !sess->lead_conn->ep || ++ atomic_read(&sess->lead_conn->stop_state)) ++ return FAILED; ++ ++ printk(KERN_INFO "bnx2i: device reset, iscsi cid %d, lun %x\n", ++ sess->lead_conn->ep->ep_iscsi_cid, sc->device->lun); ++ ++ if (sc->vmkflags & VMK_FLAGS_USE_LUNRESET) { ++ /* LUN reset */ ++ printk("%s : LUN RESET request, sc %p\n", __FUNCTION__, sc); ++ rc = bnx2i_execute_tmf_cmd(sc, ISCSI_TM_FUNC_LOGICAL_UNIT_RESET); ++ } else { ++ /* TARGET reset */ ++ printk("%s : Target Reset Request, sc %p, lun %x, sess %p\n", ++ __FUNCTION__, sc, sc->device->lun, sess); ++ rc = bnx2i_execute_tmf_cmd(sc, ISCSI_TM_FUNC_TARGET_WARM_RESET); ++ } ++ return rc; ++} ++ ++#else ++/** ++ * bnx2i_host_reset - 'eh_host_reset_handler' entry point ++ * ++ * @sc: SCSI-ML command pointer ++ * ++ * SCSI host reset handler - iSCSI session recovery ++ */ ++int bnx2i_host_reset(struct scsi_cmnd *sc) ++{ ++ struct Scsi_Host *shost; ++ struct bnx2i_sess *sess; ++ int rc = 0; ++ ++ shost = sc->device->host; ++ sess = iscsi_hostdata(shost->hostdata); ++ printk(KERN_INFO "bnx2i: attempting to reset host, #%d\n", ++ sess->shost->host_no); ++ ++ BUG_ON(shost != sess->shost); ++ rc = bnx2i_do_iscsi_sess_recovery(sess, DID_RESET); ++ ++ bnx2i_flush_cmd_queue(sess, NULL, DID_RESET, 0); ++ ++ return rc; ++} ++#endif ++ ++int bnx2i_cqe_work_pending(struct bnx2i_conn *conn) ++{ ++ struct qp_info *qp; ++ volatile struct iscsi_nop_in_msg *nopin; ++ int exp_seq_no; ++ ++ qp = &conn->ep->qp; ++ nopin = (struct iscsi_nop_in_msg *)qp->cq_cons_qe; ++ ++ exp_seq_no = conn->ep->qp.cqe_exp_seq_sn; ++ if (exp_seq_no > qp->cqe_size * 2) ++ exp_seq_no -= qp->cqe_size * 2; ++ ++ if (nopin->cq_req_sn == exp_seq_no) { ++ return 1; ++ } else ++ return 0; ++} ++ ++ ++ ++static void bnx2i_process_control_pdu(struct bnx2i_sess *sess) ++{ ++ unsigned int flags; ++ ++ spin_lock_irqsave(&sess->lock, flags); ++ if (atomic_read(&sess->tmf_pending)) { ++ printk("bnx2i: tmf is pending on cid %x\n", sess->lead_conn->ep->ep_iscsi_cid); ++ bnx2i_send_iscsi_tmf(sess->lead_conn, sess->scsi_tmf_cmd); ++ atomic_set(&sess->tmf_pending, 0); ++ } ++ if (atomic_read(&sess->nop_resp_pending)) { ++ printk("bnx2i: noop response pending on cid %x\n", sess->lead_conn->ep->ep_iscsi_cid); ++ bnx2i_iscsi_send_generic_request(sess->nopout_resp_cmd); ++ atomic_set(&sess->nop_resp_pending, 0); ++ } ++ if (atomic_read(&sess->login_noop_pending)) { ++ printk("bnx2i: login/unsolicited noop pending on cid %x\n", sess->lead_conn->ep->ep_iscsi_cid); ++ bnx2i_iscsi_send_generic_request(sess->login_nopout_cmd); ++ atomic_set(&sess->login_noop_pending, 0); ++ } ++ /* flush pending SCSI cmds before transmitting logout request */ ++ if (atomic_read(&sess->logout_pending) && ++ list_empty(&sess->pend_cmd_list)) { ++ printk("bnx2i: logout pending on cid %x\n", sess->lead_conn->ep->ep_iscsi_cid); ++ bnx2i_iscsi_send_generic_request(sess->login_nopout_cmd); ++ atomic_set(&sess->logout_pending, 0); ++ } ++ spin_unlock_irqrestore(&sess->lock, flags); ++} ++ ++static int bnx2i_conn_transmits_pending(struct bnx2i_conn *conn) ++{ ++ struct bnx2i_sess *sess = conn->sess; ++ ++ /* If TCP connection is not active or in FFP (connection parameters updated) ++ * then do not transmit anything ++ */ ++ if (conn->ep && !(conn->ep->state & (EP_STATE_ULP_UPDATE_COMPL | ++ EP_STATE_CONNECT_COMPL))) ++ return 0; ++ ++ if ((sess->recovery_state && ++ sess->recovery_state != ISCSI_SESS_RECOVERY_COMPLETE) || ++ test_bit(ADAPTER_STATE_LINK_DOWN, &sess->hba->adapter_state) || ++ list_empty(&sess->pend_cmd_list)) ++ return 0; ++ ++ return 8; ++} ++ ++static int bnx2i_process_pend_queue(struct bnx2i_sess *sess) ++{ ++ struct bnx2i_cmd *cmd; ++ struct bnx2i_conn *conn; ++ struct bnx2i_scsi_task *scsi_task; ++ struct list_head *list; ++ struct list_head *tmp; ++ unsigned int flags; ++ int xmits_per_work; ++ int cmds_sent = 0; ++ int rc = 0; ++ ++ xmits_per_work = bnx2i_conn_transmits_pending(sess->lead_conn); ++ if (!xmits_per_work) ++ return -EAGAIN; ++ ++ if (use_poll_timer) ++ xmits_per_work = sess->sq_size; /* flush all commands in pending Q */ ++ ++ conn = sess->lead_conn; ++ spin_lock_irqsave(&sess->lock, flags); ++ list_for_each_safe(list, tmp, &sess->pend_cmd_list) { ++ /* do not post any SCSI CMDS while TMF is active */ ++ if (iscsi_cmd_win_closed(sess)) { ++ rc = -EAGAIN; ++ break; ++ } ++ ++ if (conn->ep && ((conn->ep->state == EP_STATE_TCP_FIN_RCVD) || ++ (conn->ep->state == EP_STATE_TCP_RST_RCVD))) { ++ rc = -EAGAIN; ++ break; ++ } ++ ++ scsi_task = (struct bnx2i_scsi_task *) list; ++ cmd = bnx2i_alloc_cmd(sess); ++ if (cmd == NULL) { ++ rc = -ENOSPC; ++ break; ++ } ++ ++ cmd->scsi_cmd = scsi_task->scsi_cmd; ++ sess->pend_cmd_count--; ++ list_del_init(&scsi_task->link); ++ list_add_tail(&scsi_task->link, &sess->scsi_task_list); ++ ++ cmd->conn = sess->lead_conn; ++ bnx2i_xmit_work_send_cmd(sess->lead_conn, cmd); ++ cmds_sent++; ++ if (cmds_sent >= xmits_per_work) ++ break; ++ } ++ spin_unlock_irqrestore(&sess->lock, flags); ++ ++ return rc; ++} ++ ++ ++#ifdef __VMKLNX__ ++static void bnx2i_conn_main_worker(unsigned long data) ++#else ++static void ++#if defined(INIT_DELAYED_WORK_DEFERRABLE) || defined(INIT_WORK_NAR) ++bnx2i_conn_main_worker(struct work_struct *work) ++#else ++bnx2i_conn_main_worker(void *data) ++#endif /* INIT_DELAYED_WORK_DEFERRABLE && INIT_WORK_NAR */ ++#endif /* __VMKLNX__*/ ++{ ++ unsigned long flags; ++ struct bnx2i_sess *sess; ++ int cqe_pending; ++ int defer_pendq; ++#ifndef __VMKLNX__ ++ struct Scsi_Host *shost; ++#if defined(INIT_DELAYED_WORK_DEFERRABLE) || defined(INIT_WORK_NAR) ++ struct bnx2i_conn *conn = ++ container_of(work, struct bnx2i_conn, conn_worker); ++#else ++ struct bnx2i_conn *conn = (struct bnx2i_conn *)data; ++#endif ++#else /* __VMKLNX__ */ ++ struct bnx2i_conn *conn = (struct bnx2i_conn *)data; ++#endif ++ ++ conn->tasklet_entry++; ++ ++ sess = conn->sess; ++ spin_lock_irqsave(&sess->lock, flags); ++ if (atomic_read(&conn->worker_running)) { ++ spin_unlock_irqrestore(&sess->lock, flags); ++ return; ++ } ++ atomic_set(&conn->worker_running, 1); ++ spin_unlock_irqrestore(&sess->lock, flags); ++ ++ ++ /* Need to make the conn->worker_running visible to other threads ++ * running on different cpus. Without this barrier is a tiny window ++ * both threads might run simultaneously ++ */ ++ smp_mb(); ++ sess->timestamp = jiffies; ++ conn->tasklet_loop = 0; ++ do { ++ conn->tasklet_loop++; ++ /* conn_stop() was called on this connection, bailout processing ++ * any command or completions. EP will be disconnected and reconnected ++ * and we will resume processing once bind_conn() is called ++ */ ++ if (conn->state == CONN_STATE_XPORT_FREEZE) { ++ conn->tasklet_freeze++; ++ printk(KERN_ALERT "bnx2i: conn %p worker was scheduled while in error state\n", conn); ++ goto tasklet_exit; ++ } ++ ++ bnx2i_process_control_pdu(sess); ++ ++ if (use_poll_timer) ++ cqe_pending = bnx2i_process_new_cqes(conn, 0, ++ conn->ep->qp.cqe_size); ++ else ++ cqe_pending = bnx2i_process_new_cqes(conn, 0, ++ cmd_cmpl_per_work); ++ ++ if (cqe_pending == -EAGAIN) { ++ conn->tasklet_tmf_exit++; ++ break; ++ } ++ ++ defer_pendq = bnx2i_process_pend_queue(sess); ++ ++ if (time_after(jiffies, sess->timestamp + ++ sess->worker_time_slice)) { ++ conn->tasklet_timeslice_exit++; ++ break; ++ } ++ } while (cqe_pending && !defer_pendq); ++ conn->tasklet_loop = 0xffffffff; ++ ++ if (conn->ep && ((conn->ep->state == EP_STATE_TCP_FIN_RCVD) || ++ (conn->ep->state == EP_STATE_TCP_RST_RCVD))) { ++ if (!atomic_read(&conn->stop_state)) ++ iscsi_conn_error(conn->cls_conn, ISCSI_ERR_CONN_FAILED); ++ goto tasklet_exit; ++ } ++ ++ if (cqe_pending == -EAGAIN) ++ goto tasklet_exit; ++ ++ if (bnx2i_cqe_work_pending(conn) || ++ !list_empty(&sess->pend_cmd_list)) { ++ if (atomic_read(&conn->worker_enabled)) { ++ conn->tasklet_reschedule++; ++#ifdef __VMKLNX__ ++ tasklet_schedule(&conn->conn_tasklet); ++#else ++ shost = bnx2i_conn_get_shost(conn); ++ scsi_queue_work(shost, &conn->conn_worker); ++#endif ++ } ++ } ++tasklet_exit: ++ bnx2i_arm_cq_event_coalescing(conn->ep, CNIC_ARM_CQE); ++ atomic_set(&conn->worker_running, 0); ++} ++ ++static void bnx2i_xmit_work_send_cmd(struct bnx2i_conn *conn, struct bnx2i_cmd *cmd) ++{ ++ struct scsi_cmnd *sc = cmd->scsi_cmd; ++ struct bnx2i_hba *hba = conn->ep->hba; ++ struct bnx2i_sess *sess = conn->sess; ++ struct iscsi_cmd_request *req = &cmd->req; ++ ++ cmd->req.total_data_transfer_length = scsi_bufflen(sc); ++ cmd->iscsi_opcode = cmd->req.op_code = ISCSI_OP_SCSI_CMD; ++ cmd->req.cmd_sn = sess->cmdsn++; ++ ++ bnx2i_iscsi_map_sg_list(hba, cmd); ++ bnx2i_cpy_scsi_cdb(sc, cmd); ++ ++ req->op_attr = ISCSI_ATTR_SIMPLE; ++ if (sc->sc_data_direction == DMA_TO_DEVICE) { ++ req->op_attr |= ISCSI_CMD_REQUEST_WRITE; ++ req->itt |= (ISCSI_TASK_TYPE_WRITE << ++ ISCSI_CMD_REQUEST_TYPE_SHIFT); ++ bnx2i_setup_write_cmd_bd_info(cmd); ++ } else { ++ if (scsi_bufflen(sc)) ++ req->op_attr |= ISCSI_CMD_REQUEST_READ; ++ req->itt |= (ISCSI_TASK_TYPE_READ << ++ ISCSI_CMD_REQUEST_TYPE_SHIFT); ++ } ++ req->num_bds = cmd->bd_tbl->bd_valid; ++ if (!cmd->bd_tbl->bd_valid) { ++ req->bd_list_addr_lo = ++ (u32) sess->hba->mp_dma_buf.pgtbl_map; ++ req->bd_list_addr_hi = ++ (u32) ((u64) sess->hba->mp_dma_buf.pgtbl_map >> 32); ++ req->num_bds = 1; ++ } ++ ++ atomic_set(&cmd->cmd_state, ISCSI_CMD_STATE_INITIATED); ++ sc->SCp.ptr = (char *) cmd; ++ ++ if (req->itt != ITT_INVALID_SIGNATURE) { ++ list_add_tail(&cmd->link, &sess->active_cmd_list); ++ sess->active_cmd_count++; ++ bnx2i_send_iscsi_scsicmd(conn, cmd); ++ } ++} ++ ++/********************************************************************** ++ * open-iscsi interface ++ **********************************************************************/ ++ ++/** ++ * bnx2i_alloc_scsi_host_template - ++ * ++ * allocates memory for SCSI host template, iSCSI template and registers ++ * this instance of NX2 device with iSCSI transport kernel module. ++ */ ++static struct scsi_host_template * ++bnx2i_alloc_scsi_host_template(struct bnx2i_hba *hba, struct cnic_dev *cnic) ++{ ++ void *mem_ptr; ++#ifndef __VMKLNX__ ++ u32 pci_bus_no; ++ u32 pci_dev_no; ++ u32 pci_func_no; ++ u32 extra; ++ struct ethtool_drvinfo drv_info; ++#endif ++ struct scsi_host_template *scsi_template; ++ int mem_size; ++ ++ mem_size = sizeof(struct scsi_host_template); ++ scsi_template = kmalloc(sizeof(struct scsi_host_template), GFP_KERNEL); ++ if (!scsi_template) { ++ printk(KERN_ALERT "bnx2i: failed to alloc memory for sht\n"); ++ return NULL; ++ } ++ ++ mem_ptr = kmalloc(BRCM_ISCSI_XPORT_NAME_SIZE_MAX, GFP_KERNEL); ++ if (mem_ptr == NULL) { ++ printk(KERN_ALERT "failed to alloc memory for xport name\n"); ++ goto scsi_name_mem_err; ++ } ++ ++ memcpy(scsi_template, (const void *) &bnx2i_host_template, ++ sizeof(struct scsi_host_template)); ++ scsi_template->name = mem_ptr; ++ memcpy((void *) scsi_template->name, ++ (const void *) bnx2i_host_template.name, ++ strlen(bnx2i_host_template.name) + 1); ++ ++ mem_ptr = kmalloc(BRCM_ISCSI_XPORT_NAME_SIZE_MAX, GFP_KERNEL); ++ if (mem_ptr == NULL) { ++ printk(KERN_ALERT "failed to alloc proc name mem\n"); ++ goto scsi_proc_name_mem_err; ++ } ++ ++ scsi_template->proc_name = mem_ptr; ++ /* Can't determine device type, 5706/5708 has 40-bit dma addr limit */ ++ if (test_bit(BNX2I_NX2_DEV_5706, &hba->cnic_dev_type) || ++ test_bit(BNX2I_NX2_DEV_5708, &hba->cnic_dev_type)) ++ scsi_template->dma_boundary = DMA_40BIT_MASK; ++ else ++ scsi_template->dma_boundary = DMA_64BIT_MASK; ++ ++ scsi_template->can_queue = hba->max_sqes; ++ scsi_template->cmd_per_lun = scsi_template->can_queue / 2; ++ ++ if (cnic && cnic->netdev) { ++#ifndef __VMKLNX__ ++ cnic->netdev->ethtool_ops->get_drvinfo(cnic->netdev, ++ &drv_info); ++ sscanf(drv_info.bus_info, "%x:%x:%x.%d", &extra, ++ &pci_bus_no, &pci_dev_no, &pci_func_no); ++ ++ sprintf(mem_ptr, "%s-%.2x%.2x%.2x", BRCM_ISCSI_XPORT_NAME_PREFIX, ++ (u8)pci_bus_no, (u8)pci_dev_no, (u8)pci_func_no); ++#else ++ sprintf(mem_ptr, "%s-%s", BRCM_ISCSI_XPORT_NAME_PREFIX, cnic->netdev->name); ++#endif ++ } ++ ++ return scsi_template; ++ ++scsi_proc_name_mem_err: ++ kfree(scsi_template->name); ++scsi_name_mem_err: ++ kfree(scsi_template); ++ printk(KERN_ALERT "bnx2i: failed to allocate scsi host template\n"); ++ return NULL; ++} ++ ++ ++ ++static void bnx2i_free_scsi_host_template(struct scsi_host_template *scsi_template) ++{ ++ kfree(scsi_template->proc_name); ++ kfree(scsi_template->name); ++ kfree(scsi_template); ++} ++ ++ ++/** ++ * bnx2i_alloc_iscsi_transport - ++ * ++ * allocates memory for SCSI host template, iSCSI template and registers ++ * this instance of NX2 device with iSCSI transport kernel module. ++ */ ++static struct iscsi_transport * ++bnx2i_alloc_iscsi_transport(struct bnx2i_hba *hba, struct cnic_dev *cnic, ++ struct scsi_host_template *scsi_template) ++{ ++ void *mem_ptr; ++ struct iscsi_transport *iscsi_transport; ++ int mem_size; ++ ++ mem_size = sizeof(struct iscsi_transport); ++ iscsi_transport = kmalloc(sizeof(struct iscsi_transport), GFP_KERNEL); ++ if (!iscsi_transport) { ++ printk(KERN_ALERT "mem error for iscsi_transport template\n"); ++ goto iscsi_xport_err; ++ } ++ ++ memcpy((void *) iscsi_transport, (const void *) &bnx2i_iscsi_transport, ++ sizeof(struct iscsi_transport)); ++ ++ iscsi_transport->host_template = scsi_template; ++ ++ mem_ptr = kmalloc(BRCM_ISCSI_XPORT_NAME_SIZE_MAX, GFP_KERNEL); ++ if (mem_ptr == NULL) { ++ printk(KERN_ALERT "mem alloc error, iscsi xport name\n"); ++ goto xport_name_mem_err; ++ } ++ ++ iscsi_transport->name = mem_ptr; ++ ++ memcpy((void *) mem_ptr, (const void *) scsi_template->proc_name, ++ strlen(scsi_template->proc_name) + 1); ++ ++#ifdef __VMKLNX__ ++ if (test_bit(BNX2I_NX2_DEV_57710, &hba->cnic_dev_type)) ++ iscsi_transport->get_transport_limit = bnx2i_get_5771x_limit; ++ else ++ iscsi_transport->get_transport_limit = bnx2i_get_570x_limit; ++#endif ++ return iscsi_transport; ++ ++xport_name_mem_err: ++ kfree(iscsi_transport); ++iscsi_xport_err: ++ printk(KERN_ALERT "bnx2i : unable to allocate iscsi transport\n"); ++ return NULL; ++} ++ ++ ++ ++static void bnx2i_free_iscsi_transport(struct iscsi_transport *iscsi_transport) ++{ ++ kfree(iscsi_transport->name); ++ kfree(iscsi_transport); ++} ++ ++ ++/** ++ * bnx2i_register_xport - register a bnx2i device transport name with ++ * the iscsi transport module ++ * ++ * @hba: pointer to adapter instance ++ * ++ * allocates memory for SCSI host template, iSCSI template and registers ++ * this instance of NX2 device with iSCSI transport kernel module. ++ */ ++int bnx2i_register_xport(struct bnx2i_hba *hba) ++{ ++#ifdef __VMKLNX__ ++ struct vmk_ScsiAdapter *vmk_adapter; ++ struct vmklnx_ScsiAdapter *vmklnx_adapter; ++ ++ if (hba->shost_template) ++ return -EEXIST; ++ ++ if (!test_bit(CNIC_F_IF_UP, &hba->cnic->flags) || ++ !hba->cnic->max_iscsi_conn) ++ return -EINVAL; ++#endif ++ ++ hba->shost_template = iscsi_register_transport(hba->iscsi_transport); ++ if (!hba->shost_template) { ++ printk(KERN_ALERT "bnx2i: xport reg failed, hba 0x%p\n", hba); ++ goto failed_registration; ++ } ++ printk(KERN_ALERT "bnx2i: netif=%s, iscsi=%s\n", ++ hba->cnic->netdev->name, hba->scsi_template->proc_name); ++ ++#ifdef __VMKLNX__ ++ hba->shost->transportt = hba->shost_template; ++ device_initialize(&hba->vm_pcidev); ++ if (scsi_add_host(hba->shost, &hba->vm_pcidev)) ++ goto host_add_err; ++ ++ vmklnx_adapter = (struct vmklnx_ScsiAdapter *)hba->shost->adapter; ++ vmk_adapter = (struct vmk_ScsiAdapter *)vmklnx_adapter->vmkAdapter; ++ vmk_adapter->paeCapable = TRUE; ++ ++ iscsi_register_host(hba->shost, hba->iscsi_transport); ++#endif ++ ++ return 0; ++ ++#ifdef __VMKLNX__ ++host_add_err: ++#endif ++ iscsi_unregister_transport(hba->iscsi_transport); ++failed_registration: ++ return -ENOMEM; ++} ++ ++/** ++ * bnx2i_deregister_xport - unregisters bnx2i adapter's iscsi transport name ++ * ++ * @hba: pointer to adapter instance ++ * ++ * de-allocates memory for SCSI host template, iSCSI template and de-registers ++ * a NX2 device instance ++ */ ++int bnx2i_deregister_xport(struct bnx2i_hba *hba) ++{ ++#ifdef __VMKLNX__ ++ if (hba->shost_template) { ++#endif /* __VMKLNX__ */ ++ iscsi_unregister_transport(hba->iscsi_transport); ++ hba->shost_template = NULL; ++#ifdef __VMKLNX__ ++ } ++#endif /* __VMKLNX__ */ ++ return 0; ++} ++ ++ ++int bnx2i_free_iscsi_scsi_template(struct bnx2i_hba *hba) ++{ ++ kfree(hba->scsi_template->proc_name); ++ kfree(hba->scsi_template->name); ++ hba->scsi_template->name = NULL; ++ ++ kfree(hba->scsi_template); ++ hba->scsi_template = NULL; ++ ++ kfree(hba->iscsi_transport->name); ++ hba->iscsi_transport->name = NULL; ++ ++ kfree(hba->iscsi_transport); ++ hba->iscsi_transport = NULL; ++ ++ return 0; ++} ++ ++ ++/** ++ * bnx2i_session_create - create a new iscsi session ++ * ++ * @it: iscsi transport pointer ++ * @scsit: scsi transport template pointer ++ * @cmds_max: max commands supported ++ * @qdepth: scsi queue depth to support ++ * @initial_cmdsn: initial iscsi CMDSN to be used for this session ++ * @host_no: pointer to u32 to return host no ++ * ++ * Creates a new iSCSI session instance on given device. ++ */ ++#ifdef __VMKLNX__ ++#define _CREATE_SESS_NEW_ 1 ++#endif ++ ++struct iscsi_cls_session * ++ bnx2i_session_create(struct iscsi_transport *it, ++ struct scsi_transport_template *scsit, ++#ifdef _CREATE_SESS_NEW_ ++ uint16_t cmds_max, uint16_t qdepth, ++#endif ++ uint32_t initial_cmdsn, ++#ifdef __VMKLNX__ ++ uint32_t target_id, uint32_t channel_id, ++#endif ++ uint32_t *host_no) ++{ ++ struct bnx2i_hba *hba; ++ struct bnx2i_sess *sess; ++ struct Scsi_Host *shost; ++ struct iscsi_cls_session *cls_session; ++ int ret_code; ++ ++#ifdef __VMKLNX__ ++ printk("%s: tgt id %d, ch id %d, cmds_max %d\n", ++ __FUNCTION__, target_id, channel_id, cmds_max); ++#endif ++ hba = bnx2i_get_hba_from_template(scsit); ++ if (bnx2i_adapter_ready(hba)) ++ return NULL; ++ ++#ifdef __VMKLNX__ ++ shost = hba->shost; ++ if (!shost) ++ return NULL; ++ ++ cls_session = iscsi_create_session(shost, it, target_id, channel_id); ++ if (!cls_session) ++ return NULL; ++ ++ sess = cls_session->dd_data; ++#else ++ shost = scsi_host_alloc(hba->iscsi_transport->host_template, ++ hostdata_privsize(sizeof(struct bnx2i_sess))); ++ if (!shost) ++ return NULL; ++ ++ shost->max_id = 1; ++ shost->max_channel = 1; ++ shost->max_lun = hba->iscsi_transport->max_lun; ++ shost->max_cmd_len = hba->iscsi_transport->max_cmd_len; ++#ifdef _NEW_CREATE_SESSION_ ++ if (cmds_max) ++ shost->can_queue = cmds_max; ++ if (qdepth) ++ shost->cmd_per_lun = qdepth; ++#endif /* _NEW_CREATE_SESSION_ */ ++ shost->transportt = scsit; ++ shost->transportt->create_work_queue = 1; ++ sess = iscsi_hostdata(shost->hostdata); ++#endif /* __VMKLNX__ */ ++ *host_no = shost->host_no; ++ ++ if (!sess) ++ goto sess_resc_fail; ++ ++ memset(sess, 0, sizeof(struct bnx2i_sess)); ++ sess->hba = hba; ++#ifdef __VMKLNX__ ++ sess->cls_sess = cls_session; ++#else ++ sess->shost = shost; ++#endif ++ ++ /* ++ * For Open-iSCSI, only normal sessions go through bnx2i. ++ * Discovery session goes through host stack TCP/IP stack. ++ */ ++ ret_code = bnx2i_iscsi_sess_new(hba, sess); ++ if (ret_code) { ++ /* failed to allocate memory */ ++ printk(KERN_ALERT "bnx2i_sess_create: unable to alloc sess\n"); ++ goto sess_resc_fail; ++ } ++ ++ /* Update CmdSN related parameters */ ++ sess->cmdsn = initial_cmdsn; ++ sess->exp_cmdsn = initial_cmdsn + 1; ++ sess->max_cmdsn = initial_cmdsn + 1; ++ ++#ifndef __VMKLNX__ ++ if (scsi_add_host(shost, NULL)) ++ goto add_sh_fail; ++ ++ if (!try_module_get(it->owner)) ++ goto cls_sess_falied; ++ ++ cls_session = iscsi_create_session(shost, it, 0); ++ if (!cls_session) ++ goto module_put; ++ *(unsigned long *)shost->hostdata = (unsigned long)cls_session; ++ ++ printk("%s: sess %p created successfully\n", __FUNCTION__, sess); ++ return hostdata_session(shost->hostdata); ++#else ++ return cls_session; ++#endif ++ ++#ifndef __VMKLNX__ ++module_put: ++ module_put(it->owner); ++cls_sess_falied: ++ scsi_remove_host(shost); ++add_sh_fail: ++ bnx2i_iscsi_sess_release(hba, sess); ++#endif ++sess_resc_fail: ++#ifndef __VMKLNX__ ++ scsi_host_put(shost); ++#endif ++ return NULL; ++} ++ ++ ++#ifdef __VMKLNX__ ++struct iscsi_cls_session * ++bnx2i_session_create_vmp(struct iscsi_transport *it, ++ void *scsi_templ, ++#ifdef _CREATE_SESS_NEW_ ++ uint16_t cmds_max, uint16_t qdepth, ++#endif ++ uint32_t initial_cmdsn, ++ uint32_t target_id, uint32_t channel_id, ++ uint32_t *host_no) ++{ ++ struct scsi_transport_template *scsit = scsi_templ; ++ ++ return bnx2i_session_create(it, scsit, ++#ifdef _CREATE_SESS_NEW_ ++ cmds_max, qdepth, ++#endif ++ initial_cmdsn, target_id, channel_id, host_no); ++} ++ ++ ++struct iscsi_cls_session * ++ bnx2i_session_create_vm(struct iscsi_transport *it, ++ struct scsi_transport_template *scsit, ++#ifdef _CREATE_SESS_NEW_ ++ uint16_t cmds_max, uint16_t qdepth, ++#endif ++ uint32_t initial_cmdsn, ++ uint32_t *host_no) ++{ ++ struct bnx2i_hba *hba = bnx2i_get_hba_from_template(scsit); ++ ++ if (!hba) ++ return NULL; ++ return bnx2i_session_create(it, scsit, ++#ifdef _CREATE_SESS_NEW_ ++ cmds_max, qdepth, ++#endif ++ initial_cmdsn, hba->target_id++, hba->channel_id, host_no); ++} ++#endif ++ ++ ++static void bnx2i_release_session_resc(struct iscsi_cls_session *cls_session) ++{ ++#ifdef __VMKLNX__ ++ struct bnx2i_sess *sess = cls_session->dd_data; ++#else ++ struct Scsi_Host *shost = iscsi_session_to_shost(cls_session); ++ struct bnx2i_sess *sess = iscsi_hostdata(shost->hostdata); ++ struct module *owner = cls_session->transport->owner; ++#endif ++ ++ bnx2i_iscsi_sess_release(sess->hba, sess); ++ ++ kfree(sess->target_name); ++ sess->target_name = NULL; ++ ++ iscsi_free_session(cls_session); ++#ifndef __VMKLNX__ ++ scsi_host_put(shost); ++ module_put(owner); ++#endif ++} ++ ++/** ++ * bnx2i_session_destroy - destroys iscsi session ++ * ++ * @cls_session: pointer to iscsi cls session ++ * ++ * Destroys previously created iSCSI session instance and releases ++ * all resources held by it ++ */ ++ ++void bnx2i_session_destroy(struct iscsi_cls_session *cls_session) ++{ ++#ifdef __VMKLNX__ ++ struct bnx2i_sess *sess = cls_session->dd_data; ++#else ++ struct Scsi_Host *shost = iscsi_session_to_shost(cls_session); ++ struct bnx2i_sess *sess = iscsi_hostdata(shost->hostdata); ++#endif ++ ++ bnx2i_withdraw_sess_recovery(sess); ++ ++ iscsi_remove_session(cls_session); ++#ifndef __VMKLNX__ ++ scsi_remove_host(shost); ++ bnx2i_release_session_resc(cls_session); ++#else ++ if (sess->state == BNX2I_SESS_TARGET_DESTROYED) ++ bnx2i_release_session_resc(cls_session); ++ else ++ sess->state = BNX2I_SESS_DESTROYED; ++#endif ++} ++ ++/** ++ * bnx2i_sess_recovery_timeo - session recovery timeout handler ++ * ++ * @cls_session: pointer to iscsi cls session ++ * ++ * session recovery timeout handling routine ++ */ ++void bnx2i_sess_recovery_timeo(struct iscsi_cls_session *cls_session) ++{ ++#ifdef __VMKLNX__ ++ struct bnx2i_sess *sess = cls_session->dd_data; ++#else ++ struct Scsi_Host *shost = iscsi_session_to_shost(cls_session); ++ struct bnx2i_sess *sess = iscsi_hostdata(shost->hostdata); ++#endif ++ ++ printk("%s: sess %p recovery timed out\n", __FUNCTION__, sess); ++#ifdef __VMKLNX__ ++ iscsi_offline_session(sess->cls_sess); ++#endif ++ sess->recovery_state |= ISCSI_SESS_RECOVERY_FAILED; ++ wake_up(&sess->er_wait); ++} ++ ++ ++/** ++ * bnx2i_conn_create - create iscsi connection instance ++ * ++ * @cls_session: pointer to iscsi cls session ++ * @cid: iscsi cid as per rfc (not NX2's CID terminology) ++ * ++ * Creates a new iSCSI connection instance for a given session ++ */ ++struct iscsi_cls_conn *bnx2i_conn_create(struct iscsi_cls_session *cls_session, ++ uint32_t cid) ++{ ++#ifdef __VMKLNX__ ++ struct bnx2i_sess *sess = cls_session->dd_data; ++#else ++ struct Scsi_Host *shost = iscsi_session_to_shost(cls_session); ++ struct bnx2i_sess *sess = iscsi_hostdata(shost->hostdata); ++#endif ++ struct bnx2i_conn *conn; ++ struct iscsi_cls_conn *cls_conn; ++ ++ cls_conn = iscsi_create_conn(cls_session, cid); ++ if (!cls_conn) ++ return NULL; ++ ++ conn = cls_conn->dd_data; ++ memset(conn, 0, sizeof(struct bnx2i_conn)); ++ conn->cls_conn = cls_conn; ++ conn->exp_statsn = STATSN_UPDATE_SIGNATURE; ++ conn->state = CONN_STATE_IDLE; ++ /* Initialize the connection structure */ ++ bnx2i_iscsi_conn_new(sess, conn); ++ conn->conn_cid = cid; ++ return cls_conn; ++} ++ ++ ++/** ++ * bnx2i_conn_bind - binds iscsi sess, conn and ep objects together ++ * ++ * @cls_session: pointer to iscsi cls session ++ * @cls_conn: pointer to iscsi cls conn ++ * @transport_fd: 64-bit EP handle ++ * @is_leading: leading connection on this session? ++ * ++ * Binds together iSCSI session instance, iSCSI connection instance ++ * and the TCP connection. This routine returns error code if ++ * TCP connection does not belong on the device iSCSI sess/conn ++ * is bound ++ */ ++#ifdef __VMKLNX__ ++vmk_int32 bnx2i_conn_bind(struct iscsi_cls_session *cls_session, ++ struct iscsi_cls_conn *cls_conn, ++ vmk_uint64 transport_fd, vmk_int32 is_leading) ++#else ++int bnx2i_conn_bind(struct iscsi_cls_session *cls_session, ++ struct iscsi_cls_conn *cls_conn, ++ uint64_t transport_fd, int is_leading) ++#endif ++{ ++#ifdef __VMKLNX__ ++ struct bnx2i_sess *sess; ++ struct Scsi_Host *shost; ++ unsigned int flags; ++#else ++ struct Scsi_Host *shost = iscsi_session_to_shost(cls_session); ++ struct bnx2i_sess *sess = iscsi_hostdata(shost->hostdata); ++#endif ++ struct bnx2i_conn *tmp; ++ struct bnx2i_conn *conn; ++ int ret_code; ++ struct bnx2i_endpoint *ep; ++ ++#ifdef __VMKLNX__ ++ sess = cls_session->dd_data; ++ shost = bnx2i_sess_get_shost(sess); ++#endif ++ conn = cls_conn->dd_data; ++ ep = (struct bnx2i_endpoint *) (unsigned long) transport_fd; ++ printk("%s: binding sess %p, conn %p, ep %p\n", ++ __FUNCTION__, sess, conn, ep); ++ ++ if ((ep->state == EP_STATE_TCP_FIN_RCVD) || ++ (ep->state == EP_STATE_TCP_RST_RCVD)) ++ /* Peer disconnect via' FIN or RST */ ++ return -EINVAL; ++ ++ if (ep->hba != sess->hba) { ++ /* Error - TCP connection does not belong to this device ++ */ ++ printk(KERN_ALERT "bnx2i: conn bind, ep=0x%p (%s) does not", ++ ep, ep->hba->netdev->name); ++ printk(KERN_ALERT "belong to hba (%s)\n", ++ sess->hba->netdev->name); ++ return -EEXIST; ++ } ++ ++#ifdef __VMKLNX__ ++ spin_lock_irqsave(ep->hba->shost->host_lock, flags); ++#endif ++ if (!sess->login_nopout_cmd) ++ sess->login_nopout_cmd = bnx2i_alloc_cmd(sess); ++ if (!sess->scsi_tmf_cmd) ++ sess->scsi_tmf_cmd = bnx2i_alloc_cmd(sess); ++ if (!sess->nopout_resp_cmd) ++ sess->nopout_resp_cmd = bnx2i_alloc_cmd(sess); ++#ifdef __VMKLNX__ ++ spin_unlock_irqrestore(ep->hba->shost->host_lock, flags); ++#endif ++ ++ /* adjust dma boundary limit which was set to lower bound of 40-bit ++ * address as required by 5706/5708. 5709/57710 does not have any ++ * address limitation requirements. 'dma_mask' parameter is set ++ * by bnx2 module based on device requirements, we just use whatever ++ * is set. ++ */ ++ shost->dma_boundary = ep->hba->pcidev->dma_mask; ++ ++ /* look-up for existing connection, MC/S is not currently supported */ ++ spin_lock_bh(&sess->lock); ++ tmp = NULL; ++ if (!list_empty(&sess->conn_list)) { ++ list_for_each_entry(tmp, &sess->conn_list, link) { ++ if (tmp == conn) ++ break; ++ } ++ } ++ if ((tmp != conn) && (conn->sess == sess)) { ++ /* bind iSCSI connection to this session */ ++ list_add(&conn->link, &sess->conn_list); ++ if (is_leading) ++ sess->lead_conn = conn; ++ } ++ ++ if (conn->ep) { ++ /* This happens when 'iscsid' is killed and restarted. Daemon ++ * has no clue of tranport handle, but knows active conn/sess ++ * and tried to rebind a new tranport (EP) to already active ++ * iSCSI session/connection ++ */ ++ spin_unlock_bh(&sess->lock); ++ bnx2i_ep_disconnect((uint64_t) (unsigned long) conn->ep); ++ spin_lock_bh(&sess->lock); ++ } ++ ++ conn->ep = (struct bnx2i_endpoint *) (unsigned long) transport_fd; ++ conn->ep->conn = conn; ++ conn->ep->sess = sess; ++ conn->state = CONN_STATE_XPORT_READY; ++ conn->iscsi_conn_cid = conn->ep->ep_iscsi_cid; ++ conn->fw_cid = conn->ep->ep_cid; ++ ++ ret_code = bnx2i_bind_conn_to_iscsi_cid(conn, ep->ep_iscsi_cid); ++ spin_unlock_bh(&sess->lock); ++ ++ /* 5706/5708/5709 FW takes RQ as full when initiated, but for 57710 ++ * driver needs to explicitly replenish RQ index during setup. ++ */ ++ if (test_bit(BNX2I_NX2_DEV_57710, &ep->hba->cnic_dev_type)) ++ bnx2i_put_rq_buf(conn, 0); ++ ++#if defined(__VMKLNX__) ++ if (!atomic_read(&conn->worker_enabled)) { ++ printk("%s: tasklet enabled, conn cid %d\n", ++ __FUNCTION__, conn->ep->ep_iscsi_cid); ++ tasklet_enable(&conn->conn_tasklet); ++ barrier(); ++ atomic_inc(&conn->worker_enabled_cnt); ++ printk("%s : cid %d tasklet stats :: enabled %d, disabled %d\n", ++ __FUNCTION__, conn->ep->ep_iscsi_cid, ++ atomic_read(&conn->worker_enabled_cnt), ++ atomic_read(&conn->worker_disabled_cnt)); ++ } ++#endif ++ atomic_set(&conn->worker_enabled, 1); ++ bnx2i_arm_cq_event_coalescing(conn->ep, CNIC_ARM_CQE); ++ return ret_code; ++} ++ ++ ++/** ++ * bnx2i_conn_destroy - destroy iscsi connection instance & release resources ++ * ++ * @cls_conn: pointer to iscsi cls conn ++ * ++ * Destroy an iSCSI connection instance and release memory resources held by ++ * this connection ++ */ ++void bnx2i_conn_destroy(struct iscsi_cls_conn *cls_conn) ++{ ++ struct bnx2i_conn *conn = cls_conn->dd_data; ++ struct bnx2i_sess *sess = conn->sess; ++ struct Scsi_Host *shost; ++ shost = bnx2i_conn_get_shost(conn); ++ ++ bnx2i_conn_free_login_resources(conn->sess->hba, conn); ++ ++ list_del_init(&conn->link); ++ if (sess->lead_conn == conn) ++ sess->lead_conn = NULL; ++ if (conn->ep) { ++ conn->ep->conn = NULL; ++ conn->ep = NULL; ++ } ++ ++ if (atomic_read(&conn->worker_enabled)) { ++#ifdef __VMKLNX__ ++ tasklet_disable(&conn->conn_tasklet); ++#else ++ scsi_flush_work(shost); ++#endif /* __VMKLNX__ */ ++ barrier(); ++ atomic_inc(&conn->worker_disabled_cnt); ++ atomic_set(&conn->worker_enabled, 0); ++ } ++ ++ kfree(conn->persist_address); ++ conn->persist_address = NULL; ++ iscsi_destroy_conn(cls_conn); ++} ++ ++ ++/** ++ * bnx2i_conn_set_param - set iscsi connection parameter ++ * ++ * @cls_conn: pointer to iscsi cls conn ++ * @param: parameter type identifier ++ * @buf: buffer pointer ++ * @buflen: buffer length ++ * ++ * During FFP migration, user daemon will issue this call to ++ * update negotiated iSCSI parameters to driver. ++ */ ++#ifdef __VMKLNX__ ++vmk_int32 bnx2i_conn_set_param(struct iscsi_cls_conn *cls_conn, ++ enum iscsi_param param, vmk_int8 *buf, ++ vmk_int32 buflen) ++#else ++int bnx2i_conn_set_param(struct iscsi_cls_conn *cls_conn, ++ enum iscsi_param param, char *buf, int buflen) ++#endif ++{ ++ struct bnx2i_conn *conn = cls_conn->dd_data; ++ struct bnx2i_sess *sess = conn->sess; ++ int ret_val = 0; ++ ++ spin_lock_bh(&sess->lock); ++ if (conn->state != CONN_STATE_IN_LOGIN) { ++ printk(KERN_ERR "bnx2i: can't change param [%d]\n", param); ++ spin_unlock_bh(&sess->lock); ++ return -1; ++ } ++ spin_unlock_bh(&sess->lock); ++ switch (param) { ++ case ISCSI_PARAM_MAX_RECV_DLENGTH: ++ sscanf(buf, "%d", &conn->max_data_seg_len_recv); ++ break; ++ case ISCSI_PARAM_MAX_XMIT_DLENGTH: ++ sscanf(buf, "%d", &conn->max_data_seg_len_xmit); ++ break; ++ case ISCSI_PARAM_HDRDGST_EN: ++ sscanf(buf, "%d", &conn->header_digest_en); ++ break; ++ case ISCSI_PARAM_DATADGST_EN: ++ sscanf(buf, "%d", &conn->data_digest_en); ++ break; ++ case ISCSI_PARAM_INITIAL_R2T_EN: ++ if (conn == sess->lead_conn) ++ sscanf(buf, "%d", &sess->initial_r2t); ++ break; ++ case ISCSI_PARAM_MAX_R2T: ++ if (conn == sess->lead_conn) ++ sscanf(buf, "%d", &sess->max_r2t); ++ break; ++ case ISCSI_PARAM_IMM_DATA_EN: ++ if (conn == sess->lead_conn) ++ sscanf(buf, "%d", &sess->imm_data); ++ break; ++ case ISCSI_PARAM_FIRST_BURST: ++ if (conn == sess->lead_conn) ++ sscanf(buf, "%d", &sess->first_burst_len); ++ break; ++ case ISCSI_PARAM_MAX_BURST: ++ if (conn == sess->lead_conn) ++ sscanf(buf, "%d", &sess->max_burst_len); ++ break; ++ case ISCSI_PARAM_PDU_INORDER_EN: ++ if (conn == sess->lead_conn) ++ sscanf(buf, "%d", &sess->pdu_inorder); ++ break; ++ case ISCSI_PARAM_DATASEQ_INORDER_EN: ++ if (conn == sess->lead_conn) ++ sscanf(buf, "%d", &sess->dataseq_inorder); ++ break; ++ case ISCSI_PARAM_ERL: ++ if (conn == sess->lead_conn) ++ sscanf(buf, "%d", &sess->erl); ++ break; ++ case ISCSI_PARAM_IFMARKER_EN: ++ sscanf(buf, "%d", &conn->ifmarker_enable); ++ BUG_ON(conn->ifmarker_enable); ++ break; ++ case ISCSI_PARAM_OFMARKER_EN: ++ sscanf(buf, "%d", &conn->ofmarker_enable); ++ BUG_ON(conn->ofmarker_enable); ++ break; ++ case ISCSI_PARAM_EXP_STATSN: ++ sscanf(buf, "%u", &conn->exp_statsn); ++ break; ++ case ISCSI_PARAM_TARGET_NAME: ++ if (sess->target_name) ++ break; ++ sess->target_name = kstrdup(buf, GFP_KERNEL); ++ if (!sess->target_name) ++ ret_val = -ENOMEM; ++ break; ++ case ISCSI_PARAM_TPGT: ++ sscanf(buf, "%d", &sess->tgt_prtl_grp); ++ break; ++ case ISCSI_PARAM_PERSISTENT_PORT: ++ sscanf(buf, "%d", &conn->persist_port); ++ break; ++ case ISCSI_PARAM_PERSISTENT_ADDRESS: ++ if (conn->persist_address) ++ break; ++ conn->persist_address = kstrdup(buf, GFP_KERNEL); ++ if (!conn->persist_address) ++ ret_val = -ENOMEM; ++ break; ++#ifdef __VMKLNX__ ++ case ISCSI_PARAM_ISID: ++ snprintf(sess->isid, sizeof(sess->isid), "%s", buf); ++ break; ++#endif ++ default: ++ printk(KERN_ALERT "PARAM_UNKNOWN: 0x%x\n", param); ++ ret_val = -ENOSYS; ++ break; ++ } ++ ++ return ret_val; ++} ++ ++ ++/** ++ * bnx2i_conn_get_param - return iscsi connection parameter to caller ++ * ++ * @cls_conn: pointer to iscsi cls conn ++ * @param: parameter type identifier ++ * @buf: buffer pointer ++ * ++ * returns iSCSI connection parameters ++ */ ++#ifdef __VMKLNX__ ++vmk_int32 bnx2i_conn_get_param(struct iscsi_cls_conn *cls_conn, ++ enum iscsi_param param, vmk_int8 *buf) ++#else ++int bnx2i_conn_get_param(struct iscsi_cls_conn *cls_conn, ++ enum iscsi_param param, char *buf) ++#endif ++{ ++ struct bnx2i_conn *conn; ++ int len; ++ ++ conn = (struct bnx2i_conn *)cls_conn->dd_data; ++ if (!conn) ++ return -EINVAL; ++#ifndef __VMKLNX__ ++ if (!conn->ep || (conn->ep->state != EP_STATE_ULP_UPDATE_COMPL)) ++ return -EINVAL; ++#endif ++ ++ len = 0; ++ switch (param) { ++ case ISCSI_PARAM_MAX_RECV_DLENGTH: ++ len = sprintf(buf, "%u\n", conn->max_data_seg_len_recv); ++ break; ++ case ISCSI_PARAM_MAX_XMIT_DLENGTH: ++ len = sprintf(buf, "%u\n", conn->max_data_seg_len_xmit); ++ break; ++ case ISCSI_PARAM_HDRDGST_EN: ++ len = sprintf(buf, "%d\n", conn->header_digest_en); ++ break; ++ case ISCSI_PARAM_DATADGST_EN: ++ len = sprintf(buf, "%d\n", conn->data_digest_en); ++ break; ++ case ISCSI_PARAM_IFMARKER_EN: ++ len = sprintf(buf, "%u\n", conn->ifmarker_enable); ++ break; ++ case ISCSI_PARAM_OFMARKER_EN: ++ len = sprintf(buf, "%u\n", conn->ofmarker_enable); ++ break; ++ case ISCSI_PARAM_EXP_STATSN: ++ len = sprintf(buf, "%u\n", conn->exp_statsn); ++ break; ++ case ISCSI_PARAM_PERSISTENT_PORT: ++ len = sprintf(buf, "%d\n", conn->persist_port); ++ break; ++ case ISCSI_PARAM_PERSISTENT_ADDRESS: ++ if (conn->persist_address) ++ len = sprintf(buf, "%s\n", conn->persist_address); ++ break; ++ case ISCSI_PARAM_CONN_PORT: ++ if (conn->ep) ++ len = sprintf(buf, "%u\n", ++ (uint32_t)conn->ep->cm_sk->dst_port); ++ else ++ len = sprintf(buf, "0\n"); ++ break; ++ case ISCSI_PARAM_CONN_ADDRESS: ++ if (conn->ep) ++ len = sprintf(buf, NIPQUAD_FMT "\n", ++ NIPQUAD(conn->ep->cm_sk->dst_ip)); ++ else ++ len = sprintf(buf, "0.0.0.0\n"); ++ break; ++ default: ++ printk(KERN_ALERT "get_param: conn 0x%p param %d not found\n", ++ conn, (u32)param); ++ len = -ENOSYS; ++ } ++#ifdef __VMKLNX__ ++ if (len > 0) ++ buf[len - 1] = '\0'; ++#endif ++ ++ return len; ++} ++ ++ ++/** ++ * bnx2i_session_get_param - returns iscsi session parameter ++ * ++ * @cls_session: pointer to iscsi cls session ++ * @param: parameter type identifier ++ * @buf: buffer pointer ++ * ++ * returns iSCSI session parameters ++ */ ++#ifdef __VMKLNX__ ++vmk_int32 bnx2i_session_get_param(struct iscsi_cls_session *cls_session, ++ enum iscsi_param param, vmk_int8 *buf) ++#else ++int bnx2i_session_get_param(struct iscsi_cls_session *cls_session, ++ enum iscsi_param param, char *buf) ++#endif ++{ ++#ifdef __VMKLNX__ ++ struct bnx2i_sess *sess = cls_session->dd_data; ++#else ++ struct Scsi_Host *shost = iscsi_session_to_shost(cls_session); ++ struct bnx2i_sess *sess = iscsi_hostdata(shost->hostdata); ++#endif ++ int len = 0; ++ ++ switch (param) { ++ case ISCSI_PARAM_INITIAL_R2T_EN: ++ len = sprintf(buf, "%d\n", sess->initial_r2t); ++ break; ++ case ISCSI_PARAM_MAX_R2T: ++ len = sprintf(buf, "%hu\n", sess->max_r2t); ++ break; ++ case ISCSI_PARAM_IMM_DATA_EN: ++ len = sprintf(buf, "%d\n", sess->imm_data); ++ break; ++ case ISCSI_PARAM_FIRST_BURST: ++ len = sprintf(buf, "%u\n", sess->first_burst_len); ++ break; ++ case ISCSI_PARAM_MAX_BURST: ++ len = sprintf(buf, "%u\n", sess->max_burst_len); ++ break; ++ case ISCSI_PARAM_PDU_INORDER_EN: ++ len = sprintf(buf, "%d\n", sess->pdu_inorder); ++ break; ++ case ISCSI_PARAM_DATASEQ_INORDER_EN: ++ len = sprintf(buf, "%d\n", sess->dataseq_inorder); ++ break; ++ case ISCSI_PARAM_ERL: ++ len = sprintf(buf, "%d\n", sess->erl); ++ break; ++ case ISCSI_PARAM_TARGET_NAME: ++ if (sess->target_name) ++ len = sprintf(buf, "%s\n", sess->target_name); ++ break; ++ case ISCSI_PARAM_TPGT: ++ len = sprintf(buf, "%d\n", sess->tgt_prtl_grp); ++ break; ++#ifdef __VMKLNX__ ++ case ISCSI_PARAM_ISID: ++ len = sprintf(buf,"%s\n", sess->isid); ++ break; ++#endif ++ default: ++ printk(KERN_ALERT "sess_get_param: sess 0x%p", sess); ++ printk(KERN_ALERT "param (0x%x) not found\n", (u32) param); ++ return -ENOSYS; ++ } ++ ++#ifdef __VMKLNX__ ++ if (len > 0) ++ buf[len - 1] = '\0'; ++#endif ++ ++ return len; ++} ++ ++ ++/** ++ * bnx2i_conn_start - completes iscsi connection migration to FFP ++ * ++ * @cls_conn: pointer to iscsi cls conn ++ * ++ * last call in FFP migration to handover iscsi conn to the driver ++ */ ++#ifdef __VMKLNX__ ++vmk_int32 bnx2i_conn_start(struct iscsi_cls_conn *cls_conn) ++#else ++int bnx2i_conn_start(struct iscsi_cls_conn *cls_conn) ++#endif ++{ ++ struct bnx2i_conn *conn = (struct bnx2i_conn *) cls_conn->dd_data; ++ struct bnx2i_sess *sess; ++ ++ printk("%s: conn %p request received\n", __FUNCTION__, conn); ++ if (conn->state != CONN_STATE_IN_LOGIN) { ++ printk(KERN_ALERT "conn_start: conn 0x%p state 0x%x err!!\n", ++ conn, conn->state); ++ return -EINVAL; ++ } ++ sess = conn->sess; ++ ++ if ((sess->imm_data || !sess->initial_r2t) && ++ sess->first_burst_len > sess->max_burst_len) { ++ printk(KERN_ALERT "bnx2i: invalid params, FBL > MBL\n"); ++ return -EINVAL; ++ } ++ ++ conn->state = CONN_STATE_FFP_STATE; ++ if (sess->lead_conn == conn) ++ sess->state = BNX2I_SESS_IN_FFP; ++ ++ conn->ep->state = EP_STATE_ULP_UPDATE_START; ++ bnx2i_update_iscsi_conn(conn); ++ ++ conn->ep->ofld_timer.expires = 10*HZ + jiffies; ++ conn->ep->ofld_timer.function = bnx2i_ep_ofld_timer; ++ conn->ep->ofld_timer.data = (unsigned long) conn->ep; ++ add_timer(&conn->ep->ofld_timer); ++ /* update iSCSI context for this conn, wait for CNIC to complete */ ++ wait_event_interruptible(conn->ep->ofld_wait, ++ conn->ep->state != EP_STATE_ULP_UPDATE_START); ++ ++ if (signal_pending(current)) ++ flush_signals(current); ++ del_timer_sync(&conn->ep->ofld_timer); ++ ++ switch (atomic_read(&conn->stop_state)) { ++ case STOP_CONN_RECOVER: ++ sess->recovery_state = ISCSI_SESS_RECOVERY_COMPLETE; ++ sess->state = BNX2I_SESS_IN_FFP; ++ atomic_set(&conn->stop_state, 0); ++#ifdef __VMKLNX__ ++ iscsi_unblock_session(cls_conn->session); ++#else ++ iscsi_unblock_session(session_to_cls(sess)); ++#endif ++ wake_up(&sess->er_wait); ++ break; ++ case STOP_CONN_TERM: ++ break; ++ default: ++ ; ++ } ++ ++ if (use_poll_timer) ++ add_timer(&conn->poll_timer); ++ ++ return 0; ++} ++ ++/* TOOD - debug only */ ++extern void bnx2i_print_cqe(struct bnx2i_conn *conn); ++extern void bnx2i_print_sqe(struct bnx2i_conn *conn); ++/* TOOD - debug only */ ++ ++/** ++ * bnx2i_conn_stop - stop any further processing on this connection ++ * ++ * @cls_conn: pointer to iscsi cls conn ++ * @flags: reason for freezing this connection ++ * ++ * call to take control of iscsi conn from the driver. Could be called ++ * when login failed, when recovery is to be attempted or during ++ * connection teardown ++ */ ++#ifdef __VMKLNX__ ++vmk_int32 bnx2i_conn_stop(struct iscsi_cls_conn *cls_conn, vmk_int32 flag) ++#else ++void bnx2i_conn_stop(struct iscsi_cls_conn *cls_conn, int flag) ++#endif ++{ ++ struct bnx2i_conn *conn = (struct bnx2i_conn *)cls_conn->dd_data; ++ struct Scsi_Host *shost = bnx2i_conn_get_shost(conn); ++ unsigned long flags; ++ ++ printk("%s: conn %p, flag %x request received\n", ++ __FUNCTION__, conn, flag); ++ atomic_set(&conn->stop_state, flag); ++ conn->state = CONN_STATE_XPORT_FREEZE; ++#ifdef __VMKLNX__ ++ iscsi_block_session(cls_conn->session); ++#else ++ iscsi_block_session(session_to_cls(conn->sess)); ++#endif ++ ++ if (atomic_read(&conn->worker_enabled)) { ++#ifdef __VMKLNX__ ++ printk("%s: tasklet disabled, cid %d\n", __FUNCTION__, conn->ep->ep_iscsi_cid); ++ tasklet_disable(&conn->conn_tasklet); ++#else ++ scsi_flush_work(shost); ++#endif ++ barrier(); ++ atomic_inc(&conn->worker_disabled_cnt); ++ atomic_set(&conn->worker_enabled, 0); ++ } ++ ++ switch (flag) { ++ case STOP_CONN_RECOVER: ++ conn->sess->state = BNX2I_SESS_IN_RECOVERY; ++ if (!conn->sess->recovery_state) { /* nopout timeout */ ++ ++ spin_lock_irqsave(shost->host_lock, flags); ++ conn->sess->recovery_state = ++ ISCSI_SESS_RECOVERY_OPEN_ISCSI; ++ spin_unlock_irqrestore(shost->host_lock, flags); ++ } ++ break; ++ case STOP_CONN_TERM: ++ if (conn->sess && (conn->sess->state & BNX2I_SESS_IN_FFP)) { ++ conn->sess->state = BNX2I_SESS_IN_SHUTDOWN; ++ } ++ break; ++ default: ++ printk(KERN_ERR "bnx2i: invalid conn stop req %d\n", flag); ++ } ++ ++ if (use_poll_timer) ++ del_timer_sync(&conn->poll_timer); ++ ++ if (atomic_read(&conn->sess->tmf_active)) { ++ printk(KERN_ERR "Cleanup active tmf commands from stop_conn\n"); ++ /** Wrong thing to do... timer might have already fired the TIMEOUT ++ * BUT SHOULD WORK as a workaround ++ */ ++ atomic_set(&conn->sess->scsi_tmf_cmd->cmd_state, ++ ISCSI_CMD_STATE_TMF_TIMEOUT); ++ wake_up(&conn->sess->er_wait); ++ } ++ ++#ifdef __VMKLNX__ ++ return 0; ++#else ++ return; ++#endif ++} ++ ++ ++/** ++ * bnx2i_conn_send_pdu - iscsi transport callback entry point to send ++ * iscsi slow path pdus, such as LOGIN/LOGOUT/NOPOUT, etc ++ * ++ * @hba: pointer to adapter instance ++ * ++ * sends iSCSI PDUs prepared by user daemon, only login, logout, nop-out pdu ++ * will flow this path. ++ */ ++#ifdef __VMKLNX__ ++vmk_int32 bnx2i_conn_send_pdu(struct iscsi_cls_conn *cls_conn, ++ struct iscsi_hdr *hdr, vmk_int8 *data, ++ vmk_uint32 data_size) ++#else ++int bnx2i_conn_send_pdu(struct iscsi_cls_conn *cls_conn, ++ struct iscsi_hdr *hdr, char *data, ++ uint32_t data_size) ++#endif ++{ ++ struct bnx2i_conn *conn; ++ struct bnx2i_cmd *cmnd; ++ uint32_t payload_size; ++ int count; ++#ifndef __VMKLNX__ ++ struct Scsi_Host *shost; ++#endif ++ ++ if (!cls_conn) { ++ printk(KERN_ALERT "bnx2i_conn_send_pdu: NULL conn ptr. \n"); ++ return -EIO; ++ } ++ conn = (struct bnx2i_conn *)cls_conn->dd_data; ++ if (!conn->gen_pdu.req_buf) { ++ printk(KERN_ALERT "send_pdu: login buf not allocated\n"); ++ /* ERR - buffer not allocated, should not happen */ ++ goto error; ++ } ++ ++ if (conn->state != CONN_STATE_XPORT_READY && ++ conn->state != CONN_STATE_IN_LOGIN && ++ (hdr->opcode & ISCSI_OPCODE_MASK) == ISCSI_OP_LOGIN) { ++ /* login pdu request is valid in transport ready state */ ++ printk(KERN_ALERT "send_pdu: %d != XPORT_READY\n", ++ conn->state); ++ goto error; ++ } ++ ++ if (conn->sess->login_nopout_cmd) { ++ cmnd = conn->sess->login_nopout_cmd; ++ } else /* should not happen ever... */ ++ goto error; ++ ++ printk("%s: cid %d tasklet stats :: enabled %d, disabled %d \n", ++ __FUNCTION__, conn->ep->ep_iscsi_cid, ++ atomic_read(&conn->worker_enabled_cnt), ++ atomic_read(&conn->worker_disabled_cnt)); ++ ++ memset(conn->gen_pdu.req_buf, 0, ISCSI_CONN_LOGIN_BUF_SIZE); ++ conn->gen_pdu.req_buf_size = data_size; ++ ++ cmnd->conn = conn; ++ cmnd->scsi_cmd = NULL; ++ ++ switch (hdr->opcode & ISCSI_OPCODE_MASK) { ++ case ISCSI_OP_LOGIN: ++ printk("%s: iscsi login send request, conn %p, payload %d\n", ++ __FUNCTION__, conn, data_size); ++ /* Login request, copy hdr & data to buffer in conn struct */ ++ memcpy(&conn->gen_pdu.pdu_hdr, (const void *) hdr, ++ sizeof(struct iscsi_hdr)); ++ if (conn->state == CONN_STATE_XPORT_READY) ++ conn->state = CONN_STATE_IN_LOGIN; ++ payload_size = (hdr->dlength[0] << 16) | (hdr->dlength[1] << 8) | ++ hdr->dlength[2]; ++ ++ if (data_size) { ++ memcpy(conn->gen_pdu.login_req.mem, (const void *)data, ++ data_size); ++ conn->gen_pdu.req_wr_ptr = ++ conn->gen_pdu.req_buf + payload_size; ++ } ++ cmnd->iscsi_opcode = hdr->opcode; ++ smp_mb(); ++ atomic_set(&conn->sess->login_noop_pending, 1); ++ break; ++ case ISCSI_OP_LOGOUT: ++ printk("%s: iscsi logout send request, conn %p\n", __FUNCTION__, conn); ++ /* Logout request, copy header only */ ++ memcpy(&conn->gen_pdu.pdu_hdr, (const void *) hdr, ++ sizeof(struct iscsi_hdr)); ++ conn->gen_pdu.req_wr_ptr = conn->gen_pdu.req_buf; ++ conn->state = CONN_STATE_IN_LOGOUT; ++ conn->sess->state = BNX2I_SESS_IN_LOGOUT; ++ if (atomic_read(&conn->sess->tmf_active)) ++ bnx2i_wait_for_tmf_completion(conn->sess); ++ ++ /* Wait for any outstanding iscsi nopout to complete */ ++ count = 10; ++ while (count-- && cmnd->iscsi_opcode) ++ msleep(100); ++ if (cmnd->iscsi_opcode) ++ goto error; ++ ++ cmnd->iscsi_opcode = hdr->opcode; ++ smp_mb(); ++ atomic_set(&conn->sess->logout_pending, 1); ++ break; ++ case ISCSI_OP_NOOP_OUT: ++ conn->sess->last_nooput_requested = jiffies; ++ conn->sess->noopout_requested_count++; ++ /* connection is being logged out, do not allow NOOP */ ++ if (conn->state == CONN_STATE_IN_LOGOUT) ++ goto error; ++ ++ /* unsolicited iSCSI NOOP copy hdr into conn struct */ ++ memcpy(&conn->gen_pdu.nopout_hdr, (const void *) hdr, ++ sizeof(struct iscsi_hdr)); ++ cmnd->iscsi_opcode = hdr->opcode; ++ cmnd->ttt = ISCSI_RESERVED_TAG; ++ smp_mb(); ++ atomic_set(&conn->sess->login_noop_pending, 1); ++ break; ++ default: ++ ; ++ } ++ ++ if (atomic_read(&conn->worker_enabled)) { ++#ifdef __VMKLNX__ ++ printk("%s: cid %d [%d, %d], schedule tasklet, opcode %x\n", ++ __FUNCTION__, conn->ep->ep_iscsi_cid, ++ atomic_read(&conn->worker_enabled_cnt), ++ atomic_read(&conn->worker_disabled_cnt), ++ cmnd->iscsi_opcode); ++ tasklet_schedule(&conn->conn_tasklet); ++#else ++ shost = bnx2i_conn_get_shost(conn); ++ scsi_queue_work(shost, &conn->conn_worker); ++#endif ++ } ++ printk("%s: done!!\n", __FUNCTION__); ++ return 0; ++error: ++ printk("%s: failed to send pdu!!\n", __FUNCTION__); ++ return -EIO; ++} ++ ++ ++/** ++ * bnx2i_conn_get_stats - returns iSCSI stats ++ * ++ * @cls_conn: pointer to iscsi cls conn ++ * @stats: pointer to iscsi statistic struct ++ */ ++void bnx2i_conn_get_stats(struct iscsi_cls_conn *cls_conn, ++ struct iscsi_stats *stats) ++{ ++ struct bnx2i_conn *conn = (struct bnx2i_conn *) cls_conn->dd_data; ++ ++ stats->txdata_octets = conn->total_data_octets_sent; ++ stats->rxdata_octets = conn->total_data_octets_rcvd; ++ ++ stats->noptx_pdus = conn->num_nopin_pdus; ++ stats->scsicmd_pdus = conn->num_scsi_cmd_pdus; ++ stats->tmfcmd_pdus = conn->num_tmf_req_pdus; ++ stats->login_pdus = conn->num_login_req_pdus; ++ stats->text_pdus = 0; ++ stats->dataout_pdus = conn->num_dataout_pdus; ++ stats->logout_pdus = conn->num_logout_req_pdus; ++ stats->snack_pdus = 0; ++ ++ stats->noprx_pdus = conn->num_nopout_pdus; ++ stats->scsirsp_pdus = conn->num_scsi_resp_pdus; ++ stats->tmfrsp_pdus = conn->num_tmf_resp_pdus; ++ stats->textrsp_pdus = 0; ++ stats->datain_pdus = conn->num_datain_pdus; ++ stats->logoutrsp_pdus = conn->num_logout_resp_pdus; ++ stats->r2t_pdus = conn->num_r2t_pdus; ++ stats->async_pdus = conn->num_async_pdus; ++ stats->rjt_pdus = conn->num_reject_pdus; ++ ++ stats->digest_err = 0; ++ stats->timeout_err = 0; ++ stats->custom_length = 0; ++} ++ ++#ifdef __VMKLNX__ ++vmk_int32 bnx2i_get_570x_limit(enum iscsi_param param, ++ TransportParamLimit *limit, vmk_int32 maxListLen) ++{ ++ limit->param = param; ++ switch(param) { ++ case ISCSI_PARAM_MAX_SESSIONS: ++ limit->type = TRANPORT_LIMIT_TYPE_LIST; ++ limit->hasPreferred = VMK_TRUE; ++ limit->preferred = 64; ++ limit->limit.list.count = 1; ++ limit->limit.list.value[0] = 64; ++ break; ++ default: ++ limit->type = TRANPORT_LIMIT_TYPE_UNSUPPORTED; ++ break; ++ } ++ return 0; ++} ++ ++vmk_int32 bnx2i_get_5771x_limit(enum iscsi_param param, ++ TransportParamLimit *limit, ++ vmk_int32 maxListLen) ++{ ++ limit->param = param; ++ switch(param) { ++ case ISCSI_PARAM_MAX_SESSIONS: ++ limit->type = TRANPORT_LIMIT_TYPE_LIST; ++ limit->hasPreferred = VMK_TRUE; ++ limit->preferred = 64; ++ limit->limit.list.count = 1; ++ limit->limit.list.value[0] = 128; ++ break; ++ default: ++ limit->type = TRANPORT_LIMIT_TYPE_UNSUPPORTED; ++ break; ++ } ++ return 0; ++} ++#endif ++ ++ ++ ++/** ++ * bnx2i_check_nx2_dev_busy - this routine unregister devices if ++ * there are no active conns ++ */ ++void bnx2i_check_nx2_dev_busy(void) ++{ ++ bnx2i_unreg_dev_all(); ++} ++ ++ ++/** ++ * bnx2i_check_route - checks if target IP route belongs to one of ++ * NX2 devices ++ * ++ * @dst_addr: target IP address ++ * ++ * check if route resolves to BNX2 device ++ */ ++#ifdef __VMKLNX__ ++static struct bnx2i_hba *bnx2i_check_route(struct sockaddr *dst_addr, ++ vmk_IscsiNetHandle iscsiNetHandle) ++#else ++static struct bnx2i_hba *bnx2i_check_route(struct sockaddr *dst_addr) ++#endif ++{ ++ struct sockaddr_in *desti = (struct sockaddr_in *) dst_addr; ++ struct bnx2i_hba *hba; ++ struct cnic_dev *cnic = NULL; ++ ++ bnx2i_reg_dev_all(); ++ ++ hba = get_adapter_list_head(); ++ if (hba && hba->cnic) ++#ifdef __VMKLNX__ ++ cnic = hba->cnic->cm_select_dev(iscsiNetHandle, desti, CNIC_ULP_ISCSI); ++#else ++ cnic = hba->cnic->cm_select_dev(desti, CNIC_ULP_ISCSI); ++#endif ++ ++ if (!cnic) { ++ printk(KERN_ALERT "bnx2i: check route, can't connect using cnic\n"); ++ goto no_nx2_route; ++ } ++ hba = bnx2i_find_hba_for_cnic(cnic); ++ if (!hba) { ++ goto no_nx2_route; ++ } ++ ++ if (bnx2i_adapter_ready(hba)) { ++ printk(KERN_ALERT "bnx2i: check route, hba not found\n"); ++ goto no_nx2_route; ++ } ++ if (hba->netdev->mtu > hba->mtu_supported) { ++ printk(KERN_ALERT "bnx2i: %s network i/f mtu is set to %d\n", ++ hba->netdev->name, hba->netdev->mtu); ++ printk(KERN_ALERT "bnx2i: iSCSI HBA can support mtu of %d\n", ++ hba->mtu_supported); ++ goto no_nx2_route; ++ } ++ return hba; ++no_nx2_route: ++ return NULL; ++} ++ ++ ++/** ++ * bnx2i_tear_down_conn - tear down iscsi/tcp connection and free resources ++ * ++ * @hba: pointer to adapter instance ++ * @ep: endpoint (transport indentifier) structure ++ * ++ * destroys cm_sock structure and on chip iscsi context ++ */ ++static int bnx2i_tear_down_conn(struct bnx2i_hba *hba, ++ struct bnx2i_endpoint *ep) ++{ ++ if (test_bit(BNX2I_CNIC_REGISTERED, &hba->reg_with_cnic)) ++ hba->cnic->cm_destroy(ep->cm_sk); ++ ++ if (test_bit(ADAPTER_STATE_GOING_DOWN, &ep->hba->adapter_state)) ++ ep->state = EP_STATE_DISCONN_COMPL; ++ ++ if (test_bit(BNX2I_NX2_DEV_57710, &hba->cnic_dev_type) && ++ ep->state == EP_STATE_DISCONN_TIMEDOUT) { ++ printk(KERN_ALERT "bnx2i - WaTcH - please submit GRC Dump," ++ " NW/PCIe trace, driver msgs to developers" ++ " for analysis\n"); ++ return 1; ++ } ++ ++ ep->state = EP_STATE_CLEANUP_START; ++ init_timer(&ep->ofld_timer); ++ ep->ofld_timer.expires = hba->conn_ctx_destroy_tmo + jiffies; ++ ep->ofld_timer.function = bnx2i_ep_ofld_timer; ++ ep->ofld_timer.data = (unsigned long) ep; ++ add_timer(&ep->ofld_timer); ++ ++ bnx2i_ep_destroy_list_add(hba, ep); ++ ++ /* destroy iSCSI context, wait for it to complete */ ++ bnx2i_send_conn_destroy(hba, ep); ++ wait_event_interruptible(ep->ofld_wait, ++ (ep->state != EP_STATE_CLEANUP_START)); ++ ++ if (signal_pending(current)) ++ flush_signals(current); ++ del_timer_sync(&ep->ofld_timer); ++ bnx2i_ep_destroy_list_del(hba, ep); ++ ++ if (ep->state != EP_STATE_CLEANUP_CMPL) ++ /* should never happen */ ++ printk(KERN_ALERT "bnx2i - WaTcH: conn destroy failed\n"); ++ return 0; ++} ++ ++ ++/** ++ * bnx2i_ep_connect - establish TCP connection to target portal ++ * ++ * @dst_addr: target IP address ++ * @non_blocking: blocking or non-blocking call ++ * @ep_handle: placeholder to return new created endpoint handle ++ * ++ * this routine initiates the TCP/IP connection by invoking Option-2 i/f ++ * with l5_core and the CNIC. This is a multi-step process of resolving ++ * route to target, create a iscsi connection context, handshaking with ++ * CNIC module to create/initialize the socket struct and finally ++ * sending down option-2 request to complete TCP 3-way handshake ++ */ ++#ifdef __VMKLNX__ ++vmk_int32 bnx2i_ep_connect(struct sockaddr *dst_addr, vmk_int32 non_blocking, ++ vmk_uint64 *ep_handle, vmk_IscsiNetHandle iscsiNetHandle) ++#else ++int bnx2i_ep_connect(struct sockaddr *dst_addr, int non_blocking, ++ uint64_t *ep_handle) ++#endif ++{ ++ u32 iscsi_cid = BNX2I_CID_RESERVED; ++ struct sockaddr_in *desti; ++ struct sockaddr_in6 *desti6; ++ struct bnx2i_endpoint *endpoint; ++ struct bnx2i_hba *hba; ++ struct cnic_dev *cnic; ++ struct cnic_sockaddr saddr; ++ int rc = 0; ++ ++ /* check if the given destination can be reached through NX2 device */ ++#ifdef __VMKLNX__ ++ hba = bnx2i_check_route(dst_addr, iscsiNetHandle); ++#else ++ hba = bnx2i_check_route(dst_addr); ++#endif ++ if (!hba) { ++ rc = -ENOMEM; ++ goto check_busy; ++ } ++ ++ printk("%s: requested hba %p, state %lx\n", __FUNCTION__, hba, hba->adapter_state); ++ ++ cnic = hba->cnic; ++ endpoint = bnx2i_alloc_ep(hba); ++ if (!endpoint) { ++ *ep_handle = (uint64_t) 0; ++ rc = -ENOMEM; ++ goto check_busy; ++ } ++ ++ spin_lock(&hba->net_dev_lock); ++ ++ if (bnx2i_adapter_ready(hba)) { ++ rc = -EPERM; ++ goto net_if_down; ++ } ++ ++ endpoint->state = EP_STATE_IDLE; ++ endpoint->teardown_mode = BNX2I_ABORTIVE_SHUTDOWN; ++ endpoint->ep_iscsi_cid = (u16)ISCSI_RESERVED_TAG; ++ iscsi_cid = bnx2i_alloc_iscsi_cid(hba); ++ if (iscsi_cid == ISCSI_RESERVED_TAG) { ++ printk(KERN_ALERT "alloc_ep: unable to allocate iscsi cid\n"); ++ rc = -ENOMEM; ++ goto iscsi_cid_err; ++ } ++ endpoint->hba_age = hba->age; ++ ++ rc = bnx2i_alloc_qp_resc(hba, endpoint); ++ if (rc != 0) { ++ printk(KERN_ALERT "bnx2i: ep_conn, alloc QP resc error\n"); ++ rc = -ENOMEM; ++ goto qp_resc_err; ++ } ++ ++ endpoint->ep_iscsi_cid = iscsi_cid & 0xFFFF; ++ endpoint->state = EP_STATE_OFLD_START; ++ bnx2i_ep_ofld_list_add(hba, endpoint); ++ ++ init_timer(&endpoint->ofld_timer); ++ endpoint->ofld_timer.expires = 2 * HZ + jiffies; ++ endpoint->ofld_timer.function = bnx2i_ep_ofld_timer; ++ endpoint->ofld_timer.data = (unsigned long) endpoint; ++ add_timer(&endpoint->ofld_timer); ++ ++ bnx2i_send_conn_ofld_req(hba, endpoint); ++ ++ /* Wait for CNIC hardware to setup conn context and return 'cid' */ ++ wait_event_interruptible(endpoint->ofld_wait, ++ endpoint->state != EP_STATE_OFLD_START); ++ ++ if (signal_pending(current)) ++ flush_signals(current); ++ del_timer_sync(&endpoint->ofld_timer); ++ bnx2i_ep_ofld_list_del(hba, endpoint); ++ ++ if (endpoint->state != EP_STATE_OFLD_COMPL) { ++ rc = -ENOSPC; ++ goto conn_failed; ++ } ++ ++ if (!test_bit(BNX2I_CNIC_REGISTERED, &hba->reg_with_cnic)) { ++ rc = -EINVAL; ++ goto conn_failed; ++ } else ++ rc = cnic->cm_create(cnic, CNIC_ULP_ISCSI, endpoint->ep_cid, ++ iscsi_cid, &endpoint->cm_sk, endpoint); ++ if (rc) { ++ rc = -EINVAL; ++ goto conn_failed; ++ } ++ ++ endpoint->cm_sk->rcv_buf = tcp_buf_size * 1024; ++ endpoint->cm_sk->snd_buf = tcp_buf_size * 1024; ++ if (!en_tcp_dack) ++ endpoint->cm_sk->tcp_flags |= SK_TCP_NO_DELAY_ACK; ++ if (time_stamps) ++ endpoint->cm_sk->tcp_flags |= SK_TCP_TIMESTAMP; ++ ++ memset(&saddr, 0, sizeof(saddr)); ++ ++ if (dst_addr->sa_family == AF_INET) { ++ desti = (struct sockaddr_in *) dst_addr; ++ saddr.remote.v4 = *desti; ++ saddr.local.v4.sin_port = htons(endpoint->tcp_port); ++ saddr.local.v4.sin_family = desti->sin_family; ++ } else if (dst_addr->sa_family == AF_INET6) { ++ desti6 = (struct sockaddr_in6 *) dst_addr; ++ saddr.remote.v6 = *desti6; ++ saddr.local.v6.sin6_port = htons(endpoint->tcp_port); ++ saddr.local.v6.sin6_family = desti6->sin6_family; ++ } ++ ++ endpoint->timestamp = jiffies; ++ endpoint->state = EP_STATE_CONNECT_START; ++ if (!test_bit(BNX2I_CNIC_REGISTERED, &hba->reg_with_cnic)) { ++ rc = -EINVAL; ++ goto conn_failed; ++ } else ++ rc = cnic->cm_connect(endpoint->cm_sk, &saddr); ++ ++ if (rc) ++ goto release_ep; ++ ++ bnx2i_map_ep_dbell_regs(endpoint); ++ *ep_handle = (uint64_t) (unsigned long) endpoint; ++ spin_unlock(&hba->net_dev_lock); ++ ++ /* ++ * unregister idle devices, without this user can't uninstall ++ * unused bnx2/bnx2x driver because registration will increment ++ * the usage count ++ */ ++ bnx2i_check_nx2_dev_busy(); ++ ++ return 0; ++ ++release_ep: ++ bnx2i_tear_down_conn(hba, endpoint); ++conn_failed: ++net_if_down: ++iscsi_cid_err: ++ bnx2i_free_qp_resc(hba, endpoint); ++qp_resc_err: ++ bnx2i_free_ep(endpoint); ++ spin_unlock(&hba->net_dev_lock); ++check_busy: ++ *ep_handle = (uint64_t) 0; ++ bnx2i_check_nx2_dev_busy(); ++ return rc; ++} ++ ++ ++/** ++ * bnx2i_ep_poll - polls for TCP connection establishement ++ * ++ * @ep_handle: TCP connection (endpoint) handle ++ * @timeout_ms: timeout value in milli secs ++ * ++ * polls for TCP connect request to complete ++ */ ++#ifdef __VMKLNX__ ++vmk_int32 bnx2i_ep_poll(vmk_uint64 ep_handle, vmk_int32 timeout_ms) ++#else ++int bnx2i_ep_poll(uint64_t ep_handle, int timeout_ms) ++#endif ++{ ++ struct bnx2i_endpoint *ep; ++ int rc = 0; ++ ++ ep = (struct bnx2i_endpoint *) (unsigned long) ep_handle; ++ if (!ep || (ep_handle == -1)) ++ return -EINVAL; ++ ++ if ((ep->state == EP_STATE_IDLE) || ++ (ep->state == EP_STATE_CONNECT_FAILED) || ++ (ep->state == EP_STATE_OFLD_FAILED)) ++ return -1; ++ ++ if (ep->state == EP_STATE_CONNECT_COMPL) ++ return 1; ++ ++ rc = wait_event_interruptible_timeout(ep->ofld_wait, ++ ((ep->state == ++ EP_STATE_OFLD_FAILED) || ++ (ep->state == ++ EP_STATE_CONNECT_FAILED) || ++ (ep->state == ++ EP_STATE_CONNECT_COMPL)), ++ msecs_to_jiffies(timeout_ms)); ++ if (ep->state == EP_STATE_OFLD_FAILED) ++ rc = -1; ++ ++ if (rc > 0) ++ return 1; ++ else if (!rc) ++ return 0; /* timeout */ ++ else ++ return rc; ++} ++ ++/** ++ * bnx2i_ep_tcp_conn_active - check EP state transition to check ++ * if underlying TCP connection is active ++ * ++ * @ep: endpoint pointer ++ * ++ */ ++static int bnx2i_ep_tcp_conn_active(struct bnx2i_endpoint *ep) ++{ ++ int ret; ++ ++ switch (ep->state) { ++ case EP_STATE_CONNECT_START: ++ case EP_STATE_CLEANUP_FAILED: ++ case EP_STATE_OFLD_FAILED: ++ case EP_STATE_DISCONN_TIMEDOUT: ++ ret = 0; ++ break; ++ case EP_STATE_CONNECT_COMPL: ++ case EP_STATE_ULP_UPDATE_START: ++ case EP_STATE_ULP_UPDATE_COMPL: ++ case EP_STATE_TCP_FIN_RCVD: ++ case EP_STATE_ULP_UPDATE_FAILED: ++ ret = 1; ++ break; ++ case EP_STATE_TCP_RST_RCVD: ++ ret = 0; ++ break; ++ case EP_STATE_CONNECT_FAILED: ++ if (test_bit(BNX2I_NX2_DEV_57710, &ep->hba->cnic_dev_type)) ++ ret = 1; ++ else ++ ret = 0; ++ break; ++ default: ++ ret = 0; ++ } ++ ++ return ret; ++} ++ ++/** ++ * bnx2i_ep_disconnect - executes TCP connection teardown process ++ * ++ * @ep_handle: TCP connection (endpoint) handle ++ * ++ * executes TCP connection teardown process ++ */ ++#ifdef __VMKLNX__ ++void bnx2i_ep_disconnect(vmk_int64 ep_handle) ++#else ++void bnx2i_ep_disconnect(uint64_t ep_handle) ++#endif ++{ ++ struct bnx2i_endpoint *ep; ++ struct cnic_dev *cnic; ++ struct bnx2i_hba *hba; ++ struct bnx2i_sess *sess; ++ ++ ep = (struct bnx2i_endpoint *) (unsigned long) ep_handle; ++ if (!ep || (ep_handle == -1)) ++ return; ++ ++ while ((ep->state == EP_STATE_CONNECT_START) && ++ !time_after(jiffies, ep->timestamp + (12 * HZ))) ++ msleep(250); ++ ++ hba = ep->hba; ++ if (ep->state == EP_STATE_IDLE) ++ goto return_ep; ++ cnic = hba->cnic; ++ ++ printk("%s: disconnecting ep %p, hba %p, hba-state %lx\n", ++ __FUNCTION__, ep, hba, hba->adapter_state); ++ spin_lock(&hba->net_dev_lock); ++ if (!test_bit(ADAPTER_STATE_UP, &hba->adapter_state)) ++ goto free_resc; ++ if (ep->hba_age != hba->age) ++ goto dev_reset; ++ ++ if (!bnx2i_ep_tcp_conn_active(ep)) ++ goto destory_conn; ++ ++ ep->state = EP_STATE_DISCONN_START; ++ ++ init_timer(&ep->ofld_timer); ++ ep->ofld_timer.expires = hba->conn_teardown_tmo + jiffies; ++ ep->ofld_timer.function = bnx2i_ep_ofld_timer; ++ ep->ofld_timer.data = (unsigned long) ep; ++ add_timer(&ep->ofld_timer); ++ ++ if (test_bit(BNX2I_CNIC_REGISTERED, &hba->reg_with_cnic)) { ++ if (ep->teardown_mode == BNX2I_GRACEFUL_SHUTDOWN) ++ cnic->cm_close(ep->cm_sk); ++ else ++ cnic->cm_abort(ep->cm_sk); ++ } else ++ goto free_resc; ++ ++ /* wait for option-2 conn teardown */ ++ wait_event_interruptible(ep->ofld_wait, ++ ep->state != EP_STATE_DISCONN_START); ++ ++ if (signal_pending(current)) ++ flush_signals(current); ++ del_timer_sync(&ep->ofld_timer); ++ ++destory_conn: ++ if (bnx2i_tear_down_conn(hba, ep)) { ++ spin_unlock(&hba->net_dev_lock); ++ return; ++ } ++ ++dev_reset: ++ /* in case of 3-way handshake failure, there won't be any binding ++ * between EP and SESS ++ */ ++ if (ep->sess) ++ bnx2i_flush_cmd_queue(ep->sess, NULL, DID_BUS_BUSY, 0); ++ ++free_resc: ++ spin_unlock(&hba->net_dev_lock); ++ bnx2i_free_qp_resc(hba, ep); ++return_ep: ++ /* check if session recovery in progress */ ++ sess = ep->sess; ++ bnx2i_free_ep(ep); ++ if (sess) { ++ sess->state = BNX2I_SESS_INITIAL; ++ wake_up(&sess->er_wait); ++ } ++ wake_up_interruptible(&hba->eh_wait); ++ ++ if (!hba->ofld_conns_active) ++ bnx2i_check_nx2_dev_busy(); ++ ++ printk("%s: ep %p, destroyed\n", __FUNCTION__, ep); ++ return; ++} ++ ++ ++int bnx2i_check_ioctl_signature(struct bnx2i_ioctl_header *ioc_hdr) ++{ ++ if (strcmp(ioc_hdr->signature, BNX2I_MGMT_SIGNATURE)) ++ return -EPERM; ++ return 0; ++} ++ ++static int bnx2i_tcp_port_count_ioctl(struct file *file, unsigned long arg) ++{ ++ struct bnx2i_get_port_count __user *user_ioc = ++ (struct bnx2i_get_port_count __user *)arg; ++ struct bnx2i_get_port_count ioc_req; ++ int error = 0; ++ unsigned int count = 0; ++ ++ if (copy_from_user(&ioc_req, user_ioc, sizeof(ioc_req))) { ++ error = -EFAULT; ++ goto out; ++ } ++ ++ error = bnx2i_check_ioctl_signature(&ioc_req.hdr); ++ if (error) ++ goto out; ++ ++ if (bnx2i_tcp_port_tbl.num_free_ports < 10 && ++ bnx2i_tcp_port_tbl.num_required) { ++ if (bnx2i_tcp_port_tbl.num_required < 32) ++ count = bnx2i_tcp_port_tbl.num_required; ++ else ++ count = 32; ++ } ++ ++ ioc_req.port_count = count; ++ ++ if (copy_to_user(&user_ioc->port_count, &ioc_req.port_count, ++ sizeof(ioc_req.port_count))) { ++ error = -EFAULT; ++ goto out; ++ } ++ ++out: ++ return error; ++} ++ ++ ++static int bnx2i_tcp_port_ioctl(struct file *file, unsigned long arg) ++{ ++ struct bnx2i_set_port_num __user *user_ioc = ++ (struct bnx2i_set_port_num __user *)arg; ++ struct bnx2i_set_port_num ioc_req; ++ struct bnx2i_set_port_num *ioc_req_mp = NULL; ++ int ioc_msg_size = sizeof(ioc_req); ++ int error; ++ int i; ++ ++ if (copy_from_user(&ioc_req, user_ioc, ioc_msg_size)) { ++ error = -EFAULT; ++ goto out; ++ } ++ ++ error = bnx2i_check_ioctl_signature(&ioc_req.hdr); ++ if (error) ++ goto out; ++ ++ if (ioc_req.num_ports > 1) { ++ ioc_msg_size += (ioc_req.num_ports - 1) * ++ sizeof(ioc_req.tcp_port[0]); ++ ++ ioc_req_mp = kmalloc(ioc_msg_size, GFP_KERNEL); ++ if (!ioc_req_mp) ++ goto out; ++ ++ if (copy_from_user(ioc_req_mp, user_ioc, ioc_msg_size)) { ++ error = -EFAULT; ++ goto out_kfree; ++ } ++ } ++ ++ if (ioc_req.num_ports) ++ bnx2i_tcp_port_new_entry(ioc_req.tcp_port[0]); ++ ++ i = 1; ++ while (i < ioc_req_mp->num_ports) ++ bnx2i_tcp_port_new_entry(ioc_req_mp->tcp_port[i++]); ++ ++ return 0; ++ ++out_kfree: ++ kfree(ioc_req_mp); ++out: ++ return error; ++} ++ ++ ++/* ++ * bnx2i_ioctl_init: initialization routine, registers char driver ++ */ ++int bnx2i_ioctl_init(void) ++{ ++ int ret; ++ ++ /* Register char device node */ ++ ret = register_chrdev(0, "bnx2i", &bnx2i_mgmt_fops); ++ ++ if (ret < 0) { ++ printk(KERN_ERR "bnx2i: failed to register device node\n"); ++ return ret; ++ } ++ ++ bnx2i_major_no = ret; ++ ++ return 0; ++} ++ ++void bnx2i_ioctl_cleanup(void) ++{ ++ if (bnx2i_major_no) { ++ unregister_chrdev(bnx2i_major_no, "bnx2i"); ++ } ++} ++ ++/* ++ * bnx2i_mgmt_open - "open" entry point ++ */ ++static int bnx2i_mgmt_open(struct inode *inode, struct file *filep) ++{ ++ /* only allow access to admin user */ ++ if (!capable(CAP_SYS_ADMIN)) { ++ return -EACCES; ++ } ++ ++ return 0; ++} ++ ++/* ++ * bnx2i_mgmt_release- "release" entry point ++ */ ++static int bnx2i_mgmt_release(struct inode *inode, struct file *filep) ++{ ++ return 0; ++} ++ ++ ++ ++/* ++ * bnx2i_mgmt_ioctl - char driver ioctl entry point ++ */ ++static int bnx2i_mgmt_ioctl(struct inode *node, struct file *file, ++ unsigned int cmd, unsigned long arg) ++{ ++ long rc = 0; ++ switch (cmd) { ++ case BNX2I_IOCTL_GET_PORT_REQ: ++ rc = bnx2i_tcp_port_count_ioctl(file, arg); ++ break; ++ case BNX2I_IOCTL_SET_TCP_PORT: ++ rc = bnx2i_tcp_port_ioctl(file, arg); ++ break; ++ default: ++ printk(KERN_ERR "bnx2i: unknown ioctl cmd %x\n", cmd); ++ return -ENOTTY; ++ } ++ ++ return rc; ++} ++ ++ ++#ifdef CONFIG_COMPAT ++ ++static int bnx2i_tcp_port_count_compat_ioctl(struct file *file, unsigned long arg) ++{ ++ struct bnx2i_get_port_count __user *user_ioc = ++ (struct bnx2i_get_port_count __user *)arg; ++ struct bnx2i_get_port_count *ioc_req = ++ compat_alloc_user_space(sizeof(struct bnx2i_get_port_count)); ++ int error; ++ unsigned int count = 0; ++ ++ if (clear_user(ioc_req, sizeof(*ioc_req))) ++ return -EFAULT; ++ ++ if (copy_in_user(ioc_req, user_ioc, sizeof(*ioc_req))) { ++ error = -EFAULT; ++ goto out; ++ } ++ ++ error = bnx2i_check_ioctl_signature(&ioc_req->hdr); ++ if (error) ++ goto out; ++ ++ if (bnx2i_tcp_port_tbl.num_free_ports < 10 && ++ bnx2i_tcp_port_tbl.num_required) { ++ if (bnx2i_tcp_port_tbl.num_required < 32) ++ count = bnx2i_tcp_port_tbl.num_required; ++ else ++ count = 32; ++ } ++ ++ if (copy_to_user(&ioc_req->port_count, &count, ++ sizeof(ioc_req->port_count))) { ++ error = -EFAULT; ++ goto out; ++ } ++ ++ if (copy_in_user(&user_ioc->port_count, &ioc_req->port_count, ++ sizeof(u32))) { ++ error = -EFAULT; ++ goto out; ++ } ++ return 0; ++ ++out: ++ return error; ++} ++ ++static int bnx2i_tcp_port_compat_ioctl(struct file *file, unsigned long arg) ++{ ++ struct bnx2i_set_port_num __user *user_ioc = ++ (struct bnx2i_set_port_num __user *)arg; ++ struct bnx2i_set_port_num *ioc_req = ++ compat_alloc_user_space(sizeof(struct bnx2i_set_port_num)); ++ struct bnx2i_set_port_num *ioc_req_mp = NULL; ++ int ioc_msg_size = sizeof(*ioc_req); ++ int error; ++ int i; ++ ++ if (clear_user(ioc_req, sizeof(*ioc_req))) ++ return -EFAULT; ++ ++ if (copy_in_user(ioc_req, user_ioc, ioc_msg_size)) { ++ error = -EFAULT; ++ goto out; ++ } ++ ++ error = bnx2i_check_ioctl_signature(&ioc_req->hdr); ++ if (error) ++ goto out; ++ ++ if (ioc_req->num_ports > 1) { ++ ioc_msg_size += (ioc_req->num_ports - 1) * ++ sizeof(ioc_req->tcp_port[0]); ++ ++ ioc_req_mp = compat_alloc_user_space(ioc_msg_size); ++ if (!ioc_req_mp) ++ goto out; ++ ++ if (copy_in_user(ioc_req_mp, user_ioc, ioc_msg_size)) { ++ error = -EFAULT; ++ goto out; ++ } ++ ++ i = 0; ++ while ((i < ioc_req_mp->num_ports) && ioc_req_mp) ++ bnx2i_tcp_port_new_entry(ioc_req_mp->tcp_port[i++]); ++ ++ } else if (ioc_req->num_ports == 1) ++ bnx2i_tcp_port_new_entry(ioc_req->tcp_port[0]); ++ ++out: ++ return error; ++ ++ ++} ++ ++ ++/* ++ * bnx2i_mgmt_compat_ioctl - char node ioctl entry point ++ */ ++static long bnx2i_mgmt_compat_ioctl(struct file *file, ++ unsigned int cmd, unsigned long arg) ++{ ++ int rc = -ENOTTY; ++ ++ switch (cmd) { ++ case BNX2I_IOCTL_GET_PORT_REQ: ++ rc = bnx2i_tcp_port_count_compat_ioctl(file, arg); ++ break; ++ case BNX2I_IOCTL_SET_TCP_PORT: ++ rc = bnx2i_tcp_port_compat_ioctl(file, arg); ++ break; ++ } ++ ++ return rc; ++} ++ ++#endif ++ ++/* ++ * File operations structure - management interface ++ */ ++struct file_operations bnx2i_mgmt_fops = { ++ .owner = THIS_MODULE, ++ .open = bnx2i_mgmt_open, ++ .release = bnx2i_mgmt_release, ++ .ioctl = bnx2i_mgmt_ioctl, ++#ifdef CONFIG_COMPAT ++ .compat_ioctl = bnx2i_mgmt_compat_ioctl, ++#endif ++}; ++ ++ ++/* ++ * 'Scsi_Host_Template' structure and 'iscsi_tranport' structure template ++ * used while registering with the iSCSI trnaport module. ++ */ ++struct scsi_host_template bnx2i_host_template = { ++ .module = THIS_MODULE, ++ .name = "Broadcom Offload iSCSI Initiator", ++ .queuecommand = bnx2i_queuecommand, ++ .eh_abort_handler = bnx2i_abort, ++ .eh_host_reset_handler = bnx2i_host_reset, ++ .bios_param = NULL, ++#ifdef __VMKLNX__ ++ .eh_device_reset_handler = bnx2i_device_reset, ++ .slave_configure = bnx2i_slave_configure, ++ .slave_alloc = bnx2i_slave_alloc, ++ .target_alloc = bnx2i_target_alloc, ++ .target_destroy = bnx2i_target_destroy, ++ .can_queue = 1024, ++#else ++ .can_queue = 128, ++#endif ++ .max_sectors = 127, ++ .this_id = -1, ++ .cmd_per_lun = 64, ++ .use_clustering = ENABLE_CLUSTERING, ++ .sg_tablesize = ISCSI_MAX_BDS_PER_CMD, ++ .proc_name = NULL ++ }; ++ ++ ++ ++struct iscsi_transport bnx2i_iscsi_transport = { ++ .owner = THIS_MODULE, ++ .name = "bnx2i", ++ .caps = CAP_RECOVERY_L0 | CAP_HDRDGST | CAP_MULTI_R2T ++#ifdef __VMKLNX__ ++ | CAP_KERNEL_POLL | CAP_SESSION_PERSISTENT ++#endif ++ | CAP_DATADGST, ++ .param_mask = ISCSI_MAX_RECV_DLENGTH | ++ ISCSI_MAX_XMIT_DLENGTH | ++ ISCSI_HDRDGST_EN | ++ ISCSI_DATADGST_EN | ++ ISCSI_INITIAL_R2T_EN | ++ ISCSI_MAX_R2T | ++ ISCSI_IMM_DATA_EN | ++ ISCSI_FIRST_BURST | ++ ISCSI_MAX_BURST | ++ ISCSI_PDU_INORDER_EN | ++ ISCSI_DATASEQ_INORDER_EN | ++ ISCSI_ERL | ++ ISCSI_CONN_PORT | ++ ISCSI_CONN_ADDRESS | ++ ISCSI_EXP_STATSN | ++ ISCSI_PERSISTENT_PORT | ++ ISCSI_PERSISTENT_ADDRESS | ++ ISCSI_TARGET_NAME | ++ ISCSI_TPGT, ++ .host_template = &bnx2i_host_template, ++ .sessiondata_size = sizeof(struct bnx2i_sess), ++ .conndata_size = sizeof(struct bnx2i_conn), ++ .max_conn = 1, ++ .max_cmd_len = 16, ++ .max_lun = 512, ++#ifdef __VMKLNX__ ++ .create_session_persistent = bnx2i_session_create_vmp, ++ .create_session = bnx2i_session_create_vm, ++#else ++ .create_session = bnx2i_session_create, ++#endif ++ .destroy_session = bnx2i_session_destroy, ++ .create_conn = bnx2i_conn_create, ++ .bind_conn = bnx2i_conn_bind, ++ .destroy_conn = bnx2i_conn_destroy, ++ .set_param = bnx2i_conn_set_param, ++ .get_conn_param = bnx2i_conn_get_param, ++ .get_session_param = bnx2i_session_get_param, ++ .start_conn = bnx2i_conn_start, ++ .stop_conn = bnx2i_conn_stop, ++ .send_pdu = bnx2i_conn_send_pdu, ++ .get_stats = bnx2i_conn_get_stats, ++#ifdef __VMKLNX__ ++ /* TCP connect - disconnect - option-2 interface calls */ ++ .ep_connect = NULL, ++ .ep_connect_extended = bnx2i_ep_connect, ++#else ++ .ep_connect = bnx2i_ep_connect, ++#endif ++ .ep_poll = bnx2i_ep_poll, ++ .ep_disconnect = bnx2i_ep_disconnect, ++ /* Error recovery timeout call */ ++ .session_recovery_timedout = bnx2i_sess_recovery_timeo ++}; +diff -r 14194bd97e8c drivers/scsi/bnx2i/bnx2i_sysfs.c +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/scsi/bnx2i/bnx2i_sysfs.c Tue Jun 16 11:09:42 2009 +0100 +@@ -0,0 +1,214 @@ ++/* bnx2i_sysfs.c: Broadcom NetXtreme II iSCSI driver. ++ * ++ * Copyright (c) 2006 - 2009 Broadcom Corporation ++ * ++ * 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. ++ * ++ * Written by: Anil Veerabhadrappa (anilgv@broadcom.com) ++ */ ++ ++#include "bnx2i.h" ++#include ++ ++#ifdef _SYSFS_INCL_ ++ ++#define BNX2I_SYSFS_VERSION 0x2 ++ ++ ++static ssize_t bnx2i_show_net_if_name(struct class_device *cdev, char *buf) ++{ ++ struct bnx2i_hba *hba = ++ container_of(cdev, struct bnx2i_hba, class_dev); ++ ++ return sprintf(buf, "%s\n", hba->netdev->name); ++} ++ ++static ssize_t bnx2i_show_sq_info(struct class_device *cdev, char *buf) ++{ ++ struct bnx2i_hba *hba = ++ container_of(cdev, struct bnx2i_hba, class_dev); ++ ++ return sprintf(buf, "0x%x\n", hba->max_sqes); ++} ++ ++static ssize_t bnx2i_set_sq_info(struct class_device *cdev, ++ const char *buf, size_t count) ++{ ++ struct bnx2i_hba *hba = ++ container_of(cdev, struct bnx2i_hba, class_dev); ++ u32 val; ++ int max_sq_size; ++ ++ if (test_bit(BNX2I_NX2_DEV_57710, &hba->cnic_dev_type)) ++ max_sq_size = BNX2I_5770X_SQ_WQES_MAX; ++ else ++ max_sq_size = BNX2I_570X_SQ_WQES_MAX; ++ ++ if (sscanf(buf, " 0x%x ", &val) > 0) { ++ if ((val >= BNX2I_SQ_WQES_MIN) && (val <= max_sq_size )) ++ hba->max_sqes = val; ++ } ++ return count; ++} ++ ++static ssize_t bnx2i_show_rq_info(struct class_device *cdev, char *buf) ++{ ++ struct bnx2i_hba *hba = ++ container_of(cdev, struct bnx2i_hba, class_dev); ++ ++ return sprintf(buf, "0x%x\n", hba->max_rqes); ++} ++ ++static ssize_t bnx2i_set_rq_info(struct class_device *cdev, const char *buf, ++ size_t count) ++{ ++ u32 val; ++ struct bnx2i_hba *hba = ++ container_of(cdev, struct bnx2i_hba, class_dev); ++ ++ if (sscanf(buf, " 0x%x ", &val) > 0) { ++ if ((val >= BNX2I_RQ_WQES_MIN) && ++ (val <= BNX2I_RQ_WQES_MAX)) { ++ hba->max_rqes = val; ++ } ++ } ++ return count; ++} ++ ++ ++static ssize_t bnx2i_show_ccell_info(struct class_device *cdev, char *buf) ++{ ++ struct bnx2i_hba *hba = ++ container_of(cdev, struct bnx2i_hba, class_dev); ++ ++ return sprintf(buf, "0x%x\n", hba->num_ccell); ++} ++ ++static ssize_t bnx2i_set_ccell_info(struct class_device *cdev, ++ const char *buf, size_t count) ++{ ++ u32 val; ++ struct bnx2i_hba *hba = ++ container_of(cdev, struct bnx2i_hba, class_dev); ++ ++ if (sscanf(buf, " 0x%x ", &val) > 0) { ++ if ((val >= BNX2I_CCELLS_MIN) && ++ (val <= BNX2I_CCELLS_MAX)) { ++ hba->num_ccell = val; ++ } ++ } ++ return count; ++} ++ ++ ++static ssize_t bnx2i_read_pci_trigger_reg(struct class_device *cdev, ++ char *buf) ++{ ++ u32 reg_val; ++ struct bnx2i_hba *hba = ++ container_of(cdev, struct bnx2i_hba, class_dev); ++ ++ if (!hba->regview) ++ return 0; ++ ++#define PCI_EVENT_TRIGGER_REG 0xCAC /* DMA WCHAN STAT10 REG */ ++ reg_val = readl(hba->regview + PCI_EVENT_TRIGGER_REG); ++ return sprintf(buf, "0x%x\n", reg_val); ++} ++ ++ ++static CLASS_DEVICE_ATTR (net_if_name, S_IRUGO, ++ bnx2i_show_net_if_name, NULL); ++static CLASS_DEVICE_ATTR (sq_size, S_IRUGO | S_IWUSR, ++ bnx2i_show_sq_info, bnx2i_set_sq_info); ++static CLASS_DEVICE_ATTR (rq_size, S_IRUGO | S_IWUSR, ++ bnx2i_show_rq_info, bnx2i_set_rq_info); ++static CLASS_DEVICE_ATTR (num_ccell, S_IRUGO | S_IWUSR, ++ bnx2i_show_ccell_info, bnx2i_set_ccell_info); ++static CLASS_DEVICE_ATTR (pci_trigger, S_IRUGO, ++ bnx2i_read_pci_trigger_reg, NULL); ++ ++ ++static struct class_device_attribute *bnx2i_class_attributes[] = { ++ &class_device_attr_net_if_name, ++ &class_device_attr_sq_size, ++ &class_device_attr_rq_size, ++ &class_device_attr_num_ccell, ++ &class_device_attr_pci_trigger, ++}; ++ ++static void bnx2i_sysfs_release(struct class_device *class_dev) ++{ ++} ++ ++struct class_device port_class_dev; ++ ++ ++static struct class bnx2i_class = { ++ .name = "bnx2i", ++ .release = bnx2i_sysfs_release, ++}; ++ ++int bnx2i_register_sysfs(struct bnx2i_hba *hba) ++{ ++ struct class_device *class_dev = &hba->class_dev; ++ char dev_name[BUS_ID_SIZE]; ++ struct ethtool_drvinfo drv_info; ++ u32 bus_no; ++ u32 dev_no; ++ u32 func_no; ++ u32 extra; ++ int ret; ++ int i; ++ ++ if (hba->cnic && hba->cnic->netdev) { ++ hba->cnic->netdev->ethtool_ops->get_drvinfo(hba->cnic->netdev, ++ &drv_info); ++ sscanf(drv_info.bus_info, "%x:%x:%x.%d", ++ &extra, &bus_no, &dev_no, &func_no); ++ } ++ class_dev->class = &bnx2i_class; ++ class_dev->class_data = hba; ++ snprintf(dev_name, BUS_ID_SIZE, "%.2x:%.2x.%.1x", ++ bus_no, dev_no, func_no); ++ strlcpy(class_dev->class_id, dev_name, BUS_ID_SIZE); ++ ++ ret = class_device_register(class_dev); ++ if (ret) ++ goto err; ++ ++ for (i = 0; i < ARRAY_SIZE(bnx2i_class_attributes); ++i) { ++ ret = class_device_create_file(class_dev, ++ bnx2i_class_attributes[i]); ++ if (ret) ++ goto err_unregister; ++ } ++ ++ return 0; ++ ++err_unregister: ++ class_device_unregister(class_dev); ++err: ++ return ret; ++} ++ ++void bnx2i_unregister_sysfs(struct bnx2i_hba *hba) ++{ ++ class_device_unregister(&hba->class_dev); ++} ++ ++int bnx2i_sysfs_setup(void) ++{ ++ int ret; ++ ret = class_register(&bnx2i_class); ++ return ret; ++} ++ ++void bnx2i_sysfs_cleanup(void) ++{ ++ class_unregister(&bnx2i_class); ++} ++ ++#endif diff --git a/master/bnx2x-1.50.8 b/master/bnx2x-1.50.8 new file mode 100644 index 0000000..e14abf3 --- /dev/null +++ b/master/bnx2x-1.50.8 @@ -0,0 +1,84186 @@ +diff -r ddb96c0bbe13 drivers/net/Makefile +--- a/drivers/net/Makefile Tue Jun 16 11:03:28 2009 +0100 ++++ b/drivers/net/Makefile Tue Jun 16 13:15:30 2009 +0100 +@@ -71,7 +71,7 @@ + obj-$(CONFIG_CNIC) += cnic.o + CFLAGS_cnic.o += -DHAVE_LE32 -DHAVE_IP_HDR -DNEW_SKB + obj-$(CONFIG_BNX2X) += bnx2x.o +-bnx2x-objs := bnx2x_main.o bnx2x_link.o ++bnx2x-objs := bnx2x_main.o bnx2x_link.o bnx2x_init_values_e1.o bnx2x_init_values_e1h.o + spidernet-y += spider_net.o spider_net_ethtool.o + obj-$(CONFIG_SPIDER_NET) += spidernet.o sungem_phy.o + obj-$(CONFIG_GELIC_NET) += ps3_gelic.o +diff -r ddb96c0bbe13 drivers/net/bnx2x.h +--- a/drivers/net/bnx2x.h Tue Jun 16 11:03:28 2009 +0100 ++++ b/drivers/net/bnx2x.h Tue Jun 16 13:15:30 2009 +0100 +@@ -24,6 +24,45 @@ + #define BCM_VLAN 1 + #endif + ++#if (LINUX_VERSION_CODE >= 0x020610) /* ! BNX2X_UPSTREAM */ ++#define BCM_CNIC ++#endif ++ ++#if ((LINUX_VERSION_CODE >= 0x020617) && !defined(NETIF_F_MULTI_QUEUE)) /* BNX2X_UPSTREAM */ ++#define BNX2X_MULTI_QUEUE ++#endif ++ ++#if (LINUX_VERSION_CODE >= 0x020618) || defined(__VMKLNX__) /* BNX2X_UPSTREAM */ ++#define BNX2X_NEW_NAPI ++#endif ++ ++#if defined(BNX2X_MULTI_QUEUE) && !defined(__VMKLNX__) /* ! BNX2X_UPSTREAM */ ++#define BNX2X_SAFC ++#endif ++ ++#ifdef __VMKLNX__ /* ! BNX2X_UPSTREAM */ ++#if (VMWARE_ESX_DDK_VERSION < 40000) ++#define __NO_TPA__ 1 ++#else ++#define BCM_CNIC ++#define BNX2X_MULTI_QUEUE ++#endif ++#define KERN_CONT KERN_INFO ++#endif ++ ++#if (LINUX_VERSION_CODE > 0x02061e) /* BNX2X_UPSTREAM */ ++#include ++#endif ++#ifndef BNX2X_UPSTREAM /* ! BNX2X_UPSTREAM */ ++#include "bnx2x_compat.h" ++#endif ++#ifdef BCM_CNIC /* ! BNX2X_UPSTREAM */ ++#include "../../bnx2/src/cnic_drv.h" ++#endif ++#include "bnx2x_reg.h" ++#include "bnx2x_fw_defs.h" ++#include "bnx2x_hsi.h" ++#include "bnx2x_link.h" + + /* error/debug prints */ + +@@ -61,6 +100,10 @@ + bp->dev ? (bp->dev->name) : "?", ##__args); \ + } while (0) + ++#define BNX2X_ERROR(__fmt, __args...) do { \ ++ printk(KERN_ERR "[%s:%d]" __fmt, __func__, __LINE__, ##__args); \ ++ } while (0) ++ + /* before we have a dev->name use dev_info() */ + #define BNX2X_DEV_INFO(__fmt, __args...) do { \ + if (bp->msglevel & NETIF_MSG_PROBE) \ +@@ -77,6 +120,7 @@ + } while (0) + #else + #define bnx2x_panic() do { \ ++ bp->panic = 1; \ + BNX2X_ERR("driver assert\n"); \ + bnx2x_panic_dump(bp); \ + } while (0) +@@ -92,12 +136,10 @@ + + #define REG_RD(bp, offset) readl(REG_ADDR(bp, offset)) + #define REG_RD8(bp, offset) readb(REG_ADDR(bp, offset)) +-#define REG_RD64(bp, offset) readq(REG_ADDR(bp, offset)) + + #define REG_WR(bp, offset, val) writel((u32)val, REG_ADDR(bp, offset)) + #define REG_WR8(bp, offset, val) writeb((u8)val, REG_ADDR(bp, offset)) + #define REG_WR16(bp, offset, val) writew((u16)val, REG_ADDR(bp, offset)) +-#define REG_WR32(bp, offset, val) REG_WR(bp, offset, val) + + #define REG_RD_IND(bp, offset) bnx2x_reg_rd_ind(bp, offset) + #define REG_WR_IND(bp, offset, val) bnx2x_reg_wr_ind(bp, offset, val) +@@ -105,20 +147,31 @@ + #define REG_RD_DMAE(bp, offset, valp, len32) \ + do { \ + bnx2x_read_dmae(bp, offset, len32);\ +- memcpy(valp, bnx2x_sp(bp, wb_data[0]), len32 * 4); \ ++ memcpy(valp, bnx2x_sp(bp, wb_data[0]), (len32) * 4); \ + } while (0) + + #define REG_WR_DMAE(bp, offset, valp, len32) \ + do { \ +- memcpy(bnx2x_sp(bp, wb_data[0]), valp, len32 * 4); \ ++ memcpy(bnx2x_sp(bp, wb_data[0]), valp, (len32) * 4); \ + bnx2x_write_dmae(bp, bnx2x_sp_mapping(bp, wb_data), \ + offset, len32); \ ++ } while (0) ++ ++#define VIRT_WR_DMAE_LEN(bp, data, addr, len32) \ ++ do { \ ++ memcpy(GUNZIP_BUF(bp), data, (len32) * 4); \ ++ bnx2x_write_big_buf_wb(bp, addr, len32); \ + } while (0) + + #define SHMEM_ADDR(bp, field) (bp->common.shmem_base + \ + offsetof(struct shmem_region, field)) + #define SHMEM_RD(bp, field) REG_RD(bp, SHMEM_ADDR(bp, field)) + #define SHMEM_WR(bp, field, val) REG_WR(bp, SHMEM_ADDR(bp, field), val) ++ ++#define SHMEM2_ADDR(bp, field) (bp->common.shmem2_base + \ ++ offsetof(struct shmem2_region, field)) ++#define SHMEM2_RD(bp, field) REG_RD(bp, SHMEM2_ADDR(bp, field)) ++#define SHMEM2_WR(bp, field, val) REG_WR(bp, SHMEM2_ADDR(bp, field), val) + + #define EMAC_RD(bp, reg) REG_RD(bp, emac_base + reg) + #define EMAC_WR(bp, reg, val) REG_WR(bp, emac_base + reg, val) +@@ -134,11 +187,19 @@ + struct sw_tx_bd { + struct sk_buff *skb; + u16 first_bd; ++ u8 flags; ++/* Set on the first BD descriptor when there is a split BD */ ++#define BNX2X_TSO_SPLIT_BD (1<<0) + }; + + struct sw_rx_page { + struct page *page; + DECLARE_PCI_UNMAP_ADDR(mapping) ++}; ++ ++union db_prod { ++ struct doorbell_set_prod data; ++ u32 raw; + }; + + +@@ -152,9 +213,7 @@ + #define PAGES_PER_SGE (1 << PAGES_PER_SGE_SHIFT) + #define SGE_PAGE_SIZE PAGE_SIZE + #define SGE_PAGE_SHIFT PAGE_SHIFT +-#define SGE_PAGE_ALIGN(addr) PAGE_ALIGN(addr) +- +-#define BCM_RX_ETH_PAYLOAD_ALIGN 64 ++#define SGE_PAGE_ALIGN(addr) PAGE_ALIGN((typeof(PAGE_SIZE))(addr)) + + /* SGE ring related macros */ + #define NUM_RX_SGE_PAGES 2 +@@ -187,19 +246,57 @@ + #define NEXT_SGE_MASK_ELEM(el) (((el) + 1) & RX_SGE_MASK_LEN_MASK) + + ++struct bnx2x_eth_q_stats { ++ u32 total_bytes_received_hi; ++ u32 total_bytes_received_lo; ++ u32 total_bytes_transmitted_hi; ++ u32 total_bytes_transmitted_lo; ++ u32 total_unicast_packets_received_hi; ++ u32 total_unicast_packets_received_lo; ++ u32 total_multicast_packets_received_hi; ++ u32 total_multicast_packets_received_lo; ++ u32 total_broadcast_packets_received_hi; ++ u32 total_broadcast_packets_received_lo; ++ u32 total_unicast_packets_transmitted_hi; ++ u32 total_unicast_packets_transmitted_lo; ++ u32 total_multicast_packets_transmitted_hi; ++ u32 total_multicast_packets_transmitted_lo; ++ u32 total_broadcast_packets_transmitted_hi; ++ u32 total_broadcast_packets_transmitted_lo; ++ u32 valid_bytes_received_hi; ++ u32 valid_bytes_received_lo; ++ ++ u32 error_bytes_received_hi; ++ u32 error_bytes_received_lo; ++ u32 etherstatsoverrsizepkts_hi; ++ u32 etherstatsoverrsizepkts_lo; ++ u32 no_buff_discard_hi; ++ u32 no_buff_discard_lo; ++ ++ u32 driver_xoff; ++ u32 rx_err_discard_pkt; ++ u32 rx_skb_alloc_failed; ++ u32 hw_csum_err; ++}; ++ ++#define BNX2X_NUM_Q_STATS 11 ++#define Q_STATS_OFFSET32(stat_name) \ ++ (offsetof(struct bnx2x_eth_q_stats, stat_name) / 4) ++ + struct bnx2x_fastpath { + ++#ifdef BNX2X_NEW_NAPI /* BNX2X_UPSTREAM */ + struct napi_struct napi; ++#endif ++ ++ u8 is_rx_queue; + + struct host_status_block *status_blk; + dma_addr_t status_blk_mapping; + +- struct eth_tx_db_data *hw_tx_prods; +- dma_addr_t tx_prods_mapping; +- + struct sw_tx_bd *tx_buf_ring; + +- struct eth_tx_bd *tx_desc_ring; ++ union eth_tx_bd_types *tx_desc_ring; + dma_addr_t tx_desc_mapping; + + struct sw_rx_bd *rx_buf_ring; /* BDs mappings ring */ +@@ -228,20 +325,20 @@ + u8 index; /* number in fp array */ + u8 cl_id; /* eth client id */ + u8 sb_id; /* status block number in HW */ +-#define FP_IDX(fp) (fp->index) +-#define FP_CL_ID(fp) (fp->cl_id) +-#define BP_CL_ID(bp) (bp->fp[0].cl_id) +-#define FP_SB_ID(fp) (fp->sb_id) +-#define CNIC_SB_ID 0 ++#ifdef BNX2X_SAFC /* ! BNX2X_UPSTREAM */ ++ u8 cos; ++#endif ++ ++ union db_prod tx_db; + + u16 tx_pkt_prod; + u16 tx_pkt_cons; + u16 tx_bd_prod; + u16 tx_bd_cons; +- u16 *tx_cons_sb; ++ __le16 *tx_cons_sb; + +- u16 fp_c_idx; +- u16 fp_u_idx; ++ __le16 fp_c_idx; ++ __le16 fp_u_idx; + + u16 rx_bd_prod; + u16 rx_bd_cons; +@@ -250,12 +347,36 @@ + u16 rx_sge_prod; + /* The last maximal completed SGE */ + u16 last_max_sge; +- u16 *rx_cons_sb; +- u16 *rx_bd_cons_sb; ++ __le16 *rx_cons_sb; ++ __le16 *rx_bd_cons_sb; ++ ++#if defined(__VMKLNX__) && defined(__VMKNETDDI_QUEUEOPS__) /* ! BNX2X_UPSTREAM */ ++ u16 netq_flags; ++#define BNX2X_NETQ_RX_QUEUE_ALLOCATED 0x0001 ++#define BNX2X_NETQ_TX_QUEUE_ALLOCATED 0x0002 ++#define BNX2X_NETQ_RX_QUEUE_ACTIVE 0x0004 ++#define BNX2X_NETQ_TX_QUEUE_ACTIVE 0x0008 ++ ++#define BNX2X_IS_NETQ_RX_QUEUE_ALLOCATED(fp) \ ++ ((fp->netq_flags & BNX2X_NETQ_RX_QUEUE_ALLOCATED) == \ ++ BNX2X_NETQ_RX_QUEUE_ALLOCATED) ++#define BNX2X_IS_NETQ_TX_QUEUE_ALLOCATED(fp) \ ++ ((fp->netq_flags & BNX2X_NETQ_TX_QUEUE_ALLOCATED) == \ ++ BNX2X_NETQ_TX_QUEUE_ALLOCATED) ++#define BNX2X_IS_NETQ_RX_QUEUE_ACTIVE(fp) \ ++ ((fp->netq_flags & BNX2X_NETQ_RX_QUEUE_ACTIVE) == \ ++ BNX2X_NETQ_RX_QUEUE_ACTIVE) ++#define BNX2X_IS_NETQ_TX_QUEUE_ACTIVE(fp) \ ++ ((fp->netq_flags & BNX2X_NETQ_TX_QUEUE_ACTIVE) == \ ++ BNX2X_NETQ_TX_QUEUE_ACTIVE) ++ ++ u8 mac_filter_addr[6]; ++#endif + + unsigned long tx_pkt, + rx_pkt, + rx_calls; ++ + /* TPA related */ + struct sw_rx_bd tpa_pool[ETH_MAX_AGGREGATION_QUEUES_E1H]; + u8 tpa_state[ETH_MAX_AGGREGATION_QUEUES_E1H]; +@@ -266,12 +387,21 @@ + u64 tpa_queue_used; + #endif + ++ struct tstorm_per_client_stats old_tclient; ++ struct ustorm_per_client_stats old_uclient; ++ struct xstorm_per_client_stats old_xclient; ++ struct bnx2x_eth_q_stats eth_q_stats; ++ ++ /* The size is calculated using the following: ++ sizeof name field from netdev structure + ++ 4 ('-Xx-' string) + ++ 4 (for the digits and to make it DWORD aligned) */ ++#define FP_NAME_SIZE (sizeof(((struct net_device *)0)->name) + 8) ++ char name[FP_NAME_SIZE]; + struct bnx2x *bp; /* parent */ + }; + + #define bnx2x_fp(bp, nr, var) (bp->fp[nr].var) +- +-#define BNX2X_HAS_WORK(fp) (bnx2x_has_rx_work(fp) || bnx2x_has_tx_work(fp)) + + + /* MC hsi */ +@@ -279,7 +409,7 @@ + #define RX_COPY_THRESH 92 + + #define NUM_TX_RINGS 16 +-#define TX_DESC_CNT (BCM_PAGE_SIZE / sizeof(struct eth_tx_bd)) ++#define TX_DESC_CNT (BCM_PAGE_SIZE / sizeof(union eth_tx_bd_types)) + #define MAX_TX_DESC_CNT (TX_DESC_CNT - 1) + #define NUM_TX_BD (TX_DESC_CNT * NUM_TX_RINGS) + #define MAX_TX_BD (NUM_TX_BD - 1) +@@ -290,7 +420,11 @@ + #define TX_BD_POFF(x) ((x) & MAX_TX_DESC_CNT) + + /* The RX BD ring is special, each bd is 8 bytes but the last one is 16 */ ++#if !defined(__VMKLNX__) /* BNX2X_UPSTREAM */ + #define NUM_RX_RINGS 8 ++#else ++#define NUM_RX_RINGS 1 ++#endif + #define RX_DESC_CNT (BCM_PAGE_SIZE / sizeof(struct eth_rx_bd)) + #define MAX_RX_DESC_CNT (RX_DESC_CNT - 2) + #define RX_DESC_MASK (RX_DESC_CNT - 1) +@@ -351,16 +485,21 @@ + #define DPM_TRIGER_TYPE 0x40 + #define DOORBELL(bp, cid, val) \ + do { \ +- writel((u32)val, (bp)->doorbells + (BCM_PAGE_SIZE * cid) + \ ++ writel((u32)(val), bp->doorbells + (BCM_PAGE_SIZE * (cid)) + \ + DPM_TRIGER_TYPE); \ + } while (0) + + + /* TX CSUM helpers */ ++#if (LINUX_VERSION_CODE >= 0x020616) && !defined(__VMKLNX__) /* BNX2X_UPSTREAM */ + #define SKB_CS_OFF(skb) (offsetof(struct tcphdr, check) - \ + skb->csum_offset) + #define SKB_CS(skb) (*(u16 *)(skb_transport_header(skb) + \ + skb->csum_offset)) ++#else ++#define SKB_CS_OFF(skb) (offsetof(struct tcphdr, check) - skb->csum) ++#define SKB_CS(skb) (*(u16 *)(skb->h.raw + skb->csum)) ++#endif + + #define pbd_tcp_flags(skb) (ntohl(tcp_flag_word(tcp_hdr(skb)))>>16 & 0xff) + +@@ -401,10 +540,13 @@ + #define BNX2X_RX_CSUM_OK(cqe) \ + (!(BNX2X_L4_CSUM_ERR(cqe) || BNX2X_IP_CSUM_ERR(cqe))) + ++#define BNX2X_PRS_FLAG_OVERETH_IPV4(flags) \ ++ (((le16_to_cpu(flags) & \ ++ PARSING_FLAGS_OVER_ETHERNET_PROTOCOL) >> \ ++ PARSING_FLAGS_OVER_ETHERNET_PROTOCOL_SHIFT) \ ++ == PRS_FLAG_OVERETH_IPV4) + #define BNX2X_RX_SUM_FIX(cqe) \ +- ((le16_to_cpu(cqe->fast_path_cqe.pars_flags.flags) & \ +- PARSING_FLAGS_OVER_ETHERNET_PROTOCOL) == \ +- (1 << PARSING_FLAGS_OVER_ETHERNET_PROTOCOL_SHIFT)) ++ BNX2X_PRS_FLAG_OVERETH_IPV4(cqe->fast_path_cqe.pars_flags.flags) + + + #define FP_USB_FUNC_OFF (2 + 2*HC_USTORM_SB_NUM_INDICES) +@@ -446,12 +588,24 @@ + #define CHIP_NUM_57710 0x164e + #define CHIP_NUM_57711 0x164f + #define CHIP_NUM_57711E 0x1650 ++#define CHIP_NUM_57712 0x1662 ++#define CHIP_NUM_57712E 0x1663 ++#define CHIP_NUM_57713 0x1651 ++#define CHIP_NUM_57713E 0x1652 + #define CHIP_IS_E1(bp) (CHIP_NUM(bp) == CHIP_NUM_57710) + #define CHIP_IS_57711(bp) (CHIP_NUM(bp) == CHIP_NUM_57711) + #define CHIP_IS_57711E(bp) (CHIP_NUM(bp) == CHIP_NUM_57711E) ++#define CHIP_IS_57712(bp) (CHIP_NUM(bp) == CHIP_NUM_57712) ++#define CHIP_IS_57712E(bp) (CHIP_NUM(bp) == CHIP_NUM_57712E) ++#define CHIP_IS_57713(bp) (CHIP_NUM(bp) == CHIP_NUM_57713) ++#define CHIP_IS_57713E(bp) (CHIP_NUM(bp) == CHIP_NUM_57713E) + #define CHIP_IS_E1H(bp) (CHIP_IS_57711(bp) || \ + CHIP_IS_57711E(bp)) + #define IS_E1H_OFFSET CHIP_IS_E1H(bp) ++#define CHIP_IS_E2(bp) (CHIP_IS_57712(bp) || \ ++ CHIP_IS_57712E(bp) || \ ++ CHIP_IS_57713(bp) || \ ++ CHIP_IS_57713E(bp)) + + #define CHIP_REV(bp) (bp->common.chip_id & 0x0000f000) + #define CHIP_REV_Ax 0x00000000 +@@ -476,13 +630,11 @@ + #define NVRAM_PAGE_SIZE 256 + + u32 shmem_base; ++ u32 shmem2_base; + + u32 hw_config; +- u32 board; + + u32 bc_ver; +- +- char *name; + }; + + +@@ -528,6 +680,7 @@ + + /* used to synchronize phy accesses */ + struct mutex phy_mutex; ++ int need_hw_lock; + + u32 port_stx; + +@@ -573,6 +726,10 @@ + + u32 error_bytes_received_hi; + u32 error_bytes_received_lo; ++ u32 etherstatsoverrsizepkts_hi; ++ u32 etherstatsoverrsizepkts_lo; ++ u32 no_buff_discard_hi; ++ u32 no_buff_discard_lo; + + u32 rx_stat_ifhcinbadoctets_hi; + u32 rx_stat_ifhcinbadoctets_lo; +@@ -651,19 +808,20 @@ + u32 tx_stat_bmac_ufl_hi; + u32 tx_stat_bmac_ufl_lo; + +- u32 brb_drop_hi; +- u32 brb_drop_lo; +- u32 brb_truncate_hi; +- u32 brb_truncate_lo; +- +- u32 jabber_packets_received; ++ u32 pause_frames_received_hi; ++ u32 pause_frames_received_lo; ++ u32 pause_frames_sent_hi; ++ u32 pause_frames_sent_lo; + + u32 etherstatspkts1024octetsto1522octets_hi; + u32 etherstatspkts1024octetsto1522octets_lo; + u32 etherstatspktsover1522octets_hi; + u32 etherstatspktsover1522octets_lo; + +- u32 no_buff_discard; ++ u32 brb_drop_hi; ++ u32 brb_drop_lo; ++ u32 brb_truncate_hi; ++ u32 brb_truncate_lo; + + u32 mac_filter_discard; + u32 xxoverflow_discard; +@@ -674,16 +832,23 @@ + u32 rx_err_discard_pkt; + u32 rx_skb_alloc_failed; + u32 hw_csum_err; ++ ++ u32 nig_timer_max; + }; + ++#define BNX2X_NUM_STATS 41 + #define STATS_OFFSET32(stat_name) \ + (offsetof(struct bnx2x_eth_stats, stat_name) / 4) + + +-#ifdef BNX2X_MULTI ++#ifdef BNX2X_NEW_NAPI /* BNX2X_UPSTREAM */ ++#ifdef BCM_CNIC ++#define MAX_CONTEXT 15 ++#else /* BNX2X_UPSTREAM */ + #define MAX_CONTEXT 16 ++#endif + #else +-#define MAX_CONTEXT 1 ++#define MAX_CONTEXT 2 + #endif + + union cdu_context { +@@ -708,6 +873,7 @@ + struct nig_stats nig_stats; + struct host_port_stats port_stats; + struct host_func_stats func_stats; ++ struct host_func_stats func_stats_base; + + u32 wb_comp; + u32 wb_data[4]; +@@ -738,7 +904,16 @@ + struct pci_dev *pdev; + + atomic_t intr_sem; ++#ifdef CONFIG_PCI_MSI /* BNX2X_UPSTREAM */ ++#ifdef BCM_CNIC ++ struct msix_entry msix_table[MAX_CONTEXT+2]; ++#else /* BNX2X_UPSTREAM */ + struct msix_entry msix_table[MAX_CONTEXT+1]; ++#endif ++#endif ++#define INT_MODE_INTx 1 ++#define INT_MODE_MSI 2 ++#define INT_MODE_MSIX 3 + + int tx_ring_size; + +@@ -747,23 +922,26 @@ + #endif + + u32 rx_csum; +- u32 rx_offset; + u32 rx_buf_size; + #define ETH_OVREHEAD (ETH_HLEN + 8) /* 8 for CRC + VLAN */ + #define ETH_MIN_PACKET_SIZE 60 + #define ETH_MAX_PACKET_SIZE 1500 + #define ETH_MAX_JUMBO_PACKET_SIZE 9600 + ++ /* Max supported alignment is 256 (8 shift) */ ++#define BNX2X_RX_ALIGN_SHIFT ((L1_CACHE_SHIFT < 8) ? \ ++ L1_CACHE_SHIFT : 8) ++#define BNX2X_RX_ALIGN (1 << BNX2X_RX_ALIGN_SHIFT) ++ + struct host_def_status_block *def_status_blk; + #define DEF_SB_ID 16 +- u16 def_c_idx; +- u16 def_u_idx; +- u16 def_x_idx; +- u16 def_t_idx; +- u16 def_att_idx; ++ __le16 def_c_idx; ++ __le16 def_u_idx; ++ __le16 def_x_idx; ++ __le16 def_t_idx; ++ __le16 def_att_idx; + u32 attn_state; + struct attn_route attn_group[MAX_DYNAMIC_ATTN_GRPS]; +- u32 nig_mask; + + /* slow path ring */ + struct eth_spe *spq; +@@ -771,10 +949,17 @@ + u16 spq_prod_idx; + struct eth_spe *spq_prod_bd; + struct eth_spe *spq_last_bd; +- u16 *dsb_sp_prod; ++ __le16 *dsb_sp_prod; + u16 spq_left; /* serialize spq */ + /* used to synchronize spq accesses */ + spinlock_t spq_lock; ++ ++#if defined(__VMKLNX__) && defined(__VMKNETDDI_QUEUEOPS__) /* ! BNX2X_UPSTREAM */ ++ /* n queues allocated */ ++ u16 n_rx_queues_allocated; ++ u16 n_tx_queues_allocated; ++ u8 netq_enabled; ++#endif + + /* Flags for marking that there is a STAT_QUERY or + SET_MAC ramrod pending */ +@@ -789,14 +974,17 @@ + u32 flags; + #define PCIX_FLAG 1 + #define PCI_32BIT_FLAG 2 +-#define ONE_TDMA_FLAG 4 /* no longer used */ ++#define ONE_PORT_FLAG 4 + #define NO_WOL_FLAG 8 + #define USING_DAC_FLAG 0x10 + #define USING_MSIX_FLAG 0x20 +-#define ASF_ENABLE_FLAG 0x40 ++#define USING_MSI_FLAG 0x40 + #define TPA_ENABLE_FLAG 0x80 + #define NO_MCP_FLAG 0x100 + #define BP_NOMCP(bp) (bp->flags & NO_MCP_FLAG) ++#ifdef BNX2X_SAFC /* ! BNX2X_UPSTREAM */ ++#define SAFC_TX_FLAG 0x200 ++#endif + #define HW_VLAN_TX_FLAG 0x400 + #define HW_VLAN_RX_FLAG 0x800 + +@@ -808,12 +996,19 @@ + + int pm_cap; + int pcie_cap; ++ int mrrs; + ++#if (LINUX_VERSION_CODE >= 0x020614) /* BNX2X_UPSTREAM */ + struct delayed_work sp_task; ++#else ++ struct work_struct sp_task; ++#endif + struct work_struct reset_task; ++#if (LINUX_VERSION_CODE < 0x020618) /* ! BNX2X_UPSTREAM */ ++ u16 sp_running; ++#endif + + struct timer_list timer; +- int timer_interval; + int current_interval; + + u16 fw_seq; +@@ -822,9 +1017,16 @@ + + struct link_params link_params; + struct link_vars link_vars; ++ struct mdio_if_info mdio; + + struct bnx2x_common common; + struct bnx2x_port port; ++ ++ struct cmng_struct_per_port cmng; ++ u32 vn_weight_sum; ++#ifdef BNX2X_SAFC /* ! BNX2X_UPSTREAM */ ++ u32 cos_weight_sum; ++#endif + + u32 mf_config; + u16 e1hov; +@@ -848,7 +1050,7 @@ + u32 lin_cnt; + + int state; +-#define BNX2X_STATE_CLOSED 0x0 ++#define BNX2X_STATE_CLOSED 0 + #define BNX2X_STATE_OPENING_WAIT4_LOAD 0x1000 + #define BNX2X_STATE_OPENING_WAIT4_PORT 0x2000 + #define BNX2X_STATE_OPEN 0x3000 +@@ -859,8 +1061,27 @@ + #define BNX2X_STATE_DIAG 0xe000 + #define BNX2X_STATE_ERROR 0xf000 + +- int num_queues; +-#define BP_MAX_QUEUES(bp) (IS_E1HMF(bp) ? 4 : 16) ++ int multi_mode; ++#ifdef BNX2X_SAFC /* ! BNX2X_UPSTREAM */ ++#define BNX2X_MAX_PRIORITY 8 ++#define BNX2X_MAX_ENTRIES_PER_PRI 16 ++#define BNX2X_MAX_COS 3 ++#define BNX2X_MAX_TX_COS 2 ++ /* priority to cos mapping */ ++ u8 pri_map[BNX2X_MAX_PRIORITY]; ++ /* number of queues per cos */ ++ u8 qs_per_cos[BNX2X_MAX_COS]; ++ /* min rate per cos */ ++ u16 cos_min_rate[BNX2X_MAX_COS]; ++ /* cos to queue mapping */ ++ u8 cos_map[BNX2X_MAX_COS]; ++#endif ++ int num_rx_queues; ++ int num_tx_queues; ++#ifdef BNX2X_SAFC /* ! BNX2X_UPSTREAM */ ++#define BNX2X_COS_QUEUES(cos) ((qs_per_cos & (0xff << cos*8)) >> cos*8) ++#define BNX2X_COS_RATE(cos) ((cos_min_rate & (0xff << cos*8)) >> cos*8) ++#endif + + u32 rx_mode; + #define BNX2X_RX_MODE_NONE 0 +@@ -875,21 +1096,35 @@ + struct bnx2x_slowpath *slowpath; + dma_addr_t slowpath_mapping; + +-#ifdef BCM_ISCSI +- void *t1; +- dma_addr_t t1_mapping; +- void *t2; +- dma_addr_t t2_mapping; +- void *timers; +- dma_addr_t timers_mapping; +- void *qm; +- dma_addr_t qm_mapping; ++ int dropless_fc; ++ ++#ifdef BCM_CNIC /* ! BNX2X_UPSTREAM */ ++ void *t1; ++ dma_addr_t t1_mapping; ++ void *t2; ++ dma_addr_t t2_mapping; ++ void *timers; ++ dma_addr_t timers_mapping; ++ void *qm; ++ dma_addr_t qm_mapping; ++ struct cnic_ops *cnic_ops; ++ void *cnic_data; ++ u32 cnic_tag; ++ struct cnic_eth_dev cnic_eth_dev; ++ struct host_status_block *cnic_sb; ++ dma_addr_t cnic_sb_mapping; ++#define CNIC_SB_ID(bp) BP_L_ID(bp) ++ struct eth_spe *cnic_kwq; ++ struct eth_spe *cnic_kwq_prod; ++ struct eth_spe *cnic_kwq_cons; ++ struct eth_spe *cnic_kwq_last; ++ u16 cnic_kwq_pending; ++ u16 cnic_spq_pending; + #endif + + int dmae_ready; + /* used to synchronize dmae accesses */ + struct mutex dmae_mutex; +- struct dmae_command init_dmae; + + /* used to synchronize stats collecting */ + int stats_state; +@@ -898,8 +1133,9 @@ + int executer_idx; + + u16 stats_counter; +- struct tstorm_per_client_stats old_tclient; +- struct xstorm_per_client_stats old_xclient; ++#if (LINUX_VERSION_CODE < 0x020618) /* ! BNX2X_UPSTREAM */ ++ struct net_device_stats net_stats; ++#endif + struct bnx2x_eth_stats eth_stats; + + struct z_stream_s *strm; +@@ -907,21 +1143,71 @@ + dma_addr_t gunzip_mapping; + int gunzip_outlen; + #define FW_BUF_SIZE 0x8000 ++#define GUNZIP_BUF(bp) bp->gunzip_buf ++#define GUNZIP_PHYS(bp) bp->gunzip_mapping ++#define GUNZIP_OUTLEN(bp) bp->gunzip_outlen + ++#if (LINUX_VERSION_CODE < 0x02060b) /* ! BNX2X_UPSTREAM */ ++ u32 pci_state[16]; ++#endif ++ struct raw_op *init_ops; ++ /* Init blocks offsets inside init_ops */ ++ u16 *init_ops_offsets; ++ /* Data blob - has 32 bit granularity */ ++ u32 *init_data; ++ /* Zipped PRAM blobs - raw data */ ++ const u8 *tsem_int_table_data; ++ const u8 *tsem_pram_data; ++ const u8 *usem_int_table_data; ++ const u8 *usem_pram_data; ++ const u8 *xsem_int_table_data; ++ const u8 *xsem_pram_data; ++ const u8 *csem_int_table_data; ++ const u8 *csem_pram_data; ++#define INIT_OPS(bp) bp->init_ops ++#define INIT_OPS_OFFSETS(bp) bp->init_ops_offsets ++#define INIT_DATA(bp) bp->init_data ++#define INIT_TSEM_INT_TABLE_DATA(bp) bp->tsem_int_table_data ++#define INIT_TSEM_PRAM_DATA(bp) bp->tsem_pram_data ++#define INIT_USEM_INT_TABLE_DATA(bp) bp->usem_int_table_data ++#define INIT_USEM_PRAM_DATA(bp) bp->usem_pram_data ++#define INIT_XSEM_INT_TABLE_DATA(bp) bp->xsem_int_table_data ++#define INIT_XSEM_PRAM_DATA(bp) bp->xsem_pram_data ++#define INIT_CSEM_INT_TABLE_DATA(bp) bp->csem_int_table_data ++#define INIT_CSEM_PRAM_DATA(bp) bp->csem_pram_data ++ ++#if defined(BNX2X_UPSTREAM) && !defined(BNX2X_USE_INIT_VALUES) /* BNX2X_UPSTREAM */ ++ const struct firmware *firmware; ++#endif + }; + + +-#define for_each_queue(bp, var) for (var = 0; var < bp->num_queues; var++) ++#define BNX2X_MAX_QUEUES(bp) (IS_E1HMF(bp) ? (MAX_CONTEXT/(2 * E1HVN_MAX)) \ ++ : (MAX_CONTEXT/2)) ++#define BNX2X_NUM_QUEUES(bp) (bp->num_rx_queues + bp->num_tx_queues) ++#define is_multi(bp) (BNX2X_NUM_QUEUES(bp) > 2) + ++#define for_each_rx_queue(bp, var) \ ++ for (var = 0; var < bp->num_rx_queues; var++) ++#define for_each_tx_queue(bp, var) \ ++ for (var = bp->num_rx_queues; \ ++ var < BNX2X_NUM_QUEUES(bp); var++) ++#define for_each_queue(bp, var) \ ++ for (var = 0; var < BNX2X_NUM_QUEUES(bp); var++) + #define for_each_nondefault_queue(bp, var) \ +- for (var = 1; var < bp->num_queues; var++) +-#define is_multi(bp) (bp->num_queues > 1) ++ for (var = 1; var < bp->num_rx_queues; var++) + + + void bnx2x_read_dmae(struct bnx2x *bp, u32 src_addr, u32 len32); + void bnx2x_write_dmae(struct bnx2x *bp, dma_addr_t dma_addr, u32 dst_addr, + u32 len32); ++int bnx2x_get_gpio(struct bnx2x *bp, int gpio_num, u8 port); + int bnx2x_set_gpio(struct bnx2x *bp, int gpio_num, u32 mode, u8 port); ++int bnx2x_set_gpio_int(struct bnx2x *bp, int gpio_num, u32 mode, u8 port); ++u32 bnx2x_fw_command(struct bnx2x *bp, u32 command); ++void bnx2x_reg_wr_ind(struct bnx2x *bp, u32 addr, u32 val); ++void bnx2x_write_dmae_phys_len(struct bnx2x *bp, dma_addr_t phys_addr, ++ u32 addr, u32 len); + + static inline u32 reg_poll(struct bnx2x *bp, u32 reg, u32 expected, int ms, + int wait) +@@ -979,9 +1265,9 @@ + #define DMAE_COMP_VAL 0xe0d0d0ae + + #define MAX_DMAE_C_PER_PORT 8 +-#define INIT_DMAE_C(bp) (BP_PORT(bp)*MAX_DMAE_C_PER_PORT + \ ++#define INIT_DMAE_C(bp) (BP_PORT(bp) * MAX_DMAE_C_PER_PORT + \ + BP_E1HVN(bp)) +-#define PMF_DMAE_C(bp) (BP_PORT(bp)*MAX_DMAE_C_PER_PORT + \ ++#define PMF_DMAE_C(bp) (BP_PORT(bp) * MAX_DMAE_C_PER_PORT + \ + E1HVN_MAX) + + +@@ -992,13 +1278,12 @@ + #define PCICFG_LINK_SPEED_SHIFT 16 + + +-#define BNX2X_NUM_STATS 42 +-#define BNX2X_NUM_TESTS 8 ++#define BNX2X_NUM_TESTS 7 + +-#define BNX2X_MAC_LOOPBACK 0 +-#define BNX2X_PHY_LOOPBACK 1 +-#define BNX2X_MAC_LOOPBACK_FAILED 1 +-#define BNX2X_PHY_LOOPBACK_FAILED 2 ++#define BNX2X_PHY_LOOPBACK 0 ++#define BNX2X_MAC_LOOPBACK 1 ++#define BNX2X_PHY_LOOPBACK_FAILED 1 ++#define BNX2X_MAC_LOOPBACK_FAILED 2 + #define BNX2X_LOOPBACK_FAILED (BNX2X_MAC_LOOPBACK_FAILED | \ + BNX2X_PHY_LOOPBACK_FAILED) + +@@ -1007,7 +1292,8 @@ + + + /* must be used on a CID before placing it on a HW ring */ +-#define HW_CID(bp, x) ((BP_PORT(bp) << 23) | (BP_E1HVN(bp) << 17) | x) ++#define HW_CID(bp, x) ((BP_PORT(bp) << 23) | \ ++ (BP_E1HVN(bp) << 17) | (x)) + + #define SP_DESC_CNT (BCM_PAGE_SIZE / sizeof(struct eth_spe)) + #define MAX_SP_DESC_CNT (SP_DESC_CNT - 1) +@@ -1060,9 +1346,6 @@ + + #define BNX2X_MCP_ASSERT \ + GENERAL_ATTEN_OFFSET(MCP_FATAL_ASSERT_ATTENTION_BIT) +- +-#define BNX2X_DOORQ_ASSERT \ +- AEU_INPUTS_ATTN_BITS_DOORBELLQ_HW_INTERRUPT + + #define BNX2X_GRC_TIMEOUT GENERAL_ATTEN_OFFSET(LATCHED_ATTN_TIMEOUT_GRC) + #define BNX2X_GRC_RSV (GENERAL_ATTEN_OFFSET(LATCHED_ATTN_RBCR) | \ +@@ -1098,8 +1381,8 @@ + AEU_INPUTS_ATTN_BITS_QM_PARITY_ERROR | \ + AEU_INPUTS_ATTN_BITS_XSDM_PARITY_ERROR | \ + AEU_INPUTS_ATTN_BITS_XSEMI_PARITY_ERROR | \ +- AEU_INPUTS_ATTN_BITS_DOORBELLQ_PARITY_ERROR |\ +- AEU_INPUTS_ATTN_BITS_VAUX_PCI_CORE_PARITY_ERROR |\ ++ AEU_INPUTS_ATTN_BITS_DOORBELLQ_PARITY_ERROR |\ ++ AEU_INPUTS_ATTN_BITS_VAUX_PCI_CORE_PARITY_ERROR |\ + AEU_INPUTS_ATTN_BITS_DEBUG_PARITY_ERROR | \ + AEU_INPUTS_ATTN_BITS_USDM_PARITY_ERROR | \ + AEU_INPUTS_ATTN_BITS_USEMI_PARITY_ERROR | \ +@@ -1120,13 +1403,13 @@ + AEU_INPUTS_ATTN_BITS_MISC_PARITY_ERROR) + + +-#define MULTI_FLAGS \ ++#define MULTI_FLAGS(bp) \ + (TSTORM_ETH_FUNCTION_COMMON_CONFIG_RSS_IPV4_CAPABILITY | \ + TSTORM_ETH_FUNCTION_COMMON_CONFIG_RSS_IPV4_TCP_CAPABILITY | \ + TSTORM_ETH_FUNCTION_COMMON_CONFIG_RSS_IPV6_CAPABILITY | \ + TSTORM_ETH_FUNCTION_COMMON_CONFIG_RSS_IPV6_TCP_CAPABILITY | \ +- TSTORM_ETH_FUNCTION_COMMON_CONFIG_RSS_ENABLE) +- ++ (bp->multi_mode << \ ++ TSTORM_ETH_FUNCTION_COMMON_CONFIG_RSS_MODE_SHIFT)) + #define MULTI_MASK 0x7f + + +diff -r ddb96c0bbe13 drivers/net/bnx2x_compat.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/bnx2x_compat.h Tue Jun 16 13:15:30 2009 +0100 +@@ -0,0 +1,564 @@ ++#ifndef __BNX2X_COMPAT_H__ ++#define __BNX2X_COMPAT_H__ ++ ++#ifndef __VMKLNX__ ++#define VMWARE_ESX_DDK_VERSION 0 ++#endif ++ ++#if (LINUX_VERSION_CODE < 0x02061e) ++#define skb_record_rx_queue(skb, index) ++#endif ++ ++#if (LINUX_VERSION_CODE < 0x020618) && (VMWARE_ESX_DDK_VERSION < 40000) ++#define napi_complete(napi) netif_rx_complete(dev) ++#define napi_schedule(napi) netif_rx_schedule(bp->dev) ++#endif ++ ++#ifndef BNX2X_MULTI_QUEUE ++#define netif_tx_wake_all_queues netif_wake_queue ++#define netif_tx_start_all_queues netif_start_queue ++#endif ++ ++#if (LINUX_VERSION_CODE < 0x020616) ++#define skb_copy_from_linear_data_offset(skb, pad, new_skb_data, len) \ ++ memcpy(new_skb_data, skb->data + pad, len) ++ ++/* skb_buff accessors */ ++#define ip_hdr(skb) (skb)->nh.iph ++#define ipv6_hdr(skb) (skb)->nh.ipv6h ++#define ip_hdrlen(skb) (ip_hdr(skb)->ihl * 4) ++#define tcp_hdr(skb) (skb)->h.th ++#define tcp_hdrlen(skb) (tcp_hdr(skb)->doff * 4) ++#define udp_hdr(skb) (skb)->h.uh ++#define skb_mac_header(skb) ((skb)->mac.raw) ++#define skb_network_header(skb) ((skb)->nh.raw) ++#define skb_transport_header(skb) ((skb)->h.raw) ++#endif ++ ++ ++#ifndef CHECKSUM_PARTIAL ++#define CHECKSUM_PARTIAL CHECKSUM_HW ++#endif ++ ++ ++#if (LINUX_VERSION_CODE < 0x020600) ++#define might_sleep() ++ ++#define num_online_cpus() 1 ++ ++#define dev_info(dev, format, args...) \ ++ printk(KERN_INFO "bnx2x: " format, ##args) ++ ++#define dev_err(dev, format, args...) \ ++ printk(KERN_ERR "bnx2x: " format, ##args) ++ ++static inline int dma_mapping_error(dma_addr_t mapping) ++{ ++ return 0; ++} ++ ++#define synchronize_irq(X) synchronize_irq() ++#define flush_scheduled_work() ++#endif ++ ++ ++#ifndef SET_MODULE_OWNER ++#define SET_MODULE_OWNER(dev) ++#endif ++ ++ ++#if (LINUX_VERSION_CODE < 0x020604) ++#define MODULE_VERSION(version) ++#endif ++ ++ ++#if (LINUX_VERSION_CODE < 0x020605) ++static inline void pci_dma_sync_single_for_device(struct pci_dev *dev, ++ dma_addr_t map, size_t size, ++ int dir) ++{ ++} ++#endif ++ ++ ++#if (LINUX_VERSION_CODE < 0x020547) ++#define pci_set_consistent_dma_mask(X, Y) (0) ++#endif ++ ++ ++#if (LINUX_VERSION_CODE < 0x020607) ++#define msleep(x) \ ++ do { \ ++ current->state = TASK_UNINTERRUPTIBLE; \ ++ schedule_timeout((HZ * (x)) / 1000); \ ++ } while (0) ++ ++#ifndef ADVERTISE_1000XPAUSE ++static inline struct mii_ioctl_data *if_mii(struct ifreq *rq) ++{ ++ return (struct mii_ioctl_data *)&rq->ifr_ifru; ++} ++#endif ++ ++#define pci_enable_msix(X, Y, Z) (-1) ++#endif ++ ++ ++#if (LINUX_VERSION_CODE < 0x020609) ++#define msleep_interruptible(x) \ ++ do{ \ ++ current->state = TASK_INTERRUPTIBLE; \ ++ schedule_timeout((HZ * (x)) / 1000); \ ++ } while (0) ++ ++#endif ++ ++ ++#if (LINUX_VERSION_CODE < 0x02060b) ++#define pm_message_t u32 ++#define pci_power_t u32 ++#define PCI_D0 0 ++#define PCI_D3hot 3 ++#define pci_choose_state(pdev, state) state ++#endif ++ ++ ++#if (LINUX_VERSION_CODE < 0x02060e) ++#define touch_softlockup_watchdog() ++#endif ++ ++ ++#if (LINUX_VERSION_CODE < 0x020612) ++static inline struct sk_buff *netdev_alloc_skb(struct net_device *dev, ++ unsigned int length) ++{ ++ struct sk_buff *skb = dev_alloc_skb(length); ++ ++ if (skb) ++ skb->dev = dev; ++ return skb; ++} ++#endif ++ ++ ++#if (LINUX_VERSION_CODE < 0x020615) ++#define vlan_group_set_device(vg, vlan_id, dev) vg->vlan_devices[vlan_id] = dev ++#endif ++ ++ ++#ifndef IRQ_RETVAL ++typedef void irqreturn_t; ++#define IRQ_HANDLED ++#define IRQ_NONE ++#endif ++ ++ ++#ifndef IRQF_SHARED ++#define IRQF_SHARED SA_SHIRQ ++#endif ++ ++ ++#ifndef NETIF_F_GSO ++static inline void netif_tx_lock(struct net_device *dev) ++{ ++ spin_lock(&dev->xmit_lock); ++ dev->xmit_lock_owner = smp_processor_id(); ++} ++ ++static inline void netif_tx_unlock(struct net_device *dev) ++{ ++ dev->xmit_lock_owner = -1; ++ spin_unlock(&dev->xmit_lock); ++} ++#endif ++ ++ ++#ifndef skb_shinfo ++#define skb_shinfo(SKB) ((struct skb_shared_info *)(skb_end_pointer(SKB))) ++#endif ++ ++ ++#ifdef NETIF_F_TSO ++#ifndef NETIF_F_GSO ++ ++static inline int skb_is_gso(const struct sk_buff *skb) ++{ ++ return skb_shinfo(skb)->tso_size; ++} ++ ++#define gso_size tso_size ++ ++#endif /* NETIF_F_GSO */ ++ ++#ifndef NETIF_F_GSO_SOFTWARE ++#define NETIF_F_GSO_SOFTWARE (NETIF_F_TSO) ++#endif ++ ++#endif /* NETIF_F_TSO */ ++ ++#ifndef NETIF_F_TSO_ECN ++#define NETIF_F_TSO_ECN 0 ++#endif ++ ++ ++#if !defined(mmiowb) ++#define mmiowb() ++#endif ++ ++#if !defined(__iomem) ++#define __iomem ++#endif ++ ++#ifndef noinline ++#define noinline ++#endif ++ ++#if !defined(INIT_WORK) ++#define INIT_WORK INIT_TQUEUE ++#define schedule_work schedule_task ++#define work_struct tq_struct ++#endif ++ ++#if !defined(HAVE_NETDEV_PRIV) && (LINUX_VERSION_CODE != 0x020603) && (LINUX_VERSION_CODE != 0x020604) && (LINUX_VERSION_CODE != 0x020605) ++#define netdev_priv(dev) (dev)->priv ++#endif ++ ++/* Missing defines */ ++#ifndef SPEED_2500 ++#define SPEED_2500 2500 ++#endif ++ ++#ifndef SUPPORTED_Pause ++#define SUPPORTED_Pause (1 << 13) ++#endif ++#ifndef SUPPORTED_Asym_Pause ++#define SUPPORTED_Asym_Pause (1 << 14) ++#endif ++ ++#ifndef ADVERTISED_Pause ++#define ADVERTISED_Pause (1 << 13) ++#endif ++ ++#ifndef ADVERTISED_Asym_Pause ++#define ADVERTISED_Asym_Pause (1 << 14) ++#endif ++ ++#ifndef NETDEV_TX_BUSY ++#define NETDEV_TX_BUSY 1 /* driver tx path was busy */ ++#endif ++ ++#ifndef NETDEV_TX_OK ++#define NETDEV_TX_OK 0 /* driver took care of packet */ ++#endif ++ ++ ++#ifndef DMA_64BIT_MASK ++#define DMA_64BIT_MASK ((u64) 0xffffffffffffffffULL) ++#define DMA_32BIT_MASK ((u64) 0x00000000ffffffffULL) ++#endif ++ ++#ifndef PCI_CAP_ID_EXP ++#define PCI_CAP_ID_EXP 0x10 ++#endif ++ ++#ifndef PCI_EXP_DEVCTL ++#define PCI_EXP_DEVCTL 8 /* Device Control */ ++#endif ++ ++#ifndef PCI_EXP_DEVCTL_PAYLOAD ++#define PCI_EXP_DEVCTL_PAYLOAD 0x00e0 /* Max_Payload_Size */ ++#endif ++ ++#ifndef PCI_EXP_DEVCTL_READRQ ++#define PCI_EXP_DEVCTL_READRQ 0x7000 /* Max_Read_Request_Size */ ++#endif ++ ++ ++#if (LINUX_VERSION_CODE < 0x020618) ++ ++#ifndef NETIF_F_HW_CSUM ++#define NETIF_F_HW_CSUM 8 ++#endif ++ ++static inline int bnx2x_set_tx_hw_csum(struct net_device *dev, u32 data) ++{ ++ if (data) ++ dev->features |= NETIF_F_HW_CSUM; ++ else ++ dev->features &= ~NETIF_F_HW_CSUM; ++ return 0; ++} ++#endif ++ ++ ++/* If mutex is not available, use semaphore */ ++#ifndef __LINUX_MUTEX_H ++#define mutex semaphore ++#define mutex_lock(x) down(x) ++#define mutex_unlock(x) up(x) ++#define mutex_init(x) sema_init(x,1) ++#endif ++ ++ ++#ifndef KERN_CONT ++#define KERN_CONT "" ++#endif ++ ++ ++#if (LINUX_VERSION_CODE < 0x020619) ++#define le16_add_cpu(var, val) *var = cpu_to_le16(le16_to_cpup(var) + val) ++#define le32_add_cpu(var, val) *var = cpu_to_le32(le32_to_cpup(var) + val) ++#endif ++ ++ ++#if (LINUX_VERSION_CODE < 0x02061b) || defined(BNX2X_DRIVER_DISK) || defined(__VMKLNX__) ++ ++/* ++ * This is the CRC-32C table ++ * Generated with: ++ * width = 32 bits ++ * poly = 0x1EDC6F41 ++ * reflect input bytes = true ++ * reflect output bytes = true ++ */ ++ ++static u32 crc32c_table[256] = { ++ 0x00000000L, 0xF26B8303L, 0xE13B70F7L, 0x1350F3F4L, ++ 0xC79A971FL, 0x35F1141CL, 0x26A1E7E8L, 0xD4CA64EBL, ++ 0x8AD958CFL, 0x78B2DBCCL, 0x6BE22838L, 0x9989AB3BL, ++ 0x4D43CFD0L, 0xBF284CD3L, 0xAC78BF27L, 0x5E133C24L, ++ 0x105EC76FL, 0xE235446CL, 0xF165B798L, 0x030E349BL, ++ 0xD7C45070L, 0x25AFD373L, 0x36FF2087L, 0xC494A384L, ++ 0x9A879FA0L, 0x68EC1CA3L, 0x7BBCEF57L, 0x89D76C54L, ++ 0x5D1D08BFL, 0xAF768BBCL, 0xBC267848L, 0x4E4DFB4BL, ++ 0x20BD8EDEL, 0xD2D60DDDL, 0xC186FE29L, 0x33ED7D2AL, ++ 0xE72719C1L, 0x154C9AC2L, 0x061C6936L, 0xF477EA35L, ++ 0xAA64D611L, 0x580F5512L, 0x4B5FA6E6L, 0xB93425E5L, ++ 0x6DFE410EL, 0x9F95C20DL, 0x8CC531F9L, 0x7EAEB2FAL, ++ 0x30E349B1L, 0xC288CAB2L, 0xD1D83946L, 0x23B3BA45L, ++ 0xF779DEAEL, 0x05125DADL, 0x1642AE59L, 0xE4292D5AL, ++ 0xBA3A117EL, 0x4851927DL, 0x5B016189L, 0xA96AE28AL, ++ 0x7DA08661L, 0x8FCB0562L, 0x9C9BF696L, 0x6EF07595L, ++ 0x417B1DBCL, 0xB3109EBFL, 0xA0406D4BL, 0x522BEE48L, ++ 0x86E18AA3L, 0x748A09A0L, 0x67DAFA54L, 0x95B17957L, ++ 0xCBA24573L, 0x39C9C670L, 0x2A993584L, 0xD8F2B687L, ++ 0x0C38D26CL, 0xFE53516FL, 0xED03A29BL, 0x1F682198L, ++ 0x5125DAD3L, 0xA34E59D0L, 0xB01EAA24L, 0x42752927L, ++ 0x96BF4DCCL, 0x64D4CECFL, 0x77843D3BL, 0x85EFBE38L, ++ 0xDBFC821CL, 0x2997011FL, 0x3AC7F2EBL, 0xC8AC71E8L, ++ 0x1C661503L, 0xEE0D9600L, 0xFD5D65F4L, 0x0F36E6F7L, ++ 0x61C69362L, 0x93AD1061L, 0x80FDE395L, 0x72966096L, ++ 0xA65C047DL, 0x5437877EL, 0x4767748AL, 0xB50CF789L, ++ 0xEB1FCBADL, 0x197448AEL, 0x0A24BB5AL, 0xF84F3859L, ++ 0x2C855CB2L, 0xDEEEDFB1L, 0xCDBE2C45L, 0x3FD5AF46L, ++ 0x7198540DL, 0x83F3D70EL, 0x90A324FAL, 0x62C8A7F9L, ++ 0xB602C312L, 0x44694011L, 0x5739B3E5L, 0xA55230E6L, ++ 0xFB410CC2L, 0x092A8FC1L, 0x1A7A7C35L, 0xE811FF36L, ++ 0x3CDB9BDDL, 0xCEB018DEL, 0xDDE0EB2AL, 0x2F8B6829L, ++ 0x82F63B78L, 0x709DB87BL, 0x63CD4B8FL, 0x91A6C88CL, ++ 0x456CAC67L, 0xB7072F64L, 0xA457DC90L, 0x563C5F93L, ++ 0x082F63B7L, 0xFA44E0B4L, 0xE9141340L, 0x1B7F9043L, ++ 0xCFB5F4A8L, 0x3DDE77ABL, 0x2E8E845FL, 0xDCE5075CL, ++ 0x92A8FC17L, 0x60C37F14L, 0x73938CE0L, 0x81F80FE3L, ++ 0x55326B08L, 0xA759E80BL, 0xB4091BFFL, 0x466298FCL, ++ 0x1871A4D8L, 0xEA1A27DBL, 0xF94AD42FL, 0x0B21572CL, ++ 0xDFEB33C7L, 0x2D80B0C4L, 0x3ED04330L, 0xCCBBC033L, ++ 0xA24BB5A6L, 0x502036A5L, 0x4370C551L, 0xB11B4652L, ++ 0x65D122B9L, 0x97BAA1BAL, 0x84EA524EL, 0x7681D14DL, ++ 0x2892ED69L, 0xDAF96E6AL, 0xC9A99D9EL, 0x3BC21E9DL, ++ 0xEF087A76L, 0x1D63F975L, 0x0E330A81L, 0xFC588982L, ++ 0xB21572C9L, 0x407EF1CAL, 0x532E023EL, 0xA145813DL, ++ 0x758FE5D6L, 0x87E466D5L, 0x94B49521L, 0x66DF1622L, ++ 0x38CC2A06L, 0xCAA7A905L, 0xD9F75AF1L, 0x2B9CD9F2L, ++ 0xFF56BD19L, 0x0D3D3E1AL, 0x1E6DCDEEL, 0xEC064EEDL, ++ 0xC38D26C4L, 0x31E6A5C7L, 0x22B65633L, 0xD0DDD530L, ++ 0x0417B1DBL, 0xF67C32D8L, 0xE52CC12CL, 0x1747422FL, ++ 0x49547E0BL, 0xBB3FFD08L, 0xA86F0EFCL, 0x5A048DFFL, ++ 0x8ECEE914L, 0x7CA56A17L, 0x6FF599E3L, 0x9D9E1AE0L, ++ 0xD3D3E1ABL, 0x21B862A8L, 0x32E8915CL, 0xC083125FL, ++ 0x144976B4L, 0xE622F5B7L, 0xF5720643L, 0x07198540L, ++ 0x590AB964L, 0xAB613A67L, 0xB831C993L, 0x4A5A4A90L, ++ 0x9E902E7BL, 0x6CFBAD78L, 0x7FAB5E8CL, 0x8DC0DD8FL, ++ 0xE330A81AL, 0x115B2B19L, 0x020BD8EDL, 0xF0605BEEL, ++ 0x24AA3F05L, 0xD6C1BC06L, 0xC5914FF2L, 0x37FACCF1L, ++ 0x69E9F0D5L, 0x9B8273D6L, 0x88D28022L, 0x7AB90321L, ++ 0xAE7367CAL, 0x5C18E4C9L, 0x4F48173DL, 0xBD23943EL, ++ 0xF36E6F75L, 0x0105EC76L, 0x12551F82L, 0xE03E9C81L, ++ 0x34F4F86AL, 0xC69F7B69L, 0xD5CF889DL, 0x27A40B9EL, ++ 0x79B737BAL, 0x8BDCB4B9L, 0x988C474DL, 0x6AE7C44EL, ++ 0xBE2DA0A5L, 0x4C4623A6L, 0x5F16D052L, 0xAD7D5351L ++}; ++ ++/* ++ * Steps through buffer one byte at at time, calculates reflected ++ * crc using table. ++ */ ++ ++static inline u32 /*__attribute_pure__*/ ++crc32c_le(u32 seed, unsigned char const *data, size_t length) ++{ ++ __le32 crc = __cpu_to_le32(seed); ++ ++ while (length--) ++ crc = crc32c_table[(crc ^ *data++) & 0xFFL] ^ (crc >> 8); ++ ++ return __le32_to_cpu(crc); ++} ++#endif ++ ++/* Taken from drivers/net/mdio.c */ ++#if (LINUX_VERSION_CODE < 0x02061f) ++#include ++ ++/* MDIO Manageable Devices (MMDs). */ ++#define MDIO_MMD_AN 7 /* Auto-Negotiation */ ++ ++/* Generic MDIO registers. */ ++#define MDIO_AN_ADVERTISE 16 /* AN advertising (base page) */ ++#define MDIO_AN_LPA 19 /* AN LP abilities (base page) */ ++ ++/* Device present registers. */ ++#define MDIO_DEVS_PRESENT(devad) (1 << (devad)) ++#define MDIO_DEVS_AN MDIO_DEVS_PRESENT(MDIO_MMD_AN) ++ ++/** ++ * struct mdio_if_info - Ethernet controller MDIO interface ++ * @prtad: PRTAD of the PHY (%MDIO_PRTAD_NONE if not present/unknown) ++ * @mmds: Mask of MMDs expected to be present in the PHY. This must be ++ * non-zero unless @prtad = %MDIO_PRTAD_NONE. ++ * @mode_support: MDIO modes supported. If %MDIO_SUPPORTS_C22 is set then ++ * MII register access will be passed through with @devad = ++ * %MDIO_DEVAD_NONE. If %MDIO_EMULATE_C22 is set then access to ++ * commonly used clause 22 registers will be translated into ++ * clause 45 registers. ++ * @dev: Net device structure ++ * @mdio_read: Register read function; returns value or negative error code ++ * @mdio_write: Register write function; returns 0 or negative error code ++ */ ++struct mdio_if_info { ++ int prtad; ++ u32 __bitwise mmds; ++ unsigned mode_support; ++ ++ struct net_device *dev; ++ int (*mdio_read)(struct net_device *dev, int prtad, int devad, ++ u16 addr); ++ int (*mdio_write)(struct net_device *dev, int prtad, int devad, ++ u16 addr, u16 val); ++}; ++ ++#define MDIO_PRTAD_NONE (-1) ++#define MDIO_DEVAD_NONE (-1) ++#define MDIO_EMULATE_C22 4 ++ ++/* Mapping between MDIO PRTAD/DEVAD and mii_ioctl_data::phy_id */ ++ ++#define MDIO_PHY_ID_C45 0x8000 ++#define MDIO_PHY_ID_PRTAD 0x03e0 ++#define MDIO_PHY_ID_DEVAD 0x001f ++#define MDIO_PHY_ID_C45_MASK \ ++ (MDIO_PHY_ID_C45 | MDIO_PHY_ID_PRTAD | MDIO_PHY_ID_DEVAD) ++ ++static inline int mdio_phy_id_is_c45(int phy_id) ++{ ++ return (phy_id & MDIO_PHY_ID_C45) && !(phy_id & ~MDIO_PHY_ID_C45_MASK); ++} ++ ++static inline __u16 mdio_phy_id_prtad(int phy_id) ++{ ++ return (phy_id & MDIO_PHY_ID_PRTAD) >> 5; ++} ++ ++static inline __u16 mdio_phy_id_devad(int phy_id) ++{ ++ return phy_id & MDIO_PHY_ID_DEVAD; ++} ++ ++#define MDIO_SUPPORTS_C22 1 ++#define MDIO_SUPPORTS_C45 2 ++ ++/** ++ * mdio_mii_ioctl - MII ioctl interface for MDIO (clause 22 or 45) PHYs ++ * @mdio: MDIO interface ++ * @mii_data: MII ioctl data structure ++ * @cmd: MII ioctl command ++ * ++ * Returns 0 on success, negative on error. ++ */ ++static inline int mdio_mii_ioctl(const struct mdio_if_info *mdio, ++ struct mii_ioctl_data *mii_data, int cmd) ++{ ++ int prtad, devad; ++ u16 addr = mii_data->reg_num; ++ ++ /* Validate/convert cmd to one of SIOC{G,S}MIIREG */ ++ switch (cmd) { ++ case SIOCGMIIPHY: ++ if (mdio->prtad == MDIO_PRTAD_NONE) ++ return -EOPNOTSUPP; ++ mii_data->phy_id = mdio->prtad; ++ cmd = SIOCGMIIREG; ++ break; ++ case SIOCGMIIREG: ++ break; ++ case SIOCSMIIREG: ++ if (!capable(CAP_NET_ADMIN)) ++ return -EPERM; ++ break; ++ default: ++ return -EOPNOTSUPP; ++ } ++ ++ /* Validate/convert phy_id */ ++ if ((mdio->mode_support & MDIO_SUPPORTS_C45) && ++ mdio_phy_id_is_c45(mii_data->phy_id)) { ++ prtad = mdio_phy_id_prtad(mii_data->phy_id); ++ devad = mdio_phy_id_devad(mii_data->phy_id); ++ } else if ((mdio->mode_support & MDIO_SUPPORTS_C22) && ++ mii_data->phy_id < 0x20) { ++ prtad = mii_data->phy_id; ++ devad = MDIO_DEVAD_NONE; ++ addr &= 0x1f; ++ } else if ((mdio->mode_support & MDIO_EMULATE_C22) && ++ mdio->prtad != MDIO_PRTAD_NONE && ++ mii_data->phy_id == mdio->prtad) { ++ /* Remap commonly-used MII registers. */ ++ prtad = mdio->prtad; ++ switch (addr) { ++ case MII_BMCR: ++ case MII_BMSR: ++ case MII_PHYSID1: ++ case MII_PHYSID2: ++ devad = __ffs(mdio->mmds); ++ break; ++ case MII_ADVERTISE: ++ case MII_LPA: ++ if (!(mdio->mmds & MDIO_DEVS_AN)) ++ return -EINVAL; ++ devad = MDIO_MMD_AN; ++ if (addr == MII_ADVERTISE) ++ addr = MDIO_AN_ADVERTISE; ++ else ++ addr = MDIO_AN_LPA; ++ break; ++ default: ++ return -EINVAL; ++ } ++ } else { ++ return -EINVAL; ++ } ++ ++ if (cmd == SIOCGMIIREG) { ++ int rc = mdio->mdio_read(mdio->dev, prtad, devad, addr); ++ if (rc < 0) ++ return rc; ++ mii_data->val_out = rc; ++ return 0; ++ } else { ++ return mdio->mdio_write(mdio->dev, prtad, devad, addr, ++ mii_data->val_in); ++ } ++} ++#endif ++ ++#endif /* __BNX2X_COMPAT_H__ */ +diff -r ddb96c0bbe13 drivers/net/bnx2x_dump.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/bnx2x_dump.h Tue Jun 16 13:15:30 2009 +0100 +@@ -0,0 +1,542 @@ ++/* bnx2x_dump.h: Broadcom Everest network driver. ++ * ++ * Copyright (c) 2009 Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2, available ++ * at http://www.gnu.org/licenses/old-licenses/gpl-2.0.html (the "GPL"). ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a ++ * license other than the GPL, without Broadcom's express prior written ++ * consent. ++ * ++ * Written by: Yitchak Gertner ++ */ ++ ++ ++/* This struct holds a signature to ensure the dump returned from the driver ++ * match the meta data file inserted to grc_dump.tcl ++ * The signature is time stamp, diag version and grc_dump version ++ */ ++ ++#ifndef BNX2X_DUMP_H ++#define BNX2X_DUMP_H ++ ++ ++struct dump_sign { ++ u32 time_stamp; ++ u32 diag_ver; ++ u32 grc_dump_ver; ++}; ++ ++#define TSTORM_WAITP_ADDR 0x1b8a80 ++#define CSTORM_WAITP_ADDR 0x238a80 ++#define XSTORM_WAITP_ADDR 0x2b8a80 ++#define USTORM_WAITP_ADDR 0x338a80 ++#define TSTORM_CAM_MODE 0x1b1440 ++ ++#define RI_E1 0x1 ++#define RI_E1H 0x2 ++#define RI_ONLINE 0x100 ++ ++#define RI_E1_OFFLINE (RI_E1) ++#define RI_E1_ONLINE (RI_E1 | RI_ONLINE) ++#define RI_E1H_OFFLINE (RI_E1H) ++#define RI_E1H_ONLINE (RI_E1H | RI_ONLINE) ++#define RI_ALL_OFFLINE (RI_E1 | RI_E1H) ++#define RI_ALL_ONLINE (RI_E1 | RI_E1H | RI_ONLINE) ++ ++#define MAX_TIMER_PENDING 200 ++#define TIMER_SCAN_DONT_CARE 0xFF ++ ++ ++struct dump_hdr { ++ u32 hdr_size; /* in dwords, excluding this field */ ++ struct dump_sign dump_sign; ++ u32 xstorm_waitp; ++ u32 tstorm_waitp; ++ u32 ustorm_waitp; ++ u32 cstorm_waitp; ++ u16 info; ++ u8 idle_chk; ++ u8 reserved; ++}; ++ ++struct reg_addr { ++ u32 addr; ++ u32 size; ++ u16 info; ++}; ++ ++struct wreg_addr { ++ u32 addr; ++ u32 size; ++ u32 read_regs_count; ++ const u32 *read_regs; ++ u16 info; ++}; ++ ++ ++#define REGS_COUNT 558 ++static const struct reg_addr reg_addrs[REGS_COUNT] = { ++ { 0x2000, 341, RI_ALL_ONLINE }, { 0x2800, 103, RI_ALL_ONLINE }, ++ { 0x3000, 287, RI_ALL_ONLINE }, { 0x3800, 331, RI_ALL_ONLINE }, ++ { 0x8800, 6, RI_E1_ONLINE }, { 0xa000, 223, RI_ALL_ONLINE }, ++ { 0xa388, 1, RI_ALL_ONLINE }, { 0xa398, 1, RI_ALL_ONLINE }, ++ { 0xa39c, 7, RI_E1H_ONLINE }, { 0xa3c0, 3, RI_E1H_ONLINE }, ++ { 0xa3d0, 1, RI_E1H_ONLINE }, { 0xa3d8, 1, RI_E1H_ONLINE }, ++ { 0xa3e0, 1, RI_E1H_ONLINE }, { 0xa3e8, 1, RI_E1H_ONLINE }, ++ { 0xa3f0, 1, RI_E1H_ONLINE }, { 0xa3f8, 1, RI_E1H_ONLINE }, ++ { 0xa400, 69, RI_ALL_ONLINE }, { 0xa518, 1, RI_ALL_ONLINE }, ++ { 0xa520, 1, RI_ALL_ONLINE }, { 0xa528, 1, RI_ALL_ONLINE }, ++ { 0xa530, 1, RI_ALL_ONLINE }, { 0xa538, 1, RI_ALL_ONLINE }, ++ { 0xa540, 1, RI_ALL_ONLINE }, { 0xa548, 1, RI_ALL_ONLINE }, ++ { 0xa550, 1, RI_ALL_ONLINE }, { 0xa558, 1, RI_ALL_ONLINE }, ++ { 0xa560, 1, RI_ALL_ONLINE }, { 0xa568, 1, RI_ALL_ONLINE }, ++ { 0xa570, 1, RI_ALL_ONLINE }, { 0xa580, 1, RI_ALL_ONLINE }, ++ { 0xa590, 1, RI_ALL_ONLINE }, { 0xa5a0, 1, RI_ALL_ONLINE }, ++ { 0xa5c0, 1, RI_ALL_ONLINE }, { 0xa5e0, 1, RI_E1H_ONLINE }, ++ { 0xa5e8, 1, RI_E1H_ONLINE }, { 0xa5f0, 1, RI_E1H_ONLINE }, ++ { 0xa5f8, 10, RI_E1H_ONLINE }, { 0x10000, 236, RI_ALL_ONLINE }, ++ { 0x103bc, 1, RI_ALL_ONLINE }, { 0x103cc, 1, RI_ALL_ONLINE }, ++ { 0x103dc, 1, RI_ALL_ONLINE }, { 0x10400, 57, RI_ALL_ONLINE }, ++ { 0x104e8, 2, RI_ALL_ONLINE }, { 0x104f4, 2, RI_ALL_ONLINE }, ++ { 0x10500, 146, RI_ALL_ONLINE }, { 0x10750, 2, RI_ALL_ONLINE }, ++ { 0x10760, 2, RI_ALL_ONLINE }, { 0x10770, 2, RI_ALL_ONLINE }, ++ { 0x10780, 2, RI_ALL_ONLINE }, { 0x10790, 2, RI_ALL_ONLINE }, ++ { 0x107a0, 2, RI_ALL_ONLINE }, { 0x107b0, 2, RI_ALL_ONLINE }, ++ { 0x107c0, 2, RI_ALL_ONLINE }, { 0x107d0, 2, RI_ALL_ONLINE }, ++ { 0x107e0, 2, RI_ALL_ONLINE }, { 0x10880, 2, RI_ALL_ONLINE }, ++ { 0x10900, 2, RI_ALL_ONLINE }, { 0x12000, 1, RI_ALL_ONLINE }, ++ { 0x14000, 1, RI_ALL_ONLINE }, { 0x16000, 26, RI_E1H_ONLINE }, ++ { 0x16070, 18, RI_E1H_ONLINE }, { 0x160c0, 27, RI_E1H_ONLINE }, ++ { 0x16140, 1, RI_E1H_ONLINE }, { 0x16160, 1, RI_E1H_ONLINE }, ++ { 0x16180, 2, RI_E1H_ONLINE }, { 0x161c0, 2, RI_E1H_ONLINE }, ++ { 0x16204, 5, RI_E1H_ONLINE }, { 0x18000, 1, RI_E1H_ONLINE }, ++ { 0x18008, 1, RI_E1H_ONLINE }, { 0x20000, 24, RI_ALL_ONLINE }, ++ { 0x20060, 8, RI_ALL_ONLINE }, { 0x20080, 138, RI_ALL_ONLINE }, ++ { 0x202b4, 1, RI_ALL_ONLINE }, { 0x202c4, 1, RI_ALL_ONLINE }, ++ { 0x20400, 2, RI_ALL_ONLINE }, { 0x2040c, 8, RI_ALL_ONLINE }, ++ { 0x2042c, 18, RI_E1H_ONLINE }, { 0x20480, 1, RI_ALL_ONLINE }, ++ { 0x20500, 1, RI_ALL_ONLINE }, { 0x20600, 1, RI_ALL_ONLINE }, ++ { 0x28000, 1, RI_ALL_ONLINE }, { 0x28004, 8191, RI_ALL_OFFLINE }, ++ { 0x30000, 1, RI_ALL_ONLINE }, { 0x30004, 16383, RI_ALL_OFFLINE }, ++ { 0x40000, 98, RI_ALL_ONLINE }, { 0x40194, 1, RI_ALL_ONLINE }, ++ { 0x401a4, 1, RI_ALL_ONLINE }, { 0x401a8, 11, RI_E1H_ONLINE }, ++ { 0x40200, 4, RI_ALL_ONLINE }, { 0x40400, 43, RI_ALL_ONLINE }, ++ { 0x404b8, 1, RI_ALL_ONLINE }, { 0x404c8, 1, RI_ALL_ONLINE }, ++ { 0x404cc, 3, RI_E1H_ONLINE }, { 0x40500, 2, RI_ALL_ONLINE }, ++ { 0x40510, 2, RI_ALL_ONLINE }, { 0x40520, 2, RI_ALL_ONLINE }, ++ { 0x40530, 2, RI_ALL_ONLINE }, { 0x40540, 2, RI_ALL_ONLINE }, ++ { 0x42000, 164, RI_ALL_ONLINE }, { 0x4229c, 1, RI_ALL_ONLINE }, ++ { 0x422ac, 1, RI_ALL_ONLINE }, { 0x422bc, 1, RI_ALL_ONLINE }, ++ { 0x422d4, 5, RI_E1H_ONLINE }, { 0x42400, 49, RI_ALL_ONLINE }, ++ { 0x424c8, 38, RI_ALL_ONLINE }, { 0x42568, 2, RI_ALL_ONLINE }, ++ { 0x42800, 1, RI_ALL_ONLINE }, { 0x50000, 20, RI_ALL_ONLINE }, ++ { 0x50050, 8, RI_ALL_ONLINE }, { 0x50070, 88, RI_ALL_ONLINE }, ++ { 0x501dc, 1, RI_ALL_ONLINE }, { 0x501ec, 1, RI_ALL_ONLINE }, ++ { 0x501f0, 4, RI_E1H_ONLINE }, { 0x50200, 2, RI_ALL_ONLINE }, ++ { 0x5020c, 7, RI_ALL_ONLINE }, { 0x50228, 6, RI_E1H_ONLINE }, ++ { 0x50240, 1, RI_ALL_ONLINE }, { 0x50280, 1, RI_ALL_ONLINE }, ++ { 0x52000, 1, RI_ALL_ONLINE }, { 0x54000, 1, RI_ALL_ONLINE }, ++ { 0x54004, 3327, RI_ALL_OFFLINE }, { 0x58000, 1, RI_ALL_ONLINE }, ++ { 0x58004, 8191, RI_ALL_OFFLINE }, { 0x60000, 71, RI_ALL_ONLINE }, ++ { 0x60128, 1, RI_ALL_ONLINE }, { 0x60138, 1, RI_ALL_ONLINE }, ++ { 0x6013c, 24, RI_E1H_ONLINE }, { 0x60200, 1, RI_ALL_ONLINE }, ++ { 0x61000, 1, RI_ALL_ONLINE }, { 0x61004, 511, RI_ALL_OFFLINE }, ++ { 0x70000, 8, RI_ALL_ONLINE }, { 0x70020, 21496, RI_ALL_OFFLINE }, ++ { 0x85000, 3, RI_ALL_ONLINE }, { 0x8500c, 4, RI_ALL_OFFLINE }, ++ { 0x8501c, 7, RI_ALL_ONLINE }, { 0x85038, 4, RI_ALL_OFFLINE }, ++ { 0x85048, 1, RI_ALL_ONLINE }, { 0x8504c, 109, RI_ALL_OFFLINE }, ++ { 0x85200, 32, RI_ALL_ONLINE }, { 0x85280, 11104, RI_ALL_OFFLINE }, ++ { 0xa0000, 16384, RI_ALL_ONLINE }, { 0xb0000, 16384, RI_E1H_ONLINE }, ++ { 0xc1000, 7, RI_ALL_ONLINE }, { 0xc1028, 1, RI_ALL_ONLINE }, ++ { 0xc1038, 1, RI_ALL_ONLINE }, { 0xc1800, 2, RI_ALL_ONLINE }, ++ { 0xc2000, 164, RI_ALL_ONLINE }, { 0xc229c, 1, RI_ALL_ONLINE }, ++ { 0xc22ac, 1, RI_ALL_ONLINE }, { 0xc22bc, 1, RI_ALL_ONLINE }, ++ { 0xc2400, 49, RI_ALL_ONLINE }, { 0xc24c8, 38, RI_ALL_ONLINE }, ++ { 0xc2568, 2, RI_ALL_ONLINE }, { 0xc2600, 1, RI_ALL_ONLINE }, ++ { 0xc4000, 165, RI_ALL_ONLINE }, { 0xc42a0, 1, RI_ALL_ONLINE }, ++ { 0xc42b0, 1, RI_ALL_ONLINE }, { 0xc42c0, 1, RI_ALL_ONLINE }, ++ { 0xc42e0, 7, RI_E1H_ONLINE }, { 0xc4400, 51, RI_ALL_ONLINE }, ++ { 0xc44d0, 38, RI_ALL_ONLINE }, { 0xc4570, 2, RI_ALL_ONLINE }, ++ { 0xc4600, 1, RI_ALL_ONLINE }, { 0xd0000, 19, RI_ALL_ONLINE }, ++ { 0xd004c, 8, RI_ALL_ONLINE }, { 0xd006c, 91, RI_ALL_ONLINE }, ++ { 0xd01e4, 1, RI_ALL_ONLINE }, { 0xd01f4, 1, RI_ALL_ONLINE }, ++ { 0xd0200, 2, RI_ALL_ONLINE }, { 0xd020c, 7, RI_ALL_ONLINE }, ++ { 0xd0228, 18, RI_E1H_ONLINE }, { 0xd0280, 1, RI_ALL_ONLINE }, ++ { 0xd0300, 1, RI_ALL_ONLINE }, { 0xd0400, 1, RI_ALL_ONLINE }, ++ { 0xd4000, 1, RI_ALL_ONLINE }, { 0xd4004, 2559, RI_ALL_OFFLINE }, ++ { 0xd8000, 1, RI_ALL_ONLINE }, { 0xd8004, 8191, RI_ALL_OFFLINE }, ++ { 0xe0000, 21, RI_ALL_ONLINE }, { 0xe0054, 8, RI_ALL_ONLINE }, ++ { 0xe0074, 85, RI_ALL_ONLINE }, { 0xe01d4, 1, RI_ALL_ONLINE }, ++ { 0xe01e4, 1, RI_ALL_ONLINE }, { 0xe0200, 2, RI_ALL_ONLINE }, ++ { 0xe020c, 8, RI_ALL_ONLINE }, { 0xe022c, 18, RI_E1H_ONLINE }, ++ { 0xe0280, 1, RI_ALL_ONLINE }, { 0xe0300, 1, RI_ALL_ONLINE }, ++ { 0xe1000, 1, RI_ALL_ONLINE }, { 0xe2000, 1, RI_ALL_ONLINE }, ++ { 0xe2004, 2047, RI_ALL_OFFLINE }, { 0xf0000, 1, RI_ALL_ONLINE }, ++ { 0xf0004, 16383, RI_ALL_OFFLINE }, { 0x101000, 12, RI_ALL_ONLINE }, ++ { 0x10103c, 1, RI_ALL_ONLINE }, { 0x10104c, 1, RI_ALL_ONLINE }, ++ { 0x101050, 1, RI_E1H_ONLINE }, { 0x101100, 1, RI_ALL_ONLINE }, ++ { 0x101800, 8, RI_ALL_ONLINE }, { 0x102000, 18, RI_ALL_ONLINE }, ++ { 0x102054, 1, RI_ALL_ONLINE }, { 0x102064, 1, RI_ALL_ONLINE }, ++ { 0x102080, 17, RI_ALL_ONLINE }, { 0x1020c8, 8, RI_E1H_ONLINE }, ++ { 0x102400, 1, RI_ALL_ONLINE }, { 0x103000, 26, RI_ALL_ONLINE }, ++ { 0x103074, 1, RI_ALL_ONLINE }, { 0x103084, 1, RI_ALL_ONLINE }, ++ { 0x103094, 1, RI_ALL_ONLINE }, { 0x103098, 5, RI_E1H_ONLINE }, ++ { 0x103800, 8, RI_ALL_ONLINE }, { 0x104000, 63, RI_ALL_ONLINE }, ++ { 0x104108, 1, RI_ALL_ONLINE }, { 0x104118, 1, RI_ALL_ONLINE }, ++ { 0x104200, 17, RI_ALL_ONLINE }, { 0x104400, 64, RI_ALL_ONLINE }, ++ { 0x104500, 192, RI_ALL_OFFLINE }, { 0x104800, 64, RI_ALL_ONLINE }, ++ { 0x104900, 192, RI_ALL_OFFLINE }, { 0x105000, 7, RI_ALL_ONLINE }, ++ { 0x10501c, 1, RI_ALL_OFFLINE }, { 0x105020, 3, RI_ALL_ONLINE }, ++ { 0x10502c, 1, RI_ALL_OFFLINE }, { 0x105030, 3, RI_ALL_ONLINE }, ++ { 0x10503c, 1, RI_ALL_OFFLINE }, { 0x105040, 3, RI_ALL_ONLINE }, ++ { 0x10504c, 1, RI_ALL_OFFLINE }, { 0x105050, 3, RI_ALL_ONLINE }, ++ { 0x10505c, 1, RI_ALL_OFFLINE }, { 0x105060, 3, RI_ALL_ONLINE }, ++ { 0x10506c, 1, RI_ALL_OFFLINE }, { 0x105070, 3, RI_ALL_ONLINE }, ++ { 0x10507c, 1, RI_ALL_OFFLINE }, { 0x105080, 3, RI_ALL_ONLINE }, ++ { 0x10508c, 1, RI_ALL_OFFLINE }, { 0x105090, 3, RI_ALL_ONLINE }, ++ { 0x10509c, 1, RI_ALL_OFFLINE }, { 0x1050a0, 3, RI_ALL_ONLINE }, ++ { 0x1050ac, 1, RI_ALL_OFFLINE }, { 0x1050b0, 3, RI_ALL_ONLINE }, ++ { 0x1050bc, 1, RI_ALL_OFFLINE }, { 0x1050c0, 3, RI_ALL_ONLINE }, ++ { 0x1050cc, 1, RI_ALL_OFFLINE }, { 0x1050d0, 3, RI_ALL_ONLINE }, ++ { 0x1050dc, 1, RI_ALL_OFFLINE }, { 0x1050e0, 3, RI_ALL_ONLINE }, ++ { 0x1050ec, 1, RI_ALL_OFFLINE }, { 0x1050f0, 3, RI_ALL_ONLINE }, ++ { 0x1050fc, 1, RI_ALL_OFFLINE }, { 0x105100, 3, RI_ALL_ONLINE }, ++ { 0x10510c, 1, RI_ALL_OFFLINE }, { 0x105110, 3, RI_ALL_ONLINE }, ++ { 0x10511c, 1, RI_ALL_OFFLINE }, { 0x105120, 3, RI_ALL_ONLINE }, ++ { 0x10512c, 1, RI_ALL_OFFLINE }, { 0x105130, 3, RI_ALL_ONLINE }, ++ { 0x10513c, 1, RI_ALL_OFFLINE }, { 0x105140, 3, RI_ALL_ONLINE }, ++ { 0x10514c, 1, RI_ALL_OFFLINE }, { 0x105150, 3, RI_ALL_ONLINE }, ++ { 0x10515c, 1, RI_ALL_OFFLINE }, { 0x105160, 3, RI_ALL_ONLINE }, ++ { 0x10516c, 1, RI_ALL_OFFLINE }, { 0x105170, 3, RI_ALL_ONLINE }, ++ { 0x10517c, 1, RI_ALL_OFFLINE }, { 0x105180, 3, RI_ALL_ONLINE }, ++ { 0x10518c, 1, RI_ALL_OFFLINE }, { 0x105190, 3, RI_ALL_ONLINE }, ++ { 0x10519c, 1, RI_ALL_OFFLINE }, { 0x1051a0, 3, RI_ALL_ONLINE }, ++ { 0x1051ac, 1, RI_ALL_OFFLINE }, { 0x1051b0, 3, RI_ALL_ONLINE }, ++ { 0x1051bc, 1, RI_ALL_OFFLINE }, { 0x1051c0, 3, RI_ALL_ONLINE }, ++ { 0x1051cc, 1, RI_ALL_OFFLINE }, { 0x1051d0, 3, RI_ALL_ONLINE }, ++ { 0x1051dc, 1, RI_ALL_OFFLINE }, { 0x1051e0, 3, RI_ALL_ONLINE }, ++ { 0x1051ec, 1, RI_ALL_OFFLINE }, { 0x1051f0, 3, RI_ALL_ONLINE }, ++ { 0x1051fc, 1, RI_ALL_OFFLINE }, { 0x105200, 3, RI_ALL_ONLINE }, ++ { 0x10520c, 1, RI_ALL_OFFLINE }, { 0x105210, 3, RI_ALL_ONLINE }, ++ { 0x10521c, 1, RI_ALL_OFFLINE }, { 0x105220, 3, RI_ALL_ONLINE }, ++ { 0x10522c, 1, RI_ALL_OFFLINE }, { 0x105230, 3, RI_ALL_ONLINE }, ++ { 0x10523c, 1, RI_ALL_OFFLINE }, { 0x105240, 3, RI_ALL_ONLINE }, ++ { 0x10524c, 1, RI_ALL_OFFLINE }, { 0x105250, 3, RI_ALL_ONLINE }, ++ { 0x10525c, 1, RI_ALL_OFFLINE }, { 0x105260, 3, RI_ALL_ONLINE }, ++ { 0x10526c, 1, RI_ALL_OFFLINE }, { 0x105270, 3, RI_ALL_ONLINE }, ++ { 0x10527c, 1, RI_ALL_OFFLINE }, { 0x105280, 3, RI_ALL_ONLINE }, ++ { 0x10528c, 1, RI_ALL_OFFLINE }, { 0x105290, 3, RI_ALL_ONLINE }, ++ { 0x10529c, 1, RI_ALL_OFFLINE }, { 0x1052a0, 3, RI_ALL_ONLINE }, ++ { 0x1052ac, 1, RI_ALL_OFFLINE }, { 0x1052b0, 3, RI_ALL_ONLINE }, ++ { 0x1052bc, 1, RI_ALL_OFFLINE }, { 0x1052c0, 3, RI_ALL_ONLINE }, ++ { 0x1052cc, 1, RI_ALL_OFFLINE }, { 0x1052d0, 3, RI_ALL_ONLINE }, ++ { 0x1052dc, 1, RI_ALL_OFFLINE }, { 0x1052e0, 3, RI_ALL_ONLINE }, ++ { 0x1052ec, 1, RI_ALL_OFFLINE }, { 0x1052f0, 3, RI_ALL_ONLINE }, ++ { 0x1052fc, 1, RI_ALL_OFFLINE }, { 0x105300, 3, RI_ALL_ONLINE }, ++ { 0x10530c, 1, RI_ALL_OFFLINE }, { 0x105310, 3, RI_ALL_ONLINE }, ++ { 0x10531c, 1, RI_ALL_OFFLINE }, { 0x105320, 3, RI_ALL_ONLINE }, ++ { 0x10532c, 1, RI_ALL_OFFLINE }, { 0x105330, 3, RI_ALL_ONLINE }, ++ { 0x10533c, 1, RI_ALL_OFFLINE }, { 0x105340, 3, RI_ALL_ONLINE }, ++ { 0x10534c, 1, RI_ALL_OFFLINE }, { 0x105350, 3, RI_ALL_ONLINE }, ++ { 0x10535c, 1, RI_ALL_OFFLINE }, { 0x105360, 3, RI_ALL_ONLINE }, ++ { 0x10536c, 1, RI_ALL_OFFLINE }, { 0x105370, 3, RI_ALL_ONLINE }, ++ { 0x10537c, 1, RI_ALL_OFFLINE }, { 0x105380, 3, RI_ALL_ONLINE }, ++ { 0x10538c, 1, RI_ALL_OFFLINE }, { 0x105390, 3, RI_ALL_ONLINE }, ++ { 0x10539c, 1, RI_ALL_OFFLINE }, { 0x1053a0, 3, RI_ALL_ONLINE }, ++ { 0x1053ac, 1, RI_ALL_OFFLINE }, { 0x1053b0, 3, RI_ALL_ONLINE }, ++ { 0x1053bc, 1, RI_ALL_OFFLINE }, { 0x1053c0, 3, RI_ALL_ONLINE }, ++ { 0x1053cc, 1, RI_ALL_OFFLINE }, { 0x1053d0, 3, RI_ALL_ONLINE }, ++ { 0x1053dc, 1, RI_ALL_OFFLINE }, { 0x1053e0, 3, RI_ALL_ONLINE }, ++ { 0x1053ec, 1, RI_ALL_OFFLINE }, { 0x1053f0, 3, RI_ALL_ONLINE }, ++ { 0x1053fc, 769, RI_ALL_OFFLINE }, { 0x108000, 33, RI_ALL_ONLINE }, ++ { 0x108090, 1, RI_ALL_ONLINE }, { 0x1080a0, 1, RI_ALL_ONLINE }, ++ { 0x1080ac, 5, RI_E1H_ONLINE }, { 0x108100, 5, RI_ALL_ONLINE }, ++ { 0x108120, 5, RI_ALL_ONLINE }, { 0x108200, 74, RI_ALL_ONLINE }, ++ { 0x108400, 74, RI_ALL_ONLINE }, { 0x108800, 152, RI_ALL_ONLINE }, ++ { 0x109000, 1, RI_ALL_ONLINE }, { 0x120000, 347, RI_ALL_ONLINE }, ++ { 0x120578, 1, RI_ALL_ONLINE }, { 0x120588, 1, RI_ALL_ONLINE }, ++ { 0x120598, 1, RI_ALL_ONLINE }, { 0x12059c, 23, RI_E1H_ONLINE }, ++ { 0x120614, 1, RI_E1H_ONLINE }, { 0x12061c, 30, RI_E1H_ONLINE }, ++ { 0x12080c, 65, RI_ALL_ONLINE }, { 0x120a00, 2, RI_ALL_ONLINE }, ++ { 0x122000, 2, RI_ALL_ONLINE }, { 0x128000, 2, RI_E1H_ONLINE }, ++ { 0x140000, 114, RI_ALL_ONLINE }, { 0x1401d4, 1, RI_ALL_ONLINE }, ++ { 0x1401e4, 1, RI_ALL_ONLINE }, { 0x140200, 6, RI_ALL_ONLINE }, ++ { 0x144000, 4, RI_ALL_ONLINE }, { 0x148000, 4, RI_ALL_ONLINE }, ++ { 0x14c000, 4, RI_ALL_ONLINE }, { 0x150000, 4, RI_ALL_ONLINE }, ++ { 0x154000, 4, RI_ALL_ONLINE }, { 0x158000, 4, RI_ALL_ONLINE }, ++ { 0x15c000, 7, RI_E1H_ONLINE }, { 0x161000, 7, RI_ALL_ONLINE }, ++ { 0x161028, 1, RI_ALL_ONLINE }, { 0x161038, 1, RI_ALL_ONLINE }, ++ { 0x161800, 2, RI_ALL_ONLINE }, { 0x164000, 60, RI_ALL_ONLINE }, ++ { 0x1640fc, 1, RI_ALL_ONLINE }, { 0x16410c, 1, RI_ALL_ONLINE }, ++ { 0x164110, 2, RI_E1H_ONLINE }, { 0x164200, 1, RI_ALL_ONLINE }, ++ { 0x164208, 1, RI_ALL_ONLINE }, { 0x164210, 1, RI_ALL_ONLINE }, ++ { 0x164218, 1, RI_ALL_ONLINE }, { 0x164220, 1, RI_ALL_ONLINE }, ++ { 0x164228, 1, RI_ALL_ONLINE }, { 0x164230, 1, RI_ALL_ONLINE }, ++ { 0x164238, 1, RI_ALL_ONLINE }, { 0x164240, 1, RI_ALL_ONLINE }, ++ { 0x164248, 1, RI_ALL_ONLINE }, { 0x164250, 1, RI_ALL_ONLINE }, ++ { 0x164258, 1, RI_ALL_ONLINE }, { 0x164260, 1, RI_ALL_ONLINE }, ++ { 0x164270, 2, RI_ALL_ONLINE }, { 0x164280, 2, RI_ALL_ONLINE }, ++ { 0x164800, 2, RI_ALL_ONLINE }, { 0x165000, 2, RI_ALL_ONLINE }, ++ { 0x166000, 164, RI_ALL_ONLINE }, { 0x16629c, 1, RI_ALL_ONLINE }, ++ { 0x1662ac, 1, RI_ALL_ONLINE }, { 0x1662bc, 1, RI_ALL_ONLINE }, ++ { 0x166400, 49, RI_ALL_ONLINE }, { 0x1664c8, 38, RI_ALL_ONLINE }, ++ { 0x166568, 2, RI_ALL_ONLINE }, { 0x166800, 1, RI_ALL_ONLINE }, ++ { 0x168000, 270, RI_ALL_ONLINE }, { 0x168444, 1, RI_ALL_ONLINE }, ++ { 0x168454, 1, RI_ALL_ONLINE }, { 0x168800, 19, RI_ALL_ONLINE }, ++ { 0x168900, 1, RI_ALL_ONLINE }, { 0x168a00, 128, RI_ALL_ONLINE }, ++ { 0x16a000, 1, RI_ALL_ONLINE }, { 0x16a004, 1535, RI_ALL_OFFLINE }, ++ { 0x16c000, 1, RI_ALL_ONLINE }, { 0x16c004, 1535, RI_ALL_OFFLINE }, ++ { 0x16e000, 16, RI_E1H_ONLINE }, { 0x16e100, 1, RI_E1H_ONLINE }, ++ { 0x16e200, 2, RI_E1H_ONLINE }, { 0x16e400, 183, RI_E1H_ONLINE }, ++ { 0x170000, 93, RI_ALL_ONLINE }, { 0x170180, 1, RI_ALL_ONLINE }, ++ { 0x170190, 1, RI_ALL_ONLINE }, { 0x170200, 4, RI_ALL_ONLINE }, ++ { 0x170214, 1, RI_ALL_ONLINE }, { 0x178000, 1, RI_ALL_ONLINE }, ++ { 0x180000, 61, RI_ALL_ONLINE }, { 0x180100, 1, RI_ALL_ONLINE }, ++ { 0x180110, 1, RI_ALL_ONLINE }, { 0x180120, 1, RI_ALL_ONLINE }, ++ { 0x180130, 1, RI_ALL_ONLINE }, { 0x18013c, 2, RI_E1H_ONLINE }, ++ { 0x180200, 58, RI_ALL_ONLINE }, { 0x180340, 4, RI_ALL_ONLINE }, ++ { 0x180400, 1, RI_ALL_ONLINE }, { 0x180404, 255, RI_ALL_OFFLINE }, ++ { 0x181000, 4, RI_ALL_ONLINE }, { 0x181010, 1020, RI_ALL_OFFLINE }, ++ { 0x1a0000, 1, RI_ALL_ONLINE }, { 0x1a0004, 1023, RI_ALL_OFFLINE }, ++ { 0x1a1000, 1, RI_ALL_ONLINE }, { 0x1a1004, 4607, RI_ALL_OFFLINE }, ++ { 0x1a5800, 2560, RI_E1H_OFFLINE }, { 0x1a8000, 64, RI_ALL_OFFLINE }, ++ { 0x1a8100, 1984, RI_E1H_OFFLINE }, { 0x1aa000, 1, RI_E1H_ONLINE }, ++ { 0x1aa004, 6655, RI_E1H_OFFLINE }, { 0x1b1800, 128, RI_ALL_OFFLINE }, ++ { 0x1b1c00, 128, RI_ALL_OFFLINE }, { 0x1b2000, 1, RI_ALL_OFFLINE }, ++ { 0x1b2400, 64, RI_E1H_OFFLINE }, { 0x1b8200, 1, RI_ALL_ONLINE }, ++ { 0x1b8240, 1, RI_ALL_ONLINE }, { 0x1b8280, 1, RI_ALL_ONLINE }, ++ { 0x1b82c0, 1, RI_ALL_ONLINE }, { 0x1b8a00, 1, RI_ALL_ONLINE }, ++ { 0x1b8a80, 1, RI_ALL_ONLINE }, { 0x1c0000, 2, RI_ALL_ONLINE }, ++ { 0x200000, 65, RI_ALL_ONLINE }, { 0x200110, 1, RI_ALL_ONLINE }, ++ { 0x200120, 1, RI_ALL_ONLINE }, { 0x200130, 1, RI_ALL_ONLINE }, ++ { 0x200140, 1, RI_ALL_ONLINE }, { 0x20014c, 2, RI_E1H_ONLINE }, ++ { 0x200200, 58, RI_ALL_ONLINE }, { 0x200340, 4, RI_ALL_ONLINE }, ++ { 0x200400, 1, RI_ALL_ONLINE }, { 0x200404, 255, RI_ALL_OFFLINE }, ++ { 0x202000, 4, RI_ALL_ONLINE }, { 0x202010, 2044, RI_ALL_OFFLINE }, ++ { 0x220000, 1, RI_ALL_ONLINE }, { 0x220004, 1023, RI_ALL_OFFLINE }, ++ { 0x221000, 1, RI_ALL_ONLINE }, { 0x221004, 4607, RI_ALL_OFFLINE }, ++ { 0x225800, 1536, RI_E1H_OFFLINE }, { 0x227000, 1, RI_E1H_ONLINE }, ++ { 0x227004, 1023, RI_E1H_OFFLINE }, { 0x228000, 64, RI_ALL_OFFLINE }, ++ { 0x228100, 8640, RI_E1H_OFFLINE }, { 0x231800, 128, RI_ALL_OFFLINE }, ++ { 0x231c00, 128, RI_ALL_OFFLINE }, { 0x232000, 1, RI_ALL_OFFLINE }, ++ { 0x232400, 64, RI_E1H_OFFLINE }, { 0x238200, 1, RI_ALL_ONLINE }, ++ { 0x238240, 1, RI_ALL_ONLINE }, { 0x238280, 1, RI_ALL_ONLINE }, ++ { 0x2382c0, 1, RI_ALL_ONLINE }, { 0x238a00, 1, RI_ALL_ONLINE }, ++ { 0x238a80, 1, RI_ALL_ONLINE }, { 0x240000, 2, RI_ALL_ONLINE }, ++ { 0x280000, 65, RI_ALL_ONLINE }, { 0x280110, 1, RI_ALL_ONLINE }, ++ { 0x280120, 1, RI_ALL_ONLINE }, { 0x280130, 1, RI_ALL_ONLINE }, ++ { 0x280140, 1, RI_ALL_ONLINE }, { 0x28014c, 2, RI_E1H_ONLINE }, ++ { 0x280200, 58, RI_ALL_ONLINE }, { 0x280340, 4, RI_ALL_ONLINE }, ++ { 0x280400, 1, RI_ALL_ONLINE }, { 0x280404, 255, RI_ALL_OFFLINE }, ++ { 0x282000, 4, RI_ALL_ONLINE }, { 0x282010, 2044, RI_ALL_OFFLINE }, ++ { 0x2a0000, 1, RI_ALL_ONLINE }, { 0x2a0004, 1023, RI_ALL_OFFLINE }, ++ { 0x2a1000, 1, RI_ALL_ONLINE }, { 0x2a1004, 4607, RI_ALL_OFFLINE }, ++ { 0x2a5800, 2560, RI_E1H_OFFLINE }, { 0x2a8000, 64, RI_ALL_OFFLINE }, ++ { 0x2a8100, 960, RI_E1H_OFFLINE }, { 0x2a9000, 1, RI_E1H_ONLINE }, ++ { 0x2a9004, 7679, RI_E1H_OFFLINE }, { 0x2b1800, 128, RI_ALL_OFFLINE }, ++ { 0x2b1c00, 128, RI_ALL_OFFLINE }, { 0x2b2000, 1, RI_ALL_OFFLINE }, ++ { 0x2b2400, 64, RI_E1H_OFFLINE }, { 0x2b8200, 1, RI_ALL_ONLINE }, ++ { 0x2b8240, 1, RI_ALL_ONLINE }, { 0x2b8280, 1, RI_ALL_ONLINE }, ++ { 0x2b82c0, 1, RI_ALL_ONLINE }, { 0x2b8a00, 1, RI_ALL_ONLINE }, ++ { 0x2b8a80, 1, RI_ALL_ONLINE }, { 0x2c0000, 2, RI_ALL_ONLINE }, ++ { 0x300000, 65, RI_ALL_ONLINE }, { 0x300110, 1, RI_ALL_ONLINE }, ++ { 0x300120, 1, RI_ALL_ONLINE }, { 0x300130, 1, RI_ALL_ONLINE }, ++ { 0x300140, 1, RI_ALL_ONLINE }, { 0x30014c, 2, RI_E1H_ONLINE }, ++ { 0x300200, 58, RI_ALL_ONLINE }, { 0x300340, 4, RI_ALL_ONLINE }, ++ { 0x300400, 1, RI_ALL_ONLINE }, { 0x300404, 255, RI_ALL_OFFLINE }, ++ { 0x302000, 4, RI_ALL_ONLINE }, { 0x302010, 2044, RI_ALL_OFFLINE }, ++ { 0x320000, 1, RI_ALL_ONLINE }, { 0x320004, 1023, RI_ALL_OFFLINE }, ++ { 0x321000, 1, RI_ALL_ONLINE }, { 0x321004, 4607, RI_ALL_OFFLINE }, ++ { 0x325800, 2560, RI_E1H_OFFLINE }, { 0x328000, 64, RI_ALL_OFFLINE }, ++ { 0x328100, 536, RI_E1H_OFFLINE }, { 0x328960, 1, RI_E1H_ONLINE }, ++ { 0x328964, 8103, RI_E1H_OFFLINE }, { 0x331800, 128, RI_ALL_OFFLINE }, ++ { 0x331c00, 128, RI_ALL_OFFLINE }, { 0x332000, 1, RI_ALL_OFFLINE }, ++ { 0x332400, 64, RI_E1H_OFFLINE }, { 0x338200, 1, RI_ALL_ONLINE }, ++ { 0x338240, 1, RI_ALL_ONLINE }, { 0x338280, 1, RI_ALL_ONLINE }, ++ { 0x3382c0, 1, RI_ALL_ONLINE }, { 0x338a00, 1, RI_ALL_ONLINE }, ++ { 0x338a80, 1, RI_ALL_ONLINE }, { 0x340000, 2, RI_ALL_ONLINE } ++}; ++ ++ ++#define IDLE_REGS_COUNT 277 ++static const struct reg_addr idle_addrs[IDLE_REGS_COUNT] = { ++ { 0x2114, 1, RI_ALL_ONLINE }, { 0x2120, 1, RI_ALL_ONLINE }, ++ { 0x212c, 4, RI_ALL_ONLINE }, { 0x2814, 1, RI_ALL_ONLINE }, ++ { 0x281c, 2, RI_ALL_ONLINE }, { 0xa38c, 1, RI_ALL_ONLINE }, ++ { 0xa408, 1, RI_ALL_ONLINE }, { 0xa42c, 12, RI_ALL_ONLINE }, ++ { 0xa600, 5, RI_E1H_ONLINE }, { 0xa618, 1, RI_E1H_ONLINE }, ++ { 0xc09c, 1, RI_ALL_ONLINE }, { 0x103b0, 1, RI_ALL_ONLINE }, ++ { 0x103c0, 1, RI_ALL_ONLINE }, { 0x103d0, 1, RI_E1H_ONLINE }, ++ { 0x2021c, 11, RI_ALL_ONLINE }, { 0x202a8, 1, RI_ALL_ONLINE }, ++ { 0x202b8, 1, RI_ALL_ONLINE }, { 0x20404, 1, RI_ALL_ONLINE }, ++ { 0x2040c, 2, RI_ALL_ONLINE }, { 0x2041c, 2, RI_ALL_ONLINE }, ++ { 0x40154, 14, RI_ALL_ONLINE }, { 0x40198, 1, RI_ALL_ONLINE }, ++ { 0x404ac, 1, RI_ALL_ONLINE }, { 0x404bc, 1, RI_ALL_ONLINE }, ++ { 0x42290, 1, RI_ALL_ONLINE }, { 0x422a0, 1, RI_ALL_ONLINE }, ++ { 0x422b0, 1, RI_ALL_ONLINE }, { 0x42548, 1, RI_ALL_ONLINE }, ++ { 0x42550, 1, RI_ALL_ONLINE }, { 0x42558, 1, RI_ALL_ONLINE }, ++ { 0x50160, 8, RI_ALL_ONLINE }, { 0x501d0, 1, RI_ALL_ONLINE }, ++ { 0x501e0, 1, RI_ALL_ONLINE }, { 0x50204, 1, RI_ALL_ONLINE }, ++ { 0x5020c, 2, RI_ALL_ONLINE }, { 0x5021c, 1, RI_ALL_ONLINE }, ++ { 0x60090, 1, RI_ALL_ONLINE }, { 0x6011c, 1, RI_ALL_ONLINE }, ++ { 0x6012c, 1, RI_ALL_ONLINE }, { 0xc101c, 1, RI_ALL_ONLINE }, ++ { 0xc102c, 1, RI_ALL_ONLINE }, { 0xc2290, 1, RI_ALL_ONLINE }, ++ { 0xc22a0, 1, RI_ALL_ONLINE }, { 0xc22b0, 1, RI_ALL_ONLINE }, ++ { 0xc2548, 1, RI_ALL_ONLINE }, { 0xc2550, 1, RI_ALL_ONLINE }, ++ { 0xc2558, 1, RI_ALL_ONLINE }, { 0xc4294, 1, RI_ALL_ONLINE }, ++ { 0xc42a4, 1, RI_ALL_ONLINE }, { 0xc42b4, 1, RI_ALL_ONLINE }, ++ { 0xc4550, 1, RI_ALL_ONLINE }, { 0xc4558, 1, RI_ALL_ONLINE }, ++ { 0xc4560, 1, RI_ALL_ONLINE }, { 0xd016c, 8, RI_ALL_ONLINE }, ++ { 0xd01d8, 1, RI_ALL_ONLINE }, { 0xd01e8, 1, RI_ALL_ONLINE }, ++ { 0xd0204, 1, RI_ALL_ONLINE }, { 0xd020c, 3, RI_ALL_ONLINE }, ++ { 0xe0154, 8, RI_ALL_ONLINE }, { 0xe01c8, 1, RI_ALL_ONLINE }, ++ { 0xe01d8, 1, RI_ALL_ONLINE }, { 0xe0204, 1, RI_ALL_ONLINE }, ++ { 0xe020c, 2, RI_ALL_ONLINE }, { 0xe021c, 2, RI_ALL_ONLINE }, ++ { 0x101014, 1, RI_ALL_ONLINE }, { 0x101030, 1, RI_ALL_ONLINE }, ++ { 0x101040, 1, RI_ALL_ONLINE }, { 0x102058, 1, RI_ALL_ONLINE }, ++ { 0x102080, 16, RI_ALL_ONLINE }, { 0x103004, 2, RI_ALL_ONLINE }, ++ { 0x103068, 1, RI_ALL_ONLINE }, { 0x103078, 1, RI_ALL_ONLINE }, ++ { 0x103088, 1, RI_ALL_ONLINE }, { 0x10309c, 2, RI_E1H_ONLINE }, ++ { 0x104004, 1, RI_ALL_ONLINE }, { 0x104018, 1, RI_ALL_ONLINE }, ++ { 0x104020, 1, RI_ALL_ONLINE }, { 0x10403c, 1, RI_ALL_ONLINE }, ++ { 0x1040fc, 1, RI_ALL_ONLINE }, { 0x10410c, 1, RI_ALL_ONLINE }, ++ { 0x104400, 64, RI_ALL_ONLINE }, { 0x104800, 64, RI_ALL_ONLINE }, ++ { 0x105000, 3, RI_ALL_ONLINE }, { 0x105010, 3, RI_ALL_ONLINE }, ++ { 0x105020, 3, RI_ALL_ONLINE }, { 0x105030, 3, RI_ALL_ONLINE }, ++ { 0x105040, 3, RI_ALL_ONLINE }, { 0x105050, 3, RI_ALL_ONLINE }, ++ { 0x105060, 3, RI_ALL_ONLINE }, { 0x105070, 3, RI_ALL_ONLINE }, ++ { 0x105080, 3, RI_ALL_ONLINE }, { 0x105090, 3, RI_ALL_ONLINE }, ++ { 0x1050a0, 3, RI_ALL_ONLINE }, { 0x1050b0, 3, RI_ALL_ONLINE }, ++ { 0x1050c0, 3, RI_ALL_ONLINE }, { 0x1050d0, 3, RI_ALL_ONLINE }, ++ { 0x1050e0, 3, RI_ALL_ONLINE }, { 0x1050f0, 3, RI_ALL_ONLINE }, ++ { 0x105100, 3, RI_ALL_ONLINE }, { 0x105110, 3, RI_ALL_ONLINE }, ++ { 0x105120, 3, RI_ALL_ONLINE }, { 0x105130, 3, RI_ALL_ONLINE }, ++ { 0x105140, 3, RI_ALL_ONLINE }, { 0x105150, 3, RI_ALL_ONLINE }, ++ { 0x105160, 3, RI_ALL_ONLINE }, { 0x105170, 3, RI_ALL_ONLINE }, ++ { 0x105180, 3, RI_ALL_ONLINE }, { 0x105190, 3, RI_ALL_ONLINE }, ++ { 0x1051a0, 3, RI_ALL_ONLINE }, { 0x1051b0, 3, RI_ALL_ONLINE }, ++ { 0x1051c0, 3, RI_ALL_ONLINE }, { 0x1051d0, 3, RI_ALL_ONLINE }, ++ { 0x1051e0, 3, RI_ALL_ONLINE }, { 0x1051f0, 3, RI_ALL_ONLINE }, ++ { 0x105200, 3, RI_ALL_ONLINE }, { 0x105210, 3, RI_ALL_ONLINE }, ++ { 0x105220, 3, RI_ALL_ONLINE }, { 0x105230, 3, RI_ALL_ONLINE }, ++ { 0x105240, 3, RI_ALL_ONLINE }, { 0x105250, 3, RI_ALL_ONLINE }, ++ { 0x105260, 3, RI_ALL_ONLINE }, { 0x105270, 3, RI_ALL_ONLINE }, ++ { 0x105280, 3, RI_ALL_ONLINE }, { 0x105290, 3, RI_ALL_ONLINE }, ++ { 0x1052a0, 3, RI_ALL_ONLINE }, { 0x1052b0, 3, RI_ALL_ONLINE }, ++ { 0x1052c0, 3, RI_ALL_ONLINE }, { 0x1052d0, 3, RI_ALL_ONLINE }, ++ { 0x1052e0, 3, RI_ALL_ONLINE }, { 0x1052f0, 3, RI_ALL_ONLINE }, ++ { 0x105300, 3, RI_ALL_ONLINE }, { 0x105310, 3, RI_ALL_ONLINE }, ++ { 0x105320, 3, RI_ALL_ONLINE }, { 0x105330, 3, RI_ALL_ONLINE }, ++ { 0x105340, 3, RI_ALL_ONLINE }, { 0x105350, 3, RI_ALL_ONLINE }, ++ { 0x105360, 3, RI_ALL_ONLINE }, { 0x105370, 3, RI_ALL_ONLINE }, ++ { 0x105380, 3, RI_ALL_ONLINE }, { 0x105390, 3, RI_ALL_ONLINE }, ++ { 0x1053a0, 3, RI_ALL_ONLINE }, { 0x1053b0, 3, RI_ALL_ONLINE }, ++ { 0x1053c0, 3, RI_ALL_ONLINE }, { 0x1053d0, 3, RI_ALL_ONLINE }, ++ { 0x1053e0, 3, RI_ALL_ONLINE }, { 0x1053f0, 3, RI_ALL_ONLINE }, ++ { 0x108094, 1, RI_ALL_ONLINE }, { 0x1201b0, 2, RI_ALL_ONLINE }, ++ { 0x12032c, 1, RI_ALL_ONLINE }, { 0x12036c, 3, RI_ALL_ONLINE }, ++ { 0x120408, 2, RI_ALL_ONLINE }, { 0x120414, 15, RI_ALL_ONLINE }, ++ { 0x120478, 2, RI_ALL_ONLINE }, { 0x12052c, 1, RI_ALL_ONLINE }, ++ { 0x120564, 3, RI_ALL_ONLINE }, { 0x12057c, 1, RI_ALL_ONLINE }, ++ { 0x12058c, 1, RI_ALL_ONLINE }, { 0x120608, 1, RI_E1H_ONLINE }, ++ { 0x120808, 1, RI_E1_ONLINE }, { 0x12080c, 2, RI_ALL_ONLINE }, ++ { 0x120818, 1, RI_ALL_ONLINE }, { 0x120820, 1, RI_ALL_ONLINE }, ++ { 0x120828, 1, RI_ALL_ONLINE }, { 0x120830, 1, RI_ALL_ONLINE }, ++ { 0x120838, 1, RI_ALL_ONLINE }, { 0x120840, 1, RI_ALL_ONLINE }, ++ { 0x120848, 1, RI_ALL_ONLINE }, { 0x120850, 1, RI_ALL_ONLINE }, ++ { 0x120858, 1, RI_ALL_ONLINE }, { 0x120860, 1, RI_ALL_ONLINE }, ++ { 0x120868, 1, RI_ALL_ONLINE }, { 0x120870, 1, RI_ALL_ONLINE }, ++ { 0x120878, 1, RI_ALL_ONLINE }, { 0x120880, 1, RI_ALL_ONLINE }, ++ { 0x120888, 1, RI_ALL_ONLINE }, { 0x120890, 1, RI_ALL_ONLINE }, ++ { 0x120898, 1, RI_ALL_ONLINE }, { 0x1208a0, 1, RI_ALL_ONLINE }, ++ { 0x1208a8, 1, RI_ALL_ONLINE }, { 0x1208b0, 1, RI_ALL_ONLINE }, ++ { 0x1208b8, 1, RI_ALL_ONLINE }, { 0x1208c0, 1, RI_ALL_ONLINE }, ++ { 0x1208c8, 1, RI_ALL_ONLINE }, { 0x1208d0, 1, RI_ALL_ONLINE }, ++ { 0x1208d8, 1, RI_ALL_ONLINE }, { 0x1208e0, 1, RI_ALL_ONLINE }, ++ { 0x1208e8, 1, RI_ALL_ONLINE }, { 0x1208f0, 1, RI_ALL_ONLINE }, ++ { 0x1208f8, 1, RI_ALL_ONLINE }, { 0x120900, 1, RI_ALL_ONLINE }, ++ { 0x120908, 1, RI_ALL_ONLINE }, { 0x14005c, 2, RI_ALL_ONLINE }, ++ { 0x1400d0, 2, RI_ALL_ONLINE }, { 0x1400e0, 1, RI_ALL_ONLINE }, ++ { 0x1401c8, 1, RI_ALL_ONLINE }, { 0x140200, 6, RI_ALL_ONLINE }, ++ { 0x16101c, 1, RI_ALL_ONLINE }, { 0x16102c, 1, RI_ALL_ONLINE }, ++ { 0x164014, 2, RI_ALL_ONLINE }, { 0x1640f0, 1, RI_ALL_ONLINE }, ++ { 0x166290, 1, RI_ALL_ONLINE }, { 0x1662a0, 1, RI_ALL_ONLINE }, ++ { 0x1662b0, 1, RI_ALL_ONLINE }, { 0x166548, 1, RI_ALL_ONLINE }, ++ { 0x166550, 1, RI_ALL_ONLINE }, { 0x166558, 1, RI_ALL_ONLINE }, ++ { 0x168000, 1, RI_ALL_ONLINE }, { 0x168008, 1, RI_ALL_ONLINE }, ++ { 0x168010, 1, RI_ALL_ONLINE }, { 0x168018, 1, RI_ALL_ONLINE }, ++ { 0x168028, 2, RI_ALL_ONLINE }, { 0x168058, 4, RI_ALL_ONLINE }, ++ { 0x168070, 1, RI_ALL_ONLINE }, { 0x168238, 1, RI_ALL_ONLINE }, ++ { 0x1682d0, 2, RI_ALL_ONLINE }, { 0x1682e0, 1, RI_ALL_ONLINE }, ++ { 0x168300, 67, RI_ALL_ONLINE }, { 0x168410, 2, RI_ALL_ONLINE }, ++ { 0x168438, 1, RI_ALL_ONLINE }, { 0x168448, 1, RI_ALL_ONLINE }, ++ { 0x168a00, 128, RI_ALL_ONLINE }, { 0x16e200, 128, RI_E1H_ONLINE }, ++ { 0x16e404, 2, RI_E1H_ONLINE }, { 0x16e584, 70, RI_E1H_ONLINE }, ++ { 0x1700a4, 1, RI_ALL_ONLINE }, { 0x1700ac, 2, RI_ALL_ONLINE }, ++ { 0x1700c0, 1, RI_ALL_ONLINE }, { 0x170174, 1, RI_ALL_ONLINE }, ++ { 0x170184, 1, RI_ALL_ONLINE }, { 0x1800f4, 1, RI_ALL_ONLINE }, ++ { 0x180104, 1, RI_ALL_ONLINE }, { 0x180114, 1, RI_ALL_ONLINE }, ++ { 0x180124, 1, RI_ALL_ONLINE }, { 0x18026c, 1, RI_ALL_ONLINE }, ++ { 0x1802a0, 1, RI_ALL_ONLINE }, { 0x1a1000, 1, RI_ALL_ONLINE }, ++ { 0x1aa000, 1, RI_E1H_ONLINE }, { 0x1b8000, 1, RI_ALL_ONLINE }, ++ { 0x1b8040, 1, RI_ALL_ONLINE }, { 0x1b8080, 1, RI_ALL_ONLINE }, ++ { 0x1b80c0, 1, RI_ALL_ONLINE }, { 0x200104, 1, RI_ALL_ONLINE }, ++ { 0x200114, 1, RI_ALL_ONLINE }, { 0x200124, 1, RI_ALL_ONLINE }, ++ { 0x200134, 1, RI_ALL_ONLINE }, { 0x20026c, 1, RI_ALL_ONLINE }, ++ { 0x2002a0, 1, RI_ALL_ONLINE }, { 0x221000, 1, RI_ALL_ONLINE }, ++ { 0x227000, 1, RI_E1H_ONLINE }, { 0x238000, 1, RI_ALL_ONLINE }, ++ { 0x238040, 1, RI_ALL_ONLINE }, { 0x238080, 1, RI_ALL_ONLINE }, ++ { 0x2380c0, 1, RI_ALL_ONLINE }, { 0x280104, 1, RI_ALL_ONLINE }, ++ { 0x280114, 1, RI_ALL_ONLINE }, { 0x280124, 1, RI_ALL_ONLINE }, ++ { 0x280134, 1, RI_ALL_ONLINE }, { 0x28026c, 1, RI_ALL_ONLINE }, ++ { 0x2802a0, 1, RI_ALL_ONLINE }, { 0x2a1000, 1, RI_ALL_ONLINE }, ++ { 0x2a9000, 1, RI_E1H_ONLINE }, { 0x2b8000, 1, RI_ALL_ONLINE }, ++ { 0x2b8040, 1, RI_ALL_ONLINE }, { 0x2b8080, 1, RI_ALL_ONLINE }, ++ { 0x2b80c0, 1, RI_ALL_ONLINE }, { 0x300104, 1, RI_ALL_ONLINE }, ++ { 0x300114, 1, RI_ALL_ONLINE }, { 0x300124, 1, RI_ALL_ONLINE }, ++ { 0x300134, 1, RI_ALL_ONLINE }, { 0x30026c, 1, RI_ALL_ONLINE }, ++ { 0x3002a0, 1, RI_ALL_ONLINE }, { 0x321000, 1, RI_ALL_ONLINE }, ++ { 0x328960, 1, RI_E1H_ONLINE }, { 0x338000, 1, RI_ALL_ONLINE }, ++ { 0x338040, 1, RI_ALL_ONLINE }, { 0x338080, 1, RI_ALL_ONLINE }, ++ { 0x3380c0, 1, RI_ALL_ONLINE } ++}; ++ ++#define WREGS_COUNT_E1 1 ++static const u32 read_reg_e1_0[] = { 0x1b1000 }; ++ ++static const struct wreg_addr wreg_addrs_e1[WREGS_COUNT_E1] = { ++ { 0x1b0c00, 192, 1, read_reg_e1_0, RI_E1_OFFLINE } ++}; ++ ++ ++#define WREGS_COUNT_E1H 1 ++static const u32 read_reg_e1h_0[] = { 0x1b1040, 0x1b1000 }; ++ ++static const struct wreg_addr wreg_addrs_e1h[WREGS_COUNT_E1H] = { ++ { 0x1b0c00, 256, 2, read_reg_e1h_0, RI_E1H_OFFLINE } ++}; ++ ++ ++static const struct dump_sign dump_sign_all = { 0x49aa93ee, 0x40835, 0x22 }; ++ ++ ++#define TIMER_REGS_COUNT_E1 2 ++static const u32 timer_status_regs_e1[TIMER_REGS_COUNT_E1] = ++ { 0x164014, 0x164018 }; ++static const u32 timer_scan_regs_e1[TIMER_REGS_COUNT_E1] = ++ { 0x1640d0, 0x1640d4 }; ++ ++ ++#define TIMER_REGS_COUNT_E1H 2 ++static const u32 timer_status_regs_e1h[TIMER_REGS_COUNT_E1H] = ++ { 0x164014, 0x164018 }; ++static const u32 timer_scan_regs_e1h[TIMER_REGS_COUNT_E1H] = ++ { 0x1640d0, 0x1640d4 }; ++ ++ ++#endif /* BNX2X_DUMP_H */ +diff -r ddb96c0bbe13 drivers/net/bnx2x_fw_defs.h +--- a/drivers/net/bnx2x_fw_defs.h Tue Jun 16 11:03:28 2009 +0100 ++++ b/drivers/net/bnx2x_fw_defs.h Tue Jun 16 13:15:30 2009 +0100 +@@ -1,6 +1,6 @@ + /* bnx2x_fw_defs.h: Broadcom Everest network driver. + * +- * Copyright (c) 2007-2008 Broadcom Corporation ++ * Copyright (c) 2007-2009 Broadcom Corporation + * + * 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 +@@ -12,46 +12,117 @@ + (IS_E1H_OFFSET ? 0x7000 : 0x1000) + #define CSTORM_ASSERT_LIST_OFFSET(idx) \ + (IS_E1H_OFFSET ? (0x7020 + (idx * 0x10)) : (0x1020 + (idx * 0x10))) +-#define CSTORM_DEF_SB_HC_DISABLE_OFFSET(function, index) \ +- (IS_E1H_OFFSET ? (0x8522 + ((function>>1) * 0x40) + \ +- ((function&1) * 0x100) + (index * 0x4)) : (0x1922 + (function * \ ++#define CSTORM_DEF_SB_HC_DISABLE_C_OFFSET(function, index) \ ++ (IS_E1H_OFFSET ? (0x8622 + ((function>>1) * 0x40) + \ ++ ((function&1) * 0x100) + (index * 0x4)) : (0x3562 + (function * \ + 0x40) + (index * 0x4))) +-#define CSTORM_DEF_SB_HOST_SB_ADDR_OFFSET(function) \ +- (IS_E1H_OFFSET ? (0x8500 + ((function>>1) * 0x40) + \ +- ((function&1) * 0x100)) : (0x1900 + (function * 0x40))) +-#define CSTORM_DEF_SB_HOST_STATUS_BLOCK_OFFSET(function) \ +- (IS_E1H_OFFSET ? (0x8508 + ((function>>1) * 0x40) + \ +- ((function&1) * 0x100)) : (0x1908 + (function * 0x40))) ++#define CSTORM_DEF_SB_HC_DISABLE_U_OFFSET(function, index) \ ++ (IS_E1H_OFFSET ? (0x8822 + ((function>>1) * 0x80) + \ ++ ((function&1) * 0x200) + (index * 0x4)) : (0x35e2 + (function * \ ++ 0x80) + (index * 0x4))) ++#define CSTORM_DEF_SB_HOST_SB_ADDR_C_OFFSET(function) \ ++ (IS_E1H_OFFSET ? (0x8600 + ((function>>1) * 0x40) + \ ++ ((function&1) * 0x100)) : (0x3540 + (function * 0x40))) ++#define CSTORM_DEF_SB_HOST_SB_ADDR_U_OFFSET(function) \ ++ (IS_E1H_OFFSET ? (0x8800 + ((function>>1) * 0x80) + \ ++ ((function&1) * 0x200)) : (0x35c0 + (function * 0x80))) ++#define CSTORM_DEF_SB_HOST_STATUS_BLOCK_C_OFFSET(function) \ ++ (IS_E1H_OFFSET ? (0x8608 + ((function>>1) * 0x40) + \ ++ ((function&1) * 0x100)) : (0x3548 + (function * 0x40))) ++#define CSTORM_DEF_SB_HOST_STATUS_BLOCK_U_OFFSET(function) \ ++ (IS_E1H_OFFSET ? (0x8808 + ((function>>1) * 0x80) + \ ++ ((function&1) * 0x200)) : (0x35c8 + (function * 0x80))) + #define CSTORM_FUNCTION_MODE_OFFSET \ + (IS_E1H_OFFSET ? 0x11e8 : 0xffffffff) +-#define CSTORM_HC_BTR_OFFSET(port) \ +- (IS_E1H_OFFSET ? (0x8704 + (port * 0xf0)) : (0x1984 + (port * 0xc0))) +-#define CSTORM_SB_HC_DISABLE_OFFSET(port, cpu_id, index) \ +- (IS_E1H_OFFSET ? (0x801a + (port * 0x280) + (cpu_id * 0x28) + \ +- (index * 0x4)) : (0x141a + (port * 0x280) + (cpu_id * 0x28) + \ ++#define CSTORM_HC_BTR_C_OFFSET(port) \ ++ (IS_E1H_OFFSET ? (0x8c04 + (port * 0xf0)) : (0x36c4 + (port * 0xc0))) ++#define CSTORM_HC_BTR_U_OFFSET(port) \ ++ (IS_E1H_OFFSET ? (0x8de4 + (port * 0xf0)) : (0x3844 + (port * 0xc0))) ++#define CSTORM_ISCSI_CQ_SIZE_OFFSET(function) \ ++ (IS_E1H_OFFSET ? (0x6680 + (function * 0x8)) : (0x25a0 + \ ++ (function * 0x8))) ++#define CSTORM_ISCSI_CQ_SQN_SIZE_OFFSET(function) \ ++ (IS_E1H_OFFSET ? (0x66c0 + (function * 0x8)) : (0x25b0 + \ ++ (function * 0x8))) ++#define CSTORM_ISCSI_EQ_CONS_OFFSET(function, eqIdx) \ ++ (IS_E1H_OFFSET ? (0x6040 + (function * 0xc0) + (eqIdx * 0x18)) : \ ++ (0x2410 + (function * 0xc0) + (eqIdx * 0x18))) ++#define CSTORM_ISCSI_EQ_NEXT_EQE_ADDR_OFFSET(function, eqIdx) \ ++ (IS_E1H_OFFSET ? (0x6044 + (function * 0xc0) + (eqIdx * 0x18)) : \ ++ (0x2414 + (function * 0xc0) + (eqIdx * 0x18))) ++#define CSTORM_ISCSI_EQ_NEXT_PAGE_ADDR_OFFSET(function, eqIdx) \ ++ (IS_E1H_OFFSET ? (0x604c + (function * 0xc0) + (eqIdx * 0x18)) : \ ++ (0x241c + (function * 0xc0) + (eqIdx * 0x18))) ++#define CSTORM_ISCSI_EQ_NEXT_PAGE_ADDR_VALID_OFFSET(function, eqIdx) \ ++ (IS_E1H_OFFSET ? (0x6057 + (function * 0xc0) + (eqIdx * 0x18)) : \ ++ (0x2427 + (function * 0xc0) + (eqIdx * 0x18))) ++#define CSTORM_ISCSI_EQ_PROD_OFFSET(function, eqIdx) \ ++ (IS_E1H_OFFSET ? (0x6042 + (function * 0xc0) + (eqIdx * 0x18)) : \ ++ (0x2412 + (function * 0xc0) + (eqIdx * 0x18))) ++#define CSTORM_ISCSI_EQ_SB_INDEX_OFFSET(function, eqIdx) \ ++ (IS_E1H_OFFSET ? (0x6056 + (function * 0xc0) + (eqIdx * 0x18)) : \ ++ (0x2426 + (function * 0xc0) + (eqIdx * 0x18))) ++#define CSTORM_ISCSI_EQ_SB_NUM_OFFSET(function, eqIdx) \ ++ (IS_E1H_OFFSET ? (0x6054 + (function * 0xc0) + (eqIdx * 0x18)) : \ ++ (0x2424 + (function * 0xc0) + (eqIdx * 0x18))) ++#define CSTORM_ISCSI_HQ_SIZE_OFFSET(function) \ ++ (IS_E1H_OFFSET ? (0x6640 + (function * 0x8)) : (0x2590 + \ ++ (function * 0x8))) ++#define CSTORM_ISCSI_NUM_OF_TASKS_OFFSET(function) \ ++ (IS_E1H_OFFSET ? (0x6004 + (function * 0x8)) : (0x2404 + \ ++ (function * 0x8))) ++#define CSTORM_ISCSI_PAGE_SIZE_LOG_OFFSET(function) \ ++ (IS_E1H_OFFSET ? (0x6002 + (function * 0x8)) : (0x2402 + \ ++ (function * 0x8))) ++#define CSTORM_ISCSI_PAGE_SIZE_OFFSET(function) \ ++ (IS_E1H_OFFSET ? (0x6000 + (function * 0x8)) : (0x2400 + \ ++ (function * 0x8))) ++#define CSTORM_SB_HC_DISABLE_C_OFFSET(port, cpu_id, index) \ ++ (IS_E1H_OFFSET ? (0x811a + (port * 0x280) + (cpu_id * 0x28) + \ ++ (index * 0x4)) : (0x305a + (port * 0x280) + (cpu_id * 0x28) + \ + (index * 0x4))) +-#define CSTORM_SB_HC_TIMEOUT_OFFSET(port, cpu_id, index) \ +- (IS_E1H_OFFSET ? (0x8018 + (port * 0x280) + (cpu_id * 0x28) + \ +- (index * 0x4)) : (0x1418 + (port * 0x280) + (cpu_id * 0x28) + \ ++#define CSTORM_SB_HC_DISABLE_U_OFFSET(port, cpu_id, index) \ ++ (IS_E1H_OFFSET ? (0xb01a + (port * 0x800) + (cpu_id * 0x80) + \ ++ (index * 0x4)) : (0x401a + (port * 0x800) + (cpu_id * 0x80) + \ + (index * 0x4))) +-#define CSTORM_SB_HOST_SB_ADDR_OFFSET(port, cpu_id) \ +- (IS_E1H_OFFSET ? (0x8000 + (port * 0x280) + (cpu_id * 0x28)) : \ +- (0x1400 + (port * 0x280) + (cpu_id * 0x28))) +-#define CSTORM_SB_HOST_STATUS_BLOCK_OFFSET(port, cpu_id) \ +- (IS_E1H_OFFSET ? (0x8008 + (port * 0x280) + (cpu_id * 0x28)) : \ +- (0x1408 + (port * 0x280) + (cpu_id * 0x28))) ++#define CSTORM_SB_HC_TIMEOUT_C_OFFSET(port, cpu_id, index) \ ++ (IS_E1H_OFFSET ? (0x8118 + (port * 0x280) + (cpu_id * 0x28) + \ ++ (index * 0x4)) : (0x3058 + (port * 0x280) + (cpu_id * 0x28) + \ ++ (index * 0x4))) ++#define CSTORM_SB_HC_TIMEOUT_U_OFFSET(port, cpu_id, index) \ ++ (IS_E1H_OFFSET ? (0xb018 + (port * 0x800) + (cpu_id * 0x80) + \ ++ (index * 0x4)) : (0x4018 + (port * 0x800) + (cpu_id * 0x80) + \ ++ (index * 0x4))) ++#define CSTORM_SB_HOST_SB_ADDR_C_OFFSET(port, cpu_id) \ ++ (IS_E1H_OFFSET ? (0x8100 + (port * 0x280) + (cpu_id * 0x28)) : \ ++ (0x3040 + (port * 0x280) + (cpu_id * 0x28))) ++#define CSTORM_SB_HOST_SB_ADDR_U_OFFSET(port, cpu_id) \ ++ (IS_E1H_OFFSET ? (0xb000 + (port * 0x800) + (cpu_id * 0x80)) : \ ++ (0x4000 + (port * 0x800) + (cpu_id * 0x80))) ++#define CSTORM_SB_HOST_STATUS_BLOCK_C_OFFSET(port, cpu_id) \ ++ (IS_E1H_OFFSET ? (0x8108 + (port * 0x280) + (cpu_id * 0x28)) : \ ++ (0x3048 + (port * 0x280) + (cpu_id * 0x28))) ++#define CSTORM_SB_HOST_STATUS_BLOCK_U_OFFSET(port, cpu_id) \ ++ (IS_E1H_OFFSET ? (0xb008 + (port * 0x800) + (cpu_id * 0x80)) : \ ++ (0x4008 + (port * 0x800) + (cpu_id * 0x80))) ++#define CSTORM_SB_STATUS_BLOCK_C_SIZE 0x10 ++#define CSTORM_SB_STATUS_BLOCK_U_SIZE 0x60 + #define CSTORM_STATS_FLAGS_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x1108 + (function * 0x8)) : (0x5108 + \ + (function * 0x8))) + #define TSTORM_APPROXIMATE_MATCH_MULTICAST_FILTERING_OFFSET(function) \ +- (IS_E1H_OFFSET ? (0x31c0 + (function * 0x20)) : 0xffffffff) ++ (IS_E1H_OFFSET ? (0x3200 + (function * 0x20)) : 0xffffffff) + #define TSTORM_ASSERT_LIST_INDEX_OFFSET \ + (IS_E1H_OFFSET ? 0xa000 : 0x1000) + #define TSTORM_ASSERT_LIST_OFFSET(idx) \ + (IS_E1H_OFFSET ? (0xa020 + (idx * 0x10)) : (0x1020 + (idx * 0x10))) + #define TSTORM_CLIENT_CONFIG_OFFSET(port, client_id) \ +- (IS_E1H_OFFSET ? (0x3358 + (port * 0x3e8) + (client_id * 0x28)) \ +- : (0x9c8 + (port * 0x2f8) + (client_id * 0x28))) ++ (IS_E1H_OFFSET ? (0x33a0 + (port * 0x1a0) + (client_id * 0x10)) \ ++ : (0x9c0 + (port * 0x120) + (client_id * 0x10))) ++#define TSTORM_COMMON_SAFC_WORKAROUND_ENABLE_OFFSET \ ++ (IS_E1H_OFFSET ? 0x1ed8 : 0xffffffff) ++#define TSTORM_COMMON_SAFC_WORKAROUND_TIMEOUT_10USEC_OFFSET \ ++ (IS_E1H_OFFSET ? 0x1eda : 0xffffffff) + #define TSTORM_DEF_SB_HC_DISABLE_OFFSET(function, index) \ + (IS_E1H_OFFSET ? (0xb01a + ((function>>1) * 0x28) + \ + ((function&1) * 0xa0) + (index * 0x4)) : (0x141a + (function * \ +@@ -63,81 +134,133 @@ + (IS_E1H_OFFSET ? (0xb008 + ((function>>1) * 0x28) + \ + ((function&1) * 0xa0)) : (0x1408 + (function * 0x28))) + #define TSTORM_ETH_STATS_QUERY_ADDR_OFFSET(function) \ +- (IS_E1H_OFFSET ? (0x2b80 + (function * 0x8)) : (0x4b68 + \ ++ (IS_E1H_OFFSET ? (0x2940 + (function * 0x8)) : (0x4928 + \ + (function * 0x8))) + #define TSTORM_FUNCTION_COMMON_CONFIG_OFFSET(function) \ +- (IS_E1H_OFFSET ? (0x3000 + (function * 0x38)) : (0x1500 + \ +- (function * 0x38))) ++ (IS_E1H_OFFSET ? (0x3000 + (function * 0x40)) : (0x1500 + \ ++ (function * 0x40))) + #define TSTORM_FUNCTION_MODE_OFFSET \ +- (IS_E1H_OFFSET ? 0x1ad0 : 0xffffffff) ++ (IS_E1H_OFFSET ? 0x1ed0 : 0xffffffff) + #define TSTORM_HC_BTR_OFFSET(port) \ + (IS_E1H_OFFSET ? (0xb144 + (port * 0x30)) : (0x1454 + (port * 0x18))) + #define TSTORM_INDIRECTION_TABLE_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x12c8 + (function * 0x80)) : (0x22c8 + \ + (function * 0x80))) + #define TSTORM_INDIRECTION_TABLE_SIZE 0x80 ++#define TSTORM_ISCSI_CONN_BUF_PBL_OFFSET(function, pblEntry) \ ++ (IS_E1H_OFFSET ? (0x60c0 + (function * 0x40) + (pblEntry * 0x8)) \ ++ : (0x4c30 + (function * 0x40) + (pblEntry * 0x8))) ++#define TSTORM_ISCSI_ERROR_BITMAP_OFFSET(function) \ ++ (IS_E1H_OFFSET ? (0x6340 + (function * 0x8)) : (0x4cd0 + \ ++ (function * 0x8))) ++#define TSTORM_ISCSI_NUM_OF_TASKS_OFFSET(function) \ ++ (IS_E1H_OFFSET ? (0x6004 + (function * 0x8)) : (0x4c04 + \ ++ (function * 0x8))) ++#define TSTORM_ISCSI_PAGE_SIZE_LOG_OFFSET(function) \ ++ (IS_E1H_OFFSET ? (0x6002 + (function * 0x8)) : (0x4c02 + \ ++ (function * 0x8))) ++#define TSTORM_ISCSI_PAGE_SIZE_OFFSET(function) \ ++ (IS_E1H_OFFSET ? (0x6000 + (function * 0x8)) : (0x4c00 + \ ++ (function * 0x8))) ++#define TSTORM_ISCSI_RQ_SIZE_OFFSET(function) \ ++ (IS_E1H_OFFSET ? (0x6080 + (function * 0x8)) : (0x4c20 + \ ++ (function * 0x8))) ++#define TSTORM_ISCSI_TCP_VARS_FLAGS_OFFSET(function) \ ++ (IS_E1H_OFFSET ? (0x6040 + (function * 0x8)) : (0x4c10 + \ ++ (function * 0x8))) ++#define TSTORM_ISCSI_TCP_VARS_LSB_LOCAL_MAC_ADDR_OFFSET(function) \ ++ (IS_E1H_OFFSET ? (0x6042 + (function * 0x8)) : (0x4c12 + \ ++ (function * 0x8))) ++#define TSTORM_ISCSI_TCP_VARS_MSB_LOCAL_MAC_ADDR_OFFSET(function) \ ++ (IS_E1H_OFFSET ? (0x6044 + (function * 0x8)) : (0x4c14 + \ ++ (function * 0x8))) + #define TSTORM_MAC_FILTER_CONFIG_OFFSET(function) \ +- (IS_E1H_OFFSET ? (0x3008 + (function * 0x38)) : (0x1508 + \ +- (function * 0x38))) ++ (IS_E1H_OFFSET ? (0x3008 + (function * 0x40)) : (0x1508 + \ ++ (function * 0x40))) + #define TSTORM_PER_COUNTER_ID_STATS_OFFSET(port, stats_counter_id) \ +- (IS_E1H_OFFSET ? (0x2010 + (port * 0x5b0) + (stats_counter_id * \ +- 0x50)) : (0x4000 + (port * 0x3f0) + (stats_counter_id * 0x38))) +-#define TSTORM_RX_PRODS_OFFSET(port, client_id) \ +- (IS_E1H_OFFSET ? (0x3350 + (port * 0x3e8) + (client_id * 0x28)) \ +- : (0x9c0 + (port * 0x2f8) + (client_id * 0x28))) ++ (IS_E1H_OFFSET ? (0x2010 + (port * 0x490) + (stats_counter_id * \ ++ 0x40)) : (0x4010 + (port * 0x490) + (stats_counter_id * 0x40))) + #define TSTORM_STATS_FLAGS_OFFSET(function) \ +- (IS_E1H_OFFSET ? (0x2c00 + (function * 0x8)) : (0x4b88 + \ ++ (IS_E1H_OFFSET ? (0x29c0 + (function * 0x8)) : (0x4948 + \ + (function * 0x8))) +-#define TSTORM_TPA_EXIST_OFFSET (IS_E1H_OFFSET ? 0x3b30 : 0x1c20) +-#define USTORM_AGG_DATA_OFFSET (IS_E1H_OFFSET ? 0xa040 : 0x2c10) +-#define USTORM_AGG_DATA_SIZE (IS_E1H_OFFSET ? 0x2440 : 0x1200) ++#define TSTORM_TCP_MAX_CWND_OFFSET(function) \ ++ (IS_E1H_OFFSET ? (0x4004 + (function * 0x8)) : (0x1fb4 + \ ++ (function * 0x8))) ++#define USTORM_AGG_DATA_OFFSET (IS_E1H_OFFSET ? 0xa000 : 0x3000) ++#define USTORM_AGG_DATA_SIZE (IS_E1H_OFFSET ? 0x2000 : 0x1000) + #define USTORM_ASSERT_LIST_INDEX_OFFSET \ + (IS_E1H_OFFSET ? 0x8000 : 0x1000) + #define USTORM_ASSERT_LIST_OFFSET(idx) \ + (IS_E1H_OFFSET ? (0x8020 + (idx * 0x10)) : (0x1020 + (idx * 0x10))) + #define USTORM_CQE_PAGE_BASE_OFFSET(port, clientId) \ +- (IS_E1H_OFFSET ? (0x3298 + (port * 0x258) + (clientId * 0x18)) : \ +- (0x5450 + (port * 0x1c8) + (clientId * 0x18))) +-#define USTORM_DEF_SB_HC_DISABLE_OFFSET(function, index) \ +- (IS_E1H_OFFSET ? (0x951a + ((function>>1) * 0x28) + \ +- ((function&1) * 0xa0) + (index * 0x4)) : (0x191a + (function * \ +- 0x28) + (index * 0x4))) +-#define USTORM_DEF_SB_HOST_SB_ADDR_OFFSET(function) \ +- (IS_E1H_OFFSET ? (0x9500 + ((function>>1) * 0x28) + \ +- ((function&1) * 0xa0)) : (0x1900 + (function * 0x28))) +-#define USTORM_DEF_SB_HOST_STATUS_BLOCK_OFFSET(function) \ +- (IS_E1H_OFFSET ? (0x9508 + ((function>>1) * 0x28) + \ +- ((function&1) * 0xa0)) : (0x1908 + (function * 0x28))) ++ (IS_E1H_OFFSET ? (0x1010 + (port * 0x680) + (clientId * 0x40)) : \ ++ (0x4010 + (port * 0x360) + (clientId * 0x30))) ++#define USTORM_CQE_PAGE_NEXT_OFFSET(port, clientId) \ ++ (IS_E1H_OFFSET ? (0x1028 + (port * 0x680) + (clientId * 0x40)) : \ ++ (0x4028 + (port * 0x360) + (clientId * 0x30))) ++#define USTORM_ETH_PAUSE_ENABLED_OFFSET(port) \ ++ (IS_E1H_OFFSET ? (0x2ad4 + (port * 0x8)) : 0xffffffff) ++#define USTORM_ETH_RING_PAUSE_DATA_OFFSET(port, clientId) \ ++ (IS_E1H_OFFSET ? (0x1030 + (port * 0x680) + (clientId * 0x40)) : \ ++ 0xffffffff) ++#define USTORM_ETH_STATS_QUERY_ADDR_OFFSET(function) \ ++ (IS_E1H_OFFSET ? (0x2a50 + (function * 0x8)) : (0x1dd0 + \ ++ (function * 0x8))) + #define USTORM_FUNCTION_MODE_OFFSET \ + (IS_E1H_OFFSET ? 0x2448 : 0xffffffff) +-#define USTORM_HC_BTR_OFFSET(port) \ +- (IS_E1H_OFFSET ? (0x9644 + (port * 0xd0)) : (0x1954 + (port * 0xb8))) ++#define USTORM_ISCSI_CQ_SIZE_OFFSET(function) \ ++ (IS_E1H_OFFSET ? (0x7044 + (function * 0x8)) : (0x2414 + \ ++ (function * 0x8))) ++#define USTORM_ISCSI_CQ_SQN_SIZE_OFFSET(function) \ ++ (IS_E1H_OFFSET ? (0x7046 + (function * 0x8)) : (0x2416 + \ ++ (function * 0x8))) ++#define USTORM_ISCSI_ERROR_BITMAP_OFFSET(function) \ ++ (IS_E1H_OFFSET ? (0x7688 + (function * 0x8)) : (0x29c8 + \ ++ (function * 0x8))) ++#define USTORM_ISCSI_GLOBAL_BUF_PHYS_ADDR_OFFSET(function) \ ++ (IS_E1H_OFFSET ? (0x7648 + (function * 0x8)) : (0x29b8 + \ ++ (function * 0x8))) ++#define USTORM_ISCSI_NUM_OF_TASKS_OFFSET(function) \ ++ (IS_E1H_OFFSET ? (0x7004 + (function * 0x8)) : (0x2404 + \ ++ (function * 0x8))) ++#define USTORM_ISCSI_PAGE_SIZE_LOG_OFFSET(function) \ ++ (IS_E1H_OFFSET ? (0x7002 + (function * 0x8)) : (0x2402 + \ ++ (function * 0x8))) ++#define USTORM_ISCSI_PAGE_SIZE_OFFSET(function) \ ++ (IS_E1H_OFFSET ? (0x7000 + (function * 0x8)) : (0x2400 + \ ++ (function * 0x8))) ++#define USTORM_ISCSI_R2TQ_SIZE_OFFSET(function) \ ++ (IS_E1H_OFFSET ? (0x7040 + (function * 0x8)) : (0x2410 + \ ++ (function * 0x8))) ++#define USTORM_ISCSI_RQ_BUFFER_SIZE_OFFSET(function) \ ++ (IS_E1H_OFFSET ? (0x7080 + (function * 0x8)) : (0x2420 + \ ++ (function * 0x8))) ++#define USTORM_ISCSI_RQ_SIZE_OFFSET(function) \ ++ (IS_E1H_OFFSET ? (0x7084 + (function * 0x8)) : (0x2424 + \ ++ (function * 0x8))) + #define USTORM_MAX_AGG_SIZE_OFFSET(port, clientId) \ +- (IS_E1H_OFFSET ? (0x3290 + (port * 0x258) + (clientId * 0x18)) : \ +- (0x5448 + (port * 0x1c8) + (clientId * 0x18))) ++ (IS_E1H_OFFSET ? (0x1018 + (port * 0x680) + (clientId * 0x40)) : \ ++ (0x4018 + (port * 0x360) + (clientId * 0x30))) + #define USTORM_MEM_WORKAROUND_ADDRESS_OFFSET(function) \ +- (IS_E1H_OFFSET ? (0x2408 + (function * 0x8)) : (0x5408 + \ ++ (IS_E1H_OFFSET ? (0x2408 + (function * 0x8)) : (0x1da8 + \ + (function * 0x8))) +-#define USTORM_SB_HC_DISABLE_OFFSET(port, cpu_id, index) \ +- (IS_E1H_OFFSET ? (0x901a + (port * 0x280) + (cpu_id * 0x28) + \ +- (index * 0x4)) : (0x141a + (port * 0x280) + (cpu_id * 0x28) + \ +- (index * 0x4))) +-#define USTORM_SB_HC_TIMEOUT_OFFSET(port, cpu_id, index) \ +- (IS_E1H_OFFSET ? (0x9018 + (port * 0x280) + (cpu_id * 0x28) + \ +- (index * 0x4)) : (0x1418 + (port * 0x280) + (cpu_id * 0x28) + \ +- (index * 0x4))) +-#define USTORM_SB_HOST_SB_ADDR_OFFSET(port, cpu_id) \ +- (IS_E1H_OFFSET ? (0x9000 + (port * 0x280) + (cpu_id * 0x28)) : \ +- (0x1400 + (port * 0x280) + (cpu_id * 0x28))) +-#define USTORM_SB_HOST_STATUS_BLOCK_OFFSET(port, cpu_id) \ +- (IS_E1H_OFFSET ? (0x9008 + (port * 0x280) + (cpu_id * 0x28)) : \ +- (0x1408 + (port * 0x280) + (cpu_id * 0x28))) ++#define USTORM_PER_COUNTER_ID_STATS_OFFSET(port, stats_counter_id) \ ++ (IS_E1H_OFFSET ? (0x2450 + (port * 0x2d0) + (stats_counter_id * \ ++ 0x28)) : (0x1500 + (port * 0x2d0) + (stats_counter_id * 0x28))) ++#define USTORM_RX_PRODS_OFFSET(port, client_id) \ ++ (IS_E1H_OFFSET ? (0x1000 + (port * 0x680) + (client_id * 0x40)) \ ++ : (0x4000 + (port * 0x360) + (client_id * 0x30))) ++#define USTORM_STATS_FLAGS_OFFSET(function) \ ++ (IS_E1H_OFFSET ? (0x29f0 + (function * 0x8)) : (0x1db8 + \ ++ (function * 0x8))) ++#define USTORM_TPA_BTR_OFFSET (IS_E1H_OFFSET ? 0x3da5 : 0x5095) ++#define USTORM_TPA_BTR_SIZE 0x1 + #define XSTORM_ASSERT_LIST_INDEX_OFFSET \ + (IS_E1H_OFFSET ? 0x9000 : 0x1000) + #define XSTORM_ASSERT_LIST_OFFSET(idx) \ + (IS_E1H_OFFSET ? (0x9020 + (idx * 0x10)) : (0x1020 + (idx * 0x10))) + #define XSTORM_CMNG_PER_PORT_VARS_OFFSET(port) \ +- (IS_E1H_OFFSET ? (0x24a8 + (port * 0x40)) : (0x3ba0 + (port * 0x40))) ++ (IS_E1H_OFFSET ? (0x24a8 + (port * 0x50)) : (0x3a80 + (port * 0x50))) + #define XSTORM_DEF_SB_HC_DISABLE_OFFSET(function, index) \ + (IS_E1H_OFFSET ? (0xa01a + ((function>>1) * 0x28) + \ + ((function&1) * 0xa0) + (index * 0x4)) : (0x141a + (function * \ +@@ -149,23 +272,74 @@ + (IS_E1H_OFFSET ? (0xa008 + ((function>>1) * 0x28) + \ + ((function&1) * 0xa0)) : (0x1408 + (function * 0x28))) + #define XSTORM_E1HOV_OFFSET(function) \ +- (IS_E1H_OFFSET ? (0x2ab8 + (function * 0x2)) : 0xffffffff) ++ (IS_E1H_OFFSET ? (0x2c10 + (function * 0x8)) : 0xffffffff) + #define XSTORM_ETH_STATS_QUERY_ADDR_OFFSET(function) \ +- (IS_E1H_OFFSET ? (0x2418 + (function * 0x8)) : (0x3b70 + \ ++ (IS_E1H_OFFSET ? (0x2418 + (function * 0x8)) : (0x3a50 + \ + (function * 0x8))) + #define XSTORM_FAIRNESS_PER_VN_VARS_OFFSET(function) \ +- (IS_E1H_OFFSET ? (0x2568 + (function * 0x70)) : (0x3c60 + \ +- (function * 0x70))) ++ (IS_E1H_OFFSET ? (0x2588 + (function * 0x90)) : (0x3b60 + \ ++ (function * 0x90))) + #define XSTORM_FUNCTION_MODE_OFFSET \ +- (IS_E1H_OFFSET ? 0x2ac8 : 0xffffffff) ++ (IS_E1H_OFFSET ? 0x2c50 : 0xffffffff) + #define XSTORM_HC_BTR_OFFSET(port) \ + (IS_E1H_OFFSET ? (0xa144 + (port * 0x30)) : (0x1454 + (port * 0x18))) ++#define XSTORM_ISCSI_HQ_SIZE_OFFSET(function) \ ++ (IS_E1H_OFFSET ? (0x80c0 + (function * 0x8)) : (0x1c30 + \ ++ (function * 0x8))) ++#define XSTORM_ISCSI_LOCAL_MAC_ADDR0_OFFSET(function) \ ++ (IS_E1H_OFFSET ? (0x8080 + (function * 0x8)) : (0x1c20 + \ ++ (function * 0x8))) ++#define XSTORM_ISCSI_LOCAL_MAC_ADDR1_OFFSET(function) \ ++ (IS_E1H_OFFSET ? (0x8081 + (function * 0x8)) : (0x1c21 + \ ++ (function * 0x8))) ++#define XSTORM_ISCSI_LOCAL_MAC_ADDR2_OFFSET(function) \ ++ (IS_E1H_OFFSET ? (0x8082 + (function * 0x8)) : (0x1c22 + \ ++ (function * 0x8))) ++#define XSTORM_ISCSI_LOCAL_MAC_ADDR3_OFFSET(function) \ ++ (IS_E1H_OFFSET ? (0x8083 + (function * 0x8)) : (0x1c23 + \ ++ (function * 0x8))) ++#define XSTORM_ISCSI_LOCAL_MAC_ADDR4_OFFSET(function) \ ++ (IS_E1H_OFFSET ? (0x8084 + (function * 0x8)) : (0x1c24 + \ ++ (function * 0x8))) ++#define XSTORM_ISCSI_LOCAL_MAC_ADDR5_OFFSET(function) \ ++ (IS_E1H_OFFSET ? (0x8085 + (function * 0x8)) : (0x1c25 + \ ++ (function * 0x8))) ++#define XSTORM_ISCSI_LOCAL_VLAN_OFFSET(function) \ ++ (IS_E1H_OFFSET ? (0x8086 + (function * 0x8)) : (0x1c26 + \ ++ (function * 0x8))) ++#define XSTORM_ISCSI_NUM_OF_TASKS_OFFSET(function) \ ++ (IS_E1H_OFFSET ? (0x8004 + (function * 0x8)) : (0x1c04 + \ ++ (function * 0x8))) ++#define XSTORM_ISCSI_PAGE_SIZE_LOG_OFFSET(function) \ ++ (IS_E1H_OFFSET ? (0x8002 + (function * 0x8)) : (0x1c02 + \ ++ (function * 0x8))) ++#define XSTORM_ISCSI_PAGE_SIZE_OFFSET(function) \ ++ (IS_E1H_OFFSET ? (0x8000 + (function * 0x8)) : (0x1c00 + \ ++ (function * 0x8))) ++#define XSTORM_ISCSI_R2TQ_SIZE_OFFSET(function) \ ++ (IS_E1H_OFFSET ? (0x80c4 + (function * 0x8)) : (0x1c34 + \ ++ (function * 0x8))) ++#define XSTORM_ISCSI_SQ_SIZE_OFFSET(function) \ ++ (IS_E1H_OFFSET ? (0x80c2 + (function * 0x8)) : (0x1c32 + \ ++ (function * 0x8))) ++#define XSTORM_ISCSI_TCP_VARS_ADV_WND_SCL_OFFSET(function) \ ++ (IS_E1H_OFFSET ? (0x8043 + (function * 0x8)) : (0x1c13 + \ ++ (function * 0x8))) ++#define XSTORM_ISCSI_TCP_VARS_FLAGS_OFFSET(function) \ ++ (IS_E1H_OFFSET ? (0x8042 + (function * 0x8)) : (0x1c12 + \ ++ (function * 0x8))) ++#define XSTORM_ISCSI_TCP_VARS_TOS_OFFSET(function) \ ++ (IS_E1H_OFFSET ? (0x8041 + (function * 0x8)) : (0x1c11 + \ ++ (function * 0x8))) ++#define XSTORM_ISCSI_TCP_VARS_TTL_OFFSET(function) \ ++ (IS_E1H_OFFSET ? (0x8040 + (function * 0x8)) : (0x1c10 + \ ++ (function * 0x8))) + #define XSTORM_PER_COUNTER_ID_STATS_OFFSET(port, stats_counter_id) \ +- (IS_E1H_OFFSET ? (0xc000 + (port * 0x3f0) + (stats_counter_id * \ +- 0x38)) : (0x3378 + (port * 0x3f0) + (stats_counter_id * 0x38))) ++ (IS_E1H_OFFSET ? (0xc000 + (port * 0x360) + (stats_counter_id * \ ++ 0x30)) : (0x3378 + (port * 0x360) + (stats_counter_id * 0x30))) + #define XSTORM_RATE_SHAPING_PER_VN_VARS_OFFSET(function) \ +- (IS_E1H_OFFSET ? (0x2528 + (function * 0x70)) : (0x3c20 + \ +- (function * 0x70))) ++ (IS_E1H_OFFSET ? (0x2548 + (function * 0x90)) : (0x3b20 + \ ++ (function * 0x90))) + #define XSTORM_SPQ_PAGE_BASE_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x2000 + (function * 0x10)) : (0x3328 + \ + (function * 0x10))) +@@ -173,12 +347,19 @@ + (IS_E1H_OFFSET ? (0x2008 + (function * 0x10)) : (0x3330 + \ + (function * 0x10))) + #define XSTORM_STATS_FLAGS_OFFSET(function) \ +- (IS_E1H_OFFSET ? (0x23d8 + (function * 0x8)) : (0x3b60 + \ ++ (IS_E1H_OFFSET ? (0x23d8 + (function * 0x8)) : (0x3a40 + \ + (function * 0x8))) ++#define XSTORM_TCP_GLOBAL_DEL_ACK_COUNTER_ENABLED_OFFSET(port) \ ++ (IS_E1H_OFFSET ? (0x4000 + (port * 0x8)) : (0x1960 + (port * 0x8))) ++#define XSTORM_TCP_GLOBAL_DEL_ACK_COUNTER_MAX_COUNT_OFFSET(port) \ ++ (IS_E1H_OFFSET ? (0x4001 + (port * 0x8)) : (0x1961 + (port * 0x8))) ++#define XSTORM_TCP_TX_SWS_TIMER_VAL_OFFSET(function) \ ++ (IS_E1H_OFFSET ? (0x4060 + ((function>>1) * 0x8) + ((function&1) \ ++ * 0x4)) : (0x1978 + (function * 0x4))) + #define COMMON_ASM_INVALID_ASSERT_OPCODE 0x0 + + /** +-* This file defines HSI constatnts for the ETH flow ++* This file defines HSI constants for the ETH flow + */ + #ifdef _EVEREST_MICROCODE + #include "microcode_constants.h" +@@ -195,49 +376,48 @@ + #define TCP_IPV4_HASH_TYPE 2 + #define IPV6_HASH_TYPE 3 + #define TCP_IPV6_HASH_TYPE 4 ++#define VLAN_PRI_HASH_TYPE 5 ++#define E1HOV_PRI_HASH_TYPE 6 ++#define DSCP_HASH_TYPE 7 + +-/* Ethernet Ring parmaters */ ++ ++/* Ethernet Ring parameters */ + #define X_ETH_LOCAL_RING_SIZE 13 + #define FIRST_BD_IN_PKT 0 + #define PARSE_BD_INDEX 1 +-#define NUM_OF_ETH_BDS_IN_PAGE \ +- ((PAGE_SIZE) / (STRUCT_SIZE(eth_tx_bd)/8)) +- ++#define NUM_OF_ETH_BDS_IN_PAGE ((PAGE_SIZE)/(STRUCT_SIZE(eth_tx_bd)/8)) ++#define U_ETH_NUM_OF_SGES_TO_FETCH 8 ++#define U_ETH_MAX_SGES_FOR_PACKET 3 + + /* Rx ring params */ +-#define U_ETH_LOCAL_BD_RING_SIZE (16) +-#define U_ETH_LOCAL_SGE_RING_SIZE (12) +-#define U_ETH_SGL_SIZE (8) ++#define U_ETH_LOCAL_BD_RING_SIZE 8 ++#define U_ETH_LOCAL_SGE_RING_SIZE 10 ++#define U_ETH_SGL_SIZE 8 + +- +-#define U_ETH_BDS_PER_PAGE_MASK \ +- ((PAGE_SIZE/(STRUCT_SIZE(eth_rx_bd)/8))-1) +-#define U_ETH_CQE_PER_PAGE_MASK \ +- ((PAGE_SIZE/(STRUCT_SIZE(eth_rx_cqe)/8))-1) +-#define U_ETH_SGES_PER_PAGE_MASK \ +- ((PAGE_SIZE/(STRUCT_SIZE(eth_rx_sge)/8))-1) + + #define U_ETH_SGES_PER_PAGE_INVERSE_MASK \ + (0xFFFF - ((PAGE_SIZE/((STRUCT_SIZE(eth_rx_sge))/8))-1)) + +- +-#define TU_ETH_CQES_PER_PAGE \ +- (PAGE_SIZE/(STRUCT_SIZE(eth_rx_cqe_next_page)/8)) ++#define TU_ETH_CQES_PER_PAGE (PAGE_SIZE/(STRUCT_SIZE(eth_rx_cqe)/8)) + #define U_ETH_BDS_PER_PAGE (PAGE_SIZE/(STRUCT_SIZE(eth_rx_bd)/8)) + #define U_ETH_SGES_PER_PAGE (PAGE_SIZE/(STRUCT_SIZE(eth_rx_sge)/8)) ++ ++#define U_ETH_BDS_PER_PAGE_MASK (U_ETH_BDS_PER_PAGE-1) ++#define U_ETH_CQE_PER_PAGE_MASK (TU_ETH_CQES_PER_PAGE-1) ++#define U_ETH_SGES_PER_PAGE_MASK (U_ETH_SGES_PER_PAGE-1) + + #define U_ETH_UNDEFINED_Q 0xFF + + /* values of command IDs in the ramrod message */ +-#define RAMROD_CMD_ID_ETH_PORT_SETUP (80) +-#define RAMROD_CMD_ID_ETH_CLIENT_SETUP (85) +-#define RAMROD_CMD_ID_ETH_STAT_QUERY (90) +-#define RAMROD_CMD_ID_ETH_UPDATE (100) +-#define RAMROD_CMD_ID_ETH_HALT (105) +-#define RAMROD_CMD_ID_ETH_SET_MAC (110) +-#define RAMROD_CMD_ID_ETH_CFC_DEL (115) +-#define RAMROD_CMD_ID_ETH_PORT_DEL (120) +-#define RAMROD_CMD_ID_ETH_FORWARD_SETUP (125) ++#define RAMROD_CMD_ID_ETH_PORT_SETUP 80 ++#define RAMROD_CMD_ID_ETH_CLIENT_SETUP 85 ++#define RAMROD_CMD_ID_ETH_STAT_QUERY 90 ++#define RAMROD_CMD_ID_ETH_UPDATE 100 ++#define RAMROD_CMD_ID_ETH_HALT 105 ++#define RAMROD_CMD_ID_ETH_SET_MAC 110 ++#define RAMROD_CMD_ID_ETH_CFC_DEL 115 ++#define RAMROD_CMD_ID_ETH_PORT_DEL 120 ++#define RAMROD_CMD_ID_ETH_FORWARD_SETUP 125 + + + /* command values for set mac command */ +@@ -250,16 +430,23 @@ + #define T_ETH_CRC32_HASH_SEED 0x00000000 + + /* Maximal L2 clients supported */ +-#define ETH_MAX_RX_CLIENTS_E1 19 +-#define ETH_MAX_RX_CLIENTS_E1H 25 ++#define ETH_MAX_RX_CLIENTS_E1 18 ++#define ETH_MAX_RX_CLIENTS_E1H 26 + + /* Maximal aggregation queues supported */ +-#define ETH_MAX_AGGREGATION_QUEUES_E1 (32) +-#define ETH_MAX_AGGREGATION_QUEUES_E1H (64) ++#define ETH_MAX_AGGREGATION_QUEUES_E1 32 ++#define ETH_MAX_AGGREGATION_QUEUES_E1H 64 ++ ++/* ETH RSS modes */ ++#define ETH_RSS_MODE_DISABLED 0 ++#define ETH_RSS_MODE_REGULAR 1 ++#define ETH_RSS_MODE_VLAN_PRI 2 ++#define ETH_RSS_MODE_E1HOV_PRI 3 ++#define ETH_RSS_MODE_IP_DSCP 4 + + + /** +-* This file defines HSI constatnts common to all microcode flows ++* This file defines HSI constants common to all microcode flows + */ + + /* Connection types */ +@@ -278,25 +465,27 @@ + #define ETH_STATE (ETH_CONNECTION_TYPE << PROTOCOL_STATE_BIT_OFFSET) + #define TOE_STATE (TOE_CONNECTION_TYPE << PROTOCOL_STATE_BIT_OFFSET) + #define RDMA_STATE (RDMA_CONNECTION_TYPE << PROTOCOL_STATE_BIT_OFFSET) +-#define ISCSI_STATE \ +- (ISCSI_CONNECTION_TYPE << PROTOCOL_STATE_BIT_OFFSET) +-#define FCOE_STATE (FCOE_CONNECTION_TYPE << PROTOCOL_STATE_BIT_OFFSET) + + /* microcode fixed page page size 4K (chains and ring segments) */ +-#define MC_PAGE_SIZE (4096) ++#define MC_PAGE_SIZE 4096 + + + /* Host coalescing constants */ ++#define HC_IGU_BC_MODE 0 ++#define HC_IGU_NBC_MODE 1 ++ ++#define HC_REGULAR_SEGMENT 0 ++#define HC_DEFAULT_SEGMENT 1 + + /* index numbers */ +-#define HC_USTORM_DEF_SB_NUM_INDICES 4 ++#define HC_USTORM_DEF_SB_NUM_INDICES 8 + #define HC_CSTORM_DEF_SB_NUM_INDICES 8 + #define HC_XSTORM_DEF_SB_NUM_INDICES 4 + #define HC_TSTORM_DEF_SB_NUM_INDICES 4 + #define HC_USTORM_SB_NUM_INDICES 4 + #define HC_CSTORM_SB_NUM_INDICES 4 + +-/* index values - which counterto update */ ++/* index values - which counter to update */ + + #define HC_INDEX_U_TOE_RX_CQ_CONS 0 + #define HC_INDEX_U_ETH_RX_CQ_CONS 1 +@@ -315,12 +504,14 @@ + #define HC_INDEX_DEF_C_ETH_SLOW_PATH 3 + #define HC_INDEX_DEF_C_ETH_RDMA_CQ_CONS 4 + #define HC_INDEX_DEF_C_ETH_ISCSI_CQ_CONS 5 ++#define HC_INDEX_DEF_C_ETH_FCOE_CQ_CONS 6 + + #define HC_INDEX_DEF_U_ETH_RDMA_RX_CQ_CONS 0 + #define HC_INDEX_DEF_U_ETH_ISCSI_RX_CQ_CONS 1 + #define HC_INDEX_DEF_U_ETH_RDMA_RX_BD_CONS 2 + #define HC_INDEX_DEF_U_ETH_ISCSI_RX_BD_CONS 3 +- ++#define HC_INDEX_DEF_U_ETH_FCOE_RX_CQ_CONS 4 ++#define HC_INDEX_DEF_U_ETH_FCOE_RX_BD_CONS 5 + + /* used by the driver to get the SB offset */ + #define USTORM_ID 0 +@@ -330,16 +521,16 @@ + #define ATTENTION_ID 4 + + /* max number of slow path commands per port */ +-#define MAX_RAMRODS_PER_PORT (8) ++#define MAX_RAMRODS_PER_PORT 8 + + /* values for RX ETH CQE type field */ +-#define RX_ETH_CQE_TYPE_ETH_FASTPATH (0) +-#define RX_ETH_CQE_TYPE_ETH_RAMROD (1) ++#define RX_ETH_CQE_TYPE_ETH_FASTPATH 0 ++#define RX_ETH_CQE_TYPE_ETH_RAMROD 1 + + + /**** DEFINES FOR TIMERS/CLOCKS RESOLUTIONS ****/ +-#define EMULATION_FREQUENCY_FACTOR (1600) +-#define FPGA_FREQUENCY_FACTOR (100) ++#define EMULATION_FREQUENCY_FACTOR 1600 ++#define FPGA_FREQUENCY_FACTOR 100 + + #define TIMERS_TICK_SIZE_CHIP (1e-3) + #define TIMERS_TICK_SIZE_EMUL \ +@@ -353,12 +544,9 @@ + #define TSEMI_CLK1_RESUL_FPGA \ + ((TSEMI_CLK1_RESUL_CHIP)/(FPGA_FREQUENCY_FACTOR)) + +-#define USEMI_CLK1_RESUL_CHIP \ +- (TIMERS_TICK_SIZE_CHIP) +-#define USEMI_CLK1_RESUL_EMUL \ +- (TIMERS_TICK_SIZE_EMUL) +-#define USEMI_CLK1_RESUL_FPGA \ +- (TIMERS_TICK_SIZE_FPGA) ++#define USEMI_CLK1_RESUL_CHIP (TIMERS_TICK_SIZE_CHIP) ++#define USEMI_CLK1_RESUL_EMUL (TIMERS_TICK_SIZE_EMUL) ++#define USEMI_CLK1_RESUL_FPGA (TIMERS_TICK_SIZE_FPGA) + + #define XSEMI_CLK1_RESUL_CHIP (1e-3) + #define XSEMI_CLK1_RESUL_EMUL \ +@@ -383,12 +571,15 @@ + #define XSTORM_IP_ID_ROLL_HALF 0x8000 + #define XSTORM_IP_ID_ROLL_ALL 0 + +-#define FW_LOG_LIST_SIZE (50) ++#define FW_LOG_LIST_SIZE 50 + + #define NUM_OF_PROTOCOLS 4 +-#define MAX_COS_NUMBER 16 ++#define NUM_OF_SAFC_BITS 16 ++#define MAX_COS_NUMBER 4 + #define MAX_T_STAT_COUNTER_ID 18 + #define MAX_X_STAT_COUNTER_ID 18 ++#define MAX_U_STAT_COUNTER_ID 18 ++ + + #define UNKNOWN_ADDRESS 0 + #define UNICAST_ADDRESS 1 +diff -r ddb96c0bbe13 drivers/net/bnx2x_fw_file_hdr.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/bnx2x_fw_file_hdr.h Tue Jun 16 13:15:30 2009 +0100 +@@ -0,0 +1,37 @@ ++/* bnx2x_fw_file_hdr.h: FW binary file header structure. ++ * ++ * Copyright (c) 2007-2009 Broadcom Corporation ++ * ++ * 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. ++ * ++ * Maintained by: Eilon Greenstein ++ * Written by: Vladislav Zolotarov ++ * Based on the original idea of John Wright . ++ */ ++ ++#ifndef BNX2X_INIT_FILE_HDR_H ++#define BNX2X_INIT_FILE_HDR_H ++ ++struct bnx2x_fw_file_section { ++ __be32 len; ++ __be32 offset; ++}; ++ ++struct bnx2x_fw_file_hdr { ++ struct bnx2x_fw_file_section init_ops; ++ struct bnx2x_fw_file_section init_ops_offsets; ++ struct bnx2x_fw_file_section init_data; ++ struct bnx2x_fw_file_section tsem_int_table_data; ++ struct bnx2x_fw_file_section tsem_pram_data; ++ struct bnx2x_fw_file_section usem_int_table_data; ++ struct bnx2x_fw_file_section usem_pram_data; ++ struct bnx2x_fw_file_section csem_int_table_data; ++ struct bnx2x_fw_file_section csem_pram_data; ++ struct bnx2x_fw_file_section xsem_int_table_data; ++ struct bnx2x_fw_file_section xsem_pram_data; ++ struct bnx2x_fw_file_section fw_version; ++}; ++ ++#endif /* BNX2X_INIT_FILE_HDR_H */ +diff -r ddb96c0bbe13 drivers/net/bnx2x_hsi.h +--- a/drivers/net/bnx2x_hsi.h Tue Jun 16 11:03:28 2009 +0100 ++++ b/drivers/net/bnx2x_hsi.h Tue Jun 16 13:15:30 2009 +0100 +@@ -1,11 +1,25 @@ + /* bnx2x_hsi.h: Broadcom Everest network driver. + * +- * Copyright (c) 2007-2008 Broadcom Corporation ++ * Copyright (c) 2007-2009 Broadcom Corporation + * + * 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. + */ ++ ++struct license_key { ++ u32 reserved[6]; ++ ++#if defined(__BIG_ENDIAN) ++ u16 max_iscsi_init_conn; ++ u16 max_iscsi_trgt_conn; ++#elif defined(__LITTLE_ENDIAN) ++ u16 max_iscsi_trgt_conn; ++ u16 max_iscsi_init_conn; ++#endif ++ ++ u32 reserved_a[6]; ++}; + + + #define PORT_0 0 +@@ -91,6 +105,43 @@ + + #define SHARED_HW_CFG_HIDE_PORT1 0x00002000 + ++#define SHARED_HW_CFG_WOL_CAPABLE_DISABLED 0x00000000 ++#define SHARED_HW_CFG_WOL_CAPABLE_ENABLED 0x00004000 ++ ++ /* Output low when PERST is asserted */ ++#define SHARED_HW_CFG_SPIO4_FOLLOW_PERST_DISABLED 0x00000000 ++#define SHARED_HW_CFG_SPIO4_FOLLOW_PERST_ENABLED 0x00008000 ++ ++#define SHARED_HW_CFG_PCIE_GEN2_PREEMPHASIS_MASK 0x00070000 ++#define SHARED_HW_CFG_PCIE_GEN2_PREEMPHASIS_SHIFT 16 ++#define SHARED_HW_CFG_PCIE_GEN2_PREEMPHASIS_HW 0x00000000 ++#define SHARED_HW_CFG_PCIE_GEN2_PREEMPHASIS_0DB 0x00010000 /* 0dB */ ++#define SHARED_HW_CFG_PCIE_GEN2_PREEMPHASIS_3_5DB 0x00020000 /* -3.5dB */ ++#define SHARED_HW_CFG_PCIE_GEN2_PREEMPHASIS_6_0DB 0x00030000 /* -6.0dB */ ++ ++ /* The fan failure mechanism is usually related to the PHY type ++ since the power consumption of the board is determined by the PHY. ++ Currently, fan is required for most designs with SFX7101, BCM8727 ++ and BCM8481. If a fan is not required for a board which uses one ++ of those PHYs, this field should be set to "Disabled". If a fan is ++ required for a different PHY type, this option should be set to ++ "Enabled". ++ The fan failure indication is expected on ++ SPIO5 */ ++#define SHARED_HW_CFG_FAN_FAILURE_MASK 0x00180000 ++#define SHARED_HW_CFG_FAN_FAILURE_SHIFT 19 ++#define SHARED_HW_CFG_FAN_FAILURE_PHY_TYPE 0x00000000 ++#define SHARED_HW_CFG_FAN_FAILURE_DISABLED 0x00080000 ++#define SHARED_HW_CFG_FAN_FAILURE_ENABLED 0x00100000 ++ ++ /* ASPM Power Management support */ ++#define SHARED_HW_CFG_ASPM_SUPPORT_MASK 0x00600000 ++#define SHARED_HW_CFG_ASPM_SUPPORT_SHIFT 21 ++#define SHARED_HW_CFG_ASPM_SUPPORT_L0S_L1_ENABLED 0x00000000 ++#define SHARED_HW_CFG_ASPM_SUPPORT_L0S_DISABLED 0x00200000 ++#define SHARED_HW_CFG_ASPM_SUPPORT_L1_DISABLED 0x00400000 ++#define SHARED_HW_CFG_ASPM_SUPPORT_L0S_L1_DISABLED 0x00600000 ++ + u32 power_dissipated; /* 0x11c */ + #define SHARED_HW_CFG_POWER_DIS_CMN_MASK 0xff000000 + #define SHARED_HW_CFG_POWER_DIS_CMN_SHIFT 24 +@@ -119,34 +170,14 @@ + #define SHARED_HW_CFG_UMP_NC_SI_EXT_PHY_TYPE_BCM5221 0x00010000 + + u32 board; /* 0x124 */ +-#define SHARED_HW_CFG_BOARD_TYPE_MASK 0x0000ffff +-#define SHARED_HW_CFG_BOARD_TYPE_SHIFT 0 +-#define SHARED_HW_CFG_BOARD_TYPE_NONE 0x00000000 +-#define SHARED_HW_CFG_BOARD_TYPE_BCM957710T1000 0x00000001 +-#define SHARED_HW_CFG_BOARD_TYPE_BCM957710T1001 0x00000002 +-#define SHARED_HW_CFG_BOARD_TYPE_BCM957710T1002G 0x00000003 +-#define SHARED_HW_CFG_BOARD_TYPE_BCM957710T1004G 0x00000004 +-#define SHARED_HW_CFG_BOARD_TYPE_BCM957710T1007G 0x00000005 +-#define SHARED_HW_CFG_BOARD_TYPE_BCM957710T1015G 0x00000006 +-#define SHARED_HW_CFG_BOARD_TYPE_BCM957710A1020G 0x00000007 +-#define SHARED_HW_CFG_BOARD_TYPE_BCM957710T1003G 0x00000008 +-#define SHARED_HW_CFG_BOARD_TYPE_BCM957710A1022G 0x00000009 +-#define SHARED_HW_CFG_BOARD_TYPE_BCM957710A1021G 0x0000000a +-#define SHARED_HW_CFG_BOARD_TYPE_BCM957710A1023G 0x0000000b +-#define SHARED_HW_CFG_BOARD_TYPE_BCM957710A1033G 0x0000000c +-#define SHARED_HW_CFG_BOARD_TYPE_BCM957711T1101 0x0000000d +-#define SHARED_HW_CFG_BOARD_TYPE_BCM957711ET1201 0x0000000e +-#define SHARED_HW_CFG_BOARD_TYPE_BCM957711A1133G 0x0000000f +-#define SHARED_HW_CFG_BOARD_TYPE_BCM957711EA1233G 0x00000010 +- +-#define SHARED_HW_CFG_BOARD_VER_MASK 0xffff0000 +-#define SHARED_HW_CFG_BOARD_VER_SHIFT 16 +-#define SHARED_HW_CFG_BOARD_MAJOR_VER_MASK 0xf0000000 +-#define SHARED_HW_CFG_BOARD_MAJOR_VER_SHIFT 28 +-#define SHARED_HW_CFG_BOARD_MINOR_VER_MASK 0x0f000000 +-#define SHARED_HW_CFG_BOARD_MINOR_VER_SHIFT 24 + #define SHARED_HW_CFG_BOARD_REV_MASK 0x00ff0000 + #define SHARED_HW_CFG_BOARD_REV_SHIFT 16 ++ ++#define SHARED_HW_CFG_BOARD_MAJOR_VER_MASK 0x0f000000 ++#define SHARED_HW_CFG_BOARD_MAJOR_VER_SHIFT 24 ++ ++#define SHARED_HW_CFG_BOARD_MINOR_VER_MASK 0xf0000000 ++#define SHARED_HW_CFG_BOARD_MINOR_VER_SHIFT 28 + + u32 reserved; /* 0x128 */ + +@@ -198,36 +229,24 @@ + u32 rdma_mac_lower; + + u32 serdes_config; +- /* for external PHY, or forced mode or during AN */ +-#define PORT_HW_CFG_SERDES_TX_DRV_PRE_EMPHASIS_MASK 0xffff0000 +-#define PORT_HW_CFG_SERDES_TX_DRV_PRE_EMPHASIS_SHIFT 16 ++#define PORT_HW_CFG_SERDES_TX_DRV_PRE_EMPHASIS_MASK 0x0000ffff ++#define PORT_HW_CFG_SERDES_TX_DRV_PRE_EMPHASIS_SHIFT 0 + +-#define PORT_HW_CFG_SERDES_RX_DRV_EQUALIZER_MASK 0x0000ffff +-#define PORT_HW_CFG_SERDES_RX_DRV_EQUALIZER_SHIFT 0 ++#define PORT_HW_CFG_SERDES_RX_DRV_EQUALIZER_MASK 0xffff0000 ++#define PORT_HW_CFG_SERDES_RX_DRV_EQUALIZER_SHIFT 16 + +- u16 serdes_tx_driver_pre_emphasis[16]; +- u16 serdes_rx_driver_equalizer[16]; + +- u32 xgxs_config_lane0; +- u32 xgxs_config_lane1; +- u32 xgxs_config_lane2; +- u32 xgxs_config_lane3; +- /* for external PHY, or forced mode or during AN */ +-#define PORT_HW_CFG_XGXS_TX_DRV_PRE_EMPHASIS_MASK 0xffff0000 +-#define PORT_HW_CFG_XGXS_TX_DRV_PRE_EMPHASIS_SHIFT 16 ++ u32 reserved0[16]; /* 0x158 */ + +-#define PORT_HW_CFG_XGXS_RX_DRV_EQUALIZER_MASK 0x0000ffff +-#define PORT_HW_CFG_XGXS_RX_DRV_EQUALIZER_SHIFT 0 ++ /* 4 times 16 bits for all 4 lanes. In case external PHY is present ++ (not direct mode), those values will not take effect on the 4 XGXS ++ lanes. For some external PHYs (such as 8706 and 8726) the values ++ will be used to configure the external PHY – in those cases, not ++ all 4 values are needed. */ ++ u16 xgxs_config_rx[4]; /* 0x198 */ ++ u16 xgxs_config_tx[4]; /* 0x1A0 */ + +- u16 xgxs_tx_driver_pre_emphasis_lane0[16]; +- u16 xgxs_tx_driver_pre_emphasis_lane1[16]; +- u16 xgxs_tx_driver_pre_emphasis_lane2[16]; +- u16 xgxs_tx_driver_pre_emphasis_lane3[16]; +- +- u16 xgxs_rx_driver_equalizer_lane0[16]; +- u16 xgxs_rx_driver_equalizer_lane1[16]; +- u16 xgxs_rx_driver_equalizer_lane2[16]; +- u16 xgxs_rx_driver_equalizer_lane3[16]; ++ u32 reserved1[64]; /* 0x1A8 */ + + u32 lane_config; + #define PORT_HW_CFG_LANE_SWAP_CFG_MASK 0x0000ffff +@@ -265,9 +284,11 @@ + #define PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073 0x00000300 + #define PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8705 0x00000400 + #define PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8706 0x00000500 +-#define PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8276 0x00000600 ++#define PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8726 0x00000600 + #define PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481 0x00000700 + #define PORT_HW_CFG_XGXS_EXT_PHY_TYPE_SFX7101 0x00000800 ++#define PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8727 0x00000900 ++#define PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8727_NOC 0x00000a00 + #define PORT_HW_CFG_XGXS_EXT_PHY_TYPE_FAILURE 0x0000fd00 + #define PORT_HW_CFG_XGXS_EXT_PHY_TYPE_NOT_CONN 0x0000ff00 + +@@ -307,7 +328,9 @@ + #define PORT_HW_CFG_SPEED_CAPABILITY_D3_16G 0x00000800 + #define PORT_HW_CFG_SPEED_CAPABILITY_D3_RESERVED 0x0000f000 + +- u32 reserved[2]; ++ /* A place to hold the original MAC address as a backup */ ++ u32 backup_mac_upper; /* 0x2B4 */ ++ u32 backup_mac_lower; /* 0x2B8 */ + + }; + +@@ -319,7 +342,24 @@ + + u32 config; /* 0x450 */ + #define SHARED_FEATURE_BMC_ECHO_MODE_EN 0x00000001 +-#define SHARED_FEATURE_MF_MODE_DISABLED 0x00000100 ++ ++ /* Use NVRAM values instead of HW default values */ ++#define SHARED_FEAT_CFG_OVERRIDE_PREEMPHASIS_CFG_DISABLED 0x00000000 ++#define SHARED_FEAT_CFG_OVERRIDE_PREEMPHASIS_CFG_ENABLED 0x00000002 ++ ++#define SHARED_FEAT_CFG_NCSI_ID_METHOD_SPIO 0x00000000 ++#define SHARED_FEAT_CFG_NCSI_ID_METHOD_NVRAM 0x00000008 ++ ++#define SHARED_FEAT_CFG_NCSI_ID_MASK 0x00000030 ++#define SHARED_FEAT_CFG_NCSI_ID_SHIFT 4 ++ ++ /* Override the OTP back to single function mode. When using GPIO, ++ high means only SF, 0 is according to CLP configuration */ ++#define SHARED_FEAT_CFG_FORCE_SF_MODE_MASK 0x00000700 ++#define SHARED_FEAT_CFG_FORCE_SF_MODE_SHIFT 8 ++#define SHARED_FEAT_CFG_FORCE_SF_MODE_MF_ALLOWED 0x00000000 ++#define SHARED_FEAT_CFG_FORCE_SF_MODE_FORCED_SF 0x00000100 ++#define SHARED_FEAT_CFG_FORCE_SF_MODE_SPIO4 0x00000200 + + }; + +@@ -372,6 +412,21 @@ + #define PORT_FEATURE_MBA_ENABLED 0x02000000 + #define PORT_FEATURE_MFW_ENABLED 0x04000000 + ++ /* Advertise expansion ROM even if MBA is disabled */ ++#define PORT_FEAT_CFG_FORCE_EXP_ROM_ADV_DISABLED 0x00000000 ++#define PORT_FEAT_CFG_FORCE_EXP_ROM_ADV_ENABLED 0x08000000 ++ ++ /* Reserved bits: 28-29 */ ++ /* Check the optic vendor via i2c against a list of approved modules ++ in a separate nvram image */ ++#define PORT_FEAT_CFG_OPT_MDL_ENFRCMNT_MASK 0xE0000000 ++#define PORT_FEAT_CFG_OPT_MDL_ENFRCMNT_SHIFT 29 ++#define PORT_FEAT_CFG_OPT_MDL_ENFRCMNT_NO_ENFORCEMENT 0x00000000 ++#define PORT_FEAT_CFG_OPT_MDL_ENFRCMNT_DISABLE_TX_LASER 0x20000000 ++#define PORT_FEAT_CFG_OPT_MDL_ENFRCMNT_WARNING_MSG 0x40000000 ++#define PORT_FEAT_CFG_OPT_MDL_ENFRCMNT_POWER_DOWN 0x60000000 ++ ++ + u32 wol_config; + /* Default is used when driver sets to "auto" mode */ + #define PORT_FEATURE_WOL_DEFAULT_MASK 0x00000003 +@@ -385,12 +440,13 @@ + #define PORT_FEATURE_WOL_ACPI_UPON_MGMT 0x00000010 + + u32 mba_config; +-#define PORT_FEATURE_MBA_BOOT_AGENT_TYPE_MASK 0x00000003 ++#define PORT_FEATURE_MBA_BOOT_AGENT_TYPE_MASK 0x00000007 + #define PORT_FEATURE_MBA_BOOT_AGENT_TYPE_SHIFT 0 + #define PORT_FEATURE_MBA_BOOT_AGENT_TYPE_PXE 0x00000000 + #define PORT_FEATURE_MBA_BOOT_AGENT_TYPE_RPL 0x00000001 + #define PORT_FEATURE_MBA_BOOT_AGENT_TYPE_BOOTP 0x00000002 + #define PORT_FEATURE_MBA_BOOT_AGENT_TYPE_ISCSIB 0x00000003 ++#define PORT_FEATURE_MBA_BOOT_AGENT_TYPE_NONE 0x00000007 + #define PORT_FEATURE_MBA_RES_PAUSE_CAP 0x00000100 + #define PORT_FEATURE_MBA_RES_ASYM_PAUSE_CAP 0x00000200 + #define PORT_FEATURE_MBA_SETUP_PROMPT_ENABLE 0x00000400 +@@ -512,7 +568,7 @@ + /**************************************************************************** + * Device Information * + ****************************************************************************/ +-struct dev_info { /* size */ ++struct shm_dev_info { /* size */ + + u32 bc_rev; /* 8 bits each: major, minor, build */ /* 4 */ + +@@ -641,7 +697,10 @@ + + u32 port_stx; + +- u32 reserved[2]; ++ u32 stat_nig_timer; ++ ++ /* MCP firmware does not use this field */ ++ u32 ext_phy_fw_version; + + }; + +@@ -656,6 +715,8 @@ + #define DRV_MSG_CODE_UNLOAD_REQ_WOL_DIS 0x20010000 + #define DRV_MSG_CODE_UNLOAD_REQ_WOL_MCP 0x20020000 + #define DRV_MSG_CODE_UNLOAD_DONE 0x21000000 ++#define DRV_MSG_CODE_DCC_OK 0x30000000 ++#define DRV_MSG_CODE_DCC_FAILURE 0x31000000 + #define DRV_MSG_CODE_DIAG_ENTER_REQ 0x50000000 + #define DRV_MSG_CODE_DIAG_EXIT_REQ 0x60000000 + #define DRV_MSG_CODE_VALIDATE_KEY 0x70000000 +@@ -663,6 +724,12 @@ + #define DRV_MSG_CODE_GET_UPGRADE_KEY 0x81000000 + #define DRV_MSG_CODE_GET_MANUF_KEY 0x82000000 + #define DRV_MSG_CODE_LOAD_L2B_PRAM 0x90000000 ++ /* ++ * The optic module verification commands requris bootcode ++ * v5.0.6 or later ++ */ ++#define DRV_MSG_CODE_VRFY_OPT_MDL 0xa0000000 ++#define REQ_BC_VER_4_VRFY_OPT_MDL 0x00050006 + + #define BIOS_MSG_CODE_LIC_CHALLENGE 0xff010000 + #define BIOS_MSG_CODE_LIC_RESPONSE 0xff020000 +@@ -684,6 +751,7 @@ + #define FW_MSG_CODE_DRV_UNLOAD_PORT 0x20110000 + #define FW_MSG_CODE_DRV_UNLOAD_FUNCTION 0x20120000 + #define FW_MSG_CODE_DRV_UNLOAD_DONE 0x21100000 ++#define FW_MSG_CODE_DCC_DONE 0x30100000 + #define FW_MSG_CODE_DIAG_ENTER_DONE 0x50100000 + #define FW_MSG_CODE_DIAG_REFUSE 0x50200000 + #define FW_MSG_CODE_DIAG_EXIT_DONE 0x60100000 +@@ -697,6 +765,9 @@ + #define FW_MSG_CODE_L2B_PRAM_C_LOAD_FAILURE 0x90220000 + #define FW_MSG_CODE_L2B_PRAM_X_LOAD_FAILURE 0x90230000 + #define FW_MSG_CODE_L2B_PRAM_U_LOAD_FAILURE 0x90240000 ++#define FW_MSG_CODE_VRFY_OPT_MDL_SUCCESS 0xa0100000 ++#define FW_MSG_CODE_VRFY_OPT_MDL_INVLD_IMG 0xa0200000 ++#define FW_MSG_CODE_VRFY_OPT_MDL_UNAPPROVED 0xa0300000 + + #define FW_MSG_CODE_LIC_CHALLENGE 0xff010000 + #define FW_MSG_CODE_LIC_RESPONSE 0xff020000 +@@ -706,6 +777,7 @@ + #define FW_MSG_SEQ_NUMBER_MASK 0x0000ffff + + u32 fw_mb_param; ++#define OPT_MDL_WARNING_MSG_LEN 80 + + u32 drv_pulse_mb; + #define DRV_PULSE_SEQ_MASK 0x00007fff +@@ -731,6 +803,14 @@ + u32 drv_status; + #define DRV_STATUS_PMF 0x00000001 + ++#define DRV_STATUS_DCC_EVENT_MASK 0x0000ff00 ++#define DRV_STATUS_DCC_DISABLE_ENABLE_PF 0x00000100 ++#define DRV_STATUS_DCC_BANDWIDTH_ALLOCATION 0x00000200 ++#define DRV_STATUS_DCC_CHANGE_MAC_ADDRESS 0x00000400 ++#define DRV_STATUS_DCC_RESERVED1 0x00000800 ++#define DRV_STATUS_DCC_SET_PROTOCOL 0x00001000 ++#define DRV_STATUS_DCC_SET_PRIORITY 0x00002000 ++ + u32 virt_mac_upper; + #define VIRT_MAC_SIGN_MASK 0xffff0000 + #define VIRT_MAC_SIGNATURE 0x564d0000 +@@ -767,10 +847,9 @@ + struct port_mf_cfg { + + u32 dynamic_cfg; /* device control channel */ +-#define PORT_MF_CFG_OUTER_VLAN_TAG_MASK 0x0000ffff +-#define PORT_MF_CFG_OUTER_VLAN_TAG_SHIFT 0 +-#define PORT_MF_CFG_DYNAMIC_CFG_ENABLED 0x00010000 +-#define PORT_MF_CFG_DYNAMIC_CFG_DEFAULT 0x00000000 ++#define PORT_MF_CFG_E1HOV_TAG_MASK 0x0000ffff ++#define PORT_MF_CFG_E1HOV_TAG_SHIFT 0 ++#define PORT_MF_CFG_E1HOV_TAG_DEFAULT PORT_MF_CFG_E1HOV_TAG_MASK + + u32 reserved[3]; + +@@ -827,11 +906,7 @@ + + struct shared_mf_cfg shared_mf_config; + struct port_mf_cfg port_mf_config[PORT_MAX]; +-#if defined(b710) +- struct func_mf_cfg func_mf_config[E1_FUNC_MAX]; +-#else + struct func_mf_cfg func_mf_config[E1H_FUNC_MAX]; +-#endif + + }; + +@@ -862,20 +937,42 @@ + #define SHR_MEM_VALIDITY_ACTIVE_MFW_NONE 0x000001c0 + #define SHR_MEM_VALIDITY_ACTIVE_MFW_MASK 0x000001c0 + +- struct dev_info dev_info; /* 0x8 (0x438) */ ++ struct shm_dev_info dev_info; /* 0x8 (0x438) */ + +- u8 reserved[52*PORT_MAX]; ++struct license_key drv_lic_key[PORT_MAX]; /* 0x440 (52*2=0x68) */ + + /* FW information (for internal FW use) */ + u32 fw_info_fio_offset; /* 0x4a8 (0x4) */ + struct mgmtfw_state mgmtfw_state; /* 0x4ac (0x1b8) */ + + struct drv_port_mb port_mb[PORT_MAX]; /* 0x664 (16*2=0x20) */ ++#if !defined(b710) /* BNX2X_UPSTREAM */ + struct drv_func_mb func_mb[E1H_FUNC_MAX]; ++#else ++ struct drv_func_mb func_mb[E1_FUNC_MAX]; /* 0x684 (44*2=0x58) */ ++#endif + ++#if !defined(b710) /* BNX2X_UPSTREAM */ + struct mf_cfg mf_cfg; ++#endif + + }; /* 0x6dc */ ++ ++ ++struct shmem2_region { ++ ++ u32 size; ++ ++ u32 dcc_support; ++#define SHMEM_DCC_SUPPORT_NONE 0x00000000 ++#define SHMEM_DCC_SUPPORT_DISABLE_ENABLE_PF_TLV 0x00000001 ++#define SHMEM_DCC_SUPPORT_BANDWIDTH_ALLOCATION_TLV 0x00000004 ++#define SHMEM_DCC_SUPPORT_CHANGE_MAC_ADDRESS_TLV 0x00000008 ++#define SHMEM_DCC_SUPPORT_SET_PROTOCOL_TLV 0x00000040 ++#define SHMEM_DCC_SUPPORT_SET_PRIORITY_TLV 0x00000080 ++#define SHMEM_DCC_SUPPORT_DEFAULT SHMEM_DCC_SUPPORT_NONE ++ ++}; + + + struct emac_stats { +@@ -1211,9 +1308,10 @@ + }; + + +-#define BCM_5710_FW_MAJOR_VERSION 4 +-#define BCM_5710_FW_MINOR_VERSION 5 +-#define BCM_5710_FW_REVISION_VERSION 1 ++#define BCM_5710_FW_MAJOR_VERSION 5 ++#define BCM_5710_FW_MINOR_VERSION 0 ++#define BCM_5710_FW_REVISION_VERSION 18 ++#define BCM_5710_FW_ENGINEERING_VERSION 0 + #define BCM_5710_FW_COMPILE_FLAGS 1 + + +@@ -1221,18 +1319,12 @@ + * attention bits + */ + struct atten_def_status_block { +- u32 attn_bits; +- u32 attn_bits_ack; +-#if defined(__BIG_ENDIAN) +- u16 attn_bits_index; +- u8 reserved0; +- u8 status_block_id; +-#elif defined(__LITTLE_ENDIAN) ++ __le32 attn_bits; ++ __le32 attn_bits_ack; + u8 status_block_id; + u8 reserved0; +- u16 attn_bits_index; +-#endif +- u32 reserved1; ++ __le16 attn_bits_index; ++ __le32 reserved1; + }; + + +@@ -1263,6 +1355,22 @@ + struct doorbell_hdr header; + u8 zero_fill1; + u16 zero_fill2; ++#endif ++}; ++ ++ ++/* ++ * doorbell message sent to the chip ++ */ ++struct doorbell_set_prod { ++#if defined(__BIG_ENDIAN) ++ u16 prod; ++ u8 zero_fill1; ++ struct doorbell_hdr header; ++#elif defined(__LITTLE_ENDIAN) ++ struct doorbell_hdr header; ++ u8 zero_fill1; ++ u16 prod; + #endif + }; + +@@ -1302,10 +1410,66 @@ + + + /* ++ * IGU driver acknowledgement register ++ */ ++struct igu_backward_compatible { ++ u32 sb_id_and_flags; ++#define IGU_BACKWARD_COMPATIBLE_SB_INDEX (0xFFFF<<0) ++#define IGU_BACKWARD_COMPATIBLE_SB_INDEX_SHIFT 0 ++#define IGU_BACKWARD_COMPATIBLE_SB_SELECT (0x1F<<16) ++#define IGU_BACKWARD_COMPATIBLE_SB_SELECT_SHIFT 16 ++#define IGU_BACKWARD_COMPATIBLE_SEGMENT_ACCESS (0x7<<21) ++#define IGU_BACKWARD_COMPATIBLE_SEGMENT_ACCESS_SHIFT 21 ++#define IGU_BACKWARD_COMPATIBLE_BUPDATE (0x1<<24) ++#define IGU_BACKWARD_COMPATIBLE_BUPDATE_SHIFT 24 ++#define IGU_BACKWARD_COMPATIBLE_ENABLE_INT (0x3<<25) ++#define IGU_BACKWARD_COMPATIBLE_ENABLE_INT_SHIFT 25 ++#define IGU_BACKWARD_COMPATIBLE_RESERVED_0 (0x1F<<27) ++#define IGU_BACKWARD_COMPATIBLE_RESERVED_0_SHIFT 27 ++ u32 reserved_2; ++}; ++ ++ ++/* ++ * IGU driver acknowledgement register ++ */ ++struct igu_regular { ++ u32 sb_id_and_flags; ++#define IGU_REGULAR_SB_INDEX (0xFFFFF<<0) ++#define IGU_REGULAR_SB_INDEX_SHIFT 0 ++#define IGU_REGULAR_RESERVED0 (0x1<<20) ++#define IGU_REGULAR_RESERVED0_SHIFT 20 ++#define IGU_REGULAR_SEGMENT_ACCESS (0x7<<21) ++#define IGU_REGULAR_SEGMENT_ACCESS_SHIFT 21 ++#define IGU_REGULAR_BUPDATE (0x1<<24) ++#define IGU_REGULAR_BUPDATE_SHIFT 24 ++#define IGU_REGULAR_ENABLE_INT (0x3<<25) ++#define IGU_REGULAR_ENABLE_INT_SHIFT 25 ++#define IGU_REGULAR_RESERVED_1 (0x1<<27) ++#define IGU_REGULAR_RESERVED_1_SHIFT 27 ++#define IGU_REGULAR_CLEANUP_TYPE (0x3<<28) ++#define IGU_REGULAR_CLEANUP_TYPE_SHIFT 28 ++#define IGU_REGULAR_CLEANUP_SET (0x1<<30) ++#define IGU_REGULAR_CLEANUP_SET_SHIFT 30 ++#define IGU_REGULAR_BCLEANUP (0x1<<31) ++#define IGU_REGULAR_BCLEANUP_SHIFT 31 ++ u32 reserved_2; ++}; ++ ++/* ++ * IGU driver acknowledgement register ++ */ ++union igu_consprod_reg { ++ struct igu_regular regular; ++ struct igu_backward_compatible backward_compatible; ++}; ++ ++ ++/* + * Parser parsing flags field + */ + struct parsing_flags { +- u16 flags; ++ __le16 flags; + #define PARSING_FLAGS_ETHERNET_ADDRESS_TYPE (0x1<<0) + #define PARSING_FLAGS_ETHERNET_ADDRESS_TYPE_SHIFT 0 + #define PARSING_FLAGS_VLAN (0x1<<1) +@@ -1336,8 +1500,8 @@ + + + struct regpair { +- u32 lo; +- u32 hi; ++ __le32 lo; ++ __le32 hi; + }; + + +@@ -1432,8 +1596,8 @@ + #define USTORM_ETH_ST_CONTEXT_CONFIG_ENABLE_DYNAMIC_HC_SHIFT 1 + #define USTORM_ETH_ST_CONTEXT_CONFIG_ENABLE_TPA (0x1<<2) + #define USTORM_ETH_ST_CONTEXT_CONFIG_ENABLE_TPA_SHIFT 2 +-#define USTORM_ETH_ST_CONTEXT_CONFIG_ENABLE_SGE_RING (0x1<<3) +-#define USTORM_ETH_ST_CONTEXT_CONFIG_ENABLE_SGE_RING_SHIFT 3 ++#define USTORM_ETH_ST_CONTEXT_CONFIG_ENABLE_STATISTICS (0x1<<3) ++#define USTORM_ETH_ST_CONTEXT_CONFIG_ENABLE_STATISTICS_SHIFT 3 + #define __USTORM_ETH_ST_CONTEXT_CONFIG_RESERVED0 (0xF<<4) + #define __USTORM_ETH_ST_CONTEXT_CONFIG_RESERVED0_SHIFT 4 + u8 status_block_id; +@@ -1458,16 +1622,18 @@ + #define USTORM_ETH_ST_CONTEXT_CONFIG_ENABLE_DYNAMIC_HC_SHIFT 1 + #define USTORM_ETH_ST_CONTEXT_CONFIG_ENABLE_TPA (0x1<<2) + #define USTORM_ETH_ST_CONTEXT_CONFIG_ENABLE_TPA_SHIFT 2 +-#define USTORM_ETH_ST_CONTEXT_CONFIG_ENABLE_SGE_RING (0x1<<3) +-#define USTORM_ETH_ST_CONTEXT_CONFIG_ENABLE_SGE_RING_SHIFT 3 ++#define USTORM_ETH_ST_CONTEXT_CONFIG_ENABLE_STATISTICS (0x1<<3) ++#define USTORM_ETH_ST_CONTEXT_CONFIG_ENABLE_STATISTICS_SHIFT 3 + #define __USTORM_ETH_ST_CONTEXT_CONFIG_RESERVED0 (0xF<<4) + #define __USTORM_ETH_ST_CONTEXT_CONFIG_RESERVED0_SHIFT 4 + #endif + #if defined(__BIG_ENDIAN) + u16 bd_buff_size; +- u16 mc_alignment_size; ++ u8 statistics_counter_id; ++ u8 mc_alignment_log_size; + #elif defined(__LITTLE_ENDIAN) +- u16 mc_alignment_size; ++ u8 mc_alignment_log_size; ++ u8 statistics_counter_id; + u16 bd_buff_size; + #endif + #if defined(__BIG_ENDIAN) +@@ -1480,40 +1646,59 @@ + u8 __local_sge_prod; + #endif + #if defined(__BIG_ENDIAN) +- u16 __bd_cons; +- u16 __sge_cons; ++ u16 __sdm_bd_expected_counter; ++ u8 cstorm_agg_int; ++ u8 __expected_bds_on_ram; + #elif defined(__LITTLE_ENDIAN) +- u16 __sge_cons; +- u16 __bd_cons; ++ u8 __expected_bds_on_ram; ++ u8 cstorm_agg_int; ++ u16 __sdm_bd_expected_counter; ++#endif ++#if defined(__BIG_ENDIAN) ++ u16 __ring_data_ram_addr; ++ u16 __hc_cstorm_ram_addr; ++#elif defined(__LITTLE_ENDIAN) ++ u16 __hc_cstorm_ram_addr; ++ u16 __ring_data_ram_addr; ++#endif ++#if defined(__BIG_ENDIAN) ++ u8 reserved1; ++ u8 max_sges_for_packet; ++ u16 __bd_ring_ram_addr; ++#elif defined(__LITTLE_ENDIAN) ++ u16 __bd_ring_ram_addr; ++ u8 max_sges_for_packet; ++ u8 reserved1; + #endif + u32 bd_page_base_lo; + u32 bd_page_base_hi; + u32 sge_page_base_lo; + u32 sge_page_base_hi; ++ struct regpair reserved2; + }; + + /* + * The eth Rx Buffer Descriptor + */ + struct eth_rx_bd { +- u32 addr_lo; +- u32 addr_hi; ++ __le32 addr_lo; ++ __le32 addr_hi; + }; + + /* + * The eth Rx SGE Descriptor + */ + struct eth_rx_sge { +- u32 addr_lo; +- u32 addr_hi; ++ __le32 addr_lo; ++ __le32 addr_hi; + }; + + /* + * Local BDs and SGEs rings (in ETH) + */ + struct eth_local_rx_rings { +- struct eth_rx_bd __local_bd_ring[16]; +- struct eth_rx_sge __local_sge_ring[12]; ++ struct eth_rx_bd __local_bd_ring[8]; ++ struct eth_rx_sge __local_sge_ring[10]; + }; + + /* +@@ -1605,13 +1790,13 @@ + */ + struct xstorm_eth_ag_context { + #if defined(__BIG_ENDIAN) +- u16 __bd_prod; ++ u16 agg_val1; + u8 __agg_vars1; + u8 __state; + #elif defined(__LITTLE_ENDIAN) + u8 __state; + u8 __agg_vars1; +- u16 __bd_prod; ++ u16 agg_val1; + #endif + #if defined(__BIG_ENDIAN) + u8 cdu_reserved; +@@ -1624,7 +1809,7 @@ + u8 __agg_vars4; + u8 cdu_reserved; + #endif +- u32 __more_packets_to_send; ++ u32 __bd_prod; + #if defined(__BIG_ENDIAN) + u16 __agg_vars5; + u16 __agg_val4_th; +@@ -1697,7 +1882,7 @@ + }; + + /* +- * The eth aggregative context section of Tstorm ++ * The eth extra aggregative context section of Tstorm + */ + struct tstorm_eth_extra_ag_context_section { + u32 __agg_val1; +@@ -1890,8 +2075,8 @@ + #define ETH_TX_BD_FLAGS_VLAN_TAG_SHIFT 0 + #define ETH_TX_BD_FLAGS_IP_CSUM (0x1<<1) + #define ETH_TX_BD_FLAGS_IP_CSUM_SHIFT 1 +-#define ETH_TX_BD_FLAGS_TCP_CSUM (0x1<<2) +-#define ETH_TX_BD_FLAGS_TCP_CSUM_SHIFT 2 ++#define ETH_TX_BD_FLAGS_L4_CSUM (0x1<<2) ++#define ETH_TX_BD_FLAGS_L4_CSUM_SHIFT 2 + #define ETH_TX_BD_FLAGS_END_BD (0x1<<3) + #define ETH_TX_BD_FLAGS_END_BD_SHIFT 3 + #define ETH_TX_BD_FLAGS_START_BD (0x1<<4) +@@ -1907,18 +2092,29 @@ + /* + * The eth Tx Buffer Descriptor + */ ++struct eth_tx_start_bd { ++ __le32 addr_lo; ++ __le32 addr_hi; ++ __le16 nbd; ++ __le16 nbytes; ++ __le16 vlan; ++ struct eth_tx_bd_flags bd_flags; ++ u8 general_data; ++#define ETH_TX_START_BD_HDR_NBDS (0x3F<<0) ++#define ETH_TX_START_BD_HDR_NBDS_SHIFT 0 ++#define ETH_TX_START_BD_ETH_ADDR_TYPE (0x3<<6) ++#define ETH_TX_START_BD_ETH_ADDR_TYPE_SHIFT 6 ++}; ++ ++/* ++ * Tx regular BD structure ++ */ + struct eth_tx_bd { + u32 addr_lo; + u32 addr_hi; +- u16 nbd; ++ u16 total_pkt_bytes; + u16 nbytes; +- u16 vlan; +- struct eth_tx_bd_flags bd_flags; +- u8 general_data; +-#define ETH_TX_BD_HDR_NBDS (0x3F<<0) +-#define ETH_TX_BD_HDR_NBDS_SHIFT 0 +-#define ETH_TX_BD_ETH_ADDR_TYPE (0x3<<6) +-#define ETH_TX_BD_ETH_ADDR_TYPE_SHIFT 6 ++ u8 reserved[4]; + }; + + /* +@@ -1928,8 +2124,8 @@ + u8 global_data; + #define ETH_TX_PARSE_BD_IP_HDR_START_OFFSET (0xF<<0) + #define ETH_TX_PARSE_BD_IP_HDR_START_OFFSET_SHIFT 0 +-#define ETH_TX_PARSE_BD_CS_ANY_FLG (0x1<<4) +-#define ETH_TX_PARSE_BD_CS_ANY_FLG_SHIFT 4 ++#define ETH_TX_PARSE_BD_UDP_CS_FLG (0x1<<4) ++#define ETH_TX_PARSE_BD_UDP_CS_FLG_SHIFT 4 + #define ETH_TX_PARSE_BD_PSEUDO_CS_WITHOUT_LEN (0x1<<5) + #define ETH_TX_PARSE_BD_PSEUDO_CS_WITHOUT_LEN_SHIFT 5 + #define ETH_TX_PARSE_BD_LLC_SNAP_EN (0x1<<6) +@@ -1954,27 +2150,28 @@ + #define ETH_TX_PARSE_BD_CWR_FLG (0x1<<7) + #define ETH_TX_PARSE_BD_CWR_FLG_SHIFT 7 + u8 ip_hlen; +- s8 cs_offset; +- u16 total_hlen; +- u16 lso_mss; +- u16 tcp_pseudo_csum; +- u16 ip_id; +- u32 tcp_send_seq; ++ s8 reserved; ++ __le16 total_hlen; ++ __le16 tcp_pseudo_csum; ++ __le16 lso_mss; ++ __le16 ip_id; ++ __le32 tcp_send_seq; + }; + + /* + * The last BD in the BD memory will hold a pointer to the next BD memory + */ + struct eth_tx_next_bd { +- u32 addr_lo; +- u32 addr_hi; ++ __le32 addr_lo; ++ __le32 addr_hi; + u8 reserved[8]; + }; + + /* +- * union for 3 Bd types ++ * union for 4 Bd types + */ + union eth_tx_bd_types { ++ struct eth_tx_start_bd start_bd; + struct eth_tx_bd reg_bd; + struct eth_tx_parse_bd parse_bd; + struct eth_tx_next_bd next_bd; +@@ -2003,11 +2200,35 @@ + #define XSTORM_ETH_ST_CONTEXT_STATISTICS_ENABLE_SHIFT 7 + u16 tx_bd_cons; + #endif +- u32 db_data_addr_lo; +- u32 db_data_addr_hi; +- u32 __pkt_cons; +- u32 __gso_next; +- u32 is_eth_conn_1b; ++ u32 __reserved1; ++ u32 __reserved2; ++#if defined(__BIG_ENDIAN) ++ u8 __ram_cache_index; ++ u8 __double_buffer_client; ++ u16 __pkt_cons; ++#elif defined(__LITTLE_ENDIAN) ++ u16 __pkt_cons; ++ u8 __double_buffer_client; ++ u8 __ram_cache_index; ++#endif ++#if defined(__BIG_ENDIAN) ++ u16 __statistics_address; ++ u16 __gso_next; ++#elif defined(__LITTLE_ENDIAN) ++ u16 __gso_next; ++ u16 __statistics_address; ++#endif ++#if defined(__BIG_ENDIAN) ++ u8 __local_tx_bd_cons; ++ u8 safc_group_num; ++ u8 safc_group_en; ++ u8 __is_eth_conn; ++#elif defined(__LITTLE_ENDIAN) ++ u8 __is_eth_conn; ++ u8 safc_group_en; ++ u8 safc_group_num; ++ u8 __local_tx_bd_cons; ++#endif + union eth_tx_bd_types __bds[13]; + }; + +@@ -2072,47 +2293,47 @@ + + + /* +- * ustorm status block ++ * cstorm default status block, generated by ustorm + */ +-struct ustorm_def_status_block { +- u16 index_values[HC_USTORM_DEF_SB_NUM_INDICES]; +- u16 status_block_index; ++struct cstorm_def_status_block_u { ++ __le16 index_values[HC_USTORM_DEF_SB_NUM_INDICES]; ++ __le16 status_block_index; + u8 func; + u8 status_block_id; +- u32 __flags; ++ __le32 __flags; + }; + + /* +- * cstorm status block ++ * cstorm default status block, generated by cstorm + */ +-struct cstorm_def_status_block { +- u16 index_values[HC_CSTORM_DEF_SB_NUM_INDICES]; +- u16 status_block_index; ++struct cstorm_def_status_block_c { ++ __le16 index_values[HC_CSTORM_DEF_SB_NUM_INDICES]; ++ __le16 status_block_index; + u8 func; + u8 status_block_id; +- u32 __flags; ++ __le32 __flags; + }; + + /* + * xstorm status block + */ + struct xstorm_def_status_block { +- u16 index_values[HC_XSTORM_DEF_SB_NUM_INDICES]; +- u16 status_block_index; ++ __le16 index_values[HC_XSTORM_DEF_SB_NUM_INDICES]; ++ __le16 status_block_index; + u8 func; + u8 status_block_id; +- u32 __flags; ++ __le32 __flags; + }; + + /* + * tstorm status block + */ + struct tstorm_def_status_block { +- u16 index_values[HC_TSTORM_DEF_SB_NUM_INDICES]; +- u16 status_block_index; ++ __le16 index_values[HC_TSTORM_DEF_SB_NUM_INDICES]; ++ __le16 status_block_index; + u8 func; + u8 status_block_id; +- u32 __flags; ++ __le32 __flags; + }; + + /* +@@ -2120,41 +2341,41 @@ + */ + struct host_def_status_block { + struct atten_def_status_block atten_status_block; +- struct ustorm_def_status_block u_def_status_block; +- struct cstorm_def_status_block c_def_status_block; ++ struct cstorm_def_status_block_u u_def_status_block; ++ struct cstorm_def_status_block_c c_def_status_block; + struct xstorm_def_status_block x_def_status_block; + struct tstorm_def_status_block t_def_status_block; + }; + + + /* +- * ustorm status block ++ * cstorm status block, generated by ustorm + */ +-struct ustorm_status_block { +- u16 index_values[HC_USTORM_SB_NUM_INDICES]; +- u16 status_block_index; ++struct cstorm_status_block_u { ++ __le16 index_values[HC_USTORM_SB_NUM_INDICES]; ++ __le16 status_block_index; + u8 func; + u8 status_block_id; +- u32 __flags; ++ __le32 __flags; + }; + + /* +- * cstorm status block ++ * cstorm status block, generated by cstorm + */ +-struct cstorm_status_block { +- u16 index_values[HC_CSTORM_SB_NUM_INDICES]; +- u16 status_block_index; ++struct cstorm_status_block_c { ++ __le16 index_values[HC_CSTORM_SB_NUM_INDICES]; ++ __le16 status_block_index; + u8 func; + u8 status_block_id; +- u32 __flags; ++ __le32 __flags; + }; + + /* + * host status block + */ + struct host_status_block { +- struct ustorm_status_block u_status_block; +- struct cstorm_status_block c_status_block; ++ struct cstorm_status_block_u u_status_block; ++ struct cstorm_status_block_c c_status_block; + }; + + +@@ -2162,19 +2383,10 @@ + * The data for RSS setup ramrod + */ + struct eth_client_setup_ramrod_data { +- u32 client_id_5b; +- u8 is_rdma_1b; +- u8 reserved0; ++ u32 client_id; ++ u8 is_rdma; ++ u8 is_fcoe; + u16 reserved1; +-}; +- +- +-/* +- * L2 dynamic host coalescing init parameters +- */ +-struct eth_dynamic_hc_config { +- u32 threshold[3]; +- u8 hc_timeout[4]; + }; + + +@@ -2212,12 +2424,12 @@ + #define ETH_FAST_PATH_RX_CQE_L4_XSUM_NO_VALIDATION_FLG_SHIFT 7 + u8 placement_offset; + u8 queue_index; +- u32 rss_hash_result; +- u16 vlan_tag; +- u16 pkt_len; +- u16 len_on_bd; ++ __le32 rss_hash_result; ++ __le16 vlan_tag; ++ __le16 pkt_len; ++ __le16 len_on_bd; + struct parsing_flags pars_flags; +- u16 sgl[8]; ++ __le16 sgl[8]; + }; + + +@@ -2225,7 +2437,7 @@ + * The data for RSS setup ramrod + */ + struct eth_halt_ramrod_data { +- u32 client_id_5b; ++ u32 client_id; + u32 reserved0; + }; + +@@ -2236,11 +2448,11 @@ + struct eth_query_ramrod_data { + #if defined(__BIG_ENDIAN) + u8 reserved0; +- u8 collect_port_1b; ++ u8 collect_port; + u16 drv_counter; + #elif defined(__LITTLE_ENDIAN) + u16 drv_counter; +- u8 collect_port_1b; ++ u8 collect_port; + u8 reserved0; + #endif + u32 ctr_id_vector; +@@ -2251,8 +2463,8 @@ + * Place holder for ramrods protocol specific data + */ + struct ramrod_data { +- u32 data_lo; +- u32 data_hi; ++ __le32 data_lo; ++ __le32 data_hi; + }; + + /* +@@ -2260,16 +2472,6 @@ + */ + union eth_ramrod_data { + struct ramrod_data general; +-}; +- +- +-/* +- * Rx Last BD in page (in ETH) +- */ +-struct eth_rx_bd_next_page { +- u32 addr_lo; +- u32 addr_hi; +- u8 reserved[8]; + }; + + +@@ -2282,24 +2484,24 @@ + #define COMMON_RAMROD_ETH_RX_CQE_TYPE_SHIFT 0 + #define COMMON_RAMROD_ETH_RX_CQE_RESERVED0 (0x7F<<1) + #define COMMON_RAMROD_ETH_RX_CQE_RESERVED0_SHIFT 1 +- u8 conn_type_3b; +- u16 reserved1; +- u32 conn_and_cmd_data; ++ u8 conn_type; ++ __le16 reserved1; ++ __le32 conn_and_cmd_data; + #define COMMON_RAMROD_ETH_RX_CQE_CID (0xFFFFFF<<0) + #define COMMON_RAMROD_ETH_RX_CQE_CID_SHIFT 0 + #define COMMON_RAMROD_ETH_RX_CQE_CMD_ID (0xFF<<24) + #define COMMON_RAMROD_ETH_RX_CQE_CMD_ID_SHIFT 24 + struct ramrod_data protocol_data; +- u32 reserved2[4]; ++ __le32 reserved2[4]; + }; + + /* + * Rx Last CQE in page (in ETH) + */ + struct eth_rx_cqe_next_page { +- u32 addr_lo; +- u32 addr_hi; +- u32 reserved[6]; ++ __le32 addr_lo; ++ __le32 addr_hi; ++ __le32 reserved[6]; + }; + + /* +@@ -2316,17 +2518,17 @@ + * common data for all protocols + */ + struct spe_hdr { +- u32 conn_and_cmd_data; ++ __le32 conn_and_cmd_data; + #define SPE_HDR_CID (0xFFFFFF<<0) + #define SPE_HDR_CID_SHIFT 0 + #define SPE_HDR_CMD_ID (0xFF<<24) + #define SPE_HDR_CMD_ID_SHIFT 24 +- u16 type; ++ __le16 type; + #define SPE_HDR_CONN_TYPE (0xFF<<0) + #define SPE_HDR_CONN_TYPE_SHIFT 0 + #define SPE_HDR_COMMON_RAMROD (0xFF<<8) + #define SPE_HDR_COMMON_RAMROD_SHIFT 8 +- u16 reserved; ++ __le16 reserved; + }; + + /* +@@ -2352,12 +2554,10 @@ + + + /* +- * doorbell data in host memory ++ * array of 13 bds as appears in the eth xstorm context + */ +-struct eth_tx_db_data { +- u32 packets_prod; +- u16 bds_prod; +- u16 reserved; ++struct eth_tx_bds_array { ++ union eth_tx_bd_types bds[13]; + }; + + +@@ -2377,14 +2577,18 @@ + #define TSTORM_ETH_FUNCTION_COMMON_CONFIG_RSS_IPV6_CAPABILITY_SHIFT 2 + #define TSTORM_ETH_FUNCTION_COMMON_CONFIG_RSS_IPV6_TCP_CAPABILITY (0x1<<3) + #define TSTORM_ETH_FUNCTION_COMMON_CONFIG_RSS_IPV6_TCP_CAPABILITY_SHIFT 3 +-#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_RSS_ENABLE (0x1<<4) +-#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_RSS_ENABLE_SHIFT 4 +-#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_DEFAULT_ENABLE (0x1<<5) +-#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_DEFAULT_ENABLE_SHIFT 5 +-#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_VLAN_IN_CAM (0x1<<6) +-#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_VLAN_IN_CAM_SHIFT 6 +-#define __TSTORM_ETH_FUNCTION_COMMON_CONFIG_RESERVED0 (0x1FF<<7) +-#define __TSTORM_ETH_FUNCTION_COMMON_CONFIG_RESERVED0_SHIFT 7 ++#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_RSS_MODE (0x7<<4) ++#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_RSS_MODE_SHIFT 4 ++#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_DEFAULT_ENABLE (0x1<<7) ++#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_DEFAULT_ENABLE_SHIFT 7 ++#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_VLAN_IN_CAM (0x1<<8) ++#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_VLAN_IN_CAM_SHIFT 8 ++#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_E1HOV_IN_CAM (0x1<<9) ++#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_E1HOV_IN_CAM_SHIFT 9 ++#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_ENABLE_TPA (0x1<<10) ++#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_ENABLE_TPA_SHIFT 10 ++#define __TSTORM_ETH_FUNCTION_COMMON_CONFIG_RESERVED0 (0x1F<<11) ++#define __TSTORM_ETH_FUNCTION_COMMON_CONFIG_RESERVED0_SHIFT 11 + #elif defined(__LITTLE_ENDIAN) + u16 config_flags; + #define TSTORM_ETH_FUNCTION_COMMON_CONFIG_RSS_IPV4_CAPABILITY (0x1<<0) +@@ -2395,18 +2599,48 @@ + #define TSTORM_ETH_FUNCTION_COMMON_CONFIG_RSS_IPV6_CAPABILITY_SHIFT 2 + #define TSTORM_ETH_FUNCTION_COMMON_CONFIG_RSS_IPV6_TCP_CAPABILITY (0x1<<3) + #define TSTORM_ETH_FUNCTION_COMMON_CONFIG_RSS_IPV6_TCP_CAPABILITY_SHIFT 3 +-#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_RSS_ENABLE (0x1<<4) +-#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_RSS_ENABLE_SHIFT 4 +-#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_DEFAULT_ENABLE (0x1<<5) +-#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_DEFAULT_ENABLE_SHIFT 5 +-#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_VLAN_IN_CAM (0x1<<6) +-#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_VLAN_IN_CAM_SHIFT 6 +-#define __TSTORM_ETH_FUNCTION_COMMON_CONFIG_RESERVED0 (0x1FF<<7) +-#define __TSTORM_ETH_FUNCTION_COMMON_CONFIG_RESERVED0_SHIFT 7 ++#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_RSS_MODE (0x7<<4) ++#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_RSS_MODE_SHIFT 4 ++#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_DEFAULT_ENABLE (0x1<<7) ++#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_DEFAULT_ENABLE_SHIFT 7 ++#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_VLAN_IN_CAM (0x1<<8) ++#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_VLAN_IN_CAM_SHIFT 8 ++#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_E1HOV_IN_CAM (0x1<<9) ++#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_E1HOV_IN_CAM_SHIFT 9 ++#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_ENABLE_TPA (0x1<<10) ++#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_ENABLE_TPA_SHIFT 10 ++#define __TSTORM_ETH_FUNCTION_COMMON_CONFIG_RESERVED0 (0x1F<<11) ++#define __TSTORM_ETH_FUNCTION_COMMON_CONFIG_RESERVED0_SHIFT 11 + u8 rss_result_mask; + u8 leading_client_id; + #endif + u16 vlan_id[2]; ++}; ++ ++/* ++ * RSS idirection table update configuration ++ */ ++struct rss_update_config { ++#if defined(__BIG_ENDIAN) ++ u16 toe_rss_bitmap; ++ u16 flags; ++#define RSS_UPDATE_CONFIG_ETH_UPDATE_ENABLE (0x1<<0) ++#define RSS_UPDATE_CONFIG_ETH_UPDATE_ENABLE_SHIFT 0 ++#define RSS_UPDATE_CONFIG_TOE_UPDATE_ENABLE (0x1<<1) ++#define RSS_UPDATE_CONFIG_TOE_UPDATE_ENABLE_SHIFT 1 ++#define __RSS_UPDATE_CONFIG_RESERVED0 (0x3FFF<<2) ++#define __RSS_UPDATE_CONFIG_RESERVED0_SHIFT 2 ++#elif defined(__LITTLE_ENDIAN) ++ u16 flags; ++#define RSS_UPDATE_CONFIG_ETH_UPDATE_ENABLE (0x1<<0) ++#define RSS_UPDATE_CONFIG_ETH_UPDATE_ENABLE_SHIFT 0 ++#define RSS_UPDATE_CONFIG_TOE_UPDATE_ENABLE (0x1<<1) ++#define RSS_UPDATE_CONFIG_TOE_UPDATE_ENABLE_SHIFT 1 ++#define __RSS_UPDATE_CONFIG_RESERVED0 (0x3FFF<<2) ++#define __RSS_UPDATE_CONFIG_RESERVED0_SHIFT 2 ++ u16 toe_rss_bitmap; ++#endif ++ u32 reserved1; + }; + + /* +@@ -2415,6 +2649,7 @@ + struct eth_update_ramrod_data { + struct tstorm_eth_function_common_config func_config; + u8 indirectionTable[128]; ++ struct rss_update_config rss_config; + }; + + +@@ -2422,7 +2657,7 @@ + * MAC filtering configuration command header + */ + struct mac_configuration_hdr { +- u8 length_6b; ++ u8 length; + u8 offset; + u16 client_id; + u32 reserved1; +@@ -2432,10 +2667,10 @@ + * MAC address in list for ramrod + */ + struct tstorm_cam_entry { +- u16 lsb_mac_addr; +- u16 middle_mac_addr; +- u16 msb_mac_addr; +- u16 flags; ++ __le16 lsb_mac_addr; ++ __le16 middle_mac_addr; ++ __le16 msb_mac_addr; ++ __le16 flags; + #define TSTORM_CAM_ENTRY_PORT_ID (0x1<<0) + #define TSTORM_CAM_ENTRY_PORT_ID_SHIFT 0 + #define TSTORM_CAM_ENTRY_RSRVVAL0 (0x7<<1) +@@ -2459,8 +2694,9 @@ + #define TSTORM_CAM_TARGET_TABLE_ENTRY_RDMA_MAC_SHIFT 3 + #define TSTORM_CAM_TARGET_TABLE_ENTRY_RESERVED0 (0xF<<4) + #define TSTORM_CAM_TARGET_TABLE_ENTRY_RESERVED0_SHIFT 4 +- u8 client_id; ++ u8 reserved1; + u16 vlan_id; ++ u32 clients_bit_vector; + }; + + /* +@@ -2484,12 +2720,12 @@ + * MAC address in list for ramrod + */ + struct mac_configuration_entry_e1h { +- u16 lsb_mac_addr; +- u16 middle_mac_addr; +- u16 msb_mac_addr; +- u16 vlan_id; +- u16 e1hov_id; +- u8 client_id; ++ __le16 lsb_mac_addr; ++ __le16 middle_mac_addr; ++ __le16 msb_mac_addr; ++ __le16 vlan_id; ++ __le16 e1hov_id; ++ u8 reserved0; + u8 flags; + #define MAC_CONFIGURATION_ENTRY_E1H_PORT (0x1<<0) + #define MAC_CONFIGURATION_ENTRY_E1H_PORT_SHIFT 0 +@@ -2497,8 +2733,9 @@ + #define MAC_CONFIGURATION_ENTRY_E1H_ACTION_TYPE_SHIFT 1 + #define MAC_CONFIGURATION_ENTRY_E1H_RDMA_MAC (0x1<<2) + #define MAC_CONFIGURATION_ENTRY_E1H_RDMA_MAC_SHIFT 2 +-#define MAC_CONFIGURATION_ENTRY_E1H_RESERVED0 (0x1F<<3) +-#define MAC_CONFIGURATION_ENTRY_E1H_RESERVED0_SHIFT 3 ++#define MAC_CONFIGURATION_ENTRY_E1H_RESERVED1 (0x1F<<3) ++#define MAC_CONFIGURATION_ENTRY_E1H_RESERVED1_SHIFT 3 ++ u32 clients_bit_vector; + }; + + /* +@@ -2523,13 +2760,13 @@ + */ + struct tstorm_eth_client_config { + #if defined(__BIG_ENDIAN) +- u8 max_sges_for_packet; ++ u8 reserved0; + u8 statistics_counter_id; + u16 mtu; + #elif defined(__LITTLE_ENDIAN) + u16 mtu; + u8 statistics_counter_id; +- u8 max_sges_for_packet; ++ u8 reserved0; + #endif + #if defined(__BIG_ENDIAN) + u16 drop_flags; +@@ -2541,27 +2778,27 @@ + #define TSTORM_ETH_CLIENT_CONFIG_DROP_TTL0_SHIFT 2 + #define TSTORM_ETH_CLIENT_CONFIG_DROP_UDP_CS_ERR (0x1<<3) + #define TSTORM_ETH_CLIENT_CONFIG_DROP_UDP_CS_ERR_SHIFT 3 +-#define __TSTORM_ETH_CLIENT_CONFIG_RESERVED1 (0xFFF<<4) +-#define __TSTORM_ETH_CLIENT_CONFIG_RESERVED1_SHIFT 4 ++#define __TSTORM_ETH_CLIENT_CONFIG_RESERVED2 (0xFFF<<4) ++#define __TSTORM_ETH_CLIENT_CONFIG_RESERVED2_SHIFT 4 + u16 config_flags; +-#define TSTORM_ETH_CLIENT_CONFIG_VLAN_REMOVAL_ENABLE (0x1<<0) +-#define TSTORM_ETH_CLIENT_CONFIG_VLAN_REMOVAL_ENABLE_SHIFT 0 +-#define TSTORM_ETH_CLIENT_CONFIG_STATSITICS_ENABLE (0x1<<1) +-#define TSTORM_ETH_CLIENT_CONFIG_STATSITICS_ENABLE_SHIFT 1 +-#define TSTORM_ETH_CLIENT_CONFIG_ENABLE_SGE_RING (0x1<<2) +-#define TSTORM_ETH_CLIENT_CONFIG_ENABLE_SGE_RING_SHIFT 2 +-#define __TSTORM_ETH_CLIENT_CONFIG_RESERVED0 (0x1FFF<<3) +-#define __TSTORM_ETH_CLIENT_CONFIG_RESERVED0_SHIFT 3 ++#define TSTORM_ETH_CLIENT_CONFIG_VLAN_REM_ENABLE (0x1<<0) ++#define TSTORM_ETH_CLIENT_CONFIG_VLAN_REM_ENABLE_SHIFT 0 ++#define TSTORM_ETH_CLIENT_CONFIG_E1HOV_REM_ENABLE (0x1<<1) ++#define TSTORM_ETH_CLIENT_CONFIG_E1HOV_REM_ENABLE_SHIFT 1 ++#define TSTORM_ETH_CLIENT_CONFIG_STATSITICS_ENABLE (0x1<<2) ++#define TSTORM_ETH_CLIENT_CONFIG_STATSITICS_ENABLE_SHIFT 2 ++#define __TSTORM_ETH_CLIENT_CONFIG_RESERVED1 (0x1FFF<<3) ++#define __TSTORM_ETH_CLIENT_CONFIG_RESERVED1_SHIFT 3 + #elif defined(__LITTLE_ENDIAN) + u16 config_flags; +-#define TSTORM_ETH_CLIENT_CONFIG_VLAN_REMOVAL_ENABLE (0x1<<0) +-#define TSTORM_ETH_CLIENT_CONFIG_VLAN_REMOVAL_ENABLE_SHIFT 0 +-#define TSTORM_ETH_CLIENT_CONFIG_STATSITICS_ENABLE (0x1<<1) +-#define TSTORM_ETH_CLIENT_CONFIG_STATSITICS_ENABLE_SHIFT 1 +-#define TSTORM_ETH_CLIENT_CONFIG_ENABLE_SGE_RING (0x1<<2) +-#define TSTORM_ETH_CLIENT_CONFIG_ENABLE_SGE_RING_SHIFT 2 +-#define __TSTORM_ETH_CLIENT_CONFIG_RESERVED0 (0x1FFF<<3) +-#define __TSTORM_ETH_CLIENT_CONFIG_RESERVED0_SHIFT 3 ++#define TSTORM_ETH_CLIENT_CONFIG_VLAN_REM_ENABLE (0x1<<0) ++#define TSTORM_ETH_CLIENT_CONFIG_VLAN_REM_ENABLE_SHIFT 0 ++#define TSTORM_ETH_CLIENT_CONFIG_E1HOV_REM_ENABLE (0x1<<1) ++#define TSTORM_ETH_CLIENT_CONFIG_E1HOV_REM_ENABLE_SHIFT 1 ++#define TSTORM_ETH_CLIENT_CONFIG_STATSITICS_ENABLE (0x1<<2) ++#define TSTORM_ETH_CLIENT_CONFIG_STATSITICS_ENABLE_SHIFT 2 ++#define __TSTORM_ETH_CLIENT_CONFIG_RESERVED1 (0x1FFF<<3) ++#define __TSTORM_ETH_CLIENT_CONFIG_RESERVED1_SHIFT 3 + u16 drop_flags; + #define TSTORM_ETH_CLIENT_CONFIG_DROP_IP_CS_ERR (0x1<<0) + #define TSTORM_ETH_CLIENT_CONFIG_DROP_IP_CS_ERR_SHIFT 0 +@@ -2571,8 +2808,8 @@ + #define TSTORM_ETH_CLIENT_CONFIG_DROP_TTL0_SHIFT 2 + #define TSTORM_ETH_CLIENT_CONFIG_DROP_UDP_CS_ERR (0x1<<3) + #define TSTORM_ETH_CLIENT_CONFIG_DROP_UDP_CS_ERR_SHIFT 3 +-#define __TSTORM_ETH_CLIENT_CONFIG_RESERVED1 (0xFFF<<4) +-#define __TSTORM_ETH_CLIENT_CONFIG_RESERVED1_SHIFT 4 ++#define __TSTORM_ETH_CLIENT_CONFIG_RESERVED2 (0xFFF<<4) ++#define __TSTORM_ETH_CLIENT_CONFIG_RESERVED2_SHIFT 4 + #endif + }; + +@@ -2594,9 +2831,61 @@ + + + /* ++ * common flag to indicate existance of TPA. ++ */ ++struct tstorm_eth_tpa_exist { ++#if defined(__BIG_ENDIAN) ++ u16 reserved1; ++ u8 reserved0; ++ u8 tpa_exist; ++#elif defined(__LITTLE_ENDIAN) ++ u8 tpa_exist; ++ u8 reserved0; ++ u16 reserved1; ++#endif ++ u32 reserved2; ++}; ++ ++ ++/* ++ * rx rings pause data for E1h only ++ */ ++struct ustorm_eth_rx_pause_data_e1h { ++#if defined(__BIG_ENDIAN) ++ u16 bd_thr_low; ++ u16 cqe_thr_low; ++#elif defined(__LITTLE_ENDIAN) ++ u16 cqe_thr_low; ++ u16 bd_thr_low; ++#endif ++#if defined(__BIG_ENDIAN) ++ u16 cos; ++ u16 sge_thr_low; ++#elif defined(__LITTLE_ENDIAN) ++ u16 sge_thr_low; ++ u16 cos; ++#endif ++#if defined(__BIG_ENDIAN) ++ u16 bd_thr_high; ++ u16 cqe_thr_high; ++#elif defined(__LITTLE_ENDIAN) ++ u16 cqe_thr_high; ++ u16 bd_thr_high; ++#endif ++#if defined(__BIG_ENDIAN) ++ u16 reserved0; ++ u16 sge_thr_high; ++#elif defined(__LITTLE_ENDIAN) ++ u16 sge_thr_high; ++ u16 reserved0; ++#endif ++}; ++ ++ ++/* + * Three RX producers for ETH + */ +-struct tstorm_eth_rx_producers { ++struct ustorm_eth_rx_producers { + #if defined(__BIG_ENDIAN) + u16 bd_prod; + u16 cqe_prod; +@@ -2615,38 +2904,23 @@ + + + /* +- * common flag to indicate existence of TPA. +- */ +-struct tstorm_eth_tpa_exist { +-#if defined(__BIG_ENDIAN) +- u16 reserved1; +- u8 reserved0; +- u8 tpa_exist; +-#elif defined(__LITTLE_ENDIAN) +- u8 tpa_exist; +- u8 reserved0; +- u16 reserved1; +-#endif +- u32 reserved2; +-}; +- +- +-/* + * per-port SAFC demo variables + */ + struct cmng_flags_per_port { + u8 con_number[NUM_OF_PROTOCOLS]; +-#if defined(__BIG_ENDIAN) +- u8 fairness_enable; +- u8 rate_shaping_enable; +- u8 cmng_protocol_enable; +- u8 cmng_vn_enable; +-#elif defined(__LITTLE_ENDIAN) +- u8 cmng_vn_enable; +- u8 cmng_protocol_enable; +- u8 rate_shaping_enable; +- u8 fairness_enable; +-#endif ++ u32 cmng_enables; ++#define CMNG_FLAGS_PER_PORT_FAIRNESS_VN (0x1<<0) ++#define CMNG_FLAGS_PER_PORT_FAIRNESS_VN_SHIFT 0 ++#define CMNG_FLAGS_PER_PORT_RATE_SHAPING_VN (0x1<<1) ++#define CMNG_FLAGS_PER_PORT_RATE_SHAPING_VN_SHIFT 1 ++#define CMNG_FLAGS_PER_PORT_FAIRNESS_PROTOCOL (0x1<<2) ++#define CMNG_FLAGS_PER_PORT_FAIRNESS_PROTOCOL_SHIFT 2 ++#define CMNG_FLAGS_PER_PORT_RATE_SHAPING_PROTOCOL (0x1<<3) ++#define CMNG_FLAGS_PER_PORT_RATE_SHAPING_PROTOCOL_SHIFT 3 ++#define CMNG_FLAGS_PER_PORT_FAIRNESS_COS (0x1<<4) ++#define CMNG_FLAGS_PER_PORT_FAIRNESS_COS_SHIFT 4 ++#define __CMNG_FLAGS_PER_PORT_RESERVED0 (0x7FFFFFF<<5) ++#define __CMNG_FLAGS_PER_PORT_RESERVED0_SHIFT 5 + }; + + +@@ -2657,7 +2931,6 @@ + u32 rs_periodic_timeout; + u32 rs_threshold; + }; +- + + /* + * per-port fairness variables +@@ -2668,23 +2941,21 @@ + u32 fairness_timeout; + }; + +- + /* + * per-port SAFC variables + */ + struct safc_struct_per_port { + #if defined(__BIG_ENDIAN) +- u16 __reserved0; +- u8 cur_cos_types; ++ u16 __reserved1; ++ u8 __reserved0; + u8 safc_timeout_usec; + #elif defined(__LITTLE_ENDIAN) + u8 safc_timeout_usec; +- u8 cur_cos_types; +- u16 __reserved0; ++ u8 __reserved0; ++ u16 __reserved1; + #endif +- u8 cos_to_protocol[MAX_COS_NUMBER]; ++ u16 cos_to_pause_mask[NUM_OF_SAFC_BITS]; + }; +- + + /* + * Per-port congestion management variables +@@ -2698,22 +2969,33 @@ + + + /* ++ * Dynamic host coalescing init parameters ++ */ ++struct dynamic_hc_config { ++ u32 threshold[3]; ++ u8 shift_per_protocol[HC_USTORM_SB_NUM_INDICES]; ++ u8 hc_timeout0[HC_USTORM_SB_NUM_INDICES]; ++ u8 hc_timeout1[HC_USTORM_SB_NUM_INDICES]; ++ u8 hc_timeout2[HC_USTORM_SB_NUM_INDICES]; ++ u8 hc_timeout3[HC_USTORM_SB_NUM_INDICES]; ++}; ++ ++ ++/* + * Protocol-common statistics collected by the Xstorm (per client) + */ + struct xstorm_per_client_stats { +- struct regpair total_sent_bytes; +- u32 total_sent_pkts; +- u32 unicast_pkts_sent; ++ __le32 reserved0; ++ __le32 unicast_pkts_sent; + struct regpair unicast_bytes_sent; + struct regpair multicast_bytes_sent; +- u32 multicast_pkts_sent; +- u32 broadcast_pkts_sent; ++ __le32 multicast_pkts_sent; ++ __le32 broadcast_pkts_sent; + struct regpair broadcast_bytes_sent; +- u16 stats_counter; +- u16 reserved0; +- u32 reserved1; ++ __le16 stats_counter; ++ __le16 reserved1; ++ __le32 reserved2; + }; +- + + /* + * Common statistics collected by the Xstorm (per port) +@@ -2722,38 +3004,33 @@ + struct xstorm_per_client_stats client_statistics[MAX_X_STAT_COUNTER_ID]; + }; + +- + /* + * Protocol-common statistics collected by the Tstorm (per port) + */ + struct tstorm_per_port_stats { +- u32 mac_filter_discard; +- u32 xxoverflow_discard; +- u32 brb_truncate_discard; +- u32 mac_discard; ++ __le32 mac_filter_discard; ++ __le32 xxoverflow_discard; ++ __le32 brb_truncate_discard; ++ __le32 mac_discard; + }; +- + + /* + * Protocol-common statistics collected by the Tstorm (per client) + */ + struct tstorm_per_client_stats { +- struct regpair total_rcv_bytes; + struct regpair rcv_unicast_bytes; + struct regpair rcv_broadcast_bytes; + struct regpair rcv_multicast_bytes; + struct regpair rcv_error_bytes; +- u32 checksum_discard; +- u32 packets_too_big_discard; +- u32 total_rcv_pkts; +- u32 rcv_unicast_pkts; +- u32 rcv_broadcast_pkts; +- u32 rcv_multicast_pkts; +- u32 no_buff_discard; +- u32 ttl0_discard; +- u16 stats_counter; +- u16 reserved0; +- u32 reserved1; ++ __le32 checksum_discard; ++ __le32 packets_too_big_discard; ++ __le32 rcv_unicast_pkts; ++ __le32 rcv_broadcast_pkts; ++ __le32 rcv_multicast_pkts; ++ __le32 no_buff_discard; ++ __le32 ttl0_discard; ++ __le16 stats_counter; ++ __le16 reserved0; + }; + + /* +@@ -2765,11 +3042,33 @@ + }; + + /* ++ * Protocol-common statistics collected by the Ustorm (per client) ++ */ ++struct ustorm_per_client_stats { ++ struct regpair ucast_no_buff_bytes; ++ struct regpair mcast_no_buff_bytes; ++ struct regpair bcast_no_buff_bytes; ++ __le32 ucast_no_buff_pkts; ++ __le32 mcast_no_buff_pkts; ++ __le32 bcast_no_buff_pkts; ++ __le16 stats_counter; ++ __le16 reserved0; ++}; ++ ++/* ++ * Protocol-common statistics collected by the Ustorm ++ */ ++struct ustorm_common_stats { ++ struct ustorm_per_client_stats client_statistics[MAX_U_STAT_COUNTER_ID]; ++}; ++ ++/* + * Eth statistics query structure for the eth_stats_query ramrod + */ + struct eth_stats_query { + struct xstorm_common_stats xstorm_common; + struct tstorm_common_stats tstorm_common; ++ struct ustorm_common_stats ustorm_common; + }; + + +@@ -2777,6 +3076,7 @@ + * per-vnic fairness variables + */ + struct fairness_vars_per_vn { ++ u32 cos_credit_delta[MAX_COS_NUMBER]; + u32 protocol_credit_delta[NUM_OF_PROTOCOLS]; + u32 vn_credit_delta; + u32 __reserved0; +@@ -2788,13 +3088,15 @@ + */ + struct fw_version { + #if defined(__BIG_ENDIAN) +- u16 patch; +- u8 primary; +- u8 client; ++ u8 engineering; ++ u8 revision; ++ u8 minor; ++ u8 major; + #elif defined(__LITTLE_ENDIAN) +- u8 client; +- u8 primary; +- u16 patch; ++ u8 major; ++ u8 minor; ++ u8 revision; ++ u8 engineering; + #endif + u32 flags; + #define FW_VERSION_OPTIMIZED (0x1<<0) +@@ -2812,9 +3114,10 @@ + * FW version stored in first line of pram + */ + struct pram_fw_version { +- u8 client; +- u8 primary; +- u16 patch; ++ u8 major; ++ u8 minor; ++ u8 revision; ++ u8 engineering; + u8 flags; + #define PRAM_FW_VERSION_OPTIMIZED (0x1<<0) + #define PRAM_FW_VERSION_OPTIMIZED_SHIFT 0 +@@ -2826,6 +3129,15 @@ + #define PRAM_FW_VERSION_CHIP_VERSION_SHIFT 4 + #define __PRAM_FW_VERSION_RESERVED0 (0x3<<6) + #define __PRAM_FW_VERSION_RESERVED0_SHIFT 6 ++}; ++ ++ ++/* ++ * The send queue element ++ */ ++struct protocol_common_spe { ++ struct spe_hdr hdr; ++ struct regpair phy_address; + }; + + +diff -r ddb96c0bbe13 drivers/net/bnx2x_init.h +--- a/drivers/net/bnx2x_init.h Tue Jun 16 11:03:28 2009 +0100 ++++ b/drivers/net/bnx2x_init.h Tue Jun 16 13:15:30 2009 +0100 +@@ -1,6 +1,7 @@ + /* bnx2x_init.h: Broadcom Everest network driver. ++ * Structures and macroes needed during the initialization. + * +- * Copyright (c) 2007-2008 Broadcom Corporation ++ * Copyright (c) 2007-2009 Broadcom Corporation + * + * 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 +@@ -8,26 +9,17 @@ + * + * Maintained by: Eilon Greenstein + * Written by: Eliezer Tamir ++ * Modified by: Vladislav Zolotarov + */ + + #ifndef BNX2X_INIT_H + #define BNX2X_INIT_H + +-#define COMMON 0x1 +-#define PORT0 0x2 +-#define PORT1 0x4 +- +-#define INIT_EMULATION 0x1 +-#define INIT_FPGA 0x2 +-#define INIT_ASIC 0x4 +-#define INIT_HARDWARE 0x7 +- +-#define STORM_INTMEM_SIZE_E1 (0x5800 / 4) +-#define STORM_INTMEM_SIZE_E1H (0x10000 / 4) +-#define TSTORM_INTMEM_ADDR 0x1a0000 +-#define CSTORM_INTMEM_ADDR 0x220000 +-#define XSTORM_INTMEM_ADDR 0x2a0000 +-#define USTORM_INTMEM_ADDR 0x320000 ++/* RAM0 size in bytes */ ++#define STORM_INTMEM_SIZE_E1 0x5800 ++#define STORM_INTMEM_SIZE_E1H 0x10000 ++#define STORM_INTMEM_SIZE(bp) ((CHIP_IS_E1(bp) ? STORM_INTMEM_SIZE_E1 : \ ++ STORM_INTMEM_SIZE_E1H) / 4) + + + /* Init operation types and structures */ +@@ -42,33 +34,74 @@ + #define OP_WR_64 0x8 /* write 64 bit pattern */ + #define OP_WB 0x9 /* copy a string using DMAE */ + +-/* Operation specific for E1 */ +-#define OP_RD_E1 0xa /* read single register */ +-#define OP_WR_E1 0xb /* write single register */ +-#define OP_IW_E1 0xc /* write single register using mailbox */ +-#define OP_SW_E1 0xd /* copy a string to the device */ +-#define OP_SI_E1 0xe /* copy a string using mailbox */ +-#define OP_ZR_E1 0xf /* clear memory */ +-#define OP_ZP_E1 0x10 /* unzip then copy with DMAE */ +-#define OP_WR_64_E1 0x11 /* write 64 bit pattern on E1 */ +-#define OP_WB_E1 0x12 /* copy a string using DMAE */ ++/* FPGA and EMUL specific operations */ ++#define OP_WR_EMUL 0xa /* write single register on Emulation */ ++#define OP_WR_FPGA 0xb /* write single register on FPGA */ ++#define OP_WR_ASIC 0xc /* write single register on ASIC */ + +-/* Operation specific for E1H */ +-#define OP_RD_E1H 0x13 /* read single register */ +-#define OP_WR_E1H 0x14 /* write single register */ +-#define OP_IW_E1H 0x15 /* write single register using mailbox */ +-#define OP_SW_E1H 0x16 /* copy a string to the device */ +-#define OP_SI_E1H 0x17 /* copy a string using mailbox */ +-#define OP_ZR_E1H 0x18 /* clear memory */ +-#define OP_ZP_E1H 0x19 /* unzip then copy with DMAE */ +-#define OP_WR_64_E1H 0x1a /* write 64 bit pattern on E1H */ +-#define OP_WB_E1H 0x1b /* copy a string using DMAE */ ++/* Init stages */ ++/* Never reorder stages !!! */ ++#define COMMON_STAGE 0 ++#define PORT0_STAGE 1 ++#define PORT1_STAGE 2 ++#define FUNC0_STAGE 3 ++#define FUNC1_STAGE 4 ++#define FUNC2_STAGE 5 ++#define FUNC3_STAGE 6 ++#define FUNC4_STAGE 7 ++#define FUNC5_STAGE 8 ++#define FUNC6_STAGE 9 ++#define FUNC7_STAGE 10 ++#define STAGE_IDX_MAX 11 + +-/* FPGA and EMUL specific operations */ +-#define OP_WR_EMUL_E1H 0x1c /* write single register on E1H Emul */ +-#define OP_WR_EMUL 0x1d /* write single register on Emulation */ +-#define OP_WR_FPGA 0x1e /* write single register on FPGA */ +-#define OP_WR_ASIC 0x1f /* write single register on ASIC */ ++#define STAGE_START 0 ++#define STAGE_END 1 ++ ++ ++/* Indices of blocks */ ++#define PRS_BLOCK 0 ++#define SRCH_BLOCK 1 ++#define TSDM_BLOCK 2 ++#define TCM_BLOCK 3 ++#define BRB1_BLOCK 4 ++#define TSEM_BLOCK 5 ++#define PXPCS_BLOCK 6 ++#define EMAC0_BLOCK 7 ++#define EMAC1_BLOCK 8 ++#define DBU_BLOCK 9 ++#define MISC_BLOCK 10 ++#define DBG_BLOCK 11 ++#define NIG_BLOCK 12 ++#define MCP_BLOCK 13 ++#define UPB_BLOCK 14 ++#define CSDM_BLOCK 15 ++#define USDM_BLOCK 16 ++#define CCM_BLOCK 17 ++#define UCM_BLOCK 18 ++#define USEM_BLOCK 19 ++#define CSEM_BLOCK 20 ++#define XPB_BLOCK 21 ++#define DQ_BLOCK 22 ++#define TIMERS_BLOCK 23 ++#define XSDM_BLOCK 24 ++#define QM_BLOCK 25 ++#define PBF_BLOCK 26 ++#define XCM_BLOCK 27 ++#define XSEM_BLOCK 28 ++#define CDU_BLOCK 29 ++#define DMAE_BLOCK 30 ++#define PXP_BLOCK 31 ++#define CFC_BLOCK 32 ++#define HC_BLOCK 33 ++#define PXP2_BLOCK 34 ++#define MISC_AEU_BLOCK 35 ++#define PGLUE_B_BLOCK 36 ++#define IGU_BLOCK 37 ++ ++ ++/* Returns the index of start or end of a specific block stage in ops array*/ ++#define BLOCK_OPS_IDX(block, stage, end) \ ++ (2*(((block)*STAGE_IDX_MAX) + (stage)) + (end)) + + + struct raw_op { +@@ -115,698 +148,5 @@ + struct raw_op raw; + }; + +-#include "bnx2x_init_values.h" +- +-static void bnx2x_reg_wr_ind(struct bnx2x *bp, u32 addr, u32 val); +-static int bnx2x_gunzip(struct bnx2x *bp, u8 *zbuf, int len); +- +-static void bnx2x_init_str_wr(struct bnx2x *bp, u32 addr, const u32 *data, +- u32 len) +-{ +- int i; +- +- for (i = 0; i < len; i++) { +- REG_WR(bp, addr + i*4, data[i]); +- if (!(i % 10000)) { +- touch_softlockup_watchdog(); +- cpu_relax(); +- } +- } +-} +- +-static void bnx2x_init_ind_wr(struct bnx2x *bp, u32 addr, const u32 *data, +- u16 len) +-{ +- int i; +- +- for (i = 0; i < len; i++) { +- REG_WR_IND(bp, addr + i*4, data[i]); +- if (!(i % 10000)) { +- touch_softlockup_watchdog(); +- cpu_relax(); +- } +- } +-} +- +-static void bnx2x_write_big_buf(struct bnx2x *bp, u32 addr, u32 len) +-{ +-#ifdef USE_DMAE +- int offset = 0; +- +- if (bp->dmae_ready) { +- while (len > DMAE_LEN32_WR_MAX) { +- bnx2x_write_dmae(bp, bp->gunzip_mapping + offset, +- addr + offset, DMAE_LEN32_WR_MAX); +- offset += DMAE_LEN32_WR_MAX * 4; +- len -= DMAE_LEN32_WR_MAX; +- } +- bnx2x_write_dmae(bp, bp->gunzip_mapping + offset, +- addr + offset, len); +- } else +- bnx2x_init_str_wr(bp, addr, bp->gunzip_buf, len); +-#else +- bnx2x_init_str_wr(bp, addr, bp->gunzip_buf, len); +-#endif +-} +- +-static void bnx2x_init_fill(struct bnx2x *bp, u32 addr, int fill, u32 len) +-{ +- if ((len * 4) > FW_BUF_SIZE) { +- BNX2X_ERR("LARGE DMAE OPERATION ! addr 0x%x len 0x%x\n", +- addr, len*4); +- return; +- } +- memset(bp->gunzip_buf, fill, len * 4); +- +- bnx2x_write_big_buf(bp, addr, len); +-} +- +-static void bnx2x_init_wr_64(struct bnx2x *bp, u32 addr, const u32 *data, +- u32 len64) +-{ +- u32 buf_len32 = FW_BUF_SIZE/4; +- u32 len = len64*2; +- u64 data64 = 0; +- int i; +- +- /* 64 bit value is in a blob: first low DWORD, then high DWORD */ +- data64 = HILO_U64((*(data + 1)), (*data)); +- len64 = min((u32)(FW_BUF_SIZE/8), len64); +- for (i = 0; i < len64; i++) { +- u64 *pdata = ((u64 *)(bp->gunzip_buf)) + i; +- +- *pdata = data64; +- } +- +- for (i = 0; i < len; i += buf_len32) { +- u32 cur_len = min(buf_len32, len - i); +- +- bnx2x_write_big_buf(bp, addr + i * 4, cur_len); +- } +-} +- +-/********************************************************* +- There are different blobs for each PRAM section. +- In addition, each blob write operation is divided into a few operations +- in order to decrease the amount of phys. contiguous buffer needed. +- Thus, when we select a blob the address may be with some offset +- from the beginning of PRAM section. +- The same holds for the INT_TABLE sections. +-**********************************************************/ +-#define IF_IS_INT_TABLE_ADDR(base, addr) \ +- if (((base) <= (addr)) && ((base) + 0x400 >= (addr))) +- +-#define IF_IS_PRAM_ADDR(base, addr) \ +- if (((base) <= (addr)) && ((base) + 0x40000 >= (addr))) +- +-static const u32 *bnx2x_sel_blob(u32 addr, const u32 *data, int is_e1) +-{ +- IF_IS_INT_TABLE_ADDR(TSEM_REG_INT_TABLE, addr) +- data = is_e1 ? tsem_int_table_data_e1 : +- tsem_int_table_data_e1h; +- else +- IF_IS_INT_TABLE_ADDR(CSEM_REG_INT_TABLE, addr) +- data = is_e1 ? csem_int_table_data_e1 : +- csem_int_table_data_e1h; +- else +- IF_IS_INT_TABLE_ADDR(USEM_REG_INT_TABLE, addr) +- data = is_e1 ? usem_int_table_data_e1 : +- usem_int_table_data_e1h; +- else +- IF_IS_INT_TABLE_ADDR(XSEM_REG_INT_TABLE, addr) +- data = is_e1 ? xsem_int_table_data_e1 : +- xsem_int_table_data_e1h; +- else +- IF_IS_PRAM_ADDR(TSEM_REG_PRAM, addr) +- data = is_e1 ? tsem_pram_data_e1 : tsem_pram_data_e1h; +- else +- IF_IS_PRAM_ADDR(CSEM_REG_PRAM, addr) +- data = is_e1 ? csem_pram_data_e1 : csem_pram_data_e1h; +- else +- IF_IS_PRAM_ADDR(USEM_REG_PRAM, addr) +- data = is_e1 ? usem_pram_data_e1 : usem_pram_data_e1h; +- else +- IF_IS_PRAM_ADDR(XSEM_REG_PRAM, addr) +- data = is_e1 ? xsem_pram_data_e1 : xsem_pram_data_e1h; +- +- return data; +-} +- +-static void bnx2x_init_wr_wb(struct bnx2x *bp, u32 addr, const u32 *data, +- u32 len, int gunzip, int is_e1, u32 blob_off) +-{ +- int offset = 0; +- +- data = bnx2x_sel_blob(addr, data, is_e1) + blob_off; +- +- if (gunzip) { +- int rc; +-#ifdef __BIG_ENDIAN +- int i, size; +- u32 *temp; +- +- temp = kmalloc(len, GFP_KERNEL); +- size = (len / 4) + ((len % 4) ? 1 : 0); +- for (i = 0; i < size; i++) +- temp[i] = swab32(data[i]); +- data = temp; +-#endif +- rc = bnx2x_gunzip(bp, (u8 *)data, len); +- if (rc) { +- BNX2X_ERR("gunzip failed ! rc %d\n", rc); +- return; +- } +- len = bp->gunzip_outlen; +-#ifdef __BIG_ENDIAN +- kfree(temp); +- for (i = 0; i < len; i++) +- ((u32 *)bp->gunzip_buf)[i] = +- swab32(((u32 *)bp->gunzip_buf)[i]); +-#endif +- } else { +- if ((len * 4) > FW_BUF_SIZE) { +- BNX2X_ERR("LARGE DMAE OPERATION ! " +- "addr 0x%x len 0x%x\n", addr, len*4); +- return; +- } +- memcpy(bp->gunzip_buf, data, len * 4); +- } +- +- if (bp->dmae_ready) { +- while (len > DMAE_LEN32_WR_MAX) { +- bnx2x_write_dmae(bp, bp->gunzip_mapping + offset, +- addr + offset, DMAE_LEN32_WR_MAX); +- offset += DMAE_LEN32_WR_MAX * 4; +- len -= DMAE_LEN32_WR_MAX; +- } +- bnx2x_write_dmae(bp, bp->gunzip_mapping + offset, +- addr + offset, len); +- } else +- bnx2x_init_ind_wr(bp, addr, bp->gunzip_buf, len); +-} +- +-static void bnx2x_init_block(struct bnx2x *bp, u32 op_start, u32 op_end) +-{ +- int is_e1 = CHIP_IS_E1(bp); +- int is_e1h = CHIP_IS_E1H(bp); +- int is_emul_e1h = (CHIP_REV_IS_EMUL(bp) && is_e1h); +- int hw_wr, i; +- union init_op *op; +- u32 op_type, addr, len; +- const u32 *data, *data_base; +- +- if (CHIP_REV_IS_FPGA(bp)) +- hw_wr = OP_WR_FPGA; +- else if (CHIP_REV_IS_EMUL(bp)) +- hw_wr = OP_WR_EMUL; +- else +- hw_wr = OP_WR_ASIC; +- +- if (is_e1) +- data_base = init_data_e1; +- else /* CHIP_IS_E1H(bp) */ +- data_base = init_data_e1h; +- +- for (i = op_start; i < op_end; i++) { +- +- op = (union init_op *)&(init_ops[i]); +- +- op_type = op->str_wr.op; +- addr = op->str_wr.offset; +- len = op->str_wr.data_len; +- data = data_base + op->str_wr.data_off; +- +- /* careful! it must be in order */ +- if (unlikely(op_type > OP_WB)) { +- +- /* If E1 only */ +- if (op_type <= OP_WB_E1) { +- if (is_e1) +- op_type -= (OP_RD_E1 - OP_RD); +- +- /* If E1H only */ +- } else if (op_type <= OP_WB_E1H) { +- if (is_e1h) +- op_type -= (OP_RD_E1H - OP_RD); +- } +- +- /* HW/EMUL specific */ +- if (op_type == hw_wr) +- op_type = OP_WR; +- +- /* EMUL on E1H is special */ +- if ((op_type == OP_WR_EMUL_E1H) && is_emul_e1h) +- op_type = OP_WR; +- } +- +- switch (op_type) { +- case OP_RD: +- REG_RD(bp, addr); +- break; +- case OP_WR: +- REG_WR(bp, addr, op->write.val); +- break; +- case OP_SW: +- bnx2x_init_str_wr(bp, addr, data, len); +- break; +- case OP_WB: +- bnx2x_init_wr_wb(bp, addr, data, len, 0, is_e1, 0); +- break; +- case OP_SI: +- bnx2x_init_ind_wr(bp, addr, data, len); +- break; +- case OP_ZR: +- bnx2x_init_fill(bp, addr, 0, op->zero.len); +- break; +- case OP_ZP: +- bnx2x_init_wr_wb(bp, addr, data, len, 1, is_e1, +- op->str_wr.data_off); +- break; +- case OP_WR_64: +- bnx2x_init_wr_64(bp, addr, data, len); +- break; +- default: +- /* happens whenever an op is of a diff HW */ +-#if 0 +- DP(NETIF_MSG_HW, "skipping init operation " +- "index %d[%d:%d]: type %d addr 0x%x " +- "len %d(0x%x)\n", +- i, op_start, op_end, op_type, addr, len, len); +-#endif +- break; +- } +- } +-} +- +- +-/**************************************************************************** +-* PXP +-****************************************************************************/ +-/* +- * This code configures the PCI read/write arbiter +- * which implements a weighted round robin +- * between the virtual queues in the chip. +- * +- * The values were derived for each PCI max payload and max request size. +- * since max payload and max request size are only known at run time, +- * this is done as a separate init stage. +- */ +- +-#define NUM_WR_Q 13 +-#define NUM_RD_Q 29 +-#define MAX_RD_ORD 3 +-#define MAX_WR_ORD 2 +- +-/* configuration for one arbiter queue */ +-struct arb_line { +- int l; +- int add; +- int ubound; +-}; +- +-/* derived configuration for each read queue for each max request size */ +-static const struct arb_line read_arb_data[NUM_RD_Q][MAX_RD_ORD + 1] = { +- {{8 , 64 , 25}, {16 , 64 , 25}, {32 , 64 , 25}, {64 , 64 , 41} }, +- {{4 , 8 , 4}, {4 , 8 , 4}, {4 , 8 , 4}, {4 , 8 , 4} }, +- {{4 , 3 , 3}, {4 , 3 , 3}, {4 , 3 , 3}, {4 , 3 , 3} }, +- {{8 , 3 , 6}, {16 , 3 , 11}, {16 , 3 , 11}, {16 , 3 , 11} }, +- {{8 , 64 , 25}, {16 , 64 , 25}, {32 , 64 , 25}, {64 , 64 , 41} }, +- {{8 , 3 , 6}, {16 , 3 , 11}, {32 , 3 , 21}, {64 , 3 , 41} }, +- {{8 , 3 , 6}, {16 , 3 , 11}, {32 , 3 , 21}, {64 , 3 , 41} }, +- {{8 , 3 , 6}, {16 , 3 , 11}, {32 , 3 , 21}, {64 , 3 , 41} }, +- {{8 , 3 , 6}, {16 , 3 , 11}, {32 , 3 , 21}, {64 , 3 , 41} }, +- {{8 , 3 , 6}, {16 , 3 , 11}, {32 , 3 , 21}, {32 , 3 , 21} }, +- {{8 , 3 , 6}, {16 , 3 , 11}, {32 , 3 , 21}, {32 , 3 , 21} }, +- {{8 , 3 , 6}, {16 , 3 , 11}, {32 , 3 , 21}, {32 , 3 , 21} }, +- {{8 , 3 , 6}, {16 , 3 , 11}, {32 , 3 , 21}, {32 , 3 , 21} }, +- {{8 , 3 , 6}, {16 , 3 , 11}, {32 , 3 , 21}, {32 , 3 , 21} }, +- {{8 , 3 , 6}, {16 , 3 , 11}, {32 , 3 , 21}, {32 , 3 , 21} }, +- {{8 , 3 , 6}, {16 , 3 , 11}, {32 , 3 , 21}, {32 , 3 , 21} }, +- {{8 , 3 , 6}, {16 , 3 , 11}, {32 , 3 , 21}, {32 , 3 , 21} }, +- {{8 , 3 , 6}, {16 , 3 , 11}, {32 , 3 , 21}, {32 , 3 , 21} }, +- {{8 , 3 , 6}, {16 , 3 , 11}, {32 , 3 , 21}, {32 , 3 , 21} }, +- {{8 , 3 , 6}, {16 , 3 , 11}, {32 , 3 , 21}, {32 , 3 , 21} }, +- {{8 , 3 , 6}, {16 , 3 , 11}, {32 , 3 , 21}, {32 , 3 , 21} }, +- {{8 , 3 , 6}, {16 , 3 , 11}, {32 , 3 , 21}, {32 , 3 , 21} }, +- {{8 , 3 , 6}, {16 , 3 , 11}, {32 , 3 , 21}, {32 , 3 , 21} }, +- {{8 , 3 , 6}, {16 , 3 , 11}, {32 , 3 , 21}, {32 , 3 , 21} }, +- {{8 , 3 , 6}, {16 , 3 , 11}, {32 , 3 , 21}, {32 , 3 , 21} }, +- {{8 , 3 , 6}, {16 , 3 , 11}, {32 , 3 , 21}, {32 , 3 , 21} }, +- {{8 , 3 , 6}, {16 , 3 , 11}, {32 , 3 , 21}, {32 , 3 , 21} }, +- {{8 , 3 , 6}, {16 , 3 , 11}, {32 , 3 , 21}, {32 , 3 , 21} }, +- {{8 , 64 , 25}, {16 , 64 , 41}, {32 , 64 , 81}, {64 , 64 , 120} } +-}; +- +-/* derived configuration for each write queue for each max request size */ +-static const struct arb_line write_arb_data[NUM_WR_Q][MAX_WR_ORD + 1] = { +- {{4 , 6 , 3}, {4 , 6 , 3}, {4 , 6 , 3} }, +- {{4 , 2 , 3}, {4 , 2 , 3}, {4 , 2 , 3} }, +- {{8 , 2 , 6}, {16 , 2 , 11}, {16 , 2 , 11} }, +- {{8 , 2 , 6}, {16 , 2 , 11}, {32 , 2 , 21} }, +- {{8 , 2 , 6}, {16 , 2 , 11}, {32 , 2 , 21} }, +- {{8 , 2 , 6}, {16 , 2 , 11}, {32 , 2 , 21} }, +- {{8 , 64 , 25}, {16 , 64 , 25}, {32 , 64 , 25} }, +- {{8 , 2 , 6}, {16 , 2 , 11}, {16 , 2 , 11} }, +- {{8 , 2 , 6}, {16 , 2 , 11}, {16 , 2 , 11} }, +- {{8 , 9 , 6}, {16 , 9 , 11}, {32 , 9 , 21} }, +- {{8 , 47 , 19}, {16 , 47 , 19}, {32 , 47 , 21} }, +- {{8 , 9 , 6}, {16 , 9 , 11}, {16 , 9 , 11} }, +- {{8 , 64 , 25}, {16 , 64 , 41}, {32 , 64 , 81} } +-}; +- +-/* register addresses for read queues */ +-static const struct arb_line read_arb_addr[NUM_RD_Q-1] = { +- {PXP2_REG_RQ_BW_RD_L0, PXP2_REG_RQ_BW_RD_ADD0, +- PXP2_REG_RQ_BW_RD_UBOUND0}, +- {PXP2_REG_PSWRQ_BW_L1, PXP2_REG_PSWRQ_BW_ADD1, +- PXP2_REG_PSWRQ_BW_UB1}, +- {PXP2_REG_PSWRQ_BW_L2, PXP2_REG_PSWRQ_BW_ADD2, +- PXP2_REG_PSWRQ_BW_UB2}, +- {PXP2_REG_PSWRQ_BW_L3, PXP2_REG_PSWRQ_BW_ADD3, +- PXP2_REG_PSWRQ_BW_UB3}, +- {PXP2_REG_RQ_BW_RD_L4, PXP2_REG_RQ_BW_RD_ADD4, +- PXP2_REG_RQ_BW_RD_UBOUND4}, +- {PXP2_REG_RQ_BW_RD_L5, PXP2_REG_RQ_BW_RD_ADD5, +- PXP2_REG_RQ_BW_RD_UBOUND5}, +- {PXP2_REG_PSWRQ_BW_L6, PXP2_REG_PSWRQ_BW_ADD6, +- PXP2_REG_PSWRQ_BW_UB6}, +- {PXP2_REG_PSWRQ_BW_L7, PXP2_REG_PSWRQ_BW_ADD7, +- PXP2_REG_PSWRQ_BW_UB7}, +- {PXP2_REG_PSWRQ_BW_L8, PXP2_REG_PSWRQ_BW_ADD8, +- PXP2_REG_PSWRQ_BW_UB8}, +- {PXP2_REG_PSWRQ_BW_L9, PXP2_REG_PSWRQ_BW_ADD9, +- PXP2_REG_PSWRQ_BW_UB9}, +- {PXP2_REG_PSWRQ_BW_L10, PXP2_REG_PSWRQ_BW_ADD10, +- PXP2_REG_PSWRQ_BW_UB10}, +- {PXP2_REG_PSWRQ_BW_L11, PXP2_REG_PSWRQ_BW_ADD11, +- PXP2_REG_PSWRQ_BW_UB11}, +- {PXP2_REG_RQ_BW_RD_L12, PXP2_REG_RQ_BW_RD_ADD12, +- PXP2_REG_RQ_BW_RD_UBOUND12}, +- {PXP2_REG_RQ_BW_RD_L13, PXP2_REG_RQ_BW_RD_ADD13, +- PXP2_REG_RQ_BW_RD_UBOUND13}, +- {PXP2_REG_RQ_BW_RD_L14, PXP2_REG_RQ_BW_RD_ADD14, +- PXP2_REG_RQ_BW_RD_UBOUND14}, +- {PXP2_REG_RQ_BW_RD_L15, PXP2_REG_RQ_BW_RD_ADD15, +- PXP2_REG_RQ_BW_RD_UBOUND15}, +- {PXP2_REG_RQ_BW_RD_L16, PXP2_REG_RQ_BW_RD_ADD16, +- PXP2_REG_RQ_BW_RD_UBOUND16}, +- {PXP2_REG_RQ_BW_RD_L17, PXP2_REG_RQ_BW_RD_ADD17, +- PXP2_REG_RQ_BW_RD_UBOUND17}, +- {PXP2_REG_RQ_BW_RD_L18, PXP2_REG_RQ_BW_RD_ADD18, +- PXP2_REG_RQ_BW_RD_UBOUND18}, +- {PXP2_REG_RQ_BW_RD_L19, PXP2_REG_RQ_BW_RD_ADD19, +- PXP2_REG_RQ_BW_RD_UBOUND19}, +- {PXP2_REG_RQ_BW_RD_L20, PXP2_REG_RQ_BW_RD_ADD20, +- PXP2_REG_RQ_BW_RD_UBOUND20}, +- {PXP2_REG_RQ_BW_RD_L22, PXP2_REG_RQ_BW_RD_ADD22, +- PXP2_REG_RQ_BW_RD_UBOUND22}, +- {PXP2_REG_RQ_BW_RD_L23, PXP2_REG_RQ_BW_RD_ADD23, +- PXP2_REG_RQ_BW_RD_UBOUND23}, +- {PXP2_REG_RQ_BW_RD_L24, PXP2_REG_RQ_BW_RD_ADD24, +- PXP2_REG_RQ_BW_RD_UBOUND24}, +- {PXP2_REG_RQ_BW_RD_L25, PXP2_REG_RQ_BW_RD_ADD25, +- PXP2_REG_RQ_BW_RD_UBOUND25}, +- {PXP2_REG_RQ_BW_RD_L26, PXP2_REG_RQ_BW_RD_ADD26, +- PXP2_REG_RQ_BW_RD_UBOUND26}, +- {PXP2_REG_RQ_BW_RD_L27, PXP2_REG_RQ_BW_RD_ADD27, +- PXP2_REG_RQ_BW_RD_UBOUND27}, +- {PXP2_REG_PSWRQ_BW_L28, PXP2_REG_PSWRQ_BW_ADD28, +- PXP2_REG_PSWRQ_BW_UB28} +-}; +- +-/* register addresses for write queues */ +-static const struct arb_line write_arb_addr[NUM_WR_Q-1] = { +- {PXP2_REG_PSWRQ_BW_L1, PXP2_REG_PSWRQ_BW_ADD1, +- PXP2_REG_PSWRQ_BW_UB1}, +- {PXP2_REG_PSWRQ_BW_L2, PXP2_REG_PSWRQ_BW_ADD2, +- PXP2_REG_PSWRQ_BW_UB2}, +- {PXP2_REG_PSWRQ_BW_L3, PXP2_REG_PSWRQ_BW_ADD3, +- PXP2_REG_PSWRQ_BW_UB3}, +- {PXP2_REG_PSWRQ_BW_L6, PXP2_REG_PSWRQ_BW_ADD6, +- PXP2_REG_PSWRQ_BW_UB6}, +- {PXP2_REG_PSWRQ_BW_L7, PXP2_REG_PSWRQ_BW_ADD7, +- PXP2_REG_PSWRQ_BW_UB7}, +- {PXP2_REG_PSWRQ_BW_L8, PXP2_REG_PSWRQ_BW_ADD8, +- PXP2_REG_PSWRQ_BW_UB8}, +- {PXP2_REG_PSWRQ_BW_L9, PXP2_REG_PSWRQ_BW_ADD9, +- PXP2_REG_PSWRQ_BW_UB9}, +- {PXP2_REG_PSWRQ_BW_L10, PXP2_REG_PSWRQ_BW_ADD10, +- PXP2_REG_PSWRQ_BW_UB10}, +- {PXP2_REG_PSWRQ_BW_L11, PXP2_REG_PSWRQ_BW_ADD11, +- PXP2_REG_PSWRQ_BW_UB11}, +- {PXP2_REG_PSWRQ_BW_L28, PXP2_REG_PSWRQ_BW_ADD28, +- PXP2_REG_PSWRQ_BW_UB28}, +- {PXP2_REG_RQ_BW_WR_L29, PXP2_REG_RQ_BW_WR_ADD29, +- PXP2_REG_RQ_BW_WR_UBOUND29}, +- {PXP2_REG_RQ_BW_WR_L30, PXP2_REG_RQ_BW_WR_ADD30, +- PXP2_REG_RQ_BW_WR_UBOUND30} +-}; +- +-static void bnx2x_init_pxp(struct bnx2x *bp) +-{ +- u16 devctl; +- int r_order, w_order; +- u32 val, i; +- +- pci_read_config_word(bp->pdev, +- bp->pcie_cap + PCI_EXP_DEVCTL, &devctl); +- DP(NETIF_MSG_HW, "read 0x%x from devctl\n", devctl); +- w_order = ((devctl & PCI_EXP_DEVCTL_PAYLOAD) >> 5); +- r_order = ((devctl & PCI_EXP_DEVCTL_READRQ) >> 12); +- +- if (r_order > MAX_RD_ORD) { +- DP(NETIF_MSG_HW, "read order of %d order adjusted to %d\n", +- r_order, MAX_RD_ORD); +- r_order = MAX_RD_ORD; +- } +- if (w_order > MAX_WR_ORD) { +- DP(NETIF_MSG_HW, "write order of %d order adjusted to %d\n", +- w_order, MAX_WR_ORD); +- w_order = MAX_WR_ORD; +- } +- if (CHIP_REV_IS_FPGA(bp)) { +- DP(NETIF_MSG_HW, "write order adjusted to 1 for FPGA\n"); +- w_order = 0; +- } +- DP(NETIF_MSG_HW, "read order %d write order %d\n", r_order, w_order); +- +- for (i = 0; i < NUM_RD_Q-1; i++) { +- REG_WR(bp, read_arb_addr[i].l, read_arb_data[i][r_order].l); +- REG_WR(bp, read_arb_addr[i].add, +- read_arb_data[i][r_order].add); +- REG_WR(bp, read_arb_addr[i].ubound, +- read_arb_data[i][r_order].ubound); +- } +- +- for (i = 0; i < NUM_WR_Q-1; i++) { +- if ((write_arb_addr[i].l == PXP2_REG_RQ_BW_WR_L29) || +- (write_arb_addr[i].l == PXP2_REG_RQ_BW_WR_L30)) { +- +- REG_WR(bp, write_arb_addr[i].l, +- write_arb_data[i][w_order].l); +- +- REG_WR(bp, write_arb_addr[i].add, +- write_arb_data[i][w_order].add); +- +- REG_WR(bp, write_arb_addr[i].ubound, +- write_arb_data[i][w_order].ubound); +- } else { +- +- val = REG_RD(bp, write_arb_addr[i].l); +- REG_WR(bp, write_arb_addr[i].l, +- val | (write_arb_data[i][w_order].l << 10)); +- +- val = REG_RD(bp, write_arb_addr[i].add); +- REG_WR(bp, write_arb_addr[i].add, +- val | (write_arb_data[i][w_order].add << 10)); +- +- val = REG_RD(bp, write_arb_addr[i].ubound); +- REG_WR(bp, write_arb_addr[i].ubound, +- val | (write_arb_data[i][w_order].ubound << 7)); +- } +- } +- +- val = write_arb_data[NUM_WR_Q-1][w_order].add; +- val += write_arb_data[NUM_WR_Q-1][w_order].ubound << 10; +- val += write_arb_data[NUM_WR_Q-1][w_order].l << 17; +- REG_WR(bp, PXP2_REG_PSWRQ_BW_RD, val); +- +- val = read_arb_data[NUM_RD_Q-1][r_order].add; +- val += read_arb_data[NUM_RD_Q-1][r_order].ubound << 10; +- val += read_arb_data[NUM_RD_Q-1][r_order].l << 17; +- REG_WR(bp, PXP2_REG_PSWRQ_BW_WR, val); +- +- REG_WR(bp, PXP2_REG_RQ_WR_MBS0, w_order); +- REG_WR(bp, PXP2_REG_RQ_WR_MBS1, w_order); +- REG_WR(bp, PXP2_REG_RQ_RD_MBS0, r_order); +- REG_WR(bp, PXP2_REG_RQ_RD_MBS1, r_order); +- +- if (r_order == MAX_RD_ORD) +- REG_WR(bp, PXP2_REG_RQ_PDR_LIMIT, 0xe00); +- +- REG_WR(bp, PXP2_REG_WR_USDMDP_TH, (0x18 << w_order)); +- +- if (CHIP_IS_E1H(bp)) { +- REG_WR(bp, PXP2_REG_WR_HC_MPS, w_order+1); +- REG_WR(bp, PXP2_REG_WR_USDM_MPS, w_order+1); +- REG_WR(bp, PXP2_REG_WR_CSDM_MPS, w_order+1); +- REG_WR(bp, PXP2_REG_WR_TSDM_MPS, w_order+1); +- REG_WR(bp, PXP2_REG_WR_XSDM_MPS, w_order+1); +- REG_WR(bp, PXP2_REG_WR_QM_MPS, w_order+1); +- REG_WR(bp, PXP2_REG_WR_TM_MPS, w_order+1); +- REG_WR(bp, PXP2_REG_WR_SRC_MPS, w_order+1); +- REG_WR(bp, PXP2_REG_WR_DBG_MPS, w_order+1); +- REG_WR(bp, PXP2_REG_WR_DMAE_MPS, 2); /* DMAE is special */ +- REG_WR(bp, PXP2_REG_WR_CDU_MPS, w_order+1); +- } +-} +- +- +-/**************************************************************************** +-* CDU +-****************************************************************************/ +- +-#define CDU_REGION_NUMBER_XCM_AG 2 +-#define CDU_REGION_NUMBER_UCM_AG 4 +- +-/** +- * String-to-compress [31:8] = CID (all 24 bits) +- * String-to-compress [7:4] = Region +- * String-to-compress [3:0] = Type +- */ +-#define CDU_VALID_DATA(_cid, _region, _type) \ +- (((_cid) << 8) | (((_region) & 0xf) << 4) | (((_type) & 0xf))) +-#define CDU_CRC8(_cid, _region, _type) \ +- calc_crc8(CDU_VALID_DATA(_cid, _region, _type), 0xff) +-#define CDU_RSRVD_VALUE_TYPE_A(_cid, _region, _type) \ +- (0x80 | (CDU_CRC8(_cid, _region, _type) & 0x7f)) +-#define CDU_RSRVD_VALUE_TYPE_B(_crc, _type) \ +- (0x80 | ((_type) & 0xf << 3) | (CDU_CRC8(_cid, _region, _type) & 0x7)) +-#define CDU_RSRVD_INVALIDATE_CONTEXT_VALUE(_val) ((_val) & ~0x80) +- +-/***************************************************************************** +- * Description: +- * Calculates crc 8 on a word value: polynomial 0-1-2-8 +- * Code was translated from Verilog. +- ****************************************************************************/ +-static u8 calc_crc8(u32 data, u8 crc) +-{ +- u8 D[32]; +- u8 NewCRC[8]; +- u8 C[8]; +- u8 crc_res; +- u8 i; +- +- /* split the data into 31 bits */ +- for (i = 0; i < 32; i++) { +- D[i] = data & 1; +- data = data >> 1; +- } +- +- /* split the crc into 8 bits */ +- for (i = 0; i < 8; i++) { +- C[i] = crc & 1; +- crc = crc >> 1; +- } +- +- NewCRC[0] = D[31] ^ D[30] ^ D[28] ^ D[23] ^ D[21] ^ D[19] ^ D[18] ^ +- D[16] ^ D[14] ^ D[12] ^ D[8] ^ D[7] ^ D[6] ^ D[0] ^ C[4] ^ +- C[6] ^ C[7]; +- NewCRC[1] = D[30] ^ D[29] ^ D[28] ^ D[24] ^ D[23] ^ D[22] ^ D[21] ^ +- D[20] ^ D[18] ^ D[17] ^ D[16] ^ D[15] ^ D[14] ^ D[13] ^ +- D[12] ^ D[9] ^ D[6] ^ D[1] ^ D[0] ^ C[0] ^ C[4] ^ C[5] ^ C[6]; +- NewCRC[2] = D[29] ^ D[28] ^ D[25] ^ D[24] ^ D[22] ^ D[17] ^ D[15] ^ +- D[13] ^ D[12] ^ D[10] ^ D[8] ^ D[6] ^ D[2] ^ D[1] ^ D[0] ^ +- C[0] ^ C[1] ^ C[4] ^ C[5]; +- NewCRC[3] = D[30] ^ D[29] ^ D[26] ^ D[25] ^ D[23] ^ D[18] ^ D[16] ^ +- D[14] ^ D[13] ^ D[11] ^ D[9] ^ D[7] ^ D[3] ^ D[2] ^ D[1] ^ +- C[1] ^ C[2] ^ C[5] ^ C[6]; +- NewCRC[4] = D[31] ^ D[30] ^ D[27] ^ D[26] ^ D[24] ^ D[19] ^ D[17] ^ +- D[15] ^ D[14] ^ D[12] ^ D[10] ^ D[8] ^ D[4] ^ D[3] ^ D[2] ^ +- C[0] ^ C[2] ^ C[3] ^ C[6] ^ C[7]; +- NewCRC[5] = D[31] ^ D[28] ^ D[27] ^ D[25] ^ D[20] ^ D[18] ^ D[16] ^ +- D[15] ^ D[13] ^ D[11] ^ D[9] ^ D[5] ^ D[4] ^ D[3] ^ C[1] ^ +- C[3] ^ C[4] ^ C[7]; +- NewCRC[6] = D[29] ^ D[28] ^ D[26] ^ D[21] ^ D[19] ^ D[17] ^ D[16] ^ +- D[14] ^ D[12] ^ D[10] ^ D[6] ^ D[5] ^ D[4] ^ C[2] ^ C[4] ^ +- C[5]; +- NewCRC[7] = D[30] ^ D[29] ^ D[27] ^ D[22] ^ D[20] ^ D[18] ^ D[17] ^ +- D[15] ^ D[13] ^ D[11] ^ D[7] ^ D[6] ^ D[5] ^ C[3] ^ C[5] ^ +- C[6]; +- +- crc_res = 0; +- for (i = 0; i < 8; i++) +- crc_res |= (NewCRC[i] << i); +- +- return crc_res; +-} +- +-/* registers addresses are not in order +- so these arrays help simplify the code */ +-static const int cm_start[E1H_FUNC_MAX][9] = { +- {MISC_FUNC0_START, TCM_FUNC0_START, UCM_FUNC0_START, CCM_FUNC0_START, +- XCM_FUNC0_START, TSEM_FUNC0_START, USEM_FUNC0_START, CSEM_FUNC0_START, +- XSEM_FUNC0_START}, +- {MISC_FUNC1_START, TCM_FUNC1_START, UCM_FUNC1_START, CCM_FUNC1_START, +- XCM_FUNC1_START, TSEM_FUNC1_START, USEM_FUNC1_START, CSEM_FUNC1_START, +- XSEM_FUNC1_START}, +- {MISC_FUNC2_START, TCM_FUNC2_START, UCM_FUNC2_START, CCM_FUNC2_START, +- XCM_FUNC2_START, TSEM_FUNC2_START, USEM_FUNC2_START, CSEM_FUNC2_START, +- XSEM_FUNC2_START}, +- {MISC_FUNC3_START, TCM_FUNC3_START, UCM_FUNC3_START, CCM_FUNC3_START, +- XCM_FUNC3_START, TSEM_FUNC3_START, USEM_FUNC3_START, CSEM_FUNC3_START, +- XSEM_FUNC3_START}, +- {MISC_FUNC4_START, TCM_FUNC4_START, UCM_FUNC4_START, CCM_FUNC4_START, +- XCM_FUNC4_START, TSEM_FUNC4_START, USEM_FUNC4_START, CSEM_FUNC4_START, +- XSEM_FUNC4_START}, +- {MISC_FUNC5_START, TCM_FUNC5_START, UCM_FUNC5_START, CCM_FUNC5_START, +- XCM_FUNC5_START, TSEM_FUNC5_START, USEM_FUNC5_START, CSEM_FUNC5_START, +- XSEM_FUNC5_START}, +- {MISC_FUNC6_START, TCM_FUNC6_START, UCM_FUNC6_START, CCM_FUNC6_START, +- XCM_FUNC6_START, TSEM_FUNC6_START, USEM_FUNC6_START, CSEM_FUNC6_START, +- XSEM_FUNC6_START}, +- {MISC_FUNC7_START, TCM_FUNC7_START, UCM_FUNC7_START, CCM_FUNC7_START, +- XCM_FUNC7_START, TSEM_FUNC7_START, USEM_FUNC7_START, CSEM_FUNC7_START, +- XSEM_FUNC7_START} +-}; +- +-static const int cm_end[E1H_FUNC_MAX][9] = { +- {MISC_FUNC0_END, TCM_FUNC0_END, UCM_FUNC0_END, CCM_FUNC0_END, +- XCM_FUNC0_END, TSEM_FUNC0_END, USEM_FUNC0_END, CSEM_FUNC0_END, +- XSEM_FUNC0_END}, +- {MISC_FUNC1_END, TCM_FUNC1_END, UCM_FUNC1_END, CCM_FUNC1_END, +- XCM_FUNC1_END, TSEM_FUNC1_END, USEM_FUNC1_END, CSEM_FUNC1_END, +- XSEM_FUNC1_END}, +- {MISC_FUNC2_END, TCM_FUNC2_END, UCM_FUNC2_END, CCM_FUNC2_END, +- XCM_FUNC2_END, TSEM_FUNC2_END, USEM_FUNC2_END, CSEM_FUNC2_END, +- XSEM_FUNC2_END}, +- {MISC_FUNC3_END, TCM_FUNC3_END, UCM_FUNC3_END, CCM_FUNC3_END, +- XCM_FUNC3_END, TSEM_FUNC3_END, USEM_FUNC3_END, CSEM_FUNC3_END, +- XSEM_FUNC3_END}, +- {MISC_FUNC4_END, TCM_FUNC4_END, UCM_FUNC4_END, CCM_FUNC4_END, +- XCM_FUNC4_END, TSEM_FUNC4_END, USEM_FUNC4_END, CSEM_FUNC4_END, +- XSEM_FUNC4_END}, +- {MISC_FUNC5_END, TCM_FUNC5_END, UCM_FUNC5_END, CCM_FUNC5_END, +- XCM_FUNC5_END, TSEM_FUNC5_END, USEM_FUNC5_END, CSEM_FUNC5_END, +- XSEM_FUNC5_END}, +- {MISC_FUNC6_END, TCM_FUNC6_END, UCM_FUNC6_END, CCM_FUNC6_END, +- XCM_FUNC6_END, TSEM_FUNC6_END, USEM_FUNC6_END, CSEM_FUNC6_END, +- XSEM_FUNC6_END}, +- {MISC_FUNC7_END, TCM_FUNC7_END, UCM_FUNC7_END, CCM_FUNC7_END, +- XCM_FUNC7_END, TSEM_FUNC7_END, USEM_FUNC7_END, CSEM_FUNC7_END, +- XSEM_FUNC7_END}, +-}; +- +-static const int hc_limits[E1H_FUNC_MAX][2] = { +- {HC_FUNC0_START, HC_FUNC0_END}, +- {HC_FUNC1_START, HC_FUNC1_END}, +- {HC_FUNC2_START, HC_FUNC2_END}, +- {HC_FUNC3_START, HC_FUNC3_END}, +- {HC_FUNC4_START, HC_FUNC4_END}, +- {HC_FUNC5_START, HC_FUNC5_END}, +- {HC_FUNC6_START, HC_FUNC6_END}, +- {HC_FUNC7_START, HC_FUNC7_END} +-}; +- + #endif /* BNX2X_INIT_H */ + +diff -r ddb96c0bbe13 drivers/net/bnx2x_init_ops.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/bnx2x_init_ops.h Tue Jun 16 13:15:30 2009 +0100 +@@ -0,0 +1,501 @@ ++/* bnx2x_init_ops.h: Broadcom Everest network driver. ++ * Static functions needed during the initialization. ++ * This file is "included" in bnx2x_main.c. ++ * ++ * Copyright (c) 2007-2009 Broadcom Corporation ++ * ++ * 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. ++ * ++ * Maintained by: Eilon Greenstein ++ * Written by: Vladislav Zolotarov ++ */ ++ ++#ifndef BNX2X_INIT_OPS_H ++#define BNX2X_INIT_OPS_H ++ ++static int bnx2x_gunzip(struct bnx2x *bp, const u8 *zbuf, int len); ++ ++ ++static void bnx2x_init_str_wr(struct bnx2x *bp, u32 addr, const u32 *data, ++ u32 len) ++{ ++ u32 i; ++ ++ for (i = 0; i < len; i++) ++ REG_WR(bp, addr + i*4, data[i]); ++} ++ ++static void bnx2x_init_ind_wr(struct bnx2x *bp, u32 addr, const u32 *data, ++ u32 len) ++{ ++ u32 i; ++ ++ for (i = 0; i < len; i++) ++ REG_WR_IND(bp, addr + i*4, data[i]); ++} ++ ++static void bnx2x_write_big_buf(struct bnx2x *bp, u32 addr, u32 len) ++{ ++ if (bp->dmae_ready) ++ bnx2x_write_dmae_phys_len(bp, GUNZIP_PHYS(bp), addr, len); ++ else ++ bnx2x_init_str_wr(bp, addr, GUNZIP_BUF(bp), len); ++} ++ ++static void bnx2x_init_fill(struct bnx2x *bp, u32 addr, int fill, u32 len) ++{ ++ u32 buf_len = (((len*4) > FW_BUF_SIZE) ? FW_BUF_SIZE : (len*4)); ++ u32 buf_len32 = buf_len/4; ++ u32 i; ++ ++ memset(GUNZIP_BUF(bp), (u8)fill, buf_len); ++ ++ for (i = 0; i < len; i += buf_len32) { ++ u32 cur_len = min(buf_len32, len - i); ++ ++ bnx2x_write_big_buf(bp, addr + i*4, cur_len); ++ } ++} ++ ++static void bnx2x_init_wr_64(struct bnx2x *bp, u32 addr, const u32 *data, ++ u32 len64) ++{ ++ u32 buf_len32 = FW_BUF_SIZE/4; ++ u32 len = len64*2; ++ u64 data64 = 0; ++ u32 i; ++ ++ /* 64 bit value is in a blob: first low DWORD, then high DWORD */ ++ data64 = HILO_U64((*(data + 1)), (*data)); ++ ++ len64 = min((u32)(FW_BUF_SIZE/8), len64); ++ for (i = 0; i < len64; i++) { ++ u64 *pdata = ((u64 *)(GUNZIP_BUF(bp))) + i; ++ ++ *pdata = data64; ++ } ++ ++ for (i = 0; i < len; i += buf_len32) { ++ u32 cur_len = min(buf_len32, len - i); ++ ++ bnx2x_write_big_buf(bp, addr + i*4, cur_len); ++ } ++} ++ ++/********************************************************* ++ There are different blobs for each PRAM section. ++ In addition, each blob write operation is divided into a few operations ++ in order to decrease the amount of phys. contiguous buffer needed. ++ Thus, when we select a blob the address may be with some offset ++ from the beginning of PRAM section. ++ The same holds for the INT_TABLE sections. ++**********************************************************/ ++#define IF_IS_INT_TABLE_ADDR(base, addr) \ ++ if (((base) <= (addr)) && ((base) + 0x400 >= (addr))) ++ ++#define IF_IS_PRAM_ADDR(base, addr) \ ++ if (((base) <= (addr)) && ((base) + 0x40000 >= (addr))) ++ ++static const u8 *bnx2x_sel_blob(struct bnx2x *bp, u32 addr, const u8 *data) ++{ ++ IF_IS_INT_TABLE_ADDR(TSEM_REG_INT_TABLE, addr) ++ data = INIT_TSEM_INT_TABLE_DATA(bp); ++ else ++ IF_IS_INT_TABLE_ADDR(CSEM_REG_INT_TABLE, addr) ++ data = INIT_CSEM_INT_TABLE_DATA(bp); ++ else ++ IF_IS_INT_TABLE_ADDR(USEM_REG_INT_TABLE, addr) ++ data = INIT_USEM_INT_TABLE_DATA(bp); ++ else ++ IF_IS_INT_TABLE_ADDR(XSEM_REG_INT_TABLE, addr) ++ data = INIT_XSEM_INT_TABLE_DATA(bp); ++ else ++ IF_IS_PRAM_ADDR(TSEM_REG_PRAM, addr) ++ data = INIT_TSEM_PRAM_DATA(bp); ++ else ++ IF_IS_PRAM_ADDR(CSEM_REG_PRAM, addr) ++ data = INIT_CSEM_PRAM_DATA(bp); ++ else ++ IF_IS_PRAM_ADDR(USEM_REG_PRAM, addr) ++ data = INIT_USEM_PRAM_DATA(bp); ++ else ++ IF_IS_PRAM_ADDR(XSEM_REG_PRAM, addr) ++ data = INIT_XSEM_PRAM_DATA(bp); ++ ++ return data; ++} ++ ++static void bnx2x_write_big_buf_wb(struct bnx2x *bp, u32 addr, u32 len) ++{ ++ if (bp->dmae_ready) ++ bnx2x_write_dmae_phys_len(bp, GUNZIP_PHYS(bp), addr, len); ++ else ++ bnx2x_init_ind_wr(bp, addr, GUNZIP_BUF(bp), len); ++} ++ ++static void bnx2x_init_wr_wb(struct bnx2x *bp, u32 addr, const u32 *data, ++ u32 len) ++{ ++ data = (const u32 *)bnx2x_sel_blob(bp, addr, (const u8 *)data); ++ ++ if (bp->dmae_ready) ++ VIRT_WR_DMAE_LEN(bp, data, addr, len); ++ else ++ bnx2x_init_ind_wr(bp, addr, data, len); ++} ++ ++static void bnx2x_init_wr_zp(struct bnx2x *bp, u32 addr, u32 len, u32 blob_off) ++{ ++ const u8 *data = NULL; ++ int rc; ++ u32 i; ++ ++ data = bnx2x_sel_blob(bp, addr, data) + blob_off*4; ++ ++ rc = bnx2x_gunzip(bp, data, len); ++ if (rc) ++ return; ++ ++ /* gunzip_outlen is in dwords */ ++ len = GUNZIP_OUTLEN(bp); ++ for (i = 0; i < len; i++) ++ ((u32 *)GUNZIP_BUF(bp))[i] = ++ cpu_to_le32(((u32 *)GUNZIP_BUF(bp))[i]); ++ ++ bnx2x_write_big_buf_wb(bp, addr, len); ++} ++ ++static void bnx2x_init_block(struct bnx2x *bp, u32 block, u32 stage) ++{ ++ u16 op_start = ++ INIT_OPS_OFFSETS(bp)[BLOCK_OPS_IDX(block,stage,STAGE_START)]; ++ u16 op_end = ++ INIT_OPS_OFFSETS(bp)[BLOCK_OPS_IDX(block,stage,STAGE_END)]; ++ union init_op *op; ++ int hw_wr; ++ u32 i, op_type, addr, len; ++ const u32 *data, *data_base; ++ ++ /* If empty block */ ++ if (op_start == op_end) ++ return; ++ ++ if (CHIP_REV_IS_FPGA(bp)) ++ hw_wr = OP_WR_FPGA; ++ else if (CHIP_REV_IS_EMUL(bp)) ++ hw_wr = OP_WR_EMUL; ++ else ++ hw_wr = OP_WR_ASIC; ++ ++ data_base = INIT_DATA(bp); ++ ++ for (i = op_start; i < op_end; i++) { ++ ++ op = (union init_op *)&(INIT_OPS(bp)[i]); ++ ++ op_type = op->str_wr.op; ++ addr = op->str_wr.offset; ++ len = op->str_wr.data_len; ++ data = data_base + op->str_wr.data_off; ++ ++ /* HW/EMUL specific */ ++ if ((op_type > OP_WB) && (op_type == hw_wr)) ++ op_type = OP_WR; ++ ++ switch (op_type) { ++ case OP_RD: ++ REG_RD(bp, addr); ++ break; ++ case OP_WR: ++ REG_WR(bp, addr, op->write.val); ++ break; ++ case OP_SW: ++ bnx2x_init_str_wr(bp, addr, data, len); ++ break; ++ case OP_WB: ++ bnx2x_init_wr_wb(bp, addr, data, len); ++ break; ++ case OP_SI: ++ bnx2x_init_ind_wr(bp, addr, data, len); ++ break; ++ case OP_ZR: ++ bnx2x_init_fill(bp, addr, 0, op->zero.len); ++ break; ++ case OP_ZP: ++ bnx2x_init_wr_zp(bp, addr, len, ++ op->str_wr.data_off); ++ break; ++ case OP_WR_64: ++ bnx2x_init_wr_64(bp, addr, data, len); ++ break; ++ default: ++ /* happens whenever an op is of a diff HW */ ++ break; ++ } ++ } ++} ++ ++ ++/**************************************************************************** ++* PXP Arbiter ++****************************************************************************/ ++/* ++ * This code configures the PCI read/write arbiter ++ * which implements a weighted round robin ++ * between the virtual queues in the chip. ++ * ++ * The values were derived for each PCI max payload and max request size. ++ * since max payload and max request size are only known at run time, ++ * this is done as a separate init stage. ++ */ ++ ++#define NUM_WR_Q 13 ++#define NUM_RD_Q 29 ++#define MAX_RD_ORD 3 ++#define MAX_WR_ORD 2 ++ ++/* configuration for one arbiter queue */ ++struct arb_line { ++ int l; ++ int add; ++ int ubound; ++}; ++ ++/* derived configuration for each read queue for each max request size */ ++static const struct arb_line read_arb_data[NUM_RD_Q][MAX_RD_ORD + 1] = { ++/* 1 */ { {8, 64, 25}, {16, 64, 25}, {32, 64, 25}, {64, 64, 41} }, ++ { {4, 8, 4}, {4, 8, 4}, {4, 8, 4}, {4, 8, 4} }, ++ { {4, 3, 3}, {4, 3, 3}, {4, 3, 3}, {4, 3, 3} }, ++ { {8, 3, 6}, {16, 3, 11}, {16, 3, 11}, {16, 3, 11} }, ++ { {8, 64, 25}, {16, 64, 25}, {32, 64, 25}, {64, 64, 41} }, ++ { {8, 3, 6}, {16, 3, 11}, {32, 3, 21}, {64, 3, 41} }, ++ { {8, 3, 6}, {16, 3, 11}, {32, 3, 21}, {64, 3, 41} }, ++ { {8, 3, 6}, {16, 3, 11}, {32, 3, 21}, {64, 3, 41} }, ++ { {8, 3, 6}, {16, 3, 11}, {32, 3, 21}, {64, 3, 41} }, ++/* 10 */{ {8, 3, 6}, {16, 3, 11}, {32, 3, 21}, {32, 3, 21} }, ++ { {8, 3, 6}, {16, 3, 11}, {32, 3, 21}, {32, 3, 21} }, ++ { {8, 3, 6}, {16, 3, 11}, {32, 3, 21}, {32, 3, 21} }, ++ { {8, 3, 6}, {16, 3, 11}, {32, 3, 21}, {32, 3, 21} }, ++ { {8, 3, 6}, {16, 3, 11}, {32, 3, 21}, {32, 3, 21} }, ++ { {8, 3, 6}, {16, 3, 11}, {32, 3, 21}, {32, 3, 21} }, ++ { {8, 3, 6}, {16, 3, 11}, {32, 3, 21}, {32, 3, 21} }, ++ { {8, 64, 6}, {16, 64, 11}, {32, 64, 21}, {32, 64, 21} }, ++ { {8, 3, 6}, {16, 3, 11}, {32, 3, 21}, {32, 3, 21} }, ++ { {8, 3, 6}, {16, 3, 11}, {32, 3, 21}, {32, 3, 21} }, ++/* 20 */{ {8, 3, 6}, {16, 3, 11}, {32, 3, 21}, {32, 3, 21} }, ++ { {8, 3, 6}, {16, 3, 11}, {32, 3, 21}, {32, 3, 21} }, ++ { {8, 3, 6}, {16, 3, 11}, {32, 3, 21}, {32, 3, 21} }, ++ { {8, 3, 6}, {16, 3, 11}, {32, 3, 21}, {32, 3, 21} }, ++ { {8, 3, 6}, {16, 3, 11}, {32, 3, 21}, {32, 3, 21} }, ++ { {8, 3, 6}, {16, 3, 11}, {32, 3, 21}, {32, 3, 21} }, ++ { {8, 3, 6}, {16, 3, 11}, {32, 3, 21}, {32, 3, 21} }, ++ { {8, 3, 6}, {16, 3, 11}, {32, 3, 21}, {32, 3, 21} }, ++ { {8, 3, 6}, {16, 3, 11}, {32, 3, 21}, {32, 3, 21} }, ++ { {8, 64, 25}, {16, 64, 41}, {32, 64, 81}, {64, 64, 120} } ++}; ++ ++/* derived configuration for each write queue for each max request size */ ++static const struct arb_line write_arb_data[NUM_WR_Q][MAX_WR_ORD + 1] = { ++/* 1 */ { {4, 6, 3}, {4, 6, 3}, {4, 6, 3} }, ++ { {4, 2, 3}, {4, 2, 3}, {4, 2, 3} }, ++ { {8, 2, 6}, {16, 2, 11}, {16, 2, 11} }, ++ { {8, 2, 6}, {16, 2, 11}, {32, 2, 21} }, ++ { {8, 2, 6}, {16, 2, 11}, {32, 2, 21} }, ++ { {8, 2, 6}, {16, 2, 11}, {32, 2, 21} }, ++ { {8, 64, 25}, {16, 64, 25}, {32, 64, 25} }, ++ { {8, 2, 6}, {16, 2, 11}, {16, 2, 11} }, ++ { {8, 2, 6}, {16, 2, 11}, {16, 2, 11} }, ++/* 10 */{ {8, 9, 6}, {16, 9, 11}, {32, 9, 21} }, ++ { {8, 47, 19}, {16, 47, 19}, {32, 47, 21} }, ++ { {8, 9, 6}, {16, 9, 11}, {16, 9, 11} }, ++ { {8, 64, 25}, {16, 64, 41}, {32, 64, 81} } ++}; ++ ++/* register addresses for read queues */ ++static const struct arb_line read_arb_addr[NUM_RD_Q-1] = { ++/* 1 */ {PXP2_REG_RQ_BW_RD_L0, PXP2_REG_RQ_BW_RD_ADD0, ++ PXP2_REG_RQ_BW_RD_UBOUND0}, ++ {PXP2_REG_PSWRQ_BW_L1, PXP2_REG_PSWRQ_BW_ADD1, ++ PXP2_REG_PSWRQ_BW_UB1}, ++ {PXP2_REG_PSWRQ_BW_L2, PXP2_REG_PSWRQ_BW_ADD2, ++ PXP2_REG_PSWRQ_BW_UB2}, ++ {PXP2_REG_PSWRQ_BW_L3, PXP2_REG_PSWRQ_BW_ADD3, ++ PXP2_REG_PSWRQ_BW_UB3}, ++ {PXP2_REG_RQ_BW_RD_L4, PXP2_REG_RQ_BW_RD_ADD4, ++ PXP2_REG_RQ_BW_RD_UBOUND4}, ++ {PXP2_REG_RQ_BW_RD_L5, PXP2_REG_RQ_BW_RD_ADD5, ++ PXP2_REG_RQ_BW_RD_UBOUND5}, ++ {PXP2_REG_PSWRQ_BW_L6, PXP2_REG_PSWRQ_BW_ADD6, ++ PXP2_REG_PSWRQ_BW_UB6}, ++ {PXP2_REG_PSWRQ_BW_L7, PXP2_REG_PSWRQ_BW_ADD7, ++ PXP2_REG_PSWRQ_BW_UB7}, ++ {PXP2_REG_PSWRQ_BW_L8, PXP2_REG_PSWRQ_BW_ADD8, ++ PXP2_REG_PSWRQ_BW_UB8}, ++/* 10 */{PXP2_REG_PSWRQ_BW_L9, PXP2_REG_PSWRQ_BW_ADD9, ++ PXP2_REG_PSWRQ_BW_UB9}, ++ {PXP2_REG_PSWRQ_BW_L10, PXP2_REG_PSWRQ_BW_ADD10, ++ PXP2_REG_PSWRQ_BW_UB10}, ++ {PXP2_REG_PSWRQ_BW_L11, PXP2_REG_PSWRQ_BW_ADD11, ++ PXP2_REG_PSWRQ_BW_UB11}, ++ {PXP2_REG_RQ_BW_RD_L12, PXP2_REG_RQ_BW_RD_ADD12, ++ PXP2_REG_RQ_BW_RD_UBOUND12}, ++ {PXP2_REG_RQ_BW_RD_L13, PXP2_REG_RQ_BW_RD_ADD13, ++ PXP2_REG_RQ_BW_RD_UBOUND13}, ++ {PXP2_REG_RQ_BW_RD_L14, PXP2_REG_RQ_BW_RD_ADD14, ++ PXP2_REG_RQ_BW_RD_UBOUND14}, ++ {PXP2_REG_RQ_BW_RD_L15, PXP2_REG_RQ_BW_RD_ADD15, ++ PXP2_REG_RQ_BW_RD_UBOUND15}, ++ {PXP2_REG_RQ_BW_RD_L16, PXP2_REG_RQ_BW_RD_ADD16, ++ PXP2_REG_RQ_BW_RD_UBOUND16}, ++ {PXP2_REG_RQ_BW_RD_L17, PXP2_REG_RQ_BW_RD_ADD17, ++ PXP2_REG_RQ_BW_RD_UBOUND17}, ++ {PXP2_REG_RQ_BW_RD_L18, PXP2_REG_RQ_BW_RD_ADD18, ++ PXP2_REG_RQ_BW_RD_UBOUND18}, ++/* 20 */{PXP2_REG_RQ_BW_RD_L19, PXP2_REG_RQ_BW_RD_ADD19, ++ PXP2_REG_RQ_BW_RD_UBOUND19}, ++ {PXP2_REG_RQ_BW_RD_L20, PXP2_REG_RQ_BW_RD_ADD20, ++ PXP2_REG_RQ_BW_RD_UBOUND20}, ++ {PXP2_REG_RQ_BW_RD_L22, PXP2_REG_RQ_BW_RD_ADD22, ++ PXP2_REG_RQ_BW_RD_UBOUND22}, ++ {PXP2_REG_RQ_BW_RD_L23, PXP2_REG_RQ_BW_RD_ADD23, ++ PXP2_REG_RQ_BW_RD_UBOUND23}, ++ {PXP2_REG_RQ_BW_RD_L24, PXP2_REG_RQ_BW_RD_ADD24, ++ PXP2_REG_RQ_BW_RD_UBOUND24}, ++ {PXP2_REG_RQ_BW_RD_L25, PXP2_REG_RQ_BW_RD_ADD25, ++ PXP2_REG_RQ_BW_RD_UBOUND25}, ++ {PXP2_REG_RQ_BW_RD_L26, PXP2_REG_RQ_BW_RD_ADD26, ++ PXP2_REG_RQ_BW_RD_UBOUND26}, ++ {PXP2_REG_RQ_BW_RD_L27, PXP2_REG_RQ_BW_RD_ADD27, ++ PXP2_REG_RQ_BW_RD_UBOUND27}, ++ {PXP2_REG_PSWRQ_BW_L28, PXP2_REG_PSWRQ_BW_ADD28, ++ PXP2_REG_PSWRQ_BW_UB28} ++}; ++ ++/* register addresses for write queues */ ++static const struct arb_line write_arb_addr[NUM_WR_Q-1] = { ++/* 1 */ {PXP2_REG_PSWRQ_BW_L1, PXP2_REG_PSWRQ_BW_ADD1, ++ PXP2_REG_PSWRQ_BW_UB1}, ++ {PXP2_REG_PSWRQ_BW_L2, PXP2_REG_PSWRQ_BW_ADD2, ++ PXP2_REG_PSWRQ_BW_UB2}, ++ {PXP2_REG_PSWRQ_BW_L3, PXP2_REG_PSWRQ_BW_ADD3, ++ PXP2_REG_PSWRQ_BW_UB3}, ++ {PXP2_REG_PSWRQ_BW_L6, PXP2_REG_PSWRQ_BW_ADD6, ++ PXP2_REG_PSWRQ_BW_UB6}, ++ {PXP2_REG_PSWRQ_BW_L7, PXP2_REG_PSWRQ_BW_ADD7, ++ PXP2_REG_PSWRQ_BW_UB7}, ++ {PXP2_REG_PSWRQ_BW_L8, PXP2_REG_PSWRQ_BW_ADD8, ++ PXP2_REG_PSWRQ_BW_UB8}, ++ {PXP2_REG_PSWRQ_BW_L9, PXP2_REG_PSWRQ_BW_ADD9, ++ PXP2_REG_PSWRQ_BW_UB9}, ++ {PXP2_REG_PSWRQ_BW_L10, PXP2_REG_PSWRQ_BW_ADD10, ++ PXP2_REG_PSWRQ_BW_UB10}, ++ {PXP2_REG_PSWRQ_BW_L11, PXP2_REG_PSWRQ_BW_ADD11, ++ PXP2_REG_PSWRQ_BW_UB11}, ++/* 10 */{PXP2_REG_PSWRQ_BW_L28, PXP2_REG_PSWRQ_BW_ADD28, ++ PXP2_REG_PSWRQ_BW_UB28}, ++ {PXP2_REG_RQ_BW_WR_L29, PXP2_REG_RQ_BW_WR_ADD29, ++ PXP2_REG_RQ_BW_WR_UBOUND29}, ++ {PXP2_REG_RQ_BW_WR_L30, PXP2_REG_RQ_BW_WR_ADD30, ++ PXP2_REG_RQ_BW_WR_UBOUND30} ++}; ++ ++static void bnx2x_init_pxp_arb(struct bnx2x *bp, int r_order, int w_order) ++{ ++ u32 val, i; ++ ++ if (r_order > MAX_RD_ORD) { ++ DP(NETIF_MSG_HW, "read order of %d order adjusted to %d\n", ++ r_order, MAX_RD_ORD); ++ r_order = MAX_RD_ORD; ++ } ++ if (w_order > MAX_WR_ORD) { ++ DP(NETIF_MSG_HW, "write order of %d order adjusted to %d\n", ++ w_order, MAX_WR_ORD); ++ w_order = MAX_WR_ORD; ++ } ++ if (CHIP_REV_IS_FPGA(bp)) { ++ DP(NETIF_MSG_HW, "write order adjusted to 1 for FPGA\n"); ++ w_order = 0; ++ } ++ DP(NETIF_MSG_HW, "read order %d write order %d\n", r_order, w_order); ++ ++ for (i = 0; i < NUM_RD_Q-1; i++) { ++ REG_WR(bp, read_arb_addr[i].l, read_arb_data[i][r_order].l); ++ REG_WR(bp, read_arb_addr[i].add, ++ read_arb_data[i][r_order].add); ++ REG_WR(bp, read_arb_addr[i].ubound, ++ read_arb_data[i][r_order].ubound); ++ } ++ ++ for (i = 0; i < NUM_WR_Q-1; i++) { ++ if ((write_arb_addr[i].l == PXP2_REG_RQ_BW_WR_L29) || ++ (write_arb_addr[i].l == PXP2_REG_RQ_BW_WR_L30)) { ++ ++ REG_WR(bp, write_arb_addr[i].l, ++ write_arb_data[i][w_order].l); ++ ++ REG_WR(bp, write_arb_addr[i].add, ++ write_arb_data[i][w_order].add); ++ ++ REG_WR(bp, write_arb_addr[i].ubound, ++ write_arb_data[i][w_order].ubound); ++ } else { ++ ++ val = REG_RD(bp, write_arb_addr[i].l); ++ REG_WR(bp, write_arb_addr[i].l, ++ val | (write_arb_data[i][w_order].l << 10)); ++ ++ val = REG_RD(bp, write_arb_addr[i].add); ++ REG_WR(bp, write_arb_addr[i].add, ++ val | (write_arb_data[i][w_order].add << 10)); ++ ++ val = REG_RD(bp, write_arb_addr[i].ubound); ++ REG_WR(bp, write_arb_addr[i].ubound, ++ val | (write_arb_data[i][w_order].ubound << 7)); ++ } ++ } ++ ++ val = write_arb_data[NUM_WR_Q-1][w_order].add; ++ val += write_arb_data[NUM_WR_Q-1][w_order].ubound << 10; ++ val += write_arb_data[NUM_WR_Q-1][w_order].l << 17; ++ REG_WR(bp, PXP2_REG_PSWRQ_BW_RD, val); ++ ++ val = read_arb_data[NUM_RD_Q-1][r_order].add; ++ val += read_arb_data[NUM_RD_Q-1][r_order].ubound << 10; ++ val += read_arb_data[NUM_RD_Q-1][r_order].l << 17; ++ REG_WR(bp, PXP2_REG_PSWRQ_BW_WR, val); ++ ++ REG_WR(bp, PXP2_REG_RQ_WR_MBS0, w_order); ++ REG_WR(bp, PXP2_REG_RQ_WR_MBS1, w_order); ++ REG_WR(bp, PXP2_REG_RQ_RD_MBS0, r_order); ++ REG_WR(bp, PXP2_REG_RQ_RD_MBS1, r_order); ++ ++ if (r_order == MAX_RD_ORD) ++ REG_WR(bp, PXP2_REG_RQ_PDR_LIMIT, 0xe00); ++ ++ REG_WR(bp, PXP2_REG_WR_USDMDP_TH, (0x18 << w_order)); ++ ++ if (CHIP_IS_E1H(bp)) { ++ /* MPS w_order optimal TH presently TH ++ * 128 0 0 2 ++ * 256 1 1 3 ++ * >=512 2 2 3 ++ */ ++ val = ((w_order == 0) ? 2 : 3); ++ REG_WR(bp, PXP2_REG_WR_HC_MPS, val); ++ REG_WR(bp, PXP2_REG_WR_USDM_MPS, val); ++ REG_WR(bp, PXP2_REG_WR_CSDM_MPS, val); ++ REG_WR(bp, PXP2_REG_WR_TSDM_MPS, val); ++ REG_WR(bp, PXP2_REG_WR_XSDM_MPS, val); ++ REG_WR(bp, PXP2_REG_WR_QM_MPS, val); ++ REG_WR(bp, PXP2_REG_WR_TM_MPS, val); ++ REG_WR(bp, PXP2_REG_WR_SRC_MPS, val); ++ REG_WR(bp, PXP2_REG_WR_DBG_MPS, val); ++ REG_WR(bp, PXP2_REG_WR_DMAE_MPS, 2); /* DMAE is special */ ++ REG_WR(bp, PXP2_REG_WR_CDU_MPS, val); ++ } ++} ++ ++#endif /* BNX2X_INIT_OPS_H */ +diff -r ddb96c0bbe13 drivers/net/bnx2x_init_values.h +--- a/drivers/net/bnx2x_init_values.h Tue Jun 16 11:03:28 2009 +0100 ++++ b/drivers/net/bnx2x_init_values.h Tue Jun 16 13:15:30 2009 +0100 +@@ -47,12 +47,16 @@ + {OP_WR, PRS_REG_CM_HDR_FLUSH_NO_LOAD_TYPE_1, 0x10100000}, + {OP_WR, PRS_REG_CM_HDR_FLUSH_NO_LOAD_TYPE_2, 0x20100000}, + {OP_WR, PRS_REG_CM_HDR_FLUSH_NO_LOAD_TYPE_3, 0x30100000}, +- {OP_ZR, PRS_REG_CM_HDR_FLUSH_NO_LOAD_TYPE_4, 0x4}, ++ {OP_ZR_E1, PRS_REG_CM_HDR_FLUSH_NO_LOAD_TYPE_4, 0x4}, ++ {OP_WR_E1H, PRS_REG_CM_HDR_FLUSH_NO_LOAD_TYPE_4, 0x40100000}, ++ {OP_ZR_E1H, PRS_REG_CM_HDR_FLUSH_NO_LOAD_TYPE_5, 0x3}, + {OP_WR, PRS_REG_CM_HDR_FLUSH_LOAD_TYPE_0, 0x100000}, + {OP_WR, PRS_REG_CM_HDR_FLUSH_LOAD_TYPE_1, 0x12140000}, + {OP_WR, PRS_REG_CM_HDR_FLUSH_LOAD_TYPE_2, 0x22140000}, + {OP_WR, PRS_REG_CM_HDR_FLUSH_LOAD_TYPE_3, 0x32140000}, +- {OP_ZR, PRS_REG_CM_HDR_FLUSH_LOAD_TYPE_4, 0x4}, ++ {OP_ZR_E1, PRS_REG_CM_HDR_FLUSH_LOAD_TYPE_4, 0x4}, ++ {OP_WR_E1H, PRS_REG_CM_HDR_FLUSH_LOAD_TYPE_4, 0x42140000}, ++ {OP_ZR_E1H, PRS_REG_CM_HDR_FLUSH_LOAD_TYPE_5, 0x3}, + {OP_RD, PRS_REG_NUM_OF_PACKETS, 0x0}, + {OP_RD, PRS_REG_NUM_OF_CFC_FLUSH_MESSAGES, 0x0}, + {OP_RD, PRS_REG_NUM_OF_TRANSPARENT_FLUSH_MESSAGES, 0x0}, +@@ -71,15 +75,16 @@ + {OP_WR, PRS_REG_PACKET_REGIONS_TYPE_1, 0x3f}, + {OP_WR, PRS_REG_PACKET_REGIONS_TYPE_2, 0x3f}, + {OP_WR, PRS_REG_PACKET_REGIONS_TYPE_3, 0x3f}, +- {OP_WR, PRS_REG_PACKET_REGIONS_TYPE_4, 0x0}, ++ {OP_WR_E1, PRS_REG_PACKET_REGIONS_TYPE_4, 0x0}, ++ {OP_WR_E1H, PRS_REG_PACKET_REGIONS_TYPE_4, 0x3f}, + {OP_WR, PRS_REG_PACKET_REGIONS_TYPE_5, 0x3f}, + {OP_WR, PRS_REG_PACKET_REGIONS_TYPE_6, 0x3f}, + {OP_WR, PRS_REG_PACKET_REGIONS_TYPE_7, 0x3f}, +-#define PRS_COMMON_END 47 +-#define SRCH_COMMON_START 47 ++#define PRS_COMMON_END 52 ++#define SRCH_COMMON_START 52 + {OP_WR_E1H, SRC_REG_E1HMF_ENABLE, 0x1}, +-#define SRCH_COMMON_END 48 +-#define TSDM_COMMON_START 48 ++#define SRCH_COMMON_END 53 ++#define TSDM_COMMON_START 53 + {OP_WR_E1, TSDM_REG_CFC_RSP_START_ADDR, 0x411}, + {OP_WR_E1H, TSDM_REG_CFC_RSP_START_ADDR, 0x211}, + {OP_WR_E1, TSDM_REG_CMP_COUNTER_START_ADDR, 0x400}, +@@ -118,8 +123,8 @@ + {OP_WR_ASIC, TSDM_REG_TIMER_TICK, 0x3e8}, + {OP_WR_EMUL, TSDM_REG_TIMER_TICK, 0x1}, + {OP_WR_FPGA, TSDM_REG_TIMER_TICK, 0xa}, +-#define TSDM_COMMON_END 86 +-#define TCM_COMMON_START 86 ++#define TSDM_COMMON_END 91 ++#define TCM_COMMON_START 91 + {OP_WR, TCM_REG_XX_MAX_LL_SZ, 0x20}, + {OP_WR, TCM_REG_XX_OVFL_EVNT_ID, 0x32}, + {OP_WR, TCM_REG_TQM_TCM_HDR_P, 0x2150020}, +@@ -149,7 +154,9 @@ + {OP_WR, TCM_REG_N_SM_CTX_LD_1, 0x7}, + {OP_WR, TCM_REG_N_SM_CTX_LD_2, 0x8}, + {OP_WR, TCM_REG_N_SM_CTX_LD_3, 0x8}, +- {OP_ZR, TCM_REG_N_SM_CTX_LD_4, 0x4}, ++ {OP_ZR_E1, TCM_REG_N_SM_CTX_LD_4, 0x4}, ++ {OP_WR_E1H, TCM_REG_N_SM_CTX_LD_4, 0x1}, ++ {OP_ZR_E1H, TCM_REG_N_SM_CTX_LD_5, 0x3}, + {OP_WR, TCM_REG_TCM_REG0_SZ, 0x6}, + {OP_WR_E1, TCM_REG_PHYS_QNUM0_0, 0xd}, + {OP_WR_E1, TCM_REG_PHYS_QNUM0_1, 0x2d}, +@@ -175,75 +182,75 @@ + {OP_WR, TCM_REG_CDU_SM_WR_IFEN, 0x1}, + {OP_WR, TCM_REG_CDU_SM_RD_IFEN, 0x1}, + {OP_WR, TCM_REG_TCM_CFC_IFEN, 0x1}, +-#define TCM_COMMON_END 141 +-#define TCM_FUNC0_START 141 ++#define TCM_COMMON_END 148 ++#define TCM_FUNC0_START 148 + {OP_WR_E1H, TCM_REG_PHYS_QNUM0_0, 0xd}, + {OP_WR_E1H, TCM_REG_PHYS_QNUM1_0, 0x7}, + {OP_WR_E1H, TCM_REG_PHYS_QNUM2_0, 0x7}, + {OP_WR_E1H, TCM_REG_PHYS_QNUM3_0, 0x7}, +-#define TCM_FUNC0_END 145 +-#define TCM_FUNC1_START 145 ++#define TCM_FUNC0_END 152 ++#define TCM_FUNC1_START 152 + {OP_WR_E1H, TCM_REG_PHYS_QNUM0_1, 0x2d}, + {OP_WR_E1H, TCM_REG_PHYS_QNUM1_1, 0x27}, + {OP_WR_E1H, TCM_REG_PHYS_QNUM2_1, 0x27}, + {OP_WR_E1H, TCM_REG_PHYS_QNUM3_1, 0x27}, +-#define TCM_FUNC1_END 149 +-#define TCM_FUNC2_START 149 ++#define TCM_FUNC1_END 156 ++#define TCM_FUNC2_START 156 + {OP_WR_E1H, TCM_REG_PHYS_QNUM0_0, 0x1d}, + {OP_WR_E1H, TCM_REG_PHYS_QNUM1_0, 0x17}, + {OP_WR_E1H, TCM_REG_PHYS_QNUM2_0, 0x17}, + {OP_WR_E1H, TCM_REG_PHYS_QNUM3_0, 0x17}, +-#define TCM_FUNC2_END 153 +-#define TCM_FUNC3_START 153 ++#define TCM_FUNC2_END 160 ++#define TCM_FUNC3_START 160 + {OP_WR_E1H, TCM_REG_PHYS_QNUM0_1, 0x3d}, + {OP_WR_E1H, TCM_REG_PHYS_QNUM1_1, 0x37}, + {OP_WR_E1H, TCM_REG_PHYS_QNUM2_1, 0x37}, + {OP_WR_E1H, TCM_REG_PHYS_QNUM3_1, 0x37}, +-#define TCM_FUNC3_END 157 +-#define TCM_FUNC4_START 157 ++#define TCM_FUNC3_END 164 ++#define TCM_FUNC4_START 164 + {OP_WR_E1H, TCM_REG_PHYS_QNUM0_0, 0x4d}, + {OP_WR_E1H, TCM_REG_PHYS_QNUM1_0, 0x47}, + {OP_WR_E1H, TCM_REG_PHYS_QNUM2_0, 0x47}, + {OP_WR_E1H, TCM_REG_PHYS_QNUM3_0, 0x47}, +-#define TCM_FUNC4_END 161 +-#define TCM_FUNC5_START 161 ++#define TCM_FUNC4_END 168 ++#define TCM_FUNC5_START 168 + {OP_WR_E1H, TCM_REG_PHYS_QNUM0_1, 0x6d}, + {OP_WR_E1H, TCM_REG_PHYS_QNUM1_1, 0x67}, + {OP_WR_E1H, TCM_REG_PHYS_QNUM2_1, 0x67}, + {OP_WR_E1H, TCM_REG_PHYS_QNUM3_1, 0x67}, +-#define TCM_FUNC5_END 165 +-#define TCM_FUNC6_START 165 ++#define TCM_FUNC5_END 172 ++#define TCM_FUNC6_START 172 + {OP_WR_E1H, TCM_REG_PHYS_QNUM0_0, 0x5d}, + {OP_WR_E1H, TCM_REG_PHYS_QNUM1_0, 0x57}, + {OP_WR_E1H, TCM_REG_PHYS_QNUM2_0, 0x57}, + {OP_WR_E1H, TCM_REG_PHYS_QNUM3_0, 0x57}, +-#define TCM_FUNC6_END 169 +-#define TCM_FUNC7_START 169 ++#define TCM_FUNC6_END 176 ++#define TCM_FUNC7_START 176 + {OP_WR_E1H, TCM_REG_PHYS_QNUM0_1, 0x7d}, + {OP_WR_E1H, TCM_REG_PHYS_QNUM1_1, 0x77}, + {OP_WR_E1H, TCM_REG_PHYS_QNUM2_1, 0x77}, + {OP_WR_E1H, TCM_REG_PHYS_QNUM3_1, 0x77}, +-#define TCM_FUNC7_END 173 +-#define BRB1_COMMON_START 173 ++#define TCM_FUNC7_END 180 ++#define BRB1_COMMON_START 180 + {OP_SW, BRB1_REG_LL_RAM, 0x2000020}, + {OP_WR, BRB1_REG_SOFT_RESET, 0x1}, + {OP_RD, BRB1_REG_NUM_OF_FULL_CYCLES_4, 0x0}, + {OP_SW, BRB1_REG_FREE_LIST_PRS_CRDT, 0x30220}, + {OP_WR, BRB1_REG_SOFT_RESET, 0x0}, +-#define BRB1_COMMON_END 178 +-#define BRB1_PORT0_START 178 ++#define BRB1_COMMON_END 185 ++#define BRB1_PORT0_START 185 + {OP_WR_E1, BRB1_REG_PAUSE_LOW_THRESHOLD_0, 0xb8}, + {OP_WR_E1, BRB1_REG_PAUSE_HIGH_THRESHOLD_0, 0x114}, + {OP_RD, BRB1_REG_NUM_OF_PAUSE_CYCLES_0, 0x0}, + {OP_RD, BRB1_REG_NUM_OF_FULL_CYCLES_0, 0x0}, +-#define BRB1_PORT0_END 182 +-#define BRB1_PORT1_START 182 ++#define BRB1_PORT0_END 189 ++#define BRB1_PORT1_START 189 + {OP_WR_E1, BRB1_REG_PAUSE_LOW_THRESHOLD_1, 0xb8}, + {OP_WR_E1, BRB1_REG_PAUSE_HIGH_THRESHOLD_1, 0x114}, + {OP_RD, BRB1_REG_NUM_OF_PAUSE_CYCLES_1, 0x0}, + {OP_RD, BRB1_REG_NUM_OF_FULL_CYCLES_1, 0x0}, +-#define BRB1_PORT1_END 186 +-#define TSEM_COMMON_START 186 ++#define BRB1_PORT1_END 193 ++#define TSEM_COMMON_START 193 + {OP_RD, TSEM_REG_MSG_NUM_FIC0, 0x0}, + {OP_RD, TSEM_REG_MSG_NUM_FIC1, 0x0}, + {OP_RD, TSEM_REG_MSG_NUM_FOC0, 0x0}, +@@ -303,143 +310,165 @@ + {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0xa020, 0xc8}, + {OP_ZR_E1, TSEM_REG_FAST_MEMORY + 0x1c18, 0x4}, + {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0xa000, 0x2}, ++ {OP_ZR_E1, TSEM_REG_FAST_MEMORY + 0x1c10, 0x2}, ++ {OP_WR_E1H, TSEM_REG_FAST_MEMORY + 0x1ad0, 0x0}, + {OP_ZR_E1, TSEM_REG_FAST_MEMORY + 0x800, 0x2}, +- {OP_WR_E1H, TSEM_REG_FAST_MEMORY + 0x1ad0, 0x0}, ++ {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x3678, 0x6}, + {OP_ZR_E1, TSEM_REG_FAST_MEMORY + 0x808, 0x2}, +- {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x3b28, 0x6}, ++ {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x3670, 0x2}, + {OP_ZR_E1, TSEM_REG_FAST_MEMORY + 0x810, 0x4}, + {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x5000, 0x2}, + {OP_SW_E1, TSEM_REG_FAST_MEMORY + 0x1fb0, 0x40224}, + {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x5008, 0x4}, + {OP_SW_E1, TSEM_REG_FAST_MEMORY + 0x4cb0, 0x80228}, + {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x5018, 0x4}, +- {OP_ZP_E1, TSEM_REG_INT_TABLE, 0x940000}, ++ {OP_ZP_E1, TSEM_REG_INT_TABLE, 0x920000}, + {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x5028, 0x4}, + {OP_WR_64_E1, TSEM_REG_INT_TABLE + 0x360, 0x140230}, + {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x5038, 0x4}, +- {OP_ZP_E1, TSEM_REG_PRAM, 0x30b10000}, ++ {OP_ZP_E1, TSEM_REG_PRAM, 0x32bb0000}, + {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x5048, 0x4}, +- {OP_ZP_E1, TSEM_REG_PRAM + 0x8000, 0x33c50c2d}, ++ {OP_ZP_E1, TSEM_REG_PRAM + 0x8000, 0x32f50caf}, + {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x5058, 0x4}, +- {OP_ZP_E1, TSEM_REG_PRAM + 0x10000, 0xbc6191f}, ++ {OP_ZP_E1, TSEM_REG_PRAM + 0x10000, 0xd28196d}, + {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x5068, 0x4}, +- {OP_WR_64_E1, TSEM_REG_PRAM + 0x117f0, 0x5d020232}, ++ {OP_WR_64_E1, TSEM_REG_PRAM + 0x11b00, 0x5ca00232}, + {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x5078, 0x2}, + {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x4000, 0x2}, + {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x4008, 0x2}, + {OP_SW_E1H, TSEM_REG_FAST_MEMORY + 0x6140, 0x200224}, +- {OP_ZP_E1H, TSEM_REG_INT_TABLE, 0x960000}, +- {OP_WR_64_E1H, TSEM_REG_INT_TABLE + 0x360, 0x140244}, +- {OP_ZP_E1H, TSEM_REG_PRAM, 0x30cc0000}, +- {OP_ZP_E1H, TSEM_REG_PRAM + 0x8000, 0x33df0c33}, +- {OP_ZP_E1H, TSEM_REG_PRAM + 0x10000, 0xdce192b}, +- {OP_WR_64_E1H, TSEM_REG_PRAM + 0x11c70, 0x5c720246}, +-#define TSEM_COMMON_END 276 +-#define TSEM_PORT0_START 276 ++ {OP_ZP_E1H, TSEM_REG_INT_TABLE, 0x980000}, ++ {OP_WR_64_E1H, TSEM_REG_INT_TABLE + 0x398, 0xd0244}, ++ {OP_ZP_E1H, TSEM_REG_PRAM, 0x310a0000}, ++ {OP_ZP_E1H, TSEM_REG_PRAM + 0x8000, 0x35590c43}, ++ {OP_ZP_E1H, TSEM_REG_PRAM + 0x10000, 0x1a3c199a}, ++ {OP_WR_64_E1H, TSEM_REG_PRAM + 0x14210, 0x57be0246}, ++#define TSEM_COMMON_END 285 ++#define TSEM_PORT0_START 285 + {OP_ZR_E1, TSEM_REG_FAST_MEMORY + 0x22c8, 0x20}, + {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x2000, 0x16c}, +- {OP_ZR_E1, TSEM_REG_FAST_MEMORY + 0x4000, 0xfc}, ++ {OP_ZR_E1, TSEM_REG_FAST_MEMORY + 0x4000, 0x16c}, + {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0xb000, 0x28}, + {OP_WR_E1, TSEM_REG_FAST_MEMORY + 0x4b60, 0x0}, + {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0xb140, 0xc}, + {OP_ZR_E1, TSEM_REG_FAST_MEMORY + 0x1400, 0xa}, + {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x32c0, 0x12}, + {OP_ZR_E1, TSEM_REG_FAST_MEMORY + 0x1450, 0x6}, +- {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x3350, 0xfa}, +- {OP_ZR_E1, TSEM_REG_FAST_MEMORY + 0x1500, 0xe}, ++ {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x3350, 0x64}, ++ {OP_ZR_E1, TSEM_REG_FAST_MEMORY + 0x1500, 0x2}, + {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x8108, 0x2}, ++ {OP_SW_E1, TSEM_REG_FAST_MEMORY + 0x1500 + 0x8, 0x50234}, ++ {OP_ZR_E1, TSEM_REG_FAST_MEMORY + 0x1500 + 0x1c, 0x7}, + {OP_ZR_E1, TSEM_REG_FAST_MEMORY + 0x1570, 0x12}, +- {OP_ZR_E1, TSEM_REG_FAST_MEMORY + 0x9c0, 0xbe}, ++ {OP_ZR_E1, TSEM_REG_FAST_MEMORY + 0x9c0, 0x4c}, + {OP_ZR_E1, TSEM_REG_FAST_MEMORY + 0x800, 0x2}, + {OP_ZR_E1, TSEM_REG_FAST_MEMORY + 0x820, 0xe}, +- {OP_SW_E1, TSEM_REG_FAST_MEMORY + 0x1fb0, 0x20234}, ++ {OP_SW_E1, TSEM_REG_FAST_MEMORY + 0x1fb0, 0x20239}, + {OP_ZR_E1, TSEM_REG_FAST_MEMORY + 0x2908, 0x2}, +-#define TSEM_PORT0_END 294 +-#define TSEM_PORT1_START 294 ++#define TSEM_PORT0_END 305 ++#define TSEM_PORT1_START 305 + {OP_ZR_E1, TSEM_REG_FAST_MEMORY + 0x2348, 0x20}, + {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x25b0, 0x16c}, +- {OP_ZR_E1, TSEM_REG_FAST_MEMORY + 0x43f0, 0xfc}, ++ {OP_ZR_E1, TSEM_REG_FAST_MEMORY + 0x45b0, 0x16c}, + {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0xb0a0, 0x28}, + {OP_WR_E1, TSEM_REG_FAST_MEMORY + 0x4b64, 0x0}, + {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0xb170, 0xc}, + {OP_ZR_E1, TSEM_REG_FAST_MEMORY + 0x1428, 0xa}, + {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x3308, 0x12}, + {OP_ZR_E1, TSEM_REG_FAST_MEMORY + 0x1468, 0x6}, +- {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x3738, 0xfa}, +- {OP_ZR_E1, TSEM_REG_FAST_MEMORY + 0x1538, 0xe}, ++ {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x34e0, 0x64}, ++ {OP_ZR_E1, TSEM_REG_FAST_MEMORY + 0x1538, 0x2}, + {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x8110, 0x2}, ++ {OP_SW_E1, TSEM_REG_FAST_MEMORY + 0x1538 + 0x8, 0x5023b}, ++ {OP_ZR_E1, TSEM_REG_FAST_MEMORY + 0x1538 + 0x1c, 0x7}, + {OP_ZR_E1, TSEM_REG_FAST_MEMORY + 0x15b8, 0x12}, +- {OP_ZR_E1, TSEM_REG_FAST_MEMORY + 0xcb8, 0xbe}, ++ {OP_ZR_E1, TSEM_REG_FAST_MEMORY + 0xaf0, 0x4c}, + {OP_ZR_E1, TSEM_REG_FAST_MEMORY + 0x808, 0x2}, + {OP_ZR_E1, TSEM_REG_FAST_MEMORY + 0x858, 0xe}, +- {OP_SW_E1, TSEM_REG_FAST_MEMORY + 0x1fb8, 0x20236}, ++ {OP_SW_E1, TSEM_REG_FAST_MEMORY + 0x1fb8, 0x20240}, + {OP_ZR_E1, TSEM_REG_FAST_MEMORY + 0x2910, 0x2}, +-#define TSEM_PORT1_END 312 +-#define TSEM_FUNC0_START 312 ++#define TSEM_PORT1_END 325 ++#define TSEM_FUNC0_START 325 + {OP_WR_E1H, TSEM_REG_FAST_MEMORY + 0x2b60, 0x0}, +- {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x3000, 0xe}, ++ {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x3000, 0x2}, ++ {OP_SW_E1H, TSEM_REG_FAST_MEMORY + 0x3000 + 0x8, 0x50248}, ++ {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x3000 + 0x1c, 0x7}, + {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x31c0, 0x8}, + {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x5000, 0x2}, + {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x5080, 0x12}, + {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x4000, 0x2}, +-#define TSEM_FUNC0_END 318 +-#define TSEM_FUNC1_START 318 ++#define TSEM_FUNC0_END 333 ++#define TSEM_FUNC1_START 333 + {OP_WR_E1H, TSEM_REG_FAST_MEMORY + 0x2b64, 0x0}, +- {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x3038, 0xe}, ++ {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x3038, 0x2}, ++ {OP_SW_E1H, TSEM_REG_FAST_MEMORY + 0x3038 + 0x8, 0x5024d}, ++ {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x3038 + 0x1c, 0x7}, + {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x31e0, 0x8}, + {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x5010, 0x2}, + {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x50c8, 0x12}, + {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x4008, 0x2}, +-#define TSEM_FUNC1_END 324 +-#define TSEM_FUNC2_START 324 ++#define TSEM_FUNC1_END 341 ++#define TSEM_FUNC2_START 341 + {OP_WR_E1H, TSEM_REG_FAST_MEMORY + 0x2b68, 0x0}, +- {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x3070, 0xe}, ++ {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x3070, 0x2}, ++ {OP_SW_E1H, TSEM_REG_FAST_MEMORY + 0x3070 + 0x8, 0x50252}, ++ {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x3070 + 0x1c, 0x7}, + {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x3200, 0x8}, + {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x5020, 0x2}, + {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x5110, 0x12}, +- {OP_SW_E1H, TSEM_REG_FAST_MEMORY + 0x4010, 0x20248}, +-#define TSEM_FUNC2_END 330 +-#define TSEM_FUNC3_START 330 ++ {OP_SW_E1H, TSEM_REG_FAST_MEMORY + 0x4010, 0x20257}, ++#define TSEM_FUNC2_END 349 ++#define TSEM_FUNC3_START 349 + {OP_WR_E1H, TSEM_REG_FAST_MEMORY + 0x2b6c, 0x0}, +- {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x30a8, 0xe}, ++ {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x30a8, 0x2}, ++ {OP_SW_E1H, TSEM_REG_FAST_MEMORY + 0x30a8 + 0x8, 0x50259}, ++ {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x30a8 + 0x1c, 0x7}, + {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x3220, 0x8}, + {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x5030, 0x2}, + {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x5158, 0x12}, +- {OP_SW_E1H, TSEM_REG_FAST_MEMORY + 0x4018, 0x2024a}, +-#define TSEM_FUNC3_END 336 +-#define TSEM_FUNC4_START 336 ++ {OP_SW_E1H, TSEM_REG_FAST_MEMORY + 0x4018, 0x2025e}, ++#define TSEM_FUNC3_END 357 ++#define TSEM_FUNC4_START 357 + {OP_WR_E1H, TSEM_REG_FAST_MEMORY + 0x2b70, 0x0}, +- {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x30e0, 0xe}, ++ {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x30e0, 0x2}, ++ {OP_SW_E1H, TSEM_REG_FAST_MEMORY + 0x30e0 + 0x8, 0x50260}, ++ {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x30e0 + 0x1c, 0x7}, + {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x3240, 0x8}, + {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x5040, 0x2}, + {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x51a0, 0x12}, +- {OP_SW_E1H, TSEM_REG_FAST_MEMORY + 0x4020, 0x2024c}, +-#define TSEM_FUNC4_END 342 +-#define TSEM_FUNC5_START 342 ++ {OP_SW_E1H, TSEM_REG_FAST_MEMORY + 0x4020, 0x20265}, ++#define TSEM_FUNC4_END 365 ++#define TSEM_FUNC5_START 365 + {OP_WR_E1H, TSEM_REG_FAST_MEMORY + 0x2b74, 0x0}, +- {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x3118, 0xe}, ++ {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x3118, 0x2}, ++ {OP_SW_E1H, TSEM_REG_FAST_MEMORY + 0x3118 + 0x8, 0x50267}, ++ {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x3118 + 0x1c, 0x7}, + {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x3260, 0x8}, + {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x5050, 0x2}, + {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x51e8, 0x12}, +- {OP_SW_E1H, TSEM_REG_FAST_MEMORY + 0x4028, 0x2024e}, +-#define TSEM_FUNC5_END 348 +-#define TSEM_FUNC6_START 348 ++ {OP_SW_E1H, TSEM_REG_FAST_MEMORY + 0x4028, 0x2026c}, ++#define TSEM_FUNC5_END 373 ++#define TSEM_FUNC6_START 373 + {OP_WR_E1H, TSEM_REG_FAST_MEMORY + 0x2b78, 0x0}, +- {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x3150, 0xe}, ++ {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x3150, 0x2}, ++ {OP_SW_E1H, TSEM_REG_FAST_MEMORY + 0x3150 + 0x8, 0x5026e}, ++ {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x3150 + 0x1c, 0x7}, + {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x3280, 0x8}, + {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x5060, 0x2}, + {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x5230, 0x12}, +- {OP_SW_E1H, TSEM_REG_FAST_MEMORY + 0x4030, 0x20250}, +-#define TSEM_FUNC6_END 354 +-#define TSEM_FUNC7_START 354 ++ {OP_SW_E1H, TSEM_REG_FAST_MEMORY + 0x4030, 0x20273}, ++#define TSEM_FUNC6_END 381 ++#define TSEM_FUNC7_START 381 + {OP_WR_E1H, TSEM_REG_FAST_MEMORY + 0x2b7c, 0x0}, +- {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x3188, 0xe}, ++ {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x3188, 0x2}, ++ {OP_SW_E1H, TSEM_REG_FAST_MEMORY + 0x3188 + 0x8, 0x50275}, ++ {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x3188 + 0x1c, 0x7}, + {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x32a0, 0x8}, + {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x5070, 0x2}, + {OP_ZR_E1H, TSEM_REG_FAST_MEMORY + 0x5278, 0x12}, +- {OP_SW_E1H, TSEM_REG_FAST_MEMORY + 0x4038, 0x20252}, +-#define TSEM_FUNC7_END 360 +-#define MISC_COMMON_START 360 ++ {OP_SW_E1H, TSEM_REG_FAST_MEMORY + 0x4038, 0x2027a}, ++#define TSEM_FUNC7_END 389 ++#define MISC_COMMON_START 389 + {OP_WR_E1, MISC_REG_GRC_TIMEOUT_EN, 0x1}, + {OP_WR, MISC_REG_PLL_STORM_CTRL_1, 0x71d2911}, + {OP_WR, MISC_REG_PLL_STORM_CTRL_2, 0x0}, +@@ -447,39 +476,39 @@ + {OP_WR, MISC_REG_PLL_STORM_CTRL_4, 0x0}, + {OP_WR, MISC_REG_LCPLL_CTRL_1, 0x209}, + {OP_WR_E1, MISC_REG_SPIO, 0xff000000}, +-#define MISC_COMMON_END 367 +-#define MISC_FUNC0_START 367 ++#define MISC_COMMON_END 396 ++#define MISC_FUNC0_START 396 + {OP_WR_E1H, MISC_REG_NIG_WOL_P0, 0x0}, +-#define MISC_FUNC0_END 368 +-#define MISC_FUNC1_START 368 ++#define MISC_FUNC0_END 397 ++#define MISC_FUNC1_START 397 + {OP_WR_E1H, MISC_REG_NIG_WOL_P1, 0x0}, +-#define MISC_FUNC1_END 369 +-#define MISC_FUNC2_START 369 ++#define MISC_FUNC1_END 398 ++#define MISC_FUNC2_START 398 + {OP_WR_E1H, MISC_REG_NIG_WOL_P0, 0x0}, +-#define MISC_FUNC2_END 370 +-#define MISC_FUNC3_START 370 ++#define MISC_FUNC2_END 399 ++#define MISC_FUNC3_START 399 + {OP_WR_E1H, MISC_REG_NIG_WOL_P1, 0x0}, +-#define MISC_FUNC3_END 371 +-#define MISC_FUNC4_START 371 ++#define MISC_FUNC3_END 400 ++#define MISC_FUNC4_START 400 + {OP_WR_E1H, MISC_REG_NIG_WOL_P0, 0x0}, +-#define MISC_FUNC4_END 372 +-#define MISC_FUNC5_START 372 ++#define MISC_FUNC4_END 401 ++#define MISC_FUNC5_START 401 + {OP_WR_E1H, MISC_REG_NIG_WOL_P1, 0x0}, +-#define MISC_FUNC5_END 373 +-#define MISC_FUNC6_START 373 ++#define MISC_FUNC5_END 402 ++#define MISC_FUNC6_START 402 + {OP_WR_E1H, MISC_REG_NIG_WOL_P0, 0x0}, +-#define MISC_FUNC6_END 374 +-#define MISC_FUNC7_START 374 ++#define MISC_FUNC6_END 403 ++#define MISC_FUNC7_START 403 + {OP_WR_E1H, MISC_REG_NIG_WOL_P1, 0x0}, +-#define MISC_FUNC7_END 375 +-#define NIG_COMMON_START 375 ++#define MISC_FUNC7_END 404 ++#define NIG_COMMON_START 404 + {OP_WR, NIG_REG_PBF_LB_IN_EN, 0x1}, + {OP_WR, NIG_REG_PRS_REQ_IN_EN, 0x1}, + {OP_WR, NIG_REG_EGRESS_DEBUG_IN_EN, 0x1}, + {OP_WR, NIG_REG_BRB_LB_OUT_EN, 0x1}, + {OP_WR, NIG_REG_PRS_EOP_OUT_EN, 0x1}, +-#define NIG_COMMON_END 380 +-#define NIG_PORT0_START 380 ++#define NIG_COMMON_END 409 ++#define NIG_PORT0_START 409 + {OP_WR, NIG_REG_LLH0_CM_HEADER, 0x300000}, + {OP_WR, NIG_REG_LLH0_EVENT_ID, 0x28}, + {OP_WR, NIG_REG_LLH0_ERROR_MASK, 0x0}, +@@ -492,8 +521,8 @@ + {OP_WR, NIG_REG_EGRESS_PBF0_IN_EN, 0x1}, + {OP_WR, NIG_REG_BRB0_OUT_EN, 0x1}, + {OP_WR, NIG_REG_XCM0_OUT_EN, 0x1}, +-#define NIG_PORT0_END 392 +-#define NIG_PORT1_START 392 ++#define NIG_PORT0_END 421 ++#define NIG_PORT1_START 421 + {OP_WR, NIG_REG_LLH1_CM_HEADER, 0x300000}, + {OP_WR, NIG_REG_LLH1_EVENT_ID, 0x28}, + {OP_WR, NIG_REG_LLH1_ERROR_MASK, 0x0}, +@@ -506,11 +535,11 @@ + {OP_WR, NIG_REG_EGRESS_PBF1_IN_EN, 0x1}, + {OP_WR, NIG_REG_BRB1_OUT_EN, 0x1}, + {OP_WR, NIG_REG_XCM1_OUT_EN, 0x1}, +-#define NIG_PORT1_END 404 +-#define UPB_COMMON_START 404 ++#define NIG_PORT1_END 433 ++#define UPB_COMMON_START 433 + {OP_WR, GRCBASE_UPB + PB_REG_CONTROL, 0x20}, +-#define UPB_COMMON_END 405 +-#define CSDM_COMMON_START 405 ++#define UPB_COMMON_END 434 ++#define CSDM_COMMON_START 434 + {OP_WR_E1, CSDM_REG_CFC_RSP_START_ADDR, 0xa11}, + {OP_WR_E1H, CSDM_REG_CFC_RSP_START_ADDR, 0x211}, + {OP_WR_E1, CSDM_REG_CMP_COUNTER_START_ADDR, 0xa00}, +@@ -550,8 +579,8 @@ + {OP_WR_ASIC, CSDM_REG_TIMER_TICK, 0x3e8}, + {OP_WR_EMUL, CSDM_REG_TIMER_TICK, 0x1}, + {OP_WR_FPGA, CSDM_REG_TIMER_TICK, 0xa}, +-#define CSDM_COMMON_END 444 +-#define USDM_COMMON_START 444 ++#define CSDM_COMMON_END 473 ++#define USDM_COMMON_START 473 + {OP_WR_E1, USDM_REG_CFC_RSP_START_ADDR, 0xa11}, + {OP_WR_E1H, USDM_REG_CFC_RSP_START_ADDR, 0x411}, + {OP_WR_E1, USDM_REG_CMP_COUNTER_START_ADDR, 0xa00}, +@@ -568,9 +597,14 @@ + {OP_WR, USDM_REG_AGG_INT_EVENT_1, 0x5}, + {OP_WR, USDM_REG_AGG_INT_EVENT_2, 0x34}, + {OP_WR, USDM_REG_AGG_INT_EVENT_3, 0x35}, +- {OP_ZR, USDM_REG_AGG_INT_EVENT_4, 0x5c}, ++ {OP_ZR_E1, USDM_REG_AGG_INT_EVENT_4, 0x5c}, ++ {OP_WR_E1H, USDM_REG_AGG_INT_EVENT_4, 0x7}, ++ {OP_ZR_E1H, USDM_REG_AGG_INT_EVENT_5, 0x5b}, + {OP_WR, USDM_REG_AGG_INT_MODE_0, 0x1}, +- {OP_ZR, USDM_REG_AGG_INT_MODE_1, 0x1f}, ++ {OP_ZR_E1, USDM_REG_AGG_INT_MODE_1, 0x1f}, ++ {OP_ZR_E1H, USDM_REG_AGG_INT_MODE_1, 0x3}, ++ {OP_WR_E1H, USDM_REG_AGG_INT_MODE_4, 0x1}, ++ {OP_ZR_E1H, USDM_REG_AGG_INT_MODE_5, 0x1b}, + {OP_WR, USDM_REG_ENABLE_IN1, 0x7ffffff}, + {OP_WR, USDM_REG_ENABLE_IN2, 0x3f}, + {OP_WR, USDM_REG_ENABLE_OUT1, 0x7ffffff}, +@@ -594,8 +628,8 @@ + {OP_WR_ASIC, USDM_REG_TIMER_TICK, 0x3e8}, + {OP_WR_EMUL, USDM_REG_TIMER_TICK, 0x1}, + {OP_WR_FPGA, USDM_REG_TIMER_TICK, 0xa}, +-#define USDM_COMMON_END 486 +-#define CCM_COMMON_START 486 ++#define USDM_COMMON_END 520 ++#define CCM_COMMON_START 520 + {OP_WR, CCM_REG_XX_OVFL_EVNT_ID, 0x32}, + {OP_WR, CCM_REG_CQM_CCM_HDR_P, 0x2150020}, + {OP_WR, CCM_REG_CQM_CCM_HDR_S, 0x2150020}, +@@ -620,8 +654,8 @@ + {OP_WR, CCM_REG_XX_INIT_CRD, 0x3}, + {OP_WR, CCM_REG_XX_MSG_NUM, 0x18}, + {OP_ZR, CCM_REG_XX_TABLE, 0x12}, +- {OP_SW_E1, CCM_REG_XX_DESCR_TABLE, 0x240238}, +- {OP_SW_E1H, CCM_REG_XX_DESCR_TABLE, 0x240254}, ++ {OP_SW_E1, CCM_REG_XX_DESCR_TABLE, 0x240242}, ++ {OP_SW_E1H, CCM_REG_XX_DESCR_TABLE, 0x24027c}, + {OP_WR, CCM_REG_N_SM_CTX_LD_0, 0x1}, + {OP_WR, CCM_REG_N_SM_CTX_LD_1, 0x2}, + {OP_WR, CCM_REG_N_SM_CTX_LD_2, 0x8}, +@@ -657,8 +691,8 @@ + {OP_WR, CCM_REG_CDU_SM_WR_IFEN, 0x1}, + {OP_WR, CCM_REG_CDU_SM_RD_IFEN, 0x1}, + {OP_WR, CCM_REG_CCM_CFC_IFEN, 0x1}, +-#define CCM_COMMON_END 547 +-#define CCM_FUNC0_START 547 ++#define CCM_COMMON_END 581 ++#define CCM_FUNC0_START 581 + {OP_WR_E1H, CCM_REG_QOS_PHYS_QNUM0_0, 0x9}, + {OP_WR_E1H, CCM_REG_QOS_PHYS_QNUM1_0, 0xa}, + {OP_WR_E1H, CCM_REG_QOS_PHYS_QNUM2_0, 0x7}, +@@ -666,8 +700,8 @@ + {OP_WR_E1H, CCM_REG_PHYS_QNUM1_0, 0xc}, + {OP_WR_E1H, CCM_REG_PHYS_QNUM2_0, 0xb}, + {OP_WR_E1H, CCM_REG_PHYS_QNUM3_0, 0x7}, +-#define CCM_FUNC0_END 554 +-#define CCM_FUNC1_START 554 ++#define CCM_FUNC0_END 588 ++#define CCM_FUNC1_START 588 + {OP_WR_E1H, CCM_REG_QOS_PHYS_QNUM0_1, 0x29}, + {OP_WR_E1H, CCM_REG_QOS_PHYS_QNUM1_1, 0x2a}, + {OP_WR_E1H, CCM_REG_QOS_PHYS_QNUM2_1, 0x27}, +@@ -675,8 +709,8 @@ + {OP_WR_E1H, CCM_REG_PHYS_QNUM1_1, 0x2c}, + {OP_WR_E1H, CCM_REG_PHYS_QNUM2_1, 0x2b}, + {OP_WR_E1H, CCM_REG_PHYS_QNUM3_1, 0x27}, +-#define CCM_FUNC1_END 561 +-#define CCM_FUNC2_START 561 ++#define CCM_FUNC1_END 595 ++#define CCM_FUNC2_START 595 + {OP_WR_E1H, CCM_REG_QOS_PHYS_QNUM0_0, 0x19}, + {OP_WR_E1H, CCM_REG_QOS_PHYS_QNUM1_0, 0x1a}, + {OP_WR_E1H, CCM_REG_QOS_PHYS_QNUM2_0, 0x17}, +@@ -684,8 +718,8 @@ + {OP_WR_E1H, CCM_REG_PHYS_QNUM1_0, 0x1c}, + {OP_WR_E1H, CCM_REG_PHYS_QNUM2_0, 0x1b}, + {OP_WR_E1H, CCM_REG_PHYS_QNUM3_0, 0x17}, +-#define CCM_FUNC2_END 568 +-#define CCM_FUNC3_START 568 ++#define CCM_FUNC2_END 602 ++#define CCM_FUNC3_START 602 + {OP_WR_E1H, CCM_REG_QOS_PHYS_QNUM0_1, 0x39}, + {OP_WR_E1H, CCM_REG_QOS_PHYS_QNUM1_1, 0x3a}, + {OP_WR_E1H, CCM_REG_QOS_PHYS_QNUM2_1, 0x37}, +@@ -693,8 +727,8 @@ + {OP_WR_E1H, CCM_REG_PHYS_QNUM1_1, 0x3c}, + {OP_WR_E1H, CCM_REG_PHYS_QNUM2_1, 0x3b}, + {OP_WR_E1H, CCM_REG_PHYS_QNUM3_1, 0x37}, +-#define CCM_FUNC3_END 575 +-#define CCM_FUNC4_START 575 ++#define CCM_FUNC3_END 609 ++#define CCM_FUNC4_START 609 + {OP_WR_E1H, CCM_REG_QOS_PHYS_QNUM0_0, 0x49}, + {OP_WR_E1H, CCM_REG_QOS_PHYS_QNUM1_0, 0x4a}, + {OP_WR_E1H, CCM_REG_QOS_PHYS_QNUM2_0, 0x47}, +@@ -702,8 +736,8 @@ + {OP_WR_E1H, CCM_REG_PHYS_QNUM1_0, 0x4c}, + {OP_WR_E1H, CCM_REG_PHYS_QNUM2_0, 0x4b}, + {OP_WR_E1H, CCM_REG_PHYS_QNUM3_0, 0x47}, +-#define CCM_FUNC4_END 582 +-#define CCM_FUNC5_START 582 ++#define CCM_FUNC4_END 616 ++#define CCM_FUNC5_START 616 + {OP_WR_E1H, CCM_REG_QOS_PHYS_QNUM0_1, 0x69}, + {OP_WR_E1H, CCM_REG_QOS_PHYS_QNUM1_1, 0x6a}, + {OP_WR_E1H, CCM_REG_QOS_PHYS_QNUM2_1, 0x67}, +@@ -711,8 +745,8 @@ + {OP_WR_E1H, CCM_REG_PHYS_QNUM1_1, 0x6c}, + {OP_WR_E1H, CCM_REG_PHYS_QNUM2_1, 0x6b}, + {OP_WR_E1H, CCM_REG_PHYS_QNUM3_1, 0x67}, +-#define CCM_FUNC5_END 589 +-#define CCM_FUNC6_START 589 ++#define CCM_FUNC5_END 623 ++#define CCM_FUNC6_START 623 + {OP_WR_E1H, CCM_REG_QOS_PHYS_QNUM0_0, 0x59}, + {OP_WR_E1H, CCM_REG_QOS_PHYS_QNUM1_0, 0x5a}, + {OP_WR_E1H, CCM_REG_QOS_PHYS_QNUM2_0, 0x57}, +@@ -720,8 +754,8 @@ + {OP_WR_E1H, CCM_REG_PHYS_QNUM1_0, 0x5c}, + {OP_WR_E1H, CCM_REG_PHYS_QNUM2_0, 0x5b}, + {OP_WR_E1H, CCM_REG_PHYS_QNUM3_0, 0x57}, +-#define CCM_FUNC6_END 596 +-#define CCM_FUNC7_START 596 ++#define CCM_FUNC6_END 630 ++#define CCM_FUNC7_START 630 + {OP_WR_E1H, CCM_REG_QOS_PHYS_QNUM0_1, 0x79}, + {OP_WR_E1H, CCM_REG_QOS_PHYS_QNUM1_1, 0x7a}, + {OP_WR_E1H, CCM_REG_QOS_PHYS_QNUM2_1, 0x77}, +@@ -729,8 +763,8 @@ + {OP_WR_E1H, CCM_REG_PHYS_QNUM1_1, 0x7c}, + {OP_WR_E1H, CCM_REG_PHYS_QNUM2_1, 0x7b}, + {OP_WR_E1H, CCM_REG_PHYS_QNUM3_1, 0x77}, +-#define CCM_FUNC7_END 603 +-#define UCM_COMMON_START 603 ++#define CCM_FUNC7_END 637 ++#define UCM_COMMON_START 637 + {OP_WR, UCM_REG_XX_OVFL_EVNT_ID, 0x32}, + {OP_WR, UCM_REG_UQM_UCM_HDR_P, 0x2150020}, + {OP_WR, UCM_REG_UQM_UCM_HDR_S, 0x2150020}, +@@ -756,14 +790,14 @@ + {OP_WR, UCM_REG_XX_INIT_CRD, 0xe}, + {OP_WR, UCM_REG_XX_MSG_NUM, 0x1b}, + {OP_ZR, UCM_REG_XX_TABLE, 0x12}, +- {OP_SW_E1, UCM_REG_XX_DESCR_TABLE, 0x1b025c}, +- {OP_SW_E1H, UCM_REG_XX_DESCR_TABLE, 0x1b0278}, ++ {OP_SW_E1, UCM_REG_XX_DESCR_TABLE, 0x1b0266}, ++ {OP_SW_E1H, UCM_REG_XX_DESCR_TABLE, 0x1b02a0}, + {OP_WR, UCM_REG_N_SM_CTX_LD_0, 0x10}, + {OP_WR, UCM_REG_N_SM_CTX_LD_1, 0x7}, + {OP_WR, UCM_REG_N_SM_CTX_LD_2, 0xf}, + {OP_WR, UCM_REG_N_SM_CTX_LD_3, 0x10}, + {OP_ZR_E1, UCM_REG_N_SM_CTX_LD_4, 0x4}, +- {OP_WR_E1H, UCM_REG_N_SM_CTX_LD_4, 0xd}, ++ {OP_WR_E1H, UCM_REG_N_SM_CTX_LD_4, 0xb}, + {OP_ZR_E1H, UCM_REG_N_SM_CTX_LD_5, 0x3}, + {OP_WR, UCM_REG_UCM_REG0_SZ, 0x3}, + {OP_WR_E1, UCM_REG_PHYS_QNUM0_0, 0xf}, +@@ -787,56 +821,56 @@ + {OP_WR, UCM_REG_CDU_SM_WR_IFEN, 0x1}, + {OP_WR, UCM_REG_CDU_SM_RD_IFEN, 0x1}, + {OP_WR, UCM_REG_UCM_CFC_IFEN, 0x1}, +-#define UCM_COMMON_END 659 +-#define UCM_FUNC0_START 659 ++#define UCM_COMMON_END 693 ++#define UCM_FUNC0_START 693 + {OP_WR_E1H, UCM_REG_PHYS_QNUM0_0, 0xf}, + {OP_WR_E1H, UCM_REG_PHYS_QNUM1_0, 0xe}, + {OP_WR_E1H, UCM_REG_PHYS_QNUM2_0, 0x0}, + {OP_WR_E1H, UCM_REG_PHYS_QNUM3_0, 0x0}, +-#define UCM_FUNC0_END 663 +-#define UCM_FUNC1_START 663 ++#define UCM_FUNC0_END 697 ++#define UCM_FUNC1_START 697 + {OP_WR_E1H, UCM_REG_PHYS_QNUM0_1, 0x2f}, + {OP_WR_E1H, UCM_REG_PHYS_QNUM1_1, 0x2e}, + {OP_WR_E1H, UCM_REG_PHYS_QNUM2_1, 0x0}, + {OP_WR_E1H, UCM_REG_PHYS_QNUM3_1, 0x0}, +-#define UCM_FUNC1_END 667 +-#define UCM_FUNC2_START 667 ++#define UCM_FUNC1_END 701 ++#define UCM_FUNC2_START 701 + {OP_WR_E1H, UCM_REG_PHYS_QNUM0_0, 0x1f}, + {OP_WR_E1H, UCM_REG_PHYS_QNUM1_0, 0x1e}, + {OP_WR_E1H, UCM_REG_PHYS_QNUM2_0, 0x0}, + {OP_WR_E1H, UCM_REG_PHYS_QNUM3_0, 0x0}, +-#define UCM_FUNC2_END 671 +-#define UCM_FUNC3_START 671 ++#define UCM_FUNC2_END 705 ++#define UCM_FUNC3_START 705 + {OP_WR_E1H, UCM_REG_PHYS_QNUM0_1, 0x3f}, + {OP_WR_E1H, UCM_REG_PHYS_QNUM1_1, 0x3e}, + {OP_WR_E1H, UCM_REG_PHYS_QNUM2_1, 0x0}, + {OP_WR_E1H, UCM_REG_PHYS_QNUM3_1, 0x0}, +-#define UCM_FUNC3_END 675 +-#define UCM_FUNC4_START 675 ++#define UCM_FUNC3_END 709 ++#define UCM_FUNC4_START 709 + {OP_WR_E1H, UCM_REG_PHYS_QNUM0_0, 0x4f}, + {OP_WR_E1H, UCM_REG_PHYS_QNUM1_0, 0x4e}, + {OP_WR_E1H, UCM_REG_PHYS_QNUM2_0, 0x0}, + {OP_WR_E1H, UCM_REG_PHYS_QNUM3_0, 0x0}, +-#define UCM_FUNC4_END 679 +-#define UCM_FUNC5_START 679 ++#define UCM_FUNC4_END 713 ++#define UCM_FUNC5_START 713 + {OP_WR_E1H, UCM_REG_PHYS_QNUM0_1, 0x6f}, + {OP_WR_E1H, UCM_REG_PHYS_QNUM1_1, 0x6e}, + {OP_WR_E1H, UCM_REG_PHYS_QNUM2_1, 0x0}, + {OP_WR_E1H, UCM_REG_PHYS_QNUM3_1, 0x0}, +-#define UCM_FUNC5_END 683 +-#define UCM_FUNC6_START 683 ++#define UCM_FUNC5_END 717 ++#define UCM_FUNC6_START 717 + {OP_WR_E1H, UCM_REG_PHYS_QNUM0_0, 0x5f}, + {OP_WR_E1H, UCM_REG_PHYS_QNUM1_0, 0x5e}, + {OP_WR_E1H, UCM_REG_PHYS_QNUM2_0, 0x0}, + {OP_WR_E1H, UCM_REG_PHYS_QNUM3_0, 0x0}, +-#define UCM_FUNC6_END 687 +-#define UCM_FUNC7_START 687 ++#define UCM_FUNC6_END 721 ++#define UCM_FUNC7_START 721 + {OP_WR_E1H, UCM_REG_PHYS_QNUM0_1, 0x7f}, + {OP_WR_E1H, UCM_REG_PHYS_QNUM1_1, 0x7e}, + {OP_WR_E1H, UCM_REG_PHYS_QNUM2_1, 0x0}, + {OP_WR_E1H, UCM_REG_PHYS_QNUM3_1, 0x0}, +-#define UCM_FUNC7_END 691 +-#define USEM_COMMON_START 691 ++#define UCM_FUNC7_END 725 ++#define USEM_COMMON_START 725 + {OP_RD, USEM_REG_MSG_NUM_FIC0, 0x0}, + {OP_RD, USEM_REG_MSG_NUM_FIC1, 0x0}, + {OP_RD, USEM_REG_MSG_NUM_FOC0, 0x0}, +@@ -887,69 +921,78 @@ + {OP_WR_ASIC, USEM_REG_FAST_MEMORY + 0x18380, 0x1dcd6500}, + {OP_WR_EMUL, USEM_REG_FAST_MEMORY + 0x18380, 0x4c4b4}, + {OP_WR_FPGA, USEM_REG_FAST_MEMORY + 0x18380, 0x4c4b40}, +- {OP_ZR_E1, USEM_REG_FAST_MEMORY + 0x5000, 0x102}, ++ {OP_ZR_E1, USEM_REG_FAST_MEMORY + 0x5000, 0xc2}, + {OP_WR_EMUL_E1H, USEM_REG_FAST_MEMORY + 0x11480, 0x0}, + {OP_ZR_E1, USEM_REG_FAST_MEMORY + 0x1020, 0xc8}, + {OP_WR_E1H, USEM_REG_FAST_MEMORY + 0x11480, 0x1}, + {OP_ZR_E1, USEM_REG_FAST_MEMORY + 0x1000, 0x2}, + {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x2000, 0x102}, +- {OP_ZR_E1, USEM_REG_FAST_MEMORY + 0x57e8, 0x4}, +- {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x8020, 0xc8}, +- {OP_ZR_E1, USEM_REG_FAST_MEMORY + 0x57d0, 0x5}, +- {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x8000, 0x2}, +- {OP_SW_E1, USEM_REG_FAST_MEMORY + 0x57d0 + 0x14, 0x10277}, +- {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x3760, 0x4}, +- {OP_ZR_E1, USEM_REG_FAST_MEMORY + 0x1e20, 0x42}, +- {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x3738, 0x9}, ++ {OP_ZR_E1, USEM_REG_FAST_MEMORY + 0x4f00, 0x40}, ++ {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x8980, 0xc8}, ++ {OP_ZR_E1, USEM_REG_FAST_MEMORY + 0x57f0, 0x4}, ++ {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x8960, 0x2}, ++ {OP_ZR_E1, USEM_REG_FAST_MEMORY + 0x57d8, 0x5}, ++ {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x3228, 0x4}, ++ {OP_SW_E1, USEM_REG_FAST_MEMORY + 0x57d8 + 0x14, 0x10281}, ++ {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x3200, 0x9}, ++ {OP_ZR_E1, USEM_REG_FAST_MEMORY + 0x1c60, 0x20}, ++ {OP_SW_E1H, USEM_REG_FAST_MEMORY + 0x3200 + 0x24, 0x102bb}, + {OP_ZR_E1, USEM_REG_FAST_MEMORY + 0x4b68, 0x2}, +- {OP_SW_E1H, USEM_REG_FAST_MEMORY + 0x3738 + 0x24, 0x10293}, +- {OP_SW_E1, USEM_REG_FAST_MEMORY + 0x4b68 + 0x8, 0x20278}, +- {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x3180, 0x42}, ++ {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x3180, 0x20}, ++ {OP_SW_E1, USEM_REG_FAST_MEMORY + 0x4b68 + 0x8, 0x20282}, ++ {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x5000, 0x400}, + {OP_ZR_E1, USEM_REG_FAST_MEMORY + 0x4b10, 0x2}, +- {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x5000, 0x400}, +- {OP_SW_E1, USEM_REG_FAST_MEMORY + 0x2830, 0x2027a}, + {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x4000, 0x2}, +- {OP_SW_E1H, USEM_REG_FAST_MEMORY + 0x4000 + 0x8, 0x20294}, ++ {OP_SW_E1, USEM_REG_FAST_MEMORY + 0x2830, 0x20284}, ++ {OP_SW_E1H, USEM_REG_FAST_MEMORY + 0x4000 + 0x8, 0x102bc}, ++ {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x4000 + 0xc, 0x3}, + {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x6b68, 0x2}, +- {OP_SW_E1H, USEM_REG_FAST_MEMORY + 0x6b68 + 0x8, 0x20296}, ++ {OP_SW_E1H, USEM_REG_FAST_MEMORY + 0x6b68 + 0x8, 0x202bd}, + {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x6b10, 0x2}, +- {OP_SW_E1H, USEM_REG_FAST_MEMORY + 0x74c0, 0x20298}, ++ {OP_SW_E1H, USEM_REG_FAST_MEMORY + 0x74c0, 0x202bf}, + {OP_WR, USEM_REG_FAST_MEMORY + 0x10800, 0x1000000}, +- {OP_SW_E1, USEM_REG_FAST_MEMORY + 0x10c00, 0x10027c}, +- {OP_SW_E1H, USEM_REG_FAST_MEMORY + 0x10c00, 0x10029a}, ++ {OP_SW_E1, USEM_REG_FAST_MEMORY + 0x10c00, 0x100286}, ++ {OP_SW_E1H, USEM_REG_FAST_MEMORY + 0x10c00, 0x1002c1}, + {OP_WR, USEM_REG_FAST_MEMORY + 0x10800, 0x0}, +- {OP_SW_E1, USEM_REG_FAST_MEMORY + 0x10c40, 0x10028c}, +- {OP_SW_E1H, USEM_REG_FAST_MEMORY + 0x10c40, 0x1002aa}, +- {OP_ZP_E1, USEM_REG_INT_TABLE, 0xc20000}, +- {OP_ZP_E1H, USEM_REG_INT_TABLE, 0xc40000}, +- {OP_WR_64_E1, USEM_REG_INT_TABLE + 0x368, 0x13029c}, +- {OP_WR_64_E1H, USEM_REG_INT_TABLE + 0x368, 0x1302ba}, +- {OP_ZP_E1, USEM_REG_PRAM, 0x311c0000}, +- {OP_ZP_E1H, USEM_REG_PRAM, 0x31070000}, +- {OP_ZP_E1, USEM_REG_PRAM + 0x8000, 0x33450c47}, +- {OP_ZP_E1H, USEM_REG_PRAM + 0x8000, 0x330e0c42}, +- {OP_ZP_E1, USEM_REG_PRAM + 0x10000, 0x38561919}, +- {OP_ZP_E1H, USEM_REG_PRAM + 0x10000, 0x389b1906}, +- {OP_WR_64_E1, USEM_REG_PRAM + 0x17fe0, 0x5004029e}, +- {OP_ZP_E1H, USEM_REG_PRAM + 0x18000, 0x132272d}, +- {OP_WR_64_E1H, USEM_REG_PRAM + 0x18250, 0x4fb602bc}, +-#define USEM_COMMON_END 787 +-#define USEM_PORT0_START 787 ++ {OP_SW_E1, USEM_REG_FAST_MEMORY + 0x10c40, 0x100296}, ++ {OP_SW_E1H, USEM_REG_FAST_MEMORY + 0x10c40, 0x1002d1}, ++ {OP_ZP_E1, USEM_REG_INT_TABLE, 0xc50000}, ++ {OP_ZP_E1H, USEM_REG_INT_TABLE, 0xcd0000}, ++ {OP_WR_64_E1, USEM_REG_INT_TABLE + 0x368, 0x1302a6}, ++ {OP_WR_64_E1H, USEM_REG_INT_TABLE + 0x3a8, 0xb02e1}, ++ {OP_ZP_E1, USEM_REG_PRAM, 0x31fb0000}, ++ {OP_ZP_E1H, USEM_REG_PRAM, 0x32200000}, ++ {OP_ZP_E1, USEM_REG_PRAM + 0x8000, 0x36490c7f}, ++ {OP_ZP_E1H, USEM_REG_PRAM + 0x8000, 0x36020c88}, ++ {OP_ZP_E1, USEM_REG_PRAM + 0x10000, 0x358d1a12}, ++ {OP_ZP_E1H, USEM_REG_PRAM + 0x10000, 0x33b61a09}, ++ {OP_ZP_E1, USEM_REG_PRAM + 0x18000, 0x4152776}, ++ {OP_ZP_E1H, USEM_REG_PRAM + 0x18000, 0x26a126f7}, ++ {OP_WR_64_E1, USEM_REG_PRAM + 0x188b0, 0x4eea02a8}, ++ {OP_ZP_E1H, USEM_REG_PRAM + 0x20000, 0x71230a0}, ++ {OP_WR_64_E1H, USEM_REG_PRAM + 0x20e70, 0x3e3202e3}, ++#define USEM_COMMON_END 825 ++#define USEM_PORT0_START 825 + {OP_ZR_E1, USEM_REG_FAST_MEMORY + 0x1400, 0xa0}, + {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x9000, 0xa0}, +- {OP_ZR_E1, USEM_REG_FAST_MEMORY + 0x1900, 0xa}, +- {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x9500, 0x28}, +- {OP_ZR_E1, USEM_REG_FAST_MEMORY + 0x1950, 0x2e}, +- {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x9640, 0x34}, +- {OP_ZR_E1, USEM_REG_FAST_MEMORY + 0x1d00, 0x4}, ++ {OP_ZR_E1, USEM_REG_FAST_MEMORY + 0x1900, 0x10}, ++ {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x9500, 0x40}, ++ {OP_ZR_E1, USEM_REG_FAST_MEMORY + 0x1980, 0x30}, ++ {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x9700, 0x3c}, ++ {OP_ZR_E1, USEM_REG_FAST_MEMORY + 0x1d80, 0x48}, ++ {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x2450, 0x48}, ++ {OP_WR_E1, USEM_REG_FAST_MEMORY + 0x1fd0, 0x0}, ++ {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x2770, 0x2}, ++ {OP_ZR_E1, USEM_REG_FAST_MEMORY + 0x1b40, 0x4}, + {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x3080, 0x20}, +- {OP_ZR_E1, USEM_REG_FAST_MEMORY + 0x1d20, 0x20}, +- {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x3288, 0x96}, +- {OP_ZR_E1, USEM_REG_FAST_MEMORY + 0x5440, 0x72}, ++ {OP_ZR_E1, USEM_REG_FAST_MEMORY + 0x1b60, 0x20}, ++ {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x8000, 0x12c}, ++ {OP_ZR_E1, USEM_REG_FAST_MEMORY + 0x5318, 0x98}, ++ {OP_WR_E1H, USEM_REG_FAST_MEMORY + 0x3238, 0x0}, ++ {OP_ZR_E1, USEM_REG_FAST_MEMORY + 0x4b78, 0x52}, + {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x5000, 0x20}, +- {OP_ZR_E1, USEM_REG_FAST_MEMORY + 0x4b78, 0x52}, ++ {OP_ZR_E1, USEM_REG_FAST_MEMORY + 0x4e08, 0xc}, + {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x5100, 0x20}, +- {OP_ZR_E1, USEM_REG_FAST_MEMORY + 0x4e08, 0xc}, + {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x5200, 0x20}, + {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x5300, 0x20}, + {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x5400, 0x20}, +@@ -966,23 +1009,28 @@ + {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x5f00, 0x20}, + {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x6b78, 0x52}, + {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x6e08, 0xc}, +-#define USEM_PORT0_END 818 +-#define USEM_PORT1_START 818 ++#define USEM_PORT0_END 861 ++#define USEM_PORT1_START 861 + {OP_ZR_E1, USEM_REG_FAST_MEMORY + 0x1680, 0xa0}, + {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x9280, 0xa0}, +- {OP_ZR_E1, USEM_REG_FAST_MEMORY + 0x1928, 0xa}, +- {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x95a0, 0x28}, +- {OP_ZR_E1, USEM_REG_FAST_MEMORY + 0x1a08, 0x2e}, +- {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x9710, 0x34}, +- {OP_ZR_E1, USEM_REG_FAST_MEMORY + 0x1d10, 0x4}, ++ {OP_ZR_E1, USEM_REG_FAST_MEMORY + 0x1940, 0x10}, ++ {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x9600, 0x40}, ++ {OP_ZR_E1, USEM_REG_FAST_MEMORY + 0x1a40, 0x30}, ++ {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x97f0, 0x3c}, ++ {OP_ZR_E1, USEM_REG_FAST_MEMORY + 0x1ea0, 0x48}, ++ {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x2570, 0x48}, ++ {OP_WR_E1, USEM_REG_FAST_MEMORY + 0x1fd4, 0x0}, ++ {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x2778, 0x2}, ++ {OP_ZR_E1, USEM_REG_FAST_MEMORY + 0x1b50, 0x4}, + {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x3100, 0x20}, +- {OP_ZR_E1, USEM_REG_FAST_MEMORY + 0x1da0, 0x20}, +- {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x34e0, 0x96}, +- {OP_ZR_E1, USEM_REG_FAST_MEMORY + 0x5608, 0x72}, ++ {OP_ZR_E1, USEM_REG_FAST_MEMORY + 0x1be0, 0x20}, ++ {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x84b0, 0x12c}, ++ {OP_ZR_E1, USEM_REG_FAST_MEMORY + 0x5578, 0x98}, ++ {OP_WR_E1H, USEM_REG_FAST_MEMORY + 0x323c, 0x0}, ++ {OP_ZR_E1, USEM_REG_FAST_MEMORY + 0x4cc0, 0x52}, + {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x5080, 0x20}, +- {OP_ZR_E1, USEM_REG_FAST_MEMORY + 0x4cc0, 0x52}, ++ {OP_ZR_E1, USEM_REG_FAST_MEMORY + 0x4e38, 0xc}, + {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x5180, 0x20}, +- {OP_ZR_E1, USEM_REG_FAST_MEMORY + 0x4e38, 0xc}, + {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x5280, 0x20}, + {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x5380, 0x20}, + {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x5480, 0x20}, +@@ -999,40 +1047,48 @@ + {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x5f80, 0x20}, + {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x6cc0, 0x52}, + {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x6e38, 0xc}, +-#define USEM_PORT1_END 849 +-#define USEM_FUNC0_START 849 ++#define USEM_PORT1_END 897 ++#define USEM_FUNC0_START 897 ++ {OP_WR_E1H, USEM_REG_FAST_MEMORY + 0x26d0, 0x0}, + {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x3000, 0x4}, +- {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x4010, 0x2}, +-#define USEM_FUNC0_END 851 +-#define USEM_FUNC1_START 851 ++ {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x4018, 0x2}, ++#define USEM_FUNC0_END 900 ++#define USEM_FUNC1_START 900 ++ {OP_WR_E1H, USEM_REG_FAST_MEMORY + 0x26d4, 0x0}, + {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x3010, 0x4}, +- {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x4020, 0x2}, +-#define USEM_FUNC1_END 853 +-#define USEM_FUNC2_START 853 ++ {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x4028, 0x2}, ++#define USEM_FUNC1_END 903 ++#define USEM_FUNC2_START 903 ++ {OP_WR_E1H, USEM_REG_FAST_MEMORY + 0x26d8, 0x0}, + {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x3020, 0x4}, +- {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x4030, 0x2}, +-#define USEM_FUNC2_END 855 +-#define USEM_FUNC3_START 855 ++ {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x4038, 0x2}, ++#define USEM_FUNC2_END 906 ++#define USEM_FUNC3_START 906 ++ {OP_WR_E1H, USEM_REG_FAST_MEMORY + 0x26dc, 0x0}, + {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x3030, 0x4}, +- {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x4040, 0x2}, +-#define USEM_FUNC3_END 857 +-#define USEM_FUNC4_START 857 ++ {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x4048, 0x2}, ++#define USEM_FUNC3_END 909 ++#define USEM_FUNC4_START 909 ++ {OP_WR_E1H, USEM_REG_FAST_MEMORY + 0x26e0, 0x0}, + {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x3040, 0x4}, +- {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x4050, 0x2}, +-#define USEM_FUNC4_END 859 +-#define USEM_FUNC5_START 859 ++ {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x4058, 0x2}, ++#define USEM_FUNC4_END 912 ++#define USEM_FUNC5_START 912 ++ {OP_WR_E1H, USEM_REG_FAST_MEMORY + 0x26e4, 0x0}, + {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x3050, 0x4}, +- {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x4060, 0x2}, +-#define USEM_FUNC5_END 861 +-#define USEM_FUNC6_START 861 ++ {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x4068, 0x2}, ++#define USEM_FUNC5_END 915 ++#define USEM_FUNC6_START 915 ++ {OP_WR_E1H, USEM_REG_FAST_MEMORY + 0x26e8, 0x0}, + {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x3060, 0x4}, +- {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x4070, 0x2}, +-#define USEM_FUNC6_END 863 +-#define USEM_FUNC7_START 863 ++ {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x4078, 0x2}, ++#define USEM_FUNC6_END 918 ++#define USEM_FUNC7_START 918 ++ {OP_WR_E1H, USEM_REG_FAST_MEMORY + 0x26ec, 0x0}, + {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x3070, 0x4}, +- {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x4080, 0x2}, +-#define USEM_FUNC7_END 865 +-#define CSEM_COMMON_START 865 ++ {OP_ZR_E1H, USEM_REG_FAST_MEMORY + 0x4088, 0x2}, ++#define USEM_FUNC7_END 921 ++#define CSEM_COMMON_START 921 + {OP_RD, CSEM_REG_MSG_NUM_FIC0, 0x0}, + {OP_RD, CSEM_REG_MSG_NUM_FIC1, 0x0}, + {OP_RD, CSEM_REG_MSG_NUM_FOC0, 0x0}, +@@ -1091,29 +1147,29 @@ + {OP_WR_E1H, CSEM_REG_FAST_MEMORY + 0x11e8, 0x0}, + {OP_ZR_E1, CSEM_REG_FAST_MEMORY + 0x25c0, 0x240}, + {OP_ZR_E1H, CSEM_REG_FAST_MEMORY + 0x3000, 0xc0}, +- {OP_SW_E1, CSEM_REG_FAST_MEMORY + 0x2ec8, 0x802a0}, ++ {OP_SW_E1, CSEM_REG_FAST_MEMORY + 0x2ec8, 0x802aa}, + {OP_ZR_E1H, CSEM_REG_FAST_MEMORY + 0x4070, 0x80}, + {OP_ZR_E1H, CSEM_REG_FAST_MEMORY + 0x5280, 0x4}, + {OP_ZR_E1H, CSEM_REG_FAST_MEMORY + 0x6280, 0x240}, +- {OP_SW_E1H, CSEM_REG_FAST_MEMORY + 0x6b88, 0x2002be}, ++ {OP_SW_E1H, CSEM_REG_FAST_MEMORY + 0x6b88, 0x2002e5}, + {OP_WR, CSEM_REG_FAST_MEMORY + 0x10800, 0x13fffff}, +- {OP_SW_E1, CSEM_REG_FAST_MEMORY + 0x10c00, 0x1002a8}, +- {OP_SW_E1H, CSEM_REG_FAST_MEMORY + 0x10c00, 0x1002de}, ++ {OP_SW_E1, CSEM_REG_FAST_MEMORY + 0x10c00, 0x1002b2}, ++ {OP_SW_E1H, CSEM_REG_FAST_MEMORY + 0x10c00, 0x100305}, + {OP_WR, CSEM_REG_FAST_MEMORY + 0x10800, 0x0}, +- {OP_SW_E1, CSEM_REG_FAST_MEMORY + 0x10c40, 0x1002b8}, +- {OP_SW_E1H, CSEM_REG_FAST_MEMORY + 0x10c40, 0x1002ee}, +- {OP_ZP_E1, CSEM_REG_INT_TABLE, 0x6e0000}, +- {OP_ZP_E1H, CSEM_REG_INT_TABLE, 0x6f0000}, +- {OP_WR_64_E1, CSEM_REG_INT_TABLE + 0x380, 0x1002c8}, +- {OP_WR_64_E1H, CSEM_REG_INT_TABLE + 0x380, 0x1002fe}, +- {OP_ZP_E1, CSEM_REG_PRAM, 0x32580000}, +- {OP_ZP_E1H, CSEM_REG_PRAM, 0x31fa0000}, +- {OP_ZP_E1, CSEM_REG_PRAM + 0x8000, 0x18270c96}, +- {OP_ZP_E1H, CSEM_REG_PRAM + 0x8000, 0x19040c7f}, +- {OP_WR_64_E1, CSEM_REG_PRAM + 0xb210, 0x682402ca}, +- {OP_WR_64_E1H, CSEM_REG_PRAM + 0xb430, 0x67e00300}, +-#define CSEM_COMMON_END 944 +-#define CSEM_PORT0_START 944 ++ {OP_SW_E1, CSEM_REG_FAST_MEMORY + 0x10c40, 0x1002c2}, ++ {OP_SW_E1H, CSEM_REG_FAST_MEMORY + 0x10c40, 0x100315}, ++ {OP_ZP_E1, CSEM_REG_INT_TABLE, 0x710000}, ++ {OP_ZP_E1H, CSEM_REG_INT_TABLE, 0x740000}, ++ {OP_WR_64_E1, CSEM_REG_INT_TABLE + 0x380, 0x1002d2}, ++ {OP_WR_64_E1H, CSEM_REG_INT_TABLE + 0x380, 0x100325}, ++ {OP_ZP_E1, CSEM_REG_PRAM, 0x32300000}, ++ {OP_ZP_E1H, CSEM_REG_PRAM, 0x321c0000}, ++ {OP_ZP_E1, CSEM_REG_PRAM + 0x8000, 0x229a0c8c}, ++ {OP_ZP_E1H, CSEM_REG_PRAM + 0x8000, 0x23960c87}, ++ {OP_WR_64_E1, CSEM_REG_PRAM + 0xc810, 0x656402d4}, ++ {OP_WR_64_E1H, CSEM_REG_PRAM + 0xca30, 0x65200327}, ++#define CSEM_COMMON_END 1000 ++#define CSEM_PORT0_START 1000 + {OP_ZR_E1, CSEM_REG_FAST_MEMORY + 0x1400, 0xa0}, + {OP_ZR_E1H, CSEM_REG_FAST_MEMORY + 0x8000, 0xa0}, + {OP_ZR_E1, CSEM_REG_FAST_MEMORY + 0x1900, 0x10}, +@@ -1126,8 +1182,8 @@ + {OP_ZR_E1H, CSEM_REG_FAST_MEMORY + 0x6040, 0x30}, + {OP_ZR_E1, CSEM_REG_FAST_MEMORY + 0x3040, 0x6}, + {OP_ZR_E1, CSEM_REG_FAST_MEMORY + 0x2410, 0x30}, +-#define CSEM_PORT0_END 956 +-#define CSEM_PORT1_START 956 ++#define CSEM_PORT0_END 1012 ++#define CSEM_PORT1_START 1012 + {OP_ZR_E1, CSEM_REG_FAST_MEMORY + 0x1680, 0xa0}, + {OP_ZR_E1H, CSEM_REG_FAST_MEMORY + 0x8280, 0xa0}, + {OP_ZR_E1, CSEM_REG_FAST_MEMORY + 0x1940, 0x10}, +@@ -1140,43 +1196,43 @@ + {OP_ZR_E1H, CSEM_REG_FAST_MEMORY + 0x6100, 0x30}, + {OP_ZR_E1, CSEM_REG_FAST_MEMORY + 0x3058, 0x6}, + {OP_ZR_E1, CSEM_REG_FAST_MEMORY + 0x24d0, 0x30}, +-#define CSEM_PORT1_END 968 +-#define CSEM_FUNC0_START 968 ++#define CSEM_PORT1_END 1024 ++#define CSEM_FUNC0_START 1024 + {OP_WR_E1H, CSEM_REG_FAST_MEMORY + 0x1148, 0x0}, + {OP_ZR_E1H, CSEM_REG_FAST_MEMORY + 0x3300, 0x2}, +-#define CSEM_FUNC0_END 970 +-#define CSEM_FUNC1_START 970 ++#define CSEM_FUNC0_END 1026 ++#define CSEM_FUNC1_START 1026 + {OP_WR_E1H, CSEM_REG_FAST_MEMORY + 0x114c, 0x0}, + {OP_ZR_E1H, CSEM_REG_FAST_MEMORY + 0x3308, 0x2}, +-#define CSEM_FUNC1_END 972 +-#define CSEM_FUNC2_START 972 ++#define CSEM_FUNC1_END 1028 ++#define CSEM_FUNC2_START 1028 + {OP_WR_E1H, CSEM_REG_FAST_MEMORY + 0x1150, 0x0}, + {OP_ZR_E1H, CSEM_REG_FAST_MEMORY + 0x3310, 0x2}, +-#define CSEM_FUNC2_END 974 +-#define CSEM_FUNC3_START 974 ++#define CSEM_FUNC2_END 1030 ++#define CSEM_FUNC3_START 1030 + {OP_WR_E1H, CSEM_REG_FAST_MEMORY + 0x1154, 0x0}, + {OP_ZR_E1H, CSEM_REG_FAST_MEMORY + 0x3318, 0x2}, +-#define CSEM_FUNC3_END 976 +-#define CSEM_FUNC4_START 976 ++#define CSEM_FUNC3_END 1032 ++#define CSEM_FUNC4_START 1032 + {OP_WR_E1H, CSEM_REG_FAST_MEMORY + 0x1158, 0x0}, + {OP_ZR_E1H, CSEM_REG_FAST_MEMORY + 0x3320, 0x2}, +-#define CSEM_FUNC4_END 978 +-#define CSEM_FUNC5_START 978 ++#define CSEM_FUNC4_END 1034 ++#define CSEM_FUNC5_START 1034 + {OP_WR_E1H, CSEM_REG_FAST_MEMORY + 0x115c, 0x0}, + {OP_ZR_E1H, CSEM_REG_FAST_MEMORY + 0x3328, 0x2}, +-#define CSEM_FUNC5_END 980 +-#define CSEM_FUNC6_START 980 ++#define CSEM_FUNC5_END 1036 ++#define CSEM_FUNC6_START 1036 + {OP_WR_E1H, CSEM_REG_FAST_MEMORY + 0x1160, 0x0}, + {OP_ZR_E1H, CSEM_REG_FAST_MEMORY + 0x3330, 0x2}, +-#define CSEM_FUNC6_END 982 +-#define CSEM_FUNC7_START 982 ++#define CSEM_FUNC6_END 1038 ++#define CSEM_FUNC7_START 1038 + {OP_WR_E1H, CSEM_REG_FAST_MEMORY + 0x1164, 0x0}, + {OP_ZR_E1H, CSEM_REG_FAST_MEMORY + 0x3338, 0x2}, +-#define CSEM_FUNC7_END 984 +-#define XPB_COMMON_START 984 ++#define CSEM_FUNC7_END 1040 ++#define XPB_COMMON_START 1040 + {OP_WR, GRCBASE_XPB + PB_REG_CONTROL, 0x20}, +-#define XPB_COMMON_END 985 +-#define DQ_COMMON_START 985 ++#define XPB_COMMON_END 1041 ++#define DQ_COMMON_START 1041 + {OP_WR, DORQ_REG_MODE_ACT, 0x2}, + {OP_WR, DORQ_REG_NORM_CID_OFST, 0x3}, + {OP_WR, DORQ_REG_OUTST_REQ, 0x4}, +@@ -1195,8 +1251,8 @@ + {OP_WR, DORQ_REG_DQ_FIFO_AFULL_TH, 0x76c}, + {OP_WR, DORQ_REG_REGN, 0x7c1004}, + {OP_WR, DORQ_REG_IF_EN, 0xf}, +-#define DQ_COMMON_END 1003 +-#define TIMERS_COMMON_START 1003 ++#define DQ_COMMON_END 1059 ++#define TIMERS_COMMON_START 1059 + {OP_ZR, TM_REG_CLIN_PRIOR0_CLIENT, 0x2}, + {OP_WR, TM_REG_LIN_SETCLR_FIFO_ALFULL_THR, 0x1c}, + {OP_WR, TM_REG_CFC_AC_CRDCNT_VAL, 0x1}, +@@ -1219,14 +1275,18 @@ + {OP_WR, TM_REG_EN_CL0_INPUT, 0x1}, + {OP_WR, TM_REG_EN_CL1_INPUT, 0x1}, + {OP_WR, TM_REG_EN_CL2_INPUT, 0x1}, +-#define TIMERS_COMMON_END 1025 +-#define TIMERS_PORT0_START 1025 ++#define TIMERS_COMMON_END 1081 ++#define TIMERS_PORT0_START 1081 ++ {OP_WR, TM_REG_LIN0_LOGIC_ADDR, 0x0}, ++ {OP_WR, TM_REG_LIN0_PHY_ADDR_VALID, 0x0}, + {OP_ZR, TM_REG_LIN0_PHY_ADDR, 0x2}, +-#define TIMERS_PORT0_END 1026 +-#define TIMERS_PORT1_START 1026 ++#define TIMERS_PORT0_END 1084 ++#define TIMERS_PORT1_START 1084 ++ {OP_WR, TM_REG_LIN1_LOGIC_ADDR, 0x0}, ++ {OP_WR, TM_REG_LIN1_PHY_ADDR_VALID, 0x0}, + {OP_ZR, TM_REG_LIN1_PHY_ADDR, 0x2}, +-#define TIMERS_PORT1_END 1027 +-#define XSDM_COMMON_START 1027 ++#define TIMERS_PORT1_END 1087 ++#define XSDM_COMMON_START 1087 + {OP_WR_E1, XSDM_REG_CFC_RSP_START_ADDR, 0x614}, + {OP_WR_E1H, XSDM_REG_CFC_RSP_START_ADDR, 0x424}, + {OP_WR_E1, XSDM_REG_CMP_COUNTER_START_ADDR, 0x600}, +@@ -1274,8 +1334,8 @@ + {OP_WR_ASIC, XSDM_REG_TIMER_TICK, 0x3e8}, + {OP_WR_EMUL, XSDM_REG_TIMER_TICK, 0x1}, + {OP_WR_FPGA, XSDM_REG_TIMER_TICK, 0xa}, +-#define XSDM_COMMON_END 1074 +-#define QM_COMMON_START 1074 ++#define XSDM_COMMON_END 1134 ++#define QM_COMMON_START 1134 + {OP_WR, QM_REG_ACTCTRINITVAL_0, 0x6}, + {OP_WR, QM_REG_ACTCTRINITVAL_1, 0x5}, + {OP_WR, QM_REG_ACTCTRINITVAL_2, 0xa}, +@@ -1576,8 +1636,8 @@ + {OP_WR_E1H, QM_REG_PQ2PCIFUNC_6, 0x5}, + {OP_WR_E1H, QM_REG_PQ2PCIFUNC_7, 0x7}, + {OP_WR, QM_REG_CMINTEN, 0xff}, +-#define QM_COMMON_END 1374 +-#define PBF_COMMON_START 1374 ++#define QM_COMMON_END 1434 ++#define PBF_COMMON_START 1434 + {OP_WR, PBF_REG_INIT, 0x1}, + {OP_WR, PBF_REG_INIT_P4, 0x1}, + {OP_WR, PBF_REG_MAC_LB_ENABLE, 0x1}, +@@ -1585,20 +1645,20 @@ + {OP_WR, PBF_REG_INIT_P4, 0x0}, + {OP_WR, PBF_REG_INIT, 0x0}, + {OP_WR, PBF_REG_DISABLE_NEW_TASK_PROC_P4, 0x0}, +-#define PBF_COMMON_END 1381 +-#define PBF_PORT0_START 1381 ++#define PBF_COMMON_END 1441 ++#define PBF_PORT0_START 1441 + {OP_WR, PBF_REG_INIT_P0, 0x1}, + {OP_WR, PBF_REG_MAC_IF0_ENABLE, 0x1}, + {OP_WR, PBF_REG_INIT_P0, 0x0}, + {OP_WR, PBF_REG_DISABLE_NEW_TASK_PROC_P0, 0x0}, +-#define PBF_PORT0_END 1385 +-#define PBF_PORT1_START 1385 ++#define PBF_PORT0_END 1445 ++#define PBF_PORT1_START 1445 + {OP_WR, PBF_REG_INIT_P1, 0x1}, + {OP_WR, PBF_REG_MAC_IF1_ENABLE, 0x1}, + {OP_WR, PBF_REG_INIT_P1, 0x0}, + {OP_WR, PBF_REG_DISABLE_NEW_TASK_PROC_P1, 0x0}, +-#define PBF_PORT1_END 1389 +-#define XCM_COMMON_START 1389 ++#define PBF_PORT1_END 1449 ++#define XCM_COMMON_START 1449 + {OP_WR, XCM_REG_XX_OVFL_EVNT_ID, 0x32}, + {OP_WR, XCM_REG_XQM_XCM_HDR_P, 0x3150020}, + {OP_WR, XCM_REG_XQM_XCM_HDR_S, 0x3150020}, +@@ -1633,14 +1693,14 @@ + {OP_WR_E1, XCM_REG_XX_MSG_NUM, 0x1f}, + {OP_WR_E1H, XCM_REG_XX_MSG_NUM, 0x20}, + {OP_ZR, XCM_REG_XX_TABLE, 0x12}, +- {OP_SW_E1, XCM_REG_XX_DESCR_TABLE, 0x1f02cc}, +- {OP_SW_E1H, XCM_REG_XX_DESCR_TABLE, 0x1f0302}, ++ {OP_SW_E1, XCM_REG_XX_DESCR_TABLE, 0x1f02d6}, ++ {OP_SW_E1H, XCM_REG_XX_DESCR_TABLE, 0x1f0329}, + {OP_WR, XCM_REG_N_SM_CTX_LD_0, 0xf}, + {OP_WR, XCM_REG_N_SM_CTX_LD_1, 0x7}, + {OP_WR, XCM_REG_N_SM_CTX_LD_2, 0xb}, + {OP_WR, XCM_REG_N_SM_CTX_LD_3, 0xe}, + {OP_ZR_E1, XCM_REG_N_SM_CTX_LD_4, 0x4}, +- {OP_WR_E1H, XCM_REG_N_SM_CTX_LD_4, 0xc}, ++ {OP_WR_E1H, XCM_REG_N_SM_CTX_LD_4, 0xe}, + {OP_ZR_E1H, XCM_REG_N_SM_CTX_LD_5, 0x3}, + {OP_WR, XCM_REG_XCM_REG0_SZ, 0x4}, + {OP_WR, XCM_REG_XCM_STORM0_IFEN, 0x1}, +@@ -1663,8 +1723,8 @@ + {OP_WR, XCM_REG_CDU_SM_WR_IFEN, 0x1}, + {OP_WR, XCM_REG_CDU_SM_RD_IFEN, 0x1}, + {OP_WR, XCM_REG_XCM_CFC_IFEN, 0x1}, +-#define XCM_COMMON_END 1453 +-#define XCM_PORT0_START 1453 ++#define XCM_COMMON_END 1513 ++#define XCM_PORT0_START 1513 + {OP_WR_E1, XCM_REG_GLB_DEL_ACK_TMR_VAL_0, 0xc8}, + {OP_WR_E1, XCM_REG_GLB_DEL_ACK_MAX_CNT_0, 0x2}, + {OP_WR_E1, XCM_REG_WU_DA_SET_TMR_CNT_FLG_CMD00, 0x0}, +@@ -1673,8 +1733,8 @@ + {OP_WR_E1, XCM_REG_WU_DA_CNT_CMD10, 0x2}, + {OP_WR_E1, XCM_REG_WU_DA_CNT_UPD_VAL00, 0xff}, + {OP_WR_E1, XCM_REG_WU_DA_CNT_UPD_VAL10, 0xff}, +-#define XCM_PORT0_END 1461 +-#define XCM_PORT1_START 1461 ++#define XCM_PORT0_END 1521 ++#define XCM_PORT1_START 1521 + {OP_WR_E1, XCM_REG_GLB_DEL_ACK_TMR_VAL_1, 0xc8}, + {OP_WR_E1, XCM_REG_GLB_DEL_ACK_MAX_CNT_1, 0x2}, + {OP_WR_E1, XCM_REG_WU_DA_SET_TMR_CNT_FLG_CMD01, 0x0}, +@@ -1683,8 +1743,8 @@ + {OP_WR_E1, XCM_REG_WU_DA_CNT_CMD11, 0x2}, + {OP_WR_E1, XCM_REG_WU_DA_CNT_UPD_VAL01, 0xff}, + {OP_WR_E1, XCM_REG_WU_DA_CNT_UPD_VAL11, 0xff}, +-#define XCM_PORT1_END 1469 +-#define XCM_FUNC0_START 1469 ++#define XCM_PORT1_END 1529 ++#define XCM_FUNC0_START 1529 + {OP_WR_E1H, XCM_REG_GLB_DEL_ACK_TMR_VAL_0, 0xc8}, + {OP_WR_E1H, XCM_REG_GLB_DEL_ACK_MAX_CNT_0, 0x2}, + {OP_WR_E1H, XCM_REG_WU_DA_SET_TMR_CNT_FLG_CMD00, 0x0}, +@@ -1694,8 +1754,8 @@ + {OP_WR_E1H, XCM_REG_WU_DA_CNT_UPD_VAL00, 0xff}, + {OP_WR_E1H, XCM_REG_WU_DA_CNT_UPD_VAL10, 0xff}, + {OP_WR_E1H, XCM_REG_PHYS_QNUM3_0, 0x0}, +-#define XCM_FUNC0_END 1478 +-#define XCM_FUNC1_START 1478 ++#define XCM_FUNC0_END 1538 ++#define XCM_FUNC1_START 1538 + {OP_WR_E1H, XCM_REG_GLB_DEL_ACK_TMR_VAL_1, 0xc8}, + {OP_WR_E1H, XCM_REG_GLB_DEL_ACK_MAX_CNT_1, 0x2}, + {OP_WR_E1H, XCM_REG_WU_DA_SET_TMR_CNT_FLG_CMD01, 0x0}, +@@ -1705,8 +1765,8 @@ + {OP_WR_E1H, XCM_REG_WU_DA_CNT_UPD_VAL01, 0xff}, + {OP_WR_E1H, XCM_REG_WU_DA_CNT_UPD_VAL11, 0xff}, + {OP_WR_E1H, XCM_REG_PHYS_QNUM3_1, 0x0}, +-#define XCM_FUNC1_END 1487 +-#define XCM_FUNC2_START 1487 ++#define XCM_FUNC1_END 1547 ++#define XCM_FUNC2_START 1547 + {OP_WR_E1H, XCM_REG_GLB_DEL_ACK_TMR_VAL_0, 0xc8}, + {OP_WR_E1H, XCM_REG_GLB_DEL_ACK_MAX_CNT_0, 0x2}, + {OP_WR_E1H, XCM_REG_WU_DA_SET_TMR_CNT_FLG_CMD00, 0x0}, +@@ -1716,8 +1776,8 @@ + {OP_WR_E1H, XCM_REG_WU_DA_CNT_UPD_VAL00, 0xff}, + {OP_WR_E1H, XCM_REG_WU_DA_CNT_UPD_VAL10, 0xff}, + {OP_WR_E1H, XCM_REG_PHYS_QNUM3_0, 0x0}, +-#define XCM_FUNC2_END 1496 +-#define XCM_FUNC3_START 1496 ++#define XCM_FUNC2_END 1556 ++#define XCM_FUNC3_START 1556 + {OP_WR_E1H, XCM_REG_GLB_DEL_ACK_TMR_VAL_1, 0xc8}, + {OP_WR_E1H, XCM_REG_GLB_DEL_ACK_MAX_CNT_1, 0x2}, + {OP_WR_E1H, XCM_REG_WU_DA_SET_TMR_CNT_FLG_CMD01, 0x0}, +@@ -1727,8 +1787,8 @@ + {OP_WR_E1H, XCM_REG_WU_DA_CNT_UPD_VAL01, 0xff}, + {OP_WR_E1H, XCM_REG_WU_DA_CNT_UPD_VAL11, 0xff}, + {OP_WR_E1H, XCM_REG_PHYS_QNUM3_1, 0x0}, +-#define XCM_FUNC3_END 1505 +-#define XCM_FUNC4_START 1505 ++#define XCM_FUNC3_END 1565 ++#define XCM_FUNC4_START 1565 + {OP_WR_E1H, XCM_REG_GLB_DEL_ACK_TMR_VAL_0, 0xc8}, + {OP_WR_E1H, XCM_REG_GLB_DEL_ACK_MAX_CNT_0, 0x2}, + {OP_WR_E1H, XCM_REG_WU_DA_SET_TMR_CNT_FLG_CMD00, 0x0}, +@@ -1738,8 +1798,8 @@ + {OP_WR_E1H, XCM_REG_WU_DA_CNT_UPD_VAL00, 0xff}, + {OP_WR_E1H, XCM_REG_WU_DA_CNT_UPD_VAL10, 0xff}, + {OP_WR_E1H, XCM_REG_PHYS_QNUM3_0, 0x0}, +-#define XCM_FUNC4_END 1514 +-#define XCM_FUNC5_START 1514 ++#define XCM_FUNC4_END 1574 ++#define XCM_FUNC5_START 1574 + {OP_WR_E1H, XCM_REG_GLB_DEL_ACK_TMR_VAL_1, 0xc8}, + {OP_WR_E1H, XCM_REG_GLB_DEL_ACK_MAX_CNT_1, 0x2}, + {OP_WR_E1H, XCM_REG_WU_DA_SET_TMR_CNT_FLG_CMD01, 0x0}, +@@ -1749,8 +1809,8 @@ + {OP_WR_E1H, XCM_REG_WU_DA_CNT_UPD_VAL01, 0xff}, + {OP_WR_E1H, XCM_REG_WU_DA_CNT_UPD_VAL11, 0xff}, + {OP_WR_E1H, XCM_REG_PHYS_QNUM3_1, 0x0}, +-#define XCM_FUNC5_END 1523 +-#define XCM_FUNC6_START 1523 ++#define XCM_FUNC5_END 1583 ++#define XCM_FUNC6_START 1583 + {OP_WR_E1H, XCM_REG_GLB_DEL_ACK_TMR_VAL_0, 0xc8}, + {OP_WR_E1H, XCM_REG_GLB_DEL_ACK_MAX_CNT_0, 0x2}, + {OP_WR_E1H, XCM_REG_WU_DA_SET_TMR_CNT_FLG_CMD00, 0x0}, +@@ -1760,8 +1820,8 @@ + {OP_WR_E1H, XCM_REG_WU_DA_CNT_UPD_VAL00, 0xff}, + {OP_WR_E1H, XCM_REG_WU_DA_CNT_UPD_VAL10, 0xff}, + {OP_WR_E1H, XCM_REG_PHYS_QNUM3_0, 0x0}, +-#define XCM_FUNC6_END 1532 +-#define XCM_FUNC7_START 1532 ++#define XCM_FUNC6_END 1592 ++#define XCM_FUNC7_START 1592 + {OP_WR_E1H, XCM_REG_GLB_DEL_ACK_TMR_VAL_1, 0xc8}, + {OP_WR_E1H, XCM_REG_GLB_DEL_ACK_MAX_CNT_1, 0x2}, + {OP_WR_E1H, XCM_REG_WU_DA_SET_TMR_CNT_FLG_CMD01, 0x0}, +@@ -1771,8 +1831,8 @@ + {OP_WR_E1H, XCM_REG_WU_DA_CNT_UPD_VAL01, 0xff}, + {OP_WR_E1H, XCM_REG_WU_DA_CNT_UPD_VAL11, 0xff}, + {OP_WR_E1H, XCM_REG_PHYS_QNUM3_1, 0x0}, +-#define XCM_FUNC7_END 1541 +-#define XSEM_COMMON_START 1541 ++#define XCM_FUNC7_END 1601 ++#define XSEM_COMMON_START 1601 + {OP_RD, XSEM_REG_MSG_NUM_FIC0, 0x0}, + {OP_RD, XSEM_REG_MSG_NUM_FIC1, 0x0}, + {OP_RD, XSEM_REG_MSG_NUM_FOC0, 0x0}, +@@ -1827,10 +1887,10 @@ + {OP_WR_ASIC, XSEM_REG_FAST_MEMORY + 0x18380, 0x1dcd6500}, + {OP_WR_EMUL_E1H, XSEM_REG_FAST_MEMORY + 0x11480, 0x0}, + {OP_WR_FPGA, XSEM_REG_FAST_MEMORY + 0x18380, 0x4c4b40}, +- {OP_ZR_E1, XSEM_REG_FAST_MEMORY + 0x3d00, 0x4}, ++ {OP_ZR_E1, XSEM_REG_FAST_MEMORY + 0x3d20, 0x4}, + {OP_WR_E1H, XSEM_REG_FAST_MEMORY + 0x11480, 0x1}, + {OP_ZR_E1, XSEM_REG_FAST_MEMORY + 0x3000, 0x48}, +- {OP_ZR_E1H, XSEM_REG_FAST_MEMORY + 0x28a8, 0x4}, ++ {OP_ZR_E1H, XSEM_REG_FAST_MEMORY + 0x28c8, 0x4}, + {OP_ZR_E1, XSEM_REG_FAST_MEMORY + 0x1020, 0xc8}, + {OP_ZR_E1H, XSEM_REG_FAST_MEMORY + 0x2080, 0x48}, + {OP_ZR_E1, XSEM_REG_FAST_MEMORY + 0x1000, 0x2}, +@@ -1839,65 +1899,66 @@ + {OP_ZR_E1H, XSEM_REG_FAST_MEMORY + 0x9000, 0x2}, + {OP_WR_E1, XSEM_REG_FAST_MEMORY + 0x3368, 0x0}, + {OP_ZR_E1H, XSEM_REG_FAST_MEMORY + 0x21a8, 0x86}, +- {OP_SW_E1, XSEM_REG_FAST_MEMORY + 0x3370, 0x202eb}, ++ {OP_SW_E1, XSEM_REG_FAST_MEMORY + 0x3370, 0x202f5}, + {OP_ZR_E1H, XSEM_REG_FAST_MEMORY + 0x2000, 0x20}, +- {OP_SW_E1, XSEM_REG_FAST_MEMORY + 0x3b90, 0x402ed}, ++ {OP_SW_E1, XSEM_REG_FAST_MEMORY + 0x3b90, 0x402f7}, + {OP_WR_E1H, XSEM_REG_FAST_MEMORY + 0x23c8, 0x0}, + {OP_WR_E1, XSEM_REG_FAST_MEMORY + 0x1518, 0x1}, +- {OP_SW_E1H, XSEM_REG_FAST_MEMORY + 0x23d0, 0x20321}, ++ {OP_SW_E1H, XSEM_REG_FAST_MEMORY + 0x23d0, 0x20348}, + {OP_WR_E1, XSEM_REG_FAST_MEMORY + 0x1830, 0x0}, +- {OP_SW_E1H, XSEM_REG_FAST_MEMORY + 0x2498, 0x40323}, ++ {OP_SW_E1H, XSEM_REG_FAST_MEMORY + 0x2498, 0x4034a}, + {OP_WR_E1, XSEM_REG_FAST_MEMORY + 0x1838, 0x0}, +- {OP_WR_E1H, XSEM_REG_FAST_MEMORY + 0x2ac8, 0x0}, +- {OP_SW_E1, XSEM_REG_FAST_MEMORY + 0x1820, 0x202f1}, +- {OP_WR_E1H, XSEM_REG_FAST_MEMORY + 0x2ab8, 0x0}, ++ {OP_WR_E1H, XSEM_REG_FAST_MEMORY + 0x2ae8, 0x0}, ++ {OP_SW_E1, XSEM_REG_FAST_MEMORY + 0x1820, 0x202fb}, ++ {OP_WR_E1H, XSEM_REG_FAST_MEMORY + 0x2ad8, 0x0}, + {OP_ZR_E1, XSEM_REG_FAST_MEMORY + 0x4ac0, 0x2}, + {OP_WR_E1H, XSEM_REG_FAST_MEMORY + 0x3010, 0x1}, + {OP_ZR_E1, XSEM_REG_FAST_MEMORY + 0x4b00, 0x4}, + {OP_ZR_E1H, XSEM_REG_FAST_MEMORY + 0x4040, 0x10}, +- {OP_SW_E1, XSEM_REG_FAST_MEMORY + 0x1f50, 0x202f3}, +- {OP_SW_E1H, XSEM_REG_FAST_MEMORY + 0x4000, 0x100327}, ++ {OP_SW_E1, XSEM_REG_FAST_MEMORY + 0x1f48, 0x202fd}, ++ {OP_SW_E1H, XSEM_REG_FAST_MEMORY + 0x4000, 0x10034e}, + {OP_ZR_E1H, XSEM_REG_FAST_MEMORY + 0x6ac0, 0x2}, + {OP_ZR_E1H, XSEM_REG_FAST_MEMORY + 0x6b00, 0x4}, +- {OP_SW_E1H, XSEM_REG_FAST_MEMORY + 0x83b0, 0x20337}, ++ {OP_SW_E1H, XSEM_REG_FAST_MEMORY + 0x83a8, 0x2035e}, + {OP_WR, XSEM_REG_FAST_MEMORY + 0x10800, 0x0}, +- {OP_SW_E1, XSEM_REG_FAST_MEMORY + 0x10c00, 0x1002f5}, +- {OP_SW_E1H, XSEM_REG_FAST_MEMORY + 0x10c00, 0x100339}, ++ {OP_SW_E1, XSEM_REG_FAST_MEMORY + 0x10c00, 0x1002ff}, ++ {OP_SW_E1H, XSEM_REG_FAST_MEMORY + 0x10c00, 0x100360}, + {OP_WR, XSEM_REG_FAST_MEMORY + 0x10800, 0x1000000}, +- {OP_SW_E1, XSEM_REG_FAST_MEMORY + 0x10c40, 0x80305}, +- {OP_SW_E1H, XSEM_REG_FAST_MEMORY + 0x10c40, 0x80349}, ++ {OP_SW_E1, XSEM_REG_FAST_MEMORY + 0x10c40, 0x8030f}, ++ {OP_SW_E1H, XSEM_REG_FAST_MEMORY + 0x10c40, 0x80370}, + {OP_WR, XSEM_REG_FAST_MEMORY + 0x10800, 0x2000000}, +- {OP_SW_E1, XSEM_REG_FAST_MEMORY + 0x10c60, 0x8030d}, +- {OP_SW_E1H, XSEM_REG_FAST_MEMORY + 0x10c60, 0x80351}, +- {OP_ZP_E1, XSEM_REG_INT_TABLE, 0xa90000}, +- {OP_ZP_E1H, XSEM_REG_INT_TABLE, 0xac0000}, +- {OP_WR_64_E1, XSEM_REG_INT_TABLE + 0x368, 0x130315}, +- {OP_WR_64_E1H, XSEM_REG_INT_TABLE + 0x368, 0x130359}, +- {OP_ZP_E1, XSEM_REG_PRAM, 0x344e0000}, +- {OP_ZP_E1H, XSEM_REG_PRAM, 0x34620000}, +- {OP_ZP_E1, XSEM_REG_PRAM + 0x8000, 0x38840d14}, +- {OP_ZP_E1H, XSEM_REG_PRAM + 0x8000, 0x38240d19}, +- {OP_ZP_E1, XSEM_REG_PRAM + 0x10000, 0x3e711b35}, +- {OP_ZP_E1H, XSEM_REG_PRAM + 0x10000, 0x3e971b22}, +- {OP_ZP_E1, XSEM_REG_PRAM + 0x18000, 0x1dd02ad2}, +- {OP_ZP_E1H, XSEM_REG_PRAM + 0x18000, 0x21542ac8}, +- {OP_WR_64_E1, XSEM_REG_PRAM + 0x1c0d0, 0x47e60317}, +- {OP_WR_64_E1H, XSEM_REG_PRAM + 0x1c8d0, 0x46e6035b}, +-#define XSEM_COMMON_END 1651 +-#define XSEM_PORT0_START 1651 +- {OP_ZR_E1, XSEM_REG_FAST_MEMORY + 0x3ba0, 0x10}, ++ {OP_SW_E1, XSEM_REG_FAST_MEMORY + 0x10c60, 0x80317}, ++ {OP_SW_E1H, XSEM_REG_FAST_MEMORY + 0x10c60, 0x80378}, ++ {OP_ZP_E1, XSEM_REG_INT_TABLE, 0xae0000}, ++ {OP_ZP_E1H, XSEM_REG_INT_TABLE, 0xbb0000}, ++ {OP_WR_64_E1, XSEM_REG_INT_TABLE + 0x368, 0x13031f}, ++ {OP_WR_64_E1H, XSEM_REG_INT_TABLE + 0x3a8, 0xb0380}, ++ {OP_ZP_E1, XSEM_REG_PRAM, 0x342d0000}, ++ {OP_ZP_E1H, XSEM_REG_PRAM, 0x34530000}, ++ {OP_ZP_E1, XSEM_REG_PRAM + 0x8000, 0x38640d0c}, ++ {OP_ZP_E1H, XSEM_REG_PRAM + 0x8000, 0x37e90d15}, ++ {OP_ZP_E1, XSEM_REG_PRAM + 0x10000, 0x3c161b25}, ++ {OP_ZP_E1H, XSEM_REG_PRAM + 0x10000, 0x3be21b10}, ++ {OP_ZP_E1, XSEM_REG_PRAM + 0x18000, 0x249b2a2b}, ++ {OP_ZP_E1H, XSEM_REG_PRAM + 0x18000, 0x33ed2a09}, ++ {OP_WR_64_E1, XSEM_REG_PRAM + 0x1cbc0, 0x46880321}, ++ {OP_ZP_E1H, XSEM_REG_PRAM + 0x20000, 0x13903705}, ++ {OP_WR_64_E1H, XSEM_REG_PRAM + 0x224f0, 0x3b620382}, ++#define XSEM_COMMON_END 1712 ++#define XSEM_PORT0_START 1712 ++ {OP_ZR_E1, XSEM_REG_FAST_MEMORY + 0x3ba0, 0x14}, + {OP_ZR_E1H, XSEM_REG_FAST_MEMORY + 0xc000, 0xfc}, +- {OP_ZR_E1, XSEM_REG_FAST_MEMORY + 0x3c20, 0x1c}, +- {OP_ZR_E1H, XSEM_REG_FAST_MEMORY + 0x24a8, 0x10}, ++ {OP_ZR_E1, XSEM_REG_FAST_MEMORY + 0x3c40, 0x1c}, ++ {OP_ZR_E1H, XSEM_REG_FAST_MEMORY + 0x24a8, 0x14}, + {OP_ZR_E1, XSEM_REG_FAST_MEMORY + 0x1400, 0xa}, +- {OP_ZR_E1H, XSEM_REG_FAST_MEMORY + 0x2528, 0x1c}, ++ {OP_ZR_E1H, XSEM_REG_FAST_MEMORY + 0x2548, 0x1c}, + {OP_ZR_E1, XSEM_REG_FAST_MEMORY + 0x1450, 0x6}, +- {OP_ZR_E1H, XSEM_REG_FAST_MEMORY + 0x2608, 0x1c}, ++ {OP_ZR_E1H, XSEM_REG_FAST_MEMORY + 0x2628, 0x1c}, + {OP_ZR_E1, XSEM_REG_FAST_MEMORY + 0x3378, 0xfc}, +- {OP_ZR_E1H, XSEM_REG_FAST_MEMORY + 0x26e8, 0x1c}, ++ {OP_ZR_E1H, XSEM_REG_FAST_MEMORY + 0x2708, 0x1c}, + {OP_WR_E1, XSEM_REG_FAST_MEMORY + 0x3b58, 0x0}, +- {OP_ZR_E1H, XSEM_REG_FAST_MEMORY + 0x27c8, 0x1c}, +- {OP_SW_E1, XSEM_REG_FAST_MEMORY + 0x3d10, 0x100319}, ++ {OP_ZR_E1H, XSEM_REG_FAST_MEMORY + 0x27e8, 0x1c}, ++ {OP_SW_E1, XSEM_REG_FAST_MEMORY + 0x3d30, 0x100323}, + {OP_ZR_E1H, XSEM_REG_FAST_MEMORY + 0xa000, 0x28}, + {OP_WR_E1, XSEM_REG_FAST_MEMORY + 0x1500, 0x0}, + {OP_ZR_E1H, XSEM_REG_FAST_MEMORY + 0xa140, 0xc}, +@@ -1910,28 +1971,28 @@ + {OP_WR_E1, XSEM_REG_FAST_MEMORY + 0x5040, 0x0}, + {OP_WR_E1H, XSEM_REG_FAST_MEMORY + 0x5208, 0x1}, + {OP_ZR_E1, XSEM_REG_FAST_MEMORY + 0x5048, 0xe}, +- {OP_SW_E1H, XSEM_REG_FAST_MEMORY + 0x6ac8, 0x2035d}, ++ {OP_SW_E1H, XSEM_REG_FAST_MEMORY + 0x6ac8, 0x20384}, + {OP_WR_E1, XSEM_REG_FAST_MEMORY + 0x50b8, 0x1}, + {OP_ZR_E1H, XSEM_REG_FAST_MEMORY + 0x6b10, 0x42}, +- {OP_SW_E1, XSEM_REG_FAST_MEMORY + 0x4ac8, 0x20329}, ++ {OP_SW_E1, XSEM_REG_FAST_MEMORY + 0x4ac8, 0x20333}, + {OP_ZR_E1H, XSEM_REG_FAST_MEMORY + 0x6d20, 0x4}, + {OP_ZR_E1, XSEM_REG_FAST_MEMORY + 0x4b10, 0x42}, + {OP_ZR_E1, XSEM_REG_FAST_MEMORY + 0x4d20, 0x4}, +-#define XSEM_PORT0_END 1683 +-#define XSEM_PORT1_START 1683 +- {OP_ZR_E1, XSEM_REG_FAST_MEMORY + 0x3be0, 0x10}, ++#define XSEM_PORT0_END 1744 ++#define XSEM_PORT1_START 1744 ++ {OP_ZR_E1, XSEM_REG_FAST_MEMORY + 0x3bf0, 0x14}, + {OP_ZR_E1H, XSEM_REG_FAST_MEMORY + 0xc3f0, 0xfc}, +- {OP_ZR_E1, XSEM_REG_FAST_MEMORY + 0x3c90, 0x1c}, +- {OP_ZR_E1H, XSEM_REG_FAST_MEMORY + 0x24e8, 0x10}, ++ {OP_ZR_E1, XSEM_REG_FAST_MEMORY + 0x3cb0, 0x1c}, ++ {OP_ZR_E1H, XSEM_REG_FAST_MEMORY + 0x24f8, 0x14}, + {OP_ZR_E1, XSEM_REG_FAST_MEMORY + 0x1428, 0xa}, +- {OP_ZR_E1H, XSEM_REG_FAST_MEMORY + 0x2598, 0x1c}, ++ {OP_ZR_E1H, XSEM_REG_FAST_MEMORY + 0x25b8, 0x1c}, + {OP_ZR_E1, XSEM_REG_FAST_MEMORY + 0x1468, 0x6}, +- {OP_ZR_E1H, XSEM_REG_FAST_MEMORY + 0x2678, 0x1c}, ++ {OP_ZR_E1H, XSEM_REG_FAST_MEMORY + 0x2698, 0x1c}, + {OP_ZR_E1, XSEM_REG_FAST_MEMORY + 0x3768, 0xfc}, +- {OP_ZR_E1H, XSEM_REG_FAST_MEMORY + 0x2758, 0x1c}, ++ {OP_ZR_E1H, XSEM_REG_FAST_MEMORY + 0x2778, 0x1c}, + {OP_WR_E1, XSEM_REG_FAST_MEMORY + 0x3b5c, 0x0}, +- {OP_ZR_E1H, XSEM_REG_FAST_MEMORY + 0x2838, 0x1c}, +- {OP_SW_E1, XSEM_REG_FAST_MEMORY + 0x3d50, 0x10032b}, ++ {OP_ZR_E1H, XSEM_REG_FAST_MEMORY + 0x2858, 0x1c}, ++ {OP_SW_E1, XSEM_REG_FAST_MEMORY + 0x3d70, 0x100335}, + {OP_ZR_E1H, XSEM_REG_FAST_MEMORY + 0xa0a0, 0x28}, + {OP_WR_E1, XSEM_REG_FAST_MEMORY + 0x1504, 0x0}, + {OP_ZR_E1H, XSEM_REG_FAST_MEMORY + 0xa170, 0xc}, +@@ -1944,68 +2005,68 @@ + {OP_WR_E1, XSEM_REG_FAST_MEMORY + 0x5044, 0x0}, + {OP_WR_E1H, XSEM_REG_FAST_MEMORY + 0x520c, 0x1}, + {OP_ZR_E1, XSEM_REG_FAST_MEMORY + 0x5080, 0xe}, +- {OP_SW_E1H, XSEM_REG_FAST_MEMORY + 0x6ad0, 0x2035f}, ++ {OP_SW_E1H, XSEM_REG_FAST_MEMORY + 0x6ad0, 0x20386}, + {OP_WR_E1, XSEM_REG_FAST_MEMORY + 0x50bc, 0x1}, + {OP_ZR_E1H, XSEM_REG_FAST_MEMORY + 0x6c18, 0x42}, +- {OP_SW_E1, XSEM_REG_FAST_MEMORY + 0x4ad0, 0x2033b}, ++ {OP_SW_E1, XSEM_REG_FAST_MEMORY + 0x4ad0, 0x20345}, + {OP_ZR_E1H, XSEM_REG_FAST_MEMORY + 0x6d30, 0x4}, + {OP_ZR_E1, XSEM_REG_FAST_MEMORY + 0x4c18, 0x42}, + {OP_ZR_E1, XSEM_REG_FAST_MEMORY + 0x4d30, 0x4}, +-#define XSEM_PORT1_END 1715 +-#define XSEM_FUNC0_START 1715 ++#define XSEM_PORT1_END 1776 ++#define XSEM_FUNC0_START 1776 + {OP_WR_E1H, XSEM_REG_FAST_MEMORY + 0xc7e0, 0x0}, +- {OP_SW_E1H, XSEM_REG_FAST_MEMORY + 0x28b8, 0x100361}, ++ {OP_SW_E1H, XSEM_REG_FAST_MEMORY + 0x28d8, 0x100388}, + {OP_ZR_E1H, XSEM_REG_FAST_MEMORY + 0x5048, 0xe}, +-#define XSEM_FUNC0_END 1718 +-#define XSEM_FUNC1_START 1718 ++#define XSEM_FUNC0_END 1779 ++#define XSEM_FUNC1_START 1779 + {OP_WR_E1H, XSEM_REG_FAST_MEMORY + 0xc7e4, 0x0}, +- {OP_SW_E1H, XSEM_REG_FAST_MEMORY + 0x28f8, 0x100371}, ++ {OP_SW_E1H, XSEM_REG_FAST_MEMORY + 0x2918, 0x100398}, + {OP_ZR_E1H, XSEM_REG_FAST_MEMORY + 0x5080, 0xe}, +-#define XSEM_FUNC1_END 1721 +-#define XSEM_FUNC2_START 1721 ++#define XSEM_FUNC1_END 1782 ++#define XSEM_FUNC2_START 1782 + {OP_WR_E1H, XSEM_REG_FAST_MEMORY + 0xc7e8, 0x0}, +- {OP_SW_E1H, XSEM_REG_FAST_MEMORY + 0x2938, 0x100381}, ++ {OP_SW_E1H, XSEM_REG_FAST_MEMORY + 0x2958, 0x1003a8}, + {OP_ZR_E1H, XSEM_REG_FAST_MEMORY + 0x50b8, 0xe}, +-#define XSEM_FUNC2_END 1724 +-#define XSEM_FUNC3_START 1724 ++#define XSEM_FUNC2_END 1785 ++#define XSEM_FUNC3_START 1785 + {OP_WR_E1H, XSEM_REG_FAST_MEMORY + 0xc7ec, 0x0}, +- {OP_SW_E1H, XSEM_REG_FAST_MEMORY + 0x2978, 0x100391}, ++ {OP_SW_E1H, XSEM_REG_FAST_MEMORY + 0x2998, 0x1003b8}, + {OP_ZR_E1H, XSEM_REG_FAST_MEMORY + 0x50f0, 0xe}, +-#define XSEM_FUNC3_END 1727 +-#define XSEM_FUNC4_START 1727 ++#define XSEM_FUNC3_END 1788 ++#define XSEM_FUNC4_START 1788 + {OP_WR_E1H, XSEM_REG_FAST_MEMORY + 0xc7f0, 0x0}, +- {OP_SW_E1H, XSEM_REG_FAST_MEMORY + 0x29b8, 0x1003a1}, ++ {OP_SW_E1H, XSEM_REG_FAST_MEMORY + 0x29d8, 0x1003c8}, + {OP_ZR_E1H, XSEM_REG_FAST_MEMORY + 0x5128, 0xe}, +-#define XSEM_FUNC4_END 1730 +-#define XSEM_FUNC5_START 1730 ++#define XSEM_FUNC4_END 1791 ++#define XSEM_FUNC5_START 1791 + {OP_WR_E1H, XSEM_REG_FAST_MEMORY + 0xc7f4, 0x0}, +- {OP_SW_E1H, XSEM_REG_FAST_MEMORY + 0x29f8, 0x1003b1}, ++ {OP_SW_E1H, XSEM_REG_FAST_MEMORY + 0x2a18, 0x1003d8}, + {OP_ZR_E1H, XSEM_REG_FAST_MEMORY + 0x5160, 0xe}, +-#define XSEM_FUNC5_END 1733 +-#define XSEM_FUNC6_START 1733 ++#define XSEM_FUNC5_END 1794 ++#define XSEM_FUNC6_START 1794 + {OP_WR_E1H, XSEM_REG_FAST_MEMORY + 0xc7f8, 0x0}, +- {OP_SW_E1H, XSEM_REG_FAST_MEMORY + 0x2a38, 0x1003c1}, ++ {OP_SW_E1H, XSEM_REG_FAST_MEMORY + 0x2a58, 0x1003e8}, + {OP_ZR_E1H, XSEM_REG_FAST_MEMORY + 0x5198, 0xe}, +-#define XSEM_FUNC6_END 1736 +-#define XSEM_FUNC7_START 1736 ++#define XSEM_FUNC6_END 1797 ++#define XSEM_FUNC7_START 1797 + {OP_WR_E1H, XSEM_REG_FAST_MEMORY + 0xc7fc, 0x0}, +- {OP_SW_E1H, XSEM_REG_FAST_MEMORY + 0x2a78, 0x1003d1}, ++ {OP_SW_E1H, XSEM_REG_FAST_MEMORY + 0x2a98, 0x1003f8}, + {OP_ZR_E1H, XSEM_REG_FAST_MEMORY + 0x51d0, 0xe}, +-#define XSEM_FUNC7_END 1739 +-#define CDU_COMMON_START 1739 ++#define XSEM_FUNC7_END 1800 ++#define CDU_COMMON_START 1800 + {OP_WR, CDU_REG_CDU_CONTROL0, 0x1}, + {OP_WR_E1H, CDU_REG_MF_MODE, 0x1}, + {OP_WR, CDU_REG_CDU_CHK_MASK0, 0x3d000}, + {OP_WR, CDU_REG_CDU_CHK_MASK1, 0x3d}, +- {OP_WB_E1, CDU_REG_L1TT, 0x200033d}, +- {OP_WB_E1H, CDU_REG_L1TT, 0x20003e1}, +- {OP_WB_E1, CDU_REG_MATT, 0x20053d}, +- {OP_WB_E1H, CDU_REG_MATT, 0x2805e1}, ++ {OP_WB_E1, CDU_REG_L1TT, 0x2000347}, ++ {OP_WB_E1H, CDU_REG_L1TT, 0x2000408}, ++ {OP_WB_E1, CDU_REG_MATT, 0x200547}, ++ {OP_WB_E1H, CDU_REG_MATT, 0x280608}, + {OP_ZR_E1, CDU_REG_MATT + 0x80, 0x2}, +- {OP_WB_E1, CDU_REG_MATT + 0x88, 0x6055d}, ++ {OP_WB_E1, CDU_REG_MATT + 0x88, 0x60567}, + {OP_ZR, CDU_REG_MATT + 0xa0, 0x18}, +-#define CDU_COMMON_END 1750 +-#define DMAE_COMMON_START 1750 ++#define CDU_COMMON_END 1811 ++#define DMAE_COMMON_START 1811 + {OP_ZR, DMAE_REG_CMD_MEM, 0xe0}, + {OP_WR, DMAE_REG_CRC16C_INIT, 0x0}, + {OP_WR, DMAE_REG_CRC16T10_INIT, 0x1}, +@@ -2013,24 +2074,25 @@ + {OP_WR_E1H, DMAE_REG_PXP_REQ_INIT_CRD, 0x2}, + {OP_WR, DMAE_REG_PCI_IFEN, 0x1}, + {OP_WR, DMAE_REG_GRC_IFEN, 0x1}, +-#define DMAE_COMMON_END 1757 +-#define PXP_COMMON_START 1757 +- {OP_WB_E1, PXP_REG_HST_INBOUND_INT + 0x400, 0x50563}, +- {OP_WB_E1H, PXP_REG_HST_INBOUND_INT + 0x400, 0x50609}, +- {OP_WB_E1, PXP_REG_HST_INBOUND_INT + 0x420, 0x50568}, +- {OP_WB_E1H, PXP_REG_HST_INBOUND_INT, 0x5060e}, +- {OP_WB_E1, PXP_REG_HST_INBOUND_INT, 0x5056d}, +-#define PXP_COMMON_END 1762 +-#define CFC_COMMON_START 1762 ++#define DMAE_COMMON_END 1818 ++#define PXP_COMMON_START 1818 ++ {OP_WB_E1, PXP_REG_HST_INBOUND_INT + 0x400, 0x5056d}, ++ {OP_WB_E1H, PXP_REG_HST_INBOUND_INT + 0x400, 0x50630}, ++ {OP_WB_E1, PXP_REG_HST_INBOUND_INT + 0x420, 0x50572}, ++ {OP_WB_E1H, PXP_REG_HST_INBOUND_INT, 0x50635}, ++ {OP_WB_E1, PXP_REG_HST_INBOUND_INT, 0x50577}, ++ {OP_WB_E1H, PXP_REG_HST_INBOUND_INT + 0x20, 0x5063a}, ++#define PXP_COMMON_END 1824 ++#define CFC_COMMON_START 1824 + {OP_ZR_E1H, CFC_REG_LINK_LIST, 0x100}, + {OP_WR, CFC_REG_CONTROL0, 0x10}, + {OP_WR, CFC_REG_DISABLE_ON_ERROR, 0x3fff}, + {OP_WR, CFC_REG_LCREQ_WEIGHTS, 0x84924a}, +-#define CFC_COMMON_END 1766 +-#define HC_COMMON_START 1766 ++#define CFC_COMMON_END 1828 ++#define HC_COMMON_START 1828 + {OP_ZR_E1, HC_REG_USTORM_ADDR_FOR_COALESCE, 0x4}, +-#define HC_COMMON_END 1767 +-#define HC_PORT0_START 1767 ++#define HC_COMMON_END 1829 ++#define HC_PORT0_START 1829 + {OP_WR_E1, HC_REG_CONFIG_0, 0x1080}, + {OP_ZR_E1, HC_REG_UC_RAM_ADDR_0, 0x2}, + {OP_WR_E1, HC_REG_ATTN_NUM_P0, 0x10}, +@@ -2049,8 +2111,8 @@ + {OP_ZR_E1, HC_REG_STATISTIC_COUNTERS + 0x120, 0x4a}, + {OP_ZR_E1, HC_REG_STATISTIC_COUNTERS + 0x370, 0x4a}, + {OP_ZR_E1, HC_REG_STATISTIC_COUNTERS + 0x5c0, 0x4a}, +-#define HC_PORT0_END 1785 +-#define HC_PORT1_START 1785 ++#define HC_PORT0_END 1847 ++#define HC_PORT1_START 1847 + {OP_WR_E1, HC_REG_CONFIG_1, 0x1080}, + {OP_ZR_E1, HC_REG_UC_RAM_ADDR_1, 0x2}, + {OP_WR_E1, HC_REG_ATTN_NUM_P1, 0x10}, +@@ -2069,8 +2131,8 @@ + {OP_ZR_E1, HC_REG_STATISTIC_COUNTERS + 0x248, 0x4a}, + {OP_ZR_E1, HC_REG_STATISTIC_COUNTERS + 0x498, 0x4a}, + {OP_ZR_E1, HC_REG_STATISTIC_COUNTERS + 0x6e8, 0x4a}, +-#define HC_PORT1_END 1803 +-#define HC_FUNC0_START 1803 ++#define HC_PORT1_END 1865 ++#define HC_FUNC0_START 1865 + {OP_WR_E1H, HC_REG_CONFIG_0, 0x1080}, + {OP_WR_E1H, HC_REG_FUNC_NUM_P0, 0x0}, + {OP_WR_E1H, HC_REG_ATTN_NUM_P0, 0x10}, +@@ -2086,8 +2148,8 @@ + {OP_ZR_E1H, HC_REG_STATISTIC_COUNTERS + 0x120, 0x4a}, + {OP_ZR_E1H, HC_REG_STATISTIC_COUNTERS + 0x370, 0x4a}, + {OP_ZR_E1H, HC_REG_STATISTIC_COUNTERS + 0x5c0, 0x4a}, +-#define HC_FUNC0_END 1818 +-#define HC_FUNC1_START 1818 ++#define HC_FUNC0_END 1880 ++#define HC_FUNC1_START 1880 + {OP_WR_E1H, HC_REG_CONFIG_1, 0x1080}, + {OP_WR_E1H, HC_REG_FUNC_NUM_P1, 0x1}, + {OP_WR_E1H, HC_REG_ATTN_NUM_P1, 0x10}, +@@ -2103,8 +2165,8 @@ + {OP_ZR_E1H, HC_REG_STATISTIC_COUNTERS + 0x248, 0x4a}, + {OP_ZR_E1H, HC_REG_STATISTIC_COUNTERS + 0x498, 0x4a}, + {OP_ZR_E1H, HC_REG_STATISTIC_COUNTERS + 0x6e8, 0x4a}, +-#define HC_FUNC1_END 1833 +-#define HC_FUNC2_START 1833 ++#define HC_FUNC1_END 1895 ++#define HC_FUNC2_START 1895 + {OP_WR_E1H, HC_REG_CONFIG_0, 0x1080}, + {OP_WR_E1H, HC_REG_FUNC_NUM_P0, 0x2}, + {OP_WR_E1H, HC_REG_ATTN_NUM_P0, 0x10}, +@@ -2120,8 +2182,8 @@ + {OP_ZR_E1H, HC_REG_STATISTIC_COUNTERS + 0x120, 0x4a}, + {OP_ZR_E1H, HC_REG_STATISTIC_COUNTERS + 0x370, 0x4a}, + {OP_ZR_E1H, HC_REG_STATISTIC_COUNTERS + 0x5c0, 0x4a}, +-#define HC_FUNC2_END 1848 +-#define HC_FUNC3_START 1848 ++#define HC_FUNC2_END 1910 ++#define HC_FUNC3_START 1910 + {OP_WR_E1H, HC_REG_CONFIG_1, 0x1080}, + {OP_WR_E1H, HC_REG_FUNC_NUM_P1, 0x3}, + {OP_WR_E1H, HC_REG_ATTN_NUM_P1, 0x10}, +@@ -2137,8 +2199,8 @@ + {OP_ZR_E1H, HC_REG_STATISTIC_COUNTERS + 0x248, 0x4a}, + {OP_ZR_E1H, HC_REG_STATISTIC_COUNTERS + 0x498, 0x4a}, + {OP_ZR_E1H, HC_REG_STATISTIC_COUNTERS + 0x6e8, 0x4a}, +-#define HC_FUNC3_END 1863 +-#define HC_FUNC4_START 1863 ++#define HC_FUNC3_END 1925 ++#define HC_FUNC4_START 1925 + {OP_WR_E1H, HC_REG_CONFIG_0, 0x1080}, + {OP_WR_E1H, HC_REG_FUNC_NUM_P0, 0x4}, + {OP_WR_E1H, HC_REG_ATTN_NUM_P0, 0x10}, +@@ -2154,8 +2216,8 @@ + {OP_ZR_E1H, HC_REG_STATISTIC_COUNTERS + 0x120, 0x4a}, + {OP_ZR_E1H, HC_REG_STATISTIC_COUNTERS + 0x370, 0x4a}, + {OP_ZR_E1H, HC_REG_STATISTIC_COUNTERS + 0x5c0, 0x4a}, +-#define HC_FUNC4_END 1878 +-#define HC_FUNC5_START 1878 ++#define HC_FUNC4_END 1940 ++#define HC_FUNC5_START 1940 + {OP_WR_E1H, HC_REG_CONFIG_1, 0x1080}, + {OP_WR_E1H, HC_REG_FUNC_NUM_P1, 0x5}, + {OP_WR_E1H, HC_REG_ATTN_NUM_P1, 0x10}, +@@ -2171,8 +2233,8 @@ + {OP_ZR_E1H, HC_REG_STATISTIC_COUNTERS + 0x248, 0x4a}, + {OP_ZR_E1H, HC_REG_STATISTIC_COUNTERS + 0x498, 0x4a}, + {OP_ZR_E1H, HC_REG_STATISTIC_COUNTERS + 0x6e8, 0x4a}, +-#define HC_FUNC5_END 1893 +-#define HC_FUNC6_START 1893 ++#define HC_FUNC5_END 1955 ++#define HC_FUNC6_START 1955 + {OP_WR_E1H, HC_REG_CONFIG_0, 0x1080}, + {OP_WR_E1H, HC_REG_FUNC_NUM_P0, 0x6}, + {OP_WR_E1H, HC_REG_ATTN_NUM_P0, 0x10}, +@@ -2188,8 +2250,8 @@ + {OP_ZR_E1H, HC_REG_STATISTIC_COUNTERS + 0x120, 0x4a}, + {OP_ZR_E1H, HC_REG_STATISTIC_COUNTERS + 0x370, 0x4a}, + {OP_ZR_E1H, HC_REG_STATISTIC_COUNTERS + 0x5c0, 0x4a}, +-#define HC_FUNC6_END 1908 +-#define HC_FUNC7_START 1908 ++#define HC_FUNC6_END 1970 ++#define HC_FUNC7_START 1970 + {OP_WR_E1H, HC_REG_CONFIG_1, 0x1080}, + {OP_WR_E1H, HC_REG_FUNC_NUM_P1, 0x7}, + {OP_WR_E1H, HC_REG_ATTN_NUM_P1, 0x10}, +@@ -2205,10 +2267,10 @@ + {OP_ZR_E1H, HC_REG_STATISTIC_COUNTERS + 0x248, 0x4a}, + {OP_ZR_E1H, HC_REG_STATISTIC_COUNTERS + 0x498, 0x4a}, + {OP_ZR_E1H, HC_REG_STATISTIC_COUNTERS + 0x6e8, 0x4a}, +-#define HC_FUNC7_END 1923 +-#define PXP2_COMMON_START 1923 +- {OP_WR_E1, PXP2_REG_PGL_CONTROL0, 0xe38340}, ++#define HC_FUNC7_END 1985 ++#define PXP2_COMMON_START 1985 + {OP_WR_E1H, PXP2_REG_RQ_DRAM_ALIGN, 0x1}, ++ {OP_WR, PXP2_REG_PGL_CONTROL0, 0xe38340}, + {OP_WR, PXP2_REG_PGL_CONTROL1, 0x3c10}, + {OP_WR_E1H, PXP2_REG_RQ_ELT_DISABLE, 0x1}, + {OP_WR_E1H, PXP2_REG_WR_REV_MODE, 0x0}, +@@ -2220,7 +2282,7 @@ + {OP_WR, PXP2_REG_PGL_INT_TSDM_5, 0xffffffff}, + {OP_WR, PXP2_REG_PGL_INT_TSDM_6, 0xffffffff}, + {OP_WR, PXP2_REG_PGL_INT_TSDM_7, 0xffffffff}, +- {OP_WR, PXP2_REG_PGL_INT_USDM_1, 0xffffffff}, ++ {OP_WR_E1, PXP2_REG_PGL_INT_USDM_1, 0xffffffff}, + {OP_WR, PXP2_REG_PGL_INT_USDM_2, 0xffffffff}, + {OP_WR, PXP2_REG_PGL_INT_USDM_3, 0xffffffff}, + {OP_WR, PXP2_REG_PGL_INT_USDM_4, 0xffffffff}, +@@ -2247,6 +2309,7 @@ + {OP_WR_E1, PXP2_REG_PGL_INT_XSDM_1, 0xffff3340}, + {OP_WR_E1H, PXP2_REG_PGL_INT_USDM_0, 0xf0005000}, + {OP_WR_E1, PXP2_REG_PGL_INT_USDM_0, 0xf0003000}, ++ {OP_WR_E1H, PXP2_REG_PGL_INT_USDM_1, 0xf0008000}, + {OP_WR, PXP2_REG_RD_MAX_BLKS_VQ6, 0x8}, + {OP_WR, PXP2_REG_RD_MAX_BLKS_VQ9, 0x8}, + {OP_WR, PXP2_REG_RD_MAX_BLKS_VQ10, 0x8}, +@@ -2323,9 +2386,8 @@ + {OP_WR, PXP2_REG_PSWRQ_BW_WR, 0x106440}, + {OP_WR_E1H, PXP2_REG_RQ_ILT_MODE, 0x1}, + {OP_WR, PXP2_REG_RQ_RBC_DONE, 0x1}, +- {OP_WR_E1H, PXP2_REG_PGL_CONTROL0, 0xe38340}, +-#define PXP2_COMMON_END 2040 +-#define MISC_AEU_COMMON_START 2040 ++#define PXP2_COMMON_END 2102 ++#define MISC_AEU_COMMON_START 2102 + {OP_ZR, MISC_REG_AEU_GENERAL_ATTN_0, 0x16}, + {OP_WR_E1H, MISC_REG_AEU_ENABLE1_NIG_0, 0x55540000}, + {OP_WR_E1H, MISC_REG_AEU_ENABLE2_NIG_0, 0x55555555}, +@@ -2345,8 +2407,8 @@ + {OP_WR_E1H, MISC_REG_AEU_ENABLE4_PXP_1, 0x0}, + {OP_WR_E1H, MISC_REG_AEU_CLR_LATCH_SIGNAL, 0xc00}, + {OP_WR_E1H, MISC_REG_AEU_GENERAL_MASK, 0x3}, +-#define MISC_AEU_COMMON_END 2059 +-#define MISC_AEU_PORT0_START 2059 ++#define MISC_AEU_COMMON_END 2121 ++#define MISC_AEU_PORT0_START 2121 + {OP_WR_E1, MISC_REG_AEU_ENABLE1_FUNC_0_OUT_0, 0xbf5c0000}, + {OP_WR_E1H, MISC_REG_AEU_ENABLE1_FUNC_0_OUT_0, 0xff5c0000}, + {OP_WR_E1, MISC_REG_AEU_ENABLE2_FUNC_0_OUT_0, 0xfff51fef}, +@@ -2379,8 +2441,8 @@ + {OP_WR_E1, MISC_REG_AEU_INVERTER_1_FUNC_0, 0x0}, + {OP_ZR_E1, MISC_REG_AEU_INVERTER_2_FUNC_0, 0x3}, + {OP_WR_E1, MISC_REG_AEU_MASK_ATTN_FUNC_0, 0x7}, +-#define MISC_AEU_PORT0_END 2091 +-#define MISC_AEU_PORT1_START 2091 ++#define MISC_AEU_PORT0_END 2153 ++#define MISC_AEU_PORT1_START 2153 + {OP_WR_E1, MISC_REG_AEU_ENABLE1_FUNC_1_OUT_0, 0xbf5c0000}, + {OP_WR_E1H, MISC_REG_AEU_ENABLE1_FUNC_1_OUT_0, 0xff5c0000}, + {OP_WR_E1, MISC_REG_AEU_ENABLE2_FUNC_1_OUT_0, 0xfff51fef}, +@@ -2413,7 +2475,7 @@ + {OP_WR_E1, MISC_REG_AEU_INVERTER_1_FUNC_1, 0x0}, + {OP_ZR_E1, MISC_REG_AEU_INVERTER_2_FUNC_1, 0x3}, + {OP_WR_E1, MISC_REG_AEU_MASK_ATTN_FUNC_1, 0x7}, +-#define MISC_AEU_PORT1_END 2123 ++#define MISC_AEU_PORT1_END 2185 + + }; + +@@ -2512,72 +2574,63 @@ + 0x00000200, 0x00000001, 0x00000003, 0x00bebc20, 0x00000003, 0x00bebc20, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0x00000000, 0x00007ff8, 0x00000000, 0x00003500, +- 0x00000003, 0x00bebc20, 0x00000003, 0x00bebc20, 0x00002000, 0x000040c0, +- 0x00006180, 0x00008240, 0x0000a300, 0x0000c3c0, 0x0000e480, 0x00010540, +- 0x00012600, 0x000146c0, 0x00016780, 0x00018840, 0x0001a900, 0x0001c9c0, +- 0x0001ea80, 0x00020b40, 0x00022c00, 0x00024cc0, 0x00026d80, 0x00028e40, +- 0x0002af00, 0x0002cfc0, 0x0002f080, 0x00031140, 0x00033200, 0x000352c0, +- 0x00037380, 0x00039440, 0x0003b500, 0x0003d5c0, 0x0003f680, 0x00041740, +- 0x00043800, 0x000458c0, 0x00047980, 0x00049a40, 0x00008000, 0x00010380, +- 0x00018700, 0x00020a80, 0x00028e00, 0x00031180, 0x00039500, 0x00041880, +- 0x00049c00, 0x00051f80, 0x0005a300, 0x00062680, 0x0006aa00, 0x00072d80, +- 0x0007b100, 0x00083480, 0x0008b800, 0x00093b80, 0x0009bf00, 0x000a4280, +- 0x000ac600, 0x000b4980, 0x000bcd00, 0x000c5080, 0x000cd400, 0x000d5780, +- 0x000ddb00, 0x00001900, 0x00100000, 0x00000000, 0x00000000, 0xffffffff, ++ 0xffffffff, 0x00000000, 0xffffffff, 0x00000000, 0xffffffff, 0x00000003, ++ 0x00bebc20, 0xffffffff, 0x00000000, 0xffffffff, 0x00000000, 0xffffffff, ++ 0x00000003, 0x00bebc20, 0x00002000, 0x000040c0, 0x00006180, 0x00008240, ++ 0x0000a300, 0x0000c3c0, 0x0000e480, 0x00010540, 0x00012600, 0x000146c0, ++ 0x00016780, 0x00018840, 0x0001a900, 0x0001c9c0, 0x0001ea80, 0x00020b40, ++ 0x00022c00, 0x00024cc0, 0x00026d80, 0x00028e40, 0x0002af00, 0x0002cfc0, ++ 0x0002f080, 0x00031140, 0x00033200, 0x000352c0, 0x00037380, 0x00039440, ++ 0x0003b500, 0x0003d5c0, 0x0003f680, 0x00041740, 0x00043800, 0x000458c0, ++ 0x00047980, 0x00049a40, 0x00008000, 0x00010380, 0x00018700, 0x00020a80, ++ 0x00028e00, 0x00031180, 0x00039500, 0x00041880, 0x00049c00, 0x00051f80, ++ 0x0005a300, 0x00062680, 0x0006aa00, 0x00072d80, 0x0007b100, 0x00083480, ++ 0x0008b800, 0x00093b80, 0x0009bf00, 0x000a4280, 0x000ac600, 0x000b4980, ++ 0x000bcd00, 0x000c5080, 0x000cd400, 0x000d5780, 0x000ddb00, 0x00001900, ++ 0x00100000, 0x00000000, 0x00000000, 0xffffffff, 0x40000000, 0x40000000, ++ 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, ++ 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, ++ 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, ++ 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, ++ 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, ++ 0x00000000, 0x00007ff8, 0x00000000, 0x00003500, 0xffffffff, 0xffffffff, ++ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, + 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, + 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, + 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, + 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, + 0x40000000, 0x40000000, 0x00000000, 0x00007ff8, 0x00000000, 0x00001500, +- 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +- 0xffffffff, 0xffffffff, 0x40000000, 0x40000000, 0x40000000, 0x40000000, +- 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, +- 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, +- 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, +- 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, +- 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x00000000, 0x00007ff8, +- 0x00000000, 0x00003500, 0x00001000, 0x00002080, 0x00003100, 0x00004180, +- 0x00005200, 0x00006280, 0x00007300, 0x00008380, 0x00009400, 0x0000a480, +- 0x0000b500, 0x0000c580, 0x0000d600, 0x0000e680, 0x0000f700, 0x00010780, +- 0x00011800, 0x00012880, 0x00013900, 0x00014980, 0x00015a00, 0x00016a80, +- 0x00017b00, 0x00018b80, 0x00019c00, 0x0001ac80, 0x0001bd00, 0x0001cd80, +- 0x0001de00, 0x0001ee80, 0x0001ff00, 0x00000000, 0x00010001, 0x00000604, +- 0xccccccc1, 0xffffffff, 0xffffffff, 0xcccc0201, 0xcccccccc, 0x00000000, +- 0xffffffff, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, +- 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, +- 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, +- 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, +- 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, +- 0x40000000, 0x40000000, 0x40000000, 0x00000000, 0x00007ff8, 0x00000000, +- 0x00003500, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, ++ 0x00001000, 0x00002080, 0x00003100, 0x00004180, 0x00005200, 0x00006280, ++ 0x00007300, 0x00008380, 0x00009400, 0x0000a480, 0x0000b500, 0x0000c580, ++ 0x0000d600, 0x0000e680, 0x0000f700, 0x00010780, 0x00011800, 0x00012880, ++ 0x00013900, 0x00014980, 0x00015a00, 0x00016a80, 0x00017b00, 0x00018b80, ++ 0x00019c00, 0x0001ac80, 0x0001bd00, 0x0001cd80, 0x0001de00, 0x0001ee80, ++ 0x0001ff00, 0x00000000, 0x00010001, 0x00150604, 0xccccccc1, 0xffffffff, ++ 0xffffffff, 0xcccc0201, 0xcccccccc, 0x00000000, 0xffffffff, 0x40000000, ++ 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, ++ 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, ++ 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, ++ 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, ++ 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, ++ 0x40000000, 0x00000000, 0x00007ff8, 0x00000000, 0x00003500, 0x0000ffff, + 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, +- 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x00100000, + 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, ++ 0x00000000, 0x0000ffff, 0x00000000, 0x00100000, 0x00000000, 0x0000ffff, + 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, +- 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x00100000, +- 0x00000000, 0xfffffff3, 0x320fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, +- 0xf3cf3cf3, 0x0000cf3c, 0xcdcdcdcd, 0xfffffff1, 0x30efffff, 0x0c30c30c, +- 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0001cf3c, 0xcdcdcdcd, 0xfffffff6, +- 0x305fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0002cf3c, +- 0xcdcdcdcd, 0xfffff406, 0x1cbfffff, 0x0c30c305, 0xc30c30c3, 0xcf300014, +- 0xf3cf3cf3, 0x0004cf3c, 0xcdcdcdcd, 0xfffffff2, 0x304fffff, 0x0c30c30c, +- 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0008cf3c, 0xcdcdcdcd, 0xfffffffa, +- 0x302fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0010cf3c, +- 0xcdcdcdcd, 0xfffffff7, 0x31efffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, +- 0xf3cf3cf3, 0x0020cf3c, 0xcdcdcdcd, 0xfffffff5, 0x302fffff, 0x0c30c30c, +- 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0040cf3c, 0xcdcdcdcd, 0xfffffff3, +- 0x310fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0000cf3c, +- 0xcdcdcdcd, 0xfffffff1, 0x310fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, ++ 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, ++ 0x00000000, 0x0000ffff, 0x00000000, 0x00100000, 0x00000000, 0xfffffff3, ++ 0x320fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0000cf3c, ++ 0xcdcdcdcd, 0xfffffff1, 0x30efffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, + 0xf3cf3cf3, 0x0001cf3c, 0xcdcdcdcd, 0xfffffff6, 0x305fffff, 0x0c30c30c, + 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0002cf3c, 0xcdcdcdcd, 0xfffff406, + 0x1cbfffff, 0x0c30c305, 0xc30c30c3, 0xcf300014, 0xf3cf3cf3, 0x0004cf3c, + 0xcdcdcdcd, 0xfffffff2, 0x304fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, + 0xf3cf3cf3, 0x0008cf3c, 0xcdcdcdcd, 0xfffffffa, 0x302fffff, 0x0c30c30c, + 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0010cf3c, 0xcdcdcdcd, 0xfffffff7, +- 0x30efffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0020cf3c, +- 0xcdcdcdcd, 0xfffffff5, 0x304fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, +- 0xf3cf3cf3, 0x0040cf3c, 0xcdcdcdcd, 0xfffffff3, 0x31efffff, 0x0c30c30c, ++ 0x31efffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0020cf3c, ++ 0xcdcdcdcd, 0xfffffff5, 0x302fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, ++ 0xf3cf3cf3, 0x0040cf3c, 0xcdcdcdcd, 0xfffffff3, 0x310fffff, 0x0c30c30c, + 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0000cf3c, 0xcdcdcdcd, 0xfffffff1, + 0x310fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0001cf3c, + 0xcdcdcdcd, 0xfffffff6, 0x305fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, +@@ -2585,41 +2638,41 @@ + 0xc30c30c3, 0xcf300014, 0xf3cf3cf3, 0x0004cf3c, 0xcdcdcdcd, 0xfffffff2, + 0x304fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0008cf3c, + 0xcdcdcdcd, 0xfffffffa, 0x302fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, +- 0xf3cf3cf3, 0x0010cf3c, 0xcdcdcdcd, 0xffffff97, 0x056fffff, 0x0c30c30c, +- 0xc30c30c3, 0xcf3cc000, 0xf3cf3cf3, 0x0020cf3c, 0xcdcdcdcd, 0xfffffff5, +- 0x310fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0040cf3c, +- 0xcdcdcdcd, 0xfffffff3, 0x320fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, ++ 0xf3cf3cf3, 0x0010cf3c, 0xcdcdcdcd, 0xfffffff7, 0x30efffff, 0x0c30c30c, ++ 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0020cf3c, 0xcdcdcdcd, 0xfffffff5, ++ 0x304fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0040cf3c, ++ 0xcdcdcdcd, 0xfffffff3, 0x31efffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, + 0xf3cf3cf3, 0x0000cf3c, 0xcdcdcdcd, 0xfffffff1, 0x310fffff, 0x0c30c30c, + 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0001cf3c, 0xcdcdcdcd, 0xfffffff6, + 0x305fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0002cf3c, + 0xcdcdcdcd, 0xfffff406, 0x1cbfffff, 0x0c30c305, 0xc30c30c3, 0xcf300014, + 0xf3cf3cf3, 0x0004cf3c, 0xcdcdcdcd, 0xfffffff2, 0x304fffff, 0x0c30c30c, +- 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0008cf3c, 0xcdcdcdcd, 0xffffff8a, +- 0x042fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cc000, 0xf3cf3cf3, 0x0010cf3c, +- 0xcdcdcdcd, 0xffffff97, 0x05cfffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cc000, ++ 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0008cf3c, 0xcdcdcdcd, 0xfffffffa, ++ 0x302fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0010cf3c, ++ 0xcdcdcdcd, 0xffffff97, 0x056fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cc000, + 0xf3cf3cf3, 0x0020cf3c, 0xcdcdcdcd, 0xfffffff5, 0x310fffff, 0x0c30c30c, + 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0040cf3c, 0xcdcdcdcd, 0xfffffff3, +- 0x300fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0000cf3c, +- 0xcdcdcdcd, 0xfffffff1, 0x300fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, ++ 0x320fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0000cf3c, ++ 0xcdcdcdcd, 0xfffffff1, 0x310fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, + 0xf3cf3cf3, 0x0001cf3c, 0xcdcdcdcd, 0xfffffff6, 0x305fffff, 0x0c30c30c, + 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0002cf3c, 0xcdcdcdcd, 0xfffff406, + 0x1cbfffff, 0x0c30c305, 0xc30c30c3, 0xcf300014, 0xf3cf3cf3, 0x0004cf3c, + 0xcdcdcdcd, 0xfffffff2, 0x304fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, +- 0xf3cf3cf3, 0x0008cf3c, 0xcdcdcdcd, 0xfffffffa, 0x302fffff, 0x0c30c30c, +- 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0010cf3c, 0xcdcdcdcd, 0xffffff97, +- 0x040fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cc000, 0xf3cf3cf3, 0x0020cf3c, +- 0xcdcdcdcd, 0xfffffff5, 0x300fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, +- 0xf3cf3cf3, 0x0040cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, 0x0c30c30c, +- 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, 0x0000cf3c, 0xcdcdcdcd, 0xffffffff, +- 0x30cfffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, 0x0001cf3c, +- 0xcdcdcdcd, 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, +- 0xf3cf3cf3, 0x0002cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, 0x0c30c30c, +- 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, 0x0004cf3c, 0xcdcdcdcd, 0xffffffff, +- 0x30cfffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, 0x0008cf3c, +- 0xcdcdcdcd, 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, +- 0xf3cf3cf3, 0x0010cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, 0x0c30c30c, +- 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, 0x0020cf3c, 0xcdcdcdcd, 0xffffffff, +- 0x30cfffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, 0x0040cf3c, ++ 0xf3cf3cf3, 0x0008cf3c, 0xcdcdcdcd, 0xffffff8a, 0x042fffff, 0x0c30c30c, ++ 0xc30c30c3, 0xcf3cc000, 0xf3cf3cf3, 0x0010cf3c, 0xcdcdcdcd, 0xffffff97, ++ 0x05cfffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cc000, 0xf3cf3cf3, 0x0020cf3c, ++ 0xcdcdcdcd, 0xfffffff5, 0x310fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, ++ 0xf3cf3cf3, 0x0040cf3c, 0xcdcdcdcd, 0xfffffff3, 0x300fffff, 0x0c30c30c, ++ 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0000cf3c, 0xcdcdcdcd, 0xfffffff1, ++ 0x300fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0001cf3c, ++ 0xcdcdcdcd, 0xfffffff6, 0x305fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, ++ 0xf3cf3cf3, 0x0002cf3c, 0xcdcdcdcd, 0xfffff406, 0x1cbfffff, 0x0c30c305, ++ 0xc30c30c3, 0xcf300014, 0xf3cf3cf3, 0x0004cf3c, 0xcdcdcdcd, 0xfffffff2, ++ 0x304fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0008cf3c, ++ 0xcdcdcdcd, 0xfffffffa, 0x302fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, ++ 0xf3cf3cf3, 0x0010cf3c, 0xcdcdcdcd, 0xffffff97, 0x040fffff, 0x0c30c30c, ++ 0xc30c30c3, 0xcf3cc000, 0xf3cf3cf3, 0x0020cf3c, 0xcdcdcdcd, 0xfffffff5, ++ 0x300fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0040cf3c, + 0xcdcdcdcd, 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, + 0xf3cf3cf3, 0x0000cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, 0x0c30c30c, + 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, 0x0001cf3c, 0xcdcdcdcd, 0xffffffff, +@@ -2641,16 +2694,26 @@ + 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, 0x0010cf3c, 0xcdcdcdcd, 0xffffffff, + 0x30cfffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, 0x0020cf3c, + 0xcdcdcdcd, 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, +- 0xf3cf3cf3, 0x0040cf3c, 0xcdcdcdcd, 0x00100000, 0x00070100, 0x00028170, +- 0x000b8198, 0x00020250, 0x00010270, 0x000f0280, 0x00010370, 0x00080000, +- 0x00080080, 0x00028100, 0x000b8128, 0x000201e0, 0x00010200, 0x00070210, +- 0x00020280, 0x000f0000, 0x000800f0, 0x00028170, 0x000b8198, 0x00020250, +- 0x00010270, 0x000b8280, 0x00080338, 0x00100000, 0x00080100, 0x00028180, +- 0x000b81a8, 0x00020260, 0x00018280, 0x000e8298, 0x00080380, 0x00028000, +- 0x000b8028, 0x000200e0, 0x00010100, 0x00008110, 0x00000118, 0xcccccccc, +- 0xcccccccc, 0xcccccccc, 0xcccccccc, 0x00002000, 0xcccccccc, 0xcccccccc, +- 0xcccccccc, 0xcccccccc, 0x00002000, 0xcccccccc, 0xcccccccc, 0xcccccccc, +- 0xcccccccc, 0x00002000 ++ 0xf3cf3cf3, 0x0040cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, 0x0c30c30c, ++ 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, 0x0000cf3c, 0xcdcdcdcd, 0xffffffff, ++ 0x30cfffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, 0x0001cf3c, ++ 0xcdcdcdcd, 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, ++ 0xf3cf3cf3, 0x0002cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, 0x0c30c30c, ++ 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, 0x0004cf3c, 0xcdcdcdcd, 0xffffffff, ++ 0x30cfffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, 0x0008cf3c, ++ 0xcdcdcdcd, 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, ++ 0xf3cf3cf3, 0x0010cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, 0x0c30c30c, ++ 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, 0x0020cf3c, 0xcdcdcdcd, 0xffffffff, ++ 0x30cfffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, 0x0040cf3c, ++ 0xcdcdcdcd, 0x00100000, 0x00070100, 0x00028170, 0x000b8198, 0x00020250, ++ 0x00010270, 0x000f0280, 0x00010370, 0x00080000, 0x00080080, 0x00028100, ++ 0x000b8128, 0x000201e0, 0x00010200, 0x00070210, 0x00020280, 0x000f0000, ++ 0x000800f0, 0x00028170, 0x000b8198, 0x00020250, 0x00010270, 0x000b8280, ++ 0x00080338, 0x00100000, 0x00080100, 0x00028180, 0x000b81a8, 0x00020260, ++ 0x00018280, 0x000e8298, 0x00080380, 0x00028000, 0x000b8028, 0x000200e0, ++ 0x00010100, 0x00008110, 0x00000118, 0xcccccccc, 0xcccccccc, 0xcccccccc, ++ 0xcccccccc, 0x00002000, 0xcccccccc, 0xcccccccc, 0xcccccccc, 0xcccccccc, ++ 0x00002000, 0xcccccccc, 0xcccccccc, 0xcccccccc, 0xcccccccc, 0x00002000 + }; + + static const u32 init_data_e1h[] = { +@@ -2751,11973 +2814,13327 @@ + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00007ff8, +- 0x00000000, 0x00003500, 0x00000003, 0x00bebc20, 0x00000003, 0x00bebc20, +- 0x00000003, 0x00bebc20, 0x00000003, 0x00bebc20, 0x00000003, 0x00bebc20, +- 0x00000003, 0x00bebc20, 0x00002000, 0x000040c0, 0x00006180, 0x00008240, +- 0x0000a300, 0x0000c3c0, 0x0000e480, 0x00010540, 0x00012600, 0x000146c0, +- 0x00016780, 0x00018840, 0x0001a900, 0x0001c9c0, 0x0001ea80, 0x00020b40, +- 0x00022c00, 0x00024cc0, 0x00026d80, 0x00028e40, 0x0002af00, 0x0002cfc0, +- 0x0002f080, 0x00031140, 0x00033200, 0x000352c0, 0x00037380, 0x00039440, +- 0x0003b500, 0x0003d5c0, 0x0003f680, 0x00041740, 0x00043800, 0x000458c0, +- 0x00047980, 0x00049a40, 0x00008000, 0x00010380, 0x00018700, 0x00020a80, +- 0x00028e00, 0x00031180, 0x00039500, 0x00041880, 0x00049c00, 0x00051f80, +- 0x0005a300, 0x00062680, 0x0006aa00, 0x00072d80, 0x0007b100, 0x00083480, +- 0x0008b800, 0x00093b80, 0x0009bf00, 0x000a4280, 0x000ac600, 0x000b4980, +- 0x000bcd00, 0x000c5080, 0x000cd400, 0x000d5780, 0x000ddb00, 0x00001900, +- 0x00000028, 0x00000000, 0x00100000, 0x00000000, 0x00000000, 0xffffffff, +- 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, +- 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, +- 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, +- 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, +- 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, +- 0x40000000, 0x40000000, 0x00000000, 0x00007ff8, 0x00000000, 0x00001500, ++ 0x00000000, 0x00001500, 0xffffffff, 0x00000000, 0xffffffff, 0x00000000, ++ 0xffffffff, 0xffffffff, 0x00000000, 0xffffffff, 0x00000000, 0xffffffff, ++ 0xffffffff, 0x00000000, 0xffffffff, 0x00000000, 0xffffffff, 0x00000003, ++ 0x00bebc20, 0xffffffff, 0x00000000, 0xffffffff, 0x00000000, 0xffffffff, ++ 0x00000003, 0x00bebc20, 0xffffffff, 0x00000000, 0xffffffff, 0x00000000, ++ 0xffffffff, 0x00000003, 0x00bebc20, 0xffffffff, 0x00000000, 0xffffffff, ++ 0x00000000, 0xffffffff, 0x00000003, 0x00bebc20, 0xffffffff, 0x00000000, ++ 0xffffffff, 0x00000000, 0xffffffff, 0x00000003, 0x00bebc20, 0xffffffff, ++ 0x00000000, 0xffffffff, 0x00000000, 0xffffffff, 0x00000003, 0x00bebc20, ++ 0x00002000, 0x000040c0, 0x00006180, 0x00008240, 0x0000a300, 0x0000c3c0, ++ 0x0000e480, 0x00010540, 0x00012600, 0x000146c0, 0x00016780, 0x00018840, ++ 0x0001a900, 0x0001c9c0, 0x0001ea80, 0x00020b40, 0x00022c00, 0x00024cc0, ++ 0x00026d80, 0x00028e40, 0x0002af00, 0x0002cfc0, 0x0002f080, 0x00031140, ++ 0x00033200, 0x000352c0, 0x00037380, 0x00039440, 0x0003b500, 0x0003d5c0, ++ 0x0003f680, 0x00041740, 0x00043800, 0x000458c0, 0x00047980, 0x00049a40, ++ 0x00008000, 0x00010380, 0x00018700, 0x00020a80, 0x00028e00, 0x00031180, ++ 0x00039500, 0x00041880, 0x00049c00, 0x00051f80, 0x0005a300, 0x00062680, ++ 0x0006aa00, 0x00072d80, 0x0007b100, 0x00083480, 0x0008b800, 0x00093b80, ++ 0x0009bf00, 0x000a4280, 0x000ac600, 0x000b4980, 0x000bcd00, 0x000c5080, ++ 0x000cd400, 0x000d5780, 0x000ddb00, 0x00001900, 0x00000028, 0x00100000, ++ 0x00000000, 0x00000000, 0xffffffff, 0x40000000, 0x40000000, 0x40000000, ++ 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, ++ 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, ++ 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, ++ 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, ++ 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x00000000, ++ 0x00007ff8, 0x00000000, 0x00001500, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +- 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +- 0xffffffff, 0xffffffff, 0x40000000, 0x40000000, 0x40000000, 0x40000000, +- 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, +- 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, +- 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, +- 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, +- 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x00000000, 0x00007ff8, +- 0x00000000, 0x00003500, 0x00001000, 0x00002080, 0x00003100, 0x00004180, +- 0x00005200, 0x00006280, 0x00007300, 0x00008380, 0x00009400, 0x0000a480, +- 0x0000b500, 0x0000c580, 0x0000d600, 0x0000e680, 0x0000f700, 0x00010780, +- 0x00011800, 0x00012880, 0x00013900, 0x00014980, 0x00015a00, 0x00016a80, +- 0x00017b00, 0x00018b80, 0x00019c00, 0x0001ac80, 0x0001bd00, 0x0001cd80, +- 0x0001de00, 0x0001ee80, 0x0001ff00, 0x00000000, 0x00010001, 0x00000604, +- 0xccccccc5, 0xffffffff, 0xffffffff, 0xcccc0201, 0xcccccccc, 0xcccc0201, +- 0xcccccccc, 0xcccc0201, 0xcccccccc, 0xcccc0201, 0xcccccccc, 0xcccc0201, +- 0xcccccccc, 0xcccc0201, 0xcccccccc, 0xcccc0201, 0xcccccccc, 0xcccc0201, +- 0xcccccccc, 0x00000000, 0xffffffff, 0x40000000, 0x40000000, 0x40000000, +- 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, +- 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, +- 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, +- 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, +- 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x00000000, +- 0x00007ff8, 0x00000000, 0x00003500, 0x00100000, 0x00000000, 0x00100000, +- 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, +- 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, +- 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, +- 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, +- 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, +- 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, +- 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, +- 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, +- 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, +- 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, +- 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, +- 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, +- 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, +- 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, +- 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, +- 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, +- 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, +- 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, +- 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, +- 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, +- 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, +- 0x00000000, 0x0000ffff, 0x00000000, 0xfffffff3, 0x320fffff, 0x0c30c30c, +- 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0000cf3c, 0xcdcdcdcd, 0xfffffff1, +- 0x30efffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0001cf3c, +- 0xcdcdcdcd, 0xfffffff6, 0x305fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, +- 0xf3cf3cf3, 0x0002cf3c, 0xcdcdcdcd, 0xfffff406, 0x1cbfffff, 0x0c30c305, +- 0xc30c30c3, 0xcf300014, 0xf3cf3cf3, 0x0004cf3c, 0xcdcdcdcd, 0xfffffff2, +- 0x304fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0008cf3c, +- 0xcdcdcdcd, 0xfffffffa, 0x302fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, +- 0xf3cf3cf3, 0x0010cf3c, 0xcdcdcdcd, 0xfffffff7, 0x31efffff, 0x0c30c30c, +- 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0020cf3c, 0xcdcdcdcd, 0xfffffff5, +- 0x302fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0040cf3c, +- 0xcdcdcdcd, 0xfffffff3, 0x310fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, +- 0xf3cf3cf3, 0x0000cf3c, 0xcdcdcdcd, 0xfffffff1, 0x310fffff, 0x0c30c30c, +- 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0001cf3c, 0xcdcdcdcd, 0xfffffff6, +- 0x305fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0002cf3c, +- 0xcdcdcdcd, 0xfffff406, 0x1cbfffff, 0x0c30c305, 0xc30c30c3, 0xcf300014, +- 0xf3cf3cf3, 0x0004cf3c, 0xcdcdcdcd, 0xfffffff2, 0x304fffff, 0x0c30c30c, +- 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0008cf3c, 0xcdcdcdcd, 0xfffffffa, +- 0x302fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0010cf3c, +- 0xcdcdcdcd, 0xfffffff7, 0x30efffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, +- 0xf3cf3cf3, 0x0020cf3c, 0xcdcdcdcd, 0xfffffff5, 0x304fffff, 0x0c30c30c, +- 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0040cf3c, 0xcdcdcdcd, 0xfffffff3, +- 0x31efffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0000cf3c, +- 0xcdcdcdcd, 0xfffffff1, 0x310fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, +- 0xf3cf3cf3, 0x0001cf3c, 0xcdcdcdcd, 0xfffffff6, 0x305fffff, 0x0c30c30c, +- 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0002cf3c, 0xcdcdcdcd, 0xfffff406, +- 0x1cbfffff, 0x0c30c305, 0xc30c30c3, 0xcf300014, 0xf3cf3cf3, 0x0004cf3c, +- 0xcdcdcdcd, 0xfffffff2, 0x304fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, +- 0xf3cf3cf3, 0x0008cf3c, 0xcdcdcdcd, 0xfffffffa, 0x302fffff, 0x0c30c30c, +- 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0010cf3c, 0xcdcdcdcd, 0xffffff97, +- 0x056fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cc000, 0xf3cf3cf3, 0x0020cf3c, +- 0xcdcdcdcd, 0xfffffff5, 0x310fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, +- 0xf3cf3cf3, 0x0040cf3c, 0xcdcdcdcd, 0xfffffff3, 0x320fffff, 0x0c30c30c, +- 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0000cf3c, 0xcdcdcdcd, 0xfffffff1, +- 0x310fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0001cf3c, +- 0xcdcdcdcd, 0xfffffff6, 0x305fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, +- 0xf3cf3cf3, 0x0002cf3c, 0xcdcdcdcd, 0xfffff406, 0x1cbfffff, 0x0c30c305, +- 0xc30c30c3, 0xcf300014, 0xf3cf3cf3, 0x0004cf3c, 0xcdcdcdcd, 0xfffffff2, +- 0x304fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0008cf3c, +- 0xcdcdcdcd, 0xffffff8a, 0x042fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cc000, +- 0xf3cf3cf3, 0x0010cf3c, 0xcdcdcdcd, 0xffffff97, 0x05cfffff, 0x0c30c30c, +- 0xc30c30c3, 0xcf3cc000, 0xf3cf3cf3, 0x0020cf3c, 0xcdcdcdcd, 0xfffffff5, +- 0x310fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0040cf3c, +- 0xcdcdcdcd, 0xfffffff3, 0x31afffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, +- 0xf3cf3cf3, 0x0000cf3c, 0xcdcdcdcd, 0xfffffff1, 0x300fffff, 0x0c30c30c, +- 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0001cf3c, 0xcdcdcdcd, 0xfffffff6, +- 0x305fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0002cf3c, +- 0xcdcdcdcd, 0xfffff406, 0x1cbfffff, 0x0c30c305, 0xc30c30c3, 0xcf300014, +- 0xf3cf3cf3, 0x0004cf3c, 0xcdcdcdcd, 0xfffffff2, 0x304fffff, 0x0c30c30c, +- 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0008cf3c, 0xcdcdcdcd, 0xfffffffa, +- 0x302fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0010cf3c, +- 0xcdcdcdcd, 0xffffff97, 0x058fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cc000, +- 0xf3cf3cf3, 0x0020cf3c, 0xcdcdcdcd, 0xfffffff5, 0x300fffff, 0x0c30c30c, +- 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0040cf3c, 0xcdcdcdcd, 0xffffffff, +- 0x30cfffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, 0x0000cf3c, +- 0xcdcdcdcd, 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, +- 0xf3cf3cf3, 0x0001cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, 0x0c30c30c, +- 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, 0x0002cf3c, 0xcdcdcdcd, 0xffffffff, +- 0x30cfffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, 0x0004cf3c, +- 0xcdcdcdcd, 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, +- 0xf3cf3cf3, 0x0008cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, 0x0c30c30c, +- 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, 0x0010cf3c, 0xcdcdcdcd, 0xffffffff, +- 0x30cfffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, 0x0020cf3c, +- 0xcdcdcdcd, 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, +- 0xf3cf3cf3, 0x0040cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, 0x0c30c30c, +- 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, 0x0000cf3c, 0xcdcdcdcd, 0xffffffff, +- 0x30cfffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, 0x0001cf3c, +- 0xcdcdcdcd, 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, +- 0xf3cf3cf3, 0x0002cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, 0x0c30c30c, +- 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, 0x0004cf3c, 0xcdcdcdcd, 0xffffffff, +- 0x30cfffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, 0x0008cf3c, +- 0xcdcdcdcd, 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, +- 0xf3cf3cf3, 0x0010cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, 0x0c30c30c, +- 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, 0x0020cf3c, 0xcdcdcdcd, 0xffffffff, +- 0x30cfffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, 0x0040cf3c, +- 0xcdcdcdcd, 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, +- 0xf3cf3cf3, 0x0000cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, 0x0c30c30c, +- 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, 0x0001cf3c, 0xcdcdcdcd, 0xffffffff, +- 0x30cfffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, 0x0002cf3c, +- 0xcdcdcdcd, 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, +- 0xf3cf3cf3, 0x0004cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, 0x0c30c30c, +- 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, 0x0008cf3c, 0xcdcdcdcd, 0xffffffff, +- 0x30cfffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, 0x0010cf3c, +- 0xcdcdcdcd, 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, +- 0xf3cf3cf3, 0x0020cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, 0x0c30c30c, +- 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, 0x0040cf3c, 0xcdcdcdcd, 0x00100000, +- 0x00070100, 0x00028170, 0x000b8198, 0x00020250, 0x00010270, 0x000f0280, +- 0x00010370, 0x00080000, 0x00080080, 0x00028100, 0x000b8128, 0x000201e0, +- 0x00010200, 0x00070210, 0x00020280, 0x000f0000, 0x000800f0, 0x00028170, +- 0x000b8198, 0x00020250, 0x00010270, 0x000b8280, 0x00080338, 0x00100000, +- 0x00080100, 0x00028180, 0x000b81a8, 0x00020260, 0x00018280, 0x000e8298, +- 0x00080380, 0x000d0000, 0x000000d0, 0x000280d0, 0x000b80f8, 0x000201b0, +- 0x000101d0, 0x000c81e0, 0x000002a8, 0xcccccccc, 0xcccccccc, 0xcccccccc, +- 0xcccccccc, 0x00002000, 0xcccccccc, 0xcccccccc, 0xcccccccc, 0xcccccccc, +- 0x00002000 ++ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x40000000, ++ 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, ++ 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, ++ 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, ++ 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, ++ 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, ++ 0x40000000, 0x00000000, 0x00007ff8, 0x00000000, 0x00001500, 0x00001000, ++ 0x00002080, 0x00003100, 0x00004180, 0x00005200, 0x00006280, 0x00007300, ++ 0x00008380, 0x00009400, 0x0000a480, 0x0000b500, 0x0000c580, 0x0000d600, ++ 0x0000e680, 0x0000f700, 0x00010780, 0x00011800, 0x00012880, 0x00013900, ++ 0x00014980, 0x00015a00, 0x00016a80, 0x00017b00, 0x00018b80, 0x00019c00, ++ 0x0001ac80, 0x0001bd00, 0x0001cd80, 0x0001de00, 0x0001ee80, 0x0001ff00, ++ 0x00000000, 0x00010001, 0x00150604, 0xccccccc5, 0xffffffff, 0xffffffff, ++ 0xcccc0201, 0xcccccccc, 0xcccc0201, 0xcccccccc, 0xcccc0201, 0xcccccccc, ++ 0xcccc0201, 0xcccccccc, 0xcccc0201, 0xcccccccc, 0xcccc0201, 0xcccccccc, ++ 0xcccc0201, 0xcccccccc, 0xcccc0201, 0xcccccccc, 0x00000000, 0xffffffff, ++ 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, ++ 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, ++ 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, ++ 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, ++ 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, ++ 0x40000000, 0x40000000, 0x00000000, 0x00007ff8, 0x00000000, 0x00003500, ++ 0x00100000, 0x00000000, 0x00100000, 0x00000000, 0x0000ffff, 0x00000000, ++ 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, ++ 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, ++ 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, ++ 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, ++ 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, ++ 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, ++ 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, ++ 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, ++ 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, ++ 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, ++ 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, ++ 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, ++ 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, ++ 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, ++ 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, ++ 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, ++ 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, ++ 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, ++ 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, ++ 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, ++ 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, ++ 0xfffffff3, 0x320fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, ++ 0x0000cf3c, 0xcdcdcdcd, 0xfffffff1, 0x30efffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cf300, 0xf3cf3cf3, 0x0001cf3c, 0xcdcdcdcd, 0xfffffff6, 0x305fffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0002cf3c, 0xcdcdcdcd, ++ 0xfffff406, 0x1cbfffff, 0x0c30c305, 0xc30c30c3, 0xcf300014, 0xf3cf3cf3, ++ 0x0004cf3c, 0xcdcdcdcd, 0xfffffff2, 0x304fffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cf300, 0xf3cf3cf3, 0x0008cf3c, 0xcdcdcdcd, 0xfffffffa, 0x302fffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0010cf3c, 0xcdcdcdcd, ++ 0xfffffff7, 0x31efffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, ++ 0x0020cf3c, 0xcdcdcdcd, 0xfffffff5, 0x302fffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cf300, 0xf3cf3cf3, 0x0040cf3c, 0xcdcdcdcd, 0xfffffff3, 0x310fffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0000cf3c, 0xcdcdcdcd, ++ 0xfffffff1, 0x310fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, ++ 0x0001cf3c, 0xcdcdcdcd, 0xfffffff6, 0x305fffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cf300, 0xf3cf3cf3, 0x0002cf3c, 0xcdcdcdcd, 0xfffff406, 0x1cbfffff, ++ 0x0c30c305, 0xc30c30c3, 0xcf300014, 0xf3cf3cf3, 0x0004cf3c, 0xcdcdcdcd, ++ 0xfffffff2, 0x304fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, ++ 0x0008cf3c, 0xcdcdcdcd, 0xfffffffa, 0x302fffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cf300, 0xf3cf3cf3, 0x0010cf3c, 0xcdcdcdcd, 0xfffffff7, 0x30efffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0020cf3c, 0xcdcdcdcd, ++ 0xfffffff5, 0x304fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, ++ 0x0040cf3c, 0xcdcdcdcd, 0xfffffff3, 0x31efffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cf300, 0xf3cf3cf3, 0x0000cf3c, 0xcdcdcdcd, 0xfffffff1, 0x310fffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0001cf3c, 0xcdcdcdcd, ++ 0xfffffff6, 0x305fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, ++ 0x0002cf3c, 0xcdcdcdcd, 0xfffff406, 0x1cbfffff, 0x0c30c305, 0xc30c30c3, ++ 0xcf300014, 0xf3cf3cf3, 0x0004cf3c, 0xcdcdcdcd, 0xfffffff2, 0x304fffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0008cf3c, 0xcdcdcdcd, ++ 0xfffffffa, 0x302fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, ++ 0x0010cf3c, 0xcdcdcdcd, 0xffffff97, 0x056fffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cc000, 0xf3cf3cf3, 0x0020cf3c, 0xcdcdcdcd, 0xfffffff5, 0x310fffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0040cf3c, 0xcdcdcdcd, ++ 0xfffffff3, 0x320fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, ++ 0x0000cf3c, 0xcdcdcdcd, 0xfffffff1, 0x310fffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cf300, 0xf3cf3cf3, 0x0001cf3c, 0xcdcdcdcd, 0xfffffff6, 0x305fffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0002cf3c, 0xcdcdcdcd, ++ 0xfffff406, 0x1cbfffff, 0x0c30c305, 0xc30c30c3, 0xcf300014, 0xf3cf3cf3, ++ 0x0004cf3c, 0xcdcdcdcd, 0xfffffff2, 0x304fffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cf300, 0xf3cf3cf3, 0x0008cf3c, 0xcdcdcdcd, 0xffffff8a, 0x042fffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cc000, 0xf3cf3cf3, 0x0010cf3c, 0xcdcdcdcd, ++ 0xffffff97, 0x05cfffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cc000, 0xf3cf3cf3, ++ 0x0020cf3c, 0xcdcdcdcd, 0xfffffff5, 0x310fffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cf300, 0xf3cf3cf3, 0x0040cf3c, 0xcdcdcdcd, 0xfffffff3, 0x316fffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0000cf3c, 0xcdcdcdcd, ++ 0xfffffff1, 0x302fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, ++ 0x0001cf3c, 0xcdcdcdcd, 0xfffffff6, 0x305fffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cf300, 0xf3cf3cf3, 0x0002cf3c, 0xcdcdcdcd, 0xfffffff6, 0x30bfffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cf314, 0xf3cf3cf3, 0x0004cf3c, 0xcdcdcdcd, ++ 0xfffffff2, 0x304fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, ++ 0x0008cf3c, 0xcdcdcdcd, 0xfffffffa, 0x302fffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cf300, 0xf3cf3cf3, 0x0010cf3c, 0xcdcdcdcd, 0xfffffff7, 0x31cfffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0020cf3c, 0xcdcdcdcd, ++ 0xfffffff0, 0x307fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, ++ 0x0040cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cf3cc, 0xf3cf3cf3, 0x0000cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, 0x0001cf3c, 0xcdcdcdcd, ++ 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, ++ 0x0002cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cf3cc, 0xf3cf3cf3, 0x0004cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, 0x0008cf3c, 0xcdcdcdcd, ++ 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, ++ 0x0010cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cf3cc, 0xf3cf3cf3, 0x0020cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, 0x0040cf3c, 0xcdcdcdcd, ++ 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, ++ 0x0000cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cf3cc, 0xf3cf3cf3, 0x0001cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, 0x0002cf3c, 0xcdcdcdcd, ++ 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, ++ 0x0004cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cf3cc, 0xf3cf3cf3, 0x0008cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, 0x0010cf3c, 0xcdcdcdcd, ++ 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, ++ 0x0020cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cf3cc, 0xf3cf3cf3, 0x0040cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, 0x0000cf3c, 0xcdcdcdcd, ++ 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, ++ 0x0001cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cf3cc, 0xf3cf3cf3, 0x0002cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, 0x0004cf3c, 0xcdcdcdcd, ++ 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, ++ 0x0008cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cf3cc, 0xf3cf3cf3, 0x0010cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, 0x0020cf3c, 0xcdcdcdcd, ++ 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, ++ 0x0040cf3c, 0xcdcdcdcd, 0x00100000, 0x00070100, 0x00028170, 0x000b8198, ++ 0x00020250, 0x00010270, 0x000f0280, 0x00010370, 0x00080000, 0x00080080, ++ 0x00028100, 0x000b8128, 0x000201e0, 0x00010200, 0x00070210, 0x00020280, ++ 0x000f0000, 0x000800f0, 0x00028170, 0x000b8198, 0x00020250, 0x00010270, ++ 0x000b8280, 0x00080338, 0x00100000, 0x00080100, 0x00028180, 0x000b81a8, ++ 0x00020260, 0x00018280, 0x000e8298, 0x00080380, 0x000b0000, 0x000100b0, ++ 0x000280c0, 0x000580e8, 0x00020140, 0x00010160, 0x000e0170, 0x00038250, ++ 0xcccccccc, 0xcccccccc, 0xcccccccc, 0xcccccccc, 0x00002000, 0xcccccccc, ++ 0xcccccccc, 0xcccccccc, 0xcccccccc, 0x00002000, 0xcccccccc, 0xcccccccc, ++ 0xcccccccc, 0xcccccccc, 0x04002000 + }; + + static const u32 tsem_int_table_data_e1[] = { +- 0x00088b1f, 0x00000000, 0x51fbff00, 0x03f0c0cf, 0x19d9b38a, 0x22717618, +- 0xa70143f8, 0xa4303332, 0x10267103, 0x97e204af, 0xaf0c0c8c, 0x2fd78918, +- 0xcf608621, 0x38606610, 0x4206c402, 0x22450c0c, 0xa07af108, 0xfe407b9a, +- 0xb698a842, 0x76c30328, 0x3bf781d1, 0x34957035, 0x24a458a6, 0x458d5d82, +- 0xa0d7191e, 0x4494efc9, 0xd012d7e5, 0x4538d03f, 0x513f9509, 0x547f4201, +- 0x342fa684, 0xf95049f9, 0xa57f5039, 0x77376129, 0x001e542e, 0x61aa8a92, ++ 0x00088b1f, 0x00000000, 0x51fbff00, 0x03f0c0cf, 0x19d8c58a, 0x1138fc18, ++ 0x5980a1fc, 0xd8181998, 0x88039880, 0x81b8803d, 0x91a18191, 0x57fd7891, ++ 0x6f6c1144, 0x72860661, 0xc82d3e20, 0x8229a0c0, 0x6313b710, 0xe40a9860, ++ 0x1ec54047, 0x517ce903, 0xa07fb8ea, 0xa6349471, 0x8224a598, 0x1e458d1d, ++ 0xc9a0c719, 0xe54494cf, 0x3fd012c7, 0x12af78d0, 0x02a1ff2a, 0x8a84f684, ++ 0x7f9343ef, 0x81af9504, 0x12bf6bfa, 0xa16b7376, 0xc73200f2, 0x0360ecb6, + 0x00000360 + }; + + static const u32 tsem_pram_data_e1[] = { +- 0x00088b1f, 0x00000000, 0x7dedff00, 0xd554780b, 0x733ef0b5, 0x49999cce, +- 0x204e4cce, 0x30840909, 0x43511879, 0x7c061e1c, 0x201276f4, 0x06bf2ae5, +- 0x0ea2a17c, 0x2de42108, 0xebf8fea5, 0x092132fd, 0xf636c544, 0xda2f45a2, +- 0x05a855e1, 0xa180d03b, 0x4a00ee05, 0x7836daa1, 0xf5ab15bd, 0x62a2968e, +- 0x96ad2248, 0xbfcb17fe, 0x24fbdad6, 0x00664e73, 0xbbf7bdcb, 0x9fa7efd7, +- 0xece7d9dd, 0xebdaf7b3, 0x7b5ad7b5, 0x5d8a3ded, 0x19d7ea62, 0xa0ff873b, +- 0xc631b3ec, 0x9f2c19ae, 0x23a57cc8, 0x6ad8cbd7, 0x3127d43b, 0x0f623c16, +- 0x5b18926d, 0xb59fda32, 0x71ca0d30, 0xbc20be69, 0xebe16767, 0xc654c612, +- 0x9b4aadff, 0xe8f2c994, 0xf073b9f9, 0xf30f81dc, 0x58564b19, 0x63026530, +- 0xafcc6c2b, 0x8fba830f, 0xfc9c0fb1, 0x7ff8739b, 0xf61b24c1, 0xbf874233, +- 0xaf3edfa1, 0x814f682d, 0xedcdb37e, 0x1215494e, 0xd5db1993, 0x140bd2c4, +- 0x9c9abac6, 0x49b4fe54, 0x60282f4f, 0x26534f6c, 0x7935f7d5, 0x8d348ca9, +- 0x9a07e7a5, 0xb34f547c, 0xf7e3d7f5, 0x2b7c8e23, 0xce0d1595, 0x68ae5adf, +- 0x060b7182, 0x64cc7feb, 0xf9e00541, 0xafeec2a3, 0x5f9aef80, 0x8512989f, +- 0x802c99f2, 0xf7e86536, 0x45fb2ecf, 0x8ce1b4fe, 0x387c3d65, 0x6844da7f, +- 0xe139b127, 0x87459c22, 0xe25c6b34, 0x77b19f71, 0xcdc032a4, 0x6991802d, +- 0xb9b58c99, 0x4f2e6ffa, 0x44f5cc65, 0x0b9a7fb6, 0x5d0cdde6, 0x2eec648c, +- 0xde0c1056, 0xf81ffd00, 0xe80525b8, 0x614976a1, 0x4b26cd78, 0xd012cd15, +- 0x7ccedd8b, 0xa538709b, 0xd41479a2, 0xde60eefb, 0xe383bdc7, 0x9880c5dc, +- 0x46ccd8e9, 0x32a864e5, 0xa5dd87e8, 0xe2e53686, 0x15c5fd87, 0x2fb712e3, +- 0xd517f839, 0xf6f1a6eb, 0x078d328f, 0x7f13b9df, 0xcbe07597, 0xaef7d77d, +- 0x78842332, 0xe11f9853, 0xc657753b, 0xde25c7ba, 0x7d8f163e, 0xc70aab2a, +- 0x8e1567a1, 0x66dcfc0b, 0x367b74e7, 0xb18d4a17, 0x16663835, 0x9c62b563, +- 0x03d95a29, 0x3000b258, 0xb58cb5e7, 0xdda0bd20, 0x3abf6894, 0xdf4ae00f, +- 0x852a4b33, 0x0af1fa7a, 0xf2115e69, 0x10cf41a1, 0xb1259ff5, 0x9ef81d8a, +- 0x70ca92cd, 0xe71f3b1c, 0x8b50fe86, 0xe86ee007, 0xec9eddca, 0x6194fde5, +- 0x48553fbb, 0x3858b5f3, 0x7a4fd4bd, 0xdf038c17, 0x38c0f7a7, 0xa56b3ef0, +- 0xfe69bac4, 0xe1a614de, 0x32c67e78, 0x70a6a440, 0xa8d99099, 0x7867e424, +- 0xfc8165ae, 0x3f2e3364, 0x8be635a7, 0x9f737e00, 0xd0d47cd4, 0x783579ab, +- 0x69c85a3f, 0x266aa076, 0x01b630f3, 0x530593d0, 0x7ca8dd1e, 0xb3918d10, +- 0xcda37331, 0x9663fa28, 0x997b9f99, 0x9cf286d7, 0xcf3f341b, 0xbfd7376f, +- 0x2769dccd, 0xdc3f82ae, 0x8e4e7dcc, 0xc0e38f33, 0x12cf00d4, 0x6fc0ef21, +- 0xadbf2c6a, 0x5a19626d, 0x91396241, 0x5dce1c96, 0xb7687a89, 0xf7c073e4, +- 0x907b602f, 0x6ef890ef, 0x05d7a8bd, 0x0d5d8555, 0x1e282025, 0x958afc7f, +- 0x1fba406e, 0x101b6567, 0xbf4a0dff, 0x0d7c03aa, 0xa43faa8d, 0x17bf6d0d, +- 0xd7db1118, 0x4e03be2b, 0x99bfbf18, 0xf8c3d6f9, 0x197aec4b, 0xec3c97d6, +- 0xd798bd25, 0x7e472d1e, 0xea05d31d, 0xfbf0772a, 0x2767808b, 0xecf001c2, +- 0x97f4e3e4, 0xdfedfea3, 0xb9f5b12b, 0x77ef0e38, 0x165ceec9, 0xe70c4dcc, +- 0xfc4ecc73, 0xbc0b40b4, 0x267ee582, 0x02c62729, 0x83cc3d9a, 0xcaa968f4, +- 0x54394efb, 0xe9f7c69f, 0xf9ccf583, 0x00033233, 0x6618d657, 0xb3a557a2, +- 0x7af50731, 0x1cb84575, 0x25c3e2f9, 0x12c0acaf, 0x00ae9cf0, 0x2a388fbe, +- 0xea7ec75e, 0xa21636e6, 0xe870edc8, 0x7b1afe34, 0x7237d647, 0x1fa50f11, +- 0xd06fc02b, 0x1865306d, 0xff4595f2, 0xc60fbfc3, 0x989cba8a, 0x172a17ee, +- 0xe20a3f60, 0xf59fcb8d, 0x0f4207fd, 0xf8261e81, 0x957ecbbc, 0xb63c305f, +- 0xc17e7afe, 0x09500144, 0x13f0cbc1, 0x4552a2c6, 0x663dbd1c, 0xa561e977, +- 0xff3c3138, 0x7404f3d9, 0x001a7cd2, 0x7527c8b7, 0x1cb4356e, 0xa7753df0, +- 0xe075f23d, 0x5275ba93, 0xdb7501c8, 0xefbd173e, 0x11ebcb5d, 0xe9f5cab7, +- 0x0a83a846, 0x7f74706c, 0xb3e47afb, 0x8f5b329d, 0xf5858edd, 0x09ccf418, +- 0xc49b3b01, 0x174ae7d7, 0xdbadd6af, 0x5f7e1f7f, 0x2e60e5d5, 0xf76eafe8, +- 0x87af9ba2, 0x76c3a2fa, 0x36ea4d86, 0xa123ab35, 0xd7c438be, 0x0e32bea5, +- 0x4c97705f, 0xa79f4beb, 0xa076e33b, 0x2726c9cf, 0xd0f182f3, 0xb8ceeee2, +- 0x3aadf80d, 0xbf1cbdb4, 0xf92adeab, 0x7753ed10, 0x85943a6e, 0x9721faf3, +- 0xc92d9af3, 0x0fe06bcc, 0x29d13bfe, 0xef0ebe47, 0x193cc097, 0x7588bbf4, +- 0xac3ea394, 0xad14f4db, 0x4ebe0633, 0xce34e936, 0x10fe1c80, 0xeaef81c6, +- 0x387c925f, 0x0b1b7ac5, 0xeef63ca0, 0xa0d9cd76, 0xd59afce1, 0x6bce3742, +- 0x16ed8aa5, 0x72ede685, 0x75be1179, 0xafbc396a, 0xad4ebb5e, 0x9adf918c, +- 0x70cdc32d, 0x111fc9ad, 0x717d8f38, 0x6f0bec12, 0x1abd60e1, 0x45ea01f5, +- 0xaec6a425, 0xa9496f6b, 0x2d9adf44, 0xf89af332, 0xf83dd388, 0xedd68caf, +- 0x5f375ee0, 0x06dd05b7, 0xdba0aaf4, 0x51d05d69, 0x67892fe9, 0xe91b7c7f, +- 0x2074f000, 0x255ca09e, 0xc0dcf3e0, 0xdfe8154a, 0x2e3a67e3, 0xcbe217bb, +- 0xc79b3b0e, 0xcd39ac60, 0xac0afd9b, 0x7b2a1da3, 0xef99ed10, 0xd3fd86b6, +- 0x966dbd60, 0x8025b302, 0xaa05b65b, 0xce15baf8, 0x857f75c4, 0x946f6f58, +- 0x15af34bc, 0x809fc059, 0x25e98ef7, 0xc049641b, 0xcaf5869e, 0x4b9e3c1f, +- 0xfd43dcfd, 0xfe4fd0a8, 0xcbd1fb85, 0xd1fa98a7, 0x7e8cabcb, 0x493f5016, +- 0x474fd717, 0x786675f9, 0x7e8dabca, 0xcf1fa8ea, 0xff4bcdc5, 0x78660dc6, +- 0xfd4b51be, 0xb1f34ea4, 0xbaeb8680, 0xedd607e0, 0xb6bde197, 0xe3c27535, +- 0xca2f962c, 0xdcf1c61e, 0x7cb12520, 0xc9253291, 0xfea987c4, 0xf43aa661, +- 0x2cbad3a4, 0xe3df8ff4, 0x4754b924, 0x4a17a4aa, 0x9e093a47, 0xa46a4687, +- 0x2eba1e17, 0x87ae3970, 0x4bda3638, 0xab81a90f, 0x0d7c38f5, 0x132c4a70, +- 0x320fb04b, 0x695fbe87, 0x1b2878e7, 0x7df0b675, 0xd6c1bef8, 0xf50a985f, +- 0x3fe95b36, 0x959e3ce2, 0x24969db8, 0x976c46b3, 0xdef6e0e4, 0x0d92dcca, +- 0xb53c18c1, 0x4bfa068f, 0xdbb6fd83, 0x5fc89903, 0x0ebf4bcf, 0x18adbf22, +- 0xfc7d92ad, 0x22aff342, 0x2b8fd041, 0x22665747, 0xc82a1d3e, 0x2af8ec77, +- 0xe3445f8c, 0x7ff1c06f, 0x477c6098, 0xf8d314de, 0xd32a9cce, 0xc6154ef8, +- 0x26df7e07, 0x07c625bd, 0xd8c75dfc, 0xa1bfcd4b, 0x55391df1, 0xb44afe34, +- 0x4fc7634f, 0x27ff181a, 0x5bbb8c12, 0x90d2ebe2, 0x675de7f9, 0xb54e7f9e, +- 0x9f2afe79, 0xdfe95eff, 0x3449f8c4, 0xefcd7dff, 0x54e7f9f1, 0x783bf9f3, +- 0x7be303bf, 0x107ff006, 0xd1247fe7, 0x306ff3fc, 0xad4c7fcf, 0x3e0efe79, +- 0x0fa52ffe, 0x8d1af8c5, 0x13e6abff, 0x6a63fe7c, 0x11d57c69, 0xa91f21f0, +- 0xc91a92a3, 0xed06cf9e, 0x94748234, 0xdcb1ca9f, 0xf2976eee, 0x250f0f08, +- 0x3cfbbe71, 0x1b4df809, 0x042c77d4, 0xacfa0512, 0xcd7cf05e, 0x503552d6, +- 0xde83de24, 0x5d40285b, 0x5f1325d0, 0xd08ed5b3, 0x6f6f0065, 0xfac41c97, +- 0x0b5fd582, 0x71deb4c9, 0xb9cc007f, 0xc3ff3e08, 0xc7d6e3d3, 0x2e5acbce, +- 0x889fb0ec, 0xc388e49a, 0x63632c13, 0x6bbe011b, 0x67f09d25, 0x1e804fd4, +- 0x3f3fa065, 0xe58a3d00, 0x381fc287, 0xa9967a0e, 0x4cd372b1, 0x6f7741df, +- 0xeebcc116, 0x509ff010, 0x2c4fbe38, 0xff884295, 0x507a9fcf, 0xb0b4fd45, +- 0x3e901923, 0xa0834708, 0x476eff53, 0xf844bd68, 0xee7e22f4, 0xec645124, +- 0x5fbec277, 0xe9b866b4, 0xd42cb9bb, 0x1fed0996, 0xb46f3558, 0x67bff30e, +- 0x4c82638e, 0x947f9f7e, 0x8d98e48d, 0x318f81b2, 0xfb29f3a7, 0x39dca828, +- 0xefb26ec7, 0xeb980aef, 0xeb9954f7, 0xdd90f6bd, 0x62c6f686, 0x7e83ad89, +- 0xbf346def, 0xdbb1c637, 0x8c7b0986, 0x0647778f, 0x2c5ef787, 0x9d63e027, +- 0xce9f7ae8, 0x69e035bf, 0x22cec478, 0xd3465eb4, 0xc1678fd1, 0x02d7b274, +- 0x15b79f3a, 0x4eecfbde, 0x73c0057f, 0xe132c3df, 0x747f0ad3, 0x06dfb25f, +- 0xcd745c76, 0xe768ed1f, 0x8563e75a, 0xd665feff, 0xea2ae8f9, 0xeb4179fb, +- 0x5627ce73, 0x2ae86a7e, 0xa63c7e1d, 0xeff85d5d, 0xe18f1f87, 0xb32d9aaf, +- 0xa1c5f54c, 0x17ed4cbb, 0x7a6799ad, 0xb163b0bf, 0xed03fde9, 0xf3ea9a0f, +- 0xda9b0f82, 0xd9acbfdf, 0xc6defef4, 0xefef4cc7, 0x54ca7aa9, 0xacf02bbf, +- 0x739dfda9, 0x4bde99d6, 0x898f16fb, 0x8c0d5e92, 0xf2bb42c9, 0x7e43076d, +- 0x90ddf834, 0x329a8f87, 0xe4d93ca9, 0xe519b2a5, 0xb6dfe414, 0xeb0d979b, +- 0x63d18de7, 0xed0ff6ec, 0x4f28398d, 0xe2b7be56, 0xf0dfcad3, 0x75bc546f, +- 0xc16b28c8, 0xd73d475f, 0xe367d627, 0xf8648f79, 0x2e49cb07, 0xb72e556b, +- 0xcab23bb5, 0x55ae5fd0, 0x718d8523, 0x79018afc, 0x0f344b0e, 0x3a745686, +- 0xd5b80dd2, 0x137cd744, 0x65fb3d9c, 0x651ebf1a, 0xffdff417, 0xb2df1565, +- 0x1c883ea1, 0x1c75b9cc, 0xc87fe3c2, 0xa574f086, 0xd3dbfad3, 0x71f86334, +- 0x4157f105, 0x734d47e5, 0x14d13ca8, 0x5378f2a0, 0x341f9515, 0x6d195235, +- 0x7be5465a, 0xdf2a414d, 0xf2a76a6d, 0x541d4db7, 0x435a6b1e, 0x429a6fe5, +- 0xf936f654, 0x2bf01ca9, 0x26993d0c, 0xff614aec, 0xf5410ac3, 0x322e62d3, +- 0xf24dddfc, 0x7944cbe8, 0x5e7dad3c, 0xe9f37688, 0x72c60e63, 0xcacbe313, +- 0xcaf1090f, 0x545764fc, 0x4c394086, 0x95defa1c, 0xb2e4e9c4, 0xf40c19b1, +- 0xfd9763c6, 0x88bf37c0, 0x861b0aea, 0xb37c87df, 0x05fa71dc, 0x75e915df, +- 0x7f313a21, 0xa06cf17f, 0xfee789c7, 0xedfb04bd, 0xd70a75c1, 0xad3283cb, +- 0xc1b22c97, 0xc18af487, 0xfd3fad1b, 0xbe5e853b, 0xa54efe00, 0xceebf81b, +- 0xd8bb7f41, 0xa7ff53a6, 0x414c1d3b, 0x0e49ee3c, 0xf4eaa861, 0x5c1e0de1, +- 0xda6496ef, 0xf071e3f4, 0xe1759460, 0x5d8b5d5c, 0xf5ccba27, 0x0cd21dd3, +- 0xa6f2bf1e, 0xd67c86dc, 0x0bc7eba4, 0x5499fe90, 0xc92cfd1a, 0xe4e3f554, +- 0x3af8871f, 0xf89535b5, 0x6a36fc14, 0x470d1ff7, 0xe1067ea2, 0x87bf64e8, +- 0xc917c9ef, 0x337ef2ff, 0x7144fe53, 0xfec7b626, 0x0ee7ae39, 0xf91ceff8, +- 0x8dd50af7, 0x72c21b7e, 0x3e3571d0, 0x0f1a6adf, 0x3e1af3be, 0xf3bcb9f1, +- 0x4ec2abf1, 0xbdf9f8c4, 0x71f90638, 0xf7acdd2e, 0x86f54d53, 0xb4dd2cae, +- 0x201fe00e, 0x524aacf7, 0x056a5f90, 0x5a29f4f7, 0x1df004bb, 0x2e8979b1, +- 0x576f120d, 0x01aa8ce7, 0xcb4df22f, 0xb17bd71d, 0x2f1a8765, 0xe9b2716e, +- 0x125157b0, 0x9f235fc3, 0x8e22a87e, 0x8d1c3f9d, 0x368bd427, 0x67334f6e, +- 0x24fe83d0, 0x667a0ccb, 0x6d3409bb, 0x07e43f00, 0x753138c1, 0x21c59fa3, +- 0x75bc7f7b, 0xedc6c7b2, 0x05b8eb64, 0xf85174b2, 0xb47adfab, 0xc56de71c, +- 0xa7d77d63, 0x0be4806a, 0x883257fe, 0x47bf0347, 0x3205156c, 0xe5bd5ff4, +- 0x3f27b27d, 0x1f0b07b2, 0x1ade8f39, 0x7996bf0a, 0xde663922, 0xe38dd641, +- 0x5a7117cc, 0xdf3befe0, 0xe3f17581, 0xe30cecd7, 0xb42cecf0, 0x8303818a, +- 0x3fa8364c, 0x3bf36a20, 0xfb3e286b, 0x41db8db1, 0x0785580b, 0xd62ac29d, +- 0xe0768251, 0x819b6629, 0xdec53a78, 0xa18c4cf0, 0x25590cd3, 0x6ed03cfa, +- 0x7ec043b6, 0xad17d535, 0xd92bd731, 0x33d40cec, 0x2cedab95, 0x4cfcd124, +- 0x3ac8a7ef, 0x3588bbf5, 0xb9f5c0ae, 0xdfe3cec5, 0x8ca675f3, 0x5eeaf802, +- 0xe304be7e, 0xdcc8b7e2, 0x1be2308f, 0xf871878b, 0x54ebc3ab, 0x7dffbc3f, +- 0xae3bc4e7, 0x687df867, 0xc10fae05, 0x936f929d, 0xbf7e2877, 0x7856fc2c, +- 0x487bf58d, 0x51c0459c, 0x1b8a45b7, 0xf057bd37, 0x3f8fc1b7, 0xec36f312, +- 0x1eb197fa, 0xca37f763, 0x332aae22, 0x4a7ee919, 0x296d0677, 0xefe29ef4, +- 0x5f0e1dc1, 0xacefcc0b, 0xf22962ad, 0xc50fd817, 0x59dda62c, 0xf79e805b, +- 0xd257af48, 0xa11299be, 0x7b58107d, 0x357dd894, 0x8c53c939, 0x83376371, +- 0xf71f35f5, 0x241482d5, 0x9aaee158, 0x6e318ac9, 0xfa00fa0d, 0x7e53d27b, +- 0x4bba8258, 0x9fd864eb, 0x971cd323, 0xf5cd7977, 0xf703fc06, 0x8a32c67d, +- 0x558f251f, 0x308c782c, 0x9f6e1fd4, 0xe42fbe25, 0x1f13de11, 0xa1c5887b, +- 0xb9116a74, 0xe9461918, 0xf297f019, 0xf0e35fd0, 0xda007c53, 0xfb79d52f, +- 0x5f07117a, 0x88d976fa, 0x9789e761, 0x15819c35, 0xdd4c7868, 0x519fd388, +- 0x25e26858, 0xac2f55e8, 0xf57a31b6, 0x07e05b65, 0xa3d40f48, 0xe3049f08, +- 0x04f86204, 0x563d571c, 0xf85a0fce, 0x23866fe1, 0xfbf4998d, 0xe5e05b11, +- 0xcdfc7078, 0xe90e67fd, 0x687fe0ff, 0xfa4305ff, 0xfebc75ff, 0xb6de5eeb, +- 0x54fc082b, 0x3da7e3fd, 0x63ecccc0, 0x07c323a5, 0xd4ddaf74, 0xfcb941e6, +- 0x907a0948, 0x64871fae, 0xf2b3f7da, 0xe4315d81, 0x2549afd3, 0x47c43fc4, +- 0xe27c5f27, 0x3eb7b466, 0xc9d764df, 0x88e2dfbf, 0xeb298038, 0xf973173b, +- 0x9f78e2d8, 0x8a7e57d7, 0x65d0d9fc, 0x9bd517d6, 0xd2f0ce9f, 0xfe1415fa, +- 0x87fc846f, 0x287f8dfa, 0x81ac7b47, 0xb3de93f5, 0x9fe3877e, 0xc2f64619, +- 0xe865353c, 0xaebf637b, 0xa1a5e041, 0x654f89f3, 0xf9289612, 0x55f6d68b, +- 0x5cf80fc2, 0x9367fb16, 0x33e464d9, 0xc42c1f03, 0xe5f900fd, 0x8e318be7, +- 0x35f1b3d3, 0xcb14548f, 0x9def5c9f, 0xfdf03f0e, 0xcb137a9f, 0xc5e82f53, +- 0xb0db7b58, 0xc25dbcef, 0xcbc3d97f, 0x83c47b5a, 0x75dafd71, 0x1e105f76, +- 0xf0db6ed7, 0xae30e783, 0x77c3b6f2, 0xb35ff419, 0x5cdfd5ed, 0xed9af507, +- 0x7c99b4f6, 0x31949a1a, 0xf8069748, 0x4184d96f, 0xe4ff543a, 0x8e3bd555, +- 0xd8747f3f, 0xb66a3d20, 0xb8d957ef, 0x1a98f8a1, 0xb546afde, 0xbf097438, +- 0x867e8e5f, 0x2a17f2fc, 0x7de3fdd2, 0x1b911b12, 0x5eeb9f07, 0xf1197b25, +- 0x74147444, 0xa59ba01a, 0x05d0037d, 0x2741abf5, 0x4263fbeb, 0x6f3fb1de, +- 0x4bf3f111, 0x907dc53f, 0x387c3adf, 0xbe97aaff, 0x7c79c1e9, 0xbe7234a8, +- 0xc32dbe7e, 0xd956e30f, 0x953a1983, 0x0bd579fc, 0x5b7e22df, 0x195bf474, +- 0xfe60bf14, 0x0ad91b2c, 0xdf9c2cc1, 0xd3b7b5c2, 0x80592afc, 0x79eaaef8, +- 0xabd702b9, 0x633614cf, 0x78b91c7b, 0x87c5c844, 0x80f1c1eb, 0x0b887df9, +- 0xbc0bee07, 0x06de5321, 0x7c520f63, 0x7ec65be4, 0xf5425b0e, 0x4e9c9ccf, +- 0xefc315b3, 0x96279585, 0xecae375f, 0x1c9cfa46, 0x71811fed, 0x04a606df, +- 0x73a43e05, 0x747cafd0, 0x1f4e08fa, 0xc44a55e6, 0xa7efa077, 0xdf6c73e2, +- 0x8abbf76d, 0x73b1df4d, 0x2fe383b9, 0xdc03e315, 0x7ecf6849, 0x1f7f1198, +- 0xac62b37f, 0xc5576037, 0x7c8c57f0, 0xf8df7973, 0x436f9718, 0x66b343de, +- 0xbd3ffbe0, 0xbf07e5c9, 0xe0057b43, 0xf7a08c8a, 0x48936ffb, 0x2458381f, +- 0xb46f5c9e, 0xbf36b90b, 0xe004f837, 0x1ddd7056, 0x7fec17e0, 0xec9fe118, +- 0xf0d5cad8, 0x6cbe8c5d, 0x433cf1c0, 0x76e433fb, 0x87ff9091, 0xb3fcb314, +- 0x13ee5cb5, 0xc2411bfb, 0xf43dad4f, 0x5e50e783, 0x1f713e41, 0xbd9b76ba, +- 0xc9fde702, 0xb9bf83d6, 0x93e4e41b, 0x66a721b0, 0xd39569fd, 0xb0d71daa, +- 0x09fa7278, 0x93c413a6, 0x571e7853, 0xf128b54e, 0xfe957ff1, 0x82f7f034, +- 0x3e867f05, 0xab47844c, 0xf15ebc3e, 0xfaad3e12, 0xc9bdfe10, 0x9ff2864a, +- 0xbf0677c1, 0x6ea8ff55, 0x019dea0c, 0x6ef834be, 0xbe0d2f80, 0x342f121b, +- 0x3e886fe1, 0xf00cd8c3, 0x7feec549, 0x99fcc72d, 0x5f7c3dda, 0x843bbe14, +- 0x9f93c075, 0x871d61bb, 0xd6c5a546, 0xd87a9643, 0xa96fded2, 0x07da5857, +- 0x4b46f52c, 0x0bf710fb, 0x3caa0ebb, 0x6a62254f, 0x82ce5f6f, 0xef538c6e, +- 0xd21e2995, 0xc0af3007, 0xb9ada4bc, 0x6863cc21, 0x5338f173, 0x02baba7f, +- 0xde9f57f5, 0xb07b41ef, 0x73e3c5df, 0x9efd157d, 0xec3b18d4, 0xe9323dfd, +- 0xcd8868df, 0x822fe788, 0x8bf44187, 0x79ef44b2, 0xacba7ddc, 0xf8c32ce5, +- 0xc3ec874a, 0xe682cd90, 0xdfb83d3b, 0xff27b7df, 0x7cf03996, 0xb69911e1, +- 0xfed0faf3, 0xfb34414e, 0x3f18ac95, 0x7c1623ed, 0xa38c06e6, 0xdafee1ef, +- 0xbb165582, 0xbe22ad82, 0xaa96d4a8, 0xbfc117a8, 0x8fbcc0fa, 0x5abbf9c0, +- 0xd6b557f4, 0xdef8defc, 0x37abe3f0, 0x8407df9a, 0xf9167fdf, 0xf1d2ed1d, +- 0xbbf73c6c, 0x09378f19, 0x2e5d3afd, 0xe00e65ba, 0xccb0efbf, 0xef4e5f90, +- 0xa7ff0991, 0x737df2b7, 0x8b5f9f8a, 0x7a4fda7c, 0x0f53c0cd, 0x589a85ca, +- 0xfcecf4ef, 0xd023c95d, 0x3bd776a4, 0x6504ffc5, 0x0bb7aecf, 0x97f5867f, +- 0x8779cadf, 0x753f6d0d, 0x2bf68b9f, 0x69b9f6fa, 0xef6fb17f, 0xc11e732f, +- 0x8f876efa, 0xfdf6fef2, 0xa7f918b9, 0x0aa3b96f, 0x68df56f5, 0xecb667ee, +- 0x947173fd, 0xa256c9d6, 0xee76e5db, 0xf3de9ee7, 0x6949efef, 0x70acc258, +- 0x4c97dffd, 0x9f86b771, 0xd65e28ba, 0x25cff7b7, 0xa5fbf6b1, 0xec5ea7ce, +- 0xd9b9f623, 0x5f081d9c, 0x697fdf2a, 0x1bb5d9f8, 0xa20f319a, 0x00fabf73, +- 0xcffa9fbc, 0x3ea3145f, 0xedc1dbec, 0xf47b5e9a, 0x9b27dc05, 0xb962b6d0, +- 0x8bd5e81d, 0x64fb8142, 0x0b2f3f6d, 0xf2f0f16a, 0x2f01c505, 0x8f7f1f16, +- 0x9fff48f8, 0xf6890f80, 0xb8f76bbf, 0xe7094e43, 0xdef797fd, 0xcfb03d41, +- 0xcc697c41, 0x337093f7, 0x9a171dd9, 0x6e57d577, 0x62e452de, 0xbff2bde6, +- 0xedbbff39, 0x2acf825e, 0x7cf94307, 0xdf5443ef, 0xbc11f6e6, 0x9befc917, +- 0xdf746abf, 0x5cf77401, 0xfe87de78, 0xc8fdd2c7, 0x3aee827d, 0xfc3499e6, +- 0xdf0417f3, 0x2773d597, 0x3dd39bfe, 0xfb0dfcd1, 0xaf9b71fc, 0x6ce30f23, +- 0x3ac3fd68, 0xb767b9ad, 0xf1efd863, 0xb475b3b1, 0x2fb16517, 0x846f8569, +- 0x191ffdca, 0x5e3127f7, 0x3c899a37, 0xd10fee6d, 0xad0c1d96, 0x8f649568, +- 0x6e0ada2a, 0x6ebe2b27, 0xf1e5e03f, 0x28fbe72b, 0x384d8787, 0xf67ac016, +- 0x438a3e0d, 0x56c2fc5b, 0xb025f989, 0x6f2b9553, 0x8a7e8c3c, 0xe22dac7d, +- 0x7df2a628, 0xf88a572c, 0x4d575da2, 0x64568bfe, 0xe6bcbbae, 0xe7f443ba, +- 0x677e1c64, 0x9c610b26, 0x80e2be59, 0xf265f98e, 0x50498578, 0x208eb177, +- 0x4c8e09fa, 0xc47ff7f3, 0xb898d364, 0x11ebda2c, 0xbe7fd7b0, 0x07c50375, +- 0xfef8bd4e, 0xcd6fd8cd, 0x04e664cf, 0x756ef4bc, 0x8df208b3, 0xffd15212, +- 0xfd94eea8, 0x523c8f3c, 0x3ecc6b72, 0xd62761a0, 0x704dd8fc, 0x8470ef55, +- 0xd5f7c266, 0x4c5f7ebb, 0x7ef2f6eb, 0x2f8363b2, 0x3d4f3c4a, 0x7dc62d18, +- 0x0e716abe, 0xf1a74ac0, 0xf77f8f2a, 0x839e4eec, 0x85b4bafe, 0x875649e7, +- 0x623bb4ef, 0xaac64bf2, 0xf11da376, 0x1287f051, 0x7c20a9e5, 0x8679f9b1, +- 0x43f3da9d, 0x65d7c389, 0x65be610f, 0xbded96f5, 0x3ea87718, 0xd9a1f0e6, +- 0x53e5b0d7, 0xfd4f6b8a, 0x944f36f1, 0xe4d92cfc, 0xf7f10e77, 0xd744c8b6, +- 0xb23acefa, 0xf44ea15b, 0x8fc70fad, 0x2fc85c7b, 0xdef1f9a9, 0x6140415d, +- 0x7b364fcd, 0xb271ae30, 0xfc87937b, 0x8fe72dbe, 0xeff10cb7, 0xd79d8fc2, +- 0x7f893bbf, 0xb774fd80, 0xb78ff16a, 0x15fb270c, 0xb7892be0, 0x4df065df, +- 0x5ecfb6cd, 0xcf63f8c0, 0x405e4f8e, 0xfaff6b78, 0xfed017c7, 0x3a5cfb64, +- 0xbc3443ee, 0xbf14aff8, 0x2a5bbe31, 0x87f7aee4, 0xd5ee299b, 0xf6357e0b, +- 0xc3f7bbd6, 0x7a3ff41c, 0x0325ffb7, 0x7ba5e4fd, 0xf9c08fa7, 0x7539dd2e, +- 0xbf238b04, 0x1b7c8946, 0x9bb888ba, 0x3b075e95, 0x7c9d920f, 0x7e8de80a, +- 0x1ebf80ca, 0x0ff1e3ae, 0xb7d3f0af, 0x0e6f8fc6, 0x6f3bcbf1, 0x936be5bd, +- 0x50fbb4b0, 0x3fd05c0d, 0x78e8137f, 0x6fd045f5, 0x5fc263eb, 0x53bf4f89, +- 0xe9d007f8, 0x57f0aabb, 0xeb3efd04, 0xe7fdf85c, 0xf0e75df0, 0xe479fe84, +- 0xc466f022, 0xfd57ef4f, 0x3728abcf, 0xf1447e3b, 0x4cdba410, 0xb6ef6898, +- 0xee3072cf, 0xffbd91fc, 0xef579e3e, 0xad1fd1d0, 0xc916fbde, 0xa3ceef4f, +- 0x22649f14, 0x06cbd98e, 0x93b8f1fe, 0xd86b85c8, 0xbd7ee6e8, 0xfdfa3fc0, +- 0x173d0f5e, 0x63e73dfe, 0xe44fefc3, 0xf2a9bfef, 0xae23023c, 0x1df1b75b, +- 0xd20f3fe1, 0x74829a4b, 0x71bcff7a, 0x3a0f0368, 0x6c7261e2, 0x5c7e2afc, +- 0x29ce2065, 0xadc465e8, 0x5053e206, 0x4578c6cf, 0xc58b7a48, 0xebbd07d1, +- 0xd7abdc78, 0x199fce6e, 0x678f0fa4, 0xa72adafd, 0x638b8ba1, 0x2ffe085d, +- 0xea889f8b, 0x0c73c535, 0x8d9cf53c, 0xab4fc7af, 0x37fa9e3c, 0x902c87ef, +- 0x9f21fbac, 0x75d63f22, 0xf3f2afbe, 0xcbbcfc04, 0xc8b7bec0, 0x5179ebf7, +- 0x8ac878a6, 0xe3d241f0, 0xec617d56, 0x55e15997, 0xd54f5c1c, 0xa275f177, +- 0xa43b8767, 0x073d3f41, 0xd73f1376, 0x455f7d6f, 0x96d0f33f, 0x9edca89f, +- 0xeb83f2e2, 0xfe062844, 0x17f6979e, 0xcf1d78f3, 0x338eb63f, 0xd2f1c1cc, +- 0x38fe27b0, 0x353f5b0d, 0x0c13538d, 0xf37f3cab, 0x549de3fc, 0x7f6277fc, +- 0x0cedbb27, 0x864ef3f3, 0xf6f119e5, 0xeb133f67, 0x035e71a6, 0xb3ca4bd7, +- 0x33cfca3e, 0x89237a4c, 0x1e9798f2, 0x9e0ef19d, 0xe20a5b8b, 0x6760f68c, +- 0xced3e733, 0x428ff07f, 0xbd1e777a, 0x6a75c65b, 0xc637e217, 0xb3792c2e, +- 0xf41baa71, 0x15bbc942, 0xad5d9093, 0x31f266fa, 0x187e099b, 0x03ae0467, +- 0x9e0fd0ad, 0x27fcc02f, 0x94f64784, 0x647840cf, 0xe2bba6dd, 0xb5da95e4, +- 0x36f3ca0a, 0xe6ebb5fa, 0x76766e3c, 0xe9fb17a2, 0x0bc8c2bd, 0x3c4148aa, +- 0x3b7dd67d, 0x29159d2f, 0x99d679fa, 0xecbe848f, 0xef01f269, 0x581673f3, +- 0xbdf9106f, 0xd20e7b55, 0xb0aaa2b9, 0xaf80bcc4, 0xe483acc5, 0xaa4766e6, +- 0xdb335bc8, 0xfe7bd50f, 0x7757da85, 0x2c35f6f2, 0x3cf1ed4c, 0x1f24c446, +- 0x07762d13, 0x913eefe7, 0xa67b51d7, 0xf6624584, 0x7c13ef71, 0x9ba4d3db, +- 0xc22d7bf4, 0xa939e1a7, 0x2ea71a6e, 0x8e34dc3c, 0xcceeaed1, 0x93122c75, +- 0x74a7547f, 0x9dd5bf13, 0x671a3bf9, 0x329abe40, 0xfb890f09, 0x7b82651f, +- 0x2629ffb0, 0xbffb0778, 0xe6b5c681, 0xe6ce6677, 0x5bacc271, 0xce341979, +- 0x852654bd, 0xb76f005a, 0x0e25816b, 0x5ee99f68, 0xc32afb9d, 0x285356f3, +- 0x8761fa3f, 0x8cde50a4, 0x4a759f38, 0x583682d7, 0xd6d39f6f, 0xa303753f, +- 0x707f813c, 0x2793135c, 0x3e7422c0, 0xe43768d3, 0x208f25bd, 0x15013f1b, +- 0xf2f80b28, 0x68c11e45, 0xb4f3a516, 0x3cfcdd6b, 0xcd2d18e0, 0x106fdf86, +- 0xde71be76, 0x40f9c86f, 0x0bc0b9cb, 0x9b4c079d, 0x18e0fa5a, 0x396f631f, +- 0x798a9d3e, 0x967769e2, 0x83a51f6e, 0xa652c1df, 0xe9737d51, 0x97a82cf8, +- 0xf5e16fb5, 0xcf8e975f, 0xab957a81, 0x246bd793, 0xb35fabca, 0x60b4c172, +- 0xe5e825d1, 0x252300db, 0x11bcbd26, 0xe2aa71e9, 0x7a163bdd, 0x5fa14f31, +- 0x1565f8e5, 0x14f46ed8, 0xed6cb78e, 0xa788eddd, 0x3368b631, 0xefef93ea, +- 0xea2a73fd, 0x09d32f71, 0xd56b3a3f, 0x68f07e91, 0xe4f3b9ca, 0xc2f359c3, +- 0xa5d9fe0c, 0x1c227605, 0xd2c7f36d, 0xaae7bc39, 0x1fd13826, 0x6cf2235c, +- 0x0fc81d9e, 0x7ef1e7e4, 0x75fbe0ee, 0xeb0f2299, 0x29b9a3f4, 0x0fa3cec3, +- 0x5dbb321a, 0x7d5c0c4a, 0xb3ed3f4a, 0xff7d9df7, 0xc49bcc3e, 0x759c6a7a, +- 0x37fbf065, 0x93c90a5d, 0xe981ff39, 0x0b5fc469, 0xde217f04, 0xf879319c, +- 0xcaa0e48b, 0x8874c3cf, 0x8e9a6ef5, 0xb58297f3, 0xbeabb9f2, 0x68169e3c, +- 0xcf90f781, 0xbc8871df, 0x34be711b, 0x7be33ce6, 0x79eb4788, 0x8a8e8dc6, +- 0x55977e28, 0xe5072679, 0xa27ce06d, 0xf48591d4, 0x64779eb3, 0x9e2dbf4a, +- 0x9c5eb11f, 0xf7044c77, 0x3e819d8f, 0x9fef3f1c, 0x830e3bbd, 0x40bd5fdc, +- 0xe7ca61f5, 0xa526cbd5, 0x215cfc2b, 0x820d05d9, 0x5c6d32af, 0x1887b03f, +- 0x39f6d3ed, 0xebfa3f24, 0xc9d4df7d, 0x305ec80e, 0xbee6fc93, 0xe630dce4, +- 0xc23df513, 0xfd8297cf, 0x8f7ca120, 0x711293de, 0x3f3e4879, 0xe7e7c8b7, +- 0x3cc97b66, 0x6f39df6e, 0xd3fa9457, 0xc8607f45, 0x0f9e0c67, 0xfaf993ee, +- 0x25e4d7de, 0xe0b34638, 0x2f13b47e, 0xd38f3c76, 0xf017fe7c, 0xf0633baf, +- 0x811c740f, 0x426734f5, 0xc6708e3a, 0x1cf5a3a1, 0x204711ea, 0x587ddb1b, +- 0x86056879, 0x4fe7ac5e, 0x42cc1299, 0xdbe9593c, 0x6b3c74a0, 0xec662987, +- 0x16ec94f9, 0x2f577e83, 0xc32ba5f3, 0x8b1cf44d, 0xe7bd5e70, 0x6dc21b53, +- 0x527bf1d0, 0x8277bb7c, 0xd667af93, 0x44e632f1, 0xed38816d, 0x5095978b, +- 0x499f807f, 0x8f5cfc16, 0x14e29af3, 0xfc50c2eb, 0x2fed8f5c, 0x8bfe3f02, +- 0xc7e18fc1, 0xae3908d5, 0xa0277dc1, 0xb3bc1ff3, 0xdc60f233, 0x3e235972, +- 0xa649bc5d, 0x9fb42db8, 0x28319599, 0x6daf8bf7, 0x7e076fdc, 0x44bcfc59, +- 0x9c40b4fc, 0x9c44ff2f, 0xefe6b13f, 0x9209ce55, 0x1e70bd9e, 0x46f4885f, +- 0xf3f316cd, 0x7fc29dbb, 0xca1cb374, 0x47f715cb, 0xad7f82c8, 0x09ad3ff8, +- 0x6a905eb9, 0xc7a5676a, 0x299b46e8, 0xea6b3c0f, 0xd7e43f40, 0x6fbcda67, +- 0x17edfc51, 0x20f18676, 0x293692bf, 0x2498f882, 0x4b7ec34d, 0xfd197c85, +- 0xb666598d, 0xe68372eb, 0xedf979f3, 0x9779f3e6, 0xb5348c75, 0x9e4d7cbf, +- 0xa115fde9, 0xafef4d2b, 0x54c132da, 0xcebe171f, 0xaeeafed4, 0x7c7d5332, +- 0xfb5346e4, 0x9b678789, 0xdf74d7ea, 0xf93f6a6d, 0xfbd37cd8, 0xa6d5a36b, +- 0xb47fd7f7, 0x5aff54c4, 0xb531ffff, 0xfae42c8f, 0x665340eb, 0x7c98f1f6, +- 0xaa0f03e3, 0x3f9f1d36, 0x8bd36858, 0xf8679f63, 0x9658c5bd, 0x4e9fd1f8, +- 0x3aa767a4, 0xd763b2b3, 0x376652f7, 0x4ea99fe9, 0xf0643d73, 0x0bf00e4b, +- 0x45937f10, 0x6dbc80ef, 0xd5193941, 0x983b4378, 0xe2e46ca1, 0xa7941482, +- 0xc5f9f1a7, 0x9236d9c9, 0x9d08fab3, 0x0e738f8b, 0x17356dfe, 0xf7482ef9, +- 0x2e1980a1, 0xa33100ca, 0x9606e60c, 0x29060b0a, 0x28f99cd9, 0xeebad2ef, +- 0x15bdeb1b, 0xdc9c071f, 0x6178701e, 0xdfd9379d, 0x645fee21, 0x3129731e, +- 0xa8f590f8, 0x1ef0eea9, 0xd77fe2d6, 0xeb2e7a6d, 0x69754cc7, 0xffca4cd1, +- 0x3d970449, 0x1b4dfe73, 0xb3d9bf41, 0xcf1a5402, 0xe2d8e6db, 0x9d45f7e6, +- 0x9de79717, 0xf10bbed0, 0xfb18a5fc, 0x39748a2e, 0x33c6f695, 0x3f56af98, +- 0xeffc9fb7, 0x3f59872c, 0x237dd60c, 0x97963e78, 0xf9d4279f, 0xda9b6b9f, +- 0xdf75c26f, 0xb7c2e798, 0x7e606767, 0x7f027642, 0xe7c5c73c, 0xd55342f1, +- 0x8cf00b4d, 0x2589da09, 0x73b2e783, 0x68e50d22, 0xf9118d7f, 0xe2d8cfd4, +- 0x759d3de7, 0x047b7f72, 0x13b4682a, 0xcb3f7e34, 0x3d77caa9, 0x2455b298, +- 0x7f22ce07, 0xbbbabfce, 0xf65f9f84, 0x7c3cf265, 0xf437e09d, 0xf1568e5c, +- 0x1cadea0c, 0xb9bcd730, 0x3119e143, 0x2e4662b7, 0x661d6fbc, 0xef5469f3, +- 0xf05ce897, 0x870d8ca3, 0x957fadf6, 0x03d6be09, 0x905e52d7, 0xda1805aa, +- 0x993cc6e1, 0xf63037c8, 0xbb4b3e11, 0xd6d4fc8d, 0x05ce072b, 0xb55bf231, +- 0xf7ec6e8a, 0x0858bc33, 0x932d69c6, 0xb473ef4c, 0x010f078e, 0xc99d951c, +- 0xd6549714, 0x967e4cdc, 0x69e1c99a, 0xd962417d, 0xe3c3c112, 0x0f8e1ee6, +- 0x42ea83c0, 0x3f73fb3a, 0x869319b7, 0x2a2975f7, 0x9d1ceb9d, 0x8d719e20, +- 0x5b7ebf01, 0x9709d906, 0x5795e19b, 0x21e0fd3f, 0x89d903cc, 0xfde11637, +- 0x3d04cb22, 0x4b6df3cd, 0x5dcb7d9b, 0x4de5aed0, 0xb800c999, 0x30d8ca37, +- 0x0a1c879a, 0x41b7c1c5, 0x1afb802f, 0x535e5b84, 0x15ccf34e, 0x74045e74, +- 0xd32575c6, 0xe8833156, 0x3863619e, 0x37fc2b4f, 0x7fdcb8b8, 0x790ba5cd, +- 0xe369bcad, 0x90172c70, 0x9b5e81bc, 0xba97fd86, 0xd311da12, 0xdbf4715c, +- 0xa8ffee85, 0x087dd39d, 0x136fd94b, 0x61636d76, 0xfa0cbdac, 0xd7ec16f0, +- 0x8f29cba8, 0x17bf6316, 0x141bbbb2, 0xee617b5f, 0xb432ed85, 0x0cff90c7, +- 0x39e60c7b, 0xcfbbc70f, 0x31ebd665, 0xeb9e7c7a, 0x4ac9ece2, 0xdde1f76c, +- 0x12f6b891, 0x1bb271e8, 0xfaf8d5d3, 0x1e82fbee, 0x28caba0d, 0x3ec1302f, +- 0x5c5d77d1, 0x4ff3adae, 0xc85ddeb4, 0x611bc8ef, 0x14ec07ee, 0xa5583ff2, +- 0xa756fb4a, 0x58f75d1f, 0x68fbe621, 0x9bc79479, 0xcb519fa8, 0x0f3f20de, +- 0xe204f9f0, 0xbb5fc0c1, 0xc69e7f85, 0xc5d6f1f7, 0xcda7c05a, 0xd70ecf84, +- 0x7f9fd845, 0xf328b9fb, 0x815e9e79, 0x0ffbd077, 0xf5b83e92, 0xb38c12bd, +- 0x39fedfd4, 0x79bffde9, 0xb8e6399c, 0x802f1181, 0x9c716a71, 0x2aff5bde, +- 0x8a51bae2, 0xbcecb647, 0xab07ee9c, 0x49f4332b, 0x45ce93a3, 0x7d11e766, +- 0xf872ed4e, 0xc353ce11, 0xd4ec5c78, 0x3087c9ae, 0xd349f32e, 0x73d8bce1, +- 0x3a5ea759, 0xfe87625a, 0x5a38ed4e, 0x0f5e90a2, 0xf78cde11, 0xa5fee775, +- 0xe377fd04, 0xdf00c1fc, 0x4bafe339, 0xf9fc16bf, 0xf180f165, 0x525fda78, +- 0xcf68b3d8, 0xd6a5e00d, 0x2a7ff79c, 0xc412bdf9, 0x13ffe603, 0x463c045e, +- 0x8bb57bbc, 0xa45a9fc7, 0xc6e31060, 0x54f7522d, 0xff06d38c, 0x4073a317, +- 0x9256b799, 0xcc3dfe99, 0xd61abc03, 0xb7db0ca1, 0x3e667db1, 0x750b9b1b, +- 0x111d2bc7, 0x1dd49f7c, 0xed42bca6, 0x4b047758, 0x8fdfb44f, 0x47fa86db, +- 0x6f2c7efa, 0x86ff02d7, 0x0feb0fe3, 0xfdf2815e, 0x3313058f, 0x4ca12631, +- 0x62f61df5, 0x852ce21e, 0x7d3a6dee, 0x2275a658, 0x3d739663, 0xa8ceff3f, +- 0x5eedccfe, 0x9392375a, 0x81e9f38c, 0x15575c5c, 0xf611fa56, 0xf815d5bb, +- 0xc33ff904, 0x08785dd6, 0xfb1d73be, 0x79e60e6d, 0xeda2f71b, 0x8fd8ad2a, +- 0xbbfdc6fb, 0x367aef25, 0x9c9f6e34, 0x28dfe5c4, 0xbe3527bf, 0xc961f98d, +- 0x63a7db8f, 0xae7bebbc, 0x0547ba46, 0x999df9fe, 0x702b9fd0, 0x71854b0f, +- 0xc66da924, 0x876ea0d7, 0x7bf1e3f7, 0xd02b5b5b, 0x606a5761, 0xbbde0d94, +- 0x87ad73a5, 0x8dfc3df1, 0x49c965f9, 0x9ef15ae7, 0xe7493538, 0xb902d0f3, +- 0xba818748, 0x4c77750e, 0x2ba969dd, 0xabcc6ebc, 0x285fe0ee, 0x0f7eb3ef, +- 0xef07d7bf, 0x337dc333, 0xe50cb7bc, 0xe849353f, 0xb1698d09, 0xdacea1e7, +- 0x3c49e902, 0xe5c8593e, 0x265f88c4, 0x97e22f78, 0xe291ac85, 0x60f1236b, +- 0x5bda3e75, 0xb0e654dd, 0xf88d2a7e, 0x51f31e5b, 0xa82ac059, 0xa83acb1c, +- 0xa98592bc, 0x54dd622c, 0x2a7eb316, 0xb1974c7d, 0x547cc09c, 0x8f1ad9a6, +- 0xf97d474e, 0xcbe93b0b, 0x1e0f2dc2, 0x0508c918, 0x6aa5ba26, 0x69867e5c, +- 0x2864a1a5, 0x80388b57, 0x16a9ae71, 0x3545e669, 0xd07d90a0, 0x93ea6423, +- 0xee20b635, 0x2ab9b29f, 0xe715af3d, 0x3edf6b80, 0x27e47640, 0xaa79f8fe, +- 0x4b949353, 0xeb3287dc, 0x1ab586c7, 0x73e41be1, 0x1ebbe22a, 0xcdba82e1, +- 0x1ee74dd9, 0xdfc3cbed, 0x745f7196, 0x45f69d9b, 0xa026506b, 0x0c2ee35e, +- 0xa7984b35, 0x9f6a515b, 0xf24d7c44, 0xce1a9353, 0x9e0da098, 0x78fac407, +- 0xebdf906d, 0xc1ca9ebb, 0xf78ff67d, 0xf9eb4dbf, 0x34b9c9f5, 0xa3ceba9f, +- 0xfb4dc06a, 0xcdca2a76, 0xf603e9c7, 0x6d8dd937, 0x9e0a5f2e, 0x25ffe93b, +- 0xc0ca8fbf, 0x7e95f7df, 0xc7beec57, 0x745026e1, 0x37af632a, 0xabf95265, +- 0xbf952f26, 0x1f99d268, 0xf623b91c, 0xe11136a8, 0x11d02f4d, 0xf0f44fde, +- 0x612663eb, 0x179e7b1e, 0x7692d3e7, 0xd444d57c, 0x77d93e3f, 0x77638c19, +- 0xf7849f2f, 0xce64b627, 0x95947ca6, 0x1fe704da, 0xc5169e00, 0x71874ce7, +- 0x6876d35f, 0xd3794197, 0xb89d9317, 0xd696bfae, 0xdf7179a9, 0x3aedfc64, +- 0x7f4103ee, 0xfea56fab, 0x09bfa2ec, 0x18ff6c4e, 0xf60da3f6, 0x6fd45fb3, +- 0xc348ef72, 0x189a87f7, 0x7a537dc1, 0xf7f61a67, 0xaf85a2f3, 0xdf84984f, +- 0xbbdee2db, 0x3499d374, 0x67bb07e6, 0xe61c99e6, 0x737af587, 0x2895e359, +- 0x9a4ddfff, 0xf904e6d6, 0xab1b7257, 0x4dac5f51, 0x09cdb9ba, 0x3653efc6, +- 0xf54e93a0, 0x0015dae9, 0x1fae34c7, 0xbc36f200, 0x659ed06f, 0xfc3af8a3, +- 0x8e5eeba3, 0x8eb8fea0, 0x2d969fbf, 0xfda010f2, 0x9f9fc7cc, 0xad57768e, +- 0xe962f9c4, 0xd3ee8ced, 0x544f6448, 0xf3a2499d, 0x7afd4679, 0xf31104ba, +- 0x8fb483d8, 0x43c67552, 0xbe2efae7, 0x1ce9a73f, 0x34fed0e0, 0x95f0ef1a, +- 0x29f93f06, 0xbb74b36e, 0xf970cfc8, 0xefbb6047, 0x83f98dd9, 0x7c44edbd, +- 0x0a83d40d, 0xaa23dbe8, 0x6df9ff31, 0x6e7f40d3, 0xb3df0756, 0x658f9829, +- 0xf47e67bc, 0x89248f87, 0x7e3ab07a, 0xfb4b24fb, 0x4dfea33c, 0xe7856f6a, +- 0xbac1ae7b, 0x5f2bda13, 0x08ea0638, 0x4b3653df, 0xf18cc37f, 0x6afea11f, +- 0xbed16572, 0x12bf55f5, 0xaae0ef43, 0x667bd2f3, 0xad6dd3d2, 0x9011fdf0, +- 0x6ebf5a73, 0xa17eb467, 0xf462f9dc, 0x6eb14ce0, 0xd2b99d55, 0x3a418f44, +- 0xfee89b14, 0xec65c821, 0xada2eb3e, 0x2173a4df, 0xbcbc9333, 0xe7e4161f, +- 0x9be6d69c, 0x3fff57f6, 0x1c2b7f1c, 0x4c7004fe, 0x63862ffb, 0x41bc69ac, +- 0xf04c8a38, 0x51c3e7fd, 0xf28e0096, 0x561c14af, 0xc728c57b, 0xf642bda0, +- 0xb0f38f2a, 0xb7b236e5, 0x151552fb, 0x369897f3, 0x5204ec85, 0x8eea5e19, +- 0xf146f1f6, 0x8f7799ae, 0xf3b61e63, 0x995dac2a, 0xe82afa80, 0xed7dc3cc, +- 0xe07ef16f, 0x740561f9, 0x2754e8d0, 0x177b47ed, 0xfc60d454, 0xb2a73bdf, +- 0xf1bd4a8e, 0x33ffbc16, 0x3c7fa0a7, 0xb4eb77da, 0x98db17b4, 0x6905ef49, +- 0x241e97dd, 0x13ee76bb, 0x2c94dadb, 0xcf8d9bd4, 0x052c1da2, 0xce1db5b7, +- 0xeb9ef78a, 0x5f927bad, 0x542975a2, 0x3f44aec6, 0x850ae428, 0xda3d200f, +- 0x23d21f34, 0x7b5089f7, 0xc795d41e, 0x8066be6c, 0x6d0d4957, 0x2bf00f59, +- 0x9afa164f, 0xf5087de1, 0x527fb61f, 0xab3de109, 0xd9bc9a2b, 0x8b49bf78, +- 0xb7d68fb0, 0xdf31d4ce, 0xb30a9ed8, 0xb0ae5204, 0xf685de37, 0xd7e49afa, +- 0xe2d79cdb, 0x1f6be07a, 0x267af3ae, 0x8f39b5c0, 0xc55339e5, 0x437f587b, +- 0x1ea46ccd, 0x7f4af753, 0x5fbcf995, 0x80dff36f, 0x6a92fceb, 0x157fbfc6, +- 0x879b95e3, 0xefe17819, 0x5c7531bd, 0xc1e6944f, 0xf79834fa, 0xbeb9e786, +- 0x47fa147f, 0x13e61f7b, 0x1c6e3b24, 0x8c324f9f, 0x2710f78d, 0xf5a3cf8f, +- 0x8beb0435, 0x578fdf07, 0xb1963ce8, 0x671ce3bf, 0x6c1dfda3, 0xdce4f58f, +- 0x73ffda3c, 0x08be62ce, 0x6966ede6, 0xf150bf7c, 0x38fcc34f, 0xf8bf00f7, +- 0x8aa8de29, 0x926d0ffd, 0xa93fff79, 0x39b4bbf5, 0x7e64549e, 0xd7302cee, +- 0x1f37cc1d, 0xb66a9683, 0x592879f9, 0xb387efc4, 0xe457e891, 0x6c3682db, +- 0x510b0577, 0x908b1579, 0x458e3f5d, 0x86357ea9, 0x38f1f33e, 0x700e9794, +- 0x997e644d, 0x642b47c7, 0x68163bf4, 0xbf68cd81, 0xfe164c6f, 0x6fde48ca, +- 0x77c1454b, 0xbe297ba6, 0xc5e519b1, 0x559eafa8, 0x448df14e, 0x3c69a5f2, +- 0xdee2388e, 0xfbdef382, 0x8f8cf539, 0x3ce46379, 0xbb79e35d, 0xba31b70d, +- 0x0f61a28f, 0xf78ca3f7, 0x7ef324af, 0x2fc4121b, 0xc15fae41, 0x459f7c79, +- 0x74b9edcb, 0xd3dfc9cf, 0xda8fb03d, 0x17548218, 0x6dfb9b79, 0x513b7b16, +- 0x92cfd91e, 0x80f2fe79, 0x18fc235f, 0xce9035f2, 0xe0597fc2, 0xbe6ee832, +- 0xc7b8c1cf, 0x4dc84fa1, 0xc44aa55f, 0x09834068, 0x05b7e9ea, 0x4a801ee8, +- 0x35ca9f31, 0x1fe819a5, 0x177fd82c, 0xf570b9c1, 0x0e30352c, 0x23cdc9cf, +- 0x5d7818bc, 0xfe0ff160, 0xbcf131d8, 0x9ec332f1, 0xc303fc36, 0x09fab01f, +- 0x71bfbe89, 0x43a27eec, 0xed296679, 0x7b237edb, 0xc0eb0d96, 0x4fbc7e6d, +- 0x78af38ca, 0x9feecec4, 0x6439445d, 0xb3f9f033, 0x550f7e2e, 0x7543dc48, +- 0x0c3f9bd8, 0xff919bbf, 0xbe5815c5, 0xa86b0ce6, 0x7b3b5fb7, 0x1ff266f4, +- 0x7986b094, 0xee14a717, 0xc67519ff, 0xbf14c8ce, 0xc9bf7817, 0x8fdd06fd, +- 0xefee5370, 0x9d78bce8, 0x573a0dfb, 0x4ed3aa7e, 0xb9377279, 0xf7b169c2, +- 0xbb94dc67, 0xf87ced37, 0x2387fc31, 0x79c3de02, 0x6804e49f, 0xe19f915c, +- 0x4b9d20df, 0x35bdfc4e, 0x471ae33f, 0x61f23759, 0x5dd7e0b7, 0x8345205a, +- 0x21766db2, 0xacda4fc9, 0xbfde4e49, 0x94247f39, 0xc57c44cc, 0xff0647cc, +- 0x5905ef59, 0xe873f12a, 0x386ae089, 0xafad3363, 0xa884f783, 0x8af6beb4, +- 0x26774378, 0x907afa7b, 0xd1ac5997, 0xe26ffb4e, 0xc916957e, 0x313d476b, +- 0xdfb96fcb, 0x5551e447, 0x2df0f588, 0x6a051f91, 0xe63f55f1, 0x7d3f3175, +- 0x63ee2dd7, 0x8f602c61, 0xfd023f97, 0xaddaf49a, 0xdbf5cc33, 0xeb75cc2b, +- 0x1e46863d, 0x7a4d2bcc, 0x5d3dec76, 0x87e812d3, 0xa5db351b, 0xcd1a0fc5, +- 0xae2303f1, 0xc3f98757, 0xe3c2cfb4, 0x7c9dd37a, 0x8b88b2fc, 0x341a2ff6, +- 0xb8861d75, 0x3de19f51, 0xae35d3f6, 0x845e306f, 0x574d04f7, 0x436dfb8c, +- 0xef939f22, 0x6457a47b, 0x7dfdfb8a, 0x54af7499, 0x1ce99257, 0x386711ab, +- 0x494de05d, 0x3b7f0f3d, 0xad70d8d6, 0x54afa818, 0x07c89d1a, 0x5e79b32b, +- 0x871f20d5, 0xc754f14c, 0xfdee351a, 0x80fd0372, 0xe273c15e, 0xdb6fb12e, +- 0xd8f5f8ae, 0x5ec38478, 0xda7f23a1, 0x5edd65dd, 0xab55e5e0, 0xabc72cee, +- 0xbf305a0b, 0x4694ec17, 0x822bebed, 0xed3b4fe0, 0xaf78c3be, 0xf36dd3af, +- 0xacdc7ae2, 0xab3f68d9, 0xeb49d325, 0x56a90aef, 0xe8d2f5c7, 0x685519d7, +- 0x3cb5a73e, 0xe0897fd2, 0x669fc153, 0xbe631fb4, 0x6f3fea8f, 0x0dda8d3c, +- 0xe0eaffb9, 0x756714b5, 0xff946d79, 0x746816a4, 0x5fc19a8f, 0x6b9c7ed6, +- 0x24fdb894, 0xba427fc2, 0xd794a3db, 0xdfc5abd6, 0xbb497e5f, 0xb9eebcc4, +- 0xea777896, 0xf8230a6f, 0xe0f514bd, 0x8f902eb9, 0xab8c3497, 0xabfd3e8d, +- 0x47c92f52, 0xe1afcf06, 0x2da2db72, 0x5fbcf277, 0x89693df3, 0x4bc0d1f8, +- 0x47283c22, 0x4fdc51fe, 0xfab1601f, 0x563529c6, 0x68e1bed0, 0x138a6d85, +- 0x5cdc514f, 0x3e28b74f, 0x6bf95fe2, 0x075c4e15, 0x9ccad39a, 0xa6df9fb8, +- 0xd1725378, 0x33223c3e, 0xeab59b8c, 0xca31b966, 0x4f7ef1c7, 0x8898e380, +- 0x27df5a8b, 0x380bc825, 0xc7f5d627, 0xeddb5ff7, 0x009f0f3f, 0x491e68de, +- 0x7a8e8a79, 0x7873b641, 0xed7dc593, 0xc44dfa89, 0xe7ec4f1f, 0x8abbe0f7, +- 0xca8e749c, 0x38ab5e3a, 0xf00ad72f, 0x9adb9da0, 0xbee3e30d, 0xc9d157b8, +- 0xc49b1e8e, 0xa17c319c, 0xf7a24ea4, 0x3c34b5a7, 0x135ac7bb, 0xa7819df0, +- 0x1f552ed7, 0x97fc2c07, 0x978a5bfe, 0x5fdff0c7, 0x6bdff1e3, 0x1ce973c8, +- 0x2d7bd8fe, 0xbfbe5495, 0xc8d78567, 0xdb6677af, 0xc04bed4c, 0xa371e0b7, +- 0x032a1cef, 0x50311cd6, 0xf1870607, 0x71cf513a, 0x74e22e7f, 0x714fb60e, +- 0x55bca77f, 0xc39d3aa1, 0xebfcef83, 0xf74f6a34, 0xcea1d4d9, 0xf6aa3f07, +- 0xb0e98d4e, 0x4bd59f3e, 0x6f00ddd3, 0x7e01f749, 0x9d33a61e, 0xf88b5eff, +- 0x8def0ade, 0x1bf74e1e, 0x29953a3d, 0xc23ffcc7, 0xece83fdf, 0x1c62f24e, +- 0xfc5873b7, 0xcc7883df, 0x742fe46d, 0x28c8fd88, 0x4fa44bed, 0xff51ebe5, +- 0x8ff264ee, 0x99a7e286, 0xb16177df, 0xc1ee0637, 0x77642250, 0xc3bb0ad4, +- 0x2e64bf18, 0xf287aff3, 0xeed624d5, 0xca70fb04, 0x15dff8c0, 0x47802dfb, +- 0x9f96fb80, 0x4ffb455d, 0xc2af7f46, 0x33ed84b2, 0x92c5a232, 0x13fc097c, +- 0xcefba666, 0x42d19cea, 0xd97b1fdc, 0xf88e9816, 0xcd16386e, 0x1be77ac0, +- 0xbc1ec927, 0x72ee1e10, 0x7b9a7d73, 0x479f6195, 0xeb38d8d4, 0xe7a5edd2, +- 0x8b570f3d, 0xfd1890f1, 0x72b78836, 0x7e90ebc2, 0xe8af3fa1, 0xe92be31f, +- 0x3ae9f12d, 0x2c919f48, 0xf47cfc38, 0x89c161c9, 0x22a12e9c, 0xe7dc7f4e, +- 0x5d937983, 0xf59b741f, 0x8afeffc9, 0x130d37cc, 0xd29f80d1, 0xbef3c4a1, +- 0xde2cef78, 0xe3c4bb8f, 0x693fad35, 0x1d457b0a, 0x4987c316, 0xfa84e82c, +- 0x4be88e2d, 0x7518ff68, 0x0e2dfde3, 0xcfec69e0, 0x90c8e5c9, 0xf1b9dadf, +- 0xedc736e5, 0xc74df9e1, 0xf7dc1e22, 0x03e38e98, 0xbfc33bbe, 0x3ac77ba7, +- 0x3f8664bb, 0x6e62309d, 0x83680e40, 0x0fda1a74, 0xfc86abd7, 0x95793983, +- 0xed3fc85b, 0xfee32ee3, 0x8c67a1b5, 0x6b725eef, 0x8b8fa697, 0x7af39c86, +- 0xe408e509, 0xcb2e10ea, 0xbdf8cb39, 0x5ee2b577, 0x0f711e9b, 0xdfc207e2, +- 0xaff73a60, 0x3eb07b8d, 0xf7c81c28, 0xd6af3f23, 0xde0effe5, 0xca8ec343, +- 0x27fa6f94, 0xfdc29fdd, 0xd4bfb343, 0x31b9ee23, 0x66b6a5fc, 0x36736f71, +- 0x4936e7e7, 0xf6167fba, 0xf74a363b, 0xf0646718, 0xa738d3f5, 0xf4a332c7, +- 0x1f065a7b, 0x7fb3e225, 0x7a80f211, 0x8f97182f, 0xe32fe255, 0xeeb007f9, +- 0xb5ec6305, 0xd0151ff9, 0x98079bb9, 0x0f97e28f, 0x60b327b4, 0x5f3b5e0c, +- 0x732f9f88, 0x29db8c42, 0x456679ee, 0x7c835e7c, 0xb9d1e7ce, 0x0fdc3e3c, +- 0xe8fe70a7, 0x7779f714, 0xc464fe2a, 0xe175a253, 0xf65e80c4, 0x2b1f2327, +- 0x99bc1c5f, 0xc79af5c6, 0xfbf457bd, 0xe2cabfb3, 0x8f0004f7, 0x7b607f42, +- 0x1762c7a7, 0xf0feb25d, 0x419bd69b, 0xbd234fbc, 0x43fae972, 0x48fe80bf, +- 0xf2c2fa23, 0xe2bb41ee, 0x57bf30c5, 0xb6c3c5ed, 0xd0e3eb19, 0xe5c840ad, +- 0xdd0ae995, 0x84557643, 0xda89fbaf, 0xf7130c65, 0x5a3c0b0a, 0x8fcb4be1, +- 0x08b71fcf, 0xf196d43a, 0x9ef1917b, 0x942f9c76, 0xafe83e39, 0xd20b4ca7, +- 0xbc8bbff3, 0xdad17187, 0xfe2f0e1d, 0x0ecf524e, 0x85ea1557, 0xaa8e1d9e, +- 0xfa50daf5, 0x9bf42df9, 0xff8cec2c, 0x64bffae9, 0x2fe27fae, 0x4ba01f71, +- 0xad1c7ba6, 0x76e93dfd, 0xfa0377d3, 0xe5dd813b, 0x2d33fa10, 0x9ec5d399, +- 0xab4dd7c7, 0xf023dd5c, 0x67c08f76, 0x1e57b89a, 0xae2721d6, 0x39bb4643, +- 0x0094fde2, 0xef3f7b8b, 0xfa570863, 0xecf03ae0, 0xfbf632b2, 0x7d3bf8e1, +- 0x742b8a41, 0x839236fe, 0xf294f6fd, 0xfbf58138, 0x8c67c162, 0xc9e8ed99, +- 0xfd12bcd3, 0xd258611e, 0x807edf71, 0x4f7e61de, 0xb2770af0, 0xc5a2cfb0, +- 0xf73f92f7, 0x48a3f524, 0x0f1c50af, 0x0dbf366c, 0x0a7e88f3, 0x9e4c5b76, +- 0xbd16bde6, 0xbe678563, 0x13b7cf9b, 0xa3f637f5, 0xdde38b45, 0x5bac60ff, +- 0x86d3bcc6, 0x49e0e59b, 0x26c71f0f, 0x25974bc6, 0x6eba0f1a, 0xebe30c77, +- 0xe60bcf31, 0x479e127a, 0xc80b39e8, 0xfaee00e3, 0xfc6fc5fb, 0x59ce7888, +- 0x13d2b03d, 0x5da00763, 0xb095eb4e, 0xc6553bc3, 0x5d844bf7, 0x8274fa88, +- 0x90770b16, 0x6d974906, 0xf12b5f5c, 0x43cc35f5, 0x9b897efc, 0x2fb419fa, +- 0x4fb11db8, 0x389d6bcc, 0x8daafa3f, 0x21bd92b5, 0xe9c864f0, 0x6e9c8b4e, +- 0xec357cf5, 0x77e275b4, 0xf17e912d, 0x614ae1f4, 0xf31c95af, 0x95bcc78f, +- 0x1f342acb, 0xdd25a1fa, 0x9e600fb3, 0xfc1ee14e, 0x39419a61, 0x8cfc142e, +- 0xc18dcdfd, 0x6e3cefdf, 0xe6f7dd93, 0x857f0457, 0x7cc0d8c7, 0xebd18def, +- 0x7ae1eeff, 0x2dfc1d2b, 0x5fd38394, 0x785ebd11, 0x9e00e2ac, 0xba05aac3, +- 0xf830caa3, 0x6f3c33a3, 0xe1ed0bb9, 0xf687cc63, 0x9e786f74, 0x47f01c6d, +- 0x3f6e1aef, 0xd5f9e80e, 0x97a05f1c, 0x2f97a8c3, 0x2e4fe63b, 0xc296ba82, +- 0x7365eef5, 0x2967bf19, 0x5fa10eec, 0xf489e86d, 0xe2a7fadb, 0x727d6f3e, +- 0xe62bb363, 0x2efb40f9, 0xa83b9f68, 0xdf516a6f, 0xf3db1378, 0x79925323, +- 0xc71e7b3e, 0xe664f4cb, 0xaf3c0174, 0xdc6506e6, 0xb2f57cc7, 0xaf7809dc, +- 0x40a4a1fa, 0x7ef812d1, 0x0e3e0cf2, 0x2e8472eb, 0x47878dcb, 0x4433afae, +- 0xe44328dc, 0xf124676f, 0xe70a4572, 0x979d24f7, 0x1f9ce9f7, 0xe3f13c32, +- 0xbb44cb4c, 0x3bd71b3e, 0xb7c6978f, 0x914bae4b, 0x8b3ced2e, 0xdfc6b24f, +- 0x17494baf, 0x06db6af7, 0x3fc1b5f5, 0xc677c427, 0xfc6265f8, 0x89986745, +- 0x8d29167f, 0xce8b37c4, 0x8637c428, 0x3fe2245c, 0x1aeeff63, 0x14c6e047, +- 0x9fa3f79c, 0x209c6315, 0xdf0f6577, 0xdfdfc237, 0x7cb136b9, 0x4181eb18, +- 0x9df3d06f, 0x3d00cf18, 0xad0a693f, 0xfc8bcf43, 0x31a72e53, 0xf08ffa76, +- 0xbb3b1df7, 0x8e6bccaf, 0x7ac0eba1, 0x8cfee3e9, 0x85195d75, 0x89e9c049, +- 0x7298d5e7, 0xcaedfaa9, 0xf1787604, 0x5e1da97f, 0xe4813dd2, 0x578101f6, +- 0xc466be23, 0x7897f0b1, 0x8ab3bdb9, 0x1a7931f0, 0xffc06f97, 0x22ff8156, +- 0x1a7fff8e, 0x643dffc0, 0x79707427, 0x4bd688c9, 0xf45f24f9, 0x453bf19d, +- 0xa0df27b9, 0x293dce7c, 0xa9df7fdc, 0xbe409ffb, 0xbbf2255c, 0xa888cf27, +- 0x407b58de, 0x2ad17efc, 0x1af9c0fb, 0x591bc7ca, 0x0ecdfbcb, 0x189497ef, +- 0x8596d1f9, 0xf9802cc7, 0xf9f15767, 0x9bb14dac, 0x5875a7d6, 0x485f2e87, +- 0xbb2dfae1, 0x6015222a, 0x4a376b7f, 0x1237f40a, 0xf809877f, 0x0b236466, +- 0xd0fefec5, 0x4f1f1f48, 0x07a485f3, 0xd3e7068a, 0xa4559b6e, 0xcf695e83, +- 0xa0b5f648, 0x3606a4c8, 0xbed79f23, 0xf2fca11b, 0x2b76efc9, 0x9e5fc7e8, +- 0xcf82dfea, 0x6578f98d, 0xbefd247d, 0xce1cbbf9, 0x32f7610e, 0x71e1cd16, +- 0xfe0427ff, 0x887b0bd7, 0x23dfa61d, 0x94fdb8d2, 0xe9ac7cb1, 0xff0ce777, +- 0xfa73fd07, 0xb599693d, 0x70a78a33, 0xbcb196fd, 0x834bec90, 0x57e7a61f, +- 0xd3e7c46c, 0x01315c47, 0x5fc897ef, 0x77f05115, 0xd6ba7fa5, 0x94fef716, +- 0xc01f4243, 0xcec7f63c, 0x6b7242e3, 0x9d27b3b4, 0x67936f9f, 0x0ddbb7c4, +- 0x3e7d2c3e, 0x0fba6eed, 0xb86555b1, 0xffe064ef, 0x378ad4f2, 0xe1919e11, +- 0x46e11275, 0x49c4678c, 0xcfca39f0, 0x9cf9aa07, 0x5cf9425e, 0x82cc63b6, +- 0x556cf958, 0x2ceb3e89, 0xe86e13bf, 0xae14de8b, 0xad48efc7, 0x71f203f8, +- 0x1453d77d, 0x91bc59b7, 0x424c1eff, 0xfe245cfc, 0x78cdde60, 0xf80d5dcf, +- 0xa3ef7817, 0xeec89614, 0xf7c39dad, 0x72b76adf, 0x2aad657e, 0x1b5703dd, +- 0x7f411ede, 0x7ea3d462, 0xd5a76e1f, 0x2d2edd6c, 0xa8ebc18c, 0x27e510da, +- 0xe436ee5c, 0x2b19eb89, 0xd8dc63df, 0xc876fc05, 0x9eeaedc5, 0xff07ee52, +- 0x7ac9083f, 0x0080006b, 0x00000000, 0x00088b1f, 0x00000000, 0x7dd5ff00, +- 0xd5947c79, 0x6779f0b9, 0xcc93324f, 0x2133df64, 0x61262201, 0x01161212, +- 0xa0084933, 0x24584e08, 0x81ec36c8, 0x8bf628ac, 0x0c197e95, 0x6f62e452, +- 0xb90556ac, 0xda544076, 0x1a080962, 0x88b0e834, 0x148d6ad0, 0x43b05b05, +- 0x921088a5, 0x6f16b629, 0x79e7bd69, 0x799939ce, 0xf8b0ccdf, 0xabbf7ed1, +- 0x9cce1c7f, 0xf3cf6cf7, 0x273f679c, 0x2d675a5d, 0x2ba42229, 0xcae6c229, +- 0x9dbde424, 0x91488ee3, 0xe9769884, 0x55ae503d, 0xd034496d, 0x7483b5f6, +- 0x4eda16b6, 0x62909b88, 0x8e35a242, 0x12cfd0dd, 0x92adb26b, 0x49eab108, +- 0xc848d9a1, 0xeec4f1b0, 0xf0b7e5a6, 0xafad095f, 0x425cf5a4, 0xc1d334ee, +- 0x293fa0e2, 0xc9089874, 0x9c709b36, 0xc3211578, 0xac39090b, 0x34432e25, +- 0x8be0bb21, 0x89ac8411, 0xe399c472, 0xb10f1e60, 0xf196fed1, 0x4258f7f4, +- 0x5b891a6a, 0x6cd5f3a2, 0xf423adda, 0x76847277, 0x6524224a, 0xd6f384bb, +- 0x2d2cdf6c, 0x5e67bfa0, 0x075fb5d8, 0xa19357df, 0x7ab3f461, 0xd03b8d89, +- 0x7180cf62, 0xf61c7b49, 0x9654eb13, 0xbd70b884, 0xe9b7c6c3, 0x0e38b9ac, +- 0xbff4a3ee, 0x079f4ab6, 0x5666cfec, 0x9b3577e3, 0xa64feeb6, 0x626a91f3, +- 0xefc56fee, 0xe6c5dff6, 0xff89e8d7, 0x675864fb, 0xa2e75b2e, 0xc4baff5c, +- 0x2aaad7fe, 0xdfb4cd73, 0x5b08f8da, 0xb38b6d0b, 0x7ac18738, 0x0f3aa78d, +- 0x61918851, 0xa73a3ca7, 0x77febfd1, 0xd1848475, 0x58c3877e, 0x15b352ff, +- 0x47563ae1, 0xcebbf85c, 0xe3a56395, 0x8e17ee1d, 0x49b9bde3, 0xa4e01e35, +- 0x2773270d, 0x3793f9d3, 0xb454956d, 0xe6411b1e, 0x23d6023a, 0x5cc7bbd6, +- 0x062e6156, 0x1c227438, 0x706936ea, 0x473a15fd, 0xff5cf2f6, 0x2acc5377, +- 0xf4c0f79c, 0xfa5e74cf, 0x7c6fd3fb, 0x6ba9f884, 0xb06dec95, 0x748fd6de, +- 0xac00f2d3, 0x7893533f, 0xf6102642, 0x3e7b33df, 0xefe959d2, 0xfc337613, +- 0xa9deedd5, 0xaecb4059, 0x1a4ba352, 0x303c780c, 0xaeace807, 0x24c24f4d, +- 0x06739fc0, 0xa74943c0, 0x78841e02, 0x42be81d3, 0xe80233e1, 0x3aaa08a8, +- 0x67a47f77, 0xfa64e667, 0xdd346b7d, 0x8ee811bf, 0xd91883ed, 0xbec10fef, +- 0xc7e902e2, 0xafe60cb9, 0x801db708, 0x28515173, 0xac085ad9, 0x23ee18f3, +- 0x31c19cb6, 0x79953d70, 0x0ab3d6c1, 0x618b89e7, 0x378d12f3, 0xe713e61d, +- 0xd64d4e2b, 0xff7f4292, 0xfa578e26, 0x4efd87bb, 0xfcf239fa, 0x6de256eb, +- 0x75c259ab, 0x55a7a107, 0x53dacf80, 0xa7a30f1e, 0x93d00d4e, 0x8fa0bf58, +- 0xc6693657, 0x56e39e07, 0x6bc70eb3, 0x1d706b35, 0xa27e00cf, 0xe765a968, +- 0x065599f2, 0x198ff237, 0xf9488f63, 0xebf72f14, 0xabbe503c, 0xed0b5f9a, +- 0xf9b326ef, 0x0f54aad7, 0xa3ed7d40, 0xf882d246, 0xf0093fb4, 0x123d303c, +- 0xa55b52f1, 0x38e9eb73, 0xb126bf4f, 0x26e8cbba, 0xceb59ff4, 0x1fa10ba9, +- 0xbdb30d89, 0x1e737804, 0xf5334dd2, 0x3d2b27a5, 0xfbfa56f6, 0xce763684, +- 0xdb6a1e04, 0xdd015d18, 0x5c39bc23, 0xcb74f0fd, 0xc7c08dce, 0xa333289a, +- 0x00274a07, 0x616d9aef, 0x3606b3e6, 0xe804b7d7, 0x37ab22d2, 0xcf9927b4, +- 0x35ebf8e6, 0x83a00ff0, 0x8648c4ed, 0x75f075d2, 0xee72a1be, 0x19d43c02, +- 0x14b587bc, 0xfa4f43b5, 0xa2875cf0, 0x5fa69adb, 0x843b380d, 0x47896590, +- 0x55e714b0, 0x47ed8fdb, 0xc70eff7c, 0xd250cbfb, 0xba730ff1, 0xc36a29a9, +- 0xb67358f3, 0x71b1cf11, 0xc667e33c, 0x4d7e7253, 0xbf7c13c8, 0x8a9c71eb, +- 0x6ab1b688, 0x9f8af70a, 0x1216e64a, 0x912e5f9a, 0x8e8da388, 0x83a6c5f7, +- 0xbe00f391, 0xe355bf57, 0x7ed8c37e, 0xd0fe704f, 0x1c028db5, 0x4751bde9, +- 0x46f7ec82, 0xe39e23c7, 0x86bde012, 0x7b6bbec3, 0x513f88f9, 0x8b6d717a, +- 0xbdff01b2, 0xc3ca7db8, 0xeeeba27f, 0x53625ada, 0x38b4d903, 0x717c7e90, +- 0x942db661, 0x64d5627e, 0xbef144bc, 0xe460edaa, 0xcbefda48, 0xd42e0c5f, +- 0x7cdd7ed3, 0x535e179d, 0x1e5c0137, 0x9dc7657d, 0x96e35ed0, 0x778f8062, +- 0x3fe9fb6d, 0x6f57cf81, 0x9308006d, 0xa3bc5f96, 0x54efd2f3, 0xf7eccdee, +- 0xf866516d, 0x9f17cbee, 0xdde013bc, 0xed82d6d2, 0x8cdc5e17, 0xecaf03f5, +- 0xe9bffb78, 0x488eb577, 0xe1777c1b, 0x9788fdb5, 0x0ec6a75a, 0xd7450dfb, +- 0xcfdceccf, 0x849b64f8, 0x31548de7, 0x5ae825fe, 0xaf97efd0, 0x28111dcc, +- 0x8ed56a1f, 0x4fbe0954, 0x925edbd0, 0x9ca05e50, 0x688c3778, 0xdffee8c2, +- 0x9681a5a3, 0xfbe5ea15, 0x2ce780b5, 0xd908cfc6, 0xa7b5e42c, 0x6f7efe84, +- 0x75e6c449, 0x3eaeee70, 0x26e78d98, 0x1d1dd182, 0x31c7c0c7, 0x434438c0, +- 0x0fbeb0ec, 0xb2db6fd3, 0xa547ce8e, 0x924efb34, 0x47779c70, 0xce05bedf, +- 0x8c2f58bd, 0xda0f3937, 0x9e41532b, 0xf2d7df88, 0x670dae75, 0xe722edf2, +- 0xc6653537, 0x7c5e50b5, 0xf00aac35, 0x0ef3af53, 0x72fc00b0, 0x5b471d19, +- 0x6daebf18, 0x37adae5b, 0xe71c7f62, 0xa0a7ca13, 0xe9e7a3cc, 0xf49f3d1c, +- 0x0edfadab, 0xc97ef981, 0x193864f8, 0x3e98fb0e, 0xf0048ceb, 0xd46dc88b, +- 0x7f5c20d6, 0x9629dac1, 0xae87db02, 0x4947e760, 0x2316b9b7, 0xb73b1b87, +- 0x532bbbc9, 0xf4b7c8ad, 0xfa01feb6, 0xb3b57253, 0xbf7f44c5, 0xa6d3857b, +- 0xe6f774a6, 0x536363f9, 0x1c95fd68, 0xabd20869, 0xd8f2625a, 0xea79c465, +- 0xe7c8ca9a, 0x2d23bd74, 0x9bc75cec, 0x428ee689, 0x342a9e3f, 0xf8446344, +- 0xd5af90fb, 0x7af2e5ad, 0x31275b2b, 0x98a7d2f8, 0x8ef19fb0, 0x683aff68, +- 0xeb11a33f, 0xf2fbf4be, 0xaaba3e40, 0x755a3e50, 0x820bdeb8, 0xfe57117f, +- 0x7f3f3cec, 0x139b7aa0, 0x475e35e8, 0x8fe3234b, 0xfbfc7495, 0x9695a52c, +- 0x1f197f38, 0x7095dace, 0x74ed0f5a, 0x762dd79c, 0x8b6c8efc, 0x50afc991, +- 0xe39eb07c, 0xbbc919ff, 0xb5cce818, 0x740ccc37, 0x77a77f5d, 0x5c1f2040, +- 0xb07c616b, 0xf74dd39b, 0xef2f465e, 0xd82e54aa, 0x6e5bbbdf, 0xa8740cdf, +- 0xff03c794, 0x8695762b, 0x2edc9b8e, 0xc92f0199, 0xf0cb269b, 0x55baf547, +- 0xe5d657a0, 0x5f814348, 0x7fcbed48, 0xd7ad1b75, 0xbd41bc53, 0x9f3f377e, +- 0xef854f54, 0x172bdbeb, 0xb1297cc2, 0x12d4d977, 0x536347ea, 0x96bebd68, +- 0x7ff9c314, 0x37becd26, 0x9121f705, 0x4f20ac97, 0xf20d5ea9, 0xf50f2e34, +- 0x56e77af1, 0x8e49bfd4, 0x85bdcb8e, 0x27d7afa8, 0xf9c1b4ce, 0xf627c3ea, +- 0xaf7d42ae, 0x0b6e1ade, 0x684fdfa3, 0xfa601e97, 0xf5b0918e, 0x4fa87648, +- 0xc3748f70, 0xf8092e7a, 0x39db5288, 0xdeefe607, 0xda2e27a3, 0x71dedefe, +- 0xbd05cf28, 0xa3d75e98, 0x98d68f5c, 0x2fcbd025, 0xe7c9db36, 0x65982554, +- 0x05bc22b1, 0x67b66b3c, 0x5c9ce0aa, 0x9ff0ede2, 0x43cb9e35, 0x42dd69fa, +- 0x2d67d20f, 0xf563dbd7, 0x030782f6, 0x28f427f0, 0x82fc1d25, 0xa6f27fd3, +- 0x621c1243, 0xaeee7e25, 0xba069e26, 0xa937bbbe, 0xa8f9253c, 0x7c8fdd5f, +- 0x6c8e957f, 0xb78efa91, 0x8a8bf383, 0xf0014718, 0x46e98ac9, 0xaa7f205b, +- 0xc2abb708, 0x423cf402, 0xfa2a451c, 0x1378f9dd, 0xd875ffc2, 0xacbd1077, +- 0x63967fb7, 0x22bbc02b, 0xa7ed0c21, 0xf95d5a7b, 0x5d6d1fa4, 0xe7055e15, +- 0x2363f292, 0xed334df2, 0xdf8bbf4f, 0xe445f232, 0xd705a4b3, 0x6662d9b5, +- 0x8a38c4e3, 0x64b5811a, 0x39305639, 0xdb05b266, 0x3f7c7dcf, 0x29cfa607, +- 0x4c9d0150, 0xf4f4da35, 0x92dfa7bb, 0xb8dd23e6, 0xf384c0a8, 0xec715ce2, +- 0xd8af662e, 0x5388ee80, 0x7d56fa83, 0x9c1dc3a3, 0xd71d18ae, 0xf40bfd53, +- 0x88574a70, 0x2676fab7, 0xddb8227f, 0x50227c07, 0x4ae715df, 0xd7e05b9c, +- 0xde823740, 0xd1bdb9c4, 0xcfcdd9f3, 0x7fdd3747, 0xde9a7d20, 0x6eb97464, +- 0xda14b595, 0x731055d7, 0xb4aabda0, 0xf870ac83, 0x62fadd68, 0x11c61b84, +- 0xe2ce2e7c, 0xa8fc0b38, 0x35d1cb7e, 0x2f9cb648, 0xf8f9bfd5, 0x67e96b80, +- 0xcf1b0d06, 0x07708ee0, 0x82818fd2, 0xa58854db, 0x4473f80b, 0x12df5c93, +- 0xdcb93fe5, 0x65facef8, 0x7c01a4ae, 0xa8f2fd09, 0x0b4ff9ca, 0x45292fd7, +- 0xa626f490, 0xaf03c65f, 0x25b07e07, 0x24fc0dc2, 0x77389e3e, 0x97cf5905, +- 0xbc099cfc, 0x3e233b0a, 0x1c9f7d92, 0x5324f4cd, 0x8b2efb34, 0x0bf60197, +- 0xcaab079e, 0x43a88679, 0x8fd101cb, 0xc5db0bae, 0x1fed7a7a, 0xfc6f5b03, +- 0xacb603a3, 0xffa7c00b, 0x0856dd5c, 0xef5ace78, 0xfa37ccd1, 0x48f211e7, +- 0x7eb03f49, 0x9fb05b90, 0xdfd0dcca, 0x76e7eeb5, 0xcb9e829c, 0x633af9f8, +- 0xf2ddf821, 0x68eae718, 0x45159f5a, 0xff1431ec, 0x23d1deb3, 0xdf1c913d, +- 0x6b43b000, 0x8fa5c434, 0xdd6abc06, 0xfe3c00de, 0xfb40f00d, 0x2e0c98f5, +- 0x2d073d35, 0x68e2ce31, 0x8cab9e3a, 0xc7a03cd8, 0x0bf29f7e, 0x53c49738, +- 0x81a4fc0c, 0x8e012378, 0x239c982f, 0x757abbe0, 0xa9d43a67, 0xf30f931d, +- 0xecc11b3c, 0xb551df27, 0xc785207b, 0x47f78365, 0x2e7ae923, 0xb9b2c8af, +- 0xdfa738e8, 0xdf9efdfc, 0xed2fafd3, 0x19cd22f9, 0x0deb57c0, 0xc626832a, +- 0x4896ef5f, 0xbe105b55, 0xc99a233b, 0x09dbccd3, 0x68b804e9, 0xaeb7a87c, +- 0x8027b308, 0xbec567df, 0xe96b84d2, 0xca570df3, 0x9e603b88, 0xfa1fda06, +- 0x4b195c35, 0x8c8243dc, 0xf903c74b, 0x992570d0, 0x3cd862b8, 0x315437c0, +- 0xfbf8ce4c, 0xed1713a7, 0xaa455a7f, 0xe7fbad83, 0xbb5f0cd1, 0xac1f1909, +- 0xd7df077d, 0xfcec7eee, 0x6e4836fa, 0xaf160fb0, 0x14d47930, 0xcfe98ba4, +- 0x362d2fa0, 0x48aa3cbb, 0x8f943fe0, 0x4e34460d, 0x647b5035, 0xf467971e, +- 0xa028cd3b, 0xcf199757, 0xc39f93a1, 0x7defed79, 0xc589fe03, 0x4518621a, +- 0xb06f99c7, 0xbfa14e1d, 0x2638c9ff, 0xc2c4c412, 0x83c4a687, 0xd5984b1c, +- 0xbd2273a8, 0x7e83318d, 0xea51912a, 0xa5ae236f, 0x8f50690f, 0x74a27a45, +- 0xac718ba0, 0x3a00ba04, 0xf5983a04, 0xe26be320, 0x5e7e5cfb, 0x59f87495, +- 0x8ecf7c08, 0xf181cb29, 0x358e512c, 0x5e0fdf48, 0x6ebff192, 0xf3f2fbc9, +- 0x4dcba740, 0xdf4897b6, 0x70e13ffe, 0xd4e829ef, 0x2e5a2c91, 0xea3a47ff, +- 0x9def1da3, 0x675d3e04, 0xa0d47a30, 0x76d6ec57, 0x283ec579, 0xd945060e, +- 0xf073c29f, 0x739651c3, 0x02482694, 0xe3d71dfd, 0x03bf00dc, 0x0363db9d, +- 0x151adce9, 0xeba2740d, 0x10c38bc5, 0x490bc7ef, 0xd1f1c935, 0x31f11471, +- 0x01d760df, 0x1dd817dc, 0x5159beb8, 0x0cb3629e, 0x6feab9fe, 0xf871bf6f, +- 0xf9e7e7af, 0x61d28eb4, 0x83b07390, 0xc31543c3, 0x64e9c6f8, 0xd3a7af46, +- 0x282ef549, 0xf692d107, 0xd78fdd3b, 0x007d790b, 0xd59e2eff, 0x797e700f, +- 0xa77d9f3a, 0x3e33e79c, 0x7b18eccf, 0xf68bc007, 0x4f00e8f3, 0x41b9876f, +- 0xeafca64f, 0x8f13a700, 0x155f9025, 0x1f0006f9, 0xf8a629ec, 0x5759fba2, +- 0x013f4bea, 0xde9f64fc, 0x7d7ac5bc, 0xd7c27dbc, 0x97e59df5, 0xa1afca8d, +- 0x49f5f932, 0x885f9334, 0x1d12ba27, 0x11b2abd3, 0xea17483f, 0x5bcfc71b, +- 0xf4ee0c61, 0x51a3789c, 0x1cf2794e, 0xaffd7c01, 0x8f826e1c, 0xe3970e9c, +- 0xf7f7c5d1, 0xeb473f25, 0xde4ccda3, 0x30e97cd9, 0xe0e8e9ce, 0xc7ed5f78, +- 0x239e3747, 0x0c4e6fbd, 0xa8fbb7a5, 0x442ba0be, 0xf587ac7c, 0x734bb1f4, +- 0x73857f3d, 0x8980f0dc, 0x22bbdc80, 0xa1f22be6, 0x97ca937f, 0x4e8f0674, +- 0x87afd41d, 0x27d1f01f, 0xd4951a51, 0xd5a02274, 0x71c5621c, 0x9e3328c8, +- 0x3e5eb0b3, 0xf38989a2, 0xef3947c3, 0xc8af8e29, 0x0e734918, 0x36236af0, +- 0xa3e737e8, 0x29b34caf, 0x1b325c9d, 0xcf2a2a5c, 0xd19caaae, 0x79efe031, +- 0xbbea28f8, 0x019e74a7, 0xed20c6ad, 0xcf0bcf3a, 0xb9f6fe4a, 0x74bb533f, +- 0xeeef1cf4, 0x74c9faec, 0xa7677fba, 0xd8e706da, 0x1faff2b9, 0xa5bd030c, +- 0x4feb6b53, 0xd7aeae50, 0x991a3ec0, 0x254a767e, 0xefc5ff87, 0xc187edc9, +- 0x540f0c31, 0x133a409f, 0x5854e0fc, 0xeba13e64, 0xfd3c4259, 0x51e7ee81, +- 0xef4a17c3, 0x10f725f2, 0x181627ca, 0x7dfd22a7, 0xe85dc0f1, 0x9c485e6f, +- 0xb9e62fc8, 0xe40c7fb4, 0xcad60ba3, 0xe55a8beb, 0xc9cf25f5, 0xdffebdeb, +- 0x4effb972, 0x98635394, 0x0ba8ba5c, 0x863e3ede, 0x9777e3d1, 0xee5083c7, +- 0xf9c795f6, 0xe395a728, 0xaee5c3de, 0x1e42cb90, 0x84315c37, 0xe388c718, +- 0x7c1c5c5c, 0xf5f1f7fd, 0xa3315c37, 0x3fdbef7c, 0xd53ae516, 0x813bf0c4, +- 0x892b86cf, 0x0ba8bbf8, 0x2fdfd07d, 0x8ca3c715, 0xc22e7cdf, 0xdf85fe7f, +- 0x19efd057, 0xd0921889, 0xfb927b5e, 0xe0f9cc6b, 0xf2033a87, 0x39d9e29d, +- 0xa5edbc8e, 0x48f79c4b, 0x3f4d00d2, 0xf72b7d3f, 0x82e0e941, 0xd59f8037, +- 0x716298c6, 0x3064c1de, 0x73e82bcc, 0x5115c3ce, 0xb0ffdf20, 0x50213cb2, +- 0x6bf5eaff, 0x447d98e8, 0xaf265188, 0xcd9e4288, 0x2bf2a76b, 0x0188f51f, +- 0xef9f9740, 0xb9f4819b, 0x81e2d890, 0xe9f67b6e, 0xf7ffd1d3, 0x5898e51d, +- 0x3cd714cf, 0xa92fd32d, 0x65e7a090, 0x4a7f9f32, 0x5467d307, 0xf516bb06, +- 0x9ab13b15, 0x64a4d1e3, 0x130a96f2, 0x168fad0d, 0x5a1e2075, 0x2337c51f, +- 0xfeba7f41, 0xf324bcd1, 0x9e70899d, 0x1aaf30f4, 0x113b90d8, 0x361196ca, +- 0x9225942b, 0xc1d6c343, 0x34963cf0, 0x2af7c2a6, 0xf4cd5783, 0x7882ba25, +- 0x63e62fe8, 0xafaf1375, 0xce797a9e, 0x68ddf822, 0xe3af73c2, 0xf05578eb, +- 0xc031032f, 0xcf46f5be, 0xe24f1897, 0x8accaba5, 0x1faba876, 0x9c3fbb41, +- 0xd79811b4, 0x82e4bc68, 0x59899acd, 0xf9987a82, 0x0211e7b2, 0x52e8cd7c, +- 0xb6be460d, 0xf49af913, 0x7be062fe, 0x03e68f94, 0xaed90d1f, 0x2efea0f1, +- 0x5f3452f8, 0x4be70b5f, 0x21c18449, 0xbe71d886, 0x23169b1f, 0xae338a5f, +- 0x86ffa090, 0x97c8f1c8, 0xb4f001e2, 0x46bc663d, 0x1ce267c6, 0x95427af2, +- 0x94e49ebc, 0x14e40dd7, 0xe3c903ca, 0x0636fc48, 0xf01c91ed, 0xd8cb683b, +- 0xce1e99f9, 0xeb0dd5d6, 0x1139fba3, 0x937ffaa3, 0xbb7245fb, 0x475a3eb5, +- 0x4f150fd0, 0xa8c1e62d, 0x61889c07, 0x2e67c07a, 0x90fb5768, 0xfee09eff, +- 0x1de3a983, 0xdf8a1a15, 0x07c972fb, 0x8f9e5a76, 0xef869e73, 0xac691c67, +- 0xaaf5a5ab, 0x879e49f7, 0xe6250596, 0x9f14ed9a, 0x6c9b666b, 0x1afad28f, +- 0x576d2313, 0x22f51e9c, 0xb698f202, 0xa225566f, 0xfc01a3ff, 0x6bff74ad, +- 0x3a006f40, 0x5ed04fe8, 0x1ac87aa6, 0x79b7ed03, 0xcebcd99d, 0xdf2a7e0a, +- 0xfa07f058, 0x16f31116, 0x5c3ce412, 0xe28ce7a5, 0x53a845f5, 0xbe9c4a3c, +- 0xe15befc4, 0x2f562cf7, 0x1e760a19, 0x83ab2ffb, 0xcff02832, 0xfddce8e4, +- 0xa51d3d61, 0xcf5a38da, 0x7f43631a, 0x617ce131, 0x9f879898, 0x73fe91bb, +- 0xbc05ed80, 0x64f1dd9e, 0x978c3c45, 0xca7e504b, 0xd62c0dce, 0xca187f4c, +- 0x73c0edcc, 0xfff1077b, 0xfb95e307, 0x8dbc47c7, 0xceef6de1, 0x61d8f166, +- 0x387ecf1a, 0x597923d7, 0x8774cbc0, 0xa511fe54, 0xed8342d7, 0x802b1ee0, +- 0x7d86a1d4, 0xde3f350f, 0x708ff302, 0x7c03147c, 0xf281946c, 0x0cb65a03, +- 0x59ccd9b7, 0xf8156fb8, 0x42b5ba97, 0x40a3d91e, 0x92ad4dae, 0x7d00ff5c, +- 0xe11a8c60, 0xe53197f3, 0x7794d751, 0x3ab22a4d, 0xd6acce50, 0xf3f7fcc9, +- 0x65ff9963, 0xecd8ec5c, 0x2c079458, 0x962837de, 0xdba009f2, 0x7c03921c, +- 0xe71ce022, 0xa55d77c3, 0xce750ebf, 0x9cfcede5, 0xd10fb34f, 0xcfcb3ea2, +- 0x8eabe0bb, 0x669e7670, 0x74069210, 0x22349532, 0xba563dff, 0x7dfbcf14, +- 0x7805a5c4, 0xe0c65a7d, 0x653dd62c, 0x98af5cbc, 0xa7d790e6, 0x0ef52957, +- 0x7fbc7b3a, 0x794e19de, 0x3fa164fb, 0x8feb978e, 0x55cffeb3, 0x84b5ca0b, +- 0xcdbeeb97, 0x54f83f00, 0x03f81c6d, 0xfa33243b, 0x8c243bc1, 0x195434fb, +- 0x6c6fe0dc, 0x5bf16768, 0xefd05ab2, 0x7e80c7bc, 0x31da5653, 0xbedf571e, +- 0x80145a53, 0xb75a94af, 0x207cfc04, 0xc8275185, 0x9c77ae2f, 0x83f7bad0, +- 0x52c4fcbf, 0x9e74e24a, 0xe1df3c83, 0x143be410, 0x34cee9fa, 0x28fff987, +- 0x3c7fa315, 0x03611cd5, 0xaaad79bd, 0x6b85fd10, 0xbf324d23, 0xf655baee, +- 0xf84ef80a, 0xcafe4509, 0x6c693d74, 0x43a7fe63, 0xcc8d8cc8, 0x76e6e43f, +- 0xd32c7672, 0x6afb68cb, 0xce294ff4, 0x410c5c6d, 0x333711b9, 0x5580fd07, +- 0xe045051d, 0x07f2a587, 0xb1d9d3fd, 0xe55fec56, 0xd5ff402c, 0x1819c6dd, +- 0xd8e86817, 0xf46859ac, 0x82c3cfd3, 0x044822ee, 0x5faf5dd0, 0xfd1e9768, +- 0x8e555742, 0xd57d001f, 0x44f93cea, 0x7bf8974e, 0x84b2f928, 0xe65b5de3, +- 0xc288b198, 0x9d03e7a5, 0xaa3bec0d, 0x5ebe2040, 0xfe416bdb, 0x904c99a7, +- 0x252eafcf, 0x367b27c8, 0x17c8bf33, 0x687bea96, 0xb52d590b, 0x8eee1f22, +- 0x5ff08b1e, 0x7a843c66, 0x4a26f548, 0x7e7c014f, 0xbd7956d9, 0xb2fb3086, +- 0xba1f7b76, 0xf8247e44, 0x796efd55, 0xe4cd923f, 0xb9c38db7, 0x42d1f380, +- 0x054a6d87, 0x96cabd2c, 0x6244ecc5, 0xfc5e3e07, 0x0bfb8ebe, 0x85cf9967, +- 0x597b8b01, 0xd41e96ba, 0x66af3a63, 0xcdf198e7, 0x928f3e62, 0xfd73179f, +- 0x9d0d4ee7, 0xcfafd0a7, 0x3f561314, 0x2750eaa4, 0x2debfcaa, 0x1e84fde2, +- 0xc0a9f825, 0x4270e957, 0x3b3a5386, 0x8fddf020, 0xd37c03f4, 0x25ce91f1, +- 0xc68954c8, 0xef605df1, 0x51f3e48c, 0x5d01707a, 0x370654b9, 0xa91aefd0, +- 0x0188e511, 0xae5a65f4, 0x57c89c93, 0xa976a8df, 0x4823de01, 0x327b94e3, +- 0x4676bf81, 0x9d289c00, 0x9fa40e1c, 0xdf49e216, 0x08e8c929, 0xbf2cbbdb, +- 0x82474a0e, 0x653e7bef, 0xba04c0fa, 0x02a71863, 0x3cb40902, 0x3a412d24, +- 0x5a7c6719, 0xad7ffd03, 0x78d3f662, 0xfac0d6e2, 0xfc72cc2a, 0xd7944b8f, +- 0xa1f6b2ef, 0xdbff8c0f, 0xe4273c39, 0x82eddbc8, 0xdf39116f, 0x995724ca, +- 0xe1f8fb7d, 0x8eaec087, 0x10392268, 0x9d1aa3df, 0xf8907fad, 0x2dec4f49, +- 0xc4f7c3f7, 0xf7c3f106, 0xafbeb968, 0xc3faafa0, 0x27ace617, 0xe7143a7e, +- 0xa8d20ee1, 0x9370a44e, 0x8ef161de, 0x28fe803b, 0x90370c3d, 0x486fd05c, +- 0x8973f311, 0x6de821f3, 0xc545af28, 0x20cafa71, 0xa35f4019, 0xbfd0c3db, +- 0x19d00779, 0x3e02dba5, 0x42df90ae, 0xde196f2f, 0xa532ae87, 0x78e3942c, +- 0x1f1c84de, 0x7f9ed922, 0x72f41324, 0x01e5ea17, 0x87131474, 0x11d288fc, +- 0x723ecf9e, 0xa0aede52, 0xe3ef8133, 0x252cdf5c, 0x535f488d, 0x3d2c5655, +- 0x2f4ecc95, 0x40d54e37, 0x3326f7ff, 0x74031b3a, 0xcbdf0598, 0x20dca4e9, +- 0x90e92baf, 0x9c0aa8ce, 0xa1974957, 0xe8032ce8, 0x98c7c84c, 0xa8d9d3eb, +- 0x674e5bb8, 0x826ee2a3, 0xdadf04ce, 0x372e6619, 0x96aedc82, 0xf90c0e50, +- 0xea05bb20, 0x5132eb03, 0xb169dccf, 0x46f6c41d, 0x69d45ed6, 0x42de4357, +- 0x9ede0ad6, 0x7a8728e9, 0xa76d1343, 0x671f1743, 0x2bd90d79, 0xa3c17b59, +- 0xe04d078d, 0xfeb172c7, 0x46b97e6f, 0xdddb491d, 0xd2ff786b, 0x37a872d6, +- 0xbffd65ac, 0x60c87880, 0xb77287c8, 0xadb7efc0, 0xb331b4cf, 0x25b7e994, +- 0xa53bbf7c, 0x5fb1075d, 0xe4b7eb2b, 0xa09c21b0, 0xd6f4ccfd, 0x4b3ef93b, +- 0xc67db136, 0x78f77e7e, 0x458ba52b, 0x5fea173e, 0x43b554e7, 0xb085af91, +- 0xd6a54b3f, 0x51c72854, 0xdda50bb6, 0xeeab5b60, 0x5b61e2c7, 0x714d14e8, +- 0xe2217fcc, 0xaeaf1048, 0x9a67d00c, 0x245d98e2, 0x268f8bbe, 0x8d911fa8, +- 0x4437b426, 0x2cf3cb9c, 0x850ec091, 0x50bf423d, 0x5971af71, 0x8c2fa88d, +- 0x2ef110cb, 0x9d3e66af, 0xafdbe0b7, 0xaff306c6, 0x3d31c734, 0xbf8f3ce5, +- 0xddabdf8b, 0x13bf2e2c, 0xe0192488, 0x7057f87a, 0x3c42775e, 0x1727098b, +- 0x65780e19, 0x727e27f5, 0x6a5add60, 0x35512fbc, 0xcc205c6a, 0x23cc25d2, +- 0x3c49d49a, 0xd77d9151, 0x3c434e3f, 0x8407963a, 0xa2dc5feb, 0xc2203cc3, +- 0xc134d9f9, 0xc7f5469e, 0xe3953df3, 0x4fe0a369, 0xe010c843, 0xde38d34f, +- 0x3d5033ee, 0xab72e518, 0x5e37c156, 0x21b1be40, 0x6f2dfea4, 0x6a95f057, +- 0xae62ef3e, 0x3e252f77, 0x49ce4bd4, 0x6fcf2c6e, 0x8d777a60, 0x35ea38f1, +- 0x9e991b3d, 0xa8bc4b59, 0xcb752cf7, 0x36cd42f9, 0x4daebd79, 0x97686f5e, +- 0x5cf27bd7, 0x86cf4f38, 0x4fe0a1ba, 0x03ee7eab, 0x0b56dff4, 0xf396e2fe, +- 0x32564217, 0x20ecf2fe, 0xed28e7f4, 0xeef76a70, 0xa1f8c38b, 0xe82d6679, +- 0x58227305, 0x98da82be, 0x64c07c87, 0x14383b40, 0x39da501f, 0x8320ef42, +- 0x2a0f9f82, 0xcf000c69, 0xc6777800, 0x921edb5d, 0x21f02bb7, 0x39fb91ec, +- 0x7c50a63e, 0x93bf3cc3, 0x1cf768ec, 0x31f0ca5b, 0xe902b8cd, 0x0c65d3e1, +- 0xba2ec21f, 0xaec83b79, 0x90762efe, 0xce2e5fd2, 0xb09a7755, 0x8768ad4f, +- 0x29800036, 0xf37bae9f, 0x9fa00bc4, 0x358eef8a, 0xc04d3893, 0x2a563c79, +- 0x9e4e8ff7, 0xe4287a70, 0x2b0f6e3b, 0x93e00bfb, 0xffa1c474, 0xd8412eb0, +- 0xe9fc6c45, 0xf2eaff3c, 0xe8a8ccca, 0x89bdd96b, 0x009a619d, 0xc68f6cff, +- 0x4e760917, 0xe70955cf, 0x4825ba85, 0xffdfc91c, 0x87c41878, 0xf9dfcefb, +- 0x3f03dfbd, 0xe302217b, 0x3257977f, 0xa6f2ef7b, 0x7c079881, 0x0549c791, +- 0xde1c961c, 0xce17b6f6, 0x1c31d35b, 0x7f7246af, 0x1db687bd, 0xe2633bd5, +- 0x3caa0e41, 0x2c57463a, 0x1df6219e, 0x42e96fda, 0xc03ba6fe, 0x0a4face4, +- 0xfa4ebcc7, 0xb8c080fb, 0xe302524e, 0x7e0e42c3, 0x2d6afdcc, 0x17d8a5bd, +- 0xc4b42bf3, 0x3d60b3d8, 0xc1bac31f, 0x1691f43f, 0xbbf835f9, 0xa548ce21, +- 0xee89492e, 0xa3881ebb, 0x3881bd6f, 0xc99e2dba, 0xf694a583, 0x62cd3f30, +- 0xcef9802f, 0x79e1b8f3, 0x1f3a771e, 0x2350e2c9, 0x5f1f19e3, 0xe44dfbca, +- 0xf110f9e5, 0xd9ddf16e, 0x35618366, 0x9b1feb5d, 0x36756189, 0xf567f125, +- 0x339f988d, 0x67abed8b, 0x39f305af, 0xf8aabf45, 0x8eb0a5d2, 0x18c71621, +- 0x9eb61728, 0xa9fa05d1, 0xa83f607b, 0xf57db04f, 0xcc52b184, 0xb95f1557, +- 0x3ce01e34, 0xec788bc3, 0x75108fad, 0x33df8e07, 0xc24ff19a, 0xfc7510fd, +- 0x5b8a85fc, 0xa55e2f5d, 0xe6cefb8c, 0xefb889e3, 0x9914362c, 0x73bee3cd, +- 0x0a4d640c, 0x91db9f6d, 0x48d5ecc0, 0xdc5900d7, 0x537115d7, 0x87417771, +- 0xb8fe693d, 0x889bc6e9, 0xfe20fe9b, 0x7f4dc796, 0x6e241f10, 0xbfa78caa, +- 0xb6417a0e, 0x980f0f1f, 0xd42adc19, 0xcfe0e5b5, 0x6090bcbc, 0xe901731e, +- 0xd028ecf7, 0x89688eb3, 0x137c8adb, 0xe1ebe3f5, 0x22a1ce2d, 0x39df9956, +- 0xd603589c, 0x968ce49f, 0x0ee351d5, 0xa94c0fc8, 0x4ff5964e, 0xfb27ec6b, +- 0x9069a33e, 0x55d33dac, 0xad67ab28, 0x7df643bd, 0x5932d6ff, 0x7773e07d, +- 0xcdbfbecb, 0xbf56593d, 0x7e40ff0c, 0x767e46a6, 0x65fbb6fb, 0x1d1c97fd, +- 0xddca7e82, 0x9712fe5c, 0x287733bd, 0xfac0a373, 0xcbe6daf3, 0xc91e23c6, +- 0x45f6d123, 0x23174f1c, 0x85893dd9, 0x3f9fcc9d, 0x6c997db8, 0x2d751afc, +- 0x47194fe2, 0xc3be242c, 0x96ea3f98, 0x37d21e6c, 0x7db4b8ae, 0x9ebbf633, +- 0xfafc227e, 0xb14de207, 0x24c91748, 0x92b3d199, 0x70bd8c1e, 0x05197b80, +- 0xa3b3c064, 0x20f4648a, 0x1b851bc3, 0x6f2ea9fa, 0xd1de6137, 0x700ba392, +- 0x3944fa3d, 0xe559843d, 0x239110f4, 0x4d9307a7, 0xe1a8ff8e, 0xe12bfc72, +- 0xe9cbb16d, 0xffe97881, 0xcc7780d7, 0xfcbd3978, 0x1ddce0ab, 0x1c81e3cf, +- 0xd90e43be, 0x37088c5b, 0xec243f96, 0xa3b73d7b, 0xcfdcac49, 0x7fa7f425, +- 0x1578f3c6, 0xd5f8471f, 0xb42e48d7, 0x66e37bcb, 0x9ee93dc3, 0x1bcfb04c, +- 0x38f3f309, 0x41c50954, 0x7bf884fd, 0x80a13f28, 0x67ae54eb, 0xfa3b10d6, +- 0xfc4117a5, 0x2b67969b, 0x677fa297, 0x1d69f189, 0x9938bff4, 0xc4d563e9, +- 0x7afdfc8d, 0xdc256ff1, 0x01252f40, 0x1c25547e, 0x63c90ea5, 0xe5c33e02, +- 0x10e93240, 0xf2c9c072, 0x12fee5f8, 0x00b2f102, 0x5ef4253e, 0x9f80be31, +- 0x7c625fe0, 0xe059f83d, 0x19f8281c, 0x45e391c9, 0x63815fe9, 0x181a1860, +- 0xc092b12f, 0xafd28af8, 0x50a7f7e2, 0xa7ce92bb, 0x216cc8ce, 0xcc436f14, +- 0x15d7f476, 0xf099ce93, 0xa0a7f0bb, 0xd236e17f, 0x29085feb, 0x8f13ae9f, +- 0xbc92e29d, 0x8df667cf, 0x2eb88ac3, 0xbfe7c305, 0x49479da7, 0xe4f7c456, +- 0x01c60737, 0x2ff5f51d, 0x45be4eda, 0x7cab51c7, 0x3f7e8131, 0x4f7f5fe1, +- 0xee7ee2f2, 0x48c7f623, 0x4f519e80, 0xcccec6da, 0x952eff04, 0x3250918b, +- 0x5769143f, 0xf41ad9ea, 0x4ee8aaff, 0x486bde80, 0xd3329c40, 0x75758edf, +- 0xe68dfadf, 0xc13afcbb, 0x2cbd9dcc, 0xfe70935f, 0xd0c3ec27, 0x7d7c98f6, +- 0x330b8c0b, 0x82fbfa25, 0xc0dc75c0, 0x037e453a, 0x7884e3dc, 0x9f2a26c6, +- 0xb04bcf51, 0x17515ea2, 0x3b13ea7e, 0x99d4567c, 0x36d7a81e, 0x0301a8e8, +- 0x7aebf8f6, 0x936c9716, 0x4c3fcbeb, 0xa12ef960, 0xa8f3c0e1, 0xf5cc7614, +- 0x47911df4, 0x16e01135, 0x944b3eb0, 0x9f803fe3, 0x9ef49da4, 0xfefe5493, +- 0xcc2eea15, 0xaedcbc13, 0xf54efbc6, 0x1fc85da3, 0xf1aaf7ea, 0xe8777508, +- 0x756f3ef1, 0x93d441fb, 0x03299aba, 0x85c97aa2, 0xe6b33a66, 0xec57f01a, +- 0x207d9437, 0x4c5e8df2, 0x9f33fce0, 0x2be607e4, 0x8af83e51, 0xdaf60f8c, +- 0x4a79bdad, 0x93e304af, 0x28dcea15, 0x9bdae7b8, 0xa5f1a287, 0x8fc00e4f, +- 0x720f1f72, 0x1a37e43b, 0x5d025b47, 0xd4ce99d7, 0x0abc6067, 0x64e1c775, +- 0xc90acf80, 0x12b47106, 0xa87fbb3d, 0x35b72f57, 0x0375d806, 0x203b521f, +- 0xc57a795e, 0xbf70d183, 0x503b8c59, 0x393de152, 0xf67d7642, 0x9f8822fd, +- 0xa3adb2cd, 0x667ad9b5, 0x2f7e6657, 0xcf4593c2, 0x763a3bd7, 0xafdb4b3f, +- 0x7dfef311, 0xe3fa3516, 0x0c64d562, 0xaf5885d0, 0x7e2857b8, 0x70cefb87, +- 0x5efc4d7f, 0xf21be2d2, 0x071f2d00, 0xaff62cfa, 0x37dca4af, 0x87e8d1a4, +- 0x6e9c7d7b, 0xdd45e80d, 0x443f2606, 0x6b31159e, 0x30ad7cf0, 0xaa75f3b0, +- 0x3d9bb0bf, 0xeabfb026, 0x9851ecc3, 0x9a91f5e7, 0x17f95d80, 0x82ca3db3, +- 0xdea2b3fb, 0xfaccc2b9, 0xde7cf375, 0xa1969f15, 0x12d7165d, 0x7ce8cf3c, +- 0x6a9fb302, 0x7964a8af, 0x0f1ab546, 0x5ed50be6, 0x913e61d1, 0x148ffdf8, +- 0xfe01ae0e, 0xd9f3fcfa, 0x0b5d6163, 0x7c0d6d88, 0x046d60bf, 0x21e80571, +- 0x8958af22, 0x7c71efff, 0x44345bd7, 0xe7ef1833, 0xddf5ae3a, 0x0754ff5b, +- 0x9d12efbd, 0x5c71cec8, 0xa5ebcb39, 0xe1c60576, 0x2585df94, 0x6cfc8a4a, +- 0xecafde2f, 0x5bdb07cd, 0x61ae409a, 0xb15fd7e7, 0xebb3f2cb, 0x57e87f69, +- 0x228c657f, 0x4b8f9b3f, 0xfd1ab3c7, 0xe0a16079, 0x6604bdff, 0x9e43d4df, +- 0xdfc090d7, 0xe7f8fd19, 0x5b79e589, 0x7f3848de, 0xe3576f3f, 0x1f9fe3fd, +- 0x12df8d51, 0x12c3dd64, 0xc506dc19, 0xdc5cf069, 0xcdf621ee, 0xdf17e641, +- 0xe205fb89, 0x7d729c7e, 0x73bccbbb, 0xc6c3fd60, 0x72aeff30, 0xec89419c, +- 0xddeeb13b, 0xf51f0cd1, 0x607c536f, 0x9fcb08fe, 0x5ded1ddd, 0x2cc0fc8c, +- 0x8e7cf3c7, 0x7b77dde7, 0xcbbef1d3, 0x0e7ecc5d, 0xcd570f45, 0x4f8007ce, +- 0x42374ed4, 0xaa19192e, 0x01cc9469, 0xf47aebe7, 0x4abb87e0, 0x70bed786, +- 0xc57e21d7, 0xffdf42b8, 0xc63539f2, 0xc63cbff1, 0x1bb12dcf, 0xf77c80a5, +- 0xebf3092f, 0xa12ad97f, 0x49df3f9e, 0x2fe51348, 0xa0d6b6f3, 0xa5f8b85e, +- 0x03629821, 0x7ca4afbf, 0x21225e64, 0xfe72d277, 0x775c796a, 0x7e3efae1, +- 0x7f281239, 0x94469117, 0x969f8b17, 0xeb26abf7, 0x837a0cff, 0x3e8cde32, +- 0xcf176a4f, 0xf77ae44e, 0xf8143250, 0x7d2f03fd, 0x86b48ba5, 0x94f3ffa6, +- 0x806b669f, 0xecb01aaf, 0xb963366a, 0x28bed13c, 0x39a5c291, 0x089d59d1, +- 0x188f8cfe, 0x5ed72e3c, 0x2e00f266, 0x7e008e4f, 0xd33ca12d, 0xd8f164cf, +- 0x723dc21f, 0x9ebd0f0a, 0xd47575c9, 0x7093c9ca, 0xff846e95, 0x8e79af30, +- 0x2d8de505, 0xf63de811, 0x63c6e317, 0x222fd75e, 0x75bf00ec, 0xc197eea5, +- 0x556eb08f, 0x0d71fa38, 0xce0f167a, 0x82aa5eda, 0xedb703fb, 0x1f83f696, +- 0x5563a1a3, 0x37efdc0e, 0x8f31c35a, 0x5e63aa20, 0x6c639326, 0xc716d89e, +- 0x2c67c04e, 0xeba36bdc, 0x4ee9975a, 0xe99a7c64, 0xf61cf539, 0x3ff5923d, +- 0xebb39ee1, 0x21ef1aa8, 0xbcb0d65e, 0xe18441fa, 0xc12be455, 0x5cfa81dc, +- 0x241b8517, 0x939ef5d5, 0x8da3c936, 0x301c77c4, 0xa8fb50ce, 0xc8267e27, +- 0x30699f9b, 0xaebbd34e, 0x20ca9277, 0xcce4231e, 0xfcccc94c, 0x9d5f5c42, +- 0x2c7fc441, 0xe9c5539e, 0x53d70661, 0xf8304667, 0x74b627ce, 0x81bf77e8, +- 0xd1e8aa44, 0x56de5999, 0xd1abfb8c, 0x116f405a, 0x7ad08971, 0x4e7f7042, +- 0x7626cbfd, 0x0df2521f, 0x682e4180, 0x79d6b909, 0x43f9c3db, 0x97e600fd, +- 0x0ec4d925, 0xb7fab071, 0xf8866e07, 0xc59c3e87, 0x321f2959, 0xef277bc0, +- 0xfba63c82, 0x1856fa5e, 0xdc42bf7b, 0x0bdb3687, 0xc3617ee0, 0xcc42d4e4, +- 0xc3e9385f, 0xb5ba0877, 0xaf3c74de, 0x5448bf94, 0x38987e06, 0xa50d1eef, +- 0xaa64faf3, 0x3ffad16f, 0xbd581b12, 0x8ab1779f, 0x3d2407d6, 0xbc83eace, +- 0x4b6ea0e7, 0x0d1efa7a, 0xf42b63dc, 0xfad3562e, 0xac2da484, 0x324b060e, +- 0xcfd26f85, 0xf1d171ee, 0x3eb8582f, 0x3de2f363, 0x0737fad0, 0x84fd02aa, +- 0x7f189263, 0xbec610ba, 0xe64990bb, 0xe778064e, 0x873eff04, 0x5cf42f7f, +- 0x9fd15fb1, 0xf7ef0624, 0x4b7b9719, 0x92d03df9, 0x8c36b208, 0x915c95c5, +- 0x3a870f14, 0xec5c6206, 0xcb346240, 0xf17b35df, 0x8e31109d, 0x4f18a780, +- 0xe40cbbcc, 0xc9f311b0, 0xe2f964aa, 0x79d27e5c, 0xd93ce356, 0x727f7676, +- 0xe0016a72, 0xc34de28f, 0xbc01a6f1, 0x30d77b89, 0xf91f25ae, 0x43f010fd, +- 0xbf4aba1f, 0x5baff4cf, 0x38572749, 0x616d2c9d, 0x259f40f1, 0x24a9e90b, +- 0x513bbf82, 0x04c7df24, 0x4931bf0e, 0x5ecfb616, 0x384824bc, 0x63870b4f, +- 0xe4c077aa, 0x77df9bbc, 0xcf5b1278, 0x0077dead, 0x7ef0ecbe, 0xdbf6a1c4, +- 0x30fdb0b6, 0x473d017c, 0xa4f75ea3, 0xab0bbc6c, 0xd387fd14, 0x8dfb0903, +- 0x3ffec2ce, 0x100defe4, 0x5fb7a5b2, 0x3fd33e66, 0xf7152f41, 0x4eeb89e4, +- 0xed17e812, 0xc6df0fbd, 0xf7faadee, 0xdf114f79, 0xd3ef99a7, 0x96e9f6cc, +- 0xee392bd1, 0xea6a9f4b, 0xf0bdc74b, 0xb72f1def, 0x3b278f90, 0x83c6c1e7, +- 0x2f0a1d73, 0x316e93a3, 0x2a758a3d, 0x670bd9e0, 0x3c04fac5, 0xbf637ce1, +- 0x8a5d395c, 0x9d42da75, 0x38efccef, 0x57eb295f, 0xbfcb30f7, 0x5d395625, +- 0x54ceedd7, 0xf45bdc41, 0xee3e0a3b, 0xcb5fbf38, 0x98e3c499, 0x443524a9, +- 0xa4c2dcde, 0x30fea0b8, 0xe7695dfc, 0x3e5858f5, 0xefded2b2, 0xc275b389, +- 0x25d7343d, 0xa47a7f76, 0x71013fc2, 0x7f465d92, 0x917cbf3f, 0xf87177d7, +- 0xf8aff5f5, 0x91677ef0, 0xab35ecbe, 0x9bff908d, 0xebf20ef4, 0x07b2a8a2, +- 0xf57d6933, 0xdfc8fd86, 0xbeca528b, 0x7cfca4ca, 0xac0386cd, 0xafb2f6fd, +- 0xe93d41fa, 0xd897ab20, 0x4f7e035f, 0xc67bc1c8, 0x88f5f924, 0x7159261f, +- 0x0ab9755e, 0xd5eadfdf, 0xa3d1de5f, 0x1ae022fe, 0xabd22caa, 0x9fc5831a, +- 0x81e97b5a, 0xc38609c5, 0xa790ad3f, 0xaf78edc4, 0xf7c76646, 0xaffbb244, +- 0x86fefb3d, 0x4f9e19f7, 0xf004fe72, 0x35d110d0, 0x1fd69327, 0xe30cf88d, +- 0xea9d9250, 0xb0c7e021, 0xba2cc99a, 0x9d6ba95e, 0xb225f403, 0x20d066cc, +- 0x075fb95c, 0xf0a2f4de, 0x9fedeb7b, 0xa6c2923d, 0x463ac071, 0xf0d03e70, +- 0x435f37f6, 0x82e1b2dc, 0xe1ea06d1, 0x0f0d8e88, 0xa235be82, 0x30dfd7e3, +- 0x5feecc39, 0x008f7588, 0x7dfd1dbf, 0xd71ebb78, 0xb6e3a23f, 0xc8fdf045, +- 0x016476df, 0xe53e8c9d, 0xd0b60169, 0x148defb3, 0x2fcdfdf9, 0x186f99ae, +- 0xe0248e32, 0x54aa27f1, 0xde3c2145, 0x8ab8f060, 0x71dd51f9, 0xd178d6c7, +- 0xdfbf27b9, 0x8c76f542, 0xe1265e83, 0x8bd3f036, 0x7f4ac57b, 0xba4ac9e0, +- 0x68fbfa3f, 0x80415d1f, 0x85725cde, 0x7a01ffda, 0xc8b12978, 0x2486e5ea, +- 0xe615f7d9, 0xb8fb594c, 0xed64dbc4, 0x640b5977, 0x233909f5, 0xb44fdf64, +- 0xf7eaca95, 0xf64bbf0e, 0x52bda57d, 0xb4f02f56, 0x721fbec9, 0x7ede5da4, +- 0x0f01a89c, 0x076d2785, 0x6b3e2ca1, 0xd0e2b747, 0xa1078df3, 0x0617f11c, +- 0xf43fa50e, 0x076d2b8e, 0x0fe177e1, 0x1157de55, 0x6ae9d1fe, 0xdc175ba3, +- 0xa1a89a0f, 0x8bc925e5, 0x62ad44fc, 0x305e55f7, 0x6f01bb39, 0x094abee2, +- 0x122943f8, 0x625ee62a, 0x3167b2f7, 0x4049d87f, 0x19a7f00c, 0x9de3f426, +- 0xfabe36d4, 0x4ec7167b, 0xda37be03, 0x77db2557, 0x6ca715c9, 0xa964a5df, +- 0x65cb4f02, 0xc3f30af5, 0x25c7efb2, 0xdfb592ae, 0x815c7d65, 0xf56527a7, +- 0x0a0db689, 0xe0566d3c, 0x76b267e9, 0xdc1ddf41, 0xf836f53f, 0xca396895, +- 0x780e59db, 0x0fbcf3b8, 0xb3bc31f1, 0x74f01cb5, 0xc436c9c7, 0x51c79157, +- 0xe872ec0e, 0x5083c691, 0x05fda87a, 0x27340efd, 0xd9a87962, 0xc3a9fe8a, +- 0x1e5839cd, 0xefe1b669, 0x8e1e6abf, 0x76cdfbe5, 0x3cd37f2c, 0x66cecb1e, +- 0xcd6d9607, 0xaefdf86d, 0xdfe676e6, 0xd7bde98a, 0x807e069f, 0x1eb7956e, +- 0x27643eee, 0x7e044ec7, 0xedee1dd9, 0xaea3fa86, 0x2fc089e8, 0xa1130007, +- 0xcbcf9c78, 0x3df629b1, 0x0dbf94c9, 0x91756649, 0xb2a6d057, 0x5e1e8017, +- 0x09e331b2, 0x8f211a4d, 0x9a2472ad, 0xa06eac2d, 0xe6364475, 0x613c655b, +- 0x55e4254f, 0x60772510, 0x7bd4227d, 0x90fb58c2, 0x4113198d, 0xf1ceff0f, +- 0xbc9f7b60, 0x20e492c0, 0xcf57e0f1, 0xbfe04d5b, 0xa0757639, 0x8c71e009, +- 0xa4ecb1fb, 0x968f3b40, 0x2d029aa5, 0x0a93d9c8, 0x3d9444bd, 0xc9f1d2aa, +- 0xdb6fb071, 0xbe43cc34, 0x7e804b5b, 0xdecc4b27, 0x4ff5df15, 0x1317f9e1, +- 0x1d4f68f5, 0x6117d957, 0x7be493de, 0x64bce001, 0x7b8410e3, 0x0e97c98f, +- 0xb1b45bf0, 0x7ce3d590, 0x80b6482f, 0x67c196ba, 0x8982c6fa, 0x0a5bdcae, +- 0xe0c1059f, 0x666c9d53, 0x9ec7b6fa, 0xa8807a06, 0xd7b4af1f, 0x5e3e79c1, +- 0xa2fbc76a, 0x767a1cc7, 0xbc261d7e, 0xf63440e7, 0xfe0169e2, 0x5ac9b39c, +- 0x2e1537ec, 0xf35f819e, 0x739e357e, 0x29553c25, 0x3a470f4c, 0x46733b01, +- 0xc705da04, 0xb7deec55, 0x14ccfbf2, 0x0c5d1f66, 0xeb77ee0f, 0xa6cbdbc7, +- 0x87babdd4, 0x22b3d78e, 0x71ee870c, 0xac7d440c, 0x7bc251a7, 0x1be73db5, +- 0xbd76b12f, 0xe304838d, 0x5fe13392, 0x8ed5fdb4, 0x31faff07, 0x15b3fefd, +- 0x21943611, 0xbf0841e6, 0xb3c7f9fb, 0x3fa80c63, 0x569c9ecd, 0x26717206, +- 0x31cd738f, 0xdc31e269, 0xe0e8b1a5, 0xc685ba09, 0x82143582, 0xa56c7164, +- 0xa9cc9e0e, 0x06be5d4e, 0x4fd965ca, 0xf0ada2ea, 0x35ced77e, 0xd1d6c6a0, +- 0xfc8c5c23, 0x3341fbcf, 0x26dcd75d, 0x73d995b5, 0x6bdaae5c, 0x433f2a6e, +- 0x9e71efd0, 0x8081432f, 0x87166af6, 0xc597e8b7, 0x325b74e9, 0x91e4138f, +- 0xa7df763c, 0x1db00e37, 0xf66ba4e8, 0xc4420307, 0x5cede409, 0xc744fc7f, +- 0xbbbe55e6, 0x4ecde620, 0x71fe7a61, 0xd04ca51d, 0x7267ef27, 0xabeabf20, +- 0xfee98b47, 0x2acc3bf3, 0xadcfc38c, 0xb87803db, 0xa8f1cedc, 0x9e70ed25, +- 0x7de6b8a6, 0x8a4ab986, 0x93d79a7b, 0x734eb697, 0x2cbca079, 0x03ca3af2, +- 0x5f70e5e5, 0x45c8396b, 0x7c451f21, 0xcd5cd3d0, 0xf22372f9, 0x4dcd43d3, +- 0xecdc3f58, 0xf348f2c2, 0x5b97ce5a, 0xe6fdfdb1, 0x765f38e7, 0x0dbcbe73, +- 0xae68ef7f, 0x66edf2c2, 0x28969627, 0x7e016fc7, 0xcc4e0d53, 0x83777bef, +- 0xeb7c409e, 0xf31e8772, 0x7889e80e, 0xc858f9e1, 0xbde3d1a7, 0x8d5e653b, +- 0xd2f7cf92, 0x25f7df43, 0xf4f300fe, 0xbe80c3e6, 0x9e9a1198, 0x09ab118e, +- 0x92dfd2f8, 0xbe82269b, 0x356acc7d, 0x657d3e81, 0xa5f21363, 0x49ab7663, +- 0x24dfeb4b, 0x9ddacc3f, 0xd69e9356, 0xc3e37bff, 0x3565ddac, 0xdffad185, +- 0xeacfbf93, 0xc482c26e, 0xe7c8cd29, 0x0874894b, 0x21b947ce, 0x17150c73, +- 0x1e975e54, 0x2e317382, 0x3818de71, 0x56c97517, 0xacbb8fa4, 0x7d410eab, +- 0x0d66ce42, 0x1bb6c55c, 0xbf43560b, 0x0d4ad8b2, 0xba931bf4, 0x1bf4357c, +- 0x26a4fd9b, 0xdcf8dfb0, 0x7ea1ab9d, 0x06b36d8f, 0xce3ad3f4, 0xa238c4c7, +- 0x9f05da2e, 0x835e7916, 0x0f281c3b, 0x281ddbf2, 0xca5c040f, 0x063e56a6, +- 0x7686c77e, 0x3ac12cc9, 0xc1bd4aa6, 0xab91c86f, 0x291af787, 0xfe7a8ebf, +- 0xba2ad309, 0xdfa806cf, 0x5627f581, 0x9dfe5add, 0x97d71292, 0xe7e09f7f, +- 0xe43de41d, 0xb1d09f65, 0x001e32f7, 0x7de314b8, 0x2bbe1334, 0xd0269c49, +- 0x3cb89ab3, 0x6d25095f, 0x3bebcedf, 0xd9579c85, 0xdfd0a7fb, 0x7db85373, +- 0xd83f97d9, 0xfcf41d60, 0x8439ee2b, 0xa1fce768, 0x7b2cc530, 0xb08ea15f, +- 0xcbd7557b, 0x31e6531b, 0x9629f32b, 0xf6c3b691, 0x1479becc, 0xc7bd84b5, +- 0xae4fcca2, 0xad5eec27, 0xd7b94f32, 0xfc670aae, 0x0d780ab4, 0x2989e3a5, +- 0x6564f921, 0xe135f14a, 0x910f6f20, 0xb094bd97, 0xf93eec3c, 0x5b1f3c35, +- 0x8ce22fb9, 0xf25def63, 0xfee56cfc, 0xddf45d04, 0xbf832b5f, 0xea9fc186, +- 0x7d600b77, 0x044d7315, 0xfc8156fc, 0xf06be3e7, 0xbb3f251f, 0xfa727c55, +- 0x9f763adc, 0x6b1f2fbf, 0xc7c2094a, 0xb2975e44, 0xdc2a7a14, 0x3efc831b, +- 0xec060f78, 0x9c123bfc, 0x3d97402d, 0x55afbe65, 0xb2c68760, 0x2dbb93f7, +- 0xbbf035ce, 0x03f963a4, 0xbcf6af22, 0xd04bf5ca, 0xf94a9edb, 0x6ebbf215, +- 0x8cf41610, 0xe075a3ac, 0x8e2c4367, 0xe48fd0f5, 0xef817578, 0x1fca8730, +- 0xe1cb9a7d, 0xe59125be, 0xfe6cf655, 0x0fde86e6, 0x0a8f050a, 0xdc2f28f5, +- 0x3c3cb85f, 0x9767e502, 0xfef03c44, 0x3c69576b, 0x695d2dea, 0xb7940d3a, +- 0x4aee2eda, 0x2be3801b, 0xa4aee3ed, 0xef3606e1, 0xfe50f1d8, 0x115ce926, +- 0x790fbdc8, 0xcebb613e, 0xe037e435, 0x86111e1f, 0x257bfa71, 0x41c0116f, +- 0x1d775769, 0xcd66559d, 0xd35f6bef, 0xfd818dfd, 0x3d519ed5, 0xacddbf06, +- 0xf4db5dbd, 0xed3c8135, 0x09574d91, 0xbcdf8fe4, 0x9d19ddfd, 0xc2bd056f, +- 0x322402d9, 0x13ea8bac, 0xfcbd7eb4, 0xb5124ba4, 0xec0333d3, 0x66bfe1f2, +- 0x54bc4a79, 0xde7de7da, 0x92e65b4b, 0x7a95c3e7, 0x44df318a, 0xfbc48ded, +- 0x9ef62aaa, 0x7a57c882, 0xd4f3db8f, 0x829b3f5e, 0x74ceb87e, 0xfdfebd99, +- 0x823ce74f, 0xf30c207c, 0xff6d5e33, 0xfad60e3c, 0x9fb8ce87, 0xd3f565bc, +- 0x6bf98377, 0x5f679812, 0x565974db, 0xed7ee2ef, 0x2fbb2d56, 0x354ffb54, +- 0xc72a25ca, 0xc89e22d6, 0x0103dd01, 0xfdb495f2, 0x83de17b9, 0x04abbf29, +- 0x1d7ca180, 0xfb4ec939, 0x887b7255, 0x9d587790, 0x95c48fdb, 0xe271eac2, +- 0x7ab31ffb, 0xa9fef89a, 0x4f3a7649, 0xe7689265, 0x75e36ffd, 0x33d58797, +- 0x647ff7c5, 0xbb589bdf, 0x498ed37e, 0x3f05ce70, 0xdfcaa537, 0xddfca201, +- 0xcd7c5a92, 0x3b791a7c, 0xdde2ffe7, 0xdfef8a9f, 0x9c01f115, 0x730936d3, +- 0x6a576ae7, 0x317f5fd1, 0xf03f2dba, 0x7791507d, 0x613728e3, 0xebdd541e, +- 0x0b80b703, 0x1e3a6d53, 0x44ca7a0f, 0xa154ff9e, 0xe59c6236, 0xc7c67af2, +- 0x8b79e943, 0xe194de9b, 0x7f3b4fab, 0x9103178f, 0x4f4bbe74, 0x90f7b024, +- 0xee313bb3, 0xe995383f, 0x22bef0f1, 0xf915e7dc, 0xc459b15c, 0xec71f60e, +- 0x5dec611b, 0xc89db3c8, 0xc1bf175f, 0x1b75d7fc, 0x9b3ca20e, 0xffa2b6af, +- 0x673f5c68, 0x47c42a71, 0x30039d4c, 0x36f4ddee, 0x673fc39e, 0xcb9c7998, +- 0xcf081b97, 0x5fe17dd1, 0x97f81d7a, 0xbfe13bfe, 0x180dea9b, 0x8613dae7, +- 0xc6826cf6, 0x1c41b3ab, 0x577b24f3, 0xdb872172, 0xe23fced0, 0x7887ff7d, +- 0xc59daa3d, 0x959e4469, 0x54a1f798, 0x8f038313, 0x7e4dd487, 0x43c4147f, +- 0x224afe04, 0xb7f81b48, 0x1c6c1e29, 0x83c0360f, 0x2e3fb780, 0x0665fb42, +- 0xbd956b8e, 0x1ee02b5f, 0xe92b1cea, 0x195bac43, 0x3c665827, 0x5df80c54, +- 0x81799376, 0xbe38d297, 0xfbcc5e35, 0x410673fb, 0xb8f028b9, 0x5dde2fb2, +- 0xc4d771a9, 0x5ffdbcbb, 0xdc25778c, 0x8f2d6594, 0x7f7f297b, 0x2ff55521, +- 0x36ffe385, 0xc6ecea7f, 0xb9f6b2fd, 0xc86f474d, 0xa0fc2adf, 0xabbf2eff, +- 0x7a4eb7f0, 0xe20a896d, 0x7c7b4a32, 0x6be3ba5a, 0xdf7bbfa0, 0x09ee47fc, +- 0x00f57c58, 0x90793fcc, 0x51abe5ef, 0x11ecfb7f, 0x355f4f4a, 0xa9d43f32, +- 0xad6a5ffd, 0x63e97d79, 0xb11515f6, 0xecd5d007, 0x20b48fa6, 0xcd5366af, +- 0xea3c5822, 0x309e9cef, 0x81f2847f, 0xc6d1032a, 0x555ff3d2, 0xae73dec5, +- 0x344bc082, 0x6d271e96, 0x1e21a49f, 0xd2b5af78, 0x31e8f1a8, 0xb7bf241e, +- 0xb9efe7aa, 0x7652c352, 0x576d557f, 0xb4d37e63, 0x748e2ce1, 0xef0db1bf, +- 0xf238ce25, 0x6847a5e8, 0x2aed593b, 0xe2b77966, 0x54efd19e, 0xfa1f1337, +- 0x7e612a7b, 0x1dc78954, 0xee316b97, 0x61f7eca8, 0x4d63f32a, 0xbf2c4b52, +- 0x4fcb2f60, 0xee91e713, 0x90be88ef, 0xbbc3c1e5, 0x5a8d95a6, 0xd07cc0cf, +- 0xfea3f63f, 0x557c30d1, 0x61afe03e, 0x9f46748c, 0x1b03d7ef, 0xfd82fe9a, +- 0x5958fc95, 0xe9dfa8de, 0x4823e6b3, 0x3c5f422f, 0xbac1ecd5, 0xab350fd2, +- 0x6e303fe4, 0xee2fe233, 0x5e472816, 0x66189fb5, 0x95f6eefd, 0x9d84abb0, +- 0x04dbb4a5, 0xb5ef10bf, 0xc3fc140d, 0x777b11f0, 0xbccac351, 0x15ff3934, +- 0xd9f2957c, 0x7f8c3482, 0x006ff9ca, 0x7ff6c61f, 0xd3f61f17, 0xfc0da37d, +- 0xeca95535, 0xdd25737d, 0xf93226d7, 0x7577a4a9, 0x19f51ab9, 0x3a0bbd25, +- 0x19becfbf, 0x20b375fd, 0x31d74f56, 0xfbc241ab, 0xff5f2752, 0xba0643e1, +- 0xa7b6ae84, 0xe8f7b2b4, 0xfbee926e, 0xe9b381ca, 0x9677df30, 0x9c33a403, +- 0xf8665bdd, 0x47d69458, 0xbb4d2e8e, 0xb7951cb6, 0x17f18bff, 0xbe73ff64, +- 0xca241c9b, 0xd473057b, 0xd39f362a, 0x213ef2c8, 0xcdc7acef, 0x675579ee, +- 0xd37be2b6, 0x122fb864, 0x7dd2c8f8, 0xc58eb26a, 0x01493437, 0x117508ef, +- 0xe92327cf, 0xb1464bef, 0xf9943877, 0x4f3cf598, 0x37719973, 0xbe5213de, +- 0x3df22407, 0xca78f9eb, 0x7f448177, 0xf9582f71, 0x34c6d02e, 0x90ad7f7e, +- 0xf838b214, 0x3753f9b5, 0xff00c9c8, 0x66d5f770, 0xa4b673b4, 0xae47f1fd, +- 0x6f3c7e51, 0x3e7ee34b, 0xbf6c5d3f, 0xff6c5d0e, 0x6a1749ff, 0xef7c56d3, +- 0xe2e966e3, 0x3f7dab11, 0x8f9c5bac, 0x96fc73de, 0x78b1cf1e, 0xf967b80f, +- 0x471ef8ab, 0xe30437cf, 0xc3f3d740, 0x6bb17494, 0xbacfa33d, 0xaf144c5b, +- 0xd0b94f23, 0xb8e2303f, 0x0dbfef13, 0x990edf7b, 0x90e0a4c6, 0x16eb0d43, +- 0x1bd0827a, 0xdf80fcfc, 0x1d79e153, 0x6e37ca37, 0xaff1be36, 0xfb886b8a, +- 0x4f5add32, 0xdb9009f1, 0xbe82c37b, 0x8d257d97, 0xef50edc9, 0x9ca25a6e, +- 0x534f0057, 0xef15df38, 0xd9a8566f, 0x3b97b93b, 0x589fe8d5, 0xfedf83f1, +- 0xdf6b79f2, 0x58fa95f1, 0x5072f983, 0x0d9446fb, 0x5f2f962a, 0xbcc56e58, +- 0xc07bb02c, 0x17fc215f, 0x5847efca, 0xd1d3c2cb, 0x69d51ede, 0xc73cf587, +- 0x5f0a13d6, 0x123e4d0d, 0xa87ceef8, 0x15f61bf9, 0x9c07e79b, 0xbde9098f, +- 0x9cf99676, 0x1bef8fc1, 0x6dff8ba5, 0x3524fffa, 0xfe544971, 0xa66e49e6, +- 0x57a6124f, 0x589d22ce, 0x2c3e21ce, 0x4fe5849d, 0x2c3627cf, 0xaef61217, +- 0x670ca1f9, 0x8de83a49, 0x0fbe1f5a, 0xbff5e97b, 0x4cfbe2e7, 0x856c8e77, +- 0xe55ba89c, 0x55ea56b7, 0x8fbe053d, 0xd8ff03a7, 0x2b74f7f3, 0x7b1bffca, +- 0x94507aa7, 0x107a4a7d, 0x4a6ff6bf, 0xc4beecd5, 0x5e5107c9, 0x1f599a54, +- 0xfdf98632, 0xe2642627, 0xcdf3f1f9, 0x6f82cd84, 0xef2afc42, 0xdfc58a8c, +- 0x77f84a97, 0x2abdda79, 0x8b79623c, 0xa86add32, 0x79ed66ef, 0x44b71675, +- 0xc22379eb, 0x8b72fb58, 0x67ddf21b, 0xcb9e2f13, 0xaeed90b9, 0xbd13bff6, +- 0x7bf9d880, 0x127ebe06, 0xc3a8bfed, 0x89b6f2c0, 0x9bf61b37, 0x1049760f, +- 0xe997f73b, 0xee0fbcec, 0xe0fdf8c7, 0xe15fb932, 0x267ede21, 0xe013aca3, +- 0xfb74bbf1, 0x0d7ce0f7, 0xf75cee8e, 0x53f81154, 0xc2fc0454, 0x18788c5f, +- 0x5fa228e3, 0x11ecb598, 0xc4876ef8, 0xfb5d8bf2, 0xd2dde2f4, 0xfc7f40f8, +- 0x55f28ca1, 0x74daddf0, 0xc1429fc6, 0x942efe15, 0x261d8823, 0x8306d5f2, +- 0x427e886e, 0xed06ef82, 0x437d5890, 0x577bd8fa, 0xe977d11b, 0xcc33fd02, +- 0xec31fcea, 0x108eb063, 0xbfffac23, 0xd219bdf8, 0xef710e98, 0x55e82f25, +- 0x4a7c5fa0, 0x27dc31c5, 0x63b53df8, 0xed4d3ca1, 0x40ff2851, 0xcf2851ed, +- 0xca147b50, 0x0a3da9cf, 0x362ba2e5, 0x14971c78, 0xce7fd867, 0xbbf83ce8, +- 0x33a62f1b, 0xc32679b9, 0xc75b29d9, 0x63ae1d3e, 0xc7f3a587, 0xec75d14f, +- 0x82ad93d8, 0xe0a12cfb, 0x6fefb3d1, 0xf820cee9, 0x93dfcdec, 0x6ccbe782, +- 0xefe7f3e4, 0xcfdca0d6, 0x2e46f76f, 0x3daef80e, 0xc878875d, 0x123673db, +- 0xf736efc6, 0xd12ed5c2, 0xb1524ead, 0x330bfb7a, 0x0b9d5def, 0x0277b0fb, +- 0xeef9e8fe, 0xfdbf3280, 0xfb863fb7, 0x8c7c741b, 0xbe48f6c7, 0x532f4067, +- 0x6fb943ee, 0xffba2fb1, 0xc77fd075, 0x13b07e9e, 0x3b086fca, 0xfbd8fb2f, +- 0xbbf77db8, 0xaf7bd70a, 0xf70457de, 0x56fdee12, 0xf41f341d, 0xc229464c, +- 0x99d056bb, 0xba71b788, 0xaefaf812, 0x1e395ae7, 0x0017ef11, 0x3c82b50f, +- 0xfa091aba, 0x5b8f2560, 0xfeceefb6, 0x1cb9ef10, 0x3bf81351, 0xe5a38381, +- 0xc19d4ee7, 0xf3289dce, 0x801ce9f6, 0xcefb1daf, 0x9cfbc365, 0xf0d93f14, +- 0x4abf5b77, 0x17f32fef, 0x66f88de6, 0xfd0fd023, 0xe02eff1e, 0x02b9b20c, +- 0x0d33f3e2, 0x2d85dffb, 0xa99f36cd, 0xdcfcf880, 0x9430e944, 0x6399acf3, +- 0xf22f2e21, 0x94e4179a, 0x74a3861e, 0xf512ad8f, 0x2e6052b8, 0xdca17201, +- 0xe71fc110, 0x46287215, 0x98971f56, 0x2efefb22, 0x7dac966b, 0xb2edce42, +- 0x26fbdef6, 0xdffe21b6, 0x7c3c01fb, 0x465e20fd, 0x8efec1f7, 0x7dec4bd9, +- 0xc73dbcdd, 0xd69dbeef, 0x0d3cbd27, 0xc1db63df, 0x2aed27db, 0xd623bfc7, +- 0xa3a9e143, 0xe1f9d48a, 0x14f33f8f, 0x13b0a60c, 0x78bdf76a, 0xbe67de18, +- 0x1d709dae, 0xfbd420fb, 0xd2bfa2a1, 0xf2fca03e, 0x072fc0c7, 0x0cd53ebf, +- 0x231da1f1, 0x790649be, 0xefc19994, 0x21bb7187, 0x9ef4dd14, 0x61fac90f, +- 0x2528fde0, 0x28f210dd, 0x4e5643a7, 0x01eec63a, 0xfb3f2cdd, 0xb433f013, +- 0xf0245dc3, 0xfd2a08ef, 0xb6758365, 0xff041f0f, 0xb86a07ce, 0x3f7bd109, +- 0x5bfc316b, 0xb277a7ed, 0x4963f370, 0x0bbbf8b1, 0xee7ae0f4, 0xc1959b3f, +- 0x76a4ace2, 0x454963ff, 0xe2b276fe, 0xb27bec8c, 0xab235a52, 0xd794ceaf, +- 0x09ae97d7, 0x0f4a1fec, 0x3cdcfc5b, 0xee0f339d, 0xff4149f1, 0x7aef626e, +- 0xd85f3962, 0xecf904b7, 0xf14bfdb9, 0xbf2ab9ef, 0x81e3a7af, 0x08716fdf, +- 0xd3f82af9, 0xcf7b350c, 0x4cbed957, 0xb5bb67cc, 0x614a7df3, 0x6f5c798f, +- 0x69fbb930, 0x93275394, 0x7f4c19eb, 0xc9e1b4bd, 0x710d7c1f, 0x9eccbda4, +- 0x726164ba, 0x17f77f23, 0xcc7bf82a, 0x7d19c383, 0x2abd9be5, 0x53d327b8, +- 0xbc82e11d, 0x26a586ed, 0xdc1bb7cc, 0xa189f7cf, 0xfc1f9080, 0x1a7fd0f4, +- 0x0efe7d28, 0xc805bf2e, 0xb9d01ee1, 0x8cf1fd68, 0x49872843, 0xb86fcb2e, +- 0x9c7cfb55, 0xbfa864ea, 0x317e3194, 0xcb8fe807, 0x55cf422b, 0x57a463c3, +- 0x021f017e, 0xc0fd40b8, 0xf0fbdf4f, 0x1e33f069, 0xfc02fc65, 0x0f513307, +- 0x7ee51bb0, 0x1ef63685, 0x0bbd9598, 0x4242f222, 0x87658ff1, 0x5760755a, +- 0xf1fe6ade, 0xc4f9f5f2, 0x8f1409b1, 0x3e597b0d, 0xfe8ee5f7, 0x6f802451, +- 0xf0d7e128, 0xb7cf0a9c, 0xa87777a8, 0x5079c3c7, 0x70164bde, 0xb201e626, +- 0x181e78f7, 0x20c9b7fd, 0xa7d81f97, 0x50f44161, 0x1155acf3, 0x833cc06b, +- 0x8e51e9f7, 0x98f7f589, 0xf7d91f39, 0x5cd2e8d7, 0x220aae56, 0xa01ea94f, +- 0xa03d058d, 0xf5bb4252, 0x65097de3, 0x258fff00, 0xe216b1e2, 0x3a2f9810, +- 0xbf070d85, 0x899df11b, 0xe04d1cc4, 0x6ec27afb, 0x5a6fb69d, 0x3f57d07f, +- 0x63ff3dd9, 0x69f2198a, 0x879e1646, 0x1f8ef0e9, 0x16c7ef85, 0x43f81a47, +- 0xeb78f126, 0x175f16c7, 0x8f1fd5e8, 0x6fc0908e, 0x0d5fc749, 0x7d7d8be3, +- 0x35a475ac, 0xed17fa06, 0xfbd3be83, 0x42bda25d, 0x0274b2bd, 0x11678bc4, +- 0x5efcd77c, 0xc9a3d335, 0x0b3cec3b, 0x7520dabe, 0xc73be346, 0x32bb9319, +- 0xa684ff68, 0xab3da11f, 0x51ba27cc, 0x6ed7ba3d, 0x77b126de, 0x4e8c6c32, +- 0xfc5d47eb, 0x7f3a74c9, 0x41efb53d, 0xdf6babaf, 0x28a6ef8f, 0x7b5ef9ed, +- 0xbc2fe94a, 0x7fe83f8e, 0xca6fb100, 0x0080005b, 0x00000000, 0x00088b1f, +- 0x00000000, 0x58adff00, 0xe554700b, 0xdef73e15, 0x66cd927d, 0x421b22f3, +- 0x260ddde2, 0x9b709601, 0xf51e4357, 0x8ca4109a, 0x6388376d, 0xfadea56a, +- 0x59092040, 0xd6a27509, 0x0071a6e1, 0x3b634ea9, 0xb33088a3, 0x2331e1d2, +- 0x3054d353, 0x32d740a3, 0x5da96255, 0x66d42d8b, 0x88d46b98, 0xf1a6c935, +- 0xa1986655, 0x5ef7fce7, 0xd6086f76, 0xe6ccdd3a, 0xe73effec, 0x9cff8f3b, +- 0xaa36c01f, 0x5cfb0195, 0x8bdff016, 0xed2bf1f6, 0x8ca2c020, 0x06ac43b0, +- 0x27c8f2d8, 0xfb0dbd7f, 0x990dedd4, 0x47f18b63, 0x475f8e3e, 0x5c8054b3, +- 0x000ea580, 0xd4c0154f, 0xbee8b4fe, 0xf097f500, 0xd9b00350, 0x80453f87, +- 0x9c944e8f, 0x8ff1c6ed, 0x8703b0de, 0x9f1b275d, 0xdb107c9e, 0xf9a7f65b, +- 0x059e349c, 0xef8d3e6a, 0x38aa8d2b, 0x6a7e3ee1, 0x27073ba4, 0xfb4ba60e, +- 0xbdc3fc71, 0xc61fcfa5, 0xafe786f6, 0xaecd8897, 0xd9883c5d, 0x0d885fd8, +- 0x3e6dffea, 0xfd7e075b, 0xfd2e75dc, 0x92e0e15c, 0xf8d0379f, 0xce896cc1, +- 0xcb39a569, 0x75ec2e00, 0xf00e50cb, 0x7dcac419, 0x731f00c5, 0x1b8f18ea, +- 0xcf87f3b7, 0xb3c03c73, 0xe494a50e, 0x37fbb8de, 0x7947ab7f, 0xe77e0f9a, +- 0xdfc865e9, 0x40b93386, 0x5cf2c0fb, 0x787e0186, 0x1a728b98, 0x9708b5e7, +- 0x60085abc, 0x067158fa, 0xb4f89284, 0xdefb721f, 0xe2b81977, 0xd32073b7, +- 0xca1aeed2, 0x965fbdf7, 0x8e83b76c, 0xd9c3dc31, 0x7d0eff68, 0x65798608, +- 0x09d5f109, 0x0808039a, 0x97847298, 0x9c085400, 0x13ff840c, 0x65ff864e, +- 0xa490dcfa, 0xf8cf222d, 0x1941e0e8, 0x6cfce0f0, 0x702bf970, 0x97e3a2b9, +- 0xdf74a278, 0xad66c44e, 0xcd500598, 0xbd592df6, 0x8b7fc924, 0x15e9b230, +- 0x977a7fdc, 0xef627253, 0x0cee1bb8, 0xa73eae87, 0xeb64cc55, 0x053eb9d7, +- 0x7fb2765b, 0xadbfcf53, 0x51c810ed, 0x27d15f5c, 0xb48fde56, 0xafcbd0db, +- 0x0c35e1fc, 0x8f2781f7, 0xee78669e, 0x3a1de079, 0xe98794f7, 0xb8eb4e0f, +- 0x23683827, 0xd6fdcc39, 0x56c0a6b9, 0xc73efc49, 0xc7fb35f8, 0xae5b399e, +- 0x4763fee0, 0xda039716, 0x7c425df3, 0x67c459ec, 0xfe7e3d32, 0xa783a461, +- 0xf15732fe, 0x476fcd5c, 0xcfdb34cf, 0x1c738f6c, 0xe483b793, 0x829bfec0, +- 0x9e228de1, 0x09903603, 0x4b9dd1bf, 0x422d7e18, 0x9ff48328, 0xdfcac8f8, +- 0xfdcd3e4c, 0xfdccfe4d, 0xa43d79cd, 0xc261c42f, 0xc2cf2f11, 0xa24539fe, +- 0x6f09ae45, 0x43d33cbc, 0x3fd63efd, 0x14ed8591, 0x9fa36b7b, 0x1736dfa8, +- 0xbf9073d8, 0xea4e36b6, 0x42afd603, 0x0531a316, 0x2ffc3bc7, 0xd841b81b, +- 0xab767685, 0x93906761, 0x5a3f236d, 0xdf5dba03, 0x8bc7fb5a, 0x76e0179c, +- 0xfa03b018, 0xf7be39cb, 0xe3a42ec7, 0x13b4bf03, 0xbe10e87e, 0x4e5fb431, +- 0xbcbf877d, 0x4db96af8, 0xa58d804a, 0x5f831bc6, 0x22ca09b5, 0xcf84cfb8, +- 0x014bf2a3, 0x1b39119e, 0x8508579b, 0xa5c70f34, 0x3a81da18, 0x90fa94e8, +- 0x787c4b9f, 0xe1dfe12f, 0x1f939588, 0xf12eeb98, 0xe71feb0a, 0x7d23af4e, +- 0x1e562d83, 0x647d474e, 0x40cb803a, 0x65c52b9a, 0x0cfd43c4, 0x23015c58, +- 0x9518f1fe, 0x1d849ce8, 0x8f9106da, 0xfd37ea46, 0xaaa4ed13, 0x7a0c8f99, +- 0xfc93f392, 0x0195db5b, 0xb2aacfdd, 0x2cc0c8f9, 0xc327f1fe, 0x4060fb0f, +- 0xd617fdd0, 0x7ae710b8, 0x59006703, 0x64df7f20, 0x3cb937b4, 0x54e30131, +- 0x0552ebc2, 0x18febfe4, 0xf5db01ea, 0x44abd8b6, 0x07a1ebd1, 0x310759f5, +- 0x6b21bf7d, 0x8f70e6fc, 0xfc1c703b, 0xa91c598b, 0x8dbbd433, 0xd1e9008b, +- 0xee8cfd05, 0xd102e2e4, 0xa314c16f, 0x446cf832, 0x97467611, 0x15d19843, +- 0x25746110, 0x0aba33f4, 0x19bd1806, 0xa2c28ce2, 0xf8b01f58, 0x58df13ff, +- 0xdf6f921a, 0x5a465fc7, 0x66441b75, 0xc32987f3, 0x078dafce, 0xaf9af546, +- 0x500ac78f, 0x6baf8cfc, 0x8cbf32e1, 0x8b89b9d9, 0xd711ec93, 0x27ea21b9, +- 0xdb1a08da, 0x5c3206e7, 0x1046e7dc, 0x066ed46d, 0xbe5bb599, 0x9ab51e22, +- 0xb3425362, 0xbb3cd2e0, 0x70345c9d, 0xab2c25e9, 0x185afa93, 0xd4db5910, +- 0x149f201b, 0x27d6afff, 0x559f1114, 0x889f4d69, 0x03b22218, 0xc61b61bd, +- 0xa6caaad7, 0x2f6c62ee, 0xb7a93c08, 0xed2a9beb, 0xfbd39e12, 0x8c72f08b, +- 0xee0c2eab, 0x2845c46e, 0xa916a016, 0x0396f6e2, 0xb85395fa, 0x54ff225f, +- 0x10f100dc, 0x40b9e373, 0xc256d0fe, 0x3e2dbfee, 0x3aef3f5d, 0xda00f494, +- 0xe62ba777, 0x2de71115, 0x74792dbd, 0xe8776e0f, 0x2b9bbefb, 0x65057e2e, +- 0xae39e272, 0x383ca48a, 0xadb1baae, 0x4f776271, 0x57ee7920, 0x5020af38, +- 0x9af3ed7d, 0xfc488afc, 0x4804ab80, 0x3dc605cf, 0x2f58383d, 0xef9d3c49, +- 0xe96be763, 0x383ddd25, 0xbc3fa4f4, 0xa44bf690, 0x90b5f6eb, 0xd24dcff0, +- 0x94b90135, 0x27f667c6, 0x1a38bf7a, 0x1f137dc3, 0xaeb8c1e0, 0xd394a031, +- 0x56bc5db9, 0xf87a8954, 0x0779da69, 0x4fb4dfe9, 0x0772950e, 0x4327dbca, +- 0xbeecc1d4, 0xaf2577c1, 0x77da4e2a, 0x0fdc5ee2, 0x870aa871, 0x5c38ed9b, +- 0x493916d3, 0x6fe956b4, 0xa73a11c6, 0x12e9f89e, 0xbe91d6a6, 0x38cf3327, +- 0x37fe603e, 0x2333b75f, 0x313f1d2e, 0xde8170fc, 0x7f8a430c, 0xf8b89d75, +- 0x1e303ff9, 0x247b4d76, 0xec7f5e9a, 0x26f06e99, 0x3ab30afd, 0xfd30dc4b, +- 0x19c86eac, 0x85bcd813, 0xc6fcd2f7, 0x14c52333, 0xd1186f6f, 0x42dc30fa, +- 0x02d9f8e2, 0x7b8ddedd, 0xfb82fe41, 0x8b42f73a, 0xb8c74a80, 0x1088f9bf, +- 0x9b5ca275, 0xda304f29, 0x743fb62a, 0xd0649da1, 0x8f93d97c, 0xe437ad72, +- 0x83fe1cea, 0x6d3a8303, 0x1bbc92a3, 0xefd7fe0c, 0xca66fbb9, 0xed4436fb, +- 0xdf8ef8c9, 0x36e891f6, 0x90fdbbe2, 0x21229fb5, 0xac65dfc9, 0xabbca0ef, +- 0xeb37f298, 0xfc782ebc, 0xba97145f, 0x9bfdac86, 0x4c39e902, 0x063dc60f, +- 0x9f78be46, 0xa3e48731, 0x71f379bc, 0xb289d447, 0x2ddbde6d, 0xe85da8f9, +- 0xdd1c5891, 0x5bb328f3, 0xc9ec3e73, 0xfa623666, 0xc01d86e7, 0xc71360f2, +- 0x329c07a5, 0x81e963e9, 0x62df963c, 0x0af2ce5e, 0xcecc138c, 0x1c262297, +- 0x990bddda, 0xcf1e4153, 0x9978e179, 0xcbf37944, 0x6f78655b, 0x333f9241, +- 0x0e116f6f, 0x3ed03b37, 0x1f01efa6, 0x50357de5, 0xae0374f6, 0x87653eab, +- 0x834f8e28, 0x0be98fae, 0xebbfcb3c, 0x64fd2b86, 0x231cc207, 0x4f31f86e, +- 0x2dc3c14f, 0x253101ce, 0x75f135cf, 0x2b4b7a1a, 0xa78cb2cb, 0xeb2cf34b, +- 0xd6836a33, 0x0f1caaf5, 0xd69c50d5, 0x8bca67d7, 0xc341f32c, 0x306f1c3f, +- 0x5deedbe0, 0xb7ec8a71, 0x66feb3d1, 0x657b29c2, 0x53be6585, 0xff102638, +- 0x2cda9f0d, 0x8426fc7a, 0xce51d39b, 0x0f31b7da, 0xc6ea73c1, 0x4d6ee3ad, +- 0x7ee75a05, 0xa01f253b, 0x7b6b44fd, 0xf987b4c0, 0x1ed53f30, 0xae7b7892, +- 0x50f649e0, 0x782c0b03, 0x0aebc4cf, 0xf3071efe, 0x6ee1ba87, 0xd86e5fc6, +- 0x9b5e7b8a, 0xc57cf715, 0x7ac1738a, 0x1185ce2b, 0xf5d7ce2b, 0xa80d7158, +- 0x778adc56, 0x5fe659d4, 0x6964dfdf, 0x655aee97, 0xba30bf99, 0x7c5ed2da, +- 0xfccb76e8, 0x59770325, 0x6d0e97c6, 0xf69b8cb4, 0xdfff5335, 0x619e6d88, +- 0x5ff03c5f, 0x53caffa2, 0x99ce590f, 0x888077a9, 0x6bd6f840, 0x5703bb00, +- 0xedfabdeb, 0x578af07e, 0x0f029deb, 0xf5339de5, 0xa7fa453f, 0xffe86f38, +- 0xc629d233, 0x17bd37b9, 0xfd37271e, 0xcf1e9a6e, 0xb886845a, 0xb06d7a4c, +- 0xcfeb7ab3, 0x3a737662, 0x1ee303c5, 0x18f71b0b, 0xecc1dfac, 0xdbd3ec21, +- 0x493a5c52, 0x5ce2ac71, 0xaaf899b8, 0x512722d2, 0xd0b9a84c, 0xf3419cdf, +- 0x387d1065, 0xfaf0339f, 0x36072d5e, 0x7b613f8b, 0x5bcf126e, 0x03215ed4, +- 0x8a5fd727, 0x4b30b1f6, 0xbf9e0ec5, 0x6ae718da, 0x55a27bf5, 0x052d8376, +- 0xf35ac697, 0xfe3108fe, 0x316ffc4c, 0xe7cc08ea, 0x3cf941c1, 0x05f68aef, +- 0xa45fcb66, 0xafcb025d, 0xbd6f9614, 0xa27629ce, 0x22f15c6b, 0x9e4aeb8a, +- 0xb8882f32, 0xc892f24d, 0xeb4e33f2, 0x2412a123, 0x6a565d18, 0x754cab66, +- 0x30a39618, 0xd19f290f, 0xfb187aaa, 0x2f46ad3e, 0x1253e97b, 0x18838a54, +- 0xdf394717, 0xfb5c4ab6, 0x45c7dd66, 0xca2d6f74, 0xff501790, 0x3c8ef795, +- 0xabe30b94, 0x412a8bc6, 0xb1c43ea0, 0xda63e1fa, 0xdf8a5964, 0x7bb3b0ee, +- 0x6a7a8c0a, 0x599381ad, 0x9c61dd4f, 0xac5b8a3b, 0x76bdf8c7, 0x478675e8, +- 0xd59c7fbb, 0x926f689f, 0x7bbff70f, 0xea82a7be, 0x252b9049, 0xeb370ebd, +- 0x7fe102ab, 0x7acd47b9, 0xdbf35af4, 0x752c17fd, 0xefd61c2e, 0xafef6b97, +- 0xca4d7b32, 0xfa3fefad, 0x77bb1a58, 0x6c2b1f46, 0x7fdc9a22, 0x36bfed92, +- 0x3ec596f2, 0xbbf9ecee, 0xa47eeec5, 0xd7196bbe, 0x05eca672, 0x3476bf28, +- 0x100fc57f, 0xce2389bf, 0x5133aa1a, 0xa60fdf5f, 0x13dac1d4, 0xbce9cba5, +- 0x3fe72eff, 0x5b23be19, 0x905b60e3, 0xd6fcf394, 0x6dadac73, 0x299d18d5, +- 0x9a9759a7, 0x287bf1d4, 0xa67ea1b3, 0x6cd239b8, 0x41232cef, 0xb91f6f3d, +- 0xdd136e71, 0x0e8523bf, 0xf44b4e9b, 0x4bad7e76, 0x4958af6f, 0xecf76134, +- 0x8474baa0, 0x7b439903, 0xf9f79d18, 0x516e0701, 0x403ca797, 0xa69a2672, +- 0x2977a73e, 0x288ad1c8, 0x2a664c9e, 0x873f520f, 0x167e5fc9, 0xf284b3e3, +- 0xfabc0bff, 0x7018c06b, 0xad6ddf60, 0x7a4fd794, 0x647fbb75, 0x2aad2ddf, +- 0x199952e2, 0x40eb4ade, 0x917bd8d6, 0x8ef9afc9, 0xd52f7542, 0x4eb70921, +- 0x263907b7, 0x74198eff, 0x28d4d537, 0x1d064bdf, 0x384afbe5, 0x4edd87f2, +- 0x7e601fd8, 0x315e5320, 0xfba9cc7d, 0x8bc00d81, 0x711defe3, 0x3cf6473e, +- 0xbca67917, 0x9633b305, 0xcefc57ff, 0x6138a319, 0x14e4bfbe, 0xe10b3f8b, +- 0xec979cfa, 0x4c9fceac, 0xbfc86b17, 0xb2afbd3b, 0xa0a6ebbc, 0x40e4c032, +- 0x8c7e2849, 0xdbee751e, 0x2a4dfcc9, 0x7ffe9d5a, 0x103b677d, 0xa68c7564, +- 0x3bc691e7, 0x8b77299b, 0x7b9338f0, 0x4813977a, 0xe37b89ce, 0xbbd8854f, +- 0x7c445492, 0xdf3af28e, 0x7ca6bf26, 0x7dc91ca6, 0xcd6edcbe, 0x7be4a2f7, +- 0xf212f6d6, 0x7f51c403, 0x3bb813c7, 0xfeb2cf57, 0x9aabe90c, 0xa09da7bd, +- 0xa231b638, 0xf525a7bf, 0x3bc0ffde, 0x0f61b7a4, 0x5ad7638b, 0xcece533f, +- 0x0f0cc313, 0x2487f394, 0xa79c8a5f, 0x7eef2983, 0x3ecfc713, 0xbebf1215, +- 0x38c2897c, 0x3c4cdf7b, 0xc448b177, 0x5ec79df5, 0xd276473f, 0x33ffd469, +- 0x739da9df, 0x9acc7eb0, 0x6f1a7ded, 0xc97c9485, 0x6f9fae69, 0x04c7aeb3, +- 0x886cfc99, 0x0af291fc, 0x5e2927bc, 0x8be4f79b, 0x69c19d46, 0x4d78b1af, +- 0x6efd91e7, 0x5f7654e3, 0x7d05ef99, 0x5447de1c, 0x2cdd2b97, 0x79d70b8e, +- 0x17cfb224, 0x74e306d1, 0x34e4d8ff, 0xa33c2ef6, 0x54e79d8e, 0xd93b253e, +- 0x1e5356f2, 0x6f83b9d5, 0x27ea32ac, 0x36a91efd, 0xce9ab2ec, 0x1943fe27, +- 0x32a93eec, 0x4571abf8, 0x0cbade58, 0x177f4154, 0x1e19de30, 0x7752cd7b, +- 0xa2bf07fd, 0x17f0846b, 0x000017f0 ++ 0x00088b1f, 0x00000000, 0x7dedff00, 0xd5547c0f, 0xf37df095, 0x4999bcde, ++ 0x425e4cde, 0x60109212, 0x85444092, 0xa88bfc30, 0x10909db8, 0xc075b569, ++ 0x1daad07f, 0xff908420, 0xa5ba5522, 0x8126265f, 0x1761a888, 0x03a8ba2d, ++ 0x358a8b42, 0x168681d0, 0xb88200ec, 0xbac1bbb5, 0x46ebab16, 0x921888a5, ++ 0x57f15588, 0xe739dfad, 0x379997de, 0x6ed40199, 0xbf7efd7f, 0x737b5d8f, ++ 0xdeefbbdf, 0x7bbfcf73, 0xdee7b9ce, 0xa60cd451, 0x2fb1837e, 0xff941ff0, ++ 0x4d8c6162, 0x5b0f948b, 0x1a7df7d9, 0x0c9c5763, 0xc674aec8, 0x76f2ba1a, ++ 0xcb19bb24, 0x9a473bd8, 0x7a33cf09, 0x2d42d27d, 0x0e4bfdf2, 0xdfff097c, ++ 0x192a4735, 0x9f71e50f, 0xecca00b4, 0x86eb12d5, 0x14ee2992, 0xf319ed06, ++ 0x58c99632, 0xff4674c1, 0x09223664, 0x6b9f07fe, 0xe58cc5d9, 0xd5d09fe2, ++ 0xc2798d19, 0xbbcb1953, 0x4350f34f, 0xe0d6e6b7, 0x19fe48fd, 0x5d57f5cb, ++ 0x3d8c5ccb, 0xa766f001, 0xe546f3c1, 0x7f3b1eed, 0x37fc05f7, 0x669e96fa, ++ 0xcc2b962b, 0x6dccddcf, 0x6fd00561, 0xa0bcfcc0, 0x642f5cdd, 0xc913f4ce, ++ 0x399387f0, 0xcce390bf, 0x632a78e3, 0x9d32cf00, 0x80d8cbc3, 0xc1109bea, ++ 0x9626c6c7, 0xd4898da9, 0xd9694b63, 0x80d5bc91, 0x247b65d7, 0x7fbe0d8f, ++ 0x8c2bdb0c, 0x9b77c505, 0xa02ebd45, 0x94226c2a, 0xf1cea080, 0xcc59fb43, ++ 0xbc44ae4a, 0xa4cd88ff, 0x501941b2, 0xa1af8075, 0xb506f551, 0x646feda1, ++ 0x5ea9d10a, 0xc3b01cf1, 0xcccd03f8, 0x5fc619b3, 0x6267d566, 0xdd0fd97d, ++ 0xf3d4009e, 0x19ca7bdb, 0x497747d4, 0x7c8bce4c, 0x7cf0017f, 0xe007f91b, ++ 0x195eb2a1, 0xc7406728, 0xdb127d81, 0xf0e3879c, 0xc9ed977e, 0xc4bc8163, ++ 0x56664e70, 0x933e7382, 0x17481394, 0x1d217317, 0x1ff2aa5a, 0xb66a8728, ++ 0xfb05bde6, 0x53f35abf, 0x5acf3c69, 0x1f9c7d38, 0xcd1ecbfa, 0xb4aaf44c, ++ 0xf9628e37, 0x3afb558c, 0xde2f91cb, 0x2afcf65d, 0x19cf012c, 0xa17be00a, ++ 0xe38157cd, 0x58d2ddd5, 0x6ea780c8, 0x183971b5, 0x9ef255dd, 0xdd067c02, ++ 0x90d25205, 0x3b7b189f, 0xdff04f8a, 0x5d44e3db, 0xf3ef4c4e, 0x8fd81595, ++ 0x72e2f882, 0x87fefb17, 0x1c34d408, 0xf74a83a5, 0x1828ff8a, 0xfeba2c33, ++ 0x2998c152, 0x8262a002, 0x8c27e197, 0x7cd148f5, 0xf7a39469, 0x8a511c94, ++ 0xbff3c312, 0x27404f3d, 0x7001b7d1, 0xe751fc8b, 0x03778354, 0xb2ee943f, ++ 0xfc01bf86, 0x0a49b751, 0x796ea0da, 0xfbef41ce, 0xd87af236, 0x7f917aa9, ++ 0xba816f4e, 0xbadbdf04, 0xf912bfef, 0x36cc976b, 0x92e3b763, 0x4e5fa82c, ++ 0x54d9d808, 0x2a3e03a8, 0xb75abc1d, 0xf86dff69, 0x8d97557d, 0xbabfa039, ++ 0x73be4b3d, 0x1c97d425, 0x526c32b1, 0xcd59b5b7, 0xa0d2fa81, 0xfef589d4, ++ 0xc0be1c99, 0x15b8396e, 0xbabbf7da, 0xfa046f33, 0x33b26a9c, 0xe77c0ab7, ++ 0x01bcceec, 0xb83aacf8, 0xabbf1ca3, 0x10792ede, 0xb6bba5ed, 0x79c6ce1e, ++ 0xbbe5c93d, 0x73325b66, 0xff83f81b, 0xf0e4844e, 0x32fde037, 0x7e832798, ++ 0x728eb097, 0x5b7583d4, 0x676ea9d7, 0x9aa75f04, 0x50671a74, 0x71849efe, ++ 0x9ffabbe0, 0x629c1e4b, 0x51f985bd, 0x38f6fb0e, 0xe1a13de6, 0x42d59afc, ++ 0xb56bce27, 0x0496ed8a, 0xd546ec17, 0xa4dc1d5c, 0xeafbc396, 0xcad49b8d, ++ 0xd9adb928, 0xd70ccc36, 0xfee18286, 0x811d7238, 0x30ad7807, 0x3d46af52, ++ 0x0950fa80, 0xf8a273aa, 0x254a5eac, 0x26d9acbe, 0x8f89b733, 0xff03dd38, ++ 0xbe027f05, 0x849cfb02, 0x836e8357, 0xedd054fa, 0xa8e82e8c, 0x89cf140c, ++ 0x23f7c7c3, 0x0e9e001d, 0x6b9413c4, 0x19ae7c05, 0xfe8144ac, 0x4ba65e5d, ++ 0xd97cfcec, 0x180b6561, 0xeecfd58c, 0x43972af0, 0x33b7655d, 0xca87ac0f, ++ 0xd4196f4a, 0x7bff24b3, 0xc9569f38, 0xabd7c55f, 0xe01f2cce, 0xe6c49579, ++ 0x42dffce1, 0xab5e61a0, 0x013f81b2, 0x8ab31def, 0x0125909f, 0x2bd63a7b, ++ 0x8f26ba7f, 0xfd4339fa, 0x829fa158, 0x97a3f7f3, 0xa3f5374f, 0xfd195797, ++ 0x71fa85fc, 0x1d3f585c, 0xe19857e5, 0xfa36af29, 0xd7682451, 0x79b0bcea, ++ 0x30cf57e9, 0x2d7573c3, 0xe65a93f5, 0x6577a861, 0xb7581f83, 0xdaf78657, ++ 0x6bc9d4f6, 0xcc5f3458, 0xdb8025d4, 0xcd125209, 0x93d32917, 0xea987c4c, ++ 0xa1d5334d, 0xa5c4fd27, 0x4e13fd11, 0x357c6955, 0x50bd2547, 0xfaa76392, ++ 0xe91a399d, 0xf0af3b85, 0x20eb845f, 0xa1b2cd8e, 0xea27faae, 0xe01af871, ++ 0x96165894, 0x0d641760, 0xcadabf7d, 0xc47330f1, 0xc16f8567, 0x81960df7, ++ 0x5fa854c2, 0x04b92964, 0xb891e6f1, 0x59924e5e, 0xb24bb623, 0xab4fd231, ++ 0x089f8af3, 0x7da9e144, 0x8a5fd024, 0xf56edbf4, 0x4d7f2167, 0xa0247e6d, ++ 0x46ab7c00, 0xa0727cc2, 0x7091e92b, 0xd5a3d600, 0x10b32b23, 0xe415369f, ++ 0x157c7a3b, 0xe34f1fc6, 0xf478815f, 0x4319f8e2, 0x4fe5b7c7, 0x1f6f8d37, ++ 0xdf1a6555, 0xc0f8c2ae, 0x9bcd65ef, 0xbf80f8c5, 0x259b182b, 0x6df1a66d, ++ 0xfc68aaa3, 0x32ab2ad5, 0x38349f8d, 0xfe70b7fe, 0xcff344be, 0xff3cc2bf, ++ 0xf9e6d551, 0x37fe7cab, 0xc6253f34, 0xdff9a24f, 0xe7c53d28, 0xcf9aaa3f, ++ 0x1dfbc6df, 0x8835df1c, 0xfce2efff, 0xb7c609fd, 0xcf30cc15, 0x79ad747f, ++ 0x7e3e36fe, 0x314ef345, 0x2fe346be, 0xf9f27696, 0xf1a5ae8f, 0x83df9b55, ++ 0x488ea47c, 0x3da20c6a, 0x31020b91, 0x9794749c, 0x146071ca, 0x2d187e80, ++ 0x771c13e5, 0xfbbe7126, 0x4df80938, 0x163be88b, 0x7d028904, 0xbe782f56, ++ 0x8a897b66, 0x67de967a, 0xffc4dda2, 0xb4c97455, 0xb6f5b0de, 0xb78058e0, ++ 0x600e4baf, 0x55fd62bd, 0x3bd69941, 0xaec80fb0, 0xfe7c6161, 0x6c2707a7, ++ 0x6c579e8e, 0x7ac3b8b9, 0x4724c7a2, 0x4cc09e1c, 0xe011ae36, 0x982646eb, ++ 0x009fa916, 0x2fc60a3d, 0x28f41b7b, 0x3f0aef96, 0x59e838e0, 0x4dcb46a6, ++ 0x0247b733, 0x30f195ec, 0xfc049baf, 0xef8e1427, 0x20a5cb13, 0x75e3ffe2, ++ 0x9fa8abb7, 0x31807716, 0x0def251d, 0x7b034e82, 0x12cdc16c, 0xf88dd3e1, ++ 0x914499b9, 0x7616ffb1, 0xc30d92fd, 0xc2dddf4c, 0xd0596d82, 0x05dad17e, ++ 0xff987523, 0x26d9e6f7, 0x920a7da3, 0x7242c230, 0xc05846cc, 0x5a1798b7, ++ 0x95011d67, 0x4d59e79b, 0xbf7cfd76, 0x2abdfeb9, 0x1acfbd73, 0xded05ab4, ++ 0x4db12a58, 0x8dadefd0, 0x38c6f7e6, 0x4e34a51b, 0x4dde3157, 0x5bde1c99, ++ 0x8f8c9cb1, 0x6deba275, 0x80d6ff3a, 0x5647e1a7, 0xb2f5a616, 0x1d218327, ++ 0xaf641903, 0xef3e75f9, 0xb36f7858, 0x803ebdda, 0xca1fb6e7, 0xf858cf84, ++ 0xf64b9e7b, 0xeb8ec05a, 0x15a1f0d9, 0xf9d8dbed, 0xfdffc2c4, 0xd1f3b115, ++ 0x0bf7d455, 0x39cfb102, 0x53f2c49f, 0xb0c95743, 0xeaed51e3, 0xec39bf3a, ++ 0xd57f1478, 0xaa639b6c, 0x37ce0d2f, 0x61b25fb5, 0xe2fde981, 0xf7a6a58e, ++ 0x376fda8b, 0x7e0417d5, 0xfdff6a68, 0xf7a6cd15, 0x63de36b7, 0xaabdff7a, ++ 0x7cfaa675, 0xf6a6c3ff, 0x64dbcf37, 0xee796f7a, 0x8e50ebe2, 0x664bfe5a, ++ 0xa47c6eb8, 0xed1fb89d, 0xc5348fc1, 0xd938f483, 0x70724594, 0x654dc9aa, ++ 0xbb14d75f, 0x4ac1eb9f, 0x80ce2606, 0x7da071f4, 0x4665ea06, 0xd2cff3fa, ++ 0xd4008167, 0x09b922ff, 0x9506f27f, 0x25858185, 0xc7c83696, 0xfbd47203, ++ 0xdfbcf39e, 0x653e8200, 0x27b97be8, 0xcd86f3fe, 0x71eb460b, 0xdc8887fc, ++ 0xceb811b2, 0x3df58bf5, 0xc4ad7df6, 0x19cfd17c, 0xbce49bbb, 0xb533ac45, ++ 0xb507d72a, 0xa267b33b, 0x86ab5dff, 0x35cf1b0b, 0x1520275e, 0xe75a24f5, ++ 0x200fc819, 0x297e2605, 0xef77c930, 0xaae0997e, 0x7a009d47, 0x0df31d75, ++ 0x099ea0b7, 0xfd751c1f, 0x9bc38404, 0x0caef545, 0x9b7bd75a, 0xae3b0f66, ++ 0x547c7d20, 0x479a6c9e, 0x3f2689e5, 0xaa9bc795, 0xa9bb7ca8, 0xa69eca91, ++ 0xd9be5415, 0x8df2a014, 0xff2a76a6, 0xe541d4d8, 0x540da6b1, 0xa414dabe, ++ 0x4bc9afb2, 0x62bfa0e5, 0x6174dfe8, 0x02bf0aaf, 0x9faa1e56, 0x85697311, ++ 0xe724ddb6, 0xf3942c9e, 0x85c7da33, 0x399f8f68, 0x5e658e06, 0xf2c57c62, ++ 0x7a3a625b, 0x0ca95ec9, 0x0ca7fd02, 0xe248ef7d, 0xd8587274, 0xd9a6706c, ++ 0xea7f633d, 0xea9e3859, 0x2c0cb20a, 0xce399e48, 0xdac2fd38, 0x1f3af487, ++ 0xa077989d, 0xe3d02e68, 0x297f23c4, 0xc45b7ec6, 0x507497fa, 0x859875a6, ++ 0xbd20f09f, 0xeb46f0a2, 0xa12ec0da, 0xbf83cfef, 0xebf883d3, 0xfbfe851e, ++ 0xfea74921, 0x4c6c84cf, 0x4dee3c41, 0xb3f3020e, 0x709e4733, 0xcb2e3ca1, ++ 0xe3c7e8b2, 0xeb28c1e0, 0x2d74f33a, 0x32e9fd7a, 0x4874cfd7, 0x3d693bb3, ++ 0x30dca776, 0xd74af901, 0xfa418f8f, 0xf4695167, 0xd54b2cb3, 0x9ebc838f, ++ 0xc29056da, 0x5f20efd7, 0x12a7b707, 0x485f82bf, 0xf0d6ffed, 0x80c7ea24, ++ 0x7b10b187, 0x00fa8ec7, 0x797c15de, 0x7f299cbf, 0xdb15f8a6, 0xed18fd6b, ++ 0xf7fc1b05, 0x140fc505, 0x36fd1baa, 0xdb01ca74, 0xddbe7c44, 0xe77c1e34, ++ 0x2fee7c36, 0xb7c5cff2, 0x15113b0a, 0xe2275847, 0x1cdb358d, 0x495d79ba, ++ 0xba1bd535, 0x3ad375b2, 0xfc807f83, 0x414946b3, 0x5c15a9be, 0xed68afd4, ++ 0x6b57c012, 0x0dbf5371, 0x67576f12, 0xf0fd51ef, 0xd38874e8, 0xa77c112d, ++ 0x15b88e9a, 0x3b2af790, 0x5f008078, 0x65c5e755, 0x874ee7a8, 0x1ed1325a, ++ 0xdccf91ac, 0xfdf38be9, 0xe3448b4e, 0x075a0d2d, 0xe0a8ebcc, 0x1afd060f, ++ 0x62cfc9cf, 0x7aa889da, 0xd9db85af, 0x141efdb1, 0x3f0f9efd, 0x968fdbf5, ++ 0x8a1ee95f, 0x0faefaa7, 0x11c93f54, 0x04715ffc, 0x6afe064f, 0xa883be2d, ++ 0xbdb7ab4f, 0x49e8f645, 0x47f0a06b, 0x434fd0e7, 0x5165a7e7, 0x5798d49c, ++ 0x184a4c00, 0xef88a167, 0xfcdeff02, 0xefa7ac3a, 0xd6cad6fd, 0x33ec7c00, ++ 0x07051568, 0x502ca906, 0x0b6a245f, 0xd7143543, 0xedc2cf7d, 0x73e60aa8, ++ 0x47581d11, 0xa791da31, 0xe2366599, 0xd97b34e9, 0x0e8a2535, 0xd2545aef, ++ 0xcdda8b33, 0xbfd80c76, 0x0d92faa6, 0x9b257ae6, 0xa4fa899b, 0x0595bd72, ++ 0xe99f9a25, 0x3a2c1ffd, 0x6b097fe1, 0x6aeb855c, 0x3083fa0b, 0x299d42ee, ++ 0xbabe0023, 0x8c5a3e5f, 0x0b3eee71, 0xf88c43f7, 0x0e34d2c8, 0x26e7757f, ++ 0xdfef0bd5, 0xe9b94d09, 0x07df864a, 0x103ae157, 0xb67925d8, 0xf7e287ba, ++ 0x0b1fc2cb, 0x0f5eb1af, 0x3808d389, 0x7149b6ea, 0x099fade3, 0xf5f4333e, ++ 0xe4dd64b7, 0xf584dc17, 0x4521bf28, 0x99597116, 0xd3f748c9, 0x49603dba, ++ 0xb714f7a1, 0x79b4ec0f, 0x8f7e605a, 0xe4c37c5b, 0x14276469, 0x8f76a8b1, ++ 0xbcf4fc5b, 0x12a97a57, 0x84a656ed, 0x850ed08b, 0x54f88635, 0x2720fc15, ++ 0xde308ab9, 0x8eb064ec, 0x086dfd02, 0xcab3f41f, 0x2b2d7559, 0xc83778c2, ++ 0x9f77f43b, 0x0488fcab, 0x62168775, 0xcb2d9fd8, 0xb877cf1c, 0xfc06f5cd, ++ 0xd612f803, 0x253f8a38, 0xf062538f, 0x0fa86618, 0xf3f31e9d, 0x9184e809, ++ 0x3e261fdd, 0x438b1176, 0x32c2d769, 0x2ba6cf8c, 0x56fe83bd, 0x1c7bfa3e, ++ 0x402f8a7e, 0x6f3ae5fb, 0xe7e22f5f, 0x399b5fcb, 0xfa1ced3c, 0x682ce1a8, ++ 0x75516190, 0x567fbe23, 0x5f29c161, 0x61ba6f43, 0x9bd28d55, 0x59fe2df3, ++ 0x93d40f48, 0xe3049f08, 0x60764df8, 0xe72d1eae, 0xe3f8630b, 0xce91c32b, ++ 0xd6bbfa4c, 0xce49bfe2, 0x57c70a18, 0x486b3fee, 0xcde30bff, 0x3ff72bf3, ++ 0xf5ff4866, 0xfbaffaf1, 0x03bb33e5, 0xcfd54fc0, 0x6602e83e, 0x1d29ef66, ++ 0x7ba01e99, 0x1736d6ed, 0x2549e5ca, 0xbeba42e0, 0x07679417, 0x16c3f0e3, ++ 0xaf4f90d9, 0xff131526, 0x7a9d1f10, 0xa0efdeea, 0x56f1f55d, 0x81f14eab, ++ 0x0db0b66d, 0xb43eb298, 0x36c7cb94, 0xbebc5bdb, 0xcfe403fa, 0xbeb32e86, ++ 0x83d9fea8, 0x066f1899, 0x39ff0a4a, 0xfd41fe4c, 0xa3953f96, 0x06c0d5dd, ++ 0x7ec5ef48, 0x4d9fe387, 0x81607b23, 0xbdf4329a, 0x20d7cfb1, 0xba10d2f0, ++ 0x849903f7, 0xcdfc87a5, 0xc255f6d8, 0x76507fde, 0xef9c53a6, 0xf2197632, ++ 0x160f8199, 0xcb7ef6e4, 0x7a293f93, 0xdde9e00b, 0x34975bf2, 0xb93f9a3e, ++ 0xb9d33bde, 0xb95ff1e8, 0x1f53cb13, 0xbb68c5e8, 0xdd9f58da, 0xd94fc25d, ++ 0x6b5acbcb, 0x607e85d8, 0x27ab26ed, 0xe67d7480, 0x823e9f89, 0x6cd79971, ++ 0x7fd0b19e, 0x5e8733cd, 0x35ea02bd, 0xd7e9ac3b, 0x526869f2, 0x0d2e8466, ++ 0xc98adff0, 0xff543a11, 0x9eea90e2, 0x4caf9fc0, 0x66a3d08b, 0x4d957ec7, ++ 0xd28f8a18, 0x8f6afdce, 0x9d2e8716, 0x3fa3956f, 0x27e4f2d1, 0xf7afea2a, ++ 0xf0d8939e, 0xdcf838bc, 0x62ec8874, 0x51d113c4, 0x6e9069d0, 0x801bed31, ++ 0x0d5fa82e, 0xbfbec53a, 0xec7fe84b, 0xf89e3dcf, 0xc2bfe7f9, 0xda3f947d, ++ 0xaaff383c, 0xc2e1df9f, 0x34abbc79, 0xb47ebe72, 0xe30bd32d, 0x99035956, ++ 0x79fc953a, 0x203f63d5, 0xf4725b7e, 0xff149907, 0x0b6cde60, 0x6c810ad9, ++ 0x8de2df9c, 0x2afcd237, 0xaef89f99, 0x87d951ea, 0x0a47d5eb, 0x8e23bd9b, ++ 0x5c28e45c, 0x19bbbf1f, 0xdf980c1c, 0xe070b8bb, 0x72cbc2be, 0xffc52b70, ++ 0xcaf8a76e, 0x20fd8c0f, 0x1fea8cb6, 0x3e9d39d9, 0x357d8d90, 0xf9a27958, ++ 0x6eeacb75, 0x91a9cfa4, 0x3718e1de, 0x404a606e, 0x02fa43e0, 0xce8f95fa, ++ 0xc3e9ce1a, 0xf8b14adc, 0x297df40e, 0xddf6c73e, 0xc8a3af56, 0x22fb1df4, ++ 0x72fe322f, 0x9dc03e31, 0xbbeaf684, 0xc5ff6099, 0x62b95f99, 0x576037ac, ++ 0x9457f145, 0xdf79737c, 0x6f970f72, 0x7383de43, 0x3ffbe366, 0x07e5c2bf, ++ 0x057b43bf, 0xa70f0ae0, 0x906ffbf7, 0x58d81f48, 0x6f5c9e38, 0x36b90ab1, ++ 0x04f837bf, 0xdd7056e0, 0xec17e41d, 0x4ff08d3f, 0x7ae56c76, 0x5f4a2ef8, ++ 0xae78e036, 0x7219fda1, 0x7fc844bb, 0x7f966286, 0x7dcb91b6, 0xc0227f62, ++ 0xe0d612e3, 0x79411f4f, 0xfdc4f905, 0xac67daeb, 0xfbf79c3e, 0xfabe0fdb, ++ 0xf7d3905d, 0x35390d3b, 0x3958cfeb, 0x8d39daad, 0xf7d393c5, 0x9e210d31, ++ 0xb8f3c29c, 0x10f5aa72, 0xf4bdff1f, 0xabbf81a7, 0xe867f062, 0x8c7844c3, ++ 0x947f87d5, 0x21f571dd, 0x15857bfc, 0x833fe50f, 0xab7e0cef, 0x346eba7e, ++ 0xbe0cc7c5, 0x906ef834, 0x1bbe0d2f, 0xe1346f12, 0x0dbdf62f, 0x97003063, ++ 0xe2958f6f, 0xf97bb508, 0x777c2ffe, 0xc254c478, 0x31969793, 0x447871d6, ++ 0x183d747a, 0x698cef53, 0xfba98def, 0x63fbda62, 0xf6a68dea, 0x55075db5, ++ 0x3612d79e, 0x3c5793b5, 0x1619dec2, 0xdc835f8f, 0xa07d0d2f, 0xb42f9006, ++ 0x7adefa01, 0x31380b37, 0xa64fbe1e, 0xe03f48f8, 0xd38c1578, 0x882f3dbf, ++ 0x0e6d1279, 0xc81a771e, 0x9ea15750, 0x5c07d7eb, 0x380e3768, 0xdfaf1c78, ++ 0x8d4ae037, 0xdaded7b2, 0xee9e932b, 0xf1d9b209, 0x41584afc, 0x587a6e48, ++ 0xbe3cf7a2, 0x46d64b3f, 0x4b78c0ad, 0x10c1ec87, 0xcdf3454e, 0xe82bcc2e, ++ 0xdd705bdf, 0xf8be783c, 0x0db69945, 0x4f4ed1fb, 0x95787241, 0xee7f28ec, ++ 0x343c0b24, 0x7bf5e303, 0xb1575fb9, 0x60fec636, 0x2a7f896b, 0xea2ae5b5, ++ 0xdec3f04f, 0x7057ef36, 0xfd16a839, 0xbf346d55, 0x1dc7be37, 0xabd7b45b, ++ 0xfbdf98b7, 0x541fff85, 0x24cf3e44, 0xdff84936, 0xf424fe3c, 0xfc792cf0, ++ 0xff00f375, 0x866447fd, 0xf667f5fb, 0x33ff84ca, 0x3cfef9db, 0x472fe9c5, ++ 0xfd201e7e, 0x17a9e067, 0xac4d47e5, 0xfd777a9f, 0x908ff177, 0x5ebf764f, ++ 0xf6506ff4, 0xf0ad7eee, 0xe5ff58d7, 0xcebd461f, 0x7d2fb686, 0x22fb41ce, ++ 0x8939cffd, 0xfdf7fbbf, 0xb08fd46e, 0xf146c7be, 0x3ee7fee8, 0xe97e4229, ++ 0x8556dbbf, 0x247fadfa, 0xf65b47f7, 0x43d4527d, 0xd12b69eb, 0xca8ab7ed, ++ 0x7fbda1ed, 0xc74a5379, 0x76856612, 0x24c973c2, 0x72bf0d3f, 0x7facfc50, ++ 0xd1c527df, 0x9dd7fe76, 0xafd8bd4f, 0x79b277ec, 0x54be113b, 0xf0d3cfbe, ++ 0x689fcbeb, 0xd08b7cc6, 0xbc11757e, 0xe7cdfd2f, 0xfb37a845, 0xa7fb7277, ++ 0x18f3dacf, 0xdabdc7ee, 0x2b6eef3a, 0x850fb9e0, 0xd3e80728, 0x944cf0f6, ++ 0xf978a193, 0x1782e29c, 0x0ad38f8a, 0xe3fc0f8f, 0x72f243e3, 0xda0ce6fd, ++ 0xa7f79c25, 0x7a8ebe6f, 0xf11b39e0, 0xf7df31a5, 0x3ec99b3b, 0x35bcdf39, ++ 0x7c2bffeb, 0x96f3a170, 0xef3217c2, 0xe7c1ff4b, 0x137143bd, 0x3072b17c, ++ 0xddf7cf94, 0x9c67f549, 0x02f7821e, 0x7f9afdf9, 0x697ff9f0, 0xba04efba, ++ 0xef3fcebb, 0x79f07fea, 0x8bfba627, 0xebba09b7, 0xf0d2cf98, 0xbe09cf9b, ++ 0xd6e7ab2f, 0xf5b1ff58, 0x1bf9a25c, 0x8b1afc76, 0xe31f23a7, 0xc025e871, ++ 0xe739ad3a, 0x707863b6, 0x3ab9b8cd, 0xcc7295da, 0xfe51a4fe, 0x24fdcada, ++ 0x3129f719, 0xc79237ae, 0x9bf098f5, 0x860f0b68, 0xb24ab456, 0x156d155b, ++ 0x4f15a7b7, 0xb2f017b7, 0x1e8592e6, 0x936215ca, 0x9eb1f98f, 0xf143c33b, ++ 0xb1ff18ea, 0x095e6255, 0x92e559ec, 0x7f411d6f, 0x12ce3ac6, 0xf95115b6, ++ 0x45ab9616, 0xabaad21c, 0x1b473f26, 0xdc3bae6f, 0xf44dbae6, 0x7e1c6767, ++ 0x620b167b, 0xf8be5a3c, 0x6c798e80, 0x498524f2, 0x8eb07750, 0xb613fa00, ++ 0x3ff7f32c, 0x8cd664c1, 0x35731e08, 0xb0be432f, 0x0cb43b0a, 0xe7ac14fd, ++ 0x5fed18fa, 0x49543b0a, 0xe200b2f7, 0xc430f755, 0x6103fa2f, 0xd85e07f0, ++ 0x1fc504fe, 0xd6f53f4e, 0x9a9e1077, 0x0ecccb5f, 0xeedbecf8, 0x5efc6164, ++ 0xdfe8aa09, 0x2f648754, 0x709467c5, 0xfb51f5f1, 0x597d8689, 0xe693acf3, ++ 0x16d3bd53, 0xafbe16bc, 0x114efdde, 0x0f77f7ad, 0x781cbd90, 0x256cf24a, ++ 0x708a7bb0, 0xe15ab0bf, 0x7d2c6e76, 0x3f72b0df, 0xf24f77bd, 0x48078c3c, ++ 0x671e78db, 0x56cde775, 0xcbfe545b, 0x6f3cadef, 0xff11da18, 0x28949e05, ++ 0x8be1068f, 0xec341fce, 0x2527dedb, 0x35975f0e, 0xd5a0f988, 0x61f476db, ++ 0x98faa35c, 0x62e683cd, 0x280fb6c3, 0xecfa5e6e, 0xf21eae33, 0x5f9364e3, ++ 0xdc9fc43b, 0xd43f1326, 0xdec8ea87, 0x45f13a85, 0xb8fc677d, 0x9efcf9ca, ++ 0xedf7679a, 0x6b0a000e, 0x1733f17e, 0x754e4dc6, 0x5f91756f, 0xf1dcedb9, ++ 0x63fe219c, 0xf4e73de7, 0x1fe14f1f, 0xd55b2760, 0xdb7bff18, 0x017bb230, ++ 0x7978e2be, 0xd5bf06c4, 0x63d1f33c, 0xddecdf18, 0x0863fef9, 0x3f5fed6f, ++ 0x56ed0c7c, 0xc7439cf6, 0xa7868e7d, 0x43e28bfe, 0x55a377c6, 0x7beccf1e, ++ 0x571467f2, 0x1dbf03eb, 0xf7dbeb7b, 0x5bf428ee, 0x9a7c76fa, 0xf2f87e89, ++ 0xe386b37d, 0x2aef977c, 0xc8e2ce1d, 0xdf2251bd, 0xae202f06, 0x83af4b17, ++ 0x5f6483a1, 0xa37a069f, 0x0f18337f, 0xf1e3ace8, 0x0388b715, 0x3f1f8f6c, ++ 0x87f7e21d, 0xaaeebfae, 0x3d5a58a9, 0xebce3ea8, 0x7402bfff, 0xf401789c, ++ 0xf08f7edb, 0xefd3e273, 0xfe81fe34, 0x1cfc2abf, 0x428fbf41, 0x047f1f8b, ++ 0x258685df, 0x17c3fff4, 0x3e233780, 0x677aa49b, 0x3b5f28ab, 0x0b78a69f, ++ 0x985aedd2, 0x1f33df68, 0xf6b8c28d, 0x6dc0eb49, 0xa6dfdf3c, 0xbd5b1fa3, ++ 0x3f240fef, 0x528ebb7d, 0x388993fc, 0xfc1b1f69, 0x225ae3c7, 0x8b61af57, ++ 0x040dc793, 0xe0ae31fe, 0x1173d176, 0x6c7ce03f, 0xc51215c4, 0x7cd49a13, ++ 0xe3c77791, 0x5e5b751e, 0x847a7e17, 0xa474d25e, 0x8ce75bd3, 0xd0781b73, ++ 0x45970f11, 0xc7e2c7c7, 0xa8e3066d, 0x5c465e82, 0x05fe306c, 0x878c5cf5, ++ 0xb03fa504, 0x6fa0fa38, 0xf5ab8f13, 0xe7e7e359, 0x7fb2f118, 0x31b3a18e, ++ 0x61f244cf, 0xe0f9e9c8, 0xa9f8b2ff, 0x7e26dd51, 0xfbd4f031, 0xfe3d7c59, ++ 0xfb617aa8, 0x5bf709d9, 0x3ed3256a, 0xbfc5ad76, 0x2eb1f911, 0xcfca96f4, ++ 0x3873f03b, 0x457b7cc6, 0x53ef623e, 0x5651c532, 0x3d241e75, 0x8c2fab1e, ++ 0x7858b8fd, 0x5db9559f, 0xd7c5df51, 0xce9dde89, 0xf4fd06a0, 0xfc43d81e, ++ 0x2dfdbf5c, 0xde1ce38a, 0x27b50bf6, 0x75c55d6a, 0x7f051822, 0x17f7cfef, ++ 0xcf2078f1, 0x671d8e8f, 0x61a7189f, 0x1a71fc6f, 0x1a607fb6, 0xa9d026a7, ++ 0x73d2fcf2, 0xf14a778f, 0x9dfd8cde, 0xcc32b6ea, 0x29d53c1f, 0xffb78ecf, ++ 0xa6ad541b, 0x5eb825f3, 0x51f81e52, 0xea62de7e, 0x679449cb, 0xece8fcbd, ++ 0xb1d253d7, 0x7f43c204, 0xa7ce66a1, 0x477b1fa1, 0x4743bd20, 0x3ae32bbf, ++ 0x1bf11bb5, 0xbf164f65, 0x04ea58d2, 0x86fc50bd, 0x6bb22a6f, 0xecb9beac, ++ 0x3f04c598, 0xd71c338c, 0x07e85681, 0x1e603fcf, 0xbb23c215, 0x3c2367ca, ++ 0x1dd16eb2, 0xad5ef271, 0xd0f28f9a, 0xbaad7e8d, 0x7d9ccf39, 0xfd8dc536, ++ 0xe46c5df4, 0x1052f917, 0xdf751f4f, 0x2fbb4bc8, 0x73f95ce5, 0xecbe8527, ++ 0xb0b0f26d, 0x6081cfca, 0x1fe441bd, 0x483ded57, 0x3aaa9de7, 0x7c06e625, ++ 0x241d652d, 0xa9aa9f37, 0x6cc43f22, 0xfdef543f, 0x0eafb53d, 0xac35f6f1, ++ 0x79e3da93, 0x3e49b091, 0x1dd8c4a6, 0x45fbbf9c, 0xd9ed48de, 0x3423ca62, ++ 0xb8d874e0, 0xe936f59c, 0x8b5efd26, 0x7e7869f0, 0xa9c69bab, 0x1a661ceb, ++ 0x775768c7, 0x2fca0af6, 0xdd2bac1c, 0x67756fc4, 0x19c689ff, 0x2ca6af94, ++ 0xfee243c2, 0x8ee09847, 0x04dd3ff4, 0x19ffa46f, 0xfe6c6e34, 0x1e5cd669, ++ 0x9ebecc5f, 0x5ce30197, 0xb052654e, 0xfdf70f25, 0xd06d23fd, 0x3eb9cb3e, ++ 0x73a310ef, 0x3dbf9460, 0x942926c6, 0x8fce246f, 0x80b5d69d, 0x47dbd605, ++ 0x66ebcdb4, 0x1843ca30, 0x43ce8b67, 0xd422e160, 0x21bb461f, 0x14f263ef, ++ 0x5013f172, 0xaf80b281, 0x8c29e440, 0xfa123d64, 0xfc9d1b2f, 0x2d68e29c, ++ 0x3fdf82dd, 0xe303fc21, 0x7390e21c, 0x15e7318b, 0x314e77cf, 0xf6e4b4bd, ++ 0x1ac61ed1, 0xf14afb6d, 0xcdfa4adc, 0xe8463b25, 0x7f03398c, 0xf6bcc52c, ++ 0x4c959ff4, 0x9ffa86ca, 0x4651df56, 0x992cfff5, 0x9fea0a34, 0x329fffb7, ++ 0x51235f6a, 0xcda96ade, 0xc07e8653, 0x37cbd657, 0x7acc4600, 0xc7a43af9, ++ 0x371bdf69, 0x1e63762d, 0xf1ca80c4, 0x6ed87ccb, 0xb78e74e4, 0x1d8ded5c, ++ 0x96d1a788, 0x27d4669e, 0x24fbef8f, 0x9bb8f515, 0x9d1f84e9, 0x6798eab5, ++ 0x7fa68f02, 0xba7c8e71, 0x8332bcd8, 0xbf34aa7f, 0x7ab7e91f, 0xca07b8c1, ++ 0xaa47bc61, 0xde79db26, 0x819f399e, 0xcf44e9e9, 0x844f410a, 0x97951ed3, ++ 0xa80e44bf, 0x874c7cfc, 0x74ca5f58, 0xd40a4f1c, 0xfa5c5fca, 0x6e5ae1e5, ++ 0x5f38a5f0, 0xf1ae751a, 0xd5dbc42e, 0xd8ca9f9a, 0xd9d78d73, 0xf9c43f7c, ++ 0x1d9e5764, 0x9ce37585, 0x4779ec62, 0xe2580ca6, 0xc59bebd9, 0xf044c779, ++ 0x57fbb1ce, 0xbff9b8e3, 0x023cef71, 0x42b135f2, 0xe68a60f5, 0x335315c4, ++ 0x90be7e14, 0x041a1df2, 0x5c2cb2fd, 0x8c9dd90e, 0x6dfb5bf6, 0xe9fd1792, ++ 0x5a743bfe, 0xae2b736f, 0x3fb6bf25, 0xf313af39, 0xc47ffa82, 0xe66297cf, ++ 0xc8d1ca34, 0x876129bd, 0xe3e0e48b, 0xd8f83918, 0xc798976c, 0xddc2ffed, ++ 0xe9fd43d5, 0x98303fa2, 0x83e72333, 0x8ebe65fb, 0x09b937f6, 0xb02c918e, ++ 0x0bb1ed1f, 0x36a7ef1d, 0xc05ff9f3, 0xbc68b6fb, 0xbf4c4f6f, 0x9efd0567, ++ 0xd8bf478d, 0x6d0ba873, 0x7bb610fe, 0x2af0f2b7, 0xf9e87bab, 0x36ba58d3, ++ 0x630f1d28, 0xef7323a8, 0x18176407, 0xc2b89b74, 0x330ca193, 0x0837f1d1, ++ 0x1fbdc4ef, 0x835c7058, 0x90493f7e, 0x1b5bfdf7, 0xc7623fb7, 0x93d79ccb, ++ 0xfed38fe3, 0x45ce0c55, 0x7b22e7e9, 0xdc3f8d31, 0x4340e3c2, 0x3fec27db, ++ 0x98f95cff, 0x17ef3a45, 0xf10c7ff0, 0x0dffe064, 0x1b3fc89b, 0xc1ffff8a, ++ 0xa9fe0379, 0x1ffc00bc, 0x0dfe173f, 0xe846ac3f, 0x6fdc1a85, 0x93f9fe02, ++ 0x3e666e7b, 0x6b2e5b8c, 0xb74bffc4, 0xd23f62ca, 0x66766d7b, 0xbd2c8f44, ++ 0x15bf71bc, 0xa3e970f8, 0x8569f112, 0xbefeb738, 0x9b12df38, 0x2f3957df, ++ 0xfcf27a40, 0xd2417e79, 0xccdb3543, 0x09b73fcf, 0x46c9ddff, 0x806e5e51, ++ 0x8594a39f, 0xffe2c45c, 0x45f4268c, 0x5da9aa45, 0x36461d2c, 0xe0f94c5a, ++ 0xfd83a5d9, 0x659e5f90, 0xe281ff71, 0x656eff6e, 0x2af1cf18, 0x88c353e9, ++ 0x1952a98f, 0xe4225bf6, 0xf46fe8d6, 0x965db30a, 0xff9f3017, 0x9f37682b, ++ 0x91db1bff, 0xd17f6a63, 0xfbd37c86, 0x9897838b, 0x6dba5fde, 0xa13ea9b2, ++ 0xfb530af3, 0x4d335d89, 0x6fe149f5, 0x394fda99, 0x9f54d732, 0x535dfdd6, ++ 0x2d8ecbfb, 0xbcbfbd34, 0xfef4daa7, 0x4ccb93ca, 0xfe06abf5, 0xbc3ed4d9, ++ 0x03c5eb98, 0x78b9594d, 0xcbc0c0be, 0x8b55db81, 0x2f6fcf8e, 0xd145e8b4, ++ 0xeebd33cf, 0xbd8b2c22, 0x92270fe8, 0x767b5297, 0x5cfaf46e, 0xbd26acc2, ++ 0xad8f6a56, 0x05197e0b, 0x9fc402fc, 0xb5eb376d, 0xda338d11, 0x39647cc1, ++ 0xde50c74b, 0x35d7c834, 0xa8dfae76, 0xf2f900bc, 0xeb77bb61, 0x3ede74c3, ++ 0x9464be56, 0x032a02af, 0x3ccacfb4, 0xb0f97794, 0x59a7ccc3, 0xadcaf409, ++ 0x7b888b76, 0xf4fef076, 0x24c50e23, 0xb3f3c627, 0xa5cfd149, 0xfe52d725, ++ 0xad7ea24e, 0xd9af0b59, 0x9ad2fa02, 0x78d2a7ed, 0x12cf36de, 0x2eef3f37, ++ 0x6bf4d7fb, 0x9fb10c37, 0xbee3b2ee, 0x0fcbfa65, 0xfd59be61, 0xdfe4032d, ++ 0x78ccdb66, 0xc33dd489, 0x9b953e79, 0xf9d4279f, 0xda9b1b9f, 0xdef5c1af, ++ 0xd7e2e798, 0xde6266e6, 0x7f026e40, 0xeb9d9777, 0xaa9ac7e9, 0xb3c0a9ae, ++ 0x15876820, 0x8f65ce47, 0xa394370a, 0xe45a3e9d, 0x89643f43, 0xaff4b79f, ++ 0x51c31f02, 0xa07da281, 0x3f8f14a9, 0x4b86f95d, 0xd6fc7981, 0xe457ffe2, ++ 0xbb13858b, 0x65f9f98b, 0x4a5cd64f, 0x7e09d0b0, 0xd28d0f43, 0x5ea10f7c, ++ 0x99e60519, 0x3c286f3b, 0xcdf16fc3, 0xadf783ce, 0x468f1669, 0xc70901f5, ++ 0x36325753, 0xfeb7da0c, 0x5af82655, 0x794e5c0f, 0xa7e6aa3d, 0x4f31b778, ++ 0x8c00f226, 0xe947fef8, 0xd81f9037, 0xf9e0c97a, 0xa17e461d, 0x7ec6ebe6, ++ 0xa56f5a3f, 0x4a675b71, 0xb4a3f7a6, 0x030fdb8e, 0x64a1951c, 0x1b29fb8a, ++ 0x8c7e43be, 0x69e1c59a, 0xb9624c7d, 0xe3c3c112, 0x0f8e2ed2, 0x44a3c3c0, ++ 0xc7de6f67, 0xf0d26316, 0xa5452ebe, 0x13239d73, 0x125e0bc4, 0x0dfa65f8, ++ 0x65476899, 0x5786645f, 0xede0ff5e, 0x633f3187, 0xbb07b257, 0x10ad360c, ++ 0xb7cf34f4, 0x75ee7d2d, 0xcb5da1f3, 0xd4c3322b, 0x630f771f, 0x390f3469, ++ 0x6f838c18, 0xf7005e83, 0x793f484b, 0x33cd3943, 0x0979d04f, 0x7ef519d0, ++ 0x9b37c596, 0x61699ee8, 0xf858cf38, 0xf6e42f7f, 0xfdcebb15, 0x6bcaacf4, ++ 0xb2c30cb6, 0x98ede482, 0xf57da13d, 0xaf3fd0ba, 0xe73fd3c7, 0x76a3f7bb, ++ 0x2c61f75e, 0xd845af65, 0xd1858db3, 0xabe83276, 0xa30f4813, 0x2caca72e, ++ 0xd897bd42, 0x17b4f31e, 0x1edf9de6, 0xf90c3b43, 0xfec3b0ce, 0x2fdb376c, ++ 0x13f5fa51, 0xa85fb73b, 0xfafd00bc, 0xefd7e919, 0x2fdae386, 0xfd7c6a19, ++ 0xf1c1c536, 0x8caba0df, 0xec12f8f2, 0xa43a14bb, 0xb44ef3b8, 0xbfcf9cfe, ++ 0xf8364fc8, 0xdcebd0d4, 0x2a9560cf, 0xd99d03ed, 0x10a7bc10, 0x7cb52df7, ++ 0xd44dbbca, 0xff1588cf, 0x1afc40ee, 0x30e91b78, 0xe8f013e3, 0xa13e7076, ++ 0x6b1e0872, 0x13168f01, 0xce3ac71e, 0x657e0761, 0x3e655ebd, 0xf027d377, ++ 0xc55dfa0d, 0xff5f4ef1, 0x2bc63166, 0x98fc6fea, 0x1e57fbf4, 0xfd799e67, ++ 0x186efc30, 0x3ee07247, 0x157ff5cb, 0x8a1ed1f1, 0xbaecb5eb, 0x88e30528, ++ 0xf5073375, 0x83db9d86, 0x4effa4f9, 0x1179b6ef, 0x3c69d3ce, 0xf77a74be, ++ 0xbe318765, 0x91d37ef1, 0x5eca257c, 0xa3f3fd39, 0xefe856c5, 0xc5a3cef4, ++ 0x20efe90a, 0x5f78cbe1, 0x8befc5f7, 0x9ce45a7d, 0xd9bf20c0, 0xdeb3faf9, ++ 0x3f26e3c1, 0x89b6bcc1, 0xcc9f3d8c, 0x33c364e3, 0xf3e3f72d, 0xc0102916, ++ 0xd48b6838, 0xc7718a5d, 0x9d19b7c0, 0xbebac99b, 0xacd6cc92, 0x0f2e3602, ++ 0xdf3db3be, 0x527ac611, 0xdfe52777, 0xc3bac769, 0x067aba58, 0xa5edb8bc, ++ 0x63f7d49f, 0x0bfcd0e9, 0x0369ef11, 0x31e26f9e, 0x8a73f5ed, 0x94a44e29, ++ 0xb03bbd72, 0xf7882920, 0xbc5a6514, 0x39bd7147, 0x2a516473, 0xcc993fbe, ++ 0x66d71ff7, 0x0791d2bd, 0x4032e3e3, 0xad17a7f1, 0x1b2ef7e4, 0x0c5ecde9, ++ 0x949b2fdf, 0x3ecb7c4e, 0x9d47d983, 0x3d2fb963, 0x8ff14594, 0xc52f00cf, ++ 0xc8cdbfb8, 0x7e14d1ee, 0x0b2ad0af, 0x6a50eaf3, 0xddee6353, 0x70fbf611, ++ 0xddfb7fa1, 0xf0158096, 0xb7378ea2, 0xa77110cb, 0x98dfc810, 0xb57f1831, ++ 0xa4d5d953, 0x7a018c67, 0x8b29aafd, 0x6e4dbdca, 0xd35cfe7a, 0x4dc32a38, ++ 0x2dd32a1e, 0xd168a3dd, 0xddd71a55, 0x6df57e82, 0xb7be8b0a, 0xb7bcb623, ++ 0x63e3df89, 0xcf1c3fd4, 0xe1d00a02, 0x9a47a143, 0xfc429a5f, 0x8004d0f5, ++ 0xefd0e27a, 0xeff15e1f, 0x25b86505, 0x0523c3f5, 0x1f0fa065, 0x033e7892, ++ 0xbc526bd8, 0xf28c5e7b, 0x2a476b21, 0xc2fd89e6, 0x596502c1, 0xf0391798, ++ 0x1960729d, 0x51ffbdc7, 0xcc317656, 0xaffff71f, 0xe39f6c60, 0x873c56d5, ++ 0x45e07d9d, 0xed46f919, 0x4cf9f7e2, 0x98cd7c93, 0x646ec117, 0xf159df7c, ++ 0x673e6335, 0x8dcc4dff, 0x38c6fdfb, 0x3edc1cfb, 0x74e0e3d8, 0x7a71269f, ++ 0xc8aaf9b3, 0x8a28182b, 0xdb62375e, 0x29f83d4f, 0xde3007ad, 0xf1a611fe, ++ 0x987e2806, 0x03ecbbe8, 0x3ffdd29f, 0xff5dfa17, 0xf3c50a2b, 0x7bf0cb41, ++ 0x6e67e691, 0xf6f1235a, 0x57ec78d1, 0x2f69dbe3, 0xcda07589, 0x70f6e9ca, ++ 0xbc373f1e, 0x8515e841, 0xb3fffd71, 0xa02f99e4, 0x1a7f30dc, 0x88b603ed, ++ 0xb1f14238, 0x93817501, 0x02570bdf, 0x7c378cf5, 0x17d402d2, 0x12d99e82, ++ 0xe7c4edf3, 0x4cd27d67, 0xbe1d7ba8, 0xac9fb197, 0x33d91b45, 0xddbacf80, ++ 0x9db23736, 0xa396af81, 0xe1f31daa, 0x45bef633, 0x522d86fb, 0xe1268a8f, ++ 0x4a7cf787, 0x6b16caf1, 0x7faf3663, 0xccf186d4, 0x1f1b389f, 0x7c0b3ac6, ++ 0xf03cf65a, 0x0e7170c3, 0x1ea09f1f, 0x3d44390b, 0x17ab71f0, 0xe56421f8, ++ 0xf89ef875, 0x5c6d6423, 0xb1f8e780, 0x85fd0ade, 0x2c23bd52, 0x3f9ad750, ++ 0x15723d6c, 0x1ff68dd6, 0x873efb52, 0xcd46edce, 0x1ff4879f, 0x7750ebac, ++ 0x5e15d546, 0x1a5e7667, 0xf83babf3, 0xd70fe529, 0x88fce5ef, 0xe279c378, ++ 0x8eb879bd, 0xb98fd19d, 0x6f14dd9a, 0x3afae42e, 0xe333e26c, 0x8b16ea7c, ++ 0xe945259f, 0xf58ccfd9, 0xf45a634f, 0xb1c7bc79, 0x7f54465d, 0x8b9d7e22, ++ 0xa014def7, 0xa54037db, 0x67cd6f11, 0x6cc72a1e, 0x0720739b, 0x15bb2f9a, ++ 0xa4a616f4, 0x47dfa914, 0xe311983d, 0xe64cac37, 0x5c9cd3fc, 0x94325572, ++ 0x47ae25eb, 0x27214e03, 0x9bd90a3d, 0xbd5742bd, 0xe00961df, 0x615b23be, ++ 0xe2b5e7a5, 0xeef5b7fc, 0xdc65fbce, 0x4ac67e37, 0x7935c6fb, 0xd42b12be, ++ 0x79e4f66b, 0xff24599a, 0x33b526b9, 0x3916b273, 0x49f58987, 0xaeff645a, ++ 0x28dd6bbe, 0x6f783fcc, 0xef846bff, 0x08f292d7, 0x51d0babe, 0xfda4efd5, ++ 0xed0bd54c, 0xae0c73df, 0xb5deb47b, 0x78293c39, 0x77e067de, 0x2db11efc, ++ 0x89be671d, 0x4afefef2, 0x3bfee98b, 0xfa003ca3, 0xf18e0bcf, 0x90b04df3, ++ 0x041dcf01, 0xfd0b99f9, 0xba77afbc, 0x5e2dbe10, 0x8a6825df, 0x988d2597, ++ 0xda3e00e5, 0x2dd5ef9a, 0x6dbb1893, 0x3b36b8cd, 0x555bf518, 0xbbe462fd, ++ 0xb62692db, 0x38d75f21, 0x0577ca64, 0x7790f10b, 0x804fc88c, 0xda9ace7a, ++ 0xf7efb859, 0x0a82ed95, 0xb0d1fdb3, 0x806bef9e, 0xfc8a505d, 0x80f48f53, ++ 0x4ddec5ba, 0x4b6f7fe7, 0x322fc262, 0xa41c579f, 0xce3c8deb, 0x8b73be7b, ++ 0xe8936755, 0x7f51a27c, 0x7a4dc92d, 0xd0094aa4, 0x59d54f3e, 0xfc6b9d17, ++ 0x4dd8e3fa, 0x8e8723e7, 0xc61c11a3, 0x7191b538, 0xbed57f48, 0xe1fc8076, ++ 0xf6189703, 0x59e297ad, 0xbc8877cb, 0x38778713, 0x55f943f6, 0xb3d01f44, ++ 0x6f257780, 0x40501eb0, 0xd41c1cef, 0xcadb333b, 0x51be9172, 0x49ba687a, ++ 0xa015792f, 0x4324c1d3, 0x7e2b7d2f, 0xf698a4fb, 0x7afd46f9, 0xcf0b1f6a, ++ 0xba911c4f, 0x9f2bda1d, 0x08eb06db, 0x8fb39d1f, 0x18cd2fee, 0x9fd47bff, ++ 0x49397fc1, 0xa0028715, 0xfaa60e5f, 0x19fd704a, 0x51b991b8, 0x06571e1e, ++ 0x3a289e1c, 0x75f124e4, 0x25eceaa1, 0xf047fc26, 0xffa2645e, 0xd36e4dbb, ++ 0xed92f07e, 0x98f9d077, 0x2c5e831c, 0x6d7bcfc0, 0x03ed302c, 0xbe387fff, ++ 0x04de1c2a, 0x9dfd9470, 0x1a6718e1, 0x78c7022f, 0x155f7c13, 0x86f5390e, ++ 0xbf6879d9, 0x9ee85b35, 0xc04b4cc5, 0xd3768f9e, 0x9bb2169d, 0xf984b430, ++ 0x9358605b, 0x8091241e, 0xb6bdee76, 0xe45f9805, 0x2511d856, 0xebc9e50d, ++ 0xfe7b466e, 0x17f90a07, 0x9d6edcf0, 0xc3b0aa8c, 0xb141f78b, 0x730edc15, ++ 0xf8ebf857, 0x3fbe6fa1, 0xd5e84238, 0xe0959d02, 0x27f7a13d, 0x192ab82f, ++ 0xbbcf75e0, 0x6ddb01b3, 0x6a9fd2d2, 0x25792663, 0xba4da4bb, 0xf583017d, ++ 0x95a4d3e0, 0x4f0cc764, 0xc48c76e2, 0xb91db656, 0x2e7bde3c, 0xacd767af, ++ 0x8471859c, 0x12ecdde0, 0x8e82a7f4, 0xa401e760, 0x41e69b43, 0x1bdde43a, ++ 0xcbf9c76c, 0xdd6858f7, 0xdb835394, 0xbefd6336, 0x15da0f42, 0x5fae54c1, ++ 0x3a359a07, 0xc9aab467, 0x95f78b9d, 0x75f074b4, 0x0ceb7360, 0x9578c25d, ++ 0xf7c15806, 0x68f9c6d6, 0xf7bb4f6f, 0xe5fb3691, 0xed3cc7a8, 0xcf5e74c3, ++ 0x8d75c6ca, 0x8927dbe5, 0x05aeb0f7, 0x9e8e599b, 0x7c17a91a, 0xe908d60e, ++ 0xbcda4799, 0xdcefd8b9, 0x3fbfc66a, 0xad8b7184, 0xbf887a83, 0x3c09a777, ++ 0xe9f31d41, 0xfbc8e6e4, 0x13ef9832, 0x953d728f, 0x7207fd0d, 0xb2013e69, ++ 0x342ac61b, 0xed8c071f, 0xe2e3ba82, 0x0bf7da7c, 0xe07d783a, 0xd8defe62, ++ 0x5ac751af, 0x21c6bf68, 0xe6c8e1f0, 0x2ff055ed, 0x382fe8c3, 0x29c7ee35, ++ 0x57cc32de, 0xcff198d3, 0x6293e3cb, 0xef09233f, 0x47e28807, 0xda32eb7b, ++ 0x318fb6ac, 0xb9abd3ef, 0x3cc2bae6, 0x92dfd10b, 0xabf3f375, 0x3e3c4592, ++ 0xfee3658d, 0x4fc5814d, 0x2c45d8f6, 0x17f6c160, 0x979520b3, 0x9f3d30b2, ++ 0x3ea87ac0, 0x05a64311, 0xcdc9bc78, 0x8f31640f, 0xe663768c, 0xe4ae237c, ++ 0xd9f6859f, 0x571164cc, 0xa1fe86cb, 0xa99cfa5d, 0x357e1fb4, 0x9378c7be, ++ 0xb303cc6f, 0x8f17e4dc, 0x8cf7b68b, 0xe7b0d2f5, 0x3dcc042a, 0x7b5c52c9, ++ 0x2aefb0c1, 0x5fdebc1c, 0x0d9012a9, 0xfd8210b8, 0xb0b1dfd7, 0xc62ce31c, ++ 0xe2295efa, 0x4a1b959c, 0xab7ed132, 0xfc9f3fd8, 0xb992bba0, 0xfd78b6fd, ++ 0x013fd51c, 0x202d87cf, 0x8e22a0bf, 0xd4f976fd, 0xc896fd88, 0xdbb5885e, ++ 0xe88bae82, 0xaac02b1e, 0x3a45ef17, 0xf5af7568, 0x33dc7ca0, 0x9829e486, ++ 0xa15255e4, 0xf6e65c1e, 0x97dc30b4, 0xf1ba8770, 0xe8938ffd, 0xb8a0e4de, ++ 0x1f30695f, 0xd2affbc0, 0xc789c917, 0x3807cd8f, 0x2dfdca98, 0x9207fe63, ++ 0xf4851fde, 0xdaf02b98, 0x85dc96a3, 0xbd51e974, 0xd2acb173, 0x748cfffc, ++ 0xf0a73d5c, 0x422c5981, 0x867cd8bf, 0x1afb04f4, 0xaf7e8957, 0x86d3b6c2, ++ 0x73a0cdd2, 0x5cb5ddac, 0x13a0e7e2, 0xace1abcd, 0x23e7a4c5, 0xa4a854f7, ++ 0x3f84fbe7, 0xbfcb3872, 0xe9204afe, 0x215bacd5, 0x7bf717fe, 0xaa0148b4, ++ 0x73159d5f, 0xb3c88cbf, 0xfb7a1729, 0xe33f9877, 0x9e3befc2, 0xd73f42f7, ++ 0x7c82a0b0, 0xd9e4587f, 0x44a4bf80, 0x0946c9fb, 0xece49afd, 0xfd736e9b, ++ 0xfae6719a, 0xeff13db7, 0x49b7bbc3, 0xddd7ed37, 0xe327e78b, 0xf08f65e0, ++ 0xbdfabe8b, 0xcf362c46, 0xbdd20f71, 0x494bf30e, 0x639e79be, 0x879f83b2, ++ 0xf077ef08, 0xba9a16f3, 0x0d034309, 0x1fa257e0, 0xf784ec9e, 0x899fb9e3, ++ 0x5b24d4f7, 0xbdc8fb79, 0x9f6e3c44, 0x7112cbe1, 0x9cd64f03, 0x6e1e5f09, ++ 0x4f2857f4, 0x230f615a, 0x9af9227d, 0x4e31fbe6, 0x8c59bf27, 0x73e611fa, ++ 0x8c01c623, 0x9f31a878, 0x739f97bf, 0xc44f88af, 0x64aeedd2, 0x20b4b76e, ++ 0xd8e2a39d, 0x77ce82ad, 0xdc00dca1, 0xeefb8a1f, 0x947c921f, 0x016995e7, ++ 0x59882c6e, 0xf2eda3e7, 0x65ada7c0, 0x7870cf18, 0x42bc518e, 0xa92de5d8, ++ 0xf787fdfc, 0xe7e8e548, 0xffd60db5, 0x86f186da, 0xff518736, 0xf25bd50b, ++ 0x47c60e58, 0x1f7f0ebc, 0xe779efe2, 0x67bc6143, 0xcd9765b7, 0xe907f94d, ++ 0xf9e26fdd, 0x36ddcc95, 0x8cb5df8a, 0xacfb4f3c, 0x2c79f698, 0xb09a7284, ++ 0x4fb42e7d, 0x5d67b48f, 0xb473a649, 0x667e5f86, 0x35253b8c, 0x4a31fe8e, ++ 0x74c5836d, 0x255add6f, 0xb17d476c, 0xb3f3c3d6, 0x6832fa22, 0x1b6b278a, ++ 0xd9476940, 0x33df788d, 0xb1555906, 0xe29f7c8f, 0x94f5a3d1, 0xd8e9f566, ++ 0xb939d5af, 0xec61eddb, 0xca7ad69f, 0xc16b77d1, 0x2bb060bc, 0x55acb5f2, ++ 0xd5a75788, 0xe9e70473, 0x98dc5a74, 0x59acdb27, 0x745a9e48, 0xb6bde53b, ++ 0xc8ead74a, 0xcebf46b7, 0x30e0851e, 0xe689e5e2, 0xcb9f80a9, 0xdf35cfc8, ++ 0x37bff593, 0x1d78469e, 0xc1d72f72, 0xd1b88fcb, 0xa16a99ae, 0x4b252e7c, ++ 0xc9c4ef63, 0x6f1c1ccb, 0xee171283, 0xfe0676d8, 0xdad9d213, 0xf47a42e3, ++ 0xcdf7f169, 0xf5f49afd, 0x312de4f4, 0xc7f9c5fa, 0x61f030c2, 0x9df3d49d, ++ 0x7f923c82, 0xd7fd06bf, 0x2ae33a4f, 0xa19e9375, 0x9f4352fd, 0xdb2f68b7, ++ 0xf9b0be79, 0xfc44b63e, 0xfac5e067, 0xf3c622e2, 0xfb0cbd19, 0x9c1e1f3b, ++ 0xf947d852, 0xb8949331, 0x29e0a1fb, 0xf0a9f298, 0x7ce8ec7e, 0x6be4169b, ++ 0xcabe5380, 0xa17b476f, 0x1dae6b39, 0x14abebe3, 0xffb875f7, 0xd822f03d, ++ 0xcfdc6e3d, 0x518fcb35, 0x7bfb8bb6, 0x712cd3ef, 0x8bb575ef, 0x9f63e47b, ++ 0xda7d0487, 0xe74e5ff7, 0x0ff112e4, 0x5c3e6358, 0x8ac5ec47, 0xcb81f78e, ++ 0x23af0e56, 0xf4621d81, 0xf75f089b, 0xfbf077ec, 0x83d8c7bd, 0x8ec59eb8, ++ 0xf6e786d7, 0xc01b7de0, 0x2e7ac013, 0xaa6dbf1f, 0x8743f142, 0xa3d9893b, ++ 0xa6335bda, 0x68cffe12, 0x908678e9, 0xc63f21b5, 0x53c0cb81, 0xbd7cb340, ++ 0x0c7f3f7d, 0xb57c8e5f, 0x8a25f910, 0x4da17f2f, 0xb897ca1b, 0x105e2006, ++ 0x36fbe8fe, 0xe26319ad, 0x84385bde, 0xa6f8633f, 0xf3a30678, 0xdca1c379, ++ 0xc4877d04, 0xa8753a3d, 0xab9fc1cb, 0x3a6359bd, 0xae25fbe8, 0x4f088392, ++ 0x7e01f771, 0xc194264e, 0xdf1407ef, 0x71eb8ec7, 0xe3d275f2, 0x394ca9d4, ++ 0x7f1a7de6, 0x9dd421b7, 0x8a73c6e4, 0xbff8b4a1, 0x66a1f163, 0xe21d0bf8, ++ 0xc50f419c, 0xc5f68db7, 0x66ef30b7, 0xb1250f28, 0xd5d83b76, 0xcf22686f, ++ 0x888bfd81, 0xc2e083ab, 0xfafdd738, 0x308fca52, 0x68087fe6, 0x3333ed86, ++ 0xf9248a7b, 0x1b6dd06b, 0x568bdd33, 0xba21ef67, 0xdff8b7cd, 0x1c34fc43, ++ 0x7ac4c9eb, 0x6453e5e8, 0x70b467a7, 0x4f6069fb, 0x4397f932, 0xf04cd3e9, ++ 0x61cd9ed5, 0xe9436181, 0xc984ab56, 0x3b3dae4e, 0xd0a6058a, 0xb4f603bc, ++ 0x6cebfbc8, 0xff474d8c, 0x84f1cec2, 0x8f4789f8, 0x1b5c8497, 0x74bd00f4, ++ 0x03d053a9, 0x6f4834f1, 0xaf487f71, 0x6dee97b8, 0x9d337f61, 0xbdc675fb, ++ 0x0e176f44, 0x3dd3d3ee, 0xef0eb54d, 0x07df7803, 0x7e532a3b, 0x7e52a2df, ++ 0x9b22deef, 0x05e30537, 0x4b2f7e8b, 0xc62fb4cd, 0xc0b17ef9, 0xd0f32f5f, ++ 0x5ac0f5f9, 0x63efce87, 0x791bfb32, 0xf94c950f, 0x74a9e61d, 0x1657a4c9, ++ 0xec016a96, 0xe67bb8b7, 0xa45e78d3, 0xce993db2, 0x86fa2f2f, 0xf9fa04e7, ++ 0xb8701e8b, 0x964277f1, 0x925f96bf, 0x7f2efd0d, 0xf9474f30, 0xcbe15e4f, ++ 0xbb187bb2, 0x472c19d6, 0x5a4da93f, 0xc49a40b0, 0x6cff3740, 0x95d7c615, ++ 0x77df4bcf, 0xb3ae7d40, 0x25c6156b, 0x50f18d7e, 0x94f6d3b2, 0x14f93fa3, ++ 0x5fc469fe, 0x1d4f0701, 0xc3b888b1, 0x40caab0b, 0x11925fe5, 0xf30068b2, ++ 0xb0bdf703, 0x66c1cf0a, 0x592779a6, 0xbb7fbc60, 0xfb72a5ef, 0x03f70055, ++ 0x00de3e13, 0xdf737fef, 0x017d90ff, 0x1fdf1274, 0xef852f2f, 0xf518672b, ++ 0xa7ac54f7, 0x9d88b327, 0x3be41d38, 0xda3e323f, 0xb8c1a185, 0x32f2e9c8, ++ 0x99edf6f8, 0xf40aa58d, 0x0fbef27f, 0x44078d57, 0x44beb65d, 0xa7f8c2f7, ++ 0xe688fbef, 0xc7e2321b, 0xd1564f81, 0x1ff3173e, 0xc57bc2b4, 0x476d5d25, ++ 0x37cc3a55, 0x0ff98749, 0x3d5c2f6b, 0x90d7e47b, 0xce43718f, 0xcceb5d5f, ++ 0x8c393920, 0x82b51d28, 0x283777df, 0x6f9cb9df, 0x7ae3eb07, 0xa309f9f8, ++ 0xa1ebc59e, 0x0bebe3bb, 0xc3d70a57, 0xeff8a4a1, 0x043d0a97, 0x9c530ef8, ++ 0x38392bae, 0x3fa22f36, 0xd3ec7e40, 0x71d69e49, 0x847201fd, 0xb7206679, ++ 0xb2fbfb71, 0xf7121af2, 0x6f148761, 0x86cbfa32, 0x4bf9031e, 0x4edc71c6, ++ 0x2b9d69b7, 0xfa485eee, 0xce9703f5, 0xfc7371e1, 0xf59a9464, 0x1777b308, ++ 0xabb1fb46, 0xe66f5c9c, 0x53ec6a5d, 0xfde8d584, 0x4a3be589, 0xb63e79ce, ++ 0x51c1e316, 0x1e6476f6, 0x0f9fe465, 0x73fa17e9, 0xe33dfe8b, 0xfa5f042f, ++ 0x4e95f079, 0x3cdf3af8, 0xe399fd23, 0x53fb4309, 0x8751fec5, 0xe3511d79, ++ 0xc08cf9c3, 0x12dfe21f, 0x852b3fa5, 0xcff6353e, 0xbc5f76fb, 0xf45e4d79, ++ 0x25bcfcb8, 0xfc69f7d0, 0xe8009ebd, 0xc563d453, 0x6c1af78a, 0xa69ddc5f, ++ 0xfc0efda3, 0x4df82ad6, 0xe8337e41, 0x2c6b4a1c, 0x93aef9a1, 0xec71cdf4, ++ 0xbfc190be, 0xd65efc1d, 0xe5f8b7e1, 0x19f05105, 0x0ffa1efa, 0x72a7fe89, ++ 0x90747e7e, 0xf9456f9f, 0xf329fe11, 0xdcbdd0f4, 0x825ff0b1, 0x6a2d3732, ++ 0xa0e5dabd, 0x6f03173c, 0x0dff955f, 0xe136a17b, 0x3822e4ba, 0xbb0b1f87, ++ 0x08aed0dc, 0xd9f101e5, 0xafdd0ef9, 0x1992ea18, 0xf38f755e, 0x6c51bd46, ++ 0x795649e8, 0xb218e678, 0xd97a225b, 0xa18bf64d, 0x7b76c337, 0xad3efda4, ++ 0xf515bcb2, 0x3d9fb8aa, 0x3e2d065d, 0x3bc70239, 0x4e3ebe4e, 0xf7b8b3f7, ++ 0x39a87edf, 0x79887f39, 0x2662bc3c, 0x2c509bdd, 0x3de9d3d6, 0xbc9f8a01, ++ 0xbeb131ac, 0xeb187c72, 0x9eb675f5, 0x41f38b9f, 0xea347e26, 0x5bd49760, ++ 0xe3fd220a, 0x7c51b9fb, 0xcfe0b9ff, 0x5d7cfa58, 0x087804fd, 0x08661e20, ++ 0x1d4067bc, 0x0a60afef, 0x2f985fac, 0xacf34732, 0x5b828bc9, 0x4338fae3, ++ 0x763d70b6, 0x1f48b91e, 0x78efc4c6, 0x239e4938, 0x4b76e0f8, 0x7de38ba1, ++ 0x78a73893, 0x427202c8, 0x9e7c31fb, 0xa9b3bb7d, 0xeed15cdf, 0x3797a56f, ++ 0xc3177c89, 0xd5fbac5e, 0xf8664d88, 0x763f7f79, 0x1f14bc71, 0x3b424ef3, ++ 0xf34fac66, 0xdc507fa0, 0xe600f73d, 0xc5ee141f, 0x7c23e78b, 0xe5c9d85e, ++ 0xe04bb814, 0xd1edc5e5, 0x39734efd, 0x9bfb390d, 0x18f0a3cc, 0x3971e313, ++ 0xbb97da37, 0xcc0e3e34, 0x54f886cf, 0x28d47acc, 0xf87076ff, 0x9639e00e, ++ 0xaa07c05a, 0xa16f036d, 0x3b7705ce, 0x318f8e50, 0x5f71ca0f, 0x04cb02e7, ++ 0x10262ba4, 0xc3f4a3b9, 0xc30f3e7a, 0xecbe050e, 0xe79cbe44, 0x8cfd491a, ++ 0x1e4de63d, 0xa2c7ef0f, 0xef1534dd, 0xd10670ab, 0xf2e2588f, 0x7c85d8ff, ++ 0x2940c371, 0x93eb77c6, 0x511d9b1b, 0x77db07cf, 0x63e27b41, 0xe1013cbf, ++ 0xf7e33efc, 0x40f98b8d, 0xc60d80d3, 0x4e4153ab, 0x461ea80b, 0xde5485bc, ++ 0xfa56e07e, 0x2f560a85, 0x60ddfbf3, 0xf886befd, 0x1a4b65f3, 0x24fd17d2, ++ 0x656b93b4, 0x8fe52e5f, 0x7079b70d, 0x83bf001d, 0x8390fdf8, 0xffe80e29, ++ 0x4f512805, 0xa76f92cf, 0x0ab33f73, 0x3037da24, 0x5bd47bfc, 0xf75d27e8, ++ 0x47e2648d, 0x631dd9f6, 0x919ade30, 0xfd04e9cc, 0x763f45d8, 0xfc88e4fb, ++ 0x8ba8e7fd, 0xd631dfc9, 0x449243b7, 0xeaba1cfd, 0x512dcdd2, 0x87f6107e, ++ 0x3490fffa, 0xe476f727, 0x91c7e17f, 0x591e987d, 0x995ed177, 0x3dd345ac, ++ 0x19ebe020, 0x6d147c85, 0x3a7da28f, 0x59b2cf68, 0x3d06afab, 0xceecd97b, ++ 0xde8d5e30, 0xeafab81c, 0x59bfa0bb, 0x003acf60, 0x2f82ed0f, 0xdff1e50e, ++ 0x56343d0d, 0x0fc07ba2, 0x37c7f927, 0x3271916a, 0x5321bc45, 0x266727e4, ++ 0x853f32f1, 0xa29dc1eb, 0xf6c36e24, 0x89f1f8ae, 0x5ffef15c, 0xac7f5c2c, ++ 0xc79f8929, 0x6bebb4fc, 0x4bc699c6, 0x3f3cf7b1, 0xf710caed, 0x169e533c, ++ 0x109f5f8f, 0x21cec1ed, 0x2aec453a, 0xb0dcce7e, 0xe6f38d43, 0x07be4975, ++ 0x2af42e28, 0xfc7155f8, 0xb8b83fc7, 0x135ef07d, 0xefd673a3, 0x42f3b9e2, ++ 0x584c7bfe, 0x41f2ba5f, 0xcd5d6f3a, 0x5e3fb482, 0x9d3645bd, 0xd958aee7, ++ 0x59b7bf46, 0x5b989411, 0xc7ccbf42, 0xfc0b65cf, 0x551a512f, 0xfc2f3dfc, ++ 0xefe8a67d, 0x894e36aa, 0xeb95a7b9, 0x7f6eaf8b, 0xf7ed34ce, 0x394bf447, ++ 0xfdb179d9, 0x6b1cfc1a, 0xe4ddbe87, 0x5f379d36, 0x396c72b8, 0xede59cdf, ++ 0xcd0f3117, 0x817b516f, 0x1dfc7e19, 0xc313cba9, 0x2c8f7837, 0xb8819dd8, ++ 0x07a4aa70, 0x036fe78d, 0xe75103fe, 0x1c9e17ea, 0x776c7043, 0x2f91fbf9, ++ 0xb3247022, 0x364e2980, 0x9d8eff83, 0x8119c783, 0x5ae7024f, 0x5f29adef, ++ 0x24bfeed7, 0xf45fdd81, 0x8bfbb577, 0x967ae16f, 0x2c6c4875, 0x662de5f2, ++ 0x45332c3b, 0x929e72e3, 0x850f731c, 0xe0cc7b88, 0xdfe182f6, 0x2d67850d, ++ 0x19597f7d, 0x90ec17ef, 0x1e5ec2ed, 0x7fe5edcf, 0xbf97b41b, 0xa27fe517, ++ 0xa015265d, 0x19dfe33e, 0x77943bbf, 0x1fca65ea, 0xb70a7efc, 0xdeebe75f, ++ 0xfda0528b, 0x3eaf915a, 0x7bf17c64, 0x83ad6b44, 0x3f94d2fb, 0x3bf3e9b6, ++ 0x25f7f05a, 0xfd807606, 0xe4b07a0f, 0x1ee9e7d1, 0x6fbbe32e, 0x5d1ce8af, ++ 0x269bf801, 0xe1eb5ce8, 0x27ad61f6, 0x7e818eac, 0x5c396a72, 0x25fb9db9, ++ 0xdcbbea25, 0x1beede2a, 0xfc535629, 0x4bd44caf, 0x1efcdc52, 0x34b0aab0, ++ 0x6ce5da06, 0xd82922dc, 0x131efe1f, 0xc8d393c0, 0x43bfd182, 0xdb953394, ++ 0xba9edf35, 0x3e345a49, 0xcb768782, 0xd03af19c, 0xd9333dad, 0x13cceb83, ++ 0x885bffba, 0xc237da87, 0xd97f5f94, 0xda0add1b, 0xef74bbed, 0x11192935, ++ 0x3d65b83c, 0xe4d1d707, 0x1d9c3837, 0x5f317e83, 0x94e7685f, 0xdb99bce8, ++ 0xc23b327d, 0xeb485db8, 0xe3dde654, 0x976bbf4c, 0x89d62699, 0x7ca7e64c, ++ 0xd3b59962, 0x38ca3bbe, 0x5ddd5fee, 0xb1db99b8, 0x1566ff9c, 0xf3e0b6f8, ++ 0x9e2fc359, 0x1443f78c, 0xf82b0dac, 0xdabfd57b, 0xbbee3f18, 0xe61fe054, ++ 0x33f38151, 0x7d3e71e6, 0x26b3b461, 0x72184f88, 0xbe3b3c92, 0xfdd8c1df, ++ 0xa68f5e9c, 0x41ee977f, 0x77e9556c, 0xeffc0cc8, 0x21777dd2, 0x9b9d393c, ++ 0x188dc224, 0xe1db88cf, 0xb7d79473, 0xc039f355, 0xc560fa84, 0xd115d1ce, ++ 0x2555a0fa, 0xc98a6cfa, 0xfbec370f, 0x72fe2275, 0x23b5f75c, 0xd6bbeb7d, ++ 0xe9677c51, 0x317bfe16, 0x8173f109, 0xb8aa93f8, 0xb3ced75c, 0xc94e3e53, ++ 0xbfd10aa3, 0xaeff95a6, 0x1df6ed67, 0x92b3ae3c, 0xd46f5079, 0x2a90ee76, ++ 0x27efe3c6, 0x471690ee, 0x6d4473e1, 0x2fa7f290, 0xc7f21a72, 0xbf2c59f5, ++ 0xed189c63, 0x6e0ec394, 0x6896f5b7, 0xed1fdc01, 0xb16bfab5, 0xb2766f5d, ++ 0x0c80f307, 0xe3b0bffc, 0x7037ca6a, 0xb185b4ee, 0xce6cb76c, 0xf6bb43b2, ++ 0xf20f544b, 0xffdd2ed5, 0x4d25e20c, 0xfbf085f1, 0xa7a774d4, 0xdb75be19, ++ 0xbb5d64d8, 0x165c3c70, 0xad971fc3, 0x3ff372e4, 0x4e487fa8, 0x9b9464d8, ++ 0x7fb85217, 0xf913f601, 0x7cad8757, 0x87193b1e, 0xbbc53f37, 0x48f7f897, ++ 0x539b8d1a, 0x5e30961b, 0xa76a779d, 0x845a7ce9, 0xbe07bcbf, 0xdd83bf0c, ++ 0xd5bf22a7, 0xf253fd08, 0x9de916e8, 0xa68fb828, 0xce5f04c8, 0x8d4be076, ++ 0x66ffefde, 0xfba7b53a, 0x4bb6733c, 0xbc0d5df4, 0x67a51c5f, 0xd1c4798c, ++ 0xbf10c737, 0xcfdd1bda, 0xe6137d73, 0x6f0145f1, 0x0b8f3d2c, 0xcb0e57bd, ++ 0x03573d35, 0xf3df70e3, 0xf5127e70, 0xac7fc867, 0xe14f1ebc, 0x49ea23f6, ++ 0x59f1468b, 0xf80d23b2, 0xf5f3768c, 0x08532799, 0x8784dd0f, 0xcd0a8dba, ++ 0x1bea9667, 0x3c947b73, 0x3bfa2c7c, 0x749bf370, 0x5ffad35f, 0xac7e251e, ++ 0xeff890eb, 0x551c76e3, 0x40f8c46f, 0xed1949e0, 0x89b86bca, 0xf7121ec0, ++ 0xe2135da4, 0xb42eb8fa, 0x337bc143, 0x3bcd3e0d, 0x57ee8075, 0x31b4ebab, ++ 0xff8083f4, 0xc5fa433e, 0x1f81a9f2, 0xd2c6df43, 0xcf02fff3, 0x0085c0de, ++ 0x000085c0, 0x00088b1f, 0x00000000, 0x7dd5ff00, 0xd5947809, 0x677df0d5, ++ 0x2613324f, 0x930842fb, 0x840a2584, 0x10424849, 0x58424994, 0x28027164, ++ 0x0b61b641, 0xb4a9b201, 0xcff6ac7f, 0xbf229060, 0xdd6d1bfd, 0xad101dad, ++ 0xc1410bad, 0x08380c06, 0x236d5622, 0xda2b15a5, 0x27b22951, 0xfe2d7e8d, ++ 0x9cff95fa, 0xcccdef73, 0xc58666fb, 0x17cf3ed2, 0x7dcb9f1f, 0xb9ce7eef, ++ 0xce7b9ce7, 0xf31877b9, 0x58c49632, 0x58c664cc, 0x35effc21, 0x416706f9, ++ 0x33593cca, 0xc6b58c6d, 0x2b6e45b3, 0x74fdd963, 0xf9598f54, 0xcf3b34f7, ++ 0x6df02bd7, 0xec3b630c, 0x117b589e, 0xee391563, 0x454fd82d, 0x05b3944a, ++ 0x553ac9fa, 0x912586f0, 0xe2a73ab1, 0x89aa828c, 0x70dfd0e5, 0x343b47f8, ++ 0x0271c34e, 0x18239599, 0xe37f80bb, 0x6b632983, 0x92fe8319, 0xccf8f812, ++ 0x71c4c810, 0xeff1f319, 0x1581b67a, 0xd867db04, 0xf81f341d, 0x59dfe7ee, ++ 0x70447bb6, 0xb29e72fe, 0x8576c9ff, 0xaba0d9fa, 0xf9876e1c, 0x718e486d, ++ 0xa7a7c0b6, 0x76c19eed, 0xa8f6a7e8, 0x8dc38fdf, 0xf069da3e, 0x871d7158, ++ 0x6fe80e4c, 0xc9ba93d7, 0xf2ffc83e, 0xb2a50349, 0x89bb42bf, 0x1bb42bfa, ++ 0x970f1e68, 0x3f4abd5a, 0x68b88d48, 0x7c5ad748, 0x5bc7805e, 0x541e2773, ++ 0xddb318f2, 0xfa63f26a, 0x2d496ea6, 0xce99bf96, 0xd3a0dfc7, 0x0df98edd, ++ 0xe61958f7, 0x455dd877, 0xe637d708, 0x6a7e12c4, 0x333e4cab, 0x57b3f3f4, ++ 0x5af79e14, 0x59fe0c7d, 0x0cbd99eb, 0x28c4b1db, 0x3f8833e7, 0xcdd37ecf, ++ 0xafef00b8, 0xb1992cf4, 0x39ff8ca9, 0x726bde5e, 0x6da9f7c0, 0x8217cb8a, ++ 0x6db6da87, 0x1eb0a586, 0xb780b463, 0x9e106b80, 0x4d13ee1c, 0x1f151bcc, ++ 0x3f7647c4, 0xa00ba73b, 0xeaf78417, 0xc7eca2e7, 0x0bac7c2c, 0x5b5d7ff0, ++ 0xd0df2a9c, 0x963f669e, 0xc6afcc1b, 0x6c1d207f, 0x679c5661, 0x5ce798ad, ++ 0x5c16e79d, 0x70259d77, 0x2da808c0, 0xf26dd23e, 0x09d1c358, 0x4dd5dfa7, ++ 0x6c721dbf, 0x52ab6314, 0x189a520f, 0x98cce9c3, 0xeb23d7cd, 0xbf78152f, ++ 0xb7685311, 0xf206e90a, 0x4cdb0bab, 0x3eafea0c, 0x407268d6, 0x08cc9d6a, ++ 0x90a3d63e, 0xfbc7435a, 0xec67d531, 0x115f6a7e, 0x0f5136d3, 0x85f8af70, ++ 0x7d616f62, 0x15d327e7, 0x41b7730a, 0xb93c5f7f, 0xc231762f, 0x7a0bdbf7, ++ 0x8deb0c56, 0x0bbdebe2, 0x7bf413f7, 0x380039e6, 0x89a37bd1, 0xe5ef5985, ++ 0x87fcc7f6, 0x6ae78415, 0x2f33fb01, 0x2bf98f94, 0xb9f78bd0, 0xb0c1ce7e, ++ 0xcc2fd3e4, 0x30aff3ba, 0xc65b33ef, 0x3648f53b, 0x9fa26e2d, 0xe728a4ee, ++ 0x449fa066, 0x00ac9b3d, 0xedb6d7de, 0xed0b1d8b, 0xb23f3e4e, 0x1eed0cc0, ++ 0xd4fefb14, 0x8426fa2b, 0xdcbf3dcb, 0xaf96037a, 0x660929f6, 0x5fb9e71c, ++ 0xfa1d33fc, 0x80d2d9a9, 0xcf2d6610, 0x400a6ebf, 0x136f9d3d, 0x3f5cfeff, ++ 0xf93bd63b, 0x203703f4, 0x5ada5bbc, 0xd3d4fca8, 0xc6ff289b, 0xf9eeb72f, ++ 0xd6af507f, 0x7ac4eb1d, 0x4bd95ea7, 0x18f5a978, 0x48deb85c, 0xb6f0fd74, ++ 0x813fb4bd, 0xb1bf69ae, 0x24c7ce2a, 0x3dfa4b5d, 0x6345cbf9, 0xfc828e90, ++ 0x00df7f87, 0xba016d74, 0x18cd10de, 0xb169f7d2, 0x5997577f, 0xfa7a6037, ++ 0x5c2aa8c5, 0x3029bd6f, 0x33e70e24, 0x4f85d39c, 0xedb6ade0, 0x95bd6336, ++ 0x7f3f53da, 0xe98f7d82, 0xe3cfa008, 0x6b50ef40, 0x385185cb, 0x3f044bde, ++ 0x051257a8, 0xff339df0, 0x13e70553, 0xb8d1bc33, 0x3cf9e69a, 0x8755872f, ++ 0xe1af1796, 0x83a5a8f4, 0xa0ab765d, 0xd20fbe47, 0x386657b7, 0x9d980f88, ++ 0xf5f38f9c, 0x5a78d7a5, 0xc6fdf06c, 0x1ea71e35, 0xc4ebb8f0, 0x21fd89a1, ++ 0x655ccbff, 0xaf5fe114, 0xf7a97ed0, 0xba9c695a, 0x39f632a6, 0xb16df7cc, ++ 0xcced925f, 0x81f11d70, 0x0dee9c4d, 0xbcc560cc, 0x44f89ba1, 0xda4e86dd, ++ 0xf85b7537, 0x3ba5993c, 0xda8d9673, 0x0f8baf59, 0x59da03ce, 0xceef94ad, ++ 0xca0465bc, 0xc9156f1d, 0xe689871d, 0x03f24a7b, 0x305bcde6, 0x92dfb822, ++ 0xf883cc75, 0x6a41364f, 0x12a6fce5, 0x2f663ffa, 0x6bf20bfd, 0xf3472699, ++ 0xd29c2d72, 0xf4f978e2, 0xeca51738, 0x3c9504b9, 0xea57c488, 0x561ffe05, ++ 0x5748d502, 0xf6519dde, 0xf5240067, 0x84860437, 0x38a495f2, 0x8273a70e, ++ 0xe4edce6e, 0x4ea6f2f4, 0xbdf5c5e7, 0x26d879b9, 0xf95ae7e4, 0x09b8d4a6, ++ 0x2f80f55f, 0xfe979433, 0x29a1cd7c, 0x986b2f28, 0xfd5bf713, 0x8dcf4176, ++ 0xbeb9e88c, 0xf61972bd, 0x8a713fd7, 0x5ca0af53, 0x7f6264f8, 0xb2d7d7c8, ++ 0xe92fdc22, 0x44ed964f, 0x8576b2bc, 0x8d7cc60d, 0xbfb63b7b, 0xa9ceb131, ++ 0xb5b942cf, 0xf502d539, 0xa62dcc6f, 0x700f0ff6, 0xde7f6294, 0x7aeb460a, ++ 0x7921e8d8, 0x30da70f4, 0x7aabca27, 0xa25cbacf, 0x13b44727, 0x70c799cb, ++ 0xf7afd63b, 0x951b67ce, 0xa770fb30, 0x5f72a2e2, 0xda0a2f8c, 0x68576d4f, ++ 0xf3b7d49f, 0xc256787d, 0xcec6a647, 0xb9de3885, 0x55e6661d, 0xd6f27482, ++ 0x4e5c49ce, 0x39266abe, 0xc5d9ba79, 0x7ad1073e, 0x0979c84a, 0x642fd5c7, ++ 0xb33f68e9, 0xc79c6659, 0x568f3152, 0x71fbe723, 0xdce78f82, 0x2391e7cf, ++ 0xa71394f0, 0xc849a913, 0x8fbe56af, 0x943cdeec, 0x78c56763, 0x1648e7f8, ++ 0xae860a72, 0x3a27e65b, 0xf7817daf, 0xe5766897, 0x074211df, 0xd2d1bf52, ++ 0x971c5953, 0xee4fe937, 0xa4199057, 0xb553393f, 0x61ac6f4f, 0xe75806fe, ++ 0xfcea4f8d, 0xef48f3e3, 0xf1f895b9, 0xacdb135a, 0xa26fedf4, 0x82457f98, ++ 0xf9415f3b, 0xfa4ac733, 0x8b3eef43, 0x50a2e976, 0x9c502b0f, 0x770ab42d, ++ 0x9dea0ea1, 0x1139b648, 0x1ce3d36f, 0xdea5f561, 0x6e3d1af6, 0x8f37ab5a, ++ 0xdae94365, 0xe7842ae8, 0x2c9d209b, 0xed0eced8, 0xe6f25ea1, 0x246f4fb1, ++ 0xfd42d37e, 0xe5d9c496, 0x011b0afc, 0xee39493e, 0xd8be5c35, 0x73d6e19c, ++ 0x37d1f04c, 0xd7cc2ce6, 0xb6ccfd21, 0xd9f87ed2, 0x4e12ca6b, 0x70c8206f, ++ 0xfef879df, 0x9e3fb060, 0x923d1071, 0xe8df541e, 0x47a785f6, 0x41ea5fbe, ++ 0xfa528a2f, 0x64cc63d2, 0xdf91c7ce, 0x72a1ea84, 0x8ffdca7f, 0x3c39df7c, ++ 0xff72b748, 0x3f3eee5f, 0xf0fbe467, 0xe91fac1c, 0x77be97bc, 0xb8defa71, ++ 0x9421f616, 0xd87d846f, 0x0fb7c212, 0xffb4bc98, 0x1347640e, 0xc9b81d7e, ++ 0x3a78ef21, 0x48fd87c6, 0xddb4f97e, 0xf21c577d, 0xaf6fcdab, 0xfc15b227, ++ 0x7dd77ead, 0x37a62e43, 0x3fbc0c59, 0x50d7ec0b, 0xb800b1fa, 0x7a94056d, ++ 0x34c7cf91, 0x9920f5a9, 0xe5c7143e, 0xfbd677cf, 0xe9031572, 0xb55f022d, ++ 0xb843cf3a, 0x80fbd40e, 0x13665822, 0x5192fbd7, 0xd89ca066, 0xfd43e31c, ++ 0x79993936, 0x1f330e5e, 0x12dfd8af, 0x4fff52af, 0xb7f5e58e, 0x65fd71c5, ++ 0x4bb7a88b, 0x0ae721a4, 0x9d0e0fda, 0x8fa653e7, 0x3b644f2c, 0xcb951798, ++ 0x4b9ef4f9, 0xc9be7c2c, 0xbcd90cf7, 0xc19f0431, 0x014d757d, 0x7ee739e2, ++ 0x358961bf, 0x6b948e38, 0xf9c1fa5a, 0xf5c3fca3, 0x5c8f0e54, 0x38af75af, ++ 0xb9e8695f, 0x4d6de853, 0x33d78c71, 0xf68bfffa, 0x86366de3, 0x83901efa, ++ 0xd5e6012b, 0xdf2867b0, 0x43ddb947, 0x04a0fdb0, 0xb43c7c4f, 0xec413d1b, ++ 0x133ef813, 0xf3037cf5, 0xef11e39a, 0x04205f46, 0x4f109bcf, 0x66cbbf50, ++ 0x9f61eaf1, 0x3a782714, 0x6f3c60e3, 0x51fa7319, 0xf800fcce, 0xe65bee09, ++ 0xd37e422f, 0x08b102c0, 0x3d5a7fe7, 0xf57e8987, 0x0e58439d, 0x90255ff0, ++ 0x891fdf87, 0xee9ee7e1, 0xa1bef5b7, 0x4b1ecf30, 0x858effe0, 0xc9acf779, ++ 0x9fa17a71, 0xb47d778f, 0xede823e3, 0x85e61d93, 0x7ae0b04f, 0x8b3a2deb, ++ 0x3f982121, 0xb6aab0a7, 0xb8f97c30, 0xf9c363c0, 0xfa85e674, 0xdd32c0cc, ++ 0xe3e7d700, 0xa1bbfc1d, 0x562a84db, 0xe64cf9c3, 0x63e87d05, 0xd709ab1d, ++ 0xce78c4cf, 0xd1c3b6bf, 0xd4f95c32, 0xb7ffce78, 0xd6fdf367, 0x21f149bd, ++ 0x5a69ac1f, 0xec3d37fb, 0x36359aff, 0x8c50a53f, 0xdd8d567a, 0x21e5d7eb, ++ 0x33fe00df, 0xdb3bc092, 0x6f941c52, 0x0e30cf50, 0x0385ed61, 0x25bbf027, ++ 0x6d2d3e42, 0xe46beb7f, 0x66063527, 0x2cfd0719, 0xf40fb8b3, 0xac2fa287, ++ 0xbd9162cb, 0x8eef7f57, 0x293f9464, 0x5c4d5bf3, 0xa3b04e6e, 0xa6b8aa7e, ++ 0x5cc42fe9, 0x90321f4c, 0x06784b1e, 0x778d6cbc, 0x7ac3c747, 0x2463f7e7, ++ 0xc1dfe7ef, 0xffac91f9, 0x5a4f9096, 0x0224f8fa, 0x6509ec1e, 0x5bfe23af, ++ 0xd489dd62, 0x55671def, 0x129ceb7c, 0xa409f678, 0xce6cdb9f, 0x99777867, ++ 0xcefa10ee, 0x7d5ff017, 0xea78475e, 0xd21cefca, 0xda748594, 0xc001f99d, ++ 0xd987757b, 0xfab2f48e, 0x2cf089bc, 0x0cd67ddb, 0x30486e0c, 0xa0c4e4bf, ++ 0x5aee7889, 0x11eb9cca, 0xc4374bef, 0xdf086f30, 0xe9154542, 0xa33cfea3, ++ 0xbc74967e, 0x5de10475, 0x9d10086f, 0x0958b12c, 0x0de7f58f, 0xc1b60f34, ++ 0xdb202678, 0x889fee03, 0xf5c48d75, 0x2e347f79, 0xf830f8ee, 0x69df0298, ++ 0xfc229efd, 0x4aeef48e, 0x4777a50c, 0x578078bf, 0x0e97a983, 0x3d1096dc, ++ 0xd4d86587, 0x9b78eff8, 0xe2ccbff0, 0x5ebca131, 0xa47382ee, 0x2fe4f11e, ++ 0xc50f0fb2, 0x85fd38f7, 0xef8f9761, 0x3fafb174, 0x87fd0136, 0xe35387e1, ++ 0x5e797f39, 0xfbe74bd6, 0x564ce3e4, 0xd7a632f3, 0x3eed0a42, 0x02f916ce, ++ 0xea221f91, 0x47bcf325, 0xf38f93ec, 0x38ed3d78, 0xdb3c0b77, 0x08555c13, ++ 0x37e7682f, 0x89ec5d21, 0x5a7e91f2, 0xf90d7c08, 0x4803edd8, 0xe5fe053f, ++ 0xe305fe41, 0x9ea8e3f8, 0x6b07e499, 0x7806fe04, 0x10722aec, 0x0296367c, ++ 0xd99f209d, 0x766fb66d, 0xf12af104, 0x1ae3c5a9, 0x2cefcf31, 0x862b86f7, ++ 0xc8077b50, 0x5cf135bd, 0x7f7099ee, 0x5c4c4cc2, 0xf8441b1f, 0x5fd13a22, ++ 0x8a6ebe3e, 0x7d8078e2, 0x49e3bffa, 0x8447f9be, 0x085f97ee, 0xf67e497c, ++ 0xaf1ab471, 0x2f9cf1b1, 0x4bd448fe, 0x3973b78f, 0x7da6ece9, 0xaf3c71f7, ++ 0xe5c3989f, 0x1fb7d48d, 0x05e2ed11, 0xe52a647c, 0x6ac9e8c7, 0xf45e223d, ++ 0x4b1f1f1f, 0xa7f5e029, 0x77290708, 0xe3f8bf80, 0x7fcc3f60, 0x85fc4cdd, ++ 0x821eebad, 0x3dea0ffb, 0xdcc27c4a, 0xe40130bd, 0xc7a02dc5, 0x5da80a98, ++ 0x73ef7e3a, 0xe92e1eee, 0x1e50c6c2, 0x29eb966f, 0x0f7e26ec, 0xb5d68d72, ++ 0x50df0184, 0xb5ff8d2e, 0x680d2750, 0x0758f3fd, 0xc3d15bcd, 0xb9fb4880, ++ 0x01fd81cc, 0x4f8c5fdc, 0x3b5dc20a, 0x074151de, 0x0c5789bf, 0xf25e91c7, ++ 0x6de23e59, 0xda5ffbe1, 0x67974016, 0x0eaf16ed, 0x742fe7e4, 0x9fb0d79e, ++ 0x4dbe7733, 0x9351f7fa, 0x35ab487f, 0xffc9b94c, 0xb04a23d4, 0xf4afd17c, ++ 0x8bf0135e, 0x1e679ded, 0x5eeb039a, 0xe277a9d2, 0xfeee4b90, 0xa346f7af, ++ 0x7469dcfe, 0xe410f9e2, 0x9c06fdf8, 0x17d72377, 0x74d4ea8f, 0xeafbfa70, ++ 0x8111ccf3, 0x486fd02f, 0xe77c936f, 0x1e6c5468, 0x64acf983, 0xbf28c1fe, ++ 0x09973297, 0x5b6ecfd3, 0xfc018d31, 0x10d75b96, 0xfb793a3f, 0xab7bd214, ++ 0x97ca9799, 0x167e306e, 0xb7961f2a, 0x1e2bf3aa, 0xfa57e755, 0x3b5ef9d4, ++ 0xcedab971, 0x02735327, 0xc0d3bfa7, 0x588f49f6, 0xbea1f66b, 0x23d7ada3, ++ 0x780b36e8, 0x49f22762, 0x7768fb90, 0x4ae5135a, 0x66bebe41, 0xc5ca6977, ++ 0xe70d71ec, 0x51be65af, 0xbd5ef921, 0x12f98f21, 0x217bf6fa, 0xf60dd39e, ++ 0xe0e310eb, 0x5974e2f9, 0x137c75f8, 0x6894f52f, 0x5cb7afea, 0x2f1c13f4, ++ 0x70d1e696, 0x3e6112de, 0xba7f6a56, 0x5138fc3a, 0xbb1c7209, 0xdb064e4a, ++ 0x26b97227, 0x3e92cbce, 0xd2a7ce1a, 0xfa979977, 0x065db06e, 0x8658afd7, ++ 0x904c78fd, 0xb37b494f, 0x2b9f0fdc, 0xf64692cc, 0xb9c407a1, 0x768799dc, ++ 0x0f51cfe6, 0xc938fdc2, 0x530027b1, 0x98d77a5c, 0xe0ec8621, 0x03aed17e, ++ 0x2054eae8, 0x4c0eef84, 0xbc9225b0, 0x8e273275, 0xe17de92b, 0x3cfd159d, ++ 0xdcbfdf30, 0x09e29e5d, 0xfb5ef3a1, 0xff9f898f, 0xe4aab318, 0xe1c8d32c, ++ 0x7720eda5, 0x1adf4963, 0xafe74c82, 0x7a24efbb, 0x64ee66af, 0xddaef3a4, ++ 0xff3d3343, 0xf395fc82, 0x6c5de599, 0x4d879464, 0xa66ffb0c, 0x8eaccf98, ++ 0x9d7c68b7, 0x71a465c5, 0x4f61cc5c, 0x9f3323a6, 0x034f302f, 0x9defafe4, ++ 0x18d31a3f, 0xafe6271b, 0xf1bd7074, 0x25b2917a, 0xb79c549e, 0xf185c719, ++ 0x152f98a2, 0x4e3196d3, 0x15e3a607, 0x83cf81b7, 0x6b2279e3, 0x3afac0cc, ++ 0xd7cf404b, 0xc6483309, 0xa2f0bdf6, 0xd7e44dbc, 0xb859eecd, 0x6d5bbf1c, ++ 0x624c47c4, 0xe0049e1e, 0x5fc4b987, 0xb36eb82c, 0xd7127fd5, 0xb7a91365, ++ 0xd8fb41cc, 0xaec8cd9b, 0x18dacd11, 0x9eb56b8e, 0xed62e2f5, 0x3e60aecc, ++ 0xbfe3deca, 0xb49f218b, 0x8923757a, 0x404b2e4f, 0x5bbca93e, 0xbe01788d, ++ 0x913cedcc, 0x6e500dca, 0x2e7cbd63, 0x45afcc5e, 0xc634b9f0, 0x5cc090e1, ++ 0xb683de34, 0x450c69ea, 0x828d7598, 0x9d8b1fed, 0x9be7107c, 0xf287808c, ++ 0x1506c984, 0xab724adf, 0xea5529f3, 0x9d479a7c, 0x76a3b0b7, 0xefc55fa4, ++ 0x4090bd4e, 0xb45ca9e7, 0xbf0518ab, 0xe7cd1398, 0x098dd325, 0x3f4d7fba, ++ 0xe5cfaa71, 0x4626f1f5, 0x8b64baf6, 0x7d248d85, 0xd7026365, 0x62f13e57, ++ 0xf89bbeb9, 0xc778fe79, 0x67e0035a, 0xbce2a57d, 0xdebbf007, 0x8b579f66, ++ 0x3105d376, 0x70635edc, 0x7ca158b4, 0x739c7553, 0x768f8e23, 0xfacf5866, ++ 0x17eafb28, 0x6c0baf10, 0x5eeb1ebc, 0x4dc37e8f, 0x8df6ed1b, 0x75abb40e, ++ 0x5ea1344f, 0x37d99cbc, 0xfdf430b3, 0x981bec2d, 0x0798d3ef, 0x5e8228bc, ++ 0xf82df7e4, 0xc7e7873d, 0x93b9e317, 0xc474e5ff, 0xd97ce295, 0x22fc856c, ++ 0xfcdb1d0d, 0xa9cb2768, 0xf93b27ca, 0xc3dec207, 0xad1f7ec4, 0x83634fd9, ++ 0xf9e54df4, 0x5d69df22, 0xd215a6f7, 0x7ec21d41, 0x7e16689b, 0x817d90d5, ++ 0x87c3b793, 0xa02e6e62, 0x7ef9127e, 0xc7f93270, 0x2c75e9f7, 0x94e387f8, ++ 0xbe25c707, 0x8d944134, 0xe2f7f836, 0xd22b1dfe, 0xb9be917c, 0x63d11260, ++ 0x30eacea7, 0xb67ef8e9, 0xdad1e0e4, 0x14b847ad, 0xc16befdb, 0xf8af5cf9, ++ 0x3f74cd29, 0x5bf647a0, 0x803e0160, 0x55c4a1fb, 0x65aefb81, 0x5ea3b302, ++ 0xdf2cb31d, 0x1fef8769, 0x00e6fc2c, 0xb5479bda, 0xcc23f232, 0x71dae131, ++ 0x287eae56, 0x2957672f, 0xf846ffde, 0x06fbd04e, 0x26afbb43, 0x8677d394, ++ 0xbbcc19aa, 0xfca2d052, 0xeabe591e, 0x9d68f2d4, 0x490fe549, 0xbb72b44b, ++ 0xa3c4c270, 0x72efa409, 0x9267e47f, 0x5cb2e49f, 0xfb2127e4, 0xf7ed38fd, ++ 0xf12277d2, 0xe0b97503, 0x46bb3707, 0x173f4919, 0x5ff2417c, 0x683bee37, ++ 0x01b19737, 0x59b37f48, 0x43e9f123, 0x2f892ba5, 0x46bcc2dc, 0x6587f384, ++ 0xde720f1c, 0xf5ab26b3, 0xeadd9b99, 0xad2a9cfc, 0x26e1c3be, 0x51eb9dc7, ++ 0xfa94cf97, 0xbeb564ea, 0x7d7fff3a, 0x3772471b, 0x0bbad9e5, 0xc0efd103, ++ 0x550dedcf, 0x3bf71f16, 0xeb4e8818, 0x72ff71d7, 0x7be2fb43, 0x776f1093, ++ 0x6113d233, 0x86cb285f, 0x5954dd93, 0xfea7821e, 0xf9053eb5, 0xc49b50fd, ++ 0x3e6fd73b, 0xa2f6fa30, 0x9583e25f, 0x9e6055b0, 0xafdc4cfb, 0x798a3fb6, ++ 0xe92c6ed1, 0xdb90b6d1, 0xd417613f, 0xec327ce2, 0xcfd44e31, 0xc80ae837, ++ 0xd621ba5e, 0x6f6bb2a6, 0x50e9cb5c, 0x661d49da, 0xc5fa8056, 0x6c6b331c, ++ 0xfdb7f6e3, 0xdcadacc4, 0xf613e63e, 0x0f42a386, 0x6475f284, 0x81f0d39f, ++ 0x1fae04a4, 0x25cbcd26, 0x4755683b, 0xa1da217e, 0x7d913e41, 0x838268fe, ++ 0xf27957da, 0xa3777ec9, 0x4ff92e75, 0x19363a1a, 0x74835996, 0xfa144ce3, ++ 0x418b0c7c, 0x7bb5eb7a, 0xbb266cbd, 0xee742fd7, 0x17f444c2, 0xdf64fc9a, ++ 0xfa37a10a, 0xacfe491e, 0x9636f810, 0x072ee7b9, 0x67bd74b8, 0x9539e272, ++ 0x1f64632d, 0x1c67657b, 0x330cedd9, 0x75fff119, 0xd9f08ca5, 0x98267685, ++ 0x357117ff, 0x53af87a4, 0x9f4f895a, 0xf0489f8b, 0x4fdd655f, 0x279acde7, ++ 0xe4428e81, 0xea2daac0, 0x49d66afc, 0x17dae4e7, 0xf123d0fa, 0xeaf7c933, ++ 0xb1dbabb7, 0x967e6a41, 0x8172f82f, 0x02ab39db, 0xcce55ea7, 0x385de7e1, ++ 0x8a3ac030, 0x7b0935de, 0xf1fb7ce9, 0xcf916428, 0x93d3172a, 0xf4276cba, ++ 0xfe72ff7c, 0xd1c6245b, 0xa12287ca, 0x8060dd1f, 0xfa820a71, 0xf9e3114e, ++ 0x7d0ebafd, 0xdf382eaa, 0xea4ed142, 0x4aff9259, 0x0096957c, 0xbb3a044b, ++ 0x97f05133, 0xf88d966c, 0xce89fe86, 0x89a48c15, 0x78bdfea7, 0xc62b1abe, ++ 0x22f07a03, 0x1675795d, 0x7aefd21f, 0x92e491a5, 0x4869f505, 0xe21e2a37, ++ 0xf1a9bfbf, 0x63de11ea, 0x69ace358, 0xa59c6f50, 0x04e10633, 0xc4c3f274, ++ 0xb4fd20a4, 0x36e67f30, 0x54474545, 0x9dee267e, 0xe52474b0, 0xae43ff84, ++ 0x15854c27, 0xe8153f63, 0xbf748148, 0x936bcfc2, 0x60333fac, 0x537477fb, ++ 0x33264e88, 0x57e7019f, 0x7fe35761, 0x3f3aaa52, 0x3e87d1c5, 0x25c12e28, ++ 0x573539e0, 0xfc92ee5d, 0x55f9a98a, 0xf496fb16, 0x81df761d, 0x3df9e1ef, ++ 0x1ae589a6, 0x68b28e50, 0xfe30e0e7, 0xaf1367a3, 0xd9e21fba, 0x887e30c4, ++ 0x0f3f232e, 0xd502c75c, 0xe97d282f, 0x4d9bdcec, 0x7a10d4fa, 0x9762fb94, ++ 0x2803c791, 0x4fbf73af, 0xf70d8589, 0x72157d23, 0x1fdc9dfb, 0xc67d21d7, ++ 0x58aee907, 0xd24b7f7c, 0x103640d9, 0xf6faece9, 0xf01ebf28, 0xbbfa2f92, ++ 0x20aee90e, 0xfea5ff28, 0x87d252de, 0x1c94b2be, 0xdf7ceb94, 0x4a3ff949, ++ 0x64316b69, 0x51f91f21, 0x8437ce0b, 0x7ce1de9e, 0xf689e809, 0xa9391f69, ++ 0x9bd0d72e, 0x28e1fbc4, 0x594b1f2e, 0x6cd9d123, 0x7f52839d, 0x8f920ae5, ++ 0x06d9d6e5, 0x4cd6ff6c, 0x90136f4e, 0xbeb0731e, 0x2dca5e9a, 0x1e96bcea, ++ 0xe85d4461, 0x8cfa5ab8, 0x91036f44, 0x4c7ca4de, 0x7dbd34b8, 0xab8df425, ++ 0x215f6f48, 0x9bd1231c, 0xff24ce96, 0x2f6516da, 0x1b3cc2b7, 0x0792146a, ++ 0xd41bdea3, 0x75a1f982, 0x6ebfa459, 0xa3ee738b, 0x5e5e46f2, 0x63d2e9d8, ++ 0x1ace481c, 0x2ee59e51, 0x13437cc7, 0x45d74394, 0xc89c7987, 0x7979bba0, ++ 0xfb8d3dfe, 0x7827a86c, 0x275dfb79, 0xa163ebd7, 0xb45eb7dc, 0xc72d6d2f, ++ 0xde06c37c, 0xfbf40bfe, 0x2d78c48c, 0xbf7e0b5f, 0x272cfee6, 0x7d72be3f, ++ 0xef58bc79, 0x7de5e536, 0xb795aed4, 0x12c0715b, 0xe6cf48cd, 0x620deefa, ++ 0xe49fe39d, 0xfcfc4ceb, 0xa00ec9c6, 0x5edde58b, 0xeb8ebfd2, 0xbf898b6a, ++ 0x96a73845, 0x9819ad2a, 0x8bf6024e, 0xdce2cba9, 0x7ee6cfa0, 0x8430cdc1, ++ 0x39db8933, 0xfd0d3fa4, 0x7a2195f6, 0xdb89338d, 0xe4bd6599, 0xd200c078, ++ 0xb236e3c3, 0x9f7f4b33, 0xa0a611ff, 0x5235c7bc, 0xff04481c, 0x469ca4df, ++ 0x0d261bd2, 0x80bf7e94, 0x9b8c0961, 0x89cbe17f, 0xa330ece1, 0x72beb893, ++ 0xc821c442, 0x1e3e35ef, 0x890db0ef, 0xbae11d24, 0x4794b7f9, 0x52171ebf, ++ 0x7882565e, 0x878af9e5, 0x21b8da9e, 0x6babe003, 0xa8517834, 0xc7142a65, ++ 0xf993a331, 0x9df6c5fb, 0xf30324ff, 0x87ae289b, 0x05babfcf, 0x1d1131e4, ++ 0x0b3767e7, 0x8371b1fc, 0x0b677e89, 0x124ccd3c, 0x3628cf7a, 0xcdd3f90a, ++ 0x58b76f02, 0x7e260f40, 0xf0d46ad8, 0x90925b8d, 0x51163c6f, 0x6b9756ff, ++ 0x188d4af8, 0xdde85ab7, 0xe937592b, 0x1f15c727, 0xe31e27a5, 0xeb6af77a, ++ 0xba6fd261, 0x66fae71e, 0xfe900b2d, 0xae23b5a3, 0xaf9d4e7e, 0x1be7536b, ++ 0xaef9d5da, 0xa71a5e11, 0x62bab1eb, 0x3cd5dfb4, 0x8bd91efa, 0xf17f246b, ++ 0x280bf9a9, 0x3cbf9cd2, 0x7dd92d72, 0x78df33be, 0xc5494e01, 0xbbc938aa, ++ 0xec429293, 0x78f2af22, 0xcfc67a8f, 0xa6b65de3, 0x10475aba, 0x691e527f, ++ 0xe0be49f9, 0x207ed227, 0xe33e4bf9, 0x8dce08f2, 0xaeb0b9ef, 0x547b9f46, ++ 0xaf9c5de2, 0xfd0bdb7a, 0x1ff51f27, 0xc36ba7a4, 0x439053ef, 0x43b398ef, ++ 0x42dcd0e4, 0x6f5be10b, 0xaab1e11d, 0xa249e1e8, 0x35e7c887, 0x5e86b975, ++ 0x56e979e4, 0xd0b32f41, 0xffe30163, 0xb9d17159, 0x4e4ad0ec, 0xd75b372f, ++ 0xb87ebd10, 0x3c8bd38a, 0x39f95db7, 0x2effa5cd, 0x3a5eb4e7, 0x17bd0289, ++ 0xf29939d2, 0xf3a0e55c, 0xe9c28371, 0x87e16ea0, 0x8238554f, 0x3350e17c, ++ 0xf084324b, 0x66299689, 0x5b0bfa0b, 0x33fcfc8c, 0xc5c7ea73, 0x8cf8424b, ++ 0x8fd4aa2b, 0x491d62f0, 0x8bad0764, 0x3e69f691, 0xe75d1cce, 0x7e423ff7, ++ 0xf90c54f7, 0x651e7b5b, 0x3cf492a4, 0x98e29439, 0xb4bf0b4f, 0x038acf9c, ++ 0xe009edcf, 0x6dfa6c7e, 0x57ddfa14, 0xefbfbe2b, 0xd98a3f40, 0xcfa47bf3, ++ 0x89bf3ad5, 0xc93b0bdb, 0x8dc72a7f, 0x12f4ff6c, 0xc1bd33ff, 0x12b770e5, ++ 0xf0a9714d, 0x1fa8487d, 0x6e64c3eb, 0xf27292e7, 0xd73ec28f, 0xedaa9bd2, ++ 0xae09c511, 0xffbae0bf, 0x78f5f0a8, 0x3f1237df, 0xfa3bfb47, 0xb32a4159, ++ 0xe77df1fe, 0x5b04f183, 0xe09e232e, 0xb9dbe08c, 0xef4c7b80, 0xc59d738d, ++ 0x7e109ff5, 0xcfc213d3, 0xfb962276, 0xd6f7cedd, 0x5a2672e7, 0x5f8427a4, ++ 0xdabc44ee, 0x59eb231f, 0xd9ac7a45, 0x40675962, 0xacb3363f, 0xf6a4041b, ++ 0xe291b988, 0xf5f3e634, 0xdb8ced75, 0xdfc431b4, 0x9a5c9291, 0xf6ed0c9b, ++ 0xa60addda, 0x353f5acb, 0xbbbdda85, 0x77a45d70, 0x4575f5f0, 0x9b8e54f1, ++ 0x9b995c92, 0x1b9ef08c, 0xe6f67c20, 0x9bbcc8c7, 0x9ebaeffa, 0xfcded9f3, ++ 0x099e78f7, 0xa3b485fb, 0x69aff247, 0x702069fd, 0x8a2079f8, 0xfeb5c3db, ++ 0xaf9205f0, 0x7cf87f09, 0x74169fc1, 0x42fcbb70, 0x1fdf5b0b, 0xa47517ca, ++ 0xac6ef3f0, 0x1fca8877, 0xa2b98dee, 0x9f4907f8, 0x7b3a035d, 0x878fc7fd, ++ 0x84eb8ff8, 0xae4eb0ff, 0x7d7abb6f, 0xaf3c04e3, 0x5c78ffa2, 0xff5f5172, ++ 0xe0ce36b1, 0x0627d455, 0xbb70f105, 0x42adc39d, 0xf68e5b5f, 0x8c659ed5, ++ 0x7f6fb3e2, 0xda0b697b, 0x0fbf6f5f, 0xcfc4942d, 0x13aeaf48, 0xaeb48e70, ++ 0x398eb724, 0x68ed7654, 0x7f9908e6, 0x955e279a, 0x243d4d27, 0x4d7fb2be, ++ 0x80fdaaba, 0xfd556cc6, 0xaad74d81, 0x05bcb3ca, 0x86ce7caa, 0x07f554eb, ++ 0xf2a996b7, 0x51bd1f43, 0x659f3f55, 0xd83b23f7, 0x8ada3d41, 0x99be35d8, ++ 0xcf61f2aa, 0xff6aaadd, 0x787c6b05, 0x2edbd41c, 0xebcc33ce, 0xcc5e1cea, ++ 0xff3830cd, 0x544b6d11, 0xb6945bed, 0x1af23f62, 0xa057e2bf, 0xaf8172de, ++ 0x5fdc9d65, 0x957db230, 0xb1d3ffaa, 0xd6887efc, 0xeb9d0a0f, 0x576b1f49, ++ 0x5f4ae3d8, 0xc74d68bf, 0xce31eb03, 0x147fafa7, 0x5bb427f8, 0xd418e705, ++ 0xce7ab4e3, 0x44b6c93d, 0x2ce93792, 0x96b5d39d, 0x07a4ac2e, 0x27a93cf6, ++ 0x1b3e60bb, 0x8238c8f2, 0x1cf99197, 0xc3d7f17d, 0xe7abbdb8, 0x67c51b05, ++ 0x297b78ad, 0x5539a3d1, 0x0e51174d, 0xe4c45d35, 0xe6c2e9aa, 0xbf41d354, ++ 0x681d3512, 0x52e71ee1, 0xc00b05d3, 0x96f0217f, 0x4f709570, 0x1ba6ac98, ++ 0x580bbc2d, 0xab8a01f7, 0x3f4e29f6, 0x6e87e30b, 0xbaeb44df, 0x52f91e94, ++ 0x0a3bf0b2, 0xefda8ef8, 0xdc12b16a, 0xd4973c78, 0xff42ccc7, 0xa5ffdad1, ++ 0x5927b37e, 0x3f45ff9c, 0x5ebfaed2, 0xbeb9d2f1, 0xe2573fd7, 0xa167f4cf, ++ 0xb8c8d55e, 0x46fdc8bd, 0x7b585272, 0x648f7d23, 0x9d70946f, 0xd5b9f42d, ++ 0xed7645cc, 0xfc43cce5, 0x4ae558ee, 0xb0ad13b2, 0x9cfc8cfe, 0x7d7267a7, ++ 0x88f986a9, 0x1fb15fcf, 0x1651f41f, 0xc2d58f62, 0xfc50e951, 0x4237e436, ++ 0x0eb3a41e, 0x143c0f29, 0x686401df, 0x49f95629, 0xfa2efad4, 0x97f842e9, ++ 0x78e57fd4, 0xaf929e12, 0xacccf1c9, 0xfb8a9f51, 0x58e7c342, 0xa34fd6ae, ++ 0x7b48d7b6, 0xe2160d0f, 0x67dad1ef, 0x38197682, 0xfa38c29f, 0x0c2d5981, ++ 0xeeca37f0, 0x115ffb22, 0xdf879ceb, 0x2d6d2c4b, 0x53b08706, 0xed7ac35c, ++ 0xd5e51114, 0xb3bffc25, 0x89e04abc, 0x5f7ebeac, 0xe58647e9, 0x3411fe7f, ++ 0x0838a71e, 0x0d7733ef, 0xea7a424d, 0x1e74af6b, 0xd1fa0d79, 0x4213baeb, ++ 0x71bd88ed, 0xd6804afc, 0xdd730b73, 0x90f442cb, 0x7136d67a, 0x8bda165e, ++ 0x62c64e41, 0xac59edca, 0x1b0fab5d, 0x83ac9ec8, 0xafdd2095, 0xd17e2166, ++ 0xe53960ac, 0x32f37df5, 0xfa52e74e, 0xec53afc4, 0xc780de22, 0x07c13117, ++ 0xd23339e5, 0x2dc64eb9, 0x980269bc, 0x72e30414, 0x5ce2299c, 0xb0f2c794, ++ 0xa7efb47f, 0xf6011d90, 0x1fba12a7, 0xa878e37b, 0xd47ecfbc, 0x2dc65fac, ++ 0x64856de8, 0xba1a5a1f, 0x8780cbde, 0x04ee5bd4, 0xd8d3007d, 0xa9e10714, ++ 0x9fe8fa2e, 0xd85c585c, 0x6cab8aa9, 0x0641c130, 0x8aaf06ed, 0xb536b9b8, ++ 0x45373ede, 0xf38903c4, 0x15e0a5ce, 0xce221f19, 0x72e3e04d, 0xe71930f5, ++ 0xa8b8e126, 0xa697dc2f, 0xf7fbf584, 0x2e5d5dc2, 0x72e12ee0, 0x59f3a8b6, ++ 0x76de97c4, 0xdde11938, 0xc1aeeb12, 0x048e03fa, 0xe0ba2b8e, 0x67f42abc, ++ 0xa7b53e28, 0xd6f74f5d, 0xf1e7afea, 0xf53bf54d, 0x75ce1ac4, 0xf40a7d98, ++ 0x8fbed353, 0xcd33c2f4, 0x0f4168c0, 0x430cd53b, 0x37622e1a, 0xd23bc0d0, ++ 0xc7ae4939, 0x84e4229b, 0x8f8cbf58, 0xbbae7581, 0x85d61c04, 0x7e854383, ++ 0xf0c0bf78, 0x431eb890, 0x10cce677, 0xc3aed0fa, 0x66edc295, 0x3fdc1bb7, ++ 0xed3efec6, 0xfb1878cc, 0x1c77d0ab, 0xacf84748, 0xd35ee851, 0x47bf3378, ++ 0xefca969a, 0x1a049599, 0x370f789d, 0x7e4ac335, 0xfbdfa1b5, 0x482194e9, ++ 0xf919cb77, 0x735e3fe5, 0xe1d2fc47, 0x2a8671c1, 0xc8ffba3a, 0xfc9fcbd8, ++ 0x8ffd10a0, 0x609e29f3, 0x43c79981, 0xc63f7d64, 0xe4fc039f, 0xe0b31375, ++ 0x376634be, 0xee91bdd2, 0x31d93d38, 0x026cf513, 0xbf9c9fd2, 0xbf2a2fbc, ++ 0x8b7cfe97, 0xe512f782, 0xdd2df1f7, 0xb4876ea3, 0x2922e91a, 0xe5f1feb8, ++ 0xad1aa3dd, 0x27d43c41, 0x5ea3d699, 0xe5c2ce78, 0x638b8ca6, 0x93f10376, ++ 0x3fbe1635, 0xe7960e8e, 0xcf0dbf6d, 0xae51f5a5, 0xbd71a37e, 0x9e19ebef, ++ 0xbbb2bfb7, 0xfad1c5fa, 0xaf77a41c, 0xe776f3b1, 0x9af97c44, 0xbce8cb0f, ++ 0x3e12d49a, 0x14adeb8e, 0xd5a8be7e, 0x0d6bcdf8, 0xaac78a7e, 0x51e838c5, ++ 0x1a57efc1, 0xdce32d07, 0x2e50f4b5, 0x671f5ff0, 0x74918660, 0xb17ddaef, ++ 0x53fdaf7a, 0xd4bef61f, 0x527944df, 0xc353f739, 0xdc6c2ab9, 0x7e1489de, ++ 0xd7c60e7e, 0x6cdee805, 0xcededc6f, 0xa61614d2, 0x74395eff, 0xa78aa5de, ++ 0xf5dc7193, 0xfc5027e7, 0xa17e9f5c, 0x1835873f, 0xfe0917af, 0xf5fe02e5, ++ 0x2a374718, 0x2be73bf4, 0x451271c1, 0x16205c5c, 0xdbafe3f7, 0xfcaf74f5, ++ 0x937507d7, 0x77998737, 0xcb872a72, 0x370649b5, 0xf30c3fc6, 0x30a6d733, ++ 0xf27acbe3, 0xa7bc8a7e, 0xf6df9da9, 0x9c42c0b2, 0x86e7c63f, 0x952a2f1b, ++ 0x7bce57c3, 0x47c73c7b, 0xdd331efd, 0x297e805f, 0x7c7b7a8e, 0x83f89aa0, ++ 0x1ce78d5d, 0x37edc781, 0xbee93206, 0x4f6e14d4, 0x2b0f4488, 0x51e33d62, ++ 0x81ced60e, 0xc53f40ca, 0x1ec54686, 0x452ebfb2, 0xebb8410f, 0x0bed7854, ++ 0x57e11377, 0x39cf2bf6, 0x53d51f27, 0x43c9c43c, 0x9732df62, 0x8b6dcf15, ++ 0xc93b5c85, 0x64e43fb8, 0x9be742ab, 0x9ac61e25, 0xde2cbf80, 0xe1f49ab2, ++ 0xad4667ea, 0xdf867147, 0xb23e06ef, 0x1bb19538, 0x4eb25d20, 0x765f17ed, ++ 0x217b1f7f, 0xcb9f950b, 0x8fc92359, 0xdba99fea, 0xfffbb0d5, 0xd6927a86, ++ 0x5f368f5f, 0xa5c643d4, 0x3146f38a, 0x7ffe462b, 0x9a5f33fb, 0x12394430, ++ 0x7e009ffd, 0x7c80c83a, 0x99e942d5, 0xeea53b66, 0x5484d754, 0x54a2cb80, ++ 0xb454a4cf, 0xe1cfbcdf, 0xc3db53d1, 0xe25e03e5, 0xd664b905, 0xf326f8f3, ++ 0xfecfee3c, 0x000fbe11, 0xb99b30f0, 0x77efa43e, 0x3419ccf7, 0x7fc11f4b, ++ 0x30bec074, 0x338fe48e, 0xf13de915, 0x299349f9, 0x18f9ee6e, 0x636fc217, ++ 0xed1f2ba9, 0xf92b1b0e, 0x998b467d, 0xbf7dd3fb, 0xba06f31e, 0x3db5063b, ++ 0x5ce78650, 0x3f5ec77b, 0xe83673da, 0x47f146fe, 0xf1e06e1b, 0xc0bac980, ++ 0xc159fede, 0x7c6292f1, 0x4f6fe8a9, 0x7ba2661a, 0xd2fa898c, 0xf890c6fc, ++ 0x83817aa3, 0x13f1c52e, 0x7deec7bc, 0xf42ff81b, 0xf7e063db, 0x1c65ae2e, ++ 0x0c8e32bf, 0x63d50ec7, 0x30fc00cf, 0xafe65178, 0x46fc536d, 0xf6dd4f58, ++ 0xa9a7e46d, 0x3c9fc7bd, 0xafcee50f, 0x92e7e40c, 0x3d7c4af3, 0x59fd0cad, ++ 0x53ccde52, 0x263edcec, 0x4cb9f4f4, 0x587f71fe, 0xb98ba095, 0x179f3f42, ++ 0x84bce1c3, 0xddb13339, 0xab1616ad, 0xaf342d83, 0xd688adbc, 0x8718dab7, ++ 0xebf4807a, 0xc21fd644, 0x9feab5db, 0xb9fbf1b5, 0xec10f74a, 0x679c14e4, ++ 0x1eefb62e, 0x7ea27c12, 0xc6a7bf08, 0xfa173106, 0x0cf7eb11, 0x077684dd, ++ 0x4ff73473, 0x94b23f03, 0x6cbe9014, 0xcad1f3c1, 0x14fca2d7, 0xc2e027a7, ++ 0x8c7caeec, 0x99986bbf, 0x20714051, 0x9de9ba47, 0x40c67389, 0xe05bed26, ++ 0xc2c80a33, 0xd395a9ad, 0xf5ef400c, 0x4187a0e9, 0x45d4e3fe, 0xdf780cd3, ++ 0xad503b31, 0xed29bc83, 0x36bf9e4e, 0xf6f31c70, 0x5f3c75b4, 0x43d6a810, ++ 0x83da587e, 0x46078f3c, 0xb492ac20, 0xa179a6c7, 0x427153ff, 0xe80671cf, ++ 0xaefd725e, 0xfb50baa1, 0xce34a0e9, 0xf1454ea7, 0xd8b2a77a, 0xef0899a2, ++ 0x2df5f0dc, 0x6e3f5269, 0xbd7276a5, 0x0d4b3db2, 0x2a4f6edf, 0xdc52b76f, ++ 0xc31f1e27, 0xbf714436, 0xf016379c, 0x2863bfb0, 0xa73715f9, 0xedfef3c6, ++ 0xb0614fd0, 0xd94f091f, 0x15771c9f, 0xc3e463ca, 0x95e76e46, 0x72a4efe5, ++ 0xace309be, 0xb90671a3, 0x99dc3df8, 0x3f88f919, 0xe0419bc0, 0xb5cfc0cd, ++ 0xa0fcf89b, 0xe23cb8df, 0x4ed0a3fb, 0xa85bffbf, 0xb79c159f, 0x088e4e96, ++ 0xc2d9593a, 0x71dda9fd, 0xe34f4439, 0x22bbc463, 0x0c75ea85, 0x941ef013, ++ 0xd9d7c716, 0x8514978b, 0x701169c6, 0xbdd008cc, 0xf75d2bc4, 0xbad37fa9, ++ 0xc2e5f043, 0xb7f641f7, 0xaf99b35f, 0xe90be387, 0xbbf49e39, 0x9dfd5407, ++ 0x5f69ab5a, 0xd7121b02, 0xed439f1b, 0x2cc5147f, 0xee6d9df4, 0xc795976d, ++ 0x4fd450f5, 0xcc0dbbe5, 0xf50b037b, 0xcfbef613, 0x3fefc6d0, 0xad39d707, ++ 0x2ed3ac50, 0xebe769d6, 0x95e8a9f4, 0x9cceee1d, 0xc74beb6d, 0xedeff0bd, ++ 0xe881786f, 0xc3cfb54f, 0x3afb87f5, 0xa4065e12, 0xc8bc655d, 0xd9e06a79, ++ 0xfccd670b, 0x7f713c24, 0x6ae1bb53, 0xb4f394ba, 0x59dfda47, 0x52bc71df, ++ 0x4eeeaede, 0x1ccd171e, 0xdbaeba6a, 0xb8c3a59e, 0x16aed901, 0x4149fd6d, ++ 0x4d2b9ebb, 0x58337f9c, 0xc3f88446, 0x61456909, 0x5df481ed, 0x8aebfe7b, ++ 0x5adf71e3, 0x9257443b, 0x29ef13b3, 0x7bf2cf7a, 0x763563f8, 0xbd1ff419, ++ 0x0bb60d6c, 0xfe7517ca, 0xbebf0141, 0x4ceea576, 0xb9a15f9c, 0x138715ec, ++ 0x5b69b1ce, 0xf6175f89, 0x0b23bb2b, 0xdb1ecbf2, 0xb0bffc46, 0x5997d97f, ++ 0x1fabcfc0, 0x0f97997b, 0x1b32fb2b, 0xf0af69f3, 0x2bd778fc, 0x7b19efc8, ++ 0x3184da65, 0x45627d41, 0xd5c6839a, 0xd218eb97, 0xf31eaf51, 0x18f499ba, ++ 0x6948d709, 0x18d759a1, 0xd8d7ffce, 0x5fdc0f4b, 0x74ff8252, 0x9c4efda0, ++ 0xd50603ef, 0x962bbef9, 0xdaee93df, 0x37ba0ffd, 0xe79a5772, 0xbed0697b, ++ 0xc2cce621, 0x13dfc82c, 0xe7f909f3, 0x21e81714, 0xd8713768, 0xaf987cd9, ++ 0x1ba36672, 0xcab626f5, 0x5c103169, 0x600b3d85, 0xf7e00172, 0xdd5f9eda, ++ 0xe30f9fd5, 0x118c79c6, 0xcf61a07c, 0xbf477fd7, 0xab29c36e, 0x63fecd13, ++ 0x03bb1e3a, 0x1d31aef5, 0xe5cd7cef, 0x22e7bf30, 0xed063de7, 0xa4bdf095, ++ 0x1ff34cdd, 0x72cd71d3, 0x0ff63fac, 0x2748391d, 0xb7f51fd7, 0xdae85b20, ++ 0xaafe9bfd, 0x8bec2dfb, 0x466dc68b, 0x7849a7f4, 0xaa9415fc, 0x478f047e, ++ 0xa5be3c38, 0x4973b2f8, 0xc807d687, 0x47bea9a8, 0xf93bfa04, 0xb4587b89, ++ 0xf214fd13, 0x0ed6b9fe, 0xd612a47a, 0xefafdf07, 0xe8841986, 0x5bcfe3cf, ++ 0xf3049180, 0x954e2ca5, 0xa9a4b72f, 0xb3d857ea, 0x5293e554, 0x4f9551af, ++ 0xf2abe471, 0xa8c77353, 0x96774fea, 0x9537f2aa, 0xafd5514c, 0xf2aa5574, ++ 0x5536fef9, 0xdb0751fd, 0x9987e5d5, 0x7050f11e, 0xd30fb9c4, 0x322e63a2, ++ 0x689f16a7, 0x98e987dc, 0xb43838af, 0xceebe076, 0xefc3edb7, 0xbdac0ed2, ++ 0xc2ed2417, 0x9f56f473, 0x37fdbc29, 0xbc1390d5, 0xf1d7afaf, 0xb4ff417b, ++ 0x78877e7a, 0xc682f793, 0x90181da3, 0x2ce8b150, 0x9f3fbfbf, 0x208ec9db, ++ 0xcd3f9062, 0xf17d91b5, 0xc5f1b188, 0x7f9fb88f, 0xebbdf200, 0xeb54abbb, ++ 0xa3de7f1e, 0x5b29775a, 0x6dd3c1a9, 0xfd857caa, 0x49fd554e, 0xe5556ba9, ++ 0x69f71c53, 0x2a80f4f0, 0x98f9dd3f, 0x349b4f06, 0xaa95fa78, 0x8777d25c, ++ 0x41ed53b0, 0xe3a412fb, 0x88e59d02, 0x744e1b87, 0x3a4a3e13, 0x4f11cb5b, ++ 0x23691dd7, 0xddfa157c, 0x8b2ec8e5, 0xc3ee360f, 0x30e70fd4, 0x7346f76c, ++ 0x9bfba52a, 0x3aa7641d, 0xe94b9cd0, 0x7d2766c1, 0x09736dff, 0xbb36efa5, ++ 0xf35dfd28, 0x9b3b4a64, 0x35b694dd, 0x97fd51b7, 0x9db9db9b, 0x7df7a12b, ++ 0x0f680188, 0xd40ba738, 0x90d787a3, 0xfc8e986e, 0xe0745cf2, 0xf1efe61c, ++ 0xbf23a6ea, 0x01132134, 0xd22650b9, 0x0f5dfd21, 0x135e03a5, 0xc65e79d2, ++ 0x5ce9b45d, 0x0f87a8f9, 0x8fdfbc7c, 0xbb18030d, 0xd53bad77, 0x16f3c71e, ++ 0x29b213c8, 0x8fdfad5e, 0x2f5c405d, 0x8eb928a2, 0xdf31d3f2, 0x13cbc515, ++ 0x1d37ef1e, 0xeceff0f5, 0xf1f57717, 0xf9c40f8b, 0x2fe2fd6a, 0xd0d8709e, ++ 0xdbe8738e, 0xc78436a1, 0x72cf6121, 0x62e37cb1, 0xf90d4b48, 0x47b39446, ++ 0x4c897a34, 0xe695d41f, 0x3a6dbf62, 0xcf14cde7, 0x2191a37d, 0xf854cefd, ++ 0x33d657b9, 0x29f117f6, 0x9e74cdd3, 0x2d73ac3a, 0xa531b8a7, 0xf38429fb, ++ 0x0873c7a4, 0xeeb65dee, 0xc55f844c, 0x9f3cd9e3, 0xe294fdd4, 0x391bc90c, ++ 0x9e3f467c, 0x53e1b575, 0x933e0e1e, 0x3cfcedd3, 0x400d77e6, 0x0fe6403d, ++ 0x70eaba57, 0x752e1f3f, 0x2dfba60d, 0xbfdf336e, 0xefdd1b6e, 0xd1570661, ++ 0x9d7621cd, 0x6a46e9fd, 0xf82f1b37, 0x56f37da1, 0x2d73ed3d, 0xe74b3f3c, ++ 0x09d11efa, 0xc6e7339e, 0xb0e0b9d0, 0xa00bbf8e, 0xe7f4afad, 0xd1d382e7, ++ 0x3a6fede1, 0xab365e51, 0xd01dc5ee, 0x289ad75f, 0x3dcbbaea, 0xaeb1f494, ++ 0x03ae8046, 0x678d13d2, 0x29d9b979, 0xd97e4240, 0x282ff879, 0x8ee3b17f, ++ 0xd423faff, 0x8c4d64ff, 0xfd886493, 0xaddf825a, 0x0482f2a2, 0x0b4fe90b, ++ 0x43280e66, 0xf84f38b9, 0x0cda16f7, 0x33e6e4c9, 0xc9f099c4, 0xfcd665aa, ++ 0x564100f5, 0xc269589d, 0x326a97a7, 0xe98f5b6e, 0x980f41aa, 0xed6f0af0, ++ 0x51eb6df0, 0x2d83ad8d, 0x2ffc445c, 0xcc335ef0, 0xde93516b, 0xf273cfc1, ++ 0x2beae8de, 0xf491538a, 0x13c4587b, 0xbce81001, 0xa8afefaa, 0x417ad8ec, ++ 0x85d21ba7, 0x1b0460ff, 0x9fed4171, 0xe4e91fba, 0x86f782cc, 0xa81ff044, ++ 0xf8fe85cb, 0x571f1327, 0x1c880efb, 0xe39fd0d7, 0x2809b0fd, 0x5bc9f513, ++ 0xabc81cb9, 0x229ef2fa, 0x875e7f58, 0x0871475d, 0x2076ea8b, 0x05da7a1e, ++ 0x1dac8d1e, 0xef2cd3f7, 0x96284fe2, 0xf61f734b, 0xd9d2f252, 0x950f2f69, ++ 0x77018597, 0x2cbca879, 0x472d6ee9, 0xa3e528b9, 0x9bfa8bf4, 0x6e5f046b, ++ 0xbfba7e24, 0x07f289b9, 0x1e94bd9a, 0xf820de6c, 0xbf952b72, 0xe0a8fcdb, ++ 0x97c13ecb, 0x1defa39f, 0xee9455cd, 0xda50f669, 0x257eeb12, 0xc589f71d, ++ 0x6f87f143, 0xe866663e, 0x30e9eb77, 0xec05dc53, 0x489ea788, 0x3322b8c4, ++ 0xc6d487dd, 0x7cf96917, 0xef6c3d2f, 0xebc8fef3, 0xb8dea788, 0x0717d420, ++ 0x43a7a646, 0xbe4361cc, 0xcd7a41f4, 0x0fb7d474, 0xd4361c39, 0x5e3c8fa7, ++ 0x90e97c43, 0x423361cb, 0x95f4c3fe, 0xb0e3dcbc, 0xe7ff2199, 0x72f257c7, ++ 0x0516c3af, 0x57d28ff9, 0x918fbcf1, 0xde903e93, 0x7c8bdd30, 0x71fb2996, ++ 0xb25b947f, 0x00b88026, 0x1fba5d79, 0xd4a4c5f7, 0x5f7013c5, 0x10774f4c, ++ 0xac714c7d, 0xa9f98fdd, 0x780c9bb9, 0xcd65cb15, 0xcaed875f, 0xd80d2b12, ++ 0x6dc6426e, 0xc4ddb0eb, 0x42180f41, 0xbe1e4ddb, 0xa7e61d6d, 0x50193739, ++ 0xf82e9d3f, 0xe647ec98, 0xd3e4b965, 0x646dfe32, 0x41e49b87, 0xe49bbb5e, ++ 0xd94b8481, 0xd17bcaec, 0xaed0d55f, 0xc79c15d8, 0xf837a56c, 0xeb086300, ++ 0x74ce3df1, 0xa1fe3b8c, 0xb7ec2d6d, 0x475fcc06, 0x1daf1ff9, 0xf7f9557e, ++ 0xf7f8e137, 0xa3bf6207, 0xf6b8c7bc, 0x3dfc4c0f, 0x17089995, 0x163ba7d4, ++ 0x50dde8db, 0x9ea1b1e6, 0xf9e42555, 0xfca14c7c, 0x407f917e, 0x5cea0fa4, ++ 0xddf0fec6, 0x2f9c5fda, 0x7b07f2fb, 0xffda22ff, 0x11227b9a, 0x887f05ca, ++ 0xe7e76fef, 0x462ef125, 0xd3f7e31d, 0xa73f152e, 0xc6d7038d, 0x6d62ac93, ++ 0x7d595c07, 0xf16a48e3, 0xdf4e5b1e, 0x2f196ef8, 0xeef38dad, 0x7345573d, ++ 0xbc855a7e, 0x4478e806, 0x5fe43864, 0xe1f90e02, 0x3d67d0e0, 0xf7b1c78c, ++ 0xf1122f89, 0x3175daec, 0xc77f124f, 0x6bb7c457, 0xa2e927d7, 0xb95afaef, ++ 0xf870379c, 0x8e577e83, 0x6458ae78, 0x0ab76863, 0xbc7f3fe5, 0xf2d1ff08, ++ 0x27c5abb3, 0xcbaa2ce7, 0xfaaa77a4, 0x842ab1f2, 0xc98f96a3, 0x54daf17b, ++ 0xff78a9ea, 0xf11ce30e, 0xe73c20bd, 0x59ec937f, 0x9574fd8a, 0x875dff75, ++ 0x00c4d0e7, 0x38dee1c1, 0x41c2354f, 0x0578f131, 0x427c7719, 0xf5097de7, ++ 0xeffa3bb6, 0x0e777e22, 0x91ec0585, 0xbd479055, 0x5dddaf6c, 0xdcb1fd8b, ++ 0x4b39c500, 0xae29117e, 0xc3908d76, 0xefbe537d, 0xd7697c64, 0xc933afa6, ++ 0x7d89777e, 0x151e0911, 0xbc0171fa, 0x1253d1ff, 0x8cf3f243, 0xbef8fcc2, ++ 0x64d299ef, 0x0cce5bd2, 0xbd301930, 0x33e2e7da, 0xff508603, 0x99f1f3da, ++ 0x1f0b12b4, 0x4c64e277, 0xbc76977f, 0xefdee510, 0xbb655c45, 0x77ea3bc9, ++ 0x131e1f68, 0x9bfafe45, 0xc2214094, 0x3eae7b41, 0x32fcf6f3, 0xf3df5e47, ++ 0x026fac35, 0x53f6afae, 0xedf8bddd, 0xb5dbcf4a, 0x18677f4d, 0xe9b63ec7, ++ 0xf518665b, 0x9ddfce5d, 0xd40e79f1, 0x482d3c2b, 0x80cfa322, 0x4bf9013e, ++ 0x559d65c5, 0x159e9ce0, 0x792f2e72, 0x8967c787, 0xef3e7b54, 0x2adeaef3, ++ 0xb01e3aaf, 0x71445fd4, 0x2c40fa28, 0xf1d5fbdd, 0x9c642b77, 0x3ce25bd6, ++ 0xfdf5e70f, 0x95ebb748, 0x79d54cce, 0x2e1f07fd, 0x40f88bbc, 0xbc6dc514, ++ 0x1279fed8, 0x9d2ff5ce, 0xe6bd0f49, 0x8377d208, 0x2704effd, 0xea6daf99, ++ 0xaccfe551, 0x8513be0d, 0xff6aadf7, 0x04b927a9, 0xe1036c72, 0xba61bd89, ++ 0xb2be443d, 0xc2f5bfb6, 0xbbf0247b, 0x9d18044a, 0x70cce717, 0x714abd41, ++ 0xa3de621e, 0x8fce2f3c, 0x70cdb9a0, 0x4995bf41, 0xe36b3ea2, 0x7cb201f9, ++ 0x583faf1b, 0xe5e567f6, 0xfa2f3269, 0x4fe646bb, 0xd92cf2f0, 0xca26fa3e, ++ 0xc9f978db, 0x40cdeffe, 0xf7f2463d, 0x7f42feae, 0x0139ef16, 0xf912ffbf, ++ 0x6ee245c8, 0x1e42e5d4, 0x2a9bf7c8, 0xe625307e, 0x6db7dc3d, 0xd610c50a, ++ 0xfb246dde, 0xb6f8e9fd, 0x6777d0bc, 0xbb8e7c65, 0x5af146dc, 0xdd0eaf75, ++ 0x4b7117ac, 0x0ac4b7a8, 0xde857aff, 0x9e977e4a, 0x8f5f39fb, 0x3755f7a4, ++ 0xafe152ed, 0x2f78b94f, 0x30931c9a, 0xa71fd9de, 0x36033dd0, 0x01e293a8, ++ 0x191432e2, 0xa4f7407f, 0x625c7c65, 0x79e1730e, 0x5137f139, 0x63d1bdfc, ++ 0xab6fc49d, 0xd9edc37f, 0x23ed8f75, 0xef44b6f9, 0x2f927b20, 0x819293db, ++ 0x7f1b12fe, 0x69bab217, 0x52cbed0f, 0x0bf85d87, 0xc28787bb, 0xfa866073, ++ 0x6f802d3d, 0xe1c5c64e, 0x37ff2eaf, 0x476b5fc3, 0x57eff797, 0xdf1c615d, ++ 0xfbf71b39, 0x3e9e053a, 0x058a39d3, 0x80cfaebc, 0xef2ece71, 0xc7a7121c, ++ 0x8a4eec60, 0xbfd0ab5b, 0xabe7845b, 0x431b469e, 0x3a539fbc, 0x83083ef3, ++ 0xe239ed7f, 0x8aa64c89, 0xd19a9b2f, 0xba6fbe87, 0xfa6f7c04, 0xc537c24f, ++ 0xd1393010, 0xbf847c4f, 0xf9dc5733, 0xfe342999, 0x65d041a7, 0x07ee76bf, ++ 0xc16df193, 0x93c71b72, 0xcdd537f0, 0xfa1c777c, 0x187ee49b, 0xd0dac31f, ++ 0xed74007f, 0x44ed7414, 0x1bf496ba, 0xbb413bf4, 0xd20df030, 0xdfae1aaf, ++ 0x3fb74bef, 0x7f5c04b8, 0xeb849ff0, 0xc97fd076, 0x8a23bb5f, 0x385a32ec, ++ 0xeb833cff, 0x2fde122d, 0x38247c89, 0x4e7084bf, 0x7e70faba, 0xb2a1c329, ++ 0x4778486b, 0xfc5a4792, 0xd98779c8, 0x65df45a7, 0x299f5e9f, 0x402194f8, ++ 0xbc5ab571, 0xf78be8ef, 0xfbc0979d, 0xde24ffce, 0xa6d370b5, 0xab7fc2b5, ++ 0x4641fefd, 0x55777e44, 0xcd3ff8e0, 0x71a0b02f, 0x517caaaf, 0xf2aadbd3, ++ 0x2ff7dec5, 0xed208fcb, 0x7f29fffb, 0xcc23f482, 0x0e856578, 0xf95a8dfd, ++ 0x3ba64cf0, 0xe3d0007f, 0x7bfebb4d, 0xf93807f8, 0x5714219a, 0xcb588775, ++ 0xf1fee397, 0x5f405dc9, 0xfb72365f, 0x27bdd1ea, 0x7d118e8d, 0x79c165e9, ++ 0xd085731d, 0xf7a682d9, 0x2d67a88d, 0x9c398d00, 0x0078b59f, 0x5c5257b7, ++ 0x2a85f014, 0x0226330b, 0xe2aaa83f, 0xd0ab9ff7, 0xa94f18a1, 0x33e503df, ++ 0xef8fcc0c, 0x0d5a5755, 0x39f9337e, 0xcdd9f7d5, 0x966b3de2, 0xd7baa098, ++ 0x29e977ae, 0x12e6ef7e, 0xd5bd1fee, 0x81f746da, 0xe7bc1ee7, 0x97b85dec, ++ 0x788b79d7, 0x47bcbafc, 0x95dd67f8, 0x518b3df8, 0x9e73c52f, 0xb7e9fc22, ++ 0xae9fc919, 0xd62d176d, 0xf0af433b, 0x3c9d99b8, 0x4fee52fe, 0x7341df58, ++ 0x82cfbf01, 0xd951b7bf, 0xcd0ff468, 0x2f7abd43, 0x250dd5e9, 0x7f10f36b, ++ 0x4f94130d, 0xf3c179cd, 0x57d3434d, 0x9fcb5ed4, 0xdae5e9b5, 0x3e693f53, ++ 0xcf22f448, 0xfd9b4741, 0x57dad794, 0x3fff8fe7, 0xf31c8fe4, 0xd305af95, ++ 0x3ebadfb1, 0x0eeb0d18, 0x4bfe7734, 0x376903f6, 0xad047690, 0x11f2425d, ++ 0xd2e3eef9, 0x9ef17601, 0x39f92969, 0x92a78198, 0xd01caedf, 0x0dd73f87, ++ 0x7f28ba28, 0x9bff9756, 0xd2e5f3f9, 0x972a6d7f, 0x3fba5aab, 0x6497f332, ++ 0xadf4966f, 0x18f9ffa5, 0xcfe30283, 0xdee8506f, 0x568ad577, 0xbbe558e3, ++ 0xeb2afbd3, 0x370e4cb1, 0x62b85c8d, 0xf5a0e079, 0x74f5cbeb, 0x6feb30be, ++ 0x439da273, 0x17d7c1e2, 0x812e5b6f, 0x49ff2db7, 0x8b95f5bc, 0x377e16c7, ++ 0xfa54c8b9, 0xfa03ebc4, 0x06fbe7e8, 0x509f5c5c, 0xd79bff97, 0x68df721d, ++ 0xbc175ea1, 0xd7f18357, 0xe5d9f718, 0x6b4cf7e3, 0x77e95ab2, 0x77495801, ++ 0x95bbf22c, 0xf7fcf5bb, 0x432e0c66, 0x687bc85a, 0x4fff9867, 0xc62b8f48, ++ 0xb48477f1, 0x22f5d171, 0x75957a5e, 0xd453dd3b, 0xe3266bbe, 0x7f45ebae, ++ 0x64cdf7da, 0x816ef97b, 0x53b37df6, 0xd9fdc403, 0xe3c05602, 0x47ce2e50, ++ 0x0f3ca1cf, 0xfb9ccff1, 0x0aec99b6, 0x7fa2033d, 0xe208cde2, 0x3c5f7ce5, ++ 0x3c097b7e, 0xc49ffb7e, 0xf57e96a3, 0x1f742db6, 0xf7e94aed, 0x2e2b871d, ++ 0x97c82933, 0x6bcdf97b, 0xf237e266, 0xdbaef67d, 0x84f7a45e, 0xe466beba, ++ 0xfbd4bd87, 0xf0cfe3dc, 0x1fd784eb, 0x00d8b5f3, 0x7a8f63af, 0xe6373ec9, ++ 0xdfee87b0, 0x85d77e8e, 0x7f2cff11, 0xf38f5bbf, 0xd48cfa96, 0x4bfc826f, ++ 0x71134bdc, 0xe7cb9755, 0xf8bfd4ae, 0xca2bf2ef, 0x8ce771fb, 0x1dfc22fe, ++ 0x28ceef04, 0x3b43cf7a, 0xba99c9ff, 0xdc2fbe8b, 0x9c99eb12, 0x2599f809, ++ 0x677c84e4, 0xdfcf42b8, 0xd4e9ef17, 0xcd707d93, 0xd2f0ff0f, 0xdb4b8e13, ++ 0x3dec1a15, 0x3265cf61, 0x7bf1d06d, 0x0ee5052b, 0xf3c48b8a, 0xa50bda1a, ++ 0xff5b50fd, 0xadd9473e, 0x1adf6499, 0xf9c2e9d7, 0x13e7ca3c, 0x4d0d5f09, ++ 0xf7f42cdd, 0xdf8d2241, 0x1ec8bbb0, 0x13ca6efa, 0x7fa48a99, 0x104b71fb, ++ 0x174b97df, 0x2dced3ff, 0xabccf433, 0xa11d7c80, 0xcbdeb8f8, 0x9f3bfeb8, ++ 0x90ba5275, 0x61ea5375, 0x12c2fefc, 0x1974a4e6, 0xe49a5373, 0xf704fcf0, ++ 0x3bb19777, 0x5f4de299, 0xd23866fd, 0xc61bd9cd, 0xe24c62b6, 0x691bf2d5, ++ 0x7caebef5, 0x68ff7f07, 0x447f37c7, 0xa1faecfa, 0xc6f8b2f1, 0xa7aeb113, ++ 0xc7f8c333, 0xe7aa577f, 0xaff696f7, 0x69517921, 0x04d86de7, 0x4d8b77ee, ++ 0x13fda2c9, 0x9b299be4, 0xff44df24, 0x754f88f1, 0xa565fe3c, 0xb700ef42, ++ 0xc5b47407, 0xf2cf2c46, 0xb5b2efe1, 0x23e5e76f, 0x0a7ce2ea, 0x898c47e4, ++ 0xc5b7e5e2, 0xc9bef0f9, 0x7da01602, 0x9b6f08b9, 0x123ef1e8, 0x9df28be7, ++ 0x6411387d, 0x797ed02b, 0x9bdf8587, 0xc8418160, 0xfcf0f3ff, 0x7e7ce614, ++ 0x91f7ec41, 0x8fdf9cd9, 0x43db532c, 0x05e514de, 0x81acb28e, 0xe81b0e90, ++ 0x6bfb803a, 0xc6e77c64, 0x1da2169f, 0x2fd0c748, 0x3b98c5f3, 0xdb298fc9, ++ 0xbd9475cd, 0x2ab6f583, 0xbbdfbe3c, 0x661bdc5b, 0xfea1c9dd, 0xf94724b0, ++ 0x23e708fb, 0x4514bfa8, 0x4efe2b86, 0x79cc3ba0, 0x8e8bc651, 0xd91b33c4, ++ 0x7bbd19e5, 0xf9e155b6, 0x37f59993, 0xbe4e1bad, 0xc7ea2f03, 0xcf9e1d73, ++ 0x2691bc70, 0xe9fdf0c6, 0xfb8b9fee, 0x1331ac6b, 0x9e2ba2ed, 0xbf50eb32, ++ 0x31c410f8, 0x08f9e7de, 0x7e98dbce, 0x4c66e70c, 0x66e702ff, 0x73853f4c, ++ 0xc39fa633, 0xe5d319b9, 0x08f89de7, 0xd03f5b38, 0x5bae0df5, 0xf3b4f7fa, ++ 0xcb932afd, 0x77f1decd, 0x02fc689b, 0xdbe08787, 0x8c9def8b, 0x6b75cf7e, ++ 0xfc7a775c, 0x6bade845, 0x3d323ff7, 0x1bdaf061, 0x8f84ab47, 0xe6253b5b, ++ 0x40ddb791, 0x3daf3ff2, 0x521d5b10, 0x89a06a2f, 0x71d88fda, 0x3ffb162c, ++ 0xaf85ef67, 0xcf25814b, 0xd47cf1d0, 0xad3775c0, 0x70ecfe43, 0xa22c0d65, ++ 0x34c36e7d, 0x0f0ffdaf, 0xe82a3de2, 0xba22e29f, 0xe987ee94, 0x8759a0bc, ++ 0x5d720e16, 0x373ae35b, 0x3badfb62, 0xc02571b2, 0x37df1877, 0xb84a4748, ++ 0xf5a5aef5, 0x2eee64dc, 0x3741fbc4, 0x8d87d05d, 0x94702ecb, 0x843b9c12, ++ 0xf7ebdcbe, 0xf125f416, 0xb7f75df6, 0xdf263fb6, 0xea5e4151, 0x6df4b940, ++ 0x9585ea2c, 0x7da07e22, 0xd3dfa0fb, 0x7a83b37d, 0x479bf786, 0xdff7abc6, ++ 0xff7c81ec, 0x6ec474c9, 0xb5f11b93, 0x41f1f775, 0xe030def8, 0xa872d067, ++ 0x60e0613f, 0x11977dd5, 0xfc7ebe63, 0x9f5489a7, 0x2e757f7e, 0x718154db, ++ 0x7b2cf332, 0x2d25c4df, 0x815a7fb0, 0x528b3271, 0x2e980395, 0xc44d6476, ++ 0xbf7918f8, 0xe96e6960, 0xd352dc01, 0xcfa4959c, 0x09932295, 0x96e50f91, ++ 0xb958f118, 0xaa094794, 0xfed4a4fc, 0x1c53faaa, 0xa9f2aa39, 0xe554c3b9, ++ 0xce69dc72, 0x237aaa51, 0xf1b3bbe3, 0xe0eb073c, 0xc33fa7ef, 0xb11f0fdf, ++ 0xc38df0e3, 0xd9e33f20, 0xc95de99b, 0xc67ca2ad, 0xc43ee5cb, 0xd3c01747, ++ 0x89d50a04, 0xfe1efb92, 0x39a67629, 0x7eeed42f, 0x71cb80fa, 0x4b85e719, ++ 0xbd22139c, 0x6bdb2c87, 0x37c009cf, 0x39be441f, 0x76d9d5f2, 0x1d6ed3f4, ++ 0xc63a75f3, 0x503ede9f, 0x44887e7d, 0x43fbbd37, 0xf43efc71, 0x6e96a29e, ++ 0xd047bb18, 0x1c674f21, 0xaef1f7e2, 0x15fdaf94, 0x0bd91af9, 0x88bf62bc, ++ 0x1bdf6354, 0xfefe7269, 0xbd47b40e, 0x491bc7a7, 0xab24f7bd, 0x20fadff1, ++ 0x9b65b3bd, 0xa44b4dee, 0x87d45eef, 0xefbd85eb, 0xdec281c5, 0xdef7bb5e, ++ 0x3960c2b4, 0xaaa9f35b, 0x595bbb3e, 0xcbafcaaf, 0x2fefe752, 0x3eda1f5d, ++ 0xfd563e92, 0x679362e8, 0x55abde04, 0x6e9efec2, 0x05127cef, 0x82bdd85f, ++ 0xbdf1ecf8, 0xb377e92b, 0xa1ebf5b5, 0x5653b43f, 0x92b39047, 0xf3d5cd3f, ++ 0xe5b5c9f7, 0x54540daf, 0xb574abbf, 0x6010fbc6, 0xbf94f14f, 0xc3f7f2e1, ++ 0x28531e7e, 0xe3101c9d, 0x81ec7d9e, 0xe01dfe1f, 0x3f277676, 0xe38d9d57, ++ 0xfb6f2372, 0xa41d3a17, 0x7d39a323, 0x3a03d9e5, 0x355d4794, 0x3fbc5e31, ++ 0x46d2b0d1, 0xb323af71, 0xc964ffbb, 0xe068fd07, 0x00589fd9, 0x4bc67fcf, ++ 0xb8f221a8, 0x90590f0b, 0xce2ff3ff, 0xc3663c90, 0xd5d19c79, 0x419fe75a, ++ 0x5ab92337, 0x42c5f9c6, 0xaf213fa4, 0x86abec18, 0xfcaf597b, 0x7082fe42, ++ 0x477338a1, 0x867feff7, 0x39b7d176, 0xc23b40bf, 0x5c07d23c, 0xa17db556, ++ 0xe85bbf8d, 0xd513efe0, 0xf891ef88, 0xadfdaac7, 0x5e5f3c26, 0x8ff1fe6d, ++ 0x775ee281, 0x68713e64, 0x61b1e02a, 0xd157bf27, 0x1fb831d3, 0x5a1be10b, ++ 0xaa3c35f8, 0xfffdfda3, 0x8dc7d501, 0x00800021, 0x00000000, 0x00088b1f, ++ 0x00000000, 0x58b5ff00, 0xd554700d, 0xdf6f3e15, 0x926c85fe, 0x23640fcd, ++ 0xd5ddbc24, 0xaf242110, 0x12489bf9, 0xa942125d, 0x48a0dd5a, 0x513ea2c6, ++ 0x9adfc811, 0xcda28da0, 0x83bf2ba3, 0xf8aad535, 0x945a2e37, 0x234d6819, ++ 0xb824193a, 0x3ac15194, 0xd420feba, 0xd5359866, 0x4d924a18, 0x9d4e2b51, ++ 0xfbdce7a1, 0x042fbb1e, 0x861b4eab, 0xef7b9c9c, 0xef9cf7bb, 0xee73dcfc, ++ 0x73f83399, 0x3ed8c019, 0x10a85171, 0x79e3cc00, 0xce01730d, 0xeb00e368, ++ 0x3891ca00, 0x0d304df3, 0x7f89dda0, 0xbe6b484b, 0x48650c5e, 0x0200cdfb, ++ 0x0a982d8e, 0x4eff1390, 0x4c9b6da7, 0xf9c69520, 0x56dbf717, 0x2fb41c86, ++ 0x4e62fdb0, 0xf71437f6, 0xbf31957f, 0x2475d390, 0x73f37407, 0x8fcf3c61, ++ 0xc015ccf2, 0x41e78592, 0x40ef2083, 0xbb3fa472, 0x0a915216, 0xd84a9610, ++ 0x2bdad716, 0xdbe1ae00, 0x3203b8d1, 0x81570ff0, 0x0c59ce99, 0x2a6bee5c, ++ 0x808df2ff, 0x5fe92ddf, 0x004a1172, 0x7e59ed1f, 0xb35387c4, 0xaa002f25, ++ 0x0b5414b0, 0xba7df888, 0xe503b73f, 0x6e144abc, 0x3f1217f2, 0xf9e0223e, ++ 0x85926a47, 0xbff6c0a0, 0xf5d7f69f, 0xe7f1623a, 0x0b5e9806, 0x0805439c, ++ 0x78b66f89, 0x3c5cf926, 0x819ab8e2, 0x19cfd1d6, 0xecab7e91, 0xdef17afc, ++ 0x016457f9, 0x4e065a9c, 0xb57bca1b, 0x1e403e08, 0x7685b35e, 0xfc7d49b8, ++ 0x55c412fb, 0x9c906488, 0xd5c5a553, 0xdd94e212, 0x67301bf9, 0x7686e026, ++ 0xedc4a7f4, 0xae78e3a2, 0xd5b9fa1c, 0x77ea1f11, 0xdb20a76a, 0x9655b470, ++ 0x6b7fb4ac, 0x9647c9f5, 0x11adf9e2, 0x9e501651, 0x8e077de5, 0x5d3d7e11, ++ 0x10be603d, 0x8fabb7a0, 0x4776e5d1, 0x7a622c58, 0xc80b460d, 0x6bd302b8, ++ 0x3d33c6b5, 0xb8f9f1dd, 0x4df813de, 0xbcb39196, 0x54c9e007, 0xca1275ff, ++ 0x2fbee6b7, 0x69252c8e, 0x0fa75637, 0x6bee01cd, 0x17f2e333, 0x281c015b, ++ 0xe48ef8ff, 0x1cecb3d0, 0xb88ad7f4, 0x9fd89ebf, 0xe703b47f, 0x6165bc4f, ++ 0xe6b07aee, 0x91bbb1b1, 0x9923b35f, 0x03227ce1, 0x7f9a1cd4, 0xc5485676, ++ 0xc69bb705, 0xf7083a07, 0x077914de, 0xf4fe7fce, 0x91bb5dac, 0x22ebb55f, ++ 0xdb6cc499, 0x788d7e86, 0x0c8b9e7f, 0xc394bf8d, 0x3f1703be, 0x9f9d8577, ++ 0xf730be2b, 0x7f9a6ac1, 0x73a65321, 0x3f0dfb74, 0xc403e49d, 0x17082beb, ++ 0x4ef5d139, 0x0990ea0a, 0xed326e37, 0x5fa02e3e, 0xbf2ab42e, 0x7eaebb24, ++ 0x551f4fe2, 0x2f753ea1, 0x4bb1fcfc, 0x1f55be50, 0x27da054c, 0x471e576e, ++ 0xf579daed, 0x51a9b7e2, 0xfb53d7f4, 0x185069bc, 0x6769a7c7, 0xbb53f392, ++ 0x6ffe2b86, 0xf03749e9, 0xce397d6d, 0x7ce20b4f, 0xa18c7013, 0x3e933059, ++ 0x355c5acd, 0x48fb949b, 0x328816ae, 0xadc440ff, 0xa22557e4, 0x307ca3e0, ++ 0xe18d80fe, 0x1ecfd13f, 0x2fcc4c91, 0xf4a04d9b, 0x64949c60, 0x7145dd82, ++ 0x62fc70ab, 0x767acc0f, 0x07f3620b, 0xfb8f4329, 0x1373c5fc, 0xf5a073fd, ++ 0x6dcff255, 0x239fe636, 0x72e2c049, 0xa5db39e2, 0x0afdf674, 0x1e2c97fb, ++ 0xced6f1f4, 0x10be46d3, 0x4aef947c, 0x1de95282, 0xbb343b48, 0xdffe5d04, ++ 0xeeadbf93, 0x6f2bedf9, 0xba9f3c33, 0xf73a63eb, 0x0fd98390, 0xc7b8e6de, ++ 0x3d246804, 0xd856fdf4, 0x4a5cc1c7, 0xf2676ef2, 0x8f43e3ea, 0x70522d1f, ++ 0xe797a1ff, 0xf3fa0114, 0xf4323172, 0x9633e224, 0x16be3912, 0xf7a1ef69, ++ 0x738e29a7, 0x3cee6de5, 0xf9d3f6c5, 0xa1e78111, 0xc703d266, 0x5eff1e43, ++ 0xcf39c589, 0xe65b830f, 0xc5eafc32, 0x7fb234c2, 0xbe5184ec, 0xfbea7289, ++ 0xfbe9f2eb, 0x910eebeb, 0x518f50bd, 0x0328a46b, 0x93cfafc7, 0xa68d7a0c, ++ 0x1dd28a46, 0xebe4ee34, 0xf04f9032, 0x13fa46b7, 0xc768dbed, 0x35f28dbc, ++ 0x10720a36, 0x794ab8d8, 0xc1586913, 0x5ed766f9, 0xdbf0370d, 0x68978fd1, ++ 0x9959067e, 0x05aeefcc, 0xb44bd7ee, 0xf43d7dbc, 0xe5e30058, 0x9ddd6998, ++ 0x91bff456, 0x4a2d879e, 0x3f55de62, 0xf3999d36, 0x5aaef3c3, 0xbf94050b, ++ 0xd50e9d47, 0x40798c54, 0x1443cc12, 0x4b90b91f, 0x0e5e70eb, 0xbda81fa3, ++ 0xf2883936, 0x8ff2633c, 0xd6cdfe12, 0x81c51170, 0x2633ddfe, 0x088f8d85, ++ 0x7b20af6f, 0x445c3983, 0x6e963879, 0xe90d2105, 0x43e23954, 0x80afd43c, ++ 0x059895e5, 0xdcf17b1a, 0xa0533ab2, 0x87cf11d7, 0x9b2cfe7a, 0x6b88e383, ++ 0xf1eb8d0d, 0x56537e8a, 0xd71f5c6c, 0x716fc8c7, 0xcb2bb8f3, 0x267a0534, ++ 0xda999789, 0x447a107c, 0x1efccf1e, 0x0770d2ad, 0x5f9489f0, 0x55be355a, ++ 0x54b1f3cb, 0x3ea22abb, 0x2ed0fb55, 0xc39957c8, 0x16628807, 0xefb44e80, ++ 0xfdf3083c, 0x9cf98cfa, 0xec6590ee, 0xeec39e5e, 0xb99a79e5, 0x20010837, ++ 0xfee9dabb, 0x8845ba42, 0x852f4488, 0xe07d4671, 0x33451334, 0xfc00ba30, ++ 0x00842e8c, 0x9ba08ba3, 0x87a1cbd1, 0xc2212bd1, 0x070ecc28, 0xf707dd81, ++ 0x3ef0873a, 0x6edd9f86, 0x6cb97ba2, 0x8b260429, 0xf7375a8f, 0x81e3f3fb, ++ 0xc7e2be59, 0x1410b1e3, 0x7ceb9317, 0x6028ccb8, 0x62e3af7e, 0xefc4ff23, ++ 0x22e42092, 0xb651035a, 0xc8e465cf, 0x907ccfb8, 0x81d7c4cc, 0xdff5f18f, ++ 0xa8ca8f13, 0x270a5662, 0x726ea5c1, 0xc342b93f, 0x596118e5, 0xea97b71e, ++ 0xdbaf1896, 0x8b93330d, 0xed7383ee, 0x67247909, 0x17ed7259, 0x958ca612, ++ 0x337e5dee, 0xd2b2d1e6, 0xf22f0eda, 0x957f6f77, 0x2fb555f3, 0xeb5f9079, ++ 0x717ce7ee, 0xc645a96d, 0xefd8542a, 0x1dbc805f, 0xe2127f93, 0xa8457a24, ++ 0xa524aa44, 0x9dc60116, 0x33af744d, 0xd6d95c63, 0x4a33cb02, 0xd5844012, ++ 0x1465e8b3, 0x7ebc8d27, 0x76e4e35d, 0x96556adb, 0xb31ee9bb, 0xc4255387, ++ 0xfabacd7f, 0x372fba6c, 0x9ffef95a, 0xbce6954c, 0xf0daba8a, 0x5c497b3c, ++ 0x93579c4f, 0x520a8f90, 0x7e3ba747, 0x2f38f7fe, 0xb9e75df0, 0x6e9dca5d, ++ 0xf9ec17c4, 0xae9ff640, 0xbdbde7dd, 0xa26cb255, 0xfcec9df3, 0x477e4a68, ++ 0xe1dd4e27, 0x3eb4abf2, 0x4efdc296, 0x3d4cbb25, 0xf6e5dd3f, 0x9fce8afd, ++ 0xf75b1e38, 0xca612bf5, 0x20a19f43, 0xdcefcfb8, 0xd75a7aca, 0x95e68a66, ++ 0x9d7ebda2, 0x7e4adc7c, 0x80b1fba2, 0xfa865bc6, 0xb2107d07, 0x76a8f8b2, ++ 0xbcc7ad9e, 0xdd8838f1, 0x2e21fb86, 0x9d7f7e65, 0x1a2ba705, 0x56890703, ++ 0x3875dd2a, 0xc43ce743, 0x57c711ce, 0xa58c5f90, 0x8cfd607f, 0xee0ce9c5, ++ 0xeafe5a8f, 0xed787fdf, 0x21face74, 0xf6db0e21, 0xbfaff37f, 0x4edbbda1, ++ 0x5e5a6439, 0x0ef1efb5, 0xf8f407ea, 0x90d06ac3, 0x9c78f45f, 0x8b0b67d7, ++ 0xb7c5dd6c, 0x0f9afad1, 0xa794bc06, 0x06881b2f, 0xf58e5ca9, 0xe3ce9d1f, ++ 0xbfe3af42, 0x7dcc7e16, 0x52522f52, 0x65ecbac7, 0xbd436431, 0xd0bea9da, ++ 0x73fec278, 0x1a4dfa3b, 0x7239f7ad, 0x9a95af50, 0x5f872d5e, 0x825f52b7, ++ 0xefa4a8db, 0x95fe4d2a, 0x2572dd4f, 0x42ab8bd5, 0x803df896, 0x42069bff, ++ 0xa6ee481b, 0xca71c69d, 0x9b7fa498, 0xd5337df6, 0xfbaa5e6b, 0x60daeb8c, ++ 0x7f293feb, 0xc719f5b5, 0x64a7775f, 0xf76abb31, 0xe675681f, 0xd21adaed, ++ 0x3ffac1cf, 0xba86c86b, 0x21dd3fb5, 0x75cf893b, 0x9edf2cc8, 0x58fccf5e, ++ 0x654f0f5f, 0xe3d11f32, 0x6026d576, 0x638eb3f5, 0x1f36f3f1, 0xf9f8a3d9, ++ 0x6317566c, 0x11eacf3d, 0xefcc27cc, 0x0113118b, 0xf4c5eefd, 0xcf098f71, ++ 0x40bfb179, 0x6f7b7aa6, 0x7efe0f97, 0xbd3e5c61, 0x7717afde, 0x8fa959d7, ++ 0x28fb15ba, 0xfc3f6a1c, 0x7c8ed05c, 0x15a066fb, 0x1a415a28, 0x87e54dd5, ++ 0x3ed10844, 0x1ab87a10, 0xcb4538a9, 0xefac2e27, 0x9248f013, 0x509480a6, ++ 0xdaf8eb1f, 0x1725bb34, 0x53e61864, 0xdf0c0be4, 0x8c7a55a7, 0x48beabdf, ++ 0x73e50561, 0x6fba7dfe, 0x507d61b6, 0xf261c808, 0xc3fe2899, 0x8c1ad575, ++ 0x57958e35, 0x8b994e12, 0x37eb0c4a, 0x443c2ea6, 0xa5fd5dfe, 0x041f8279, ++ 0xaabbf244, 0x6813c028, 0xc6237997, 0xbb0ff2f9, 0x4fcf1521, 0x6ea130fa, ++ 0xa055bf60, 0x1926c5ba, 0xf41eedc7, 0x19b80a0b, 0x2fd12330, 0xbf73b8e2, ++ 0x626c353f, 0x1701517e, 0x465d563e, 0x24205b38, 0x29db8b9d, 0x61deb4a2, ++ 0xef317165, 0xf94c8770, 0x88dfaa68, 0x11a3767f, 0x88c51cff, 0x4695f4f7, ++ 0x460373bc, 0x1a7667bc, 0x46ab75f1, 0xe69bbcfc, 0xd45fd619, 0x67e06b5d, ++ 0xb0dcbb6d, 0x62d0e2fe, 0xe7673f03, 0x73f586f5, 0xe61b967b, 0x1b56fb8b, ++ 0x9b3f75e6, 0x093f07e8, 0x33f04fb7, 0xec129813, 0xf759dbaf, 0xf743d283, ++ 0x7ff9ce18, 0x47917fdb, 0xfd9a0bcb, 0x03d5aa7f, 0x6f0ea4ef, 0x2abd70a5, ++ 0xb3b5e799, 0x16d509ef, 0x2bbdafd6, 0xd0a5d665, 0xf37eed5a, 0x1c1bf76b, ++ 0x2779ccda, 0x7c88e5e7, 0xc959f290, 0xc91d7f31, 0x1c0d1655, 0x62a13544, ++ 0x8d2ebbb8, 0x7240fbd6, 0x4e4fe34e, 0x4aeafeb4, 0xb886cc01, 0x1c5a7e42, ++ 0x75d46bcf, 0xae2e1a62, 0x641436fa, 0xbe8296e9, 0x241efe22, 0xa2fbf254, ++ 0xe60497c1, 0x2a6a5c04, 0x90a47bf5, 0xbf8eabf9, 0xfd847efe, 0x1fa95800, ++ 0x4143d930, 0x8ef564f7, 0xf5644dbc, 0xb3eac298, 0xbd850537, 0x8f6b5d2b, ++ 0x777e51e4, 0x1eed2b67, 0x24cc6dc4, 0x139eac4b, 0x2a5241a2, 0x4bb18a46, ++ 0x1f06d2eb, 0xced871f5, 0x0f0005c2, 0xd41aaa99, 0x33be2642, 0x66dbc15a, ++ 0x28f2e9fa, 0xdf783d6b, 0x0dce0a0c, 0x3bedf8a5, 0xd1e64ef3, 0x111365fd, ++ 0x3f7a1289, 0xf347ddf1, 0xb24ddf67, 0xb7cc3f51, 0x12a49351, 0x023dea14, ++ 0xd24e43eb, 0xc4249766, 0xbb0b26ef, 0xcbeb40b7, 0xd2f0d06e, 0xda65b2fb, ++ 0xc5b883f9, 0x37e7cc4a, 0x70c9bdf4, 0x688d7269, 0xd90150ef, 0x32dffb89, ++ 0x7d4251c3, 0x654af829, 0x7debcfde, 0x87f174da, 0x5f7aabdc, 0x4df5be7b, ++ 0xbf4361ae, 0x2733bb0c, 0xf89c8f7d, 0x9bd715ee, 0x39b83fef, 0x8343dd99, ++ 0xfbd9739b, 0x31ff7c62, 0x810dffb6, 0x727e0cf7, 0x0d5fe753, 0xfab377fe, ++ 0x9a3e6189, 0x8e996e35, 0xc95f47fa, 0xc40bf859, 0x5b65f46f, 0x68abf505, ++ 0x424f5eb7, 0x607d1d3f, 0xef3a02d6, 0x0ff9ebbf, 0x5740ef86, 0xe9bbbd84, ++ 0x3aef1e7a, 0x5768f8c6, 0x7a89d194, 0x4eadfdea, 0x02867fad, 0x85c797aa, ++ 0xef64f229, 0x797a9735, 0x7f303fbd, 0xc7dd2d5a, 0x3356b903, 0xcf9cf9a7, ++ 0x7e73b4a9, 0x31a222e1, 0xf513638b, 0xf80203b7, 0x6587f404, 0x9bc7f482, ++ 0x4f7fdf71, 0x3f25de53, 0x5e3d5b6f, 0x6878c664, 0x28de8e2b, 0xa7d73da0, ++ 0xfe93ef2b, 0x39831602, 0x7cce4c19, 0x4d861bea, 0xb980916a, 0x4db9fd20, ++ 0x277a660d, 0xd18ea29b, 0xbde49d8d, 0x81fa81bf, 0x8f8f2b61, 0x83736f1c, ++ 0x701c7a8a, 0xffcc032a, 0xfc98624d, 0x842bdd56, 0x8b7f3076, 0xc4a7175a, ++ 0x6bdfd1f5, 0xfea6dfa8, 0xe9c49626, 0xe9811ea7, 0xf2d119f9, 0xc3d6fd38, ++ 0x978e5af3, 0x6b717ad3, 0xdec590be, 0x02e2809f, 0x1d51f3cf, 0xefe7eea2, ++ 0x0750d3b2, 0x7ab06baa, 0xc942fd63, 0xe530b66b, 0xe75dfd0f, 0xcecdc7b4, ++ 0xf7f2f2c9, 0x6d07ac9a, 0xdfbb20a1, 0x280d7923, 0xeb05b767, 0x3e1bea1d, ++ 0x368ef604, 0x0961ef4a, 0xe1ed3976, 0x0adc3a7d, 0xb7b3e7c0, 0xe1cb7cd3, ++ 0x4f94e3c1, 0xc3251e42, 0x2a9070cb, 0xa4b49f28, 0xdef5601e, 0xcfddf0ff, ++ 0xd8b7fb4e, 0xd53ebca3, 0x87cefdde, 0x916de8cf, 0x3bd90b47, 0x72479c97, ++ 0x72e972e8, 0x72e8b8ea, 0x6ef9f7c6, 0xafdfd7ff, 0xf1e87e74, 0x4f14f98d, ++ 0x577f3f88, 0x169b8514, 0xb97df24f, 0xe835db97, 0xfe744bf2, 0xdf7f00ea, ++ 0xf747fb8b, 0x3e531f5d, 0xf960ec3c, 0x4fdf7cf0, 0xff65b3d4, 0xea078661, ++ 0x97e92379, 0xa25167a0, 0x47fda39e, 0x7e942d1f, 0xdcb17ebc, 0x8d6f7b08, ++ 0x4f26ff6d, 0xf65befc2, 0xfc8c79bd, 0x777f45ab, 0x4f7c63df, 0x3ec14db0, ++ 0xf7b26335, 0x1265bc72, 0xfe9b2fea, 0xf1b30cfd, 0xde81547b, 0xae28fba3, ++ 0x7bc14ea9, 0xbf41fc97, 0xfd68f777, 0x837d108b, 0x8f3a7de5, 0xa0837efc, ++ 0x7f4ffbb2, 0x780a08af, 0x956d91bf, 0x881f760e, 0xf9321d33, 0xc1f41eed, ++ 0xd9bbf908, 0xa9decc97, 0xafcbf427, 0x08eb955b, 0xd5ef35bf, 0xdd3f5366, ++ 0x5ae5d6fb, 0xa3efc65f, 0xcb2fcd72, 0xbf927ce9, 0x6bf98d30, 0x855f2699, ++ 0x0f1eeb1d, 0xe45576a5, 0x3bda12ef, 0x0c37e6c7, 0x007fdcfd, 0x9e7336ce, ++ 0x00001b00 + }; + + static const u32 usem_int_table_data_e1[] = { +- 0x00088b1f, 0x00000000, 0x51fbff00, 0x03f0c0cf, 0x33ab678a, 0x32ea7830, +- 0x31e9c830, 0x43d24c30, 0xb712d388, 0x9fa65173, 0x8181859d, 0x81b98813, +- 0x5f881798, 0xbc303231, 0xff5e2466, 0x3b046147, 0xe181804b, 0x0b6f9013, +- 0x32089fa4, 0xb2075c30, 0x0371033f, 0x88073f90, 0x35b10057, 0x480fbf90, +- 0xa3e204df, 0x1845fc40, 0x095ff9bf, 0x42156fc8, 0xe3443fe5, 0xafc4159f, +- 0xf980825f, 0xb1e40472, 0xe42269e1, 0x0a6dc7c7, 0xde040ef4, 0x67ca86a6, +- 0xe0606553, 0xaac58a07, 0x91dbf843, 0x6281f3e4, 0xf610aaec, 0x8606396b, +- 0x1db9405f, 0x7dcdd86a, 0x0dff9403, 0x9a86ab94, 0xf1b90003, 0x03685054, +- 0x00000368 ++ 0x00088b1f, 0x00000000, 0x51fbff00, 0x03f0c0cf, 0x18140b8a, 0x18d57c18, ++ 0x19d57218, 0x23aa1e18, 0x0f8969c4, 0xdfa65173, 0xc181859c, 0x81ad8812, ++ 0xdf8816d8, 0xbc303231, 0x7f5e2467, 0xbd8208a3, 0xa181805f, 0x076fc809, ++ 0x0c4229d2, 0x7640e90c, 0x055f1033, 0xf1023ff2, 0x2d3e205f, 0x2a20c0cc, ++ 0x0c60c0c8, 0xdc4032c4, 0xfcdf8222, 0xa6f20256, 0x44fca8c2, 0x10afbe34, ++ 0x840bfd7e, 0x23afcbf1, 0xfb0d8f20, 0x1f1f926a, 0x3bd02893, 0x1e43b810, ++ 0x964b7f95, 0x1cb9e181, 0x02818303, 0x2489df84, 0xbb1404ef, 0x6f610b2d, ++ 0x38606714, 0x92eb9403, 0x26ee6ec7, 0xa059fca0, 0x1cd41f9c, 0xc9488100, ++ 0x00036836, 0x00000000 + }; + + static const u32 usem_pram_data_e1[] = { +- 0x00088b1f, 0x00000000, 0x7dedff00, 0x45547809, 0xbedd70b6, 0xe9d3bb7d, +- 0x84849d25, 0x1674b090, 0x26c43510, 0x630a0840, 0x944c2127, 0x615151a8, +- 0x8408ec44, 0xf9707d90, 0x37d7d470, 0xdf95012c, 0x3e30eb89, 0x0e0c1a74, +- 0x1036a0c3, 0xc6c06a30, 0x680e8300, 0x8cc08378, 0x364584cb, 0x5c710921, +- 0x7f9e6466, 0xbb75539d, 0x48e9bdef, 0x9bdffc74, 0x3f6fef37, 0x556ea2bf, +- 0x5b3aaa9d, 0xaa753a9d, 0x42049462, 0x1be426ae, 0x71f4d1f8, 0x10921091, +- 0x69f2bb4e, 0xb910963a, 0x96bfca27, 0xff6e0d56, 0x401904fa, 0x5be6b9c8, +- 0x4254e65c, 0xc1513d3c, 0x39f969ab, 0x4cdf9e7f, 0xbcb60bcb, 0x7cd230ef, +- 0x08d116f5, 0x16ed86e5, 0x4ab9df6c, 0xd6be43f0, 0x55d8fedc, 0x45bddf34, +- 0x68286b24, 0x2066ceb2, 0x889c8439, 0xb467ec22, 0x2122481b, 0xad961665, +- 0x1663bd5e, 0x62de57f4, 0xfeda1626, 0x81e8b344, 0x82b582fc, 0xaafed09f, +- 0x4a665b5f, 0xf9e6f0a6, 0x45c58085, 0x371f6bf3, 0x2c84ecb9, 0xa381feda, +- 0x19c846c3, 0x9971145f, 0x81e51e70, 0xfc2a424c, 0xd324a71b, 0x041b15f6, +- 0xafc281b7, 0x13be7558, 0x2cd157c6, 0xbc29170d, 0xe25675ca, 0xfefac91a, +- 0x6d7f4086, 0x2dbfb0c7, 0x57f40652, 0x136ee17e, 0x929e6111, 0xd355da07, +- 0x95bcc071, 0x1af8cf7e, 0x18446b89, 0xa1bfd59f, 0x357ad1fd, 0x986e0b2f, +- 0x78818d62, 0xaf9d1c61, 0x60bfa659, 0x9bd5f983, 0xf3d5d846, 0xf30add28, +- 0x36aff0a8, 0xf8c1b14d, 0x32ca9b56, 0xd72af0c3, 0x515c493d, 0x4cadf1aa, +- 0x9555e81f, 0x3e33d3eb, 0x054f19a2, 0x06c05925, 0x6e9bf678, 0x7efe151c, +- 0x7a458858, 0x3513ae57, 0xf1e529f0, 0xfd3efcbb, 0xbc83c527, 0x9b5feecd, +- 0x02dba61a, 0x2bb7fd27, 0xa71eb74c, 0x1ceec742, 0x7d257c35, 0xc741e80c, +- 0x6273e8d3, 0x092f84fa, 0x2e7ca7d3, 0xbe33d3a4, 0xf4ae9891, 0xb3fbf1b9, +- 0x574c5cbe, 0x3e983cf9, 0xd4c22bef, 0x7ac12bef, 0x31d37c6b, 0xf179f26d, +- 0x72be8bfb, 0xeaf9d74c, 0xdf7afbf0, 0xf8374c42, 0xb2fefc64, 0x01a6396f, +- 0xbe4da74e, 0xfb369895, 0xab6f58fc, 0x2da61d6f, 0x5f7e00be, 0x98e7f1c1, +- 0x748cf248, 0x710f0efe, 0xb8937252, 0x449e4f62, 0x2c2571f3, 0xce53389f, +- 0xa27cd133, 0x3e29e697, 0x7982ab92, 0xae4f9a66, 0x1f43e563, 0x3451f924, +- 0xe566543f, 0xf93c2b69, 0x6b4f9a16, 0x5623e564, 0x34d1f9c9, 0xcacfc23f, +- 0xcc10db2f, 0x65fcd2b7, 0xd59e5601, 0x346c0a4a, 0xf964159f, 0x029ebdec, +- 0xb767cd3b, 0x87ce7cb3, 0xe6838172, 0x7b583a73, 0x1203de3d, 0x6d284d99, +- 0x3c8b959e, 0x6f3441c6, 0x37137722, 0xa37c8bc5, 0xe28138c7, 0xf9617241, +- 0x5827f976, 0xc2e4c9be, 0x367976f2, 0x1e4b3796, 0x572a3f2c, 0xc9b37961, +- 0x917fe583, 0x56fcc5ef, 0xa6e58bc9, 0xfac37ffa, 0x2c5e4d5b, 0x865faa4f, +- 0xc64916f9, 0x1beacbf2, 0x498b7eb1, 0x9627f2c6, 0x9933d2fc, 0xef04fb96, +- 0x8b67c053, 0x49396f05, 0x2409fe07, 0x69fe5095, 0xe074c810, 0xc98107d7, +- 0x20fcd1c6, 0x605dca13, 0x200bce57, 0x001bf8af, 0x1f17b2f9, 0xcf384549, +- 0xc2891c21, 0xc70e2f11, 0x03573bbd, 0x5cbbbdc7, 0xd422f381, 0x1fe96c5b, +- 0x2beec09c, 0x5dd9e3b5, 0x0579c0a1, 0x37fbd8e1, 0x26eff72f, 0xbbf3c76a, +- 0x0b4e052a, 0xdfed89c2, 0xd3ed3678, 0xbed367e2, 0x20767e10, 0x37fa127e, +- 0xb577ec9e, 0x377ec9f8, 0x70779f84, 0x07fa833c, 0x5abbd367, 0x377a6cfc, +- 0xe03f9f84, 0x6ff48678, 0x69efd95e, 0x5efd93f1, 0x221f3f08, 0xc1fed49c, +- 0x8b5f7e69, 0x43f7e69f, 0xe104f9f8, 0xbcdfef0c, 0xe2d41ec6, 0x10c1ec67, +- 0x3f113a7e, 0x4e0ff697, 0x7e2d41f3, 0xf0860f9a, 0x678e25f3, 0x35e6ff54, +- 0x3f1690f6, 0xf0850f63, 0x33800443, 0xd9e37fba, 0x3f1691fa, 0xe10a3f5b, +- 0xc67082c7, 0x393c6ff5, 0x93f16b1f, 0x3f0871f3, 0x42670871, 0xfd6ce0ff, +- 0xad9f8b58, 0x93f0871f, 0xf5267082, 0x7f395e6f, 0xe727e2d6, 0x64fc21cf, +- 0x3e3c9c20, 0xd8e1421e, 0xf2d386fb, 0x2d3f1689, 0x33f0849f, 0xf214e10a, +- 0x4e045cf1, 0x7e2d09ee, 0xf0844f72, 0xae708393, 0x969c1fe9, 0xb4fc5a13, +- 0xe7e1089c, 0x5d73846a, 0x7b95e6ff, 0xdc9f8b52, 0xa33f0c93, 0xc1b496f7, +- 0x40d7437a, 0x4c9b48b7, 0x08f1ee38, 0x64e8beb4, 0x26e9d179, 0x8a888760, +- 0x3dda417d, 0xdb6fad22, 0x08fd9b10, 0xf919db51, 0xec78c037, 0xdb52fad4, +- 0xd1b93119, 0xd62bbb1a, 0xc7c9a713, 0xea6b2517, 0x69a49427, 0xbf4e07ca, +- 0xc83e534c, 0xa7c9ad9b, 0xa9a95f94, 0x5f2ea43f, 0xf0b61f93, 0x54fd4d5a, +- 0x3e4d26f9, 0x344ff97d, 0xde3787f5, 0x64bf29a5, 0xfca68565, 0x4d02ff52, +- 0x3f75f2fe, 0x151fd4d3, 0xbf29a458, 0x4d11e5a2, 0x13e0e8f9, 0x3d98fc9a, +- 0x8fea6acf, 0x29a35f6b, 0xbd787f1f, 0xc7427ca6, 0x529e4d26, 0x72e279c2, +- 0xcf81179e, 0x07ebb309, 0x0b9ed099, 0x37984dda, 0x4ed0db25, 0x5ccbda0f, +- 0x4d1d29c7, 0x006baf06, 0x8486814d, 0xc979dbae, 0x507497e5, 0xa577df3a, +- 0xfd2712f7, 0x7bc99f7e, 0xfd823385, 0x902fe949, 0x065d4824, 0xcbe5f548, +- 0xf97fc624, 0x1c461729, 0x0d6beda1, 0x696223dd, 0xf790cbbe, 0xf1f94094, +- 0x7c80c159, 0x3a922d19, 0x266d17a8, 0x4b2ff768, 0x564179cd, 0x21f2e7f1, +- 0x3084ee54, 0x3792e5dc, 0xe78aec09, 0xc193dfeb, 0x421868ce, 0xc84c95e7, +- 0x82f784af, 0x3f6d0672, 0x4bc92ca4, 0xd44d99e1, 0x6ff7570e, 0x6267fda2, +- 0xffd04dff, 0x37fa3efa, 0xfa6ae5a7, 0xae5a1a8f, 0x44ca3fe9, 0x3b5277fb, +- 0xef10feb3, 0x4ae9129f, 0x0e115e42, 0xa1e6ff61, 0x32ffd8e5, 0xa88fdd13, +- 0xf50e8ffb, 0xf1f20cdf, 0x109ff43a, 0x5769fe61, 0xb43fe76a, 0x137f3b42, +- 0xfaf6ff9b, 0xa3fef33f, 0x0a6ffe71, 0x1ff3667f, 0x6fe6c15a, 0xfd437066, +- 0xdff8423b, 0xa77ff309, 0x4fa7f9af, 0x587fced4, 0x66fe7695, 0xf5bbffd6, +- 0x36ff7927, 0xe13dffec, 0xb0ff9b24, 0x64dfec2a, 0x7f81baf6, 0x75d1294c, +- 0x193fda7e, 0x40d1154c, 0x0fda1760, 0x28e323a4, 0xb0f21313, 0xb8e38690, +- 0xdbf19a2f, 0xdf94d117, 0x88c8bf50, 0x9aa7e21f, 0x6a43ee8c, 0x6e542cb8, +- 0x1e8133c8, 0x1fba72c2, 0x3a87cb99, 0xfe4445a7, 0xfd994f26, 0x3b78e9c3, +- 0xf219445b, 0xe49a9e73, 0x6b577d07, 0x40967726, 0xc209233b, 0x1e9e4ff7, +- 0x2f3d46b5, 0x51b73a7d, 0x91a1d13a, 0x391e362f, 0xa3ac8c9f, 0x26042be3, +- 0x9fce1718, 0x421dfba0, 0xe94711f7, 0x93d2027e, 0x7e8fed12, 0x43f74e3f, +- 0x9b96a4c4, 0x64476c7a, 0x7419fbcf, 0xe512b7fc, 0xde79c1e7, 0xe1452281, +- 0x4ffe1919, 0xd0357dd0, 0x95a36e63, 0x1e3c3f22, 0x6f9c1f3a, 0x5fe0a977, +- 0xd2bc7023, 0xf6f1b7f6, 0xe147c604, 0x36b272cf, 0x0f72511f, 0xb79f28a2, +- 0x67035e32, 0x4d2ff106, 0x5f6feda2, 0xb42243b1, 0x74a141ce, 0x97e002c8, +- 0xc4122407, 0x0247647d, 0x40cce4c9, 0x0c9d7be1, 0xa5d36dfe, 0x382a1de3, +- 0x4f28a4b3, 0xaccf1d09, 0xef1c45fb, 0xbcb6af0c, 0x63d5bb63, 0xcae9a2c8, +- 0x494224cf, 0xb6b97b7e, 0x6d3a8efc, 0xda85cefe, 0x098f9d3c, 0x5952b5d6, +- 0x874e9dff, 0xd0aef3ce, 0x69c4e9bc, 0x9b2f367e, 0x35925cbd, 0x686d8474, +- 0x034f2f0e, 0x13c413b4, 0x5def4fb6, 0x2681f29f, 0x0ea56f3f, 0xff8be71e, +- 0xddffff4f, 0xc96daff4, 0x1aae3f8b, 0x9ae07557, 0x7aaae3f8, 0xd46eeb95, +- 0x67fbe7e4, 0x5bcfea68, 0x9f29aa59, 0x535f38db, 0x4ff97b3e, 0xf952f935, +- 0x3bfd4d7e, 0xca6bd617, 0x587ba8ef, 0xf97b7e53, 0x0cfc9ae3, 0xf5352fef, +- 0x5abe9b6f, 0x9f6c2e53, 0xd703ac3f, 0x41b0ef4d, 0xa3fc0fe0, 0x299f0099, +- 0xfbf0acfc, 0xa6125f29, 0x4c2e7c67, 0x530f41eb, 0x8d786efd, 0x4a6bb5a5, +- 0x573e8187, 0x54a4fff8, 0xa5f41437, 0xfaf59f9e, 0xf4a7cf57, 0xcec91297, +- 0x812ad250, 0xd63ac094, 0xe55eedc5, 0xcebe39fb, 0xd308b211, 0xcb93132a, +- 0xf2834daa, 0xc1f20389, 0xbeb67511, 0x808092e1, 0xcde020f3, 0xa5ba004c, +- 0x4d4bb5d0, 0x38cd74d7, 0xb110eecf, 0xc9901aff, 0x94dcb009, 0xff40326c, +- 0x37a1b6c1, 0x78f1828f, 0x25be6336, 0xb3aded01, 0xe3f8a2be, 0x095fc046, +- 0xd37ca7a6, 0xf3e13d31, 0x57dc7a62, 0x5f51e98e, 0xbe1da61d, 0xec7e9885, +- 0xd0fd3193, 0x3fd31cb7, 0x3d311af9, 0xe9895bec, 0xd31f9f41, 0x53079f4e, +- 0x55ff4f85, 0xf0ca3ae8, 0x73d74edf, 0x328eba6a, 0x3878d938, 0xf1851f5d, +- 0x939bb046, 0xa71918c1, 0x563c47b2, 0xe02eabf4, 0x896a70fe, 0xef2b3f31, +- 0xd705317b, 0x7f8b768e, 0x9ee1e824, 0x011b7f91, 0xc39ee47e, 0xed480174, +- 0xfa7a7e7b, 0xe20789f5, 0xccbdfb41, 0x3187174f, 0xd12dcbbd, 0x0316af0c, +- 0xd4d92229, 0xa2fe1b5e, 0xcc4caefb, 0xb41c491b, 0xb46fbbf7, 0x6d4b8047, +- 0xc5efc041, 0xfed8baf0, 0x3bc01645, 0x39d7ecf1, 0xa4328e90, 0x4db8bb31, +- 0x0494bb44, 0x7e03705f, 0xecd67a43, 0x6d3f024e, 0x139370f7, 0xb8a7bdd7, +- 0x9fc15a9f, 0xfe0af2cc, 0xafe10e1e, 0x97f10931, 0x14bfc5f1, 0x3ba788fe, +- 0x6151a6eb, 0xbe139dfc, 0x39ca7f1d, 0x1bbfbe89, 0xe277e344, 0x0544aecb, +- 0x0943edaf, 0xe02de7ed, 0xa7bf0a7f, 0xc01892f9, 0xd93ec873, 0x87f7f662, +- 0x4e80e74e, 0x6abc30b6, 0x3d9ebc1d, 0xeec0382f, 0x7064905f, 0x67808f1e, +- 0xa40ead25, 0x3b6a6d3a, 0xef9b45a9, 0x028a1469, 0x62b8cf68, 0xfd028da6, +- 0xcf1e74eb, 0x84993d00, 0x416702a9, 0x3c79c992, 0xe4c3e91e, 0xca2c437a, +- 0x145f19fd, 0xc7a1fbd6, 0xf09c17d1, 0x31c99a38, 0xf9501eda, 0xf5df7a4d, +- 0xe353e4fb, 0x37e04c5f, 0x17d2ad23, 0xd144bf60, 0x0381bfff, 0xbcc46232, +- 0x2036b702, 0xe02be6ca, 0x7f4d06fb, 0x394b9db4, 0xed26fbc3, 0x48c1e4db, +- 0x4afc284e, 0xf0468a97, 0xbe038d49, 0xf6b538b5, 0x5f26ac51, 0xa9c832db, +- 0x1fe097b1, 0x72928f54, 0x577c08c1, 0xcba6d9c5, 0xd02e5b68, 0x538255f1, +- 0x6055f80a, 0x3aa3aaf5, 0xf0175e4c, 0xaf5be2cb, 0x46cd4172, 0x7c7eaf9c, +- 0x1a377e94, 0xbf8f7d8d, 0xafb9ec52, 0x6c7c8224, 0xcabb7ae1, 0x240afcc0, +- 0xf9c0764a, 0x1d924917, 0x6871d937, 0xd07e10b6, 0x51fb470f, 0xf33815e5, +- 0xd6b752fd, 0xcf91957e, 0xbf981acf, 0x6eefdf40, 0xe2e137e8, 0xb0d9abf8, +- 0x5bcc0a7f, 0x969ac78f, 0xca2f26f3, 0x272ffd15, 0xbf05478c, 0x6ec96295, +- 0x58afc291, 0xd5f70477, 0xc47924a7, 0x17a2df03, 0x96df8f7b, 0x9aaac274, +- 0xa1da4cb7, 0x7972bb9f, 0xdb75c447, 0x9f5f5407, 0x1e44bdfe, 0xa05cba01, +- 0xa0e354b5, 0xe4310516, 0xbbf5ed84, 0x618b2b9a, 0xfb0d3efd, 0xe72faa15, +- 0x38071290, 0x6349cb1d, 0xe7e7d80e, 0xf008a188, 0x87fc8e74, 0x4e8a8c63, +- 0xe2134467, 0x47efda89, 0xf6a3e3d5, 0xed4f26bb, 0x8cbe4d77, 0xe70894dc, +- 0x494f65d9, 0xfce02fc4, 0x127fe534, 0x79f7489d, 0xec01aea4, 0x5b12c59d, +- 0x1272efd7, 0x5f1d0a63, 0xe5cfabf5, 0x79fcd294, 0xca23d991, 0x38fcec79, +- 0xc08afe36, 0x9687936a, 0x731e6b1f, 0xda0455eb, 0xfd601bfb, 0xee08b791, +- 0xf8deaeb5, 0xd7e3aefd, 0x87b1578f, 0xf30b9d7a, 0x13af5471, 0x7648fe3c, +- 0x8533e711, 0x4e8c631f, 0x45237f8d, 0x9744bf97, 0x7fcba31f, 0x401f796f, +- 0x295ef234, 0xe38c537a, 0xfec37c98, 0x2376304e, 0xf86f7f3f, 0x5fe0bd49, +- 0x1fc283f2, 0xd13393ac, 0x8507e63b, 0xfc6bd19f, 0x5f824757, 0x5b4beafd, +- 0x2a9faa65, 0x41da795e, 0x6d3a7ea8, 0x53744c6c, 0x5dad57fa, 0x383e00ea, +- 0xc01d9465, 0x62fda7cf, 0xbe823f91, 0xf0a8d7bb, 0x8026c783, 0x49fe0dff, +- 0xff599fe1, 0xaeb0f5e8, 0x7256b17f, 0x9d6d5fa2, 0xf2a66839, 0xbf3cd35a, +- 0xfe616498, 0x3b2fcb08, 0x45be422f, 0xbf159fcb, 0x85d13a7e, 0x314e52fa, +- 0x8838ffa0, 0xd34d7ff6, 0xdd605327, 0x28dd25af, 0xd076fa67, 0xb87157ff, +- 0x629a953e, 0x46e3977a, 0xb3da113e, 0xa3f36d5f, 0xfc0745e7, 0x06fd03ab, +- 0xdce5fafa, 0xda332f8e, 0x1afea007, 0xfe83c64f, 0xfc41f052, 0x5f178ecc, +- 0xfc0b2e7d, 0x7e9b67a7, 0x785410ef, 0x27ace452, 0xaf57fb30, 0x97d6fabb, +- 0xd50e549d, 0x4f62a3f6, 0xfef85ab8, 0x55a595a3, 0x1571d052, 0xab5593d5, +- 0x3f4cb725, 0xc2f4bd57, 0x3f82cf8b, 0xf7668ff3, 0xf2bf0a70, 0xaf075da5, +- 0x8dcaf9a4, 0x366280d2, 0x18909b0d, 0xfd2d4ba6, 0x9876617f, 0x779b150e, +- 0xd8a35c99, 0xc2e307f7, 0xb8dca8f4, 0xf54644c3, 0x604147c6, 0x16c3a987, +- 0x23812e81, 0x12fec053, 0x09bbfd5f, 0xbb7a7ee8, 0x46a60640, 0x5deae7c0, +- 0x9e019f68, 0x4e9c8e90, 0xeae9ba21, 0x80ba52d7, 0xa4e8573e, 0xfae22f2f, +- 0x32b9e004, 0x7e5f9f91, 0xfe84e21d, 0xfcc37664, 0xdbbe5fcb, 0x6938f301, +- 0xfd7c63ac, 0x0f44d2dc, 0x925cb7ed, 0xb2989d13, 0xdfcfe5ef, 0x6f36fc8b, +- 0xcc89bdff, 0x6419e58f, 0x1e49b5c0, 0xbb9bf304, 0x5f9c16ea, 0xdf22f119, +- 0x96273f95, 0xdcfc7e80, 0x46368a48, 0x8d4f8b90, 0xb9380ecc, 0x74b81a86, +- 0xb2e9277e, 0xff337183, 0x14fc6221, 0x3f453f21, 0x2e7cbdd9, 0xfcc382d4, +- 0x4e8c51e7, 0x5c0d196f, 0xaf15a8ae, 0x65a6d7e6, 0x339f40ed, 0xe1033c43, +- 0x1896a5bc, 0xe10f8e65, 0xdc570a1b, 0xd190385f, 0x398cb887, 0xc3b51dbc, +- 0xd43be00a, 0x963c976f, 0xf23b4d2c, 0xffb86a4d, 0x74ff787b, 0x3f60d1dc, +- 0xbc8c4c9d, 0x2928180f, 0x71d74f72, 0xe4a97f15, 0xd37bc99b, 0x15be4cc3, +- 0x58dff779, 0x397fe504, 0xda07e4c0, 0xc748fac1, 0xe5881c15, 0xa809a63b, +- 0x1824cc0f, 0x249bae49, 0x72dad72e, 0xb8e84f85, 0x8a8c428d, 0x1c7e005f, +- 0xa6ed1fe2, 0x3b68a7b2, 0x85acbe95, 0xe1bd1cfe, 0x8f3b7229, 0x9009ffcb, +- 0xf2c3cbff, 0xb931564f, 0x95bedbef, 0x92553f11, 0x4167c5ff, 0xca7ca95e, +- 0xa957902e, 0xe9fde604, 0x3f83b686, 0x69f272a1, 0xad539140, 0x69cbd4fe, +- 0x097ba6f9, 0x4e5ea7f0, 0x475c1d3f, 0xfd29ca22, 0x074e511e, 0xea97fc77, +- 0x0e7f054f, 0x153fab49, 0x1e17d87d, 0xb7f0faf5, 0x53e21746, 0xefe90faf, +- 0xcde9c900, 0x29df0a7f, 0xdbf156fc, 0x77a061ea, 0xf0a97c42, 0x152f885d, +- 0x57cfd3be, 0xf97d3f8b, 0xd199f061, 0xf6bc9571, 0x4a1494fe, 0xc156aacf, +- 0xbb61766d, 0x78a790dd, 0xbfb330f2, 0x00ca7771, 0xcbafde75, 0x3df57407, +- 0xae897cba, 0xaf9757be, 0xb3f7d5d3, 0x9b4b487d, 0x041f2089, 0x45a5f535, +- 0xfc738644, 0xee226dee, 0x98e8bbbb, 0xaefb681b, 0x997ea90d, 0x16a583ea, +- 0x4eefbfb6, 0xfe803530, 0x3b7672ea, 0x616f20e2, 0x92aeb5fe, 0xcaac476e, +- 0x2ad23c3e, 0xf0edfea2, 0xfb48a293, 0x22d16a13, 0x5f483a9e, 0xa3bcece5, +- 0x5d0db450, 0x46977e08, 0x81ae0dd1, 0x39b7f539, 0xaba1bce0, 0xe986fd35, +- 0xb7dcfbf4, 0xe85f0c45, 0xc164768a, 0x31ec88b8, 0x0bed520e, 0x99f9114e, +- 0xb33e7489, 0x60fed95b, 0x5d9d0ace, 0x5f205641, 0x31eed994, 0xf6a45e81, +- 0x9fad51fc, 0x0577f19e, 0x4abe5787, 0x57b4ae5b, 0x4d158df6, 0xdf2f72da, +- 0x5c495667, 0xa3268c5f, 0x308f3ed9, 0xafd7093f, 0x0de66285, 0xbbfe29d3, +- 0xf80488f6, 0x4455a7a5, 0x106cf7fc, 0x226fe0fc, 0x4dca0272, 0xbd46e90d, +- 0x2ce9e0a6, 0x6fa985c8, 0xcb7673bd, 0xd00f3947, 0x3f5b552a, 0x9a77fac8, +- 0xc7fadd9e, 0xfe406f11, 0x3f4343d5, 0x17ebbd20, 0x79e0b76c, 0x3b76d76e, +- 0x6d76afc6, 0x01f437db, 0x7666bfc8, 0xb6bb38c3, 0xfc05997f, 0x5cc8b5d3, +- 0x6bab7a0e, 0x2cd7db08, 0x5665f6de, 0x4b93ae07, 0x90bf6e90, 0xa7aabed8, +- 0x858febf5, 0x59d29001, 0xddbffac1, 0xda9dfe8a, 0xa7182dd7, 0xcbedb5db, +- 0x87edaf1c, 0x3f0d4f9b, 0x93b2efbf, 0x7c609be9, 0xba7cecb1, 0x2f098df6, +- 0xabfed3d4, 0x6698779b, 0x3782f2d3, 0xfa059eff, 0xb3136bb0, 0x8ea53a6b, +- 0x7a7ce1e7, 0x8bedd2cd, 0x4ee78a24, 0x42648a10, 0x4df0d47e, 0x09199cbe, +- 0x7f477f2f, 0xf1f17f53, 0x7c18ffda, 0x53ef1808, 0x47f76ad5, 0xbfef3009, +- 0xe801fc7e, 0xe466ed81, 0x9fbe654b, 0xeed1ea06, 0x0fbcd8b8, 0xfdc7bcc3, +- 0x085bcd2b, 0x5fde67f6, 0xfbd393fe, 0xe385c921, 0x6f41cbd3, 0x1f76df3e, +- 0xbbb25fe6, 0xe4fdbc71, 0x7fa681f7, 0xa26fba31, 0x7c5c7774, 0xe4ff39de, +- 0xee9beef3, 0x74e2cf6f, 0x8c7de277, 0xe38eff37, 0xee7aaefb, 0xf3a1ffd6, +- 0xb373ec57, 0x8f3da4a1, 0x693a6f8e, 0x316183b4, 0x2f67a123, 0x8799c484, +- 0x8c0065fc, 0x8ae7e257, 0x332df1fa, 0x048ffdb1, 0x5fb4c6e7, 0xf7c08b72, +- 0x743f6c75, 0xae1fb73d, 0xf6865c1f, 0x661ef5e8, 0x496313af, 0x8858de49, +- 0x46e39aff, 0x3ec9273f, 0x2dfc85ec, 0xbb5e7893, 0x20577c2f, 0xe3da811e, +- 0xda2d0fd7, 0x0de9f603, 0x33418d83, 0xfa408f4b, 0xcf7f83be, 0x665feed5, +- 0xdbf9b578, 0xb7f36ba6, 0x82b77870, 0xbffb4571, 0x83f044b5, 0xf21a535f, +- 0x39f80254, 0x1112b9a5, 0xa9138804, 0x84fb0a5b, 0xedb44a5b, 0x767ec367, +- 0xf38f185c, 0xe153bca3, 0xa46a21fc, 0x61b8f880, 0x24fa8885, 0xf840532a, +- 0xc612b925, 0x28627e13, 0x173c01c9, 0xf35f198f, 0x0dce0633, 0xf1cf9df3, +- 0xd0ea4655, 0xbe1721de, 0x0e6266f9, 0xda0973f8, 0x843df34b, 0xf5ed475c, +- 0x304289b2, 0x3ce5ca9a, 0xb2639123, 0x9029cfc1, 0xa73f1aa3, 0x1fbf0f36, +- 0x5ce18625, 0xfc5f7eac, 0x7fa743f8, 0x347ffca6, 0x90cdda83, 0xf33bb9e2, +- 0xaafb29d7, 0x1e195b3b, 0x7f04ab6b, 0x5055f21a, 0x7c539f52, 0x85fe626d, +- 0x06383f3f, 0xe7ef2ae5, 0x7ed862a3, 0xcced032f, 0xf6676e5a, 0xf018aec8, +- 0xa6b4f46f, 0x02b1f3f3, 0x3f023787, 0xadfbe7ef, 0x3ef9c03f, 0x0b26bb4d, +- 0xfdd8228d, 0x78fd1ba4, 0x590b64f2, 0xee0e211b, 0xa7e29303, 0x1ffdc3a8, +- 0xa01cc4fc, 0xa3cdfb23, 0x54e2634d, 0xdd715b74, 0x6f566369, 0xa8efc03a, +- 0x1fe83cea, 0xefec2fc5, 0x2dfbaf00, 0x224a531d, 0x971cf7cc, 0xfeb7e2df, +- 0x6eb5f78a, 0x00954d6a, 0x164d372f, 0x9fa6e735, 0x75bef898, 0xe303190c, +- 0x1aeb7e2a, 0xcba004c7, 0xf70dd11e, 0xcf5b6ab3, 0xce11bc9b, 0x04f8f48f, +- 0x97dfe8f8, 0xcf8065dc, 0x42c7ff63, 0x8fb59f60, 0x4264e79f, 0x6e2674bc, +- 0x4fe03de5, 0x75e382fa, 0x7489d9aa, 0x4f38b9be, 0x66fda04a, 0xc3473b36, +- 0xaf325691, 0xad16153f, 0xc11c1071, 0x92f529da, 0x23bd58ab, 0xa44d6726, +- 0x128a2ff9, 0xfb8579f8, 0x9fe15cbe, 0x3f796e8f, 0x61f307b7, 0xeecc993d, +- 0x6be6f5d5, 0x53d1f282, 0xdf41f824, 0xf309fec3, 0xe03eecc5, 0x972b033e, +- 0x597a626f, 0x9e3d7be1, 0xcf0ccdd3, 0x3c05ff4a, 0xf0ccd23f, 0xc159e0a3, +- 0x4abc7eaf, 0xaeafaa7d, 0x6e21fb56, 0x32fd1968, 0xad3587ac, 0x4140d382, +- 0x4c3b18d5, 0x2db58720, 0x67e04b8f, 0x7062e19f, 0xa5907ae9, 0x6a9dd73e, +- 0x6debe766, 0x02cd57d9, 0x056cf93e, 0x7b684bb5, 0x0ef39ccf, 0x19f77758, +- 0xbdc1efdc, 0x915df949, 0x7d16fdac, 0x79cf81f5, 0x1aa364ed, 0xf38e2a6e, +- 0x093caae6, 0x57b726dc, 0xaa0690ed, 0x39aa69f8, 0xef95cb0e, 0x6cae55c9, +- 0xc3fb4ef8, 0x998fc871, 0x6787c409, 0x3ef1da06, 0xb175edda, 0x03cb0f8c, +- 0x4f984c3b, 0x7f4afac5, 0x797a3f4a, 0x8dac569a, 0xd05d99fb, 0x52f01831, +- 0xe3de0e6c, 0x9da7c08e, 0xbbe40e9c, 0xca1e13ae, 0x8bff59b7, 0x947b89d6, +- 0x2a43a275, 0x6c89c551, 0xa73d3335, 0x4606275a, 0xd416275a, 0x1d0206bb, +- 0x1f4b6c16, 0xe0b24208, 0x48c4c2ed, 0x3efbc4eb, 0x88785e76, 0x9aecdfdf, +- 0x2b89d746, 0x34c4eb54, 0xbe89f20b, 0xc4acdf9d, 0x9d645d61, 0x5ff6e850, +- 0x87de6fac, 0x7c822275, 0xd76b366f, 0x4b5b5b89, 0x75b89d71, 0x57b9a89a, +- 0xb17cdeb1, 0x712f2275, 0xb725e606, 0xbcff0235, 0x43e1edcf, 0xfa0ebe3c, +- 0x34e2f581, 0xde84ffe8, 0x7a5f46eb, 0xeafeb1fd, 0x3c26fff5, 0xc17d7a2b, +- 0x781eec2d, 0xc8243e6f, 0x50660bcf, 0x3f002ebd, 0xe0bebd32, 0xd317ee0e, +- 0xd012d9e9, 0x7ad563b3, 0xf1afb596, 0xb6a175b2, 0x3317f525, 0x1a4ff969, +- 0xad147725, 0xdeb093ff, 0xddeb51cd, 0x1377a0d3, 0x72dde822, 0x6b3f77a6, +- 0x53f6831d, 0x88fbf35f, 0xcfaa5beb, 0xf811dc32, 0xab4cfa63, 0xb1ce9ee6, +- 0xdccbbfd1, 0x4fb2f20c, 0x4fbb73c4, 0x77b01db8, 0x82c6eff4, 0x144a7a9f, +- 0xa71c4f1b, 0x5c8fa767, 0x81ea993b, 0x9ecc3982, 0x2220deae, 0x999a6afe, +- 0x4464d7fc, 0x3f345dfb, 0x26affb25, 0x636e57c8, 0x06746fe7, 0xfa2a79c5, +- 0x68ebee57, 0xe5703f00, 0x0fcf016a, 0xf019ce21, 0xb3e38f39, 0xfb895dcc, +- 0x80fc7d15, 0xe6ad17e2, 0xaeb7e6f5, 0x3ea9ff46, 0xe33aa0ae, 0xafb0d3da, +- 0x3a333628, 0xfc166f14, 0x1ce153ab, 0xfdcf575b, 0x541b9e30, 0xc7dfb407, +- 0x15cef9f0, 0x619b9983, 0xe89ef55f, 0x8dceb48e, 0xfca5e3d1, 0x7ecbc41f, +- 0xffb1978a, 0x17d2f1ef, 0x8f7da81e, 0x3e3d64fe, 0xbd7145c6, 0x82c64d92, +- 0xf0627e1c, 0xdf915ea0, 0x642e3111, 0x35c3e3ce, 0xa20bfef7, 0x67dabe98, +- 0xdc4036f0, 0xe2c35cae, 0xdaade647, 0xe6912bb8, 0x68c80667, 0x5bcf4770, +- 0x43875da9, 0x0bb37eeb, 0x7599f5d7, 0x1388051b, 0xfdefcb9c, 0xc71ffb94, +- 0x58ee12f7, 0x5a79d748, 0xd9b6767f, 0xfb9fe70b, 0x37a8dd2d, 0x105dbe15, +- 0x3a97ecc5, 0xc9638e3e, 0x7d7193dd, 0x289c116a, 0x5b0b418f, 0xe09d28af, +- 0x09b6871d, 0x74e14e5f, 0x16887e61, 0x4a5ac746, 0x29e79037, 0x8ebf3cad, +- 0x2bb781d9, 0x77e080f9, 0x7757a009, 0x085dec48, 0x9c0bc481, 0x11f5aa08, +- 0x12f2d5ce, 0x76de7455, 0x5afff184, 0xfc1f8dc1, 0x43efbff4, 0x9ef93ee7, +- 0xe5fd31d9, 0x0b4f0577, 0x6fde7474, 0x831e2f69, 0x1b8233e7, 0x8d68c7df, +- 0xe38573c5, 0x079dec8d, 0xcbd3b799, 0x5c3bec05, 0x8dcabf2a, 0x1f887030, +- 0x9c60b22d, 0xc69bf61e, 0xbded32ec, 0xd7135940, 0x4ee35df3, 0xda3b496a, +- 0x3178e163, 0x802637ef, 0xb5182457, 0xc8dd5c71, 0xfc003fe7, 0x02dfcdd7, +- 0x3139249f, 0xa76ef46e, 0xeec9ddf2, 0xdb7cf06f, 0x33439c90, 0x5b3f7e29, +- 0xdd79e22e, 0xc1d7066d, 0x1e6fa089, 0xcbc80891, 0x0f257b67, 0xb8ac075b, +- 0x3bee94ee, 0x4a5ef786, 0x2911ec59, 0x2fad887d, 0xfe78f8c7, 0x0f6dd744, +- 0x604844f8, 0x4dfbc41c, 0x7428ef73, 0xec64df81, 0x2e70a5fe, 0xf3817376, +- 0xe7a041e0, 0x93bdecc3, 0x700bcba3, 0x4ff7769f, 0xc3b79405, 0xfed06e94, +- 0x07a96996, 0xef7ed20f, 0xe7809e58, 0x093d335c, 0xd7b9c2b7, 0xdba2bdcc, +- 0xbecdeb45, 0x73836ec1, 0x4523a9af, 0xe7e155e2, 0x7e8ed20e, 0x3f75999a, +- 0x5dc605bd, 0x3143d74e, 0x85fdd215, 0x4abf2103, 0xb2b5f6c0, 0xb29034d7, +- 0xf3cafb4e, 0xffb4b1a6, 0xd00f5a32, 0xd58abb5e, 0xdc126dab, 0xd65b7a10, +- 0xcbea38fa, 0x1f0126b2, 0xf6a76896, 0xeb83146f, 0xdb70a28f, 0x34f6d157, +- 0x03da0f3f, 0x5bd8a6dc, 0x96ab3ce1, 0xe7db138e, 0x6479e3d6, 0x8b476d19, +- 0x4fd37b49, 0x55fcde11, 0x447b8102, 0x8fa9b9e5, 0xbdbc02e5, 0x0fca1b92, +- 0xc625f8ed, 0xfda2cc8d, 0x67f0a20d, 0xe8851d8b, 0x70407b57, 0x83233be2, +- 0x5d7e9033, 0x70686130, 0x64fd0d3c, 0x42e9d718, 0x71d51834, 0x1616c908, +- 0xb0b65cdf, 0xd5e601be, 0x1aa42721, 0x9bceaf90, 0x4e3f1d60, 0xf6a5edf1, +- 0x8b1331eb, 0x8f93686f, 0x7a543a99, 0x1d25bc74, 0x969cd8f5, 0x9f2f3c3c, +- 0xbcf04a4b, 0xeccf5bdc, 0x2d4b2391, 0x30ec017e, 0xbe1439c9, 0xe3352db7, +- 0xd897cef7, 0xa439d3fa, 0x27a1fd03, 0xee044957, 0x955e2d39, 0xf1d00cfe, +- 0xf90906e4, 0x424e7c4d, 0x25ef363d, 0x5b6b27e6, 0xbc9ee0c5, 0xcfdec4c7, +- 0x9f9a7281, 0xff651bf7, 0x6563d5ab, 0x53d40aae, 0x2bd4bd7a, 0x7aa9efee, +- 0x2f6cb013, 0x14cf757d, 0x741557d4, 0xeb4601dd, 0x3706afa5, 0xaf52bfa0, +- 0x4d896aaf, 0x10d953d1, 0x3d5a5237, 0xe04ad664, 0xc0583be3, 0xb5f07b76, +- 0x75869fcf, 0xe04ecab7, 0xf9d18d4b, 0x82f8c08c, 0x6cccbc80, 0xc839f8dd, +- 0x0b4cf941, 0x0273bbbe, 0xb37200e8, 0x59c59e22, 0xdf114bf9, 0xbce51c4a, +- 0x573e5a95, 0x7867b5ce, 0xaf51e245, 0xe256e55f, 0xf43bd551, 0xda57e510, +- 0x822d9dcf, 0xfe4022df, 0xc77beec8, 0xe389de62, 0x83edc85a, 0xe7e47615, +- 0x5f9ff743, 0xeb3afc0a, 0xbd808141, 0x036f644e, 0x2b3587ac, 0x65f81705, +- 0xdac83de7, 0x61eda3cf, 0xc97e87dc, 0xb7f28af8, 0x66bff80b, 0xb1bbe3d5, +- 0x02e0937e, 0x975687f8, 0x2e513da2, 0x9bcb048b, 0x81fee08e, 0x5f1853ae, +- 0x898b26d4, 0x4b35ffc0, 0x95304ecc, 0xf8523e14, 0x17bf08f2, 0x59dca24d, +- 0x9f76d337, 0xde849000, 0x174e28fc, 0xf029eb42, 0xf8ccad49, 0x924bc8ec, +- 0xe2e6d81b, 0xc3eec97c, 0xabebe49e, 0x532ddcf8, 0xd73cc106, 0xb68638b2, +- 0xb0260555, 0x05fa4e23, 0xcdef8f3c, 0xb6a6c497, 0x7cbe14a3, 0xfafa604e, +- 0xbda87162, 0xa5f38ef8, 0xa9947fc2, 0xb5595f71, 0x0f702257, 0x5e8fcf57, +- 0xc42b7029, 0x4cbe940b, 0x5bc743e7, 0xda3f70d0, 0x691e0aeb, 0x65f2113e, +- 0xa1ef1646, 0x91b543c8, 0xe77d05c5, 0x37fae9f1, 0x7961ec5b, 0x4adc5910, +- 0xbbfbf690, 0x9c602f0d, 0x47f5b9dc, 0xe6fb47ae, 0x8007ca0d, 0x12760dff, +- 0x1f87fdc4, 0xb34550f5, 0x4238c1e8, 0x66e73063, 0x895dbed5, 0xc57ca897, +- 0xd8aef88e, 0xd317f664, 0x8f5b15f6, 0xf5f9e165, 0xe78c6ea2, 0x680bd790, +- 0x23b9131f, 0x546fee0b, 0x86dc5918, 0x64582ede, 0xb3aa7e61, 0x83a759af, +- 0x63ac26dd, 0x045569ef, 0x2acc936e, 0x16fdeebf, 0xe787a949, 0x33a53229, +- 0xf18693dc, 0x5271dfa9, 0xfece35e2, 0x455ff186, 0x5cf6848b, 0x9d8dbac5, +- 0x71577f10, 0xdcfb8cd8, 0x31e775da, 0x95e0b89e, 0xae1df097, 0x135116da, +- 0xee2bd57f, 0xe7889d69, 0xd5cd351b, 0xf341bf18, 0x1351ce78, 0x77ff1c88, +- 0xca9cf8b1, 0x956db657, 0x372b0a29, 0xef81daff, 0x75afb572, 0x7593bde0, +- 0xd8771edf, 0xf029ce2b, 0x39c6b7f0, 0x507f819d, 0x45adfac6, 0xd644e71b, +- 0xc746bd31, 0x9ee91397, 0x7adec841, 0x21e7f3e9, 0xa6ecf70e, 0xf1879f4f, +- 0x67e7fd56, 0x061c43cf, 0x82716ed9, 0xfebb523d, 0x54638c7d, 0x30b2edda, +- 0x37f3affb, 0xcff8c6bf, 0xdd9a3fce, 0xdb73ad00, 0x6f60a1c9, 0x6bfc6e74, +- 0xde75c422, 0xfd10adb3, 0x296cf739, 0xf8224818, 0xf814940b, 0xf88fdfd6, +- 0xdabd3d53, 0x5e30db9a, 0x37a51ce4, 0xdc5087e8, 0xc59aa05a, 0xbc78ba01, +- 0x71c886da, 0xd3e2bdbe, 0x61be6f9a, 0x66c5e812, 0x345c1766, 0xa500ed4e, +- 0xa0fd15e3, 0xb98786df, 0xbf4c893e, 0x4a0ff073, 0xfa3a63a7, 0xf73cde7d, +- 0x5942cf57, 0x719f7c73, 0xe07ec16a, 0x0e23894d, 0x169d3c58, 0xbf4d9b90, +- 0xa040b8c5, 0xf40bb15b, 0xc143e7f3, 0xea4a7c2f, 0xf743ff46, 0x5bde3336, +- 0x0876d8ab, 0xcb73a7e5, 0x25d38c7e, 0x93b79e3c, 0xfe2c7e84, 0x6a7afb92, +- 0xbe2cec9b, 0xe21fe38d, 0xfc0e5cdf, 0x18dce3ce, 0x6ff12b1f, 0x0dbdc57d, +- 0xefe34e8f, 0xbcf8b02a, 0x780fa6ea, 0x5e98591c, 0xe9d02e42, 0x13c6b7c8, +- 0x0270782a, 0xe3abc61e, 0x17c72338, 0x397de286, 0xa07e80bd, 0x9a7143a7, +- 0xe2183f34, 0x21c2fcf6, 0x741f4112, 0x9ff166ae, 0x1ef6929d, 0x2c3e9868, +- 0xad15d3ae, 0xff7f5393, 0x362f39e2, 0x9f8aeffe, 0x269768d8, 0xd3c151ae, +- 0xf5910bd9, 0xf0b44178, 0x9a93dd8f, 0x05efe823, 0xc02747e4, 0x1311f979, +- 0x7c5e7bc1, 0x37dca4ff, 0xb3b4fee2, 0x0b8c45eb, 0xa1b4086c, 0x8bebd71e, +- 0xa24e7e1a, 0xd12def1f, 0xb4d54f4c, 0xece275b0, 0x46dfbb26, 0xeb7d9ce1, +- 0x9ae7e435, 0x324c470d, 0xdd7bb785, 0x2b8b1366, 0xeb03f260, 0xfe355f84, +- 0xc8ef2fb3, 0xdfcdbd42, 0x33f7d215, 0xdb53f79b, 0xda9fb91a, 0xfd35e70d, +- 0x9301ca54, 0xfef176d3, 0xb73d18ce, 0xed33bc01, 0x133a5ecc, 0xdd228b10, +- 0x2d12998b, 0x2373fdf1, 0xf5d373f3, 0xb257df12, 0x4494f7b3, 0x5fda3447, +- 0x0f73d8f7, 0xd4800cc7, 0x8b127184, 0xc55c79eb, 0xa024ee43, 0xb5fb62f7, +- 0x14bbc604, 0xc7daabf0, 0x012f4e4b, 0x2a4a4dbb, 0x673eab19, 0x1a6fc651, +- 0x157e2060, 0x17b1effd, 0x27fd840d, 0x6183ca31, 0x7da7d71c, 0xaff58469, +- 0xf7fcc7dd, 0x0cb1c2e4, 0x746edef8, 0x70a78aee, 0x6e0b27db, 0xe6f6bd70, +- 0xe43f067b, 0xdf68f04f, 0x7a588485, 0xdb8f5f98, 0xdda0f680, 0x2ad27410, +- 0x4f696ec4, 0x8bac0dc2, 0x18898cb8, 0xe8718f02, 0xa6a2f88f, 0x073abdc1, +- 0xd429e6a1, 0xef351b73, 0x1ae4c424, 0x9026ef75, 0xbd741903, 0x557e71b1, +- 0xf67672fc, 0x03b70a6f, 0xcd8863df, 0xbec0f524, 0xb45eec2b, 0xefe49e1b, +- 0x48dfd058, 0x23886788, 0x3bf56ed1, 0xcd5fb42e, 0x5fb410fb, 0xa3d63e4d, +- 0x1917c7cd, 0x5f5a478f, 0xa638f9e2, 0x43c43688, 0xd941a16c, 0x4f0f15af, +- 0x363b8f0c, 0x5083b881, 0xe30d9d7e, 0xc978a9c0, 0x6cd879ea, 0xf1d371da, +- 0x4c44f469, 0x606c8766, 0x777cd4e3, 0xf3809712, 0xd3bf68f7, 0xdbf26af1, +- 0xaa3c79a3, 0xdf411891, 0x09daa2d9, 0x068f7fc7, 0x7b8c4bdf, 0x7d022487, +- 0xcb57df08, 0xc411ee04, 0xfed079f0, 0xe09df535, 0x6bfd601d, 0x4ec190e1, +- 0x2bbf7df5, 0xccb7faf8, 0xe81ef25a, 0x75619c9b, 0x313bc818, 0xbde26489, +- 0xa801d6d5, 0xe616d29f, 0x2f346393, 0xcabe3234, 0x6e504158, 0x9c59ba32, +- 0x8d12590a, 0x8a39a8f6, 0xb86c96c8, 0x296444c7, 0xf3f17a1b, 0x22d725f3, +- 0x5c650503, 0xb68d794e, 0x37ceed6b, 0x0844a5cc, 0xbf851140, 0x31f3da37, +- 0xa370dff4, 0x1a30c937, 0x74b7de3e, 0xda9460e7, 0x6823c14b, 0xb5ddee10, +- 0xe90b0867, 0x089af781, 0xf01777b9, 0x4f286378, 0xbacf7082, 0xf7943a31, +- 0xdf7d5144, 0x67f2c698, 0xba5defa3, 0x3fbbc29c, 0x346ce4a6, 0x79ca278c, +- 0x05779e19, 0x17fe70e3, 0x71945f5b, 0x98ea6c8e, 0xf9963d12, 0xcf1de14d, +- 0x3dd0f6e1, 0xd7875c6a, 0x107c94da, 0xcd2511f7, 0x55af51fb, 0xb963f607, +- 0x1d34f201, 0x2531df16, 0xeb109625, 0x930b4ba3, 0xfd78852e, 0x9d0324d2, +- 0x974780e7, 0x60fb82ee, 0xa23c3c61, 0xb0d183c1, 0x499ed77c, 0xdf2c3c6a, +- 0x7f487605, 0xbac030f1, 0x89f2e97c, 0xe5379ffd, 0xc42b788b, 0xf019e43b, +- 0x87f1a5dd, 0xa15fe86d, 0x47ae0b3f, 0x3eeace1c, 0xfb2abfee, 0xc5270a11, +- 0x5fcc2e3a, 0xaf853b4a, 0x749be2fa, 0xbd8cbce2, 0x9fe5a7af, 0x0327ab62, +- 0x7ab70de0, 0xe1c6d9f6, 0xf63ef1fc, 0x3dd7af54, 0xaf984c79, 0x063bcd89, +- 0xb32ef7ee, 0xaaca35de, 0xcd4ecbf2, 0xd1a6205b, 0x2c8166f1, 0x93e78424, +- 0x8cb650b0, 0xf04cf3a0, 0x7ace3018, 0x063bd599, 0xef4c71fa, 0x8495d20e, +- 0x31de009a, 0x0b961882, 0x6d86bfa5, 0x50debf6c, 0x622ff06a, 0xc002bde7, +- 0x8747f30b, 0x19ba3f8e, 0x411cb47f, 0x3d69a8fe, 0xa5a3f8c2, 0x0bf81f3e, +- 0x9f60cdce, 0x47ba48df, 0x79afdd03, 0x48d0a9b4, 0xb5987ff9, 0xf28521bb, +- 0x14d64485, 0x788a5f16, 0xaf8c31fd, 0xf8f87d17, 0x45f57994, 0x693dc6df, +- 0x7ec2668f, 0xcf01af72, 0x85bc14bb, 0x8b2b07ec, 0xf7641c23, 0x6a7e834e, +- 0xc3763b73, 0xf9ed37f4, 0x70db8c0f, 0x0769bdec, 0xa34c77b4, 0xfb857214, +- 0x08bbdc6d, 0xa46dcbdf, 0x319000f3, 0x75865ba4, 0x307c6fbd, 0x03e109f9, +- 0xc04c9eec, 0x979411c7, 0x109efcf5, 0xffbc3b95, 0xdecacc3a, 0x65679865, +- 0xac07e7fb, 0x1d994f22, 0xc7b7b096, 0xdaadfb04, 0x9fac0625, 0x7aa66900, +- 0xdeb04bfe, 0x26a35603, 0xa7a14e5e, 0x93544fc2, 0x877de15a, 0x3def588c, +- 0xb389fe5a, 0x29e0a9a6, 0x11f31eed, 0x4a0c9cf7, 0xdd779d87, 0xe52aeb0d, +- 0xed351b9f, 0xc0164946, 0xf81f529b, 0x687d1233, 0xae8c45bb, 0x17b05671, +- 0x205cee36, 0x7f42f9c2, 0xef039ae9, 0x39fad1c7, 0x89b75256, 0xa189cfb6, +- 0x79e3e429, 0xa7cf207e, 0x43fd34b0, 0xdfa041b7, 0xebbf7357, 0x171e56b3, +- 0x065e7460, 0xcb3c53ef, 0x29313af1, 0x4505d71a, 0x8066c16e, 0x3f236b73, +- 0x4eeb4ebf, 0x14dd0033, 0x1b763639, 0x68ba7682, 0x065d19a5, 0xc7786388, +- 0xec6de747, 0x7b5cef5b, 0xa7bfbb29, 0xa732feff, 0xafb6f7f3, 0xaf75eabf, +- 0x4ba065f7, 0x63c75475, 0xcd7cd137, 0xf9e19fa5, 0xcd6b22e0, 0x3b73ea55, +- 0xff1faa7d, 0x3a4e173b, 0xfcec3ec0, 0xc9145cca, 0x32b0eece, 0x6f8f77fb, +- 0xec53b63a, 0xe815242e, 0x413df564, 0x5768a633, 0x1e5508fd, 0xc63651d0, +- 0x656afac1, 0x75aba4fe, 0x147f03f7, 0x42bd7e64, 0xf41238d2, 0x5fd58e64, +- 0xe5c38b8c, 0x481718e9, 0x51f662be, 0xce0ffd14, 0x79f90a97, 0x73b0e798, +- 0x397f2c27, 0xe3938d31, 0x2a4c7ea0, 0xda23cfc2, 0xe272b9f7, 0x5de82365, +- 0xf08a9e92, 0xe574a20a, 0xd1da0903, 0x30cb92e4, 0xa890ab9e, 0xbe3a31ec, +- 0x6fc6749c, 0xba964753, 0x9feff327, 0x6cfaf301, 0xd61319c4, 0x66b8d7f3, +- 0xec6b27b8, 0xe8374694, 0x5dffdfed, 0x3c5233bc, 0xe31b78c5, 0x12be3dc7, +- 0xeb339c37, 0x12ef9af1, 0xbd5dd896, 0x9fc7abf1, 0x3e0adf1e, 0xfbcb78f5, +- 0xce393dd0, 0x7a3f1bd5, 0x5074287c, 0xc7c7acf0, 0x8a6ff03b, 0xcd3277af, +- 0x3bdacef8, 0x77df8646, 0xdec8b9a8, 0xfda0f46d, 0x43c7c85a, 0x4fb457ed, +- 0x6eec120b, 0xe29e1ec6, 0x78f0c4c2, 0xe3d578f5, 0xe3bf8731, 0x7c446242, +- 0xe0377447, 0x0161f28b, 0x7ed04c1c, 0x7099b60b, 0x578248ff, 0x06fc7513, +- 0x47be061d, 0x17973577, 0xd6392f05, 0x00b19dba, 0xe78a9ccf, 0xa57f57d7, +- 0x5b0b67b5, 0x7f069ca7, 0x778c4e40, 0x8941f809, 0x5f384a98, 0x15f2d51d, +- 0xd535971f, 0xa8eaf9cf, 0x9198af8e, 0x0bcacf13, 0x74f2ba9d, 0x85507e82, +- 0x56f3f4ef, 0xf815ebf8, 0x9e37a130, 0xb2cafe14, 0x993bfb71, 0x387b060c, +- 0x31b1b5eb, 0x6b499fa0, 0xc3bf445c, 0x2125c3f8, 0x914f9c38, 0x0de2050f, +- 0xffa6777d, 0x9daa7a03, 0x3f2a82ae, 0x5bd10cc0, 0xa7a08b60, 0xc4993e14, +- 0xc88935e9, 0x347fc03b, 0x12ff1889, 0x5553f7b2, 0x99e657f3, 0x9e605242, +- 0x4c5d58af, 0x8679f3bf, 0x47cd4de6, 0xde44fba0, 0x1b28c4ff, 0xdd20b7de, +- 0xfc21b3c6, 0x32bbe1a7, 0x3c2e29b2, 0x27d7890e, 0xb308eb43, 0x7be266d7, +- 0xe42f14b6, 0x1c786b1b, 0xc4609b5e, 0x38f85677, 0x928badce, 0x79ed4e21, +- 0xec073bd1, 0xdec2b3b8, 0x319f9c2c, 0x37d60238, 0x2d67f97d, 0x9ca06b3b, +- 0x7ac32bd6, 0x2295fc7c, 0x6f742ff3, 0xa4d7fb33, 0x52876df6, 0x4075c671, +- 0x70899f91, 0x900af15f, 0x8c0a60b7, 0xca586afb, 0x7cfdba68, 0xf2fbee39, +- 0xd08db25a, 0x299eaecf, 0x4f9f9718, 0x5fb0463c, 0xe7af7cf5, 0xeb3f3d6f, +- 0x8fec37f9, 0xfb0a1ee8, 0x2fcaef90, 0xe2169d8a, 0x6f94c39b, 0xc29beb54, +- 0x1e7f942f, 0x8d75bc05, 0x3019e4fd, 0xfd8df7ab, 0x37d6112c, 0xdb0f0ec5, +- 0xa0c79e1b, 0xb8f65f5e, 0xbbff8762, 0xf034fbcd, 0xcf7491a3, 0x2369f682, +- 0xefb8065d, 0xf3cdb6fe, 0xec577c0c, 0x2bed8b93, 0xe1ba4ec8, 0x8b337ca5, +- 0x206021d3, 0xbcabdef8, 0x753d4040, 0xa096e907, 0x24ea3bbf, 0x9675fecd, +- 0x07e3fba5, 0xfeb03ce0, 0xf2078c12, 0x889a9442, 0x715c59ed, 0x31efbf03, +- 0xe0047bb2, 0xda85cef5, 0x64d8f8f6, 0xcd5df84e, 0xafb6058f, 0x48e9659f, +- 0xa5b47b80, 0xbebeb6b2, 0x7a1e657f, 0xb576fab8, 0x78219dfc, 0xb2add8b7, +- 0x31b55e0b, 0xde34263b, 0x03bbf877, 0xf006df14, 0xea5eb4d7, 0xff02247f, +- 0x2a37a92a, 0xaf18d32e, 0x99b62fb2, 0xff7a47a7, 0xc147e943, 0xaed24cf7, +- 0x916ff3e0, 0xe89a2fde, 0xc37dfb65, 0x79cd4153, 0x746692bb, 0x2ebb464f, +- 0x1da02023, 0x33c8155d, 0xf3d8d6cc, 0xcbdbbf6c, 0x2977879e, 0x0ef37ea0, +- 0xea07cf66, 0xd5505f71, 0xab37f6cc, 0x99398ce1, 0xed13240f, 0x15bed0fc, +- 0xe1aaa0e2, 0x1e563f9d, 0xe9e6ab84, 0xd7feac8d, 0x87a685b6, 0xe9df6033, +- 0x34dc924d, 0x86a1e2bf, 0x6a3fba28, 0x42162548, 0x5d7f47f7, 0x1594d0f1, +- 0xe2ca54b9, 0xc589023c, 0x426d837c, 0x5fc9f7ff, 0x01b078af, 0x7f74c9f6, +- 0xed5363d5, 0x8f92fb5b, 0xe21736e3, 0xeafdafb1, 0x5f2531fd, 0x077e54db, +- 0xa27bfd3d, 0x7fc0315c, 0xf47df30f, 0xc2ef0bb5, 0x92e581fd, 0xde21430b, +- 0xbba7226b, 0xa9fdced9, 0x3acf7656, 0xed9af45f, 0x5d6fdf20, 0xe27e0118, +- 0xc31e4677, 0x7f2b597d, 0xafaf716f, 0x8523ed1c, 0x6676718e, 0x697b5fd7, +- 0x15f6039b, 0x03fb8dd7, 0x673f0fde, 0x9d99ef64, 0xec6935cd, 0x856c87d8, +- 0x495f0071, 0xd044da29, 0xeec713cb, 0x7ceb0c3c, 0x5843eb5f, 0xd0047bff, +- 0xfec2e4ff, 0x69df3c44, 0xbf00e5de, 0xdf7e59cd, 0x5b735cfc, 0xad345de2, +- 0x0707f8de, 0xf9d2a7ec, 0xdb19cefc, 0xaa9b7df1, 0xcbbe222d, 0xbc4dfb40, +- 0xcdc7fc1d, 0x611e73b3, 0xd7a944dd, 0xd5dfc23f, 0x49bfec50, 0xaf9fb251, +- 0x12df8a87, 0xbab8e1df, 0x1c58f459, 0x73c0edbd, 0x2c9ed27b, 0xc9107a06, +- 0x1a3e1c3d, 0x0bb44ec9, 0xfd0df9f9, 0x7ef784ed, 0x9bccf3b7, 0x7cdd9fcd, +- 0x73913215, 0xd802e5c9, 0xcc01de47, 0xb0f4c739, 0xfd5dbf62, 0xa93fd695, +- 0x5bf31fb7, 0x21492f47, 0xdef60f88, 0x1fc9b77b, 0xec2ecec9, 0x9ed1129e, +- 0xc471e424, 0xf496f657, 0x4cfef0a9, 0x2706dbf6, 0xcec83bf4, 0xf9b6b1f8, +- 0xa51f7c33, 0x856f0486, 0xd1669af2, 0xa6df2419, 0x1efc979f, 0x57545efe, +- 0xbe02e4ab, 0x15dd6aed, 0x16f90595, 0xb55dfd11, 0x0e5e26fb, 0x2ad9d67c, +- 0xb5213be1, 0x80713edb, 0xf7d6501e, 0x7ef656ce, 0x31eb5748, 0xedc0aefc, +- 0x1cbf896c, 0x068d9dd6, 0xb9dcbfb6, 0xd0566ffb, 0xe85e6f0b, 0xad7dc789, +- 0xb6f73eb2, 0x052f117f, 0xbfe43176, 0x44bfdb55, 0xe200789c, 0x24630a9f, +- 0x3b610a22, 0xfcfad7b5, 0x27625921, 0x7ce9d7bd, 0x08c5f758, 0x37c735eb, +- 0xfc08cfed, 0xefbf5fae, 0x6a7b73b5, 0xf786c908, 0xc42e5af5, 0xcdbde257, +- 0x1173ab56, 0x5d985ffa, 0xccf3b5d2, 0xfbe15313, 0xdbdd915e, 0xdf2220bf, +- 0x72bdb5bf, 0x8d4d8758, 0xd7a406f7, 0x77ce8317, 0x7feb41be, 0xf99a2bb1, +- 0xcbee8da3, 0xc206f7d5, 0x5f1cfdf5, 0xae7664c1, 0xbbc32725, 0xeedbdf38, +- 0x2ef5eeec, 0xb47613d5, 0x80a7bb3b, 0xeab11dfa, 0xc5f40988, 0x53c97b20, +- 0xac040f4c, 0xe4991780, 0x6fda10a7, 0x07c93479, 0x27aeeafe, 0xdba3884e, +- 0x0060c7b2, 0x9b5d8cba, 0xeb2ef18a, 0xfcdfb9f9, 0x5529a340, 0xf3e65fa5, +- 0x9253a373, 0xf54e343c, 0xf4c1d93d, 0x155da9c0, 0xf93d42bf, 0x1e193347, +- 0x1bfc5d61, 0x4d9b67d7, 0x500dd4f2, 0xf701a8ef, 0xbf773b1b, 0x69de1bbe, +- 0x35d87f9b, 0x0399d61a, 0x5eb40f20, 0x0df5decb, 0xf2db2f10, 0x6aef4121, +- 0x68a9534e, 0x41befda0, 0x760fcc5c, 0xe0fb80c0, 0x7890ff90, 0xfb9e61e2, +- 0xf9bf6ced, 0xe6831ec6, 0xfe0de99c, 0x765be83e, 0x33b7c189, 0x3da6d43f, +- 0xb7a0f1f9, 0x6fbdd907, 0x8f6b1e00, 0x5c383477, 0x6299bf61, 0xb0384d27, +- 0xfa28ea69, 0x0d6709cf, 0xebb7204e, 0xe6111ac0, 0x48453aeb, 0xd97a40ac, +- 0x2ede144d, 0xce37bc35, 0x1c747832, 0x2a9c816f, 0xef2ba7f8, 0xff3499a3, +- 0x0e31bb46, 0xfc14a4e2, 0xfa50f32b, 0x67880577, 0xc9450db5, 0xfc5be9b3, +- 0xe69c4ab7, 0xde512718, 0x9cbe4727, 0xcfbcf76a, 0x3b4641f8, 0x68aed4f6, +- 0xf33647b4, 0x95248c75, 0x29fc030e, 0xa782fa74, 0xeafa78ca, 0x075f3cff, +- 0xf2bbf494, 0x25c97af5, 0x77f0df23, 0x30725cfa, 0xb1e21d2a, 0xeff1d25a, +- 0x55e2a8a1, 0xa93e03cf, 0x87f8d602, 0x060c3a5a, 0xb3554fb8, 0x67c5884d, +- 0xd769fa42, 0x18ccf886, 0x396bfe40, 0x2b8e504c, 0xf994fdd6, 0xe1bea8ef, +- 0x79e157ef, 0x3f0fc834, 0xd0241e97, 0xeaeb4274, 0xdf8829c5, 0x2ae403a0, +- 0x372a278c, 0x9a35d690, 0xdfe75f80, 0xfc79d2c3, 0x4afe777c, 0xd967ca2f, +- 0x67a7162a, 0x38e2a475, 0x257e71ce, 0x8864e886, 0x1bb068e3, 0x4fc9f134, +- 0xdd3dbe70, 0xf41b64fc, 0xd62bf94b, 0x6cafcb41, 0x1819fc79, 0xa7afc2ae, +- 0x5384249b, 0xff3dad1e, 0x7830744e, 0x7e300e5b, 0xe524d09f, 0x1349fbc3, +- 0x7f04e264, 0x6b4d1bf0, 0x6fdfd045, 0x32a73f00, 0xfd758739, 0xac47aed4, +- 0xeef5833f, 0xdf808188, 0x9489b379, 0xc5c9546f, 0x6aafd5ce, 0x5d62b7e4, +- 0x6ff454fd, 0xa009c477, 0x55b915e7, 0xe4d9bef0, 0xffe506be, 0x4ffc9d7a, +- 0x418bed66, 0x27bd6858, 0x593ffcb9, 0x7e9fe544, 0x158a6d8a, 0x5366ce00, +- 0x26b4f7e4, 0xff1fbe39, 0xf1eaf485, 0x92757a5e, 0x1de7ed83, 0x9affb4e9, +- 0x3f707aeb, 0xe71f1a1f, 0x2b27279b, 0x002a937c, 0x05291bfe, 0x145f0033, +- 0x68cfc0af, 0xcdbe82b7, 0x8277c34b, 0x22e3f37a, 0x234ddce5, 0xa6bd61b7, +- 0x06f7afc8, 0xe4ce4f18, 0x5f60c5ba, 0xc8cb17c7, 0xef05a7a7, 0xaeba38b0, +- 0x8e79069d, 0x394617a0, 0x42f91e98, 0x11de6af2, 0x920e3def, 0x4e5d7c0c, +- 0x2f306a77, 0x02704ab2, 0xd772947d, 0xe09fbe2a, 0x4aef94f0, 0xfde37bfe, +- 0xbdfcbd2f, 0xb8718e55, 0x6420999e, 0xad9f8473, 0x47c84467, 0x6b8620b9, +- 0xe6de4193, 0x27ec75d3, 0xb4ec75aa, 0xaafc88d4, 0xce3ee1e0, 0xb2c45fef, +- 0xfce70f79, 0x3f6c0d31, 0x173f37c4, 0x81468c13, 0x3028b5c9, 0xfe011779, +- 0x5e575de9, 0x5d7f7c83, 0xdcafbe64, 0x33f91ab0, 0xf789c8b6, 0xba349e41, +- 0x9199b12d, 0xd31fb1f4, 0x817f6b9d, 0x63e02bfb, 0xe4befb90, 0x80e41ca0, +- 0x3f7fe044, 0xfd157fe5, 0x7ca03e14, 0xa54384f1, 0xa17cf427, 0x7829df9c, +- 0xff3bacd9, 0xf5c1c8fb, 0x7d5d4f3c, 0xf328a1c4, 0x3e74def9, 0xbfce8bdb, +- 0xcb0e7461, 0xd15bd017, 0x9c818f13, 0xce5beb8d, 0xac4e316c, 0x6cd1f0d7, +- 0xe468fb8c, 0xde0140e7, 0xe7dd685f, 0x39d7d9fc, 0xf7ab32ce, 0xe0fe3575, +- 0x1995d1bc, 0x6e428fe6, 0x6b582ed7, 0x8df473c6, 0xbcb3c984, 0xbeafda33, +- 0x5234e9a7, 0xfaa29403, 0x09e7d01d, 0x21070ab8, 0x22685aef, 0xf83f7419, +- 0x4ee96a45, 0x71f9a788, 0x8a3c5cbb, 0x49a363ce, 0xee1d769e, 0x00d7dc0b, +- 0x0d8a6bfc, 0x88af884e, 0xf00538f5, 0x004ba043, 0xeb2f70e4, 0xfbba4c67, +- 0xbaafdc72, 0x1f4063dc, 0x52f4e01c, 0xa1e0abe8, 0x2faef5af, 0x9862daba, +- 0x72f0245c, 0x99791ebd, 0x4f034dcb, 0x6447ae2f, 0x41c9e411, 0x18448bbc, +- 0x07a644ff, 0x22647a43, 0xcfbe73c1, 0xf3e47a75, 0x7c8f5e1f, 0xb923d1ae, +- 0x08f5111d, 0xff9445fd, 0x68b9a684, 0x91c392cf, 0x862959ed, 0xb009c7ad, +- 0x097ad28e, 0xa1fbfb32, 0x52df3807, 0xc438c48e, 0xc63326c6, 0xc87a2b5d, +- 0xc3e48d31, 0xc0753bdf, 0xa6b50bba, 0x824f0f79, 0x9324d7f3, 0x4f83ce0b, +- 0xf748dd4b, 0xdcc374d3, 0x2251fc88, 0xe823bd00, 0x0b7e0223, 0x99834ff9, +- 0x456c5ddf, 0x48505939, 0xb9dd1d70, 0x55f23c76, 0x009a7179, 0x2eb15b7c, +- 0xb8f28056, 0xe8034ec9, 0xe31e652b, 0xc6481a17, 0x94839418, 0x8c1c9518, +- 0xc044eb97, 0x6f78b0d7, 0xc84b1492, 0xff4f3165, 0xb9b7ed58, 0x7ed5e684, +- 0xf65f9a1b, 0x9736fc5d, 0x65c9fcfd, 0x73c9b7e0, 0x8cc64678, 0x65cdff43, +- 0xac0ce690, 0x6f4a8913, 0xfb8ecc5d, 0xcb52fcbe, 0x40e443fd, 0xacec7f2f, +- 0xc7f42e75, 0xd47c024e, 0x06789f24, 0x153be1c0, 0x366eed11, 0x2f5c018e, +- 0xd2090f90, 0x9d494063, 0x4512fe08, 0x87035cef, 0x1ed428ae, 0x1433ce01, +- 0x85bd0379, 0xce3c6ee7, 0x7655fc01, 0x91fbd7f4, 0x931f208f, 0x2b47d61d, +- 0xdf110d8a, 0xc633be11, 0x67ea83f6, 0xd6f5fad2, 0xf8f0e59f, 0xe9e5115f, +- 0x3d9518ce, 0xd1f164f4, 0xc10e7644, 0x9bbbe5de, 0x45abf1f7, 0x192ef7ee, +- 0x615f7e10, 0x4324d9b4, 0x10f1293c, 0x4f155397, 0x410ab42c, 0xfea7c43b, +- 0x746e760d, 0x0337fdbf, 0xb7fabfa6, 0xb054a292, 0x6e0c5be7, 0x7c41196a, +- 0x7b83ca05, 0x267bc118, 0x616efe01, 0x23cd9b5e, 0x8843bf81, 0x3da0f7e2, +- 0xdc8df3da, 0x681ba1ee, 0x3356e2f9, 0xaebdcdfe, 0x1eefe53c, 0xb21ef1b8, +- 0x7dacdf82, 0xb8c48e4f, 0x1ba3634d, 0x858d6ce4, 0x51635fc1, 0x6062bbea, +- 0x1cebeebd, 0x64c2e27d, 0xfe29f7f4, 0x41dd89c5, 0xd692f011, 0xe0b032ed, +- 0xb18fd635, 0x957ce09b, 0xc700f5f3, 0x9b3de6fb, 0x73c75844, 0x862e3726, +- 0x764bcefd, 0xf3c00aef, 0x76b51395, 0x0ea158de, 0xb9246eff, 0x493ee086, +- 0x0ef88f91, 0x9a4c03b2, 0x1e1dc3d8, 0x9e573d50, 0xfd80ecf2, 0x11094c64, +- 0xae2a9e00, 0x5f2017e7, 0xb8478064, 0xbdfc006e, 0x08b7fe4e, 0x7bcd9c39, +- 0xf79005f2, 0x0593ed01, 0xfe6f6657, 0xeefb095e, 0x04fe2cb1, 0x07ecaae8, +- 0xb2f6fd87, 0x534fe0c9, 0x618d6fea, 0xaf2afc7a, 0xc45c00b7, 0x422f3e74, +- 0xfba613bf, 0xa929e0db, 0x9b72e5f1, 0xcf9aa5c9, 0x52f0827c, 0xc79c643a, +- 0x3cdec3a0, 0x62d9f748, 0x4f2bdfb1, 0x656e3105, 0x70c11d60, 0x07ed219e, +- 0x521a7ed0, 0x1d002ed7, 0x0b79ef37, 0x7db83bc7, 0x5cb94b27, 0x80f6e26d, +- 0x367dae32, 0xe3ee5eb6, 0xe70dd1e7, 0x7af97ad8, 0x92e3178c, 0xe4347994, +- 0x28ea9379, 0x6f1095fc, 0x78efb633, 0x4263b79b, 0x016f36f1, 0x77a76abd, +- 0xd3de06ec, 0xf7120dfb, 0x247a451e, 0xf1db642e, 0x08177b95, 0xce5627a0, +- 0x5037ec8c, 0xee4ac5f4, 0xb5c55577, 0x5aa317bc, 0xc696a72f, 0xfa54d359, +- 0x4cf76948, 0x3365ae38, 0x53796b8f, 0x52d46ed3, 0x0cd3f00b, 0x8c10e79b, +- 0x3f7bf95b, 0xd1dff9eb, 0x0ab1f651, 0x0c9d52be, 0xdcc7af5f, 0x8dce0fb8, +- 0xca4e4f00, 0x912debc7, 0x9c13c3e3, 0x306f6e06, 0x8ced217e, 0x6a1e605f, +- 0xb702ebbb, 0x78f2ae3b, 0x4f8c8c0b, 0xc93e453e, 0xdf01b7f5, 0xdb922f8e, +- 0x1087ff80, 0x8c4527ce, 0x1efcf44f, 0x7ce38ced, 0xef004dd2, 0xb1bde163, +- 0x3ff1fa08, 0x067cd863, 0xff23e7b4, 0x0af87950, 0x3a949bd7, 0x4923c251, +- 0xc38c54e7, 0x7e995584, 0x69eb931f, 0x7a737e03, 0xd39e504a, 0x07664ead, +- 0xa0fe32a5, 0x426705ed, 0x2ffe9e58, 0x4f842ce7, 0x00008000, 0x00088b1f, +- 0x00000000, 0x7dedff00, 0xd554780b, 0xb3dae8b9, 0x64932667, 0x6f264c92, +- 0x80849af2, 0x3c870108, 0x4e3d2878, 0x0f78601e, 0x02483508, 0x48042bc3, +- 0xd2d04132, 0x20196f1e, 0x83548086, 0xa96a1ea5, 0x5af11e0e, 0xd528368a, +- 0xf09d8360, 0x41d0582a, 0x396b42d1, 0x0a8a2341, 0xf41ea009, 0xfffde3d0, +- 0xcccdad7f, 0x228899de, 0xb9eefbf6, 0x62ecfd37, 0xdaf6bded, 0x8fdffaff, +- 0xfb0cd7b5, 0x33d6c60f, 0x2a1d76c6, 0x8cb96c96, 0x794bfbc5, 0xc5a398cb, +- 0x8cf3d8cc, 0xff40b595, 0x9dbbfc2b, 0x7463cfb1, 0x1630258c, 0x2b18916b, +- 0xa46fac64, 0x598dfa85, 0x187ae4ae, 0x15d236bf, 0x79c0496d, 0x26090e74, +- 0xecc27e19, 0xf8743065, 0x99997af2, 0xc4bf5e71, 0xd5acc664, 0xbc232296, +- 0x2ec6b537, 0x7efe60b9, 0x0b78ce91, 0x0b1703cd, 0x79d22da0, 0x2d73c0d7, +- 0x66a38ed1, 0x6792cf78, 0x269d2dc2, 0xc15f7f46, 0xb12db57f, 0x35bbbeaa, +- 0x2039d2c5, 0xff825fd0, 0x0eff8148, 0xc61b1331, 0xc5bf0d58, 0x2caec896, +- 0x6b57cc0b, 0x0e6878ea, 0xf37eebf4, 0x92c191b9, 0x805eb86c, 0x7943f9e3, +- 0x81cd7391, 0xd62adef5, 0x55c39b79, 0xcff187a2, 0xc66eb946, 0xf08e47e7, +- 0xa1e193ee, 0x7d9e65e1, 0xa40b687a, 0xb0517dfa, 0xd996365e, 0xae3f41b7, +- 0x4347b583, 0x8744f637, 0x47fa1a23, 0xa784b1cd, 0xb4743f5b, 0x62fac2e7, +- 0xe7c24c9c, 0x38f95f01, 0xe5778b1f, 0xde23073b, 0xe00ccb96, 0x61e90178, +- 0x8e3d36be, 0xdf04759a, 0x53873351, 0x4884c3a1, 0x5d0b28c7, 0x4f5ef467, +- 0xd7801b31, 0x95d04c37, 0x579e8379, 0x4cc5a75a, 0xcf1baee3, 0x307d309f, +- 0x7fdb599e, 0xe813f8bd, 0x32dff1bb, 0xf029dde1, 0xd617dd1e, 0xef09f3fd, +- 0x95e0ba26, 0x61f7533a, 0xdb51f009, 0x5864db26, 0x9664a0c2, 0xd8c719db, +- 0x0eadfb9a, 0x5a2783e4, 0x8c187b24, 0xb3660e67, 0x25643224, 0xdff9d622, +- 0xb7610cc7, 0xac170b40, 0x6293ce30, 0xde436ef4, 0x43337fd9, 0x02b1dc38, +- 0xc3e8068e, 0x05165d73, 0x0df50730, 0x459feaec, 0xf861f182, 0x6a4b982f, +- 0x80976f69, 0x30466b70, 0xdee00197, 0x3f1326d7, 0xe118d13e, 0x7ff9830d, +- 0xe1e2e3bb, 0xb9cfd099, 0x82cb875f, 0x339609bf, 0x43a8f891, 0x395a0afa, +- 0x0f4034da, 0x8472edf7, 0x2df1865d, 0x5843d111, 0xfb45630c, 0x9ad9f988, +- 0xbc0f307e, 0x047b4d67, 0x3f4d6fad, 0xe22c8f90, 0xff917b83, 0x591947f7, +- 0x04bf5c0a, 0x86e38372, 0x46378eb3, 0x74e80565, 0x59d3f5a9, 0xeefd617b, +- 0xd76f3e48, 0x91fd2bde, 0xe3fb957f, 0x97b5cc56, 0x2c5633e6, 0xf38a7ebb, +- 0x1d5fd729, 0xe2345ef0, 0x8234b19b, 0x0727e897, 0x378abbe0, 0x1cafc70b, +- 0x7475a7a5, 0xae3b08b1, 0x60e8c5bb, 0x29cf2748, 0x5e0adfce, 0x746f04eb, +- 0x709e15b5, 0x389efac1, 0xe7c76691, 0x852f5abb, 0xb37de0eb, 0x230f5c63, +- 0xeef4e5dd, 0xe22e6768, 0x1dcdd2f3, 0xe75eb8b9, 0xd2ef8446, 0xaeacf791, +- 0xdf5aebdc, 0x7d64df63, 0x49b9bd6e, 0x3fc9e98a, 0xda903e5a, 0x8690bfda, +- 0xd4309c90, 0xe60c9e5b, 0x6eeb035d, 0x49b43c1c, 0x634f4246, 0xc64f9436, +- 0x06672c2a, 0x313de805, 0x12ddb9c6, 0x188e5f24, 0x2f5c0ee7, 0x8f3527be, +- 0xde1cf9d6, 0x5e74721f, 0x5d7741be, 0xf4297ceb, 0xaf447d3a, 0x5a9eb15a, +- 0x0327d993, 0xe1976cfc, 0x3e450e93, 0x0bc27bb3, 0xf08bd8f4, 0x27ed8a79, +- 0xbfcf485c, 0x106bed9a, 0xc5bf7a1f, 0xeff04519, 0x11b1f7c7, 0xbd719273, +- 0xff1d236b, 0xf6fe8665, 0x83f38c55, 0x127f6114, 0xbf73b716, 0xe4f50235, +- 0x9fd718c4, 0xba81be71, 0xd09cb38b, 0x753bf02f, 0x781db973, 0x92fbac4d, +- 0x97a8e09e, 0x58ebfe71, 0xaf425fff, 0xfe1d07bf, 0x05074c16, 0x7d04a33f, +- 0x507e2147, 0x3feb7721, 0xf00530e9, 0x4f528123, 0x8f9cf6b5, 0x840c8eb1, +- 0x07f77db7, 0xbe603bfd, 0x983e57ba, 0xf75bf285, 0xb7111872, 0x639be5f4, +- 0x17cf8f90, 0x7316f2b1, 0xc9fa7d4f, 0x3ebb7aca, 0x4b4eb187, 0x1ad5e936, +- 0xbeb237e6, 0xda974fa8, 0x14fa41f5, 0x47fba620, 0x3809fe0c, 0x994291ff, +- 0xbbbe02ad, 0xc49e1f64, 0xa569e842, 0xb3256d7d, 0x7fd807cf, 0xf00e7a8e, +- 0x4177643f, 0xcda5e10c, 0x3b58fa4a, 0x6acac8fe, 0xef4e697b, 0x1a191df3, +- 0xbb45ee5e, 0xb0673121, 0xe588497d, 0xb4572576, 0x081d28a0, 0xa317b9e7, +- 0x74b81ebc, 0x68adef2e, 0xb73a7806, 0x0f7ccdeb, 0xe639cbf0, 0x9407f65f, +- 0x6ccd4f9f, 0xa1c76a1b, 0x8aafe56f, 0x0fdbc80a, 0xffb5f046, 0xd1a3a5e0, +- 0x613f1836, 0x4f78bee7, 0xc07efe10, 0xe55e9ff4, 0x2f7c2cdf, 0x7d30fc23, +- 0x07a47f47, 0x44d9c3fb, 0x7613b41b, 0x7ce7881f, 0x3a43a890, 0xeb7a172f, +- 0x64697877, 0x2b09be60, 0x948f88ea, 0x1365ed7e, 0xf505c6f3, 0x9a237ef5, +- 0x66cbdabe, 0x5f7185e6, 0x49e2a258, 0x7d61f47f, 0x537c7f50, 0x2baf69bc, +- 0xf4323b78, 0xefda066c, 0xf9a1e1f3, 0x77188464, 0x09323ec9, 0x4609a3fd, +- 0xc4258e5f, 0x34bcc638, 0x57aebb4e, 0xa5ecba57, 0x1be1defa, 0x96ae646f, +- 0xf4347c10, 0x99c37bea, 0xd97ae407, 0xa1d90356, 0x32fe57a3, 0xf7e81f2d, +- 0x658316c1, 0xfab3e035, 0x7ed2fbd7, 0x87abf70e, 0xe8245986, 0xe5f3607f, +- 0xfc2f1f20, 0x75c4ecb5, 0x5965b07f, 0x3f683ce2, 0x01ac7e06, 0x356e1638, +- 0xadeaf5d0, 0xb3f5d2f7, 0xfe174f82, 0xea10613a, 0xd7fba3f9, 0xab3ae227, +- 0x87f6b1ff, 0x1a762fa8, 0x4286832d, 0xb243b35b, 0xc5c90697, 0x55c2a7e2, +- 0x563a9dfd, 0xd650eb8d, 0xd5d724cd, 0xa78036fb, 0xddf7562a, 0x6afd97fc, +- 0x95fc05ff, 0xf204d8aa, 0x09dd2657, 0xbc2baeeb, 0xbee27e44, 0xc7641183, +- 0xc99668ff, 0xfd0df01f, 0x02df3fcf, 0xe87f92fd, 0x0843e4ed, 0xf42d1f3e, +- 0xa4c96332, 0xbc4caa87, 0x4f5bb25f, 0x944944fe, 0xf186f84c, 0xff70d1e6, +- 0x1f78c45f, 0x37e40de8, 0x34da8f26, 0x8e8dc612, 0x13f43031, 0x78b7c5ff, +- 0x7efd0302, 0xbbfd65fb, 0x29eb411d, 0xd003cd66, 0x06622911, 0x1e8775cd, +- 0xd49897af, 0x8ce747d7, 0x6e768b3b, 0x5d7d45b4, 0x58869b91, 0x0141ffe0, +- 0xf077dffe, 0xc3c647a3, 0xc88eaafa, 0x86bb0fdc, 0xe10d797e, 0x5f9d23d7, +- 0xcf01d8ad, 0x3958151d, 0x8683e57a, 0x11abe414, 0xfd0d5b12, 0x9584ae0f, +- 0x0b879285, 0xbca36fe8, 0x80efa033, 0xda277d00, 0xa3ed5d17, 0xb11e4c38, +- 0xe11f6af4, 0xee7ae6ff, 0x11d1e5eb, 0x6bf7a46b, 0x6e56a0f5, 0x383d2fbe, +- 0x0c81e861, 0x4fb5144f, 0x4ec9fb63, 0x7ab45fae, 0x14f7ab51, 0xd6f0b4b8, +- 0xf4a9d65e, 0x1b58d0dd, 0x3de80b8d, 0x1bbde923, 0x8d1d5f18, 0x815f110d, +- 0x797c265d, 0xae29e986, 0x0de1bf03, 0xb66b971c, 0x480115c5, 0x48ec960d, +- 0xcc33e7d4, 0xee50b7ae, 0xb03b7f32, 0x1ebd8194, 0x8759a3b4, 0xe24ba37a, +- 0x106edaf4, 0x0373f62d, 0x623bcff1, 0xbcb1edfd, 0xc50ff10f, 0x8a2bd98d, +- 0xfeb07bd9, 0x84f31330, 0xf7bd91e7, 0xf302f218, 0xa2e31cbf, 0x8c458d71, +- 0xdcb19dc7, 0x601ecbef, 0x7e6059d3, 0x87592036, 0x70265af4, 0x25a576b1, +- 0x7bf813b7, 0x6a64cadd, 0xe7c45fd1, 0x68237b3c, 0xce4bef5d, 0x6b772821, +- 0x7a5a7c05, 0xfe155b64, 0xf60ff676, 0x87141687, 0x56d1d3d6, 0xe8a7ad3d, +- 0xe81919d1, 0x7edfbc6f, 0xcfea0677, 0x3f5e01f7, 0x3dbd3fda, 0x84fcebe6, +- 0x3e3c8587, 0x8c44ec28, 0x267f2388, 0xc7d804e4, 0xb5fd13b1, 0xbfba4e95, +- 0xb539656e, 0xa0ae571b, 0x59b1ddfb, 0x91e8fef4, 0x81b3fbcf, 0x641b9d7e, +- 0x8c0b03b2, 0xf0b1fece, 0x8e934ede, 0xeaf7d1e2, 0xccbb65cd, 0x5c519d78, +- 0xf1d1e0b3, 0x142e50db, 0xf563ba38, 0xd6deeeb4, 0x3ebd6d99, 0x3acb5dfd, +- 0x5d1ed1a2, 0x0077c7e5, 0x7e01893b, 0x32bb219c, 0xc71809ad, 0x38e22474, +- 0xbfefe4b7, 0xee808283, 0x956ff40c, 0xeccafff7, 0x6216b6c8, 0xa106c39c, +- 0x7044b45c, 0x7385a37b, 0xd9f395a0, 0xc13695da, 0xfda80307, 0xef61f858, +- 0xa10a9da3, 0xcf116e57, 0x6e3b361d, 0x6630f7c1, 0xd6937f26, 0xda3bfa81, +- 0x42708791, 0xf78050bc, 0xcbd52587, 0xdbf90906, 0xf80df5c2, 0x771fdca5, +- 0x2c71c48e, 0x044d21de, 0xf9130c7a, 0x05f2de9b, 0xb4de385a, 0xe6d0f972, +- 0xc9569411, 0xf95a9423, 0x6b16fe7a, 0x6c77e551, 0x2a11cc2d, 0xcad5b07f, +- 0xc3b266f5, 0x7ada4721, 0xd702bb97, 0xf3191ebb, 0xdecce524, 0x51a49a0f, +- 0x3f98ed2d, 0xaef52949, 0x634afcc2, 0x3d0e56ac, 0xc95798e1, 0x3d12e976, +- 0xefd12e30, 0x1c02322a, 0xe912625b, 0x7eac497d, 0xc0abd215, 0x1745a3a5, +- 0x4af08fec, 0x4307904a, 0x047e85f2, 0x79470d09, 0x9ae51f1b, 0x5f9df843, +- 0xc368c6bf, 0x464793fc, 0x025672fd, 0x38fe013e, 0xa422207b, 0x228f773f, +- 0x1f7152b7, 0x4f05e934, 0x050f0819, 0x1662fd4f, 0xd4f05bc2, 0x28297a1d, +- 0x6ac87f4e, 0x3d9dfc20, 0xe29338b0, 0xac6193e6, 0x79cf565f, 0x545f051b, +- 0x60bf7c09, 0xab77cd0c, 0x5baffbc5, 0x7f82774f, 0xd3d2a893, 0x8109adab, +- 0xed5d4c7c, 0xb3d3d245, 0xfc3edcac, 0xb072df4a, 0x57f3e00f, 0xf11d99f3, +- 0xad99f8be, 0xc17ba794, 0x077632d8, 0xc74ea7ae, 0xffb00f30, 0xfb07cbe0, +- 0xdf387fa0, 0x83fd1436, 0xd91fcfab, 0x7fd788de, 0x2286cd55, 0x1bbc53fe, +- 0x7c07cc25, 0xf84cde1e, 0x185b7cfa, 0x5a4b055b, 0xec65ac74, 0xb9bfa04f, +- 0xaf50c746, 0x6f0dd768, 0xb192e832, 0x237419f5, 0xff51fd38, 0xc6077429, +- 0x143d2232, 0x50fe21ba, 0xf6dfed9f, 0xc0afc112, 0x46c625b5, 0xccfc5bf8, +- 0x27c8b1ce, 0x12ac6a7d, 0xb81467e6, 0xb89dabbe, 0xf7f3f681, 0x3f666fd6, +- 0x69fa465f, 0x6ed6a7ed, 0xf63b30ce, 0x86bbfe90, 0xf8231cfd, 0x0f4237f0, +- 0x41ed98db, 0x23b253cc, 0x68f7ca3a, 0xf82a52e9, 0x7a2f2831, 0x791d7ac4, +- 0x2b5661d1, 0x179b57bd, 0x7ae46edd, 0x66cad9b4, 0x87e5094f, 0x9b757809, +- 0x17688dba, 0x90a4dbe3, 0x99a8e97a, 0x9bd025eb, 0x9f7241ff, 0x86af5a1a, +- 0xc419efc0, 0x7c3bcddb, 0x5e54717b, 0xba244e6c, 0x0fcf805d, 0x7814f854, +- 0xe0aaf054, 0x88a631b3, 0xf0bb65f8, 0x70c4b733, 0x9970297c, 0x8e7194e3, +- 0x7a5f380b, 0x0bfafa2f, 0xff806781, 0xbf1fc232, 0xeaf2a99c, 0xbe3d3e4a, +- 0x0b1923de, 0xca302cd0, 0xb9c665bf, 0x5c601956, 0x7f6648f7, 0x1531fa12, +- 0x77d42296, 0x3b7b6ad6, 0xcf1bdde6, 0xe366bcf1, 0x4d5de652, 0x7ffe30f3, +- 0xa3ca6cae, 0xe69dde22, 0x5941769e, 0x532bd81f, 0x15c1215c, 0xf635f711, +- 0x45ca06ea, 0x9337dc72, 0x10b8f48b, 0x731b7b74, 0xc7210980, 0x4379c5f7, +- 0xaf0739d0, 0xb7ce8b5f, 0xe5e57889, 0xcd472998, 0x0cb56fc2, 0x4b5dd009, +- 0xdf91becf, 0xc4f78f51, 0x09716dcb, 0x61b2f13d, 0x1e806e82, 0xec22c9d7, +- 0xa4ceeca1, 0xdf3defb8, 0x442e293f, 0x54fe1fbe, 0xab13f4fe, 0x84dfafed, +- 0x5326be70, 0x4fc4f49c, 0x27988c3b, 0x0ad2f256, 0x812feebc, 0x773f40a3, +- 0x56a3a97d, 0x26d75eb9, 0x55dc63e5, 0xf90aefb4, 0x5fed5dc7, 0xa5dc7f92, +- 0xf7958ff1, 0x89ec03de, 0x365a31f2, 0xdc5fff13, 0x9978e3c2, 0x146dfed9, +- 0x643ee1c0, 0xf11b5e60, 0xb40ff92f, 0xc45fe85e, 0x633fc716, 0xe16f78a4, +- 0xf98617e1, 0x08cc52e0, 0xe105b31d, 0xc111d62b, 0x8af8416c, 0xfaaab32b, +- 0xaa3ece09, 0xd9e549f1, 0xae29fbaa, 0xa9fbaa81, 0x7eaa79d5, 0xaaadfd7a, +- 0xb76099f1, 0x9e59fb82, 0x7df1aa71, 0xfaaaa69b, 0x56ef9afd, 0x871e678d, +- 0x39d6073f, 0xa6f3ac5f, 0xe35573cd, 0x61f24f99, 0x2081647d, 0xc7dbc7f3, +- 0xc8fac21c, 0xb88f917c, 0x3558bbd9, 0x756682df, 0x08f0815e, 0x956aab78, +- 0xb78863d8, 0xd5fbeacd, 0x531b1b6d, 0x55e45da1, 0x758c5f5f, 0x53f9090f, +- 0x3af7fd7d, 0xe3f432e7, 0xcea7197f, 0xbe935dd3, 0x45ae9b9e, 0xc70fbb5f, +- 0x7f2288ef, 0x79e1e167, 0xc9614724, 0xdb86fa6a, 0x7f16be22, 0x9aac0391, +- 0xafbff0fb, 0x5d945fc1, 0xfc5a0fcd, 0xc1f759e9, 0xceab8054, 0xac7dd92b, +- 0xb516fe27, 0xb538256e, 0xede2d3f8, 0xbcea718f, 0xd748dace, 0x971bd45e, +- 0x0ccb975a, 0xbc65f3f3, 0xf5a978fe, 0x6c4721d3, 0x7ef97941, 0x5fe5e6bd, +- 0x97910b8d, 0xcb7ac2ef, 0xd41bec2d, 0x817df65b, 0x8b030878, 0xb27a0063, +- 0xd5d37611, 0x20784afa, 0x5bd5af0f, 0xfb7a0b4a, 0xcfa4716f, 0x35a97503, +- 0x98b0f4f0, 0xaf089db7, 0xef18b752, 0xb7bc1172, 0xe1232020, 0xa75f333f, +- 0xe1e00f32, 0x7c679c3d, 0xe3123591, 0xeffb9da7, 0xb58078a1, 0x073d73c5, +- 0x1f1e0f24, 0xfe9297e4, 0xa67fc16c, 0x48fc3d90, 0x704fc3d8, 0x321ec53e, +- 0x57bf959f, 0xe6dec3d8, 0xbd16ea51, 0x995ed2b5, 0x58dd2fea, 0xcfa1097f, +- 0xd1dff18d, 0x23d27cae, 0x0f8c69ff, 0xbdee0f8e, 0x3af51074, 0x1e3c3de0, +- 0x051519d6, 0xd80a52f6, 0x8c8b7fcb, 0x3eeb7926, 0x826f7b2c, 0xb64d170b, +- 0xa06e6b18, 0x7785a2be, 0xab9ac994, 0x6de3d20f, 0x365eda92, 0x23ff71e6, +- 0x1dfb9e31, 0x2fdccc93, 0xe9d62c1d, 0xeeebf8d6, 0x82971e26, 0x05b75434, +- 0xe38381f9, 0x3bfc68a3, 0x71834511, 0x5c455b3d, 0xd12598df, 0x89251afb, +- 0x312dfaec, 0x9dff74c5, 0x6c5ca2b8, 0x0ef789fb, 0xda089f46, 0x8f0e6ce6, +- 0x5013ec4d, 0xc710ffe6, 0x4c5b6217, 0x8b78e0ed, 0x0658efc8, 0x448fbd22, +- 0xa35e6838, 0x29fcab2c, 0xe78bcda5, 0x99a7447e, 0x2a937e29, 0xe8463c7f, +- 0x8717cc31, 0x26393091, 0xe40c4e8c, 0xea3c998b, 0xe45e31b8, 0xdc7a2589, +- 0x5dbc7481, 0xbcb7b1d0, 0x658063b1, 0x4439bc3f, 0x1c97d8de, 0x1f6c6f32, +- 0x78637943, 0xd2eb8f52, 0x0e918fe6, 0x3c80d691, 0xaabf8c4c, 0xdf50d26f, +- 0x3c756634, 0xe3f91e32, 0x127f6ca8, 0x13c77f41, 0xb6e00439, 0x7c7675d9, +- 0xb616e464, 0x0bfa1c3a, 0x2fca363d, 0x8afe2019, 0xefc80bca, 0x4e2cf892, +- 0xd33e13ff, 0xfc3fb810, 0xe63b671d, 0x634ffb93, 0xcdff5456, 0x1a24b9ac, +- 0x2c2d88fd, 0x2552bc64, 0xd17c66f8, 0x3ce5195e, 0x25f81ba1, 0xe2aa3d04, +- 0xbdbf8a75, 0xbc36e900, 0xf50975db, 0x4807a289, 0xb45c6195, 0xb27e475f, +- 0xe896f9f6, 0x07c42592, 0x9279d0de, 0xe387334e, 0x29738442, 0x57783fce, +- 0xcdf51187, 0xce6f4542, 0xd03d31d7, 0xbf414ef7, 0xbaf0b73b, 0xd5f2bb34, +- 0x5fe2b257, 0xa19f9a31, 0x2d38583e, 0x87798bca, 0x1e596d85, 0x5129cb82, +- 0x76ddc55e, 0x85fd89cc, 0x8c160505, 0x657f1d73, 0xe40199d2, 0x77ae319a, +- 0xa28cecf4, 0xc67ec807, 0xaa629d53, 0xb34eabe0, 0xfd04e08d, 0xe81221bc, +- 0xaacb70b0, 0xe12fb8bd, 0x54677fad, 0x7721388f, 0xa6c9c30f, 0xe4567203, +- 0x1567ab61, 0xaf30f879, 0xf3134c77, 0xf784be78, 0x9def029a, 0xd69876de, +- 0x3cc0c273, 0xae97e026, 0xd0d9773d, 0x304c6d4f, 0x457f89d9, 0xec94eb9d, +- 0x878c807a, 0x410ebbbe, 0x6916d19b, 0x58eb0f59, 0xafdc6463, 0x11d845d5, +- 0x1dcd13ff, 0xf897e27a, 0xf1e23d6e, 0xf467410d, 0x4fcfc9ed, 0x39274460, +- 0x96e9c755, 0x44fbe369, 0xbff9d472, 0xc1dd0497, 0xebc34c6b, 0x58df2313, +- 0x7cce036e, 0xc70fd376, 0xdea247e9, 0x1679637b, 0xdd365bf4, 0xfc8f4e35, +- 0xa7c6fa9d, 0xcfea2059, 0xf7e72a6f, 0x69f1bd07, 0x6d77f436, 0xdfefc19a, +- 0x5ecfbc46, 0x38f774dc, 0x74bfebcc, 0xf9f02f55, 0x12422097, 0xc395bfae, +- 0xe2a1f574, 0x92bc5f0b, 0x7c06665f, 0x4fedb38f, 0x3aced027, 0xc3b7fa95, +- 0x237faaa0, 0xdf8098c7, 0x62be0bc6, 0x0764d1f1, 0x8dfa09c6, 0x3f68fbd7, +- 0x23e4ce8c, 0x1ac4defc, 0x8037c82c, 0xe55f4dad, 0xc07f7cf7, 0x4bf9a9ae, +- 0x02b63072, 0x2cd92de8, 0x566b27c4, 0xda385730, 0x5ddd40fd, 0xcceeebc7, +- 0xe057ef89, 0x03dfde51, 0xdead202e, 0x16d70c1a, 0xab81479a, 0x0798686b, +- 0x9fb149e5, 0x525d5c0a, 0xf498e3f7, 0x0f2fd9fe, 0x75ba404e, 0x48677545, +- 0x7090dfd0, 0x95d8e890, 0x64b8fdd0, 0x381bea0f, 0x5a6ccf1d, 0xef03ce36, +- 0xce3b28d9, 0x1986dca0, 0x2692bef9, 0x3de0538c, 0x3cb8260f, 0xbe03cf58, +- 0xef90fbb3, 0x87a48dd2, 0x79d40b4a, 0x67c16e89, 0xdeb813cb, 0x5cd61d1f, +- 0xd2f80c7f, 0xab624bbd, 0xcafbbc60, 0x89da2325, 0x8da76d89, 0x76eb680e, +- 0xbea2369d, 0xcc3ec3aa, 0x18c5b753, 0x12796f52, 0xd43f6164, 0xf481f07e, +- 0xe3c40ffe, 0x12f985be, 0xd9eee255, 0xfb1a3b1d, 0x55c1ccf7, 0xa8f77632, +- 0x5d91a39d, 0x0fed9d2a, 0x759b3b60, 0x9a16401c, 0x7e5592e1, 0x48eacce9, +- 0x595b5f95, 0xcfeaa71f, 0x80ea066e, 0x915ecf5c, 0x181f8eaa, 0xcf00abc4, +- 0x43f8160c, 0xe82e56fd, 0x83792338, 0xccadf71f, 0x1d3c1970, 0x6c4df341, +- 0x22b7a55b, 0x9d92f5dc, 0xd987afd4, 0x7c99b9f0, 0x3dead085, 0xd1b0f5c1, +- 0x51893cad, 0x7f226e57, 0x80fb02bf, 0xd91a8ad7, 0x0f10936b, 0x6eefba46, +- 0x5bbee895, 0x4b5777dc, 0xec961d4a, 0xe3016cee, 0x46c73dcc, 0xe110b6d3, +- 0xcef02bdf, 0x4b3b2f2e, 0x7afc28fc, 0x36e55d65, 0x7d70b3b0, 0x06dbfa6d, +- 0x8ff6779c, 0x45971624, 0x50eceaeb, 0xafdd51e1, 0x19f757ac, 0x9e6030eb, +- 0xf50af67a, 0xc209e1f5, 0x83620e9e, 0x25469e50, 0x2f927a48, 0xfd24ffd1, +- 0x007cd7ed, 0xf3b2e3df, 0x83e004f6, 0xea8fa31a, 0x2ecb8f50, 0xe1f72bea, +- 0xb9231d7a, 0xe4807f03, 0x5cf92258, 0x8a587063, 0x95ae8fd0, 0xb2676f88, +- 0x2b217f20, 0x72fa9e30, 0x093dfecf, 0x135a5fdc, 0xf54e5cee, 0x65923db0, +- 0xd52a5c1b, 0x07e8f43b, 0xe74291ae, 0x70259643, 0x418d7879, 0xf5700ef4, +- 0xbb452647, 0xd78c677e, 0xffedef03, 0xf41e39c7, 0x03e7fbef, 0xee50d81f, +- 0x2f19bdb9, 0xf024cdec, 0xebffd12f, 0x9394b72f, 0x68c5bf7e, 0xec2efd21, +- 0x1c2fa290, 0xa1db51bf, 0x288769f1, 0x79b498fe, 0x8bd405c3, 0x791d7d39, +- 0x07be011b, 0x1ffbf9c3, 0x71792ddc, 0xee5d4e1f, 0x499fd241, 0xdef81ec0, +- 0x47a164ba, 0xacfbd55b, 0x21af5092, 0xa5c84cc3, 0x1498a6f7, 0x1e90776e, +- 0xbac57c94, 0x497e80af, 0x69a9bde2, 0xe257c236, 0xd70916e2, 0xab3cce9d, +- 0x45cf8ed0, 0xb40c2c21, 0x97cfedd7, 0xbe7f5a4a, 0xe4f9fc9b, 0x7bc5230e, +- 0x9df8dbac, 0xe73d73f2, 0xfcd432ff, 0x53aa7cb0, 0x2bf2e207, 0xb9a798d1, +- 0xafdf4f67, 0x9b24dfdd, 0xc1b771d4, 0xc7bb8ea2, 0x9feb500f, 0xdeb57689, +- 0xafa23c99, 0xc714feea, 0x3bfdd520, 0xfd55f2cb, 0x54dbcee9, 0x2f2aefe3, +- 0x92c3f551, 0x00f269c7, 0xe44abcea, 0x255e7500, 0xa3ceaeca, 0x7dfe1d84, +- 0x317804b9, 0x2e1d3c9a, 0xc81343c0, 0xc06b08c6, 0x368a0c8e, 0x22367151, +- 0x6d8cdc3f, 0x1f30d0d3, 0x1f5349f2, 0x1d87871e, 0x07d937be, 0x766298f3, +- 0xf104b098, 0x1c5bc95b, 0x9a007307, 0xf03a9ea8, 0x39bfb57e, 0x17db8532, +- 0xb825f5a5, 0x36844f5e, 0x2a5b19f7, 0x14fd67f7, 0x1822989f, 0x345e8bf7, +- 0xc4a45f91, 0xe93ccac9, 0x50074569, 0xefdee47f, 0x6b09baa0, 0x27cc1665, +- 0x7914693e, 0xbef917d4, 0x0ed6dcdb, 0xbe48239d, 0xfae44cef, 0xe2ce17e0, +- 0x5d7f38b1, 0x9459581b, 0x1aefcda7, 0xd7593eb1, 0xf68d1ed6, 0x5df3886c, +- 0x02ebe623, 0xd39d85d7, 0x5d604777, 0x722d77e5, 0x72cafdc8, 0x1febcf22, +- 0xf2bd7a14, 0x547c40de, 0xafa02c34, 0xf5f2772b, 0x92374e55, 0x46c2c13e, +- 0x7a0dbd28, 0x2ade67ba, 0xf28c1ed8, 0x03ba803e, 0xdc6ab7f4, 0x2e3c69ec, +- 0x8dbd00aa, 0x5cfa0c72, 0x91ad3f7d, 0x73e80bf4, 0x010bf5d5, 0x15fb9e7d, +- 0x19c2773c, 0xe8f65f7a, 0x3f375e14, 0xfc212ae1, 0x88f002ff, 0x7a2ff27e, +- 0xf3e38de0, 0x167af85a, 0x37441f69, 0x2929b8ed, 0xb67c7fdc, 0x433d7d17, +- 0xc949f5d0, 0xd4ca879f, 0xbe208ced, 0x8d72699d, 0x7a47ccef, 0xf588de7c, +- 0x4bdfca89, 0xdfeced0c, 0x7ed30fda, 0x03cee33d, 0xd28fb889, 0x912072dd, +- 0x18d5df01, 0x8fd0ab6c, 0xa3b0be07, 0xead753df, 0x5b6bf823, 0x7af1dbf2, +- 0x4764ab6d, 0x75deec55, 0x93ad0c61, 0xbd623475, 0xe05ec9ef, 0x76e44cca, +- 0x8da26064, 0x985c07e7, 0xc3e7c113, 0xf9095ebc, 0xc212f400, 0xcd625bb5, +- 0x9d727fd0, 0xb79d6429, 0xff7be052, 0x57c5233a, 0xae3cf035, 0x41fa60e3, +- 0x68f909a3, 0xc24bac27, 0x1e9b1c75, 0x372ff389, 0x142ff430, 0xfba5cef8, +- 0x4ffae14f, 0x070087ce, 0x2f99afae, 0x2e4fbe13, 0x05c87917, 0x58cfea06, +- 0xdd7e2464, 0x46bdff37, 0xac9defcc, 0x4bdcfbe1, 0xf9467c16, 0x248b19be, +- 0x8a993f65, 0xd57e159f, 0x7f96a7f2, 0xf569f07b, 0x98e9f1f5, 0x3a7cabc4, +- 0xd03ced04, 0xf212747d, 0xce218fcf, 0xb2b9f946, 0xf00490cf, 0xec5a3766, +- 0xb06bafb8, 0x11207dec, 0x7e3ec4f5, 0x56cd687f, 0xdb1beb89, 0xa98728dd, +- 0x1eb6464d, 0xae44cbfd, 0xbd206697, 0xdd69710a, 0x7bc52452, 0x4bd46cfe, +- 0x0ef7ca59, 0x13be5606, 0xae7a71f3, 0x94bf066f, 0x107d75bc, 0x39129adf, +- 0x707a2abf, 0x76b99190, 0xa5bfde52, 0xe79814cf, 0xdbaf0359, 0xfaf98864, +- 0x331eedf5, 0x089fda05, 0xe027997e, 0x0af7fa50, 0xcd4f67fe, 0x344efc20, +- 0x5b8fbc71, 0x75c0abe1, 0x8b5d1934, 0x84fee112, 0xd06bb78c, 0xbf6535ce, +- 0x42f94b9a, 0xa73b2366, 0x46fbe7c4, 0x1965b07e, 0xe6fc37ac, 0xf863a208, +- 0xe4168d9e, 0x057ef0e3, 0x7c10ae49, 0xcbeeb4a7, 0x3902e636, 0x4d9cbbaa, +- 0xb29fd2ad, 0xf691acf7, 0x185db721, 0x39727243, 0xcf2bae99, 0xf9114a2d, +- 0x53dfb12a, 0x9e825fc9, 0x0bc88fd6, 0xc0f0538c, 0x215e1770, 0xd114f3c2, +- 0x3652d96b, 0x37d1a794, 0xd667fad2, 0xc0e6931c, 0x1c19773c, 0xd6167306, +- 0x77c7cacf, 0x537ee0e6, 0x71fd5cc6, 0xb9899d9f, 0xcfdfb88c, 0xcaff7d42, +- 0xb1bfea64, 0x63ed46d2, 0xd0cfe726, 0x5fdf4cde, 0x4df68fdf, 0x2cea3fa6, +- 0x1d74f786, 0xb6be0831, 0x3a94be10, 0x9936a5d0, 0xa5fee099, 0x35d5125d, +- 0x5d67f815, 0x715cc3ee, 0xdf15fd8c, 0x5da9ef07, 0x3be926f1, 0x3185f57b, +- 0xad0d1718, 0x7d88dd39, 0xc6cf8af7, 0x0a713fa0, 0xf5f907ec, 0x4b27dfe0, +- 0x198e47a8, 0xc55d7f71, 0xf3cd2b65, 0x0c7baeac, 0x15e797ca, 0xa74dea89, +- 0x93182f5a, 0x08627db8, 0x9f5816ca, 0x1895d703, 0xb771f84b, 0xfa71d50d, +- 0x4ab8f0e6, 0xc0fb43f0, 0x1e91a32f, 0xd7b615a6, 0x0fe7c36f, 0x77e50cc9, +- 0xb477717d, 0x3dfe8425, 0xfeb2f301, 0x6ad81d7c, 0x3d1b97ef, 0x5cf0ecfd, +- 0xfef42eb9, 0x9f0557a8, 0x3e29a602, 0x11293fc0, 0x55ff99e5, 0xac6292c2, +- 0x22f8f714, 0xdb2b8e40, 0xb1eace4a, 0xbbd897ad, 0xbd8c78ea, 0xf7b7e41b, +- 0xb4df87c6, 0xf4f9c3ad, 0xe201f641, 0x07e41646, 0x54c8dc61, 0xbcf0f7ef, +- 0x924e7a52, 0xaf3ac42b, 0x1f4741ca, 0xd57a0366, 0xf3ba0135, 0x5207df91, +- 0x5af77e7b, 0x298fca1b, 0xb451fba2, 0x8ebfac13, 0x8f5a8ce2, 0x93d9ffda, +- 0x4f78e5cc, 0x77eb9732, 0x12f1d513, 0xa3ef45c4, 0x145c431c, 0xa0df858d, +- 0x9d7b4978, 0xca1325e2, 0x1077bc15, 0x10f9e7d0, 0x2e4e1f70, 0x3df908fe, +- 0x9f133583, 0xe473e033, 0x3f3aed2f, 0x9153f613, 0xd72819eb, 0x5cadbfc8, +- 0x1ef3b5ae, 0x0cfa2e4f, 0xfb8759e1, 0x8de842b5, 0x6b3ac557, 0x97c23337, +- 0xf095b37b, 0x766d8e74, 0x9e5f0316, 0xfeb03803, 0x4674e5df, 0xc67d62c6, +- 0x9ab48ce5, 0x6ea07a03, 0xb73d0473, 0xdc6a672e, 0x2447e81c, 0xdf3fbe71, +- 0x3c42625a, 0xe5ccdacf, 0x29df794f, 0x94388cdf, 0xb74342a7, 0xd3f70ed1, +- 0xa3474eda, 0xfbb857df, 0xc39438ce, 0x47fce0de, 0xed775f12, 0xe3c67b8a, +- 0x87f85df7, 0xfea54cf9, 0x33ed5ee6, 0x0578dd52, 0x7f6dfe23, 0x28756ff1, +- 0x22dbe7c7, 0xcf37682d, 0xa0f489ed, 0x257aeffe, 0x2893abcc, 0x80c4f0ee, +- 0xe8673b5e, 0xe5fe4498, 0xfe82d96e, 0x8f95fb9d, 0x7479451f, 0x9e8618bf, +- 0xb6d25b1e, 0xbdda02f6, 0x67b1b69a, 0x9f6843f5, 0x1e553ff9, 0x47dc576a, +- 0xffd2917e, 0x89c9a578, 0x9ebcf47a, 0xad2589eb, 0xbbbf902f, 0x21a5cae4, +- 0xb73ef758, 0xa186bfe7, 0xf1ff735e, 0x67d430d2, 0x1a5c3fee, 0x2fddf786, +- 0xf287d645, 0xc8a55657, 0x5ec57f44, 0xabd71d66, 0x0b1f43f2, 0x686ac8fe, +- 0x9bfdc32e, 0xd9a6c785, 0xdcab7f31, 0xa3a7ec2f, 0x6f85fafd, 0x082dc695, +- 0xafc1ae7a, 0x05ebc32f, 0xe7234ac7, 0x4765f107, 0x2fc941b2, 0x075e575e, +- 0x0587eaef, 0x3afc71e5, 0x5b8c3847, 0x7df3d7e7, 0x1792d5b4, 0x5ff00be3, +- 0xdf91cfb4, 0xce28b5d4, 0x04fc9ebb, 0x05c1f8e7, 0x5f67efd8, 0x62b5436f, +- 0xe413903a, 0xebf0cd27, 0x47c0617c, 0x3e616de5, 0xfafdeff2, 0xfe17d4d3, +- 0x1f0bacd3, 0x21496544, 0xde0333f2, 0x5c7a8d18, 0xbf81a79b, 0xf15b8428, +- 0x5dea2ab7, 0x36bf08e9, 0xfcbb337f, 0x690fca0e, 0x7e5937f3, 0x01626ebd, +- 0x4d79e7d6, 0x937f9d74, 0xf145e509, 0xbb7e9143, 0x67ffc842, 0x8a7e9c49, +- 0x75f8355c, 0x7f069744, 0xda0729b1, 0x2efee2f3, 0x1df8a730, 0x9ddb4347, +- 0xd08f30db, 0x48aee570, 0x1c355dac, 0x3bf0ca9f, 0xb14b2e8e, 0x773e1fa9, +- 0xf4d30ee5, 0x68bf00dc, 0x8927b7df, 0x9f80cbeb, 0x3deeda10, 0x9ff9e427, +- 0x27b6ff65, 0xffcfcd5d, 0x20ff6d5f, 0x9499df0e, 0x4cf87140, 0x71e1279e, +- 0x286ed6b8, 0xf79958fa, 0x9ee7415d, 0xf92cf8fa, 0x932f1037, 0xc9377e3e, +- 0xdad2e346, 0x1c51c4a6, 0x9c5a7c7d, 0xfe73dccd, 0xcebb7abe, 0x7e73db9a, +- 0x7b738fc5, 0x184c071c, 0x3ef838e7, 0x8934f731, 0x7e2ad5f6, 0x9129db9f, +- 0x30aeee3f, 0x029c7178, 0xcf1a7f97, 0x18774eab, 0xc052e1bc, 0xc7fc543f, +- 0x12edf7ab, 0x49fc57dd, 0x3bf46fc5, 0x5a771e79, 0x98ffbf01, 0x093275c9, +- 0x70be41eb, 0x92385eba, 0x79cc675f, 0x77fa1520, 0x246250fd, 0x549fc2ff, +- 0x6feb54f8, 0xfbeb6c5e, 0xb7e4fbb5, 0xe454fe08, 0x1f23432c, 0x108afd8a, +- 0xfb43aa78, 0xfbf6871d, 0xae5f950b, 0xf7ec179d, 0x8e7a24b9, 0x6f05f3d1, +- 0xe2a19de9, 0xfe6295f3, 0xa0fd207f, 0x2feff34d, 0x99d37842, 0xf6b9f69f, +- 0x85bb5766, 0xfddbd37f, 0xcf286f88, 0xf89d8403, 0x4e73c967, 0x790cfff2, +- 0xf617eabe, 0xe1dd9df2, 0xc9c1a2e4, 0xdeb97f48, 0xf7f2845f, 0xfac84367, +- 0x7f8115f4, 0x7c557388, 0xa8dd207c, 0x5dc8b8c3, 0x4d03f3cd, 0x29d7b6b1, +- 0xd32c397e, 0x1025ebfe, 0xb6ffa207, 0xda85b2f8, 0xa193f41a, 0x31ccf99d, +- 0x9997ea03, 0x9bf86ad5, 0xcf8b7730, 0xa2f2cd2f, 0x4ac95cdf, 0xd954af29, +- 0xfdc16b16, 0x2d094dcc, 0x3cae5107, 0xb6db64db, 0x06ebf1e0, 0x9e26f18a, +- 0xa58eab6f, 0xe34c93fd, 0x6bd65407, 0x5fb57dfd, 0x13c89b70, 0xfc1fe6f5, +- 0xeb9c3da1, 0xc9324395, 0x97e61d79, 0xd8cc616e, 0x7b82f5c6, 0x4de53845, +- 0xb8435e30, 0x79215c3e, 0xad77004d, 0xdea1f718, 0xaa27f94f, 0xb390c1a7, +- 0x51131b6d, 0x5d43992e, 0xea7daa3f, 0xda9bd22d, 0x9775923a, 0xad5d0ba8, +- 0xb0930d1b, 0x64f10b5f, 0x3697fa12, 0x3fc464db, 0x47daa7c0, 0x1705f8a6, +- 0xf147bd0f, 0xbcddcce7, 0x7ea3d3fe, 0xd78e34d4, 0x0d3ec48f, 0x76721e6d, +- 0xa903c1e6, 0x8dd76bb6, 0x198f5aea, 0xe1e8ae30, 0x8efc687f, 0xf3ab269f, +- 0x9e7a998c, 0x936ccdc7, 0xca9f982c, 0xbe1c7814, 0xeafc822e, 0x1f9f7f31, +- 0xa140fa87, 0x1c29f9d3, 0x7e4fe7af, 0x045b445a, 0x84b7aefe, 0x70febac3, +- 0xa99bf972, 0xd9336fbc, 0x91e5b9f0, 0xdff43df4, 0xbc4489ef, 0xdc5a01fe, +- 0x09d2f997, 0xa47cc87d, 0x1fe5c294, 0x93cfe1ec, 0x2fde1ed1, 0xb07ad2f2, +- 0x7c815187, 0x9b39f68e, 0xc209ae78, 0xee63ca14, 0xa6fdf5e6, 0xea38d714, +- 0x6d9b32ff, 0x41d0ff23, 0x8017e779, 0x345f31af, 0xf58b1608, 0x5822e7e7, +- 0x9a8bd603, 0x92af5c12, 0x6752fd1c, 0xe7823943, 0xd9e4cea9, 0x88fb2369, +- 0xce7ac328, 0x2649b010, 0xf7c0d7da, 0x74140c47, 0x1638814c, 0xcd0049eb, +- 0x0f37ac34, 0x219d7512, 0xf38f4c11, 0xad70683f, 0x48eb19bf, 0x2afb7aed, +- 0xdc7b0212, 0xf59ea894, 0xebc1c925, 0x499d4ae2, 0x56f78fa9, 0x3df09267, +- 0xaf0e1f7c, 0x727d892b, 0xfd893d4a, 0xae4549d0, 0x19ea2335, 0x6949adc6, +- 0x0bedbbec, 0xf9e759eb, 0xdab9c63b, 0xc047cf3a, 0xa13f3ce3, 0x1fae2bae, +- 0xe9f13cf0, 0x0e27adb7, 0xb8376648, 0xa3f1c5fe, 0xf620bb85, 0x5bc52262, +- 0x68cff8ff, 0x976db3b2, 0x75761ec8, 0xe53f3187, 0x9e783b1d, 0xef7f8dbd, +- 0x5b7105d3, 0xbd9d9042, 0x7b5bf843, 0xff884adb, 0x234bf977, 0xb0bd7c71, +- 0x4f8eebe3, 0xd3bf13bb, 0xb4f5f8f2, 0x1e31872f, 0xebf2ed87, 0xb96fd10b, +- 0x22f97481, 0xcdfd4429, 0x93edc114, 0x4b9e8e56, 0xe7a4f9e6, 0x947f3992, +- 0x97f1e49c, 0xa3af397b, 0x705e8458, 0x0f491997, 0x944f4c1e, 0x5279fc94, +- 0xeecb3aa8, 0x951bb26e, 0x3fda248b, 0x9675dd7b, 0xb76176d6, 0xb2e9f934, +- 0x7b37a431, 0xd5075bcb, 0x33f755cd, 0xe13ec452, 0xdd7f3cc1, 0xf5a16c9c, +- 0x1687eb5a, 0xaca64ba1, 0xe1d206ff, 0x5bf7ca68, 0xf3eaed67, 0x27bfcefd, +- 0xdc9c8421, 0xfb3ff9c0, 0x4397e79e, 0x381ba7e9, 0xefc4df7f, 0xf93fff17, +- 0xf79fe79e, 0x6467e33d, 0xfff43d28, 0x6d003eea, 0x2fbb5f9d, 0x0fef5b40, +- 0x83c0bc3b, 0x1b4ad6f7, 0x9ad07dba, 0x972c5fa2, 0x63eb5540, 0x1da1329f, +- 0xd792309d, 0x9a95d6c1, 0xc0a55bbc, 0x5f0500fe, 0x1c7953a7, 0xe0bdc961, +- 0x673c0389, 0x71a5fc38, 0xc91b2798, 0x0aee0e28, 0xa630f5e7, 0xa14ca4b7, +- 0x9496f6fd, 0x9b37a0a9, 0xe95ef97a, 0x6f5f3141, 0xad3d2476, 0x214a70e8, +- 0x943c8eff, 0xea2596bf, 0xbe569652, 0x6de996df, 0xbde95329, 0x87f414b6, +- 0xebf3f662, 0xd8e63ed1, 0xb2d9704a, 0x683c52a6, 0x1ef842cb, 0xeb5ef511, +- 0x9859feb8, 0x5f82b68f, 0x8dc0f588, 0x78a41758, 0x94e342d6, 0xc3eccdf7, +- 0xc0c47de1, 0x7adfac24, 0x99fbe66e, 0x5542f358, 0xc188ef3d, 0xa24739d7, +- 0xea275e7a, 0x5f3aa3eb, 0x825993ee, 0xb9bf0189, 0x67542cbb, 0xffe46d7c, +- 0x5bbfc01e, 0x65bdf5e2, 0x1f643e16, 0xc700cdc6, 0xc4f93db2, 0x8ef733bf, +- 0xc6054bfc, 0x1cfc391d, 0xa5711e90, 0x109c17c8, 0x5f250ef9, 0xdeb5d4a0, +- 0x53927911, 0xb6817f98, 0xd021f303, 0x37747d4a, 0xa1493eda, 0x1223c7ec, +- 0x8e790fcf, 0xbe50fcf2, 0x7837ded1, 0xc0b464df, 0xaf1f1ceb, 0x9ef9285b, +- 0xf93d62ed, 0x617d963f, 0x37e697e0, 0x9da2360e, 0x8f4c6fcf, 0xc38876c0, +- 0xef12c3ab, 0x753bf98c, 0xf142fd0a, 0xee1f7251, 0xd43bac8f, 0x17bd754d, +- 0x99fe7534, 0xff748c7d, 0x99c7e0b8, 0x97f5187d, 0x41afd3f5, 0x946631f7, +- 0x4f550e45, 0x18b884aa, 0xc4d39ce1, 0x5df056e1, 0xe095b3e9, 0xe81f4e7b, +- 0xaf36c46e, 0xf284ab3a, 0x1a1735ed, 0x5f737fd1, 0x76f074b9, 0x6d1997ca, +- 0xeacc4f18, 0x2edde750, 0x96fdf2a5, 0x7bfc482f, 0x3d58cf4c, 0x63f9c7c5, +- 0xd63fc4f5, 0x5f8a70ca, 0x9b2606ad, 0xfb853fb1, 0xf1657945, 0xd367d825, +- 0xcc1fc962, 0x5d8b643b, 0x83c81b90, 0x4f2ec759, 0xab5d3c40, 0xd3e4aabe, +- 0x4639331e, 0x6dbf3d22, 0xc8f6b57d, 0xaa57da71, 0x8bc14bac, 0xaded2752, +- 0x73ecaabe, 0xaa7d9770, 0xd6e197da, 0xfcc18f77, 0xd39efe63, 0xd2cfb146, +- 0xa8159c92, 0xbeefe6bf, 0xa5577540, 0xbfaeeace, 0x3c357e40, 0xe490e747, +- 0x4053f903, 0xc95aee4f, 0x022fafeb, 0xc2b6d83c, 0xd7001dfa, 0x6c7eb0cb, +- 0x78fd60db, 0x039595fd, 0xb4adf5a8, 0xe577bb53, 0x6ddd6a08, 0xeb5ea817, +- 0x7f63d3ea, 0x1ef3d524, 0xfaf39d97, 0x5247f7a8, 0x93ef5b5f, 0xc6be7823, +- 0xdf40c87d, 0x988fb82b, 0xb5177f48, 0xf8c4c9cd, 0xae63f3e0, 0x0ebb844c, +- 0x7c416deb, 0x0f61de71, 0xce3173c7, 0x58e1ed3b, 0x3f6fcb67, 0x2ffdc46b, +- 0x11bf7a75, 0x710061f3, 0x744d6e2a, 0xf7c0baef, 0x8515b6f7, 0x59af7e23, +- 0xfffd6b17, 0x536fb175, 0x202afb17, 0xf247a49f, 0x56c73a9c, 0xc2390f6c, +- 0x89e90417, 0x4f5e4e75, 0x4d939759, 0x99c9b872, 0x683f3b1d, 0x9e3286be, +- 0xcd8eb0bf, 0x3ebe0f09, 0xf340cd35, 0xa09cf15b, 0x156fef10, 0xea06ecfa, +- 0x213ed6ed, 0x47f3b6fc, 0x48ddf44d, 0x9985eefb, 0xea5fc41d, 0xb2badc7c, +- 0xfdf899f9, 0x1844e7bd, 0x75f3c7eb, 0xd31c7caa, 0xcb7ae3d4, 0xd32ccdcb, +- 0xce29c239, 0xbb40ceea, 0x319bcdad, 0xb706777d, 0x7e548eeb, 0x9527835e, +- 0xea3d608d, 0xde657f72, 0xfc6072b7, 0xd91d328c, 0x973ea50b, 0x2b67a657, +- 0x56f33f81, 0x9754bc18, 0xa69fd32b, 0x6c6e22fb, 0x22a5e4b0, 0x623a9f9f, +- 0x57da84b4, 0xaa7b2f6d, 0xb79e1b29, 0x5c7648d7, 0x77eab5d6, 0xa3edad95, +- 0x16fd6953, 0xf124e519, 0x53efa320, 0xf8f3d67b, 0xd63cef7e, 0xe30a54dc, +- 0x82ce8e58, 0x679b51f6, 0xbf433e43, 0xef879b44, 0x4bbbf612, 0x48c1cfd8, +- 0x8f9c04db, 0x73ca4bfb, 0x4d29fe5a, 0xaf36be95, 0xfdca905f, 0xbcb286aa, +- 0xdf483975, 0xf6863a09, 0xd8aca1a4, 0x9f341394, 0xe34f552e, 0x60fac11e, +- 0x907d707c, 0x75b501d7, 0xe5cf4541, 0x06317fb7, 0xf409bdf1, 0x7731da35, +- 0xe41faf32, 0x087452bf, 0x4e0046f5, 0xc94dbebe, 0x8eb7bf57, 0x0c5d7c65, +- 0xf679cbf7, 0xcb9f9448, 0xdee9f09b, 0x139fc448, 0xb5ea1eec, 0xcc6b3923, +- 0xe8268fa8, 0x1dfbf10b, 0x5aba53b7, 0xd27ac267, 0x8f57af9d, 0xf209efc3, +- 0x863d0fa7, 0x615e9f78, 0x7780fda0, 0x063e5ebe, 0x2ff62baf, 0xd5d6fa7f, +- 0x807f7811, 0xe1b70f64, 0xbc62b2fd, 0x0f877e3f, 0x226ce933, 0xdcfa0742, +- 0x8f53a47f, 0xc998f372, 0xf00a9d95, 0x75114fe6, 0xa76e0aa6, 0x314db7a7, +- 0xaa4fee30, 0xf4bee6ec, 0x741f29cf, 0xea9f2da9, 0xefb87147, 0xaf603721, +- 0x1d80f7f2, 0xb1d80a8b, 0x4abf6aef, 0xcf842d53, 0x218ec05b, 0xbc29d63c, +- 0xbfa5af3e, 0x37bfd04e, 0x1e9bd4bb, 0xe783fb46, 0x4a7ca0a8, 0xb8ed3dc9, +- 0xc33ef30d, 0xf0975fd1, 0xf95e9590, 0x6fd0a96f, 0x73f8bdb1, 0x7af80af7, +- 0xfad537dd, 0x2d33a9cf, 0x521ffd4d, 0x97f11267, 0xe2526f52, 0x9e04d7b5, +- 0xa175f695, 0x77f3be37, 0x435c680c, 0x0d60c77e, 0xacc31dfd, 0x44873a16, +- 0x80e18ef9, 0x8ced1591, 0xe2b3fdc7, 0x93af26bb, 0x8f03a4fc, 0x37f1b5fd, +- 0x935df8f1, 0x80672784, 0x76463c3d, 0xae8f395e, 0x9e63edae, 0xfbe16d6f, +- 0x435b6bc0, 0x9912eb9f, 0x297bedc6, 0x33ea87ac, 0x98ed7f62, 0xe44ea25d, +- 0x596d7a30, 0x4fbcb798, 0x74b79c1f, 0xca09fcdb, 0xc52f5dbe, 0x663cea7b, +- 0x3acb796f, 0x6afc3be5, 0xd1df8ec9, 0xd31e775c, 0x7ee1f7c1, 0x4be63cdb, +- 0xce3aeaa9, 0xad0b1481, 0xd125dcbf, 0x9d264cb9, 0xe7f686b3, 0x425922bf, +- 0x9a3eebed, 0xbc75e5ca, 0x6d3c83a8, 0xf4f1fce4, 0x8bed12ad, 0x90edefc7, +- 0xc2bf4fee, 0x3a79b7bf, 0xa36f7f8f, 0xef943dd4, 0xd40e6e68, 0x3b3be83d, +- 0xe51bfbe5, 0xfbe51a7b, 0x239b29cd, 0x07e23ce8, 0xdcc92d0d, 0x5f10f5ef, +- 0xf61e2bfe, 0x30d0f580, 0x5e4a1f56, 0xfd16a777, 0xbb8d2a6b, 0x476f71e1, +- 0x29ff086a, 0x7848e309, 0x5ed499cf, 0xa9b385e3, 0xfa8178ea, 0x46e178da, +- 0x4bee3dd5, 0xdd7a3765, 0x8df94203, 0x2dfe7037, 0x9bfcf3df, 0x4d6dd143, +- 0x15f3e878, 0x1d44d32b, 0x380e735d, 0x245df1eb, 0x924debb7, 0x51b72fed, +- 0xf540dd3d, 0x36af4574, 0x73f9f145, 0x7b4a7cc5, 0xb3d71a47, 0xf9d0864d, +- 0xdc62a9b2, 0x2831d946, 0xcf41da0d, 0x8397f3a8, 0xcbf9d45b, 0xe7d55a5b, +- 0xa9f50c85, 0x3fc903cf, 0xa61f3ea4, 0x1f3eafd0, 0xf509f866, 0x3b2330f9, +- 0xdcc3e7d4, 0x7cfaa1f6, 0xab741f98, 0x5fb797f3, 0x5ef9aa9e, 0x77cfcbd3, +- 0x7e0dce02, 0x4f34c4ae, 0x4e8d2e73, 0x844d2e73, 0xcd1a5ce6, 0xde622839, +- 0xcd1f4f2c, 0xf5ea34f9, 0x971eb159, 0xb8f5fd7b, 0x44d8fa67, 0x386fae3d, +- 0x5948f73e, 0x6dfa384e, 0xffd377ca, 0x97ccf821, 0xf48b9ae6, 0x5b1ead71, +- 0xb1d57c87, 0xf3032c2a, 0x29d5ae2e, 0x83f03c72, 0xbe8921eb, 0x9d5e2f9b, +- 0xe67bfb42, 0x3f250c35, 0xc8398f29, 0x638caa4f, 0x5873cf21, 0xd6f5c69f, +- 0x33037adc, 0x6ccbe0c6, 0xd0a81d46, 0x5b124d73, 0x798dedcf, 0x3561f022, +- 0xbb587ce3, 0xd53458ee, 0x59dd85bd, 0xaac151c4, 0xb9d217eb, 0x5d73da0d, +- 0x318b586a, 0xbc59e605, 0x41e49da1, 0x628bce7b, 0x9e62dc87, 0x7df516da, +- 0x8170db37, 0x1d6789ce, 0xee33b446, 0x86fdf556, 0xb32f5134, 0x8dca3b33, +- 0x1328beeb, 0x02c597fa, 0x4836732f, 0xce0fac16, 0xb84f686b, 0x0ef3fa0b, +- 0x296f14c9, 0xce3d6178, 0x73a5c9e1, 0xea1e2fd2, 0x45f3fe47, 0xc7092d9b, +- 0xbc79a2b9, 0xc35de920, 0x9c657af1, 0x5f9e386b, 0x0a327dd6, 0xa761f1bf, +- 0x5fc8eb2f, 0x08681f00, 0x36166df9, 0x3bcf3824, 0xc44960c7, 0xdd878b3c, +- 0xa6714c93, 0x75957b88, 0xc7104dbb, 0xe21f6346, 0xe93ebe54, 0x46e8892b, +- 0xfc1bad26, 0xf80f7c22, 0x9ac7143f, 0xfa156998, 0xcd6d673f, 0x3afae889, +- 0x5f90301f, 0x2c477731, 0x1b7315f9, 0xfe788c4a, 0xb15ddcc1, 0x79967fb4, +- 0xae31c71c, 0xba78e855, 0x3260ff21, 0x25b73bcc, 0xe9ab2ecb, 0x17138aa7, +- 0xe8569d37, 0xba0d79d6, 0x1ba28675, 0xfd754bd0, 0x17e134e5, 0xfbb17a08, +- 0xbdfbe8e3, 0xfa07a58a, 0x62efbe61, 0x0efd387d, 0xc038cf45, 0x5a64f5c3, +- 0x29de2abc, 0x8e3573eb, 0x2fba73a3, 0xba24286d, 0xf655e969, 0xe386f3df, +- 0xafec55f7, 0x8dfd0c51, 0xf66cbeca, 0x5b3eb854, 0xb955f2e2, 0xfa196c66, +- 0x7d0a6f39, 0x8b88baf8, 0x045c618e, 0x189bfc7e, 0x2dff4117, 0x05fd1711, +- 0x4f6822e3, 0x6d045c62, 0x4fff38a7, 0x00603391, 0x4293d7e2, 0xd55e4ebe, +- 0x3193cbf3, 0xdff6569f, 0x80ea166f, 0xb53c12e7, 0x33a74693, 0xf6a1d936, +- 0xa9a7cba7, 0x830ee9fd, 0xed324c65, 0x81f5e26b, 0x54dbceb9, 0x66de99e3, +- 0x1b073cc4, 0x4eb81f90, 0xc466c7f6, 0x098cc73c, 0x3ff1aa71, 0xf5554a6c, +- 0x0c5fa02f, 0xeb294df0, 0x777ebaab, 0x7f5520c5, 0x424065ce, 0x95af723e, +- 0xe22ce79f, 0x2794ca24, 0x9f0dea06, 0xfa4f0fd6, 0xe9fbc011, 0xd7dd0311, +- 0xeba143d2, 0xca3acdfc, 0x0cdbcedf, 0x3b79836b, 0x5c91e79b, 0x8a227c7d, +- 0xdc6987ce, 0x08daff91, 0x61de9fe8, 0xa764fda0, 0xc21ee21b, 0xef4faaf3, +- 0xefc68848, 0x328d5cf2, 0xb59e91f3, 0xe6559e90, 0x4558692d, 0xc7307fbf, +- 0xf947661b, 0xf3dfb39f, 0xfdc7d2b8, 0x0645b401, 0xecb8e3e5, 0x3f4449f5, +- 0x7b77e107, 0x3fc5e538, 0x058f3034, 0x1d79cbfc, 0x250fae1c, 0xb3fd80d6, +- 0xfff4efe1, 0x6e71c011, 0x0e957362, 0x48f928fd, 0xe7cbe902, 0x5b7c8665, +- 0xe740d4b1, 0x4b7a2f09, 0x267d8ade, 0x7a72a5e5, 0x1d3bf4cb, 0xcd187b6c, +- 0x4381bacf, 0xdff2dc60, 0x5eb93d84, 0xffa8b9e4, 0xf5dec1fb, 0x8f913f82, +- 0x8e658c3e, 0xe7960258, 0x963a3e1b, 0x009e7540, 0x7043bd3e, 0x3bd4bfdd, +- 0xbd83a5fb, 0x3bcaa8fa, 0xfddaf484, 0x5a572409, 0xb91a77bc, 0x1ca0f2de, +- 0x197d0148, 0x9dfe3390, 0x3d833cd5, 0xaafa4ed1, 0x55f50520, 0xe50306e7, +- 0x11de9915, 0xcf70ebcd, 0xef2b1f13, 0xc6dbd4e9, 0x4d9d7c20, 0xe11df459, +- 0xd9320ddc, 0x3e3fe43b, 0xebe3cbde, 0xe30bb28d, 0xe4934f75, 0xcb5d78c2, +- 0x0e96cb37, 0x9815dfa7, 0xd9193885, 0x4f9c0f53, 0xa50775e1, 0x3f0f78bf, +- 0x74159fd7, 0x0e0da7e8, 0x7f03475e, 0x5f9f325f, 0x26bc7739, 0xf0a74ffb, +- 0x878ba668, 0xf7e0c6fa, 0xcb8f6738, 0xb36767c4, 0x0325879b, 0xedd13f3d, +- 0xe823f61d, 0x73d13c7f, 0x70fd8f46, 0xebc454d7, 0x0c86dd12, 0xabba1efc, +- 0x6e87bded, 0x7a3ee783, 0x312760d6, 0xfa40915f, 0x45f6f163, 0x7df75f99, +- 0x3ef05810, 0x48e8cf3c, 0x4b9f0091, 0x30632d6c, 0x3980b07f, 0xf8e21d85, +- 0x79e0edb1, 0x9e26cb0c, 0x30af78d7, 0x67ee3d6a, 0x5bc9a79b, 0x13be27bc, +- 0xa92e905c, 0xa2ed84fc, 0xf9c74f3f, 0xf3c73d9b, 0xd2a7f059, 0xfbf16eff, +- 0x57de8a1e, 0x6b0d75f4, 0x7fa9f3a6, 0xf04d9e94, 0x34bc922c, 0x9a4f0eae, +- 0x65551506, 0xcd6af1e1, 0x8a5e6133, 0xe9606d47, 0xdd80fc82, 0x6e7a36e9, +- 0x47d9f1b1, 0x32176d91, 0x669f5f3f, 0x6f0647dc, 0xa7ab3f95, 0x6cb2a9bd, +- 0xfcd2b06d, 0x57ee3b06, 0xb4e4285c, 0xfaf259b6, 0x6ec83af8, 0x2cf3102e, +- 0x6b537610, 0x23d87a9f, 0xa05a1d8d, 0x59acb3b1, 0x5e01576d, 0x815b973a, +- 0x33a70b57, 0xb0f08a32, 0xcf9f99b8, 0x1ef2e551, 0x4b70449c, 0x0f64a076, +- 0x67321678, 0xe3ae2c69, 0x6b8f1e19, 0xabaed3e1, 0x9d62bc07, 0xecabb85a, +- 0x01727c17, 0xda0a3dff, 0x8759a9df, 0xbfad0f42, 0xcaa5d0a6, 0xd55bf1c3, +- 0xdf3d1126, 0x3207eabf, 0xf0aa07da, 0xff816b0b, 0x4e779ea9, 0x70b67d42, +- 0xacdfe813, 0xfc28ff00, 0x44b598b4, 0x31d4bf23, 0xd496235f, 0x7e5afacf, +- 0xcf0b3238, 0xe7463a65, 0x7d585547, 0x80b174fd, 0x1fdfcf42, 0x8041fb2a, +- 0xbe78b5af, 0x17af5d16, 0x11d44c6f, 0xd3c039e8, 0xfa64a782, 0x9c6827ae, +- 0x243d7f88, 0x8f1ed54f, 0xd5cbeb11, 0xdc3e7e7a, 0xeb74e0b5, 0x5d29eff9, +- 0xfc5ede13, 0xf70aefa4, 0xf9bde907, 0x4262fd59, 0x9d6529e9, 0x72bd08ef, +- 0xb7aefb4d, 0xbec8c5df, 0x8f984827, 0x575f4de9, 0x00bebb09, 0x67b43ced, +- 0xe740bf36, 0xe9bfbe2e, 0xd55f3a05, 0xda02ecf8, 0xf3667097, 0xf7f087bc, +- 0x98ecce23, 0xe17d7647, 0x775d8a63, 0x85fd8319, 0x9e73cd92, 0xafc85ff8, +- 0xdd5384cf, 0x4bbf6ab8, 0x47a039c4, 0x336d9c61, 0x136c9bd7, 0xd10ba3d7, +- 0xfd92e5fe, 0xddc709bb, 0x09bae557, 0x3ae83ef9, 0xe6fbc5d9, 0x07b77eb9, +- 0xb7efbde6, 0x2d0f7691, 0x79e3e2d9, 0xed0f8b67, 0x7f3ded5f, 0x0bbf4539, +- 0xeb791f25, 0x87bd8ac7, 0x577aedee, 0x97ca0642, 0xf2b5f3b0, 0xfa0b0cd6, +- 0xfc2ec205, 0x173df1b3, 0x14fe4df1, 0x4dbbf7c7, 0x6defcf1c, 0xdc6f78e0, +- 0xd3e297d1, 0x92fa9b77, 0x8eeef51f, 0xf9ef847e, 0xe4df01eb, 0x7ed4db47, +- 0x1be01354, 0x37c404e3, 0xbf7735c0, 0xcedbe04d, 0xf1c4ddf1, 0x76f036cc, +- 0x7abc0f7e, 0xfbf4fce8, 0x8ecc3dfe, 0xe187c17e, 0x3e97f23e, 0x99d329dc, +- 0xa59f8a67, 0xb19f39f8, 0x1fd1c7e6, 0xa8bdf053, 0xea087fbf, 0x7f8d8a97, +- 0x2fbc468a, 0x2393c9da, 0x1ccdf03d, 0x076fe849, 0x2fd57fde, 0x0848cb2a, +- 0x21be8bf2, 0x9398ea5d, 0xe1d723f6, 0x82436479, 0xbf2b3df6, 0xe7dda65b, +- 0xc8f9e36c, 0x99376630, 0xed349e10, 0x18b9afef, 0xbcfe7bee, 0xf75985df, +- 0xab771c90, 0x12634f7e, 0x9cf019f3, 0xd122d602, 0xe5da967e, 0x188ba34b, +- 0x4f5a3f9e, 0xe0cdac70, 0xbc2bbd76, 0xb2fc833b, 0xef1c613d, 0xf3aaf19d, +- 0x6fdd2789, 0xb457f98f, 0xf9f847fb, 0x763c93c4, 0x1a4e67ca, 0x2ab93431, +- 0x2e0bae88, 0xab8973f3, 0xf2e6032e, 0xc6fdf7f1, 0x0587bed2, 0xcea853cd, +- 0x496d055f, 0xbe5ef8f0, 0xc19b5bbf, 0xb8539be3, 0x973c3ca6, 0x9d7efc49, +- 0xea8d1738, 0x539b80b4, 0x373a4ee1, 0xc98254ef, 0x8bbacfce, 0xeffdf3a1, +- 0xa6707a16, 0x13ed20f9, 0xcc3c7987, 0xbfd6e78a, 0xab014069, 0x8b3c7530, +- 0xe4ecf021, 0xe935eef7, 0x837f6b70, 0x7773e445, 0x13d7157d, 0xd51d009e, +- 0x23b9b9e7, 0x9a3fe742, 0x87255e05, 0x610cea83, 0xbc047730, 0x3619e7ff, +- 0x6fec5d7e, 0x9e805b67, 0x85cf3d51, 0x0f33ae53, 0xa6b60f3f, 0x2b7dfe18, +- 0x7a848ce3, 0xfaa9d643, 0x7f7e4635, 0xc9c4c67b, 0xf631469b, 0xf7ac0306, +- 0xf194bf45, 0x8c4e7f38, 0x4d75f717, 0xaca373c6, 0xaf89ead8, 0x4799eaa6, +- 0x3326dbc7, 0x79c43bd6, 0xfe049351, 0xbe608fa6, 0xdf7de018, 0x89b9f561, +- 0xbe74f977, 0x93af009b, 0x21ba5cf1, 0xcd9cfe78, 0x38f78160, 0x8c3ca4cb, +- 0x7f566a4f, 0x64f77833, 0x94de4f94, 0x8e9d7d06, 0x9e63f9c3, 0xf989988f, +- 0x2cc3c079, 0xe72fdb3d, 0x5e237a71, 0xed1b56dc, 0x2a5ee8f3, 0x25147ed1, +- 0x7bd0af2f, 0x4f2f2068, 0xe0299c74, 0xa29a7983, 0x686379f1, 0x50ce1d7a, +- 0x8a16e8e2, 0xf90897af, 0xe5c8a25c, 0x9e5cb50e, 0x7e823a45, 0xc8893dc6, +- 0x0b453357, 0x6bf9a4eb, 0x73947bc4, 0xf064cfd3, 0x0c99e97c, 0xfe387f5e, +- 0xccc7df2d, 0x45469cfc, 0xf8c36b3e, 0x27fbcafc, 0xc333b68b, 0xf02bf34a, +- 0x1ff1f368, 0x7e43596c, 0xccb7f552, 0x1be907c7, 0xc6497baa, 0x7a88f9ee, +- 0x49c25fe9, 0x5b1a66ee, 0x7b9bd5fa, 0x1dce538e, 0x037e60ac, 0x55300faf, +- 0x6cb4741d, 0x2b2c73a6, 0x9afbfe24, 0x1e51455d, 0x6be60c5d, 0x8ada440c, +- 0xe973f31f, 0xfbe709de, 0xee632b3b, 0x607e849b, 0x4f51b445, 0x7f31ece7, +- 0x40565654, 0xc91636ef, 0x04214e74, 0x6eb19382, 0x7feb06b6, 0x23b0ffbc, +- 0xa24bb28d, 0x51d7b3ff, 0x02bb4d1f, 0x43fea7f4, 0x0f101d93, 0xf7101d75, +- 0x7cf4c3d9, 0x8f8203d7, 0xfde73f3d, 0x37f7285f, 0xe53afef3, 0xffde16fe, +- 0xe8bf3299, 0x5fdcd46f, 0x4bffb9a5, 0x627c4fde, 0xfa0f64cb, 0xa59cc5af, +- 0xe8956e2b, 0x05ca3577, 0xf6ac559f, 0x742b7e11, 0xcc5b797b, 0x6b82ba7c, +- 0x74ce2b8f, 0x211fa396, 0xa1467547, 0xe5909e9d, 0x75bb4728, 0x2b2bba6b, +- 0x53c5da13, 0xd6118f24, 0xc97b8ecd, 0x45ea4c6e, 0xbe0b971f, 0xf9f1b22d, +- 0x3cc37c14, 0xbf0b3303, 0x847e3cfd, 0x4f35412b, 0xf3c0f5fe, 0x798f5b6b, +- 0x3ccf5d46, 0xbaf52cba, 0x89e83f14, 0x385dc76c, 0x2e1ed69f, 0x063da9f9, +- 0x35ec50f3, 0xeae1fdf1, 0x987c8c96, 0xbb73c97f, 0xefd0aa33, 0x1d40fe12, +- 0x3c7cc3da, 0xc3db82e7, 0xf24fdb8f, 0xdabb707d, 0xbf30638d, 0x3db06d0f, +- 0xce05e9ac, 0xd89d4c8a, 0xd791b047, 0xab3b9ec5, 0xd12e7a47, 0x0c799cb5, +- 0x52adfbed, 0x1127dfe8, 0xe5ea9dcf, 0x66e68e77, 0x90d43d72, 0xeb8398e3, +- 0x3464c92c, 0xe84d64be, 0x9b7f9a73, 0x8572edc9, 0x86f37bb0, 0x806c9945, +- 0xaee3c2e7, 0xaabfb835, 0x1e564b6a, 0xa56785e6, 0xfcc92f17, 0x376abcda, +- 0xf1b6abcf, 0xd5856abc, 0x37941cbf, 0xedb33a7b, 0x633a5361, 0x914dffe3, +- 0x78591033, 0xe94c2cb6, 0x74b939bf, 0x617bcf14, 0x4713dd7f, 0x39b9461e, +- 0xfe60f084, 0x08e0f87c, 0x591d0bd4, 0xe80b3a91, 0x7369598b, 0xacfe469e, +- 0xda03fe1c, 0x1614532f, 0xcf0e7fd5, 0xcc5f13cf, 0x42ae734a, 0xe63c7138, +- 0x5f465c43, 0x0eb05dc2, 0xed32abd7, 0x890d7553, 0x4efc8574, 0xe9e1e059, +- 0xebe10b4c, 0xfd199010, 0xe50e0514, 0x2fe7e0fd, 0x9d7cc3f7, 0xe28653ab, +- 0xb4be4e77, 0x85996da2, 0xd2fbf781, 0xbf048f5c, 0xfac753bf, 0x4df1a863, +- 0xc05878e1, 0x06e90db1, 0xcc9473ad, 0xdef1411c, 0x5548d2d4, 0x3884da7f, +- 0xd7ce08e6, 0xf5554b4e, 0xaafa2bcb, 0x7f3ddfc6, 0xc4feea90, 0x7d417f30, +- 0xbbdbbf90, 0xe7e1e49f, 0x4545458f, 0xbfbcbee0, 0x36f67db7, 0xd7745efe, +- 0x7d1db253, 0xb67b45da, 0x03478dbd, 0xb39fc45f, 0x8da43ca0, 0x1d1f66f2, +- 0xd73f1992, 0xae0fa1c2, 0xfe639d0f, 0x1077f147, 0x2907ab7a, 0xcb12eef1, +- 0x801dfa7e, 0x3a0f5d1b, 0x41ea2998, 0xed0f2c79, 0xb7fac5e1, 0x67576f28, +- 0xb73bebe6, 0x8b4f9f9b, 0x057f53e7, 0x3e077efc, 0x65e1fe88, 0x4bb5e50f, +- 0xfd534f5a, 0xeb932aac, 0xa5b4bae9, 0xdd8bf47a, 0x181da2d0, 0x062afa03, +- 0xcedfc5f8, 0x7dc2ef06, 0xdc51596c, 0x953cbf5f, 0x2be438b1, 0x9439e79e, +- 0x53bf4b18, 0x8ca9a4bc, 0x8e5dd7ae, 0x975ff9a0, 0xcd4fb4fd, 0x754492f3, +- 0x95a98988, 0xc6bf71ab, 0xee4f08a1, 0xc4ef7832, 0x8651dddf, 0xc5dbab78, +- 0x944c91f7, 0x0a5828df, 0x19734d6d, 0x66513f3d, 0x17f02487, 0xfb7097c6, +- 0xbe6d113b, 0x46e0f715, 0x2bbb47ad, 0x7ffd7d1b, 0x18c67a85, 0xe6267a45, +- 0x7ef4ddf2, 0x3d1365f7, 0x88f425df, 0x35c383a1, 0xae93b2fa, 0x59f0fc2b, +- 0x77eab666, 0x4f090c7f, 0x91f7f1e9, 0xc68c1d0d, 0x903cbb8f, 0xafbd655a, +- 0xfa77f80e, 0xc2435b5d, 0xfa5fb4a7, 0x42c978d5, 0x0f46886e, 0x1e1faa5f, +- 0xa9e842c3, 0xf111efab, 0x5fea1848, 0x72ccbf68, 0x3012da44, 0x63d0e99e, +- 0x4d99885d, 0xffe44fb4, 0x0538cd00, 0x00800076, 0x00000000, 0x00088b1f, +- 0x00000000, 0x7dc5ff00, 0xd554780b, 0x399ef0b5, 0x66491e67, 0x99212726, +- 0x4ce21024, 0xe010245e, 0x0f080424, 0x860240cb, 0x084013a7, 0xbc80e834, +- 0x2b101025, 0x0337e95e, 0x60d22049, 0x45405283, 0x68b0503b, 0xaaf8ff6d, +- 0x0131f5a9, 0xe94a0fe4, 0x7ab7bd60, 0x52036b6f, 0xe08d4504, 0xb16dcfed, +- 0xbdad6bfe, 0x3267324f, 0xfdeded41, 0xbe3ef9ff, 0x3ef6759d, 0x7af6b1fb, +- 0xb30fb5ef, 0xcb5d8aca, 0x0afb188b, 0x9318137f, 0xbb302e8e, 0xda663286, +- 0xb1ecc67d, 0xb2816631, 0x96bea23c, 0x046b4f31, 0x2e4995ac, 0x19236323, +- 0x3950b6fc, 0xfbc1db0b, 0x631f77cc, 0x576ec64e, 0x4a6dff18, 0xb1832c65, +- 0xed04dfbf, 0x0fde7b53, 0x852ea01b, 0x968bc0b1, 0xbbf861e0, 0xc72fb65f, +- 0x89e1f505, 0xec39faac, 0x55670e47, 0xcddfa1d9, 0xda15b29d, 0x39559b31, +- 0x9ff806ec, 0x6f82ff34, 0x8ba77f39, 0x12b7ffcf, 0xfdfd84db, 0xb084c276, +- 0x7ed5e607, 0x921188ff, 0x31dfa7ab, 0x63b5332e, 0x5675d74a, 0xd7bad8ca, +- 0x603b5c12, 0xc1fb337d, 0x5ebb8033, 0xba0f04b5, 0xa43339e9, 0x68396960, +- 0x8e75fa80, 0x8c2f7cae, 0x5c7afe5f, 0x7e830d88, 0x19938f5f, 0xae52f38c, +- 0xa5e20c6f, 0x1541f5fc, 0xf24c0706, 0xa0cc8b15, 0x3c9ba4dd, 0x5f79f163, +- 0xaf5e8df3, 0xf9c60256, 0x18a7cefc, 0xadbbbdf1, 0x5529b5fc, 0x22624086, +- 0xc954d774, 0x16c608d8, 0x9b0d9b5f, 0x6b92d8c2, 0x5afb04f1, 0x75abf3f8, +- 0xdf705369, 0x49866eae, 0x6c963ac3, 0x017d0c36, 0x765cc5d6, 0x30f00f35, +- 0xada2c073, 0x5339e60c, 0x677ad232, 0xd60a490e, 0x71dbd343, 0x73e0c7bf, +- 0x664861d6, 0x3db97a6c, 0xd6f18460, 0xdfa8535c, 0x1a2e6bda, 0x64b5ed6f, +- 0xb35dd782, 0xdae4b952, 0xb96e7a60, 0x801e6466, 0x1c035e97, 0xdb273c00, +- 0x3fd70ab7, 0x4a96feb3, 0x35b7cf1c, 0x8b67d4a3, 0x82b317a4, 0x92f40574, +- 0xb3d6dcbe, 0x05f6fafe, 0x2fe85530, 0xb2f44bc5, 0x88f2ca14, 0x0e8265fa, +- 0x56b6f1a2, 0xa537ffec, 0x5f411a97, 0x3ca16c4b, 0x54c1e023, 0x856ea717, +- 0x71495cf9, 0x6cbc414d, 0x6fe38078, 0x6e5bc983, 0x786ef987, 0xcec2a0c4, +- 0xd9473bb0, 0x32f00cad, 0xb33addea, 0x176e822f, 0x5cc61b5c, 0xd739feb0, +- 0x7dbca972, 0xae336fa0, 0x79b5f17f, 0xa8c34f02, 0x2364d664, 0x46d8c51b, +- 0x4e1757dc, 0xb3ef9928, 0x7517df98, 0x85eed3a3, 0x6538bff1, 0xb88bfaa2, +- 0x5530252f, 0x9c09e04f, 0x51682997, 0x2ebcc00f, 0x8140589a, 0x9f73b8ad, +- 0xdf000591, 0x41f4a14b, 0xb07b5d09, 0x291de59d, 0x92ed8ed8, 0x04a92798, +- 0x2deb09f1, 0x057c63e0, 0xc2192eff, 0xfd42f7f9, 0x965b3327, 0x81e0731b, +- 0x86552a74, 0x9cf27e75, 0xbe7824c4, 0x4e1bfd6a, 0x95ab1e58, 0x5029640e, +- 0xcc10d1bf, 0x3d8c4937, 0xe2f6fb22, 0xd85a3eba, 0xd0656ffa, 0xf3cb7cee, +- 0x0d57dc0e, 0x2872adaf, 0x0569fb0f, 0xee60067c, 0x6552cdad, 0x26c346d0, +- 0xa1ed0d54, 0xa39e8d6f, 0xb5f57ce9, 0xaba7a26c, 0x2fa19675, 0xdd031d20, +- 0x415af3e2, 0xfd2177ef, 0xacea6943, 0xe9c8f414, 0x5aeba35f, 0x5aadcb99, +- 0x0030625b, 0xbff99bf3, 0xf500fe80, 0xf2a85f6b, 0x2bba444e, 0x5079a830, +- 0x32fc11ac, 0xe0f83a53, 0xcf83e458, 0x787ad452, 0x579af93e, 0xc1f3d73c, +- 0xc674fe4b, 0xbc4b19f2, 0xd5c690b6, 0xe822dfe8, 0xdff484dd, 0x2d83de8f, +- 0xd9fffe05, 0x77ff9edf, 0xdb90f3f8, 0x6be216f7, 0x7fca1c9a, 0x3b4b052c, +- 0x94e4d1d1, 0xe7e9192a, 0xb3cfcb9b, 0xd59e7e42, 0x7db5cfc9, 0xb7f0cfc8, +- 0x04d787e4, 0xd85a543f, 0x2e22de1d, 0x7bdb67df, 0x3d97ebfa, 0xea0b9ce9, +- 0x7819743f, 0xf343ff7f, 0xca5bf0fe, 0x86fd7ffd, 0x42afff72, 0x79cb47ee, +- 0x9ca1fd06, 0xc2d5ecff, 0xf781ea20, 0xd405e819, 0xb824af7b, 0x403d0b0e, +- 0x313e227a, 0xd03d2378, 0x5fe77b90, 0x7f03d0fb, 0xa3fdbc43, 0x3fa3407a, +- 0xfe345f8d, 0x9a21f8d0, 0x987e347f, 0xf13503fe, 0x401fdc5e, 0x1fe461cc, +- 0xae0cf039, 0x5095d6a3, 0xf1a97c8c, 0x0c17dad1, 0xf4bd67c4, 0x1e9be083, +- 0x0bebd13e, 0x3e341f8d, 0x56a6f8d1, 0x28b2c3f0, 0xb526387e, 0xde163c3e, +- 0x15f6eedb, 0xf87b53b9, 0xd173cd63, 0x7a4fa17a, 0xcb4f4862, 0xd218ea52, +- 0x91942d53, 0x83e964f4, 0xdfdd8a9e, 0x126e9e8e, 0x9e8ebfed, 0x6a66dc2a, +- 0x4f483ff7, 0x3191ee15, 0xfbb269e9, 0x5c57689f, 0xa97dfbad, 0xb573e60b, +- 0xbbace414, 0xbfa6de87, 0x90ddb8c5, 0x7e915763, 0x3af9e23a, 0x8303cc3b, +- 0x2beed8f5, 0xd4788756, 0x67db52e8, 0x86580ecd, 0xb6e50074, 0x9c2aef6c, +- 0xa07c476f, 0x9337fd68, 0x96cfb477, 0x53d9b094, 0xd61dfb84, 0xecbeffe9, +- 0x72dfb5c5, 0xdfdc6b9f, 0xddf86e4c, 0xd17b74ff, 0x272d8eef, 0x7d9dff02, +- 0x7f0e599d, 0x94f047f6, 0xf61e33d7, 0x660287e7, 0xcbf22f61, 0xfead32bc, +- 0x191e2d37, 0x3dfc03e5, 0x30f04696, 0xc381e12b, 0x0ae1d381, 0x87f4e798, +- 0x5803ebbb, 0xa27c793f, 0x0c798fe8, 0x8ffda7ac, 0x6e15bc0f, 0xc2defd26, +- 0x94ebeff1, 0xe02343bd, 0x11ed8052, 0xbc145970, 0xc877b79f, 0x7ea14c9d, +- 0xa0af9c82, 0xc209437f, 0x7e827f5a, 0x55f8e799, 0xc52cf3c0, 0x3ec076c0, +- 0xf0394bad, 0x6b9455c6, 0x7066066d, 0xfd81e045, 0x04c9ebde, 0x20c578ba, +- 0x7b08ffe0, 0xf85b1972, 0xb84f8702, 0xc812d4ff, 0xbe02fd15, 0x9b7408d7, +- 0x091e0d5a, 0x66535bfa, 0x7bbb6608, 0x5b84fbe3, 0x7cdaabd3, 0xdfea5540, +- 0x6f94e667, 0x6d1a3ef7, 0xbd367ef4, 0x8b7cb21f, 0x678fe7f1, 0x7b0c609e, +- 0x1f820ff8, 0x63134a2a, 0x4b779fd6, 0x01d7ff1c, 0x4787c6d6, 0xc1fd6073, +- 0x5975fc18, 0x1a3617f4, 0xd6ff3e05, 0x36167482, 0x6bfef86b, 0x327be20b, +- 0x8274dd63, 0x13e30374, 0x7fdc7ffc, 0x7cc936f5, 0x7c289eb9, 0x6fbd68dd, +- 0x2057c0c6, 0x372cbf6a, 0x6ee9f7c0, 0xbef3d0b9, 0xe87eff4b, 0x4ef5fb46, +- 0xdd05f1af, 0xd8e8d4ae, 0x44f7a3a3, 0x99f44bd9, 0x02506298, 0xbd6b8f40, +- 0x2fe8cd71, 0xa9a7f0f4, 0x8e14f10a, 0x87a9e3d3, 0x1555ccff, 0x448fb236, +- 0xe42eeb7b, 0xbbb1af5f, 0x6ec7e73d, 0x029e66ba, 0xd29a2bc0, 0x41d27ef8, +- 0x8d80aecb, 0x09ea82e8, 0x77988dce, 0x46b63f34, 0xf8a3e3c1, 0xc91ff057, +- 0x8007d40f, 0x6f943ca7, 0xaecd6729, 0xb3513a08, 0x313e9e39, 0xa7946ab0, +- 0x8edc49e1, 0xd2f3670c, 0xfaa06d9b, 0x1fbe6cb2, 0xe386511e, 0xa7a0f023, +- 0x2bfa109f, 0x3c26eb11, 0xd6d1482d, 0x0335505d, 0xe64e15d6, 0x73b2d3f5, +- 0x7b320577, 0x66fee8e0, 0x05541764, 0xcffb228a, 0x5d78833f, 0xcde6f020, +- 0xeb06741e, 0x4b507935, 0x11f44284, 0x8b507940, 0x4de861f4, 0xbdd9e91f, +- 0xf51033e8, 0x8374c7be, 0xbf7ab3f7, 0x9f7a89ef, 0xcdbe5299, 0x66df62fb, +- 0x656bed44, 0x4456bed4, 0x1c1a35c1, 0x4d5fc9d4, 0xdb692f2e, 0x7984e8d5, +- 0xe40475dc, 0xe7a48b2c, 0x77cf4451, 0x8efd1a29, 0xbb7a833e, 0x08cb9e87, +- 0xf62add9e, 0x1766302d, 0x942a9fea, 0xe07b63c3, 0x08872839, 0x19e55b1e, +- 0xc6afa91e, 0x3db942ed, 0x3f6b49bf, 0x6c2fda9e, 0x99bbfad0, 0x647db5ea, +- 0xd154ef81, 0xc3b90abe, 0x60ce1302, 0xf857eafd, 0x3d07f5fb, 0x0fc86e67, +- 0xd978512d, 0xa207051f, 0x1afeefda, 0xf510d6fd, 0xfaa8e6fe, 0x5f7828e6, +- 0x7fa4dc14, 0x0352f17f, 0xa062e1f1, 0x6888dc07, 0x8fa68cbe, 0xedbbb387, +- 0x6e7d6e9c, 0xa77d91b0, 0xf5e9abe3, 0xe0fc7e1c, 0xa2a6aacc, 0xd6fb3808, +- 0xdff700aa, 0x2697480d, 0x73207fc6, 0x83d01203, 0xf9b90fa9, 0xb2e8be83, +- 0xf3df5a20, 0x9fe13ffa, 0x332f6819, 0x4c725d9d, 0x92edc3d2, 0x6745ef36, +- 0x43e11636, 0x42a9ae0d, 0x5efa7a7f, 0x9fc0bafd, 0xaac2f015, 0xbb08cc8a, +- 0xcaa0b028, 0xad4eb113, 0xbf2f94fd, 0xe7bc7092, 0x1d5417b3, 0x499afa82, +- 0x983abca1, 0x2f324d67, 0xa84a5f41, 0xf889d7af, 0x255794cd, 0x9acbea2f, +- 0x86de50f8, 0xb27588a2, 0x675c7cd6, 0xed12fdfb, 0xf61ea04f, 0x98b4f007, +- 0x8f0a2381, 0x331e64ee, 0xc4fa81cb, 0xc24f4dc4, 0x97eec77b, 0x7e9ea136, +- 0x273f537f, 0x39c943fa, 0x963ceedc, 0x19739378, 0x7709edc0, 0xdf6dbc90, +- 0xa3ca993e, 0x975b6792, 0xd9dbd8c2, 0x856caaab, 0x78489f58, 0x69707d3a, +- 0xefa016d5, 0x7a2ed933, 0x38ac97df, 0xdeded0db, 0x5d876261, 0xe2952f38, +- 0x5a778b48, 0x7ce0778a, 0xa2710cb6, 0x47e4b9fd, 0xa0325355, 0x934692dd, +- 0xa754768a, 0xf9c2c951, 0x364c76f9, 0x06d2fd63, 0xa16e0651, 0xffbff5f2, +- 0xed01dea4, 0xa8371ebb, 0xcdfda107, 0x35beb45f, 0x4d15e00c, 0xd16e2a39, +- 0x2807e06b, 0x7db9ce30, 0xd0128283, 0x757107e5, 0xf6f16627, 0xb8afdb0c, +- 0xab3d3aee, 0xca4bdb14, 0x017f6856, 0x7cfda39e, 0xa0e901e1, 0xb0e5e701, +- 0x49601bc7, 0x1464be17, 0x68d0b9cf, 0xee7c6209, 0xfb77cd9c, 0x9f671c3e, +- 0x767d2d09, 0x1872e0c1, 0x1d9f0f00, 0x3d2ab7bc, 0xc45b9f03, 0xb49bdefe, +- 0xd8b0f018, 0xa43f4dd8, 0x7127964f, 0x7becb3f8, 0x3ac30eab, 0x88323c2e, +- 0x722b57e2, 0x80d95d3c, 0xcf5cc2af, 0x107e58e7, 0xebd6f5c7, 0x40ee977f, +- 0x97d7fe3b, 0xbe913897, 0xd6f426fe, 0x3896d76b, 0x55d84497, 0x89913fcb, +- 0xbb375e0e, 0x5f7ce236, 0x40681f8f, 0xa0e81b3f, 0x97c9c61f, 0xe805bf0a, +- 0x31f3d379, 0xcd7fabec, 0xdabf6896, 0xde3a907f, 0x6deba3a5, 0xdfc8a7a4, +- 0x93f6d800, 0xa002bbad, 0x365bcfdb, 0x8e500fb1, 0x7147ee6d, 0xc84ca5db, +- 0x82e26781, 0xf4b157e8, 0xf8c8fcd6, 0x8a1f374d, 0xd80c7ff6, 0x847faf09, +- 0xfdf7e8f6, 0x761ff031, 0x7eddeb66, 0x401ec385, 0xbb43e2e3, 0x78fdc65d, +- 0xb85ff65f, 0xfe5bde0f, 0xc0f489b8, 0x3753c7f2, 0x40b8e177, 0x8b571837, +- 0x1c82d75e, 0xf4638f13, 0x878197c5, 0xfe742aab, 0xbf24c3ca, 0xfccbe2fb, +- 0x75543c9f, 0x5f37d6c8, 0x7cb850ae, 0xc9b8f29a, 0x62b4fc8b, 0xa0665da4, +- 0xfe3d264f, 0xcfc461c6, 0x2571f58a, 0x8af89816, 0x5fb42dc7, 0x407b769d, +- 0xc39f7a81, 0x5941272e, 0xd6e5c39a, 0xed171cbc, 0x64c4b973, 0x0d95096b, +- 0x82bd6f18, 0x2f800de1, 0xcf787a6d, 0x23e71868, 0x1a379c16, 0xc3c577f0, +- 0x0bcaf4e9, 0x991dc512, 0x826791ec, 0xb8c95cbc, 0xf93da89c, 0xfc2279bc, +- 0xc56eb2b9, 0x5707f40c, 0x3ae74d05, 0xf18e0f85, 0xf9ac75d8, 0xea186973, +- 0xa273fd57, 0xf3d62704, 0x49d61adf, 0x35b6a372, 0xdaebfbf6, 0xe467cff4, +- 0x0c2e53d8, 0x2e431861, 0x2bb10c01, 0x067ca675, 0x03615c4b, 0x96f582fe, +- 0xbcd037ef, 0x82926c57, 0x79779816, 0x3e2f1e3f, 0x37fd87ef, 0x0a03bad3, +- 0x73762bc0, 0x1982b3bd, 0xf3f85682, 0x29ebfd96, 0xc84c797e, 0xe606c599, +- 0x20fefa45, 0x3f42cd4e, 0x71e3f97f, 0x4f15df84, 0x47b7faac, 0x2dcebde0, +- 0xfd225333, 0x174825ea, 0x9accbf1c, 0x87cfd3dc, 0x859fbe5b, 0x63fe5ff4, +- 0x3d618ff0, 0x2fd8922b, 0xbf71b816, 0xb65cb232, 0xb62b769e, 0xdbcf9fde, +- 0x7e0d7f81, 0x2407e2f4, 0xd17b075a, 0x78107a42, 0xdbc4895d, 0x669386d2, +- 0x5bff1173, 0xdafb0a71, 0x39bc7285, 0xe7fbc12c, 0x11b25ea0, 0x119d02fe, +- 0xb03bf271, 0x23920caf, 0x8d5f5c3e, 0x6cc770d1, 0x8ccba7ea, 0x8733bd7c, +- 0x441b43c7, 0xbd4b38b9, 0x0fcfe29d, 0x6eadd45a, 0x4a348fde, 0xbbfc03cc, +- 0x3978635a, 0x2fd981c6, 0x5957142d, 0x89e710d7, 0xe23f9073, 0x5dfa0e79, +- 0x9cd93327, 0xfa72fd8c, 0x72e2e35b, 0x2bbf9e03, 0x3b5af3c3, 0x49b58b97, +- 0x97ae6f80, 0xffe8463d, 0x872bfc33, 0xac3197f7, 0xf1eefde7, 0x85f53d0d, +- 0xfd5f10c3, 0x3ce355e6, 0xdf112e7e, 0x2c1e3202, 0xe7eefb43, 0xabf408d2, +- 0x6c703f17, 0xbbd9ca0a, 0xf0562d9e, 0xf8bfc5d5, 0xbb89e91d, 0xa2773ec4, +- 0x037a8f9d, 0x7ca167e0, 0x45cb8732, 0x42e3c49f, 0x687c0a4f, 0xd7d5adfb, +- 0xf1e2603e, 0x28e79079, 0xfcb76a40, 0xb5adfa9e, 0x67289d87, 0x8d345f6b, +- 0x94fc7942, 0x2d92ff98, 0x0bbfc703, 0x94c4b3f4, 0x5a5ea0a8, 0x46699813, +- 0x818b4d78, 0x52f79ee0, 0x3f1e90b3, 0x81c9786e, 0x5c41f274, 0x4ff50f28, +- 0xf538fad7, 0xe1402e20, 0x1b8fb971, 0xfc620ef2, 0xb612a966, 0xe97ea01b, +- 0x94649cc6, 0x212befd3, 0xdfbfd633, 0xec2236ea, 0x08f19451, 0x04e1e47b, +- 0xab220c7f, 0xca0fd055, 0xbe06b599, 0x399e6b9f, 0xf186ce66, 0xfdc3937e, +- 0xfe7e4f9b, 0xf38c7cbb, 0xf38566d4, 0x7ec07f51, 0x3c400fe7, 0xfd206d3f, +- 0xc919f6bb, 0x67ac3713, 0x7ee2d7bf, 0x16ad7f03, 0x85f6bcfb, 0xba45ee97, +- 0x5dfb8b5f, 0x805e9bd2, 0xf3d38f6e, 0x614c0ee7, 0x48e3fdfc, 0x02be9a17, +- 0x8c94c1b8, 0x9f0e3a71, 0x02fce1ce, 0xf3f82bcf, 0x4bc91140, 0x67682390, +- 0x5f7bd346, 0xd8b1fbfb, 0x2c5b25bf, 0x163f5724, 0xc0f9dbfb, 0xbfdc0e8b, +- 0xec7e7e4f, 0xd4a39e04, 0xd8da073e, 0x05ee8315, 0xfae1d63e, 0xb27f341d, +- 0x7ae1d623, 0xefeb3d1d, 0x6fc173a6, 0x9f5f18eb, 0xb275deb6, 0x2f56bf58, +- 0xd62cbfde, 0x7c0986b9, 0xf38830bd, 0xe427e097, 0xb4c7b457, 0xf992f9f5, +- 0x267d1afb, 0xffb972e7, 0x99ff2137, 0xfc40ead2, 0x9ca2fee0, 0x98f1fa01, +- 0x01b90947, 0x16793e4d, 0x5fb11fe6, 0x73b3fcda, 0xae403cf9, 0x7b929279, +- 0xc8d3b1f6, 0xb73ac656, 0x78e5c84c, 0x9698db3c, 0xfbf806d5, 0x892bfc18, +- 0x23957a71, 0x46e8d3c6, 0x67fcaf1b, 0xdd70d355, 0xfb087fd0, 0x3f7dc6d7, +- 0x3f632090, 0x1fce33ef, 0xbe35fcda, 0x345faf2c, 0xed81d8ad, 0x14e7b13e, +- 0xdd39bae1, 0x542ae766, 0x802ed07a, 0x066d3df7, 0x159f4f8a, 0xc6d9fcfe, +- 0x8a4b1c97, 0x25dde87a, 0xd93f8de6, 0x1a9e7bd9, 0x33d045fd, 0xfb7cb3cd, +- 0x6b0869fc, 0x4ba68df3, 0x7d1a6f0d, 0x64a9cdb2, 0xe9d344af, 0x66b3ccba, +- 0xb9fa2f1c, 0x807cb766, 0xffe415f1, 0xf2e3c654, 0x6e78ec0d, 0x9f863e84, +- 0xd1ea8d8d, 0xd79c9a0f, 0x14baf3f4, 0x2fc225cf, 0x43703a0b, 0x5366e736, +- 0xc72977bf, 0xfde039b7, 0x74c3e731, 0x87d9abfe, 0x92117f37, 0xf48e3112, +- 0x5224bb82, 0x7cb9adcf, 0x96b6e89c, 0xbfa1b785, 0xdf81f8b3, 0xf48d1ccd, +- 0xce8994f9, 0x4e37165b, 0xbddda336, 0xa39df0ea, 0x35cfdf70, 0xa9763d71, +- 0x6893e461, 0x7a6b9f37, 0x116779d8, 0x653e57be, 0xbc5f3c2c, 0xf5f698ab, +- 0x4cf0b883, 0x91eebb84, 0x6f7841d8, 0x9b91e1dc, 0xce3c0217, 0xae12537e, +- 0x5243fdef, 0x3a08d8c5, 0xcd94ca58, 0x934ed10b, 0x8be41513, 0xab3c85f7, +- 0x5a7df137, 0x517fe82e, 0x45f3e72e, 0xebcb7f62, 0x7cf1f3eb, 0xc800ebbc, +- 0x8d63c051, 0xc21ad5d9, 0x234d5f71, 0xd81d7fbb, 0x74c9e908, 0xd2764d4e, +- 0x66b3334a, 0x6b73d094, 0x693f3c06, 0xeb83df0a, 0xbd8f7939, 0x58e20b78, +- 0x096a3eba, 0x5f896fb7, 0xf1a5aec0, 0x3168edbb, 0x2e82658f, 0xded3fba3, +- 0x1ebb40ef, 0xff989ee5, 0xe6a786a5, 0x74babea1, 0xd7192f24, 0x71abe1ff, +- 0x7cdf684d, 0x4c72e268, 0xaeec1feb, 0x11f691f3, 0x183a5bd8, 0x0c1d2aec, +- 0x6f5e75f4, 0xbc256d8f, 0xb7ab9bdc, 0xad3a34ab, 0x18979f59, 0xcbd01799, +- 0x0a43fefe, 0x9cf7ff9d, 0x644e8cbf, 0x7742e431, 0x880fd5dc, 0x3c6c67ca, +- 0xcf18fada, 0xf9f2f84d, 0x2ddfda30, 0xeb02c516, 0x8e748f3c, 0x4a2f4be7, +- 0x72b7eedc, 0xe2ff3fba, 0x77fa2088, 0xe1c0ffcb, 0x2086ade5, 0xdf1edd1e, +- 0xf6c25db5, 0x4beec0cb, 0xb3d84433, 0x03cd77bb, 0x545767f2, 0x680cb6df, +- 0xcf08e57f, 0x5b6a8077, 0x227b1d94, 0x1db7d5c3, 0x5fb6cffb, 0x61c0b8b5, +- 0x532adf0d, 0x9e1adf11, 0x75e67f35, 0x92b287a0, 0xea7dbc1e, 0xebf6495f, +- 0xca8fbf65, 0x1f670ccf, 0x6c74871c, 0x5f91544f, 0xb0f6dd7e, 0xfbf70034, +- 0xe8ebe285, 0x25b58e97, 0x9fb7c82a, 0xb9d137fa, 0x1d7f65e6, 0x6b7eda95, +- 0x5f9bb171, 0x3ef7a768, 0xcaf11b6d, 0x35ef7838, 0xd790a25b, 0x35f731c9, +- 0xeee3bf3a, 0xf0d3a3f5, 0x8faeb6b9, 0xabfbe3ee, 0x23a3fbcd, 0x5d703a77, +- 0x7bf58fed, 0x6bee0c65, 0xf682a242, 0xdf910ad9, 0x971f6171, 0x89ad170f, +- 0xfd80ce4f, 0x8e7fb8bd, 0x5c9c8193, 0x1e773ed6, 0xaafe5f3e, 0x5cfb4141, +- 0x81cab57d, 0xcb3f8df1, 0x4b050e9d, 0xf3842f78, 0xca128391, 0x6c95b1a3, +- 0x1b1fb60e, 0xfa0b9992, 0xd3833319, 0x72cb98c9, 0x3e780f10, 0xb714e786, +- 0x714f1eb8, 0xc3f5f80b, 0xbf658dfc, 0x0d0ef1e2, 0x35df9aef, 0x04dbac4e, +- 0x2e7447ec, 0xf197979e, 0x7fee1fe7, 0x77f6167e, 0xc14990e9, 0xc87a7f79, +- 0x06affd44, 0xe308c97f, 0xfdc23c5d, 0xdce38410, 0xdfdcc7c8, 0xfdcadd58, +- 0x26f5da8d, 0x37b1398f, 0xb447963d, 0x9e0ebf43, 0x55dc70b9, 0x3a34de82, +- 0xebe1ed5d, 0x0d7a0d5b, 0xb74d1bd7, 0x1b75ac49, 0xe8ebe9e2, 0xedd29bf7, +- 0x135e90df, 0xe87cb758, 0xe8bed7a6, 0xf913e044, 0xa355e91d, 0xf8fbd587, +- 0x6b727a39, 0x3ba444f1, 0x79343e8d, 0x0ac49812, 0x9bd66f50, 0xdde60159, +- 0x2af18c04, 0x9b2a81ca, 0x7f7284cb, 0x05674a4e, 0x1e4965a2, 0xb952a797, +- 0xfd4463d1, 0x79216f53, 0x526f2d11, 0xdffcb8f2, 0xed074483, 0x2a14f28b, +- 0xfc8eac4d, 0x8584ad07, 0x5cfd440c, 0x9ffc9095, 0x5372682e, 0x65b383de, +- 0xb8d57f98, 0x54727be4, 0xede506c6, 0xe488f0e6, 0x97a82691, 0x5d9a1feb, +- 0x9e457001, 0x445e6067, 0xa70e97bf, 0xc0f5c40d, 0x8c1e5773, 0x97c53dbb, +- 0xb33ae583, 0x67f7e48d, 0x9b61ae86, 0xcfed3ddc, 0xff7f6abc, 0xb81eaed7, +- 0xd4b2c4d3, 0xcd198422, 0xcaef2b5b, 0xe3e60cf3, 0x612f9fe8, 0xe2f291ac, +- 0x5dfbff02, 0xe7e043b4, 0xdefec2b5, 0x8969e82a, 0xfdc216d5, 0xcba64d64, +- 0xa80576dd, 0xca26a67e, 0x04b30748, 0x872adc1d, 0x42fdf1da, 0xb05ca0d6, +- 0xffb3e992, 0x3a377eab, 0x05d995a7, 0x87a03fad, 0x3eb04ccf, 0x900367a0, +- 0x196026d7, 0x06b12003, 0x95e197e4, 0xd85ffdff, 0x75807d6f, 0x6b9e11c6, +- 0x067b9414, 0x057e33e6, 0x63826d65, 0x3c33c618, 0x3643d92f, 0x3f0dc7d8, +- 0x5fba204f, 0x5217ec25, 0xa65f98c6, 0x74b0f5f0, 0x8f7fde7e, 0xfd0fb7a0, +- 0x5817372c, 0xf47613fb, 0xb1e61953, 0x1b37ce2a, 0x78c6bdf1, 0x0b836b2a, +- 0x81deb4f9, 0xbf27c576, 0x09145490, 0xc8dd846b, 0x7e0aa50e, 0xa0134297, +- 0x785dc3be, 0x8d4bf510, 0x6ecb97a0, 0x606f7e46, 0xfaf2858b, 0x5963f5d8, +- 0x995c03f7, 0xfe8a8b7d, 0xb767e5e4, 0x7d832ee7, 0x0ed8c0b2, 0xe854e758, +- 0x6aa60cb3, 0x73a25802, 0x03f520de, 0x3c0701f5, 0x387ee6df, 0xf319d38b, +- 0xfdb47ae2, 0x6bdef0d1, 0xb468603f, 0x66568d2f, 0x90b1ff42, 0xff9057ed, +- 0x8c997db4, 0xfff03dce, 0x9c791786, 0x75818363, 0xf9af18c3, 0x8d780ad0, +- 0x4f6a5f21, 0x267641be, 0x27405bb0, 0x19dff657, 0x1d95ff5b, 0xffd76330, +- 0x98d83d6c, 0x315ff427, 0x037b262b, 0xadfd0697, 0x4b266d10, 0xd7192e35, +- 0x91556a93, 0x9e3c361e, 0x1d867a43, 0xa0f44dd9, 0xfbfb63b5, 0x736c9d11, +- 0x55ff844b, 0xcc4cb06d, 0x4feb69d3, 0xda338b79, 0x5c74a992, 0x97e7a74b, +- 0x94ab7c9e, 0x3fbe1bcb, 0x369a7f33, 0x7e83f289, 0x6d4a883a, 0xbd041b1e, +- 0xe2be7869, 0xc93e7815, 0xbb06d5f5, 0x397dfc99, 0x79489850, 0x0b121d8c, +- 0xe4f73c02, 0x57e2131c, 0x6d74e78a, 0x57323749, 0xc459bc0c, 0xe2b9c47e, +- 0xded22b99, 0x68c2780f, 0xf517cfd7, 0x51c90509, 0xe6df7cf5, 0xb7cfe589, +- 0xf3819cad, 0x75fdabb6, 0x4c776ce3, 0x92ba20e9, 0x5f38cb2e, 0xeb0304cb, +- 0x352be787, 0x3b987dfa, 0xc69b0f57, 0xd5f24e7f, 0xbf7a3e34, 0x4dfd0999, +- 0xfcff478b, 0x17a13cb5, 0xe461590a, 0x9fc2f63e, 0x0d7c4acd, 0x78ef79da, +- 0x9875e780, 0xedc5d058, 0xafc7b435, 0xb7442c78, 0xde04e3db, 0x21e9a50c, +- 0xa6589f68, 0x47925fc7, 0x957eaf8f, 0x7aa4fc7a, 0xab4878f5, 0x67d5d6ce, +- 0xeaeb06f8, 0xd12cac07, 0xc6eb03c1, 0xb4dfdaea, 0x760e9269, 0xdae9a607, +- 0xd6cd34e7, 0x0b2d79c1, 0xed07ed75, 0x2faba25b, 0xd5d6ae0c, 0x41b2390f, +- 0xfd6d0f07, 0xe1fb5d17, 0xf5755b6d, 0xba1da1c5, 0x0f1d11fa, 0xe191e0e9, +- 0x47ed7547, 0x57507bbf, 0x69f3a63f, 0x8bb8fd5d, 0x9be0e9cf, 0xb5d65ebb, +- 0xa8ed709f, 0xdec89e0e, 0xb72fb5d2, 0x4f074efe, 0xd743fe56, 0x0ff496fe, +- 0x5d53f574, 0xa7eaeb1f, 0xc1d55c17, 0x097d9877, 0xea97c8f9, 0xcdef74df, +- 0x8e1fae62, 0x9f9e3a07, 0x00435462, 0xfc85f3db, 0x8c977410, 0xdaed13fa, +- 0x7485965c, 0x1f1a593a, 0x336bba22, 0x4457e8a8, 0x63f927eb, 0x65e307af, +- 0x8a8325ec, 0xb044ac71, 0xf188e4eb, 0x70563c92, 0x7ee07b00, 0x4e0e8a95, +- 0xdaeba6f5, 0x74bb55a7, 0x02be19f5, 0x9580fd5d, 0x581e0eaa, 0x7f6ba657, +- 0x0e8f26d3, 0x752a0776, 0xbc9a73ed, 0xa5af383a, 0xd07ed75a, 0xbeae9f3e, +- 0x5752b830, 0x9d48e43f, 0xbada1e0e, 0x787ed749, 0x5f57405b, 0xd5d26a1c, +- 0xd168e88f, 0xfbc323c1, 0xbf47ed74, 0x8fd5d41b, 0xaba23ce9, 0x55b1771f, +- 0xd5dcdf07, 0xe13f6ba6, 0x4f07485a, 0xed752764, 0x7467adcb, 0x3de564f0, +- 0xd25bfb5d, 0xa7eaeacf, 0xeae92eba, 0x7a647b35, 0xe7fae7c1, 0xa9993ec2, +- 0xfdee97fe, 0x430f24c0, 0x673c08fa, 0xa05deb50, 0xb9b3f2ff, 0x2d13073e, +- 0xc67b424e, 0xc945f94b, 0x7207a098, 0x2060312b, 0x5b9542ba, 0x149ef143, +- 0x52a453d2, 0x0347985c, 0xde81de7a, 0xf68ddb93, 0x9d8f426d, 0x88d5f995, +- 0x7d676e6f, 0x30387d1f, 0x944db65d, 0x0de563aa, 0xc79f3f7e, 0xfbe50e39, +- 0xa2a7e436, 0x14ecf11f, 0xb157b3b4, 0xe79c36c0, 0xb128a964, 0x71a8e313, +- 0x568538fa, 0x645eb54e, 0x77dd8472, 0xb325ae32, 0xfcfe06e4, 0x2665eb54, +- 0x57e8888f, 0xb00c2fc4, 0xfd110dfe, 0x807e083f, 0x8b7f3e0c, 0x6c0af81f, +- 0x0afc87a4, 0xe9fdbbc1, 0xbbf1ef04, 0x2fe7dca8, 0xbf51f2a0, 0xfdfbf54a, +- 0xe13f0465, 0xf41c10f7, 0xd0795257, 0x87e7a5ef, 0x3f04d5fc, 0x96317e09, +- 0xc64fc047, 0x77f069f2, 0xf019feb1, 0x85fe117f, 0xab65403f, 0x3f9e89bf, +- 0xf8216fe7, 0x823eff05, 0x520fe97f, 0x423fe6d9, 0x56fecbe5, 0xdfc57faa, +- 0xfe6bf046, 0x7f21c110, 0xfd47c107, 0xfb8f8261, 0x84f825df, 0x0eca93bf, +- 0xdf2a45ff, 0xfd5177f4, 0x8235ff29, 0x6f53f67b, 0xf3e346ff, 0x65571123, +- 0x215c4ec2, 0x70a587e8, 0x273970fb, 0xd042b605, 0xa81269ad, 0xfa3fb457, +- 0x3cc41fe7, 0x574891d6, 0xa7574405, 0x1efd8dbe, 0x25697fed, 0x9bf719d0, +- 0x3c781bd7, 0x22efd346, 0xefd3405f, 0x7f70f735, 0xbbd81175, 0x43ffff18, +- 0xaf3fb71c, 0xd00a99d4, 0xc431ab8e, 0x5d2f68ab, 0xd933fba9, 0xafcf0c47, +- 0x78ee4581, 0x476072c5, 0x0356df84, 0xfde11bef, 0x18b45999, 0x4c3ac356, +- 0x332a2e74, 0x357c048f, 0x37efa076, 0x0f561fa8, 0x7fc80634, 0xd1f305b6, +- 0xa07dbb6f, 0x7ef48c2f, 0x09d96ea5, 0xd2a28fc2, 0x4b4ce0b9, 0xc63e7528, +- 0x144a4e49, 0x1f0bebdf, 0x785e44eb, 0x5daff59f, 0xbc3b44ca, 0x0f92eff2, +- 0xc9b4e7f7, 0x83718d5e, 0x1fb9f20f, 0x51be41fa, 0xe81e5e57, 0xfcf3873b, +- 0x76eebd8b, 0x2ff0a023, 0xe4ff59df, 0xbf1eeedd, 0x3d7456f9, 0x62ae5ec1, +- 0x29e5132e, 0x6e1bcf32, 0xe636eae8, 0x0b3e7823, 0xa67b7950, 0xd75c63ef, +- 0xd8241602, 0x1592d637, 0xf3d15d6b, 0x03908bfa, 0xea37c97f, 0xbe59feca, +- 0xf2f3e4ff, 0x8f4ebcd0, 0xd71f25b9, 0x616bcda5, 0x3fe68b96, 0x813d758b, +- 0xabcbfbf3, 0xe4305f9f, 0xff8fa6f4, 0x61b0ba01, 0x31da0598, 0xc7a8df3c, +- 0xafa81cc4, 0xf940cfbf, 0xd45d1ad9, 0xdf104060, 0xbca06cdb, 0x013a1efd, +- 0x2bbf40fa, 0xf1ee8ba5, 0x0f249d01, 0x23193a42, 0x4f60cc05, 0xf306369e, +- 0xbc5e740d, 0x84718ccc, 0x1f402915, 0xc1d37dd9, 0x409f715a, 0x95f40e7b, +- 0xfa7dfd89, 0x8805d1ab, 0x8daf75af, 0xeabe2171, 0xe80fb08d, 0xa929be27, +- 0x8b851f3c, 0x50dc697e, 0x5932578a, 0x34ce3155, 0xde5b12d3, 0xe9c41f8e, +- 0xa9ba74e7, 0xe9fd4832, 0x074a55cf, 0x1d2b7df1, 0xc373f7c4, 0x48d70ffa, +- 0x47d3ef30, 0x947dd12f, 0xf4dff35e, 0xc46e6166, 0x9db5d7bc, 0x2189e29d, +- 0xfe8be7bf, 0xcc91ba34, 0x5b01df76, 0xe9babce4, 0xfbae1c78, 0xc740492f, +- 0x17c74439, 0x9670fcf0, 0x1f3895c5, 0x09404eca, 0x1fbee9da, 0x2dffe42b, +- 0x4b952a61, 0x15ca9799, 0xb748edb0, 0x332ec0de, 0x6b357be2, 0xcb6be7a5, +- 0x1d2274ee, 0xc8fa372f, 0x99835e2f, 0xcb9e78b7, 0x01d22aba, 0x6d35b76f, +- 0xd01d2379, 0xd765a737, 0xcecf8c64, 0x037e2e0e, 0x8643aacb, 0x0a87980b, +- 0xe70b317c, 0x6ba869d5, 0x2fe30fec, 0xe362667c, 0x4b3e7800, 0xdec1fbe2, +- 0xc9a1fbe2, 0x0375e88d, 0x941bcc1f, 0xd0f2eb8a, 0xa54724ba, 0xb66a0f8e, +- 0xa5218f32, 0x9bbe1f27, 0xfaeeca2f, 0x5f9400d3, 0x07c51772, 0x4966bdd6, +- 0xcd5e7dc6, 0xf0603db8, 0xcd0ff168, 0xe744600e, 0x1578b177, 0xe8247ddb, +- 0x8c81a3fa, 0x0323fae8, 0x3d258438, 0xf2cb29f6, 0xf4e497a5, 0xc675ebe8, +- 0x9e218667, 0xe2d79f40, 0xd07f577c, 0x8dd8adba, 0x85983f72, 0x69e989f6, +- 0xd6ef5a8b, 0x55f615e9, 0xeb5c4f42, 0x3b8f1341, 0x50cbcf45, 0xd0bfe276, +- 0x5998b11e, 0x8039cf00, 0xe428d9af, 0xe266fee7, 0x2d447aab, 0x7926c7c6, +- 0x557cfc5d, 0x3169ffdf, 0xb92f8edf, 0xf5801c3f, 0xf7a49c60, 0x594f5c38, +- 0x21c67be2, 0x3464e1b9, 0x9c41cece, 0x98f1b57f, 0xed1333ad, 0x7de3fbf7, +- 0xd5fdc03f, 0x3f9a3de2, 0x30fee1d9, 0x8d99ee97, 0xf74354bd, 0xe858c637, +- 0x22addf7e, 0x196b760e, 0xaadd838f, 0x47c6bdc5, 0xe2a2bdc5, 0xec7c6c2f, +- 0x97269838, 0xefc95319, 0xd07f642d, 0x17f14fd6, 0xd2f60e4d, 0x3090b0ab, +- 0x145da5c5, 0xcb8ee8af, 0x1e799b14, 0xad306b8d, 0xe4e42cc7, 0x4f972f4e, +- 0xd569fbda, 0xfce8c2e0, 0xd5cb2b08, 0x0e8a11f9, 0xae97581e, 0x26d37f6b, +- 0x1ddeae97, 0xe7d5d028, 0x383aa934, 0xd74ca5af, 0x8f3ed07e, 0x560c2e0e, +- 0x390fdaea, 0x43c1d5e2, 0xed75ab5b, 0x74f9b787, 0x95a1c5f5, 0x1d11faba, +- 0x64783a75, 0xfdae9378, 0xba0377e8, 0x4d9d31fa, 0x1771faba, 0xcdf0745b, +- 0xed74fb5d, 0xea0b5c27, 0xa7b227ea, 0xd6e5f574, 0x64f07567, 0xf6ba57e5, +- 0x74fd0b8f, 0xeebb7a4b, 0x49d754f9, 0x0bd37bdd, 0xc7e0e8ce, 0x0f919f71, +- 0x0f899816, 0xe9efaa66, 0x10f267de, 0xe39b938a, 0x1dfdb3f8, 0x3ca3146f, +- 0x170c6fdc, 0x6e3e9f23, 0xf96374ec, 0xb5b5c184, 0xce49d01f, 0xd61489f8, +- 0xbc58abce, 0x3341cb15, 0x5d5318b6, 0x0f731fb0, 0x393d456c, 0xe8dda6a4, +- 0xd2e87804, 0x889d5bb3, 0x290635f7, 0xd1bdf10d, 0x88e58f5d, 0x74a513cd, +- 0xb0d91fa8, 0xe8e51eb8, 0x8b33e6e8, 0x007496d1, 0xfe3187cf, 0x3e887b25, +- 0x69186637, 0xc6471bde, 0xcedcde53, 0x9d1936b1, 0x9c3b9d96, 0xdc0f180d, +- 0x09a4a3b9, 0xbf606dcb, 0x358ccd07, 0xe58efd81, 0x83dfb00e, 0x3c6c8be0, +- 0xe424e7f3, 0x53a6e547, 0xbf2e78e9, 0xaa47d27d, 0x4a15c551, 0xbf438f73, +- 0x22f1a9cd, 0x3b9a515f, 0x4efb7411, 0xdf8049e4, 0x1730923f, 0xe1a370f3, +- 0xad788717, 0x72f7c805, 0xbaed1b8b, 0xac06fd5e, 0xfe017efa, 0x927afd66, +- 0x1e785fb1, 0xad216f33, 0xf7e1eb80, 0xde5a8c0b, 0x715be53a, 0xb04a1c53, +- 0x9e41123f, 0xf0e98f35, 0xcabc00ad, 0xee819d4a, 0x26fb8b09, 0xf8a6aa18, +- 0x26aff5ee, 0x2e9c03c4, 0xe451dbde, 0xfe802bcb, 0x9ca0606c, 0xf497a08b, +- 0xd04700a5, 0xefc05ec7, 0xf99edcb9, 0x0630ee98, 0xa60b9064, 0x1555789f, +- 0x516c79c6, 0x7b97393c, 0x223b7acd, 0xdc8de44f, 0xf7146057, 0x68a8e65f, +- 0xc057dcff, 0xfe23dcf5, 0xe7cff38b, 0xf35dff62, 0x329e03cf, 0x0f988696, +- 0xf54d99e4, 0x611a98aa, 0xb17567aa, 0xf19bc8fc, 0x6fbc0612, 0xee92763a, +- 0x702aafaf, 0xd4325e11, 0xff775a16, 0x646fd0a5, 0x33ae4d9c, 0xda403e60, +- 0xce033ae6, 0xaaf14d2f, 0xacc78e78, 0xbcfddd4e, 0x997f4db4, 0xa7e41e7f, +- 0xb155efc9, 0x46ba699d, 0x222b218f, 0x925aaafb, 0x47cc62c8, 0xfc9d6d2b, +- 0x7aafa8fc, 0x759bc947, 0x625a3794, 0xd111e173, 0xeab6c5e3, 0x7bf63103, +- 0x66efd895, 0x9b7c7e87, 0xe4203e76, 0x718555f4, 0xf7f8213d, 0x6b0e24ee, +- 0x5c5ddcfd, 0xf9c37692, 0xce7463ee, 0x30cdc1a9, 0xf9a9e20e, 0xd715bb7a, +- 0x0b798cdf, 0xe9182fa4, 0x547e2789, 0xa1876070, 0xa2f63ef7, 0xc4fca047, +- 0xce8fa412, 0x83f03d60, 0xa2acd8bd, 0xdefb645d, 0xdeea0372, 0x89475674, +- 0x1591b637, 0x1bb0f21d, 0x4f5aafcc, 0x3d3e6987, 0x97d9329d, 0x62faf941, +- 0x1c3d351f, 0xafa66fbd, 0xc872d272, 0xd979e2ee, 0x67fe4e1b, 0xef022f9c, +- 0x557c123f, 0xe4245ac6, 0x95acb193, 0x4c2cf1ca, 0x175877e5, 0xc8a61e95, +- 0x2a624e58, 0x4bcc1595, 0x475614e5, 0xa16b2565, 0xa56b1a72, 0x530b0672, +- 0x950afe09, 0x5f90a65e, 0x36f41b35, 0x97997396, 0x8eac79ca, 0x1d229fca, +- 0x59ab3e03, 0x590bc10b, 0xc06d952b, 0xfaa5787f, 0x586f9065, 0x0df202be, +- 0xe9fcd7cb, 0x2efc8654, 0xbf47cae6, 0xe3ca80bf, 0x13ca957e, 0x3b2a32fe, +- 0xf76a1efc, 0xca92bfa6, 0x952f7e53, 0x54d5fda7, 0x6a3efd86, 0x257fb6f7, +- 0xebf8ef95, 0xff37fca8, 0xf5df2a26, 0x77fca807, 0x7995137f, 0x39764666, +- 0xcf15082b, 0x7e67fc06, 0x60b8f660, 0x3c0aaf1f, 0x5318f31e, 0xff70530b, +- 0x4df18664, 0x2231c55b, 0x48cb9b0a, 0x5c9addf7, 0x289dd947, 0x3b734f07, +- 0x27669ecd, 0x72d6d03b, 0x613e619c, 0x4a53a19b, 0x793cbd80, 0xd6b98ee4, +- 0xaf93d042, 0x150486b0, 0xadbba5e1, 0x309e07a0, 0x027eeb85, 0x960bc7f5, +- 0xce82b5cc, 0xfb7f6b1a, 0x4c39a7e3, 0xb38e63f5, 0xdfe0057a, 0x1bb1591e, +- 0x3ce130af, 0x57bede50, 0xe62e7ab0, 0xf2155feb, 0x00c37c02, 0xb7ad2de5, +- 0xb16f3105, 0x3168e5b8, 0x7531b62a, 0x37d412b6, 0x1e28ed11, 0xe8bb57d0, +- 0xc7bded7a, 0xe2129d6a, 0x64cff9a1, 0x9cccb37e, 0x9dc63150, 0x7e35fb22, +- 0x7499f1b3, 0xdb23f183, 0xdfd06e19, 0x9fcf228e, 0xfffccf50, 0xfa68f3a6, +- 0xec757d36, 0x062efa59, 0x7e438aeb, 0xe5c4983e, 0xa5d8174d, 0x0b34dfe8, +- 0x364b79b8, 0xb507a9d9, 0xcbefb37c, 0x5e307f54, 0xf081d2bd, 0x378a5c96, +- 0xe2792734, 0x637db10b, 0xcc9dc936, 0x63794604, 0x8a13d53b, 0xe3ef822b, +- 0xb2fcb90b, 0x7285fcdd, 0xefe5ca27, 0xae8f0ccb, 0x3bfefa6f, 0xde00b71d, +- 0x05468d5c, 0xe6f12df7, 0x7e512a77, 0xa3cb3704, 0x18e32124, 0x12792fd5, +- 0xaa9da6fd, 0xf61f3e39, 0x0ea200f5, 0x1b26aced, 0xfd9959d9, 0xc377c542, +- 0xcf328d78, 0x6f968aff, 0x9cb90bb3, 0xc34bda37, 0xc0b76e74, 0x4478c2ea, +- 0xd9b0f25f, 0xf3c2caef, 0x6fbc6764, 0x287e0331, 0x4a676a7c, 0xa7732823, +- 0xa313db83, 0xf6483a9f, 0x27c8b344, 0xd2314c6d, 0x256c49f7, 0x445203ce, +- 0xc87336bf, 0x36f8e785, 0xb163e0a3, 0x3207e69e, 0xf7b75f29, 0xefba5d3c, +- 0x9855d915, 0x6e1c8447, 0xee817116, 0x3ff446f1, 0xcdc44520, 0x4a90966c, +- 0x4bfa69e3, 0x3fc76f1b, 0x914ede36, 0x678da927, 0x9f5fa51f, 0xf5a61cdd, +- 0xa1fd85d9, 0xd713b78d, 0xe30f2317, 0xf5c3c76b, 0x5a378e45, 0x25bb3ebf, +- 0x4bb3eb4c, 0x1ee95edc, 0xf1ec476f, 0x4f671afa, 0x569cfe54, 0x72e42fce, +- 0x7632cc15, 0xd33ff60e, 0x09f9e9c2, 0xd9c5d313, 0x7e7a0937, 0xa69788b2, +- 0x992e5c09, 0xcfba669c, 0x7179d133, 0x6db5d217, 0x9dce91b7, 0xc827296c, +- 0x4ed3927e, 0x40fc8931, 0x9fcf8ad6, 0x02f7f030, 0x7998e6a9, 0xe1fc7b2b, +- 0x7111b9f9, 0xceb534e3, 0x134ff980, 0xe30c1d9d, 0x3314b6ec, 0x6296dfad, +- 0xfca1c60d, 0xcd809955, 0xdb8004c1, 0x0b1b7c8b, 0x954e3d61, 0xc5338bf3, +- 0x92f3007c, 0xdfa1aad2, 0x84ff7d08, 0x772663a0, 0xee22abba, 0xc45b3cd7, +- 0xaf8d49ed, 0x7237e7a3, 0x41ff5f30, 0x4f31e7f0, 0x8f0c6ba7, 0xdc3e9c93, +- 0x5987fc9f, 0xd07bc60f, 0xc0fd3e8f, 0x77820ae0, 0xf5f3a58c, 0x4ec787d3, +- 0xd6627f41, 0x8246698e, 0xe303ac0d, 0x2c76b31f, 0xccf3e234, 0xdffb461c, +- 0xf24cd675, 0xd58ed675, 0x4cbffda2, 0xc665f6c1, 0x6e30cfc0, 0x91ef7650, +- 0x8c8b8c04, 0x00373fb5, 0xcec6d3cb, 0xa07df88d, 0x1bf6155b, 0x5bbcd734, +- 0xb228ed92, 0x36c81eab, 0x44f59fa1, 0x99bf3f21, 0x9e263cc3, 0xbf25e187, +- 0xf091fc7e, 0xfbb2bc31, 0x72aed69d, 0xb4f6c63c, 0x9cb1c729, 0xdaf15214, +- 0xf0e8ab32, 0x4a72c71e, 0xcd02aeb8, 0x5b77cad9, 0x3159638e, 0xe204f7dc, +- 0x46f7f0f7, 0xc614fc95, 0x6e6fbac9, 0xd93bda3c, 0x0f27435b, 0x44d65c50, +- 0x94f6c2f7, 0x18249b79, 0x6bcb8f6f, 0x27b43d45, 0xf248db25, 0x256ea935, +- 0x3c6073ad, 0x51ee75c3, 0x45c9717c, 0xbec97724, 0x11ec137f, 0xe7eeffdc, +- 0x33f9fcf1, 0x151afe82, 0xf88935af, 0x027ca140, 0x9acbb09b, 0x151d2799, +- 0x04f76ca1, 0xc7b72e31, 0xc078e5c3, 0x6c52fdc6, 0x58ec0dbe, 0xec6992ba, +- 0x95594fd9, 0x60c779f5, 0xb2bf60de, 0x10b28768, 0xa6bc5fed, 0x0fe8308a, +- 0xc61d5dfe, 0xe6dda1f5, 0x36be38a4, 0xfa14b97f, 0x9c33a08b, 0xcf5b6cff, +- 0x67b8da7b, 0x237e7ac4, 0x1f1ef4e4, 0xef9b4fef, 0x463728db, 0x465dbcd2, +- 0xe6248f9c, 0x4630eb03, 0x1da227cc, 0xde7bafad, 0xf7e74d4c, 0xdf8c3d4d, +- 0x392e6543, 0x8b0efd62, 0x1e912ad7, 0xbf482a34, 0xf948d576, 0x2fdb76fc, +- 0x7a3f0f29, 0x790a171d, 0x7287eabc, 0x365fa188, 0xe430f54d, 0x1e2a1fcb, +- 0x0164abb2, 0x0edc29cb, 0x624fc793, 0xcaf588a6, 0xdda89329, 0xf18f6834, +- 0x096569c5, 0x74ebd22a, 0x70a0dad6, 0x2e78e03f, 0x318f2fcc, 0x2cb75e5d, +- 0x9faac7e0, 0xf0bb72ab, 0x7b4b592a, 0xf745da01, 0x9dbca72c, 0x3ad30d86, +- 0x05e9be70, 0xa193dbeb, 0xdf39fbde, 0xe3cc5677, 0xcb760372, 0x8cdfbcba, +- 0x9e470095, 0x30f4fb5f, 0xbdae83d0, 0x43365746, 0x847682a5, 0xaefae131, +- 0xecbf983c, 0x2c1bfae0, 0x4637365c, 0x5d17ba3c, 0xfb6bfc09, 0x4b9c1f63, +- 0x1c6d94f8, 0xb54bacef, 0x89f7c6de, 0x84fe8de8, 0x6d81eaf1, 0xbebd1f31, +- 0x7de20a42, 0x7b777b4a, 0x1afb8a96, 0x96d94fbd, 0xb8795dae, 0xca4675fe, +- 0x2bc68f0f, 0xb9b711d8, 0xa4d6ce91, 0xa73c3d50, 0xe8cc6f7c, 0x8a47eee9, +- 0xe3f7eb05, 0xca3fdaeb, 0xbe78bb82, 0x7a79fea9, 0x059bc94a, 0x500714a5, +- 0xebeb36f9, 0xf7ea36f3, 0x283a6315, 0x1654d3c7, 0xfdbfb90c, 0x394b4e7e, +- 0xbd6cc158, 0xbba355f7, 0xe5b17ecc, 0xce421bfc, 0xd3282667, 0xa7ce500a, +- 0xf3fec91a, 0x23531aa6, 0x8329defd, 0xf09cfeb9, 0x37e48d92, 0xf74ac0fb, +- 0x3850d4d6, 0x49c4ed01, 0x3ec9185f, 0xd1d4e37f, 0x3941a787, 0x9b4b37f9, +- 0x0ce4ddb0, 0x86ed0e78, 0xc47d74be, 0x84b7649d, 0x5f5f910b, 0xed93a166, +- 0x4c3b1fa8, 0x2da7bdf4, 0x26536c9f, 0x4cabfee1, 0x6d29dcc5, 0xdc6215dc, +- 0x5e029b5f, 0x996ea792, 0x51e7e41d, 0xf6d2bfd7, 0x2865c789, 0xf036577f, +- 0xbad57bb5, 0x9997d23a, 0xf142cc45, 0xd22af0ee, 0x19e31bc7, 0xa56ccbf2, +- 0xcf08bbf5, 0x4664ecbe, 0xeab66fe8, 0xf3c62d32, 0xce676119, 0x44d35451, +- 0x3f95552c, 0x73e7f2b7, 0x9f3d0f15, 0x73f87aab, 0x6feff71b, 0x3f610253, +- 0x2d9b77f4, 0xddfd85d9, 0xfd797aa6, 0x9fd50b35, 0x172fff02, 0x171ac158, +- 0xb7ae5050, 0xf3f2345c, 0xd13c5f2f, 0xa4ada37b, 0x2bf385c3, 0x36fdd235, +- 0x3ee893b0, 0x4bc54ef2, 0x32f791f7, 0xf822065f, 0x64d9d2e5, 0x629cbf47, +- 0x2f4b7ba4, 0xbf0c8c7b, 0x91a81403, 0x41423df9, 0x67572f47, 0x3654f9d2, +- 0xebf71322, 0x43b256bb, 0x0fa0f11a, 0xe7f757db, 0xf6e642fa, 0x2951bec3, +- 0x6161ded4, 0x074895c9, 0x3bca6587, 0x1e78e1ff, 0x650f943f, 0x735ed107, +- 0x5df9e8d6, 0xe9c49d2e, 0xf20a6541, 0x25550cc1, 0xcddfafba, 0xf88ba354, +- 0x7d87de9e, 0x2cee75a5, 0x1fa2bb7d, 0x55546bc2, 0x93a18ce2, 0x6fa5f517, +- 0x8cf83c73, 0xb3be4794, 0x9befbc54, 0xd7c70874, 0xe0b07cf8, 0xf4ae4d4f, +- 0xf52a4396, 0xa49a4f63, 0x306800ee, 0xbffc800c, 0x51cf0ccf, 0x74cb242e, +- 0xa9706adf, 0xf586521c, 0xe8867df0, 0x4fe0b077, 0xcf9e88f9, 0xe1e90ef2, +- 0xeeff0447, 0x1fb92163, 0xe8c2dbf6, 0x8b406a5c, 0x3e781dbe, 0xd1639406, +- 0x22abfc7c, 0xd48f1683, 0x9e17a1e1, 0xd9d7b17d, 0x5c40aeb3, 0xc8cbad3e, +- 0x5de425d7, 0x3d2b6dae, 0xd56455cf, 0x2d62f385, 0x07fae36f, 0x40c1921c, +- 0x352afd85, 0x7801cece, 0x71264046, 0x49859337, 0xbadd7c5e, 0x2b5c451b, +- 0xebd19d7a, 0x44b065bb, 0xf1cccbeb, 0xca6ec979, 0x326ec990, 0x18c2006d, +- 0xbdb0d78e, 0xa3716e3b, 0xd4fb3b3d, 0xe6439060, 0x182b567b, 0xe4233e0f, +- 0x892be992, 0x56fdd7d3, 0xda5357a2, 0xfbc8828c, 0x4f86972a, 0xf318333a, +- 0x7ababfbd, 0x4f8f1072, 0xe5a3fe11, 0x7f455fdc, 0xf9f53a63, 0xc62ee386, +- 0xe9c7e547, 0x5c270df3, 0x1f951feb, 0x1f951397, 0x3f574437, 0x95111959, +- 0x2a2e371f, 0x075cae3f, 0xae982f4f, 0x9d533f6b, 0x2d6f83a3, 0x7daeaefb, +- 0x5d4ee795, 0xbbca9cfd, 0x79b7f574, 0xf3c1d6ef, 0xb5d7efab, 0xd7abe05f, +- 0xe5777fd5, 0x20f5740f, 0x8bc6622f, 0xf74a3c31, 0x613dd386, 0x3016a0fa, +- 0x3d8637bc, 0x57722920, 0xf471fea4, 0x1e4c5fe1, 0x71e3f7c2, 0x3b093fcd, +- 0xc4591c78, 0x838b595f, 0x7c5ab1e2, 0x9a763436, 0xb722fd15, 0xbd434d45, +- 0xf5cb7ece, 0x74380b06, 0xdf89cb71, 0x1b76a4ab, 0xfce9b292, 0xb3b051e3, +- 0xef30f97d, 0xe927cf20, 0x1c6b001f, 0x500ddbe3, 0xd7febb42, 0x2237cccc, +- 0x9e2c1e62, 0x3cb585c7, 0xe64f3107, 0x8bf3e049, 0x61f7cfe3, 0xfd1f313c, +- 0x0f952b38, 0x4173b53a, 0xf6bf6195, 0xf2807332, 0xed834b11, 0x036f9866, +- 0xc51447c8, 0xc74e5e12, 0xbd4db838, 0x7aaa3de1, 0xb3dd3a7f, 0x050d2db1, +- 0x3aa5d04c, 0x3d1fd1e4, 0x7cdbef02, 0xe314e28c, 0x11ffec87, 0x433ce1c6, +- 0xbb3f345c, 0xf7bcf1cc, 0x74b97ff6, 0x9265e518, 0x45f5ee93, 0xb1dda7d7, +- 0x6e37f3f9, 0xd177bf50, 0x765bdef7, 0xdf6ff7a3, 0xa231b674, 0xcbf9afbe, +- 0x13ccfeb6, 0x66590741, 0xad55fdfd, 0xfae10ef4, 0x3358dd7d, 0x49272fc5, +- 0x604399be, 0xfec6cfbc, 0xe1db7bf5, 0xbe2b4fbd, 0x3bfd1db8, 0xe7c5ee78, +- 0xfaf08ed0, 0x2c95e669, 0x04399e7c, 0xb3d47fec, 0xbe662c71, 0xadd05f9c, +- 0x45d3569c, 0x99aa79fe, 0x6b4e43e2, 0xb0f3fce7, 0xf1516def, 0xcbf46682, +- 0x447baf01, 0x8f8b447c, 0x59fa2ddf, 0xe9494a21, 0x660e73a4, 0x527dd00d, +- 0xc5ec5ecd, 0x86328e0f, 0x936ca37e, 0xc5ca442f, 0xc53354f6, 0x4cc52407, +- 0x3292e779, 0x2823be8a, 0xe78fa381, 0x985b7637, 0xd4f68cfc, 0x900f1451, +- 0xce286342, 0xa885b360, 0x2fb6bf3f, 0x77dfdeaa, 0xbcd3cf5a, 0x759feefa, +- 0xc7704f3f, 0x1e6a2718, 0x47d61e38, 0xccc0738f, 0xdcb9dfb8, 0xf1be331a, +- 0x0d8990e2, 0x5f915243, 0x82dd773b, 0xd8bbfafc, 0x312b5972, 0x81183e8f, +- 0x6486879f, 0xfe605d13, 0x5c62307c, 0x848f97cc, 0xdee80281, 0x6aa0c104, +- 0x71425a06, 0xa13c7083, 0x6acd9a07, 0xa087d93a, 0xf71f70fe, 0x0a7e7e09, +- 0x51fc8d68, 0x03ef87e1, 0x51f2c63e, 0xda7642bf, 0x843fe07e, 0xa8bbf09f, +- 0xa80bfa0c, 0xa957e83c, 0x8cbf90fe, 0x1efd27e0, 0x2bf88f82, 0xefda7ca9, +- 0xf8cfe7a5, 0x85fe09ab, 0xab6547df, 0x7f3d257f, 0xf0475fce, 0x044dfe0b, +- 0x42ed12ff, 0x9a27cf19, 0xdfd97ca8, 0xf8aff542, 0x9afc11f7, 0xc865483f, +- 0x1f9e847f, 0x7c12b7f5, 0xf046dfdc, 0xe0887f09, 0x95077f0e, 0xf4c3fa6f, +- 0x5dff94fc, 0x2758afde, 0xfc672278, 0x45b49780, 0x79da1746, 0xcc968b69, +- 0x6f7800ae, 0x6df74cb5, 0x4be40b9d, 0x1e2e8007, 0xf7f26555, 0x5234aef6, +- 0x2bb347dc, 0x486cd6f7, 0xb9faa72a, 0x1592df54, 0xbed9764f, 0x77ba66a5, +- 0xedc55b6d, 0x46ccb659, 0x32c56ded, 0x72ba3fd5, 0xcd8dd92e, 0xae300538, +- 0x07818c32, 0x25bb6326, 0xfbdf9246, 0xefbae2a2, 0x6f79fd89, 0x45efcc88, +- 0x2253891d, 0x5b6b21cf, 0xbaf07493, 0x7ce50cb6, 0x25dcdd04, 0x989b61c6, +- 0xc49df91c, 0x33bdf64f, 0x79d602af, 0x0f7be497, 0xfba7c8e5, 0x3403cdcf, +- 0xcbb5a331, 0xc8e4fc8c, 0xbea7ad89, 0x4b3fe4d4, 0xdbf8893f, 0xbf84caab, +- 0x69c6eabd, 0x2c5fe8b9, 0x137be992, 0xcfe48b69, 0xbfe99fd1, 0x997ba640, +- 0xc53255b6, 0xa322d903, 0x5a46c7c0, 0x7305ff77, 0xe9b95ea9, 0x9dd1c514, +- 0x27878eab, 0xf802dda3, 0x387da3ca, 0x4fdf8494, 0xd77110ca, 0x94f1297d, +- 0x9f3d1637, 0xf8bbff2f, 0x19f80cd9, 0x5f3f1315, 0xa3cfc2c6, 0x7f75fee2, +- 0x68857df1, 0x31df693c, 0xcf7c547d, 0xc791b03b, 0xa5dba3ef, 0xe62ab888, +- 0x4ff7d174, 0x1f92656a, 0x81f059fb, 0xc59d807c, 0x7de3dd32, 0xb3ead264, +- 0x733e6007, 0x114a7c8a, 0xc855039e, 0x26c65147, 0x6ffef257, 0x893f235a, +- 0xbaf40574, 0xb76849ea, 0x99fa617d, 0x05fb287c, 0x7f18ed5c, 0x9fde8fb5, +- 0x8df313e1, 0xc5b217a5, 0x447bf63c, 0x81e614fc, 0xaadb3b71, 0xf9c785dd, +- 0x504559b8, 0x657accef, 0x77fd5e2a, 0x9832edcd, 0x2c5feca0, 0x2cf1c7af, +- 0x893f4ddf, 0x3c06a5e3, 0x38c578da, 0x53c537de, 0x69157dd6, 0xf75deeb1, +- 0x4ebf0f25, 0x12288e0e, 0xb00674f7, 0x1f072801, 0x9c527531, 0xcb86703a, +- 0xd326a641, 0x71e8b87d, 0x98fbcafa, 0x6193f028, 0xd10de7e1, 0xf6eb4def, +- 0xee54025b, 0xa2aff4f7, 0xb2c9a83c, 0x233d0ef8, 0xc4c37b7f, 0x0dcb6578, +- 0x421e63ce, 0x36840bf9, 0x7e8988be, 0x7ef2a732, 0x9b9fbc8c, 0x27827ad9, +- 0x0dc094da, 0x8b7601ce, 0x5157507e, 0x95c2c45e, 0x3de11abb, 0xca265bfb, +- 0xbe4bb355, 0x7e77245d, 0xe47f912b, 0x3aacb634, 0x62dfd116, 0x1ced1eb1, +- 0x8a35f302, 0x88f39ee4, 0x91f01af4, 0xbdadf022, 0xd1c450b7, 0x6f7ebb1f, +- 0x1445e512, 0xfb438c6f, 0x12b32f6f, 0x214cd81d, 0x7f0238a5, 0x0eff0336, +- 0xebfcf44e, 0x1e5acc8b, 0x28e26d80, 0xfc64473c, 0x51ca30be, 0x3eabf798, +- 0xd1deff07, 0x0fa677a2, 0x17fc7807, 0x383f9d32, 0x7bf3c597, 0x52367fd0, +- 0x226bcf7e, 0xb59df85e, 0x2c3f7415, 0x4ff44b1d, 0x78054fd1, 0x86a666fc, +- 0x8d9f7df0, 0xaf9bc1fc, 0xed22e7c9, 0xec152412, 0x4645dc6f, 0x5d71e5f1, +- 0xd83eeeb2, 0xf6fa8b98, 0xfa12ffb0, 0xfa9de9b5, 0xfe426976, 0xe8da473b, +- 0x1f769d1e, 0xdee5f9cf, 0x13d272c2, 0x1fff24f1, 0xe7e26553, 0x076d4ac7, +- 0x2b76ddb0, 0xa27e84bb, 0x4155817d, 0x8ceed039, 0x1b6ab927, 0xf3f64f11, +- 0xd6a3ccf6, 0x659fc04e, 0xda0a3be4, 0xbe2d032b, 0x7ebb1803, 0xbcc668b4, +- 0xc72431f4, 0x5c03be7b, 0x2f077a06, 0x733c1037, 0xbda6920f, 0xe9df48d8, +- 0x63345fda, 0xb68c804f, 0x5b979a16, 0x7cf30652, 0x35786ec0, 0x9c760dda, +- 0x63b418fb, 0xd0e01ea0, 0x9401df70, 0x7529e947, 0xcd5748ed, 0x292ba3b6, +- 0x429a5d0e, 0xabe4d572, 0x689ca10b, 0x91ac4b56, 0xc9f1adfc, 0x1afbe5b7, +- 0x3afef711, 0x7ebafffe, 0x4df3e2fb, 0xfaef9c85, 0x7e68038a, 0x9a7f747e, +- 0x60c6ff5f, 0x90a37efe, 0xe6b381e7, 0x70bf7298, 0x65279728, 0x5661ef22, +- 0xaf7d254a, 0x53a0567d, 0xa1d3fca6, 0x9bd80fdc, 0x867ca76a, 0xc2166ebd, +- 0x016079f8, 0x2ba40fd7, 0x29b29e88, 0x086cd54e, 0x3c1c812b, 0x70b90d0f, +- 0x97e09c5f, 0xd17bffe1, 0xa418d0bc, 0x7d05d8ef, 0x393df871, 0x17e747e8, +- 0xc57b4ad8, 0xd77ec9ab, 0x1f78d0e2, 0x439bbf1f, 0xa09820ae, 0x7d236af6, +- 0xbdfa261f, 0xf0f4bb9b, 0x787a6b84, 0xe77fd322, 0x87aadca5, 0xf87a2b27, +- 0x6e472153, 0x9f3fd749, 0xfdc3d2ea, 0x338c1c17, 0x1415fbf2, 0x828ed2af, +- 0xc60ef7e1, 0x200806c5, 0xfca16a47, 0x6b9d01a0, 0x3f341e48, 0xbff88338, +- 0x7c7d1aff, 0x6dd59d38, 0x9c603649, 0x59dcff5a, 0xefd68674, 0x073fd1ac, +- 0xfc60e83c, 0x7dd209ec, 0x3c9f70c5, 0x387fe614, 0xe657e79f, 0x7869de48, +- 0x5a0263e4, 0xfdf915bb, 0xdb8fbe76, 0xfe0b5f64, 0x4adb16bf, 0xa0af2853, +- 0xb5f7c2cc, 0xf77c58ab, 0xdf8525a6, 0xbcb35edb, 0xa67f0dc9, 0xfba6cc8d, +- 0xfedd6dd8, 0x2be48fb5, 0xe291be3b, 0x646b7bff, 0x8676aefa, 0x85eb4035, +- 0xc5d15c75, 0x5cba34a9, 0x6049cfc0, 0x587aba3d, 0x3d3d15cf, 0xa874443c, +- 0x31f90bad, 0xe45eb110, 0xfb4440c3, 0x72fb86f7, 0x8fc8dd71, 0x72e3cf91, +- 0x0f744d3b, 0x2fa7ac59, 0x42e4d4be, 0xd68f3899, 0x10bed2f2, 0x69796a63, +- 0x695e451b, 0x878f439b, 0x5127aa2f, 0xf08be11c, 0x0c5f789c, 0x0fbe453e, +- 0xc7be73e4, 0x87bc3b72, 0xfae7bd7c, 0x1e38a9e2, 0xc44081ca, 0x084e1bf7, +- 0xed87fc3a, 0xbb2896ca, 0x3fbfecfb, 0xaec8cf59, 0xeb0a1cac, 0x8e781dac, +- 0xdf174fdf, 0xf4213ab7, 0xe9c094be, 0xebbcafa6, 0x56bc9efa, 0x8a5bae2b, +- 0x12bbe3ca, 0x020daf85, 0x57fbda5f, 0xd3c26c94, 0x6b728e95, 0x4262785f, +- 0x1f21323e, 0xb32a7bf1, 0x4c6ecfca, 0x3a5b1955, 0xf879b9f4, 0x7759887d, +- 0x02cd2d9d, 0xd7d0f378, 0xb3d3fc38, 0xa6800c2f, 0x2dfcfd1f, 0xf67c3f0e, +- 0xf9154c8b, 0xe1e73ff2, 0xe21c23f7, 0xaf9b45dc, 0xa1fade36, 0xb758dedc, +- 0x238f1ce9, 0xbf3a5ec8, 0xc97a77ac, 0xa52cffcf, 0x07e781cb, 0x9cbb52eb, +- 0xd7206e4b, 0x40ba6dd7, 0xe9860c71, 0x5f30a351, 0x9f129188, 0x57c7e5ad, +- 0x1de3f3ea, 0xd7c4d58e, 0x50501616, 0x3d59c5de, 0x7d7e7e74, 0x73e68ba8, +- 0xf9ab531b, 0x0f2bb9f9, 0x5dd667f7, 0x5ff69886, 0x8f9150e3, 0x68df42ca, +- 0xf2f2265c, 0x768994e7, 0x7117f8ca, 0x9e8cdb9c, 0xfffbd446, 0x2a51663a, +- 0xbf2d098a, 0x3dcf4869, 0xe6df43b7, 0x0face4fe, 0x24575c0c, 0x53f178f2, +- 0xcf345dc3, 0xea0038c8, 0xe5f6be85, 0x3d53d088, 0x38a1e2fb, 0x87b27d67, +- 0xe5d28bef, 0x92fb82d8, 0x5adce5d4, 0x7bfaf7d4, 0x3e144fed, 0xcd32875a, +- 0x7e90967e, 0xda7f0ebf, 0x607968fe, 0x1e5706f5, 0x87172bd9, 0x609fe2e8, +- 0xf6bcbbe8, 0x718df4d8, 0xa7360d4a, 0x648e297b, 0x300b514a, 0xeffeb84f, +- 0xe9bccc52, 0xb74e8273, 0xbee9e238, 0x4cc3bd75, 0x1ddabdf7, 0x61da183b, +- 0xc236db56, 0x89a3854b, 0x835c9e61, 0xb7d2b59b, 0x82f2a20f, 0x790bec1b, +- 0x659f2a7d, 0x8e4d54c3, 0xc6d67e71, 0xdc94aabb, 0x772a2e30, 0xa3affff2, +- 0xf2477aaf, 0xec1f9e34, 0xb07e5330, 0x8bae6894, 0x26dc1f95, 0x5c768dec, +- 0x83ae0a57, 0xf5b4c9c7, 0xaf3c5d58, 0x9c639f11, 0xd1f2eccc, 0xada2e3ff, +- 0x87ec4dbb, 0xaae2ded6, 0x25ef2863, 0xf942eab3, 0xff73c52a, 0x4147f51d, +- 0xc6d49c84, 0x89a87e7f, 0xae1b0bdf, 0x2b35fcf0, 0x7eb317d7, 0x7f19886b, +- 0xf3543abf, 0xbf19beb7, 0xdb32f469, 0x3461f3c8, 0x336b9ebe, 0x981ed07b, +- 0x7ca74b6b, 0x8040b99d, 0xda239317, 0xbf3e677f, 0xe9ab29bf, 0x1bbf4748, +- 0xdfc5e137, 0x4c36f801, 0xf6f4f117, 0x6bdd1354, 0x3cc0db7a, 0xe74652e8, +- 0x49bd7a23, 0xb79a7193, 0x80db38ce, 0x31d8786c, 0xcbe504be, 0x13728ee1, +- 0x3b0067de, 0xca186e21, 0x46eea599, 0xbf30efbc, 0x7fbe98a6, 0xd77fc5a2, +- 0x49303d09, 0xddb039f2, 0x9a3f6367, 0xde6c4155, 0x7fdf4595, 0x88dff114, +- 0xbb44fd76, 0xaca26ed3, 0xc03efa2e, 0x45e8e515, 0x83f68b9f, 0xf1a21af2, +- 0xf912fb89, 0x72698bff, 0x8b3bf502, 0xe123b3b2, 0x949d89ed, 0xa9e9af6f, +- 0xcdf23ea6, 0xf2130db6, 0x714fe351, 0x7cc7109e, 0x6493c456, 0xf37b72f0, +- 0x3f4fd3c8, 0x37b1eced, 0xa43d0877, 0xd05093f5, 0x2209954a, 0x78a0c4ef, +- 0x2564fe88, 0x75801e90, 0xfb197d36, 0x61dcf89e, 0x716d8e5c, 0xf6c74b6f, +- 0x3a6ab915, 0x79d14bfa, 0x51eef5de, 0xf57fc8e9, 0xaafd3553, 0xaff9235a, +- 0x7bff9ddd, 0x75b42f3c, 0xb9e45898, 0xc669747c, 0xe41bb573, 0xfdc59bed, +- 0xc7476dc8, 0xbcbe3158, 0xc61256cd, 0xb66dd9f3, 0xbb721294, 0x478f3c6c, +- 0xf1b36f6b, 0xca9b3abc, 0x1b36d5e3, 0xf2d37bcf, 0x27ddda6f, 0xbb5a0f08, +- 0xfef8c3e1, 0xff7e54d9, 0x520d5e21, 0x1bd938bb, 0xb8acbcc0, 0x66f64614, +- 0xc77f959c, 0xc8c0a12f, 0xf9fc31ac, 0xea266182, 0x49665b67, 0x9b54ec98, +- 0xd87642ec, 0x4e925e96, 0x0df11272, 0xbbdbd6e3, 0x19f745f1, 0x6b7c0856, +- 0xf3b7d4fd, 0xa9bede75, 0x08c56e72, 0x8bbd13b4, 0xd9b74e90, 0xbf315896, +- 0xde97b254, 0xc3f5bfb0, 0xca7cba0c, 0x7994fe9e, 0xd815bfa2, 0x512f649f, +- 0x8b133fb0, 0xfa0cfffd, 0xbbfebcc5, 0x819815e7, 0x60e3df46, 0x9e4fbb4c, +- 0x68cf4b1e, 0x439c55a5, 0x0ff7bf44, 0xfacd95db, 0x93d82578, 0x75830d0f, +- 0x3b9e66d5, 0x709e9131, 0x5e31b27b, 0xd849177c, 0xdbc2b285, 0x3df91a37, +- 0x637bed4d, 0x27289d9a, 0x73d0f1e9, 0xc3ef8a7f, 0x31c78555, 0xc518daae, +- 0xf9f9a257, 0xba63a9ea, 0x67a8107b, 0xc6dec23d, 0x8f48ed12, 0x3895cf19, +- 0x8efc6b5f, 0x3f28ba77, 0xf77f9aaa, 0x2918a6c4, 0xf400c25f, 0xddad744b, +- 0x8a4af9df, 0x115d7f69, 0xab486afb, 0x6dbf8951, 0xa32c42a1, 0xf3bf7bf9, +- 0xf3f22154, 0xfadd69fe, 0x6d75c156, 0xf7e5ca48, 0x564e4f17, 0x5fc3d962, +- 0x71c25f77, 0xa4ddc76e, 0xcf5c9d67, 0x3fbebffe, 0xaf34e8d1, 0x66debd44, +- 0x97f7fbd0, 0x50fddc85, 0x9afd8ff0, 0xdbbcf74c, 0x22ef7c8b, 0xde8c98bd, +- 0xfb07d46a, 0xbf9366eb, 0x501e0324, 0x30dfeeef, 0xc0af2a2d, 0x08b0fef7, +- 0x326b2e7e, 0x1aa677d3, 0xbf208fc0, 0xa31f6a2e, 0xb7eda7f1, 0xf9abdb06, +- 0xbfb69a39, 0x216cd313, 0x764bb791, 0xb9653387, 0xb398e501, 0xd9f067da, +- 0xec987db1, 0xfddabe8d, 0xad3bc84c, 0xb7fb0dbd, 0x3c4afce1, 0x8c4c7bfc, +- 0x6b24aef2, 0xec7fffec, 0x810f0a30, 0xcbac2b1f, 0x82aa7471, 0xeec24afd, +- 0xe8f9146d, 0xd5a94af5, 0x94bef113, 0x149d6a54, 0x7df52f41, 0x874a87c4, +- 0x942bdb77, 0xfce5a7e7, 0x60af684b, 0xbe4d9f5e, 0x20471ddc, 0x675e20ff, +- 0x47e36a2f, 0x9cf7bb9f, 0xbe3a73b3, 0xbd9294aa, 0xbb018f28, 0x4307ec00, +- 0x489bd2d2, 0x3f7c9a3f, 0x743c034e, 0xfca167bd, 0x3f05f7db, 0xec7e0a76, +- 0xd8056e4b, 0xb7dcba51, 0x4bc71d95, 0x2527401e, 0xf5274889, 0x39dd4699, +- 0x8b16568c, 0x5fb0c675, 0xfc8f87f2, 0x90cbf646, 0x17ec31e1, 0xcf224fb4, +- 0xf12ed1cf, 0xb445c844, 0xec313c4b, 0xf0a36697, 0xe779c4df, 0xadab9369, +- 0xfa70f013, 0xcefa44e6, 0xdbb469cd, 0xfb3ec04a, 0xdc5cd9e9, 0xee865994, +- 0x3b0853ef, 0x760c1191, 0x5e7077da, 0x1abbcc55, 0x1cd6ffff, 0x883f1bc9, +- 0xffd197e7, 0xfb75f2ab, 0x40b80719, 0xfbc76cbc, 0x1f744570, 0xf9d632ae, +- 0xe9baf7da, 0x88974504, 0x601e11c3, 0x5be22217, 0x5176e2bd, 0xa30c3a71, +- 0xe6fde774, 0xfdbf6ef4, 0xdae281ba, 0x882c7d3b, 0xb5bfb9df, 0x7b571f4c, +- 0xed99e443, 0xcf88ca5c, 0x86b41676, 0x53495fd0, 0xabc9c519, 0x73f6fa3c, +- 0xe3bfa32a, 0xddbf8fac, 0xcf4535e6, 0xd6ebbe97, 0xc06fac5f, 0x9714d5ee, +- 0x8b8f15eb, 0xfad1c38a, 0xf2943f50, 0x46adbc78, 0x6f655f9f, 0x7ddf419e, +- 0x12aeac66, 0x34cce7d7, 0xda8f8c32, 0xcff3a3ab, 0x1ecf0202, 0x9e1a5a12, +- 0xd878efb5, 0x7bfc8d8a, 0x540981a4, 0xe1c1e5af, 0x3a2705f7, 0x5b65d67b, +- 0x2c53e62f, 0xd881ace2, 0xf189daeb, 0x2e57cc46, 0x83c4830a, 0x302e70fe, +- 0xa30d464e, 0xbac299ef, 0x8705e775, 0xd0356f77, 0x03e147ff, 0x3c26ed71, +- 0x9813cfe8, 0x5afb40cf, 0x807f3fa3, 0x68e0ea75, 0xecebfebb, 0xb3bbc3f9, +- 0x58ff7e63, 0x5038b52b, 0x7610f8af, 0x383a4800, 0x6ca77c5c, 0xf68a1b28, +- 0x2378ad8d, 0x4c95c3ed, 0x0acaf79e, 0xa1bb9f62, 0x0ddf8f9d, 0x327c8a9a, +- 0xa679fd12, 0xf302cefb, 0x6f9f94c8, 0x3573e328, 0xa672f3f4, 0xd7c4622b, +- 0xb1307896, 0xbcfff04a, 0x1fa0f78a, 0x8c00b167, 0xdf1063df, 0xbdc4969f, +- 0x26062da4, 0xd514cc23, 0xb5e4f3ca, 0xe9043cef, 0x8d7d0f3b, 0x8b077da3, +- 0xda7bf805, 0x37dfd138, 0x74fbd1ba, 0x7e894d1f, 0x3ae282bf, 0xe17df8da, +- 0x17efafbd, 0x9dfcb1fd, 0x953e3c91, 0xc35a7449, 0xeba71fb4, 0x2b74ddc5, +- 0x53b83c93, 0x0f0f4eab, 0x773e7e45, 0xf74a824f, 0x0475b56f, 0x8eb44ba6, +- 0xf75fd96f, 0x595dd23c, 0x5881defc, 0xdbefe897, 0x117e8bae, 0x9301acf2, +- 0x1a8e816f, 0xcf91ef81, 0x2e93296c, 0xa10e74c9, 0xbf8bcfbf, 0x35fd1173, +- 0xf9493d1c, 0xbdc47b3b, 0xa75c6d70, 0x8a0433ea, 0x3c107ef0, 0xd08f118f, +- 0xdf8ca5ca, 0xf5e6d28f, 0x3504017f, 0x7fe05f6a, 0x00007fe0 ++ 0x00088b1f, 0x00000000, 0x7de5ff00, 0xd554780b, 0xb3dae8b9, 0x24999ef7, ++ 0x42499333, 0x49af0842, 0x701a8802, 0xb15e1008, 0x9441024c, 0x420a03a8, ++ 0x84089c45, 0xd112f210, 0x03b39f43, 0x4f6950f2, 0x0f52d62c, 0x89e0a0ea, ++ 0x0201b41e, 0x60e8188d, 0xda2d43c0, 0x3eb01160, 0xd5e4013a, 0xd1500c90, ++ 0xd77af4b6, 0x67b5afff, 0x4899def6, 0xedce78f4, 0xfcfc77bd, 0xf7af6b16, ++ 0xfaff5eff, 0x4e648ad7, 0x21226425, 0xa68fc25f, 0xc8424407, 0x59da68e8, ++ 0x8451d348, 0x81ac9728, 0xc121022d, 0x4d3f7fbd, 0xa172117a, 0x92cba671, ++ 0x25c14849, 0xe422706b, 0x0b010503, 0xf3b49f2d, 0xeb44877d, 0x2514ee57, ++ 0x8ded3728, 0x1b1df6c3, 0xabe40085, 0x9d3fad2d, 0x9de1f340, 0x76817922, ++ 0x1336824d, 0xb4e42349, 0xcb9fb095, 0x38d2f98e, 0xb4dcad96, 0x578c1e6f, ++ 0x712164d6, 0x46e9fdb4, 0xa5f903d1, 0xa100845b, 0xbebe55e3, 0xfb419cc6, ++ 0x1a10145b, 0xbf345ce2, 0xcbb349e5, 0xbd8ac84e, 0x36423a1f, 0xadfbce42, ++ 0x75c665c4, 0x10e43594, 0x36d81e52, 0x2fb68325, 0x4db82adf, 0x8df2ffb4, ++ 0x7e603b17, 0x60f28de5, 0xa4b7f691, 0x86b8813e, 0x24bfb1b2, 0x49cb5e30, ++ 0x3ca76f1c, 0xbb2bc608, 0x889990fa, 0x03d94eb0, 0x3ce92aed, 0xb8eadd60, ++ 0x701bfde7, 0x959e153c, 0x68f1d32f, 0x04d7aabd, 0xcab12c37, 0x8f307c44, ++ 0x66e3d78e, 0xf58368bf, 0xd8879ad5, 0xd928ebb5, 0x0f28eb05, 0xb14f326c, ++ 0x9936fcc1, 0xfda2734b, 0x37ffa92d, 0x6436fcfd, 0xca69f6f7, 0x3f79e98d, ++ 0x6890e905, 0x4f109cbe, 0x4897ed03, 0x61f4f301, 0x091fefd1, 0x25ef8849, ++ 0x597122f5, 0xcc53fda3, 0x44494213, 0x93fe9f79, 0x63d941c2, 0x8cc96c0f, ++ 0x13a96de2, 0xdbc51670, 0xa3c72725, 0xf6d3ce14, 0x053fa6af, 0xd4f9d07c, ++ 0xfe989df9, 0xe98e9fcc, 0xc2177e53, 0x50ff69ed, 0xddf8374c, 0xff19fdf8, ++ 0xfa374c58, 0xe73e983d, 0xc0698a9f, 0x2f7ac5ef, 0xba6367f8, 0xefc3efd9, ++ 0x30cbf92f, 0xe0d7f7ad, 0xcbfc57f7, 0x57eadd31, 0xfe6bfbf0, 0xf83698b5, ++ 0x0edd30eb, 0xa369a2f8, 0x76f5803f, 0x6d31ebf9, 0xf7e037f2, 0x4c26fedd, ++ 0x3a3871d7, 0x448149f2, 0x10f0e0e1, 0x493b4527, 0xc814f62e, 0x65ec9f34, ++ 0x4ab9b4f9, 0xd3e69981, 0xe14f347c, 0x2c115192, 0x467cd0b0, 0xf01f2b0d, ++ 0xa5685243, 0x2b0a01f9, 0x29e75acf, 0xacf9a38c, 0x643e563a, 0x4f1852a3, ++ 0xac0243f3, 0xc1ad86fc, 0xbf9a04c2, 0x0f9581a1, 0x6c93266f, 0xc83c3f34, ++ 0x3c87b9f2, 0x9f34ec93, 0x79f2cadb, 0x1c93291f, 0x62179f34, 0x07b7c7ed, ++ 0x2bad9744, 0xaecbb61e, 0x6ae284f9, 0x47ab72a3, 0x66f3471a, 0x4dc443d7, ++ 0xf0cca3e1, 0x3c287d48, 0x07960f64, 0xbcb17b95, 0xf2c1ecd1, 0x980594f7, ++ 0xb0fb25df, 0xc95294fc, 0x961f66f2, 0xc11e515f, 0x60ac937c, 0xcfd6b5b9, ++ 0xcb0566f2, 0x62d76a33, 0x00e5bbff, 0x3ed4e796, 0xcdbbe589, 0xd9ff2c01, ++ 0x2678cfa3, 0xc14afcd3, 0x23d034f7, 0x3648cb4d, 0xba4353d0, 0x6ad3d297, ++ 0xfa06cc81, 0x1d1031fd, 0x7dd5cba5, 0xdb87c8cc, 0x117bc9df, 0xbd7f17f8, ++ 0xd2fa5f20, 0xfed899e3, 0xa647ec79, 0xeed788fd, 0xb1ddf727, 0xdf727eba, ++ 0xa9fb532d, 0xe32b7a87, 0xf6cfd67a, 0xe7ebc777, 0xdab96ef3, 0x8f9c36cf, ++ 0xcaeb67bd, 0x7ebe7dfd, 0x50afbf3e, 0xf38dd9fb, 0x7cd9ea49, 0xc3d7df1a, ++ 0x08fdf1a7, 0x3e705a7c, 0xcf9b3da9, 0xf87aa3a8, 0x811a3a8c, 0xa7ec21cf, ++ 0x69facf4f, 0x4f87aa3c, 0x7c08d1e3, 0xf575c7de, 0x46bad9ef, 0x67c3d31d, ++ 0x7c08b1d4, 0x64f9c13e, 0x5d9facf6, 0xb3e1eb1f, 0x7c08e3eb, 0x833f60ce, ++ 0xbcaeb67b, 0xc9f0f44f, 0x9f0224fb, 0x7d73f630, 0xf5d9facf, 0xbb3e1e89, ++ 0xe7c0893e, 0xb0cfd8af, 0xef2bad9e, 0xe4f87a4f, 0x1f0229fd, 0x8cfd0093, ++ 0x9a7cd9e8, 0xa7c3d53e, 0x7c08d3e9, 0xd19fb012, 0xd8cf9b3d, 0x8cf87ad3, ++ 0x4f811d3d, 0x3ef0012f, 0x34fd67ae, 0xa7c3d69d, 0x3e0474e9, 0x9b9fb1fd, ++ 0xb1aeb67b, 0x19f0f467, 0x9f02267b, 0x02aeb821, 0x1f30f7ca, 0x77b1fb42, ++ 0x0beecfdf, 0xbeecf87a, 0x4dcf8110, 0xed114fd8, 0xfddafb27, 0xc3d0ef8c, ++ 0x04477c67, 0x9fb1633e, 0xcfd67b5b, 0x7c3d0eee, 0xe0447776, 0xb9f08053, ++ 0x1aeb67bd, 0xcf87a9df, 0x9f064ef8, 0x266a4791, 0xd5396839, 0x36916e85, ++ 0xf1eed099, 0x3a2f3408, 0xba745e59, 0xa225d809, 0x56906f6a, 0xdbdb488f, ++ 0x3ee526b6, 0x4776b44e, 0x975874e1, 0x5a635a9d, 0x6c7123bb, 0x49cecebc, ++ 0xf2eb24f2, 0x74335329, 0x59bd53f5, 0xb3def2ba, 0xf795d06f, 0xf2eae5f1, ++ 0xebc6cb7d, 0x29aff7ea, 0x2e07e5d4, 0x3f574dbf, 0xcba19953, 0xaefdaf67, ++ 0xbae0feae, 0xd7e57407, 0x95d7286d, 0xaa581f5f, 0xff58dfcb, 0x61fd5d7d, ++ 0xe5742b0d, 0xae3d3537, 0xfc111f2b, 0xf23f2e99, 0xfaba33e0, 0xd05f5ba3, ++ 0xfe398f95, 0x5c7cae8a, 0x3f2ebb68, 0x836eece1, 0x9e73679d, 0x45e791be, ++ 0xecc27ba0, 0xb4663efe, 0x337682f7, 0x3619cde6, 0xd9f7e3b4, 0x28a75d4b, ++ 0xce6fcd7e, 0xf8a2f577, 0xaa129c05, 0xca320bd7, 0xefd10bae, 0x5df78c8f, ++ 0x1fdfa4e7, 0x726efb31, 0x294fb0c6, 0x1d24083d, 0x52099752, 0x991af963, ++ 0xdf6163d1, 0x68da43ab, 0x78536afb, 0xf7cd1248, 0x00360b13, 0x98273efd, ++ 0x45e34e90, 0xe2f50352, 0x05f7042d, 0x5ef3326b, 0xbaf43454, 0x43e53fb6, ++ 0x5aefda21, 0x760e97d9, 0x87b50bc6, 0x5643b015, 0xcaeba7f7, 0xe145e420, ++ 0x44195070, 0x4d2ff7db, 0x2cfed1f7, 0x6ba76a66, 0xf1d337c7, 0x7afc7073, ++ 0x6eb5ff18, 0x8d64b7c6, 0x1d6f8dd5, 0xdf1ba650, 0x3be3a66a, 0xfb503da9, ++ 0x229f1f01, 0x3b213c61, 0x7c700f84, 0x1c3280cb, 0xee998d7f, 0xc7e3b457, ++ 0x026fc647, 0xe30bd97e, 0xfeb18e8f, 0xf5faf1ac, 0xafd7280f, 0xffd6ccdf, ++ 0x1f1b6d66, 0xdfd71e3f, 0xf5b1b422, 0xeb67280f, 0x237eb0b7, 0xf0223be3, ++ 0x7feb083f, 0x67f5bbb7, 0x3fd7ebe7, 0x7ebf42b0, 0xbdff1b0b, 0x7c7c73da, ++ 0x07ff8e1b, 0xff5b1ce1, 0xdf1c0ac0, 0x81b9f16c, 0xe37dcc7e, 0x7c74026b, ++ 0xa60a8fd2, 0x742e40de, 0x2687481c, 0xe426a253, 0xce164227, 0x467891e3, ++ 0x29e2576f, 0x51bca1bd, 0x50093bf0, 0xf74796c9, 0x97d69c5d, 0x83302d6c, ++ 0xba72c25c, 0xa7c8595f, 0x4449a0ba, 0x594f26fa, 0x7ce98302, 0x05449a3b, ++ 0xba9e0bf2, 0xaff20039, 0xf7ee42da, 0x04893b42, 0x3fa7fbe1, 0x7682f61f, ++ 0x6174c65d, 0xa43a7c9d, 0x3ec8b7e1, 0xad0c90aa, 0x022bf3a1, 0xcd1d1822, ++ 0x20fba09f, 0x1f17f742, 0xa1067dd1, 0x66527924, 0xf7427de3, 0xd10f904b, ++ 0x139412fd, 0x88ed8b52, 0x107f79e2, 0xa897bf9d, 0xf3ae0f3f, 0xda29641e, ++ 0xf7f8c49f, 0x00213ac4, 0x797fb8f8, 0x747e0502, 0x8a4a253e, 0x87d74f2e, ++ 0x0ab7c3f5, 0xec041781, 0x99f007c3, 0x3023fbce, 0xed9f9a5f, 0x518e6d64, ++ 0x28a1f7f4, 0x2fb6bf98, 0x9fb445c5, 0xee4788bb, 0x5ccfdb4d, 0x13132256, ++ 0x7fd0b970, 0x7ccfd029, 0x01196e99, 0xc92a4a7e, 0xe741c4e1, 0xeb275dfb, ++ 0x3e47ba7f, 0x67ccd215, 0x78f56cb6, 0x97667ce9, 0xbbff3888, 0xffcbeaa6, ++ 0x63c137b8, 0xb5d34e1a, 0x999c71eb, 0x3df97d5e, 0x39f9f5b3, 0xea9e7d3e, ++ 0xdef4193d, 0xefc665bd, 0x9d742c14, 0xa5702373, 0xbcf3a513, 0xbee1c38f, ++ 0xe1d1591a, 0x6aadb615, 0x7c143839, 0xed85d704, 0xeff5aec5, 0x97cfae5f, ++ 0xfcfcfa28, 0x39fe86b5, 0xf8e69cdd, 0x41f4013f, 0x1f4033d3, 0x38a79e14, ++ 0xaae5447d, 0x45663e9e, 0x43e8c196, 0x8969c75d, 0x46f4e0a1, 0xeb0b1f46, ++ 0x43d36212, 0x3c1e8449, 0xe952fa5a, 0x87a71e61, 0x2c3d398f, 0xaba7a0da, ++ 0x2ab02439, 0x77bfb69d, 0xd3c43edd, 0xd184a151, 0x7a540fc3, 0xc1e8e908, ++ 0x88c1e9c7, 0x1e9c79bf, 0xd18f7de6, 0x219f1183, 0x0da10f4e, 0xd5926597, ++ 0x0f14af15, 0x83c53cba, 0x334eef01, 0x47c503d0, 0x20787a4c, 0x70ba6eb2, ++ 0xcbcf9f9a, 0xd38be0ba, 0x01679603, 0x09c209d8, 0xad7767db, 0x2e84e54f, ++ 0x6c4368bf, 0x153757fc, 0xccd29ca4, 0xd6e1b2ab, 0x7a9a5394, 0xeba7ea4b, ++ 0x73038bf2, 0x6d17f574, 0x2f95d128, 0x2bac5bac, 0x41f6bf9f, 0xf944be5d, ++ 0xfdfeae9e, 0xe5756bcb, 0xa63cd5f7, 0xecb7bf2b, 0x8e7e5d49, 0xfaba97ef, ++ 0xa4deccf7, 0x7de99f2b, 0xd77e5759, 0xfcba6dd4, 0xbaebcf74, 0xd7bda6fa, ++ 0x98f409df, 0x6024547f, 0xbbf29c7f, 0xfb4fee90, 0xd67a6287, 0x38be46ef, ++ 0xe98b1fef, 0xf596a6a1, 0xcf956813, 0x0913b3c2, 0x24a59fd3, 0x2b2d9089, ++ 0xf36bb5bc, 0xd4139f41, 0x98af2fbb, 0xa3f4ab55, 0x42e4c0d2, 0x306f1738, ++ 0x4248e093, 0x7c4a5004, 0x2d18b0fc, 0xf2d10fcf, 0x8bcbee94, 0xcb314837, ++ 0xcc5243f3, 0x567fab7e, 0xc319d032, 0x67e5133f, 0xa3ec17d2, 0x1b9f6e4e, ++ 0xe2042bcb, 0x64277ed5, 0x45fff205, 0xcc2b9fae, 0x6c544e4c, 0x1c4853ef, ++ 0xa90e0f90, 0x1af1aaf9, 0x06f57328, 0xf1d6c8fa, 0x370da2f1, 0x013ce4ea, ++ 0xd02a6def, 0xf7dd48d9, 0x7413f525, 0x89f7daed, 0x902aef38, 0x7d40e321, ++ 0xa04d5b7a, 0x032d8397, 0xf3061aee, 0x81361cf4, 0x454a6abc, 0x3fddb1fb, ++ 0x0494e535, 0x7a62f478, 0xd31b3fd6, 0xa61f7ed3, 0x9865fca7, 0x60d7f09e, ++ 0xc72ff21a, 0x82bf13f4, 0xb5fe47e9, 0x5fd1fe98, 0xff71e987, 0xfa8f4c06, ++ 0xf11e9803, 0x9efa63d7, 0x56d301bf, 0x1da6137f, 0x2aa60f7e, 0x30f0a9bf, ++ 0xae59ddd2, 0xfd03cfa7, 0x5d9d057d, 0xed4bfd36, 0x3a517eda, 0x8fc57cfb, ++ 0x68fc956a, 0x2c1bc5bf, 0x74d24e9c, 0x40bff0f4, 0x7a068c87, 0x897a70b1, ++ 0x41bc5e5d, 0xfcf2cafe, 0xffb31c90, 0x7bfe17ea, 0x89b46de8, 0x94dfa3d9, ++ 0xd4f4a2de, 0xd94f40d7, 0x0ca7a2d7, 0x9e947471, 0x4c9c9b46, 0x7a7a71ff, ++ 0x6311d602, 0x180b71ff, 0xbb1aa975, 0xfcc093ce, 0x81dcfcd9, 0x9fccb45a, ++ 0x495ec7cd, 0xfda2b6eb, 0x780a1817, 0x6ff434be, 0x7f5fc043, 0x945538e9, ++ 0xcfafdd99, 0xc3dd2f48, 0xa0fb83dd, 0xa25500d2, 0xc796bb23, 0xc6b833c5, ++ 0x9254c899, 0x8363c84b, 0x903f725f, 0x24897983, 0x7b80fb43, 0xbf463dba, ++ 0xf806a6d4, 0x2bae0b5e, 0x438657ed, 0xf99fa77f, 0xa3a41e7b, 0x8eaecc4d, ++ 0xbed1116f, 0xdd17c127, 0x3e88df00, 0xc1d3b8b2, 0x6c1e1e0f, 0x107da276, ++ 0xa7e1e9b0, 0x145e7cd0, 0x18518f7e, 0xafbea2b5, 0x0df8474b, 0x4fa432ba, ++ 0x2d77e00f, 0x782d7f39, 0xf8c8103e, 0xb5e7816f, 0xe4b5e3e4, 0x5eb8f122, ++ 0xefeba26b, 0xf72c3bdc, 0xc1c81771, 0xeb9fb62c, 0xf9eade06, 0x2b3e7195, ++ 0xd16be944, 0x4a9a6771, 0x0803adc7, 0xf024e71d, 0xa97f6d0b, 0xbf263af1, ++ 0xa76fbb54, 0xbc13d025, 0xf7d4c85e, 0xbfa1b0f7, 0x745f074b, 0x696b7ec0, ++ 0x2a79c9ba, 0xb4d41e06, 0x69d321b2, 0x4d9fdad3, 0x3aa5fcfa, 0xda036a61, ++ 0xbbc4ae89, 0x709e8187, 0x020d4f3a, 0xa98e9db9, 0x74d2cfda, 0x9514f3b3, ++ 0xb3ebe77b, 0x2f3ed913, 0xd6c1e4c0, 0xe7179424, 0xffac56fd, 0xbba7cf6d, ++ 0x10f9d47e, 0x5a4e48d2, 0xb2d31e41, 0x77ebeeec, 0x5fd2cf4b, 0x24c7e0cc, ++ 0xb015f2cd, 0xfff4ad0f, 0x13d6412f, 0xbf6af309, 0x62a20dd5, 0x6fbe09b9, ++ 0xdb478dd5, 0xd633d4b9, 0x8abeb32f, 0x5a72246f, 0x2faa5ba5, 0x308f83f6, ++ 0xce37e815, 0x933fb7a9, 0xa6eaf974, 0x3d9d4e3e, 0xf2a0ff0a, 0x1208d497, ++ 0x27054fd0, 0xb6c94e9f, 0x7bf3a056, 0x40849c1e, 0x57ab02b7, 0x7d990d69, ++ 0x6657382e, 0x7e6eeb78, 0x25d37f14, 0xd665f24a, 0x2d873c3a, 0x327eb86b, ++ 0x8d0b99e8, 0x6fc0d32b, 0xf4bc44b0, 0xfb463788, 0x8fde414f, 0xc394be06, ++ 0xd39efb7a, 0xaafda107, 0x4a2fd1df, 0xf935a76c, 0xc7f31376, 0xc2bdfb18, ++ 0xe0b5c8f5, 0xf0f5b553, 0x8c13b014, 0xba6aaa70, 0x5ca1f668, 0x45e5ffa4, ++ 0xefc2a4e1, 0x057bd179, 0x7d795bf4, 0xce2dfa1b, 0x1f90caca, 0xecbc857c, ++ 0xfa5b3eba, 0xbacd04e9, 0xe30ad214, 0x0f96303c, 0x7cf75c44, 0xb9f8e548, ++ 0xe404c9df, 0x6b4ab910, 0x9b01e669, 0x745e535a, 0xe340f3bf, 0xf7806292, ++ 0x51efd839, 0x7880b9b9, 0x5207881d, 0x9bfb0797, 0x1534c40b, 0xbc8174e0, ++ 0xc1a918e7, 0x46648643, 0xcffdd338, 0xe8fced09, 0xa79747fe, 0xbe5d1ffb, ++ 0x8348cc94, 0xa7d28278, 0x70101264, 0x78f2ba7d, 0x2efd89c9, 0xc1ab3522, ++ 0x86fd51ae, 0xd489380f, 0xf2afce97, 0x95e6cfd7, 0x4a6479d0, 0xcf513ecc, ++ 0xb32717c3, 0x6c3797f9, 0xf9687b32, 0xb391c6c9, 0xeda684a8, 0x3e21ab03, ++ 0xb829d940, 0xc2bab8b7, 0xdfceebf7, 0x5ed55f38, 0xcf2e72ea, 0x2f5951e7, ++ 0xe8310278, 0xd18926ec, 0x260faa99, 0xfeab75f2, 0xfc8669a3, 0xf8d7903d, ++ 0xca1be69b, 0xf73f31bf, 0x7e7e3a22, 0x934df45e, 0xc2ff1952, 0xc29058fe, ++ 0xb8dfcf48, 0xfd2ef4ff, 0xfe8d23df, 0xa7effb16, 0xffda33e7, 0xfe756ffc, ++ 0xbfccba83, 0x95ff563a, 0x97757ebf, 0xf979e542, 0x20ee7eaf, 0x2738ced4, ++ 0x29b9a5d5, 0xacb62bfe, 0x9c1d0072, 0xd0071495, 0x3880b9f3, 0x9e431035, ++ 0x2e04916d, 0x01363cb7, 0x4ff09bfc, 0x57f9ffda, 0xf403b89e, 0xb22d95f7, ++ 0xf596fd13, 0xf285a096, 0xe2e3556b, 0xf31c3262, 0xe6bf2c6d, 0x26f908a2, ++ 0xff967d3d, 0x20d3cffb, 0x4a52858e, 0xe7fa135f, 0xa81fb883, 0x14e9fcda, ++ 0x24d5efd0, 0x6c667c8c, 0x917fe307, 0xc4a7fa8c, 0x1cb5d89c, 0xd069211d, ++ 0x1baafd9e, 0x3a28b89f, 0xf4215fe0, 0x97eb18bb, 0x69fefb71, 0xe50bdec9, ++ 0x063218d7, 0x0f0a97e4, 0xfdf66012, 0x317f97ca, 0xa7ce8dbc, 0x1ceff37d, ++ 0x2a4e0682, 0x986a5d9f, 0x576efcff, 0x83b2f2f7, 0x8ed6a1f2, 0xab81f554, ++ 0x9a4bef89, 0x07215a59, 0x5ca8131d, 0xbb24d8a8, 0xe2b9fa15, 0x7a5f17d5, ++ 0x1fc5fc06, 0x6983dc58, 0x3d5e4bff, 0xcd3c7470, 0xf726d92f, 0xb0cb662a, ++ 0xbc516909, 0x97ffd354, 0x50f146e7, 0xd980e3be, 0xff7d8c35, 0x1f147261, ++ 0x33edb64b, 0xe15d6193, 0x9f61a931, 0x818b6439, 0x29b68697, 0x7cad6760, ++ 0xb83373f9, 0x15edced0, 0x18ccef48, 0x0074dcf0, 0x138030ed, 0x29e391e2, ++ 0xfd433782, 0x90178a6a, 0x8c9e2ae7, 0x3cb9cbe5, 0x395cfe81, 0xedafcf48, ++ 0xfd97e3a6, 0xf586e2d1, 0x90f6bd97, 0x4671d603, 0xfd7461aa, 0x0f34aaec, ++ 0x564cb71d, 0xb2989cd2, 0x3dcf65ef, 0xe8b6f48c, 0xcc69c3f0, 0x63e9e80f, ++ 0xf4a4dd42, 0xdc2df581, 0x57d71338, 0x77487c4a, 0x5e8acf65, 0x499f8f90, ++ 0x18b6ea64, 0x6657d17c, 0x0bccf272, 0xeba590d4, 0x6ffb033b, 0x89efe790, ++ 0xc846bf18, 0x7c67e883, 0x5a85af98, 0xccff9868, 0x4974f0ca, 0x4b397132, ++ 0xbd2d75ad, 0x0ad35e6e, 0xdfdf39f8, 0xb3ce1bd3, 0x70a489aa, 0xd25f0878, ++ 0x45c3c57e, 0x887e19bd, 0xede3ca4b, 0x09359da8, 0x56fd43be, 0x5c3713d9, ++ 0x997c8ed7, 0x197f1d19, 0x3bce9f1f, 0x33a3ec1e, 0xfdedb169, 0x0f55645b, ++ 0xa1ae3d50, 0x337f0d2f, 0x18fcdf7e, 0xdf956fe3, 0x42a7d303, 0x308e5ff9, ++ 0xa07681fe, 0x82bce91f, 0xdf7cb1bd, 0x03ca02dd, 0xe2c6090b, 0xe732cdeb, ++ 0x4ab97d6b, 0x92de7427, 0x17a1a890, 0xe1193fe8, 0xe953768f, 0x469db453, ++ 0x78c3565e, 0xa9fdae8e, 0xf388bb7c, 0xe7ac9a7f, 0xf191b27f, 0xabf6f77d, ++ 0x725efcc2, 0x8067a5e0, 0x2a7f295f, 0xd957e02e, 0xf3feeb0b, 0xdfa396d6, ++ 0xe7fa7ca5, 0xf54f9506, 0xa7c8d3f2, 0x261fdb65, 0x3e469f40, 0x1abf73fd, ++ 0xe94f9312, 0xda7c98f7, 0x2a3ff42f, 0x7df8553f, 0x553f00c7, 0x4707761e, ++ 0x50fc3ca3, 0x8794c572, 0xe48477f4, 0x953fa575, 0x2b7a54ee, 0x81ca8fff, ++ 0x74227720, 0x845dd2a9, 0x33ba552e, 0x3f0f57ae, 0x2655b963, 0xebef6788, ++ 0x2b57ee32, 0x261c599a, 0xdf56f76d, 0x0f270851, 0xf75231aa, 0xda5edf56, ++ 0x6f90c07c, 0x18f7d430, 0x7d435ef2, 0xa35f219f, 0xd4d15fab, 0xff882662, ++ 0xb89eaea0, 0x327219fc, 0x06bd1625, 0x8dd5be10, 0xd00acd17, 0xed8c2d85, ++ 0x814415e5, 0x1ef0beb8, 0x9de1f711, 0xc1abc614, 0x3335b05f, 0xb1b950a0, ++ 0xf7ed8e2a, 0xd5e6a9c3, 0x9d3ae720, 0xe4324761, 0xdbfd98e3, 0x923b0de9, ++ 0x5b647634, 0x3a7288b3, 0x63532014, 0x06a863ed, 0x48867841, 0x5cece577, ++ 0x0db448a9, 0x9b7e0e58, 0xae0dd13a, 0xf7b50582, 0xa75ce038, 0xcefb39b3, ++ 0xc2fbf4d9, 0x56188adf, 0x18ef19d2, 0x8a22f30e, 0xd9a3ea47, 0xca259c3f, ++ 0x3d74f9d3, 0x3ed99bf3, 0x833ac162, 0x21d641fd, 0x96da94fd, 0x527e4199, ++ 0xfe84ffbb, 0x41f1843c, 0x6cafef39, 0x6d5cbea3, 0xfb8ef14f, 0xfacdf2e5, ++ 0x6fdf1f72, 0x62f9526e, 0xf7c11904, 0xc1cfcc7b, 0x989170e5, 0x0a6ce773, ++ 0x2283ceff, 0xa5fcd0b1, 0x7fe11166, 0x0010ab69, 0x5251157f, 0x48aabf91, ++ 0x0a9fe518, 0x1fe076a7, 0xa9f2f773, 0x79c7e77d, 0xd93a003f, 0x7ff0e1f5, ++ 0xaefb69a3, 0x01bc860f, 0x1b1f5ff9, 0x5ae921f0, 0x38ded27f, 0xdcef573c, ++ 0xeefa476b, 0x80cef3dc, 0x75fe401f, 0xd9e61b8b, 0xe1f3f7b9, 0x2b9d2f40, ++ 0xdf20652c, 0x7f33fb3a, 0x9f3dcae7, 0x3ea10f0f, 0x76f1147d, 0xaffb6648, ++ 0xff7fcd4b, 0x2905e844, 0x09d8155d, 0x7f90137b, 0x61c777aa, 0x9ee7753c, ++ 0xb67cf3cf, 0x553d6f6f, 0xd3a28e3c, 0x876f664e, 0x38b125f9, 0xc637ea81, ++ 0xc74b58bd, 0x67dc6caf, 0x27cb4f9e, 0xc31fe6fd, 0x6e766e41, 0x874ff667, ++ 0xe20e7a1c, 0x1fc98e04, 0xbe2990ac, 0x3289803a, 0x9cc87908, 0xa4f80931, ++ 0x81fe5c2b, 0xc29ea7fe, 0x1affe3a3, 0x261e0878, 0xab01ecdf, 0xebfeeb00, ++ 0xdfa21f27, 0xa97482d0, 0x0dcff7ae, 0x5c9f68b5, 0xb376dd6b, 0xfee7f999, ++ 0x10b7599f, 0x73bac9ec, 0xbdd7c9fe, 0xfce1765d, 0x95d07c8c, 0x823cf7ce, ++ 0x6eed57f9, 0xe90f6f9c, 0x7c9ff8bd, 0xef1b5ffd, 0x1dde29db, 0x92f75ed7, ++ 0x7775f27f, 0xcedff78f, 0xe27778e3, 0xfcdf99bd, 0x75f7e703, 0xe613dce5, ++ 0xd7396e7f, 0x3b55fadd, 0xb6f262de, 0xcdf9d016, 0x30767526, 0x5ea4e62c, ++ 0x89a1043a, 0xe97ffe96, 0x0d95f305, 0xda6a91e7, 0x11fe666c, 0xe9c1ce19, ++ 0xc0a664b8, 0xdf6c7ff7, 0x1fb70774, 0x8a57e8ee, 0x1e1deb76, 0xc913d766, ++ 0x05182deb, 0xdc0b7871, 0xb9250fe8, 0x9f907dc7, 0xebcf3379, 0x0aef8ff7, ++ 0xbb5023c4, 0x53018efd, 0x7b1d820f, 0x68293f67, 0xa41b6961, 0xf7f83bef, ++ 0xce7dfab1, 0x7f3e9f1c, 0x7e7d6ccf, 0x166fef26, 0xfc745718, 0x00215e59, ++ 0xffb94ffe, 0x0fe0a953, 0x44ca1795, 0xa71e2010, 0x27ec1566, 0xedf57a66, ++ 0x57bec037, 0x67ec2fe3, 0x0ba010f3, 0x93a1db99, 0xef966e6d, 0x6e7825e7, ++ 0xa950edc4, 0x39288797, 0xc5ddf8d1, 0x3834df56, 0x150eb0bf, 0xae778e10, ++ 0x590e5113, 0x979c0473, 0xf18cac77, 0xbc9a9fa0, 0xe29f8079, 0xbeaa6391, ++ 0x06e1a6cf, 0x70e62d38, 0x6835252e, 0x5fab9127, 0x079f997e, 0x768262fe, ++ 0x210f62d6, 0x40fdd3b7, 0x8c10be69, 0x48bcfca7, 0x2e624a22, 0x720551f8, ++ 0xd547e742, 0x9df7e1e7, 0xd73f68b4, 0x1d1ddfaa, 0x9fe9db7f, 0x189cdf28, ++ 0x3f6ded44, 0xcc23c18f, 0xdbeea81f, 0x70666fee, 0x0210aeac, 0x418f4859, ++ 0x3f39abd9, 0xfb61631a, 0x70fd3ffb, 0xc163f224, 0x644b0ebf, 0x6841c9fb, ++ 0x7eab569f, 0x0895c50a, 0xcd4b93fe, 0x6d9cfcd9, 0x8317c392, 0xfdf30e0f, ++ 0x4e201fdc, 0x939da68c, 0xf6113a85, 0x7e8c240b, 0x1c726542, 0x8e2312d9, ++ 0xc4c5b7b1, 0xb8358bfd, 0x989f84bf, 0xbf647807, 0x6269b445, 0xeb6f06b2, ++ 0x0d273f6e, 0xf8078aef, 0x279cd09d, 0x0be157fd, 0xeb8047fb, 0x14d0b8e1, ++ 0x5ef58c6f, 0xfc57e1cf, 0x3ef15fe6, 0x4ce68cde, 0x6332e019, 0x7f3ba8b2, ++ 0xfb70b4cd, 0x0919247f, 0xf37e2af3, 0xc038c756, 0x0dd141cb, 0x9baaeff7, ++ 0x317d9a2f, 0xf08cf5ce, 0xfcf1fe84, 0x02977640, 0x24fe4f3c, 0xecfec08e, ++ 0x945e7e1d, 0x39eff103, 0x80f02ae8, 0xc2d72abf, 0x2c6b4bfc, 0x5def844e, ++ 0x2a7205c5, 0xd1a7371d, 0xc48e0239, 0x35fd7832, 0x4346eca0, 0xa76b0630, ++ 0x60a8cbd6, 0xceccdaf5, 0xdfeb58aa, 0x79f8156b, 0xb191fb88, 0xde1f3fc2, ++ 0x1ed5fe0a, 0x343d042c, 0x1bafdd59, 0x7f209ae9, 0x042a9a5c, 0xbec04f40, ++ 0xecc5f30b, 0x263be7be, 0x60ccae56, 0x7ba55cf2, 0xe7ef9c23, 0xef8eabf4, ++ 0xc05f70e7, 0xb38543e9, 0x7ce35f0a, 0x5e54fad5, 0x39fad44d, 0xf11a6cee, ++ 0xaad1e81a, 0xa269c166, 0x2149555d, 0x7561f033, 0xf83293d3, 0x58b8e7f1, ++ 0x0c8f54bf, 0xaf0b9ed7, 0x9f3848b1, 0xf309dc96, 0xaf2e4e80, 0x6d0cf6a3, ++ 0xd17059ef, 0x1df87201, 0x70f7fb93, 0x5779562f, 0x42be5b24, 0x77e87d5e, ++ 0xd25936de, 0xf3899bf6, 0x40a2abbc, 0xbdccb706, 0xdee4fb15, 0x635a7a1a, ++ 0xf572c649, 0x2b85467b, 0xf1d3be17, 0x4fca1e70, 0xfbe2042d, 0xf15a1a73, ++ 0x35bde19e, 0xcb0e8c49, 0x3199f61a, 0xd5f5899f, 0x8c71d4f1, 0xb17774fc, ++ 0xfe747e3e, 0x803f50a4, 0xb825b14b, 0x4e831dcc, 0xfc46b06f, 0x4f4f5f98, ++ 0x0edd2878, 0x4f48ffff, 0x44f5532c, 0xd595e308, 0xeaba97f6, 0xf4b1de89, ++ 0x575ad2c4, 0xd2c3c06f, 0x81bdd93d, 0xb6fe9649, 0x9e962d28, 0xcecfdf78, ++ 0xfbf18f23, 0x53779db9, 0x4693713d, 0x871ddc4f, 0xf76c6274, 0xd727ca91, ++ 0xde2a13d2, 0xcde587fe, 0x6227a0fb, 0x41a777f0, 0x2e6acc4f, 0xeb313d41, ++ 0xbf7f516e, 0xdc04f41a, 0x4f56e98b, 0xc1cda414, 0x884eecbc, 0x73ef3f41, ++ 0x8f18fa3b, 0x407186d3, 0x3ab60c5f, 0xdea37c71, 0xbfae4ee8, 0xfeb953dd, ++ 0xaace087f, 0x933a5f5c, 0x4aeff3dd, 0x79e90487, 0xd72a1ce9, 0x2647a005, ++ 0xc7de97d7, 0x390669fd, 0x3b3905eb, 0x59672b4a, 0xd31f2afb, 0x994dd50b, ++ 0xcb4b98bf, 0xbb275bbf, 0x77feb4ad, 0x4f3772a3, 0x5b07772b, 0x17547c59, ++ 0xe4c65bb9, 0x91e6e5ee, 0xb7753f68, 0xbcb98fbe, 0x906cf2a5, 0xcc7d063b, ++ 0xbba09b9e, 0xc4727547, 0x00ece67f, 0xc447797e, 0xb94fc173, 0xc468701d, ++ 0x7b028e7f, 0xe995857a, 0x3e383b81, 0xb6e4fc3b, 0x4c0e54c9, 0xe9ecc05a, ++ 0xc222adca, 0xf191aaaf, 0xf8a0d57f, 0xa7e68b80, 0xcf15fee4, 0x61ec96f7, ++ 0x05747be7, 0xfc1a05c5, 0xb427792f, 0x4bcdfc1a, 0x3e780936, 0x00e87109, ++ 0x9e1c45cf, 0xb825eea5, 0x27c631cf, 0x4ad4fea8, 0xf3716f5e, 0x1abbf426, ++ 0x072a16e3, 0xf60e76dd, 0x8616c523, 0x421de287, 0x9c265360, 0xb9ea1b93, ++ 0x8973c31f, 0x79c306ca, 0x42ef5f22, 0x03b39831, 0x17bf63f6, 0x5cf4b1dd, ++ 0x652e11b5, 0x1cb845ff, 0xf51970a6, 0xee970fdf, 0x7bed40e0, 0xe11b43f4, ++ 0xdb95a0f1, 0x1464b99f, 0x26a7e1f0, 0xe515ca0f, 0x4ee3116d, 0x58393c16, ++ 0x9f83aef7, 0x4c77cbeb, 0xa07dd5be, 0x4f8b155e, 0xdb71b459, 0x9f9a3481, ++ 0x804640db, 0x06d17b1b, 0xe88e1ebd, 0xea1746fd, 0xdb35b9f5, 0x5c738804, ++ 0x956defc8, 0xf7c49e05, 0x4e5bee30, 0x3fad3cf5, 0x83e2d73f, 0x71c3d5f3, ++ 0x2a9b9461, 0xf9c6bedd, 0xcfc72b68, 0x64f08cc9, 0x824d4fd4, 0x1831f913, ++ 0xc515f4c7, 0xd1d3bc13, 0x29f3ee32, 0x7fcc2f1c, 0x58f0c4d1, 0xfc06f14d, ++ 0xe799a53c, 0x781d99eb, 0x106f9aaf, 0xe4012e02, 0xbd993eea, 0x149021fb, ++ 0xa3412381, 0xaedce11f, 0xe7834d20, 0xfe8c6d3d, 0xfc6e08b7, 0x7dffa010, ++ 0x4b773c13, 0xe98eccf7, 0x70abbd29, 0xf5cacd7a, 0xe1f3c707, 0x91e2d6b8, ++ 0xb823ae78, 0xe693fdf1, 0x388f3c24, 0xf1dec755, 0x3678e668, 0x3bec05f2, ++ 0x4c8aefb4, 0x9c438987, 0x8c38d4ea, 0xb371c3f3, 0x95a65d98, 0x707b914f, ++ 0x71bafd3c, 0x15a4d52d, 0x3c68b1ed, 0x05826f9a, 0x055385f6, 0x16271f49, ++ 0x16ff3a46, 0x4962bffa, 0x927fbeed, 0xd3f8c4ee, 0x77ea9c87, 0xc35fbb27, ++ 0xf3fd2df3, 0xf0a5cd8e, 0x7456bcbd, 0x1eea16c3, 0x3e68eb93, 0x65c79bc8, ++ 0xf972fc02, 0x7a61ec90, 0x4ef50120, 0xf1273bc9, 0x8b09525e, 0x3f25226d, ++ 0x24e5fa62, 0xa91fcf9f, 0x2f80f6de, 0x868c3485, 0x76ee4cf7, 0x81722bef, ++ 0xe1d465bf, 0x769e7055, 0xd1e724d7, 0xc7cf80a3, 0x27367bd8, 0x7dc24ed6, ++ 0x0a0f43da, 0x29c76fc8, 0xccfda0de, 0x1e8f33bb, 0xb7dee3a5, 0xc7cf1536, ++ 0x67527ae6, 0xdcd979c1, 0x45dba243, 0xd3bfcdeb, 0xb2f3836e, 0xe2454369, ++ 0x3ee7c0d3, 0x9dfe8ad2, 0xce0f35b9, 0x51977984, 0x4266287d, 0x37a8b87a, ++ 0xd80a37e4, 0x99f15abe, 0xeb5ddee1, 0x51e68b86, 0x5a52fc74, 0xbd5ec00f, ++ 0xdeabd591, 0x8421b82c, 0x49f9b4b7, 0x9ba59794, 0xa4307c05, 0x56bfda95, ++ 0x4ac06fd6, 0x48dd6dfb, 0x22fcd3db, 0x6efd0f68, 0xe7059a4e, 0x9e74d560, ++ 0x2d6c7ed8, 0xd296779e, 0xb498b476, 0xfb107e6e, 0x2051bc5b, 0x6cabcf70, ++ 0xc74fe66c, 0x64877f42, 0xdb1f9437, 0xcc334bf7, 0xaf1d1e7b, 0xbe7fed0f, ++ 0x7f422a18, 0x27040fdc, 0x1b6323be, 0x84ebf88c, 0x23834305, 0x05cf8cd9, ++ 0x92b7dea2, 0xb30e71b4, 0x749c58e2, 0xd5daf2e9, 0x9290aeb0, 0xba42699a, ++ 0x3d0668ba, 0xdbc28a7e, 0x93d7ed47, 0xd13f1666, 0x87349ca2, 0xa1f47234, ++ 0xbf6c6cb8, 0xcf00a9a0, 0x2f1217e3, 0x6afbc79e, 0xb6d23d99, 0x80202e2a, ++ 0x073b261d, 0x5596f7c0, 0xf1defc16, 0x1d3fd32a, 0x47e843fd, 0x2651b33d, ++ 0xe56d0f70, 0x01a7ecc6, 0xcab6678f, 0xb3e26f48, 0xd17a3cec, 0xd64fccab, ++ 0x7bf591b2, 0xbd999966, 0x34e5048f, 0x7565e8bf, 0x6397abff, 0x9472aea5, ++ 0xd4b94653, 0xa9f0ae25, 0x6c90335a, 0x6cb57917, 0x72abca0a, 0xd08077aa, ++ 0x7eabc8ba, 0xd9cfd1ab, 0x9b133f45, 0x21728faa, 0xb2a4a52e, 0x400dbcff, ++ 0xc0b1f7c7, 0xebe0d6ef, 0xf41cfd9f, 0xc09d856e, 0xf9c92a97, 0x82e8c0b4, ++ 0x6dccbf00, 0xf019f6de, 0x38dcd941, 0x34e9577c, 0x66f801e0, 0x939e0a5d, ++ 0x104a0696, 0xe69c6ade, 0x3a7a0da2, 0x738ffd57, 0x68f1227c, 0x025957f5, ++ 0x1dea68f1, 0x57a511fb, 0x4dfdce3a, 0x804e2042, 0x0f5bdb7c, 0x13bcc28f, ++ 0xdb9cb5e7, 0x48eceb07, 0x77bec7cf, 0xebd01571, 0x040a1fbc, 0xf8a275ec, ++ 0xac3e8356, 0xc0b820da, 0x87e8bb9f, 0xda22fdac, 0xec7de61e, 0x28ae8c97, ++ 0xfe80bb7d, 0xf93e36ab, 0x2cdfd616, 0x63ffa0b8, 0x9ed04a9b, 0x82445328, ++ 0x70db9be5, 0x14f540ff, 0x28b52fc6, 0x7fd01a62, 0x2716a3d5, 0x1d2a4a98, ++ 0xc6d974a9, 0xd58953e3, 0xda2efc3d, 0x9526132e, 0xc51e95da, 0x9f4442d9, ++ 0x2b549d02, 0x5edace8c, 0x3640dd95, 0x764ba6d7, 0xd70cf99f, 0x33b3e2af, ++ 0x8b7dc0a7, 0x023f5445, 0x9c6cb69d, 0xe23b0664, 0x73c0404c, 0x4974aefc, ++ 0x4a3b5a6c, 0x0567cba5, 0x15afaf26, 0xee85dae7, 0xf4aa5d38, 0xf71a8947, ++ 0x64871595, 0x8da8f702, 0x1b93e8f4, 0x419c4166, 0x3d746bc9, 0x5693be74, ++ 0x75ed0f7f, 0x9f348e15, 0x8952f906, 0xfca893c5, 0xb8b12950, 0x3f3dafa3, ++ 0xe293f8c3, 0x107e51ec, 0x904c5c59, 0x5b9ffb8e, 0xbc38c45f, 0xddb4af0b, ++ 0x1bcdf681, 0xfe000e94, 0x8824ed5b, 0xca008ffb, 0xd146f2a1, 0x528a7183, ++ 0xcd2eef30, 0xb38d5dbe, 0x3b2bf258, 0xbb7cbbc2, 0xdb4c5025, 0x393aef97, ++ 0x57bdcf1c, 0x446e3184, 0xfb404579, 0xe1a12898, 0x5ca40f70, 0x461ef162, ++ 0x1c6f60bb, 0xbfb77fdb, 0xec1b309e, 0xbd9ea136, 0x70de5697, 0xf8d16c8f, ++ 0xc9c67775, 0x873c3d6a, 0xe19e2851, 0x4fcc3b9e, 0x1a974efb, 0x32fed1e7, ++ 0x26f2bfa3, 0xf2b9ed19, 0x101d6dfa, 0xdc7e57df, 0xeadcfb82, 0xaf188bfa, ++ 0xaf57e93c, 0xd56b3be2, 0xbe2ea24d, 0x555c4bab, 0x22e788bd, 0x18958d55, ++ 0x78f341f7, 0x10d5523e, 0x5af0be3b, 0x7e4b3ff1, 0x429767b5, 0xc764b841, ++ 0xddf03bbf, 0x0e2dd6b5, 0xff52bfbc, 0x5d8d71d5, 0x1e1aa8e2, 0xaa38cafb, ++ 0x4a0ff0f3, 0xb8e26758, 0xa1c6a71d, 0x46b933d5, 0x8de797e7, 0xd88e27e1, ++ 0xf67eaf5b, 0xb6f9c41c, 0x73f3ff6f, 0xff8adf30, 0x8839f975, 0x7388a0df, ++ 0xfd523d82, 0x2718fbca, 0xe213b6a9, 0xe5e7fef9, 0xd2f8c77f, 0x6e2c0f8e, ++ 0xcf63ade8, 0x6f600199, 0x6bfb6c74, 0x2e8dc41a, 0xfe8453db, 0x273b659c, ++ 0xfc3126f5, 0x740a6a05, 0x7c41e81b, 0x2d5f11ab, 0x67182d8d, 0x1be28172, ++ 0x2e2443e4, 0xc592a1ae, 0x3c78ba19, 0x71d8d6dc, 0xdfe25dc4, 0xf3baef1a, ++ 0x8d8b9066, 0x66b82ecc, 0x8a11dc1c, 0x807a9bc7, 0x718fadbf, 0x7f1b1279, ++ 0x141fe017, 0xf5e3034f, 0x359f7071, 0x19fe7c2e, 0xe94c6b28, 0xd82e0e36, ++ 0x71a9b803, 0x9e71edca, 0xbf81e21b, 0xc607ffb6, 0x8ade021d, 0x3f9f205d, ++ 0xe17e001b, 0xfd1872b3, 0x163de10f, 0xbe572fbc, 0x4ff218e7, 0x18c3cec7, ++ 0xbc784c07, 0xfc890770, 0xf7277c58, 0xb66f54f5, 0x0e39f8b3, 0x73af887f, ++ 0x8f3bf039, 0xac7463a3, 0x1775d7c6, 0x9f125757, 0x60c5dfc5, 0x9b957ff1, ++ 0x6af1e43f, 0x63097c51, 0x5f6d4f01, 0xc2a8af19, 0x187009c1, 0x8d138da3, ++ 0x8918bf1d, 0x02f8e627, 0x8e9c81fc, 0x7cd281c4, 0x0c0b883f, 0x0c48c708, ++ 0x89b1d079, 0xc87697c5, 0xaaa5efb1, 0xe373a371, 0xe81a7c0d, 0xb5e8bc59, ++ 0xe175ffe6, 0x0bbc7b73, 0xa9c235fb, 0x396c6afd, 0xff7ce7ee, 0x541def8d, ++ 0x0d7bc608, 0x7b878e3f, 0x666d8d13, 0xdd42977c, 0xb6f5f13f, 0xfb5a7f73, ++ 0x13c6222b, 0x41686eae, 0x17946e39, 0xc49cfc55, 0xf927df38, 0x989aab7c, ++ 0x6edf689e, 0x3f68d80f, 0x8ebe6fed, 0xb5b55cf4, 0xdf19e30d, 0x0e61dfaa, ++ 0x4197ce69, 0xf334044f, 0xdf6d7f6f, 0xfcdb9470, 0x38e3289d, 0xfdb3c7cf, ++ 0xec737570, 0x5eb7aa71, 0x44b38dd4, 0x6d3b3069, 0xbcef1ed7, 0xfa07b9e4, ++ 0xeccadf3b, 0xe20df3a5, 0x6ef758d4, 0xfccbc456, 0xa58eb41c, 0x7be25f54, ++ 0x3ef67659, 0x4788e896, 0x7d996bfb, 0x5ec4f1ec, 0xbe319a90, 0x8f2d6562, ++ 0x3b91f8c7, 0xd2bdf01d, 0xf9811b7e, 0x6af802ae, 0xd3b2f1f6, 0x936ec047, ++ 0xb4a3bdd3, 0xfcea2ce7, 0x244cbdcd, 0x32ffc1a0, 0xb0ded4fb, 0xd29224ff, ++ 0x4771e60f, 0xe812e7d6, 0xf33f56bf, 0x27ab93df, 0x56f7c107, 0x852079c9, ++ 0x593adbf6, 0xb5eb8370, 0x7407dd2b, 0x3dd363e7, 0x213f77fa, 0x77d61f56, ++ 0x7b426dc9, 0x3a0a6ed0, 0x8f621569, 0x0dc74d6b, 0xa4b88bac, 0xc7b10c34, ++ 0xfdc7f738, 0x41a4bbd6, 0x352eb284, 0x5b9ea14f, 0x9163bdd2, 0xbc325638, ++ 0x0c8e416b, 0xe36af4a2, 0xe5faaaf4, 0xb4dfecec, 0x97be10df, 0x6a439491, ++ 0xd9d77c81, 0xac37687d, 0xd08cefe7, 0x838850df, 0x6ef12648, 0x743c3bed, ++ 0x1dfbdd5c, 0x3e5d5c74, 0xa7cfa3c9, 0xc54e954c, 0x7c292fd2, 0x1b44531e, ++ 0xc8a921c2, 0x8ad7eea4, 0xe745a707, 0xdc4a949d, 0xddbf2841, 0x94e67186, ++ 0x3aed14bd, 0xbcfd366c, 0x7274fce9, 0xa4273122, 0x753cd898, 0x25c49ddf, ++ 0xfa3dfae0, 0xbabe74ef, 0x7954dffc, 0xe4091127, 0x4adacd9d, 0xe92ffc38, ++ 0x74a8fde0, 0xe01a7fa8, 0xb57df087, 0x429ee042, 0x1d075f22, 0x09df575f, ++ 0xbe3601de, 0xcfd21fbe, 0x784fbda9, 0x2d7fd713, 0x0484de09, 0x0379a7ca, ++ 0x3800306b, 0xe0e49d3f, 0x5ee6d7bd, 0x96b29f28, 0x89dc6217, 0x6ae8c750, ++ 0x7c823ad0, 0xe2cc2833, 0xf1a3c85b, 0xac5a8f68, 0x85cb8944, 0x9144527b, ++ 0x00946173, 0x0ad73fe7, 0x5a4aed13, 0xb68d694b, 0x9a170e6b, 0x34245216, ++ 0xdfed1140, 0x80c9e09a, 0xf74f57f1, 0xc0469ba5, 0xed56a7c7, 0x7b5c87ef, ++ 0x4d04783d, 0x0703fac2, 0x40a1666f, 0xc5031ef0, 0xbfd001c8, 0x093c9175, ++ 0xbaed7dc2, 0x63de48f8, 0x2ebef2a5, 0x2687e58b, 0xef055fac, 0x7a24b486, ++ 0xc438c287, 0xcf01bcea, 0xb8c982bb, 0x17e96bfe, 0x37439e75, 0x8fc4a687, ++ 0x78537e62, 0x3db0759f, 0xf51a7f72, 0x9a9b16f0, 0xc23ee20f, 0xe51878db, ++ 0x61c3655a, 0x9e41372c, 0x425303a6, 0x1126fa53, 0x2f13cb72, 0x0f5fa516, ++ 0xe925e3f1, 0xef4eba26, 0x901e2f13, 0xd7a87074, 0xbd3241c1, 0x4bc38064, ++ 0xde0e0b5f, 0x0e109784, 0xa5375d3d, 0x5e013b8b, 0xf84c0ad3, 0xe398d66e, ++ 0xd0aff436, 0x23ea1c5f, 0x6ea6cfde, 0xfbaad7ee, 0x3dcfda11, 0xdb52fa5a, ++ 0x1dd574a9, 0xe71364dd, 0x44bdec0d, 0x4dacfd3d, 0xbfa0f8f0, 0xdd8f0492, ++ 0xc7eb8a9e, 0x7cd3dcfb, 0x91e4f73e, 0x3626ba51, 0x7619c8df, 0xc581ff18, ++ 0xecbf1a09, 0x62a582b4, 0x396f9d16, 0x746a42f0, 0x95cba93d, 0x9d7421b8, ++ 0xc6131ea9, 0xf824b767, 0x3ce813aa, 0x41c3b31c, 0x8630b2b8, 0x620a46f8, ++ 0xf1d42f94, 0xfb61ef56, 0xa625d5f5, 0xde760ac0, 0x517f402b, 0xe81908fa, ++ 0xa3e8cc23, 0xa3e90da9, 0xd18db9aa, 0x216d5347, 0x9b9c17d0, 0x8ebf3ec1, ++ 0xde004784, 0x66f13d57, 0xd29fd491, 0x7578424d, 0x32174a5f, 0xc7151609, ++ 0xc6575c21, 0x9f9f0fc4, 0xf0eeaeba, 0xeb30775b, 0x4fd81c89, 0x79e1321e, ++ 0xb5370a97, 0x2c092bde, 0xdd8e72fe, 0xa8700757, 0x0b7a1b1e, 0xe0fdbf96, ++ 0xe1b7187b, 0x1f633438, 0x4ddc77b4, 0x8e8ae431, 0x0568775b, 0x475c83be, ++ 0x265d01d7, 0x7a02b092, 0x30787bbd, 0x03c089fe, 0x801c9eec, 0xcbf21b47, ++ 0x121efc2b, 0x5fbc3be5, 0xbd81303b, 0x0262f0ff, 0x75f9138b, 0xfcf38882, ++ 0x6bb30275, 0x325d0f52, 0xfaab7ec3, 0x4fd61351, 0xbb473485, 0x3b7947fe, ++ 0x0627cb89, 0x2a9f150f, 0x9a49513d, 0xfc48ef00, 0x90d7c938, 0x3f4b5a30, ++ 0x9a5909c9, 0x3f76d4fe, 0x02f713f5, 0xecc747aa, 0xd021e07f, 0x7e7e94ab, ++ 0x4c376ba2, 0xa9b8038e, 0x633e81f5, 0xdbb687e1, 0x1c60ed0b, 0xedb617b0, ++ 0x7be22a5f, 0x6bc43d08, 0x47ffbc1e, 0x9025e7eb, 0x7db4ed9a, 0x214d225e, ++ 0xbdf3c29f, 0x4b2fbe79, 0x9b723fb3, 0x137dfa04, 0x4d1ebbf7, 0x920171e0, ++ 0xc31986f3, 0xb8eccf20, 0xd478f4fc, 0xc2df2a0b, 0xb7387e5d, 0x75f9f896, ++ 0x04cb3856, 0x58f95378, 0x76829b0a, 0x24b2b4aa, 0x18e20997, 0x75d3f6de, ++ 0x9dcbdd4b, 0xf767aedb, 0xcfdf8d03, 0x637cf9f3, 0x5d2ffafb, 0x079f0dee, ++ 0x435a56f8, 0xf3419d3f, 0xc65fd755, 0x0915c1f3, 0xeabe1355, 0xfce302fd, ++ 0xc67abedf, 0xc761f601, 0xb1a99617, 0x3681ecec, 0xfd078f46, 0x1e5db1b3, ++ 0xf4839f7f, 0x3559e356, 0x8ca110f7, 0xca8865db, 0x768efc2c, 0x045077d6, ++ 0x29153e02, 0x6427da19, 0x44e1f9e2, 0xefc47dc3, 0x2f9f9904, 0x50030c0f, ++ 0xc0ddd712, 0xd982f9c6, 0x1ffa5649, 0xf115339c, 0x25b7b173, 0xed3b4adf, ++ 0xcec26def, 0x6a52f357, 0x2c4f205a, 0xa202ffac, 0xaf2d4f7f, 0x64e4dd77, ++ 0x133137e8, 0xac935bfd, 0x456cf286, 0xb24d3902, 0xb12e3133, 0x33ec6888, ++ 0xeed037a6, 0x02f3a38e, 0x686d3e39, 0x2f327b89, 0x1fff4cbf, 0x4ff72168, ++ 0x6e37ecd7, 0x4f71cd75, 0x752fd9d6, 0xefcbaef8, 0x1fde21fe, 0x5fe2ce2b, ++ 0x0f4e8c6c, 0x386ebdfa, 0xb3c2367f, 0x6a3c25d0, 0xbb857577, 0xb8468e11, ++ 0xc23570ab, 0xf723e0b1, 0x7018e4e4, 0x88a5c232, 0x3d050dd4, 0x08ddc2a6, ++ 0x8cadb797, 0xb1cede2e, 0x6f78fbe0, 0x6f8e0c4b, 0xbd923353, 0xbb41e9c7, ++ 0x03a548b6, 0x495bb30b, 0x49e23b6f, 0xd92773b5, 0x08d9bf99, 0xf470aed7, ++ 0x45a51714, 0xc016f7d7, 0xc133e80b, 0xfd0cc47d, 0xfc460e26, 0xa244e091, ++ 0xd3a0eb8d, 0x270477c0, 0xd2baaeb2, 0xe0866fdb, 0xbf13b37b, 0x45b9dbd0, ++ 0x81ce53cd, 0x7e96e09f, 0x7f828f25, 0x6dd080b4, 0x11e50b86, 0x4c8487e3, ++ 0xc70a53a4, 0xe37a7a13, 0x72b0a6fd, 0x797d570a, 0xe968f136, 0xdc69c8bc, ++ 0x41b9d7f7, 0xafd71bff, 0xe0afd9d2, 0xf0aeb8c3, 0xcaace952, 0x194efdc6, ++ 0xcbd81fa4, 0x951f5fc3, 0x349bf208, 0x4bf4c727, 0x8dee398c, 0x47c7c3f4, ++ 0x2f88163a, 0xfd99ddf2, 0x8763905f, 0xc8d496a8, 0x6fa275b1, 0x1c862da5, ++ 0x66e5e953, 0x899bb78e, 0x4bfc0fb2, 0x2fe91337, 0x6640fd91, 0xd84ffd74, ++ 0x2fa43ef8, 0xfceb0be9, 0xe98b8273, 0xc8cebe45, 0x0979a9ba, 0xf1f3e7e3, ++ 0xbc36adf3, 0x52c241c7, 0x59ee047b, 0x628d6ef8, 0x43ce8e4e, 0x80c9f5e6, ++ 0xb9ecc21a, 0x315ef8b9, 0x32f90b85, 0x808f3a21, 0xddf0904d, 0x0b8f3e16, ++ 0xe20556f5, 0x7d13ded8, 0xf7e06d9b, 0xc70d0e10, 0x21c149f5, 0xe58cffa0, ++ 0x57f69b97, 0x57ad3941, 0xfcf8f58a, 0xffcc8897, 0x0963de10, 0xbdd990bc, ++ 0x1ad94a9d, 0x17ca84f5, 0xf20f70f9, 0x60bbe026, 0x44f7985f, 0xdd347550, ++ 0xf70cb17b, 0xb94d0585, 0xe0738c12, 0xf78c14d2, 0x091e242f, 0xfd235bec, ++ 0x48dae91b, 0x96e831c7, 0x03c22bfb, 0x75f29f60, 0xe3b545e9, 0x44737422, ++ 0xbd2a374f, 0x1df9fa50, 0xa8e74fd0, 0xb3069f4f, 0x97519dfb, 0xa9ff40d3, ++ 0x1ed47a76, 0xf00bbcf1, 0x575eceed, 0x6d0ff4ed, 0x9ea1f7be, 0xa0f3c244, ++ 0x9750d67d, 0xc7dbee09, 0xe1473dd9, 0x5cbf6abb, 0xf641df6b, 0xa5310dd3, ++ 0x0f1c799b, 0xef82260d, 0x054b2af9, 0x91f72f94, 0xdde30cb0, 0xf6eb2357, ++ 0xc2e2f3b7, 0xce00fc9f, 0x43af6b0b, 0x2883e67d, 0xb3db1136, 0x5cd5e3b8, ++ 0x0f0d0eef, 0xbfdeb801, 0xd89edf5c, 0xa2ef74d2, 0x7db0227e, 0x50b8bcff, ++ 0x2dcfdc2a, 0x8df5f451, 0x30ebabe3, 0x576c6bf6, 0x6bf7626d, 0xb76a5de0, ++ 0xdcf86ec6, 0xc8d9ecc6, 0xefe6df7c, 0x9b78501e, 0x7cd39fc0, 0xeecdea3d, ++ 0x66b3e7e0, 0x779a48e4, 0x2c7b42b1, 0x3fbd63b3, 0xc2a38ea2, 0x55692e7b, ++ 0x8337f9e1, 0x7dd994df, 0x300fe63e, 0x9dd4153d, 0xa0e9abc7, 0xfbb464f0, ++ 0x68083506, 0x14345767, 0xecebe698, 0xee1fb67d, 0xbbc3ef62, 0x71bf5018, ++ 0x1bf7b31f, 0x50df716a, 0x3ff6c8d1, 0x3a0ce09b, 0x07244f83, 0x7d9101f7, ++ 0x5549c42d, 0xac83fbc2, 0xdd57083c, 0xfd58ebb3, 0xe60df609, 0xbec106c7, ++ 0xbb2e97d4, 0xcf27fe69, 0xfdd2b6ae, 0x124cead3, 0x69fee847, 0x9d9e4fdc, ++ 0xe52c6eb2, 0x008f64b2, 0xfcd23def, 0x9eb8db6a, 0xfc27a3ef, 0xf46ae364, ++ 0x73782427, 0x6d7d9aed, 0x0831fc77, 0xd8af8e8c, 0x7a24b6cf, 0xfe51d827, ++ 0x1184bf30, 0xaeac97ff, 0xc7bfa044, 0xb6fb3ef8, 0xfee00fe5, 0xabbaee21, ++ 0x2c1e2003, 0x16fde39f, 0xab37b33b, 0xedfdd813, 0x2ddf4587, 0x9be76fd0, ++ 0x1f808757, 0x27a1edf9, 0xccd6df71, 0xe43c87df, 0x493b432f, 0x3b0ce3c5, ++ 0xbb6fb3b3, 0xfb01c5be, 0xff47db8e, 0x5f9def01, 0x697bd890, 0x3acd63ed, ++ 0xad8f773b, 0x5fac0668, 0x44d8294d, 0xa3f9cb90, 0x7d071ff6, 0x887e9ddf, ++ 0x008f7fca, 0x3d5c9ff2, 0x3fe7869c, 0xe01c078d, 0xf7e76cbb, 0xb6342fd8, ++ 0xd3403da4, 0x707f6dca, 0x3e6b7ec0, 0xa905df5f, 0xa9d7df15, 0xbbe229d8, ++ 0xb4dc7410, 0xdcbfc17b, 0x71ef3f38, 0xab558c36, 0xd1ff72ff, 0x9ccbd7d2, ++ 0x87bef87e, 0x6cde0f6a, 0xbf300255, 0xfd115ae6, 0x889337bd, 0x05df139f, ++ 0x7a28d899, 0xed5d1ce2, 0x55d9efc3, 0xc61a72bf, 0xb2732d33, 0xcbe3ba71, ++ 0x49922ffc, 0x407ef340, 0x611414be, 0xa45ff9fe, 0xf06a7811, 0xf5acc1c2, ++ 0x226f80c5, 0xb74307bb, 0xf68fd912, 0xa23f3f27, 0x1ef0fdbf, 0xf99e5ef4, ++ 0xbbe5e34d, 0x3a912026, 0x0051bd1f, 0x8bd7cc3b, 0x9c990739, 0x89c4ed57, ++ 0xa3fde85f, 0xb0b53b46, 0x7da3c479, 0xfd9bc209, 0x59b080bd, 0xf6f4b3b5, ++ 0x4c4a786b, 0x279095bb, 0x77725e91, 0xf7834f66, 0x6b7f7275, 0x73b8c272, ++ 0x3757bd38, 0x5ff7c65e, 0x167048aa, 0x8a355794, 0x788120ce, 0x023751a1, ++ 0x5f7aa8bf, 0xd5d34b85, 0xf070eb16, 0x3a2ebdaf, 0xe6bd4057, 0x470e90cf, ++ 0xea2afefe, 0x19668ea5, 0xdea93fdf, 0xbe63a9f3, 0x68effec6, 0x74a2ef66, ++ 0x7fd49f36, 0x11b94a6f, 0xb1336dda, 0xb7feed7d, 0xf20096fe, 0x2f5737e6, ++ 0x5a7ee0a5, 0xfb06fbd5, 0x1b4f68da, 0xe62265ed, 0xabb8811f, 0x889944a2, ++ 0xee0ed442, 0x223ff7a2, 0x5749da8f, 0xf6085ffd, 0x0ec31884, 0xe3a670e0, ++ 0x4647c049, 0xe76820bb, 0x927f68f6, 0x3602ef0b, 0x82594d5d, 0x139b4cf7, ++ 0xefd02b9c, 0xce9decc3, 0x367fe7fd, 0x121fbe0d, 0x57033bd9, 0x37a7e445, ++ 0x18192ef7, 0x4a87c0d2, 0x95dfc444, 0xde3b173e, 0x1caff5a0, 0x707e6788, ++ 0xf6a37dc9, 0x7eb442be, 0x982bc380, 0x94d3cec1, 0xe7ef780c, 0xedb3db1b, ++ 0x1fe5f65d, 0xb4a91c83, 0x5880a786, 0xcdb1b21f, 0x639ff80c, 0xc989fef7, ++ 0x80048697, 0xfb0a428b, 0x596e3a12, 0xba04293c, 0x2712d70a, 0x3cedefc4, ++ 0x5e013268, 0xc4c96d46, 0xf8579b38, 0x86e2e379, 0x46a6733a, 0xe7e62d6e, ++ 0x65656755, 0xfbe6b240, 0x2f930742, 0x3f940f67, 0x03f7f28f, 0x431c190b, ++ 0x983916df, 0x5661dc9c, 0x7a856da6, 0xef784c27, 0xbb5bff67, 0x657782df, ++ 0x8d771f17, 0xd035fd00, 0x4d7ac2e1, 0x77c15e87, 0x223e9ae9, 0xdbcdd5e8, ++ 0xe89a225c, 0x17106fb8, 0x311dbff3, 0xe23a7ee1, 0x149e24b7, 0x073f6758, ++ 0x71becfdb, 0xdf3ba4d0, 0x7fbf837a, 0x3930776a, 0xff983a24, 0xc2c1fb6b, ++ 0x7307d014, 0x03b33eec, 0x6854eff8, 0xf5414c35, 0xd7f6a9d7, 0xa7db23b8, ++ 0x1cffa30d, 0x02726ed7, 0x5e475dba, 0xaebd6110, 0x092484b3, 0x463d8ba4, ++ 0x523a73fb, 0xd1bdfda3, 0xf3a3face, 0x55f81378, 0xb0783f85, 0x8dfe6873, ++ 0xe2192956, 0xabf854b3, 0x77c750eb, 0x26cf1035, 0x6792b21b, 0x8df857fb, ++ 0x91d0f8d5, 0x5bbea24e, 0x0bf9748f, 0x40e5c7bb, 0x3ed0507a, 0x1e207b3e, ++ 0x5c1d9ced, 0x92f4923f, 0x1c3fc881, 0x660e054f, 0xe9f3a8ef, 0x8e7cfc6e, ++ 0xbafd357f, 0xec8afd74, 0xf86e9052, 0x252e83fb, 0x3886cd68, 0xfc6ca6b0, ++ 0x389a3abb, 0xff9c7cd9, 0x737bfd59, 0x0993214d, 0xed5571ee, 0x59f09211, ++ 0xcbda1e93, 0x1a933a11, 0x8e9afe90, 0xf2e3e413, 0xdf9907fa, 0xfe1bca90, ++ 0x839e172e, 0xf3f0ff03, 0x4d023ef0, 0x5a6f35c7, 0x1be117d9, 0x455f0074, ++ 0x06f944e1, 0x333a9ad2, 0x65e2ebd0, 0xcfc45d2c, 0xf06f1795, 0x6e967f21, ++ 0xb381f164, 0x8f38991c, 0x895e9c0b, 0xe2033e29, 0x4ddb0e47, 0x8fcaf3ba, ++ 0xe99e2ced, 0x16fae35c, 0xd7d29718, 0xf1d7a05c, 0x0d3e4f4d, 0xf5e955d3, ++ 0xfb1966dc, 0x9fd78b29, 0xbc7097bb, 0xe8c23cee, 0xb966dc7d, 0x1a85de10, ++ 0xf82710a7, 0xbcd8dfa1, 0xfdf90445, 0x2673d006, 0xb7d073e3, 0x9e3c0f67, ++ 0x73d07df0, 0xfe02266d, 0x52661dee, 0x17c34db6, 0x5afd37fb, 0xf5e5bfc7, ++ 0xafd0d3b5, 0x40164a1e, 0xab7cabce, 0xd9877dc2, 0xfff22b7d, 0x9ffe061d, ++ 0x0d3fdacc, 0x5aeba178, 0xfd7ff9cf, 0xf4ffca54, 0x24e6d253, 0x61d9fa01, ++ 0xd84efd8e, 0x7f486fda, 0xea1ab911, 0x3ad75722, 0x1c86ae50, 0xaafc74d9, ++ 0x9fa12fdb, 0x4e3f3220, 0xab27eb37, 0x00299374, 0x0628ebfc, 0x28bc0107, ++ 0xa99e815c, 0x8cff7c3d, 0x83cae41c, 0xf0d39e12, 0xbf1e2073, 0xabf9c6a1, ++ 0x67951afc, 0x7efadf2a, 0x9bc8f309, 0xec12b35c, 0x056294f5, 0xe09cf3e9, ++ 0xf54c981b, 0xe3e039d9, 0x3960f218, 0xd915c787, 0xcff7ad77, 0xcb9e8033, ++ 0xd60fcee8, 0x4e0a3643, 0xee5a8bc0, 0x27f6c8da, 0x523cb8bb, 0x6ff9abbf, ++ 0x9770ef0c, 0x39772377, 0x36132fd0, 0x90e99c43, 0x4463d300, 0x207e4428, ++ 0x8032dba6, 0xfd5316cf, 0xfe8d5df5, 0x21d7273a, 0x0870aa9d, 0x2575b972, ++ 0x86bbad89, 0xb039f3cf, 0xe06b46f5, 0xc092482f, 0x181459f8, 0xffd08b9f, ++ 0x6fe303b9, 0x3dbf7a45, 0x613bbd36, 0x7f0c94df, 0xd2136757, 0x2754d267, ++ 0x2f5943de, 0x7492e3b9, 0xd30051f6, 0x817e5bfd, 0x5fa035fb, 0xe8eef7e0, ++ 0x9fe80cbf, 0x00fba0c4, 0xfe0d7ba5, 0x74a03a54, 0x234391f1, 0xa1748c1f, ++ 0x70aa179e, 0x6f3861d9, 0xc9912ebc, 0xb970bf83, 0xee26eae0, 0x37cf5d45, ++ 0x2ed9f3c6, 0xe46cbe78, 0x2ab7c02b, 0x835f8e1f, 0x3a2566bf, 0xfb6bdfd9, ++ 0x99c63e78, 0xa773f1d4, 0x3a9e3e06, 0xd051396f, 0xcf194f9d, 0x7c125a8d, ++ 0x7ceea252, 0xcae8a96a, 0x1147d289, 0x6e9767b7, 0xfdb9e0b1, 0xbc012836, ++ 0x680f8fed, 0x253a85ef, 0x5052786a, 0xc4cc4af7, 0xe1f4ab79, 0x83266e5a, ++ 0x4ae5fee8, 0x887ec966, 0x55a5b9df, 0xd7461e29, 0xdcaccdb1, 0x03ee3b7d, ++ 0xff42b7dc, 0x9c9b16b7, 0xe491cf10, 0xd7e00a71, 0x7c0d1540, 0x338d8878, ++ 0x237ddb32, 0xee5d7fee, 0x060f2091, 0xf8a9bc70, 0x9dd0e155, 0xaf0eeb9e, ++ 0x527c38b3, 0x8e51b979, 0xa6f9c17c, 0x96d7a795, 0xfc088a23, 0x15be20e4, ++ 0x9f3fcc22, 0x1c88bfc9, 0xae7827c9, 0x2f513138, 0xb7fcd447, 0x26264728, ++ 0xd8c8e56a, 0x42394c50, 0x3ff9317f, 0xb442f375, 0xd8f1c963, 0x899dec76, ++ 0x82a70f4c, 0x52f5a4fe, 0x6e77fe15, 0x791c5d13, 0x58f71875, 0x7182d9b7, ++ 0x721caade, 0xe10a4ddc, 0x403ae6ef, 0xbbad42df, 0x866fc77d, 0xb374def3, ++ 0xcf9fce0b, 0xfbc461c9, 0xaf01ba39, 0x0af0fa43, 0xf218ef80, 0x441f8088, ++ 0xe63f63f9, 0x919b17bf, 0x1116964f, 0xb7fb9fd4, 0x2aba418c, 0x8012ce2b, ++ 0x93ebcb6e, 0x9e4f2804, 0x9c8134ec, 0x6631d752, 0x1a0c89b9, 0x30b07c89, ++ 0x318f8351, 0xfdfe0d4a, 0xbe2981dc, 0xee893974, 0xdf7713d3, 0x3d03f5a2, ++ 0xd2ebf348, 0x9a207ea3, 0xd3eb635f, 0xb2d03f73, 0x035a6d7f, 0x9d64277f, ++ 0xc614b3c3, 0x2ef0496d, 0x77af3483, 0x7234488d, 0xdbf65aeb, 0x6a97a537, ++ 0xad226fee, 0xe9a71a54, 0xeaf3bbfc, 0x5ddfe85d, 0xcaa9f303, 0x7434fd38, ++ 0xc462ef87, 0x3cd9b7b4, 0x40b9717a, 0x8f88223e, 0x111ade5e, 0xdcaa2ffc, ++ 0xbc870f59, 0xc02cbf6c, 0x6fca8ab9, 0x8ec0b720, 0xc02ae356, 0xff4765ff, ++ 0x43eb007f, 0x2f63513e, 0xc5362bac, 0xe5f9177c, 0x2ab7db44, 0xdff3499f, ++ 0x8f3f7d77, 0xc88b1bc7, 0x7e332f4f, 0x7d7af262, 0x763489f1, 0x0fdec1ae, ++ 0xf18f887c, 0xeff70afc, 0x7d15ebaf, 0xc58461cf, 0x2afc40ac, 0x539710f1, ++ 0x342cbf13, 0xc43b410b, 0x760dfec3, 0xfd9f746c, 0xcfa61337, 0x353bd8ff, ++ 0x26f8ec13, 0x18fc1b93, 0xa47efc55, 0x7bc1207b, 0x7dfc0d2d, 0x9b1682c5, ++ 0x7f051e47, 0xefcac5af, 0xe7f47b5d, 0x03c36325, 0x95f2d2b6, 0x1bfc16cd, ++ 0xea059d8d, 0xe370e1df, 0xbe1567bd, 0x3f59dfc3, 0xa544e314, 0xd9f0373a, ++ 0xffac710b, 0xfad4e217, 0xd7d044ae, 0xe7db9ddd, 0xff42cf2f, 0xccafeaa1, ++ 0x8045070f, 0x65d8564b, 0x6c72c162, 0x704c291c, 0x7e79eabd, 0x8efb8703, ++ 0xd045db83, 0xeb9379e3, 0xe73ec256, 0x28efbb0b, 0x7cf8ddd0, 0x4a379dbd, ++ 0x778169a8, 0x04adc931, 0x7f2a47f7, 0x3ec884a4, 0x8e926930, 0x32a03c87, ++ 0xecf59fc7, 0xa2647d83, 0x9fd00897, 0x0da88e26, 0x3cbd25fa, 0xe0bdedc2, ++ 0xbff2e1ef, 0xd9fbc95d, 0x0050b071, 0x3ad5ef7e, 0x74e57059, 0xb00defa5, ++ 0xe2c51edf, 0xeaaf005d, 0x7fe0703e, 0x877f80dc, 0xc9df5220, 0x3e09cdec, ++ 0x397024df, 0x8184f5d3, 0x0ecdc66e, 0x5793c0b4, 0x1694ca63, 0x9eb34bb3, ++ 0xebfb04c5, 0x1d70521b, 0x0afb8e7d, 0x93dbb520, 0x67f19fb0, 0xd3271883, ++ 0xf86086bb, 0x23d6ff50, 0xaff53f68, 0x8f001569, 0x89be0e3b, 0xbad7edf3, ++ 0xaf9ca59f, 0x407b73b6, 0xfb9d979d, 0xa676ed67, 0x7737fe67, 0x006a4c28, ++ 0x00006a4c, 0x00088b1f, 0x00000000, 0x7dd5ff00, 0xd5547c09, 0xf37df8d5, ++ 0x9932cb66, 0x93b264c9, 0x01476130, 0x5bb09027, 0x0a300427, 0xa02901c1, ++ 0x48049c46, 0xd881b258, 0x0cd7eb62, 0xa4623004, 0x054552b1, 0x51f8281d, ++ 0x8d361a8a, 0x9004e835, 0x558d0506, 0x2f96ac5b, 0x225d8608, 0x62d8bf58, ++ 0xf739cef9, 0x97bcccbe, 0xffe97004, 0x1f87fbf7, 0xeef39bbf, 0x7b9df77d, ++ 0x92ee7bf6, 0x2567e795, 0xa6300678, 0x962d79b7, 0xffbac64c, 0x2cb186e1, ++ 0x5995b18a, 0x48f284de, 0xf636d6c6, 0x06407478, 0x3a43be63, 0x63276f57, ++ 0xb18c4937, 0xc15d8c11, 0x8b185b9f, 0x831919b1, 0x78b2eef7, 0x96506d23, ++ 0x603e68cd, 0x1a3b2680, 0x85e51cff, 0x83bd59f7, 0xe2c644b1, 0x80d67d0e, ++ 0x612dc4fd, 0x6b61ba0c, 0x18922d0f, 0x63cdad54, 0xf60a5a2c, 0x2c625f07, ++ 0x5e09b196, 0x10ec6baf, 0xa72c67a8, 0xb661fb16, 0xc616c988, 0x4ded157e, ++ 0xed28efc4, 0x23dbe427, 0xc086447a, 0x2b27bde2, 0x2f766b98, 0x2fed86c6, ++ 0x307ac9d8, 0x1bc22fb6, 0xe06f7aa6, 0x8c2f308a, 0x7748e9fb, 0x20bf3e1a, ++ 0x9df819b1, 0xf3c258ad, 0x5b0e06ad, 0x67c23a2c, 0x52a24d81, 0xb16c9b6f, ++ 0xd93a72c4, 0x30bb4106, 0x57e94ede, 0xe9b3ef29, 0xe64e2e88, 0x26b1fa24, ++ 0xe3336b9d, 0x0c0cf0e3, 0xfa2f1bb6, 0x66f6e51d, 0xcdb6a1eb, 0x01b4cde2, ++ 0x7fb8623c, 0x1a840c9f, 0xa7dbe396, 0x95853287, 0xbd00b3ef, 0x7ea30e58, ++ 0x03599a62, 0x1f4589b0, 0x41477669, 0x9d9b54fd, 0x54f237be, 0x67ba432b, ++ 0xe383cc48, 0x2395e2d0, 0x8d3472f0, 0xd2245891, 0xc70633c5, 0x5cb9343f, ++ 0x0e2a0036, 0x7ac09b66, 0xcd8f7632, 0x190d7849, 0x2327deee, 0x8c8f6ed6, ++ 0x6117defd, 0xa657f7a3, 0xf780f971, 0xccfbe027, 0x017296e1, 0xc3ffa1bf, ++ 0x77002ad8, 0x9c918e35, 0x633bf003, 0x1b98c979, 0xf903b4e9, 0xdb978219, ++ 0x8f7be9c6, 0xfec743a0, 0x1e9033bd, 0x5b9d268e, 0x1d864e82, 0x6833f489, ++ 0xb9716c3a, 0x583bf88c, 0x4100c493, 0x165b5cfb, 0x2e4b2248, 0xd7c84976, ++ 0x4ccf08fc, 0x0f03f51b, 0x759e5033, 0xef784afe, 0x926e519f, 0xc25b05f3, ++ 0xc4cc276c, 0xfe057610, 0xab46d497, 0x44bab2e0, 0x417e89db, 0x02fe0178, ++ 0x33f6cc72, 0x58ca1b33, 0xcf62af31, 0xf805decb, 0xf373129d, 0x4b807cea, ++ 0x91b5ff7f, 0xddc648e9, 0x8d1dce38, 0x420a2383, 0x8e3963e4, 0xefc55333, ++ 0x2d7df1fb, 0xc12433bf, 0xdf80dbef, 0xb6fc8ece, 0xbf05a258, 0x5657a4dd, ++ 0x7df0930f, 0x717fd7a0, 0xa087787e, 0x169a399c, 0xd8f00ccb, 0xbc88fc89, ++ 0x79143f36, 0x3f3858b7, 0x45543e14, 0xbf6257b8, 0xfc41d016, 0xeb0c6fae, ++ 0x27abcf87, 0x9dfc72ea, 0xb633d9c8, 0xdf37ae48, 0x98a7ce97, 0xe905c59e, ++ 0xf5ffeacc, 0xee802fca, 0x4cbbf865, 0xe5067f74, 0xd51ee802, 0xc4fdc613, ++ 0x50e2cfc4, 0xd6e6753e, 0xa3d01283, 0xca765ea4, 0x87ca8430, 0xffe46eec, ++ 0xcb92b5f3, 0x97a9f484, 0x5f9e1e49, 0xa537ee19, 0x62fdf105, 0xbb1075b7, ++ 0xffa14a09, 0x2197d02c, 0xc5a2cb9f, 0x03007df7, 0x1c6c173e, 0xddeaca7c, ++ 0x9e4f6a1a, 0x1847ffaf, 0x04c6f9d2, 0x0c44e036, 0x7b5370b6, 0xb1ff6b03, ++ 0x099fd049, 0xae90937f, 0x2a3255e9, 0x4eef34d6, 0xdb7c4c93, 0x630dfd85, ++ 0x0d1e7fcd, 0xdb61fd78, 0x44379d18, 0x7dd52e6e, 0xe02f7335, 0x3511165f, ++ 0x8f015988, 0xa0fb97bd, 0xb7f5299c, 0xbb20292f, 0xddec80f7, 0xdbd78a13, ++ 0x3b738efd, 0x2d6cf2cc, 0xdda7e237, 0x200895d2, 0x9fb99461, 0x92e0e81e, ++ 0x7c325dc3, 0xf79c36af, 0x948fb59b, 0x06f6558a, 0x1afd20fa, 0x957e89c2, ++ 0xd2ef41bd, 0xb1b7cf08, 0x2316fdff, 0x97e7844b, 0x9db11f40, 0xc0f7f782, ++ 0x63e403f7, 0xd9bb7c47, 0x5c84225a, 0xdafc41c8, 0x807c82f9, 0x9e8b65fe, ++ 0x858171c6, 0xb59f90bb, 0xfe433746, 0xbd728efb, 0x2a56f851, 0x7d42ee64, ++ 0x8c2f11e6, 0xdd23f9ef, 0x85fef85c, 0x3a614bba, 0xadefdef8, 0x878813de, ++ 0x851ad29c, 0xfd5f70fe, 0x03cdfea5, 0xe0b5bec8, 0x8e874bf3, 0xbe03bddb, ++ 0x5c2ef8d7, 0xf4caf8cf, 0x95925591, 0x8b69c6c4, 0x8ee11123, 0x52472352, ++ 0xd237c37d, 0x863fd220, 0xca97d0f6, 0xee3095fc, 0x3c850395, 0xd44e654d, ++ 0x9fbf2d7b, 0xd8ae7ab2, 0x9576f442, 0x674523d5, 0x0f24eff2, 0xd1ca71a6, ++ 0xc3a0e780, 0x741886b3, 0x0cb1be38, 0x258f66fd, 0x9071d863, 0xf9999367, ++ 0xa49da0c2, 0xe0c33e67, 0xc7daf8e0, 0xa0f2fbdf, 0x1bc68c43, 0xf202fd85, ++ 0x5f8074cb, 0x55833819, 0x0ee3a169, 0xc44aff10, 0x91cc4af8, 0xc3c61901, ++ 0x35ce1976, 0x47a0762b, 0x3f81fc47, 0x6f9f8889, 0x1788eb8c, 0x48b7fbf9, ++ 0x47d22557, 0x58f364df, 0x58c93c68, 0x27e786cf, 0x45f7f8e0, 0x9da147b8, ++ 0x9194badf, 0x91785f3c, 0x60c237f9, 0x91d7efb7, 0x37606cbc, 0xa0dfdc90, ++ 0x13d338bb, 0x1bdcfa49, 0xaa68cef1, 0xeddda1d1, 0xd0ea77ed, 0xaa6ff69e, ++ 0x0e48e9d5, 0x7d04fdbc, 0xbf01e92e, 0xcb95b71b, 0xd21e53df, 0x3f43afa3, ++ 0x7c995f81, 0x0a5f9cbc, 0x390b46dd, 0x43748d18, 0x3faad087, 0xd20e6cd7, ++ 0x92c3f80d, 0x63fb1ded, 0xe91539ac, 0xc9daf0d4, 0x5fd0cd3e, 0x67271be9, ++ 0xff4a5d22, 0x18212268, 0x56fec7fb, 0xb22ff794, 0xce678f3a, 0xf4bb9455, ++ 0x24fd4f10, 0xf5d907ba, 0xc464d662, 0x76a4a138, 0x621f4ba1, 0xedf895cf, ++ 0x2269a190, 0x53287ff6, 0xce814b66, 0xe2c35c97, 0x427e2759, 0x78c5df29, ++ 0x418f700d, 0xafce91dc, 0xfc795865, 0xa07f2768, 0x62a87f6d, 0xaf6c6bae, ++ 0x943bfbae, 0x0fc3361e, 0xc4d44fef, 0xdcd16541, 0xcd123daf, 0x641830fd, ++ 0xfe79e237, 0x07df8b15, 0xfe0fce8f, 0x9d018a28, 0x60faefce, 0xe8e40f88, ++ 0xffba6b3c, 0xafb3d475, 0x5dc61922, 0x1a3fd313, 0xd412d4b2, 0xf3879bcb, ++ 0xeafcdfb1, 0xb42728e1, 0x9f7db89f, 0xbf4217c3, 0xabfe999b, 0xc34eb976, ++ 0x31f1f2ef, 0xe41f737d, 0x74fd7b07, 0x89ca139c, 0xe0e5bdaf, 0x43a71072, ++ 0xf6162f3e, 0x147c65ed, 0x5c4f6f12, 0xa4724a52, 0x666d25c0, 0x81098fe6, ++ 0x74464df5, 0x916d25bd, 0xeeed0fcc, 0x5038b68c, 0x4b12580e, 0x25d33b42, ++ 0x9e93aebd, 0x3d0ae7da, 0x4e9fa50f, 0x8be2b8c5, 0x3ae1e22e, 0xee5daed1, ++ 0xd74e202b, 0xbe77e107, 0x74f3ef95, 0xf13adef2, 0x88d725de, 0x26f78c78, ++ 0x6cbd031a, 0xcc63b49d, 0xd2d4fc4f, 0x45cbede9, 0x2befd811, 0xce9ca66d, ++ 0xb46dfaf0, 0x29c587ee, 0x90ab0087, 0xf65ab078, 0xe22d18be, 0x970029c1, ++ 0x1e34bff6, 0xbcbb40ed, 0x3377bb08, 0xfea035f3, 0xe143e56a, 0x1be46ef7, ++ 0x4b326dea, 0x2afdbe46, 0x46e5c9da, 0x1fa283e8, 0xcb6a3a5a, 0xede64609, ++ 0xbab01e6c, 0xcc61ae9d, 0xfef0f607, 0xeff2060d, 0x75ff2f87, 0xf79010ea, ++ 0xb60ceb93, 0xb9c9f065, 0x7b75f7eb, 0xa6e7ea02, 0xc0126c9b, 0x5e819d27, ++ 0xeb45f7a8, 0xc3ca0f65, 0xc7f775c9, 0x2cf282cd, 0xe0316fe8, 0x40c1b451, ++ 0x786ee7cf, 0x169f9e80, 0x3eb45d7a, 0x97b446f6, 0x8aaff787, 0xfdce3e43, ++ 0xc869e1f6, 0xdb46ed97, 0x1650e98d, 0x635c936f, 0x7f3de843, 0xde0a9853, ++ 0x717363ae, 0x995f0a1c, 0x77af6de4, 0xd12d3e02, 0xbdf35e7c, 0xc75018f9, ++ 0xb65f109b, 0x72f8f344, 0xee309dd2, 0x144bccd2, 0x103befd7, 0xcde4fe4e, ++ 0xc7e29948, 0xbefffa40, 0xd9c01373, 0x145deadf, 0x8f3e09db, 0x2c667c13, ++ 0xa176ec81, 0xafd9c399, 0xccfe29e9, 0x6f44c8b6, 0x0e391f68, 0xda227fea, ++ 0xa2cec007, 0xf479321e, 0x6ed0119a, 0xd0c0d59c, 0x3024fd0f, 0x3f03227f, ++ 0xfe9b4b79, 0xf190e6b3, 0xfd35618c, 0x62ce1e30, 0xb773cd06, 0x9b679f1e, ++ 0xf5c7cfd5, 0xc634fdba, 0xea6ce30f, 0xe9dc8ae7, 0x84ee42ed, 0xe077d8bd, ++ 0xc0266fcc, 0xc90f0af8, 0xcb5f3f14, 0xf88bbf1e, 0x6fcf91eb, 0xf7836de7, ++ 0x1caa0b0e, 0x79727cbe, 0x70d5ca22, 0xf8032d89, 0xf5cee5e4, 0x4b908271, ++ 0xfdbf80c6, 0x75cdfc82, 0x51876bcd, 0xbe18efdd, 0xfc461db0, 0x5d8edfaf, ++ 0xa2054edd, 0xeb433e79, 0xf37ab437, 0x131bf29f, 0xf54adfd3, 0x017ca859, ++ 0xb9db73cb, 0x09dad5dd, 0xad589fad, 0xff41afb1, 0x87f953a0, 0x048ec2d5, ++ 0xfc9184fd, 0x1f388fc4, 0x3277b5ce, 0x8638861f, 0xaa1be5e8, 0xc43879a7, ++ 0xddb0535b, 0x4c674880, 0xc5e71396, 0x9ed0223d, 0xfde91d3d, 0x0f243da9, ++ 0x1ab6e375, 0xf68dda1d, 0x9d418cfc, 0xabe651a7, 0xfe3e7679, 0x61873b2c, ++ 0xfcf34abe, 0xa557e2ae, 0xb5ef257f, 0x3cf18b32, 0xa78f3441, 0xea73f47b, ++ 0xec0f386c, 0x7e43a097, 0xf1682fdd, 0x80c24548, 0x8fdf2013, 0xc4a93856, ++ 0xf3df1c38, 0x71a70ded, 0x06792e7d, 0x223ddea1, 0x1b5f2e75, 0x60ee22ed, ++ 0xcafff21e, 0xba6339f3, 0x3d76d3b0, 0x7793d71f, 0xf67c62a5, 0xa9ddc379, ++ 0x073f3f68, 0x5e309b7c, 0x57acbbd0, 0x171eab8b, 0xf098f8fa, 0xde62d113, ++ 0x13d46bff, 0xdd9b4180, 0xb8e007db, 0x8f37a43c, 0xf2a0cc56, 0x54258a89, ++ 0xa34f6e5f, 0xfeb2dbef, 0xfc09e9ec, 0x932d513b, 0xf463981f, 0xf78689f4, ++ 0x9475984e, 0x1e5e383f, 0x122bb399, 0x2f9a339f, 0xc27279ce, 0x5e485f66, ++ 0x91c71caf, 0x3738f5d9, 0xfd9fbfda, 0x51cd612e, 0xe5da8fe8, 0x7f0748f1, ++ 0x163dbcfc, 0x71cd87e7, 0x6a4caed8, 0x268db3ea, 0xa1a9ad57, 0x224fb879, ++ 0xee511bdd, 0x46ec8d6a, 0x70da8bd4, 0x78b46fee, 0xf672156e, 0x213f4548, ++ 0x2701ae07, 0x440b5e80, 0xfa39fadc, 0xfef84ea9, 0xcc2f78b2, 0x4ed97ee2, ++ 0xf8a48ffc, 0xf201c69c, 0xdee51d52, 0x3cc27881, 0x4396176c, 0xce3e79e3, ++ 0x7b09b162, 0xbcf896e8, 0xbd9af3c6, 0x575b7c93, 0x1e2d1df9, 0x3a70c677, ++ 0x4a3ef36b, 0xf67de4a9, 0x63dcf18b, 0x71f2a9b7, 0xeee65ace, 0x1693df2c, ++ 0x09f6a463, 0xe11cb76e, 0x32ef5aec, 0x64f99fbc, 0x60cd6bcc, 0xc450deae, ++ 0xc06dae8f, 0x58e2577c, 0x87cc52ff, 0xead68cad, 0xe70c2fa1, 0xbabc3d63, ++ 0x8bb41f38, 0x1966f26b, 0x6b168f01, 0xcf15e11c, 0xbf2297ca, 0x1a3abc32, ++ 0x70fec674, 0x9e4ca4bf, 0x6110c9a1, 0xc343411f, 0xb29edf50, 0xfd218f78, ++ 0xaf2ece86, 0x5f313a34, 0xdc79a3e8, 0xdddbc969, 0xfa71f20e, 0xe34ef0ad, ++ 0xde8a8bdc, 0xd092634a, 0x326c67a5, 0x36321d10, 0xe22676fd, 0x56e9b19b, ++ 0xff9214bd, 0x50318a88, 0xcd6fd3fb, 0x88f94eef, 0x77ac4d8f, 0x8d7ec75a, ++ 0x16dfbc31, 0xc69def41, 0x174ee5ce, 0x38b0fd23, 0x1be219b5, 0xc5d69db5, ++ 0x67f30664, 0xc91725a5, 0x73b51f4e, 0xbeacf0ff, 0xd01240f6, 0xccd9d9f3, ++ 0xbf9f7485, 0x55e50365, 0x6f6b1a77, 0x29e386db, 0xafcc31d5, 0xc7f03fec, ++ 0x1f184903, 0x63a676ce, 0xfefed07c, 0xf12bada1, 0x5973b3f9, 0xd13fd23a, ++ 0x7984b8ff, 0x6ac3af96, 0x6f5f5e88, 0x30a5b136, 0xd7ef79a4, 0x800bf6de, ++ 0x18eb16d7, 0xb8ed15da, 0x5d064be1, 0x83019602, 0x3fe7386e, 0xef853fda, ++ 0xe4465820, 0xa437c287, 0xf72876df, 0xf0957e6f, 0xb16af057, 0xf3ce893a, ++ 0x0dbf6cb7, 0xd8a924e5, 0x5ffce12e, 0xfa87ebc1, 0x7fd11f89, 0x5ec4c666, ++ 0x191cff97, 0xd4ff89d3, 0x23a7cdfa, 0x7f6337dd, 0x079ff2d7, 0x1fea7d84, ++ 0x75f6e1c3, 0xca3a438b, 0xb2f969a3, 0x8f21dedf, 0x7be6313d, 0xb15fb1e4, ++ 0xda7be9db, 0x2356f63c, 0x7635a3b7, 0x4ee4df76, 0xc0bb61f4, 0xd5a6b757, ++ 0x51d17e88, 0x976a752f, 0xcf1e162c, 0x2fbcdd81, 0x439d6426, 0xa13b576b, ++ 0xefb6216f, 0x17b02dbf, 0xee8e0d5b, 0xd7618115, 0x9e60570d, 0x4a77c9da, ++ 0x173a7e85, 0x4ed0b703, 0x47b23396, 0x3279fb00, 0xfda1202f, 0x61947e01, ++ 0x6f5ad7bf, 0xd166b26a, 0xbeb2933a, 0x549562d4, 0x3135dbf3, 0x83f73b4a, ++ 0x174a5fd8, 0xb0a97ef6, 0x1f7e302f, 0x316381ca, 0x28a3ad53, 0x728e27eb, ++ 0x40cc649f, 0x2f28c2b7, 0xbbc63dda, 0x5aed00d4, 0x46d73047, 0xb679ad80, ++ 0xf697b42c, 0x5c06aeb9, 0x9e795967, 0x2e57d1e7, 0xd465fe64, 0xf32f1f0f, ++ 0x4e6ff0f6, 0x9d0b7ce3, 0x457e2bcf, 0xbbf81f19, 0xd78e189a, 0xe2ae626f, ++ 0xbd447eef, 0x5ea75ff2, 0x7c2efe6d, 0xf93af17f, 0x896184ee, 0xf7ed1375, ++ 0xda5e2276, 0xec9c81ef, 0x59391eba, 0x25d75df1, 0x361fa423, 0xd748ee4f, ++ 0x893a6277, 0xea27abf7, 0x9c71e9fa, 0x99d5dc2c, 0x131a3bdf, 0x1f5e9ff9, ++ 0xadf82a3a, 0x1f821f5a, 0xfcff3c55, 0x7d7bd732, 0x6577cf11, 0xff3da79a, ++ 0xf22366ab, 0x506f5959, 0x27fb2df0, 0x87f82448, 0x51d4ff0b, 0xf5f7aed9, ++ 0xf79c10d2, 0x4cbbed65, 0x8685f9f1, 0x7e7c527f, 0x2b9f1341, 0x72845ddf, ++ 0x938cf800, 0x2e7f4923, 0x0479e3ae, 0x1a9f3999, 0x46f2f98d, 0x493bf303, ++ 0xa17e29fe, 0x117c02f1, 0xc5bf6c4b, 0xa2cdf348, 0x06873b83, 0xb87591e0, ++ 0xe843398e, 0x670eed15, 0xc57a10ce, 0x7055d8e4, 0xd54927ac, 0x0f467e3e, ++ 0xf7a27d55, 0xf27d5506, 0x382ac1dc, 0xaaa47ca5, 0x9bf0777d, 0xef9a70a1, ++ 0x9efb5576, 0x70545355, 0x55bb9aef, 0xddcf99ed, 0x39c60bd4, 0xefb38c5b, ++ 0x7b5502da, 0xae009f50, 0x6c11cd9b, 0x7c75bb3e, 0x640e04a3, 0xf487c8b6, ++ 0xf557cff7, 0x9d46a737, 0x023a20d7, 0x24eb0add, 0x6dd20cf6, 0x6e7ebaad, ++ 0x932be3fd, 0x57e79ca1, 0xeb8f9f3f, 0xa7ca1259, 0x9d6ef9fa, 0x479c7ee7, ++ 0xf3a877f4, 0xafe4d724, 0xf8b5efaf, 0xfb600aeb, 0xb78a166d, 0x22ce0e8a, ++ 0xa825323d, 0x0ce61bf9, 0x22fd2abf, 0xf535d9fa, 0xf42aeff0, 0xf2d4b8b3, ++ 0x9e9fa5a0, 0x06481eb5, 0x92fd4abc, 0xd23ac02b, 0x06dd5e6f, 0x3f4b53c2, ++ 0xd0eedd2d, 0x845f6bd0, 0x13238a77, 0xcb164dd7, 0x72c4ceb8, 0xa5f57af8, ++ 0x1d06afba, 0x95d6aa72, 0xb9475aba, 0xbac9d1db, 0x475c05da, 0xc75d89bb, ++ 0x6fbeda3a, 0xf0260e90, 0x27e00658, 0xb732ee1b, 0x05859baf, 0x76b44dd7, ++ 0x6ec1294b, 0x3d90702f, 0x5637ae0f, 0xad43dbc2, 0x9e50f17f, 0x293fac50, ++ 0x7d9451fb, 0x8f922c33, 0xe807e953, 0x33f63f70, 0x811ecb21, 0xfbedb7f3, ++ 0x447cd117, 0x2c8337d9, 0x121f6d0f, 0xacfd9317, 0xc9135fc5, 0xc1c2fe9f, ++ 0x5843e9fd, 0x0594fe2a, 0xc2bbfcec, 0x8fd5769f, 0x55d4ceb2, 0x6995ed29, ++ 0x0a55acdd, 0xc4ec6d77, 0xf8e93f9e, 0x5393f381, 0x4faff21d, 0x27e7423a, ++ 0x803a5c0f, 0xfee81d76, 0x08e283b4, 0xd05297f0, 0x11153e5f, 0x7ad6fa45, ++ 0x85f7f650, 0x4ecd1707, 0x70407dab, 0xef8b4c3d, 0x00d27368, 0x4a3ac87d, ++ 0xb35f26bd, 0x5f8f3072, 0x5ae3105e, 0xedfdc91d, 0x6997011e, 0x55650be6, ++ 0xda0c5e7c, 0x243eb730, 0xb0e3d84e, 0x447179f0, 0x7bc41ed6, 0xac2bc883, ++ 0x7be8934c, 0xfc89252b, 0x31d683fa, 0xc8ec5f54, 0xb772c7aa, 0x3de9fb83, ++ 0x59415318, 0xe3e383d3, 0x944afb14, 0xf68897fe, 0xa8631c4b, 0x89b0e3dc, ++ 0x0376c9f8, 0xe11cdbf2, 0x728d7ea6, 0x7b2bebe7, 0xd01f3c1d, 0xb193730b, ++ 0xf2513d41, 0x1d85e3d7, 0x89b57cc3, 0x713dc994, 0x5f305c5c, 0x1fd1e4cd, ++ 0x4f221d1a, 0x6eebd12d, 0x08b737b4, 0xb795763e, 0xedb3f776, 0x8e9165c7, ++ 0x4240eb79, 0xd76b79a7, 0xc35bca78, 0x971c7a9b, 0x7c8d7f36, 0xf507b088, ++ 0xf68eefe1, 0x686eaf75, 0xde8cea6f, 0xb4879c4a, 0x167886ee, 0x37f3f71e, ++ 0xe07b5e53, 0x9c2e9ea1, 0x634cac6f, 0x3f282d7b, 0x78c3194b, 0xb759aeb7, ++ 0xabea0c2c, 0xf586cc7d, 0x79f1d623, 0xa75ad14c, 0x8069870b, 0x7065a1f9, ++ 0xedffbf50, 0xd5fa2688, 0xc0694f35, 0x54f5773c, 0x50b74766, 0xa3b26ac3, ++ 0xc758be30, 0x7d479d3a, 0x4269e423, 0xf5195ed6, 0xe415b63f, 0x7d3e13a8, ++ 0x07f2e0e3, 0x7a86ddfa, 0x7bd5ac31, 0x712baf89, 0x0e2640fb, 0x75fb6be7, ++ 0xdf6b7f14, 0xf65467ff, 0x060e51bf, 0xdfcf3bfa, 0x7970b2f4, 0xd1e1181b, ++ 0x5dbb62c7, 0x43b446cd, 0x9d3d8a45, 0xe07a63ad, 0xaf829dfb, 0xfbe3ae77, ++ 0x2be5d810, 0xee256457, 0x433fd462, 0xd534513b, 0x487cc7e2, 0x8f9a7d51, ++ 0x9448f2f0, 0x7fab29ef, 0x517083df, 0xe70d8646, 0x31bfeedf, 0x851fa5a9, ++ 0x23db8c6c, 0xec516b3d, 0x0755f903, 0x114c9fad, 0xe2cbd6f2, 0x6ec13c24, ++ 0xfd004757, 0xdd2dd68b, 0x3e50fb8b, 0x75a31dfa, 0xeb722392, 0xa7ecec50, ++ 0x83259c40, 0xbcb3d4b1, 0x5f32f8c1, 0xfa2a9987, 0xbe13fdf1, 0xf77e0e6b, ++ 0x6907f5a7, 0xcc0c473c, 0xba390667, 0x13ba67b0, 0xb195d7e3, 0xb5c91766, ++ 0x2a3c5f58, 0x5390577b, 0x2296b7d1, 0x47d5776a, 0xc37f70d8, 0x7bb908ff, ++ 0x303bd634, 0x9779da16, 0x7e8a56dd, 0x29a979ad, 0x7792fd15, 0x00eca259, ++ 0x25abbd3c, 0x6598f71a, 0x875c4689, 0x7d3cb59f, 0x838bc63c, 0xe6257b99, ++ 0x618dee33, 0x4fe9ea9d, 0x169eb963, 0xd1981b94, 0xe230834a, 0x55f38afe, ++ 0xc0afed12, 0xe05ca475, 0xbe315ccf, 0x8fde4792, 0x8980f922, 0x9e7b8e3c, ++ 0xf2dccfe0, 0xad47d222, 0xb5662ebf, 0x67e844c6, 0xef4c357e, 0xdff4747a, ++ 0xf8505d8a, 0xaeab525c, 0x5fd5632f, 0x060e3ed2, 0xed05b3f1, 0xc7ffc6bc, ++ 0x31747d0a, 0xfbd5f217, 0xf7198b33, 0x74118cbb, 0x6c96afc9, 0x2d665f68, ++ 0x0e9d886f, 0xd946acf0, 0xd0ad3285, 0xaf887585, 0x857ed006, 0x29bd8d8b, ++ 0x74e8bebe, 0x6f3b63c6, 0x25bb8f14, 0x3e1877bd, 0x3bc637bf, 0xadb5e70c, ++ 0xee185b1f, 0x06d638ff, 0xcfee14f1, 0xb441b332, 0x83636efe, 0xc5f88726, ++ 0x0e2d837c, 0xb63edaf3, 0x35f18128, 0xb8e8731a, 0x4dd5cccb, 0xc65b6eb8, ++ 0x3e313ef4, 0x7c448ae9, 0x7d6d5123, 0x267da24d, 0xc3e0ceac, 0x33331af5, ++ 0x197dc52f, 0x71359da7, 0xcf328210, 0x69e9030a, 0x8a68b6c1, 0x67960b0b, ++ 0x0b7e511b, 0x1d934576, 0xc3ee7882, 0x7c83435e, 0xc87cb63c, 0xb7e80481, ++ 0x25cd36a0, 0x4277f9ab, 0x1d56af15, 0xe276f853, 0xd13b7c1a, 0x5f80df19, ++ 0x342be7aa, 0xc50f62fc, 0xb7911c50, 0x66deadf0, 0x7962e7c0, 0xe99fed18, ++ 0xdd609e2a, 0xa53eb41c, 0x9272b3cc, 0xb443e7da, 0x3aa97bfe, 0xe5a6f893, ++ 0x67bfce57, 0xc27f430d, 0x686166fe, 0xc9edeec7, 0xcf029bee, 0x7eb893ef, ++ 0x5b795bdd, 0x73e9ea0e, 0xbe6edcb1, 0x34230157, 0x857ef632, 0x30fbb999, ++ 0x8d8541f6, 0x122a8fe0, 0x856bfe08, 0x2b8fca93, 0x427951fa, 0x3d1495e4, ++ 0x79200103, 0xedcb14dd, 0x6558a6eb, 0x027171fd, 0x7f9c8c9a, 0xb3a9907f, ++ 0x6e0fa3e1, 0x7202971f, 0x846206ec, 0xa6332fc4, 0xdb932046, 0x6d8366e1, ++ 0x83c6027c, 0xef64488f, 0x54a33c0b, 0x69de99ed, 0xaccc7dc4, 0x73e090df, ++ 0x34e4efda, 0xbc39014e, 0xaa8c626b, 0x64aab4fd, 0xeb1f5c15, 0xe726fc24, ++ 0xbf3d54f4, 0x1546ef3b, 0x4406df9c, 0xb37275c0, 0x8a13af9d, 0xecc667f5, ++ 0xe36bfe7c, 0x1f2abf6d, 0xc073ff16, 0x0643abf7, 0x43f2d7aa, 0xb5ecebe1, ++ 0xd405e63a, 0xb185ad66, 0x6a27bf41, 0x9d5e9166, 0xbf21623d, 0x90db72bf, ++ 0x7c038777, 0xd6819b6c, 0x8f2d8f89, 0xa0eb8d59, 0x46c5b6c7, 0x2bbd2831, ++ 0xb8c01665, 0xb2336f56, 0xbd96fb10, 0x43ed297c, 0x5c9bf7ca, 0xfbf9ffa8, ++ 0xb029cf7d, 0x443be313, 0x43e3f512, 0x88901fd9, 0xefa26e7f, 0x66ff30d6, ++ 0xbd814f80, 0xb3cfadc6, 0xa75e399a, 0xe11cb624, 0xf69f61d3, 0x71e039f9, ++ 0x50a6b73e, 0x7cbdf187, 0xe5ec9628, 0xdca1990e, 0xd0342de6, 0x8fbcd53a, ++ 0x33080de4, 0xe7327069, 0xeafb4cb7, 0xf51356d8, 0x42415acf, 0xdfe2dda0, ++ 0x92ae369b, 0xde08cd38, 0x4abfd03d, 0xd1ca27c8, 0x8ee668a9, 0xc2256426, ++ 0xb1fbccf7, 0x483eb01b, 0x1c20ff4f, 0xa7bd41f7, 0x99c3fd15, 0xb220ff42, ++ 0x92c50f6b, 0x7ee9695e, 0x96edc8c2, 0x0a40f50f, 0x9ea0cbda, 0x307f232d, ++ 0x738ae0cb, 0x48cabd91, 0xa2757b44, 0x71fb40da, 0x351dde99, 0x3b33e699, ++ 0xef958e48, 0xc73bd09c, 0xaa277e23, 0x11e618d2, 0x8a65aa0a, 0x78fe5007, ++ 0xe75f3f7b, 0xb2f65c78, 0x956fd061, 0x1df165e4, 0x85fee6e5, 0xce3f68c3, ++ 0xd1af314c, 0x402f81da, 0x827dbd57, 0x7c3dfcf0, 0x68cb08bf, 0x181d4fd6, ++ 0xfce58e3a, 0x7fbc097b, 0xb8bb3d65, 0x628e9fc7, 0xb1b17dc8, 0xf0fd15a7, ++ 0x92650fe9, 0x6a3dd3b3, 0x3f002686, 0x0ef6e9cf, 0x67c039fd, 0x7a2d7d73, ++ 0x6f708554, 0x3fce1c4a, 0x52a9d574, 0x79e7dc0f, 0x7828f57c, 0x068bccef, ++ 0x92f9a917, 0xf31fb258, 0x1eebceb7, 0xa3af6fba, 0xf1240afd, 0xa27706f5, ++ 0xe05cf404, 0xf98f1dac, 0x23cc39fd, 0x8fa710fc, 0x81111713, 0x1235b62e, ++ 0xc7657e6e, 0x70ab2d33, 0x502cf0ff, 0xc479d093, 0xdbcf0371, 0x7c78e2b9, ++ 0x0f09c4a5, 0x333b71c4, 0x9be5c74b, 0xdc5124bd, 0xfb2a3f06, 0xd9f6265f, ++ 0xb15f7629, 0x86acc5d7, 0xc4c73dd6, 0xf378fdf1, 0x2bb53f24, 0x304c15c5, ++ 0x9e368551, 0x62de2d94, 0xa8d3fbf2, 0x1c685b2f, 0xc9ce3cb0, 0x2f8c43d7, ++ 0x5b62893e, 0xf8f89ac4, 0x18ceed34, 0x694d85fc, 0xa14dfd1d, 0x3b72c36d, ++ 0x61706ff5, 0xe848a33e, 0xe48d4969, 0x9071f00f, 0x0ef254df, 0xd4df8473, ++ 0xfe0ea7fa, 0xe687e348, 0xab2cfc68, 0xc055fb51, 0xa3bf1237, 0xd3c5abe0, ++ 0x3a216113, 0xd0bc07cc, 0xfd7a16df, 0xde112607, 0xd9380b92, 0xe6229f01, ++ 0xe38d1b19, 0xb380fa80, 0x71da7e23, 0x8c57c075, 0xa1778b53, 0x9c80cbeb, ++ 0x5139f7c1, 0x0e3347fe, 0x78da1f85, 0xa14be14d, 0xb0b7d38f, 0x7e7e225e, ++ 0x32071ede, 0xf228ffca, 0x5aa01302, 0x499efbf5, 0xd68acf68, 0x0b4dfd80, ++ 0x4f228fca, 0x146d59f3, 0x0b294bca, 0xfd444cac, 0x1b4ed40a, 0xbafb7181, ++ 0xcffe29f7, 0xeb7a07b3, 0xd98491a2, 0x1cdce68f, 0x9d2d6b94, 0xefd7c5af, ++ 0x951c374b, 0x015fc95e, 0x926ce69d, 0x548361dd, 0x187ec4ed, 0x5cc1e91f, ++ 0xf988cf9f, 0xde62b98a, 0xcb3c2d7f, 0xf3ff7cf4, 0x22edf135, 0x78a1fa4e, ++ 0x791388ef, 0x56710eb1, 0x76676b6f, 0xa7e7194a, 0xd35caec2, 0xd35debbf, ++ 0x58f7f919, 0xb5d697c9, 0x7e142ebd, 0x79fa0e7d, 0xeed65b28, 0xe7da7ca4, ++ 0xde52766b, 0x9ce2f8dc, 0x5bb78c28, 0x8d5aced6, 0xb65a92fb, 0x5ebf22cd, ++ 0xd7e28cf4, 0x78d0c6bd, 0xfe6d7b21, 0xf285fff3, 0x768c25ba, 0xf7ee1580, ++ 0xd80e798a, 0x5ce76851, 0x5b26edcb, 0x1168edc3, 0xd7ca3ffa, 0xbb62fb78, ++ 0xfb7a159f, 0x3c87dca2, 0xb3f8bf27, 0xf797de59, 0xfb3fbf40, 0x47cb8443, ++ 0x7405b643, 0x02dba714, 0x164affe8, 0xee28f5fd, 0xff7f06cf, 0xbf8a83d1, ++ 0x9b7b3e27, 0x7e283fd1, 0x90de44be, 0x40b8c36a, 0xd7ff85f8, 0x7a402ef4, ++ 0xe9c53c53, 0xa71559fd, 0x4e6af1f3, 0x7adb95f7, 0xf0fce146, 0x149eaab3, ++ 0xadb67d47, 0xf67bd137, 0xc537a02a, 0x1c754ed1, 0xc6f40555, 0x1bd20279, ++ 0xefd82af0, 0x7176f414, 0x3a71577a, 0xce5e6ab3, 0x1f5740ee, 0xecffcbad, ++ 0xc6172677, 0x02c2a705, 0xda9d2f14, 0x90cab32e, 0x73894b38, 0x9e6ac1fe, ++ 0xa14c78c3, 0x4d3ebcf7, 0xe4bed083, 0x28a7fe3d, 0xedbcfba4, 0x81de293c, ++ 0x8f1dccde, 0xfbf076f1, 0x4c5171ed, 0x745c687c, 0x65297c9d, 0xaf7e461e, ++ 0x70474ffe, 0xe1b9205e, 0xf79e3b55, 0xea0ae710, 0x700ae7d4, 0x1d9e418f, ++ 0xb32e07f3, 0xa6e9f119, 0x65e12f3d, 0xbafdf798, 0x173397f7, 0xaab71e91, ++ 0x624d69f6, 0xc63c4301, 0x9d12b587, 0x9c592bc3, 0x30c59515, 0x784e5caf, ++ 0xaa4bc6e4, 0xb225787d, 0x62c3e28e, 0x95138f23, 0x788cbcf5, 0xc4640f1e, ++ 0x667d79f3, 0xbbde8dbc, 0xcec8c610, 0xfd18b05f, 0xe61e6fb8, 0x7df8094b, ++ 0xf1131edf, 0x04e228ed, 0x228d97f4, 0x0e2e032f, 0xc61ef1e5, 0xc89ef1e5, ++ 0xc36bca46, 0xfa3d644c, 0x98977bbd, 0x3ab7145c, 0xbd5f94ac, 0x7bb3d85b, ++ 0xd07a5722, 0x691bdffe, 0xfd096374, 0x983370fa, 0x1e7c0c61, 0x32486fbe, ++ 0x3c86fed2, 0x388bf373, 0xe12fbdb5, 0x406603f8, 0xaf0826f5, 0xbf026f31, ++ 0xd312baee, 0xfe412f91, 0x6538f3a8, 0x35e79de1, 0x497a09a6, 0x6be5376e, ++ 0x3877d04c, 0xbc5771e0, 0xda773f93, 0x1d66fe78, 0xe412c9f0, 0xf339f6af, ++ 0x317dfcf1, 0xc91bc7ee, 0x270c80b8, 0x62e0abfa, 0x8f2faf23, 0xa6b09daf, ++ 0x667f631b, 0xb7c881ce, 0x3819b462, 0xfab7cf7f, 0x077dbf31, 0x58ec8fe6, ++ 0xa65e49ea, 0xc74f99e8, 0xdc48aacb, 0x49f223ab, 0x7f3d0493, 0xac059c3a, ++ 0x41c0f740, 0x7a6b3e75, 0x0be81740, 0x1f43bdf4, 0xd4f94068, 0x1b069d99, ++ 0x2393c77c, 0x4779c60d, 0xc3ebb2f1, 0xf5fe32b7, 0x03466b09, 0x9cfbe3ac, ++ 0x79e41f5a, 0x59407b86, 0xf5336e91, 0x983cbf6c, 0xa5d201cb, 0x51f4eecc, ++ 0xe51285bb, 0x9a3c953b, 0xe874ffc2, 0xf78f943e, 0x9fa0fc08, 0xdf7c28aa, ++ 0x7ebf39d8, 0x7716e42d, 0x17dd21ca, 0xa05bbd08, 0xb536dbe8, 0xf0acbdbe, ++ 0xa05ce311, 0xeca23ddb, 0x09b62f4a, 0xcf16d879, 0xc4cfe3e7, 0xebf1f32b, ++ 0xe48b1efb, 0x7d14fafb, 0xfef13129, 0x21dfef95, 0x76f1adca, 0x0f82871a, ++ 0xd867ebc8, 0x002c0e8f, 0x9a89ebca, 0xe67f8a4a, 0x75bc90b2, 0x229db05a, ++ 0x76e11dd7, 0x82bba23b, 0x3675b1a5, 0x49fa5e92, 0xe8ed0b98, 0xdedac63d, ++ 0xba8f3cfc, 0x92ceb29d, 0x8c0c9ac7, 0x77c8a4ec, 0x4e333f09, 0xf4f5a48e, ++ 0x739f893c, 0xf16590bb, 0x8798ace9, 0xf36b1031, 0x6fda25a2, 0x5f1869f0, ++ 0xfad7bb37, 0xd7a849b3, 0x3d465179, 0x2b593396, 0x5b77fbf5, 0x8674eb0f, ++ 0xcc6498fb, 0xcf87c38d, 0x77c3704e, 0x70eed12b, 0x68f751f8, 0xb8091aca, ++ 0xd0371df5, 0xe065ea61, 0x4e5fc13f, 0xb9dd8370, 0x67a896f0, 0x0bfde917, ++ 0xfb1c842b, 0x6ff0e6be, 0x717ffa95, 0xfea511f8, 0x531f870a, 0xe3f017fa, ++ 0x9aa5fa9a, 0xfc39a7fa, 0x265753e9, 0x1d2e30f8, 0x6f3a45c3, 0xaa7644a4, ++ 0xf019ca27, 0x80596f33, 0xdba79be8, 0x2c31cbcb, 0x76b8cba0, 0xa782733b, ++ 0xd91ffa27, 0xfe82c272, 0xeee491d7, 0x67720f19, 0xc49ef388, 0xc964fe72, ++ 0xfb7b4467, 0xc1fc9fa1, 0xdbf62ea4, 0xdcf614f4, 0xf7a1e89c, 0xfd05ff15, ++ 0x7e9f7eb4, 0xd0e84c9e, 0xa7df37cf, 0xf11dd99f, 0x7e6425d1, 0x4ede7ef7, ++ 0xfa5274e4, 0xa29be251, 0xf60a7764, 0x54384ec7, 0xfc162bfb, 0xfcc565ca, ++ 0x15fdc312, 0xcb05fa40, 0x4087536a, 0x7a5e0bff, 0xe310b52d, 0x4be7e129, ++ 0x8dcc74db, 0x18db09e7, 0x3e1b6795, 0xa8b9e236, 0xc60d5dd2, 0x0caed0f1, ++ 0xbc10ecca, 0xe09e058a, 0x4253f4e7, 0x048f73fc, 0x8f17b09d, 0x97c8f5f3, ++ 0x9f91eb4e, 0x2db5740b, 0x1edfa0cf, 0x0eba7529, 0x3bde2e13, 0xd8bec5da, ++ 0x0edc097e, 0xf77148cd, 0x618671c5, 0xecca008e, 0xd5d7ceca, 0xf2fe8a16, ++ 0x359bdf84, 0x027662d4, 0xe43f339d, 0xeb8550eb, 0xf9d306d2, 0xe931b8c2, ++ 0x97cd5709, 0x697cf2b6, 0xe697cf3d, 0x83169bd9, 0x09c566f1, 0x30cdabdd, ++ 0x94f09b1f, 0xb2a067a2, 0x498e6ef0, 0x1c4e8781, 0xb3e78ddb, 0xed63be10, ++ 0x37a8d54d, 0xe60f888d, 0x0c0d87c5, 0x9cd0bb47, 0x81b3a116, 0x9b1fe8bd, ++ 0xdc788c5f, 0xf1e6ec3b, 0x64cb3cf8, 0xf3cf93e9, 0xfd1724ee, 0xe2b73d63, ++ 0xe63db1b8, 0x40c6bc39, 0x871874ec, 0xf6996df7, 0x4507782b, 0x575b3b78, ++ 0xe5c0971a, 0x46c138a6, 0x360468f4, 0xe0a2fc63, 0xe21f7ca1, 0xd04dc5f7, ++ 0x896589df, 0xb89cabe9, 0x80b5928e, 0xff7c49e4, 0x8cef58d1, 0xd09fefd0, ++ 0x85383eb1, 0x7e3c5eb8, 0x00b1f82a, 0x67a506f9, 0x21dcccb4, 0x6329b8f3, ++ 0xd4f05423, 0x1dcc3189, 0x9a9d879a, 0xe46782ac, 0xbfb554f5, 0xaa8df67b, ++ 0x53535cfa, 0x1c487946, 0xe49c75db, 0x16c9ebe3, 0x73c6384b, 0xc7ffaf7f, ++ 0xf8c1ee5f, 0xc2ec936f, 0x9ede7558, 0xc5197fcd, 0x3b887f68, 0x4e8bf286, ++ 0x699d87ca, 0x75c51994, 0x743eb77a, 0x6b3ce7dd, 0xadf7127a, 0xa3ceb574, ++ 0xd81763cc, 0x8dbed3f6, 0xa79d7b1f, 0x67cc413a, 0xe8c1b307, 0x7f962f0f, ++ 0xd2b8f944, 0xf3be3e48, 0xe2331daf, 0x1bae273a, 0xbf79015e, 0xf8c45f15, ++ 0xf947cdb0, 0x63baecea, 0x20362eb4, 0xd2e9db81, 0x78f50b6e, 0x4a0ca63e, ++ 0xc1e343f4, 0x5e41595e, 0xc0d81a9a, 0x9aaeb85d, 0x7871e166, 0x62c614db, ++ 0xfe78ae50, 0x9a2e31a6, 0xa82f07ce, 0xa5e7a1ca, 0xffd4e16d, 0x78d3727b, ++ 0xaaf77fda, 0xb90beb44, 0xc32ef7c9, 0xe18db2fd, 0xc3f701be, 0xbe5f7377, ++ 0x56e90735, 0x27ef8bba, 0x9cff95cd, 0xe2ca10b1, 0x3f7a1c9a, 0x128d6657, ++ 0xb2130bc4, 0x45cdffb9, 0x3cb00f9f, 0xfd0ab2d4, 0xf40c6cae, 0x8ced1679, ++ 0xc67642d1, 0x7d3776da, 0x4ccdacbf, 0xe04eefef, 0x99a193f1, 0xcdae35e3, ++ 0x7915cf43, 0x87a13d78, 0x21a79f6a, 0xef1e9376, 0x3334308f, 0xdb7b7f6a, ++ 0xe32a540d, 0xefdfbb7d, 0x21a8dce8, 0xb8f1abf6, 0x876de74f, 0x4430a364, ++ 0x952f8763, 0x4eb2b30f, 0x77fb54ec, 0x36bef8da, 0xe7df1b53, 0xfdc937b6, ++ 0x4983da3e, 0x71eb350f, 0x9a4587bd, 0x49af486d, 0x859dd3c3, 0xef25fa21, ++ 0xfc88cbbd, 0xdf79ac31, 0x04da7e88, 0x7d487665, 0xa0afd889, 0x6d7fd3b5, ++ 0x694bd3b7, 0x61df8abc, 0x7f2479d5, 0x00426d33, 0x17ecfe85, 0xbf794476, ++ 0xc034e689, 0x4f3cddc7, 0xf79249ff, 0xa687da0c, 0x0763362c, 0x54a6cdd9, ++ 0xb1f9675c, 0x9b3e07f0, 0x9b138a25, 0xa4e6ff69, 0xe61d4ee1, 0xbc082ff7, ++ 0xd6be3d14, 0xed153e38, 0x12d993df, 0x5bbdf7ec, 0x4372696e, 0x1cbf0d7f, ++ 0x41fd0432, 0xe4485dbb, 0xad9829e7, 0x07ce32f5, 0x7088decb, 0xe2e7bea2, ++ 0x33d70c64, 0x9e6898f7, 0xbd69cf02, 0xd30deca2, 0x50f73c46, 0x55f30516, ++ 0x9bf67ef8, 0xe3940161, 0xf4c33786, 0x4d1e37e8, 0x58c4b2f1, 0x2c77de7c, ++ 0xf5dd0fce, 0xb8a33d26, 0x66252dc7, 0xb5ef8d76, 0xce5696ec, 0x56f4fd14, ++ 0x17c97d71, 0xf4205a72, 0xe8f42bcf, 0xe93c7952, 0x0087a5e1, 0x7d075c69, ++ 0x0bb81a48, 0x85a704e3, 0xf45219ee, 0x43e71732, 0xc6f73cf0, 0xab2fda68, ++ 0x3d5a1bc4, 0x51b36e2c, 0x4e6d25bf, 0x8276efa1, 0x102bbd15, 0x7112637a, ++ 0xe7216cc6, 0x74dec9c9, 0x256e7f1c, 0xad147de8, 0x3ea067d3, 0x68c6e505, ++ 0xb902f943, 0xd10c2849, 0xbb86ca9f, 0x2627c618, 0x66e48787, 0xf1a19436, ++ 0xf8f69cc9, 0x0e3e36c4, 0x3cb49ff0, 0x74e7874d, 0x89a1fa94, 0x9f5cdc8a, ++ 0xe44cf7fc, 0x191052fa, 0xacf18de8, 0x85cc3ca1, 0x3a2faefb, 0xa2ce7af8, ++ 0x171d3847, 0x18d93c19, 0x5a7a2c5f, 0xc618fca2, 0x8697681d, 0x8637291e, ++ 0x6aee51e6, 0x409cc41b, 0x7adb3b87, 0xce3fd951, 0x23e5163b, 0xa09a6dbf, ++ 0xb5efa0d7, 0xe6e9987e, 0xdf832479, 0x8690dae4, 0x8caf2479, 0xc2953e7c, ++ 0xae844f6c, 0x51d5add7, 0x57594bfe, 0x264af254, 0xe212e7dc, 0xafa1ff47, ++ 0x067ba549, 0x2ca679b4, 0x6dcff7ee, 0x2fdf9032, 0x50f3f86e, 0x919fd41b, ++ 0x9fd1e2b2, 0x677bd41c, 0x4fe678e2, 0x0064bff1, 0x3b63c178, 0x833846a3, ++ 0x07d5acf4, 0xad1fa37a, 0xbe623a05, 0xce5ab6ab, 0x2778f3f1, 0x7183af82, ++ 0x59e456f9, 0xdbf3e72b, 0x5d3c907a, 0x1f91372a, 0xcb7204ba, 0xe290fc42, ++ 0xaf3b1477, 0xae451ff8, 0x7edcf44b, 0xfd5a4495, 0xfa0c2798, 0x2c9ec99d, ++ 0x7c7ebb94, 0xefd04cbf, 0x123d5c6c, 0x8382e0f5, 0x7e2a19f6, 0xaf07ab43, ++ 0xd3804056, 0x51dfa3a7, 0xe762baec, 0xe635bf15, 0xf9daff0f, 0x924efc37, ++ 0xaf4837f7, 0x7fdcf5db, 0x90b7aedd, 0x4c738cfc, 0x5cdca3d6, 0x263d1dbf, ++ 0x9531e8ec, 0xc2ed2d1d, 0xf8953c0f, 0x0ac0fcdd, 0xc4c73ed1, 0xf3b447e3, ++ 0x927dfda1, 0xea2b6634, 0xdc89cbf3, 0x7858fecf, 0x5fff6577, 0xf66efc4e, ++ 0xf5e25d7f, 0x89bdffd9, 0xd68adcfc, 0xbf1b33de, 0x9ec2e5f7, 0x07f47efe, ++ 0x07f81947, 0x11f583f4, 0x1fc2cdce, 0xb708bf90, 0x0fe6affa, 0xdacca466, ++ 0xd83f85db, 0xafbfcf87, 0x50e4503f, 0x4f451bd1, 0xead0bd14, 0x1317a291, ++ 0x2279851e, 0xbe3de9f2, 0xef44bf0f, 0x89eb46db, 0xd47488ce, 0x6e38f6cf, ++ 0xd6fa4497, 0xfd084fc1, 0xda8bea09, 0xa17a286f, 0x3fa28be8, 0xe62f4225, ++ 0x9f62f468, 0x48c4fb5c, 0x248eef78, 0x4f2857ef, 0x43b27aed, 0x94ba1feb, ++ 0xb22ccc2b, 0x86728e39, 0x65025572, 0xba995ca8, 0xbe6f87d0, 0x79385fa3, ++ 0x9914f29d, 0xff89e3c4, 0x26453ca0, 0x4f2a7665, 0x311fa496, 0xfe54b8be, ++ 0xe0270cd7, 0xec032973, 0xde505a6d, 0x78c3bc26, 0xcf93d0fc, 0x497e6007, ++ 0x531a3778, 0xe133ef28, 0x3a472b0a, 0xf0a9722a, 0xe6078959, 0xa4c3bc88, ++ 0xe23a4f64, 0x8581f38b, 0x88f767d7, 0x934726cf, 0x7327e711, 0x038d0ca0, ++ 0x877f8aba, 0x3e377d26, 0x3eba4af7, 0xf49adf3e, 0xb78dc7a3, 0x276e7526, ++ 0x807e9272, 0x66cdc89d, 0xcae7bf22, 0x84e37cc5, 0x65980b5f, 0x4cbea2e4, ++ 0xa7d4ae1b, 0xa3d6e63f, 0x5e4a607d, 0xef1cf29c, 0x0df602c9, 0xf0163c3e, ++ 0x0b04f09c, 0x7ea1cde6, 0x7b6b68dc, 0xc162445e, 0xdccf45f6, 0xfc9ab874, ++ 0xbfa70d7c, 0xd7cf59b7, 0x019c047f, 0x1e0425b0, 0xf1d781ae, 0x66fa51f6, ++ 0x041fba16, 0xcc1a49e5, 0x8909ecf9, 0xfbf3e01f, 0xb0bfa12f, 0x1af30c49, ++ 0x6f0d8e65, 0x56bb425d, 0x545ad127, 0x28d81d3b, 0xbd6943a2, 0x0e5be024, ++ 0x76317bbb, 0xaf0e2ef7, 0xcc7eca4e, 0x86fd17a7, 0xd43793ec, 0x57da6e4a, ++ 0xf7f25c30, 0xef48eb48, 0xff6a49d5, 0xf57a3f84, 0xdbf70cfb, 0xdbf7977d, ++ 0xa0f57fcf, 0xefa603f7, 0xa3e9fdf0, 0xbcdfdf3b, 0xf5fb8929, 0x4ed619b1, ++ 0xc925b7eb, 0x6f22fbfc, 0x4787df40, 0x7e76d677, 0xf89773ee, 0x97ae136e, ++ 0x7bef3d10, 0xe18dddcc, 0xcf011a6e, 0x3de90c7c, 0xfe55318e, 0xf04fbe0c, ++ 0x7333499b, 0xb87cf4ab, 0xaebd0d6e, 0x24dfde36, 0x904cf129, 0xbf0d3e5e, ++ 0xf7a1574c, 0xdbd09d93, 0x703f7ea9, 0xebad7e35, 0xdb90bef0, 0xbb1c8ab9, ++ 0xd56ef255, 0xad3e487b, 0x7186c90e, 0xac27a974, 0x410be71a, 0x72479cfd, ++ 0x0faca4d9, 0xf9bfd074, 0xa57fa8b9, 0xc57d1d0a, 0x7afea18f, 0xb9eded74, ++ 0x35cbb63e, 0xba03f773, 0xde0fca52, 0x0599f8ff, 0x125e618f, 0x09ea82e4, ++ 0xade087d6, 0x0d5ac7d5, 0xbfa35a3c, 0x7ec8ff42, 0x3a003fa0, 0xe6fb46f5, ++ 0x86746638, 0xe09b49c8, 0xae7179d3, 0x8f0c69b2, 0xf07a9b27, 0xac592132, ++ 0x76f3253b, 0x4f2164e6, 0xe87421e1, 0x009f92a6, 0xc6425bce, 0xcbba744d, ++ 0x3abb8ca1, 0x73e82277, 0xdbd79d93, 0xf31eab93, 0xdac20b75, 0xd5c91cfe, ++ 0xd0c8beb9, 0x461d57fe, 0xa09772ff, 0xa3f2425b, 0x82917d87, 0xfbc171cf, ++ 0x7c3e40f4, 0x504a0f68, 0xf28ea43e, 0x3e51dcd1, 0xddf79a7d, 0xdfbcab86, ++ 0xb77df1d2, 0xe7867de6, 0x7dffaf86, 0x1a89b7c1, 0xf868e6be, 0xe703563a, ++ 0x655fb029, 0x5cbb157f, 0x8af8f750, 0x37e60738, 0x1faeda25, 0x4867e794, ++ 0x14d8179e, 0x30f67df9, 0x9e506bca, 0xa79d11d7, 0xf9be0ad4, 0x99ff93d6, ++ 0x6478768c, 0xed13be10, 0xe5cfc110, 0xd0587ae2, 0x18ff3d5f, 0x55e9edda, ++ 0xc13f7b4a, 0xfa572f77, 0x2bef40db, 0x8dbe647c, 0x6157c4b9, 0x77ef9877, ++ 0x7e7eb187, 0xc27f7f3d, 0xfb0e9bb3, 0x1f455d7a, 0x5974346a, 0x9a7d81a7, ++ 0xe1ae6bf6, 0xde6b96df, 0x5f53487f, 0x6ad781ad, 0xfbf52ae0, 0xd225b3f9, ++ 0x7ce1fcc3, 0x97ab527d, 0x27b8f95a, 0x69ce3db9, 0x2452e7f7, 0xbd2a77c5, ++ 0xe1c9509a, 0xcf6ecf39, 0x02101aad, 0xe5ccef27, 0x0b5f017a, 0x3607ef39, ++ 0x311dee97, 0xef376174, 0x2e42ee4c, 0x3dfd69fb, 0xfc1fffaf, 0x8bd69135, ++ 0x3ec97154, 0xc8370d59, 0x870dde0a, 0xac864717, 0x2e40b2ab, 0x5eba23ce, ++ 0x772379bf, 0xe45c686c, 0x917143db, 0xfda54e32, 0xc8af6ff8, 0x265fbdf8, ++ 0x34ddc9ef, 0xc53bd700, 0x979da6ba, 0xba652fe0, 0x6fe4552f, 0x5c3ee3c6, ++ 0xe81e176c, 0xc84068bd, 0x1f6d5938, 0x2fc3671c, 0x519f7e65, 0xe807f025, ++ 0xb49ccf94, 0xee16749f, 0xf509efaa, 0x1792eb56, 0xbf7dbde0, 0x9fa09794, ++ 0x8624ba3e, 0x2dfd2df6, 0xfb9dc799, 0xe6e3ddac, 0x7110dc00, 0x86dbd91f, ++ 0xb951c787, 0x6caf7657, 0x4cf631b5, 0xc8dce1f2, 0x256f58fe, 0x6cf93d3a, ++ 0x9052ee63, 0x9d93a7ef, 0x6ed7bef4, 0x78c3ab8b, 0xd681957b, 0x3d73190b, ++ 0x98f3f247, 0xdbe71d29, 0xa46f4bf9, 0xdf82b0f5, 0xe78f1e4e, 0x18560aac, ++ 0x59a49d68, 0x913ca367, 0xda38d577, 0xb97b3517, 0x52b77d28, 0x7fbfe6f9, ++ 0xb0e78957, 0x744bd75a, 0x5fcdc19f, 0x0833bed5, 0x9eaaa2e0, 0x0de2ae74, ++ 0xbee00798, 0xf6d6cfee, 0xe33ee3f5, 0xb4e561e3, 0xd3da144f, 0xcba2b079, ++ 0x652777ce, 0xb6d97b60, 0xc0b7da0c, 0x5b9f8c73, 0xe237911e, 0x28fca739, ++ 0xcfee384b, 0x5196f96e, 0x8565a75e, 0xf845ee89, 0x733bd22c, 0xcdce83ad, ++ 0x5acfa462, 0x04946724, 0xd9f57874, 0x1213724f, 0xf049b9f1, 0x3e4b13f7, ++ 0xaebe7de8, 0x9fc87e5d, 0xf8734614, 0x724fe4d5, 0x5a38c337, 0xfb4bee9e, ++ 0xe6ea6ec3, 0x7a064bae, 0xfb9babfd, 0xc44ce4b5, 0x37adfb97, 0x23d7cdff, ++ 0x10573f5f, 0x7d9b7987, 0x68dfae42, 0xbd0b882b, 0xbcf0ba87, 0x4de0e49e, ++ 0xdd3173a3, 0x229e1767, 0xe41b3ce1, 0xe6f30620, 0x05bcc5b3, 0xcec979e4, ++ 0xf5abe24e, 0x6b1e3cc9, 0x34763478, 0xd72837f2, 0xd27ec867, 0x0fe0037c, ++ 0x3f216d9f, 0x84b4c277, 0x263b471d, 0x7db237f6, 0xc3274461, 0x587f30b6, ++ 0xdd4fe61a, 0x59be51e3, 0x299f6d42, 0x143d1096, 0xe3eeffed, 0x0eff78fb, ++ 0xf7de71ed, 0xe857a077, 0xbed2867a, 0xc3e2ca28, 0xc5a4e2e0, 0x1c7e47a2, ++ 0xe0b457d5, 0xf5c2b47e, 0x8503f206, 0x6a1f63eb, 0x7203fb45, 0xed35f983, ++ 0x19bad2b8, 0x2ba31e78, 0xaffdf4bd, 0xffd92f5a, 0xbf2f555e, 0xdcebf678, ++ 0xeb5d914d, 0xdb8d9165, 0xf9ebf1a7, 0x994589bd, 0x6fae3d16, 0xd6ff598e, ++ 0xb7273a66, 0x9e306c30, 0x6f5a288b, 0x5b357e22, 0x4ddb3e2c, 0xa2c05e78, ++ 0xb2f2868f, 0x376a6fe0, 0x968f5f27, 0x983cde99, 0xa1073a4a, 0x5e9e1bac, ++ 0xb893c4f2, 0xf30cf2dd, 0xf4061b4f, 0x72e6e8bb, 0x4c97717a, 0x3aed47f9, ++ 0x9dc1c962, 0x1d762cc6, 0x58d788eb, 0xcd662c3f, 0xced89ee2, 0x1faed7df, ++ 0xd769ba3a, 0xfe740d0f, 0x1fac48bb, 0x0893af66, 0xfc25a2ef, 0x0c767d5c, ++ 0xa89f1bcf, 0x691bfe00, 0x60db3edc, 0xfdccefdc, 0xfc93114e, 0xd6f5f866, ++ 0x8f290b75, 0x33b0a8f9, 0xbf7ee2f9, 0x54ae61e3, 0xae17e79c, 0x16fa230f, ++ 0x2fef373d, 0xb9e0674f, 0xe8475cbd, 0x9406fabc, 0x865f4e0b, 0x7e9503e7, ++ 0x2ffd2e4e, 0xfb304fba, 0xc31f9879, 0xd9a28a78, 0x21a5774b, 0x715312bf, ++ 0x5769539d, 0x7d97ecb4, 0x5f983b78, 0xff3a3cc3, 0x97df9911, 0x7e44dbb2, ++ 0x813d7410, 0x9ca39c85, 0xd1a0fcbd, 0x9eff8038, 0xd7c45430, 0xb3f9e0ce, ++ 0x8f1ea0cf, 0x738996e6, 0x94fd0a66, 0x3af95273, 0x9e5acf7e, 0x53f3a24e, ++ 0xdce8c960, 0x3c6ef4d1, 0xca289dae, 0x9d1754fc, 0x6d5929bf, 0xe34b2d72, ++ 0xe79fb4fd, 0x895df984, 0xd690a9ae, 0x51315f33, 0x796ca55e, 0x8a2c3b98, ++ 0x31d8bfef, 0xeb4ff680, 0x97ec768d, 0xc9d8b38f, 0x3f3c06ed, 0x25e787a2, ++ 0x4b176e16, 0xdcde81a2, 0x4375bb2f, 0x46363ef1, 0xbfb125fb, 0xdf2141c4, ++ 0xe773c495, 0x519d5be4, 0x751b7ec1, 0x35f30aac, 0x20ffbed8, 0xb4cc5fa4, ++ 0x8bd78819, 0x1031e932, 0x8c70f567, 0x87945ef7, 0xff3b3ce0, 0xd1e37d91, ++ 0x9ed82eee, 0x5821278e, 0x901f4bfe, 0xf82058df, 0x9bf62cde, 0xf78c0015, ++ 0xe3779545, 0x7995e47a, 0xd05ca89e, 0x52bfe147, 0x8188f25f, 0xbec1ede7, ++ 0x592941a3, 0xb7ea57fa, 0x8714d2c4, 0xb764b776, 0xe7da2861, 0x05de05fb, ++ 0x1f46534b, 0x302a7901, 0xbcdee958, 0x11ae5f62, 0x891ae2e1, 0xb17be0e0, ++ 0x679f28a9, 0x851abf97, 0x2c3c7372, 0x51fd1bd0, 0x1730c2eb, 0xf1b4279d, ++ 0xe5d9dd3c, 0xd21ce9bd, 0x05935b6c, 0xbd981def, 0xed1da7b8, 0xc05b51f6, ++ 0x6b47f588, 0xbb0874d3, 0x08d1b66d, 0x1137f5bb, 0x6bec567c, 0x27941fa1, ++ 0x78b7f389, 0xfe233edb, 0xc4a78cfd, 0xf8bfcf78, 0xfbcc1f41, 0xf536a494, ++ 0xfc027f41, 0x748c93ef, 0x3f912ade, 0xf7c6dd2e, 0x2ffc2bb1, 0xbe83fe45, ++ 0x2f7c17cd, 0xcfeaf5dd, 0x914a0f51, 0xca3b83ff, 0x7ef1c80f, 0xc363be7a, ++ 0xdfdfc678, 0xf8a2728f, 0x1b97802f, 0xe3b798ec, 0x47415af0, 0x3f963e78, ++ 0xfbe00df7, 0x1ff7dae7, 0x2bbfe4a8, 0xfc16eefe, 0x226a582b, 0x8c5bbb3b, ++ 0xdd91f9b7, 0xf3bfc851, 0x803bee2f, 0x3b252beb, 0x3b3b3bc0, 0x8f4103d1, ++ 0x147f1c32, 0x45714fe1, 0x2a378e19, 0xb976fe38, 0xc657fa17, 0xf194f8f8, ++ 0xf8c5e996, 0xfef17a95, 0x30fe8a2b, 0x7d5daf41, 0xfd09beb9, 0xfba5fd42, ++ 0xbcf8c490, 0x8a3df576, 0xbdf18a9f, 0xffcc4dd5, 0x4851b56d, 0xda2fe41f, ++ 0x22c7861d, 0x4d023b15, 0x40df6fce, 0x7e15f5fb, 0x0f9ff829, 0xb47711fa, ++ 0xe6c7c83d, 0xfc35ee2e, 0xd8f1d048, 0x3ad4f88a, 0x2dd9dfa0, 0xc9149d74, ++ 0x7be43eab, 0xdf28dc8a, 0xe4c3fecb, 0xd0dc71db, 0x57fb007f, 0x17d47bbe, ++ 0x8e7ec7a1, 0x0a1fae32, 0x665e8afe, 0x7b7bde57, 0x3bb6147a, 0x0039e96f, ++ 0xb6e42dc7, 0x77de8d9b, 0xef009c63, 0xca24ebbb, 0xf3131f57, 0x5e2b63fb, ++ 0x10182a8d, 0xddb3f794, 0xf2f71124, 0x4f16987c, 0x7c14fe45, 0x1f3ced1b, ++ 0xfd9be0ac, 0xf1dbf4f0, 0xae3782b9, 0xa7ca8513, 0x4e453f42, 0x5a77f395, ++ 0x53592579, 0xb5dca5fc, 0x3b75975c, 0x3a75fb46, 0x27f6d73c, 0x62e3a0e2, ++ 0x2c6b791f, 0xe5fe79e3, 0xe755fb09, 0x0c8b1884, 0xdf8a37f5, 0x7d6a9f80, ++ 0x3f69bf88, 0x9f70e677, 0x52797e46, 0xcf78d07a, 0x16635ab0, 0xaa7c5bf4, ++ 0xe3de3c69, 0x379dc4a6, 0xad90157f, 0xc5da9f98, 0x7229b7f7, 0x3f6e7c52, ++ 0x38897fc9, 0xc8ff94cf, 0x50c3b907, 0xa06f7fce, 0x15fc9c75, 0xcf188ce3, ++ 0x6b3cdbcf, 0xcf019228, 0x3f3da03d, 0x087329bd, 0x8b60493f, 0x1fe7869b, ++ 0xed313d36, 0xbb3e786e, 0x187ba64e, 0xdbd41fb0, 0x508607fc, 0x5878f53e, ++ 0x8c48ee73, 0x6d941fdb, 0xda8fb718, 0xb610f99c, 0x1ee9651f, 0x6c67974d, ++ 0xadd8218a, 0x505f92b7, 0xdf655ce2, 0xf381a55f, 0xd70a647d, 0xae14f4a7, ++ 0x9229e94f, 0xd957efd8, 0x5bdfd707, 0x3dd18437, 0x67467928, 0xb7bf006d, ++ 0x15e69e27, 0xca3c4665, 0x2950e748, 0x646b9b0e, 0xf4c1c4e6, 0xcf089cdc, ++ 0x1e9a1a0f, 0xf071ff40, 0xde3a4b01, 0xcbe4c87f, 0xfc780b43, 0x6319d7cc, ++ 0x319eea98, 0x29118f05, 0xfdb5ce5c, 0xe237ef29, 0xe74ec1bc, 0xd3fde90d, ++ 0x0d3f7fcb, 0x2de9dffd, 0xee38edbd, 0xe8c27b93, 0x8349c0bc, 0xef939efa, ++ 0x7b4b8e7a, 0x873949fe, 0x9c45213a, 0x9b711717, 0x3ad7ef22, 0x553ec1bf, ++ 0xd6bc7bef, 0x1573a53e, 0x5b71ce8c, 0x777d1853, 0x3bb7c46c, 0x6160df71, ++ 0xe786c98d, 0xdca04e5e, 0x6ed5fae3, 0x34a79f99, 0xb1383d73, 0xd79d087b, ++ 0xc394fc2d, 0x1f92b585, 0x7fef17cf, 0x9fda61fc, 0x4ae20730, 0x1ede6adc, ++ 0x7c79af2f, 0x45c3aa1a, 0x9e257797, 0x85b8bfcf, 0x70e8a7ef, 0x9dc1c2cf, ++ 0x5d9d1207, 0x763fc9c7, 0x1de4ac7c, 0x9f514c1e, 0xace8531b, 0x04de97cc, ++ 0x383e1879, 0x2a2fb748, 0x7c7c52e6, 0xe54bc2ae, 0xead8e905, 0x16c72851, ++ 0x780f9d2b, 0x1909eebd, 0xd92ac1ef, 0xe7197e95, 0xad2323bd, 0x17c9ef74, ++ 0xdd684b15, 0x39455cf4, 0x95bf0a95, 0xbbcddbbc, 0x2fbde81a, 0xe3d486ea, ++ 0x2237db79, 0xdbfec2ad, 0x576be53b, 0x719588e7, 0xf390799d, 0xccfbc157, ++ 0x38515996, 0x636786ae, 0x5f2047ea, 0x8c36ac23, 0xbec48af7, 0x3cb59691, ++ 0xb6653e8e, 0xf81130be, 0x9ddd6a7b, 0xdb1f7871, 0xd3a9869c, 0x1ee179f0, ++ 0xbff186c9, 0x28e4cf6b, 0xae7e979c, 0xf3c28e6f, 0x55af9f50, 0xe9f951ce, ++ 0xcc8d23ef, 0xfb627761, 0x733d0191, 0x6aa5f1a6, 0xe7119394, 0xf59e74f4, ++ 0xbca73c2c, 0xca70e5c8, 0x0c4fc08b, 0xf39913ee, 0xb4a7cf1a, 0xbcc56bcf, ++ 0xf718946e, 0x657629c7, 0x679e82dd, 0x4fcfe70f, 0x0939dbae, 0xc9bd3bfb, ++ 0xbfbc4360, 0xfea064d8, 0x4c7cc3e7, 0xda9ef807, 0x0839e7c2, 0xf4f8fce3, ++ 0x999f3e16, 0x33e7cb5f, 0x6e0d0b25, 0x2d53fe7e, 0xed21d98f, 0x2e9ebee8, ++ 0xef98ffee, 0x0f9be3e6, 0xabc7127e, 0x5668db95, 0xbec6e74b, 0xad50feef, ++ 0xb1a7bedc, 0xdaf2ed0f, 0x7a089c95, 0xbca3bea2, 0x7f30f22a, 0xb7a75f2d, ++ 0xa167a6d7, 0xa1f229dc, 0xd2aac7bd, 0x83fdf8c8, 0xda1770ba, 0x4e91c981, ++ 0x3b87fa03, 0x9163cd1d, 0xb953232c, 0x75b3953d, 0xc6e73c6e, 0xde9d4d2a, ++ 0xd84a739b, 0xc654d2df, 0xb54c59ef, 0xe29bfdf1, 0xc25297bc, 0x6fd05240, ++ 0xffb08e4f, 0xfc7aef03, 0x9337ca47, 0x93cf20f4, 0xe81fd947, 0xdbec62e9, ++ 0xf4932b94, 0x43c99e30, 0x007bbbec, 0xb7fd657c, 0x7b26febc, 0xf06001a6, ++ 0x858c7705, 0xeea96efa, 0xc199294b, 0x1cde9cef, 0x83e3829f, 0xf3e35fe7, ++ 0x37ef58a4, 0xf3899658, 0xd6a4175f, 0x82d24b41, 0x63dfdfed, 0x33bafa39, ++ 0x581b3708, 0xa00fde2a, 0xf3bfc76f, 0xadd53b32, 0x79e4ed4b, 0x682b6301, ++ 0x9f8f9e7f, 0x8f1f81bb, 0x45cf0e39, 0x502b7971, 0x6954e1ce, 0xf8b8e1ce, ++ 0x7ce53379, 0xa9fe7294, 0xd8fcf07f, 0x7e72efba, 0xff8182ec, 0xadc9247d, ++ 0xd525ff3e, 0xedee89ff, 0xe6b1f4a9, 0xfa83e230, 0xde094d5c, 0x72740723, ++ 0x44096abf, 0xbd179f02, 0x317a4118, 0xd077894f, 0xde0d0f59, 0xf812c03b, ++ 0x8407837e, 0x60ac9e3c, 0x71e97abd, 0x2fdef55f, 0xe6c780f4, 0x480def30, ++ 0xa1dd62a7, 0xd44e45d4, 0x8c28cae3, 0x24bfce37, 0xfb4226bb, 0xb2a71162, ++ 0x1ec2b14d, 0xa05b81c8, 0xffad31be, 0x193ff446, 0x389e3ca9, 0xfd481697, ++ 0x3493da25, 0x76822f3e, 0x672e6fb4, 0xd8b1add9, 0x87f6dcee, 0xbe01cd7b, ++ 0x78dbe099, 0xe836eb1e, 0xee9db873, 0xad32629d, 0x3df9fb33, 0x8be67a48, ++ 0x55fde3b2, 0x738aa44f, 0x501e7443, 0xf7428fe1, 0x4f80fc0e, 0x33ab1c63, ++ 0x57ce0333, 0xf475b3fb, 0xbe14a8f7, 0x2e17f728, 0x2cf3cdda, 0xc0521674, ++ 0x693a2f98, 0xab8f7f16, 0x8b7c3f83, 0x475054e2, 0xaceeca9f, 0x7fb9d59b, ++ 0x88c1be1c, 0x7ed8ff5d, 0xe154def2, 0x7a59d31f, 0x458cfde8, 0x3938cda2, ++ 0x54f789cf, 0xd3358a2d, 0xd68b23bd, 0xc43f24f7, 0x68584bcc, 0x862eb63b, ++ 0x9a6564e4, 0x579ff44c, 0xa0fee8c7, 0xda24badc, 0xceb13937, 0x5b54654e, ++ 0xfd3f3d02, 0xdc193bc2, 0xe4fe711e, 0x18fc77fe, 0xdff49fda, 0x5d64a97d, ++ 0x11e913dd, 0xfdc83e74, 0x918b22d9, 0x5f7a0bf2, 0xa7ed2b7f, 0x1f99946c, ++ 0xef07a9e0, 0xe57d2034, 0xdad72e70, 0xba1521fb, 0xba3f0499, 0xba722fba, ++ 0xbeeaefa8, 0xf86269c8, 0x4ee723d3, 0xf7b5bc44, 0x351c3e44, 0x4ae491be, ++ 0x7c47a73e, 0x0c48b74d, 0x969dc2af, 0xd4c3e6a7, 0x30d86aa9, 0xbfb24bfa, ++ 0x7e5ad186, 0x6fce0333, 0xf3f56e4d, 0xdf855327, 0x5ffacfe8, 0x48cd9ef5, ++ 0x1eb5e933, 0x780551ef, 0x1367b89a, 0xd78c39e3, 0x244dba2f, 0x09870fb7, ++ 0x091949ba, 0xfff97e78, 0xb553fbf7, 0xef6aa5f7, 0xcb71bd43, 0xb03c1522, ++ 0xf6aa17f6, 0x532dd537, 0x5607a7d5, 0x3487eaa9, 0x670546fe, 0x6aa33d36, ++ 0x46c8ec3f, 0xe688fd55, 0x51faaaad, 0xe0a876a7, 0xa8ff5b9b, 0xdb4b7f6a, ++ 0xc59c155e, 0xcfb551de, 0x82a07f36, 0x513ed9c7, 0xe135bfb5, 0x36feaab8, ++ 0xfd5559e7, 0x54977e84, 0xf7a31af0, 0xa5ea2a78, 0xf7aa5feb, 0xafe73126, ++ 0xe9d67ef1, 0x002b9d0e, 0xfd8ae7f0, 0x92d77210, 0x6f71e362, 0x4be7462f, ++ 0x03a3c9c7, 0xfc757724, 0xfd6a4aef, 0xc7acfe93, 0xf639f98d, 0x666f3f2a, ++ 0x1f4fb885, 0xb768bdf2, 0xddfe8599, 0x9b1c98b4, 0x24f58e0a, 0xcfc7daa8, ++ 0x13eaaa70, 0xf554fdbd, 0x2a5d73c9, 0xb87ca538, 0x25f77daa, 0xe69c156e, ++ 0xefb551cb, 0xc151e559, 0xa8666bbd, 0xeb5df7da, 0xf7f7d555, 0xdfd555cf, ++ 0x055ca5b8, 0xa25dac0f, 0x9d537f6a, 0x1e9f554f, 0x0fd552a8, 0xc151ac69, ++ 0x556b4d99, 0xf11d87ed, 0x3447eaab, 0x8fd5516f, 0x82ab553a, 0x53ad6e6f, ++ 0x2da5bfb5, 0xd8b382a0, 0x6cfb5541, 0x782afbf3, 0x5563ed9c, 0x8e135bfb, ++ 0x736feaa9, 0x2bd5569e, 0x7e84c8f1, 0x8b9faa5f, 0xf5d724f8, 0xf6fdea8d, ++ 0x4877637b, 0xbb294e74, 0x5ee50f7b, 0x1930e6c3, 0xe50f19e3, 0x41b8ec83, ++ 0x1596ec10, 0xf9db79cf, 0xca3c99be, 0x6e28392b, 0xc4e29721, 0xe7e03c7d, ++ 0x957670a3, 0x6ff18696, 0xeace3044, 0xf5c86576, 0xbb9359c7, 0x4963c233, ++ 0xeef8ef77, 0xd88f38b1, 0x47ee9e3e, 0x8895be66, 0xdeef7287, 0xd3ac61bb, ++ 0x336fd0fb, 0x90fa629f, 0x5860eeb8, 0x57c1b74d, 0x66dfcf99, 0x1ef0c73e, ++ 0x457ef6d6, 0x38ff02fe, 0xfe90a2f4, 0x003cc357, 0x4d60feff, 0xc40de805, ++ 0xb0a9bf40, 0x22a6bc11, 0x2b27e081, 0xadae549c, 0x33e547e8, 0x5faa2e15, ++ 0xe09c3157, 0x04dc2ae7, 0xa8722bfb, 0xa1e158dc, 0x662a9be7, 0xcc02fc10, ++ 0x02dcb18b, 0xb72c64f3, 0xeb177cc2, 0x17fcc1b7, 0x7c2a97e1, 0x5456d654, ++ 0x151df3d1, 0xaaef0435, 0x2bf04b58, 0xeb2a7e15, 0xf950b62a, 0xaa5a8ac7, ++ 0x23a8afaf, 0x008a8df8, 0x468a81c1, 0x3456f782, 0xe2bfbc11, 0x2a07c108, ++ 0xac6ca99a, 0xdbe54538, 0x7f54ad15, 0xe08da2a8, 0xf1d4bf20, 0x5ef1132d, ++ 0xe5039091, 0xce42879e, 0xe4467652, 0x1c848b6d, 0xe877ef06, 0xc5f711b3, ++ 0xf49ca266, 0xf4393923, 0xed71e25d, 0xe9294b7c, 0xf5ca395c, 0xacfbf6c2, ++ 0xa9d8e7b4, 0x3e01ef3e, 0xe217bd3f, 0x503f5c57, 0x2c5fadce, 0xc33dd037, ++ 0xe31dce78, 0x9fe58b9f, 0x70c3bc53, 0xfe441c3d, 0xdd137abe, 0x95e0a6ab, ++ 0xc032f787, 0x69f109fb, 0x6b375cfc, 0xab3ad034, 0x3b65b99e, 0xbe7e739d, ++ 0x9f9f3c3b, 0x7cd1f3a2, 0x739f9239, 0xdde71fee, 0x962fcf88, 0x9d8039cf, ++ 0xb45cd917, 0x0a6b98ce, 0xad93fdd0, 0xe7ca6507, 0x328f4575, 0xcbbccfb1, ++ 0x774e37fa, 0xe73ab8c3, 0x07dd32df, 0x32c1aef6, 0xbb04f303, 0xe779f3bb, ++ 0x553aeeee, 0x779c6af9, 0xb5f3e217, 0x0ea67ca5, 0x4ff5f848, 0x7f70be16, ++ 0x7c9e705a, 0x21354e07, 0x9ccc9dfe, 0xc8f7da06, 0x49a56fdc, 0x97a9bf78, ++ 0x47cce9e0, 0xef58ff65, 0xbbdbd41e, 0xef609f98, 0x676a5348, 0xd5e2d2e3, ++ 0x146af028, 0xe7e528f8, 0x713fde71, 0xd784dcbc, 0xed6e23bb, 0xf052e383, ++ 0xd3ce2dea, 0xcfad624f, 0xef5f7e21, 0xea45b2f9, 0xfe3e51d9, 0x89117203, ++ 0xc7681569, 0x12a47d70, 0x7d40fa37, 0x9cfc83e5, 0x791722bf, 0xf7c40098, ++ 0x1ce8921e, 0x404e5040, 0xe51e703e, 0x8273a568, 0x48272720, 0x74c8464e, ++ 0x9d5dfe1e, 0xeb448fbf, 0x988c73cf, 0x80722837, 0x5ae8f47c, 0xf9c54a0e, ++ 0xc839e504, 0x87c817d7, 0xd61b5e2f, 0xf655e90f, 0xd22708c6, 0xcfc752ab, ++ 0x96def92d, 0x1627dff9, 0xc51e5ca6, 0x7a6413ef, 0x4af30b97, 0x4b7ce2b9, ++ 0x6c96cc83, 0x5acec4ef, 0xfd1f3c9d, 0xefbf026e, 0x3eb352af, 0xfe727263, ++ 0xaf9c9c99, 0x2c9e168b, 0x77ff0196, 0xf3a69ef7, 0xffbb4a2e, 0x9f947d03, ++ 0x008000f2, 0x00000000, 0x00088b1f, 0x00000000, 0x7dedff00, 0xd554780b, ++ 0x333ef0b5, 0x4c991e67, 0x3335e4c2, 0x4c933279, 0x49309e42, 0x3ac40680, ++ 0xd3c30109, 0x248255e1, 0x51a0d832, 0x5a403302, 0x99deaf63, 0xd2091e10, ++ 0x042d60db, 0x7c509d45, 0x37bdaf5c, 0x46c1a45a, 0xc140826f, 0x1f50314b, ++ 0x80dadbd8, 0x10ab6ad6, 0x2da7f684, 0x6b5affad, 0x99cc939f, 0xedad404c, ++ 0xfdfffdff, 0x9b7c7df3, 0xfb3ef67d, 0xaf7af6b1, 0xfa7ccfb5, 0xc4ddfc29, ++ 0xd5e9b798, 0x6302473c, 0xeef5ca9f, 0xc65d33b3, 0xe65cbae1, 0x92c604db, ++ 0xabfaab18, 0xed05d3da, 0xa78c6d6a, 0x18dfa433, 0x49b18a9b, 0xecc8fd8c, ++ 0xbf41b589, 0x6ef9c43f, 0xf9416553, 0x07ef75d5, 0x3af9d5e0, 0x50a598db, ++ 0xbe76300e, 0xe3cf4a17, 0xf6832d26, 0xca9399db, 0xf2a6e63a, 0x32d0164e, ++ 0xc0ee6335, 0x64cb2d0e, 0x45d66eec, 0x7d96d7cf, 0x8a60ccdd, 0x0c9e543b, ++ 0x7eb037ac, 0x8365ee7a, 0x633b5695, 0x8f9b5a4b, 0x8b631958, 0x48cc77da, ++ 0x30b631b6, 0x9608f2b8, 0xef09f60b, 0x4bcca007, 0x5d71d8f2, 0x736f8203, ++ 0xeb7fcc0a, 0x539be5b3, 0x757cf9e1, 0x44d2d26f, 0xd4bff178, 0x5ea027ce, ++ 0x3a973223, 0x7fbee47e, 0xd9e4f66d, 0x5cbee126, 0x6c752fb4, 0xf6078e55, ++ 0x7b2eb35f, 0xca10a78c, 0xc025cc8d, 0xe92f8338, 0x3d617b82, 0xc11b16d9, ++ 0xead97e63, 0xbac2a55f, 0x1b783899, 0xcbef7683, 0x766df8ba, 0xe19b97dc, ++ 0x6317053e, 0x809f304d, 0x7f094373, 0xc644e2b9, 0x13833356, 0x0356fdfb, ++ 0xdbfea04f, 0xc16c1674, 0xac5cc0ba, 0x1a0bb184, 0x0630ab63, 0xd63c32da, ++ 0x5dcf5812, 0x4185b02c, 0xecf557bb, 0xd3538478, 0xf70b8f58, 0x5dbbf77b, ++ 0xb9e18a5b, 0x219822a6, 0x679a38c0, 0x071c4e74, 0x5fbd3366, 0x0f32f300, ++ 0x9e1a34fb, 0x78431f33, 0x3b8e0bfe, 0x84bae461, 0x147fa3b2, 0x69d31962, ++ 0xf30f4059, 0x9b182a07, 0x5205e30c, 0x0016c1b4, 0x36820b51, 0xdb71e70b, ++ 0xe391c67c, 0x7bd6949f, 0x69b02fec, 0xf6004380, 0x691084f3, 0x51fc9f9e, ++ 0x18f30f18, 0xfdc1e786, 0xe68ccc07, 0xd3b36159, 0x31f3c879, 0xbb9a40e3, ++ 0xe0cef008, 0x87cf0db9, 0xcc551359, 0x137ad8cc, 0x3cc61ffc, 0x038dff66, ++ 0xd4fe67cf, 0x2f3c34b6, 0x8f1a5fc0, 0x3e08557d, 0xd975c761, 0x593f5802, ++ 0xe006776e, 0xd36602f1, 0x52dcb9e0, 0xb83393f6, 0xc6f45b8e, 0x6c94355e, ++ 0x81a3e69a, 0xf61f3a5c, 0x6e152669, 0x19da1936, 0x1b4d879f, 0xf3bce223, ++ 0x8b761779, 0xef87dbd8, 0xe0d4e633, 0x2fd8f2fa, 0xf9ec7864, 0x95f68134, ++ 0x67408beb, 0x847eb1b8, 0x30b3689f, 0x7c0bd728, 0x0dd3ebff, 0xb623a441, ++ 0xa7f68f3d, 0xc379f3d5, 0x3354b7df, 0xeb4bd0e6, 0x1ec97f84, 0x0ee4733d, ++ 0x4deb53d7, 0xcfba7a8a, 0xb63fe8aa, 0xb768a6c9, 0xed157207, 0x454ead59, ++ 0x4cbdbb3d, 0x875c7fd1, 0x0bcf514b, 0x17fa2956, 0xd456ed3c, 0x15aaba8b, ++ 0x7b7427fd, 0xbdc5ed14, 0xd2f68af5, 0x7d453e63, 0xa2937f52, 0x04ce57ff, ++ 0x0653ed14, 0x37ed155a, 0xa8aed07c, 0xa1d838df, 0x95d37fe8, 0x9cbda2a0, ++ 0x7da2abfd, 0x4539feba, 0xa0e9867d, 0x51e3ffa2, 0xd019e3b1, 0x3ed6cdcf, ++ 0xb659f3c5, 0xe6f78ae3, 0xd4529ee4, 0x39ce971f, 0x7440ccb0, 0x1d4ab3b1, ++ 0xf338c2d0, 0xc62b6f9c, 0xfcf93d61, 0xb3f8a3fc, 0xbafd8ec7, 0x63e4f918, ++ 0xe23b41aa, 0x4a6d4dad, 0x94763a41, 0x6804382d, 0xeb5c72c6, 0xe5bd902a, ++ 0x8438ed56, 0xb9fbbe65, 0x561f200a, 0x10ea7d58, 0x173de396, 0xe638602b, ++ 0x057b8fac, 0xf15f12cb, 0xa52e0b74, 0x582bc169, 0x9bac0e4e, 0xf1f57c8e, ++ 0x48f9b5fb, 0x32f1b147, 0x3f08ba7e, 0x4455931b, 0x8ccb8dcf, 0xe63fe441, ++ 0x03228c1b, 0xaefe613e, 0x8f1b1379, 0x962b4965, 0x0b3d7ead, 0xe2db196a, ++ 0xf36e5467, 0x0730589b, 0xa56fd9d0, 0x55a9e37a, 0xce309955, 0x04d15ad8, ++ 0x71a660db, 0x60db25f7, 0xda0fcb7c, 0x1939f773, 0x97eda5fb, 0xe7b0350b, ++ 0xb2df2cd8, 0x33ac38ce, 0x8b8062d7, 0xa6c46019, 0x7edfb632, 0x38503b8f, ++ 0xe1d73eb2, 0x41f215fe, 0xb9e57626, 0x6dc78663, 0x53adf8ab, 0x36084265, ++ 0xdc030fba, 0xe8192577, 0x3b97ac3d, 0xaeb8cb3e, 0xc0df910f, 0x04575f73, ++ 0x728f3e3a, 0x57f61263, 0x2dc2bf11, 0xf859b9e1, 0xc88b31b1, 0x96006302, ++ 0x9d34a6bb, 0x679713bd, 0x9fc8080a, 0x1f7855d8, 0x760a4af8, 0x4dfaa2ca, ++ 0x6327a806, 0x2198c6dd, 0xe71573db, 0x3b1878b5, 0xc93f8217, 0x2efacaf5, ++ 0xc739f380, 0x2b347af0, 0xf6110154, 0xdbbef9a0, 0xf67984e9, 0xa17ec2d4, ++ 0x56cb4bbe, 0xfb870bb8, 0x9231538d, 0xb9d8b7ef, 0x1757673c, 0x60c41739, ++ 0x61e7ef9d, 0xf7d2e0ff, 0xff0edc60, 0xea532a15, 0xf807827d, 0xedc6a59b, ++ 0x4d3f400c, 0x70a3c00b, 0xed123c24, 0xf341c122, 0x0d82bdca, 0x36ecb9fa, ++ 0x26a52f1a, 0xad4efb48, 0xd6437187, 0x8203156f, 0xef5b9e09, 0x3eb8080b, ++ 0x64edc9ab, 0x9bd31ef0, 0x4837ff09, 0xfa6d6134, 0x4af7d2eb, 0xdbbf5c61, ++ 0x7334fd89, 0x110b3f00, 0x83133ea0, 0xc4da52f2, 0xf9c22c31, 0x406ea5c8, ++ 0xa3a55cc5, 0x7c66c7b7, 0xe2f247cb, 0x1b2da356, 0x65f1fbf0, 0x08ceeac6, ++ 0xf824b9e3, 0xce578d6c, 0x7873566f, 0x92fb7cc8, 0x4ca39f89, 0x98e21bc7, ++ 0x486f8f82, 0xd6b9689f, 0x7a1d2d7a, 0xef5909e6, 0x04c7982e, 0xb2feebe3, ++ 0xd7fb84ce, 0xf34dcc09, 0x749f9c89, 0x89db9a3e, 0x39f8447a, 0x6047c08e, ++ 0x104a633d, 0x2d82063f, 0x5aba8740, 0x26f513ad, 0x116f3fcb, 0xb0a73650, ++ 0x8bf90176, 0x98f2bd25, 0xf44d7288, 0x1b5ca1e4, 0xe0ebbeb1, 0xb27e7ca5, ++ 0x2f3f0e7c, 0x6f59a7cd, 0xffbc2395, 0x1f50c34b, 0x293c7f5b, 0x4f8213de, ++ 0x2cbc25ab, 0xa46aed63, 0x8baca98f, 0x9fac69ca, 0x41b2afca, 0x24cc5d2a, ++ 0x9cc15962, 0x37325654, 0x8f993395, 0x4ed62aca, 0x45d66ce5, 0x4fd65ce5, ++ 0x48367ce5, 0x34999ba5, 0xf9042e58, 0xe662e58d, 0xcc6bf2a6, 0x88fde547, ++ 0xd5cf80bf, 0xb7ea9dac, 0xbb2a2eb2, 0xc06cee81, 0x7e045ecf, 0xf00f6587, ++ 0x065f2c39, 0xaf65873e, 0xc06cc6df, 0x73f90ef7, 0x77ec3ca9, 0x5fd47952, ++ 0xbf31e546, 0xeabdfa8b, 0x84f2a2af, 0x49e54ddf, 0xfd95357f, 0x3bf50f7e, ++ 0xf2a7afed, 0xca8fbf75, 0x544dfd37, 0xa807f19e, 0x95bfb9fc, 0xa05a71ca, ++ 0xee6f8467, 0x3842f140, 0xb5778cff, 0xe7f01b2e, 0x7a5f12e3, 0x5efaa5c5, ++ 0x373c44de, 0x1e21d315, 0x10106e54, 0x2ab92cff, 0x6dca1057, 0xaf85ebb9, ++ 0x24f5b943, 0x9674dfd7, 0x2d0fd218, 0x0d828d1d, 0x0616edc6, 0x9670d1d4, ++ 0xeabe778f, 0x2e7f03d6, 0xa29b61ef, 0xad7f589d, 0xd7780f5d, 0x760df1a9, ++ 0xf6c3fb42, 0xd4fb529f, 0x7bbfd398, 0x7da9d786, 0x62d661ca, 0x9d13fa82, ++ 0x0513dba7, 0x7e640ebe, 0xc37f61ff, 0x3ae22cdd, 0xb29f9c39, 0x99ca00b3, ++ 0xa48d7bc1, 0x9c77175f, 0x7d41562b, 0x04b1934a, 0x7ed0aa94, 0xa3f788bd, ++ 0x976f0bf5, 0xceb3dbdf, 0xd87082dc, 0xe5a83efa, 0x6b2328f0, 0xa17d78a0, ++ 0x67d55c72, 0xafa99f9b, 0x3f687f31, 0x19e31ae1, 0xd82f5db2, 0xe3cffe93, ++ 0x6b7e3879, 0x39f77d3e, 0x47d89a95, 0x7dd3ca3c, 0x0ccf9c71, 0x17ba7e82, ++ 0x5e2fbdd6, 0x6839b7aa, 0xf10fc85f, 0xcb6eb6dc, 0xbea0060c, 0xfebdca2f, ++ 0x5b7fb638, 0x4d0bdce5, 0x6d9e0cfb, 0x38775479, 0xbfb0daf7, 0xe01e372f, ++ 0xe5cd119e, 0x6fb4ced2, 0xe842d945, 0xdb9dacff, 0x5da6bb63, 0x3b44efee, ++ 0xb2c555a2, 0xadbdbde1, 0xc2e5b7b7, 0x0edfdf38, 0xc7d403fa, 0x96d758dc, ++ 0x6d99ed0d, 0x896ac9aa, 0xbe3ae1c7, 0xc9eebdbf, 0xa55fa86d, 0xc0e7c7e5, ++ 0xbf1259b8, 0x281848cc, 0xbe7800de, 0x23eacb53, 0x240ff3c9, 0x6183a97a, ++ 0x665e01ce, 0x3afaf8e8, 0x543aac35, 0x3933e9de, 0xe6c9cd7f, 0x04dcd4eb, ++ 0x74fc86f8, 0x11b821ac, 0xd63e5ff6, 0x6f31f048, 0x578107d2, 0x9fda7333, ++ 0xed0cdd4e, 0x272a3de6, 0xa5a274aa, 0xfa8359a1, 0x85d632fe, 0xf029d8f4, ++ 0x5ce903f7, 0x2145042f, 0x10f8f913, 0x599ff7ff, 0xeb8710ea, 0x8080ead6, ++ 0xd8f97bf6, 0xe5006106, 0x82ddda4f, 0xb9b4f80d, 0x627823da, 0x51f03ed0, ++ 0x47b6457b, 0x5a7584cc, 0x50fde06b, 0x927992fd, 0xde615cf1, 0xf3d22eea, ++ 0x7ce84958, 0x0e1cd9c5, 0x264ec19b, 0x9693757d, 0xaf0e15d6, 0x988a9ce8, ++ 0x73e1a4cc, 0x97ef6f0c, 0x236fb4e0, 0x3074814c, 0x27cddb85, 0xfd21489f, ++ 0x834efe71, 0x93a7ed0b, 0xa92bf23b, 0x1754e0fe, 0x9f2791ea, 0xcb133a98, ++ 0xa6ce0ff9, 0x7605277e, 0xf9e1ed0c, 0xe22ade0f, 0x582c8cf3, 0x56778e17, ++ 0xff38f84b, 0xf7a5bbc1, 0xed8955bf, 0xbfc0aa65, 0xd6591da1, 0xda344cf2, ++ 0x9e6353c9, 0xa4f2c54f, 0x0fb1a06a, 0xc4c5bfe6, 0xd9e28a7e, 0xedf896dd, ++ 0x82cff82a, 0xd41a991d, 0x33334baf, 0x988bbd69, 0x7a00e88b, 0xed375d90, ++ 0x4057fee9, 0xed5f6293, 0x660e9c1a, 0x9b75732e, 0xd159630e, 0xf044aceb, ++ 0x1f731e55, 0xbf6672c6, 0x97d512af, 0x87ed33aa, 0xd7287cb1, 0x79f08a53, ++ 0xf6bf9fea, 0x1f5053fc, 0x09a37f7b, 0xc6c720f5, 0x917b5981, 0x186b8e1e, ++ 0x32eec3d2, 0x111abb5f, 0x851edf58, 0x957921fc, 0x5cf2854a, 0xc38f6f67, ++ 0x43956eba, 0xbee17685, 0xda7af6b8, 0x2181b677, 0x39055f1c, 0xdbb17884, ++ 0xf4851ed4, 0xe7497404, 0xf1c99e50, 0x33e71752, 0x28f3e1c5, 0x9fa87cfe, ++ 0x1e6fd781, 0x271ed7ea, 0x02893cd0, 0x36a09fd9, 0xc920de90, 0x2f805def, ++ 0x639817a8, 0xd7e89d3c, 0xf4e2edd9, 0xbc72301f, 0x405beec0, 0x021b457f, ++ 0xf76d68e1, 0xa0fb21cd, 0x840c0c46, 0x062005ea, 0x41b45c71, 0xcea03cf0, ++ 0x29debed0, 0x19f03af0, 0xa1fe175a, 0x346ac31f, 0xcb1d2277, 0x947b37eb, ++ 0x163ee1e3, 0x93df871a, 0xda41aef1, 0x7f84bd57, 0x3c7c3dbb, 0x326bbd79, ++ 0x023f5c6d, 0x9332adb1, 0x03d7c6fe, 0xac8550fb, 0xed1fa427, 0xccdd686f, ++ 0x00bc4569, 0x8e90123a, 0xe8624a10, 0x5744ebfe, 0xffae2c54, 0xdf883dc0, ++ 0x6047c8b1, 0x9be9df9d, 0x0d3a27a2, 0xa67347db, 0x1169e69d, 0xedea027d, ++ 0x823c6bb3, 0x02d3f60b, 0x8c768cf4, 0xd39baa59, 0x66d79244, 0x2682ede3, ++ 0xb4e6bf64, 0xb3d3923a, 0x1acd3dab, 0x65d9c738, 0xefc44ed1, 0x936bac39, ++ 0x61f7d389, 0x1c6fac07, 0x3233fa1b, 0x71d03f79, 0xe9c55d5f, 0x3a6ff872, ++ 0x43cf2deb, 0x1dff79f9, 0x768e9173, 0x31f66b7e, 0x6e6a7f5c, 0x78b21f67, ++ 0xee7e45f7, 0x75fb96ac, 0xf7c47b1c, 0xd691f742, 0x3e10f508, 0xaca0d293, ++ 0xea283e03, 0x84595e32, 0xb7f438fa, 0x670ba2a9, 0x8cdf20e7, 0x3f389955, ++ 0x638b080f, 0x1195f246, 0x5fc12578, 0x33a79f3e, 0x66fe741d, 0x81ce8aa3, ++ 0x4bf53a0d, 0xcb9da462, 0xb41304e7, 0x018f9900, 0xaa54b578, 0xcf1d8283, ++ 0xdea3fa0b, 0xf092c83b, 0xa9cfc35c, 0x9d9b6353, 0x877a7c83, 0x1b04f4ca, ++ 0x33905709, 0xbb5e906f, 0xe1da9123, 0x7f27a8b9, 0xef238c1f, 0xaea91d5b, ++ 0xf5eb8f3c, 0x2ff5947f, 0x7c8fb1c8, 0x78b69a9e, 0x2fac1e76, 0xfce8c7d5, ++ 0xddc7dbc3, 0xb2573ca7, 0x7da2273f, 0x5fbd82c6, 0xa7673ce0, 0xfb24abed, ++ 0x655cec27, 0x8848cbbc, 0xb36a172c, 0x44667d38, 0x91574f3b, 0x9e92215e, ++ 0x93174ee0, 0x81a2ed42, 0xdc076e4c, 0xc92323f4, 0x3eaef621, 0xd9d72288, ++ 0xee00ffdb, 0x0ab2e2b3, 0x391d918f, 0xb3bbe871, 0xd3f19ca1, 0x17ffd7d7, ++ 0x17f19bf4, 0x7f3e2963, 0x42cc0d91, 0x18e04887, 0x6f5019d8, 0x76c9f8fe, ++ 0xd4b49474, 0xddca2730, 0x726575a1, 0x4d63f779, 0x35fc4dd0, 0x897b644f, ++ 0x2e65820f, 0xd3b70b9f, 0xbc4e74d5, 0xda6bb98d, 0x38b46ec9, 0xa357810a, ++ 0x396baf5b, 0xb48fc5f1, 0x0b8efd0c, 0x729a6dab, 0x1ac2ffd8, 0xd225669b, ++ 0x50aac8b3, 0xed54588f, 0x6a8be7a4, 0x9eb9fc9c, 0xed5c5f3f, 0x6b8be7a2, ++ 0x11b9fc5c, 0x963c039e, 0xfdfb0754, 0x6312ee30, 0x7e854dbc, 0x6f371af0, ++ 0xf6a3a2bf, 0x380f6013, 0x510de500, 0xedf7e241, 0x5ce8a81f, 0x840c1a5b, ++ 0x9298bad7, 0xdf843663, 0xf513954a, 0xc8ba5d28, 0xa8ef504c, 0xd0d50776, ++ 0x4f6b30fe, 0xe8bdfdc6, 0xfa426f59, 0x344d317b, 0x745efee1, 0xf08cdd81, ++ 0xd98317ab, 0xa1c90976, 0x5a5d62fe, 0xfde91b70, 0xab027f1c, 0x0567e4f4, ++ 0xacfc875d, 0xa48a556c, 0xfd3970c7, 0x4189edc8, 0x3ab1e3e4, 0x08b9abe7, ++ 0x79f827df, 0x8a2fa77f, 0xcbef33c6, 0xd1d9460c, 0x57c10c8e, 0x7b77f486, ++ 0x1ab3b639, 0xe7f9c266, 0xa367b8d6, 0x87b2d91e, 0x030d9139, 0x70fbd37d, ++ 0x0ecfb49e, 0x04cae9cf, 0x9d3bb7ac, 0x0a004e6a, 0xd9e2d0be, 0xfb86dc78, ++ 0xb2995069, 0xde97f619, 0x87d8a86f, 0x39e99070, 0x9943a25f, 0x37e48c7f, ++ 0x8e3863ce, 0x73855975, 0x07cbf41b, 0xec7e8c19, 0x824eb447, 0xd156e073, ++ 0xef96f889, 0xb14d7b11, 0x269df4c3, 0x748f9b8d, 0xad3ee388, 0xfb71b7a4, ++ 0x47b47494, 0x5847d3a2, 0xe38098af, 0xd71a3076, 0x07eca1d1, 0xf280969a, ++ 0xa75e9c28, 0x01f90f66, 0x01187014, 0xfbc886e7, 0xd757de1c, 0x97da1cf1, ++ 0xf90bef8a, 0x31cf3c1a, 0xf91c7f3e, 0x48b54e61, 0xdac1c6fc, 0x1dfee34f, ++ 0x685044fb, 0x253cbce1, 0xee6f7c06, 0xb5b11576, 0xf89fac79, 0x2df6f5c2, ++ 0xf7c237fb, 0x81bfbe19, 0x23e7354c, 0x59b83eb2, 0xcee0fa4f, 0xc631017b, ++ 0x4065be90, 0x764542bf, 0x00b3d7c5, 0xdf12f50e, 0xe6aa7cd1, 0x48c5a4fc, ++ 0xdcb1aa78, 0x7fea1b97, 0x51579a98, 0x12fd459f, 0xdc515616, 0xa3714348, ++ 0x43b63e70, 0x00ca6f1a, 0x7fe14fec, 0xc85b3036, 0x8c1c6efe, 0xba6fd457, ++ 0x5fe8a292, 0xda17c40e, 0xa05f5d3e, 0x2a619f68, 0xb66fd455, 0x3fe8a0de, ++ 0x515d36cb, 0x473b939f, 0x739e7fd1, 0x4b7ea291, 0xff4572d9, 0x2bafae05, ++ 0xad5517da, 0x712fb456, 0x97d4506f, 0xa293ff56, 0x8b4f32ff, 0xfd797da2, ++ 0x70f68a03, 0x1f2e49fb, 0x777ce2c9, 0xca77d597, 0xeb953c45, 0xfde41153, ++ 0xc7b9e860, 0x2a7d7346, 0xa42fdfbc, 0xe05c78f3, 0x18c1b1f3, 0xec9dd215, ++ 0x315d637f, 0xef5cff0a, 0x01faa9d4, 0x9c72fa23, 0xb33d216f, 0xc51fdc93, ++ 0xd93dfc82, 0x11b7d57f, 0xeb78c1fa, 0x282d3263, 0xeaefd0ef, 0x04fa02d1, ++ 0xb7bfe455, 0xf80a36b4, 0x91bdb2dc, 0x68ae55fb, 0x64212799, 0xe7c0cc1d, ++ 0xf239e295, 0x9a2b993a, 0xf8a307fb, 0x5f923df3, 0x2bf461e9, 0x2ff630e5, ++ 0xef0fd966, 0xcb9371a1, 0xcff401b4, 0x413e7508, 0xc3cb7c8b, 0xd71b3a4c, ++ 0x5a0fc907, 0x22c31ced, 0x772e59c0, 0x05ccadfa, 0x031b5be3, 0xdbd85acd, ++ 0xebffbe4f, 0x7de1bb1d, 0x32918fab, 0xffefb3f0, 0xc8334766, 0x6cb2b791, ++ 0x459237c4, 0xd647e70e, 0x93e1f8be, 0x5acedf30, 0xd5f20973, 0x6f54f6f0, ++ 0xd7a3c5cf, 0xcd647f68, 0xb8efb781, 0xbb6bfbd6, 0x69096ecf, 0x5a2fd51f, ++ 0x215cc29d, 0x45d36078, 0x26ffcbf6, 0xde0deb8b, 0x63f25aa9, 0x79ed437d, ++ 0xc2ffe90f, 0x7e4d3fd4, 0xfedfa19a, 0x07c86df2, 0xb26ff9e1, 0xeb823f78, ++ 0x1927c779, 0x00a33cf8, 0xb7187bf4, 0xde322a25, 0x7c7c1d9a, 0x883352d1, ++ 0x31f5a07e, 0xf9da1b5a, 0xc80ffaa9, 0xe1addd4f, 0xfdb87576, 0xbd90c8fe, ++ 0xb7f645dd, 0xfff1c1c1, 0xa81d12af, 0xa67dfc4d, 0x2cd1300f, 0xe01167e9, ++ 0x10ed8ea1, 0xd4a55f90, 0xd287ef89, 0x968c5f45, 0xa36608fc, 0xd63077e4, ++ 0xb202fc2b, 0xe62fa0df, 0xdef1010e, 0xf9177bdc, 0x805fd1e9, 0xfc1d99e3, ++ 0x05fdc25c, 0x968ffaa9, 0xad7097be, 0xf3d0d9f1, 0x3cc22168, 0xfd90eb61, ++ 0x04f3e113, 0xf9409f51, 0xfa40c6bc, 0xe7bef844, 0x1d53ca3a, 0x83234849, ++ 0xfe466ea7, 0xf2435a7d, 0x897c3468, 0x305819b2, 0x473cfc64, 0x3a39c126, ++ 0x3cf15e37, 0x82c299c6, 0x669ef90a, 0xaa5a3f7a, 0xab198883, 0x871b681d, ++ 0xe7cabdf3, 0x5a71a93b, 0xb1041f49, 0x82777287, 0x3fd9cb83, 0x909318e1, ++ 0xde5db8ce, 0xe58c7401, 0xe9137ec3, 0xfe807b67, 0xdf98feb0, 0x9fd06546, ++ 0xbf5ee54b, 0xf9f7da93, 0xa4fea8cb, 0xa7f545df, 0x3e5455fd, 0xf3d377e3, ++ 0x54d5fd67, 0x87bf77ff, 0x3d7f2eca, 0xefde7f3d, 0x7f7efaa3, 0xa00fd513, ++ 0x9fa2283e, 0x17ca95ba, 0xded4edfd, 0xfaa0efe3, 0x9520fecb, 0xe9a7febd, ++ 0x177f21f9, 0xbbfb0fd5, 0xdfd47ea9, 0xfe63f54b, 0xeabe5463, 0x27e7a7ef, ++ 0x1ea867fc, 0x78a4c795, 0x3fbf6b57, 0xd16bed11, 0x6eddfa86, 0xf5099d4f, ++ 0x954aeb6b, 0xe839d909, 0x9fa17757, 0x8f0d4f63, 0xa9d759f7, 0x56c40fc8, ++ 0xb49f48a9, 0xf8e87cae, 0x4c5f6a0c, 0xc870bbed, 0x758fc064, 0x6b657f5c, ++ 0x52cfd4b4, 0xec5e122b, 0x7d21a869, 0x40c73db5, 0x227596ed, 0xa88f7de9, ++ 0x9764717c, 0xff1226dd, 0xfeb868b6, 0x9d41e320, 0xb8753e74, 0xcc5f2878, ++ 0x9b14e7e6, 0xdc8e5915, 0xa6f590e7, 0x3fb863d6, 0x0fec2d6b, 0xa8db5bd7, ++ 0x65a5f8c7, 0xe60fec15, 0x5aa75dd9, 0x91d60877, 0xabdb92b6, 0x0bf21eb0, ++ 0xd92295b3, 0x4dda9629, 0x95b4aeb4, 0x6778e50b, 0x1de9da1c, 0xb405c6be, ++ 0xfc911ade, 0x439e1d9a, 0x4f90ab71, 0xd25fb8aa, 0x07706492, 0xe7ae470b, ++ 0xeff5b0be, 0x486edc61, 0xb9e97d03, 0x8b00fb08, 0xfdc7ee47, 0x23e9f778, ++ 0xebbef1fa, 0x4d28f2e0, 0xbec7f4e0, 0x3dfd1221, 0x10a37ac6, 0x11ae1fef, ++ 0xb5226f29, 0xe87599e2, 0xc399faaf, 0x8c071df3, 0xe26da8fb, 0xf1ea1121, ++ 0xccfc7c55, 0xb549f146, 0xe1fde740, 0x76de7816, 0xda3776f7, 0x6ddb09c6, ++ 0x1d6e48cd, 0xa3240f2b, 0x504d2bff, 0x765c8f9e, 0xcc7cfb4a, 0xb87bc7c5, ++ 0xb27f2451, 0xfb7edd65, 0xa3ef3e61, 0xb8ca6f38, 0x7a61445f, 0x9b62d646, ++ 0x5a46590a, 0xe71178ad, 0xbdbd5a8b, 0xda4be70a, 0x2be792ee, 0x2b3ef9c6, ++ 0x5fdec69c, 0x5844f169, 0xe4fc68d7, 0x79e47c7a, 0xe6224c47, 0x9654b083, ++ 0x11e47c8a, 0x815be70d, 0xa49f5c53, 0x23299864, 0xe7e391e7, 0x3c3d3c72, ++ 0xc127de8e, 0x39175529, 0x74aafb0e, 0x9513309e, 0xb9b6b98f, 0xe304bf29, ++ 0x5eb4d0b3, 0x73c2eec3, 0x306e5f5e, 0x07c04735, 0xf9107cb9, 0x070df218, ++ 0x5ed9c693, 0xf151c7c5, 0xeb646e71, 0x346e5ea8, 0x6bf02205, 0x1a487cb9, ++ 0xf1c1d7a7, 0x67eef536, 0xf9e28edb, 0x9ca1aabe, 0xc15587a0, 0x4e2fb236, ++ 0xa6bf89aa, 0x9f3abba8, 0x59d7590c, 0x6b0f3f69, 0xa44e7983, 0x10af181f, ++ 0x4bd22af9, 0x80bfe621, 0xbb81086c, 0x25cfdefc, 0xd5e8fd39, 0x5f1471ad, ++ 0x8514ddae, 0xd30751fa, 0x34583e13, 0x10e2b8be, 0x5e20b07c, 0x750fc046, ++ 0xef8e56b6, 0x6327cb1b, 0xe5cb865c, 0x6097c8e9, 0xc5d52fdd, 0xbe9c3c92, ++ 0x1339f5f2, 0xb2ed3ea0, 0xecbd44e8, 0xb53d06e1, 0x8ab5f94f, 0xbe5e26f2, ++ 0x5f7ddb9f, 0xd92566fd, 0xb952c975, 0xa6f3b25b, 0x2f6732b5, 0x3ab4cb9c, ++ 0x3753d923, 0x85cf115e, 0x92e449da, 0x05f6889e, 0x30dcd7f7, 0xf821ed08, ++ 0x6503e537, 0x1aa8807f, 0x01e48cf5, 0xed6b73e5, 0x6033b3fe, 0xfe068e9e, ++ 0xb7d5c772, 0xd03d638e, 0x093f22a8, 0xffc49f60, 0xe7e4c902, 0x0bc90314, ++ 0x33d36ca0, 0x9596e7e2, 0x83f2137a, 0xf881b33e, 0x2332c75f, 0x1d5ba1e9, ++ 0x4f50a3eb, 0xc636d5d6, 0x1b563961, 0x69df44e8, 0x85f6f64a, 0x6fc429d6, ++ 0x400bfca5, 0x07d032cc, 0x9495aebe, 0x383f6f9c, 0x52fc81c3, 0xd969ed45, ++ 0x880c1fdb, 0xd69dbcf8, 0x14b15361, 0xfaa1f9be, 0xc86fdcad, 0xcce805e5, ++ 0xcb8f5829, 0x51b3d8f3, 0xf40c4caf, 0xe32ed361, 0xd7f21ab9, 0x9d1224d6, ++ 0x4c7cea69, 0x4a6bcf8b, 0x2e74a1f4, 0xa5e7c9d3, 0x38a58fff, 0xc0f8f5df, ++ 0x1ebdc6f5, 0x3933ebbd, 0x4f668dfd, 0xa7e146eb, 0x9b5c7db2, 0xc90ee9c5, ++ 0x39eae496, 0xaafd446d, 0x95678a43, 0xc87e7969, 0x5599eafc, 0x0c098714, ++ 0xd6c79888, 0xa9e9cd9c, 0x71431cc3, 0xd64c8ee2, 0xc083718b, 0xefee2aed, ++ 0x3affe449, 0x3fc9326a, 0xc5f053b4, 0xbfd0b205, 0xf9e3b1ee, 0x628c0075, ++ 0x199dfe60, 0xa0b3af9c, 0x6af184cf, 0x743ea718, 0xbbfc11fd, 0x1e530fa4, ++ 0xcf689a83, 0x67f10da6, 0x88c4d258, 0x071b8bfe, 0xae9bf595, 0x4ce5eb28, ++ 0xd74fa8a3, 0x4c33eb2b, 0xda57baca, 0xe556cdff, 0x653659f3, 0x70fd2d3d, ++ 0x04e28a94, 0xf65d7ee1, 0xd297fa3a, 0x556d3da5, 0x97080975, 0xee0681f4, ++ 0x3e00cd97, 0xefc11b10, 0xe39bdaca, 0x57fe9185, 0x413ae16b, 0xd35c378a, ++ 0x67839ecf, 0x51e28533, 0x1e31b39b, 0x3c763e35, 0xd5b247fa, 0x3c3cfebe, ++ 0xa2448e87, 0x1794bb23, 0x3e3e5234, 0x8f217848, 0x08107483, 0x7fe22fd9, ++ 0xcf3f3d68, 0x079c5df3, 0x2a1020e9, 0x34070b2f, 0x7cf20748, 0x4c83d1a3, ++ 0xdc52658f, 0xb9abce44, 0xe7258d2c, 0xf94a34d5, 0xf961dd71, 0x2ad39738, ++ 0x72e81f29, 0x244306ff, 0x0b3a43ba, 0xc3ba70e4, 0xafca4db2, 0x680bba41, ++ 0x73e1dd39, 0xb9d65fdd, 0x3787e923, 0xfab0784b, 0x7bd328e9, 0xd35bfb21, ++ 0x7ba8a715, 0xa14d93bb, 0xf1ab4ef9, 0xd5e4983f, 0xb48f28ca, 0xc7ceda41, ++ 0x64fe7f67, 0xab8f940b, 0x7f91073d, 0x473ec9ad, 0x0d8cd179, 0xdeff916a, ++ 0xc01efa8c, 0x647a7623, 0xec84f57d, 0x558debe7, 0xff642df8, 0x361dfac3, ++ 0x37bc3c4b, 0xc9c320c6, 0x53bca7a9, 0xda319fc9, 0x18aee839, 0x6f242d98, ++ 0x18fa275c, 0xb12b9bf1, 0x99fa56cc, 0x10a7c3e2, 0xfff3460f, 0x338a56fc, ++ 0xfafab56f, 0x61a3ffd1, 0x1c515760, 0x1933e014, 0xa7fe26d5, 0x4b7cf036, ++ 0x0fd29a4d, 0xa24161a4, 0xea62479f, 0x59927e89, 0x6657e280, 0x9be7a3e6, ++ 0x3d126763, 0xeb9ba08d, 0x3e630bd0, 0xe6137286, 0x7f5f3c53, 0x2d27972f, ++ 0xeb83d382, 0xffcfdf0c, 0x154fbb14, 0xf49fb133, 0x4d8374c7, 0x6fbd0d77, ++ 0x8693dfa7, 0xf8356fef, 0x9bd631ea, 0x6121a4f5, 0xadfdc833, 0x58d4c4b1, ++ 0x176393f1, 0x4ee59e61, 0x27374f09, 0xcc9f08aa, 0xd53b9ab7, 0xd664f821, ++ 0xf7a8ec7a, 0x9e525599, 0xbfa1fe13, 0xef79b368, 0xcbf308b6, 0x5e90cbfa, ++ 0x08eb0d57, 0x929dc3a1, 0xdf3438de, 0x754e94f2, 0x9d6638c8, 0x93e698a7, ++ 0xf9e4faf3, 0xf9b17cb6, 0x1f7e4976, 0x6dcb3e79, 0xb459fdca, 0x459fda3e, ++ 0x7cf2bfe2, 0x117f70bb, 0xf3baeae8, 0xd0e47649, 0xfb942b7c, 0xb47ce8b3, ++ 0xfb9a8b3f, 0xdbe686cf, 0xdbe6c5f2, 0x89e5c51c, 0xd1d3a246, 0x865bdef2, ++ 0x26dd8af2, 0x659b3fe4, 0xdfc4987f, 0xefe3093f, 0x2efe25eb, 0xa249ffbf, ++ 0x9f9bfc83, 0x8a645b1c, 0x9f91d7c4, 0x628f4933, 0x24c51e92, 0xf3eb0a3d, ++ 0x4c6d9fa7, 0x3bbc3c02, 0x1122d267, 0xd5fcd8e4, 0x40662767, 0xb7ce637d, ++ 0xb3a9fd79, 0x95e153fb, 0xf36673f7, 0x5ecf77fa, 0x10a2734e, 0x12a8b0df, ++ 0x026c76f8, 0xbaf2bfe7, 0xc9ef79e5, 0xdbd7fce1, 0xbfee5bf4, 0x7c893e03, ++ 0xc7c325bb, 0x2176bfd0, 0x2576306d, 0x0fa6f7f4, 0x008f6f9a, 0x36f4b917, ++ 0x1b3f279d, 0x7fe43cb2, 0xe3e7190b, 0x09fbe50b, 0x09fbca55, 0x48dbb1b1, ++ 0x416289ff, 0x68bbf213, 0xf5834bbd, 0xa236392b, 0x59cc25d3, 0x5b66f5cd, ++ 0xe057cf36, 0x951619f7, 0xa69ae349, 0x4bed80bd, 0x68cdae54, 0xa531bdcf, ++ 0x43d50936, 0x80ac2f39, 0x9fbd326d, 0x3e3353cb, 0x2cfe46bd, 0x97dece06, ++ 0x717c05d7, 0xd702bbfe, 0x7f70c705, 0xf9729fc3, 0x66fd427a, 0x068df7a8, ++ 0xc04627cf, 0x19e1c5d3, 0x34f0e2ef, 0xc336c60d, 0x06e37bf9, 0x3e891bcd, ++ 0x6bc2237b, 0xe0c35c04, 0x0dc003f7, 0x2351cec9, 0xde0f5dbe, 0xfce55c32, ++ 0x96c116b9, 0xa3eaf24d, 0x65dc8502, 0x148b69cc, 0xe7ead8c7, 0x7921fdfe, ++ 0xe861e69a, 0x9d5ad09f, 0xdd5798b9, 0xc47557f2, 0x2477b4bc, 0x1ac73478, ++ 0x25b1af28, 0x66f64b56, 0x866cec5f, 0x38d155fe, 0x1952e093, 0x86f9455b, ++ 0x85d604ea, 0x1e7858f6, 0xddcc7ab5, 0x4ea30794, 0xca1a0d45, 0x975cbca1, ++ 0xa607e29e, 0x51e66b92, 0xa3cbd78b, 0xf3cd9f8e, 0x36b563a8, 0xc7364954, ++ 0x51e62368, 0xe5c390bf, 0x27ee1f7e, 0xfb0fd711, 0x43ef0fb1, 0x3238f134, ++ 0xb8c68f3e, 0xc8c7c9b2, 0xf7ed2c9f, 0xe41ce905, 0x228d68fe, 0x9d6b503f, ++ 0xd44fd436, 0xf4272e06, 0x1b962a69, 0xf9e5bf22, 0xdc3472bb, 0xe26793df, ++ 0xf5cf4cf2, 0x09aff9d2, 0x1729fd11, 0x4a7f6472, 0x0d1b3c64, 0x78aa164f, ++ 0x874c991e, 0xca5a8d8b, 0xb46c5b6f, 0x601fa056, 0x07de2031, 0xbffd21f1, ++ 0x17e894ba, 0xf88ac3e8, 0x6e1bb3f3, 0x0c67e17a, 0x3f9cdcdd, 0xa1a59e9f, ++ 0x05a761fb, 0x8fc672e6, 0xbb74dfcc, 0x32e066e3, 0x767b996f, 0x53df9213, ++ 0xe095afe6, 0xd3e3ba78, 0xe91b6635, 0xc8719aff, 0x9becea17, 0xb4bea093, ++ 0xf88358a6, 0xbc49c727, 0x7f8f9cd1, 0x6031ed43, 0x7f530bbf, 0x78815b1b, ++ 0xe0660e24, 0x4938e47a, 0x5231bf48, 0xbafcf9bf, 0x422bf414, 0x2fdefd3e, ++ 0xc3ce8c3c, 0x424f491a, 0x9c8581fb, 0xd01fcc8b, 0x8e7d088e, 0x910b03f6, ++ 0xccb98233, 0x5f811032, 0x7ad9a5c8, 0xd01d6c7a, 0x9fb939b9, 0x4ef9f94a, ++ 0x182aba97, 0xc78b5ce1, 0x1e9b7f09, 0x9dab01df, 0x83c7ac3c, 0xf08c5efe, ++ 0xb4fab8f8, 0x696c2279, 0xd245e56d, 0x995a35e3, 0x5f446cce, 0xbc6575c3, ++ 0x77bf976e, 0xfda0e8ac, 0xaf508fb1, 0x7c79124e, 0x84db877a, 0xbfd83bfa, ++ 0x8777dc2e, 0x4ad8ccff, 0x15bdf871, 0x44fc24e3, 0xa3d605a3, 0x9ad3f093, ++ 0x9ecb69e6, 0x524d7948, 0x22ae503e, 0x65417f2f, 0xd4448cdc, 0x4e636e6b, ++ 0xd4b70da3, 0xb3f48cde, 0xea10f913, 0x25ee8765, 0xf9a4b2fa, 0x64318084, ++ 0x6809141e, 0xccf1497f, 0xb49589cb, 0xf6439d8f, 0xfd918f85, 0x47eee695, ++ 0x21f9747e, 0xb3b4bd0d, 0x4d6ed942, 0x619a7b73, 0xe7ec777d, 0x9a966af9, ++ 0x7ee90176, 0xf90263e7, 0x141d61a2, 0x70640fd7, 0x61dd42fb, 0x3fe00164, ++ 0x6e7b557f, 0x6cbb3826, 0x89c954df, 0xcd6fd0bf, 0x67e92d58, 0x2ccf059b, ++ 0xc54acf7e, 0xee39f922, 0xcff9c718, 0x744ce39d, 0x9beb66fe, 0xb14aeb63, ++ 0xe6f09d7c, 0x46f9d2b3, 0xbf681f94, 0xe960f98c, 0xdeb0e27b, 0x8c89aad3, ++ 0x938c6f9f, 0xf2c8dbee, 0x145f8242, 0x7e91e8f3, 0x3b9b82d5, 0xe67e9ef9, ++ 0x04cc6799, 0xdc27ca22, 0xf235e926, 0x5db9d138, 0x74ed18d4, 0x140bcc31, ++ 0x072e2e4c, 0x006b014c, 0x2ff5afe8, 0xd6f688ea, 0x6bf3a5f7, 0x62b16fb6, ++ 0xd3874aff, 0xf0ba7e8a, 0xf62d1afb, 0xcf3c56c9, 0x7b4a5996, 0xcfa71e51, ++ 0xe616f39e, 0x698f1879, 0x2a8f2298, 0x5e62d4ac, 0xda35c244, 0x2deafca5, ++ 0xe45e7887, 0x3f496316, 0x18b7e1c6, 0x58e84b13, 0x52cf3c8d, 0x1e346fee, ++ 0x3a347c25, 0x88d1bc79, 0xe5c041f2, 0xd9f43871, 0xe41c128f, 0x8e3cff7e, ++ 0xb3a315f3, 0x25fde197, 0xfd483383, 0x407744a2, 0x4a8feb05, 0x25ff7464, ++ 0x55740f4a, 0x31557088, 0x7179047d, 0x2f2e38cf, 0xf495a4b6, 0x44fad397, ++ 0xb6cd09bc, 0x24ac4b58, 0x30de11b7, 0xac9c4b6f, 0x3eba72df, 0x7917f120, ++ 0xff29169c, 0xdca6b6f3, 0xe8099545, 0x3b3f7127, 0xde35c70e, 0x52fa47ae, ++ 0xe6bc4cc7, 0xf9d2bd78, 0x75af1c8d, 0x01de3489, 0x4c750ba4, 0xd3c70989, ++ 0x1c22fc48, 0x75a527ee, 0x66f1adfd, 0x77dd2c80, 0x581d3aa5, 0xef491ac0, ++ 0xc63d4b91, 0xbe474b91, 0xeff985f7, 0x051fa526, 0x8459eff8, 0x73b49ae7, ++ 0x09e9cb47, 0x263c9ff7, 0x9db227d9, 0x06c69661, 0xb0f74336, 0x89c18203, ++ 0x3bb6427c, 0x384a51cc, 0xe487df0c, 0x9aa970e7, 0x4a5d8de7, 0x0fd7e464, ++ 0x274be7a7, 0xb50b8dde, 0x712ed04f, 0x04bb70e5, 0x5c4bb44b, 0xeb099f92, ++ 0x3b4037e8, 0x21fba645, 0xedb566bf, 0x7d60d33b, 0x2adfe03a, 0xf3485718, ++ 0xd2eb7e11, 0xe748ec06, 0xfd3dd219, 0xe4573870, 0xbe113c72, 0xe91d81f5, ++ 0x307132bb, 0xa70bdf19, 0xbdefc7f3, 0x79fb8c92, 0x9e50d67c, 0xd647c509, ++ 0xf7e4cb2f, 0x3eff8f92, 0xfc6113ce, 0x8a7fddeb, 0x036db73d, 0x73b781e9, ++ 0x7d1ff03d, 0x95b1ea1f, 0x16ecef5c, 0x69a77e94, 0x7fef9cb9, 0xbfe39725, ++ 0xed300ae5, 0x9127ba52, 0x7e849b9b, 0xc8edd308, 0xe5ee337f, 0xefeb6379, ++ 0xcee0fc6f, 0x3530f408, 0x373e33cf, 0x5acb0e84, 0x6b0fe4b5, 0xb98e6631, ++ 0xf47f9f96, 0x3e71f673, 0xf96f9d2e, 0x9f3cf4b7, 0x62f5c3c2, 0xca0ee7b3, ++ 0x9fcf08d3, 0x9fdfad18, 0x1a4def91, 0xe6abafee, 0x718b73fa, 0x3e03f921, ++ 0xf5011b41, 0x85ef890a, 0xc8f7f3af, 0x7c389244, 0x6257c0f4, 0x8515dd0f, ++ 0x7b246ae3, 0x9fd931ec, 0x77a25d51, 0x59afbc85, 0x08afa256, 0xc61697c1, ++ 0xc7c357f3, 0xa43b94df, 0xa2be934f, 0x8357e891, 0x437d1672, 0x4347e289, ++ 0x4b14867c, 0x918ec283, 0x9fcf0fe7, 0x8a97c90a, 0xedca74e2, 0x37989d99, ++ 0x736dfa05, 0x1163edf5, 0xcf453bbe, 0xc38016e3, 0xca3adbe0, 0xa2477df3, ++ 0x2e8901cb, 0x00bf3b47, 0xe3c9443b, 0xbc61d91b, 0x327805b4, 0x47d20c71, ++ 0x1555438b, 0x66cfb08c, 0xf4119f69, 0x4ee66feb, 0xf5fa4cfa, 0xd046e53f, ++ 0x767f51af, 0x43dff985, 0xbb37a8eb, 0x27d7e822, 0x201fc905, 0xd49cade5, ++ 0x0007bad8, 0x1c6f270e, 0xd1b16ce3, 0xb3971b3d, 0xa787ec04, 0x6f503ace, ++ 0xeff02f9f, 0x61f7c824, 0xa951e096, 0x17f88ec9, 0xe602d75c, 0x814ee67b, ++ 0x37ed08e2, 0x013a69db, 0xe77ae3cf, 0x93ca4cb9, 0x42738369, 0xabcefbbf, ++ 0xf245672b, 0xc21d1f6b, 0xc35d6413, 0x9e1958f7, 0x655c4842, 0x2c28bc44, ++ 0x04e1843e, 0xe3957fcc, 0x6ffde147, 0x6fc65329, 0xff72aeda, 0x162eee85, ++ 0x7e6028dc, 0x517db2a4, 0x3e3c2695, 0x2ceb88a5, 0xd7c26b71, 0xffcd0813, ++ 0x3773df4d, 0xa46781c5, 0x359e7c8b, 0xf0f9ec8c, 0xb8ae8fb8, 0x50c6a5df, ++ 0xda733549, 0xd8fd236c, 0xfe492f98, 0x1ec66abd, 0x9d77bf46, 0xf2d6af32, ++ 0xf90fdcd0, 0xabda29f7, 0x43ab1e70, 0xb63f50c5, 0xe4fd9478, 0x89a60b78, ++ 0x9e17de84, 0x7bf236a1, 0xb454cb6c, 0x89b8163e, 0x3cbf65da, 0x9b9637f4, ++ 0x5e6df787, 0xd3fa86c7, 0xe440a23d, 0x39daef7d, 0x983fdf97, 0x85ee2be8, ++ 0x232754a6, 0xb1d6a438, 0x03fa7e20, 0x6b88a0e0, 0xd1f7d2eb, 0x67a93f3e, ++ 0xc1c7812c, 0x20c9ed14, 0x613f11c1, 0x37388aff, 0x0f5153ec, 0x67af3bb7, ++ 0x1dd2ea6f, 0xd7e7e4d7, 0xa4ea37f3, 0x5ca5d978, 0x88a40f29, 0x63bea115, ++ 0x9d10f65e, 0x1e7027c7, 0x169e7794, 0x1db61e39, 0x450117c6, 0xd2f44b76, ++ 0xe558c522, 0x9730aaef, 0x84a9f748, 0x2166be32, 0xa3e3cdc1, 0x5be88c85, ++ 0x0b950067, 0xaa9859e8, 0x75dc2173, 0x96c3a83a, 0x27d32d05, 0xe4b573c3, ++ 0x98166e6f, 0x72667588, 0x509fb9ea, 0x904baefe, 0xda32ebbe, 0x0ffba03c, ++ 0x017ce144, 0x4f3c9efe, 0x546177c8, 0xfb5c169f, 0x23f7bc7d, 0x7efc3bcf, ++ 0xe51df925, 0x7f8347f9, 0xc651dfb8, 0x7f4e5fe3, 0x7bf7127d, 0xd6be11a6, ++ 0xd52be30c, 0x88f84a57, 0xf85f23ef, 0xed6cdcba, 0x76fbc22f, 0xed11bee7, ++ 0xd0f83f44, 0xd473023e, 0x39cf8fb4, 0xac3ad0de, 0x4f7e0cb6, 0x3497da4c, ++ 0x17dde7de, 0xb5f085fd, 0x028978ad, 0x186a2ff3, 0x9ecdd3c5, 0x8a450f8a, ++ 0x141ec383, 0x7ee4227c, 0xf5b78c3e, 0xdcfbcf10, 0x0879df85, 0x5ea023f1, ++ 0xb5837681, 0xb0479e06, 0x8eb2e483, 0xf2b1fbf1, 0xa0b45aba, 0xaa5e2347, ++ 0xcf3d1eb8, 0x5e622038, 0x5071268f, 0xcb69fa44, 0x087c7ce3, 0xe518937f, ++ 0xa553a81f, 0x36b1bf3c, 0x970733aa, 0x6b3cf26f, 0xbed254f3, 0x3ffbe9fb, ++ 0x374fa2f3, 0x7f309cda, 0xd18bf3de, 0xcc6f3f3f, 0xd43b46e9, 0xe1fbccef, ++ 0x67e81162, 0xcbe9ea5e, 0x77631376, 0xf5e7ede5, 0x3397d382, 0xef3abea1, ++ 0x81bf5e05, 0x26b39191, 0x8c62c0ef, 0xfc95ad3b, 0x8ff8f27f, 0x7d27ac23, ++ 0x53ad52f1, 0xbe47cc45, 0x27ce4f27, 0xd49f7464, 0x3393f3dd, 0xcb749718, ++ 0x09a5d1f2, 0xc9a077d3, 0xa4a8f78c, 0x8a58c4bf, 0xf096ce87, 0x777e0e6c, ++ 0x96fd1628, 0x71df04bd, 0x87fa7ec3, 0x5e9f8f3e, 0x65dfc970, 0xa01ab132, ++ 0xe62696ff, 0xc10aca89, 0x7d52e67b, 0x2960f3ca, 0x47af206e, 0xbac47f9e, ++ 0xf8c568e0, 0xa1ed75d0, 0x5d75e471, 0x1e91d628, 0xba1f1e16, 0x863e0c20, ++ 0xe3954279, 0xb9e29733, 0xcc19885e, 0xfd3ea010, 0xaa12fb19, 0x263e0d27, ++ 0x1aea4338, 0xe68f8e7e, 0xf118b6bd, 0xf5da88f5, 0x7e125e68, 0xbf7f8ab7, ++ 0x438a55a0, 0x09e4903d, 0x78067da0, 0x81557947, 0xdde52d74, 0x5c144e55, ++ 0xa7c0fea1, 0xc82b3c24, 0x1999fee7, 0x29df76ba, 0x7eef4bc0, 0x7f433581, ++ 0x5a4bd5ef, 0xf5e64fd4, 0x1ea2d59c, 0x59ff76bd, 0x5ccbde2d, 0xa3c4758b, ++ 0x24575a3d, 0xf92beffd, 0x15dcf96a, 0xf491d776, 0x77e8cd9c, 0xd0275b5b, ++ 0x07f5b43d, 0xfd6e1fb9, 0x6325dc4a, 0x8e7b4eb7, 0xeeb5b8fc, 0xae58cdbe, ++ 0xf0470360, 0x3ccb09bb, 0x8abdc56a, 0x8ad1f5e5, 0xbeb5177b, 0x457d4504, ++ 0xc80e9c3b, 0xa94d15d9, 0x4a18f78a, 0x32cf583d, 0xf687fc36, 0x8e74b57f, ++ 0xfbdbaccb, 0xccb5dfd1, 0xe663d4a3, 0xf18b34f5, 0x409f6eb8, 0xfc80aff7, ++ 0x72def86d, 0x432843be, 0xfb802af4, 0x47ae6e8c, 0x93d6adad, 0x7583527d, ++ 0x834d6b80, 0xce9f883a, 0xa5ae9239, 0x40b76f76, 0xdda95eed, 0xbb702f5b, ++ 0x2bafe25a, 0x7f2e35a4, 0xba0cd4e9, 0xf570194e, 0xbbd6423b, 0x43eabaa2, ++ 0xdf4947c2, 0x6d55f790, 0xd6c6fae3, 0x383537f4, 0x047b8aee, 0x7da76096, ++ 0xe5a8f429, 0xad7acaf5, 0x67a6134f, 0x7f90680d, 0x3e5268af, 0x72079f3f, ++ 0x80a3e91d, 0x5d3d2015, 0xa24413ca, 0x51fea92f, 0x7b279bfa, 0xd5a77d61, ++ 0x7e203fee, 0xc77b6836, 0xad3bdca3, 0x6e5d50f6, 0xb96be787, 0x8afae2bc, ++ 0xdf0f280a, 0x4cb8d16f, 0xb0349f78, 0x5dbc2046, 0x1ef442ce, 0xaa7f70fb, ++ 0xf3d647ab, 0x1bbe25f2, 0x7f246ee5, 0x09824be8, 0xd14a86f5, 0xf03de225, ++ 0xe8fc5196, 0x1e9cf9f9, 0x4281b24e, 0x220e575c, 0xce539c29, 0x672431a2, ++ 0x6573fe72, 0x3948e300, 0x25f902a5, 0x9b8ac0e6, 0x8914b04a, 0x5cc7cc8f, ++ 0xa61fbc01, 0xfe26aaee, 0x226b413e, 0x53c68efe, 0xfd70bf08, 0xd7de132b, ++ 0xe7059573, 0x8c76939d, 0xbf373fbe, 0xe445fb63, 0x572c8e8b, 0xdf580ec9, ++ 0xfe7c5103, 0xc10a0e07, 0x6d671866, 0x9fe251e1, 0x9c0f4016, 0xe255ad77, ++ 0xff4adda3, 0x1af905ac, 0x42dccc22, 0x8e59379a, 0x915e032f, 0x20adee1c, ++ 0xcd22c4fd, 0xd0bd1a7b, 0xddf36fb0, 0x0b165e52, 0x797e6334, 0x9c085e32, ++ 0x617e5c34, 0x20a5557f, 0x9e0bc586, 0x957f43ca, 0xef914075, 0xff8e25f3, ++ 0xf859e21c, 0x457db0f8, 0xfa8672bc, 0x6fdd2c6a, 0x9aeb297a, 0xbd6a40f9, ++ 0xc69b9ef2, 0x77bb0864, 0xf33fe4a6, 0xf761a99c, 0xeec2b2ce, 0xdd84159d, ++ 0x73de533b, 0x21bee25b, 0xf299deec, 0x3ace9b9e, 0xca3fd15b, 0x8f5150b6, ++ 0xd155bdce, 0xbb79c63f, 0xfc775da2, 0x13216a85, 0x1817b3bf, 0x5a1c00f0, ++ 0xe2ca3681, 0x4148e587, 0xd286742c, 0xc4651a50, 0xd758b5b2, 0x9ad2788b, ++ 0xdd73edc2, 0x7b586ff1, 0x98fd1c61, 0x6fe8f567, 0x582137fc, 0x5e89f681, ++ 0xbfc953ca, 0xcce4298f, 0x2ba71160, 0xdf27bcb9, 0xce00a5b3, 0x5b69f0bf, ++ 0x40aeff2a, 0x8f9e3e7f, 0x81363f1e, 0xdf807374, 0xd9209dab, 0xaf38f211, ++ 0xcbefcb3b, 0x73eef7c7, 0x7b38a2cd, 0xbb1fbf37, 0xbc78cb57, 0xefcf00e4, ++ 0x501eec2c, 0xdbe842b9, 0xc1f9c050, 0x1415dcf7, 0x03db591f, 0xa9e91652, ++ 0xef169ce3, 0xe9edac25, 0x3679458b, 0x8b4e7dde, 0xe7e1937e, 0x07139c92, ++ 0xffaf680d, 0x78e45747, 0x5af98bda, 0x12a38fa2, 0x86fdaf5f, 0xcc8ddb9a, ++ 0xa6f31735, 0xfb5d7e65, 0xed5fdf1c, 0x03cf2d12, 0x047468c5, 0xfa7c0dbe, ++ 0xbb0f929c, 0x5a60f294, 0x0ef23370, 0x7e8adfe0, 0x24cf162b, 0xf806b7bb, ++ 0xf031d236, 0xda7b6573, 0xc02fe216, 0x9fcf15cf, 0xb4ec97ce, 0x29f85602, ++ 0xadc677bc, 0xabcfb88a, 0xf1c12245, 0xc13a678c, 0x47007bff, 0x6f7da7f4, ++ 0x3c38dc04, 0x1faf07af, 0x9c87d9e0, 0xfd3f785b, 0xfe3fae78, 0x6d7e1460, ++ 0x7bede02a, 0x6412fe85, 0x81b75ea6, 0xdeb976f0, 0x75fd0733, 0xb0ffd347, ++ 0xb570e305, 0x4f74082f, 0x8efbbffd, 0xd7ff519b, 0x8cc4773e, 0xd76f30fe, ++ 0xa6d83311, 0x6b6341ac, 0xf01e3d46, 0xcf7a89c2, 0x5a5eeeda, 0xd2ae9aff, ++ 0xa6be7c3e, 0xd7efa05b, 0x9c5ff778, 0x0364fb49, 0xb85e305b, 0xbd759477, ++ 0xb391c929, 0xcf9e36f9, 0x513981e1, 0x05d7efde, 0x01e20283, 0xd75c25f0, ++ 0x3cbf0141, 0xe9b6f6c6, 0x51e923ab, 0xbc39e389, 0x1969b70f, 0xe01bebfa, ++ 0xd1c7dc7d, 0x3d5aa3f4, 0x0273d1e2, 0xaededad9, 0x71a24b53, 0x430d46fc, ++ 0xdf5e42fd, 0xeffde9c7, 0xaedffee0, 0x80a7a0d3, 0x09a9d4b5, 0xaa376fde, ++ 0x2af51c69, 0xdd97d50d, 0x5e2af3c5, 0x4b777ba9, 0x76fb8c2a, 0xfc794083, ++ 0xfefd57d3, 0xdd97d628, 0x70b5f5c5, 0x35f1967c, 0xf1c33f1c, 0xd69e0477, ++ 0xfd3c317f, 0x8e9e30cb, 0xe70f3947, 0xf882c33e, 0x1fbf2f73, 0x15f57d5e, ++ 0x3337fa0d, 0x1b9c98b7, 0x0ea45ea1, 0x9f23366e, 0x17b78578, 0x9c0a7437, ++ 0x456ed8df, 0xd56d4c3a, 0x4d77b432, 0x35ff5c05, 0xb2f3f015, 0xe30141b1, ++ 0xcfec4c6b, 0x9764be44, 0x6bcf49e2, 0x1473f558, 0xa6fce417, 0xced647e8, ++ 0xffb8bcd0, 0x990ef494, 0x9968160f, 0xcbf239e7, 0x3de0a576, 0xf9481f82, ++ 0x78d219a0, 0x338359d9, 0x2c594017, 0x95229fcd, 0xc250bd72, 0x9678167f, ++ 0x8a4f3be0, 0xea6eccb3, 0xc3cc7ca5, 0xf90d8f5a, 0x378cdce8, 0xb5ce501b, ++ 0x485abe66, 0x5378c679, 0x3f7e3260, 0x32bdff98, 0x367b37e5, 0xcf2fdc60, ++ 0xf518e740, 0x43ca0ed2, 0x689eca8b, 0x90e71489, 0x1b15ef4b, 0xed6f8f7d, ++ 0xe52a4c95, 0x1f4382fa, 0x0ec8076a, 0xe89338b8, 0xf1558ae4, 0xb49b3edd, ++ 0xfbf922ee, 0xcfdc3d6c, 0x2c5a7c03, 0x27ee192b, 0xcb3d01c3, 0x7b2a3fd8, ++ 0x86d79d1f, 0x8798ac75, 0x3c1077b7, 0x129c3797, 0x4b0fbbf0, 0x118d2e35, ++ 0x98e6fde0, 0x7df839ea, 0x900efc46, 0x26e30727, 0x7c97ba7a, 0x7aa26fd2, ++ 0xf54adfbf, 0x951b7ed3, 0x95ddea6f, 0x8725a708, 0xb708d97d, 0xba77d257, ++ 0x85debef1, 0xaf091a13, 0xb4befc4d, 0x7a976b84, 0x718f4cd4, 0x8fa0fdae, ++ 0xbfebc30b, 0xdd0a4aed, 0xce39fe6f, 0x69acf307, 0x3bf119fa, 0x99c5fd67, ++ 0x37151768, 0x7582dd9c, 0x67efd36f, 0x0ef13ea2, 0xebd20fc8, 0x0ab7bf41, ++ 0x694e47c8, 0x73596e31, 0xf9c69e25, 0x26706a81, 0x65e057d2, 0xbc9fee81, ++ 0x6b517dd3, 0xdc89f2e1, 0x1a2f7873, 0x0b9bf2fd, 0xbd3fb8e2, 0xcfc558a7, ++ 0x2aedc1d7, 0xf2fa1f09, 0xe78b14ff, 0xbdb26fa1, 0x7fbe0376, 0x7e90cd4c, ++ 0xc60c55b7, 0xdff0229a, 0xcbbfe833, 0x32c0fbe1, 0x1b5abdbc, 0xc93cc6c8, ++ 0xc38f096a, 0x860b9bdb, 0xe91a13fc, 0x084c403b, 0x32d50ff1, 0xb04ffdfe, ++ 0x400d7a7b, 0xd33db5c7, 0xeb533fc9, 0x9fe9ae13, 0x3f0f0d19, 0x7196b96b, ++ 0x475c8cff, 0xafd431bb, 0x53237689, 0xdfe01fcc, 0x5c774a81, 0x778a9ef3, ++ 0xf9e28520, 0xc5195b6b, 0xc95cd6bb, 0xc1fcf2a7, 0x1fa436ad, 0x277061bd, ++ 0x51ccefdd, 0x26b19d91, 0x1a7fd4a0, 0x685f388b, 0xdd9ff494, 0xe92f6005, ++ 0x04bd90d9, 0xc41ed176, 0x628bb04f, 0xbd85310f, 0xec9cfe14, 0x4f74bd25, ++ 0xf3c18e05, 0x0775847c, 0xf13a2a8a, 0x4ed60cbd, 0xf04ece78, 0xfbe1bbfb, ++ 0x8bd2567c, 0x865eba64, 0xdbf88d74, 0x7c3ae9cd, 0xca8a07dc, 0xdb71c59f, ++ 0x356f8946, 0xd35cfb4b, 0xde5e08c1, 0xd382788e, 0x5dc3acc7, 0x31f97801, ++ 0x51ef03ac, 0xa3bb705e, 0x0bfde0e3, 0xe634771e, 0x607cc8f7, 0xbbcf076d, ++ 0x4c2c736f, 0x3ed1bcc0, 0x77cfef09, 0x9c23d74f, 0xf4e0eb6f, 0x4ef7cf27, ++ 0xa404b2ef, 0x419a49a7, 0xd3da13ad, 0xa2c6ce7a, 0xe0e937de, 0xc3a404a2, ++ 0xbfb9d6d1, 0x35a7f390, 0x48e7eb4d, 0x3d4ca779, 0x6027b259, 0xbd8dde7d, ++ 0xd5f69df4, 0xb7f08c4d, 0xaf7fc0ef, 0xdf3e3a45, 0xb9426d13, 0xd14bf1f9, ++ 0x0bc6bdf4, 0x2a82eb2f, 0xfa0eec81, 0x9ac7e8be, 0x5fa4f981, 0xbdd3541e, ++ 0xbfcbef40, 0xe8f489db, 0xbca3a03d, 0x5b3dd5c3, 0x6bdca22f, 0x21f599e8, ++ 0xe1b4677e, 0x3d2c7fd9, 0x26fa69ac, 0xfd7245e9, 0x1bbd7e77, 0x9179e8f9, ++ 0xddd589f3, 0x777d243f, 0xe34bd5f5, 0xe3e53f31, 0x193cfe97, 0x3ff79af9, ++ 0x7e464d2f, 0xa5f1fde6, 0xfdeed8c9, 0x922fb451, 0x5e3652be, 0xcb25e74d, ++ 0xa2ebfb4b, 0xb7b43fc2, 0xbeddc388, 0x87be9da9, 0x62d4e93c, 0x0f77e867, ++ 0xdcab6526, 0x1bd27fd8, 0x42ab0995, 0x2fd4dbde, 0xe2719c52, 0xbae8caa9, ++ 0x55dcbc10, 0xc3fd91a4, 0xc3afc85f, 0x0cc3efa4, 0xf9fa71f9, 0xfadab077, ++ 0x9f7dfe45, 0x61ee817a, 0xe232fe83, 0xff9d165e, 0x7df4095d, 0xe7ba261f, ++ 0x7ac44d14, 0x87177d36, 0x1c47f405, 0xb2d27a21, 0x0eaf557e, 0x47baa8f0, ++ 0x7dfa4bd7, 0xea9678bf, 0xdb74fe92, 0xd8c4dfc5, 0x99fe0885, 0x9033d3dc, ++ 0x69fb878f, 0xd7062fe0, 0x355beb2d, 0xae3a4f3e, 0xb37fdc3f, 0xf266faa2, ++ 0x6ffb850f, 0x6aa2fdec, 0xfefc44de, 0x85675d39, 0x47a43efd, 0x50f5917a, ++ 0x11fdbf3c, 0x8959ffe8, 0xdaba646e, 0xbfe3cfd4, 0xf42bfa9b, 0x909f280e, ++ 0x3883f7da, 0x9bf8c00d, 0x813d167a, 0x574d847e, 0x01174697, 0xbebd36bc, ++ 0xfa446d90, 0xb3e85537, 0x37abbdf1, 0x0e1497eb, 0x7cf84be3, 0x0f5c858d, ++ 0x2213d61a, 0xd255bdcb, 0xf928ffbc, 0xfff0b2b7, 0x7607f90d, 0x12617d78, ++ 0xb9cbe1d9, 0xe1db849f, 0xe64372e1, 0xbbb8f2c7, 0xe48f7825, 0x7e921fc7, ++ 0xf132f603, 0x3685dde3, 0xb3d697ea, 0xe8ec8120, 0xd82717d7, 0xcfc7238c, ++ 0xf8aa9d12, 0xcbe391c2, 0xe0379c7a, 0x3b47a23a, 0x7ee6a5c7, 0x5042c5d2, ++ 0x3ef58610, 0x7d205baf, 0x09a35bdc, 0x5d793f62, 0x5fb98bfd, 0x134b8975, ++ 0xf586128c, 0x1c7f5943, 0xd40a776a, 0xb293eb2e, 0xe6efd8de, 0x13c5dc7e, ++ 0x7a9bfb79, 0xebc23b4f, 0xfdfe5e9d, 0xf85349ae, 0x47dcc673, 0xf4bea152, ++ 0xfa23026b, 0x1949f497, 0xcdf5c34f, 0xaeb27a4f, 0x3d9abdf9, 0x74ca7e12, ++ 0x1f461196, 0x93eafcb2, 0x28b5dfec, 0x7e5013bf, 0x97a151ff, 0xf20b8f87, ++ 0xbd215f7b, 0x277f08c7, 0x23ba21be, 0x6593e7d9, 0xafcf963a, 0xae3970ff, ++ 0x53f59d37, 0x7268ec9e, 0x9522a9f5, 0xb7843f82, 0x367c15f7, 0xa155fe7a, ++ 0x83fd4764, 0x25bff9e8, 0x3b7ff33e, 0x85e90f3d, 0x0cfbc8da, 0x87bf9514, ++ 0xfb506fe7, 0xb4739f28, 0x50fd7bef, 0xe760d392, 0x48f8f02a, 0x768556ba, ++ 0xfb9eb791, 0x6ce35a07, 0x72fd91af, 0x1fdf4d5c, 0x20760d59, 0x5f776fea, ++ 0x80d95131, 0xcb94327a, 0xdf453e9f, 0xaf5e5d99, 0xfa2b7f5c, 0x75fdf16e, ++ 0xd7eb8a76, 0x2bf24ab2, 0x99c4f6d5, 0x35bfdf30, 0xd228eba9, 0xb509e055, ++ 0xfed089ed, 0x7f52f96d, 0xd5b7f73d, 0xa7efd1c7, 0xa03d30b0, 0xefae17d6, ++ 0x1b82f52b, 0x68d13f24, 0xfb8fc1fa, 0x395f38a2, 0x5f3a26a6, 0x2bbfe6eb, ++ 0x7ce1eda0, 0x4514dbc1, 0xd7b4137e, 0x341f5d70, 0xeefc4109, 0xdfa91af7, ++ 0xf93f6207, 0x069e289f, 0xd9ec3e5d, 0x64ba4661, 0x68fc652e, 0x8837becd, ++ 0x91c7866f, 0x714bf7e2, 0xd1b8a1a1, 0x5907ca64, 0x05a4f603, 0xed9b4bf5, ++ 0xac3f8416, 0xef89058f, 0x987e14b8, 0x4bbd8e4f, 0x83f2e7f6, 0x2233fe3c, ++ 0x9b3ad47e, 0xbbf08fc7, 0x90fc1123, 0x3d1ec62b, 0x7423bf82, 0xdad1b8bd, ++ 0x8f7453ee, 0x11fe8464, 0x2a4c77a6, 0xc719fa52, 0x3b8fdc8a, 0xa13047b6, ++ 0x04ac6a7f, 0x19b4afc7, 0xf99eaf48, 0xe404bacb, 0x9d39f207, 0x7ae1c05f, ++ 0xf4cbedfe, 0xbfc9c47d, 0xfdf84d14, 0xddbf1fc4, 0x5e54b3f8, 0xf86de9b7, ++ 0xda34635e, 0xb97fe731, 0xfae11a3e, 0xf7f12863, 0x46747e15, 0xec8fe88c, ++ 0xcf4bf61e, 0xb2ff222e, 0x411697e4, 0xfb0cc61e, 0x7bdfc273, 0x15af7a4b, ++ 0x63f214cc, 0xfdf1e41e, 0x6ccf64d6, 0x64ceefaa, 0x2e907bfc, 0x10ff3bf2, ++ 0x45fd1af0, 0x8c59b005, 0x81bbff3f, 0x5178c26d, 0x55e7926b, 0x2adda3a2, ++ 0xbc11d21b, 0xc0a6714f, 0x8f923673, 0xe78c3208, 0xeff2d78c, 0x9364d212, ++ 0x98d7bf87, 0xda2c760c, 0xc59ab093, 0x902e6f18, 0x0de33ae2, 0x1ff1c44c, ++ 0xe1b678d0, 0xe81f4377, 0x44cd9d13, 0xfc04ce04, 0x7c7875ee, 0xb8f17049, ++ 0x92671cb8, 0xc5a3e3e3, 0x679c0499, 0x9e3bc73c, 0x3012e2b7, 0x93c72e6e, ++ 0xfcdcd7d8, 0x3e65b37b, 0xe93fefca, 0x4bfcf464, 0x543cf38c, 0xd3ce2110, ++ 0xf0b7c929, 0xdcb6e2b8, 0x3f4f09e7, 0x57f13c6f, 0x6a5fb348, 0x27c38bfc, ++ 0xe313dd7c, 0xbd93313e, 0x15ff97f5, 0xe7b6724b, 0x0bc3c912, 0x3ee93a83, ++ 0xb3f700c2, 0xbfc868f7, 0xb6ec0170, 0xfb3910a4, 0x797fc957, 0xe13a67a8, ++ 0xcafefeff, 0x4e3fec68, 0xaf6de392, 0x0f345e2f, 0x745fb2f1, 0xb84ad366, ++ 0x5fbfb61d, 0xcb7a849c, 0x5d2e7897, 0x7be21185, 0xefe4437a, 0xe892ac2c, ++ 0x87115568, 0xb9b7f4f3, 0xe46de5fd, 0xc4931471, 0x5a55bc17, 0xd34783e2, ++ 0x3fec82cd, 0xb38a44b7, 0xb9241c1c, 0x40977b51, 0x70be1cf7, 0x4fbba59c, ++ 0xfe615b92, 0xc499aae9, 0x5bf34737, 0x15cdc487, 0x49146fed, 0xee22f371, ++ 0xc8b9bebf, 0xf78efb44, 0xee639715, 0x2fffbca1, 0x8d361cf1, 0x59c6fbff, ++ 0x01109c9f, 0xf1c4bf8f, 0xbefff31b, 0x77fb3fe3, 0xfcc5ff1e, 0x7ffc2fbf, ++ 0xbf1e77fe, 0xfd7f1238, 0xf94fc712, 0x583f8f3b, 0xff3e0110, 0xc200f353, ++ 0x79e1fce3, 0x7ef1e101, 0x0155f1dd, 0x6c2adb6c, 0x5285ec1f, 0x5aa07b1f, ++ 0xc62d5600, 0x48efa3ed, 0xe3c29dcd, 0xfa956d60, 0x9c30a760, 0xabc3201f, ++ 0x08edc9c3, 0x40c5e153, 0xc339c002, 0xdf895fd5, 0x8530be73, 0x82fc877f, ++ 0x26519df4, 0x5b3be89a, 0xef1933d0, 0x4546b7c7, 0x3856ab8e, 0x1470bb25, ++ 0xb3baf239, 0x893e303c, 0xe220b67e, 0x92338efd, 0xcdd4da7f, 0x44c92fc8, ++ 0x9a42f25b, 0xfa8c96d7, 0xfcc398d0, 0x732f6c79, 0x6cbad275, 0x0f6485f6, ++ 0xbeb8ecda, 0x6f78a507, 0x3b1cecfc, 0x41e3a3fa, 0xe078c42f, 0x920b8c0e, ++ 0x7ea26b3d, 0x13f17cf2, 0xd41ffef8, 0x5bee8130, 0x267cf1e5, 0x22a2f0d6, ++ 0xd342779e, 0x814adefb, 0x208f79e2, 0xaaa9febf, 0x5daf70b7, 0x6f806242, ++ 0xc5137ee1, 0x794e4f19, 0xf343d72a, 0x06def8f0, 0x0af2ef13, 0x8eb0cdda, ++ 0x12952f0d, 0x343f2efe, 0xf4fc2de5, 0x3a21d797, 0x9453dd23, 0x246705fd, ++ 0x2fec877f, 0xbf5ae390, 0xef24fc90, 0xee85ffa0, 0xeca8d887, 0xb2faaf1e, ++ 0x48eeb7f5, 0x8141e9f2, 0x3f0287fb, 0x52a1fee5, 0x342b33ad, 0x78c8f26f, ++ 0x7b2b8e7e, 0xf642dc79, 0xed233cf7, 0x755ef4a7, 0xd2f40eaf, 0x5a452dd2, ++ 0x5ba5f394, 0x8e580dd2, 0x78550577, 0xdd597c1f, 0xfcf92a73, 0x6bd1e122, ++ 0x8edb3ed2, 0xef5c520d, 0xfe716187, 0x6a5a09f8, 0xc7c2407f, 0xb049b078, ++ 0xb62d90dc, 0x6638faa0, 0x291d499a, 0x760b549e, 0x6573ae31, 0x0cb75f2b, ++ 0xdb5edaef, 0xece79c74, 0x582dc191, 0xa7dbd496, 0xe1bdbf93, 0xdfd416e2, ++ 0x1d2f57bc, 0x65fc89bd, 0x13da1b5a, 0xfd280db7, 0x7938cf6e, 0x050fe5be, ++ 0x81ad3bfe, 0x74fefc59, 0xf0912ce9, 0x8a36be27, 0x0d78d7ec, 0xbeb11b53, ++ 0x2545eb80, 0xb1d38955, 0x91c716ce, 0xcc72583e, 0x70aab716, 0x3f160fd8, ++ 0xe10931ab, 0xaaf8dd74, 0x537b4fe4, 0xfa441aef, 0xd5f1bcfb, 0xa75e2735, ++ 0x5f7952bc, 0x38e45c32, 0x55f168e9, 0x5bc1cf39, 0x97915975, 0x670715e1, ++ 0xf4b1ffa2, 0x295ab3a5, 0xbf84d2cf, 0x5fc72ba3, 0xa45e0f4b, 0x671cabb8, ++ 0x922efaf5, 0x69ef0d5e, 0x3852fdf1, 0xfc78e4fe, 0xbf8f10be, 0x527bc01e, ++ 0x67ffbc5a, 0x2f52fba2, 0x7b17f74a, 0xfcf8ff60, 0x952e7f65, 0x95277ebd, ++ 0x5465fc87, 0x522e7b7a, 0x6132d6bc, 0xc5247e44, 0xddab4ef3, 0x29261329, ++ 0x0f547de2, 0x0da9f78f, 0x3de35fdc, 0x0fdfa1a6, 0x13d09ef0, 0x59ef2eff, ++ 0xfebaf749, 0x1633ca70, 0xe316bdd7, 0x7178216d, 0xc28ce5de, 0xef3845df, ++ 0x9c614676, 0x43efb4ad, 0xacbfe62d, 0xe8b5fb15, 0xa715830f, 0x77a26a62, ++ 0xdf9e45ff, 0xbf4e53db, 0xb8dd7547, 0x8ffff758, 0xb89e7d8b, 0x8f2701d8, ++ 0xa47cc98b, 0xe172adc4, 0x6392cd3d, 0x2155a8ae, 0xcdcda27c, 0x8e6d29e3, ++ 0x87c3a24c, 0x757199dc, 0xaa6de321, 0xf88bfee2, 0xd0a88e59, 0x3cc551e7, ++ 0xca3f160e, 0x13bd3c77, 0x5db65f54, 0xf7a48de1, 0x9ea9ff9f, 0x1df5fbee, ++ 0xdd2c73bc, 0xc7f30faf, 0x8dd555b5, 0x74fe418d, 0xb9b2c746, 0x8fe14ebf, ++ 0xb8f16163, 0xcb72fcd1, 0xb7dfa4ab, 0x28198361, 0x66fdc3b7, 0xcb90af78, ++ 0xcaaa5775, 0x1520658a, 0xc7862def, 0x82ce7ee5, 0xffa0386f, 0xc9152ab2, ++ 0x573e390b, 0xfc322552, 0x269291dd, 0x72e2904d, 0x6a59e255, 0x4dc6ec97, ++ 0xc45492a6, 0x684e77f3, 0xaaf2914d, 0x5afb559d, 0x677de133, 0x77df4083, ++ 0xaefc5eb8, 0x466fbbb6, 0xa4dfed2a, 0x47647ba6, 0x91b6bdf9, 0xef9e3cf1, ++ 0x5bdac25d, 0x731fa12b, 0x09e3dff0, 0x9e21b3f7, 0xee125ea1, 0xc2527f87, ++ 0xbd252783, 0xdec93de4, 0x25f4912c, 0xfc70bdf9, 0x2e04f3f9, 0xebf346e7, ++ 0x6f1a4eff, 0x9b495553, 0xae77cf03, 0xd93ca18a, 0x77a15554, 0x70778c84, ++ 0x7b67cf02, 0x8983e310, 0x1e41f1a1, 0x0b8f0c07, 0xb4ae7cca, 0x11338fef, ++ 0xbf010fde, 0xb5e63946, 0xe941f8f2, 0x9f74e5cb, 0x5c9d786e, 0x1d643f6e, ++ 0xc71eb7ba, 0xe618bef8, 0xe25e05cb, 0x325d8bbf, 0x68a1f2f7, 0x8e3b9f84, ++ 0x7bc6177e, 0x4462d1c2, 0x9c57347e, 0xbc77f784, 0xce28616e, 0x45a4f184, ++ 0xc6cfd5af, 0x4ba504fb, 0xdc214f8a, 0x2868d497, 0x6bd1701f, 0x6d7bf4d5, ++ 0x5d2bfcb2, 0x80d1b9d2, 0x3382b9ed, 0x55ed86ca, 0xe73ed815, 0xa4f45ed9, ++ 0x3ab879b3, 0x27fde7e0, 0x6e9113de, 0xde7bd4de, 0xba5f7e46, 0xd5338a40, ++ 0xa4bd3970, 0x71868167, 0x3721527d, 0x03ff495f, 0xf52e83f9, 0x28fc5294, ++ 0x0a1ef301, 0xe955e587, 0x62c7204b, 0xdfd8e586, 0x3cfebf2a, 0x9cf044c1, ++ 0xd70c7200, 0xc780bf13, 0xffcfc3e7, 0xa31f84a0, 0xf8d1a5c9, 0x551fca30, ++ 0xc14fa719, 0xdb8e523a, 0x15f3efd0, 0xba05d7d4, 0xfe1a399c, 0x1d784ae5, ++ 0xff73e927, 0x2340861b, 0x008000b6, 0x00000000, 0x00088b1f, 0x00000000, ++ 0x55b5ff00, 0x655b685f, 0xb97dff14, 0xb649b7b9, 0x76dabbc6, 0xa6f06bad, ++ 0x34d7529d, 0xe2accbbd, 0xc6dd2c86, 0xd4687590, 0x366e8c97, 0x4d714be2, ++ 0x1f486452, 0x25a8a584, 0x28226f6e, 0x95979882, 0x0f6516f9, 0x15918419, ++ 0xd68bea5a, 0x8bd9683e, 0x70e28e31, 0x3fe0a8b0, 0x77ce78d0, 0x6db935ef, ++ 0xe179845e, 0xfbefee72, 0xf9ce77ce, 0x6bf73f9d, 0x0a39e834, 0x31196c34, ++ 0x7a0e3005, 0x0bd07bf6, 0x4fa3e6bc, 0xe079b803, 0x377560cf, 0x5f192be0, ++ 0xc81c791e, 0xa0e829ac, 0xeac74bf5, 0x3cd23d41, 0x8bcdc8ef, 0xe051ee74, ++ 0x949f45d6, 0x5a93f7db, 0xce9311ee, 0x15483d25, 0x361f9cdb, 0xc70f403d, ++ 0x3a26aeb1, 0xf1411f21, 0x713eb59c, 0xd03dc80e, 0x2a24b845, 0xf2e12081, ++ 0x965e3bf1, 0x9f350273, 0x75b0d3a5, 0x5636c36b, 0xaff9fa76, 0xbcf6c332, ++ 0x45267c4d, 0xfe9b8746, 0x517666a6, 0x17d89a92, 0x379c7e20, 0x3f7992cd, ++ 0xb6df2c92, 0x45c8ecf3, 0xd3f65e5b, 0xd7926ea1, 0x4c216145, 0x9bab22fe, ++ 0x8ded7882, 0xc231f303, 0x0a2bbb7d, 0xbbd49461, 0x20efc755, 0xce3a1bed, ++ 0xa7103e52, 0xf4013e64, 0x02d031db, 0x544f48b6, 0x118d3cba, 0xfb581bd2, ++ 0x986ded83, 0xef6fcc86, 0xa201454b, 0x416e4210, 0x0d15bf90, 0xff929f13, ++ 0x0b026bd9, 0x242d92a4, 0xeb483c60, 0xfc5ade1f, 0xd733d684, 0x22914e84, ++ 0x634afc5d, 0xbaef6957, 0x4c9f13a6, 0x2c0d47f9, 0xeb59df8b, 0xb42f1125, ++ 0xa9b2eba9, 0x8827bf48, 0xd28fa80f, 0x07429417, 0xfe493df9, 0xae367798, ++ 0xabc20c15, 0x8cbdd7a1, 0xd8175dcf, 0x63595b4b, 0xef1767bd, 0x0851505f, ++ 0x27a75e4b, 0x56126788, 0x306bd27f, 0xeb3633ef, 0x69eaf1a4, 0xf55eb904, ++ 0xafdc7dd5, 0x18acc233, 0x56b52f5c, 0x0507f575, 0x6d357d42, 0xdd2a9b9f, ++ 0x75c83154, 0xc74deb74, 0x5111de4f, 0xeb6dafee, 0xc93f8b03, 0xfb2aa07a, ++ 0xbdde7a74, 0xbb3b319f, 0x3025a8b7, 0x08634882, 0xcbaa2378, 0x4253273a, ++ 0x3e3f28a4, 0x7996624f, 0xafd086e2, 0xebe67784, 0x260e7b2d, 0x54f30273, ++ 0xeacd25df, 0xa2c3a58f, 0x49fd2390, 0xa5f75c82, 0x04e72f1b, 0x098a5cf1, ++ 0x60f9c3d3, 0x29c7ca25, 0x218f3f3b, 0x8b8a2d87, 0x38d7bdac, 0x3d4b3c04, ++ 0x9a7ea7ec, 0x2801fbb4, 0xff9eb8c8, 0x88515020, 0xd8b565e7, 0x6349f3c7, ++ 0x4cc7fd26, 0xc0e81948, 0x9d79bb5c, 0xe6622733, 0xa479eb38, 0xfd57f39d, ++ 0x3c96edfa, 0x5c7b8ba4, 0xd7ea5b38, 0xcdccb76f, 0xa7e8fe79, 0x72f084f7, ++ 0x3d76b3dc, 0xef52563e, 0xdd37e49b, 0x2eb8d557, 0x8c4b5d40, 0xad445f02, ++ 0x85323e78, 0xf29bfb97, 0x7df3c23b, 0x7075f437, 0x9286e099, 0xb33c7028, ++ 0xfdca255a, 0x24a4a1bd, 0x3d69f676, 0xe7b62183, 0x791cf1ad, 0xe1ffe420, ++ 0x2a67f0d2, 0xd78a65d7, 0x4dc3789d, 0x9d95893d, 0x73f39478, 0x1b7f797f, ++ 0x3efbc36d, 0xec717fda, 0x5cffb5ff, 0xc9bdbabb, 0xfd36bfff, 0xb9d07dd3, ++ 0x39740677, 0x19e6ff2f, 0x43a43dd6, 0xe84af1f6, 0xe50f7957, 0xdf0df185, ++ 0x55cfb943, 0xff9a315c, 0x65a77cd5, 0x7ffb7bff, 0x6dbfc8ea, 0xbd2d5799, ++ 0xb6fdfeed, 0x5e2515ff, 0xae47b8e3, 0xf0b4607a, 0x60062d1e, 0x2b1ef0b4, ++ 0xc1f0b975, 0xfd2e43ca, 0xae836b43, 0x03f5f1fd, 0x3727fdae, 0x54fc2e63, ++ 0xff4bb0f5, 0x5cc70fc8, 0x29fae9f8, 0xdfd1fe97, 0x6761705f, 0x73a8277e, ++ 0xf71dcf5b, 0xdbd2e2bd, 0x15e6e337, 0x7af3739a, 0xcbcdde78, 0xb9ce1bb1, ++ 0xdde50df9, 0xfcf6bafc, 0xde506bdc, 0x16fd7fb3, 0x9de0fbe4, 0x4eb22ff2, ++ 0x581deaf7, 0xb788ffe7, 0x650fdd6a, 0xf70bde55, 0x4f60f5bc, 0xc7a61d4b, ++ 0xb967e90c, 0x73e7e43c, 0xdfb33eef, 0x11f7088f, 0xf7a3bae4, 0xadd07b0f, ++ 0x0008b02f, 0x00000000 + }; + + static const u32 csem_int_table_data_e1[] = { +- 0x00088b1f, 0x00000000, 0xe733ff00, 0x51f86062, 0x39fbc10f, 0x716e1819, +- 0x0143f822, 0xd9433117, 0x1017fa40, 0x606463bf, 0xbc48cf78, 0x040e357e, +- 0x033b2f7b, 0x3e200ac3, 0xfef03ec0, 0xc95c481a, 0x4ebb3f4d, 0x622ed1d0, +- 0x067e2ef0, 0x0c023d86, 0x1082590c, 0x54417ffe, 0x08fcddf9, 0x651898b6, +- 0xf5012976, 0x93320003, 0x038009d3, 0x00000380 ++ 0x00088b1f, 0x00000000, 0xe3e3ff00, 0x51f86066, 0xb8d3c10f, 0x72361818, ++ 0x0143f821, 0x684333b7, 0x0606163e, 0xc77e2001, 0x9ef0c0c8, 0x38330491, ++ 0x207eec10, 0x27880abb, 0x7dcf5071, 0xe62f1143, 0x9f5d9fa1, 0x163d76a0, ++ 0x837f7818, 0x03109db0, 0x03308b83, 0x84089883, 0x55045abf, 0xc1085ede, ++ 0x9941243e, 0xfa80e75d, 0xa5c3d401, 0x0003804b, 0x00000000 + }; + + static const u32 csem_pram_data_e1[] = { +- 0x00088b1f, 0x00000000, 0x7dd5ff00, 0xc5547c0b, 0xbddcf8d5, 0xeecddd8f, +- 0x21079b26, 0x086e3c21, 0x4bc60a22, 0x9bade102, 0x88b46204, 0x7d608a89, +- 0x8420182d, 0x96d22247, 0xedf7ed7e, 0x5ab11062, 0x68db151b, 0x34105db1, +- 0x060b28da, 0x2df0980c, 0xaa5694a0, 0xd1f58df1, 0x90cbc8a0, 0xf87e8784, +- 0xce7feb69, 0x7bbbb999, 0x7c486eef, 0xfefdfbf4, 0x730ecfe9, 0x3399dee7, +- 0x9ce735e7, 0xc92b3339, 0x210cb102, 0xbbf81be4, 0x22ad909c, 0xa46c6421, +- 0xe5a22aec, 0x79fc4218, 0x8126c08e, 0xafaed090, 0x4234908e, 0x54cd364e, +- 0xec84d9ad, 0x2e8473ce, 0x0327eda7, 0x6d2b0185, 0x76f6de2f, 0x4beb44a2, +- 0xb41289b6, 0xf1d9765b, 0x4275cefb, 0xd6d5ea00, 0xd12607b6, 0x9136f77a, +- 0x935da06c, 0xd242d390, 0x23623909, 0x61754fec, 0x559dbe7d, 0x7ddfac97, +- 0xd9578c2b, 0xfa76256c, 0xd12691fd, 0x9b65f503, 0xe3a10084, 0x8f71d92d, +- 0xb7f68032, 0xed042020, 0x7a6fad2a, 0x845d5150, 0xfdebb5dc, 0x212776c4, +- 0xa2367c27, 0xca8f382a, 0xaa4228e0, 0x064a5b02, 0x1aabefd0, 0xfb42cd05, +- 0xaa775aaf, 0x6aabe013, 0x69102f92, 0x1c1a8b7f, 0xc6c11d44, 0x78c086fe, +- 0xbc703b7b, 0x1830f26d, 0x3bebf2af, 0x3cc22215, 0xb77c0f65, 0xf301c284, +- 0xe13dc7d6, 0x74f1c7ab, 0x9a792e7c, 0x5bdf478e, 0xc1a09cfa, 0x885a9714, +- 0xdce8e017, 0x84fd9f61, 0x52b7e613, 0x9e8aee19, 0x30ed9cc7, 0x7ac0aa8f, +- 0xf009c4a5, 0x8fe657ad, 0xa8b7f48a, 0xf846f7e1, 0x7bfa73ea, 0xe5cddaa3, +- 0xe9451f09, 0x8abd48f0, 0xf6904f10, 0x5280a44b, 0xf9e4497e, 0xd2324207, +- 0x4883517b, 0x7fa45b54, 0xfa42794a, 0x9b7fffd1, 0xc1e293fe, 0x6c0aeadf, +- 0x6dd08eca, 0x16681b99, 0x3769dba1, 0x5dd4a3a7, 0x5ebfdd10, 0xa0f4003e, +- 0xdcf9d4f0, 0xcbe43e58, 0x4fad72c0, 0xd6fdbc45, 0x7acb0237, 0x1fcf869f, +- 0x72c78df3, 0xe583cf9d, 0x58a57c1f, 0xf8657c06, 0x6cdf06de, 0xbcfa372c, +- 0x5f49fcf8, 0xbe0d9625, 0x8cfe7c1a, 0x8d96056f, 0x7f3e3f3e, 0xcb06b7ce, +- 0xcb0eafa0, 0x5a2f40ad, 0xf802f936, 0x035f76de, 0x20becd96, 0x6be9df3e, +- 0x8e7ef2c6, 0xa4c9c4c7, 0x4878a250, 0x253710f4, 0xee99493b, 0x3d699429, +- 0xd3d58ca5, 0x2a17f66f, 0xa5ee9eb4, 0x01978a75, 0x5685438b, 0xc3501f5a, +- 0x92ff07da, 0x7d68d914, 0x0fb59fb0, 0x6453dfbd, 0x75a1f5a7, 0x3af87dac, +- 0xad02517f, 0xf6b00f0f, 0x45431b8b, 0x38bf5a0e, 0x5b73dac8, 0xd693b148, +- 0x9eac4373, 0xec53c077, 0x36bcf5a2, 0xc0f82f56, 0xeb489c5f, 0xfbeced05, +- 0x51011d89, 0x61d2c675, 0x4edeacab, 0xf9d6ad28, 0x1348f4af, 0xef515d68, +- 0x8fc51a24, 0x948f5aff, 0x7b21f149, 0xbfe43db0, 0x149bdb09, 0xe1bfb60f, +- 0x76fac0af, 0x87ed8bd9, 0x5d584bfd, 0x17fb62f1, 0xbd629ffe, 0xbb63f659, +- 0xd58fa56d, 0x0fb63f15, 0xfb06b958, 0xb00729df, 0x07cad47d, 0x12a77db1, +- 0x5687f6c0, 0x4a99e63d, 0xf782b5eb, 0xb48fc0b7, 0xc03924ac, 0x328cc14f, +- 0x05ab4fca, 0xf7f81b32, 0x28e980bf, 0x54ceae5f, 0xfeb70e50, 0x9009e0ad, +- 0x834bfc5f, 0x7f27fcfa, 0xffdf8d95, 0x6991fb11, 0xfdef623f, 0xde3abde4, +- 0xabde4fd0, 0x0d3f7a95, 0xbdad5ef0, 0x7d6cfd6f, 0x9e11a275, 0x7ef4ab57, +- 0xae3c20b6, 0xef2bcdbe, 0x7846c9b5, 0xf7ac5b5e, 0x49e113b3, 0x4d3c1bee, +- 0xd3f11b6f, 0x3f1876f4, 0x7e9e117b, 0xcc67837d, 0x8cfc463b, 0x9f8c2779, +- 0x664fd803, 0x7a69fadf, 0xa69f88c7, 0x79f8c277, 0xa835e71b, 0xf31af36f, +- 0x633f11ae, 0xe7e30dde, 0xbb278423, 0xff6cfd6f, 0xed9f88d0, 0x73f1861f, +- 0xa0b9fb14, 0xf82af36f, 0x829f88c8, 0xe9f8c28f, 0xea2e7ec6, 0x3fdb3f5b, +- 0xfb67e232, 0x7cfc6147, 0xd25cfd89, 0xfc1579b7, 0x829f88c3, 0x63f1847f, +- 0xd19fa011, 0xf9a7837d, 0x9a7e2353, 0xc7e30d3f, 0xed8cfd81, 0x8fe33c1b, +- 0xfe33f118, 0x693f1848, 0x427dd002, 0x3e69fadf, 0xf34fc462, 0x067e3091, +- 0xfa533f61, 0x47f1af36, 0x7f19f88d, 0xe19f8c34, 0x2a42af38, 0xa10f00f7, +- 0xee7ab8fd, 0x2349e767, 0x0c9e767e, 0xec52e7e3, 0x27ed1a67, 0x267ef7a7, +- 0x33f11a76, 0x9f8c33b1, 0x95cfd8f1, 0x6767eb7d, 0x3b3f11a7, 0x29f8c33b, +- 0xdd5cfc44, 0xec4d79b7, 0x6267e232, 0xfe4fc317, 0x89c5355b, 0x85ae9db4, +- 0x993f489a, 0x08f1e1d4, 0x59ba2eb4, 0x046b745d, 0xb75112ec, 0x479b4837, +- 0x1b3bdfa4, 0x457ef393, 0xa28eeda2, 0x8b979872, 0x76d1635a, 0x04f8d247, +- 0xec939d83, 0x53d43149, 0xde18074b, 0xd43657ef, 0xf67fded0, 0x4cf686c5, +- 0x9ea19e6f, 0xf0d13955, 0x229aa0fe, 0x8ac87d43, 0x67ef0cab, 0xd435affb, +- 0xd8fcd673, 0x7505fef0, 0x17ed0d73, 0xda1957d6, 0x332c0a2f, 0xfc3647d4, +- 0x4bfde187, 0xda197782, 0x95fe6d2f, 0xe8747da1, 0x7f3d4321, 0xf78663ff, +- 0x306db6c7, 0xf83b8fb4, 0x427da18c, 0x7d4356fb, 0x269db1d2, 0x3ee9cf3b, +- 0x45d79232, 0xecc27be0, 0xed054cfe, 0xc14b90bd, 0x89c032ba, 0xd76efc76, +- 0xa530f57c, 0x76e7b2af, 0x17d28d35, 0xbae84a68, 0xf2a0385e, 0xfcfa76c2, +- 0x17bd13a7, 0x9ff3e9ba, 0xdd4bde2a, 0xca53ec71, 0x80c9020f, 0x6940b552, +- 0x6647bf6e, 0xf59458fc, 0xf443f0f5, 0xf74b6afb, 0xb75a64f0, 0xc0f58588, +- 0x2c107fbf, 0x2209a7c8, 0x12f781a9, 0x82fd04ac, 0x9e0bb27b, 0xebf147f0, +- 0x0e54419a, 0x6bbf4885, 0xd8066f64, 0xbe561b19, 0x643b07ee, 0xaf3a20f5, +- 0x213c8401, 0x0ff21ebc, 0x9a0fdfa3, 0xfda5e19f, 0xa76a1559, 0xd0af8f47, +- 0xf8e147f1, 0x73fe300d, 0x1d6f8c3d, 0xbe30de3a, 0x61a5706d, 0xc7429b7c, +- 0x607b5377, 0x7c7c7be5, 0x8489844a, 0x87bc2f3c, 0x57075be3, 0x28f7f8e2, +- 0x1e895fd4, 0x7e3c213f, 0x2ecbc833, 0x9c6c7f18, 0x689d0ff9, 0x2ae0ff9c, +- 0x3615fce3, 0x0f2b3dff, 0x7013f1f1, 0x43857bfe, 0xab83fe6c, 0xacadfcd8, +- 0x89f8f0df, 0x87effc61, 0xd3dabff9, 0x1b2673fc, 0xb1643fe7, 0x3656fe71, +- 0x8f2b1bfe, 0x389df1f3, 0x71c29bfe, 0x8b21ff36, 0xeac57c71, 0x947f80d5, +- 0x009a84ac, 0xa40c9f1d, 0xb03fa98a, 0xca071d0b, 0xa9942911, 0x30b5f909, +- 0x69f8e114, 0x2fb7e302, 0xa1bf2812, 0x73e3f1be, 0xad9aa012, 0x9c5dfa80, +- 0x163517d7, 0xb097a02a, 0xf32bfa9d, 0xcd15a838, 0x5937f222, 0x405c0d6b, +- 0x166cede1, 0x58af50fd, 0xfa00253b, 0x6e4adaaf, 0x24ef832b, 0x9fe78212, +- 0x86c9723e, 0xcb9979e8, 0x91f27579, 0x0b7928f6, 0x644551fb, 0x6f850d44, +- 0xd8c1301a, 0xea63fd48, 0x5fea1107, 0x0cfd407c, 0x13f25942, 0x11f78d99, +- 0xdea097f5, 0x6825fd4e, 0x7e256427, 0x2b7bbb47, 0xc65fc283, 0x6258ffe1, +- 0xcdf1faf2, 0xe54fc042, 0x8f9f8bf3, 0xb6f53f46, 0xf48a0e15, 0xfc731c08, +- 0x9d3a86a9, 0xd4e81f97, 0xd81ac3bd, 0x557e2020, 0x8a3957c0, 0xafb72126, +- 0x8eb8a2c9, 0x252effbc, 0xfd45267b, 0xf723c40d, 0xb2dfefa7, 0xa6e4185c, +- 0x58f4cee3, 0xe13ad8f3, 0x5ca0b2c9, 0x78cb2c93, 0x1a6dae42, 0x481ed32d, +- 0xb8fe47b9, 0xebdc6a3d, 0x99f58d4a, 0xa77ac665, 0x142d91ec, 0x8172ceae, +- 0xcefda7ac, 0xd76c6d9a, 0x525a71c7, 0x78f99d18, 0xbe0ce965, 0xc1e65059, +- 0x79d23763, 0xab7d9bb6, 0xbb7d53c3, 0xa0585d4c, 0x011fbfa7, 0xf0d3faba, +- 0xd9bb1fbd, 0xcef0cdbc, 0x329e6d96, 0x73d9cf3a, 0xb7f000c4, 0xefbffe19, +- 0xb92c7872, 0xb0f35cb4, 0xf3b12c4c, 0xa37fc331, 0xa09f3cd7, 0x4df0eb0c, +- 0x8ce7e695, 0xfa708e6f, 0x41fc0c7f, 0x1fc0a3cb, 0x9cc3fe14, 0x957a223f, +- 0xd5b547f1, 0xa1f8033b, 0x209151fb, 0xdcbf395d, 0x5e65f9c0, 0x082f919d, +- 0xc740caf1, 0xbc85b305, 0xc1f1455f, 0x0b07ce2c, 0x737c8dea, 0x99cbf10b, +- 0xe372e871, 0x6777f5da, 0xfbf3b1a8, 0x4dcdf390, 0xfc46eff7, 0xd193cec4, +- 0xa74e56e9, 0xed8c6a5b, 0xdeba7037, 0xbb3ae9c2, 0xa997c1fe, 0x563f20fa, +- 0x7bc83203, 0x7a742ff5, 0xe9e81bb6, 0xc334f4e5, 0xe7a72b79, 0xf4673fad, +- 0xcedbc334, 0x7f5ed9e9, 0x63432646, 0x77c335e1, 0xf9988adb, 0x39cf4028, +- 0xacf4f8fe, 0x3d4c2e6e, 0x497cf51c, 0xc3d4caf0, 0xa8b67251, 0x5f50dca1, +- 0xf0d1b818, 0x39fa82fe, 0x7579f686, 0xb7ed0d0b, 0x50c3b9af, 0xb9ffe39f, +- 0x56dbfde1, 0xdfb434ac, 0xa1af7352, 0x07caa6fd, 0xbd1bf50d, 0x9fde1a8f, +- 0xa1bd7b35, 0xd3d9667d, 0x4aebf686, 0xe5ea18b7, 0xf7861d9e, 0x870b5d85, +- 0xeabae3b4, 0x887f63fd, 0x4567be27, 0x3beb353e, 0xf61e2f5d, 0x88fcf8a9, +- 0xc796046f, 0x3f3e1a7c, 0xe58f1be1, 0x74dfd04a, 0x60ecb05d, 0x7343f565, +- 0xe2a3b886, 0xdac89f1e, 0xbdb3d060, 0x7dfd43e9, 0x7fa3deb3, 0x14ecf159, +- 0x902c5cbd, 0xbb075832, 0x3fad1db8, 0x49d7c53f, 0xb942ee42, 0xb930ac5c, +- 0xb335bc5d, 0x3d422488, 0x4e26bc34, 0xcf2c267c, 0x33e70141, 0x00c72eaf, +- 0x91fa82e7, 0xe036f826, 0xf9030b38, 0x1a8be786, 0xebbe1926, 0x7c222dd8, +- 0x27c6414b, 0xb65672c0, 0x85f002c7, 0xeebe0ef6, 0xb3d78012, 0x4beb02d7, +- 0xe7b43f73, 0xa9a57c3a, 0x73c02587, 0x7cc79619, 0xe23cb1b3, 0xd87962f3, +- 0xc7e58957, 0xdb2c1abe, 0xfcb02b7d, 0xf2c7e7c8, 0x2c1adf03, 0xc3abeeff, +- 0x1eafa0f2, 0x017c77cb, 0x35f2df2c, 0x2f86f960, 0xaf9b6588, 0x9f4ecb19, +- 0x5e5d4b07, 0x4865f8a2, 0xe8bf1466, 0x8fd74ffa, 0x9cbf38c7, 0xc7897e00, +- 0x7c8c1b17, 0x41ae5471, 0x43eb30be, 0xfacc1d33, 0xc3f2bbef, 0xdbb30b58, +- 0x443f2fbe, 0xa2659de8, 0xf46f4e77, 0xbd146226, 0x0cdc5ac7, 0xfbef4e1e, +- 0xf638de00, 0xb8b025fa, 0x83b28bf7, 0xff160e3c, 0x6a7a71e5, 0x2ff8b201, +- 0xbe96bb1f, 0x52f686db, 0xe3e80460, 0x77fe23d3, 0x4fb7c438, 0x6752b41f, +- 0x99f9e7aa, 0x1e23d7e9, 0x86fd0788, 0x28ba01f9, 0xdbb6c7e4, 0xed5e1813, +- 0xe84a5216, 0x05ef717a, 0x47736a4f, 0x29225d61, 0x2b407df0, 0x97e9c577, +- 0xdf80a0da, 0xeb5af0de, 0xfa1722fa, 0x57d8f23b, 0xb58e5005, 0x61343b30, +- 0x30f688af, 0x01a13d09, 0xdefac37e, 0xdc4065aa, 0xc502fbb8, 0xc071eb8d, +- 0x9f9fc469, 0xf8220bd6, 0xa8e297bb, 0xbab3d70d, 0xb0dfc40c, 0xf667862f, +- 0xe9bd7f01, 0x39f0dec9, 0xdfe03037, 0xf4decf82, 0x8b7a6f57, 0x9ae7d478, +- 0x76bbfce9, 0x2bf7925d, 0x50d4f415, 0x80f4ffe6, 0xc7bf7d6f, 0xf0254f0c, +- 0xf3bed8f1, 0xceba5771, 0x09836dc7, 0x906de71d, 0xe9ffda17, 0x80930ba6, +- 0xb41fb42e, 0x71b7bbbb, 0xba17b9fb, 0xf636cc9e, 0x2fe5cd57, 0x42925fdc, +- 0xb8e94b84, 0x4921452e, 0xbd161d74, 0x1bf4442b, 0xf83f76b4, 0x5a1cbbe3, +- 0xd8fe0aad, 0x2a435789, 0xdbf468f4, 0x227fef4f, 0x659bfc11, 0xe1f71619, +- 0xcbd47438, 0xb76cc125, 0x680fda33, 0xd74fd636, 0xf441a509, 0xeba4d493, +- 0xc075812f, 0x0c3c3eed, 0x960672f4, 0x32cb3f7a, 0x54e1f714, 0x23d33fa4, +- 0x67a8c98d, 0xf86cf84e, 0x470d0fde, 0xe044fd4f, 0xd09f2268, 0xdf1481ef, +- 0x7efcf4e4, 0x9d20728f, 0x485e2055, 0xc02fe45a, 0xffd3b37f, 0xfd0a19be, +- 0xfbd7584a, 0x7e8a0ead, 0xbcf0a5eb, 0xfd1e30d1, 0x32f7d54e, 0xe59ebbe1, +- 0x7447224d, 0xdb74a77e, 0x175bf7c2, 0x46ddd835, 0x50d930bb, 0x74ce6eaf, +- 0xf844ec1b, 0x95c21807, 0xb77c0482, 0x975db398, 0x7c035ce4, 0xe3043f74, +- 0xf605df80, 0xbb5b12de, 0x4c5155e2, 0xe72f80da, 0x5ef9d78e, 0xd53ef59d, +- 0x915fc74f, 0xf917c809, 0x1055429a, 0xa0ae8fe9, 0xb7eb42c4, 0xa6dcdaf3, +- 0xbd61d345, 0xf6616e3a, 0x4b290578, 0x92b37f04, 0x7c4015d4, 0x94b124f2, +- 0x249e5c82, 0x47e6246f, 0xa2fbe1c9, 0xbedcf082, 0x531768c6, 0x5f50d97f, +- 0xcfac6f50, 0xc3a6d727, 0xb5fcf2be, 0xa0080932, 0xafed8c2f, 0x168e4c88, +- 0xb0d59a90, 0xd995afbe, 0x4dd7363a, 0xdf0a2ca4, 0x2f1e1792, 0x1feb4398, +- 0xd31ecc8b, 0xa61745f7, 0x82abf830, 0x6d0f15eb, 0xff29a4ff, 0xe879aa06, +- 0xb0d581f7, 0x09b7f95e, 0x963526da, 0x7e16df7e, 0xfafabc33, 0xcb3fb31f, +- 0x20d258e1, 0xec710278, 0x0ebe6e80, 0x4d2e7aeb, 0x08e21b72, 0xe2a3d42a, +- 0x9f99df0c, 0x9f8188d2, 0x36bd17ee, 0x1fe31fa9, 0xa904a7f0, 0x9f7ef15b, +- 0xfa6233fe, 0xfec6934f, 0xa40ffd80, 0xfa1817fd, 0xf8507f57, 0x3fc0c587, +- 0x4bff5e2a, 0xbb76785e, 0xaa93ea9f, 0x12248fcd, 0x971e3eba, 0x4a35d2ea, +- 0xee9bc5df, 0x1f3a044e, 0xc089fc93, 0x6203c7af, 0x7ace2069, 0xe9d25735, +- 0x100a71ed, 0xd27f82c7, 0x733c4ffe, 0x5ff7fa1f, 0x18dd926c, 0x86b06a9f, +- 0x971e54ac, 0x4e9c2d36, 0x887eb172, 0x2539efd5, 0xc8d9bd42, 0x3d4f557f, +- 0x0af90e92, 0xbc785394, 0xecf68426, 0x969f8dd2, 0xba44bae0, 0xdfcc8e51, +- 0x52e7f8c1, 0x51cdff50, 0x29db6292, 0x5777e89c, 0x3754bc73, 0x4c4a77dd, +- 0xa3b57f84, 0xbf7e6c3f, 0xd7a5db92, 0x23b4ae49, 0xe32704d4, 0x87d038c8, +- 0x80483e3a, 0x0be2a5d9, 0x1c42e78f, 0x2be363b2, 0x9e144289, 0x1d3a3974, +- 0x3b8ffdbc, 0x6df59ed5, 0x68b39527, 0xaf5f47fb, 0x4f6e66d4, 0xb172b0b7, +- 0x449c4a1c, 0xf5e2e0f5, 0x8fa7e6b2, 0xc4fb3f17, 0x5c418f93, 0x76ab3df0, +- 0xd17fed01, 0x33bf2fb3, 0x6d17d691, 0xb3a6d391, 0xf4853869, 0xe9aa5d08, +- 0x22f22b7f, 0xfe7aa874, 0x84bd4565, 0x4a65ff3d, 0xb68b1e84, 0x25c856ec, +- 0x0e28f8b1, 0x9dda56ee, 0x3c12e871, 0x81f60254, 0x153fc2f8, 0x5df1fba0, +- 0x1d9fe902, 0x5feb9f07, 0xf01ff5c6, 0x74e47484, 0xf4cdd30a, 0x0ba5357e, +- 0x4e9d6be8, 0x5cb1f6e6, 0xea7f40bf, 0xe7e7e428, 0x54fc5276, 0xc1aaddfe, +- 0xbb9f2bfc, 0x71e61133, 0x7c61aa54, 0xe9ddf8fd, 0xa56e3a1e, 0x63774fec, +- 0xfe579ec9, 0x6fc827e1, 0x49ff5e0b, 0x8867c63a, 0x6b82d327, 0xe6133f8f, +- 0x4cdd6f37, 0xe27cdf9c, 0x7cabbe45, 0xfd032c5c, 0x4a44b9f7, 0x8b91c4b7, +- 0xe3b31283, 0x06a06e8e, 0x51df9d18, 0x7e60acba, 0xe6221bca, 0x07721129, +- 0x09fff901, 0x10b50b9f, 0x8db9feb0, 0xa4b369d1, 0xcad461fb, 0x8dd7e68c, +- 0x7d01b4f7, 0xf4f20c4e, 0x6a8b7d87, 0x3e39f922, 0xbf686f84, 0xfad3ebe2, +- 0x5550fa33, 0xa3bfc05b, 0x3c317ceb, 0x64dbf787, 0xf0d73d8f, 0x3b26f91d, +- 0x3e72fe32, 0x013b853e, 0xe9a3e7d6, 0x4954edf1, 0xdaf87416, 0x457f1448, +- 0xf79337c9, 0xf932f78d, 0x503de5d6, 0x67ed0a5e, 0x03f262df, 0x47fac1df, +- 0xc7f50ae1, 0x0bd7ddf6, 0x24ac0fa8, 0x37ae4f14, 0x8dae5cca, 0x509f3aed, +- 0x292125b8, 0xffa05f8a, 0xee3fc414, 0x4b5fcc57, 0x97d28bbf, 0x625e30d5, +- 0xdcba7f6c, 0xfff2e02e, 0xc8ffc826, 0x7593fc88, 0xb67bee4c, 0x17a8fc9f, +- 0x2781cb17, 0xa579031f, 0x4157e9f2, 0x9832e55e, 0x7b8d67f7, 0x9531f9df, +- 0xba82cf93, 0xa7f51a9c, 0xb72b4e59, 0xe4f1258e, 0x46a733f4, 0x7d29cae2, +- 0x9d4e571e, 0xffc7c8ed, 0xc753fa57, 0xfc2657df, 0x27b0fae9, 0x61f59a3c, +- 0x3e22a4bd, 0xfe90facd, 0x620a45bd, 0x3be74ff9, 0xfeaadf9d, 0xe80864b4, +- 0xea5f309d, 0x4be6177c, 0xe262ef9d, 0x99fc06a1, 0x18865fdb, 0x816b8510, +- 0xf032fead, 0x809a6c23, 0x87617e72, 0x6ceef305, 0xbff40463, 0x584bd446, +- 0x1ee2dd7f, 0x8ce8760b, 0xf67c2f49, 0xededf273, 0xbe5aefff, 0x307b63e0, +- 0x861ca03b, 0x74d14be0, 0xe0c2d71c, 0x02403eac, 0x781f5143, 0x7f28b2c4, +- 0xf7970e79, 0x9ad83e17, 0xec2c780f, 0x8ed4951a, 0xfa30727a, 0x6f5cd593, +- 0x49abf69c, 0xb74f4fa0, 0x78bfa0e4, 0x8ae8bf7a, 0x34f7ff97, 0x209fefa7, +- 0xaecb463e, 0xa44ea48d, 0xba45d6fc, 0x6ff06ed1, 0x714d91b4, 0xcba6aff6, +- 0x5f7e2f4c, 0x01fd007c, 0xdbdb4f1f, 0xd8e2ca4b, 0xf9f2b7b1, 0x25f3d8ce, +- 0xb7178fae, 0xbd80b7ac, 0x8b46f174, 0x41bfefc1, 0x479d7ce6, 0x67af80f2, +- 0xc6bbb1ec, 0x8bf71e00, 0x5649e41a, 0xbc529cb7, 0xf342fc71, 0xb07fa1fc, +- 0xdd93eeb7, 0xca2f4fc8, 0x0f01dbc1, 0x11b49e2f, 0xa1db2fd8, 0x078a2dd4, +- 0x830a9de7, 0x4661c773, 0x2f0a1f97, 0x50ce5d85, 0x3673c411, 0x58dbe412, +- 0xf3e4133a, 0xb0240dd3, 0x2de81b32, 0xc1237ab2, 0xca0a57bc, 0x77c327af, +- 0xa35ed35f, 0xe6c2f3e4, 0xe8127f2d, 0x045b4b7b, 0x2fb685b7, 0xe015da95, +- 0x64e6ea97, 0x68d8f411, 0x74ffcf55, 0x147d725f, 0x4b27ddff, 0x13bd9788, +- 0xf009bc5f, 0x2143a672, 0x79efcfb0, 0x68f31ba9, 0x23e4b4cf, 0xaf34f5bf, +- 0xb2e47de7, 0x43f412a9, 0x3a665f10, 0x304c6a8e, 0x7b1527d4, 0x335c0007, +- 0xb5cbedac, 0x2bb77838, 0xa1fdeecc, 0xb2b7b3e4, 0x96fbf2cf, 0xb15ebf2e, +- 0xfeef8a2c, 0xfdbf2b1e, 0xb2efc9e3, 0x987f6a95, 0x9cd6b2f7, 0x65cf80fe, +- 0xc5fb917f, 0x7d67abe3, 0xccdc2fcc, 0x9abb65f3, 0x1a5efca8, 0x544dbf25, +- 0x01c4e37e, 0xe581fa5f, 0xdf9059f7, 0x2bbdf038, 0xf2e8fa33, 0x0872db9b, +- 0xc9b737e5, 0x7933c862, 0x7d76e655, 0xf42bf28f, 0xea0d3ebb, 0xa388e6b2, +- 0x100f01af, 0xe3ccdcc7, 0xc80e30fc, 0x71b8a4b1, 0x63957d9e, 0x8e59bfdf, +- 0x98236d97, 0x6f4b1317, 0x76cbc726, 0x80163950, 0x978e4cee, 0xce3952b5, +- 0x11df958e, 0xbecbf231, 0xdf621a5f, 0xff673757, 0x5e3a66ee, 0x6cd6479e, +- 0x88bcfdf4, 0x968d8f3c, 0x70914967, 0xbcf231be, 0xbcf26fbf, 0x9533cb8d, +- 0x1c5aa1d3, 0xc62d6aba, 0x2717acfc, 0x1e7c6d1c, 0x226ff2f8, 0x5baf49fa, +- 0xeafb5d98, 0x8063a384, 0x7870a62f, 0x743a7086, 0x7fd8fcfa, 0xd347c4c9, +- 0x5f8a4e41, 0xe42dfbaa, 0x28d92f35, 0x4b87d013, 0x1fa10e9b, 0xe8ab8e6a, +- 0xbe399576, 0x7311eba2, 0x8351659c, 0xc7c79eb1, 0x11db172f, 0xa89af25e, +- 0x77c38a6d, 0xb9c13d79, 0xe71deebf, 0xbd9c0898, 0x79f47dc5, 0x3e9706f4, +- 0x970a31af, 0x1f24d197, 0x8f1489e2, 0xbffe2f28, 0x2a87188a, 0x90c0bc2b, +- 0xeb913fef, 0xc2bafcc9, 0x944b0862, 0xf80e3e43, 0xec77f551, 0xb1b27d83, +- 0x303cd507, 0xb44d27a7, 0x7a9fc17a, 0xf28ddeda, 0x0965d3ac, 0xbc0dcba7, +- 0xd407179f, 0x55bf0114, 0x586e0b37, 0x5f43aa77, 0xbd86b9e2, 0x02517e8f, +- 0x55b0b47c, 0x0f915b70, 0xe7e0294f, 0x17f5d095, 0xe5bf29f8, 0x0bbdda14, +- 0xf8450b5b, 0x010ee17e, 0xc37bd213, 0xb6e95f4f, 0x59e3d388, 0x7009df80, +- 0x8d75b376, 0x57b7a7c3, 0xfc037e4b, 0x5b9d8fc5, 0x56e0c59d, 0xde046aad, +- 0xe77861b1, 0x3eaf3888, 0xbde3abc2, 0x98977837, 0xe4daf8e8, 0x220f1833, +- 0xf27dc92d, 0x5c6dbe6b, 0xa1b49aaa, 0xa7c7a67f, 0xf3bd17ee, 0x951b8864, +- 0x8e31920a, 0xedf18ddb, 0x8fffa01f, 0xf83fd7ce, 0x6eba2117, 0x09f1b9fd, +- 0x67c9f7c4, 0xba00cd0e, 0x24517a2c, 0xce974a36, 0xe1091746, 0x0140483e, +- 0x8935543a, 0x48f78c1e, 0x5ceb82a1, 0x65a8f8d1, 0x42ecd8f8, 0xd5b5583d, +- 0xbf4e981a, 0x49fedaaf, 0x9d33d82e, 0xcbef7577, 0x19ffbf02, 0xf898e501, +- 0x1f6173db, 0xfb624aa8, 0x6efc663b, 0xd8fad854, 0x1b31c3b1, 0x606841e4, +- 0x82aa8be7, 0x946b64b3, 0x457bfc3d, 0x7be971c6, 0x7fe6d798, 0x30bcc05a, +- 0x5cfa2f80, 0xd36f9e8b, 0x4bf334f1, 0x00e59aaa, 0x6aaa539c, 0x7109d2d8, +- 0x5683aa92, 0x1baad75c, 0xb75c614e, 0xa8b3f378, 0x459bab7f, 0xe31c9f83, +- 0x2188369f, 0x4d57f82b, 0x4ece304b, 0x1eb087eb, 0xe9a71f8c, 0xb45a8fcd, +- 0x1fbb75b9, 0xa7f9e4e4, 0x529cf112, 0xf444a6db, 0x1fce1b53, 0x47f18a1f, +- 0xd79ef783, 0xf9c13d1f, 0x318a6fe3, 0x521a479e, 0xf0a54fd1, 0xb1c59415, +- 0xff7cc3d7, 0x807fe7ec, 0xd6c76978, 0xf000fecf, 0x99d7fe2e, 0xe282fc3f, +- 0xbbb2ec91, 0x3f55ff41, 0x9bc636f3, 0x728eeff4, 0xf4f9d5bd, 0xeba71853, +- 0x41aacf7c, 0x47ad9d6f, 0xaabc4307, 0xe997cb73, 0x6f2c9f60, 0xd6f6869d, +- 0xfdc56df2, 0x40fb1c49, 0x036f812f, 0x9a13887d, 0x69b7b5e9, 0xf38060ef, +- 0x6c37a524, 0x0be38609, 0x5e2c25c1, 0x42b8f2a3, 0x6c78fc63, 0xe9a11c4c, +- 0x8ca66bba, 0x54d65281, 0xc27887d2, 0x978e945b, 0x8d7e81f6, 0x89ef6fcc, +- 0x1fe1277e, 0xd5b24e94, 0x9bcfbf48, 0x31f1fde6, 0xed4a6b68, 0xea109e31, +- 0x78f4de03, 0xc78a1bef, 0xdaf9056d, 0xdf8c27fa, 0xd3a6dd00, 0xfb3e7689, +- 0x938860f9, 0x6fbb931f, 0x56d57dc5, 0x5797ee2b, 0xf28bbeb5, 0x75edb9d3, +- 0x8f0937b4, 0xf09276bb, 0xf1938b1f, 0x8dead3dc, 0xe087162e, 0x853887f8, +- 0x79cf889a, 0xb1f1823c, 0x29e8a71e, 0x7585713e, 0x6523cf28, 0x1b259471, +- 0x298857df, 0x8f8c23ee, 0xd13df3ac, 0x1b83c749, 0x3a2e30f0, 0x0e3f16de, +- 0x72cb8e14, 0x20fd017a, 0xa78e16ce, 0x8840fad1, 0x778404af, 0xd07d1c49, +- 0xe9c59eb9, 0xfe63653a, 0x2c3e8449, 0xa26456fe, 0xdecf3eb3, 0xe0dea7d6, +- 0xc9f8b6ff, 0x6c79c587, 0xbe3a9e2c, 0xe7c7af8e, 0xb7ef8559, 0x98215a5f, +- 0x802a6ff7, 0x1d34971f, 0x513f2052, 0xf9f4c75f, 0xbc3b7076, 0xf31119e3, +- 0xf707576b, 0xeb371ea2, 0xde70a58b, 0x3fbc0e21, 0x6d2ef0e3, 0xc744eb66, +- 0x49c05756, 0xb3d8e9fb, 0x6979f903, 0x4fc521e3, 0xf0d7dbfb, 0x46fcc2bc, +- 0x4eb03f26, 0xefe0a204, 0x2e776e78, 0xbb322f8b, 0xddce3cdf, 0xd3a79e56, +- 0xea9c7f12, 0x718653c6, 0x0a83f916, 0xff3e97cb, 0xcf242778, 0x44efe82c, +- 0x5f204c9b, 0x2c5044f2, 0x593fb78d, 0xdc799569, 0x74958eba, 0x25f3c4bd, +- 0x449e762e, 0xde30514c, 0xfe35dcb1, 0x941a5260, 0x507e0a8a, 0x5fb64aed, +- 0x5a9ffb5b, 0x36bbd006, 0xc78c06f9, 0xebf099d6, 0xc217734e, 0xd4f71339, +- 0xaec031b2, 0xec937d66, 0x5fe018b1, 0xafed2aee, 0xd1573852, 0x275ce07e, +- 0xef3c3491, 0x94962622, 0xb7447cc2, 0x138f6dc5, 0x659d9307, 0x17851bc4, +- 0x9f3c6dd9, 0x57cebe42, 0x9f7d1fa1, 0x6dadb175, 0x3dba361f, 0xc495f002, +- 0xaf0bd5f7, 0xbbbce377, 0x580d051a, 0xd563aa9c, 0x05f2ce9d, 0xdae8dd60, +- 0x2e4b949a, 0x87890fc5, 0xfe0e27ae, 0xbddc685c, 0xaad1f41b, 0xa649e244, +- 0xaab14672, 0x4e70398a, 0xc84db467, 0xf53d3e01, 0x5fb48bea, 0x60488b7b, +- 0xa9cbbf8b, 0x92790be7, 0xe41cce41, 0x010bcc7e, 0x3526fe56, 0x5f39a702, +- 0xe92bc084, 0xd3bc7391, 0x39c62744, 0xd113af4e, 0xc5c9159f, 0xfccc9bbf, +- 0xf8001273, 0x88b27af9, 0x4a1a79c3, 0xc142bf78, 0x7f05da3c, 0x4420be79, +- 0xf1a21d18, 0xf46a5a95, 0x89edeb17, 0x436fb0b9, 0xc8369efc, 0xfde0ae4b, +- 0x9e332bf5, 0xe7e2a1f3, 0xcf52fb07, 0x7e6cffd3, 0x7fd07ec9, 0xa8f9de15, +- 0x36cffbd7, 0xdb32039e, 0xe42f08ef, 0x7bb9500d, 0xe7b5884c, 0x5c1e5b2b, +- 0xb1e0f90d, 0x0464f3fb, 0x91541be4, 0xa1f20d04, 0x077df6cd, 0xf1c84de8, +- 0xe0271271, 0xd97d67b1, 0x87db7e0b, 0x98f26eff, 0x0b57e2f3, 0x2e8dfbc1, +- 0xf058dfdc, 0x3f51db97, 0xf88c3359, 0xfc46abb5, 0xf198463a, 0x4bb3c468, +- 0xb28de233, 0x787ce079, 0x3c6f1a4e, 0xb3c6655f, 0x0e1da844, 0xd0404af6, +- 0xf931fe80, 0x11ebcd0f, 0xa6fcdeee, 0x8f5f1b34, 0x5fe95e38, 0xa99d2d99, +- 0x533b806c, 0x985ca10a, 0x19cb28e5, 0x83dfe012, 0xf12b02d2, 0x7e85cd2b, +- 0x8f9f0649, 0x73bec150, 0x00891c80, 0x047286af, 0xcf402827, 0x6e07c83b, +- 0x7c85a7a0, 0xd919be42, 0x2cef3d33, 0x5cd0e97f, 0xe03ad5fa, 0xae514bdf, +- 0x14a939d8, 0x06cda812, 0xb0dcd539, 0x367d076e, 0xf38242b5, 0x18ad44e6, +- 0xddcce706, 0xc7903e58, 0x451aefde, 0x182c5f30, 0xfa0e9b3a, 0x291e7aa9, +- 0x80f7fd03, 0xfc033dd2, 0xccedfbdb, 0xaec8b94f, 0xa5ff3ea0, 0x9cafdf5d, +- 0xa9cb97fa, 0xc8b5763c, 0xebc39c2a, 0xbb64d96a, 0x22cdea00, 0x4eaef79e, +- 0xc608bbae, 0x19916cef, 0xc0b6155c, 0xb7c7e005, 0x741eb8ca, 0xf3c64c56, +- 0xadbb612c, 0x7613ed85, 0x78927cb5, 0xef3e947b, 0x22f87e6c, 0x6a3c3388, +- 0x793fbf89, 0x9df2cdbd, 0xfaf0d4fc, 0x3f9314db, 0xe58dbd71, 0x94303c4f, +- 0xf96963ce, 0x330ebe69, 0xe9c49879, 0xabfcd2fc, 0x5adbfe70, 0xe74f3fa8, +- 0xfcde2251, 0x3ce84ba3, 0x312dbc27, 0xd33c4afd, 0xa3b3a4e7, 0x0efef03c, +- 0x3e0065a2, 0x02214c26, 0xf784f3c8, 0x8febee08, 0x7e8f99a9, 0x94898bd5, +- 0x4c5f29cf, 0x0b7ca16d, 0x89c3ae7a, 0x36d8fbf6, 0xc997c0c9, 0xc17bbd53, +- 0x90771ccf, 0x771dbea0, 0x9e3ed8d0, 0xa71c4404, 0xd27cf8dd, 0xc6bd6331, +- 0x1233f7c6, 0xf7f03a49, 0x8445afda, 0x689babab, 0xbb7ed177, 0xfde0062a, +- 0xe1675d02, 0xbf2d1494, 0xade34b16, 0x8c6d2bf3, 0x08551e2f, 0xce8f2fae, +- 0xc13ee277, 0x9855f99e, 0xcfc5fd27, 0x9de243bd, 0x4bd28bbb, 0xddff6c49, +- 0xa7814493, 0x604abd7c, 0x8ccbaef8, 0x4bd297de, 0xbe758f9d, 0x7339f9d6, +- 0x5e37827e, 0xcec38ade, 0xf9a29dec, 0xfc050423, 0x01025db2, 0xe5de76bc, +- 0x9b5fe435, 0x2bb93f4b, 0x6ea9e00b, 0xb676833e, 0x1e7e25ad, 0x225b06d4, +- 0xf2eefbf3, 0x8d7c84af, 0x04a1529f, 0xbf73d8fd, 0x5aafd16b, 0x88534103, +- 0xe6ead9eb, 0x79a7b9e0, 0xe201b236, 0xe65d52b0, 0xfbe02eb5, 0x53572be2, +- 0xb32b1f78, 0x951f9d20, 0xbfdf8435, 0x2f8c1084, 0x077e4c48, 0xa3eb20ce, +- 0xda357fcf, 0xb46d9b0a, 0x1b9b66df, 0x6af54ffb, 0xfdafc002, 0xc1127ff3, +- 0x673ae99e, 0xe00e3a45, 0xddfe8ffe, 0xaf66369b, 0x6cf762dd, 0x9527fe05, +- 0x9a1f2869, 0x48ad5137, 0x14a07385, 0x4fe271ef, 0xe29a5dba, 0xc28dbaa5, +- 0xe0b4e293, 0x78f110be, 0x979eb754, 0x517bf840, 0x024240f2, 0x5d05bc81, +- 0x422d0a9f, 0x7ff945c8, 0x0219cd8c, 0x92a5233f, 0x60829bce, 0x5fd63627, +- 0x3e11d49b, 0x907986c7, 0x200b2f94, 0xde609df9, 0x415a2403, 0xd59ebaff, +- 0x64aaf3f5, 0xd566fa82, 0x96a05283, 0x6a4eb3f6, 0x24fc43b7, 0xc116a3db, +- 0xa48a7356, 0x41baf9e2, 0x1d1e4c95, 0x87278f39, 0xec2a15ed, 0xde25ffa3, +- 0xef8e2f16, 0x8b757ce6, 0xe03efbdd, 0xf77f773b, 0x346b301e, 0x7b4f1b3b, +- 0x79f686d9, 0x3b706f58, 0xbbaf84ac, 0xfb653e13, 0x397424c6, 0x71e863e6, +- 0xa0deb37a, 0x08a6f072, 0x44a9f572, 0x87943cf0, 0x4f40affe, 0x1fd288c9, +- 0x682c9d7c, 0xb68bd9ae, 0x2f6a389b, 0x57a4e3f0, 0x8c73ecf0, 0xc077191e, +- 0x7ef00b5b, 0xe661fd57, 0x2a21d187, 0xa33e9c8f, 0xec173854, 0xfda1d70e, +- 0x937d265f, 0x3fa63e56, 0xcf9cb5da, 0xe5d5f8cc, 0x79ef2cda, 0x56bdb42b, +- 0x488035ec, 0x84438f30, 0x0e6a1c08, 0x2203a3e8, 0x855df7d8, 0x5c285f94, +- 0x28ee411b, 0x0d9f26bf, 0xb37c095c, 0x3b0ae5b6, 0x5e77c7c8, 0xebf4423f, +- 0x7fe3b8a8, 0x7681de88, 0x08983f96, 0xfbba5878, 0x423f5f2c, 0x5d30e748, +- 0xc7447ca9, 0x37be7443, 0x172eb9f3, 0x394070b5, 0x009b9d87, 0x104288fa, +- 0xeb256b09, 0xe8a760dc, 0xd86d75f6, 0x7cc64d9e, 0x366ee5ef, 0xdbacad5e, +- 0xe60d9ae5, 0xd455dcbb, 0x2efb7cff, 0xffa8e7d5, 0x5d2f9512, 0x7fa3752d, +- 0x214e7d56, 0x81efd481, 0x7a3a16af, 0x455f01ba, 0xf8b17ef6, 0xd472081a, +- 0xf9cbffef, 0xcf9e6cdc, 0x3e646a3d, 0xc5f78893, 0x0a17aa76, 0x64cfacee, +- 0xcade417c, 0x7e0be688, 0xf927b1de, 0x1be54f1e, 0x7918c7dc, 0x84f1c936, +- 0x96c72a16, 0xe4d63958, 0x4827bc32, 0xbea0756b, 0x59f5cb33, 0x076aaf3e, +- 0xa24dfbc3, 0x9f3067f7, 0x60f74b6a, 0x955cbbe0, 0xc0a74ea4, 0xe88b36e6, +- 0x54b69007, 0xbb123ac3, 0xdc59fbbe, 0x7a07af8a, 0xa668529c, 0xb3e74d7c, +- 0x0bbdeec9, 0xcdd6a5e4, 0x58384afc, 0xa3707604, 0x3c377bcd, 0x12d85077, +- 0x88c75ce0, 0x838b3650, 0xd4720c84, 0x4c38dc93, 0x490c1172, 0xe9f93eb8, +- 0xd08174fa, 0xf6c53c33, 0xd52f0664, 0x0c7f6016, 0xb06c202c, 0xf9f304a5, +- 0xf3b2e606, 0xd8f303f8, 0xd84f59fd, 0x91b9bad9, 0xd97a07af, 0x075b2b68, +- 0xe2259378, 0x777de6b7, 0x885401b8, 0x7bb26e0b, 0x6cfe831e, 0x479c1ea5, +- 0x02689b96, 0x292ca3e5, 0x53fec028, 0x605562ca, 0xd6c240f1, 0x7f692813, +- 0x42d5d359, 0x20b28f58, 0x07de0097, 0x9c8e263b, 0xefe5dab4, 0x8e6ac717, +- 0xb95ba3b1, 0xe853ec1c, 0xb3a7537c, 0x3c70e43c, 0xf80f8286, 0x80dd74ed, +- 0x9cfced93, 0x93f835e5, 0x7ecd9e19, 0xe60c1015, 0xddfaf125, 0x29ec910a, +- 0x2df8f7e8, 0x86c59df0, 0x68838f7e, 0x078bd041, 0xce5ceced, 0x035b416a, +- 0xdd48dff5, 0x40b7b836, 0x2607ebe7, 0xf449ab5f, 0xa729c495, 0xa517c173, +- 0xf026fe7c, 0xd3e4e75b, 0x0ce157c3, 0x7e3307ba, 0xbc8688f3, 0xcd6e9d47, +- 0x766e81b2, 0xeb447388, 0x7e829761, 0xa090a77b, 0xb9d39f81, 0x0a706050, +- 0x2a179e36, 0x5c2fe319, 0xfdfae9cf, 0xe9bcd82b, 0x8ff1f307, 0x6c567bc6, +- 0xd1e00d9a, 0x1b9f0fe1, 0x31eb9d32, 0xc8c9fb9f, 0x3263c709, 0x4cab4f31, +- 0xc852bb81, 0xda0716e9, 0x4c89d555, 0xd0fccdae, 0x79c2941f, 0x7c50cbce, +- 0xedf4097d, 0x8324d72f, 0xcb7fed1e, 0xafa044e1, 0x825d0f19, 0xd83ef47f, +- 0x1c9bfab7, 0x2f5b7f77, 0x94063233, 0x91999d83, 0xfea58199, 0xc529debc, +- 0x26a5ef8d, 0x6bb8cf7c, 0x46dbe580, 0x026a6bf1, 0xf7a4efed, 0x283c778d, +- 0xf718ddee, 0xf8604fae, 0x3c7457ae, 0x672049aa, 0xc496ba91, 0xb32779ce, +- 0x8cdc1c7b, 0xb67d6b9e, 0x7e8a4972, 0x467683cf, 0xf2b9e23f, 0x6b025046, +- 0xf909b265, 0xf465c59a, 0xe8aa5c7c, 0x1992fd18, 0x8df5bf5c, 0xff7d872e, +- 0x9c6484dc, 0xd3b5d9ef, 0x7274bc70, 0xc5387d97, 0x8b32fceb, 0x939af106, +- 0x089eff73, 0x66e6ff47, 0x3c1015b5, 0x1ab35a62, 0x16ffaefc, 0x9409b9bd, +- 0x54f5694e, 0x3e32a511, 0x74a3b900, 0x13f712b9, 0xe6e258e7, 0x604d8ddf, +- 0x76a7f57e, 0x919b8e37, 0x22bcb831, 0x103eba3f, 0x23f3a4e9, 0x8accc395, +- 0x61739131, 0x24a63f94, 0x2ea791c4, 0x7ec33499, 0xd30fae80, 0x7d75fe38, +- 0x1a43cbac, 0xefec19c8, 0xa8fd5195, 0x7f2873d3, 0x90e31d35, 0xfcb427f8, +- 0xf3b04bf9, 0xa114a713, 0xbff2a3be, 0x0465e506, 0xd076dfd3, 0xc7f151a7, +- 0x0777d6ae, 0x87debec1, 0x05c679ff, 0x90ff3bfb, 0x3fa05dba, 0x4df2fd8f, +- 0x7c11e417, 0x87164bf8, 0x1fe4d5b8, 0x9e981379, 0xcd94260f, 0xe6dd7982, +- 0x378167fb, 0x0ac92f8a, 0x90b15fb6, 0xf3c6bb2e, 0xbcf3c683, 0xf3e6824b, +- 0x77ec7ebb, 0x8e3f1489, 0xc3a708fe, 0x4af5c6c2, 0x7be30a96, 0x8f3d0217, +- 0x58efff71, 0x4367bb13, 0xe36e6787, 0xa27c0568, 0xf958b47f, 0xcc9b76be, +- 0x74cf05d6, 0x72f2a7d8, 0xdce199bc, 0xfd81cbb7, 0x44447bcd, 0x1d0e64bf, +- 0xafd5056b, 0x679616de, 0xbcc79e6b, 0x3812d50f, 0x5eef3f2f, 0x785dfd01, +- 0x9d7497ff, 0x07b8aef2, 0xf3ccb3f7, 0x603fdf34, 0xfba4b73e, 0xfd380b49, +- 0xe517882b, 0xa20f262f, 0x9b3bed85, 0xf7a77ae3, 0xfe6038e7, 0x3f7025f7, +- 0x838c80a3, 0xfbad877c, 0x2f9d2687, 0x9f83aacf, 0xf3c13ed7, 0x08f98f33, +- 0x5412b396, 0xe5ba2e76, 0xabe012f5, 0xf05bcda5, 0xab6f96be, 0x1cb4966f, +- 0x8931fc4f, 0x1f6a1de8, 0x21fe07ae, 0x3760c15e, 0x467f5d2e, 0xc32c7e61, +- 0xf9fccdc3, 0xdc5f30cd, 0x72f76527, 0x3e58bcdc, 0xcb9f7d1b, 0x7cc609d3, +- 0xf9f08eeb, 0x258f3673, 0x9f481f7c, 0x679f999f, 0x5e78b025, 0xd5f2c6c5, +- 0x6b94e803, 0xe60e8f5b, 0xdf300ae7, 0x3317e75a, 0x65202c3f, 0x14429925, +- 0x8d7e5bdd, 0xa9f4ea70, 0xe7c39ba8, 0xfbe0cfe3, 0xe710196f, 0xcc0f8de9, +- 0xdb94eef4, 0x9a7c8307, 0xc3d9dde9, 0x09adf0f9, 0x50afdd6c, 0xffa0253d, +- 0xd5b291e6, 0xe3bb28ee, 0xefb75498, 0x1b372017, 0xad46df19, 0x7b38cca7, +- 0x79f5c645, 0x0fed4b99, 0x1d210cf7, 0xbdfec026, 0xe9ef0fd5, 0x79f11ce3, +- 0xe01261b4, 0x13cb14b9, 0xd86d32be, 0xfcfb48b0, 0x4224cf47, 0x046bb53c, +- 0xa74b78c1, 0xc7ef08cb, 0xf3c22209, 0x62c3a731, 0xef5feda9, 0xd8d9ce83, +- 0x47097986, 0x9af1e6be, 0xf1a5adaf, 0xbe4ff9e6, 0x9f7e11fe, 0x6e5cadca, +- 0x36e1ff74, 0x5b5bb74e, 0xdcf3bed8, 0x0f48e575, 0x0720fdf3, 0x16497704, +- 0x1c1bcaed, 0xcdfd00ad, 0x5da799f4, 0x6bf41c71, 0xfdc89d0c, 0x98bd2f9c, +- 0x2f51534f, 0x4cc27c62, 0x9b870abf, 0x35abcde5, 0xea2d6fe8, 0xe55dcf41, +- 0xafae7a60, 0x63cf31f3, 0x7a80934e, 0x82ff0ccf, 0x0f572b8d, 0x367f3020, +- 0x8479d8bf, 0xe19ea206, 0x55e7d4f3, 0x473c3441, 0xd38fb31a, 0xce89397e, +- 0x72d85cab, 0x2ec1e63b, 0x2c27f3a5, 0x1bf183de, 0x5e1d7e1d, 0xc44a3cf3, +- 0xf106d90e, 0x068215d6, 0xdef636fa, 0x5ee18f16, 0xbb0d39a8, 0x8efd0207, +- 0x21abed48, 0x2fc47bfe, 0xf5d6ffa0, 0xb445c101, 0xfb808d6b, 0xafd23d5e, +- 0xf4ede585, 0x051ac74c, 0x58aa39ee, 0xe3a5c427, 0x6d42fa82, 0x59de9458, +- 0x1b52b818, 0x88378066, 0x1a8b1c79, 0xa7cf0dca, 0xb8fa8c38, 0x35237937, +- 0x74d2f3f1, 0x4de5d2f9, 0x870abf97, 0x52ffe2ca, 0x36565f60, 0xd107e9e8, +- 0xf67aa0cf, 0xc38b076a, 0x7d23703c, 0x67a3e965, 0x79fc710c, 0xe67d19e3, +- 0x79f1d389, 0xc503eb4f, 0xcedf4183, 0xedf51872, 0x3e8f9df7, 0xf42e5d0f, +- 0xc2e599f9, 0xfe3d7f8c, 0x1983a665, 0xd81700ff, 0x1d5a07fb, 0x9004bb81, +- 0xbfa70677, 0x76708ed5, 0x70691466, 0x7c00e59e, 0xd2dcf540, 0xfd631fcc, +- 0xb96cb126, 0xee34fd03, 0xf3f16907, 0x0ff6c26d, 0xfec463b7, 0x1e301196, +- 0xc8341311, 0x2cb3170b, 0xbce95b35, 0x1cb421c4, 0x9ac1e905, 0xeb9fe708, +- 0xe1132f8a, 0x7e5a86de, 0xc2d6ba3e, 0xfde96dce, 0x75b071ad, 0x39772f49, +- 0x683b56ca, 0x6b5f27ff, 0x78b0702b, 0x3819fa2f, 0x93ee114f, 0xd8317ea4, +- 0xcc132fb3, 0x234bcd4f, 0x0ebe817b, 0xf20f19e2, 0x85238cfd, 0xfb655f9f, +- 0x0b2ff46c, 0x796acd4a, 0xf908d55e, 0xa6077dfd, 0x5a703dc1, 0x6ccee592, +- 0xf1c27f5a, 0x5967ab3a, 0xa9bb64ce, 0x8378edff, 0xce5a47d5, 0xa7f5a50c, +- 0x3ab26f1c, 0x0551086c, 0xade3b4f3, 0x3051fe69, 0x3fdf9b8e, 0xf20919e0, +- 0x5f985920, 0x3051ed2b, 0xa3efacfe, 0x2c06a2af, 0x00cfaff8, 0xba9f82ff, +- 0x0e4fe8b2, 0x7915ef88, 0xbf1fd854, 0xfdb6821f, 0xe3a97bbe, 0xf0587455, +- 0x01280a5e, 0x3e385bff, 0x2690ba75, 0x23c848cf, 0x48cf4124, 0xe5d877d8, +- 0xdd0136f0, 0x5db40ff3, 0xf4d47206, 0xf00bdfc6, 0xac21ccfe, 0x28ca7c9f, +- 0xc9e6df70, 0x8fad0617, 0xe5dbbfde, 0xf401dc28, 0x3b4064a1, 0xe4dd5041, +- 0xd4176a66, 0xc95e3f52, 0x68c47f01, 0x7e713787, 0x6ca12d7b, 0xc0d9f237, +- 0x8e1fd310, 0x8fd0bdb2, 0x2da4572e, 0xa77c4fa5, 0x4110aee4, 0x3564a63f, +- 0x720b9c1f, 0x9cecdff8, 0x60f1e0ac, 0xf0e6dbfe, 0x3f6c20fd, 0xe9fb01dd, +- 0x9235afa0, 0x71e74fe1, 0x238f1605, 0xfe510569, 0xfd079f05, 0x37dc2a7e, +- 0xf6c1ce32, 0x44bce95b, 0x13461f58, 0x887ccb15, 0x6a00e413, 0x49df58bd, +- 0x417f0782, 0xcec87ffb, 0x035b74fc, 0x2c5dc431, 0x5f7eb64e, 0x7dd992e8, +- 0x5af0722d, 0xa709e3d0, 0x78f41b88, 0x848ae3d7, 0xfb9218f9, 0xb09fb847, +- 0xde0042cf, 0x1b80e4a7, 0x17ddd9e2, 0x1206ea49, 0xd38bafe9, 0x21f7ef5b, +- 0xe208bd45, 0xcc5ca31d, 0x90aa78be, 0xf768fe60, 0xfb002571, 0xb659294c, +- 0xfabf689a, 0xef7b072b, 0xcfa2a4d6, 0xd6c11e81, 0x8fe30204, 0x440d45db, +- 0x353f874a, 0x1f81d9e6, 0x288e0336, 0xeeac521e, 0x94bfa03b, 0x6cde1433, +- 0xfc41ee7c, 0x24e8ea4a, 0x5789df8a, 0xbfb85539, 0xf07b29e1, 0x7b9fcc2a, +- 0x24f782d6, 0x72b4566d, 0xad3e6fa8, 0xf35e21ba, 0x01307654, 0x05acf3e7, +- 0xa139b3e7, 0x1465e2fb, 0x608d5fee, 0x20e4bf7e, 0xe4052d92, 0x83bd48a8, +- 0x32704f3e, 0xc2cab87d, 0x938a68e4, 0x0243cfc9, 0xde0f3f1d, 0xd1f9442b, +- 0xbaba1bf3, 0x7e8879d9, 0xc089b7d7, 0xbae509c7, 0xc1121e3f, 0x465c9e8f, +- 0xec9cfd70, 0x3a2a0394, 0x1ce71e9f, 0x08cbff4a, 0xfb2e1f5b, 0x5fc63160, +- 0x82de0529, 0xebd80bdf, 0xf052f7e4, 0x39cb987d, 0xed214c9f, 0x53e7ac22, +- 0x442d11ce, 0x9cfcbbc7, 0x9f3d7714, 0x527dfbc6, 0x7d125220, 0x2aacf0af, +- 0x1215df01, 0xad3b7ae3, 0xc438e4be, 0xa66d8b7b, 0x235eb0e7, 0xf4091e3c, +- 0xb1b734d7, 0xaf93a47d, 0xe0c9834f, 0x3d1abce8, 0x1c4d3e6e, 0x0bda28f5, +- 0x78068aa5, 0xbcf4e2d9, 0x7e44fb0b, 0x2f9e26ea, 0x8fa4f33e, 0x388d3fe5, +- 0x72f18097, 0xe04e9fca, 0xebeb8b8b, 0xef3a76fc, 0xfeb1878b, 0xaf410f81, +- 0x5a78f85c, 0xf7f9e82a, 0x4bd1beb9, 0xbf80ef9d, 0xbf8c49dc, 0xe44697dc, +- 0xc49214b3, 0x0de446c6, 0xd9fa0ef8, 0x8a6e0729, 0xa92f7e7b, 0x0fd9d4a8, +- 0x4ed041e6, 0x36d32fbe, 0x1f4ce41b, 0xe32701e7, 0x7ab9736b, 0x10ddb2e5, +- 0xce7ff707, 0x03a98bd6, 0x5a1e61ce, 0x62488fd8, 0xd6ad567c, 0xf203375d, +- 0xc6329c62, 0xf9f9d3bb, 0xc97e68ab, 0x9d17e28c, 0xcc9d3aef, 0xa7f9d68f, +- 0x989bc778, 0x39fc5fdf, 0x126cee21, 0xfe7507b6, 0xf8cfccb9, 0x6cfdb2f0, +- 0x7f8de89d, 0xa9eedd3c, 0xf8631ea0, 0x9be33f66, 0xf81fca22, 0xf03d10fb, +- 0x966f998f, 0x5f37caf5, 0x967e0227, 0x779f16b7, 0x67d9a59f, 0x973393cc, +- 0xf3f11c13, 0x624d9f28, 0xa943b1fc, 0xe82e51fb, 0x1a2dab8b, 0x15ca03e8, +- 0x3e52d759, 0xdfa091df, 0x03935a7b, 0xd3122df5, 0xac5a5b3f, 0x38b67fa8, +- 0x678c5ebd, 0x68f3b065, 0x43b6f244, 0xc036b41e, 0xf3df46a6, 0x8d93a57c, +- 0x13439413, 0xf41d828e, 0xf1ff4617, 0x8dc1e757, 0x82b32430, 0x31cc61d1, +- 0x0d98bd65, 0x8f853be9, 0x00bd7f00, 0x577e833a, 0x73c1587d, 0x2b0f4bfe, +- 0xd85f17a8, 0xc4097af5, 0xcb7cf48d, 0x2f5f3b71, 0xef051a29, 0x9c7b3e33, +- 0x8ebd63eb, 0x27a0e7a9, 0x4ea6f74d, 0x997f4c20, 0x032d3def, 0xb48dc9fe, +- 0x9d03ef9b, 0xd61e4545, 0xb5db6b9d, 0xcc16a069, 0x0ace81f7, 0xfff6855d, +- 0x699e83cc, 0x7dce352e, 0x6e1f9ca0, 0xc1db6d20, 0x4fdf3525, 0x6de7d749, +- 0xaf93ff30, 0x2f881484, 0x919a9506, 0x9aeebeec, 0xba3fd01c, 0xc51fe1dc, +- 0x11c3f05b, 0xbf68fb86, 0x5fbef3e4, 0x08bdd893, 0xbfee0aed, 0xefb09afc, +- 0x7add7c82, 0xdde2c9d3, 0xbb9fcb79, 0x7e61f409, 0xb9f707a5, 0x9f98934a, +- 0xb2121bfc, 0x34bd00e5, 0x41c8e309, 0x2a3e2d59, 0x5223de44, 0x0f3808d9, +- 0x425fb3b5, 0xb9af8c3e, 0xc138efbc, 0xf7ba90ae, 0x26e377c3, 0xde83e5e6, +- 0x955e8e76, 0x0e98eb0a, 0x74ab8537, 0x87023393, 0xbe5ed70e, 0x39ae68ce, +- 0xe1fcc0ef, 0xcd43d03b, 0xe0d88e87, 0x820f9d7b, 0xfd18a7ad, 0xe801f8a3, +- 0xe107e11f, 0x78eba836, 0x87e707f8, 0xfc6dff2f, 0xf159fd40, 0xfe00fc3c, +- 0xe2f7e260, 0xe689ff87, 0xfdaf6a07, 0xaf6519d3, 0xa7961505, 0x3e75d7a5, +- 0xc428e458, 0x608534f7, 0x65d905be, 0xe2dfbf67, 0xf038c64d, 0x46366ef3, +- 0x064787d7, 0x76e22f83, 0xe37930a5, 0x0e8f5df7, 0x8e576809, 0x66e10aa6, +- 0xa206e3b4, 0xbe38d43e, 0x804111c8, 0x1730ac7b, 0xcbec0b37, 0xc5c82a50, +- 0x10f4eb68, 0xc756fff0, 0x1f605965, 0xe72639e6, 0x1f6d7f00, 0x5815fcb1, +- 0xa80fb6b2, 0x1aa37e7c, 0xbd749fb1, 0xab7797b7, 0xc5c43f8f, 0x0f72e1f8, +- 0x7a014f3b, 0x5d0e1a3b, 0x005903ff, 0xcb34210e, 0xf5038df2, 0xe83b4b75, +- 0xe2838073, 0x9a40b775, 0xb4283ec0, 0xc18ad278, 0x9217ebce, 0xd6aece00, +- 0xbc43072f, 0x9fcb7a68, 0xd3bc020f, 0xcd267df5, 0xb664cfb8, 0x477b75a3, +- 0x7b742bf7, 0xd088a248, 0xb76826ed, 0xb86ee7f0, 0xafd61b1f, 0x71cf0d90, +- 0xbd5a743e, 0x57e5c3c8, 0xce98f3a2, 0x690d71e7, 0xd7c8b843, 0x99337cdf, +- 0xc70667d2, 0x24fdf4c7, 0xed0b9094, 0xf14d5c84, 0xfc44b570, 0xab9c7449, +- 0x1c7c8135, 0x8cd727c5, 0xefe1d637, 0x3f48f4b2, 0x5e6fbdbd, 0xe299261f, +- 0xdcb7dff1, 0xabe763ef, 0xe763eaff, 0x150e2767, 0xa82c12fd, 0xb9d933e3, +- 0xc3c33759, 0x7afe257e, 0xc98b88f5, 0x7b4b44f1, 0xdc1b9c2e, 0x5c2bf3bd, +- 0xfcecf71f, 0x13b01dea, 0x08971c27, 0x3c4e01e4, 0xf709263e, 0xe067c73d, +- 0x6fde9d3e, 0x0e4da7f5, 0xff239ec2, 0xef82f7e8, 0x1478f0a3, 0xe586cf80, +- 0x3d0f1d8b, 0x3d9dfd0c, 0x3ce8912c, 0x3bc512f3, 0x2569e20c, 0x7df87efc, +- 0xf497b302, 0x5efc7df6, 0x5972ffe6, 0x9b6b7ef8, 0x625efdc4, 0xd5f3a28d, +- 0xe524f354, 0xf57ae845, 0x52e3d2b1, 0xe07d2c6e, 0x0f9d63ef, 0xdc6793cf, +- 0x579fa95b, 0x23f8e3ae, 0xf3c3df7b, 0xdd345700, 0x7e7d8121, 0x3c488645, +- 0xa95ee351, 0x2a3e0f52, 0x8b8f71ee, 0x76eae5e7, 0x1fa7deca, 0xf706919e, +- 0x7a988859, 0xe5b2dd55, 0xb7a85c95, 0x71cf7189, 0x457bf19b, 0xf0121dcb, +- 0x262e17ff, 0x3f8dbd1f, 0x27ca62f1, 0x09dd0297, 0x040af3b3, 0x7d332394, +- 0x7dfcecf7, 0x9ea8fb6a, 0xfd13ddf1, 0xb17874cd, 0x2ff708a3, 0x9987a37a, +- 0x79d1776f, 0x42fce9fa, 0x6a7e9e74, 0xb9f1ed8f, 0x2f92feb1, 0xbf3aeb03, +- 0x913eb756, 0xce9cf60a, 0x1952d3a7, 0xf1d84cdf, 0x46712a70, 0xdbc665e8, +- 0x66fd395f, 0x0ce66d11, 0x826dcffa, 0xe17d42e6, 0xcf906d27, 0x9c61c652, +- 0xda0956f5, 0xcfe7841f, 0x59b1d79b, 0xd7bc28e2, 0xd97bd7ba, 0xa0ca1587, +- 0x15ebcd6e, 0x7c0e17dc, 0x4aa75e6d, 0x7049d40f, 0xb48958ad, 0x6e31e99c, +- 0x9970eba7, 0x2936fce9, 0x04f479c3, 0xcc0f99a7, 0xb9f6eaf0, 0xc5394f7e, +- 0xda14b4c7, 0x216ab5df, 0x1d662fce, 0x69e978e6, 0x5e69edfd, 0x7ffc4d47, +- 0xd7d4d8e6, 0xc93dbd00, 0xe66e999b, 0x947f5d76, 0x587900c0, 0xf91ec1fa, +- 0xf48e95c2, 0x10a7392d, 0x0f1bec0f, 0xa24f93b4, 0x7d3221d6, 0x9ddbf208, +- 0x27acf66e, 0xce7a5b7e, 0x11a9bc42, 0x1f9b93be, 0xeddf0074, 0xb01cea90, +- 0x59c533af, 0xf1449b5e, 0xa2d3f535, 0x74bcf1eb, 0xc84085bb, 0xa9cb5a6c, +- 0xa84710bd, 0x9f30483e, 0x7765a8ba, 0x4be9f031, 0x51fa1b52, 0x7909675d, +- 0x6cceca30, 0x8075a96e, 0xc69cd61d, 0x4bed03ce, 0xcdbc8626, 0xbf191247, +- 0x3d3e1f36, 0xfda713c3, 0x8ebf6f00, 0x7172d278, 0xfc61765d, 0x058d64a3, +- 0xd0553fe7, 0xbb034e5e, 0x0f7646e5, 0xb8eb5763, 0xbc28d397, 0xa324b79d, +- 0x7cd6999e, 0x4a6e1dcf, 0xf33fe088, 0x1cf779f1, 0xdf40db41, 0xac35512b, +- 0xe3645497, 0x7fb8f8be, 0x1d375ea5, 0xd194afda, 0x2e2699bf, 0x751e2096, +- 0x03c84332, 0xd0a7717f, 0xa77e12be, 0xc6ce5fcd, 0x2a7f6e21, 0x4c6f9ff8, +- 0xbf8d1d4f, 0xf5eaa26d, 0x6bf7f00b, 0x5b4fc988, 0x6eccedbe, 0x3e5f6d2b, +- 0xc77cc053, 0xe22cee69, 0x929fe28f, 0xf99e9435, 0xfa5b2f94, 0x5f5f0117, +- 0x673c6a57, 0x41ccb335, 0x63f1d102, 0xc2c32dc1, 0xb5e78fb3, 0x7efc0b76, +- 0x57e72e59, 0x359f7e71, 0x5df0d53b, 0x66766139, 0xdd9136f5, 0x7ec85257, +- 0xaf975127, 0xbc39711f, 0x37c7fb8a, 0x700cb37a, 0x0d28874c, 0x693334fd, +- 0xd75dda28, 0xe5c76d9c, 0xe0fc5cb9, 0x78e89bad, 0xf2611a3f, 0xabc5c56b, +- 0xd8322f90, 0xc84cca7e, 0x6f41122e, 0x66bbdf1a, 0x471eb1bc, 0x27abcf8e, +- 0xb3307d74, 0x9bfdc455, 0xcf148599, 0xd3b18902, 0x18beadbf, 0x865ed167, +- 0xe7b5d078, 0x04bbf83c, 0x83e2fa31, 0x2fa4efd2, 0x3832a05e, 0xd2f5ca9e, +- 0x0fdfee44, 0x6f408322, 0x1f1b134c, 0xa2ea3e06, 0x0e35a6eb, 0x8eebe91f, +- 0x5097efee, 0x21be0639, 0x8f18691d, 0x032e769d, 0x7f7449f3, 0xa847ac3f, +- 0xb1c5a25d, 0xcc4bee97, 0x1307dc31, 0x76512bd6, 0xfdf05c89, 0xd46992ed, +- 0x00f2551e, 0x9fc481be, 0xe30cfa8f, 0x70902592, 0x8cc1f102, 0xa9e71853, +- 0x8affa896, 0x4c13f3eb, 0x097fd1cf, 0x30f91129, 0x9c7a2bdb, 0xdba49ad9, +- 0x093e4653, 0x97af1bc7, 0xf3a3ee31, 0x13e00949, 0x117affe4, 0xf1bd3ae3, +- 0x6f7e3e8d, 0xfaa212fc, 0x0f384928, 0xfbf970bf, 0xbcf2fcb6, 0xc8c327ce, +- 0x89f0beb0, 0xbf3a1fce, 0xa609d8c4, 0xeb4f5078, 0xe9894bcd, 0xd69edf88, +- 0xc847979b, 0xb37bd7a8, 0x3126766b, 0x744aee3d, 0x5d577f63, 0x7609d334, +- 0x11eb958d, 0xc70add7d, 0x9f19eab5, 0x573edcbc, 0x6aa3fd82, 0x11d91fd0, +- 0x60f1e83a, 0xae972f9d, 0x9cff1821, 0x6756f5ce, 0x56078b2b, 0x7003154f, +- 0xe5b8a284, 0x9d5987c1, 0xd3a2cbdd, 0x27ce6af7, 0x096ed285, 0x1af3777e, +- 0xbe20d04d, 0xc4f1e1e4, 0x8094e719, 0xafab1d9a, 0xc75fba74, 0x0bbf07bf, +- 0x23c6bfde, 0x1c4ba804, 0x3baecfa3, 0x188aecc7, 0xcfbc2a7b, 0x891e62ab, +- 0xeb4e5f99, 0x86421f74, 0x0aed3bfc, 0x76fce921, 0x6f7dfe85, 0x1e064e74, +- 0x65ee7a06, 0x1d80aef7, 0xe2be740f, 0x3afd849c, 0xccf18c93, 0xbf791db3, +- 0xbf93df41, 0xcdafbe6f, 0xc6de9f3c, 0x17f746ff, 0x8fa0ffb8, 0xcec4957b, +- 0x27d79bc7, 0xd75e9c7d, 0x99bdfe23, 0xe293c37e, 0x3eba7ddb, 0xd73fc18e, +- 0xafd13dd7, 0xebad7d37, 0xbeb77fc5, 0xd7d7fbd6, 0xb35c7d13, 0x8fc9ef1e, +- 0xeaf2f5d4, 0xdf8c16f5, 0xfafee14c, 0x9e2f1e14, 0x6ce2c499, 0xeedeb8b3, +- 0x0166dcfa, 0xb3282ebb, 0x6eff30fd, 0x36a1c627, 0xd0f662ef, 0x724e3c9b, +- 0x9c6220b7, 0x16b1eee4, 0x17d4dbd4, 0x4b7987ca, 0x808c8445, 0x2c01dcfd, +- 0x8528df4e, 0x6bef50ca, 0x6f738112, 0xefdfeaaf, 0xfd04dff1, 0x70f1fddf, +- 0xa3c62d4b, 0xc7e06d43, 0x7093cb8f, 0xaad92c5f, 0xb3bafc62, 0x03f78ad5, +- 0xd9f8ed75, 0xf9fa196e, 0x5ae0689c, 0x0d6ad4be, 0x1e814bef, 0x101e2699, +- 0xaba33f21, 0x59fde09b, 0x8a876793, 0x429b3fc1, 0x0e216ada, 0xf9615130, +- 0x3d3c66e8, 0xcc31f7ca, 0x7de114fb, 0x9f665689, 0x7644bb15, 0xfb4f580f, +- 0xe60acd12, 0x2fb6f757, 0xa0967851, 0x2fb3169d, 0xd2f4ccd1, 0x9897ddb7, +- 0xdf87b808, 0x9ff9d367, 0xc3d227eb, 0x8566c4fe, 0xbf7567ed, 0xbfb0132e, +- 0xb8b4b1c9, 0xf6dea371, 0x4aec7629, 0x1d3dc0f0, 0x4deff99b, 0xc035d8ec, +- 0xfcf6e6a3, 0x777b6e7e, 0xcda4a811, 0x984ad78d, 0xb9e3c6f7, 0x19a0b8e1, +- 0x66ff1caf, 0xc8156e7c, 0x07c4072a, 0xe0a9b45b, 0xbfb8f517, 0x71c1edd3, +- 0x5d478afa, 0x491f364e, 0x6f9f00f0, 0x03c0323e, 0xfc003fe3, 0xab59710a, +- 0x93f015fb, 0x9d3e1c77, 0x8abcfb80, 0xa4bf0547, 0xb1a6d93b, 0xef8c8973, +- 0x03c39983, 0x9abd0fb0, 0x84e6f9f3, 0x4c8ebfee, 0x61afde8b, 0x39fa33fb, +- 0x60855aff, 0xc2df883e, 0x78cc41f2, 0xeb66e41b, 0xebc4e6b5, 0xa69c89c3, +- 0x35f2f18a, 0x7f9662b5, 0x807e7e60, 0xf03977f3, 0x7147ed01, 0x8956b833, +- 0xaeff8465, 0xcef58128, 0xbfe5af5c, 0xc67b4387, 0x1cd565df, 0xed2a3396, +- 0x67d278e3, 0x40efc057, 0x3b96f96b, 0x2f70dc73, 0xf2ca5083, 0xb2f92c3c, +- 0xc493c846, 0xd6953a52, 0x0ecb922b, 0xb883f526, 0xe40d73b1, 0x479e4333, +- 0x2f445a5e, 0x0ad747dc, 0x2e245e5b, 0xbf12b0eb, 0x3d70ec1d, 0x79e79fcf, +- 0xfbebb52c, 0x3eecedd1, 0x86fe8aea, 0x850e4e73, 0xbfbf477e, 0x9a3deade, +- 0xa14cf984, 0x7dd29544, 0x78698ef9, 0x76e2907f, 0x3e477ce3, 0xf803293f, +- 0xd9f5c281, 0xff5c31ff, 0xc82e0f1b, 0x3a71816f, 0x062c8eb6, 0x087231fd, +- 0xd08b599c, 0x7c41aa87, 0xbc120f6e, 0x01fff12f, 0x512809c2, 0x00008000, +- 0x00088b1f, 0x00000000, 0x5bb5ff00, 0xd554740d, 0x79bfff9d, 0xbe4cdef3, +- 0x21264cdf, 0x012f0842, 0x1c424242, 0x61f08062, 0xc4443e1d, 0x602a0320, +- 0x43e196eb, 0x9a1af909, 0x7ab76eba, 0x2904930e, 0xb693db02, 0xb654e56e, +- 0x28bb560e, 0x82609d89, 0x04ec2681, 0x6eb50314, 0x5b604040, 0x6a445477, +- 0xbb8d3243, 0xb29eec54, 0xf7bdffff, 0x60c33325, 0x392dd9e9, 0xddf73739, +- 0x7ffdeefb, 0xf75ffefc, 0x595c003e, 0xc9a00392, 0xe7b73aa6, 0x001aa802, +- 0x6dbcdc64, 0xa0556052, 0x324e4018, 0x63240a6d, 0xd4da669b, 0x668a6d86, +- 0x9aa9e362, 0x70805ace, 0x6c14b2ce, 0xf2ce70b4, 0xc6efbc29, 0xc34b9656, +- 0xfdec32c1, 0x45f38a5d, 0xe1d90a9c, 0xfec49e0f, 0x39148ffb, 0x42ff63b7, +- 0xa4096a62, 0xe7f2ac01, 0x3fb08535, 0x1b1fe2d5, 0x69ceba44, 0x1a6d2c9e, +- 0xfe2dd7c0, 0x7be32089, 0x68529bc9, 0xf005c97d, 0xbab63b1d, 0x22948f06, +- 0xd5d02e7d, 0x60a300f1, 0x08a976b7, 0xeb82a900, 0x05f6f1e9, 0x58074c2b, +- 0x8eff1339, 0xf19217d8, 0x53d22679, 0x741b9fce, 0xb405fee0, 0x30cf41bf, +- 0x5dad901d, 0xeff6024a, 0x96eff63a, 0x8fb81851, 0xdf9313f7, 0xbf8b6122, +- 0xa2fd7fd4, 0xbfc3efc9, 0xdb9f6807, 0x792bb669, 0xc43674cd, 0xebf999f6, +- 0xeb119946, 0x3e7c1fc3, 0x65092f8d, 0x9015d59d, 0xf33efd8a, 0xd8ab2147, +- 0xf4677f07, 0xe327e67a, 0x45ce337b, 0x8175c73f, 0xd62d9fe8, 0x0cbf072d, +- 0xa1998f28, 0x61b379e8, 0x5c641fe7, 0xe8e5f677, 0x14b40be7, 0x3467e307, +- 0xf8cebe8c, 0xbd70aa43, 0x6f5f2b7a, 0x34bc9de8, 0xcd9bfd40, 0xbb945328, +- 0x8e50cbaa, 0x77fa75ed, 0x66fb4017, 0x700f979c, 0xb595b360, 0xeb6b4e53, +- 0xcdcefe88, 0xe0152008, 0xd62ce6d0, 0x98c69aaa, 0x561a729c, 0x3ec44943, +- 0x90c7df1a, 0x2e39d0e3, 0x82a1a9c7, 0x5f60e6e7, 0xafc055e9, 0x4b39f08f, +- 0xb80869c8, 0x9534879c, 0xf1fa79c9, 0xc411dd9f, 0x132c9647, 0x25fc11e8, +- 0x17a089e8, 0x0a93f48c, 0xd97d51ec, 0xd5cf8fd0, 0xdfeb8597, 0x714fd621, +- 0x075a8e8e, 0xa113f8fc, 0x85f643bf, 0x71f212bd, 0x05657247, 0x9e5693f1, +- 0xd96eb517, 0x427ab13b, 0xd3cbe1c1, 0x209fc890, 0xc69fa69e, 0x33f988f1, +- 0x00923e1c, 0xfa26ff94, 0x4cb34039, 0x62eb3476, 0x6f27f3f4, 0xc99bb7a6, +- 0x9b9e4a13, 0xe5ebf8e3, 0xcb457369, 0xb4517d33, 0xd1dc333c, 0x2ab51cf2, +- 0x79b76e5a, 0xa632e5a2, 0xf8d47272, 0x51a54dd8, 0x99df71fd, 0xd73f3515, +- 0x3faa2f37, 0xa8e2db7e, 0x979b13f9, 0xed27f547, 0xfcd47afa, 0xa8daff42, +- 0x55bda2f1, 0x29ffa4b7, 0x79a8fa81, 0x57d35e24, 0xcef6ffe8, 0xf3ed46ef, +- 0x2fffd6b7, 0x9c7ff463, 0xd234d97c, 0xf447fa17, 0xf24a838b, 0xd99f0936, +- 0x93f25690, 0xafb7aeb6, 0xbe976849, 0xe88fba79, 0x67062df0, 0x2b3d8e13, +- 0x6bf225bb, 0x26d45063, 0x4c5b1bf4, 0xfefe4950, 0x6ad326fb, 0x9d88f277, +- 0xb624d71f, 0x982af3fe, 0xf3d1ec13, 0xcc8f1796, 0x14d3da33, 0xf88da61f, +- 0xf45bafd9, 0x3df210a6, 0x147ee655, 0xf269ebfd, 0xa7a417af, 0x8a997214, +- 0x8a78a7c3, 0xed59bc59, 0x0e06d6c6, 0xb4db1ea9, 0x5faebf11, 0x505ce547, +- 0x98ff2ffd, 0x3b213fe8, 0xdffa465f, 0x86dc8125, 0x89bb56bf, 0xc361f3ec, +- 0x9a7ae96f, 0x21ae822d, 0x048fa5e4, 0xd0d3d66c, 0xfad0c3e7, 0x9dafccf1, +- 0x4805a6ff, 0xce55e7ff, 0xb2ff318f, 0x099f6bf0, 0xfe4fd6bf, 0xbc647f2c, +- 0x528fcf72, 0x7ce75c74, 0x440a2c01, 0xe42c29c8, 0x58d06604, 0x75cd99bc, +- 0x876aa176, 0xbfae18f2, 0x44d87df2, 0x13fcacfb, 0xef7c8a6c, 0xdec29acf, +- 0xb326b3fb, 0x59360576, 0x1815e728, 0xaca56ccb, 0x5db0941f, 0xe40a0bda, +- 0xe4f32c01, 0xf794242a, 0x03a679c0, 0xa292b4b7, 0xc107bdf1, 0x3fff90ad, +- 0x14dacdfb, 0xcebc379a, 0x4fdd4fdb, 0x8a815d38, 0x7dff61b6, 0x44c94f9b, +- 0x53be107f, 0xf711f162, 0xf773d2b1, 0xa69e6323, 0x3c167338, 0xbea0ce57, +- 0xad938396, 0x600bac67, 0x1733f28f, 0xe3a60854, 0x160bbe3a, 0x4748cbff, +- 0x4561b23d, 0x8f77d4fd, 0xb0647e62, 0x3fad8fea, 0xc7ab79c6, 0x9c52c684, +- 0xa7f550be, 0xc3f3d27c, 0x20afd0bb, 0x3d124b6f, 0x118cb619, 0xff5f9c39, +- 0x638d0a79, 0x867a65bc, 0xcbe7167d, 0xd8fb7e4c, 0x71bcc67b, 0x6da3b9b6, +- 0x5c72e724, 0xf88de664, 0xb00a5a33, 0xa9549f94, 0x177e9ffe, 0x0a1384e9, +- 0xcbc0cf5b, 0xfa978146, 0x24547d5c, 0x8653ea5e, 0xf08a32f1, 0xccb2ff52, +- 0x3bbea6ec, 0x97280fc1, 0xde770233, 0xfb5ed77d, 0x9e1d4eae, 0xb88c7cef, +- 0x9f2711d1, 0x8c746e20, 0x6e229f7b, 0xd90dffa8, 0xfde8953d, 0xa9c7e778, +- 0xc1f75a1e, 0x507ba35b, 0x06fd9f0a, 0xc738f7c9, 0x9d0c10fb, 0xbdba7e65, +- 0x1d21f750, 0x3b5c0ff3, 0x5d5cf94b, 0x60b745bb, 0x742d8aff, 0x7f9a79ec, +- 0x5f9a0250, 0x4e604c17, 0xf25daeab, 0x5578e027, 0x31d6db67, 0x596aafd8, +- 0xc3614656, 0xbbc10a9b, 0xe4bf7c68, 0x4bf1c46f, 0x1725839b, 0x87bae027, +- 0x75a25dae, 0x75f10e07, 0xe60e6f2f, 0xb0300e53, 0xb407cd7f, 0x05bb4d5e, +- 0xb1bf2812, 0xb431d505, 0xa0149b5f, 0x3f032afd, 0xcafd6950, 0xa04d9697, +- 0x6f7aa6f4, 0x1109c4cf, 0xc0e06b7e, 0x39475549, 0x60ffb655, 0xc65798a1, +- 0xe19f97c3, 0xa37fe0d7, 0x1cdf27bf, 0x6ff13fe9, 0xf093d91f, 0xf216bfbf, +- 0xbe35d55f, 0x7e89c489, 0x8979e3a5, 0x84d595f9, 0x5b870ba7, 0xda4bfb7f, +- 0x4ebfe0ef, 0xd940dc24, 0xdc1bc9ad, 0xeb17163e, 0xf9703ec4, 0x429dd53d, +- 0x452e53f2, 0xff3e73fb, 0x435dcd90, 0x2a9861fb, 0xc48444d8, 0xd0db87e4, +- 0x93e4801e, 0x43ecc89b, 0x6bab0e4e, 0xd1ef9e90, 0xacc7a404, 0xd8b5d585, +- 0xf31766df, 0x97feacf2, 0xafa46f73, 0xf26666c3, 0x2781e6b1, 0xed186fd2, +- 0x3a471a7e, 0xa67de68e, 0x4ebc7086, 0x6e12acbf, 0x53bf82eb, 0xdbdfa475, +- 0x5742e1f9, 0x3602f79c, 0x9314afee, 0xd94f72bb, 0x4bd47d88, 0xf089218d, +- 0xce92707e, 0x2f9b58f2, 0x48ebe8c4, 0xf98f89d0, 0x3d377e07, 0xefdeb114, +- 0x26131f11, 0x7eebf48c, 0x428961f1, 0xc3fd7b72, 0xc8ca7312, 0xe4cc81f3, +- 0x3a5c7f4a, 0x3a78bc78, 0xf6997dd5, 0xd1603dad, 0x13be191b, 0x77c2419c, +- 0x3d139257, 0x6d5be135, 0xf7c48b2c, 0xbaee8cc3, 0x4889d92e, 0x65ceba87, +- 0x3f36069e, 0x906a49c5, 0x08fae73b, 0x66e6b267, 0xc1ff8478, 0xa54710fd, +- 0xa3fa37f4, 0xcfcf3695, 0xe4e67f49, 0xbc48c4e0, 0x394299d5, 0xcfe9128d, +- 0xc2373cd3, 0x9f64e4fe, 0x7920e8de, 0x7d653ba6, 0x898a7f44, 0x0f4065eb, +- 0x8e29daa5, 0x50f5c66d, 0xdfc1031e, 0xb7fc92a5, 0x92b3ae76, 0xa6c77fdd, +- 0x55593d31, 0xff61ae9f, 0xbe47d4db, 0x4aeea9b7, 0x996dabb2, 0x0d764089, +- 0xef8676d9, 0x01d784bf, 0xbd5457b2, 0xb8a01e02, 0x36f0203a, 0xff981630, +- 0x708fdca5, 0x37be5326, 0xa3c8cc9e, 0x676f3cd1, 0x08c5c94f, 0xae0e077e, +- 0x4a7d1274, 0x321f7f22, 0xf7635e39, 0xc3814ffd, 0x9b6b4da7, 0xe1c446e7, +- 0x15bf79d8, 0x00e43478, 0xab165f66, 0x8cf13107, 0xdb3adf87, 0x1fe433bc, +- 0x0bbbb69f, 0x899b0fc8, 0xaea3c230, 0xe703a5c6, 0xcde907ff, 0xc85c7f98, +- 0x1a3c5555, 0x214df5c9, 0x33754557, 0xeb61a339, 0xfcc3c764, 0xed71a9e5, +- 0xdfc10bec, 0xbd68dcb6, 0x2abbcec7, 0xbe4c53f8, 0xe744b5ac, 0xcdd99961, +- 0xfa661ea0, 0x060de637, 0x77fd71af, 0x8bbf7e7d, 0x05773cec, 0xaf67e7c3, +- 0x11ca9614, 0xcdb38eeb, 0xffe22ffb, 0x8a0f0313, 0x0ee88b2f, 0xdeb1f0c5, +- 0xf892fee6, 0xc83bf236, 0x4e12dc76, 0x4e07d440, 0x3eb0ef11, 0xabe33028, +- 0x24e89083, 0xf226deff, 0x19b83360, 0xa9c0924e, 0x05d77ab3, 0xfc8d9abf, +- 0x6098f535, 0x9b53763b, 0x8139ca24, 0x9ccd608d, 0x228c9b2a, 0x52c565c2, +- 0x0c8c88af, 0xf6ed53c7, 0xbd20b77b, 0xf327c107, 0xfeba39ba, 0x92e49705, +- 0x37deeb22, 0xbdd7e2ab, 0x644d3dbb, 0xeea97fd7, 0xad34199d, 0xfafed351, +- 0x1d8277fa, 0x1822e8f3, 0xdb27a3ce, 0xa0544675, 0x102fe380, 0x7b33f44c, +- 0xf09f54c4, 0x1a7e4fdb, 0x922bf9e5, 0xa553ce29, 0x0dab0281, 0x78eec4a0, +- 0xda365b66, 0x3fce04d7, 0xefe89bf5, 0x0c679e5e, 0x4e6fd3d7, 0xfa277966, +- 0x93d59921, 0x4625a09a, 0x1f98656f, 0xd88d3a41, 0xe0f1eaa3, 0xc9532fb1, +- 0xf5dab6ef, 0x84bd277f, 0xf940cb8f, 0xa439825b, 0xd5d8e2da, 0x3163ca01, +- 0xcedc790f, 0x9dac6bcf, 0xfb8fcb92, 0x5017755b, 0xb4d04f7c, 0x7d8472a9, +- 0x3625d815, 0x85d8f6af, 0xc7f3151c, 0x5277a62b, 0x9afd718b, 0x74a9fd8e, +- 0xfe7d53ac, 0xed4a74d4, 0x0a9ecd8b, 0x4cfbce3b, 0xa56f93da, 0xbf9b70bc, +- 0x0813e484, 0xbc51a5e6, 0x9f06629d, 0x7a46f4b9, 0x594abbbc, 0xcbb75591, +- 0x5d29dace, 0xbca06c77, 0xfce41bd4, 0x0e0a1ed2, 0xeb027615, 0xd936740f, +- 0xbfef3d69, 0xff268f75, 0x56032fb4, 0xf578ff91, 0x7dfcc98b, 0xfe699833, +- 0xe04dbb1a, 0xf3a26fdc, 0xdce27da7, 0x130be06a, 0x3fec679b, 0xacae73a5, +- 0x838a0e21, 0x0fc847cd, 0x58597424, 0x12f0951e, 0x61747970, 0x38e7477e, +- 0x8a01ef87, 0x70368343, 0x9ade384a, 0x4f796618, 0xbfa2dbb8, 0x9adc9128, +- 0x55bcec81, 0x214af5e5, 0xf27f7202, 0xbf6373c8, 0xe8e7ae84, 0xe170898c, +- 0x6097b8a2, 0x933b866e, 0xc29de523, 0x73b46ee8, 0x0626b53c, 0x9794c94d, +- 0x9178044f, 0x274235d1, 0x3a0d7db0, 0x6f7f990b, 0x9e97c355, 0x34ba3074, +- 0x702141c2, 0x926ba13a, 0x412dfe4e, 0x123e3173, 0x93e9dd34, 0x5bcba46e, +- 0xda178982, 0x611bf7cd, 0xaec98ed8, 0x7d2389bd, 0x6b42da2b, 0xf835c71e, +- 0x20b33e16, 0x0e4fa23b, 0xfde47ca6, 0x3ef7ece7, 0x9d9b25b3, 0x5464f917, +- 0x29b61275, 0x6753e276, 0x74d7a27c, 0x39729465, 0x494e5138, 0x3c3e3e56, +- 0x4c9e711f, 0xcf3e64fd, 0x1692d169, 0x017b32e7, 0x2f2317b2, 0x5e0a5c7b, +- 0xb5ed0bba, 0xb4ee07ff, 0xdfabe462, 0x1689e474, 0x35fbf79c, 0xf620fc81, +- 0x179ea94f, 0xfc6f9f09, 0x298eed66, 0x155b6fe4, 0x9df90567, 0x2c87ef90, +- 0xd1557dff, 0x1dd847b7, 0x09338764, 0x78fbb1bf, 0x90fe37cf, 0x83c1dbf2, +- 0xc9d56e92, 0x887386ef, 0x4faebaee, 0xdee7f255, 0x7cb21f83, 0xe7ba6e76, +- 0xafea3b35, 0x3e61b3bc, 0x342675c9, 0x2ebf9137, 0x20417912, 0xa193fb8b, +- 0x362ff9d3, 0xb4e1e844, 0x7b0837b0, 0xea7c51c6, 0x987af612, 0x3b6c4eea, +- 0x4f1e1e7a, 0xba8877eb, 0x01af78d8, 0xb9218c8e, 0xac9bc237, 0x7e378e1d, +- 0x59c222f3, 0x6aeb59d1, 0x77fcc457, 0x7abf3ced, 0xbdf3ced7, 0x379ee9f5, +- 0x3dd53e49, 0xc4a9a91f, 0x0e40c5e7, 0xac0193d5, 0x7e38b58f, 0x637ed864, +- 0x0e6bc9ec, 0x7bdf34ab, 0x415f9819, 0x43496f7d, 0xdb3bedfd, 0x3e0d7939, +- 0xa49d40ef, 0x9e709e51, 0x8a1d87d7, 0x6fcd0c7b, 0x84b57338, 0x2201d8fc, +- 0xdab9e902, 0xe48e3d5d, 0x979ff886, 0x06d67648, 0x7619afcc, 0x8a764c5a, +- 0xfe1317ef, 0xc85fa8cb, 0xdaab72fc, 0x65d998b7, 0x2ec80987, 0x1eccff11, +- 0xc51aff10, 0xed0d62e3, 0x893fbd81, 0x9f6b79d9, 0x58f2c5c9, 0x5913ebf4, +- 0xd403de7f, 0xa05bed6f, 0x21373b31, 0x5ec94b9e, 0x3ad84783, 0xa4898001, +- 0x91dc093a, 0xf60503e7, 0xc337a654, 0xf6174e5f, 0xd3d0281b, 0x9247c89c, +- 0x47d9472c, 0x7de49c44, 0x3f5d4711, 0x9e67c7fa, 0xfb4f839d, 0x44d09c44, +- 0xfdc73c7c, 0xac45b7fe, 0xd66b7faa, 0xc7ca16d2, 0xf1b32d7f, 0x227ce2c3, +- 0x44727028, 0xdc504f9c, 0x6f3f51d0, 0x69d7738a, 0x1fa177d8, 0x34daee9d, +- 0xf2aa729f, 0xa947cd45, 0xcc0ee59d, 0xce7154a7, 0x0aa3beaa, 0xc222f337, +- 0x7b91fb5f, 0xf7e4cc8b, 0xaefaf3ce, 0x07f0cbfd, 0x9e1ca2af, 0x8ff28c38, +- 0x1d90a713, 0xafcc3f86, 0x8dd640c6, 0xe19283e3, 0x4bde7647, 0x97681c78, +- 0x4848fa47, 0xfa9b021d, 0x9fdbe919, 0x9fdf61f1, 0x474acaee, 0x78711e79, +- 0x9e51d2b2, 0xccbf2783, 0x38ecb324, 0x9bab11fd, 0x115755db, 0x0f3da7e1, +- 0x3838cd4b, 0x73f3a735, 0xf44b3294, 0xced18af9, 0x3071e74e, 0x243b07df, +- 0x9acb1756, 0x76e6ea9f, 0xfe62a5d9, 0x2b7c1973, 0x11bf9366, 0x828f81e7, +- 0x1fc2e7f8, 0xa263cfd4, 0x2be528fb, 0x7b1eb718, 0xaf398956, 0x3c2264db, +- 0xe092e86d, 0xe57bc827, 0x1771d8ee, 0xc46a5bcb, 0xf73b1b3a, 0xfa831b1c, +- 0x7a297aac, 0x2be50d5e, 0xc03c9cec, 0x169acfea, 0x499f3a25, 0x78cb7917, +- 0x0b794f18, 0x07f989e2, 0x16bd0cc5, 0x8745efc4, 0x6b4c90a7, 0x09cb899f, +- 0xcbb32afd, 0xb4bf9142, 0x28fee3ce, 0xccfc057c, 0x8e06f66e, 0xb3dd22a6, +- 0xb49d725a, 0x1f332cc7, 0xcb99d59f, 0xfd980ce2, 0x445432f2, 0x90b3cbb9, +- 0xd73ed3e5, 0x47942ce9, 0xa093f0a5, 0x8daef3f1, 0x914aaf82, 0x47f46dcf, +- 0xfc133dd3, 0x86cfb44d, 0xa83392bd, 0x1280f9d3, 0x8af3af37, 0x9d766a75, +- 0x7bc7463c, 0x79e881b5, 0x6f1f215e, 0xfdf3f467, 0xd58136c0, 0x347ce2e9, +- 0xf9d87207, 0xd5adef78, 0x7857bf53, 0xac4a717e, 0x166f8c63, 0xf243a9b8, +- 0x7e35bf48, 0xa9b84fd9, 0x3ca97c94, 0x35e485bf, 0x033af748, 0xa0fe3a2f, +- 0xf90bd63c, 0x617813ac, 0xb5fbe17c, 0xdd3f25bb, 0x19dfad2b, 0x81a3ff4d, +- 0x0f090b35, 0x6caab8b1, 0x5b7e5851, 0xca549b05, 0x5571636f, 0x66978c35, +- 0x2c58e295, 0xd23cea9e, 0x79e6e84d, 0xee95fff9, 0xcec8256a, 0x59ffaa7d, +- 0xfe88fa72, 0x74a96ff6, 0x7da378fe, 0x1956fd70, 0xfd7c1138, 0x6f3cfcb5, +- 0x4c327fe0, 0x945dfa66, 0x50758b7e, 0xa6dd3e74, 0x3218fb72, 0x0362f3f3, +- 0x2fefb13f, 0x3df8f914, 0x57b580bb, 0xa54f3f3a, 0xbec1dff3, 0xad6054a1, +- 0x3fc51169, 0xf0884fea, 0x79d2fb3b, 0xeb35b89d, 0xbe53efe3, 0xe29b4f7e, +- 0x6a0e4cc4, 0x8a6e2ac6, 0xdf6335d3, 0x11109cca, 0x79d2da57, 0xdb4f79fd, +- 0x74098da3, 0xe48af0ce, 0xec1bf324, 0xd423fbfa, 0xce48b5f7, 0xb1fef889, +- 0x6777a1be, 0x92b23e93, 0xde7ad3a6, 0x5a8bbbee, 0xc5ec7fb1, 0x75919c3b, +- 0xe73b31e5, 0x0ab19eef, 0xa3fd9b8b, 0x41567e93, 0x3dae80e7, 0x0ffb8ecc, +- 0x9d92aebd, 0x904ab60f, 0xcb1d1b85, 0x8f9afa3a, 0x27039cea, 0xe7c64a55, +- 0x43549fb7, 0x5c0f915f, 0xc82b72c1, 0x559b49ce, 0x1ddc6baa, 0xca21a89f, +- 0x90fa5e8f, 0x75553f9d, 0x548fcc4a, 0x3afd96ed, 0xfbb479fe, 0x5470950d, +- 0xa8c122d7, 0x8571c8dc, 0xa3bf938d, 0xdc2da7fe, 0x5cf81a7f, 0xe068f02b, +- 0x5aebc0d3, 0x6dd667e1, 0x63e3c68b, 0x1a3adae0, 0x65b47fdf, 0xcd794a8d, +- 0xfdf1cda3, 0x36afe18c, 0xfe88fd50, 0xe8aec37f, 0x71871b79, 0x387e63e8, +- 0x1bf59fd6, 0x42842c38, 0x7050e1c2, 0xe23338ed, 0xaac9eafe, 0x5ee71071, +- 0xb7111de4, 0x3379b88d, 0x7e740eb9, 0xf3bc52ae, 0x6eac2b66, 0xb7ff66f0, +- 0xab93891a, 0xbb0b2702, 0x53f4c0fe, 0x80b3d5d1, 0x9e025bf6, 0x92ef921a, +- 0xf28d24ae, 0xb7108ae0, 0x165dc5db, 0xfa225fbf, 0x2dce2c4c, 0xd216c081, +- 0x0b61e0ff, 0x243c773f, 0x84087cb1, 0xe420db1f, 0x77c841bd, 0x6359d603, +- 0xe62f294a, 0x82c6f475, 0xa528c73d, 0x6bcf13af, 0x254d1f8e, 0xee062f39, +- 0xb8071667, 0x65f4319f, 0xe31b89c4, 0xa49bf861, 0x0b2eeaef, 0xf708f7d0, +- 0x5f733f09, 0xe919fa0b, 0xbc1fbb46, 0xc5e1892d, 0x8de9c1d7, 0xed758b8d, +- 0x0e4df3d1, 0x890e5f9e, 0x11cf36bc, 0x308aafad, 0x7ae31524, 0xe9d9758b, +- 0x99f56f67, 0x12deff69, 0xf5d3dd89, 0x3cd3e3ea, 0x9c38f471, 0xdd7c8b57, +- 0xf3a52fe8, 0xd01f9c2d, 0xeb23939a, 0x9e0e9df1, 0x94cd577f, 0x88ff247d, +- 0x696965fa, 0x65fadc6e, 0xbfe703a6, 0xe76ebd9d, 0xc5fac8d4, 0x709f27b5, +- 0x1facbdf8, 0x7f929455, 0x64fee168, 0x4dd71ca0, 0x581c7ca3, 0xb16deb7e, +- 0xf0cea9f8, 0xef288e22, 0x427087ba, 0xdd25d9f6, 0xfcc1384d, 0xcd126eff, +- 0x437aba32, 0x627597fe, 0x97e5c63c, 0xc303f82d, 0x9c09f1dd, 0xa8db946f, +- 0x5180f578, 0xc17dd407, 0x79e34df3, 0xeac4399d, 0x892eba81, 0xc8fdb6e1, +- 0xa45c9cb5, 0x8ffbb077, 0xfdb06b39, 0xa38f0707, 0x1f02f3ed, 0x572077d1, +- 0xf371ad5b, 0x2dbf61ca, 0x5276616d, 0x593284a7, 0xf31071de, 0x3f5819bb, +- 0xd58cfa9c, 0x1247ed0f, 0xf6b9d356, 0x38cf5ac0, 0xd4f42bed, 0x3f2c8d00, +- 0xac2d846d, 0x3225fca5, 0xf1a0db9f, 0x131e4aef, 0x4ffa8ef1, 0xc31fae21, +- 0x8d2b5fb9, 0x5b7c17e7, 0xfa374b67, 0xd4afc303, 0x1757bc0a, 0x294ad9ef, +- 0x539e6c57, 0x3308ec2b, 0x62df1678, 0x0e9d9bf3, 0x9c08bf91, 0x644a9c36, +- 0x71e0eaf9, 0x5d33a359, 0x474feb94, 0x7986fe53, 0x739c5e7a, 0x2e04cfcc, +- 0x65fdc5fb, 0xe4ccb943, 0x5bc99a66, 0xf9421f23, 0x9e0cbc31, 0xbe53f64c, +- 0x8df8745f, 0xf57fd23c, 0x69179c5e, 0x0f3fa877, 0xcfc7aefb, 0x481b5c70, +- 0xc6327762, 0x6fc3bef8, 0x359c264c, 0x9f32fa9c, 0xbe5ae5eb, 0x7d39b8ea, +- 0xbc492b46, 0xbc49358e, 0x8730ed8e, 0xf27ea952, 0xfedd941e, 0x7a1a7d08, +- 0x476117fe, 0xfaf5e660, 0xface871e, 0x171c5d0d, 0xe2de6ea6, 0x79f82bfe, +- 0xbff6c28d, 0xe21e7c61, 0x1ae22be5, 0x7ba85d10, 0xb86612af, 0x31349ef3, +- 0x8727bc7a, 0xbbe32332, 0x451dd68f, 0x06a1af7e, 0x02491f98, 0xc7e8b3f2, +- 0xdef7547c, 0xe5812e77, 0x76f2c74b, 0x95bf3054, 0xadf90327, 0x4d554e27, +- 0xf90f8c8a, 0x27e7990e, 0xca2c8724, 0xfbe59e56, 0xc234390b, 0x73ef5172, +- 0xce92bf1c, 0x527580e5, 0x6c71d937, 0xf9ab749d, 0x05b7436e, 0x7bd81ce8, +- 0x13bec2c1, 0x81bddab9, 0x85f0e1d5, 0x19f91267, 0xa76e78f0, 0x1bc389f6, +- 0xabf3d126, 0xcede3787, 0xc6a52fce, 0x23e5f8a8, 0x2f28b2fa, 0xe3a9933a, +- 0x99f76d78, 0xc2ad604c, 0x647ea7e8, 0xc1d77afc, 0x4f60d7e3, 0x90a73b02, +- 0x00e38f20, 0x5bad4426, 0xcb16fed3, 0x653a6a23, 0x8c1e2457, 0xf0703ef7, +- 0xc223eafc, 0x9013f101, 0x6dcf4c5c, 0x7ce9adbc, 0xad53d19d, 0x1b1e9804, +- 0xde3e145a, 0x2fcc5bca, 0xb03e1d19, 0x36fe88fb, 0xf7e6bf3a, 0x02bcec1a, +- 0x18fb3267, 0x6ff4282a, 0xe8affec7, 0xc875ca11, 0xdcfe026f, 0x9b83eec2, +- 0x11a7c77a, 0x5f7a87ee, 0x178bc477, 0x083dd0ef, 0x97227a92, 0xe3b117d7, +- 0x39f8327b, 0xdcf389c2, 0xeb989d8f, 0x9fcf1499, 0xaf1e60f9, 0xef2125b7, +- 0xbc516576, 0x3217b4fb, 0xdecf39f8, 0xe209df6c, 0x812dbfa7, 0xdbf5a7dd, +- 0xfce8b9f8, 0xe9cdc7fd, 0xa5db7714, 0xaa3f1469, 0x405fde0b, 0x2fd8f8f7, +- 0x782b7e63, 0xd61bdd90, 0x742db4b6, 0x2ea3a1c5, 0xc5f1fb83, 0xc8fbfc6a, +- 0x7bf8c5db, 0xf510cce0, 0xee130ed1, 0xa2855ef7, 0x8679676d, 0xf436f92b, +- 0xff0bf7bf, 0x8512c0fb, 0x81ef25e5, 0x077bf0ae, 0x54b03f7e, 0x85fbd1f8, +- 0x1e5a5e5f, 0xed9727ed, 0x7ee9a786, 0xbe2b9960, 0xac487e1f, 0x6c5c1cbf, +- 0x451607dd, 0xe4487bcf, 0xa3b90f77, 0x10ca4f9f, 0xf21f37fe, 0x3006ffc9, +- 0xebbe901e, 0x5c58130b, 0xc4ca6fbd, 0xb1c179b8, 0xfdeec0cd, 0xbffdc57b, +- 0xc286f7a1, 0x3abc59f7, 0x35fe73d1, 0x09dbf31b, 0x5ee71790, 0x195e246b, +- 0xd720fef6, 0xa82fb8b7, 0x868d38d5, 0xe560afde, 0x652e7913, 0x90b17de8, +- 0x04def57f, 0xaf9ef22d, 0xea8b6036, 0xd36f3b7b, 0xf9f8462e, 0xf46f816a, +- 0x73c8e6fd, 0x67b29d8a, 0x0bdd0671, 0x3e59fb58, 0xb8b01c8d, 0x08e57c85, +- 0x112c72be, 0x6dcae8f1, 0x77e2e26b, 0x8fbb3f84, 0x6b077dfb, 0xcc2d0a7b, +- 0x92036aee, 0x6aa3ee9f, 0xac9ebc83, 0xc9ebc05d, 0x579e76fc, 0xf25078ae, +- 0xbee624bb, 0x067d134e, 0x795a967e, 0x327036fc, 0x1f812f2c, 0x7e78a71a, +- 0xb1e788bf, 0x7d049a38, 0x779ce90b, 0xd2724ba5, 0x78b171f7, 0xea6abe5a, +- 0x6f9ee45b, 0x9bc41f86, 0x16327e42, 0xf0cf3f47, 0x1a632b7c, 0x4c570bab, +- 0x144f75c1, 0xb8439a7e, 0xdd89bba9, 0xdb7a14ec, 0x413bec9b, 0xbf66bef1, +- 0x5fdf07b8, 0x792219d8, 0xf7cb02f4, 0x5b7d6dfa, 0xcc1e79eb, 0x836bc1ee, +- 0xdefa4e09, 0xc92bb6b5, 0xf6fd4099, 0x54c9c486, 0xcec9761f, 0xb457ec24, +- 0xf2405c9f, 0xdfe328ac, 0x61a9d465, 0xb4ae6f96, 0x5e92b679, 0xa27b3897, +- 0x3a0dbfee, 0x58f3866f, 0x0902f6bf, 0xe76fe327, 0xe0c85e6f, 0xf8feaef1, +- 0x719399e7, 0xcf36e9ab, 0xf07ba26e, 0xba5557ad, 0x7e4ef326, 0x4eba6163, +- 0x6f3674f3, 0x16cf4b49, 0xe8357e3a, 0xee343b0f, 0x367f155f, 0x6f8b23cb, +- 0x86907bed, 0x50976f83, 0x73d03cde, 0xc08d44bc, 0xfa3d7f77, 0x6bfa38e7, +- 0x5bb09300, 0x69256b33, 0xb86fc8b9, 0x8fbb7b1d, 0x41b9d266, 0x316fd93f, +- 0x295267b5, 0xbdb6d62e, 0xf2913a97, 0x1ade0e8c, 0x92e95deb, 0x87303cd9, +- 0x894a1ff2, 0x4669efa4, 0x5f0095df, 0xff942007, 0xf1c894c0, 0xfb6fffa6, +- 0xae38413f, 0xeca286b5, 0x561390df, 0x47563eed, 0x7bb0b61e, 0x8927ba75, +- 0x92ea9efc, 0x2c0cf5c0, 0x674ec86e, 0x78f0bdd2, 0xf0ccc54a, 0x10cdf508, +- 0x9ee9db34, 0xeff32836, 0xff99b2cc, 0x9ff62e9e, 0xd0f60e61, 0xc53396f7, +- 0xe82ce2bd, 0x06bef363, 0x40bad661, 0x0f3b5333, 0xb72dac9c, 0x32a3ef06, +- 0x901038af, 0x4cc1ff49, 0x9592edb3, 0xf1007f7d, 0x37223df4, 0xe4325c33, +- 0x13fdd321, 0x962f5eff, 0x8f02eb9f, 0xefdc5c33, 0xdf412a50, 0x80439659, +- 0x09df77dd, 0x1def7121, 0x58d98f9f, 0xd77dd1a7, 0x893b689d, 0x367e1e4c, +- 0x23f10e7f, 0x7427e3c7, 0x2c33531f, 0x293e88d0, 0x9eba6998, 0x0c7ceb74, +- 0x375b0266, 0xe0785d75, 0xfb91b2c9, 0xdbd76742, 0x50bbe8e7, 0xdf62e5c9, +- 0xc9ad3a8d, 0x04975641, 0x7ec3fdcd, 0x39200f2c, 0x66626d73, 0xf777c8c6, +- 0x3df601e0, 0xf777ec45, 0xcce5eec4, 0x8cb4ef91, 0xfaf73fef, 0xc426eb97, +- 0xd5872ac7, 0x4a3e2329, 0xd07739ad, 0xcd39e0f9, 0x8d399893, 0x996d03be, +- 0xfb3116c8, 0x53bcb1a7, 0x5c092ae0, 0xe4bfc4e5, 0x07fbbe32, 0x389f1786, +- 0x8265f6bf, 0x9252ae9f, 0x91587c30, 0x43881dae, 0x5fa19dab, 0xe159efa7, +- 0xe53af9a9, 0x566d5bb7, 0x166fe527, 0x846937a2, 0xff2b26de, 0x7ef8c1ee, +- 0x4d8e562b, 0x663e8328, 0xcb2b4e7f, 0x628fd78b, 0x6b8f34f7, 0xb27fbf9c, +- 0xfd10a678, 0x1bcca78f, 0xd16ef945, 0xb164e62f, 0x30e51bfc, 0xe98390c7, +- 0x80e7ffc6, 0x3c91977c, 0x817fff63, 0x802a2fc1, 0x72134681, 0x48d7f834, +- 0x5c6f143f, 0xbf431fa8, 0xd9722379, 0x57f9c891, 0xf18f4be8, 0xec9d5dec, +- 0x836f9634, 0xcf05ffbf, 0x10785073, 0x00107850 ++ 0x00088b1f, 0x00000000, 0x7de5ff00, 0xd5547c0b, 0x733ef7b5, 0x9993331e, ++ 0xf20f264c, 0x04278020, 0x21842a28, 0x38880840, 0x8d069009, 0x8808889a, ++ 0x420100ca, 0xb9113248, 0x9db57a5e, 0x5688a189, 0x8db4b46d, 0x04076c5e, ++ 0xc075168d, 0x740d0340, 0x6af10530, 0xad282a35, 0xf0c5068f, 0xd0f09210, ++ 0x77adad8b, 0x49f7b5af, 0x90999ce6, 0xbf77eda8, 0x9fc5f7ef, 0xfb3ecdbf, ++ 0x5ed7bd9c, 0x5ed6bfeb, 0x48c7ed7b, 0xba6200ca, 0xe1af908c, 0x0e421aef, ++ 0x0190848a, 0x3e67693d, 0xe213c74d, 0xb60736cf, 0xf6848408, 0x249dadfe, ++ 0x71a67211, 0x20ce6ab6, 0x7358df64, 0x7e5a1ae8, 0x30179026, 0x3b69f2d3, ++ 0x9a243b0e, 0x4a21dcaf, 0x6bda6e50, 0x363befc5, 0x7bc80108, 0x5c8fadcd, ++ 0x3b5df345, 0x5689b244, 0x1376424d, 0xdda42649, 0x1a9fd842, 0x56a5f98b, ++ 0xb8dcad96, 0xaf680eef, 0xac4cc9ac, 0x46f6fbf4, 0x95f90dd1, 0xa100845b, ++ 0xbaee55ed, 0xeb48195f, 0x8210165b, 0xb7e69556, 0xb1a8aa3c, 0xf7b7dc84, ++ 0x9d9b477d, 0x0b3e5390, 0x47ec1551, 0x21147059, 0x056d81e5, 0xe5f7e903, ++ 0x8997055b, 0xe1be5fd6, 0x57d0076c, 0x170f28de, 0x1a2b7d69, 0xc91d446c, ++ 0x409afeda, 0x601f2d7b, 0x61e43b7b, 0x57d95ed0, 0x84442977, 0xf86eca7e, ++ 0x01d292ae, 0x3ddad6fd, 0xf6c7abe5, 0x3e567e34, 0xefa3db4b, 0xb820bd55, ++ 0x26558ba0, 0x3a3a01e2, 0x3ee75976, 0xd5fe8765, 0xc3622328, 0x2770b1fb, ++ 0xb03ca3f4, 0x03b02951, 0xa5951b7d, 0x5bea7aa3, 0x7a9ff0d1, 0x5333eafa, ++ 0xc6e5613c, 0xb28f94f4, 0xbe4f4474, 0x9077109c, 0x80a44bd6, 0xe7ba3252, ++ 0x3c4207f9, 0x7ea01321, 0x9e96a891, 0x11e4a9fa, 0xf4c3fe07, 0xfe0f949f, ++ 0x2d81b13d, 0x5b723d19, 0xf59904e9, 0x939cedc8, 0xcaea51cb, 0x4b5faf09, ++ 0x5079011f, 0x4e7cea7a, 0xa5f31f4c, 0xa7deba62, 0xe17edf22, 0xbd69891b, ++ 0x9fcf85cf, 0xba62e5f0, 0xf4c6e7c1, 0x4c42be57, 0x7c62be03, 0x2e6f936f, ++ 0x1e7d9ba6, 0xafb4fe7c, 0x5f06d30c, 0xce7f3e35, 0xadd31ab7, 0x7f3e3f3e, ++ 0xd30eb7c1, 0xd30eafa0, 0x9a2f20ed, 0xf802fa36, 0x035f4ede, 0x20be4da6, ++ 0x6beddf3e, 0xce21f4c2, 0x9214c747, 0x383e5127, 0xc549c4dc, 0xdc8a124e, ++ 0x27cd3279, 0xf27cb314, 0x853cfe6d, 0x343d93e6, 0xb032f94f, 0xa6679422, ++ 0xacd581f9, 0x24bdc87c, 0x43f342df, 0xe87cacfc, 0x2b7cee43, 0x63ad0fcd, ++ 0xf83623e5, 0x7e6863f3, 0x5f958044, 0x6f9435b1, 0x822bf9a3, 0x99ab3cac, ++ 0x7cd3b34c, 0xb3e58856, 0x8b4f775f, 0x56ecf9a5, 0xc0f9cf96, 0xf341cd3f, ++ 0xfbec6d39, 0xa203a7c9, 0xc3948f6a, 0x4c5d5976, 0xf836aca8, 0x49a5ba67, ++ 0x77a8af34, 0x8fe51711, 0x94b726ff, 0xbb21f946, 0x9fe43cb1, 0x8a8de58f, ++ 0xf6dfcb1b, 0xa77e6297, 0x63f2c1ec, 0x57964afe, 0x85fe583c, 0x37cc6eff, ++ 0xb72c7ec9, 0x5e58f8d4, 0xc0f963f1, 0xff58759a, 0xe580396e, 0xc51e6aa3, ++ 0x004addf2, 0xf35b1fcb, 0xcd3a7b84, 0x5f9e0ad7, 0x5a691e00, 0x4f013246, ++ 0x8a62d4c1, 0x9902b5a7, 0x11fdf80b, 0x72e28e80, 0x7a829a6d, 0x398ffdb8, ++ 0xe2fe814f, 0x97e4125f, 0x0660fd3e, 0xac6bff7e, 0x88f5a647, 0xfd93d77d, ++ 0x9eaeae46, 0xb4ca37ec, 0xbde01a7a, 0xeaff6b5a, 0x64c6fed9, 0x946f3d3d, ++ 0x436cf56b, 0xd7fb627a, 0xa737ecaf, 0xb379e9e8, 0x3767ab42, 0x3fdf13d2, ++ 0xeb0f1a7a, 0xb878d3f9, 0x482d3f9b, 0xd1fe80cf, 0x3d5dfe33, 0xdbbfc67f, ++ 0xb1d79fcd, 0xd5feb49e, 0x9eaef8d3, 0x76ef8d3f, 0xf630e7f3, 0xfaff706b, ++ 0x3d3dfe35, 0xd7bfc67f, 0x908f9fcd, 0xd5fe8c9e, 0x3d43f3b3, 0xd87e767f, ++ 0x58e39fcd, 0xf5fef0cf, 0x3d23e72b, 0xea3e727f, 0xd6174fe6, 0xeaff7973, ++ 0x9e91f9d9, 0xea3f3b3f, 0x5897cfe6, 0xf5fee8cf, 0x7a2fe72b, 0xa5fce4fe, ++ 0x01263f9b, 0x3fdb19ea, 0xd53e9a7a, 0xd3e9a7f3, 0xb0d8fe6e, 0xa3fd099e, ++ 0xcf5db727, 0x6ef6dc9f, 0x200924fe, 0xabfd49f7, 0xcf5da9a7, 0x6ef6a69f, ++ 0x7ac60cfe, 0xbf5feeae, 0xf9eb8f72, 0x9bbc7b93, 0x5fb0233f, 0x81ef5479, ++ 0x89eb421e, 0xdd9ebded, 0xd9fcf467, 0x3f9ba67d, 0x199eb063, 0xbecc9eb4, ++ 0xa1dc99eb, 0x8ee4cfe7, 0x62e4fe6e, 0x57fb333d, 0x3d0eeecf, 0x7477767f, ++ 0xf90f27f3, 0xfaff7d73, 0xcf53b935, 0x8c9dc99f, 0x550ee33f, 0x72d0734f, ++ 0x44ba163a, 0xa755c9fa, 0xe6816edd, 0x8bcb2745, 0xbf01174e, 0x0dfcd444, ++ 0xe916ead2, 0xf1adf6f7, 0x70920fd9, 0x04bf23bf, 0xbd4b15fa, 0x23bf70b1, ++ 0xe746372e, 0x13bbc4e7, 0xc2c4f974, 0x07f7ba81, 0x95d50f14, 0x42bdcca7, ++ 0xc9e69e57, 0xcbd3e5d6, 0x1fdeeb26, 0xcbaf9d5c, 0x5afab65f, 0xfe19fbdd, ++ 0xccf9749b, 0xdeeab775, 0x48b75e1f, 0xfabdfe57, 0xe5f95d72, 0xfcba9581, ++ 0xa1ff0d95, 0xf0747f7b, 0x98f95d3e, 0xe57507a6, 0xe98f4363, 0x3e0ee3f2, ++ 0x427f7ba1, 0xf95d26eb, 0xe9cf23c4, 0x6db527ca, 0x3aafe5d7, 0xe7e0dbb1, ++ 0x57ed9dd9, 0xb808bcf2, 0x4fefcc27, 0x0bdfd053, 0x57982ac5, 0x8fd1da06, ++ 0x54bb17df, 0xabe5463d, 0x4d58bcbc, 0x9905f2a2, 0xe7ae3a12, 0x5efb2c0d, ++ 0xf77e7d1b, 0x9cf7cf64, 0x8addf9f4, 0x8a338c67, 0x20f14a7f, 0x55485490, ++ 0xf2c6a413, 0xc78665fb, 0x46aff4fc, 0x7bdfa51c, 0xe2235d4d, 0xcc453e69, ++ 0xfcbc07ab, 0x4e21304a, 0x0d524463, 0x0998c5ef, 0xcfee0bce, 0x1fca79c8, ++ 0x8375d786, 0x3d0a1ea9, 0x3d93aef5, 0x6c67e0a9, 0x0fcb79aa, 0xc1dac87e, ++ 0x09035fb4, 0x2b784a79, 0xbf461fe4, 0xd534bc1f, 0x2b33eb43, 0x6f0f4fd4, ++ 0x8feda15f, 0xa01bf6c2, 0x697a17fd, 0x57343cdf, 0x4865bed7, 0x8b7dae99, ++ 0x5277db42, 0x4fe6a07f, 0x842a7dbc, 0x24bc84c9, 0x37db09fc, 0xf6c3290f, ++ 0x7ce857ef, 0x98fdbc25, 0x409bf6ee, 0xfb42f77f, 0x7ff4a213, 0xff7d64e8, ++ 0xfbeb9487, 0xbffeb0af, 0xb794735c, 0x6ffd831f, 0xfeb28e11, 0xfd67290f, ++ 0xbb7ab337, 0xf37477db, 0xfff420ff, 0x9ffade8d, 0xffdf4539, 0xfdf42acb, ++ 0xdff6b337, 0xdbc939ae, 0xeffb63b7, 0xff592708, 0xf6c0ab2f, 0x05c7b315, ++ 0x63d251f8, 0x7db403aa, 0xa61a8832, 0x6d0b8014, 0x0991d207, 0x3c84d414, ++ 0x3a450c2c, 0x78618eee, 0xe28622fb, 0x1f8ded0d, 0xb500939f, 0xde74396c, ++ 0x62beb1c5, 0x76029e6b, 0x7ce9cb09, 0xb5270965, 0x7c4449b4, 0xc0e6f593, ++ 0x476f4a70, 0x7c87e893, 0x03abfae9, 0x66bcff60, 0xbe18a0b2, 0x9e084893, ++ 0xd1f3fa7f, 0x65fbc29b, 0xc9d4974c, 0xfa616ded, 0xca8f3dd6, 0x29ab2327, ++ 0x0400337d, 0x1ff27a13, 0xa11079d3, 0xe80f8bf3, 0x4850833c, 0xf6b3227e, ++ 0x25f3a23e, 0xf9d1b7c8, 0x52139412, 0xead1df83, 0xfa52a50e, 0x1ffd398b, ++ 0x3f5f4c4b, 0xf8084dbe, 0xf17e7ea9, 0x4f38b183, 0x46dab05d, 0xc743de99, ++ 0x2ea27f42, 0x07e5fb4f, 0x32ed7539, 0xc8093607, 0x55f8155f, 0xc849aa82, ++ 0x94e975e2, 0xbfef3dd7, 0x469ec547, 0x710b7f59, 0xfdf429cb, 0x830957db, ++ 0xd9ddb49d, 0x1b36736e, 0x26e9dc27, 0x6e926bd4, 0xa6e425ca, 0xad32b1c6, ++ 0xe5b89481, 0xdac2db8f, 0xcfa8559d, 0xe7d62ecf, 0x6cb7643b, 0x947574a2, ++ 0xad236408, 0x7d5cce77, 0xdd8ed6b9, 0xcce4c094, 0x664e2bdb, 0x3481cdf4, ++ 0x513b1e1b, 0xec9d73ce, 0xef1e8d5b, 0x614e9962, 0x01fe9e41, 0x4feae404, ++ 0x756ef7c2, 0xe91b7eb2, 0xdc5b2b9d, 0x739fb4c5, 0xc0018a17, 0x3ffe91b7, ++ 0x4db9b5ef, 0xf75d3459, 0x22989933, 0x7fa463fb, 0x9fd8c79e, 0xf0e30ca0, ++ 0x73e332fc, 0x2e769b86, 0x1f018fff, 0xf80e3d34, 0xe31ff4a0, 0xabb1e8f8, ++ 0xb35e1f0c, 0x43c006e7, 0x4122e3d7, 0xdcbc72b9, 0xa4b2f1c2, 0x420b8f4e, ++ 0x71c8323c, 0xfb215cd9, 0xcc1c30c1, 0x565838e1, 0xedcdc7af, 0x45a72fc4, ++ 0xf5bccb91, 0xaa9c7f1b, 0x43eff646, 0x0ff99b8e, 0x44fe43ed, 0xe9c993f6, ++ 0xdba72e0e, 0xb7e5f5ab, 0xcedeb970, 0xfeb73ae5, 0x7cd4fdd1, 0x80d55b90, ++ 0xbdeefa0c, 0x9b679347, 0x2e1e9e4e, 0x779d234f, 0xf1de7970, 0x234f2603, ++ 0x9e5c6dbd, 0x65e7f56d, 0x5e923432, 0x560b7d23, 0x0147f447, 0x47f42e79, ++ 0x29b7a797, 0xd858f12f, 0xcce0caf3, 0x7a6163c4, 0x44a1a2b6, 0x981e5f97, ++ 0x597f7ba7, 0xf95d42fd, 0xbae5ba92, 0xeeebc5f2, 0xfa17e5d4, 0x7f7ba07f, ++ 0x5d1aeac1, 0x0fd5edf9, 0x97e7cae8, 0xcfcbaa3d, 0x7bae3cf3, 0x8ddcce7f, ++ 0xc5d9f2ba, 0x67caeacf, 0xe5d36e15, 0x74bbdc4b, 0x5ef69bef, 0xf3e0237e, ++ 0x0122c3f5, 0xd773e27f, 0x7e0b8c71, 0xf05d92ee, 0x8a9f31ce, 0x8df76eb8, ++ 0xcf84f4c4, 0xe53fb885, 0xa3b4c5cb, 0xe30ec5a9, 0x97171d04, 0xe66a7892, ++ 0xacd4374d, 0x34e3041b, 0xb374f1c1, 0xff1ae6e9, 0x637e4214, 0x45df9152, ++ 0x8d090af5, 0xc1804423, 0x25d1d386, 0xf5b79586, 0x0d4f5e51, 0x7964627f, ++ 0xe7f45b51, 0x5e16c7de, 0x77128ce6, 0x9253d1e9, 0x274f7e0e, 0xe58dbbf7, ++ 0x0e290215, 0x7dc84e7f, 0xf967d7a8, 0x30a15bb8, 0x9ed8affd, 0x901c4f96, ++ 0xbea88d0f, 0x0a417b54, 0x49c014f2, 0x978f4ea6, 0xb3a95fd5, 0xb2a204ef, ++ 0xe36f0003, 0x3457cf74, 0xeefba55c, 0xe9113ef4, 0x315b02ae, 0xe2c58609, ++ 0x87604cd7, 0x66432d43, 0xdd3a068d, 0x9c609baf, 0x7e801a6a, 0x615f69e1, ++ 0xe40931e2, 0x09e98c57, 0xdb4c5cdf, 0x8f4c1e7d, 0xfd30caf9, 0x698d57d8, ++ 0xa6356f9b, 0x98fcf91f, 0x875be07e, 0x757d9fe9, 0xd5f11e98, 0x2faefa63, ++ 0x5f21e980, 0xfb6fa603, 0xfab69882, 0xf0ed309a, 0xf4d531b9, 0x9ddc2fae, ++ 0x29f0e3e0, 0x9c145fc0, 0xaab7dc75, 0x1e94dd66, 0xdd339d9c, 0xd41fe353, ++ 0x7aa2e7c3, 0xb243c733, 0x425f0f0e, 0xd67119b0, 0xccbd7947, 0xf7dbd871, ++ 0x9bbdcbd1, 0x9b7835fe, 0xe67e6260, 0x0f5bc5b7, 0x780dd29e, 0x4f0becca, ++ 0x3d09c403, 0x72609a78, 0xe387bf32, 0x8fd027e9, 0x7c8af328, 0x84064270, ++ 0x1b6e6bf9, 0xf5f3538b, 0xb2a9ea04, 0xbb6f3538, 0x8adbbe96, 0x24605d7e, ++ 0x46e71b8c, 0xc40475fe, 0x311dcfe1, 0xef5f49d3, 0xa4e233fd, 0x71bbbe77, ++ 0x4034b37e, 0x9171af07, 0xc618d6e5, 0x1489ab57, 0x3dae3a12, 0xd769fc30, ++ 0x979851a2, 0x1f7c0248, 0x46c49570, 0xcafa97a9, 0xf8bedfc0, 0x45fb1b5a, ++ 0xfed7d416, 0x2072dfc4, 0xfe62609d, 0x888b4c72, 0x3d093b7e, 0x76fe02e5, ++ 0x57664b8f, 0xbbb7c42a, 0xf44e2b86, 0x3d76021b, 0x9f34fcff, 0x07bfc3d3, ++ 0x715a8f28, 0x454baddc, 0x62fb0dfe, 0xf83f5a44, 0xef7d97d7, 0x028b9f8b, ++ 0xfc25ff03, 0xf63ecbec, 0x5b891765, 0xf689a17d, 0xe8ef73bf, 0xb05507ec, ++ 0x3cd94383, 0x6b7e17ad, 0x7a4652eb, 0x710df87e, 0xe1ac99dc, 0xa10875b8, ++ 0xf5c47ced, 0xf7e35ce5, 0xb42e40e2, 0x741f9c1e, 0x7e7ee0ed, 0x933d721f, ++ 0x6bcfafa1, 0x214e2fac, 0x6eda18c2, 0x3890a2ac, 0xcf45aa42, 0x6fce22c3, ++ 0x887e6d5c, 0xb9b5ec1b, 0x3798556a, 0xa4237a9e, 0xf8fa8d42, 0x4f83b9c2, ++ 0xb61e6039, 0x3ce4d532, 0x5a8e4516, 0x70cc195a, 0x2be7c3da, 0xb9fcfa4d, ++ 0x8830a13a, 0xee3539f3, 0xce30d1e6, 0x86c79d38, 0xc54fdd81, 0x6567ab54, ++ 0x463ce2aa, 0x86a9eeed, 0xff3638cc, 0xb27b300b, 0xcded1e35, 0xdf059f29, ++ 0xd3d367ff, 0x3d1a3d5b, 0x4f923484, 0x69cf602c, 0xefef6659, 0xd20faaf7, ++ 0x9be20505, 0x02fe59a4, 0xfa569be6, 0xa143d7ff, 0x5af3095e, 0xe8a0debd, ++ 0xe7818f37, 0xd1ed755b, 0xed6d54ef, 0x5debbe15, 0xaed224ef, 0xefca9ee1, ++ 0xbc3ebe15, 0xd4eac1a2, 0xbaf1b1fb, 0xcd29b7bc, 0xe16bf3a9, 0x57b8e01f, ++ 0xafe0120b, 0x53afc382, 0x3c03afb2, 0x21e0826d, 0xf6045fcc, 0x4da5a55e, ++ 0x2ea8a8f1, 0x45cf80ad, 0xd5fe1ab9, 0x3b53ef39, 0x9935f275, 0xaf919e80, ++ 0x3d395528, 0x9e91d1f5, 0x317e6898, 0x5c6a2dcf, 0xd6e30451, 0x3f9b1349, ++ 0x07629294, 0x48cb8fcc, 0x53c40e5d, 0x215310cf, 0xf219e7e8, 0x985c63b6, ++ 0x15159e3e, 0x75e2e7ec, 0xce9e3f7a, 0x65f975ef, 0x52fcfaf5, 0xac325372, ++ 0x2f5d2f83, 0x76008093, 0x547e5f43, 0xcbbd6274, 0x185af548, 0x6ccbd7b7, ++ 0x24e45b3c, 0xafa53a52, 0xe64fb7f2, 0x8bf9a42c, 0xb57f1b22, 0x09e5dc75, ++ 0xe0f2fe8c, 0xcb4dc546, 0x771c693f, 0xf440b50b, 0x185ac0fb, 0x043bfcb7, ++ 0x523516d7, 0x7e94df7e, 0x3f9abd23, 0xcc9eb110, 0x106ca8e9, 0xfe2881dc, ++ 0x4c092280, 0xbbbdb8cf, 0xe2ea7242, 0x0f903920, 0x6b7c838b, 0x1d11253c, ++ 0x9e89369e, 0x8604d221, 0x09ff981f, 0xf9e29752, 0x46a7f52e, 0x34857fd4, ++ 0xff589fe0, 0x8e7f5a20, 0x7f9cfeae, 0x22c3fd2a, 0x568fcfe8, 0x9f6fe57f, ++ 0xf6a7e9df, 0x9fc5fca4, 0x271d083b, 0xc9754a4f, 0x8adf2a2e, 0x80763f2d, ++ 0x7e484f9c, 0x64f5e007, 0x440c2c40, 0x7756b719, 0x176ddbcb, 0xff06ee20, ++ 0x7a9ff5a4, 0x8f1827ee, 0xec8b62f8, 0x835a78c4, 0xfaa66439, 0xbcb8d558, ++ 0xfe616488, 0x7fdfcb28, 0x937c8456, 0xcfe57f1e, 0xf6193cfc, 0xf0a45057, ++ 0xfd0852f8, 0x9fcdaad9, 0x44f8e016, 0x8c8f50ba, 0x17fb41df, 0x2dfed013, ++ 0xcb22e254, 0x27189d29, 0x78be72f0, 0x56727f1b, 0xdabfc074, 0x7c6efe70, ++ 0xa7fb8cbf, 0xa4d8a5cb, 0xf7fd1b76, 0xec113244, 0x120fc6a1, 0xed69fe60, ++ 0x3accbfb3, 0xbd39e94a, 0x108735f9, 0x8f4d27c6, 0xff1705ce, 0xbbdab77a, ++ 0x7aa0edbd, 0x6907ee16, 0xc4da95e3, 0x9666eafd, 0xc721c856, 0x560ed455, ++ 0x7e5d946c, 0xf9e2b8fa, 0x027e9ea7, 0x327f98e2, 0xfad386bb, 0xffbf3c57, ++ 0xbf34c9dd, 0x549c9b62, 0x1761bac4, 0xe2e47b92, 0xceafffa5, 0xf94391ee, ++ 0x7515fb4b, 0x6f7e7b34, 0x563c8f42, 0x90a7db6c, 0x98fc91d1, 0xb4a7dc16, ++ 0x25c8a3d9, 0xfc00b478, 0xff67da84, 0xe2f8815b, 0x4902bdc9, 0xcfc288c9, ++ 0x0fd1fb8d, 0x1ca13e00, 0xe5ba9cb9, 0x4bdf7866, 0x5af602e5, 0xfcb19393, ++ 0xa04f6e3a, 0xe214753e, 0xb4dd85f9, 0x9b3fb2fd, 0xb2ffd05d, 0x4072ee17, ++ 0xd54b8e3f, 0xfe4fd70c, 0xdb4dd938, 0xc9fd932d, 0xf3d94c4e, 0x1bfd5fb2, ++ 0x5bd96de2, 0xf18c96ff, 0x334ee224, 0x4fe3d8e1, 0xd92dfe83, 0xb7fb1b30, ++ 0x77107894, 0xc58a4f65, 0x973eff60, 0x28b6e148, 0xf5c1d17a, 0xea26f8e2, ++ 0x1dfed188, 0xec23f987, 0xc45b79a7, 0xdc84557d, 0xffff4049, 0x7a85f78d, ++ 0xdcff9808, 0x5fb4e4c2, 0xa2bd7132, 0x5e3866de, 0x0adfdf37, 0xd83539f2, ++ 0x2ceb029d, 0x39f9225e, 0x69af843f, 0x335be2bd, 0x887c9852, 0xeff0e52a, ++ 0x0d3f38e8, 0xadfbc39e, 0xa59adbb2, 0x9d7c8efb, 0x2afed3d1, 0x3ba53ede, ++ 0xe3e7c606, 0xd5fdd1c9, 0xf7a6b281, 0xc30e9c74, 0x337e9857, 0x00fcdf7d, ++ 0xdf4d6fd3, 0x50852503, 0xd310e17e, 0xc60ef81f, 0x28574a3f, 0xddf7cb05, ++ 0xa03da02c, 0x7a68e6f3, 0x7ae659bd, 0x70d72fad, 0x8496e942, 0x40bc30b8, ++ 0x7fc809fd, 0xba595f5c, 0x66177e9e, 0x9ed0bd2f, 0x4d3eb223, 0xfd71976f, ++ 0x7ffa093f, 0x93fe8f65, 0x7bef4c0d, 0x2cfc9ff7, 0x9e07236e, 0x95f4027e, ++ 0x055fa7ea, 0xa18b957d, 0x6d6d9fdf, 0xaa56f779, 0x35059fa7, 0x4fdbd53d, ++ 0x6d969ea3, 0xe9a2409f, 0x177667e9, 0xf4a7aa89, 0xb53d5479, 0xff8e21b7, ++ 0x8d4fd94f, 0x9eb2f17f, 0xec3d9a7f, 0x7b468f8d, 0x22a482f8, 0x90f68d3f, ++ 0x39221dfe, 0x70d3f891, 0xfcade1a7, 0x81979537, 0xa5c6e9dd, 0x5c6ebb86, ++ 0x888bb86a, 0x67f8eadf, 0x621f7f2c, 0xf9ae944d, 0x30a9fa96, 0x1174b08f, ++ 0xdde5779c, 0xa9bae22c, 0xbd4102e5, 0xee3227cf, 0x54cf7c1b, 0xd0fc013d, ++ 0xe5bb7fa9, 0xde94ddcc, 0xb32fc4f9, 0x193af975, 0xbeaffafd, 0xed0a7afe, ++ 0xbf9cadcf, 0xafbb29f3, 0x2b98f2a7, 0x4a18a109, 0xf8893ce7, 0x3e2012e3, ++ 0xc38f902b, 0xa65f98e8, 0xd4dfc3cf, 0xfa7a9ee4, 0xce9bff7a, 0xfa6dbe43, ++ 0x5dad8f96, 0x30e903bd, 0xc70a5e6c, 0x95c80953, 0x5e3bcff2, 0xbb450c08, ++ 0x871526d4, 0xe31eabcd, 0xe9ade776, 0xff8026b3, 0x74673792, 0x10f9c31c, ++ 0xb97adf9c, 0x57e73afd, 0x9faec0e3, 0xf9c4ce6b, 0x8b83b9eb, 0x9beda363, ++ 0xdb38e16c, 0x3a55d7cf, 0x489d42ed, 0xba49df71, 0xdbf17fd0, 0x944b64ad, ++ 0xca1fbf75, 0xc50ebe26, 0x44ff46e5, 0x1cb9b72a, 0xa7e8f387, 0x7261d971, ++ 0x93faf9bb, 0x0e522392, 0xd871f7f0, 0xf2bbeb3c, 0xfc0d7017, 0x15b6b16d, ++ 0xcff14714, 0x37f9ca7f, 0x712fe5f5, 0xe6f4eaff, 0x38f8093c, 0xe2ea2edd, ++ 0xfa6bf71c, 0x028c8a3a, 0xbcbea6ba, 0x1409e1fc, 0xa283dec7, 0x7aabf60b, ++ 0x9e2acf9b, 0x235df328, 0xf07ea13f, 0x4ecbf723, 0xb961d7e4, 0xf5f00978, ++ 0x812b6cf0, 0x1477cb75, 0x3a346557, 0x3c599867, 0xfe291e64, 0x7ff0bc7c, ++ 0xe6f37f1f, 0x29f286c4, 0xd9d9ce3f, 0xfc48e07e, 0xe73fbd31, 0x02350214, ++ 0xf96450e0, 0x71002124, 0x79e202b2, 0xfa808a78, 0xfdb84d7e, 0x792a6bca, ++ 0x54d5f61e, 0x134e0b35, 0xda92af2d, 0xb7b1c014, 0xfe049b69, 0x712a75f9, ++ 0xaa41bc63, 0x58737d1e, 0x2cbf6b5c, 0xfe5abf21, 0xc0edeb7a, 0x9b37f3df, ++ 0x1ee5d009, 0xe301d675, 0x71e6f9fe, 0xf5bd07a8, 0x323e8feb, 0xf504ba75, ++ 0x1187c410, 0x3649050f, 0x34f67e5d, 0xe545c832, 0x76dcd536, 0xfc8a2b97, ++ 0x670c2996, 0x966fb6fd, 0xdbeccfff, 0x18df6a14, 0xfb70e5ae, 0xb0894636, ++ 0xecd1296f, 0x351acadb, 0x72b17005, 0xc80a664f, 0x4babe575, 0x6fb34406, ++ 0xfcd8f8af, 0x0fbe55fd, 0xb51073bb, 0xecc2636f, 0xdf6a20db, 0xd36dc4a2, ++ 0xecffcd14, 0xfe59bec3, 0x15eff477, 0xfa516fb0, 0xdbd14a3b, 0x1ae6c2b7, ++ 0x83856fb4, 0xa87edd44, 0xe7cf854c, 0x0b6fb57a, 0xf31b3e7f, 0x0516cbb2, ++ 0xb057c03f, 0x3b72af6f, 0x9d80ed07, 0xb138a45b, 0xb9dafefd, 0xb9dafe92, ++ 0x6b3e25ff, 0x60e56e76, 0x12239e76, 0xadcecc87, 0x6e7660cc, 0xe7661ee5, ++ 0x76670e56, 0xf2df68ce, 0xfb1bec23, 0xfd246abe, 0x198be71e, 0x968dbcbf, ++ 0x5d95cd17, 0x917efa16, 0xa85f9daa, 0xef6e109e, 0xf2122916, 0xb9dec239, ++ 0x9039e2ce, 0x9bddecbe, 0xa186ef60, 0x7a061b1d, 0xb5c7c464, 0xfdba6cc3, ++ 0x6cbf8772, 0xa08bcdff, 0x71147f2f, 0x899efd9e, 0x7ef68bcd, 0xf40e3ed9, ++ 0xe7a7176e, 0xb3c98561, 0x7b47e7c3, 0xd3146d3a, 0x3183caf7, 0x35544e38, ++ 0xf7bfac0a, 0xc615010a, 0xc45ebf81, 0x7bedf2f9, 0x8e797cd8, 0xfc83f199, ++ 0x5dcec8bb, 0x0c2c1650, 0x8bdcc3c3, 0x9cd718e5, 0xf80b112b, 0x5e0e0baf, ++ 0xd6fc127b, 0xa1d71705, 0x9e00bbbf, 0x6d89bec3, 0x69d36b6d, 0x172fb7bb, ++ 0xeda1de70, 0x6dd798ef, 0xec7ef52f, 0xfbe8e6fc, 0x7a72a634, 0x0423dea6, ++ 0x5f4e5f60, 0xe05e20fb, 0x6c4737fa, 0x37917e43, 0x2896d745, 0xd7bda3fa, ++ 0xe31727cd, 0xe62ae54b, 0x89f37737, 0x22154df2, 0x5d2544f9, 0x87b930b4, ++ 0xa0efb72f, 0xbdea4dfd, 0x22df1abf, 0x71b8e1f7, 0xbf80b33e, 0x341f1bd7, ++ 0x9ff4473e, 0xa9fa9df3, 0xc8c79fb8, 0x6766a08f, 0x41a324ae, 0x7933df2f, ++ 0x38009e1e, 0xe3112ffa, 0x1bccb7b6, 0xb3cf3bae, 0x7ae5f393, 0xc9e9d1cf, ++ 0x5491f02a, 0x2d6ece03, 0x993fb6db, 0x7746eff6, 0xcc843646, 0xf155ff67, ++ 0xc5a1fc40, 0x507685da, 0x99aa61c3, 0x8e33f0e1, 0x9d03c3c3, 0x69bc71d3, ++ 0x5fa89c12, 0xe39d8321, 0x94bcc8fb, 0xdebfa0cf, 0x513e3e26, 0x167e827c, ++ 0xc815e368, 0xfaf3fe85, 0x6f172666, 0xb97280b5, 0x001d7481, 0x092557be, ++ 0xaaad10ae, 0x8fdb69a0, 0x2bd5bf61, 0xf41cfa56, 0x6d704cbc, 0xa7b0ec62, ++ 0xb1c54725, 0xb8c70d14, 0xdc6c3049, 0x25ef005c, 0x3345bec0, 0x0ffb7fb6, ++ 0xfa323d98, 0xadcd5329, 0xa99e8187, 0x8d932eff, 0xff4030f0, 0xd181c30b, ++ 0x83d0898f, 0x27efb86f, 0x57efdb99, 0xe0760e40, 0xfe029777, 0xc6c43790, ++ 0x2bdcad1f, 0x6f91d3a9, 0xe89a1c9a, 0xc99e32f8, 0x8dfa9601, 0xcb51be7c, ++ 0xfde1fe03, 0xef864166, 0x24f95267, 0xa669a2d2, 0x78680f2f, 0xfc91ab37, ++ 0x5a427882, 0xfb00dd98, 0x596ebe16, 0xf216f4d5, 0xd455dae9, 0xf923533d, ++ 0xec07c9a4, 0x15f8a5e0, 0xfb4d3fa1, 0xfa9feea2, 0x6a93fab6, 0x5ecfebd6, ++ 0x636bd76b, 0x47b68e20, 0x9a42bb40, 0x83f175e3, 0x979b335c, 0x883d58b5, ++ 0x6557aef3, 0xd23526d7, 0xe5ce5cfe, 0xf095f302, 0xa0d37bf3, 0xec6eb043, ++ 0xb44f92b4, 0x38650f7e, 0x5e0f1f0b, 0x7e507ab1, 0x913fd5bd, 0x3f9bdfd7, ++ 0x0fbfe5a6, 0x45bec1ed, 0x719edf55, 0x49e2d23c, 0xba6bf57d, 0x6f8fd999, ++ 0x9dad2fdb, 0xe0eeba6f, 0x7f18ad25, 0x361fd6d3, 0xc85f9e89, 0x142e3f30, ++ 0x5d3afd24, 0xfe5fae17, 0xa71fea13, 0x887ea25c, 0x9f28851f, 0x14fad95f, ++ 0x3ccfabc6, 0xd006f477, 0x13bf159f, 0x53ea8589, 0x1258d6c7, 0x1440fb62, ++ 0x1bca13f0, 0xf3c63745, 0xacce50a5, 0x90833f30, 0x178fc65a, 0x94eed163, ++ 0x8a07376f, 0x3be5f7e8, 0xb882c93f, 0xcc7dc75b, 0xe39ff9fe, 0x65b7f478, ++ 0xb97f7ac1, 0x8df1d6c4, 0xe39bb9f2, 0xdb2ef4f3, 0x42dfb05c, 0x5aef3b03, ++ 0x9b239c1e, 0x950ce2c3, 0xb5c59966, 0x9f70d977, 0x0159ffb5, 0x7d0329f7, ++ 0xb52ce7e1, 0x9fa79ffd, 0xbcb97665, 0xb9c00e49, 0x6d86f2d9, 0x2f07101d, ++ 0xff46623f, 0x1670dbd5, 0xbda6edd7, 0x47fa3cf8, 0x175126de, 0x3f888d07, ++ 0x33218836, 0x2b1acfc4, 0xfcd00ed1, 0xa307cc51, 0x8afbe1c7, 0x7178ad93, ++ 0x653f4ecf, 0x9e978ae1, 0xd9b9e071, 0x8c0e2dd6, 0x3a5c3643, 0x6f111ffe, ++ 0xc9703e0c, 0x8e29e378, 0xf59b5f8f, 0x21a435eb, 0x9490e311, 0x28e29cbe, ++ 0xdc6e8b71, 0xaff9ff3f, 0xf4ec3d60, 0x057ecff6, 0xe3fc56f4, 0x01eeaffc, ++ 0xd5af6c7f, 0xf7b5e309, 0x9eb8c3b9, 0x8bb77da0, 0xb3c779eb, 0x4c3ae0cf, ++ 0x2ecc9fc7, 0xcf63ada8, 0x1eb021f1, 0xcbedb1d1, 0xaedb8864, 0xe70333da, ++ 0x4c76ab69, 0xe651214b, 0xb80a5a01, 0x1d63f40d, 0x96af28c8, 0x402196c6, ++ 0x6f2a19e7, 0xe3bad970, 0x164ac1c7, 0xdc79578f, 0xf5f46b78, 0x713888b6, ++ 0xaf1bace3, 0x51bbf186, 0x1fa4a976, 0x5443e2f1, 0x21fa638e, 0x680fadbf, ++ 0xfcaa3ef6, 0xa83fc0ce, 0xc833de9c, 0x25c6f3ef, 0xca027ebf, 0x8d7b131a, ++ 0xc1fa8717, 0x6f3d6d37, 0xb1fdd9b3, 0xfb66f419, 0x0f3e306f, 0x0d73a372, ++ 0xe7fcf1d2, 0x72ce2043, 0x03baee42, 0x31eccff7, 0xf2a8bee3, 0xfea1ef3d, ++ 0x0b78ec74, 0x5f08cbd7, 0xdd20eb57, 0x841d6c7f, 0x9bbce1cf, 0x999c5963, ++ 0xd0e21ff3, 0xf39f03aa, 0xb1c33378, 0x2dee8716, 0x61669cfe, 0x75b489fb, ++ 0xefcdcac6, 0xd710c42b, 0x4e417217, 0x2eb92f47, 0x09c1f1aa, 0xbe18987c, ++ 0xce3d129e, 0xc6eebddf, 0x03f205e5, 0xbd7babff, 0x4107e684, 0xbc203cfc, ++ 0x83d8a247, 0x1d6c8d8e, 0xbe8e43a6, 0x5f5b50ff, 0xf418b249, 0x75bfd034, ++ 0xffe8be95, 0x6191fca6, 0x922139b2, 0x8abfa74f, 0x5a27c76e, 0x1fb6ef84, ++ 0x588842a6, 0xfac0b7ff, 0x0551e37c, 0x38da1fe6, 0x34f7f5a6, 0x7e9f279f, ++ 0x1ef3c44e, 0x682d836b, 0xa2f68dc7, 0xa0f8b08a, 0x9c99de91, 0x3626aade, ++ 0x1ede9c4e, 0x7ad3b01b, 0x0bbcbf4e, 0xf5b55cf1, 0xf5a7e2a8, 0x4978681d, ++ 0x2fdb0b69, 0x2044e305, 0x2fd3fe8c, 0xeb62cbec, 0x6e5e6c47, 0x6f0e676c, ++ 0xbd1cdbc7, 0xb3d6ef1d, 0xf85676ba, 0xbf3b0a83, 0x4ef6e973, 0x5039ee49, ++ 0x9956a9df, 0x53fdfec0, 0xda30b141, 0x16c993fe, 0x33cb8b59, 0x25e3a1bd, ++ 0x658c779e, 0x04c51be7, 0x55ebfd05, 0xe247b9b1, 0x54552092, 0xd6d45388, ++ 0xb538fdb0, 0x82a5743f, 0x6fe36bbc, 0x3ab6f5c1, 0x499d7f03, 0x5f883cce, ++ 0x8f17a738, 0xed1ab807, 0xa4dbbc4d, 0x6c557fa3, 0xc79c0a61, 0x31fdc35f, ++ 0xfcf0b922, 0x2828e8a5, 0x4e88fe84, 0x651ad393, 0x17b6417d, 0x5f184f13, ++ 0xbcfea764, 0x9c6af924, 0xfb68f50a, 0xad2c2a68, 0xe9d0b007, 0x52c2adc6, ++ 0xef377b2e, 0xbbf62766, 0x279f2b73, 0x4cea89b8, 0x60c1fb66, 0x1edce8dc, ++ 0xe0c64597, 0xf14dc487, 0x85cfe368, 0x81f6fbad, 0x20e35a3d, 0x67aa78ee, ++ 0x98aaab94, 0xc746e709, 0xc04c845a, 0x7e37d9e9, 0x36b5eb47, 0xe87f388b, ++ 0x42fb6bb4, 0x67a0f1dd, 0xee10f236, 0x7f2803ff, 0xa743d89d, 0x81205f71, ++ 0xee7b9257, 0xda219895, 0x6e73de71, 0x88038b03, 0x4e5f8ae4, 0x12387161, ++ 0x78f9fa00, 0x79d382b2, 0xbf78520e, 0x1d73c154, 0x297d5ecb, 0x1c984427, ++ 0x5895f9c2, 0x5a5f3fa8, 0xc164756f, 0xbbf13cba, 0x4c9ce15b, 0x406faf29, ++ 0x29dcfeb1, 0xe83f3f55, 0xa7ae12e9, 0x382d2d9f, 0xd4aff608, 0x7aed14b3, ++ 0xb9fd5cca, 0x2b3ee354, 0x85f617a4, 0x427bbd51, 0x5577dc88, 0x5ae8fcd6, ++ 0xee472f98, 0x612322bf, 0x8939593f, 0x9cf9c171, 0xf2fa0d15, 0x2f3760bd, ++ 0xfb127607, 0x7d7de2a5, 0xc46db7f2, 0xbf8ca72f, 0x215d7f24, 0x2c6b7f78, ++ 0xbd9655c6, 0x93ed18ba, 0x5fcf5539, 0xafe7aaab, 0x8f91a46d, 0xbac73e7a, ++ 0xe6d37cf4, 0x39f1bd9f, 0xde7f572e, 0x8967c8d7, 0x804378f0, 0xf62221c5, ++ 0x446d35b7, 0x367c8dba, 0xc2ddb5f2, 0x5f38bdd7, 0x25b15fe9, 0xa06c9999, ++ 0xa10a4d3b, 0x28f5185e, 0xe0121edd, 0x029383df, 0x2b95f835, 0x2a7bed16, ++ 0xca508fef, 0x1e81b3be, 0x0baf4089, 0xf44e08f5, 0x91b79d81, 0x56ed9c0f, ++ 0xe427d610, 0x977b2beb, 0x7f255de7, 0x7e88ba38, 0x3bf001b5, 0x9d8af506, ++ 0x81204ddb, 0x53d00cda, 0xedc61397, 0x96a2cfa0, 0x09ff704a, 0xc1874b51, ++ 0x4c4e27bd, 0x50fbe11f, 0xdc11473a, 0x5d0c1c17, 0xf4fb0648, 0x0dd77648, ++ 0x4bbcf760, 0xc1d83148, 0x3cd8621b, 0xff4f3165, 0x5db85566, 0x35eafe9d, ++ 0xacb37df0, 0xcef0b9c2, 0xe1962de6, 0xf1126f90, 0x7c6f11fe, 0x7ed0e5dd, ++ 0xe8ccb347, 0x8604b52a, 0x8f62fc43, 0x9476ed8c, 0x95f3c14e, 0x335b7edd, ++ 0xd9d207db, 0x716389fc, 0x68ef3d98, 0x10e5d9fa, 0x14dc7acf, 0x08c9ff7d, ++ 0x5fdf89ab, 0xdfc72df3, 0xbbfec460, 0x3fb65611, 0xb4a191ee, 0xe725551f, ++ 0xf4cc38f8, 0xe72e2ae1, 0x16bd2c3f, 0x59a3bffb, 0x291c6150, 0x6ebb6f10, ++ 0xa4e7ed34, 0xc38f12c3, 0x78e4b8b0, 0xe22efefe, 0x4c7e054a, 0xa0089aba, ++ 0x44fe93cf, 0xf8d6df70, 0xaf38a5ea, 0xe2839dfa, 0x49d60b3c, 0xcec16e29, ++ 0xffa3b69d, 0xd255a13e, 0xba7e32e1, 0x99e605a7, 0xb4108f13, 0xe88f13b7, ++ 0x404973cb, 0xf4da76c4, 0xa13aafcf, 0x395be7cf, 0x19241dbe, 0x2bfebdf0, ++ 0xeceae911, 0x68fbae22, 0x03a59dbd, 0xce9bbef1, 0x976a700b, 0x85895fa6, ++ 0x59f9c6d1, 0xafca0780, 0xe38215c7, 0xed4be3cb, 0x797fbf18, 0x3065f969, ++ 0x03f17fae, 0xced165cf, 0xa5d98781, 0xcabfb638, 0xa789471d, 0x30235eb8, ++ 0x15a5d77e, 0xafafd947, 0xb5c358e1, 0xa5b4e786, 0xfb689e31, 0x32b43f12, ++ 0xe97f243f, 0x79814148, 0x00815ed9, 0xf3ee3b5f, 0x8cdcf25c, 0x0e97dc9f, ++ 0xce9b78f4, 0x696d9fa3, 0x75cfbe8e, 0xe6c1d595, 0x6bf9f77d, 0xddde3f60, ++ 0x3ec12954, 0x7aef5ef6, 0x0add579c, 0xcef85741, 0xcf10b752, 0x90b12ee1, ++ 0x96cf104d, 0x8a6ed2ea, 0x9b4fdc05, 0xfbd296b9, 0xe509b144, 0x42ecb8fc, ++ 0x8495fdfa, 0xc7817c60, 0x40dd076b, 0x479f8636, 0xef3591fe, 0xf7ad2b41, ++ 0xe513ab41, 0x0971e892, 0xefebbf40, 0xbd00edff, 0x4668bcee, 0xf3e40e39, ++ 0x2dbbed1f, 0x62634f9c, 0xff006bdc, 0xf5092ca4, 0xa871e5c3, 0x2f7089a5, ++ 0x947be501, 0x2fcd5475, 0xdb50f04d, 0xb049e946, 0x2e7ef09b, 0x4eab76e2, ++ 0xe119df6d, 0x03e985ef, 0xf6040909, 0x54f669a5, 0xb1421668, 0x2de3ff14, ++ 0x33cc10f6, 0xbf68ca12, 0x62560929, 0x4ab5f561, 0x55cfbba7, 0x8a773ee3, ++ 0xdc381ccb, 0x1b5f7044, 0xfa85a46c, 0xd9ab3b35, 0x04f135e7, 0x479acded, ++ 0xad2d40a5, 0x66d48367, 0x8649f885, 0xad87cd5b, 0x8a920944, 0x9707bde7, ++ 0x65b47d31, 0xeddf193e, 0x1f6550af, 0x41710ffb, 0x8fbaf5b4, 0x79e5f9bb, ++ 0x7595f81e, 0x7065ebb0, 0xd6565c6b, 0x05bf6b9e, 0xbb6ef3fd, 0x02b0fdc1, ++ 0xfa4eee3e, 0x0bf6c4d4, 0xfdc1ae84, 0x9a3ada76, 0x3d506ed1, 0xbd044778, ++ 0x782254fa, 0xff4dd73e, 0xdcb6d1cb, 0x3e0fd985, 0x5534e64e, 0x26efa0b7, ++ 0x3c016a8e, 0xde1af55e, 0x476111c5, 0xa9eebe26, 0xadbf7a05, 0x61e230fd, ++ 0x23ea886c, 0x1528cf97, 0x7670a9ee, 0xd5bca1e7, 0xdc77e7ca, 0x8c9524de, ++ 0x96bf414f, 0x5fc8cce3, 0xfa8daf4d, 0xd5dabd9e, 0x035ac662, 0x3b6304c8, ++ 0x43a1e844, 0xf47b04cd, 0x7dfe08ba, 0x0bc51e67, 0xd06eeba5, 0x2fcff03b, ++ 0x6e026604, 0xdf7f37d6, 0xadf1fa0a, 0xfa668fc7, 0xeafed875, 0x0e9e8a9f, ++ 0xee1fdb2b, 0xed543e00, 0x8fc7c0bb, 0x5bb9ca10, 0xc23f54ae, 0xee1a21e3, ++ 0xf4d7388d, 0xcc2e16a2, 0x71f3c4c8, 0x0a23e404, 0x99ac1441, 0x5f02706c, ++ 0xb6baff35, 0xc78d9fdb, 0x9cab3d73, 0x595abdac, 0x165dcbf3, 0xd8aaefe8, ++ 0xad4b94fc, 0xd22f7a8b, 0x79d84bf9, 0x85d4af18, 0x45ef33f3, 0xbf120485, ++ 0x689abf03, 0x7e3a39eb, 0xe144c525, 0xd1e80757, 0xfb27ff84, 0xcfec6593, ++ 0x7f4f6afd, 0xdf9e22ae, 0x90bb51b5, 0x1a7d5773, 0x943905c3, 0xbe0b8e1a, ++ 0x7e9bd95e, 0x06fd52e7, 0x9f422dd7, 0xa93c7a0d, 0x29b1ea99, 0x725d8f52, ++ 0xe75bde31, 0x7b4363da, 0x0bebd467, 0x1b5e5fbc, 0xe8b57be3, 0xf3031999, ++ 0x10d75371, 0x4a965dc0, 0xb1288b12, 0x5b224d59, 0xd44d6d5f, 0xe391238d, ++ 0xa4ed1fbb, 0x7e6a5fe6, 0x6ebdf1a5, 0x1b8f92bf, 0x68533c5a, 0xfda7f8a2, ++ 0x33c637be, 0xeb5af80f, 0x384ff364, 0xf2fe0a68, 0xdb9eac8f, 0xed1b3e80, ++ 0x6bac0c43, 0xb0650c8c, 0xa7484978, 0x97e9bd6f, 0xc13fa0cd, 0x98e38490, ++ 0xc3638e9f, 0x19e9de85, 0xe8cf1310, 0xfc0556a5, 0x84394194, 0x70455635, ++ 0x2ca0f75f, 0xa0cc8f76, 0xe3ef766c, 0xf5b0c47f, 0xd8627b98, 0x3fa5a1b8, ++ 0x05df16b2, 0xe22592fd, 0x7b7f6737, 0x885481ba, 0xe31bde1f, 0x61f813be, ++ 0x3f637429, 0x25c49dd2, 0x4ba5bc50, 0x37f60141, 0x02a85424, 0x36121b8b, ++ 0xeb4a40ee, 0xf3522f4b, 0xa74adc60, 0x20e216b6, 0x44efe0e9, 0x18fad391, ++ 0xbbc5bbf9, 0xa3ce231a, 0xfe618fac, 0xf68501f6, 0x9d88b137, 0xdb8ee947, ++ 0xbf81f250, 0x60b7b11d, 0x673e3b67, 0x78fea1eb, 0xfce367c6, 0xfd06040b, ++ 0xc7fe7892, 0x09ac910a, 0x9bf23f38, 0x05933be0, 0xe23647e7, 0x7cfd820a, ++ 0x55c58631, 0x75ae0ad7, 0xd4a9ff90, 0x76fb8165, 0x323ffc34, 0x449726e5, ++ 0x7d5c715f, 0xace60b2e, 0x039e1f54, 0x394c7579, 0xf60d6237, 0xc3086ba0, ++ 0xedd45b9b, 0xd6e4d77f, 0x66e4eb24, 0xb8487885, 0x70558ebd, 0xc421df7e, ++ 0xd43e60b8, 0x74605cb1, 0x3e7e160a, 0x69c7d240, 0xc6d43db8, 0x3263b781, ++ 0xf11b7e90, 0xc1fbc58f, 0xd00b2e2c, 0x7ddfd1a3, 0xce70d48e, 0x340e78d3, ++ 0x6e3bb335, 0x64fb8693, 0xe3b8158b, 0xb66b9c8b, 0x75e5ffa1, 0xe237fd30, ++ 0xc78c0521, 0x524dce25, 0x7c82b57e, 0x78eae453, 0xb729b7b0, 0x7c80731f, ++ 0x14e87c8d, 0xc00f63fc, 0xe51fd6fa, 0xb444fba8, 0x60753534, 0xa9a3f809, ++ 0x6a98a969, 0x52edebcf, 0x29e038d4, 0x1adf77ae, 0x62c4f5af, 0x829e1f98, ++ 0xbcf19cfe, 0xd51baefd, 0xe3e30bbd, 0xdf8c31f5, 0x47c68af5, 0xacf40e35, ++ 0x638aef27, 0xb3c493f7, 0x4c9c87fb, 0x967deb9e, 0x7f0a4912, 0xc8fe8dcf, ++ 0x399ee200, 0x7ac08c0f, 0x5c416c99, 0x768df8b3, 0x3a1a832e, 0x4678bf26, ++ 0x637c2fd7, 0x8cff604b, 0xe976636c, 0xd819fac2, 0xcfb9325e, 0x75f2823a, ++ 0x05c9b169, 0x8b339d71, 0xa380ecfe, 0x5bd28be0, 0x29ef0073, 0xbe910e70, ++ 0xc8f45877, 0xd7c38836, 0xc8944353, 0x477a0070, 0xd71332e5, 0xa29a171d, ++ 0xdbb67fee, 0x39bbfcd8, 0x6a6989c6, 0xd29290ea, 0x41f9e171, 0x8f0d2728, ++ 0x4ad30f54, 0x139cf7c7, 0x8248f8a6, 0xd4fa8d76, 0x58269329, 0x61ecd037, ++ 0x66bfe712, 0x487d358f, 0x75833d02, 0x1f6a62c0, 0xe50e7935, 0xbc6326af, ++ 0xe684ff12, 0xf984be57, 0x7ceae380, 0xff5477b4, 0x8cbea1d7, 0x0adbf664, ++ 0x4e2c34f6, 0xbde7b9d9, 0xf7feb0c1, 0xc7cf0fe1, 0x5fd03ac2, 0xb058aea4, ++ 0x7dee279f, 0x0dce1627, 0x8b2f787d, 0x9861dc57, 0x31b44d47, 0x5b13febb, ++ 0x6bf41671, 0x39efef81, 0x925c309e, 0x635d6cd5, 0x9c344079, 0xcbdfd727, ++ 0x344c1953, 0xc7e3d3dc, 0xe8a52b7a, 0x2e0af6f1, 0x375be587, 0xb42ae92a, ++ 0x06db71ef, 0x823db9c0, 0x2344f2f6, 0xa34a1fbb, 0xb1d6d167, 0xfe9dcc0a, ++ 0xebe66cd2, 0x1b32addf, 0xb045dc17, 0x7ce1e59e, 0x6079d233, 0x5beb0daf, ++ 0x3fb673f2, 0x6b6d2165, 0x9eafb535, 0xc2de7666, 0x1f258fd8, 0x542905aa, ++ 0x101e4b78, 0xef0c5e70, 0x29c74bdf, 0x71fbeacf, 0x4fd8cbdd, 0xc639bde3, ++ 0x7cdaabf3, 0x7f97196a, 0xfea0f129, 0x6d6b9c45, 0xc6d3eb66, 0x83b9dff8, ++ 0xbfec3699, 0x723fc78d, 0x0f3844c8, 0xd0e0fdbd, 0xa7dd4bb8, 0xc3df9a7c, ++ 0x434af704, 0x3047c27a, 0xeca9b2cd, 0xb7e68c9e, 0x5557000a, 0x9ef0db4d, ++ 0x6f6a6fb1, 0x3a4f9b2a, 0x66b30f60, 0xb91fa877, 0x4a43f01a, 0x597f9d05, ++ 0xc2bcf1b5, 0x0f8cbbe6, 0xb7e7f1b7, 0x60b37f41, 0x93fab59f, 0xb7ce5429, ++ 0xc217c855, 0xdbf321ef, 0xfa6ee7f4, 0x9fad5fdb, 0x493d7c95, 0xef11bfeb, ++ 0xa57f1c59, 0x0ed64b9b, 0xdda92ca4, 0x3f087c73, 0x72e7867f, 0xf1193c34, ++ 0x17148cb2, 0xb86109a4, 0xfb187e68, 0xb4afc9a1, 0xafef216e, 0xe3af953f, ++ 0xa8bc42a5, 0xf1189c2f, 0x0db721d0, 0xe235fd01, 0xfb97a3a1, 0x0db61e44, ++ 0xaa957ec5, 0x8fb002ee, 0xeb5d6dd4, 0x4e4bf30c, 0xee077548, 0xccdabd01, ++ 0xde361d70, 0x35ede732, 0x95efc719, 0xdc0a6ab1, 0x9a72879f, 0xcc00fb04, ++ 0x6b4f787e, 0x76e7dda7, 0xcf80930d, 0xf29e9885, 0x0d86bb15, 0xfa5f29eb, ++ 0xf80779f8, 0x09239dcd, 0x623a6dc6, 0xb1eef4f5, 0x1ee74889, 0x2ae71b1b, ++ 0xbc7fd6a4, 0x7369360f, 0x686fee2b, 0x7dc78aff, 0x461732be, 0xfe11e7eb, ++ 0x84f7e11d, 0x4af5c1dd, 0xe02c879b, 0x99a3bb72, 0xda2f5fad, 0x30f28250, ++ 0x5d7acfee, 0xd3a41670, 0xb1c13caa, 0x28dfc80a, 0xefae259f, 0x08afbee3, ++ 0xf8879139, 0xee0f003e, 0x17ad29cb, 0x9461ce31, 0x277635df, 0x56af373b, ++ 0x456dbce3, 0xb870762f, 0xfa8df4dd, 0xc2c7ec63, 0xa2ed0146, 0x9b65fe91, ++ 0x240ed66b, 0xbfd67fd0, 0x06847ec8, 0xfde21da1, 0x4a55fad4, 0x40df785c, ++ 0xdb507ac4, 0xff7c2435, 0xc5e6f2f4, 0x8abf0fb8, 0xb8b09ff6, 0x3481c611, ++ 0x8d7a35fa, 0x4f1028fd, 0xdb8816cb, 0x605c16ae, 0x23ef238f, 0x3beeeb73, ++ 0x6fb0d85c, 0x5dafc810, 0xdb64fb62, 0x03ce02fd, 0x6c203f3b, 0x809d603d, ++ 0xcabd67eb, 0xffed99af, 0xd58e5de9, 0x57dfdc0a, 0x2a8841ba, 0x79f565c7, ++ 0x766161ae, 0xa6607969, 0xde8e986b, 0x5907ee20, 0x7ba250d1, 0xdbd76a9e, ++ 0x8df4beeb, 0x8d47c754, 0xa5fa692b, 0x7fa69be9, 0x3655d8d7, 0x070291af, ++ 0x8ec033d2, 0x10f38a3f, 0xda47876a, 0x91fe7cd9, 0xaa95f479, 0xd6ebcfc7, ++ 0x32e49603, 0x8b112cf9, 0xf66f79f0, 0x6741f294, 0xfaedb38f, 0xb5df0efd, ++ 0x343f5a3f, 0x67fad0bd, 0xff230bd4, 0x519a38b5, 0x03fe460e, 0x781f305d, ++ 0x702d8f7d, 0xcefa009f, 0xb1eff4e8, 0xa91d9d22, 0xf7382ef9, 0x80f847f8, ++ 0x769559d2, 0xc5abe62b, 0x38ed1be2, 0xa4f3e38f, 0x178bfdf1, 0x6abf7364, ++ 0x8e3dd587, 0x4e2a1b9d, 0xad4c5c04, 0x71659b69, 0x943f9c52, 0x88f70055, ++ 0x6db47d4e, 0x17ba8416, 0xf962e43f, 0x58ef6d2d, 0xab8fd45c, 0x0e982ec9, ++ 0x1bb7167e, 0x0d995064, 0x4f35efbe, 0xabce973c, 0xe6f1fdec, 0x1eecf9e2, ++ 0x415e5666, 0xe3a16c79, 0x11a1c559, 0xacfd007f, 0x842a2d68, 0x44054d38, ++ 0x5678e9b8, 0x6c8476e9, 0x9efc6c59, 0xce7bdf4c, 0x788959e6, 0xc706b8ba, ++ 0x12438ab7, 0xc83913ea, 0xed12a0e2, 0xb77e95ab, 0xb9fa8626, 0x126bbf94, ++ 0xaf982e2c, 0x987ee7d2, 0x7049aec7, 0x73d86aab, 0x1df07e4d, 0xc4c6b1d0, ++ 0xbdf7e9d6, 0xedae223a, 0x3efbe312, 0xf302991f, 0x059f168e, 0x9e796353, ++ 0x10f3c4e2, 0xc7162679, 0xa93f9630, 0xa6a259d9, 0x0eaa2e03, 0x4d3e2c2a, ++ 0xac7fc0ff, 0xaa2f4c24, 0x55c73b08, 0xb9e08879, 0x0583aa95, 0xf6056e78, ++ 0xc3ac7ff5, 0xdce6bfe1, 0x18ae0f4a, 0x6125f29f, 0xeb86148a, 0x2eab76e9, ++ 0x4698a62f, 0x18887f42, 0x177382e3, 0x7aa9ba62, 0x78bfed3b, 0x3f294d19, ++ 0x844ba724, 0xa6ea59fb, 0x7ee1154d, 0x7f7e5aa9, 0x9d89ad4b, 0xdbdad72b, ++ 0xa5eb676e, 0x5ec27a5a, 0x9fb9041c, 0xc735b379, 0x702bd6c6, 0xb7f5abfe, ++ 0x01137056, 0x09fb59e6, 0x4ec8079e, 0x3fc02d22, 0x02e7711b, 0x13d90ede, ++ 0x3ad9bf38, 0x874bfd31, 0xbd3665d4, 0xefbc52a4, 0x0161687f, 0x2b829efc, ++ 0x065774ce, 0xbed1ffcd, 0x95c1f514, 0x419f3a6e, 0x7da6fc21, 0x695fcb19, ++ 0xe6943f3a, 0xb197b2df, 0xc2682c3c, 0xe5f6bc3d, 0xd051fe05, 0x56fbc70e, ++ 0x6f8095f7, 0x2de2c4c9, 0xae0acbd2, 0x40fb689f, 0x1589d0d6, 0xb710f1e0, ++ 0xf26b6b9b, 0xf883637f, 0x855bbe74, 0xf89b1dfd, 0x36df413d, 0xda2af8d5, ++ 0x167f784c, 0xf7ffc0a4, 0xb9353f39, 0x95f74690, 0x04960fb0, 0xbac257dd, ++ 0xe7bb09d9, 0xe337b023, 0x0a9d6f5e, 0xedf1bbf6, 0x7de0e73f, 0x7ab197e4, ++ 0xe74ebdc6, 0x673fb480, 0x63783b7e, 0x09f3faf8, 0x2027de7b, 0xf4062a1f, ++ 0x49d5054f, 0x587aa36e, 0x92aa26eb, 0xfd64f309, 0x3091b0fc, 0xad9cf4fb, ++ 0xda3b33f8, 0x5b8e1093, 0x33e2f605, 0x39ecd790, 0xd7e84d69, 0x6b25363e, ++ 0x72e308b5, 0x91d37a42, 0x7fff6045, 0x10f1eecf, 0xbfdc6edc, 0x3df762f9, ++ 0x883f6c66, 0x8083f60d, 0xaa48bbfe, 0xbbc7993f, 0x24993c58, 0x7bcd84e5, ++ 0xf7e83f79, 0xf97f61d3, 0x2fdb1b44, 0x8225fb40, 0x544b1d5d, 0xfc41c74c, ++ 0xe620132a, 0x126efcc1, 0xad0f723c, 0x8b2b31ff, 0x881a591f, 0x2a381e2e, ++ 0x25fdf996, 0x73dd990e, 0x026f0726, 0x2ce621ff, 0xd0ff8271, 0xe122a4f9, ++ 0x79c9227e, 0x1d87ae1d, 0xf7a01130, 0x84e03919, 0xcbae98f5, 0xe9137525, ++ 0xcb93afa9, 0x31f7ab5b, 0xe21cbd45, 0x9838b770, 0x1e4cfa7f, 0x5dcffdc1, ++ 0xac009527, 0x5ba42693, 0x3de3c3aa, 0xf777f9c3, 0x8b2ff33b, 0x9ef37885, ++ 0x4fed0218, 0x02631bdc, 0x6b66fc39, 0xf0f015b6, 0xf288f022, 0xbcecc121, ++ 0x384bea13, 0xc0cde94f, 0xbc5f6ce7, 0xa38d8ea4, 0xad7c9dfc, 0xa5fb855d, ++ 0xaf06b19e, 0xcf9ffdc5, 0xdd3ef09b, 0x09571517, 0xa73c5fe4, 0x3efec13a, ++ 0xc18c1193, 0xc26f3cfe, 0xd318bcfe, 0x4a4ac575, 0x592383f7, 0x11b24a3c, ++ 0x64b2ec09, 0xa4ef57ca, 0x32c7c7cf, 0x7a766afc, 0x9fd32c59, 0xfb8204c7, ++ 0x1e5325ff, 0x3fb68fea, 0xe08bb3a7, 0x37019cfe, 0xe3808ab7, 0x4e2d1298, ++ 0xbe211214, 0xa098a533, 0x2ec536df, 0xd81c39e3, 0xc4e70c0f, 0x3bfb72a6, ++ 0x5c0a83f5, 0x3812a03f, 0xb65df704, 0x59bdf9d8, 0x1af11d7c, 0x49ab938e, ++ 0xe47e089b, 0x2b8917d5, 0xe6bbdb44, 0x8fd514a2, 0x7debc19c, 0x1c52205a, ++ 0x82ef2f7d, 0xf2ee012a, 0x9bcfde88, 0x12705f51, 0x1669c1c6, 0x13f073c3, ++ 0x9e371e91, 0x34e19fe7, 0xcb1d07dc, 0x6421a2fd, 0x30bef848, 0x8667dd6d, ++ 0xf471ea38, 0x17150b53, 0xdd9b65f0, 0x73ac1efd, 0x72655bfa, 0xd3e1b8a9, ++ 0x6f7fb63e, 0x5c18c5e4, 0xb4f8a1ef, 0xa8ae2e03, 0x695bf3af, 0xc618afbf, ++ 0x821c07ea, 0x93def95d, 0xe7608949, 0xce3658e5, 0x3b86a969, 0x8e3397c0, ++ 0xa639cbe1, 0xc6573f47, 0x353ca066, 0x41dc037d, 0xc0e5bb3d, 0xc8eb68fc, ++ 0x632baf14, 0x083f4027, 0x927ecfce, 0x7a0b9966, 0x14d3b5a6, 0x4c6ff0cb, ++ 0xdcacd6d7, 0xfe38eb07, 0x3178d9cf, 0x2545e07d, 0xdf7fbc7c, 0xaaf5e8c9, ++ 0xa06eb375, 0x65daf3fd, 0xe649af5c, 0xf1c289e7, 0x17861692, 0x761d770d, ++ 0xf0d1df16, 0x3bd76d33, 0xf69f3c22, 0x0cce2139, 0xd10f3dd2, 0xcfd533f0, ++ 0x20f53870, 0xc2fa271b, 0x39cbbb8f, 0x0463cc1d, 0xdc320e6e, 0xe07c53e4, ++ 0x82f56def, 0x366e231f, 0xaf9b89f4, 0xaafbfcf0, 0xb92ed33d, 0xd3e4d84e, ++ 0xa634f3ef, 0xf7d16c93, 0x64ebbf01, 0xa94bbd7a, 0xec0b2ebb, 0x7626f5c5, ++ 0xe9224dde, 0xef9c5137, 0x91eed18a, 0xfc84ceaf, 0x9fd98936, 0xb466cd6d, ++ 0x1eecdb3f, 0x5359c60f, 0x9b0e782d, 0xd8369e48, 0x681aefc7, 0x377fc351, ++ 0x3f6e2ee3, 0xd2687282, 0x5fbff071, 0xbdcff265, 0xac6e1b3e, 0x4ca56923, ++ 0x284fe30e, 0xcf5a451b, 0xdfbc8ead, 0x0a3c3d83, 0xb8c16877, 0x7bc14c74, ++ 0x298eaa88, 0xbb7f1768, 0x8802adf7, 0x85fb6a67, 0xab7eee27, 0xbc147f20, ++ 0x0af670cf, 0x1e5aabb7, 0x9d804e8f, 0x3f43dc34, 0x92fcfba9, 0x62f91efe, ++ 0x4f564fc0, 0xf57ef1b9, 0x8ba27039, 0xb5373b8e, 0x598066b9, 0x3eafde30, ++ 0x8bcec427, 0x9ee23ecd, 0xe232a601, 0x878e757e, 0xceeb485b, 0xbef23118, ++ 0xff3e3a6f, 0xe67ffa05, 0x710290b5, 0x7d52a0ef, 0x544f9b25, 0xd1fd8267, ++ 0x28ff0ef4, 0x8e1f82df, 0x9fefddd4, 0x7ffd60e9, 0x7bb125c8, 0x5c14da9b, ++ 0xb0987c17, 0xdc7c82ef, 0x5b2c7bfa, 0xf55ec987, 0x87b07cc2, 0xb8dccae3, ++ 0xc9d2bb4e, 0x253f33e2, 0xc8264b21, 0xfae125cb, 0xa7565046, 0xde7a171d, ++ 0x48f15223, 0x3ddf2d3b, 0xb41c6620, 0x43c3ab7f, 0x49efe01c, 0xbbe1075d, ++ 0xc7b39389, 0x8fb6dd81, 0xe308935d, 0xa5374698, 0xbd8b70ab, 0xae8d0e87, ++ 0xdd5edc33, 0x1c4858ea, 0x6077d803, 0xb68e9a87, 0x0d7be05b, 0x673dc107, ++ 0xf0c3fc99, 0xc1eff200, 0xf200b083, 0x7cac1f1a, 0xfff2d63c, 0x06843c7c, ++ 0xc57a7c81, 0x1c21c403, 0x190f09df, 0x0f0d57c0, 0x1efb5fd4, 0x2d7f35e4, ++ 0x867db0a8, 0x41c35e5a, 0xdf0f3d81, 0xf7042973, 0x56bd910b, 0x13db2e76, ++ 0x2f13eb8f, 0x9d1b5939, 0xa10fb61f, 0xec99262e, 0xc6fa6048, 0x6c643f7f, ++ 0x72bf4048, 0xb708352c, 0x08371fa1, 0xf38ba1ed, 0x020bb48b, 0x7b89b3dc, ++ 0xbfc1d3c9, 0x5e82250c, 0x8517358c, 0x6ddbff00, 0x3fc1d353, 0xc94db6cc, ++ 0x1ced7c04, 0x1835eab9, 0x2c0e76b2, 0xdab3697b, 0x76693fe3, 0xab5785af, ++ 0xc1d33fb5, 0x6e35c6ec, 0xec081e76, 0x9a1d3876, 0x00b107fd, 0x8e68421d, ++ 0xda1b6be9, 0xb036e6eb, 0xe50740e7, 0x34813eeb, 0x67907f82, 0x034d2772, ++ 0x48406f3f, 0xf73b3a02, 0xe204397c, 0xafcd4594, 0x8b7a011c, 0x974ff5b4, ++ 0xe8d3fd7e, 0x8efe6b47, 0xfcd0af36, 0x0b3e6d21, 0x8f94137e, 0xf09dcfe2, ++ 0x7e30237b, 0x4e782c85, 0xea73b1f9, 0xbfae6ee5, 0x1147ed12, 0xa48dc7ef, ++ 0xeed2e915, 0xf381b919, 0x9d20e8a3, 0x39416687, 0x3e53d721, 0x19efcf5c, ++ 0xbfa5deb9, 0xdcc6e147, 0x688cf7e8, 0xbef5f4f5, 0xcab87c71, 0x5df44eb0, ++ 0x763e83d3, 0xf97fc8af, 0xf2773cd8, 0xc12fd150, 0xc69b9a80, 0x327065ee, ++ 0xa2541c3e, 0xe7bf578f, 0xd4d93bfa, 0x94e70596, 0x1bfeedf7, 0xef2f8f8e, ++ 0xe0bbdbfe, 0x293a4e27, 0x3ac7d811, 0x38f8e4f9, 0x4dcf8f5c, 0xad63f5c5, ++ 0x8da7ef5e, 0x239ec236, 0x59dfb47e, 0x71e94039, 0x059f402b, 0x7e9ddfd3, ++ 0xdf5067ec, 0x09126385, 0xa051273f, 0x1c418678, 0xdeff80b7, 0xf98101ce, ++ 0x01f95a4b, 0x0d173bfe, 0x01b0b71c, 0xc47fbb42, 0xebe7261c, 0x9a18bdf9, ++ 0x513faf5c, 0x8aca5278, 0xfdfc0f94, 0x5a0be233, 0xe737615c, 0x13f9691f, ++ 0x7ef9679e, 0xf8129de3, 0x154fdfe7, 0xddac3b89, 0xc19d2a99, 0xb639c587, ++ 0x4a7e0c39, 0xbb3fb3cb, 0xde2b8e81, 0x3adc45d7, 0xf6de6de8, 0x5be4165a, ++ 0x8df7a8c5, 0xfdfbf918, 0xbef13be6, 0x454e3511, 0xfb57dcbb, 0x38a0af93, ++ 0x27720319, 0x61cbcfcc, 0xe51875f7, 0xffeef2fb, 0xd51b6c4c, 0x937bbf3b, ++ 0xbf0e51bf, 0xeb8f9d3b, 0xc3c97d4c, 0xb4bddb88, 0xbfda7e9f, 0x9fa7ed10, ++ 0xfb2f63fa, 0x83ff989c, 0x1af3152f, 0x9e7bbd5e, 0x4e7f044a, 0x448ce9c3, ++ 0xbb499b86, 0xec48967e, 0xf232f23d, 0xdf9702ed, 0x7d9ae21c, 0x0ee7fd03, ++ 0xf68b15c1, 0x615a4fc2, 0xa731563f, 0x02a1ce71, 0x3f083ff4, 0xc71c61ff, ++ 0xf0a388e6, 0xbf9f7b9c, 0x4f2c3373, 0x1c6b7306, 0x57f7e0af, 0x71c6d700, ++ 0x3af5f0aa, 0x02b65c09, 0x63b31569, 0xe8d74fdc, 0x30f9ca32, 0xf47ec629, ++ 0x0711a746, 0xff357a46, 0x17ddfb5c, 0x09198fca, 0xd49bbeb4, 0xc45fec3c, ++ 0xd2f9cc38, 0x5bdbf8db, 0x78e3e2bf, 0xffe39f1c, 0x6fe989fc, 0xd37b7b02, ++ 0x8cdca337, 0x28fd9ae5, 0x31b20680, 0xa23f83f5, 0x3ea325c6, 0x88545c14, ++ 0x0c33f61b, 0x27779fd2, 0xde219745, 0x67b272ee, 0xeaade1bd, 0x127889a2, ++ 0x3727707b, 0xdc036a3d, 0x6cea92ed, 0xdabd1f10, 0xaa0b525e, 0xfcd3fd37, ++ 0x875ef19b, 0x90811336, 0xb3e68cd9, 0xf047102d, 0x1e78211e, 0xdf79bf20, ++ 0x1fe9c034, 0x479c56a4, 0xe4205e75, 0xb33f30d1, 0x06d6b9a9, 0x1253587e, ++ 0x2076cf3b, 0x1df6e89e, 0xcf8e3eff, 0xbb9d8eff, 0xfca51dc1, 0xe786388b, ++ 0x949dc459, 0x2c72e385, 0xd60a3fc6, 0xd3ffb099, 0x24fed705, 0xb1e65bf0, ++ 0xf73ba27b, 0x449fdc4c, 0x3db8ede9, 0x8ccced1e, 0x74effba6, 0xff044152, ++ 0x779f0e3e, 0x5ef0142d, 0x85d50281, 0x0cd282f9, 0xf131afdc, 0x8ab3891f, ++ 0x8ca67ca0, 0x62199bf3, 0xa8f10485, 0x3642a933, 0x0b7717cc, 0xbbf0356d, ++ 0xd612feb7, 0x13fa710e, 0x76f9fe61, 0xfc58e251, 0xcb5538ad, 0x03dfc70f, ++ 0xda798624, 0xf7e71daa, 0xaaf96999, 0xd7ee02d9, 0x274ce19d, 0x14fc30fe, ++ 0x1cf2a3ac, 0x9cd97147, 0x9eb80f92, 0x273fa855, 0x46d8bb38, 0x16ebe102, ++ 0x1def1382, 0x65f7c03b, 0x1efc0977, 0xd7e7ae7c, 0x99cfbc72, 0xaefba89b, ++ 0xd33f3084, 0xf76443bb, 0xdfb1e46f, 0xebf4d69d, 0xd787ae3a, 0x3cf1f9f2, ++ 0x8e8eba4f, 0xc0d28822, 0xf6c9d5fc, 0xa178dd97, 0x12e7870d, 0xf34383f1, ++ 0x8dd77b69, 0xc56bcc34, 0x8b88358a, 0x378eb654, 0x89bd761b, 0xeff53760, ++ 0xcfab98dd, 0x4be3d147, 0x1ecd09da, 0xe223decc, 0x3cece1ba, 0x448167ca, ++ 0xd4dfe9f8, 0xb9344c5e, 0xe83c43f6, 0xbc6e8ba6, 0x5ec22737, 0xadf8507c, ++ 0xa96fc5ec, 0xbd52e60e, 0xe3e38fae, 0x183260e6, 0x710cc6ec, 0x4700cfeb, ++ 0x34dc749d, 0x3691c147, 0xfdf368ee, 0x80c7aa02, 0xad9a721b, 0x98b8ccb3, ++ 0xb49cfb8a, 0x1db77ef9, 0x2b897ea1, 0x23b4bf8a, 0x3da3830e, 0x2bb34776, ++ 0x9c897e61, 0x92fdddf3, 0x551fd419, 0x41be81b2, 0xed0e3fc4, 0x0b25c619, ++ 0xc4142360, 0x62cf5307, 0xd12bc79c, 0xcf8e2bf9, 0x473b314f, 0xf42425ff, ++ 0x5fd187e8, 0x63cce2d1, 0xa53f9a9d, 0xbc7749c7, 0x3f7666f1, 0x029386a9, ++ 0xffe827e0, 0x75c622cd, 0xd68dc2fa, 0x09785f7e, 0x26047b51, 0x70bc57ab, ++ 0x78a6fbfd, 0x5f1b50f9, 0xfd619186, 0x0f8689c1, 0xf1c62f0d, 0xf10cbfe6, ++ 0x9bc6dea0, 0x066f180e, 0xecde3ef4, 0x5da3291f, 0xf9afcbef, 0xf8ecc9c4, ++ 0xca2738c4, 0x67cbdaf5, 0x8d10efe3, 0x1b4476e5, 0x5ae3bab7, 0xfb270cf5, ++ 0xb04916db, 0xfb05e47e, 0x0723d191, 0xe1ac1e2d, 0xc11d6ab2, 0x00ffe7f8, ++ 0x0251357d, 0x00008000, 0x00088b1f, 0x00000000, 0x7cbdff00, 0xd5547c0b, ++ 0x67b7efb9, 0x332479ef, 0x49926649, 0x9d804032, 0x20424210, 0x7860210e, ++ 0x200f3b88, 0x15019042, 0xf01d51f1, 0x28490201, 0xd6b4f5a7, 0xa4484cdb, ++ 0xd179fd14, 0xfd5bd6b6, 0x3d503b9d, 0x4320d687, 0x813c180c, 0xf0c50133, ++ 0x150106b0, 0x888da7ae, 0x31243688, 0xded80f54, 0xbefbf79f, 0x333277b5, ++ 0xee7a5a19, 0x1651373d, 0xf8f5ef6b, 0xbffdf7d6, 0x536b5ad7, 0x6abad1fd, ++ 0xdde80648, 0x0094012f, 0x41ca55d4, 0xa2b5fe1b, 0x899f99fd, 0x58ac19ba, ++ 0xa77f1507, 0xf1022c03, 0x2874a653, 0x62c03736, 0xb395e4af, 0xd176b401, ++ 0x962bd6ff, 0x45f58aa0, 0x6eb9f35e, 0x2dfb689b, 0x6401a9ff, 0xf7a6dc00, ++ 0x607f4c5f, 0x149ac5fb, 0xc5d7630c, 0x6fedd1a5, 0x73ef32bb, 0x896008a9, ++ 0x9e1cf316, 0xa22e52fa, 0x25f66a9a, 0xfa2abd61, 0xc933967d, 0xff10a17d, ++ 0x7ec61632, 0xbe5c032b, 0x352ef958, 0x6e7e96ff, 0xae1e5e1e, 0x002cca47, ++ 0x2e36f59d, 0xb3cfdf63, 0xc0e43f80, 0xe6282692, 0x00a90032, 0xcc5c4e85, ++ 0xb15fac34, 0x13469680, 0xf927c027, 0x43391d3a, 0xf8e00ffd, 0x8c371c01, ++ 0x00f207e3, 0xb93bd60e, 0x87bd66fe, 0xb052b3eb, 0x7ffe3a43, 0xc545aae8, ++ 0xff6fccf5, 0xf9c7e2ae, 0x78515fe6, 0x1eb4e9dc, 0x031fbe3b, 0x7f3d6863, ++ 0xeffe29ea, 0xfb50c2b7, 0x2d2ff6ba, 0x5ed7c9fe, 0xbf9adfcf, 0x75e54520, ++ 0xa4dabcd0, 0x281779a1, 0x9d70a300, 0xf9a3f30b, 0x2b13cc6b, 0x2df958df, ++ 0xcac7fbd1, 0x1eb317cf, 0x83d03e43, 0x87111a60, 0xa04c57ff, 0xfcb6bd4d, ++ 0xf163e506, 0x0d277ae7, 0x6bf00f7f, 0x78d0df5e, 0x4ba0bcba, 0x74164df1, ++ 0xd5d71199, 0x77c6290c, 0x5ce50520, 0x44e109dd, 0xc5d16c24, 0x2a15cfaa, ++ 0x8b9c12bd, 0x39c033c2, 0xd0f2de43, 0x20af73f8, 0xe686d35f, 0xbb20ab9d, ++ 0x1679e98b, 0xa3ace204, 0xa851c696, 0xb071807d, 0x79699b69, 0x9371d708, ++ 0x51f7ee05, 0x1fca2899, 0x2f1e253b, 0xbb7134e0, 0x266cafbe, 0xd76001b8, ++ 0x4072cc81, 0xe756bcfa, 0x10071831, 0xfff70332, 0xb72a49df, 0x0209227b, ++ 0x283f3809, 0x17d2365d, 0x1f201ca5, 0x69194ef5, 0x90e23609, 0x47d84acd, ++ 0x55e7d87a, 0xf6f501a0, 0x60efd18a, 0x91401ee0, 0xcf2e713c, 0xfd4d98d4, ++ 0xb0b35dc3, 0x8ac58ddd, 0xb89b05ba, 0xe977eaac, 0xab7eef7d, 0xedf5fa93, ++ 0x330ec7fb, 0x7815f38d, 0x73784291, 0xfde815bf, 0x4839876c, 0x7cae63f6, ++ 0xbd61365c, 0x8ac01faf, 0x0f2f67ed, 0xedca0057, 0x746ae826, 0xe4933962, ++ 0x077e4718, 0xaa22f5f5, 0x4e50231d, 0xcd397473, 0xc556edd1, 0x48ed997e, ++ 0x841c9245, 0x753b21ec, 0x39a32eb3, 0x63a256c8, 0x17ae1b4e, 0x457cdfdf, ++ 0xe6976b89, 0xfd96e3ea, 0xc9521409, 0xedc68832, 0x8f6136dc, 0x005341ca, ++ 0xc5b0aca7, 0x84bb27bc, 0x4675ccf4, 0xb6499f3f, 0xcbbd7113, 0x976ebdc0, ++ 0xf344c7f0, 0xe629cf7e, 0x25ff2b9d, 0xbfd71bb9, 0x307da2cb, 0x3fede90b, ++ 0xf8ed8661, 0x65622e1c, 0xb4be70c6, 0xf3075ea1, 0xfb17adae, 0x2a6a240e, ++ 0xf08bb3d2, 0x48faa0e3, 0x76ba2d4d, 0xfeeea2fb, 0xbb0e6c72, 0x902a979a, ++ 0xe53c70c3, 0xf7e218c9, 0xfceabe30, 0x8b67e58f, 0xe4764d04, 0xb7bb5973, ++ 0x30cb4c92, 0x1f22763e, 0xbf795fb1, 0x2f5cf3c6, 0xd8fd0d1f, 0x23512175, ++ 0x30baefbc, 0xdbf9a352, 0x86d3af08, 0xfcefbff0, 0x4fd92240, 0x20aaa3e4, ++ 0x365dfa2e, 0xafc676ef, 0x44687dc0, 0xd60b705e, 0x77ce3a43, 0x2d1ff625, ++ 0x322f7e24, 0x34d3b779, 0x4b71faca, 0xdcdd9327, 0xfb1e7e5c, 0x3f481a48, ++ 0x5491fd40, 0x658bdc27, 0xf087f500, 0xc6054816, 0x40421993, 0xf06a36f3, ++ 0x66739502, 0xefc429ab, 0xcbb31c01, 0x29a9e341, 0xcbf87384, 0xc9bee9e5, ++ 0x52def9c3, 0x79c2808f, 0x9a6deb5a, 0xb7b00b92, 0xb6f5c9de, 0x6f970f7a, ++ 0x6e5cabd4, 0x83fc963c, 0xa7538e20, 0x6d253459, 0xaa4a7fa8, 0x68398fd0, ++ 0x39ae8867, 0x88030520, 0xeb8f39b9, 0xe0a457b8, 0x84e48946, 0x27e089eb, ++ 0x3ba065ca, 0x4dbf823f, 0xe9f8d34a, 0xef2c0dac, 0xf71342e2, 0x7c1fe747, ++ 0x7b787b39, 0x7d547b94, 0x3a624b8c, 0xdd9a5cf2, 0x0ee3e585, 0x1a6b925f, ++ 0x43cee1e1, 0x29eb8097, 0xba45bcf4, 0xe384be4b, 0xc1970d4f, 0x4c3fd00f, ++ 0x5f10c145, 0xa21ee7f1, 0x05875a7f, 0x50e83e48, 0x758b2f59, 0x25afb47a, ++ 0x47ce02e9, 0x28edf3aa, 0x0ead67ec, 0x42f68e13, 0xbdf11a77, 0xa3b3e6c4, ++ 0x421d2146, 0x87749aae, 0x66f1c247, 0x32bc5ba4, 0xbe71ce99, 0x7f91eba9, ++ 0x2138e91d, 0xc8e8efb6, 0xdf5152c8, 0x0fede534, 0x9b35af49, 0x0ae22c23, ++ 0x84774f73, 0x1784cf1f, 0x904f149d, 0xf916fb4d, 0xe487f9de, 0x8c35db00, ++ 0x758ec873, 0x86f64c9e, 0xae9b9e71, 0xc256bcd8, 0x7d44753f, 0x5c98903d, ++ 0x3a19f644, 0x371d792b, 0x0a3ac4db, 0x1762fecd, 0xa1f0b3db, 0xbfdfb077, ++ 0x3d90000d, 0x23eba9bd, 0x0a9e9019, 0x37664153, 0x9a4879d2, 0x73e54290, ++ 0xc49e487f, 0x1ee4c9e5, 0x9301cfe2, 0x4f79a55d, 0xb925abd7, 0x5ded1788, ++ 0x60d00987, 0xa1d779cd, 0x3d4ef950, 0x5e22e494, 0x71b7adde, 0xc9dea279, ++ 0x0f7ac9e5, 0x3df08797, 0x7c2de9e1, 0x1b7b784f, 0x08fd53df, 0x18f2a7be, ++ 0xf1654b8e, 0x5e3c493d, 0x1649ddcb, 0x6481c75a, 0x27e63668, 0xc313853c, ++ 0xf805e0ad, 0x366f99ea, 0xbfa346db, 0x4b27fab4, 0xcf597053, 0x60a5537e, ++ 0x31fcd8fd, 0xdf0afc3f, 0x3f4acfcb, 0xb7bd21b5, 0x1eb4749f, 0xaa427ac7, ++ 0xe10753fc, 0x1a2258f3, 0xe56b5247, 0x98025a08, 0x2471b64a, 0x52835db3, ++ 0xf5e9a7ac, 0x254b7280, 0x45596142, 0x00b82177, 0x6e5972ee, 0x977f21b1, ++ 0xa7dffdd9, 0x5cd025ba, 0xd5137955, 0xbe9235d1, 0xeb20e64b, 0x5ee4967b, ++ 0x76eefe8a, 0xaecfff87, 0x49afff08, 0x7d91a69f, 0xe049ae98, 0x83bcb372, ++ 0xe7a1a5e3, 0x1ddbbb46, 0x724cff73, 0xb325c47a, 0x5b36997d, 0xe18e82d2, ++ 0x9bb46bfa, 0x24ad5e76, 0x38bf4df9, 0xc5ca89af, 0xfbae2e55, 0x44d8df96, ++ 0xb8e95ffa, 0xee0aff56, 0xcccba8ff, 0xb0572db8, 0x683f1c5d, 0x208a9bb4, ++ 0xffbbb8a3, 0x3b706248, 0xbf94fae1, 0x73eb0931, 0xb2c5d93d, 0xeb819b6e, ++ 0xe85b6dae, 0xad5bf57d, 0x24de57ac, 0xd3e5c52f, 0x0d32aba1, 0x243997df, ++ 0xe74c986f, 0xd29b8fec, 0xf253bde8, 0xb4cadb12, 0xd094ef29, 0x5bd95cfb, ++ 0x6a53f546, 0x93cb13a5, 0x4bacd94a, 0x7e7e6ed8, 0xfd86d78a, 0x787f864e, ++ 0x965bf099, 0x204de49f, 0x5f04af3b, 0xd7baa5a8, 0x69506dea, 0x2454cf1d, ++ 0xe4aa38d3, 0xe5bd6135, 0x46ff8ad6, 0x52fb9474, 0xbde89240, 0xf5f8a14b, ++ 0xb8fc3fb9, 0x5aed89d2, 0xfa4048c6, 0xf05c3273, 0xacbfa247, 0x404d5133, ++ 0xce2c5a82, 0x62d7ea4a, 0xb91b9c91, 0xf6a0abee, 0xfab33c81, 0xfc7b8e32, ++ 0x83fb3b6e, 0x712777ea, 0xeefc741c, 0xaa17ec51, 0x4e5d9ddf, 0x889371e5, ++ 0xaddfabd7, 0x26f7e2ae, 0xa9519308, 0xdc3be7be, 0x8fc56b6f, 0xfe38dd2b, ++ 0xb62eb1b1, 0x12a7282d, 0x624ec225, 0xffa8907b, 0xbedc353d, 0xe1fcca43, ++ 0x797f6c79, 0x15b14a52, 0x4ee79fe7, 0x955f6a88, 0x2faa8ae5, 0xa2511dc8, ++ 0xeac9d844, 0xf551d949, 0x92a44b5b, 0x78f8c8dc, 0x7d544276, 0x24aba569, ++ 0xedfda237, 0xeaa223d5, 0x8ecf6ecb, 0x669997aa, 0x0f51fb08, 0x9e852bb3, ++ 0x05ccaecf, 0x4f644ca1, 0xdbeda29d, 0xd241fef8, 0x7e2223f3, 0xfc61762a, ++ 0x3ca97284, 0xb97ec252, 0xafdbaec4, 0xa6797400, 0x3f17fd93, 0xea3c7047, ++ 0x9dfc4107, 0xf890f14e, 0x78c2eb29, 0x0523e280, 0x3d0476fd, 0x3f688e95, ++ 0x216a055e, 0xceaadfd9, 0xcd4f1c05, 0x44a92cf3, 0x463e4635, 0x1f92abf7, ++ 0x0c487117, 0xcc47c5dd, 0xcaade971, 0xc46fee8a, 0x7d3a5575, 0x537f262d, ++ 0x0162c52a, 0x1ae28bad, 0x1d063d63, 0x954f5ad7, 0x8a256f7c, 0x2bae6fff, ++ 0xf5807e96, 0xd2c45f9c, 0xf3d2efd5, 0x38a78c53, 0xe54cec0e, 0xdc7f10f8, ++ 0x2303e2f1, 0xfb46a9ee, 0x6fb48ae6, 0x64bdc90e, 0x9bedb5f2, 0xe2b5ee31, ++ 0xa35c633d, 0x3ccb343f, 0xf07fd1bf, 0x7fc52ab9, 0x27db03be, 0x96ee79c5, ++ 0x297f3fe2, 0x451cfdba, 0x1ea0746d, 0x1bc9051f, 0x571f7e20, 0x2ac90a15, ++ 0x544d694e, 0xafc8fdce, 0xff3a3c50, 0xca89a07c, 0xe3c13d59, 0x2dff5c56, ++ 0xfb4ab2f9, 0x143c460d, 0xa9a9aebb, 0x7a390e22, 0xf8abb545, 0xdaa025be, ++ 0x7968bf29, 0x1e53b55c, 0x1541a2d5, 0x38da8be5, 0x37ca7ad3, 0xb12c42b4, ++ 0xec2a9b9e, 0xbfbd04fc, 0xfd976e51, 0xacb15213, 0x4d3f75b1, 0xd5ed48b1, ++ 0x03050b7e, 0x9bce2947, 0x3bce3c34, 0x341d04aa, 0x83c7d1df, 0x1d845f0e, ++ 0x2f38debf, 0x8d36c093, 0x916929f0, 0x96c2a476, 0x8dda45a0, 0x54574eb9, ++ 0x1553aafd, 0x4467bc79, 0xd45bbf54, 0x1876a8ec, 0x1c53e6bf, 0x7c8168d4, ++ 0x29a8ec85, 0x5df14bd1, 0xd65f1f2c, 0x3875efd7, 0xb3027c29, 0x71fd955b, ++ 0x42b792fc, 0xb9f62ff0, 0xcf4b8f4f, 0x7cb07ad0, 0xb2e5553a, 0x2089f649, ++ 0xc266e30e, 0x731d6c43, 0x1e34e5d2, 0xdc21ec8e, 0xcba6ed79, 0x5d437a18, ++ 0x0a2dd16a, 0x54ef7dfa, 0xc38c3fd3, 0x2b534ffa, 0xdf10516f, 0xd7a659de, ++ 0x64feb072, 0xbf515cea, 0xecd534c1, 0x9867f805, 0xb6254b77, 0xf77dba77, ++ 0xfa5f22a5, 0x12cd8ecc, 0x498a33c6, 0x50f76282, 0x05a4fbfe, 0x160a29fd, ++ 0x90b9a641, 0xe455bb56, 0x6809b5cb, 0xb97da8ff, 0x6abf12a6, 0x77390c13, ++ 0x875f9067, 0x644d3307, 0xcdfc8c2f, 0xd87ec16e, 0xafe6cf3f, 0x27097811, ++ 0xbe9768ab, 0x266e6fb7, 0x54e9e2e1, 0xf0bfaf27, 0xb21e59b5, 0x77d74857, ++ 0x47ffdda9, 0xe8f102ba, 0x798b326a, 0x2b0a5a7a, 0x8e16efc8, 0x43487145, ++ 0x9f74c2f2, 0x1084279f, 0x6b971c2b, 0x8deb091e, 0xe2978b2e, 0xbc75a7f4, ++ 0xa8d96f5e, 0x76c84fef, 0xc5391b81, 0x96377eb4, 0xf2f1d0bf, 0x5a2f3e9c, ++ 0x104b31ba, 0x1fece00f, 0xa8b274b3, 0xb9641e13, 0xede29fb8, 0x7924effe, ++ 0xeace3f39, 0xb08ffdff, 0x85bdc1fe, 0xcfa38a5e, 0x2cfe0a26, 0x7634e60f, ++ 0x358a7d63, 0x748c3a38, 0x0fe69a3e, 0xb6ee0e12, 0xde33c706, 0x6893eb1c, ++ 0xce03497c, 0x0efc8c43, 0x32d538f3, 0x3fdc786e, 0x11b05e7c, 0x219cef9f, ++ 0x8bcc6cf8, 0xdf91b53c, 0x3c54a0f9, 0xf9c0e837, 0x837fc443, 0x203a419e, ++ 0x02fbc9cb, 0xe691f620, 0x0fb10eca, 0xf789a9fb, 0xf948ea4d, 0x79dafeb0, ++ 0xbd75e713, 0x9a015e46, 0x7e74c563, 0x78ccf3c5, 0xc4cca367, 0x3a77f006, ++ 0x4a7f9ab3, 0x9e72d6da, 0x3a2bad3e, 0xd3b1bf4f, 0x7ec0e15f, 0x7f187e37, ++ 0x3e96643f, 0x6504296e, 0xba33d7f2, 0xd2cddba3, 0x1759f4f3, 0x4f1f9fa3, ++ 0x48dbfdd5, 0xcfb91918, 0x7fcf41b1, 0xa4e78e06, 0xd6c94e10, 0x8b77c8c9, ++ 0xea69432a, 0xad68dd90, 0x647976c7, 0x4e5c6d1f, 0x807ce53e, 0x047afcf3, ++ 0xa4ec85b4, 0x9f434b87, 0xfb829f26, 0x1e6228a1, 0x1f06f71d, 0x7c143e07, ++ 0xff9dd29c, 0x3758d9cb, 0xa8219a77, 0xa673ad0e, 0x1001a7ce, 0x5a701e7c, ++ 0x8fd3cf98, 0x186a7afc, 0x263d591f, 0x97d62350, 0x1a8226a0, 0xf9ed4f61, ++ 0xd97551a9, 0x671e8f90, 0x4fc7d54c, 0x1a8c8ef2, 0x0c3788c7, 0x3a91bdf9, ++ 0x90e293af, 0x1cd58ea9, 0xe694a477, 0x725b8d44, 0xc84e563c, 0x91db8a38, ++ 0x5c515fc8, 0x8a894a7f, 0x07746e33, 0xfa500388, 0x97131291, 0x8f49956c, ++ 0x7e8f9e66, 0xfbe9a72e, 0xbb72b153, 0xe8a13f16, 0x7fddb397, 0x5a5d3f3f, ++ 0xaad33f34, 0xee99f9a2, 0xe667e68b, 0x8dbe68f2, 0x65f347f0, 0x5189ead4, ++ 0x2faf47ef, 0xfd8faa8e, 0xf6a8ccc1, 0x2300e8d9, 0x2f36e3eb, 0x7e3f6a88, ++ 0xfaa8d2eb, 0x8eefe784, 0x5c105f6a, 0x70bef519, 0x92eb9ac7, 0x86d0e4ff, ++ 0x5ec476a8, 0xff915fd3, 0x458f6d0d, 0x2d5ff3cd, 0x68b48aff, 0xdba45dbd, ++ 0xf686976b, 0x4fc878b1, 0xd90af6d1, 0xdbfb5749, 0x25ff6957, 0xbef2ae50, ++ 0x78016053, 0xcfddf11b, 0x76449f65, 0xdab2146d, 0xc9a37684, 0xdec9ab04, ++ 0xf1326d3f, 0xe7a1a43e, 0x7c44d2ab, 0x8f4d2ab1, 0x14dedc13, 0x1d865fb2, ++ 0xfada6b3d, 0x6c9b8f0e, 0xbf665f53, 0x4cdf0a63, 0xe5479779, 0xe48abbfd, ++ 0x4bf69552, 0xc5de91e5, 0x968711d3, 0x2ba032e3, 0x3fe3c684, 0x7df6877b, ++ 0x2a6c3b2e, 0xf54e54e1, 0xe15fc807, 0x632f42ba, 0x0eda02f1, 0x1d06a3f2, ++ 0xc787d41f, 0xd4647e53, 0x3fd67b97, 0xdf97ed41, 0xf29e365b, 0xf7e7c1d6, ++ 0x8caf8c76, 0xbae47fe0, 0x8b89c696, 0xa6bad036, 0x6ee7ad0d, 0x8dd8daab, ++ 0x85914f74, 0xb07f47dd, 0x7dd70d21, 0x2cdc7a56, 0x9980abe2, 0x8ff42be2, ++ 0xc2efdfbc, 0x96037a40, 0x487e4329, 0x74c116fd, 0xf97c12d6, 0x51cbe239, ++ 0xeff94bd9, 0xca2088ef, 0xeca96c1f, 0xec32eff7, 0xb8a6aaac, 0x701ae822, ++ 0x03a9c744, 0x3b638e0f, 0xcc3ee67c, 0x67af11ba, 0x463d622c, 0x1dba8bfb, ++ 0xc3b742fe, 0x237f643d, 0x6f579bf6, 0xc51259fb, 0x45f267d7, 0xff3c6d3c, ++ 0xa7389a55, 0xcc9a55f8, 0x23bb5d72, 0xefb919c1, 0x45721358, 0x46daebd5, ++ 0xe047cf38, 0x1eb1ad70, 0x7ad0a4bf, 0x53fae9d6, 0x7c9dd9d3, 0xfe3c7037, ++ 0xfc70d23f, 0xef976dda, 0x4dfd4bdb, 0x8fc219fd, 0x3bbe7806, 0xeb8e003f, ++ 0x4433fcef, 0x49bfa5c5, 0xbf2bfb13, 0x865ae9d1, 0xb0711385, 0x8bbb7d0c, ++ 0xcf67b7ca, 0xe7c3bd23, 0x8beb0961, 0x714cc13b, 0xb67f12da, 0x127f9899, ++ 0xe0f7a7bc, 0x54d35ad2, 0xe0eddf5e, 0x7c5f9333, 0x249abeff, 0x9e38376a, ++ 0x002a0e31, 0xb81f6dc5, 0xda0ce602, 0xe249b9af, 0xb3e701b8, 0xbddf73d1, ++ 0xff209ea3, 0x3ef7cc6b, 0x469d2ff8, 0x2f052c7c, 0x0f8c6b8f, 0x87651a90, ++ 0x4c205acf, 0xb38137fb, 0x48cbe0d6, 0xdf8a06cf, 0xf61b0f10, 0xed9db267, ++ 0x3b1ff35b, 0xf776c39f, 0x4d1eea8f, 0x35d9cc71, 0x5c23ce7f, 0xda3cf5dd, ++ 0xae6b5c5d, 0xb841dfdd, 0xe672f833, 0xf449cbc1, 0xc611e31e, 0xf562bc15, ++ 0x5d9c9e92, 0x645e4af3, 0xad2c7fbc, 0x83f530ec, 0xe7b8b4d2, 0xe579b111, ++ 0x9ff04b1a, 0x3bbd231e, 0x0cf1e66a, 0xe3a23e7c, 0x9ab64373, 0x0dcf8919, ++ 0xe4f88349, 0xcbc374b8, 0x0d95db32, 0x5cf813fb, 0x8b8eb4e7, 0xbeae57ba, ++ 0x154a98fa, 0x827e0f11, 0x97115538, 0x554e229f, 0x10cfedd4, 0x2f5f54a7, ++ 0x709dfefb, 0x9f53c9f2, 0x7c3e7324, 0xddd1f5fb, 0x7fbff527, 0x88f7f10f, ++ 0x1801afd0, 0x58fd9f78, 0xf14a816b, 0xabdec56f, 0xa87d93ef, 0x3ef2b56d, ++ 0xf75725ec, 0xfda817e1, 0x7da8093e, 0x8d81386d, 0x14ab6d7a, 0x35abfda4, ++ 0x8d37bb6d, 0xe69afac2, 0xd3042525, 0x3b6064ba, 0x0522db56, 0x42eb3f69, ++ 0x3ce8b87d, 0x378a9fda, 0x71a05eae, 0xe310df7b, 0xe70fac5e, 0xdbd48c51, ++ 0x34f7e2b2, 0x2b56bade, 0xe7fc5024, 0xd1465b0a, 0x10a5bb7c, 0xf43ab7cd, ++ 0x5fc6858c, 0x5c92d2fd, 0xeed6ff0a, 0xb91f18e8, 0xf7bbd41f, 0x3e454584, ++ 0x667d6ead, 0x44aede9e, 0xd460f7b8, 0xc123e8b9, 0xbcc8bc8e, 0x0858a311, ++ 0x420b7c50, 0xfce8ef5e, 0xae3ede5f, 0x7689d891, 0x120bcf6c, 0x9bbb31db, ++ 0x9d81d8ec, 0x34affeff, 0x197fbedf, 0x9281b84f, 0xf837e3eb, 0xd4371c02, ++ 0xc5c0f3ea, 0x03ca1693, 0x17cd5b6b, 0x3cff9de2, 0xdc79f6ec, 0xd8f286d3, ++ 0x3379f8d8, 0x2be503ea, 0xd644ec81, 0x6fd1d90f, 0xfcf48159, 0x3d201a84, ++ 0xb2dfb38a, 0x539beb12, 0xb63976f5, 0x77fcbc60, 0xfe615b85, 0xf9c472d8, ++ 0xfbfbec72, 0x7287f7f4, 0x7ed0b0be, 0xd17aad5b, 0x0dadb842, 0xe5ce2e7f, ++ 0xa79e3edb, 0xaf77e9c5, 0xb33df85b, 0x5b7ab7c9, 0x6c7e90c9, 0x93763690, ++ 0x6fb0dadf, 0xbe71ca82, 0xf4cdd02b, 0x695049ed, 0x3f7b151d, 0x311dde9f, ++ 0x1f111fde, 0xab7e11b9, 0x45c7d776, 0x6bdbe266, 0x4929171f, 0x337bcf43, ++ 0xede3ab1c, 0x16ebdc93, 0x6489f77e, 0xb79a45df, 0xdd55af66, 0xf04ef8c8, ++ 0xeddf0986, 0x40cf3e76, 0x96365b7c, 0x2efbe244, 0x5db6bba6, 0xadbf92f6, ++ 0x6fe25b6d, 0x5e49f6e0, 0x56dc8312, 0xc99c2016, 0x11e31f4e, 0x4df382fe, ++ 0xd071cfd7, 0xff6ec91e, 0xe28bc252, 0xc48f8f08, 0x7ba9ad5b, 0x6c2b9d0c, ++ 0x96b7fb36, 0xec9fe845, 0xdd1ba808, 0xaf34cfc4, 0xcfc90eac, 0xe972126c, ++ 0x5393bb55, 0x1fa26fc9, 0xde957da7, 0xc4c9e7f0, 0x0f6d4dff, 0x73ef48d8, ++ 0xa75e4edd, 0x695012cd, 0xd52c665f, 0x2d9b6e51, 0x57a4d5be, 0x4512339b, ++ 0x7d759b5e, 0xa4bd65fb, 0xfb9d0aaf, 0xa2df79f9, 0xef5bc757, 0xcbfb6068, ++ 0xd0666577, 0x6bd78d2b, 0xda93bf03, 0x1475b5d5, 0xdebdfa45, 0x897a777d, ++ 0xe8a2733e, 0xaf02190f, 0x493ef3b1, 0x99392338, 0x8b2d6e56, 0xedb1fbf0, ++ 0xd1e3aa7e, 0x012803e0, 0xa9c13fde, 0x1df878b5, 0x206f2ee9, 0xea913c39, ++ 0x4c3b27cb, 0x8c1cba5b, 0x74b896aa, 0x449ffb60, 0xcebeffb6, 0xefd98b47, ++ 0xd7aebe24, 0x8f8b66eb, 0xad8a8cf9, 0xae0f1e92, 0x5712c72f, 0xe9d25ecf, ++ 0x2d1d9cde, 0xdb76d8f7, 0x536676f5, 0xe892b3c0, 0xdeb3203c, 0x2cfda9f4, ++ 0x5f5da37f, 0x7f90aaf8, 0xe95be5fb, 0xece6cb3e, 0x2fcf8c65, 0x2c50537e, ++ 0x2c7b8c47, 0x76483cad, 0x0f0319e4, 0xe88780e6, 0x1d662a7e, 0x9fefb74e, ++ 0x34fb11dd, 0x2ebee590, 0x3f9e809c, 0x877f7579, 0xb7ef13f9, 0x97a241f5, ++ 0x3d6efbec, 0xc7c0504f, 0x5783b138, 0x834638e5, 0xa2cf7463, 0x5b04c3b1, ++ 0x9b4c9ab0, 0x62e71141, 0x48c9b2c9, 0xa61b34b2, 0x4b4c74c2, 0xaf70dfef, ++ 0xeb84d05e, 0x590107dd, 0xfbd143c4, 0x9a49a003, 0xf02fb914, 0xfbf89ae6, ++ 0x1bfa2f02, 0xd6ffaf49, 0xb08cc0be, 0xe5258569, 0xe81fdfef, 0x99e74772, ++ 0x2655bbef, 0xf02f942a, 0x06270a17, 0x4c133ec5, 0x4f3efc25, 0xfff7c4bc, ++ 0x45a511e8, 0xb9b7cdea, 0xd7b8dfd0, 0x1b3cd96c, 0xac572bf5, 0x048dea9f, ++ 0x67114ee2, 0xbc37ee0c, 0x5ce39139, 0xe73243b4, 0x969d4edb, 0x6095b918, ++ 0x6f7c047c, 0xbf6a3527, 0x9bf87c22, 0x3bbbb264, 0x4977d553, 0x6447fd2e, ++ 0xa09197be, 0x715c5b74, 0xc52f6af4, 0xa88718cd, 0xdabec2e9, 0x9e79c4da, ++ 0xfc80d54d, 0x39d3827b, 0xafd08e45, 0xa83fba53, 0x8c767c39, 0x4bc8e305, ++ 0x93c9e3a6, 0x7b75fc70, 0xdb69925a, 0xf799ed6b, 0x9815d3a6, 0x857fc572, ++ 0xb485faf0, 0x7146cf2d, 0x1160e6e1, 0xce1427f1, 0x3b7f2149, 0x52808159, ++ 0xba9e9c3c, 0x09398be7, 0x0f9e7dad, 0xfb7261db, 0x9f1455d4, 0x7ac585d6, ++ 0xbe330e69, 0xae03682a, 0xa635b6f7, 0xff7578d2, 0xd9247fb6, 0xc5d257a7, ++ 0xaf6fec7e, 0x15fd144c, 0x527da850, 0x53074bba, 0x73fb44d0, 0x7afbe8af, ++ 0xdc4c57bd, 0x727f98ce, 0x44ec995b, 0x6f0a4c1c, 0x88fbc83d, 0xa38e56ed, ++ 0xc1025e12, 0x3e04f68f, 0x303ba9c7, 0xf50fc81f, 0xe12bc0b9, 0xfd899dfb, ++ 0xeff4f71c, 0xce74aab7, 0x0adce099, 0xf53be7a4, 0x0805517b, 0xd0c716c8, ++ 0x84be6373, 0x1ed25ff6, 0xcf82e11c, 0xad94135b, 0x92239370, 0xefcc49df, ++ 0x3a55c222, 0xd13613cd, 0x78ff4439, 0xd74c31b4, 0xf3c09d10, 0xb016741a, ++ 0xe969df7d, 0x3723f0bf, 0x1c24e5d3, 0x13a08014, 0x9e7027da, 0x78d4e09a, ++ 0xd54e091d, 0xd386901b, 0x81845755, 0xd3cdea17, 0x8f50611b, 0x12ebaf49, ++ 0xd436ea87, 0xa0399d85, 0xb8bf7f9f, 0x447672a5, 0xe94c0c9d, 0xf48aff50, ++ 0x29a5b9ff, 0x02d3f78b, 0x8eda8a32, 0xad2a5265, 0xa1f5e553, 0xc5e9684a, ++ 0x3f740f82, 0xef136ece, 0xce23db07, 0x8877541d, 0xd3ab5e76, 0xf59b20be, ++ 0x078b0e85, 0x49efb2e3, 0xa3370be1, 0xe33cf6be, 0xeb84994b, 0x7c1d31ea, ++ 0xfddb19b4, 0x8f284571, 0x64be6fee, 0x8e9adff5, 0xd1febdf3, 0x932727ca, ++ 0xf669ddbd, 0xe9dd9356, 0xf1cb3c0e, 0xeacd6fef, 0x83bd0896, 0xbe0cfeac, ++ 0x4f33177f, 0xcf8d99dd, 0xb7db7c52, 0x9ce9524f, 0x3fdccfb9, 0x6daee886, ++ 0xf642ccff, 0xc7df6ebc, 0x4a5ecf1c, 0x8e9ddff7, 0x6b6d2bf8, 0x33647be0, ++ 0x23df2b60, 0x82e3d42b, 0x93d84790, 0xdb795381, 0x10e4221b, 0x06fa1748, ++ 0xe4b1fefd, 0x7d75da9f, 0x2e79403d, 0xee3a7b96, 0xefe3471a, 0xa370f3d1, ++ 0x1c1c035f, 0x08df7c45, 0xe839726f, 0x154a826f, 0x7df0ace1, 0x445afddb, ++ 0xfd74c7fb, 0xcf9f4c7f, 0x4f5fe199, 0x38edaef4, 0x75a64967, 0xa18d0f9e, ++ 0xf98432bc, 0x1d8e33b8, 0x18dfd419, 0xfa53aa7d, 0xeebed42d, 0x415db022, ++ 0xa0a53779, 0xbf795efc, 0x7c0ae26d, 0x926507be, 0x19c27142, 0x31ee1f91, ++ 0xfb5146fb, 0x175fd386, 0x495b1d91, 0xbeffc242, 0x2c76bfde, 0x5ff10df1, ++ 0xb67a489e, 0x19aed81b, 0xf4893a7a, 0x224ffb14, 0xbd5097fc, 0x4ef2ed80, ++ 0xd602d74b, 0x20263dcb, 0xb3fc44bd, 0x9dfe203e, 0x39278fe4, 0xffb81f51, ++ 0x9df3d604, 0xe38d265d, 0xe3ebb458, 0x1b7e5eb9, 0x557677d5, 0xe9cf593a, ++ 0xf498be7c, 0xc7907c35, 0x278c0109, 0x8be049d1, 0xe5388fdc, 0x0dba664e, ++ 0x0dce797b, 0x5350dfba, 0xbb0eb8bc, 0x47e9472c, 0x75149f84, 0xfcf68fdd, ++ 0x3f2ddde2, 0xa44722cf, 0xeea709fb, 0x76143f1f, 0x5f741fff, 0x99ade1b5, ++ 0x1e299b8b, 0xf7e6477f, 0x90fdf407, 0x83938eb0, 0xf9087efa, 0xb8aa750d, ++ 0xa7cf4b4f, 0xedef9d61, 0xc82beb6a, 0x6d56951d, 0x4ce5443d, 0x4282a85f, ++ 0xbbcbd9c5, 0x9a85990e, 0x5afe1217, 0x4852de0f, 0xcefad4f7, 0xf5aefc88, ++ 0xffdffe9b, 0xe8f6d716, 0x1c7fe401, 0x61cb853f, 0x357c61fc, 0xdfc33c0a, ++ 0x1d8649f7, 0xf280b739, 0x7956de8f, 0xb2be8ea8, 0xf54d8116, 0x2deef48e, ++ 0x3aac2401, 0x20937b43, 0xe7e99b51, 0x37c4efb2, 0x7b96a419, 0xbce39d4e, ++ 0x15a2d5b9, 0x735a7e12, 0x838cd530, 0x99ba50d3, 0x856250e5, 0x9f80e7b8, ++ 0xb07d8ba5, 0x293c00bc, 0x3b2c5e71, 0xb7379483, 0xe3059aca, 0x58108b9f, ++ 0x8dec8b36, 0x10fa5fbe, 0xfe1a3fe8, 0xd61e7ca2, 0xbc510fab, 0xe1eb7e82, ++ 0x673b0f9f, 0x569e1137, 0x2bf04bb5, 0x17eafb5c, 0x3003dfe3, 0x691e91f6, ++ 0x147876db, 0x4bcd73ca, 0x0dd6edd1, 0x710f2bde, 0x39aeb9fe, 0xb3ff7cfa, ++ 0x196e3d74, 0x6e28e307, 0x7db13c41, 0x69d02b30, 0xcd6efc45, 0x38a69ff4, ++ 0xe09315f1, 0xd655da13, 0xdd6ed3cb, 0x7b0b94cf, 0xf8097fd4, 0x8ec14ede, ++ 0x1fba21d0, 0xdb39b333, 0x54cc734b, 0x6d99fbc4, 0x4067ecd9, 0xbe74ca09, ++ 0xe7f9aa5f, 0xd01d3c71, 0x8c3dd14e, 0x049dbad5, 0x7ed2fe27, 0xd5aebe8a, ++ 0x48f73c7a, 0x19ee9a30, 0x79a46c10, 0xf710ed56, 0x88eed67d, 0x4ebf2f7f, ++ 0xf3dd671f, 0xf6d30e27, 0xba284d5b, 0x9fce9d5d, 0xe7e8b6ba, 0x7b377dc6, ++ 0xac7fbe86, 0xdebeebdf, 0x347f07fb, 0x3de2f88b, 0x7de31c7d, 0x4dc08661, ++ 0xf247922d, 0x8394175d, 0x52d59b84, 0xb7c45920, 0x748158e0, 0x45e0603f, ++ 0xa0fa9fbf, 0x74079fce, 0xb0baf0bc, 0x528bcd7f, 0x1eddce90, 0xfe9a2a7c, ++ 0xe62b4287, 0x71621e11, 0xccd9bab5, 0x581aedf1, 0x36f8a16f, 0x066b5716, ++ 0x42d5b2f1, 0x4f162c7e, 0x1ae97eb5, 0xfcb88b74, 0xb5ee96ff, 0xfbef30e6, ++ 0xe485fdac, 0xadfd100d, 0x3ed0b5df, 0x10fd70e4, 0xe0635df2, 0xdfd75f44, ++ 0x19f99ebb, 0xc227fe3a, 0x556f9644, 0x41e675da, 0x6ef4f1d1, 0x018fd08b, ++ 0x1b4fec45, 0x3fed89f8, 0xe7c78f4f, 0x5e5c0f3f, 0x4c9cbb6a, 0x5d7dcdfb, ++ 0xa5c0c903, 0x1ffc8aa9, 0xec2373d5, 0x22199dce, 0xf9e4de5f, 0xd78a69e4, ++ 0x7b36efe7, 0xbad69ee9, 0xf91f66d1, 0xdfa375e9, 0xf08dc8ca, 0xdbd1df2b, ++ 0xd0fddfcf, 0x67da04c6, 0x25e48df8, 0xff6bebf5, 0x07aa41fe, 0x78ef259a, ++ 0x6bb87fec, 0x2f7477e0, 0x9f63c6bb, 0xedd5e34e, 0x13b85b9f, 0x4fb787eb, ++ 0x95e646f5, 0xfac55387, 0xb3368fe6, 0x6919ecdf, 0xed3575ff, 0x58db6a03, ++ 0x78de7b8f, 0xedf7c2cd, 0xc1e04a77, 0x0e7b0e89, 0x7e401abd, 0x613decf7, ++ 0xa2bc60a1, 0xfba584f5, 0x9703c4af, 0xf30add30, 0x0b56e93e, 0xf3dc2fdf, ++ 0x41ce85a9, 0x98fa5f6a, 0xb4d69ff7, 0xd6476c49, 0x550728bc, 0xfda1ebfc, ++ 0x47085baf, 0x6412cdb5, 0x37be4766, 0x77b27bf3, 0x59acff54, 0x9f034fd8, ++ 0x1a3c752b, 0xbaf034f8, 0x0f33b752, 0xe3c68e6c, 0x1a6da0c3, 0x6a1ffd89, ++ 0x63f7c15e, 0xdf1ada1e, 0x6af618ce, 0x688fe515, 0x1f3d57ff, 0x4191eedd, ++ 0x0ed8061c, 0xe7b3dac7, 0x00533b0d, 0x81c38405, 0x0ab1caf0, 0x13ebfee2, ++ 0x9c42c66b, 0xbae39873, 0xe6fc36df, 0xdbdaf8b5, 0xfe42d976, 0xcccb2eae, ++ 0xd65d4379, 0x9c489657, 0x3271d76c, 0x964bfdaf, 0x077b754f, 0x045cefdf, ++ 0xdfc475fe, 0x2776ed45, 0xddd5c1c5, 0xb4176f42, 0x8941835b, 0x9fb133e8, ++ 0x26a1045b, 0x01df7f92, 0xe0445df1, 0x21e3890d, 0x2ad8edd0, 0x74abdf9d, ++ 0x3cc2aefe, 0xf7dd146b, 0x47e8f3d0, 0xa61db7f2, 0xfab511ab, 0x0e4775f3, ++ 0x179f1325, 0x0b33b080, 0x18cec242, 0xc4fc32f2, 0x7fd87f70, 0x6d7bc91f, ++ 0x59ef95bb, 0xccedd42f, 0x1df166c2, 0xf7deac56, 0xfb8bb08d, 0xbd047bee, ++ 0xb6b17eb1, 0xabfdba35, 0x1cbe2219, 0xdfdae3d0, 0xbaabc8c5, 0x7093ec1f, ++ 0xecaa05bc, 0x2eaf720d, 0x2cefe685, 0xb31cf892, 0x12971d53, 0x51919eef, ++ 0xd78f4efe, 0xda62fa8d, 0x21f6c2df, 0x644756e7, 0x299a5e3e, 0x199ac7fc, ++ 0x1ff88072, 0x2e2cbf91, 0xbf9b8ece, 0xed819a7c, 0xe07acedf, 0xf99129a9, ++ 0x8f2db68b, 0xcf13f870, 0x7ee9aacf, 0xb0b35d4e, 0x38a5bd27, 0xe3c50a6e, ++ 0x5d6df1c0, 0x794835b3, 0x88e21d46, 0x9c22a3bf, 0x4bb67e90, 0x18270973, ++ 0xe3497fff, 0x3ea3a12f, 0x3692ff5c, 0xfc38c7f4, 0x192fca92, 0xc5724777, ++ 0x996f91ba, 0x2301f2f1, 0x22bda80f, 0x79e34de2, 0xf9cdd2ad, 0xb8bb6d40, ++ 0xf07adc5f, 0xa46c98ea, 0x7fff6fb7, 0xe581598c, 0xad0f9d38, 0x7473a1e5, ++ 0x9debe64f, 0xe571b8b6, 0x9a96dda0, 0xcd6a4f58, 0x771c19dd, 0xeef8c3ec, ++ 0xde1fcc46, 0x87f382fb, 0xf70983d6, 0xd2b95c73, 0x57f9d63f, 0x1b00d4e4, ++ 0x08dd3e39, 0xfc525c4d, 0xadcf1912, 0x377b8a72, 0x8efeeb0f, 0xae238fea, ++ 0x73b6c61f, 0x85d9e38a, 0xd259a6c0, 0xd8607b70, 0xef1d1a95, 0xdb6d276b, ++ 0xb1fb5b44, 0xae8d4e71, 0xb3c11847, 0x6f8d8b7f, 0xff75334a, 0xe1b4e3a6, ++ 0x578e44bd, 0x4ec88efb, 0xbe45d3da, 0x8a48d3fe, 0xcf4e30df, 0xf98fb389, ++ 0x1ecb8e85, 0xa1b4bcfd, 0x99be6654, 0x88d28866, 0x8c7f9087, 0x8e13be97, ++ 0x85fbc520, 0x21cf5e07, 0x81ddaff9, 0x0ef522ed, 0x7be7e7e5, 0x5f96414f, ++ 0x67cec84d, 0x57fbc632, 0x913ebc0e, 0xdef0d670, 0x2e427937, 0xee2cf357, ++ 0x9467d36b, 0x58f22492, 0xd8f22493, 0x32774a3d, 0xfb754fe5, 0xbde45f64, ++ 0xb7ce4373, 0x4501f8e8, 0x328bebe4, 0x86efd655, 0xd30b8176, 0xfce2517e, ++ 0x8d7ec4cb, 0xf61fe799, 0xf2f11cbe, 0x101afc57, 0x3afb285d, 0xaee33f73, ++ 0xe98984ee, 0x90313ba9, 0x03dfe911, 0xd9266e34, 0xc07586bd, 0x640ec476, ++ 0x77d21767, 0xf85f587b, 0x4bc70261, 0xac9e7387, 0x2395bb66, 0x47add903, ++ 0x21335bdf, 0x97bc3fd2, 0x8181ce21, 0x68a1e0f8, 0x7e62e7e5, 0x611b0f9d, ++ 0x0bef9ea9, 0xc461df1c, 0x47fe99a3, 0x49e4e332, 0x36ef1bd7, 0xed02b7ec, ++ 0xb59dd703, 0xaf9a3df2, 0x3ce2aff7, 0x27f8ae1c, 0xbf019d90, 0x1f2a06ff, ++ 0x026ab03d, 0xc0faff3d, 0xfef03723, 0xca31b4a5, 0x3e88057f, 0xa745c50f, ++ 0x963be833, 0xf9a7fd9a, 0x7ecd5ffe, 0xf54fd333, 0x58f5ff48, 0xef3fd8a6, ++ 0x7de048eb, 0x0472090a, 0x6a37200e, 0x6fad75dc, 0xaeb11c71, 0x0efa8e4d, ++ 0x45b7e8c1, 0x0369e71f, 0x63492107, 0xe516ef39, 0x98d7b6ba, 0x10e6b59e, ++ 0xd9a1b1cb, 0x14efde2c, 0xe297c625, 0x0d48463b, 0x69bbfd10, 0x6b9c5aff, ++ 0xb6057ef0, 0xc818fd64, 0xf7d2082f, 0x11e8c70b, 0x682075f2, 0xcadcf102, ++ 0x9d8dc1e7, 0x98fbf8e3, 0xdcd7ce81, 0x71c5fcf1, 0x5241073a, 0xfc8b668f, ++ 0x22fdf622, 0x3847d88f, 0xb1d8467a, 0x09fe65a3, 0x0059ecf1, 0x2dbe45ca, ++ 0x356efce9, 0x4f3bc557, 0xb78fa85b, 0x94702b23, 0x3bb3d3d6, 0x7ad3cf81, ++ 0xb45f625c, 0x4288e5a2, 0x6dac59df, 0xff91a695, 0x01ff9b58, 0xf581877f, ++ 0xe15bb612, 0x586e7c7d, 0x9e7bbcd3, 0x918e8716, 0x05bf811e, 0x91e7f896, ++ 0xec532bff, 0x6f049d37, 0x3d1f9eba, 0x4ef9c269, 0xe29d9b56, 0xfdf12a7b, ++ 0xfdbaade4, 0x99916dbd, 0xa09392e3, 0x83b9c59a, 0xac581f38, 0x755bd1db, ++ 0xbbec3cbb, 0x09e117de, 0xfd881f3a, 0xc3b0d7ae, 0x2fe3e877, 0x8dc78d05, ++ 0x0efb3efd, 0xc3bbbe3d, 0xa4fcfd17, 0x20f37f61, 0x086fec8f, 0x7bc901fd, ++ 0xfb024143, 0xc79385d5, 0xe80b8dc7, 0xff55677b, 0x434a99de, 0x1f050dee, ++ 0xda3abfb0, 0xbe55e671, 0x01267f37, 0x6b9ce272, 0x432bf90d, 0xf2176fdf, ++ 0x6a0bcfd6, 0x4346829c, 0xf33097ee, 0x3297dc89, 0xceb5fee4, 0x7df4ffff, ++ 0x22507c97, 0xcbb629f7, 0xcec9affe, 0x387ad8d4, 0xb015c69e, 0x8d75c2df, ++ 0xc635d7d1, 0x2e8fe11a, 0x1711588d, 0x4beb43bf, 0xefbb080d, 0xc0a3b2e6, ++ 0x13577aca, 0xb63bf892, 0x27c8b09a, 0x3e452a6b, 0xe22ad799, 0x4bb765ca, ++ 0xf3624d41, 0x33e88a75, 0x26d8b3f0, 0x9381b7fc, 0xf8e97e41, 0xcfe4f7a1, ++ 0x79fdd56f, 0x40268e2c, 0xe7da3cd7, 0xbc9353bd, 0x16307f74, 0x4f974b4f, ++ 0xf3cc8b79, 0x7883f0b5, 0x63ffefe3, 0xe3d4b471, 0xe749ed1f, 0x64d970bc, ++ 0xc168f71c, 0x37086367, 0x9bd0d7b5, 0x76af5d52, 0xc9470238, 0xd16bafdf, ++ 0x0a5bc1cf, 0x1f89bada, 0x5ef1c09d, 0xd36bab8f, 0xf3071106, 0x384d7839, ++ 0xabfbbf81, 0xf7f3b769, 0x0dad354f, 0x3f291389, 0x76bd976c, 0x9eb757ac, ++ 0x567e24a8, 0x197b8897, 0x8e7e96b5, 0xbfb76537, 0xe45be898, 0xff3a88ed, ++ 0x16bce836, 0xdaed63ce, 0xec3cfd42, 0x2cdecabf, 0x6f3c08f4, 0x63397238, ++ 0x2e754e22, 0x7cc55fcd, 0x16b7eb7d, 0x9bab263a, 0xba3cfaf8, 0xa3d0b50a, ++ 0xcd45bb72, 0xfdb44d1d, 0x62ffd06a, 0x57d853a6, 0xe38b3073, 0x77d749c8, ++ 0xdf61a41f, 0x371445db, 0x291c76f7, 0xbbe044b2, 0xe7da0367, 0x006bf238, ++ 0x0ab7ae93, 0x54b49297, 0x1e846f8f, 0x943fedd7, 0x3d06fb41, 0xa893bfa4, ++ 0x7e4c9d3c, 0xc9f766b1, 0x6714f1e4, 0x31a511ec, 0x9976a5de, 0x9dd281db, ++ 0x24524777, 0x7d304f7d, 0x1c624297, 0xdbbcee80, 0x6fbe4726, 0xffad7ffc, ++ 0xf1a67a8f, 0xfa512777, 0xb309f06f, 0x350efe76, 0xe7cac070, 0x124e74ea, ++ 0x59ea9f79, 0x6237d71d, 0x3a7a4372, 0xc785ce83, 0xc0a62851, 0x205754bd, ++ 0x39d2a4ac, 0xf716586d, 0x7ed8b2cc, 0xbfe7d74f, 0xd0770951, 0xfa19d47d, ++ 0xe84ce2b9, 0xa07376e2, 0x9c0d4b9f, 0x396d1dfc, 0xb52cb978, 0x9a521785, ++ 0xe2142937, 0x19c244ef, 0x4d82eb8a, 0x8e375eff, 0xa6f887bc, 0x1f8305c0, ++ 0x893f9d32, 0xebb17bfb, 0x8f58c579, 0x850eec26, 0xb50f7412, 0xde7c4214, ++ 0xeb74137d, 0xd7f1dee7, 0x34f30b31, 0x09baef3a, 0xf9912775, 0xb3f6e411, ++ 0xbc723d69, 0x642f74f5, 0x93a54331, 0x19c293e8, 0xd7ed6fa6, 0xba3e8ebf, ++ 0xc4fb4895, 0xfef7f40f, 0xbce864a8, 0xf6fedbd0, 0x566f7487, 0x57be34d2, ++ 0x8eefa5eb, 0x2b092f29, 0x2c76833d, 0xb3cda007, 0xdfc92f72, 0xfc012ef8, ++ 0x6229f7c0, 0xe5a04bbf, 0xba18cc5e, 0x37dc65a7, 0xaa5c11dd, 0xb0b7bfd2, ++ 0x7fe36ddc, 0x36d8a59f, 0x0fed2a66, 0xdfe69a3e, 0x567c7a4b, 0x83cf1e6a, ++ 0x1c69c128, 0xb2b8ea77, 0xeb4a5683, 0xbbe33497, 0x0cbc6008, 0x019ef77e, ++ 0xdd8a7dfc, 0x791bbe2a, 0x4b687112, 0x74abf465, 0xaf1e17df, 0xddbe2950, ++ 0x2979b2e4, 0xbd12b37e, 0x1b7a21f6, 0x83dee26d, 0x962b7f71, 0x83c88d8f, ++ 0xaf3fd62e, 0x98e2e38d, 0xb7ee59ef, 0x5f10cff9, 0x9e5497be, 0xe16ef149, ++ 0x8a1ed9ae, 0xeff51bbf, 0x00a51a62, 0xcb80e1db, 0x821dee24, 0xa371c9d6, ++ 0x116ea2c3, 0xbfdf25f1, 0x1cab701b, 0xda4a1e5f, 0xeb113894, 0xbe242b8d, ++ 0xae98d4ef, 0xd09764a6, 0xc81976bd, 0x567637ae, 0xa05f9274, 0x37af14fe, ++ 0xd51a7cba, 0xf7c0e903, 0xb3ff88ef, 0x869bfe0d, 0xefd21ff8, 0x5edb14e1, ++ 0xeefb4d1d, 0x4150dc53, 0xb584a6fd, 0xe30bc4f1, 0xc7940ffb, 0x531e489f, ++ 0xa1f7d1c2, 0xfdf27140, 0x081e4307, 0x53b50610, 0x1f21b397, 0xbaddf1a7, ++ 0xb77d44a6, 0xc9edc86e, 0x331f2144, 0xc71944dd, 0x371a557d, 0xff062e56, ++ 0x62670fff, 0x48106171, 0x00004810 + }; + + static const u32 xsem_int_table_data_e1[] = { +- 0x00088b1f, 0x00000000, 0x94f3ff00, 0x51f86066, 0x257bc08f, 0x799c1819, +- 0x8968c550, 0x1819390b, 0x0bf1030e, 0xda005620, 0xc0c5caeb, 0xfdc406e0, +- 0x88013c40, 0x3eb100bf, 0x01830337, 0xd902a710, 0x736e6852, 0x17ba0264, +- 0xd8815d88, 0x32bf881d, 0x637c3030, 0x767ede20, 0x623da021, 0x2039fe08, +- 0xfd04b2fb, 0xf0d83ffc, 0xdafa655d, 0xc0c2a817, 0x2a83a310, 0x8fc68b16, +- 0x466fc1d3, 0x027c9a3c, 0x8f113f1a, 0x5473717e, 0x2a019d7e, 0x8188c93f, +- 0x9a920f61, 0x6efc037a, 0x81afc741, 0x3100df7a, 0x74769a00, 0x0003685d, +- 0x00000000 ++ 0x00088b1f, 0x00000000, 0x27dbff00, 0xa3f0c0cd, 0xa5f5811e, 0x798a1818, ++ 0x8968c550, 0x1819393b, 0x0331036e, 0x00430317, 0x2064ded0, 0x6bc4029d, ++ 0x101d7881, 0x3033708b, 0x08710304, 0xf9033710, 0xf36e685e, 0xf0606265, ++ 0x2040e207, 0xafe2060e, 0x31bea340, 0xae7f6f10, 0x43169010, 0x19c4cdf0, ++ 0xe9245c18, 0x86c1ffe7, 0xd7d3ebbf, 0x06032cbe, 0x044b7b06, 0x0305917f, ++ 0xaa258383, 0xfc4b471a, 0xc9a13866, 0x5df1a33b, 0x4097e8f0, 0x06b26ff3, ++ 0x8b543f2a, 0x92066181, 0xfc0d149a, 0xc7c7416e, 0x004f7a81, 0x54850031, ++ 0x0368f919, 0x00000368 + }; + + static const u32 xsem_pram_data_e1[] = { +- 0x00088b1f, 0x00000000, 0x7de5ff00, 0x45547809, 0xbedd70b6, 0x4e9def4b, +- 0x62585908, 0x81511007, 0x05e42ce9, 0x62d9b1c4, 0x970621f4, 0x66854611, +- 0x44749ecb, 0xf9d1c1c6, 0x153610d3, 0xc713309d, 0x60ec44e0, 0x81a0d050, +- 0x60241009, 0x3cc0ea03, 0x64ffe31d, 0xb83066dc, 0xc5a4c6b0, 0xfcb8df0d, +- 0x4dd54e75, 0x11d37bdf, 0x7fef999c, 0xca3fbff3, 0xfb5ba957, 0x539cead9, +- 0x2c922aa7, 0x4222e910, 0xab9f83be, 0x409bf908, 0x4d171908, 0x69e5a909, +- 0x24e05295, 0xbfa2e024, 0xe1521366, 0xd3cb4254, 0x43b29909, 0x48955f0e, +- 0xc8428df3, 0x7da6f34c, 0x6eef2c56, 0x53b0f960, 0xfe5a11f1, 0xd3cd1371, +- 0x8ee6033e, 0xe5a0ae87, 0xd9221d91, 0xb28edd08, 0x21124899, 0xfd842dc7, +- 0x0e7cd364, 0x96568521, 0x3fdc68ad, 0xb717da07, 0xf6958999, 0x68bbb157, +- 0x5f3415c6, 0x50264874, 0x32d362a5, 0x97cd1065, 0xc8168484, 0xf3664cf7, +- 0x4314ee0b, 0x1efd689b, 0xcdd24757, 0x574e420e, 0x2147885b, 0x91d9c6a4, +- 0x4268d374, 0xf2db434a, 0xb3695da0, 0x581135e0, 0x5397a6c7, 0x045b5d61, +- 0x4843d9af, 0xf13b66d9, 0xf873628c, 0xde3bfe8e, 0xa2af862a, 0x3ae98be5, +- 0x88b7ed09, 0x1111e6d4, 0x78a75fc6, 0x9df8519c, 0x38e376ae, 0x0b62be6a, +- 0xabb6871d, 0xc2f0567c, 0xc44d2b12, 0xefc742df, 0xf59d6dde, 0xb7d60384, +- 0x84e9194c, 0xa056ad75, 0xde68515e, 0xe607ab4e, 0xd1e4a8d7, 0x4686d2f2, +- 0xb47470a5, 0x03cdb2bf, 0x1faaf3f4, 0x94d7ec9e, 0xd5d3d31b, 0x46467884, +- 0xf884a5f3, 0x44bf685a, 0xc733290a, 0x407fbf44, 0x081909e2, 0x63c48bfd, +- 0x214ff689, 0x4783df89, 0x5e14afe8, 0x844ebdc1, 0xc5b78aab, 0x27bbfa6e, +- 0x6eb3b78a, 0x9229478e, 0x4d5feda3, 0xd03c021f, 0x9c02d4f9, 0xcf96ba68, +- 0x4c9135cf, 0x2eff6892, 0xe903711f, 0x351eb7f5, 0x3cc995ad, 0x185ac742, +- 0xc693e31c, 0xee42bcd3, 0x7e425e20, 0x37c722bd, 0x241fe695, 0x6f3039fe, +- 0x062fe4d1, 0x92d2113c, 0x4abbf402, 0xfd60b320, 0xd349813f, 0x94a955f2, +- 0x6bdc293e, 0x213ce5a7, 0x89ee7c0a, 0xf27c2f90, 0xa7ec74fe, 0x6851fb08, +- 0xdfcfc33f, 0x572f3b8f, 0xaf3b8fd7, 0x0aa7ed58, 0x585db1fb, 0x1379b53f, +- 0x2bc9f3f4, 0x1bb9fb55, 0xd85d71fb, 0x4f57dcba, 0xeae7cfd4, 0x7e27ec72, +- 0x69f897aa, 0x07a5517d, 0x6913e1d2, 0x3e39a3b9, 0xa5a27ef3, 0x812bc98b, +- 0x4b949dff, 0x971174b4, 0x61d1d36b, 0x97412fbc, 0x8fb93da7, 0x30f3ce5f, +- 0x7c82cb88, 0x50520ca9, 0x641a4c2e, 0x35dcf9c1, 0xe17281c8, 0x4bfe09ae, +- 0x301e74dc, 0x79a54936, 0x7723ffc5, 0xf3a6ba0c, 0xa40a4814, 0xc6a4131e, +- 0x8332d5f2, 0x5fc1e4c3, 0xdb463c8f, 0x91914c07, 0x4ebf34f1, 0xac38f498, +- 0x21311363, 0xa9226c7c, 0x33367a82, 0x3ab4f941, 0xa089e73d, 0x866b4e06, +- 0xd10bfc52, 0xfec8d77e, 0x2dafa014, 0xd020e6e4, 0x94a1aadb, 0xf21107c9, +- 0x70a6f074, 0x87eda250, 0x3c00a616, 0x6fe50acd, 0x1d0af8ed, 0xff8e347f, +- 0x03bf8c1c, 0x77d71fc6, 0x5cb0f37c, 0xb496f8dd, 0x16f8dd62, 0xe94f8e85, +- 0x9db9377d, 0x37e14f8f, 0x83e79081, 0xe6f8e1b7, 0x7f1c62b4, 0x758a42b5, +- 0xc77adbe3, 0xfdd6017f, 0x1feb7f52, 0xfebf4136, 0xfafd52b4, 0xc3feb615, +- 0xdf1f1164, 0x63ffeb86, 0x7f5b2170, 0xbf5b295a, 0x3bdbf599, 0xfe17abbe, +- 0x8fbac1af, 0xe1feb7f4, 0xbfebf513, 0x7ebf5ca8, 0x6dff1b33, 0x77c7c152, +- 0x04eff8e0, 0x2ffad9cb, 0x15f1c72a, 0x740bdfb3, 0x55b60ca4, 0x64f8e885, +- 0x64886508, 0x4c3e5194, 0x42102547, 0x6191d7db, 0x6cbb8708, 0xb0beee8c, +- 0x44737a51, 0x51091de5, 0xacf2a28e, 0x597cd392, 0xe40524f3, 0xb953962c, +- 0x754f88b7, 0x74889b61, 0xa1ccea4d, 0xbb7ce98b, 0xe420c4db, 0x195dd617, +- 0x23bf7112, 0x9da00b73, 0xfdf0c244, 0x6cc787a3, 0x98cbaed4, 0x8f95aa2e, +- 0x88f8ea77, 0x993827cd, 0xf3a2aa8c, 0x3044069b, 0x4e3f9a2e, 0xf2a128e5, +- 0x472a7df3, 0xd3213d21, 0x0ff7e8f1, 0x8a259ca9, 0xb1966f96, 0xde483c7d, +- 0x72049518, 0x971cfd82, 0x2f8fbc18, 0xff004211, 0xa1ddd62f, 0x545a7c80, +- 0x8f40a76b, 0xf1c023ce, 0x0e6dd914, 0x9e10146d, 0x2dcf801e, 0xfc848ac8, +- 0x9535a295, 0x7ea8b682, 0x6dddae80, 0x8532b424, 0x76b05fd6, 0x5d3750de, +- 0xccb3adff, 0x1fec2299, 0x84d837c4, 0x9b064c7c, 0xd5990972, 0x4c1e4eba, +- 0x92ccb733, 0xb4d4efdf, 0xe7d7ed9f, 0xe7d62d6f, 0x6c90e5bb, 0x44a37d02, +- 0xdfb48d20, 0xe5f4abdb, 0x42f138ea, 0x1f2bc302, 0x6c4927ef, 0x9a43b7be, +- 0x88dd9f09, 0xd66e39d7, 0xe04f9d56, 0x7184991e, 0x481cecbf, 0xb103ff10, +- 0xd6cddf9e, 0x1cef9c6d, 0xa02be2d9, 0xb77399f3, 0xce34f088, 0xdd9f73bf, +- 0xd34b1a67, 0x20654ffa, 0x8c7ae341, 0xd4bb9ff3, 0xea371eb8, 0xc682f361, +- 0x8c4e8cef, 0x9b6814f4, 0x4d43e034, 0x6b968abd, 0xa1a87c06, 0x33cdb2af, +- 0xd092f975, 0xa2fd5d6c, 0xf2ba79fa, 0xba25b545, 0xee6b05f2, 0x05e7e5d0, +- 0x9fd5d6ef, 0xae9974bb, 0xfbaaf6fc, 0x16b7e574, 0x67e5d3af, 0xeaebd7fb, +- 0x51ab32df, 0x2bec2e57, 0xe513a8b9, 0x54a2ffaa, 0x36df2bd0, 0x9547a013, +- 0x387e55de, 0xe9829d59, 0xa60f6ae9, 0x294f80cb, 0xb3769bff, 0xde71b034, +- 0x2aefc045, 0x55c84e9c, 0x464fc069, 0xd3c237ba, 0x67f4df48, 0x487dac70, +- 0x5205cb4d, 0x87ae7200, 0xf7eacfef, 0x120e5c73, 0x72d31cb2, 0xf96df185, +- 0xc4c9d4f6, 0xc8f0f905, 0xfdff472a, 0xd7011692, 0x1e8b4041, 0xd4a37808, +- 0x70ebc3aa, 0xf6bb3cdd, 0x257e388b, 0x0078eef0, 0x0132c155, 0x307c21f8, +- 0x3031c6ed, 0xcc72df1f, 0xfdc40db7, 0x7f3aabb7, 0xc01287c0, 0x93d300af, +- 0x3d30b3d5, 0xf4c7ed5e, 0x4c62eac3, 0xc2aeafdf, 0x297ab3b4, 0x83ab47a6, +- 0x7aa5fe98, 0x54efa60d, 0x56fa62d7, 0x7fa63d75, 0xda610eae, 0x54c3ed5d, +- 0x395edba5, 0x4af5c899, 0x1dd3ffae, 0xf967f302, 0x7bfa445a, 0x37a3f207, +- 0xacf1f805, 0xa0918be3, 0xcb7d9f37, 0xef2f404c, 0x7a465e0f, 0xc4ae17e8, +- 0x61457a87, 0xac870a88, 0x1b56e5be, 0x44d593c3, 0x1b9509f2, 0xa4fc5df7, +- 0xcc68fe77, 0xda01244b, 0x9d33bc87, 0x411dfa31, 0xc3e75f10, 0xc645f113, +- 0x71f140de, 0xe5bfd1fc, 0xf8e7bf40, 0x283b653e, 0xc2497ee2, 0x5f01784f, +- 0xfee1b81a, 0xe5c1d913, 0xf7e079f2, 0x7e1540f1, 0xa684691d, 0xd2370413, +- 0x3356d9df, 0xed8e0091, 0xfda110f6, 0x84f43d9c, 0xc5bbf60b, 0x87f72629, +- 0xa6a0e031, 0x6ee92d15, 0x689f7687, 0xd6cfe7d3, 0x282df90a, 0x37713d37, +- 0x72ba018d, 0x011c3fbb, 0x54c14ff8, 0x8a7167ed, 0x0070fee2, 0x45f18fc2, +- 0x29d23c73, 0xdeb0dbb5, 0xfd1e7b3f, 0x479d13f5, 0xb680f92b, 0xf8645b47, +- 0x3e91edf9, 0x533e96f8, 0xed4f000a, 0x9fb017f2, 0xefbfe8db, 0x12bf4186, +- 0x037ed5e6, 0xfcd0622d, 0xacdef823, 0xf3b68f1b, 0xb43136a8, 0x255e9feb, +- 0x27a55c72, 0x0bfeda2a, 0xce3b403a, 0xfdcbd6ea, 0xd03e5d78, 0xedd6ea96, +- 0xe50bf003, 0x482c527b, 0x9ce52f40, 0xc7247a7a, 0xefce811a, 0xf461e088, +- 0x157ab026, 0xefc54e96, 0x00ec3241, 0xae7e603d, 0x5b9e6f4a, 0xf972a5de, +- 0xe4c87fd4, 0x9aff287e, 0xda272ace, 0xc4c0951f, 0x780bf344, 0xd96b7e6e, +- 0xa7779074, 0x5e1f6c4c, 0x605c0a48, 0xda931494, 0x3e43d01c, 0xa07ca626, +- 0xffc98ffb, 0xec696576, 0x05261181, 0x8d60b3e7, 0xfaa41f7e, 0x545f2e93, +- 0x9217cfaf, 0xce80921b, 0x1264eb0b, 0xf51f8012, 0xc62689e5, 0x6aa4450f, +- 0x2b0fec15, 0xdf313db8, 0x74c1a44d, 0x1ebb157e, 0xe74799cb, 0xc989b971, +- 0x2ebed56f, 0x2ff36049, 0x7c54696d, 0xd683fcb4, 0x415c9fac, 0x15687da0, +- 0x3b8219f8, 0x4f26ef04, 0xd0fdfc5f, 0xabe71bf9, 0xec7d1fee, 0x8a8f3e7c, +- 0x142f82cd, 0x6f191f63, 0x13fef812, 0x035e3844, 0x99e8d6eb, 0xa8387337, +- 0xf28679f9, 0xeffe430a, 0xa244b7a6, 0x8223b7a3, 0x40d366ff, 0x5fa05f46, +- 0xf1445209, 0xa7fd23ff, 0x9e7fe9f4, 0xb13fdc69, 0xffb421ff, 0x15ff5d1c, +- 0x47fed4ff, 0xddff99f4, 0xd8affab1, 0x906775b5, 0xe7d29bca, 0xba11761e, +- 0x6a929cff, 0xff14bc93, 0xba569be5, 0x4a4e0e80, 0xf3d01741, 0x1f9890a9, +- 0x3f57618a, 0x3e0f4bd7, 0x0f760087, 0x3ffb4afc, 0x3303f4fd, 0x62f97f60, +- 0x7b46ec93, 0x6c39b366, 0xd95afca6, 0x8c9d325a, 0x9631fcc5, 0x0889fd5f, +- 0x7d3d36f9, 0x70f53e96, 0x28c7f812, 0x3f7d70a5, 0x6552fa8c, 0xb07947d3, +- 0x044804ff, 0x0ed8ccf9, 0x80973fc6, 0x129e71f2, 0xce9cb7d7, 0x00f0f513, +- 0xf5a04b87, 0xf0444f81, 0xe64e924d, 0x2fd434a7, 0xc84f7ae6, 0x4e3c4ce4, +- 0x6ff23c55, 0x5e40dfe4, 0x2120f0aa, 0xbb88f7a6, 0x760b1b1e, 0x7fd3576b, +- 0x9c0d04b8, 0xdb3b3e54, 0xe7f1e0b2, 0xe3cbfd3d, 0x45876e6e, 0x9db085db, +- 0x6beb8da7, 0x972d2ced, 0x63f02ec3, 0xdeca3796, 0xbe5cfd20, 0x1f2789f5, +- 0x6df23b05, 0xda62f7b3, 0x97d6d97f, 0xe6813cfe, 0x89c9b6cb, 0x1c32d9d3, +- 0x2f145242, 0x696ffa01, 0xa50f1466, 0xf1497fbf, 0xefdf618c, 0xa3e2884d, +- 0x857edb6c, 0x8f0be98c, 0x95fb2d29, 0xbc0c474e, 0x03cb1cb4, 0xf5dc4abd, +- 0x3f78028d, 0xc9204fb5, 0xd9e031e9, 0x07ea12f8, 0x23c42700, 0xde2f53c7, +- 0x1403f50c, 0x55cf202f, 0x97cb193c, 0xfd037973, 0x3d234679, 0xf83cfb3f, +- 0x7b31df7d, 0xcfc5fd61, 0x7582e9de, 0x18aa909c, 0x32b63f5d, 0x2dc747c9, +- 0x6e498396, 0xe2f7d94c, 0x7a433f0d, 0x67fd7a2b, 0xf35ecc49, 0x6f709aa5, +- 0xfac2a60a, 0x8cdc3516, 0x7e242beb, 0xc7e2bba4, 0x8f9002c4, 0x7f244b9f, +- 0xb8be0c5b, 0x717c6458, 0xb4552362, 0xd04efae8, 0xa0fd076d, 0x6d0c5bff, +- 0x1dc57f42, 0x67fff804, 0x2c9affaa, 0x16e7fcc6, 0x4dafa786, 0xb54f9eaa, +- 0x36bd2d3c, 0xfc00eead, 0x4bea1e9c, 0x80573f06, 0x0f0e4148, 0xafda3be1, +- 0x64b4faf8, 0x91e21f86, 0xaa3b7872, 0xef814c07, 0xf643bf50, 0xdaeac759, +- 0xa3d2ef91, 0xe3e12fe3, 0x60db79d3, 0x44913eff, 0xac625b8a, 0xf2a8a66f, +- 0x35c7dd3d, 0x6fe1a5f4, 0xf74defc6, 0xf956fe31, 0x1f33343d, 0x837b3fca, +- 0x83b40ff1, 0x2bce91fd, 0xfbe58c9c, 0x1e50126f, 0x16384998, 0x9cc9375f, +- 0x2ae5f5af, 0x4b79d09d, 0x5e869c42, 0x8404ffa0, 0x0ab7fa3f, 0x8d3b68eb, +- 0x78c00cbc, 0xa9fdbeae, 0xf9c45b7c, 0xf9ea23df, 0xbe30349f, 0x0abf5fef, +- 0x2e573ee2, 0x147c9e87, 0x67f295f8, 0x2afc03d0, 0xcfbac017, 0xf3fc1f34, +- 0x9c9f294f, 0x54f95169, 0x7c8d3f2f, 0x5c7dbc5a, 0xb33d3e4c, 0x9f362336, +- 0xf931efd2, 0xd3e32d74, 0x53f25bff, 0xc03e5f85, 0xfc28f2ef, 0x1fd87954, +- 0xf0f28d1c, 0xe1079323, 0xf4879469, 0xd3920de7, 0xba54fe97, 0xf4ade953, +- 0x408b8a99, 0xa5d2f4ee, 0x74bd774a, 0x1f5dd2a9, 0x7e0e88ff, 0xa004f2c6, +- 0x05274a05, 0x0de48fbb, 0x6f2cf8a6, 0xb440e767, 0xa790cbdd, 0x36e1f270, +- 0x1e5f6a46, 0x87cda89c, 0x4316f90c, 0x5f219f7d, 0x37efa860, 0xf50cabe4, +- 0xd03fcc43, 0x48215076, 0x7d5d6107, 0x3a093979, 0x57b72fc1, 0x87affb44, +- 0x6d1579ce, 0x1e9cd3df, 0xb079520a, 0xeaeccad2, 0x156540c8, 0x771eafc8, +- 0x790095c4, 0x7b6bd32b, 0x78ae220a, 0xac787e8d, 0xdbf9445d, 0x5af92219, +- 0x1f94457f, 0x9d7f106a, 0xe672bfa4, 0x3a269c67, 0x3d8296d2, 0xc17a2b59, +- 0xecb85d44, 0x3cb81716, 0x5f87da7a, 0x5f7e8b3f, 0xe3c45874, 0x6b9b1e8b, +- 0x048bcc2c, 0xc6aa527d, 0x8249382e, 0x7e089dbf, 0x1f6676c3, 0xd06b5c2c, +- 0xa45ac82b, 0x12c7428b, 0xd522e405, 0xfbd7dfe7, 0x977d194d, 0x1b8afef2, +- 0x7b6ae5f4, 0x3b023938, 0x5f49b4ad, 0xce76e7ee, 0x67bd2a93, 0x17940c90, +- 0x7d80c060, 0x34ebe5cd, 0xb3f5f471, 0x0e7bfc28, 0xe5e80489, 0xf088bb6c, +- 0xceccdb3f, 0x20704909, 0x89254df2, 0xe1535ca0, 0xa17c05d4, 0xba772ff4, +- 0xe735fc76, 0x7ca55a1e, 0x7f63bbe7, 0x9daed347, 0x03dc8f6f, 0xa66f5df9, +- 0xd6fa4bbd, 0x8acfb29f, 0x7d9ed9fe, 0xe94f3c4e, 0xda6afbd9, 0x6ddf903d, +- 0x7b3cc2f6, 0x16397df6, 0xb967a7e8, 0x56e418b9, 0x7f8a50cf, 0xfdecd69a, +- 0xee276c72, 0x6f102b93, 0xd30a8baf, 0x76ffda73, 0x94844854, 0xfff60aae, +- 0x33f4767d, 0xa2b79e04, 0xef67a07f, 0xc77e3997, 0x953d6f3f, 0xc7a4dcfc, +- 0x876d6649, 0x7f33c5f9, 0xf8cf6073, 0xb9c19627, 0x657eeb6f, 0xf29f2d01, +- 0x416337c2, 0x676cf61e, 0xdcb74d7a, 0x05ce01b9, 0xeef352fe, 0xb9c29932, +- 0x1062981b, 0x862bb995, 0x623a0e4c, 0xf41be5c1, 0x3c285c7b, 0x067ffd3e, +- 0xf79e021e, 0x433bb795, 0xfdd60116, 0x4177d1d5, 0x2333ec0e, 0x3debaa5d, +- 0xf50cb2d3, 0x3badf38e, 0xf5f66241, 0x0b759cff, 0x77590be1, 0x8daff486, +- 0x07a25def, 0x83e462f1, 0xf7be74be, 0x756fcc2e, 0x17be717a, 0xff33ef48, +- 0x83ffd7c5, 0xe29dbef1, 0x75fe75dd, 0xaf8bfd57, 0x1fbc7fbb, 0xeef1c39e, +- 0xc0f57386, 0xfce0df0b, 0xab9ca87e, 0xf7e717fd, 0xeaafd6fe, 0x79307fe7, +- 0xf5a0c8de, 0x03ad49f3, 0x2a6b8b14, 0xa0ce1c0e, 0x72187fa5, 0x3be61e30, +- 0x18c39f99, 0x125fb7e7, 0xc164fdb0, 0x891d7684, 0xc75db817, 0x5cc1a1ec, +- 0xa4bc187f, 0xc190f510, 0x7a641e43, 0x83a9e483, 0xa43fbe73, 0xcc62f02d, +- 0xcb7cc902, 0x95f7790f, 0x0bb7af3c, 0x1f10277f, 0x4e0e411c, 0xa043f7fb, +- 0x22190e9f, 0x534afea2, 0x745f5bd4, 0xe5efb3e5, 0xb97ece8a, 0x67b7a3c6, +- 0x76f512f2, 0xdfde54cf, 0x3fe6c234, 0x428421cd, 0x87930e14, 0xfc1126fe, +- 0x962f939c, 0x79f34089, 0xec02bfc4, 0x7d0ea984, 0x19c18f7f, 0x580fc68c, +- 0x16bb6964, 0xaf16dffc, 0xd25dfd80, 0x62794265, 0x0e9016c9, 0x984bd546, +- 0x1ee4dd7f, 0x719e7007, 0x7733aec5, 0xfa97f013, 0x528f1614, 0x5fdefcc0, +- 0x44ddf77f, 0xf0e2e388, 0xaeffa22b, 0x036eff03, 0x7ae8db09, 0x18244917, +- 0x4efe0097, 0xf3afbc81, 0xf0f3ea77, 0x68a4e3f3, 0xdfabe73f, 0xb3fe1d1f, +- 0xee945dd3, 0xdbb0a7df, 0x1c08e90d, 0x53dad25e, 0xe0ced6ff, 0x84857815, +- 0x6ef3b186, 0x2e7340b1, 0xeccca974, 0xd97f5dee, 0xccf6059e, 0x71d19ea4, +- 0xa0471f8c, 0xfae0197e, 0x89e259e5, 0x1f803af3, 0x79e1c787, 0x19d121d7, +- 0x0b6bde2b, 0x819eb3b7, 0xf69a5073, 0x115a9134, 0x41127df4, 0xc9b05dff, +- 0x88c53642, 0x4d94483b, 0xe39c5cfc, 0x3988fe8d, 0xe36787e0, 0xe34da22f, +- 0x9aeb78b4, 0xdb1a4a7e, 0xf3f00f17, 0xe21ce6be, 0xd82f851f, 0x2ddf0075, +- 0x82bcced6, 0x923b7c18, 0x81c66fc3, 0xbe9ed0af, 0x04d1bdac, 0x93597e7c, +- 0x969e7749, 0x3dfd7326, 0xbcc26493, 0x3ab01c66, 0x872f01b3, 0xd9c42f44, +- 0x513fda05, 0x83ce31fc, 0xfe84f08c, 0x9b7a8fc1, 0xed7846ec, 0x00165b91, +- 0x6c7cf75c, 0xed676021, 0x62cb6a56, 0x0a4ff3cd, 0xd222e79b, 0xf4d8e772, +- 0x4ef83d7f, 0x278471ea, 0x44d2bd83, 0xd2fbaf90, 0x3e3a411f, 0x408499bb, +- 0x037d831e, 0x336ce172, 0x8280fdc1, 0xd3b041e4, 0xa55fbf28, 0x692fdfb5, +- 0xec0cf6db, 0x82ed9523, 0x95cb5c1b, 0xfe02a752, 0xbc5b40b9, 0xc33b7208, +- 0xba21c6a3, 0xe1a4dcc7, 0x0964db8b, 0xc2707be1, 0xdc615b9e, 0x0214bb4f, +- 0xc5ef9afb, 0xfee40b88, 0xc859eda7, 0xebadfd07, 0xdae4d5f7, 0xc3f412a9, +- 0x1e919ae4, 0x74db3746, 0xff442bf9, 0x19afe020, 0xde25cee6, 0x96fbf818, +- 0xcb05d9d3, 0x67ffd0b7, 0x550dedf2, 0x02c5f9be, 0x2cbd1f0d, 0x23557db3, +- 0xc96392df, 0x2782c5b7, 0x78bee019, 0xc064f0ef, 0xf2c3e2eb, 0x6df258c0, +- 0xdf3b356b, 0x8fc78e7a, 0xf952b4f6, 0x7c8d23f6, 0x2df2a56b, 0x8b7ff9c6, +- 0xcf5ffaac, 0xff42df23, 0x15b7fc3d, 0xf58c5be4, 0x53f0e41e, 0xf6d8dbe5, +- 0xc6df2863, 0x71749ab6, 0xdccbcf96, 0x7cafd99f, 0x04de0613, 0xd921d4fa, +- 0x3f418f6b, 0xf6feb95b, 0x819f8f1c, 0x7dce4071, 0xdce503f5, 0xe72a173b, +- 0xace09bfe, 0x3bc5b9ca, 0xf69fc608, 0xe72643a5, 0x72a6ef16, 0x647a004e, +- 0x5ef16e72, 0x0638fcc2, 0x8faa36f9, 0xbf58237c, 0x07dacc32, 0xb91fd2da, +- 0xe997f68d, 0x5a16bd93, 0xef2a333f, 0xdde569c6, 0xbbc9fd57, 0xef261743, +- 0x47797076, 0x9030d8e5, 0xf0fa46af, 0x74e3ebb6, 0xd13f8cf7, 0x97e07bfc, +- 0x673c4557, 0xcec4dd7a, 0xfe34fe05, 0x57d03644, 0x33e6c281, 0xd7f46142, +- 0xfec41d5d, 0xd6c8bca7, 0xf160e157, 0x4cad95bb, 0x166cac3f, 0x6bfa1e42, +- 0xf0af84de, 0xaf64a8bc, 0x7e699240, 0x27d599a6, 0x24e7a94f, 0x86867a64, +- 0x96e6161e, 0xa1777fa1, 0xbfe02c44, 0x9de4732d, 0x2cb63d02, 0xcb7bf997, +- 0xc392f7f8, 0xdfc0ab9d, 0xc05eb259, 0xee353273, 0xecbf8d50, 0xbede5e73, +- 0xc681fd0c, 0x3c19f373, 0x33c6664e, 0xc631a842, 0x66d97fb9, 0xa71a7e7d, +- 0x276299e7, 0x26bc8bc2, 0xe0c5377a, 0x2f5eb51f, 0x38710e9c, 0x9fb88935, +- 0xc289c2f6, 0x17de93cd, 0xd3d3144e, 0x70a29233, 0xae957929, 0xf5ffbb37, +- 0xae3370aa, 0x9677f55b, 0x83fa7ef1, 0x3ee70a83, 0x2770e7eb, 0xd2728424, +- 0x95ab8f08, 0x16683f5e, 0xba50a7c4, 0xfc133941, 0x0d7188a3, 0xd62e9305, +- 0x8eb843dd, 0xed564fd3, 0x8c7029a4, 0x7de2133d, 0xfeaddce1, 0x6e21978e, +- 0x9e5bdc6f, 0xaf4ed84c, 0xc3f66098, 0x6b16dbf9, 0x4aa0e504, 0x87408d87, +- 0xf0f7ae14, 0xaa0cf67e, 0x61768c9a, 0x3d06e09b, 0x22b61024, 0xae14035c, +- 0x20242f70, 0x2806fc31, 0x1dff023d, 0x8305ff5c, 0x03c15ee3, 0x753c80fe, +- 0xd0bc02bf, 0x0ced59fa, 0x8090812f, 0x1126c978, 0xd657bbf4, 0xc030de0b, +- 0xe111adaf, 0xfa67caa7, 0x49e2d0e3, 0x2c52bf43, 0x9a4ac5fa, 0xd78cb2fd, +- 0xfdae619b, 0x8cf3d033, 0x88d264a7, 0x7dffa6e0, 0x279f3d1f, 0xa788c3fe, +- 0xb6bc39c7, 0x001d3c02, 0xbbd308b7, 0x3de15fc2, 0x203cb515, 0x9cf07505, +- 0xefb9e8f2, 0x1538d785, 0x20c7405e, 0x89e7dadf, 0x136c2f90, 0xbef480c8, +- 0x307385eb, 0xec97bf2d, 0x7ffac63d, 0x1892f04c, 0xba60beeb, 0x8b9e87ee, +- 0x7f82dd29, 0x36ba3fbd, 0xe151a9c2, 0xe7a726fb, 0xaf23593f, 0xef3d0164, +- 0x49cf9015, 0x3ceebc7b, 0xf4c2bf6b, 0x4a562d88, 0x91dd74f7, 0xa377b2c3, +- 0xd83cafa7, 0xf60be1ce, 0xd01ef683, 0x8810b0a5, 0xc16cdc0f, 0xc79c2f38, +- 0x6a9fa630, 0x2b56f3e5, 0x76537819, 0x7987fdff, 0x47e9fdff, 0x8c0c7e6a, +- 0x6dcd7107, 0xd151bc74, 0x83fb8cf1, 0x6f9ff76a, 0x3972af5d, 0x4baef7f7, +- 0xc687e71d, 0x074804c1, 0x878d55e2, 0xc7f82239, 0xe5cfa0c8, 0xae3e920b, +- 0xd6e5c22c, 0x1fffdc3f, 0x927fafbf, 0x4e7bc6e2, 0xefd5ba77, 0x02cfa46e, +- 0x41e7e137, 0x7d84df13, 0x3b1f53ff, 0x9136caf7, 0xff611323, 0xa0132c98, +- 0x915f4fab, 0xe9f96fd1, 0x79671654, 0x2507abfd, 0xcf5cdd70, 0xf5c8a162, +- 0xb3b404e3, 0xc7ae875e, 0x216e1e83, 0xbf0891be, 0x954fb82c, 0xc53b54d1, +- 0x733af943, 0x5206a873, 0xe24894ef, 0x936f009f, 0xeb780244, 0xe2980df0, +- 0x3f3bf9a0, 0x32e01922, 0xb601faa3, 0x06443ccf, 0xbe09bd42, 0x8cc66881, +- 0x8decfd6f, 0xc63ce91b, 0x3d7a22bf, 0x83ccdeb4, 0xfaa1070e, 0x1306a8f4, +- 0x35e06bf1, 0xc06a8481, 0x43fe346f, 0xef308ddf, 0x40efaa62, 0x7b717efc, +- 0xf20b8d63, 0x0fb6020d, 0x2e79fd04, 0xf5ad9eba, 0x0e5de49f, 0x83d68172, +- 0xac0d026e, 0xf049a05e, 0x616a4842, 0xe5053afb, 0x17809346, 0x0486b6bd, +- 0x86fd6162, 0xaddfb42c, 0x367db40d, 0x3db45fec, 0xc9f4dbf4, 0xdc82371b, +- 0xf6c4f3a1, 0xb63ceccd, 0x00f3b690, 0x81dd34bf, 0x083495fd, 0x1419ee04, +- 0xa97db337, 0x0bd915f8, 0xd7fbade5, 0x9d3b7ee3, 0x0e9a978e, 0x2a7850fb, +- 0x12c8d7de, 0x6d8f78dc, 0x5fc450fa, 0x23f8610f, 0x1c984389, 0xdb9e7813, +- 0xf7deaa3d, 0xe430f32b, 0x32ef4283, 0xe7ed0065, 0xd303b94f, 0x9f57484d, +- 0x7da7a028, 0xa7ede148, 0xc79d7ef0, 0xfdcc1c29, 0xecd4e940, 0xe1e6cd8b, +- 0xdb617ed8, 0x5a7f8c24, 0xfcf00a44, 0xa678c67e, 0xa576be6f, 0xbafe0435, +- 0x10c8e4d7, 0x4af07ef8, 0xdeef7e33, 0xf770e4ca, 0xcff44ed0, 0x0990689e, +- 0x69a82fdc, 0x9c5e5110, 0xbcf19668, 0x464c7c5a, 0x95b45db9, 0x1b071fe9, +- 0x4027bf58, 0x393f036f, 0xd17cd394, 0xfbdb8116, 0xf6ab4e4c, 0x9d9ba167, +- 0xb772abbb, 0xcfbbaf82, 0x4cb7543e, 0xca359201, 0x8f2e0adb, 0x02a4a94b, +- 0xddca3342, 0x7577380a, 0xe31a5f01, 0x3b511c83, 0xfc20e806, 0xe575d215, +- 0x3b01322b, 0x2ba0f846, 0x6a7de60f, 0xee7e80af, 0x0f82edf1, 0xdf8bbdce, +- 0xff508732, 0xfb9bcd0e, 0xde5fd80b, 0x55081336, 0xa0780e3d, 0x1cd72a72, +- 0xe86fcbf9, 0x5baf53f7, 0xd2841220, 0xbb843ccd, 0xbd99df1a, 0x6471c589, +- 0x04975ebf, 0xd4c92cf7, 0x8a072801, 0xd7e245ea, 0x825389c8, 0xb29fc6ef, +- 0x8dadc1fd, 0x6a56cce3, 0x3d7f610b, 0xd1f2666a, 0xd88649b3, 0xccd2b208, +- 0x0fb534e4, 0x64b2fe30, 0x4524baf7, 0x7b250743, 0xf48925d7, 0x071e2afb, +- 0x2bfb0351, 0xb0a2576d, 0x09f64a71, 0x38cd46ee, 0xbf6a3f6a, 0x6ed66eca, +- 0xf6965ef8, 0xcc097fd7, 0xb9f9d70f, 0xd8c2f202, 0xfbf19f4f, 0x3ff727e9, +- 0x7409d5cf, 0x89afb95e, 0xfb9ca418, 0xdae1f4c1, 0x55350073, 0xde7215e3, +- 0x069f1130, 0xb17fb97e, 0xdf069f11, 0xdf28e3ad, 0xd75dfc53, 0x02ac8426, +- 0x15298fe4, 0x037798d9, 0xff72579f, 0x7654e573, 0xf19ad3be, 0xfbe00afa, +- 0xd202d9e9, 0x95fa0903, 0xafa88901, 0xb8ce2079, 0x2fb59b28, 0x1f81eda2, +- 0xfe33d75b, 0x03c272a4, 0x61b2a472, 0x6fd61e5d, 0x7fd03c12, 0xd43ce36b, +- 0x45738a47, 0xc74de582, 0x6e2a3f50, 0x7c08963b, 0x0eb6f94c, 0x89ca81f4, +- 0x71c83766, 0xfe551f95, 0x05c78d7e, 0x0c7b8b13, 0x0067e3c4, 0xcbec0df3, +- 0x4c2be2d7, 0x199a07ae, 0x1972063f, 0x55b6bebf, 0x085e1586, 0x9f3f237f, +- 0x55f8ccd8, 0x3ce6ec7c, 0xb45ca7b8, 0x1ca7c589, 0x80a2986c, 0x24227d3e, +- 0x97d37ee0, 0x6ade99bf, 0x811aefe4, 0x543f7bed, 0x5bf954bf, 0x73fa63e5, +- 0x4e578c1d, 0xb5ee14f9, 0x867af919, 0x3be7f2dc, 0x7faf7ce9, 0xce87ae96, +- 0xef8fca77, 0xe46a7576, 0x4127cd24, 0x716250be, 0xa95caa3c, 0xd7bc5890, +- 0x619f9e0f, 0x7acd1bfc, 0x734ac8ff, 0x6e6b8b3c, 0xcfee9192, 0xf87d9fc7, +- 0xf3f902ec, 0x7ceaf942, 0x2f8ea9fc, 0xb3f7d5ee, 0xb19bd392, 0xd70a6ebf, +- 0x1feb8530, 0xb8c09f9a, 0x3e9f8fb1, 0x53f00336, 0x39d287b6, 0x93b357d0, +- 0x49ce4184, 0x4aafdc21, 0xc61f455b, 0x9ce14abf, 0x3e5a9d1b, 0x653e7166, +- 0x9e9139cf, 0x439bb74a, 0xd2fb69d3, 0xc58c1f9d, 0x11e58bb8, 0x3e0a438c, +- 0x60e5f5cd, 0x83e058e7, 0x1bc58952, 0x00c2e519, 0xe8673b0b, 0x059f6dda, +- 0xb33613eb, 0x2da5fd7b, 0xcd66c8b7, 0x22cd84b9, 0x1cf0f5ab, 0x18e94830, +- 0xfcc255ee, 0xd5c9f7b4, 0x2daea338, 0xb6944e4c, 0x960768c9, 0x0dd6de6e, +- 0x6fa5a371, 0x15dfd199, 0xc609fcd8, 0x6e794fc1, 0x0253fa2b, 0xfceea26d, +- 0xdebc4fac, 0x866c3166, 0x0ad6b378, 0xf9a3ef3c, 0x896f9863, 0xbe7ab71d, +- 0xe7b2b2b8, 0x520ceef6, 0xfefd9610, 0x97c81729, 0x5c9b1dd3, 0xf9b7b718, +- 0xfb65e3fb, 0xdcb5e7c4, 0x79f1bdf7, 0xca17e1a7, 0x862d1338, 0x03cdc6f8, +- 0xf3a48f50, 0x718829cb, 0x97abd1ce, 0x037cfd6f, 0x6d778fc4, 0xe601b33f, +- 0xa7edfe5b, 0x887e201b, 0x7ee2b3ec, 0x08fa7817, 0xedaadfc6, 0x7ee1627e, +- 0x614f2d8f, 0xdbf772dc, 0xd6f42f66, 0x1a44f7bd, 0x6f758fc4, 0xfc092afb, +- 0x4ef64b96, 0x92eebf43, 0x4992531d, 0x4d42fd8c, 0x17436e81, 0xc46d3710, +- 0x83d6c1d7, 0x31f4e718, 0xbfc837c5, 0x96cb78de, 0xeabf160a, 0xcd9671e1, +- 0xfbd3e3b1, 0xdeb655c4, 0x2095fd78, 0xfe995bf7, 0xcaf8de78, 0x7f1e2837, +- 0x6bf80174, 0xb102fd56, 0xfc31f7f1, 0x76e21e32, 0xbcfbf8f5, 0x8fe3d175, +- 0x80eb5942, 0xc32be37e, 0x35370017, 0xc5927dfe, 0xbe016d57, 0xc60cfed9, +- 0xa6de02b3, 0xf9ff607b, 0x0dee0d3c, 0x7323949c, 0x5ed93ef0, 0x09e21bb3, +- 0x89bef74b, 0xe3bdd3fc, 0x1343f475, 0x4dde871e, 0xdc587f7a, 0xd9d7c0b0, +- 0x997164e4, 0xb710fe1c, 0x77e171e9, 0xe8c99f1e, 0xecdb8d58, 0xa7735e2f, +- 0x6ad9e985, 0xd3457e5c, 0x31fe3cbb, 0x17212f8a, 0x7bec74f0, 0x70a811ef, +- 0x1c397370, 0x1d8e3f8d, 0xa71bdb17, 0xf805f1ce, 0x37a87d83, 0x87e698be, +- 0xe8dfa264, 0x1e43124d, 0xb8b23774, 0x7f596ee5, 0x1f8a33df, 0xcdbc8f16, +- 0x0ba1a7c8, 0xdf3e438b, 0x7c287ffc, 0x33f28236, 0xba9c2fb0, 0xc72d8ebe, +- 0xff7ce0df, 0x5967df77, 0xb3ef1828, 0x63d027fc, 0x0531eb45, 0x3b5ee0ec, +- 0x8bb7af9b, 0x9ebbd5fb, 0x759e3116, 0x9441cb55, 0x517946e3, 0xc458ef09, +- 0x0b71ef98, 0xd8dbc3d7, 0xddb5d13e, 0x7ed07219, 0x46ec0eba, 0x3e6cae7a, +- 0xe09c40a6, 0xaf7f9bcb, 0xc629f3b0, 0x844fb03f, 0x7aeff334, 0x1658ff76, +- 0xf8fccd6f, 0xe33e71c6, 0x63da04e3, 0xfe68138f, 0x594e3744, 0x3b7145b0, +- 0x69de3fce, 0xf40b77c9, 0xe983ba77, 0xc45ba783, 0xb9f758fc, 0x66fbe4de, +- 0x743d7bef, 0x4177c4bf, 0x101dec9c, 0xfd4365d1, 0xf7338972, 0x4844b8ad, +- 0xa9ef8c15, 0x81e3c659, 0x014de97e, 0xaf38d77c, 0x95df3025, 0x9f8d5f00, +- 0x09fb7647, 0x4a72a5e8, 0x15f83641, 0x4946f28c, 0x06909134, 0xf99c4bff, +- 0xef3c1ec9, 0x7c010f08, 0x2138cd1e, 0x19efbf43, 0x49ef54fc, 0x9d325564, +- 0xc1417bdf, 0x4bf68cbb, 0x6860febe, 0xff6fb381, 0xaf7fde6a, 0x552bf3a8, +- 0xc147239a, 0x582f212e, 0xdc41be31, 0x17f7c567, 0xb8ac1b02, 0xbe3b83de, +- 0xebf5127c, 0x9d84cdc7, 0x85eb50fb, 0x9b915fd2, 0xc76271f5, 0x06fe1b97, +- 0xa63433fa, 0xa06d17e3, 0x686ec1f5, 0xd39da3b6, 0x2c6e3db3, 0x5e8a45f8, +- 0xc80667b8, 0xa33b22b3, 0x92e7a2c7, 0xbfb43543, 0xfe5903e3, 0x78a1d6f8, +- 0xbb6cbfdf, 0x0f0ce313, 0x0955d8ee, 0x73f752fb, 0x52fb0276, 0xcf5c0bf7, +- 0x1fbf867f, 0xb47b2f54, 0x4425c6f1, 0x71ef68f2, 0x959e4194, 0xfc107de3, +- 0x047ce1c9, 0x38b6aafe, 0xf541ffbc, 0x1f3f5d5f, 0xbcbb91cb, 0x41c1c748, +- 0x784bdeec, 0x6303c810, 0x4afcb53d, 0x8f7e30eb, 0x4473b698, 0x489407eb, +- 0x0ed7cb21, 0x03a4f262, 0x656b5feb, 0xf796affc, 0xcfd597ed, 0xd5d30eb7, +- 0xf257db53, 0xf48c41f7, 0xe055b37b, 0x2e6fc1fe, 0x45fef589, 0xf7e3f98c, +- 0x6824099f, 0x9b653d02, 0x8225df15, 0xdf10f37b, 0xe76153be, 0x30aee55a, +- 0x87b23fbe, 0x5b72e3cb, 0x1943df18, 0xf501e7c4, 0x9d2c4f21, 0x56bbe2cf, +- 0xde04acbb, 0xc178a9c7, 0x577c03e9, 0xf8f2fcec, 0x8e21b2ef, 0xd4718ecd, +- 0x1cfc2f15, 0x1cc2a0e9, 0x10fc039e, 0x1b2666d9, 0x1db7cf81, 0xed7e034e, +- 0x0969c392, 0x575e73df, 0xbc3662d1, 0x71d6c01f, 0x0afebaba, 0xdeace7b8, +- 0x47ed2ca7, 0x656b3cce, 0x585fe87e, 0x78ad4b7d, 0x677fadae, 0xacf574e7, +- 0xaf57b82c, 0xc4b52fd6, 0xad6b8b96, 0x4f763ff2, 0x5ee7d1d8, 0x40eb5ae2, +- 0x923a63d0, 0x4953efc0, 0xe7906ef5, 0x87d39ba5, 0x80e09f80, 0xee77bd55, +- 0xe8fd8389, 0x7b41ec80, 0x3eed521a, 0x9bdab273, 0xff008d25, 0x892ca8cd, +- 0xf1a7a3ae, 0x0441c293, 0xb3ad0ee2, 0x0dbdc962, 0xa3c23b56, 0xc5f662d4, +- 0x0cf8d7ba, 0xc107d7a7, 0xc6c71fe8, 0xc750fe03, 0x5087203d, 0x79b70f0e, +- 0x2ed43f58, 0x9b65ef82, 0xdee96767, 0xb16a90c5, 0x8453e51e, 0x53a90967, +- 0x5bf235b2, 0x6964af1d, 0x05949676, 0xeaffa5df, 0x8a3157a5, 0x444c1267, +- 0x30e250bd, 0xbaa97526, 0x5c9204fb, 0x29f80160, 0x892dc0a4, 0xc8b52a40, +- 0x82d236ef, 0x5baa83a9, 0x2aa8fdec, 0x64f27202, 0x0417bbef, 0xeebc28d3, +- 0x1c1fb946, 0xe9c5c84a, 0x13dfff70, 0xafc0d6e7, 0xf9c2eacd, 0xc22aa598, +- 0x3774c5e4, 0xd04223e8, 0xf4a3be4f, 0x9f9d5354, 0x7f48f405, 0x0cff707c, +- 0x3f3a0f4d, 0xafe5fb97, 0x74a20f40, 0xfb59deca, 0x50d50931, 0x28f84310, +- 0x132755fa, 0x9ad83ef6, 0xded688b7, 0x6fe72bf8, 0x728fdc12, 0x3fa241cc, +- 0xb1079a11, 0x26b6f20a, 0x385cdbee, 0x49b87447, 0xbb42f418, 0x34ed8483, +- 0x4e968c75, 0x95dff96b, 0x3a1af34d, 0x97d44f75, 0xca82f91b, 0x2db8c335, +- 0xefda3f08, 0x3f7e8667, 0xd9fbf433, 0xc2abf5f7, 0xe8d96029, 0x5609f785, +- 0xb8701756, 0x1c2cf1b1, 0xa33e146e, 0x62337de0, 0x79f979b2, 0xc6d5c238, +- 0xfa866367, 0x6c83af14, 0x07a708e9, 0x2045f6e2, 0xd624966e, 0x577bb013, +- 0xa69f6c08, 0x4d0e053f, 0x20b6e23b, 0xc7c7de1f, 0xf4636419, 0xef5bdeae, +- 0xe78adf5b, 0x5bea7d1a, 0x8b6fabfb, 0xdfd9df5d, 0xe731ec7c, 0x4ce543f3, +- 0xfe6f0be5, 0x7b61ce09, 0x829b8de5, 0x6f274732, 0x9c28d906, 0x7f8fe22a, +- 0x985f89db, 0xa21968de, 0xe80d9fc7, 0x6d8fd295, 0x11bbfe84, 0xcbd1fdef, +- 0x9a0ebe3c, 0x75d2a477, 0x3f8f94fd, 0x639d89b5, 0xf984b6df, 0xe7b9a8dd, +- 0xf2b7fa83, 0x14b53ffa, 0x18e0ffa1, 0xb6e9177f, 0xde17a67a, 0xe788af76, +- 0xfdde7dcd, 0xff285f81, 0x0854bedc, 0xbd63d385, 0xe09a4463, 0x3e5cd47e, +- 0x205df1be, 0xade4f13f, 0x0bbd6311, 0xbd4ce8c4, 0x6f7c6557, 0xe0292160, +- 0xbfe93def, 0x91bab26f, 0xd61e410e, 0x4bee8e8e, 0x8e9475c1, 0x74a49f41, +- 0x70ece70c, 0x3ce3063d, 0xf38b0a5c, 0xe78a18e8, 0x3b3caa63, 0xe1c4f1eb, +- 0xd34deafe, 0x78b817bd, 0x5e3927bc, 0x73a5af23, 0x2b7bdd36, 0x0537b235, +- 0xee7c95e4, 0xa6a1e232, 0x1e8d42af, 0xea9ca68f, 0x10ccc8a1, 0x277284a6, +- 0x9c810a45, 0xa405dc93, 0x9958f408, 0x5f5aa7d1, 0x57acbc49, 0xfe8d7c6f, +- 0x878801bb, 0x3be2e5d2, 0xd728c93c, 0xe00b05ed, 0xf5cae893, 0xe97d1dfa, +- 0xad95b821, 0x9dd606bb, 0x353d77de, 0xfa8bd78a, 0xf7de84f3, 0x3f302c69, +- 0xd379ecd1, 0x0ffbf303, 0xa51f8099, 0x27bc7c2f, 0x677e1443, 0xde318343, +- 0x3e9b8c43, 0xdf57c612, 0x9d535c45, 0x2bade782, 0x2b897bf8, 0xfe6147aa, +- 0xe59efe7e, 0xa60f6aaa, 0xde2cfc2a, 0xcfc77c5a, 0x6ff58232, 0x24fc7371, +- 0xfc7c389a, 0x52592fa8, 0xd01cf0aa, 0xc30aaeea, 0x086459fb, 0xda6027dd, +- 0x9f845aee, 0x87e826e2, 0x6f31f5a4, 0xe54d3c86, 0x0f88d1fa, 0x8a455dc9, +- 0xddbe7968, 0xcdc020ff, 0x7ba419ea, 0x329cd01f, 0x03df7bec, 0xf5a7a5ec, +- 0x72262e4c, 0x27c2327a, 0x65ef6151, 0x9fd474aa, 0xe3c3555e, 0xf6ae1f74, +- 0xdfc35a62, 0x7781aa81, 0x3d48147f, 0xedc81f98, 0x470a1ac4, 0xdf08fef8, +- 0x73aa6b37, 0x972cfcb1, 0xaaa68957, 0x25c032fd, 0x66ff3081, 0xc90c9062, +- 0x14042c21, 0xc482527e, 0x9cf57903, 0xe6c69dd0, 0x7441e9cd, 0xdc77864b, +- 0x5e008f3c, 0x26cb0eea, 0x4b8b93f0, 0x681f25af, 0xe59c59e8, 0x99bf078b, +- 0xb00bf0e8, 0x78003dff, 0x4759f3a5, 0x96ef85e7, 0xc9587a72, 0xd39abef1, +- 0x1f407dc3, 0xd3907d34, 0xfae8afc5, 0x65e35f21, 0xe6d601f7, 0xc4b778b3, +- 0xc77f130c, 0xf1b44c2c, 0x16def164, 0x2275d0a2, 0xc5307a8f, 0x5bc8ea77, +- 0xfb17a466, 0xa113e268, 0x43bbadfc, 0x82c91dec, 0xe337d854, 0x272377d5, +- 0xe367e27a, 0xc4b0d545, 0x991373df, 0xf311d1dd, 0xef1ac67d, 0xefd80b01, +- 0xeec7cdfd, 0xa4afa5f5, 0xd9ebd9e3, 0xfe01c5bd, 0x688bd982, 0xf54f51de, +- 0x8ce5026f, 0xde741d2e, 0xc67d1a45, 0xbffd8fde, 0x51cd7ed4, 0x7be7c51b, +- 0xe45141b0, 0xb87ebaff, 0x614be015, 0xc73f01ed, 0x2a4172c3, 0xf1c3fff0, +- 0x8735fdb1, 0x83d2326d, 0x1d32fb2b, 0x3ec9d73d, 0x989ee76c, 0x3afba3a9, +- 0xa612772e, 0x577dd04e, 0x6defcce5, 0xb12eef4c, 0xbcc2cffb, 0xc5d1ce92, +- 0xbc4a7e51, 0xa9dcb621, 0xdc209591, 0xc319afdf, 0xa6705ce4, 0x3eabf4c2, +- 0xa7c98472, 0x6f32e4b3, 0x645f4350, 0xf03d4114, 0xee8a998b, 0xc035c1dd, +- 0x7e5e941f, 0x057ee9cd, 0xc54d01f0, 0x4dd20a11, 0xda1374c2, 0x5f38aba9, +- 0x68f9cfdd, 0x87a3e72d, 0xc2467f80, 0xdf8cae3b, 0x051de224, 0x8b8d48fb, +- 0xc0258fbd, 0x8d49b4ff, 0xe85cfe6d, 0xb32de6af, 0x350fe700, 0x11752f92, +- 0x977e29e4, 0xef8f307b, 0xedeb06ea, 0xbbf1589e, 0x9293ed4b, 0xc95e14ec, +- 0xdfbf8676, 0xfe2167d4, 0x316f6e2c, 0xd8724bac, 0x19afaed0, 0x658e2969, +- 0xbdecd81f, 0x53b74ef0, 0x9fc80f78, 0x817f6bd0, 0x666ea17b, 0x37fdc20e, +- 0x06399f70, 0x33b18cfd, 0x04864079, 0xff0d08c9, 0xdcf7f1d7, 0x46482788, +- 0xf2c0e469, 0xf808f38b, 0x7ff2fa77, 0x136ff23f, 0x02357f93, 0x780c57df, +- 0x5531f755, 0xd78049fe, 0xb9e77d01, 0xdd5ca2f2, 0xcb997b3d, 0x3cbd636f, +- 0x4f9d9dbb, 0x2fc46f11, 0x70a72df4, 0xce6bb3ca, 0x09c49495, 0x5d95efbd, +- 0x461d6315, 0xf61277b9, 0x9225903f, 0x5905df1f, 0x191e78a8, 0x8fe4f20f, +- 0x3fa5fe2c, 0xaf1d40fd, 0xee315ce8, 0x72e785f3, 0xae299f71, 0x20fe45cf, +- 0xd8d78de0, 0x7e1a2749, 0x9dbc02e6, 0xa3e7e7a8, 0xe208720d, 0xbc6ff652, +- 0x14d9a1e7, 0x88370b9e, 0xd7fefeec, 0x6a277ddf, 0xb6481be2, 0xf53af507, +- 0xa113b43d, 0x73da5d3b, 0x58dfc2ec, 0xf62fa07d, 0x3614cfb7, 0x6bdfb6c4, +- 0x53d057e0, 0x1e801f29, 0x4881f54a, 0x5f85f418, 0x08bdf15b, 0x68dc1f35, +- 0x540ef98f, 0x195a7dbe, 0xddbe67d0, 0xc4a42777, 0xfafe8091, 0x8ea1e6fe, +- 0xa67c1c7b, 0x28f64e70, 0x70a5b38f, 0x9ff3a99f, 0xe3b273b1, 0x2c421fdc, +- 0x78db94fd, 0x729fa7b9, 0x21678b17, 0xeae5d8ee, 0x3b714e7c, 0x7b46e170, +- 0xfd8c7968, 0xefbf217c, 0x479f90b7, 0xd53ff8a8, 0xba3137ab, 0x3f2ffb51, +- 0xdfe18a37, 0x53c26740, 0x3eae9063, 0x7fa3243d, 0x4aea784d, 0xf2a52f7c, +- 0x97eb059c, 0x415fde8b, 0x4d79161c, 0xf3bbba44, 0x873c38f0, 0xc3bc32ea, +- 0xb7f387b8, 0x2b9e169a, 0x8599e9d5, 0xec0a05a1, 0x2ae785cb, 0xde211e91, +- 0x1397ee11, 0x934bf6f2, 0x13574e24, 0x6991fda0, 0xa2bd69cb, 0x64bf464e, +- 0xfd12b062, 0xef768d84, 0xdae431fd, 0xe747bb1e, 0x2cea2837, 0x2389fec7, +- 0xe7351248, 0x7bf90bf5, 0xd8e745e1, 0x1dc4847b, 0xcf402924, 0xe944de5c, +- 0x6c6eff52, 0xcbe18997, 0xf857deb8, 0x5de95f3a, 0xd67e84ef, 0x5eb663fb, +- 0x7517cfbe, 0xf5d61ae6, 0xd6b1f1bb, 0x44cf5d15, 0xdfce5f6c, 0x31372df9, +- 0x9fe5abbc, 0xf4d5f1f3, 0xb82cf578, 0xf84a4361, 0xa185903b, 0xff78153b, +- 0x3e21b0a8, 0xb3acd041, 0x5d56fea8, 0xfd61495c, 0xaaff7c3c, 0x329e61a8, +- 0x7a47235f, 0xecfc14f1, 0xa22349a5, 0x81fcfa78, 0x1dcb699e, 0x1c14afb0, +- 0xfe3b3e03, 0xe79cc564, 0xf0cbf409, 0x8e095276, 0x72b942ad, 0x3dd62ba7, +- 0x788dcf94, 0x1b78e7ab, 0x35a32411, 0x97c54672, 0x4df1fdb1, 0xf9c17765, +- 0xecf5f1f4, 0xe5fe8f75, 0x1a7c6c4c, 0x3076e8e1, 0x71e9a9f8, 0x2ffb2fba, +- 0xeb978e08, 0x85fa9be2, 0x0abfc723, 0xd53bf527, 0x1c0eacab, 0xa37bb097, +- 0x0417b9f5, 0x8cf8e8bf, 0xbe2a4e3e, 0x7e41eb91, 0x7c093951, 0x07c9ea7a, +- 0xe5db6ac6, 0x840d27db, 0x85ed4871, 0x6fdd8f9d, 0xfd41a7f7, 0x21ef64e0, +- 0xd15bca0f, 0x5dd7435b, 0x7768f712, 0xdfab5718, 0x935656bf, 0x4a5fc12b, +- 0xc12b87ed, 0x05b5436f, 0xe6a8a3d4, 0x847d05e0, 0x7ac5f156, 0x83926a17, +- 0x5656b3f9, 0x95bfa157, 0x0dc48258, 0xf8c23d7e, 0x42cc9c92, 0xd0e497ff, +- 0xec8a01eb, 0x4dbf8377, 0x6591f7e1, 0x3d26bfc9, 0xc4d9ec1b, 0xbe06a08c, +- 0xbc583957, 0xc594dac4, 0xb7438841, 0x38719f80, 0xeace37fa, 0xa517fbec, +- 0xdd280385, 0xda7dcfa9, 0xe5cbe846, 0xfe8216c4, 0xbbf4d1b4, 0x74891e76, +- 0x4c7dbade, 0xe2c9170f, 0x890f73c2, 0x8715bf70, 0x7282fd07, 0xc3973578, +- 0xdc2eedcb, 0x645d567f, 0x8ea0fb42, 0x0b7ec3fb, 0x8b84307e, 0x84327684, +- 0x257d40dd, 0xb0eb882e, 0xd0447ac2, 0x7798c3db, 0x22328bc2, 0x4025b13e, +- 0x04789e3e, 0xe1200fc8, 0xf687a055, 0x0bbcea4c, 0xfd58a7be, 0x5fbf01b3, +- 0x151c76a4, 0xe05a0fc0, 0x5ce004bf, 0x3c33062f, 0x62e3feb4, 0xa5ea0324, +- 0x12b7a2d1, 0xc4117a58, 0xe735fb41, 0xce1dec2b, 0x9bec5e68, 0x64a968bf, +- 0xfaf86f38, 0x2ff96d12, 0x0762beac, 0xf656fbec, 0x07e24d7e, 0x9ab9ca02, +- 0x01773f5e, 0x71a9dbde, 0xd23d7f30, 0x21d5d005, 0x959f4fb6, 0xe809713c, +- 0xf5951b3f, 0x5e1e6ea2, 0x76e25e5d, 0x53a5134d, 0xf4ab8bf0, 0x99f24231, +- 0xae2e8e80, 0x78b5dfa5, 0xc15fa18c, 0x39fa2338, 0x47e7504f, 0x157a45c7, +- 0xfdb0e5cf, 0x7b0f40d6, 0xa0ff3604, 0x0fecced5, 0xaf011412, 0x93c255b3, +- 0x3c7cb056, 0xddf07f51, 0x3f55b7cf, 0xf2c15937, 0xcc0b966e, 0xc66ae767, +- 0x5f6eccf9, 0xe5fe01dd, 0x0ba9edd9, 0xb6659ce0, 0x208ff2e5, 0x0e4723dd, +- 0xfc4e41d8, 0xf9a3bd8c, 0xca2f23d3, 0xbc778a20, 0x43ef11b1, 0x71f9ce3f, +- 0x80c8890e, 0x2b713f7f, 0xc21e4fcc, 0x5e27cdf5, 0xc1916f9e, 0x1c2dbd7e, +- 0x9a3af9ba, 0xd0c5fdbb, 0xcd5a6075, 0x09791439, 0x716fe6d0, 0x5a2fa1e7, +- 0x7de6d76d, 0xbb59e599, 0xdff81c28, 0xb82c90c1, 0x2dbae8ae, 0x9d750708, +- 0xa3e226b4, 0xfdfc4e17, 0xbd2e1520, 0x7adfb6eb, 0xfb0bf82d, 0x2db36f93, +- 0x71623e63, 0x465e6cb9, 0x45067d38, 0xc3915ef0, 0xf2e807b7, 0x1daf8761, +- 0x12dca4f8, 0x21869349, 0x5f2184df, 0x4a2ffa29, 0x78f870a2, 0x8192ffa8, +- 0x018e8f00, 0xbe67a417, 0xd5fce9ca, 0x83f7def4, 0xbe99d113, 0x66c1f986, +- 0xb55b7a70, 0x9b8c4de3, 0x7b30f8fc, 0xf442a90f, 0xfa0f7f5c, 0x4b1244bf, +- 0x57d355ef, 0x2de61fb9, 0x9d1f7a87, 0xc48673ad, 0xd5a33de0, 0x667af78e, +- 0xfd3a8b64, 0xc0b6467b, 0xc63ad7e3, 0x4bd3a4de, 0xeeba7057, 0x11c40fdb, +- 0xb059fb18, 0x55da3274, 0x24f7153b, 0x0dc1ff90, 0x4c16ce8c, 0x671089f5, +- 0x808d613c, 0x1ff188fe, 0x87901276, 0x09e2ea0b, 0xb82f839c, 0xbc16717b, +- 0xe1d95097, 0x3904eb69, 0xe0bc1219, 0xef164b47, 0x9d25f8c8, 0xd807c3d7, +- 0x3bf90c3e, 0x9f0e9e60, 0x2bf1a1c7, 0x1955c977, 0xdbeba06e, 0x0b903e1d, +- 0xbdf26ef3, 0x922d780d, 0x76b5fbc2, 0x3cdbbcc8, 0xf31f40b9, 0x4c3eac5a, +- 0x51b2442d, 0x224f36b9, 0x15934816, 0xdf215922, 0xece7d4fe, 0x3bad86b0, +- 0xec2c46d9, 0x80afe1fb, 0xacdf2e4e, 0xa63dd6e8, 0x51ff9f45, 0x119f3e9b, +- 0x0eb3e7d6, 0x80b7f3e9, 0x87d1a31a, 0xe765ec0e, 0xd86765dc, 0x05e7c13d, +- 0x7fc083d8, 0x37b9466a, 0x073daca5, 0x3ccf4dce, 0xf94134eb, 0xfd986f9e, +- 0xc562d916, 0xbff6cbf7, 0x44b62363, 0xbad4c778, 0xd8cfca11, 0xffc0725a, +- 0xfc63eb44, 0x4735dd03, 0xf3b1fd82, 0x0cced532, 0xcec49c61, 0x7b9c596f, +- 0x04398b64, 0x7667b1e7, 0xd02cf53f, 0x832d99dd, 0x5e79ef51, 0xdfa09a08, +- 0xaf0c7de0, 0x9d2e6c13, 0xacdb29fc, 0x3846ebb7, 0x73d53e99, 0xf10b994a, +- 0xebd4974f, 0x48697dd7, 0x64ed1f9f, 0xd13e67f2, 0x73874f7c, 0x14aacf66, +- 0x48278ba0, 0x5983fbcc, 0x9f7f264e, 0xed515a7e, 0x33bf916c, 0xd1493c46, +- 0xa27b4f7b, 0x064b3fe7, 0xc0001c43, 0x7bf45862, 0xb55c6199, 0x7cb96fff, +- 0xfa7ee44f, 0xc222abc8, 0xb17574e7, 0x57b89cee, 0xa6f6ad3f, 0x33ecd54c, +- 0x93fbf585, 0xb85ea1e6, 0xd6be693f, 0x3072db2e, 0x738856e9, 0xdfe12cd9, +- 0xfd9f2a4f, 0x121343e4, 0x02d8bbe1, 0x1f7285f3, 0x2f2d1fd8, 0xd51ea0b9, +- 0x71b5333f, 0xe3f54523, 0xf66aa652, 0x974a1fd7, 0xbb4aefbd, 0xe5767c19, +- 0x1d78dc16, 0x835977c5, 0x656a85e8, 0xfbff372d, 0x837b8018, 0xcb5cf78c, +- 0xbef8c9b7, 0x0af1a079, 0x359413f4, 0xef879ebf, 0xe79fade8, 0x48e57985, +- 0x44cc40a4, 0x904dc0d7, 0x81df6c9e, 0xfd95d5ef, 0x3c914eb5, 0x7d3d5f30, +- 0x3f437a50, 0x7280d517, 0xf01e006e, 0x54f8c32d, 0xae11bbf5, 0x7b7d2125, +- 0x17febe23, 0x33fa37a7, 0x63778b4a, 0x83d301bd, 0xca4877f8, 0xa3b95297, +- 0x3fca2fb1, 0x38f8c5ac, 0x542838e3, 0xb0d0e735, 0x1f90797f, 0x271f7cad, +- 0xc7872582, 0x79670e8f, 0xe80f377c, 0x197fd60b, 0xfb81ea99, 0x7c90378d, +- 0xc2179f48, 0xe322890f, 0x6c3bf46b, 0x775f23b5, 0xfc9f3bb9, 0xf343d01d, +- 0x18c73c18, 0x767befc4, 0xdef8c279, 0x0ff7faa0, 0x5f2cdcba, 0xf8c56eda, +- 0x2b1f338a, 0x4196cf28, 0x7fd4175c, 0xd1326ad6, 0xb6cce67d, 0x4e219301, +- 0xbd85abb0, 0x65ba7b2f, 0x7be564c0, 0xff2347f6, 0x31d6fbaa, 0x6fee95f8, +- 0x1b7d384f, 0x15df009c, 0x79328e2c, 0x55465540, 0xeda93c0c, 0x0caa9512, +- 0xb7221fb0, 0x991bbc3b, 0x720e93be, 0x053facff, 0xdc79f9ed, 0xae37b17f, +- 0xd7e819e0, 0xe8faeb49, 0xe24384bf, 0x0fafa046, 0xee5def44, 0xb5f3d1e1, +- 0xbc7ed985, 0x30564a4f, 0x4481663b, 0x4fd512c2, 0x1fbc8017, 0x8394798b, +- 0x8c041a0b, 0x56b85a2b, 0xef781ebf, 0x0377fb54, 0x5e2fe18a, 0x9138870d, +- 0x1b8b4c16, 0xb025e5f4, 0xfe30b87f, 0x4bcfcf03, 0x70e5f49b, 0xbdf41093, +- 0xccefe6f2, 0x39f6e0b1, 0x7be7d751, 0x1f93a9c9, 0x8f8fca32, 0x5f5c02c4, +- 0x909b5819, 0x702afdf2, 0x42ca6e77, 0xa59ee20a, 0x66165213, 0x04183be1, +- 0x1645a7f6, 0xb2657412, 0x8003bc3c, 0xc9fc83ac, 0xf5825bde, 0x9487ef69, +- 0xa1e1254d, 0x613ae8ae, 0xf272da7d, 0x5963c306, 0xe31e10bb, 0x8237de8a, +- 0x95eb6a75, 0x3797f5f3, 0x837e759b, 0x84f3880a, 0xefd69538, 0x797ebacc, +- 0x37dd1cfc, 0xe7e29589, 0x1bb95ee1, 0xfc5634ba, 0xa70e51f9, 0x4c2e6f87, +- 0x15fcbe05, 0x388381e8, 0x3da97320, 0x0271c20a, 0x8e85b803, 0xcdeacb63, +- 0x72ce7963, 0xf9d4ff96, 0x10fd5e55, 0x7ec9376a, 0x2058573c, 0xf70cbc16, +- 0xfdba669a, 0x17fc025f, 0x12697c98, 0x246fa7f2, 0x652e47c6, 0xb3247feb, +- 0x18aad2ea, 0xc78aa9f6, 0x782d0adf, 0xcddc17be, 0x76673df6, 0x3bfad644, +- 0xee4c5de3, 0xc4e81dc4, 0x0ec8fe78, 0xae11ef01, 0x3de18e17, 0x78d7f5bb, +- 0x29cfd808, 0x17206f14, 0x05640bd7, 0xdd9563bc, 0x978ef33a, 0x36d97f00, +- 0x5a2a77d4, 0x0e158927, 0x77d33f5c, 0x708d55ec, 0x773c98ce, 0x33d02654, +- 0x1bdcf75d, 0x83cbbbe0, 0x183aa5e3, 0x0f2ca41d, 0x0d1e2fa6, 0xf1dc17e3, +- 0x18dbf012, 0x4d3fde1b, 0x2672b0a6, 0xf406ba60, 0xb1921497, 0xca77e41f, +- 0xf8264f74, 0xb1761f5a, 0xc49a0671, 0xcf4133b9, 0x84f964ca, 0x46df057b, +- 0xb875ae24, 0xc93364fe, 0x77c2f987, 0x602d13d0, 0x887963cf, 0x554a79e1, +- 0x3c9f8c06, 0x4a89a59c, 0x5e82e318, 0xcedef151, 0xb89673e2, 0x25e3ca09, +- 0x4e4a4d5f, 0xe95feda0, 0x952d86a2, 0x510caf53, 0x03b0e1f5, 0x623210f4, +- 0xf5cfab14, 0x2c1925e1, 0x4d313dee, 0xbd5857d5, 0x9717d91e, 0x75f3f205, +- 0xe67f17a6, 0x9c41c5f0, 0xec4a15da, 0x1c49dbb8, 0x3673814f, 0xfff8d212, +- 0xc0beb303, 0x73811c7b, 0xecd2122e, 0x9b2ef007, 0xbcb37e36, 0x17be00f8, +- 0x303a415c, 0x45a2b80e, 0x857a6f1f, 0x2ab8f62d, 0x99ce079d, 0x42ed1048, +- 0xc0271f0a, 0xce0ab227, 0x057b8271, 0xce06aff4, 0x19a82429, 0x412e703f, +- 0x679def9f, 0xad13f612, 0xdaf5f447, 0x247ac4be, 0xe305d3b7, 0x713bbb74, +- 0x939c08bf, 0xafba9db0, 0x414c84f4, 0xdd6fea99, 0xc3de561e, 0xeb55a3df, +- 0xcf75fdab, 0x977df852, 0x55dbf608, 0x8511054d, 0x9feda3cb, 0xbcb39fa0, +- 0x45c23f7d, 0x7c2887a5, 0x81a824ec, 0x474d524f, 0xfb7944d8, 0x584d0fe7, +- 0x4a52fa3d, 0x1f38075a, 0xf6ae2707, 0xa2e5a44d, 0xf6d7c749, 0x473e5eec, +- 0x49b0f2f1, 0x2bc8fee4, 0xa89d4f57, 0xbdfaf3c9, 0xbe3f83ed, 0x47b3ca1a, +- 0x1ecbf6b3, 0xcb0feaba, 0xa25ca8a5, 0x702b48eb, 0x4316f26a, 0x63f341de, +- 0xa1b77934, 0x9e50d13c, 0x610fc862, 0xe19cbbf5, 0xc84bd134, 0x5ca687da, +- 0x03dfc12d, 0x81cf0d4a, 0xc56bfb9b, 0xefe1abbc, 0xb364562b, 0xd95817bf, +- 0x3859782e, 0x655f8313, 0xa76cf9ef, 0xc03460b2, 0x9065e3a1, 0x826de503, +- 0x4770f41b, 0xe630b6cb, 0xd3479da1, 0x7bdd85ae, 0x86396f2a, 0x7fedfaed, +- 0xf8f90994, 0x63ef51fe, 0x15c5f3bd, 0x78fae991, 0x19e2fef3, 0x26fe088f, +- 0x3be8b8d7, 0xdedb5dbd, 0x37bdfe8c, 0x53ba472a, 0x8e51077d, 0x067fee1a, +- 0x288e3e60, 0xbc70a89f, 0x7c59d47f, 0x31ddf0b7, 0xdb6047ed, 0x64f92fb7, +- 0x7f91e819, 0x0e3138ad, 0xfb782af4, 0xdf8df610, 0x614ba10a, 0xf8947a1f, +- 0x6f71852f, 0x3f78b8af, 0x547d913c, 0xde0c7cee, 0x87cffdb5, 0x7f0d5ee6, +- 0xb3a8eeef, 0xa9fc2873, 0x52ae239e, 0x81d1c7c4, 0x4292f89d, 0xcb195c66, +- 0x6a1ced0f, 0x5db7f9a2, 0xe2fe59eb, 0x2f20c7ce, 0xed632dc4, 0x150e74c7, +- 0x2c3260dd, 0x726dfc47, 0x3ff7e6c7, 0xcea33972, 0xbee1eeef, 0xa42e0097, +- 0x7037ed9c, 0xe542d0bd, 0xd3d29ce9, 0x7851375b, 0x1d85f9cc, 0xaea6dce5, +- 0xfa65af1b, 0xe200b070, 0xbc39928d, 0xb9443f71, 0x90dea12e, 0x42607b0a, +- 0xb4ce9f14, 0x17ee0f0e, 0x036d5597, 0xce79207d, 0x1a2fdc68, 0xb8acbe9c, +- 0x4374d171, 0xe2b34b22, 0x8bae4cdc, 0x961fbc26, 0xf5138f7c, 0x77f15fa5, +- 0x21df29ae, 0x5e38387d, 0xbb3173de, 0xf3173dec, 0x4e741c2b, 0x11de7ec3, +- 0x222deb7c, 0x056824a4, 0x50d896bc, 0x91b5b90f, 0xd72a15ca, 0xebbcf8eb, +- 0xfe8a5dd6, 0x5fc15b82, 0xfbbe1a3b, 0x47461352, 0x0cbafcf5, 0xed44779a, +- 0xbe99bab0, 0xda7bed54, 0x5cac8d75, 0xe9755b95, 0x5fbabdac, 0x71b0d725, +- 0xe9757f92, 0x5d875846, 0x8bf5e762, 0xb8dc8d66, 0x1bfff70c, 0x1fc0e2b2, +- 0x82a5f3e2, 0xc961fcdd, 0x9fe81330, 0x861a7e2a, 0xd172befb, 0x73f29ff2, +- 0xbd4f1516, 0x5b1c65f6, 0xea9102f7, 0x3fbd740f, 0xfd71fb72, 0xcb189f54, +- 0x3e99b30e, 0x4cd74591, 0x5225f034, 0xfef838e7, 0x694e083f, 0x147feeb0, +- 0xbc777f4e, 0xf73ef4f4, 0xbe61325e, 0xe84f4b15, 0xb870bdef, 0xcb0856ff, +- 0xf79ad9c9, 0xb077e848, 0xfa76bf33, 0xce69c7c7, 0x53dce7e7, 0xbaa77a81, +- 0x77cffb1e, 0x64dfc3e5, 0x51a7f234, 0x8efa3c2f, 0x3ff82d65, 0x282d2a8e, +- 0x4b5e8f8f, 0x51c5fef0, 0xaa941efe, 0xa2fce6d7, 0xd3b015ec, 0x4889c536, +- 0xbe09f71f, 0x7dc78054, 0xfee01e94, 0xa28f1ab6, 0xf175c7ee, 0x4085f5a1, +- 0xc68f370f, 0x881eef73, 0x4b7a848c, 0x2eb8df99, 0xf0ed13be, 0x371ef1ba, +- 0x07d0099d, 0x5b3231e2, 0x5d4fff41, 0xbab3a306, 0x3ef0cb92, 0x2097a505, +- 0xe8cd9fb6, 0x41266eae, 0x766ea1bb, 0x959bd20a, 0x9f30ac84, 0xa927e8fe, +- 0x10a3c586, 0x7b5637c9, 0x638c1d6e, 0x767b117e, 0x41378ee7, 0x456b5d8f, +- 0x8950163d, 0xc9b51de7, 0x074a5f38, 0xaa5748c5, 0xd49bf67d, 0x0f68fdd0, +- 0x5feed17a, 0xc3cdf4ed, 0xeed2fff9, 0x5837f981, 0x264b1ac9, 0x05643598, +- 0x1f3e49ca, 0xc608fb52, 0x7ae5cc2f, 0x67c57be1, 0xfc7fa09d, 0xff504e3c, +- 0xec0fa52e, 0x9584f9f0, 0x7ed7bfcf, 0xf9a9ec0c, 0x6277b2f7, 0x3e699ac9, +- 0x9d05f9fd, 0xb9f8126b, 0xc47d4ff9, 0x87e37409, 0xffe82e76, 0xff709cbf, +- 0xbb2f7fc6, 0xb4824acf, 0xfb68a8fd, 0xc1df81fb, 0xf9b22e5f, 0x27bb6a93, +- 0xf7a0fbd6, 0x44bf71c7, 0xed3e23ed, 0xc638ea78, 0xf8bda97e, 0xc28bc000, +- 0x8cf70c3d, 0x7f64bf22, 0xdf38c097, 0xa0f22544, 0xa9cf9695, 0xefe1e316, +- 0x3a97fb88, 0x7ceabd71, 0xae4726e7, 0xa1847f44, 0xcaf6e3ff, 0xab67f01c, +- 0x57b90ff6, 0x5c21ef63, 0x845e6894, 0xb411f87b, 0xe77cfaa3, 0xeed1b1f6, +- 0xb35be424, 0xdc6f5eb6, 0xcc3047be, 0x4795d39f, 0x7e6f0090, 0x28af1e7e, +- 0x5ef83991, 0x2ade6194, 0xba73773c, 0x08c2e953, 0xc0fdddef, 0x1ce9513b, +- 0x97fafd0a, 0xc64e119a, 0xf4fdd5fe, 0x1fe52b11, 0x82f5774a, 0x7f5af480, +- 0xc7f71db7, 0x49e46b1e, 0xefb8d7bc, 0x7777c46a, 0x4103cd89, 0xb5528f5a, +- 0xf633cf1d, 0x9e8cf3b1, 0x81239d91, 0x9ae9ba9f, 0xdd3f147d, 0x418d8aaf, +- 0xd5049d41, 0x37155e8f, 0xef77fd02, 0xb3f586be, 0x89dececc, 0xbdc30806, +- 0xaadfe0c4, 0x81f39fc1, 0x002fbd89, 0x6b458f7f, 0xd1bdc377, 0xbca8cce2, +- 0x180281e8, 0x573d4dbf, 0x38e097f2, 0x3df0dab7, 0xe0934a81, 0xb2abbd03, +- 0x67bc32f4, 0xd1dff840, 0xa568e551, 0x99a3da89, 0x34afbe51, 0x31723fbd, +- 0x491293f3, 0xf5a347e3, 0xb03b045e, 0x03b6b2dc, 0x49bb51ef, 0x6843eff4, +- 0x6b95a5fc, 0xf3037ccf, 0xf8356caf, 0x83fe0c11, 0xa53d2d52, 0xf504e947, +- 0x531f907e, 0x775bde09, 0xbf3dbcf2, 0x018efd03, 0xf030ce7e, 0xd6d77b00, +- 0xc042dd99, 0xc9381aaf, 0xed0996f4, 0x0ec1078d, 0x18efcf8f, 0x700dcb0a, +- 0x9ef19f3f, 0x75f6f8c9, 0xaa95d822, 0x6bb1a3be, 0x8c61bd2f, 0x4df76536, +- 0xf1864ec1, 0xf013e13a, 0xc9f6c48d, 0xf74803ff, 0x800023ad, 0x00008000, +- 0x00088b1f, 0x00000000, 0x7dc5ff00, 0xd554780b, 0x733ef0b5, 0x9992bcce, +- 0x9264cce4, 0x0927de4c, 0x27010084, 0xd4500421, 0xe6a2bc21, 0xa2d101da, +- 0x3c2438b5, 0xa0992112, 0xf7ad8b95, 0x24844032, 0x111a0804, 0xa284e028, +- 0x17edaf62, 0x04c0622c, 0x16c45407, 0x6b5ec5fb, 0x46f7f6d5, 0x485ca008, +- 0x6c5cb046, 0xad7bfcb5, 0x67324fbd, 0xde952892, 0x1e9f7cde, 0xecfbd9f6, +- 0xaf6b5ac7, 0xa5b3def7, 0x90d74b32, 0x44b44849, 0xc8485488, 0xbb11a6c2, +- 0xfe840957, 0x5b6673b9, 0x862a7909, 0x83c9e03c, 0x33c8abb2, 0x72599086, +- 0x9e3c8c71, 0xb1722390, 0xf7878e59, 0xda1e9181, 0x08e3f88e, 0x55c84499, +- 0xe075bbf8, 0x24203693, 0x625dbfbe, 0x8d7e4d76, 0x0e76e865, 0x83a7fd03, +- 0xd8b6d090, 0x8f986ec0, 0xd1796024, 0x0d2df46f, 0x613a3f38, 0x7687df3a, +- 0xfe600666, 0x40c9a415, 0x4a5909b2, 0xd2220602, 0x8fe22676, 0xda4fa029, +- 0x173e962c, 0x2512356f, 0x55dfe097, 0x40655ffa, 0x6ccd265b, 0xe0a54b5e, +- 0x90862111, 0xfb13a425, 0xdb57b259, 0x1234e96e, 0x2afad2b4, 0xc3460913, +- 0x5f5b55b3, 0x0f38424d, 0xa355db5f, 0x44d27fa6, 0x36db8508, 0x3b662133, +- 0xf99dc9cc, 0xe87f9d38, 0xb76bbd6d, 0x6869c842, 0x870fd492, 0x38e2d88e, +- 0xa8947380, 0x568675c3, 0xd3760745, 0x48eb7675, 0xb70a3ec5, 0xc0f2364d, +- 0x59ecfa6c, 0x0d8738a9, 0x9d8c7043, 0x3c20663d, 0x2b990e1b, 0x6e7f1402, +- 0x55708759, 0xd5895fdf, 0x40cbb963, 0x7d695a2a, 0x5fda6ad1, 0xf57d7f5e, +- 0x7c2f163d, 0x70165337, 0xbbe780de, 0x0d64cf00, 0x3ded077e, 0x71a8fc74, +- 0x777ea9ec, 0xcdfb5f67, 0xfe14df0c, 0x952dff30, 0x27802d51, 0x0493b922, +- 0x04759407, 0x63cf2ee9, 0x0fefd2f0, 0xfd7e7405, 0x5849f40d, 0x31ad7f7b, +- 0x97b62cf0, 0xe5a0ade7, 0xb9e69f43, 0x489c281a, 0xd03e7bae, 0x5173d2c1, +- 0xf1c1d00a, 0xff5f3f73, 0xf17f5a5b, 0xa4628353, 0x36800bf5, 0x090f1e28, +- 0xe7684ade, 0x3c8a37bf, 0x352ddf4b, 0xbb8c3710, 0x8088c0f4, 0x807bf69f, +- 0xb0feb196, 0x1a59c715, 0x90b6dde3, 0xa5f4b3f6, 0x40a51778, 0xf03eaaf2, +- 0xdf5073c2, 0x4b3d7661, 0xc51a5dfb, 0xa1e971e8, 0xbe7efc14, 0xf014bbd9, +- 0xfc0c6c93, 0x7be92fc7, 0xf5d19af2, 0x245c7d2c, 0xff3045c1, 0x0166ad8b, +- 0x75849dda, 0xad27d2c5, 0xed5d6013, 0xbfb63c74, 0xefd21692, 0xb227d54e, +- 0x9d387175, 0xe91a30da, 0x8d9e8b79, 0x60283fe7, 0xcf7a93fb, 0x3e5a248c, +- 0x6bbe72f9, 0xf5eaad15, 0x4a068218, 0x4b4dbe7f, 0x84b1904e, 0x5d94eb94, +- 0x38722700, 0xe2abe71a, 0x7171b7c3, 0x1efbd429, 0x124eec7c, 0xf4fef433, +- 0x310919b5, 0x0f6bd3f5, 0xfd03a509, 0x6ac8af6f, 0x7b71d20d, 0x44ba47da, +- 0xe45275ac, 0x5990fa53, 0x833d6edb, 0x8f43a86b, 0xfb5af4fb, 0xb44af587, +- 0x5bfc1f1f, 0xf0dd2784, 0xbc017eea, 0xc1c59787, 0x747f14ca, 0x8943bebd, +- 0x7ac8af08, 0x0bbbd5b3, 0x13f553f8, 0x0af1f3ff, 0xf9086f84, 0xc78a6919, +- 0x1de7467d, 0xbbefd134, 0x5f7159b7, 0xb4a63c65, 0xf77e0175, 0xb69d70db, +- 0x0ad16e69, 0x58991de5, 0x314571be, 0x86c71539, 0xaf940925, 0xa4ffa44c, +- 0x49122efd, 0xdf00a9ad, 0xeda36ce7, 0x869cbccf, 0x24645cf8, 0xcfba2675, +- 0xebc32349, 0xa7ca1699, 0x8dca7c28, 0xc967c85d, 0xe804087f, 0x85abb685, +- 0x20e94b76, 0xe1030549, 0x034b7c06, 0x395840b7, 0xb5abce8b, 0xff742445, +- 0xfaa7ca10, 0xcfd59fd6, 0x693f80c7, 0x337f27be, 0x57e8e16a, 0x63ee2df9, +- 0x59c4a8ba, 0x51f9fa63, 0x18e7ac47, 0x12c3f3e3, 0x44677e01, 0xf29972ef, +- 0x8fc4c5b7, 0x0492b1fc, 0x478ea9f1, 0xbbe32df9, 0xe177c626, 0xfc0d7519, +- 0x8ad241f7, 0x380ab37c, 0xf77c60d2, 0xc777ca31, 0x0977cd0e, 0xb807c9a9, +- 0xb8b7eefa, 0xf803ce00, 0x2aefe72f, 0x8c0d131e, 0x58f8df0f, 0xfd792440, +- 0xeadd7870, 0xcfa0e73e, 0x06e242e8, 0xc0fbe7fe, 0x806e5264, 0x516487b2, +- 0x4eb0ecf8, 0xad027ef9, 0x0dc449f7, 0x93ba337c, 0xfbe85bb8, 0x87e2669d, +- 0x2826a6fe, 0xc0d38fd8, 0x792f42e8, 0x2fad3e48, 0xea0cee2a, 0x13c49f60, +- 0xb5bdf819, 0xd3bff593, 0x802bbf4a, 0xaefc04ef, 0xa9137bef, 0xbefb0a8d, +- 0xe91990f8, 0x6b41f2e8, 0xd0f288c0, 0xfda3619b, 0x48d1fc25, 0x873dbd60, +- 0x7be7c8ac, 0x2b6e64f4, 0x4910ef6d, 0x73e22b4d, 0xd827f62d, 0x27e9f132, +- 0x680429c5, 0x053db857, 0xab2132b6, 0x65575f91, 0xf283de76, 0x81519f76, +- 0xd6d97c7d, 0x74ca1cb5, 0xe5a7e23c, 0xdb05652f, 0xcd4ff6f9, 0xef7d09ff, +- 0x0c5c58f3, 0xa07cdeba, 0xa3f8a317, 0x6f144c7b, 0x42c7c433, 0x5679d28f, +- 0xe06459a5, 0xfe32d3c7, 0xb4bdfef4, 0x3d7ed9fc, 0x9fde0231, 0x64973a9d, +- 0x2a27cd0d, 0x5d93fa03, 0x64baf461, 0xd55cb6af, 0xdafb2daa, 0x9b54e5b4, +- 0x1a2671d5, 0x2aeba6f7, 0xb1a327a5, 0x3a16d3e6, 0x46abe35f, 0x967f9be4, +- 0xe03699bd, 0x31d0ba0b, 0xe331a380, 0xe02f58fc, 0x0173fdb9, 0x1b4a469e, +- 0xbe0c799d, 0x9b2eafb0, 0x79c867e7, 0xfe97cf43, 0x47087499, 0x93c189b7, +- 0x9b1f07f1, 0xee57dd12, 0xf5d08ecf, 0x251d9a2f, 0xee37c6af, 0xa045f1d2, +- 0x891ce0af, 0x9f6deb6f, 0x5db16309, 0x5989f225, 0x579d1db4, 0xb7c656c5, +- 0x18ce9297, 0x54d50fd8, 0x145131af, 0x78636c3e, 0x2a1b5258, 0x367fd20a, +- 0xc2464bdb, 0x25afa53c, 0x1d7fe00f, 0x87a61bf4, 0xb1d366dd, 0x72cd7bf6, +- 0x368e06b7, 0x96d7d94d, 0xed877724, 0xff7c2597, 0x60904513, 0x7af94b3d, +- 0x6f782f7e, 0x9955f803, 0xe8530cba, 0xfd7eb7f8, 0xc5efca05, 0x75c6ca2b, +- 0xdbd70b8f, 0x1757c88c, 0xf7c5ea3f, 0x399b6faf, 0xcdb7d71f, 0xcfdc00ac, +- 0x9e9014ec, 0x025aa717, 0x5bcffa26, 0x5b9f4c6d, 0x8413bf4c, 0x848c7081, +- 0x331dd9db, 0x6747409d, 0xdfcf1b09, 0x59e4e4ca, 0x9b2bc299, 0xcefe81b5, +- 0xebbe31b6, 0x33f33adb, 0x778b4fe0, 0x67902e8a, 0x1aeac3a4, 0x7d3ca04e, +- 0xf40b42e4, 0x0a6e2977, 0x6bbcdf6d, 0x7be22cba, 0xfd8013d1, 0x6f3bb923, +- 0x5da5efa5, 0x78df5013, 0xcd91a763, 0x0e7a66d3, 0xd7eb71d6, 0x92c7ea22, +- 0x2f41788e, 0x47b8366b, 0x76557ec2, 0xf0033b3c, 0xb2567672, 0x42ffdb0e, +- 0xc3c03220, 0xde0122b6, 0x0f24162f, 0xad8acfec, 0x72e1a595, 0x11136cd9, +- 0x1e32535f, 0xe0b2e84b, 0xe407ba7e, 0xba4ed554, 0xd9fc607f, 0xaf7fbd1f, +- 0x3d3f7c23, 0x6174445c, 0xbfc77672, 0x5fc13d20, 0x34f808b0, 0xeef5c583, +- 0xbab4632b, 0x80726a2f, 0x5d5e2e5f, 0xa20f2393, 0x8bedf7bf, 0x8e1f741d, +- 0x4d836426, 0xb0755720, 0xfd1aed31, 0xdfbd2876, 0x0373ab92, 0xe22e4ddc, +- 0x133e967e, 0xa0bf548d, 0xa025f07c, 0x1a78788f, 0x97d23e10, 0x877ded0f, +- 0xcd926bae, 0xc7a053fb, 0x07cee20c, 0xb9212bbc, 0x005baa98, 0xc80fd462, +- 0xb7d3230e, 0x6defa624, 0x81cf2789, 0xfb8ea0be, 0x1e2fe84b, 0x1b1ec2f9, +- 0xc3e7b7ed, 0x5c018eaf, 0x8fcfd3ab, 0xbbecf905, 0xa14185f2, 0x0bb4b5eb, +- 0x2e2dafc8, 0xf17a010f, 0x0b22cfb5, 0xacf9faf2, 0x40e4c5cf, 0x6afebae4, +- 0xcfb67a63, 0x4e7ec211, 0x6dfed9db, 0xdcfa31b6, 0x002a22be, 0x23bb75fc, +- 0xff498660, 0x7c94fbbd, 0xc538a545, 0xe189a573, 0x57e7b4d9, 0x3be8116e, +- 0xa1c3c820, 0xd1fdb0ac, 0x202f315b, 0xdb3e71d2, 0xf2c7ed93, 0x912e29fe, +- 0xfcf659d6, 0xe00b2eac, 0x4177a6d4, 0x2bab8b7b, 0xd9f7d606, 0xb031539e, +- 0x223d8abe, 0xf022bbae, 0xbcc2c279, 0xbaf0be7e, 0xc00dfde0, 0x4b04388b, +- 0x6cf87f38, 0x0584a5cf, 0x98395416, 0x1c1c2c7c, 0x29e4472e, 0x5bb7809d, +- 0x3978616f, 0x00630bf7, 0x3339def8, 0xfc615f95, 0xc9959cf6, 0x263693b3, +- 0x4d69091f, 0x57d37907, 0x07573fbe, 0x6648ffe3, 0x5a1877eb, 0xfe3f61d3, +- 0xe7eda0b7, 0x091d3ac1, 0x595ede50, 0xf9434147, 0x5e17b9d1, 0xff7e0749, +- 0xa4afb3d9, 0x2fcd8597, 0x79f53bf2, 0x9aedc6de, 0x26dda7a6, 0x51195e3a, +- 0xc2a60bc7, 0xe32e6578, 0x485fc027, 0xdf7774dd, 0xcf62c9be, 0xab64f6f0, +- 0xaf60f91b, 0x1d00a8cb, 0x56f5dfaa, 0x804db944, 0xfe426217, 0x062ed657, +- 0xdb9fd08d, 0xfa01cc3d, 0x447dfab6, 0x4638aeff, 0x809b424f, 0x5e746976, +- 0x77f1f908, 0x2d4ef7e6, 0x7f9e293e, 0x32ae7801, 0x10a58e85, 0xc0030fa4, +- 0x916d50cd, 0xac253e40, 0x7a15f461, 0xbffa8744, 0x0169d921, 0x4e6b767e, +- 0x6e8ead54, 0xcc544744, 0xa7f54258, 0x6c5ce4b4, 0x74662fef, 0x81204fef, +- 0x590c0235, 0x96bf2023, 0x3a9c5e99, 0xb40dc891, 0xd33b3df8, 0xb5c49c57, +- 0xbc46cc55, 0x507fe00b, 0x05caa1e1, 0x8fe01fa0, 0xd21304e7, 0xa02ed08f, +- 0x5aea289e, 0x43bf41e7, 0x5d9e53d1, 0x3d1953b5, 0x49ff95f5, 0xe76454f4, +- 0x9e803bf4, 0x93d20abc, 0x3d3834d3, 0xbbf90229, 0x07bf13da, 0x0e44acec, +- 0xef9c4daf, 0x31311e84, 0x19050abf, 0xf794b7ac, 0x04b26a57, 0x2e1f9045, +- 0x30aef9fd, 0xd507627b, 0x494ec16f, 0x3e9e7d02, 0x57ccd653, 0xb3a46f10, +- 0xe8daec0b, 0x8f942609, 0x999d75eb, 0x8e24afa0, 0x7407d9aa, 0xaf2f3891, +- 0x67da0d60, 0x079036a9, 0xbfd15b20, 0xd3d8a2b0, 0x2fa6171d, 0x2fa80874, +- 0xc6ea3f54, 0x99db53f7, 0x661be07e, 0xd7d77d40, 0xcf01f826, 0x00431ed5, +- 0x817aa0f4, 0x1bfc01f9, 0xefd80acc, 0x156536cd, 0xbff34fd0, 0x5d3f2e29, +- 0xf9806f47, 0xd7497a13, 0xbd009fae, 0x3ed05855, 0xb605b66f, 0x7776822d, +- 0x03bb61e7, 0xf8d9137f, 0xdf8e09c3, 0x7a8adf9c, 0x0a6df37a, 0xfc7003f3, +- 0x2772cf35, 0xa81f40d9, 0xe6e7eed3, 0x9d927716, 0x52b5efbe, 0xcaf1d0c0, +- 0x8788cd1a, 0x99c19164, 0xfc989ac4, 0x4c17c819, 0x8984f700, 0x4f4d311c, +- 0xb7d3bea3, 0x80a729cf, 0x6faf3272, 0xd0e3a4ce, 0x3cf35879, 0x9f79a099, +- 0x3c7e5a6a, 0x024fd28a, 0xc46e87f8, 0xebd07e26, 0x564c61a3, 0x4f70c376, +- 0x9244e8e9, 0x86cef6a1, 0xcac39369, 0xf7ff7dbc, 0x69f6efff, 0xfb7728a9, +- 0x54da61ea, 0xb765ab1e, 0x9d6bce99, 0xa25ebfb5, 0x4da9aefa, 0xd7fbdf60, +- 0x8a9d3edf, 0x1d415ee8, 0x377aceff, 0x44cca9f8, 0xfcf85e33, 0xf5fe88a4, +- 0xa28b7fb4, 0x02565fb6, 0xa0553dfd, 0x73aedf96, 0xd26df9d3, 0x9043fb6b, +- 0xa0a1eff2, 0x4f8be78e, 0xdc9c686a, 0x3d5017af, 0xdf1f6021, 0xfbac1faf, +- 0x06e9b4a8, 0x7cb4563a, 0x577200c9, 0x873ef395, 0xe447fa80, 0xef897d7e, +- 0x57ccefd7, 0xba3d5187, 0xbf47a348, 0xdabe4764, 0x24b60335, 0x6f903fb5, +- 0x10f31efb, 0x3ea8e7d0, 0xfa8ec072, 0x4733f9c8, 0xeccf7d68, 0x514b1cbf, +- 0x79b2dda0, 0xaefaf7a0, 0xbeb74848, 0xa04062bd, 0xfbe26b74, 0xc0f1ca85, +- 0x9e9fa170, 0x9d39941e, 0x0744fcda, 0x8c21df74, 0xd57d23f7, 0x714ddfa4, +- 0x3ee71299, 0xb7ef8f62, 0xfdd7231b, 0x0fd99d91, 0x6de2dcbe, 0x1effd039, +- 0xd09e8081, 0x61327b90, 0x9f4dda01, 0xfb0c2c24, 0x29edb2ae, 0x5ee56784, +- 0xfc70a0fd, 0x1c222ec8, 0xecbe0fab, 0x2e71be06, 0xa84f2020, 0x37f50290, +- 0x854572d2, 0x5241340e, 0x2f7f9818, 0x35cc8fac, 0x7d74e190, 0x409bd041, +- 0x977bda8f, 0x375846ff, 0xafa04ffd, 0xa1167bb6, 0xd73edd3c, 0x30992164, +- 0x0865b2cf, 0x0dca3907, 0x2dc86870, 0xaa71824e, 0x4590cd67, 0x1c7aa7a8, +- 0x7a3f57d4, 0xd30c405f, 0xf4da1b03, 0x14e7a025, 0x57ee7d51, 0xf669de74, +- 0x745c4bdb, 0xfb88a71f, 0xe5a61ff2, 0xf1f0432d, 0x6e4c1c47, 0xff1e0ad4, +- 0x5fd10af7, 0x6ffdc247, 0x6f4c6d19, 0x683768bc, 0xed17affc, 0xd9377e12, +- 0xc81539df, 0x15d4b0e7, 0x8fb4fa0d, 0xfb073fb8, 0xca2c7899, 0xc62788b3, +- 0x152b1c8f, 0x1c992bf4, 0x806feb5d, 0xda12c9fa, 0x7aea442f, 0xa9edc612, +- 0x081ab877, 0x7e5007df, 0x9eed0f34, 0xabde71f9, 0x5c454740, 0x3839ed4f, +- 0xaf2cbf33, 0x7faaef5f, 0x0d581ad6, 0x3caad4fc, 0xf4fc0251, 0x24f9094b, +- 0xa73a8531, 0xff2a7ed2, 0x1b7ec76a, 0x7151bda2, 0xe6f5fe74, 0x81d03d40, +- 0x76c445bf, 0x20a6d98e, 0x73d9f3f4, 0x2fd016d6, 0x02268ef5, 0x15cd4c74, +- 0x1c9887f4, 0xf2d0a21e, 0x497cff54, 0xa1117900, 0xbf054ccf, 0x0e2bda11, +- 0xf3162bf4, 0x529c31fd, 0x6e1319c1, 0x71abda85, 0xf1cdfafd, 0xf048e6af, +- 0x747bd552, 0x9de7e626, 0xc08a3736, 0xe86d64f8, 0xcafc0e98, 0x7a024e8e, +- 0x80ab5570, 0xbee554e3, 0x65bb0064, 0xdfdb2b49, 0x50676e3e, 0x5e83a5f8, +- 0xcd171d91, 0x465acbf5, 0x58f3a4ef, 0x45f9c00a, 0x68424f86, 0xbdb86b3b, +- 0xd5d98ab2, 0xf7033fbc, 0xbf715787, 0x58849511, 0xd54e363f, 0x67f35633, +- 0x71f27b13, 0x6e9d08b7, 0x2f99e011, 0xeab6fc68, 0xe31c7a73, 0x4347b13b, +- 0x86ff6033, 0xff817d28, 0x6b309b68, 0x7d749bd9, 0x728fc6db, 0xa4e60a81, +- 0xc01624e4, 0x148a4a7b, 0x9f6d85ee, 0x21ba00cf, 0x6bf70425, 0xb114db75, +- 0x400dc78a, 0xae8c485f, 0xc4fa8169, 0x3e517207, 0xfc1f1f83, 0xb87077ff, +- 0xff985926, 0x9fdab9ce, 0x8c1e50f9, 0x26f659ef, 0x0a263f8c, 0x148915e3, +- 0x3e3b5637, 0xe57fc0eb, 0x4047f924, 0x954b3afe, 0x1a8f9802, 0x89d78a37, +- 0x43cacc0f, 0xbb658e3e, 0xa6ef704b, 0x6ce3bbcf, 0xdf6a2eb8, 0xe17cc095, +- 0x0ddb807d, 0x4e274760, 0x7187c9ad, 0xcf044e21, 0x84a0a49e, 0xcf2a68fe, +- 0x6d3a059f, 0xaf00ca33, 0x3eb7b6d2, 0x6a5b7900, 0xe822ad22, 0x4b7a113f, +- 0xf35dcc56, 0x2f7b6e80, 0x38f5d99c, 0x03eeebcc, 0x47e22f2e, 0x7adc8fab, +- 0xcfcbd30b, 0x80ad1b3d, 0xf39bb91e, 0xb23faa6d, 0x982fc138, 0x47a9191d, +- 0xb5a7123e, 0xffcafa4b, 0xcd923d70, 0xf7e74fcf, 0xf77f186c, 0xb7afbb71, +- 0xc80c62e2, 0xf47d55af, 0x517fe546, 0xb6529ebf, 0xd813fa27, 0x45767d67, +- 0xb5223e84, 0x840538b0, 0xdaef90d9, 0xe2fe3c0c, 0xff07ce76, 0xf9072d87, +- 0xa2e7f1cf, 0x173740fd, 0x97a8cd5b, 0x10433649, 0xb2fb55e6, 0x8013a031, +- 0x7578720f, 0x818ab8f0, 0x39ec6bc7, 0x0714280a, 0xfbe41e0c, 0x2cf497fe, +- 0x781312ae, 0x5e5a39e1, 0xc789387a, 0xeff6085d, 0xf08d183f, 0xc4a51a5e, +- 0x7f4bff42, 0x9e20471d, 0x03c74bd2, 0x7b37cf3c, 0x4d780a7f, 0xc9feb236, +- 0xc585466b, 0x36398279, 0x0096870a, 0xe54effd3, 0xba0682ea, 0x17d016ee, +- 0x3546dfa0, 0xd9d6c2fe, 0xc58521bb, 0x0119400f, 0xfb9eacbb, 0xcab8d5e9, +- 0x2b87e661, 0x5393f1e7, 0x033d17b3, 0xa15ab4a1, 0xb4ec04a6, 0xd0530dcb, +- 0x89fcbd6f, 0xaf2cf859, 0x17dbfad3, 0xaf7c1a91, 0x3f5527c6, 0x19711977, +- 0xefdcfe98, 0x7d51d43f, 0x8a93a946, 0x12667e41, 0x03c83579, 0x37b14fc5, +- 0xe96b3e81, 0x81789413, 0x93b69942, 0x80511dea, 0x3ab575ef, 0x5afe5b94, +- 0xa9da1b9d, 0x1c56f2f4, 0x57fd23f3, 0x5097f31c, 0x1c600750, 0xe7ab59f5, +- 0xdfde7efe, 0xc20ba22a, 0xe7b02753, 0x192a593a, 0xfdab7e4c, 0x4c6bead5, +- 0x4e6f4053, 0xfb3fa1d3, 0x173dc1b2, 0x1cf6c5fd, 0xb5ad53c4, 0xd584aea6, +- 0x6cba5ee3, 0xfeb0790e, 0x96298966, 0x3f03b144, 0xfa6388ed, 0x16dc2445, +- 0x91cb6936, 0x80ca9071, 0xbc4e5cb6, 0x59b29223, 0x7dfc20dc, 0x9767e707, +- 0xbc39321b, 0xbbe0065d, 0xa557faea, 0xd2e9b832, 0xad2b33d8, 0x41d02e78, +- 0x3285f816, 0xaafcc9e1, 0xff382574, 0x021d9bac, 0x7cc447d2, 0x9e8c6d6b, +- 0x0fccf5fc, 0x3fcef7f9, 0xe367de72, 0x763ef812, 0x56be213b, 0x5e301b2e, +- 0x12fead7a, 0xdf6b4393, 0xf1ff95f6, 0xe7b32df6, 0x2fc645eb, 0xa97c8c88, +- 0x396b664c, 0x0b9eb825, 0xd50b7bc2, 0xf51d601b, 0x91f00162, 0x705977a9, +- 0x2987d51d, 0x55f5a11f, 0x83a5758f, 0xee2eaf5c, 0x80bc81ca, 0x6cc2f848, +- 0xd19f9525, 0x6a0e6576, 0x50de808f, 0x0d878da7, 0xd3ba038c, 0xeec1e31c, +- 0x2defb539, 0xccfb5f90, 0xbfe8bf28, 0xff61188e, 0xbe44cc1f, 0x3bc589f6, +- 0xbe3ee21c, 0xe7aee0a8, 0x618f4133, 0xbb55547a, 0xc4f405b1, 0xf8b0dab2, +- 0x51affc1a, 0x75236f1b, 0x93bbf476, 0x8afbed66, 0x0ddf111d, 0x2135bf88, +- 0xbc18b65e, 0x53bf6123, 0xf1f18439, 0x023a950b, 0x5d172df8, 0x5d48408b, +- 0xf3f56b30, 0xaf86560b, 0xfe550e69, 0xcf0072b8, 0x7801e57d, 0x9e00e576, +- 0x1bc475cb, 0xe0154fde, 0x2977e299, 0x9785f3c7, 0x9e00e427, 0x909befcf, +- 0xa2de7803, 0xbec3726f, 0x4b7b2599, 0xd3dd8e00, 0x415fa83d, 0xd1f613bc, +- 0x7de3d2b5, 0xf464f37d, 0xf390df78, 0x5bf8c7fc, 0x8b8f9286, 0x95a1e6fa, +- 0x92830e8f, 0xcca0fc0a, 0x3946fc64, 0xfa837f09, 0xf4464cf3, 0xeafe1c7f, +- 0x1bcc46d2, 0x3f511768, 0x2c3bfb51, 0x3f41b379, 0xd381fc3a, 0xee8617e5, +- 0x8afc0adf, 0xe0fcffc5, 0x02ed5167, 0xe48cbf55, 0xfbe63fc7, 0xfdc3b37a, +- 0xd83bfd99, 0xb8ffaaa7, 0x0531b782, 0x77bd312e, 0xfe62e08f, 0x27f456e3, +- 0x97cc7757, 0x69fc5fc1, 0xab8ff980, 0xff47ce5f, 0xf5e06571, 0xdfc80a60, +- 0x7b064176, 0x27cf72a4, 0xfd2c8b31, 0x73b52f76, 0x886e809b, 0xfa471b49, +- 0xa62a7034, 0x3ef382dc, 0x768ef30d, 0xf7400c84, 0x23fed4d5, 0x52d54974, +- 0x5bf418e8, 0x17a820ed, 0xed69b614, 0xb8054a41, 0x031eedee, 0xededddf2, +- 0x75f80042, 0x999bc182, 0xa48d720a, 0xe40718ca, 0xc3976cfb, 0xe8f301dd, +- 0x03bb6b8f, 0xa33cb08e, 0x48b16dae, 0xe27a5dbf, 0x6d9f8196, 0x267e72b3, +- 0xf3fb7f21, 0x21a05b0e, 0x73f86f4c, 0x9509e980, 0x4491be6a, 0xd7c51282, +- 0x0fee39a2, 0xefc0df01, 0x3efc1183, 0xa3c6acbc, 0x3cfc4097, 0xde1dee22, +- 0x1f8e2fae, 0xf4d6f716, 0x95f26a43, 0x5bdc6d42, 0x7667ef5b, 0x2b0fdd33, +- 0x57e9fa0a, 0xbf4a83c5, 0xed1fdcd5, 0x16b938ab, 0x26d7d7e8, 0x2f5f60c8, +- 0x5dfa3175, 0xe32fed4a, 0x9dfb81d8, 0x0dfa52b4, 0xed4377e3, 0xe4228fff, +- 0x7bff47d1, 0x3b5068f2, 0xf8df74fd, 0xebabdf6c, 0x7df7fd57, 0xd8176ceb, +- 0x57588cbe, 0xe91adda4, 0xceed5777, 0x5f87e56b, 0xafc3f045, 0xa1f88ffe, +- 0x7e287e29, 0xfc6b8da8, 0x7ff0fcdd, 0x4cf1be39, 0x3a31d3c7, 0x332a2aca, +- 0xd7a64efd, 0xe2f135b9, 0xcdc5a219, 0xcb22a6e2, 0xbb8c8897, 0xdc78332b, +- 0xd7e7ed9d, 0x5f11165f, 0x5c3e3c55, 0x417561d5, 0x62cb0ad3, 0xc646cf8c, +- 0xfb241f4f, 0x228a0066, 0x614ba8e3, 0x7b7f671f, 0x9e3f353c, 0x5ce947c5, +- 0xa14f2132, 0xdfcb58a8, 0x8a5cb75f, 0xbbe186f3, 0x021a8f38, 0x49b5d083, +- 0xd87b13f2, 0x99e35bfb, 0xcf3afd3e, 0x481a71e7, 0x6ca1e41d, 0xc1bb46b2, +- 0x58ea718e, 0x9c4a51be, 0x78fc4a67, 0x9e1cefe0, 0x744fbf07, 0xe8cf2e14, +- 0xf89f915b, 0xe02e2cab, 0x471faa7f, 0xf7077fed, 0x9d2b5e83, 0xddaf1bdf, +- 0x7fe57df7, 0x572fbed2, 0xe37bfbc7, 0x6c295b76, 0x2081fb34, 0x38809efd, +- 0xba40e653, 0xa19faa1d, 0xbc7977e8, 0xee3c5967, 0xcc58f73b, 0xfe46bd9f, +- 0x3a185d12, 0xb222fe05, 0x7f80a8df, 0x2825fc13, 0xb8931b17, 0x022aeebd, +- 0x2ebe4338, 0x0c7d6be4, 0xb4349cff, 0xb7d8d8fe, 0xd8fe99ff, 0xe907fe57, +- 0x9ec8378f, 0xeeceb08d, 0x901cee29, 0x74aceb6f, 0xbe1760fe, 0x768cf2c0, +- 0xee7d1998, 0x925d1810, 0xe4d77115, 0xaf13d977, 0x867b9fe5, 0x2efff79c, +- 0xa7fd6cff, 0xc4bfcff1, 0xe8751f80, 0x2f2cfc7e, 0xcdd3b8b7, 0x776469e3, +- 0x07db7f98, 0xfbf466f9, 0xeabe7c23, 0x2e5c9dfb, 0x47dc125a, 0xff9c1f81, +- 0xb12264d0, 0x6429e554, 0x63dab17c, 0x7542f8c1, 0xa97bcb2b, 0xff208c7e, +- 0x69ff06ae, 0x6715f81e, 0x26f7d011, 0x0027bcd9, 0xb23eebcf, 0xf058c5f8, +- 0xa026cfbb, 0xc87cf5df, 0xbd967fca, 0x7bef509d, 0x19e30bac, 0x61cfb3cd, +- 0xd5d155de, 0x0a4b6b4b, 0x47e8be71, 0x4d491870, 0x1afe9e38, 0xd596f2cf, +- 0x783e95e7, 0x7fafd1bb, 0x11e582be, 0x196e1cfb, 0x5faa11fc, 0x44e95a3c, +- 0x7ef5533f, 0x8915b4a6, 0x27e43d6c, 0xd54f48a9, 0x83e4a7fb, 0x9ab494ff, +- 0x2dcf41f3, 0xed05a3fa, 0x268ff3bd, 0xfcc49e63, 0x9859ef38, 0x7030b5af, +- 0x19a5e81b, 0x77d01c74, 0x2dbbefcf, 0xf2ade61f, 0x3fe02dbf, 0x58b7eda7, +- 0x62717eb5, 0x95ddf962, 0xfea8a7cf, 0xb7f410f3, 0x6243ef85, 0x359a2a69, +- 0xf757bec8, 0xc3a8a27b, 0x607f13fe, 0xcab938c2, 0x89e8b60f, 0xcfdd94d7, +- 0xcf10fe47, 0x3c1cfbde, 0x167db15f, 0x65e14fcb, 0xf0aa7f0b, 0xfe98ecdc, +- 0x1fc79807, 0xcbeba5e2, 0x4b05930b, 0x75eb3c78, 0x7887fbc1, 0x8032cf16, +- 0x8a314e7d, 0x2be8967e, 0x92ce7f4c, 0x5647480d, 0x3e30dfba, 0xf408e943, +- 0xcea1c9f8, 0x9d74b1a9, 0x93839ac3, 0xaf87be01, 0xd24f10e8, 0x9f1813ac, +- 0x78d81589, 0xf55d8dd9, 0x22ffc023, 0xa03377bf, 0x8b926952, 0xc937d421, +- 0x404e49e6, 0x2e4d7a7f, 0x7bfc578c, 0xec93cb3d, 0x42bf4688, 0xcc52fa73, +- 0xc8f9ec93, 0x489cfe88, 0xfd3ea0f9, 0x45e63564, 0x27fdb566, 0xfbac09c6, +- 0xd4dc0d05, 0x0b04f8e7, 0x3bf95f8b, 0xcd6e6067, 0x57f20764, 0x188fe3a9, +- 0x25ea969f, 0x56a43ce0, 0x8199d6ef, 0xe822ad7f, 0x2cde1ce7, 0x195f00eb, +- 0xf7a62f3c, 0x7ac75ff0, 0xe3514ed1, 0xd7960102, 0x0b5aefa4, 0xaab497f6, +- 0xe03f16eb, 0x574dbf63, 0x85fd079d, 0xd2cfd1aa, 0xcf804d11, 0xaf65b467, +- 0x339689be, 0x838c64ea, 0x925a1ef5, 0xba557e81, 0xac83e1ce, 0xe5813d33, +- 0x18133921, 0xd11d48bd, 0xd267903a, 0xd182e266, 0x32dd6b33, 0xcb8779f8, +- 0x25b9d212, 0x70025bc1, 0x807ce68d, 0xb8c288ac, 0x7e6255a2, 0x8f8aeb11, +- 0x44e7017e, 0x03f3f176, 0x9e8f0f47, 0x7abdfe8d, 0x5fb80049, 0xc9bcb1b6, +- 0x73da0939, 0x3ef0fd07, 0x59a7f98a, 0xe4c9ff1d, 0xfa0b1d17, 0x3e8cf497, +- 0x0b477aa4, 0x587711f8, 0x7b6f98bd, 0xc4506d73, 0xfddc9938, 0x66128964, +- 0xf2656ccf, 0xb32f7aa4, 0x97ed23bf, 0x5523936f, 0xd2395a09, 0xe927fe57, +- 0xae122b27, 0x5a212ed3, 0x4f522e7b, 0x06dfb489, 0xfd11dbe8, 0xa8afa50d, +- 0xfdc52779, 0xd9bd30e3, 0x7e43eaaa, 0xb14e5e4d, 0x4c4b8d85, 0xdb27feda, +- 0xcc8f9665, 0xd61274f3, 0x9024ab28, 0xd046ff57, 0x0be6a72f, 0x5e598bf9, +- 0xf9475f8f, 0x97c4265f, 0x284f309a, 0x01050485, 0x045d66fd, 0x7c844bbe, +- 0xe3ddfa21, 0xef385909, 0x2755c49d, 0x04547f22, 0xf219b798, 0x352f304c, +- 0x8c116db0, 0xc705b773, 0xc99e4331, 0x70154838, 0x3a7e036f, 0x11c582b5, +- 0x05dca992, 0xc61e4dfa, 0x973cd0e8, 0xf9a89be5, 0x87fe6a24, 0x0e62870a, +- 0x8b11e4df, 0xd5ef8132, 0x4017de0b, 0x1817a9cf, 0x981bfc7c, 0x46d9a11f, +- 0x6e5a68f5, 0xf9851cae, 0xf584bd7e, 0x21d0afef, 0x80f9aa5d, 0x7615c3cd, +- 0x226fe53e, 0xf9cdefea, 0x4064bf2c, 0x5c044a1e, 0x6e943cd5, 0xf603b7ab, +- 0xe4c8b26d, 0xa2379aa8, 0xfe1849d2, 0xde3a66fc, 0xbfa60ef6, 0x70185717, +- 0xb795bd1d, 0xb7b1ffa3, 0xce404752, 0x191bb717, 0xb78c45dd, 0x0481ae7d, +- 0x60295fa1, 0x8e79fcc6, 0x5fd36fff, 0xc1735e29, 0x65747bbf, 0x0a6eb8c9, +- 0x7a5637e3, 0x166bd9f0, 0xd7c8455a, 0x01e68731, 0xf89cda47, 0x49a43ba3, +- 0x4a135790, 0xecc92817, 0x54a0fe70, 0x37a072a2, 0x9431f43e, 0x9c7c4c5f, +- 0x76878795, 0xd1fdb409, 0xd8a51da7, 0x9931681e, 0x98253f90, 0xeb96fd4b, +- 0x40646f90, 0xc0a7c6be, 0xd748aa87, 0x0bf44eda, 0xc856f971, 0x669921f8, +- 0x94bf300c, 0x77b1fe82, 0xee513293, 0xf6b3725b, 0xaa7d4277, 0xb469fd11, +- 0xddfde91e, 0xbd5853e1, 0x524ef0c2, 0x836f2cad, 0x9f81f974, 0x05399bbd, +- 0xb055d2fd, 0xf4fea81f, 0x057bc5a6, 0xe8417af0, 0xe0fb0e5c, 0x9affe9dd, +- 0xe17df407, 0x01864fc0, 0xa06999bf, 0xfc20f97a, 0xe32771e5, 0x4b7abd2f, +- 0x79fb409d, 0x1215e2dc, 0xe883f969, 0x95203379, 0x14dc6e7c, 0x200d1c03, +- 0xe04417fe, 0x7f1cf177, 0x5f4c39b6, 0x08f34db4, 0xc6b9f790, 0xef11e6cc, +- 0xbfa8dc95, 0x7708e778, 0x11aff5d3, 0x94433eb8, 0x143bb458, 0x8eec1625, +- 0xc21e2ba5, 0xef916fbc, 0x9bad49e7, 0x7f97d045, 0x4df8f2b7, 0xe5a1b0d2, +- 0xf6115df0, 0x1254fa85, 0x8b663ad9, 0x8fa018ca, 0x6fe342b5, 0x3de0934a, +- 0x31e9b3a3, 0x5f210a2b, 0x4d74667a, 0x22cdc621, 0xf7d2c7df, 0x23656179, +- 0x14d4b76b, 0x3d28974a, 0x61decd3b, 0xf3cb9700, 0xfb0e593f, 0xbbf27977, +- 0xc2be431f, 0xd6e27abb, 0xe24d3ec3, 0x1f2a4371, 0x32c7bf01, 0x286e2c6c, +- 0x031a9d6f, 0xef866ce5, 0xe30048db, 0xd873a5d4, 0x483bc139, 0x6d176d67, +- 0x57a9d337, 0xece8c2ba, 0xbe5b4536, 0x2e5b5723, 0xff1179e5, 0xbfbed2e2, +- 0xc0248493, 0x7e26f7ff, 0xfdfc223d, 0x1beecd8f, 0x0aaffe61, 0x3fd28f2c, +- 0x87a8c889, 0xe83f043a, 0x495fa305, 0x5926e7e6, 0xb9cfdfbe, 0x44caf31d, +- 0x7b09f582, 0x0f21bb4d, 0x8b07f55f, 0x93b47ebc, 0xc8ec3298, 0x84ae508f, +- 0xe8379e04, 0x390918c0, 0x7e664cb0, 0x40d6da51, 0x5f3039fb, 0x5824b841, +- 0xa016e474, 0xd21342eb, 0x298a5175, 0x28e0e80a, 0x3f1f23a7, 0x55d2a387, +- 0x903c4491, 0x9e8740bf, 0xf577cf03, 0xfff011f2, 0x78233ffa, 0x29908a4e, +- 0xf231e612, 0x855908b1, 0xbd39a7e5, 0xedf9551e, 0x6fc849bf, 0x701ab4df, +- 0x16bf895f, 0x439f805b, 0x5fd6991b, 0xf3851c6c, 0xdd03f753, 0x091cc3bd, +- 0xfde672e8, 0x44983a4a, 0x2acaccae, 0x38f862bd, 0x410fe401, 0x738d523d, +- 0xbefa99a5, 0x4977c373, 0x74bb9fbc, 0x8a4cde2c, 0xdc9d1c78, 0x3f7cc465, +- 0xbfb42f5e, 0xf7e025f5, 0xdc4cc4f1, 0xb7887b74, 0x3446e80b, 0x4ba014b8, +- 0xdae5ce95, 0x9d29bf43, 0x79c9eb04, 0xbb73d704, 0xe4f58655, 0x6b9c3252, +- 0xae3ba7c7, 0xf461fa00, 0xefb1462e, 0xfb792aef, 0x3e8c2926, 0xec55f7e8, +- 0xf7ed68fb, 0x3dbdfa4e, 0xfa18fbec, 0xefc0de7d, 0x72220909, 0xbff3e76e, +- 0xee89e79d, 0xba829ab1, 0x917fd0b1, 0x13bf45d2, 0xc3f7d813, 0xe07be862, +- 0x7cdab9fb, 0x65d1320c, 0x88de3cc2, 0xc2998bfc, 0xd7404963, 0xdaaa99b7, +- 0x6fff68bb, 0xd4ccfc71, 0xf380bf79, 0xcbcd6f66, 0x57fc0379, 0xbfba2625, +- 0x055f60b2, 0x7ad202d7, 0xb19f78a7, 0xddfee365, 0x2d5ff401, 0x69d8477a, +- 0x69be82f9, 0xdc4cb2d8, 0xe3133b17, 0xc55fce07, 0xa00ebabf, 0x3ea7a003, +- 0xb798883a, 0x67722f8a, 0xedac262b, 0x3c087aa4, 0x9084bd55, 0xac9f961a, +- 0x8baff5a4, 0x530ccb12, 0x0bd030cd, 0xe3f4aade, 0x7b699dbe, 0x9e97f312, +- 0x04bef24f, 0xc37b9df3, 0x3412e9e7, 0x011fce76, 0xdf3a207e, 0xce5ffd5f, +- 0x06bfd557, 0x667ee7e4, 0x0ee7e4d0, 0x71d47fb5, 0x8957a07d, 0x82dbc790, +- 0x39beb6f9, 0xab9c1716, 0x68be41f0, 0x5079c621, 0x30243aaf, 0x982fd57d, +- 0xad741eb8, 0xe984bc79, 0xfa7d554b, 0xbd0f2692, 0xbbcd9f39, 0xfa829979, +- 0x6b02abd6, 0x984f9fef, 0xd78b363e, 0x5eb1942f, 0x6e6f57cd, 0xe6b5fe61, +- 0xd0284797, 0x50a3d52f, 0xae58931e, 0xfe3265a7, 0x91493cda, 0x44dc0cfd, +- 0xafcfe848, 0xfa67a2de, 0xab9d76df, 0x0c41f308, 0xf1623f54, 0x869fc65b, +- 0xfd23f1b3, 0xaa275f70, 0xc3f30076, 0x41ff95f5, 0xb259b87e, 0x7f693897, +- 0xe9dcf30b, 0x17982cfa, 0xfa51c7f3, 0x2049d1dc, 0x1866ac4d, 0x91b7cde8, +- 0xd974f79a, 0x68069f48, 0xa534773f, 0x7d0d6ccf, 0x8cf19d1a, 0x22bcc21f, +- 0x1d2441f9, 0x6578c566, 0xd6d9a7e8, 0xd06ac7fa, 0x2e8ddb37, 0xf2ca7f96, +- 0x40f922e9, 0x48167cd8, 0x510e3e6c, 0x0738f9c4, 0xecb5cf9b, 0x4cfa7093, +- 0x0c3f6c24, 0x25125fb5, 0xf416b7e2, 0x9b1f97ef, 0xbd6023bd, 0x2d66fb7d, +- 0xcc062fb3, 0x7d20b45b, 0x8b2f73dd, 0x99a2f837, 0x43b8835c, 0x167f1d12, +- 0x7a9eff1f, 0xfcf78746, 0x4b7480d0, 0xf9841fa7, 0xb3f5e6cf, 0xdf30abda, +- 0xfd34f668, 0xff0d2ec9, 0xe7bc2375, 0x1c7376f2, 0x02d87af9, 0x71b54a73, +- 0xb3f7b985, 0xa4ddc6b8, 0xbdf30f46, 0x9fb68e67, 0x73f1a4b9, 0x7b9a9fc8, +- 0x54fdf6bf, 0xc9b9df67, 0x788f1011, 0xbde1db83, 0x7ec0bf74, 0xf17e337a, +- 0x7e94658e, 0xaf34fc47, 0xd303fc00, 0x6cf72a13, 0xb7e7e5a6, 0x9bf2c28f, +- 0xd1f83f09, 0x2bbf50bb, 0x20d3cb07, 0x08ec0c19, 0x6f208fd8, 0x3dbdee8a, +- 0x86fb8e93, 0x8cbbf799, 0xa33bdbe5, 0x68b3cdbc, 0x2cd8e73b, 0xc69c1bcc, +- 0x42ef4df9, 0x0dc77f56, 0xfa1a9656, 0xb97e8280, 0x79a15169, 0xf227ff40, +- 0x790050ff, 0x78b2d3ac, 0x51d5e0b9, 0xf8437e50, 0x4dd81e7c, 0x0916553d, +- 0xcc9d5fe0, 0x73a399fc, 0x0a48e085, 0xde766997, 0x575b157f, 0xc90bc169, +- 0x15a63fb0, 0xbb467eb3, 0x4367d4a6, 0x2c45dd3b, 0x629b24f7, 0xfbaa1f80, +- 0xfb93996c, 0xe49eb807, 0x15fefbe1, 0x71b527f7, 0x498f5fb4, 0x3d12c170, +- 0xfb413f13, 0x39d85894, 0x533b8f2c, 0x54e87f02, 0xdc73cb37, 0x02ac8aba, +- 0xcdeb647d, 0xad0d696e, 0x7a226a9f, 0xce946b90, 0x9b7a011f, 0xf4f3e13b, +- 0x8b2e2018, 0x3a55ce96, 0xf7d2a59a, 0xd31d2d34, 0xe713f9fd, 0xcfe76ff8, +- 0xf7363a1a, 0x7a50f1d3, 0x1d579d39, 0xb49bbfee, 0x9c6faaf2, 0x39187d88, +- 0x01fc50ee, 0x67f9c2fe, 0x715afcff, 0xb642a5bf, 0xc7ec3658, 0x6e3f7526, +- 0x7418f803, 0x24fe789d, 0xc28d7043, 0xe8439b03, 0xd2fcea15, 0x305927c0, +- 0x27f05e70, 0xfb1d7aa9, 0x9b1d8073, 0x77e9ebca, 0x9fef626e, 0x05ff1d17, +- 0xd96b7fe4, 0x350a767c, 0xbd709f8c, 0xab7fb55a, 0x69b6f5d5, 0xc5145bd7, +- 0xc13b7bce, 0xe93e814f, 0xf37d51fc, 0xa83c06be, 0x3971f1eb, 0xb1e4c73d, +- 0xeedae81a, 0xfd2395b6, 0x5ff89f7c, 0xa0e87d06, 0xe6187bc5, 0xefe75479, +- 0x2163fb00, 0x925c6371, 0xce6bc7d2, 0x9d42fd30, 0xaa9c246f, 0x919fe087, +- 0x4f8489eb, 0x513ade3f, 0x77cf539f, 0x1af7adf5, 0x21eaa9d7, 0x3fd6830e, +- 0x1cfee764, 0x00dff73b, 0x2e3c8145, 0xd02e5125, 0x04baa7eb, 0x894a27d4, +- 0x6970f909, 0x76df9309, 0x5437d30b, 0xfed43f39, 0x8216f5b8, 0x2974a9fc, +- 0xd8c9e7e1, 0x30e922ba, 0x823d7491, 0xd9499e76, 0x39f600b6, 0xff4a25e8, +- 0xcc2d4bfc, 0xa9c57bcf, 0xf1aef5ca, 0xcafbd720, 0xd77ae403, 0xf337e078, +- 0xa3fc6d44, 0x2ff30af4, 0x7c10afda, 0x193eba96, 0x5edd720f, 0xf81e35d2, +- 0xeeb1add6, 0x1f9f012f, 0x361f98eb, 0x24fa8e12, 0xbc5fea9d, 0xdc8cfa26, +- 0xe95c6a3f, 0x94d78b4d, 0x1fdfbe34, 0x2ce84171, 0x38ae4682, 0xcdeff799, +- 0xf4a63a04, 0xf2897288, 0xc157abc7, 0x837f8398, 0x532c721c, 0x092d9bf9, +- 0x2e08dbf8, 0x8f8c3dc7, 0xdb758b9c, 0x0d1c5893, 0x8710f2e1, 0x572e74cb, +- 0xd110ee2f, 0x9dcd3f9f, 0xdcb834fb, 0x24f5c77d, 0x8dd7fb80, 0x5f097172, +- 0xa53a45d7, 0xd17fb420, 0xe2c67a8a, 0x1e31cbb7, 0x8eab6231, 0x72726128, +- 0x734a2064, 0xbde8c47f, 0x4c794d76, 0xfda6b26b, 0x9a596d0d, 0x28e0fcfa, +- 0xe3b8fd4d, 0xf8f29a05, 0xed351bce, 0xac507c27, 0xbaea4f29, 0xa6fed35d, +- 0xca6b674f, 0xac123014, 0x0283b9fb, 0x7dd74ed9, 0xcd3ee873, 0x7dbdfff7, +- 0x0b8871c6, 0x33f6e29e, 0x733bbbf1, 0xa8161c29, 0x4ca57c74, 0x08505fdb, +- 0x07c0450a, 0x4682dfd8, 0x853cd796, 0xdfbc2e42, 0x7d5a4d85, 0x6d56f162, +- 0xf37da2b9, 0x0395e05a, 0x8a6a21f3, 0x646c88e1, 0x7934c43e, 0x75e80ebe, +- 0x2fd51276, 0x91c63040, 0x1ac7c838, 0x1b7fdf6a, 0xb0c873fe, 0x6b3fc36f, +- 0x7a80d5bf, 0x7fb7e2fd, 0xafa41455, 0xfe2d4e8c, 0xff168acd, 0xfc5ab9d1, +- 0xfc5a5d5b, 0xe2d44ec7, 0xe2d6e6df, 0x8b44ae3f, 0x168f78ff, 0xb57389ff, +- 0x6af24ff8, 0xa1529ff1, 0x8d5a7fc5, 0x2b19df16, 0xf4ccf8b4, 0xffbda83f, +- 0x2aff0224, 0x7baeccff, 0x149ee228, 0xd185d11d, 0x0b474a81, 0xe798153c, +- 0xc7e9bc32, 0xe922719a, 0x3a8dda81, 0xda8b87bc, 0x6b85db71, 0xbdca0fa7, +- 0x491a5fd0, 0xf1244f1f, 0xb13b183c, 0xeef9455f, 0x40f8127e, 0xf2a15ea4, +- 0x1e3970ad, 0xc50eff6e, 0x27c806cf, 0x290f0f6e, 0x361ec09f, 0x43c3dbf7, +- 0x9087e9d1, 0x53fa838d, 0xee8bfa23, 0x2e3cd995, 0xe049abc1, 0xf225fd5f, +- 0x04e90fbb, 0x7ef9d227, 0xe3a1eb08, 0x1a35187f, 0x203f18fd, 0x7fcfd441, +- 0x74871908, 0x712007b0, 0x13e73e99, 0x5ce59f05, 0x7ee42f5e, 0xdbd9a70e, +- 0x16a97006, 0x300919bd, 0x9e276a6e, 0xe227221f, 0x855ee9ae, 0x976fe093, +- 0x7f06e908, 0x98f67d3b, 0x519c7d19, 0x289b87f9, 0x9678308e, 0x5172154d, +- 0x30a3157f, 0xfbeca80f, 0xb2a5ca02, 0xcecf61ff, 0x4707a624, 0x50acd73e, +- 0xf5c4d9e1, 0xfc0fa600, 0xe3c29277, 0x416bc433, 0xe064b9b8, 0xe63fb4fb, +- 0xf319feff, 0x4925d193, 0xec78ec57, 0xf80cf10a, 0xa241f386, 0x8c73cd89, +- 0xe8574c44, 0x8bc4d1fb, 0x49c7dffa, 0x7aee3859, 0xd632b289, 0xb7e828ef, +- 0xefa3c60b, 0x045c5ba7, 0xd3a2bdfc, 0xabffd045, 0xc32b0996, 0xf55bac1f, +- 0x7a72a5eb, 0xcc2563d8, 0xe7e1157f, 0x2729114b, 0x3d157c85, 0x94ed0f3b, +- 0xf0bb32b6, 0x18ceab98, 0x792a2eb6, 0xed7e706d, 0xc81cf4db, 0x96133d2f, +- 0x5ee14e0f, 0x3f1c9833, 0xa8e2cc9e, 0x6e9a566b, 0x0f497886, 0xbe3d078f, +- 0xf80cdc92, 0xe6172514, 0x417dc181, 0x0defb0b6, 0xb61f5a0e, 0x498b24df, +- 0x3c5bd653, 0xdac65978, 0x17483595, 0xd1af7e7a, 0x6487d4ba, 0x217f986f, +- 0x4c4f8f9a, 0x1027227e, 0xbfd2f2ae, 0x5812a74f, 0x674b28af, 0x9feaf634, +- 0xdc0146ae, 0xa93d38aa, 0xe93a35f3, 0xdeed6138, 0x2557f4e1, 0xfe601a77, +- 0x741c50ef, 0xea413c42, 0x56bde074, 0xffb8e975, 0x37f0e4ef, 0x908217ee, +- 0xe0946ff7, 0xd2f4268c, 0xd28e3cd9, 0xf477dae9, 0x6b25e204, 0x7e44cfc7, +- 0xb8d7b066, 0x1e4f05a8, 0xeca1677e, 0xea9e041d, 0x2e94e8d3, 0x61a3f387, +- 0x9e0edcc9, 0x3e002640, 0xca0f9906, 0xf66587a7, 0x59e3c3cd, 0x3fc3c1be, +- 0x4c7f9824, 0xa2bfd056, 0x13c4f87e, 0x1b1bf217, 0xc6cbe109, 0x50037495, +- 0xa561b71b, 0xa8737889, 0xa835221c, 0x3710251f, 0xfe6351d2, 0xfd395709, +- 0xebf052ce, 0x3787b05c, 0x0d53ff8c, 0x1f45ad94, 0x61b94055, 0x90ad8be4, +- 0xb981642b, 0x23bf3038, 0xa2b66700, 0xef7cfd46, 0xef07686a, 0x425f3e21, +- 0xacf9d3df, 0x821ed31f, 0x0f63d1f6, 0x51f50a7d, 0x9b29a096, 0x3f75177e, +- 0x45b04971, 0xb253855c, 0x4856d3e9, 0x8e28a17b, 0x4f47dfe6, 0xc646fd64, +- 0xbb2d1203, 0x93217dd9, 0xb1678f09, 0x1faaec73, 0xbbb2de3e, 0xc6f818a9, +- 0x53fd6d30, 0x96711e1c, 0x41678e97, 0xe7612a7d, 0x93fd7957, 0x7966debc, +- 0xe598b3a9, 0xdfbe681c, 0xb58ffbcc, 0x50bf18e8, 0xb1b78f08, 0xdebc4dfa, +- 0x093bd6ac, 0xfab1a78f, 0xb46f5e7a, 0xba12fcb0, 0xafdf35ad, 0xdc27e3e3, +- 0x30de23af, 0x89cc74fa, 0xfa30de22, 0x35da97b0, 0x9d85bd65, 0x25a79523, +- 0xfb53be6b, 0x1b8f9c7d, 0xf34b3933, 0x28d8699d, 0x34cefb6d, 0x710f2394, +- 0x0b521b38, 0xf9eaf534, 0xb3a7226c, 0x276b3276, 0xf4d46e39, 0x6251517b, +- 0x999fff61, 0xcbadd2a4, 0x90fb7404, 0xe2112b35, 0xb99581b4, 0x1f0144a0, +- 0x3f994fe1, 0x6674789d, 0xcb054acd, 0xb8bfdc99, 0x2c44e566, 0x0b74a6ef, +- 0x74accff5, 0x2d277961, 0x53f9f42b, 0x58950fda, 0x07ed1b64, 0x7ed34fca, +- 0xed14f9e0, 0xd24f9e07, 0x337ea0f1, 0x9bca0efd, 0xde507f68, 0xe58dd2b0, +- 0xb04b2bf5, 0x83d2bf5c, 0xe72b75e5, 0x95f1f3e2, 0x59ae7c5e, 0xbbf58159, +- 0x3beb8593, 0x22485f7f, 0x93bbb9e3, 0xdde7f7c7, 0x16dcf1ab, 0xd476e0c3, +- 0x32ffce01, 0x8988e788, 0xa5c63fd1, 0x8f5b1ad2, 0xe719bd80, 0x6a48f861, +- 0x5b7ac1ac, 0xfd471b09, 0x24fc388e, 0x331d88b5, 0x5950fc64, 0x230df98d, +- 0x7317cb09, 0xc45289fa, 0x9fc25fcf, 0xbcff4214, 0xabe5ab94, 0x71f91199, +- 0x9923b3ea, 0xb0e279d9, 0xc72c371a, 0x8413d134, 0xcb8b5e7c, 0x33b1e78b, +- 0xa9ced0ae, 0xe57b1cbd, 0x5f80a216, 0xbfab54bf, 0x6815a7da, 0x4af144f4, +- 0xa533b635, 0x6769a7de, 0xda699470, 0x5cc92d95, 0xa47804eb, 0x1b1875b0, +- 0xbd101157, 0xe3379b0b, 0x999367b8, 0xebd74bbd, 0x3efbff47, 0xeb97ad81, +- 0x7ccbcf4d, 0xe446a6bd, 0xac6c23ab, 0xd7eb1398, 0xff3c3f01, 0xafdc58ab, +- 0x43a33dcf, 0x1248dfff, 0x46be01d0, 0xf50cf153, 0x96174863, 0x4aee006f, +- 0x1144f9cb, 0x848e3ca1, 0x7aa4bed0, 0xb3257fd3, 0x6633d0b8, 0x79a50b88, +- 0x23f9679f, 0x392b9441, 0xaa391f1c, 0x8a55b8fe, 0x4e9da7f4, 0x7b56fb46, +- 0x5b8d449e, 0x2516b2ae, 0x33d13e82, 0xb44f7e44, 0x169bbef3, 0x27463850, +- 0xfaa7c5cd, 0x1ba2bd7e, 0x55e57cf4, 0x4cefaf0e, 0x77c601e7, 0x6afce8c2, +- 0x0bbfa532, 0x0c83bf79, 0x2c3d5219, 0x1af0f684, 0x941fcabd, 0xfd0fe058, +- 0xe62c5765, 0x2127b473, 0xc199447c, 0xde95b9e7, 0x7fa9249b, 0xf997e29d, +- 0xe49be432, 0xbdb67cf0, 0x34dd972b, 0xc75fea4d, 0x5fb614e8, 0xf22b4973, +- 0xce875cfb, 0xa735ecc5, 0x0f33bec6, 0x79c3726b, 0x7114715f, 0x48c42e41, +- 0x5ee784d2, 0xc889bfc5, 0xb7a3c47f, 0x17ea8511, 0x40807251, 0x2fda873e, +- 0x8fe276e1, 0xc2fcbf38, 0x2de70d32, 0x94f7aba6, 0xf9af51b9, 0x90c97642, +- 0xb345f2cf, 0x4f123f1e, 0x6573eb6a, 0x4a5e07d7, 0x47f68b97, 0x517a60bb, +- 0x5f784db9, 0x204bb89b, 0x83ce02a9, 0x99d9a7e5, 0x5adfaa7e, 0xe0e3fc44, +- 0x2e37aed0, 0xa5dae005, 0xc2a9d01c, 0x8aabb69e, 0x3f06ec33, 0x0b8008d4, +- 0x2e5873c0, 0x5f2171c2, 0xab95deef, 0x14ee4e10, 0x6935e786, 0x7cf9dc2a, +- 0xf70ddb88, 0x566a2dbb, 0x3aed5bed, 0x7f15e7d7, 0x3b6bea0f, 0x8bd3cc45, +- 0x9885e784, 0x286263f7, 0x3346cba2, 0xa79d0cff, 0xc129e61b, 0xbe00e3bc, +- 0x58b3d704, 0x5ce00436, 0x5ad08f66, 0x31a97182, 0x971e123a, 0x53339f52, +- 0x277aff18, 0xb467c659, 0x0b4dde73, 0xef9785c6, 0xc31eba47, 0x122c4fd7, +- 0xbb7093cb, 0x5abf7095, 0xf0676a83, 0x3e28ea3c, 0xa0fbbedf, 0x2f3cb146, +- 0x0adce90b, 0xd9431779, 0x614c3f11, 0x3b7ef2f1, 0xe806a282, 0xf309bc67, +- 0x7cd41a1b, 0x055de514, 0x13e96bf3, 0x9c4c51f2, 0xd959d74e, 0xfaea043d, +- 0xbe30a656, 0xa3e392b9, 0x22ecc4d7, 0x27e4db88, 0x6f9f9d84, 0x58fb472f, +- 0xb6f4f38d, 0xd552fcb3, 0x49c950ff, 0x060df7a0, 0x221dde87, 0xdb2a77c6, +- 0x0ef760ef, 0xf7893c76, 0x14bed235, 0xde7287a0, 0x6b4ebcbe, 0xe3d82f0f, +- 0x0ca51b59, 0xc117bbb4, 0x03d9ab7d, 0x3b48eded, 0xae14b1fb, 0x3e48babf, +- 0x354e71c4, 0xa28b1f66, 0x126435f3, 0x2297bf3c, 0x6ef784be, 0x09b3ed53, +- 0x79243bee, 0x488fbeec, 0x6a92bfbc, 0x15ef3840, 0x5a5b8f08, 0x8ef7fe90, +- 0xef7ffb67, 0x0e778b91, 0x93dcfda7, 0x7ea6e0c1, 0xcb064f77, 0x0607dd33, +- 0x4adf7d15, 0xf960c948, 0xdc38bb3c, 0x9b9f33bf, 0x5573e5ac, 0xa2c75d6d, +- 0x3b77e415, 0x8f7bde81, 0x0f2625fd, 0xef0847f7, 0x833f7f2d, 0x0de607cd, +- 0x74fbf479, 0xa70bcf9f, 0x12297d83, 0xfaeeb79f, 0xda698cf4, 0x7bc85d79, +- 0x3676e12f, 0x579856af, 0x4264f04f, 0x3ab47e78, 0x83c57daf, 0xfd7cef9f, +- 0x9133e77a, 0x5068a7ce, 0x26fd1d38, 0x0c33ed38, 0xf80f9f3e, 0x0de3fe7c, +- 0xc0c0ef76, 0xd3d4ebfa, 0xefc04476, 0x807bcec5, 0x7ef9d35d, 0x847a0290, +- 0x63013bb3, 0xad7e1c4c, 0x0b3e9c85, 0xa171df39, 0x1f7c444d, 0xa4bcc04d, +- 0xfbd58956, 0xab028bec, 0x8ebafd28, 0x7900c82c, 0x88d0fd60, 0x86f8c5f7, +- 0x4b8b37c8, 0x97d8eb65, 0x870a0c2c, 0xe47f5e18, 0xb7f61944, 0x012303fe, +- 0xf5cb507e, 0xab72f5f4, 0x5501ee09, 0x02e508e1, 0x4219f4fa, 0x2e505c8b, +- 0x58a4c2fc, 0xc74f1906, 0xb114dbc6, 0xd4f1d46f, 0x973529a7, 0x3785ddf9, +- 0xdea3c844, 0xbc3df934, 0xa15367af, 0x3bf73c84, 0x4b59bfc3, 0xef82172f, +- 0xe8c9dc25, 0x7a0a94c5, 0xe63a7094, 0x13ecb47b, 0x03cdbf42, 0xb8bc19f8, +- 0x4647df7e, 0x840c22d2, 0x2f4e25d3, 0xf5d4faea, 0xdeb6f3ab, 0xd6f300bc, +- 0xf1301f01, 0x7a9d5498, 0xd5f21e2f, 0x60f72e58, 0x2627285d, 0x7d0f2c4b, +- 0xdd7884bc, 0x3c46f134, 0xc78fb027, 0x0c93439b, 0x7e43de83, 0xfd7f1f0b, +- 0x04ecff95, 0xaedfd5fb, 0x44d9f3c7, 0x45de72ea, 0x8ef7c8e9, 0x52bdf784, +- 0xfb812a7a, 0xb89c8e67, 0xdd7a0318, 0x847aa94d, 0x0fc04df3, 0x115c3e41, +- 0xff7f304b, 0x18b217c4, 0x5393ff46, 0x7497ae45, 0xfe5e4276, 0x979602c6, +- 0x807ae16c, 0x057744e5, 0xf132dfcc, 0x4c2146c7, 0x1aa5e6ce, 0x868dbbf1, +- 0xf68b8250, 0x4910ebe7, 0x2e81f510, 0xefab47bc, 0xe0cc91dc, 0x05485d50, +- 0x47dc1e4c, 0x9ad7eeca, 0x3e30aa9c, 0x807de74b, 0xf91a8fbe, 0xf50e5c85, +- 0xacbc7485, 0x32adeffe, 0x78d467c3, 0xa6c59f76, 0xe193bfc9, 0x8158aefe, +- 0xafb43de0, 0x7935eaa4, 0xe8649ffa, 0x9d9dbf78, 0x65f9bfa0, 0x5b09f309, +- 0x40990f83, 0xc5f757af, 0x86dd54d3, 0xfdf8eb76, 0xe626ebaa, 0x805ce006, +- 0x4a7fc74a, 0x61527af5, 0xbc5f747d, 0xa7577a84, 0x47c22a67, 0xc97c87ce, +- 0xef13a431, 0x0685210d, 0xae4be419, 0x6fd9a74e, 0xea6f1c2d, 0xa8a5ea93, +- 0x69c23cef, 0x62f79559, 0x39e0898b, 0x62b32ba3, 0xd3152f41, 0x25cf3d54, +- 0x6cff1c03, 0xe1fa8399, 0x8d2d37d9, 0xf57cf1e1, 0xb3da9a79, 0x797f4341, +- 0x0333cba1, 0xde222fda, 0x2e8fa0b5, 0xe735166a, 0x7df2cfae, 0x144af0be, +- 0xf5e98609, 0x87de270b, 0x5e1647e7, 0xaa412189, 0xe7e59d27, 0x3cf2ce7d, +- 0x654f7f9f, 0xaf81b2f2, 0x75ea4b67, 0x08aefbea, 0x0ff3b97e, 0x7e3195cf, +- 0xf700eff9, 0x00cba12a, 0x8de36e7c, 0xfe3cc17f, 0x0f4ed4d3, 0x3ad37ce6, +- 0x6c3048e3, 0x5776be9c, 0x7e9eb84c, 0xff3828bc, 0x105af5fe, 0xfda9a70e, +- 0x4c70cdff, 0xbfb1c0d1, 0x1c0d2cff, 0x839ff607, 0x995e9fe3, 0x8ffd2dfb, +- 0x457fa21e, 0x7efeff33, 0x3db8e187, 0x8f9ecb47, 0x68e5fba6, 0x57f6f570, +- 0xb0ed5f21, 0x272fef11, 0x78c5ad6d, 0x0417e89e, 0x3f2d99cf, 0x90c7e5fc, +- 0xb77cb687, 0xf46305c1, 0x5cf343ea, 0x6187c883, 0x7dc3f644, 0x6f73ea3e, +- 0x27ae366a, 0x0a49bdf2, 0x666f90c8, 0x55e495ca, 0x9d65e80a, 0x1fb8d581, +- 0x549fc84c, 0x6fdab83f, 0x9ea88a6d, 0xad7dc567, 0x10d0dbde, 0x7c00eded, +- 0xe6a5167f, 0x8237f91d, 0x67f2ad1f, 0x85eecca2, 0xa21da1b3, 0xe225b1fa, +- 0x91a3bf45, 0xe5e40878, 0xdf7865e7, 0x53fefe00, 0xafc006ca, 0xe3d98e2d, +- 0xb723ff45, 0x3b9836f7, 0x7e30ae9d, 0xe954fbf7, 0xd6fce4fa, 0xfe333908, +- 0x4c82e7fd, 0xe61efcce, 0xfe762551, 0xf2132cb2, 0xbdf8bb08, 0xe3018a3d, +- 0xf0c78505, 0xd532afbe, 0x8c8baf5e, 0x40d9a75f, 0xeefd55ff, 0x044f9031, +- 0x9646c23a, 0xcd1e5dbf, 0x89bfe5ca, 0x907573c3, 0xf0079fc2, 0xec5d156e, +- 0xe119379e, 0xa1af917a, 0x1d31b4d7, 0xe1cbd9e0, 0x75fdb17a, 0x62ee57bc, +- 0x7fc470dd, 0xc13f6bf9, 0x25f6a17b, 0x0ea77cf3, 0x729fca2b, 0xee08aba3, +- 0xcc97db2d, 0x2956ccf4, 0xa6105318, 0x2d4bae77, 0xbe7abe46, 0xf40eb86e, +- 0x7fae1572, 0xa360fce6, 0x4293efea, 0x2ebbf045, 0xbf830be7, 0xdfb7f945, +- 0xa267bf8c, 0x1165f03b, 0xd1b76fde, 0x1782f788, 0x65b9181f, 0xcaafad2e, +- 0xa59e61d1, 0xe71980ee, 0xdd81a173, 0x82df03af, 0x903aae9c, 0x52c3bf82, +- 0x3cc21d1e, 0x5728aaa9, 0xca41c40e, 0xf784dc0f, 0x30da9f7a, 0xe5f81d32, +- 0x1d2578c9, 0x40dd35ef, 0x7dd74e81, 0x7b0463b2, 0xcf013f5f, 0x463759ad, +- 0x5ff3077b, 0xf22472a8, 0xc97d9efe, 0x006d3df9, 0xd726919f, 0x2d3e5a6e, +- 0xeb9c58b8, 0x82b66878, 0x9e171671, 0x9cb72bdf, 0xdbef1afb, 0x7ee4fe6a, +- 0x481def82, 0x161daab7, 0x97395e39, 0xa10cfb33, 0x387bf079, 0xdc386be5, +- 0xab9f2c0d, 0x839f975c, 0x8df70e65, 0xe65cf711, 0xab7831a5, 0x242753cf, +- 0xca8c2fbc, 0x67c874ff, 0x88d8753e, 0xe36a7674, 0xaaaf3c68, 0x614e578e, +- 0x797dd322, 0x058caed2, 0x634b8ebc, 0x0d7caafc, 0xf7d52fb3, 0x25cdbae5, +- 0x8750e780, 0xbd2bf988, 0xe2062872, 0xb53b6a1c, 0x769eb7dc, 0x65d77f11, +- 0xc411f25f, 0x0227a537, 0xcd7ba4f4, 0xf7d5f28a, 0xe037719a, 0xf1217cf3, +- 0xfe5c8347, 0xce4efd80, 0xea230ed1, 0x321fbdbd, 0xfdc074bb, 0x3a509649, +- 0x7be81fdc, 0x58f9052d, 0x17685a6f, 0xeccd93d3, 0xbd77b55e, 0x2c3c7813, +- 0x9647df89, 0xe5d9fa04, 0xf410730e, 0xf8c4fa33, 0x71ec9f86, 0xd1c3fbe2, +- 0xf436fc04, 0x53854019, 0xdfc4efd8, 0xfc4d2095, 0x7efc4efb, 0x0477ba79, +- 0xd9e5e5f0, 0x7c0b7fb4, 0x2eed8ddf, 0x806f7967, 0xe64bfd32, 0xbf6325e3, +- 0x7c0cde69, 0x64e17c2f, 0xc4d0a7bf, 0xdeb13beb, 0xc04ef467, 0x4ad1fc75, +- 0xe759065a, 0x55bbdef5, 0x7887169c, 0xe14de754, 0x245efa8c, 0x98d26a5c, +- 0x23c2a47e, 0xf0fb2e92, 0x03f32df9, 0x97c009bf, 0x363c33b4, 0x3e30348c, +- 0xf51a3f52, 0xa51b525a, 0xd55a13c9, 0xf761cec1, 0x9e22b06c, 0xa7eef57b, +- 0xde851e41, 0xaf7613d5, 0xc008d515, 0xf07130bf, 0xe78e72fd, 0xb3d65709, +- 0x2f73a27c, 0x6f9f4d9c, 0x678af381, 0x5515e735, 0x24ed1f3f, 0x1628fc06, +- 0x96531297, 0x116cf4c7, 0x377ec7e7, 0xc15ea367, 0x6ff207df, 0x847e8918, +- 0x00e50653, 0xc3518efe, 0x55d01d18, 0x1ef18bbd, 0x9f5b137f, 0x7a8e5f7a, +- 0x7c244def, 0xd9b2d35a, 0xef1091ef, 0xf2877003, 0xf024a249, 0xffde1a60, +- 0xa2ff0155, 0xa618afa0, 0x3f919b73, 0x185ca0d4, 0xe196cf78, 0xe83f7e5b, +- 0x3fbcb6ff, 0xeb3ae09d, 0x9018fe5d, 0xccca9fab, 0x53d8a3de, 0x6c8bae50, +- 0x69a7789d, 0x4f6bc812, 0xd63c5a5b, 0x54fc3f23, 0x9f2af560, 0xa07eb01b, +- 0xda07e817, 0xa78ebed1, 0x3219bf31, 0x8ca7b809, 0x8f900df8, 0x9f27caa6, +- 0x3ce0e920, 0x894db76d, 0xaeec7a01, 0xbd83b6cf, 0x1253665c, 0xc2e8c20a, +- 0x73c106f7, 0x37dc0aa4, 0x5f7e013c, 0xfc163dc2, 0x5aecfb75, 0x7ce4417f, +- 0x35d29a5e, 0x77febc2f, 0xedff4c69, 0x8a28fbe2, 0xdf9063c3, 0x2fbc4279, +- 0x77af78e6, 0xfb416f79, 0xe2dda231, 0x1e9cb1ad, 0xbd37de22, 0xf798affa, +- 0x4f7b43b1, 0x78f8cfdc, 0xf8371e9f, 0x19e01b85, 0x15baf985, 0xab9f199b, +- 0xe734bb78, 0xf3c65651, 0x1e5a53d5, 0x58e3dfc7, 0x0e7a7bb0, 0xf10b7c61, +- 0x82e3d2a0, 0xe80e7774, 0xa26da171, 0x62a2fb0c, 0xa9f388ab, 0xdb4c9a97, +- 0x5b33fbe8, 0x55dfa8f5, 0x499cf9f0, 0xde20c6f5, 0x28192224, 0xde48cfdc, +- 0xb75fd418, 0x891ddff1, 0xf76d0758, 0x0830549e, 0xcf0c4c7c, 0x41ec9f08, +- 0x1d5de0e8, 0xfc0169e2, 0xa3cc197e, 0xe4bf4045, 0x03ef3499, 0x76a6ee50, +- 0xdbffde3b, 0x59f78954, 0x8cfbc244, 0xb9f48bc9, 0x8547af98, 0x2a38e467, +- 0x9e017b3c, 0xdf1d2fa0, 0xf7cf728e, 0x4b140894, 0x425fb48e, 0xc74a7a7b, +- 0x826f8ff4, 0xdea99bf7, 0xcd9c80a2, 0x400fedfa, 0xf889d5ce, 0x1d65267b, +- 0x422409d9, 0x58dd835e, 0x189ccef6, 0xac9c985d, 0x7e31166f, 0x766c3f52, +- 0x7f6c42cc, 0xafa04ef1, 0xa12b8a93, 0xe8ddac20, 0x8178bef4, 0x9be55f06, +- 0xe3031aff, 0x71ea3454, 0x7a5e2a5d, 0xff909ce9, 0xbfa34536, 0x843537a8, +- 0xea78aafd, 0x83c06fa3, 0xddb44f4a, 0x1f32e95d, 0xa8fc8fc7, 0xe45bd33b, +- 0x164e841a, 0x85c7493d, 0xf15ab6fe, 0x1d6bc2fe, 0x1f478557, 0xc6bef9be, +- 0x5771e032, 0x75bffa26, 0x4c984aef, 0x6669b27d, 0x72e3ec3a, 0xdfc02f2a, +- 0x3e842e50, 0x3b247bc6, 0x6b0f788c, 0x0f25e6f9, 0x1fe578c0, 0xdf50751a, +- 0x58e6787d, 0x5e04579c, 0x07d29c29, 0xccdef7a3, 0x0c2bba50, 0xc09f547e, +- 0x27aeadfd, 0x0f38de6c, 0x7de14f6a, 0x1499bd24, 0x607c619f, 0xbbd33a76, +- 0x80d97b68, 0xc3eecdf4, 0x1caf5be9, 0x62395eb1, 0xa411efbd, 0xe2f2e26f, +- 0x647c167a, 0x05fbc1d4, 0x0391dc4f, 0x86eeb5fe, 0x6eaeb8a9, 0xec2c7bbb, +- 0xda74eeaf, 0x72fc20ff, 0x9d7413c1, 0xceb0df79, 0x6be23326, 0x43da75c8, +- 0xac37c8bb, 0x50e9c7d3, 0x4969e75d, 0x2bdfc189, 0xf012283b, 0x3cd2f897, +- 0x65626f1b, 0x9f289dfc, 0x6f83d19e, 0x31e63473, 0xfbb3b4f6, 0x403e55c9, +- 0x7a46bbc7, 0x743d21d0, 0x265b2b17, 0x106d7d02, 0xed8bc865, 0x5bf7186e, +- 0xeeaf1df8, 0x7a0ca28d, 0x83317742, 0x2807e51f, 0x3dd3bbb7, 0xb0f96277, +- 0xea8f7f1e, 0xdf5fd354, 0x1de173c7, 0xfae0857a, 0x42e71b3c, 0xf817ce99, +- 0x3dcb851a, 0xe3d55f4c, 0x9eebebfa, 0xff7a83aa, 0xfcf01bd6, 0xacf940c3, +- 0xa3457385, 0x4487d9a8, 0xdf3c7052, 0xaf782913, 0xca670a83, 0x1ec07361, +- 0xe501e152, 0xe1fa6339, 0xa0e7e3e2, 0xf7602f41, 0x067e7120, 0x7262c9f0, +- 0x0081ce02, 0x28f3831f, 0x48abc943, 0x47a913fe, 0xaf8fbcfd, 0x6571f968, +- 0x3e18efc4, 0x125e5118, 0x469637c1, 0xd44557d4, 0xe77cf953, 0xe4e7fe60, +- 0x2b5f2d0c, 0xfd5470e3, 0x041bbda0, 0x24cb43b4, 0xcff600c5, 0x7c98534b, +- 0xe988972e, 0xec97dc16, 0x44994b7c, 0xf0058d6a, 0xb70865de, 0xb57f6893, +- 0x472d3b46, 0xdb443e31, 0xcac21895, 0xe755bf2a, 0x878701f3, 0x7ecefcfa, +- 0xe321d281, 0x8fa41f15, 0x28af181f, 0x757eb310, 0x83abec02, 0xbe95da22, +- 0x21fc99b7, 0xf2da5d5f, 0x97ee03a2, 0x30bcc6cd, 0x7091fd75, 0x14bb6dec, +- 0xd7ebbf03, 0xe780dc73, 0xe3dacb93, 0xb2fed18a, 0x7b850687, 0xda9f5f0f, +- 0x15d48f5f, 0x6f5c2b33, 0xe1315d26, 0xd65aa3bf, 0xd8256976, 0x7e7e14b3, +- 0x9f8f8c31, 0x062f88ea, 0xd7fcb2bb, 0x7e70c5c9, 0xdaa196d6, 0x1acfcafd, +- 0x341cdf61, 0xe7a23fa2, 0xf83ab9ed, 0x0aede7be, 0xf78e5cfe, 0x3e9cf5b8, +- 0xc7e30e95, 0xfee7b4e8, 0x5b6fdc0d, 0xd764fbae, 0x0fffc0cd, 0x09ae6625, +- 0xeb9737f3, 0x7e1ed00a, 0x079a1f51, 0x7e7aa6f3, 0xaa57e41d, 0x1432d8fd, +- 0xf071af96, 0x0fe02eec, 0x15a636a7, 0x39e95b00, 0xdfed0238, 0xe5c70f9e, +- 0x247f68c8, 0xbc2f80b9, 0x339657a8, 0xdaeac57b, 0x1fdfd99d, 0xc671038c, +- 0x8a13839e, 0xf3d05fc0, 0x2d2f9b21, 0xb680ffa3, 0xa51e43f3, 0x4e8c6fda, +- 0xdd7904d9, 0xb47ad7e4, 0x3afa1e23, 0xb9ee113b, 0x1e0c3188, 0x41bb019f, +- 0x1abcd79b, 0xabdeade7, 0x2c57691d, 0x4f961e20, 0xa97f611b, 0xda4773f7, +- 0x69a41589, 0xd030976d, 0xb88aa45e, 0xfb009fc9, 0x456bfd5a, 0xef64bf79, +- 0xbef6a355, 0x9fdf3f62, 0x65c7e426, 0xa0363f74, 0xfcc029bf, 0xa0e2757b, +- 0x65efd771, 0x9e3ae264, 0xbcdbfe8e, 0x9ebc30ae, 0x49c911d4, 0x40d27ae1, +- 0xc182ce4c, 0xe9cbc6ec, 0xb40d9f60, 0x1fa2cf17, 0xbefc3ca3, 0x6ed03230, +- 0xc01c593c, 0x0d93bdbc, 0xc09efe22, 0x918ddaf5, 0x97bfabdf, 0x2c20c9e0, +- 0x6772191f, 0x3764dfed, 0xc2abe76b, 0xc77fccd3, 0xe2fdb222, 0xca37160c, +- 0x6e245afd, 0x7a1df7d8, 0xdd13bf3c, 0x1f96c5f2, 0xebb67d00, 0xe3054ce5, +- 0x0b7bf82b, 0xf988a0e4, 0xa7edbd7f, 0x39041e62, 0x1e1c7073, 0xd793eb23, +- 0x938c4507, 0x4a5db4f4, 0xed0a7880, 0xbec6e307, 0x405ca78e, 0xe3cd43bf, +- 0xfaf10cd1, 0x08eef9fc, 0x1f8f28bf, 0xc99cb4f7, 0xf94efe01, 0xb019a3e0, +- 0xe2be733f, 0x15756cf7, 0xf9d1fd01, 0x1bdefea1, 0xa5fa8cb8, 0xf41c5da9, +- 0x19f5aafe, 0xcfe3eb86, 0x8bf20325, 0xf7c467d6, 0x095ab3cf, 0x7ece4019, +- 0xb4c51e5b, 0xc3570b83, 0x4dbd33fd, 0xb77f0b82, 0xb9445db9, 0x3a3da0b5, +- 0x4cbc50a0, 0x72c1611b, 0xee764ef9, 0xf9388663, 0x2e6ff07d, 0x7fa220de, +- 0xf2cb48f3, 0x6798f5f7, 0xe58327a1, 0x5de7f461, 0xc6147c3c, 0xdc14fc59, +- 0xc4ff4312, 0x6fd00dfb, 0x8102d3e5, 0xcc884a9f, 0x779818bf, 0x144f35d1, +- 0xc05de607, 0x6907e5f9, 0x466d15bf, 0x3c0faff4, 0x1bc840ef, 0x21f7fd09, +- 0xbc6f0ee5, 0x9f6d28ef, 0xf96062db, 0x3e35667f, 0x0ef685d5, 0xd0f3b209, +- 0xa74f073d, 0x877d1e03, 0xb1fd07fe, 0xd20fed43, 0x0e3cf2ce, 0x57dfb066, +- 0xd2fafdcc, 0xda419e9d, 0x8b3cf237, 0x327f7abd, 0x5b47b1e8, 0xe83f232e, +- 0x6cfcc83d, 0xfc4ff643, 0x0aefe666, 0x570fd19a, 0x0edf2ad8, 0x83ea84fb, +- 0xeedf5eb0, 0xd377b3b5, 0xbd55f9b2, 0x6f95aa02, 0x0bf705b8, 0xdff08fec, +- 0xc9f75203, 0x53a71e5e, 0x791a47f3, 0x3f9a8dbe, 0x4493e6a2, 0x27cd43ce, +- 0x7c614c69, 0xf3c32f23, 0x945bd001, 0xe77ecfce, 0x68cf2233, 0xc8a1bca8, +- 0x71910773, 0x8ae24182, 0x46c0af2c, 0xc6a06e30, 0xbe540d17, 0x31d647c3, +- 0xd06537b3, 0x227bfd7a, 0xc5434fda, 0x1c75d51b, 0x79865139, 0x8b2f5556, +- 0xb0bfafe8, 0xbce3cf5f, 0xe9438c21, 0xc8617c4f, 0x7ece7e44, 0xcb47c95f, +- 0x5937def0, 0xd28efcd2, 0xe71e1c57, 0xd9f07233, 0x978fb923, 0xe47b7ed2, +- 0xf5e80332, 0x4a0b13fa, 0x9de8de40, 0xd7980665, 0xa6c51391, 0x4d9bc04c, +- 0xb6b37dc2, 0x53b71d5d, 0x3ffffe86, 0x1f012a80, 0x00008000, 0x00088b1f, +- 0x00000000, 0x7db5ff00, 0x55945c0b, 0xe779f8da, 0x380c2b9d, 0xa5117280, +- 0x380a0ee1, 0xdb95902a, 0x9784268e, 0x4d32d45a, 0xe5450757, 0xdb698032, +- 0xcbbaeee7, 0x5acd4d78, 0xb5aca8dd, 0xbcc0c1be, 0x1a163b60, 0x25a3b614, +- 0xb68b9599, 0x3f9b5b99, 0x0286f328, 0xffb9f562, 0xcffebf6d, 0x3af39cf3, +- 0x7e988ef3, 0xbf67dfbb, 0xde73877e, 0x73ce7d73, 0x9339cf3f, 0x196e39a6, +- 0x9eb19fd3, 0xcadb2d1c, 0xc87b3b18, 0x630d81bc, 0xf7fc07ec, 0xacf2c653, +- 0x18036312, 0x319abafb, 0x3e57deaf, 0x7c81fb3f, 0x02d8c196, 0x316358e6, +- 0x33235a43, 0xbfd191af, 0x1d1fb01f, 0xf281ee9b, 0x988357f9, 0x5dafc237, +- 0xb63d14f4, 0x94357f9b, 0x3d424779, 0x3677af13, 0x4f285204, 0x1872f1c0, +- 0x9de912cb, 0x6edf2d22, 0xebf69cb2, 0xa613c2bf, 0xc53557ca, 0xf9a74e58, +- 0x47f8e5f2, 0x636ffc0c, 0x98c91646, 0x97627f93, 0xdb74fc5e, 0x913f485c, +- 0x5856091c, 0x9ed48557, 0xb10c0f7f, 0xef57ba26, 0x2d3ae330, 0x63f29bcc, +- 0x5e608ceb, 0xd5ae71bf, 0xf5a46abb, 0x2566e0f8, 0x6bd6f9b8, 0x5d7c3826, +- 0x38137d1d, 0xe8e0aac6, 0x05413feb, 0x4ffbebc7, 0xaebff1a1, 0xff49bb4e, +- 0xbfd06f43, 0x5f7f3555, 0xee3449bf, 0x0b0d0caa, 0xa4f486cd, 0x5e00cdc1, +- 0xcb235500, 0x1d80cc65, 0x795654c1, 0x66ad19c7, 0x75257b5f, 0x6cb171b1, +- 0x946f7c14, 0xfdf0dc0b, 0x25ae6592, 0x985d5219, 0xa1dbb186, 0x705ecebd, +- 0x086bf417, 0x41708f0b, 0x89ac133f, 0xc2efaeb4, 0x28301516, 0x08f06eff, +- 0x838f15d9, 0xfcc42a2c, 0xf2c541aa, 0xe37f1c7a, 0xb5f70c73, 0x0fc7c8ca, +- 0xfc332fd9, 0xba30eece, 0x777ea193, 0x7996c7cb, 0x06dfce30, 0x3ee0e639, +- 0xc909f32b, 0x3ee19779, 0x6dc726b3, 0x3d8c2185, 0x0dac616e, 0x50f6daf3, +- 0x725eaf5c, 0x405de7fc, 0x06afec0f, 0x77c90f56, 0x25aa4726, 0xcabed7c3, +- 0x01f9a7aa, 0x68b2c435, 0xa50d5f5c, 0x08574d55, 0x8916d6ce, 0xaf7ca5d6, +- 0x77043d62, 0x8851e586, 0x7d2b5a93, 0x16a4726f, 0x71e6fa66, 0xccf7ffad, +- 0x9fd00d2e, 0x433fff61, 0xdadd9e11, 0x906dfb9e, 0x60e45a7a, 0x11aef87f, +- 0xf0763974, 0x50ed5937, 0xfaed895e, 0xdbd8f631, 0xf30ca9e5, 0x9c2c9e86, +- 0xffb7c1f7, 0xe90ed591, 0x6fcbfb77, 0x50edf2c3, 0x6ef90adf, 0xcda54f7d, +- 0x6624bfaf, 0xf9466971, 0x0fb16ad2, 0xf7dbe581, 0xf3881caf, 0xdcc1d068, +- 0xa59c61c3, 0x474f2365, 0x9fd83a20, 0xb5b8478e, 0xec3d58e8, 0x54d35747, +- 0xe54af919, 0x43058c27, 0xf619bb3e, 0x83d9f207, 0xfb035b99, 0x93ffb953, +- 0x955fb8e9, 0x068b7a39, 0xbc341296, 0xbe02bdcd, 0x2d18e507, 0x2c53e212, +- 0xeccf5f1f, 0xfb62258c, 0xb7dc08bc, 0x2a310637, 0x41f997ff, 0x6bdbc71d, +- 0xbc7bc0fc, 0xabc601b2, 0x47efdb90, 0xa17c003e, 0xf2a5f11e, 0x668e6fa3, +- 0x4f46b158, 0x78cfee24, 0xd0f8171c, 0x369fa2c7, 0xac0ee16b, 0xfbe0fdd7, +- 0x2de8b06b, 0xf5c0e1c9, 0xb68c62b8, 0x68cfc47a, 0xbf14c277, 0xaacd7d7d, +- 0x4ff0f6a1, 0x221dbc42, 0xa07bbae6, 0x22587167, 0x470ee5fe, 0x30d2a87c, +- 0x3643f207, 0x077a8009, 0xe66165e2, 0xe9ebcc94, 0xd415b18a, 0x7b56dbdf, +- 0x57c735b3, 0x336993ff, 0xd07d1d33, 0xc12a6221, 0x0479ef53, 0x6153d9e7, +- 0x7d856db6, 0x827e0bf8, 0x334f2f76, 0x5850e578, 0x56bcce8f, 0x193a3c02, +- 0x0075bb3c, 0xd9b57fac, 0x73ae1ef1, 0xd7e343fa, 0x183a5e60, 0x788c5d61, +- 0x8b9ed459, 0x726d12fb, 0x3be3807c, 0x22db8e8d, 0x06978961, 0xc1fb523b, +- 0x08c2b356, 0x98566f0e, 0xfce7d859, 0x797c7cf9, 0x54b841a6, 0x36f4b808, +- 0x7c43f626, 0x5fad7aed, 0x74f98316, 0xca095869, 0xdf312e87, 0x988f2073, +- 0x712e9f1f, 0x4117d31f, 0x63bad2fd, 0xeb7eb9fa, 0xeecc60af, 0xfc7eb8c9, +- 0x301fb88b, 0xffd785fe, 0xa1afddf8, 0xf76fceab, 0xc004b0a5, 0xad22e913, +- 0xc71dbbeb, 0x9df58b66, 0xd63ff5c5, 0x87a713db, 0x073d3975, 0x887f9cf4, +- 0x527b69f5, 0x5d7d6c7e, 0xc27cb69a, 0xa5927d8b, 0xaed7de3e, 0x7e58f1a2, +- 0x497be02c, 0x9908d85d, 0xe20a59e3, 0x061ba959, 0xa55bc3f1, 0x8b3e051f, +- 0x5debbf05, 0x1413e02a, 0x5af2859a, 0xfe328f81, 0xccf800a9, 0xe1e4f6d6, +- 0x0b2f663c, 0xea7e70d3, 0xbe51fc26, 0x1eaa59cf, 0x30e22577, 0x1bf5cfcc, +- 0x66f34dc9, 0x2b86ff3c, 0xf21ebdcc, 0xbf95cd06, 0x21bd454c, 0xbd436353, +- 0xf0104b61, 0xfd8c1180, 0x8bcfec59, 0xe18c1fc0, 0xcb16be54, 0xfb7883a3, +- 0xee3567e8, 0x70bed095, 0xe1e1336c, 0x9b6695cb, 0x3115630c, 0x8530ac60, +- 0x47aecc79, 0xe63d7fb8, 0x61dbfb1f, 0x1de2839d, 0xfeb0f151, 0xb89a1139, +- 0x1c3cd0bf, 0x9c032743, 0xc70e68d8, 0xc207b840, 0xe8b30a7f, 0x36c65fb0, +- 0xa7ee9068, 0xe652f858, 0xa78e9c4b, 0xc70ebb32, 0xa839907b, 0xbd2ef1de, +- 0x1c1d019d, 0x3060f407, 0x8b9887ef, 0x373067ca, 0x979933a5, 0xb59cffea, +- 0x03a15e53, 0xfd39ffc0, 0x8d9ffe39, 0xb26f0992, 0xc7be01e2, 0x2f06b382, +- 0x7e4c7585, 0x6199352e, 0x0803359f, 0xf79b373e, 0xb1c38964, 0x1db8eacd, +- 0xf05bdfd7, 0xd0354bed, 0x25e8c68f, 0x27c6bbfc, 0x78100dc6, 0xa27ce3f8, +- 0x09e397ad, 0x06398390, 0xd8af70e0, 0xe5ed7bd2, 0x8cbd7093, 0xfe9e4859, +- 0x9e5fd04c, 0xb3fd666c, 0x6dd97c71, 0xa5d8b9c0, 0xbe42468f, 0xd6cc8c60, +- 0x5bde3cc3, 0xbede48ce, 0x13765c37, 0x869f20ae, 0x7e8bf7f6, 0xba998d27, +- 0xcbd41faa, 0xdb3dbeff, 0x20c1690b, 0x7eed97dd, 0x7fbe35f8, 0x4830aaed, +- 0xcba92427, 0x2d36b227, 0x065275c2, 0xf3f1fb94, 0xf5d5b3fb, 0xe198e00e, +- 0x2328db98, 0x0f8ccdfd, 0x18267fe9, 0x90d843b2, 0xbd1f641f, 0x9de9eb28, +- 0x0ddf4574, 0xef10d8f3, 0xb2fb8b98, 0x67afbef8, 0x2d33bd23, 0xca2468fb, +- 0x5d7ca3a9, 0x00dd025f, 0xd5d3b206, 0x7e80d120, 0x883e80ce, 0xb7a073f9, +- 0xdaa17a61, 0xd045e94a, 0x577bf0b3, 0x9ef28db5, 0xec72c2f8, 0xcbdaee77, +- 0x4e06475a, 0x6df0852b, 0x36b7c089, 0x8c13578d, 0xb255b4f4, 0x625c7ca1, +- 0x0c1b1b6a, 0x1f525bf0, 0x671d836f, 0x569e4d65, 0xb7b17e9c, 0x75b71f30, +- 0xad45e1c1, 0x055c5698, 0x6cbd078c, 0x1ff85cae, 0x7f5d0788, 0x7dda72f9, +- 0x7ab67e50, 0xbe7f8d14, 0x77e34eda, 0xfa501756, 0x37e3bc7e, 0x4b7b0f38, +- 0x15846b47, 0xe132e577, 0x1d0d7dcb, 0xe7c858da, 0xd23b25d9, 0xe676dde1, +- 0x6d3d0376, 0xb5b971d6, 0xd216e419, 0x29cc98e5, 0x50ca3e2f, 0xc71e38ae, +- 0x509c1ef1, 0xdcfd879a, 0x8b48aa3f, 0x9efa1ef5, 0x1f7888b1, 0x8f0cddde, +- 0xbf5f0059, 0x7844b6f4, 0xfd634978, 0xae59ea19, 0x0be93223, 0x2a985abd, +- 0x727bdff4, 0x7b05db88, 0x626f78bb, 0xc5b7f214, 0xb8546b3a, 0x0ceb5f1f, +- 0xbb9d6be0, 0x97f68f6f, 0x9ee19d77, 0xbe433eef, 0x4be705f4, 0x5e6733b0, +- 0x8e65be40, 0x76fee1b6, 0xf404bb09, 0xcf9460c9, 0x47417a95, 0xdf3057c0, +- 0x14e6c419, 0xd5f73e42, 0x1748b1d8, 0x7caa1e38, 0x7949df0a, 0x5f84b9f5, +- 0x6de37d5b, 0xecffccf7, 0x725fc805, 0x903a5c6b, 0xa7989753, 0x575c4deb, +- 0xfa86d99d, 0x0da49a63, 0xea784a5a, 0x934c3a26, 0xc0a5daac, 0xfabc7657, +- 0x303fc0e2, 0x1b181bd4, 0xdadfdf05, 0xe77c4c14, 0xd4ed9d2d, 0x22ff6c52, +- 0x53caff6f, 0x09b2fcbf, 0x462b27d3, 0x3ef112fc, 0x5ae09c3e, 0x21d2fbfc, +- 0x63436788, 0xbfa01b61, 0x5e486f5d, 0x99631653, 0xc4560735, 0x6d867cc0, +- 0x840cd0e9, 0xb49d7874, 0x21a1d312, 0xf8658705, 0x95bc5efe, 0x21b231e6, +- 0x72458e5e, 0xecfee819, 0xa87fa4a7, 0x9a8c92f5, 0x320763cb, 0x44327e9f, +- 0x7dc05cf2, 0x62721959, 0xb63fc904, 0xdbd9fa91, 0x99e3f532, 0x7cd00eb4, +- 0x7a45de70, 0xb70bc91b, 0xecf116ab, 0x46cd2392, 0xeba17afa, 0x4bdfdc79, +- 0xca1b488e, 0x571a7d8f, 0xff589de8, 0xf9d69694, 0x50b1dd46, 0x35fbe41d, +- 0xbe0998ea, 0x21ef0c57, 0xd83159b9, 0xc1dc70ca, 0x805bdd2f, 0xdc6ca9f0, +- 0x38fd4b5b, 0xea09368d, 0xd2bdec95, 0x8d94728a, 0xc464b667, 0x7f9e46af, +- 0x86dd9c62, 0xf6a4b572, 0x2b6f9e5b, 0x58217ca4, 0x3fac5a13, 0xcf69eb8f, +- 0xdac53909, 0x117f88b3, 0xfb7d5aca, 0xc67c04f5, 0x5de39bef, 0x3ecc8b31, +- 0xe97206f9, 0x8c59d202, 0x1b6fb79e, 0xe08e333b, 0x49728b72, 0x3d39e7e9, +- 0x4e509973, 0xacfcb9ea, 0xf8817e07, 0x17fffd01, 0xd1c8aff6, 0x6cca5958, +- 0x3ec77584, 0xb4adb067, 0xd338fade, 0x3921adfb, 0x5575e8aa, 0x89585f42, +- 0x36fda055, 0x804e43b3, 0xb90be671, 0x0cd6b4cb, 0x319e43d4, 0xa409b5db, +- 0xa3de81d7, 0x4c667921, 0x0658bd40, 0x4fd12f3d, 0xdf8733cf, 0x366b3c92, +- 0xfdb143db, 0x2fefd6ad, 0x3157f9e6, 0x444b424f, 0x31c85748, 0xf23de03b, +- 0xa127764e, 0xeb0357aa, 0xe790701b, 0x6dfa1213, 0x7aba055a, 0xfa958252, +- 0x7c11f801, 0xca19e761, 0x243ca509, 0xb841e39b, 0x47fa48c3, 0xe1a2c454, +- 0x9af0fc8b, 0x1123bd69, 0x5bffeb0e, 0xbfa84af6, 0x1bb33ffd, 0xbe7025f1, +- 0x3fdc0945, 0xb9890bf1, 0x97578834, 0x45af54f5, 0x8febbed7, 0x34a5aed0, +- 0xed7686c3, 0xd821e43e, 0xf49ea84f, 0xe61096a9, 0x99697a42, 0x7d46e91c, +- 0xa7b42dec, 0x88661e90, 0x7c4626f6, 0x40c665ba, 0x0d0387e2, 0xf35c1800, +- 0xaf6f034a, 0x2641f45b, 0x963cbff6, 0xc94ac7e4, 0xf48136bd, 0xcbe49935, +- 0x6a8fc149, 0x6533bcc2, 0x9cb9af28, 0x939c70c2, 0x61569760, 0xa22092bd, +- 0x7b309abb, 0x7dd7f20c, 0xdf132dff, 0x790e19ab, 0xf225f133, 0xb64cd4c7, +- 0xfe4184c7, 0x351fb161, 0x67faeeb5, 0x69c9bfb1, 0x3281aeb4, 0xe2f5445b, +- 0xe99f3f79, 0xfdc73b78, 0xdbd45ac1, 0x20c50241, 0x4e285efc, 0x2a07c866, +- 0x44cec613, 0xf7ec52bc, 0x28df82e9, 0x630363fd, 0xfc63ea2e, 0xf5f98cdf, +- 0x07aba426, 0x201d4c4b, 0x92c9d839, 0xbf682115, 0xbd90e83e, 0x1e5bd406, +- 0xd35fb3c8, 0x7fb0120b, 0xb3c24cfb, 0xf27ec562, 0xbdb843ce, 0xeb6463dd, +- 0x7d847f49, 0xdf1ebccd, 0x22633c2a, 0x52c7edfc, 0xf397a703, 0xd7482f38, +- 0x714a3b07, 0xe34d55de, 0xcaedfc23, 0x8757f319, 0xf18bdd12, 0x23db562e, +- 0x5ea1274e, 0x32a94050, 0xc14e329e, 0xea5da314, 0x818df68f, 0x4239aaf4, +- 0x7832ad0f, 0x4dfd21a7, 0xa31e3937, 0x642eca71, 0x7fd8bea1, 0x9c3f5a4a, +- 0x32fbf77f, 0x253d3c43, 0x3214f5f6, 0x45a7c46c, 0x4c2f8421, 0x8ebf1de4, +- 0xf41cfd20, 0xc737c21a, 0xde5286ef, 0xccc7b7a1, 0x1c5cfc47, 0xca71f84c, +- 0x729fbfc2, 0xcd7e1186, 0x87f95dfa, 0xaa7be00c, 0x78784f50, 0x3f2645aa, +- 0xca96dfcf, 0xb9c03d5e, 0x67d5ca6b, 0xd75da053, 0x3772afb2, 0xe2beda43, +- 0x3f9438f3, 0x4c5456b3, 0xcab376c2, 0xfc8fdd96, 0x3d7446f9, 0x441069cb, +- 0x35b6e1cc, 0xd711bec1, 0xd5ca7fd9, 0x03cbe47c, 0xcfcf9dcb, 0x0983f287, +- 0xcf88678e, 0x112bdbe8, 0x7d6f951e, 0x73fa8711, 0x7b2bf377, 0x6dfd215a, +- 0xfa79e388, 0xf8dee2be, 0xb099d8d5, 0xb0b52abf, 0xb73f805f, 0xc45e3a27, +- 0xbce355ef, 0xa2eed829, 0xe11f2dae, 0x9add96c6, 0xa5a17dde, 0x76849f7e, +- 0x254b5060, 0x0b3bb2a5, 0x7929d1e7, 0x8444a543, 0xb00be823, 0x6f168bee, +- 0xb9e21868, 0xb7cbc3d0, 0x5347d7ab, 0x077e148b, 0x91ee5768, 0xb3d226ed, +- 0x6f9c7add, 0x2872fd60, 0x58b77aa7, 0xbc3cc65e, 0xa9e9ac3c, 0x7b7ef8bb, +- 0x179fb0bd, 0xc56f2476, 0xf7b4befd, 0x3b7f1495, 0x7ebd3038, 0x17fd7cbe, +- 0x8e00bf11, 0x8744a117, 0x5060d5f8, 0x3b5d7fd9, 0xd5f85462, 0xbdd523b5, +- 0x762f8fde, 0x6cc1be09, 0x88c9dc9e, 0x2e4f76f7, 0x9f0a55ea, 0x164f4660, +- 0x9e696fd9, 0x1457b42c, 0x3d0ac33e, 0xf6ee5429, 0x7dfd60a4, 0x7d9acf68, +- 0x8aed96e3, 0xfdcf5dad, 0x364d2e8e, 0xc56e87e6, 0xcdefd2bc, 0x59ba97d6, +- 0xbba7caaf, 0x09d3f9d5, 0x73b69fdc, 0x83b15ea7, 0x30476165, 0x568fb2ab, +- 0x5c11afae, 0xe057aafe, 0x2e6c68f2, 0xafe00dfa, 0xe7379a04, 0xddb93be3, +- 0x23b86fbc, 0x62a9f916, 0x830bef9f, 0x51ca067c, 0xaf256f3e, 0xde7021c0, +- 0x20bafe2b, 0x967bfd16, 0x4e508d44, 0x3f88516c, 0x2f9c4d2b, 0xbe81d4ad, +- 0x4976819a, 0x5ad3c8c9, 0xd16c57b4, 0x1c1f5ac5, 0x6e1e6c16, 0xb85d3a44, +- 0x1fd1b865, 0x1f6e561f, 0xf30ad879, 0x6b5db8bc, 0xd4af29c3, 0x7d429fba, +- 0xd976e56c, 0xddf462e3, 0x17fa8768, 0x628f07cd, 0xb85b05bd, 0xbf69429f, +- 0x744e7370, 0x873cdfb1, 0x33c3576e, 0x0fcea3d3, 0x07e7526b, 0xf391aea2, +- 0xdc376f3f, 0x3c8fceab, 0xfd9fceac, 0x10d3a3cb, 0xd7644aed, 0x87ea3253, +- 0x461fe79f, 0xdf6e71b9, 0xdfe4a11b, 0x15b8a2f9, 0x9b85def5, 0x7d8670d5, +- 0x701f5093, 0x2e48936d, 0xe903ba96, 0x65ba6fa3, 0xd7e2b96c, 0x93c7f34b, +- 0xd56ae632, 0xbf5f5fc6, 0xd9a67993, 0x74b48fd1, 0x23d3c8f1, 0xe1defd7d, +- 0x7b47a4d9, 0x1bdc7027, 0xdb3329d1, 0x165f68ad, 0xeedfe28d, 0x7d963a5c, +- 0x6d882205, 0xf88f9638, 0x4484f457, 0xf5e8b6f2, 0x2f9177d4, 0x3199ec77, +- 0x0569d281, 0xcfc50f04, 0xf245b0b2, 0x32de4086, 0xfcede38a, 0xc19b92cd, +- 0x32aee7bc, 0xc541fca8, 0x58f3d41b, 0xbefea350, 0xdfc0e9b0, 0xc4bfe825, +- 0xe51e92f8, 0x4316c956, 0xfdcb1f80, 0x65e1ea0e, 0xd9d918e7, 0x183f7565, +- 0xcd73f2fa, 0xbae1d657, 0xb8fae19b, 0x07d3e78a, 0xf806634f, 0x857efef8, +- 0xfea11233, 0x32b5359d, 0x3982adc2, 0x9224b31e, 0x860de99d, 0x7d002c79, +- 0x9069f509, 0x2baeb4b7, 0x0db9fb9b, 0x4cce54f1, 0xb5857e50, 0xbe1ca2e5, +- 0xe36218d2, 0x5cb6b0fe, 0x4217e40b, 0xc256e11e, 0x9c7c1236, 0x8e657fc8, +- 0xf9bf762f, 0xe7f93ee2, 0x8fae46d9, 0x03deb53b, 0xd6728708, 0xff70ed4e, +- 0x6139ebfc, 0x51c3275d, 0xcf6808df, 0xaf0fe46c, 0xdf69eb32, 0x307e9aaa, +- 0xec577ff8, 0x512ec500, 0x59ff6dfc, 0xe21070f6, 0xfec96af5, 0xd4c651bc, +- 0xf115a7bd, 0x724cd4b8, 0xce5ae1fe, 0xd9d06bcf, 0x6cd7fd02, 0xf37d274a, +- 0x829ec961, 0x4c9b65eb, 0x1e810764, 0xdb3abf18, 0x3e81d7a7, 0x9fa132e8, +- 0xbdc834b8, 0xe70fbf15, 0x8ccd79f6, 0xde17d214, 0xe45e3c92, 0x3867aec3, +- 0xe64cd4bd, 0x64f353f8, 0x0cff7d0c, 0xfa831aa7, 0x6a4bd722, 0x3d72a536, +- 0x60f3e656, 0xfe210bbf, 0xe62f1358, 0xf34ac035, 0xc9f5f452, 0x8973c716, +- 0x5e2ceb7e, 0xf4247a01, 0x995bfc5f, 0x95829fa1, 0x3c92dc44, 0xaa7217af, +- 0x8dc99367, 0x52d3eefe, 0x3f9e2b61, 0x13dfb35c, 0x1dcfdf39, 0xea26df6b, +- 0x58bc5f91, 0x4ffd7933, 0x3567bc71, 0x7ef195d6, 0x53dbb7f0, 0xbd3fcf50, +- 0xf70234c9, 0xce70d4e9, 0x72c773b7, 0x25d801bf, 0xee90adf6, 0xfca8d449, +- 0xb9127bab, 0xd13fb09d, 0x3ce9e94a, 0xc90c47ee, 0x0cff242e, 0xf1f115ec, +- 0x17ec75c0, 0x85f58aed, 0xc7d27e47, 0xb0f8147c, 0x4e7f7c71, 0x5c91223f, +- 0x58a4f584, 0x7bfb9f20, 0x4e75f913, 0xeca2f90b, 0x0e51e00b, 0xbfc15bc9, +- 0x49fc459e, 0x27f014c4, 0x51fc2fbb, 0x60c3c7e3, 0x7f1098ef, 0x1f683f00, +- 0x327afc15, 0xf011f693, 0xe7a1f087, 0xf00dd349, 0x285f6d47, 0xe5a9adeb, +- 0x5da047f6, 0x3270f801, 0xa0bcefd1, 0x0427ac26, 0x3c14b7cf, 0x8e775a60, +- 0x205a39ff, 0xe6c9e41e, 0x4befe434, 0xea1b20a4, 0x7f844bdd, 0x467cc97b, +- 0x8b658df3, 0x68d7a424, 0x0ec895e6, 0xec266d66, 0x003d27ef, 0xfc3a3f73, +- 0xf32355e9, 0x58637b97, 0x8f7f2a98, 0x3f554631, 0xfaaf12cf, 0xba746f7e, +- 0xeb78fbea, 0x627e5570, 0xfaaa1dda, 0xa8c6d9f7, 0x351b3ff2, 0xb27f555e, +- 0x6f2ab27d, 0xce2d1667, 0x60baa5bf, 0x6f1fda24, 0x5e921757, 0xd1970810, +- 0x5baf8386, 0xea46206d, 0x00b453b4, 0x0efdd1bf, 0x7c87892e, 0x14d33aff, +- 0xe8c7e02d, 0xe25783d8, 0xd5a2602d, 0x43eff105, 0x80495e0f, 0x305d747c, +- 0xc8c5dfcf, 0x67581f1e, 0x9332e29e, 0x093630bf, 0xeaed3ce0, 0xf66843a2, +- 0xca7cb27d, 0x75a478fc, 0x3ff33267, 0x7566d8b7, 0xe53d6184, 0x547f52bb, +- 0xefb52152, 0xfcf9ccbe, 0x393fb827, 0x760a7aff, 0xb18fc917, 0xac6c341c, +- 0x5be74cd1, 0x78bba8cc, 0x7c0cafcd, 0x8633b253, 0x6a96b9fe, 0xc22d67d8, +- 0xb7a948cb, 0xc1e942da, 0xdf4a68ea, 0x62b2b6ad, 0x756b6780, 0xab87a51a, +- 0xa47e546d, 0x1fa5147a, 0x3d29db56, 0x69405d5a, 0xa521755b, 0xb34f2812, +- 0xb36c6f90, 0x3c21d5ad, 0x33b0da5c, 0xd9fe3e30, 0xe1f2df17, 0x519d96ad, +- 0xff2a15f6, 0x4dcf64ca, 0xb20d75a2, 0x945b9f90, 0xa9ffda1f, 0xe8d1f915, +- 0xf5e1236c, 0xd59b7368, 0x48f3cd98, 0x99977567, 0xebca1357, 0xf5ebfd69, +- 0xfe470cf7, 0xa669da30, 0x50bd497a, 0xbdeb0b2f, 0xf2c5a317, 0xca1b7a45, +- 0x3f04e7cb, 0x901cd10e, 0x5e909c71, 0xc834367e, 0x144ef9c0, 0x5df85fa8, +- 0xf5d5a3f1, 0x8706f1f2, 0x9df3a22f, 0xc4cdb3c1, 0x15b9147f, 0xc18de11b, +- 0xd12ec5f9, 0xe6887953, 0x2efd15b8, 0x09ded55d, 0x84e3af88, 0x67a71f9c, +- 0xa60f3869, 0x94f92209, 0x1adf7f27, 0xcdc5f90b, 0x398c70d2, 0xdc286718, +- 0x96a1f642, 0x6feb31d3, 0xb6b8fae2, 0xa815f4ad, 0xd6323c77, 0x15a11eb6, +- 0x81258fbd, 0x5557959e, 0xf2728190, 0xf448db38, 0x31d43f3d, 0x6a6df10f, +- 0x46bdd006, 0x13f40920, 0xfc4c105d, 0x6a7f7bb3, 0x53cdea0e, 0x0cbdd60c, +- 0x292ca2e8, 0x4a7ef087, 0x648e6b3f, 0x445dfcc1, 0xaca25327, 0x9e1b257b, +- 0x194ce49e, 0x71bfc777, 0xd2493d2e, 0x7ca9c7fa, 0xc31e3922, 0x5c1455f9, +- 0xf5f9f3d2, 0xebf89e90, 0xb3f12b24, 0xc9190701, 0x21f19edf, 0x7fd15fc4, +- 0x61f918b5, 0xeb073586, 0x427ae9c5, 0xfba0ee31, 0x5dc52d7b, 0x07d0cd40, +- 0x2f1efcfc, 0x8c78f0b5, 0x9a1bbc40, 0x554de5cc, 0xaa038f12, 0x291a368c, +- 0xcf9cb96d, 0x30a24e28, 0xd036ed09, 0x5794fb1e, 0xdcb99383, 0xe7a35f8b, +- 0x49643afe, 0x107b6530, 0x8c2ef253, 0x2c7da907, 0xecee5148, 0xc7a64e00, +- 0xe87f9476, 0x5492e3f7, 0xdf58edf5, 0x11d99df7, 0x9dfb4a9c, 0xbf7e9375, +- 0x43c62b4a, 0xdcc0597c, 0x7e4084b8, 0xb87245fe, 0xfb411e72, 0x137f62fc, +- 0x324993d9, 0x71e037e0, 0xfc87b06c, 0x8e26757f, 0x9e1a49ef, 0x77f869d6, +- 0x93e8107d, 0x790c1f90, 0x3efa773c, 0x1e49e1d9, 0x0599ed40, 0xa87bcbdb, +- 0xd0f30c7d, 0x28f7ca78, 0x9d435ef4, 0x304f2041, 0xfa6b2d1d, 0xe498db84, +- 0x7d211f31, 0xf91f0177, 0x775f8fda, 0xf52e8705, 0x6c4aa7df, 0x376ff66f, +- 0xed29da96, 0xd86a962b, 0xffc411d7, 0x922a5f08, 0xb7377634, 0x5095df37, +- 0x7a6d604f, 0xbb4a6b94, 0xbeefc013, 0x05ff7806, 0x27a61ff8, 0xf8e1ef81, +- 0xc3df019f, 0xf7c06ff4, 0xf014fcb0, 0x81db4c3d, 0x97f961ef, 0x9d30f7c0, +- 0x1b243336, 0x69aaa4e9, 0x855afb0c, 0xff873af7, 0x3189ddf9, 0xd9cbe37d, +- 0x9ed76e24, 0xfbfbef88, 0x7c71277f, 0xdf37713a, 0xd7906eb7, 0xfe019fa8, +- 0xdf84b2ad, 0x87776e58, 0xef9e73f0, 0xd77eb8d2, 0x5ff3c31d, 0x3fa8e926, +- 0xc66d86bb, 0xe9a5dff6, 0xe649ef29, 0xf85ba372, 0xa8ff012f, 0xc31e657f, +- 0x7aaa4a86, 0x814d24ee, 0xdef98fbb, 0x23c7cc9d, 0x1c3d44fc, 0x0fde31f1, +- 0x84ad2b3f, 0xf178819f, 0x249ba085, 0x58bbc703, 0x27c8f1e4, 0xbe744ca3, +- 0xe3b5f30a, 0xc49d7479, 0xfc3af1f1, 0xe77b70d4, 0x7e84fc3a, 0xe7804e08, +- 0x093fa412, 0x35251fc0, 0x45b77988, 0xe082fc86, 0xa0b3a2dc, 0x3227efff, +- 0x6bdb1600, 0x84ce8f7a, 0x10c8d8f2, 0xe41d9e2b, 0xd45e6e3d, 0xebb8ff17, +- 0x35ff5ddf, 0xffaf547a, 0x738b75ba, 0x375d5b93, 0x97e413f1, 0xf07d3f88, +- 0x1fc82187, 0x33f87c72, 0x849ed926, 0x264b74fd, 0xbb81fa2d, 0x022f1c4d, +- 0x1a5dfbd7, 0x3f055fc7, 0x18fc40be, 0xbac3fd80, 0xb9eb7d12, 0x80a0ff36, +- 0x14642df5, 0x8fb8110f, 0x5bf15f0a, 0x39c91dd7, 0x2601b83e, 0x041efc92, +- 0x71fd1bf2, 0xc70b649e, 0x676701f3, 0x81f9426f, 0xffea0272, 0xfafdc341, +- 0x56bedf0a, 0x2673c92e, 0x39f8a867, 0x67b07b43, 0xcbe881bf, 0xaf2561ab, +- 0x43825da1, 0x8f59d9f9, 0xf6f5f325, 0xa0d64f4e, 0x9df5d4de, 0x27f145d9, +- 0xa14e7b03, 0x59b5d67d, 0x6d3db8c7, 0x3c81249f, 0x057e8f9b, 0x8dc5fa2b, +- 0xa17b6e74, 0xd43d991a, 0x853e5cf3, 0xf3d56176, 0xe8023332, 0x9dbfe7e4, +- 0x60b2f886, 0x7a82cebf, 0x4fcdcac7, 0x3b7c461f, 0x515928d3, 0xc23577de, +- 0x457ea1b2, 0x04db884d, 0x8f21f3f5, 0xf59a17f5, 0x8f1f2b6e, 0x18a74cf4, +- 0x65536bef, 0xefa5fa02, 0x70475e79, 0xc783b05e, 0x79b3bc31, 0x9f639d09, +- 0x0a2c4b71, 0xcbcbe5da, 0x9fd0635a, 0x3364a2f8, 0x39a73b40, 0xefda3cff, +- 0xcd983b65, 0x3d8afe8b, 0xb2be7421, 0x7f1d46a0, 0xa4dee250, 0x64a27d47, +- 0xacbcba8b, 0x9d879d4e, 0x6ceb7e21, 0x3c33c750, 0x15e22c92, 0xf270d9d2, +- 0x9384d633, 0xd3f0a01e, 0xf631d91b, 0x324f9cc5, 0xfa244df6, 0xdffde549, +- 0xe6697dc6, 0xdf22c9f9, 0xdf4bf901, 0xe0517df2, 0xbf9ca952, 0x4f6cb0c7, +- 0x99dfc636, 0x55c7682c, 0xca157f36, 0xa82cee30, 0xcfa27efd, 0x538a6537, +- 0xbb24d75a, 0x2d15be10, 0x3e3197a6, 0x31ef72af, 0xe10435bd, 0x01e908fe, +- 0x1ad732f7, 0x1abcbfb4, 0x3c236b0d, 0x15ff236a, 0x202cf7b3, 0xc9b370bf, +- 0x6f3de742, 0x133ada7e, 0x66257bf3, 0xdc1c7dc2, 0xe0b2784e, 0x75ce9979, +- 0xb93e6a19, 0x71913c3e, 0x3d9f715f, 0x16bf68fd, 0x3ee3bee2, 0x3ee3bec3, +- 0xd89fb8cb, 0xe6ef443e, 0xccedc278, 0xfef9db33, 0x2f9efb2a, 0xdf93d06f, +- 0xf3ef96b8, 0x3fd7cf3d, 0xa078441b, 0x680f0263, 0xe16ccfdf, 0xbfdfaefb, +- 0xf1103f5a, 0x0f0036b7, 0xf0d70d9a, 0x1d77e700, 0x7fec041e, 0x07cbf0a9, +- 0xfee041e2, 0x44f82bdf, 0x10fa3c9e, 0xfe2cd9c6, 0xf1571f05, 0xef0ecd73, +- 0xaa0478ac, 0x11ff1a9c, 0x392cdd9a, 0x049635fa, 0xb421bd72, 0xc0f909b0, +- 0x86bb09f1, 0xfc099c53, 0x9c524633, 0xddefc11b, 0x053dfd5f, 0x7e3bbfe9, +- 0xe23796f2, 0x703aff69, 0xc161dd1d, 0x96ee7e5c, 0x1b9512dc, 0x538006bc, +- 0xa451f01e, 0x81b6f643, 0x07ba91ce, 0x31e8f43c, 0x693f77c8, 0x48f6e1b6, +- 0x951f6e76, 0x1277bcb7, 0x31ac86fd, 0x9fb2aecf, 0x8e537d84, 0x6f7e15f6, +- 0xefcafb00, 0x7cb24e3c, 0x4f3eed44, 0xcaf5a04e, 0xb266db1a, 0x9598ea83, +- 0xe3af63ce, 0xbdf88cf7, 0xa1ba07e2, 0xf7c0163e, 0xeb9efc7d, 0x2835cc61, +- 0xb14be90c, 0xb47e14b3, 0x0f4bf850, 0x1b44763d, 0x03aceb81, 0xb5bee3b8, +- 0x8fea1f00, 0xdb9d3d7e, 0x8dd1f92a, 0xf1167fa8, 0xce78e00a, 0x469f68b5, +- 0xd332fc46, 0x0f029d7c, 0x605f112b, 0x07d9659d, 0x775f5142, 0x6ce1fe0a, +- 0x497f210e, 0x8f98db19, 0xe30655f8, 0x9bc0fb79, 0x487bedb2, 0xde19bfcf, +- 0x655bfa28, 0x3fdebaa3, 0x250c9f90, 0x03f9927e, 0xfc69dfe0, 0x37c7c73b, +- 0x7e8ce4f2, 0xcbdc0718, 0x6e90fdac, 0x52d7246f, 0xfb290337, 0x36ee9bf5, +- 0xcfcaad32, 0x33e5516f, 0xfaaad13d, 0xaaac9ac3, 0x69bdc3ef, 0x0f23efaa, +- 0x9cf954db, 0xfaaa51b6, 0xabb49fb7, 0x17b477f2, 0x75dfeaa8, 0xef9550ae, +- 0xfcf580cd, 0xbdd739c8, 0xfeaa92d1, 0xd549ab78, 0x042a683f, 0x6169899f, +- 0x335ef2aa, 0xfa8dd387, 0xeea6cfbd, 0x7f6fb157, 0xffdd4a36, 0xdfbabb64, +- 0x6d87dd5b, 0xa0b52720, 0xb9076f6f, 0xd04ee989, 0x6fa0b5cb, 0x8e5e8037, +- 0x2f4157f9, 0x7a03d4c7, 0x06bf9639, 0x1be6397a, 0xfcc72f41, 0x3023b03e, +- 0x405d54df, 0x85d59be9, 0x78337e54, 0x0f718ab5, 0x888f718b, 0xc4db1971, +- 0xe04dfee5, 0x7f68a1f2, 0xc36fb454, 0x3c3e49f6, 0xd64828ac, 0x1d3a055c, +- 0x8f5e7e13, 0xc5f65ae7, 0xd768f9ed, 0xb32fbcf7, 0xcc2740ad, 0xdd5c3ee1, +- 0x0452e51f, 0xec2faf3f, 0x0efd00f9, 0x2d137b95, 0xaeb06e78, 0xf8a3e3e9, +- 0xb651abbd, 0x6c1ddd22, 0xfb142afa, 0x141578b9, 0x9e4291bc, 0x77f9de41, +- 0xf0f5f946, 0xc7d5e31d, 0x964501ef, 0xe48794e4, 0x2524c5d4, 0x0e7ba6ef, +- 0xf47b0d85, 0xb6fe74ed, 0xefbfbe87, 0x6fbfa9d1, 0xb77d55af, 0xf73c7d60, +- 0xcec9bad5, 0xf4a4d0be, 0xcefaa5e7, 0xfa8ec924, 0xefed85f1, 0xb738c1ac, +- 0x11453d8a, 0xde567e78, 0xde722c70, 0xd2ffc08f, 0xc8195dbe, 0xa19a2bd7, +- 0xbfafb33f, 0xc89d668a, 0x933bf9f3, 0x2387e4f6, 0x18906edf, 0x6c8b928a, +- 0x950dc523, 0x913bd537, 0xcda7952f, 0x4e39e1d4, 0xf61647b7, 0x73c38f3f, +- 0xc7d7185a, 0xe742573c, 0xf27fbf41, 0xe31fba1c, 0xde5bba69, 0xbb71c509, +- 0xdf869ef1, 0xc2913efe, 0x5227daf5, 0x8b87bdf8, 0x6284ef8d, 0xcf3ac5fc, +- 0x5aee1c3b, 0xa0ffad2f, 0x4a4377c8, 0x69926ef0, 0x3557a5fd, 0x7f4a0fb4, +- 0xd4c8a6cf, 0xe4a6f8cf, 0x71d75c10, 0x8dcf1f0f, 0xce3005c1, 0x62a2a4f8, +- 0xe891ff9c, 0xe9323919, 0xdc6fdc75, 0x3d62643d, 0x8e7813ea, 0xf5dd97de, +- 0x55b7e89a, 0x9fbdf7c4, 0xf22b7af4, 0x110523db, 0x880649c3, 0xb8533b7a, +- 0x77af919d, 0x389ca124, 0x1f92b66e, 0x62414579, 0x41efee08, 0xe0bcb14c, +- 0x97cbf265, 0x8ef1f235, 0x1142da5b, 0x8e378eef, 0x516f5194, 0x71c3abfa, +- 0x6facf8fd, 0x4fb45cdf, 0x335aee25, 0x3fdbe3f6, 0xb14eee5e, 0xee23bb50, +- 0x3f50d363, 0x4c169e3a, 0x9eab45fa, 0x37977b9f, 0x78f6fd70, 0xecad6c4b, +- 0x16e15e77, 0xa69dd1fb, 0x6aed7da1, 0x337a89d2, 0x9eaa99eb, 0x9d57ef8e, +- 0x77163e7a, 0x57a853c7, 0xe9945f3b, 0xb7538eee, 0x7fd71228, 0x7e7a8b76, +- 0x4ece0225, 0xd232379d, 0xcd9d5f0f, 0x4cc6e8d7, 0xd0acde78, 0x53f69589, +- 0x69e3c7d9, 0x1e3b2f5c, 0x390befcd, 0x5e13d4f7, 0x5b7de4fb, 0xb11dea3c, +- 0x4ee3c1ff, 0x2ad7666f, 0x5d9f80fa, 0xd3aed0c4, 0x68e62415, 0x3f727c12, +- 0x79fec52b, 0x97b400ca, 0x040ec90a, 0x3f210f64, 0xfdc3ea08, 0xedfeff90, +- 0xb7b71c59, 0xd440f411, 0x134d8c83, 0xaf4afef0, 0xe604080d, 0xe745bbdb, +- 0x198bf616, 0x4205d2f5, 0x756b3d2f, 0xbe78cae4, 0xeb435cb8, 0x81dd8272, +- 0x825d8a71, 0x13da5ddf, 0x07d233ff, 0xb416cb0e, 0x70f1ee67, 0xc0d9d63d, +- 0x4f4ad2f5, 0xa346effc, 0xb3a0ddde, 0x535a0559, 0x2fd0ac5c, 0xf5bd08ce, +- 0x3d1ef2cc, 0x25fb27d9, 0x5ff434f6, 0xce89b4d2, 0x7e842bab, 0x90372151, +- 0xb370b09e, 0xbd002f5a, 0xdf2f9545, 0x0837a81e, 0x5d47907f, 0x7277d8ae, +- 0x21fd35ea, 0xd011ed1d, 0x0e90a34b, 0xdcad53a2, 0x93ec266f, 0x28b69925, +- 0x5a75f7a4, 0x4fc504eb, 0xdaaaf080, 0xce297aff, 0xb20ceddb, 0xf4b0bd91, +- 0xf76b824d, 0xe90edc37, 0x8f04668e, 0xdbe1c66e, 0xbbf1c4dd, 0x8db9274a, +- 0x95d01ed8, 0xee4a33fa, 0xba87a8e5, 0x2f89437a, 0xf4805631, 0xb70678b0, +- 0x0be8ed37, 0x850bf485, 0x29f9140e, 0x5bbfba71, 0xf9872edb, 0x54e487f1, +- 0x138e77ae, 0x424b3b71, 0x06bf246c, 0x9d9eb91a, 0x8e19e257, 0xec1030f8, +- 0x9f9f8368, 0x2dd9a07a, 0x52babd61, 0xe45717ee, 0x45ad64f3, 0x7e2bfd87, +- 0x4cfce522, 0xb7895fe9, 0x16ff69bf, 0xebecdfe8, 0x0fdde01f, 0xdb257de1, +- 0x6e39f246, 0x6d2f72b2, 0xb2a3d111, 0x6f808b9e, 0x1f451fe8, 0x739bee0a, +- 0x7e7c81cb, 0xf746ddfe, 0xf943f2cc, 0x5c45f23c, 0x4f107e73, 0xbf72a4c7, +- 0x0e54cacc, 0x2a9166b7, 0x549beb7c, 0xc854d8fb, 0xf23aa7b7, 0x42dca953, +- 0xdae4b9f8, 0xa88c807d, 0xeef83ef6, 0xbdf88fe2, 0x0f402bbb, 0xbe7e7fc8, +- 0xa926b248, 0xe78e22f4, 0xe308bc55, 0x468c4e1f, 0x6decb838, 0xce789169, +- 0xce6be9ce, 0xc9359352, 0xec2e4fdf, 0xc4db0c2f, 0xd1529c73, 0x4a52c4be, +- 0x4b1c15f7, 0xd7e8ad23, 0x487a42af, 0x07fe39b8, 0xdbfc3de2, 0xc956f882, +- 0xde7e360c, 0xa6ddf81e, 0x417b3d45, 0x09c45d00, 0x4875ad3c, 0xfb598e74, +- 0xb9fb96bd, 0xd7e44966, 0x790a107a, 0x57a8b7bc, 0xa3e28632, 0x9d2c841e, +- 0x17f4d503, 0xe9fdafe7, 0xb101ea7c, 0xdc4507fe, 0x279d21c0, 0x8730fd1e, +- 0xcdf9f82a, 0x73a1e60c, 0x8dac59e2, 0x95c113d2, 0xb9d4bd7b, 0xd1da306b, +- 0xe40c3a9f, 0xb55da9ff, 0x6bf90435, 0xc1655b16, 0x93202373, 0xbc8c3fed, +- 0x78119eb1, 0xbdc4a4be, 0x9edcfb2a, 0xf11ab85a, 0x51ec1ce0, 0xdbeb88f4, +- 0x97b27f97, 0x1f3a69e2, 0x43da7d7d, 0x1e9bed0c, 0x5b28778a, 0xee9a3c34, +- 0x5b58b855, 0x7f6fae5a, 0xf654fd95, 0xaaacca0f, 0x0cb5857d, 0x674cf802, +- 0xe95eb93d, 0xc0a9fbe6, 0x33d74e39, 0xf2094115, 0xe050f88b, 0xaf702b3e, +- 0x3dc48b64, 0x674745a0, 0x5787fd40, 0x4fa8ac69, 0x37efb75e, 0x89af1fd9, +- 0x4886f27f, 0x68dea764, 0xfa7d94bf, 0x742fb8b9, 0x3bb78c32, 0xfc9973f9, +- 0xfbdbff7d, 0x63aa4df5, 0x3bc92a7f, 0x1b749f4b, 0xa237a748, 0x034b39cb, +- 0x4e8037e8, 0x0da5d1af, 0x3fdbf3fe, 0xa250d2c7, 0x9d7f6547, 0x517fb056, +- 0xd884b5fe, 0xfdfaecdc, 0xe7163b44, 0xb128d653, 0xa15ba417, 0x7bb276d7, +- 0x700bf703, 0xe0f28ec5, 0x553a00f3, 0x7c46f1f6, 0x277be14b, 0xbb9e5cf4, +- 0xfce9931e, 0x7bc90bf0, 0x2c7c82c8, 0xd7dd38fd, 0xb17fea52, 0x23f06dbc, +- 0x6317cfd0, 0xcf427a78, 0xbc94f9e3, 0xe5fb883d, 0xb83188be, 0x485ffd70, +- 0x9e5163e9, 0xc7fd217f, 0xa51f3cfd, 0x467e62b7, 0xe40b58d4, 0x3f14e84f, +- 0x87c10ade, 0x3c7fdcdd, 0x5471f6e3, 0x32ef624f, 0x2ff5bf7f, 0xcf5bf225, +- 0xf38e9601, 0x5cfb1f8b, 0x9f940241, 0x70e255fa, 0xac5b5f3a, 0x62e50fee, +- 0xb8fff93c, 0xd5f776dd, 0x86515d1e, 0xf26b9c6f, 0x5e65dc6c, 0xf64c9c5e, +- 0xad808941, 0xdb9d3c3d, 0xcf7e6ea9, 0xbd379150, 0xfb375f87, 0x0bcf27fb, +- 0x7cb5ee7f, 0xfe7193fa, 0xb6c0eaf2, 0x9fb05227, 0x0b2bbd12, 0xab9f1bef, +- 0xca1c43fd, 0x8f6d92f5, 0xb99e90a7, 0xda0a5d6d, 0x9f5b250b, 0x3e53b148, +- 0x8af641d8, 0x73bbaf96, 0xaf2f1df7, 0xeb6bd3f7, 0x3f9eb9d3, 0x0f2078cb, +- 0x4309cdf5, 0x3f46ad2f, 0x24aff278, 0xd6f44c8b, 0xe0e51ab6, 0xef8e34ec, +- 0x7c48c6ac, 0xa2fde199, 0xbefed8fe, 0x47c7e43a, 0x15d2bed2, 0x34ecbd43, +- 0x3663c12d, 0x82886f73, 0x64ad6cef, 0xf5fe67a9, 0x6139d307, 0x1f492ad1, +- 0x5be51fdd, 0xe3b470d8, 0x68c2d3b2, 0x0ed7731e, 0xd9f2c56f, 0x04f978cb, +- 0x38f1bb83, 0x9e9cf3f6, 0x804067e2, 0x9bc7f825, 0x3b71a767, 0x8906ce6a, +- 0x9c656bf4, 0x6b2367e4, 0x9d99d7fd, 0x39f3e426, 0xe521f137, 0x65a4db1e, +- 0x868ddec7, 0x1d6a0f7e, 0xf7c1a677, 0x499ccfa3, 0x2e333e42, 0xda067cfc, +- 0xc77ac919, 0xeeb8a50b, 0xcb8a06ad, 0x958aceca, 0x88fea0a3, 0x8d3cc747, +- 0x45659ce9, 0x3fa2942f, 0x3871b375, 0xf3e56f0f, 0x35592c5b, 0x53be3f68, +- 0x845cd0fb, 0x8c67b9db, 0xae2f1fa4, 0x3f628d4d, 0x02bfef62, 0x614d6ffb, +- 0xfbd8076c, 0x7b02ee98, 0xed4bef1f, 0xfca68eae, 0x94adab1f, 0xbf1ce9b2, +- 0x1f385b16, 0x237f51b9, 0x02b78ec1, 0x0b5ec91f, 0x78fe81fd, 0x107f6f46, +- 0xa43c99d7, 0xb13aeb62, 0x3f6864ae, 0x0f7f15dc, 0xdd7b21c2, 0x5aa8ad23, +- 0xe7e3498e, 0x5f1c1f7a, 0xf1fa471b, 0x4a978eb2, 0xb486fbe1, 0xded8d9c2, +- 0xd932e5b8, 0x3f34efef, 0x5de11b3e, 0xd7c0d5b2, 0xee7dd627, 0x17a89499, +- 0xfbd77fa0, 0xaba7b23a, 0xb4bc74b6, 0x1b79d20e, 0xe3fbd11e, 0x77aeadfb, +- 0xcdcf9896, 0x7046eae8, 0xd5d39ff8, 0x3f447113, 0x32ae815b, 0xaaba75fe, +- 0xe09cb65a, 0xe15a5af7, 0x9fc834ea, 0x90e2b9d3, 0xffa5ce9e, 0xb5dcf084, +- 0x2bf8225f, 0xbf6955fc, 0x9bdb8d32, 0x06cf1ae5, 0x7f04efd2, 0x3a2c16fd, +- 0xe681ef84, 0xdfa829b3, 0xe334db7e, 0xafbdd747, 0xd233bf9a, 0x7ff5f004, +- 0x734942c7, 0x1b448ef5, 0xc4572fac, 0xdf7e07dd, 0xce51a69d, 0xe05e48f1, +- 0xae2fc93f, 0xd62602a2, 0x92e51c2f, 0x7b420de4, 0xf3dee9aa, 0x379450da, +- 0xad52fb12, 0xfd2fb21f, 0xe68dede4, 0x12b4b37b, 0xf8fad1fb, 0x3527edee, +- 0xee43f7aa, 0xbd520f68, 0x8ecd71c7, 0x9d3d3280, 0x2ad4c4a3, 0xbf18f6f1, +- 0x4e9cd5d3, 0xc5e7fdf1, 0x7daea27d, 0x3f712f60, 0xdefd9309, 0xdcdf3835, +- 0x367c8599, 0x6f95bd70, 0x387e1276, 0x4cbf1e9b, 0xf8d364f6, 0x9bacdaf3, +- 0xb6c0ffaf, 0xe2677a4e, 0x173daebc, 0x7d2ea2ed, 0x43ee167b, 0x9f9c5be5, +- 0xa0e14fff, 0xd5ae9794, 0x649dbf73, 0x4f2efb21, 0x79f648be, 0x9f6e61d7, +- 0x4cbf3657, 0x85b7b4fc, 0x34aa47fb, 0xe851f96d, 0xd1d4584f, 0x37acfc8a, +- 0x954bdb9a, 0xe8ff9ee2, 0xb5072144, 0xff78713d, 0x9f3892e0, 0x7c34ec55, +- 0xb5e90037, 0x5271e34a, 0x305650dc, 0x0b8f73c3, 0x3e50cf48, 0x1afc697b, +- 0xee73f3c4, 0x3f902301, 0x8ff5907e, 0xfda7f24a, 0x9322d829, 0xe2ab297e, +- 0xc3adaf9a, 0x14c0f32d, 0xc1abe8a6, 0x2adef8aa, 0x6467f5bd, 0xe7e11eef, +- 0x3843555e, 0x3937b13d, 0x3aac553d, 0xebf68fa0, 0x9e82afef, 0xc26f3d14, +- 0x7441fe9f, 0xfb64cff9, 0xa33f217f, 0x5fd86ffb, 0x24b73f74, 0xbeb97a89, +- 0x8b733e73, 0x640bafb0, 0x24d55efa, 0x62ef3c33, 0x1e7421d1, 0x5236c05f, +- 0xe604e09c, 0xb17a4d19, 0x7c29fdb6, 0x9fe26587, 0x371891e4, 0x9d2e7a05, +- 0x3907e71b, 0xe8ae3092, 0x70124684, 0xf64f64f5, 0xe9396793, 0x968d4e5c, +- 0x3d639225, 0xa7a4c131, 0x315e9f8c, 0xfa7f5fcb, 0x4fedc487, 0x26f487e8, +- 0xf7e1eee6, 0x593dbc40, 0x4c64effe, 0x22f053fb, 0x93cc8b92, 0x9c6fcd3d, +- 0xa71e74fc, 0x9dcf0571, 0x89549f81, 0xf93ccdf3, 0x0ed167fb, 0x9f9fbc5a, +- 0xc4d09deb, 0xc9714a7f, 0xc258af78, 0x1efcbbfb, 0xbb307337, 0x7327e91d, +- 0xa95fdd00, 0x8c312dda, 0x366cab2f, 0x4d7f456c, 0x123daea5, 0xd35d79f1, +- 0xe7c47a27, 0xccef3c2a, 0xb97ff7e4, 0xf742daff, 0x8c2cabb9, 0x534557e4, +- 0x47e8a7ea, 0xa5cc38ab, 0x18f68568, 0xb7c8e9d9, 0xc6f2bc71, 0x3b97643d, +- 0x72ec9799, 0x6f1a8367, 0xf6fba37a, 0x5ba7e7a3, 0x8c62ef55, 0x63e9ccdf, +- 0x9ac3c61a, 0x43f939a9, 0xd54747c7, 0xc9bbdffa, 0xb5f0e74f, 0x51ab9dcb, +- 0x904ee98f, 0x4a8ef86c, 0x156b9077, 0x14ae47ea, 0xbf74d7ae, 0x017b2bbd, +- 0xf67717f1, 0x077c4cd4, 0xe3b1eb86, 0xcad26ed7, 0xdf19f37e, 0xdd7ffdc2, +- 0x1f64ac41, 0x1063bbed, 0x29fdc7ee, 0x39e90585, 0xd1cc7ef4, 0x234fd0bb, +- 0xae04e9ee, 0x9f0a68e3, 0xdff411cf, 0x3de6f864, 0xf3963631, 0x3c26e633, +- 0x62f7156a, 0xa516f894, 0x578116fd, 0x8917ecd7, 0xc46e9dfb, 0x04bcf05f, +- 0xbcf132e3, 0x229dd304, 0x4bcf137e, 0x88aaff30, 0x12f3c4df, 0x12f3c72c, +- 0xf88a37cc, 0xc12f3c4d, 0x60979e3c, 0xdf88a6fa, 0xa553823c, 0x1ae6b3b8, +- 0xa4568bc4, 0xfcbe81b5, 0xfc80f089, 0x13fd7540, 0x3f3a92e1, 0x8bfaa250, +- 0x5c6b9bd2, 0xb4a7e819, 0xfdc57908, 0x1d83eb94, 0x2af840bf, 0x15cf0ef7, +- 0xe90fbd3c, 0x8cf85c68, 0xbd5f4859, 0xf90c0dfd, 0xc774aed0, 0xf877ac32, +- 0x9b493df0, 0xe89a3f88, 0xc3c4f8fc, 0x05f75543, 0x5c8da4c7, 0x31f90d95, +- 0x6bdc4966, 0x50ac38de, 0x5cf0fbb1, 0x5b28a5bc, 0x0582f9cb, 0xd93ce4f5, +- 0x2ce38c59, 0x448d318e, 0xd53c3bfe, 0x1fba78f1, 0xb81fcebf, 0xa1f50930, +- 0x53f59d56, 0x3eba97f4, 0x9bb431d2, 0x529abf14, 0xe63a90cf, 0x3e376c19, +- 0x08d5712d, 0x0c881fec, 0xcf5d9cf9, 0x767e701a, 0xdfc4b04d, 0x916ab08d, +- 0xf6233c0f, 0xeb95ac7b, 0x55bd5ec5, 0x76768e1b, 0x78fe98d0, 0xf62ada7e, +- 0xdfd8b0f7, 0xf17f6223, 0x969c69bc, 0x8a61379f, 0x2a984de7, 0xd2c75a71, +- 0x274a5f0a, 0x21c4f6f8, 0xddbf157c, 0x1a3ee504, 0x9ea1c4f3, 0xd7c099f0, +- 0x919f0407, 0x79eb0ad2, 0x2fdd0f3b, 0xb4fe172c, 0xa0be714e, 0xe76953ac, +- 0x9dc7cf6b, 0x67f38c32, 0x13dc4fd6, 0x185cc41b, 0x8de53af7, 0x7507f218, +- 0xce3df9b9, 0xc8db4029, 0xfc1bd8bf, 0x73459dfc, 0x7af2993a, 0x295bd514, +- 0xe1159afc, 0x0718296d, 0x49e825df, 0x76f72bc9, 0xde40462b, 0xafab8bec, +- 0x8296d298, 0x925df571, 0x54788349, 0x3f7f95b1, 0x22ade82e, 0xbca7f441, +- 0xc4f46087, 0xef743ee1, 0xef0e237f, 0x7b37ad89, 0xef7e7017, 0x98f2f7e5, +- 0x84e30537, 0x29cf253a, 0xdfad878c, 0x8c41f939, 0x79d4ed87, 0x8efcc25e, +- 0xc41f539d, 0x694ed878, 0xff8b29cf, 0x389e01f7, 0xdfad978c, 0xf7e44539, +- 0xf36614bc, 0x3b5eebcb, 0x2bf5df85, 0xf1883ea6, 0xee0d13b3, 0x2f88d5c3, +- 0x6578e47f, 0x0cf7bdda, 0x99bca7c2, 0x7763ebeb, 0x1af8bdef, 0x21bde3ca, +- 0x55ff6e74, 0x7bc13c7a, 0x1b2bf365, 0xf6bacf10, 0xd60e88e8, 0xd2f27c37, +- 0x819ea9af, 0x689b2b9e, 0x6ba364f0, 0x979dd5e4, 0x2771c01f, 0xc1be7b06, +- 0xcc869ffc, 0x8c4c79a6, 0xeefc74e0, 0x3107a290, 0xef6bbd9e, 0xee90c7ee, +- 0xfc63f626, 0x132ef5de, 0xebd94fed, 0xaed0e3e9, 0x9b690aef, 0xee57fd8d, +- 0xfdf3f034, 0xbde8a3d7, 0xee749e88, 0xb21d2e6f, 0xabe50e31, 0xdb1dcde6, +- 0xc67e8d7e, 0x6f3a269d, 0xfae70aa9, 0x9b5c995d, 0xdfed08fb, 0x80fedbcb, +- 0xa261def3, 0xf452cff3, 0x74be40ad, 0x17bf325b, 0x66afcffe, 0xc9e43ee3, +- 0xca7ee85b, 0x0d267537, 0xdeb8e1c2, 0x83ef0fde, 0xc8eb8eb8, 0xf9152cce, +- 0x7c1113d2, 0xf9edc13e, 0x37fd7fb4, 0x2d7ca1c6, 0xfde5f88b, 0xf289ef38, +- 0xced097c6, 0xf7f0af61, 0x00efcecd, 0xf3bb41b8, 0x0e8a3af5, 0x4211daed, +- 0xa53bb6f7, 0xddf1b38d, 0xaf3d570c, 0x48da69d7, 0xa7d574f0, 0x76bdf7f2, +- 0xb0c3a740, 0xf95526de, 0xb257faf9, 0xb0bd0ed0, 0xa3d92273, 0xf42b9e0a, +- 0x78175652, 0xafdf8c2f, 0x337f132c, 0xfd998b8b, 0xf6174afc, 0x02f5df3d, +- 0xd0bfb5f3, 0xc8fba3a0, 0x0ab606a5, 0x7a1571e3, 0xb7bd8b28, 0xa657d700, +- 0x7d414da9, 0xfb6474a5, 0xf38ba46c, 0x868c6626, 0x39081f7a, 0x7cb8d655, +- 0x37bdea32, 0x431dcf9a, 0x56fa1f38, 0x4db7e1d0, 0x79ffb726, 0xb7fa605f, +- 0x50fd666a, 0x7cffcbeb, 0xdc9efa91, 0x138f7a07, 0x70cab3ed, 0x414e3fce, +- 0x5fe006fd, 0xfce10fb7, 0x7552ce62, 0x3c218cfd, 0xdf52b10e, 0x4ef2829e, +- 0x887d3fe9, 0xda83eb85, 0x2a277a76, 0x5944ddb0, 0xfc5d9bf0, 0xa35969de, +- 0x1df741d4, 0x3e91a410, 0x5d199678, 0xe9d38c6e, 0x73a21f6b, 0xbde03ec5, +- 0x34f12182, 0x8983595e, 0x07972dee, 0x7ea287b5, 0x0f690ce4, 0xeba7bd45, +- 0x8bde994d, 0xafebedc4, 0x1be09ff4, 0x9617f14f, 0x5376747a, 0x72c1e35f, +- 0x885e2ed0, 0x3e28037f, 0xeb40921b, 0xe60a692e, 0xed2da4f7, 0xf0386f74, +- 0xd3ae211e, 0x5d8f47e2, 0xfa472f4d, 0x87b3e7db, 0x57ff0bc4, 0xf74dd107, +- 0x438cbf3f, 0xb0d3283c, 0x785e7855, 0x15f7e241, 0x15f74f20, 0xc773882e, +- 0x41ccefb2, 0xbe173f88, 0x771d1275, 0xe7c4ed49, 0x88aabbcc, 0xdae9743f, +- 0x4349cf89, 0xae7c417f, 0x367dac2b, 0xd0f32df2, 0x4c7bfc35, 0x4fbc6cfb, +- 0xc8886173, 0xf724660f, 0x40daee07, 0xcca264fc, 0xcbd818e3, 0x0bf70b3a, +- 0x142f7871, 0xed6c6270, 0x3bb26a89, 0x8fd45674, 0x424a8762, 0xd6fbd7ff, +- 0xa9e8fb2f, 0x3777598b, 0xf0967d22, 0x9f406277, 0xf50d786a, 0xf49119be, +- 0xdc204dce, 0xfebe7394, 0x805f7fe1, 0x710a64fb, 0xe7821cac, 0x64ed19d5, +- 0x93b60057, 0xb6f95efe, 0x6ecbec81, 0xe436cf5d, 0xc7661d5f, 0xa9cf58e3, +- 0x2d935b6f, 0xf6fa7de1, 0x9bdf3c56, 0x7be3dca0, 0x575be385, 0x9efccbc6, +- 0x7c273882, 0xbe03ec4e, 0xf88b5881, 0x7e7df121, 0x0ff5e9a7, 0xb574df91, +- 0x0e9f1225, 0x4df3a7a4, 0x0a7bd34f, 0xbbae4127, 0x93ffecfc, 0x79d0af45, +- 0xc38c74fc, 0x3f7f5f30, 0xa9fbf7b5, 0x0db20764, 0x8f88e57e, 0x207cea35, +- 0xbd2f105c, 0x11703a2a, 0x5ba78fdc, 0x63a3bbf8, 0x821de8db, 0x9029f96b, +- 0x07f2fd97, 0xf501f203, 0xea3b5ef1, 0x2f51c70f, 0xf60e3840, 0x7dbb209e, +- 0x5d938f37, 0xf28d7209, 0x9ce9837b, 0xe41bb358, 0xb72e7f56, 0x87945e50, +- 0xaabf91b6, 0xce81af6b, 0x9f345637, 0x03f5c38d, 0xa65f923e, 0x488df9bc, +- 0x12bfe7b4, 0xc7c80376, 0xd94b8a48, 0xf6891cdb, 0xd4ee5287, 0x7c445278, +- 0x0ff2167c, 0xf642bca5, 0x553dd0a6, 0x39de8da9, 0x4de70af8, 0x632f21f5, +- 0x9c3ad19e, 0xd67ba712, 0x0a6bdfcc, 0x8213b7dc, 0xa07f019f, 0xbc572777, +- 0x0a05fdc9, 0x7c15283f, 0x679620e5, 0x28b7fa70, 0xde7843e7, 0x07df7483, +- 0xe140789f, 0xf9116c7b, 0xb10f8e73, 0xf68ab872, 0x37f72fd4, 0xb7b8b8f1, +- 0x3212b33a, 0xdaf59db0, 0xfc6b8f7d, 0x5fc7d128, 0x13440f90, 0x8ba1581f, +- 0xbd957584, 0x3abbd124, 0xe796b3a5, 0x50b67543, 0xe7bd08fb, 0xae718259, +- 0x15e7ebe6, 0x43154788, 0x34ca9c38, 0xdb2eeedc, 0xcf39d126, 0x3f3f1d05, +- 0x71437e03, 0x2dc70bf4, 0x9bfa47cf, 0xef42bfdf, 0xacdf1f6f, 0x5beeebff, +- 0x1f9e5a2f, 0x979d07d5, 0x3ad4dd2d, 0x5fdf5d80, 0x3f36a3a9, 0xb97d7ad2, +- 0x260bef32, 0x75639e65, 0x31e1fc03, 0xbe3e797d, 0xf8d0b8fb, 0xaf83c2af, +- 0xc1b342fb, 0xe017728b, 0x77b5e74b, 0xf2a45d5f, 0xbfacdeab, 0x73a6e652, +- 0x3fcd1b8f, 0xde4a7530, 0x0ad71413, 0x744f55f4, 0x37e37406, 0x024363de, +- 0x452511fc, 0x157bd1b7, 0xfcdba28e, 0x298111fd, 0x1a81ca30, 0x5170d98a, +- 0xdb38740a, 0x943c07d6, 0xb94389fa, 0x8131f55f, 0x962703c7, 0x231aff3f, +- 0xe86d8e3f, 0xc7df1b80, 0xfff043b8, 0x718fbe5b, 0xb7af304f, 0x574164df, +- 0xbffef74b, 0x7bb83f93, 0x3f3a79b5, 0x18b33067, 0x9d1adef8, 0xefdfd5b9, +- 0xb7b889fb, 0xe996f780, 0xee9a79fe, 0x1949fdc7, 0x49fcd721, 0x04646fa4, +- 0x574af9d3, 0x6f9215d3, 0x16392ddd, 0x6ae9073c, 0xde919b73, 0x5ff9feaa, +- 0xbb872891, 0xb8a6be5a, 0xcfefaeb0, 0x3ad8bc52, 0xb077b711, 0xb55bc449, +- 0xbcb04359, 0x7cabe0bb, 0xa45eb7ac, 0xf7027f3e, 0xe2a92ba7, 0x9f7bf02f, +- 0x1cd0d667, 0xdd6b3f7c, 0x3e30d953, 0x45cc6e33, 0x7376007e, 0x9f0dca38, +- 0xf51ac11f, 0xe88bf163, 0x72d24847, 0xe8a6023f, 0xe24a4847, 0xa3cc047e, +- 0xf453011f, 0xfa396023, 0x7e8f3011, 0x1fa3cc04, 0x47e8f301, 0x08fd14c0, +- 0xb88dfe58, 0x8c0dd12f, 0xcd39fb8b, 0x6097f7c4, 0x6fc030fc, 0x78bf7889, +- 0x777f3d49, 0xa04bef07, 0x7e2ebbfc, 0xcfc451a6, 0xf9d13678, 0xd95ed55f, +- 0xf7845b86, 0x18295c2a, 0x0873d347, 0x7b553ffd, 0x2b72db24, 0x79a74f96, +- 0xf9c96bac, 0xd7961674, 0x5ef86ceb, 0xdf13e016, 0xe2895acf, 0xea5aca98, +- 0x2e355fc9, 0xcdc53f6a, 0x0c483557, 0x0cd3acfd, 0x90ae4edc, 0x9d0474a1, +- 0x5d1e9297, 0xfb236861, 0x64bb7ca5, 0x5c9fbff5, 0xf132ea35, 0x78dce509, +- 0x2ac4ff01, 0xb16b263c, 0x79dace4a, 0x69fe13fc, 0x9137c5f5, 0x17a7e21e, +- 0x64f3c02d, 0xa7bf972c, 0x60151b7b, 0x374846e0, 0x6b2a7f8f, 0xe306b3d9, +- 0x0e356ea6, 0xe2a1e5ea, 0xbf3878fc, 0x4cf0518f, 0x30bdeef1, 0x0346ef5e, +- 0xd2bb29e9, 0xbf113b1d, 0xe4ece90e, 0xdfb4396f, 0xe9d67644, 0x7f2aa94d, +- 0x883c9e4b, 0x758b1dfc, 0xe1efc912, 0xb60f0ea9, 0x1e60a7bb, 0x89ee59f9, +- 0x563a210e, 0x5a90d0f0, 0x81f21af8, 0xf25699c5, 0xd819e56f, 0x113fa82f, +- 0x53eca557, 0xde894ade, 0x36622e4d, 0xc7305fba, 0x5389dfce, 0xc39b75de, +- 0x82839c78, 0x49378b57, 0x364eddfc, 0x5b3ce088, 0xcb4e73c0, 0xc74ef47b, +- 0x5778833c, 0xbfcfc34e, 0x78f3d763, 0xc2f8f986, 0x8177be11, 0x7c9327d8, +- 0xca1dbb7d, 0xe283c11d, 0x8d6f7eb8, 0x8e8bfec2, 0x373e28e8, 0x14beea2f, +- 0x71f9c907, 0x7920c714, 0x0c3fca67, 0xa9fe31fd, 0xa438638e, 0xeb841c2b, +- 0x253c456e, 0xd2838eff, 0x9425d523, 0x251c7e2a, 0xff7bb06e, 0xfc707b1b, +- 0x6efe2abc, 0xc5ef0dec, 0x3f7df505, 0xf027b94c, 0x0e29c619, 0x1f1ff5c0, +- 0xc4dbef89, 0xe1b6677e, 0xf6a2f3fa, 0x44aabdd3, 0x933fffd1, 0xfee0cf0b, +- 0x0b9943d8, 0xcc39e1db, 0x3e678046, 0x3f42402e, 0xf78ec7b9, 0x4bf67a53, +- 0xbe5f8a16, 0x5a6e6f8e, 0x5521f18d, 0x6bbd1249, 0x31b41f9d, 0xcffa122f, +- 0x21b7884f, 0xe26aaedf, 0x482ed67e, 0xe5dfbef9, 0x18aaf7a6, 0x826a3f7f, +- 0x53fbb7d8, 0x3a1f7f1c, 0x513e57c0, 0xcb7755d0, 0x7bb71e15, 0x1d6c3f73, +- 0xf8c73fbd, 0x0ff41f7b, 0xe87135e6, 0x2ac7f260, 0x10dbd378, 0x26f115b5, +- 0x9bb78324, 0x0e98eb35, 0xcd2906f5, 0xfc80cc61, 0xabcbe2ec, 0x7d9d6923, +- 0xf894c5fb, 0x98bf40f6, 0xbffd7f3f, 0xb0ff6b88, 0x47a5117a, 0xda5297ab, +- 0xefa2ed56, 0xcb6e1720, 0x6a7f35b8, 0xfe1f464a, 0xf6b46654, 0xf40ab923, +- 0x01d6fdcd, 0x6ba053fe, 0xdf5d1f8d, 0x773612d3, 0x351dea2d, 0x128f7a7a, +- 0x98978ce3, 0x32d80f89, 0x2aa3f4fa, 0xdf933370, 0x469997b5, 0xa6c7fc20, +- 0xf0356a25, 0x490ccefd, 0x74865e75, 0x3a43eb82, 0x44e914c1, 0x7cefe7eb, +- 0x9c240f51, 0x1700f5cd, 0xda2601e9, 0x81cb35d7, 0xeef8487f, 0x3fc5458f, +- 0x0ff0062e, 0xa61e5830, 0x062d55fb, 0x8946877a, 0xc90b1cb7, 0xf07d11d5, +- 0x27e70f13, 0x3b3c8383, 0x657fbee8, 0x1ef3c510, 0x3afc71d2, 0xc9c78eb4, +- 0xfe42b315, 0x7cf5d0de, 0xcccbee85, 0xf539e88b, 0xef3fa807, 0x33e93309, +- 0xe416626b, 0x257c3bfe, 0xe0106507, 0x4b2c6b9d, 0x9be0b8c3, 0x03bbcaa5, +- 0xd021ded7, 0x271cf78b, 0xaa6a77f0, 0x5953fe84, 0x54fa216c, 0x6a5661ee, +- 0xb06b1d3d, 0x1e10ff5e, 0xf465a1ef, 0xcd71c8ce, 0xa9eefe40, 0x13e3b3a0, +- 0x1b9fc912, 0xc5e3d2b9, 0x93ee7b7e, 0x71da7de8, 0x831dfcc1, 0xf3a14d3c, +- 0xaefef815, 0x7d47df86, 0x9029df11, 0x5fb95f71, 0x93ef77c4, 0x05b169eb, +- 0x7fb95b21, 0xb3fbbf98, 0x00fe1252, 0xb74b6ef1, 0x1fdde03b, 0x374aeef1, +- 0x08f59c2b, 0xcae981f2, 0x27d68ffb, 0xa6a07cf1, 0xf7788874, 0xcf7fe387, +- 0xf90da364, 0x3e70cd59, 0x04d29aff, 0xac948fee, 0xb98e51cb, 0x1c68c37e, +- 0x833fbbdf, 0x1fb2bbe9, 0xa72e3bca, 0x43bf1c43, 0x9ef811be, 0xe152b3cb, +- 0x4fd8f98c, 0x27af9f26, 0x43e3f399, 0xb93c8633, 0xc838e10d, 0xf87a839a, +- 0xb96151dc, 0xac47e012, 0x800cb996, 0xa69be87f, 0x69d66e77, 0xbc602bdd, +- 0x2f715a41, 0x3df82b5f, 0x82341974, 0x90f5dbea, 0x217a7a2f, 0x8abca3b3, +- 0x6c5ef465, 0x879f9192, 0x29863b43, 0x946469ba, 0x85fb8c83, 0xfef1fa8a, +- 0x7b98a28b, 0xd9fd4485, 0x673c4a35, 0x020efe2e, 0xb6173f23, 0xed411d0f, +- 0xdede1a5d, 0xb6f485ae, 0x51defe44, 0x9d036acf, 0x3e3d1683, 0xa4e3e498, +- 0xedfbeab1, 0x38f067df, 0x985d2505, 0xf9d15569, 0x74e955dc, 0xd577389e, +- 0x43d40a8c, 0x74c10d1c, 0x81f3af1f, 0x9df0bb97, 0xbdd972f1, 0x6bb413e0, +- 0x216f1d32, 0x5920b95f, 0x0a85ef67, 0x477c1f73, 0x0e31718f, 0x6f4be4cf, +- 0xed70dca2, 0xbaef8a39, 0x4c80ffdd, 0xfc67efed, 0x8ab6647d, 0x9f7903bf, +- 0x1a36b2eb, 0xb46fbffa, 0x0ef27e44, 0xf50e2593, 0x5fb122ba, 0x14ff82ad, +- 0x829c19ad, 0x787df576, 0x9c87dece, 0x3d793291, 0xf76dfbe5, 0x635d9530, +- 0x990ddf10, 0x25b7bd7c, 0x6bc5eff2, 0xa1891d0d, 0xa9bcea98, 0x8d86da90, +- 0x65f118fd, 0xdfcb0252, 0x25fc708c, 0x987633f7, 0x97ce9798, 0xae0933eb, +- 0xf1d3d60e, 0x6ea3ae38, 0x63a3ad28, 0xde8e258c, 0x8aef10bf, 0xfe70b7ce, +- 0x8f8631d4, 0x1ed2ca73, 0xe9c19e12, 0x9d17df07, 0xebf4b627, 0xba9f2ba5, +- 0x5bcdea1d, 0x927ba466, 0x4a999ff3, 0x1abcca76, 0xb247ee99, 0x45f7ea0d, +- 0xe2749e41, 0x0bdf02fc, 0x14177c0d, 0xa0f11cf7, 0x78448378, 0x9b4adb74, +- 0x7bdfcf1e, 0x009e8136, 0xdecd8bdf, 0x8a0bd424, 0x0adb266d, 0x43778fa9, +- 0xe5b807bf, 0x8ccbbbe2, 0x592126fc, 0x6e38ab8e, 0x7a22c6d1, 0xc33833a7, +- 0xdbb0fe41, 0xfd441ec0, 0x4e4c8ee7, 0xbc00933f, 0xb683cef4, 0x9fed063d, +- 0xaf1c193d, 0x525b8526, 0x269784cc, 0x3bbbf786, 0x9c149674, 0x936ac75f, +- 0x499ef506, 0x027e382b, 0x23b518dd, 0x059fbe30, 0x111efd21, 0xd72d67ed, +- 0x7e42d616, 0x90ed8810, 0xe19bc470, 0x0e8f9f84, 0xf119fc73, 0xd86fdcef, +- 0xf39fe428, 0xf3e26c36, 0xb4cffb12, 0x9ef0e36d, 0xf8fab9e5, 0xa0571811, +- 0xc3a3c3e0, 0xfd325ac6, 0x8901e0f1, 0x73d61ff6, 0x6d8de518, 0xccc8dcd8, +- 0x007e5401, 0x58d263f1, 0xe421c52f, 0xe7864ec9, 0x8cd1bdf8, 0x197be9e2, +- 0xb5ded7a7, 0x0a6fe25a, 0x01f8509f, 0xef1d83e0, 0xadfb2ac7, 0x2bff85f0, +- 0x43e0043d, 0x1be1457c, 0xf0517f0a, 0x8133e14b, 0xc01b3578, 0x6a08f77c, +- 0xe14cfc4f, 0xcd0eb863, 0x517f1f08, 0x76b759f6, 0xadfc868c, 0xe4f39f62, +- 0x40dfbb8b, 0x49989438, 0x1706b96f, 0x12e091b3, 0xf84d67a7, 0x47caea3e, +- 0x402cf70a, 0x416dfc7c, 0x331fea3c, 0x18f7d44b, 0x7d48be7f, 0x52ce717f, +- 0x59c5fdf5, 0x843e3f4b, 0x5086a77e, 0xbfdc04c7, 0xf33dbf53, 0xfe50a7e2, +- 0x90bdbf9f, 0x8becedcc, 0xb8e1cff5, 0x3cc482cb, 0x96bcf9da, 0xdcbe49e9, +- 0xfc30f426, 0x9732fb87, 0x8a2d3a71, 0xf28a3b0f, 0x29c22e6f, 0x611fdf0b, +- 0x89bfcf04, 0xf62539fd, 0xf73568a7, 0x24b8743b, 0x5dcc43f2, 0xad74e825, +- 0x97f25efa, 0x383dac31, 0xf97f77d1, 0xc4a4dfcb, 0xf72b5d21, 0xf96b1d95, +- 0xe969667d, 0x1c5fd261, 0xae50fbca, 0x96a1f780, 0xcf7bf2b6, 0xc4fbeaed, +- 0x3d76d9c1, 0xb71829f9, 0x1da6e6a3, 0x1b35f1e4, 0xb28a0b25, 0xbc5e5162, +- 0x57dd5256, 0xdf93247b, 0xd0cc6b17, 0xfa0bbf72, 0x1f38949c, 0x7c04be3f, +- 0x15cfee83, 0x5fae1c6f, 0xe747c7e0, 0x6979f28a, 0xf2954a1a, 0x571e0cc6, +- 0x03448c1a, 0x4b4faefd, 0x7e27cfd0, 0xa8bf2567, 0xda6e7f52, 0x37e83588, +- 0x7f01bb98, 0xfed7c79d, 0x6a5a9937, 0x26f428df, 0xfcf80de7, 0xfc2a38b5, +- 0x379a0ef3, 0xaf65d3d9, 0xdf157aee, 0xdcfb2fbd, 0x6ca67240, 0xcf5f3898, +- 0xa54ee770, 0x9f7e63f3, 0xf7ec52aa, 0x845f5db8, 0xd5509da2, 0x8671dfc8, +- 0xcad303b4, 0xef642565, 0x1e80da57, 0xf78fafc2, 0xcfd5f77e, 0xd95fb943, +- 0x9f41ab15, 0xa59df888, 0xc8afc6ca, 0xdefca0ef, 0x2abb6052, 0x6e50fbe9, +- 0xff985abf, 0xede411ef, 0x549d11d7, 0xb97b7335, 0xf215ef6a, 0x5fed579b, +- 0x63e8e91d, 0x13dfd7fd, 0xe8e2abb1, 0xcb86d8ab, 0x06fe0f74, 0x4c9eeaf1, +- 0xedc3eef1, 0x538a76ec, 0x2b8a32d7, 0x2ebbf6ba, 0x8d1fe4ee, 0xacdaac8f, +- 0x5ea078a1, 0x9e1fb5ad, 0xfb8b75c7, 0xbef58151, 0xd776e4cd, 0x7c23a025, +- 0x41bba377, 0xee9df3a6, 0xabbfee06, 0x15ba786c, 0x8256a5ef, 0x5ec30ce1, +- 0xd9543fbb, 0x7fa33328, 0x1fc61adc, 0x9e78dc45, 0xe842bbe5, 0x8f52981d, +- 0xf987af64, 0x34bd82f4, 0xc73e6fc0, 0x1b955e05, 0x2fb4b93c, 0x0387fe62, +- 0x96d29df4, 0x2b9ee9a7, 0xfd22ebd4, 0x8cc18fe4, 0x1cf5939f, 0x6e7679c5, +- 0x5ae74919, 0x953d9ea5, 0x086c77e4, 0x0b9578a6, 0xe9bdf53a, 0x53bc6253, +- 0xafee3c99, 0xb124e313, 0xe932abfd, 0xa44f38a7, 0x3a920bc7, 0x68b4e38e, +- 0x6dc05a77, 0xa54ba09d, 0x23a7a97e, 0x9fea0934, 0xd298fa6d, 0xd4bf512e, +- 0x728596dc, 0x30636cf3, 0xdb3d63dd, 0xb7fc87f8, 0x9e4bbc60, 0x3f25fd31, +- 0x74b292fa, 0x88b63f7c, 0x08eeb8fb, 0x43c4cf71, 0x886ce9eb, 0xacbed095, +- 0x9d5ef110, 0x6a87af8d, 0xff5d7e88, 0x4d5defde, 0xb15deebf, 0xfea046ef, +- 0xbd576c62, 0xd5bff62b, 0xff28a57f, 0xe3142a44, 0xb9c5e8f4, 0x101dff30, +- 0xe13ba08b, 0xcc3d9d8f, 0x7fde10fa, 0xdff01f65, 0xffbd030d, 0x668fb439, +- 0xec8239ff, 0x0ffdfc4f, 0x21f37fcc, 0x3d9b2f3f, 0xe895f052, 0xd7f41cf6, +- 0xfd73c477, 0x2816b9c1, 0x0e5a4011, 0xf802e5f8, 0xe61add39, 0x2cd0fc80, +- 0x02753f6e, 0xe187ebfe, 0xe58e3cc8, 0xf877d814, 0x35eb8c9e, 0x4cec8e7e, +- 0xbde0a6f0, 0x4f114ebe, 0xa6f70ce0, 0x17bf4044, 0xa7389e05, 0xdffc5378, +- 0xf56e74a9, 0x45cd3c52, 0xdf873f11, 0x1ce79fd1, 0xc475ebc1, 0xdee8ba5b, +- 0x8610dec6, 0x8de6aafa, 0x8ac3c210, 0x0d5b4c57, 0xa8d2767e, 0x5f0fae2c, +- 0xad77f3d4, 0x7cf8db5d, 0x5237434a, 0x7e05173f, 0xa46d0697, 0xf7129df9, +- 0x3cf54b83, 0xf463a1df, 0x0ecf7c9e, 0x85cf6efe, 0x387db698, 0xe91d85ce, +- 0x11da6714, 0x44d05eef, 0x497c79df, 0x17834ed9, 0x477e75e7, 0x2a03dd08, +- 0x3a66edf8, 0x33adec5f, 0xceffc848, 0xcf74600f, 0x00fd7ce1, 0x25e7d792, +- 0xcf37f92b, 0xfd411fbf, 0xa52f5595, 0xc0652cfb, 0x84ef5026, 0xb5f500b4, +- 0xc7cff5f3, 0x7e42fd21, 0x6c1de62d, 0x215fece3, 0x260f6e9d, 0xcec2f33b, +- 0x9ffba47f, 0xe06928f7, 0x9fb289b9, 0x59e9f7ca, 0x2e986edc, 0xcb2b34e0, +- 0x832dcfc2, 0xd026cf3d, 0x037d38fa, 0x002ec99c, 0x7177a27a, 0x239a794e, +- 0xeca7e825, 0xca3b108d, 0x379d0ef7, 0x87040fe5, 0x30bbf160, 0xf3c2ec8c, +- 0x2ec822db, 0xfa9a2d07, 0x932dbf39, 0x389543e2, 0xaba84993, 0x12663ed1, +- 0x2de4f37c, 0x706ef459, 0xe1c5305d, 0xbb7e3d94, 0x644ee286, 0xbd9777ae, +- 0xc8926f3a, 0xa69cf1db, 0x56bf57ec, 0x49fe45e0, 0x29d48e25, 0xe3c568f8, +- 0xb8c3f577, 0x9967f65b, 0x68aee3e2, 0x20639c79, 0x0964765c, 0x45efba3e, +- 0xe0275ba2, 0x502efe39, 0x2f0388b9, 0x2cfdc9df, 0x7aee6be5, 0x51e3f88e, +- 0xdf38c31d, 0x43a79e8b, 0xb4fee1fd, 0xded7c7e8, 0xa1cbf546, 0x41ff6f3e, +- 0x9b67cd28, 0x0392e28e, 0xdb96ebf7, 0xa5ff94ef, 0xd01e65f6, 0x0738fa03, +- 0x1edac2be, 0x40f91cfb, 0xa2e6c983, 0xd7b71e52, 0xe02cf3a9, 0xc44c19f7, +- 0xc4c33a1f, 0xf35689ef, 0x35f281f8, 0x71477f13, 0xd2a7c70a, 0xee85a61d, +- 0x36e9cfbe, 0x115cfe0b, 0x7487eb61, 0x41fb0158, 0xbf1f09f7, 0xb375ee8b, +- 0x7da8eb3f, 0x131e7ae0, 0xe1d1aeed, 0xdcff1e6e, 0x4bef9039, 0x24a9abe7, +- 0x38c23a77, 0xc97cc35e, 0xe30ced4e, 0x60480529, 0xe3858ddc, 0x0f18e743, +- 0xd29ddfd9, 0x743b4a1e, 0x52d95dbc, 0x5e177bf1, 0x44e2371e, 0x77c44d9c, +- 0xa1b43677, 0x38fc81be, 0x5ea50477, 0xeff5f843, 0x931e0386, 0xc593d77d, +- 0x7f129be5, 0x93d6ef43, 0x47a3d35f, 0x7a10ea7e, 0xfae1b39f, 0x7ba033df, +- 0xc5120def, 0xe959ff1d, 0x94ffc447, 0xcacf0e73, 0xe39d125d, 0xa47aaf97, +- 0x7cbef114, 0x4899a6d1, 0xca3aca0f, 0xed00acb5, 0xa6490eaf, 0x3f5d80f9, +- 0xf5c64a67, 0xfdf029e3, 0x513fd04c, 0x8067228e, 0x59654ed6, 0x6d953d15, +- 0xab9cfe84, 0x4e340da4, 0xf27762bc, 0xc27029f5, 0x638c1f73, 0x3701fc54, +- 0xcf32bf5a, 0x57a7cd1b, 0x788ea1f0, 0xe346efeb, 0x13247f7e, 0xfdf2b93f, +- 0x3fe17ec8, 0x2fd1b7a2, 0xe1fd2a59, 0x11d4127d, 0xc8839fa1, 0x046e30cf, +- 0x3cc0bb6f, 0x8087e853, 0xd5a6e37c, 0x1a43f3a9, 0x468cf9d4, 0x45ab3e75, +- 0xabbdb79d, 0xe3159fce, 0x3b42702a, 0x6c3def18, 0xd01ff717, 0x4bfbc60e, +- 0x1e630768, 0xd14c60ed, 0xb472c60e, 0x768f3183, 0x0ed1e630, 0x1db9eab6, +- 0xc1da298c, 0x8c359e58, 0xcb59c9c3, 0x0fb090fd, 0x9f8f3a76, 0x026efca1, +- 0x8fa885d8, 0xbd220e96, 0xa8be7d0e, 0xedfff437, 0x478805d5, 0xd44710a6, +- 0xc38c1cb0, 0x83135b6a, 0x93e203f5, 0x664c239c, 0xafb437f4, 0xd506bb3e, +- 0x63b30e90, 0xe257d610, 0xbe962a96, 0xd6efbf43, 0xe7fadcbe, 0x227df29f, +- 0xfbf287bf, 0xbef86543, 0x2e7e4cbb, 0x391dff23, 0xf7afb19b, 0x8ce303a3, +- 0x22f895fe, 0x368e8abb, 0x53fe5c12, 0x7c8313d7, 0x461dabfe, 0x2bf5677a, +- 0x4d931f71, 0xe77ea8b7, 0xde79daf1, 0xcb9d1293, 0x9c2c3ddc, 0x061ef7da, +- 0x790fbbfd, 0xd0f3a4aa, 0x9f77ef59, 0x4906de78, 0xa6dce383, 0x276470e7, +- 0x1c6f1164, 0x4ea77fca, 0xf51531cc, 0xa7f9bf73, 0xf85483bb, 0x787b7433, +- 0x0c35efc0, 0xd61fd554, 0x7bf01094, 0xbfd4430d, 0xf2c0f023, 0x4f676803, +- 0x555230dd, 0x6bd20aef, 0x28d5ca36, 0x85c597e2, 0x27c40577, 0x4f7eaa86, +- 0xa7ae896f, 0xbfa871e3, 0xc90c6f64, 0xb7986283, 0xf388a47d, 0x49c7a581, +- 0xb7c435ae, 0x3dfa256b, 0xde4279b2, 0xf96aa5b0, 0xe7e5a25b, 0x3646f87a, +- 0xbdce83ea, 0x84fef451, 0x16258f82, 0x811b0f66, 0x596dbcf1, 0xde1fb45e, +- 0xf117397f, 0x8dae42aa, 0x781bdfc3, 0xc36f7254, 0xc217a78b, 0x01de44f7, +- 0x38d63fdf, 0x2f0f112a, 0x3a39ce1e, 0xb17ce00a, 0x4b7ba641, 0xe46f3a71, +- 0xff0fb308, 0x209674e2, 0x8ddaffdc, 0xf41bfdfc, 0x3ee1c95b, 0x18dda8fc, +- 0xf6649411, 0x87c15bad, 0x41def4db, 0xaf5d704b, 0x02af4899, 0xd3e49a3d, +- 0xe932c395, 0x2463256f, 0x62b9e917, 0x4b7dca9d, 0x85a73d65, 0x78d2c83d, +- 0xef8a8fbf, 0x640fd317, 0xce1d6159, 0x1938a6ea, 0x61a6b8f9, 0x63a40c5b, +- 0xc3758e8c, 0xa8efe006, 0xef8a7f25, 0x227d9497, 0xf8ef8c33, 0xd09ee6ba, +- 0xdccf503b, 0x824db3ad, 0x5f1be3fc, 0x6595fba6, 0xed1eb75a, 0xb51d92d2, +- 0x5ee68f74, 0x82d26ef1, 0x9f6445ed, 0xc88b642f, 0xc4a73cce, 0x94780b9d, +- 0x58b6958c, 0x823dde60, 0x7788946f, 0xf1f7942b, 0xefe76cae, 0xb8503f3e, +- 0xf5e77e87, 0x902f5165, 0x9c3f7a5e, 0xfd00379a, 0xf6c91e4d, 0x1f4cf763, +- 0xc03fa0c4, 0xad57a987, 0x75703e94, 0x9fb9d908, 0xa184afe0, 0xb008c8bc, +- 0xf1e43f77, 0xbbf8bd19, 0xef78f148, 0x2a7fdbd2, 0x3adbc3ee, 0xc00a87da, +- 0x7823519f, 0x909dc33c, 0xdf568e16, 0x171aa9f7, 0xe9f7c2ac, 0xa08e8fcc, +- 0x7c1869bf, 0x607f97ee, 0xfeaaa252, 0x0d0c0f43, 0xbe1187a0, 0x742e74ef, +- 0xb44e2aa7, 0x4acb9962, 0xe4f1f4f7, 0xd21cbfce, 0x13678465, 0xd82bed54, +- 0x78bd5f14, 0x45ba3bfe, 0x7a6d7f84, 0x344a97b4, 0xba7d6e3c, 0xb79443a3, +- 0x442c3953, 0x25b79745, 0x72e53eda, 0x83e3c751, 0x3a7b1f85, 0x97d89dfe, +- 0x168d845c, 0xc9efe2e3, 0xa1c1ffa1, 0x54da3bd6, 0x3fc22271, 0xfdc69154, +- 0x36ae1543, 0x01df9e3d, 0x00b1b5fc, 0xfc8dca92, 0x6fa8085d, 0xf9e70d8c, +- 0x7fae2365, 0xc3fb0f2f, 0x0f2ac877, 0x2f4845cb, 0xf12bdf81, 0x0f9c027d, +- 0xe94273fa, 0xbfde719d, 0xcfc157e8, 0xc09438c0, 0xb5f1b27e, 0xdf7a1c9f, +- 0x9aa3de8f, 0x89efc85a, 0xf9933d3b, 0x3c00fbbd, 0x15fdf853, 0xfd12cf7c, +- 0x43be1fdb, 0x5dbbd678, 0x00b76367, 0xf73b4a8f, 0xdfe20677, 0xbe0f5802, +- 0x51a0b86f, 0x5e25b9b2, 0xfff2e10f, 0xf482dc01, 0x00800036, 0x00000000, +- 0x00088b1f, 0x00000000, 0x5bcdff00, 0x6595580d, 0xf3be7e9a, 0x700e01c7, +- 0x0427e540, 0x094a880f, 0x44101df6, 0x18293b53, 0x54da1595, 0x021f44a2, +- 0x9a2824fe, 0x2edb52ed, 0x4c7350c7, 0x4a976867, 0x57a3ab1b, 0xb5accd39, +- 0x8cce9a98, 0x7e927bbb, 0xa772b268, 0xa9aeae69, 0x66b663b5, 0x3b448dae, +- 0xb5b4d45d, 0xdfbefdcf, 0x23bef9c7, 0xb5cced4c, 0xd7175c3f, 0xfff79e73, +- 0xe7defe7d, 0xbbf79e7d, 0xc89132a3, 0x1befe24d, 0xffe56ffe, 0xd5a212ec, +- 0x441f9d07, 0xabe5a30a, 0xae0decfb, 0x60fd65cb, 0xcbf5c5da, 0xc32a63f1, +- 0x9c284a23, 0xd70770c7, 0x4d5dc69b, 0x27b53edb, 0x97f1ca03, 0x3463fc69, +- 0x284a83c3, 0x1e3c5ca4, 0xca8d9055, 0x0c61d689, 0xf1c0d11f, 0x3f685d3b, +- 0xaf214bb0, 0xa09d9a22, 0xd41eb974, 0x62bbdeb7, 0xc8614d3e, 0xf5e6cc63, +- 0x11741c2d, 0x1b8d1295, 0xe6e5c27f, 0x1487fd7e, 0xbbf70f75, 0xca21d065, +- 0x10e41d5b, 0x6a21acfb, 0xf9bdf867, 0x9dc1d117, 0xefeb269d, 0x60f37865, +- 0xbb17e8ba, 0xe87a21ce, 0x6e88b9f4, 0x7645c274, 0x798dfed3, 0xa22ff1f5, +- 0x71ff4c53, 0x1af6e9e3, 0x0a27510f, 0x7f0cb8b2, 0x8fb90257, 0x86688ca8, +- 0xccfa349a, 0xb2efc264, 0xf21e786f, 0xa3d3a0f0, 0x512162ed, 0x8f0c6890, +- 0xc7ad22eb, 0xd2593c03, 0xb8e92bd9, 0x48cbe9ce, 0x99dfe22d, 0x3bfa56c9, +- 0x3728297c, 0x61d869c6, 0xa3d31f23, 0x3d363eca, 0x8c68e3c2, 0xc8b43e83, +- 0x345f036b, 0x1bcdbc7d, 0x4c46e7c7, 0xce4db4fd, 0xb9f6e274, 0xd809461b, +- 0x574def10, 0x8361beb9, 0xf0c426bd, 0xa467ef83, 0x7d1cb057, 0x7a39c9b0, +- 0xc1f10f3e, 0xa97353dd, 0x80957818, 0x5b8c1fa7, 0xbc5cf214, 0x26d506af, +- 0x37fad1e8, 0xf9dae4ef, 0xe3b627e7, 0xfe788bc9, 0x92874d96, 0x559c782b, +- 0xf72ade9b, 0x6ddd13e6, 0xde54dad3, 0xf76539ff, 0xe5e82f5e, 0x86a53ddd, +- 0x52015dc7, 0xd8ee5f30, 0xdc419554, 0xdeebe5ae, 0x79e3bdc7, 0xe99c1bbd, +- 0x8f9f9636, 0x3b276d7f, 0x2759cfcb, 0xe24cbd05, 0x7e52f1b3, 0x18953ecf, +- 0x3f7964ea, 0x9e2050ab, 0x5fda57cb, 0x5b718298, 0x75888e3a, 0xbd1db2ac, +- 0xb5fff305, 0xc32de79b, 0x99bda1bc, 0x4e0d5798, 0x86dabcc4, 0xd15a2909, +- 0xb35afcc8, 0x75d044a3, 0x99f7076f, 0xa8817448, 0xba7b7c1a, 0x9ff02dc3, +- 0x59a13076, 0x6475f7d4, 0x0ed9fc0a, 0x1d3d809f, 0xbbbca285, 0xddf92bc8, +- 0xc75fefd9, 0x50e704f3, 0x7c079b61, 0x783a14f3, 0x092a77fd, 0xa8029c6a, +- 0xf7c17866, 0xff04b327, 0x5d88790c, 0xa27eaccf, 0x5e7c9326, 0x26a6e839, +- 0x455efc93, 0xae7c16a9, 0xbed2cb3b, 0xa9679bca, 0x52f33abf, 0x3e35fd4b, +- 0xaebf05bf, 0xfda5ba70, 0x1655eaf5, 0x6b8ac6fc, 0x0417ed2c, 0x9bf05816, +- 0xed2d6baa, 0xb069ae6f, 0x68badfd4, 0x56bea5a5, 0x97c16b5b, 0xd2dbb8ac, +- 0x0db6b6fe, 0x7900fa96, 0x7272c41d, 0x63e3f994, 0xf313ffba, 0xd7cef005, +- 0x7ccc7827, 0xd6d7399d, 0xdc8c33d6, 0x32dc861e, 0x07f5de7f, 0xe47c839e, +- 0x321ca4d8, 0x53cb100c, 0xf513eaaf, 0x305614d9, 0x2cbd9b0f, 0xbb6c4dc8, +- 0x8999fad8, 0x31f33ec7, 0x7ffd730f, 0xf6c1c8b1, 0x63b4e660, 0xbf19e3a5, +- 0x916fbfc9, 0xccc8ed83, 0x067d8e2b, 0x19ff0dfc, 0x5dc4df89, 0xf6fef067, +- 0xf20a2c37, 0x995e673a, 0x3d654dbf, 0xea9d37a4, 0x7cb23453, 0x0e4ddf62, +- 0x30c06fb9, 0x31e023cb, 0x17c04796, 0x0a9b1e59, 0x79665e88, 0x50ebec04, +- 0x3b2ff945, 0xde3c042a, 0x8df01011, 0x4f016a8e, 0xf808d474, 0x02458eab, +- 0x1343bafe, 0xb1d37efd, 0x3a77c042, 0x6ff944da, 0x7c05da3b, 0xca2823af, +- 0xa11557df, 0x8202bcff, 0x0339c2dd, 0xf6ed5df9, 0x2e7ced84, 0xf9e711d0, +- 0xfacabb21, 0xeed804ad, 0xdf14dd33, 0xd863aa68, 0x449146d9, 0x91c465e8, +- 0x8bf9867a, 0x37edc39f, 0x741d476a, 0x1b8f18c6, 0x381f13df, 0x3442bb07, +- 0x31267bd6, 0x1fc07e5a, 0x03e504f8, 0x2539f505, 0x3ebd9fcc, 0xf9f053ed, +- 0x4dc692e6, 0xae376c29, 0x09cdaafc, 0x46db7939, 0x8f93862b, 0xb23e5d5e, +- 0x638c141d, 0x29b8177e, 0xf0269298, 0x0e618b80, 0x88eec397, 0x0177de3f, +- 0x81e43e60, 0xb963e508, 0xb670cdde, 0xf10a793b, 0xe5c394f9, 0x142f2176, +- 0xc27ac870, 0xb41e5c78, 0xa9e745a5, 0xdf61241a, 0x84716d66, 0x1c921f60, +- 0xc895b614, 0x7225c9f6, 0xdcb3e05e, 0xe5857e3d, 0x478b5664, 0x327ef20d, +- 0x2255deb8, 0x0cec07da, 0xf73dfc9f, 0x514c229b, 0xd444a130, 0xbd72f58b, +- 0xa0d54758, 0xcff40146, 0xef4e3524, 0x41f596ef, 0x6bc59ff4, 0x30c15f80, +- 0x9c79f184, 0x7689d600, 0x185db289, 0xce7c14e3, 0xf49b24f3, 0x9642fec5, +- 0xdf65fb83, 0x9f6152e9, 0xe44ed273, 0x3f31eec1, 0xfeb9f9c6, 0xdbd9d4a6, +- 0x9a9fcc23, 0x26bfef38, 0xf34a5f32, 0xff9402b4, 0xc13f194a, 0x4c17e60f, +- 0xc4935319, 0xe7c6c4f6, 0x39f630e4, 0x3f062f96, 0xf41bba0c, 0x48dbe58d, +- 0x4f891afc, 0x1aa9fcb1, 0xf41bd28c, 0x512f991a, 0xff9505fe, 0x754cbe7b, +- 0x7ac6ecf4, 0x2adc5ae2, 0x7c6df3d6, 0xe69fbdba, 0x869370a5, 0x80cbdf41, +- 0x5eb4f267, 0x5d2351e8, 0x9a0bcf35, 0xe0c5ed79, 0x0bbb6c4f, 0x03e3b423, +- 0x779c56f7, 0x6d273e7d, 0x8b5ff9e5, 0xa0a73a67, 0x33f1e03c, 0xf6eae61f, +- 0x84da8fa2, 0x2937673d, 0xea54fe08, 0xb45b9aac, 0x9597f85c, 0x36bfab1e, +- 0x8d9aabef, 0xe8de7798, 0xcd95ff18, 0x6bd1ce32, 0xa6af71f5, 0xf56e312e, +- 0x6bbb6b58, 0xdaf0bf75, 0x5df96b02, 0xcbafdd7e, 0x91d83ca3, 0xbae5524a, +- 0xcbf09b68, 0xdc72bd2a, 0xe3af9d6c, 0x099a767d, 0x80e691be, 0x77f17af1, +- 0x7bd600ae, 0x7e050535, 0xbc04850d, 0x9c62c28e, 0x01d0d9eb, 0x09c891bf, +- 0x9fddc5bc, 0x5e9162eb, 0x87ded76d, 0x8e49f3df, 0xeb852936, 0xfbb5e333, +- 0x89bd17a1, 0xe1add437, 0xce96e6f9, 0x63bf402d, 0x2fe13e95, 0x178f731c, +- 0xdfe40bfe, 0x8fd51699, 0x17fed957, 0xf97adaf0, 0x897c007c, 0x160287cf, +- 0x7cf857f6, 0xe16d7e00, 0x79bf4206, 0xa61c853e, 0xaffd1b7d, 0x4721cef3, +- 0xf7f6c8e9, 0x1b3f29ba, 0xbc9cb1ab, 0x92a93a96, 0x55a70192, 0xa5afbf62, +- 0x8c24d866, 0x7c580973, 0xff3860b8, 0xe8bf90ca, 0x31c8f37c, 0x1b3a646a, +- 0xa7a58d74, 0x813fe741, 0x470dcfae, 0xc4955ed7, 0x3ee03639, 0x313d9ab0, +- 0xf6944d6a, 0x89387020, 0xd77e5932, 0xa087b21d, 0x89631f8f, 0xd25f1859, +- 0xbfa50a89, 0xef5f5ebe, 0x16341d47, 0x53a7a6f4, 0xba5df944, 0xcfb736cc, +- 0xd65cfb10, 0x7dfa215e, 0x88bda719, 0x092f9c75, 0x820f644f, 0x99d5da3e, +- 0xf9e7833c, 0x0abb59e4, 0xeec5bbff, 0xd742a6db, 0x4fabb35f, 0x55f4b8f1, +- 0xe842ee6f, 0x86a393d3, 0xb8b467bd, 0x7b8d1d25, 0x357957c6, 0xc8ef38bd, +- 0xf5299a5b, 0x85e81490, 0x8d8f3e71, 0xf2c2bb63, 0xe125cbbb, 0x7975e748, +- 0x12a7db02, 0x49d85ed1, 0x4fdc7f83, 0x4e3cd9e0, 0x0fc8ec39, 0x7e3f8413, +- 0x9ef0252e, 0x9256f31f, 0xbf659fc5, 0x81add857, 0xb38e92d1, 0x3323e269, +- 0x73ecaf19, 0x07eb8852, 0x1b5da52a, 0xdd85b8f0, 0xd1b57aac, 0xa9dcfb01, +- 0x4cb88bdb, 0xf498f7be, 0x4097de3f, 0x26fc933e, 0xf059a616, 0x4b12f524, +- 0x7c8a94fb, 0xe06a7d4b, 0xa8fd4b32, 0x3e0b12ea, 0xa58666a6, 0x39a2c67d, +- 0xbb4b3c16, 0x7b3ed2d6, 0x6e0b42c5, 0x596ca1d8, 0x8b6d3944, 0xb5c7fd2d, +- 0xcfb4b52f, 0xa961de0b, 0x44e060a7, 0xd6aff721, 0xb2df8ffb, 0xe4cf5ace, +- 0x2f4395b5, 0x928fdfe4, 0xe614fbab, 0xd967b55f, 0x84e5e87c, 0xebac7bae, +- 0xc7657fb1, 0xa29d9039, 0xffa628d0, 0xddab3ed5, 0xe2b4caab, 0x8bff5e95, +- 0xaf5cdd60, 0x9fb2eed5, 0xb29e40a7, 0xf2961cdb, 0xddba25b1, 0xc453429c, +- 0xf8dbf87d, 0xe1665daf, 0x2ebd2c7f, 0xfe038796, 0xb49bb730, 0x97072ac3, +- 0x3072ac86, 0x1cab69f9, 0xe558f714, 0x5623f2e0, 0xad87f039, 0x67da5072, +- 0x13b28395, 0xf6983956, 0x0c0e558e, 0xd7e58cf9, 0x3e5588f4, 0xe5345348, +- 0x8aebf08f, 0x89f956b3, 0xbf510fe5, 0x8f3cdfe0, 0xfde68f42, 0x185afcf9, +- 0xfe21afc3, 0x77e1bd30, 0x4e4f0ece, 0x67d55e01, 0xf7cf10a7, 0xabcfbe98, +- 0xf279b727, 0x74ee9ed9, 0xd0257568, 0x3aae5d73, 0x0d5ca4b3, 0x87881df4, +- 0x198fafdd, 0x5a59c7ff, 0x1a2fda03, 0x0bae59f5, 0x4dafd1f2, 0x39e97dc2, +- 0x1ddd8495, 0xe7c72097, 0x4758b27b, 0xa87b1ef0, 0xd271d793, 0x3ec0a5d6, +- 0x2b6b2737, 0xa2f6ffd1, 0x07708536, 0xfe82a0a3, 0x971cfff5, 0x1c7ebc0b, +- 0x151e7b89, 0x2416ca45, 0x7d62ed45, 0x7af39736, 0xf7e896d6, 0xb9eb9514, +- 0x1912fadf, 0xbd5248b7, 0x290f112e, 0x20e200a2, 0xadc8bd7c, 0x8e3d062f, +- 0x3d024fc7, 0x9b2a6dba, 0x7d388a38, 0xf067d829, 0xa53d3b55, 0xfe113f48, +- 0x7fee8e5e, 0x4eff5365, 0x0ed273ac, 0x97ab9cb2, 0x30e4dc86, 0xd3f27dd1, +- 0xdc5e0b5e, 0x7f696993, 0xa59f11f9, 0xb42e1fde, 0xa9f697d4, 0x44ecbc16, +- 0xb4fda585, 0x7c160277, 0xd2daa47a, 0x35b38afe, 0x229c7c16, 0x5f7fafef, +- 0xe3e92f92, 0x7de44563, 0xba9fdfd6, 0xf788ab7b, 0xe1ad7bc9, 0x23d7534f, +- 0x4ce23701, 0xdec71cba, 0x404c5c87, 0xfec5cff0, 0xb183ce2f, 0x6b47e96e, +- 0x294fbaf7, 0xdd3f51c9, 0xff0db3f0, 0x01558295, 0xfdc3b9f3, 0xfba2f9e4, +- 0x6d7f86f3, 0x8bd3cdf8, 0x721ce27d, 0x26cabc6e, 0xc911c1e4, 0xc7d79c82, +- 0xfdf7b0d1, 0xbde44be7, 0xc6fd7621, 0x9fe762ba, 0xed95ec5e, 0x729f71f5, +- 0xc335edd3, 0x5cba33f9, 0x735f1c2d, 0xb8f9f214, 0x79677d53, 0x9e7f7fde, +- 0xb3cfa4ce, 0x2e5cde84, 0xb3675fd7, 0x31a3f889, 0x52a991cf, 0x7f380d5e, +- 0x7e3bfb0e, 0xe37deea2, 0x1fd87876, 0x21ddbc79, 0x9fc708e2, 0x2c1b515b, +- 0x01443f80, 0xef8e338c, 0x7c0fe003, 0xae1fdc0a, 0xfd176a99, 0xbd4897cf, +- 0x1265da8b, 0x24807976, 0x5dda07ff, 0x0c317ee2, 0x181c85bf, 0xcc7c41fb, +- 0x62e32051, 0x398b8880, 0x062e321c, 0x4031711c, 0xfe50c5c4, 0xf02a875c, +- 0x02151d83, 0x2023be7f, 0xd51d23f0, 0xa3bcfe02, 0x721b9446, 0xe32f4b13, +- 0x1ff0663e, 0xa373886a, 0xe71e4620, 0xe5f927df, 0xd9aceb5b, 0x6f9c5bc3, +- 0x24a56aa3, 0xa6dbcf4a, 0x2dc8794a, 0x3b407495, 0xed48ffe8, 0x2945ecaa, +- 0x900ea788, 0x47fbc52f, 0x53ff86e2, 0x6ee830f4, 0xfaa357dc, 0x2461f526, +- 0xbfee34bd, 0xd0acfba6, 0x8c7d58bb, 0xba58dbd5, 0xbdeb3f8b, 0x8d7bde59, +- 0xa7ae85f8, 0xbd0c5f06, 0x16a45276, 0x605425f6, 0xef7d06ab, 0xd1eab24f, +- 0xbe92a5f5, 0x8623d003, 0x74de7ca7, 0x7687ce1b, 0x5607f0af, 0x90ccb6e8, +- 0xec87e6d3, 0xf3e27ce2, 0xed37e3d6, 0x7db779b7, 0x6eef9ea8, 0xe215bfbc, +- 0x201d9d5c, 0xda5f1f71, 0x737684a5, 0xf5a086bf, 0x2521147c, 0xfae46fae, +- 0xe35fb817, 0x33f3d896, 0xf221d620, 0xe6b5bc2c, 0x72fd6b2e, 0x33c91efd, +- 0x632760ba, 0x96570af3, 0x4aa0e7ea, 0x5f7237ea, 0xdd105ee2, 0xa1572e97, +- 0x873829f1, 0xcbb4af70, 0xce3846b8, 0x21f3af74, 0x8a2a3fce, 0x0a133d33, +- 0x746e4e71, 0x177c13a8, 0xcf41a1cb, 0x9e833ca1, 0xeae7184f, 0xe23f753f, +- 0x8bc7cf8b, 0x7fcf057b, 0xbe76e823, 0xff40aecf, 0x7a08f287, 0x3b41f3fb, +- 0xe73e99d9, 0xba09c60f, 0x7e3b627e, 0x94cfbe4b, 0x5f28b877, 0xb015c941, +- 0xa8c6fb1f, 0x65d661c1, 0xfb222d40, 0xe1bf588f, 0x99ee3250, 0xfcc8cf2d, +- 0xbd33cb44, 0x7b2605e9, 0x10ea5cd8, 0xa6dbbbfb, 0xff2294b5, 0x8b9ddf60, +- 0x5f1dde7b, 0xce00a686, 0xb12de3d7, 0x77b219fb, 0x47211533, 0x613fbc03, +- 0xb115aaef, 0x0497b63f, 0x989b7b3d, 0x02ce3c9b, 0x34068f0a, 0x96da00f2, +- 0x2307c10a, 0xae10d00f, 0xb9b8fb10, 0x8133b973, 0xde76449b, 0x8be0955b, +- 0x392207e6, 0xc7fe08b4, 0x9b827948, 0xde315506, 0x886706f7, 0xcd281e71, +- 0xc6d0fe93, 0x1fe16bed, 0x3934f65e, 0x53888741, 0xa74b138e, 0xf3ca943f, +- 0x1d3c1320, 0xbadfdd13, 0xe7b08a0d, 0xc02ba0eb, 0x9ec22bb7, 0x5d67f81b, +- 0xf1255e3a, 0x3c49373b, 0x516cf4e2, 0x117ee452, 0x013ec02f, 0x6bdc1fb1, +- 0x05f1e9f7, 0xfb1003ec, 0x18ec3940, 0xe031d870, 0x61c063b0, 0xc76100c7, +- 0x6a94be50, 0x43e71172, 0xacd2a33e, 0xaa6e8327, 0xc825f934, 0xe4719867, +- 0x91edcc33, 0x23d730cf, 0x47ae619f, 0x238cc33e, 0x8f6e619f, 0x4719867c, +- 0x1edcc33e, 0x8e330cf9, 0x3db9867c, 0x7ae619f2, 0xf5cc33e4, 0x719867c8, +- 0xedcc33e4, 0xd730cf91, 0x58aededf, 0xb3b71df2, 0x35dc86f9, 0xf21348ee, +- 0xa6af3631, 0x7efe720f, 0x3977d7e2, 0xa3e7c1f3, 0xebb7212b, 0xc954135a, +- 0xc96aaee7, 0x3e491b77, 0x3e0ad7f7, 0x7892ebdf, 0x1de19a95, 0x1e422fc6, +- 0xe640b2a1, 0x47910011, 0x011e4400, 0x4a847910, 0x0023cc87, 0x72808f22, +- 0x910011e4, 0x1e440047, 0x04791001, 0x0011e440, 0x3f404791, 0x910011e4, +- 0xf2394047, 0x23c88008, 0xaf24fca0, 0x6304f903, 0x0ba3f05d, 0x963cf72c, +- 0xcf3dcb43, 0x47e1c16b, 0x8fc3db9b, 0x8fc3d736, 0x8fc3d736, 0xa3f0e336, +- 0x47e1edcd, 0xa957719b, 0xfc17e84f, 0xf83f7369, 0xb8bc66d3, 0x6212f82b, +- 0xfaefd744, 0x91808bdd, 0xc571e524, 0x41ec67cb, 0x4f7c8c5a, 0x4dc95e24, +- 0x545cf955, 0x192b8b5c, 0x844b06d7, 0x7ea14fde, 0xf22df81b, 0x2d37ccb7, +- 0xcde4214c, 0x14c8bf8b, 0x513e46f5, 0xfddf31fc, 0xe7f84907, 0x5d7245dd, +- 0xbc957f46, 0x7da34076, 0x5dbe1f14, 0x3b46fcec, 0xeb4d2f61, 0x1f9b0be0, +- 0xbdff7cf9, 0x2cad929e, 0x8a6d7b4f, 0xb2f74ff0, 0x1870b59f, 0xf74b34bb, +- 0xf6daf69b, 0x7ee04b1f, 0xba8a0dfd, 0xe89e8787, 0x09673ea0, 0x0256d4e8, +- 0xd4c2623f, 0xd47f3d54, 0x71616336, 0x3c46dd74, 0x0044ed8f, 0xfd99e779, +- 0x79e26ae4, 0xb907fd66, 0xb9cfe19a, 0x7e811fa4, 0x0e4dcfb8, 0x263d812a, +- 0xaa7cbef9, 0xe0b4ff3c, 0x5c4d19da, 0xdb5f793e, 0x77f8668c, 0x8fdfb209, +- 0x7416489f, 0xb2a361bc, 0x99fbcec7, 0xbb028fb9, 0xbe855db9, 0xbcfbc9ee, +- 0xaf3126ae, 0xce6cd5d7, 0x75caefbf, 0xa45f70f9, 0x88a66548, 0x3c842bc5, +- 0xde37419d, 0x1fd88bdf, 0xc43ef89b, 0x1d3d5765, 0x24d0fdef, 0xa93dad1f, +- 0x91cd7c16, 0x2687ef2c, 0x1f855b39, 0xeec4172c, 0x16adce21, 0xf5abe59d, +- 0x9a95b7f2, 0x9e784bcf, 0x0bbf7756, 0x35359bf4, 0x6c346ab5, 0x275251ff, +- 0x36a6ee40, 0xebc31a6c, 0xd50142d2, 0xdabd03ee, 0x93f8125e, 0xe2170235, +- 0x27d62e53, 0x4149c3ce, 0xa4c89c25, 0xdbb821b8, 0xebf19a36, 0xe99c1b83, +- 0x548fbf68, 0xf89303b8, 0x7449767f, 0xc274455f, 0x5e40af16, 0x499477a8, +- 0x7c72d8fe, 0x57e2f20f, 0x58f9049d, 0x613af0e0, 0x8dfd626f, 0xec0f77d8, +- 0xec2adc7f, 0x21d39f54, 0x3fdd3afc, 0xb5caf06a, 0x29d1b67e, 0x43868ffc, +- 0x3ea07fec, 0xde30dfc6, 0xa1dfb043, 0x1f8e7186, 0x720d4ebc, 0xb7dacb55, +- 0x7383bbc5, 0xa9bda179, 0xf2e7d72c, 0x0152dff7, 0x0aed90bf, 0x0dfb29ec, +- 0xb9654e77, 0x52f4d86b, 0x915dee32, 0x6fe101e0, 0xa1f1b67c, 0x905f1964, +- 0x9d2689f9, 0xa6fc464e, 0x9347e759, 0x03e5eefe, 0xa96c5bb6, 0xf186ee71, +- 0x2bd7815e, 0x3f588afc, 0x9bfbc891, 0x82bf5c99, 0xb195b3f7, 0x361adbe5, +- 0xfec5d267, 0xae6fe1a2, 0xb95de7d2, 0xb7de29d1, 0x3890a0ac, 0xac86560f, +- 0xfee957ed, 0xada7aae7, 0xca983fe5, 0xa1f2277e, 0xdfa9df86, 0xdbd4ee93, +- 0x7bdebc34, 0xda7bf0b3, 0x5075c89c, 0x07e906dd, 0x4d0a7ed1, 0xb5cf8050, +- 0x775e33c5, 0xc32aa028, 0xba9bcdc8, 0x931f343f, 0x0c173d32, 0xb23b0826, +- 0x8112f070, 0x299832df, 0x8583ade0, 0x19b11cb2, 0x4aa473e6, 0xe3c7dd09, +- 0x41fba5bf, 0x265e0f37, 0x198207ea, 0x58078e42, 0x14c5318e, 0x165d3edd, +- 0xd6117a50, 0x36d4ef9e, 0xf9fae18d, 0x95f849bb, 0xe25fc3d7, 0x9ff0458a, +- 0x7907a14a, 0x6f9f1855, 0x0f21346f, 0x9756b07a, 0x1203d67b, 0xec202376, +- 0x1082e559, 0xd22c93de, 0x6fc0dbf6, 0xe0b5fe43, 0xebf00729, 0x57cb8a83, +- 0xe215ee24, 0x77c86cfe, 0x27d41eac, 0x8f26f1ea, 0xc50d278c, 0x5e58b09b, +- 0xc5b5051a, 0x47afae01, 0x9d12f06c, 0xa4aa4cb1, 0x77df5922, 0x91bc5b50, +- 0x353fbdcf, 0xb367511e, 0xb3f57e09, 0x8a07b79f, 0x32aa274a, 0x94db27a0, +- 0xe8bead92, 0x9f289e7a, 0xba665033, 0xf5d52f27, 0x032ef58a, 0xdf758ef7, +- 0xc341909f, 0x6c0605f8, 0xbf433a64, 0x772253ea, 0xfeea4c29, 0x64a814a9, +- 0xbe92d6d6, 0x79fe244f, 0x3c758b9d, 0xdff6d0f7, 0xfa08f16e, 0xd4fcfc08, +- 0x45838b35, 0xac1d867f, 0x77d01c53, 0xadbe0ec3, 0xb7a0e768, 0x3cc8eead, +- 0xa8b135f0, 0xc5be05df, 0x6db6e7d2, 0x3127db3d, 0x24cb721d, 0x5d5ceaff, +- 0x80b8f14e, 0xd3dc4e42, 0xb9e48b1a, 0xee5f0e42, 0xf11f9112, 0xb19fb889, +- 0x6fe00fef, 0xf497430f, 0xc36fe932, 0xa4b9f63f, 0xff080c7f, 0xe04fef18, +- 0x7f87031f, 0x18ff080c, 0x818ff0e5, 0x0e063fc3, 0xfc3818ff, 0xc7f84063, +- 0x16d87f28, 0xf33f7538, 0x685b51f3, 0xd39661ff, 0xee6b47c7, 0x51ef9e32, +- 0x238f92ea, 0x63fb1348, 0x627611b9, 0x7cb13ec8, 0x72a3cbb9, 0xf4fdb4b4, +- 0x547e5b21, 0x7cb69a9e, 0xdc29f3ba, 0x841fd983, 0x945b6b3e, 0x9194dc70, +- 0x3b89ece5, 0x3cbe8412, 0xd84b8f71, 0x89d73add, 0x5179dc97, 0xfedbbe7a, +- 0x27694eb7, 0x3c7c13c3, 0x78b6e2ee, 0x89ff7615, 0xac1c9af2, 0x1548b137, +- 0xd9c0197c, 0xb256f88e, 0xa5f28796, 0x4ce5e274, 0x57ff576e, 0x7ea2e7af, +- 0x173cd1cd, 0x11c36fec, 0x1f4ce6ff, 0x21136bfa, 0xaf1e0daf, 0xeac5fe0b, +- 0xbce2a98d, 0x7190cfad, 0x9140965c, 0x31f83307, 0xdfc64cbb, 0x80ef79fa, +- 0x127bf417, 0xc0b9c813, 0x2df24ed2, 0xb88cdf56, 0x2b5c6c62, 0x72795f1a, +- 0x22e23e4b, 0xf4ed49a3, 0xc42f4c5d, 0xd1255c3d, 0xfc6c4ab8, 0x5d5f4863, +- 0x19e78964, 0x7e994d70, 0xa9efd74f, 0xd4f743cd, 0xf01979a2, 0xbc541fe7, +- 0x79373f88, 0x674eb77c, 0x89cfa9bc, 0x3f348817, 0x62cae7cd, 0x8afbffbc, +- 0xbdf80f77, 0x56ec2fde, 0xebc2781d, 0x2151da69, 0xc429b6f4, 0xfac8d470, +- 0xdec1e4bd, 0x5f619f9c, 0xeb0b80e1, 0x5c06f26c, 0xa77f2669, 0x98094bb1, +- 0xf819fddf, 0x8e3265ed, 0x07d7c758, 0xf5b6efd0, 0x88a5ae79, 0x83dbb25b, +- 0x746b6ef7, 0x71fa3139, 0x625ef13b, 0x0cbd3e7e, 0x7de7eab9, 0xbe616ec1, +- 0x4bf8d312, 0x7e69be31, 0xb5fc2f6e, 0x62496595, 0xef2f06bc, 0x2bd00f3b, +- 0x1074c9d6, 0xcedfea74, 0x3cc4f9e3, 0xe18dee82, 0x7ac55390, 0xf1834ef0, +- 0x1390dec5, 0xe8dd2cf3, 0x6d7ef117, 0xdb479c9b, 0x862aea92, 0xbaf0e73f, +- 0x1e7ecc72, 0xb2e41dcb, 0xd1fa970e, 0x0fc2bd62, 0xa53a626e, 0x634cffc1, +- 0x3173d7bf, 0xf5f41abd, 0x5aa57537, 0x07aec6fd, 0xad4fe09d, 0xf2c4ae7e, +- 0x8e5d31e1, 0xcabc6e97, 0x08efe845, 0x533ef0b8, 0x6ffde9d3, 0x22b7e36b, +- 0xfddb523f, 0xf18f3388, 0x4fd265ed, 0x46740c7d, 0x3c3f383c, 0xfa53ef01, +- 0xf78bc6d7, 0x2edeb5b6, 0x7a21dfb1, 0x81f4c43f, 0x11ade25f, 0x093966f4, +- 0x535afde2, 0xd1bf95b7, 0x718924f5, 0x841bba9b, 0x68732dfe, 0x1d79af2e, +- 0xa0985e3b, 0x596a5d30, 0x3f9c15ef, 0xf2172d5e, 0x5ba1e673, 0x793ec573, +- 0x9273a09d, 0xd8879bea, 0x908dcb04, 0xea7e436b, 0x1b3ea54b, 0x932c1df3, +- 0x65839cf1, 0xbfe9c7c3, 0xb69b4f4d, 0x71005035, 0x15524cbc, 0xd4f5dbe5, +- 0x5f434fd0, 0x6538f56b, 0xa405b6e3, 0x9f0dec99, 0x0dcf6ddf, 0xdd019f43, +- 0xf9d62c9e, 0x917cf4c9, 0xf7baf14c, 0xe5d67e74, 0xe31ef55b, 0x7557dc61, +- 0x139bafbd, 0x28b6b09e, 0xb798deda, 0x83f64d2e, 0x5ece43fc, 0xf682e9d5, +- 0xdd7b44eb, 0xa376e99e, 0xec6ec871, 0xbb0e94db, 0x79115fb1, 0xa5db75ab, +- 0x99eeb75f, 0xfadf1124, 0xdf8775f7, 0x9ddb85b8, 0x3d77787b, 0xabac6bf6, +- 0x44ed2c29, 0xb053fb33, 0x73f4cb1b, 0x7b58b3bf, 0xc7a4cca7, 0xccf77f4d, +- 0xe2c5e844, 0xdf99ff1e, 0x1877d892, 0x67bde6f6, 0x0cf6f17e, 0x357cf45f, +- 0xcb74b1f6, 0x3c1b38bf, 0x7dc9ba66, 0x2a5c2d6e, 0x5f8139de, 0x6e357fb8, +- 0x81de4454, 0xffc25dda, 0x2b1df834, 0xbfac0d07, 0x1ca89e8d, 0xc91ffc18, +- 0xe50d726f, 0x0dff24e7, 0x60721b7e, 0x13e0dbf0, 0xf9359ce1, 0xffbac6fd, +- 0xb17bafa0, 0xeb5fbf2e, 0x4578b77a, 0xd0996b9e, 0x23573cf7, 0xafaf5ee4, +- 0x0f96b26d, 0x643bc9f1, 0x2f4337df, 0x9f247a06, 0x6539b606, 0x45df721c, +- 0xb9c5ca7c, 0xb963ac6f, 0xd66c6f1e, 0x74cb86e3, 0x94f9983f, 0x6a665e54, +- 0x53e484f7, 0xffafb3e3, 0x627dcfeb, 0x6d8ed27f, 0xe2fe138f, 0x82fd9ed2, +- 0x1e5bb55f, 0xbb71e674, 0x7719729c, 0x6df3b21c, 0xe7e22f7e, 0x76ecb78b, +- 0xca73ff42, 0xe562dd25, 0x077f4ebd, 0xe715d06b, 0xf73a628f, 0x7bb0f68c, +- 0xf59e79fb, 0xf193e36b, 0x6798c6ae, 0xe394b95e, 0x34d4b6c6, 0xd6d8d7cc, +- 0xabdc03f0, 0xab1fbb0c, 0xa5e3a777, 0xf1e52c3e, 0xafa797a0, 0x15d77352, +- 0x332f9c5d, 0xc972ace0, 0x79311fb7, 0x3b258ef1, 0xe227e7b1, 0x049ac41d, +- 0x82e5f915, 0xf3084882, 0x6eb18e42, 0xbc45db17, 0x89682987, 0x14758a7c, +- 0x02ff7c90, 0xf3269498, 0xef8ce91f, 0x305765e1, 0xd84bb7cc, 0x2107d3a8, +- 0xe8d3d434, 0x1ff61948, 0xf246b76b, 0x34f90c2b, 0x53b589c6, 0xc96fed23, +- 0xe9dfdc77, 0x525e3d3c, 0x79bae6a8, 0x4e1ffade, 0xfa3f1152, 0x12ba7db6, +- 0x6869be64, 0x15ac2cbf, 0xb7ecc369, 0x4683de40, 0x55776fde, 0xbdfb30fa, +- 0xebac0f28, 0x7bd6f189, 0x25d23f28, 0x15a723f3, 0xdfb8b73e, 0xe2f1b5e9, +- 0x2fb199bd, 0x5dff3e23, 0x9477e7df, 0x8b71e9a7, 0xc9fc1248, 0xff5d04ba, +- 0xf94712c3, 0x71b95302, 0x46f49fde, 0xf64cd292, 0xfd36c3f9, 0x76c8a43c, +- 0x1f6f8311, 0x9c73884f, 0x649d3aec, 0xca7c822b, 0xd6fd19f5, 0xed93d53b, +- 0xe29b73b0, 0xf66efbc4, 0x8e23369b, 0x154c1cd4, 0xdadb99f1, 0xe0eccf4b, +- 0x98db6e71, 0x5ebf0aad, 0xe997f3f7, 0x7d712ff6, 0x6869e6c3, 0x0bcf23bf, +- 0x53d9be3f, 0x2dfc42e3, 0x2b817bb1, 0xf2bdf85f, 0xabe4601e, 0x03542bd6, +- 0xfb0e5bfd, 0xbdb2bd08, 0x66f38050, 0xffe90ef9, 0x16d1b7cf, 0x75c73be4, +- 0x82cbccd6, 0xa8a9d87d, 0x176927f0, 0x7ee351db, 0x6923b6c6, 0x72cecd4a, +- 0x962bebd0, 0x32ff1e3b, 0xec76b19c, 0x7b8027a7, 0x817fb127, 0xa03d60fd, +- 0xb4b9564b, 0x4fbb278f, 0xa28af925, 0xbf53fcf4, 0xc2e4317f, 0x23359bc8, +- 0xf20a33ee, 0xf90e9751, 0x63f3d268, 0x0ae7bb9b, 0x4df779bc, 0x4e973be2, +- 0x647be634, 0x0f5583d3, 0x733e5907, 0xb5347a75, 0x7e01bdce, 0x713d8ad1, +- 0xe35ee2a9, 0xfd9ae60c, 0xf7dda6d0, 0xce5eef8b, 0xdf178eee, 0x177a54bd, +- 0x3ef2a654, 0xf54aed97, 0xc2e74ddb, 0xddfeba2b, 0xf2d73ad1, 0x8f334afd, +- 0x7ff1e5e9, 0xde2893df, 0xa5df192f, 0x8ed6e55c, 0xfbe34ec1, 0xf93ee994, +- 0x68964a5d, 0x3e361bef, 0x1d33c06f, 0xd3073bf2, 0xd4373677, 0xd696ff72, +- 0x6718c903, 0x956f43d5, 0xd7108533, 0x1a7c037a, 0x8766cefa, 0xf9a6cefc, +- 0x77bfe1a1, 0x3e435c81, 0x4b211c57, 0x50b6f17e, 0xb543f08a, 0xef90b930, +- 0xfc24bcd6, 0x6a76b3dc, 0xf86eb9c7, 0x44794625, 0x94d9c3a7, 0x7ff05cae, +- 0x7247dee5, 0x9c7c6e71, 0xbdbaf124, 0x7612feb7, 0x4e327b48, 0x120edffa, +- 0x50636dfe, 0xf7c6cbfa, 0x1baa4453, 0xe573f0f7, 0x95bc6289, 0xc63877fa, +- 0x10bfd8ba, 0xa83b1fe5, 0xf7c0eb1a, 0x77e79035, 0xf066e11d, 0x47f65df3, +- 0x4578ef91, 0xbb77bf97, 0x7bc4f3ec, 0xf8045622, 0x1d76ef15, 0xd11e4248, +- 0xecaac3f0, 0xf0ec05ef, 0x7e290e97, 0x4589c39c, 0x863dc427, 0x6ac978f4, +- 0x75b794af, 0xcbce733f, 0x2afc2d1e, 0x08e2d251, 0xd7e386bb, 0x34dfba1d, +- 0x2fdc1f84, 0xfb2d65ee, 0xd2d05fa4, 0x05f84a73, 0x7c619f86, 0xdf6ab747, +- 0x1827e129, 0x941f56fd, 0x283d6974, 0x6d0a1bcb, 0xa025bc46, 0xacbee014, +- 0xd9727c08, 0x38364bfd, 0x25e6f8cc, 0xbd000a1b, 0x5fa43c7a, 0x0b5be5f8, +- 0x33ee257f, 0x71f51bad, 0xe69a7719, 0x4636994b, 0xe5c5c77e, 0xefe83de3, +- 0x5adfdcb3, 0x50fbca0f, 0x8b6135b8, 0xdabb1778, 0x6cec00e3, 0x7cf388f5, +- 0x10ad9b57, 0x4a03c9ef, 0x8ee7f082, 0xc6b9efea, 0x3c4dfaac, 0xd45904e2, +- 0x13cb6bdf, 0xa7f2b8ef, 0x14193cf1, 0x8cbaef14, 0xfc2e67ef, 0x18a547e3, +- 0xe45c767f, 0x97802200, 0x096c7b4e, 0x53b325f2, 0xf8a0a522, 0x951f87a5, +- 0x00e44678, 0x60de50e2, 0xe9ca92f7, 0x695c467f, 0xaf8962be, 0x6568adbf, +- 0xe0eb4120, 0x6b8c9779, 0xfe7c8bf4, 0x8e52698c, 0x7be31cc6, 0x5f51ee24, +- 0x303dc478, 0xf89b5463, 0x228a8bae, 0x147768a5, 0x823e587d, 0xf084265f, +- 0xc93c8c3e, 0x983ccf32, 0xa8ef121f, 0x30df32dc, 0xf02e9fd0, 0xb431ce30, +- 0xda2dd4ff, 0x5dd1cac7, 0xa0fde4d3, 0x63e64e26, 0x399c546f, 0x9b9300ff, +- 0xfa0b5da7, 0x8bdbe4d5, 0xdef1e3fd, 0xbf03be4e, 0x0d6de7a0, 0xbe8e797f, +- 0x9efd1caf, 0xd324bae7, 0x0253fd03, 0xe5ddf101, 0x1ac7457d, 0xfd03ff31, +- 0xd0fe426e, 0xa738c778, 0xabde413f, 0xe716a92e, 0x5073e2ab, 0x563fb71d, +- 0x1de30b64, 0x16e403ff, 0xc7726579, 0x78b6d9f8, 0x395b1ef1, 0x3817cafa, +- 0x9fedb267, 0xfef0a6f6, 0x5152ffb3, 0x07eb8361, 0x26f63cce, 0x3dc1bac3, +- 0x7d8fb1fb, 0xf6235ac9, 0xfaa07271, 0x7e24c694, 0x56e3dbc0, 0xe645f9e5, +- 0xfbbd1ff5, 0x5b34e48b, 0xfa175d74, 0x78733ccf, 0xc45ba02a, 0xb51ce7a5, +- 0xcc5638cb, 0xfa642e7a, 0x6e70bbc4, 0xc17ee827, 0x5ee10b63, 0xef68e738, +- 0x1cdf583b, 0x7dc677bc, 0x6f3cedc1, 0x97c8e73e, 0x1af78a93, 0x64df9d30, +- 0x1ac0ed47, 0xef4a3cfd, 0x0579bdf4, 0xed57c9ce, 0x73037884, 0x963ff052, +- 0x1fc16f7f, 0x699ce3c1, 0x2a36def2, 0x4d3826bf, 0x072863e8, 0x3ed338fa, +- 0xd0b53bfc, 0x638f4534, 0xfc1a7e49, 0xf063f832, 0xdd33a0c3, 0x14a5e270, +- 0xf8b7d045, 0x3fae9287, 0xe2fd7410, 0x4b5626f8, 0xd70fe4ba, 0x7ffefa0a, +- 0xfbc8eba3, 0x0d85df93, 0xde1eefed, 0x7f659e5f, 0xda5ffd3f, 0xeff7d09f, +- 0xd613bfbc, 0x8677a5fd, 0x4e4127e3, 0x7f09b21e, 0x28bdf62a, 0x97b09215, +- 0x1104f6f5, 0xe412d537, 0x276c06f7, 0x349d825f, 0xeab8e3ec, 0x8afc3148, +- 0x638f4493, 0x8f5b115d, 0x5a78ff28, 0xb19390be, 0x7c4b2274, 0x9488e137, +- 0x54ed6fc1, 0x76dd3b02, 0x8733c8c0, 0x7a565f61, 0x42edde44, 0xf27416c8, +- 0xa1a9ddf8, 0xde78cb9d, 0x448b9bee, 0xd102e51e, 0x1f382394, 0x7f082457, +- 0x84953bb4, 0x9daeeadd, 0xe796fc28, 0xc2e7b6bf, 0x4dafed5f, 0x6edbf910, +- 0xfc3b647f, 0x3e09eecf, 0x7f4dc835, 0xf844d0a1, 0x6e05c1ab, 0x02f74f31, +- 0xb7bb0769, 0x83f7c8e7, 0xf209fa14, 0x48ae8f48, 0xeec17910, 0xc42c81dd, +- 0xd24c3ecf, 0x2e1f434e, 0xb873cbb1, 0x19cb8f3b, 0xd4d4ac3e, 0x62bc6336, +- 0x6d48eeb9, 0x797bb3c2, 0x3602f894, 0xb27e5c99, 0x6be4493d, 0xe2317d0d, +- 0xa782e3d5, 0xc64e8276, 0xebefb677, 0x5dd065f2, 0x0eefc809, 0x721bfa0d, +- 0xbba75a36, 0xb794af72, 0xabc7f7a1, 0x1e3fbc49, 0x77c04bcb, 0xaa71f56a, +- 0x32be740f, 0xeb12fb45, 0x7ccb5cee, 0x92fd63b1, 0x1df127fe, 0x95fe30e1, +- 0xd38f42b3, 0xd45fdfe8, 0xf523b493, 0xed16f7c6, 0x282defd6, 0x79153632, +- 0xdc47213b, 0x9abef7ff, 0x8dd80ab8, 0xc125df82, 0x4fff1c6e, 0x80efb0fb, +- 0xbcf215bc, 0x296bc4f0, 0xfdfebda2, 0x1f5fe189, 0x83947ff7, 0xdde4e273, +- 0xfc058caf, 0xad26a92a, 0x70f5d782, 0x70f3e7ed, 0x159fbd74, 0xbccddf11, +- 0x8e65fb5f, 0xfbdfb788, 0xeff7908a, 0x02ffceba, 0xb38b7a5f, 0x000040d0 ++ 0x00088b1f, 0x00000000, 0x7de5ff00, 0xd5547c09, 0x73b9f8b9, 0x2cc99997, ++ 0x6cac8499, 0x1689b0de, 0x1a424270, 0x8b61db10, 0x5c18a3e8, 0x84c0b82a, ++ 0x01327b25, 0xf69e0fa9, 0x69b08197, 0x6b1b6351, 0x304ed1b0, 0xa0d06828, ++ 0x1c048201, 0x69f42d40, 0xb15a7d0d, 0xb22834b6, 0x0dc06486, 0xcefab3df, ++ 0x93739df7, 0x82266f7b, 0xd7ff7f6d, 0xcfe3fef7, 0xb3dce1df, 0xbef9db7f, ++ 0x44e77cef, 0x74891252, 0xc0df2105, 0x588487ef, 0x7190842d, 0xd521293d, ++ 0x7250ad3c, 0xdc04845d, 0x84999ff4, 0xd094b994, 0xa64234ca, 0x3fc3976c, ++ 0x7af9a04c, 0x79a56421, 0x963b5ecb, 0x7cb1d677, 0x08f8a5d8, 0x40d73f2d, ++ 0x6f6d02f3, 0x5af87b6d, 0x2ed91e5a, 0xedd08d92, 0x490b18c8, 0x8d84e422, ++ 0xcd265fb0, 0x6f921167, 0xfab2d967, 0x7da1737d, 0xd8958b61, 0xbb657f69, ++ 0x4b5e660a, 0x650705f3, 0x36ca5502, 0xd3fa50ad, 0x6848517c, 0x64d77c82, ++ 0x0ee0bf36, 0xd689b431, 0x25b772ef, 0xe424e6dd, 0xa88da54c, 0xae55210a, ++ 0x475ba4b6, 0xda1c5211, 0x8aed0396, 0x2c2f051b, 0x4df6ca75, 0xbac2a46f, ++ 0xab5e08b6, 0x66c9484a, 0xb2475107, 0xff437c39, 0x862cd13f, 0x97cb487f, ++ 0xda1275d0, 0xcea9016f, 0xff8c2221, 0x7abaa2a8, 0xd2a677e0, 0xf968e383, ++ 0x1c742db2, 0x05fcaeda, 0x2c4b0bc1, 0x137f10b7, 0x9773bf1d, 0x4ed3f67d, ++ 0x650adf58, 0xb5d60b84, 0x057a8156, 0x761dbca1, 0xaf57e615, 0xe2f2d0e4, ++ 0x7f257aba, 0x257f4f54, 0xe719fb9b, 0xd9343b55, 0xa7372baf, 0x51092a67, ++ 0x8be4f447, 0xd135f109, 0x5214897e, 0xf9ee8d66, 0x238911fe, 0x17fa1124, ++ 0xe9eb6a89, 0xbf12429f, 0xffa5df07, 0xee0af0a4, 0x355c2171, 0xd0f12dbc, ++ 0x783dab7f, 0x78e1e0bb, 0xfa592294, 0x61f4b5fe, 0x4f9d03c0, 0xa689c035, ++ 0xdcfcf9eb, 0x8924c913, 0x11f6eff6, 0x5efa408f, 0xcb56968f, 0xb1d08f24, ++ 0xfb470616, 0xaf34f1a4, 0x4bc4c590, 0x6557cfc8, 0xfcd2a6f9, 0x173fc443, ++ 0xf04abde6, 0x089e0217, 0xfa014a69, 0xd990235d, 0xc31ffeb0, 0x9af969a4, ++ 0x149f4a54, 0xb2d3d5ee, 0x3e05169e, 0xe7c804f7, 0x1a60f33f, 0xfd8053f6, ++ 0xa19fb4c8, 0x93c7ee97, 0xc7e86d93, 0xf5a85393, 0xd8fd8153, 0xea9faf2f, ++ 0xf9c6099c, 0xfd6b14e4, 0x5c7ec72c, 0xcf2eb797, 0xf38d13f5, 0xfb14beb9, ++ 0x25ea9b89, 0xd45f5a7e, 0xf9b481e8, 0x6cee5a44, 0x20fb1b8c, 0xe4c5d3d1, ++ 0x2effc0d5, 0xba7a25ca, 0x318ecd88, 0x2f9c61d0, 0x3da790de, 0x8f7c4e79, ++ 0xe120e9e7, 0x57c70538, 0x17282bfa, 0x61b7f526, 0x4efedefe, 0x4ef70b94, ++ 0xa1e95ff0, 0x49b180f3, 0xfe2bcd2a, 0xe8513c6b, 0x2053ce9a, 0x16aa9029, ++ 0x6be5cd48, 0xc9870665, 0x711abe03, 0x580fb68c, 0x68e22322, 0xf4984ebe, ++ 0x26cb806b, 0xc4f84162, 0xea02a488, 0xca0958c5, 0x5969b5a7, 0x7075074f, ++ 0xe288375a, 0x77e9e85f, 0x014fec9d, 0x6e42dafa, 0xadbd020b, 0xd3d74419, ++ 0x82e7909f, 0x128386b7, 0x3f283f6d, 0x5569e005, 0xc7eb7f28, 0xa3f8e857, ++ 0x6117fc70, 0xfe30eddc, 0x5be3deb8, 0xc61b6487, 0x342e0db7, 0xe8536f8c, ++ 0x77de94f8, 0xf8f9bb91, 0x08137e14, 0x17782579, 0x5c1d6f8e, 0x55afe388, ++ 0xfc61a148, 0x5ff1ee98, 0xef5f7185, 0x2643fd6b, 0xb83fd718, 0x857eb8d8, ++ 0x5910ffad, 0xc18fc7c4, 0xb836fff5, 0x707fad90, 0x95bf5b31, 0xbe3ddbf5, ++ 0x6ffe1bbb, 0xf6efb8c3, 0x13a1feb5, 0xa2bfeb8d, 0x2b7eb8d4, 0x527dff1b, ++ 0xe277c7c6, 0x960c7ff8, 0x515ff5b2, 0x562be38a, 0x48e817bf, 0x11531019, ++ 0x8193e3a2, 0x51922194, 0x1d30f946, 0x6d084f19, 0x2086435f, 0x618dee1c, ++ 0x0c79f774, 0x8f6737a5, 0xca2123bc, 0x959e5451, 0x692f9a73, 0x9c80a49c, ++ 0xf72a72c5, 0x2ea9f116, 0xbf71116c, 0xd0d63521, 0xcedf3a70, 0xf9083116, ++ 0x85d73585, 0xc8efdc44, 0x27685cbc, 0xff7c3091, 0x1bd1b1f8, 0xa732ebf5, ++ 0x13e5aa8b, 0x623e06ed, 0x264e09f3, 0xfce82b23, 0x8c1101a6, 0xa09fc9eb, ++ 0xf9509472, 0xa39521f9, 0xe9949e90, 0x71fbf478, 0xa289672a, 0x6c159be7, ++ 0x77920f1f, 0x9c812646, 0x1213bf60, 0xa589f783, 0xffe00842, 0x158ba3f9, ++ 0xaa8b4f90, 0x3de8141d, 0x3c7008f3, 0x43597645, 0xa784051b, 0x1db9f00a, ++ 0x3f909159, 0x52a6b453, 0xf6d416d0, 0x8bbbb433, 0xd0a75684, 0xe7d60bfa, ++ 0xf5d0f20d, 0x3adb39df, 0x83fd8456, 0x905806f8, 0x4b00c98f, 0x9bb32136, ++ 0xd007951f, 0xe5b3edcc, 0xed75db0f, 0xf98df8e7, 0xf98d0b3b, 0x5b24394e, ++ 0x1228df40, 0xf7ed3d48, 0xb9630aee, 0x109c4e36, 0xc7caf0cf, 0x9b1271fb, ++ 0x8e90ddef, 0xc41ecf85, 0x6b0f5ceb, 0x7027cdab, 0xb8c24c9f, 0x1227b65f, ++ 0xd6227fc4, 0xbad87bf3, 0x2b9df3cd, 0x74b97cdb, 0x8b97733e, 0xfcf34f08, ++ 0x7c3af7db, 0xad343196, 0x120644fd, 0x3cc7af34, 0xcccb79ff, 0x1ea0f1eb, ++ 0x7f341796, 0xa6627467, 0xa4cb40a7, 0xf575c77e, 0xe86e9aca, 0x5f475c77, ++ 0x19679b25, 0x39a145f2, 0xb505fa86, 0x45f28679, 0xf28645d5, 0x1b16eb05, ++ 0xe5c179f2, 0x96f3fa86, 0xdf9430ad, 0xa180f15d, 0x47c2cefc, 0xfe39f90d, ++ 0xb7fa860d, 0x9437aecf, 0x755ef65b, 0xd551f013, 0x7d8122bb, 0x89e733e3, ++ 0xfc1f4187, 0x017929cc, 0x532aa71f, 0x54ce0f90, 0xb67698aa, 0x4cfcd864, ++ 0x8a83e60e, 0x534568b3, 0x9044dd70, 0x67e504cb, 0xc11d8ad1, 0xddaa40e0, ++ 0x4fc22a0a, 0x984855ac, 0xe240b092, 0x2238e9bb, 0x2fdbcaea, 0x194b5e51, ++ 0xb977a33d, 0x7bfd1ed8, 0x15de6360, 0x92fa7720, 0x0037f407, 0xbe2eb9f6, ++ 0x4bcb9bbf, 0xffab9205, 0xe44ac84e, 0xce5c8bf3, 0x1e4c2a96, 0x3a94be94, ++ 0x1f21b899, 0x6df1511e, 0xa05135e3, 0xed049c82, 0x81e8113c, 0x5e818172, ++ 0xbbf81a86, 0xf3889f63, 0x3099072a, 0xee4e441e, 0x4ce4017a, 0x5be0c0f8, ++ 0x7c3cc346, 0x77c0090f, 0xafb8892d, 0xef4e5477, 0xfc025c77, 0xaa7a62e4, ++ 0x27a63672, 0x1e98fd2a, 0xf4c42caf, 0x4c0acac3, 0x61972bdb, 0x8832b47a, ++ 0xd72a9fe9, 0xcac7fa61, 0x548f4c6a, 0x87fa62d6, 0x9da610ca, 0x354c3e95, ++ 0xbf96e87e, 0xe55f5c09, 0x79dd0576, 0xaf817f30, 0xdbad1565, 0x4dee7c86, ++ 0xe0bf3e01, 0xe8047cfc, 0x588e17e3, 0x7dfbe809, 0x6f4ccbc1, 0x87d1e37d, ++ 0x887e4afa, 0x77a33fe2, 0xe1863db9, 0xd3216ec9, 0x0f479509, 0x3bc67f0c, ++ 0x25e6147f, 0x21ba1920, 0xa2b96779, 0x208c3bf4, 0x27852ebe, 0xb98c8be2, ++ 0xc4e3e299, 0x0595ff13, 0xfbe45efd, 0x1101cc5f, 0x7e1261f7, 0xd2f80bda, ++ 0xb5f70dc1, 0xef2e76c8, 0x73bf012f, 0x1b6bf0dd, 0x413a684c, 0x5dfd20f0, ++ 0x0912b668, 0x08ead8e0, 0x1727e251, 0x06ed3e0e, 0x62925c7e, 0x028f1cf1, ++ 0x6b2d2d07, 0xf538f34a, 0x318b4ffb, 0x985aa17f, 0x58f284de, 0x3475bd8d, ++ 0x73c795d0, 0x3fe0187c, 0x9fad5305, 0xe78a2925, 0x33d7e538, 0xb2c6879b, ++ 0xf6c43bfd, 0xa438c6c1, 0x62176a57, 0x7cf47ffd, 0x9b47eafa, 0xe4cd210f, ++ 0x03c81b23, 0xd2f4365a, 0xbc2f4ef6, 0xb92a9f4b, 0xf956af80, 0x6217d073, ++ 0x0cdfffe8, 0xcc257e81, 0x9a06fd6b, 0x1af5a0c4, 0x1868def8, 0x3553b68f, ++ 0xf5da1b9b, 0x3912b74d, 0x9515d1a1, 0xcb180a57, 0x3dda2768, 0xce257dc6, ++ 0xa4b40f90, 0x0cfb0c7a, 0x3ff283fc, 0xd0129415, 0xa2a7294d, 0x4eb9c92e, ++ 0x063bf3a0, 0x25e293f2, 0x657ab020, 0xafc576b6, 0x81b63922, 0x5b3f319e, ++ 0xf6f53ba3, 0x3fbca80f, 0x7932effd, 0xa2bfca10, 0xe9eacab3, 0xc410ee8f, ++ 0x780bf342, 0xc9737e6e, 0xa77b900c, 0x5f9f6c2d, 0x60dd7248, 0xea9214f4, ++ 0xce73d02c, 0xa074cb11, 0xf7e473ff, 0xbd9d0cee, 0xb828b5e1, 0x8ceb05ce, ++ 0xcfd52cfb, 0x5a82f90c, 0xdc9f3e63, 0x9ef4049c, 0x9093235f, 0x2c697c00, ++ 0xec1e2d57, 0xac5480b7, 0x8abfb901, 0x3df32bdb, 0xe7401a44, 0xc9f3b657, ++ 0x8f3a3cac, 0x9e985bef, 0x45efd9ae, 0xc5fe6cf1, 0x8f8af54d, 0x9cd47f96, ++ 0x096be3f1, 0x01ad0fb4, 0xbb70463f, 0xf6a4dde0, 0x9d77dfc6, 0xdabe79bf, ++ 0x8fcbd27e, 0xb651e7c0, 0xa285f059, 0x2cd327ec, 0x82b7d702, 0xeb06de98, ++ 0x79ade9d6, 0xbe5a0e1c, 0x6e5f94cc, 0xf4cdffca, 0xf40c4096, 0xe7f04c76, ++ 0x7d191259, 0x4820be81, 0xf7ffc511, 0xabd29ff4, 0x687fb2ff, 0xff6903ff, ++ 0x97fe8659, 0x1ffb43ff, 0xabfe6bd6, 0xb65ff5a3, 0x208eeb73, 0x2fc53795, ++ 0x7426e63e, 0x552d3a1f, 0xfe297927, 0x76ad374b, 0x929c1d03, 0xe7a06e82, ++ 0x7a7121d3, 0xbedd8a28, 0xfd01e81b, 0x00a73e88, 0x93fc1576, 0xb9e67ff6, ++ 0x7d84cd9f, 0xb24df3e6, 0xcda5ed07, 0xf295b0d6, 0xd173796b, 0xf306320c, ++ 0xed7e58c7, 0x2df21179, 0x7e2cfa46, 0xf024b1f6, 0xe14a51bf, 0xf51844f6, ++ 0x8f86f2a5, 0x0a1f6073, 0x99f20890, 0x7f8c1db9, 0x63e51e31, 0xbbdb129e, ++ 0xf513ce9c, 0x4b8700fc, 0xe767f9a0, 0x927df045, 0x3507e676, 0xfae42fd5, ++ 0x95c5a34f, 0x4e9a8270, 0xfbe4fbe4, 0x78352f20, 0x7fd31090, 0x3e3cb6aa, ++ 0x4f9d18e6, 0xbbbfc347, 0x349c1d05, 0xb4d0bb3e, 0xa8afd7e0, 0x4ee3cb7d, ++ 0xb4f5e76e, 0xb53b610b, 0xad6deb85, 0xc3952d2c, 0x4b8bd06e, 0x906f65eb, ++ 0xfadd2e7e, 0x804f33f4, 0xd5befa9d, 0x5ff69c3b, 0x3ff5f5b2, 0x92f9a04c, ++ 0x0cc2726d, 0x90a70cb6, 0x009783d4, 0xd8d97ffd, 0xbf143c1e, 0x8ea2bafc, ++ 0x8fefdf66, 0xc947c1ef, 0x190a7db6, 0x531e1bdd, 0xed29f69a, 0x697828ce, ++ 0xfa03963a, 0x2f96d555, 0x4f27b014, 0x724815ef, 0xd678145a, 0x027a8ebf, ++ 0xc8f109c0, 0x378dd4f1, 0xc500fd53, 0x0d73c80b, 0x87f2e64f, 0xfe81fcb9, ++ 0xcf4851d4, 0x7e02bc2f, 0xbd5a3fe5, 0x17c2feb0, 0x3ac371ee, 0x8c154a4e, ++ 0x9d5c9fae, 0x16e3a3e4, 0x0f24c1ca, 0xe17beca6, 0x7a413f53, 0x93fc382b, ++ 0xfa0f6624, 0x37b82d52, 0x7d615305, 0xc36eea8b, 0x3f13e5f5, 0x93e15dd2, ++ 0xc7c82e62, 0x7d3224cf, 0x48be145b, 0x9c5f1917, 0x2e1548dc, 0x6093beba, ++ 0xff3c8097, 0x84da18bd, 0x04c590fe, 0x9a27fff8, 0xc12c9c7f, 0x863667fc, ++ 0xe1689b27, 0x3db5457c, 0xac36bd3d, 0x9cfc036d, 0x064be419, 0x48805a3f, ++ 0xe10f0e41, 0x78afda1b, 0xc3325a78, 0x2ca5510f, 0x01ea8ede, 0xd43be053, ++ 0xf67d936f, 0xe4768631, 0xf19eb49b, 0xe9f1f297, 0xff6063bc, 0x0a44993e, ++ 0xefaca29b, 0x7be3516e, 0xe8eb8fba, 0x8cdfc74b, 0x601e1bdf, 0x7bf1adfc, ++ 0x2874d668, 0xc61df4ff, 0xf60ed03f, 0x70af3a47, 0xbbef9632, 0x60794055, ++ 0x7c68e125, 0xbe7320dd, 0x746b9636, 0x092de742, 0x817a3ab1, 0xfe11e3fe, ++ 0xafcb3fe8, 0xf274eda1, 0xb9e30032, 0xf1a7f77b, 0xffe7016d, 0xff91a251, ++ 0xfbe31d49, 0x20abf5be, 0x72a573ee, 0x802799e8, 0x067f295f, 0x3957e055, ++ 0xb67dd617, 0xee1fc0f1, 0xb67a7ca0, 0xa353e349, 0x69f334fc, 0x049b4be1, ++ 0x9f334fa0, 0xdaa42d9e, 0xa53e3448, 0x69f2a3df, 0x53fffb61, 0xefc1a9f9, ++ 0x34fc1356, 0x1c17d879, 0xbcf0f2cd, 0x9a784545, 0xbdfd21e5, 0xd37ab243, ++ 0x1a77469f, 0x5f3f15bd, 0x0bfa0576, 0xe8d4ba34, 0x352e9bae, 0x7fe5ebba, ++ 0x5ccfc031, 0x8168183e, 0x2eee49d2, 0xd2aaed19, 0x461e7656, 0x2031bddb, ++ 0xc3e4e113, 0xbf548c6d, 0x9f412031, 0x4df2990f, 0x533efaa6, 0xdf54d73e, ++ 0x1857ca6f, 0x1cb697ea, 0x3fe20850, 0x5d67a86c, 0x28f904f6, 0xeda43d8a, ++ 0xf3e68137, 0x62e8104a, 0x79014460, 0x4124af27, 0xf707f817, 0x762f6888, ++ 0xa1af1851, 0xa63574e3, 0x6e548285, 0x3b33b6ac, 0xaca8923c, 0xe5d73901, ++ 0x21e3b889, 0x6ffa676f, 0x1dc46e57, 0x8f23d3a7, 0xa7288ab5, 0x7a6443db, ++ 0xdd07bf34, 0xedcf1041, 0xe672afa4, 0x3a269cef, 0xfb032f07, 0x82f45ab3, ++ 0xc570bb49, 0x8d706eed, 0xbd0eb574, 0xbefd3669, 0xc78890e8, 0xee315d28, ++ 0x122f3031, 0x3aa949f4, 0x0914e1fb, 0xf82272fe, 0x1d995b2f, 0x49bd70b1, ++ 0x91eb20ff, 0x4b9df27e, 0x549f9015, 0xe8d0ffef, 0x507c65bf, 0xac2bfbcc, ++ 0xed6b9633, 0xec0b04e1, 0x6306e2b9, 0x43db9fb9, 0xe02f813b, 0xa49d253c, ++ 0x43015ca3, 0x2e71ec07, 0xa389a787, 0xe14d9a6e, 0x245075df, 0xa1797e70, ++ 0x5ff84455, 0x95e76468, 0xfc889824, 0x28224e55, 0x753834ff, 0x7d28ff00, ++ 0xed8ea7cb, 0x0fbace7f, 0x07c764e8, 0xd3457e63, 0x8fef1d8e, 0x9df90dd8, ++ 0x80fe0def, 0x653faef4, 0xc4fd1daf, 0x485d7b5d, 0xde7b5ddf, 0xe41f7c1a, ++ 0x3fd15977, 0x8bf7b5d7, 0x5d6f4031, 0x2085ad2b, 0x5106badf, 0xb03e83fc, ++ 0xed318be7, 0x42ae9fb8, 0x2a287dbc, 0xfd6a1f4c, 0x0242a3af, 0xa05574a4, ++ 0x2075ec27, 0xb15e04ff, 0x6ba13fa3, 0x7e5917cf, 0x3d6e3fe7, 0xa6fcfce5, ++ 0xbf6645cb, 0x638bf304, 0xeec0ef7e, 0x80af4ff1, 0x7de6e7f3, 0x3e5a02ca, ++ 0x8ebfd5e5, 0xf5d9b901, 0x3a7fd312, 0xe0a7f6e5, 0x789ce27c, 0xe14c857c, ++ 0xd44c09dc, 0xa407909f, 0x4f8193e1, 0xafe5c37a, 0x5cb927e8, 0xffd24878, ++ 0x3e087816, 0x215cdf26, 0xfeeb009b, 0x2007e8f2, 0x915af607, 0x9ef5b52e, ++ 0xfa815a6d, 0x3dd6a5c9, 0xbadcfff4, 0xace5f085, 0xfcc4b27b, 0xebacff0f, ++ 0x38aa283e, 0xf41f334f, 0xf73df3a6, 0xcbab7e62, 0x4cbdf38b, 0x7fff9f7a, ++ 0x512fef0d, 0xbd2fbbbc, 0x6bff15ee, 0x2e687ef1, 0xce07bbc7, 0xfeaf03f7, ++ 0x5df7e715, 0x3ffd5ce5, 0x5afbde39, 0xffc7a6bf, 0x93bea2c6, 0x274feb4e, ++ 0x2c504ed5, 0x7fdb286e, 0xfe969d28, 0x3881e066, 0xd364ef98, 0xfe968d79, ++ 0xd276625e, 0xf682c164, 0xb813891f, 0xa6ecc7fd, 0x187f5c01, 0xf51f34b0, ++ 0x1f030190, 0xa4837a62, 0xe379c0d6, 0xf02f066f, 0x1904ec62, 0x790fc47b, ++ 0x6f3c75cf, 0x257f1fb4, 0x851c1f10, 0x2ffc180e, 0x1d8f4107, 0x3d445038, ++ 0xdfa8a697, 0xce9ee6be, 0x062a97be, 0xd506e73b, 0x24e4f768, 0xa9a3ed18, ++ 0x8469bfbc, 0x539a7fcd, 0x1c288508, 0x45fa0f26, 0x2743f802, 0x4089970f, ++ 0xbfc439f3, 0xa989ec0a, 0x2f7f634e, 0xb8cd99c0, 0x740e381e, 0x2e80962e, ++ 0xda1e83a6, 0xb3a7ea0f, 0x84a0c0fc, 0x0f5c39e7, 0x2c5d5ebd, 0xca7e6905, ++ 0xe00974c0, 0xb96b605b, 0x36ebfc11, 0xb8f380af, 0x7282c3b2, 0x202996c8, ++ 0x95ac8cfd, 0xe2d87f30, 0x99f80719, 0xb3ceed79, 0x63f809cb, 0xa78b0a7d, ++ 0xf57e65c9, 0x66f9beaf, 0x71a1c422, 0xffd017b8, 0xe3fe047f, 0xa18e123a, ++ 0x91245a70, 0xf83c6c60, 0xa1f20553, 0xcc6a9fc1, 0x4907efc3, 0xaa5cfd3d, ++ 0xfbf45f7e, 0x52774e8f, 0xc290f97e, 0xc3a4177c, 0x6f497870, 0x95bf7daf, ++ 0x26f02bc1, 0xe7610d09, 0xeeae62f5, 0xcc9269fc, 0xff3bbbfc, 0xd80652f4, ++ 0x46ba934b, 0x1e3e32c5, 0x80697a86, 0x8817a5eb, 0x0275eb1a, 0xc58d0f1f, ++ 0xa283b573, 0xdabc5a2b, 0x3dc76e16, 0x340b710f, 0xd5206aed, 0x2409d822, ++ 0x60c1fe82, 0x8a6c8d83, 0x4a313712, 0x1c1ffcd6, 0x6627f46f, 0x8d9f9f81, ++ 0x8d3688bf, 0x63ade3d5, 0x4c6969c6, 0xefc03c6f, 0xc739dd43, 0xb05f0bdf, ++ 0x5bbe011b, 0xb939edec, 0x07fdf851, 0x99f7e332, 0xbf44bffb, 0xf5add5da, ++ 0xabdfa016, 0x73862c1b, 0xeb992cbb, 0x58c963fd, 0xfdccd798, 0xe0265776, ++ 0x85e8a0e5, 0xeb40c138, 0xe51fc579, 0x4f0cc9bc, 0xb4fc1fe8, 0xe20f654b, ++ 0xb4dcb76d, 0xfbbae000, 0x7d808d9c, 0x2ea94bb6, 0x13cf3689, 0x22e79b0a, ++ 0x98cf74d2, 0xf83e7fb4, 0x8672ea4e, 0xd39d8327, 0x6d3db840, 0x74823fa6, ++ 0x0933617c, 0xbb071c81, 0x85c2e408, 0x08fb8246, 0x6043c905, 0xff7e51df, ++ 0x703fdea1, 0xe7b6cb65, 0x6f29ff61, 0xbae03c15, 0x15da972e, 0x5a05fff0, ++ 0xf79044e2, 0x4716aae9, 0xab7d19e9, 0xca962f8e, 0xc0f7c212, 0xc277dd84, ++ 0x28749fb8, 0xdf43f604, 0xec37116b, 0x66b49f17, 0xb5f41f20, 0xc92b97ae, ++ 0xe825538d, 0x3343c987, 0x8c6a8c3d, 0x15afe431, 0xbf81fdfd, 0x97db5a66, ++ 0x2fe0a37a, 0xb2efe389, 0xffe85be5, 0x8ef6f933, 0x62fcdf26, 0x8e8f8eae, ++ 0xc96f96f6, 0x12dbe4d1, 0xb8064d41, 0x3433d92f, 0xe4baf019, 0x4d189c90, ++ 0x64ad6dbe, 0xf22f67e7, 0x66aed7f8, 0xd1aedf2a, 0x2a66b7c9, 0x19c4a2df, ++ 0xf95cbc1c, 0xe19ffa16, 0xdf20adbf, 0x03f7aca2, 0xbe4d3f0e, 0x863d698d, ++ 0xb34c6df2, 0xfa2710c5, 0x37ca4bfb, 0xd056f121, 0x5eca0ec3, 0xd9fa1447, ++ 0x17bef5ca, 0x8c1bbc79, 0x4e2e7203, 0xee726ef9, 0xb9cae5c2, 0x6b3821ff, ++ 0x76c96e72, 0xbdb3f182, 0xb9c990e9, 0x9ca8bb25, 0x991e8013, 0x87b25b9c, ++ 0x498fff30, 0x25ec8dbe, 0x2fd608df, 0x81f6b30f, 0xefc7b496, 0xf58dfda2, ++ 0xad1b5ec9, 0xde47b63f, 0xbbcbd38d, 0x790fa538, 0xe4f2f077, 0xef2e76dd, ++ 0x021b1ca8, 0x1f4cd5f2, 0x9c6356de, 0x27f1eef1, 0x7e065f1b, 0x73c44b79, ++ 0x7616c3ac, 0xf1bbf0ee, 0xbe813327, 0x143e610a, 0x4615138f, 0x41959d7f, ++ 0x6bca7fec, 0x4e657d6c, 0xde5c7f16, 0xf2c3f4cc, 0xd2a42146, 0xf84ce67f, ++ 0x17f98152, 0x324811ed, 0xb2b2cfcd, 0xed59e4fa, 0x48cc861c, 0xc2c3d1d7, ++ 0x1ff412ec, 0x0d88942f, 0xce25c3fc, 0xffa0d39c, 0x7f336496, 0x5eff0972, ++ 0x0d7da874, 0x368b55f8, 0xa70e7808, 0xf16a4dc5, 0xe3cebda3, 0x1fa0575b, ++ 0x3f2e7cd1, 0xcce3c793, 0xd5085e7c, 0x282b8947, 0x238a6cd9, 0x4b3cf4e4, ++ 0x9178476c, 0xa6ef45b7, 0xd5a3fc28, 0x41d386eb, 0x1106a70e, 0x386ed3f7, ++ 0x69a9b851, 0x3144e1bd, 0xa93d233d, 0x6f452e07, 0xf666f5d1, 0x6e0d5ebd, ++ 0x7e6b75e6, 0x4fde12d2, 0xe0d0705f, 0x1cfd6bdc, 0x402ed4ee, 0xc7866939, ++ 0x7fdba53c, 0x2ff1019a, 0xce506e94, 0x622b7f04, 0xa4ee44dc, 0x147b86e1, ++ 0x64fd388b, 0x029a4f54, 0x20b3e4c7, 0xe796995e, 0x237e2ed7, 0xdc63c295, ++ 0x6c2c7511, 0xb04ed7a7, 0x6f7ce1fa, 0x72823d8b, 0x5dc3a350, 0xc17f0e9c, ++ 0xbfddd9fb, 0x93da3262, 0xf407822d, 0x8ed84090, 0xb8500d70, 0x8096bdc2, ++ 0xa01bf0c4, 0x77fc08f4, 0x0ce7c360, 0x15047b8e, 0xda3908fc, 0xa178057e, ++ 0x195a33f5, 0x0121025e, 0x224992f1, 0xaf2fd7e8, 0x8061bc15, 0xc23d4b5f, ++ 0xf4cf934f, 0x49e3d4e7, 0x3452bf47, 0xba4ac5fa, 0xd784b2fd, 0xfead699b, ++ 0xccf3d003, 0x8f526567, 0x7dffa6e0, 0x225f3d1b, 0xa78cc4be, 0x5b5e1c9d, ++ 0x804e9e01, 0x5de9845b, 0x9ef12fe1, 0x901e568d, 0x4e780682, 0xb7e2e279, ++ 0x069c6bc2, 0x9063a02f, 0x2279ad6f, 0x045bf3e4, 0xf7ad2fd2, 0x4d9ce17a, ++ 0x7b45efcf, 0x9ffeb18e, 0xca24bc14, 0xae9b2fba, 0x42e7a0fb, 0x97e0b74a, ++ 0xcdae8bef, 0xf0a5da70, 0xcf4e3273, 0xde47b3bf, 0xde7a00cc, 0x939f2023, ++ 0x79c338d6, 0xd30afbd9, 0x29d8b623, 0x4775d3dd, 0x8ddec90e, 0xf0796f6a, ++ 0xb05f0e5b, 0x98f7f41f, 0x408582ae, 0x1b66e21c, 0x3ce191c6, 0x54fd3086, ++ 0xdab79f2f, 0x99ade249, 0x847ff77d, 0x7e97dff7, 0xc347e5a4, 0xdd971078, ++ 0xd91bc742, 0x7f799e33, 0x9705fcd0, 0x5cc7d75a, 0xebadfdce, 0xaef9c6d2, ++ 0xd2013671, 0xe2d57886, 0xfe098e6d, 0x73e83269, 0x18c905d3, 0x72e116b7, ++ 0xffeeefeb, 0xefb13943, 0x078a49fe, 0xe3dd69ef, 0x907bbed1, 0x843d733e, ++ 0x7c4d239f, 0x4ffdf60f, 0x2cbcec7c, 0x9dde42d3, 0x64c7fb08, 0x7d5d0099, ++ 0xfe8ca6f2, 0xb2a64fce, 0xde9bce78, 0xcb81203a, 0x6b1626e7, 0x271a6e45, ++ 0x18759da0, 0x7a0f1eba, 0x46f88db8, 0xe032fc20, 0x437a583e, 0xf29514f5, ++ 0xa1cdd8f5, 0x53bd482a, 0x03bf0922, 0x09124dbc, 0xd7cdade0, 0xe6938a6f, ++ 0xa498f9ef, 0xea8dab83, 0xec7ed807, 0xf5089241, 0xd112f826, 0xfcdf198c, ++ 0xd0b73be9, 0x537f8c79, 0xdeb4aaf4, 0x274e03ac, 0xc8f4faa1, 0xebf10b3a, ++ 0x848135e0, 0x34dfc0aa, 0x16efb8fe, 0xd5217798, 0x41fee077, 0x957d6b61, ++ 0x0275f21b, 0xfd040fb6, 0x9eba6e39, 0x73e7b5ad, 0x817207be, 0x026e83d6, ++ 0xa05eac75, 0xe842f041, 0xa3eb7e6b, 0xdf92b718, 0xb545e020, 0xd88121ad, ++ 0x1b21bf58, 0x1d6b77ed, 0xfb099f6d, 0xfd0f6d17, 0xe77f9c36, 0x743b9016, ++ 0x91bed89e, 0xd3e6f79d, 0x4bf02a76, 0xafec62c3, 0x70204ea8, 0x91b0a24f, ++ 0x6f854bed, 0x6f285eca, 0xf701b7de, 0xbc7419db, 0x87d834d4, 0xbef153c2, ++ 0xc1e08649, 0x838d787b, 0x45d7bfd0, 0xd2c8fe18, 0x098e4c81, 0x1eedcf3c, ++ 0xd67bef4d, 0x20f9043a, 0xe942bbdf, 0x5df9fb47, 0x059a6276, 0x9e3ceae9, ++ 0xf0a71ee3, 0x1f7853f6, 0x071071e6, 0xda523fb2, 0x6be2fb75, 0x07c8a1d6, ++ 0x61265b0b, 0x9222c07c, 0x3301f18b, 0xf37d33c7, 0x21ecebed, 0x2dbdf3f0, ++ 0xf7c20647, 0xf159d703, 0x2656e77b, 0xb5073b87, 0x64f75fa3, 0x7ee04c9d, ++ 0x889d5544, 0xa364e2f2, 0xc52ef78c, 0x78f9d927, 0x7fa656c1, 0xfd63a81c, ++ 0x0dbd049e, 0x4e50ebfc, 0xb45b05f3, 0xa72673f3, 0xdf33fb35, 0x35f5cec3, ++ 0xd7c65bb9, 0xaa1f6bdd, 0xc900a159, 0x196de59a, 0x24c5c797, 0x59b2f68c, ++ 0x79c196ee, 0xd2f81bad, 0x64e47f1c, 0x18ec18f2, 0x97f083a0, 0x6fe5d748, ++ 0x18ec04ca, 0x1c8ea3e1, 0x23da778c, 0x7c7c7fa0, 0xf383e0ab, 0xd623c2f2, ++ 0xa1dfea10, 0x06ff79bc, 0x56fbcbfb, 0x27b0a102, 0x4e540f00, 0x7f235b65, ++ 0x7efd05fa, 0x220db0fa, 0xe4dd284d, 0xf8b5dc21, 0x2c4dccd1, 0x70f3244e, ++ 0x13dc124d, 0xa1fb5325, 0x15a8281c, 0x27275f89, 0x5bbe0b4e, 0x83fb60ee, ++ 0x9a271f47, 0xc3e754a9, 0x95b9fafe, 0x937547c9, 0xe417b10c, 0xd3932b49, ++ 0xf8c03ed4, 0x8f5da2ce, 0x3a3a2926, 0x68f3da28, 0xafbf4892, 0x551671e1, ++ 0x76d2bfb0, 0xa71b0a45, 0xa9e0af68, 0xf5a38dd7, 0xecabf5a3, 0xee86ed62, ++ 0xfd5f6961, 0x70fcc117, 0x20299f9d, 0xf4fdcc2f, 0x7e8fbf1a, 0x62e3ffb2, ++ 0x95e7408d, 0x4188b6fd, 0xcd1fd9d0, 0x3f3faa18, 0xafcd52d0, 0x858ef59c, ++ 0xcbf074f8, 0xf10c53fe, 0x3cddf0e9, 0xc53df28e, 0x845a8fdf, 0xfc805d90, ++ 0x132ca531, 0xf3e01ef3, 0x2e7fee72, 0x85ceca9f, 0xaf0fd39a, 0x919fbe02, ++ 0x903d2029, 0x97e95fa0, 0x0a9afa80, 0x9905cc71, 0x6d017dac, 0xbcd8fc0f, ++ 0x9527f181, 0x91c82a13, 0x7347baf2, 0xa0837eb0, 0xf5cdff42, 0x148fa879, ++ 0xcb048b66, 0x7ea18e1b, 0x2c72d854, 0xf298f801, 0x03e80d6d, 0x1ead13e5, ++ 0x3f1ae390, 0x36fdfc6a, 0x36263b8f, 0xfb8868cf, 0x2f9801bf, 0x6f8b5f0a, ++ 0x681eb932, 0xc818fc64, 0xf6fafc66, 0x78561956, 0xfc8dfc39, 0xe333727c, ++ 0xdbc9f157, 0x759ee072, 0xcf7626c1, 0x14dd40fa, 0x93e9f405, 0x9bf70121, ++ 0xf4cdfcde, 0x577f3356, 0xfbdf6c09, 0xc6a5faae, 0xd31f1adf, 0xbc608fdf, ++ 0x70a7ca52, 0xd7cccf2f, 0x3fa6e533, 0x7be743dc, 0x3d740bd3, 0x7e53be74, ++ 0xaedddcb0, 0x9f349393, 0x897cf904, 0x726909c5, 0xf1624ca5, 0x7e79df64, ++ 0xac4bf1a6, 0x93c8ff46, 0x471638d6, 0xdd2320dd, 0x7b3f8a5f, 0xf265d9f1, ++ 0xd5f2e5e7, 0x1b53f8a5, 0xec63dc5f, 0x6f4e49e7, 0x293afee6, 0xae14c35c, ++ 0x1a7c69bf, 0x3dcf47e3, 0xe0266c77, 0xa53764a7, 0x46afa073, 0x9c830917, ++ 0x5fb84293, 0x3e8b3715, 0xc295af8c, 0xf4b8b759, 0x83e2cc7c, 0x21745e4a, ++ 0x64bf153d, 0xeda0cd0d, 0x347c778b, 0x5635e306, 0x29de3046, 0x97d71cf8, ++ 0x8063ed83, 0x16258a0f, 0x0b9664a7, 0xfd31b3df, 0x639763b9, 0xd84fac36, ++ 0x2825decc, 0xb65dba6e, 0x8625ceea, 0x971c64d8, 0xc3f3c3d6, 0xb863a520, ++ 0xd3f30a17, 0xe2d787df, 0x30b63a93, 0x22dc5139, 0xbc581da3, 0xc4275b79, ++ 0xb11f16a5, 0xb02bbfa2, 0xd9c63cf9, 0x2b71794f, 0x2d0253fa, 0xaddce1a2, ++ 0x66e03c57, 0x78856c31, 0x3c32e6b6, 0x63f9a427, 0x1e8a6f98, 0xb8a97b17, ++ 0xf71792b5, 0x105208ec, 0xacfcbc96, 0x99cbe41b, 0x806e4db6, 0x5bf7ed3b, ++ 0xc57b71e3, 0xf03d35ff, 0x677ff1ad, 0x71941fe0, 0x7a71b56e, 0x3727e2d7, ++ 0x923d43f7, 0x372b2fce, 0xb74739ca, 0xb3f5be5e, 0xbd3e20a7, 0x4fb3a5e3, ++ 0xbf4b7cc1, 0x8829e4fe, 0xed7b223b, 0x9e05dfb8, 0x7be3177b, 0xc6dde9bb, ++ 0x9e5b43fd, 0xcee8b8c5, 0xe85eadf7, 0xc9cf73ad, 0xd67710c1, 0x24cbedb9, ++ 0xdd2e5bf0, 0xbafd0d33, 0x494fb74b, 0x0bf65126, 0x0dba052d, 0xb65c465d, ++ 0x9a075f19, 0xd47c600f, 0x906f8a39, 0x9cf1dd7f, 0x3e2c654d, 0x9c71e556, ++ 0xdfe3d18d, 0x366dc57b, 0x75d372df, 0x999bf720, 0xf8c978fe, 0x1e2877cd, ++ 0xfc0cb9af, 0x817e6a35, 0x073bf8e8, 0x5a78a0ff, 0x67dfc26f, 0xfd7e8bcd, ++ 0xf7359404, 0x337e33eb, 0xd370197c, 0xd8e7ebe2, 0x80db8f7c, 0x1e7a5e6f, ++ 0x6f0165e3, 0x7fd85433, 0xf70c1b3e, 0x91c94e12, 0x6d6f78b9, 0x7103d58f, ++ 0xde7bc588, 0xdce9fe43, 0xd0fd187e, 0x77b9c784, 0x8b1fee92, 0x3af8164b, ++ 0xee2c5c1b, 0xe21fc393, 0x7e375542, 0x8c9ff1e7, 0xd0b8b58e, 0x7f41e2be, ++ 0xb67a6367, 0xd65ff716, 0xb38f01f0, 0x9097c1ec, 0xf63a780d, 0x1ab671ad, ++ 0x0e5c3c1c, 0x4737c4f7, 0x8eedbb8f, 0x02f8e783, 0xd43ec1fc, 0xf34cbf1d, ++ 0xdfa2c703, 0x45123de8, 0xb3d6741e, 0x394ee8b8, 0x2d537dfa, 0xcd90f9de, ++ 0xba1ce714, 0x4be738bc, 0xc2bbffcd, 0x7e5015e7, 0xa9c37b12, 0x72e8abe3, ++ 0xfdf383bc, 0xa65f7cdf, 0xc7df3054, 0x58f40b39, 0x014c7cd6, 0xcedbb83b, ++ 0xe0edebe6, 0xe78ef57e, 0x5d838c44, 0xe50074d3, 0x945e59b8, 0x511c3bc3, ++ 0x9f35fbe6, 0xdb0b796f, 0x725e3a27, 0x9fb49c85, 0x90bbfd8e, 0x8f1bcb9e, ++ 0x1bee1c61, 0xda565f9b, 0xb0117175, 0xf374844f, 0xdf6178ef, 0xfcdb9418, ++ 0x38f30fbd, 0xabf73b4e, 0x271f46b5, 0x30de78d0, 0x49b0494e, 0x3d2f38f1, ++ 0x77c919de, 0xa677f43b, 0x6783e98d, 0xd1e9c49a, 0xc1758bee, 0x5ce789be, ++ 0xfba52cd5, 0xe26bbe25, 0x8898ef62, 0x2fd418ee, 0x8fb2ba97, 0xaa4026c4, ++ 0xd5505c60, 0xf4471e0a, 0xe00a6f53, 0x2375cabb, 0x06aef981, 0x3cfceaf8, ++ 0x404fc7b2, 0x7253952f, 0x60afc133, 0x824a3796, 0xf8748485, 0x9e9aea5f, ++ 0x4779e2ac, 0xf3e02078, 0x1949fa68, 0xc98bfdfa, 0x8917f54f, 0xf3a649ac, ++ 0xf0504bfb, 0x92fda0ae, 0x941a3eaf, 0xbfddeaeb, 0x2fdff796, 0xe54afc1a, ++ 0xb051c8d6, 0x76abc84b, 0xf7106f8c, 0x88fdf1da, 0x5c7653c0, 0x5fed81ef, ++ 0xf5fa833c, 0x9d84adaf, 0x85eb50fb, 0x0f02abca, 0xf6e4e3eb, 0x2ffa9e2f, ++ 0x31a19fd0, 0x29e0bf1d, 0x86ec1f5a, 0x39da0746, 0x8ec52f5d, 0xc148bf01, ++ 0x04cdf7ab, 0x60e05679, 0x62f058f4, 0xf68aa872, 0xe5912277, 0x841d6c4f, ++ 0xbc9415ef, 0xc4f8c2e4, 0x9677db03, 0xf9d4bec3, 0xbec083a2, 0xd72af9d4, ++ 0xefe79ff3, 0xaacad51f, 0x88b94e3e, 0x9efeaa48, 0x59e40948, 0xc137de39, ++ 0x23e7165f, 0xc4b557f0, 0xaa12fde2, 0x39fa1aff, 0xf5ee4727, 0xfb071d22, ++ 0xe1357bb3, 0xcc0f20fe, 0xdbf2b4f5, 0x06ce4cec, 0xb39db4ac, 0x89407ea7, ++ 0x757cb3e4, 0xda4f267f, 0x3b7cfeb0, 0xf2b573b3, 0xfab2fdde, 0xeedfad7e, ++ 0x72fb587e, 0x9989befe, 0xbf78cb7e, 0x7aff9b25, 0x3bf7b465, 0xbf1fcca2, ++ 0x412044ff, 0xdb29e80b, 0x12aef8ec, 0xb887cfdc, 0x3b0a1df8, 0x87752ad7, ++ 0xdd94fdf1, 0xc6971e5c, 0x973df184, 0x501e7cfe, 0xd6c4f21f, 0xcbbe02fe, ++ 0xe04ed3b5, 0x57b29f7d, 0x77c03e5d, 0x4e2f8ed9, 0xe2132afc, 0x7f181cdf, ++ 0xbfeaf65d, 0x59941d22, 0x1f8173c3, 0x64acdb22, 0xb6f9f023, 0x5f818343, ++ 0xe0f0e43b, 0xaf396ff8, 0x1ab26b2b, 0x75f395ef, 0xbdaca99c, 0x6b51ee16, ++ 0xfb8b35f7, 0xd86f3390, 0x9fd6bdd9, 0x76d57ddb, 0x3be377e4, 0x672a6741, ++ 0x7dfdc067, 0x2db17ead, 0xb06c5cba, 0x1c9f7fcb, 0xf7baf677, 0x39f300d8, ++ 0xc092da47, 0xf54e53ef, 0xc5e7906e, 0x8206d39b, 0x5dbf609f, 0xc6aedfbb, ++ 0x5fb47ec2, 0x869ed156, 0x9ccfbf54, 0x4866f4aa, 0x337fc0c3, 0xeba24332, ++ 0x9f3faae8, 0xbc409fdf, 0x34767da2, 0xeec3b7b9, 0xb629ba40, 0xeed17d59, ++ 0x72e01e4d, 0xfd181379, 0xc078d8e3, 0xfbb8da1f, 0xe1ca10e5, 0xd62a3149, ++ 0x1176a62b, 0x3cd92f7c, 0xaef0c327, 0xf58d5487, 0x3c229f28, 0x928d488b, ++ 0xdadf93a9, 0x32cb4578, 0xf80ca433, 0x3767fd2e, 0x783d8abd, 0xd404c126, ++ 0x630e250b, 0xb86a9352, 0xb9c92087, 0x429f8036, 0x08923d72, 0xfc8d52a4, ++ 0x309a431e, 0x8b755275, 0x41557fbd, 0xe29e4e40, 0xefe0f6e7, 0x5e07b482, ++ 0x07ee51cb, 0x3c321107, 0x5019de0d, 0xf83a3d63, 0xecddd9b5, 0x82a93a9d, ++ 0xc3317930, 0x1088fa03, 0x286f93f4, 0x4e55553d, 0xa47a00cf, 0x6fdc1f3f, ++ 0xce83d343, 0xe379edcf, 0x2883d04b, 0xe277b29d, 0x5542407e, 0x7610c414, ++ 0xc9d57e8a, 0xb66fbd84, 0xdbd108ee, 0x3c719f1b, 0x943ee090, 0xf3d24e63, ++ 0x883cd08b, 0x55b79055, 0xc3675fb1, 0x43d3a239, 0x3a17a0c2, 0xa0ec249c, ++ 0x749473a9, 0xeeffcf46, 0xd1d79a4c, 0xb1a267a9, 0x5417ccdc, 0x6dc699ae, ++ 0x7ed1f842, 0xfbf5353f, 0x4fdfa9a9, 0x0d5fadbf, 0x46db014e, 0xb07fbc2f, ++ 0xc39732ba, 0xe3678d8d, 0x19f0a370, 0x11b3ef09, 0x9f978c4b, 0x635c2387, ++ 0x50ac6cf8, 0x3b35e29f, 0xf4e10d26, 0x11bdd8b3, 0x0925b788, 0xdeec04b5, ++ 0xa7db0255, 0xa9d72fe9, 0x363c476b, 0xf807c3e4, 0x4c31d938, 0xe2f76a8e, ++ 0xa3b7d77b, 0xbeabd5fe, 0x31faafbd, 0xfabbebd1, 0xfa238f9a, 0xe8fae27c, ++ 0xb511dabf, 0x972aefff, 0xef7d5fca, 0xdb6e7077, 0x143c9f2d, 0x333d46f4, ++ 0xccf4063b, 0xb75f13b8, 0x67a617e3, 0xf11a06da, 0x4df4031d, 0x98662de9, ++ 0x4e99bbf1, 0x3cafa2fa, 0x779a0ebe, 0xdc3852a6, 0xda9fc7c1, 0xefbdcec0, ++ 0x74fcca5a, 0x41f43cd4, 0xfd793bfd, 0xe8056c3b, 0xdfc6386f, 0x96abba81, ++ 0xdd7791e9, 0x74f9e22f, 0xe08e77af, 0xeedf941f, 0xc284265e, 0x6dded169, ++ 0x0f700d22, 0xdf1f1e6b, 0x9f920efc, 0xc4eb39a8, 0x3120ef68, 0x6feed4ba, ++ 0x583fdf99, 0xfbf97248, 0x7befc656, 0xf96e9eec, 0x67aa3d59, 0x4a3e0b1f, ++ 0x4ff41ee9, 0x2e70f74a, 0x3092d70f, 0xb0adc42e, 0x41b690b8, 0xc9a69e78, ++ 0xd5230bbf, 0x89afd858, 0xeefb306f, 0x8c97df61, 0x74e39357, 0x18ba5df2, ++ 0xa6077863, 0x80a6f64a, 0x5e2f937c, 0x2a6a544d, 0x5248d42b, 0x6f54e575, ++ 0xf087e645, 0x2953944d, 0xa2e40852, 0x0525c9e4, 0x8ccaf7a0, 0x4afab59e, ++ 0x7addd5c2, 0xfff4dbe6, 0xa444988a, 0xd58b25cb, 0x21e71864, 0xf80aee47, ++ 0xbdb3ba24, 0x7a6f677e, 0xeb656e08, 0xa77582ae, 0x954f5ef5, 0xbea2f5e2, ++ 0xddfba13d, 0x4fcc1b1c, 0xa9efaab4, 0x977fbf30, 0x7a5df809, 0x2a7bc7c3, ++ 0x842fcb44, 0x887c6006, 0x04633b18, 0x03bdaf8c, 0x0532aeb9, 0xf15767cf, ++ 0x555721f7, 0x83fcc48e, 0x35cefdfc, 0x1aa62a95, 0x6ade6cfc, 0x36d0b77c, ++ 0xf36ff58c, 0x5824fc70, 0xa8fc7c38, 0x2a52d95f, 0xeed0dcf0, 0x7bc308a9, ++ 0xdd206461, 0x9eda6057, 0xe29f846a, 0xa4b7e821, 0x856f31f5, 0xdae54d3c, ++ 0xc90f8851, 0x400a4153, 0x9ff872df, 0xabb43e07, 0x21ef0dfd, 0x7c86535a, ++ 0xdd87fbeb, 0xc981b4f4, 0x4f4e04d1, 0x2824f866, 0x8d507dec, 0xc3d2fa8e, ++ 0x6f5c78aa, 0xadff7f15, 0xa221de0a, 0xd2ac7970, 0x7f156987, 0xc28aa88f, ++ 0x98bde58f, 0xb33b7226, 0xcb1b32aa, 0x2efbe71f, 0x8d3007dd, 0x95f93077, ++ 0x27d8a960, 0x09e29c03, 0x04268ff3, 0xc22cc0c9, 0x97e14842, 0xe42a2412, ++ 0xd54673b5, 0x47a21f48, 0xa763bd32, 0xaa780e3e, 0xc05b2439, 0xbb2e2ecf, ++ 0x54bf70d1, 0x038bed9c, 0xf4e89bbf, 0xfe7fb00b, 0xe74cf00c, 0x279d28f7, ++ 0xe9cadbbe, 0x83a73563, 0x1e3e9cb5, 0xe9a17a00, 0x1e4e9c43, 0x7c84eba1, ++ 0x43dd9795, 0xc59d3f58, 0x5ba425cb, 0x616e3bf8, 0x8b478fa2, 0x851136f3, ++ 0x687513ae, 0xa77c5315, 0x22b11c8f, 0x114638fd, 0x47e5089f, 0x3bd88796, ++ 0xb0a9b99a, 0xef69c6ef, 0xe3544e66, 0xdac5e0e6, 0xb3dfc4b0, 0xd2dd9913, ++ 0xca7df516, 0x1b7eef2a, 0xcd7dffd8, 0xa5f5e1c7, 0x39e3a6ad, 0xafa85d6a, ++ 0xcee7f3f7, 0xcef34459, 0x13bfaa5a, 0xea746728, 0xd02ef3a4, 0x0fa387d1, ++ 0xe39d41ff, 0xcf81af86, 0x8b0d81bf, 0xb5e7f5e2, 0x5f00ed43, 0xfc156b0a, ++ 0xb9c98f24, 0x1e0f20a9, 0xefee8b8b, 0xf4c31d39, 0xd5e6776c, 0x91aefa06, ++ 0x33ced87d, 0x0f81ac71, 0x8a1cb86a, 0xf0c13a9f, 0xff3b935d, 0xc87bfbc1, ++ 0xd0778fe1, 0x9c5d24f9, 0x709c7c8a, 0x54397473, 0x78412b25, 0x346aa05f, ++ 0x3cc17b93, 0xbd67e985, 0x7f410ae4, 0x88ff05fb, 0xd167e08d, 0x61256be8, ++ 0x98482c72, 0xebada2de, 0x28ef4097, 0xf7483c6f, 0x680f80ab, 0x20a61c5e, ++ 0x65dd24dd, 0x0d773b41, 0x3907b3e7, 0x7ce7ad7f, 0xd5f030f5, 0xd6c77808, ++ 0x39cfe98b, 0xff00d53f, 0x48e7d4d1, 0xfe0c7e63, 0x2fa6913e, 0xc58db4af, ++ 0x9caae8f7, 0xd24b9416, 0x1390d6fb, 0xe37dcff4, 0x105fe03d, 0xbf1e995d, ++ 0x6d33ca0b, 0x8867383e, 0xbd00f4cb, 0x785aee7c, 0x51c5b7c5, 0x5df111d2, ++ 0x7e664954, 0x2e424f2f, 0x9e1470f9, 0x68fde082, 0x013373d9, 0x09e3e83f, ++ 0xf3807615, 0x87660e35, 0x2165e6d5, 0xa63e29dc, 0x31e77439, 0xec6fb3c9, ++ 0xba0c4f7e, 0x7b8fbc7f, 0x5c1cb3d6, 0x24181e2f, 0xa1f274c3, 0x4757bf96, ++ 0xa91920d4, 0x872b1393, 0x1ff010e7, 0x7d0f96f5, 0x4c4dcbc8, 0x7c09565e, ++ 0x5de1321f, 0x7934f7db, 0xfbde0129, 0xeae79ef5, 0xee1ba62b, 0xde5cc987, ++ 0x3b15eb9b, 0x86b63d98, 0xa17e2378, 0x53853977, 0x2f6743b1, 0x76370929, ++ 0x8c3fc3db, 0x5cb30eb2, 0x25fb053c, 0x8fc91ac8, 0x542c9aef, 0x83c7c7d4, ++ 0x8b2df9bc, 0x9f4be9af, 0xb82bc6d0, 0x417a8858, 0xdc6cc5fe, 0xa76b0a97, ++ 0xf010ff23, 0xb0ecebf6, 0x713f7593, 0xd64f5e03, 0x3ad7f3f2, 0x2f710439, ++ 0xf7de36fb, 0xcf0a1cf0, 0x78894f85, 0x00f70afe, 0x04fc5d44, 0x0f5154c9, ++ 0x3b75ded4, 0xadc7ba19, 0xffcf273f, 0xfa07dd85, 0x98745f65, 0x3fdd175f, ++ 0x04ff0550, 0x477896bd, 0xf54ade82, 0xf4184887, 0xf1db9f8b, 0x1f2d0bbd, ++ 0xfa88e8dc, 0x63a9558e, 0xf70023da, 0x71ef8752, 0x1e338948, 0xe6fa03cf, ++ 0x09ee3607, 0x39c2c9f0, 0x8e3c13dc, 0x967dc297, 0xcec73fc1, 0x7f704ee1, ++ 0x51f5b10b, 0xd5cbc31e, 0x2cddca3e, 0xa278865e, 0x7ecdff97, 0xecbd518a, ++ 0xa7c05d80, 0xd767b565, 0x8c5f8fbc, 0xdcd3e6fe, 0xd1b85d8e, 0x45195a11, ++ 0xefc858bf, 0xe7e42e39, 0x9d7d1a29, 0x18e3d6ee, 0x9dc3765d, 0x97d219d2, ++ 0x67858e89, 0x7edd2347, 0xff465072, 0x75ecf0a0, 0xf94c9ef8, 0xa5103a45, ++ 0xfbd152cb, 0x9191c408, 0xeba445b7, 0xc38d0e7b, 0xd30eb473, 0xb967963b, ++ 0xf9a5a1be, 0x7a0d8b17, 0x81687e6f, 0xfe417a02, 0x77a472c5, 0x7b84d788, ++ 0x7f9c84f5, 0xe9c4927d, 0x3fb40276, 0xed256d37, 0xf19da0b7, 0x2c189907, ++ 0xbd673f47, 0x30fe0bc3, 0x759c7d33, 0x47bf06a8, 0xf6297b41, 0x92419c4f, ++ 0x58378ba0, 0x2f6bdfc8, 0x6ddec8b8, 0x49209e24, 0xf2e17e01, 0x8dee87ac, ++ 0x5876f6ef, 0xd7983d18, 0xe75f15fb, 0x9debdd57, 0x7f7ac7d0, 0xf5cbd6c0, ++ 0x6cf6828c, 0x357ebad3, 0x7abada3e, 0xdb1133d6, 0x9677f297, 0xef0c2d4b, ++ 0x2770f95a, 0x4f4b5f1b, 0x1b86ce54, 0xbf88a442, 0xba1f9997, 0xa1f78147, ++ 0xe2e2ebf2, 0x0b3add05, 0xc434ef6a, 0xe6d7e4c5, 0x0560fbe1, 0x7cca7975, ++ 0x8dd4fedd, 0x0df3a0a7, 0xaf869e3d, 0x9e00e6b7, 0x71b91cea, 0x67cfe04e, ++ 0x857deeca, 0x6f0cbf40, 0x98e094a7, 0xf75b940a, 0xa3dda3b8, 0xe134ee19, ++ 0x6de396ad, 0xd28c9058, 0x5f0d31c9, 0x3627f6e6, 0xe70bdc95, 0xb03627eb, ++ 0x96fa50d7, 0x69f1d163, 0xc38fa386, 0xc70dd7cf, 0x75b71891, 0xcf7e3869, ++ 0x27d59f10, 0x35fe391c, 0xa9df6938, 0x89de375e, 0x9ef612e3, 0x65f66d60, ++ 0x7c67afc1, 0x14a71f46, 0x200d88df, 0x061ca91f, 0xccfd3d3e, 0xdbe8c6cf, ++ 0x4d263a95, 0xf5487183, 0xbdef9de5, 0x84cff0e2, 0xdec9c1fa, 0x73ca2a83, ++ 0xd7455bd1, 0x44fb145d, 0x6b571867, 0x57571fdc, 0xbf81d7aa, 0xd729da89, ++ 0xe657df81, 0x7d011afa, 0x4fbd8d2d, 0xacdded1f, 0x77a64ec5, 0x40acaeac, ++ 0x05b1317f, 0x92fc0789, 0x3925f184, 0x3bfe8195, 0x33d469c9, 0x01efd914, ++ 0xefc2a17f, 0x7f92cb61, 0xd8265a5d, 0x41e909d7, 0x4e037c1d, 0x4fad1fa6, ++ 0x3f01efd9, 0x0ff695b0, 0x40db037e, 0xdfc182e9, 0xb0b49af0, 0xed3ba51f, ++ 0xd218d459, 0xf40413e4, 0xf9305cbf, 0xe6182e5f, 0x6de74091, 0x708d27d8, ++ 0x3c6e6c91, 0xf70891b7, 0xd07871bb, 0xd787282f, 0xd2bc3972, 0x6dfdc6e1, ++ 0xb41615cd, 0x3fb86a4f, 0xc7e097ef, 0xe848b843, 0x21b0859f, 0xb2c4afa8, ++ 0xefc1d875, 0x10dd822b, 0x5e0bbcc6, 0x09f111d2, 0x71f20132, 0xdf201544, ++ 0x80d7848f, 0xa935dc1e, 0xeef85efd, 0x001ffbb5, 0xb53cfdbe, 0x7e00a8ed, ++ 0x95ff5cdc, 0x315ae700, 0xfad2ae98, 0xe92316bf, 0x2d306f50, 0xd2cf123a, ++ 0xdb8e202b, 0x621f3baf, 0xe4f694ef, 0x2bf9dec5, 0xf3a64996, 0xd4aeaf92, ++ 0xeedcff97, 0x547985ab, 0x3dbbd9d9, 0x28091f09, 0xfdbaaae7, 0xef78b9f4, ++ 0x8b2765e8, 0x00ba41db, 0xf4c83aba, 0x1a920b80, 0xbffe8f1b, 0x19af1991, ++ 0xe435e1e6, 0x35576e25, 0x74953a50, 0x24c312e7, 0x68e8059f, 0xaefd3578, ++ 0xfd14679f, 0xcf89de2d, 0x0f3d46f4, 0xc747e6d1, 0x2f157a45, 0xc67db0e6, ++ 0x05bb0f44, 0x9160ff36, 0x243fd995, 0xe75e0228, 0xad278468, 0xa238f962, ++ 0x78eed0fd, 0x93d3f35f, 0x61ef2c55, 0x767cc0b9, 0xcf9e682e, 0x6db5d69c, ++ 0xd39f1fe0, 0xce00ba9a, 0x5e14e689, 0xbba431f9, 0x077ec8e5, 0xb09f89c8, ++ 0x78ef4677, 0xb61935f7, 0x6cefedd0, 0x6fdcfbc4, 0x4b9c7e73, 0xdfe03222, ++ 0xf30a3c4f, 0x7bd887f3, 0xf3cbc41e, 0xcfd8324d, 0xb7438577, 0xeee688fd, ++ 0x23f42d7e, 0x1ee65f50, 0x680ebc8c, 0x727937f3, 0xb5ae97d0, 0xc1bef16b, ++ 0x375dacf2, 0xeffcec1c, 0x5c364890, 0x6dbacf57, 0x9d6d0708, 0xa3e226b4, ++ 0xddfc4e1b, 0xdd2e0d24, 0x79dc76eb, 0xfb2ff823, 0x6c736f92, 0x71663fa3, ++ 0x665e6cc5, 0x450a7d38, 0xc1fe3e54, 0xf20b3be9, 0xafa775ef, 0x5b52d203, ++ 0x0434b064, 0xf90226f9, 0x457fd172, 0xb9c38512, 0x132bfe41, 0xfd6d1e01, ++ 0x3d8f4b2e, 0xe0f2676a, 0x3f669a68, 0x6be8f7f0, 0x8f365e99, 0xed9adbd3, ++ 0x3efddf27, 0x621d13c4, 0x899540ef, 0xa1f74dea, 0xd1244e3f, 0x3d2d6af4, ++ 0x9b5fedca, 0x6ddfc2cb, 0x279ceb65, 0x6bcf7831, 0xa4bde076, 0xc344cb79, ++ 0x96f3d33b, 0x223f78b1, 0xd5b98db5, 0xe2aef7a0, 0x1fbbdd74, 0xfdcdcfb0, ++ 0x1936582c, 0x8a1db6ed, 0xebda1267, 0x5b3a314f, 0x4227d530, 0x7584f49c, ++ 0xc643fa02, 0xda5b571f, 0x28417e69, 0xbaec0bce, 0x0c92f960, 0xbca1ef78, ++ 0x92ebf98d, 0x3fe9c5c5, 0xfb63e9a5, 0xf90bfed9, 0xa72700c5, 0xfcea754f, ++ 0x45721ddb, 0xf9e807ba, 0xe40fa76e, 0xbeadde41, 0x9a9f01f7, 0x11e9aebd, ++ 0x0cbee93b, 0x77796f71, 0x1f40d9a9, 0x1f764d79, 0xc52236a6, 0x2796b950, ++ 0xc9a41b11, 0x90ec910a, 0xa41b10c6, 0x7bd92b59, 0xb3b5f9de, 0x67773f70, ++ 0xaef02ae7, 0xb3eb5e6f, 0x02fb419f, 0xd04fbc29, 0xeb5e53d1, 0xfef12fa1, ++ 0xe3172f90, 0x59b7bf1a, 0xa351d831, 0x6bf98c9b, 0xf4f98c5a, 0x719f31b0, ++ 0x0f5f98d0, 0x6f4e8eea, 0x9d87bfda, 0x659c97e7, 0xa15f21f7, 0x1e019030, ++ 0x1f28ad5b, 0x66b494a7, 0xd9f0f9c1, 0x28165c17, 0x6657fddf, 0xd8b64647, ++ 0x7db77df1, 0x31218c7f, 0xa2f8a710, 0x9f94237d, 0x02ca698d, 0x8fad193f, ++ 0x77741e71, 0xd076011d, 0x7a35ab8e, 0xc83c610d, 0x3c59af8e, 0x358b647f, ++ 0x67cee704, 0x02fb3d77, 0x2dd9e7d0, 0x7a3f5003, 0xa05a0845, 0x0c03e0df, ++ 0xdc6213ff, 0xb2553906, 0xce5f68d9, 0xabbd3171, 0x0f32b4eb, 0xd6571bfc, ++ 0x557dd71a, 0x73cf98c8, 0x9f353931, 0xc1a7bee8, 0x26baba79, 0xa7d9f605, ++ 0x927bd449, 0x9e2f9c85, 0xe8d14e7b, 0xb0efe456, 0xe7a93511, 0x9eeed77e, ++ 0x03a5ae73, 0x00951d28, 0x7cf4862c, 0xab8d312f, 0x62e19ff5, 0x3f0240fb, ++ 0x25bc885f, 0x54ce7c22, 0xc3ce1a16, 0x4ad8f5bb, 0x61d4ca6f, 0x76b13d3a, ++ 0xea1e525f, 0xe692fb8f, 0x2db7edeb, 0x84ee9207, 0x12cd9e78, 0xd2ab9dfe, ++ 0x3c3ccf39, 0x8bbe0121, 0x285f304d, 0xa3b21d07, 0xd43775e9, 0x58ea7aa3, ++ 0x414c7c7d, 0xa994b8ed, 0xaefd3e3a, 0x3efdd974, 0x67c187b7, 0x2dee7667, ++ 0x2ef8a23f, 0x50bd13a9, 0xb6e9a4ad, 0x700d197f, 0x3ef193af, 0x1936e96f, ++ 0xd40f8bdf, 0x8afe8b5f, 0x39c3c692, 0x86e12ef8, 0x2bcc2f3c, 0xe2b9224b, ++ 0xdc517458, 0xd6a9e90a, 0x5f9ef8ed, 0x146b9fc9, 0x1af98549, 0x1bd283e9, ++ 0x94d521f2, 0x1e066eb2, 0x38c0adf0, 0x19bbed5c, 0x632145ae, 0x5ebe337b, ++ 0x7f43f4e6, 0x3778f523, 0x2337ebd7, 0xa62f7f88, 0x4f951974, 0xf4a43b3a, ++ 0x01c63578, 0xe741c79a, 0x1dbcee94, 0xf91539f6, 0x7bf7ced1, 0x78b2d822, ++ 0x9650ec9c, 0x810577c7, 0x57fd60be, 0xdc2aa993, 0x4c99bce3, 0x2115f487, ++ 0x3228b0fc, 0xc7ff46be, 0x75f20756, 0x99fda787, 0x343d015f, 0x97f3c68e, ++ 0x6b5efcfe, 0xf7c61a87, 0x33bfb518, 0xf961e1d1, 0xc63b56e2, 0xa73d9c91, ++ 0x015bdca0, 0xff506bf1, 0x42c5bb05, 0xdbb3aef5, 0x78864dfa, 0xf6268ec8, ++ 0xa699ef4e, 0x6f95937e, 0xfccd47d9, 0xc76fedab, 0x1f749fe0, 0xfdf2e23c, ++ 0x8df60b87, 0x345e2c55, 0x7a455fb9, 0x693c1445, 0x8a9412ed, 0x2233b074, ++ 0x1bbd3b77, 0x26945e99, 0x05381fa1, 0xee3cfeed, 0x362cf8e7, 0x75fa1db7, ++ 0xfa3ebad1, 0x7141fc7f, 0x47d7d023, 0xcf5ef7a2, 0xc1739ed0, 0xbc7e9985, ++ 0x107f8b37, 0x40bf8e82, 0xea896122, 0x7f600bb1, 0x94798318, 0x04ea0b83, ++ 0xb85a9f8c, 0x781eb8de, 0xafbf5637, 0x265fc215, 0x30f10a1b, 0xd616984d, ++ 0x608bcb19, 0x9c63701f, 0x1409c60b, 0x09cb1837, 0xa77fa309, 0x6b1bf1b4, ++ 0x467db834, 0xfef9f5b4, 0x1f9065d3, 0x8f8fca32, 0x5f5c5cc5, 0x34a55809, ++ 0xb3ef83bd, 0x29d9e581, 0xb5da690b, 0xc2ca426c, 0xcbdfb80c, 0x156423f6, ++ 0xfef647e4, 0x1254c954, 0x03dec41e, 0x95cfb021, 0xd1e10ab4, 0xa091b790, ++ 0x0efb2c7b, 0xbac022ef, 0xb463f7f5, 0xf57ac375, 0x0c3bc9df, 0x2afddaaf, ++ 0xbcbeaf58, 0xb4a1c394, 0x33f06ad1, 0x8214684c, 0xdee06bae, 0x2bb63b46, ++ 0x6ac6fe6f, 0xa3ef97e8, 0x7625ff74, 0x8509af8a, 0xe62c22f5, 0x1c796eb1, ++ 0xfc5a2aba, 0xbf0e51fd, 0x4fcb6ec7, 0x047d7e05, 0x1cfec8f4, 0x3c84d9c0, ++ 0x02734208, 0x8e8d8443, 0x9dd19317, 0x95acf2c7, 0x773dff2c, 0x03b5f5e2, ++ 0xfb25dda9, 0x81645cf1, 0xdc06fb98, 0xf1ef5aeb, 0xe3a6e35f, 0x06f8b02c, ++ 0xbeb7c84b, 0x5bafe811, 0xf8f0e0c6, 0x2aab8ad8, 0x1ab7d8a2, 0x34297f7e, ++ 0x706579e1, 0x5d0fdb17, 0xef591199, 0xcdc1bd8f, 0xfeec51e4, 0x10cfbc76, ++ 0x3de02ed9, 0x31c20dca, 0xe1b867bc, 0xfd809506, 0x04f1429d, 0x408372f2, ++ 0x5ffbc156, 0x16b3cd99, 0xce780ebf, 0x39c2f18c, 0x24f35968, 0xeb89ccb1, ++ 0xa3937a67, 0x27ce1ea2, 0x1c8de792, 0xd74e740b, 0xfa66ef3d, 0x8ab726fd, ++ 0x193aa5e3, 0x065653de, 0x828c96d3, 0xbf1773f1, 0x3a387c0e, 0x26dfef06, ++ 0xe2b95853, 0xfa075d31, 0xdf490a50, 0x653d7207, 0x7c163a86, 0xd9b98fc1, ++ 0x71168938, 0xd7d02cde, 0xfc7cb2c6, 0x236f82fd, 0x38a3e112, 0x4c95b24e, ++ 0x77c2f987, 0xe06cefd0, 0xf0ea700f, 0x1d22a53d, 0xca1e4fc6, 0x8c2504d2, ++ 0x6a6f5171, 0xf1656f78, 0x043d4b49, 0x2fd2f4e5, 0x3d832527, 0x350766f6, ++ 0x7afca98c, 0x2f66a073, 0x4fa89d86, 0xeac91b0f, 0x697a7d73, 0x4ffb8b3a, ++ 0x31e9ac18, 0xec975eac, 0xb900cd8b, 0xd5e9987a, 0xe87d3a9f, 0x8956bd47, ++ 0x9cbc771e, 0x317029e3, 0xe7748486, 0x9fd98113, 0xb817bea3, 0xdd2126e8, ++ 0xd9ef013e, 0x4b57e3e9, 0xbbe3f70b, 0x0da465e2, 0x9acba0e3, 0xd7b6f18c, ++ 0x571f44c6, 0x45c0f3a3, 0x43f6090b, 0x76081e32, 0x64429bd4, 0xbc04a2cd, ++ 0xd9fe880f, 0x048545c0, 0x2e07e375, 0xddf31bc6, 0x7ec24cf3, 0x6311ea7a, ++ 0xb02f96bd, 0x776ec91e, 0x9e9d38c3, 0x0247dc76, 0xa76c2517, 0x215d37ed, ++ 0xfca6504b, 0xf2b2a9dc, 0xa4be7e2e, 0xebfad7d5, 0xfbf0ad9c, 0xe19dec3e, ++ 0x782a4a8e, 0x689e5c28, 0xd27e8f3d, 0x087dd6d2, 0x7a1e8d17, 0x4120e3e0, ++ 0xaa927c1d, 0xca16c2da, 0xfc3e2fdb, 0xaea3b5e3, 0xcfd8a8a2, 0x7b3838f9, ++ 0x40d28fad, 0xaea3bc12, 0x66476be3, 0x98a39f37, 0x7222cc79, 0xb59ce67f, ++ 0xf2ea0753, 0xfb777ebc, 0x43d71de0, 0xd628e679, 0x77c3d77e, 0x3a2566fe, ++ 0x5c79aa1f, 0xae706473, 0x99b7974b, 0x1f9a4ef2, 0x4c7bcbad, 0xf2a609e5, ++ 0x207e5314, 0x0ae1dfab, 0x84bd160f, 0xbcf0f6bc, 0xe5efe1eb, 0xe786a475, ++ 0xeb05cbc2, 0xc3d7f9c5, 0xcb2cc7df, 0xb1ef7f64, 0x0af055bc, 0xde59f93a, ++ 0xaedcbe7d, 0x7005182c, 0xe4037b68, 0xe08b6940, 0xd9dcfd01, 0x798c2db4, ++ 0xdaeaa768, 0xb03b3135, 0xb618e9b4, 0x91ffb3eb, 0x07e3e416, 0xf5887e47, ++ 0x422e752e, 0x5eff1866, 0x24e75f4c, 0x9fff04c7, 0xef3d89dc, 0x7b6c771b, ++ 0xf5efe7af, 0xa99defd1, 0x472803be, 0x035ff74d, 0x0f671f30, 0x7c70689f, ++ 0x7c05e470, 0xd183f1ef, 0x3a82efad, 0x7e7a58e0, 0x7f97e805, 0x0e393b2e, ++ 0x33782df4, 0x5f8df612, 0x60aba10a, 0xf8827a3f, 0xef7182af, 0x0fbe1b2e, ++ 0x2a3f209e, 0xef093fb7, 0xb91e3b01, 0xce897aef, 0x7daba8ef, 0x2449fc10, ++ 0x961aec57, 0x97c76c4f, 0xd7638a24, 0xf6a0fcb2, 0x8f9a1641, 0xf88edd8b, ++ 0xfdbc3a3a, 0x8f8fc849, 0x47e5927d, 0x3d120fb7, 0x753c4a60, 0x7f5a54fd, ++ 0xbf3a2793, 0x3d99625b, 0x31cfcda4, 0xd857f7cc, 0xdb29487f, 0xa57ae06f, ++ 0xb9d3ca8d, 0x6eb667c5, 0xfb98f0a2, 0x73940e6f, 0xb96e3a9b, 0xc1c9e991, ++ 0x4a9f885c, 0xfdc6f0e6, 0x84bae510, 0xec2a44fa, 0xf83df181, 0x536e0d74, ++ 0xbab8bf71, 0x0de81b62, 0xe14773c9, 0xe5d8717e, 0xec4d892b, 0x9a44a549, ++ 0xac5839c2, 0xd16dc987, 0xc9f5e782, 0x8f50b9f7, 0x0fbf847a, 0xe90ef94e, ++ 0x92f1c9c3, 0x66e4cb1c, 0xbfb32c72, 0x61a6ba2e, 0x7c147f3f, 0xa4226c1b, ++ 0xbf476824, 0x2bea0c58, 0xb953d677, 0x0d7ae542, 0xa3cd779f, 0xe1bfa157, ++ 0x8ef7f04e, 0xd4beef82, 0xfa3d51f8, 0xcd3a4d7f, 0xb3ec7b3b, 0x54be599a, ++ 0x4d6b79fd, 0xe4d72b3d, 0x6b1a4d56, 0xc957edaf, 0xe49c6c55, 0x08daae47, ++ 0x044870eb, 0xcd1756e3, 0x0571b11e, 0xe337ffee, 0x97cf897c, 0xf1f4f60a, ++ 0xd01621a2, 0x8cfc354b, 0x874be619, 0x39f83bf2, 0x6ea7868d, 0xd996397d, ++ 0xaa440b85, 0xe4be803f, 0x547f63f1, 0x0ec3189f, 0x513e99db, 0xf18cd742, ++ 0x44be1cd0, 0xdf071f6a, 0xe9c10fff, 0x7f4740c7, 0xd6fe9c37, 0x1c935873, ++ 0x18a6f2a2, 0xecb653e6, 0x0fdef1a4, 0x852ffb87, 0xa99c9cb0, 0x7e858f7b, ++ 0xd333fb07, 0xab1c5fed, 0xbdccc3f3, 0x4ef50caf, 0x7f8e3d6d, 0xfe1d39dd, ++ 0x3f99a6a6, 0xd1e17acd, 0xa3d6da3f, 0x4269503f, 0x46f47c79, 0x8e4ff782, ++ 0x34b0f7f2, 0xdfeb36bd, 0xfb04de4a, 0x22b1cfed, 0xc101e7c2, 0x78f00a97, ++ 0xdc03d280, 0x62ce0f5f, 0x7eda34f1, 0xda17135c, 0x70f40f90, 0x973c28db, ++ 0xae2c22ef, 0x81ccb826, 0xdae26af5, 0x19af3ed1, 0x4ce87aaf, 0x8f103e80, ++ 0xfa0a3991, 0x19d26a85, 0x5d14d59d, 0x2849f78d, 0xfdb104bd, 0x3577461c, ++ 0x17da08b3, 0x90527335, 0x6424ecde, 0x45f4f987, 0xcc55493f, 0xdf24468f, ++ 0x7ab9fd18, 0x8e07970b, 0xefedf6cc, 0xdebb1e81, 0xa02c7a8e, 0xaa4bcf12, ++ 0x94be7193, 0x2780420e, 0xbf6dd9a2, 0x883d0d48, 0xfd17a276, 0xbe5d6b01, ++ 0x4fff9c3c, 0xbfcc2a1d, 0xd9d64ece, 0x43f982c6, 0xe49ca156, 0x8fd521f3, ++ 0xe6857c63, 0xe14bfd67, 0x1fe81705, 0xfb76c62f, 0x9f607c03, 0x7cac27cf, ++ 0x638efdfe, 0xbfcd4f60, 0x4bafbd9f, 0x19f34dd6, 0x5ce83fcf, 0xce4fc093, ++ 0x1711b57f, 0xda1f8dd0, 0xffffa1b9, 0x23fdc174, 0x3eecfdff, 0xf6d2092f, ++ 0xefda7b23, 0x573efce7, 0x9527f364, 0xfbda350e, 0x7ef9fba8, 0xd3efe740, ++ 0x638da78f, 0x91da97ee, 0x145e0007, 0x67b861ee, 0xfb29f915, 0xf9e60e7b, ++ 0x87912826, 0x6e7cb4ec, 0x7f0718a5, 0xccbfde07, 0xe6d5eb85, 0x72392f3b, ++ 0x4c29fa1d, 0x94709ffd, 0x5c3f8167, 0xfdc87fb3, 0xe10ffb3a, 0x45e4f4a2, ++ 0x82208778, 0xefaf5476, 0xdb366edc, 0x6d7c849d, 0xbeebd7d5, 0xa60aa0b7, ++ 0x52ba73f9, 0xe6f00905, 0x8af9e7e7, 0xf20b9912, 0x0d6f3cca, 0x9cb9e79e, ++ 0x0cc2e8d1, 0xc07df3ef, 0x1f69413b, 0x97fafd04, 0xe64e1159, 0xf4fdb5fe, ++ 0x9fe53b71, 0x129f8878, 0x976b5e90, 0xec7f703b, 0xc19e47b2, 0xaf7b9d7b, ++ 0x16777c47, 0xdf70a8c5, 0xb6aa09e0, 0x5ec879e3, 0x35d21e76, 0xf0047da2, ++ 0xb35d2753, 0xf3a7e28f, 0x283eb12d, 0xfaa09368, 0x46e25bd1, 0x5dceffa0, ++ 0xff3f6037, 0x61bcd60d, 0x008000d0, 0x00000000, 0x00088b1f, 0x00000000, ++ 0x7dc5ff00, 0xd554780b, 0x733ef0b5, 0xcc923cce, 0x24c93324, 0x124fbc99, ++ 0x4e220108, 0xa07c0422, 0x35180843, 0xe2d101da, 0xf090e2e3, 0x44c93048, ++ 0xb578bd6d, 0x4844033f, 0x44683110, 0x8a1388a0, 0x06f6ad8a, 0xc134188b, ++ 0xb5b15141, 0xedaf42fd, 0x17e7ed15, 0x4ae3e221, 0x6c520232, 0xad6bfeb5, ++ 0x67324fbd, 0xbd2d2892, 0x3d3ef9bd, 0xd9f7b3ec, 0x5ed6b58f, 0x7fa7bdef, ++ 0x72ca9c65, 0xc633f319, 0x0cf0894c, 0x8b0575fc, 0xa198ec67, 0xa1f2c4c7, ++ 0x9e6669dc, 0xdf7f4642, 0xf0fd7fc2, 0x63094d5f, 0xc0434103, 0xb13c2178, ++ 0x81633262, 0x93e0b8ce, 0xd5f058b9, 0x0d632732, 0x75b2c4b7, 0x920d3c12, ++ 0x0df500c7, 0x570426cb, 0x858dd44b, 0xc75630a5, 0xd67a84bb, 0xe97f4124, ++ 0x28ec6b32, 0x82d1f2c2, 0x9d788b3b, 0xc76eed02, 0xeed4a87f, 0xabf304a0, ++ 0x91efacb3, 0x0ecc7e61, 0x32fd41ff, 0xbf7187ac, 0xa02bbfc5, 0xf9fffadd, ++ 0xb0dfe706, 0x196de607, 0xb3dd779a, 0x632c75fa, 0x9a7aa1a6, 0x64b18077, ++ 0xae60e2c6, 0xce567f38, 0xbe616382, 0xab8e5136, 0x08ca09e8, 0xec65e5a7, ++ 0x7d341258, 0xd7b677b5, 0xac1df58a, 0x4ffe9e0a, 0xf3082798, 0xfdaba4be, ++ 0xef680cb5, 0xc2c9e8a8, 0xdf97fae5, 0x45df5179, 0xb1907fd8, 0xbcf34329, ++ 0xcca36bb8, 0x7d1e34ac, 0xecf15307, 0xf1bb52b6, 0x7c882f73, 0x92efa2ae, ++ 0x386df20d, 0x4abe2f5e, 0xd278e043, 0x53671824, 0x1d619e6d, 0x814e2bcc, ++ 0xc5d73057, 0xac76e3ad, 0x0a7b3824, 0x7b18dae6, 0xe6dd9e34, 0x4bba7825, ++ 0x7adfd0bd, 0x3b6cd97b, 0x28ea97f4, 0xe64f619b, 0xb86d78e3, 0xc5d4587c, ++ 0x7e8bf343, 0xdad1f06a, 0x1637e6a5, 0x6f475a37, 0xb87134e7, 0x0424b785, ++ 0x147ce077, 0x7e4bca89, 0x475f6c63, 0x6e8853f3, 0x373c7cee, 0x61aff388, ++ 0x756f44ad, 0x3262682c, 0x40b0b3b4, 0x12c5d03c, 0xcf009668, 0x4ccd9ba5, ++ 0x6d5fc08d, 0x53ae5f50, 0x78a40742, 0xfa1e97a4, 0x515df6fe, 0x642ce5f5, ++ 0x0b7afa83, 0xb3e1c50b, 0xc0df5f43, 0xbfde82c2, 0x67be4735, 0xb7bd7c6d, ++ 0xca3bbc09, 0xd60fb283, 0xb18625bd, 0xd06c4498, 0xe4b9f84a, 0x67c276be, ++ 0xf7278942, 0xf857587e, 0x077ba32d, 0x0247edd0, 0xbe7c1a5f, 0x06bb284c, ++ 0x1b2b1ee1, 0x95e1fd68, 0xb01dc171, 0xab033efe, 0xe43ffc41, 0x85cdb760, ++ 0xd50aff67, 0x810c6635, 0x41d21269, 0xbdd79c34, 0x74835314, 0xa0ddaf73, ++ 0xddb72ba3, 0x35eff048, 0x4fdc1ab1, 0xbfa0aba5, 0x71fd88a2, 0xdf87d5a3, ++ 0xf44bb2ad, 0x7affe21d, 0x4d5b3fc4, 0xa47b61df, 0xf88bd8b3, 0x05aefb53, ++ 0x6cbd13db, 0xef854fe4, 0xb1b54dfb, 0x21bf88ed, 0xa230347a, 0x09af22c7, ++ 0xe092f4e1, 0x7c692f13, 0xf9ccc9a2, 0xb05f6284, 0x7d2fca1c, 0x075ee452, ++ 0x9e856270, 0x751f4885, 0x48aac59f, 0xfb3e871f, 0x83bf03f9, 0x989f93fa, ++ 0x2fd43354, 0x3c019a42, 0xfe7124bc, 0x9629b812, 0xeaef093d, 0xb8e31b60, ++ 0x05c77b75, 0x5eefd003, 0x7efd5328, 0x17538d1b, 0x18b2dbef, 0x3e7ba9fa, ++ 0xc9940dd9, 0x9f06365e, 0xbbeb0a79, 0x424fdc63, 0x9cb175bf, 0xca5eeb4e, ++ 0x89efefa0, 0xf88d3df1, 0x7f073749, 0x03e44bf1, 0x4fdd98af, 0x0b24e3c2, ++ 0x9ff9c12d, 0xb09188ec, 0x575c51dd, 0x4ea13c02, 0xc17575c2, 0xa5df7c78, ++ 0x8eef862d, 0x75f2a4b5, 0x7b1d3809, 0xf9d12270, 0x2f1f2326, 0xf6a24fb0, ++ 0xd9de8d47, 0xfa3e5069, 0x257bb142, 0x4d780d54, 0xa7d01321, 0xdfdba1ff, ++ 0xab189366, 0x11dba836, 0x1c7f6c4e, 0x87c357cd, 0x4ad2c37f, 0xbb2ff7ac, ++ 0x77e43aef, 0xe45beda3, 0x0f822cdf, 0x3670b3f6, 0x35ad8fee, 0x18211d79, ++ 0xbc6bbfb7, 0x175aa65b, 0xc3e81f20, 0x19f6dbce, 0xddc35c39, 0xe7bfda46, ++ 0x57ae3fda, 0x04f2e529, 0x9f03f1c7, 0x227eda65, 0x96511b3e, 0xfe032a47, ++ 0x97febd60, 0xd15e0952, 0x7cdb97f5, 0x357f9047, 0x0fe7fc3c, 0xc37c1396, ++ 0x6b58e7c4, 0x3eb3ed32, 0xd20167a3, 0x643ca3ad, 0xfba08aaa, 0x409f702f, ++ 0x97336a93, 0x4c858c33, 0x7d745df8, 0xee9e9969, 0xec5867b5, 0xe70f5b17, ++ 0x0debc3d7, 0x6f5d3f62, 0x0974b946, 0x41cb329f, 0xfec560b9, 0x92ffea55, ++ 0x6aa6424f, 0x17dce728, 0x4f112d32, 0xef0027dc, 0xddd60590, 0xfc46c5b7, ++ 0xfd80c100, 0x48c6992c, 0x59912dfe, 0xdf04a593, 0x80bd9dab, 0x382fe397, ++ 0x0d7d7d38, 0x2f780150, 0x999da264, 0x2f805b35, 0x8524d8bd, 0xe16ed02c, ++ 0x988ef366, 0x1ed7dc5c, 0x7cf886d9, 0xb4be225c, 0xc14669b0, 0xdb2f2816, ++ 0x3fe10173, 0xcba71a7e, 0xc9074165, 0xbf044bb9, 0x4d0736ab, 0x5f83ee0a, ++ 0x01f70c48, 0xfd84dff4, 0x6947c1d7, 0x80e1c325, 0x0f475a7c, 0x1e7288c1, ++ 0xf9c1dbf4, 0x3cfe0324, 0x21bcd788, 0x597c8dfe, 0x9bfb3df7, 0x011f4f59, ++ 0x9e10be4d, 0x73a9d160, 0xb3e2182e, 0x3378265f, 0xc6a7c41d, 0x017e22a4, ++ 0xed0e5c9f, 0xf5ae0896, 0x83e491ac, 0xc707d7c6, 0xb8e17215, 0xc7f2e01c, ++ 0xc59e91bc, 0x6f1a5c8e, 0xf920eb19, 0xd189c9a0, 0xf1d8a0e8, 0xe25074dd, ++ 0xeebea950, 0x0e9a1613, 0xc7ddd5e3, 0xf893f542, 0xe48936d3, 0x167b971d, ++ 0x19f0f72e, 0x2ff20e7b, 0xcb45de5a, 0x96b968b7, 0x4bf2e26a, 0x9fa6b3c3, ++ 0x72e4cea4, 0x82fb92fd, 0x9df58332, 0xc9bc79b5, 0x14f48653, 0x8b16bbff, ++ 0xbd96217a, 0x1dda0f2c, 0x2578cdb6, 0x57e3e005, 0x55f70798, 0x1da5c01c, ++ 0xc31e3fde, 0x2fffd802, 0xbbdd3852, 0x8d7e9c4c, 0x5b15978a, 0x213d2f11, ++ 0x9925e203, 0x351e91d9, 0x836e3e78, 0x3bf04aef, 0xbf066f2e, 0xd8a6b0b7, ++ 0x5ecbef88, 0x7abe218a, 0x682d9f66, 0x97c2fd26, 0x52fe80e3, 0xde9337de, ++ 0x8d92ffd9, 0x91bf63e4, 0xf680efcd, 0x892fd44e, 0x3e70d65e, 0x829d7880, ++ 0xc19654d4, 0xaba5f690, 0x6a059033, 0x83bd56fa, 0xf5c34deb, 0xdb9f511b, ++ 0x2ba72373, 0xf1fc8ab3, 0x6ef7a38c, 0x587cc32c, 0x08b7ca00, 0xccf7fb3c, ++ 0xde17be2c, 0x3756bdfb, 0x18afbe87, 0xff2cd5e9, 0xd00b46e8, 0xbef96cd7, ++ 0x8eb03df0, 0x1dab2cfa, 0xce795ce5, 0x1378fe9f, 0x63dd3f94, 0xf3c46664, ++ 0xb3e73393, 0x6ff9d1bc, 0xb478d06d, 0xdcbf6237, 0xae5f4bbe, 0xfd97d0ef, ++ 0x2af2fa9d, 0x7c79cd87, 0xf70ef122, 0x66d740b7, 0xed27e373, 0xcbf35f30, ++ 0x3f479266, 0xe2d6f874, 0x84306a7e, 0x9b3840df, 0xe49f3e73, 0xfae83a43, ++ 0x19a7c242, 0x88a7a768, 0xf5f71fc3, 0x39859899, 0x36e011f6, 0x31663f04, ++ 0xfb419c10, 0x73e24fe6, 0x9c4fb17e, 0x07a7cf26, 0xe64bfd60, 0xd157dac6, ++ 0x94e54f1b, 0x690fd452, 0xf9bfcc8e, 0x49a54faa, 0xf116aed4, 0xb40e7c7f, ++ 0x6cd57983, 0x8eb0f2e6, 0xbee3c4f5, 0xd23d006d, 0x223e2802, 0x537b70f0, ++ 0xff0434b8, 0x18ac4b6c, 0xbe54f38f, 0x1f48bc51, 0x08dfb16b, 0x1d3ff7bd, ++ 0xbedc0e5c, 0xa7dec62b, 0x5743a383, 0xd9a677f6, 0x9ff722fb, 0x532c3fe0, ++ 0x9bed2252, 0x7fdf250f, 0x2deafc22, 0x3019a6bd, 0x9cdf15fe, 0x74bf7e26, ++ 0x05d91579, 0x99b27a43, 0x7bd2d3f8, 0xb5fef47c, 0xa42e572d, 0x51896df5, ++ 0x1fc7ee11, 0x97de8897, 0x16835a66, 0x0e15e7f8, 0x852f3fae, 0x386924ef, ++ 0xf6e1a31c, 0x5d2bb6f1, 0x331f4748, 0x83a05e3e, 0xdb1f1feb, 0xbcf95e01, ++ 0x71f7f60d, 0x12e3e827, 0x4fcaf9c2, 0x7d2e2f91, 0x9ea3765c, 0xee6dbac0, ++ 0xb3cb0cb1, 0x62b62fc6, 0x6692a77f, 0xedb6fb40, 0xbd32ecb3, 0xdfc8bd97, ++ 0xb9ec0f40, 0xdb2bde02, 0x771e92a7, 0x9f3371f0, 0x14f2c3a7, 0x6f8ae3ae, ++ 0x8a57da64, 0xdf50f981, 0xc679336d, 0xb7567ee3, 0xf11b393d, 0x749cf1f2, ++ 0x4e7fb503, 0x87847662, 0xbe0a7963, 0x5e292a5f, 0x9b35bfdc, 0xf5232b6b, ++ 0x2643bf1d, 0xb9c8cefc, 0x4ad7a52f, 0x9446e9fb, 0xc38ff5a3, 0xe7f1c1fe, ++ 0x9bc7f7be, 0xe9fb919c, 0x886652ae, 0xb5db7ef8, 0x17f84f44, 0x152d7802, ++ 0x7ddf3af0, 0xf6d38e65, 0xf2016345, 0x1aaba5d1, 0xe823ec0b, 0x62fb8315, ++ 0xa787df1b, 0xd6fb121c, 0xa8947480, 0xb3461bb3, 0x0685acb3, 0x37162b92, ++ 0xcf093cf3, 0xd1733054, 0x2a25769e, 0x9a266f9c, 0x57ca3e08, 0x2dfaee77, ++ 0x8709ebac, 0xf7844a4f, 0x8c53cc39, 0xf6c35778, 0x11635032, 0xb177a4c4, ++ 0xc7ae666d, 0xde8f5c2a, 0x5a9ecc94, 0x3b5f6117, 0x17c07f45, 0xfe9fb162, ++ 0x81bf5f23, 0xfec86d70, 0x07ea127c, 0x4da7b3fe, 0xdad7ac2a, 0xb73f1125, ++ 0xe90cbdba, 0x8735dfc5, 0xe21a2a2d, 0x97377ec3, 0x5aebd113, 0x17edc898, ++ 0xfd4c33bf, 0xf7c4935c, 0xd3839b6f, 0xb1e5d6e7, 0x5bafe441, 0x9c18c19d, ++ 0x4fbbdff4, 0xd6a97d35, 0xd96cf1c2, 0x8c8f2bf9, 0xec941df4, 0xf2acb163, ++ 0xb35031fd, 0x38c32820, 0x0fccee9f, 0x0ccf7950, 0xd6750cb7, 0xce6b3f9d, ++ 0x1a753843, 0xeaded8dd, 0xf5c78dee, 0x58f3ba7d, 0x66afae3c, 0xaeeb4ca7, ++ 0xb2917e09, 0x2f8868b8, 0x15f24efc, 0x5d98bc23, 0x1af8e2b2, 0xe774f87f, ++ 0x564594a9, 0xfc93ff6e, 0x5c323c9c, 0x4a331d52, 0x570e0113, 0xf2f1ce5c, ++ 0x20e673d9, 0x62cfbdf2, 0xf045be40, 0x5c6ccfdb, 0x6a2455de, 0x36475af6, ++ 0xf2c19bca, 0xe40685ad, 0xf3b23f13, 0x1d4d3bf5, 0xff1fb8d9, 0xb3f7d247, ++ 0x82c0d9ac, 0x9b6bdbc0, 0x8fc03401, 0xc5e67b3e, 0x9ff7e46c, 0x7662f93e, ++ 0xa2fcc455, 0x739ed3bf, 0xd97d8513, 0x02c798fa, 0x6d3155e3, 0x8e2650bc, ++ 0x7f36e557, 0x3585fc88, 0xee0cf2cf, 0x8cfe3c9b, 0x7b36cf6c, 0xb80e0f88, ++ 0xa1d22acd, 0x4d40ddf6, 0xdbf507ac, 0xfe216601, 0x8725d557, 0xc79fd8cc, ++ 0x7689c633, 0x547df68c, 0x3d049bff, 0xf9129d49, 0xc28ae203, 0x61ff8fc4, ++ 0x7c04ef7e, 0xc07bf046, 0xf1225273, 0x191bf0fb, 0x84c3e88c, 0x58353370, ++ 0x294f9415, 0x857d39ab, 0xbb206c7f, 0xb2ee94ca, 0xa2bb3f22, 0x00c9b620, ++ 0x1b19d11b, 0x7e81893f, 0x485e9595, 0x9c6503ed, 0x8c2903ee, 0xac6967fc, ++ 0x6d7e2251, 0x4f7f25ef, 0x5f6634e6, 0x1217c507, 0x62ea9eb9, 0x3e72cdee, ++ 0x7f425de1, 0x4d0f068f, 0x20fd202e, 0xb24cfc7f, 0x5d48fd10, 0xb29de912, ++ 0xf60163a1, 0x3d3d1a3b, 0xd053e1ac, 0x5ff960d3, 0x34db4f44, 0x4f461dfa, ++ 0xc9e8953e, 0x9e991965, 0x5dfd8954, 0x8bc059ed, 0x80aa6bf6, 0xef8243d7, ++ 0xe16c7f84, 0x19002c7e, 0xf452b7ae, 0x86b16957, 0x6e1f9464, 0x11bde7e3, ++ 0xd036ccf6, 0x4a4ed17f, 0x9e1dfd43, 0xaa17ab19, 0xd3d63784, 0xb882fe8b, ++ 0x8f9216a9, 0x727a180f, 0x9d495f51, 0xe91bb8d0, 0x51417522, 0xffb26ac9, ++ 0x0f281d32, 0xdf92b650, 0xb7997966, 0x5f42292f, 0x4cf6e6e8, 0x7a1e3dc3, ++ 0xeb8bb33f, 0x2631fe07, 0x9dfd87d2, 0xdcf10052, 0x510535e0, 0xb8916a0f, ++ 0x60f0257f, 0x917e8a8c, 0x12ba8736, 0x27eda7e9, 0x46a03baa, 0xb77b73fa, ++ 0x56f48bdf, 0x47bf2563, 0x65b8239b, 0xa1bbb609, 0xfdedda88, 0x1fc7cc9b, ++ 0xb6fc68cb, 0xe3d20ee2, 0xb952aedb, 0xafe0457f, 0xcd278e6d, 0xb340fa81, ++ 0xb5b73f7e, 0xe112d27b, 0x000d80fd, 0xad55e303, 0xa43c218f, 0x2cce1ccb, ++ 0xcfe5c2c1, 0x7e40be70, 0x026994e3, 0x918fad31, 0xcfb833be, 0x39605381, ++ 0xe5b7d45d, 0x0f3038c2, 0x1737915b, 0x1b59ef35, 0x0b143e9f, 0x7e829af4, ++ 0x05946e37, 0x7f27ef50, 0x3b932f2f, 0x4c0351f8, 0x576b1d24, 0x2cbf2bae, ++ 0x0fda2ca2, 0xa6bf6f7d, 0xeee4933c, 0x1b4e3d60, 0xf656b1e4, 0xd6bcc0c4, ++ 0x15ea86da, 0x9d2d77d0, 0xb03eff12, 0x2059eaff, 0x6d2407a2, 0x1e2d95fc, ++ 0x30c5fff4, 0xf39178dd, 0x37faa253, 0x5556ff42, 0x62a3bf6b, 0x6f9818d6, ++ 0xbafe5689, 0x7bf303d9, 0x8fefa8c8, 0xc7be2a40, 0x1fde3682, 0xadd72b92, ++ 0x0bd21ccf, 0x25304f40, 0x07e90f25, 0x6cabdf6b, 0x8ac610bd, 0xa1329fb3, ++ 0xbce4d5dc, 0xfe9129df, 0x5d5fbd11, 0xfc3f9c49, 0x1d557cc3, 0x92bb47a6, ++ 0x3d1e90a6, 0xd824b71b, 0xfdb7c41f, 0xea1979f7, 0x648fa073, 0xf23e9126, ++ 0x5003f1f9, 0x2ff73fdf, 0xd8a8646f, 0xa8058eee, 0x2acffaf7, 0x5dfeb744, ++ 0xba025072, 0x02fd88b5, 0xfcfc9c72, 0xb32d3d1a, 0x04753a0b, 0xda2dc618, ++ 0x0129a5ba, 0xecc6afa2, 0x2b97001b, 0x68e33c93, 0x4657611c, 0xc493dbaf, ++ 0x617f07ed, 0xec0296d9, 0x50c4a77f, 0x7857584f, 0xd9116534, 0x2ca61f4d, ++ 0xb6aef88e, 0x678251f3, 0x88e32eed, 0x7124f470, 0xdf61b6fd, 0x1be41e0b, ++ 0xe225059f, 0xb04a3509, 0xd72812e5, 0x135018d4, 0x0b839364, 0xc5b8a26f, ++ 0x0b1b137c, 0x39402beb, 0x75d8f387, 0x5c12e07d, 0xc127fc37, 0x25deadab, ++ 0xceb74f24, 0xee2958b7, 0x07755853, 0xeb1ec1c1, 0x2bac3841, 0x71c34b2c, ++ 0xb6cce61a, 0xf403bc53, 0xb86fac38, 0x0bf266e7, 0xd75af369, 0x3d40ac69, ++ 0xb9f414a7, 0xb3bcc15f, 0x70aeaf12, 0x90ce3ec3, 0x05df1777, 0xf0a34de5, ++ 0x9c9df7f1, 0xde49378f, 0x93260fc0, 0xfa45941f, 0xb93a7335, 0xc93f38de, ++ 0xcf6bf3a4, 0xecfae24f, 0x999e8165, 0x95fb3e48, 0xa7d438de, 0x05f3ccfd, ++ 0x6bcccfda, 0x3c249f55, 0x5ce47e71, 0xcc7f92a1, 0xe07dece2, 0x4cbfac42, ++ 0x2985fb21, 0xb8e08fbd, 0xf74e2dfd, 0x01f6263a, 0x2229ef96, 0x24cde7bb, ++ 0x6fc462df, 0xfb53d0a9, 0x8c595df7, 0xef4d447e, 0x16d2796a, 0xd4fc855c, ++ 0x815c3ea6, 0x852bf4fc, 0x84b324f8, 0x3f42667b, 0xa44d7fb5, 0xf38a5f7e, ++ 0xb6bd2235, 0x905b04c4, 0x32ed020e, 0xb5ce73b5, 0x4f9fb084, 0xa3b5b29f, ++ 0xb674697e, 0x3063a432, 0x625fc857, 0x0a997a71, 0x858199e5, 0x22f2848a, ++ 0x89999f4a, 0x57b22afe, 0x2dafe49c, 0x2c63fb13, 0x0b71c150, 0x6fa6856d, ++ 0x9bf48693, 0x53cf5f43, 0xf7a6a5f0, 0x7fdc2c18, 0x963f3e5e, 0x4d6cf8e1, ++ 0xfa030df8, 0x0c3d9deb, 0x0efae0f5, 0x2fa9c689, 0x7684de7c, 0x7c1dedcb, ++ 0x9d85fb7f, 0x46cbf001, 0x2925a2bd, 0x4d97e84e, 0x7ac1cfdc, 0x3840c8de, ++ 0xc9f1cb3f, 0xf08bb418, 0xe1cec2af, 0x67f440fc, 0x7a867112, 0x490257e1, ++ 0x24fcf5c8, 0x255d6f4d, 0xfe568df4, 0x926ee314, 0xc2323c7a, 0xf9d258b3, ++ 0x2fe7b5c3, 0xaf09f7c4, 0xfee36786, 0xa17d030d, 0x348b697f, 0x61d78ee7, ++ 0x4ca65b7d, 0xe60aa370, 0x4b927202, 0x22903df0, 0xe7727dc0, 0x6e91b317, ++ 0xfda30558, 0x4339d0da, 0x78f2b7ae, 0xa90bea0c, 0x58ed8d71, 0x215b7a9f, ++ 0x8f8c67c9, 0xb7655c60, 0x959a6b80, 0xab5cebfb, 0xbf18b902, 0x7bd5784c, ++ 0xfe38ebc7, 0x6fe4b105, 0xd8dc054d, 0x8cd9e912, 0x2b172dfe, 0xd7f2803e, ++ 0xe096a955, 0x1d38b47c, 0x14e6f9c6, 0x72a71f11, 0xecf25ba2, 0x49cbe780, ++ 0xd8175a0e, 0x5f381577, 0x0eb41f7c, 0x6fd10dc5, 0x5c62e387, 0x69fd9f0e, ++ 0xfcfc8521, 0x449fcf20, 0xdb34ed3a, 0x9d955e11, 0xf28bbe6f, 0x3ac2d2b6, ++ 0xa51a8e28, 0x7f1cdcb7, 0xffa441fd, 0xb7c71381, 0xbaf38fdf, 0x47dbaf61, ++ 0x23ebd1f8, 0xf5ce5c57, 0x8c9ecff2, 0xdc8f5153, 0xe836f821, 0xf2fe3c8f, ++ 0xa323b71c, 0x93f7c8f5, 0x60e47af4, 0x47ae9ff9, 0x6005f9f2, 0xf0464f7e, ++ 0xfbb0bf77, 0xc64e6a06, 0x78fafca3, 0xff203e70, 0x94f4874b, 0x1f719daa, ++ 0xb41b3ee2, 0x11f4a22b, 0x7fc79da5, 0x7c49ac30, 0x711261d7, 0x216b8f2d, ++ 0x051c3ffa, 0x3d0e7fc4, 0xba401715, 0x4311d939, 0x30e2997a, 0x4d5e7085, ++ 0x0683982f, 0x80a0f909, 0x5788b757, 0x2c1c4499, 0x854540b1, 0x4bc9af62, ++ 0xbcf03f7c, 0xe2abc791, 0x053ccf83, 0x69fdbae5, 0xa8c59e22, 0x38bec0ff, ++ 0xac5d7782, 0xd7fd809a, 0x61893afd, 0xc6006a9c, 0x13df3c43, 0x539c93e3, ++ 0xfbc5ae30, 0x5598af67, 0x150b3f1e, 0xed0e0038, 0x1dffae41, 0x4c84342b, ++ 0xd476eeb0, 0xf5dfb017, 0xaf8b5c5a, 0x0cc1e073, 0x6541971e, 0x16b2ed04, ++ 0xd6aa2fee, 0xb9fb55e2, 0xc45aae1f, 0x5dcd8ea5, 0x468604f2, 0x0ac6a49a, ++ 0xacced3b4, 0xf3fe419b, 0x439e1fbb, 0xbd66eacf, 0xfa097fbf, 0xe287f3e7, ++ 0xbddf9ac1, 0x5c4db98a, 0x1ff21e7f, 0x519f401a, 0x9432959b, 0xbeccb99f, ++ 0x1a81e50a, 0x854dec00, 0x513c1367, 0xca009789, 0x71694ed0, 0xd7be22c6, ++ 0x6e481936, 0x1e0c9a05, 0xcbd1a76c, 0x672e4e05, 0x9d82a167, 0xc410244c, ++ 0x9367b471, 0x441bc451, 0x21992b7f, 0xc4834f84, 0x4aed6b9f, 0x5bf248c5, ++ 0xd8c9afeb, 0x7a819968, 0xfc819673, 0x9e4c67dd, 0x4e2fe4f9, 0x353c202c, ++ 0x2b9b1ad9, 0xa5ed3d78, 0x2f613133, 0xb8574fd5, 0x44d4c962, 0x4ef9a7e4, ++ 0x86885f1e, 0x7d56e2db, 0x530e3a39, 0xab97d41b, 0x5a5c6f99, 0x441b8f3e, ++ 0x7277cfbe, 0x5d66767e, 0xdbb780ae, 0x5b577c84, 0x0e4ccaff, 0x7f164337, ++ 0xcd9565e6, 0x73c83a47, 0x230f2898, 0xaafdc1cf, 0x7f9a12b0, 0x44a774de, ++ 0xdf3511f4, 0xa7a70726, 0x43f70b40, 0x8ff3bdfe, 0xceb5f79e, 0x3c372114, ++ 0x565b8c2e, 0x87144ddb, 0x497f573e, 0x97cf5383, 0x7cffcb06, 0xf3db96fb, ++ 0x97c8b22d, 0xaa5f13b1, 0x1cb5f3b2, 0x854fdc93, 0xf415bdf0, 0x8b475c06, ++ 0x647c825c, 0x5a56f5e6, 0xe07ec347, 0xbac71823, 0xe51b37af, 0x6f59437a, ++ 0xa26bc601, 0x55b38be1, 0xed067e34, 0x8f609caa, 0xacd0dea0, 0x8f0dc78f, ++ 0x23567aaf, 0x70d4789f, 0x289bf76c, 0x90c776bf, 0x1d7f82fc, 0xdffee330, ++ 0xcd7c4b97, 0xe03df361, 0x3632fd44, 0x5ce9fdb4, 0x1eb863d4, 0x6e65df55, ++ 0xaab13d47, 0x87be2229, 0x8faf5bff, 0x44e6b1f7, 0x36b3bbf2, 0x6d9afbfd, ++ 0x8b0ddf51, 0x5e12b5ff, 0xe37c9936, 0x1c83bf71, 0x1383bca2, 0xf88606b5, ++ 0x4bdd96ad, 0x889d4850, 0x27e7ebd1, 0x3f5f1c6c, 0x85fa6a77, 0x3cf100bb, ++ 0x67861e58, 0xb9e20177, 0x917cc0da, 0x9e23d4fd, 0x0275bf01, 0x985e27cf, ++ 0xfe78805a, 0x02d4f77c, 0x6326f3c4, 0xcdf707ab, 0x97efbb7a, 0x59be9f08, ++ 0x30afd25e, 0xd1f7071f, 0x6863d2b9, 0x1e9c9e70, 0xf3cea343, 0x196fe39f, ++ 0x3dbe3e4d, 0x7cbd0f38, 0x4cd49a74, 0x165507e4, 0x49ca77f3, 0x9fd11bfc, ++ 0xff933167, 0xa7d7ff63, 0x463e5036, 0x89fa4c97, 0xc57edfd6, 0xd1fa8f97, ++ 0xee5d77fe, 0xff7a3480, 0xc73b0977, 0xf4016165, 0x817668b3, 0xf3465fa6, ++ 0xafb15ee3, 0xfcf4ecff, 0xb01fe920, 0x71ff354f, 0x0963688d, 0xef7ae29e, ++ 0xfdcdc94e, 0x4fe41dc7, 0x685ee86e, 0x27f17f47, 0x6e3fee41, 0xfc98a178, ++ 0xd7c1b5c7, 0xc61f9842, 0xda3b24ba, 0x3f3bb523, 0x003cc78c, 0x3b05eecd, ++ 0xf2938cf7, 0xeff6f46b, 0xf163c127, 0xf3003798, 0xb3f506be, 0x84d86738, ++ 0xf600df74, 0x3525831f, 0xb037e128, 0x232706df, 0xa77260bd, 0xe2d41ede, ++ 0x26bd5bbb, 0xbb5bbbe2, 0xebf220a4, 0x372f9314, 0xcb1ae513, 0x1b8f1fb4, ++ 0xb24a67da, 0x39393f27, 0x31eeae32, 0xf3581c61, 0x496ef53f, 0x35edfa20, ++ 0xf91d8f32, 0xe09b16d9, 0xb7f10a67, 0x8239b72f, 0x86f422eb, 0x4f5c832f, ++ 0xbbf2d5a8, 0x00521614, 0x79e64b5f, 0x91be208e, 0xf8a287df, 0x8b59647d, ++ 0x42cedfd7, 0x31ea9724, 0x79e449c3, 0x8e8bb645, 0x5c1c63e7, 0x2c6b0fd7, ++ 0x764fd156, 0x714dd5ab, 0xcd6fceae, 0xb700fafa, 0x2c3f619b, 0x5fa2192f, ++ 0xfd1a0f0d, 0xb47f0836, 0x1ae8e6bf, 0xa77f5fa4, 0xbafb4764, 0xb7e9cdce, ++ 0xf32fec0e, 0x9dfbe1a4, 0x46fd0075, 0xf6d1bbf0, 0xbf5927bf, 0xffcb07ff, ++ 0x35eb7f22, 0x58bd7ac9, 0xbfe6bf5b, 0x97675c1f, 0xd465f7c4, 0xd6eda2ba, ++ 0x66bbbf68, 0x3f2b9e77, 0x47828aac, 0x3c32ffd5, 0x0d87e346, 0x43f1a3c9, ++ 0xefe35c7d, 0xcbff87e6, 0xba278df1, 0x00378b1f, 0x0dcda8ab, 0xe75eb8b8, ++ 0x678bc5d1, 0x8f0f56cb, 0x9f3cca9b, 0xaeee3a22, 0x777116ce, 0x7b5f9fbe, ++ 0xd57c2641, 0x7d70f88b, 0x4d8dcdb7, 0x294bac6b, 0x3f1d1b3e, 0xcf76c65d, ++ 0xc7451446, 0x1f70eb51, 0x3c7f7fe7, 0xc1e4b1f5, 0xcc5c853c, 0xd3ce8853, ++ 0x2a7acd7a, 0xef8117c9, 0x043022b2, 0x8b6ba046, 0x11896012, 0xe64c9fef, ++ 0x226bf4fa, 0x6265c89f, 0xf2a798cd, 0x83ce2d90, 0xc0cb8c76, 0x26569df3, ++ 0x7e469f79, 0x3c055168, 0x1990fdf7, 0x184f2e00, 0x049f883b, 0xe46eadea, ++ 0x471f9a7f, 0xfc20dfeb, 0xe74ae711, 0xf9d144af, 0x7de2ff2b, 0xefb696ff, ++ 0xddb8deff, 0x6e8d8066, 0xdfa2303f, 0x94ce31b7, 0x476e9c3b, 0xfa3467eb, ++ 0xf7b253fd, 0x7eb993bf, 0x95f2893f, 0xc4bf91cf, 0x431f0e4d, 0x63db117f, ++ 0x89bfd156, 0x8b9212fe, 0xbd84d3eb, 0x439d2eee, 0x52eed679, 0x00fb17cc, ++ 0xe8f179ff, 0x41c9e3fa, 0xf1fd70fc, 0xf9f8a8e4, 0x65c7f4c7, 0x5c69ef76, ++ 0x4f0cdf67, 0xb5b7ca01, 0xda3f9836, 0x3cf0cf85, 0x9c316da3, 0x9c49b73e, ++ 0xa4f2d92e, 0xc4bbf273, 0x9bede8a6, 0x98bff2c1, 0xfca4a67f, 0x5fe7f8ab, ++ 0x3a8fd1e2, 0x91013f7a, 0x11e3d9ef, 0x23b634f1, 0xefedbfc2, 0xe37af9e1, ++ 0xf7b49c04, 0x771fd8b2, 0x310a78a6, 0x23f3edef, 0x004b0b16, 0xe7326795, ++ 0x2b5e0d8b, 0x3a1a17c5, 0xc34bde78, 0x77f88c7d, 0x514ffa03, 0x61ce747e, ++ 0xe13defa8, 0x4ca495f0, 0x358ab8c1, 0xdfa02720, 0xfd432e7d, 0x2f08ffae, ++ 0x2be1d0ff, 0x7dff7ac5, 0x68cf14bd, 0xe519fb9b, 0x7b7e955d, 0x64c54d6a, ++ 0x11f92f9a, 0x559f229c, 0x14c2df9b, 0x9ed07f1e, 0xede1060b, 0xe7febf21, ++ 0xdb3f3c35, 0xd1d8f4ef, 0xc5f9a11f, 0xf21ed4e3, 0xe1ec3533, 0xcca95b4a, ++ 0xcdeec3d7, 0xd86a7a24, 0xfd18a333, 0xa623aca7, 0xd2dcf518, 0xef64adf7, ++ 0x3a4f7e7d, 0x99bc49e5, 0xe116bbe4, 0xbc1c9b61, 0x1cd2f50a, 0xddf50718, ++ 0x555f77cf, 0xf8d6f38c, 0x9ff426df, 0x364dfb43, 0x599c5fbd, 0xed7cde78, ++ 0xff9a19d3, 0x6fec46fc, 0xcc87d893, 0x673a5ada, 0xedaf7d84, 0x40d954f7, ++ 0x62dea7fd, 0xc6b938a1, 0x9919360f, 0xc43f92cf, 0x7c8ba647, 0xe453bf42, ++ 0xe1cd7633, 0x6ca229f9, 0x3af3ea75, 0x359cecff, 0x3d30f11d, 0xbcbf3945, ++ 0x3cb0eb30, 0xf317ea01, 0x073ed0c2, 0x259f928c, 0x9fd72cee, 0xa226ecf3, ++ 0x37ec1b23, 0x1d00cf8a, 0x597f1ea1, 0x026667b8, 0x5b4c73ac, 0xef8432e8, ++ 0xc206b3fe, 0x6de73293, 0x4824cf8a, 0xf5fcbc7c, 0xd0e32dbd, 0x677f62ff, ++ 0x6d52a23a, 0xa86197b5, 0x378709ef, 0xf4fe4290, 0xaf1c42c6, 0x9e460fec, ++ 0x471dd947, 0xecb6857e, 0xeca3ca3a, 0x3baccf7f, 0x0cfd1357, 0x379455b0, ++ 0x5ff9d799, 0xedb02714, 0x87cc4691, 0x958a69fd, 0x3d02afc7, 0xe6b729b3, ++ 0x57f12732, 0x8a7dfba5, 0x0a2d2b4f, 0x64d61e72, 0x906218f4, 0xe464ad7f, ++ 0x66db1ce7, 0x72be2037, 0xc0cc5e44, 0xf24ebffe, 0xc5a29d91, 0xaf3c8205, ++ 0x06bbd8c9, 0x65652fed, 0xc401e5ef, 0xa1871ec7, 0x0bfb08a1, 0xa59f9037, ++ 0x9f218e3b, 0x5fcce9cf, 0x73942975, 0x0714ed9a, 0xf6e9781b, 0xc2abf21c, ++ 0xb08ec73a, 0x9e14a6ce, 0xc774a487, 0x298e5019, 0x471b991b, 0x65291c55, ++ 0xa147ef34, 0xbffcfd0c, 0x5a674e14, 0x4ffd14dc, 0x4cee9f28, 0xfd2075f1, ++ 0x5a279e0e, 0x13cfcb1e, 0x624fdc29, 0x73defe5b, 0xbb674e78, 0xeaf1a738, ++ 0xc97389fe, 0x48a2d7df, 0x0e338788, 0x25d9479e, 0xf870f1f6, 0xaaf94abf, ++ 0xc5ffdd79, 0x01cc19e5, 0x9c8c57fb, 0x6716945e, 0x0f15fa3b, 0x9f947cdb, ++ 0x2429bd3b, 0xdeccdc53, 0x1a8548f7, 0xe66cdf61, 0x1761a5f2, 0xeda3c7b7, ++ 0x2b93ef99, 0x2fe4187f, 0x960cae5c, 0x4afa45ff, 0xf93c946f, 0xa614edbb, ++ 0xf5a2efb7, 0x6e7b6896, 0xd51dfe98, 0x8bfa68df, 0x36528796, 0xa3d70e34, ++ 0x147e9a6d, 0x94e9e5d0, 0xccb8f959, 0x477fefa2, 0x2ff79da2, 0x565276f2, ++ 0x3f312bab, 0x4613fc3f, 0x7f2d3a7e, 0xf3c65028, 0xe006027c, 0x6f18b987, ++ 0xa1bca56a, 0x2492160c, 0x32f5a3f2, 0xf3152efc, 0x13bbe087, 0xc7047929, ++ 0x59bb99c7, 0x4aa97e26, 0xcc18ef38, 0xd53ca13b, 0x382596e0, 0x1a560dce, ++ 0x4ef30627, 0x01d4c22e, 0xafe416cf, 0x5c786b33, 0x30e41d21, 0x18fa6fd2, ++ 0xf331874e, 0x9689fe79, 0x83e5a25f, 0x13287068, 0xb71f4df0, 0x60f91724, ++ 0x067be48b, 0x89169ef5, 0x20f027c3, 0x39b42bf7, 0x7286af40, 0xca04ed5b, ++ 0xbc601bff, 0x818d40ff, 0x0fcb52e8, 0xf2ab1b6c, 0xe37f4073, 0x8adae5e7, ++ 0xb0c9be79, 0xb82894bc, 0x9929796a, 0xa9b1bef1, 0x11e743c9, 0x8d123cb5, ++ 0x17f0224e, 0xb6f18188, 0xbe7d7376, 0xeb44c6ac, 0x9abda818, 0xb50391fc, ++ 0xbf728606, 0xe9cccbac, 0xadbc6a2e, 0x842c4df3, 0x18c12afd, 0xfe1a9fe4, ++ 0x059f4fbf, 0xbfa216bc, 0x1515d5f7, 0x8c01f517, 0xd2f0ae0f, 0xea462073, ++ 0x277f3190, 0x3880bc26, 0x35d76b95, 0x6798c5ca, 0x8096ce13, 0x1e5b6c64, ++ 0x2e4054a9, 0x3f87240c, 0xe6c672c0, 0x1b1e5e6e, 0xfb412ede, 0x25655762, ++ 0x4c5a47b5, 0x31fcac67, 0x7ac0654f, 0x6beef21e, 0xe1bf9d16, 0xb3d6b845, ++ 0xe43d35de, 0x6ef21227, 0xac87e732, 0x7ee41cdc, 0x65fc952a, 0x4972d387, ++ 0xe616b00f, 0xfac1e9ed, 0xd7f9334c, 0xfde89ea0, 0xbc19d8f0, 0x6778e55e, ++ 0xc79e3699, 0xc8037ac1, 0xcee70ecf, 0x3d753f20, 0xa7d007ee, 0x7cfab4be, ++ 0x13cf00a9, 0xb8ddcf52, 0xfacf0e0f, 0xefa422f7, 0x1def7b13, 0x4ae6fc83, ++ 0x23e9e813, 0x2e3397f0, 0x8c065fce, 0xfa0966d6, 0xabeac179, 0x1bbc75c5, ++ 0xa63660b7, 0x9a4fcf96, 0x04a3c261, 0xcc8cf02c, 0xbc0410b4, 0xfae3cc77, ++ 0x2bdca3a3, 0xeae81e61, 0x648f3e18, 0x7d21e29f, 0xba4f37c6, 0x5abfd601, ++ 0x530dfa12, 0x290ec813, 0xbcf01354, 0x37389d5f, 0x7cfd8b2a, 0x1946c771, ++ 0xafdfe7f5, 0x4552f778, 0x5f2e5d19, 0x686f651f, 0xbe54e6cf, 0x7ab2b98e, ++ 0x1ac7d201, 0xca9bf429, 0x4abdf18b, 0x2fc567ef, 0xd3f98c9f, 0x4e35c657, ++ 0xb0e9ff46, 0xbef009f7, 0xe66ca228, 0xe12ceaed, 0xd9e8056c, 0x8f5be31d, ++ 0xf0b33970, 0xff71bbc3, 0xf87e9dde, 0x385fcc03, 0x38fb146c, 0xc1fe124b, ++ 0x80f199b6, 0x1df237af, 0x42c2ff22, 0x1c637bf8, 0xe60e0ff7, 0x28978d97, ++ 0x1e72aedf, 0x0d79b73f, 0x85ea69eb, 0x0089c9ef, 0xe5a7b3f5, 0x29579e92, ++ 0xbf6621f2, 0x7b478deb, 0xc30ff67d, 0x3477e20a, 0x32e95cf8, 0xf411bdaa, ++ 0x2faa957a, 0x2fa8535f, 0x97d6eb5f, 0x9bed307f, 0x87e59171, 0x20cf3c63, ++ 0xf12cbd5d, 0xc5c0cc7c, 0xacfa4ecc, 0x7ea00a53, 0x74c5f131, 0xe795de71, ++ 0xd85cfe0d, 0x634e2f43, 0xcbb29f54, 0xf9f303b2, 0x2cb2bf35, 0x98ba27ea, ++ 0xe0912725, 0x2c28f241, 0x2743fc89, 0xded85ac5, 0xbfdcec3b, 0xd04d6d0a, ++ 0x2a85decf, 0xac5365c5, 0xee397606, 0xda16c987, 0x9619a50f, 0x579fa458, ++ 0xe769fd05, 0x2c7a3597, 0xf3179855, 0x79e86020, 0xb46c3cf8, 0x723f401f, ++ 0xe74653e0, 0xa19b18bd, 0x18a43e50, 0x5495b18b, 0xf9d04c7e, 0xfe9f1aab, ++ 0x7df84289, 0x7c2266dd, 0xdb96bfca, 0xec600e51, 0x27c3fd06, 0xf9a04fd7, ++ 0x7608fb69, 0xd90c18fd, 0x57eb4c49, 0x0a24e031, 0xd1acbced, 0x53a18539, ++ 0xd2316e50, 0x5978b547, 0x3bf06596, 0x26977e0f, 0xc0deb9fa, 0x54acd6e3, ++ 0x39c5e3c4, 0x2f5114ac, 0x15f9bd75, 0xd4e9cbd2, 0x9defa25c, 0xf48bd7cc, ++ 0x2adc9b2a, 0x3fb6b3d2, 0xdfc9caec, 0x7ae1a654, 0xeb4c7e0a, 0xc766dab9, ++ 0x9cc214f5, 0xd3d227e6, 0xfd825493, 0xe5a7c4a8, 0xf5fdfe58, 0x552e4715, ++ 0x7c23f822, 0x8fbfcf5f, 0x82ef7fd3, 0xbe2313ef, 0x8bef878f, 0x58cf7f86, ++ 0xb5739088, 0x22d5ff98, 0xcda774df, 0xc24c3212, 0x5ed54bfe, 0xe14e4ef8, ++ 0x87898fdf, 0x0a2f28f7, 0x6c1d79f5, 0xf942db9a, 0x1c7951c0, 0xa5f74a57, ++ 0xcab97ee1, 0x0bd5df52, 0xf029bffd, 0x77c1a573, 0xdfef0eda, 0x1070505c, ++ 0x258555f7, 0xdd1e60a8, 0x06b42c35, 0xc3303691, 0x9f2384f7, 0x0b9c7df6, ++ 0xfb20d8e0, 0xf94225c6, 0xcc75b184, 0x2fb4b91d, 0xc329aeac, 0x5fe1afe7, ++ 0x01d2075b, 0x1d20d3d2, 0xc35bcd44, 0x83aebb17, 0x071edf12, 0x9a9f05fd, ++ 0x2358c33e, 0xb35673cf, 0xc405d686, 0x38d2db32, 0x3789f506, 0x0fc4036b, ++ 0x423c74ae, 0xe9695079, 0xd79c5cbe, 0xc8bf0bfc, 0x6bb1b056, 0xd7d438e1, ++ 0xff79be61, 0xf4d5f397, 0xbe7961b6, 0x79749a9f, 0x1feda3be, 0xea3f5c6d, ++ 0x03e63263, 0xaede53b7, 0x8dd59e7f, 0x98fc33e7, 0xe2993a77, 0xbd8fa445, ++ 0x373d7124, 0xfe845920, 0xc0f9ae74, 0xf559eb8c, 0x2e967a83, 0x98adbd9f, ++ 0x0eedbbcf, 0x97b4f495, 0xb03ede25, 0x6e3d7190, 0x6c5fa88e, 0xef2d7aa7, ++ 0xfb9dadbd, 0x185edae9, 0xa0bf62a7, 0x671c917f, 0xcbbf4209, 0xedb5fce5, ++ 0xe01ed562, 0xca5266e0, 0x26f69e50, 0xb71bd723, 0x94a5dc1a, 0xbd026257, ++ 0x3981c78a, 0xc7cb1a7f, 0xd5e7f68f, 0xbcfef4b9, 0xc93ff2c1, 0xeedeb79f, ++ 0x2d5d23f3, 0x4b64f22e, 0xf7179c06, 0x6e7d01eb, 0x6e9861eb, 0xf50638d6, ++ 0xe358abed, 0xa27c863b, 0x7ee31fcf, 0xe8113f9a, 0x9f475f33, 0x3992bb77, ++ 0x4579c43f, 0x3a6883f3, 0xb7de39bc, 0x736dc702, 0x80dfbc74, 0xd9976a7a, ++ 0x7958f3cd, 0x1f345e5e, 0x22cf9888, 0x29c7cf85, 0xb59f34cb, 0xe6a25fb4, ++ 0x24fb2e73, 0x19533e92, 0xeda30fdf, 0x05855497, 0xfb43256c, 0xdf18e1e5, ++ 0xe0ef5c26, 0xedc359be, 0x96f36192, 0x375f44ad, 0x16e3c4de, 0xd72e38fe, ++ 0x06917e30, 0xe311cfe3, 0xe9c2d8df, 0x337fc6f0, 0xf4c2dd11, 0xb9ff3843, ++ 0x574e7ea2, 0xcd2de53d, 0x8d1e372d, 0x9c5aef94, 0x3768be64, 0xc46c59cf, ++ 0x52af302d, 0x7f989f1f, 0xdc8f8f2b, 0x388d1ac0, 0xe9e71bdf, 0xd6cf99fb, ++ 0x5879817f, 0xbfd56ff3, 0x1835de7f, 0x718718d7, 0x7ec2838d, 0x82fd801f, ++ 0xe4f5e9fb, 0x00eedba5, 0xd3f71dfa, 0xf7f412a2, 0xdda94acc, 0x4fca11b9, ++ 0xe5409d6f, 0xf96e53d7, 0xdfac61d1, 0x72e5405e, 0xfb432a4c, 0xca23f703, ++ 0xae9bd29b, 0x0f7185ce, 0xef7e88c6, 0xaefb79e0, 0x1cdb5f58, 0x949ae768, ++ 0xe587f947, 0x2c0cdf82, 0x5cd7f5e6, 0xa629e368, 0xdfe4a9b7, 0x2f0d8f2b, ++ 0xbb7ffa40, 0x304bbff8, 0x4f3cb61f, 0x9e5e4b94, 0xd283e580, 0xbeee7417, ++ 0x20aadebf, 0xb9d21bfc, 0xa162745f, 0x700f1a14, 0xfd144f29, 0x5575f3d7, ++ 0x8e933c96, 0x8cbca3fb, 0x3dd133f7, 0xdb1f25a3, 0xb9524e19, 0x8f12dd3f, ++ 0x67db50fc, 0x297db547, 0xd8af24f4, 0x3e7a2ff7, 0x7e824a6c, 0x8dc916bd, ++ 0xfb4ef44b, 0x665aec90, 0xbcb9e7e5, 0xfd055c9e, 0x3c3d33aa, 0xb2ccb25f, ++ 0xe2ed0d32, 0xc9a67ceb, 0xa5bb2eb8, 0x27ea20f8, 0x4c66d309, 0x0b5afca1, ++ 0x039ca233, 0xfb4e3fba, 0xd917ea70, 0x566c48f1, 0x746bdd3d, 0xf7a34735, ++ 0xc35d3d72, 0x95dcfd7e, 0x5afcfdfc, 0x4331d747, 0xfe9a3d74, 0x8afaf30a, ++ 0x7aa5e3f6, 0x4e3835f9, 0x1e8cbed4, 0x817e3477, 0x74fc917f, 0xb41d7e68, ++ 0x0b3132ff, 0x67f71f2d, 0x633fb6ab, 0x261e60d3, 0x6b9d0f43, 0x13dc91c9, ++ 0x28e820e8, 0xbf36867a, 0x9675f42c, 0xfe179f0c, 0xc79e9a29, 0x0f689cff, ++ 0xf87a8a67, 0x8712c3ce, 0xa7e305e6, 0xac3d21a7, 0x5c79f3e1, 0x45fce46a, ++ 0x1d9ad9e8, 0xb7ada0dd, 0xd2debf53, 0xdcce7e58, 0xf20efe85, 0x184f1775, ++ 0xe039f79c, 0x5f8f5b41, 0x1679edc8, 0x6b04cdaf, 0x4d51c1bb, 0x1643f3f4, ++ 0xa3f50178, 0x0bbead4f, 0x1aaf9e71, 0xbf68dd02, 0x8a1e662c, 0xb87d0277, ++ 0x5f02fe69, 0xe1a37cda, 0x3f0a30d4, 0x344f5e8d, 0xd6f0867c, 0x769dfa43, ++ 0xbd706c6e, 0x4d4eb8e7, 0xf49a712f, 0xe144a67e, 0x7e144a17, 0x9428a420, ++ 0xd62c95cf, 0x4cfe7a8d, 0x45fa44b7, 0x5f10b325, 0xf2e0acae, 0xf5cad13c, ++ 0x8fee4d0f, 0xb8ae3fb6, 0xaabf119c, 0x9ce263ac, 0x34575f1a, 0xdeb2a61d, ++ 0xd2b3e31f, 0x84596ea2, 0x14f51efb, 0x95fe6875, 0xae3fee56, 0xdf84934d, ++ 0xca0a77b8, 0x30f2c1f9, 0x053bdf39, 0x5902cff9, 0x3ca9571f, 0x8994fdcb, ++ 0x2b3d1967, 0x414e1fdd, 0xd1589f39, 0xd8f9053b, 0x967827bf, 0xc0f87ee1, ++ 0xd1b9fdc0, 0xcd3bbc70, 0xcf29f9a0, 0xf7a33e89, 0xfaaf168f, 0x07bbead2, ++ 0x1afcd1c7, 0x529ea427, 0xc929b46c, 0xcbe7d62e, 0xd8763a45, 0x7fa06773, ++ 0xe4059e62, 0x00e30191, 0x1df895be, 0xbf6fcff0, 0x9b0f6345, 0x286f1c02, ++ 0xf0afddf7, 0x770e0961, 0x12cc380a, 0x36e4f572, 0xe502e299, 0xd0c7c29e, ++ 0x643fef75, 0xafda4164, 0xda8b921e, 0x41275cfd, 0xfb610a81, 0x67a46d67, ++ 0x9aab7d2c, 0x36e31ae2, 0x211a981b, 0x6307c727, 0x4c52f775, 0x2ba895dc, ++ 0xae91d05f, 0x67617f6b, 0x38beae9e, 0x7f574134, 0x5d12a1d1, 0x25cf4a79, ++ 0xdf53f6ba, 0x2f95d32d, 0xd75abdee, 0xe64fd2fe, 0x3120caea, 0x53f75c14, ++ 0x15b624fb, 0x7c3d3dd6, 0xfffbeeb3, 0x10fb3ad9, 0x098f17c6, 0x3c0599fb, ++ 0x8700853d, 0x9edd1a45, 0x17f7d2ad, 0x29524292, 0xb7fe7bee, 0x8fcf3d68, ++ 0x8b90019e, 0xab7177ec, 0xba589f5e, 0xe9ae5f59, 0x7906b8da, 0x8abcf0e3, ++ 0x348732c6, 0xdca2af3c, 0xf480d0be, 0xf40d2079, 0x538c140b, 0xebcc54d9, ++ 0x7f9f6d1a, 0xd80bfe1f, 0x3fc3ef98, 0x44d9bf6f, 0xb7d2fd7a, 0x821a557e, ++ 0x1e976657, 0x1eaa31ff, 0x7a8571ff, 0x7adcdbfc, 0xd34c27fc, 0xd1e1dfe3, ++ 0x42a93fe3, 0xaf64ff8f, 0xf3a9ff1e, 0xf34ff8f5, 0x519ff1e9, 0x567fc7a3, ++ 0x39df1ea3, 0xccf8f5cb, 0xd5d32c0d, 0xe35fe347, 0x77cdf997, 0x7801dbea, ++ 0xa074110d, 0x6f22d1d1, 0x8ccbe50d, 0xdd0ffd6d, 0x00f4d138, 0xee81a376, ++ 0x6e3b034f, 0xf4ee74ab, 0xfc8adc01, 0x21f4d1ac, 0x53bd0ba5, 0x23c805d0, ++ 0xd214fa43, 0xa8e98c2f, 0xfa138cf7, 0xfd6477be, 0x915fe342, 0x2ed23cf2, ++ 0x0daf8d1e, 0x4ec25393, 0xa14e551e, 0x64331c9d, 0xbf468f27, 0x87db3047, ++ 0xe4f5a8f4, 0xcec9ba47, 0x5f0a71e7, 0xdafe8c5d, 0x3e5c925f, 0x069c1302, ++ 0xeb823df3, 0xc48ff181, 0xc6ff244e, 0x7a442c2d, 0x4661bffb, 0x1b760c23, ++ 0x78cb4626, 0xcf4a92af, 0x17b7216a, 0x3b87ff0b, 0xe10137c6, 0x72fb20d5, ++ 0xccdc7052, 0xc49f3a1e, 0xa73a4ede, 0xa28e1b7b, 0x6f181eff, 0xe1effa1f, ++ 0xe9c31fd9, 0x57c6b8e6, 0x46754c3c, 0xa66ab3c0, 0xad7a4854, 0x46794b1c, ++ 0x48943f55, 0x99fd553e, 0xb9d2cb3f, 0xae7e8b3c, 0xb3c1ae5e, 0x5c03e855, ++ 0xae98582f, 0xf30f788a, 0x6e6e0959, 0xfa19e23b, 0x9ff4fee3, 0x73d9ff71, ++ 0x25a65312, 0xc22eb1d2, 0xcf1be233, 0x3e16c91f, 0xcc8ce7cf, 0xc89cf082, ++ 0x3e07a47c, 0xe36b00a0, 0xfde04dfd, 0x7f43ce1d, 0xbb8f2c9a, 0x70f01cb6, ++ 0xf30b8e23, 0x3375659a, 0x2ecb23f4, 0xd5bf4337, 0x2e7bf7b0, 0x06294ba1, ++ 0xc3b78ccb, 0xe68b843f, 0xf414cc0f, 0xb8c6d3b2, 0x3fca2bdf, 0x07032198, ++ 0x23197cc6, 0x52ed8f3f, 0xf27b7336, 0x39b3770d, 0x198cdd62, 0xee7e781d, ++ 0xcc21f4fb, 0x911e3d6f, 0x69780e8f, 0x4fde491c, 0x6579e0cf, 0x4e1457ab, ++ 0xf88afc27, 0xd42bfdd3, 0x91af18e9, 0xa1e53715, 0x8e467de1, 0x4e4def88, ++ 0x1be08fa8, 0x5750b58a, 0x04bd5a36, 0x1a2b3597, 0xe28c6e89, 0x99b5a5de, ++ 0x117dda77, 0xe995897e, 0x09667c7c, 0x130a7b30, 0x7dfc31aa, 0x7ae19332, ++ 0x5c72bb65, 0xe9fee767, 0x5b8458db, 0x6d37a0bd, 0x8c1766be, 0x03eed113, ++ 0xf6f5a741, 0xffce131e, 0x9eed5c83, 0x8a64de93, 0x26ce6d63, 0xe026dff8, ++ 0x8523de6f, 0x5981dcf0, 0xd8a233c1, 0xa61fef4b, 0xf9ad7d02, 0x7c6191ad, ++ 0x573dcd66, 0x687dc21e, 0x83746c4a, 0xfaeecfe5, 0x6fbb62ed, 0x4f6a7804, ++ 0x13394bb3, 0x22b6c7c9, 0xe21b8b1f, 0x87cc2363, 0x765dc1f8, 0xf75dcdfe, ++ 0xbd0ec918, 0xe518dfeb, 0xf0e5b33f, 0x9f043a57, 0x7e26e664, 0x7a6160e4, ++ 0x6c057eb9, 0xd78db010, 0x5f30b0ad, 0xd62fc801, 0x0a537a48, 0xad1d10f3, ++ 0x37441f77, 0xf2707b29, 0xae7c5e3b, 0x8ad9dc2b, 0x4503dbea, 0x69f07a7b, ++ 0x938ed8c5, 0x78824af2, 0x6586cc56, 0x4057ff8c, 0x158fc619, 0x5e1eb1f5, ++ 0x71f5138e, 0xe8fb78d3, 0x7baa40b8, 0x9f1334ae, 0xe457dfd6, 0x64ad3ee3, ++ 0x38ab5cfc, 0xe5f9af1f, 0xf7bfad93, 0x517e44ce, 0x8cdc44ce, 0xd62a3fd7, ++ 0xd1dd6499, 0x97f5879c, 0x111febe9, 0x8eeb0ef5, 0x7fec32d6, 0xa37ebe8c, ++ 0xfac13fe8, 0x07ba21fc, 0xfe3f5325, 0xc63ea243, 0x194f7cfa, 0x7dd07dcf, ++ 0xcdea22df, 0x02b79e56, 0x3f7116ff, 0x8c56bf5e, 0x81ab729f, 0xcee822f9, ++ 0xf9962f39, 0x589ef022, 0x1b2ba899, 0xcf1c3fb1, 0xb56defc5, 0xbeeba797, ++ 0x5fbffad7, 0x597f1f8c, 0xcb7bee9e, 0xf6fa0998, 0x3744593d, 0x9bb80a77, ++ 0xf5744b32, 0xcb5c5afd, 0x38f9f8c1, 0xa699d395, 0x4bce293f, 0x2c9ffd74, ++ 0xee301354, 0x60781c7c, 0x7158e20f, 0xdf1f705b, 0x454bcb69, 0x98ae0d3a, ++ 0x56714746, 0xb2819d03, 0x78bb4f05, 0x557bc4ba, 0xd9450b94, 0xe15ccf4d, ++ 0xa2bd5c8f, 0x803bca82, 0xc4f9f15e, 0x1f3d0f0a, 0xdf0ab287, 0x05fa14fd, ++ 0x40b6c649, 0x0c7e58bf, 0xa3e7c5fa, 0x1f3e2fd0, 0x7eb17e81, 0xe58bf423, ++ 0x583e6087, 0xc1fa107e, 0x3fd003f2, 0x78565b96, 0xc576bca9, 0xbfde7a7c, ++ 0xd5cf47c2, 0x3ea86a2b, 0xbf3a4335, 0xc0c9a93c, 0x71754b60, 0xe48cd4e3, ++ 0x2d7f7ca1, 0x1a6edc6e, 0x989aced9, 0x1cacedc1, 0x7e803de6, 0x8a6fa01e, ++ 0xefad6563, 0x68f68038, 0x27e39792, 0xd5237d6d, 0x38f82a3b, 0x19cc77da, ++ 0xfca59960, 0x83e72378, 0xa3ca2aea, 0x9e78cf18, 0xd4c02b9a, 0x13ee7152, ++ 0xf93094ff, 0x3d4295f3, 0xca8dcd3f, 0x259ed3cb, 0x63c82e42, 0x1cb83d1a, ++ 0x086f34cb, 0x6ead88f3, 0xcf039d1f, 0x261b3b39, 0xecebfb09, 0x38c54ce5, ++ 0xdf5ea540, 0xd12f2c4d, 0xd9f295e9, 0xc9676a06, 0xced759bc, 0xb5d2ace4, ++ 0x773dbaab, 0x91e10b8d, 0x5e61d7c1, 0xc1a592bf, 0x36db8bb8, 0x0ab7b8d2, ++ 0x037ac1bc, 0x2ddfafe4, 0x7d0af5f1, 0x58bb69ea, 0xd93d65af, 0xbc1ce309, ++ 0x30109058, 0xfcfc1f20, 0x1fb40957, 0x40c27a9e, 0x2cf1c2fe, 0x4d7c4068, ++ 0xf58cb104, 0x2a5eb017, 0x155c885f, 0x954cc5ca, 0x0b117cb1, 0xfa099e93, ++ 0x1e0cbcd4, 0x06227a47, 0xbe5948e3, 0x4a9e79a7, 0x02cdf488, 0x4d028f81, ++ 0x44acdcaf, 0xce6edbfb, 0x7f57fb20, 0x738b458e, 0xa695b4ae, 0x3fd11ea2, ++ 0x9c511e4a, 0x174be6eb, 0xd2e31c01, 0x7b53d3e6, 0x186a80ff, 0x8fe75cf1, ++ 0x37ce97ce, 0xd3d23f03, 0xfd708ff9, 0x8f7e8a27, 0x61ac3899, 0xe7ec984c, ++ 0x5f8d46d5, 0x2fc809a8, 0x04eeca86, 0x695d6f92, 0xced91f04, 0x0ad4f3e1, ++ 0xb54dc51f, 0x155fca75, 0xa5af31db, 0xedd1e440, 0xa5c7715a, 0x03f911e5, ++ 0x428eb141, 0xe50871d6, 0xe0d3a141, 0x4b9df6e6, 0x8cc60f67, 0x39e0f569, ++ 0x73027963, 0x78c5ce63, 0x6de74ad6, 0xc4c9bfe5, 0xaf57e47f, 0x15e82a62, ++ 0xc320f6b1, 0x5fad11bc, 0x1fcaec26, 0xda7a3e09, 0x96f34e5a, 0xed3935b3, ++ 0xb4e67d21, 0xbcc76ddd, 0x466dd399, 0xaa3e48fa, 0xbbb42faf, 0x5d01f5df, ++ 0xe713d92e, 0x16c5e9c6, 0x713dd2b6, 0x658976f2, 0x9e0f344a, 0xf5c89707, ++ 0x52e6e356, 0x4808b816, 0x266be0d2, 0x7baaf6b8, 0x87909a0d, 0xa649f576, ++ 0x1aa7e81d, 0x78417087, 0x3824298e, 0xddeb162e, 0xc12562b5, 0xa10c85e9, ++ 0x70696747, 0x1e61f317, 0xb72bde0f, 0x87b34da4, 0xa07cebf5, 0x5807eca8, ++ 0x5323d4df, 0x3c346c1e, 0x31ffc44f, 0x5d101e3e, 0x6ffb9135, 0x202f9e60, ++ 0xef382afd, 0xa32f8424, 0x9bb52cf5, 0xb41e7882, 0x20a8ea5f, 0x81817379, ++ 0xb4b1c645, 0x2be09767, 0x7e761965, 0xc16bb98f, 0x8a2e8ba5, 0x744adf2c, ++ 0xaf169cfd, 0x6e5c29b7, 0xa46a3c79, 0x669d6ddf, 0xedfc887f, 0xc1df3158, ++ 0xf026a87b, 0xeb2b327c, 0x1df98cd9, 0xbf17d9a3, 0xf9a5c8cf, 0x8017d90c, ++ 0x299fa41a, 0x5887ca16, 0xa8bde5a7, 0xebca5587, 0xdfe62785, 0xae9d045b, ++ 0xdfefe9b5, 0x77d62d3c, 0xc063e05a, 0x8c50f5c2, 0x44a714f3, 0xaaefdb9c, ++ 0x8b5a7b26, 0xf1740d0b, 0x5fcd56bc, 0x60482b51, 0xc38720e0, 0xe29936c0, ++ 0xd75db541, 0xbb0efbf0, 0x227ba11f, 0xe9152fa1, 0xafb45aa1, 0xcfdbd66e, ++ 0xd77a768b, 0xedc3aac4, 0x402c25f4, 0x7db46276, 0x7f976d1e, 0x56f42191, ++ 0xb8c62b37, 0xf9f5b1cf, 0x7cc2c46f, 0xce8cb94d, 0xcfc8660d, 0xa0ac3dd3, ++ 0x3de2b675, 0xdf88ac8b, 0xf78d1233, 0xe1132ca2, 0xd7869777, 0xffa256b1, ++ 0xfef8535d, 0xe4e075df, 0x9fa16375, 0xba48e4df, 0xe4dfd23c, 0x058e0918, ++ 0x678760e8, 0x23156307, 0x65250de5, 0xcf8fce1a, 0xefbfa65d, 0xf7b3bebf, ++ 0xf895388d, 0xe226625d, 0xc4bf8df1, 0x08fed117, 0xd7f4fdd3, 0xf993bfe0, ++ 0x7f7f31bc, 0x058be1b7, 0x90507491, 0xc17d50a9, 0x5cabcef9, 0x4513af3f, ++ 0xcd5ca4ef, 0x133635e7, 0x68e860e5, 0xb65e644a, 0xa3ddaf36, 0xed3d0fdc, ++ 0x4d33e77c, 0xe0220f2f, 0x33e71534, 0x9b769c1a, 0xb5cf9e46, 0xfcbf7c99, ++ 0xefbf20e2, 0x74bd7860, 0xb533f77e, 0xe27be7e9, 0x911b9ed9, 0xaf7cc35d, ++ 0xbbf6bc45, 0x062852fa, 0x31d7e025, 0x64e7d059, 0x64dc77c1, 0x7bff3113, ++ 0xa98f2953, 0xfef5e143, 0x95c125c4, 0x03eebf40, 0x1e50728b, 0xe9988ed8, ++ 0x68ff1a9e, 0x1d626d79, 0x11a5d3bb, 0x933ab0e1, 0xb781fdd3, 0x07bfa8ab, ++ 0xe43335de, 0xfee24d07, 0x1dec07a6, 0x547fbc16, 0x4b962383, 0x8537e9e0, ++ 0x3cb1b897, 0xb545b4f9, 0x819e308e, 0xd450f78f, 0xd3c6d1be, 0x2cc93f9e, ++ 0x3a5072e4, 0xf6be6328, 0x43bd9743, 0x343d04f7, 0xfb9e2159, 0x7d7fc30f, ++ 0xef43fc14, 0xe9c75ca4, 0xff0827e5, 0xf8a3e906, 0x2fd9401f, 0x84577f85, ++ 0x68f933f0, 0xccf7fefd, 0x0e1a5dac, 0xbf411aa7, 0xf5b4fada, 0x4db6f36b, ++ 0xf2f9445f, 0xf89c0f88, 0x935ed16a, 0xee420913, 0x4e48bae1, 0x7cf0a65c, ++ 0xe10a29f7, 0x9769a1f5, 0xdd84f9d0, 0xbe1d3e22, 0xbde234d8, 0x7012bff2, ++ 0x7fece07b, 0x197da0f5, 0xb9d232e8, 0x5de7b070, 0xf91d03d7, 0x3dd0ab7f, ++ 0x154f40b3, 0x81cdef78, 0xa3c64fb7, 0xc991d75e, 0xa64759f9, 0xb387cb89, ++ 0x1b9d0572, 0x5db4fb78, 0xddffa08e, 0x4bd0b299, 0x3cf07a7a, 0x9e1286c0, ++ 0x7a156cff, 0xbeedf580, 0x75bf9c1a, 0xa5987fda, 0x9edb3908, 0x36efa669, ++ 0x6e29c298, 0x2ddfcfe8, 0x03e910b3, 0xd77f74bd, 0x3b2779e0, 0x64c34387, ++ 0x78453010, 0xd7bf2a0f, 0xcaa6776b, 0xdef307e7, 0xc763ef0b, 0x6357b69f, ++ 0x2f1864fd, 0x9b7be86f, 0x7633e39d, 0xe347bf0a, 0x6f7ecba1, 0x12c37bc7, ++ 0xdff74624, 0x75196516, 0xd546fc7c, 0xe9edfa20, 0x602dfd41, 0xb0ff2857, ++ 0x05a77423, 0x5f6d7af5, 0x6a657358, 0xebdc56b7, 0x615a76ba, 0x681fcf10, ++ 0xcb273c74, 0xcdd23af7, 0xcf17d806, 0xe3d5de93, 0xb1f0499d, 0xe69e6317, ++ 0xdd0f5273, 0x62981257, 0x297ca3b2, 0xfb741834, 0xd38b252d, 0xbd04f68d, ++ 0x1f9df494, 0xe4d65a0b, 0x616edcbd, 0xcbe9be78, 0x501273b3, 0x34b3952f, ++ 0x476dcf3d, 0x9d697e38, 0xc7e1fa47, 0x47d75baf, 0xe7b5ffc6, 0xe6f02b47, ++ 0x62f2a1fe, 0xb63677b7, 0x6b7cc25f, 0xd25d1f50, 0x7bceeb26, 0xf9f62c7f, ++ 0x2cb1b3e2, 0x2fd7a114, 0x9d33769e, 0x367c595b, 0x4f40859e, 0x339c58fa, ++ 0x05e458fa, 0xe0fb129d, 0xcb8cf15b, 0xe97e4f3a, 0x8f37928e, 0x5553f7ff, ++ 0x429e5f9c, 0xbd4bd7b8, 0x1b73e426, 0x9d0bf92e, 0xec08f817, 0x77c150f4, ++ 0x858933ad, 0x6c19c622, 0xeb42d677, 0xa70bc219, 0x5af5a1bb, 0x811f0e09, ++ 0x70ddfffd, 0x71c1d0cc, 0x1d3cffa8, 0x5ff7871c, 0xb47fe340, 0xfa7bf0a2, ++ 0xff4a389f, 0x43fe6eaa, 0x71a18efd, 0x7aad5ffb, 0xcbf60e3a, 0x5b55a1ab, ++ 0xb6fcc65f, 0x37ba66fd, 0x9476759d, 0xe7a639d1, 0xbb6f9d18, 0x1f57ff7b, ++ 0xdddade60, 0x1c6e4c3b, 0x5e18c063, 0x3e411ee0, 0x00f6618c, 0x3da423de, ++ 0x69f2b2b3, 0xb7bf457f, 0xe63b4128, 0x150a59a7, 0xf5154afb, 0x2ae09eb2, ++ 0x5b2637b4, 0xfe693f88, 0xafdfad71, 0x1ced6432, 0xed6bed2d, 0xe29788be, ++ 0xd059257c, 0x5ab1a7ff, 0x0360529e, 0x7f6ac9fa, 0x3e79db26, 0x10ec83b4, ++ 0x30ad7fcd, 0xcd1bf91f, 0xff30cbcc, 0x77c73dbf, 0xfbf41671, 0xe8036053, ++ 0xd82f96cf, 0x9dfcc3e9, 0xf7bd8507, 0xcb8f4c60, 0xaeefc11d, 0x8fce52ce, ++ 0xe8a35b6e, 0x9f1fca76, 0x7339710a, 0x5ea3ce35, 0x5565f9ee, 0xf61de62e, ++ 0x5482fb8a, 0x27fdf913, 0x8cf741bf, 0x7af66955, 0x3b7c7473, 0xaffa81cb, ++ 0xc78f6fe6, 0x11d423fc, 0xa6fbf036, 0xb978e3aa, 0x944937fa, 0x4b760de7, ++ 0x9ff2115c, 0xdf9bb2dd, 0xb827672f, 0x186b149e, 0x46c86cb0, 0xb8080e78, ++ 0x8d7aec9e, 0xd93bb3ee, 0x5ff0963c, 0x74bdcafd, 0x74eed51f, 0xba067f2e, ++ 0xaa7f246d, 0xbc52eecd, 0x3a776d2f, 0x943b33d7, 0x84497c50, 0xb336b9de, ++ 0xe7eaf88c, 0xa80d63cd, 0x5d706b97, 0xd4e5c596, 0x985fc106, 0xbcc52e12, ++ 0x8727cffd, 0x6ff2477e, 0x3efd0c4f, 0x57ef618d, 0xdeaf74a5, 0x47dd3306, ++ 0xfc77b65e, 0x5f50f9a6, 0xbca0605f, 0x18dec34c, 0x7589cf9a, 0xfc1f5efc, ++ 0xfd74e516, 0x5dfa0cde, 0x30b8ea9d, 0xc7d555e5, 0xfe300bba, 0x52f7bd51, ++ 0xd8fc4fba, 0x91b3e383, 0x564d1e5f, 0xd53ee9b3, 0xb0e80107, 0xe3dda3ee, ++ 0xa996fbf8, 0xb6ce5e74, 0x9237ce21, 0x239342ff, 0xed06f7d1, 0xefee2f4e, ++ 0xb78cf844, 0xf94077b8, 0xe3cdc923, 0x73c2875f, 0xb8af8a55, 0xb560dce9, ++ 0xe86fb3f5, 0x0fb6af9e, 0xdef4656f, 0xd9ab7449, 0x55e3d161, 0xdbb3390b, ++ 0xbf805e14, 0x5abd546f, 0xf3c4ddc0, 0xc50daabf, 0x1a5fbbf4, 0xdd4437dc, ++ 0xf82ed9af, 0xf63cf6af, 0x94f742b6, 0xc6cffc81, 0xfb63e7fc, 0xc76744cd, ++ 0x73a44c36, 0xd578dab2, 0xec3b1300, 0xea89a3cb, 0x2eebc424, 0x57aaafc1, ++ 0x7b52fb73, 0x58d86d5f, 0x770e7881, 0x32df94cb, 0x63c70f60, 0xa76b437c, ++ 0xd3d70795, 0xf4efd325, 0x403f4eec, 0x627a06f8, 0x57864f48, 0xfd5f246c, ++ 0x207798af, 0xcc9f3f3e, 0xb7487102, 0x3ddff2ef, 0x4cdbb57a, 0x11c0ef7a, ++ 0xbb0e976e, 0xce1ac9b7, 0xfd0b7bc6, 0x1f1064af, 0x6f0ac81b, 0x0c727ae7, ++ 0xb0edcfbf, 0x8388aa6f, 0xd07b89a5, 0x3b3f50d2, 0x42131dd3, 0x149e0cfd, ++ 0x9db008d7, 0x3fbf7a2e, 0x06dfa18e, 0x3852419e, 0xfa2e3da5, 0x2ad60bbd, ++ 0xefa1efbe, 0x8df6ceef, 0x777cbe43, 0xc56ff43e, 0xdda8fbef, 0x85df3c99, ++ 0x74bf8658, 0xf53a5e31, 0xa1cbe59b, 0x1769d2f7, 0x56871dff, 0xf543df51, ++ 0x2a6fb37e, 0x1b7de3ad, 0x9d611f6b, 0xd7df7be7, 0x4449598b, 0x01bcdabf, ++ 0x45efa4ce, 0x2ca3e5c3, 0x0f9df883, 0xba688f0e, 0xf7e7c41c, 0x26fd0fcc, ++ 0x9bb45e74, 0x78dd71e3, 0x2d23e713, 0x65af4913, 0x3cbab14d, 0xfcdd95a2, ++ 0x83ff77fc, 0x80f3c236, 0xca18f3d1, 0x2361f0a3, 0x8169f7e3, 0x85fe8046, ++ 0x97ef2369, 0x715e44cf, 0x37cf0b6d, 0x8f99ecfa, 0xf15a17b3, 0xbac7e45c, ++ 0x9f9a9173, 0x47893a0f, 0xadd58a3f, 0x711557c6, 0xf9a65b3d, 0xda13dff1, ++ 0xf7e95460, 0x8e0f029e, 0x31c23f27, 0x7e97ba93, 0x05dd6a97, 0x16aba406, ++ 0x813de737, 0xed3ebe56, 0xbeed1e9e, 0x8cf8689d, 0xbfe7cecd, 0xb77cc283, ++ 0x47cddde1, 0x82229a99, 0x58ef7468, 0x400bfe0d, 0xe0c6335f, 0xd0fe2189, ++ 0xf8617248, 0xefa65efd, 0xffa83df9, 0x1cf8f2db, 0x716ceb46, 0xae51e207, ++ 0xf6e7627e, 0x45fe9d1e, 0x75f32eb9, 0x69aa5dd2, 0x17bdaf28, 0x3d532764, ++ 0x244fc3f1, 0xb9f1af5e, 0x7a47eb61, 0x1db07ec1, 0x3b3d35f4, 0xb827db97, ++ 0x347ef1e9, 0xbe613016, 0xfc9f269a, 0x73c06292, 0x350e7dbb, 0xafb1e91e, ++ 0xed113f25, 0x9a872ae5, 0x17411252, 0xce8c83fe, 0xcf78aaab, 0x5dfc54f1, ++ 0xf424cf0b, 0xd44eedd7, 0xe7a20bfb, 0xde8cfcf3, 0x57f59105, 0x77397366, ++ 0xf7b73643, 0x61336456, 0x8dc3453f, 0xc0a97de3, 0x77db8b7b, 0x518fd939, ++ 0x4e6e96ed, 0xf510f410, 0x7fe5f5be, 0x6d907ca7, 0x5ce9fbfa, 0x4fbc7c39, ++ 0xd202990e, 0xa58cf885, 0x8d9adefc, 0xbcd5cf9c, 0x0f705955, 0xeeb9d32f, ++ 0xd3f7ed19, 0xda2c80ef, 0x7180ab31, 0xd07845be, 0xb65171e8, 0xb8f500a7, ++ 0x8ed916f0, 0xb366a2fb, 0x5169f34c, 0xe05b2d5a, 0x46cdf1fd, 0xc46aefd2, ++ 0xfa678e7c, 0x0a6f09e2, 0xf7004c53, 0x9e2f8ae3, 0xe22dd7f4, 0xd6a24ef7, ++ 0x51deed01, 0x8f80464a, 0xe099e385, 0x1d023f93, 0x9e10361c, 0xd1efe116, ++ 0x25da3ce1, 0xcf1e4bf2, 0xe586ddf2, 0xe9dbb03e, 0x5ad6e1de, 0x1a2347ba, ++ 0x3e2dc7de, 0x62a5cfa2, 0xa33c1a3d, 0x39e0d1c7, 0x7d44f080, 0x9256d0e9, ++ 0x6547fe7b, 0xa07658a4, 0xd3d914eb, 0x7d67ba33, 0xdfbe2970, 0x8a8b7a08, ++ 0x77ef3672, 0x6b9ca0b7, 0x5477e996, 0x53f3baaa, 0x46bc9458, 0xb7eab1bb, ++ 0x110de2f3, 0x4da5b272, 0xcb49f8a6, 0x8bf1b998, 0xebc9fda9, 0xaa8ebe90, ++ 0x889294ee, 0xc1ecc176, 0x5f0e8178, 0x1aff1bd5, 0xacd4e38f, 0x34bad237, ++ 0x9cc00cbc, 0xc6b6ff88, 0x2068bf91, 0x6afd4c33, 0x6fa41a78, 0x4f4683c4, ++ 0xb650eed0, 0x0649e45d, 0xe5f51f88, 0x23dd4afa, 0x4792c9d0, 0x6fec5c60, ++ 0x4dee8db3, 0x3571d73c, 0x5be20c78, 0x232a6bec, 0x92e7b71e, 0x5870dbff, ++ 0xa3eb64a1, 0x50c3b0ad, 0x817905cf, 0x296a86fe, 0x5fdd01fc, 0xfba66dd9, ++ 0xde37ab5f, 0x578e1b7e, 0xc06cc47d, 0x57fdbefa, 0x4579a24e, 0x94e015e1, ++ 0x0fbd123d, 0xddb386e4, 0x7d03f011, 0xb6b7f682, 0xd379889e, 0xa29ec03c, ++ 0x7206507b, 0x7c119f01, 0xae6ccde0, 0xbb7b4177, 0xdf9be889, 0x5eb833c3, ++ 0xed7ad47b, 0x877deb51, 0xb7337d11, 0xe8b3d68f, 0xdf01b33d, 0x9af87a2f, ++ 0xf5aff402, 0xeb499bad, 0x4cf44bea, 0x97d5fdc2, 0xc08ffd0d, 0x0c3d172f, ++ 0x8efa2ceb, 0x10c6b675, 0x675d46be, 0xfb3b7862, 0x09f6758e, 0xf9d6d43a, ++ 0x63c6a291, 0x9f7fb35e, 0xe25fd0cc, 0xb86ef2cf, 0xf7e99794, 0x0f22fca9, ++ 0x8e31bfc0, 0xbbfb1ef2, 0x1ae8bdf8, 0xcef1801f, 0x440c1e91, 0xea657d0f, ++ 0x5f4869a6, 0xcc76ca0f, 0x775beda3, 0xf7f0efd1, 0xc836fac3, 0xfa13d476, ++ 0x80fc38ca, 0xeedc901f, 0x475ef6cb, 0xfa46fde5, 0xad63ac1d, 0x9d23fd7f, ++ 0xd236ef3f, 0xe40efaef, 0xc7cc377a, 0xf917cc32, 0x46e5c01a, 0x691aafae, ++ 0x8fcd2dfd, 0x607d6336, 0x5e7485f3, 0xd67cb862, 0xbd66b9c3, 0x4c87dbac, ++ 0xff3c6951, 0x7f7419c3, 0xe0670684, 0x0f6805b0, 0xf2c0f069, 0xe0860bbc, ++ 0xade717e2, 0xf7e02f51, 0x867e092f, 0x72e3c9f0, 0x208dcf02, 0x2bf3c31f, ++ 0x68abc9a3, 0x47ad13fe, 0x2348e4e5, 0xa8daabca, 0x165ca5df, 0x8a3dbe55, ++ 0xd545d46f, 0x83d547d7, 0x246ebe7c, 0x3943f3ff, 0x2556be7a, 0x41f9a8e0, ++ 0xe7e41e07, 0xd514ab9c, 0xf3cff684, 0xae7cb833, 0x72e59856, 0x3cfc97da, ++ 0x9ac2954c, 0xdef825cc, 0x93b48a6d, 0x7326bfa0, 0x39639422, 0x1576821f, ++ 0xc6b288a6, 0x5cf9b56f, 0xb1f7c39b, 0xfd87fcf6, 0xc6a39502, 0x19cdae2b, ++ 0x2253ae21, 0x6deafde7, 0xc9f6afb4, 0xdffa5764, 0x7d87f2e2, 0xb3d36a7d, ++ 0x36d7bc4e, 0xb4c1f29f, 0x71c347f5, 0x3c54f3a0, 0xff60defe, 0x679d1321, ++ 0x2a4aeaae, 0x312bfb23, 0xabdc223c, 0xfeb4fac5, 0xf8de95fa, 0x337a9139, ++ 0xfc8f8deb, 0xceaadc5d, 0x9ed02b53, 0xe405f805, 0xac7e3e08, 0xed0cb93b, ++ 0xa75feaca, 0xdb79e197, 0xdd9a3935, 0x3d6cfeaf, 0x667d9bee, 0xbff447f2, ++ 0xdf80df35, 0x2355bff7, 0xfdd3779e, 0x1d1ffd71, 0xe3f1c6cb, 0x05fbfa0d, ++ 0x76e1cdee, 0xc3e1b549, 0xff91d3ed, 0xbb9a94bf, 0x5cdfc23a, 0x7b21286d, ++ 0x786359f8, 0xf41bce01, 0xbbcc66fc, 0x9359fad4, 0x8d7cf2a3, 0x476f1f7d, ++ 0x436c70fe, 0x95b20956, 0xc8e37dfe, 0x723fedfe, 0xec9d8151, 0xf237348f, ++ 0xea8d6785, 0xb15edcdd, 0x6bdf71b9, 0x1838e1fd, 0x37dfec67, 0x05fd14b5, ++ 0x7cf847fd, 0x03fe4ca1, 0xfcc01768, 0x78dfad49, 0xe610fa83, 0x1b5fb381, ++ 0xf3b88ec9, 0xcc54fc9b, 0x8d378a6b, 0xbb419f1c, 0xbd079f41, 0xddadd68a, ++ 0x576d1de7, 0x9e5e622c, 0x7f651b67, 0x4782f769, 0xac3589db, 0x34af4d75, ++ 0x45045edc, 0x114812dc, 0x7f4e0fbf, 0x6fef241d, 0x59adf5df, 0x40724f7f, ++ 0xf10b4fec, 0x8fd82ae3, 0x14dfc8eb, 0xa05eff24, 0xee311e45, 0xc787307a, ++ 0xfb8b1fb7, 0x08de82db, 0x30351ebc, 0x3d7005c5, 0x5716626a, 0xe37648c9, ++ 0xcfb46c99, 0x1f8bdb86, 0x3aa31f93, 0x36329ef2, 0x5a3c6edc, 0x832d6c16, ++ 0x275d1d79, 0x9c18efd3, 0xfd18ddaf, 0x0d3bf6bd, 0xf13d0baf, 0x26cce628, ++ 0xacdd977e, 0xcf06af9f, 0x19fbf118, 0x94ffedd1, 0xc288edc3, 0xc1e6646f, ++ 0xa46ddf7d, 0xed713df3, 0x82dd37a7, 0xb465d9f4, 0x5f14aae7, 0x6079dfa1, ++ 0x0fca64fb, 0x163ae81c, 0xcce50cbf, 0x98e88bbe, 0xb39da0d9, 0x4938a64f, ++ 0x14a9e77f, 0x3f40a78c, 0x77f63714, 0xfa46ea3f, 0xfd1e6d1d, 0xc5f9f239, ++ 0xf1513d6b, 0xee3f1137, 0x805e3f6f, 0x60f81dfc, 0xfec1f23f, 0xfdc5af82, ++ 0x48a5bd5e, 0xd23f307f, 0x678207df, 0x74b4bf48, 0x9bde23c9, 0xe774c945, ++ 0xbd0abf33, 0xc3e616df, 0xf34329d4, 0x26c3506c, 0x1fffb394, 0x97541322, ++ 0x00008000, 0x00088b1f, 0x00000000, 0x7dcdff00, 0xd5547c09, 0xb3b9ffbd, ++ 0x24992665, 0x21258493, 0x02564c24, 0x26c27124, 0x04b0ea2a, 0x55869151, ++ 0x243788d0, 0xb41d9081, 0x9b4b697d, 0x8b520081, 0x4146bc35, 0xa0503a8b, ++ 0x2a17d168, 0x1bec5628, 0x96eb1140, 0x6d6d6ad6, 0xb0b8a269, 0x68fad0c7, ++ 0xdfffabeb, 0x49ee77f7, 0x69410ee6, 0xcf9f7bdf, 0xc39fad3f, 0xb3dcf7b9, ++ 0xdbf3b6fc, 0xce7399ce, 0x857142b8, 0x8cff3fa0, 0x2c4241a2, 0x54bd3fc6, ++ 0x219f281e, 0xfa9884e2, 0xd76ae55c, 0xb5ce2158, 0x7a28be6a, 0x2ac0715e, ++ 0x319400c4, 0xbd066f41, 0x7ae6ee1f, 0x60d623f9, 0x59a7d514, 0x80b3be27, ++ 0xcfbd2fda, 0xaea28bea, 0xc6fd6e0e, 0x7f7a763b, 0xe05d8b6e, 0x04238d3d, ++ 0xc84cb38d, 0x6e0765bf, 0x38d1a13e, 0xebb85f4b, 0xfa59c610, 0x17e3e680, ++ 0xfa0752d6, 0x1349b65d, 0xbff51a49, 0xa77efede, 0x05f37e53, 0x6ad957fd, ++ 0x9d112fae, 0xb534ac8b, 0xcfcd9ba5, 0xaf4ce885, 0xf6ab7ea6, 0xc5ee7947, ++ 0xf7c8c178, 0xf348bc42, 0x9dfe3069, 0xb6e1b397, 0x6f3ed443, 0x70e183ab, ++ 0x474425d6, 0x75b0bd3e, 0x4328120e, 0xb125e99d, 0x0fb9fcf4, 0x6f54bdd3, ++ 0xe57ff9f8, 0xf817f9e2, 0x52e2febb, 0xf01d881c, 0x85108c51, 0x917c4d5e, ++ 0xf7fefd49, 0xfd2599f9, 0x5a86d7b4, 0xc4281884, 0x88607b2e, 0xda1fde8f, ++ 0x277a59fa, 0xd39ee795, 0x5fdc7987, 0xb808bfd2, 0x4328c92c, 0x6c72812e, ++ 0x8226e7bb, 0xec2fc35b, 0x6d86debc, 0xa36f66eb, 0x3b79ebba, 0x39ea80cd, ++ 0xe62092ee, 0xbe03c2fd, 0x5d7eb0ca, 0x4ed8d156, 0x589a5df5, 0x2a38e5c0, ++ 0x8d2f31f3, 0x30eaf5e7, 0xd83aee59, 0x9fa73333, 0xcc3abcf9, 0xb438c42e, ++ 0x1d6e5c17, 0x978b7256, 0x025b47da, 0x680b2271, 0x10077bf7, 0xbe83359c, ++ 0x351a9a5a, 0xad164f3c, 0xed150e5c, 0x84223e5c, 0xe17b46ee, 0x42ce00f3, ++ 0x7e0025a4, 0xe18be056, 0xfd016299, 0xe1c0dd7c, 0xd690e8bd, 0xc1104817, ++ 0xeb6ff41d, 0xc6b0a756, 0x9d10e10b, 0xb628f871, 0xc3fdf660, 0x37fdbde8, ++ 0xf4468b56, 0xf8534d67, 0xad0479f4, 0xb9ee2fe3, 0x3bf8e1f1, 0xe9e2daf8, ++ 0x9f6eafe8, 0x7f514455, 0x45daf667, 0xddf68dc8, 0xbfb3b40e, 0xc64767f6, ++ 0x1343cc58, 0x068eb439, 0xc379e3aa, 0x183f9b44, 0x5ee59706, 0xccabc33b, ++ 0x59e5cb9b, 0x0ce8ff9b, 0x67acf7ea, 0x45e023b1, 0x05d3153f, 0x5e4f63f5, ++ 0x0ebcc0ec, 0x99d936be, 0xd825bc01, 0x1dd66f98, 0x7876e350, 0xe59e7fd0, ++ 0xf4499ed7, 0x4d9c7bbe, 0x1fc7a36c, 0x00dee4bf, 0xfde355be, 0xf3f12bdc, ++ 0x82513361, 0xe579efa3, 0xf0d3b9d8, 0xafa112fd, 0x692d1d03, 0x18508ab3, ++ 0x976c7ffd, 0x10bcaef8, 0x6149422d, 0xe6cf25df, 0x885e5575, 0xd431a113, ++ 0x7ddb25ce, 0x62e92b1c, 0x8fde3193, 0xffbe1251, 0x766b28c3, 0xc3c73cb9, ++ 0x4f6baffa, 0xf61bd530, 0xe78e78a7, 0xf06bd5f5, 0x5ba0148f, 0x5ad78138, ++ 0x3ccf0f83, 0x909ddbf2, 0xbe9a5d45, 0xa7547409, 0x429b4e75, 0xee4bac43, ++ 0xac6ee871, 0xb94223d3, 0x24ceb65f, 0xa71b0a11, 0x2705ddb7, 0x6e0fa7af, ++ 0xdf475e5e, 0x870cdd7a, 0xbf939b0f, 0x26a98e02, 0x9ff5f638, 0xc5e38269, ++ 0xf8f2e7fd, 0x7de7361f, 0x2ea3ff45, 0x34d7bfd1, 0xb37ebeff, 0xf935dc79, ++ 0x74471116, 0xa8dde6b5, 0x939b3320, 0x885e37fe, 0xd6ef8328, 0xbd3aa684, ++ 0x406ff0fd, 0x13154d4c, 0xeb5efde8, 0x19f1d074, 0xf80f62cf, 0x72409edc, ++ 0xdefa4ae9, 0x0d7e9fee, 0x90951bf5, 0xfdfa0498, 0xaf166f4f, 0x4684b3eb, ++ 0xd2cfe3a6, 0x2c035b46, 0x504b1bdf, 0xc2b4335f, 0xbad9bcca, 0x837de589, ++ 0xfb1f8e53, 0xf8253102, 0x30672ae7, 0x3b9fda87, 0x9ca796f0, 0xa69599c6, ++ 0xae3bc6ff, 0xe3b13e6f, 0xb3c0145e, 0x830fafd8, 0x43c7b81c, 0x40fccb7c, ++ 0x75eb4d7c, 0xd763fa68, 0xdf883f10, 0x541d8945, 0x87d2e67c, 0xf8f8c27b, ++ 0xf3c1d7b8, 0x85486e23, 0x36880c5c, 0x9ff61b2e, 0x897b3867, 0xf52eb17f, ++ 0x337441be, 0x62d7c1dc, 0xe6d26830, 0xf5fbf7e5, 0x7d0525e1, 0x37fd50f3, ++ 0x580eecbc, 0x5ea2ff88, 0xc038eff8, 0x7bad9cf3, 0xf6ca8fa6, 0x7098d603, ++ 0xe0ddfef8, 0x7f69c993, 0xe7a4ec2e, 0xe48ef8f5, 0x517e37d3, 0xa7f21c33, ++ 0x10bbaa3e, 0x8bf43ef3, 0xde4217bf, 0xcd42f67f, 0x45df3c30, 0x9cbfb1ed, ++ 0xfbd77473, 0x16cbfac2, 0x4265809e, 0x0367f95f, 0x77cf910f, 0x0432d0bd, ++ 0x624dd8f3, 0x38d22448, 0x8e63d54d, 0xfc1c8127, 0x119c843f, 0x60765f24, ++ 0xc73fdb7f, 0xff52b90a, 0x543110b6, 0xdc9cfb1f, 0x89a6c7df, 0x53f085a0, ++ 0x0bdbc2ff, 0x71faaf80, 0x96858f0e, 0x11d45d12, 0xa3ef4d5c, 0x1a3d39c7, ++ 0xaa6bffb5, 0x7d81df1c, 0x17df0b3d, 0xf96f0127, 0xfcf16724, 0x5b07965f, ++ 0xe841e422, 0x69bbf5d7, 0xe76b3abc, 0x9201c84c, 0x8832430b, 0xff5fea5e, ++ 0x5ef91bf3, 0x041ee8b4, 0xa862fcfc, 0xa32df71c, 0xfa19199f, 0x9dd3b430, ++ 0x495df79d, 0x4fcde6ed, 0xae09d749, 0x43a11665, 0x0419898e, 0x5740ab94, ++ 0x0bb30525, 0x575fdbfa, 0x5e7b5cb3, 0x21c075d3, 0x61f4e290, 0x2a95199f, ++ 0x5704299c, 0x9ccc1c91, 0x6616e34d, 0x237a0c58, 0x8f79a3ae, 0xe4f8d634, ++ 0x0915f690, 0x13059fbc, 0xecff4741, 0xf86757b8, 0xec0c65c7, 0xfcf6ff6b, ++ 0x7ef40bdb, 0xce1417f8, 0x2fb47078, 0xebbb3cc7, 0x846dbedc, 0x15e0dfbf, ++ 0xf9e3f77d, 0xe92b2151, 0xeeece759, 0xdfd11af5, 0x8e8b31bb, 0xec78240c, ++ 0x0053eb73, 0xdeb7059f, 0xed750eb8, 0x05779250, 0x73acb9e8, 0x73e9f03c, ++ 0x7de037e9, 0x361f53ad, 0x26789688, 0x8f1e1f4d, 0x4924b8cd, 0x149449e2, ++ 0x7f3bf494, 0x4d329f39, 0xe9665f8e, 0x0d4af478, 0x0b3eadfb, 0x1d5ba9eb, ++ 0x5b4ef52f, 0xafe678c7, 0xbfb90335, 0xd5510e33, 0x24faefde, 0xeb198e3c, ++ 0xd7176839, 0x1e75a05d, 0x6bef18dc, 0xdc5779a1, 0x06a2eb73, 0x252d2b2a, ++ 0xd3564283, 0xf9e4effc, 0xa586ca07, 0xc675fe90, 0xc9bfcc6e, 0x93cdbf98, ++ 0x91d7ce1b, 0xfa516ff3, 0xe0b477c5, 0x18830c8e, 0x206cfea9, 0xd52f7821, ++ 0x7fe72ca3, 0x72fb0733, 0x7d87c581, 0xf1344b79, 0xde2168d8, 0x08f9e634, ++ 0x91339ff1, 0xf3c7af9f, 0x7df968e4, 0x609683f2, 0x325f7d0b, 0xd7c639f9, ++ 0x3eddeb8f, 0x26558d2b, 0xfcd17048, 0x81df85ca, 0xe9387ff9, 0xd2742fef, ++ 0xa193beba, 0x771d6137, 0x7fd25926, 0x47d0f3c3, 0x347e82cd, 0x4be3ae51, ++ 0xc75e43f4, 0xb3b1e16c, 0x58362512, 0xf6cc1fb0, 0x6a54a5c8, 0x08e64f92, ++ 0xcde31dbf, 0xfbb73a13, 0x1f8759f5, 0x09affffa, 0x7de682e7, 0xf3f008ab, ++ 0xe5c82285, 0xedc422ed, 0x5c9d10ef, 0x3a26f057, 0xa48073b9, 0x5b078f93, ++ 0x03f7fe19, 0x298abfdf, 0x75a26b4c, 0x3c34dacc, 0xb6cfa047, 0xaf9f0c81, ++ 0x832cf79a, 0x378f887e, 0x4b9e3e2b, 0x29beccfd, 0x0ea78f82, 0xf9ccf854, ++ 0xe8ea7e32, 0xdc77b5e9, 0x1b870429, 0xe0de940c, 0x477b61af, 0x57ef0f08, ++ 0xb7f8335f, 0x0316ead8, 0x5e1d3f08, 0x17306fb2, 0x18faf6bf, 0x649f4faa, ++ 0x3cd2f715, 0x78255e5e, 0xc8b97b3f, 0x315a641a, 0x46999bec, 0xcd2633bf, ++ 0xed4f1359, 0x39de7da6, 0xf4e54436, 0x847f64a1, 0x071bbbc9, 0x40935d6c, ++ 0xe6d94de5, 0x0e8b37e7, 0x233ae01b, 0xccaf6cdf, 0x776e6b1c, 0x0e426310, ++ 0xf82b5689, 0xb48640e8, 0x3148c437, 0xb7c60bf2, 0xa7af84b0, 0xc779c667, ++ 0xf9c79a39, 0xe030fd0c, 0x0f96e2b9, 0xc04c8917, 0x063ebc4d, 0x721bc0fb, ++ 0x1e93ef5d, 0x8e281449, 0x418ed337, 0xa447d67a, 0x09fea16f, 0x4f2845e9, ++ 0x3cb97b36, 0xde0c7a4d, 0x71f66d9f, 0xc966707d, 0xf177e86b, 0xc06d4ffa, ++ 0x092e3dcf, 0xd6f6aaef, 0xf5569869, 0x2823f6fe, 0xd325422b, 0x392eddb0, ++ 0xe50478da, 0x5676bd3d, 0x2ced93a3, 0x1977de63, 0xec577a74, 0x080b9bec, ++ 0x673d77ce, 0x6d3d71f5, 0x065b9cf6, 0xfae76ea0, 0xeea8e8a5, 0xe90cd102, ++ 0xff56f54b, 0x7fcbcc31, 0x1248eba0, 0xe6e3efad, 0x13ef3c09, 0xf79e7ecd, ++ 0x5ce9e6a9, 0x8e4b32fa, 0x29f13b73, 0xecb799eb, 0x52a5b2ee, 0xe6bf62fb, ++ 0xe75edf07, 0xf120c117, 0xdcbb66df, 0x7ed3360f, 0x549e3e00, 0xbb91fb30, ++ 0x7eb5e405, 0xbbcfdf16, 0xc6315969, 0xcca13999, 0x7eb77686, 0x4652442e, ++ 0x157e9d1f, 0xd7f5abdd, 0xf33b7819, 0x78e18d0b, 0x1afde2c6, 0x2fc09ef4, ++ 0xf77fbcad, 0xd4aa68d8, 0x23bbcf7f, 0x85a20183, 0x06b2fb15, 0x61587f43, ++ 0x0c4e0ef7, 0x114e87d3, 0xbe98453e, 0x7fc9ea7c, 0xdfc3d64b, 0xf67fb627, ++ 0x3fb1c87b, 0x9a46394a, 0x430f47cc, 0xf64d0dce, 0x6b3c8ec1, 0xdfa409d8, ++ 0xabbf60c5, 0x71df1077, 0xfa851f5d, 0x677168a9, 0x3fc7d509, 0x7c193a95, ++ 0x82a0f184, 0xfb953929, 0x6fcca6d4, 0xdbc6fb7b, 0xfbf95ed5, 0x267ea987, ++ 0x69d80968, 0xda233a3f, 0xeb1cfecf, 0x41f6eeda, 0x6cd3cb9f, 0xd74c4dd1, ++ 0x3cdbe641, 0x226b6bcd, 0x53f8f439, 0x91f90c8f, 0xc42c7ec0, 0xfcff7a04, ++ 0x539618c6, 0xc77ddbcf, 0x23fdf09a, 0xfc9ffbf2, 0xefef9be0, 0xdd5f7947, ++ 0xbfa26fe8, 0xa7ee44cc, 0x8d97dfe2, 0xff69bac4, 0xdfd42916, 0x42d59f4f, ++ 0x0a2142ae, 0x4eae0eda, 0xb15cf9a1, 0x8432cba5, 0x5aeda2ca, 0x6951ca0b, ++ 0xdf628fd3, 0x32f4cc2c, 0xceecc65e, 0xbd82a6b0, 0x7f7f0486, 0xe6ebef3d, ++ 0xedbf3efd, 0x4443c9d3, 0x523fbedf, 0x8ab93f6b, 0xda4f7ef0, 0x9f59a33b, ++ 0x8f3cad15, 0xbce6077d, 0x83af3b75, 0xbbcc0a34, 0xfde3e1cc, 0x0ad81825, ++ 0xe7a33b3a, 0x2e7f58f9, 0xfc043c09, 0xf907d19e, 0x433cdfb0, 0x68d5f4f6, ++ 0xebc6cc7f, 0xaffb767c, 0x895fe0e2, 0x45d53b27, 0xba8aebef, 0x5d7da1a7, ++ 0x1e80579a, 0x61bd1ed2, 0xbf53e03a, 0xee56df77, 0x83e9d6a7, 0xefb559bd, ++ 0xe85491fc, 0x5f0a3781, 0xaf6be80e, 0xaa7f7fac, 0xa5a567df, 0x8bfd6d56, ++ 0x709477ac, 0x7bb484bd, 0x4b97da1b, 0xb19367fd, 0x42ce89af, 0xb24c7796, ++ 0x7d7c3ede, 0xfde35e9f, 0x4a408ce6, 0x3f6fbba3, 0x566c7da4, 0x21c05826, ++ 0x7c98efbf, 0xe5c33a7b, 0x8731f732, 0xfea91fb1, 0xc0443936, 0xd1a4fd45, ++ 0xacfb0d73, 0x3bbfee43, 0x5e806e48, 0xe34bfed4, 0xefca6596, 0xa99790fd, ++ 0x2f60ad56, 0x537523c1, 0x970feb14, 0xf882fe3b, 0x2b1fbc75, 0x5a21aa3d, ++ 0x3416b7ca, 0x71dfefa1, 0xb49975eb, 0xff634afe, 0x3e6f3616, 0xdc978bf4, ++ 0xd64cfafe, 0xb1d3baa3, 0x5717da06, 0x256f5ea0, 0x4c2b2abd, 0x5e2772af, ++ 0xc278bed6, 0xf7c26fed, 0x727edb97, 0x1e33cd0c, 0xc8a3b2a5, 0xce57e8aa, ++ 0x876eee66, 0x4a207d9c, 0x31d8d9ca, 0xfad44f2c, 0x4c3ffb22, 0x5c93ae7c, ++ 0x09f68979, 0xc53f609d, 0xf8c6c93d, 0x7b52d17c, 0x62d7f684, 0xd9080239, ++ 0xeb963096, 0xdf8258fe, 0xe855b754, 0xaae7d8fd, 0x026d7c24, 0x880da6be, ++ 0x1e2bb531, 0xff00e090, 0xadbaee5e, 0xd1ac7e06, 0x0ef17f6a, 0xd6feee10, ++ 0x9779d72d, 0xc060dc6b, 0x7976b265, 0x56cb7deb, 0x30f004f2, 0xfbc45dc5, ++ 0xacf714dd, 0xf9e0ba63, 0x91fe63b7, 0x8f5c8ceb, 0x1e9e5e70, 0x044d75f4, ++ 0x4fbfe02c, 0x3ae7ec1d, 0xe9fcef60, 0x0f3c107f, 0xc1f7cb2c, 0xb2067f1e, ++ 0x9c49f616, 0x03d4f583, 0xb90022b1, 0xa0d66072, 0xe7f2ec20, 0x6e420761, ++ 0xbdf2140c, 0xb03fb64b, 0x1bef1070, 0x3ee4a243, 0x368f6e22, 0xf181a7fa, ++ 0xfcc1aafd, 0xf8d68b7d, 0x5fbe016a, 0xe772c315, 0xdb94a0dd, 0xdba1096d, ++ 0xedbcf4ad, 0x76815cd3, 0xfae08aef, 0x695bb44c, 0x3ef476e5, 0x6dfa81b5, ++ 0xce52365b, 0xde561ff3, 0xfc8ada27, 0x966e8929, 0x6a4fece3, 0x494fe59b, ++ 0xc0d92b80, 0xf956db57, 0x92fc087e, 0x75419f78, 0x976f7f2a, 0xda336fed, ++ 0x4ba0cefd, 0x039673e2, 0x1b18ccfa, 0x991ffce8, 0x7f314f8b, 0x468a7f08, ++ 0x915c3fe3, 0xdbc2bec3, 0x60cc6faa, 0x12fc31fa, 0xadb90c0b, 0xce07c3fa, ++ 0xe583d0f1, 0x1dcac2df, 0xbcf3d02e, 0xed17572a, 0xaadde2c0, 0xcbb0b1d5, ++ 0x50d6e9e7, 0xb9c5f414, 0x7d5efec5, 0xfae3132c, 0xca15b8e5, 0x03950bbe, ++ 0x76e8bfae, 0x6f597b8a, 0xb7098d0f, 0xeb7e1497, 0x852527da, 0xa2cbc5db, ++ 0x11397ca4, 0xe7f6f92d, 0xd15ffa31, 0x1bfec36f, 0xe5edc293, 0xe36b9585, ++ 0xf18cdf98, 0x93fb374e, 0x1f43678e, 0x1aa5ce9b, 0x7d338d4f, 0x11afd3b6, ++ 0x46f67a7e, 0xa77b3eb1, 0x510de741, 0x5790f9a1, 0x91dd2e8d, 0x4faa7185, ++ 0x076f8216, 0xc78bcecc, 0x62bdcffc, 0x8e4fb015, 0x1d877819, 0x1a06b806, ++ 0x845e9963, 0x9dbfd751, 0xe91176c4, 0xfa5f4c93, 0xaeb8a3fd, 0x9529fc3b, ++ 0x4415dfa0, 0xc707443f, 0xb1fdf23c, 0xbfa604da, 0x5e6bfbd2, 0x63df0413, ++ 0xd3a60e25, 0xecac0763, 0x9343fabf, 0x3820e435, 0xe17d9d9f, 0xeefa5cc1, ++ 0xc60fcaec, 0x73b2a66f, 0xffac7bf5, 0x9baeae97, 0xab4aef81, 0x3ec4ce57, ++ 0x2a3e2977, 0xf3828dad, 0x636e17a3, 0xacdefcb3, 0x85df5881, 0x6fea1623, ++ 0x43ed4d48, 0x96674095, 0xd7f5839e, 0x01eb3a3b, 0xffe7fa8f, 0xe5bb0e98, ++ 0xd93f73dc, 0xa7ca8473, 0xfc11f563, 0x190df57e, 0xad99d16b, 0xadf0173b, ++ 0x40be11b7, 0xd87ec63f, 0x2bcfd060, 0x1815fa59, 0xcbf576a7, 0xe4c767ac, ++ 0xb5f94877, 0xfef8f2f2, 0xcf1d81e4, 0x4d5df468, 0x2e7a81f4, 0xcc42c1ad, ++ 0x8a1694eb, 0x5700b2d3, 0xf69cff69, 0xa812e284, 0x2f522dd4, 0x5e65d9ab, ++ 0x90754f2f, 0xefa15fe1, 0x7eadda6a, 0x413bdb17, 0xd91fe607, 0x739e86be, ++ 0x5e7ccbbb, 0xf3e5da2d, 0xb83ffd84, 0x143fe246, 0x7c9efc22, 0xf01b673c, ++ 0x4fdf667f, 0x497f1772, 0xf9e2e31c, 0x069ff5ca, 0x4f5c11bd, 0xe83b13d3, ++ 0xc994776d, 0x78fb3f0e, 0xcede898a, 0x083c3e3e, 0x9efd573e, 0xf08be435, ++ 0x059f8fb5, 0x8fb7f03e, 0xe4aabe87, 0x17b6708a, 0xd79d1db2, 0x51bb085e, ++ 0xd25123c9, 0x83cfcb9e, 0xff68b9ed, 0x25fa458c, 0x3fd5b8d4, 0xaf7add4d, ++ 0x2c06aff4, 0xb51f5163, 0xefd5750d, 0xf86fad57, 0x3ea98766, 0x7fae6822, ++ 0x0dfa4b23, 0x9e82789f, 0x1ab77e4b, 0x2af09cf6, 0x1ea57a3c, 0x9df970cc, ++ 0xeee5c143, 0x355f9254, 0xcf265b98, 0x27fdca5b, 0x99e2ffa4, 0x72153d22, ++ 0x43d62cf5, 0x81267cf3, 0x43d0f9ea, 0x5d55bce4, 0xde7221c1, 0x24b77fab, ++ 0x6dcc7e15, 0xe5dfca59, 0x69fa0c1b, 0xd5394971, 0x203b2762, 0xd561f61f, ++ 0xd836e398, 0x0ae4be8d, 0x961c1f5b, 0x82722e6c, 0x296e97fe, 0x43d38672, ++ 0x4731aecb, 0xa7166769, 0x987cd977, 0xf82d8b72, 0x2db9e803, 0x01edacbb, ++ 0x7e9defc1, 0x7dda7f6a, 0x5bb40de8, 0x346125b2, 0xfdf552f4, 0x92e3cdd2, ++ 0x39e6c22b, 0x9e19976a, 0xfae6ed05, 0xf5cdfb15, 0x06d5d0dd, 0x15dff3fe, ++ 0x31f5cc85, 0x8ff5cd47, 0x7cf7737f, 0x35955d90, 0xf42b03f0, 0x1da6f7ee, ++ 0xc9f23ec5, 0x01c6cf33, 0xac7f353f, 0x627b0238, 0x9c3366e9, 0xf41a6f09, ++ 0x8d4ec0ed, 0xc165d1f7, 0x9fe8fe48, 0xc558856f, 0x3a2837fa, 0x45aa4e9c, ++ 0xe32d88e0, 0x44a7f6e2, 0xd13f7cfb, 0x8ad36d55, 0xf4c7c731, 0xfb557bf5, ++ 0xa1f40746, 0xc52f71c8, 0xf7edc2a7, 0x3654afc2, 0xbabbbe41, 0x80f8b269, ++ 0xe1b124b6, 0x7f40d357, 0x78d7df65, 0x7a7b2dff, 0xd3908bf8, 0xde167b5d, ++ 0xe9fce5c4, 0xefe50f0c, 0x0b407a5a, 0x33dd52c5, 0xe56dd241, 0x68282d66, ++ 0x44d78bde, 0x71e03e29, 0xe798362b, 0xfccda4b1, 0x83fee97e, 0xb95c457f, ++ 0x03a8f9ca, 0x16d558fb, 0xe75a7bf3, 0xd537d861, 0x77f6089f, 0x22ff6f54, ++ 0xae5efcca, 0x23ad52ab, 0xfac09d70, 0x7a4d96ae, 0xa8e394f5, 0x4bff1c90, ++ 0xc829c97c, 0xb6dbabf9, 0x3ab7015a, 0x93c37fa1, 0x287bf6c5, 0x24b1e686, ++ 0xd1b1f48a, 0xbaf2ffbc, 0xe78e6fce, 0x173d3978, 0x5e7e7a2e, 0xbec78c74, ++ 0xac6f7e7c, 0x3a51c64f, 0xbea87bc6, 0x5b80ea94, 0xf8656895, 0x5afe42d4, ++ 0xc3f8bd25, 0x853c0be6, 0xb4ab45d7, 0xa16d6a67, 0x8d438083, 0x80efe4e8, ++ 0xb576f0bf, 0x1377aeb4, 0x7c447fa1, 0xf7ec7c2f, 0x183b706f, 0xbffb0d6f, ++ 0xaf7f0a88, 0xef652aec, 0x63e7bf29, 0x8345b7d5, 0xfe6ad7ae, 0x94569c87, ++ 0x40473dc1, 0xbcdccbc7, 0x55b6dfef, 0x3836f3ca, 0x6e17a0bd, 0xe5fac11c, ++ 0x173f9a6d, 0x5d1b15eb, 0x25b65f6c, 0xe2d633f8, 0xa53cacfd, 0x1f900637, ++ 0x3a2cbdd0, 0x8bef0db8, 0xb6dabea4, 0x87f59730, 0x10f6b5e7, 0x01e070e4, ++ 0xb36d2fc9, 0xddb4fd24, 0x7fefc297, 0x40a6a98f, 0x4a7a94af, 0x52e1c6db, ++ 0x79cab5ef, 0x5963fb88, 0x1865b63e, 0xe5e81af3, 0x72bd2979, 0x911f4783, ++ 0x9d6fb03d, 0xaf49ab15, 0x77c41e44, 0x1ffe02ad, 0x59749551, 0x630ef9fb, ++ 0xe8deea9f, 0x7f3fc20a, 0x82392b5c, 0x776a8b38, 0xfb94b675, 0x77fb27e3, ++ 0x8fd8ed1a, 0x7599615f, 0xef18f5ef, 0x25b78b41, 0x7efe0c23, 0x82ec2e7f, ++ 0xa35d1be3, 0x93f1a781, 0x58e61fa5, 0x31df9491, 0xf11f8563, 0x32d929fe, ++ 0xdb253b3e, 0xa3932a62, 0x9fa92e89, 0x9fd2c5e3, 0x84b63b1b, 0xab845efd, ++ 0x53cbfb3b, 0x4fd19af8, 0x97e4a385, 0x1f33f6d7, 0x55311f05, 0x72f8e7e2, ++ 0x179c9b6d, 0xe3ea97e1, 0xfec5ddff, 0xfec6e3b2, 0x7442f0a2, 0x5bf78e34, ++ 0x346d7e43, 0x25e367e8, 0x1f4cc7e9, 0xe47d91b7, 0x7d10fd02, 0x04131e30, ++ 0x7d14ebfb, 0x3d30fd10, 0xcb17df74, 0x31fa2770, 0x418463e8, 0x0dfc423f, ++ 0xed2c53f4, 0xa88f6523, 0x1eca5f75, 0x01a8ba21, 0x4bb6f45d, 0x3c458ee8, ++ 0xb083d14f, 0x597dc705, 0x84f1617c, 0xa11af184, 0x0226d522, 0xec370451, ++ 0xefb70c89, 0x69ab82d9, 0x126d431e, 0x4936693f, 0x04bbb487, 0x7b7347a2, ++ 0x65ea83bf, 0xfc2a5c3f, 0x552cbed4, 0x9b275fb0, 0x44f891f4, 0x44a04efe, ++ 0x7f0ace18, 0xbef89507, 0x5ff65e2c, 0x57045836, 0xdf9fdc6b, 0xb5086892, ++ 0x0a1f88f1, 0x7df01bd6, 0x3efe68dc, 0xfbdf9160, 0xcb0e546d, 0xbdd3fc92, ++ 0xb0f98a36, 0x5cb49eec, 0xc98ccbd0, 0x96397a66, 0x5503f52d, 0x096488de, ++ 0x63242fa9, 0x66bc597f, 0x2d2fef04, 0x7dba92ae, 0xd293fb80, 0x775b282e, ++ 0x30e32dc7, 0x7c92a7bf, 0xce4e6150, 0x8571c3dc, 0x7e166bc5, 0x13d86dfd, ++ 0x7cfc5cbb, 0x30fe8e49, 0xf3527ee0, 0x0f47da2e, 0xec3bcf16, 0xf5efa648, ++ 0x7e6759f6, 0xc0cce54e, 0x3fa0379e, 0xe56b9ccc, 0xf48533f6, 0x72358a6f, ++ 0x9f025b9c, 0xbfa992da, 0x1c6a265b, 0x7972ef26, 0x9e2397d2, 0xa777e060, ++ 0x2e2d87c1, 0x6e67e0b1, 0x372d2bcc, 0x02df9e93, 0x3d1fb20d, 0x2f8303f6, ++ 0x5b69265a, 0x9b0d07a0, 0xb550f922, 0xf7e83f47, 0x7b77c184, 0x3aa8b80c, ++ 0x57db95c1, 0xcaea8fac, 0x0f69438a, 0xe072a70d, 0xb2fbc9f0, 0x4c8cfde9, ++ 0xe0336d31, 0xe72b4dfe, 0x44b9747f, 0x4779e988, 0x1741e301, 0x60f75ddd, ++ 0xf147db7d, 0x7926bafa, 0xd98457d2, 0xc11e95b9, 0x24d7407a, 0x3a783e43, ++ 0xffa51363, 0x72dded87, 0x6c3e0483, 0xe201f96a, 0x9d2be5a4, 0x2a37d85d, ++ 0xf1c3981f, 0xb236f2ed, 0x165f6977, 0x2ef6cc1b, 0x67afa5d9, 0x46bf63f7, ++ 0x11a0a9da, 0x06c54dd0, 0x586ee98d, 0xc291cf8b, 0x60f34df2, 0x50ee153d, ++ 0x857fe436, 0xfbc3e5cf, 0xcfd8ec8b, 0xe1e3ce09, 0x0c9c154f, 0xffa39dd4, ++ 0x6b29701e, 0x31bb632d, 0xb9675f26, 0x704acc35, 0xde807f01, 0x05f83700, ++ 0x9d6c8f21, 0xfbc3e029, 0xce1d25b2, 0xbae4f448, 0x025d8e99, 0xeecba0f2, ++ 0xbafcc5c9, 0x882cbad6, 0x2d58cce3, 0xccf899e9, 0xbfefa369, 0xe0d11367, ++ 0xef8c27ff, 0x4ad9574b, 0xa87d52b6, 0x1362d853, 0x4c454f41, 0xeb870bcf, ++ 0x4faf307b, 0x402623be, 0xb0df283f, 0xa0cbce51, 0x98eb6107, 0x7ce3449a, ++ 0x346323b2, 0x7e8aeafc, 0xdc9f0e16, 0xd2f63803, 0xf18d5cc1, 0x0a39eb4f, ++ 0xe1c0e57f, 0x3de02f8b, 0xfa083f3d, 0x94393198, 0x5b16fc0d, 0xf61f856b, ++ 0x41f0b27c, 0x9211e89f, 0xdbd67bbf, 0xb929ae58, 0xd107e4a2, 0xa839df83, ++ 0x8e4adf0f, 0xa9a66cec, 0x35779c11, 0xa27cb93b, 0x246c23d9, 0x27377603, ++ 0x66a9fd73, 0xcded972f, 0x67fcfc79, 0xefae3ecd, 0xf5c09e6d, 0x5cfd9a67, ++ 0x9d3cdfdf, 0x97379fcb, 0x0f8273f0, 0x672521cb, 0xf4523c94, 0x2452e4a5, ++ 0x30222d5d, 0xbf9a375f, 0xe4a7f967, 0x1961d61e, 0x148f27dd, 0x27ebed9e, ++ 0x68cfd859, 0x7ad8b9e0, 0x0167c9fa, 0xe7372a87, 0xc5c2f62d, 0xa4b864ed, ++ 0xd87ec43b, 0xfdcb2deb, 0xed84f75d, 0x6957b7bf, 0xb74616c2, 0x84ba3477, ++ 0xefae8c2d, 0xd5304a6c, 0x7ade9b4b, 0x7ff53069, 0xcfcf4e3c, 0xeefbbc81, ++ 0x96fc8f47, 0xddf63f9e, 0x3bc03993, 0x26c763cd, 0xda32bb8c, 0x9ca74798, ++ 0xef074ad7, 0xff0cc35b, 0x619cfe0e, 0x196597f9, 0x04fc6f09, 0x22700d72, ++ 0xf03dfefa, 0x83fcf043, 0x06639f81, 0xcad6ca7e, 0xa02bad7d, 0x5fb43505, ++ 0x7ae9f063, 0x279aa782, 0x14fdf3c1, 0xd90319d1, 0x710217ed, 0x93bff795, ++ 0xd6be0e9b, 0x852a98c8, 0xcbfd6cdf, 0xad1c62ef, 0xcdeb28e9, 0xf9cdd3ba, ++ 0x3f602202, 0xd68fde1d, 0x89db8474, 0xbca6a1ce, 0x7eb198bc, 0x4d03fa07, ++ 0xf38b5f03, 0xb7f0090e, 0x403cd568, 0xbcf18551, 0xfac6bd62, 0x9cf78288, ++ 0x53f32b1c, 0xcb8db66b, 0xb675e033, 0x3f795a5f, 0x724a7452, 0x2aebf383, ++ 0x4b1c8b5a, 0x62efe4c2, 0x9e7979e3, 0xd77f94c5, 0x7ee0ed9a, 0xe86980ce, ++ 0x65e6f7ff, 0xde592a3a, 0x0fa01d79, 0xde717ed5, 0x639975e8, 0x60b20fd1, ++ 0x33bfbefa, 0xb7dfc6c7, 0xbee47b66, 0x2b7da4e5, 0xfa51f396, 0x6f4aff95, ++ 0xbcff04f9, 0x76cfe78a, 0x3f53f554, 0xad710a7d, 0x78a2f7ea, 0xc2beaa1f, ++ 0x07e43bf0, 0x7d61cfc7, 0x68d6efc7, 0xde06f59d, 0x8ff4fea7, 0x6a03c871, ++ 0x8bfd2bd8, 0xaca17654, 0x7ec5595f, 0xf11f7aae, 0xabe42245, 0xe2fc2e39, ++ 0x75c5ef53, 0x90227fb2, 0x7283e46a, 0xdefd535e, 0x49df380f, 0x7e4537e5, ++ 0xce7da0d7, 0x7b8aa876, 0xf16378ab, 0x97e6760b, 0xf634e786, 0x3bec3613, ++ 0xadf2083f, 0x83b585e1, 0x893fcbfa, 0xc1c557ec, 0x41ac1f95, 0x0ad4f86c, ++ 0x043b21ba, 0xff6c8c70, 0x6e231cc3, 0x92b8a57d, 0xc1361cfd, 0x8c2b0a79, ++ 0x609eb1bc, 0x12f8bc4e, 0x66c351ff, 0x8831fe62, 0x91e37a87, 0x4c8e7b3f, ++ 0xf4f0fead, 0xa7dc8e6e, 0x213f10cf, 0xb76e7a1e, 0x73c4f595, 0x7f9963bb, ++ 0xf0ff77ea, 0xf5abe208, 0x670e35db, 0x860e89d5, 0xab5efd5b, 0x85c98670, ++ 0x926ff806, 0x9acf3d2e, 0x8236c69f, 0x6bb596be, 0x9f341dfe, 0x7e37a71e, ++ 0xf67cd860, 0xaf7a48e5, 0xcf1f6a89, 0xffe63178, 0x524f4353, 0xf81d96ed, ++ 0x51f7e721, 0xbfacb3bb, 0xc70c47fc, 0x7ae7697d, 0xb53cf303, 0xf60f8c65, ++ 0x3df6b2eb, 0xd88758f5, 0x12c1e31d, 0x727e1a4f, 0x6341cfd5, 0x523983bc, ++ 0x788538ef, 0xca7fbe01, 0xe60e76ca, 0x693cbe09, 0xefaaffe4, 0x7bbe365e, ++ 0x43ea4739, 0x0e1608b5, 0xacbf6bec, 0x9b2e2bbd, 0xffbc7fda, 0x657f2e2d, ++ 0x7732cdf0, 0xcff62147, 0x4cc6f78f, 0xa3f9720f, 0x78d3cf69, 0x0d27da67, ++ 0xecf8c2d0, 0xf25d8e78, 0x779916fd, 0xaf2a8228, 0x73d79da8, 0x06aa776a, ++ 0xe01d5eff, 0xb539f04d, 0x0b38e9f7, 0x7fe071f3, 0x40b65f96, 0x97e785b3, ++ 0x7ffa6975, 0xe31e848d, 0x78c874ec, 0x5fe1b755, 0xbfe9dff9, 0xa5de78de, ++ 0x74e31895, 0x19df243b, 0xc18f7e71, 0xc1fcd677, 0x5745ffe0, 0x1dbd6f78, ++ 0x9955f3f2, 0x7a8627a7, 0x5bcec137, 0xdb1266f4, 0xa3ef88e3, 0xecd7e7fe, ++ 0x3459771c, 0xc92b90c6, 0xe7e0e39d, 0x7a90caec, 0xe27aed44, 0x0d690244, ++ 0xe08057d1, 0x08b41b57, 0xb971ea9d, 0x53a78c99, 0x8e0eff44, 0xe172847b, ++ 0x10e63cff, 0xf1f42b01, 0xafd8b99f, 0xca199b5f, 0x14f95f85, 0xdaca89f8, ++ 0x126e50c4, 0x9d0670fc, 0xf7a6ced4, 0xbb52f461, 0x3d0b942d, 0xfa43b4e9, ++ 0xf61ef117, 0xd968ed50, 0x73c32bae, 0x7ddaed96, 0xab7a02b1, 0xa658d9e5, ++ 0xb89fbac3, 0xed8545b6, 0x52b9a9c3, 0xd87ea62f, 0x29d81abf, 0xae2cb3e7, ++ 0x6d39fb95, 0xe8b2f7d0, 0x31df9e56, 0x996c6f23, 0xecbbd643, 0xdd1ce382, ++ 0xbdb1478f, 0xe3a53277, 0xf2738c19, 0x171c11f1, 0x2e08caef, 0x49efcfd9, ++ 0x56f823ff, 0xc215113f, 0x1e3c4ebc, 0xe9a6fecb, 0x08bcdddf, 0x47b67bed, ++ 0x277f9069, 0x32470a06, 0x18ec4fd5, 0x09f6fbc8, 0x9171cbcd, 0x7124af13, ++ 0x4dcdd57f, 0x26a87f1c, 0x93fd0131, 0xdbd0e9ca, 0x2878ec4e, 0xf54bfc1d, ++ 0xa2eba8f5, 0xc0b7d175, 0x1c64bba7, 0x7f13e4ed, 0x879e111f, 0xedeacaa1, ++ 0xc2957f66, 0x4d7f7aa7, 0x6bc7e4ae, 0x5f3f2572, 0x7861eb9f, 0x3fb4c5d5, ++ 0x93ebc998, 0x66704dfc, 0x69f880fb, 0xc7d8fc10, 0xa41b9fda, 0xcfd53f51, ++ 0xcfb1fac6, 0xb943d977, 0xc438623f, 0x821f7918, 0x3b13c9ed, 0x4e8fd893, ++ 0x73f734da, 0xfb016762, 0xb6ee4fd9, 0x06663c73, 0x63c63674, 0xd8b7c301, ++ 0xfd90a5ba, 0x2c63db57, 0x3df563c0, 0x5fb05a57, 0xff59bad1, 0x7caa7eae, ++ 0x23f75186, 0xadfd5f4e, 0x05782b6f, 0xfda2ffe0, 0xad68e587, 0xeeeb4721, ++ 0xf91e26b9, 0x2b4de2c6, 0xb79fd9e7, 0x4e4306f9, 0x4365c246, 0x9f4721ae, ++ 0xb6f98479, 0xf91ce896, 0x3c46353e, 0x8d09e6b4, 0x759abdf5, 0xf9626cd7, ++ 0x205d86f8, 0xfb74f8ef, 0xe1c2e30f, 0x9fa30dfe, 0xdc7defbe, 0xcbda86be, ++ 0xe38d5fef, 0xfbb4ecf9, 0x7c489f30, 0x4ff7f65d, 0xefa5ff58, 0x0f49dbab, ++ 0xfd78bc28, 0x37c745e7, 0xd81c83de, 0xf805f2ed, 0x4f9f3b69, 0x5f6f6539, ++ 0x7a9ff582, 0xe1f2c5d2, 0xbf918254, 0xc05efb4f, 0x7cdcf981, 0x7ebdfb3f, ++ 0xb440473d, 0xfb9a0d2f, 0x76faf355, 0x75cf94ae, 0xf078be49, 0x03e11d61, ++ 0xbe7e11fd, 0x69bfdfc6, 0xd723efe7, 0xaef8d0b3, 0x8c9f0f97, 0x353c3a61, ++ 0xd4e5e244, 0xdf79c353, 0x74904ae9, 0x7b65f34d, 0x2c8254f5, 0xf4043271, ++ 0xf491ed50, 0x3b526a70, 0xb4a7e7db, 0xd9765c3d, 0x4dd577e5, 0xe8961c46, ++ 0x03f41934, 0xca1c459a, 0xfa03a1b9, 0xf8f1e406, 0xa2865cd1, 0x5ff62f12, ++ 0x9db31d13, 0x4fc196f7, 0x8f208350, 0x7ec27e39, 0xe40776d8, 0x7de86ea9, ++ 0x8e2fbbb5, 0xb54f01ab, 0x078e35bb, 0x53572cfd, 0xef3e77fe, 0xbc252352, ++ 0x7e6809a8, 0xacd519e4, 0x740cbe59, 0xf1b8d35f, 0x5a83f076, 0x4c4d8d47, ++ 0xa5d61d87, 0x643e7959, 0x3b39dfdf, 0x14f1e2ff, 0x1be85f7c, 0x3ed47847, ++ 0x1076bc43, 0xb281d241, 0xd5fd4ade, 0xf036d1ae, 0xfeca1938, 0x7053eb94, ++ 0xf81169c2, 0xe05f94dd, 0xf357eb52, 0xde7cd4bc, 0x5750e436, 0x89fef786, ++ 0x56ebf7c0, 0x3fe72796, 0xf89f131f, 0x671b7a25, 0x68feab8e, 0x4e93effe, ++ 0x43527ec6, 0x94e0d59e, 0x7733cd04, 0x92ae398b, 0x1f5cddb7, 0xcf5cdbb9, ++ 0x17ae6bdf, 0x7dd7301e, 0xbfeb9a2f, 0x7055c634, 0xfc8c3d82, 0x28c3d835, ++ 0x28e30f61, 0xd461ec0f, 0x84a30f61, 0xb0e78c3d, 0x3d875187, 0x61ec3a8c, ++ 0xa30f61d4, 0xe78c3d84, 0xbee5c349, 0x31f86b56, 0xabce0781, 0xe2a5ce7a, ++ 0xe72fcce8, 0xf2920e16, 0xc5ed26d7, 0x59f2cb73, 0x4972ebcf, 0x2cf74f3f, ++ 0x96fb0fa7, 0x2eb9cbca, 0xdcefff56, 0x76778871, 0xe0c94bac, 0xdc2fd8ef, ++ 0x17e973f0, 0x72ed1dae, 0xb9d11fc3, 0x5075e3f6, 0x7562124f, 0xc871f0cb, ++ 0x09deea63, 0x1d35d6f8, 0xe774f8e6, 0xd79bef2a, 0x5fb1fc4b, 0x94d9e544, ++ 0xdc835f61, 0xe3821c46, 0xb8673e90, 0x3e32335f, 0xd5843623, 0x99b4e7a1, ++ 0x18f191eb, 0x89bf35c8, 0x4e195aaf, 0x53bbd98f, 0x783ff720, 0x9de7c9dc, ++ 0x68fc303e, 0xf5878162, 0x2377a526, 0x6572174f, 0x36da7dc5, 0xc359d7ec, ++ 0x3d9f1913, 0xe74c7347, 0xf2cb22bb, 0xaf59a30b, 0xd06fadec, 0x9867182c, ++ 0xc58ffa43, 0x9789563b, 0x9fde38e4, 0x38e632ee, 0xd87afa1c, 0xa30447fc, ++ 0x6a34f44d, 0x1c446257, 0xfda98871, 0x2333fb15, 0xcd2388e2, 0xabb9adf1, ++ 0x9efec20e, 0xa98c61b3, 0xeff079dd, 0x32b3ec58, 0xe4a2a72f, 0x96b8889a, ++ 0x7c8f4f31, 0xe89d9776, 0xb5dfda85, 0x87f7852f, 0x7fb79a0a, 0x8249e20c, ++ 0xb5d2e8f3, 0xe3963ac0, 0x3fce355b, 0x1ff6372c, 0x8fde64d1, 0xe0226cab, ++ 0xc6809c41, 0xbb587e87, 0x9570706f, 0x557f47d6, 0xa04fe11e, 0xec8d96fe, ++ 0x9ec10c28, 0xe3c7e578, 0xd6754f41, 0x8388e9ad, 0x7705addd, 0x4e6e887a, ++ 0x7419ee26, 0x93ffbd15, 0xfa039f45, 0xdc747d3b, 0xce08131b, 0x7d5b77a7, ++ 0x1edd2718, 0xddda341a, 0x76e97747, 0xbff0344f, 0x76cad5b5, 0xd659fc04, ++ 0xd8fa3ec4, 0x9d149ada, 0xb75beeed, 0x8e6187a2, 0xb0bbd0d0, 0x58b99fae, ++ 0x9abd22cf, 0x47f3abf7, 0x55cfacad, 0xac02d24d, 0x5ceb1af7, 0xa9df91e1, ++ 0xec371cf5, 0xfb2d9143, 0x7f78dbbd, 0x42c1c47a, 0xcda5e22f, 0x90add3fb, ++ 0x3bdd96eb, 0xe85ca853, 0x9eb1ebd4, 0xbf39adaa, 0x54e3489d, 0x88156dbf, ++ 0x36d87f4f, 0xe82aee25, 0x7dda4f9d, 0x4f7ea833, 0xd01d8feb, 0x416dabef, ++ 0xaad4ec07, 0xfc3ab7c7, 0x6bb0de54, 0xb25f3f2b, 0xf5ed8cab, 0xed91a2a5, ++ 0xde544fce, 0xaa8f01ad, 0x0f16dac9, 0x436dfbcd, 0xcb45548e, 0xeb628f7c, ++ 0xa79097c4, 0x56977e7e, 0x735eb384, 0xca38f64b, 0xe1faf9e8, 0x823e9c46, ++ 0x9b5e7a5f, 0x7e103c53, 0xe18d76a8, 0x98fe297e, 0x44744387, 0x782e730f, ++ 0x617b9cb9, 0x6fbddb24, 0xb08eb20b, 0xd847e47f, 0xf3c9afbf, 0xdfc83d5d, ++ 0x39573c21, 0x00e60342, 0x33b0bf0f, 0x7e88ea1e, 0x5d868c26, 0x54d5c42d, ++ 0x9ab44c96, 0x6a61b7e8, 0x17de898c, 0xa23e3088, 0x218be6fe, 0x19dcfaa6, ++ 0xb7f6a659, 0xc1151dce, 0xdefba30f, 0xbabadcb3, 0xebd53def, 0x1abc0656, ++ 0x364cc1e7, 0x2572a73f, 0xa64dd9d3, 0xecc4ebef, 0xf3a076be, 0x3862bfed, ++ 0x80e1d10b, 0x9c6554fd, 0x77a05847, 0xf93bcf19, 0xc4c42d39, 0x7cb2c397, ++ 0xa4fb95bf, 0xcaf9fd9d, 0xff00bdbf, 0x9f6feace, 0x1bcdee8c, 0xfc289e44, ++ 0x0f59ba11, 0x523b60e9, 0x19d43c48, 0x3cbaa2fe, 0x0baa2fe9, 0x87903874, ++ 0xa5b7f04b, 0x5bea4812, 0x5203f635, 0xa26a677b, 0xf3c4afac, 0x05f3e6bd, ++ 0xde02efe8, 0x8196b51f, 0xd7df225f, 0x1fb1bad3, 0x03bfc3d4, 0xdfea953f, ++ 0x67d157e8, 0xc8ecb9e4, 0xbcf2527e, 0xbbd5cf4c, 0x42191cf6, 0x92539970, ++ 0xa9fe0450, 0x2f659f6d, 0xce98bfcb, 0x5f3fbc94, 0x54ff6165, 0x99876bcf, ++ 0x6caa7ace, 0xfc87993e, 0xf7a8f0e5, 0x24683f4b, 0xf5a12dfd, 0xc9726f20, ++ 0xd417cd5e, 0x65c03b64, 0x0232e808, 0xc0fda92e, 0x17a9c14b, 0x97ef116e, ++ 0x91631fe2, 0x2105a09f, 0x8b822f27, 0xffd1a382, 0x7eb05d12, 0xf209f349, ++ 0x13fa227c, 0xeff92213, 0xdf373e2e, 0x1e1345b3, 0x30e1abed, 0xabf482fb, ++ 0xeb92cb0c, 0xf9a7deee, 0xbfcfa7a0, 0xbde7e360, 0xf32252f4, 0x30cee7a9, ++ 0xfd2f67f3, 0x997e4894, 0x7f106177, 0x474dbff7, 0x2a3f455f, 0xa799126e, ++ 0x0cfdceac, 0x8bfc33cb, 0x2fb8c4e3, 0xeb3c89fe, 0x1ce7bd61, 0x04fb4ce2, ++ 0xec092ffc, 0x3bef316f, 0x84263ff0, 0xb4651be9, 0x80c77a9f, 0x820e875e, ++ 0xfc37567f, 0xeb1e4a7c, 0xd6eb7f46, 0x7f79f164, 0xd6be9df5, 0xf4d6fece, ++ 0x965c4955, 0xb0833cb9, 0xb2ad945f, 0xf7fdf9f2, 0xd07837bf, 0xf7a3a204, ++ 0xcc07dad7, 0xffde2ea0, 0x5174d8e6, 0x97317a80, 0x5a8c6c1f, 0x570fee10, ++ 0xb93cb4e5, 0xf77dd46f, 0xcebfde5d, 0x5b8b5e58, 0xbb5b3e00, 0x37290e2f, ++ 0x1adf6b35, 0x7b7da1ef, 0x979f45ad, 0xc0fe0e37, 0x0b6fbcad, 0xf842d6cf, ++ 0x50de94c3, 0x3078b6bd, 0x7fdaf7f6, 0xfb147e1c, 0x3ecabebb, 0x89e6fa08, ++ 0x513cc8df, 0x5f58b7da, 0xe925c4f8, 0x311d93f7, 0x13edde7c, 0xef11f84d, ++ 0x583d6659, 0xa3ed31e8, 0xfc63e607, 0x2e349c07, 0x3b8375c7, 0x2fae3193, ++ 0xfa95f9c0, 0xfef89caa, 0x6caa24fc, 0xb8f52cd8, 0x6bafca9d, 0xbfa17ff8, ++ 0x1dfd0ea3, 0xefe82441, 0x477f43a8, 0xcf1dfd09, 0x07e7e11b, 0x1774b49d, ++ 0x4c0cfec1, 0xbc8d7916, 0xa0f3baaf, 0x45a5df9f, 0xee6720fb, 0x39837cd2, ++ 0xde5dbfbe, 0x21e8a043, 0x76d73e72, 0x4615ae93, 0x705fd79f, 0xb4fcf08a, ++ 0x54c12249, 0x314ce29f, 0x64f62fb5, 0x90dfde98, 0xfef4c23c, 0xa9916f46, ++ 0x55de737e, 0xf8b7f6a6, 0x5fea9926, 0xa9a3709b, 0x2cff2cfd, 0xf4ce7d53, ++ 0xf3f6a685, 0xef4cca4a, 0xccb05d6f, 0xbea17ef4, 0xbdbf54dc, 0xf6a69bea, ++ 0x32ae3477, 0x8f0bf7bd, 0x01dafb0d, 0xf70455d8, 0xa2aec05f, 0x73d7aef2, ++ 0x9d78e1dc, 0xd8d2c538, 0x4b7edf9f, 0xde63d49e, 0x04dfe118, 0x0f79c4ba, ++ 0x719a61d0, 0xec09e39e, 0x1711031f, 0xaed2690c, 0xdd0148ed, 0x7c8bb644, ++ 0xd0e6313f, 0xe3482f79, 0x6d7365f1, 0x5e260f24, 0x164c6879, 0x1e3e27d5, ++ 0x0e6bf594, 0xf5499d3d, 0x49ff8f69, 0x7438afd6, 0x3e0fef1e, 0x8dae63be, ++ 0x39c4cce4, 0x928a5582, 0x06e6f311, 0xaf131d68, 0x93e0dccf, 0x77d6117e, ++ 0x80af452e, 0x0122f203, 0xa2219407, 0x8887944f, 0x48be513e, 0x2d9159f4, ++ 0x4fa211c4, 0xbec94794, 0x925ff3c4, 0x35f2897d, 0xbe512fb2, 0xca25f641, ++ 0x512fb20e, 0x0179bafe, 0xd669bf97, 0x9a77bbf9, 0xb77cb8ab, 0xff9f91b9, ++ 0xcb89b9be, 0x6407343f, 0x3a9a79ff, 0x16fecf27, 0x47aa8715, 0x9af10ffc, ++ 0xe1d3f6fd, 0x2fcd5971, 0x37154df7, 0x9d14696c, 0x4ed3e031, 0xce47c25b, ++ 0xa5e078be, 0x7c4daae5, 0xfd67a614, 0xabffcbbb, 0x0c63f63c, 0x367cb0f5, ++ 0x73131f9e, 0x9e1346d2, 0xdff43352, 0xd1bcfde2, 0x49e36be5, 0x79ff5c7e, ++ 0xf2f41da3, 0x73ffa5b6, 0x74184fc2, 0xff8473b2, 0x2a23900f, 0xcee2adee, ++ 0x612cf9bd, 0x93c47171, 0x8a8cde55, 0x585ff387, 0x538a8c3e, 0xeb9c7cab, ++ 0x54737b8c, 0xdbe55a1c, 0x2f8b7ea8, 0xd77b9608, 0x7eb1b7ae, 0x21136b12, ++ 0x6af2a38c, 0x17b675ae, 0xdae0df21, 0xfbe7375a, 0x8ee7a60d, 0x6fcedcd1, ++ 0x5ffb72a5, 0x5f617da8, 0xb1b07bdc, 0x5c9b588e, 0x9d05f147, 0x1ad7b4fd, ++ 0xef7c7f71, 0xf803ef94, 0xd059b91e, 0x7994a833, 0xb3f49a6c, 0xda3c38aa, ++ 0x21f6c8c7, 0x19fd97f4, 0xc7d7178d, 0xed896947, 0x4ad7c845, 0xbe7377ab, ++ 0x214996d6, 0x2735c73e, 0x3afbbae1, 0x8dc7c8ad, 0xa8f83aff, 0x198f432d, ++ 0xf57fed41, 0x47cd3782, 0x5989d9f5, 0x32ce5103, 0xc12fe0f4, 0xb8c4678f, ++ 0xb829783e, 0x78297c2b, 0x312fe587, 0x7f0abf9c, 0xc48b7891, 0xf153c297, ++ 0x03f83e85, 0xa7e3177e, 0xbff07f0f, 0x9f82fffe, 0x3e76b6b1, 0xeb55181f, ++ 0x5f5e61f4, 0xbb3baf85, 0x3f9c34c5, 0x3de0bb2e, 0x4c96f282, 0x53f009fd, ++ 0xcd3498b9, 0xac791803, 0x44e3f005, 0x997f9bb6, 0xd113beed, 0x98e250ee, ++ 0xbacb7ff5, 0x8896ddb8, 0x63092d76, 0xfa4dfc36, 0xfec56e91, 0xe76bd47a, ++ 0x2eabd6b8, 0x77e10f95, 0xa71e1117, 0xa8e8f218, 0x83fde468, 0xf000b2d4, ++ 0xf540d53b, 0xaca5fc94, 0x9b754ecf, 0x9f69c3f5, 0xd773c897, 0x65f42203, ++ 0x937d2e23, 0xa20defd1, 0x3c8dfb95, 0xa1937d97, 0xcb9e4687, 0x7a411aae, ++ 0x64989924, 0x4e4066db, 0x393e154d, 0xfd5ce32f, 0x37ec8f54, 0x2c97a0d5, ++ 0x044c55af, 0xcf9d083d, 0x7388bf73, 0x371885f5, 0x451bf5c0, 0x459bcb90, ++ 0x85b9fb88, 0x5fea2904, 0xcf2ec213, 0x82f3cbd3, 0x4ffd56f5, 0x39d4b3d0, ++ 0xff4b9f41, 0x70e7f816, 0xdc52cccc, 0xcc65307b, 0x777c6c94, 0xf597aa68, ++ 0x2cce4393, 0x57c097d6, 0xfe3ec4f6, 0x17f6857b, 0x1ce05aa4, 0x639c4a1b, ++ 0x796626cb, 0xd41ff699, 0x255bca6f, 0xaf34ddf0, 0x7d460f39, 0xb267b37f, ++ 0xb4b98db0, 0xf0b9bf7c, 0x0fc8a1b9, 0xf8613578, 0x5fb9f854, 0x2a72b84d, ++ 0xc26afbd6, 0xa32c8b60, 0x3c165c1c, 0x3e9fdd9b, 0x6fb9e8a7, 0x96c269bc, ++ 0x2b386974, 0x53c246b8, 0x805ff9c1, 0xb3c80eeb, 0x013eb848, 0x1c438c58, ++ 0xf87ae9ff, 0xa462ea7b, 0x1b3ff13c, 0x5c17102b, 0x7fde4fb1, 0x44530276, ++ 0xc253b5de, 0xf47fd229, 0x0a18b371, 0xf1ed8b78, 0x63dd5cfc, 0x3574d955, ++ 0xd34973af, 0xd12efe04, 0xfc0b3fa9, 0xca1d1e9e, 0x7c458d25, 0xcf85a5bc, ++ 0xca799efd, 0x5fbe83ea, 0xf06ef56b, 0x6abc8641, 0xf13f7ce5, 0xc474e1f9, ++ 0xfef6c4f7, 0x9d6b90f3, 0xaeca8e12, 0xc2599259, 0x633c28fc, 0x5b3de592, ++ 0xdab31cf2, 0xc94687ff, 0x9e755e3c, 0xc0fa52f6, 0xb72968f8, 0x39494686, ++ 0xdf47f0ab, 0xfa953d71, 0x29724f19, 0xd668fef5, 0xfe3d33ff, 0x425f0137, ++ 0x567f49a8, 0x00cf7cf6, 0x44ebc709, 0xd1f826ee, 0x8bb51ea6, 0x99efbd20, ++ 0x5bf94c2a, 0xdb94afc5, 0xb9d5df20, 0xb264a893, 0xdff8c2b3, 0xde168de5, ++ 0xc98dfa30, 0x63d5344b, 0xed4c437d, 0x9a6427e3, 0x47f827de, 0x4d27de9a, ++ 0x0faa6d1f, 0xd4dab92c, 0xc982f07e, 0x7e8a7aa6, 0x6a7da993, 0x5d536cd5, ++ 0xf954a1c9, 0xde35a448, 0x587efa66, 0xfb5362d3, 0xe9b5408c, 0x3bf808bd, ++ 0xe9fbe8f2, 0xeb59f7c6, 0x13df9857, 0xfbe32d78, 0x51f8b7ee, 0x31673c9c, ++ 0xef84bddd, 0xfd69c8b9, 0xd63e7996, 0x57d8adcf, 0xbe35e352, 0xaf06e0a7, ++ 0x2715ee59, 0x3d53eb9b, 0x75022f45, 0x79913c53, 0xf40d213f, 0x3368da94, ++ 0x691f8f3d, 0xa285dfd8, 0xafefed90, 0xd23ebfc2, 0x7848ff84, 0x4f0f4c5d, ++ 0x0d7ee117, 0xd7c3e5f8, 0x387cbf05, 0x0f97e05c, 0x1f2fc3af, 0xf97e1ede, ++ 0xcbf0f7f0, 0x731fbf87, 0xe3074cd4, 0x7074cc3a, 0x3a66bbe5, 0x8919f450, ++ 0xcd3aabaf, 0x4d7421f4, 0x5f04bed7, 0xa6627cd7, 0x08fc489f, 0x9bf8cdd1, ++ 0xc3c4d6e6, 0x7c73ff19, 0xf6348f15, 0xbd5f0339, 0x437821f8, 0x342ebd9f, ++ 0x8a1ff38a, 0xee055a8f, 0x58c478c3, 0x1aa30de7, 0x4f2499dd, 0x5fe9b09f, ++ 0xa28b9e43, 0x491496ab, 0x9f473d57, 0xcfee4176, 0x653fe88a, 0x24773e88, ++ 0x4905a3c9, 0xa01dd3e7, 0xef796e8f, 0x61ac26d6, 0x249e5f60, 0x9cf2e5d9, ++ 0x7de4b7f3, 0xad2cc72b, 0x23f3e41a, 0xc6297a71, 0x51bf33bb, 0x5935bc43, ++ 0x8259ec94, 0x8cff98bc, 0xd17d474a, 0xa1bf7930, 0x73e4efc8, 0x2e2e4a06, ++ 0x3379954a, 0x3b0d2315, 0x67f327c8, 0x7a948e96, 0xc3cfac6a, 0xf965bd79, ++ 0x99051cf2, 0x0a8be92f, 0x5cd78f00, 0x368f01c3, 0xd7d7df0b, 0xf3c6f769, ++ 0xac57bb39, 0xe822f102, 0xd327d0ad, 0xe5ae7d0c, 0xe6274e77, 0x30b37c3f, ++ 0x8223abed, 0xe93e534e, 0x531e5da8, 0xd93da0bd, 0xfd8afed4, 0xa2fbd35e, ++ 0xfde99e50, 0x533ea398, 0x04c75c7d, 0xdf2bfb53, 0x57ea9bf5, 0xb5374e75, ++ 0x1293e6bf, 0x74553d53, 0x0ef8043f, 0xfcdda4d3, 0x094cc8d8, 0x8f8caf27, ++ 0x4127ba2d, 0xec34839e, 0xab97a569, 0xa0dd633c, 0xdefd48e7, 0xc1344081, ++ 0x35fa41cf, 0x279505f6, 0x05e447ac, 0xf7bffd2b, 0x9cc0429c, 0x83f2ac27, ++ 0xc303ed7b, 0x273de81e, 0xd783f2a1, 0x1783f398, 0xfd7e8945, 0x948c4f0c, ++ 0xf9c8b1fe, 0x8e4579ab, 0x91e39a9f, 0x777e8ded, 0x373ffb38, 0x1948ecf3, ++ 0x559e3faf, 0x7d3a0ed2, 0x777beed4, 0x3f3fc669, 0x67ec4b4e, 0x87e73a29, ++ 0x5a97f9c9, 0xcace772c, 0x16aa7be7, 0xdc6c2cfc, 0xcf78c623, 0x7d741be5, ++ 0xc5167189, 0x6fce711b, 0x2f47e71b, 0x43b26e31, 0x701e81ac, 0xfbf686c7, ++ 0x4b481386, 0x7dc6ad1d, 0xf03b4152, 0xe932633e, 0xa3f04557, 0x49b9b625, ++ 0xc9b478ff, 0xd7917ec6, 0x479b2e47, 0x39ef599a, 0xcf646188, 0xc3a00e80, ++ 0x29ba0ec0, 0x31f32adf, 0xef3e4a47, 0xd04407db, 0xf9e767c8, 0xd83934f5, ++ 0xae87ea4e, 0x7ad4de98, 0xd8f3affe, 0x6bd3e123, 0x26741a8f, 0xecbe7c8c, ++ 0xe757ba08, 0xedcbbc09, 0x7cdcdb25, 0xf23a612e, 0x50e57aa2, 0xc33794be, ++ 0xa0384946, 0xa5cde41d, 0xf35b15da, 0xee2fe1e3, 0x4f78de11, 0xcaa6f43f, ++ 0x28782bff, 0x7cea5fb8, 0xfff8a5d2, 0x2293e752, 0x3e523ef9, 0xff9dc244, ++ 0x92bce32e, 0x1f928bc2, 0x10b9d176, 0x6d982c72, 0x3df278e1, 0x9d7e66b1, ++ 0xf7c24a39, 0x5d3fc1bc, 0x0b20cf5e, 0xc3c9bce8, 0x219547fa, 0x569d153b, ++ 0x0bdc603e, 0x357b2016, 0x5b95bd6c, 0x11efbdad, 0x7711d507, 0xa3fbe389, ++ 0xb8b0afd8, 0xa56e0b55, 0xe602caef, 0x645d98fd, 0xde9cbef4, 0xf8b8cc1f, ++ 0x07a563de, 0x7bc91c71, 0x4bc83df1, 0x3715bb0d, 0x232f8003, 0x51fe26e3, ++ 0x13e61e86, 0xbae42fbe, 0x5be90ed8, 0xc1574197, 0x8663ce2c, 0xfe956b1d, ++ 0x529fce19, 0x8e22f270, 0x2757d491, 0x61e74678, 0xeb635e5f, 0xc14dbf37, ++ 0xbd38e2f3, 0xcf104fcc, 0x518ed8b8, 0x88d3fa71, 0x2aef03d3, 0x3fb4624e, ++ 0xdc0ab01d, 0x6f7a7237, 0x8cf5c314, 0xb8f9b5e5, 0xae37a99a, 0x463c5172, ++ 0xa0bf21c4, 0xdbccb767, 0xe89f14bc, 0x1e53169d, 0x57ef45c8, 0x367be3ed, ++ 0xf1949f6a, 0x0f27da97, 0xdb0eca0f, 0xb28c963f, 0xb5acdd31, 0x06a375e8, ++ 0x543de5f6, 0x88582dff, 0x37e18672, 0xaf4f5c8a, 0xf3289bbc, 0x7d687bec, ++ 0xcba6ef2c, 0x2f24cf73, 0xc54cf805, 0xd08967db, 0xce2a9400, 0xc09fafa1, ++ 0x8e715078, 0x5e04d0b2, 0xa596bcc7, 0xd8355c76, 0xe2cad0f9, 0xfc5f6f68, ++ 0xe64d33a3, 0x0e2a5ccf, 0x8f82e732, 0xe17b9bfb, 0xc367ee6a, 0x97290ca8, ++ 0x1cb7dcd6, 0x5dc8e8fa, 0x74380ec2, 0xab97e446, 0x7f8373f2, 0x8d2ba052, ++ 0x59cbcb0b, 0x5f3cb1a5, 0xcb195e01, 0xcf2c3a79, 0xab7cfd55, 0xf5962f51, ++ 0x7acad6bb, 0xd2cf71a7, 0x815fc34e, 0x7ac4a275, 0x36ef4760, 0x075819fc, ++ 0xcf03ac4a, 0x8750c721, 0x721d431c, 0x31c8750c, 0x78639094, 0xa49458be, ++ 0xbc655917, 0x1f386a66, 0xa98a705e, 0xe2107a61, 0xc475e135, 0x23dbc26b, ++ 0x1efe135e, 0xf7f09af1, 0xd784d788, 0x6f09af11, 0x784d788f, 0xf09af11d, ++ 0x84d788f6, 0x09af11d7, 0x4d788f6f, 0x6bc47bf8, 0x5e23dfc2, 0xbc475e13, ++ 0xe23dbc26, 0xefefe135, 0xf14cd26c, 0xf38d3b9c, 0x139be5f9, 0x93be3e99, ++ 0x28caf251, 0x629fefc2, 0x7b75f1fe, 0x607cf026, 0x4576e819, 0xe24fb45d, ++ 0xc4ba75b9, 0x3c4845bb, 0x3c642f77, 0x7ac874af, 0x8de7ccb1, 0x45c41fa4, ++ 0xb8cb66a6, 0x45c44a08, 0x822e2250, 0xa9917112, 0x41171936, 0x9e08b889, ++ 0x12822e23, 0x88941171, 0x5c44a08b, 0x22e22504, 0xc1171128, 0xa08b8877, ++ 0xcf045c44, 0x89411711, 0x1f9e08b8, 0x3e2079a3, 0xbd05e6a2, 0x5764db3d, ++ 0xec9a1d12, 0x0ea98f4a, 0x3dbc3dbd, 0xf7f0f6f4, 0xdfc3dbd0, 0xaf0f6f43, ++ 0x6f0f6f43, 0xbc3dbd0f, 0xcbca351e, 0x3dfd05fc, 0xefe83bfc, 0xd682f5e1, ++ 0x49f04bc0, 0xece5b2dd, 0x633b288b, 0x8f3547b5, 0xdaf9d110, 0x3aafc47c, ++ 0x827a5a5d, 0x55c5f68f, 0x4953f98e, 0x7c8dd36f, 0x6dd142b8, 0x3e39be01, ++ 0x43d3784d, 0x0b77f382, 0xefcc9afe, 0xff94bc55, 0x7b45ef08, 0x8d01db05, ++ 0xea5e72d9, 0x58f09f7b, 0xa3215ef9, 0xffbd5f7d, 0xabe39176, 0xc32f2c76, ++ 0x620641e6, 0x8a15f211, 0x2347ba56, 0x45a77d2f, 0xab9b7993, 0x246cde65, ++ 0xe8675d5d, 0x7b2d3b4d, 0x77d3450e, 0xe71a65dd, 0xc4dae64f, 0xc068fb51, ++ 0xf43471a9, 0x04fcdc88, 0x578d5d63, 0xcd476f23, 0x490ff95b, 0xb1b9f04e, ++ 0x51c2dd89, 0xfb5ce341, 0x3dc0e167, 0x521c33fa, 0xb077c08f, 0x3405471f, ++ 0xfa30b6ff, 0xfdcbe5f6, 0xbf2c0f4f, 0x8f9e82ba, 0x3578ddda, 0x88cda3ce, ++ 0xe4fddf96, 0xe38638b1, 0x36da35cc, 0x713213dc, 0x7ce3f0b7, 0xd2f955e9, ++ 0xdbb5191e, 0x71e0a8e3, 0x4d8e7c3d, 0x25b65bf5, 0x95ddcf9d, 0xc9a9ce89, ++ 0xf8d0531c, 0x37056c3e, 0x588bdf5a, 0xa3f8891f, 0xcbff03f0, 0x3d4859e7, ++ 0x2cf39cbc, 0x284d8ed7, 0x389a1e46, 0xbc15ef20, 0xdad96c65, 0x3d2f3481, ++ 0xbc15ef28, 0x2f8dcff6, 0xbcbb7d71, 0x67c99057, 0xc3b54cbc, 0xa03c387e, ++ 0x33197df1, 0x032d5b03, 0xbb5738bc, 0xed083eca, 0xd41f0b77, 0x9e42e181, ++ 0xcaeb550b, 0x97161d17, 0x87117a06, 0x8fe8c293, 0xd05cc724, 0xcecf914b, ++ 0xb2cd6ef7, 0x3790ec79, 0x6446fa91, 0x1fe9075e, 0x413ccab7, 0x3af58dbb, ++ 0xf32a3f43, 0x5f9eb9c8, 0xa3fd6763, 0xbf719f6c, 0xa1be847a, 0xef483df2, ++ 0x8fb085f0, 0x17d9bdef, 0xcbb557a0, 0x8abce6df, 0x9dc11993, 0x64f217b8, ++ 0x13f99ee6, 0x5c9217a0, 0xbd253c81, 0x81fceee1, 0x12f9cf38, 0x0ce84b9f, ++ 0xc6facd3c, 0xc40f35f9, 0x3248f3c9, 0xc061521e, 0x2a8bf949, 0x18547c0d, ++ 0x37ef3d79, 0x695b7bcb, 0x1f210ddf, 0x7acbe683, 0x289ea445, 0xe41de784, ++ 0x7ad1559f, 0xe9736670, 0xc975b286, 0xcfdfbfa2, 0x707ccbf0, 0x6b65dc63, ++ 0x53bf9cec, 0x1503dc65, 0x351a7bf9, 0xb359fe86, 0xfefcfccb, 0xa3dfc37c, ++ 0xff754ef4, 0xeca6d19e, 0x58f3c3f5, 0x73b469ef, 0x2ae979de, 0x3d8907a9, ++ 0x05f38822, 0x58a6aba5, 0xe943bf70, 0xeb4fbf3e, 0x34de6e87, 0x1819a1f4, ++ 0xeb39e094, 0x91cb3442, 0x708617d9, 0x6485fe7d, 0x90bd6f2e, 0x17c39f27, ++ 0x2cee7844, 0xdfd1e796, 0x79a0f432, 0xfe046fc8, 0x8e998302, 0x318e887b, ++ 0x9f21a144, 0xc3b5fa46, 0xb0cfa370, 0x3f916beb, 0x60ab6339, 0xe816f2bd, ++ 0x0162f44b, 0xe031a7f4, 0xce628c83, 0xf1ae9dab, 0xc65b9379, 0x9ee8372e, ++ 0xdcb040f8, 0xf431fbe0, 0xc882b3a9, 0xefa05997, 0x8adf00b1, 0x1740f5fe, ++ 0x4b78a3df, 0xbee07340, 0x9fb0dd39, 0xf2477d15, 0xc318a2c1, 0xfe96e5bf, ++ 0x117b5eab, 0x6b4be593, 0xfee3e6ca, 0x45f045a4, 0x4b10310e, 0x97cd8aa0, ++ 0x2fc95fef, 0xc606bf9b, 0xf7e8bfd4, 0xe458b528, 0xf3d22379, 0x745c6f38, ++ 0x9f060f14, 0x2346d06c, 0x4ed7bd6f, 0xbe7c9c28, 0x5e4ecc20, 0x3a95f06c, ++ 0x7be2b6f7, 0xecbf8339, 0xc139679c, 0x28b5fc19, 0xf8ebf3be, 0xf34f98a5, ++ 0x04ea7f85, 0xd6ad4bdc, 0xd3c84229, 0x0fa8cdbb, 0x3bc1f82b, 0x1f0cddeb, ++ 0xddd99fae, 0x1a791f30, 0x2c1cb2ff, 0x179c6cd5, 0x4ba7c06d, 0x8fe54fd3, ++ 0xd38373e3, 0xfc98d780, 0x1fef3e6e, 0x37e51f09, 0xf1205619, 0x293fe917, ++ 0x8afb97cf, 0x6fd379b0, 0x978c78e7, 0xdd6a8cfd, 0xe7cddbef, 0xb8395532, ++ 0x9ad7d8c0, 0x2bce6fff, 0xe791683c, 0x04b61fe3, 0xb38b3cf7, 0x1775030a, ++ 0xf230f7f0, 0x3afe79af, 0x33dd4faf, 0x8c9f2bd1, 0x1d14257b, 0x60fa6e2d, ++ 0x8fb3259f, 0x7fd62a9e, 0xd80ed0fa, 0x820fa4c1, 0x9af5f59f, 0x097eb73c, ++ 0x3aac7b3a, 0xb1e5f99a, 0xee58396f, 0x5e3a3a96, 0xc1f46672, 0x7fa6bdf3, ++ 0x19394bb7, 0x60fdc1ca, 0xf8ba35b7, 0x6160dcbe, 0x1be63a49, 0xbc63ef93, ++ 0x2e2e479c, 0xd38f9fd5, 0x42060b33, 0x9238efff, 0xb7f13f0c, 0x687be75f, ++ 0xf0640e1b, 0xfb657cfd, 0x3ee1d68b, 0x3ea16091, 0xb997df1c, 0x17e80e3d, ++ 0x78126bf5, 0xd8345dbf, 0xba296f38, 0xf0a6ee39, 0xf4817d71, 0xb58a7db7, ++ 0x0af9c40c, 0x6882bce3, 0xb532cfb5, 0x97ebf4b3, 0x20dfbdeb, 0xe7d5afc2, ++ 0x1ebed95f, 0x031dd5e7, 0x36b7bc84, 0xff105e12, 0x26f2c3a3, 0xbd1ffc22, ++ 0x9f30eafc, 0x63655427, 0x1ba76181, 0xaf656a76, 0x6d3f9a9d, 0x8df9f430, ++ 0xeefe079a, 0xd6f7b70a, 0x715ea8ab, 0x4b0c8ed4, 0x2bd12331, 0x9ef8f3ef, ++ 0xf163cfbc, 0xb72c45dd, 0xd193814a, 0x81307738, 0x4822b6f9, 0xf9a5d265, ++ 0x878df6fb, 0xbac39ed3, 0x273e7e42, 0x3bf1e15e, 0x2eb1efc2, 0xe74cd56f, ++ 0x2f5d55fc, 0x52c47e90, 0xbf001f32, 0x70ceee3b, 0x529d2ee0, 0xcf907b52, ++ 0x89d068d7, 0x71da8efa, 0x4c8cc7be, 0xb3de4471, 0x90cef344, 0xeb0e8de3, ++ 0xf9ab717f, 0xcf6a02be, 0x41755afa, 0x037dfcac, 0x033bad0f, 0x49e787a5, ++ 0x75386070, 0x79fd47df, 0x7b861c79, 0xc7682879, 0x229478ef, 0xb7ea84cf, ++ 0x8c768279, 0xbc8d78b3, 0x20df4437, 0x27d7d1c7, 0xcfa00a38, 0xb48e3cd9, ++ 0x8d6f3d70, 0xd4b6f7bc, 0x9a00fdf8, 0x15c1eb2f, 0xaf9c2704, 0xec3639c2, ++ 0x2af09169, 0xd15fe633, 0x1bd6609a, 0x81da375b, 0xb897859f, 0x8351e0cf, ++ 0x99af160e, 0x2bcfe7c4, 0xaf3e7e6c, 0xfef01ba0, 0x5eebb970, 0xb61633c4, ++ 0x5067b26d, 0x3d0607fd, 0x79c06a3f, 0x87286646, 0xee5a09ef, 0x85e27ce2, ++ 0x6f5e569e, 0x201fbc2f, 0xf12f40f8, 0x89bc3094, 0xcfc8024e, 0xe33368ab, ++ 0xb13e6fb7, 0xb6a9def2, 0x25bfe632, 0x09e1dd36, 0x83e6c79f, 0xb5373839, ++ 0xf71ef890, 0xce8f0920, 0x7a3f20e7, 0x9dfe56e0, 0x7013cc2e, 0xa779f58e, ++ 0xa21fdee1, 0x456ba61b, 0xb4fcea3f, 0x815f6f1a, 0x5dd3de4d, 0xe03c7fd0, ++ 0x62b4f8ab, 0xcbdf1943, 0x7c2c9e52, 0x7cd5f69a, 0xf153f8aa, 0x4fc342eb, ++ 0x1661be59, 0xe4a39ddf, 0x8ddfed0d, 0x3e07eb3f, 0xdff80de7, 0xe093e066, ++ 0xf308a2f9, 0x90d1fdd7, 0x6699a54b, 0xe87f47be, 0xfdea97f7, 0xce0e50e4, ++ 0x6af6aa57, 0xf944d2dc, 0x741fe81d, 0x3c634bf6, 0xedc15fb4, 0x2673a62d, ++ 0x6372bde5, 0x9041daf7, 0x8e347b1b, 0x4fb8ad93, 0x9e2b75ea, 0x4face794, ++ 0x8df678ad, 0xe4eed4f9, 0x85175b83, 0x08a87b9f, 0x49513949, 0xc6e414fa, ++ 0x5fdf6312, 0xaeffa392, 0x2b8f8c20, 0x2e64f87e, 0xf6b6e2f8, 0x97708fa2, ++ 0xef9bad18, 0x93c3f9ff, 0xb57dbfcf, 0x557f6fb7, 0xfebc58eb, 0x7732f657, ++ 0xe334dc38, 0x9cc5907e, 0xc17c05af, 0xa35f2afe, 0x9348b8c9, 0x854ff583, ++ 0x283a48ef, 0x772dfe23, 0xcecf7c5f, 0x5ea6f4a5, 0x57f81b3c, 0x17bdeef8, ++ 0xc2b7c0c7, 0x4507ba93, 0xde6aabed, 0xbef31b9f, 0xf043c94d, 0x1955ea1d, ++ 0xefcc258e, 0xd0728e19, 0x617ef1bd, 0x2f79f985, 0xf2bd3c9e, 0x02f81d7d, ++ 0xa78081e7, 0xe9760d9e, 0x117ddc87, 0xefb1d29e, 0x352c79ab, 0x86958dfc, ++ 0xa18970df, 0xe29e1307, 0xb4f0c30a, 0xa78931f4, 0xff5ea7f2, 0x2ae7ee23, ++ 0xd8e434cd, 0xfe7cf27d, 0x8c3df6e2, 0x37eb85af, 0x5da833da, 0x4986617a, ++ 0x1637975e, 0xbf3fe079, 0x3b56fd6d, 0xd0bd3ff8, 0x97bd2fdb, 0x035f3caa, ++ 0xb47fd8ae, 0xb54f7db0, 0x43dbdc87, 0xdcbddce3, 0x3bfe1715, 0x4a14376a, ++ 0x4c6f2e3a, 0xe578c448, 0x803f658d, 0x7ee4a55d, 0xe07ddf24, 0x98b0fc92, ++ 0x7e5f03fa, 0xe7c7c930, 0xeb971197, 0xaebd7f6f, 0x1fd5ca50, 0x8fbde5d9, ++ 0x8fed31a9, 0x4345de73, 0xecf10fb4, 0x20ceecec, 0x631d05c6, 0xbc8b0ede, ++ 0xb6bb3237, 0x83cc53f3, 0xb7ce7454, 0xa77b8941, 0xa20fb2a0, 0x3c8b36fa, ++ 0x95699557, 0x5ca14565, 0x78685c3f, 0xf274062f, 0x7291743d, 0x857a52eb, ++ 0x4fd54fa2, 0xd4ba9ca4, 0x250b4afa, 0xfad57e5d, 0xfc30c83e, 0x74be7925, ++ 0xe8bb8d27, 0xcf7ce1fe, 0xd3ad57e5, 0xd857dc61, 0xf928debb, 0xad17103b, ++ 0x41da5b37, 0x5b6f5e97, 0xd67ea0f1, 0xd9bc517b, 0xcb9513e0, 0x691f1bde, ++ 0x0f91f195, 0xe8b7da34, 0xbb960fbb, 0xad4dbf38, 0x2fe7f94b, 0xa041fcf7, ++ 0xc3c8d130, 0x3e858cee, 0x9efc6a59, 0x3ac90886, 0x7b0acf9e, 0x757bf6ae, ++ 0xcf929b8f, 0xfd8d1bc7, 0x07de7450, 0x594d167e, 0xb1c87f7c, 0x71620fd6, ++ 0x9307ca6f, 0x77d4fce4, 0x9bbf1b77, 0x7146d621, 0x4de93abe, 0xaa47e0eb, ++ 0x7fb0240c, 0x31a68ee6, 0xb9dee11f, 0xcaa4d63b, 0x9e865573, 0x7f90c4bf, ++ 0xad977731, 0x37ed12bb, 0x81eff067, 0x1c4bba55, 0xb4c5bff0, 0xb26472cd, ++ 0x00ed2bde, 0x5bbaaf15, 0x1e7c2513, 0x6ad7b8cc, 0x3660e586, 0x9ba59bf6, ++ 0xc33ffea5, 0xde23d622, 0x64a5ac39, 0xc3e40a5a, 0x97bc9a43, 0x3ef98b62, ++ 0x929ceeab, 0xaf010b87, 0xeee17b88, 0x61fbb7b6, 0x2fd20a77, 0x07cc1eb0, ++ 0xd0621970, 0x2eb6b1c7, 0xc15dbfbe, 0xdf3d5ff3, 0xc542e8a3, 0xf7e12acd, ++ 0x947d0249, 0x547d020e, 0x75b1f118, 0x5eb8536d, 0x9f0e75b9, 0x634169e3, ++ 0x362b23b2, 0x28183f16, 0x095bf9c0, 0x29ba8a8f, 0x5517a133, 0x804a8b6d, ++ 0x0f6e935d, 0xa1eb87a4, 0xe1ef5b15, 0x6c9f3d73, 0x9eb9f175, 0x53599ea9, ++ 0x3df00613, 0xf7e145c8, 0xe4351f20, 0x14dd754b, 0x4a9cf9d3, 0xc1f913ea, ++ 0xe18f697f, 0xee75297c, 0x3f53a166, 0xfce2380c, 0x795e55cd, 0xdb8526ee, ++ 0xcff5fb7b, 0x66a3f2ab, 0xec238e79, 0x85ccd11c, 0xdd6d7df4, 0xa7e871d3, ++ 0xc6b781e6, 0xd7e08413, 0x40fb137a, 0xcda239ef, 0xe5511cf2, 0xe79ffd03, ++ 0x5431f751, 0xf8a617ed, 0x78c11de2, 0x90f543d6, 0xadde2070, 0xb9eb047b, ++ 0x1345589f, 0x97a575f6, 0x865de7a8, 0xbe24fa1c, 0x5ff81d35, 0xdf1373b6, ++ 0x56227677, 0xde774bd6, 0x21c84bfa, 0xd4947b7d, 0xf5826dbf, 0xd480f2db, ++ 0x30f9d597, 0x1d87739c, 0x4630aa7e, 0x9c647bde, 0x52f35233, 0xb09edff7, ++ 0x7071fbc9, 0xfcf4087e, 0x09542d9e, 0xfa47be7c, 0x471de228, 0xaf7bfa0d, ++ 0xcfbfcad5, 0x80462012, 0xeb5ef15e, 0x2388b1d3, 0xd8ac3d2a, 0xce3f07fa, ++ 0x27d8af57, 0xbee2f1cf, 0xd413be78, 0x7bd497f0, 0x78adbd24, 0xf70d3ece, ++ 0xc55e9317, 0x216d6a4f, 0xaaf87f47, 0xdea6f436, 0x6c3ddefa, 0x96eed597, ++ 0x7b6d417a, 0x4a05eb17, 0x04e750cf, 0xb177766b, 0xabbea09e, 0x52e12bdf, ++ 0x2f3e57b7, 0xf4bf1e43, 0x6cb5f8b7, 0xd71acbd8, 0xe7bc9ff3, 0xf0b655d6, ++ 0x575bbafa, 0x02fcfbd1, 0xe90fe18f, 0xdefcbd66, 0x3db35fbc, 0xe8c6b753, ++ 0xb0f6ea97, 0x0c573cf1, 0xd08ef794, 0xbe372cf3, 0x81f49af7, 0x1ed2bdba, ++ 0xaf45d50a, 0x7adc3ce7, 0x877f8db7, 0xfbcdcea5, 0x4b4696f9, 0x262c6d9e, ++ 0xdcfacd17, 0x6c7f2301, 0x2e3bcd60, 0x445209f8, 0xbbdc61f7, 0x9e9c48fb, ++ 0xfc38c575, 0xf38063e4, 0xa0f9d4c8, 0x3c7c2f73, 0x375ffd06, 0xee3cf3ac, ++ 0x3f6bb0c4, 0x91f115bc, 0xeb185751, 0xdfe4efc8, 0x48781855, 0xec47ddca, ++ 0x63df3d62, 0x88112b63, 0x48b01c1b, 0x37f026fd, 0xc21a7bf9, 0xbce3271d, ++ 0xbde53217, 0xefe94e0e, 0xf796e9ef, 0x8fb0843c, 0x4ea7fda0, 0xc7891f6e, ++ 0xbe485725, 0x177e312e, 0x3d9a6be2, 0x9ba83fed, 0x1afd0c8a, 0xd324aa80, ++ 0x8594505a, 0xf7993afc, 0x469f7ead, 0x0d93abe9, 0xd8669d79, 0xc9218e59, ++ 0xe6bfd06e, 0xceb9f3f7, 0xca87f9d5, 0xbbf7fe31, 0xcd3bfc9d, 0x72716f2a, ++ 0x6bb4b477, 0xfde74c86, 0x44daf34d, 0x943fb529, 0x6f21096f, 0xc9c2fbff, ++ 0x8ce15d71, 0x2e2d73d0, 0x0ed6bfce, 0xc857fcbc, 0xa7eb54f9, 0xfd69e387, ++ 0xf9a6ffa9, 0xf5170320, 0x9bc8f47c, 0xd85e9654, 0x38eb07b6, 0xc5cfa71e, ++ 0x4cf58e3a, 0xd509d2ef, 0x3bb4f7df, 0x10ff727d, 0xf03ff3e1, 0x25c6bfcd, ++ 0x75e6fa5a, 0x7923fbae, 0x93b7463f, 0x0f93c2fd, 0x461ff718, 0xb25ce7cc, ++ 0xa9c0f397, 0x9cfdc31d, 0xbdf7c2db, 0x98703e4d, 0xac9c33ef, 0x9a743bee, ++ 0xde143bef, 0xadf804b4, 0x48beba21, 0xf543e3ed, 0xc63da67b, 0x74f761ef, ++ 0x352fd9bb, 0xbf7fa5a8, 0x07d05bca, 0x2ebf9f68, 0xde676cde, 0x2fb4857d, ++ 0xbbf036ef, 0x2564b32f, 0xc16c20e0, 0xdb2f2334, 0x6a247bf4, 0xe31ab5ff, ++ 0x30e033cf, 0xeb916dcf, 0x123df88e, 0xcf0a0745, 0xfceaaf0a, 0xf88fc296, ++ 0x384bc756, 0x2978455f, 0x63e25fb8, 0xafe3e31d, 0x7625adaf, 0x7efe4312, ++ 0xffe5e313, 0x6f7c1f00, 0xa3e365f7, 0x418f8cc3, 0x70d7212d, 0xc80f09e8, ++ 0xcc8b2ddf, 0x827914bb, 0x6b22c0e5, 0x7503fb34, 0xe276dee3, 0xffc097ff, ++ 0x4d87ef8a, 0x7ec02cef, 0x47884c79, 0x4b4eaf31, 0xe97f3f3b, 0x43964c8a, ++ 0x8a474543, 0xcea73dfc, 0x5ac7d071, 0x5ba9fb8c, 0x9f27ceb4, 0x3f77d01d, ++ 0xbaa0b9f5, 0xd0f83a9f, 0x6db71a12, 0x9e7dfc9e, 0xee144273, 0x8aafdc87, ++ 0x47177e36, 0xcbfbf088, 0x3587f99f, 0xf7587a1d, 0x4b8e68c2, 0xde7515b6, ++ 0x2daabd07, 0x080bebc7, 0x173a9fbe, 0x9660587a, 0xbbe9c793, 0xe64d3cdf, ++ 0xe3e089c5, 0x5c3c8f88, 0x2ef1cd15, 0xd0f55f75, 0x213ffd38, 0xadef22df, ++ 0x592b507e, 0x0afe8958, 0x173bbce4, 0x93b53f46, 0x9365717a, 0xc7e7a228, ++ 0x0e39629a, 0xf954e8a9, 0xba058761, 0xd49c021e, 0x193fd8f9, 0xaee0a5f4, ++ 0x40f9e5f9, 0x67457f05, 0x6d7cbeea, 0xdeb7a4a5, 0xc17ade3c, 0x8543bc79, ++ 0x51749fbc, 0x380bcf94, 0xfebc5bff, 0xb2dde60e, 0xc562f09c, 0x8ffc25fc, ++ 0x115bbf19, 0x065d5fc9, 0x1ce3091f, 0xf92122c3, 0xb73a9163, 0xb73e64d0, ++ 0xe97f7910, 0x71fadc5f, 0xb45d7bd0, 0x9ecefe5b, 0xbc78d6f6, 0xadbfed7c, ++ 0x9cb9e6fd, 0xdb35f831, 0x3cc69fa5, 0xa50e79d5, 0xf456be3f, 0xf0e41a71, ++ 0x3cbe6fb1, 0xb8d8e514, 0xf7687392, 0xa6cfc2e0, 0x53f86b61, 0x439f274a, ++ 0xbfc2d3f9, 0x793fb1a5, 0xf57fbca5, 0xf17be772, 0x0f4964b9, 0xf3ca5577, ++ 0x91a2a964, 0xefb937e9, 0xf20babbc, 0xf25cf224, 0x3fc303ff, 0x80000177, ++ 0x00008000, 0x00088b1f, 0x00000000, 0x3cb5ff00, 0x6594580b, 0xff3fdfba, ++ 0x6018185c, 0x8a22e440, 0x86888a3f, 0xb880c034, 0x102a3b59, 0x93b4174a, ++ 0x98e9abab, 0x18665ca6, 0x939e2ed4, 0xaea18c3d, 0x4f47bb9a, 0x356b696e, ++ 0xee1598a8, 0x0c0d1219, 0xb324b46a, 0x44e710f2, 0xc1eace9e, 0x19b51532, ++ 0x39eb6cc4, 0xdf79eeed, 0xe67ffbf7, 0x7bbb6622, 0x9f3d3d0e, 0xdeff77ef, ++ 0xdf7efbfb, 0x2eff3f3f, 0x63092d8c, 0xf817f7f4, 0x098b0a7f, 0x2585a782, ++ 0x7e1925b1, 0x1a98c8b8, 0xe2777ed4, 0xe9f6a0b8, 0x5c107652, 0xa829319a, ++ 0x29a6bdff, 0x05fdf041, 0xcffa83d3, 0x820cccb4, 0x66a8cc2d, 0xab6b19a3, ++ 0x973dc92d, 0xb5dbd8c6, 0xd4e7b965, 0x3f7f86d0, 0x759397f7, 0x26480f47, ++ 0x31ddd2c6, 0x0093d473, 0x32ba3e8e, 0xa609e015, 0x24ea39f8, 0x5e8f9380, ++ 0x7632354b, 0xc38129bb, 0x36bd1db7, 0x536ce00a, 0x80ef8722, 0x963186c5, ++ 0xe39a4a6b, 0x67ec64cc, 0x69b356a9, 0xbfb36328, 0x0d1639ab, 0x99ae9f4d, ++ 0xc8aa48f5, 0x733619d8, 0x27ec0644, 0x1e3ad539, 0x7f8c1fdb, 0xc0b45d78, ++ 0xa87fcfd8, 0xdc6158d1, 0xd999534c, 0xef98c794, 0xbb16546a, 0xd0b3b19d, ++ 0xedfe86c6, 0xc61e6325, 0xca9b19f2, 0x86a6c251, 0x14623c19, 0x734c23fc, ++ 0xe3c147a5, 0x0b04c628, 0x1162ab63, 0x512d8c4f, 0xa8c29e23, 0xa91ad4f4, ++ 0x489b5a3c, 0x12b57be5, 0xec78025b, 0xf2a0cda8, 0xea89ad78, 0x5016d44f, ++ 0x85ad51f9, 0x25b593ca, 0x96d67654, 0x71482951, 0xcfcc3e6c, 0x68369af6, ++ 0xa9cc0f00, 0xeb0f398e, 0xe9033fe3, 0xa6325a10, 0x7a15e766, 0xd17fe742, ++ 0xd137ee5b, 0xcf1b86b9, 0x8febf847, 0xa9267fb5, 0xe60e80e2, 0xce0e9330, ++ 0x29d0d93e, 0xec399985, 0x55cf7804, 0xf14551e6, 0x7ec0ea7e, 0x236cee71, ++ 0xa819b3f6, 0xf43f5a5f, 0xef7ec2cb, 0xbeb1a927, 0xa5d26b46, 0x86bcf632, ++ 0xffb0f539, 0x1111d548, 0x67ec89d7, 0x0ffa0eac, 0x732a01d7, 0x32d04b18, ++ 0x8fd0ed86, 0xa7b94185, 0x2237af9f, 0x833966b6, 0x302c4679, 0x7152ea98, ++ 0x80c62eb7, 0x3c43c9be, 0xe4bfb849, 0x8faa5a95, 0x35497554, 0xb5bcc606, ++ 0xa7c8199e, 0xfe9ce185, 0x81965a85, 0x70aa60fb, 0x57ac0353, 0x91d0fe24, ++ 0x568af00c, 0x66961b21, 0x9db2ba85, 0x80d5dfc8, 0xff871663, 0xb80d5deb, ++ 0xe2b3ba8e, 0x15d7e815, 0x84da6c9f, 0xc43c4ad8, 0xbc6172d2, 0x019324a3, ++ 0x16d8bbbd, 0x18bdc701, 0xf88d5d65, 0x46b3207c, 0x49992a60, 0x92c49e60, ++ 0x609b5d88, 0xd8fb5f3d, 0x59cbe43c, 0x0320e93a, 0x4f73a879, 0x1598f921, ++ 0x4609e52d, 0x70e6ef84, 0x80507482, 0xca73a376, 0x8790429c, 0xe37a7daa, ++ 0xb53900b9, 0x608263bb, 0xf1924b47, 0x569c805c, 0x1c603fe1, 0xb35047bb, ++ 0xf26cc678, 0xd60ace56, 0xb079467f, 0xe5ad7c97, 0x96d3ebfb, 0x9b6c604d, ++ 0x0e3c2249, 0x86780a3d, 0x8f4df673, 0xfd82ed74, 0xc9a90c26, 0x65fb015e, ++ 0xf61e5299, 0x45f4d14b, 0xbeaf0119, 0x2e25d41f, 0xfa8f8d03, 0xfe7e0987, ++ 0xa44da97a, 0xfbbe50fa, 0xf240b645, 0x6c3348e3, 0x27543a46, 0xd9518586, ++ 0xe198b576, 0xb4b2ea3c, 0x458f3059, 0x659616cb, 0x7a7e38de, 0xa7c68ab6, ++ 0x5e92d7ae, 0x5b045520, 0x053384b6, 0xc602b276, 0x8a871fea, 0x4076f19f, ++ 0x518ed327, 0xdb23f0c9, 0xfd41d50b, 0xdfdfd82d, 0x4e882cce, 0xd331fc65, ++ 0xd56beddc, 0x2fc87af2, 0x0c6b994b, 0x0199211c, 0x123e415d, 0x1de88799, ++ 0x784b1395, 0x62fce853, 0xe91ebe9c, 0x7f02269c, 0x8cc950e7, 0xc0472650, ++ 0xfc9ed07a, 0xfc85de8e, 0xf9cf47b9, 0xcbc54d3f, 0x5fde2a3d, 0xc89cce1b, ++ 0x660023ef, 0xb1c84e50, 0xa3cec99e, 0x8f343c79, 0x7c8d94d8, 0xb4dcc49d, ++ 0xd273027e, 0xc37e947e, 0x949ea759, 0x1d2fba80, 0x545935e9, 0x474f8a0d, ++ 0xe45e94f6, 0x97e82f03, 0xb7f402af, 0x556a2237, 0x71aafd20, 0xdc7021bc, ++ 0x8ca71a54, 0xb152afb7, 0x5e9086af, 0xa7b23e24, 0x4cae2ca9, 0x13dec71c, ++ 0x53beb072, 0x1fe9165b, 0xf07a0dd7, 0xffc7902b, 0xe588bd00, 0xb887d029, ++ 0x0fa0e7fe, 0xe803fcb1, 0x033fac43, 0x1ecb10fa, 0xff5887d0, 0x2c43e805, ++ 0x348bcf67, 0x5a38fca3, 0x82afb0a6, 0xed6341e4, 0xa7bb8009, 0xd147ce0c, ++ 0x8fb847c8, 0x33dbc1d4, 0x38bbf694, 0x308f7d3d, 0xe254aed7, 0xd8c6b5cb, ++ 0xe70fe91b, 0x7cf9e3d3, 0x1b8e6c91, 0x8f2934f0, 0x892fb9f3, 0x0d6cfac3, ++ 0xdb1516c1, 0xe527e38e, 0xa3fcf969, 0x6ed8e554, 0x76f3e589, 0xfb0c03a7, ++ 0x45305d39, 0xe3fd8d97, 0x0fc73ea1, 0xede78f77, 0x5ebc6196, 0x7ed2afd9, ++ 0xf9c8db26, 0x4fbba650, 0x1267eb03, 0x4afcd3bf, 0xf91395ff, 0xbbfb42fe, ++ 0xae2554d2, 0x4361f041, 0xe593cdb9, 0x44e1f002, 0x900d4839, 0xe4896a8b, ++ 0x8543e142, 0xb872a2ff, 0x64e9a6bc, 0x42db073e, 0x831b43f8, 0xe4013a7a, ++ 0x58bc2040, 0x8f679c18, 0xa84bcb20, 0xf689403c, 0x45079140, 0x4f7e140e, ++ 0x62133906, 0x33b8e7fd, 0x32955f84, 0x9d3fd65b, 0x118f91f1, 0x4634db5d, ++ 0x207f6026, 0xd54bee24, 0xca1e727f, 0x54a47c67, 0xfd15d307, 0x983350ca, ++ 0x7bf8ab1e, 0x85e8a1f1, 0x06e3e09b, 0xf979683c, 0xf481e2d7, 0xe471ea1c, ++ 0xd6f441df, 0xd958ecec, 0xebfce19f, 0x2194b6c8, 0xbd04f91f, 0xcb07005a, ++ 0x13fce7a7, 0x7949fe7a, 0x1f0a1cfc, 0xe38ca145, 0xd1ce78fa, 0xe53dea37, ++ 0x5ce7033c, 0xa5ff48c6, 0x50faf385, 0x0ae72b3a, 0xf14b7fd0, 0x193e0a7c, ++ 0x70c5fee3, 0xa5362ff0, 0xbb731f22, 0x617a1be5, 0x3fe656c1, 0x9ed955ff, ++ 0x12254efd, 0x65f6283f, 0x17105ea0, 0xb20cccce, 0xf408cc3b, 0x91d76bec, ++ 0xac547bbc, 0xd7180dfc, 0xf24e7380, 0x6c8f7f9f, 0x8ce7fa87, 0xe77fa151, ++ 0x44e0d6fd, 0xd61de63b, 0xf1804677, 0xd8e0edde, 0xb9625f90, 0xfbbb0047, ++ 0xb418d808, 0xef405753, 0x2ec674b1, 0x8251a2d5, 0x67abee7e, 0x63873804, ++ 0x00c2c887, 0xeb8ee295, 0x969f91b3, 0xe88c6bb6, 0x7f6dd51f, 0xe3f238f6, ++ 0x424166f9, 0x0cdbc4bf, 0xf6fe87c7, 0x3d2e916d, 0x18062ff4, 0x68332ffb, ++ 0x8f5f125d, 0xd7979d91, 0x3d5f4afb, 0x35df818a, 0xf086876d, 0xd155f4be, ++ 0xbbd9fe85, 0x11aa57db, 0x5812ef3e, 0x162b8c02, 0x01247757, 0x60a2f95c, ++ 0x9b38c1d2, 0x0057b8a1, 0x55f2ab3f, 0xfcc0f266, 0x26914d95, 0x6dbf9a27, ++ 0x027a2f9a, 0xd7728bfc, 0x3dfa2d56, 0xeb833be5, 0xc304f72b, 0xffd22f40, ++ 0x0fa846b6, 0x672fcfd0, 0xbf91c647, 0xa3658e39, 0xc5b6c9bf, 0xe8a2bf92, ++ 0x56fd1bf7, 0x2ba3d727, 0xec66deb8, 0x3059f89b, 0x3d7ed8af, 0x87030be5, ++ 0x59f0ca67, 0xcebebf80, 0xa5e0a2e9, 0xebfb5e5a, 0xc3766624, 0xf5dbab79, ++ 0xb79c2746, 0x28cbf5ba, 0x8477f406, 0xf247dcf7, 0xa234587b, 0x45b1b7bf, ++ 0xed7e2274, 0x2addfa6d, 0xc1f55bc0, 0x2452b44f, 0xf9397de2, 0xe733772b, ++ 0xf226637a, 0x12758a89, 0xc96a751f, 0x2df4b18f, 0xadbc79c5, 0x01fa237a, ++ 0xeb3f87d5, 0x41f08798, 0x8e91e981, 0x4f887a23, 0x8140ee96, 0x23dd2da5, ++ 0x44f9fbe4, 0x9d22ba44, 0xaf44d1dd, 0xa4774865, 0xe91dd033, 0x713d222c, ++ 0xc5d6a47c, 0xf82444f9, 0x5f4e3efc, 0xe2c5ee85, 0x57d62d66, 0x4f3a73d6, ++ 0x5cf0d1db, 0x8681f138, 0x74407cc9, 0xd393bf3f, 0x4ebedb5d, 0xb7f90c3b, ++ 0x5a0f843e, 0x807c0375, 0x0f81bbfb, 0x015fe842, 0x103d46f4, 0xf4a107ca, ++ 0xeb9b2c7f, 0xcfbff00d, 0xeffd0eff, 0xd00b8848, 0xfa7ecae4, 0x63eeaad0, ++ 0x82deb071, 0xe5f6cbd8, 0xf1263f50, 0x7e06960d, 0xeb28b9c6, 0x6707d405, ++ 0x0ebc7fa6, 0xe335d5c9, 0x97e46cf5, 0xc34f4d3a, 0x8ce150f3, 0xcca13089, ++ 0xee6752fa, 0x5dce137c, 0x4a7dfb18, 0xf1dfec13, 0x6c88ceb6, 0xefb64d76, ++ 0x7c0617f8, 0xef1c6761, 0x78b3e740, 0xce9b7b5e, 0xb1fc03a3, 0x604b22e6, ++ 0xe24be73c, 0xf6d22ae7, 0x718e582d, 0xeb87cc01, 0xe71e1608, 0x7fbdb555, ++ 0xc7f2c84a, 0x17185565, 0x108d3ce2, 0xe7f86617, 0x531f8c11, 0x28ce433f, ++ 0x09d1e7e2, 0x87e84a77, 0xd665cdd7, 0x663fd1f0, 0x87d9181f, 0xe9b8e517, ++ 0x4de3fea6, 0x37e284ec, 0x18f0e732, 0x4e253b94, 0xb2d4f454, 0x63c7be02, ++ 0x0f509f8f, 0x7b7cf581, 0x4547a204, 0x3827e81b, 0xe34b856f, 0x79008492, ++ 0x405ffb92, 0x5dbc037e, 0x521cd674, 0x0677c889, 0xe64dafda, 0x23e46acf, ++ 0xf9a56f38, 0xd39e1448, 0x5b15eb26, 0xc015e82b, 0x52db257b, 0x09577c8c, ++ 0xe10679eb, 0x4d7dcaa7, 0x8adca714, 0xb33f149f, 0x5fb839ba, 0x99e80e66, ++ 0x4ccf48db, 0x77e00bf8, 0xe993017c, 0x9149f5cf, 0x03dd1998, 0xa4cfd3fc, ++ 0x01e79468, 0xff7027fb, 0x633fd14d, 0x078883b7, 0x15ce3bcc, 0xeb01d4c6, ++ 0x18cfb6df, 0x27704f04, 0xbdbff506, 0xcf6a0a45, 0xb50464f6, 0x05371ee7, ++ 0x059d79c1, 0x9e27fd41, 0x93c104b2, 0xfa824a7a, 0x2cb171df, 0x84cfee08, ++ 0xbfe20cf3, 0x89dde528, 0xe9ff5042, 0xfe683e92, 0x20988cd2, 0xe320dfb8, ++ 0x152bf647, 0x3997f77f, 0x2d0a1fdc, 0x6bdefc15, 0x89475e0a, 0x082fefd7, ++ 0x25a66f5e, 0x4a9fbd78, 0x4f60bd97, 0xec2710d5, 0xe58afb03, 0xa84f106b, ++ 0x84684e21, 0xdfe10278, 0xa5813c43, 0xac09e21b, 0x09e2037f, 0x9e219b84, ++ 0xc410f840, 0xd4b7083f, 0xb8795096, 0x6fea8cb6, 0x790ebf85, 0xbaf2e3dd, ++ 0xff75e427, 0x247d3c56, 0x9e5277cf, 0x4be713af, 0x4bdbb7f3, 0x03bea8c6, ++ 0xdb129e79, 0xb8c1edab, 0x314f4561, 0x3efa2de6, 0x902ed910, 0x1d756623, ++ 0x7b438daf, 0x5fa18436, 0x3efacac4, 0xf54abcc4, 0x4dc6d1c1, 0x7fb3da12, ++ 0xdeed893f, 0xb9425166, 0x65f2da3c, 0xe573ce14, 0x7314703b, 0xb0083b65, ++ 0xf0467bed, 0x00976826, 0x0a04de9e, 0x9b9bec84, 0x3495dbec, 0x19697605, ++ 0x4d8d6594, 0x1553a45a, 0x7fb429ca, 0xb704d6e0, 0x6a0fabef, 0x287f6237, ++ 0xca2ed4ab, 0x516a5c23, 0x7f50f3e6, 0x41609a5b, 0xbed2fbbf, 0x81dfd777, ++ 0xd169b7f6, 0x5ff61110, 0xfc49f8d5, 0xc7a11fe2, 0xcf5e87d7, 0x6f603b44, ++ 0xfe0cf985, 0x1aadecf9, 0xb7fbe619, 0xc71535a5, 0x1468e1a2, 0xae2818d8, ++ 0x156c2db0, 0x96aac7e8, 0xadea1b06, 0x1a798caa, 0xb9f1f806, 0x01bf3945, ++ 0x2afd07da, 0x9c7ee323, 0x62d45afb, 0xf71df798, 0x482cfbb1, 0xa377b6df, ++ 0xb35f5d70, 0x793f1418, 0x727afa64, 0x2bbf44b4, 0x4946efcd, 0xfdd1bed0, ++ 0xdabbc72e, 0x2a3fe743, 0x09283ec3, 0x9d222ddf, 0x153be2bf, 0xef9941d1, ++ 0xe6911cc3, 0x2632de9b, 0xe5d5cf12, 0x9a7debe6, 0xd3fcd123, 0xc12d16d3, ++ 0x9c489ffd, 0x3f92279b, 0xf51a8a08, 0x06d2f8f8, 0xdcaa43f4, 0xf8b065a2, ++ 0x0bce02ee, 0x9c343be3, 0x3b483f4f, 0xf8fa81d0, 0x6c90c944, 0xbf7211b2, ++ 0x97e396ff, 0x0d35ad62, 0x419748ed, 0x7f3e448a, 0x247464ba, 0x9628f7d2, ++ 0x5bb25f58, 0xb2b2856b, 0x65d7af99, 0xbe428cec, 0x15ce6aeb, 0xe651dfd1, ++ 0x3cf94ffb, 0x403dfc03, 0xa9d12737, 0xc06f55dc, 0xe3f4fc79, 0x18e69ff5, ++ 0xd709ffa9, 0xafd1b327, 0x2088caea, 0xcb43a4bf, 0x6aae9e28, 0x57717ee4, ++ 0xe23d725b, 0xd3ef5941, 0xcf2e391c, 0xbd5d1150, 0xdfb91a2d, 0xd41606bc, ++ 0xbafb434f, 0x3f7827b2, 0xdfd9d746, 0x7b6e3fa0, 0x17686451, 0x789a9a6d, ++ 0x9d85ff3c, 0x972bfbc1, 0x78d36cf1, 0xf803e3e2, 0x203ad6d5, 0xf3e20637, ++ 0x244e4556, 0xc742a7a2, 0xcfee0cae, 0x5cea2575, 0x9ada9f18, 0x6faf881a, ++ 0xa67527cc, 0xfc90fc62, 0x3be51844, 0x2b3f156f, 0x7c40437e, 0xd45e30c5, ++ 0x53ce8c94, 0x07fbf28d, 0x312c728b, 0xee3143b9, 0xb2b8a32a, 0x0b3f818b, ++ 0x9fd1da6b, 0xfcbd468e, 0xdd70e787, 0x23f066fe, 0x587b5d61, 0xe0738ccb, ++ 0x409bf597, 0xfddf6050, 0x392e353b, 0x5fa031fe, 0x6bf654bb, 0x7cd6482f, ++ 0x7dafec11, 0x67ce8a8d, 0x38a70ccb, 0xbdeb2bc6, 0xef529baf, 0xb8e1bf27, ++ 0x6878c468, 0xc1fb9b9a, 0xd7ee46b6, 0xff53bb56, 0xedfa3279, 0xe08c1a8d, ++ 0xd887e298, 0xbce43f65, 0x5f9ef7ec, 0xf8a5a7d3, 0xcf605da6, 0x5bca3ec2, ++ 0x432476b6, 0x06733dbb, 0xb176b3f9, 0x6589fc91, 0x07fd83db, 0xe0826ff0, ++ 0xfea17daa, 0x72df9c85, 0xf12bd707, 0x01dca4e1, 0xc61c633f, 0xe4e24533, ++ 0xfb879404, 0x955d3972, 0x04e566f8, 0xfdca0253, 0x4334b546, 0xbe2043c9, ++ 0x2a07ed1c, 0x5b2edf70, 0x8de289b8, 0xaf098755, 0x1c786fbe, 0x84644be3, ++ 0xf8e31f0f, 0x3e70b5f5, 0x57046877, 0xb6078e18, 0x04c2f9a5, 0x33cc1ad7, ++ 0x48a3fb3b, 0x8256313f, 0x2e62b172, 0x982d578f, 0x487285f3, 0xa14fd72e, ++ 0x752ef576, 0xa013188f, 0x72e5e627, 0xcb50b53f, 0x56cf68ac, 0xbec89a46, ++ 0x7ee30c8d, 0x776ad17a, 0x48c3f236, 0x0175c788, 0x8691f8f9, 0xedfb013e, ++ 0xffe78a79, 0x4cc27c95, 0x131351b5, 0x5b191f60, 0xf995fd43, 0xf1f0a341, ++ 0x08df9ab7, 0xf3fc1bf3, 0x11a3be03, 0x26ccd7df, 0x3329dbb2, 0x5c9286c1, ++ 0x2a5c90d6, 0xfc02b9e7, 0x86fc0856, 0x9ba41a39, 0x8a11e76d, 0x73acece7, ++ 0x8e2b8e3d, 0xc628fbe2, 0xce1c20fd, 0xb97227cb, 0xf05568fe, 0xbf6c1b96, ++ 0xab2d9a27, 0xcde26e50, 0x94b9d5d6, 0x7f123157, 0x057994ae, 0x9e8499fc, ++ 0x8aeff441, 0xeba2458f, 0x94079035, 0x046a87f7, 0x5fc82d29, 0xe0ee7ce2, ++ 0x7332ec55, 0x3c464f77, 0x199d2d38, 0xb8ce5f50, 0xa55c2d7c, 0xef02d297, ++ 0x31df9003, 0xff8328fe, 0xe32e31f2, 0x8ac6e57f, 0xb75fd07b, 0xf0978aae, ++ 0xf281c2fe, 0xfcd6ea30, 0xf0f7ca1f, 0xadf913b7, 0x684ce99a, 0xa12d1c5f, ++ 0xfa3526ed, 0xe4433be3, 0xd3e64522, 0x42e0ab7a, 0x83ff507b, 0xe6d1e79a, ++ 0x7b37940b, 0x4f912a10, 0x95fb0fe9, 0xfce1714f, 0xf748020f, 0xf8e2db5d, ++ 0xc23606bd, 0x3e41feb9, 0xcf6a83ff, 0x63ef9411, 0xe62a771a, 0xf9d98e71, ++ 0x065cd53d, 0x9de8090e, 0xca93acf9, 0x83ea88ee, 0x39dc9a1e, 0xcff0e302, ++ 0x23ca3aac, 0x15ddafd5, 0x8b367a89, 0xfde235ad, 0xbec98818, 0xdcdee4bf, ++ 0x47bd08df, 0xf047e063, 0x39d39678, 0x56f65cde, 0x8117c02e, 0x37398946, ++ 0xf4faaf8e, 0xfde21460, 0x6607a3f2, 0x1c6182ff, 0xe60b7a04, 0xca69aca9, ++ 0x27197ba0, 0xf7c8cceb, 0xa7a157d3, 0x93a83f42, 0x670ae882, 0x99f80e19, ++ 0x3df2fac3, 0xa9e9adc2, 0xd34539e0, 0x12a200f7, 0xa1e918ec, 0x782b3a50, ++ 0x1a3566af, 0x39ab7f9e, 0xfffa1739, 0x424aad72, 0xba06f2bf, 0x1e3e82df, ++ 0x44f26f3d, 0xdecf140a, 0x9d0a5e8c, 0x821e621e, 0x71f0c54f, 0x29121ea7, ++ 0x4d7ff87f, 0xeb6689af, 0x67925cb5, 0x1b72a0e3, 0x9337a72a, 0x42ab85cb, ++ 0x4e4437e4, 0x04d2e407, 0xcfd005ff, 0xe48a2aba, 0x4dafa151, 0xed193882, ++ 0xc9a45b5f, 0x27a46ec5, 0x9fb8bbc6, 0xbd8166ca, 0x7914fc20, 0x30f7e1ed, ++ 0x5e02f421, 0x883da0b1, 0xe3e40f31, 0x1c7cf1c6, 0xf4cde3a7, 0x4ef7a296, ++ 0xa331cf33, 0x5c19f740, 0xb9d71f8e, 0xb9555ef0, 0x2dee50cf, 0x7f5ccdb2, ++ 0xc1a79686, 0xa27bc16f, 0x435d194d, 0xd6ebdfd1, 0x7bf0f32a, 0x3a6bd3d7, ++ 0xf1872c47, 0xb2f0a7a7, 0x00bcfd1b, 0xf3ce12d8, 0x7493a781, 0x69dbc44e, ++ 0xf454dc61, 0x4f0b4e03, 0x04e1c7dc, 0xdcf084ad, 0x8046a984, 0xfe4a35bb, ++ 0x7f5969f0, 0x3d3ca8bb, 0xf5216277, 0x887bd813, 0x6560490f, 0xc4208eb4, ++ 0x4e7ec096, 0x0726363f, 0xf39405ef, 0x0fee664b, 0x1db998a7, 0xffb7c818, ++ 0xf6f940a3, 0x8c3a6085, 0xf5302f78, 0x505192f9, 0x469fe67f, 0xe57dd367, ++ 0xd1f5e08a, 0x9e52a6fe, 0x77cd2b72, 0x9a7d77d7, 0x7dfe9945, 0xc2cdd80d, ++ 0xc97ebcab, 0xca478a18, 0x625a1a65, 0xd938f1c7, 0xed1a3a35, 0xfad76298, ++ 0x04301f8f, 0xe57b51e6, 0x3c00f3bc, 0x8129d7ee, 0xdec8f176, 0x9e71d267, ++ 0xcb33ad72, 0xeb17f504, 0xfe82977f, 0x5fdef943, 0xbb5f93a5, 0xc63a6377, ++ 0x9ebbe527, 0x1c10b749, 0x48f8a561, 0x797dcfcd, 0x9bdda4ff, 0xdee8fc02, ++ 0xcc571e3c, 0x84523b0f, 0xdb8cedfe, 0x79875ebe, 0x24ff31fb, 0x21ee1e50, ++ 0xed0eb9d6, 0x2e0c82ed, 0x185b6c57, 0x8f987fe9, 0xc61b49ee, 0xf507bbdd, ++ 0x2f8c89fe, 0xfed04b35, 0x8f84d59a, 0x39b5cc05, 0x1b6ff301, 0xf9bfca04, ++ 0x7ba08ffb, 0x056b45d7, 0xda1c626d, 0x8c6c98d1, 0xc7309f1b, 0xde1e3ed0, ++ 0xf581dd90, 0xfaf3560b, 0x73573a19, 0xbcf3ce17, 0xe120d4d6, 0xcaa36544, ++ 0x9fb1ee02, 0x6db8f330, 0xfc8166e1, 0x319d6579, 0x07d7c5cf, 0x9909f39e, ++ 0x4f9becfe, 0x2fdc1f48, 0xd59ee5d3, 0x0897bc9f, 0xb6ae7ef3, 0x7986653e, ++ 0x7cf6fe4e, 0xc2b3ea1a, 0xe44cded8, 0xeb5a31f3, 0xee78150b, 0x57ca3a5d, ++ 0xc592b39a, 0xf39fe804, 0xb16794e8, 0xd17ab85c, 0xf798150b, 0x71461edd, ++ 0x15bfb298, 0x78c2a482, 0x5ffaddf5, 0xbb788c3c, 0xf230dbf8, 0x8fd457c3, ++ 0xc883604d, 0x02be52a9, 0x19d297f4, 0x8c36b57b, 0x8d6bd7ca, 0xee23824c, ++ 0xf8244daf, 0x2a256b5f, 0x5fce1cd9, 0x5f5c8c2b, 0xdcbe6cdd, 0x0499c2ef, ++ 0x01bccafa, 0xf53f03e6, 0x76cb5acf, 0xcc61e033, 0x8daefb78, 0xc0c6b9f2, ++ 0xea676cf8, 0x7983c434, 0x740ef2e3, 0xf99ad761, 0x5d87e87d, 0x0fc8521b, ++ 0xa5f67d5f, 0x37ff680a, 0xe23d5973, 0x55e76c29, 0xdbbc17ca, 0x8805abfa, ++ 0x3a5df2ef, 0xdcf93e7e, 0x9e9b7f17, 0x79e602f0, 0xfc50d03f, 0xf679d8ee, ++ 0x2e508da5, 0x1b5cbcde, 0xf53fefc8, 0xfbcb2fbc, 0xdd5c95b9, 0xbd7f0f0c, ++ 0x42933d5c, 0xe40bb3f2, 0x976ff32a, 0x35eac72b, 0xe6ebbf84, 0xb788e3b2, ++ 0x0a671a8b, 0x71c5d3ca, 0x3b9f1277, 0xbfc205db, 0xf195c7a2, 0xab79f21d, ++ 0xe4cdee54, 0xfc7aca47, 0x888e443a, 0x17ad23df, 0xbe8fd1d2, 0x47f732de, ++ 0x16a87dcf, 0x9bcc2223, 0xda195185, 0x8eb5af9e, 0xf2f9c136, 0x0e7fdc55, ++ 0x2b33ef6d, 0xb79e7879, 0xe0213fc5, 0x361d8a9d, 0xf68b1d16, 0x8384f04f, ++ 0xdcb7b65e, 0xf8c6abdd, 0x2fc2e20d, 0xf650fd82, 0xbf5d8045, 0x556f7ed9, ++ 0x6a3ce356, 0x789ddebf, 0x013cc54a, 0x4f527c76, 0xac04f338, 0x40af103b, ++ 0x7bee969d, 0x202f4892, 0x943df0dd, 0x2edc75b7, 0x9cb57b84, 0x1043de8e, ++ 0x0cbcf197, 0xe7fdf313, 0x9cbd6dec, 0xf4367a85, 0x2f87d5bc, 0x5ad87f13, ++ 0xa055757e, 0x55ef4ff3, 0xfcfadd67, 0xce5ef647, 0x6af5fa42, 0xfe31f27a, ++ 0xb27b6af2, 0x6fd50e90, 0xd7fe7d71, 0xafa941e2, 0x79e5a0d8, 0x7148c142, ++ 0x85789164, 0xe3de00f2, 0xdd500f3c, 0x69f49bba, 0xc7cf1b7f, 0xc59d5438, ++ 0xa8bf9809, 0xfa81db39, 0xc7913fac, 0x05bf3065, 0xb47936f1, 0x7dd5076c, ++ 0xaf413329, 0x657be499, 0x88bc1e25, 0x79c5abf2, 0x877a36dc, 0xd0c11595, ++ 0xf284b8af, 0x560bf50c, 0x3e47aea5, 0x8a1ae8bf, 0x61f62499, 0x5354ffd6, ++ 0x089deefe, 0x2c7e48a3, 0x6fd006d4, 0x912e1ce0, 0x8a61f43f, 0x2cc11c5f, ++ 0x5a1cfd01, 0xab8a7ee9, 0x39fbf04f, 0x4f2e78c7, 0x279730ec, 0xda23dafb, ++ 0x86f980c4, 0x43fac9e7, 0xbc6727f6, 0x97243ff3, 0x9f963959, 0x811c01e5, ++ 0x4be710ba, 0x8209768c, 0x7fdf2fdc, 0x9368691f, 0x9112f8e3, 0x222d1dda, ++ 0x96397bc3, 0x0aef4918, 0x7a16d84a, 0xb983396f, 0x3d77f327, 0x03b9bf3d, ++ 0x11df4bda, 0x1a1df173, 0xbf74d3f8, 0x4d6e1c5d, 0xdd5a77c3, 0xabc6412a, ++ 0xc0333cdb, 0xdf92ad9e, 0x05164ca5, 0x497d63b2, 0x4ca7e411, 0x8f9f639f, ++ 0xe9fa55fb, 0xcc1fbc54, 0x73167e43, 0xbde165f5, 0x65f4f32a, 0xd2ab7de1, ++ 0x113bf66f, 0x99176435, 0x603b3cdb, 0xdc798d9d, 0xfbc35e6e, 0x0e27d071, ++ 0x48b61ef9, 0x8c39e1fc, 0xf3b456b7, 0x556ec7fb, 0xcef867ea, 0x467809cc, ++ 0xba065eba, 0x58fed05a, 0xf282c599, 0x0ba86133, 0x5fb1c7e5, 0xaf5ef860, ++ 0x0bb755ba, 0x9ad542f3, 0xe7e4789e, 0x6a9f2d8d, 0x781d9f91, 0xc7013b2f, ++ 0x6e5f3933, 0x1d7e2154, 0xf5efc646, 0x867ec65a, 0x71fb3b79, 0xeaed456e, ++ 0x801f284f, 0xabd71b7a, 0xf8a26e6a, 0x143cc6df, 0x831adbff, 0x913fa6f9, ++ 0xe543f3e7, 0x149e6364, 0xb7d31f24, 0x2d98f973, 0x77d41ab2, 0x4ebfce4c, ++ 0xbf204c4f, 0xf64e3fc4, 0xebcbc517, 0x8df18fd0, 0x4c024c12, 0xae770be5, ++ 0x99c8ff45, 0xdf1afdce, 0x979bafdb, 0x99717e92, 0x3cf7c01f, 0x7d3bdfb2, ++ 0x18b556c3, 0x6de99fb0, 0x0be8df3c, 0x8887e567, 0x48e1d6ee, 0xb29cba8f, ++ 0x7cff9067, 0x7793beda, 0xc5483e60, 0xe7a1a3f3, 0xc6bce510, 0x6513cc09, ++ 0x9a5df7fa, 0x19f5cc9c, 0x751f1173, 0xcafaf8a8, 0x7c651d7b, 0x819e7c8f, ++ 0xf9e04938, 0x17e99bad, 0x77c1afbc, 0x835f78ae, 0x7bf26be5, 0x41afbc58, ++ 0x7bf2f7f8, 0xc1afbc58, 0x41afbc7a, 0x0f7e59b8, 0x0835f78b, 0x960d7de3, ++ 0xb0f7e587, 0xf8ab7027, 0xf9f9cf8e, 0x1d17c80b, 0xfcc36b28, 0x086c7770, ++ 0x7fb82c3c, 0x0c10ac77, 0xffa8130f, 0xbf9f8381, 0x3e6034e0, 0x2bdb28d4, ++ 0xb0fd1229, 0x16d611c3, 0xde2f6fc4, 0x1e834757, 0x10f6792a, 0xec6151ca, ++ 0x5f28f9dc, 0x863a71fd, 0x6797c87a, 0x1dfb077d, 0x6d2d3e3f, 0x3d47e92b, ++ 0xff77afdd, 0xca68b6f2, 0x32207de7, 0x929a9611, 0x0cd6bb91, 0x408314f0, ++ 0xe27a0b7c, 0xbe2532f6, 0xb5a67984, 0xb9ab322d, 0x9fa2305e, 0x96da245c, ++ 0x922b3ae0, 0x7fa8b9f4, 0x4f5ae597, 0xe3f50de4, 0xb2d878b9, 0x3a87f434, ++ 0x9867d234, 0xac7e7597, 0x294f1861, 0xdfa53bf9, 0x4e53b99d, 0x19e9b8e1, ++ 0xe0e6d7a3, 0xa86420fc, 0xd65a2ce7, 0xa8b3fb88, 0xd23a8422, 0xf51a925b, ++ 0x8f5929c0, 0x5fb8954c, 0xea4ad1ec, 0xc3e78c58, 0x7de1c4a7, 0xdf4c876e, ++ 0x4f7d32e3, 0xfbc5f4c8, 0x897f7c2d, 0xe2585bf7, 0xa19616fd, 0xf2e2d0ef, ++ 0x23c8beca, 0x04a5f73c, 0x819b63be, 0x4df5c572, 0x460bfa0a, 0xbcf6ff39, ++ 0xcd0a6fac, 0x9c7cbd65, 0x92a9e69b, 0x359777f3, 0xca85f7c1, 0x4678ff38, ++ 0xcedd67e3, 0xd68b34f5, 0xc3bef7f2, 0x13df1399, 0x89337acf, 0x975e4ff2, ++ 0x3a01a9ca, 0x471902cf, 0xe4dec63d, 0xe44b2e71, 0x40eb32f2, 0x93abf502, ++ 0xd8f6a8f3, 0xb458f4ce, 0x295cb2bf, 0xf33fa1f0, 0x1cf648f7, 0x4b7ca180, ++ 0xcfb3e7e0, 0x018f4cea, 0x55e82bd8, 0x5df64fc8, 0x964bbdbc, 0x7928fb3b, ++ 0x2c3cf93e, 0xf4829dcc, 0x99bfb5f0, 0x9bc030f2, 0x5ca59e0c, 0x49d27bef, ++ 0x3a4f335f, 0x2cba6bbe, 0x3be0cfb8, 0x2b43dee3, 0xfabbe1e7, 0x4bf71acb, ++ 0xe87d7f08, 0xcef879b1, 0x74d0b2f8, 0x3ed818c6, 0xef829dd4, 0x3d0f7b90, ++ 0x3687dbca, 0x0a6314bd, 0x9c6f3580, 0xd3ed76c1, 0x042bcd8f, 0x3ae754b8, ++ 0xf37c8b5e, 0xf4bf9caf, 0x479e0ffb, 0x72b554fc, 0xfeea7dbf, 0x40de5783, ++ 0x92307cbb, 0xcd8c13de, 0xd7bc254f, 0x19b2beb5, 0xa4dbcdf9, 0xd4d87921, ++ 0x4f4be9f8, 0xa51d3f52, 0x6e754a57, 0xfa62a633, 0x7da10d0f, 0xbfb84695, ++ 0xe89c5841, 0x0e947da4, 0x361cf2e1, 0x7e1e6eb1, 0xb83de01f, 0xbf9471ff, ++ 0x687068d2, 0xebaf3f71, 0x07953e89, 0x3e6215c6, 0xb9d91bc0, 0x7eafe700, ++ 0x1ddfc74d, 0x8a98481c, 0x3e7301f9, 0x8c576fcf, 0x768292df, 0xd5f87556, ++ 0x5e624fbd, 0xdd3d35f3, 0xb96238f3, 0xd629579f, 0xfa272fe7, 0xef8bdeed, ++ 0xeaafbc55, 0x02b5dee9, 0x57007173, 0x79431dec, 0xf4feb7f9, 0x43a402e5, ++ 0x2f73b891, 0x47b37fd6, 0x743c42af, 0x77d12d69, 0x69761ca2, 0x90acde28, ++ 0x21ee8ae1, 0x3d113f7c, 0xb8bf44c5, 0x6768292d, 0xe3fc872b, 0x52efb87d, ++ 0x184bcb71, 0x7457b0ef, 0xfbd0d774, 0xc60de02a, 0xf06836f5, 0x23ec1de5, ++ 0x72fc8d52, 0xe0b2d859, 0x81bf9c05, 0xdfacbbf7, 0x3674f842, 0x1eb8658c, ++ 0x876863f4, 0x835b0b2f, 0x5e1b7bea, 0xf478c2c9, 0x14a56bd2, 0xae7c2a97, ++ 0x1ee54bc8, 0x243d905d, 0xf98f104d, 0xe8cff94a, 0x3c808664, 0x3b43a5d6, ++ 0xff302fbc, 0x1a8d4bf8, 0x5470168f, 0xf16b63a1, 0x0f22b35d, 0x9777c995, ++ 0x552af9e0, 0xb7e8e9f5, 0x2cf6e454, 0xd5e8b940, 0xe844b0b3, 0xaf6ca1f7, ++ 0xccd79b2a, 0x66f7ff44, 0x9f2a79fb, 0xb2eba3eb, 0xd16f5e1c, 0x19ef02bb, ++ 0xd43fcb43, 0xb523e932, 0x46a87e1f, 0x32bc3e47, 0xb75a87df, 0xeab4e30d, ++ 0xce3fae58, 0xd046ff40, 0xebca4f63, 0xdc155c2c, 0xbf9f26bf, 0xf6d6aca3, ++ 0x53dda3a4, 0x2be7b7e6, 0x1d27ad7a, 0xb8e855f5, 0x37d65152, 0x6fa40baf, ++ 0xb3859b2a, 0xa2091df4, 0xcf8fde34, 0x0ba730ca, 0x460d11df, 0x997cc487, ++ 0x7e97300e, 0xa3ed2a62, 0xd16f51b2, 0xe1553cc3, 0x27e8513d, 0xa27b22d9, ++ 0x1ef1ffd0, 0x992ed916, 0xfcca717c, 0x29ebfca3, 0xb70ac9f9, 0x6c1fa2c6, ++ 0xc60e383d, 0xdff0cbc7, 0x89948a80, 0x5bca6e5c, 0x663d6822, 0xbe47c9ec, ++ 0x3c19df2d, 0x0c69cf0e, 0xcb6f4790, 0x38c0f8ee, 0xdf3e577d, 0x4b384fb7, ++ 0xd3fbe372, 0x07c82917, 0x16b62a95, 0x092f27ef, 0x80103bfc, 0x4b903be9, ++ 0xe5673df2, 0xe47086b7, 0x6dd74b9f, 0xa15ec724, 0xd95cf487, 0x5f495b9b, ++ 0xa43d3578, 0x3e268ae7, 0x9e98e1cf, 0xcab7a805, 0xfd23ee26, 0x59ea4de1, ++ 0x6527df80, 0x4608f029, 0x9bc17ff6, 0xf6879fbf, 0xefe454be, 0x8d6ed827, ++ 0x3887e791, 0x78c997be, 0x77436c62, 0x1a1fc52d, 0x85a4fd09, 0x20fb9513, ++ 0xa2fcffad, 0x4cbc9e5f, 0xf28cdfda, 0x7ca06e59, 0x8d55f80f, 0x37ffa06f, ++ 0x7984de37, 0x29bc50f4, 0xb1718af7, 0x3a452fdf, 0x7d6915dd, 0xc9ef1f3f, ++ 0xbe287b33, 0x3f276e00, 0x1d6dfabe, 0x4d3e99c5, 0x5fd45edf, 0x0fd69131, ++ 0x361f61f3, 0x4c7ae76d, 0xf4d15d4d, 0x3f4ba074, 0xf48df903, 0x6f37e708, ++ 0xfdfe6ee6, 0xf92f7c87, 0x065eb25f, 0x91eac67b, 0xe74e043f, 0x7c0e5b77, ++ 0xdbc6fa84, 0x74f49a39, 0xb6f53ca8, 0x7a851b3c, 0x77d814e3, 0xe01e4067, ++ 0xe857a2d4, 0x7c1cc01d, 0xc3e501ff, 0xd7cf836b, 0x1403c3ff, 0x01cdb20f, ++ 0xdb8fc8f5, 0xbc50e182, 0x827a5f20, 0xfc49c0e4, 0x5bcb2f13, 0x6aced4d5, ++ 0x3c00c3c4, 0x0031600b, 0x87021a3e, 0xdc6567f4, 0x5a07887f, 0x11b6bce3, ++ 0xdf8a6e9e, 0xbd77f3f7, 0x08d76075, 0xf741183e, 0x60fdaad2, 0xddb8e2b7, ++ 0x15517b42, 0x2b7949d5, 0xdd1d41ef, 0x7add3ca7, 0x0fcf0521, 0x99f948fc, ++ 0xe337d6aa, 0x9b1fae31, 0x6a3f712f, 0x7a78c1ff, 0x35b0730f, 0xa510e31e, ++ 0xa772a6de, 0x6417dfcb, 0xea50fea1, 0x1d27a2ed, 0x74255ff7, 0x58fb6166, ++ 0x07f537dc, 0xd1984458, 0x97026c39, 0x922ad67b, 0xdba50f9e, 0x36fdf930, ++ 0x7a2c87e8, 0xe79871c7, 0x507d140d, 0xa395eb21, 0xe5c99f58, 0x47dca8df, ++ 0xca12fde1, 0x627a20fd, 0x564782bb, 0xf89d7943, 0xcadf7c89, 0xe7979a78, ++ 0xbd7bf89d, 0x8d672eb7, 0xd271c4ca, 0x01ccbbc0, 0xafda347d, 0x240f505f, ++ 0x5a781e92, 0xaae70f13, 0xd530497c, 0xf98a90c1, 0x3ba18a6b, 0x5e5ea65b, ++ 0x7c34f94c, 0x71b86b97, 0xd47ca15f, 0x52a9e324, 0xcaefe3c5, 0x2bdd02bd, ++ 0xfbf0d25d, 0xf437d03a, 0xc2b2c05d, 0x7f28c535, 0xb5d9c48f, 0xadf27181, ++ 0x2dba5fe6, 0xb3565e18, 0x106138a6, 0xb55caf39, 0xbb2863b5, 0x6b0abe71, ++ 0x74bc717d, 0xefb2bd63, 0x9f657a4b, 0x03433553, 0x4d6731f1, 0x972850f1, ++ 0xf8adfd85, 0xd4bee7e0, 0xdda0f3aa, 0xfdd2fc05, 0xd5df5df0, 0x6f57e504, ++ 0x73055f35, 0xcdc7fdd1, 0xda5a1ff6, 0xe6374f04, 0x57c81893, 0xc819c903, ++ 0x877ac04d, 0x1d7eb9f3, 0x2f944bc8, 0x2971891a, 0x191a2eb3, 0x2d089798, ++ 0x15198bf1, 0x527111bd, 0xc0b87209, 0x943e0834, 0xf226cbfe, 0x65874977, ++ 0x5a561e3e, 0x460de3b5, 0x27479cf9, 0xf7f9bd0e, 0xfac94f25, 0x5f7f27ff, ++ 0xf7822d32, 0x311bd76b, 0xff6be3ef, 0xbec2f29e, 0xfc398675, 0x92c0c1be, ++ 0x7123bda0, 0xfcc0aec2, 0x2e02b0ef, 0xee6611b7, 0x343238ef, 0xca579e3f, ++ 0x2bc81c8c, 0x1991bf91, 0xde2cf741, 0xdf646b96, 0x46796d7c, 0x76f10fbc, ++ 0x6f280cba, 0x31fd3f8e, 0xb7b0ed1e, 0x8f7a2bed, 0x02e1fde6, 0x28db53bd, ++ 0xda3c17bf, 0xeaf3bf22, 0xdeb12294, 0x3165f257, 0x9724dbf6, 0x8682bcfe, ++ 0x4a94a1f0, 0x978940de, 0x21767e21, 0x1b8c1b3e, 0xf586637f, 0x7c96d859, ++ 0x3f1007d4, 0xf0dda2c7, 0x84a413e7, 0x812ff2c1, 0x353484f9, 0x896027cf, ++ 0x34b484f9, 0x18404f9e, 0x625809f3, 0x31eb013e, 0xe630809f, 0x7cc61013, ++ 0x4f98c202, 0x09f312c0, 0xfc8dff58, 0x140f877d, 0x1a77cf17, 0xc4afef48, ++ 0xbf80cd77, 0xdefced95, 0x4883656a, 0x7df8c1f7, 0x1bbfda07, 0xcb34ebde, ++ 0x5bdc75ef, 0x71d01ee9, 0x89213450, 0x67103bf0, 0xe9dbbe3a, 0x2079863b, ++ 0x5a609347, 0x1cfd6123, 0xb6c6c7da, 0x63e6cfbc, 0xa4c6837d, 0x389f8892, ++ 0x9705eb3d, 0xadaae51e, 0x8556f281, 0xcef4ed09, 0x3028d1df, 0xd6ceb7cc, ++ 0x2ed938f1, 0xdd0e6d42, 0x6d1f92a7, 0xfc5275d7, 0x904fb552, 0x76f7bf02, ++ 0x3d255c14, 0x2f53dca1, 0xeecc4de5, 0x824b4bd6, 0xbf85acec, 0xc27fc2b7, ++ 0xbbf2ec7e, 0x0243f26e, 0x78a5a2fc, 0xe2f58d7f, 0x899df40f, 0x21dc021d, ++ 0x5bdfadc2, 0xad35b655, 0x3f5a77c7, 0x85d5ddf5, 0x757df289, 0xa47eff36, ++ 0xf64bb7e4, 0xfaf5841f, 0x4fc8e8b7, 0xbd59e5f1, 0x7df0f313, 0x2ef28581, ++ 0x14f5dac7, 0x3adb9d67, 0x52ef2836, 0xbca70e24, 0x408d0ac7, 0xae597bf6, ++ 0xcbe41bf5, 0x298b2569, 0x312d32df, 0xe158e492, 0xcb733bc3, 0x5779c5be, ++ 0xcf28904c, 0x8f63a455, 0x3bf27cd1, 0x454e852e, 0x054b8275, 0xa26622f0, ++ 0x021606ef, 0xea1f30fa, 0xe03618d3, 0x8c85ab7b, 0xf850abbf, 0x8156c56a, ++ 0x0f130af8, 0x3205e788, 0xbdb6173e, 0x9bbe3dff, 0xfee3ac58, 0xdf8ab26f, ++ 0xe26f278f, 0x611e27ef, 0xb2377a56, 0x244fb90c, 0x0f76fafb, 0x86235bd4, ++ 0x5eff70a7, 0x17f9c04a, 0xbbd0d09d, 0x7b84a2e0, 0xe764add3, 0x84dde90b, ++ 0xfe2799e0, 0xd31fb6e5, 0x26efc19f, 0xdeb8698e, 0x9c527c01, 0x4afc81d5, ++ 0x952b1ef9, 0xa9cb6a27, 0x06cd933c, 0xd7cddefd, 0x8e1366fe, 0x4c18722f, ++ 0x7e9bff88, 0xe3fe17ff, 0xf119bddf, 0xe21e5d5d, 0x42572ba3, 0x306b7c7c, ++ 0x128a3e21, 0xb0fbe9da, 0x59fcf2d1, 0x05996539, 0x144b0fb0, 0x78fae273, ++ 0xf005b33f, 0x12078c5b, 0xb6ee7f30, 0x7d35f7e0, 0xde9182ed, 0x47a0df51, ++ 0xf7c3aeb7, 0xc1348e29, 0xe2da7988, 0xf1452df0, 0xa8f17f30, 0x71ea1354, ++ 0xbfcf0b47, 0x7ce4a17a, 0x144b8770, 0x3c7558f8, 0x1d39ede6, 0x3fac72eb, ++ 0xafea182f, 0xcce5952f, 0xbf8d76d7, 0x7e75be1f, 0xefce0f76, 0x6efa7a64, ++ 0x5f60fe9d, 0xa08db7a5, 0x47c2ad3c, 0xbb098dfd, 0x281e8f90, 0xfe68f6e0, ++ 0xe8344ffc, 0xad9a1447, 0xfde015f7, 0xebab92f9, 0x839ce9e2, 0x7794c9e7, ++ 0xb279a1f7, 0xfffb7d40, 0xa3fedef1, 0x4f2a1ada, 0xb2a2aed6, 0xdbc9d6b3, ++ 0x208fac23, 0x9e427ede, 0x483056d5, 0x4985959e, 0x416764d1, 0x3b3e79de, ++ 0x720aaf24, 0xf3900aae, 0x0f316d69, 0x643f406f, 0xf784d69b, 0x79def8cb, ++ 0xc2f481a5, 0xe68305e3, 0x19bc1557, 0xcfdb1f28, 0xff8839f4, 0xd5a319a9, ++ 0xca77682a, 0x6fc95af6, 0xf9e0bca2, 0x44b05e50, 0xfdab5179, 0x16a2f2f2, ++ 0xfdccda44, 0x05f92702, 0xfaeba27a, 0x004fa035, 0x418ccc5e, 0x884ae4fa, ++ 0xe600813e, 0x587df497, 0x126d8e9b, 0xa73deffc, 0xce5df142, 0xcdc5fa20, ++ 0x7088cbf5, 0xbbf4abf7, 0xf4e1d50a, 0x9ce4189e, 0x46d8ebf8, 0x096f4efe, ++ 0x0775a32b, 0x5df433d1, 0x7d21e2cf, 0xfd077e67, 0x20633f17, 0xd27d66ff, ++ 0x47bffcd2, 0xc0593ccf, 0xfe3cf1f1, 0xc7fa837e, 0xb361bf7e, 0x2baff780, ++ 0x48d9621e, 0x1bf7e56f, 0xc50c6012, 0xeffd7fbb, 0x9d233437, 0x0674c81f, ++ 0xc2437efd, 0xe1bf7e4d, 0xe68796ad, 0xc37efe07, 0xe78b2d5b, 0xffc1be63, ++ 0xcd0f0dfb, 0xfdfe3fff, 0x7f71f786, 0xf0dfbfa1, 0x93f48151, 0xfc01bf7e, ++ 0x4e518fd8, 0x9396d91c, 0xe7cb2658, 0xf95efd0e, 0xd8ef7c84, 0xc7ceb2a1, ++ 0xa9ca38b2, 0xcb957aa6, 0x2a87e58c, 0x0fc4a3f7, 0xc4ffd6b9, 0x9b3f14fd, ++ 0x877e9e3d, 0x77a6e745, 0x5ae677e4, 0x17f9c73e, 0x0bfe58e5, 0x7f3cd0cb, ++ 0xd83e7c9d, 0x7b637fcf, 0x85317be8, 0xf595be2f, 0x39651fd8, 0xf8375c9a, ++ 0x2c7ffb77, 0xf27ac950, 0xfb0df7c7, 0x957ee1f5, 0x8b2db3fd, 0x78ddf4cc, ++ 0xeb0fa5ae, 0x4957bf61, 0x83621b4f, 0x91bdfbbe, 0xdeb49d5f, 0xc9efe51f, ++ 0x9e962f40, 0x95287ee3, 0x0c576ae9, 0x9ec30bfa, 0x7ee0c572, 0xe9f7d587, ++ 0x978ffbf1, 0xf47a7d9d, 0xdd5e5e1b, 0x97fac7a7, 0x767dfc2d, 0x2693fce8, ++ 0x7d2438f1, 0x1f8d1f72, 0x52756b09, 0x8317d05c, 0xf97a5afe, 0x28e75a7b, ++ 0xf4ad2efa, 0x24bf905c, 0x948f7c91, 0xa53e46eb, 0x230fc862, 0x6efe3077, ++ 0xec8e30b1, 0xef18655b, 0xa3d4f95a, 0x71a3e42a, 0x0077d82e, 0xaedd8dff, ++ 0x8efe0fee, 0xaae343d7, 0x4fc025e4, 0x33b76a0b, 0x98749efe, 0x4fd08fac, ++ 0xc6fa0f9c, 0xf7defe5e, 0xadc17ef4, 0x7e8f9909, 0xfde060e3, 0xf5987564, ++ 0xde891eed, 0x5bf50627, 0xf5c9ef3a, 0xcf96cf18, 0x78a5aadf, 0x7ad34978, ++ 0x4fb66d2c, 0xfc8c09b4, 0xe0fea0ca, 0x37c10657, 0x1f6433ec, 0x5d5e8fd5, ++ 0xbac8309f, 0x933907c0, 0x707cfcf2, 0x871ee34c, 0x7b31e9f1, 0xdf7f89b8, ++ 0xa1dfa6e0, 0x877f25d9, 0xa65ffbbe, 0x58fbf99a, 0xfe3017ce, 0x127e9367, ++ 0x7f51d51f, 0x819654e7, 0x52ab7372, 0xbf0383d1, 0x4e65a36b, 0x88ce53ca, ++ 0x90e73d24, 0x25eabee3, 0x1443f246, 0xbb56aeb9, 0x7ec7aecf, 0xbdfc9171, ++ 0x68f41a9b, 0x0d2fde1c, 0xf4dbf7a3, 0xd18cf087, 0x5f158f74, 0xbce0f6e7, ++ 0x260af77d, 0x46171bcc, 0xa45abd70, 0x02bdb32a, 0xf8a9efed, 0x88bc08ef, ++ 0x77c443fa, 0x05f7fc13, 0xbcf364ce, 0x3efe2270, 0x9057bd09, 0xaf3e30f2, ++ 0xc23b2c13, 0x3ce52c44, 0xf6818568, 0x9ca973e1, 0xb6cf381a, 0xa58ed718, ++ 0x0f6dcf80, 0xee9f9266, 0xbfa0fdc3, 0xc7df8733, 0x9b298b6d, 0xe7db1cbf, ++ 0x43f6a78e, 0x6bfd1e7f, 0x22afee33, 0xdb7e84dc, 0xe7ee6cb6, 0x41999b6f, ++ 0xd2096fed, 0xce13b41a, 0xb3ad18a7, 0xdf3f266d, 0x908f5fb6, 0xe9714fbf, ++ 0xea6f77e9, 0xcf78492d, 0xbaca3c36, 0x4c3de902, 0x96dc67be, 0x3e50f50a, ++ 0x7dcd9427, 0xc099e704, 0xdefcabf7, 0xe3b9b1c0, 0xe397bd7f, 0x5df783d1, ++ 0x1491198e, 0x922fffa7, 0xc06a0a3a, 0x00c06a0a + }; + + static const u32 tsem_int_table_data_e1h[] = { +- 0x00088b1f, 0x00000000, 0x51fbff00, 0x03f0c0cf, 0x33b3af8a, 0x21716830, +- 0x9f0143f8, 0x38606664, 0x8167c40d, 0x81859798, 0x818997c1, 0x78898fc1, +- 0x10c533fd, 0x0611416c, 0x5e203b06, 0xf0c0c42e, 0xce21044e, 0x10c0ce28, +- 0x20c0ca2d, 0xafe10a2b, 0x6266d204, 0x40ff71d4, 0x4c194663, 0x089207b1, +- 0x79161336, 0x268ccc64, 0xca8520ef, 0x7fa02167, 0x2517f1a0, 0x22acbe54, +- 0x8a846e84, 0x9793457f, 0x432bca83, 0x094df5fd, 0x502ab9bb, 0x1aa00079, +- 0x03605f82, 0x00000360 ++ 0x00088b1f, 0x00000000, 0x51fbff00, 0x03f0c0cf, 0x3373f78a, 0x45e6fc30, ++ 0x5e0287f0, 0xb0c0ceca, 0x0257881c, 0x56204bf1, 0x50606364, 0xff5e2362, ++ 0x5b04290a, 0xc181825c, 0x8aa78805, 0x0812f901, 0x06696171, 0x06495486, ++ 0x08497506, 0x76900b7f, 0xeddca294, 0x2b1b0183, 0xc9098a60, 0x5826d821, ++ 0x29b191e4, 0x1c917c9a, 0x808cdf2a, 0xf3c681fe, 0xfbf951d4, 0x16b42155, ++ 0x9a3e7c54, 0x7ca801fc, 0x0b5fd428, 0x1b9bb1d4, 0x27bfa646, 0x006840b0, ++ 0xf4f4f7fd, 0x00000398 + }; + + static const u32 tsem_pram_data_e1h[] = { +- 0x00088b1f, 0x00000000, 0x7dedff00, 0xd554780d, 0x733ee8b5, 0x49999cce, +- 0x21264cce, 0x61021309, 0x40a02092, 0x200c7e18, 0xf7f09d78, 0x803aa568, +- 0x07515a56, 0x43f21081, 0xbd1f5202, 0x24266bed, 0x1bd568c1, 0xab45a8fa, +- 0x68a90076, 0x62348ed1, 0xa80740a8, 0x0db6a85c, 0xc7f42ad6, 0xc405ad1b, +- 0x96aa4490, 0x6bb94abe, 0xe64fbdad, 0x4019939c, 0x6f5fb7bd, 0x6fd697bf, +- 0x67d9cfb3, 0xdfd7b5ef, 0xb5ed6b5e, 0x897628f7, 0xec650ee5, 0xc75dfe02, +- 0x319902d8, 0xf4a27576, 0x0d0ebbc1, 0x07f8adfe, 0xccdd2832, 0x2862b12f, +- 0x2f6e2cfd, 0xfc707281, 0xd65e9618, 0xf37e18c9, 0x959905f1, 0x3271e632, +- 0xb09417f1, 0xdaf2f5ee, 0x6d87b2b7, 0xd5b28428, 0x6cc653f7, 0x67aaed8c, +- 0x44f66181, 0xff57873b, 0x91c17e2e, 0xfa4870cb, 0x877560cb, 0xbb87c187, +- 0xb6e2e7a4, 0x8ef58c89, 0x7e2d8161, 0x5dde0718, 0xcffd059b, 0x316dec61, +- 0x704605e6, 0x8a50b85c, 0x4b8231df, 0xe73af8fb, 0x0ee76842, 0x00c55fad, +- 0x7334cf5e, 0xb9a26d7b, 0xf50d18ee, 0xa5fa8991, 0x6ca603da, 0x881de00c, +- 0xed5c03f0, 0xd79a4ef5, 0x81bdeb8f, 0xb6305761, 0xf547dea7, 0x2a7ef57d, +- 0xe923f5e3, 0x00fa81f9, 0xb05873d5, 0xeac7f090, 0x66ca2c36, 0x8536f1ac, +- 0x7412c7dd, 0x8c3d66f9, 0xfea24577, 0x222cd1a7, 0xa4fee4c3, 0x00423bb0, +- 0x132bc36b, 0xbca13a32, 0x7f41db1f, 0x28018d0f, 0x3fda26c6, 0xdce5f6bc, +- 0xcb181399, 0xdc91eafb, 0xbde00399, 0x46c616c4, 0xd2ad78e3, 0x9df031bc, +- 0xdbd1fbca, 0xeb6325eb, 0xed9a0f88, 0x65afdfc9, 0xf2cf0212, 0x7e60ac0e, +- 0x0f6bf437, 0x07013be7, 0x04c644b7, 0xb8c3065b, 0x186bec48, 0x111b32fb, +- 0x370e0089, 0x8c799761, 0xf342d0ed, 0x5f1cbbf0, 0x91230a48, 0x299c40c3, +- 0x2cab658c, 0x470a4b1c, 0x2b71c103, 0x4b0733fe, 0x0f4bd53f, 0x7ef571f2, +- 0xe711b2f4, 0xcee4e507, 0xde2c5b30, 0x77fbe197, 0xe862d242, 0xe7c5d9bf, +- 0x736302f3, 0x1249bc70, 0x12b9610b, 0x2dfa1299, 0x312732c7, 0xe5c60aee, +- 0x6173bae1, 0x547e8416, 0xc785985f, 0xfc837ef0, 0x6c8ca6fb, 0x1b7f9b9a, +- 0xda9443f1, 0x474ddb1b, 0x88b6fcb8, 0xedc7033d, 0x23ed883d, 0xf6c3163e, +- 0x39b6682f, 0x3b44b45b, 0x6e499e1d, 0x968b685b, 0x16c82fe8, 0xe5d3fa9b, +- 0xbe72764d, 0x81def9d3, 0xda9c809f, 0xc228fbe1, 0x3705983b, 0xbdebc127, +- 0x07a5be62, 0x3c06415d, 0xa3542ead, 0xafa9242e, 0x39eb0cb5, 0x0640594b, +- 0xe5eb4e1a, 0x0703b8f3, 0x3bcc49c9, 0x37c003e7, 0xfec01d94, 0x08e3e60c, +- 0xda03a8b0, 0x826b79ab, 0x1f4f5065, 0x1b02d5cc, 0x3672631c, 0xcdc473c9, +- 0x97a1c3fa, 0xfc13c7da, 0x00df1748, 0x0604ef5d, 0x41dba832, 0x78020ca1, +- 0xa83b8f1a, 0xe5dc8fff, 0xfd33b143, 0xf1f553bb, 0x3e414b71, 0xa61fd74e, +- 0x83beabb2, 0x63faeeca, 0x0f1aa654, 0x26c6d124, 0x60df8c03, 0x5dca2741, +- 0x075d12a1, 0xffee37fd, 0x218ff32a, 0x878823f8, 0x2d16cd74, 0x4e665e42, +- 0xf815cd59, 0xe12b7c45, 0x8e6ef9bc, 0xbdb3c45f, 0x866d0950, 0x2ad9cf32, +- 0x786d1aad, 0xfc40740e, 0xb87c1e97, 0x2ea4f101, 0x855ce365, 0x4f9c2f28, +- 0x97c89f11, 0x5f381abb, 0x284efd62, 0x029539af, 0xef1c5def, 0x53a9dada, +- 0xc06099df, 0x5c82c29f, 0x28bf39ae, 0x78c77ff0, 0x7b343a80, 0xbde82645, +- 0xbc077fbc, 0x9e7d268e, 0x906b95c1, 0x9e2adea1, 0x30ddebac, 0xabd27e23, +- 0x5079edc0, 0x97cfac1f, 0xf8897ff9, 0xfa04dcd8, 0xd57eeb09, 0x21fbc2af, +- 0x70e0f5a2, 0xca545cc5, 0x1ee7cb5b, 0x62bc6092, 0xa8fde3f9, 0x29d487de, +- 0xf41a776f, 0x6042c165, 0x86c622bc, 0x2f3f35ae, 0x30eb988c, 0xf3042d80, +- 0x3f316e2f, 0xd9dcce3f, 0x2e19d227, 0x80906e48, 0xbd5af37e, 0x849a45ec, +- 0xf58dde95, 0x0dd9ae2c, 0xf427a175, 0xdc99e4ba, 0xadf98119, 0x900592be, +- 0x449269c6, 0xefc56c78, 0x141e8f80, 0x7e96fde5, 0xac9952f4, 0x02ef50d9, +- 0xf4c983de, 0xd654be58, 0x56bc748b, 0xfd8bde9a, 0xe6312ba6, 0x54bf90d5, +- 0xfb6b13e2, 0xf1a14934, 0xa08e94d3, 0x14deeb8c, 0xb6adeebe, 0x9e51c6f7, +- 0x03f99756, 0x028f5c11, 0x4cdf9251, 0x5e50b358, 0x363c013f, 0x9363c389, +- 0xf5189c68, 0xdb2beb03, 0xbc38e122, 0xfa57d5df, 0x0d4a4459, 0x2d191fe7, +- 0x1698ec62, 0x3cfec4ce, 0x709ca492, 0x58d3e826, 0xb36ff451, 0xc372eaa1, +- 0x7513abfb, 0x7c739ddf, 0x4379c7c8, 0x772bf4cd, 0x7f2015d6, 0xb3628654, +- 0x7a4e7f91, 0x0edeba7e, 0xf602def3, 0x9ff80282, 0x61e50ce4, 0xea8b353f, +- 0xf30aa386, 0xe303a2e3, 0x1eb7b26e, 0x39824b07, 0x5ff48859, 0x0175cccb, +- 0x67dbde05, 0xf03b712a, 0x01f27da5, 0xac5c57b2, 0xc9c7eb8e, 0x07b43291, +- 0xef83239c, 0x455ef0ca, 0xdee78079, 0x75c32b60, 0xbccc39c4, 0x9b3c83ce, +- 0xb9b64aea, 0x5ccf4a9e, 0xf8ca5caa, 0x84069efa, 0xb267fc22, 0x995fe228, +- 0xf841281c, 0xf3e6bc1e, 0xaa67847e, 0x84a5d7c4, 0xde72e2fe, 0xbfb5ef47, +- 0x00361dc8, 0xf972b79f, 0xee4afb5f, 0x8f8809b0, 0x73979a56, 0x0b926ac6, +- 0x7323f115, 0x13b90ff9, 0xf878ebdf, 0x961bcf7b, 0xf4979a05, 0x5027f393, +- 0x6f3e363f, 0x9f9ea3f7, 0x7e3dbcf1, 0x366bd41d, 0x6df7a44b, 0x9f845cfb, +- 0x3d7947ee, 0xd88356ee, 0x5013ccfe, 0x3ad57c07, 0x8a9c1e3a, 0x665e7bf8, +- 0x0b3d085b, 0x4ecfa86d, 0x3b68f6e8, 0x78bb97af, 0xfef366b5, 0x8afbf1db, +- 0x7d430776, 0xf97bb35c, 0xbea1530d, 0x619db0fc, 0x0d6d9a93, 0xafa820ea, +- 0xac314a88, 0xf4e74cf7, 0xa392ec89, 0x8f7da0db, 0x66f723a7, 0x271dd70d, +- 0xb8008ff3, 0x37b91ddd, 0x46571f01, 0xdf8d9b9f, 0x0290ee55, 0xc7983140, +- 0xf07943b6, 0x5253cd5d, 0x5c7c01c0, 0xf99d3db5, 0x89e5f60d, 0x1d7e3936, +- 0x93cc19ca, 0x59cbbf41, 0x4fa46ceb, 0xaa0db6cd, 0xd39f40df, 0xdf9923f5, +- 0x3cd7a891, 0x77c0e305, 0x02959f2b, 0x3695c538, 0xef753f6e, 0xaadc2d76, +- 0xd41afce1, 0xd79c6ee1, 0x5bb62a3d, 0xcbbc5d1e, 0x36f847e5, 0x7de1b3ab, +- 0xd59ba3e5, 0xa85e8372, 0x640a3eda, 0xa6d700c9, 0x24e181e2, 0x0f01237a, +- 0x8953c133, 0xedd6867a, 0xa5768aa8, 0x2daa7cfe, 0x6ab1f893, 0x5fea6cbb, +- 0xd7e47ba7, 0xc887ec8c, 0x55e1375e, 0x2f6adba7, 0xa08eebe3, 0xa0af59db, +- 0x6a5bd2a3, 0x1f2f5fec, 0x50383a44, 0xfca97b5f, 0xca8fbd56, 0xa27ef58d, +- 0xbf8843cf, 0xc64edc11, 0x97d760e7, 0x827b2f21, 0xc3ec0bcc, 0xcb06e6b2, +- 0x0acf50ec, 0xa2ee7af1, 0xc8bfe4b0, 0xec12f5fc, 0x04e0c5de, 0x7afdfac1, +- 0xf63b0150, 0x8abc3521, 0xa6fc6005, 0x04ce08ff, 0x528ff77b, 0x4afa8638, +- 0xb82b85b6, 0x287cc5dc, 0xfac5eb77, 0x13f25db3, 0xa9e7d61e, 0xba1f6fa4, +- 0x2cab74ad, 0x6366b989, 0xf7fbfcbd, 0xbb3f5215, 0xfa151fa9, 0x3f74be29, +- 0x364fb7b9, 0x7b7b93f5, 0x01cfde85, 0xf2ed27ea, 0xf6e879fa, 0xdcf0cc6b, +- 0xf3f7a95e, 0xb9e3f532, 0xdee579bc, 0xcf0ccd31, 0xcfd4d51d, 0xd20145c0, +- 0x3fceb2b7, 0xb43bd60c, 0x8e647717, 0x5341fa37, 0xc0dfd36d, 0x520dc5f5, +- 0x8ca3e465, 0x792669c9, 0x99660cca, 0x0ce603ea, 0x09cfb532, 0x0fde9915, +- 0x8595785c, 0x89ef352f, 0x408ea251, 0xf68b43a1, 0xf49520f1, 0x2720d94e, +- 0x20f77fc1, 0xddcef48d, 0xe04784d7, 0xa2b08e3a, 0x1ab7737f, 0xea4deb1e, +- 0xcc4874c7, 0x86dfa587, 0x3dfdf5a5, 0x9e9c1ec2, 0xb7f0f1ff, 0x5b5afbe0, +- 0xa84cf0ef, 0xfb2b6bbf, 0xbcf9e233, 0x3269ffd0, 0x6976c3ab, 0xeffa460e, +- 0xadd2c29e, 0x5b5e0311, 0x48bf0086, 0xec5b7e89, 0xa3f21f61, 0x901a9364, +- 0x510fd73f, 0xfa041b19, 0x1fdb1d74, 0x9ee73581, 0xc43ee521, 0x2ffd03bf, +- 0x8c2af8e3, 0x77c69a3f, 0xb77c60d8, 0x8ef8f92d, 0xf1a6c9a2, 0xa615059d, +- 0x8c2a9df1, 0x6991f20f, 0x9df18973, 0xad6617e4, 0x8ef8d273, 0xff1a0a82, +- 0x9855951e, 0x1beb4fc6, 0xc60da07f, 0xfee3621d, 0x17f9bf4a, 0x7f9e635d, +- 0xfe79a541, 0xa17f9f2a, 0x9f8c532d, 0x5a2ff346, 0x2ff3e5e7, 0x77f3e4a8, +- 0xc6fb7ef0, 0x7fe1f4f7, 0x263f8e04, 0xe28ef8c5, 0x0ff9e669, 0xdfcf36ad, +- 0x671fc7c1, 0x6be313cb, 0x75f8fe34, 0xa1ff3e3e, 0xeabe34d5, 0x8f900708, +- 0xbab4fcd4, 0x8343da28, 0x240dfb41, 0x72a4181d, 0xbb93f724, 0xe38222a4, +- 0x77ce34ee, 0xbf01a51f, 0xca7d0969, 0x9e29eba2, 0x74f052b2, 0x35328ed5, +- 0x07bc5a3c, 0x00997f7b, 0x4cbb6975, 0x3a36cd7c, 0xbc0057a2, 0xf932eddd, +- 0x5e374b3b, 0x3d69951b, 0x1808fee5, 0xfe7c7190, 0xd98f6fc7, 0xb5979c62, +- 0x3f6ad65c, 0xab9069d1, 0x9d3efd3e, 0xf803ac8d, 0x535e4836, 0x69e804fd, +- 0x06dea674, 0x49e58c7d, 0xf3c0338c, 0xb38f4077, 0x7ffdfd11, 0xd1b5eee8, +- 0x0a2faf30, 0x1c284ff8, 0x48d627df, 0x47ffc451, 0xa8a9561b, 0xa6b596cf, +- 0x07d3d1a3, 0x53a0ad47, 0xd9076eef, 0x3f4f8055, 0x1216e7e2, 0xbf7ec645, +- 0x24870bef, 0x6f967bb0, 0x6efa601a, 0xfb368b11, 0xfb92fda0, 0xc2f10f17, +- 0xe85d6ffc, 0x1f932f18, 0x91b7cc18, 0x1b7cb31c, 0xdb0b4ef8, 0xa1f3d836, +- 0xbb42cb72, 0x52f94fc9, 0xb5bf5cd8, 0xb6ef5cc2, 0xcf18ed47, 0xb1215eea, +- 0x6defd0cd, 0xff8b7675, 0x6159c7c3, 0x08f112cb, 0x8117de3e, 0xe8f07986, +- 0xe3c72c36, 0xf5d12f63, 0x56ff2f76, 0x6bf6a787, 0x90547076, 0xe8399d7e, +- 0x0e48b347, 0x2f6177f9, 0xde15b79f, 0x60ceeddb, 0xfdb9e008, 0xd3e132ab, +- 0xbee77f0a, 0xec0da0f4, 0x7f4dced1, 0x6e7da3b2, 0xfe158f9d, 0xe75ad63b, +- 0x7d7155e3, 0x3eb11c58, 0x5aec988f, 0x2f6dacbd, 0x818efadb, 0x9f626a9f, +- 0xe18efadb, 0xf3edaabb, 0xd115f54c, 0x2fda992f, 0xf4d8b4df, 0x0aeb597e, +- 0x2d25fbd3, 0xc5f54cab, 0xda9aaf91, 0xc1b6b1df, 0xbab6fef4, 0x6fef4d7b, +- 0xaa60d8ad, 0xb0fc297f, 0x0b2dfda9, 0x4bde9b37, 0xed0c56fb, 0x1e1abd24, +- 0xeb76879a, 0x59f90771, 0xf2ebbf3a, 0x16ec0a70, 0xdd834f2c, 0xca036582, +- 0x6dbfc829, 0xb76b2f37, 0x35ea1e2c, 0xed2761f8, 0x4f280575, 0xe2b7be56, +- 0xf0dfcad3, 0x1d6c9f97, 0x8c6acbd2, 0x3dbf4143, 0x24393f16, 0x1f1ea0f4, +- 0xdcb956ac, 0x9bccef56, 0xb57ffe8e, 0x975e1f1a, 0x93ec4fc4, 0xf34498e7, +- 0xe7a56860, 0x5b80dd20, 0xdaab780d, 0xb3826c5e, 0xe34cbf6b, 0x05d944af, +- 0x0a5f37fd, 0x88f5c71d, 0x2c160fc5, 0x04f08318, 0xf6f5437f, 0xbb7f5a1c, +- 0x7d6ce7ea, 0x0bf88ec7, 0x7eaa7951, 0xea279521, 0x53be54c3, 0xdbe5415f, +- 0x765475f5, 0xf2a5afd6, 0x9508facd, 0xa16fabbf, 0xadf537f2, 0xdfab1e54, +- 0xf5ebe544, 0xebbb2a51, 0x7cea5483, 0x4327a7db, 0xfe156ec2, 0xb7224805, +- 0xe45cc55b, 0x96b8bedc, 0xacf1e50f, 0xb470d1f6, 0x031ecfcb, 0xc6a61722, +- 0x521f9597, 0xc90595e2, 0x028f28ae, 0x7ff4079d, 0x74e34aef, 0x1cd8d972, +- 0xdee37a06, 0xc01fbe2b, 0x15d41338, 0x47df8596, 0x49dcf303, 0x107f05fa, +- 0x3a2975e9, 0xc96f60b1, 0x89c7a07c, 0x8a5afe47, 0x456c86fd, 0x28385edc, +- 0xe2c97ad3, 0xaf48035b, 0xe9378a4f, 0x402fbf27, 0xa39339b9, 0x00a3afe3, +- 0xb2df04e3, 0xb39fa979, 0x20a60e6d, 0x47a4f71e, 0xf67d2431, 0xae0f56f0, +- 0x727dab77, 0xb31f18d4, 0xc2b13596, 0x4f9866a8, 0x7eb9bb6d, 0xc39a55b6, +- 0x8cfe69e3, 0x5f20c69b, 0x50efa379, 0xa547d15c, 0x9f6acfde, 0xfee8e34a, +- 0x4991db38, 0x217e0a7c, 0x86affbb5, 0x093f5523, 0x1fd8da38, 0x2e287700, +- 0xb93f8a17, 0x0f94ce5f, 0xb1bb8c54, 0x708ff63d, 0x7fc0773d, 0x6591d017, +- 0x7ef5d50a, 0xc472636b, 0xef9f1631, 0xdf078d30, 0xfb9f75f9, 0xf8c5d142, +- 0xf4276155, 0x9b6a8279, 0x0e443e8f, 0x6a2b95f2, 0xa699fbd6, 0x5e7b6d7a, +- 0xe00eb4d4, 0x59ee403f, 0x3ae0a485, 0xa8b82d58, 0x245ad147, 0xec8c6f80, +- 0xf126fce7, 0x4ece3576, 0xbe47ec35, 0x54e2fc69, 0xa56cb63f, 0x3be15af9, +- 0xabd87f5d, 0x5c7e245c, 0x3bbd9f25, 0xffc8bed9, 0x48bef996, 0xd3db8db5, +- 0xa0f119cc, 0x117ccabf, 0xe18bc60f, 0x0fc3eb4f, 0x8e304df9, 0xb3f7aea1, +- 0x4def6a22, 0xd9764eb6, 0x1d6c9db8, 0x7b8c45b7, 0xdcadfc29, 0xce367471, +- 0x95c78adb, 0xb4abefed, 0xffc0a31f, 0xd478134a, 0x0e463bf1, 0xdfc0c8b5, +- 0x22dfdb95, 0x3d94f27b, 0x176bfc32, 0xe1fd5bd1, 0xb7147cd7, 0x611de7d5, +- 0x9dce381d, 0xff67f17d, 0x7585bf2d, 0xed97ddf1, 0xf62cbe3c, 0x70387437, +- 0xf506d0d3, 0x6776a225, 0x9bc5155b, 0x3d75dddf, 0x594b6fd9, 0x644e83c8, +- 0x452d6b05, 0xb30cf03b, 0x9d3c41cd, 0x267aaf61, 0x43b4e818, 0x974e4956, +- 0x10ed98b4, 0xf54d5fb0, 0xf5cc9be5, 0x173f3672, 0x46f94cf5, 0x344a8b3b, +- 0x47fbd33f, 0x7fe12f65, 0x8f5bab39, 0x9da373eb, 0xe9ddb3ef, 0xe83e4a65, +- 0x1e179adb, 0xff38c52b, 0x7ebe648f, 0x1593f1ea, 0xab8edc59, 0x31566d8c, +- 0xb687ffbe, 0xca9c5f09, 0x7ae8fbf0, 0xcf221f5c, 0xfe6d814b, 0xa4fdf8fe, +- 0xd5e15bf0, 0x717eefd7, 0xcd47011c, 0xbc692976, 0x892cbf77, 0x63f39ff5, +- 0xbaa5e286, 0x5be7d76e, 0x22c9afea, 0x19332c1e, 0xebc67ee9, 0xe832d88c, +- 0xf38e207d, 0x3408e9db, 0x72c2fcc2, 0xf64c98e8, 0x1984bc44, 0x30e585da, +- 0x5e92ef3d, 0x93bb4729, 0xb412f129, 0x21ed6123, 0x3f05553e, 0x129e69c8, +- 0x31bb778c, 0x67718bbe, 0xd60b6797, 0xe62bbbd7, 0x16b51c62, 0xf7f401f5, +- 0x61f66780, 0xb2709fdc, 0xf81078d6, 0xef33e1d7, 0xe6fcb82f, 0x75ea3a7a, +- 0x00f877d4, 0x8c02f9f7, 0x23e954e2, 0x01dcedcd, 0x1f6cfd73, 0x5f7ce29e, +- 0xf71c589c, 0x0cb8b5c7, 0x4ac9b3e3, 0x54bf9f57, 0x871afe84, 0x5a64ec1f, +- 0x7978d6ff, 0x7e2295fb, 0xf4f8e6bf, 0x89175981, 0x939ed547, 0xceb0d458, +- 0x2abd2ad4, 0x39ed61f2, 0x6a7f9e85, 0xd587eabd, 0xf357a0d6, 0x929a70e5, +- 0xc228f5c3, 0x6138c127, 0xe3809f03, 0xf9ca35ea, 0x7c3f0b08, 0x99b2386a, +- 0x918fbf49, 0xe0c9f9c3, 0xfbfdd4f8, 0xe23ff5fa, 0x61ffb4bf, 0x909ffafd, +- 0x179affac, 0x8115d99e, 0x87f2a2f5, 0x3300f6df, 0xd69577b3, 0xbdd000dc, +- 0x07b35b7a, 0x1294f2e5, 0xdf5d20f1, 0xa273ca8d, 0x52a1f849, 0xa82ef9d1, +- 0x3fc4a549, 0x9fa747c4, 0xe80de6fe, 0xcdb47fc7, 0x7eff25ee, 0x00ee23bb, +- 0xb6d95ca6, 0x76c7cb82, 0x7ebc5bc7, 0x9fc8fbcf, 0x7d66edb5, 0xb7e4f951, +- 0x7eb4fd73, 0x1bff8445, 0xe561ff27, 0x8d9c7f13, 0xeb2d58f6, 0xfd67bd25, +- 0x973fc70e, 0x62c2f645, 0x7bffa335, 0x56b21f7d, 0xedb6a5e0, 0x3ee3ef9b, +- 0xe7db6d44, 0xe9a1724e, 0xfad1bf24, 0x07f0855d, 0xd9dc556e, 0xc49baf14, +- 0xe9bf2126, 0xee516178, 0x3c2fc80f, 0x9cf18256, 0xf65e27ae, 0x7c8da348, +- 0xd9dff5ca, 0xfdef92d8, 0xae5a9fd8, 0x1a3f41ba, 0xcedd6eed, 0x3f0bb7f3, +- 0xab2f0f66, 0xee0f71ed, 0xb66f541f, 0xf55cbed3, 0xffbf5b33, 0x8e57c608, +- 0x4057023b, 0xbccf55ff, 0x5035faf4, 0x9ece7aaf, 0x434f973d, 0xf4137293, +- 0xd6ff85a9, 0xa3d04f8e, 0xa92f47f2, 0xcf8d0fb8, 0xa0959ebf, 0xfb73d54b, +- 0x3fa63655, 0xf6c4663e, 0x125a9dab, 0x9adec4fa, 0xfc86fe8d, 0xe91579c2, +- 0x893eeeff, 0x824c2c0d, 0x912fcdcf, 0x22788cdd, 0xf57a0a7a, 0xbed2cfd1, +- 0x7a42e816, 0x6b2f42d1, 0xfe4269bb, 0xa78c5fb1, 0xfb3f7f03, 0xf977dc63, +- 0x7880238d, 0x2ef678a8, 0xa4e7ce0f, 0xfcf9c752, 0xcc5ce6b1, 0x47b0a8b3, +- 0xf254bd72, 0x7f8f15e7, 0xf96ff885, 0x52e4afd1, 0xf305833c, 0x443b646c, +- 0xcb9e70f2, 0xe699bd1e, 0xc4c2ce59, 0xc98f1587, 0xa1f0ff94, 0x973ce6c2, +- 0x16de4e44, 0x8b727272, 0x4e859283, 0xfb8242e2, 0xd1caaf10, 0x5bcf146d, +- 0xaf92f145, 0x6c47fbe8, 0x743fd535, 0x2bb57a72, 0x4b0c1fba, 0x9f7f9189, +- 0xe903a7b8, 0x70487a74, 0x6b81c620, 0xf8111299, 0xbf402e90, 0x0359d1f2, +- 0x5f989d39, 0x81df1529, 0xcf819ffe, 0x3d877db1, 0x7d312ae8, 0x26142ec7, +- 0xc6235fc6, 0xd0d3b807, 0x0b993dbe, 0xf99260f6, 0x3d25d865, 0x0cc1d46e, +- 0x7790667c, 0xdc4fff2e, 0x975de5cb, 0x39bce8ff, 0xd783fef8, 0x77e11cb8, +- 0x5c00bf68, 0x7ef481f1, 0xe9124dff, 0x278b0707, 0xec27f393, 0xefcdce42, +- 0xf002fcad, 0xf71eb82b, 0x938e0df1, 0xfb207445, 0x7c237cb6, 0x38abd46f, +- 0xbf7fa7ae, 0x172f1cba, 0x8af7e0fa, 0xfa100fc8, 0xf5ca3d80, 0x243f6a40, +- 0x7b75edc2, 0xa08ffbf4, 0x46bc82fc, 0xf6bf28fc, 0xbdffce10, 0xff5f071d, +- 0x7bcdc832, 0xcd6e5d31, 0xb72ad57a, 0x66af3b15, 0x3df6e4c9, 0xca92c02d, +- 0x2a4f3c2d, 0xf1275ab7, 0xaf5bdff3, 0xed5478ea, 0xebaabd66, 0xb4f854c9, +- 0x8acdc9ea, 0xd56af09f, 0x1af7f093, 0x8fcfed2b, 0xfcea1f3a, 0x9a83f957, +- 0xfa8fa8a1, 0xc3e754f8, 0xf9d53e3e, 0xd13c5fb0, 0xfbeb4784, 0x18dc605f, +- 0xfbb425f8, 0x81f3b3d7, 0xf87bd5ae, 0x777c2cbe, 0xaf80eb08, 0x5ad37720, +- 0x1b67e50f, 0x3d4b51eb, 0xb41f6966, 0xf69643d4, 0xcebd4b61, 0xe3ca3ed2, +- 0x5507ed69, 0x37139f9e, 0x63afb7b5, 0xb1c63711, 0xc714caf7, 0xd79801ee, +- 0x3b3df7c3, 0xc291a30a, 0x6f5b5e44, 0xf51eba8e, 0xd7b78f59, 0xaf62f683, +- 0x7aefc78b, 0x4c9ebd42, 0xd6f69d83, 0x71f4991e, 0x49cd9467, 0x05824fe6, +- 0x64ebf44d, 0xb8f3dea9, 0xddda0f7c, 0x592cde30, 0x718b582b, 0xf2995698, +- 0xdc369667, 0x8cfcc1e2, 0x37c53d9e, 0xcbe7842e, 0x9b7cc88e, 0xf2541230, +- 0x29dc7e0c, 0x9a687916, 0xf7c7fb84, 0xec97fd13, 0xd2dd7ee1, 0x73f393fb, +- 0x5caef8a5, 0xdea2a35b, 0x6dec7f04, 0xde83bee3, 0x96a3c54f, 0x17ae7be7, +- 0xfdfdcf7c, 0xefcc27ca, 0xb03e22c3, 0x71fbe74c, 0xcff71c6c, 0xae77e519, +- 0x96777a16, 0x85c6fa3c, 0xc39e8740, 0x39be4332, 0x3a2647bb, 0xf7c1dd9c, +- 0x3ece29ef, 0x97b5f905, 0xaf8e9df4, 0x118f942e, 0xd750f5a9, 0xfd2fbff3, +- 0xdea9341a, 0xef92dbf5, 0xebb5d942, 0xb117f0f8, 0x051bc2fe, 0xdbfd65bf, +- 0xa2e7d8cf, 0x7d9e8d7d, 0xec87da6e, 0x82f3fbd9, 0xb77d61af, 0xf6708023, +- 0x0973fbec, 0x3acf51f2, 0xb1ea0547, 0x1fdc219e, 0xe7fbdc6d, 0x3f5a4e92, +- 0x937e789b, 0x67c3fb9d, 0x4df5fcf7, 0x984b1b29, 0xfb07da15, 0xa87f69d2, +- 0x8a2ec7f6, 0xfdecf5ab, 0xced1a973, 0x59f3acff, 0x7b1bf629, 0x4ee16cdc, +- 0xef932f84, 0x38bed4d3, 0xe6036b65, 0x57edb463, 0x19fbc097, 0x825f393f, +- 0x2767b1fa, 0xedba7bb7, 0x7ee38f9d, 0x2fed77da, 0xbd03b3ae, 0x063851ba, +- 0x3f529a81, 0x92d11e9e, 0xc53ce5e1, 0x1f172f0b, 0xe0c7ff3b, 0xf57da243, +- 0xa8ee3dea, 0xff79c253, 0xa2dfcde5, 0x20e7d83e, 0xfbe7d4be, 0xec81ac5e, +- 0xfbcd4b91, 0xbcdd3fe8, 0xcce5f8a5, 0x7c1ff7bb, 0xf26377de, 0xe5fdd5db, +- 0xef9f3fa0, 0xcfea9bbd, 0xef0403b8, 0x57bbf265, 0xfd1c7955, 0x9ffe741f, +- 0x813bee98, 0xcf4b9eee, 0xf83fec7b, 0xfdd353bc, 0xee82edc8, 0xa947cc5e, +- 0x8279c9fd, 0xb9ea93ef, 0xce87ff1b, 0xefd7b75f, 0x315a05b3, 0xbd1d3b2f, +- 0xe1e73c01, 0xe182df9e, 0xce46fbc1, 0x28dda2f7, 0x2b4bfd8b, 0xfb95117c, +- 0xf3c4b27d, 0x1e10d9d6, 0x4fc263cf, 0xd710f342, 0x272b454f, 0xd6d154bb, +- 0x94ccdd93, 0xf0104740, 0x7755df72, 0x87d72806, 0xc6163f8d, 0x0169e0fa, +- 0xfc5b578a, 0x058926c5, 0x9557b025, 0x187f3eab, 0x48fb16fd, 0x4251dc5b, +- 0xde585be5, 0x7690e223, 0x67f26aaf, 0xbae6d1b4, 0x3bae6fcb, 0xc64e7f44, +- 0x58fa77e1, 0xf2d1e314, 0x98bc0795, 0x538f26cf, 0xbb2ea618, 0xfd046b58, +- 0xfccf8706, 0x73f422fd, 0xb45bf10d, 0xb060e3db, 0xad8efbfd, 0xf3383f14, +- 0x60375bf4, 0xca2f55bf, 0xe97809cc, 0x7166e1de, 0xaa251be4, 0xd9523fa2, +- 0xbe290726, 0x174bc4a2, 0x750bf618, 0x87eab17b, 0x72ab826e, 0x173a23a7, +- 0xf5dcafbe, 0xb75a1287, 0x3d92f5d7, 0x0a5a791b, 0x3be1a36c, 0xb03f704b, +- 0xbe7e4952, 0xe79511e4, 0x4eed751b, 0xbc7e885f, 0x6be79db4, 0xb16ec656, +- 0x28790c3b, 0xdebb541b, 0xf228f88e, 0x2cf94494, 0x4f319f08, 0xbb57b750, +- 0x7c38929e, 0xe628f6ed, 0x7f6e567d, 0x11e31bae, 0x011cc795, 0xb76b1b74, +- 0xeff14fbf, 0xc67c3f19, 0x977e49d3, 0xfb43f26c, 0x65db7ff9, 0xb6caeba2, +- 0xa15bb21a, 0x195df44e, 0x27d6fe13, 0x7eaa4ff4, 0x1e1777b8, 0xd1faa894, +- 0x778c1e93, 0xe6d8ee9c, 0xfb703f21, 0xfd31e3c5, 0xbdd8bdfc, 0xc2fbdfc2, +- 0x54e3e449, 0xfc69defe, 0x3f51d807, 0xf37e2d55, 0xc76401f6, 0xc9a59c02, +- 0xfe74c7f6, 0xc3e67aa9, 0xd95e31c7, 0xc7bdf3b5, 0xbfeaee11, 0xb471e9fd, +- 0x973ed943, 0x6a2df717, 0xc535fe9f, 0xdeeff477, 0xa25c7954, 0x2927a9fb, +- 0xfe0dd63e, 0xbdd6f636, 0xfa0164f7, 0xfdcfdd23, 0xe7fd1725, 0xd1677b35, +- 0xcf358ff9, 0x92c818cf, 0x225eb1c8, 0x232f46ff, 0xdba5673e, 0x6483b6c1, +- 0xba019f2f, 0xe7d2bfa3, 0x786ac7c7, 0xfc2fc47c, 0xe3c91df7, 0xf5fcfda1, +- 0x5e3705b6, 0x6db8f98b, 0x83aa00f6, 0xafedfa4b, 0x5ec73d01, 0x88771d06, +- 0x0bec4cf8, 0xcfdbf517, 0x5e803fe0, 0xfc742de7, 0xf7d96db0, 0x6d77c11e, +- 0xedfa5203, 0x9fc0cbf1, 0xa23d6f1e, 0x940e9d06, 0xa03f9db7, 0x6fd20978, +- 0xfbb84c2e, 0x300b0f99, 0xdeca7d5e, 0xb1e53b7b, 0xd17875ef, 0xfbdcad4f, +- 0xf753c906, 0x9e2947f3, 0xb3dc44c9, 0xf1fdf59b, 0xa1c894f8, 0xcdc27dab, +- 0x07417dfd, 0x3df8078c, 0xfdf85cf4, 0x78f5af9c, 0x4038aa40, 0xe4f3c1d0, +- 0xcd7038f4, 0x7e15bf13, 0xd26e8275, 0x5bd7a464, 0xeb5f8d17, 0x1e22f078, +- 0x5ce31926, 0x7d2ee3c9, 0xdd0b2e71, 0x5f56f8f4, 0x83ea0b1c, 0x95119e31, +- 0x371648de, 0xe3ccdeed, 0x7376dd63, 0x4e824dfe, 0xd535ee3c, 0xe8d38e61, +- 0x2f254df3, 0x6a5edcba, 0x4f149f1e, 0xbb08d0a3, 0xbabe3fba, 0xdfae4e3e, +- 0xde5c776f, 0xfdca757e, 0x7592a594, 0xc736e53f, 0xbc3f68d5, 0x57ca32a5, +- 0x0c79e5e8, 0xc8b9befa, 0x5a7aec17, 0xfac978a6, 0xefd241d8, 0xefa1fd56, +- 0xade159b7, 0x6caef013, 0xd747ebe7, 0x8354774e, 0xec0eba7e, 0xb95ebe26, +- 0xfd152de3, 0x7fdb43cf, 0x8b3b72a4, 0x1fae11cb, 0xba7cc351, 0xc25fdd9e, +- 0xdf3c7ae3, 0x37ce3ad9, 0xa93edc1c, 0x9c7c93dd, 0x9bef1dda, 0xc48aa9c6, +- 0x79ff9e54, 0x2b4ef1f1, 0xbfb05bc1, 0x3a761dd3, 0x263a73cf, 0xbfb649cf, +- 0x1761d8bb, 0x2f2b41f6, 0xbca51d61, 0xbcfca3ee, 0xd357c4c5, 0xcd7a0f28, +- 0xc5bf39d1, 0x406b8c73, 0x6c4ed1ac, 0xda7ce06b, 0xf9827ff6, 0xa3b6ef48, +- 0xfd71965f, 0x35f885da, 0xafa58bd8, 0x8370cdd5, 0x5dfd287e, 0xabb22268, +- 0x3a4cef55, 0x0fc13366, 0x75c40ce3, 0xc1fa09a1, 0x9fcc7dfc, 0xcf647842, +- 0x8f0839ec, 0x5d79b5ec, 0xed52f249, 0xcaf2885a, 0x5eed7ef5, 0xc338de73, +- 0x4fd086f3, 0x5e7a95f7, 0xf1032851, 0xcdc761f4, 0x328674bc, 0x775917bc, +- 0xd9bd094e, 0xf1601f55, 0x081cfc11, 0x7e456bd6, 0x839ec570, 0x560f51b3, +- 0x2fe624c4, 0xada473c4, 0x763f3724, 0xa573f264, 0x515db351, 0xd457e7b9, +- 0xb78db2be, 0x6a3162af, 0x8c45e78f, 0x6c4d5bf6, 0xe11ec582, 0xf223ddfc, +- 0x95cfaa42, 0xff21b8b2, 0x9f8267eb, 0x26bdeaba, 0xf08d5f3d, 0xd61afb41, +- 0xc4d4e341, 0xd1c69806, 0x9b9cd5db, 0x46afea6a, 0xab7e20e9, 0xf42ff739, +- 0xeabe4fbc, 0xd487847d, 0xe09be7fd, 0x853ff44e, 0xeb2427c5, 0xb73d1a7f, +- 0xe6fa87e6, 0xde6378f3, 0x882cbd02, 0xe88cfea2, 0xd3ca73e7, 0xbf808da2, +- 0x3ff85a23, 0xdcf81f50, 0x625f0b1b, 0x326cde78, 0x709f59e5, 0x0f047c88, +- 0x047cf0f3, 0x7583622d, 0xcb6d11f8, 0xf28c6986, 0x8c3b4e0d, 0x5e2c06f9, +- 0x6f447a82, 0x25bdefd7, 0x7e30611f, 0x1650aa02, 0xde631670, 0x8d07ac3f, +- 0xb05b3cf3, 0x9f9ba8fe, 0xbd602c93, 0x60ff31fb, 0x0a03f0ab, 0xdc58ce31, +- 0xa7e4bcff, 0x3d99273d, 0xd0d56ca3, 0x9cb36300, 0xa02a6723, 0x296fb32f, +- 0x0bdf2e7b, 0x3d9b1966, 0xb3d0f313, 0x971b2c9f, 0x4b58f507, 0xcbff7f27, +- 0x500571b2, 0xe2eae63f, 0xca24abef, 0xbe5b57d3, 0x7da2333b, 0x137d3d06, +- 0xa4d4a660, 0x409cb3a7, 0xdfa133cf, 0x1f99717d, 0x557a1ef3, 0xc216678e, +- 0x73264376, 0x7ed60dfc, 0x75fa1cf7, 0x0d9d6d43, 0xb7be5fa8, 0x7499cff7, +- 0x23f30fde, 0x6b1e9cf0, 0xe11d22f2, 0x170be4d1, 0xe6b3afc9, 0x74fce999, +- 0xec5c3b95, 0xdf363a04, 0x23ce9239, 0xde31523e, 0x26e37e89, 0x70f3b791, +- 0x3f21be5f, 0x93b57897, 0x44f9f7ef, 0x0fd9d75e, 0x2eb2330a, 0x7d6a1fa2, +- 0x0628278b, 0x5e947ab8, 0xf9efb7da, 0x31dbadf8, 0x99eb130f, 0xc499d649, +- 0x7be94bf7, 0xf3053e6b, 0x2d9f1366, 0x78867c15, 0xfaf21a73, 0x9511cb97, +- 0xc55bda07, 0x8bd337fa, 0xd52297f3, 0x9f5185f2, 0xb4c74f1c, 0xd3c45cf0, +- 0xcf299ce7, 0x7a45ce75, 0x6675cf5a, 0xe0374339, 0xe7e57977, 0xfaee500a, +- 0xad4a69ce, 0xeb3f4879, 0xf4a64fb9, 0x19f992da, 0xcfb9c45b, 0x710f7054, +- 0x71c36f85, 0xdfe27e8a, 0x7fe41879, 0x803552ec, 0xd763a4a9, 0xa4280c4e, +- 0x45de789f, 0x3c2be0ad, 0x1ee74eae, 0xcfb466ee, 0x8290e3db, 0xdcf7d7e8, +- 0x60bb25e5, 0xe4b9d2f0, 0x17a4f75f, 0xa93f30c6, 0xda7e6be7, 0x427b040f, +- 0xb21f3942, 0xf2ee2327, 0x647e9c90, 0xcc8fd391, 0xb71e6972, 0xbdbf82e7, +- 0x8af3fa93, 0xcfd0c0fe, 0xee9f9c4d, 0xdf7af991, 0x3827ef53, 0x7ec8b086, +- 0x772f1fb4, 0x853bafbc, 0x03e8281d, 0x1186fff8, 0x66c740ff, 0x3a43afac, +- 0xc74a4c8e, 0xb47464e6, 0xe49dc79e, 0xfd87df0c, 0x443f2c9c, 0xe7ad72e7, +- 0xc9129970, 0xe9593c43, 0x3eb4ab5b, 0xb9d25b8c, 0x3b27de7b, 0xd8dfa746, +- 0x4e88e3b5, 0x843e7a06, 0xf3dd8c70, 0xd6e10dbe, 0x291df8e9, 0xc14c1db9, +- 0x8ffbabc0, 0xd3b0bb97, 0xbed24e16, 0xf5296d64, 0x82d9f807, 0xf3f018e3, +- 0x9fbfd614, 0xe14f3f1a, 0x3f032fbc, 0x7e0e5ecf, 0x4aaf3f74, 0xee1571c8, +- 0xff9d015b, 0x5b9f9fe8, 0x96cee304, 0x15d3e235, 0xef8a64db, 0x79b9fb42, +- 0x5fb909b9, 0x3f6ea531, 0xf15c579e, 0xb4fc4498, 0x7fbf9c54, 0xb7bf9c4f, +- 0x2f9603e6, 0xbd9e908c, 0x94605e74, 0x76d546f4, 0x09c3f3f3, 0x3ca02afe, +- 0x89ef715f, 0x15805f7e, 0x213567ff, 0x365d4bd7, 0xfd02bde3, 0x66ceb7e4, +- 0x9bcf2bca, 0xf90fd7d1, 0xff9b3efd, 0xfdd38a0d, 0x6e30cecc, 0x27b25414, +- 0x131f11c6, 0x6fd899a5, 0xbd2f9099, 0xcd6ba1bf, 0xc4615e76, 0xb8b03e7c, +- 0xf03e7cc5, 0xf9f3568a, 0xcc9b11c0, 0x8caf03e7, 0x8e07cf9a, 0x54de3eda, +- 0xc6bb131f, 0xfb6c7ed4, 0x5c7d5374, 0xf6a6f3fc, 0x37cf0e13, 0xf8eeafd5, +- 0xa4fda9b2, 0xde9a7763, 0x34ace94f, 0x6a7a9fbd, 0x6d7ea9b5, 0xda9abfef, +- 0xfd7197c7, 0xe47ea075, 0xfa9e6354, 0xcdaa5581, 0x0d57cf8b, 0x8c4b79b7, +- 0xfe8373cf, 0x834b2c12, 0xd2a767e8, 0x579c33b3, 0xf7ae354e, 0xd26ecc65, +- 0xe69c333f, 0xe225c7ba, 0x2fc00510, 0x2e01fc40, 0xbc815cb3, 0x1e40bae5, +- 0xb5a6ebf2, 0x83c7870c, 0x40cb0c56, 0xcb390279, 0x9c9e5d75, 0x93bb63e5, +- 0xb1ebe32b, 0x003eec9e, 0x2ef910b5, 0xb29bf942, 0xe32ff738, 0xfe32173d, +- 0xc2a5443f, 0x5e4a1122, 0x7c860167, 0xf5f75d6f, 0x8f8adef5, 0x27c78b80, +- 0x04f0fe1d, 0xdc3f2cc5, 0x4c55f0df, 0x92f80c50, 0x76a675bd, 0x499cff0e, +- 0xef89f7c6, 0xdfcc9342, 0xa5d5342d, 0x7f2973e5, 0x765c1528, 0x4f5192df, +- 0xe7b37e80, 0x7f52a62d, 0x96d0bcde, 0x06f05f34, 0xc3f467d7, 0xc9ff3ca3, +- 0x80dddf60, 0xfd933974, 0xf79843ea, 0x2f5172b6, 0x0e79e3f9, 0xd4487eb3, +- 0x3a2f3df9, 0xb3d68f3c, 0xebdeb8d1, 0x4196dae7, 0x9a6dd621, 0xf3e3b2ef, +- 0x61af3173, 0xfd3f0a70, 0xc79f3101, 0x96a323eb, 0xa7306322, 0x41793ce9, +- 0xda3676bc, 0x9e454361, 0xe4b643f6, 0x2e5553f9, 0x440caebe, 0x82f68d45, +- 0xc13ed2a6, 0x79dff299, 0x55abf530, 0xff21570e, 0xa3b639de, 0x0ea39f94, +- 0x3f7e78f8, 0x77d75b87, 0x21e85a05, 0x60055fd4, 0xfb0bf9b6, 0x517033c3, +- 0xbc214e68, 0x05b2ca6f, 0x4af7aa34, 0xebf8de74, 0xbed03320, 0xc1326fe9, +- 0x0a6074d7, 0x5aa915e5, 0x27464598, 0x7e44c9e6, 0xf0efbe82, 0xe44df661, +- 0xd55d36bf, 0x9188de77, 0x3a85ab3f, 0x370fdfb0, 0xa6dc69da, 0x7de992e9, +- 0xeabad681, 0xde51c010, 0x4bf14e96, 0xe40dd365, 0x0e3ea97f, 0x12e3d34f, +- 0x3c112c1b, 0xe1eece3c, 0x7c3c00f8, 0x2670f105, 0x4d91f858, 0xafbc349f, +- 0xbce950c9, 0x711490e8, 0xfc3a6d8e, 0x3a2691c1, 0xc3308de7, 0xf6fc6f2d, +- 0x3f9843aa, 0x807a7cf2, 0x2e3ea4a4, 0x779e6ae8, 0x1bfcf673, 0x1aed04bf, +- 0x1e19935f, 0xc277f0f9, 0x91f34f1a, 0x7824d1a3, 0xf006e9d7, 0x957e436f, +- 0xf9a6cd37, 0x2f7a0a16, 0x3ae37a07, 0xe685b3e3, 0x6d73fd10, 0x9d6be70c, +- 0x07a10ec7, 0x8579719e, 0xf97396fc, 0xf51d2df3, 0x73d204c4, 0x73ffd86d, +- 0x73f694ae, 0xdd892b9b, 0x517ba975, 0x1c7617aa, 0xca0e52c2, 0xd427ee01, +- 0xcfda370d, 0xe27f1fa0, 0x72cdf832, 0xb04bd7c6, 0xe1d94bdf, 0x65a04ab5, +- 0xeda5e178, 0x90cfb434, 0x0cfb750f, 0xe71479e6, 0x9e8b0bf9, 0xa3f5e837, +- 0x4499e6c9, 0xed8ebfaf, 0x9e397e4e, 0xbd027ed4, 0x8e64764e, 0x65ff5c9a, +- 0xd47a71a4, 0xf946557a, 0x97f62985, 0xedc9696c, 0xdfeb54c6, 0xa290fca5, +- 0xc07ee681, 0x847f216e, 0xdfb4ab95, 0xcd83f675, 0x3cc70ef7, 0xf288ad21, +- 0x93f55383, 0x04c976bf, 0x22bfcf81, 0x9dfc741e, 0xf015e0b3, 0xeba4d7f9, +- 0xd3e03564, 0x4b27c266, 0xf47b0cbb, 0x32bb9fd3, 0x16ea179f, 0xe0758778, +- 0x16075a2d, 0xf18a59bc, 0x7f379597, 0xa7c0eb44, 0x39a1671e, 0x0fc7a08e, +- 0x21df9c60, 0xfc17ba9e, 0x3b7dc44d, 0xf8d95e29, 0x17ba08fc, 0xaeba66af, +- 0x749cea4f, 0x117072ee, 0x2ecce7d1, 0x3ce11047, 0x66e3c593, 0x3a4d7667, +- 0xf799f184, 0x19670fea, 0xd9e67ce9, 0xe876a5a3, 0xa3ceccef, 0xf7e90aa5, +- 0x9ddee9a8, 0x2abf0b9a, 0x3f5e7f45, 0x77c7d0df, 0xd3ebe4ce, 0x3f3f8275, +- 0x5e301e29, 0x0a51fb4f, 0xbbed187b, 0x9b54bc3e, 0x499c15cf, 0xf114b37f, +- 0x0eb97800, 0x43d3aee9, 0x332b878f, 0xdc60663a, 0xfc0bf7b6, 0x2e8da93e, +- 0xe352a71e, 0xcd769875, 0xe35b879c, 0xc475a658, 0x3b50ef28, 0xd2c711d6, +- 0xc41bd9d3, 0x7676a7ed, 0x5fb1e7e7, 0x7eef29ef, 0x06f567ac, 0xd0c7873e, +- 0x06afe765, 0xbb7c03bd, 0x71fade71, 0xf7e94fe8, 0xd98af96b, 0xe0b1c2c8, +- 0xe25e61bf, 0x2dcb8a58, 0xe607efc0, 0x71c41eda, 0xf37325a5, 0x6c5c8196, +- 0x8794a8f2, 0x1c08cca9, 0xf37c23f6, 0xecef8214, 0x17df9961, 0x85b9cf32, +- 0xfc67bf9f, 0xfd9b921e, 0xa7d4beb4, 0xc3e3e7e9, 0x2afeb885, 0x1a516cac, +- 0x85a707d4, 0xd732c0ef, 0x10fc31d6, 0xf63ae77c, 0x609c029b, 0xd0bfc1e9, +- 0xcabb3abd, 0x3f71fb42, 0xe4b777ba, 0xc7fac2df, 0x7e85ebfd, 0x48efcbd0, +- 0xef31c775, 0xebbefeac, 0xec7c6166, 0xba3aae3b, 0x82fe05f7, 0xe7f41f4e, +- 0x32cadf0a, 0x6a691c61, 0xa16b9cf3, 0xe3f7876e, 0xcd69fbf0, 0x577ed04d, +- 0xaf1f3866, 0x534b71c2, 0xc10f0f9a, 0xb5bca33a, 0xcd29b4fa, 0xfe663011, +- 0xe3cbcd35, 0x10b85aed, 0xf757d4e9, 0xa86ddd42, 0x85752d3b, 0xd579f5d7, +- 0xe50bfc1c, 0xc3dcae95, 0xd9ca2def, 0x1bdf8f33, 0xee8f3ed7, 0x134e6b8d, +- 0x9a63447a, 0x58563cf1, 0xf88bdf0e, 0x195e92ea, 0x8f48e5ce, 0x2f78a67b, +- 0x59c39ee2, 0x06e3c51d, 0x62eec1e1, 0xbc78cbb4, 0x52f580b3, 0x8aebc7a9, +- 0x61ca8058, 0x48e5442c, 0x55e54ad6, 0x68e5462c, 0x096541d6, 0xc032a5eb, +- 0xe39632bc, 0x6cca8059, 0x59d1dd5b, 0x667f4fa8, 0x7c3a7d27, 0x8303aafb, +- 0x44de9118, 0xc78d66b7, 0x656bd6e9, 0xdcbc1ad9, 0x3f50f828, 0x348d5557, +- 0xdb62be03, 0xe87ec8f3, 0xdef63212, 0xf7045b26, 0xf9a3d963, 0x9c5abcf4, +- 0x7e3eae47, 0xf7cdec80, 0x60f3c982, 0xbb8bc05f, 0x963ed33e, 0x3ed67f59, +- 0x41be11aa, 0x39405f7e, 0x41708959, 0xa0ece6dd, 0x75f69773, 0x3ee907b1, +- 0xb4ec67b8, 0x18555abf, 0xbd43b32a, 0xa061776a, 0x7a8720c1, 0x6655703e, +- 0x96bc772c, 0xf5888f38, 0xdf825a71, 0x286fb657, 0x77fb7dc0, 0xf5a71ff7, +- 0x85e987fe, 0xb69a9f34, 0x4dd86aa3, 0xca2a7efb, 0x7d39bbcd, 0x97d93af6, +- 0x0640aecd, 0xfde9779e, 0x4b6fbf39, 0x94f7dfc7, 0xdf71975e, 0x283d70e4, +- 0x5ee9b042, 0xf951f7a9, 0x953f7a8b, 0xb2f7ab3f, 0x4700f820, 0x04da9dec, +- 0x30ce4f9c, 0x7bfbca2f, 0x432bd8de, 0x7cbe6227, 0xe601bf91, 0xcefd98d7, +- 0xded013fd, 0x7401c80c, 0x75eeec0b, 0xf3b42513, 0xcf29f37c, 0xbc6d1ee5, +- 0x4f008ff3, 0xe67012a3, 0x6b2fb8c0, 0xa02bb53b, 0x24fcfebc, 0xe5ffce27, +- 0x0fcd36ec, 0xddc61bf5, 0x247dc5ec, 0x02e36fe8, 0xfa2ecfea, 0xf6c4ef1b, +- 0x5a3f62f7, 0xa2fd9fa2, 0x677bbd7e, 0x543fbe36, 0xebee08cf, 0xb1b2da73, +- 0xbd1f7fbf, 0x13f195ec, 0xba477ee9, 0x17caca2f, 0x66cb9fd7, 0xe6cbb041, +- 0x41602b9e, 0xd393c7a0, 0xf942aeeb, 0xd1bfd357, 0xa0fd04ec, 0xa255d614, +- 0xb7a6f0be, 0x1f413b34, 0x9d01b06c, 0xa59f54bc, 0xcc70095d, 0xb181fae4, +- 0xa432e696, 0xc62bb03b, 0xae8fe1e3, 0xfa82399b, 0x7efe1ae3, 0xd79160e6, +- 0xf7e3ed00, 0xed0b31bd, 0x918a6ab2, 0x66e6b630, 0xa479f746, 0xce2a37b2, +- 0xc1a8b3a5, 0xba61fbae, 0x42a7e49f, 0x4c3ed089, 0xbd0f39c5, 0x5cfefcbf, +- 0xfd8873a6, 0xfde8d3fb, 0x7e74abe1, 0x679c520a, 0xdf2273cd, 0x881c15c3, +- 0xd763beed, 0xb8f60fe7, 0x57d5f113, 0xcc3e288f, 0xffe7d043, 0x49ffcd28, +- 0xef1ef135, 0xf7d81cf5, 0x7fd1059e, 0xea26923e, 0xb7922791, 0x2fb4b34f, +- 0x34cfebd2, 0x1fd69ccf, 0x12b8ef9e, 0x57b42775, 0xeafa3bce, 0x9b06df08, +- 0x7d2cbfa5, 0xfc69e7fc, 0xb45942aa, 0x5052f7df, 0x723bd031, 0xabef19a8, +- 0x78ef454d, 0x9b9b2fda, 0xae23fbe0, 0x5fad1950, 0xbf5a3337, 0x0602ee50, +- 0xe34f183d, 0xb9c555fe, 0x247a2651, 0x7a6250e8, 0xd2e4127e, 0x7cbb4fb8, +- 0xfe745dc7, 0xe7e69e24, 0x3f08b0fd, 0xb168f557, 0xfff67f69, 0xe169f1c3, +- 0xc7014b28, 0x1c33bfcc, 0x3fe49a57, 0xd368c701, 0x387efff3, 0x6380a466, +- 0x1c153ff6, 0x2f457b56, 0x2bda2fff, 0xcabda357, 0x9d6c41e3, 0xf7fdce8d, +- 0xe52a2a64, 0xc99369ef, 0xe195204e, 0xdf68eea7, 0xcd779f2f, 0x8b1c7bfc, +- 0x615f9db1, 0xd478ca2d, 0x11671157, 0x857f87ee, 0x0fcf03f7, 0x8683a02b, +- 0x1f693a64, 0x5434bfdb, 0xfe05fb85, 0x5435e585, 0x546eeb7a, 0x587a5f70, +- 0xefb438ef, 0x4fd96b36, 0xde933337, 0x2fbad08b, 0xb6bb22ad, 0x9b279be3, +- 0x6078df71, 0x68c3dd5a, 0x93914b07, 0x24a787cd, 0xd6f5cf7b, 0xd14fd32f, +- 0xce9d14ba, 0x293f42ae, 0x0ec68aea, 0xb59a3d20, 0xf0a3d200, 0x2296d19b, +- 0xdaf72ba8, 0xaf000d02, 0xbedd1992, 0x1e57e005, 0x4d764e18, 0xb61ff514, +- 0x6e89407f, 0xfa9dfcc1, 0x1bb7c500, 0xa5b47d85, 0xf317ae69, 0x3099ed98, +- 0x7ae5204b, 0xd097dd7b, 0x7534d75e, 0xae0a73bd, 0x01968107, 0x01f75e5e, +- 0xb1164f5c, 0x78a66722, 0xb46feb0f, 0x1af20d81, 0x6fe97eea, 0xbab79f32, +- 0xd70d383e, 0x8c95d5f9, 0xf7087f7f, 0xd2cc9e89, 0xfbdfc2f1, 0x4f5c750d, +- 0x7d448694, 0xeb7bcc26, 0xf7df5c63, 0xd1ebaba6, 0x44f987de, 0xc31b8ec8, +- 0x630e93e7, 0xf4fe007b, 0xbeb44571, 0xf17d6146, 0x0a71fbe0, 0xf7d2f79d, +- 0x6c639c83, 0xed841fb4, 0xc2ea7ee9, 0x742fda22, 0x388163ce, 0x69e703e6, +- 0x09517f7c, 0x3b3cc4ce, 0x04bf1f77, 0x8aa6ce29, 0xa26d12fd, 0xad205f39, +- 0x99b45be9, 0xfcda369e, 0x5ccc39dc, 0x9dc0b077, 0x60ec8f74, 0x2681be4b, +- 0xb00687f6, 0x1457e841, 0x6c3622db, 0xca85da07, 0x76df7851, 0xec811e31, +- 0x0c58faa4, 0x31e31691, 0x0c1d3f2b, 0x3282c09b, 0x6486a38f, 0x698e3bf4, +- 0x07947ce1, 0x66e2269f, 0x8dbf7883, 0x36ff61a1, 0x8ff14fcb, 0xf5efb47c, +- 0xb379c6fa, 0x4a91fe29, 0x889a22be, 0xec36dee7, 0xce9af7a2, 0x19100738, +- 0xc68e6ff4, 0x6f6b81f3, 0xd779f7e2, 0x947ee1ee, 0xe8b27efe, 0x9c4536b7, +- 0x327ae413, 0xd63df9c2, 0x485edb39, 0x0e7cacf7, 0x75f356e9, 0x6b4fc31b, +- 0xdfb9c7e2, 0x53b7b166, 0x158da1e5, 0x5f9f4dfe, 0xf218fc23, 0xc2ce902d, +- 0xd2ea597f, 0x4fbe6ee9, 0xa247bf42, 0x4f4dc847, 0xa8c44ab9, 0xea098345, +- 0xe9853739, 0x3172821e, 0x654df29f, 0x2c1fe8b9, 0x8225ffdd, 0x79c6d973, +- 0x5e4bde2a, 0xe13171be, 0x52ebc745, 0xa7f07f8b, 0x8d1709d6, 0xb4f6e9a7, +- 0xfee81fee, 0x484fd580, 0x47e7fdf5, 0xcc3a27ee, 0x3ed195f6, 0x3c1affef, +- 0xe07586cf, 0x67de20b6, 0x473ffba5, 0xf98eecec, 0x73655cf8, 0x2ec3f9f0, +- 0x54560f7e, 0xd87583dc, 0xdf859c5f, 0x7f3e29cd, 0x3b2f9625, 0xedea1a63, +- 0x7a3e3f97, 0x4a0ff903, 0x8d3cc34c, 0xfff70a33, 0xe7633af4, 0x0bf38a64, +- 0x7eef5fbc, 0xb867ee95, 0x74f7f0be, 0xfdc6bd3e, 0x3f639d2a, 0x3ca766d3, +- 0xb15debbb, 0x1dfde36c, 0xcdee17d7, 0x747e18be, 0x8088e1ff, 0x7bd170f7, +- 0x571a6105, 0xb70473e4, 0x53d2174a, 0xe7cd6f7f, 0x3e98ecd8, 0xa669e513, +- 0x2ff9e926, 0xcd97c88d, 0xfc9387f3, 0xe89bcf64, 0xf39bfde4, 0xc791b24d, +- 0x47cfeeae, 0xef59ff3a, 0xf1235925, 0xe0a9ef73, 0x19b405aa, 0x3dc4d1d7, +- 0xef3d2a25, 0x0e86f116, 0x54f6fb1f, 0xac799790, 0x75fb4ece, 0xfd177ee2, +- 0x4179975e, 0x2242fdcb, 0xd6242aff, 0x5e4437c3, 0xa7e63cd5, 0x376817ef, +- 0x75bf51d9, 0x6e60fb88, 0xf1bb6162, 0x425ea67c, 0xb6bd26bf, 0x7eb98e60, +- 0xb75cc873, 0xe7a8a3de, 0xdeb4fccd, 0x89ef153f, 0x999dfbd3, 0xd3ec3f42, +- 0xb03c5d3e, 0x67507e2f, 0x71e81f8e, 0x43cc1abf, 0x1e18fda6, 0xe4e59bf7, +- 0xbb8f4fe3, 0x56a37f68, 0x16e33753, 0xc5b3ea0c, 0xc6967cf0, 0x8bc60df5, +- 0x59a29ef0, 0x6f1f7e8a, 0x80e7bf54, 0xf909cbbe, 0x0ddc6336, 0x5ee930f3, +- 0xdf1e70ab, 0xa0721157, 0x0ece19c7, 0x5e6467f3, 0x4db5bf84, 0xba9ee9b2, +- 0x13b895fb, 0x00fee0f9, 0xf04ac3cf, 0x6f14d471, 0x49a936d5, 0xebebb7ef, +- 0x9e0af407, 0x3ee0724f, 0x01f7d02f, 0xc635e825, 0x887b3423, 0xf4f776ea, +- 0xf2f23f0e, 0xe3661b03, 0x988d1055, 0xca760c1f, 0x6957da3b, 0x03db767d, +- 0x621ef187, 0xc7e6dbb7, 0xb341b8f5, 0xa357bed1, 0xefeb49cf, 0x8bdaa97a, +- 0xebf7a4fc, 0xae0854ee, 0x06515ab3, 0xabff08bb, 0xda334fe0, 0x87df31af, +- 0x9e37dff5, 0xddfaed46, 0x0a7075bf, 0x131d59c5, 0x17bc016d, 0xb1ac1d5c, +- 0xcfc9243f, 0x936f1bec, 0x549fb492, 0x77494ff8, 0xf507a77b, 0x7c96b743, +- 0x2dc8ba3f, 0x3fc2fb89, 0xb22c3ca5, 0x5f33c3c4, 0xefc71e1f, 0x8a1bcea5, +- 0x8a3e490b, 0x2b6f20dc, 0xccf59dc7, 0xe47c93f0, 0x2e1c7cf2, 0xabda8db7, +- 0x6c379e4e, 0x152da7be, 0x4978ea3f, 0xc8e50785, 0x37e78c5d, 0x7f719986, +- 0x43c52dce, 0x4e32d794, 0xb8afba49, 0x51a1e056, 0xcabf1009, 0xb89c86d7, +- 0x4f64340e, 0x7ffee277, 0x28cfe2b3, 0x88f0fb44, 0xd66e30cc, 0x8dcb35e4, +- 0xfb88b65e, 0x6dbae745, 0x7559ef49, 0xeeff92da, 0xbe6e5dce, 0x9fecb44e, +- 0x52dee742, 0xd46809f1, 0xa5a5d910, 0xf3ef178a, 0x5e1ced96, 0x04fc8a57, +- 0xfc54dfbd, 0x177eef71, 0x61993dff, 0x659f3a4e, 0x9c49af1d, 0x78026bc3, +- 0x1a6dced0, 0x6c7841dc, 0xd178a89a, 0xd3f9768e, 0x5ed0d398, 0xef489cc9, +- 0x78d96acf, 0xa5359026, 0x4f1d3be0, 0x9f6db9d7, 0x16c2ff8d, 0x0df9cbfe, +- 0xfc0dcbc5, 0xff193ab7, 0x983c875d, 0xde37e1c3, 0xf264a9ab, 0xbc2b3ffd, +- 0xde3e7e7a, 0x9fcc6e87, 0x845f052a, 0x1c8e8dc7, 0xec0c3e9a, 0x303abedd, +- 0x86d78c38, 0x73fb8e7a, 0xd133a771, 0x647dd1be, 0x75429376, 0xdf07df3a, +- 0x6cf7f105, 0x39fdc4da, 0xc1f3a835, 0x45beaa8f, 0x9f585e63, 0xbb2ccaef, +- 0xda51e717, 0xab9f8071, 0xf9a1cb69, 0xadef8b57, 0x9c3dc6f0, 0x2f1ee39f, +- 0x82c71995, 0x77dfc03f, 0xf348eb68, 0x2db71c63, 0xd639db8b, 0xf5bbceef, +- 0xb156873c, 0xfb49d1df, 0xf8333912, 0x3bbbd47a, 0xfea3fc9d, 0xf7e069f8, +- 0x8dec5869, 0x94367bbe, 0xd51dd938, 0xc7d0eec2, 0x82c45d2f, 0x2f4bbbf8, +- 0x2716b1a5, 0x843b87d8, 0x2df6321c, 0x780a5fb1, 0x7c6fb804, 0x3fed1471, +- 0x04bdfde9, 0xcfb612cb, 0x912cedcd, 0x3fc0cfe4, 0x6fba6631, 0x39d9c6ad, +- 0xbe47f51c, 0x46edde1c, 0x6758e33f, 0x5edbd62e, 0xe0f64d3d, 0x73f0f0a5, +- 0x51c2bf81, 0x571e7dba, 0x35d6718d, 0xf45d95cf, 0xc6355d7c, 0x50fe0c43, +- 0xe9b36f02, 0xa17ebf79, 0x1fe8bf3f, 0x8d392be3, 0xa09ae9c9, 0x4c8b3e4f, +- 0x0a7d18b8, 0x25d23de8, 0x1fd39a3a, 0xde60f9f7, 0x607fd764, 0x09ef27d1, +- 0x9f4ffd7a, 0xae26366f, 0x40e53f01, 0xf188e789, 0x9fbc5bde, 0x6fc794f7, +- 0x15b27f5a, 0xcb3553f6, 0x2c6987c0, 0x8dfa84e2, 0xd167ce8e, 0xfaebd3fe, +- 0xc7c11bfb, 0x39fd8c9a, 0xf2e91cb9, 0xb928bd5b, 0xedcb7edc, 0x3c0efc21, +- 0xbee0f716, 0xfc628bc7, 0xe81fd8b6, 0x76b6b3be, 0x3d4fe199, 0x96145c0c, +- 0x4e825ac3, 0xebe1fbfd, 0x60ff2e8f, 0x0b728e4e, 0x4a3947f9, 0x6bfdcb5f, +- 0xdfe8cf5d, 0xcfb47915, 0xee8f1f66, 0xc8ac4e77, 0x75724393, 0x05f44308, +- 0x7bbdf96b, 0xa2ff0b6f, 0xd39fdc5a, 0x18c7dfa5, 0xde33691c, 0x5a76f5bb, +- 0x87fd1441, 0xe5f787b7, 0xed1ae609, 0xf0576aaf, 0x1bbef0df, 0x7ca65476, +- 0xc1bc0fd5, 0x9a2fee0c, 0x712ea7fd, 0x3fee8eaf, 0xffdf8b35, 0x7f398362, +- 0x1dd24b37, 0x91ffb0f3, 0x72af749d, 0xa75f2e6e, 0xcc7f73f5, 0xf64259d7, +- 0x54abe0b7, 0x0f39f77c, 0x83d40f97, 0xad7ca491, 0x0dbf9e9a, 0x70c460eb, +- 0x53cee84e, 0xcf1ce8c3, 0x78a01612, 0x749692e6, 0xbde03116, 0xf9e4f1ed, +- 0xbe848b35, 0x4ef7136f, 0x5e7cd1b3, 0xf3e7be09, 0x1c975b68, 0xbe0c9eee, +- 0xfb89b70e, 0x6094dbc5, 0xd529e23a, 0x078fa13a, 0x3ca74b04, 0x6f07f387, +- 0xe6fd71a0, 0xfa257f71, 0xb26ff17d, 0xc0037df8, 0xd827d0a3, 0x9b1e1bfe, +- 0xe2bebe49, 0xb3faacf9, 0x24feb4cc, 0x9e933ef0, 0x927d767f, 0x927d0979, +- 0xf251ef4d, 0x3a78ced0, 0x7b75efc6, 0xce6db0fa, 0xdb742496, 0xaaf4e424, +- 0x3fee851c, 0x76e7151b, 0xb976aa40, 0x639ee259, 0x7c2b4781, 0xf9c9c5d9, +- 0xfe0ca5e3, 0x7e74f57d, 0x1bde334f, 0xb285f38f, 0x75fd0020, 0xf422d74d, +- 0x6fe25ffc, 0x7ab49c62, 0xbf8fc3a7, 0xd3b5d7cf, 0xa27a8155, 0x62a3a76b, +- 0x7e9fd68b, 0x3b663cbb, 0x4ccf99f7, 0xf58c7fbf, 0x705174a0, 0x5fd1cfc2, +- 0x3ee99768, 0x927f6b49, 0xecf34dc7, 0xec29e7d3, 0xb9b9afb0, 0xe74ecd3e, +- 0xf117b174, 0x572ad475, 0x1d3c8547, 0x2d90f215, 0x75876bee, 0x92eb89c9, +- 0x0217eede, 0x2cc393df, 0xe7c17de9, 0xb12e02dd, 0x76bc3c2e, 0x04c3fb06, +- 0x08ce7dfc, 0x7eda19c5, 0x7ec02f13, 0xdc78cabb, 0x16fdfac0, 0x998c67c1, +- 0x3349eaed, 0xb9e612fd, 0xc5e498b0, 0xfdbd7c7d, 0xb7bf18a4, 0xd3b9fff8, +- 0xdbc5ecfb, 0x807bbfc8, 0xf49a2eff, 0x81eb8a53, 0x61b4170d, 0xc18fd15e, +- 0x5ff8338e, 0x1de8b2bf, 0x0baf3c2b, 0xefc4da78, 0xeb8d3287, 0xf55d2b61, +- 0x779f4c75, 0x1cb300f6, 0xd7ff82c8, 0x9647328a, 0xb9743c68, 0x7d7c591c, +- 0x5cc4f9e6, 0x49d2e24f, 0x1e5859cf, 0xbcaf7003, 0x90e6fc43, 0x95dcef88, +- 0x31ef3e19, 0xe9da3df0, 0xbb097eb4, 0x6fdc4dbc, 0xa889dba9, 0x466bc74f, +- 0x0e0223b8, 0x4ad7d71b, 0xf30d7d72, 0xe2a7bf10, 0xf6127ea6, 0x262bb706, +- 0x166dfc0a, 0xb25f51e7, 0x3fb226b1, 0x39749e04, 0x9661951d, 0x7f8ca2d3, +- 0xacdd390e, 0xa4727cf2, 0x787d325f, 0x9427ed1e, 0x71c16387, 0x4572c798, +- 0x5fa00b48, 0xff31da5a, 0x0cf1e600, 0x943f83df, 0xe1e39093, 0xbfb19f82, +- 0x2dfc0645, 0xf09b70c8, 0x7f8cf9f7, 0xf877bb0e, 0xdf37d631, 0x7d7a0cdb, +- 0xe5c68655, 0x942ffc00, 0x9a7f8a83, 0xe00e86f9, 0xa06aae39, 0x9d0caa3b, +- 0x8b62da3f, 0x3ed0b9d7, 0x6802c63e, 0x16c7775f, 0x7f00c6db, 0xf6e26f74, +- 0xdf9e9f63, 0x7a05f1c8, 0xf97a8639, 0xf4c1638a, 0x275f50d1, 0x458ae3f8, +- 0x14e7df8c, 0xcfd14773, 0xce44f5d6, 0x7033bd4d, 0x7a6577df, 0xf0cb835d, +- 0x3b7dafbc, 0xe84c2fb4, 0x37d46a9b, 0x7df6d4fe, 0x8d3a466b, 0xe209eb87, +- 0x733a5665, 0x979e00ba, 0xee32230a, 0x4574be6b, 0xe7bc78e1, 0x785a50fd, +- 0x7ef86af4, 0x0e3e1cd2, 0xaf44776b, 0xd2ff1248, 0x88ae75f5, 0x7c8ae54f, +- 0x5e34dcef, 0x45f42c7e, 0xc1f39783, 0x9ebcbdaf, 0xcf1e49eb, 0x17ef11ea, +- 0xdcef5cc8, 0x2edc9657, 0xc67c6589, 0xb24063f8, 0x1963e3c6, 0x6f9ee239, +- 0xeb5f425b, 0x7c4273fc, 0x2edf8fa7, 0x9cfcb5e6, 0xe59fe264, 0xcdf11d4a, +- 0x3d0a73f2, 0x1522e5d7, 0x79fbe9ff, 0x78e11d9b, 0xbe7bd406, 0xc60961fe, +- 0xe9ef0a0d, 0xf848fbe2, 0x5253407b, 0x1ebe87cb, 0x3d06f4e8, 0x0df186df, +- 0x2713f3d0, 0x18f43ad3, 0x9c85975f, 0x1ff4ec1a, 0xb659efe0, 0xd4555c75, +- 0xdf6ba060, 0xfee0197a, 0xd95d758c, 0x57c4c980, 0x89d79ea7, 0xa3ef2ccf, +- 0x25e1d852, 0xbc3b577f, 0xc93c63b4, 0x578112ed, 0xc7a6de3d, 0x507b18b5, +- 0x13f731f8, 0xe4cd277e, 0xdff80df2, 0x9a3ff021, 0x7dbbffe3, 0xec95bff8, +- 0x2f2e5684, 0xa52b9db9, 0xfa2f9262, 0xa4ddff4e, 0x52afd3c2, 0x2f78e77e, +- 0x13ffe7f7, 0xc9555084, 0x00008000, 0x00088b1f, 0x00000000, 0x7dd5ff00, +- 0xd5d47c79, 0xcefdf8b5, 0x3324b677, 0x5f64ccc9, 0x25849308, 0x2126126a, +- 0x26504109, 0xc5116109, 0xfb094049, 0x515983b0, 0x2fb5696c, 0x4a444103, +- 0x505d8bdf, 0xd101da94, 0x101ac55a, 0x83b06034, 0x6795622c, 0x05b054a4, +- 0x2108ee3b, 0xf16b43c9, 0x3dde5a57, 0x999bdee7, 0x006677ef, 0x7e7ebe7d, +- 0xdeb8ff0f, 0xdef7cbb9, 0xfb3dce73, 0x3ab3c9bd, 0x21094b25, 0x0b62a21b, +- 0x99941c48, 0xc84b125e, 0xbd3e0988, 0xe90844dd, 0x95242448, 0xa423aefe, +- 0x475aea0b, 0x2423c932, 0xbd389ead, 0xbed19eb4, 0xfad2d25f, 0x8637f865, +- 0xc94ad310, 0xfe9e30b9, 0xd3b694be, 0x3a166ddf, 0x9ed03130, 0x1609ebcc, +- 0xd025213b, 0x820d27cf, 0x936f36f9, 0xb4be74b4, 0x62908976, 0x2f13365a, +- 0x4b8c0ac9, 0x99efb073, 0x01695e1c, 0xbb48dfed, 0xac849191, 0x59e754d3, +- 0x14996812, 0xbfa568e3, 0x07bab06d, 0x4fea7ec0, 0xda667cf9, 0x2ea9c465, +- 0x7b8e9bad, 0xb4cceac2, 0x63f60624, 0x24692d97, 0x53989087, 0x366d9d6c, +- 0xfb05d732, 0x174cfe23, 0xc63f240c, 0x15b211f5, 0x93289bd7, 0xab46c423, +- 0x2f7e87d0, 0xd6ee7569, 0x7d6052f5, 0x6ee23649, 0x49496da7, 0x84d3bdc4, +- 0x2291d7fd, 0x7048d7da, 0x87ab493f, 0x059f5d6c, 0xde7179f3, 0x36d71caa, +- 0xf92abdf8, 0xfa56a2ba, 0x9f06ce7b, 0xb71d3e76, 0x0266b377, 0x2bcc53ec, +- 0x0916d1ca, 0x8c7dd1c7, 0x7d89fd80, 0x9289fba8, 0x5bae0f10, 0xb345d3f4, +- 0x5bf685fd, 0x4cc6f385, 0x6d0df060, 0x2f6c77ff, 0x0cc265ff, 0x1afd6f58, +- 0x0148313d, 0x75613ff8, 0x4d7002dd, 0x0122df6b, 0xa68c3e6c, 0xf02c3474, +- 0x29a30fdd, 0x76b0153d, 0x87f3853b, 0x79474a7a, 0xb48a3a01, 0xb295fafe, +- 0xa0f0e173, 0xe23d1afa, 0x2c9e8b69, 0x5e0bcf6d, 0xdf5c6adf, 0xcb068b22, +- 0x2cd756a3, 0xc7634f80, 0xfbc07ac3, 0xe81f6db2, 0xcef857dd, 0xee91c2b5, +- 0xe296957f, 0xb25daebd, 0x4ae92818, 0xe81392ed, 0xe8d6bea0, 0x6fd47805, +- 0xd64b7467, 0xa183bde8, 0xa7c3bede, 0xf7e9eda1, 0xfd321d3b, 0x0efb6eb9, +- 0x7c105169, 0x12bdebd3, 0x59a86bac, 0x1e9f2b9c, 0xfe8a95cf, 0x4578510f, +- 0x1c3bba51, 0x5a463c45, 0x3c9b9776, 0xb76f8512, 0xfd0f5dce, 0x1c6353ba, +- 0xf5efda1e, 0x488fe31d, 0x779adcf4, 0xae507c1a, 0x314d6cd3, 0xd775f6d2, +- 0x41ad1deb, 0xbad36774, 0x6b38c176, 0x8ab1d982, 0x206eca7e, 0x9c131645, +- 0x47fe2577, 0xc5cecfdc, 0xa32c4b6e, 0xe08a4223, 0x316e3c5c, 0x82893d63, +- 0xf7d28cbb, 0xd75b1d61, 0xe1e8c24e, 0x836b9c52, 0x23e3bf05, 0x3ade3a0e, +- 0x3a979d81, 0x7e891fba, 0x2ef36eaf, 0x623927dc, 0x6fa7b843, 0x75bbf097, +- 0xb9e0b7db, 0x73bb3ace, 0x2ffa1ebf, 0x2451a525, 0x1b9cce98, 0xd5efcf83, +- 0x426235f0, 0xade81ebb, 0xf2a1f38e, 0x3e936e5f, 0xafdfda0a, 0xa3c2322d, +- 0xfdb6f36e, 0x647bf469, 0xb60cb129, 0x13fdbf63, 0x06b5f7d9, 0x607fc412, +- 0x9d6c799d, 0x8ff8828b, 0x3e187fd8, 0xaf585bf4, 0x41d754e9, 0x487c87c6, +- 0x6afd628f, 0x7e7076bc, 0x3c4f4e38, 0x93debbf8, 0x1df3a76b, 0xf9c68ece, +- 0x73805f04, 0xa5f9c35c, 0x6213d686, 0x5a0eb9e8, 0x9e6f588f, 0x82d3a2b5, +- 0x3842e870, 0xe2d66c34, 0xaef4abfa, 0xce83cb41, 0xb9f9efc3, 0xfbda6d79, +- 0xfdfd3f7a, 0x83bf2fe7, 0x936869f8, 0x48cfc09c, 0x3bfa3bdb, 0xbfac01f2, +- 0x21124991, 0xb7fb0893, 0x7a3bf771, 0xd27dfd3b, 0x86bf862e, 0x0bb43b5d, +- 0xccfa014c, 0x1cdafb3a, 0x7686b3a0, 0x00928903, 0x582eee7f, 0x054e9a8f, +- 0x8ddf043c, 0x0998cf84, 0x0f128f8c, 0xcf485f3d, 0x731aacee, 0x8a5f6f80, +- 0x353a30d3, 0x2dbbdfb1, 0x1fa01eac, 0x974007f7, 0xd78ed155, 0x15545ce0, +- 0x02568e49, 0xfb863ceb, 0x7064a848, 0x754f5e0c, 0x997e647e, 0x85e5cf18, +- 0x63599fd6, 0x7eaf9c0e, 0xf7c7cfbe, 0xfc995e02, 0x49dfb1f0, 0xb03f2bb6, +- 0xd2de356e, 0x0ff612ad, 0x01174f43, 0x26b96a7e, 0xe3e82fd6, 0x0ab59bd7, +- 0xeab061f9, 0x55833e71, 0x08dbeb8b, 0x7e72a1f8, 0xcb9d8ea3, 0x5e8cab8d, +- 0xc7d31fe4, 0x9f28911d, 0xfbd0cf36, 0x99a43ca0, 0x87ed0f5f, 0xd7f7d8d2, +- 0x43773469, 0x136add7d, 0x3a7c4569, 0xa044d68d, 0x4bc4589b, 0x6bdead7d, +- 0xfcfcf3a0, 0xeabfc645, 0x012f263d, 0xba9ee83e, 0x8491c610, 0x8053c728, +- 0xfd41f737, 0x7a50e61d, 0x6f63d3b2, 0x6a4fbfa7, 0xe04ce767, 0xa451f281, +- 0x04bf212b, 0xf4f0035c, 0xc08dce2a, 0x0b38a5c7, 0x2cee5be7, 0x33dd7780, +- 0x738fde51, 0x132eb7d9, 0xa2ab4ba0, 0xea91d4de, 0xa818d8fd, 0x00ffc1d7, +- 0x52a76c1d, 0x83ae94ad, 0x765d33af, 0x6efb075f, 0xeb0ffa30, 0x4f4b6a28, +- 0x8eb9e1f6, 0x2b75b744, 0x98fb4cdf, 0xa57743ea, 0x38a581bc, 0xa56cbaaf, +- 0x78e52e3c, 0x9bcbc01f, 0xd41f8cac, 0x79e3b715, 0x19b8fbac, 0x0269b1cf, +- 0x53a667e3, 0xc84d7e4a, 0xb2beb84f, 0xc557c701, 0x29938fb4, 0x257eabdc, +- 0x64495a59, 0x2244b97e, 0x9fa7902e, 0x3b103e6d, 0xe97be00f, 0x8dfb8cb2, +- 0x6c9dfb62, 0xfba8e765, 0xa4700a19, 0x093d66f7, 0x9d6bdfb3, 0x4b8ef88f, +- 0x0e3af780, 0x95edeeeb, 0xf4a13f23, 0xce2679e2, 0xdcf7fc01, 0xf83f29f6, +- 0x7bbbae84, 0x9b9418db, 0xa42ead09, 0x28c4be9f, 0x3f4a56c7, 0x20993209, +- 0x6aafbc51, 0x8a3b103f, 0xb9fcfb8e, 0x8f204561, 0x9e75f117, 0x095e517d, +- 0xebfd5970, 0xf6866e17, 0x0f14af3a, 0x99fbbc7c, 0xf813fd5f, 0x4d6dd2fc, +- 0xd69149a0, 0xf7a77ee7, 0xef1a7ed3, 0x33fbf616, 0xf7e81671, 0xdf0f93f9, +- 0x6d6ef00c, 0xb3f6c56f, 0xfac16e4f, 0xe17ebf6b, 0xf207ffd5, 0x80eb15de, +- 0xdc5f677e, 0x77a9788f, 0xdfb09d6b, 0x71bd7448, 0x27c67ec7, 0x39c3ae41, +- 0x4bfc65a8, 0xdfa0b5d0, 0x773d7fcf, 0xa87cb064, 0x12195d97, 0x38364ff4, +- 0x5e50929e, 0x14389ca0, 0x7451b445, 0xd2d3afff, 0x792acb48, 0xe01d7ef9, +- 0x33f18739, 0x790921aa, 0x7f431bed, 0xcc4c7dbf, 0x2f3bd416, 0xcf0833dd, +- 0x3ba30c4d, 0xcf918f3a, 0x88798463, 0xf33ea096, 0xa875e676, 0xcd2952d7, +- 0xce1249fa, 0x1ba6e873, 0x17b9c2b6, 0x6af985eb, 0x3abda1f2, 0xf889e403, +- 0xe75f1d7d, 0xdf2668ba, 0x537e71ce, 0x075a6157, 0xa3e7b9e5, 0x8d3f016a, +- 0x2b10ff7a, 0xd18f2fc0, 0x265643f1, 0x97dbea87, 0x384d1aeb, 0x9779e71e, +- 0xf32829f2, 0x94fa79e9, 0x6bda579e, 0xf0e1e5db, 0x3e32dfbd, 0x60ca4d19, +- 0x7d66d31f, 0x62fc0120, 0x75759af2, 0x58e7d708, 0x7052c53b, 0x760ae97b, +- 0xfb74d47e, 0xcfc4d5a4, 0x69b73b0f, 0xec33aabb, 0x8e0cb7c8, 0x53fa41c1, +- 0xab7752da, 0xcb7efe99, 0xa643b70a, 0xccf7b774, 0xb4e971b1, 0x695cebfe, +- 0x2cabd238, 0x31ec7931, 0x561a77e1, 0xe88f9256, 0xcfc9dfb9, 0x68859275, +- 0xe00a2c6f, 0xb44b4aa9, 0x1f7f8426, 0x7586b5f2, 0x636f5e5c, 0xbec624eb, +- 0x1c6629cc, 0x16d1ba67, 0x671d0758, 0x2fbd6132, 0x907ccef3, 0x945a9e8f, +- 0xae3d768f, 0x5fe0acf7, 0x3b3053c4, 0xa81fc03f, 0x7a06e6de, 0x7b33d24d, +- 0xb563f805, 0xf2e6f419, 0x4092d623, 0xdacd1499, 0x6d9270d5, 0x3bae9db4, +- 0x7ec4e6df, 0x857899e4, 0x07c48afc, 0x37fe391b, 0x40c5fe4a, 0x513d9e67, +- 0xc6eba016, 0x1443fd9b, 0x53870976, 0x9e9ba70f, 0x0e5e8c3d, 0xd81e3469, +- 0x37ada1df, 0x4295696c, 0xae50f1e5, 0x4875a79f, 0xda4bc016, 0xfe051ae6, +- 0x0ab75ea8, 0x5c86caf4, 0xf7f514a9, 0xbfbfe58e, 0x291bd68e, 0xb8dea0de, +- 0xaa4f9f8b, 0xc6ff42a7, 0xf085ea8e, 0x8984f4bd, 0xfd42590e, 0xad3a5c68, +- 0x1293d637, 0x071bff38, 0xe3a4f738, 0x94f2243e, 0xd529e41d, 0x269e41ab, +- 0xde3ea3e6, 0xfa86dee8, 0x73d5c937, 0xf510b7b9, 0x9994c6f5, 0x215f380e, +- 0x2acf627c, 0xed1af7d4, 0xda288ed1, 0x7487527f, 0x4c77d337, 0x7247ad84, +- 0x77927d42, 0x73d61794, 0x9447c05e, 0xf039aeba, 0x06dd9efd, 0xafeda1e2, +- 0xf28f19ef, 0xf98bd05c, 0x75ca0325, 0x8122d69b, 0xc5ae7e5e, 0x4c1a3e49, +- 0x9cb81fc8, 0xdbacf011, 0x7381a59e, 0xc3b79e72, 0x97127b3f, 0xc36bb487, +- 0x67d21f42, 0x13dbd73d, 0x7bc2ce0c, 0xf427f082, 0x641d3528, 0xd35e18db, +- 0xe0941f36, 0x73f1ab10, 0x6be252cb, 0x65bbeba2, 0xa637c6b3, 0x19abf500, +- 0xe957f7c8, 0x742956c9, 0xc63621be, 0x5de2aa2f, 0xab27c085, 0xc11c99a6, +- 0xda2aa9fc, 0xd20a89a9, 0x157108f3, 0x26763d83, 0xcff08cc9, 0xeac3d9b7, +- 0x79f6a165, 0xb74fda14, 0x480a79b6, 0x155d6d36, 0x92e70b5d, 0xf21363f2, +- 0x0f1d0b4d, 0x51d6fdf6, 0xbefb324f, 0xb14de715, 0x8ef9d859, 0x83371577, +- 0xb5c7203f, 0xb331c982, 0x8e7edc23, 0x3e1e855a, 0x740350a7, 0x00e4d532, +- 0xafe7f2bb, 0x6e91f348, 0xc260543c, 0x38af7179, 0x2bd99136, 0xe23ba00e, +- 0xd5bea2d6, 0x86f2ecd8, 0xc7462ba7, 0x02ff548d, 0x15d29c3d, 0x83b1ade2, +- 0xf7611fc9, 0xd6089f03, 0x12b9c577, 0x35f816e7, 0x37a08dd0, 0xf5af6e71, +- 0xf3f0f67c, 0x1ff743d1, 0xbde69f4c, 0xafd72e8c, 0xfb4397b2, 0x09622afa, +- 0x76d557b6, 0x1f0e1d90, 0x8c9fdbad, 0x823cc2f1, 0xbab06dcf, 0xbd60da66, +- 0xab58df5b, 0xd4be0125, 0x21a1f7b8, 0x8ccfd257, 0xd19f365a, 0xa60de31b, +- 0xb705231f, 0x0f4b08b9, 0x9598e7f0, 0xf723fde1, 0xcf4c4cda, 0x65fab6fb, +- 0x7c05a49e, 0x5f32fd09, 0xe36bdf76, 0x08a525fa, 0xe992b992, 0xebc04997, +- 0x8d6c1f81, 0x113f02f1, 0x7af5267e, 0x099cfcdc, 0x233b0abc, 0x7ff59629, +- 0x359b9f98, 0xbc63dfbc, 0xf05fb20c, 0xee35d83c, 0x591c880f, 0xdf71880e, +- 0x7c4bdf95, 0x3523c847, 0x41fac0fd, 0xaa7ec16e, 0x6bf722f3, 0x38edcfdb, +- 0xe1ef3d15, 0xe016abe7, 0xbc627a08, 0xe700effb, 0x19c47159, 0xeb3ff14f, +- 0x27a40677, 0x0437db92, 0x2d3ad0ec, 0x806c18f1, 0x1fd79d57, 0x78a6b784, +- 0x6cd7be36, 0x1cf4c8f4, 0x6f778a5c, 0x153c7987, 0x3d03e1c4, 0x5f9487f6, +- 0xbe24b9c0, 0x4d27e012, 0x700b1fc4, 0xdbbac5b4, 0xaee53e91, 0x3b53a84c, +- 0xf3be00a6, 0x9fb30c48, 0xbd90defa, 0x2e3c2943, 0x3efffd18, 0xc2e7ae8a, +- 0x87871c8a, 0xef7a73ce, 0x99ff779f, 0xfbbf3ef6, 0x7ec101b3, 0xeca346ac, +- 0xea07c6d2, 0x6da9123d, 0xbb77c30f, 0x986fcc6c, 0xbbf08375, 0xbadea1f5, +- 0x0c99ca22, 0xfb159f7e, 0xa4af93ca, 0xac5d37cf, 0x3f20de24, 0x0f1d135c, +- 0x8e2e9ae3, 0xe643dfc3, 0x7c81f3a5, 0x4e98ba68, 0x77d9c33c, 0x30fc6f80, +- 0xc0dbf19e, 0x3f6c4cf8, 0xf3fa51ad, 0x3c45e5fa, 0x422ed7c3, 0x1f6b8426, +- 0xb5f6cf1a, 0xdf9d9b2b, 0x17924dbe, 0x2bc583ec, 0x82993ecc, 0x19fd3174, +- 0x16c5a5f4, 0x0b134f8f, 0xb1f287fc, 0xa9c68861, 0xcc8f6a46, 0xf68cf2e3, +- 0x7a068ed3, 0x1cf058f5, 0x9c39f9ba, 0xd7faf1d7, 0xac589fe0, 0x74d1c625, +- 0xc746f99e, 0xfbfa74e1, 0xb1b1a627, 0xde162620, 0xe409253b, 0x66acf258, +- 0x32122ff4, 0xa9fa02d6, 0x97cb4644, 0x0fa4ae63, 0x458f5169, 0xf074a27a, +- 0x2faef16f, 0x1d021d04, 0xf187bacc, 0x49ffd135, 0x17f3869b, 0x1fbe1d25, +- 0xc6efdf01, 0xe80afc57, 0xd738c1ec, 0x7bde703f, 0x5ff82bce, 0xfa7fe48f, +- 0xe5d3a071, 0x2453c766, 0xc389bc74, 0x4bb0b7bd, 0xdef1fe0f, 0x44c8ffe5, +- 0xf5f3b47d, 0x1ba7c093, 0x0c9f268c, 0x5d2ec57a, 0x03ec5fb7, 0x339c62e4, +- 0xf38e9e3a, 0xfada383c, 0x9209a529, 0xfdc77f4c, 0xde144ed2, 0xbc191b77, +- 0x5b778ddf, 0xee9113e3, 0x757d82e7, 0xb38f68c1, 0xfbe8bd01, 0x2632e3f1, +- 0x3243f005, 0x74bc4acc, 0x997881be, 0x01ea746f, 0x2e9c0bfe, 0x38ace75c, +- 0x8145895f, 0xf2f93c87, 0x078ed70d, 0xd3eb9f99, 0x730e5fe0, 0xb872861e, +- 0xd1fa10fc, 0xa31a74f2, 0x6499d3db, 0xaf284ee9, 0x771d25a7, 0x8bd79b3a, +- 0xef087d78, 0x37eac497, 0x5d3dba72, 0xbfa9fac0, 0xceff2773, 0x62cef1bb, +- 0xe71d1380, 0x5ebe03d3, 0xbe82f28d, 0x8dd6f94c, 0x7c5e8cf1, 0x55be60d6, +- 0xf80437dc, 0xc5096f61, 0xfacfdd1b, 0x13ccbef2, 0x19f657c0, 0x57ed5b2c, +- 0xbe64dfc7, 0xc72d6fae, 0x958e541c, 0xe4d8e42a, 0x10c72678, 0x7a25744f, +- 0x420d5fa6, 0xc87d20fc, 0x1b9f8ed7, 0xe9dc19a2, 0x478da979, 0x77cbe579, +- 0x86f7f105, 0x044e7678, 0xad1d393f, 0x38dfe3c4, 0xfbc79c1f, 0x6616f1c9, +- 0x32fa39ef, 0xb6d39e61, 0xbbff78f0, 0x8b1f1fad, 0x1967be81, 0x53c4e6fa, +- 0xea93bb7a, 0xc422fa0d, 0x09eb0c87, 0x7cf34fb1, 0xdcf3857f, 0x8099b774, +- 0xef866bfc, 0x589e2225, 0x7d97297c, 0x3d4f7297, 0x1f86afd4, 0x52a7d5f0, +- 0xf4c9243e, 0x563c3643, 0x1aa71676, 0x16f3c16d, 0xee4fcfd5, 0xfa8f860f, +- 0xbe38a7bb, 0xda4bc6d6, 0x0e8f014f, 0x737180e2, 0x3cc2f9de, 0x79c9d29b, +- 0xa1a3d18b, 0xbb2dcd72, 0xbb7ec3d7, 0xea06f07f, 0xbef4a7bd, 0x30a66d21, +- 0x13df7aed, 0xf681488f, 0x3d91bfb9, 0x778e7a7a, 0x62ff7575, 0xbbbfdd1a, +- 0x39c0764b, 0xd7ffdf76, 0x7f4023a3, 0xc039d2e9, 0x75f2a0ac, 0xd1f61683, +- 0x53b4f4cc, 0xcffc251a, 0x47694f7d, 0x46f1c33c, 0x33a40af5, 0xf14e0fc1, +- 0x6212e5b8, 0x159fba41, 0xea15bb1d, 0x6e4be5fe, 0x7ce63885, 0xa4ec38e2, +- 0xeeecfff0, 0x5e77e889, 0x2fc89c44, 0x1f7479e6, 0x05d3f306, 0x45f594eb, +- 0xfd3aca6d, 0x92efd222, 0x73bfd547, 0xf865707f, 0x78d1daf8, 0xd39d27a6, +- 0xcfdf6f87, 0x7cbdbfdb, 0x837881be, 0x7c8080f4, 0xd5dfc02d, 0x39021ef3, +- 0xd390125c, 0x5d373e42, 0x8f308a8c, 0xb73f7f09, 0xdffafc38, 0xe9a37ce6, +- 0x79e515a2, 0xfc04f8e8, 0xd8666a9d, 0xe9b5e04f, 0xc4f12a62, 0x3f42ea07, +- 0xc0cb8c0c, 0x2c002a76, 0xf804c69f, 0x0b03f080, 0x2240fe3a, 0xdfb454c6, +- 0xac7ae61e, 0x52fc00a5, 0xa7bc801f, 0x278f76f8, 0x12e9faaf, 0x3a97dde7, +- 0xa01d9b44, 0x283ef573, 0x07f59c3d, 0xe24fb9f1, 0xae7809cd, 0xf0619186, +- 0x73a7415d, 0x0715507e, 0xf72ffef2, 0xeb072657, 0x0e7efd63, 0xa897b33d, +- 0x2dc85524, 0xf36b92a2, 0x2b1ca83a, 0x0862bd40, 0xf68f8d30, 0xb93e474d, +- 0x80923890, 0x19f77b8e, 0xf81fd132, 0x5899e52d, 0x3ccf14cf, 0x1337d31d, +- 0xf0d70e50, 0x64e94fef, 0xe8c68dfa, 0xe2fea1d4, 0x124b7624, 0xee4c989a, +- 0xa5a2a152, 0x1d449bf5, 0x47d68788, 0x3048cdf3, 0x26ffae9e, 0xeef9925e, +- 0x06573814, 0xec0caef8, 0x65029bc8, 0x1d8748eb, 0x4b9231ca, 0xf0c1d6cb, +- 0x67348e3c, 0xd18d7f40, 0x89fd332f, 0xc60920ae, 0xbab1ef8b, 0x4cd7d799, +- 0x116730bd, 0xe3326efc, 0x75f3d7f9, 0x7ca0490c, 0x246df60c, 0xc1b7d846, +- 0xe31cfbe4, 0x54f4bc4b, 0xf52ed1d8, 0x03f41364, 0x02769344, 0xce9935df, +- 0x16b3607b, 0x1ea09162, 0xbbe0b965, 0x337f008f, 0x90c33479, 0x009f5dbf, +- 0xade96f7e, 0x28ffc0c5, 0xf3802d3f, 0xeb5db11f, 0xf05e7d43, 0x5f5f1b27, +- 0xa94fe72b, 0xfec24054, 0x7e9fce65, 0xfc8c5e6a, 0xf6b88129, 0x14da7f03, +- 0x53f9013b, 0x7ae37132, 0x156827e2, 0xa5d1267c, 0x6ad727ac, 0x23c87c55, +- 0xdd52fac1, 0xe48ddfca, 0xc907ca14, 0x1cb94ae7, 0x2e4a768f, 0x157423f8, +- 0x44f51cec, 0xb4fd78b1, 0x9aceb668, 0xbff31b04, 0xfdb8b145, 0x2101f4d5, +- 0x017ad5ff, 0xb5da5629, 0x413d368d, 0xb512553f, 0x7ea187a8, 0xf4c09350, +- 0xd03df783, 0x5f21f72e, 0x0bfdc13e, 0xaab82753, 0x77df14b4, 0x4ea391e6, +- 0x724b2e5a, 0xba5026d7, 0xb9a47e99, 0x6bd69ea1, 0x3ef922df, 0xb18e165a, +- 0xf8a76dd4, 0xecdb3b5d, 0x6beb4d58, 0x3dd48ccd, 0x97d40689, 0xda69c808, +- 0x829345be, 0xf02691fe, 0xb47e52c7, 0x4011e216, 0xda098317, 0x593f54d3, +- 0xb6e3a46b, 0xd658b7ac, 0xd58fc1db, 0x85fc0e37, 0x65888b7d, 0x3e73092b, +- 0x4773d12e, 0xd424fcf1, 0x4e255e29, 0x6df7e26f, 0xab0e7bf0, 0x3b05298f, +- 0xe9cbfd90, 0xfc0b0ca4, 0x4f2cb937, 0x5cb3a9a0, 0x39eb4897, 0x4fe81d63, +- 0x8c4f9c26, 0xe7e1df10, 0x5ce05470, 0xaf217b60, 0xb87cea0f, 0xcbe6092a, +- 0xaeee0e23, 0x58239c0b, 0x50fe85ac, 0xe0f1ccca, 0x09237c73, 0x2af983fc, +- 0xde23f303, 0x43b6f2c6, 0x76bc59b3, 0x1fb7d684, 0x5e28f9ce, 0xd332f216, +- 0x43be5525, 0xe8c8bfe9, 0x0edbb038, 0xb0c97520, 0x43cb52ef, 0x91fdf0ad, +- 0x81e277ae, 0x52368daf, 0xd6cb40fe, 0x92c38732, 0x80d6fb83, 0x2747a9ff, +- 0x0e3393e4, 0x11606b73, 0x9cd5fbf4, 0x96d6a696, 0xfb0c5edf, 0xec0992eb, +- 0x5c1ca22f, 0xc1359329, 0x8be787f2, 0x09fbfa88, 0x207fbfcc, 0x21379c61, +- 0x74f82e28, 0x7283d702, 0x8ff02e49, 0x2cfdf3a0, 0xf9775bd0, 0xbfce919b, +- 0xff9f9db2, 0x75c39c3b, 0x3e72efa8, 0x8badf820, 0x274cc5e7, 0xa7c01d4e, +- 0x01f28a2b, 0xbe563f5a, 0x34c0f90c, 0xdfdfc6e2, 0xa6f060ab, 0x7cc1d788, +- 0xf5282653, 0xca5c3b8d, 0xb55ab4fa, 0x9ebf423e, 0x74eef814, 0x46bdb2b7, +- 0x941397e8, 0xeface5fa, 0x9ca2b25f, 0xe1ba7e4d, 0x97f040f2, 0x8225d54f, +- 0xe793b0df, 0x184a74bb, 0xf9e26a1f, 0x921d4d2e, 0xa9a5df22, 0x8903de73, +- 0x8d2ef941, 0x77cb571d, 0x09c8fa61, 0xf83f779d, 0xa32c4fd5, 0x39dfa63b, +- 0x0e22f3c0, 0x51445e42, 0x73ccfe80, 0x52909f98, 0x33d1fa33, 0xd00e312c, +- 0x8a69d7ab, 0x2eb8afd0, 0xfff0acd6, 0xace55fae, 0x9fc27e82, 0xa65cf228, +- 0x3b734819, 0x641d53f3, 0x8fcc5cf9, 0xb4f6e5e4, 0x7e124137, 0xc7e835e1, +- 0xc4df9d52, 0x24f28278, 0xfa2e6671, 0x0b3b6b0b, 0x4b5fc18b, 0xb1fa12e5, +- 0x1c7609bd, 0x442eeb5f, 0xa62dd73f, 0x683f18e9, 0x5da2dcea, 0xcfd00a68, +- 0xc5dd055f, 0xbba01890, 0x4ed1ff7e, 0xdc8ffa03, 0xa06bebb2, 0xafbd7aaf, +- 0x12e92880, 0x77248f7f, 0xebbc7096, 0x17d35c2a, 0x1ef4b851, 0xfec03bd5, +- 0xe2058aa3, 0x563dc5eb, 0x1ada83e4, 0x4d7efc82, 0xd97e4139, 0x4ff985bb, +- 0xbd2eb33e, 0x9afef815, 0xaa72826a, 0xe10e36c7, 0x0f788cbf, 0xa5b8e93b, +- 0x053d299b, 0xb6bbfff1, 0xa4f5eb29, 0xfd78f91d, 0x44ba10f6, 0x56f824be, +- 0x3acbb103, 0x52ec6b88, 0x9883278e, 0x7870777c, 0x3abe7217, 0xadb18efc, +- 0xae1f6f10, 0x2c85fc61, 0xa0d7a474, 0xf2cb34fd, 0xbab01469, 0xe92ba5a7, +- 0x33e6bd47, 0x8cc73b32, 0xf9f0967f, 0x84bd7cd5, 0x6b3745eb, 0x1450a1a9, +- 0x7f6873d0, 0x74d41fac, 0xc09a29ca, 0x38f98b3a, 0xbe095fa1, 0x5e55f02a, +- 0xa5194846, 0x39139bb3, 0x3649b3be, 0x8fce9be0, 0x46412e74, 0xf7e70d8b, +- 0x8a343d80, 0x83d28f7f, 0xa3cae807, 0x7e817a31, 0x28cd4ad7, 0x47a08c4f, +- 0xe4bd72d3, 0xf2fafe46, 0xf40c8f52, 0x4f349231, 0xf80b35b9, 0xf00c576c, +- 0x15274a1f, 0xfa018989, 0xccbe2569, 0x8e82921d, 0xfadbbdb0, 0x123a5866, +- 0x1ef7dffc, 0x11260bd3, 0xefd1bfaa, 0xf4c4ff3a, 0x12d28397, 0xc7aa13a4, +- 0xe5fd041d, 0xafb30d4d, 0x406dd226, 0x128b2abf, 0x9453e3ff, 0x10f689f5, +- 0x013cc0fa, 0xbd3c3f67, 0xa4cf585a, 0xa73f655c, 0xc9445fe0, 0x25c8b2bf, +- 0x743f0766, 0xbfb05ef8, 0x5c925663, 0x8d520788, 0x4c3831cf, 0xf13ea5bc, +- 0xd7dbf73b, 0xdbf18627, 0x3db8eaf7, 0xc6b3a2a0, 0x6ce767c3, 0x147a0120, +- 0xd246e2e7, 0xf850a72c, 0xf163bf49, 0x0e811b91, 0x19945d29, 0x3be81e49, +- 0xc3f998a4, 0x7410f9c4, 0x1b6bca57, 0x240d9d04, 0x6ece8103, 0x7f4288ea, +- 0x6f408de8, 0xf90b7e94, 0x0b9e42bc, 0x2cb5bdbd, 0xa4b2be84, 0x39eb941c, +- 0xae424f40, 0x8f1c970f, 0x7a0597df, 0xf6f507bb, 0x436a7a20, 0x3d28927a, +- 0x4427bfa1, 0x55db2a5e, 0x7ef026f4, 0xe5a3eb9c, 0x85ed19a4, 0x4e4cd1a9, +- 0x3d99aafa, 0xd224d94f, 0x8c35ebdb, 0x1388aade, 0x289cade9, 0xa8d2a4e9, +- 0x91e9abac, 0xa4a3517e, 0x9bd23737, 0xd1234e9a, 0x37a040db, 0xafe32f21, +- 0x137b6f4e, 0xff33ff4d, 0xedbd285a, 0x76b92c4d, 0x6c7c137a, 0xd2a59447, +- 0xa97c7204, 0xf8617284, 0x50ad41d1, 0x8590da1f, 0xab0ee7fa, 0x37b600e3, +- 0x2ee2f6b3, 0x0ef90ca7, 0x7b782b39, 0xea12ab96, 0x3b692b4d, 0x38e4ba9d, +- 0x741887cb, 0x5c2f6b3f, 0x0cc07cdd, 0x1b0f2f7e, 0xb5f3f7bf, 0xf76d2c72, +- 0xcbe3e5ae, 0xdea12adb, 0xff8d8eb4, 0xc328e20c, 0xdbca8f20, 0xb75fbf0a, +- 0xccc1cb21, 0x8ef7a657, 0x21ddfbe1, 0xe3803ced, 0x25b8d8da, 0x04d18d87, +- 0xcfa66ced, 0x39f7ccde, 0x67db3366, 0x4cb747c2, 0xa7bf83b0, 0xd8fa83cf, +- 0x52fa9aa7, 0xec1173e4, 0x2da972d4, 0xc0f1ca03, 0xbbc064bf, 0xcd9c9d63, +- 0xe95b68e2, 0x644abe27, 0x7f110e7e, 0x75773882, 0x55f37e90, 0x8a13f322, +- 0x8236497e, 0xcc7912fa, 0x8888768c, 0x211ef98f, 0xd84f9c12, 0x148b8c23, +- 0xd39f1b2f, 0xf8c3fa8c, 0xe64e2281, 0xdfa7ced7, 0xc5fcbc2d, 0x987e70b8, +- 0xbd32247f, 0xdb8f0ce5, 0x7a97df8b, 0x077f3c59, 0xc01a4910, 0xd626f755, +- 0x2b0844ad, 0xbc03290f, 0x46cc7ab2, 0xa8ebc7e9, 0xd344bf91, 0x7080f5ac, +- 0xff3094cb, 0xf1177268, 0xae86c5c5, 0xf896bc7f, 0x087f2cf4, 0x55b8bfd7, +- 0x8443f98f, 0x383bb5f3, 0xc1e8c8fe, 0x72a7ce78, 0x7124a53c, 0x19387dbb, +- 0x0eea7c0e, 0x8d3bb78e, 0xa7263acd, 0xfe2a74db, 0x7a049191, 0xfa88a6cf, +- 0xc55db2b8, 0xeff2965f, 0xf87ae62e, 0xfe87d232, 0x1eb94fc2, 0xd313667e, +- 0xed22efc3, 0x7dec2fe8, 0x0d9de98c, 0x2f407b74, 0xbe4abccb, 0xb28cf750, +- 0xacaed0de, 0x0eb15237, 0xa87537f3, 0xf31e4ef8, 0x6a6ef6c3, 0xdbff0528, +- 0xa28f47d2, 0xe0a977df, 0x9f255e33, 0xc67ee421, 0x1eb91e67, 0x7b6a3ffd, +- 0xd4e9d85d, 0x0929be3e, 0x999690e3, 0xcc37a0f5, 0x0f796189, 0xf91f29b2, +- 0xf688d982, 0xa0be2472, 0x5e8483b6, 0x7f0fae42, 0x3204a85e, 0xe0823ec2, +- 0x5fef82ef, 0xb6525ec1, 0xec23f0ab, 0x3f1c1995, 0xe1fe2853, 0x76127f3b, +- 0x9f8632d2, 0x0875c4a9, 0x5ddef3f0, 0x6ec23f0c, 0x9276e6fa, 0x93b60e53, +- 0xad75bd84, 0xefda92f6, 0xcf5bce2e, 0xdacf6100, 0x026d9ed1, 0xddfe5340, +- 0x13c4f7b0, 0xefd02455, 0x68710b58, 0x72f54175, 0x66b57fa5, 0xc852e9d2, +- 0xae88cc9f, 0x46e017b8, 0xffd1133a, 0xec2c90d8, 0x34ff3627, 0xe175cf9e, +- 0xdb38accb, 0x29c4fc95, 0x836b86f3, 0x6d5ee3ec, 0x43d82c5f, 0xfc2497bd, +- 0x61add42e, 0xf18151e2, 0xe87c710b, 0xf7bebbf7, 0x4f73e067, 0xf13c60c4, +- 0x2ecc97c2, 0x2879b0bc, 0xe39f15e6, 0x87015771, 0x799f8725, 0x70e70fd5, +- 0x10e182e5, 0xbc93aebf, 0x6da6ed5f, 0x9fee8c23, 0xd3adf9c3, 0xbe8cf4f8, +- 0xec445c58, 0xd3dfb23b, 0xff4f7c83, 0x7dbf931a, 0x89e63452, 0x0487dfd2, +- 0x273687c7, 0xf081f8b3, 0xf93909c7, 0xe56f5e47, 0xa35a9ef7, 0x3f98fec4, +- 0xf3bc52e2, 0x1fff8029, 0x57e0fd61, 0xfc87477a, 0x10e6fc1c, 0x9952a4b7, +- 0xd742dba4, 0x6df9f105, 0xdf9f10d7, 0xc5e4c499, 0xb08b4a39, 0xe73645be, +- 0x33bdf08b, 0x86790e3c, 0xc4ceb1c7, 0xbed6b8b2, 0x7cacfefe, 0x2267979b, +- 0xbf45d1c4, 0xae8c5b8f, 0x3ede9435, 0x35ae216c, 0x1fd83e54, 0xde633431, +- 0xafb62ccf, 0xcc563dde, 0xfee31513, 0x0e7e5494, 0xd5acf1d6, 0x85ca1875, +- 0x347bca6d, 0xd41fb0bd, 0x7abed837, 0xbe2958a3, 0xeaa4a7f7, 0xdecf8073, +- 0x67c47ee9, 0xa8a47d7f, 0xdefe70bb, 0x5fc8fc9b, 0x345bf709, 0x2918f3f0, +- 0xf8b5760e, 0x3c8e3a97, 0x1e6f9c5b, 0xa6c59e47, 0x1c79b322, 0xac918e79, +- 0x73eda74d, 0xffd1933b, 0x33d634be, 0xf6471144, 0x78a37cc4, 0xdec7a0be, +- 0xec388101, 0x0e20df63, 0x3be9397b, 0x4e5ec38f, 0x5587130a, 0x025fe9c7, +- 0xc01741bd, 0x0616ddc3, 0xbeb92ab7, 0x17a0fc12, 0x8fcc1216, 0x8fd9242e, +- 0xec3d068c, 0x91788e88, 0xfa3d326f, 0x744b786a, 0xe15d8869, 0xf6268ebf, +- 0xbaa4fda0, 0x6a3a8a6d, 0x877941e6, 0x14d34be9, 0x673407e3, 0x5c0ffa2b, +- 0x3da2bd79, 0xa8a453cb, 0x51bbace7, 0x5b707fd1, 0xf43ea285, 0xfd145bd1, +- 0x28d6f3af, 0x7fe017ea, 0xc8c9af90, 0x66786ed7, 0x92fc6286, 0xf52c5e37, +- 0x7cb9b6c1, 0x8b72e56e, 0x795d9c78, 0x02fdcca5, 0x9f6fc8fb, 0xf89798af, +- 0x0a549f24, 0xeff64971, 0x87bb2c5c, 0xc58bb0b1, 0xdc758607, 0x684ef8a5, +- 0xa32ed25c, 0x9121d5de, 0xf8d0a4c7, 0x87ced2e4, 0x8ade42d7, 0xffa17f5a, +- 0xa0c5b572, 0x3e6344ef, 0xa99f5aa4, 0xa027364a, 0xd24691de, 0xe9ab5d18, +- 0x0f0fd4c2, 0x4851f7b8, 0xba323c86, 0x0a174158, 0xa1f851fc, 0x76c2eb7f, +- 0x2d35e633, 0xd2016379, 0x494521a3, 0x25765117, 0x2ae4c45d, 0x50ecc2e9, +- 0x995c41d2, 0xf0d40e92, 0x74953ab6, 0xbff4fc41, 0x7e3bc02b, 0xd46e9282, +- 0x7d222ef0, 0xd80f3187, 0xdf00392b, 0xeb2f786a, 0xbafb82d8, 0x3cb8be9a, +- 0x3917c799, 0x741f877c, 0x6e109ab6, 0xf8493f2c, 0xeedc0c03, 0xbf4a0926, +- 0x56abd098, 0x8dbd7325, 0xf2fc23cf, 0xda0f256b, 0xb871fdf1, 0x2fa65f32, +- 0x66f9ec0b, 0xae43fcc2, 0xc3139207, 0xf7f117fa, 0x0145fe48, 0xff5ca9d7, +- 0xff2c23ac, 0xf31478e6, 0xbd5c7d0b, 0x8b42fd0c, 0xd1ea3349, 0x73c66ae7, +- 0xfb07a1ff, 0x0219e1a9, 0x529d353f, 0xf904957d, 0x1aa2ef5f, 0x142726b2, +- 0xe4a7529e, 0x533dc333, 0x81e429d2, 0x5013dd9b, 0x84e857fa, 0x12bf3052, +- 0x5f98b0fa, 0x31f04fc0, 0xfc01af31, 0x540e7032, 0x2ae48d7c, 0xc7f6a2f1, +- 0x963031c0, 0xec5bc706, 0xa33e3824, 0xfc04c3f6, 0x84fed42f, 0xacc0e178, +- 0x3a07b856, 0x3f44e2dc, 0x9ae9095f, 0xff0bbf09, 0xae21fa0b, 0x887efd23, +- 0x2aea7288, 0x1e29ddf1, 0x5678ffc9, 0xc4575c68, 0x3e182989, 0x3c1d33fa, +- 0x800fb25a, 0x1decd475, 0x1474089a, 0x9c7497ea, 0x23ce857c, 0xa1e2fa6b, +- 0x2824155f, 0x5f7dc507, 0x9fb8fc97, 0x81f3893b, 0x8dddfbe0, 0x4cdc7da4, +- 0xf95307f4, 0xf3250b18, 0xb50e915b, 0x7f45adde, 0x04ee86b1, 0x048ebde8, +- 0x02b33bc5, 0x439758ed, 0x479ad7eb, 0xc2c53933, 0x3e5809f3, 0x4ffce128, +- 0xed9191d8, 0x16fae535, 0x49661698, 0xc105f7f4, 0x7586b8eb, 0xb8097c8a, +- 0x90710a27, 0xd7042981, 0xc76c95d3, 0x4fa21bdf, 0x6e84ebbd, 0xc1995dc5, +- 0x9e936e7a, 0xb760361a, 0x716064bf, 0xfea576cd, 0xf4c29d1c, 0xe070c8e0, +- 0xbb2a59f9, 0x8f7a6ae6, 0x4aeacfc8, 0xf7d628b6, 0x362b9c60, 0xc06f7e85, +- 0x92a7ff49, 0x4abe3026, 0xc43cc6ee, 0xde321d0b, 0x89bc6aa7, 0x3dc687f1, +- 0x9ea11e32, 0x17de034e, 0x0071da5e, 0x16eea5f5, 0x7ea880ca, 0x7e85b672, +- 0xe015f079, 0x246fdaaf, 0x31e4417b, 0x7ee1490d, 0x10520288, 0xf105079c, +- 0xf1b094fd, 0x27fcfeff, 0x93e73b65, 0x1c5e7255, 0xcfeda3dc, 0x65f6d16b, +- 0x47e104d6, 0xb8af8fbd, 0x73aa525d, 0x70a14f0d, 0x632ba0fb, 0x2557cc23, +- 0x034e1e77, 0x1c90acf8, 0x631b7f10, 0x0d1bf760, 0x734772f2, 0xf4379d90, +- 0x7105d95e, 0xee2bd3ce, 0x69fdc1b1, 0x4950ef31, 0xa8f0f783, 0x0ffef185, +- 0x36ee218b, 0xd69eb1cb, 0x9d981b66, 0x18bdf599, 0x5f3d0e5f, 0xfbb3d3bf, +- 0x66ecba5f, 0x67d057bc, 0x976fd195, 0x40b19320, 0xe2bd6217, 0x1df8a2de, +- 0xfe4353ee, 0x4c7df8a6, 0xbbf0df6b, 0xb14a6969, 0x187bde2b, 0xbc37d953, +- 0xbb8014d9, 0x4c6ad7c8, 0xfd05afd4, 0xeac8c7a8, 0x7a8b99c4, 0x3b230ae4, +- 0x3db8a75f, 0xb0b06a76, 0xe0e67da7, 0x28c6a83c, 0x93e61c67, 0xb01323bd, +- 0x38b4bf3b, 0x5fb8ace3, 0xc2c79b0b, 0xf9e1e9e6, 0xabde2bc3, 0xb12d7b40, +- 0x531e7c35, 0xbbd30a43, 0x8aca2feb, 0xad7aa63c, 0xea91f30f, 0xbf15ea2f, +- 0xe2e1487f, 0xf3ea0431, 0x071a0ccf, 0x1c405beb, 0x82ffa16b, 0x13c43175, +- 0x3c8897a4, 0x7c3d3566, 0x68dff1cd, 0x30ed12d5, 0xbaec0fbc, 0xfe57bf52, +- 0x5fbd8729, 0x468a48f3, 0x1e61a1e4, 0x3037b531, 0xf7eea79e, 0x7cea29ef, +- 0xe7de3f33, 0xdb37cfec, 0x77c57e53, 0x962f1a19, 0x1bc1f22b, 0xd71878e9, +- 0x2aac7178, 0x4bcf9c1f, 0x029bb3e7, 0xe0916679, 0x5b3275ff, 0x91e42357, +- 0xceff07c5, 0x9df029e8, 0xe6179e04, 0xf8f3858f, 0xf78c876c, 0xa23d9f9d, +- 0xcc35b099, 0x5c393bba, 0xe2d44fae, 0x47c1b939, 0x7cc25b9c, 0xf713f45f, +- 0x3c7dc419, 0x5576faf5, 0xfac0e7f8, 0x7e658c47, 0x2f3cf561, 0x758af870, +- 0x7c31b2ef, 0xf14abe34, 0x2c28f981, 0xcd97774f, 0x83f918bf, 0x4fe78945, +- 0x763ad992, 0xc4cfe2dd, 0xcc899cfc, 0x0f448eae, 0x7fdd58f7, 0x9a6e3d45, +- 0x48d57209, 0xb259b6a9, 0xabb79d04, 0xee0043d1, 0xa1af02b2, 0xbb63d770, +- 0x63f3f798, 0x7e7edcec, 0x61539d8c, 0xa8fe7c0f, 0xf401f98c, 0xa0a49b40, +- 0x09cffb3c, 0xde7c0b8b, 0x3ffea126, 0x4ac84ddf, 0x6de677ca, 0xe2fa63ab, +- 0x7531c353, 0x9fbf7e07, 0x547997f2, 0xcb4cddde, 0xf1546bf9, 0x08576e61, +- 0x8370bc39, 0x1b21deca, 0x3cc64bfe, 0x279466cf, 0x1cae7f8b, 0xa4db74bf, +- 0xea7be0cf, 0x4afa3638, 0x71fcfda9, 0x4bcbd70a, 0x83c82949, 0x42fa9fbb, +- 0x7c8f6b1f, 0x7e50ce1e, 0xf030683b, 0xdd96235d, 0x2f2c162d, 0x41bb38a6, +- 0xdd53e83e, 0x7bd7c0bd, 0xbaf061df, 0xc9817f50, 0x39bcb80b, 0x84b9f812, +- 0x9330cef2, 0x841f79c5, 0x2e14ec7b, 0xfb930306, 0x35fddc72, 0x5e957193, +- 0x7e118ba4, 0xca2b1ccb, 0xd00a4723, 0xe373c27f, 0x13fc0027, 0xc2718b9f, +- 0x7b97d6be, 0xc37f069f, 0xe8d155fa, 0x581a35ff, 0x7b67399c, 0xc0ec06b9, +- 0xfb4976eb, 0xd4d1dfc1, 0xde172ab9, 0xa3d93017, 0xae213f31, 0x93165e73, +- 0x093bec73, 0x801daead, 0x57b804cf, 0x3eb5d747, 0xf8c29bcb, 0x1a83d338, +- 0x257bcc39, 0x3dc07ffb, 0x321bcf6b, 0xa0bc83de, 0xd7fcf965, 0x915f8613, +- 0x0edf050f, 0x29baf7d6, 0x40d0c8dc, 0xc976fafd, 0x77c58ba7, 0x515e3024, +- 0x3497dabf, 0x6fd1e413, 0xe9ef18b4, 0x52efd75f, 0x23ae202b, 0xc94cd0e4, +- 0x5c47fcc2, 0xc44e9d9f, 0xaa17163f, 0x9d3274e5, 0x6333b1eb, 0x13e77c18, +- 0x9b8c2647, 0x1ab12461, 0x5666947a, 0xfee097b6, 0xd05674ea, 0x237c4407, +- 0xde111eb2, 0xb4f8d3ef, 0x94c7dd99, 0x24c086fa, 0x72a7c167, 0x3a37f385, +- 0xc69dc995, 0x4b8fcc21, 0xc4271106, 0x1d5f1ad3, 0x72ec05ba, 0xdb8b3443, +- 0x8464be52, 0x810e56f7, 0x5efba6bc, 0x7b144af6, 0xc7dc433f, 0xe10b38b6, +- 0x4d53637e, 0xb7de1146, 0xef87d93a, 0xfce8f420, 0x297e7899, 0x4ca891bf, +- 0xb6d373bc, 0xce94b55b, 0x3ea8d31b, 0x366beb46, 0x0b55bced, 0xfdb2e4f7, +- 0xfeb4358b, 0x58b7a6fc, 0x4ffef5fb, 0xa6f2fea1, 0xc8bdac13, 0xf5a658bf, +- 0x613e9b63, 0xa4d060ed, 0x4d97f211, 0xe87ab7dd, 0x5cad67fc, 0xf1f871df, +- 0xdee36a1e, 0x7f609aa1, 0x8ca99be2, 0x628d9d5f, 0x9166cefd, 0xef0035b9, +- 0x5ffdf0dc, 0x24f0d548, 0xc52c368d, 0x9278c57e, 0x22dc7e12, 0xbf196e3e, +- 0x86263a87, 0xf1628bac, 0xc52c4f29, 0xa1cec1c3, 0x989b5f18, 0xf370e36a, +- 0x62253be3, 0x314f011e, 0x5deef89f, 0xbe599720, 0x9e706d5a, 0x7f1cddfa, +- 0xf06b3bf4, 0xec9c833b, 0x464d66fe, 0xe28fe021, 0xa6f1cb4d, 0x7b89bc05, +- 0xb5af30df, 0x70fff900, 0xbc1f5bf0, 0x0567fb44, 0x93a6add6, 0xa7c65496, +- 0xb8b2b597, 0x07359f62, 0x0c4c69e9, 0x58a2f77f, 0x1c638fb9, 0x5aa66f0e, +- 0x01073df9, 0xbf0964af, 0x98e1cad3, 0x93521fe1, 0xfdf7cdff, 0x77cf5f30, +- 0x7c20efbd, 0x8afde139, 0x6dd71d83, 0xb1b1fb65, 0xcf4a54bc, 0x1ef3d436, +- 0x7677cc56, 0x197c6a95, 0x5fb0903d, 0x7f8e0e5b, 0x2077bf90, 0x7182f3de, +- 0x3f4c0559, 0xdc55bd05, 0x9b9e27d3, 0xb4ffb049, 0x3b7e3eff, 0xd81b37bb, +- 0x7cc5ade7, 0x4fbe169f, 0x57a7db0b, 0x78e4af41, 0x7354e65f, 0xc3f71d28, +- 0xbcbe7fbf, 0xe29f3e22, 0x0f9b879c, 0xbc2475ce, 0xf1aefc1c, 0x82a9d622, +- 0x559c3f67, 0x84f013eb, 0xf2e38df3, 0xd6297494, 0xf3a472f9, 0xbf2df59d, +- 0x35c6ce57, 0xf7e580fc, 0xae92bb12, 0x6965761b, 0xc62e7e20, 0x2ecf03e5, +- 0x3ebdf809, 0x6076e54b, 0x9088c906, 0x352e778f, 0x7f0cbfbc, 0xbd81db57, +- 0xacef9656, 0x26f407f6, 0x109cba3a, 0xeecf3a47, 0xf9528f6f, 0xb29e202f, +- 0x171814d3, 0xfaca2f90, 0xbf0634c8, 0x1f4bff50, 0x362d2fde, 0x7768bc54, +- 0x31eebb50, 0xbfc06dcd, 0xee2ae38b, 0x98f5a2c9, 0xc06ddd34, 0x2bd38bbf, +- 0xfca2c8be, 0x67a69cdc, 0xbe2a1bf5, 0x63fa86c8, 0x8c7fd67a, 0xf7e045f3, +- 0x6dbfa3c4, 0x8f406a6c, 0xb3b34d88, 0x1a9553fb, 0x5fabff7c, 0x019df97f, +- 0xd70117f5, 0x41b16548, 0x4e2e1cd3, 0xe8269c95, 0xca13c581, 0x90ed7fe0, +- 0x7cedc4f7, 0xe76156bf, 0xfbb2c6f7, 0xfefbbdb7, 0xb227f786, 0x6919dcd3, +- 0x314d5d74, 0x68b273dd, 0xfbcc757d, 0x9c92af18, 0x3f010f54, 0x6642dd87, +- 0xdd4af5d1, 0x2fa05deb, 0x461cbb91, 0xfb95c22d, 0x314de07d, 0x5e57bf0a, +- 0xe97dcdfd, 0x582e33ec, 0x07ce48c7, 0xfafd5e9a, 0x3673882b, 0xc039359d, +- 0x73b23e2d, 0x6fa03dd3, 0xf37cec8d, 0xd987266b, 0xeeb10f7d, 0xa3d7e091, +- 0x187597bf, 0x3b23fd70, 0xfd045baf, 0x33a1fd47, 0xa6e4e807, 0x6056be53, +- 0x5efbbd0b, 0x1fde574e, 0x798aecfd, 0x4de3118c, 0xe89f1e02, 0x1499e809, +- 0x7833371e, 0xab7cc25c, 0x6b63c49e, 0x2b97a8fd, 0xbd50d3ef, 0x17a6e31d, +- 0xfc03b448, 0xb35ee2f8, 0xb2785fda, 0xfe8fee9a, 0x5d1f537e, 0x3cde9041, +- 0x3291a2e6, 0x9cbd4092, 0x4af51558, 0x7fa2aa63, 0xd14b2595, 0x3ae53e3e, +- 0x7b44fb45, 0x293ea2a1, 0xffa2a477, 0x45728e6d, 0x89b2f6fd, 0xced5fe8a, +- 0xd0bd456a, 0x3fe8aed7, 0xb28748fc, 0x019138fd, 0x1d27450f, 0xf92ca007, +- 0xc76e89d8, 0x07cd33d2, 0x25f91ca0, 0x5fda8703, 0xf6c5e37a, 0xf0bbf003, +- 0xc7efaa97, 0x34e9ff08, 0x87d5e4d9, 0x68a693f7, 0xf25e7969, 0x35913f23, +- 0x2d8c7eec, 0xe02f7dd6, 0x198fdc4d, 0x8a52fe03, 0xe7b9aa84, 0x59f0bdd9, +- 0x12765fcc, 0x69fc0310, 0x7cfd19ba, 0xcfcd7527, 0xbdc599ff, 0xbbdf0007, +- 0xb156afa9, 0xdd1731ef, 0x93977d8a, 0x2d3c2a65, 0x2cabd457, 0x1ff4503f, +- 0xd14ab29f, 0x90fed13e, 0x2b0f4f0a, 0x3639b7ea, 0x45b4f0a9, 0x28dfa785, +- 0x70edfbda, 0x157abfee, 0x1cb44efc, 0x04aaefed, 0xa67cdc3c, 0xd651f10f, +- 0x780956d5, 0x3b64f1ba, 0xe7d8abe2, 0x597604aa, 0x00f9a47a, 0x7f6a3e94, +- 0x5ad7b8c1, 0xd83cb052, 0xd5ff4762, 0x2c5c96e1, 0xf038b48f, 0x94b7dff7, +- 0x8b56f961, 0x6cffcb13, 0x57658099, 0xf6cb0b8b, 0xbfec7696, 0xf983a5b3, +- 0xdffbe2bf, 0x7e001815, 0xbf8d1e81, 0x3c56ee11, 0xe434d8f7, 0xfed13d9f, +- 0x26afa81e, 0x9636de77, 0x81e78d32, 0xcc9d8089, 0xcee9a3cb, 0xbf94e9d1, +- 0xac1c85ed, 0x41fe4092, 0x0859c6bb, 0xb4e1f87a, 0x0ed13f05, 0x5581e420, +- 0x958b14ae, 0x8eb48dd5, 0x643186c8, 0x199c4fc1, 0x25105e74, 0x70584c18, +- 0xa37bd41b, 0xb4defb58, 0xf279b705, 0x637107fe, 0xe17e4867, 0x7130b4e1, +- 0xd8cfe7e3, 0x39cfe0cd, 0x19a86976, 0xfb8c71e0, 0x50a49cb5, 0xe5968f37, +- 0xc81d42da, 0xbd2a93d9, 0xe4539444, 0xde61b7f2, 0x0ee38d76, 0x45be6fcc, +- 0x6b7e8047, 0x8aef6624, 0x99d3db7e, 0x9b7bd0bd, 0xe3a9ed01, 0xbc22e71a, +- 0x3df52717, 0x49ee7001, 0xa9ca3efb, 0x265f735e, 0xed3bafc0, 0xd89eac7b, +- 0x08e484f7, 0x7c18ebaa, 0xf7bb4fde, 0xd9cf86bb, 0xf85092b4, 0x5859a6f4, +- 0x1ce7c0dc, 0xaf007a80, 0x3676af1f, 0xdcac9c60, 0x71f61839, 0xe76065cc, +- 0xfbc665d7, 0x2ceb4413, 0xbfc823b9, 0xc3ae9753, 0xa2e15371, 0x6739f81b, +- 0xd5ce78c8, 0x9d287cf0, 0x27481fd9, 0x8f4e6760, 0xb8e0bb41, 0x5737dd86, +- 0x9d267ff7, 0x1173d9c9, 0x0dfd83de, 0x94c57b87, 0xd377e786, 0x44577af9, +- 0xaebdd4e1, 0xf58fa8a1, 0x9f784b36, 0xf34cf7b7, 0x706ed679, 0xdc609070, +- 0x1ffc2672, 0xf3be7f6d, 0x91febf9e, 0x457f7ff6, 0x8865038c, 0xdf847ae5, +- 0x7679de0c, 0xa7f511bc, 0x2a0335d9, 0xe4ce2e40, 0x6639b071, 0xc386126d, +- 0x3c3d56b4, 0x54d0b89d, 0x904296b8, 0xd6a84e2c, 0x4b4553c3, 0x85af9633, +- 0x0f41aef2, 0x9f09e1eb, 0x6b1dbcfa, 0xa06d8d41, 0xf904b847, 0x0b68ff9f, +- 0x95dcd75d, 0x73d99db2, 0xeb3aae5c, 0x871e51be, 0x3ce3dfa0, 0x010286af, +- 0xd367d5ed, 0xfb7f8525, 0x61af0e59, 0xcc7f5ce9, 0x1eecf927, 0x609c7f51, +- 0xeefb9c38, 0x448747d9, 0xdb282388, 0x2ef8feb9, 0xfd56e77f, 0xeef883ee, +- 0xc7ef1c73, 0x413294f5, 0xe4c19c9f, 0x17ed4140, 0xfee84bab, 0x1a2d3a0b, +- 0x6dcfd38c, 0xb8780dd8, 0xa8f1c1d0, 0x9e701d23, 0xbde678a6, 0xaa4d398f, +- 0x9357a17b, 0x4b2e8e97, 0x2cbcb065, 0x832abbf6, 0x5f5965e5, 0x45c8255b, +- 0x2d7d1f21, 0x6e3f394b, 0xb07a3e46, 0x0fd62565, 0x3cb078b7, 0xf38eb2d2, +- 0x7f6c36e3, 0xce51e5ab, 0x1f9cbd8f, 0x77bf833f, 0xf962d4b6, 0xcb1b8b6a, +- 0x33dce307, 0x3e226e00, 0xc6e8d539, 0x9b43d1bc, 0x5fe2040c, 0x980d3a17, +- 0xc44f4097, 0x40278f13, 0xef018dde, 0x6ff3a9f5, 0x9fbe7cd4, 0xb7df421e, +- 0x189e9c58, 0xfa033794, 0xf4c8c0e2, 0xcdd88c74, 0xedfe97c0, 0x0f9057f1, +- 0xcddbb31d, 0xa4b74fa0, 0x38bca277, 0x759bb4e6, 0xbc79eeb4, 0xedbbb593, +- 0xafad0366, 0xdac7df4a, 0x1473763d, 0x7c7eafad, 0x12f76b1f, 0xf83f220c, +- 0xc7c86bf8, 0x107489ca, 0x31a547ce, 0x17152c6b, 0x1f975e54, 0x3e317384, +- 0x3858de65, 0x3d725f17, 0xd57da27d, 0xca4fa841, 0xab85a2dd, 0xe1534edf, +- 0x9157181a, 0x7185ad50, 0xaf963363, 0x06e37181, 0x1e0dac3d, 0xc76f2137, +- 0xeadfa81a, 0xfd05a2d8, 0xc7ce4bf4, 0x2ea23cc4, 0x169f05da, 0x3ac360f9, +- 0x0a0f285d, 0x0f285c3a, 0xa62a5c04, 0x7e003f56, 0xc90ea6c7, 0xa63ac122, +- 0x71c1fd4a, 0x846ba5c8, 0xbf2922f7, 0x8efe98de, 0xd71d1579, 0xb11bf504, +- 0xa65593fe, 0x6f7f94ef, 0xdf230f4d, 0x0ef3f04e, 0xbbf21ef2, 0x3bd9e84f, +- 0x5c035f1d, 0x9b9ef04a, 0x24b5df19, 0xe3fa336e, 0x3d833641, 0xb69e7204, +- 0x1965e70f, 0x6453fb97, 0xcef876e7, 0xc3f9918b, 0xabfcfccb, 0x68444dee, +- 0x4f61fce7, 0x4bd985ba, 0x06875dfc, 0xd07e86d2, 0xa997e5ab, 0xf9d5a1f3, +- 0x59ff2216, 0x4f515f9d, 0xa1307bd8, 0xdeecce79, 0xb39e486e, 0x19a2abb0, +- 0x5e05ad3f, 0x78f8e943, 0x0957cf3a, 0xabc9c385, 0x3864e1c0, 0x87ec8438, +- 0x2eef3178, 0x74c6ff24, 0xdeacf11c, 0xb2277117, 0x3f8936f7, 0x5d04feec, +- 0x8dafee84, 0xe0cb5fc1, 0xb3bbf54f, 0xb9aae780, 0xab7e0266, 0xc7f3fe60, +- 0x351ff02b, 0xf8aefb5f, 0x0db9b4e5, 0x5080fdec, 0x1c39763e, 0xc2f7131f, +- 0x53d0a5d5, 0xe41a3ee1, 0x343bc201, 0x4befe760, 0x80674776, 0xf7d1567e, +- 0xd0ec0695, 0xf37ef604, 0x9cdb9b22, 0xe922e141, 0xc8817e59, 0xf1a33dc3, +- 0xb6f416fc, 0xc9e6cdb4, 0xb0832fa8, 0x4ac767a0, 0x7e3fe0eb, 0x878aead6, +- 0xafd72471, 0x3a077e0f, 0x7a699e52, 0xa17f9306, 0x5fe45125, 0xfaf96ef6, +- 0x8a2fde9a, 0x792a8f04, 0x41ee1fb4, 0x418b285c, 0x112dd9f9, 0xdb3fbc1f, +- 0x7a849e5d, 0xbd00f74b, 0xdaefca16, 0x301eee2e, 0xdb57e704, 0x65a9ddc7, +- 0x71ddf646, 0xd0eca013, 0x079d1fbb, 0x0691e0fe, 0xcdbc938c, 0xc7270ff3, +- 0xb7c3fcb0, 0xc980fdf9, 0x004a5e1f, 0xf65938f9, 0xa1481525, 0x1bf77676, +- 0x05ec2ab3, 0xdd36f6a1, 0xefd858ef, 0x976eecd5, 0x6006cbb1, 0xf5dfdb55, +- 0x9022bf2b, 0xe56a3de7, 0xe3f90225, 0xbc7b73ff, 0xa4f5132b, 0x9533e4ab, +- 0x415b79f5, 0x897318ff, 0x228e39e5, 0x9525ce2c, 0x9bf2c9bd, 0xdbb6a978, +- 0xbda868e7, 0xa76a1d9e, 0xa5fd92cf, 0xd421ef50, 0xd809cf5e, 0x374ec2eb, +- 0x45bf9610, 0x3806f7ed, 0xddb9e717, 0x8f13314e, 0x7c3f2179, 0xc87dce6f, +- 0x9f30a217, 0x8f8ef9e3, 0x7fad6112, 0xc5fc4ae9, 0xbd00f62b, 0x22be5937, +- 0xf5fa79c1, 0xc120bf2b, 0x7375bcef, 0x8e9b773f, 0xffaa43dd, 0x8a728ca7, +- 0x8075b5ca, 0x9af27aa7, 0x7920eefe, 0xabffda4b, 0x28c3de1f, 0x3586abff, +- 0xb4f5bc81, 0x7ed2764c, 0x223edcd5, 0xac76f91e, 0x32927b73, 0x289ed646, +- 0xeacbbffa, 0x13ff4403, 0xbbf49d93, 0x9da2a9d5, 0xd78ebf8f, 0x6c76ee89, +- 0x0df312cf, 0x6b337565, 0x72f8cb6f, 0x8231e832, 0xe0cc6fbf, 0x47bf91f2, +- 0x63fdf944, 0xcc578919, 0x73b651bf, 0x1fde2079, 0xc4e1faaa, 0x6e70a398, +- 0xb5cc25db, 0x875fbfab, 0xb673fbfe, 0xf7e082f6, 0x8e9e454a, 0x798cd2ab, +- 0x0d2f0d53, 0x22740add, 0x81278f9b, 0xe3c5d2de, 0x09b255f1, 0x36172ee3, +- 0x491ebe30, 0xf2bc5bef, 0x42be0515, 0xc0fbf9da, 0xdfa49818, 0x6493ff3b, +- 0xa0f33ef6, 0xe80bcc2e, 0xde0c7ce0, 0xc37b847b, 0x212bff22, 0x5ec13887, +- 0x8a39784e, 0x71f953bd, 0xc5dbf217, 0x767f332f, 0x2803a6c3, 0x76cbe6df, +- 0xc89d27f4, 0xf00abf76, 0x0d7731e9, 0xcaf838c1, 0x3f5d7157, 0xdc785bb2, +- 0x182f2fab, 0xe143879e, 0xc0abfbff, 0x4afff7ff, 0xfc82eff8, 0xbb73e032, +- 0x4dbed0a3, 0x0ef5fad6, 0x649e6b88, 0xe79e5cef, 0xfaed2b70, 0xf815df10, +- 0xd3b30667, 0xdc583ae2, 0x8965e446, 0xc333feef, 0x1e74eccc, 0x79a8691f, +- 0x47c4346b, 0xc4c6fe04, 0x77f07690, 0x38383c53, 0x07801c1e, 0x9c40ef01, +- 0x0acb8e84, 0xb0aed79e, 0x23dc050f, 0x7d35639d, 0xe3ab7588, 0x0e997706, +- 0xef7e0096, 0x847986fa, 0xb0b4cfdf, 0xcc7eb4f9, 0xf011fc13, 0x1e00c4ca, +- 0xef940375, 0x46bc5180, 0x22b9280d, 0xffed95de, 0xc35778cb, 0xf3d65d4d, +- 0xf7fa9838, 0xff3403a1, 0xbffc70ab, 0xdd9d5fe6, 0x3ed15fbc, 0xd71be577, +- 0x7e157fe4, 0x1f957fd1, 0xf5ff9236, 0x16ee992f, 0x2fc9bba0, 0xfc40d12e, +- 0xffbdf6e6, 0x8b013bc8, 0x5e303bf7, 0xcbdf0f74, 0xf6ffa317, 0x9e947dfe, +- 0x7e6668be, 0x3ffb53a9, 0x43f3d9d7, 0x45f663e9, 0xe8833899, 0x77caf66a, +- 0x669f2074, 0x5c22cd53, 0xa70d6a7c, 0xa127cc27, 0x48d6a07c, 0xfcf40974, +- 0xf7b2d6d7, 0x10216ba5, 0xe7d2c363, 0xb593eda6, 0xc7ef07c4, 0x3eb49b56, +- 0x9487c603, 0xfc0d61f7, 0x686a597d, 0xcac5ee2a, 0x9ef3194e, 0x716328ee, +- 0x76a619a5, 0xfd38dfbc, 0xf7f3eac8, 0xe35dd9c1, 0xba796129, 0x9fd27ee2, +- 0x5e24df34, 0x37e406b4, 0x1e259ff8, 0xc3ae5c87, 0x5c7aa438, 0xfe7600ed, +- 0xcb12cb26, 0xf2c3d837, 0xa479c4d7, 0x28623bfb, 0xf0f37962, 0xb3756ace, +- 0x00b437ce, 0xa8fd8ff4, 0xad95347f, 0x353c002a, 0x303e958d, 0xc0f40414, +- 0xa25f95a6, 0xc7e6a37e, 0xfd5af2ea, 0x1cb7ef50, 0xfa117a41, 0x1f16a9e2, +- 0xa97ed5d6, 0x8c7e6359, 0x5f919c71, 0xd470bd32, 0x1189e725, 0x6f6f6ff6, +- 0xd84b3b09, 0x4e3b6a5d, 0x5ef10bf0, 0x0b00fb5c, 0x77c6bb93, 0x5a8ffbd8, +- 0x4034be56, 0x5f057729, 0xef767ca5, 0x4a5fe400, 0x87c41bfe, 0xc55ffdb1, +- 0xdf740387, 0x4dff00ec, 0x6f7b066d, 0xf5f74d5d, 0xaa7e4c29, 0x94ae5de9, +- 0xd3519f51, 0x3bf3a0bb, 0x7fd05b9d, 0xd2c60b37, 0x926acc75, 0xc9d59ef0, +- 0xd7bc1e97, 0xddd09748, 0xe29d33fe, 0x486fbc3d, 0xe072a1f7, 0xbe23b463, +- 0x5d201cb5, 0x33feecd1, 0xa84f47c3, 0xc0a0bd1c, 0xbd1ca84f, 0x5fc4aff0, +- 0xf9cffd98, 0xf0907276, 0xc8bb7f3c, 0x6b239ff3, 0x26dcf7d8, 0x790a0796, +- 0x765ebd68, 0x56696c2f, 0x4d7fbe1b, 0xe058b20d, 0xc9f6cb23, 0x778b3d64, +- 0xde835368, 0xbe26ea2b, 0xe0494777, 0x9bf9624f, 0xf7b3464b, 0x9a79d43e, +- 0x91b3ff22, 0xb4cbbb8f, 0x54788f4b, 0xe62443bd, 0xd443bf51, 0x67fc7a38, +- 0xf7e7ff18, 0x0fefd58b, 0xf9e4ca0d, 0x88a4459f, 0xccafc7c5, 0x5e407aa7, +- 0x7b8df906, 0xbda0b52e, 0xf4399793, 0x01193c3f, 0x8665177c, 0x99a5d7e8, +- 0x94b3d657, 0xfa62ffed, 0xf0dbcd90, 0x4a6f913d, 0xe72c861f, 0x38b75824, +- 0xf9e7fd27, 0x679e0315, 0xef713ef1, 0xbdf1e7f2, 0x09afde8f, 0xe6ae87c6, +- 0xcdd3199f, 0xf4dd03ae, 0x4cd5b7b1, 0x94ea3ef1, 0x2304fd07, 0xdef1bb8f, +- 0x9cb788dc, 0x0a4c8190, 0x5864ba0f, 0x841bd0b7, 0x0be0111e, 0xcf0b7efc, +- 0xfe56b8f7, 0xdc4bfff1, 0xe9b3dc43, 0x4e4af9d1, 0x13defc80, 0xef1df615, +- 0x2b9a99d5, 0x60f9ffbe, 0xe0357b9c, 0xbfe70a69, 0x2ad01de2, 0x7bdbbd99, +- 0x3f464ba1, 0xfd1f8ac5, 0xdb8fb7e1, 0xeb57e743, 0x2f964d67, 0xd247ae50, +- 0x2c349bd7, 0xd2a8beaf, 0x605af98e, 0x42df80ff, 0xfdd431f8, 0x7e2bd90f, +- 0xf776899e, 0xac272ee8, 0x9eb651e7, 0x5a6af848, 0xbf0a5ff9, 0x37efa449, +- 0xccb12bed, 0x7f1f3a0f, 0xfd0494cc, 0x06353e5b, 0x74ad7df0, 0x0ecd7ff1, +- 0x8f132c98, 0xbe70e544, 0x257a65e4, 0x2ce5fa61, 0x1ce585d2, 0x9ba587d2, +- 0xf9eabcb0, 0x42e581c4, 0x65d3cf7e, 0x0991bf77, 0x1f5d55fe, 0xfe7b53be, +- 0xe1e7bfa5, 0x8f37503b, 0xa95c836a, 0xad9fcaef, 0x0b7aafd6, 0x0d38fefb, +- 0xbfeec7f8, 0x0f51da67, 0xb377b6b8, 0xd3ce71bd, 0xddfc6199, 0xb32e59ff, +- 0xee97157b, 0x5a4def65, 0x363218d8, 0x2574fb11, 0x09f9e167, 0x2de4cdf0, +- 0x5c426f82, 0x0d03ff2b, 0x932fcb8b, 0x7505eff0, 0xc47835f8, 0x796517f2, +- 0x62efa865, 0x560df9ed, 0x717904af, 0xfb58a323, 0x5dfe2b72, 0x8fc4d9cf, +- 0x3c2e72e7, 0x3dc32b65, 0x0b963b09, 0x54d4fbf8, 0xe896cee3, 0x469d45f8, +- 0xfc4dcf96, 0x05bf6083, 0xb1849f60, 0xf206cb77, 0xe3367438, 0x542ac3f7, +- 0x0fce05fe, 0x3315ec1a, 0xe172d206, 0x48192740, 0xad987ee9, 0x20cffd6b, +- 0x86b7606f, 0xcfafbdc0, 0xe300fe46, 0x2fdc622b, 0xe83a15ec, 0xf2c482f7, +- 0x0cfb3d8e, 0xa4d4bde2, 0xcbbd3f60, 0xfd03195e, 0xa8b6146c, 0x2b80451f, +- 0x572abdfc, 0xe44c7b18, 0x1d030db1, 0x0485fd11, 0x417a25df, 0x819cf562, +- 0x4d7dbe3f, 0x3d30fa1e, 0xc2fe87a0, 0x7d80ceee, 0x6213d30c, 0x92fff582, +- 0xcd21afdf, 0x5f0f1099, 0x034184f2, 0x547bc67a, 0x833dc31c, 0x167b533f, +- 0x2ed4d3ca, 0xd42ff285, 0x03f2852e, 0xf942976a, 0xa14bb511, 0x10b1745c, +- 0xbe2224de, 0xd862ce81, 0xa83b888f, 0x903f9bd7, 0xbb06cdc9, 0x1d62867b, +- 0x8eb8f4fb, 0x3f5dac17, 0xc75d19fd, 0x6907bb0b, 0x244bbee0, 0xfbeef478, +- 0xfe95e65b, 0x7f888d3e, 0xf107dba8, 0xd2ec17ef, 0xe82fdca2, 0x0e2ec7f0, +- 0x503157ea, 0x77f3e38f, 0xf30b1c7f, 0xe1fa58f7, 0x56e894ea, 0xbd586b27, +- 0x845e57e2, 0x39dd836b, 0xcf4bf603, 0x4fd838f7, 0x7e1fc741, 0xe83af70a, +- 0xeda718fc, 0x8236fa95, 0x87dea67e, 0x5f62df7a, 0x61ebff74, 0xb3bb0bfc, +- 0xdf942761, 0xf65e7610, 0x437977b1, 0xf70abbf7, 0xafa1bb73, 0xdc2bee18, +- 0x9b0e597e, 0x2f60da27, 0xc57f7847, 0x38fed0f5, 0x812ba71c, 0xae7b6faf, +- 0xf111f3d5, 0x50f001ee, 0x4ba3c83b, 0x560fa0b1, 0xc76678f3, 0xe36f41ae, +- 0x322397fd, 0x385fbf81, 0x773ca6cc, 0x1278e13f, 0xbd3efe65, 0xc2f5f00b, +- 0xc1074fbe, 0x3f14a07b, 0xc9efe083, 0x60e068fe, 0xfe7dfe45, 0x031fafc8, +- 0xf1fda1fa, 0x274e15ef, 0x6e20aa5b, 0xffb8d33f, 0xb6696c10, 0x882a83e5, +- 0x914dcfdb, 0xcf39430e, 0xe20e359e, 0x79df22f5, 0x61f96e41, 0x3ab74a38, +- 0x2b8f51aa, 0x2412e607, 0x318d2a17, 0x216051fc, 0xf515e287, 0x8ae929f1, +- 0x39ed13fe, 0xb949f68a, 0xfbda2837, 0x8638a1ef, 0x06cf7e07, 0x4365f478, +- 0x83ee8d1c, 0xa7b57dfd, 0xca77cc64, 0x96fc7ddf, 0xf27d681b, 0x7be077d3, +- 0xf6f02f6f, 0xf12b3bc9, 0x52f59bef, 0x22a9ea78, 0xa1eca675, 0xc9833f8d, +- 0xfd42f654, 0xc30f27be, 0xd8dfd0bb, 0x2760885e, 0x97a611d4, 0xd417b246, +- 0x9be50276, 0x39be053f, 0x16a9a5ec, 0x617f0fc8, 0x2069d7e4, 0xe40fb697, +- 0xfb7066ef, 0xf4fd1221, 0xfec9139f, 0x29fdf076, 0xbf88fd35, 0xc9ca2d6f, +- 0xa13dd8c7, 0x3ed7ca6f, 0x7686be01, 0xafdb87b9, 0xcff954bc, 0x6f1de986, +- 0x9efe03df, 0x94dc32a3, 0xb5bfbfe8, 0x0e5ffe18, 0xb8593dd0, 0x04d481e5, +- 0xfa03ddfc, 0xa7f72370, 0xeb90367d, 0x1ffbf553, 0xb40e2d48, 0x281f1593, +- 0xa5fb93fa, 0x9afa8ab5, 0x437d652c, 0xf1e0daf9, 0xc5b1f491, 0xbbd3ce8f, +- 0x9f9ee1f3, 0x3aeff614, 0x8127aff6, 0x4b7d87f3, 0xba7edf90, 0xbdfe197f, +- 0x46ff7559, 0x01f81f3a, 0xb3904717, 0x974d4f82, 0xeac23bd9, 0xef8abff6, +- 0xefdbbe39, 0x8f6147bd, 0x332f5e79, 0x9c5efbf9, 0x13a0af5b, 0xf9eefb3b, +- 0xe8ff0f4d, 0xed2b882b, 0x79d57661, 0x051f932b, 0xc0d33ebb, 0x161e8bdf, +- 0xc0abe8cd, 0x3dc0d7e2, 0x7e06ff9a, 0x00334c2b, 0x0000334c, 0x00088b1f, +- 0x00000000, 0x18adff00, 0xf514707b, 0x7bdbdbf9, 0x79724b92, 0x71211240, +- 0xc220572f, 0x4849ac91, 0x92ea4903, 0xf03ea410, 0xa2a21900, 0x799e0fae, +- 0x2a93a84a, 0x028d361d, 0xd6d36d52, 0x4f4e2a2a, 0xd1954a2c, 0x2562bc34, +- 0x40569478, 0x2f2a7b1d, 0x419cca69, 0xee421923, 0x8cc38a8c, 0xbf7dfa1d, +- 0x5eddcddd, 0xc9a75502, 0xf6fbbf1f, 0xcfdef8f7, 0x05048af0, 0x571a0192, +- 0x02a62a26, 0xc8dc8280, 0x00b5fb71, 0xbb4c6176, 0x94e00b3d, 0x157004c9, +- 0xa5029fd0, 0x30276100, 0xf0efdd38, 0xbdbf423d, 0x225f1c91, 0x9e5eef7e, +- 0x77dc2323, 0x4055a560, 0x5dfd12f8, 0x361b5d17, 0x709563df, 0xd480197f, +- 0x0fb91ce1, 0x1d300ad0, 0xe7f015df, 0x32a3a458, 0xe784db92, 0xf716faee, +- 0x2412fc55, 0x828f9d20, 0x76048f4e, 0x15798f80, 0x0624279e, 0x8df3c49f, +- 0x22b07847, 0x3810033f, 0x8ec7077e, 0x004ab339, 0x814fd396, 0x815877be, +- 0xc005bf67, 0xefb42bef, 0xdf97cbcb, 0x6f084904, 0xf286f4b1, 0x4970fbd8, +- 0x90e30343, 0xaadced7e, 0x9d5bb7bf, 0x78c9feb4, 0xff1e01ae, 0xb5fbc782, +- 0xd7ef6410, 0x7b7dc0ed, 0xf5f97ecc, 0x0dfbd39f, 0x0af78cbb, 0xbef4c485, +- 0x0a03f4a9, 0xb3ecf12f, 0xb6adf089, 0xf9aaf8ab, 0xb1bc3f6f, 0x837af918, +- 0x69f86d17, 0x64c4df68, 0xd98fe2f0, 0x91aca428, 0x8cdc6c72, 0xe145a48f, +- 0x5cfc7dc1, 0x47379d3f, 0x1b4fe672, 0x44906f29, 0xb561c913, 0xbab7c54b, +- 0x80059be2, 0x9b7756f8, 0xe02bb801, 0x1083c8d9, 0xdba0a783, 0xa33bf3e6, +- 0x2a5d87f4, 0x5fdd058f, 0xaaf2cea7, 0x01d12b6b, 0x405e2aed, 0xa67a41bb, +- 0x47496071, 0x139f307c, 0xac72e1b7, 0xe492a33b, 0x80838c74, 0xb89ec850, +- 0x2df48ed5, 0xefa39f54, 0x1fc5484e, 0xc2667999, 0xcbd340b3, 0x2f77d2c2, +- 0x516f7872, 0x4889a2f7, 0x75df1c01, 0x1cd431ef, 0x0c3c152c, 0x2c5062df, +- 0x296397a4, 0xa466ecbe, 0xddcf1e73, 0x1c12f3ed, 0xff10e019, 0xae048ab1, +- 0x3fef638d, 0x7cebef42, 0xb2f8b31d, 0xb35f189b, 0x37a87d5d, 0x5fc29a4e, +- 0x8f29184a, 0xd0cd5ca8, 0x5797eba7, 0x59ec86dd, 0xd7e6afdf, 0x1d31bace, +- 0x5c04b8f5, 0x16fba436, 0x610c0d1e, 0xdfe6cb78, 0xe03126e6, 0x5f2819ef, +- 0xf44a982e, 0x2d0584fa, 0x68cfde02, 0xd39835f9, 0x5667e462, 0x8fd74efd, +- 0xf491cf2e, 0xf9abf8a8, 0x7c84a0f2, 0x98e76d0e, 0xaa88351d, 0x9f94369d, +- 0xc462c3fb, 0x45e410df, 0xefa9e90e, 0xe492703a, 0x03aeb1d8, 0xce8016cc, +- 0xad6c5d75, 0x7c033bb7, 0xd98fe33e, 0x838d09af, 0xc1a55bf8, 0x74775f8c, +- 0x1c7fca3f, 0x3032cbbc, 0xf802e70c, 0x13bf7d93, 0xbf359f90, 0x62d8f2f8, +- 0x794376a2, 0xb207f30a, 0xf4a3abb9, 0x9c015817, 0x5b647f48, 0xc32b7f82, +- 0xa27eaa23, 0xfeff6dd9, 0x719a2749, 0x0b1dffbf, 0x1583db33, 0x1cfe0f4f, +- 0x12db35e1, 0x53fb9c98, 0xfda2c941, 0x0afd93ad, 0x8a6e581e, 0xdc9334f4, +- 0x6dc5133b, 0xf3f9ffb8, 0x81dd5f93, 0x2757caf0, 0xf926448a, 0xdf845091, +- 0xefa011b3, 0x3dd8b33b, 0xcbbc5590, 0x5fe4ff34, 0x729bf69e, 0x4d397fda, +- 0xfeba3c24, 0x90ef3ece, 0x35f5e500, 0x685df204, 0xa538e782, 0xd70f84cf, +- 0xe69c769a, 0x36ad3ed0, 0x75e92779, 0x397fb3d5, 0x54fc865e, 0xd3f37cbd, +- 0x95be9033, 0x7a058d1f, 0x11d7aa27, 0xe42920f1, 0x51e038a5, 0x9f2680e3, +- 0xff0eedda, 0xa57131a7, 0x00c523be, 0xf9657637, 0x47898d3f, 0x18caa0b5, +- 0x1f98e7ee, 0x35fe69d5, 0x20df978d, 0x4843d47d, 0xb110938d, 0xf2155d92, +- 0x2171449c, 0xc98d84f2, 0x3ecede3f, 0x2ecc4c10, 0x53204ceb, 0x034c2f7c, +- 0xaff9267b, 0xfc2fcaac, 0x9bade4c4, 0x42fd3650, 0x93ffeeaa, 0xb58b4c16, +- 0x37869ecf, 0xdb373ec9, 0x380e7d98, 0x3c67f980, 0x290b7f9e, 0xfb32fcec, +- 0x861fcc57, 0x45cb4bf3, 0xc0c51730, 0xee28905e, 0x4509b615, 0xacdae00f, +- 0x964a65e9, 0xadfc442f, 0x9eedf8ea, 0xb73c98f7, 0xf08a783c, 0xfd32761e, +- 0xdcaa7bc1, 0xc4d41cc3, 0xf665a9e6, 0x7bff342f, 0x7dcfe0c1, 0x97c89ccf, +- 0xddbefdf1, 0xed01f353, 0xd83e5ef9, 0x67ca1cf7, 0xfa783130, 0x0f3b5c61, +- 0xf28e387f, 0x75bd3c62, 0xe01a5f2d, 0x478d4e01, 0x7e07c475, 0xbbeb913f, +- 0xe181f640, 0xde87c584, 0xfc98d34d, 0x326f79aa, 0x6fdc3fe9, 0x4e9e2fa4, +- 0x3e9d7dfd, 0x9cfd7dfd, 0xebeaadd9, 0x9f9835bc, 0xcc9fdf8a, 0xefac1811, +- 0xe60a4f9f, 0xbbe938a7, 0x8a973d4b, 0xd5bd8c70, 0x6fd44fd0, 0x37e31d8d, +- 0xc35357d2, 0xbec06d89, 0x713f142b, 0x5fb8c80d, 0x26a6f997, 0xd1d9f037, +- 0x766916ce, 0x6669e906, 0x82b73bca, 0xb48bd76a, 0x743b7df8, 0xe5fd0058, +- 0x67f5a9a4, 0x3a075c76, 0x63916f7e, 0xca72afe3, 0xf7ea6974, 0x254abf8f, +- 0x3f1c51e4, 0x3ab272ef, 0x339ba267, 0x90d973b3, 0x5f70e74d, 0x281da00c, +- 0x0db1369d, 0xdf7991e9, 0x57bc6e35, 0x93e40d67, 0x64f7e81f, 0x07df665e, +- 0x9196f7b8, 0xc81cc1be, 0x8a4ff567, 0x3bac3815, 0xa0c563c2, 0xbe50f284, +- 0xe2571606, 0x02d865e3, 0x47489d35, 0xfdd77d05, 0xb8a4ed11, 0xe9d4d4ca, +- 0xc65e251c, 0xbd3407c1, 0x9a99a715, 0x8ff1463a, 0xe91f68db, 0x5e0e836b, +- 0x7f355ff5, 0xc6726996, 0xd6c7cf84, 0x5c5a0d33, 0x15d9270f, 0xdb2fe91e, +- 0xb8407a87, 0x40381ccc, 0xb43d7a2b, 0x42673ea0, 0xcbaf7d40, 0x6729bf18, +- 0x78f9612c, 0x33238b2a, 0xe7aef535, 0x68f4809a, 0xeb857ca7, 0xd3c82e26, +- 0xb08813fa, 0x99970255, 0x5b3b1456, 0xad8f8367, 0xad89a073, 0xad9da173, +- 0x5b074037, 0x5b20826f, 0x0da04a61, 0xeb5ffc58, 0x0c3cc3ea, 0xa26e5d3f, +- 0x18bc5c7c, 0x87f3469a, 0x2ebc9ab5, 0xea8c0f2f, 0x1e5c3f25, 0x64ce4073, +- 0x2e4e5d74, 0x9d98f213, 0x91b172eb, 0x073de23d, 0xad6933f8, 0x877b1080, +- 0x99de925c, 0xe0998205, 0x5c18902a, 0x51e51dfd, 0xb2cd921a, 0x54b91477, +- 0x8f276e8d, 0x9171726a, 0xea8d8f0d, 0x605baf6b, 0xcc37aeb0, 0xff1499d0, +- 0x7213ea47, 0x84e2ce88, 0x0c052fca, 0x21f77e11, 0x6be3199f, 0xb3655171, +- 0xf74ee107, 0xe3199f49, 0x65597168, 0x6ac44591, 0xdf63f5b3, 0x4765846c, +- 0x1fa03e52, 0x3bc831d9, 0x87bc3e50, 0xfa54d287, 0x7ca7e39e, 0x101fe369, +- 0x07654fc9, 0xadd59040, 0x17e45568, 0xaeef357e, 0xba7aa971, 0x4b3f26d9, +- 0x0f6f587e, 0xc3c80924, 0x0cead69a, 0xac1b87ca, 0x8c9fbbea, 0x89bea615, +- 0x1e21b172, 0x2f94617b, 0x081c57dc, 0xb9a13887, 0x47a51dc5, 0xf01dffc7, +- 0x784af9fe, 0xafca650f, 0x09bf29b9, 0xc61beb22, 0xb3bb796b, 0x97c44cb3, +- 0xa3170e90, 0xa9389423, 0x26dc85b9, 0xde97b7cb, 0xf6aa270b, 0x7b6c97b6, +- 0x75ed747a, 0xd3ddbb4b, 0xb70f7e47, 0x8027b37e, 0x433f86ef, 0x5def78c4, +- 0xce8fbcb7, 0x39429a35, 0x5f97a845, 0x92b69c26, 0xcaf6e83d, 0x209692a1, +- 0xf8126ddf, 0xca0fccad, 0x9675c35d, 0xe1ef6a27, 0xca1ef8a5, 0xabe7d8a3, +- 0x4a0fb2c2, 0xd20e9a6a, 0x57b72a5a, 0x39e10ee1, 0xf236f442, 0xffa46591, +- 0xac8f94c1, 0x9c7f319f, 0x169ddaa0, 0x1ff7baa7, 0x0abc7879, 0xdfc620fa, +- 0xbc5ff71a, 0x8f8c2ff0, 0x914e438d, 0x7bed978e, 0x7dea99a6, 0xcab0cfdd, +- 0xdd11c433, 0xd97666ef, 0x773b3c02, 0x5f3a52cd, 0x878f51f1, 0x3d75efe2, +- 0x832a36a1, 0xc627ddc3, 0xd7aff6ab, 0x3f70dfe9, 0x6e7c4f24, 0xa6487b47, +- 0xa7ca8b3c, 0xef37683e, 0xab7f21b7, 0x60d07ea9, 0xf6abf185, 0x58ff7a95, +- 0x561fe47f, 0x19f03bea, 0xa95df885, 0xcb62bfd1, 0x5d91377d, 0xfb1bf4ad, +- 0x6cafbd41, 0xf6d5ced4, 0x1f13d7f8, 0xe78ddbb5, 0xccafa91a, 0xeb0cfaa7, +- 0x75d50f31, 0xaa5bfb71, 0xd8d95f58, 0x1ffefc65, 0x2495f637, 0x81bf2d60, +- 0xd72e4756, 0x4e7f10ce, 0xfd59e7d6, 0xf56de436, 0x8ba2cdf3, 0xc8a76ce0, +- 0xf5d1ebe2, 0xb61e7b10, 0xd15b31a4, 0x46e575fd, 0xc3c7d58e, 0x364bdffd, +- 0x7828e889, 0xbdd58329, 0x7ab3af58, 0xd9881d03, 0x86ca016b, 0x3d7bfb43, +- 0x426b9225, 0xe777af3c, 0xff4f5489, 0x67049d75, 0xf4fa512c, 0xdf9abe7a, +- 0x3ea56551, 0x93ec7ee9, 0xef210ec8, 0x37bc72e9, 0xfc05b0fd, 0xaa043fb8, +- 0x9ace863e, 0xf33e5d58, 0xe49e4ec8, 0xfd518fcf, 0x026996d9, 0x0e1e4621, +- 0xa3080c61, 0x4d36f5f4, 0xa979097f, 0xf144fd86, 0xe4fdc32a, 0x7ec35cd2, +- 0x2b69239b, 0x0a4501e1, 0x8e284b7a, 0x48a4efab, 0x20f70c53, 0x5fb8ff84, +- 0x437189ae, 0x64c39cd2, 0x15ce15cf, 0x3690de6c, 0x9e78d0b7, 0x5f13cb5f, +- 0x87b833b6, 0x657f957c, 0xe675e836, 0x7e9e1180, 0x10921db4, 0x39a8e3af, +- 0x00a16e6e, 0xc13625d5, 0xd5ca5df8, 0x4c0262ec, 0x861bcc30, 0x961ceee5, +- 0x0945d92b, 0xf720c8fc, 0x1ea1b978, 0x3434dd58, 0x422a29c1, 0x7d630f54, +- 0xd467f946, 0x259fe518, 0x7e3de51b, 0xd9de5185, 0x5f79464d, 0xab9462dd, +- 0xcdca315b, 0xe1a671b3, 0x4af6c4fc, 0xf3793c03, 0xd7f3860d, 0xe01817f8, +- 0x376fdba9, 0x71d69f9c, 0xa0bf61af, 0x5f61956b, 0xd9cbb3b7, 0xd581b5c1, +- 0x0266f671, 0xa0ec15d3, 0x0643f0e8, 0xff7af17c, 0x12aaf831, 0x47a5ce51, +- 0x48c2de51, 0x1484703b, 0x6f1878a0, 0x57faf107, 0xaadff4e2, 0x93f793e5, +- 0xee4e3ece, 0x8f412f3a, 0xa0bcda7f, 0xb1fac2dc, 0x55690a7f, 0xcb567489, +- 0xaf2d3e6b, 0x644df6c1, 0xa973e024, 0x0f1418b0, 0x3c2b1c52, 0xbb22abe9, +- 0x1d350e2c, 0xe4a0f644, 0x32557b6c, 0x7040979d, 0x4b47538d, 0x5296fe74, +- 0x72b1cc0e, 0x8f366742, 0xa171ca8b, 0xe327cad2, 0xfd6fb2e1, 0x54ecc96d, +- 0xcfa7c33a, 0x3552b87d, 0x1c97cc6f, 0x47918e60, 0x4f9ea945, 0x5d5e8cbc, +- 0x089cfaee, 0x52b07deb, 0xfbb26fbd, 0xd5a3dcdb, 0x9e66e237, 0xab325fd5, +- 0x32710ec7, 0x6add1f9b, 0x7d90e60f, 0x5f90c99f, 0x317cc5c9, 0x56051268, +- 0x36a171bf, 0x8c4c2a62, 0x6e52f251, 0x9f512f9b, 0xcd2aed86, 0x8bf21727, +- 0x465e2be7, 0xa2542bbe, 0xb7f4c5b6, 0x99de5727, 0x739e794b, 0xbbc22fad, +- 0x973ccfef, 0x9fcc7943, 0xf7a2ed2c, 0x1921e787, 0xd9c617c8, 0x48504990, +- 0x1c43ca04, 0xd1ce2feb, 0xfc623323, 0xe585a376, 0xadfad02b, 0xe939353b, +- 0x0d12d6fd, 0xb13e2f6f, 0x9df8e302, 0x3c98875d, 0xb407336a, 0x7449ad3e, +- 0x4df7fbe1, 0xbf521670, 0xa8915209, 0xff7ae9f6, 0x3eff9e35, 0x57ef5579, +- 0x36be772f, 0x07d0dfb3, 0x51b48ec3, 0xf3f18de7, 0xeadf28ac, 0x258fbdfb, +- 0xfbd3fcb0, 0x1f9b3658, 0x641fdf46, 0x9b3b8173, 0xc7d8303e, 0x1b1f2ddd, +- 0xe51eeeec, 0x287ec313, 0x8f19623d, 0x64f687fc, 0xe503b9cd, 0xadb77e77, +- 0xd450fa84, 0x4c6e7f57, 0x627a1c9f, 0xf7c26cf2, 0xc73cf9bf, 0x1759e8e8, +- 0x9d34f364, 0x4eebd3cf, 0x2eb43832, 0x3e78d6c4, 0x5f55bef5, 0x3c837fad, +- 0xc227ea33, 0x9b47118d, 0xd479d4c3, 0xd667beba, 0xc3ca4ab8, 0xb356d93d, +- 0xe1524eba, 0x0abb52ac, 0x6b4b99cf, 0x48dce2d8, 0x070f6b7d, 0xd0f68712, +- 0x9785d57b, 0x7744f8ac, 0x50f56c86, 0xb9195a5d, 0x482b7340, 0xe379b10f, +- 0x41d954d2, 0x062c39df, 0x9d1952b3, 0x383fa893, 0x035e526b, 0x2f25018c, +- 0xf53e71fe, 0xaa498301, 0xf8be27dd, 0xe9057cdc, 0x97c5257e, 0x0a40f74c, +- 0x94e76359, 0xfa859cfa, 0xc253ea62, 0xf0cd750e, 0xcc8f8c70, 0x478a75b8, +- 0xd3d7578d, 0x9af5ef8a, 0xe47126da, 0x80dacf0f, 0x07e8a7e6, 0x4317d512, +- 0x1faa6cfb, 0x70920198, 0xdb6eccff, 0xe3cf640b, 0x5faa6690, 0x7d635ab0, +- 0xb65be141, 0x7d09c500, 0x11ee933e, 0xfbc5e57e, 0x6c2d7be9, 0x2898300e, +- 0xd77f9094, 0xf5601d27, 0x595c89d7, 0x15f9b0f2, 0x7a3f1448, 0x6eb6d8f7, +- 0x3991e752, 0xafff120b, 0x0f12b873, 0x6a4233eb, 0xe1cda95d, 0xf9abbe74, +- 0x43df19c7, 0x7c406d9b, 0x7c1a5f9e, 0x4ee6cbca, 0xd9d10e62, 0xd6e9526b, +- 0xd3f9d5e9, 0x73be88f9, 0xe7d5bb65, 0xd779d149, 0x07e44986, 0xce754728, +- 0x2f7773c7, 0x7dfee518, 0x7cb2beba, 0x558f88f3, 0x2dbcea4d, 0x07f6f7aa, +- 0x8ede914f, 0xbb1c5938, 0x3e78fddc, 0x611ff7eb, 0xef3e40f2, 0xf862fe22, +- 0x9989e25c, 0x3eef9e0b, 0xf85794f1, 0xb385fce1, 0xf878f9d5, 0x02398b85, +- 0x77dfafde, 0xc9d924e8, 0x6e3c1cf0, 0x831b6d8e, 0x68ea657d, 0x0acc6bf3, +- 0x4d92f531, 0x6cc13fbf, 0x9f218fbc, 0xfc8bacfc, 0x5d89eb11, 0xf9421f5a, +- 0x9eb6e292, 0xb1d9772f, 0xe2df454f, 0xb8b36f42, 0x8ec9784d, 0xcb0a73d7, +- 0xa15cfa5b, 0x44bcc38d, 0x599b963a, 0x76afe73c, 0xbba7648a, 0xd482f6d0, +- 0x04a59ad7, 0xeb8e3f36, 0xe4dbd76f, 0xd65ec947, 0x4199507c, 0x3be76ffd, +- 0x957d6837, 0x6ba64f9a, 0xf09d39f6, 0x64de1f13, 0x358a5796, 0x4dec4afa, +- 0x3321d53c, 0xf9d5e140, 0x788f3681, 0x8fd66dec, 0x775717fd, 0x1c70ea99, +- 0x00001c70 ++ 0x00088b1f, 0x00000000, 0x7dedff00, 0xd554780b, 0x733ef0b5, 0x7993331e, ++ 0x31e424e4, 0x09261081, 0x83086820, 0x3ac54440, 0xbde311e1, 0x1a5e1db4, ++ 0x15e18fad, 0xa0484842, 0xdeb787e8, 0x2409033f, 0x88b06220, 0xf0ed6bd8, ++ 0xed160b48, 0x16850348, 0xd22d00e9, 0xb15ab077, 0x5ac17eda, 0xa4490850, ++ 0xcb6ad457, 0xfbdad6bf, 0x13267324, 0x5fafdb40, 0x4fc5ef7b, 0xfd9f6b36, ++ 0xd6bdaf5c, 0xb4518fda, 0x84319674, 0xe7f84bb1, 0x5ac6c656, 0xbde96319, ++ 0x65166ce9, 0xc6d4864c, 0x8cd18e42, 0x7e9acca5, 0xc634a2f7, 0xdf35139c, ++ 0x7324506d, 0x6bb9f4d6, 0xd13d9e01, 0x8f2ac3e6, 0x6fb3fe6d, 0x0db19791, ++ 0xeef1df1b, 0x0bbd7802, 0xebef82fe, 0x578593ff, 0x1e1d8c49, 0xba7871a3, ++ 0x42e6b614, 0xe1cadb3a, 0xe0cc2cc1, 0xe59eabfb, 0xcea0598c, 0x229e3027, ++ 0x27f874c6, 0x061847cb, 0x10d8c199, 0x57f8bd84, 0x7df06325, 0xb3dd8096, ++ 0x2b3d5297, 0xde38480b, 0x63aa34de, 0x337426ca, 0x0bda8d25, 0x2d7ea8b9, ++ 0xa6fab80b, 0xef1f3f0e, 0xe3466cec, 0x38f08d9b, 0x3f082b0e, 0x601d61cc, ++ 0xb6778c0b, 0x77ea41ef, 0x94677436, 0xcc3079c3, 0x6def198d, 0xad8fc0fe, ++ 0x59aceed0, 0xc2e9e112, 0x1e6f182c, 0x95a9e3d6, 0x734707f9, 0x71a6ed31, ++ 0x85075e3f, 0xa571deb4, 0x5c6892ce, 0x37bed0a9, 0x877df317, 0x34eb3db1, ++ 0x68c6bec6, 0xbc03eabe, 0xc24561fe, 0xbc4767d4, 0x87dda6f5, 0xf9df52ad, ++ 0x97d678fe, 0x844eed6d, 0x973e1297, 0x5378f8d9, 0x906a034b, 0x2ccefdf2, ++ 0x989cffc8, 0x47c180c7, 0xe98ba726, 0x16ff2059, 0x5f39ff91, 0x085634f9, ++ 0xe83087f0, 0x5d805411, 0x44fdbfa2, 0x1b945d37, 0x6ddf0dd2, 0x40f5dfbd, ++ 0xd4327be3, 0x5ccb301b, 0x9c95f74f, 0x92a0f6c1, 0x70051814, 0xcd1eb9a9, ++ 0xeec646e5, 0xd3b4ae66, 0x07bfc1d7, 0x9097c1b3, 0x3e3f80ce, 0x4bd7f63f, ++ 0xac2cefd0, 0xb7f2f723, 0x787e1e91, 0x80bdab86, 0x3359c6b1, 0xf9e60c5d, ++ 0x0ba6606a, 0xaceafbe7, 0xf8ef3499, 0xe567b3f2, 0xfa0b0726, 0xe3e91be6, ++ 0x70d1d075, 0x16e82fa8, 0xcc807dff, 0x2805236a, 0x8e1fcc27, 0x4e196769, ++ 0x30fa100a, 0xc078cd32, 0xe92dd28f, 0x2f10ffd0, 0x8c1247f3, 0x6cc84be3, ++ 0x03658e50, 0x1ffab3f1, 0xb539b00f, 0x96099bfb, 0x718270d2, 0xe076c32f, ++ 0x1a34bbbb, 0xc69dfe20, 0x1a7b3be5, 0x8cdc3a8b, 0x6cd771dd, 0x3486c3c2, ++ 0x0dfd6125, 0x84625e38, 0xbef84ea8, 0xb3b8f1ca, 0x4f6c012c, 0xc2072d9b, ++ 0x126bf331, 0x165231e3, 0xdb3ff2e5, 0x7b97e9c3, 0x7f414bc7, 0x15ac7c02, ++ 0x1c8b5b78, 0x3c77be36, 0xf80d77c6, 0xd21ff91c, 0xd3097ee3, 0xa7b63b6e, ++ 0x155db6b1, 0x86414724, 0x27f905fc, 0xfe17a924, 0x1c554d67, 0x7e4c5663, ++ 0x41c91a5a, 0xa3c2f5bf, 0x81eb9415, 0x4320fe42, 0x6c0589e0, 0xf0831f20, ++ 0xf5b1b95f, 0xd3abff7c, 0x77e0667a, 0xf41a7e8a, 0xb2ffe491, 0xcbbae974, ++ 0x4ec2b5f1, 0xf50b7a1b, 0xe895338f, 0x48392571, 0xe89e9fc0, 0xfdff00bf, ++ 0x3140d2dd, 0x471a37ad, 0x43b2d31d, 0xfbe8126d, 0x3ee5c1c6, 0x403ceebe, ++ 0x1eb186eb, 0xa04f9fe1, 0xd87183bc, 0x94f5cb51, 0x56f416b5, 0x302fd432, ++ 0x298d0faf, 0xb4249bfb, 0xd30ad823, 0x472f16ba, 0xf4449f8d, 0xd2bd0240, ++ 0x76b89f43, 0xdeb04847, 0x166ea838, 0xd87e5bd1, 0xd7cbc7c6, 0x02cb0d1b, ++ 0xaca71b3d, 0x6f1ea1b0, 0xe1b32cf4, 0xbd98d1ba, 0xc86a618c, 0x35bed1ab, ++ 0x75d97bdb, 0x1d8f4d65, 0xedb92610, 0x363acfc9, 0x630deb06, 0xe8651bed, ++ 0xc4bd25af, 0xf81fedc2, 0xdd1eec9b, 0x4968e382, 0xd5f63d61, 0x52f39436, ++ 0xf60ce70e, 0xdc01d786, 0xcf7f3762, 0xb25be511, 0xd910e1bd, 0xb08b5e11, ++ 0x3ebb4423, 0x6d864fb2, 0x86476dea, 0xb1c6c372, 0xc7eb0690, 0x85cb15d0, ++ 0x7895e33d, 0xb0ec263d, 0x4b4bc26e, 0x91a4a4f3, 0x1b852760, 0x87a221a0, ++ 0x63b61d7f, 0xebe8b26d, 0x75b10f48, 0x0137840e, 0x33b7fd4c, 0xde31c761, ++ 0x46ddbb5e, 0xdbb76df9, 0xfd8a1d21, 0x7d356326, 0xc7af0a5d, 0xe41d91d6, ++ 0xb18b68db, 0x3e407677, 0xb02167da, 0xb025869f, 0xa78c4083, 0xf6b14548, ++ 0x4e10c4a5, 0x6952f017, 0x36f90128, 0x988d6fce, 0xd1dc740f, 0x0bc92934, ++ 0xf5e1de74, 0x1e80f927, 0x419c6c0f, 0x20764b70, 0xf3805029, 0x2ec4919d, ++ 0x3627df43, 0x0923a605, 0xfcf74876, 0x6bf53274, 0x6d8ec3b6, 0xc3f36a2c, ++ 0x989a5bb8, 0xca700acf, 0xda1240fa, 0x9f30f9b1, 0x76dea4db, 0xdb361fd2, ++ 0xf29adb4f, 0x61cbe424, 0xc5bf7c9b, 0xaa3f2779, 0xa94e9179, 0xbcfcccd3, ++ 0xd2f1c435, 0xaddb8d32, 0xbaef5e2d, 0x32970811, 0x9ef84adf, 0x779737ec, ++ 0x8bbff7ae, 0xeafcea72, 0x80f3a245, 0x1e56a027, 0x453fcfe2, 0xbdcfb58a, ++ 0xfe0c5ff0, 0xedcc139c, 0x9b7c4cb4, 0x78db1fea, 0x9fda1247, 0x9240c12d, ++ 0xfe77d05e, 0x14e8fd86, 0x3fe8c27a, 0x6fa889f9, 0xef3beb11, 0xf819f9f8, ++ 0xb88f33e9, 0xe4376cf1, 0x1ae4193a, 0x54ec8dfd, 0xa3be0fd2, 0x64498e6f, ++ 0x1c7a1a0f, 0x89d990f8, 0x7b7e22df, 0x5ffabe22, 0xe6eb1a92, 0x73f02904, ++ 0x5d92f109, 0x614efa4b, 0xe3495fc1, 0xf919cb7b, 0x1205894e, 0x97bfb7d9, ++ 0x34f73db8, 0x5cc6fe0b, 0x0e90c82f, 0x7af82cdd, 0xdd637ca2, 0x7fd80a65, ++ 0x97a7faa3, 0x0b286e51, 0x66cb5e90, 0x72a7a46d, 0x47caefd0, 0x337ae396, ++ 0x3e5df50f, 0x94b5f49a, 0x94cd608e, 0x9422cb5e, 0x4a36b016, 0xc85cbd0d, ++ 0x3a1e09ba, 0x02c4702e, 0x774b7b7c, 0x9e61f984, 0x0b08828e, 0x0bd338c2, ++ 0xafda1202, 0x3976a5e3, 0x8d97e419, 0x2816de62, 0xa5edceb7, 0x9b96c571, ++ 0xbdeaf504, 0x7a0a9096, 0x9b6b2f66, 0xab7a8c9c, 0xfcb04580, 0x74a5a75e, ++ 0xb96f415b, 0xe38f02f1, 0xe600965d, 0xee7ded1b, 0xe07b7343, 0x5728cb4f, ++ 0xc25721b2, 0x14f5a6bf, 0x7d42adc6, 0x02b5c7b4, 0x409adfe6, 0xdc2db95f, ++ 0xd4771f2e, 0xed7d47ee, 0xc8c2d328, 0xcd05e9f7, 0xcfa708c5, 0xe0193e67, ++ 0xfde1de9b, 0xc638e036, 0xbd3bcef7, 0xdd212023, 0x5a163cdb, 0xc0e31c37, ++ 0x3c7b46bf, 0x8c5fd5ab, 0x26f804f1, 0xa20ab8e3, 0x9760197e, 0xd3fbd3f0, ++ 0xc64fae9b, 0xf6dd717a, 0x9136800c, 0x132f8afe, 0xb6eaacf5, 0xaf8081b1, ++ 0xe4add7fa, 0x95745fbf, 0x7c31610f, 0x745d4ef6, 0x8c61fccc, 0x4e3bad9d, ++ 0x1b5d4769, 0x27759da5, 0x6edfed29, 0x7c085583, 0xf9fff911, 0xfd6fd83c, ++ 0x3bcc03e1, 0xc21dc68a, 0x969d38f9, 0xbfc91e70, 0x7a32d64d, 0x001014ed, ++ 0xb3c60dbf, 0xad1e4c79, 0xc45f88b7, 0x12c63ab3, 0xd9673c40, 0x05a5a59a, ++ 0x9e2ef931, 0x53e8ee3f, 0x3b2f512b, 0xa831b3e6, 0xacab3657, 0xf88ce90c, ++ 0xab69039c, 0x203fb964, 0x4e90b9e0, 0xef07ef68, 0x1d68076f, 0xf0097ac8, ++ 0x78a07c84, 0xf532b993, 0x9fcd5e93, 0x209fc4c0, 0x00d95de9, 0x6d9fdf85, ++ 0x7f7983cc, 0xdad9e385, 0x0875b0a0, 0x56af357b, 0xff376e84, 0x98ac1d93, ++ 0xdb1ec0c6, 0x18ed3e5e, 0xf97ce7ea, 0xe42ac393, 0xde55ae0f, 0xb3d18f6a, ++ 0x9f606539, 0xb21fde80, 0x1b9f9cc2, 0x81d0c332, 0xbf38e505, 0x665f9cc9, ++ 0x8bbefe11, 0x8afed0b9, 0x05b2d79f, 0xefe8483f, 0x5163aeaf, 0x4b031aa7, ++ 0x2c069f1c, 0x57059465, 0x8d96fcc2, 0x599f1464, 0x6dfee16b, 0xbe03d633, ++ 0xf5d220d8, 0xa918ed71, 0x8169c13c, 0x4ebb03b5, 0x653fb7e8, 0x00b1ae29, ++ 0x265a0e5d, 0xde5058d5, 0xfb430895, 0xf9a691d0, 0xafca09c3, 0x7fd428b5, ++ 0x97e6d292, 0x37dd5c61, 0xc036df32, 0x3bb532fb, 0xacb1f28a, 0xa10bebd8, ++ 0xfd85f33a, 0x58149748, 0x3efe5103, 0x8a5678c5, 0x50b4acf1, 0xa76a113f, ++ 0x4dbe701b, 0xbb787ec2, 0x197a46cb, 0x8dfd81da, 0x2545be73, 0x22d47b7e, ++ 0x0907e429, 0xc8a9acba, 0xc004ac7b, 0x8cdfdd76, 0x8253b8fd, 0x9ef91a94, ++ 0xd45e65b9, 0xcc435907, 0xd5b72bf4, 0x547f20e6, 0xc8252206, 0x7e32673f, ++ 0x798546b4, 0x3e63ab6f, 0x72eff005, 0x78e0b606, 0x1da9efab, 0x0daef68e, ++ 0x971d3979, 0xb64d3f72, 0x9f2aca69, 0x14caf902, 0x1f02aa25, 0x9c8e132a, ++ 0x8698dd54, 0xed3f918a, 0xec02dfc2, 0x29619286, 0xbff08db0, 0xc4d1bb2b, ++ 0x187d51f6, 0x3627ad2e, 0x8adef730, 0xdb2d3be1, 0x19bacb0c, 0x5c6f4fee, ++ 0x750f9d29, 0xf8861adf, 0x75876467, 0x2e1db8bb, 0xe215f04f, 0x74dc3778, ++ 0xfbe9e113, 0xeaf6ff42, 0x1fc9b0a3, 0x32fc5790, 0xcc58e863, 0x797ca66f, ++ 0x8633cfc5, 0x34bc400e, 0x936d7cd3, 0xf71e3197, 0xaa78f3f0, 0xfa8d77f0, ++ 0xd1fe1e06, 0x87f78ef3, 0x181f486d, 0xd9d84da7, 0x178e5e29, 0xb7c2ceab, ++ 0x05325e01, 0xfaf9d36c, 0x6968b0a1, 0x5c034f1e, 0xc49ed6ff, 0xe6b64aef, ++ 0x787b7d45, 0x1be546b0, 0xf8797853, 0x469b99ee, 0x298f49df, 0xfec36c2c, ++ 0xc47fd414, 0xf6910117, 0x5cb487e4, 0xd46a8fca, 0xf919844f, 0xbf01c112, ++ 0x166fca64, 0xfb0bf5f8, 0xca94efe8, 0xc4c13cd3, 0x69e931f6, 0x43700a2a, ++ 0xafb21aca, 0x0c437aa6, 0x76576aed, 0xe765e939, 0xabbdb338, 0x7376cc7a, ++ 0xce9b7793, 0xbad3f7db, 0xd9ed1360, 0x9f1435f4, 0x9c9765b5, 0xe29276c1, ++ 0x50db61fc, 0xb888ac33, 0xf6164bac, 0x06ec0df4, 0xabf593f2, 0x3f0a0f8c, ++ 0x7fd06dcf, 0x13b7a702, 0x77f405ec, 0x2eec0532, 0xf7c9e830, 0xdff98c01, ++ 0xfb718536, 0xcf47f042, 0xdc4a43fe, 0x8f0a43fe, 0x91bfafef, 0xe8c207f3, ++ 0x257db8ff, 0xc7b897e4, 0x686e7af1, 0x78c7c787, 0x27e8df3c, 0xddea3bf6, ++ 0x68da130b, 0xe05dc01f, 0x6911f4a7, 0xa0a3b51a, 0x1e7cc29c, 0xc2bc7e13, ++ 0x263f8a74, 0xeb24798b, 0x8baf9e3c, 0x318074f6, 0xe89ae94e, 0x28d1fee7, ++ 0x3a0dde3e, 0xa7b62f1f, 0x9bda78d0, 0x09f3e454, 0x7685dfdc, 0xf6e7e637, ++ 0x93992fd2, 0xfd61f204, 0x0b92f680, 0xaa6e8e80, 0x7d48b21f, 0xfe1148f9, ++ 0x75fc22ba, 0x165a6768, 0xf58033b4, 0x47e099f0, 0xec37f71e, 0xee22019b, ++ 0x4c777c6f, 0xc7ff1beb, 0xfe38a4fc, 0x4a53f233, 0x7d93e5cd, 0xef8ccf9c, ++ 0x035b7ef1, 0x9775fce3, 0x7480ec2c, 0x57f38c36, 0x57f155ea, 0xca13ce0a, ++ 0x59fb18a7, 0x27525f82, 0xe022fd0a, 0x7f06a194, 0x7bdbba71, 0xf3f9c9f0, ++ 0x8f57c171, 0xbb757c1b, 0x9d2303d6, 0xe1ca9f1e, 0xfd8c52c7, 0x29a7ce20, ++ 0x89d49da2, 0xa927c425, 0x2f3aff46, 0x17b43a97, 0x285dba46, 0x5b707ce5, ++ 0xf677cf1a, 0x925781f0, 0x417a5ea5, 0xedcd159a, 0x228f43d5, 0xbe270dbf, ++ 0x4ababa20, 0x90b9bf39, 0x7f5e24df, 0x2a9f943e, 0xfa3d1df2, 0x5ff42c34, ++ 0xccb24fd4, 0xf10afdda, 0xc267df19, 0x5fd41cf6, 0x6e5e78f8, 0x049a9d2f, ++ 0x3ae87a5d, 0x72e43825, 0xa2c62d71, 0x7443c592, 0x83642c91, 0x28ca45fa, ++ 0x552fb0ff, 0xc7dfa092, 0x2e563f01, 0xb35f147f, 0xe3daf88b, 0x0fc84705, ++ 0x3587dc79, 0xef5e2f00, 0x432879ed, 0xfa1f16a5, 0xf2978f49, 0xbf7c47f8, ++ 0x8f97a5a9, 0x71d969b7, 0x6dcd2cfa, 0x6447cfe2, 0x27113fb1, 0x73596b3f, ++ 0x213fad33, 0x26279b7f, 0x2f2f115e, 0x1f5c89ce, 0xe57d7c3b, 0x114cf901, ++ 0x7d6092e5, 0x47dafa41, 0xf143e598, 0x1d6c7d73, 0xe8be2017, 0x7c89de33, ++ 0x33494cdf, 0x5e30ffe7, 0x4eaf7b1f, 0x21f97a5e, 0x80b7d622, 0xe77f1fd0, ++ 0x2d9fedf5, 0x3ec9f90d, 0x9e201a42, 0xce04b65e, 0x9d0f88c8, 0xb60e87db, ++ 0x84cff09e, 0x36e8307e, 0xf0bc6295, 0x93cb9b3d, 0x7ad08f43, 0x3cb828ec, ++ 0xfb17addf, 0x74eb6b87, 0xadf11f4a, 0x25e79b2a, 0x0dd685bf, 0xc553515b, ++ 0x4367f876, 0x5bbe879d, 0xe76a8547, 0x6c38dc02, 0xf61b7045, 0xd279fc2d, ++ 0xb15f4853, 0x4b8c6e5f, 0xe5057b45, 0xb7e43b28, 0x10b951a4, 0xc11d534e, ++ 0x4f68e8e3, 0x041c5c52, 0xe1ac0adf, 0x04eb0a18, 0xdc1185ea, 0x8d0c721f, ++ 0xe6820c60, 0xaa657e83, 0x10524c1c, 0x51cd051f, 0xba28778c, 0x20d6f24e, ++ 0x1f239845, 0xf9257be7, 0xbcb8590f, 0xabfb4e27, 0xa8fb8497, 0x48bae409, ++ 0xdbdd91b1, 0x049846a0, 0xc5186bf3, 0xc8696fc8, 0x4679fb35, 0x1cb850ea, ++ 0x0f69de2f, 0x5f231dbf, 0x131491d5, 0x2b3fb35c, 0x1c8c76fc, 0x1f9c662d, ++ 0xf68972d8, 0x27f8aad5, 0x73dacd56, 0x0c2eef10, 0x4bbb42d2, 0x0819ed2c, ++ 0x3beeb177, 0x6794644a, 0xe6e51fbf, 0x0638393e, 0x223496f1, 0xe8a47c40, ++ 0x4abf1101, 0xa37daabb, 0x0bd5e12b, 0x484cb3dd, 0x3a8a45b3, 0xd34806f6, ++ 0x8e331a78, 0xcff8ca49, 0xee030e3e, 0x228397b5, 0x84f435ad, 0xa91ffa5f, ++ 0xf5e38a27, 0xd1e22542, 0xae4c0bd0, 0x883f6262, 0xc85582f4, 0x904f54df, ++ 0xe30d71ec, 0xf1ef1895, 0x1fd07d70, 0xfac51bbe, 0x85e846bd, 0x5a0bd406, ++ 0xd437fcaf, 0x0ab60979, 0xd0f1593b, 0xc94b3e36, 0x5cf0860e, 0x2d766643, ++ 0x27c04f6b, 0x8a415c6b, 0x2ace1d5f, 0x35f7e0f7, 0x8c3dcb83, 0x9f6e7eec, ++ 0x935de318, 0xd762ce55, 0x2f371c4f, 0xfc579e67, 0x9be3fa7c, 0xe0c8f5f8, ++ 0x46f91523, 0x5873d4a6, 0x52afd4c2, 0xc3cf123c, 0x046bfb70, 0x4b2a1fda, ++ 0xefa3adf2, 0x3e5e72d1, 0x9cd2285a, 0x405ca807, 0x6bfe2fec, 0x093e6ba4, ++ 0x860e90d8, 0x06b7eb3d, 0xd85ea3f7, 0x69ca48ab, 0xa75893c4, 0xecbda757, ++ 0xdf183a46, 0xf6bfa63b, 0x55e35405, 0xe209745a, 0x07739669, 0x8c6c875f, ++ 0x676191f4, 0xe3981524, 0x67817666, 0x54cbe05b, 0x1be0967e, 0x397350db, ++ 0x7dc54f3a, 0x2e4b7091, 0x2e3e37d2, 0x4940e5c7, 0xb8abe733, 0xf3e30aa1, ++ 0x83c7bbcc, 0x1b3d5de3, 0xc3f02ef4, 0xfd66e9ea, 0x40e58d9b, 0xf0af7e5e, ++ 0x7fa11ff4, 0xbe77b975, 0xea290139, 0x33c8fb00, 0xc21ed7d9, 0x92b4ce79, ++ 0xc18488bd, 0x3c4610f3, 0x2b273593, 0xfc46e7c8, 0xa5e07073, 0x39ae308f, ++ 0xb927de64, 0x0ade6828, 0xcb6e08fd, 0x319d15fe, 0xa437c798, 0x5fd891ee, ++ 0xe7a2638e, 0x06e78601, 0xeb015b18, 0xde71ee28, 0x77d62983, 0x3cfc0923, ++ 0x61e82ede, 0x91903945, 0x1d4a613e, 0x8970bfc2, 0xb464cf7d, 0xfd7bf36e, ++ 0xc2c7f016, 0x1ecff216, 0x5b9ec9d6, 0x84f9d32b, 0x607ff5ab, 0x4dfa3a34, ++ 0x97975812, 0xcf5f571c, 0xc62e6813, 0xb2c0dc78, 0xe375c508, 0xf32679cb, ++ 0xf9f14df3, 0xfe2f82b9, 0x9cde7401, 0xa57c8f96, 0x7a0c3d13, 0x0e0e48ff, ++ 0xf0c7c751, 0x7d27eead, 0x54ae5f15, 0xa1550e09, 0x628159bd, 0x4fd56fbe, ++ 0x7f87e939, 0x5df68d39, 0x8bd55efd, 0xbde4c97e, 0x8056f46a, 0xf3f2b7ab, ++ 0x7643968c, 0xa7ce9f92, 0x69751c39, 0xdf9ca7e4, 0x583d9121, 0x70db6d63, ++ 0xf6f9c633, 0xb6ec8cca, 0xe7059970, 0x9dcc5a77, 0xb970e7ed, 0xb7ab3870, ++ 0xeb0fbe1e, 0xd2b7ec57, 0x81f5633e, 0x19b85f85, 0x55c785e0, 0x5baaf5b2, ++ 0x01036a56, 0x2296145e, 0xe24d7708, 0x27da1bf2, 0xb976fc93, 0x3b6632db, ++ 0xc6c3bf71, 0xb8c0d7bc, 0xb3196d5d, 0xe1955e60, 0x5eb04a17, 0x87c96ee5, ++ 0xbde4c6eb, 0xa0b2c72d, 0x892ef55e, 0xef1799f6, 0x0c6f3074, 0xcab74e7d, ++ 0x1e315bd1, 0x78c4f30c, 0x5cd642c8, 0x6eaf7882, 0x5d79a8d9, 0x5b3ef4bd, ++ 0xad798237, 0x2ef570bd, 0x2dea07e8, 0xe1f25e79, 0x58589714, 0xf3a4f910, ++ 0xbb6cbd80, 0x52b7e713, 0x79c2ee1b, 0x6e586a35, 0x3ece7861, 0xb7c717bb, ++ 0xef812b55, 0xd56f4f95, 0x6af863ca, 0x98ebcef1, 0x4e4f8637, 0xbccfc96f, ++ 0x1673badc, 0xf1d8d1d6, 0x38788a54, 0xf4dac253, 0xb267f898, 0x91f42296, ++ 0xe0df6a6c, 0x8cabd0ff, 0x8bd0faec, 0x41abc22e, 0xd73a65b7, 0x2edd060f, ++ 0x4a8e82e8, 0xfb6c5177, 0xe901ba46, 0x057dc560, 0x61c7d29d, 0x1374c73d, ++ 0x9f48e7ac, 0x6bbf88cd, 0xf2819f68, 0x315913dd, 0xfdbbf7ee, 0xfee3c8e8, ++ 0xc558bfb6, 0xc38040f8, 0x2504f719, 0x6fe665ef, 0xe0d59ba4, 0xb7223c1c, ++ 0x9274756e, 0x59b57202, 0x90c52e0b, 0x3f0de3f7, 0xe0053499, 0x01b06a03, ++ 0x0a41bff9, 0x4ff8f056, 0xb2f283c4, 0x3c93ec46, 0x8c78418c, 0xb46967df, ++ 0xdef9b02f, 0x24b2eda2, 0x70869ae6, 0x0e3137f9, 0x4a3ced05, 0x4ed0a8ed, ++ 0xc9db95fe, 0xa9826fb8, 0x2afb8c9d, 0x5336768c, 0x6babf63b, 0x377df367, ++ 0x5f73c799, 0x37ced1a5, 0xd5d71da8, 0xfee32bcd, 0xdcf1e689, 0x64ed455f, ++ 0x7b23e3de, 0x614fd8c8, 0x78c35718, 0xeb94eecc, 0x3e58b1d7, 0xec6df49a, ++ 0x155205cf, 0x13c947cb, 0x94f24c92, 0xc1354fe2, 0x9a074a03, 0xf207a7ca, ++ 0xcb33df4c, 0x4be38dae, 0x8271e927, 0x14d15061, 0x06d26f1e, 0x8a77a46a, ++ 0x7e08da07, 0xf493a070, 0x053783ce, 0x26fdc1af, 0xd5ea2b1c, 0x68e0b507, ++ 0x30df013d, 0xb8a70fdc, 0x6982d78c, 0xec54bb1f, 0xf41a4e43, 0x5053f0c9, ++ 0x3dd2c6bf, 0xe3e0053c, 0x50cff15a, 0xb9509ecf, 0x69f8655f, 0xfa465649, ++ 0x68b731af, 0xaf06287b, 0x5f81834d, 0x9b76dea4, 0xf907a0d4, 0xdcf555f1, ++ 0xb446e52a, 0xb43a354b, 0x67d59bf8, 0x3a14848f, 0x85764617, 0x11fd0355, ++ 0xfd06bfdb, 0x6fff5017, 0xf54fde20, 0x6f35bfd3, 0x5b7fa982, 0x7fa9854e, ++ 0x83fd069b, 0xfd51fc7c, 0xf01fe893, 0x97e81377, 0x7fa817d5, 0xf5054e6b, ++ 0x0ab1a8df, 0x3d49ff53, 0xfec39ffd, 0xf9f953df, 0xcff33edc, 0xff3cc9bb, ++ 0xfcf34a9c, 0xf7ff3e35, 0xff458fd5, 0x8bff3449, 0xe7ccffab, 0xe7c9539f, ++ 0xf6ede56f, 0xc1eeeff4, 0x7f88c7ff, 0xbfdc4b49, 0x79a27f35, 0xccaa43fe, ++ 0xfef2b7f3, 0xe7ae4d55, 0x7fa93bfd, 0x28e58d6d, 0x15487fcd, 0x8359aff5, ++ 0x6d23e43e, 0x9e2d5250, 0xc90305e3, 0xfc267e8b, 0x0474a7ed, 0x55115f3f, ++ 0x0f1c68f3, 0xbbbe7126, 0xe6fc0498, 0x2ca7d5ec, 0xfa08120c, 0xe9e08972, ++ 0x358bbbc5, 0xa210ffbe, 0x3102c5b8, 0x65fbf9d4, 0xb26e8f6e, 0xceadb9d2, ++ 0xe10872fd, 0xa16e9bf9, 0x958d68f8, 0xfda01fdd, 0x209c3043, 0x8c4f8fff, ++ 0xaf3b16da, 0xb34174f8, 0x14ddba7a, 0x09e3e69f, 0x6a23624d, 0x540b7c61, ++ 0x469f04dd, 0xf0f40bbf, 0x418fe85b, 0xb465467a, 0xfa36feef, 0xcac4d765, ++ 0xae7e4acd, 0x295ec436, 0x21dd7980, 0xe15a7fc6, 0x5cbd3ef8, 0x1774f3a2, ++ 0x50d52e37, 0x76682d9f, 0x1aa1fc98, 0x03eea741, 0xbfee30d6, 0xeea7e71a, ++ 0xec645124, 0x7f3e8777, 0x85c7ed0c, 0xea98065b, 0xabc2c3dd, 0xde7e503d, ++ 0x718339fa, 0x654be10f, 0x3f71ebd6, 0x20d4d402, 0x83655f1e, 0xd6529e30, ++ 0xb3c551ba, 0xa99677be, 0xaefdbb26, 0x52fe19a0, 0x54ee1985, 0x81c62ac3, ++ 0x6c49173a, 0x6f7bb42b, 0x0fef1aad, 0x68b73f50, 0xe4bec2a9, 0x3401ddfd, ++ 0x7bac82cc, 0xb31ebd31, 0x7deba275, 0x8c6baf3a, 0xe02be6a7, 0xdc7ad1c1, ++ 0x65fe4e9e, 0xd0fc9d28, 0x1de7cea0, 0x54fbde3f, 0xe3003f9b, 0x9921efb9, ++ 0xfe3f19f0, 0xbf0e43f6, 0xf6f4ec05, 0xd1527f2d, 0x4f9f89cf, 0x5feff8fc, ++ 0x5d1f3f11, 0x4e61f5c3, 0x643f3e28, 0x69187b8a, 0xede2fecd, 0xf6f6bb66, ++ 0x763b26ed, 0xbc1374e7, 0xa9977c28, 0x732dc2fc, 0x3417df4c, 0x9f7d322f, ++ 0x04d4b4d7, 0x643d09cf, 0x8aff7f2a, 0xf7efa695, 0x7d35aed6, 0x46c552ff, ++ 0xf0577c13, 0x3bf95329, 0xbe9ab6cb, 0xfc8d0e5b, 0xfd51ca22, 0xb1dd32ab, ++ 0x7a79df78, 0xef9bda03, 0xd21f153b, 0x3f8c1de3, 0xf2aed158, 0x7fb9da52, ++ 0x056f9d2c, 0x9b8e583d, 0x94d71b1b, 0x444d37d4, 0x7f48ccbd, 0x5a66b13e, ++ 0xa7e0087d, 0x4fe12f35, 0xe8b1a2de, 0x526a7400, 0x5bb8f87b, 0x7edef98e, ++ 0x405bef85, 0xfdf6c7d0, 0xce27b72e, 0x6736d9af, 0xfe209e88, 0x6cb72bd7, ++ 0x5d73ae10, 0x6138e252, 0x3539dc55, 0x9c9156c6, 0x3af8d50f, 0x7d71a553, ++ 0x6b27b550, 0xc1f5c612, 0x7b5e1f2f, 0x1222feb9, 0x5a18e5c5, 0x0fc8e9ff, ++ 0xfdf14c83, 0x4df33bc5, 0x5871ddf2, 0x412d71a6, 0x757a009d, 0xafd81ab8, ++ 0xa388fdd1, 0xe1473339, 0x3407fc38, 0xd3fb3bd4, 0xa8ef5d69, 0xb6fedd2b, ++ 0x5009f48a, 0x195d4efa, 0x82eba7a5, 0x575dbe94, 0x755be941, 0xd7b694b5, ++ 0xf7f4a0ad, 0xdf4a2175, 0xf4a26bac, 0x94cd75b7, 0x42dbac9e, 0xc2ea6fe9, ++ 0xf9d67694, 0xa1e43529, 0x8406ff47, 0x946c6c3d, 0x8b0f6131, 0xf7a434b9, ++ 0x78a2d39c, 0xc5e705d3, 0x5fef68e1, 0xfba56938, 0x2be1fd07, 0xa7fadf9e, ++ 0x95ec9fa3, 0x7200f0f2, 0xdbbfe392, 0xec9d3893, 0x40ca5616, 0xf61dad1f, ++ 0x02dcdf4d, 0x19641582, 0xd37c9058, 0xc5da095d, 0x2bccb8fd, 0xbbf989d3, ++ 0x3d00670b, 0xe3ed7f4e, 0xa8776c22, 0xa4bfd7c6, 0xc3ad32a3, 0x37ddba2c, ++ 0xc7a7d473, 0xdfc3f49b, 0xee9c60e5, 0xdafe0f7c, 0x8c9ce872, 0x173b53a6, ++ 0xe30cad5a, 0x3a0e1763, 0xc2f0ff68, 0x946eedf1, 0x391e65c7, 0xfed8f6fc, ++ 0xc91d55f1, 0xfe4d3b0d, 0xd0be19b7, 0x6846952c, 0xcf26f63d, 0xa57c851a, ++ 0x73a6df87, 0x8d4a1e72, 0x34799676, 0xceece7ea, 0x34cf1e7c, 0x4eec97ee, ++ 0xbf057e21, 0xbdffca93, 0x3b5fd3c7, 0x6b1878c6, 0xd1b07f65, 0xf3c320d6, ++ 0xef95fdbc, 0xff949f97, 0x775e28d6, 0xf688bd50, 0xbffe1582, 0x1409f744, ++ 0x6b768d82, 0x3ac87222, 0x9b77f31a, 0x5e7a83fa, 0x94bfa7c3, 0x35be3977, ++ 0x1eb91fdf, 0x4b7fab03, 0xa256ac5c, 0x2f1195b8, 0x4d9c52e9, 0x78dee8d2, ++ 0x5b888d49, 0xb5dadb57, 0x6f9d6420, 0xdc6cbfcd, 0x71dd6cf6, 0x555dcf1d, ++ 0x74359ad8, 0x23222a7e, 0x3b9ea0a7, 0x819f5adf, 0xf962e0f6, 0x048183c2, ++ 0x795a67f5, 0x58516f7c, 0xa3af36ed, 0xb4183f82, 0x43f3e46b, 0x31d3ce87, ++ 0xdb858770, 0xceedf1d9, 0x3c5d5eb7, 0x13eec969, 0xfb7b3725, 0xfec969e2, ++ 0xcf8a34f7, 0x5714cc2b, 0xb2e7f032, 0x615be606, 0x4f3b957c, 0x8efa3d91, ++ 0x95fe1a1a, 0xbea7e8cb, 0x287a73f3, 0x2bcc672e, 0x9fb0dac4, 0x474413b9, ++ 0x1be77bcc, 0xfbbe9eb0, 0xa39f9533, 0x8d72e714, 0xc5fb1871, 0xb73404f3, ++ 0x17ed3175, 0xdfefbbbf, 0xcf9bfec9, 0x03a26e02, 0x3b422e6b, 0x94b33cf2, ++ 0xb3ce9e22, 0x6363dd97, 0x8e04d0e8, 0x5e69e212, 0x018ed993, 0x2f04d7fb, ++ 0xcb8662dc, 0xd40c8cd9, 0x549be527, 0x7e689616, 0xac2befa6, 0x216fd13a, ++ 0xeb835dab, 0xe3cabd6a, 0xa67573bc, 0x5abd020c, 0x17afbdfd, 0x31f801cd, ++ 0x8d1f5f2b, 0x54a2cbf8, 0x4656076e, 0x2e786ab6, 0x63ad0ffa, 0x6199b8ef, ++ 0x5c1af0fd, 0x257b4207, 0xe3c6c38a, 0x3f8ed3f7, 0x7ac6bc7e, 0x240e27dd, ++ 0x53bd51c6, 0xf1ae784a, 0x0ccf82eb, 0xcc4e7d7d, 0x3e0bf0db, 0x4fc63840, ++ 0xdc455888, 0xd232665e, 0x0b6ebcfd, 0xbbe99259, 0xdbf38a2f, 0x7bd5f563, ++ 0x681f8e31, 0xc0dd92b5, 0x728c2ff7, 0xf2906b7e, 0x979fa43b, 0xd114fbf3, ++ 0x126fda42, 0x9ee37d71, 0x2ee49c94, 0x62cf2864, 0xeedead9f, 0x1af086de, ++ 0xc39d0557, 0x877941a9, 0x97751ef6, 0xb578c71c, 0xfd47358d, 0x4f56bfc0, ++ 0xd7807edc, 0x3ec43b0c, 0xe0660d7f, 0xc78fa15e, 0xcc231dff, 0x333e5ce5, ++ 0x3c1ecbfc, 0x698f8945, 0xe78bd92b, 0x3c519cb7, 0x2826c0a7, 0x56fe3d1d, ++ 0x7c7bfa1e, 0xd9cf0cfc, 0x3ae5f943, 0xe304bf2f, 0xe58f402a, 0x4cca4faf, ++ 0xaa3e8cbd, 0xe16250f9, 0x46a47598, 0x0f90d6e9, 0x28543e6b, 0x4deb33ff, ++ 0x31aaac2f, 0x5acff37a, 0x01ea34f0, 0x3e3893d4, 0xdd89fa09, 0x57c7030f, ++ 0xd973958f, 0xcf8fe666, 0x66348e3c, 0x6b2edfd2, 0xe34483f0, 0x7bedccf8, ++ 0xdb2fb4fa, 0xed8effd2, 0x7ed3ed0f, 0xabf6a272, 0xbedcf7bf, 0x95afac10, ++ 0x8dc279df, 0x55deea87, 0xfef0339a, 0x6acb5554, 0x3be5ca37, 0x748dc84a, ++ 0x272c377d, 0x625c7fbc, 0xefcef833, 0x4b5a7bc4, 0x7d9ddf04, 0xa02f91f6, ++ 0x45b172ff, 0xb03e29d5, 0x02b51ad3, 0x5d692e53, 0xa763e5c4, 0xf98714f5, ++ 0xfd9af3bd, 0xf9517d66, 0xbc3227ad, 0x121bcfb4, 0xfc9473fe, 0xfe3b2583, ++ 0x57768258, 0xbd26eb0d, 0xfb0f5f17, 0xec9530ff, 0x1f783981, 0x71bbfe2d, ++ 0xe046a7be, 0x11f5a6a5, 0xd3578f3a, 0xef38bb7a, 0x677e4ed6, 0x610abd7c, ++ 0x1360dff7, 0xbec4dde7, 0x161781a0, 0xfd7f76e6, 0x4f0b27ae, 0x763ab8c1, ++ 0x152dccfc, 0xd729f2c4, 0xf322177f, 0x6f7df1be, 0x09d572ff, 0xbed631fa, ++ 0xef69d636, 0x1cafe17e, 0x1a9569e4, 0x583fa375, 0xf3a555b5, 0x6dcf55e7, ++ 0x30d7e6ff, 0xd5baf33e, 0x5fda0c37, 0x7f8fdcfc, 0x8bc01373, 0xa6d3505f, ++ 0xf13869f1, 0x9f41985e, 0xc57ff81a, 0xa8f4bdf5, 0x358feefc, 0xf98147bc, ++ 0xd2f6a70f, 0x870bf165, 0x2faa3635, 0x0e47263e, 0x82bdfc6b, 0x4e44fa38, ++ 0x515fa095, 0x0d03ebbf, 0x87bbd7f5, 0x9b999624, 0x7f5b9f00, 0xe231f64c, ++ 0xe829e889, 0xb8bf43d5, 0x174035f2, 0xf4718bd2, 0x11e72f8a, 0x62ed8ff2, ++ 0xfbf81e3c, 0xbee3eff9, 0x3ead6fcd, 0xf3c543c4, 0x7ce3765f, 0x9cb528ce, ++ 0x3abebfcf, 0x54d1cf03, 0x9d0ca1a8, 0xf15f9e52, 0x7fc403cc, 0x903c4f0b, ++ 0xfddbf7c1, 0x4c5ce259, 0xc173ce16, 0x9e69b3d3, 0x7c482ce5, 0x7e75f158, ++ 0x857dfe8f, 0x4090be95, 0xb8d90e4e, 0x9b66761d, 0xcf133695, 0xfb8242e0, ++ 0xe1cb2f18, 0x2e078a16, 0x03cb78a5, 0x5b13fec6, 0x36fbf046, 0x364daf4e, ++ 0x2c1bbce3, 0xbbfcb125, 0xe90db1a3, 0x3fb07674, 0x35c8e313, 0x7c09094c, ++ 0x5da09748, 0x4cd4c4f9, 0x55e6274e, 0xd03d448a, 0x1f3193ff, 0x7ea9b7cb, ++ 0x1ea9a17b, 0xdbdb94bb, 0x3fd172ff, 0xed093b8c, 0x601933d7, 0xdf98260f, ++ 0xf83f3139, 0xf862c6d3, 0xb9de462c, 0xcb58effc, 0xff90dde5, 0xfc52f4f0, ++ 0x70afdffe, 0x687ac239, 0xa2b8c0bf, 0xf0fdf499, 0x83f4892c, 0xc9134595, ++ 0xc8550ef9, 0x3c7bf9b9, 0x15f8c0bf, 0xf87b8f5c, 0x2549fb06, 0x5b7d903a, ++ 0xc7ea09be, 0xd7ec55ea, 0x435db7dd, 0x7d0a178e, 0x1f4e2070, 0xafd3a7b0, ++ 0x4ab71f6a, 0x6bf37f0d, 0xaf20bf28, 0xafca2f21, 0x9c31ef4a, 0x37f47ddb, ++ 0x9edc8377, 0x6b72188b, 0x72f1abd6, 0x3c67b15b, 0xe7b7244b, 0x50963e9c, ++ 0xa13f216e, 0x89db3adc, 0x7ad1ff9f, 0x5be3c0d5, 0x48b9f336, 0x87f64f43, ++ 0xf93d78cf, 0x426f369f, 0x5e7f093d, 0xf97d4561, 0x8343e0d1, 0x5dbf2aff, ++ 0x7ab9e74d, 0xc3e0d4f8, 0xf8353e1e, 0xd23c4fb0, 0xeff8c784, 0x61bfe2cf, ++ 0x2a03810a, 0x0eabcfc5, 0x733ce24a, 0x71a0d8e8, 0x2d3f2f84, 0xd8f9ac73, ++ 0x3858b4a0, 0xe247071c, 0xe0e3fbca, 0x60f95c40, 0x2a6b5c1c, 0xa8ffb55f, ++ 0x46c70fc6, 0x15e4e54d, 0x90fec5ff, 0xac603e20, 0xefad3543, 0x0fe42169, ++ 0x57d53767, 0x0b90b157, 0xca2fe5e3, 0x02ef2f14, 0x7e81af1c, 0x86e776ba, ++ 0x5647a043, 0xa57c79db, 0x835b5d3b, 0xef4baf7a, 0xd95da376, 0xbe71e76d, ++ 0x3bb740ae, 0x3b9ec625, 0xbd265075, 0xa5661edd, 0xba4efc89, 0x6cf80ae1, ++ 0xe77dfd67, 0xb42efff1, 0xa9bfa1cf, 0x056733b2, 0x659a65c6, 0x7f393f3a, ++ 0x3c6e9de5, 0x3075d237, 0x90658bff, 0x3227e0bf, 0xf90c8edf, 0x7f18ac95, ++ 0xda161def, 0x7dc2513c, 0x27c4f5ea, 0xff720ef3, 0xc4fafe6f, 0xea295f7c, ++ 0x6b973b95, 0x6fc15fa8, 0x7f762b7b, 0xe2a768c3, 0x83fcb8e9, 0xa3e42eff, ++ 0x951ce299, 0x83dfcc3b, 0x62504e22, 0x8631f217, 0xba7e118d, 0x865df625, ++ 0x17c172a9, 0x5d0e80cb, 0x218665c7, 0x65070b86, 0xdd85c3a2, 0xc5009cfc, ++ 0xbe446ff3, 0x68bd26ee, 0xe503abe0, 0xf5fe9ae8, 0xdfdec755, 0xf9057d15, ++ 0x851bdf65, 0xc76905ff, 0xff87d7be, 0xbdefe100, 0xeb06f396, 0x21f27e5b, ++ 0x749fed3b, 0x9f11721d, 0x8bf8bd77, 0x7c20af9c, 0xeb714ac0, 0x141f43ae, ++ 0xad74df22, 0xbea056b2, 0xfdcc1aeb, 0x3f17fad6, 0x75a76c28, 0xb7e881b6, ++ 0x7b71aed4, 0xbfc7e0e9, 0x17a473c7, 0xd0acc20e, 0x20e4388e, 0xbef9aa39, ++ 0x5d6ce29d, 0x14507e2f, 0xadfc0feb, 0xf62259f3, 0xac5cbb35, 0x2f8e0f6c, ++ 0xd507ef85, 0xedc6e0fc, 0x47dcf12b, 0x1e6d61eb, 0xc3fc9f7c, 0x1ea214bf, ++ 0xedc3daed, 0xfdb54ea3, 0x7bb7dc19, 0x1bb7ed78, 0x2757a054, 0xb040d30a, ++ 0x4c75d647, 0x7dbaf3c1, 0x8a17f2f1, 0x3e2d5e1f, 0x832ffabe, 0xf5cfc90f, ++ 0x268c2b9c, 0x1f43e4c1, 0xd40dfefd, 0xc4ac8707, 0xcf7cc697, 0xdd925645, ++ 0xef79a572, 0x6f371ff9, 0xf3357a29, 0x3e4ff13e, 0x70f13bef, 0x72bef8d0, ++ 0x5fcf97d0, 0xe7e0907c, 0xef1a3e5c, 0x7bfbf255, 0xfb371e76, 0xa7ff9d67, ++ 0xa01efba6, 0xf3cafbbb, 0xb9fe93d6, 0xdd3fdde7, 0xa09f727f, 0x5ee78ebb, ++ 0x17f87e6a, 0xd5a7df1a, 0x7fa4be73, 0xec37be4d, 0x5f1675fa, 0x72c7de33, ++ 0xeb00d7a0, 0xa335d3b4, 0xeb88c309, 0x7ba0cc46, 0xef3f729d, 0xe249cc6d, ++ 0xf12c93fe, 0x60d81977, 0xc263f71e, 0x0be3c29f, 0xc9d03f74, 0x4e29f9ef, ++ 0x29908f7e, 0x66977a3e, 0x7d73b5dd, 0x5d88a674, 0x7088327f, 0xc51f44f6, ++ 0xcafce3b5, 0x25f98906, 0x6b956bb0, 0xfa38edff, 0x4b08ea37, 0xe9485ad4, ++ 0x451b4c29, 0x35d552bc, 0x2ce3df93, 0xaf76c330, 0xf68ab619, 0xdf8f8c6c, ++ 0x8c6161e6, 0x8f23cb5b, 0x4e6e78e8, 0xbc30a31e, 0xcd676087, 0xac2ff421, ++ 0x5bfd731e, 0xce299892, 0xd3f4ed9b, 0xd85579b9, 0x6fd053a3, 0xc03b3841, ++ 0xd84ebf68, 0x9f9a4aa3, 0xbac8c3ee, 0xa289ce8f, 0x4305105f, 0xdbdda5ef, ++ 0xfe713e29, 0xc05f53d9, 0x81fe2cf1, 0xcf806ccc, 0x162eddce, 0x584afac5, ++ 0xb2a77f43, 0x0077a655, 0x9a2d1299, 0x68efb319, 0xbf8b99d8, 0x54f9a2e3, ++ 0xa786b1ee, 0x7dcafd41, 0xf5a4287f, 0xd937557e, 0x2567a1cd, 0xbb0d0b5f, ++ 0x15f710bd, 0xef6e152b, 0x5577d3c6, 0x3bdff712, 0x30ca380e, 0xe4ed204e, ++ 0x232b49e7, 0x98d6aa77, 0x250f3273, 0xe23946a9, 0x892ed0bf, 0xe30493bf, ++ 0x68c73d8b, 0xbb1db9d8, 0xfdbe3e24, 0x5203bd2a, 0x4e85f3b9, 0x9e54778c, ++ 0x5cd0fab4, 0x1ef9d9ac, 0x7f27d7c5, 0x3b7739e7, 0xc9b275f9, 0x5fe3edcf, ++ 0x1f8994ee, 0x9356b496, 0xf1300bbd, 0xf08892c5, 0xffa53ee7, 0x2f3bf8b3, ++ 0x4e0bc3ee, 0x2dfbbf8b, 0xce53c637, 0xc9b8b5b6, 0xf979dccf, 0x7f1f4f78, ++ 0xf856b232, 0xef179f93, 0x27f62651, 0xc03fe2cf, 0x149ddafe, 0x1cef97e7, ++ 0x4645ee20, 0x2ef72e8b, 0xdee7e2cd, 0xa1e3067f, 0x3dce7b1d, 0xfaaee383, ++ 0x419e9feb, 0xb21d95fb, 0x522fb8eb, 0x14abecf3, 0x1dea323f, 0xcff1e24b, ++ 0xa2df5dce, 0xf8275bf8, 0xe75ad8f3, 0xd072678b, 0xe17ce98f, 0xcff40ca3, ++ 0x9538bf97, 0xbe5945de, 0x4b267277, 0x8a46ff20, 0x8abe1bfc, 0xdd3c5ff8, ++ 0x251eb68e, 0xd03cfb3b, 0x9e9cfd1d, 0x9aa44138, 0x22bc5fc7, 0x713bb03e, ++ 0x3c4fb5bc, 0x17e675a0, 0xc2f3c16f, 0xd50faaad, 0x02e315c8, 0x473d00af, ++ 0x771d055f, 0xe44ff88b, 0x0b8d97f3, 0x007fc79c, 0x6498febd, 0xdfbc0b8e, ++ 0x781be0ba, 0x0eb595ff, 0x102e37e8, 0x19fc0abd, 0x9217dcf1, 0x2849ddfc, ++ 0x4dbe7b6f, 0xdfa418f1, 0xe7709834, 0x60e7ef73, 0xb51dfc3c, 0x0f7a3efb, ++ 0x8eab45e2, 0x8be56dfe, 0x753c91af, 0xf1413dee, 0xaae22652, 0x0fe7ac9d, ++ 0x33897f8f, 0x5c3b357e, 0xe8209e3c, 0xaf06f180, 0x5c45f29b, 0x11b5f381, ++ 0xce2fe86f, 0x2791c230, 0x78f1ebce, 0x378ef548, 0x4bdeff84, 0xd2026937, ++ 0xe365d4eb, 0x741e06e3, 0xb10dc3c4, 0x71c4b471, 0x5a389e9d, 0xf88cdd1c, ++ 0x0c9c4f59, 0x978c6ce0, 0x12d7a584, 0xb73b65c5, 0xa75bf8f2, 0x8f7cf89a, ++ 0x77cb5711, 0xf86dc9c4, 0x5769e2ea, 0xc5a7c79a, 0x978700d3, 0x57c78dda, ++ 0xf58927c7, 0xeae3897b, 0xddfbc3f6, 0xdf32a9af, 0x835970af, 0xdfb81d53, ++ 0xa34a7ad4, 0xb7e0650b, 0x8cec6207, 0xb19e710e, 0xe29959e3, 0x47226b2c, ++ 0xebc7bf49, 0x2f3f630f, 0x6265bc7e, 0xf3f64bbc, 0x8f63a3f5, 0x7684ec2b, ++ 0x201c8e3a, 0xfbb25ebe, 0x8e79c514, 0xd6aefced, 0xe2deb31e, 0x998e11fa, ++ 0x87f3c74f, 0x30dc790b, 0xe536fbf1, 0xd4d76e0e, 0x4fdc4c1c, 0x4cf7eecd, ++ 0x450e2cfd, 0xf53e7e34, 0x559dfdf2, 0x7b6277fc, 0xba54db67, 0x22367a5f, ++ 0x3fda2697, 0x8aa1ddbe, 0x4f3374b8, 0x73a51d61, 0x7df827e7, 0x272f7190, ++ 0xe5ed39d1, 0xc0df4a27, 0x8396c0f7, 0xd97da358, 0x69f392ba, 0x07fa7feb, ++ 0x4f5bbd21, 0xfae32ddc, 0x1bf10fb5, 0xbd166763, 0x05d93b52, 0xcde8a1fa, ++ 0xd76438c0, 0xc373bd78, 0xfc698b49, 0xae264fd0, 0x0ed00d0b, 0x73c02fde, ++ 0xd91e3858, 0xe38a525d, 0x6e8b7591, 0x566e704f, 0xa17b8a75, 0x37555da2, ++ 0xf8676b9f, 0xd3b4170e, 0x9f38d239, 0x3c464814, 0x9b36dfbd, 0xf240b6a7, ++ 0xbddfcee5, 0x4766f423, 0xaf458f9d, 0x1054f7e1, 0x97e711ae, 0x2d1e0e2b, ++ 0x11583d41, 0x93be1891, 0x933588b1, 0xa4736cdc, 0x6625f388, 0xe0f2a2bb, ++ 0x657ca9af, 0x98bf2f2b, 0xde3ca845, 0xfbb58967, 0xe36323aa, 0xdfce11ec, ++ 0x49dce25d, 0x744587d5, 0xe718d10e, 0x1d4fc11e, 0xcf49ba75, 0x9cf8e157, ++ 0x8da92f78, 0x0c8ea9fa, 0x9463f530, 0x66f0feab, 0x4ad57b53, 0xf55bf11b, ++ 0xfca39f87, 0xf3aaf91e, 0x6ffa1e10, 0xdc69907f, 0x48dfedbd, 0xb6fb1fe7, ++ 0xe3f2913f, 0x667aafcf, 0xd66538f0, 0x09cd234c, 0x190cfea3, 0x93ca87f7, ++ 0xbf80f5c2, 0x12f83d36, 0x6b8f03ea, 0x198fee53, 0x8134dbbe, 0xd2ff81ce, ++ 0xb83bce21, 0x779f9b99, 0xb02c8670, 0xb7cd7f0e, 0x4644e36d, 0x765e19e7, ++ 0x60679ec4, 0x23d442d1, 0xdf3eb946, 0x643bcee3, 0x85501563, 0xbe6718b2, ++ 0x7eafa778, 0xc21b7bba, 0x7bf8bb4f, 0xfbac3963, 0xd86f9e30, 0x5c87fc2e, ++ 0xf7e64f8c, 0xb3ec777d, 0x369637be, 0x10e978b9, 0xeb39ac1f, 0xdef04b53, ++ 0xc59dda4c, 0xc1d20c2f, 0x4af8b06f, 0xda7c9cf0, 0x64c78ab7, 0xfcecdc01, ++ 0x557f8729, 0xe007263c, 0x72af5d67, 0xe744b178, 0x591f3b60, 0xc2fe825d, ++ 0xb3d3d667, 0x3d663300, 0xdfc467fd, 0x779bc0f9, 0xb9e2f02c, 0xbc4d6e8a, ++ 0x72c01047, 0xfc702783, 0x7cdf3b65, 0x21c1fd01, 0xa895f696, 0xe2f1be5f, ++ 0x7f742907, 0xa873bc51, 0xe91d06b3, 0x2e135908, 0x5e7ce65d, 0x058e779f, ++ 0x094e8d3f, 0x1fc09c3a, 0xa08ce76b, 0x56bebd77, 0xcfc6c331, 0x47cf9a01, ++ 0xe88d3d30, 0x95d05f3a, 0x0b96fb89, 0xca167cc4, 0xc4078d21, 0x237ac59b, ++ 0x550e5fde, 0xfdea9fc9, 0x21ae3165, 0x23df7ece, 0xd3a673cb, 0xc694647b, ++ 0x67f647bf, 0xe6286047, 0x987f9567, 0xbc6e7c83, 0x4eff162f, 0x2dba5319, ++ 0x6df9ec89, 0xfeb29de2, 0x3389fbc6, 0x9fb63d78, 0x9eef43f7, 0xa36720e3, ++ 0x3c3e6be7, 0xc57a39fa, 0x7a429f38, 0xa89f9f80, 0xe7c3f411, 0xc3fee912, ++ 0x6bf68c83, 0x1f92acbb, 0x2faeeefd, 0x66feb4eb, 0xfe469fcf, 0x3723976f, ++ 0xba8ce782, 0x7da5e2be, 0xfc1de33d, 0xa39307c1, 0xc3c93776, 0xb87938c5, ++ 0x737fe668, 0xbc975dbf, 0x3da9dbfb, 0x0607b45d, 0xd8fdcc75, 0xabaf992e, ++ 0x1a5e755d, 0x3a1660c7, 0xd5da768c, 0x29dd37f6, 0x1f416bec, 0x58ccfbc0, ++ 0x3fd9dfbc, 0xf416eefd, 0xfd113bbb, 0x738fdfe2, 0x63f78339, 0xc7e533b9, ++ 0xf8b91de8, 0xe9e2e377, 0x3f34a35a, 0x33565785, 0x7647be0e, 0xd1b74182, ++ 0x7d10c62b, 0x8958e862, 0xe0fa3f7c, 0xaf1c167b, 0xfb27bf41, 0xa0fe4739, ++ 0xf11faf93, 0xb59465fd, 0x28260c0f, 0x35e9d2bf, 0x5b42ebe9, 0xf9014f91, ++ 0x78f0b4cc, 0x52f2df51, 0xfb40f9c2, 0xdf3b9779, 0x76f3a859, 0x38f5ff01, ++ 0x8dff031f, 0xfbdfa14e, 0x961d7fe2, 0x7a53fc03, 0x0c7ff815, 0x7f87f5cb, ++ 0x2c5b4fc3, 0xdc62c2f4, 0xf9fe02af, 0x464677a3, 0x225bf41e, 0x17ff893b, ++ 0xff62c8b5, 0x654bbf92, 0x374591e8, 0xfbc61ed6, 0x2ebe8b90, 0x17ce9f11, ++ 0x139e50ef, 0x9fc650ef, 0x0b2f2c17, 0xf2bc9e91, 0xe930c1b9, 0xcd3bc5a1, ++ 0xf97b3bf9, 0xf9ce8736, 0xf46684a2, 0x8f199bbe, 0xa14e0bff, 0x2ddbe62f, ++ 0xc66befb1, 0xad7061d3, 0x3cbe74c5, 0x3b4f726b, 0x2c7bb7e4, 0x3e28d7de, ++ 0x619553f7, 0xa4afc7dc, 0x11f7a38d, 0xb05349c6, 0xb72162dd, 0x56437b46, ++ 0xdcb4ed98, 0x61fef990, 0xfef9937e, 0xf366b0e1, 0xb66bc3fd, 0x8e1fef98, ++ 0x1fef9b0c, 0x7af3b75e, 0x722a3c13, 0xe8fca993, 0xf04c93fd, 0x99bfe898, ++ 0x3e3d8fca, 0x6f8f04c3, 0xfe54dbbb, 0x4d739386, 0xaf6c6fdf, 0xf9bf7d34, ++ 0xf826659d, 0x30ffee96, 0xe02e8f95, 0xdd48f17a, 0xafbc228a, 0xc8e5e060, ++ 0x63a2cd52, 0x16e1d2fe, 0x3f3630bd, 0xc42defc3, 0x7e8fc8b4, 0x32f27f72, ++ 0x5150f6d9, 0xcc5cfaec, 0x9b5e9354, 0x9dc3336c, 0xe657e14e, 0xf100bf00, ++ 0x572714ff, 0x9aab6a83, 0x70380386, 0x873a50d1, 0x5175f20d, 0x578bb7e8, ++ 0x263edfa9, 0x5d125af9, 0x7cbc7083, 0x400def19, 0xd8efe21a, 0x9f1f77f1, ++ 0xd4f99bb2, 0xb15e8fd3, 0x3ff38cb9, 0xac4e3ccd, 0x4c558d97, 0xbfe46272, ++ 0x5f362e33, 0xce8d385a, 0xaed7f4ff, 0xdd7799ea, 0x6a97d00e, 0x8d4a1cd6, ++ 0x8965d5fc, 0xcf24af7f, 0xe76dfd25, 0xb1f4b7e2, 0x685cf29f, 0xbcbda53f, ++ 0x2dadcf19, 0xfc9ba7b9, 0x19ab2cdd, 0x7f30bd2f, 0xcf18d85f, 0x00ac75d3, ++ 0x5ee379d7, 0xc44802db, 0x5df34d7a, 0x0c8cfaf0, 0xdd906f3c, 0xc73c1f8f, ++ 0x33f5f5c5, 0xe6eba175, 0xcd98e123, 0x273c9f74, 0xf682535a, 0xce7110fb, ++ 0xf125b37a, 0x055ba7f9, 0x9151325e, 0xd4e09da2, 0xbe7f7e28, 0x3e374dfc, ++ 0x0d655471, 0xef82eade, 0x15b74773, 0x3d3f7789, 0xe3bd5c33, 0x8e51f436, ++ 0xde99b033, 0x8d3307f3, 0x7990beff, 0x04f7993c, 0x7be1734a, 0xe7c5aa43, ++ 0xc25bb824, 0x1987b4fe, 0x1be5001b, 0xf8d32afe, 0x48dc8e1a, 0x673482e7, ++ 0xc6e3e290, 0x3738993c, 0xbc07ec60, 0xfc8b369f, 0x7b6b86c3, 0xfbd105ee, ++ 0x033bef32, 0xfbeed86d, 0x9efe549b, 0xf4c924e5, 0xbcd9c73d, 0xa38c18f4, ++ 0xf141d5bc, 0x17cb6541, 0x3cd1bfc8, 0xcf0d3c7c, 0xa25b2c48, 0xb638f0f1, ++ 0xf003e39b, 0xdbd13b70, 0x62d17b9f, 0x57be1a4c, 0x5f746b27, 0x713f7074, ++ 0xf18c8784, 0xe89847fb, 0x798d759c, 0x27a6f2dc, 0x73c31e96, 0x3e1d7b1d, ++ 0x175c3a6c, 0xcf357415, 0x8cda757b, 0xf785de2f, 0xe9915eeb, 0x3b6f6bbd, ++ 0x1f34a963, 0x804e1c39, 0x306e8377, 0xfc7087fe, 0x9a1296f2, 0xf7a0ae6f, ++ 0xae37a042, 0xa04b1e03, 0x619fe894, 0xf8df3861, 0x1c848479, 0xdce974af, ++ 0x7394f78f, 0xbfccf3f9, 0xb7b4076e, 0x7aefd5da, 0xebe2e4df, 0xf69fa53d, ++ 0xb2aadefd, 0xca9863b6, 0x0cec997e, 0xc7876ac6, 0xbfa0cdda, 0x1aed8abe, ++ 0x70fc9cb0, 0xbfdbb621, 0x1a6c167d, 0xfb657b9e, 0xe432ed0c, 0xdb2ec33f, ++ 0x18bf371a, 0xc5c3bb7d, 0x57a52df5, 0xe1776fa1, 0x1ddccf78, 0xa4cf684d, ++ 0x5df5896b, 0x8d7fc0bb, 0x0f3a31ae, 0xcd7ecfd8, 0xed895daf, 0xa3d6feb8, ++ 0x791bf92b, 0x0d4f830e, 0x0efdcf3d, 0xfed1ae56, 0xe1e385d1, 0xbf71c3b5, ++ 0xe74793d3, 0x676bfb79, 0x8d2f8ad0, 0x7819fa45, 0x6ccba9fb, 0x7f1e039f, ++ 0x8bf8f021, 0x02ac7884, 0x784c5a3c, 0x1975d97c, 0xeb33f0bb, 0xbdf30af9, ++ 0x6f814e9e, 0xc5dff7d0, 0xfccfcefe, 0x31c6117d, 0x48becc96, 0xf733fefa, ++ 0x4f5e6653, 0xfa1c3f0c, 0xe9fb1e79, 0x1157f99c, 0xb8a76d3f, 0x6bdefd5f, ++ 0x58ce3192, 0x6f47a93d, 0x987db8d8, 0xfcf07a47, 0xc71fab3e, 0xc7953e79, ++ 0xbbefce9f, 0x39c618e1, 0x4f1dd5ce, 0xf9efa58d, 0xa9144fe7, 0x3df9ded0, ++ 0xd2148a27, 0x3bd361e3, 0x7e97d5d0, 0xf670145d, 0xe1e843de, 0x875f1b37, ++ 0x3c79d936, 0x173c49e5, 0x55b19a37, 0x3be10a7a, 0x81b2c333, 0xfdb70bde, ++ 0x78dbe07a, 0xafb8fcc5, 0x2f564018, 0xa016b3f9, 0x24e39d1e, 0xb3e4f17e, ++ 0x4f50b911, 0xf1e2d68b, 0x79ff6665, 0xfd3be198, 0xf4a2578e, 0xcdebbf5e, ++ 0x495eda76, 0xc4ad9b7e, 0xf4dbe8a7, 0xda1bb260, 0x4af0e94f, 0x757f00c9, ++ 0xfa0f58e8, 0xae64cafc, 0xb2efbb7f, 0xd2d77bd1, 0xf2db9fbc, 0xccb72f81, ++ 0xe3eff850, 0x82979f1d, 0x9d2ec87e, 0x19e067bf, 0x64c7c3d2, 0xf02acf0f, ++ 0x984c5ede, 0x023bd3f7, 0x90e9ceba, 0x5b59659a, 0x82b4fd0c, 0xbc050c5c, ++ 0x3f16bcb9, 0xe8987dff, 0x78866b25, 0xadee5397, 0x5cf510e7, 0xf893d1d9, ++ 0xcd38f85e, 0xb8a193f7, 0xe2ca32ef, 0xc479f7a3, 0x46c98abb, 0xcb5f713d, ++ 0x97a2e7b8, 0x76c3df9a, 0xc52cd605, 0x27e716fd, 0x52cadab7, 0xf316fde9, ++ 0xb8eef177, 0xdf399c73, 0x5bd89011, 0x5f177c31, 0xe1bcbe2f, 0x7cea6477, ++ 0x6ceafb1c, 0x75fddf34, 0x08286fba, 0x3cebf7d8, 0xf3ac1e94, 0xbaa1fe52, ++ 0xeb469411, 0x83a6947c, 0x81edc01d, 0x00f78dda, 0xe3eed21d, 0x7c1bfaef, ++ 0x7f1d48f4, 0x5607bb9f, 0xddf12723, 0xc85feeec, 0x3f959784, 0xbcfc4b1f, ++ 0x3ef41479, 0xf357bf9a, 0xfd9d8c56, 0x659f8ad4, 0x917d014c, 0x324fd0f5, ++ 0x6d3f00a6, 0x0bb9f896, 0xd8a517b0, 0x5af5e4fd, 0xc14bebc0, 0xda98addf, ++ 0x78458368, 0x8bbc1ab5, 0xa162818d, 0xe47ffabf, 0x7839dfc1, 0xdf02cb3c, ++ 0x1a9b944b, 0x71c39f6d, 0xf9ec9ad5, 0x663ce2f5, 0xbf7e24cb, 0xd7bfc8d7, ++ 0x4eedf5cd, 0x775ef8a9, 0x37c1fe02, 0x9a9fc9fc, 0x30779c6d, 0x802993e3, ++ 0x23f9c017, 0x24bc72f7, 0xf87d63eb, 0xdc8ffa9e, 0xdfc33d86, 0xfbfa3191, ++ 0x8dddf891, 0xb88b23e4, 0xbfe1e3fd, 0xf1a69177, 0x30588ef7, 0xdfcef4d5, ++ 0x084ed13a, 0xff7c6919, 0xda24377a, 0x00f4771d, 0xfc007dc3, 0x7f58875d, ++ 0xff08eb3e, 0x422d8a1d, 0x03d02d2f, 0xa35f3855, 0xbe3df19c, 0x4bd6919e, ++ 0x473c7ac1, 0x22c51a1b, 0xae58df28, 0xbfa5ca18, 0xc2677fc9, 0x57bb4738, ++ 0xbdf8d9e0, 0x5c493f91, 0xb489cf2e, 0x5de7a453, 0xdf094781, 0xcf669ef3, ++ 0xf7aafe01, 0x3628bd59, 0x447e8ee3, 0x09fd75eb, 0xf9e786cd, 0xa29e0fd3, ++ 0xa97accfd, 0xf453435d, 0xb79df779, 0x5eb4bc61, 0xf0e2cdad, 0x6f184d5d, ++ 0xfb55d27d, 0xc8f1ff14, 0x7e436f3b, 0x0aef14c8, 0xdea08720, 0xf01bb56c, ++ 0xc83f46ac, 0xe1caab4c, 0x1b33dde7, 0xd708d943, 0x0977c1ce, 0xf6806e10, ++ 0x83fc535b, 0xd29c9f90, 0xb7e3c6f4, 0x9f946c20, 0x14ef88de, 0x7ceb72ec, ++ 0xcc19c6bf, 0x07a53b45, 0xc57601d6, 0x99870ac0, 0xfcc6a78d, 0x447e8faa, ++ 0x1c979de7, 0xa571efe4, 0xe12e9c1f, 0x4ff7d33c, 0xd05ffc27, 0x7a57ba4f, ++ 0x9c3dee29, 0x2e3c0faf, 0xb8c3d06e, 0x1ad53b6f, 0x263b81fc, 0xb73df3fe, ++ 0xcc9d6f58, 0xd0bf7b19, 0xb4f5ca2f, 0xaae8e227, 0xd29bbf85, 0xf9d194bd, ++ 0x9dacc1e8, 0x221b8fde, 0x172c1f7e, 0xd191f7df, 0x1aaff435, 0x70efdf08, ++ 0x61de7df3, 0x9b5f73bb, 0x3bf97aca, 0x1fbb50ad, 0x9c7a70f5, 0xd093731f, ++ 0xc5eab7cb, 0xba43271f, 0xbbd00a49, 0xfc03a154, 0x99db271e, 0x21d4f245, ++ 0x66b9d674, 0xae9dff0b, 0x5f9481da, 0xabbbee25, 0xe81b22ab, 0x539e2df7, ++ 0x717b9f69, 0x7ae3246e, 0x643aef67, 0x14e2dff0, 0x37dc6f9e, 0xb38c7845, ++ 0xc9719f77, 0x78398dfe, 0xc3dde26e, 0x9e1d13af, 0x41a5ce4c, 0xd09eb757, ++ 0x77da2e82, 0x7ac170d5, 0xfeb3ded7, 0xdabbbad2, 0x99be4bee, 0x8f7a35eb, ++ 0x85f3476d, 0xe76f11db, 0x7e98b61e, 0x8f48c34f, 0x41ce21d4, 0x4160ebde, ++ 0xa8e01f05, 0x019feeca, 0x23d39ced, 0x0edf1c6e, 0x745ae07f, 0xffc92c09, ++ 0xf41d9b71, 0x5f9e4b59, 0xcb3e80b7, 0xd1b1ac7e, 0xa2d6fc06, 0x1f9123e9, ++ 0x343793b3, 0xb62fbf22, 0x19c7e2cb, 0x1fe4bc37, 0x0055ce2a, 0xcfc3727c, ++ 0xc9fdc36e, 0xcc9f6ccf, 0x3541db37, 0x0bbef89b, 0x325227d8, 0xd20965e0, ++ 0xad8b6003, 0x6739ee8d, 0xaf486d23, 0x6e65ef99, 0x0c9eb892, 0xe7f1e6cd, ++ 0xaccfdd2b, 0xc2c1d0f8, 0x93f87631, 0x7f03e8b8, 0xda212854, 0xd0f8aa8f, ++ 0xf6ffdf4d, 0x7ba6ec7e, 0x71fb7da0, 0x9fa377d2, 0x287edeaa, 0xfaf55b3e, ++ 0x8fcff211, 0xd9d86b5c, 0x96175a7e, 0xcbce20bf, 0xd899fdd8, 0x132a93ce, ++ 0x0b7f01f4, 0xef6f4cf0, 0x80a43873, 0xa3da3a3e, 0x4e36b68f, 0xc6fa46c9, ++ 0x2609a7e8, 0x8057e57d, 0x0493476e, 0xb895da1c, 0xf95c527c, 0xd3de033c, ++ 0xdf626538, 0xef693cf1, 0x5e506d85, 0x07b58bf9, 0xb46df1c6, 0x6a97b5c4, ++ 0x6a7dfff4, 0x93bfe0cf, 0xe12fa3ee, 0x53474f3b, 0xbe78c502, 0xf3367bac, ++ 0x437c3ca2, 0x62fbb6e9, 0xcdd270e8, 0x1f150de3, 0x7fc2675e, 0x4d0bde2f, ++ 0xbcea67f9, 0x85eb7da6, 0xf74cbfbb, 0xdf8a4e7d, 0x2160aa29, 0xe9ed8f7e, ++ 0xf57ed37c, 0xb3e38dff, 0x9fb8a38e, 0x07f94c71, 0x49a4638f, 0xa38ef40f, ++ 0x59ff94c0, 0xcca721c7, 0xfdc5cd2a, 0x7a1695a9, 0x12c332af, 0x3da1e5b2, ++ 0xfc85a0f7, 0xf16d3414, 0xce1819dc, 0xf5bfdfa6, 0x41ceb41e, 0xb0abdcfb, ++ 0xca2a4ae3, 0xbf8bdf93, 0x407a14fb, 0xf20b75a1, 0xa8f5ea6d, 0xf8fd9b0a, ++ 0xc15b15ee, 0xfcef3da8, 0xfa373560, 0x17377e63, 0xb159d1fb, 0xf4d3f902, ++ 0x7a0eb439, 0xc1ac1ecb, 0x699d5b72, 0x2666aecf, 0x657b2579, 0x0e74b4b5, ++ 0x4bdfb7da, 0xed11a37e, 0x6e24cc9b, 0x8dec48df, 0x2637e3c6, 0x75e5cefa, ++ 0xdc6f63df, 0xf08cf186, 0xfa2d762a, 0x387b6175, 0xb0e90472, 0x78f649da, ++ 0x26e123ee, 0xd6bcbf9c, 0x28dbbf42, 0x6e7784a7, 0xe1d1f843, 0xc237b43e, ++ 0x76bf5c29, 0x3d9274af, 0x542ea6b0, 0xd4b2ef84, 0x6075f337, 0x1d44c35b, ++ 0xc1a16f7f, 0xefc15809, 0x785ded6a, 0x8f4fe4af, 0xbb68d47d, 0xaf98f511, ++ 0x61ce8069, 0x6bae164f, 0x4636cf2c, 0x2e75877c, 0x440d92bc, 0xf380d257, ++ 0x0a5602ff, 0xc88f99e9, 0xce706b2e, 0xfebc64a8, 0xbc1f784b, 0xf10f47a5, ++ 0x0473f8ef, 0x51802784, 0x7b2bca0f, 0x79814fbf, 0xd73aff6f, 0xfb41af53, ++ 0x7cc1a768, 0x0c376442, 0xf63e6853, 0x2c9bfe14, 0xb47991f6, 0x73b6191f, ++ 0xff247bb8, 0x6923ec6e, 0x8fb42cc3, 0xb0f81764, 0xdaf2f167, 0x0a2f99e7, ++ 0x5272e6b0, 0x3df8c41c, 0xfe33274b, 0x54bc79f8, 0xe124b3ec, 0xfc31083b, ++ 0x46586b68, 0xeff1e89b, 0x9fbfc729, 0x5cdf30ac, 0xdd64bbb4, 0xb271ff9c, ++ 0xe54a57d8, 0x6f993fbf, 0xfcfed209, 0x76442c35, 0xa513481a, 0xe528b1d7, ++ 0x04ed628f, 0x34af468f, 0x7967af1f, 0x9f3285c5, 0xc664f68c, 0x2b7c465d, ++ 0xaeb8eb28, 0x147ec2eb, 0x369b5bbf, 0xd3ed3e7d, 0x22587fff, 0x80000e1f, ++ 0x00008000, 0x00088b1f, 0x00000000, 0x7dbdff00, 0x55547809, 0xb57df096, ++ 0x542aaa57, 0x646caa92, 0x280810a9, 0x89212b01, 0x849520a0, 0x152da8b0, ++ 0xb16406c4, 0x4d900d58, 0x65ba6da5, 0xe90414be, 0xba1b4c80, 0xe9569719, ++ 0x5b1bb102, 0x9d1a09da, 0x558b51a8, 0x8ffa1dfc, 0x88f4ad0c, 0xb20bb576, ++ 0x3dd38327, 0x7fcb8cf4, 0xa6f7b9ce, 0x8154bdea, 0xe5e9fcdb, 0xefbbdf72, ++ 0xe7bf672e, 0x392b7b9c, 0x9677a025, 0x3fc1b633, 0x0f1ac1f4, 0x7f6b5b63, ++ 0x331409e8, 0xd7cc66e6, 0x8556e501, 0x33b0eecd, 0xe96576c6, 0x4b633a58, ++ 0xb6fe8c2c, 0xc46a1539, 0x2ac75398, 0x84e55b18, 0xacf7c27f, 0xb3b79b39, ++ 0x32ef7af2, 0x30d76313, 0xe50194d6, 0x2fb7a820, 0xe7846c9a, 0x9554feab, ++ 0x2ffd0a91, 0xffa071c3, 0xa6548f65, 0xddf01d07, 0x0f2639de, 0x02cee594, ++ 0xd6e97fea, 0x1460535a, 0xd0badfbc, 0xfde62be4, 0x0c7ce0f6, 0xea0c41de, ++ 0x83bd5bf7, 0xd63195c6, 0x76cf4477, 0xf0afe3c0, 0x72c0e26f, 0x640c0b5f, ++ 0x8b40ec66, 0x3386f985, 0x5e1e4a16, 0xd4a192c5, 0x654b1f31, 0xb3d1bf6c, ++ 0x7e82ebd9, 0x62f50e36, 0x9f24a13f, 0xa1ea0521, 0x56de3dbb, 0xf56a3fa8, ++ 0xfbe0f674, 0xeef2487f, 0x5377d0f0, 0x7fae2959, 0x08e4f392, 0x2fdf14c6, ++ 0x896caf95, 0x330987c7, 0x5f7f876c, 0x14bc61e9, 0x1edf8776, 0xa4beff5d, ++ 0x770879b3, 0x46eb80a7, 0x93b9655b, 0xcb139f4a, 0x6302526b, 0x445b5ea9, ++ 0xced57278, 0xc67b60b4, 0x6d279c72, 0x3a5d7ed1, 0xb4fec016, 0x20cfffe3, ++ 0x4b1cb7e8, 0x126f1716, 0xf22f12cf, 0x2f8a55bb, 0x789c59c3, 0xf4974d5d, ++ 0x5316942c, 0x9c99f437, 0xa26e7c76, 0x969c17e7, 0x3cc60ea0, 0x7ad81994, ++ 0x0a74a03d, 0x983031eb, 0x79293ea7, 0xab45d234, 0x96077935, 0x7d8d3253, ++ 0x5f5b4111, 0x0059ffe1, 0xc9bf3060, 0x48efcf8c, 0x4ac3e4f2, 0xa41f7e32, ++ 0x3bd9a7ef, 0xf4086c0d, 0x19bba8eb, 0x0b2378f1, 0xfced73d3, 0x630fdfa0, ++ 0x51e69dfb, 0xa11a6fd7, 0xabc0ffae, 0x241633ae, 0xd2d03d78, 0x31b1f15c, ++ 0x8c03efda, 0x0388ed4d, 0x58031f97, 0x772bce11, 0x8f1f4359, 0xd0d3f688, ++ 0x37aaa291, 0x3e856575, 0x2567198e, 0xf90b23fe, 0x9ebbaf87, 0x730e62bf, ++ 0xf788c7e0, 0xe1311606, 0x4d0280fa, 0x9b07e07e, 0x5f11f995, 0x1f56bde1, ++ 0xb26cba03, 0x015bb69b, 0xb5dd4dc5, 0x6e7842ca, 0xe47bc073, 0x6943ac63, ++ 0x40f6f233, 0xf83f34b9, 0x1be031f3, 0xfb733fb7, 0x29f88526, 0x37d476b3, ++ 0xfc23779f, 0x4ff00d6f, 0x8a3d81a3, 0x475fe9f8, 0x3d23ac3d, 0xb6f38eba, ++ 0x8e982a0f, 0x2e4ba3d6, 0x3130ba47, 0x3d745065, 0x4b5e1adf, 0xda6af0d4, ++ 0xaeea0f6a, 0x419471a1, 0x76c6b700, 0x7504d05d, 0x84c7a59d, 0xd200f2fc, ++ 0x95bc1c79, 0x687f393b, 0xf119bcf1, 0xf69f871c, 0x885dcab1, 0xe7277297, ++ 0x07eafb27, 0x831e3e2a, 0x494373f2, 0x0ddbda00, 0xe01a7e5c, 0x139066bf, ++ 0xe5e4ff16, 0x69a1a329, 0x67efe732, 0x3e543d93, 0xc415f8a4, 0x57ceba6b, ++ 0x7b190ac0, 0xd966c618, 0xbd60f082, 0x7d655b0f, 0x1526cfd6, 0x8f78bf23, ++ 0x9fc72733, 0x29ea1321, 0xc9b3fdfc, 0x5106a74b, 0x17d7f61e, 0xa3c705b5, ++ 0x3bf5947c, 0xd03982da, 0x2b6580be, 0x8ef38f00, 0x8788d3c0, 0xc2878e03, ++ 0xd69fa07a, 0x331ecc17, 0xe7ab81d2, 0x45d00083, 0xb6668bfa, 0xb9adaa09, ++ 0xa99f6857, 0x3ac05f69, 0xb613df91, 0xaef681cf, 0xc8167b68, 0x37743922, ++ 0xd24016e2, 0xb9f8e46a, 0x2833d438, 0x65dc0e25, 0x80047fa9, 0x5a772316, ++ 0xca0b5e0d, 0x3efb569d, 0xb9518b92, 0xfa3de9cb, 0x1dfd499d, 0x1c3605e8, ++ 0x43334dc5, 0x7ec7ac3c, 0x1bd7be62, 0x57ec4ebd, 0x56da559f, 0x98cc65e0, ++ 0x01aa75b2, 0x4006d8e4, 0xb18ebb2c, 0x11f7edd3, 0xf78c379c, 0x5b0f91f9, ++ 0x0eb6069d, 0x0ed6b9d6, 0x69700ec4, 0x708434cd, 0x205326dd, 0xed105c33, ++ 0xd03110d7, 0x87da2e3c, 0xb44b1e90, 0x6025d34e, 0x0eb831aa, 0x9cac667b, ++ 0xcf1bdfff, 0xe3b4ed4e, 0xdbcbfdb1, 0x8b3c600a, 0x02b5e753, 0x3b1ecc9e, ++ 0x1f8628fb, 0x1e18fdb5, 0x47edc431, 0x3fc24edb, 0x918d9e21, 0x85c7c464, ++ 0x50d4dd4c, 0x4f0f799c, 0xadf4fce1, 0x8d3cc7e5, 0x2f1f729c, 0x4af7e30a, ++ 0x80a0b924, 0x14f0c8e4, 0xc7469fa0, 0x3cf83fc5, 0xfdd2af24, 0x389ece0e, ++ 0x2acc86ee, 0x2ae4804b, 0xfd949fb3, 0x9fd313eb, 0x4de98b84, 0xf8742ab0, ++ 0x7f6199be, 0x41838257, 0x99be12f1, 0x2a9ec0c3, 0xb19ef818, 0xfe9f34ed, ++ 0x310f48f6, 0xe0dfbfeb, 0x4e363a27, 0x00fc5a08, 0x459eb5c7, 0xdbd40896, ++ 0x0b079e0c, 0x137a7ed0, 0xae0f27ec, 0x7f8a8667, 0xec09b964, 0xd3f60626, ++ 0x6a9d14cc, 0x4a4cb23d, 0x27dc7760, 0xef69b3f0, 0x65e57f1c, 0x99c407e8, ++ 0x2937e91f, 0x7d44e0d5, 0xf9f23464, 0x38dfb0da, 0x26fd91f3, 0x7b03d782, ++ 0x960fc4ad, 0xf5084b62, 0x0dbc76a2, 0x67cd3f06, 0x8827cc03, 0xfe3e1cf5, ++ 0xb9c1a706, 0x46dbda03, 0x0c4b3124, 0x33594cfc, 0x5d17fe09, 0xf787a62e, ++ 0x8f405c1b, 0xe12bd671, 0xf4e10534, 0xa032e85d, 0xef61cba1, 0xc4bd2114, ++ 0x534fe5d0, 0x72e903dc, 0x72ffca0a, 0x89667f3e, 0x41d0ff9d, 0x803af0f1, ++ 0x5374353e, 0x90f99e31, 0xdca032ef, 0xab05eb0e, 0x629eea6b, 0x1cbc079c, ++ 0x659bf307, 0xf7904e67, 0x4dcab4de, 0x3d1527c8, 0xf90c4cfb, 0xeb4dd3a1, ++ 0x6bdf17a8, 0xc0bbfdc7, 0x9c53dfdf, 0xee3a0e54, 0xc022667b, 0xc927b3b7, ++ 0xceabc0a3, 0x6b1f6e54, 0x45397bbf, 0x3b4bf611, 0xd1910d2f, 0xf6c83f68, ++ 0x6f98f315, 0x93079407, 0xf4059b58, 0x722993ee, 0x5e0bf29f, 0x6171801a, ++ 0x8cafe99c, 0x8f7641dc, 0x5041ff58, 0x3d3ed80b, 0xd15a323d, 0xedbc077f, ++ 0xe0c7d582, 0x2912c1ad, 0xbff53b42, 0xc40e814d, 0x48f1d357, 0x8f3bd63a, ++ 0xdf7b219e, 0xb0edcadd, 0x216c97be, 0xf881bba4, 0xabf34b59, 0x059834bf, ++ 0x5bc40cc7, 0xf64c21bd, 0x3ca5fd76, 0x0eeb0f7a, 0xefa3525a, 0x8e2d03a7, ++ 0x858a7dc5, 0x13e109c3, 0x14bf1f0f, 0x01f12af4, 0x21d238fc, 0xfa7081f0, ++ 0xfdebd850, 0x369b7778, 0x9cee7ee0, 0xbe673f85, 0x213f7c11, 0x4987f8f4, ++ 0xf6062179, 0x724587ce, 0x8f49e6bf, 0x56f53bd5, 0x61b383df, 0x3d6decdd, ++ 0xc58a0a7b, 0xb436f6d5, 0x7d9b1707, 0xbe781483, 0xcaf4dff8, 0x210202da, ++ 0x0152c1f1, 0x7bcc73cf, 0xb82fe22f, 0x8a7cead9, 0xc7dea7f0, 0x39543c14, ++ 0xbf7c08e6, 0x45ef4bb4, 0xb55167d3, 0x56fd883d, 0xe33d54f4, 0xdacbe780, ++ 0xfd061e6c, 0x3de89e2e, 0x1e71c7a9, 0x15d67ab4, 0x4867bee0, 0xbbf41665, ++ 0x9c0a9fea, 0xab6c0f28, 0x2f1699fd, 0x8617e280, 0xc7803669, 0x85c2cafd, ++ 0xf8a0094a, 0x068db617, 0x8be1b3c0, 0xa856b3ea, 0xce45fe0f, 0x632e4b46, ++ 0x472ca0af, 0x3b982d3b, 0xbfa9f70d, 0x475da9c3, 0xee3b2653, 0xa2758777, ++ 0xd271bc5e, 0x76aec650, 0x30ecea77, 0xc5a9d9e7, 0x7e302d1b, 0x44afaa7a, ++ 0x492de307, 0xfd86992d, 0xd4707a2d, 0xf7811edf, 0xa693a96d, 0x7801bda1, ++ 0x9b4fdf13, 0x642a0d56, 0xbf5978d9, 0x97758ac5, 0xc6ed458d, 0x873f20b1, ++ 0x3b47c744, 0xd65533b1, 0x049b4c67, 0xd5587edf, 0xfe806d5c, 0xdecea4f7, ++ 0x63157c58, 0x74ad6ed7, 0x17fc60fa, 0xf5a76f53, 0xfb649a76, 0xd07d1b79, ++ 0xf60593be, 0x91fde11b, 0x669d2c5f, 0xd2bac001, 0x584e25fc, 0x81e59a7f, ++ 0x7c27538d, 0xa1197e07, 0xee3bf768, 0xcdf13754, 0xde690421, 0xd7133eea, ++ 0x73df82af, 0xd7f71d38, 0x11dd4047, 0xf5e4cf53, 0xe5f175ce, 0x5c69bbc7, ++ 0xc526757f, 0xca9a5f7f, 0x3bc00be5, 0xecfa43ac, 0x158685b2, 0xf009e544, ++ 0xf12c6593, 0x27ce16d7, 0x1c3357c0, 0xfb71c7c4, 0x0bfca6fb, 0x3a7ea770, ++ 0xee1b3e0d, 0x035ca5c3, 0x38e1b306, 0x2a3c53a7, 0xb3d15d79, 0xcbede488, ++ 0x3d6f8269, 0x6aee3e1c, 0x96615cb5, 0x8b84229e, 0x58ba6efc, 0xe048c167, ++ 0xc023f44f, 0x573f903c, 0x8fbf6159, 0x953d807e, 0xf632ec19, 0x4aa5fd77, ++ 0xba3fbed5, 0x7cf4498e, 0x9fd0bf40, 0x2deff447, 0x4af03afe, 0x5cbc02b9, ++ 0xeb4afef4, 0xf6a7f68c, 0x8fec0c53, 0xe8062bfb, 0x79fc5315, 0x04e92bde, ++ 0x918bafe0, 0x7c84cb6b, 0xfb45a905, 0x5e2f0bf2, 0x415363b5, 0x38ebb8ec, ++ 0xdf4019fd, 0x2083bcc1, 0x558e515f, 0x61377c18, 0x549e8afb, 0x7a215067, ++ 0xcde82f5b, 0xf126f480, 0x5cda99dc, 0xa2ddeb49, 0xb1c47738, 0x9521ff03, ++ 0x768abbeb, 0x49f687c5, 0x7e80bcc6, 0xa4fccc61, 0x3bfe87fc, 0x9c65ff45, ++ 0xa7e89f9e, 0x3fc8f9e7, 0xbcc1bfc2, 0x06a3df40, 0x6133ffce, 0xafebf467, ++ 0x9c21ac17, 0xb7db848f, 0x3f697fa5, 0x53d427d4, 0x8ccf34c9, 0x3064e1e3, ++ 0x097fd8e9, 0xf8ece87e, 0xd47af928, 0xa67a5d57, 0x51baf878, 0x3948546e, ++ 0x70f37c19, 0x63b250d5, 0x43d972a2, 0x9b948cf6, 0xda258b61, 0x3796fd7e, ++ 0xb947aea7, 0xc3fc066a, 0x907a5c3c, 0x79d1a5e2, 0xfae54eec, 0xf9806c72, ++ 0x2f81d9e2, 0x1ca438a7, 0xba3c75a1, 0x847d9aba, 0x75fa17eb, 0x7e48246c, ++ 0x1c054799, 0xa110edfb, 0x239ba7bf, 0x8f7f72cf, 0x1d651e9a, 0x5d4694ec, ++ 0x7c7fb461, 0xee86233f, 0xd03a090f, 0xcabbe7e2, 0x10438027, 0xf54c60e1, ++ 0xaea1fef0, 0x00617da0, 0x3ff005fd, 0x6ef76b5f, 0xb799882a, 0xb763cb9d, ++ 0xd8e5c75e, 0x95c2f815, 0xbdf7dfc6, 0x8e7e20e4, 0x31db83c2, 0x7e5ca9bd, ++ 0x3ab1d76f, 0xd41c6fdc, 0xfd209f01, 0x2f3af9da, 0xfd4598bc, 0x7dda227e, ++ 0xbb79725f, 0x7ce3c609, 0xc363f64d, 0xabb783cb, 0x9bfbcfe7, 0x52e1c69c, ++ 0x8257dc71, 0xbf30cc76, 0x85fb8bdd, 0xfb199e8a, 0xea2f508c, 0x5ad89c56, ++ 0x075179d2, 0x2ea053e7, 0x77379701, 0x65fbf6c7, 0x5d7be3aa, 0x2671d147, ++ 0x2e7ce3c6, 0xb34a0fdb, 0xfac27c73, 0x834f08cc, 0xf2ca8e5a, 0x7f879bfb, ++ 0x5bd6119f, 0xb140f00f, 0xd9d6e12d, 0x159d70b1, 0xf338f8f9, 0xe85f1f22, ++ 0x851ba858, 0x91847d78, 0x1f2fd77d, 0x4875f2b6, 0xb2e8147b, 0x20b2e903, ++ 0x19fa972d, 0x2b67dc76, 0xd0c3f786, 0x9bef826e, 0xdc211c3a, 0x02d37857, ++ 0x9d70d393, 0xd1aafb33, 0x6b68dc6f, 0x798d6b5e, 0x0bbedfde, 0x071d13da, ++ 0x9e70a3f4, 0xcedec077, 0x340f5d13, 0xaf5fa20d, 0x5a7c04c1, 0xc230f548, ++ 0xdbc4d3ad, 0x1467cdf7, 0xf7d4688f, 0xe83df099, 0x3e889bef, 0x1152ea8f, ++ 0x426fb8bf, 0xef5eb9bb, 0x5f7051cf, 0xa2f6619f, 0x087d801e, 0x2b41fbd1, ++ 0xffa15833, 0x3944a037, 0x6bbfa35d, 0xa6abc22f, 0x8478a150, 0xdca3efdc, ++ 0xf4d37dc2, 0x47a23689, 0x433df9f6, 0xb6eb8fd1, 0x3f413c71, 0xc58fd116, ++ 0xbfe51a52, 0x15779bff, 0x7ea47fed, 0xd428a83b, 0x2309c1cf, 0xecc6b477, ++ 0x943fb08b, 0xda9507ff, 0xfe90bb9c, 0xec8ebec5, 0xef545743, 0x6a52bda2, ++ 0x507bc58f, 0x87922fcc, 0x8f6b1474, 0x6fda7da2, 0xde9f06cf, 0xf2e40538, ++ 0xc23b53b5, 0xd152273a, 0x863f69ee, 0x9ec06afe, 0x6a1c02b5, 0x2c1c5d05, ++ 0x7193ea08, 0xfd60c37e, 0x5250e8f0, 0x1ed9b8a0, 0xf85d271d, 0xdc4dd209, ++ 0xc49e910f, 0x5c69b3cb, 0xf171af4f, 0xa6512df2, 0x2bf7c727, 0xc7ef149c, ++ 0xd8fcb998, 0xbfe5c954, 0xd12addb6, 0x7bb6b7ef, 0xfed5158b, 0x55deec1e, ++ 0x35eedc69, 0xf710bf71, 0xed149f8b, 0x3c21cec1, 0x3f2aed45, 0x1da4f1f9, ++ 0xdb9ed7fa, 0xe490dea8, 0x44fc907f, 0x2abec0ef, 0x24327ece, 0x05ba7de6, ++ 0x63386708, 0x8178b69f, 0xb8fb1970, 0xe5f542c5, 0x3269fe6b, 0x160ad7f2, ++ 0xbafc80da, 0x141ea762, 0x4bfe7463, 0x193fdcd6, 0x52125ffb, 0x7dc14798, ++ 0x35da9f99, 0x69dff808, 0x40a53668, 0xa6ddb4b9, 0xf1eeaefa, 0x94baaa31, ++ 0xfededf17, 0x18a166ac, 0x2f951339, 0xb6b9e993, 0x5acf495f, 0x16c3f43b, ++ 0xf65bad0f, 0x30cd68b3, 0xbf6cbf5a, 0x7d697998, 0xd50adb8b, 0x8d247ff3, ++ 0xf9a24ee4, 0xbb44ba49, 0x9e771833, 0x0ff3d526, 0x7341fe01, 0x0d4e3ccc, ++ 0x28fc79a5, 0x7485d02d, 0x8d879d11, 0xc2c44705, 0x24f3bc71, 0x9ec195ac, ++ 0x408efd0c, 0xe9cbc127, 0x71a43ffb, 0xc3dbe0bb, 0xbb02647d, 0x57fff47f, ++ 0x1e62bfbb, 0x5dacb397, 0x2e90c361, 0xb0eda9e7, 0x2b3ea33f, 0xe426d2c7, ++ 0x8ecabb50, 0x8b16bf42, 0x9c0ddfd9, 0xeefa66cf, 0x5fbc49da, 0x0b7643b0, ++ 0xdb98b97b, 0xdbf58fcb, 0xf66373cb, 0x2997689f, 0xf8cf2885, 0x3f428d77, ++ 0x6a399c15, 0x23b8c0f2, 0x2d7edc5c, 0xd2fafb74, 0x6b66fda0, 0xa3f468f2, ++ 0x85e6b66c, 0x8ff51f50, 0xece5c5df, 0xbc7f6366, 0xb9e1033b, 0x5a7b8bfd, ++ 0x3ddf880d, 0x1c83ff60, 0x00e27cac, 0xa7c8c48b, 0x7c56ac1f, 0x5f0f004b, ++ 0x7bd73c0a, 0xef587db9, 0x42869b0d, 0x7cf5d93f, 0x7b1d395e, 0x77cc4315, ++ 0x9dbc7539, 0xf95465c5, 0x9ea21d55, 0x3872e2e4, 0x0cac2ea7, 0x8fd97685, ++ 0xd80c54ef, 0xfa42875f, 0x1019bb32, 0xecc70315, 0xfcd76e32, 0xb2bb6ca0, ++ 0x870a38b8, 0xb16d5d36, 0x96d6f013, 0x9ea2f36e, 0xd2077069, 0x13cf385c, ++ 0xf18230e1, 0x063d13da, 0xdc5bdbb4, 0x973e173e, 0x9de8f070, 0x6d47a8d9, ++ 0xdb3cf827, 0x5cc5f7fb, 0x964450bf, 0xd21de8ec, 0xb8cc3d2e, 0x2a7a485d, ++ 0xd208dd7d, 0xe97e7277, 0xa44f42a9, 0x7673c0b3, 0xf146df6a, 0x8c71e47c, ++ 0xda2bad67, 0x4e58edc1, 0xfe85357f, 0x26bcf89d, 0x56d2aae3, 0x39b85e78, ++ 0xfb84586c, 0xfbe3c7ee, 0x1e854b81, 0x8a8c7581, 0xe495c75d, 0x4c676c85, ++ 0x7c909fe0, 0x7f1a9b62, 0xcfd8c1df, 0x13e57de9, 0xbe71dbae, 0x0c4debf5, ++ 0xfe1241e3, 0x0fbf6e2d, 0xb1dd93e7, 0x48d8415d, 0x571c9ebf, 0x3df0edfa, ++ 0x2687edf2, 0xfe9ccfc9, 0xd585ca12, 0x5892df7a, 0x44deb739, 0x73769278, ++ 0xcedc7e74, 0xfae2eb9f, 0x7fb759f5, 0xb1a7ce06, 0x79f90b6b, 0x8bfcef96, ++ 0x5a9f9e29, 0x825717cb, 0xf9c752a3, 0x85b67ebb, 0x4f9561e2, 0x560e8818, ++ 0xcc8537ae, 0xdeed7f68, 0x6b3bfdc3, 0x47e51798, 0x651ec77d, 0x72bb8c09, ++ 0x69651ef7, 0xd7075c0c, 0xcf9c1487, 0x43e48770, 0x74b4d72e, 0xb463fe8f, ++ 0xb9590e57, 0xd2ae76fd, 0xe9b8c41e, 0x1ea06339, 0xb2cb9ddb, 0x51058379, ++ 0x67b1bc3c, 0x3833e50a, 0xb187339e, 0xc8edd36c, 0xb6bb40b4, 0xa45e4dab, ++ 0xe07716af, 0x4f802ec7, 0x89dfc1aa, 0x1cb8a7df, 0xadf0b5de, 0x514accc7, ++ 0x385d7e0e, 0x93a1ab5c, 0xfe70d76b, 0x21c85a79, 0xfe452bf8, 0xfbe2e2d9, ++ 0x68a3b00c, 0xc8c8759f, 0xe31cf1d7, 0xe69b3df3, 0x7c7440db, 0xcdc69538, ++ 0xe82b0fae, 0xf3382ec7, 0xd935c91c, 0x7cce947f, 0x5ffe719b, 0x261d9e7f, ++ 0x4295b7a4, 0xb13e550e, 0x6628f953, 0xf4b98fde, 0x377b2ed4, 0xde9da5d0, ++ 0xa2e69def, 0xc1ecccf6, 0xb77d0ae7, 0x8d2fde12, 0x1d723791, 0x0ecee471, ++ 0x44fd8f5c, 0x772e01cf, 0x28cfdcc2, 0xe7c5abe6, 0x70ff28b3, 0x9b6a077f, ++ 0x23829b9e, 0xa1dfd03c, 0x9fd44921, 0xbe5a0394, 0x39d0567d, 0x9d9d4bca, ++ 0x4f64b4fc, 0x76c9f9ca, 0xe7aaee85, 0x4ed75e10, 0x343821ed, 0xf5a06e3c, ++ 0x43fc98d4, 0x87e18aef, 0x1dfb8bb0, 0xc0facdf6, 0xeb7f7284, 0xf44dbcbf, ++ 0x50aed0d8, 0x7f6b111e, 0xfa1b74db, 0xeb4f8209, 0x89bcbed1, 0xa1ec0a9b, ++ 0x3c26de17, 0xe5c9d4dd, 0x1ee74372, 0x947b62c3, 0xecce0b4e, 0xd674805b, ++ 0xb86661d0, 0x3bfa021f, 0xd2d1f384, 0x948f84a9, 0x09f089bb, 0x83f889f2, ++ 0x5fa44d05, 0x80551f61, 0xb72909fe, 0x2c3f0acf, 0x1fe7f3b3, 0xe9453809, ++ 0xa5dc7027, 0xe256bb92, 0xa533828b, 0xffb82cfb, 0xdfe42af6, 0x78735577, ++ 0x76abcec6, 0xe9b96254, 0xc37a134e, 0xe19bc910, 0x7ef7ca88, 0x3fbe2ff9, ++ 0xcf0df029, 0x1b39fcc3, 0x9c837682, 0xa97f16bf, 0xe3ef2e6e, 0x3c6f59d0, ++ 0x01ed26fd, 0x7dbf3749, 0x23d2a0dc, 0x044cba5f, 0x065d2fc7, 0x4aa1f7ea, ++ 0xc878c71e, 0x43d9f5c8, 0x94212d6b, 0x99cc6f27, 0x7901587c, 0x14ddb8ed, ++ 0x6ea0f2c6, 0x3fbe3d51, 0x6fc7cd98, 0xc6eee9d3, 0x3b3adb7a, 0xfabc256b, ++ 0xfd1172be, 0x1f2e3324, 0xfadc3cb9, 0xf567973c, 0xc1887b41, 0x3303eb3f, ++ 0xc23ed097, 0xbc62f565, 0x980e0599, 0xa40c736e, 0x7b73cf2b, 0xa6ef5f29, ++ 0x127fce0e, 0x894f200f, 0x483f24be, 0x19e146b8, 0xc493f152, 0x63f459c7, ++ 0xf97a7397, 0x3b41794e, 0xffb871d5, 0xee3c0536, 0xc0571e72, 0xe38ac3fc, ++ 0x8890ae3c, 0x7eae577e, 0xb063fb2b, 0xbe6456a3, 0x5be4a549, 0xf8aac7d8, ++ 0xbbc0947b, 0x6e65944b, 0xacbeff0f, 0xe572f883, 0xcfc4cdc7, 0xae5ca9f6, ++ 0xe5a84fd9, 0x28ff6331, 0xcdedcbd6, 0x64c75b1a, 0xf9a997cc, 0x7dc4e2b5, ++ 0x79b9227e, 0xbbf3c2a7, 0x7f7c7d3e, 0xb17be632, 0xc7fac1cf, 0xaf958a38, ++ 0xe5cdc6b7, 0x005db9c4, 0x66f7a270, 0xfaece5d3, 0xc2c7f52b, 0xe78414c7, ++ 0x73eb014a, 0x7dc7abbb, 0x5debfe82, 0x60c3bc83, 0xdf7767c9, 0x604f93fa, ++ 0x4e76e7de, 0xd2dba2f4, 0xfa27ead5, 0xbd5b73e9, 0xf1010fb8, 0x84fd153d, ++ 0x27f63b6b, 0x9ddf0f5f, 0x529ae67e, 0xdcf3db94, 0x3ccfef9c, 0x708d5faf, ++ 0x7fdbf759, 0xafdf01be, 0x6669290c, 0xafd7671c, 0x7e86ccbf, 0x913676ea, ++ 0x99f5a89f, 0xb7984dd7, 0xe76d0ba0, 0x720d77cf, 0x4fd3bb62, 0xe101b96e, ++ 0x4ad1dadd, 0xb93ccfef, 0x7efbea9d, 0xfdafcffb, 0xfc6ffa37, 0x776c5ec9, ++ 0x84bdf9e6, 0x8180fa97, 0xd112b3f2, 0xf67b43f5, 0x7a897972, 0x3660f91e, ++ 0xae926397, 0xfe9efd25, 0x62e31ded, 0xde7c86f5, 0x6d38fc26, 0x9c8f5c49, ++ 0xb2bbfc15, 0xcf39c78a, 0x9b3adefe, 0x48a607f6, 0xeb97ee11, 0xac5d398b, ++ 0xefa8f010, 0x68d8cbb8, 0x9fa9efa7, 0xb1ef8077, 0x89f4051c, 0x6ad0a479, ++ 0x179457e7, 0x19e12cf4, 0x3f458dda, 0x7f79accf, 0xb63e7051, 0x4ae366e2, ++ 0xfc33e79a, 0xf63aac3d, 0xf8aac57d, 0x6ef5f5fe, 0x380bb0bb, 0xd677641f, ++ 0x0e4878e6, 0x62c3bd98, 0xbaece1ec, 0x87c62b40, 0xf0155c6f, 0x2f8f01ea, ++ 0x793a3a9f, 0x3b7fd430, 0xf8431942, 0xcf5c2bd7, 0x4e34ed05, 0x81bffa03, ++ 0xf8297e8f, 0x0cc9dd24, 0xe01c91d7, 0x031aac7e, 0x3fc9d833, 0xa27247d5, ++ 0xc1e84da1, 0x6dbfc29d, 0xd5bbcbe9, 0xafd9df41, 0xc36f898b, 0xd53b7677, ++ 0x887ef2fb, 0x83539179, 0x78ef49b3, 0x33df344c, 0xe0b01e52, 0xa2a3f9e8, ++ 0x17f5a6fc, 0x75a9bca1, 0xf95a3da0, 0x2d1ddbb4, 0x0b491fa5, 0xfbc48fa7, ++ 0x951f748c, 0xf3d7d76c, 0xfc0a3407, 0x9644a43f, 0x25fb1c51, 0xbc6ec71e, ++ 0x2b145221, 0xe6ecfe57, 0x820bb7fb, 0xc4bc2e6e, 0x4ea0e5e9, 0x83fbfb47, ++ 0x6f6e463b, 0x37ea0655, 0xf84fcea5, 0x717c046a, 0x51d577bb, 0xea1a93b4, ++ 0xadf91798, 0x33d053b1, 0x9f08add8, 0x25daaec6, 0xd760dfd8, 0x8353f234, ++ 0x3079315d, 0x59eb1bd4, 0xf64bf239, 0x212f55e3, 0xdf17595e, 0x81d76767, ++ 0x77788a3d, 0x05f57835, 0xddb8b7a8, 0x0a88e37a, 0x5ca1fefa, 0x82a7c50f, ++ 0xf5d68c35, 0xa8bfda10, 0x7246b2af, 0x9eb037fb, 0x49e626ec, 0x0b277f22, ++ 0xf6c6ee18, 0x8c79c18d, 0x7cb431f2, 0x764292f8, 0x16c8637c, 0x37f7c2b2, ++ 0xa5fb7175, 0xe1f38bb1, 0x591f0979, 0x90167b1a, 0x3305fd1f, 0x31f8c60b, ++ 0x0a6978df, 0x9a2f93d7, 0x6d9e4f49, 0x868fb1f1, 0xa3d33ba1, 0xdcaea78a, ++ 0xf1e3a05d, 0x38cd5be6, 0x1e62c58f, 0xf72e46ed, 0x2f1c8453, 0x71e7ccdc, ++ 0x79f3d05e, 0xdde7b7c1, 0xc1bfb526, 0xc37f2419, 0xfe1e3179, 0x9e85d279, ++ 0x961ba182, 0xebce8984, 0x5cfef377, 0x3dc95f66, 0xed207431, 0xd93d2d1b, ++ 0x576115d3, 0x1850501e, 0x433e3f64, 0xd637a7c5, 0xac1370b1, 0x75c7c6f3, ++ 0xc9a389e1, 0xe49db9ee, 0x8b135af1, 0x4ce26797, 0x26a2fae7, 0xfe825fcd, ++ 0x76599ae8, 0xb81fac6f, 0xb3a7c926, 0x2a561da2, 0x32fecffd, 0x4a9cf78c, ++ 0x6f117877, 0xb89ee919, 0xfdc0d2f6, 0x6ee3b733, 0xc68e0f6e, 0x6d6843fd, ++ 0x478a6cd2, 0xff227682, 0xc7be13b4, 0xeb8ef7fd, 0xeffbe49f, 0x0e979a56, ++ 0xafcc5f18, 0xeebefd0c, 0xae2aff42, 0x78de1c5f, 0x2dd679eb, 0x2505e4ed, ++ 0x9c6bcfb8, 0xd87e2769, 0x88b28afa, 0x32281bd3, 0xe700bbe4, 0xf1fc060f, ++ 0x91e88794, 0x66c6a0ec, 0x3d3e287f, 0x04697e72, 0x64ed08bb, 0x7dca3d2d, ++ 0x589bca39, 0xa7f2543b, 0xfb947fe4, 0x74930fe8, 0xebfff92b, 0x2305f9f2, ++ 0xb00bc3e7, 0x7ef3a47e, 0xd3997efa, 0xc0b5a6f7, 0x137ef087, 0x8c6b61f0, ++ 0x5beed6dc, 0x50e4c83c, 0x0b693cf7, 0x5e523f61, 0x35fdb836, 0x1ddf38e9, ++ 0xabaa526f, 0x2f8d6f94, 0x9cba2c6f, 0xf03164dd, 0xafc02cfe, 0xb183f4b1, ++ 0x95294755, 0xb6f39441, 0x17fdf1d5, 0xbfdba477, 0xc0dcde5b, 0xd23b927c, ++ 0x49f303dd, 0xa06751d2, 0x0b61d89e, 0xfd2b7da1, 0xdcf9da40, 0xfdc8ae98, ++ 0xda57cd0c, 0xc03f18ff, 0x8ba5f7f6, 0xb7688b7d, 0xcc65f05e, 0xc1f882be, ++ 0x85fc0ba3, 0xe813bcf2, 0xf7ddf913, 0xe39297e5, 0xa5a6bd48, 0xc0ff191f, ++ 0x2716d4f5, 0x57bed76e, 0xf434afec, 0xef212bfc, 0x703780aa, 0xf0c6eddd, ++ 0xef1f895f, 0x03ca3072, 0x1a5f3208, 0x1b5ed1c6, 0x4468f9ce, 0xdf7e115f, ++ 0x81381197, 0xaafd2574, 0x4be31cf8, 0x71dc452b, 0x28632ee5, 0x7d45fcf6, ++ 0x7a71a306, 0x1ea0961d, 0x199744f8, 0x1f7e15f8, 0x30de62ac, 0x5a9f99ea, ++ 0x06041e29, 0x9bca396a, 0x46491626, 0x094c1f38, 0xd5fa236c, 0xdfa114f7, ++ 0x1912bcf0, 0xb61fcf8d, 0xdf4f7df1, 0x70d0fa9b, 0x4b45e798, 0x3798e7e4, ++ 0xa1557170, 0xbcfd0837, 0x2f7bf2ff, 0x7dbd07bc, 0xc17982f0, 0xafc62c63, ++ 0x0dfbd161, 0x0bef7e31, 0x7411ce09, 0x12683a08, 0x60665071, 0x37be4fb4, ++ 0xe8c7cb83, 0x071e18f9, 0xf6a75f7d, 0x2532c98f, 0xceafcb83, 0xd24ce704, ++ 0x74bd3833, 0xd6fce10e, 0x38a15db7, 0xb5eadd5c, 0xfe07a1ff, 0x08e55baf, ++ 0xd1af0953, 0x0673aace, 0x28d1bac3, 0x5cfe4037, 0x699de043, 0x37ea88a9, ++ 0x8f186768, 0x5274113c, 0xd0916a5c, 0xdebb8b4f, 0x93ca3bf8, 0x8cb3033a, ++ 0x5ff3c52f, 0xe18343fe, 0x25f6a7d5, 0x97de28c9, 0x749ee8fd, 0xf3193fd4, ++ 0x969e45da, 0xb3750f3c, 0x879c9bfe, 0xff8669fa, 0xde6be218, 0x9bb7ee20, ++ 0x47970f77, 0xa116fdb2, 0xf1f4b49f, 0x9c3c0241, 0x88daa8c8, 0x9a737f7c, ++ 0xe72c03ff, 0x255e73dd, 0x91282eb7, 0xf4863cdf, 0xfbc39773, 0x2f2eef14, ++ 0x7fe56f36, 0xbf1878e4, 0x96f7bc01, 0x2ead14f4, 0xcbed3a40, 0x4efd177b, ++ 0xd22766dd, 0xe38c4acb, 0xa245d0c4, 0xf8e24e38, 0xf484c78d, 0x214978d1, ++ 0xfdd4587a, 0x778471c6, 0x744221a3, 0x2762c8b2, 0x325e363c, 0x336a7a70, ++ 0xefc88b9e, 0xd24bf701, 0x7e277f7c, 0x14f8d9f8, 0xbf01038a, 0xa342f870, ++ 0x27157398, 0xc32c0232, 0x077ff44d, 0x5a2e8fee, 0xbf30833c, 0x4fd4c9ac, ++ 0x8c4b7e0f, 0x1c72c3bd, 0x7ee83a6a, 0x8960e893, 0xbd426025, 0x4cd7d4bd, ++ 0x0de691e7, 0x8b3b970a, 0x5e3ef163, 0xafc8d5ff, 0x858ff78f, 0xc4df78fc, ++ 0xd20639f3, 0xf7339739, 0xd9768866, 0xcfde5f9c, 0x61cf7563, 0xf0943579, ++ 0x4443fbdd, 0x8bd454bd, 0x5e74bb44, 0xf9c1991f, 0xbcd1fdf2, 0x299c769d, ++ 0x644edf82, 0x4e110af8, 0x84d85df0, 0x359af1f4, 0x196a7644, 0x679437c8, ++ 0x9d92e777, 0x646c720a, 0x138d3946, 0x6676a14e, 0x19ac23d2, 0xb3e01ce4, ++ 0xf043dcb7, 0xf40954d9, 0x55e6f282, 0x246bc533, 0xb55e257e, 0xe6289cf8, ++ 0x95c63df9, 0x0f946627, 0x36332b8c, 0xf445f094, 0x465ce712, 0xee7d7c22, ++ 0x7e0078e0, 0x7a41969d, 0x962a3c2e, 0x3808566f, 0x7ef6b94a, 0xc7af1a92, ++ 0x219b9e85, 0xda31faf0, 0xb78fd875, 0xfdeff88f, 0x55dede54, 0xb48ef5c8, ++ 0x790917bb, 0x57c84277, 0xa23d4a59, 0x109f73f5, 0x3d227bfc, 0x0175e259, ++ 0x1fea55e2, 0x3c613390, 0x75ef39df, 0xb619c933, 0x5df28fbe, 0x5c62dda0, ++ 0xdf733cd7, 0x1bd03482, 0xc67b043f, 0x7ddf4a54, 0xc064728c, 0xd258bbfe, ++ 0x5ea18385, 0xeb10c86e, 0x71e3eb29, 0x5d7c11a9, 0x0fc8188b, 0x47f8cae5, ++ 0xc8167f1f, 0xf798dde1, 0xcc39fb80, 0x76254ab7, 0x007f60f6, 0xee19d5f7, ++ 0xe3b5dc28, 0xb074109d, 0xd031432e, 0x56129479, 0xf05b7882, 0xf98e67f6, ++ 0x7179e5d0, 0x0e67d31e, 0xce7ec06c, 0xb24de4fd, 0xc2984fc3, 0x38f6ed45, ++ 0x6de14def, 0xf7d12b0f, 0xa7ad3c77, 0x3d9d74f3, 0x1669fee7, 0x8f517bac, ++ 0x2e438bde, 0x23d7f35a, 0xdd1da2d7, 0x0a78a463, 0x06cdf3e8, 0xb733779c, ++ 0xd4e84f1b, 0x5ef67074, 0xa766bef5, 0xee7907a0, 0x139dca53, 0x9cba3e22, ++ 0x49bcb979, 0xf581de4a, 0xf3baef0f, 0x2d538c66, 0x3e43fe61, 0xbbe9fb80, ++ 0x7bfd91a7, 0xbe500b27, 0xf536e2cd, 0xeda5ce39, 0x8f9dfaea, 0x49e7380c, ++ 0x48797872, 0x8df85cfb, 0xe3c7e3ab, 0xe5d04dfe, 0xbb889359, 0x8dc735af, ++ 0xf826bfbb, 0xef1f1a3a, 0x5fddc753, 0xbddc7cbd, 0x8f771349, 0xb8da11da, ++ 0x2df7ef3b, 0xbf606f61, 0xb3f7f1b1, 0xf1d7f155, 0xd3475886, 0xaf2a9b25, ++ 0x7601ade2, 0x6fbd324b, 0x304d64ba, 0x3f3d3b1f, 0x38fe2cbb, 0x471fec7f, ++ 0x7e8fe71d, 0x72fbe3cf, 0xa4e92cff, 0xe91652e9, 0xf6975959, 0x1cbbf46f, ++ 0x0f3daf7a, 0x92cffd2d, 0x98523e2f, 0x45fc8b25, 0xdd3ec45b, 0x1f93794b, ++ 0x7c845da1, 0x5af3c539, 0xf8b8a604, 0x864571be, 0xd1be5121, 0xebe803ae, ++ 0x1e46244c, 0xb870cd9f, 0x997aff48, 0x09cbce97, 0x93f05fba, 0xf3773a1a, ++ 0x19d535e7, 0x418973ea, 0xf1320fee, 0x189d20fd, 0x4cb7d18d, 0x77178fa3, ++ 0x264dfe81, 0x01ce8bfb, 0x4feaf27d, 0x632f0f48, 0xf7a474fe, 0xe78757de, ++ 0x1e83be05, 0x35b9f396, 0xf3c8d0b8, 0x3f645d4e, 0xb9f310cc, 0x1a0dfbb5, ++ 0x19f1675f, 0xf31f1c69, 0x0b69d338, 0x420be7cd, 0x09f500d4, 0xe747f3fd, ++ 0xc5e3631a, 0x6e6e95fc, 0x25104e47, 0xc4c8145b, 0x5c719b79, 0x84afa63d, ++ 0x1d6cb132, 0x3960f5e7, 0xf81bf151, 0x279e383c, 0x6c1ce6b3, 0xf444b3af, ++ 0x83309d7c, 0x256a3a74, 0x877545e1, 0x799fafa8, 0x7c52c171, 0x3c90776e, ++ 0x14798931, 0xc45c8267, 0x05985b75, 0x87b66dd7, 0x4b7c534f, 0x0f2ac194, ++ 0x087071f1, 0x12473f23, 0xae3860eb, 0x883e7edd, 0xa732758b, 0xf3ab7582, ++ 0x863ef862, 0x379f92f2, 0xcde97906, 0x539e7984, 0xe21975fe, 0xf733e405, ++ 0x6f7a24fb, 0x0b73f308, 0x8aa5de42, 0x790ab5f9, 0x8abcc597, 0xf24f2738, ++ 0x658e17ee, 0xc5ddce74, 0xde517bfc, 0x953c9a3d, 0x2c1972e2, 0x9b49f340, ++ 0x2dc9506a, 0xcf5d5fb7, 0xcad06d98, 0x97e7053b, 0xb73f5015, 0x4f9413b0, ++ 0x99fd84a4, 0x3ed1a55f, 0x5bfa046b, 0x79f12566, 0x90fc8519, 0x3c4959f5, ++ 0xa676656f, 0xc3e5bbee, 0xf6fbd579, 0x3e7e54c6, 0xc5ba42fc, 0x6009f982, ++ 0xe4ceccc7, 0x820ff8fb, 0x59579a2c, 0x16b3d132, 0xd43661f3, 0x8075de2a, ++ 0xe70e0def, 0xabf47adc, 0x7f71b7ce, 0x6ad3c18e, 0x97dbf787, 0xbcf178a5, ++ 0xc3c89371, 0xae7560de, 0x9e788ddc, 0x58ede0ef, 0x2b8c06df, 0x74e4df6e, ++ 0xaba79e62, 0x09b26fba, 0x994b55f7, 0x438b0773, 0x1f039fef, 0xc49f7cc1, ++ 0x1149e03a, 0xef9f23f4, 0xbc85e7c4, 0xf702b13e, 0xb0affca5, 0xe712a53b, ++ 0x142a66cb, 0xdeea6937, 0x5a3f4613, 0xf212ece1, 0xfc2bbfa3, 0xfff04c41, ++ 0xc13c72b5, 0xe947d75f, 0x8897de9d, 0xfd7d8f7a, 0x43943b41, 0xd77f85bb, ++ 0xd7711665, 0xc9c13e18, 0x8541e13b, 0xfd881a38, 0x787f38b8, 0x7ce3fc99, ++ 0xfe8b1d7b, 0xd1d538e1, 0x4d4e4971, 0x35aeef12, 0x3f22f784, 0x12ca2f5f, ++ 0xcf9c1e51, 0x3a3dc6e3, 0xe3a4c7bb, 0xc4296dfc, 0x8f5fb7ad, 0x6e70a970, ++ 0x4cf9c56c, 0xe654c250, 0x51e8b7f9, 0x405a971c, 0x8c7f202e, 0x79d0d5f5, ++ 0xce8c49e6, 0x9496da83, 0xfcf09d78, 0x73ff05dd, 0x63d1fd08, 0x19c519da, ++ 0x5e649966, 0xcf106f86, 0xfcd0f3db, 0xcd8d056b, 0xbd395d9c, 0x3d12ec8c, ++ 0x5d57ee13, 0x9cfffbec, 0xf2e83d54, 0xbf9d577a, 0x5af224d7, 0xa654fd64, ++ 0x0ffee89d, 0xc99f9399, 0xe3c27d24, 0x85327b96, 0x8d8235fd, 0x23133940, ++ 0x76c05e07, 0x4adf2ae7, 0xefd42724, 0xcdb89c85, 0xf648c637, 0x521790bb, ++ 0xfe45fb2e, 0x33e61cce, 0xc47b5c22, 0x2b471a7d, 0x98bc9397, 0xfcf402c5, ++ 0x1f1c554f, 0xec464840, 0x6aa9d6ef, 0xbf36e73b, 0xb66b3eba, 0x70e20ed6, ++ 0x09cee393, 0x90cfdfa8, 0xb554ecf6, 0xc7ef3b3d, 0x3e90a79f, 0xc34df8ce, ++ 0xbcd1f957, 0x5e4d269c, 0xcbc8a34e, 0x785aea69, 0x2f263bbf, 0xf283f807, ++ 0xaebb1a72, 0xedc39794, 0xa18d779e, 0x78bf18bd, 0x14ac3977, 0xe45fb9e6, ++ 0x3cc01c71, 0x5d28d28e, 0x3f70163a, 0xf29c4029, 0x369c7273, 0xa6d0b73a, ++ 0x6abf252b, 0xe543b25b, 0x96b4deff, 0xa7f4a3d3, 0x599c3cca, 0xc1dcd666, ++ 0x780774fd, 0xa3f719be, 0xe25f8485, 0xfa454c99, 0x1f93d701, 0xdc0f234f, ++ 0x746edc69, 0xfe411dcf, 0x25ddd9d2, 0x64979465, 0xff1f9077, 0x7d0f4c99, ++ 0x42503b3f, 0xed1bbe7e, 0xd2ce2873, 0xb0ddbdd4, 0x9ba51ec4, 0xd9bd24af, ++ 0xade90d98, 0x9cf63fdf, 0x3e63fc99, 0x059f5fb3, 0x0a6f5574, 0x862c1f93, ++ 0x2279e8de, 0xc0a774bd, 0x3fcab1b7, 0xa5c02967, 0xee8988f7, 0x9bc301bf, ++ 0xbfcf68fc, 0x3dfe4294, 0xfa460cc3, 0x23257d60, 0x3fa2f67c, 0x69ffe60a, ++ 0xe9d91d4a, 0xe9196beb, 0xfca90bb1, 0x2ce5971e, 0xfe87c874, 0x8e81c7aa, ++ 0x8ac3f462, 0x3d7aea9d, 0x5f3920eb, 0x3d007bbf, 0xf2935c92, 0xf47981af, ++ 0x752f8c46, 0x4367bfaa, 0x44adf2d5, 0xb731e9c8, 0x3cc56a4d, 0x2e3a3180, ++ 0xef12d88f, 0x2fb419e0, 0x693ce79e, 0x1bf95145, 0x53f672e5, 0x9e94e3af, ++ 0xc3972ff3, 0xad7fa2e5, 0x7617289e, 0xe6060dd3, 0xb4a47dc3, 0xd53da083, ++ 0xf5bae80f, 0x3ce53aa8, 0xd277c4cb, 0x587292fe, 0x2c72abe2, 0xb3a04688, ++ 0x8ec259a9, 0x2086c219, 0xa27fa1be, 0x32370573, 0x107fd4a9, 0x8bd75ff7, ++ 0x821e80f1, 0x9d415748, 0xbbf48425, 0xfd266941, 0x1b3b4164, 0x804a4dca, ++ 0xd4bff0e4, 0x1f48f505, 0xadf358e3, 0xf1bb4337, 0xca1b1e96, 0x9b93a01d, ++ 0xf4a3cab3, 0x79c2cad3, 0x1d15147b, 0x2973fbd1, 0x23a5c56f, 0x7fc22fa9, ++ 0x4dc376e2, 0x183bec0c, 0xdceff7d7, 0xf0a039be, 0x79d81cfd, 0x79bed007, ++ 0xe88d374b, 0xf7de1a64, 0x9c6aed03, 0xe95ffc6a, 0x5a861f5e, 0x21d102b9, ++ 0xe03219e1, 0xfdf7b47c, 0x62dca4f8, 0xc055b96a, 0xd579e73e, 0x08fd0f1b, ++ 0xd5b6f9f7, 0xf501846c, 0x0ef24b08, 0xba6f138b, 0xddfecb37, 0x71819fec, ++ 0xcab37b8b, 0x7a2dc607, 0x70bf7c8d, 0xdb2c8b1d, 0xb7a40cad, 0xeb57070b, ++ 0x52e86333, 0x46cbc7f2, 0xbca03f9e, 0x6344e3ce, 0x8c38ac2d, 0x7ee32970, ++ 0xd71fc93e, 0x46a69d21, 0x3c42afe9, 0xc84b387f, 0x8f967c97, 0xcba136f4, ++ 0x7e03d61a, 0xd77f444a, 0x4695fd21, 0xdf6901ed, 0x401d8eb7, 0x1f980567, ++ 0x16f16a5d, 0x7b495d22, 0xd1d28c60, 0x9f9ce78a, 0xad67e97f, 0xba18df38, ++ 0x4ae88c7a, 0xff22ba01, 0xa97d00d5, 0x3ba1af7e, 0x5663ff89, 0x592b27ae, ++ 0x662bed33, 0x193d7126, 0xf493bdae, 0xa24b8824, 0x706637bb, 0x3e61abba, ++ 0xa64abba2, 0x8b6a97a6, 0x4ba5aeba, 0xa6a75118, 0x9dd100bb, 0xd1135e96, ++ 0x9dd23e5d, 0x576997d4, 0x5983bba6, 0xecbc7bdf, 0x789c5660, 0x2d3ba499, ++ 0xb67949bd, 0xb6aceac7, 0xea9b3cc3, 0x630fd214, 0xc56d0c8e, 0x0286f0fa, ++ 0xa4f76bb2, 0xfbd3f778, 0xacbefe66, 0xfcc7a7c7, 0xe255c291, 0x1abf817d, ++ 0x15ab4deb, 0xfcad7fba, 0x192fcf18, 0x2fbf86ba, 0x1fbcd759, 0x0537efcf, ++ 0x9f2ff7f9, 0x81e740de, 0xf7c41b42, 0x58d5ed95, 0xdfe36a6f, 0xa2f18a7f, ++ 0x2bcf306b, 0xafcf8ad4, 0xe5e05cda, 0x476e5cdb, 0xddeb144f, 0x9fb73ca3, ++ 0xdfe76bbe, 0x92c879dd, 0xe6fec8c4, 0x620df076, 0xe71f139d, 0x747d74eb, ++ 0xd00f54e3, 0x20bed2c7, 0x752763d9, 0xef2415f5, 0x2b67ec12, 0x2c1cf695, ++ 0x3e65bde5, 0x3f4db78b, 0x7713c784, 0x364a10c0, 0x38c90bf7, 0x6bfbc61c, ++ 0x251cec63, 0x6531fb9b, 0x4654f4bb, 0xafd8b7e7, 0x9697e41c, 0xc3f0c271, ++ 0xc4fe414c, 0x8977e235, 0x0a5386e2, 0x988ec99b, 0x85e32f92, 0x1822c311, ++ 0xcfabe4b7, 0xd7f3c726, 0xa7b8c458, 0x7c82fe44, 0x79e2175e, 0x48907b12, ++ 0xedacfce8, 0x9853d508, 0x9ed79cea, 0xcf4f5e02, 0x5b63ff36, 0xd757c00e, ++ 0x92a2086c, 0xff2853cb, 0x161e96e3, 0x703c941e, 0x2c0c53fe, 0x207ca26c, ++ 0xad65ff3e, 0x075f7126, 0x09b76b97, 0xc3f1b1fc, 0x0a677e88, 0x0b66153c, ++ 0x8d863539, 0x9b753941, 0x2d0fdbc0, 0xafae46cd, 0xf91a8ddb, 0xed1b3c31, ++ 0xda13479f, 0x1af7eae3, 0xc62752f9, 0xf0ec265d, 0xfc8face5, 0x1d852794, ++ 0x6e51ea7e, 0x1d60af87, 0xfdeca7e4, 0x1b3fb715, 0x2f487960, 0xcae37f5a, ++ 0x437aea5d, 0x08deba87, 0x6ffb1dea, 0x9dc8d2ea, 0xedffee62, 0x02a1b47d, ++ 0x8f757dfd, 0x733f211c, 0x2133949d, 0x03019cb5, 0x8799cb9b, 0xd13f26af, ++ 0xbb1f96b7, 0xa154f761, 0x05bcb3ca, 0x47efd5e1, 0x8be79179, 0x5fbe3234, ++ 0x6eac75ef, 0xf144f7a8, 0xf493f528, 0x4be56827, 0xf22f9089, 0x253794bd, ++ 0xd829eb8c, 0x61f11e5f, 0xb79d8d5b, 0xffbd5b32, 0x690a7e92, 0x7da0951f, ++ 0x7575f484, 0xfd05be7c, 0x487996f4, 0x539a7e8c, 0xebfc2166, 0x7602a3ed, ++ 0x65347d15, 0xa73f7e5f, 0x1fa1af7e, 0x5dba9fb9, 0x18adcfd0, 0xfff180f1, ++ 0x96e3ee5d, 0xc999fa73, 0x7e9107fc, 0xd382b4fe, 0x7dd7dc8f, 0x4f9c7df3, ++ 0x938fbb1f, 0xbbafc1fb, 0x1ba7eb9f, 0xbee86feb, 0xfd7959cb, 0x3ed0bbf7, ++ 0x74e149ba, 0x4fe0b0d1, 0x4a9ef0db, 0xb68e2f29, 0x18c1af30, 0x334eb7ad, ++ 0x28ee305b, 0x719b7bef, 0x8b15fbd3, 0x79cfe462, 0x8456e547, 0x9376eb1b, ++ 0x26c1b51f, 0x9c7cdbfd, 0x7b9eba59, 0xb83943df, 0xdbf146cd, 0x9919878b, ++ 0x1f1f172c, 0x67d1794e, 0xce5b9c45, 0xbb43cee7, 0x7cc08b5e, 0x3b9ead96, ++ 0xdcf600c6, 0xb7f4254a, 0xfbf41417, 0x46cc9e05, 0x16174dbb, 0x50f62bf7, ++ 0x9b8e401c, 0x241a7fd8, 0xc7da68b9, 0x929f73f5, 0xf0ae7944, 0x1e3628bc, ++ 0xee60ecf6, 0x3d7e9317, 0x28ff47a9, 0xdce2adea, 0xed55ab57, 0xfa65d0c7, ++ 0x7ffd713a, 0x82baf854, 0xde491b6f, 0xe31f1fa3, 0xd9b5a0b6, 0xf381d4e0, ++ 0x9d853cc2, 0x614f235f, 0x5feb90af, 0xf986eca0, 0xedf74f4d, 0x894ef1c3, ++ 0x1129ec38, 0xcc953bb7, 0xfa4778e3, 0xcff2f3db, 0x38882f52, 0x7554a9df, ++ 0xfbb6477c, 0xffdf364b, 0xf162dc7e, 0x7c6237af, 0x83d7f99c, 0x6c3cf11e, ++ 0x8ffca66e, 0xbd7d7c79, 0xcea8a52f, 0xaecb9fd3, 0xf2f102fc, 0x0effdb80, ++ 0xbb496bce, 0xaf505cfa, 0x57b4afb8, 0x95af4fd0, 0x73dc7297, 0xe05fb5d9, ++ 0xf873bd77, 0xf5fd99bd, 0xa7eeb271, 0x44277bfe, 0xd7f52e48, 0xe711147f, ++ 0x43bfb9b5, 0xc513e3fa, 0x39f1b4eb, 0x6d4c79ed, 0xe4be7d7c, 0x9f5f113b, ++ 0xfcd5e427, 0x5fdfee6e, 0x061b6160, 0xba3bfbc3, 0x5b5e2833, 0x522c1c97, ++ 0xb683d7c5, 0x2157946f, 0xb737b4e9, 0xfd1e3fa7, 0x747898ab, 0x36478883, ++ 0xaa75f5c8, 0xf83297d7, 0xa7478f7b, 0x8f138e0c, 0xbc2fe6d6, 0x3186f688, ++ 0x9dbb878a, 0xfa356e1c, 0xcbf46afa, 0x28c25c5e, 0x37eefbef, 0xdfa2b717, ++ 0xe28deef6, 0x7f614c56, 0x27380837, 0xafdb975a, 0x7f951e63, 0x6279893c, ++ 0x481593d6, 0xa2c9d555, 0x1cdbc98f, 0xfaad975c, 0x8879b73e, 0xeafe7daa, ++ 0x0bef55ab, 0x7aaaa582, 0xaa75db61, 0xabdac3f6, 0x8fe1f554, 0x5f6aa8dc, ++ 0x220c86c2, 0x3d61d9bf, 0x55d896fa, 0xf7aa19a1, 0xaedd7723, 0xd653fefa, ++ 0x6878d0fc, 0xdf5569d7, 0xbe82cbb3, 0xee0ae29e, 0x8c75c1be, 0xeaa458ea, ++ 0xb0958587, 0x6fbd1152, 0x3f326ceb, 0x87a4b25f, 0xe9ae1fc7, 0x671aa15a, ++ 0xf09ebea5, 0x96af8da8, 0x9443beb2, 0xbc521c47, 0xde303661, 0x3b6bbcba, ++ 0xfb25777d, 0x30fe3fa7, 0xc93ae1d8, 0xe6cab8ef, 0x0ba5ad74, 0x1789d93b, ++ 0x1f93d71f, 0x3d1584b1, 0x65e09e3c, 0x40cf2164, 0xdc645dfc, 0xb771763f, ++ 0xeebef283, 0xcd31737c, 0xa6a99cc7, 0x4d47ab0b, 0x6a11b617, 0xd57870ba, ++ 0xac683074, 0xf0b40e9a, 0xe9a9f14e, 0x3fe04582, 0xda778197, 0xfcdd3554, ++ 0x55b9c16f, 0x0731df03, 0x8276ad7c, 0x9313cf1b, 0xd8599a76, 0x81b8da43, ++ 0x397e77b4, 0xa25dd858, 0xd80f191f, 0xff6904a0, 0x1be71fdf, 0xfbc3ce1b, ++ 0xcd2d4b49, 0xfc97fb8c, 0xef8e0f0f, 0x89e7a49f, 0xae1293fc, 0xb87d8533, ++ 0x7e49f992, 0xbf72b31f, 0xcbb5c7d2, 0x8cb4afc9, 0x7dfd9335, 0xe114c676, ++ 0xbb520c7f, 0x0c05e52b, 0xfb0007c8, 0x6ff8c594, 0xe055e057, 0xa9e10385, ++ 0x07612b74, 0xdd65a39e, 0x28041f52, 0xd0c8045f, 0xaf8aa152, 0x6860eca8, ++ 0x2fcac4a0, 0xf1cb0f69, 0x5ca53c24, 0x5998e393, 0xf9133eb3, 0xd8e72342, ++ 0x477c6d08, 0x7e91d7ed, 0x91371921, 0x1fad2271, 0x81bfea27, 0x25c62bfd, ++ 0xf15a0bf3, 0xa718ebdc, 0xe585fc8f, 0x3e2e67ac, 0x68e96b1f, 0x1f847835, ++ 0xefd62ae3, 0xafa848c7, 0xbe4710ae, 0x1e44a835, 0x3f18182b, 0x5868f196, ++ 0xc1ef47fe, 0x4f15e3c7, 0xc663ce2e, 0x48ddc3cb, 0x9bfd034f, 0x40afe3de, ++ 0x5f5d7a3f, 0xc1abb61a, 0xf898ef44, 0x844a1bf2, 0xe643f3d6, 0x1cf63fbb, ++ 0x98eb237b, 0xcafc973c, 0xbef127a0, 0xf7ee4e98, 0xbb5a5d62, 0x677e40d8, ++ 0xe904ac1d, 0x898b257e, 0xdf4416ab, 0xb03f5d53, 0xae7ef32e, 0xe4b44f64, ++ 0x02de4538, 0x426257cf, 0x687dca0e, 0xcc9efda2, 0x5cf7907f, 0x631f3cca, ++ 0x8f23f08e, 0x7fb1a366, 0x0e6b37e0, 0x3f8019f9, 0xec7e5895, 0xf7a20bcf, ++ 0xb351f803, 0xa0ff997e, 0xff919477, 0x7aec7168, 0xa43c06bf, 0x0e4b72dd, ++ 0x3423f2a3, 0x486ed08a, 0x0f8ef13a, 0xa8f5975f, 0x4c9b35f2, 0xbf41b1b0, ++ 0x0f228bc2, 0xbf6d43af, 0xf911ce8f, 0x73ff6245, 0xc6257825, 0x139bc887, ++ 0x76baf8f8, 0x939bcc98, 0x11cb2c70, 0xf70a3272, 0xf37139b1, 0xaee1fa07, ++ 0x2ee02f7e, 0xbcbe72e1, 0x2f8837e7, 0x3a58e3bd, 0x34e6fbc2, 0x9f6c04ff, ++ 0x52723c7b, 0x55e745d1, 0x79473fa3, 0xf4bb17af, 0x71ae1e74, 0x8d839702, ++ 0x3449e92f, 0xd336e85c, 0x5d75493d, 0x3c2ec9fb, 0x168202d7, 0x1699c464, ++ 0x65d87218, 0x781a09fc, 0xc92fda27, 0xa1a6dcf5, 0x0367993b, 0xa2a39ceb, ++ 0x987081af, 0x6afe8f13, 0xf083c5f4, 0x7e7f743c, 0x2f2fa190, 0xed3adef6, ++ 0xdc39dc3a, 0xf56196af, 0xfd38422f, 0x21e727a5, 0xdf46afec, 0xe11b287d, ++ 0xf3a14ab3, 0xfccd1352, 0x26566a7c, 0x3636bf3f, 0xf3c5ecd2, 0xfc3999bd, ++ 0x3fe1af5e, 0x22b4e5fa, 0x8ca5bba4, 0xafeff9e2, 0xef1527ba, 0x0ce390bb, ++ 0xae747457, 0x3ee7b192, 0xc61969f8, 0x1e51e72b, 0xb8b37cc2, 0x5b5ee7cf, ++ 0xc9e410b8, 0x3f7e26eb, 0x33487193, 0x4be9479d, 0xd39f93d1, 0x909367a5, ++ 0xe5fce4fe, 0x1cf95439, 0x3e63c9cf, 0xb13e7caf, 0xddcc6fb5, 0xe39f5e50, ++ 0x31e3dd51, 0x4c6fbab1, 0x078a3db3, 0x88d75799, 0x9e82b8f7, 0xfe9160bd, ++ 0xae3df517, 0xf4fec427, 0x7bfeb0c4, 0xf1b11c5d, 0x6fab46f2, 0x7eb8b5d0, ++ 0x7feb8f71, 0x52837d3a, 0x7beabd68, 0x3c882f59, 0x12fbf976, 0xd981ee89, ++ 0x2f7ca396, 0xca24e6f7, 0xf4f996b7, 0x14c8fa5a, 0xc531a1f2, 0xd0d70cc0, ++ 0xe5ff6ef9, 0xa5f2bdda, 0xacb9ee3e, 0xfaae82c3, 0x357ca5ef, 0xebe03e7e, ++ 0xc07cda39, 0xedcf9d08, 0xa97c07cf, 0x6df7b2f2, 0x9bfde234, 0xf9907031, ++ 0xff788de2, 0xfd3898e6, 0xfb1e7f42, 0xc9e1ef95, 0xf5fbe1cc, 0x4bcfcc46, ++ 0xe5ce7d8b, 0x971c744c, 0x248bb7c8, 0xaefe7f23, 0xd7e74f4b, 0x3758777f, ++ 0x799c4775, 0xbb70179f, 0x63f06dda, 0x30c8c4fe, 0x513a4fbf, 0x460e793b, ++ 0xced5079e, 0xb22ab3af, 0xf98fe700, 0x8bc6f1bf, 0x79caf808, 0x7c72a677, ++ 0xe666be34, 0x781a84f7, 0x6a67769e, 0x0bc91964, 0x97cf1aa7, 0xf3a6df84, ++ 0x9d1e48c6, 0xfdc69acb, 0xc1e8890b, 0xa170169b, 0xbaf7911c, 0x159a1855, ++ 0x5dbf0c67, 0x70a21e89, 0x3af0abd7, 0x7a26ee10, 0x7d3dfb2f, 0xe9edf394, ++ 0xe54f9ca3, 0x23f4e83e, 0x00afca7a, 0x7ee3b686, 0x77d0a16e, 0xa38f19a7, ++ 0x68576e9c, 0xc028b3df, 0x3b906ad8, 0xe4ae770b, 0x6353f276, 0xc2aaa036, ++ 0x1ebbf8e7, 0xbb19330b, 0xeb45ca01, 0xb1757135, 0x747a929f, 0xfdb566c9, ++ 0xff36c75b, 0x4b49da07, 0x97e93359, 0xdfd55b65, 0xe9bcedd7, 0x1b4f1c53, ++ 0x315f47ff, 0x2b9677dd, 0xac1523f6, 0xddc3f502, 0xc2667d4f, 0xc448cc9f, ++ 0xde40a70f, 0x72861d0e, 0xb9e542d7, 0x57952716, 0x7372fae5, 0x73637e01, ++ 0x7b2c1e03, 0xbaf0e6df, 0xeb917f58, 0x0c3c3c0f, 0xe7accb7a, 0xb9e65379, ++ 0x33fe3e3c, 0xe00097bc, 0x7b733662, 0xcd683f49, 0x96685b8c, 0xb5c7c221, ++ 0x1482e711, 0x4cde4fd2, 0x33d77fa4, 0xfc22a653, 0x7cd8cfdd, 0x954daeb8, ++ 0x4bf412be, 0xe7e5aa6c, 0x1e662d28, 0x6efd0f9f, 0xb9743edc, 0x52d8ed0d, ++ 0x9c68e785, 0xa8c37bdd, 0xff74dbc2, 0x6d4d7941, 0xc3bcf037, 0xef645d74, ++ 0x78e882e0, 0x13285b6e, 0x91eef7e3, 0x97187efc, 0xcb84b2be, 0x35ff6e73, ++ 0x2af7d80a, 0xfcf1079e, 0x904df07c, 0x45efd0c7, 0x71e73f03, 0x9678e335, ++ 0x763869f9, 0x0e7b9dac, 0xfbfb17e0, 0x28775703, 0xdd326361, 0x9e714213, ++ 0xf4e175fa, 0x9e97a8b9, 0x4c9c5036, 0x7af5cbce, 0xc3c61556, 0xab9a3ea4, ++ 0x4cffb938, 0x9873f1d8, 0xb4f1e3fc, 0xe65e82d9, 0xae7dfb08, 0x1179c38d, ++ 0x77e1e6f3, 0xb2585bb7, 0x6e6a580e, 0xad394775, 0x0531a56f, 0x171904ed, ++ 0xc45f6c4a, 0xfe357bf7, 0x05cfc1c6, 0xd8457d2b, 0x29f419c9, 0x1b0f865d, ++ 0x161f0573, 0x6c71f3f1, 0x1c61f328, 0xe1b5f1b2, 0xe6393bf4, 0x06e71e24, ++ 0x7bc164f9, 0xdea20e72, 0x7f2f7586, 0x47efcac5, 0x3a26f791, 0x4da87df9, ++ 0xe94a7233, 0x3ef1debc, 0x82e2dfba, 0x7c479231, 0x6f07720c, 0xe27b6d02, ++ 0x780c5bd5, 0xec1b32ae, 0xf8bfa834, 0x3ebc5bc4, 0xef0cb224, 0x13f3fc43, ++ 0xd5faf09f, 0x3f589391, 0x2ddf44fd, 0x6378ff78, 0x1e996469, 0x5f6d86ea, ++ 0xa1b8f7f2, 0xd94ac204, 0x441e9c66, 0xd84523fb, 0x9d08de41, 0x797c6e87, ++ 0xbfd62eb8, 0x972e45fa, 0xbcac675b, 0x760299dd, 0xf7840cc7, 0xffedf888, ++ 0x9d53ab92, 0x95eb966b, 0xf8ccb3df, 0xc62c3ddf, 0x31ce2e59, 0x36b1b44f, ++ 0x05eb8f2b, 0x070f0193, 0x5c5387ba, 0x54dcbef2, 0xdd08b701, 0xd1fb2343, ++ 0x1c813efe, 0x7fc28577, 0x9182e8cf, 0xfbe581fb, 0x307f029d, 0x671a7ace, ++ 0xff9f8fa8, 0x8253919d, 0x19bc03f8, 0x7c0cde04, 0xd69dbbdf, 0xefe2fd85, ++ 0x181e80f3, 0x03fcfe83, 0x82fb439f, 0x74b5bce8, 0xeb9727b2, 0x3cade597, ++ 0x5297db1e, 0xd134f448, 0x2933ee26, 0x90c3af53, 0x45f0e1c7, 0x63870a6e, ++ 0x14325e3f, 0xc055a71a, 0x34522731, 0x5f37d463, 0x9f317ef7, 0x31dd7bef, ++ 0xbde1f2f8, 0xf8ba0724, 0xbc86bdbd, 0x013f7e54, 0xd92a73d0, 0xfd545b7b, ++ 0xf9ab599d, 0x7ba32c7e, 0x0b531b73, 0x899ffbe9, 0x7de5497b, 0xc15df86d, ++ 0xa2a76e68, 0x8bef2afd, 0x581bc160, 0xffb17c6c, 0x710e885e, 0x3aff6e6f, ++ 0xeb132e6f, 0x3a758a74, 0xa1077f63, 0xf58f3f9f, 0xb98ccde5, 0xef3e4faf, ++ 0x7f7f7f87, 0x3fa2a5c5, 0xebc79f15, 0x113af90f, 0x7df6fe5e, 0x53ce45e3, ++ 0x387ecf03, 0xe127e66b, 0xdf4dfc89, 0x52e9ab15, 0xae74f3ce, 0xf86b1fdc, ++ 0x8e5be0bb, 0x6d4dee27, 0xb7cf09f8, 0x5d351e66, 0xe8167437, 0x7e40ef30, ++ 0x68cdc0e7, 0x97efd479, 0x87f62795, 0x41272c39, 0x5e6e633e, 0x217f5c79, ++ 0x0feed73d, 0xefe4537b, 0x14fda98d, 0x8f6f6ebd, 0xe76be30f, 0xebfff9f9, ++ 0x8c1b7e35, 0x8f673d2f, 0x2fd5177e, 0xc14afaea, 0x4efd03df, 0xbf38797d, ++ 0xf3d57332, 0x0dd82f1e, 0x474f06db, 0xa8365d79, 0x3dfc1eea, 0x797909a9, ++ 0x979e51d3, 0xacfaae0d, 0xc4f9e400, 0x1f5e7cbc, 0x10d9f559, 0xe7cb6fac, ++ 0x9efa27ed, 0x82cf7947, 0x6527d3f9, 0x5f09ed45, 0xd5c6879e, 0xdee8eb57, ++ 0xe63b7eb6, 0x31d93375, 0xca89ae12, 0x39aeb332, 0x5a707c5e, 0x84bfbf5e, ++ 0xf16371f6, 0xeff41e9f, 0xc47ffd89, 0xf7ffdaa0, 0xd9f3f326, 0x17feafbd, ++ 0x99994f9d, 0x0f25b817, 0x76c9b8e8, 0xd401416e, 0xa03ed9d7, 0x03e29df8, ++ 0x2afd043b, 0x079b271e, 0x6dce55f3, 0xc4dda3f2, 0x062d7856, 0x77f0ab82, ++ 0x00719de1, 0x7b5e57bf, 0x7cc1befa, 0x63ce3f18, 0x4d03909c, 0x6ffdfdaf, ++ 0x3a6dff18, 0x99a2f763, 0xd1fbae38, 0x1aeed07b, 0xdfd6fdd7, 0xe7e61eb9, ++ 0xc7bce469, 0x9e133fa1, 0xd332ed8f, 0x5f75c7fc, 0x5fdb14b5, 0x85dd6fff, ++ 0x4e132748, 0x2c515b84, 0x2ffabef4, 0x68e75583, 0xcd97a7d8, 0x6f184d03, ++ 0xc4f8f093, 0x097bbf44, 0xba4668f0, 0x4e7db26c, 0xdc176a79, 0xc8443747, ++ 0x579f573e, 0xe29dfb02, 0x925917c9, 0xf218e317, 0x4fd6bbdc, 0xd616bc7a, ++ 0xf427cf07, 0xec620cc1, 0x2c9789e7, 0xf5a24820, 0xaaa2964a, 0x54b25b57, ++ 0x059c6bed, 0x3253f7aa, 0x9fbd52af, 0xd55129e6, 0x4e311a6f, 0xde07fed5, ++ 0xfa7d554a, 0xf6aa69d8, 0x555abeb5, 0xa1dc24bd, 0x70e63f6a, 0x31fdfa97, ++ 0x943c47a6, 0xc7eef71e, 0x1f63fcb2, 0x4e2b5bb9, 0x72c7ef35, 0x70727fdc, ++ 0xd7c4fd68, 0x8fd8ea5d, 0x589fa5cf, 0xfa48fe7b, 0xede9678d, 0xff7c5321, ++ 0x30a1a670, 0x5e804f7a, 0x1d1fcfc7, 0x16fc094c, 0x3f9e58e9, 0x627e889a, ++ 0x1dcd4240, 0x01bdf9e7, 0xed1fb8f3, 0xe5062238, 0xf9071cd3, 0x9b1b8f1f, ++ 0xcf1eff7f, 0xb945c807, 0xb66fa137, 0x2f13dd6a, 0xaeeb5405, 0x7835cb64, ++ 0xaf554bba, 0xd544fe71, 0x5ae64a7e, 0x9e69fbd5, 0x6d3c1a8d, 0xe07fd551, ++ 0xa783547d, 0x3d3c1aed, 0xe92f7aad, 0xb1f85bbb, 0x13ff435e, 0x3d23e394, ++ 0x1b8788d5, 0x3e11f54e, 0x57b4f6c6, 0x3bae9e23, 0x2af841de, 0x51abfb0b, ++ 0x6e1c565c, 0x18658fde, 0xddf861f6, 0x2a4c96be, 0xc878b40f, 0x65a8758f, ++ 0x5b879504, 0xfffcf4bc, 0xf2a58cb4, 0x547c5b5f, 0x2a65a1fe, 0x7e2d3d95, ++ 0x3a5a3b2a, 0x2d73fda8, 0x960fdc5d, 0x452f7fd6, 0x2e07fa2e, 0x188d22e8, ++ 0x5b7f7e01, 0x0bcbc933, 0x580b9149, 0x489ac75f, 0x9f39fe5e, 0xbdc33c91, ++ 0xf2c5f916, 0xa8f98d7d, 0x5d78f227, 0xe87465e6, 0x8768257c, 0xf35bca5f, ++ 0xb19721a0, 0x33fad7fb, 0x8ebc299d, 0xc843cbbf, 0x35b77ca6, 0x1872fa0f, ++ 0x12aa3dfb, 0x99ace60a, 0xf15ef58e, 0xf2e78b7b, 0xda0f4cd6, 0xdcdc43bf, ++ 0x7e6e2037, 0x1b50e909, 0x29fdff37, 0x3afd038f, 0xee1f3f47, 0x151c7840, ++ 0x2b1f2dfe, 0x4befe231, 0x8c4a1a54, 0x6b8f67a8, 0x8e5912ec, 0xf92a5731, ++ 0xf7b75c6e, 0xbf0fca36, 0x2fbf48d1, 0xfbe14337, 0x83eed95e, 0x7a0fae7c, ++ 0xfda6607f, 0x6f9d31d4, 0xaf47f229, 0xe10db7d2, 0x276fc9ec, 0xfa3af7b8, ++ 0x797e10f2, 0xbaf20ff9, 0xe29b6fbb, 0x391ba98d, 0x3ff99c7c, 0x93e1beff, ++ 0xc2d4f883, 0xc9df20a7, 0x97d858f5, 0xac80768b, 0x35f5ab1f, 0xd2b09c50, ++ 0x71d70c37, 0xfce66fd4, 0x868477eb, 0x57c87f91, 0x9f8c5b7e, 0x237c89e7, ++ 0x0f13377d, 0xf3bfa212, 0xde287d76, 0x92bdf0ef, 0x441ff7cf, 0x9ccfb827, ++ 0xc17da363, 0x87bf1d31, 0xdffedb40, 0xeabef9f3, 0x7efb826c, 0xaf7013df, ++ 0xf7e1b5ba, 0xbd7f402f, 0x75d4acab, 0xd9387faf, 0x00cdbd63, 0xdee9a05d, ++ 0xf9e7cd53, 0x8057b37b, 0x73b6e284, 0xfef05ff1, 0xfcf7ddf7, 0xfed08ff5, ++ 0x2f365583, 0xd5e710e9, 0x45dbbf04, 0x1669f9e3, 0xcfe69fb2, 0xbd42adc8, ++ 0xffc45738, 0xe90c3816, 0xa4340614, 0xcfd09c98, 0x06c97b12, 0xe65b2080, ++ 0x4fe135aa, 0xdce5d4af, 0x15cb01b5, 0xf098b743, 0x8bea4127, 0x33406cf7, ++ 0xb85801b6, 0xe45fe49c, 0xebcc0b48, 0x0f7ad58e, 0xf3c9cfdf, 0x51bf2ba9, ++ 0xdfa48b1e, 0x08df2263, 0xd5fb4080, 0xca8af913, 0xc0427dcf, 0x88be6173, ++ 0xa3628caf, 0xafc752be, 0x9fbd2296, 0x28a47f9b, 0xfd417c41, 0xef8fd85e, ++ 0xb58c7b88, 0x71c88ff7, 0x3f7817df, 0x44ca0266, 0xae76f27b, 0xfecf4607, ++ 0xac395d6c, 0x53b7747f, 0x770a7947, 0x7880bc34, 0xf025d8b8, 0xc85d6468, ++ 0x1706b74f, 0x5eb9407e, 0x57b7739a, 0x1ede97d2, 0xbeac7567, 0xabf88b2c, ++ 0xd8e5f563, 0xd46af6be, 0x863f528b, 0x3c84ea5b, 0x7a39266e, 0xd53565a0, ++ 0xa904b50f, 0x26d2dc3c, 0xbd3b71e4, 0x4796d7ff, 0x090e3c84, 0x9e8bbc79, ++ 0xa6ccb777, 0x0096b5f2, 0x05a73795, 0xc9ff2336, 0x4b4cecb8, 0x0f6df280, ++ 0x18666a3e, 0x6dd8bb97, 0xe00cbca6, 0xb98f6d88, 0x4cc8ef30, 0xf9b52ce7, ++ 0xdf395a47, 0x039d0f4f, 0x04793dee, 0x379fd4f1, 0x7e62f684, 0xca3a7a62, ++ 0x4b940e3c, 0x463ebf1d, 0x8f51f5f6, 0xf4f681c7, 0x923ffc9e, 0xf3ea3a5c, ++ 0x7f508c38, 0xe47fd7ee, 0x871e03ef, 0xe7cfea19, 0x41ebc3bf, 0xf50ac38f, ++ 0x7a8b5fce, 0xff105188, 0x47bf5fa5, 0xa64a96fe, 0xa8fe401c, 0x024c14b6, ++ 0xbafa0175, 0xc5f200f2, 0x9385cc94, 0xf28a2f90, 0xd397443d, 0x600f6b3c, ++ 0xdb11a6fd, 0x83c5780d, 0x1eb25ecf, 0xd572abbf, 0x49bbf01a, 0xc7ad7739, ++ 0xdd0f26ef, 0x6efd8862, 0xf59ef16a, 0xbbd9bf58, 0x69f680dd, 0x7731ca11, ++ 0x97591fb4, 0x969ca5ef, 0x74d771f9, 0x8c1f49fb, 0x3e93f2ee, 0x9aa97090, ++ 0xc63f7b59, 0x14ba9ab3, 0x4adefe27, 0x3fa54cd5, 0x0c730139, 0x501ef11b, ++ 0xf387d790, 0x0b5a0ccf, 0xfd6135df, 0xb83faa3a, 0xdf95fbf6, 0xe8e3f2c7, ++ 0xbf0577b7, 0xbcc7bea3, 0xfc4d77f8, 0x089196fe, 0xbba7b417, 0xbee83a17, ++ 0xa0701652, 0xf422559d, 0xd096397c, 0xae5152df, 0xb318e510, 0xe71c03ef, ++ 0xe1f2c493, 0xf305d934, 0x9bce688f, 0xe42f7824, 0x67a959c3, 0x0d1c3dc4, ++ 0xa0fc9dac, 0xd3afca57, 0xf36b91e6, 0xb8de644d, 0x9ea4bf36, 0x07fef0f5, ++ 0x3cf387e4, 0xe1f901eb, 0xc4955f72, 0x946ce9e5, 0xfff74035, 0x20d9c80f, ++ 0x008000d8, 0x00000000, 0x00088b1f, 0x00000000, 0x3bd5ff00, 0xd554740b, ++ 0x9dcefbb5, 0x9924c85f, 0x10827c24, 0xc947f9bc, 0x03108067, 0x04243209, ++ 0x20271115, 0x067cac4f, 0x027e7f94, 0xd7628daf, 0xa02ac60c, 0x2d6ac6be, ++ 0xa81beab4, 0xc95a5da8, 0x0958d443, 0x5822aa1d, 0x010553aa, 0x1101d29b, ++ 0x08cf91e1, 0xfac5a556, 0xdee7def6, 0x0249dccc, 0x5eb5d548, 0xdce76158, ++ 0xbdffdff3, 0x456639cf, 0x05cf1e32, 0xffc87c80, 0xb0e8065a, 0x0486bd5b, ++ 0xddc5a700, 0xd000194f, 0x0b4ffb3e, 0xe0f580c1, 0x9fe5702f, 0xf588dea7, ++ 0x60ad0871, 0xc5806284, 0x580145d4, 0xe0333e02, 0xa67c4bb8, 0xf02b41a3, ++ 0xbbf8d7cf, 0x4ccfb6cc, 0xab3d96fd, 0x1c6e0eff, 0x35403074, 0x0190cd04, ++ 0x551cd350, 0xad33210f, 0xfa25aea3, 0x68c0137b, 0x1868475a, 0xcbebe3ad, ++ 0x2c15439d, 0x038dce57, 0xe9c03fb9, 0x259f16ed, 0xb93ffb8d, 0xdb35cb1f, ++ 0x0a75f62d, 0x4a0eb7c1, 0x36ad0805, 0xbb708cbf, 0x4d182667, 0x6e3c3b00, ++ 0x62cf7e86, 0xfc016630, 0xe5cf53c1, 0x5c0d3c37, 0x32f1e5de, 0xc359eddc, ++ 0x134f6df0, 0xacf5efd7, 0x1e3bf2e7, 0xe780c31f, 0xf37efe59, 0x6e619adc, ++ 0xcdbf4e1b, 0x55cc1ed4, 0x700e9dd7, 0x0473b27b, 0x7f7bd1e1, 0xe1f1e259, ++ 0xfaff7bc0, 0x43972c72, 0x27adbd6e, 0xd6d932ec, 0xf65c0948, 0xde1f719a, ++ 0x46be311d, 0x886057dc, 0xdbf68cbb, 0xdcfa1e55, 0xfe86f880, 0x8dc3c641, ++ 0x69e3dd03, 0x438cc97c, 0xdeacd127, 0x09dfc26c, 0xb005f783, 0x65f14c03, ++ 0x67388cbb, 0x5d563c67, 0x65815006, 0x03c01e6f, 0xd4955c03, 0x6683720f, ++ 0x8cfd27c6, 0x9825f1c7, 0x40ebccd9, 0x62baed88, 0x9141bc04, 0x213dff18, ++ 0x74e3818e, 0x0f9806a5, 0x1d9e36ba, 0xc4f5e4a6, 0xfa5e347b, 0x5ca547c2, ++ 0x2116f416, 0x1d624b3d, 0x976eac16, 0x448d2fc0, 0x39606138, 0xa9ed38e0, ++ 0x71c12366, 0x6d056421, 0xff1dfc3c, 0x04663225, 0x44804cbf, 0x3ac2b95d, ++ 0xd2bed758, 0x6faba69e, 0xf1e6cd4f, 0x42b949af, 0x707daed7, 0x3bcc5589, ++ 0x2d825ae9, 0x79faf766, 0x18d09748, 0xd613638b, 0x5f131bbf, 0x53008500, ++ 0x1137e363, 0x9866377c, 0x3d4dda8f, 0xe03fae7a, 0xfecaa73e, 0xaa880581, ++ 0xfa1194eb, 0x2accf771, 0xf5ddb057, 0xebf463b9, 0xed226090, 0x04c706f7, ++ 0x4b1bf7dd, 0x77f5d3ae, 0x84490359, 0x95672ad6, 0xc3757bee, 0x064c60e7, ++ 0x07386d28, 0x230051c6, 0x71bacdfc, 0xd16eed46, 0x0fb11fb5, 0x91eb1264, ++ 0x13af1d07, 0x29cc7d1c, 0x9f14ab13, 0xe09d7fa8, 0xc302cf98, 0x04e01f68, ++ 0xf9103ec5, 0xf07b954c, 0xf2c4604a, 0x125cb538, 0x102635f2, 0xae41ce1d, ++ 0x0a57e911, 0x36321cfd, 0x78fe4a96, 0x9c60f896, 0x3990010a, 0x58995fb0, ++ 0xd831cc02, 0x5274e67c, 0xa8df282b, 0x8e49d60f, 0x59c22314, 0xca98b072, ++ 0x202c109d, 0x465c1b28, 0x5049afe2, 0x16ca943f, 0x7c10a770, 0xdffdd133, ++ 0x521dc7c4, 0x2e2c51b0, 0x5cfc4c94, 0x39a1d779, 0xc42f58ab, 0xbeb82c38, ++ 0x347cb6df, 0xb7fad680, 0xbf9f80c0, 0xbdf984a6, 0xe339fece, 0x37572b49, ++ 0x69fc619c, 0x30d5f6e5, 0x6e4b85d7, 0x2adcc132, 0x92ffd584, 0x48d956e7, ++ 0xa21ac17f, 0xc1fc3553, 0xdc2f3cbc, 0xed3f9a1e, 0xea2177c6, 0xd35a2abf, ++ 0xe9bd2a58, 0x2abb6272, 0x80439093, 0x8e5c55c9, 0xcddecb51, 0x5b8e272e, ++ 0xef6d4035, 0xa9f5154d, 0x5130fd5a, 0xbbc6d2ce, 0xac1fb44b, 0xaef1d595, ++ 0x51ffcad0, 0xda69f5c5, 0x1ca20d7c, 0xf0dfea27, 0x3d22ad8d, 0xb7fbe9a0, ++ 0x02313b35, 0x409d9046, 0xe90efffd, 0xef69769b, 0x4f7fa642, 0x57afa0fb, ++ 0xdfdcc3ed, 0x21735ec8, 0xd8baffe1, 0x371c913f, 0x5c72404b, 0xe9c9b77d, ++ 0x254ff9c3, 0xb0ac1735, 0xea75f185, 0xaebf0287, 0x8ca7388a, 0xce5e6bed, ++ 0x237c44d9, 0x381bedc7, 0x347fbf1f, 0xa67ac0c4, 0x8139b652, 0xd0a0f9e8, ++ 0x68ff5af3, 0x35e1b0b8, 0xd47afd1d, 0x07cf12cb, 0xe717f133, 0xd06878eb, ++ 0xa38475c6, 0xe13640cc, 0x1af49da6, 0xea2060d2, 0x7dfc12d2, 0x15aaf513, ++ 0x033fdce9, 0xdf6c069c, 0xc7d415ff, 0x0163d344, 0x5f0bbfd6, 0x284bf189, ++ 0x5e1b3528, 0x5f377b67, 0xfc46a946, 0x9f71cead, 0xc674fc26, 0x4f89b205, ++ 0xe0ec3617, 0x659e5d75, 0x1ec1f1e7, 0xe7c48bca, 0xffe27a3f, 0xffc0175f, ++ 0xfc4fbebf, 0x494704e3, 0xc8501b7f, 0x6d4b7d68, 0x977ef06f, 0x9f59dfaa, ++ 0x71db85a4, 0xee59ee59, 0x230c738c, 0x3a54387c, 0xc528351d, 0xd252be2a, ++ 0x058e9e70, 0x2c44ec81, 0x8181fc3b, 0x7b07b66e, 0xf7444b47, 0xba2038fa, ++ 0x82814a77, 0xbfd0bd03, 0x76ccd3d9, 0x85a7ab78, 0x0e708fe1, 0xaf86b3c2, ++ 0xf81eb4ec, 0xc06d32bd, 0xafabf179, 0x3bf18eff, 0x3b3418c8, 0x41ed5fb0, ++ 0x038a71e0, 0xa110cd47, 0x09a72657, 0x22d09b7b, 0x9ca57d71, 0xd5d41097, ++ 0x653a09c7, 0x9f10473a, 0x5bdb4cd6, 0xcb0a4eb6, 0x6858f8c3, 0xbe62498e, ++ 0xed7ca876, 0xf8d6be20, 0x9471f917, 0xc6fcf111, 0x0bd7ec39, 0x0bfcc37e, ++ 0xa7868f3c, 0x9d789eaa, 0xbe7e7691, 0xc77fd7d5, 0x0fd6dd78, 0xfd7b2107, ++ 0x536f8c52, 0x373c4f5a, 0xd77909a4, 0x02f6bdf0, 0x1dfb5e78, 0x9a6d79e1, ++ 0xe346e3c2, 0x147b2fbb, 0xdd6d1f4d, 0xe8e9c8bd, 0xc1d3914b, 0x329eaa19, ++ 0xdf999fa2, 0x444dee93, 0xee8eab77, 0x9e405e8f, 0xe53efd1e, 0xd16f1a29, ++ 0x57025ab0, 0xf7e7adb3, 0xb10669ad, 0x8f08efef, 0x753342e3, 0x2ff8d8fe, ++ 0x6c7f3add, 0x7a544602, 0x5d0ef5bf, 0xa77ed2b9, 0x2935fdae, 0xd7f575ab, ++ 0xf5756b29, 0xac3ee7d7, 0xd8e0df2b, 0x6e57e510, 0x3957d5d4, 0x9faba37f, ++ 0x5753bf5d, 0x8f61b73f, 0xf79e7eae, 0x86b2bacf, 0xe01eedc7, 0xc78768f8, ++ 0xd74bc6aa, 0x060b2c32, 0xae0c482a, 0xff62113e, 0x54d024b2, 0xc1c92ec1, ++ 0x8b3ff666, 0x0a0aaefc, 0xd7778aa3, 0xefd04ebf, 0x59f1abb1, 0x3c37c30a, ++ 0x5df7eb0a, 0xbb865c9e, 0x3e350e3d, 0xd7b8612b, 0x32e354e3, 0xbb68c317, ++ 0x6dc33ab0, 0x4c7a474b, 0x0191717d, 0xfe370170, 0x03bcabee, 0xc3a0f8b4, ++ 0x0aed7140, 0xca672f75, 0x0abc38be, 0xbd4cebf9, 0xb6e541c5, 0x4a4d279d, ++ 0x997e4f7e, 0xce0ca5fd, 0xdd9b3e08, 0xf91367f0, 0xe591b359, 0xd3917b9b, ++ 0x5fc174c4, 0xea007ee4, 0x30569985, 0x307d47f5, 0x68e4a673, 0x85eefe04, ++ 0x377e8624, 0x82354fd6, 0x2ae582df, 0x896fd19b, 0xacb9a5e7, 0x10cf3fe8, ++ 0x118b04cb, 0xfd0f54bc, 0xbf2e3993, 0x282a3e89, 0xae194e0f, 0xc833efc6, ++ 0x3f7ec6ef, 0xc89b35b0, 0xfbb2deee, 0x58558e9e, 0x477af70f, 0x130f3c73, ++ 0x25bfa4ed, 0xaf8687ef, 0x2f2df787, 0x1e384d48, 0x2489d7c1, 0x4a8f14c3, ++ 0xe293808e, 0x8e4c3bd4, 0x7ecf4acd, 0x7909a71f, 0xec4b2a9c, 0xb55e85bf, ++ 0x614936f8, 0xedfdc4f9, 0xeb3ee0b6, 0x9f680788, 0x4e7f26f5, 0x3bd5f901, ++ 0x2baeafd9, 0x74405d59, 0x1d289baa, 0xe38414b1, 0xcf86ba9b, 0xd68f6fd8, ++ 0x42f0d1cf, 0x60238ff1, 0xec3bfe67, 0xa2fccdd9, 0x1e6d41c5, 0x828b973f, ++ 0x78c88aae, 0x07f8d668, 0xc6738a64, 0x9de2267c, 0x03ce73d2, 0x83bee157, ++ 0x95bfc09e, 0x08f2d04f, 0x3a215e5a, 0x91e9a14f, 0x26567739, 0x57bf71b8, ++ 0xbe85dba7, 0x65484eb7, 0xd4051a3a, 0xf4c4edf4, 0xdaf9fa1e, 0x65dbf3f4, ++ 0xac77fd7d, 0xff962f9f, 0x5d8453ab, 0x83fbe68d, 0xd1319ed3, 0x8efe353a, ++ 0xd459ffe6, 0x559fe707, 0xa8bcf927, 0x6a2e67a7, 0x974a9532, 0x6d4befce, ++ 0x1c1c44c7, 0xb1be176d, 0x8e98503d, 0xf1cc8572, 0xc3be4585, 0x8d0f7941, ++ 0xd27aab0e, 0x7e7e93cd, 0xffafaabb, 0x6380e3de, 0x2ecd2e73, 0xf89fce82, ++ 0x3f7dcf65, 0x3f7d8179, 0xfbee7df9, 0xc30a21a3, 0x736d7e9a, 0x17a88364, ++ 0x0c0d89f1, 0x3e5dbfc8, 0xc5d2e399, 0x14f14d69, 0x284940cf, 0x92ddf49e, ++ 0x3fc81956, 0x38d3a304, 0x9173f918, 0xe0ed9fca, 0xb1f880ff, 0x94fc1e16, ++ 0xca8b2e12, 0x3d214d16, 0x5371f8b7, 0xbffc4f18, 0xb525f393, 0xb6a5bf6a, ++ 0xefda666d, 0xedf4a7d2, 0x9faa71b4, 0x6b4de7d7, 0x04f9aecb, 0x38046ed8, ++ 0x4dbb57cf, 0x7a576fdf, 0xc3ce7f5c, 0x8491848d, 0xd3e90bf7, 0xa6ebb24e, ++ 0x0f39f288, 0x49de17e7, 0x3bd8786f, 0x7d9f4c34, 0xf079e93d, 0xe0e7fa02, ++ 0xa27fa9f7, 0x7b8e58f9, 0xfcf44cca, 0x9bfc7ca6, 0xad07672c, 0xddcfd35b, ++ 0x0b35e77a, 0xd1ae9deb, 0xde8bc88a, 0x78c6dbf1, 0xe0b393e2, 0xaf987620, ++ 0x6be747e6, 0xfa35d1f9, 0x76f8e8fc, 0xc6e1e73f, 0xc635f31d, 0xdb4bdd21, ++ 0x1ba79cbc, 0x68ddcfb3, 0x7b55f2c3, 0x47f9329d, 0xc970de23, 0xbfcd6eb4, ++ 0xb09dfcd1, 0x7d64cb1e, 0x8cd679c7, 0x9a77d78b, 0x61ecd45d, 0x092c1db4, ++ 0xfd905535, 0xf365fb1b, 0xadbf04eb, 0xddb47a3c, 0x2393473b, 0xfe4d3b5e, ++ 0xcfc807d1, 0xb1c63578, 0x3fae7a19, 0x75d04333, 0x899e77ba, 0x0f848fe5, ++ 0x2a9a6de5, 0xdd925337, 0xce381999, 0x185ed574, 0xd9134eac, 0xfdb94ad1, ++ 0x5f1337e7, 0x13ce6405, 0xfbf1fcae, 0xb94afc2f, 0xcea17e70, 0x8ffd867e, ++ 0x3a8ce2be, 0xbe29b803, 0x8ca15918, 0xe2863f22, 0x6a1bca36, 0xf6e8c479, ++ 0x8bcab28b, 0x72957d69, 0xeb49c059, 0xd3d62f59, 0x1aeabd17, 0x2de5d53e, ++ 0xaebf9afb, 0x7e7db475, 0x28fc7c84, 0xb44e3ba3, 0xe986b71f, 0xf17cb17d, ++ 0x997e2dff, 0x4257832a, 0xf92f9b3b, 0xc20bff84, 0x01059e0f, 0xc4207386, ++ 0x3e760dd0, 0x0e0f9a8f, 0x8b83b786, 0xf74c99e1, 0x73f20cb2, 0xc481a14d, ++ 0xff2f1d57, 0xa6f88f33, 0xa6d2eae3, 0x9dedf031, 0x7ffb4527, 0x9e14235d, ++ 0x7fa5ebbf, 0xecfe27ee, 0xa2e9b1fa, 0xc9edc6f4, 0x51f10f4e, 0x3bcaf9f4, ++ 0xc73e6413, 0x961ac701, 0xe8bb2a8b, 0x70071303, 0xa4868f9b, 0xf5859cb1, ++ 0x9a8da0e6, 0xfd879cde, 0x58188ff2, 0xc912c1af, 0x5b4d8597, 0xb1160682, ++ 0x3e6905fc, 0x44dbca99, 0xa24d7e7d, 0xfe72c24f, 0x7f511898, 0xd20fa247, ++ 0xb20a1e28, 0x6005ce5c, 0x840f387d, 0x9c0dbc5e, 0x0c8c4fbc, 0xbfec25d2, ++ 0x2475bb60, 0x982163e7, 0x80bffa49, 0xe25ea8e2, 0xf2a8bff4, 0xf42e985e, ++ 0x3eb9617d, 0x4331b22f, 0xacf659c4, 0x7e88aff2, 0x26e74c96, 0x81498582, ++ 0x51148f75, 0x9b00c83e, 0x193ebe50, 0x6f9f2773, 0xcaaefd6a, 0xda867f2a, ++ 0xe380916d, 0xc5ab6f15, 0x2b9c59b7, 0x273c8c0e, 0xf159933b, 0x36f3c25b, ++ 0x17d8cf35, 0xc71fb15e, 0xcae53dfd, 0x290afdcb, 0x3cfce376, 0x79e1287e, ++ 0x4666fcb9, 0x79bdd55b, 0x25e0867c, 0x2caaf93f, 0xaf9a0ef7, 0xa3600cd0, ++ 0xe2213ff5, 0x61fa8028, 0xf45d1f94, 0x7e40c5a4, 0xc73421c6, 0xc1f88390, ++ 0x5fe09bb8, 0xf8267e31, 0x099f8c37, 0x99f8c11e, 0x3f1847e0, 0xe5f05c13, ++ 0x908a0c08, 0x03ce990e, 0x79c5cf82, 0x037af45f, 0xe7bb3e2a, 0xfcf3356f, ++ 0xe3372cf6, 0xafde9bb7, 0x61ce8f82, 0x2e8624b6, 0xbf0f3a4b, 0xc17eb575, ++ 0xe17da5e7, 0x8c873b45, 0xd2a5dfae, 0x919b60bd, 0x4b417fed, 0x44617e30, ++ 0xcc338fbb, 0xd2ff9f5c, 0xbf1a78b1, 0x5f8dded3, 0x9e5b84a7, 0x8fe5106a, ++ 0xdd574e33, 0x3bf5a36b, 0xa2bc22bf, 0x7da49f9c, 0xffbcb414, 0x1e22d2b3, ++ 0xb4292edf, 0x1c63d08e, 0x23ed4437, 0xbeda0f1a, 0xd60624b6, 0x2f2dff51, ++ 0x504ed3a5, 0x1b9080ef, 0xb7a923e2, 0xf5e6aefd, 0x150968de, 0x373d71d9, ++ 0xf7d72d7e, 0xd67b7f86, 0x7af3c604, 0x3eee6fd5, 0x4bf9570f, 0xcaa5dba3, ++ 0x4078f477, 0x9dfa11ae, 0x2a9749cb, 0xc5ce9764, 0xe7c85f93, 0xde486359, ++ 0x7da5df33, 0x90cb777a, 0xeb1f30a5, 0x2991cfe4, 0xf98345f8, 0xd11766ad, ++ 0xf1eb4b6b, 0x4c6ddbcc, 0xd805cc9f, 0xd2ccc95e, 0xc7f33de5, 0x23e5fd9c, ++ 0x9dbdb9fd, 0x3605baa6, 0xfc71da56, 0xdf3bad5b, 0xb6cd2da4, 0xc44ca91f, ++ 0x6914dcf2, 0x4a79c117, 0x8524a4da, 0x71e3eb96, 0xb09dcb6e, 0x8a6a448b, ++ 0xb9fd8aa3, 0x2264a409, 0x358543ec, 0xbb1b0e96, 0x64f695cb, 0x949af95d, ++ 0xd7f6ba21, 0xfaba1929, 0xeb8773eb, 0xa779b5ea, 0xdae94638, 0xd2852615, ++ 0x7dc3ae29, 0x66c05cb0, 0xd12597d9, 0x1e4df7be, 0x4fa9e58e, 0x9b9070cf, ++ 0x9fad45b2, 0x47c2b5ba, 0x7c42e8f4, 0x3aa1d19a, 0xb1f6b251, 0xa8b06847, ++ 0xf5baa1b8, 0xca9cbbd7, 0x7d0dc425, 0x40cb0bc4, 0x15f7db9c, 0x0bc74437, ++ 0x467f3fa8, 0xe5f0b3fa, 0x388dec9b, 0x673196ee, 0x6f88532f, 0x408e3133, ++ 0x44716ad4, 0x2dd3fc5f, 0xf8229227, 0x9b0c8f67, 0x801fe17b, 0x147e547b, ++ 0xe87bea70, 0x737de4cf, 0xe931f6fd, 0x781fce37, 0x0aaebcd5, 0x857df2a3, ++ 0x2bbbc766, 0x27f53f28, 0x1f5ce819, 0xb03ae1ce, 0x2dfd217e, 0x6e1ef987, ++ 0xc193f8df, 0x97bbf9fd, 0x355ad35c, 0x532eb7ff, 0x77aaabf5, 0x517064fe, ++ 0x1e561eb8, 0xbb87b5d1, 0xe574fba5, 0xe5f4d37b, 0x17dc2707, 0xbf2fbfd9, ++ 0x79fae16c, 0xe9ca3766, 0xa72547c2, 0xd17d17af, 0xaafe9ebd, 0xc45d687e, ++ 0xcef8f6fa, 0xae256625, 0x1c5afb67, 0x0b96f28f, 0x9ab7b0fb, 0x8645ba9e, ++ 0xd7eadefa, 0xbe39f36b, 0x210ef9dd, 0x79bec9ee, 0xf876115f, 0x1cdb8250, ++ 0xcebf27c9, 0x1d37e714, 0xf1fe1e1b, 0xfb9e74e7, 0x3aaf88aa, 0x28fd8512, ++ 0xc189f6d8, 0x9fb0b080, 0x7b02afe0, 0xa97640d0, 0x17ac716b, 0x96eace50, ++ 0x850d79c4, 0x3e8447e4, 0x3cab22b0, 0x3fadd4f7, 0x7e7f22b3, 0xece83068, ++ 0x5b051772, 0xf3257e58, 0x376469d6, 0x43dc4f20, 0xf9f6b6fa, 0x7f08264a, ++ 0x8de85ca6, 0xaa7fc439, 0xab9402dd, 0xb7409fba, 0x433d231d, 0xa7f2a178, ++ 0xef79cd4f, 0xf7f3f251, 0x7941bd08, 0x2fd95b85, 0xf9f4da70, 0x73966686, ++ 0xbc895bfc, 0xfad175bf, 0xb3268de3, 0x23d45bed, 0x2fac2ffb, 0xe91ebbde, ++ 0xccaaf759, 0x6f4e80f7, 0x08804acf, 0xc78d11fd, 0xcb32f5ba, 0xdcee56b9, ++ 0x724b5f2e, 0xaac5f741, 0x1be27bf2, 0x97fe429c, 0xcb7cc5db, 0x8d317dc7, ++ 0x56f2f4ec, 0xd2e4b8a3, 0x646b3cd7, 0xd9e62250, 0x98b2c3b2, 0xfeb69aec, ++ 0x4faabb2e, 0x349eff5a, 0xd5c04f21, 0xf457d8bd, 0xc9fd4c0b, 0x3892a82f, ++ 0x3adfdd9e, 0xb4f09ca8, 0x32bf025f, 0xc9b88792, 0x2e9beb8a, 0x36efa386, ++ 0x4a428bca, 0xd1e691ae, 0x9e2d5ae2, 0x233ad19d, 0x0fd8fc8b, 0x8fdfcdb6, ++ 0x566b0394, 0xcdc5cb06, 0x7bbf65e0, 0x952ba27f, 0xd55324f2, 0x13fb0ffb, ++ 0x6fe4ed43, 0x2b171fef, 0x1c067dd1, 0x5f1a5eff, 0x937ed7db, 0xf79eb52b, ++ 0x9d4be6a5, 0xc75fca57, 0xa89c7c5e, 0xf94ad9e9, 0xd3d709ee, 0xb02cfdf9, ++ 0xa37b3c53, 0xf86afc2c, 0x4d6790bd, 0x8149d6af, 0x99e75a24, 0x659769cc, ++ 0x0d41bf61, 0x7de6a5ff, 0xfef7749b, 0xeeafd62e, 0x959fa38e, 0x1d6a7f98, ++ 0x2da8de22, 0x9bf3f53b, 0x8c5afe71, 0x9bbfc9f7, 0x20f3b2df, 0xbe3a2fe1, ++ 0xfeaf8eef, 0xcf6f7ccd, 0x9455ccf8, 0x0cf29a35, 0x0cdff667, 0xeeb4e33d, ++ 0x2ff340b8, 0xb9f2c737, 0x21562a35, 0x9ebf2a1f, 0x607d91dc, 0x7c9fd605, ++ 0xfaecc4db, 0x745fb8fa, 0x95e589de, 0xcf19639b, 0x4bc09327, 0xa6e4e476, ++ 0x1b179f1c, 0xda84322c, 0xd6c1bec8, 0xf9a73e38, 0xe79c89e4, 0xe4fca79e, ++ 0x87ec5973, 0xe828fc90, 0xf7427cc2, 0x8bfbe88d, 0xb81fb983, 0x550bbcc5, ++ 0xc99f94b9, 0xd51969ff, 0xf9cc933f, 0x277e8d09, 0x5271889e, 0xf077f6b0, ++ 0xf591d817, 0xe3de494e, 0x99714f74, 0x12c3f9e1, 0x3f6765f2, 0xeba20cf7, ++ 0xcffe5fd2, 0x9fb8a507, 0xf86e678a, 0xdf5c18c5, 0x0007f792, 0x6ba6138d, ++ 0xe9c37eef, 0xfe4219ed, 0x7b2cfc55, 0x2c77c636, 0x34d49f42, 0x75caea27, ++ 0xc77d832d, 0x32d0f422, 0x6a863810, 0xaa09cf89, 0xb38ab955, 0x7a256fb8, ++ 0x547dd0d4, 0x7fb89fa6, 0xabce923a, 0x590fff08, 0x7cd1ff18, 0xf84b22b6, ++ 0x9e5ad5b5, 0x29ac1927, 0x816eb724, 0x7287aebf, 0xf63c5136, 0xea925640, ++ 0xa7b28477, 0x67f247e5, 0x9c6bed5b, 0x7b88b1e7, 0x9fbd318e, 0x12b27beb, ++ 0x5a17ff99, 0x99e5d33f, 0xeace1b6a, 0x79b53ff2, 0xc8c07ec0, 0x1dd46546, ++ 0x74a85708, 0xbaea9599, 0xfcdef187, 0x197bcbf0, 0xf0ff8f9f, 0xb7779a43, ++ 0x7b07e98d, 0x2a2c78d5, 0xfd685ade, 0x8dbf9554, 0xfbed5ebc, 0x0a070df1, ++ 0xfc71ff28, 0x9405e1a5, 0x072f9da7, 0x8d2aff8e, 0x5e1d39ef, 0xeeeb7085, ++ 0x1e2f38f7, 0xf71edebd, 0x87a12418, 0xc91f69aa, 0xb5c7ff74, 0x5ce58b3e, ++ 0xeba387e8, 0x5a7f19f2, 0x64ebba3e, 0xb6a0f1ef, 0x6d7c6d4e, 0x5af8da7d, ++ 0x44b3a7bb, 0x0e61d8dc, 0x2ffd9014, 0x889873a6, 0x3e23a3b8, 0xa3689050, ++ 0x2ed176ef, 0xfc11cb09, 0x579eeff6, 0x754f9f45, 0xf9aacb9f, 0xd58683a8, ++ 0xfe4669ff, 0xc47e6f6b, 0xbbd48ee4, 0x4a9cf0df, 0x9f76af5b, 0x636ec3b6, ++ 0x2cade6ff, 0x0a9f1f35, 0xeb0ed4a9, 0xbff27e1d, 0xe41c5ab7, 0xae2d3bc7, ++ 0xabfe123f, 0xbfbe7ecd, 0x5a73f5a6, 0x3a3dfcdc, 0x6895df2f, 0xdca7ba06, ++ 0xff3d4035, 0x5eb03bfd, 0x2b7438a1, 0x61545bce, 0x0b6adfa8, 0x7f4d43eb, ++ 0xefc70d16, 0xd46f7479, 0x9013f618, 0xf50a8a6f, 0xd1fbc3ed, 0x0b669797, ++ 0x1b25163a, 0xbf938d7a, 0x11b2e552, 0xcf21659a, 0xaa968ec2, 0xc91dc778, ++ 0xad4d7e91, 0xe2bbe7aa, 0xd83a5ead, 0xee2edd2d, 0xfd1a96a9, 0x16a2093b, ++ 0xba248680, 0xe317e932, 0x39f5e8b5, 0x6c5990d9, 0x5db38797, 0xfb92ab1e, ++ 0xef9ea93e, 0xb5ef86b3, 0x57826406, 0x13a18843, 0x488246ec, 0xc1138606, ++ 0xd41270c5, 0x9a16bc33, 0x66864e18, 0xc0205386, 0x37f4ae10, 0xbb83db02, ++ 0x5d3feced, 0x7640c8b7, 0xdee6e8b9, 0xfb2572fd, 0x2d40f842, 0xf8e97c5f, ++ 0xc3dea498, 0x432f13ed, 0x35ef9973, 0x3f8858bc, 0xf80c5fb1, 0x838e0852, ++ 0x9e338f20, 0xe2833918, 0xf9ef8575, 0xcb938056, 0x8f891795, 0xe8dba092, ++ 0x2f05ebce, 0xc9f3bd15, 0x5e5e2a15, 0x27e606cd, 0x6cee5e8d, 0xba3417a1, ++ 0x429f7c61, 0x3d27a0f6, 0xb3ad1861, 0x8cfcb628, 0x9ae32a82, 0xd3a6cbec, ++ 0x51a2fb3d, 0x85482be5, 0x70f4f2dc, 0x7f2d2e51, 0x6fea8e91, 0xe517cecd, ++ 0x2651f2c2, 0xa93bea07, 0x2c44fa60, 0xe3fbd5bb, 0x74023456, 0x10ce4c6f, ++ 0xf56ec2e7, 0x4e45b91e, 0xc5f74d5b, 0xf580ab2c, 0x20063b8d, 0x722d7ec0, ++ 0x4f8bc91b, 0x7695e7d8, 0xb1d1bf41, 0x64d909ee, 0x78feaccf, 0x72b0e905, ++ 0xb220e575, 0xc59bf79b, 0x280647f8, 0x7c435fc3, 0x5ee22c59, 0xac5fb6ab, ++ 0x3960c6f7, 0x1a2b2928, 0xd2ebc2d2, 0xf31171d6, 0xef37ceba, 0x33dd4397, ++ 0x2a0ec9b2, 0x862b8e0e, 0xeb7df6a8, 0x8e0752d6, 0xf3b0eb84, 0xd971823a, ++ 0x6ab01a2b, 0x4dcbaa72, 0x09c575e3, 0x9d13743e, 0x1f0df406, 0xa1ce76c8, ++ 0xbbdfd1f6, 0xb2f17f56, 0xc7d2f49f, 0x671c10b8, 0x017bb665, 0x0433abb5, ++ 0xfa428d87, 0xd87b13dd, 0xf1a37c4c, 0x9cc484b5, 0x74687885, 0xf2cccf82, ++ 0xf6ef6652, 0x72c232cf, 0xc700b5d1, 0xb914fc43, 0x2ee8155c, 0xfaccf142, ++ 0xb89609d7, 0x86b02a9b, 0xf3ce59e6, 0xc485a1c8, 0xef899d27, 0xb9663f9b, ++ 0x53f82a1d, 0x3bad67d5, 0x221aacf6, 0x90882e8a, 0x671dbacb, 0xd20bff3f, ++ 0xcdb4eebd, 0xb74bcd41, 0xf141586f, 0xe88f2681, 0x8df4ea1d, 0x5b639f26, ++ 0x58707c2c, 0x058afdba, 0xfbdc7ed4, 0xb7a4196d, 0x1b05b7c7, 0x6aee7dc9, ++ 0xc844303d, 0x7fd7e689, 0x7d8a5d21, 0xfc8ac4f9, 0xbfce2091, 0x497a6e39, ++ 0x572f7f9c, 0xf6549df3, 0x1c457ef2, 0x359bc5aa, 0x7be4de7b, 0x978c38c3, ++ 0x5d44bbf6, 0x6fc7e2ff, 0x167c429b, 0x8b488efd, 0x76d4eb43, 0xf77cdacb, ++ 0xdfa23ed1, 0x1c51d515, 0xbbf7d05a, 0x2bc7baa2, 0x7e8d0e38, 0xb674f457, ++ 0x76aa871a, 0x73ff5411, 0xf686da91, 0xd0b8e367, 0xdee0b3ec, 0xc2b13f96, ++ 0xaa72a761, 0xb87ac1cd, 0x5be70361, 0x78f0f6b5, 0x268af332, 0x48d64bc7, ++ 0xf86b57ec, 0xe2da7c2c, 0x3e1475a4, 0x65fd883d, 0x7dc5f3f4, 0x488f3574, ++ 0x5de8066f, 0x50c496c1, 0xdd2fdd3a, 0x20eb9ad2, 0x1e77fc3f, 0x0a647c27, ++ 0x038b4faf, 0x2be7e52a, 0xe9d09de8, 0xc2be31db, 0xfcf7cb4f, 0xe58ad1ba, ++ 0xf5e96be5, 0x372d2d0f, 0xd1a9fc81, 0xd1f065bb, 0xa47be038, 0xfdbef28c, ++ 0x525b7c84, 0xe044a00c, 0x07e94623, 0x00792f4a, 0xd8bf4a8b, 0x7d5d24dc, ++ 0x5d32e39c, 0x749284ff, 0x8c637d5d, 0x5e031778, 0x38af2067, 0xd1245efc, ++ 0x1faea579, 0x715ff104, 0xfdc85df8, 0xf37693f1, 0x62db11bb, 0x5f244fce, ++ 0xded7523b, 0x89976f22, 0x333ecbaf, 0x1579e8ea, 0x6f11b865, 0xbfd0fb25, ++ 0xb6c679c1, 0x8263ebeb, 0x317ea05e, 0x7cba8cfb, 0x97d14584, 0xf7ab664f, ++ 0x50c28622, 0x1ba27e5d, 0x4fef82ef, 0x5f30309f, 0x2fe64314, 0xcf088aca, ++ 0x3d29f026, 0x841a76f1, 0xa87a75bf, 0x75a5e1cd, 0x265179ed, 0xd2e01839, ++ 0x4cd07fe3, 0xbb07fe3d, 0xb21ef8f5, 0xd4ef8f58, 0x2fbe3d7a, 0x35e3d06f, ++ 0x5bc7abcd, 0xbab19ac6, 0xe54d59f6, 0xface72ba, 0x57f6bac9, 0xcae9a6f8, ++ 0x81fd9fc3, 0xf37e7dae, 0x617d5d7c, 0xbd5d52cb, 0xf17d67c6, 0xf2ff08c1, ++ 0x80337e28, 0x307c3ce1, 0xba5df76a, 0xfa2bbef9, 0xeaa3915f, 0x59fe9505, ++ 0x4ef09faa, 0x490789fc, 0x6ac6a75c, 0x33cd4ffa, 0x8e389994, 0xae49577b, ++ 0xa0bd2388, 0x6a9739da, 0x13ca60e7, 0x765c27ac, 0xc4047651, 0x07918abd, ++ 0x0af1155d, 0xf710afdd, 0x344f8a2a, 0xfb502455, 0x3756f7a8, 0x73ba4896, ++ 0x57f7e8ee, 0xe5abbdd3, 0x23ee8904, 0xd1897b8a, 0x77b41ff7, 0x18ce5558, ++ 0x5f78f9dd, 0xbcb4b2ef, 0x6009c612, 0x60c138a6, 0x3d8877e5, 0x7ac720fd, ++ 0x3734fd99, 0x496f6dfb, 0xdd37ce6e, 0x230c0d64, 0x887cfefe, 0xe20e7a7b, ++ 0x50e0d3ad, 0xdf53cfd8, 0xc6d17569, 0x0bd39df8, 0x52dde9d3, 0x94b98617, ++ 0xff751ccf, 0x36bdd373, 0x583dbe5e, 0xfa69c22c, 0x67b8e771, 0x254738d1, ++ 0xb0a37dfb, 0x4f633bef, 0x663b230d, 0x91fdf3a1, 0x873dee7c, 0x29f3bbea, ++ 0xa87f7083, 0xc506836f, 0x77b8e7cb, 0x9c9f1c49, 0x44c6c1a2, 0x931aefc8, ++ 0xc4546efa, 0x7c55b36b, 0x2cdaf169, 0x38a3fe75, 0xe7d462c4, 0x62de5bb3, ++ 0x694b2cbc, 0x7abce357, 0xbfc71d87, 0x246da86d, 0x8e72f3df, 0x5f388872, ++ 0xc886df8b, 0x5ebec4df, 0xb2d5fee8, 0x38ba9394, 0xee4f9e1a, 0x9d194f35, ++ 0x5bef0b0f, 0x6d747f8c, 0xa3a1db2c, 0xef39536b, 0x93bf1e18, 0xebb30af3, ++ 0xe7baf7f5, 0xf1d21c36, 0x11ef3cdf, 0x7fb07d5d, 0xf70434c8, 0xf0797c1f, ++ 0x7f115ba4, 0x8a592f1d, 0xba458e29, 0x1113923d, 0xca1f0767, 0x5df34899, ++ 0x78a79f78, 0xbdea6d1d, 0x879f6d5a, 0x1cb9073d, 0xeea304f4, 0x71757939, ++ 0x7fcd06af, 0x9ff25c80, 0x473f5243, 0xcb9c796f, 0xd93c4573, 0x6d2fbea6, ++ 0xb697df53, 0xdb41efa9, 0x6d9ff7d4, 0xed4ffbea, 0x049b6e7d, 0x3257ba4e, ++ 0x985e524b, 0x73efc697, 0x759f699b, 0xf405434b, 0x30aeb17e, 0xf9924738, ++ 0x398bee7d, 0x9f7d7a03, 0x2ea1205b, 0x76739d38, 0x67f291ba, 0x649dbcfd, ++ 0x99f7ffb1, 0x2cd944cf, 0xcf1fe3e4, 0xef174db4, 0x34addd75, 0xec8351ce, ++ 0xfef5be27, 0x64f3e24e, 0xd3cd0670, 0xeefde22e, 0x9ce2399b, 0xfc145764, ++ 0x6bd08e6b, 0xa56150ff, 0xbf3660fc, 0xe16f5ab7, 0x1f3856f7, 0xeef37bbf, ++ 0xe8daf910, 0x7f237177, 0xfe93f16f, 0x873df2d0, 0x3339c472, 0xb92397bd, ++ 0x8b53ffeb, 0x0c172f78, 0x75f7a30c, 0x45c9ff74, 0x9c0fbdf2, 0xce5dfde2, ++ 0x3077c8a6, 0xfbd47287, 0xee83b779, 0x9ecd5e7d, 0x9f4987a3, 0x9f71ceac, ++ 0xbea03d61, 0xdf89ab1b, 0xb7defec9, 0x493c0f98, 0x06b1ae78, 0xe6aa9f85, ++ 0x4fc2fb03, 0x63c082c7, 0x77e16979, 0xd9ef116d, 0x5e1a9d78, 0xc78675b4, ++ 0x6bff3f39, 0x7cad2d79, 0xd9fdc37c, 0x7f884f24, 0xa5946f91, 0xe97ad3b9, ++ 0x9c57303f, 0x754acdc3, 0xf794b949, 0xbf7917ab, 0xfd347f30, 0x87d243f0, ++ 0xdebd6c7b, 0x47fad7d7, 0xc766b3ef, 0xee07c61e, 0x2fed0e73, 0xb9099f62, ++ 0x68ecfb11, 0x9e58f03d, 0xfbfbe972, 0x2dc8efa6, 0x4d6e30fd, 0x8e8f2dea, ++ 0xffc22656, 0x87fd68b2, 0xd1fdf51a, 0x753ca6f1, 0xfa35c90b, 0xb8d4db27, ++ 0xf12fec86, 0xb77f6685, 0x460e3159, 0x770525bd, 0x79a7feb1, 0x93efff89, ++ 0xb5076cbc, 0x84a3467c, 0x06f28e76, 0x176c15ee, 0x0e6dcbe4, 0xc86ddfe2, ++ 0x7be2017b, 0xf39633a3, 0x73f151d8, 0x84bbac6d, 0xcff2b5e8, 0xbe2883e5, ++ 0x64f6fade, 0x76134e35, 0x9fcab469, 0xda7e69a3, 0xf3025e47, 0xbeba916d, ++ 0xfb3d6b62, 0x2bc063c3, 0x9a85bc8b, 0x4bbb5907, 0x1ffddf17, 0x0f9284da, ++ 0x00004210 + }; + + static const u32 usem_int_table_data_e1h[] = { +- 0x00088b1f, 0x00000000, 0x51fbff00, 0x03f0c0cf, 0x33a98f8a, 0x32e8f430, +- 0x31e8a430, 0x43d4dc30, 0xcf12d388, 0xbf4ca2e1, 0x83030b30, 0x038b1028, +- 0x7f1024b1, 0xf8606463, 0x7ebc48ce, 0xbb04115e, 0x81818045, 0x070fc80f, +- 0x1905ffd2, 0x330b3e18, 0xf903f030, 0x6dfc80b3, 0x88087c40, 0x376280c3, +- 0x2067f480, 0x02c40fbe, 0x17cdf822, 0x417f2024, 0x07ff9508, 0x1042ff8d, +- 0x61637ebf, 0x0496f2fc, 0x4de1b1e4, 0x0f8cdc04, 0xef40a77f, 0x6a87e040, +- 0x557d7ca8, 0xa02b0606, 0x843a8758, 0x7e4908ff, 0x40cc5016, 0x93e6c215, +- 0x05506067, 0x61ab1ff2, 0x281f9737, 0x5f9406af, 0x00073506, 0x15e5ac6f, +- 0x00000368 ++ 0x00088b1f, 0x00000000, 0x51fbff00, 0x03f0c0cf, 0x022aa78a, 0xc3033ab1, ++ 0x06060d6e, 0x06064d03, 0x1c840631, 0x373fb0ad, 0xb177fa65, 0x01ec3030, ++ 0x7c407de2, 0x980b8800, 0x990a1818, 0x242fd788, 0x0afb608a, 0x03083032, ++ 0xfa40a2f9, 0x4c50108b, 0x04418184, 0xf2064fc8, 0x1bb881eb, 0x6281a388, ++ 0x21f4804b, 0xc40d5e20, 0xcdf8a2a2, 0x7f202317, 0xff951854, 0x577f8d11, ++ 0x037ebf08, 0x76f2fc11, 0x61b1e404, 0xe3f22b66, 0xbd0283c3, 0x2ad78103, ++ 0xcafff2a0, 0x00f03031, 0x211542c5, 0xf24875fc, 0x7fb140e9, 0x39f61072, ++ 0x015c6009, 0x602bd6e5, 0x503cf737, 0xae5013fe, 0xf7349158, 0xf2a0e914, ++ 0x34208c5b, 0x711dda00, 0x0003a8d3, 0x00000000 + }; + + static const u32 usem_pram_data_e1h[] = { +- 0x00088b1f, 0x00000000, 0x7dedff00, 0x45147809, 0xf4f570da, 0x73264cf4, +- 0x10909264, 0xa70930ae, 0xe15c380a, 0x1084ca30, 0xa8ea2416, 0x1388a888, +- 0x2e421081, 0xf57175d1, 0x11c3a7fb, 0x9e375941, 0x1d47facb, 0xa22cdc10, +- 0x60188806, 0xb200c1c0, 0x1761bb8a, 0xc363d715, 0x01921a0d, 0xe5c58f15, +- 0xeaadf7ab, 0x44ceee99, 0xeff3eba2, 0xe3fdfb7e, 0x575453e3, 0xef555bf5, +- 0x5dbd6f5d, 0x71024a31, 0x02e426f6, 0xf211c6fc, 0x4908488c, 0xe36d9689, +- 0x1749c7c3, 0x92cde442, 0x8840ad6b, 0x343dbaf0, 0xfb21046e, 0x33010956, +- 0x587687ad, 0xd3f5a109, 0xcc07d735, 0xd43eb419, 0x9afac1ec, 0xbee7ac1c, +- 0x48c3aefa, 0x8aafa5eb, 0x761ba846, 0xdb34729c, 0x37372908, 0x7d05723d, +- 0x24557e1e, 0xc450e9ab, 0xb240c535, 0x471e3908, 0xad196fd8, 0x685212a7, +- 0x55d2d561, 0x3cc2673b, 0xc4cc1a8a, 0x6e94e142, 0x15ed7b99, 0xaf773eb4, +- 0xe94ba044, 0x77534ada, 0x10179f5a, 0x68bea0ea, 0x4e3887c7, 0x545278db, +- 0x4f908837, 0x35c471fd, 0x4d1dd680, 0xe7d137a9, 0x130d81c5, 0x7af17fa1, +- 0xfda06dc1, 0x7e766b8b, 0xeb8bf004, 0x8522bea5, 0x4ad6bf3f, 0xd8d9035c, +- 0x63ac0817, 0xdf30b5ce, 0xc4483fd2, 0xe745eb4c, 0xc01136ef, 0xe4dab191, +- 0x8ff8c3b5, 0x18765c9a, 0x51c716a7, 0x7bfa59f0, 0xaf7d0e3a, 0x0dc165ec, +- 0x10332b4b, 0x75a7cc1f, 0xf3fa658b, 0xa5575836, 0xbfbc3fa9, 0xf41341e5, +- 0xd8281b9b, 0xfcc1716c, 0xc2269956, 0x99566b3c, 0xe145070a, 0x517dafcd, +- 0x2be3af33, 0xa9f574fb, 0xa7e5f5da, 0x735a8a7e, 0x884c5eb4, 0xf306cea7, +- 0x1fae980e, 0x547e7d1c, 0xcf7a4448, 0x2b8915af, 0x529f0a2e, 0xefcb9f1e, +- 0x1f027fd2, 0xd607b76c, 0xb5e94466, 0x8eff09c0, 0x93acebd2, 0xce18cfd3, +- 0xca57c352, 0x740e8047, 0x277ed53e, 0xd3f98f96, 0xefc27cb0, 0xe53dbc42, +- 0x4ae5881f, 0x3f9f1bbf, 0x658d1fed, 0xe583df8d, 0x5849feb3, 0xec5efc06, +- 0x1d3fdab7, 0x1f7e35cb, 0x5fc17f3e, 0xbfad6584, 0xf3af9f02, 0xbd72c42f, +- 0x2fe7c65f, 0x596197fb, 0x72c6afe7, 0x96257fa3, 0xf600fef5, 0xd7e9ccdb, +- 0xe7c3afe0, 0x580dfd5b, 0x2c21fd06, 0x62f7f877, 0xd5e382b9, 0x8c724d91, +- 0x0f0e2f14, 0x20715271, 0x1c9ef949, 0xbc93d689, 0x433a9eac, 0x7ad131ce, +- 0x29d68faa, 0x8497ba9e, 0xdeb4cc72, 0xa7b582bd, 0xc7c6403f, 0xccba7ad1, +- 0x785733da, 0x3d685bc6, 0xf7b59ab3, 0xc7c791af, 0x00ff7ad3, 0x7d74bf6b, +- 0xd695bc68, 0xed63ad2f, 0xd7248243, 0x4243eb46, 0x9f6c3eac, 0xeb4ed727, +- 0x3d589ac3, 0xd73923eb, 0xcd59eb41, 0x2db1fdec, 0x5a04dca1, 0xed661b1f, +- 0x166f9d57, 0x67f8315d, 0x459be4b3, 0xf2032d28, 0x1bb18f14, 0x777c9bad, +- 0x97c53713, 0x1c63d53c, 0xc923f143, 0xbe4bbed8, 0x4c1bdb1d, 0x27bfb632, +- 0x56fb6217, 0x27ed8029, 0xdf6c72e5, 0xfb600a6a, 0xac42f2b7, 0xb610a507, +- 0xb12b2adb, 0xc214d07f, 0x87caf4f6, 0xd4877db0, 0xcaeeed8c, 0x877db1c7, +- 0x1fdb19a9, 0x99e3525b, 0x0b0feb40, 0x2f81a7be, 0x22be0b17, 0xadf807d2, +- 0xf94bcd2e, 0xd3204aad, 0x0117bf81, 0xaaf6d253, 0x47d4266e, 0x7ace3f9b, +- 0x6f38145e, 0xe17a8176, 0x20650f0b, 0x8e11e79c, 0x1788e144, 0xc9f59387, +- 0xac9c0d68, 0x38148a4f, 0xa58e11eb, 0x7f367073, 0x9f3b5632, 0x38158a4f, +- 0x149192af, 0xeb73bd8e, 0xb65bfaca, 0x2b7f3e76, 0xc0ece051, 0x6e7624f9, +- 0xb4c70d3e, 0x163869f8, 0x389bcfc1, 0xcdce949f, 0x2d71f467, 0x8f1f467e, +- 0xe109a7e0, 0x9c1ceb74, 0xfc5ae386, 0xe08f1c34, 0xd38403e7, 0x1aeb73ab, +- 0x9f8b427d, 0xf82227d1, 0xc9f88c39, 0xad9c1ce8, 0xd9f8b5a7, 0x9f823a7a, +- 0xbf4e10cf, 0x6c6badce, 0x633f16ab, 0xf9f8235b, 0x4975d702, 0x6d6ce0e7, +- 0x6b67e2d5, 0xdf3f046b, 0x9dc19c21, 0x36d8d75b, 0xb6c67e2d, 0x1263f045, +- 0xced0ce00, 0xa5f827cd, 0x2fc13f16, 0x4049f823, 0x373b2338, 0x5a73ec9f, +- 0x8b9f64fc, 0xe10d27e0, 0x9c1ce98c, 0x7e2d39e0, 0xf822e782, 0x573840c9, +- 0xd95d6e76, 0x93f1695f, 0x3f0455fd, 0xf7400a97, 0x421f3e1c, 0x863bd8e1, +- 0x2d3be3b3, 0x177c767e, 0x9c70cfc1, 0xcf9f1e4f, 0xf55ce045, 0xae7e2d0f, +- 0x3f0447fa, 0x726708d9, 0xf8ece0e7, 0x3b3f1687, 0x4fc111fe, 0x9aebae1e, +- 0xaaebadce, 0x5cfc5a0b, 0x67e18175, 0xdcbad1d4, 0x6d4eda04, 0xafa45ba3, +- 0xf1ef3b8c, 0x3a2eb408, 0xba745d59, 0xa22df809, 0x26908fe2, 0xb7df488f, +- 0xf61c4fad, 0x25fb5110, 0x75826fe3, 0xa697a9d9, 0x46124bf6, 0xa0fc6bc7, +- 0xa6924f44, 0xbba93c9e, 0x378a7fa6, 0x75ded353, 0xf69aa5fa, 0x9a61be6e, +- 0xb1a28f7a, 0x2abdfe9a, 0xbdea6bc6, 0xe9ad5e17, 0xa0df219f, 0x7659f7a9, +- 0xbf7fa6ab, 0xed353bea, 0x6b165603, 0x2c092fda, 0xab2fd4d0, 0xffa6a5fd, +- 0x9a45bae0, 0x1e1bcbf6, 0x0d0fb4d2, 0x0fa9a63d, 0xa6b4fbdf, 0xd5a6c8ff, +- 0x0751f69a, 0xc7da69d7, 0xd4d46f34, 0x55b938af, 0xf0caffd3, 0xb8fa9a1b, +- 0xf4d2dfaf, 0x1e7394a7, 0x45d78cbf, 0xfb820b90, 0x099bb902, 0xdd90c5fd, +- 0x77537584, 0xd827db1b, 0x29475d0b, 0x9f064ddd, 0x812d0bab, 0xfdda84e6, +- 0x0345ee9c, 0xdc5f299a, 0xc037d63b, 0x6bdf9f49, 0x8cee5df2, 0x7e509fe1, +- 0x941a4811, 0xfa94032e, 0xc62507f6, 0x9c7be3af, 0xbe887fef, 0xf7086e5f, +- 0xbff5a44f, 0xc002721b, 0xd4082fdf, 0x157ca7eb, 0xe80a922f, 0x1e266f17, +- 0x3307dfe0, 0x55979eb2, 0x17acbcfc, 0x0a215395, 0x4be49977, 0x5d643f03, +- 0xf832bbe5, 0xe8bd5529, 0xf213baba, 0x486ef0a2, 0xefdf4bee, 0xa3e69855, +- 0xea26ccf0, 0x37c7abe7, 0xe107f1d1, 0xcfc075f8, 0x94fc619b, 0x339be3f6, +- 0x8fc66b47, 0x8cd22f4b, 0xe3a2671f, 0xafbea93b, 0x4f8f98fc, 0x90963289, +- 0x38c7c26d, 0x08bd39be, 0x44d07fc7, 0xf1ea3df7, 0x87e323e3, 0x3a7bfd60, +- 0x58e67f5a, 0x8bd3faed, 0xb137ebb5, 0x7955bff5, 0x8f1f8f8c, 0x385b7feb, +- 0x5e9fd6c6, 0x666fd6cc, 0x3be32370, 0x826ff822, 0xd1d7bff5, 0x6b64fbfa, +- 0x44bbdfd7, 0x1b337ebb, 0xa795afff, 0x1c36f8f9, 0x34e143ff, 0x12ef7f5b, +- 0xf664df1c, 0x4c7f81b9, 0x022be23d, 0x93d27c74, 0xc0aeae2a, 0x281c742e, +- 0xa6512607, 0x2149e427, 0x6f71e713, 0x73b7e33c, 0x50df94f1, 0x9cf8c91f, +- 0xa3e6a804, 0xce329cfb, 0xe7d7f3fb, 0x616f4098, 0xccefdd3b, 0xdd9d53e1, +- 0x937f2220, 0x7e81cc27, 0x0dadbe74, 0xd9f50ca2, 0x00195c4f, 0x266e58fd, +- 0x3de17877, 0xf3c10923, 0x5e0e4f63, 0xbe975ead, 0x1d2d539c, 0x17c8d66f, +- 0x9e3c8f9b, 0xf3a0ac0c, 0x182603cb, 0xa71fad19, 0x98d829fb, 0x12fba61e, +- 0x74484f28, 0x28fcfa3c, 0x01916fdd, 0xc4a9b96a, 0x79ec88f7, 0xff9d2fb7, +- 0x3cfca234, 0x51dbceb8, 0x233c28a4, 0x1af1ffc3, 0x98f40021, 0xf9f74d53, +- 0x372ff92a, 0x170ef933, 0x02d58108, 0xff7d2bc7, 0x813efe66, 0x33f851f9, +- 0x8f9dec9d, 0x47b35c77, 0xedfdd070, 0x9c0d64ca, 0x6960485b, 0xb6ff7d1a, +- 0x62253b15, 0xe828be00, 0xe5f800b5, 0x7084897e, 0x429cda9f, 0xa0667106, +- 0x064e7df0, 0xd2e9e6ff, 0x9c1566d1, 0xc79c5299, 0xf333e74b, 0x7be7113e, +- 0xdedb4f8b, 0x31eac3bc, 0xcae5a10c, 0x494225cf, 0xb6915b7e, 0x6d0af6fd, +- 0xda858efd, 0xee0f5d3a, 0xfd640bf3, 0xba1cba73, 0xeb233bce, 0xf5a70ba6, +- 0xd66dbc59, 0xd0d64932, 0x4d736e91, 0x133dbc59, 0x4f104ed0, 0xf69f7ef8, +- 0x681f29fd, 0xea5773ea, 0xf8be71e0, 0xdffff4ff, 0x86f2ff4d, 0x5547c59c, +- 0x9bad2af3, 0xaaa8f8bc, 0xebdafcdf, 0x8179f535, 0xe7fd345b, 0xb4d02cae, +- 0xa79ea9cf, 0xecb59f69, 0x40bd4d2e, 0xffd34fbe, 0x9a95858e, 0x962bdbf6, +- 0x2b6fda6b, 0xbf53547a, 0x4d5bf7c5, 0xafa79bff, 0x3b0bb4d2, 0x466ef5e6, +- 0xddebe9bb, 0xf4fe928d, 0x7c026607, 0xc2b3f0a6, 0x69fd27ef, 0x77ea7e58, +- 0x7a095961, 0xc377ea98, 0xaf965616, 0xfa0de82e, 0x13ffe15c, 0xe83a4552, +- 0xeb3f3d4b, 0x4f9eaff5, 0x2c47afe9, 0x4b29433f, 0x3b05e204, 0x64fdc6d6, +- 0xdc37f9e5, 0x0ce782ce, 0xc9898965, 0x6ec6c965, 0xea0389e3, 0xb615fea1, +- 0x3a92e18e, 0x2041d701, 0x74029a4a, 0x976d41eb, 0x347dae9a, 0x29d96cf3, +- 0x2065f8e2, 0xdcc06393, 0x60187778, 0xfa6350fc, 0x3e61838d, 0xdeb1d79e, +- 0x56fe8290, 0xe2d27f8b, 0x7f00fda3, 0xfa4f2c5e, 0xdc7963a7, 0xa8f2c3ef, +- 0xc3cb08bf, 0x9b2c0afe, 0xfcb10bfd, 0xf9632fc4, 0x96197f91, 0x6357f57f, +- 0x12bfd079, 0x01fcf7cb, 0x1efd5b2c, 0xfd3e152c, 0x18eba14f, 0xae9cbfc3, +- 0x3ae9a8df, 0xf364e0c6, 0x187d74e1, 0x6fc31be6, 0xc8ce0fee, 0xe23f9548, +- 0xdb718c99, 0x4ece3c05, 0xc71624c8, 0xa62f63e5, 0x6fd09ae0, 0x3d040c09, +- 0xb7e0767c, 0x7d4e21fd, 0x4a2520f6, 0xd3ebc746, 0x3c43afd3, 0xeffa0f10, +- 0x974a0185, 0x96edf6e4, 0x8b578678, 0xc3224c81, 0xefde5908, 0x839df705, +- 0x49246eb0, 0x7dc07ef0, 0x5c063dbd, 0x7e020bea, 0xc5d7862f, 0x004373f6, +- 0xffa7f1de, 0x18e5059e, 0xe307f303, 0x4bf4451b, 0x3779e849, 0x67a237e0, +- 0x8834eecd, 0x99fb86f7, 0x9af7689c, 0x4fe2d6ae, 0xbf835abe, 0x55fc11e5, +- 0xfafe21a7, 0xc28ffb9e, 0x8784f11f, 0x8a3830dc, 0xef846fbf, 0x1e729fc7, +- 0x36ef1fa3, 0xf883f8d1, 0xc1552db2, 0xa13a536b, 0xf811fce3, 0x5b3fc29f, +- 0xf001203f, 0x1173811c, 0x7faf08fa, 0xe8fa0e9c, 0x16c9d034, 0x0e9f7785, +- 0xcfbdd9de, 0x5fefc03b, 0x47ca2690, 0x2959e063, 0x6432eb4b, 0x6a4fda9b, +- 0x56cfd6d0, 0xd0ea930b, 0x4c25719f, 0xd7fa0c1d, 0x40951f29, 0xa961a64f, +- 0x669059c0, 0x7d2871c2, 0x4faf5c98, 0xd4ffb944, 0x7efd871f, 0x047479ea, +- 0x7a8f3a27, 0x0fbe8472, 0x4fa17f2c, 0xe43bfdc7, 0x2617e353, 0xa091b388, +- 0x97fc0e74, 0x05fffa38, 0x46237838, 0xcb702bac, 0x7cd944eb, 0xaf5f3c39, +- 0xe7be8f19, 0x2f06ce52, 0x3c9f7e64, 0x8571c918, 0xa8a9a95f, 0x48d61881, +- 0xac8b5be0, 0x35128ff5, 0x6e86f2f5, 0x825fc6b2, 0x4a3d507f, 0xf023048a, +- 0x9f67094b, 0x996da336, 0x0bf7e740, 0x3e816208, 0xd2bf5810, 0xcf9366b8, +- 0x78b2fc05, 0xe82e15da, 0xd5eb8d59, 0x2fd28fcf, 0x3c7528c3, 0xd9e2f9ff, +- 0xe431bd7b, 0xdbd72763, 0x57160625, 0x03b27120, 0x9a48d7ce, 0x8ec1b8ec, +- 0xf045b353, 0x3a3b7183, 0x0a0f0a8e, 0x2901799c, 0x995ff5ac, 0x5818b65c, +- 0xee3f40bc, 0x94dc619f, 0x6cafe38b, 0xb089fefd, 0xcb1e3d6e, 0x7c98ce1a, +- 0xbff45728, 0x151e28ac, 0xf442fefc, 0xeba459fe, 0x843dae2a, 0x9293eafb, +- 0xeffeffdc, 0xe7ed8bd1, 0x6e3b4b6f, 0x265bad55, 0x9dce304d, 0xc440f9a3, +- 0x5487f375, 0x5b7a9f5f, 0x5d010f22, 0xaa5ed3ce, 0x828f5079, 0xfea2b218, +- 0xf3f59dfa, 0x9f7ec1f3, 0xf7053cda, 0xd789b32b, 0x22ca4101, 0xfe059d52, +- 0x986269f9, 0x4d3a7804, 0xae18ecfe, 0xd139d3a2, 0xfea1f484, 0xfcf561fb, +- 0xa9aeffa8, 0x535dff53, 0xa437242f, 0xe178f9c2, 0x08091213, 0xfb4d3eb8, +- 0x7089d171, 0x2a8a92e7, 0x4b1677f0, 0xe9dfaecc, 0x541ec624, 0xf6be979f, +- 0xad01564c, 0x7f32277f, 0x9def3944, 0x377b7547, 0xb75c5eda, 0xeda1e4ca, +- 0x4f87ea47, 0xfbc082bb, 0x3fb02a81, 0x7b82abf2, 0x7e3dabad, 0xf5fce87f, +- 0xa1fc55f3, 0x7ccee776, 0x82b5a51e, 0xcf831027, 0x67c646ac, 0x30f63f0a, +- 0x8df1353a, 0x70faba01, 0xae9c7d5d, 0xbde5a3fe, 0xfbc8d10b, 0x00df442f, +- 0x6f930a63, 0xc609dfd8, 0x8ff3f230, 0x0ed69f86, 0x149ff0fe, 0x9cad4f7e, +- 0x7ee3f851, 0xdb7df852, 0x2c4a7fcd, 0xbdafa5f8, 0xfaa659b4, 0x2795f8a9, +- 0xa7ea841d, 0x54eac653, 0xc97fa537, 0xe00ea5da, 0xd9469383, 0x2a7cfc01, +- 0xc40a4e20, 0x8c8b77d0, 0x3daff702, 0x6fe20136, 0xff0a4ff0, 0x5f0f75d3, +- 0x7387710b, 0xc627256b, 0x21cd6ad5, 0xb2d39533, 0x64f979fa, 0xb10fd608, +- 0x446783fa, 0xf96837a8, 0x4f77f8b3, 0x5f50baa6, 0x180c3dca, 0xffa10e3f, +- 0xd8e6b65f, 0xe5fbb044, 0xa6728c24, 0xffc60f7f, 0x53ed093a, 0x7da12981, +- 0x53e46e3b, 0x2bf67de1, 0x8cf87faf, 0xf27280e8, 0x7427d009, 0x03f184e7, +- 0xdc457bfd, 0x68dbbf9f, 0xf3f182ef, 0xe8146451, 0x242f0531, 0xf179fcc0, +- 0x408667b5, 0xcd65b51c, 0x85410edb, 0xcede452f, 0x6e7acdd6, 0xbd63abab, +- 0x51e54ad9, 0x7e2a47ed, 0xef81ab85, 0x2cac8243, 0xc80e4291, 0x255929ab, +- 0xb8fa65b9, 0x5fe7a5e4, 0x9ae21a78, 0xfddd981f, 0x2ff9fc28, 0x2c6f7eed, +- 0x20dfcfad, 0xcb67c975, 0x51a909b0, 0xffd394fa, 0xd28b0e17, 0x6ed378a3, +- 0x7b306b93, 0x945240fe, 0xec37f32e, 0xedc19134, 0xb75b91f1, 0x8b6cd4d3, +- 0x43ba9f41, 0x130fc113, 0x04cefb5f, 0x43b53ff4, 0x62335d20, 0x6ed573e0, +- 0x4f00d3f4, 0xaf4e4f48, 0xfd74fd08, 0x405d29cb, 0xa5e9ebaf, 0xf41537ef, +- 0x0b830a4b, 0xbf9412f9, 0xf90ade5f, 0xbb357f48, 0x2f450f01, 0xf580eddf, +- 0x3056309c, 0x69667f3e, 0x5f8e87aa, 0x4ea9c924, 0xa2f3d92c, 0xfc8e7f67, +- 0xcfff7737, 0xcb5c5953, 0xb680cdd3, 0xeb06ee4a, 0x1373539c, 0xf890b3ae, +- 0x9e8b0f90, 0x2fa0bd11, 0x499234bf, 0xc9c8621b, 0x4e4e5cb7, 0xa5c4a6ac, +- 0xcd413ceb, 0xfce9e610, 0xc5ac0c59, 0x185dfa38, 0x5f39fb37, 0xb0e8f50b, +- 0xa31c65fe, 0xc0d19357, 0xeaf52ef5, 0xe6bbfcd5, 0xd3a026c1, 0x5d3cbda7, +- 0x9ca5fce1, 0x0f8e6518, 0x2b8502e1, 0xcaebcfee, 0xc65c44e8, 0xf51efe2c, +- 0x39e172cb, 0x3c926ff4, 0xf79a2196, 0xe88c85c8, 0xf1f0f7f8, 0xc1e3bce9, +- 0x1a913a9f, 0x40305f7b, 0xb502ec52, 0x533e2aeb, 0xff933bc9, 0xbc99cb35, +- 0xb81ff22b, 0x7fb4127e, 0x11c98071, 0x92f607bc, 0x15d42bce, 0x154e77db, +- 0x49983f50, 0xaf9c9628, 0x6b9cb891, 0x42fcf5db, 0x12146fe7, 0xe3037c54, +- 0xd01d2124, 0x827c2a9f, 0xa3d2afbe, 0xa3ae30e5, 0x8e455c3d, 0xf07d72e7, +- 0x6b03e825, 0x1a901f54, 0xf63a07a6, 0x53c4657b, 0xe1781489, 0x2a5f9069, +- 0xe40bb2af, 0xfac2f257, 0xf8df5b3f, 0x6e54adde, 0xe453ab3e, 0xf557ab56, +- 0xf1b45b72, 0x54f804e7, 0xf59fb72f, 0xe53120ac, 0x298f3e96, 0xff9b3db7, +- 0xc1557a25, 0xd5a4ba63, 0xec9e8aab, 0x3d7a9f08, 0x42e8c5b9, 0x24f5eabc, +- 0x59201dfd, 0xe151f9ed, 0x8aff8543, 0x0ded2c5f, 0xa7c228fa, 0xf8461f0a, +- 0xfd43e154, 0xd478b5ba, 0x9e7c63b7, 0xcb778bf2, 0x507b13bb, 0x050496ba, +- 0xef85d9b7, 0xc53a81ed, 0x0b6d8797, 0xe8f4f7aa, 0x7407aea2, 0x7f5d3af5, +- 0xd5eeae8f, 0xeae9f7f5, 0x01feba15, 0x68694fb6, 0x87e41134, 0xb4bfa690, +- 0x9f90c888, 0xe22ede16, 0x9d1b41b9, 0xbf7d1573, 0x40467d6d, 0xa961faa6, +- 0xc3dbed85, 0xd02aa629, 0xb0ce6d67, 0x16ea0923, 0xf36b7f16, 0x2a891d86, +- 0x5050f1ff, 0x1cdc7d44, 0xed629320, 0x8bc7a85f, 0x1d266bf4, 0x90f3b3b5, +- 0x10c778b6, 0xb44f2f18, 0xf8842fa5, 0x86e8b54c, 0x95d98e23, 0x5ce03b37, +- 0xe7d82da2, 0xf9f4e9ba, 0x2c883f9c, 0x18f6422d, 0x0df6a9bb, 0x54fc8927, +- 0x95f900b6, 0xb3fe902b, 0x311f6c82, 0x7e6c457b, 0x15efe62e, 0x8131eeda, +- 0xfffea4de, 0x5f5c7561, 0xa3545381, 0xc29c1e7b, 0x2fed9ef9, 0xdb68d78b, +- 0xfa3f7c7d, 0x0fdf0a5f, 0x7ed94325, 0x0838b090, 0xe279bbd7, 0x53a6eba0, +- 0x15edb43a, 0xd9cdf009, 0x387488a0, 0x40085ebb, 0x29c88a5c, 0x24653f28, +- 0xc14efa8c, 0xc7c80b57, 0x50f58e80, 0x671fabcb, 0x94bb4fdd, 0xc870fe6c, +- 0xcb65a5ff, 0x6ffa0fe6, 0xef6bfa83, 0xda487fa7, 0x61ddcff7, 0xb6df73c1, +- 0x27cc761d, 0x4efedb6e, 0xdf50fdfa, 0x3cc37662, 0x357c76db, 0x6da8f804, +- 0xf408b991, 0xb62f5b58, 0xfdbc59ff, 0x68cd21ab, 0xfd20973f, 0x8b13256a, +- 0xfeff04d7, 0x4a05d089, 0x0ff02aba, 0xf9727e78, 0x20804b56, 0x7cb2affc, +- 0x3d6e9fb6, 0xbf9cfc65, 0x6fa64ecd, 0xb225f984, 0x6df2ec73, 0xa4af9e63, +- 0xefd697e3, 0xeda2cd34, 0x377fafb9, 0x3791f304, 0x55a7bf32, 0xce167e6a, +- 0x6f4937b1, 0x9e28922e, 0xba38415b, 0x299d7213, 0xc5b6572e, 0x1877cbc2, +- 0x3e2cea97, 0x7ed892de, 0x1f1fdff4, 0x9511e602, 0x3881ed04, 0xcdfdd601, +- 0x3e821f27, 0xbe4661d8, 0x59fbd654, 0x23fa255d, 0xa9f75b17, 0xd07c31ff, +- 0xa10b75d9, 0xce3bacce, 0xeebdeff4, 0xce172447, 0xed072f4f, 0xbdfb7cf9, +- 0xeec97f58, 0x9276f9c6, 0xfe9a07df, 0x237df8c3, 0xe2e3bba5, 0xbfd9feeb, +- 0xa63bbaf9, 0x72661ffb, 0x1f213bba, 0xeff5fcac, 0x543f7e70, 0x1ffdcdcf, +- 0xbf8af7ca, 0x9b78366e, 0xa6fce872, 0x383b6a93, 0x9ca4b716, 0x73a907dd, +- 0x745f5ee6, 0xfc4af981, 0xbf3f51fc, 0xefb62695, 0x997ce093, 0x126e4b8e, +- 0xed8f7ef8, 0xfee5ae93, 0x0b3db5c5, 0xd6bd2fd1, 0x6277fcc3, 0x46737af4, +- 0x6cd89e40, 0xc943c637, 0xa83e83b0, 0xaf2574df, 0x7f8bf76b, 0xa0478814, +- 0xe9b5f9fe, 0x9f82f693, 0x634f5d7a, 0x43caccc8, 0xe0ebbe50, 0xf76b47cf, +- 0xb4f8b733, 0x6ba79bf5, 0x787137eb, 0xa2b9c0d3, 0x0af34fe3, 0x4a7f8801, +- 0x81489ebd, 0x4734a878, 0xf9008222, 0x614b1524, 0x579370df, 0xb03dfefb, +- 0xc5191dcf, 0x82b8bce3, 0x114e70f9, 0x7c405037, 0x4442b75c, 0x4837127d, +- 0xd1def840, 0x1e1de612, 0x00b37833, 0x47c3f9cf, 0x8192fd95, 0xe77ac373, +- 0x92157c71, 0xc877f40a, 0xb2170bf9, 0x4bee20b3, 0xe79a5fd0, 0xea1ae421, +- 0x0b6617b7, 0x63c878a1, 0x61391231, 0x0543c418, 0x0f135872, 0x77e1d6d5, +- 0xce146a55, 0xc477fac5, 0xf9753f8f, 0x87ffca37, 0x433fea25, 0x2cf3e789, +- 0xb3eca7ae, 0x3c3208ee, 0x81089796, 0x90abe44c, 0xb0cf3ea4, 0xfdff1999, +- 0x28e181ed, 0x1ebf3957, 0x7ff6c09c, 0xa0bbf023, 0x9e67ee72, 0x10095d95, +- 0xec1b38f7, 0x72d1cfc3, 0xfc18be1d, 0xbbef9fbc, 0x007902fe, 0x209b6cb4, +- 0xffe08b54, 0xfbc63093, 0xb21609e4, 0x5cbe4636, 0x8739498b, 0x207dc0af, +- 0xa02cc4fc, 0xa5cdfb23, 0xa92426af, 0x9ae2b6e8, 0xed21c653, 0xc3bf00e9, +- 0x7e4bce31, 0x3cfb096c, 0x4b7eebc0, 0x8c6f44f3, 0xcb83fef5, 0xdf1bfe6f, +- 0x376377e0, 0xc0243304, 0x44130dcb, 0x39eaf9cd, 0x87e3f713, 0xaf30e193, +- 0x3b2637fc, 0xf65d00c6, 0x4ef86e8a, 0xc6783cac, 0xce718be4, 0xc027c7a4, +- 0xc90073c7, 0x3cf8085d, 0x810b2bf2, 0xfc3bd6fd, 0xe41067dc, 0xadc20f61, +- 0x4ce207bd, 0x0b8b3366, 0x713b30cd, 0xe7e6379e, 0xdc742948, 0xa1cef541, +- 0x9dd5f470, 0x46019ff7, 0x5124246b, 0x7e94f7b0, 0xbf584bdd, 0x59672643, +- 0x113ff5ac, 0x733ae2c7, 0xd1defb89, 0xdd1fbfc2, 0x0f6d7e72, 0x327b078d, +- 0xd8e77d81, 0xca09af9e, 0x4249d9c7, 0xec3df400, 0x2f9eb09f, 0xc779bda0, +- 0x1be5dac0, 0xf8565e98, 0x11e78f5e, 0xf8cacf1c, 0x0c7d7953, 0xcf052f97, +- 0xf3f57e0a, 0x7d53fa55, 0x8f1d4e35, 0xe861aeb8, 0xcb0f60cb, 0x40d38282, +- 0x9b199541, 0xe587204d, 0x104a8f0d, 0xc5c5bf8f, 0x307b52e0, 0x3bfe7d44, +- 0xe1ceccc3, 0x315d871b, 0xf3e4f813, 0xa12fd415, 0x9f667bef, 0x7ddd8071, +- 0x13fee0c7, 0xff29077c, 0xbf6b2451, 0xe87d5f47, 0x904f1677, 0x703370d4, +- 0xe496379e, 0xb93e1048, 0xd4a764ad, 0x334fc555, 0xaed849cc, 0xe25eef3c, +- 0xe9cf061a, 0xf90f3878, 0x3c813311, 0x4d7541f2, 0x6ddbfdf8, 0x0f8c8915, +- 0x9a76ea8b, 0xfd819eb0, 0x7194f195, 0x3534f2f4, 0x341f9b5f, 0x27b9b72b, +- 0x1cdf25e0, 0x831dc7ba, 0x95982f4f, 0x681f8873, 0x6f943c27, 0xb22ffc87, +- 0x7628f713, 0xaaf259a2, 0x34de49f2, 0xd9573933, 0xecb1ae89, 0x574a82c4, +- 0x82c3a057, 0x82ba7ded, 0x43f82c90, 0x3b2c6a5e, 0x9d9faef1, 0xbfcfbe2b, +- 0x4a9b6d23, 0x2ae5c4ed, 0x82d5313b, 0x6f7fa27c, 0x7693b983, 0xffdba142, +- 0x2ef37d63, 0xf21889d8, 0x4fe38bbd, 0x82d313b1, 0xa6276805, 0xdf35154d, +- 0xf3336c5f, 0x76877178, 0x16f52722, 0x6b6e4bac, 0x9779fe0c, 0xf3efc3fb, +- 0x07183c3c, 0x5cb7c5ec, 0x46edebff, 0x371d7a47, 0xa13b2335, 0x7845ffd7, +- 0x02faf456, 0x339b2fea, 0x4121f162, 0x0b705e7e, 0xf002ebd5, 0x0bebd323, +- 0x3171e76e, 0x82f59e9d, 0xd6a11d9e, 0x32fdecb3, 0xe50bb31f, 0x99bf190d, +- 0xad6fdb41, 0xb471dc96, 0xbd51adff, 0xbbd6a59b, 0x77a476df, 0xfdde988b, +- 0xfd1c383c, 0xf7d68ea7, 0x54b7d731, 0xc775f59f, 0x33e98fe0, 0x77ef9aac, +- 0x737d0c8e, 0x979026d0, 0xd73c4477, 0x80fdc63b, 0x1cdf437d, 0xe9eaf101, +- 0xbbe44671, 0xad9e9cbe, 0x813c527e, 0x36772fe2, 0xd74ba7f3, 0xb2bf888b, +- 0x65ff267a, 0x45c042b5, 0x7d8713eb, 0xfcfa8263, 0x8e7ceced, 0x473f20ae, +- 0xeff9ff45, 0x3c415734, 0x012afe78, 0x1f2117cf, 0x9739f01a, 0x3dd0b3e3, +- 0xfa2bf71f, 0xf1e5833c, 0x72e4d58e, 0xd3f18784, 0xdf3fde52, 0x72f8c61c, +- 0xf704effe, 0x1f3ed22a, 0xd5efb4a1, 0x319f60a7, 0xdcf756bf, 0x11cf1cbd, +- 0x718b5fa8, 0x6d3ad2d4, 0x4ff71e7b, 0x41a188e6, 0xf57f609b, 0xcb1dd127, +- 0x22fd29de, 0x27fa29f8, 0xe29fb3f1, 0x874fc467, 0x9dc1799f, 0xa1fe5f18, +- 0xe3e3d178, 0xbf5c7167, 0x4023230c, 0x3c198f1e, 0xb7e45fa8, 0x9923cc44, +- 0xcd3f68fd, 0x7137043d, 0xe0c779be, 0x5f3c82ab, 0x9be58cb9, 0xb0d9adcc, +- 0x67d6953b, 0x10a191d4, 0x52bb9e96, 0xf6238f6b, 0xfcc5debf, 0x020d8a82, +- 0xe1ce15e4, 0x051509df, 0x1b7bc51e, 0xed485f6e, 0x6b3fed3d, 0xe707d998, +- 0x612dfba3, 0xff0a9fd4, 0xf263892e, 0xe3cf88b4, 0x04f0f748, 0x820d53b4, +- 0x6432e513, 0xd28b7661, 0x6893ee09, 0x44d5f31c, 0x8f16174e, 0x2c746068, +- 0xb90374a7, 0xf5e4189e, 0xde0fe63a, 0xcec33c16, 0x253b82b5, 0x40852f76, +- 0xb9df5192, 0xd8acff71, 0xcb673847, 0x77d15549, 0xffc621fb, 0x3e37056b, +- 0xfeffd008, 0x4076fa19, 0xe99fc557, 0x3c157d2c, 0x79d1d12d, 0x7f29a5bf, +- 0x08d79e38, 0x23a7bc6e, 0x0be78898, 0xbdd9ab47, 0xfe718f13, 0xec05cbd7, +- 0x60f7d43f, 0x87130f5c, 0x1649d37c, 0x71c3ebcc, 0xa67f9933, 0xd6508efd, +- 0xd0fd01e4, 0xd272953c, 0x34597e84, 0x34e7ccbf, 0x249fdd83, 0x5f79b518, +- 0x9ffb9461, 0xdfdbfe00, 0xc5a49f07, 0xdbb97da1, 0xf6369ec9, 0xf4191132, +- 0xf90932fb, 0xeb8366e8, 0x2fd06cbd, 0xe404490f, 0x237df3e3, 0x05d19fdf, +- 0x8fe445da, 0x97867782, 0x80a48841, 0x829126e5, 0x3a5d98fb, 0x2bffc7c2, +- 0x019ed7b5, 0x83f0487c, 0xf80189fd, 0x7baa6cae, 0xe20b9e67, 0x2ff62326, +- 0x1bb1f385, 0xbdef9d73, 0xce5c7407, 0xbc395bee, 0x69f7172c, 0xa025df77, +- 0xf4a41d9c, 0x4d373802, 0x3def78cd, 0x97dbbf3a, 0xd739e0a5, 0x34ca4f0c, +- 0xb19af738, 0x68bb744f, 0xd9d759bf, 0x364e706d, 0x7c48a065, 0x4edcbc2a, +- 0x334e309a, 0x9baee2a3, 0xa88a4e40, 0x547b843d, 0xf3fb828a, 0x46bd42ba, +- 0x65cbf7c0, 0x9d2ba99f, 0x33cad35f, 0xfc7411a6, 0xd00fda42, 0xfac35e5d, +- 0xdc11af95, 0x185baa90, 0x64f5147c, 0x2f011ae1, 0xfea268aa, 0x1b831c6f, +- 0x9b70a388, 0xb4fbe86a, 0x07de173e, 0xa7126bb8, 0x395679c1, 0x3fbe279d, +- 0x25cf12ba, 0xb47be90b, 0xb9ad3499, 0xabcde10b, 0x6f7c0811, 0xe33a3454, +- 0x6f00d191, 0xf686e49f, 0x16fe77f7, 0xd2664af3, 0xf851baf1, 0x3ce6c4b3, +- 0x2fddab8c, 0x93bef138, 0xee517dd9, 0x91dcb8da, 0xb9d87d81, 0xef9440b4, +- 0xfcea8c7e, 0x96164184, 0xb0b85d07, 0xd5d60ab2, 0x1864a72c, 0x98ce9f90, +- 0xa51f8ec0, 0xff51f6f8, 0xe58988f5, 0x47ca343d, 0xfd2acd4c, 0x07d2d939, +- 0x437671e5, 0x3999ea0e, 0xe7e78bc4, 0x8fe64abe, 0x096a5a1c, 0x4987e008, +- 0xde7874ce, 0xcf8cd4b8, 0x76625f5b, 0x3357b5a7, 0xd44f43c6, 0x87be0448, +- 0xe7d35c5a, 0x89e3a029, 0x139e12f5, 0xa848cf8b, 0xc4bee6cf, 0x358d64e2, +- 0x5a89ee0c, 0x9f72dfa6, 0xe82269b9, 0x956bb9ed, 0x1ead6573, 0xa315742b, +- 0xc2c67a9e, 0x5f5e92f4, 0x5154f5e9, 0x76d8aaf5, 0xb1899ee8, 0x2acf50ed, +- 0xc0ecaf16, 0x9b13973e, 0x4186a7a2, 0x6941495e, 0x812b99af, 0x89676f9f, +- 0x2da14dde, 0x76093e5f, 0xf78ec4b7, 0x9d199503, 0x3f8c094f, 0x19ffe808, +- 0x825f0dc1, 0xb0cd143c, 0xc73ffde0, 0x47201e81, 0xdcf1922b, 0x805030b3, +- 0x2ef25778, 0xf2d4aee7, 0x7dce72bb, 0x1e244f8b, 0xb22afdb5, 0xdfaa8f12, +- 0xf945fffb, 0x47738e96, 0x08b01083, 0xe7b43f50, 0xeeb023e7, 0xe42d79c4, +- 0x3b0ac1fe, 0xf7fbf5f2, 0x7c0a599d, 0x8101f33b, 0x644edf80, 0xc3d8155f, +- 0x0b8295b2, 0x1f73b3e2, 0xa5cfef60, 0xdfbcc3ef, 0x2fe32dff, 0x902ee7ca, +- 0x479ab283, 0x35ff60f7, 0xbfe00b82, 0xfd00aabf, 0x24592289, 0x10e6bed8, +- 0xbda823ee, 0x46a3fcc2, 0x39054c59, 0x76625b28, 0xc2b779c2, 0x1e7f0a4f, +- 0x9351dfe2, 0x1b90f738, 0x00e77be9, 0x14be0c48, 0x7b110ba7, 0x2e53fc0a, +- 0xf43b7e33, 0x1106e492, 0xb27f38b9, 0xfe1567ef, 0x46ff8113, 0xb1aff944, +- 0xfc04d726, 0xe0202278, 0xf02e7cb9, 0xefe7f02f, 0xb10cf895, 0x8ba8fda9, +- 0x0f9ea7f1, 0xe51ff1db, 0x0af3d03b, 0xa8fc2a7f, 0x46c3c3e7, 0x7de60d32, +- 0xae0b52f7, 0xcb6ab723, 0xce4c85b4, 0xb7273cf0, 0x9054beea, 0xcb2342eb, +- 0x5af050fb, 0x4279646a, 0x44f5e6ed, 0x675ba9a5, 0x479ba7e6, 0x2a3d8b37, +- 0x63cb220f, 0xde71d109, 0xe63cff5c, 0x775e9dd3, 0x6ff45ae8, 0x003e51b6, +- 0x93b7affc, 0x0243ee10, 0xeb8a8fa8, 0x1be60f45, 0x3759431a, 0x4aeff6aa, +- 0x57fcc4fe, 0xe2ef88ec, 0x3e40e68d, 0xf378bf7d, 0x8e782191, 0xdff988bd, +- 0xfd013af2, 0x0f372263, 0x8a3def81, 0x438f2c8d, 0x613c17ef, 0x96f0fb61, +- 0xe0e9d62d, 0xecb509b7, 0xbae2af5e, 0x2ab3259b, 0x45b0fbbe, 0xb9e1fa52, +- 0x0ce94c8a, 0xfcc355df, 0x294af7d4, 0xbf2d1bf9, 0xdc57fc67, 0x573fa120, +- 0x15a1bb5c, 0x0f8af3f2, 0x5bbf719a, 0xf3067b5e, 0x795f738f, 0xd63fdd89, +- 0xb2f26a20, 0xd543e5da, 0x51ce788a, 0x798a5f56, 0xe78eb41c, 0x3c75651d, +- 0xe607e8ff, 0x657fcceb, 0xa29966fb, 0xdfa6fe70, 0xb09ef039, 0xfc0eb5a6, +- 0xfbf6a54e, 0xe5db13f3, 0xe72dd53f, 0x9cd74ff9, 0x631fa820, 0x0a7d3fe7, +- 0x947b80ff, 0x27fcda2c, 0x1bf4cb52, 0xac56679d, 0x7e2213ef, 0x3e5f4bd7, +- 0x2dbbf90b, 0x167b3f1b, 0x8ff25de6, 0xbc859fcf, 0x09d00a0c, 0xbaf94a7e, +- 0x51df3177, 0x85a0ef79, 0xff7e83ef, 0x6d17cc3b, 0x06ecc0fd, 0x4fdbad68, +- 0xd1ff83a4, 0x549be1ba, 0x67bd03c8, 0x77c61e7b, 0xb73579ee, 0x6f15892b, +- 0x6ff025e3, 0xaaf913a0, 0xd635ba7a, 0xc8fe6237, 0xd0774a69, 0xb6bc9113, +- 0x2f9652ba, 0x6cf9e2e8, 0x07e763eb, 0xab5fcbb7, 0x2bbaf1bf, 0x33d63f41, +- 0x79a2e13f, 0x3d28076c, 0x1d04ef2f, 0xc57cf3d7, 0x37be6bba, 0xfc34ed8f, +- 0x2bebd283, 0xf01f368b, 0xcf39facb, 0xf56d0d3d, 0xb1e61dc9, 0x3f813a85, +- 0xd1b8ff25, 0x83c431e2, 0x117c6d1c, 0x7e8107f3, 0xd7d02ef9, 0xbc43a65f, +- 0xc614a4f8, 0xbb7844b8, 0x2b7bbf19, 0xca3efede, 0xfbabeb53, 0xf097bf31, +- 0x1256e03c, 0x4d7cb1f9, 0x5f2a031e, 0x6ff96763, 0x1f900e9c, 0x73e072e7, +- 0xf8c7079e, 0xeb8fc95a, 0x6c6e2f28, 0xe38b267c, 0xd2e8bcf1, 0x3cf21f35, +- 0x84dd28b3, 0x43af40d1, 0xa8779bdf, 0x7809c1e0, 0xfbcea518, 0x18879d8c, +- 0xd1d4fbc9, 0x7a09e80d, 0x49d7923c, 0xbf213deb, 0x1fbc202f, 0x75b88f2b, +- 0x6d17cb15, 0x93dfb495, 0xf2c4e946, 0xebc64740, 0xb9d036e4, 0xad8bcffc, +- 0xa9e287e3, 0xc34bbc5f, 0x5abe0a37, 0xefd6c7ce, 0x7f85e3d3, 0xd9ab7bee, +- 0x82fbfe82, 0xfbe1e39b, 0x2643fa82, 0xf18bdf82, 0xddf2957d, 0xb5b78f12, +- 0x7f3113ac, 0x11aeaab0, 0x7f5ebbf5, 0x1473f194, 0xe38b7cfd, 0x6b2ade99, +- 0x65a3f660, 0xa3603da3, 0xd8de5a70, 0xb65d7c82, 0xf20990fe, 0x6ed4f6b1, +- 0x03bcb132, 0x3f604726, 0xb7f9aa02, 0x0873bcbc, 0x9f7e73ea, 0x859c7e91, +- 0x60f29c7c, 0xd7ca71ec, 0x338cd19f, 0x3933ae5f, 0xef1f176d, 0x66e7a353, +- 0x1369f780, 0xad3ea3f3, 0xfac52713, 0x78b6e6be, 0xababef89, 0x3b50fc99, +- 0xd93af78a, 0xa24e3dd9, 0xb2fd1e23, 0x0fa3ec7b, 0xf780fdc2, 0x47984dd8, +- 0xe792b8b1, 0x3b97fc5d, 0xd8bde80d, 0xf981357e, 0xaafc052e, 0xd392f7f6, +- 0x939fc047, 0xd423bcd2, 0xfcca30e7, 0x240c5d4d, 0xb7bf3ea0, 0xfb0aea4f, +- 0x7b946253, 0xcdae3cc2, 0x7608cafc, 0xe2cfc9b1, 0x91fce4fb, 0xc9bcf0be, +- 0x4c9ddce8, 0x104d36e1, 0x6d9a10dc, 0x7e0cf7cf, 0xd1e0ce24, 0x39095fde, +- 0xb3beb0f8, 0x89fa036e, 0x49c84376, 0xa5bb10bb, 0xb8370d29, 0xa632e22e, +- 0xe63cea62, 0x8fe43faf, 0xe7df0beb, 0x5b750839, 0xa8db9fa1, 0x61216fb9, +- 0xff7751b4, 0x97d03902, 0xe71b1fda, 0x675e2557, 0x70a6ff67, 0x875ef19b, +- 0x12a441c4, 0xdd8577d8, 0xe3c4fe87, 0x5f7e0f0e, 0x21037f46, 0xc48921df, +- 0xc1f7d5bb, 0xf73571d0, 0x3571d04c, 0xb68f44f5, 0x78c93c9e, 0x49bd9634, +- 0x2898f3e6, 0x890f10da, 0x2fee0679, 0xa5fbf27b, 0x989de746, 0x6821dc42, +- 0x7986c6bf, 0x64bc54e3, 0x366c3af5, 0xfce9bced, 0x61227a34, 0x606cb350, +- 0x773cd4f3, 0xeb809712, 0xd39f68f7, 0x7fea6af9, 0xcdf6e789, 0xefa08c48, +- 0x844d716c, 0x06acffe3, 0xde8c4bdf, 0x4cc254a4, 0x4e93cc26, 0x483fbe13, +- 0xe3a0ebe0, 0x213bfa6b, 0xd7c6c07a, 0x9d3d21c2, 0x2f06efea, 0xc6b076e7, +- 0xfa0a3dea, 0x0577ab26, 0xa766fa26, 0xc3a39e09, 0x0bb05b69, 0x85cca7ea, +- 0xad08e4b9, 0xaf8cd50b, 0x2820aefa, 0x2cc37d37, 0x892c858f, 0x1cd53f47, +- 0x30cb6447, 0xc88a1ef8, 0x251830d2, 0x5c9fcfc0, 0x94140c8b, 0x35e51971, +- 0x3c305efa, 0x128730de, 0x289a0ea1, 0x9ef143fc, 0xaafc61cf, 0x86697deb, +- 0x793cb0a1, 0x946caee9, 0x62204bda, 0xeff4a868, 0x4b257bde, 0x9f7b81f9, +- 0x0ddfec88, 0xa95ab876, 0xdf0ec553, 0x47c7576b, 0xaa389eea, 0x5933abef, +- 0xbfd8785d, 0x424f5974, 0x0af04b1e, 0x7107d056, 0x3cf14bce, 0xeb84942c, +- 0x517d98bf, 0x4d7039e6, 0x11f8c4f3, 0xf70a9e2c, 0x47b3f68a, 0x7b46c7be, +- 0xd4a6d6bc, 0xf0bfb843, 0xbd47efd6, 0x1fb75a56, 0xa7500ddb, 0xe6e4ef65, +- 0x29123d89, 0x79d5ac56, 0x5f809769, 0xa066905b, 0x5ac4bceb, 0xc1a8dbbd, +- 0x3c1a13c3, 0xa63d1718, 0x3f63c3c3, 0x3c970f08, 0xa1e218fc, 0x7ca6ebb3, +- 0xe94ad031, 0x80c72537, 0x3a8d37f7, 0x0bf8c368, 0x1ed059fd, 0x3aab3871, +- 0xd9568ef8, 0x6e3850a7, 0x97f0a380, 0x57c29ef2, 0x1f4df11d, 0xdd94bce2, +- 0x9fe5a7eb, 0x0c67ab02, 0xf56b1bc0, 0xe0a5b31c, 0xeebbf1fa, 0xef02be29, +- 0x5f28e484, 0x386f9b13, 0x635c277c, 0x55bc73bd, 0x929daf15, 0xa4cc40b3, +- 0x5905cdf3, 0x4f5d1918, 0xd2d942ca, 0xc533ae9f, 0xec3cc063, 0x126fab1a, +- 0x1e98e38c, 0x48f5510e, 0x70df005d, 0xa38e8c41, 0x76d547c8, 0x2aaf8fb6, +- 0xb1160430, 0xe00160f3, 0x59a3f945, 0xc6611fc7, 0x90870d1f, 0x8782ca3f, +- 0x54347f18, 0xe7e78f8e, 0xae8fb06a, 0x40a1e126, 0x57d699f7, 0x28bd8cf2, +- 0x55c358df, 0x485f283d, 0xfcbcfaf2, 0x33af104b, 0xcf87d262, 0x4757594b, +- 0x9bdeadf4, 0xd820f0f9, 0xe033ee67, 0x37829879, 0x2b62dfa5, 0x661cb3cb, +- 0xfc03cdf7, 0xde6e8f95, 0xb8dbe403, 0xd798cff7, 0xc377d8e1, 0x31df784e, +- 0x15c85295, 0xdf7ab71d, 0xb7bfbc22, 0x4003ae9a, 0x0cb09026, 0x7c63bd76, +- 0xe089f930, 0x419efc03, 0x28438f80, 0x77f8eb2f, 0xf0ee5445, 0x56deda3b, +- 0x03c3bf76, 0x52079656, 0xc979156d, 0x7d94b0fc, 0xffb04d67, 0xc0625f2a, +- 0x0e5029fe, 0x097faf52, 0x1ab6abf6, 0x0a74f935, 0xa27e155d, 0xf70ad49a, +- 0xe8955c44, 0x9fe5ae5b, 0x0aa66b24, 0x23def29e, 0x4d9de27e, 0xaed46519, +- 0xbb06ef3b, 0xd0a7f94a, 0x53d3b2aa, 0xc0164b06, 0x287f845b, 0x0fa2c67f, +- 0x3037ef7d, 0xfe038c1e, 0x0b5d86c2, 0xe8773844, 0xe0b35d2c, 0x3fda3a1e, +- 0x362a4acb, 0x12b3f7d2, 0x64f50968, 0xebcaef5e, 0xe7d9583d, 0xa041b723, +- 0xb8f157cf, 0x9e562bec, 0x5e746037, 0xbc5cf70a, 0x9d9af1c2, 0xa0bb4566, +- 0xa291adc8, 0x8db5ce0f, 0x333b7cfc, 0xba00699c, 0x0c6c7229, 0x6a76421b, +- 0x2e8d32b4, 0xbc39e403, 0xe179f7e5, 0xbd23b0bc, 0xec25f573, 0xf3fd3fbb, +- 0x1f9f3e46, 0xdd7f5fed, 0x46e0fbee, 0x5c696fc0, 0xd03723f3, 0x9f25d97a, +- 0x91769c63, 0xf50aecb5, 0xd4be9e79, 0xf3adffcf, 0x1fe01c27, 0x9e6d7eb6, +- 0xfecfcb14, 0xdffccaca, 0xf8e9febd, 0x2177e29e, 0xab2740a9, 0x63342fbf, +- 0x55d57e89, 0x8e80f2a8, 0xec0931b2, 0x99c595ab, 0x2bbee9c6, 0xaec7ce54, +- 0x5fb8b10a, 0xe833e816, 0xdd8335df, 0xf335fe57, 0x7fe8e28f, 0xc794ee70, +- 0x32dec9cf, 0x69db16fa, 0x3b08b7bf, 0xa84acd6f, 0x93ef8468, 0xcf033988, +- 0xf688732b, 0xe4acafbe, 0x8f3809ea, 0x479c0c84, 0xbdae9c6e, 0x40346cab, +- 0xcc0c9f7b, 0x2a23cc57, 0x23ce8cbf, 0x78c10fab, 0x29701916, 0x194d85e6, +- 0xb79ff948, 0xeccc0e7f, 0x426711b7, 0x764fef54, 0xa09de2dd, 0xddaa5bf1, +- 0xfedfc7a0, 0x5623bc4e, 0x3675c5fe, 0xfd7b9fc6, 0x03e42f5e, 0xde3cf1e8, +- 0xbbb12c25, 0x8f5be3da, 0x15fe3d4f, 0x98f1eabc, 0x427b91f3, 0xe93c0c52, +- 0xbf3d12f1, 0xba00ac0c, 0xd1140de4, 0xd074297e, 0xcbf689e3, 0x5f6f7e87, +- 0xf9c1fb42, 0x08c2b8ab, 0x43372f76, 0x457fdc20, 0xc22f36ff, 0x257fcc1f, +- 0x3748ed5d, 0xe3db5e3d, 0x979f93d1, 0x1edf5d1a, 0x37e617c0, 0x3e400fb9, +- 0xc24da359, 0x1c684971, 0xbc7be751, 0x04e4f102, 0xbbef1e1c, 0xaa40c71b, +- 0x5762aef8, 0xff2888e2, 0xeb5afb8c, 0x2705e6e7, 0x39ff029e, 0x04b7c12b, +- 0xcc44a6e2, 0x8a3a3cc0, 0x3e5ac3bf, 0xcd6bfce3, 0xf8a13e40, 0x0c43b6d4, +- 0x664fde07, 0x5d4e79ed, 0xf4cf8ebb, 0xecf857eb, 0xa6307815, 0x3e14be3d, +- 0x7ee3689b, 0x13d27779, 0x5b21e4fc, 0xde802446, 0x98a4c126, 0x075188f1, +- 0x9c3811bd, 0x051f915f, 0x773c8be2, 0xf427f9f6, 0x8eb51357, 0x1cc0f8aa, +- 0x2d9b77d1, 0xf852fe86, 0xb74e4ae3, 0x13bc892b, 0x12574be2, 0x7d9117e3, +- 0xfd744640, 0xde3c6cb3, 0x80f483d2, 0xbab2ee75, 0xaf997ed8, 0xea6eb233, +- 0xb3dd0256, 0x71d9f8f9, 0x834efc36, 0x112d8d84, 0xbde267fc, 0x2929b235, +- 0xf7890f3a, 0x8415e927, 0xf03371f9, 0x178a5cbe, 0x9d1ac172, 0x609b42c7, +- 0xf85c7bc4, 0xc6d74e3c, 0xb6df90c9, 0x003df44e, 0xf6116ceb, 0x19f5c10d, +- 0xeec1fd43, 0x6f3fdbe9, 0xed0655d8, 0xf6215fb4, 0x2f9ff3e3, 0x7843b8b2, +- 0x3ab039bb, 0x94ff63a3, 0x07da358a, 0xe1b22e45, 0x41cbc8bb, 0xcc22c2ce, +- 0x53cfc83b, 0xc2299c76, 0x3887a0fd, 0xe1465c97, 0x113b3eed, 0xa973f9f3, +- 0x7a7e81ba, 0xb7f3d7be, 0x90279f9e, 0x4f784cf0, 0x363fc7cf, 0xdff1400f, +- 0x90737c22, 0xeeca8df2, 0xf942fc29, 0x5d1b79e7, 0x6388db77, 0xfdbb814f, +- 0x53cf88ce, 0xfe29eec1, 0xf10fd479, 0x3afd00bc, 0xff15d3f2, 0xf7cd937c, +- 0xc233f412, 0x99fbe87a, 0xf8065d03, 0xcd90fe7e, 0x573c32f3, 0xed8b96fc, +- 0x232ec837, 0x3be74819, 0xcea1d393, 0x593ef040, 0xf6808179, 0x961276ec, +- 0x2bdbbc60, 0x76becd24, 0xc9fc25a6, 0x587e70fd, 0x99ed0039, 0x14fabe0f, +- 0x8f967df1, 0x13bfc55c, 0x0fee1819, 0x163bbefb, 0x43c7df6a, 0xbde8acc2, +- 0xbed09f9d, 0x6e0092dd, 0x877c0a73, 0xfb6b205b, 0xd657c7eb, 0x7fab87a1, +- 0x63df9caf, 0xbb22f704, 0x9fc2fe55, 0x8d8fcc6c, 0x7e2df7cc, 0x37c5018f, +- 0xc1b3d5d8, 0xc50f024b, 0xf4a55fe0, 0x8c7b25c5, 0xe6f5a3c3, 0xb1e9e6ed, +- 0xc65117ee, 0x833df051, 0xfcf82934, 0x65ff1636, 0xc01c58fb, 0x734844f0, +- 0x7d94af4e, 0xdfd013c3, 0xa0275beb, 0x97525d7f, 0xf1a59863, 0xb83ed9f3, +- 0xf70f9f9d, 0xfaff405d, 0xafcfcc9d, 0x42fdc4ab, 0xf7db3d49, 0x5cef82ac, +- 0x0c89f3ba, 0xb23fff42, 0xa9bc859f, 0x9047b852, 0x53e087b5, 0xacd53ef5, +- 0x897db27f, 0xf611b969, 0xc934bea3, 0x5abfeb4d, 0xf747155e, 0xc419554d, +- 0x29bee842, 0x27cb57f1, 0xb54d18ae, 0x20479273, 0xb2af5889, 0xfefce98d, +- 0xcb57f939, 0xe36596aa, 0xaede2bbe, 0x2476cfda, 0x2e6de71f, 0xfb4763c4, +- 0xbc12c7d8, 0x3c5576c9, 0xb3ff4f42, 0xe004ae71, 0x7f7ce5bf, 0x59c2f57d, +- 0x0cb06fb8, 0xf90e9f38, 0xee9cd961, 0xb38f3b2e, 0xdcf7d95a, 0x00f4d6e5, +- 0x456ba9e8, 0xd9e60b9f, 0xfef9c6f6, 0x6b7e4710, 0xb7dc11e0, 0x8ebdf905, +- 0x5e45fcfb, 0x65fabe75, 0x5f67e676, 0x03a3497d, 0x8cd71df6, 0x677e0bfc, +- 0xeec8da7e, 0x6d196b4d, 0x4fb9f8d2, 0x032ef2da, 0xd1494af8, 0xce7e8227, +- 0x20ebb11e, 0xec8efbd8, 0x780ed444, 0xe403b004, 0x3c54fefc, 0xeddfaa07, +- 0x0b65d880, 0x74fd6eff, 0x9dea637d, 0xf0dd2cb4, 0xb7ec0717, 0xcfccedb2, +- 0xc26c6d3b, 0x5e4a747b, 0x079ef115, 0x6dea6e3a, 0x9fae5f10, 0x1b10f595, +- 0x076d4e26, 0x43afbf09, 0x8caf07f1, 0x2edc0393, 0xbc4d712a, 0xbd5c63df, +- 0xda38b1e8, 0xf7a785fb, 0x0f9e3e66, 0x1b922174, 0xd92325dd, 0x3f227e85, +- 0x5dbfa1e7, 0x0ef0af70, 0xfebd795e, 0x40af1bf3, 0x4276a266, 0xd7c93f00, +- 0x98ef0585, 0xb7fc563e, 0xe36b5f71, 0x527f7a97, 0x83e33bb1, 0x20f49743, +- 0x8dd71780, 0x5ec21df8, 0xe94de623, 0xf0bccdfd, 0xcafc0ec4, 0x363f9147, +- 0x02b1f7d6, 0x19d9873d, 0x7fd7965f, 0x94aef78e, 0xb834d091, 0x5eaca6ff, +- 0xf7c88674, 0x6f25e9e9, 0x6ac1dfc3, 0xe02e4a0b, 0xeee0b6df, 0x6f5021b8, +- 0x561e3110, 0x65f64efe, 0x41ad67c0, 0x291fef09, 0x01cc7edf, 0xf3b140fa, +- 0x2f7641ad, 0x08f05b49, 0xb6e0573e, 0x065f2436, 0x818367f6, 0xed773fed, +- 0xfa0ad6f9, 0x67f3f5e1, 0xabdf7193, 0xff9d69d8, 0x7377c4ab, 0xbe2462ed, +- 0x896ff6ab, 0xf2007d98, 0x2412f2a7, 0x7f510a22, 0xfe9d9db5, 0x93b12c88, +- 0x823af6f6, 0x8231e27f, 0x77edeb9c, 0xfb3adf04, 0xfb9d88fd, 0x30c8bd8f, +- 0xe1afc7b8, 0xfc7cf27c, 0x756833ee, 0x0cf8c22e, 0x76da4ff3, 0x14d8fa7d, +- 0x644fbe78, 0x179ffddf, 0xd8dfef91, 0xb377bf31, 0x2af78d4d, 0x6eb9d7a4, +- 0xd1b75a67, 0xc776e7fe, 0xd1b578b3, 0xbbfa997d, 0x00ff6883, 0x3ba857c7, +- 0xbb92f73b, 0x3f3b7dc3, 0xb70cffda, 0x45eaffbb, 0xb8d2f790, 0xc35044f0, +- 0x990e6bfd, 0xb30c5f40, 0x7a625f7b, 0x7a0acea0, 0x7be32640, 0x516e3a10, +- 0xfc0f193c, 0x4e24ae15, 0x757bc3c8, 0x7400c1af, 0x0336b119, 0xf1d664f3, +- 0x7579c173, 0x950ca6d5, 0xcfc7997e, 0x724a4e95, 0xf9ea927a, 0x03d30770, +- 0x3f177727, 0x03f2fa87, 0xc317e933, 0x983b263e, 0x9264dbbd, 0x7e87aca7, +- 0xefb80d87, 0xeb67b5d8, 0x6e0fb81e, 0x50d741de, 0x41a737b0, 0x86bc281e, +- 0x20aaeb7d, 0x23e1b6cf, 0xbf5416b0, 0x0d1029af, 0xc46ddc74, 0x0764e2c5, +- 0x8dffb80c, 0x278917c4, 0x29f9d619, 0xf6dbbfd7, 0x50e7341a, 0xa43df8db, +- 0x39d9da1f, 0x8b3b7ed4, 0x3bdc6d53, 0x944ef93e, 0xd001df43, 0x9b47e5ff, +- 0x68ae1cab, 0x97f14d5c, 0x38d81cc6, 0xe7fd3065, 0x13831698, 0xb03aedc8, +- 0xbaf5845a, 0x25db524e, 0x13fe7690, 0x1a89f785, 0x0616b6de, 0x0de3ce8f, +- 0xff055390, 0x3c3f02d4, 0x35b7d688, 0xbf209319, 0xb2bfc14a, 0x577c650e, +- 0xb2acf11d, 0x367928a1, 0x577c4f7e, 0xb87cf7b9, 0xa0f72893, 0xb6ce5f23, +- 0x3f195a7b, 0x3f50e9c8, 0xfd1e3bb9, 0x9edc4d92, 0xde82b491, 0x4e853f80, +- 0x7f660e09, 0x3474f994, 0xbfa73c7e, 0xbe50fe52, 0x64b9275e, 0x1f7e1be4, +- 0xc50e4ba0, 0xae3c81f5, 0x77f83e86, 0xae79545a, 0x47c00ef1, 0xd47e368b, +- 0xc0306cd0, 0xdb6558f7, 0x66bc4485, 0x6dfe93a4, 0x758ccf84, 0x070d7fc8, +- 0x7171ca09, 0xbe2c5ded, 0xf83d4247, 0x5e7858bd, 0xcfc3f20d, 0xb409bbad, +- 0xb55c131c, 0x37e207b8, 0x8ab900e4, 0x0dca89e2, 0x26d51594, 0xf779d7e0, +- 0x3f2e72b0, 0xd2b79dff, 0x5859f287, 0xfafbf2c3, 0x7cd8323a, 0x4312bf38, +- 0xfbc8777c, 0x7fdb8e78, 0x022fde65, 0xa9fad2df, 0x611bc7fa, 0x975fca5c, +- 0xdeee203a, 0x3053e8f0, 0x4f5f855d, 0x4e1091ad, 0x7cf6bc51, 0xd74e72fc, +- 0x7e300f57, 0x1a46b31f, 0x8d31f70f, 0xe2138991, 0xacd6dbc5, 0x6f7f4115, +- 0x60ce7e03, 0xfd760e72, 0xac87eee4, 0x773b04bf, 0x2e2040c8, 0x8a44c9bd, +- 0x62e4a836, 0x34d7aad7, 0x5b5c5bf2, 0xdfe30539, 0xe80249cd, 0x156e4579, +- 0xb9326fbc, 0x5ffca327, 0x09ff93ab, 0x0e39fdec, 0xb9c79746, 0x893e3ffc, +- 0x947d3fca, 0x005126b8, 0xb14c9b38, 0xf69ae9ef, 0xa22ff923, 0xd3b68f57, +- 0x6c1cd3ab, 0x43e8ef5f, 0xe6bb2fc7, 0x23ebee2c, 0xf37ce3f3, 0x6f8504f8, +- 0x7fc00432, 0x5f60a535, 0x2bc517c0, 0xaffa33f0, 0x32736fa0, 0xf6a1bef1, +- 0x3948b8fc, 0x6dc8d397, 0xf229af54, 0x7a022beb, 0x58a84d67, 0x72767e0c, +- 0x7a7c8cbe, 0x4ef5f04a, 0x14ed76a2, 0xbd0c73c8, 0xf4c1d130, 0xa7c939c8, +- 0xfdbcafb9, 0xe077483c, 0x63ba22eb, 0x1a917583, 0x51f409c1, 0x6c355dda, +- 0xc394b15f, 0xf52b9e53, 0x2ff78d1f, 0x9783c5da, 0x333d983a, 0x7fb056c1, +- 0x2233d980, 0x20b9478c, 0x83bbab86, 0x76a3cdbc, 0x1d9556ec, 0x2355253b, +- 0xf8782abf, 0x73f7e735, 0x57dd6c89, 0x829679f1, 0x673aa7ef, 0xa3041ba2, +- 0x145ae4c0, 0x008bbc98, 0xb1eed4ff, 0xafef9193, 0xf3f7cd89, 0xfe42afd7, +- 0xc4e49c4c, 0x371e48ef, 0x83892dba, 0x00e3e962, 0xfed6bb96, 0xc059f706, +- 0x1df720c7, 0xc81141c9, 0xffc18901, 0x2affca01, 0x407c29fa, 0x8745e2f9, +- 0xf9e84f4a, 0x53df3942, 0x7749b2f0, 0xeb8e783e, 0xba5e46f9, 0x5153c83a, +- 0xe9a3f3d6, 0xce8ed2dc, 0x473a306f, 0xade80be5, 0x81df89e8, 0x2c74a59c, +- 0x9c12fd67, 0x8faa9f38, 0x485e6167, 0xaa273f35, 0xf329e3e3, 0x42f5c03e, +- 0x353ce747, 0x1c5fdf56, 0xd748f3ba, 0xe47f28a0, 0xc176bf71, 0xb39e335a, +- 0x9e4c206f, 0x01f15de5, 0x4e9e77f5, 0x294c7523, 0x3e808faa, 0x3856891f, +- 0x42d77504, 0xc74be913, 0xb051973d, 0x7e6df20b, 0x0fe724d6, 0x60d8eba6, +- 0x835ea792, 0x64f701fb, 0xdf393f80, 0x6f7884e0, 0x4029c7a2, 0x0343023c, +- 0xd8fb8720, 0xb8fbc338, 0xab7dc32f, 0xf41c3dcb, 0x2f4e69c1, 0x1e0abe85, +- 0x1d77b23a, 0x025fb5d1, 0xede3a73f, 0x26f23d7a, 0x38e79b97, 0x47ae2f1e, +- 0xc9e41164, 0x448b7c41, 0xd3367f98, 0x923d1183, 0xd01cf04d, 0x9e55c7c1, +- 0x509ff52b, 0x5212388f, 0x74647a54, 0x423d4c73, 0x3fe5317f, 0xf41ccd65, +- 0xd8c1c967, 0x027a6cfe, 0x6029c7b3, 0x14bf6947, 0xd33dfd99, 0x503edcd3, +- 0xc57cc48e, 0x8c6635ea, 0xc87a2be3, 0x878c9531, 0x00eacfbf, 0xa6bd0bbb, +- 0x095e0efa, 0x2669b3e7, 0x9f179c17, 0xf748c292, 0x5cc37453, 0x15e1fc8d, +- 0xf431de80, 0x85f88111, 0x2c9ed7fc, 0x51062efe, 0x11e4164e, 0xd6bba3b4, +- 0x2abe428e, 0x8014cfca, 0x136b8b6f, 0x9a4f6805, 0xbe8034e0, 0x6a31d652, +- 0x49fc88a1, 0x824460e5, 0xe4a31e8a, 0xd5f0110a, 0x2697d93b, 0xd6fdd225, +- 0x4cfd57af, 0xd0f1bf1d, 0x68b48afa, 0x1fd686fc, 0x7ceb75b4, 0x213726fc, +- 0x3fe420f0, 0xe4f0eadc, 0x5635b8c0, 0x59942e6f, 0xce302b5d, 0x88bcd9db, +- 0xe52fcb1f, 0x0e444e3c, 0xcecb8bb4, 0x5c6175ac, 0xa7cc1a76, 0xa7f1fbac, +- 0x73de1c00, 0x66efd311, 0xf5c2e8f3, 0x2088f902, 0x2b78ba3d, 0x28978844, +- 0x384ee77a, 0xf6a14594, 0xa1ae7008, 0x2de81bc8, 0x3c95a7f0, 0xd95b8808, +- 0x401f6e31, 0xc27a823e, 0x5a3ea8b0, 0x79886f91, 0x04c2f15f, 0x9faa4fdb, +- 0x9beff049, 0x477ca97f, 0x2d3ca228, 0xebe9504c, 0xa70ff3c7, 0x7608f3b2, +- 0x7cdddfaf, 0xb916e78c, 0x4ba034ff, 0xa1867ef4, 0xf90c9366, 0x5c43c4a6, +- 0xb1fe554e, 0x76421410, 0x56fd63c8, 0x874a1e20, 0x2c456fb6, 0xde3ffb9f, +- 0xcfe01949, 0xd4dc1837, 0x0bfc8233, 0x6f770794, 0xd4a7df82, 0x73127bf1, +- 0x091e6d1a, 0x1c421de2, 0xa3da8eff, 0x1d18e73d, 0xdb4f5f4e, 0xf8cd0717, +- 0x72dafdb7, 0xe0afbf94, 0x1598efc6, 0xe7790efc, 0xd79881f1, 0x8376ac69, +- 0x30b6ad9c, 0x2c2dabf8, 0xa2dab76e, 0x004ae7bc, 0x79d1ddbb, 0x1ec2f67b, +- 0xe253ff18, 0x90e1d98d, 0x0cc9f808, 0xc92c0cbb, 0x0c678d8d, 0x72b75c13, +- 0xf1c75f0e, 0x46ef69bf, 0xd679ec11, 0xb0c5ea84, 0xf763d9ef, 0x6bfa00bd, +- 0xdfd6b66c, 0xf3f0211b, 0xf704c9e1, 0x249c8a4b, 0xe09d9337, 0x6c1e24da, +- 0x1a0a80f6, 0x13b3d27b, 0x5e0995f6, 0x553c0022, 0x8006cffe, 0x8478ba4b, +- 0xdfc0ba6b, 0xfb7fe5eb, 0xb4d9c390, 0x7200bc77, 0x8269a5df, 0x9ed41ae0, +- 0xfec257cf, 0x53cb047b, 0xfb2afa01, 0x5e2fdec2, 0xa5f0013a, 0xfae26ff4, +- 0x2f9f0afc, 0x74c64217, 0x7718213d, 0x2340f4cc, 0xaa35495c, 0xb9346e48, +- 0x4799eb54, 0x668f5e10, 0xedd1d719, 0xca072fa0, 0x1c44b663, 0x10c9ec77, +- 0xad74b7e6, 0x43f69020, 0x401d357a, 0x4557aa3f, 0xdcf40093, 0x9c0df7b4, +- 0x5da6cf6f, 0xb5f2e4ac, 0xca05fb91, 0x98d98ebc, 0xcfc63cdd, 0x334eaba9, +- 0xc12079bb, 0xca4bf987, 0x7c72aa3a, 0xfe141569, 0x19cbc84a, 0xce5e71d1, +- 0xb2930491, 0xd608ffdf, 0x79bd3e57, 0x3ea0f00f, 0xefba907e, 0x7523d230, +- 0xaf96db21, 0x0040b7dc, 0x4672b17d, 0xa281f8ec, 0xf8f25637, 0xe5ff2aab, +- 0x4f4f5a94, 0x66b24829, 0xf292f4aa, 0xfcd153de, 0xff3c4d97, 0x7bcd03e5, +- 0x805a9783, 0x79b2ee9f, 0xe573c0ce, 0xe3ad0bef, 0xd947b77f, 0xbaf82acf, +- 0x80fcc9c2, 0x1fd70903, 0xc0247383, 0xf1f29393, 0x3cec4b3a, 0x069dcbf2, +- 0x7e3077ee, 0x5f8c4d21, 0xff6a1d60, 0xb001bfeb, 0x00d7432f, 0x0000d743, +- 0x00088b1f, 0x00000000, 0x7dedff00, 0xd554780b, 0x733ef0b5, 0xc9332666, +- 0xe4cc9924, 0x40275e49, 0x21c40a30, 0xeb141021, 0xef0c0124, 0x02415041, +- 0x8042120c, 0x2a941324, 0x8065bd6d, 0x8d520318, 0x8bd4b45e, 0xd7a5783a, +- 0x2941b622, 0x84ec1a86, 0x3a0bc157, 0x94b62a28, 0xaa54141b, 0xa5ac4090, +- 0xd7f97b96, 0x661f7b5a, 0x962264ce, 0xbfefbf62, 0x767e9fff, 0x67d9cfb3, +- 0xfbd7b59f, 0x649ecfb1, 0x1258c4ab, 0xdd3b3763, 0xd8c67a65, 0xc1b758be, +- 0x88d8c45a, 0x596edf62, 0xb9786c61, 0xda1eb777, 0x3bbf564c, 0x94061136, +- 0x6826c733, 0x3dac1dec, 0xa384da0e, 0xb838ce1d, 0xa36adfdf, 0xacfa6e79, +- 0x8c2db98b, 0xab98950d, 0x97631065, 0x60d6eff0, 0x31d56a9b, 0x0627f306, +- 0xe306254a, 0x6cb8c436, 0xe961bef8, 0x4001b2f5, 0xf1d66449, 0x03631fac, +- 0x2b8d0aad, 0x96ee762c, 0xa7563de1, 0x8b79c64b, 0x9ef4ac63, 0x6a771cc6, +- 0x1d3e7f3d, 0x4e89679f, 0x37c02269, 0x5b18bfec, 0xfb6ddd03, 0x1065254b, +- 0x6f1467be, 0xc0b67319, 0x056057f8, 0x115970a1, 0x9f7c249e, 0x39ebef44, +- 0x4acf3bbf, 0x129ceaf0, 0xa8fc324c, 0xe860c7c5, 0x32f5a5f0, 0x02c89fc2, +- 0x6d000312, 0x2312d6d5, 0xc6bd37bc, 0xfe61b921, 0xf95c629b, 0x0e635cf8, +- 0x6d0a1c5c, 0x0ab7ce89, 0xe7103b9e, 0xf981653c, 0xf668bf17, 0xfa31349e, +- 0xd5ff04bb, 0xfa6824b6, 0xef34d69e, 0x7f60bcc9, 0x0d23fe31, 0x4ccfdbfe, +- 0x3563186c, 0x407b16fc, 0xef8cdf76, 0x3c7535a9, 0x75fa173a, 0xc8caf8bf, +- 0xae0a4960, 0x6578e017, 0x3dcc417f, 0xa77ae096, 0x9977a4f5, 0xbd27a935, +- 0xde824a87, 0x4ade8163, 0xb29f7a4f, 0x3b7a0824, 0xfac107db, 0xc24c5de2, +- 0x135f01e7, 0x85dc3d39, 0xb788c1ae, 0x380332a5, 0x587a455e, 0x538f4cae, +- 0xa71fce16, 0x2a1e9c2c, 0x38c6e61d, 0x75d2b4ef, 0x96f5ef46, 0xbebc3cb2, +- 0xdcae8276, 0x16cf8117, 0xee342d59, 0x05fcf1aa, 0x99e287d3, 0xfb6dfdb5, +- 0xc1efa10f, 0xf784cb7f, 0xc0378845, 0x583f5c7b, 0xf84ebff7, 0x53f91928, +- 0x203aea67, 0xdb6a3e01, 0x25864564, 0x9c954c0c, 0x5b190b27, 0x89cda0f5, +- 0x8b5cf07c, 0xf18288e4, 0x6b14c9cc, 0x22564332, 0x75fd9d62, 0x11bb3e7c, +- 0x8360b85a, 0xa334de71, 0xcef2136f, 0x8c33c01e, 0x380824f3, 0x001fe01a, +- 0x0555a747, 0x0df749cc, 0x559ff2ec, 0xf851fb82, 0x6a4b982f, 0x80976f69, +- 0x998aab70, 0xef7000db, 0x1f89936e, 0xf68c6b9f, 0x2ffcc145, 0x607f396d, +- 0x3ffbf426, 0xc165c3a8, 0x27eb04df, 0x53a8f831, 0x1cad04ba, 0xc3d3ca67, +- 0xed1c877d, 0x4b7c6190, 0x8b3e5c74, 0x3764ac67, 0x955b3f31, 0x7bc0f30b, +- 0xd347b556, 0x82e556fa, 0x1f10e47c, 0xd9f8863c, 0x69646b13, 0xe41bbd70, +- 0x670dc706, 0xcc8cef1d, 0xbba9d209, 0xbbd9cbf5, 0x189efd60, 0x2627af3e, +- 0xde00c7cb, 0x07175dce, 0x5b8f1f20, 0xca35cf36, 0xd924d8ce, 0xafe91ebd, +- 0xde66f73e, 0x6f8871c7, 0x5e0832c6, 0x841c9fa2, 0xacde32ef, 0xac72bf1c, +- 0xc9d1d69e, 0xeeb81da2, 0x2193a316, 0x39c7bc9d, 0xad78ab7f, 0xd9d1bc13, +- 0x0dd47456, 0x68ee7beb, 0xef9f0386, 0xeb36ed6c, 0xe2cb7de0, 0x75c0bfdd, +- 0x715d99c9, 0xcf8841ae, 0x063bebee, 0x097a1e91, 0xfc1f77af, 0x741ee6d8, +- 0x86dbeb55, 0x7d695fcf, 0x49a5bd1e, 0x3fc9ef8a, 0xb5207ce1, 0xca55ffb5, +- 0xa8613927, 0xcc59bcb7, 0xddd60ab7, 0x93487838, 0xc69e848c, 0xc64f9414, +- 0x0c9fac2a, 0x2abbd20c, 0xf107b5de, 0x8cd7caac, 0x843ed778, 0x5e93df0b, +- 0x8fdceb40, 0xf343fcfd, 0xabba0d0a, 0xc8e1e75a, 0xfe13f4eb, 0x6a7ac56b, +- 0x0cbf164d, 0x866db3f0, 0xf9543a2f, 0x5e13dbec, 0x0e31c7a0, 0x1ba8e3af, +- 0x8b7bf9e9, 0x43e21563, 0x62bab01f, 0xf8e3fe09, 0x373c563e, 0x21bbd715, +- 0x858f69c6, 0x30579bf1, 0xb4520fce, 0xdc5879e3, 0x68b63dd6, 0xf15593d4, +- 0xdf3853ee, 0xb3f3ba0d, 0x02c7685d, 0xdc3ddd2e, 0xd7867c0e, 0x7adddd61, +- 0xc65ea382, 0xfd62aff9, 0x71f322e7, 0xd9fc3a0f, 0x54e7a21a, 0xf4148cfc, +- 0x41f8891d, 0xffa5dc85, 0xc414c3a2, 0x3d4a048f, 0x3e73d6dd, 0x10b23ac6, +- 0x9f1df6de, 0xf980e80e, 0x74f8deea, 0xdd6fca36, 0xb888a26f, 0x7d737ea3, +- 0xd9f1f23c, 0xc5bd3612, 0x7e9f53d2, 0xa5debcb1, 0x1ffae607, 0xcbd25f6b, +- 0x44602c35, 0xb2db5d3b, 0xd10fa5c4, 0xe93100a7, 0xc08683dd, 0x60ff9c04, +- 0x0056cc91, 0x863b75df, 0x7a08b0a7, 0x5adf6d5a, 0xb9955cce, 0xf512fd8c, +- 0x8ed7f21c, 0x9784f1a1, 0xe3e91b36, 0x9707f1f0, 0x1946bb57, 0xe0ef9f7a, +- 0x1f74f310, 0xcc213f3c, 0x8131b90f, 0xa23195db, 0x44e94505, 0x8f6ccf38, +- 0xd2e179f5, 0xe2f78299, 0xcce9e018, 0xbd0b77b6, 0x58672fc0, 0x51d7bee0, +- 0x30b4be7e, 0x0c267bf4, 0x4570af79, 0x6ede506c, 0xbf6be629, 0x7143b5e5, +- 0xb09f8c0a, 0x37a27775, 0x30b77f04, 0xf99797fd, 0xcbdf0737, 0x1df4c7d7, +- 0xec1e9003, 0x0ac9d3f5, 0xec7613b4, 0xa07ce44d, 0x4bce90e8, 0x15fade85, +- 0x9c111a5e, 0x3ab2c26f, 0x60c2a8d7, 0x9982f6bf, 0xfafb42f9, 0x5f4d1180, +- 0x5d0b05ed, 0x26c427b7, 0xc3e8fe92, 0xf8fea0fa, 0xbf0b78b6, 0xe0ede2ae, +- 0x6859d390, 0x239acfbf, 0x62edc9f3, 0x4463b75c, 0x1347fa0a, 0xd6fefe8c, +- 0xf318e308, 0x75f0b8d1, 0xeddcb9bd, 0x3bdb951a, 0xcc8de37c, 0x1cafc91d, +- 0x9afdc09f, 0x7999876e, 0xdbefae41, 0x743b2068, 0xd307e2e8, 0x9f7e810a, +- 0x5758306e, 0x9fab3e02, 0xaff19dd9, 0x487abf70, 0xfe825594, 0x3fbf8aa7, +- 0x6782f1f2, 0xfbae1764, 0x25f70dd3, 0x73f683cf, 0x801ac7e0, 0x0346c163, +- 0xf8deaf5d, 0x5a7eba7d, 0x6782e9f0, 0x9ea20692, 0x4d67b43f, 0xfab3ae32, +- 0x13be1fbf, 0xa356c5f5, 0x6810e075, 0xae48b66b, 0xb1722151, 0xa6b305e8, +- 0xaac755bf, 0xbaea1d71, 0x7cbee499, 0xbc78015f, 0xba0fdc09, 0x8f65ff6a, +- 0x7f017fd6, 0xfdc09bc5, 0x61534995, 0xdd4575dd, 0xdeee27e4, 0xfc764d17, +- 0xfc9916b7, 0xbf90ff01, 0xd08de7fc, 0xbd6ffb2f, 0xc1087c83, 0x5e85a3e7, +- 0xf48f2c66, 0xf7899550, 0xc9e876cb, 0x958b289f, 0xd07edf09, 0x08c8a313, +- 0x61a32d39, 0xe7d4f7dc, 0x46eb91e4, 0xf1d1b8c0, 0xe27e8606, 0x268bfcf7, +- 0xb7efd030, 0xd47fd05e, 0x529eb211, 0x23a3d4e6, 0x9a0cc252, 0xe3a3abeb, +- 0x08ff479e, 0x1ea3d326, 0xef69332f, 0xee3fee8f, 0xd1bbda34, 0x5575ed56, +- 0x39439e7e, 0x83941818, 0xf4fefbdd, 0x675878c4, 0xfb9941d5, 0x33d05763, +- 0x72bae16f, 0x566fde91, 0x0ee7816c, 0xba1cec09, 0x1a4369f8, 0xc4b157f2, +- 0xd3ff4256, 0x91e5518b, 0xd54622e4, 0x9ce80c37, 0x44f3a417, 0x7dcbc2c7, +- 0xc5c98b14, 0x11f72e4b, 0xefaf6ffe, 0xef2e59be, 0xfbd2304e, 0xb861f5c3, +- 0xfa577cfc, 0xbd90c270, 0x6a58de59, 0x17ed8e7f, 0x099eb95b, 0xfae18fd7, +- 0x1c2b854f, 0xb20bdade, 0x4f8def46, 0x505c6850, 0xfee919ff, 0x3eb38c35, +- 0x6710884b, 0x7c267d81, 0x29e98779, 0xe1ff03be, 0x641b8e0c, 0x0025ec51, +- 0x6fb58352, 0x25f5ea0c, 0x5e177716, 0x86e97ecf, 0x0c17e851, 0x43acd2dc, +- 0x7129d1fd, 0x88366d7a, 0x8283fb16, 0x045fd071, 0xfa131cdf, 0x53a0e200, +- 0x2efb6816, 0xc31f632b, 0xcc4ca2fa, 0xbb202e6b, 0x041435ef, 0x7e023fe7, +- 0x8d99c60c, 0x9fc78c25, 0xebffdc09, 0xace8a79b, 0xcbc3ff30, 0xc093cead, +- 0xa797abcf, 0xf2f2cb52, 0xfbbf4874, 0x6fd06e04, 0xbbbce7c4, 0xa75d69a2, +- 0xca3e5724, 0xbe02c3e5, 0x62dc7a70, 0x35dbf953, 0x9a2fd420, 0x5f591a5f, +- 0xd3d36f5f, 0x66a792f8, 0x71dfa164, 0x2ceefdaa, 0x00a7a3d4, 0x41da00de, +- 0x9bfe23bd, 0x84c785fc, 0xec223e3c, 0x2788bc45, 0x04e4227f, 0xd5b9c7d8, +- 0xd174eb82, 0xa7cbd5fd, 0xf2f8fb53, 0xc63f7465, 0x12fc4396, 0x4095e237, +- 0xc9dfa05f, 0x83d932b5, 0x80d746f9, 0x49ef7804, 0xd2e28e93, 0xe52deb8f, +- 0x9d782cdb, 0xff337c51, 0x509bf1a9, 0xb5cb2e2e, 0xeb6f4758, 0x7576c5bc, +- 0x7596bc7a, 0xba5da1c4, 0x00c78fcc, 0x7e41c93b, 0x6fbb2f9c, 0x3c6115b2, +- 0xe38c91d3, 0xc060523c, 0xba060a16, 0xaa3f50b2, 0xe2d57fef, 0x8496c5bc, +- 0x881b0ef1, 0xcd12d172, 0x9c384eed, 0x1efd05a3, 0xbe08ae5e, 0x88d6a3c8, +- 0xddc624be, 0xe822af68, 0xb9e27195, 0x38e71613, 0x42dfd11b, 0x03ad277e, +- 0x38eee5f8, 0x0ebc44e7, 0x6c64c371, 0x3cf0a587, 0x558b29cf, 0xe2538bf0, +- 0x9a6bb97e, 0xa71e422d, 0x3841bcb7, 0x3c6d671c, 0x4f9e138f, 0x9f355b50, +- 0xe7ac4730, 0x26ab04ab, 0x30b4a3cf, 0x423ca467, 0xe348cd9b, 0x394e9d52, +- 0xee5de946, 0xf23fba86, 0x992f98ca, 0x4e281cce, 0xda5b2329, 0x36928f31, +- 0xf302b7ca, 0xe1098d2c, 0x6335e872, 0x5bafa57e, 0x7185ec97, 0x897701c9, +- 0x1ed8e011, 0xa5f04c9f, 0x4815fab0, 0x1d6ea1af, 0x9ee87a2d, 0x06a49f68, +- 0x50a4307b, 0x509047e8, 0x655bca33, 0xa441fbac, 0xfacab0f3, 0xf3054655, +- 0xf5195e50, 0x9dc969cb, 0x38fe036d, 0xa23a37bd, 0x9b13f75f, 0x6952fbd0, +- 0xef0a961f, 0x7840c179, 0x93c2fa18, 0xa1de11b3, 0x97a6dc2f, 0x5ff5e242, +- 0xdf040cd8, 0xb28bbde9, 0x30fe7e29, 0xf4e6e58a, 0xe0a3779c, 0xdf02158b, +- 0xf3231aaf, 0xdc6233dd, 0x93e9eb55, 0x6b24e7e0, 0xb633f4f4, 0x5d4cbc90, +- 0xd3d279ed, 0xf429b03f, 0xb7d37f9e, 0xf803ebec, 0xe64ab7fc, 0x7a2fbc40, +- 0xebe52371, 0x8cb6355e, 0xa9eb82dd, 0x07cc31d3, 0x9bf7d9ec, 0x4fd07d7d, +- 0xa08654ac, 0xf9f9707f, 0xf11b9b83, 0xb355bffa, 0x34ff8821, 0xe612e3df, +- 0x3732be05, 0xdabebe13, 0xc056c514, 0x6e1e1692, 0xe843fb19, 0x31d1afaf, +- 0xebe12bd4, 0x74193786, 0x0dfad8a9, 0x7f4e62ba, 0xdd2a7fd4, 0x488cb181, +- 0x886e950f, 0x7b67d43f, 0xf046bd36, 0x8f6d70ab, 0x7a2d70e7, 0xe458eb71, +- 0x36353e93, 0x2a34f309, 0x9da8ff5c, 0x33f686b8, 0x2572e820, 0x8e1ef9fb, +- 0xe19fb70b, 0xc5897376, 0x5dc71479, 0x15ce7ec9, 0xe847b5fc, 0x8f298561, +- 0x1d92be60, 0x27de51d4, 0x6c732e9c, 0x9fa3f23d, 0x3f22aeda, 0x8b66c53a, +- 0x6cdd1f98, 0xd9b47ae4, 0x894ce6c6, 0x04130f20, 0x5d75babc, 0x898bb446, +- 0xbd44526d, 0xf5c2ca74, 0xafcde812, 0x23d3ee49, 0xf808d5eb, 0xff70ec95, +- 0x5dfe2dfa, 0xa120aa38, 0x5dba0c7f, 0x3d9d4f80, 0x8f029f14, 0x7c555e2a, +- 0x884be2fa, 0x3f0b365f, 0xa4bc7b73, 0xb3aee389, 0x169ce3ab, 0x2f664f7c, +- 0xced13afa, 0xedf8039f, 0xa5c4def8, 0x575f934c, 0xf589eaf3, 0x1438c95e, +- 0x3ca302cd, 0xbdddb65c, 0xbae300c2, 0xf3c73046, 0xb0af8fd0, 0xb3bea096, +- 0x31da3b55, 0x8678deff, 0x971b37e7, 0x9a4adf30, 0x73fff187, 0x2a7ca5f7, +- 0xe965dde2, 0xf5d41769, 0x67eabd81, 0x22e570e7, 0xabd9bd5c, 0x8517286b, +- 0x17276ff6, 0xd6e891c5, 0x6bf5cf15, 0xebdff184, 0xe2b7ce85, 0xf9d12bf5, +- 0x390f510e, 0xfc853f12, 0x6b3f944d, 0xe1ee907e, 0x918e2cf4, 0x7b7cb1fe, +- 0x19dcbc4f, 0x276b2f09, 0xb8f4f2e8, 0x88ed164e, 0xda167764, 0xffbcf3bf, +- 0xcf527b42, 0x69fc3fbc, 0x56e7e7fc, 0x0ebede3a, 0xa64b7ce1, 0x1fb9e938, +- 0x5f311877, 0x55a7e6ac, 0x4b5f3d78, 0xb9fa09cc, 0x5a996bf3, 0x9b5d7af5, +- 0x57718854, 0xe48beec9, 0x7fb6771f, 0x6771fe4d, 0xbeac7f98, 0x4f605ef7, +- 0xb2d18f94, 0xfcfff885, 0xcbcf1e06, 0x48e9f94c, 0xdfb3c380, 0xf10a7cc0, +- 0xb40ff92f, 0x679fe85e, 0xf1c7e1cc, 0x1ec9625b, 0x8f30382e, 0xac5f1cf0, +- 0xbe084a63, 0x4cd19c12, 0xbd97c109, 0x27e9a6dc, 0xc668fab9, 0xabef4ca7, +- 0xbee69fb9, 0xbd3f7341, 0xcfd340ba, 0x3349bfac, 0xa9597b3e, 0x1de39fa6, +- 0xafdf19a7, 0x3f4d76e9, 0xcd6ef9b7, 0xb8e6cdf8, 0xe00ea9e7, 0xc3fa0675, +- 0x7ac52b7a, 0x8f7f5baf, 0x97e639e6, 0x992f58fc, 0xf9fdc82f, 0xb1fb31e6, +- 0xf229525e, 0x16fbd713, 0xdf9de669, 0xe82fcdac, 0x74bed759, 0x4f9d5fc0, +- 0xbfa1f872, 0xfef6bd60, 0x848dd6c2, 0xed3e85cf, 0x6a2fc5f5, 0xa687f9fb, +- 0x4c71c40e, 0x7f442aef, 0x6d76d7ee, 0x748ae2be, 0x55775ef6, 0xd54a8e74, +- 0x68acd9d2, 0xbf8e1ce9, 0xd85b3c98, 0x37dff87d, 0xa1d62fe0, 0x0aef8be5, +- 0x6bb07f7f, 0x621b9cf3, 0xcf51c7dc, 0x952eb775, 0xcbebe619, 0xbbb23d79, +- 0x83fccbf5, 0x7d3c844a, 0xfd3c8f6e, 0xbb10f627, 0x3be9e6a6, 0x2372feb1, +- 0x97f516fb, 0x3c457fdd, 0x31e58144, 0x8acdff80, 0xf5cba61d, 0x2f307316, +- 0xd4bfae1f, 0x5ff7f416, 0x83d7a4ec, 0xf055aa75, 0xf7f8b0f4, 0x5aa7085d, +- 0x9eef18c7, 0x88def04b, 0xff808c80, 0xea9d7c2c, 0x4b87803c, 0x12f8cf38, +- 0x51c60c5b, 0x4bdcf75b, 0x4b6b0171, 0x480efae4, 0xc43e3a1e, 0xda3d253f, +- 0x234cff82, 0xe44c68bb, 0x1894d176, 0xbf31c712, 0xd857bf8d, 0x51e6dec5, +- 0xb5bd18eb, 0xea992ed2, 0x8f585d31, 0xfbd7a089, 0xf683fe26, 0xf91e8be5, +- 0x4589bed0, 0xf7c27121, 0x7ea1f7bb, 0x26e7bc07, 0x63627bc2, 0x414a6ec1, +- 0x98d3f9bb, 0xaeb79238, 0x3aefb203, 0xa4de70b8, 0x0506dbc4, 0xf0e12deb, +- 0x9dd9348e, 0xde7d10fa, 0x66ed6926, 0x43f70163, 0x9db9120a, 0xf8f0b2ad, +- 0x7be8ac75, 0x4f76fcc2, 0x414f8f13, 0x42dbaa1a, 0x89b1c1fc, 0x5cfe34b1, +- 0x5c58c974, 0xdf1146cf, 0xf448e637, 0x224946be, 0x5f1e5efb, 0x75d7163a, +- 0x8e525ec1, 0x3e044ae3, 0x046fa2c7, 0x0e5f736d, 0x0df6228f, 0x13ebf3a8, +- 0xb6127c61, 0x4d8ed4a5, 0xc83f0ab4, 0xfbd2037a, 0xde93b444, 0x8d65946b, +- 0x93b6a55f, 0x2ebaf912, 0x0a2acda2, 0x2168c9ca, 0x1e846337, 0x1471fcc3, +- 0xc2739309, 0xde4d64e8, 0x513188f8, 0x7a258de4, 0xbc7489dc, 0xb7b1d055, +- 0xcf33b23c, 0x69d507ba, 0xad791e78, 0xd591e799, 0x3c8f733c, 0xc44c63b2, +- 0x21d2323c, 0x879416c6, 0xf5978985, 0x9bea0673, 0x278e9cc6, 0x1c7f23c6, +- 0x23cf1d92, 0x31bcc7e8, 0xe2b700f9, 0x91f039d0, 0x4ad81b11, 0x7817f433, +- 0x1933ca15, 0x2d8b0e20, 0xc3efca08, 0x9f843989, 0xa6fd47c1, 0xfc3fb87c, +- 0xf31dab98, 0x31a603ca, 0x66ffaa1b, 0x87165cd6, 0x1606c4fe, 0x29596e31, +- 0x64be39e8, 0x9e728c97, 0x12fc05d4, 0x052b1e81, 0x578e403d, 0x77873d20, +- 0xeec9bbb9, 0xaa403d08, 0x3da3e30c, 0xc397f23a, 0x57103f9f, 0x7bd230f6, +- 0xbe722fb0, 0xc385a2e4, 0xfd718c61, 0xbc1fe704, 0xfa88c3ad, 0x37aa8166, +- 0x0f4c752b, 0xe82a9df4, 0xaf037537, 0x978bb353, 0x9faac92e, 0x867e68c5, +- 0xb4c160fa, 0x1fe61f58, 0x78e5b416, 0x44972e09, 0xdb4f15f9, 0x17f61761, +- 0xc56a1d0c, 0x7bf9d778, 0x47927d26, 0x7ae31a2e, 0x513ecf47, 0xcfd900f5, +- 0xdc5baa44, 0xa2eaf82e, 0x41382145, 0x018daf3f, 0xb0d82c3a, 0x53ee1762, +- 0x19dfef78, 0xca8e27d5, 0xb270c35d, 0xcb39003b, 0xb3d5b00a, 0x387c028a, +- 0x2699e695, 0x0d7ef1e6, 0xdf0535ef, 0x01db477b, 0x0351cf5a, 0x5f809af3, +- 0xa5de773a, 0x98dabfa0, 0xff107264, 0x71d7ba8a, 0x1910fdd9, 0x1d577d0f, +- 0x2da33682, 0xd606bac6, 0xb8c8cab1, 0x768bab7f, 0x5a27fe20, 0x2fc4f43a, +- 0xc47a5d89, 0x674159e3, 0xdfc9f1f4, 0x2744624f, 0xe9c75d39, 0x7df0ad96, +- 0x79b5fd23, 0x751377c0, 0x1902fe42, 0xcc627d78, 0xe0154b3b, 0x2aeb03cc, +- 0x7f41e9c7, 0x677f8c4f, 0x0ff40e69, 0x4e3f9bae, 0x313dfc0f, 0x732f9dfd, +- 0x5adfd440, 0x0fefc557, 0xbecbe77c, 0x5bac0fd0, 0x4cdfefc0, 0x59decfbc, +- 0xf30e3d57, 0xd65eeffb, 0x07fe7c0b, 0x57ef2e64, 0xba51cadb, 0xc67148fa, +- 0xcf3544b1, 0x1ef80ccc, 0x8eefdb57, 0xa9759da2, 0x41a770f5, 0x8e470f53, +- 0x8dbf0131, 0x12c57c17, 0x8c0ec8e3, 0xaf1bf413, 0x18fed3f7, 0xf84fc99d, +- 0x58358ebd, 0x5b006f91, 0xf6152eeb, 0xaed07f7c, 0x724bf969, 0xe80cb632, +- 0xe256292d, 0x98cb5593, 0x3f768cdb, 0xf1d78758, 0xe1733c3a, 0xd47855fb, +- 0x0b80f7f7, 0x85b7ab48, 0xe681b5c2, 0x1ceae151, 0x7945e512, 0x0aa7ed52, +- 0xf5d4a757, 0xb7bf262c, 0x013fbda4, 0xdb19d6e9, 0xff412595, 0x4423a4c5, +- 0xaea4cec7, 0x48472567, 0xa8e9c0df, 0x38c5727b, 0x19e7bc2f, 0x024ba9d9, +- 0xf91946fc, 0x8c26933e, 0x8f3de057, 0x58bdb924, 0x73be03df, 0x32ef91f8, +- 0x4687a48d, 0x27e6d50d, 0xcf9c492c, 0x3a3b459a, 0x30feb9aa, 0x9b67a5f0, +- 0x78c056c4, 0x236ec5cf, 0x6d8989da, 0x684e8c27, 0x309db6eb, 0xc3aabea2, +- 0xb753cc3e, 0x6f5118c1, 0x7992486d, 0x0fcc329e, 0xe0399bde, 0xc7dc44a1, +- 0x45512950, 0x091ddeee, 0xef7fb1a3, 0xf8255c5c, 0x8eb7232d, 0xb966c7c6, +- 0x76c21fda, 0x8bd8eb0e, 0x2dc3342c, 0x99d2fc6b, 0xbf1a31d5, 0x5dbd5676, +- 0x0cd39fd3, 0x9eb901d4, 0x1b5d2cb3, 0x5b88303f, 0x2c199e01, 0x6dfa87f8, +- 0x8ce3a0ba, 0xdc01b5d4, 0x6dc332c7, 0xcc8476f0, 0x856db137, 0xd77086de, +- 0xbf520e4b, 0x73e0a65e, 0xa10af933, 0xeb437bd5, 0x795ba362, 0x86aea332, +- 0xd815fbfb, 0x5456bc07, 0x42453e4b, 0xbee9183c, 0xfba255a7, 0x47c7d69e, +- 0xcf323ee1, 0x26f28952, 0x3c447dc9, 0x1cefec24, 0x51e82b01, 0xf333ce03, +- 0xa3b312fb, 0xbefe10de, 0xe99cff0a, 0x3f89a7e5, 0xaeaf9f85, 0x7602ba73, +- 0xc9cfae17, 0xfe80c4fe, 0x64efac35, 0xda9f0687, 0x6d7aacfe, 0x6d32ce7f, +- 0xf0926a7f, 0x81b207df, 0x93d34f28, 0x55ea3d24, 0xe645ffb5, 0x01f96ffb, +- 0x6bb2cd9e, 0x8d67f226, 0xa8f54fd1, 0xfa9bb2cd, 0x5eb87dea, 0xc0ee48c7, +- 0x9639201f, 0x19573e48, 0xf412d69c, 0xe2256ba3, 0xc42c99db, 0x8e09c85f, +- 0xb3dcbea7, 0xd71268ff, 0xaeccab3b, 0xdb1754a5, 0xc1375929, 0xa77a51a5, +- 0x55c0fd1e, 0xc8bce452, 0xdedc4963, 0x8a20c5be, 0x2006b807, 0x9f5da293, +- 0xc2f3ef1a, 0x76fc077b, 0xfbfd17ae, 0x07c08501, 0xb73dca0a, 0xbd85e337, +- 0x25fe0499, 0xe4037ffa, 0xdfa4e996, 0x495a346f, 0xa43b0bbf, 0x2fe70bea, +- 0x7c6876b4, 0x3f8a7ec6, 0x7b5fad26, 0xff62f50e, 0xc782ce7e, 0xcc47be01, +- 0xec8ffdfc, 0x2fb87c90, 0x3ed06ea7, 0xc0299fd2, 0xbadef816, 0x5b47a154, +- 0x52aefbb5, 0x2e61af50, 0x7a20c27f, 0xe5499a6f, 0x41e92776, 0xbbaa5fc9, +- 0x4529fa04, 0x0ca6f7bc, 0xbc95f085, 0x75c245a8, 0x0aef3267, 0x463fe3b4, +- 0xb60a4c21, 0x8fcfed57, 0x79fdc292, 0x65e6124b, 0x148c3b52, 0xe32eb1ef, +- 0xeba7943f, 0xf2327f39, 0xb0fcf859, 0x0757aa7c, 0x718bf2e3, 0x77b9af98, +- 0xdc6fbf67, 0xb49b24ef, 0xaac1b771, 0xe7c7bb8d, 0x44cff569, 0x4cef5687, +- 0xb9a7ee2e, 0x5039c53f, 0x796a7f73, 0x877fa6a1, 0xf8cd66eb, 0x6997a6bb, +- 0xe3a951fa, 0xda00f2c2, 0x9e4c4afc, 0xeb12bf36, 0xa251e6d0, 0xba7afc0e, +- 0x9a317804, 0xc06e1dbc, 0x46c81343, 0x47682db1, 0xa899c606, 0x685d1b48, +- 0x34db60b6, 0x7c8fca24, 0xc787d4d2, 0xbe0751e1, 0x7987ea9f, 0x4c5bf14c, +- 0x49788a58, 0x8a6295f2, 0x7544d018, 0xd41e1bd5, 0xd3d39bfa, 0xeda95cb8, +- 0x99f724b1, 0xbc1bac64, 0x7f73a4a8, 0x89f14036, 0xbf719a29, 0xfc89bb68, +- 0xbe4e3522, 0x9465a71c, 0x0eba409c, 0xf549d07a, 0xaccad613, 0xde7c5798, +- 0xdba9f228, 0x41dc3ef9, 0x673a1dad, 0x492f7c88, 0x49e0fae6, 0x9c58e957, +- 0xac0daebf, 0xfad3ca2c, 0xa7588c8f, 0x8f6b6bac, 0xef967b43, 0x7988c8fa, +- 0x6175e0bb, 0xd15df4e7, 0x55f95f58, 0xff711c8b, 0xf7cc92b2, 0x7a13ec6b, +- 0x83f7d67d, 0xb0c951f1, 0xb59e7ea0, 0xc32fcbb5, 0x5e8167fb, 0x4a6bf2f3, +- 0xfa0d3d24, 0x3ccf1359, 0xa7eea699, 0xc1ec6a71, 0x037ec5dd, 0xed6a9fd9, +- 0x78d339f8, 0x5c7a045c, 0x91a33d7b, 0x1d630bf4, 0x815bcc06, 0x8fdcd75e, +- 0xd271164b, 0x12e83640, 0xaea381e8, 0x2bb5fbc8, 0xc744f4d3, 0xa232eea3, +- 0x4f8093c3, 0xec9f97f4, 0xd78e3f81, 0x65ede12b, 0xfa1081e4, 0x4fab8f85, +- 0xcbf47ee3, 0x07ede8bd, 0x979f7d04, 0x54a80502, 0xe268ae3d, 0xb9a699df, +- 0xf73f718b, 0x1aafccbe, 0xeb315eb1, 0x7b4312d7, 0x03f687fb, 0xb8cf8fb4, +- 0xee326f75, 0xecb4f4af, 0x7fc0664d, 0x05650635, 0x1fc0f3fa, 0xea7ff40e, +- 0x7f04fd5a, 0x3b614b6d, 0x956daf5e, 0x3d92a81c, 0xa18dcedb, 0x468eb275, +- 0xdf3dffac, 0x93235c0b, 0x5b755fb9, 0x04f3c2b2, 0xda27786e, 0x3e516dfd, +- 0x00fc849f, 0xdae109fa, 0xe866b121, 0x14dabf3f, 0xa0fbeeb1, 0xd59ef7c0, +- 0x6ab38a46, 0xc75c79e0, 0x467dccbe, 0x56d3f213, 0xeb849758, 0x0c477c38, +- 0xc0d4bfce, 0xe150cfd0, 0x3819933b, 0xb0ffeb8e, 0xb81d0212, 0x2652aabe, +- 0x54b87f7c, 0x9fe723e4, 0xb8c74c6a, 0x77ef96a6, 0x4dd95ddf, 0xab0fbe79, +- 0x36569fb9, 0x397240df, 0x57f70963, 0xe55af9c2, 0x9f05a7db, 0x386ff386, +- 0xd7e0f6df, 0xd7e3abea, 0xe6bf20ca, 0xfa07dda3, 0x3e414e8f, 0xeeff01fa, +- 0xddc5fa65, 0xbb801486, 0x81d5a36f, 0xcb06bdfb, 0x519287be, 0xf7e6ec6f, +- 0x946cd487, 0xee51feb8, 0x37a5f5c6, 0x091ad919, 0xedd389f9, 0x85374101, +- 0x14314975, 0xa2fa05ff, 0xbf51ca9e, 0xe9b03087, 0xa73f315b, 0xf067fae7, +- 0xd71ba96b, 0x6e6ff084, 0x555be732, 0x32340e2f, 0x07aa56f7, 0x0299f4b4, +- 0xe06cbcf3, 0x312c9cf5, 0xaebf6e5f, 0x5da05331, 0xe4f5cc9f, 0xda87010a, +- 0x80e4275f, 0xf84ddc65, 0xf8e2689c, 0x5fccb71f, 0x99f8eb81, 0xea30fdd1, +- 0xef5909d5, 0x6bdda0d7, 0x20e6fbea, 0x07321fca, 0xbc6ae1f9, 0xa7c47bbe, +- 0xf583ee1b, 0x268faf9a, 0x3e779afa, 0x367e456e, 0x714d0ee7, 0xb53fe047, +- 0x61c85cf5, 0xd5f03b6e, 0xaad47e85, 0x4ebb29fd, 0x729f691b, 0x2431b9db, +- 0xe8d2172f, 0x535cfaba, 0xc1cf971a, 0x9aa83f62, 0xadbd04cf, 0x8e082e2f, +- 0x70c0f153, 0xc2115e77, 0xebd102f3, 0x086c25be, 0x4e3fab4f, 0x73599feb, +- 0xf30b9a58, 0x1a7065dc, 0xf7ef802c, 0xc62fa7e3, 0x2e6f2ffd, 0x851dcc67, +- 0xcc4ceffb, 0x03ee1d7d, 0xb03f52b4, 0xeffa953c, 0xdda8572c, 0x84bd7262, +- 0x4f63ba78, 0xabed2e7d, 0x55ca7ccc, 0x3ce9ef0a, 0x053b1068, 0xa827e44d, +- 0x36eea1f5, 0x7ee09999, 0xea8936f7, 0xb3fc2a9d, 0x3733a42f, 0xe3df97e8, +- 0xdac1e0fb, 0xde92ef65, 0x1b9f5473, 0x90d27183, 0xd88d139a, 0xf3fb2cf7, +- 0x8e2ff418, 0x3e413d83, 0xa59fbf03, 0x0e4fa84a, 0x5ddf711b, 0xcd3b05c5, +- 0x6baeb2f3, 0xf79dca0c, 0x50ea890d, 0x19cf5bc7, 0x62bdb853, 0x5806ca08, +- 0xffe0139f, 0xeb813922, 0x3a21b693, 0xdca1df4e, 0xd0fc11af, 0x71d7c37e, +- 0x32d30f48, 0xf19bede5, 0x4332fdf9, 0xda535eb9, 0xa08d6715, 0xbcc28f87, +- 0x75c15c98, 0x7f7e1b60, 0xeb9bd1ba, 0xeba6e780, 0xfa9bef22, 0xbe72f92c, +- 0xff14e482, 0x0ab7e024, 0x60b36fc1, 0x8a36f149, 0x20d1fc83, 0xcadab3cf, +- 0xadb1eb4e, 0xda47d897, 0x147d8cf8, 0xc6f7c7e2, 0xadb6df87, 0x8372f9c3, +- 0x59238c7d, 0x71845f88, 0xdfbcd324, 0x994cf3cb, 0x11dc53fd, 0x0e5979d6, +- 0x03bfc03a, 0xe381d57a, 0xdf91d8a4, 0x767b5207, 0xca0ac3c7, 0xebba298f, +- 0x6c17b429, 0x8ee28e80, 0x1fd6af5a, 0xe5ca963a, 0xc0aa58e1, 0x7e368a5b, +- 0x4e493882, 0x1c5271e1, 0xe2438416, 0x14ebf0a7, 0xae50993f, 0x8103bde0, +- 0xa244af3e, 0x29a96a4f, 0xabe50925, 0x019cf899, 0x857f239f, 0x229ed3af, +- 0xae42d9f2, 0x235ca067, 0xb972b6ff, 0x3bb79f0e, 0xf38ec4b5, 0x5c7dc6ae, +- 0x69c6f411, 0xf5daceb1, 0xb3cbe112, 0x3a784ede, 0x4abbd6c3, 0x00cf2f81, +- 0xa02fb81c, 0x498ae5d3, 0xdb8d7ac0, 0x04b36315, 0xfadd40f5, 0x756e7a18, +- 0x73eddbff, 0xc2979fa1, 0x6b6cfef9, 0x3cf10999, 0x3f973d7b, 0xfdc77df5, +- 0x4f28ec33, 0xa32e8645, 0xb467ee03, 0x3f43889d, 0x54c768b0, 0x6f61ca3b, +- 0x70a86670, 0xf16fbb2e, 0x07e73b49, 0xf5aa6fcc, 0xbf4acf38, 0x78bff111, +- 0x6dfe2319, 0x3a87fedf, 0x6db3e394, 0x87b45631, 0x78c67667, 0xbe77ff51, +- 0x49d3e511, 0xe3788714, 0x319daf41, 0x7f224c74, 0xc56c8773, 0xc6f3d1f8, +- 0x3ca14fe7, 0xa147b67a, 0xb716c7e7, 0xed0e7c3d, 0xd8db4d5e, 0xda7cfad3, +- 0x954ffe87, 0xf765da87, 0xfed57ad3, 0x0a4dcbe7, 0x7ab3d1ea, 0xb71627ae, +- 0xeffe4abe, 0xf9dd8be2, 0xb33f0f58, 0x50c36ff3, 0xdb7e79af, 0x99f50c3d, +- 0x61eef5e7, 0x5af3df78, 0xbf247d4c, 0xf3c697c5, 0xccbdaa40, 0xe4d7a239, +- 0x5d85a28b, 0x2e6869c8, 0x459d7dc7, 0x3039a787, 0x2fdeab9f, 0x7ed1d5ca, +- 0x46f7a2fe, 0x3c87e7d9, 0x97d010d7, 0x87a1f5e3, 0x8654c547, 0x41aa65f2, +- 0x555e37cd, 0xeaef079e, 0x75e48587, 0x19a73a02, 0xe80eadc6, 0x6adafef9, +- 0x06f187c9, 0xcfe12ff8, 0xb9d53f91, 0x435beed0, 0xfc6b827e, 0xcfd8a1e0, +- 0x5051ac75, 0xf6f698ad, 0x6697f10f, 0x28fe7404, 0x6de9a3e0, 0xf7f27e51, +- 0xd413fa03, 0xecd47e17, 0xe6c69f73, 0x34f21148, 0x468cef79, 0xaf9e1e3d, +- 0x8458bf81, 0xdeaff55b, 0xa3f9e34f, 0x0eab7a8c, 0x345667f7, 0xb5e22b30, +- 0xfa675e47, 0x0a2f946d, 0x8128efcf, 0x4e7c2675, 0x22b3afe9, 0x8a5faabc, +- 0x4116dc74, 0x72a6240f, 0xaf9544bf, 0xe88e8086, 0x352810d3, 0x563687f5, +- 0xab36d7c8, 0x68f7be8e, 0x09ba9b68, 0x170d0bf3, 0x0c198aef, 0x723869ef, +- 0x3defc33b, 0xa6a5ad3a, 0xe2ee7c5c, 0x063ba66d, 0xfc26f905, 0xb852c77d, +- 0x0bfa0cde, 0x21dfed91, 0x59fecfa1, 0x8a40f076, 0xff3de44e, 0x1083b6ef, +- 0x7852079f, 0xe7933e7c, 0x1e7c784f, 0xbd543f6e, 0x092bceac, 0xcbd4f73a, +- 0x81cfc9a7, 0xb2f49a38, 0xb8d0aa94, 0x7629b68c, 0x4c8faf8a, 0x9e962bb3, +- 0x3bd3f7f3, 0x3d41b674, 0x39fd57e7, 0xd7b9d78f, 0x938f7184, 0x4cf323ef, +- 0xaddf6893, 0x5c79ffea, 0x9ee5f912, 0xc70f830a, 0xa60570a9, 0x1dec7cf1, +- 0x2ccf834e, 0xd544fd05, 0xdf7cbc8f, 0xd57dd121, 0xc7fd54af, 0x77e78b80, +- 0xf7e50da7, 0x17dc98b7, 0xf71f2ed0, 0xd17ae99b, 0x319d7e08, 0xab8c5ed7, +- 0x6253baee, 0x5f8407a4, 0xb869f2a9, 0xadbe79df, 0xa3ee37df, 0x53f820df, +- 0x30acb395, 0x58ed50f9, 0xc7970a5e, 0x85e3b43a, 0xaaffc768, 0xe7c3cff1, +- 0x496e3b05, 0x3d18e7a5, 0xbd3df43f, 0xfebc522b, 0x0ca790ac, 0x3d817e95, +- 0x266f0825, 0xd83ed00b, 0x7c6becde, 0xded7971a, 0xb909e7ee, 0xdf3c92b9, +- 0x3fccf426, 0x52cb9e4b, 0xb5f877ff, 0x5ec3fd97, 0x2cfbc7be, 0x2a4264b5, +- 0xae5a35e0, 0xfca0940f, 0x6221a7fd, 0xd85d3add, 0x3577886b, 0x699bd9f4, +- 0xe47c61d4, 0x83f9e6a9, 0x6de504a6, 0xc80e638a, 0x317b3fb4, 0xc7e883c4, +- 0x4090ba2d, 0xcbfa0d6d, 0xf17cced0, 0x6623d530, 0x6fe16b56, 0x3e2e9cc2, +- 0x87c724bf, 0x362cf3fe, 0xb34cf28a, 0xb8ac12da, 0xa929b9df, 0x95ca1f65, +- 0x6cac9377, 0x50bf1d0a, 0x79e26f1d, 0xb46965b8, 0xf98592bf, 0xc3eab303, +- 0x7fad7efd, 0x1bc8b370, 0xbc27e6f5, 0x7ae66ede, 0x724cbf65, 0xa6f9875e, +- 0xb633191b, 0x59e0bd71, 0x7524f3c6, 0x7be82b6d, 0xff715aac, 0xf2807d33, +- 0x835f5450, 0x1edba7a1, 0x6479464f, 0xa93d6d4e, 0x48f785f6, 0x95d7865f, +- 0x5eb8db6c, 0xa2c8d4f2, 0xc24c348e, 0x93c42d7e, 0x2a5fe829, 0x3bc464ca, +- 0x57d9a5c0, 0xcf05faa6, 0xf9d2ba8b, 0x1c531ffd, 0x2f47733a, 0x71a6a475, +- 0xf6248ebc, 0x23acf46f, 0xae9bdbed, 0x548eb95c, 0x80d87ad7, 0xea95c5f1, +- 0x5ea4cf49, 0xde5127ae, 0xf3cf5b31, 0x926dd9bb, 0xd955f315, 0xc3dd7c6d, +- 0x7f934757, 0x958fe63d, 0x2a07d476, 0xe14ece9d, 0xe1fb3df8, 0x75b42597, +- 0xab7a8fe0, 0xfaf5d619, 0x4ddf4b87, 0xa4c57de7, 0x634b73e0, 0x3fe9bbe8, +- 0xf8831bde, 0xa45a1d7d, 0xf5476bcf, 0xc193f391, 0xa92bf57c, 0xf9167794, +- 0xc3d83d6a, 0x275e60d8, 0x855bb9fc, 0x70826bbe, 0x3b9af285, 0x29bfdd78, +- 0xfa8e3dcd, 0x36cbeb3f, 0xa4e89f91, 0xc0abf47c, 0x1a3798d7, 0xbac58b08, +- 0x59a32ff4, 0x9a91d603, 0x926fdc92, 0xa74cfd1c, 0xf3c11ca0, 0x6ef27f54, +- 0x623ec855, 0x3ceb0bea, 0x858046f9, 0x7df03bf6, 0x3a083713, 0x8b3c41a6, +- 0x33402571, 0x03d0eb0d, 0x3f27bd45, 0xfe71e99a, 0x35ee0c47, 0xa97d63d7, +- 0x4158ef5d, 0x4fb0e042, 0x7759ed89, 0x5ebc9c92, 0xd49fd6ae, 0xf56f79ba, +- 0x93df0927, 0xea8ff9cf, 0x9cff624d, 0x7762675a, 0xb5f8a8ba, 0x619eb8aa, +- 0x832c3afc, 0xd2faeb5d, 0xd42392df, 0x4c294c7f, 0x7ada67f8, 0x57bc9ae3, +- 0xdeff4f88, 0xa96de33a, 0x1efb1fec, 0x0adc07a6, 0x0c322eff, 0xe709a1ee, +- 0xfaee2993, 0x91c4bfef, 0x26eb6d9d, 0x15d9d87b, 0x7f9402c5, 0xf779e0ec, +- 0x503dfe36, 0x496fc427, 0x7e767621, 0x57779f0a, 0xfff1195b, 0x18a8c0b6, +- 0x0a58ff1c, 0x23eac7a7, 0xbfa2a6d3, 0x69e80def, 0x3c630ebf, 0xd016db1e, +- 0x72dfa117, 0x9a92e90d, 0xd12e891a, 0xcb853edc, 0x7f6121d1, 0xba72a50f, +- 0xe3c87d95, 0x5e52cf30, 0xbd0ab15f, 0x75e7a9e0, 0xc9997df5, 0x4f4f9a92, +- 0xd97f5489, 0x637645d1, 0xf68942d6, 0xfadb7ed5, 0x916913cb, 0x5b33f1eb, +- 0xbfae444f, 0xfd218f94, 0x3b3e5bd9, 0x4b7d8f3c, 0x0f63c89a, 0x5fec79e6, +- 0xbd695aa5, 0x2521fab6, 0xfaeab2c8, 0xbe1d21af, 0x87408b48, 0x5c7f386b, +- 0xdf5b77fa, 0x7d5230fd, 0x6fce1af7, 0xe16efe4b, 0xa7e92257, 0xf3bf386b, +- 0xfd7f9e3b, 0x8aff3c77, 0x77ff18ef, 0xff9844a5, 0x01fdd5ff, 0xf0fff5e1, +- 0xfbe102fd, 0xcc0ea200, 0x87bde2f7, 0x7e5db5a5, 0xdb714d68, 0x07a04ba7, +- 0x982f09f5, 0x184e8ed0, 0xab61ebc1, 0x1b7c9947, 0x01bee0a5, 0x832c5f15, +- 0x41d611c7, 0xc076bce7, 0x30339673, 0xb2f98eca, 0xe0e28c11, 0x8baf334e, +- 0x6d35bd31, 0xb7c3ed0a, 0x7e0edda6, 0xdf2f5349, 0x174e6d33, 0x762f6171, +- 0xc9466464, 0xacefa867, 0xd5a5fb61, 0x6aea29d6, 0x0fbe56d6, 0xb495e997, +- 0x4abde9db, 0xf143fa1a, 0x38f5f87b, 0x246e733f, 0xdb9c94b8, 0x72541e29, +- 0x4427be10, 0x6e36d7fd, 0xa5e60e40, 0x6217e06d, 0xac71f05d, 0x6b3c520f, +- 0xfbea71a5, 0xbf87d87e, 0x930309ef, 0xbdeb9eb0, 0x6273ef9e, 0x5d4d6a96, +- 0x7fc1a0ef, 0x7544ae72, 0x8c0fb93d, 0x0ff3a43f, 0x30473e7a, 0xd077e031, +- 0x1bd52b36, 0x1ff11adf, 0x26bbfc79, 0xcfbbe75e, 0xc6ec87ca, 0xb8e019b8, +- 0xf121676f, 0x235dccef, 0xf8c0a83e, 0x2f3f3fa3, 0x295c47a4, 0x454705f2, +- 0x17cd43be, 0x63adf5a8, 0x1c724f22, 0x76d02ff3, 0x5a043e60, 0x5aee8fa5, +- 0x4fa527db, 0x84f2fd04, 0xde43f3c4, 0x543f3c43, 0x0bf47468, 0xb8394fdd, +- 0xb9abe70f, 0x50bf5e7e, 0xc59b3df3, 0x207f0a7a, 0x2fc0a3fb, 0x6c1c6c2d, +- 0xd85f3b44, 0x6d8d1998, 0xc3a7d3be, 0xca8cef52, 0x7e953aad, 0xb868f891, +- 0xfdeae758, 0x7bdf545d, 0xffeeac35, 0x3f7c3ec3, 0xc7e0b743, 0xd461f61f, +- 0xbf572fbf, 0xf8c7dd0a, 0x52395691, 0xc416695d, 0xdce708c5, 0x8ab70e26, +- 0xa57e59ef, 0x6273df0c, 0xb623576f, 0x6539d505, 0x39af7794, 0x9bfe88d7, +- 0xbef762e7, 0x665f295b, 0x989e3054, 0xbbcda1dd, 0xfe7832d9, 0x7f8955fd, +- 0xab1de9af, 0x70b8f8a7, 0xc7f89eac, 0xf14ccb36, 0x64c0cdab, 0x70a7f60b, +- 0x3ca0a8bf, 0x6cfb0cb1, 0x83f9025a, 0x8495fb05, 0x798283f9, 0xa5d8db30, +- 0x2ba78849, 0x7cd559d5, 0x739316da, 0xeff3d23a, 0x1ed6b3ad, 0x4dfb423c, +- 0x78a975d5, 0xbda5eb51, 0x7dd559d5, 0x2ff29e0f, 0x3c34fb35, 0x9831aefa, +- 0x79dc2c7f, 0x5ff628c2, 0x8273535a, 0x1dc2d875, 0xaafea8e7, 0xf53d5bd6, +- 0x86afc8e7, 0x929ce8e7, 0xfd79cb6d, 0x81c03b75, 0xdbac2b6d, 0x06fcf009, +- 0x1b6d8dd6, 0xbfaf1bac, 0x5a8f3cb1, 0xb50772ff, 0x531796bb, 0x93ec085b, +- 0xedbac366, 0x2edbaa39, 0xdf63d3ef, 0x36f5d524, 0x2895aecb, 0x3f7521ef, +- 0xfdd787ea, 0xaf9e68e4, 0xd037ecf1, 0x839e0c77, 0x25dfd226, 0x31b3736d, +- 0xb0eaf83e, 0xaee11b3b, 0x085bbac3, 0x3a759c5f, 0xc66e78cc, 0x8cc39759, +- 0xf6c2b6f5, 0x0fdc46d3, 0x180fa753, 0x90061f31, 0x4596e3a7, 0x7c73b6cf, +- 0x895b6fdf, 0xc57bf119, 0xffeb58fa, 0x3dfd8faf, 0xa0acb1f5, 0x291e927c, +- 0x1b9ce970, 0x34efddb1, 0x13d10fcf, 0x9ebc5dab, 0x5f7fbab2, 0xae75c392, +- 0x219509be, 0xf39435f3, 0x6c6d85fc, 0xf5e8737f, 0x1e061925, 0x4239e047, +- 0x41ffde11, 0x8e35dd1f, 0xf41fdd5f, 0x9d57e089, 0xefa2643d, 0x2c77da49, +- 0xc418eec8, 0x1f343f05, 0x32bcbab7, 0xf7cfbf1b, 0xb9628d1e, 0xc9a75f3c, +- 0xbab0b1c7, 0xb9796f5c, 0xa73ae599, 0x750bf699, 0x0edda165, 0x7d319fcf, +- 0xebb71657, 0x9e7e74ce, 0x159d3783, 0xb9f51eb3, 0x7bdf33df, 0x8cfc61fd, +- 0x0bd91d72, 0x50574eb5, 0x81cb67ae, 0x19960b3f, 0x2b9f547c, 0xfba09fd7, +- 0xb06c6e22, 0x9f23a416, 0xb4683f1f, 0x3c2d5e62, 0x7f28e63f, 0x3c2fa9a1, +- 0x1c91a8ef, 0xd52bacb8, 0xe07dd4f1, 0x47db5ab3, 0x086dbe63, 0x051a6e6b, +- 0xafe90fcf, 0xe9fee2b3, 0xbe3cf59e, 0xf840bbff, 0x3679e139, 0x4bf433e4, +- 0x71f0f3c2, 0xe20f9ce9, 0x9cfdb9d2, 0x0a2db480, 0x173ea3ce, 0xd2f33fce, +- 0xf0bf75b5, 0xfdc553fb, 0xd582f286, 0x13be91fd, 0x49ed0c74, 0xa9a97943, +- 0x397cc87f, 0xdb7f7ce9, 0x4c1f5813, 0xf20fad0c, 0x5d78603a, 0x8573d550, +- 0x831d7fed, 0xfa075ef8, 0x2798ed1a, 0x0a0fd795, 0x8fd928df, 0xa708237a, +- 0x7a953fd8, 0x04ec7bf9, 0x70c5d7c6, 0xa7779cff, 0x82b9f944, 0x8aee5f09, +- 0x81733e81, 0x76bd43dd, 0x0b2affb0, 0xfa09a3ea, 0xc7aefc22, 0xd72e92e3, +- 0x349eb099, 0x71eaedf5, 0xe1419df8, 0x230e431d, 0x30a8ee5d, 0xd540fed0, +- 0x7b7d4dee, 0x7f7e18fa, 0xbc68cae3, 0xcc39279f, 0x2f2f5e0a, 0xb7e3ebc5, +- 0xce9331f8, 0xa0742226, 0x4f0703cf, 0xb66e51ea, 0x1825dc98, 0x114e173f, +- 0x6e0aa675, 0x9b68efa7, 0xe7e46062, 0xeee6ed69, 0x1f28afcc, 0x4856ddd4, +- 0xee3b23f5, 0xb414187f, 0xc13b8537, 0x3b5ec58e, 0xdd2f363b, 0x11bcf84a, +- 0x63c218ec, 0xf4ebc29b, 0x11cff4e1, 0x2ecdeff4, 0xd187a6f5, 0x2b39e0fe, +- 0x6a529f28, 0x60ae3b4f, 0xfa3867de, 0xc21e12eb, 0x35ff2bd2, 0xd096fd0b, +- 0x4eb73f8b, 0xfbaf7bf0, 0x39ff5aa7, 0xf4e6a675, 0x63751dff, 0xeb52fe35, +- 0x76bc6a4d, 0xda81f046, 0x3fed159e, 0x1a037dfc, 0x37df88d7, 0xdf7f22d8, +- 0xce85bb30, 0x6fbf5129, 0x25646bd8, 0x3f71135b, 0xc9def8ad, 0xa4fc8537, +- 0xbeff4fbd, 0xf88917f1, 0x278493bd, 0x3c3d806b, 0x3d5e764c, 0xedaeaeaf, +- 0x6d6f9e73, 0x6bc3fbe1, 0xfb9f235b, 0x77da0372, 0x2728ef78, 0x2b51bd23, +- 0xd98edbf6, 0x9744ea26, 0xebf796f3, 0x1e96f343, 0xeea49025, 0xbc51f5e3, +- 0xf663cda7, 0x53acb796, 0x96afcfbf, 0xae1f681c, 0x59b70fb4, 0x35edd7ec, +- 0xe6fce98f, 0x79e1b97d, 0xb5d3f7cc, 0x69939c75, 0x74ff5a56, 0x36e744b7, +- 0x1aae7499, 0x86ffb7da, 0xcfb48d64, 0x87610bfb, 0xc83a8bc6, 0x3f9c8dcf, +- 0x44937e7e, 0x77e0dfdf, 0x9ff74878, 0xc3bfc1bf, 0xff0179f9, 0x7bad470e, +- 0x5cd7dfa8, 0xd07bac1f, 0x77ea77f7, 0x3677ea39, 0x539d77ea, 0xb9d347d6, +- 0x5a188fc5, 0xebdfb952, 0x3a7cbe25, 0xe8fdd19d, 0x491f5628, 0x97a68f5e, +- 0x845e9d3c, 0xdc79aee3, 0x423d297b, 0xe30c3bdc, 0x218f7848, 0x3c85e203, +- 0x305e2916, 0xe2691465, 0xc787ea05, 0xeeaad70b, 0xcfc0a4f1, 0x6df75c35, +- 0x6bc6fc91, 0xdfebff38, 0x45affcf1, 0x732adba2, 0x1f17f3e4, 0xbe8490cc, +- 0xce179ed7, 0xc92f7c7a, 0xa4937aed, 0xd533707c, 0x4f540dd3, 0x536af557, +- 0xbc7f9f2c, 0x6da9a7c8, 0x0c9b6895, 0x4b65f391, 0x6467fdc4, 0x93e438e7, +- 0xf36a2f81, 0xb45b8397, 0x5b1bcbf9, 0x0c88e7b5, 0x09cf6bf1, 0x3dafdc29, +- 0xa028a63f, 0xf8663f3d, 0x31f9ed51, 0xe7b43a23, 0x99fcdcc7, 0x5b98fcf6, +- 0xcbf9b4ba, 0x1edc2f5b, 0x8fa71df6, 0x9c09479f, 0x995cfa1b, 0xb9d85e69, +- 0x73b0ba35, 0xcec3a26b, 0x1f3b09ad, 0xe39bcc45, 0x7e7613ed, 0x367d768d, +- 0xba0dc7ac, 0xefdc7afa, 0x1ea228fa, 0xcf8ccfd7, 0xdfde513d, 0xfa9b7e8c, +- 0x097ff53d, 0xe1913b3e, 0x71f4815e, 0x875b1caf, 0x22b1d57c, 0x2ef30b2a, +- 0x726995ee, 0xfb83f022, 0xa7be8951, 0x46995d2f, 0x35e67bfb, 0xa93f210c, +- 0x4fc93980, 0x1167659a, 0x9cd879cf, 0x3decf5c1, 0x8c6606f5, 0x462997c7, +- 0x33d0a81d, 0xc35b124d, 0x22658ded, 0xe33561f0, 0xfabb587c, 0xbdd51c70, +- 0xc859dd85, 0xebaac151, 0x0e79d017, 0xa8bde7e1, 0xc623c676, 0x6316b0d5, +- 0x68bbcc1a, 0x47c93b6d, 0x1e3079f8, 0xea1cf6b6, 0xb096dae1, 0x7db7f5eb, +- 0x1ff7f8ca, 0x3c8bf446, 0x2ffbdaad, 0x99ba8864, 0x7e503983, 0x9ac7f7dc, +- 0x152ccfd0, 0x56bb99f8, 0x709d62b2, 0xd27b435e, 0xb79fd05d, 0x4bb8a65f, +- 0x71eb0fc5, 0x3a20cf4e, 0xfefcfd57, 0xcfa3f25c, 0x8e0a4a2b, 0xb8f1c773, +- 0x87bbd241, 0x7659f5e3, 0xe73c70f7, 0x58c3ebac, 0x9d87f6fc, 0xdf9320b8, +- 0x3e50be00, 0x96566ff9, 0x9def9a1f, 0x6326b06b, 0xeecbc5be, 0x5378a54d, +- 0x7e2abfc4, 0x6788263c, 0xf10fb0e3, 0x749f5f2a, 0x91fa2249, 0xff02eb69, +- 0x7e03df08, 0x26b3c510, 0x7e815a66, 0x39a569d0, 0xd7605d19, 0x2ff20643, +- 0x4092d9ee, 0x0d3dc5fe, 0x1f3c4665, 0x096d9ee1, 0x79969fb4, 0xbe30479d, +- 0xa279e955, 0x2a5f70a1, 0x4b4f7bcc, 0xd2d6438e, 0xd137e4f1, 0x09d35171, +- 0x7b277e95, 0x48c9dfa1, 0x69ba03f4, 0x4321ffae, 0x6e8209f8, 0x7d3b41ec, +- 0x64b157e7, 0xffe62e6f, 0xe99bd7ce, 0xc67a2bf7, 0x37ae5e05, 0xc4d26f2b, +- 0x2e7de53f, 0xbe7475c7, 0x22daf777, 0xdd385fa2, 0xde67ffca, 0x8afefc70, +- 0xa1963efd, 0x1fab31ff, 0xc63b739b, 0xb79712c9, 0x96c6ab59, 0xa5f3bfa3, +- 0x8b6fcfd0, 0xc630e938, 0xbfd7e049, 0xf412718b, 0xd27113df, 0x41271807, +- 0x49c621fb, 0xe7149ed0, 0x0772aa05, 0xfb7c408c, 0xafb790b5, 0x6378d433, +- 0xd7e62a69, 0xdde7ffca, 0x5f159d22, 0xa349e3f5, 0xec9b1933, 0xd3d7fad4, +- 0xebfd69a7, 0x4c75830e, 0xd581da2a, 0x8f705ebc, 0x78cd66eb, 0x988c57a6, +- 0x857960f7, 0x8f64ebc1, 0x3de62314, 0x6bb04c66, 0x94d9dfc6, 0x32dbe9ae, +- 0x94f75a15, 0xeb9a7ef2, 0xd40c5777, 0x005ee7f4, 0x5df90cc7, 0x59f92629, +- 0xc626e22a, 0xac5d398a, 0xf597ec7c, 0x001e53c3, 0x683cbf78, 0xf4e1fba0, +- 0xb95ae950, 0xee7ca65e, 0xf312f5bc, 0x9b278802, 0x7d7c91e7, 0xce96347e, +- 0x52dc6991, 0xf43156f8, 0xd0316c4f, 0x0d13b2fe, 0x7cf147f6, 0x925b13eb, +- 0x3dbbf0e2, 0xfccca377, 0xa4ad77a4, 0xcb79d577, 0xefd0561a, 0x45f5cc26, +- 0xcc0f5039, 0x567de3dd, 0x4ddfa3ed, 0x4e50665b, 0xbf3ec88e, 0x1273f444, +- 0x299b377e, 0x8199fe4f, 0x92a7f179, 0xb87075e6, 0x0358933e, 0x8f9b4ff6, +- 0xe000780d, 0xb9b13338, 0x957e874a, 0xf489307c, 0x43322be7, 0x6258adbe, +- 0x1787f3a0, 0xc46f27be, 0xd20a933e, 0xfa65bd39, 0x39b60f7d, 0x5d67e68a, +- 0x6e3021c0, 0x9ea22fe9, 0x5ef2235f, 0x60f5ffd4, 0x9fc11adf, 0x259f47c8, +- 0x01026730, 0x7f0ff3cb, 0x75449c3a, 0x7d3e209f, 0xffeeb8f9, 0x64c6bbd0, +- 0x54fefd02, 0xfd27cbe5, 0xc91260f6, 0x4fde3855, 0xf2feb91a, 0x41481ca2, +- 0x339419bd, 0x3cd5fdfe, 0x41d92383, 0x1a686b7a, 0x6b93adea, 0x6467940d, +- 0xaf1c677a, 0x7c42bdcb, 0xa4e7beac, 0xf083195e, 0xa1ca6c9d, 0x59ef0cef, +- 0x43fd932b, 0x7de3e3fe, 0x971fff9c, 0x7bbf18dd, 0xc637249b, 0x737ce1ef, +- 0xf4e192df, 0x11b3047b, 0xea7a2327, 0xbc69b381, 0x17f6a10e, 0x07bfe4ed, +- 0xe87686c0, 0x5d0e0da7, 0x9f7f0347, 0x4e7358bb, 0xdfdf4d79, 0x9c23c71d, +- 0x17efefce, 0x9ce9df8f, 0x9f13223e, 0x3cdbee9d, 0xf9e8152c, 0xb0d76e85, +- 0xf9ffa007, 0x7a27ef44, 0xfbb46fa4, 0x62ebc43e, 0xfc2cdadd, 0xedb3ba6e, +- 0x866f47e3, 0xb2f4fee7, 0xbe6241c1, 0xc7f4892c, 0xb30bcda2, 0x21bbe9bf, +- 0x787dfcc6, 0x2699d1de, 0x2b173e01, 0x9f30632d, 0x84b99f30, 0x51f8e23d, +- 0x86bcf0b6, 0x73cf1d75, 0xbb145c7c, 0x79b4e306, 0x8f8c7961, 0x8d83f7c5, +- 0x6fc69299, 0xf5c99838, 0xe71d3cd7, 0x38b7886f, 0xb1a631bf, 0x5edeaa03, +- 0x220fbf8c, 0xaa80ed07, 0x33586bb7, 0xb3fd6b9d, 0xff34becc, 0xbf47c942, +- 0x27875223, 0x2af8c354, 0x6b638f2b, 0x51f28c5e, 0xe580aa9c, 0x8e0ff10b, +- 0xe7813ea1, 0x7e5f1916, 0x0177d90a, 0x8675f00b, 0xc193fb8d, 0xe9c81557, +- 0xacaa7f69, 0x346c1b1b, 0xfb81c1bf, 0x79081719, 0x7c966dad, 0x25075e7e, +- 0xcc5f3a3b, 0xd1d85f33, 0xc3d4fb70, 0xa3d9852e, 0x977661f9, 0x2ced6b35, +- 0x79e74bc0, 0xc386f0ab, 0x25898ae9, 0xe66a2c3c, 0xdcab3efb, 0x08937dbe, +- 0x1401c96e, 0x02cf01ed, 0x80951ae6, 0xc79178eb, 0x85f0e1e9, 0xbc07abaf, +- 0x70e19d62, 0xd1ce3957, 0x5b35e5f7, 0xf857c224, 0x847a543a, 0x5d2a71fb, +- 0xbf1cbcaa, 0xd1126d55, 0xff65d4f3, 0x50fed190, 0x0b586f95, 0x79e42ffc, +- 0x5d608f95, 0x2dbf5093, 0x38fa0758, 0x2d3f27a7, 0xc8712d62, 0xdfcc7537, +- 0xd3f72588, 0x473b96fe, 0x4e79e0e4, 0xa9dce987, 0x573f9b0a, 0xeca88097, +- 0x96fcb47c, 0xe3879f20, 0xbdf44afb, 0x5131fc5a, 0x00e7a067, 0x905ff35f, +- 0x909ffbe9, 0xf63e2271, 0x7b557c92, 0x3fac46bd, 0xb9f9eb57, 0xd3825772, +- 0xcbbfe7a3, 0x05784574, 0xdc35af3e, 0x7f5a59d1, 0xe577e839, 0x5bd247c6, +- 0x098f3aea, 0x7b45733d, 0xc5dc77af, 0x4927dec8, 0x4de9af98, 0x3b09577f, +- 0x3eed1f3f, 0x7fac9fb4, 0x3c6bce95, 0x3a55eeb5, 0xf2f8d59f, 0xf0b7da7c, +- 0x8f79fac9, 0x7c4fefe2, 0xd91e65b2, 0xab4f05f9, 0x0c6dde76, 0xd6ca1ff5, +- 0x5fee7dcf, 0x345f6f90, 0x6ab95d53, 0x41c45b8f, 0x9c6157a0, 0x51eb9eb2, +- 0xd5eb8eb6, 0x070f6805, 0x0ebc3d91, 0xe55fddc7, 0x3ff90ebe, 0xc9d93ae4, +- 0x7fb9e7fb, 0xbde613b5, 0x8718a5ff, 0xf56c9697, 0xd5b4bcf3, 0xf6b0f68f, +- 0xd38e0fde, 0x07c94bef, 0x6a81fbdf, 0x139e19ff, 0x42ce2ee5, 0xbf761339, +- 0x6598de56, 0xec223b45, 0xdf1b3fc4, 0xc9be20f7, 0xfef8e2bf, 0xf9e389a8, +- 0xef1cb5e3, 0x51fa5b8d, 0x5351fafc, 0x3eabf23f, 0xf84b92da, 0xf8035cae, +- 0xd15abf26, 0x804d55fa, 0x101f8c6f, 0x3dd700df, 0x6f81147b, 0x1377c707, +- 0xcb5b33c7, 0x781ecadb, 0xebf9d2f5, 0x947bfff7, 0xcf84fd03, 0x9ff27ecc, +- 0xd32adb3e, 0xdfaa6959, 0x7f3dfaa5, 0xa2cfcd66, 0x7be2a67f, 0x3e4080e1, +- 0xc78a97ea, 0x7887177f, 0x2795b85f, 0x9be07a4f, 0xbce85339, 0xbfefcbfd, +- 0xce2d27ec, 0xbe93f50a, 0x98ea5d25, 0xd72bf68b, 0xf96639e1, 0xd5a2fb21, +- 0xdf0b3fdf, 0x7cf0ad07, 0x98731465, 0x464f084c, 0xb9b8eff8, 0xfe8bee19, +- 0xecdcf72a, 0xbb8e497b, 0x31c7bf34, 0x780df989, 0x916b019e, 0xed4bbf68, +- 0x257125d2, 0xad2dcf0c, 0x67363827, 0x69df3b71, 0x3f22caee, 0xc714676d, +- 0x359ba8fb, 0x07a4d1f1, 0x423ff11d, 0x3f20e03f, 0xd79278df, 0x49cef941, +- 0xab5243c5, 0xff3ae842, 0xb8d73f02, 0x9cc482ea, 0xc09dfc76, 0x622fb4b1, +- 0xda14f37e, 0x6d055007, 0x5ef8e859, 0x9cdbcfbe, 0xc7a2f3c5, 0x78054d71, +- 0x1df8939e, 0x1a9e713c, 0x370171d5, 0x3a2ecdc7, 0x9278ef6f, 0xc8cfc1c9, +- 0x07dfa78b, 0xc1e85bb8, 0xb47d9699, 0xf1e61c8f, 0x7b9e1b32, 0x0501aeff, +- 0xf1d4c2ac, 0x73c68632, 0xbefe3f52, 0xff5b8749, 0xdf22ac1b, 0xbd92edbb, +- 0x3a413c27, 0xf381cf6a, 0x8fce4744, 0xfdc59abc, 0xa4e9c929, 0xcc14443a, +- 0xdfef0d1d, 0xebf0a59e, 0xdb3bff62, 0xed8cf400, 0x7a9c9e79, 0x39f9799d, +- 0xf0a535b2, 0x67189bef, 0xb21bd424, 0x31afd34e, 0x9e87fbf2, 0x5d793d9d, +- 0x30ef6306, 0xf43f7ac0, 0xff8f1953, 0x70fbc6e7, 0x3c64d7df, 0xad86ca6f, +- 0x76eaf89e, 0x78eaf33d, 0x7ac164db, 0x6a673888, 0x1ddfc092, 0x0f1fccc5, +- 0xa03fefbc, 0x2ef16f3d, 0x1d7fcebf, 0x9e3275e0, 0xe78f9767, 0x2b0629d6, +- 0x2e55c7bc, 0x52bc6015, 0xc1dbf2b3, 0xc2ecf1db, 0x4246ebc9, 0x70e3a75f, +- 0x29e780fe, 0x1efe6266, 0xcf5b30f0, 0x9c05c8f6, 0x8f1788de, 0x207da14d, +- 0xda244b5d, 0xede6a2af, 0x090f7a55, 0x8e89ede6, 0x307c0533, 0x3e1c534f, +- 0xaf4c8c6f, 0xb8d4b22f, 0xede285ba, 0x173e42c5, 0x45b972ab, 0x6c96972b, +- 0x8ff44741, 0x45336f01, 0xf9a4eb0b, 0xd47bc46b, 0xd9cdd773, 0x36737e7c, +- 0xf2ffe38f, 0x598fbe77, 0xaa8ef9f8, 0xf146d67c, 0x4ff7d5f9, 0xb6546d16, +- 0xe155e68d, 0x7fd7cf09, 0xf91561ba, 0x677fd549, 0xdf443ebe, 0x324c5d50, +- 0xea225576, 0x4999efa5, 0x5b1a66ee, 0x3d2deb72, 0x15e7a9c7, 0x8180b056, +- 0xbe440fd7, 0xd1a3d84c, 0xbfce85b2, 0xeff890ac, 0xc4967674, 0xe720757a, +- 0xbf7cccc7, 0x1ff079e7, 0xc0153df1, 0xef31f817, 0x27fbf8ac, 0x11583fa1, +- 0x7b63d467, 0x73cfcccc, 0xb102c39e, 0xfd413939, 0xd32258db, 0xfbcc8739, +- 0xafac64f4, 0x213ac2ad, 0xcce63fef, 0xe894aca0, 0xea36f73f, 0x811769a5, +- 0x9befa80f, 0xa93884ec, 0xcfb8af73, 0x9df3d236, 0xf67e090f, 0x27fde26e, +- 0x279bfbd5, 0xab9df3e3, 0xe4bffbd5, 0xf3a89ffd, 0x61e3fe8b, 0xdd8457f7, +- 0xdfef19ff, 0x272fdcf4, 0x2d8fd17b, 0x715dace5, 0xcfbf4493, 0x1bd423f1, +- 0x562b0fa0, 0x15cf09fa, 0x2dbc5dba, 0xd0dd7e65, 0xcaab8f2b, 0xed08fd76, +- 0x327b1c95, 0x92f5ed16, 0x67f5271c, 0x6747ba66, 0x8a68bb43, 0xbac235e4, +- 0xd91f11d9, 0xe8bd498f, 0xbd091fe5, 0xf9f0a55c, 0x3cc37c54, 0xfe8bb293, +- 0x9cfe79fe, 0xbb9e63dd, 0x5d9e06ae, 0x66914f08, 0xc0d5f71e, 0x768e5d73, +- 0xda1fd51e, 0x23f9d7d3, 0x2edc2b84, 0x23b1fe2e, 0xec53f31e, 0xe29df12d, +- 0x42ac96ca, 0x2ff17f98, 0xa1556477, 0x82fc25ff, 0x768bb43a, 0xdb83173c, +- 0x3fdbcfc5, 0xb6e5fbe4, 0x60c71bb5, 0x50da001d, 0x0bd358bb, 0xb56cde9c, +- 0xaf38ffce, 0xb4f2fe1b, 0x58b9e91e, 0xd3c9f2d7, 0x926fe768, 0x59777e22, +- 0xde3b9e2d, 0x3525efcb, 0xe03f7366, 0x87cefea5, 0xb20b6f10, 0xb291e919, +- 0x79cf9155, 0xb1e85b7e, 0xe6ff610a, 0x29358b0d, 0x23a2e780, 0x0fb855ee, +- 0x4e436aab, 0x978de601, 0x963e9667, 0xd6f98dfd, 0x6d6f9e2e, 0x0ad6f9e3, +- 0x2829605b, 0xf666f671, 0x32998f5b, 0xa9fe0fc1, 0xb220672a, 0x94796cf0, +- 0x79353fda, 0x0f9e48d4, 0xcfcbfec3, 0xe50c7f1d, 0x83c23f66, 0x83e1f5f9, +- 0x743f51a3, 0xace8c4e4, 0x25fe47a0, 0x089bee63, 0xb7e1acc7, 0x929a7ed0, +- 0x7301d8a8, 0xf89efe79, 0x5c325fe2, 0x38dd709b, 0x6e24f31e, 0x2ee93fa3, +- 0x4dfb8758, 0xbab3f699, 0x91dc63f3, 0x2efff3ea, 0xb666f0f0, 0x3afdda95, +- 0x0820b380, 0xf07efa87, 0x600697f7, 0xd32b93be, 0x50f7e086, 0x0e4a3227, +- 0xdf051764, 0xbdc3227f, 0xdf53e11d, 0x06c7527f, 0x6df1c860, 0xd05578e1, +- 0x0dd200f7, 0xe048d75a, 0xefb890b7, 0x9a3151f6, 0x7609b4fe, 0xe3cd0ce6, +- 0xf4d74b4e, 0xd3f457a7, 0x72bbbf8c, 0xc4fee6a0, 0xfad0c0a8, 0x77b7bf10, +- 0xf7cbc97f, 0x46c6c4ef, 0x3fbdfee3, 0x7df9fdb6, 0xcee9fdfc, 0xfa076417, +- 0x6e770bb6, 0x168f1f7a, 0xb5f40f3e, 0xa1527e53, 0xf69fda7c, 0x839f8ccb, +- 0xd687d4e1, 0xc0b0ce91, 0x60a52353, 0xeb6dfb7c, 0x7bad8b47, 0xae0577e8, +- 0xf3e8dd55, 0x287f516c, 0x1f680560, 0x47bfd7cf, 0x0b3abd79, 0x1d99e75f, +- 0x3c5b9cfc, 0xf012fae7, 0x20f86dfd, 0x40178bfa, 0x97fc83f1, 0x7aa09eb5, +- 0xae6c9adb, 0x9632ebaf, 0xf64fd1e8, 0x65f68b40, 0x78ade80c, 0x3b409be0, +- 0xf70dbc1b, 0x72c4e5bd, 0x54c2fdff, 0x8fef9bca, 0xfd9ff9e6, 0xfbf409c9, +- 0xc69b8bc7, 0x0bbaf5d2, 0xdbff3431, 0xb5f68072, 0xa8935f79, 0x7d31314e, +- 0xcf5c4ad6, 0xdf4401ff, 0x80006da0, 0x00008000, 0x00088b1f, 0x00000000, +- 0x7dcdff00, 0xd554780b, 0x399ef0b5, 0x67091e67, 0x99212726, 0xe4c21024, +- 0x4e010249, 0xaaf08042, 0x9e180903, 0x6831004e, 0x0cfde1d0, 0xaf4a8809, +- 0x04819bf4, 0xa86c1808, 0x3bd15014, 0x6ad480a4, 0xa6a3ea6f, 0xd004c7d6, +- 0xa0d2941b, 0xdef6b7fe, 0x22c01b5b, 0xda046a28, 0xfad2de9f, 0x3ef6b5af, +- 0x82499cc9, 0xbf7b7b72, 0xdbe3ef9f, 0xb3ef6759, 0xd7bdeb1f, 0x6b4cfb5e, +- 0x7eef2074, 0xff99b185, 0x1b297b72, 0x97dad8c6, 0x1e609e4c, 0x857bd2c0, +- 0xd35ca0eb, 0xbeb19530, 0x5356b308, 0xd731631c, 0x046c61ef, 0x2c018cc1, +- 0x64ec728d, 0x435a5031, 0xc3c64fd9, 0x3b43ab33, 0xeaac66ec, 0x37bd147a, +- 0x3011d8bd, 0xdbbc7d43, 0xc648d8c4, 0xe953ed2c, 0xcbd7c9fd, 0xfc6bfea8, +- 0xfd631b77, 0xaf54e9dc, 0x438496c3, 0xdb0522f2, 0xb4fda89b, 0xaca843eb, +- 0xca873ebc, 0x147e7277, 0x84fac3ef, 0x17fa536b, 0x526f1c02, 0x64ac4a71, +- 0x628d999c, 0xa33b7eec, 0x47ab577f, 0xaba530c7, 0x72d2c8df, 0xe81e625d, +- 0x44dd76cf, 0x8f74c0e5, 0x6c604ee6, 0xd976a6d6, 0xec51eb8e, 0x8034e1ea, +- 0xcbddf28b, 0x93debaf2, 0xbab7cd8e, 0x7bfbc287, 0xd03d58ce, 0xe2ca0dbf, +- 0xc64afab0, 0xdd794d3c, 0x36e51bc7, 0xdb193ad3, 0x6c2ce54c, 0xcbb3ef07, +- 0xef3865df, 0x6f3e557b, 0x912611b6, 0xb60658cc, 0xbf7ae84f, 0x60c1d00d, +- 0x6d97815e, 0x77f0c3c1, 0xd4afba51, 0x4db4fd0d, 0x602fe564, 0x6a5b723f, +- 0x371fe399, 0x38b799ff, 0xfe6271ff, 0x46d896bf, 0xb7d7efec, 0x81e6d6dd, +- 0x3c3cb579, 0xeee48462, 0xb75ef7ea, 0x76abf795, 0xcf4060dc, 0xb8fa37aa, +- 0x66fac277, 0xdc208f02, 0xd82dbaf1, 0x99cf4698, 0x5b4b1e29, 0xabea09a3, +- 0x5ed91d9c, 0xcdf8bf18, 0x6ff210a8, 0x32519bcb, 0x9f7e7183, 0xe917bbe9, +- 0xa0e6fc58, 0x26139312, 0x464d9af9, 0xd036583e, 0xef3e1f73, 0xf1bdbe6d, +- 0xd69c6009, 0x535fc911, 0x18814cca, 0x1d5f6fe0, 0x82859397, 0xef5d173f, +- 0xc84fb043, 0xc4ead5cf, 0xabb74829, 0xb0d2609b, 0x4c9b458e, 0x75825f43, +- 0xcb43b731, 0xeccc3c02, 0x730b60bf, 0x69995ca2, 0xc48733bd, 0xe9a06b06, +- 0x06b1eb9a, 0x9ebcabf9, 0xbdaffd46, 0xeb9e97de, 0xc848b672, 0x19f90d87, +- 0x9f8225e0, 0x197e45ef, 0x1b8725d3, 0xe28f7dd3, 0x80d667fa, 0xbe78c3bc, +- 0x2885c92d, 0x62fc5d47, 0x80af9155, 0x8596925f, 0xcb4d4dc9, 0xf42a987c, +- 0x7e25ef1f, 0x71650259, 0xc152fd58, 0x7b789107, 0x65f916ec, 0x48bf68b3, +- 0x01996509, 0x28ea960f, 0xe7cc0b6d, 0x0a7bbc4a, 0x0efd65e2, 0x16f5bf8e, +- 0xe603b16f, 0x9371febb, 0x8b619406, 0xa8ec3947, 0x587d4687, 0xf185f56d, +- 0xc3ebfced, 0x30f01b98, 0x95267ae7, 0x83be01fe, 0xd785feb8, 0x0d3a09e7, +- 0x8bb992a3, 0xd8c5cccc, 0x1baba406, 0xe9c45427, 0xad77e62c, 0x43e2747a, +- 0x53b5fe30, 0x88bfaa16, 0xa9802d78, 0xe34f027a, 0x9b412cbc, 0x75e61076, +- 0x2a02c2d1, 0x7ef169d0, 0xdfa00589, 0x46fa5025, 0xd83d52d0, 0x1481f6ce, +- 0xb176c16c, 0x805b13cc, 0xe6f584f8, 0x86be31f0, 0x6d4c97ff, 0xfd410fd9, +- 0x961b33e7, 0x81e03399, 0x86412a74, 0x82fe7e75, 0xbe7824c4, 0x2e5bdd72, +- 0x94ab1e58, 0x50aaa60e, 0xcc14c1bf, 0x7be280b6, 0x86bdf646, 0xbbd3e07a, +- 0x08adfe9b, 0xf0dc7dda, 0xaae913a2, 0x0e49b5e3, 0x4d3f6165, 0xcc00cf80, +- 0x2a5ea9bd, 0x6c342a0d, 0x5da1b29f, 0x73f3adfc, 0xbaaf9f24, 0xba78419e, +- 0xfa1b6d5a, 0xf031f212, 0xf5d73e2d, 0xae3aeaf1, 0xbefd75d7, 0xcebff056, +- 0xd73295d7, 0x4c4a955b, 0x6e169030, 0x13bcca6f, 0x4c72ef91, 0xb70b165a, +- 0x8e8f8d37, 0x32f83945, 0x5d61ab5e, 0x839742f6, 0x8049fc57, 0xa47b2ebc, +- 0xc7ae81cb, 0xf3aebd75, 0x26af6ebd, 0x2f2fe4fd, 0x79fc3bfe, 0x81d7cd32, +- 0xe64d307c, 0xec9a6b76, 0x1c9a3e20, 0xff23265f, 0x79fd7b7c, 0xb3cfe856, +- 0xb6b9fd06, 0xc7f9fd17, 0xf387945b, 0xda967f42, 0x3cde7dd8, 0x3b67dfae, +- 0x4a2bfaba, 0x834b649f, 0x1334947e, 0xcd47fbb5, 0xf3e3495b, 0xfef3b6f8, +- 0x6fceb12f, 0xd303fbd2, 0xa46fd4ac, 0x1fd0679e, 0x5f2ff9ea, 0x1da20dcf, +- 0x5d8188f8, 0x5af7bb40, 0x6161f71f, 0x444ec807, 0x666f04c7, 0xb9927e07, +- 0xa7e22078, 0x4ee03b07, 0x80ec3bfb, 0xbcba57ce, 0xcba1f2e8, 0xe8fca443, +- 0x11fd30f2, 0xa421e62d, 0x30e6200f, 0x781c8fca, 0xe951d70e, 0x728f93ee, +- 0xf811cba9, 0xdd672461, 0x9b9083ec, 0xda31392e, 0x742e5d0b, 0xa6e5d139, +- 0x52c5c852, 0x3cba1721, 0x1e9a971c, 0x3def0b1b, 0x432be697, 0xb1f2e87c, +- 0xbb4885e6, 0x313f2bd0, 0xf1a5a7e4, 0xa9f90cd5, 0x7e70ca12, 0x4fc2f5b2, +- 0x9f916ef3, 0x9dbed24a, 0x8d32b11f, 0x40ff11fb, 0xd6995a7e, 0x0ab15fb3, +- 0xca7fecf9, 0xfd5ab8af, 0xcc37429b, 0xe8216ae7, 0x7e2eb4d9, 0xe32efe9b, +- 0xf806437e, 0x46b450d9, 0x5ab675f3, 0xb06b0407, 0x1aacd7dd, 0x01fba8f1, +- 0x7dee914b, 0x27f4f8bb, 0xfe71ff60, 0xc15bfd3a, 0xedf75fff, 0xd9d11df4, +- 0xf566df16, 0xdbbd21e4, 0x37bff60c, 0x5bb1f17f, 0x6fe6f3a4, 0x4243e749, +- 0xfa0ffc6f, 0xd17a878b, 0x1eff8713, 0x862cceba, 0xfc21fb3f, 0x3c67af7b, +- 0x02fbe7d0, 0xa2f39c0e, 0xd22bccbc, 0x3c1bdbeb, 0xe01fa899, 0x8234b1cf, +- 0x0f09d987, 0x56db3e02, 0xfe9cf302, 0x007d6758, 0x8f8f27eb, 0x8f33ef11, +- 0x3fb57589, 0x5b51f691, 0xd60bda3d, 0xaf8dedc0, 0x0d0ef65d, 0x76010b83, +- 0x1145c184, 0xdede01f0, 0x9533b729, 0x972084fc, 0x54dfe82b, 0xfd15f340, +- 0x9e65fe09, 0xcf015713, 0xdb1354b3, 0x8aaa7409, 0x55d6f83f, 0x26cd6bd4, +- 0xe1877266, 0xebc97021, 0xf6fd0149, 0x9fc0499a, 0x37c079b7, 0x0e25fbb8, +- 0xabf0767f, 0xfa2c8086, 0x8d6c7f05, 0xc9a5b740, 0xbfa091e4, 0x60a64535, +- 0x7c775a7a, 0x67c9d67f, 0x54c07cfa, 0xd667df1a, 0x1f7b5bf8, 0xa7ef4de9, +- 0xdb21fbd3, 0xd77f8c2d, 0xf609e678, 0xd29b0fe0, 0x292c5db9, 0x3eb1e98c, +- 0xf8e25d2a, 0x3eb001bf, 0xd39a3c3e, 0x91e5f7c4, 0xf9d363ed, 0xb3666db8, +- 0x3763a7c0, 0x559b59f2, 0x1bb2b7c7, 0xb1993df1, 0xbe413e4e, 0x4e09f181, +- 0xeaca5469, 0x4f5cbe64, 0xb66ebe04, 0x74d32fde, 0x5f0ba63f, 0xd97a0881, +- 0xabef826e, 0x6ddbe03d, 0x33743f7c, 0xdbb9fd7a, 0x576f82fb, 0x31ec7ce8, +- 0xec8c7bf0, 0x898cfe25, 0xe001a937, 0xa8deb5c7, 0x742fdc7a, 0x195267c9, +- 0x88ca2de1, 0x4bf92ea7, 0xc8512b2e, 0xfdf5123f, 0x7afca377, 0xb9ed9dcd, +- 0x0d7cea3c, 0x5e00e7ef, 0xf7c695d1, 0xdbf7a547, 0xbe23c81d, 0xe5827aa0, +- 0xca4779b0, 0x3c045363, 0x857e423e, 0x40fe91fc, 0xca78007b, 0x7f16fd42, +- 0xe30eead6, 0x7f053b93, 0xe5626e7c, 0x26db4fa8, 0x2db23f71, 0xa40f979d, +- 0x02ccb8f3, 0x754b97c1, 0xc30e8a7e, 0x427f9183, 0x5b095fb8, 0x7e69e137, +- 0x63cf2ebc, 0xbac066cb, 0x7d78e2da, 0xdda8e355, 0x382e9481, 0x8d75bfb2, +- 0x2f10cb63, 0x8a07fd9d, 0x997da0ce, 0x40f6f02f, 0x813398e3, 0x1767413c, +- 0x7fda19d9, 0x50047f01, 0x7f22541f, 0xc7f3ba98, 0xfc6ef484, 0xdf788819, +- 0xfbc9b963, 0xf7dfddc5, 0x2ccfbc44, 0xbef2b7f1, 0x088cdba0, 0xd04696ba, +- 0xae0224b5, 0x41a0e1d0, 0x797aeaff, 0xadeef351, 0xeac7982e, 0x5967a0a3, +- 0x2d4f3f38, 0xad5fb943, 0xed3bfcea, 0x176bf20c, 0x3c274f3f, 0xf9d26ecf, +- 0xd46ec675, 0x87a865c3, 0x73c176c7, 0x3c110f50, 0x1313ccb3, 0xed66af6e, +- 0x57757b46, 0x0efede9d, 0xad777f6a, 0xea979fde, 0xcf423a75, 0x42d74465, +- 0x3ecd5edd, 0x5eabf583, 0x4d1fefe3, 0x9026739f, 0x68791379, 0x81cbc088, +- 0xd1103808, 0xd837cf7e, 0xf788dab7, 0xd7d44537, 0x23fbc047, 0xfbe33ae0, +- 0x4898970b, 0x3f02170e, 0xe5222120, 0x9a3f9232, 0x9cfd3bd3, 0x526e7b4e, +- 0xc833bfc8, 0x0e1af4d5, 0x95f74b1f, 0x706129d5, 0x2e32c2e3, 0xf01a3017, +- 0x7ff185a5, 0x120373a0, 0x17a583f0, 0x1bd4d9bd, 0xda44e65f, 0x7bff5e7b, +- 0xfd1933fc, 0x4bf06665, 0xb8464b8e, 0x0ef31245, 0x90d99d54, 0x78750f87, +- 0xa7ee196d, 0xae33efa7, 0xa2b3f60b, 0x49594d7e, 0xd6c45fb8, 0xd6c27994, +- 0xf29fb7a9, 0x1c25afd7, 0xd5c6c3ef, 0xbea08765, 0xab285262, 0x5e38cb1a, +- 0xd094bd82, 0xf889575e, 0x25d794cd, 0x8acbda2f, 0xfad650e8, 0x35883f70, +- 0x5b3ae365, 0x3e88961e, 0x0fa01a81, 0x732169e0, 0x2eced15b, 0x832b1e66, +- 0x4c4b5cad, 0xf023c6cc, 0xa587f1de, 0x3fa7688d, 0x85d7d8da, 0x19d1a1fb, +- 0x3c717f7c, 0x296ba066, 0xee7d2dc0, 0xb2db7d23, 0xc795327d, 0x0eb6cf24, +- 0xdbffb195, 0x929970f8, 0x8431f58b, 0x0fe9aba7, 0xf9066d95, 0x9bba53f8, +- 0x538beaf0, 0x6fe8cd5d, 0x8c30b4ef, 0x51a63397, 0x2ee1691c, 0x9c4efe5b, +- 0x2e21e6cf, 0xfd173ff4, 0x324a6cb0, 0xd5b45bb4, 0xd51fa1a2, 0x7153566e, +- 0x939dbe7e, 0xa4bf58ad, 0xdb819456, 0x6ff37ca9, 0x4271aa3f, 0x4ca78efb, +- 0x9fb4235a, 0xdde9ad70, 0xaf2f0061, 0x4490d0cb, 0x33375c6f, 0xb739c615, +- 0x0250507f, 0x551f3cbe, 0xde2cf6fd, 0xe5fb619e, 0x67a7dc37, 0x497b6215, +- 0x2fed02dd, 0x9ff473c0, 0x1a90ec2f, 0xa72f384d, 0x4b04da23, 0x4657f0ba, +- 0x5b0b9cf1, 0xcf8c416d, 0xf77c539d, 0xf671c7ee, 0x67d3d05b, 0xa76e4c17, +- 0x9f10f009, 0x292cb3b1, 0x04db9f19, 0x2ec6773d, 0x685f3904, 0xb21fe4ee, +- 0x3962cb27, 0x1da3ff1c, 0x1d618765, 0x441f1e17, 0x195dabf1, 0xc00c849e, +- 0x1e991df7, 0xa3e79617, 0xf37addb8, 0xe87dd26f, 0xf2f2ffc7, 0x97f21722, +- 0xd3cb833b, 0xb917d71b, 0x55f98516, 0x89973ecb, 0xbab4de0f, 0xdf7ce037, +- 0xc2601e8c, 0x41f0367d, 0x2f938c5f, 0xe016fb11, 0xf62f8de7, 0x97fd5fe0, +- 0x1e5ac7f0, 0x36ef1849, 0xd27ef5f0, 0x00dfb49f, 0x87e33f38, 0xc7c003bb, +- 0xb236db1f, 0x9b8c28f3, 0x75dc52fa, 0xe07a1309, 0xee20a8b9, 0x535258ab, +- 0xa6fc7876, 0xfb450e53, 0x841c05df, 0x7b41dfd7, 0x2efdf7dc, 0xf08e1ff0, +- 0xfdbd0bf3, 0x8023a772, 0x0e27c5ce, 0xf8f48c87, 0xf85ff648, 0xecb7bc2e, +- 0x81d90b29, 0x6c254f65, 0x8171c0ea, 0x16ae306f, 0x867f2eb9, 0xabd5d685, +- 0x6523b25c, 0xfbe12925, 0xbfa4c395, 0xe9cb937b, 0x0ecb8719, 0x972ef5e5, +- 0x9fae55cb, 0xf1653ca6, 0x1f2d3ca2, 0x70d990e9, 0xf53d26c6, 0xcfc461d6, +- 0x055175f2, 0xf2f89836, 0xaf446ca7, 0xa0238776, 0xe9cfbd42, 0x9ca16390, +- 0xd6f5c19f, 0x3f2e0ca6, 0xed9312c5, 0x62d65405, 0xcc0af5bc, 0x97c02fa7, +- 0x77b63e36, 0x29f38c34, 0x0d1bce0b, 0xe1e2bbf8, 0x25e57a7c, 0x4c8ee289, +- 0x4133c8f6, 0x5c60ae5f, 0x7c9e544f, 0xfe113ad1, 0x5ff562ac, 0x5c1fb049, +- 0x067cbd51, 0x06570bee, 0xc5dae72d, 0xb16bfc5e, 0x55b3d45c, 0x5bd811fc, +- 0xfefebd63, 0xfa4ed61a, 0xa229b2a3, 0x4ff6fabe, 0xd5537e30, 0x3ebe7c6c, +- 0xa17f11c3, 0x7258c30f, 0x5d8a6001, 0x3364b6a9, 0x0572ea58, 0x5dd60ce4, +- 0xf344c07c, 0x0a51be5f, 0xc5fe60da, 0xf8dc797d, 0xc1f03f63, 0x407f5a20, +- 0x1ef97805, 0x33967f6e, 0x7f0ed053, 0x1d607ede, 0x0a2f31c5, 0xc4d0b37d, +- 0xe7e7c8bc, 0xdc54b4a3, 0x2a7b2fef, 0xfcbcf08a, 0xf6ff95e9, 0xbed7bc38, +- 0xf87c6679, 0xf90ebafe, 0xd999e383, 0xf9fabae3, 0x52f7f364, 0xff8a0e51, +- 0xb0c9f619, 0xecb1e5de, 0x90d3f3a7, 0x6ea9c96e, 0xf2ddaba5, 0xf3670f2d, +- 0x86cfb076, 0x21dc2f75, 0xcbd83ad1, 0x2087b236, 0x3e386af3, 0xb49ed497, +- 0x633db95a, 0xd9f84baa, 0xf5e7d46e, 0x7fbc126d, 0x8525ea0e, 0x0f6817f0, +- 0x87df978b, 0x3e93257d, 0x2afae1f1, 0x66fba6cc, 0x561d3f53, 0x3317ef94, +- 0xd9f45c78, 0x2ee7ee0c, 0xa5eed54c, 0x36a3f438, 0xef1a4b6d, 0xe6251a47, +- 0x4abcfb01, 0x3a32db73, 0x8db9fcc7, 0xb5552be2, 0x27289e51, 0x2f3c4bed, +- 0x3255bf40, 0xd871ad93, 0x1ae75f2f, 0xf01fd737, 0xcf1943fc, 0x3f5c1c67, +- 0xbe02c656, 0x6638ce15, 0xfc4bffe8, 0x97f7832b, 0xfdebac3c, 0x5d4df1ce, +- 0x10c3b9f5, 0x95e77d5f, 0x979e3ce3, 0x19017e48, 0x9fa1168f, 0x0234bcf7, +- 0x770bd7f7, 0xfa829f1c, 0xf2cff576, 0xe1757c55, 0x7b27df4f, 0xb9d05ab1, +- 0xb47dfd1d, 0x0cff001f, 0x7e4253ca, 0x0f8f127c, 0xd0f8129d, 0x57d7ade9, +- 0x38f0b0ee, 0x5475e83d, 0x7f9b9524, 0x3a56fd43, 0x6fa85cda, 0x8cb65f2b, +- 0x6bfcbd42, 0x5fb43f9c, 0xf8c079b4, 0x167f810f, 0xb4546259, 0x33026b4f, +- 0x69af08ad, 0xf5dc1130, 0xf22a425e, 0xafb567e3, 0xce4f9138, 0xd0b28547, +- 0x8bac750e, 0x01711ad2, 0x7dcf8f2a, 0x88d59b56, 0x6a259c71, 0xf504c39b, +- 0xc464364b, 0x48febea1, 0xfeb1590d, 0x3334a6a3, 0x1d551ec2, 0x1e47b08f, +- 0xa067f04e, 0xff049aba, 0x6b59bea0, 0xf35cf4e2, 0x3a6b71dc, 0xac55778c, +- 0xdfe7f3f7, 0x4f78c6cf, 0x365b6a65, 0x77a011da, 0xf3c47f76, 0xc3b226b3, +- 0x3c939f6b, 0xe8bac351, 0x0de916bd, 0xd04ab5f2, 0xaf4bed79, 0xbf7c843c, +- 0xd05de916, 0x6f805f9d, 0x17f3d04f, 0xfc614e0e, 0x17c813fd, 0xb802ddba, +- 0x377182d6, 0x09af872b, 0x25e7803e, 0x8f2079fc, 0x11e826f4, 0xf92337f4, +- 0xc6fa37bd, 0xb7fb7266, 0xf48db368, 0xe7266c6b, 0x2f1df6fb, 0x9f7e913b, +- 0x6dfc7f3f, 0x7ca94f3c, 0xbbb2ac01, 0xf817be07, 0x3bf5c2a8, 0x4fe4fe69, +- 0x9d7ae154, 0xe4efeb5d, 0x556f2173, 0x5f4faf8c, 0xd62c956f, 0xf78bd7af, +- 0xbc8532e3, 0x97af8130, 0x12f97106, 0x8af284f2, 0x3ebe997e, 0x5f7f1c5f, +- 0x4ca2cfe7, 0x62699fce, 0x726d4c9d, 0xbe907e22, 0x7f8067a8, 0x4251d63c, +- 0xcf93406f, 0x0ff3067f, 0xff3e97a3, 0xd00f3152, 0xb8d89e6b, 0x9bb63a2e, +- 0xce9e8ad9, 0x3933f32f, 0x9add9cdf, 0xf80cda98, 0x59f60cfb, 0xfc006794, +- 0xa78d872a, 0x5e3e8df3, 0xa6ca4ff1, 0xffa1bae1, 0x8faff610, 0x8fa051fb, +- 0xc47cfd8c, 0xf3e87cb8, 0xb8b2e5d7, 0x7cb4c166, 0xdcfbb627, 0xeb879191, +- 0x6697e3e6, 0x07bef4aa, 0xdf7803fd, 0x38a26cd3, 0xafb159f5, 0x15f5bb3f, +- 0x2ebca2e7, 0xde229f7e, 0xabb27fc3, 0xfe753cfb, 0x9a67e30b, 0xbbf6f167, +- 0xcfac21a6, 0x752f9237, 0xc9fce9bc, 0xdf902536, 0x55a7c912, 0x38ad6729, +- 0xdd73e45e, 0x718f397f, 0x5fff9416, 0xff248298, 0x6644ecb5, 0x7f865d98, +- 0x65d51b0a, 0xb3af361f, 0x51cb7b51, 0xbd75076e, 0xaaebdbaf, 0xc425cf78, +- 0x79328ff7, 0xf56ac91e, 0xf42736c4, 0x36e3e633, 0xfdd60f3a, 0x42d709c5, +- 0x95c60c52, 0x082b4a5e, 0x2e6b77b7, 0xadfe209f, 0x70db6d64, 0xc770b3ff, +- 0x234733fb, 0x42d8fe9f, 0xb70b2fe7, 0x1fa2b64e, 0xe2f0f2be, 0x73ff4851, +- 0x5d9edc75, 0x04791daa, 0x7573e8fd, 0xe716b98f, 0x53c57be1, 0x85f3c2c6, +- 0xbe89f3bb, 0x66daa3e7, 0x80f1dc22, 0xbde11ac4, 0x6e478771, 0x71e01bba, +- 0xb8b1818e, 0x490e8fce, 0xf8c36325, 0x37530961, 0x9b7e8ddd, 0x7ca2a31c, +- 0x5af4247c, 0x6bd3858d, 0xdaffe097, 0x79cb92ce, 0x364d4d71, 0x1c77979e, +- 0xf80a7d04, 0x9bbab0a9, 0xebee3842, 0xa80fb489, 0x524b6d82, 0x935b9d1c, +- 0xcac2b4df, 0xf405c9ec, 0xcf0c9edc, 0x1eda5a4f, 0x7c9cf5c0, 0x19bf91c0, +- 0x18dd2b71, 0xbbfb88b5, 0xe7e03724, 0xbe3af8d2, 0x0bd479f4, 0x4fec8b3e, +- 0xfd15bf7f, 0x627fd47c, 0x7f6a97fe, 0xd6ed0f3c, 0x7159a3a5, 0x5e4ffeb8, +- 0x3f43aa8f, 0xd70b13e7, 0xe0ff7a67, 0xee1c7d7f, 0x65bf8127, 0x32bfc180, +- 0x1f67c0c0, 0x2db5fd1b, 0x33a7af34, 0xce95fe8d, 0xb2eb15af, 0x04f3c262, +- 0x99e3f9ba, 0x744796b7, 0x02880fd9, 0x318c5d16, 0xf6ef8c0c, 0x6d8bebf9, +- 0xd8378fe8, 0xf3ac1b54, 0x3c77e463, 0xe2597a6f, 0xe73b00fb, 0x1e5f8fff, +- 0xdefdc411, 0xf0e4ffb2, 0x105326b2, 0xec4ea553, 0xfb612ede, 0x25ffe0a5, +- 0xdbfcc29a, 0x01e7bb3d, 0x9a2bb3db, 0xb4325b6f, 0xe79472bf, 0x12b5403f, +- 0x9dbed7e1, 0xf7dffeec, 0xc178f567, 0x6bbc74af, 0xebbc434c, 0x39f7d6f8, +- 0x145f026f, 0xefe17415, 0xf20aff0b, 0x7dfb2f67, 0x3a697e54, 0xe438e8fb, +- 0x868c4767, 0xe6cbf372, 0x48fea4c7, 0x6ff297f7, 0xac757ee0, 0xfca2a312, +- 0x48dfe17e, 0xfd978c87, 0x74ea54d5, 0x1365e3d7, 0xf7a16a5e, 0xf11e68be, +- 0xef7838da, 0xeb86250d, 0xf7cf0f6f, 0x646fa488, 0xebfdc7de, 0x73e22746, +- 0x7e9f5d7d, 0x9f59d397, 0x1747a7f7, 0x2d5d713b, 0x6d7df64f, 0x4fb7d20c, +- 0xdafe8a8c, 0x71f79172, 0x13d73f61, 0x4731ed17, 0x2f9d0066, 0x62e3981e, +- 0xb69737a0, 0xcf879dcc, 0x526ebd97, 0x5ed75fd1, 0xfee2732f, 0xbb720fea, +- 0xde12c553, 0xe47ce10b, 0x697a84a0, 0x839b296c, 0x6486c7ed, 0xc67e86e6, +- 0x32fce0cc, 0xc41cb2e6, 0xe0cf9f83, 0x6e33c539, 0x033c5344, 0xbcc5f5fe, +- 0xe0bfa58e, 0xef1d1071, 0x9c6c7efa, 0x1030f758, 0xf177e243, 0x3f88b8bc, +- 0x8bc0e4ff, 0x4bbfb0b3, 0xce2a2c87, 0x16438bfb, 0xec157fea, 0xde30cca3, +- 0x5f7ca3c5, 0x1a547082, 0x7fdf33ca, 0xfbe26aac, 0x1675ca8f, 0x3ba6358f, +- 0xb587165f, 0x3c1efdc3, 0x2bb8e373, 0xfcea1f05, 0xd7c3caba, 0x1cec0ab7, +- 0xf89bf7ae, 0x6d359637, 0xc6f5bc43, 0x7f96dfc7, 0xfa8cb333, 0x7b6f93a2, +- 0x578117e3, 0x5be47f94, 0xed562f9d, 0x71ece7e7, 0x9113f94d, 0xd13e74ff, +- 0x12604bf5, 0x5a7b41cb, 0x98396563, 0x47301397, 0xca17a86b, 0xed05b714, +- 0xf6f89cc0, 0x23cf4412, 0x4abf5c59, 0x198f66c5, 0x8d8d51ed, 0x78b747f4, +- 0xc7d71677, 0x283e6421, 0x7952ccef, 0xa6ab25be, 0x825e857d, 0xed0032e3, +- 0xb89f5976, 0x49a1ba3f, 0xd9c6e1e9, 0xd975f032, 0x3207b8b8, 0x87bcc634, +- 0x4478728f, 0xd40b48dc, 0xb333d2cb, 0xccae004b, 0x0ac94cf2, 0xe1d2f7eb, +- 0x1eb801c4, 0x9f153e78, 0x37de28ff, 0xea246b23, 0xf9f4857f, 0x618ea697, +- 0xdabad31b, 0xf1dd799f, 0x5ddd2fd1, 0xa585bb70, 0xeb08796a, 0x9ee5e5f3, +- 0xec1ccf2c, 0x22f9f227, 0xde52b6c6, 0x3f5fe05c, 0xfe04ff44, 0x8f40ed79, +- 0x2d5f043b, 0xa4212bb2, 0x5cb3ab33, 0xc037f4ee, 0x8c5a6015, 0x259b748c, +- 0x390ee4f8, 0xe7ef82d4, 0x82f55ab2, 0x03a25c9d, 0x5dedf75f, 0xd80603af, +- 0xe03fbd05, 0xb02d2f87, 0x136be03e, 0x1046dfb0, 0xb120131d, 0xe998f402, +- 0x33fd7fb5, 0x60135bf6, 0xe78451ed, 0x10c2f50a, 0xccface0c, 0xd959435f, +- 0xe30c39c7, 0x1c579e1d, 0xb8e80521, 0xc43ef9fe, 0x1f852bff, 0xc4457cc3, +- 0xbe541bcf, 0x4b1be61e, 0xe080f6fc, 0xacfc4fb7, 0xf044133a, 0x0bec7673, +- 0x70f1e619, 0xc461ef94, 0xa9f31afb, 0x946ef5d4, 0xfa271ad7, 0x54ff9f19, +- 0xac3550d2, 0x3b24fe11, 0x5ee42094, 0xf506dd0a, 0x8db969ad, 0x0ab66f68, +- 0xc69cb97e, 0xd81c3f68, 0x3fbca36c, 0xea78e376, 0xa69700c3, 0x3ee1aedf, +- 0xb6cff2f3, 0x3a052e67, 0x38bd40d9, 0xa1539d61, 0xb75822cf, 0xce896005, +- 0x4f448381, 0xe1380fa8, 0xc7b4b6f9, 0x319f3952, 0x4eb5ca2f, 0xddef1d1f, +- 0xa34301e8, 0x33b669df, 0x732bee0b, 0xe51501d9, 0x27cba74f, 0xe01bc076, +- 0xfe6e327b, 0x7fac1f41, 0xeb7ffb99, 0xa613ac4d, 0xfb374eb8, 0x9ff916f7, +- 0x83016e20, 0xf8b0397e, 0xa2c3d9db, 0xe21c5683, 0x81e2ed96, 0xcaf51ee2, +- 0x257ae8bf, 0x1f93e59f, 0xf1844b82, 0x93368b96, 0x8cb70aa5, 0x6bb049eb, +- 0x9feb17c8, 0xc3bb20ca, 0x8590fc66, 0xfa0763b7, 0x4b6cbf12, 0x2b0e8893, +- 0xd7944d9b, 0x3fb9b338, 0x8cd54373, 0x3a54bee6, 0xf3d327af, 0x2dde474b, +- 0xd3877ae4, 0x8933e669, 0xe88f2893, 0xea544199, 0xf82f58f3, 0x15f3c74e, +- 0x1cb3c72f, 0x1e37ddc8, 0x2d5a13cf, 0x3f26e82c, 0x35cfd784, 0xb4afde11, +- 0x7f91979e, 0xb1304ee6, 0xd14b00be, 0x496dcf9c, 0x01eee666, 0x9f4136bf, +- 0x73347728, 0x6a0bed87, 0xf88d9ca2, 0xda780b1e, 0x97701f70, 0x2727d768, +- 0xa74ed0ce, 0x8e813ce7, 0x331594bb, 0x9ddb1d70, 0xbf915a53, 0xc33f5a1c, +- 0xb14936b8, 0xabcc1f20, 0xee63d230, 0x196c235c, 0x5be915ff, 0x73e378cb, +- 0x5f08c79b, 0xcb98e9d4, 0x18e9c372, 0xfa0f3f86, 0x363c57e1, 0xdee63f8e, +- 0x79e01e37, 0x7cc3f861, 0x32292b96, 0x147b6fe1, 0xade017c7, 0xa63cf911, +- 0x58b788c8, 0x7d4f118f, 0x48f88d4b, 0x9bd71af0, 0xa86e9e58, 0x360df64f, +- 0x515ff7d4, 0x54078060, 0x1fb4358f, 0x019271b8, 0x334c0b4e, 0x9ba8cfb4, +- 0x1ab3806d, 0x1fb436ee, 0xa1917fb4, 0xcab8373e, 0xe8e43f50, 0xb43c037a, +- 0xed0c9fe9, 0x316f3787, 0x7687e7d4, 0xb447ea1a, 0x8f00c0fe, 0xd0c27b6c, +- 0x8d87f47e, 0xed31fa86, 0xc7ea1acf, 0x00c17c5d, 0xd578e84f, 0xebb6fed0, +- 0x44f00cc7, 0x7da1aef6, 0x037dfdb1, 0x0ffd593c, 0x93dbfb43, 0xa7ea1bce, +- 0xd4333fba, 0x6ab9cf4f, 0x7f6a6780, 0xb6afb431, 0xa36546fa, 0x265d2aff, +- 0xc059aab9, 0xeb4aeae5, 0x71ca3b1c, 0xdff03651, 0x7fc9d610, 0xd29ed0e3, +- 0x62a5857e, 0x34b264fc, 0xd9f2443e, 0xdf70d26c, 0xe4af6911, 0x8c1ebccf, +- 0x4c57b1ab, 0x06234f74, 0x361c8ecc, 0x0ec7ac7e, 0xb82ec41b, 0x806aa96f, +- 0x8649bc13, 0x6ee589f6, 0x2fb27d43, 0x7fdf50c7, 0x07806685, 0xda191754, +- 0x31e8dc0f, 0x528169c0, 0x3a8cfb43, 0x6ace01af, 0x1fb43728, 0xa867dfb4, +- 0x30ae0dcf, 0x5a390fd4, 0x3687806d, 0x1fb4346d, 0xd4301cde, 0x0cea87e7, +- 0x1b5a23f5, 0xb6c8f00c, 0xa3f686fd, 0xea1a0c3f, 0x351fb4c7, 0xd8bb8fd4, +- 0x74278064, 0xdfda1b34, 0x80643d76, 0x8693b227, 0x33f6c5f6, 0xfab27806, +- 0xdbfb435b, 0xea1ace93, 0x192fbaa7, 0x64ff75ea, 0xc657ce7a, 0x995fc2e7, +- 0xf0d9fda9, 0x8792607e, 0x5e047f21, 0x6e356930, 0xa766f6c6, 0xde817f13, +- 0xd0928f6e, 0x3e52f1bf, 0xf4261c52, 0x04c65f01, 0xe857c44c, 0x5c5057ea, +- 0xafe29e28, 0x98dc5a64, 0x1f760377, 0xb4e67fe3, 0xfb77f434, 0x295df974, +- 0xf6f88f5f, 0x6cd1d77e, 0xdb6bf646, 0xa7bca944, 0xd9a3c33c, 0xebf20e3c, +- 0xd953df6c, 0xf8bfb809, 0xbbf414d9, 0x36c0b257, 0x2964e79c, 0xde1da62f, +- 0x8c651d3b, 0x54e5e863, 0x6c2de03b, 0x1aa3273e, 0xb26e0a52, 0xbf6a9fdf, +- 0xfb3bed4c, 0x130df115, 0x587d7fac, 0xbec28fff, 0xadbf0640, 0x05720fc1, +- 0xfc0fecbe, 0xfc7bc12a, 0xf5ef0449, 0xefdca9bb, 0x09f2a1cf, 0x07f546bf, +- 0x3f0445fc, 0x1c10f7ed, 0xd95297f4, 0xf3d2f7e8, 0x8272fe43, 0x197ec08f, +- 0x7fb0a3cb, 0xd859f2c6, 0x73fd6307, 0xf8462fb0, 0x9500fea7, 0x7a3afe4d, +- 0x81bf82fe, 0xfbfc97e0, 0x3fb9fe09, 0xffb36548, 0xfaaf9528, 0x35fea89b, +- 0x6fc1337f, 0x870443f8, 0x1f04adfc, 0x7c11b7f3, 0xc121ffc2, 0xa9dbfb6f, +- 0xa45ff56c, 0x077f1df2, 0x5ff29fd5, 0x9e8bb827, 0x12387f46, 0xf88a9f9f, +- 0xe37e132b, 0x2c3fc172, 0xcb8bfb9e, 0xe5b02b38, 0x932d6f82, 0x78c10dc0, +- 0x46ecbf60, 0x891d7bcc, 0x7c43957c, 0xfc56ea75, 0x98fdc8f9, 0xf19f025e, +- 0x133af4fd, 0x76e8d78f, 0xe817e45e, 0x03c5527e, 0x00bb1f7c, 0x273c5ffc, +- 0xee28cff8, 0xb6a95eaf, 0x573fa0e4, 0xf0d68a61, 0xf54ae51c, 0x610fc81f, +- 0x220dde78, 0xb66bdf72, 0xf6c33b83, 0xbef01571, 0x4eafde19, 0x54f9a34d, +- 0x9d0b56b0, 0x23cccaa3, 0x33dd5c81, 0xf89d77c0, 0x4039807a, 0x98256afb, +- 0xff38fb8d, 0xf05fdf00, 0xa5ea95f9, 0x547e136f, 0x670fce8d, 0x770942da, +- 0xa4e4fc61, 0xdebff144, 0xf22551f0, 0x7fad7bc8, 0xfa0a52e3, 0x937fa5e5, +- 0xd39f487c, 0xc6394716, 0xf8839c13, 0xc839d4be, 0x5263286c, 0x30418e7d, +- 0xaa393f9f, 0x0a0335ef, 0x759df4ff, 0xeb4fee47, 0x81df47da, 0x9bf0515b, +- 0x42db98cb, 0xf3cc8d79, 0xb85d5e16, 0xbe08f993, 0xfca8058b, 0x35cf8a5e, +- 0x0fe62468, 0x8df60905, 0xb4f6a5b5, 0xa579c8ae, 0x207ae20d, 0x50d9906d, +- 0xb9f5484e, 0x393fbfb1, 0xd3af343c, 0xc6cf6e63, 0xfaf3e975, 0xdf9baa5e, +- 0x4f1d609f, 0xf4fefce3, 0x4c1757fa, 0xe3f9dd19, 0x0a17c01f, 0xc7686f9a, +- 0x06a41cf0, 0xafdf0764, 0xf289aef9, 0xa8be75b9, 0xbe2180c0, 0x7944c9b7, +- 0x027c5dfe, 0xb0fb81fc, 0xf7ba0ef8, 0x01327c07, 0x8c6ab9d7, 0x5f82b014, +- 0xcc1cda79, 0xf2b9d136, 0x15c62b52, 0x7f03c796, 0x07cef7a4, 0x03fdc56b, +- 0xd7f039fd, 0x2fcf48ed, 0x073a317e, 0xc6f555f1, 0xabe23718, 0xc0740cc6, +- 0x923be37d, 0xb857f3c6, 0x0dc697ea, 0x932678a5, 0x4fe30d35, 0xeb3d6d33, +- 0x7f82e5db, 0x4a59274e, 0xf19fd483, 0x413ee5fc, 0x3d04fbb7, 0x64fbafd7, +- 0x3ef3048d, 0xdd12ec7d, 0xff36e95f, 0x983c8f8d, 0x55c7c619, 0x78a767cd, +- 0x5bdfd07a, 0xdf3a7f44, 0xef875648, 0xaf3e12a0, 0x465e3e4e, 0x7c0b12fc, +- 0x7c7c419c, 0x6719cf01, 0x7731dcd9, 0x280ed941, 0xfbe94109, 0x81f69567, +- 0xe546988b, 0x72a5e612, 0xf91d9039, 0x6dd81bd6, 0x62af7c45, 0x6d7cf44d, +- 0xf21762d1, 0x8fb332f1, 0x306bc9f6, 0x7dcf1753, 0x12494759, 0x36ea4bc6, +- 0xe80495bf, 0x7bb0d39b, 0x676fc632, 0x85be1707, 0xd321d965, 0x055bcc05, +- 0xce2ef8b9, 0xbd54ddab, 0x7f8c1fb5, 0xb71373f7, 0xb3e787f6, 0xf60f4e24, +- 0xae87a72e, 0x0dd72237, 0xe499b072, 0xeb43d633, 0x06a59c92, 0xc2d8a839, +- 0xaef8a63c, 0xb94ef9fc, 0xfbfd5a28, 0xe4bfa8fe, 0x54178a0e, 0x438b61bd, +- 0xdc62af3a, 0xf479301f, 0x07ee8878, 0xd5f3e230, 0x76c35a2c, 0xfebe0a9f, +- 0xbe230074, 0x1b04d4fe, 0xff2e82c2, 0x92faa594, 0xecba320a, 0xb9f99575, +- 0xb0278861, 0x9f89fbe7, 0xcb6d37cf, 0x1fbd434f, 0xc4ff454c, 0xab4dacf2, +- 0x15d83349, 0xae9f75f6, 0x16a3d738, 0x9c8a871e, 0xede8a997, 0x623fa33f, +- 0x9e00b2b3, 0xb35c8083, 0xfdcf2851, 0x355724ac, 0x978c5a88, 0xf9baf24d, +- 0xffb1ac39, 0xadbe62d3, 0xdd71e57f, 0xe307ac00, 0xe1c7dd26, 0xdd16ca76, +- 0x0de90e35, 0x9a71a317, 0xead19107, 0xed298f1c, 0x37bfe829, 0x8e7efb44, +- 0x3fe3d1f4, 0x35b2befa, 0xba4c93ed, 0x52f63697, 0x18f7dd05, 0x80fba363, +- 0xd8b88877, 0x2e3c451d, 0x071e8776, 0x07111f1b, 0xb0c7888b, 0xc5c73df1, +- 0x98ccbd74, 0xe4f9c166, 0xd7d4ffb2, 0x5d18f14f, 0xabb3760f, 0x8a3690b0, +- 0x6e29bb57, 0xc99f19d1, 0x4cf8f2b7, 0xd5c53249, 0xee4f42ad, 0xa4fd72f2, +- 0x0e589fbf, 0x3ec3185b, 0x0d32cec2, 0x00d508fb, 0x324ea80f, 0xd1b81fb4, +- 0x0b4fa86d, 0x33ea18e4, 0x9c0334ea, 0x686450d5, 0xc7bf683f, 0x4b06e700, +- 0x1c87ed0d, 0xa1e01af5, 0xf686e54d, 0x867d9bc3, 0x0ad0fcfa, 0xd688fd43, +- 0xb23c036a, 0xfda1a36d, 0x86030fe8, 0x75ed31fa, 0x1771fa86, 0x84f00c1b, +- 0xf686fd8e, 0x1a0f5db7, 0x1fb227ea, 0xed8bea1b, 0x93c0333f, 0xda185fd5, +- 0xd3ec253f, 0x862d49ed, 0x5c4407e7, 0xa4fbaa62, 0x39e9fde1, 0x53f00c67, +- 0x87946f48, 0x879256f9, 0xf783f596, 0x07fd0055, 0x186b37ac, 0xfda999f3, +- 0xab2fd0d6, 0x6dfc47ee, 0x52cfe28d, 0x947cb6a4, 0xedcca7db, 0x6d3e5869, +- 0x7dc16f72, 0x89f8c66f, 0x2acef614, 0xcb05b859, 0x9b363341, 0x9f40dc13, +- 0xa0b707b9, 0x68a90c98, 0x1e00bb31, 0x16ece4ba, 0x8d61d217, 0xfc444a49, +- 0xc1ab486f, 0x89a6c472, 0x8fd41252, 0x83585dac, 0xfd71757a, 0x61cb8599, +- 0xd837a35e, 0xa09dcd89, 0x3e30da0b, 0x6f887b26, 0xe29b0037, 0x8c8c363a, +- 0x5dbbfca6, 0x37191563, 0xba76bb33, 0xb86e316a, 0x1d41676b, 0xafc0db96, +- 0xac620e0f, 0x2c7afc0e, 0x1f5f8277, 0x386e8584, 0x945887f3, 0xa9e07553, +- 0xdfd73c24, 0xcd53e93e, 0xfb0ae1ac, 0xe3013dcd, 0x8b4427d6, 0x737ec7bc, +- 0x7f426627, 0x0f00ab28, 0xdcfa71f8, 0xbe1dd280, 0x2a3bc436, 0x372a1707, +- 0xd7bfa1a4, 0xc0c0dfad, 0xc3e227b9, 0xa27805fa, 0xf5fa6dfc, 0x785fb078, +- 0xc3de63de, 0x9f6e1ce4, 0xf59ae407, 0xd7ca023c, 0x943a2ee2, 0x80c497e0, +- 0xd31fab9e, 0xf80e5bea, 0x136ad595, 0xf71637dd, 0x4da43056, 0x5f1be071, +- 0x700f16df, 0x64ef7892, 0x8e0e6f9e, 0x72e380ab, 0x927f8c2e, 0xc61c0096, +- 0xbf00fb1f, 0xf35d2ce7, 0x0e67dcb1, 0x2c2fa0c8, 0x069a65c5, 0x20b93ce3, +- 0xfb9d369a, 0x22ff46ac, 0xfc9de44b, 0xfbcc473c, 0xfd0d1cc6, 0xf58b9fa2, +- 0x8df7ee3c, 0xfd82d8fe, 0x7932a0af, 0x40f98849, 0x579a29cf, 0xcb0ad4c3, +- 0x8cda3fd7, 0x07c04ef7, 0x8a3b426a, 0xf98737cf, 0xb8732b1b, 0x5af9625f, +- 0xa5baf8a2, 0x85c5abc6, 0x4c916f8d, 0x4fed3dd5, 0x1065e237, 0x5186af7c, +- 0x49f8e5bd, 0xac9f4fba, 0x52969835, 0xe786213f, 0x3f884a21, 0x4d05a7ef, +- 0x923e004b, 0xff7c36e3, 0x9812dfa1, 0x4fbc787f, 0xbe6136ae, 0x6aa6e242, +- 0x5121e213, 0xbe786af5, 0xc35edcc8, 0xc6e275f9, 0x1e3fa3b5, 0x6af6f381, +- 0x99610798, 0xc87df3ae, 0x9cb5448e, 0x703262d7, 0xea5ee2dd, 0x1316b755, +- 0xf43ac3df, 0xe7e76952, 0x3bd5bd5b, 0xa6a9de0b, 0xc502d7bc, 0x4f58478d, +- 0x07e52be5, 0x23b3e07b, 0xa92fdc39, 0xa3e71a77, 0xc217e7e8, 0x19555c6e, +- 0x6f425bb7, 0x61cb1fdc, 0xf3fb9fbd, 0xcdd9120b, 0x44dfbbe6, 0x5c3ab1e7, +- 0xde20e30f, 0xd8b46fea, 0x98f56f11, 0x8bf64167, 0xfa7add91, 0x77073987, +- 0x4ff3ba9a, 0x89003937, 0xbe40298b, 0x01ac1b3c, 0xadf239fc, 0xca69fa1a, +- 0xe84ccb83, 0x6ab1240b, 0x4652184a, 0xc3cab496, 0x72bf326e, 0xfa27ff23, +- 0x64c1f28c, 0x37dd325f, 0xfdd57410, 0x7474ee82, 0xde206627, 0xe579e5df, +- 0x89dcd3eb, 0x5f9d4748, 0x63fc9fd7, 0x0e8c2f94, 0x2e7e081f, 0xca120d62, +- 0x44d658eb, 0x46d678e5, 0x075877e5, 0xcaa61e95, 0x1a624e58, 0x4bcc2595, +- 0x4d5614e5, 0xa06b2965, 0xa26b1a72, 0xa36b0672, 0x5453f612, 0xfb4a997a, +- 0x57e0d9be, 0x79973960, 0xaac79ca9, 0x7c80bca9, 0x672df80e, 0xcddf040d, +- 0x066ca89a, 0x841ee03d, 0x953b0971, 0xc59e81af, 0x127f0df2, 0x9bbf2195, +- 0x97186db9, 0x84f2a1c8, 0x6df2a35f, 0xad95117f, 0x7bb50f7e, 0xe54a5fc7, +- 0xca97bf29, 0x2a72fed3, 0x6a3efcdb, 0x057f9ef7, 0xabf81f95, 0xff37fca9, +- 0xf43f2a46, 0x77fca807, 0x59951d7f, 0x06fb4656, 0x9fca1396, 0x3948f40d, +- 0x81b8f56f, 0x1cb905ae, 0xe63dc78f, 0xa478dc84, 0xfe30cca7, 0x271c94aa, +- 0x66dc5126, 0xe757bfba, 0xa316c63e, 0xfdcd3e3e, 0x83a24748, 0xe1a554fc, +- 0xc8bcc304, 0xd4bb5366, 0xcf6b6807, 0xe7b5cff5, 0x8d7f1d82, 0x10d1f6d5, +- 0x0763ddae, 0xa5b4f47b, 0x5047faad, 0xf378fd2f, 0xced83b5c, 0x3ef78eb1, +- 0x54c3967b, 0xab04e63f, 0xe6760151, 0x5783df6e, 0xa81e70b2, 0xbc7e93f7, +- 0x4ce6ee63, 0x27d7279c, 0x500d77b0, 0x853ad5fe, 0x1bf2aff2, 0xa1a3e58e, +- 0x14ad531d, 0x6b0bdda0, 0xde8af147, 0xebd645da, 0xe9593def, 0xf50f1092, +- 0x01eda07f, 0xe508c94b, 0xbc2c5c63, 0x1bb7f35f, 0x1937499f, 0xe99dbc3f, +- 0xcc9dfd26, 0xfee6a4f3, 0x91e7c07f, 0xfaf96dfc, 0x3be8cff8, 0x0a23ac1f, +- 0x9631bbe5, 0xf00e9feb, 0x55ff719b, 0xcdfae02f, 0x3747e4e9, 0xdf7379ea, +- 0x31bea993, 0x8ad2bb5a, 0x8a4ce6f0, 0x7ac7d487, 0xfdb173a2, 0x43d274d6, +- 0xe5187d29, 0xded2edbd, 0x7261dd56, 0xeb97353f, 0x35c2655d, 0x8bea3175, +- 0x8f0cc9ef, 0xef7e07da, 0x01dbd683, 0x66adee6f, 0xcc529efa, 0xd14a0f84, +- 0xc937042e, 0xf3a124a3, 0x3a2fd518, 0x5dbafb82, 0x1b3a359a, 0x51107ae8, +- 0x9d5ffe87, 0x4a5ffe42, 0x7e3e50df, 0xccab6a57, 0xf522d7f3, 0xbe316edd, +- 0x86d851d9, 0x6f9fadef, 0xa4bc6377, 0xef58fd37, 0xf9e3e40f, 0xb7da2bb7, +- 0xac3c8190, 0x7e3e7dc8, 0x2e15382b, 0x1e6bf727, 0x17363dcc, 0x8bd543ef, +- 0xf1add8bc, 0x8adefa66, 0x283ae052, 0x58abf585, 0xb3b26e43, 0x62c72166, +- 0x523bf53d, 0xfbb8ef28, 0xd7f68d3c, 0xc23cc1a1, 0x88bd74f4, 0x378e745b, +- 0x2941dfa2, 0xd8a7ae2c, 0xa78d1a42, 0xbc7d33db, 0xf1bdff9d, 0x4f7c8976, +- 0x28c73c7d, 0xd61cfae3, 0x439f5a36, 0x78fa41f8, 0x3d7d70bb, 0xe37c8de4, +- 0xf0beb878, 0xd71b46f1, 0xd1b5b0e7, 0xf7121cfa, 0xdbc73a6b, 0xbd78f3d9, +- 0x2237b38d, 0xf72f4fff, 0xdc13ff0a, 0x180e7643, 0xf9c6c534, 0x330b69f9, +- 0x92bc039c, 0x1ff3edcb, 0x595f38f2, 0xc97ae36e, 0xfdd2b2e2, 0x8bae89a4, +- 0x95af91bb, 0x173a663d, 0x26dfe253, 0x3c4e4b3f, 0xa7da24c5, 0xfe7c26b2, +- 0x17bf89b4, 0x98f6b048, 0x5fd7b367, 0x2c333a34, 0x55a89dae, 0x6b6f309b, +- 0xe195aba2, 0x6f128039, 0xf12bf5a5, 0xea1460f6, 0xd8098d5f, 0xfe83ec1a, +- 0x8bdf50c4, 0x974f30b9, 0x15c5e5c6, 0xf9883d6f, 0xd0e58954, 0x9e3e186f, +- 0xe4cc7c16, 0xb0b2b4f6, 0x791d42fb, 0x5cba1f1c, 0xc36fce47, 0xc6878e60, +- 0xea2af049, 0x8e3c31cd, 0x3f70fa73, 0x7accc7da, 0xfb83da34, 0x063bd3fc, +- 0x73bc1097, 0x9c01e52c, 0x0a763c3e, 0xed666bee, 0xd826669c, 0x3e315ac4, +- 0xdde76b33, 0x929e7c66, 0x1dfe88c1, 0x5fa4ad67, 0x255ced67, 0x14d3ffda, +- 0x0e645f6c, 0x1ae304fc, 0xed1d0f45, 0xb19b7183, 0x63fa178e, 0xbedcda79, +- 0x7477bf01, 0x857eca87, 0x73779bee, 0x7d4d039c, 0x0b748ed9, 0x977ec5c6, +- 0xe697cfcb, 0xe7858f30, 0xee29788d, 0xdb68fe30, 0xfc82bc71, 0x628ea69d, +- 0x34f76e3c, 0x9cb027ab, 0xc84ad214, 0x9ef56c2d, 0x5b4a72c0, 0xbbba0975, +- 0x9c361fa5, 0xb861b2c0, 0xdf8877ef, 0x2a8e0fc3, 0x49c60678, 0x68dceefd, +- 0xb7d277f4, 0xa41e4e84, 0xee85b1b8, 0xf22dedb9, 0xde3049d6, 0x8ed7b75e, +- 0x7c6f6876, 0x6bf499ba, 0x5a0af56c, 0x866880e7, 0xfaabdceb, 0x6fbfd0a2, +- 0xef46e714, 0x2c4731f8, 0x7f3479ec, 0xbfe099fe, 0x1ed7aaad, 0x52a0724b, +- 0xfc2283be, 0x49e67ab4, 0x3b284342, 0x1b8c413c, 0x3d70f5ee, 0x7ef8501e, +- 0x036f9b19, 0x98ae8ebf, 0x29e8bb9a, 0x7f31b26b, 0xec1bdc1a, 0x50ed1657, +- 0x883fa217, 0x06116ed7, 0x13bfc1fb, 0x743db8c4, 0x673a2e28, 0x172fe7d0, +- 0x7c617f42, 0xad9ff386, 0x8fa7bd74, 0xf6160eab, 0x5ed3f041, 0x9f4fef1f, +- 0xb760ec6f, 0x731b5ef8, 0x923e719b, 0xc3ac0f98, 0xb09f361c, 0xcebeb476, +- 0x892d3379, 0x30f59fdf, 0xb996af7e, 0x3bf5b0e5, 0x44bb5e6d, 0x22acd076, +- 0x33343aff, 0x28704bdd, 0x04fba73f, 0x1ac8eb91, 0xdf69e3cc, 0x051f6197, +- 0x79a699eb, 0xf7e5ca18, 0x55f90f55, 0x78e580b2, 0xe3c987ee, 0xd84b3127, +- 0x49f8e57a, 0xb41a6ed4, 0xb4e7f8c7, 0xf21a3ea2, 0x54d674eb, 0xc17df2ab, +- 0x5f984c89, 0xfc866316, 0x4fc05974, 0x9650bf96, 0x71abc6e6, 0xe8392d0d, +- 0x8cb03d17, 0xd76a8cf2, 0xf9c56b4f, 0x6bace526, 0xef7a8389, 0x2cee9c57, +- 0xfb0dc79f, 0x790d91ef, 0x002bc9cb, 0xf75f3f0e, 0x07e06119, 0xaf9d7b43, +- 0x8aa95314, 0xcfb9847e, 0x3059dd8d, 0xedc9d97f, 0x6cb87837, 0xf2f10f6e, +- 0xf0257c6e, 0xc667d3af, 0xa7c24ce0, 0xb3bc70ac, 0x277ecd0e, 0x1bf113a7, +- 0xd5e309fd, 0x3e62d880, 0x14894d7d, 0x8ea1fbc4, 0x012cf6ce, 0xa7491ae9, +- 0xeec75b74, 0x957f5c2c, 0x23dbf299, 0xc47e0af1, 0x67c8699d, 0x1ea9e26b, +- 0x3abe539e, 0xf6752266, 0x1b04f523, 0xed4df1e9, 0xddc1609f, 0xf8d64f3c, +- 0xe0be293c, 0x8a429c9d, 0xcc9c6847, 0x0dacfac6, 0x8c62ba46, 0xa278f509, +- 0xb4a182c6, 0xb4e7a75b, 0xa612c6f8, 0xceaba774, 0x7b7d2977, 0x10f2f3d6, +- 0xea03b093, 0xf3d41cb4, 0xfff26609, 0x84e609bc, 0xd6f07df0, 0x725f7cc1, +- 0xe90a2bdb, 0x4ede766f, 0x50b4eff7, 0x13f41f5b, 0x93335d27, 0xa9d6fe7f, +- 0x834d8f63, 0x96aff272, 0xc9bb61d4, 0xbf46edb0, 0x372be862, 0xbf262c46, +- 0xe5172da5, 0x3a1655f5, 0xb1f682d9, 0x827142d5, 0x536f9fcd, 0x35fd2127, +- 0x7d3e7146, 0xb98323dc, 0x25a5fa9d, 0x9a7d25e0, 0x7e46b326, 0x6be3765e, +- 0x3e3c4e9d, 0xb2c77944, 0xabddaf89, 0xbd935755, 0x3663c94c, 0xadb7c78a, +- 0x21bc7b24, 0xccbca19a, 0x41ee9b56, 0x1765f678, 0xb37f4333, 0x2165b735, +- 0x3f091f9e, 0x59aa8e73, 0x69a96226, 0x3f9db9fc, 0xe87aab9f, 0xc3cd5cf9, +- 0xbf7c2b9f, 0x681aa77f, 0x777f43f3, 0xec6e712a, 0xcbcd4eef, 0xa8dbafeb, +- 0xffec14fe, 0x47b4efd0, 0xebd45405, 0xfccd170d, 0x4d17ce7c, 0x2955befc, +- 0xfce37568, 0x4f74cd0a, 0xba24fc0f, 0xf54bbd5f, 0x7deafdd2, 0x088c97cc, +- 0x3670b57e, 0xc6afd1f9, 0xd5fee99b, 0xe5331eab, 0x642a0581, 0xf0521f7e, +- 0x29e5abd1, 0x8e967e74, 0xdd7a44c8, 0x643f2763, 0x62441e2b, 0xdc7ef2fb, +- 0x7fdcc85e, 0x9e2a3fd8, 0x2c6d3bda, 0xe0f914ae, 0xf2f94cb0, 0xe3cf1fdf, +- 0xf4a1f298, 0xae6bfa20, 0xcbbca30a, 0x3f389385, 0x39454c68, 0xc469a198, +- 0x987b35f7, 0xdc937666, 0x5740fbd3, 0xc2aee75a, 0x22fa4af7, 0x24d346bc, +- 0x7d06182e, 0x1ef85351, 0x4ccf83c7, 0x0abbeff9, 0x49befbc5, 0x5d7c7087, +- 0xf90b07ce, 0x774af5d4, 0x3f51a43d, 0xda49d88e, 0xc306804e, 0xfbff2800, +- 0xf51cf0ad, 0xf74c9c42, 0xca1706c6, 0x97587521, 0x7e8b27dc, 0x94f90b07, +- 0x2ce51a8f, 0x7e1190eb, 0x7eefc85c, 0x62fb9216, 0xce8c0dbf, 0x1837facd, +- 0xc7cec1db, 0x522c7a84, 0x3f0baf8e, 0xdd0f1233, 0x79ebecf0, 0x0aeb5d9d, +- 0xbad36544, 0x425d7ccc, 0x5b2a65df, 0x2aa679e8, 0x179c6e6b, 0xd70f786b, +- 0x0c90ffdf, 0xabd02a0e, 0xe31b3cd0, 0x3202333c, 0xac99bba9, 0x37c5f48d, +- 0x88ab7bad, 0x33ae4573, 0x06db7d72, 0x64bf5c4b, 0x37e4bcf8, 0x37e4cb25, +- 0x6303d659, 0xe56bc70c, 0x23b79dde, 0xeece875d, 0x59da0433, 0x62a5581f, +- 0x7a155a5c, 0xc4b5f2c9, 0x3b61ebf9, 0x7125abf1, 0x7df84e46, 0x24da919b, +- 0x51c50875, 0x841c9eaf, 0x2d77c771, 0x3d48ff84, 0xc7086637, 0x637698f3, +- 0x8bb8e45e, 0x7c7911d1, 0xdbc8bcc6, 0xc88bf7ae, 0xc888cbe3, 0xa8621be3, +- 0x888eac9f, 0x171be3c8, 0x6c57c791, 0x4ce7a780, 0x9be3c88f, 0x28ef8063, +- 0xbed0c7ba, 0x50d8b3cc, 0xb574a73f, 0xef4efea1, 0xaef806fd, 0xed0d87f2, +- 0x0c6afbe7, 0x78acf7f5, 0xfa0f50c4, 0x73b8c7a2, 0x87ae10f1, 0x6d3c936b, +- 0x103081f4, 0xfe0f6f78, 0x1dcaa480, 0xd9c7f6e1, 0x56a2fecb, 0x7d29e3d0, +- 0xe248127f, 0x8f116671, 0x10c47705, 0x9d8d0daf, 0x517dc766, 0x444b4d9a, +- 0xcd7ecebb, 0x585806ed, 0xc4e6f9c3, 0xdda94b07, 0x3a74d8fa, 0xfc027987, +- 0xc0e81f6c, 0x77cf20da, 0x6f0017e9, 0xabf79e1c, 0xf5da1285, 0x78a56ebb, +- 0x583ce76e, 0x5577f529, 0xf3ea2f9c, 0x43f18fdc, 0xecdbee1b, 0x54cf3254, +- 0xe28e3f1e, 0xe9751eed, 0xc31a96e7, 0xd6451d7e, 0x164be500, 0x30ac5b06, +- 0x8fd05adf, 0x97849af8, 0x55dda1ec, 0x3de9bb45, 0x127f1ab0, 0x96520fdd, +- 0xe8160284, 0xbf27eab2, 0xf0e3e1f8, 0x1463e2be, 0x27f878a7, 0x7e21fcbf, +- 0xc43fc407, 0xc871744d, 0xeefbcf1c, 0x874ba7fd, 0xbac65f51, 0x64625ee8, +- 0x9b7de27d, 0x26eb7abe, 0x3c16fbf5, 0x37a5dbf8, 0x8ddeff7b, 0xd586b767, +- 0x597f36f7, 0x613cc7e9, 0x356a907c, 0xcbd5c3de, 0xaabe0bef, 0xf8a56b1a, +- 0x57c92ce5, 0xe5fcf28f, 0x707affd8, 0x45f7bc3b, 0x717bb5c9, 0xbfcf077f, +- 0x1da1cf8f, 0x948bf5e1, 0x3cf8a92b, 0xfff80865, 0x58a36768, 0x6f7cf98f, +- 0x8b7ee10c, 0x41d1589c, 0x2b04f3fb, 0xf65c87c5, 0xee3fa3f9, 0x447358cb, +- 0xf71ea0bc, 0xf7a760e5, 0x1e88f88a, 0xf4417f2f, 0x92944473, 0x41ce9f3a, +- 0xf7403d98, 0xb17f7562, 0x8b383c9b, 0x651bee18, 0xae10be45, 0xac125b17, +- 0x54901f14, 0x4b77e52b, 0x2efa28ea, 0x7d1b04a2, 0x2872473c, 0x68cfb46d, +- 0xf1451849, 0x86342900, 0x128a0ce2, 0x40defea2, 0x7ee024ba, 0x77dfb8c6, +- 0x5d682bd9, 0x3acff7bd, 0xeb49f79f, 0x79889c61, 0x1f5878e0, 0xfc41ce39, +- 0x9bda1c2e, 0xe31ef665, 0x4c86d71b, 0x4af48e3c, 0xbeefb5b3, 0xfdf5e51d, +- 0x5eb2f59e, 0x307f9e62, 0x86673f0c, 0x605f13a4, 0x6c307f7e, 0x0fe3cc5c, +- 0xe8038187, 0x60c1079e, 0x42d8066a, 0xb9f88351, 0x6f578d05, 0x3fc892d5, +- 0x7487f304, 0xe7908dfc, 0x61af023f, 0xc3ec57b9, 0x635c83f7, 0x255f84f9, +- 0xc800ed3f, 0xfb4fc21f, 0xfd0654dd, 0xfa365439, 0xe43faa35, 0x88f8222f, +- 0x51f043df, 0xcf95297f, 0xfcf4bdfa, 0xc1397f39, 0xa8fbf53f, 0xa0aff26c, +- 0xabf82fe7, 0xbfc97e09, 0xa39fe091, 0xe785985f, 0xbe547513, 0xfaa06fea, +- 0x09fbfcd7, 0xa41fc37e, 0x4a3fe432, 0x9bf98fcf, 0x6fe13e08, 0x7f6df826, +- 0x7f56e088, 0xf8ef952b, 0x29f9e8db, 0xa30487ff, 0x45fee23a, 0xe03f19d2, +- 0xd9817125, 0xe25e7e8d, 0x4bb34582, 0x2e57de00, 0xd7617dd3, 0x41d2f97c, +- 0x34278be0, 0xfb7bf699, 0xee299856, 0xfb95fba3, 0x16c7d62a, 0xaa5cfd53, +- 0x268d486f, 0x12ff6cbf, 0x571fdd2b, 0x967f7256, 0xbda8552d, 0xfd532f92, +- 0x92e62b13, 0x538f58df, 0xd92ae700, 0x1931d81c, 0x93322ddb, 0x111fdefe, +- 0xe3ca4dd7, 0x4f293f76, 0x8faff7e6, 0xcfc20546, 0x629b2b29, 0x7355700d, +- 0x30e3e072, 0xc62d59be, 0x1c991b61, 0xcfc7ddfe, 0xaf307ff7, 0x90f9d604, +- 0x03ca4be4, 0xe0717c7c, 0x99d83cdc, 0xc3bdb332, 0xcce4f28a, 0x8d4ed9e8, +- 0xebcfd3cf, 0xfe224e92, 0xe13269f6, 0x61b69f6f, 0x2fee265a, 0xddf4c816, +- 0xf205c48c, 0xe99fb857, 0xfba65f37, 0x994acaa4, 0x816c81e2, 0x0363e059, +- 0xfcdfbbad, 0x0eaf54b9, 0x7471453c, 0x6d13cad7, 0x016fd193, 0x1d11657c, +- 0x39e2c50e, 0xbb88b26e, 0xa68f8fee, 0xf9c8b6bc, 0xf17bff8c, 0x33f009b3, +- 0x8cfc47aa, 0x4f3f09ef, 0xfde3fb88, 0x222277c4, 0x977fa4f1, 0x7df109f5, +- 0x1e06c0f2, 0x376c8fbf, 0x731fcc47, 0x2e3be8ce, 0x8fe93295, 0x23b82c03, +- 0xf998e31b, 0x7e43dd32, 0xb3aad27c, 0x3f3e6107, 0x91ddf3c8, 0x2c9fed07, +- 0x8ea18f91, 0xfde52b8d, 0x1f235c0f, 0x7e02be41, 0xda04795d, 0xe93bbf6d, +- 0x7d94364c, 0x8c16ee03, 0x1f463abf, 0xf989f648, 0x161764f6, 0x80fbbf0a, +- 0x2b4fc447, 0x651a3df9, 0x13dc9ee5, 0x3805dc7c, 0xb5f52bae, 0x0309f8a9, +- 0x930edcf7, 0xf97eca05, 0xcf1c3af2, 0x49d24f76, 0xe0212f1c, 0xc7cbc7d1, +- 0x9e2dbef1, 0x925bbf52, 0xf1bdd3d8, 0x37e1f4de, 0x79f5c1e9, 0x7f513ee2, +- 0xe0f51fd6, 0x8a7696e3, 0x70ce0753, 0x38b4c83d, 0x3917bfba, 0x27f96f4e, +- 0x649f8101, 0x886f3f1b, 0xe7476f7c, 0xf02025be, 0xf28cafd8, 0xe2cb26b4, +- 0xf68cfabb, 0x4627ebdb, 0x726f9bab, 0xd403f31e, 0x1eafa0bf, 0x9fa263ce, +- 0x1fbca994, 0x0267ef33, 0x44f0475b, 0xe4dc0d45, 0xe88f601c, 0x00fd8fc7, +- 0x7bbf1f7e, 0x18adeec5, 0x42d77cb7, 0xc90e74b9, 0xcef49bb7, 0x1fda25af, +- 0x2b0dccb9, 0x17f5878f, 0x9fa97c14, 0x48de6043, 0x79d7565e, 0xec055244, +- 0xadf0c291, 0x88b8f7bf, 0xe3793fa3, 0x9bca58a1, 0x8510dfc8, 0x663edffe, +- 0x2c503e27, 0x0c3f3521, 0x7f898a7f, 0xfe7227cf, 0x7aacf2c7, 0x7132805e, +- 0x32239e14, 0xf519cf7e, 0x75fbcc28, 0xb77f939f, 0xd307c169, 0xfe3c0387, +- 0x0fe74c9a, 0xfcd1a5ae, 0xcc1ff6fe, 0x86f46794, 0x677e1788, 0x63dd096d, +- 0xf712c24b, 0x054fb8a7, 0xa626fc78, 0x9f7df085, 0x09c1fb42, 0xe173e5d7, +- 0x0ab2097e, 0x22ee37f6, 0xb8f2f8a3, 0x6f70d90e, 0x6345cc6d, 0x84bfa07b, +- 0x76a4dafb, 0xa144bb63, 0x15235dff, 0x7e8ffefa, 0xd7f5d06f, 0x64c5b97d, +- 0xff49a227, 0x24c9a93f, 0x2a164fcf, 0x76ddb107, 0xfb84bb3b, 0xbb7cc744, +- 0xc5a07a8a, 0x557a4d15, 0xfe4d1119, 0x6394f6f3, 0x9fc076f6, 0x2a07e46d, +- 0x6c032bfa, 0xbb1883be, 0xab73edfe, 0x218d25e7, 0x5df5de3d, 0x3bb022e3, +- 0xf282f978, 0x9decd699, 0x1579899c, 0xd8eefa66, 0x7ab73c7f, 0x2277f86f, +- 0x307524d3, 0x84ec57cf, 0xe0dfa157, 0x418fb9c0, 0x33ea063f, 0xd7c61cf0, +- 0x29217a8e, 0xf905babe, 0xb6395eaa, 0x85d0e282, 0x2d57a4f1, 0xea10eabe, +- 0xc0ad7a89, 0xbadf2e1e, 0xdcaadc9c, 0xd5ce293f, 0xbffe49be, 0xe4dedfa9, +- 0x2e5c95fc, 0x01c5bd77, 0xb77e7df4, 0x5ebec4fe, 0xdfdfc21e, 0xe079f42a, +- 0xbd47b5ac, 0xd72866bf, 0xef224517, 0x297c5661, 0x567e7f7d, 0x3cc65da0, +- 0x2e50cf50, 0x1c12fb47, 0x2fb0cf94, 0x7e30858d, 0xedcf981e, 0xe20ad903, +- 0x538a74a7, 0xd4da9bd5, 0x0a43d200, 0x2e2e91b9, 0xefe187d8, 0x6ddfd478, +- 0xf977d20e, 0xfc28be82, 0x63f41e3e, 0x852817d8, 0xe4d5e2dd, 0x6871ebbf, +- 0x7e008efc, 0x82b687ff, 0xca3a82e0, 0x9b9df4cd, 0x7426f7c8, 0xaedbe118, +- 0xcc89e11b, 0x629abdf8, 0xac9e11bb, 0x43a1e11a, 0xf6e2bef9, 0xa9f3e324, +- 0x6fdc236e, 0x9994637e, 0x78a0ffdf, 0x0c147e95, 0xb8c03eff, 0x64017f58, +- 0x60f7e20c, 0x21afb7fb, 0xe8ff507d, 0x7eff920c, 0xcae2226b, 0x8195b00c, +- 0xf3e36a71, 0x2d859cc4, 0xaaed7e98, 0x87be2390, 0x2ce746d2, 0x73c30f80, +- 0xf20b7cfc, 0x9e6ce1ff, 0xdc30d9ff, 0xc8e87937, 0xde1c79ae, 0xcfce9b33, +- 0x035f562c, 0x28c74efd, 0x36d2ec99, 0x9b75d399, 0x35ba72a6, 0x5779d327, +- 0x60b44aa2, 0x5d5f3645, 0x4723c61a, 0xc91e299a, 0x3df9e21a, 0xd3fae7f4, +- 0x2c6241f9, 0xe773439f, 0xfa47dbfe, 0x40d89d97, 0x2afb03e7, 0x788efa64, +- 0xf9403db2, 0x2bceb053, 0xce963886, 0x39f9f3b7, 0x50d7ac0a, 0x62bceb0f, +- 0x101f97e4, 0xa2f5f49d, 0xf0c206bc, 0x081a7280, 0xbe699b8f, 0x940788e5, +- 0x51e7f0d7, 0xba16ed99, 0xd3d62d4f, 0x7aeadc9b, 0x579c48a3, 0xd76c79eb, +- 0x1e7a98c4, 0xff9106db, 0xe234ecda, 0x24f95ae1, 0x6b5c338a, 0xebed139b, +- 0x2f418e49, 0x2f5c6c04, 0xde1db960, 0x7bdfb943, 0x1c54e163, 0x2044f50f, +- 0x16147bec, 0x6dffa7c1, 0xc221b3bf, 0xeffb3f2f, 0xf9186a47, 0x9e208f9d, +- 0xe39c072a, 0x77c5edf7, 0xb6782cbc, 0x3ea5cf07, 0xcb7aaf9c, 0xcae9af1b, +- 0xbae3b5bf, 0xbfbc88a5, 0x5af8112b, 0xbfa5f02f, 0x274d457f, 0x2d695d3c, +- 0x2786f7b6, 0x1327f426, 0x332f13fa, 0xbb3e2ace, 0xec634121, 0x9fdfe799, +- 0x671d0327, 0x985b3ead, 0xcf9bf00a, 0xcfc39eff, 0x3fa97d9c, 0xec361d34, +- 0x3df879f3, 0x9d8f598c, 0xa1a296bd, 0x85de26dc, 0x8a70c3df, 0xbe7d1973, +- 0x092f78fa, 0xf1b5597d, 0x90671e1e, 0x357724bd, 0x01c52f2e, 0x70ef8cbe, +- 0x5542f9e2, 0xd16b8742, 0xd57ef44d, 0xfbf97bc6, 0x0a353e98, 0x5cb889f3, +- 0xfbf3d6cd, 0xfdf98d4b, 0xd22ae74e, 0x5016367b, 0xd9442f51, 0xeebe743d, +- 0x3a26e619, 0x72b4c9dc, 0xceeebe7e, 0x5accfa42, 0x3fd1ea6d, 0xe7aa1d6c, +- 0xd5be86fb, 0x2bdc4cb8, 0xda245398, 0xc65fe3a9, 0x7b34ee71, 0xf05fa2b6, +- 0x482cc67f, 0xcf41b740, 0x75d21a7f, 0xadd0ef4f, 0x759cffdc, 0x496dc4de, +- 0xff278f0c, 0x575f3871, 0xed009c78, 0xf9746f46, 0x3c5d1bac, 0x89ad0714, +- 0xa8ba70f3, 0x48cdce1d, 0xd70ed897, 0xd7debc96, 0x113e8ddf, 0xf82ab8f8, +- 0xe42bfd1e, 0x9fc26fd7, 0x4f3d1f4e, 0xcee4c6ac, 0x40e67f22, 0x147c437f, +- 0xaf6e0236, 0x76fe67a3, 0xc88f7d87, 0x38a5e49a, 0xcb5e2593, 0x9ae67cc1, +- 0xe63d49bf, 0xe30f6777, 0x6766f37e, 0xaf17dd34, 0xbee95a71, 0x27738b5a, +- 0xaecd3f43, 0x94bc236c, 0xe618eb38, 0xb3a6d5d1, 0x06edfe26, 0xad715e63, +- 0xef5e6ef3, 0x9dacb3e2, 0x2e31eba6, 0xb4e7b5cf, 0x8103b418, 0xaf2edfd3, +- 0xbfe76e58, 0xbd5bd25b, 0xcf1a6e33, 0x295a762b, 0xb18a58af, 0x5794f756, +- 0xc7c117fc, 0x78beb82d, 0xa78f0f5c, 0xbbb2ebe9, 0x3e23fe79, 0xd59a78c7, +- 0xafdfa3ed, 0x97ffd7d1, 0x7a2e9ca1, 0x9abb9b7b, 0xac97dea1, 0xacf51b9a, +- 0x884fbe24, 0x4c272476, 0xffe3ea5f, 0xef85a869, 0x4a953597, 0x8ddb9db3, +- 0x39eebf59, 0x30f47c3f, 0x9dc92dd3, 0xcdb337ce, 0x97466f3c, 0xd58ab9ef, +- 0x5cc37e83, 0x7af28925, 0x2fea02e6, 0xffb585c6, 0x1efc5dce, 0x2125acaa, +- 0xee3fbd3f, 0x07df97b6, 0x2e983df0, 0xa9bde9e2, 0xf59fba16, 0x7079899e, +- 0xb79919eb, 0x4ec6f5e8, 0x1de3edc6, 0xa2d6ce33, 0x620c6638, 0xb0e43f74, +- 0x78e762b3, 0xccc3fe46, 0xae60d061, 0xde326caf, 0x9e5d98c7, 0xafb616ff, +- 0x8f407612, 0x49f55717, 0x91fe520d, 0x6c339be4, 0x3f8dc624, 0x6242559d, +- 0xdf4a91df, 0x4f6aecbd, 0xf6b0e371, 0xd3fb45f3, 0x1d71c469, 0x2b83ddf4, +- 0x3e8bb1ea, 0xf287d137, 0x8bf12221, 0x9dff0a74, 0xa07f5d35, 0xfe1167dd, +- 0x48fc3879, 0x13dd394c, 0xbd57edd0, 0xf578e7a5, 0xbd0986af, 0x38adcba9, +- 0x1f33b087, 0x4c91345d, 0x1ea7ee5e, 0x67d9f67d, 0xea7e5d5d, 0xf49f610e, +- 0x8333a27e, 0xf98d1954, 0x549a502a, 0xaca3f10f, 0x60052756, 0xdaffdb9d, +- 0x27f7fdf3, 0xf01e7975, 0x2fb61260, 0xb072fb71, 0xdf17cc8c, 0x072cba96, +- 0x34db72e5, 0x946aeedd, 0x9cedbe37, 0xbe7437fb, 0x1bcf0efa, 0x9d90196f, +- 0x4a517988, 0x59be45ab, 0xe415a65e, 0x3d137dd5, 0x3ff7156e, 0x631b1db7, +- 0x36f4f8c7, 0xcf0da0a5, 0xf129b777, 0x536db405, 0xde901e78, 0x5e78515e, +- 0x78f1a29e, 0xbcf0a2b7, 0xa77f3d39, 0x84dbc065, 0x03ddbd0f, 0x8d15af82, +- 0xd288e3df, 0x5d9da81a, 0xb2f7d2f6, 0xe28cf1ec, 0xff957652, 0xa67450ee, +- 0x907bd999, 0x2cc3b5d7, 0xe5b61f64, 0xa24db415, 0x146ec9f9, 0x05496d93, +- 0x1147a449, 0x8d7ef0ef, 0x316f13a3, 0x0a9fc788, 0xd4fdebbc, 0xde75f0b4, +- 0x417771bb, 0x23f45f49, 0x5f9087bd, 0xec8b29b7, 0x7246ef78, 0xbfb4de14, +- 0x432661e6, 0x7f57663e, 0x7f450a97, 0x24fec53f, 0xfd8a8147, 0xbfcf5859, +- 0xe8b6f8bb, 0xef3defe7, 0xfa360cc0, 0x226308de, 0xd494268f, 0x2761f9d3, +- 0x631cf0fd, 0xfef7f744, 0xbd677edb, 0xfe09de31, 0xbf516fe6, 0x7b9de654, +- 0xe13d127b, 0x68d6e6fe, 0xbf742fae, 0xfb795651, 0x0f7e66ad, 0x9abeff55, +- 0xb1ca47ee, 0xdd743c46, 0xb874e303, 0xc838f2aa, 0x7c518555, 0xafae5226, +- 0xb86e3a9e, 0xd8768147, 0x2c71fc23, 0x0cf4cfd1, 0x2e2973c2, 0xa3dcbadf, +- 0xebfd444e, 0x1f7f7728, 0xa8a4abbf, 0x30b7ca66, 0x5f12ff01, 0x9243de77, +- 0xc6cff47a, 0x3574e70d, 0x24685625, 0xb7284ae7, 0xe03f3927, 0x728b953a, +- 0x1ecba07d, 0x03aeb8ab, 0x1389dce7, 0xbf5ce4c3, 0xbff7a21f, 0x3564e4fe, +- 0x74df5d7c, 0x6e79c2ff, 0x8f64fde7, 0xff1edc5d, 0xd8c7df6f, 0x40aeb2ea, +- 0x326cdffb, 0xc391e5ea, 0x86d63eb9, 0x75e0f88b, 0xb3b7ee99, 0xe1b4bea1, +- 0xd98b3f80, 0xf97a8e5b, 0xdfdf3540, 0x1499b1ca, 0x7eb03987, 0x829e445a, +- 0x30f0d06f, 0xb3aa2c79, 0x85abbe92, 0x03ed077d, 0x491ae823, 0x3afe9d2f, +- 0xe7e728ec, 0x27bd3a72, 0x91212a26, 0x89fe4c07, 0x09997e2b, 0xdcab9af5, +- 0xb039f267, 0x81d91b7d, 0x115ddade, 0xaf6f4ffa, 0xce0aff60, 0x73e280af, +- 0xa0e75057, 0xfcf6a49f, 0x51976cfb, 0xec7e0498, 0xb1e72eb0, 0x2bf62aa9, +- 0xab793f09, 0x51af6fc8, 0xb09eed0b, 0x42d8a5f7, 0x3e30a4fb, 0xde25e9a9, +- 0xc7ae1fe4, 0xefb4439b, 0x4810efd7, 0x9e60d7e8, 0xee5f22a0, 0x7ed0478c, +- 0x9df0d4a2, 0xdefc7d45, 0x5f39edcf, 0x690b555f, 0x018f281f, 0x0bfc017f, +- 0x8192ec53, 0xbe2d3764, 0xfcc44e7f, 0x28dadf95, 0x2123f79f, 0x3e42ed9f, +- 0x0163d37b, 0x2d2e8c76, 0xf027616e, 0x49f008d2, 0x49f20c41, 0x70d98a4d, +- 0x9b97a3ae, 0xe26f3ac4, 0xbf0f54e7, 0xc1e73f35, 0x39f83de1, 0x9f84c7e8, +- 0xe2ffa3cf, 0xe89bd309, 0xf07a78bf, 0x62cdea73, 0x53ce27ff, 0xcddc5b4f, +- 0xd39780ed, 0x3be86213, 0xf87d193f, 0xe8d3df3d, 0x7f8015f7, 0x4cd9ccf7, +- 0x532cd624, 0x843a77e7, 0x0608c99f, 0xca276f3f, 0xaef31945, 0xd5bddfc2, +- 0xdf8988e5, 0x3a26f9a3, 0xe0dc06cf, 0x3de3b6bc, 0x87ba3cbc, 0x39d3da57, +- 0xfe4eb1de, 0xc7a61301, 0x401f08fb, 0x5a38b09d, 0x4460f8b7, 0x31c3103c, +- 0x19c5f99d, 0xbf6fdbdd, 0xf9f8a261, 0xe20b1f2e, 0x51dc02ef, 0xbddf8c64, +- 0x76d9f225, 0x7f24612d, 0x429a72bb, 0x6a245fe8, 0x65f1e28c, 0x39fb631e, +- 0xbddf91a5, 0xeef9c636, 0xe7225af4, 0xebb5df4b, 0x7fd7d627, 0xff8a2acf, +- 0x22fdc645, 0x3eb47de3, 0x3c8523b4, 0x1854afee, 0xf51cb8f3, 0xd8bbe833, +- 0x714af860, 0x3314ae7d, 0xa3ac38c3, 0x2dcf323c, 0x21ecf020, 0x59e3a665, +- 0x92899eff, 0x6bdfe66f, 0xf546dc0d, 0x7e1dbe7a, 0xaba27177, 0x3aca5d6b, +- 0x117c9f31, 0xbcf40dcf, 0xd7185dae, 0xbce8bcc4, 0xd084d036, 0xc605ce1f, +- 0xf460ae49, 0xb75857bd, 0xf0e25ce1, 0xfa262d9e, 0xa31f0f1d, 0x1e01a1ef, +- 0xcc16e78c, 0x5850f147, 0x039ce1bf, 0x238069d6, 0xe4df01f7, 0x93de1fff, +- 0xa277e3de, 0x278f52f5, 0x61338b75, 0x2fa48007, 0xbdf38b86, 0xfa286ca1, +- 0x06fe4a41, 0x1495c3a2, 0x72cb5f9e, 0xdbdf3e7a, 0xf7e1fd09, 0x72887e93, +- 0x01718092, 0x04def866, 0x0f74c8f3, 0xe7c454c0, 0xe5ebea6a, 0x48c79742, +- 0xccd16dbe, 0xa684798e, 0xea0f6882, 0x600d9b13, 0xf8852efc, 0xee24b74e, +- 0x283ffd3f, 0x00812bd4, 0x0000812b, 0x00088b1f, 0x00000000, 0x9095ff00, +- 0x50c34b31, 0x97bf8514, 0x4a36ac46, 0x1056dac1, 0xa8508a09, 0x755a5095, +- 0x97375433, 0x221d0e8c, 0x38ba383a, 0xfc5d251b, 0x09f9ce01, 0xe6e284fe, +- 0x482ae0e6, 0x22bf8290, 0x26a697de, 0xcbbd0820, 0x77dde779, 0xddf73dce, +- 0x2e8dcc2b, 0x5eca7550, 0x75619047, 0x444506d2, 0x9aea1152, 0x47e17536, +- 0x3cd6a5a4, 0x7c22c128, 0x4c12092e, 0xecbbaa75, 0xfbd45ab2, 0x5ffed246, +- 0x73e4ec6f, 0x7569fd73, 0x27e7cad2, 0x22ff8eba, 0xba77e898, 0x00839d12, +- 0xe4e3e1d6, 0x65f68fbd, 0xc8773d13, 0x5f94dcac, 0xd53da3e8, 0x3970079b, +- 0x3adf376b, 0xdbe20d46, 0x0aa8f38a, 0xa567047b, 0xfd398f74, 0xed34737e, +- 0xb0a56f2d, 0xef37e657, 0xbf89695e, 0xc21b71a5, 0xc1ec8481, 0xc81447a8, +- 0xbe0daad1, 0xb9417dcd, 0x3e99cb8b, 0xbf05c593, 0x67eb81f0, 0xf3ba7931, +- 0x8416bf0f, 0xcb62bcbf, 0x5f1dd7ff, 0x7f74f68d, 0x6b7d238c, 0xbb92f72c, +- 0x50a8dce1, 0xd9f695f8, 0xf4112ed5, 0x738dbcf3, 0xf3e569f1, 0x742b007e, +- 0x02505747, 0x00000250 ++ 0x00088b1f, 0x00000000, 0x7de5ff00, 0x45547c09, 0xbedd77b6, 0xee92774b, ++ 0x1090274e, 0x5849d0b6, 0x05b36035, 0x2aced050, 0x4056904a, 0x2c3b1151, ++ 0x19176421, 0xbaf2ce1f, 0xd14112c3, 0x8be33b89, 0x1330a363, 0x5180d419, ++ 0x206c06a3, 0x13383a20, 0x19705066, 0x9b6459a7, 0x36e09a40, 0x757c3833, ++ 0xdcedd54e, 0xb898e9db, 0xfbcdefbc, 0x4ac3f8be, 0xcb5baadd, 0xea73ff39, ++ 0x2b73a9d4, 0x6c409292, 0x04b90883, 0x3210d73f, 0x24842255, 0x7603a474, ++ 0x8fb28dae, 0xebbac424, 0xbda1a8de, 0xd737e909, 0x45a288e0, 0xc7133deb, ++ 0x7909971c, 0xea732046, 0x2a4909d3, 0xc652a9aa, 0x6da174d1, 0xa427688c, ++ 0xc33dd24f, 0xd212c79a, 0x99eb4dd7, 0xa25cfe08, 0xab657eff, 0x90692389, ++ 0x91ae0af3, 0x69aafd1d, 0x1fe942d2, 0xf9fd4d01, 0x4a9d15c4, 0x2fccf1c7, ++ 0xcdbafbaa, 0xfd003c84, 0xa752810e, 0x71d06481, 0x2cdebaf1, 0xbfda3ffa, ++ 0x56f8aad7, 0x0688840a, 0x09112c7b, 0x120f4989, 0x9fbc2f78, 0xc3953d27, ++ 0xacde1924, 0xe859728c, 0xeb94e87c, 0x21cbd423, 0xcd41d202, 0x26764ec7, ++ 0x57b8e979, 0xbce2237d, 0xa425f557, 0x2447be85, 0xf4d08d87, 0xc847125a, ++ 0x321e4278, 0xf903ee0f, 0x243f3b55, 0xec7eda76, 0x6af120b8, 0x21eb5fda, ++ 0xe4246ec4, 0xd3098f3e, 0x4f1b1e55, 0x187d8893, 0x763dab21, 0x8679574c, ++ 0x80ff7a63, 0x29325a47, 0x06bec5fd, 0x59111d1b, 0x66c9bf6b, 0x4f68ef4f, ++ 0xca6f9b8e, 0xc5321074, 0x484cec9b, 0x0c12f5a1, 0xa9495c84, 0x9455f344, ++ 0x1d884397, 0xbceca5c7, 0xa4f3c70e, 0x9dca32ad, 0x345cf1de, 0x3fcc3710, ++ 0x29df9c66, 0x38c63a52, 0xbd92596c, 0xf4fe39e3, 0xdecfe7c6, 0x717c029f, ++ 0x3cba034f, 0x2f011c49, 0x38adddd0, 0x2bfad136, 0x52d24765, 0xd0a8aeda, ++ 0x0e19d2f7, 0xe31db1a4, 0xa4f4059c, 0x593991fd, 0x840dfe3a, 0x7bc02471, ++ 0x37c019f6, 0x6df183b3, 0x022be025, 0x76f1e65f, 0x369cd956, 0x89072786, ++ 0xa6d12784, 0x5d3993c7, 0xc4fa478f, 0x9e72e276, 0x17aefda7, 0xa5c9df2a, ++ 0x312ef4f3, 0x67d13638, 0x011a84fd, 0x2bdb57da, 0x57ec0621, 0x922df7cd, ++ 0xdae181fc, 0x0f38bcf6, 0x6025bcfa, 0x2dbcfcea, 0xe802782b, 0xb6557de8, ++ 0x1053a26f, 0xaff8b2de, 0xbfdbf4a1, 0x6919f041, 0x0623bfde, 0xf6b67c71, ++ 0xd2919f46, 0xa368e779, 0xdd9fea13, 0xecf98998, 0x4ab7de57, 0x15ecbcb4, ++ 0x61bc8251, 0x806b69c7, 0xd8c2a7d2, 0xf455d0f2, 0x9115f079, 0x4ddd8b3c, ++ 0xe09efa43, 0xb35f2063, 0xcb14617c, 0x39d86d96, 0x6a2dda0f, 0xda289234, ++ 0x8bebd94e, 0xe68ab86f, 0x0993ef17, 0x54db2954, 0xf9a3f4a5, 0x1ea13e25, ++ 0x7c762bf2, 0x65b4fd8c, 0xebe02291, 0xc52dc019, 0x25b59b65, 0x5e7d3671, ++ 0x079adbec, 0x08b78bf5, 0x52214a0e, 0x13f3bb5c, 0x41b8bf68, 0xf6d22c1e, ++ 0x8862ea4b, 0xeca7435d, 0x00dd1657, 0x477b2de3, 0xa4f61426, 0x0adde2e8, ++ 0x35489df0, 0xd963c80a, 0xc01587a6, 0x3ecf19e9, 0x77a547ec, 0x1fb4f3d9, ++ 0x8bf95efa, 0x56a60382, 0x3b38606e, 0x9cd47af7, 0xaf30cce7, 0xbc28652a, ++ 0x0a7dfaff, 0x2bec5bd4, 0x0eca3578, 0xe4a0dbe3, 0x376b38c1, 0xb91a8528, ++ 0xbdfba929, 0xd6275c6e, 0xa771f5a7, 0x9a91c677, 0xab72e19e, 0x88a98be6, ++ 0x3e487ca1, 0xfe0d46e5, 0x1e9819e6, 0x8913a928, 0xbc0e023d, 0xf27933ef, ++ 0x36f8b76e, 0x6bf074a5, 0x6efe8da9, 0xbb57e0ef, 0x0a4ff38d, 0x0118dc66, ++ 0xfd710fdf, 0xc7f5c351, 0x683fa023, 0x1fd718fa, 0xb1fd704f, 0xe7c0e3de, ++ 0x6226794f, 0x6271eb5a, 0x54cf6bfa, 0x171e7d4c, 0x33d67bd6, 0x1e8dd307, ++ 0x8dff3e37, 0x3ad308a7, 0xdf3e254f, 0xe98e59ec, 0x9f178f16, 0x8359e8bf, ++ 0x06a7bd69, 0xf59e6dd3, 0x7c783698, 0x4f55ef58, 0x9e8da61d, 0x86fe7c7a, ++ 0x26d311a7, 0x1dd31f8f, 0xfa9a5fc0, 0xee982d3d, 0xb4c61cf2, 0xf7c013d9, ++ 0x614e7af6, 0xddd38eba, 0x4a64993a, 0x27566e94, 0x9f183d41, 0x6994ccef, ++ 0xf2c5de3e, 0x99bd7389, 0xba27cd0a, 0xb1d29e69, 0xd33fa95f, 0x2556eb08, ++ 0x39fe4f2b, 0x7cd132c9, 0xa79597b2, 0x456673ae, 0x0d6a7cd1, 0xeb5a1f2b, ++ 0xf9a68acd, 0x7e563ea1, 0x567f16d9, 0x565fcd0c, 0x3547cacf, 0xcd336c91, ++ 0xfcb3f28f, 0x6ccefd98, 0x698fcd0b, 0x4f8cf961, 0x9a56d9bc, 0xf7b008cf, ++ 0x67f56caf, 0x95fcd2c7, 0xf57e5641, 0xa3639245, 0x8089abf9, 0x66732cf9, ++ 0x67cd1c4e, 0x6f3e58d9, 0x8f648140, 0x721dbf80, 0x58a10160, 0xe55aaf88, ++ 0xbcd12694, 0xaa9bb812, 0xeab8323c, 0x65fbcc41, 0x33ca10b2, 0x79609eaa, ++ 0xf2832c85, 0x60cf55a9, 0xc76c977e, 0xeaaadbf2, 0xb35d129c, 0x2c762976, ++ 0x8adaad2f, 0x13b2cde5, 0xeab3ffcb, 0x566f2c0d, 0x535e589c, 0xf7cb1bb5, ++ 0x7f2c6eca, 0x963f6ab6, 0x58dc55ef, 0xf7aac8fe, 0x2f34399d, 0x6166dc1b, ++ 0x776be83c, 0xa963ea11, 0x71f4093e, 0x9fdfd735, 0xbaa675f3, 0xfd04e2af, ++ 0x8c9be3b6, 0x63a144e7, 0x4df1d95d, 0x5d606fe1, 0x0824eda1, 0xd08eb009, ++ 0xdbeec476, 0x135ffab9, 0xfd5ced75, 0x9db522af, 0x544f1c64, 0xf1d9dacf, ++ 0xe3f52baf, 0xdab157f9, 0xc76c30ce, 0x5d79b3d2, 0x7eb2697d, 0xd54a973c, ++ 0x4ed81c76, 0xe3c6cf5c, 0xdae82797, 0xd58bcbf1, 0x3b612676, 0x8f1b3d09, ++ 0x6ba49953, 0x512ca9c7, 0x76c2c9db, 0x1dacf6fa, 0x7e9572bf, 0xda894a3c, ++ 0x676c34ce, 0xe5e6cf60, 0x8fd14e34, 0xb6a658c7, 0x9ef90b33, 0x7676b3d2, ++ 0xd9f4f459, 0xe7d10965, 0x48676c0e, 0x6595e6cf, 0xcb27d3d5, 0x214fa21a, ++ 0xcf446bce, 0xd565d9da, 0x359767d3, 0x6c0a9f44, 0xe6cf6467, 0xa7ab1595, ++ 0x886c564f, 0x9db1cb3e, 0x4f1b3dd1, 0x3e9e8273, 0xfa2109cd, 0xe33b6154, ++ 0x9c9e367b, 0x727d3d44, 0xb9f44312, 0xa93ce91f, 0x2734ed67, 0x9cd3e9ea, ++ 0xa3cfa218, 0x3d299e38, 0x1f4e579b, 0xfa727d3d, 0x8b53e884, 0xebba64ed, ++ 0xb6843c70, 0x9dbae963, 0xf4f503bd, 0x44303bd9, 0x4ed84d9f, 0xad276d2e, ++ 0x92f276fb, 0x4bc9f4f5, 0x45e7d10e, 0x3d75cfa4, 0xb26f676b, 0x937b3e9e, ++ 0x0d79f443, 0x67bd33c7, 0xa41bcaf3, 0x20de4fa7, 0xa46b9f46, 0xd0ceb8d1, ++ 0xfb01d3b5, 0x64076bb3, 0x6071853a, 0x68bcb31f, 0x7bb01073, 0x219ed544, ++ 0xd6914e2d, 0x1b896f37, 0xdad13f73, 0xc36f5935, 0xcad42c78, 0xb135dad3, ++ 0x7675a313, 0x5e339c54, 0xb535ef97, 0x827eae9f, 0xde57552b, 0xba65ce67, ++ 0x31eebef2, 0xa2ff7cba, 0x07f5752b, 0xf2e96656, 0xaf5f9683, 0xbde29fab, ++ 0x5b4f9749, 0xfeae9b73, 0xbaf99a90, 0x8beb61f2, 0x7c23e575, 0xcbf9754b, ++ 0xabaa7eeb, 0x857eb23f, 0xc68afcae, 0xa3e575fb, 0xf2e88ffd, 0xa53df763, ++ 0xe5be3fab, 0x84f95d59, 0xe5759bc3, 0x74db0293, 0xbd4eabf9, 0x253faba1, ++ 0xbf974bb8, 0x7577ebe6, 0x9fc933f5, 0xe9b6f6f5, 0x5cfd5d63, 0xf95d31db, ++ 0x0b7f49b5, 0xfbf553b3, 0x849995a2, 0x2afbafed, 0x2dfaaf68, 0x7e95e60a, ++ 0xb14fb666, 0x538fda14, 0x16bb28fc, 0xfc537bd8, 0xb5086600, 0x15fb320b, ++ 0xe7d00b0d, 0x1ee95cf7, 0xefcfa366, 0xd857dc51, 0x1437d822, 0x8249026f, ++ 0x34806ed4, 0x993efcbc, 0xffab3de1, 0xe847a1c5, 0xe08615fb, 0x7f9a38d0, ++ 0x67eccc46, 0x196f0f18, 0x168eaed0, 0x8bd42549, 0x37dc1236, 0xf19297dd, ++ 0x0f23579c, 0x3b52066b, 0x7768e843, 0x424eec8d, 0x7c456a3b, 0xd535d815, ++ 0xfabce903, 0xe2187c51, 0xd3077a77, 0x261607f7, 0xa8d43ec1, 0xa8707db0, ++ 0x9ff6857f, 0x065ffd8e, 0x6c0c3bfd, 0xbfde185f, 0xaea27531, 0x9172537f, ++ 0x42937fae, 0x5251b7fb, 0xfbc7e8ae, 0x7dbee137, 0xf61fa1bc, 0xc22e4c6f, ++ 0xe853effe, 0x7fdb4bbe, 0x2bffa874, 0x0de0090d, 0xa9fe62e9, 0x9fe7ea57, ++ 0xbf9fac5c, 0xb39fe6c2, 0x1ff79522, 0x35cff38d, 0x27f9b2a4, 0x1bf9b317, ++ 0xfea1bb59, 0x5ffa21ad, 0x7577f30f, 0xc9b4ff35, 0x2a0ff9fa, 0xc8dfcfd5, ++ 0xe2b59ffa, 0x19bfde32, 0xb86d9ffb, 0x507fcd8c, 0x18aff629, 0x8fc00edd, ++ 0xd2ba3fd2, 0x0327fb47, 0x03ebe2a8, 0x40fda170, 0x0a9e3c3a, 0x8643d50d, ++ 0x3dc3a454, 0x5f6f0cd1, 0xa1bc5346, 0x73e2f33e, 0x939aa3e2, 0x39caabee, ++ 0x64b64bd6, 0xb0f7a02a, 0x4590913c, 0x1b0ba87c, 0x7937c445, 0x421be8cc, ++ 0x51ae7bc7, 0xe17e42f4, 0xa07c5363, 0xe48c2b5f, 0x27bc174e, 0xff3c3f11, ++ 0xcf91f1ec, 0x9e15e76a, 0x4f91aa2e, 0x7813f244, 0x4af0c8b3, 0x0097be3a, ++ 0x51fc9a04, 0x8d838fba, 0xdf7427f1, 0xe7fee843, 0xfbfacc98, 0x20f7ee94, ++ 0x3dfba01f, 0x2a9338dc, 0x3af14fe6, 0xc74c1fdf, 0x8fea22ef, 0x0b79e713, ++ 0x4f6d148a, 0x747bf262, 0x7e03e09d, 0x863cb9dc, 0x3c63bf12, 0xba5ede05, ++ 0xd591857c, 0xf8275e0f, 0x0db0159e, 0x46e7d037, 0xf1811ede, 0x1b1cfcd2, ++ 0x8ed0e77b, 0x2b057be9, 0xf4d60b21, 0x68e8bca7, 0xca712667, 0xb3fbe87d, ++ 0xe0c81597, 0x8411693a, 0xaa1fe081, 0x3f132058, 0x09bd9bee, 0x83839d24, ++ 0x1b36f78e, 0xa746ff6b, 0x3feb5c7c, 0x9c9b2399, 0x399e3a2e, 0x7f8e2205, ++ 0xf97d54e6, 0x9c623b47, 0x5d345186, 0x33f628f3, 0xbf2fa5db, 0x7f3e8e65, ++ 0xa79f5bab, 0xeb0caaeb, 0xe145edea, 0xe85929cf, 0xe886e73c, 0xc74a074a, ++ 0xc3a70779, 0x57b2951d, 0xedba57c7, 0x7072d456, 0xce09b884, 0x3b17df0b, ++ 0xb973bfd7, 0xd5e05f3e, 0x09ac17e7, 0xe6e39f6b, 0x51ffe704, 0x4f4d07c0, ++ 0x3d283e02, 0x747c738f, 0x3e3d55e8, 0x834d0e6e, 0xc79d43e1, 0xe0b18909, ++ 0xc7c32d44, 0xc8989aa2, 0xe1082878, 0x97c5a9c1, 0x1c79878a, 0x78e17f0f, ++ 0x8f5ebc58, 0x6f895bab, 0xff7d1275, 0x913b75f6, 0x05081f4f, 0x533f0f0c, ++ 0xe1d010f1, 0x10f1cdc1, 0x1c79bfce, 0x65eef30f, 0x67e70878, 0xb021e380, ++ 0x524c82fe, 0xf295f33b, 0x7ca79741, 0x0dbbe308, 0x1f9450fd, 0x3f30f111, ++ 0x713a6f34, 0xcbc05f9a, 0xe38bf13a, 0x8153cb01, 0x84e904ec, 0xae75a7ef, ++ 0x2e84f54f, 0x647d78bf, 0x6e3457fe, 0xf35c7758, 0xf9feacbc, 0x66bf5a75, ++ 0x5d56dd49, 0x75ef897e, 0xebc5fd5d, 0x8bf2ea77, 0xd5d1de6a, 0x80e6b05f, ++ 0xfde05f2e, 0xceff5750, 0xe57447e5, 0xd69e5477, 0x745edf95, 0xd5bf975e, ++ 0xfd5d77fd, 0x0f08e65b, 0x5db3f36a, 0xeb6a0f51, 0xa71a9ccf, 0xece8dfcb, ++ 0xd86fabab, 0xe0066231, 0x22fbff71, 0x0be3fb01, 0x7ff449c7, 0x1d90e17e, ++ 0xc7b8e750, 0xc270728e, 0x53d31c33, 0xc9ca071e, 0x4c44cf19, 0x36ee35cf, ++ 0xd742bac3, 0xd97042d1, 0xa91f170f, 0xd600335a, 0x6feb8275, 0xcabeb8ba, ++ 0xc163f34b, 0xcef4a638, 0xff10af5f, 0x58044258, 0x82b8f89c, 0xd03ca6a2, ++ 0xba7af94d, 0x5ceaf450, 0xfc881f9e, 0x8291e2bc, 0x7e08b641, 0x26b90eef, ++ 0x6a4ec1fd, 0x5e3fc2eb, 0xf697102a, 0x502b2139, 0xedcddc0f, 0xe9855284, ++ 0x7d6dd28b, 0xf21588b3, 0xdf95a1fe, 0x153d5fd6, 0x93803eb2, 0x2f3c9d34, ++ 0x4eb97f5e, 0x3ef013df, 0xc6de0027, 0xd4979eea, 0xaf7ba55d, 0xe388a775, ++ 0x425d072e, 0xe272edd7, 0xfac2299a, 0x3c9ddfec, 0xd38c2473, 0xbd044b39, ++ 0x768098d5, 0x6ea7ab64, 0x9d379c1d, 0x7a63d4f1, 0xe988d3ca, 0x1d7f8f09, ++ 0xf71d079c, 0xa8f4c3ec, 0x80d305a7, 0x9fa630e7, 0x7e98027a, 0xe98539e2, ++ 0xa6209e47, 0x635f3d87, 0x3c8781fa, 0xf41ced08, 0x93fd3098, 0x8b6986c7, ++ 0x73d30927, 0xa3f61f1e, 0xb8775dca, 0xedd7c53b, 0x08bf8033, 0x6567bb38, ++ 0xc99ad563, 0xa9fb381d, 0x4ce216f8, 0x7afe73a5, 0xa243c723, 0xb0550f0e, ++ 0x780f1bf7, 0xbd7ca6e9, 0xd5d871cc, 0x2bcb91fb, 0xc1effd9e, 0x2edc6bdb, ++ 0xeb78befc, 0x30ff53c0, 0x8775a53c, 0x3f11a7a7, 0x19af4f1c, 0xe41d6c6c, ++ 0x9f807a78, 0xfbf7865b, 0xfbcec8ae, 0xf39df642, 0x6a90033a, 0x21373f29, ++ 0xdbe62a64, 0x692bdf79, 0x03b416dd, 0xdd61c37d, 0x8ffe1f6a, 0xd0ee70a1, ++ 0x3f32987e, 0x85f9eba5, 0xba6ba4e3, 0x543f713b, 0xef4ca3e8, 0x2a3cb9d5, ++ 0xca35d19a, 0x3192a640, 0xf21dac84, 0x74fcc71b, 0x1e244bcc, 0x6e39f7de, ++ 0x976844b4, 0xdf40d6da, 0xd2bae8ee, 0x6828e5f2, 0xff53c4ef, 0x35f480cc, ++ 0xef475f6e, 0x27ced116, 0x401ce7fe, 0x64bad0df, 0x7f812474, 0xb144383e, ++ 0xa6409da1, 0xbde7e9e9, 0xb5bf475e, 0x69f9ea29, 0x6fd2124d, 0xfb4397f0, ++ 0xdd7e80f6, 0xe8eef7e9, 0xfde61f39, 0xeecf40df, 0x7a7763f4, 0x2fed3891, ++ 0xb7f9d236, 0xe63918ed, 0xc1e83b7e, 0xeaafb654, 0x79eade82, 0x6478f85c, ++ 0x7af7c249, 0x44b6e38a, 0xc92dc715, 0x285d6e70, 0xf6fdb0da, 0xc0b16186, ++ 0xdd3b5097, 0xeb7853f0, 0xdfb0c92f, 0x6fa29b3f, 0xbe832bef, 0xcf7df6bd, ++ 0xb5df6159, 0xdac16934, 0xa0f811e3, 0x55f565a6, 0x3b5acd6b, 0x6f9f51b4, ++ 0xd6a611af, 0xb1ecb8e3, 0x3ac246b3, 0xe996b951, 0xaa98e5ed, 0x2a4d2ced, ++ 0xd4ce7ec4, 0xfdb2c5a5, 0x83e98f9e, 0x2fa8712d, 0xb08a78ce, 0x9e3d8ffe, ++ 0xc751daae, 0x39034843, 0x4c7d0266, 0xaebad2cb, 0xa59e25df, 0x97f015cf, ++ 0x4bf92692, 0xf44d13b0, 0x77d825df, 0x6af30910, 0xa2f515bb, 0x3c0578d7, ++ 0x8feba2df, 0xcf5767be, 0x7ea52f88, 0xe448dc9b, 0xba5b8a84, 0xe3cb5c5e, ++ 0x96ea4a43, 0x65dad5ac, 0xe977f565, 0xf78d15f2, 0x71dad5ae, 0xd50bf025, ++ 0x9052a4bf, 0x1ca53700, 0x79926d46, 0x97c7408d, 0x8007410a, 0x2bd5815b, ++ 0x37140533, 0x81b6747d, 0xf1abadf1, 0x5298f19d, 0xc8a39e20, 0xc8e78354, ++ 0x7223f545, 0xdb399d60, 0xd61132b0, 0xfdb112df, 0xf784571e, 0xaf81248b, ++ 0x6f50722f, 0x107c73e7, 0xde66aeda, 0xa21cc7f4, 0x1ab7cd17, 0xbc265f98, ++ 0xbb797bdd, 0x7ca7d1dd, 0xabbc81cb, 0x54e99dec, 0x715e78de, 0xffa45ea3, ++ 0x49d07465, 0xe4aa5fa5, 0xeda257ba, 0x411dd717, 0xd929c5ff, 0xdf67f43b, ++ 0xcf3b2fa2, 0x22749ccf, 0x2f2f3346, 0xe67e8169, 0x111de44f, 0x531f2dfb, ++ 0xf7fa7e3d, 0x443d0132, 0x9a5ad22e, 0xd6e6c071, 0xefb1d190, 0x9250df99, ++ 0xfd3ef40f, 0xf7dc34ea, 0x2b2e242d, 0x64d481f2, 0x2ce73ec0, 0xcd7c6031, ++ 0xeb27f259, 0x9e1f0d58, 0x33a41496, 0xd51d07dd, 0x83ee8f8e, 0x0fba7974, ++ 0xc90be5d2, 0x0710894d, 0x4c98f851, 0x4fce027c, 0x64a0fe57, 0x931776c3, ++ 0x6bb06aca, 0x7ce1ff54, 0x53fa911b, 0xdaf65ebd, 0x740519d3, 0x66251b1c, ++ 0xfae7ab0f, 0xef8ea84b, 0xeb8bcb4b, 0x5a4e2837, 0xec61ac7e, 0xd34354cd, ++ 0x10d57df7, 0x457de0df, 0x709738c0, 0xf1d77efa, 0xb5578f87, 0x17c53a97, ++ 0xd59471f0, 0x045f4e09, 0x78936d9c, 0x0f5f0d3c, 0x35bcc176, 0x843fa47e, ++ 0xcb0a3fe5, 0x7fcb089f, 0x4dee796f, 0x2a9cf274, 0xf800ffb9, 0x7d85f904, ++ 0x110520b2, 0xfdbbdfcf, 0x7fed4ea4, 0x3fb6a3f4, 0xb4672f40, 0x6a3f13fd, ++ 0x8d3b83fb, 0xfb523dbf, 0xf0bdaf65, 0x1597c42a, 0x95b8f4bf, 0xb4e33b50, ++ 0xa0e89354, 0xb4dd2ffc, 0x38380ada, 0x80ad7925, 0x713ed3e7, 0x3e822faa, ++ 0x78ab211b, 0xf0059a70, 0xb4afc273, 0x1f9b33fd, 0x2df601b8, 0x6d926e5f, ++ 0x33acbfe8, 0x4e548dfa, 0xe4961bcb, 0x3f985193, 0x9df7f2c2, 0xa8df2117, ++ 0x6ff167c7, 0x78844f1f, 0xfe948a1c, 0xfbd3f406, 0xbe503f71, 0x583cb3f1, ++ 0x10482bdf, 0x3dfc2ce5, 0x78ebffe8, 0x940a7f5c, 0xe8e5ced8, 0xf7844910, ++ 0xc3454fd9, 0x2b45e703, 0x049dd7a4, 0x7277427d, 0x7f0987e8, 0xf9db88af, ++ 0x6f4b64fd, 0xc81363d4, 0x2a63d004, 0xd98f885d, 0x7f9f2bf9, 0x3a11d472, ++ 0xbf8dd6ae, 0x7a1a0ab7, 0x5ed6f2a9, 0x3799e0bf, 0xcdeb5dec, 0xb51e5473, ++ 0x2ebaa4f6, 0xfef91bd8, 0xa5a589a4, 0xf10adfb2, 0x641ba553, 0x2e3e9787, ++ 0xdfb9e17d, 0xe3fe053c, 0x218e8d0f, 0x1792fdb4, 0x25707cf6, 0x956c97cd, ++ 0x69b3e77b, 0x0ec48598, 0x7fd054fe, 0xf074c7cb, 0x3de5f8a3, 0xc25dc40a, ++ 0x77c79ff3, 0xeb64a5f0, 0xec8c854e, 0xfaec8f4c, 0x1cc04a9d, 0x47f53f81, ++ 0x5adec0f2, 0x0a57fcf9, 0xef4ed4b8, 0x949f4810, 0xb0dcf408, 0xa031ed07, ++ 0xf393f213, 0xb0bfc42b, 0x2f9415fa, 0xf9c3d7a0, 0x9fef5e15, 0xbb40bf5c, ++ 0xf142d710, 0x101be2fd, 0xd191f677, 0x7a287401, 0xcc2b6ef1, 0xc954a4e7, ++ 0xeaf4fe70, 0xbfed2744, 0xda26f648, 0x8bcf6530, 0xc413fd7e, 0x3f03e2df, ++ 0x41fe6449, 0xae035f67, 0x30bede55, 0xb3b545cf, 0xc4859e71, 0x7a2c388d, ++ 0xbe81745a, 0x532242fc, 0x939046b7, 0x4e4e5c0d, 0x4b994b3e, 0xf61279e7, ++ 0xffdfa0e3, 0xe136fa24, 0xf42ee5be, 0xcf84fe3f, 0x986c5a85, 0xf8c4c2ff, ++ 0x5b321ff5, 0xef580837, 0xbc6efc5a, 0x74f805af, 0x0fb3a066, 0x1055739c, ++ 0x21e9cbc9, 0x8aeda25c, 0x30fb7207, 0x94bb113e, 0x76a3dfc1, 0x873c3657, ++ 0x33b22dfa, 0x3dee946a, 0xa3a52972, 0x7fbc65ff, 0xb068ee3a, 0x46264e97, ++ 0x10ffffb6, 0x5d7403d2, 0x234ce0d7, 0x37fe4cef, 0xaef265ae, 0xc6efbfca, ++ 0xf9fe50a9, 0xf0472641, 0x7497ac1e, 0x583efe5c, 0x809673be, 0xfc48c1fa, ++ 0xa37ce491, 0x5f5ce5cc, 0x3a178e1e, 0xd588497e, 0x89fa06e0, 0x3da03e47, ++ 0x7d18f855, 0x2b47a35f, 0xe76b5fa0, 0x5e395576, 0x2d41f5cc, 0x3bcb83e8, ++ 0x65a901f4, 0xbb6ba07a, 0x61fccbd6, 0x4f37efb2, 0x7952fc81, 0x7e41daf5, ++ 0xffcc1765, 0x7f765b6f, 0xdb951b70, 0x72abd5bf, 0xe1abd7ab, 0xedb45b72, ++ 0x1b5f1827, 0x1b7fb72e, 0xca224950, 0x511e7d2d, 0xfe04076e, 0x4aaaf447, ++ 0x74613dc7, 0x5764f554, 0x93d70cf4, 0x748ed96e, 0xf493d70d, 0xe8c920e7, ++ 0x8715478c, 0x7f8afe2a, 0xf4083657, 0x2aa70851, 0x5538430e, 0x6f3e1871, ++ 0xcbc31d3d, 0x1e5f041f, 0x2ebe579c, 0x694679e3, 0xa5bb8b13, 0x3fededef, ++ 0xc4e5e90e, 0xecd48e65, 0x9b5bdfed, 0xebe585f7, 0xc33beac3, 0xfab0aef2, ++ 0xa57cb0ee, 0xe3697eae, 0x0e20856e, 0xe27abafc, 0xc722fff2, 0xadc246c6, ++ 0x1a93ed8f, 0x57102bce, 0xe20e615e, 0xe20af2fb, 0xe0c47885, 0x69cf1176, ++ 0xab8d28da, 0x25b09fc1, 0x7aa5e7c5, 0xdb147564, 0x941307c7, 0x6d7bd06a, ++ 0x1e35a0b6, 0x3ecc51f2, 0xad05736e, 0xf33b1a71, 0x7a889348, 0x1c8be03b, ++ 0x16574f1f, 0x8ba073e4, 0xfcf579f8, 0x3ada2da9, 0x15cbfa0a, 0xc1cbc9cd, ++ 0x3a2353bf, 0x616948e0, 0x38562dd5, 0x4a6b6a07, 0x3e87319b, 0xc88ef45f, ++ 0x4ebc5cc2, 0x7f66afa9, 0x9f788a71, 0xbc402c98, 0xc9c43aed, 0xdfb62682, ++ 0x322eb858, 0x7bf98bee, 0x0a65e685, 0x4fba57e8, 0x473daa38, 0xaa29db51, ++ 0x34de7b0d, 0x0d47cb8d, 0x378babee, 0x7cddcbea, 0xe1423a5f, 0x3268c776, ++ 0x990bef9a, 0xe7eb845f, 0xc67d315c, 0xb687ca1c, 0xd231227d, 0x88937b7c, ++ 0x22df687c, 0x45afc0f8, 0x4fdc09bc, 0xf1b45419, 0x4720ade5, 0x57d6bac3, ++ 0x25fcafad, 0x978067e3, 0xf51e3f57, 0x7d6d345f, 0x6fa1c3f5, 0x43b5fe42, ++ 0xce931fc9, 0x4477b3f5, 0xdb7c39e1, 0xbce20b0e, 0xc97bfb6d, 0xebfc833f, ++ 0xb38c0746, 0xa357c76d, 0x2b6d3700, 0xefa0458c, 0xbf3206da, 0x5fedcae8, ++ 0x3ae00a8d, 0x37f90abb, 0xff98514b, 0x9f9fe9a6, 0xa521bd0a, 0x823b02b3, ++ 0xbc57abc7, 0xd823e511, 0xda1957fe, 0xe87e2def, 0xdc79ca7c, 0xcc859b45, ++ 0x8be306d9, 0x15057163, 0xae7a4e6f, 0xd65ff68a, 0x405953b0, 0xfadfb3cb, ++ 0xa7c61466, 0xd1f6636f, 0x6bf03939, 0x53b82b88, 0xa652b819, 0xc2073afc, ++ 0x23da8fd4, 0x906cbcca, 0xf974ce97, 0x3d54fd06, 0xff3dc7a5, 0x3821e86b, ++ 0xf8b39e99, 0xfbcc024c, 0x8c7e9fef, 0xe22345fe, 0xdfef9d52, 0x6ed0abea, ++ 0x8fde6ee9, 0xfebf6c2b, 0x05bcceff, 0xdde64f7f, 0xef3e6ff0, 0xe23b152b, ++ 0x3a0e5c31, 0x3dfb7ce3, 0xe2c17f98, 0x10f6f1c0, 0xcdff07ef, 0xf99dffe7, ++ 0xddf28dbe, 0x2fbcfdda, 0xbbcf9bfc, 0x33bfbe6b, 0x06ddf38f, 0x6f1594e7, ++ 0xfbe3837d, 0x97ae7aae, 0xfce77ff1, 0x68debb55, 0xd264b570, 0x3521cdf1, ++ 0x6e2c3016, 0x0fdf684d, 0x81c68ca1, 0xf186f79f, 0x96e761ca, 0x64639a6a, ++ 0x305927fb, 0xcc90bee0, 0x90bef816, 0xe06ea7ed, 0x030dc5f6, 0xbd7ed10a, ++ 0x7cecc9c1, 0x995cb922, 0x6f6e20e3, 0xa6fd03a1, 0x3761cc64, 0xe14f67e4, ++ 0xf2befd79, 0x0a71020f, 0x21bf8ed4, 0xb03eea79, 0x900c6767, 0x1e9646fc, ++ 0x2b7df481, 0xbf513e7f, 0xadd5b9ef, 0x4732dfcf, 0xdbcd9f9f, 0x2b8c19bb, ++ 0x2ecdffda, 0x527e07c1, 0x0963e079, 0x179537e0, 0x201044c9, 0x3572a77e, ++ 0xbb662fec, 0x0f83eff4, 0x1c57eb52, 0xc0127660, 0xd1edcc85, 0xe583b31c, ++ 0x3b08b807, 0x7d61f217, 0x7893b7a9, 0x89e23bd3, 0x4a0a9897, 0x34c39ce0, ++ 0xce3a405c, 0x1ea22758, 0x380ba532, 0x1944d72e, 0x333f47e3, 0x3f8032b8, ++ 0x942763f9, 0xc30d94ff, 0xc25a7401, 0x2a485ce9, 0x17224ed1, 0x9c9a5d2f, ++ 0x82657e01, 0x2712d676, 0xbee9d321, 0xe0b270a0, 0x2378868f, 0xc7637889, ++ 0x2055bf80, 0x56fe7547, 0xae7e1e7d, 0xa768ec4e, 0xe15dfabb, 0xff4ec7f8, ++ 0x28e6e54a, 0x811c9add, 0x2f760874, 0x7771f769, 0x563a3136, 0x54be0a94, ++ 0xd65fa3c4, 0x96f8f77e, 0xfc3b9d91, 0x5163e7f5, 0x397f331e, 0x2fed9632, ++ 0x64f7e1c7, 0x6d3edc15, 0xc163daf7, 0x94ded2af, 0xb2e3cfc6, 0x7208eead, ++ 0xebef8070, 0x65710cfe, 0x11cb6d34, 0x37d8446a, 0x13fa2090, 0x645139bd, ++ 0xc7b88453, 0x8e068c67, 0x67dc4a9f, 0xdf088fc2, 0x2c79f21f, 0xc6c6afa6, ++ 0x6eb6f86b, 0x546969fa, 0xcfc03e67, 0xcbf9cd51, 0xec2fa50f, 0x07ae8123, ++ 0xae7902a2, 0xcaddf308, 0xd77f3ee5, 0xc3fbf1df, 0x64529a9b, 0x394dcba0, ++ 0xf69ceea2, 0xffb72379, 0x30b192c7, 0xd75dfcae, 0x5f012759, 0xf80e89f6, ++ 0xe9a2b0de, 0x708ee2bc, 0x4f4e17fe, 0x19cf1f68, 0xd0214764, 0x5183d8f3, ++ 0xef69f604, 0x74a573f1, 0x474fc788, 0xfc1381d7, 0x99186f58, 0x64d629df, ++ 0xccce71c3, 0x681394cf, 0xb60de9bf, 0xd46a10d1, 0x358fd78f, 0x3fbcb1d9, ++ 0xd7ad4f7f, 0x3bd594af, 0x23cad8a2, 0x28daffcd, 0xc4c59f86, 0xe144cf71, ++ 0x996f8fdf, 0xb3f8b4bf, 0x51ca1d60, 0xb8e1edf7, 0xed1f2826, 0xac1f0553, ++ 0xc2efb013, 0xeb80be7c, 0x56067bd4, 0xe989bdee, 0xe1f71573, 0xd4693e74, ++ 0x346be77f, 0x72b7ba31, 0xace952f9, 0xbc7c37d2, 0xafaa7d6a, 0x3bfad1ae, ++ 0x7e8e3466, 0xf2d1d611, 0xa066c126, 0x014b954d, 0xa2b0e405, 0xfc1961f1, ++ 0x59dab7fd, 0x191d74bb, 0x8e3f3da5, 0xfcf3b135, 0x9aae63dd, 0xb0b93807, ++ 0xf433da8e, 0xf3c2e77d, 0xefc3d056, 0x847f1c19, 0x1fef2438, 0x5be9b244, ++ 0x1ec7d5f4, 0xac8e715b, 0xc705376d, 0x5334b339, 0xedccf706, 0x3ee53ba5, ++ 0x9ac53c1a, 0x7d5cb1e2, 0x8ed4afde, 0xfed3f7df, 0x87de1c70, 0x07be048c, ++ 0xc16faf48, 0xaf6f24ef, 0x2c38638c, 0x60a9dfaa, 0xabeb053e, 0x84fda9fd, ++ 0x7cacd3cb, 0x82e9bc7d, 0xa000c0ec, 0xbfd1be4b, 0xa70111cc, 0xff214cdb, ++ 0x275b77e6, 0xa3b7149c, 0x275a3ffe, 0x44eba996, 0xd59be300, 0xea6a7ff7, ++ 0x89f44eb4, 0xad2c4eb4, 0x3e01f7b2, 0xd69edd2c, 0xe9648407, 0x9189b93b, ++ 0x3df789d6, 0xc43866cc, 0x9b6e47bf, 0x2b89d745, 0xacc4eb34, 0xf849c428, ++ 0x39550b7b, 0x509d6ee9, 0x597ff6f9, 0xeb0fbcdf, 0xfef90444, 0x9d7e930f, ++ 0x00a9b9b8, 0x679b89d7, 0x6aefba89, 0x8fdc4dca, 0x913ae5da, 0xe62b7899, ++ 0x044c4765, 0xedcfbcfc, 0xae3c43e8, 0xf581fa1b, 0xffd005e2, 0x8dd79d09, ++ 0xccfaf4ae, 0xfff5ea9e, 0x7aab3a21, 0xb3b5297d, 0x7091298d, 0x4bcf1048, ++ 0x5d7aa56f, 0xbd323c00, 0xee0ef4be, 0xb3d30b4f, 0xe3b3d02e, 0xbd967ab4, ++ 0xeb66ee5f, 0xca634542, 0xf9697393, 0x03b2356d, 0x3adbca96, 0x56866ef4, ++ 0x7a00beef, 0xde822137, 0xf77a622d, 0xb458d342, 0xdf9aba9f, 0xa5beb85f, ++ 0x23b06cfa, 0xcce63e02, 0x777dd18d, 0xdbf46c75, 0xbc832fe9, 0xb9e227bc, ++ 0x0edc67e1, 0xedfa3fd8, 0xc74f6071, 0xe075b144, 0x39dfc710, 0xa1ce290f, ++ 0xc85ecbf4, 0x2db2e9ec, 0xbcafd222, 0x797fc981, 0xd3b3e09d, 0xbf98de7c, ++ 0xc95ff9e3, 0x47fe7676, 0xa99f9067, 0x7bc97fe1, 0x3bf06a81, 0xf0106c97, ++ 0xd6e212fc, 0x398b9e81, 0x251d0b3d, 0x8f09cfb8, 0x6d1b5863, 0x815c967d, ++ 0xb5dfa1ed, 0x37cfd78c, 0x9d8fd106, 0xb1c15bff, 0x778e7481, 0xfd7c1b28, ++ 0x949fd869, 0x773d85d4, 0x0a73c5ac, 0xec18c2f8, 0x7d7ab2da, 0x6f5cd7f9, ++ 0xe9fd122d, 0xecbec32f, 0xd223a28f, 0x0bd6a77a, 0x07e8a7d1, 0xa500e7d2, ++ 0x8f1fb8cf, 0x769a4b3e, 0xbbfa5fa2, 0x1e9c25d2, 0x3b7130ff, 0x07190c74, ++ 0xc199f8f2, 0xfbc5fa89, 0x2a7188ae, 0xa21e1f0b, 0x14c2cfbb, 0x9ef370c5, ++ 0x17dd5dc1, 0x78b395ea, 0x5bb5c596, 0xfcd224f7, 0x1a327adc, 0xd78bd9dc, ++ 0xd0e3d7eb, 0xc760dffa, 0xe56e7df5, 0x22e20156, 0xbdeff117, 0xe30f7c8a, ++ 0x2c771ffd, 0xad3deba7, 0xd18c60bf, 0x07afe70d, 0x3fa882a2, 0xe04efc55, ++ 0xf5cf1df8, 0xc17eb1d1, 0x1aa75c1c, 0xa5ca1b05, 0x5bad8a3f, 0x2f704f94, ++ 0x5f49eec9, 0x30be71e5, 0xe323463f, 0x1be50563, 0x135e75c8, 0x7b33d7cf, ++ 0xf3a6f6f0, 0x69acdcec, 0x37eecca7, 0xd42f4811, 0x77dc0e77, 0x9c23ebab, ++ 0x6a2665e3, 0x08fdbbf8, 0xc126ffc3, 0xf47c0f81, 0xdfc21fbf, 0xdaaaf82e, ++ 0xafe53d33, 0x5109a74a, 0x881f3e7a, 0x8b1fc96a, 0x03823ce7, 0x8a697bef, ++ 0xe38973c3, 0x92feec35, 0x70e7ce5c, 0x87fd80b9, 0x1b953ef6, 0xd710e061, ++ 0xe30a353a, 0x54dfb102, 0xf5699f66, 0x39fbe854, 0x38d77e9e, 0x82d20a98, ++ 0xfc475976, 0x11b77b9a, 0x82a9b7ec, 0x0b2b8fa4, 0x08ffdca2, 0xe9a7ffed, ++ 0x4927da5b, 0xee5f5c26, 0xbba7b1b6, 0xee042a07, 0x46b0ba31, 0x62dd1c46, ++ 0x19307fb0, 0x32fdcbf4, 0xb0b8f901, 0xb9a1fc7f, 0x445ca1bd, 0x37bc147c, ++ 0x2b5c1cb6, 0x89f62c05, 0xd6cbdc14, 0xffbc63a5, 0xed7ae88f, 0x04bbc61c, ++ 0xe713d83b, 0x6703ef83, 0xdae67639, 0xee32dfc1, 0x57386ac0, 0xfb6d999b, ++ 0xe3e003e0, 0xcf6f765a, 0xb8d935d1, 0x2efbbb4f, 0x30ece501, 0x33b417e5, ++ 0x07ca567b, 0xddf1d01f, 0xcf0126b1, 0x133ae6c7, 0xb2f3866e, 0x8745fbb9, ++ 0x305bd69d, 0xf38662c3, 0x45c369b5, 0xe5d0d6e2, 0xfe82d20e, 0x7795b99d, ++ 0x293906cd, 0xdc21eba2, 0x74d453c7, 0xe40fb720, 0xbf7c056b, 0xe056ebc2, ++ 0xf596bd3b, 0xb47195e7, 0x0f5a42ff, 0xcb515dc8, 0x146c55ea, 0xc2afdef0, ++ 0x4f5187a6, 0xf0146e16, 0x6a169342, 0xbb589aff, 0xb44ad83e, 0x69f7d2d4, ++ 0x0fbc317e, 0xbb8c6eed, 0x2ac1ce19, 0xfdf138e8, 0xee785589, 0xa3df4859, ++ 0xe365a4c5, 0x92ded85d, 0x77c0815a, 0x53134561, 0xed089a1e, 0x501d97ed, ++ 0xafe7687e, 0x3cf71814, 0xda5f5fda, 0x903102fe, 0x9fb8fe8b, 0x37bc3609, ++ 0xe50c31c7, 0x1dcb8dba, 0x93087cf9, 0xdfa88173, 0xf8da4967, 0xb146bf87, ++ 0xe5c2f5f8, 0xaf30d555, 0xc5213780, 0xaf3a7880, 0x9c7e3ac0, 0xed4ddbd2, ++ 0x8b0a63d7, 0x3dedd8ab, 0xfa3404a6, 0x1a5462f3, 0x31b0bfbe, 0x22ccf513, ++ 0x79f3c2e2, 0x47b31577, 0xf28eac8e, 0xc9876009, 0xbe7864b6, 0x9f11b57b, ++ 0xad817b9f, 0x0606e73b, 0xb27a8fd0, 0xddf02656, 0xb4dacada, 0x278f8027, ++ 0xf00ec8b7, 0xb34f8b4f, 0x2fc5e973, 0xeed93f30, 0xc9eed65a, 0xb2dfa63a, ++ 0x079d9e9f, 0xd5317b7a, 0x9f9c4653, 0xda158f5e, 0x3d4f518b, 0x52f4c51d, ++ 0xd70abeb8, 0x1b354553, 0xcb43af22, 0x43af22f2, 0x9f99aa03, 0xb9f58bb3, ++ 0x3d559882, 0x56e20635, 0xce06ca0a, 0xbe780f5b, 0xb78c0583, 0xe2ff5ff8, ++ 0x4b775871, 0x54cf782d, 0x427b64b9, 0xa020f860, 0x6d36e7ff, 0xa1e402fd, ++ 0xde146e68, 0xf8027523, 0xaeb47201, 0x16979e17, 0xee900afa, 0xe2e75c6a, ++ 0xabbc7af5, 0xdd5bc87e, 0xd76a7122, 0xe218a2af, 0xf43bd4d4, 0xda5b8a0b, ++ 0x828d9dcf, 0xa1e5540f, 0xfbd91c5f, 0xb7987193, 0x7396b8e1, 0x059d60fb, ++ 0xdee87d71, 0xb701abf3, 0x102e7ef3, 0xd789dbb0, 0x61eb0d5d, 0x0ec17af9, ++ 0x3fc5dd7e, 0xa62fef67, 0x0fb8c3ef, 0x8be18afd, 0x720edce2, 0xf0fb5e50, ++ 0x51bfac5e, 0x87fb43b0, 0x3da01436, 0x0915e451, 0x823c6f96, 0x5eba08fb, ++ 0x6ed37c61, 0x720898af, 0x68cabe50, 0x8aac5703, 0x479f1527, 0x312b3c78, ++ 0xa4cd4639, 0x830f3def, 0x714b808a, 0x4f5a108e, 0x5e153f01, 0x2f23b786, ++ 0x91100ec8, 0xbec9f1ee, 0x27f15683, 0x75c6fe02, 0x6d776fe0, 0x3c7802b6, ++ 0x3cf013e9, 0x0bf01b3f, 0xf55e7cf8, 0xd6b310cf, 0x9f0eea8e, 0x84ec38e1, ++ 0x28d9b83f, 0x2a9f03ad, 0x7871c31e, 0xc3372254, 0x1d5eefb8, 0xaec8f385, ++ 0xe5e6fd7e, 0x1cf0ce4c, 0xdefabb28, 0x42eb9044, 0xa895c589, 0x58932d74, ++ 0x71a7521c, 0xf4a5563d, 0xc2f8c9ed, 0x8a3fb1c6, 0x1e40ffef, 0xe3271644, ++ 0xbdbcfda7, 0xd78c39e5, 0xc8f9bb3b, 0xbcdf680d, 0xf4007149, 0x7e2162df, ++ 0x50f887dc, 0x8837151f, 0x94678c4e, 0x353319fc, 0xee3577fb, 0x0b25e4a2, ++ 0x9b78bbd2, 0xdf4f97d1, 0xd8f57e2f, 0x5eff3c28, 0xef6fecc1, 0x63ed0166, ++ 0x828c0de2, 0x258a46ef, 0x6e11ff16, 0xcd1b5c17, 0xc7af5bfd, 0x4dbb01cc, ++ 0xc3f763a8, 0x22dfd715, 0xddfe351b, 0xb565a3ab, 0x78c79e1e, 0xfbe19f29, ++ 0xf69f1878, 0xee35327e, 0x8679f5a3, 0x1946e2bf, 0xbae2b9ed, 0xfe20e7ad, ++ 0x11b0f8af, 0x7515bbf7, 0x39be31e7, 0xd817a5fb, 0xa28d763d, 0x53abee2e, ++ 0x889d55bc, 0x0de523e7, 0x41ff1865, 0x524e78f3, 0x9be3cf5e, 0x503c63be, ++ 0x5fdb4bc9, 0x961252f5, 0x2b5bfcbc, 0xb2d737de, 0xbbdf8ac9, 0xfc7b7dd4, ++ 0xaaf8a763, 0xbe3cb5fa, 0x8249fa6a, 0x7c7231fa, 0x85f819d5, 0xe8aee902, ++ 0x3ab538b0, 0x38e8dfa6, 0x63dd2233, 0x5ebbb218, 0x10d7e2f8, 0xedbadc1f, ++ 0x7186bf6f, 0xc2ebfe97, 0x839e21af, 0x81b288ec, 0xf9b1529d, 0x54a78c7d, ++ 0x9a207bdf, 0xff9e83ef, 0x9ea3c62d, 0x80e8d0fb, 0x3f6dced6, 0xc7f60c99, ++ 0x4f7fadb9, 0x65d33884, 0xbfd173db, 0x6c95ecb3, 0xabb2b7bc, 0xd7e02cfd, ++ 0xd87883d7, 0x6eedbe70, 0x27718dd8, 0x41df2967, 0xe6e2844f, 0x3c58cbea, ++ 0xcbc79da2, 0x7f1c896d, 0xae3e29dc, 0x298ce661, 0x981b1fa0, 0x9c6dd09d, ++ 0xcfca41dc, 0xc7c07a2b, 0xb21e3c2d, 0xc6b7fa7e, 0x5f859dc9, 0x8736bf28, ++ 0x868bf1f1, 0x053ccf45, 0xbabd0d65, 0xf7f3938c, 0x7c6a7e80, 0xced13df3, ++ 0xde41a257, 0xe30efdb6, 0xf97f8113, 0x5fd7d076, 0xf8bf8324, 0xbf441c94, ++ 0x11bb7044, 0xde2bb7bf, 0xe9e5087e, 0x30072bdc, 0x38f0987e, 0xf42473e3, ++ 0xb941e2c3, 0xa362a80f, 0x71d7c585, 0x9dfc403e, 0x79cf8add, 0xb5c31d9c, ++ 0x55d77f1a, 0x68d9dddc, 0x1a9a9df6, 0xf1b65d77, 0xd6cf1e63, 0x226137c1, ++ 0xb7c8ebf0, 0x74aa35c6, 0x261d01b0, 0x234ae368, 0xe28639c7, 0x06f8c34a, ++ 0x1e3d04fc, 0xf9a51b8a, 0xe83f1001, 0x8a450e13, 0x81b73e53, 0x939ea3c5, ++ 0xaadf7f23, 0x0a9e99c6, 0xcf5f5b97, 0x9bbb4be2, 0xd3a577c7, 0x2ebb68e1, ++ 0x57a552be, 0xfac8c5eb, 0xf846263d, 0x956bdf61, 0x47dfe10a, 0x878cc744, ++ 0x0a23f873, 0xeea173de, 0x5b7cf8ab, 0x75adbfb9, 0x877188b3, 0x51bbf5d5, ++ 0x8feb87bf, 0x128e7e72, 0x3181de3e, 0xde5aff6c, 0xd68fd6c8, 0x999f166d, ++ 0xebbad3b6, 0xf975c475, 0xf7182396, 0x65eeb7b8, 0x7f39a025, 0xa7c3f586, ++ 0x8beb7f19, 0x3ea1473b, 0x855af7e7, 0xef3973f7, 0x7229a2a7, 0xce5b153f, ++ 0xf129faeb, 0x73362bd6, 0x919dfdf7, 0x7b40b79c, 0x1d985a67, 0x9c5ea675, ++ 0x1dfbe91a, 0xcfcc8c6b, 0x4a586a31, 0xdfbc51d7, 0xf3eec2cb, 0x68d1ad12, ++ 0x4cb32d97, 0x48f70c3c, 0x1828b32e, 0x8ab2b17f, 0xc2fc6bc7, 0x5efc0491, ++ 0xc09eb969, 0x7d035778, 0xd97bfb35, 0xcf6026e6, 0x71ae49c9, 0x751873da, ++ 0x036f4afc, 0xbff869f1, 0x0fb532cc, 0xe4894fec, 0xb8e3001d, 0x092bf521, ++ 0x0f16c5d6, 0x78b8098f, 0x6f3c306c, 0x7a7b6c91, 0x725b76d1, 0x66b80704, ++ 0xa7dee33b, 0xe8dc3ff3, 0x0a83dfd4, 0xbf30fe31, 0xed018776, 0x6fc18b44, ++ 0x258855a3, 0x370925aa, 0x976276b8, 0x1f343112, 0xf7efe3e3, 0xf7c30698, ++ 0xcd42567d, 0x90e7a856, 0xc462f774, 0xeec2944e, 0x070720c9, 0x399abc53, ++ 0x9d7f555e, 0xdb4efd85, 0x1bfde00d, 0x0aa4e971, 0xe2cebbe0, 0x51e27b46, ++ 0x5fbf13ab, 0x21c33fa3, 0x449e224e, 0xfaf7b43b, 0xf7757ed0, 0x757ed081, ++ 0x3ea738f9, 0x74aa6bdf, 0xd37ad23c, 0x4f238f8b, 0xe21d2334, 0x5edc0d72, ++ 0x490fe676, 0x5c7718ec, 0xa1f87102, 0xe319ba7c, 0x7978a9d2, 0x9b30f3b5, ++ 0xe3a6e3f5, 0xd889e9d3, 0xc0d780f4, 0x6e7ba9c6, 0xd7bc7623, 0x68f78e98, ++ 0xf97578d8, 0xefae18ea, 0xbe812224, 0x085a9b33, 0x8ebb7fa7, 0x5724abde, ++ 0x4b61227c, 0x0e938c26, 0x886fbe13, 0xfda0f3e5, 0xc0dbeaeb, 0xd7fac07b, ++ 0xd80643b7, 0x5e25dfb4, 0x19c1d7c1, 0x3193d766, 0x0c64af54, 0xe100c4aa, ++ 0xf38249c9, 0xd65a58f8, 0x7bf99bd4, 0x5c636796, 0x70c3508a, 0x411d7835, ++ 0x641c19b9, 0x55642ff1, 0x46a9da34, 0x8d46f113, 0x88adef81, 0xbd031e57, ++ 0xd9fcb8f8, 0x53681857, 0x358a1ad2, 0x30535efa, 0x3288b0cb, 0x688a1ea1, ++ 0x38c58ffb, 0xaefa037f, 0x927746fa, 0xfc3c3461, 0x00f37568, 0xe011da94, ++ 0x1f083431, 0x9037d9ee, 0xbdc10a85, 0xb87c840e, 0x135e3007, 0x7c3f13ca, ++ 0x1d135df7, 0x544d3bca, 0xb2a4d7df, 0x87cc437c, 0x11fee1ab, 0x00d5cd97, ++ 0xed9310fd, 0xf30f3c32, 0xbaad7bb3, 0x71d45f5b, 0xc818df0e, 0xfcc71e8b, ++ 0xecff70a9, 0x3be84b10, 0x378f5c6c, 0x1fbcd599, 0x86ae17f7, 0xcad7a803, ++ 0xb9600fea, 0x1d34f201, 0xd7902bd4, 0x3f908e3f, 0x373a703f, 0xb5d80469, ++ 0x3a064905, 0x381e4fcf, 0x5bbe07bd, 0xb9c3a0eb, 0x3b93cdd5, 0x5a1920e8, ++ 0xfad0e8c3, 0x49f0e89d, 0xb86aeb4c, 0xf3a7a31f, 0x18f8b8a6, 0xd32d35e8, ++ 0x4d70f780, 0xff466c38, 0xc289fd0b, 0xb3b788f5, 0x74ef8ba1, 0x6d0a7dd5, ++ 0x5f1698e7, 0xae2a7bea, 0x1a4dc2ba, 0xeec65db1, 0xa7e3d477, 0x0ad9d9b7, ++ 0x718d9ded, 0x8092cafe, 0xc2efc7f3, 0x5c0bb9a7, 0x703abd39, 0xb1eecc4d, ++ 0xffa05937, 0x7d405ff9, 0x32d35c75, 0x74a98a97, 0x2c825fbc, 0x27cc7424, ++ 0x6a37b961, 0x82679d28, 0xdbf180d3, 0x7feecc33, 0x39d67bc2, 0x8f553f41, ++ 0x8f7004d4, 0x7e8ec415, 0xdea8f954, 0xd5f1f6ce, 0x0adf0605, 0xf78c1e76, ++ 0x23e077ef, 0x208f8610, 0x11e347c3, 0xd37947c4, 0xc68f8611, 0x7e68acaa, ++ 0xe8fb06ae, 0x0d1c121a, 0x675b8f7c, 0xdf2893ca, 0xab04c507, 0xc85c53fb, ++ 0x8fcbc944, 0x9ac6ba42, 0x87f02213, 0x579d4b8f, 0xd9adfc57, 0x3a40fa97, ++ 0x1bf733ec, 0xa54c3cf0, 0xc32f5a9b, 0x4f13e2cc, 0xa003dc58, 0x81898a9f, ++ 0x6dbec0bd, 0x7184fefb, 0x37fdd61d, 0xadf784ed, 0xec8728b3, 0xecd6fd1d, ++ 0x3cf7815f, 0x7bb134d7, 0xd0496397, 0xd77aeb0b, 0x13f260f4, 0x3dd807a2, ++ 0x238f40e9, 0xf99b2f28, 0xee544b77, 0x41dd3bf0, 0x891eec31, 0x8e2ccc2b, ++ 0xb22cdb24, 0xb3334538, 0xb7f61237, 0xaaffb02b, 0xfac06558, 0x6ba69009, ++ 0xbf8abfe7, 0xf0e2e927, 0x78aabe54, 0x06349aa2, 0xc4b0a3ee, 0x759b27bb, ++ 0x498f89f8, 0xbea7b4d5, 0xb88790f7, 0x4ca05216, 0x377f9e68, 0x3f14abac, ++ 0x759acd7d, 0x3948da7a, 0xc216e80a, 0x2467c50f, 0xaef7d0fe, 0xfd678f37, ++ 0xb5b0bd80, 0xf788a979, 0xaf90f42a, 0x209f7019, 0x43119fad, 0xf7d1b72a, ++ 0x0a696233, 0xdf3c5ef9, 0xb3fbe787, 0x8713ed34, 0x37cfa041, 0x7cecbf70, ++ 0xd922574e, 0x2469bb2e, 0x275d19e4, 0xbae0c527, 0x5c2dcaa0, 0xdae70183, ++ 0x4edf3f12, 0x801aa60d, 0x4b1caa6f, 0x62df8341, 0x0c077bc5, 0xaef0e710, ++ 0xf382edc7, 0xcef4aec2, 0x77d823f5, 0xefcfe185, 0xdef9e3e1, 0x9de7f5f6, ++ 0x07be3fbe, 0x0a665be8, 0xcd13743c, 0x80b88f97, 0x3115da7e, 0xdb7d57e5, ++ 0xe3e1083d, 0x49e2f77f, 0xe787d82b, 0x8d4e36be, 0x366f6764, 0x3ec17db3, ++ 0x2f7c1ccf, 0x46f3df83, 0xaef1a8fa, 0xa117ef9a, 0xc865db8c, 0x8e7c54ca, ++ 0xa8d5d676, 0x5e9f8102, 0x8fde1e29, 0xc573c149, 0x63bec26b, 0xaecbcf54, ++ 0x603f33f6, 0x1f2fac46, 0x0d3cbbfb, 0xd7c908e3, 0xd1325ecc, 0x2a1ce0ff, ++ 0x399b9f97, 0x619adb0f, 0x55e8cc39, 0xc7ed8393, 0x2b5fa0a6, 0x67efe893, ++ 0x95e3e8cb, 0x969e500c, 0x9b65ed82, 0x08d3cac2, 0xb0c8adfa, 0xb97e70cb, ++ 0xe19f6344, 0x00e351ba, 0x386d3c7d, 0x7e7f3fc5, 0x641bfe81, 0xa8de7724, ++ 0x675c67d9, 0xa395d5bf, 0xf06a5bb3, 0x7fdf985e, 0x2919de23, 0x30b442fe, ++ 0xb8f3ee7c, 0x100f105c, 0xbb2cc74e, 0xef62cab0, 0xfa70ef4c, 0xa55bd385, ++ 0x32dd3863, 0xc4e4713f, 0x27d33bdb, 0xe71d1e9c, 0xc075be97, 0x22e1dc87, ++ 0xdd2a5fae, 0xf187d33b, 0x6823f7eb, 0x42f0013d, 0x4cf40de9, 0x47be3013, ++ 0xf9736fb5, 0x8b7da8f8, 0x82766bf6, 0xe13efd05, 0x474ced74, 0x626e7e67, ++ 0x02f6fcc7, 0x9ea086bd, 0x4d8cb860, 0xc465be43, 0x7c420e3a, 0xc21d8919, ++ 0x86bfe370, 0x5e3fe368, 0x2c72ff02, 0x29ef070e, 0x117586bc, 0x5f35d7a2, ++ 0xdcdcedeb, 0x60d3bca6, 0xaaf4673f, 0x7e838e6c, 0x79bf0c8c, 0x34e9ff7c, ++ 0x4a41f8b1, 0xbc7aa3cf, 0xf4ec6611, 0xbc71f14a, 0xbc56fd1d, 0xfdf7c2d9, ++ 0x74e16f0c, 0x12f6f150, 0x99d4983c, 0xfede2a6e, 0x79f6e661, 0xec00323f, ++ 0x8faf51e5, 0x4dfd058b, 0xfa23e29a, 0x761c2625, 0xfde1da85, 0xe2052e23, ++ 0xa5b73d0e, 0xb63d00fd, 0x1a92ae9f, 0xb92b163d, 0xf4112d63, 0x29938a98, ++ 0x88535f9c, 0x99f82777, 0xf3e910a6, 0xa5207ed0, 0x2c7dfe63, 0x3fbbfcfc, ++ 0xfcf30fe9, 0xd99db30f, 0xa19e7c45, 0x12f35379, 0xfbcc9ffa, 0xe3326c9f, ++ 0x28241e77, 0x9ee886b5, 0x78dff78a, 0x718ef895, 0x493ebcc8, 0x9ecc24ae, ++ 0x1ff78b9b, 0x4b90ba53, 0x48e31d31, 0xde1208b7, 0x71c7c2ff, 0x85e4ceb6, ++ 0x92d9b738, 0x6cf301db, 0xc28ff615, 0xa1fe49f9, 0x9785feb0, 0x2e6c685f, ++ 0xaf5a7287, 0xf1f1eb10, 0x670c8897, 0xdf46edc1, 0xdb5d29b3, 0x71bc54a9, ++ 0x63e5509d, 0x79577c32, 0x505bc805, 0xf1377184, 0xe71d9573, 0xe85f708b, ++ 0x9755b624, 0xb4f6f6d3, 0x00f7e1e7, 0x40ed54d9, 0x87fc70bd, 0xc71c3ae3, ++ 0x0f382439, 0x5f8cebde, 0x2bf2f7ef, 0x085c76a9, 0xb8f50737, 0xf142f151, ++ 0xcfd80b73, 0x7b3ee36d, 0xf7eecc02, 0x84485dc6, 0xd3b54ff5, 0xe711ec3b, ++ 0x2baf506d, 0xd3b55d7b, 0x05dc5b17, 0xe60907c0, 0x1d4fdf43, 0x77c0376e, ++ 0x9c5b8ffa, 0x6ab9e1f3, 0xefb774bf, 0x1912cd20, 0x877f019e, 0xdea1f188, ++ 0x607ef040, 0xef0152ef, 0x0483bec7, 0x8eefe865, 0xbfb7594a, 0xfc15179d, ++ 0x8e7067f4, 0xe30c3558, 0xd5f0dc88, 0xb3ef88a8, 0xbe6ae4b8, 0x0e0f0eee, ++ 0x9ddffd85, 0x13eff5cb, 0xc7627dc0, 0xd29fab3d, 0xa1e37dba, 0x7c0240dd, ++ 0xd5e05bc7, 0x5fef0fd7, 0xbb78479d, 0xf055efe1, 0xf704fbbf, 0x76343b5c, ++ 0x3b0b4ac3, 0xf78d0a27, 0x025f7e5d, 0xbbac37a5, 0x7c234ded, 0xafc047f7, ++ 0xfd4dba9a, 0x7ee6929d, 0xe376c0ad, 0x98f7489c, 0xf4a8fda8, 0x545a4b9e, ++ 0x1223fe7a, 0x99bb26fe, 0x98f0c03f, 0xaf5e775f, 0x398383a6, 0xae0df768, ++ 0x2eced017, 0x2c34cfad, 0x6cfbd9d0, 0xdec9dc3f, 0xa0357b87, 0x664ec37e, ++ 0xe157d7ef, 0x81b4a1be, 0xc0367fed, 0xf8fd11bd, 0x1f71d240, 0x42d7da10, ++ 0xdc1954fc, 0xfdcac863, 0x5a55b570, 0xb6ffab0d, 0xad6553e5, 0x7752fb04, ++ 0xf91cdc12, 0xaac783f6, 0x54ff744d, 0x08a2429d, 0x79ed3fdd, 0xbade58f0, ++ 0xc73b5489, 0x37b8053b, 0xcdabe692, 0x8fbe7a93, 0xa3c1fb7e, 0xa68fb0d5, ++ 0x801daffb, 0xba5e556b, 0x307a8f92, 0xdeba123e, 0xae6cbacf, 0x54be41b7, ++ 0xff3844bf, 0x58f64ddb, 0xbe5adfc0, 0xf97ebecf, 0x443fdc02, 0x0c98bb0d, ++ 0x39936271, 0x3b720fdf, 0x7d8622a8, 0x93115e0f, 0xf53d03ec, 0x083ee8b5, ++ 0x75db6ce3, 0x93f82871, 0x0c7e1ddf, 0xfc4d6ff7, 0x9efdc9be, 0x6e369722, ++ 0x1f1caffd, 0x6dd88fd7, 0xf4c7fd85, 0xefc67ff1, 0xec4acfd4, 0x89d6b5fe, ++ 0xbddece8a, 0x57fb92ce, 0x529abf18, 0x9fa089f2, 0x3e6b8f27, 0x577eeb0c, ++ 0x3ac744eb, 0x1d6014e0, 0x240f1720, 0xc35079e2, 0x35f82b1e, 0xef77f95a, ++ 0x27761b67, 0xd969a7ce, 0x615b3fd6, 0xf3e415df, 0xe0b52b3c, 0xafa53d7d, ++ 0x049f7888, 0x76f137ed, 0x2c3733f0, 0x759fb8c8, 0x83aed263, 0xddd9be63, ++ 0x7f9cc5df, 0x6a883f78, 0x79314e1f, 0xa6be307d, 0xe777f62a, 0xbf9090a6, ++ 0xb915ef13, 0x467441a6, 0x8bdb3b59, 0x72e6558a, 0xa778c764, 0x4fd63665, ++ 0xf939f257, 0xa7c45eeb, 0xb2606fb9, 0xfc6117e4, 0xc44ebf93, 0xa5f767e7, ++ 0x7c0f9a3e, 0x0863b227, 0x66912b34, 0x79f947b4, 0x8669fd12, 0xf077a67b, ++ 0x170d5bcc, 0x60855e66, 0x0090eba5, 0x37bb97f6, 0x7d321273, 0xd789daaf, ++ 0x93f7ad7c, 0xeaaddb86, 0x34d596ba, 0x027f557a, 0xc4cfb774, 0x49f61def, ++ 0x6e159f18, 0xf306e6d7, 0x1f5fb0ba, 0x6b6c7a46, 0xbc018b48, 0xafb8e09c, ++ 0xf780b868, 0xff1394c7, 0x4f8f70cd, 0xf3688379, 0x1a2b8813, 0x8dc83977, ++ 0x74abfeba, 0xdbb8bc69, 0x6cfc0a34, 0x15b68baf, 0x0be9af50, 0x3fd8e1c4, ++ 0xe9f5c45e, 0xf78c935c, 0xff6c54a7, 0xb340bacc, 0xc4d7381f, 0x6b6955ee, ++ 0xde7fa63a, 0x7872ebd8, 0xed81ab6f, 0xfef79b6f, 0xcef40623, 0x7bdb175b, ++ 0x5d5abee1, 0xd7db3bff, 0x5b671768, 0x58ff90c4, 0x71133f6b, 0xcf8841f2, ++ 0x89958dca, 0xff6d7428, 0x56427e66, 0x3b674859, 0xe2774420, 0xe10e8094, ++ 0xce884176, 0x74c17661, 0x06d7b72b, 0xcf703192, 0x5ec5e360, 0x6a3df825, ++ 0x056d8c53, 0xdd987ffa, 0xe67cd6d3, 0x7cf06991, 0x23eec8bf, 0x3ca228b8, ++ 0x3251daed, 0x0fa1a028, 0xa7c88cd5, 0x3f9efb2f, 0xffad26f7, 0xe6689ee5, ++ 0x971c970f, 0xe86bbf6b, 0xf4e3efa8, 0xe763f7f2, 0x707ede6a, 0xb6f7d05f, ++ 0xed3b5b6b, 0x68ad8bcf, 0x40f306d7, 0x3dad0fbd, 0x4fff00a2, 0x56a55c58, ++ 0x18fab794, 0x925e2fd0, 0x7ed09fd5, 0x1649a28b, 0x45582ae0, 0xf7e7106c, ++ 0x01833eca, 0x536e32f8, 0x6ce1c60a, 0x4b8ee7e6, 0x14946bea, 0xc25ade8d, ++ 0xc94eadcf, 0xcd78e4de, 0xdb2b76f3, 0x53da9fb7, 0xe1ea0cfc, 0x48648d0f, ++ 0x4ff77584, 0x7897e656, 0xdb4ef159, 0x1a8ef502, 0xe6a0fbf0, 0x85ec6fbd, ++ 0x1c976a7b, 0x75868fb6, 0x8ed58b6c, 0x6ff71af5, 0x1aee7bc6, 0xdde8213f, ++ 0x2058d8cd, 0x6fbf681a, 0xc3f33b12, 0x177f641d, 0x24bfe431, 0xcf305ece, ++ 0xdf4cade7, 0xa0cfb9bd, 0x937ae73b, 0x14faa7df, 0x563543d7, 0xb6db07e6, ++ 0xde17ab2f, 0x3f716b2b, 0x38aaf40a, 0x2186a81e, 0xd53b7ea8, 0x70749b0e, ++ 0xf491b4db, 0x06ad49d7, 0x7edbb01b, 0xe61159f0, 0x48453f6b, 0xd93a409c, ++ 0xa7bdb465, 0x7b6a2f81, 0xf6b2b66f, 0x817638e8, 0xa7f4aabc, 0xe903da2b, ++ 0x8b66ff34, 0x5bf10f14, 0x79d5fd2a, 0xebdbfda8, 0x19837389, 0xedb9c945, ++ 0xeac7fc5b, 0x6d63f7fd, 0x1f0fbd44, 0xead83971, 0xfccac17c, 0x3f90c977, ++ 0xed1a27b5, 0x3af9979d, 0x060a9249, 0x3e54fd01, 0xd6cac1fd, 0x5d3c7535, ++ 0x1f0efff5, 0x577e9aa7, 0xed966f5c, 0xbf0dc45e, 0xf5eed0cf, 0x4e20d29b, ++ 0xff0d31ac, 0x8e26901e, 0xff1c1df6, 0x75fdfd29, 0x0183018d, 0xdf2af7be, ++ 0xf5e1c42e, 0x9bb43d27, 0xea933843, 0x878d7f11, 0x7171ca09, 0x7fcc5ddd, ++ 0xf9fdfc48, 0x1e785ebd, 0xcfc3f20e, 0x340afbc5, 0x61b4d49d, 0xafa47f65, ++ 0xd5720adf, 0x372a2741, 0x28d65690, 0xcb25d780, 0x9f98ba58, 0xef592f2f, ++ 0xac2cf946, 0xc783f165, 0x7d6c29ac, 0x862578e6, 0x57107ee8, 0x5fd38f32, ++ 0xc731771d, 0x4786e9ed, 0x14bf4377, 0x1e81a75f, 0xfc3e3657, 0xc5570c04, ++ 0x328de9eb, 0xad1453b6, 0xc73f7f3f, 0x41cafaf9, 0x1b49f786, 0x4fb82ce5, ++ 0xd897926a, 0xe6fd1fc0, 0xe8224dc6, 0xcf0137ef, 0x61ce4c29, 0xe7b53dbd, ++ 0xc29f98fe, 0x40c476fa, 0xb2fdefc0, 0x6ab68a42, 0xc379a2e4, 0x2df93a6b, ++ 0x869aabae, 0xbc40f5fe, 0x955e7a00, 0x2fee955b, 0x50eb8e2b, 0x93086ffe, ++ 0x7ef61cff, 0xcbe32c5a, 0x1ffe5ca3, 0x9fe54a9d, 0x18db8a3e, 0x2f3b4027, ++ 0x19ef912b, 0x7efd884b, 0xd5e90bf8, 0x9abd2740, 0x05fccb10, 0x7fda34d6, ++ 0xf476f4f9, 0xc7c68417, 0x8e68f371, 0x01149b8a, 0x39435fe8, 0x45e81838, ++ 0xa6780ae9, 0x379df176, 0xee54a3a5, 0x86bcf093, 0x38f1079f, 0x8d28940e, ++ 0x33e876bc, 0x43dd6e55, 0x39191c61, 0x6ec12b95, 0x45ef95ef, 0xdc169e7c, ++ 0x7ae9e283, 0x38e41a76, 0x63903e82, 0x52fe5e99, 0x9f777776, 0x73c03f7a, ++ 0xc201dd11, 0x60ad487c, 0xe5a8be03, 0x4fb65af6, 0x55f4e6c9, 0x50ff679f, ++ 0xdd3b077a, 0xe8cd9943, 0x0e20541d, 0xad8fa875, 0x42c84463, 0xeb862079, ++ 0x2d9c81fb, 0x6dd7eba1, 0xb4ebf59a, 0x5538835c, 0x963d30e9, 0x7197cdc9, ++ 0xf0dfde6c, 0xf072e9f5, 0xd0d78dc1, 0x8124905f, 0x3028b3c9, 0xfda11739, ++ 0xbcae7bd3, 0x3d3ef10e, 0xb06dde32, 0xbf878a7f, 0xf101b3d7, 0x86d53719, ++ 0x2a3ca9df, 0x74e2a239, 0xd30f91f6, 0xe24f4de6, 0x0bf00dbe, 0xfe15def2, ++ 0x24ff008b, 0x147dee02, 0xa9fe1af7, 0x58b8a038, 0x0fd1ab12, 0xcf50b8e1, ++ 0xbcba550d, 0xd8ee761c, 0xc554e9c0, 0xf1177b53, 0xbe7cea2f, 0x754f9f37, ++ 0x5c37b3e2, 0xaadf80ae, 0xf204587e, 0x7cb5d095, 0xb1b58b1d, 0x97f733bf, ++ 0x526f1805, 0xea9fcfc3, 0xb8ea7f79, 0xecf8e11f, 0x8668fcea, 0xac70fdd9, ++ 0x7329bcf6, 0xef4f68a9, 0xb72e47c0, 0x326e9767, 0x56fdf9e2, 0x35be0128, ++ 0xdfb4fb47, 0x6a24da8f, 0x6f525290, 0x71c14d88, 0x2fb0f8ab, 0xda60c857, ++ 0x052997ef, 0x73c710cd, 0x7f378b6d, 0x56c79d24, 0x3a6b3bc5, 0xeb8effda, ++ 0xf2ebfda0, 0x5ff0360d, 0x026d39c7, 0x64d037f8, 0xcfdc3903, 0xe69b19fa, ++ 0xc1f71cb8, 0xd058c776, 0xe58bbf07, 0xbf9c4de7, 0x5aba1d2a, 0xebe2bae7, ++ 0x049f4e31, 0x47ae1e5e, 0x3bf2f356, 0x1ebdda78, 0x4f208af1, 0x015ee256, ++ 0x4c9bb77f, 0xa42ffa66, 0x3c132647, 0xf5cfdc5f, 0xcd5cfa92, 0x647a88ff, ++ 0x4845c83f, 0x440c4c8f, 0x27f423d4, 0x6c27fca2, 0x2c76845c, 0x8ed91c39, ++ 0xad9624fd, 0x7eb009c3, 0x5e097ad2, 0x7f74f7f6, 0x8a05d7c7, 0xac838c48, ++ 0x73c468d9, 0x590f5509, 0xf82c9167, 0x5856c0fb, 0x2cd6a16f, 0x7029e1f7, ++ 0xd8a49bee, 0xb4fa1ce1, 0x9fbe441c, 0x1af01ba6, 0x004b87c4, 0x47d0477e, ++ 0xde21fc04, 0x3f30068f, 0x7284d8be, 0xe09734b2, 0x69bcd9fa, 0x28aae202, ++ 0xdc00553f, 0x09c5d716, 0x639f1e50, 0x529e8033, 0xb96131e7, 0x72a4f888, ++ 0x8395aed0, 0x114ade09, 0x97a835e8, 0xc38e493b, 0x5aa99638, 0x7ebfd07f, ++ 0xfd6aa649, 0xe6bf3441, 0x0483f8bb, 0xc0fba5db, 0xd637d41f, 0x9dfa0979, ++ 0x36097661, 0x03ffcf4a, 0x1cc8bafb, 0x00008000, 0x00088b1f, 0x00000000, ++ 0x7dd5ff00, 0xc5547c0b, 0xbddcf0f5, 0x936bc8fb, 0x21213bcd, 0x21e1026c, ++ 0x10084b88, 0x83cdeb11, 0x05849288, 0x6ea2be29, 0xf23c2402, 0x6b62d102, ++ 0x023042cb, 0x2d47c622, 0x858bac56, 0x0da229fe, 0xa8d63502, 0x8a8b401b, ++ 0x9fb4df1a, 0x8790f0d2, 0xfb60a482, 0x77cb16a5, 0xec9999ce, 0x808d9bde, ++ 0xf7efffda, 0xe64e9f85, 0x67b999de, 0x9cce7bce, 0x6e4d8c99, 0xc640d950, ++ 0xb18e3f98, 0x873b19cb, 0x2ef5573f, 0x9632f319, 0x4dfcd8c8, 0x0e1e5773, ++ 0x0e73f463, 0x596dabfe, 0xb7d7aba0, 0xf0f2b5de, 0x3e7d40d0, 0xcf0a92fe, ++ 0x43b21717, 0x0ef7e1a3, 0x1892c516, 0x584de1ab, 0xade7586d, 0xc58c9c9b, ++ 0x8e093d98, 0xf5d58c31, 0x0e28f23b, 0x77f6df57, 0x6faa27ab, 0x57f01238, ++ 0xcc27dffc, 0x5f8151b7, 0x256a0ddd, 0xa9ec9fb4, 0x33c51770, 0x7cc074e6, ++ 0x4d2360c6, 0x2ea76699, 0xc608cb5a, 0xf49b199a, 0x5fcbb61c, 0x694166a8, ++ 0x7b5e630b, 0x51f3b61c, 0xe4c7ac7b, 0xeee16810, 0x5d5b194b, 0x1be49a62, ++ 0xb18e1bd1, 0x85efa88e, 0x998c760f, 0xdac0f183, 0x9fc7fdfe, 0xf8f6858e, ++ 0x9658cabb, 0xf11633d9, 0x1e89f801, 0xb879f808, 0xe21260e4, 0xd84c7e03, ++ 0x8df176ef, 0xdeb99727, 0xf0780219, 0x8db2adbe, 0xb3651f50, 0x9c18957a, ++ 0x4920a036, 0x4a3f078c, 0x8fb7e29b, 0x0ad7fa84, 0xa70e80d3, 0x7ca956be, ++ 0x49ee17f2, 0xaebfd099, 0x065ae4d5, 0x00daeaed, 0xb98cb999, 0x585f3006, ++ 0x112d6326, 0x8c1923d1, 0x4a2bbf97, 0x53f3c0b3, 0x96cf984a, 0x08657849, ++ 0x9fc24587, 0x05b195d7, 0xd9b637de, 0x9ea82ad8, 0x235207ca, 0x0c5766bc, ++ 0xefc0111b, 0x1e1eb7c8, 0xe780330a, 0xd0372ecd, 0x3e70a9e5, 0x19e153fe, ++ 0xa58d163e, 0x018ce7ec, 0x8259614e, 0xe066cc6f, 0x1413a011, 0x2c272c5e, ++ 0x8199a81e, 0x79998ace, 0x09af402d, 0xf1157e5d, 0x34e5d593, 0xf7c0a8b1, ++ 0xe68c5dcc, 0x9a76659d, 0x8b47005c, 0x3db6ffc0, 0xc066a9cf, 0xe6a2d8eb, ++ 0x7bca1546, 0x10b33da2, 0x3427e3df, 0xf8f3e234, 0x81eaaf12, 0xc34ab9f6, ++ 0xd9f23b2e, 0xd1b5cc35, 0xf8939019, 0xe00ed64e, 0x9d7dd8b2, 0x1f3c345a, ++ 0x1f6b4c7f, 0x718ff301, 0x63c70533, 0x7f7d296c, 0x1ebb944a, 0x9a0965c7, ++ 0x8ce30a52, 0xfc231bfd, 0xedb671c8, 0x009c5029, 0x9147426f, 0x9bd11ce2, ++ 0xe732d7cf, 0x77ae387d, 0xf485c9af, 0x6d30b675, 0xf01fb43d, 0x884525f4, ++ 0x8d7ed92f, 0x5defa143, 0x5a14f1e1, 0x17e7cd19, 0xf97fe80e, 0x165dbe0d, ++ 0x1cdc6780, 0x33ab2eef, 0x19733e68, 0xe9d6978d, 0xeea479a5, 0xf963e4f3, ++ 0xbe963d98, 0xbf98fe3b, 0x4bb4047d, 0xc0f9806e, 0x1f1dfef3, 0xfed78828, ++ 0xd20a1d0d, 0x9d9edb73, 0xc77a6f04, 0xf90a5e6e, 0xabe40e7a, 0x8f1e6825, ++ 0xd7044dd9, 0x5f0e7663, 0x2999c9d3, 0x90ff786e, 0x3d98f3c3, 0xa68f3031, ++ 0x034a4f7c, 0x4f76bf8c, 0xb37ccf56, 0xa0cbde01, 0x5a5eb05b, 0x38d2b0ef, ++ 0x5f9eec47, 0x6feafce3, 0x790d7ce8, 0xef3db9f0, 0xb47c9345, 0x937d1025, ++ 0x7a241ef6, 0x9c062d24, 0x7bb5e3c1, 0x2fa82a17, 0xcd0396d6, 0x9678de94, ++ 0xc22d637a, 0x88e3fc4f, 0x69fc0a9c, 0x0ffcf38f, 0x9fb6477e, 0x9917115c, ++ 0x6497a415, 0x309747bf, 0x64002cf7, 0x6dcaeedc, 0xeee90b2c, 0xdfae95f9, ++ 0x2384f7a5, 0xb5db653f, 0x9c3f203f, 0xf80dd852, 0xc258cd9d, 0x5e16cdf3, ++ 0x97faf897, 0x8e43e7a0, 0xc7d98fa9, 0x80393c70, 0xf387378f, 0x747d4676, ++ 0x39fbc1d2, 0x0eb0bf05, 0x0f382fce, 0xddb263d4, 0x344f9207, 0xf399a14f, ++ 0x93e22ec9, 0xe42edf3c, 0xbc9371db, 0xfbff90bb, 0x9327c133, 0xf9189f38, ++ 0x57ea20fd, 0x862e93e2, 0x9855cf78, 0xb2ee983b, 0x42e108fc, 0x4051dd7d, ++ 0xd0f203fc, 0x9b1bdf81, 0x505aa0d6, 0x64c7336f, 0x1dc73fb4, 0x3a376a4e, ++ 0xfc85db4f, 0x24dcd0e6, 0x3a445fcf, 0x7264df38, 0x7ffe80fe, 0x7946fec1, ++ 0x34728eda, 0x09472022, 0xbd518fc8, 0x016df1f9, 0x43c471cf, 0x3df1a862, ++ 0xaf041c47, 0x90605349, 0x7ca2fb71, 0x5b8e9a0c, 0xe5127604, 0x03ff0194, ++ 0x1c737180, 0x696728f9, 0xe9052e35, 0x7dd2327a, 0xa135fb02, 0x7e45cc6e, ++ 0xa11af936, 0x1a31bddf, 0xdb3befd1, 0x8c2cdd89, 0x09d80d8d, 0x12ff0bb0, ++ 0x054d6176, 0xffdfebea, 0xd4fa8ad3, 0x4f6fe529, 0x1065644e, 0xf2c5c47f, ++ 0x5bd10679, 0x6f410d89, 0xd2339ea3, 0xf417a03b, 0x15f00e7a, 0xcdfa4b19, ++ 0x2cf91a33, 0xca9163a1, 0xaf5e83f5, 0x5e8f45f5, 0x21d041fa, 0x404b4a21, ++ 0x19031f38, 0x0b7aefc4, 0xde7c50d8, 0x1a1e3d97, 0xfffd451b, 0x2878f68b, ++ 0xc7b463c2, 0xd7aeb0a6, 0x6d47c015, 0x6154ea9b, 0xc7778d0a, 0x27ff4869, ++ 0x0d97145b, 0x536aedda, 0x6c9e1f89, 0x29bb208a, 0x4772fde1, 0x197648cc, ++ 0xd9fe4294, 0xa7b258ee, 0xfbe2b1f5, 0xf817e1cb, 0xaf0729fe, 0xf278720e, ++ 0xffb2cf10, 0x08ff6d93, 0x4f0f3c47, 0xe8c3b451, 0x31ed1957, 0xfd029088, ++ 0x829bf86d, 0x42b51d78, 0xe19ac145, 0x895366d9, 0x9f38056e, 0xbdf3ac71, ++ 0xd3d70009, 0xc14c0a5b, 0xd699d6fe, 0x09dd6eaf, 0x7247d7f0, 0xc91f5cfb, ++ 0x9da9f3ed, 0xbf230767, 0x2678bb5d, 0xd56ebde9, 0x48363933, 0xf431bdcf, ++ 0xacc3d710, 0x386471dc, 0xce535a7e, 0xa30a0245, 0xd19a86c3, 0x5c2350af, ++ 0x20afdeaa, 0x06cc68e6, 0xdafe20fc, 0x8d7f0823, 0x997720d9, 0x380de704, ++ 0x2b76ddef, 0x67e7854b, 0x9db11e40, 0xc03bfb84, 0xc78c115b, 0x8ee9bc00, ++ 0x2f829123, 0x3d7c00d4, 0xc03a4174, 0x4cddaaf8, 0x22c538f3, 0x16cf485c, ++ 0xfe90c6ab, 0x3fc2fdde, 0x13ab7410, 0x6daa773c, 0xcc0f3ecc, 0xe97dc9ef, ++ 0xaa7fec2e, 0x29b84cf5, 0xcf47fd0a, 0xda9bc442, 0xed1a2bbf, 0x33b6aee1, ++ 0x90473ac3, 0xcf845b7e, 0x143deccf, 0x9df119e7, 0xd0f3f7e6, 0xafcfd0f4, ++ 0x22b51cde, 0x33444fd8, 0xc0d2864b, 0xfb5b4a47, 0x249194bf, 0xa1f50c7f, ++ 0x1af98337, 0x974dde61, 0xce9a7e0a, 0x46f7289c, 0xb8720f7a, 0x920d8fef, ++ 0xfb8764db, 0x7e3bc401, 0xe6872d27, 0xf92c60f9, 0x5b473383, 0x22bf384c, ++ 0xfa537686, 0xe89e727b, 0x04e7878f, 0xbdfd27e6, 0x9f67f99e, 0xd197b91d, ++ 0x3d209fbc, 0x4ccb9cc4, 0x183d6700, 0xc1995585, 0x5d13f7f3, 0x6b3cc56a, ++ 0x2afca2c3, 0xb76d8bcc, 0xfa94e89c, 0x3cf7ab20, 0x709b4e80, 0x6b816f5c, ++ 0xfce9079f, 0x235728d7, 0xe1dcc9e2, 0xe615ff40, 0xc9e719b5, 0x10522af2, ++ 0xb4a2530f, 0xdfbea33f, 0x5f1194bc, 0xf9867a9f, 0x6f49829e, 0xbe226ddd, ++ 0x212ecf59, 0x74c4bffe, 0x147756fa, 0xec76f5c9, 0x6cd1db9f, 0xed9bfd42, ++ 0xaf509a73, 0x3168eb0e, 0x3c1f8899, 0xc07be3cf, 0xc03319d3, 0x834b7c37, ++ 0xc2f91dfa, 0x0a72217f, 0xe7cddb74, 0xf126e9cb, 0xc3f04136, 0x1a1bc404, ++ 0x89f32e86, 0xde00b0ce, 0x2d2c2e80, 0x8c78f7ae, 0x9e206675, 0x3a385fda, ++ 0xabc613b8, 0xade8f97b, 0x3fba9788, 0x8a1988d9, 0x062c34fe, 0xfccbfef9, ++ 0x89cd7ed0, 0x336e0d25, 0xb15be330, 0x6a076459, 0xfd158758, 0x6eebd005, ++ 0x975e9073, 0x4b5edc7e, 0xbf8e0947, 0x96ca8c77, 0xb8cf9e02, 0x10b325c6, ++ 0x1fc7a2f6, 0x9b2dbf40, 0xec22dfb1, 0xe42f8fc8, 0x323f70c6, 0xb182ec8e, ++ 0x7325defd, 0xbe9645dc, 0x2a3bdbc7, 0xf41f06fc, 0x43f8312f, 0xf6e589ff, ++ 0xdb8e252d, 0x1acc5063, 0x8ff279c2, 0x1e179f76, 0x30f9cc9d, 0x4e9e019a, ++ 0xb47f7f6e, 0x24e8f817, 0x45fdb8eb, 0xa2afb794, 0x32575d68, 0x4bd1c3ea, ++ 0xbcf901ed, 0xfdcf8f32, 0x8adfe7ca, 0x92fb4276, 0xbc12bbad, 0x92bbf841, ++ 0xe1eabf99, 0x2efc4ceb, 0x77331f9f, 0xb07a460e, 0x39278f17, 0xe1792ca1, ++ 0x07ce04d5, 0x3a026eb0, 0xee7a122f, 0xc828f80f, 0x5c592eef, 0x1d1a2ee7, ++ 0x8776d7a8, 0xdd705f33, 0x25c561dc, 0x14776d71, 0x6b183f3d, 0x603e404f, ++ 0xd43f58fd, 0xebe27d37, 0x7c69f102, 0x77b9f12e, 0xf40cf1d4, 0xc3ecbe2f, ++ 0xe05abe2f, 0x97ef87bb, 0xd945dc78, 0xdf9bfa81, 0x43b9b7a8, 0xfa2e1bf4, ++ 0x9e5d719d, 0x895f7e8c, 0x11c83fd5, 0x23e11e32, 0x7a788c38, 0x24756ce3, ++ 0x6ec7fb8e, 0x7050a4db, 0x7d338a0d, 0x5ec1f8bf, 0x2fc82a80, 0x267b318c, ++ 0x64ff71c4, 0xd7a834cd, 0x4c533b0d, 0x2fc96ceb, 0xc95def42, 0xbf28edbc, ++ 0xf490fe46, 0x74138a2e, 0x4869634b, 0x939c7b37, 0x07908df3, 0x3c461f29, ++ 0x56c9cb1a, 0x1eb509e6, 0xd783dfe8, 0x7d05e670, 0x0b7afb78, 0xceb7f9d9, ++ 0x347d3c7e, 0x75d1fbf0, 0xf832c716, 0x76279ce4, 0xef0c3fa5, 0x39b28ce7, ++ 0x751fa814, 0xdca107fa, 0xbaa13f57, 0xae8e1f91, 0x26693dbb, 0x7e400fae, ++ 0xea8e006b, 0x3e7a16f5, 0xf41dfd67, 0xeb90b8fc, 0x871227ea, 0x6b7cbea3, ++ 0xa424aaf7, 0xee6f9ce3, 0xd974819d, 0x1f0c756a, 0x16cd6505, 0x84145dc5, ++ 0xc21b79ef, 0x26adf575, 0x21e70736, 0x4f14cae9, 0xc0277bcf, 0xe99c4773, ++ 0x7e9df9fb, 0x7e09dfbd, 0xdc711de6, 0x0ebb2fbf, 0xe6375de6, 0xbbf7f90c, ++ 0x7b208b5e, 0x4a944af2, 0xd47fa47e, 0x32f37dff, 0x637e17a8, 0x278f9176, ++ 0xd0513ce8, 0xd2623c19, 0xbc6155db, 0x9982f85e, 0xbb42d0fc, 0x83f6f84a, ++ 0x23222d5e, 0x844d45af, 0xfd923f76, 0x5c8f09d4, 0xc626ed0e, 0xa1da1858, ++ 0x95e7f91f, 0x5793b030, 0x760f9b75, 0x80a7cd06, 0x8bf46669, 0xf74599f3, ++ 0xf444657c, 0xc2d7e853, 0x87b46660, 0xf7fa6185, 0x7b5d0713, 0x8989fd1c, ++ 0xc973fd0e, 0xff208f7f, 0xc6f40645, 0x7f3ed7ae, 0xb3cc3268, 0xfe4aaf6a, ++ 0xf2f4f9f4, 0x6caf38db, 0xe51bf7a4, 0x5bdfa05b, 0x9d6f3b02, 0x153cba3d, ++ 0x614f2bf9, 0x7a3ae718, 0xfe5cb436, 0xc615e855, 0x0343ce80, 0xcd752e74, ++ 0xd8a3a9ed, 0xd05bc94f, 0x2ff84753, 0xbb7d9f5c, 0x67129abe, 0xda30f925, ++ 0xfcfca30f, 0xc947ecb7, 0xbc3357a8, 0x877f2a76, 0x5cad89e5, 0x85f51aff, ++ 0x37f45ed1, 0x9d80d9e8, 0xa2767550, 0xc493ea3f, 0xa5617b60, 0xfae03ff7, ++ 0x07a953f8, 0xe0c7d783, 0xbcbe10cf, 0x2eb4cd63, 0x20ebbf07, 0xe5111bb6, ++ 0x9007cf8c, 0x22b23b96, 0xdb65af51, 0x05c59f3d, 0x6f86a5c5, 0xfea13669, ++ 0x58d789e8, 0xb91b71f4, 0xc7113d7e, 0xa15de6f9, 0x4afd61d7, 0xcfe97eeb, ++ 0xfa563f4a, 0x197c72af, 0x67ca6b07, 0xcb106e3c, 0xa1acebfd, 0xc603934e, ++ 0x4524b95f, 0x7cfc0c3b, 0x952712df, 0x5d50e86c, 0x72fd17fc, 0x19dde7ec, ++ 0x4cfaf341, 0xb9448f71, 0xe684a95c, 0xc1789caf, 0x7e4dcc3f, 0xbb3e7c80, ++ 0xcebeb420, 0xbcd33788, 0x31bd1ff2, 0xcfb4fd03, 0x40ca6fda, 0x2199fa3d, ++ 0xbf17dbbe, 0xf1e4283f, 0x622f617e, 0x01e01c45, 0x83a81394, 0x695b6b34, ++ 0x9b926e9e, 0x40dc96fb, 0x164bc3e5, 0x9f167bd3, 0xf23af049, 0x040f73df, ++ 0xad5e1dfa, 0x6d983d92, 0x858e0f75, 0x4cc3877e, 0xd4384f14, 0x7b693510, ++ 0xb4673e14, 0xe8fd9c7e, 0xe0de8de4, 0x47989f38, 0x89ccf35f, 0xb8f66eff, ++ 0xa3467596, 0xc7e1ea5d, 0xf2ecbd7d, 0xb889f165, 0xc24cec5e, 0xc74af576, ++ 0xd8b42de0, 0x8e08caea, 0xb5db55cb, 0x62d76c1c, 0x2e51c365, 0xddb8225a, ++ 0x3e39c231, 0xcad9f39e, 0x5f054325, 0x80c3b4b8, 0x7fa37faf, 0x433ffd07, ++ 0xee82157b, 0xbf7e8957, 0xc5576bb4, 0xc8a3fd13, 0x0079a74f, 0x68c6a4bf, ++ 0xd61cf805, 0xd0f14565, 0x8f326c6e, 0x77663dcf, 0xf0a3ecf4, 0x9afb8df5, ++ 0xb7f110f8, 0x463de2be, 0x3c090e38, 0xb240e31b, 0xe9a07194, 0xf2c166b0, ++ 0xb507388b, 0x8c217197, 0xff8a877f, 0x7ae78d6c, 0xd4d34533, 0x72df6748, ++ 0xe839eb97, 0x75ce3155, 0x7b217303, 0x69684f25, 0x6a57f8c7, 0xc6296f91, ++ 0x8d629ac7, 0xc70de872, 0xc7965975, 0x7685e494, 0x7c9e1d49, 0xbdea146b, ++ 0x992f8224, 0x7a452c35, 0x344c7ae5, 0x11dddce9, 0xa62e453e, 0xa168c9a1, ++ 0xc342411f, 0x4506de51, 0x7e10167b, 0x62343567, 0x86ad3e3c, 0x571c33ef, ++ 0x30e2033c, 0x446afa0e, 0x99777f48, 0x0a531fa0, 0xf814b1fa, 0xe10b06ce, ++ 0x2fc37721, 0x7378456f, 0x566d5c37, 0xbf21e282, 0xfb50b789, 0x1bceafe3, ++ 0xbf89f140, 0x667658d8, 0x151f71ef, 0xf029dee3, 0x9a1acdbd, 0x7a121eef, ++ 0xe9eb3be3, 0xf473f04e, 0xf8a1fa7a, 0x5d5a78a0, 0xd3d269ed, 0x3edcf175, ++ 0x796e6e3c, 0xf3e01fad, 0x85cc59f1, 0x69b79f78, 0xb759c53d, 0xc1ae5b59, ++ 0x9d6f267d, 0x65bc6189, 0x7a7f6bf7, 0x89fa1fad, 0xd0a39cb3, 0xbfe9e83f, ++ 0x3e137377, 0x1b0e7c7f, 0xf54ff885, 0xdc60a83d, 0xcde19fe5, 0x6e7faf84, ++ 0x30a5b1b4, 0xb6efb9a5, 0xa853f35c, 0x3131adaf, 0x79c62bd4, 0xa62c97c3, ++ 0x16fd2c14, 0x3fa71e53, 0x77493fea, 0xd22b2c60, 0xf10dd243, 0xddca15b7, ++ 0xf8279f1b, 0x308b5c25, 0xe7063dbe, 0xe41af5b1, 0x71357e93, 0x2401c60a, ++ 0x4ed7df5c, 0xf3f680fc, 0xf110f8d5, 0xf3f610e5, 0xb4676c0d, 0x99bb469f, ++ 0x22ded76d, 0xfb1e77fd, 0xe1f04339, 0xf43f420b, 0xbee063ec, 0x4cba0857, ++ 0xd715ef8f, 0xb9e104fe, 0x7176b8d8, 0x3627df3c, 0x5b37b5c6, 0x8e6d1eb9, ++ 0x0d4db763, 0x02f90f21, 0x5d23d35e, 0x098bb456, 0xbd484a6d, 0xeb9d98f4, ++ 0xa79bd025, 0xdf720f10, 0x4357a8c3, 0x389ff7e0, 0xfc5b619f, 0x4e55b13b, ++ 0x7448a0ec, 0x07392ebb, 0xdf10d5eb, 0x87c08ff9, 0xfda31173, 0x2303674f, ++ 0x1f75047d, 0x15f9ee0f, 0x8f403fd4, 0xf9ee3873, 0x756e9ff6, 0xc9bf13e4, ++ 0x6245a6fd, 0x6f7e48df, 0xd3a70250, 0x3c2d0ead, 0x8bf71121, 0xd8fbeb42, ++ 0xdfce4504, 0x13fd0091, 0xbedd3116, 0x494fdc8a, 0xd62af068, 0x8c2b345c, ++ 0xe203a4e2, 0xd02d4b3d, 0xe672ebae, 0x31ea0a7a, 0xd47c8ee5, 0x5c737197, ++ 0xd2efb8ed, 0xd5c79274, 0xdf30169b, 0x1f282532, 0xdbe593c0, 0x16e9c998, ++ 0x7697aebc, 0xec0fce45, 0xc381339d, 0x5f658595, 0x9407eef6, 0x85c2572b, ++ 0xb063a5f9, 0xfdd285dd, 0xaf3e04ca, 0x59fdd1f3, 0x21efd707, 0x109857be, ++ 0x4f80cf82, 0xcf12128a, 0xb1f127cf, 0xf94fb717, 0xfdf2a445, 0xf1bdcbd6, ++ 0x0842737a, 0xc4bab57d, 0xf38cd434, 0x50ae1164, 0x212eaf76, 0xbf9dbfea, ++ 0xbae02751, 0x278dfca8, 0x4569d17f, 0x07fdcb3a, 0x6f31af09, 0x6d1e67a3, ++ 0xf75c68ca, 0x4b3aefe5, 0xf6a9f9fe, 0xef3fc9af, 0xbfc17f9d, 0x00f910bb, ++ 0x46a899e0, 0x5e9cfc91, 0x2a09e3c7, 0x026afe73, 0x58f7cdc6, 0xfc49cf98, ++ 0xcd0bfe4f, 0x19a7ea17, 0xfdb1f973, 0xe3d93b16, 0x1267d7ea, 0x4cf2639e, ++ 0xaf8419cc, 0x39822d58, 0x3f15f083, 0x4f574e29, 0xb5d3f774, 0x4b21be4f, ++ 0x73d53ef7, 0xda7dee89, 0xbd5d1c9c, 0x5d78c37f, 0x0b8b01fb, 0xef4cf574, ++ 0x03f6bab5, 0xd5d34c57, 0xd26f9bb3, 0x1e1cdfb5, 0xf3ed14fd, 0x418eb578, ++ 0x6259df30, 0x56d643be, 0x1881faea, 0x6d3f71f9, 0x17f720b6, 0x28f78b9b, ++ 0x89664860, 0xdf30c8f8, 0xb3b8dd3c, 0x0df1f59b, 0x2d7aeb33, 0xe757f00d, ++ 0xa87e5c53, 0xbfd5af57, 0x9ebadb9f, 0xa7d739f0, 0x937f3e7f, 0xadf23ebe, ++ 0xfcf386eb, 0x9468f719, 0xe8253feb, 0xa5e725e3, 0x77c877b3, 0x452db3a2, ++ 0xa770e74f, 0xfc46ce9e, 0x338d0e45, 0xdf7f87bc, 0x4bbb3f82, 0x2dff17cf, ++ 0xf01a75fc, 0x73ca2535, 0x4cf4e508, 0xf71522eb, 0xbe24d89f, 0xf5a67d8f, ++ 0x9d7b91ab, 0xb255f621, 0x7cabed7b, 0x5f1c1091, 0xa72afb16, 0x32ed7f70, ++ 0x6bfb0176, 0x7885febb, 0xb2e581b0, 0x9e5e1e60, 0x3f67ac2b, 0x8fb03c2d, ++ 0x3d5fd462, 0x39e1d876, 0x16f7df8b, 0x1b21f604, 0x98d8f7a1, 0xa708dc8f, ++ 0x79928fdc, 0x869f322a, 0xca79f145, 0xe60f0071, 0x8bcc44c4, 0x75c48b8b, ++ 0x0bddd6dc, 0xf3225d69, 0x87c89869, 0x931fe10b, 0x5fc16d1e, 0x46aec953, ++ 0xbb218e26, 0xb20c4f6a, 0x49df32ab, 0xc6bed5da, 0x7d4efb91, 0x954eca95, ++ 0x94bad1f6, 0x2153d708, 0xc490faf4, 0x8e5f69ef, 0x0ec78af5, 0xe3d20c49, ++ 0x799c7775, 0xe03bf50d, 0x9f9c12fd, 0x53760edd, 0x5fcdd809, 0xbc934645, ++ 0xfaaebd75, 0xd383c086, 0xb898ce61, 0x31fd8111, 0xc213bc23, 0x4d8f28d2, ++ 0x710cdbd6, 0xee1ca69b, 0xe44b8cc7, 0x3b3f547e, 0xc4cabbf7, 0xeb0deb3c, ++ 0x7c15fa86, 0x30d20c7d, 0x5fc82da7, 0x53b44b28, 0xf9910dfb, 0x7af70865, ++ 0xca685f11, 0x4d7be854, 0xddf6428a, 0xc32828ea, 0x90937ef9, 0xb1658a5f, ++ 0xae196ef8, 0xe6bfe1f9, 0x538f0e2c, 0xf1c89be4, 0xfb7913c3, 0x2a02c4f0, ++ 0xc21d12cb, 0x825c728f, 0x52247ef4, 0x6aad71a3, 0xeb96fde8, 0xd13fb912, ++ 0x31ca3182, 0x28993901, 0xe858a6e4, 0xdb5f8c31, 0x92b49848, 0xb8ba4989, ++ 0x04d607f5, 0xa856b711, 0xe6fa86bb, 0xbec7412a, 0x50dad8e2, 0xa7546ec7, ++ 0xeaf638c6, 0x96c71e70, 0x715eee71, 0xc871576c, 0x21d23638, 0x0f202e32, ++ 0xfb3d8975, 0x6fa8e960, 0x469ead5a, 0xed748f5c, 0x1e16bf00, 0x5275f50f, ++ 0xbdd2fb7c, 0xeeb85d03, 0x3b64ca68, 0x4b3fc8ed, 0xb7bf4319, 0x2cb4d3b5, ++ 0xf6afde1c, 0xbfbe0732, 0xcf5f1d7c, 0xba75af54, 0xae529a70, 0x24cc481f, ++ 0xdd6059bc, 0x7ec1cf68, 0xde31dad3, 0x8b3a7abd, 0xccd0b343, 0xd1a30b9a, ++ 0x42c758cf, 0x0956a7ae, 0xdfce4f3a, 0x27fca2a9, 0x851f0176, 0x44aad3a0, ++ 0x57e7f493, 0xeb8d1f22, 0xfbe19cf2, 0x903f5c4c, 0xdb75c38a, 0xe1f9136e, ++ 0xc6f7fec6, 0xfd803e14, 0x8e85f52e, 0x39d8b4e3, 0xba442f1c, 0xb6ed497f, ++ 0x0f515a77, 0x3a7d4b55, 0x40ccc4cb, 0x5d04ebf7, 0xf3c75baf, 0x73d9d813, ++ 0x7fe954e7, 0xa19f1a31, 0x6e9ea89e, 0xa45c61f7, 0x4bd32dba, 0x8a15b970, ++ 0xbdb7d4fb, 0x757ac6eb, 0xd703ae6e, 0x995fdae1, 0xb9286472, 0x23eb8c6e, ++ 0xf5223b33, 0x04d5d903, 0x26994fda, 0xeec5adf8, 0x6f413824, 0x7c048eaf, ++ 0xba5baf57, 0x3e53f313, 0x7da32dfc, 0xd76a7d93, 0xc7ec1c58, 0x39c59c80, ++ 0x39599a58, 0xd0a715e5, 0x38c5d338, 0xbbe1afde, 0xfeef8161, 0x9a75edb8, ++ 0xf30b3ecf, 0x9d1f0186, 0x277ae97a, 0x894db1fa, 0x6be22e61, 0x5fb8dfb1, ++ 0x4643dcf5, 0x8755dcc5, 0x16d8dda0, 0x877cc0e9, 0xdc7d2f53, 0x9fffe31f, ++ 0x1d8cfcfe, 0x99bfc2fd, 0xf798ecbb, 0xf7eeec7a, 0xf3d01aed, 0xca55bbd3, ++ 0xd855ba9f, 0xb7f78901, 0x92b3fd04, 0xef11bbdc, 0x66f92db7, 0x103e706c, ++ 0xfc489c5b, 0xd2a7d73c, 0xde8f52d6, 0x49c604dc, 0x75e367a7, 0x6bd7a975, ++ 0x87d7a1cd, 0xfb97126a, 0x5bd65bb9, 0x7df89cd3, 0xfdf847cf, 0x47ce6663, ++ 0x3e2bb6c7, 0x9e00666f, 0xaca32dca, 0x6feaf069, 0x47e6366d, 0xb0ee64fb, ++ 0xad5f7cf0, 0xf0be0144, 0xe11bfa08, 0x48e5ed7c, 0x2ff66f1a, 0x80a8feb9, ++ 0xfc062d6f, 0x92e6da7a, 0x63ce305e, 0xe2cea7f6, 0xecebc064, 0x3f430a95, ++ 0x0ddfdb08, 0xbe2cf3f4, 0x7fb8eff7, 0x85679c6a, 0xa407af57, 0x7416aafe, ++ 0xff42b99e, 0x3eedbabe, 0xf316671a, 0xd1833e50, 0xbb6ea9df, 0x1bfa28e6, ++ 0xf4e73f46, 0x2861d19e, 0x144aff0f, 0x3658cc7e, 0x6ff41cee, 0xf18aca8c, ++ 0x59279084, 0x20e2589e, 0x497cfd66, 0x96c79518, 0x27772a30, 0x69ae3e72, ++ 0xfd18b77b, 0xadd6ba9f, 0x1d176f24, 0x1e3b6f07, 0xd80b137d, 0x27b318d1, ++ 0xf8f50926, 0x0f17451c, 0xc67f5baf, 0xc0967e4a, 0x5e78b94f, 0x3a00f88e, ++ 0x2b5cccdc, 0xca7d0026, 0xfd812c6b, 0x392ff826, 0x1c77cc49, 0xf0bd57cc, ++ 0xd679caf9, 0xe7257b0a, 0xddfbe46f, 0xdacdaf42, 0x1fa9b530, 0xa5f1a4a0, ++ 0x7c9d19a3, 0xc201f6bd, 0x9aaaf92f, 0x43538bb9, 0x67a48ff0, 0xddb49f0f, ++ 0x7491f34f, 0x215cd59c, 0x114dede6, 0x8c14c4f1, 0xc6f91a27, 0xbe4627c8, ++ 0x99d2d2f8, 0xe46cf281, 0xd847990b, 0xe24c3fcb, 0x9cb33379, 0x09c6315a, ++ 0x13773367, 0x24f12dc5, 0xb39418c4, 0x867ed7e6, 0xf381b672, 0xfd04dff9, ++ 0x29e4977e, 0x9e7e824e, 0x21d4d765, 0x6d4b9ddc, 0x9e7f2819, 0x026aa965, ++ 0x51acf7b4, 0x2c166f48, 0x9e22b54b, 0x551f2e66, 0xc398728c, 0x96ff1a34, ++ 0xced21678, 0xaf790bd7, 0x6b30b06c, 0x1587090c, 0xae4eb5f3, 0x0b5f2850, ++ 0x814ba3f7, 0xb908e62f, 0x6ef95da9, 0x2717d934, 0x698b1bfc, 0x4e67fceb, ++ 0xdde13543, 0xbe4befe8, 0x86a07692, 0x615358b5, 0xdbab79dc, 0xf5c6ff09, ++ 0x4d5b3d40, 0x316daa74, 0x9ab86f3c, 0xb73306e8, 0xbeab3ae2, 0x90deb0d5, ++ 0x2e62e8fc, 0x9dcf47e4, 0xa7cc30f6, 0xa9f8102b, 0x5038ad58, 0xde5ccccf, ++ 0xd43d789e, 0x5d51ee67, 0xfc1e9d30, 0xb4eb5eb0, 0x75079411, 0xad364f7a, ++ 0x9d3b4fd7, 0x13ced8c9, 0x8af1d7cd, 0x9f0e33d9, 0x19ef12df, 0xaeb27187, ++ 0xe619d8bf, 0x86e81d95, 0x25e63b95, 0x9491b184, 0x2360e3d7, 0xd7f906a7, ++ 0x12471615, 0xd97993ee, 0xf7c614c2, 0xf182c37c, 0xbab61f53, 0x9eb6f903, ++ 0x7e62bd99, 0xe88539ca, 0xebaf2647, 0xd7f28505, 0x8bc5ab58, 0xc2c618f2, ++ 0xd7be6296, 0x52736771, 0xdf773c2b, 0x5abd2163, 0xd69625b9, 0x0bcb9597, ++ 0x2b0768ad, 0x3f92c7b7, 0x0fc2eb03, 0xd00d8d06, 0xd1f2c0f3, 0xb8c0a5af, ++ 0x2e992d95, 0xc3c74f55, 0x79c746df, 0xfa480e2b, 0x7e83ee1d, 0x0fd14387, ++ 0xee7ba6e8, 0xdd8dd033, 0xb0764f1d, 0xd9abc17c, 0xe9d70061, 0xcfca7086, ++ 0xc27d6beb, 0x7da78d66, 0x99bf196f, 0xce27afd4, 0x6725f942, 0xfa218f56, ++ 0xe936e919, 0xa1c7333f, 0x6afeca7f, 0xdd17e867, 0x36dd9032, 0xa6df9e0d, ++ 0xa5bb7970, 0x68499af1, 0xe2485ff7, 0xd01de8fa, 0xc610da5b, 0xa57d05de, ++ 0x1f7abe81, 0x3fd619f4, 0xf542925c, 0xa938978f, 0xa192cbfc, 0xf1161e54, ++ 0xc077296a, 0xafb7c408, 0xf6bd7124, 0xf7dc924a, 0x2e82945d, 0xbcffa4c8, ++ 0xbc04c63f, 0x4cf5e897, 0xf825789e, 0x5ede9a73, 0x6f5d30de, 0x8e2d3b0f, ++ 0x5f5c14e2, 0x7fc854ae, 0xa15f74ac, 0x4ecccf6b, 0x60979e2b, 0x9e074743, ++ 0x5a73be93, 0xde3f01a7, 0x6baf1258, 0x9a45633f, 0x9271feae, 0xd4c2f493, ++ 0xcf750349, 0xae1f2a6f, 0x5b7457ab, 0x777e4319, 0x2cfc91e6, 0xb02df912, ++ 0x7174e670, 0x355fb6f0, 0x09fe4b8c, 0x5ed5fbc0, 0xd237bd0b, 0xd675d243, ++ 0x6079955a, 0x416b99bc, 0x878801ff, 0x7c92679b, 0x4ecfb17d, 0x2da688eb, ++ 0x83cedfa3, 0x162d81fa, 0xb0393fca, 0xfa0d7e3c, 0x24b60757, 0x3d283346, ++ 0x43f0aa4d, 0xa416561c, 0x2f970aef, 0x0ac73ca5, 0xfe45cd9f, 0x6fef6ec6, ++ 0xeb89dd64, 0xe5120445, 0xe7d503e4, 0x1a7e8857, 0x387377e1, 0x063b679d, ++ 0xb11e1ffe, 0xe1c9d998, 0xe5b0a63a, 0xfe1e3f58, 0x009fe0c9, 0x9b4b271c, ++ 0x2f184cab, 0x9226f750, 0x654e7cfe, 0x0be5b7c8, 0x3dffb42c, 0x3d7543f7, ++ 0x939299d6, 0x52ade9c6, 0x6cdb2efe, 0x1759f1a3, 0x5bb40870, 0x53db7bf4, ++ 0x338e14ab, 0xd4b8efaa, 0x27f04ab7, 0x58b1d1f2, 0xb012c5a6, 0xf9fbc10a, ++ 0xf1eb89bb, 0xbe9f007d, 0x32ef3891, 0x19323b8b, 0x2af3ebf8, 0x6fd248df, ++ 0x5c922777, 0xd87ef119, 0x1797f5ca, 0xe80940e5, 0x2d9c80cd, 0x69983e23, ++ 0x48b92571, 0xa2a6e56f, 0xdabc3ade, 0x332b7e42, 0x2953d16b, 0xf11cf23e, ++ 0x61cefcb1, 0xe118b3b3, 0x9322bc3b, 0xe57fbee1, 0x17d6956a, 0xbdbc7fc8, ++ 0x1f2baf8f, 0x43e03d54, 0xc50aef30, 0xf37b92c3, 0xc60bedcd, 0xd19fbe51, ++ 0x97e5963f, 0x209eab20, 0x4bde61ff, 0xe58d1f3c, 0x5fa79a76, 0xe58f3c1a, ++ 0x3c9e7bfc, 0x4d4c9e5d, 0x47f79fd6, 0x0fcf5099, 0xfebf418c, 0xf12a07f8, ++ 0xe6acf1d9, 0xcf4029b1, 0x639da613, 0x2ff5027f, 0xcc47bd4a, 0xe116df50, ++ 0x78c64bc9, 0x86756986, 0xe4f98592, 0x015cd687, 0xc67f3efd, 0x173122e2, ++ 0xcdbcf97e, 0x9b7c0773, 0x46fe043f, 0x6877ee3f, 0x73e00aa9, 0xe0c5b3be, ++ 0x38fc700f, 0xf0013931, 0x414478e2, 0x1a1d8b5f, 0xeb855f63, 0xe62699e0, ++ 0x0fdff609, 0x31bfb859, 0x15eb9939, 0x983c37e9, 0x3312e3cc, 0xd9bf9c4d, ++ 0x37e70acb, 0xed82a3f0, 0xf3dbd480, 0x0d579f31, 0xb7a901d8, 0xe533586b, ++ 0xcc9adc55, 0x8ab997fd, 0x3ae4fc8f, 0xf68090cc, 0xe9be0e55, 0xe6c9b353, ++ 0x98d265f3, 0x60ff608e, 0x27d7327d, 0x3ccfacf3, 0xcd5bec8a, 0x0d3cf83a, ++ 0xf8b73eed, 0x7b323aaa, 0xc72a9fdb, 0x3471e5fa, 0x7185c5be, 0xaf216ad2, ++ 0xcf8acdb5, 0xb70a7e4f, 0x399e32a3, 0xa351d85b, 0x9765ea7d, 0xb668f60c, ++ 0x66b2eec1, 0x78059dbd, 0x84acbce9, 0x3ba708d7, 0x98784ed2, 0xfda17007, ++ 0x5ef8f2ad, 0x15b8232b, 0x17b45017, 0x16bfe03c, 0xe03ce2c5, 0x1bd9dfbd, ++ 0x7abce33e, 0x69e62bc1, 0xf5cabb84, 0x4b9abf77, 0x2f8494f9, 0x3d243ce3, ++ 0xa49c7e8c, 0xe397954b, 0x214daab7, 0xe3d67e7a, 0x2b8a321f, 0x2d61be4b, ++ 0xbfa82ff0, 0x579823e4, 0xeab7ea19, 0x671f4047, 0x79a7e6f6, 0xf91a25ac, ++ 0x9bf98ea6, 0xee3f7fd0, 0x3971996f, 0xbdd605c6, 0xf29deb4b, 0x29b67f38, ++ 0x7de95016, 0x5749bef7, 0x88dcf806, 0xf7d1f3ef, 0x670fe2bb, 0x71f19667, ++ 0x0decd7c0, 0x523e16aa, 0xdde44ed7, 0xe61e4979, 0x8c56bd78, 0x7111ce87, ++ 0x59c1f3c5, 0x2ee7e66f, 0xc0af0bce, 0xf70d0fe7, 0x0e22c93b, 0xcaefcbd6, ++ 0x938eb90e, 0xe844fcf3, 0x7bdaf399, 0x467aebb3, 0xc1513ef6, 0xfa5f4178, ++ 0xf9d84abb, 0xa1f768d9, 0x1b76b23c, 0x7b3febc5, 0xcfed1b64, 0x1d999f59, ++ 0x91f87e8d, 0x60d733b5, 0x2d91e3fe, 0x57cec933, 0x79da5aff, 0xc107af58, ++ 0xe2b6b85b, 0xdf239fc9, 0x4ca70a6e, 0x1eddaad3, 0xbd020eb1, 0x6b9ced0a, ++ 0x8f651eb9, 0x8d5abd70, 0xc1e290f6, 0xeed8219e, 0x10cf2ace, 0xe7a0ffe4, ++ 0x9cef2764, 0x4bc3f9e9, 0x4f9dee30, 0x34bcba47, 0x44df8765, 0x8fc3bbfe, ++ 0xe176b0f6, 0x3cf1fbc7, 0x0fffd808, 0x1ff692ef, 0x9ecda7aa, 0x4b0ed06f, ++ 0xaeab5fbb, 0x9fa070cf, 0xffc4ec20, 0x112bbe36, 0x715fe4df, 0xc15c1f7c, ++ 0x35687cf1, 0x96d37bc7, 0x7eb8d181, 0x2062b83c, 0xb70755f9, 0x67be1364, ++ 0x937c02ad, 0xfbd4ed5f, 0xdf002b55, 0x7c407eb8, 0xbb955c03, 0x2edf029d, ++ 0x1c15ef8e, 0x2f356ccf, 0xabc2f567, 0xee7ff297, 0x85cdadfc, 0x70b1c27e, ++ 0xc74ff93f, 0x31acaab6, 0x7e92efc8, 0xf3583fcf, 0x933fd06f, 0xb83b9ef8, ++ 0x97ea2463, 0x1cff07f2, 0xbb9f788d, 0xf5ba6f95, 0x92d337c2, 0x7c0effd1, ++ 0x724fc7bf, 0xf2098ca5, 0x2e902e93, 0xc8cdcc75, 0x79fdb5fe, 0x1413ae1f, ++ 0xea1fc78d, 0x56a639e4, 0xcc2639fd, 0xc38f2a65, 0x2c2b8750, 0x3749e10c, ++ 0x30f2d39e, 0x67fa57dc, 0x5d6fdff6, 0xa5dc7248, 0x632d07cb, 0xbfc60b7e, ++ 0xe7428b58, 0xe5176b7f, 0xdc33e747, 0x38206ab7, 0xba28a5e6, 0xd55adf7c, ++ 0x8d62fe44, 0x328dfb95, 0x0a6a606f, 0xa6a607f7, 0xb4ff75f0, 0xa7950714, ++ 0xfbe919c2, 0x0fab7653, 0xfac0e9cf, 0xefbf0529, 0x7446c97d, 0x01308fdb, ++ 0x88ab55fe, 0x43a982fb, 0x7199bbfe, 0x6a39bc7e, 0xc19bed0f, 0xb409e4ca, ++ 0xb62cb77f, 0x4d8fc8b9, 0x9bfda188, 0xbb3e849b, 0x8dc9aa39, 0x2896e076, ++ 0x8c2586ab, 0x53a4c5eb, 0x1e7c014b, 0x67e96fbe, 0xf2aa3ca5, 0x7067ceb0, ++ 0xca5b7bc9, 0x00c23ba1, 0xddc0cbd4, 0xfc2cb8c6, 0x7c5cfdba, 0xe804ba6f, ++ 0xd7138fa3, 0x7b8e8447, 0xa0f02edc, 0x83c51a68, 0x0476306d, 0x8a6771c0, ++ 0x3a773f93, 0x1d787c78, 0xa01ec9d0, 0xf339f1af, 0x1ac1fdf2, 0xcf1dfbcc, ++ 0x11e48338, 0x1af575fe, 0xff7f7f2b, 0x3c951fda, 0xf7b18132, 0xa452f398, ++ 0x0cea0d5b, 0xc457d75c, 0x6cff70f8, 0xe3a7c60a, 0xbf1334b0, 0xaf33334c, ++ 0xa22b9789, 0xc454a730, 0x3e04cbab, 0xfcc79c7f, 0xff778031, 0xf978faeb, ++ 0x7f937ef5, 0x8a77e008, 0xfc8edfd9, 0x5a730a69, 0xf71df01c, 0xd7072524, ++ 0x2ecb3521, 0xdadf5e0c, 0x1ade086b, 0xeca7cf13, 0x1fc78bba, 0x4561066e, ++ 0x666addbc, 0xce1cd5bb, 0xfa978807, 0xda97a738, 0x3f68502d, 0x25e9c645, ++ 0xf0c147fd, 0x59bc74c1, 0xace307c0, 0xd6fec688, 0x92daf4d0, 0x2dcbd722, ++ 0x2f9e8eb4, 0x94be6ee4, 0x797a2db7, 0x84748bdb, 0xbdfa0af6, 0x459bb780, ++ 0xbc5c97d9, 0x3d7fc62e, 0x9fcfaf85, 0xb1efc8bf, 0x2c3f9e28, 0xc6d6a5e5, ++ 0x9fdf97c7, 0xe33fca22, 0x00c4afc1, 0x07afc03c, 0x68131c71, 0xc3d7e400, ++ 0xffe48dcd, 0xfb4161cc, 0x76819962, 0xd77baf92, 0xe988f47b, 0xaed6961c, ++ 0xe57a8859, 0xd42ee147, 0x5b5b37a3, 0x7aa21bb2, 0xb8fb93b7, 0x42c3ace5, ++ 0x38c8cef7, 0x1333b098, 0xdbca28d5, 0xf9f85729, 0x76f953da, 0xc0fc09af, ++ 0x213dc44f, 0xc42fc1a7, 0x2ac794ef, 0x4b74df94, 0x28659dcc, 0x56d1e5d7, ++ 0x889f9633, 0x656e447b, 0xa7fe345d, 0xeb98ac8e, 0xaa4de619, 0x000707b8, ++ 0xf704b4fc, 0xff511a41, 0x6d6afaf0, 0x449b4502, 0x0d5ec97d, 0x2cfd31f0, ++ 0xbdd501f0, 0xf77c1a25, 0x3de2abd4, 0x4ffd4a5b, 0xd9f823dd, 0xffaf0f7b, ++ 0x555fbe52, 0xad4ffd82, 0xf0d7ef94, 0x7c72fdfa, 0xf0d07f51, 0xfde1a97e, ++ 0xf5febc63, 0x5e2535da, 0x380b4ff4, 0x578f976b, 0x42695f48, 0xf32f946f, ++ 0x4dcb9e13, 0xc059793b, 0xf3dca6fc, 0xea9c1bb7, 0xf11252d6, 0x3b61f33c, ++ 0x69d1e1da, 0xc976869a, 0xa4b1ec99, 0xaa69bae2, 0xdea2b5e2, 0x7647c0fd, ++ 0xfc8faca1, 0xf5e84d3e, 0xd4dcfd21, 0x1831da5f, 0xf1353a27, 0x21d9c7e2, ++ 0x271a0ae0, 0xd3c0bbf9, 0x38d7afd8, 0xcf02efce, 0xd238c371, 0xd74a69cf, ++ 0x58f1c0ae, 0x78ba15d1, 0xb85ffce0, 0xc4ee3062, 0x500b9f30, 0x4b597f3f, ++ 0x7f1868c6, 0x642fb3fe, 0x255fa154, 0xb75d7dec, 0x47d034ca, 0x950addf5, ++ 0xc5ffb45f, 0xeb31e78a, 0x8b5bb7b6, 0x943d5da1, 0xd5704185, 0xdec13808, ++ 0xd905a799, 0x24d52d69, 0x3c83c6f4, 0xe3d9ed9f, 0x7ce7a466, 0x5f91cb53, ++ 0xaf1efda3, 0x1defdc84, 0xb7e7ca9a, 0x7c3c8fbf, 0xf180e4da, 0x26d0caee, ++ 0x6087fe22, 0x0bd4046e, 0xdfef431b, 0x28e0203f, 0xe66ff617, 0x13987b58, ++ 0x03e63cf0, 0xb55ddfbe, 0xe307332e, 0x05c945c1, 0xbebc7053, 0x3c5da8e3, ++ 0xe3c6da8e, 0x1d71e5a8, 0xb389408b, 0xaecfa955, 0xd975830e, 0x39495fe4, ++ 0xbe859103, 0xfeb26c93, 0x3a51496a, 0xbd61738f, 0x5797b1f6, 0x41ecdca3, ++ 0x3e6e3078, 0xd408d2ee, 0x91999d0f, 0xe9c60726, 0x21562a93, 0xbb8cb71c, ++ 0xe79f18b2, 0x2b83ecdb, 0xf89e5c78, 0x3dc920a2, 0x7b63df1b, 0xac787f8c, ++ 0x61ebc4fe, 0x54379e1e, 0x8cf28bca, 0xda84f48c, 0xf0299ebf, 0x41d52aba, ++ 0x0263d8f8, 0x70027338, 0x1f83efc8, 0xc603a8bf, 0x752cbc3b, 0xee272ad4, ++ 0x24afe4b7, 0xffdf127e, 0x4ee7925d, 0x1fefcbac, 0xb8c1b136, 0x3850b894, ++ 0x58f4176e, 0x78037489, 0xdf8013dc, 0xd373d682, 0xf575228a, 0x4cf125e9, ++ 0x4ecf8e0b, 0x6fd5d34f, 0x6ba81f28, 0xe1acd37f, 0xb6a5f7ba, 0x2086dc8e, ++ 0x7f6fb67f, 0xd5704bc9, 0xe811eddb, 0xf6da7dd7, 0x466e8f8f, 0xea83703f, ++ 0xee759f42, 0xba3f1b4b, 0x9a1e5182, 0x47714f16, 0x3ec9c527, 0xf232a3df, ++ 0x399accef, 0x24e87f78, 0xf71478eb, 0xf5bae50b, 0xe685f742, 0xbe53763b, ++ 0x1fb50fd8, 0x58aa74f4, 0x1cb0e6df, 0x1ba78fb4, 0x5d78a43e, 0xe79f145d, ++ 0x580e17c9, 0xf302af31, 0xdf01ce14, 0xd11d8d5f, 0xc506ec5f, 0xd85ff20f, ++ 0xd1f6807a, 0x72754dae, 0x817d3f7f, 0xd5e5cf19, 0xa0f68943, 0x0c56f418, ++ 0x3b474df0, 0xe63b74bb, 0xb9da6471, 0x1d7dde5f, 0x44f7c3c5, 0x9eceb8f0, ++ 0x9fba58a4, 0x6b8afe60, 0x775d79e8, 0x8eff8d24, 0x794c51da, 0xb42bcfbf, ++ 0x769a50ff, 0xcf9c32cb, 0x88ef089e, 0xa5bbe1db, 0x127ab87f, 0x3b6eade2, ++ 0x552f63cf, 0x005dcbdf, 0x35f34d65, 0x6554bfd4, 0x1ff0147b, 0xa66fba62, ++ 0x07d14b71, 0xd63aba80, 0xb2ed0abe, 0x7e0ff56a, 0xd58df51c, 0xbea6fa4e, ++ 0x4dfa9c3b, 0xfbf6e42e, 0xffee5483, 0x5c393a5a, 0xd2a7bb13, 0x7f17c97b, ++ 0xe5d2cd4d, 0x37125b97, 0x1b1ef198, 0xed42a74b, 0x4e1eedaf, 0x1bef9ca5, ++ 0xe74b7f43, 0x5f892dd6, 0xe05e6315, 0x838a091b, 0x3e8312dc, 0x2e30d33e, ++ 0x57d08586, 0xe6e9df3d, 0x6eb6b4f9, 0x207b5f9e, 0xb942eb4d, 0xd3bbbb2f, ++ 0x2c41fb8c, 0xf881cc2a, 0xe51bcb2a, 0x33920aac, 0x568de775, 0x91e58fa4, ++ 0xff68ad77, 0x0616506d, 0xcdfb97bd, 0x4ffd7d46, 0xfde41fa1, 0x7a3d6560, ++ 0xf3f882bd, 0x50608756, 0x84874721, 0x1dfecb1c, 0x3a01c6b4, 0xfc71e0ee, ++ 0xe13cd3af, 0x477de0fd, 0x39e1bb3e, 0x191d9fd2, 0x43f30fb8, 0x0e740fc1, ++ 0xec6fc853, 0xb2f1bca4, 0xe309a73c, 0xa4fdd1ff, 0x7cf2e1dd, 0x5bfc79be, ++ 0x951de3cc, 0xdf71c62d, 0x0eaaeab9, 0xff6bc60d, 0x68d1e8d9, 0x0777e417, ++ 0x7bf7e3f4, 0x59d74731, 0xbfd61f5c, 0xb944e91c, 0x19c5c52f, 0x64be7bee, ++ 0x3c0b75a3, 0xfa8cfda7, 0xe14f6d97, 0x68faab79, 0xf7c2bf58, 0xf7095f0b, ++ 0xbfb71f23, 0xfb466e12, 0x67864cf1, 0xf0a7e200, 0xb8452195, 0x6cdad45e, ++ 0x8ffe4666, 0xd897ece6, 0xd3e7bc37, 0x933e465f, 0xc159e9f2, 0xf042a5e5, ++ 0x3f90a569, 0x33a3908f, 0x8724c90d, 0xa006ee67, 0x6ef4bf71, 0xe8edd2e5, ++ 0x74ed382f, 0xcb9499df, 0xc11f5c52, 0xb1e1d2f3, 0xd35fa794, 0xc393ab1d, ++ 0x214ceeda, 0x5cf4f1df, 0x90a55bca, 0x2ff09b13, 0x96be0966, 0xc7948b7e, ++ 0x771ee9f1, 0x6973c03f, 0x347dc823, 0xa2e7ebed, 0xc6f8053c, 0x02fe40ea, ++ 0x0aa949be, 0xf6c69f92, 0x29fa191b, 0xf13704b6, 0x83282ccd, 0x3dd994fd, ++ 0x4e28e07c, 0x96cbf802, 0x7cf09a67, 0xe3ff7ca0, 0xffc7177e, 0x657da205, ++ 0xfd1b3f94, 0xb8434b5a, 0x9c7bcf0b, 0x3dfbe04e, 0x3c72570b, 0x0bb8b42e, ++ 0xf858cfd1, 0x32f14298, 0x2f503ff4, 0x60d7dd8d, 0xdcab8e0d, 0xf6923dd8, ++ 0x1eebafcb, 0xb2516544, 0x41f22667, 0x410cf745, 0x69df91af, 0xc68c717f, ++ 0x9f164ae3, 0x133eb5cd, 0x151e4ae3, 0x3fac7ce9, 0xbc1c3c73, 0xa556b79f, ++ 0x77dc9878, 0x1b267194, 0xb209a79e, 0x3730ffa7, 0x273dd067, 0x3e53b8c6, ++ 0x3627ffb7, 0xd7fec858, 0xd637bfb4, 0x573fef01, 0x9ed193f2, 0x3f3c5994, ++ 0x9bccf9c7, 0x02d67be6, 0x6ff7f9f5, 0x19dcbe8b, 0xd98b67c0, 0xb4f68d9f, ++ 0xf188f005, 0xead596af, 0x7bf71f24, 0x193ef922, 0xcfc96fe7, 0xd79f3e46, ++ 0x73f0903d, 0x7646c1a6, 0x2df00ce8, 0xd243b20b, 0x2f3d48ee, 0xebe48fed, ++ 0x5fd7335a, 0x943151b5, 0x3bb015d7, 0xc8f9dd53, 0x7e794377, 0x3ceec05e, ++ 0xca3c66b5, 0xca04a9c1, 0x4376966b, 0x4bf3c1ca, 0x479f2852, 0x072925da, ++ 0xfd4b9f52, 0xda5ef92e, 0xffa782ad, 0xf0afedbd, 0x9e697deb, 0x6baf88ad, ++ 0x5d7edccd, 0xff13b66b, 0x6a984c4c, 0x70b9be46, 0xe8407a3d, 0x3d3a03d1, ++ 0x1d87d75a, 0xfe8f63f8, 0xd83930bc, 0xb24fda20, 0xf5123f71, 0x5f78f07c, ++ 0x8ebc15a7, 0x1fbb78f3, 0x287fdbf7, 0xffd2fbb8, 0xfea45f6f, 0xf1c8517f, ++ 0x81fff4f9, 0x9cbcfc7e, 0x0733df51, 0xd4ea7fbf, 0x687cc34b, 0xb033f60f, ++ 0xdb07680f, 0x851b9d22, 0x117b203d, 0x36fbe311, 0xc657707b, 0xf7a803cc, ++ 0x8383d842, 0x777cc6fd, 0x4bf9207b, 0x13948dca, 0x39461729, 0xf9317292, ++ 0x222f583e, 0xe7e1de9d, 0xdecd6a7f, 0xe8cfb42d, 0xf2851c8c, 0x6dc7e3d9, ++ 0x7ade4857, 0x3f2109d9, 0xdbd17901, 0x521f290d, 0xd4fca45e, 0x2d98f90a, ++ 0xc5ca43e4, 0xe1e5b52e, 0x2eafd0f1, 0x369f13cd, 0x35272026, 0x43ed19cf, ++ 0x91857c9f, 0xa13b3646, 0xd55f2181, 0x57cc1942, 0x21e43eb6, 0xe4e2ed25, ++ 0x61769ac1, 0x34f0c4fe, 0x17fc4fee, 0x5a7869f9, 0x4462ff68, 0xa7e0f7da, ++ 0xc7ec7ede, 0xe7804eb9, 0xdbe82e4c, 0x4dbf00cc, 0xff71937e, 0x0f5f2061, ++ 0xe0933ac0, 0x4fed63de, 0xe7c99ff1, 0x51e20358, 0x45b303fa, 0x69f241bc, ++ 0x0801f82d, 0xae3fa4a7, 0x985c1607, 0xdb3a23de, 0xb8ac3a12, 0x650d993e, ++ 0x97d01fb0, 0x8be3fbff, 0xda6173a4, 0xaa8de985, 0x6fdc1fb4, 0xae83eaac, ++ 0xae87dfd5, 0xc44c85a5, 0x5aa5fc2b, 0x01e7d03a, 0x2aeef751, 0x91997945, ++ 0xdfb7df27, 0xfd420daf, 0x9c9c64c0, 0xa8ef1de2, 0xadf3beb2, 0xf93f6822, ++ 0xa3881661, 0x1389fbc3, 0x23e27a62, 0x6fb40b0a, 0xade57b4a, 0x66e784d5, ++ 0x69d29791, 0xa241fbe6, 0x7b750b9e, 0x50cf3d50, 0x47dbc75f, 0x70593b9b, ++ 0x8df208be, 0xece9c392, 0xe01ff20e, 0xa0cfbbf3, 0x0c2870bd, 0x09f51be3, ++ 0x833d5feb, 0xa155ad7a, 0x3c1ea9bd, 0xc528df78, 0x3bdd2bf8, 0xdfb7f54d, ++ 0xb4df79c2, 0x799fd79d, 0xbdfbbdfc, 0xd06e3166, 0x8b4b1cb9, 0x41be51a2, ++ 0xcacbe29e, 0x67ef8dec, 0x299fa4d2, 0x6e7461e1, 0xc33fa820, 0xe98bbc7c, ++ 0x9cc793df, 0xb6fdfd45, 0xf5fef88b, 0xa79f4213, 0xa1e425d8, 0xe4263728, ++ 0x54d337fb, 0x37117dfe, 0xa3c3efa0, 0x9f425aeb, 0x7c5f7f37, 0x4ff703b7, ++ 0xde5f9f08, 0xb0edf88f, 0xa49f7c4a, 0x74c644fa, 0x3ef83471, 0x7e3ff7d5, ++ 0x998574b2, 0xe033574f, 0xbbe6dbeb, 0x0fef4d35, 0x7a066fd0, 0xdf05bed9, ++ 0xdbe0423b, 0xffefefa9, 0xd8bd7a36, 0x6f82fbeb, 0xd63e48e7, 0x631efc74, ++ 0xc67f1376, 0xf40e2824, 0xe1dceba3, 0x10bd71ab, 0x917fcf90, 0x7dc8767c, ++ 0xf7f25e82, 0x5fca2975, 0xcf1e0f5d, 0xd07a8fde, 0xcf69ea6d, 0x35f251e5, ++ 0xbc02351e, 0xfa0fe852, 0xfbfda777, 0x024f8c7e, 0xaa7bd05f, 0x36e0839b, ++ 0xa18b63ca, 0xbf20c13e, 0x7f48fe42, 0x3c003da0, 0x4b7ea365, 0x06756038, ++ 0x3a7249f1, 0x9149f3c7, 0xc051de2f, 0x2c8ec9fd, 0xe74b8e5e, 0x7480e3fe, ++ 0xa221cf8e, 0x1044477d, 0xfc75d21e, 0x4b75c7e3, 0x4f09bcd0, 0x79482637, ++ 0x012b2b4e, 0xe388ee79, 0x4bad47ef, 0x109de35e, 0x1bc71ba8, 0x0cad2ebd, ++ 0xbe33d2f1, 0xd46df537, 0xbc0a378b, 0xefd75b8d, 0xa0946f6d, 0x3ee05273, ++ 0x2f0fe04f, 0xe45a83ea, 0x1e84250f, 0x5e9fcdee, 0xdfba7f43, 0x96feafbe, ++ 0xa9fc5ef4, 0xbc33fa19, 0xfbc2e0af, 0x1895ba0b, 0x40c93ae8, 0xbd4322d7, ++ 0x3a7dd65c, 0x72f52bfd, 0xf783eb65, 0x5c602524, 0x41e3a153, 0xa4be7e01, ++ 0xbe7ee50c, 0x70eff243, 0x9f806bc2, 0xfc8dbc47, 0xf245ad3b, 0x346ba5eb, ++ 0xa8a9c7e0, 0xea07c787, 0xa21ea1d7, 0xed32c8fa, 0x757b60b2, 0xdbd41ad9, ++ 0xed90afd7, 0xa6fed45d, 0x51bc72e5, 0x91d25ef4, 0xa2329cb1, 0x57b4ae6b, ++ 0xf7c6dfa3, 0xff78daf3, 0x6fb9e979, 0x8b7d077b, 0xf01b343c, 0xf750ceb2, ++ 0x723fda1a, 0xdcb6fb1e, 0xc36effd0, 0xfa86d5fb, 0x857d435a, 0x2cc57fbe, ++ 0x22b0e485, 0x1a53ef8f, 0x1fc8d2e5, 0xf1ef4d3f, 0xb9ec7b67, 0x9dfe4512, ++ 0x3726ae4e, 0xf4f2faf2, 0x2315b2fc, 0x0aebea82, 0x6e186e48, 0x2f9d06b5, ++ 0xf74b9d06, 0xd0fa591d, 0xe2fb0b9b, 0x7b46a1cb, 0x79e5d5ef, 0x23a1efee, ++ 0xaa976b87, 0x02abb7af, 0xedfbaf6e, 0xfbc15145, 0x70ca53ab, 0x3ee7d11d, ++ 0xacb4b78e, 0x622fd828, 0xd05a65a5, 0xe2fb653c, 0xf8a9ce6f, 0x2baf5fbd, ++ 0x8510db29, 0x7f629efb, 0x60978e33, 0xd7b4552f, 0x537e22f5, 0xb8ba798c, ++ 0xcfe1149f, 0x6822385e, 0x3065ac9e, 0x67fdb3ce, 0xad47bf2a, 0x8993e811, ++ 0xf2939dde, 0x8d32674c, 0x63db4ef2, 0x0eff1662, 0x99faedfa, 0xf4ed18ba, ++ 0x94f1c5fe, 0x74aff4c7, 0x15dd5ebe, 0x36692033, 0x6f23dbd4, 0x7edb7d23, ++ 0x772a44ef, 0x97535aaa, 0xd617b183, 0x0d459795, 0x8431f7c3, 0x37e91da7, ++ 0x5385e194, 0x824ee9ad, 0x48e713c3, 0x7b7f456a, 0x0df68595, 0x437e7e41, ++ 0x6dbf73fc, 0x2bb7ae14, 0x7da70e96, 0x4e5fcab1, 0x9d73c62d, 0x6858f795, ++ 0xe4d3a4bf, 0x679138a0, 0x93ca44d5, 0x945cb59a, 0x7ca9abde, 0x6dbf3fe5, ++ 0x5d9f73c4, 0x8f74284f, 0xb55f95ca, 0xea1239bc, 0xd2062bd5, 0xbb978bf9, ++ 0x7df7944d, 0x1f10ed70, 0x0a1f21e6, 0x51fca06f, 0x4fe74f68, 0xdf3acfab, ++ 0xf6c5cb2e, 0x385303aa, 0xf473c08e, 0x54ac8f9f, 0x9573c29f, 0x08f6d115, ++ 0xf23edfcc, 0xceb8a30d, 0x746c7b91, 0x28c1cb1f, 0x136badcf, 0x7a129ce8, ++ 0xe288ecfa, 0x0f00568c, 0x2fcfa51f, 0xe7c5494b, 0xf9cf4136, 0x878015d1, ++ 0xff0f530a, 0x8aa93d90, 0xd68ff5e5, 0x08db2bcd, 0xd8f23c78, 0x9b17ca10, ++ 0x38fb5fd2, 0x969df01d, 0x1f4beda1, 0xbb72f083, 0xf87fcaf5, 0x278be4be, ++ 0x6e30932a, 0xf5f05073, 0x4995ddcb, 0x57e1f7c1, 0x1f13349d, 0x2e7562bc, ++ 0x2334fba2, 0xceb82bfa, 0xc7883e06, 0xb12cf9b8, 0x5e7e016e, 0x7f842dbc, ++ 0xd2ae96d5, 0x25f7edb8, 0x06fa404e, 0xd22efaf8, 0x80deb4a7, 0x3bf499fa, ++ 0x8f8178d7, 0x6316db0f, 0xbe4f74ae, 0x4e15db23, 0x096cb278, 0x626785f7, ++ 0xc62b54fc, 0x65a52c7e, 0x907b34f0, 0x9ff68a1c, 0xef7e797a, 0xd71ed0a7, ++ 0xff7a9f7d, 0x3f783d8f, 0x8eafb643, 0xb9d17bb6, 0x9bb76a38, 0xcdfb1e91, ++ 0x7e608e4b, 0x1613d55a, 0x4f5503b2, 0x85ddde24, 0x06f807fa, 0x79c66be3, ++ 0xd0b7f7e5, 0x5fdefabc, 0x68acb7bd, 0xa57af042, 0xd2e55be9, 0x6ca9bfde, ++ 0xe5be88c3, 0xf5c1dab2, 0xfc13f153, 0x31ead6de, 0xb79d3376, 0x8dd5e27e, ++ 0x41772e74, 0x9b9e0e78, 0x46c27ea8, 0xdbb4eaf4, 0xf0cb8ebd, 0x1cdd813c, ++ 0x7f5a650b, 0xd47f2fae, 0xa14fcb9f, 0x3961ccca, 0x0939d254, 0x7c787fb9, ++ 0x628fc3f1, 0xcce7e5fa, 0xe01c6337, 0xf9c6b4ef, 0x9576f4f4, 0xfdc68fe2, ++ 0xb7d7dac4, 0x77d9f359, 0x63ec4fd8, 0x7586b11f, 0x43aafb8a, 0xf71a27ef, ++ 0x8bfb7311, 0xfb3d49f3, 0x6fba1688, 0x23ec5aa2, 0x0853ae16, 0xfcc5eafe, ++ 0x78c28f3e, 0xbc3e3f1e, 0x0860f804, 0xc8ebdfcd, 0x6e683cc1, 0xe299aa7f, ++ 0xaf5f830b, 0xe280b75e, 0xbe859b99, 0x8bf710a9, 0x65770a1e, 0xeabf7ae0, ++ 0x73c27089, 0x7ee66ff5, 0x9e2e58f4, 0x084d2bf7, 0x8b5f5f5e, 0xe34891fc, ++ 0x2c973c33, 0xf4ba39c7, 0x699f74e7, 0x4eb093e1, 0x58ec3cc6, 0x998decf6, ++ 0x0cd4b748, 0xed94efdc, 0x6cfd97aa, 0xeb076f30, 0xb9273c6c, 0x35f7e552, ++ 0x3d91b0ed, 0x614f9904, 0x67b7e741, 0x6add7f2d, 0xa58cf6e5, 0xb67e158c, ++ 0xed5e7033, 0x2bc7bc20, 0xb9c5ea01, 0x793f8934, 0xc4c2aa9e, 0x372c79ef, ++ 0x0ace7429, 0x4f9d1a34, 0xee7f49fa, 0xb288d6df, 0xe745c322, 0xd8d76a74, ++ 0xf932cb5c, 0xc8e73d38, 0x6b579d61, 0x7da2a8ea, 0x28da3fcd, 0x3cbf52be, ++ 0xe68f0b5c, 0x8dcf18f9, 0xb36abca0, 0x75c70e35, 0x5c9d71f2, 0x7df3c07f, ++ 0xb1a7dc66, 0x1b58fd73, 0xe28ef80b, 0x8b1a638c, 0xca3241f7, 0x52f1c4a3, ++ 0x577d0647, 0x539dcf11, 0x074676af, 0x6263ddc6, 0x833e302b, 0x448d87ed, ++ 0xb8cfc5fc, 0x467ae101, 0xe4067925, 0xbf43c9ac, 0x347519ef, 0x562bb7ae, ++ 0xfd462aee, 0x28eb7f3b, 0x2ac1293c, 0xec9f7d9e, 0xf7417cc7, 0x5687914e, ++ 0xafbc7509, 0x93c859ae, 0xa2f1e547, 0x491f8166, 0x76bef97f, 0xefc785a5, ++ 0x62a3cf41, 0x31fa5da9, 0xef6b5b8d, 0x5bfd4248, 0xe742c3bb, 0x70161fb4, ++ 0x3fed2e57, 0x53f01f61, 0xee8625a5, 0x96f1aced, 0xd35eb15a, 0xd03d50ac, ++ 0xf903312f, 0xcfe58bf3, 0x1cdf2347, 0xa367f70a, 0x105aea5d, 0x87f3a2ee, ++ 0xfbaf1e0e, 0x9d367962, 0xe8e59a57, 0x277de3b0, 0x8c0d16b3, 0xdfbdfd43, ++ 0xfbe2b7e1, 0x26992dfd, 0xc70e6bac, 0xe66bac04, 0x85fea8cb, 0x1fa173c8, ++ 0xd38527e4, 0x2ecb66b7, 0x9f3dfe2b, 0x4f7cc5e7, 0x60fef33e, 0x66d4ff8c, ++ 0xbb460c74, 0x9c1ff402, 0xacde7886, 0xdbae5d90, 0x25dbf3c2, 0xfe90ebfd, ++ 0x04f36f20, 0x3fb6ebdd, 0x839413ff, 0x4e7fa43a, 0x3e01fe6f, 0x9fcf4dde, ++ 0x78cc5f5b, 0x27c8ddff, 0x7d418ed2, 0x70e305b9, 0x156f5e56, 0x45e78478, ++ 0x0477b9fc, 0xc9ebabcf, 0x7ff1d043, 0xb0fdf45f, 0x5b47d8bf, 0xfb7d236a, ++ 0xea17ce21, 0x44772b9d, 0x3e4efd23, 0xdc35ebb3, 0x0e7da967, 0x8433b4ac, ++ 0xd47c081c, 0x09a3fce3, 0xea2ff27e, 0x81d1be71, 0xbdf0f7f9, 0xc67abf90, ++ 0x5be727e7, 0x97f3166f, 0x8fff45ef, 0x61af1e84, 0x87db5f02, 0xf2137970, ++ 0xf74bf285, 0x79f989b1, 0xb8f7f4e2, 0xf9fc159e, 0x73279899, 0x7e2344b4, ++ 0x77a8be90, 0xab347f80, 0xe4d023d4, 0x94f5d6e4, 0x25e92fc7, 0x3867b7e1, ++ 0x62d13da5, 0xec7402e3, 0xd55ee3ec, 0x39be087f, 0x46724f70, 0x8befe02b, ++ 0x1d9d744d, 0xe839abf1, 0xe46f927b, 0x9e9f0af7, 0x1bce2d7a, 0xf8e3f7c6, ++ 0xbdfbbbf2, 0x671c6691, 0x21f2e33f, 0x597297e1, 0xb5cb78d8, 0xddb1a2a3, ++ 0x11c0fb49, 0x7dfe6f38, 0xfa83867b, 0x402fe86b, 0xa155ad7f, 0xb101f5b8, ++ 0xcf703fce, 0x2395d1f3, 0x991efc02, 0x97ff08a1, 0x708cc5c7, 0xf093fe4a, ++ 0x71e389ee, 0xe16f0961, 0x8b5fd7bd, 0xb8dc25cf, 0x9fcc145f, 0x4f927f12, ++ 0x233d39e5, 0x49af12bf, 0xcdf6aa3b, 0x07e9f5d7, 0xd7a75f28, 0xc278e373, ++ 0xf2243a1f, 0xaf7ebbcb, 0xcbcbf3f2, 0xceeb7653, 0x15163111, 0x2e966f6c, ++ 0x8f91dab8, 0x145bb7fb, 0xed21c73a, 0x36acfc08, 0xe91fd907, 0xe0c82c0f, ++ 0x09f52af9, 0x63a471da, 0x628eb1cd, 0xfa524fbc, 0xe57e57a1, 0x5e306357, ++ 0xbde79db5, 0x39a97e49, 0xa0e49bb1, 0xaa7b9c56, 0xe97ef958, 0xdff7e438, ++ 0xa75f685b, 0x56899ee2, 0x6ee7eff4, 0xd116399c, 0x5022e781, 0x30df1faf, ++ 0x87a13466, 0xe0669239, 0x0f0d88f9, 0x9e09b8cf, 0xe9556acf, 0x071c181e, ++ 0x8ee2b7e5, 0x3d5f14d1, 0x3a59de14, 0xbbf8fd1e, 0xf1fa0754, 0x731c6c57, ++ 0xc2bfb637, 0x2e96203e, 0x4f10d9ef, 0x431ccd75, 0xbdfa41f6, 0xd1b01f32, ++ 0x737fe9c2, 0x69a79706, 0x9be7253d, 0xc1c6c6c2, 0xb5df1fb8, 0x61ee9c3e, ++ 0x5b3ab72a, 0x97bdf8fc, 0x519d6992, 0x737fe56f, 0xfdc298e2, 0x165639b2, ++ 0xcf439a96, 0xf9e152c3, 0x3b8e96eb, 0x7ebc8ed0, 0xde147d87, 0xb3d4cac3, ++ 0x3fb92b63, 0xe31df7cd, 0x43beee99, 0x194dc709, 0xe38ddf9c, 0x707bfec9, ++ 0xe747111d, 0xf1ffa913, 0x819fbfe5, 0xa6f8f076, 0xf79c38ec, 0xe9c297d1, ++ 0x8b51c13c, 0x8ba59efe, 0x3c65e73d, 0xadcf251f, 0xf3e864d6, 0x9fdf24c0, ++ 0x1b077cef, 0x4b797174, 0x3a309627, 0x60caedf7, 0xc8a2ddf4, 0x3e61b66f, ++ 0xcdb35561, 0x0e62e781, 0x7ee3ff23, 0xee950ed6, 0xdcb3a1e1, 0x3bc3af40, ++ 0xdef9d346, 0xbd784faa, 0xe1f145aa, 0x0fdde479, 0x0af94bde, 0xc4bfc1b3, ++ 0xfe3d9c23, 0xce0f23f3, 0xed383140, 0xb9e134f2, 0x789bd3fe, 0x7baf457e, ++ 0xf6df5e1a, 0x7ff3aa5a, 0xf1965fdf, 0xf433c788, 0xbe25fae7, 0x15ea3ae5, ++ 0x9cbc8be0, 0x5cbefe00, 0xe5fc8732, 0x543c4b13, 0xac0e529e, 0xd9f902b9, ++ 0x08e7431e, 0x587d6c5e, 0x6a667bc5, 0x8b3a8fb7, 0x51f1e1eb, 0xd2ff7431, ++ 0xd3164b97, 0x2589e626, 0x6b8fe20d, 0xd47a132d, 0xdb95e547, 0x97dfa9db, ++ 0xf0dba3ad, 0x51cbee9c, 0x69ad5c31, 0x1f7bba79, 0x3afb7d25, 0xf5e72c7f, ++ 0xce9c5df9, 0x37cfee12, 0x79c68ccd, 0xdf1e3fb5, 0x37d23976, 0xfe81c632, ++ 0x27c8b55f, 0xfb96b239, 0x62c2c7d5, 0x7402577e, 0xbaeeb63e, 0x6807bc24, ++ 0x19f4fb76, 0x25eabcf8, 0x01eb81c5, 0xa3534bd7, 0x99f6fd71, 0xcf1a33b9, ++ 0x56b67d4d, 0xd1f2b79e, 0x3f1b6fdf, 0xed875d89, 0xcccdfbc7, 0xc65b4999, ++ 0x9f972fc4, 0xd7f9d330, 0xc539e02f, 0x5046ce4b, 0xe27e04bc, 0xf6647f31, ++ 0xd2ce3c0b, 0xeb15deb3, 0xbcc42bbd, 0x71c466cf, 0x85e7897c, 0xd1f9fc79, ++ 0x70cadb75, 0x2c1be3bc, 0xcbfb840e, 0x7f1a160d, 0x4cd3ac1e, 0x4db1ef00, ++ 0x7583dd7c, 0xdf1f375c, 0xf337d7c4, 0xa6faf85a, 0xe3458176, 0x7cf545e7, ++ 0x8ed41859, 0xe3eb0dee, 0x1a79911e, 0xb03cdf9f, 0xf3df389b, 0x6b2c6ff1, ++ 0x1766f3a1, 0xe46a3f9b, 0xfa19d3df, 0xdf0f5ef5, 0x022fc5f6, 0xc8ff28af, ++ 0xe62f92b7, 0xf8fbe5ad, 0xf2a32d71, 0x9f24ff91, 0x6bd5ef18, 0x2f7e32b4, ++ 0x85c229aa, 0x946a617a, 0xe2f682d3, 0x22ce84ba, 0x032dcf44, 0x0b557eb8, ++ 0x8b9e1a4d, 0x90b68d63, 0x0e4578f7, 0x43d6fee0, 0xffcf1803, 0xf9e0e01f, ++ 0x987ce29d, 0xf55ec12c, 0x353e7b47, 0x4e1fee32, 0xe4f29268, 0xe06629aa, ++ 0xc457a9eb, 0x05d031dd, 0x99b278e4, 0xedc747d7, 0xd67a82c8, 0x98a60780, ++ 0x2f537e61, 0x81631b8b, 0x0fa5d2fa, 0xfa82294e, 0xa4b40355, 0x39df4101, ++ 0x3fb931be, 0xa79e0fce, 0x13a7f3e2, 0xd658e93d, 0xa762f38b, 0x8b91ae94, ++ 0xdfed0333, 0xffbec97d, 0xdea06745, 0x8f746169, 0x3f8410ce, 0x6ab2efb1, ++ 0xbfcd9680, 0xc95e7fab, 0xbf943dd8, 0x74e7e5e7, 0x961dc7e0, 0x38a8e784, ++ 0x73ca55df, 0xe70c2b3b, 0x7cfc5c76, 0x254f3c9a, 0x0b0d4bcf, 0x775b379c, ++ 0x4ecde731, 0x71dff859, 0x79fd3453, 0xcfeda531, 0xa3588f74, 0x13867597, ++ 0x70e7f41d, 0x4b5ef16a, 0xbcf693c0, 0x74051fdd, 0x244cf85e, 0xe95cc7c9, ++ 0x88f278f7, 0x05bde5df, 0xf89e33cc, 0x8fc10ef1, 0x86b09747, 0xbfcc1641, ++ 0x19a5f9de, 0xe11918e0, 0xeb801d29, 0x8cded35f, 0xe7944e85, 0x3ff468c6, ++ 0xbaab3e4e, 0x8d7da04a, 0x86d95ff0, 0x5417a144, 0x7ef055ff, 0xa7b0e64f, ++ 0x2f5d1ed0, 0xa644e9f8, 0x23ef033f, 0xf5f266f2, 0xbca3b412, 0xaecb49ba, ++ 0x2776c44e, 0x683bdeb6, 0x06cdd036, 0x6fcf07ea, 0xe663035d, 0x77bdd1c5, ++ 0x687da54c, 0xde17d11f, 0xf0e3a37b, 0x3387bd3e, 0x3a2339c4, 0x23e9283f, ++ 0x1e8bdef1, 0x6ff469f0, 0x82cc614d, 0x6c61d8eb, 0x3cddfd1d, 0x61a39749, ++ 0xbc921cfc, 0x0ee17557, 0x33a1871e, 0x714ea294, 0xf1f65ea5, 0x995ff255, ++ 0x47b507b8, 0x799bacff, 0x6f32f661, 0x713f15bd, 0x5d7376d1, 0xb3bd4861, ++ 0x3bd08074, 0xe0a8d8a3, 0x45ab637b, 0xb96a899b, 0x5bcfef13, 0xf7461898, ++ 0x627c2c97, 0xf625d920, 0x7eb4ddc8, 0xbad8ed96, 0xa697e278, 0x30e8954c, ++ 0xbca155b7, 0x34d6d2ca, 0x255784e6, 0x4654f1ad, 0xf3d2a777, 0x337bbfe3, ++ 0x4e25eb97, 0x49ffd2a7, 0xa63ca02e, 0xc05219ff, 0xf78debf3, 0x9f3c7122, ++ 0x9b3c7376, 0xfee8c3bd, 0xbfb88b5a, 0x78e334f6, 0xdf9d3d3f, 0xcf7a7713, ++ 0x89da3321, 0xf42a57e9, 0x08d443a7, 0xfbc6e7ce, 0x6d7e256b, 0xfbc63e82, ++ 0xfdc51b6c, 0xdb5ef28f, 0xbebb45eb, 0x219db5ee, 0xd47d71d0, 0xc79c129c, ++ 0x7bc5d1bd, 0xb8647d68, 0x46a6d6d7, 0x660f9059, 0x31e9eb94, 0x6ebeba7d, ++ 0xd277f099, 0x860996c7, 0x7d3525fb, 0x84034ffd, 0x0d8c39bf, 0x5ffee3eb, ++ 0xd3f4fd0d, 0x0fe38d9a, 0xfa8679ef, 0x61fc208c, 0x74e9cd3e, 0xdeefe133, ++ 0x352f8e70, 0xfc8bdf82, 0xcefdfbff, 0x8d9c7bc6, 0xdf0f34f7, 0xbf5750b4, ++ 0xbaa7e5b4, 0x2eb597f6, 0xe51fbdd3, 0x3f7ba55f, 0xba43cf7a, 0x5f8e98fa, ++ 0xdb8fdaeb, 0xfdee94f7, 0x759b9de5, 0xf638afef, 0x657eae9c, 0xed749fd7, ++ 0xa9deeaaf, 0x37b3e7ab, 0xc30bed75, 0x27d5d7de, 0xae8ffe3a, 0x8729d5fd, ++ 0x71afef74, 0xff7ba17e, 0x57f600ff, 0x80004ec1, 0x00008000, 0x00088b1f, ++ 0x00000000, 0x7de5ff00, 0xd554780d, 0x333ee8b5, 0x4c927e67, 0x66109392, ++ 0x9c24c926, 0x06091fc9, 0x80d22219, 0x603f2641, 0x820c29f8, 0x03b06d1a, ++ 0x9942a2a2, 0xd9f05a00, 0x13f0c4ce, 0x7a836d28, 0x80ea0221, 0x9f5f5ca8, ++ 0xcbd6b45f, 0x2009bfc5, 0x446977f2, 0xdf5f4feb, 0x16bd01bd, 0xa40758bd, ++ 0xeb4bda3e, 0x7ded6b5d, 0x13267392, 0xded7ef40, 0x7df2fbbe, 0xf7b59b7c, ++ 0xbdaf7b3e, 0xaf6b5af6, 0x673af6b5, 0xc17f95a6, 0xbfa33b54, 0xb7dfe0af, ++ 0xd4ceff7d, 0x63d87ef2, 0xabd5da0b, 0xd3e63fe1, 0xac61cb32, 0x86c4ae6d, ++ 0x7b3b1978, 0x583db670, 0x9aaa58c9, 0x1a71f39e, 0x8ab057b4, 0xa58cccaf, ++ 0xc318530c, 0x30ac25fe, 0x49b19230, 0x1b189ae6, 0x4b77fd03, 0xd8ca9b3e, ++ 0xbb4716e7, 0xe498c994, 0x36456c67, 0x05bff263, 0xb3b412fc, 0x4f7c907f, ++ 0x35667b41, 0xcfe6e9d4, 0xac99dbf2, 0xa3486fc3, 0x06878062, 0xaefe86dc, ++ 0x9ed0d526, 0xb4372c1b, 0x19f42fe7, 0xb55082e0, 0x15b0ffa1, 0x8dec037e, ++ 0x17fa1a34, 0x700c07b7, 0xa1934769, 0xa0cef0ff, 0xba22bda1, 0xc57ed0d0, ++ 0x1e0190ae, 0xd0c2b5d9, 0x88eed47f, 0xac747da1, 0xd57ed0dd, 0x7c030ec1, ++ 0xa1a74f75, 0x8fdeb7ff, 0xf5c7da1a, 0x5fb432ee, 0x00cbaa73, 0x36ef884f, ++ 0x3e789ff4, 0xd96b8066, 0x7aff4321, 0x78065bfb, 0xa181f292, 0x13ee75ff, ++ 0xea29f686, 0x49768627, 0x15735855, 0xcfcad363, 0x795feb18, 0x95d20ff3, ++ 0x307f7fc8, 0xf3a91f3c, 0xc88fe433, 0x4daf920b, 0x5aa16c65, 0x6365fc44, ++ 0xf80537ac, 0x00122dad, 0x580c64de, 0x5f0195a9, 0xe2244666, 0xd631602b, ++ 0x00a38d9c, 0x2c658ed3, 0xcf0bff03, 0x6eb1ca67, 0x936c8009, 0x30721bd7, ++ 0x2956c696, 0x267cc31f, 0xaeaff560, 0x6ff13982, 0xb812c0e2, 0xe1ac7d92, ++ 0xa7ddf30b, 0x31e3c232, 0xca0f7835, 0xcf5dddc7, 0xaa87ce4f, 0x0d6458bb, ++ 0x5cc931e2, 0xf20bd999, 0x7d852c71, 0x70395037, 0xa07629bc, 0x43be6e8b, ++ 0x2a9e1d29, 0x4ff3e0c7, 0xfea69fb1, 0xf85ae37d, 0x6fac12b8, 0x9ffc6ea9, ++ 0x0b530184, 0x90611d63, 0x1ec6529b, 0x3f042b0a, 0xbc137612, 0xd952ac29, ++ 0x72a72e19, 0xed47d84b, 0x04d5c2db, 0x13f61e3f, 0x52370d1c, 0xa01c23b9, ++ 0x26e19dfa, 0x070e9f82, 0x5e15dca9, 0xe1b3e548, 0x2cffb510, 0xe7e082bc, ++ 0xbb2a11c2, 0xff54edc2, 0xe083b842, 0x049dc317, 0x528e14bf, 0x8bbc3bb9, ++ 0x2ee13dca, 0xbc257f6a, 0xc2d7e09b, 0xe1638231, 0x0def0483, 0x3fbc10f7, ++ 0x07c13efc, 0x1e54bdc2, 0xf2a29f0c, 0xed4e3870, 0x09e7c347, 0x66afdfee, ++ 0x902be3e5, 0x57d3413e, 0x05b6d057, 0x14ee0f90, 0x3272c07c, 0xec64e665, ++ 0xeca5be0e, 0xd85b1353, 0x53bff405, 0x8ea5a1f0, 0x77c031b1, 0x1db2bc96, ++ 0x6adc5e6d, 0xe27293e0, 0x0d5fa393, 0x013e7cb9, 0x852505ce, 0x91cacc7c, ++ 0x4d72b4df, 0x5f22342d, 0xa7d148b7, 0x84ddd4bc, 0x73b52cf8, 0x1d9926fc, ++ 0xaf7cded4, 0x8c49b514, 0xc45995cd, 0x9bf3720a, 0x912b8c94, 0x2c86cfb9, ++ 0x4bb632e5, 0x24583ea9, 0x416affc0, 0x862fe0e4, 0x57ddff2c, 0x7bd7db6c, ++ 0x866af1fb, 0xfcf04de7, 0x0c5a6ed5, 0x2d07666b, 0xfbd40788, 0xaa2720cd, ++ 0x055fb82b, 0x302eef3c, 0x3c28ac45, 0x2059688e, 0x5706b19d, 0xefe44df0, ++ 0x0fdba1b3, 0x2a77e0e0, 0xe79c32be, 0xd0d8b6db, 0xf8fe609b, 0x876fb321, ++ 0x963d383a, 0xa5014c74, 0xd7f6917d, 0x0104f13e, 0x9b3fc68f, 0x63ff4883, ++ 0x28a6f496, 0x55aff3f0, 0x6bf6e889, 0xdf2864d5, 0x403f0571, 0x0f4cbe7c, ++ 0x12026add, 0xcb6d797e, 0x4960cbd3, 0x99a52dcd, 0x84cd1e78, 0x8cc5632d, ++ 0x05aa62cd, 0xe66cc2f5, 0x430bc37f, 0x0482c0dd, 0x5422c4df, 0x278339d6, ++ 0x599b9c71, 0x78e0e094, 0x75b2615b, 0x19f5e225, 0x963575e2, 0x72694326, ++ 0xfd234f07, 0x13f74cbe, 0x5dc6c75e, 0xd2eb8657, 0xab73aaf0, 0x160cff84, ++ 0xfbf11c7f, 0x1f33d5f2, 0xf903c54b, 0x17c02fe3, 0xfb1e180e, 0x73ec2b31, ++ 0x3e0ac81b, 0x8a52b6df, 0x7c6b5f22, 0x7cecccd1, 0x5ea007dc, 0xf009f3d2, ++ 0x4bca1547, 0x3a5670bc, 0x178a49f1, 0x399c64f9, 0xeb051d62, 0x24cb4534, ++ 0x5587f133, 0xcceefc02, 0x1a28fe01, 0xd7be0f9c, 0xef4ea50e, 0xc10d7f01, ++ 0x8ff77ef1, 0x7a472adf, 0x9c6d792d, 0x336af48a, 0x1f003ec1, 0xc99b0e47, ++ 0x9542602e, 0x1919af9b, 0xb266be45, 0x246b37cf, 0x83d717ee, 0xe2b666dd, ++ 0x767a24f9, 0xd7ef978c, 0x31a5b731, 0x3972e34a, 0xbd2bdad7, 0x452aff7c, ++ 0xbf2da5bf, 0xfc06645d, 0xc4fded8f, 0xb24c8eaa, 0xba3f158e, 0xcfc744af, ++ 0x989f764b, 0xb7a24fec, 0x34f18a67, 0xd35b31fe, 0x7a1ddb83, 0xc0bcf8bc, ++ 0x917957cf, 0x9f80b39f, 0x3f9f898b, 0xcd8c2386, 0x3799a9b0, 0xa40bd941, ++ 0x7c194189, 0xdf22b142, 0x2a3e67cc, 0x9500b017, 0x23f6c277, 0x1b2206ff, ++ 0xbbf748ad, 0x7fd51759, 0x2736faaf, 0xa61df3f2, 0x8bc22160, 0x2fd50f58, ++ 0xdc06f161, 0x5bda1bda, 0x190370df, 0x9c6c7767, 0xbdf40b94, 0x0def3a3e, ++ 0x94ed672c, 0x24a88e3e, 0xaf11931f, 0x3ab4295e, 0xe5bfe60f, 0xf3abb567, ++ 0x99867ea1, 0xc23b0bef, 0x1fd345f7, 0x7906eb89, 0xfafb8198, 0xd69f9665, ++ 0x3468ce65, 0x83f343c8, 0x38c12fcc, 0xd16d57f1, 0x7c9d5e1d, 0x2ff3df54, ++ 0xe4c7a8f9, 0xdfb8adf8, 0x65b35e4b, 0xcddf7ee3, 0xf92f39f8, 0xbc88ddb9, ++ 0x4677cfc6, 0x4b0f7efc, 0x4fbf61f5, 0x5a7f7f05, 0x3fbf88c0, 0x559f9895, ++ 0xac9ddbf5, 0x2aaee830, 0x97a73fee, 0x25767e98, 0xf1ce09d2, 0x77bd71db, ++ 0x66b5d87f, 0x7ff517b4, 0x0eed10b4, 0x5f36b3cb, 0x9e70d79b, 0x50d2afb0, ++ 0xd21884c9, 0xee3827f3, 0x497881a8, 0x80fe07d5, 0xcacd8676, 0x922af622, ++ 0xe516366f, 0xf24acf3a, 0x2da486d5, 0x2a0279c6, 0xf8e27dca, 0x07be04c7, ++ 0xbe2664ff, 0x9e7ac08f, 0xc3cd9292, 0x6a5b2bcf, 0x3fa43cff, 0x59e68c9c, ++ 0xac72e5e5, 0xbd1cc7cd, 0xebcbb41e, 0xb86d82d3, 0xb8f8a03f, 0x7eb8517e, ++ 0x6dfde839, 0x8ccfee09, 0xbd34ebf1, 0x6bb1e34c, 0x663a3eb9, 0x1f082351, ++ 0x40faf5ab, 0xd9e9f573, 0xbe6fd599, 0xb4cc788f, 0x2866623b, 0x74e58d59, ++ 0x160e76af, 0x33bf9ff5, 0x86b7f3b5, 0x8433bf9f, 0xbb44cf68, 0x3e639f0c, ++ 0xc157e20b, 0x63d1a37e, 0x9ab79e1b, 0xde701c7e, 0x907ac2c2, 0x62eab27e, ++ 0xf8952e50, 0xcafe97fa, 0xbed08d1c, 0xaf384df9, 0xc64fe855, 0xae78e542, ++ 0x9abbcf69, 0xf83155c0, 0x6256760b, 0x031417f0, 0x1b72105c, 0xa15b0ffa, ++ 0x91bdda1a, 0x717b4372, 0x9700cfbb, 0xfa1b5476, 0x1bf4ef0f, 0xa3688ae0, ++ 0xbb15ffa1, 0x64780602, 0xffa19357, 0x4341dda8, 0x42d8e8fb, 0x0755fb43, ++ 0xeaf80643, 0xfe86159e, 0x623f7adf, 0xdbd71f68, 0xe6bf686e, 0x9e018754, ++ 0xf434ef10, 0x6a3e789f, 0x7f65af68, 0xb7af686f, 0x9f806f3f, 0x146a73c0, ++ 0x68ff0dfa, 0x773aee78, 0x3c7e01b7, 0xf6076335, 0x321ea29b, 0x37f62f3e, ++ 0xc92a7372, 0xb7f2b4c3, 0xf7dded0c, 0x0cdcd88f, 0xdfbd12f2, 0xa6e6fe44, ++ 0xb14e7e46, 0x07ce3aa6, 0xb7efbc29, 0xe6181f7d, 0xbdc7342b, 0x59aac7c8, ++ 0x2eb943c9, 0x17b59ea9, 0xf9958ed8, 0xdd50ea5b, 0xdc6e3795, 0xc088e58b, ++ 0x362875f3, 0xed6f4d95, 0xe0caf2c5, 0x63603a99, 0xb5985be6, 0xd0aacb0f, ++ 0xa2177ae8, 0x3ed662b8, 0x5a46c72c, 0x82cf51ea, 0x9de9f859, 0x23eff780, ++ 0xc07ad823, 0xf80f232b, 0xfdeb12b6, 0x73cbb7c4, 0xcbe7244d, 0x5144766f, ++ 0x71af392f, 0x6cb4e8c8, 0xef86870e, 0x7ce69d07, 0x818ab9d8, 0x5d83b47c, ++ 0x760e1d1f, 0x58f9d802, 0x7c760a3e, 0xf5a19c14, 0xb963e760, 0xac7cec01, ++ 0x3e760adf, 0xab87cec2, 0xe5b9f1da, 0x58dedd6f, 0xbb0fe304, 0x2cd05657, ++ 0x5a9aab5d, 0xee3e02f6, 0xea0aad7b, 0x91f7ab12, 0x28f01514, 0x8c780c58, ++ 0x91f8b227, 0x022e8fd4, 0xc38f21c3, 0xddcfd029, 0x9dc03262, 0x4d823ff8, ++ 0x7e7c0691, 0x9df2c6e4, 0x8aaff03e, 0x805b675a, 0x3dc519d6, 0x42cf6f37, ++ 0xc0e7f998, 0x2f71393e, 0xee3ffc60, 0xa9159ac8, 0x543f081c, 0xc229c81a, ++ 0x55dc81f8, 0x0caa7281, 0xe22e4dff, 0x53eeaeb5, 0xfa81499f, 0xfdacc648, ++ 0x86c78eb0, 0x013c72a6, 0x672f95ae, 0xd1617f5c, 0x750faa50, 0xc523d125, ++ 0xfadcfc45, 0x33b71163, 0xfd414fe1, 0xc22ce2e4, 0x6527605c, 0x3cddbe82, ++ 0xf409c56e, 0x22256421, 0x17647ea1, 0x82b1f9e0, 0x4f04c504, 0x1738054c, ++ 0xa04fa061, 0xd71a382c, 0x76320ae3, 0xb9a7c752, 0x66f08d0b, 0x9693cfd8, ++ 0xdf2c7c7e, 0x58644535, 0x80c9e583, 0x6cf307cf, 0x05eb0b9b, 0xe8d5b378, ++ 0x31370e4f, 0xd61e2fb2, 0xdb30bef0, 0xc3da7687, 0xde7edc45, 0xfaaf2e12, ++ 0x9efe82c8, 0xf023eaaf, 0x8616f28f, 0x57e820a4, 0x17c07357, 0xaf967e81, ++ 0x456dde7e, 0xeb2efec6, 0xeb1cf3c2, 0xcf76755b, 0xcb5c6275, 0x9ba26657, ++ 0xcbe02da5, 0x316fcdd6, 0x24aea14b, 0x458dd776, 0x8dae7f32, 0xdf65bb51, ++ 0xf985494a, 0xd2a39af2, 0x484e34ed, 0x2bbd41f2, 0x9bf3ebc6, 0x0005a4bb, ++ 0xe9522aaf, 0xfc9c6d39, 0x8ebf8085, 0x22396e4e, 0xfbbcf029, 0x74848881, ++ 0x1f012b70, 0x075a474b, 0x0997be48, 0x18af7699, 0x10d1f55b, 0x0be03bc4, ++ 0x34d37ce0, 0x0c290b79, 0xf7d0f9f1, 0xd73c5acb, 0x4f66697e, 0xea85f141, ++ 0xb249cccb, 0xf5b4ad0e, 0x22ff999a, 0xe1464c7e, 0x273a21fd, 0xa5a8716f, ++ 0xdc4fbf20, 0x9eda68ec, 0x8956cf84, 0xa79b597d, 0x1f1c5b9d, 0x49d399a7, ++ 0x50beaf3b, 0x7a68ff38, 0x8716596b, 0x159671b5, 0x31bd218c, 0xceae3e18, ++ 0xe1d41614, 0x51e619bb, 0x9fdb7c60, 0x1ba4145a, 0x9a010ef8, 0x74fae64f, ++ 0xe4e563fb, 0xcff2262f, 0x89003900, 0xbe42accb, 0x01b68dec, 0x5ae6d8df, ++ 0xba2f687d, 0x4246b87e, 0x3ac7923d, 0xaea3d424, 0x32838682, 0xb072e79e, ++ 0x8ec49022, 0x683c94be, 0x25d9a9fb, 0x7d4ff703, 0x50ec96af, 0x5dbe430b, ++ 0xb85d55ea, 0x2e9f1a7f, 0x3b34343d, 0xe7cfdba8, 0xb3571f05, 0xe9ca330e, ++ 0x6545d678, 0xf2a1eb0d, 0xd2a7165a, 0xcb1914cf, 0xb2a3e63a, 0x9ca80581, ++ 0x365442cc, 0xa72a0eb2, 0xa72a2eb2, 0xc12a1eb3, 0xc032a3af, 0xaf3ff214, ++ 0xcb063b07, 0xe5402c39, 0xe5442c8d, 0x4ddfc13e, 0x5be083ac, 0xbb951758, ++ 0xe1d5fe41, 0x53b10f18, 0x73e80af9, 0x7d035f2c, 0xf40c658e, 0x78c36ab9, ++ 0xfb953948, 0x0f2a3ec3, 0x3ca9ab84, 0xbf53f618, 0x2a46e1c3, 0x5403868f, ++ 0x51370b1e, 0x520e13d9, 0x85e1e3bf, 0x0e13be54, 0x786ef951, 0x87ef9505, ++ 0x3afe5423, 0x70e54edc, 0xa415e82b, 0xe8ef7977, 0x0a1f81eb, 0x55fab43f, ++ 0x8b328f38, 0xcfb2dfb9, 0x8abbfa6f, 0x268fb831, 0x5731c58c, 0xf90932c3, ++ 0xf26e55d1, 0x5f5ca147, 0x0dba54be, 0xb8c7b5ca, 0xa5736b1d, 0xeaec9d93, ++ 0x30a92e5c, 0xd7a96eee, 0xfb7b069c, 0xcf163baf, 0xdd8057b2, 0x955b0af0, ++ 0xe97843e6, 0xe1f03b46, 0xbe284b76, 0x8b7bda1d, 0x70ecb342, 0x3f4f8c8e, ++ 0x72cf6ffe, 0xedc7da98, 0xc00a6d67, 0xdee3b6ff, 0xc712398d, 0xeff09503, ++ 0x6acc568b, 0x954f1195, 0x0bc67cf0, 0x19fa360e, 0x67e41d2b, 0x393cee8c, ++ 0xb8f004da, 0xf42a8e15, 0x28fd758f, 0xbf583d4e, 0xb9ed76c4, 0x36ce2d6d, ++ 0x8fdac3a4, 0xaa813dc1, 0xd1dee2c2, 0x8fd38f18, 0xf9bcba6b, 0xf322f999, ++ 0x1749fbeb, 0xe6502f19, 0xbfa2f7ff, 0xe44f3e01, 0x1f57cb6f, 0x78a26f3e, ++ 0xe78d9298, 0xae2ccefa, 0xa905e277, 0xf7801dd1, 0xaf016cce, 0xad75a12b, ++ 0xb5d61845, 0xd9117d76, 0x02533bf1, 0xfb610f4b, 0x1dbe4d8f, 0x3533b4d0, ++ 0xe082beb8, 0xacd38a12, 0xe3950ecd, 0xc69854b9, 0x9e4dc7cf, 0xfd5453fb, ++ 0xcfcc5939, 0xe735cdf7, 0x3fa3b67a, 0xa5626ed5, 0xf68edcf0, 0x61caebf9, ++ 0x8037279c, 0xe670045d, 0x4aeb0584, 0x9d68bda1, 0xe859ac69, 0xc9e3c43c, ++ 0x5e9e0b0d, 0x23b8e12f, 0xdc60cbb2, 0x0b3fa162, 0x5e8ef487, 0xc9be7c06, ++ 0x682b8c6a, 0x5e4295e5, 0x2730c016, 0x142dfce1, 0x16ed8af1, 0x373fa4d6, ++ 0x16fc0867, 0x32d2f195, 0x6cf1c791, 0x0fa352c3, 0x876bfac2, 0x738fb8f1, ++ 0x3ee29d95, 0xdf1fcf4e, 0x9dda0eba, 0x343e4cdb, 0xa2d76569, 0x3dfa0b56, ++ 0x942eb337, 0x7f12edc7, 0xedc0523e, 0x8a583064, 0x1efce966, 0x4aaa37b0, ++ 0x7752f174, 0x38c24453, 0x45b0ed46, 0x9d97c612, 0x8c25bb9e, 0x829b387f, ++ 0xfd1d3052, 0xb7b510a4, 0x16a70597, 0x9bb97f03, 0xfd9d79e1, 0x2e648e0c, ++ 0xdbcc2bee, 0x1ae745d4, 0xf7cfd2ab, 0x874e32fd, 0x1eb032d5, 0xacabefda, ++ 0xbd225784, 0x9baf0f66, 0xfb6be38d, 0x2ceed898, 0xf9d9f4e1, 0x72814c20, ++ 0x0fc78e30, 0x47953d8e, 0x4d8cf2f6, 0x23f47ea9, 0xd11c6d8f, 0xe343f040, ++ 0x1eff68fd, 0x64fc6a7b, 0x343c672c, 0x931dfa95, 0x0b8c41d8, 0x16e878cc, ++ 0x8b0beb19, 0xef1c2f01, 0x71f89584, 0x8b7743c6, 0xc06fefe7, 0xe4536af6, ++ 0x5d3fa27f, 0x1a6cf6dd, 0xa7c60bc6, 0xe58f90bf, 0xf2ef5331, 0xa67f986e, ++ 0x8f09fec2, 0x9cbac0eb, 0x7fc2371f, 0xb22c6d66, 0x65663c60, 0x98afbf31, ++ 0x0724fccd, 0xdbfc83d0, 0xfb3d5d9a, 0xd763a2c0, 0xf1ebc576, 0x5bbfccfa, ++ 0x5d658fd9, 0x346687cc, 0xd818386b, 0x9ee4e58f, 0x379a0350, 0xec77ef8d, ++ 0x4554f2c7, 0xe7d22570, 0xf8de1f99, 0x0f0033c2, 0x0572c1fb, 0x0792d0ed, ++ 0xa0eca77b, 0xa185a5b8, 0x1d5a3c3c, 0x032330ea, 0x50523bdb, 0x6edee43f, ++ 0x6ef9e132, 0x216476f3, 0xc4bdbb6c, 0x9da67184, 0x690b1d59, 0x0ca9a5dd, ++ 0xce1878e9, 0x478be421, 0x94148e95, 0xda4b9027, 0x3f82b587, 0x2521596d, ++ 0xbdc5eb0b, 0x54bf5f46, 0xafb8ff0e, 0x4496475f, 0x3848e4f3, 0x64119a0f, ++ 0x7cf38847, 0xda0bf033, 0xe0f4ce09, 0x3d6f8c76, 0x1ff2e7ea, 0xc0be7071, ++ 0xfce06bee, 0x4809df27, 0x4d08eee8, 0x3670fdc3, 0xbd5e91cb, 0x20c7009d, ++ 0x17be8b8e, 0x0ce1bfc5, 0x9361bb41, 0x33d061c4, 0x61fe1784, 0x70edc73c, ++ 0xd639476e, 0x8d0677f0, 0xae3ae1e3, 0xa73ff477, 0x620bddf1, 0x7315cf5d, ++ 0x20d1e8bb, 0xf7c34f1f, 0x5cfcc5e7, 0x9355bc07, 0x8e39ec93, 0xa4c3ac0f, ++ 0x8fd747c3, 0x3787d7d6, 0x2f91b9f3, 0x94248e40, 0xac92a423, 0xd902ff5f, ++ 0xf881929f, 0xe47df4bf, 0x23d40cef, 0xbb4fe780, 0x4e49d9c7, 0x66f1d613, ++ 0xc8fb88b1, 0xbf436760, 0xc941cda9, 0x904ff18f, 0x9ca7f467, 0x647a7602, ++ 0x8e9daf3a, 0xb74592f9, 0x0167a75e, 0x9b53d39d, 0xd816ad82, 0x69d5a9c7, ++ 0x69efe43e, 0xc2956bac, 0x097f7be5, 0xf59c37e0, 0xb69839fd, 0x73b8e81e, ++ 0x5af1dd41, 0x8b016ff8, 0xf9e056d5, 0xa63b83f9, 0xba6d1ca3, 0xc441ea7f, ++ 0x7b7cbf3f, 0xc0f8aa37, 0x6cefbe19, 0x956f8f2e, 0xd23f936c, 0x1cb3c3af, ++ 0xc99e9d60, 0x8184645b, 0xc6b00c1f, 0x61692e57, 0x4d1dc616, 0xcb539569, ++ 0x98666f50, 0x23cfae14, 0x24f49cd2, 0xaf91257a, 0xfdb5fd04, 0x09715df9, ++ 0x61d39bed, 0x71607da2, 0x7486fd9f, 0x9f6d72b1, 0xc4123ef0, 0xc9ef133c, ++ 0xc951cc1b, 0xfd05fb8b, 0xb38e0ed1, 0x89afb8a1, 0xa2ddb4fb, 0x3d432d4e, ++ 0xa0a4d1bd, 0x5748921f, 0x915fb760, 0x8731b29f, 0xb65ea1da, 0xc613dc53, ++ 0x4e6dd6d1, 0xe3f71b06, 0x631ffd52, 0xbccab33d, 0x3df3eb03, 0x0056a673, ++ 0x4621f97e, 0x3ed89ffb, 0xbee301fc, 0x063c1f92, 0x8d163cfd, 0x9cfd837d, ++ 0x40d9d9ea, 0xbec250fe, 0x38577c6a, 0xf0b9f924, 0xcb970964, 0xf1df34c2, ++ 0x642bb246, 0x050213b2, 0x9fbd50f2, 0xcfc25654, 0xe0ff89a1, 0x7d8873a0, ++ 0xc2968f68, 0xcf58bea3, 0x759d708f, 0x8db84ce7, 0x7ba38dec, 0xe50a9e1f, ++ 0x677a7fa4, 0x37e811e9, 0xab8e4fe9, 0xeb0f7eb0, 0xa081829d, 0xf90b41c8, ++ 0x3d9fad8d, 0xa20181dd, 0xc3e666b6, 0x679b5773, 0x65e79892, 0xfa40344b, ++ 0x3b6642b5, 0x0bb20f48, 0xc2fb695f, 0xda6605e3, 0x02c6de27, 0x47e41dcd, ++ 0x412a4aba, 0xb3786357, 0x17a43beb, 0xc6195b4f, 0x526faf5f, 0xfeb0b52d, ++ 0xcb559beb, 0x9967943c, 0x311da235, 0xf547c9bb, 0xbc7d9bb3, 0xe7ebcede, ++ 0x7ea9f934, 0xd79fb34e, 0xe81ea03b, 0xb4534371, 0xdee30c27, 0x4d56c8e0, ++ 0x1cd01f78, 0x6de7ede0, 0xfc147ed4, 0x630b1281, 0xd25129a9, 0x4ca71df7, ++ 0x5168defc, 0x2db5f12a, 0x8aa0eabd, 0xf2679bf4, 0x2b651da1, 0x70029990, ++ 0x6a205367, 0xac2df686, 0xb7d71723, 0x4154b827, 0x91e3dbf9, 0x1edf5c15, ++ 0x48fd6f70, 0xb47285bf, 0x1c982bd4, 0x3c0b3de0, 0x5db3af74, 0xb723efc4, ++ 0x0cde29db, 0x9bc50eb6, 0xc279edd9, 0xf4e7e18e, 0x5139f9d6, 0x3619e3d4, ++ 0xa472e1df, 0xbf7c53ef, 0x429dda7f, 0x167739e3, 0xe8bc5345, 0x95f8ea57, ++ 0xafcdfca1, 0xccd676c5, 0x7a7f9c14, 0xda2a6073, 0x98db6d91, 0xc830d50f, ++ 0xfb0f3d37, 0x0ceceb49, 0x82186f1e, 0x67cf8770, 0xd06002e6, 0x07c16d0b, ++ 0x9eb8a90f, 0x8e052645, 0x9e2fe84d, 0xd3b7545f, 0xe797edec, 0x350e4211, ++ 0xdf5031fd, 0x38e20ef8, 0x7ceb9bee, 0x011c1f18, 0xf3c60c3e, 0x447d5ab7, ++ 0xb22dc8e7, 0x446df90f, 0x19298e50, 0x11edf2fd, 0x39408ee3, 0x197771c4, ++ 0x4ef86de5, 0x136d1ca3, 0xc595ba72, 0x6e3821e4, 0x4b71a327, 0xc0fd8d3a, ++ 0x3cf09463, 0x48d7944a, 0xc05c5f59, 0x74018740, 0x9d7c945e, 0x3aeaebfd, ++ 0x32eb4654, 0x5ea175f1, 0xc732fa83, 0x1f50870b, 0xa4c93596, 0xc7584a6f, ++ 0xc97f5c71, 0x5a0c194e, 0x5560afd8, 0x7d373e2a, 0xdad48983, 0xe90f59b7, ++ 0x5bad4b85, 0xae24778b, 0x657d7133, 0x47ae6625, 0xb5707b34, 0x4dc1ec9d, ++ 0x3231812b, 0xc54adec9, 0x597b42b8, 0x4097dfdd, 0x3d84e7bf, 0xcccaf96a, ++ 0x839b49f5, 0x7ae2d4f8, 0x7f1f5ca0, 0xba88c9f8, 0xdfa84ae7, 0x791beb90, ++ 0xcfee82dc, 0x7bd8f512, 0xeb8d8f42, 0xb2f21935, 0x6a9539ae, 0x109acbc8, ++ 0x13c036cf, 0xfa19e7cf, 0xe9f082d7, 0x57edebdb, 0x2927da18, 0xebe01957, ++ 0xfa18d7dc, 0x0deb514f, 0x69f2b4f0, 0xb3627909, 0xeaccf00d, 0xcffa18ef, ++ 0x6866dff2, 0x8f78dd9f, 0xc086fda1, 0x537c0332, 0xf430ffd3, 0x66d839bf, ++ 0xc2ceff68, 0x13da191f, 0x3cad27fd, 0x3ce3c251, 0xb7a1dd9b, 0xec2d8028, ++ 0x7de724a9, 0x19efbf5c, 0x4a9edc69, 0xca5457ec, 0x8909f7f7, 0x6e22c7cf, ++ 0xf98e3c43, 0x5d7886dd, 0x7b78fc6c, 0x5aa38c2f, 0x3ca1ef7d, 0xbf0ea263, ++ 0xee1b76bf, 0x841fbad9, 0xd2de307e, 0x9e1722f4, 0x0dff1877, 0x16dee1c2, ++ 0x857dd135, 0x84b97dab, 0xcb0daef5, 0xbce55c79, 0x7d79e295, 0x1a46b078, ++ 0xaf710bef, 0x4db9e1a5, 0x60b691c4, 0x240f091c, 0xb7ea14ff, 0xfbf7852c, ++ 0x3b8b5389, 0xdcdc6906, 0xf2846b6a, 0x248416f1, 0x05b7038c, 0x26f78299, ++ 0xfce20f68, 0x32f9345f, 0xa2e245d9, 0xe66ec29b, 0xcbdcf987, 0x5856ad23, ++ 0xed53fa5b, 0xab8a3d0f, 0x0632310d, 0xff5a9f72, 0x0a63c610, 0xfc0090f0, ++ 0xe74e6572, 0xf3dbdfad, 0xdf30d3c9, 0x2aceb9a6, 0xed89abd4, 0x395e4bf9, ++ 0xed22e073, 0xf4bf175b, 0x7b171dc1, 0x4fbb7bfe, 0x0fb5d1ac, 0xca6d271a, ++ 0x1f1d7e63, 0xde92cd00, 0xe52c8c0f, 0xf192f9e7, 0x9d638a56, 0x94470737, ++ 0x3e7d9f02, 0x77638ffe, 0x53bf73c1, 0x7a8addcf, 0x9647ea10, 0xd7447ef2, ++ 0xa59c95df, 0x2bc292bc, 0x7187bec0, 0xf39252db, 0x5f18b36d, 0x31c73576, ++ 0xdd34b40e, 0x9f9fa2aa, 0x7d56f76f, 0xbb631574, 0x4eafdc2d, 0xf6b7dff4, ++ 0xe45ddbf9, 0x38c4077f, 0x2b34a20d, 0x8f6679fc, 0xec29d930, 0x30f424b3, ++ 0xa84a7467, 0xc816f2af, 0xa2e5eb1f, 0x714add3b, 0xc443a704, 0x0d0b1c1d, ++ 0x6e2d0171, 0x877e9dd0, 0x8cef7c84, 0x7cf145dd, 0x3dd0178c, 0xc497d8bf, ++ 0xbdbe4178, 0x7c1af084, 0x9f57d67c, 0x27992526, 0x3e2d0f01, 0x144f3891, ++ 0x9f3c09ed, 0x3d92a717, 0x87eeb891, 0xe1e76b4a, 0xf8d6a97e, 0xfea1d75b, ++ 0xf3a16e3e, 0x497e3068, 0x54595351, 0xd292fe37, 0x6937d222, 0xfa86d9e5, ++ 0x8b1e5f74, 0x8f77ce1a, 0x8cb27942, 0xacc3cddb, 0xe386ebbd, 0x7cf9877c, ++ 0x373e2cc7, 0xec7083d9, 0x6f7bb9e1, 0x66073f29, 0x1430e1a0, 0xe5fb8ce5, ++ 0x58d7209d, 0x642b096e, 0xf9036d9f, 0xb0f1f843, 0x5c34654a, 0xb08ee54e, ++ 0x8677da8f, 0x3a7e09ab, 0x577827ec, 0x67ca91b8, 0xffaa01c3, 0xe089b859, ++ 0x2a41c2e7, 0xa90bc2bb, 0x887085fe, 0x2bc317e0, 0xed097e08, 0x538c52c1, ++ 0x27b953b7, 0xafed41dc, 0x7e093b84, 0x32a51c2d, 0xf545de16, 0x045dc37b, ++ 0x26ef0fef, 0x463840f8, 0x41f0c1f0, 0x7b870f2a, 0xf868fea8, 0xe2e7827d, ++ 0x8fdef13a, 0x7384f7b5, 0x5596bfd0, 0x0d1eefb4, 0xbed0502e, 0x2933cf76, ++ 0xbec1cea8, 0x1ce30bba, 0x3df99adb, 0x6247de26, 0x6edd881c, 0x3dd27b22, ++ 0x934391ef, 0xb50e7da8, 0x7321c66f, 0xb85a3f81, 0x5b16cafd, 0x130b9fa9, ++ 0x6db9e0a2, 0x5ec99a8b, 0xa54b28ed, 0x4c8b5776, 0x5356df76, 0xb2fc8b28, ++ 0xdfd2655b, 0x1fb70b2e, 0x56783e34, 0x4b67dbe8, 0x32ef9e65, 0x4653ef9c, ++ 0x6473f271, 0x3766a96f, 0xf5c41fb5, 0xfac2e7b9, 0xcbb9df10, 0xeb2f78ed, ++ 0xf744ddba, 0xe02e8fb0, 0x799eb2f7, 0x7c055fdc, 0xe6cc2e28, 0xb8a7e4c9, ++ 0xbc22aee6, 0xa7aef33c, 0x03f86576, 0x77a7e859, 0x22cf9686, 0x8a659b7c, ++ 0xf706766b, 0xdb3de166, 0xe4ef9156, 0x881a9a1a, 0x67c40e56, 0xa7bf296f, ++ 0xc6dff0d3, 0x01e0dfb8, 0x24f9e97b, 0x5b34c0eb, 0x8898673a, 0x4f603de3, ++ 0x40fbc71a, 0xb891ef8c, 0x657bb1fc, 0x59c7bf92, 0x7ef9052c, 0xf94cb34b, ++ 0xcf75f923, 0x2abc60b6, 0x2bf82cb7, 0xd4c7c394, 0x80657b31, 0xf8f91bb3, ++ 0xa7e5cb45, 0xf7ed12cd, 0x7ea06b27, 0x021bdddd, 0x0d90ea88, 0x5b8a2b6a, ++ 0x7297bce7, 0x91e5fe31, 0x95a3fb8c, 0xf4fb15bf, 0xb78f9fb8, 0xf14cb965, ++ 0x8bcb5764, 0xde7cfdde, 0xbcde710f, 0xc149bfe1, 0x39e29534, 0x865509aa, ++ 0x067cae67, 0x67b94be7, 0x66912343, 0x6f9b5f83, 0xb977ce34, 0x83f61a74, ++ 0x09305706, 0x93e9835e, 0xf391e94b, 0x9839e9a5, 0x59f2c317, 0xad91ea3e, ++ 0x22b7ae16, 0x927b716f, 0x0dc68292, 0x17cb479c, 0x1207f2d0, 0xc26c05f3, ++ 0xb1b7cfae, 0x4ab9f7a4, 0xa11fdd9f, 0xfaff71f2, 0x78d9e500, 0x61d24c65, ++ 0x2eec2d4b, 0xb5a5e7dc, 0x126b4aa9, 0xb7d3e87e, 0xc080c7a8, 0xf62632a6, ++ 0x1f234365, 0x99c7c4c7, 0xae085ac0, 0x24912875, 0x1f2b5afa, 0xcb58e311, ++ 0xdfe6df38, 0x0775b3fd, 0x5b0f7f70, 0x8b6a3728, 0xfc8eba29, 0xd266638b, ++ 0xaee679af, 0xf0eb4fed, 0xece22e1a, 0x0ad1ac5b, 0x84ee87bc, 0xaf512af1, ++ 0x6254bca2, 0x18f8101e, 0xcf6bba3a, 0xbedc65a9, 0xdac2ec7c, 0x9e7fba2c, ++ 0xed052abb, 0x27664ea3, 0x4259707e, 0xfc75a359, 0x4cbe42e0, 0xca531fc2, ++ 0x31df42ac, 0xbc58ed47, 0x72e7e197, 0xc025ea3d, 0x1905d5fb, 0xcfd61e74, ++ 0x28da677b, 0xc9ce6b80, 0x65b2cf94, 0x1cd3cf11, 0xca26aff7, 0x07ed7913, ++ 0xf6bbefdc, 0xebf206be, 0xa8f94572, 0xda6af3f0, 0xfb062f99, 0x41c0b352, ++ 0xf384d4fe, 0x9fbd49f2, 0x31e92144, 0x78f05fe8, 0x687135cd, 0xb8dff1d7, ++ 0x40fec653, 0x19da3351, 0x7ac6bdb9, 0x4f17dcf7, 0x3a79824c, 0x3b87f117, ++ 0x0877bc2f, 0x1372c8e1, 0xfb8049c5, 0xb9237ac4, 0x2394e714, 0xb9bf98b9, ++ 0x9f48cece, 0x15d9e6bb, 0xcedd07d4, 0x9d7fd254, 0x0ec83b37, 0x34b25b5d, ++ 0xdb64ed05, 0x5859e5dc, 0xb646b30e, 0x5834ec63, 0x7bb66a36, 0x2d5be91c, ++ 0xaac2255f, 0xcdb81ec1, 0xdf1c8c2a, 0xd46493c3, 0x659f3c97, 0x87a8d97e, ++ 0xdf582523, 0x26a87841, 0xdf17c796, 0xe3c2df07, 0x50bcfc86, 0xf00ed0ad, ++ 0x778223ed, 0xe77ec196, 0xb1ba44e6, 0x64e3b369, 0x316bc533, 0xb7e608c9, ++ 0x2b31082c, 0xd95737d6, 0xc9ae72f5, 0xff95d7c9, 0xdf3dc4ab, 0xa5c0f4a5, ++ 0xbc94bdc6, 0x72e628cf, 0x6d3f9833, 0x6a9f441b, 0x2593f1fe, 0x6c517e5c, ++ 0x693d5ce9, 0xf55f6a4d, 0x6d51bd0a, 0x332a79e5, 0xd237269a, 0x57a44c3d, ++ 0x83be7cc6, 0x9d3a9e42, 0xdc4f74e9, 0x7862c459, 0x6f99106f, 0x1c9ef1e2, ++ 0xb9b3affe, 0x9b43e288, 0xa45650a4, 0x41ebe318, 0x275fee2f, 0xe61d28d0, ++ 0xf5c854df, 0x14868b3a, 0x7186afbc, 0x4ff1ea16, 0x7b25df12, 0xcc1af298, ++ 0x55aa7b24, 0x7970cf17, 0x8bf1a4e4, 0x3c237109, 0xae11bcf1, 0x5c031665, ++ 0x93c2376f, 0x0bfc2314, 0xdcebfeb1, 0xaa29fac6, 0xec14f611, 0xfcf1314f, ++ 0x2eb884fe, 0x4be3077b, 0x6b4d6205, 0x81d8ccaf, 0xde828a71, 0x5b2e3c45, ++ 0x63207a08, 0x9f239c60, 0x5fa42545, 0xb735fc62, 0xf2e295bc, 0xf18905ee, ++ 0x83c510a0, 0xb8b2e312, 0xcf0728bd, 0xcff3c95c, 0xff04554f, 0x74a5e509, ++ 0x99e3c714, 0x7ee94b6d, 0x90e6758a, 0xbe45795c, 0xf2f3c0d2, 0x3683a221, ++ 0x4445ca1e, 0x07947eb7, 0x11c3fc3d, 0x765dffc1, 0x888b9735, 0xecacfcfe, ++ 0x685ca0b5, 0x1f260df3, 0x8b567c9a, 0xef2d147b, 0x4b189ce6, 0x2e59bbcb, ++ 0x277705f2, 0xf39cebe4, 0xffa26434, 0x5967ae7c, 0x4439326a, 0xb8d88bb9, ++ 0x4eb9621c, 0x1ca0dfe4, 0x39738646, 0x9fdb7ac4, 0xecc9025a, 0xfb8b1fc5, ++ 0xdd767bd2, 0xdd23eeb5, 0xb57716fa, 0xbb25e018, 0xe7d3ae57, 0xff83dd47, ++ 0x76b3e4c1, 0x8bb5f946, 0x3b3e72c4, 0xdba7ebf1, 0xbf022ca0, 0xbb8c387f, ++ 0xe524f4b8, 0xb716338b, 0x58febee2, 0xf519a39c, 0x9cd7edc9, 0x2ffce2e1, ++ 0x31c436cf, 0xd2c478b4, 0x1b2baa8d, 0xd54ccb9e, 0x767c74f2, 0xf115c7ca, ++ 0xc1f6c18d, 0xa98d3e76, 0x6c01f7ba, 0xfe918872, 0xf5419f39, 0x9c5f7197, ++ 0xe0e87c3b, 0xe1aaa0f1, 0xdd6b8e9c, 0x078c1ea1, 0x33df0459, 0x2c67d03b, ++ 0x33ff01ca, 0x54bcf2a7, 0x1718c78b, 0x133e60b2, 0xbe9adff4, 0x2da9e490, ++ 0xbaa5e785, 0xa12f991f, 0x319d589e, 0x512be499, 0xc7e5128e, 0x13c5f225, ++ 0x33e607e5, 0xf2574bc0, 0xf24da5f3, 0x252f5105, 0x17ffe7ae, 0x3e94d03f, ++ 0xc9ec87a6, 0x76d55482, 0x53703b11, 0x9f1a3238, 0x5a1a9b5b, 0xf7bf7788, ++ 0x90dcf33c, 0xac0760d5, 0xc83918c5, 0xf667caec, 0xcffcc6cd, 0x574f824d, ++ 0x9f8898e7, 0xb738b79c, 0xe4fc759b, 0x68bd06b4, 0x224d3a07, 0x30ff09ef, ++ 0xb9dab47e, 0xf9927d63, 0xcfa67b35, 0x3c026bce, 0x49b8fb74, 0xf37d91d8, ++ 0xbb6f277d, 0xd38e3759, 0xf34d1c16, 0x89fde5f5, 0xb37cd6f9, 0x388b36f9, ++ 0xeb9f3690, 0x5cfae356, 0xcfad10d6, 0x36aff425, 0x5f5c66df, 0xe4bab912, ++ 0xecafc27c, 0xc6bbef9b, 0x216cb9f5, 0xcccb9f5a, 0xf37d69e3, 0xf366f9ad, ++ 0xae7c8459, 0x5939ef16, 0x28a30b52, 0x17bd838f, 0x5f97d6d0, 0x0f50501d, ++ 0x64e2d6ad, 0x4d9fcf42, 0x854bf3d0, 0x3f9ed79e, 0x7142539b, 0x6707b3cf, ++ 0x3bf4c92b, 0xec2675ea, 0x2bec262b, 0x842bec26, 0x589fd467, 0xf1f8143e, ++ 0x307ccfe7, 0x6cf3865b, 0xc6273dc6, 0xe47c0214, 0x10e6ab99, 0x1789ccfc, ++ 0xd191e1f3, 0x5b377ebb, 0xe33d7d06, 0x3ce713e1, 0xb888eed0, 0x5da034e7, ++ 0x61eb843b, 0xde6d6f0d, 0x4bc3d098, 0xb8f31456, 0xd44be81e, 0x21856ddf, ++ 0xcfb77186, 0x798cf13d, 0x41497fd0, 0x093f39dc, 0xc972b45d, 0x3cfe328a, ++ 0x31633f5a, 0xf3eb8b8f, 0x37f7b5eb, 0x6fef8d1a, 0x27ac6464, 0x458528bb, ++ 0x6963d415, 0x6fbd3f76, 0xd2ae5f58, 0x7cc0ddbe, 0x569edc4d, 0x031e794b, ++ 0x7663df7f, 0xa95718b5, 0xdfb605f9, 0x46aff260, 0xe357ef3f, 0xb3450ee6, ++ 0xbb17cb51, 0xcafdffa2, 0x3de75f9d, 0x4a1f19dc, 0xe4cc46dc, 0x23198871, ++ 0x78fa3e38, 0x8383da1a, 0x0377f3d1, 0xf4e7e9e8, 0x7a73f6cc, 0x568cf12a, ++ 0x5925ffd8, 0x2483e771, 0xf4a4b1a7, 0x04d7401a, 0x9c397dfa, 0x198ffe69, ++ 0xd14bcfcf, 0x96aba35b, 0xa926d757, 0xb2a764a5, 0x2c5e435c, 0xb26a39f8, ++ 0x61b58dfb, 0x77d00f7e, 0x0c827aae, 0xdbab30ed, 0xdf798e57, 0x27367f6d, ++ 0x28ab57cd, 0x6b717ee7, 0x3be52a46, 0xc95865b6, 0x98ceed0f, 0x2aee30ca, ++ 0x5d13263b, 0x291a321a, 0x843cd10f, 0x969fa175, 0xce6d7f98, 0x63f29bbc, ++ 0x5968f9cc, 0xbf97d943, 0x5ca3b7eb, 0x65f43f99, 0x2e01917a, 0xbe5aff33, ++ 0xf675fe54, 0x9d7f9e54, 0xe4315561, 0x9add3ab3, 0xcffaff34, 0xc6e81ec2, ++ 0x7ae0e5f5, 0xfede7d60, 0xbf0ac975, 0x34fac66f, 0x42567fbc, 0x62cee28c, ++ 0xce1e7ffd, 0x8feb45f7, 0x07ea2b5e, 0xa2a7d5b3, 0xe6ce62dd, 0x63dd87e7, ++ 0xfd3ae562, 0x87ffcda5, 0x7e7a16e1, 0xc78508d9, 0x5edcecdd, 0xe4cbf19d, ++ 0xcbe3f479, 0x724bb8b5, 0x6f8c1bbe, 0x7cf137ae, 0xe72e4d33, 0x0794ac38, ++ 0xaee1c737, 0x1cc178c3, 0xd953c460, 0xded7feba, 0x961fdfc4, 0xa7e46e7d, ++ 0xf899afb7, 0x8619b78b, 0x3edeb9c3, 0xef42c53e, 0x98971dd3, 0x303d97df, ++ 0xc81033cf, 0xce68849a, 0x15627e9c, 0x28e9638a, 0x33d27646, 0x6a3afbce, ++ 0x020bf254, 0x4e61d0e5, 0xf424d670, 0x1a6fae5d, 0x5ff606fd, 0xb9f5c692, ++ 0x24b2af76, 0x067af40d, 0x88dca3dd, 0xff1f3ffd, 0xf21d4669, 0x442f1c97, ++ 0xe9fd74bc, 0xbfd7457e, 0xc19ff459, 0xd38b375f, 0xe6ce27f7, 0x209bf47c, ++ 0x2771fda3, 0xcfd0a7b3, 0xd27dba60, 0x1bfa07f4, 0x33f47afa, 0x96cece98, ++ 0xdeaed59c, 0x2b44fa24, 0xcbb7ee9d, 0x701e8016, 0xa545bee6, 0x6fc9bf56, ++ 0xd9268c6e, 0x7d8a1fe7, 0x7ef6c6fe, 0xb63b6027, 0x3b07dedf, 0x8f4887ff, ++ 0x3b8e9acf, 0xbe92c0c7, 0xec8670d7, 0x93558b7d, 0x97fc9543, 0xcf78d87e, ++ 0x51dc39b7, 0x33d5ef86, 0x6b8c03a4, 0x5b46fa11, 0x406365af, 0xfc1f7b41, ++ 0x9dc23f67, 0x435978e1, 0xfff3ff69, 0x1611e84b, 0x6de7a329, 0x9edd6f82, ++ 0x31d2bae0, 0xf2251794, 0x3e831489, 0x3590d59b, 0xa0ed0729, 0xa1cf995b, ++ 0x5a3ad2e2, 0xa136ae51, 0x6e3b42be, 0x3b924aef, 0x45242797, 0xc479ba1c, ++ 0xc5cbd27b, 0x9cb9e87d, 0xa6cf5a06, 0xc4247f3e, 0x04f35fc8, 0x9d6f507a, ++ 0x0f42c47b, 0xb633aa6d, 0x60813dbb, 0xc777e02b, 0xcddf3c8b, 0x3ff60cd5, ++ 0x971e17c6, 0x780d9628, 0xa4405e50, 0xe623fb90, 0xc08b074e, 0xc1cab6fe, ++ 0xfb7a23bf, 0x5a4cfbd5, 0x5bf430e2, 0xf64acc3c, 0x38296adc, 0x66b7bf85, ++ 0x24e2c962, 0x38f3962f, 0x15ca2fc0, 0xfdd38f5a, 0xf71fe72e, 0x860b653b, ++ 0x1ffcbe5c, 0x1ffc7111, 0xdef4aa65, 0x6d1f668f, 0x2a3fc418, 0xfa0930a9, ++ 0xd0457389, 0x7682cecf, 0x14b31794, 0x5dc241e0, 0xacfb3ecf, 0xf9444893, ++ 0xfd84eb88, 0x5a938da3, 0x54c6a512, 0xa5f49f9f, 0x79f9f8a4, 0x11dc84a1, ++ 0x7fb5c390, 0xff9d2732, 0x14de76ac, 0xfec6e7dc, 0x1cb06a0d, 0x3ff7c4cb, ++ 0x51de14d6, 0x66b9fb8e, 0x5cbfd1aa, 0x8f7d5273, 0xf30e63f2, 0x82eef67b, ++ 0x60099732, 0x6c8b41c7, 0xda1c48bb, 0x7a89e70a, 0x2ac33b11, 0xecd7b4f2, ++ 0x6b95f9e5, 0x783d551c, 0x91c6bf9f, 0xebdb4553, 0x5a9af9e0, 0x00e3877f, ++ 0xc7c3a5f1, 0x781d2def, 0x2688487e, 0xf112a3d0, 0xd0f4403a, 0xbd451dfa, ++ 0xc7fb143b, 0x958fbe18, 0x7ea0ebe2, 0xc7e03976, 0x0e7b5cfc, 0xbb11fba3, ++ 0xb52be5c2, 0x49ecc4c4, 0x946fd1e2, 0x4d64f3f3, 0x1d4f5565, 0x17e327e1, ++ 0x771ad809, 0x79ce9b95, 0xdf3c3ba4, 0x73946b96, 0xb064854b, 0x1e44dbb7, ++ 0xb22bade9, 0x61570d22, 0xeff0257c, 0x63ae38e5, 0xcce51dbe, 0xa2e63e9c, ++ 0x3a0e65e3, 0x312af75e, 0x6ae2a59e, 0xc14aa71c, 0x6f422cf1, 0x40bdd224, ++ 0xbd9ff38c, 0xd2ca06b7, 0xd304c3fb, 0xc9dcc586, 0xdbea43de, 0x9d1f713f, ++ 0xd637dcf8, 0xf18cabc7, 0x3ec7d017, 0xcae2ff5c, 0xa8ea0793, 0x1e5dc786, ++ 0xe68cfe17, 0xd8c53897, 0xbde86ea0, 0xea9488f6, 0x0840efa3, 0x6299c53f, ++ 0x7bff43a4, 0xbe1f7ca4, 0x67f9e268, 0xba30e45f, 0xeb94481f, 0x987e8e2f, ++ 0xd067f7a5, 0xb8dbf18f, 0xef17e31f, 0x7c45fa91, 0x378c610a, 0xf216f290, ++ 0x6d1f17df, 0x035a7f52, 0x8f40d9f8, 0xc95c609b, 0xb6fe2213, 0x28bd7a79, ++ 0xbbe285ef, 0x7e748907, 0x74afec58, 0xc62f29ff, 0xe2721bf3, 0xfde4c9b9, ++ 0x73e79589, 0x4c4f3d71, 0xa157cbe9, 0x4e27967b, 0xfcf19ba8, 0xbe321c88, ++ 0xbf8da5f7, 0xb3efd0f4, 0x2f79ba82, 0xc6555ef5, 0xc8cbf5c9, 0xedcf9c6e, ++ 0x7bf6bfc6, 0xe3cf8f56, 0xc96eea76, 0x2c7f9fa8, 0xa0bb72f4, 0x4cbceb97, ++ 0x2f68cddf, 0x18acae0b, 0x650cf18a, 0xc2e5ea3e, 0x6d1f3c95, 0x9f960fe9, ++ 0x7c8933ba, 0x304464fc, 0xb835fd8c, 0x7a4addba, 0x9451cdaf, 0x83fbb179, ++ 0x443df7c1, 0xefdb4a7a, 0x3cedfbda, 0xedc8234f, 0x0ef06768, 0xcc48ffca, ++ 0xdfac18cb, 0x07ae0ad4, 0x26b6feb5, 0x39b76f6e, 0xc2b8a7ae, 0x2431f459, ++ 0xc9fc3fb2, 0x5c068fce, 0x1d8fa09c, 0xbd8cc9ce, 0xb8e0a577, 0x3dcfe116, ++ 0x9a45c5ae, 0xdd7eecaa, 0xab9b96f3, 0x3e3a75ec, 0x2f3c6369, 0xf7fc7136, ++ 0x22fb342a, 0x2120edc6, 0x7f3c16cf, 0x2394c631, 0x3bd3ee9f, 0xbcf27864, ++ 0x72fd65ac, 0x830ee3cc, 0x70a561e7, 0x7b22adb9, 0x63e6136c, 0xdadc1d81, ++ 0xd2187f34, 0x7c1c9377, 0x887405c2, 0xfca3607f, 0x72167fe1, 0x74e42bda, ++ 0xb08bfdb0, 0xfe9494bd, 0x2f8fdb20, 0x8c9f0183, 0x68b944c9, 0x4635312b, ++ 0x1df3ac93, 0xd88bceb1, 0xbe2b07e3, 0xac7e3d9e, 0x8e3d8922, 0x213fb6f6, ++ 0xd187afae, 0xb127f6ce, 0x22498fc7, 0x63f220be, 0xddd4598e, 0x639740bd, ++ 0xbbe93213, 0xfc69a560, 0xfa18e1be, 0x87e05527, 0x04a2733c, 0x521997ed, ++ 0x848077df, 0x0608c43f, 0xea24e47f, 0xf42c59e3, 0xc9129dec, 0xc0a7bf11, ++ 0xa5e7685b, 0x0ad9f9f7, 0x0ebb7c46, 0xfae30ff6, 0x9bcc2e9b, 0x9e6e2c92, ++ 0x5f2fa237, 0xef75d996, 0x1ddc32d1, 0x80ce3ddd, 0xfb84a9fb, 0xc0aebc28, ++ 0xbeed5b7c, 0xccffb12a, 0xd17de36a, 0x2e3c0bba, 0x458bbb62, 0x1f30941f, ++ 0xbb3ed8d3, 0x1f7892d1, 0xba47b866, 0xc4496021, 0x37cfa227, 0x3776d82e, ++ 0x2a4f3bdd, 0xb63479e0, 0x04e28cc5, 0xb64cf789, 0x337e3dd1, 0x3134c55e, ++ 0x8c0eaa9f, 0x267e6393, 0x189b0fc5, 0x5ff982db, 0xbc798c0b, 0x7fa647ae, ++ 0xd20bbfc2, 0xb8f388d1, 0x7b420ec1, 0xf63415da, 0x3073eed3, 0xbeff452d, ++ 0x24bdf6b2, 0xc226cde7, 0x5226458f, 0x87f716bb, 0x675a8efe, 0x2d9dbaff, ++ 0xbd3fafac, 0xbe4914b7, 0xa69bcdee, 0xc61df7f3, 0xa0c74684, 0x88c7df29, ++ 0x580bf90e, 0x1d12f554, 0xb6e8f70c, 0xceb49d82, 0x1b190bb3, 0x0c1d1122, ++ 0xd270b9ed, 0x02c0fdd3, 0xac3abde3, 0xfa2700d3, 0x53f297ab, 0x1725056d, ++ 0x8a97f3d5, 0x7dc4da63, 0xc42375dc, 0xb2471e77, 0x39176891, 0xf6847e6f, ++ 0x07ec2ce3, 0x927bb9e5, 0x806db7df, 0x6cbbf1f1, 0x6979099f, 0xdaba7713, ++ 0x5f986cf7, 0xa4b7f7a6, 0x34b38e6a, 0x63efc024, 0xb9c9192b, 0x31d9952d, ++ 0x6f1a5c2f, 0x6ddd23f3, 0xc9618036, 0x73d99592, 0xe22cdea1, 0x9312add9, ++ 0xcf8a6611, 0xda8fe3ce, 0xf4a274f7, 0xe6c19d3d, 0xc823bed1, 0x6d39fc22, ++ 0x8fdf019e, 0xf8f3c8bb, 0x6f36919e, 0x140df3ff, 0x1fe6d4cf, 0x7d83fe8c, ++ 0xd4ffee2f, 0x8f3573bf, 0x5f887aa7, 0x95f9fb9b, 0x1f8279e0, 0x0bd479f1, ++ 0xeecd69b7, 0x3fe8919e, 0xcd37bc9c, 0xadd25eb7, 0xcccd3223, 0xf5f783bf, ++ 0xc3c3ebc6, 0xf7f216ad, 0xc4bac4d2, 0x5d775f78, 0x6bd3a7f4, 0x0da5f16b, ++ 0x6668f7cc, 0x0cef7f74, 0xd3227dd6, 0xc1ac3bbd, 0xdf7427a0, 0xd6f18007, ++ 0x1fefc83e, 0x2df7e336, 0x6f67fef0, 0x6ae9de7f, 0xe907b607, 0x3e5a12fb, ++ 0xae8fe62a, 0x0f7fecaa, 0xc1bef137, 0x24e30cdd, 0xc04dd789, 0x137cc085, ++ 0x06922cec, 0x39d64be7, 0xc3dfaf8e, 0x1ea1d7a2, 0x0f04f012, 0xf1367fd7, ++ 0xf994357e, 0xfb3fa231, 0x98dbb60d, 0xbafdf28d, 0x8ff51b25, 0xb8fef015, ++ 0xa8724b41, 0x630bbe9d, 0x96fb3d63, 0x3849bf40, 0xdc7e8e6e, 0xe7b71898, ++ 0x13a4fc61, 0x0e1ef4c2, 0x7c4ddfbe, 0xe1cf55d8, 0x3317e8a8, 0x5d73d267, ++ 0xfea432fb, 0x8c42c67a, 0xae7fe3ef, 0x3c1efdb4, 0x5f07380a, 0x79494375, ++ 0xef4c2d09, 0x9d5ea067, 0xba6bcba2, 0x9d39dd96, 0x37e705cb, 0x384fd459, ++ 0xabe8356f, 0x8356e26b, 0xac2f933e, 0xafe78339, 0x3d4254ed, 0x7cb7eebb, ++ 0xebc520bc, 0x7db1b765, 0xf9e3c8a2, 0x7d6f4d67, 0xf88b7d8b, 0xd24e42f0, ++ 0xbe7eb8fc, 0x3fbe188d, 0xaaf58562, 0x44632c66, 0x9f78ab67, 0x34f48ade, ++ 0xdfffcff7, 0xf9bab4a5, 0x0ae6013d, 0x8e76fd20, 0xb8af5808, 0xa0feffba, ++ 0xec00e506, 0x2f78acc2, 0x58de6373, 0x1c91f335, 0xdee663c4, 0xcbcce724, ++ 0x68f95de9, 0xf67f7517, 0xbfb63e52, 0x7ca5e67c, 0xfe5f73b4, 0x8e3369ec, ++ 0x3f8a7b57, 0x0f250357, 0xfe242d2e, 0xfa5d29e0, 0xd3df1e7a, 0x713e13d7, ++ 0xdbe7a2f5, 0xb37cf14f, 0xcc0739e2, 0xbf049651, 0x23160e09, 0x0d2bb9ff, ++ 0xe41670ed, 0x3e08d7f3, 0xca6e397e, 0xbe75806a, 0x13e4ca7c, 0xfe7f36f9, ++ 0xc62f6b4a, 0x70d217f6, 0xef4f97fe, 0x78750735, 0xfbf8235e, 0x50f03c6c, ++ 0x3e673e06, 0x9093ed4a, 0x69f7884e, 0xe792bfc0, 0xda7e2243, 0xe783983a, ++ 0xd4fb666f, 0x0e7b8c5a, 0x7f8a3e61, 0xb15cf7e2, 0x7cf14fdf, 0xb8f5c32e, ++ 0x0d3f2609, 0x0f3c57e0, 0x6cde62d6, 0x1ba3bf9e, 0x77c877df, 0x79847f47, ++ 0x613adac0, 0xfb13f27c, 0x65b688f1, 0x35615e60, 0x51ac2bcf, 0x87456662, ++ 0x893e1f57, 0x5fbcab78, 0xc3579887, 0x4fc09b67, 0x91c60bc3, 0x337e386c, ++ 0x9c98a1f3, 0xb1bbc78d, 0x6b7bf8f4, 0x702cadd1, 0xfedf0907, 0x758bb27d, ++ 0x5c65fb69, 0xa3c4e667, 0x5ac788f9, 0xfd348ecf, 0x5f735b7e, 0x8cfac34c, ++ 0x8dfba338, 0x84d5b89a, 0xf1830ef7, 0x49dc4643, 0x0d4d73e7, 0x5451e168, ++ 0x01bf458e, 0x8f016aca, 0x960d7017, 0xd30f0b6b, 0xaa35197c, 0xa8cfc70f, ++ 0xf9f0f9f1, 0x80bf1a8c, 0x5e349543, 0xfde1495c, 0xe2bf0422, 0x7d70c0b9, ++ 0xc6d9a71d, 0x5faf550c, 0x077386a2, 0x63c4339e, 0x1c3be2ac, 0xa5141656, ++ 0x077ae65f, 0x52b04ea8, 0xfd224f39, 0xd5ef56d3, 0x511ea3eb, 0x2e328af6, ++ 0xc6d315f4, 0xd783227b, 0x3979da17, 0xefc7b792, 0xfbd95135, 0x57fc5c98, ++ 0x1e9a33d4, 0x18230771, 0x07149f8f, 0x7274023d, 0x7d41fe81, 0x0681e9a0, ++ 0xb0b28721, 0x0f48df43, 0x0c9f4878, 0xfd83c9bd, 0xd1bdc8de, 0x9ac1fa83, ++ 0x68ef7ff3, 0xeeb57e81, 0x89714ca0, 0xcd8d895e, 0x07ffb81e, 0x281df3dc, ++ 0xdb9407e7, 0x90af42ec, 0x7908373c, 0xb8f5035e, 0xf3dc6b1f, 0xd48e3e99, ++ 0x8bee3fb7, 0xcf4d1beb, 0xa622e8b0, 0x36a0eeff, 0xdfc15eef, 0x2fb31407, ++ 0xadeb0636, 0xf5dc3e5c, 0xe30c7cab, 0x873e5faa, 0xb8e258b6, 0x7dbc84a7, ++ 0x2d3fc62a, 0xd0cf63e4, 0xe02b9ec0, 0xa517fabc, 0x51a3a7f8, 0xa0bfb8df, ++ 0x875a8df7, 0x02dcd4de, 0x6af03d74, 0xbc97bd3a, 0x5cfe2324, 0xf1f0778b, ++ 0xa36f454e, 0x6ae36af5, 0x7f8fc0fd, 0xbf1d0af3, 0xcc9f71ae, 0x5ca73d20, ++ 0x559d7e5e, 0xa9613de4, 0xf053f3f0, 0x65f05473, 0xa2432887, 0x8d7be35e, ++ 0xdff2237f, 0xe49b39c2, 0xe904fc5c, 0xd38b9dae, 0xba464398, 0xc894aa4f, ++ 0xe9869bbe, 0xf3fedeb6, 0x0f38aa60, 0x5a5eb266, 0x8c59b7df, 0xb79523ca, ++ 0xb4c97e51, 0x2a65e7f2, 0x5fc4bd2b, 0x0c7c84d3, 0x6fb15fe0, 0xab2d9559, ++ 0x175fcf90, 0x585af7fb, 0x5572be25, 0x1a30dbce, 0x5b9a66b6, 0x729f7da2, ++ 0x1c617581, 0xe0f4cde7, 0x7fa82caa, 0xf7d98273, 0x88fbc320, 0xbcfc93ef, ++ 0xea4ef239, 0x448566ff, 0xe575dbe7, 0x02979b1b, 0xf92b53fe, 0x5834d3f3, ++ 0x0235f549, 0x6dabf13c, 0x708f921e, 0x9173e735, 0xf05fb27f, 0xe89a94cd, ++ 0xed3fec36, 0xd9e69dbc, 0x2bf7f42b, 0xf72a72e1, 0x4e547d84, 0x7ee9f8f3, ++ 0x9b0acde0, 0x9f417f38, 0x5c8e7ac2, 0xe51fb1d8, 0xfa3e56d8, 0xf3072fa8, ++ 0x7df4cd60, 0x19cac99b, 0x1ac0cc33, 0xda3f6c58, 0xa52ac7b5, 0xafd05955, ++ 0xa1b8dd51, 0x2ccdfa0a, 0xd098e615, 0xee428d1b, 0xd76fa90e, 0x473e0267, ++ 0xf3864976, 0xbbc851bb, 0x07dbe475, 0x511cb550, 0xbbf199f7, 0x4a76470d, ++ 0xb4f79ef4, 0x01a3b6ca, 0x54e7bfa8, 0x75f70324, 0xd910e9d1, 0x5b2b67b9, ++ 0xbe723ca8, 0xc33e8721, 0xae72e410, 0xdf9da7cd, 0x5da31533, 0x4ceaedfb, ++ 0xf7ea7d83, 0xfef00cb9, 0x7b46494a, 0xe1fab0fa, 0x2f8825d6, 0x0d61afc3, ++ 0xfa88f7c4, 0x13c23ec5, 0xf3c725f4, 0x73e23349, 0x59bb7b8d, 0x8d65ddff, ++ 0x1164588f, 0xc09a63d1, 0x93e570ef, 0xab0e87a4, 0xfdb03a4f, 0x65cff970, ++ 0x62bf5fe4, 0xf7d3e033, 0x5363d0bc, 0xf2a1db45, 0x30bddadb, 0xb34aa1ff, ++ 0xdeb7d38f, 0xeb063dd7, 0xeac7a4cd, 0xf4e38c72, 0xc4ead3e3, 0xf0950e79, ++ 0x17c6faf9, 0x9f8696f6, 0x73c35fd6, 0x1d15f9da, 0x57d7d6e8, 0x8550df6e, ++ 0x8996e57c, 0x1a8aef2f, 0x5767b9e7, 0x8bde81a6, 0xf8065cbb, 0xc1fd6550, ++ 0x7e8c822a, 0x6f25abca, 0xccf5e6cf, 0xf3a9c531, 0x52773c57, 0x6911e7be, ++ 0x97a9f93a, 0xd72a53f4, 0x3c53f726, 0xfc50a7e0, 0x929fb92a, 0xa1b46fe8, ++ 0x91f1852f, 0xf4f9463c, 0xc4cef9da, 0xf8ad8e77, 0x7fa9639d, 0xe56effbc, ++ 0xf6af4a9e, 0x11f162bd, 0x8dff5e4d, 0x4b96e1ef, 0x622f3eb2, 0x442deb31, ++ 0xc6845145, 0x3df3cc19, 0xe113af53, 0x537c59cf, 0x1af9d02a, 0x7e36ed99, ++ 0x5eff99cf, 0xd05b7005, 0xaa3efd06, 0x257dfe0c, 0x169d5fde, 0xf8f677df, ++ 0x3d4ffe79, 0xdfc4e3cf, 0xd9d16863, 0xecaf3f07, 0xf831dfcb, 0x57b4a62f, ++ 0xf1b9f1f2, 0xbe3cada7, 0x1ef12a7c, 0xc53f8b41, 0x38db8a24, 0x95d7bf92, ++ 0x339ade78, 0xcf2fb8f9, 0x2f49f7e2, 0x1fefc0df, 0xe5e5ae5e, 0x9c792b2f, ++ 0x5e045fff, 0xaff809ef, 0xff3c5f41, 0x43cca077, 0x822347fd, 0x5ee92bc7, ++ 0xc413c445, 0xfd836a39, 0x2c3ec0b6, 0x6ef822bd, 0xf4fdd5e5, 0xa979bab5, ++ 0x8af47f3d, 0x7b07afe0, 0xf3d3365e, 0x74395cff, 0x9fa1e7f0, 0x7dfbc2df, ++ 0x6479b178, 0x7c476be6, 0x51971864, 0x49f1e219, 0x3c783770, 0xf2edffe4, ++ 0x9c77fe00, 0x443ddeae, 0x2d871dc8, 0x6d95f178, 0xfd2aa584, 0xfdfe5138, ++ 0xa2dfa80b, 0xa5f1a7eb, 0x584ee22c, 0x843e61d6, 0x2b656388, 0x0724ec8c, ++ 0xaa5149d8, 0x8fde0e67, 0xe625723d, 0x13ef89e3, 0xb8a3e632, 0x2dbeea39, ++ 0x9b371f54, 0x3d6f7fa9, 0x7fcc7b2f, 0xcfc1fbdb, 0x1b4dfa6f, 0x7bfb338a, ++ 0xc7ae004a, 0x29611516, 0xefc58d22, 0x3dbff230, 0x1e34deca, 0xcf73a8d7, ++ 0xe57af687, 0xacdc430e, 0xefd1fe2f, 0x3c5f939f, 0x0ce6be3e, 0x578d03e6, ++ 0x3379d326, 0x7cf1ba67, 0xd18e71bc, 0x366a68fe, 0x2cb71fda, 0xdf386618, ++ 0x370d179a, 0x1f2eb7c0, 0x0f838065, 0xcf00cb7c, 0x30d1355f, 0xd70d82de, ++ 0x78efda19, 0x5e01a664, 0x0326edb8, 0xefcef77c, 0xc68b9c26, 0x0f3b5a73, ++ 0x9d5ef512, 0xbf4eb8c3, 0xbdaf846c, 0xc76f3c60, 0xf3c2339f, 0xa0f88a47, ++ 0x0f8a54ca, 0xed9ea65e, 0xf9abff87, 0x465d2feb, 0xeeb884a4, 0x106ffb45, ++ 0x4f332dfe, 0xc72a3d27, 0x5abcf0a6, 0xef1eac5f, 0x5762d7df, 0x185f7d1d, ++ 0x1edef3c9, 0x6bde291e, 0x4d5d9abe, 0x309350fb, 0xda78c26f, 0x7d7cdaf3, ++ 0xc3cc46fa, 0xd897553c, 0xd6bfd6c7, 0x81bce7b9, 0x97d95f02, 0x7b332fe5, ++ 0xdeffd244, 0x4eeb60cb, 0x91d825f7, 0x6c1af409, 0x95e8c19e, 0xf62a2fd8, ++ 0xd6f172e5, 0x29ea2b60, 0xea6ab71e, 0x7ffdfa91, 0x855b8ecd, 0xb7da313e, ++ 0xbefc4cb9, 0xdd86dfcd, 0xf3cb4df9, 0xbec2bd23, 0xc11af0e3, 0xbe497f1f, ++ 0xe7dff8c2, 0xc5ddfc6a, 0x2d373f50, 0x64902cb6, 0x34ae52ff, 0x89f2e7fd, ++ 0xb75d86bf, 0x9d77f604, 0xc60f7635, 0xea39f6e5, 0xf12bf3ed, 0x6ecc8e73, ++ 0xa7c7eaab, 0x0322caec, 0xef4ac89f, 0xcfb7ec50, 0xfbf88cb1, 0xd89395d6, ++ 0x6b6ae2c5, 0x2b79e495, 0xc5fe5765, 0xf177d7ed, 0xe573edbe, 0x614bbbec, ++ 0x2607b609, 0x2f1087d1, 0x57732785, 0xfe6e425d, 0xc347fae2, 0xe87dd37b, ++ 0xef2fb84f, 0x5becd35c, 0x7abceb2c, 0x8ee837bb, 0x4f15bd91, 0xb7f1ede3, ++ 0xfb7edebd, 0xfaebb34b, 0x36cc7bdb, 0xf3d5ef6e, 0xf6f32fd2, 0x614cfa9e, ++ 0xea1a6607, 0x762aff7b, 0xb277bb5c, 0x81a6ec9b, 0x5f6495f7, 0x78ea7969, ++ 0xed0a597f, 0x736c0493, 0x49c87bf3, 0xa1b31ec2, 0x6d41959d, 0xdda38e2a, ++ 0xff18ca67, 0x4d57edd0, 0x5131bd82, 0x12dbb631, 0x89560ae2, 0x57bdefef, ++ 0x3b44bb0a, 0x9dee130f, 0xd38e67ec, 0xe7abc4bd, 0x0d7dd38e, 0x35ef1b73, ++ 0x78bb9c27, 0xa7427a9c, 0x5c3bf0d9, 0x35107cfd, 0x38c04fdc, 0x659bf786, ++ 0xfdf125d6, 0x2f9daaea, 0x2a23f9e9, 0xfa0f7df1, 0xd117c4ad, 0xe46bc956, ++ 0x4f1f5e27, 0x193e7133, 0x349ecbc2, 0x057b2866, 0xf81af53f, 0xef65afea, ++ 0x099698c8, 0xe2be6ea6, 0xb474b08f, 0xfb1e79bf, 0x9ef12830, 0xbf116f22, ++ 0x44f7c8a7, 0x60c7f3dc, 0x27bd2b3f, 0x6ceef760, 0x6c9df7c5, 0x26a3df98, ++ 0x0fba2fe5, 0xdaf2106f, 0xa6eff0a0, 0xa178284e, 0xbca5cd1b, 0x495f2085, ++ 0x2f9123f8, 0x5b4517f3, 0x2322ffa9, 0x99fc695f, 0xf8d2a718, 0xaf1096d4, ++ 0x9f38c3da, 0xcf841ded, 0x62bf84f2, 0xba05ebbf, 0xe8badad7, 0x277bfe05, ++ 0x247a8ca7, 0xf9c5d17f, 0x1bda0b6c, 0xfa162718, 0x0fb0a265, 0xf91652b4, ++ 0xaf4e5015, 0x7503e830, 0xa5f88595, 0xd7265f77, 0xf654a233, 0xd8feb85b, ++ 0x9747f5c7, 0x380a8fa8, 0x3070e314, 0x189f61c6, 0xa29f6bbf, 0xcbafd7e3, ++ 0x8a4c0d17, 0x39be3359, 0xa1b93d5f, 0x7f37ce8e, 0x7bc54b35, 0xabe45ac5, ++ 0x8cdf7a4a, 0xec75fee2, 0x538c3ecc, 0x3bfc29d7, 0xf817b5bb, 0x996a5b77, ++ 0x629407cd, 0x6e9f7baf, 0xd5f39253, 0xb7174c3b, 0x71e7609c, 0xd17c06ab, ++ 0x1ffd0ab0, 0xff9a67ce, 0x400fed84, 0x7c75437d, 0x5b5fd60e, 0x07b2ff02, ++ 0x77c68df2, 0xfcd35e9a, 0xc5a51aa2, 0x880c788f, 0xe4b5b27f, 0x7f880e7f, ++ 0xe8fee05e, 0x81cf7160, 0x7c141ef2, 0x89e71711, 0x76a56b06, 0xf19884ce, ++ 0x3ed189dc, 0xaa8fc3af, 0xc95f1d03, 0xf85df466, 0x4ba9f3fe, 0xfa9455f0, ++ 0xf04bbac1, 0x62e017be, 0xa1549fa1, 0xf77fa887, 0xce34ac1f, 0x3dda59eb, ++ 0xc52b7c4e, 0xca0edc21, 0x7efc043f, 0x32913f84, 0x5d611ea8, 0x17bd3347, ++ 0xb5a40be1, 0xfa986e76, 0xabedade9, 0x56f4ed29, 0x3b313f7a, 0xa79ff295, ++ 0xa9bbfccb, 0xde1e3e5a, 0x0d57e527, 0xa8f76ba4, 0xd3dfd22c, 0xd94a7b45, ++ 0x5e273a79, 0xe782fcaf, 0x28e7e037, 0xca26f374, 0x5d0bc4eb, 0xcf002f74, ++ 0x7cbfbdd1, 0xabf7d181, 0x4eb5d053, 0x95aa9f72, 0xfdb9b2eb, 0xe8ff5897, ++ 0xad9f6e28, 0xa9f7e72f, 0x92296513, 0x4d7e7eec, 0x8fbe8841, 0xbd0a56b8, ++ 0x9150f98f, 0x77f95bdf, 0xfbd0e533, 0xe3ee80f3, 0xd7a3dd0b, 0x73fefeb3, ++ 0x9fe05c71, 0xa7ddcfd7, 0xebc7bde2, 0xe2bf230a, 0xca7653f5, 0xe55d7cdb, ++ 0xe782e7df, 0xde811bd5, 0xb77bdd13, 0x899384fe, 0xa2ee4e49, 0x5c5673e2, ++ 0x35b5c81f, 0x1f45a6be, 0xe1f6d167, 0x6dea1288, 0xf3cf71c5, 0x4ee9b9df, ++ 0xed077d8f, 0xe62fa46d, 0x8fcf5a21, 0x7f1933bd, 0xe702054f, 0x51befb43, ++ 0x2e9deedc, 0x89be8d60, 0x058530f3, 0x7dfecead, 0x3bfc3d91, 0x1bdd83ef, ++ 0x0459574c, 0x23c04c4d, 0xdc78c5e6, 0x6f1a12fe, 0x4cfbc2ba, 0xae87f714, ++ 0x132e9c0b, 0x57fcf3cf, 0xc0269be4, 0x2085fa63, 0xbdd785e9, 0xc2d7d6ef, ++ 0xdc1d53fc, 0x8c8c03d5, 0x75e445fa, 0xa7e0bd4e, 0xcbd7dc3c, 0x41898c77, ++ 0xcc4c75bd, 0x6c87bfcc, 0xfac1f78c, 0xa97d7072, 0x7f88e715, 0x1de85e26, ++ 0x9f47bfa2, 0x67c633e6, 0x4b385c8e, 0x7fa8997c, 0x3c2371ac, 0x4fd44955, ++ 0xde3bfc1d, 0xa70aa217, 0xba2d5327, 0x7e589d7d, 0x41a77e92, 0xa7cbdfdb, ++ 0xbf802057, 0x1cf1342b, 0x40f79eff, 0x75a01d7a, 0x612bd3f7, 0xd7a1071f, ++ 0xa467fd40, 0x9f8c75b3, 0x445ffde3, 0x94a3c9bf, 0xdc69fcbe, 0xd390ab4f, ++ 0xff380b57, 0xfe07fabc, 0x4f2018bb, 0xe47ef8bd, 0xf49c676b, 0x33fc6a9d, ++ 0xebc9f4eb, 0x5c9fa7ee, 0x8df5eaa2, 0xe9833e91, 0x5fb9359b, 0x7c8df41a, ++ 0x90a3c85e, 0xe55f6d0b, 0xeb379738, 0x8c8f9039, 0xa449397e, 0x7701f7ef, ++ 0xfa81fe43, 0xd68fdd12, 0x6c7af9ba, 0xb75eb8a7, 0x9b768c21, 0xc52fbda2, ++ 0x7cad23ef, 0xfced24a8, 0x3b593f3e, 0xf59f41e6, 0x79f4fbf8, 0x97dfbd32, ++ 0x8dee221f, 0x2751c6fb, 0x9a9773d3, 0x7cdf8b4f, 0x68f779dd, 0xfa84b971, ++ 0xb9af00ff, 0x80005f58, 0x00008000, 0x00088b1f, 0x00000000, 0x7dedff00, ++ 0x5554740b, 0x55b9e896, 0x92556eb7, 0x4849524a, 0x370f90a8, 0x00946084, ++ 0x07e47e45, 0x301084a9, 0x68205d82, 0x882a6210, 0x01521288, 0xae59c6d1, ++ 0x08626149, 0xa5d0bda8, 0x339e663c, 0xc0e03053, 0x1a44f68c, 0x29c120e9, ++ 0xdab433e4, 0x79a681dd, 0xc1addd3a, 0x9af0ec66, 0x0fb4214f, 0xede3e0df, ++ 0xa4bdcfbd, 0x4456e56e, 0x9c7baa5b, 0xe1ed5ea9, 0x67dff3dc, 0x2739f7ff, ++ 0x2b99398c, 0xe7fdb196, 0x303318eb, 0xcb573e66, 0x63147f53, 0x36498c85, ++ 0x18128be6, 0x2d03fcfc, 0x4ac71790, 0xe6328db6, 0x7d353b79, 0xed4d5ec7, ++ 0xc7485ca4, 0xa33b7b40, 0x3f6866f6, 0x7d686b2b, 0xca59f627, 0xdae8d458, ++ 0xbfa09a0f, 0x318f2c77, 0x17d41e77, 0x5303995b, 0x13ba7fbb, 0x26d30ed2, ++ 0xb195a247, 0x57fb4f0d, 0xba8d20b8, 0x12fb29ed, 0xafe3af48, 0x40fa6872, ++ 0x2b36a3ba, 0x5d6db18e, 0x2349d7db, 0x983af318, 0x4a860723, 0xfea3ee6b, ++ 0x1c6b7ad5, 0x18648130, 0x45deec67, 0xef5c30ef, 0x79864c93, 0x364c5d49, ++ 0x77ed0fc7, 0xc769c9bd, 0xd6a47579, 0xeb5e71da, 0x934d5e13, 0x7ceb7d21, ++ 0xd609bdad, 0xe3e04de9, 0xc770bfec, 0x4ae3066c, 0x8c23d5e9, 0xa2ffe602, ++ 0x31c20c6b, 0x2358de7d, 0x6c894794, 0x70889893, 0x824ffdf5, 0x08a939e7, ++ 0x1c637d20, 0xb2cfba73, 0xd6f7d614, 0x43d827d9, 0x67ced879, 0x8d7981c9, ++ 0x409939b6, 0x4cc732fd, 0x926d9780, 0xc451c2bb, 0xc39d3598, 0x96700ad9, ++ 0x76b1ce01, 0x58f907a8, 0xa138731b, 0x33d7199e, 0x9977f709, 0x6afd7825, ++ 0xdabe99da, 0xbb3be0c2, 0x29605d76, 0xfe05bfd0, 0xdbd6ed0d, 0x309c5b57, ++ 0x4bb3b28f, 0xde075b99, 0x9359d263, 0x1bdb0e39, 0x78f2f966, 0xecc371fd, ++ 0x387fd60b, 0xcd33e68e, 0x1bdf03ad, 0xc278ce70, 0xb8762cbe, 0xee6d027e, ++ 0xb39eb089, 0x674fbd52, 0xbeca65bc, 0xc27c5d46, 0x5eb3fb8e, 0xf680fd68, ++ 0xd8eac727, 0x4fd686c1, 0x3ea81873, 0xfc3527fd, 0x5503d0b8, 0xe0a890d9, ++ 0xa62cc8a1, 0x45f2c1c4, 0x47ec0fd8, 0x4af744e7, 0xcf1517dc, 0x8437d845, ++ 0x4f9dd7fb, 0xa94f8393, 0xfbfba27a, 0xeb6dfd7a, 0xf6f4cd5a, 0xbb1c06f3, ++ 0xd097da44, 0xcf32b2ef, 0xd91f3b15, 0x1af70670, 0x5fff00e7, 0x934abdd9, ++ 0xb93cf4f7, 0x60ee4ce1, 0x03fe057e, 0x08d6c3e0, 0xac662b22, 0x95b11799, ++ 0x01933fac, 0x65118f62, 0xd0c5b7ea, 0xf00b2a7f, 0x67fa62f0, 0xfe1a2f29, ++ 0x4ed7d353, 0xd37ff247, 0x8ab96857, 0x3f10cbe7, 0x9f333521, 0x666ffb88, ++ 0xfa9e467d, 0xa60225c4, 0xc6cb237e, 0x6530cdd4, 0xffe155ac, 0x2f52c9ff, ++ 0xdbec3a60, 0xadf7c654, 0x80a40aee, 0x92e97527, 0x035c918f, 0x9729a7a9, ++ 0x6e54fdbb, 0x9f311871, 0x788f159b, 0x26dd6ed1, 0x502cca62, 0x22e498bf, ++ 0x7ddceafd, 0x7f7c1b46, 0x12320dae, 0x6fec73a7, 0xf82782b5, 0x42be40b3, ++ 0xffc7b7a1, 0xd23a6af0, 0x7e4574c5, 0xf612039a, 0xdf4e8379, 0x722ff0cd, ++ 0x25ef7941, 0xdb7889c9, 0xadc8fb79, 0xfeea2748, 0xb40b2719, 0x1c09bd6f, ++ 0x92a9bdaf, 0x075f076f, 0x55377fd5, 0xcf23757a, 0xb8298d7b, 0x03eb8c7f, ++ 0x0a339857, 0xfd772bf1, 0x9d69062a, 0xe2637985, 0xf0f396b1, 0xa957a858, ++ 0xae646fcc, 0x9c02fd40, 0x67f8667c, 0x6cd36e65, 0xded4f806, 0x804667ea, ++ 0x8f20bbcb, 0x365d7cbd, 0x0534e75c, 0xf17b666e, 0xbe0f58c3, 0x0562c5ba, ++ 0x7e106314, 0x3e9063a7, 0xefdec0a4, 0x962e500b, 0x38555cba, 0x4fda80cf, ++ 0x9cacbc08, 0x7216c78f, 0x7b97593e, 0x9bdb093c, 0xca7021ed, 0x05d6827a, ++ 0xc7ee192d, 0x2a81bc20, 0xd9f19453, 0xdca4dc20, 0x3e38b3aa, 0xb03b3633, ++ 0xb4d769bf, 0xd15c55fd, 0x368745e6, 0xf36ba52f, 0x83293caa, 0x981f48aa, ++ 0x4e5e01fa, 0x0e72ef45, 0x8cabbd70, 0xcaae8805, 0xd791b758, 0x6df52873, ++ 0xf98c7744, 0xb709ae8c, 0x5a0af532, 0xff5f0cf8, 0xb8f1e200, 0xa153bcc1, ++ 0xcf580a97, 0xf5a1ac98, 0x244e4d2f, 0x3f0b7c7c, 0x9fcdbec1, 0xd3e23b1c, ++ 0x7c9634f1, 0x3077d61d, 0x9ab1af6b, 0xb34ab5e0, 0x5f84874f, 0x73fdf0c7, ++ 0x7be0735a, 0x535fb2b5, 0x41889fcf, 0xa2f151bc, 0x72afc15c, 0x464bfaeb, ++ 0xf16abfd8, 0xbf88d9e1, 0xdfcce2e5, 0xe139be11, 0x4abed07f, 0x86b95f69, ++ 0x55f38889, 0x906ff816, 0x02c69bfc, 0x7f71e287, 0x8e2369d8, 0x1194895b, ++ 0xaf539fb4, 0xa0fa9a4a, 0xcafad32f, 0x35b3e843, 0xd58c7d64, 0x76853ed8, ++ 0xd70bf302, 0x7fa70fc7, 0xb553ec88, 0xfec76a7f, 0x3ba475df, 0xc1f01bec, ++ 0x8ac1a5f2, 0x26540ef8, 0x2721c9ea, 0x5c287ce3, 0xff0aedff, 0xd0b36f69, ++ 0x17e0ddfe, 0xf01bb4d0, 0x7fe40d9d, 0x8eb47e85, 0x7c0ad1f6, 0x2e93e713, ++ 0xdab77df3, 0xfb07cf99, 0x09f4756e, 0xdc04af98, 0xb3bc824e, 0x2f1fd5b0, ++ 0xe90990e3, 0xf2ee104b, 0xaac7a266, 0x3b0e5c6b, 0x198731cf, 0x18d79dca, ++ 0xa63c87a7, 0xb4e5dbf0, 0x71bf2aaf, 0x143eeb5e, 0x9963e587, 0x0697e143, ++ 0xded2b96d, 0x0c27080a, 0xc32023c5, 0xaadf5893, 0x6f818fd4, 0xad25016b, ++ 0xfe609e0a, 0x75ba5829, 0xa400e02c, 0x020c30d1, 0xbe842625, 0xd1af090f, ++ 0x45cc8dfc, 0x5ab951e5, 0xfe22307c, 0x03e50dc5, 0xf843c446, 0x473a026e, ++ 0xa11c69b9, 0xdb19f76d, 0xae7c426a, 0x2fb5e6ba, 0x5a48b821, 0x0e04b8b8, ++ 0xad335f17, 0xd75952ab, 0xe9fb2133, 0x566f36bf, 0x5bf7d416, 0x1a4e1505, ++ 0x335ff1fc, 0x7afe7f50, 0xc2cc67c1, 0xf9a72f71, 0x5faf3d79, 0x7df03f95, ++ 0xd07df201, 0x300fee77, 0x7bcc3c67, 0xfff7a140, 0xae738cad, 0x7de946cd, ++ 0x38426bcc, 0x678e642c, 0xcfbb43a6, 0xb4ca5ce7, 0x4363fe40, 0xa40371e0, ++ 0xf819dd1f, 0xfbd605b4, 0x17fbb256, 0xda6f0193, 0x82fcfcbf, 0xd8faba07, ++ 0x20ef1d9a, 0x933cf87c, 0x34a003e3, 0x8a37bbae, 0x5bac09e4, 0x590acda4, ++ 0xc23e286f, 0x77a4ac7a, 0xd1275d0d, 0xf10fae09, 0xeebfad4e, 0xe57fcfcb, ++ 0x3feff581, 0xfa40eb10, 0xf3fe7fdf, 0x43e7c889, 0xe3e037d7, 0x53aea5f4, ++ 0xe8d57f6d, 0x3939373e, 0xdbf67c68, 0x4dd13738, 0xf0e9c922, 0xf6e5e374, ++ 0x042bc587, 0xef9531cb, 0x4dae121d, 0x683ed337, 0x2bb4dcf9, 0xe4193c5a, ++ 0xe542ab7b, 0xc1f14dd9, 0xcc60c003, 0x3f086c59, 0x9583e50c, 0xff89fad7, ++ 0x307cb1fd, 0x60f81f21, 0xf2cefb0c, 0x19938dc1, 0x63eb22a5, 0xf7bb4e5c, ++ 0x2c7801bc, 0x8db64a16, 0x927e8ab4, 0x1fa2a2eb, 0xe9cb1f3f, 0xdf1cec19, ++ 0x6fbf010e, 0x1660f25a, 0x71ea57b5, 0x687f1a7d, 0x2ddb887f, 0xc751bf7f, ++ 0x9067f2af, 0x17bf705a, 0xfad367e4, 0x52a7e3f7, 0x40f7498e, 0x5f42f3f9, ++ 0xceb883fd, 0xff640c2f, 0xdcf973b2, 0xc3b2240f, 0xf0f3fc22, 0xbf4b6ad5, ++ 0x253c2875, 0x12da70f9, 0x1b0edfc0, 0xf9e03660, 0x2776d93f, 0x8b553572, ++ 0xd5d4e6ef, 0xa82f5516, 0x53c8bc02, 0xb02f3ef0, 0xd8d0f48c, 0x098da711, ++ 0x1ddf1f90, 0x3a718faa, 0x07fa9511, 0x9f89f784, 0x9efa16c7, 0x76373546, ++ 0xc5af16a7, 0x47449d2b, 0xb43fdc56, 0x81e4427b, 0xba25a818, 0xcef44312, ++ 0xfe457cd6, 0x60a2b117, 0x3ac58dfc, 0x7d14b790, 0xdbeefa42, 0x92313f57, ++ 0x512e70bd, 0xaed36f83, 0xefe2c3ca, 0xeafc2a3f, 0x185fc435, 0x9f0a87fa, ++ 0x53b36eea, 0x4c9b777e, 0x5cb69ee9, 0xcdb7befa, 0xb69ef941, 0xf5e94512, ++ 0xa1ba3f12, 0xc4d882f7, 0x5c8a4979, 0xe45f9897, 0xf0544fa9, 0xfb445731, ++ 0x363b459b, 0xfb7a980a, 0x859f7d79, 0xd719bb97, 0xd33cfef7, 0xa99e4532, ++ 0xb70184f9, 0x246ff117, 0xf47efa30, 0x0bf82847, 0x0b1ce9f8, 0xeb19d15b, ++ 0xe7ffa3b6, 0x3b32ea60, 0xed9e7796, 0x199213b4, 0xfc76359b, 0x86d7bb0c, ++ 0x6ea588fd, 0xfd986d8b, 0x9b3eec92, 0xae07fb9b, 0xc7bb475f, 0x98c0f1ce, ++ 0xdda2b526, 0xe5b037ef, 0xbbed41dd, 0x76fdb80b, 0xd5b85f24, 0xcc149c7e, ++ 0x5381645f, 0x078fb039, 0xfe3a1e71, 0x51f95380, 0xbdc79a91, 0x103da3b7, ++ 0xd0dbedcb, 0x815efc79, 0xdc31c1c7, 0xfcb4373f, 0x6ebdfb96, 0xc03c73cc, ++ 0x55eb2bab, 0xd543e223, 0x9e219b80, 0x25729048, 0x65afeb93, 0xdf833f4a, ++ 0xf64adeb9, 0xa27a8cb6, 0xe90ba4e3, 0x9039806a, 0xe1f6484d, 0x9157bee9, ++ 0x7229cf5b, 0x062badeb, 0xd6dfff5d, 0x1be69102, 0x80c77dfa, 0x051cfd7e, ++ 0x7d337adf, 0x7767a8ed, 0x00706cbe, 0xf6756647, 0x1fc851ce, 0x42581adf, ++ 0x7cdccf78, 0x5815b35d, 0x5eddd9d6, 0xf9c67446, 0x9f22995b, 0x44bbfceb, ++ 0x89d603f4, 0x7dfd113e, 0xeccb6915, 0xd4cefeb8, 0xc733fe30, 0x1f2a1683, ++ 0x92e54258, 0x1de91b7d, 0xc388e943, 0x7c4bc767, 0x9f76753e, 0x99c47e88, ++ 0x84455bb9, 0x7c0a8bff, 0xa89b72ea, 0x7fcb3cdc, 0xbb382458, 0x997fd89d, ++ 0xa63b6b63, 0x09d60392, 0x36713a72, 0xb264f873, 0xc8d9d7b7, 0x3a5afb6f, ++ 0x4e551fca, 0xa842f6a8, 0x219a39fc, 0x19d3dd91, 0x0abe9030, 0x80cf67f5, ++ 0xb52977fa, 0x649de9ad, 0x776e7407, 0x9eb1141c, 0xc63f2043, 0x930fb95d, ++ 0x72e6b27c, 0x7522ac7d, 0x22c93b5b, 0xa013e09f, 0x2f053aff, 0xfab4f2ea, ++ 0x74e39956, 0x57a61c7b, 0xaa6672b5, 0xfa8477a2, 0xda85ac25, 0x2281757c, ++ 0x3cb9728f, 0x1ffb306a, 0xd692fa43, 0x040c2508, 0x211ad45f, 0x2ee3e715, ++ 0x08e97ee0, 0x49e6cfd0, 0x95667690, 0x68c7ff90, 0x0081fa3f, 0xbcc4340b, ++ 0x66fb8696, 0x28fc901c, 0x3b40c177, 0x4b8eafd7, 0x8dba6f7a, 0xe8a649f4, ++ 0x9bc4b685, 0xc89fe7f2, 0xd3bcfce0, 0x75bbeac4, 0x80b6aff0, 0x328f8df3, ++ 0xf8f5eb5a, 0xb65e5a8a, 0x22392046, 0xcca4f229, 0xf47a9cce, 0x20dfd6a4, ++ 0x76553e71, 0x9308f58d, 0xf1cb2fd0, 0xd6536766, 0x8153b436, 0xf37a9c5e, ++ 0xf4e428c9, 0x59816ef8, 0xf5391ff5, 0x95cff2f8, 0xfebcaafd, 0xbe387d94, ++ 0xb900ae61, 0x823dfb87, 0xf3a523f7, 0xa7912571, 0x3c790a53, 0x4f117ae5, ++ 0x27228a1b, 0x4764a677, 0x81220f0e, 0x5e9031d7, 0xf7d1b7cf, 0x483bb1e9, ++ 0x8e02443e, 0x638411d9, 0xa6f1cc99, 0x4bc5a1cc, 0x67b782a3, 0x3f86220b, ++ 0x904796f7, 0x7f02448f, 0xf45bbeca, 0xbbf4aa70, 0x91293fb5, 0x8731cf5c, ++ 0xe510acbb, 0xe44f80ce, 0xd7ae0e71, 0x3dc13bbc, 0x8abdfb55, 0x6fed20e2, ++ 0x77efebe9, 0x123d7c29, 0xf80558f4, 0xffd32f3b, 0xdefe9ea0, 0xbe311858, ++ 0xe61d3290, 0xf5c490d1, 0xb479d09c, 0x1e0c4616, 0x1e606b9b, 0x8780258b, ++ 0x8bacbece, 0xd7363c1c, 0x0a2ebda2, 0x7b979e3c, 0xc8318cec, 0x58df810e, ++ 0x4af5ea03, 0xf465f41e, 0x2c9e83a5, 0xc3e2f538, 0xbf08225b, 0x1ea0e33a, ++ 0x8e8f3a15, 0x337e1c29, 0xf51ebe98, 0x79e6e47a, 0x7a36546f, 0x4a7d3937, ++ 0x7f35f461, 0xd3ecc461, 0xd06336cd, 0x9134467c, 0x2d9a4c93, 0x27abeae8, ++ 0x90885ed0, 0x3806483c, 0x2cd83bb5, 0x36fcf83d, 0x6295fb72, 0x04f97487, ++ 0xc985a7f7, 0x4cf97768, 0xa2f43009, 0xe05e5511, 0x0907eccc, 0x41dbbaae, ++ 0x6b3def4f, 0x9ea36c70, 0xbe280b02, 0xd0183769, 0xee7e65ff, 0xf5fd17b0, ++ 0x8381e955, 0x8dfe7e66, 0x031535e2, 0xfe4669cc, 0x8c5edccf, 0x653d956f, ++ 0xe8e7e7ca, 0x98d9bdb8, 0xfcc0e090, 0x7b4081f4, 0x4f9da41c, 0x5da074e5, ++ 0x47d03557, 0x3f40e779, 0xf6a179d9, 0x8fbdbf66, 0x02548de4, 0x1fda2926, ++ 0xcc467de9, 0x4e7ded5b, 0x455bb78c, 0x3d4321c1, 0x5f6bc071, 0x48fe4852, ++ 0xe0839387, 0xa353f624, 0x85ba63c0, 0xec6abdc7, 0x502e28cb, 0x87981251, ++ 0xc77e1f76, 0x128d57f8, 0xf9b4aaff, 0xdd342e28, 0xab43b5a6, 0xf3c44c03, ++ 0x82f1a10e, 0xdedc03a9, 0xb027121d, 0x9d68ff73, 0x8d0f07e2, 0xb827581b, ++ 0xded08a53, 0x2e283b00, 0x658e5071, 0xc9f9189b, 0xe7cc033b, 0x25f482cd, ++ 0x6dcdfb91, 0x0b272f82, 0x5a061ce3, 0xd9133947, 0x53b34862, 0x4b9d225d, ++ 0xe2d8f804, 0x5c02c595, 0xf04f6fb2, 0xdcfb246d, 0xfd54f04e, 0x3b9feb31, ++ 0xce85fe49, 0xff8ec554, 0xc18be6c2, 0x4c6dd3b8, 0x5dc2d4f8, 0x358f88f9, ++ 0xf25af322, 0x7e48ce29, 0x7bbb38d0, 0xec8e2db6, 0x1e211ea6, 0xc53227e3, ++ 0xb733a7e7, 0xbaf7a712, 0x65339e71, 0xf6fd0d8b, 0x5fa3f6e5, 0xb50279e0, ++ 0xf0e4e0be, 0x5b1b6417, 0x27b2fd0c, 0x6f18edfc, 0x9ee7933b, 0x29f80452, ++ 0xdcc5f528, 0x840befb9, 0x5e2cdf37, 0xc4fd2912, 0xeab42318, 0x91ddf1d1, ++ 0x6fa46b93, 0xc7300ddc, 0x7d33b4f9, 0x229af2be, 0x9c06ea27, 0xdaa828e2, ++ 0x087eea5c, 0x7b633de1, 0x55e60753, 0xc610dbbc, 0x6ffdf8af, 0x79da7f59, ++ 0xf88494f6, 0x1fe84177, 0x63757887, 0x8e20425d, 0x2f63e9fc, 0x1a9fa0a5, ++ 0x28bfbcf4, 0x3e8b73a2, 0xea2ee311, 0xba65e73c, 0x84d7a8ed, 0x173c67f3, ++ 0x737dfb39, 0x9ebc318a, 0x9b9137f5, 0x1bf3f107, 0xec7c8dfa, 0x9f5831b0, ++ 0x3e913471, 0x0436ff83, 0x764901f1, 0xf92b56b3, 0xe2e5755f, 0x83f4119b, ++ 0x8c5ca3a4, 0x748ed47b, 0xf60fb9da, 0x790fd315, 0x7ba7ceaa, 0x27c3c70a, ++ 0x2727224b, 0x229c63c7, 0x2bcf99be, 0x32f3e04a, 0xcd799a09, 0x3a70e129, ++ 0xf072253d, 0xd7f4862a, 0x8a8fee25, 0x96acdce8, 0x9fae403e, 0x769ba3d6, ++ 0x247284fc, 0x70f3a057, 0xb0067f20, 0x6e6d8d7d, 0x81c8024d, 0xf2b3dbe5, ++ 0xdad5be51, 0x422476b7, 0x4c9b51fe, 0xa569f97e, 0xf5ebdfee, 0x9fcee7f7, ++ 0x715faddb, 0xfc0dd87e, 0x35dca752, 0x9fdaa8c5, 0xbac9c5d1, 0xb16c67f6, ++ 0xd8c37c1e, 0x2253c99f, 0xb3856f6b, 0xb98a0b3f, 0xbf1c34bf, 0xdc8e282a, ++ 0x6b1ed13c, 0xd617630c, 0xb31e7044, 0xe17635b2, 0x7f106376, 0x8e0dc424, ++ 0xf1b80d57, 0x86fe168c, 0xb7148bd8, 0x8bdbe871, 0x4e47140f, 0x38c1cd1e, ++ 0x1cbeb566, 0x2c4714f7, 0xf7ef71be, 0x7d2fbd20, 0x5011a1eb, 0x7e30bcc4, ++ 0xb7dc60ca, 0x434abdde, 0x3a8df797, 0x0753a0fa, 0x1c899f1f, 0x1b454edc, ++ 0xd12c5f91, 0xa6aea73d, 0xf5f58b9d, 0x2453a5ab, 0xe6666fea, 0x6e7843ae, ++ 0xb32cf3a5, 0xcced1f21, 0xdbd22ff2, 0x7e14f787, 0xe39b3f50, 0xdfca2d4b, ++ 0x8a5b7aa0, 0x47b2fc79, 0xc3332b91, 0x22b949d0, 0xfe296707, 0xe63659e8, ++ 0xef53addc, 0xb311c587, 0x848d4fbb, 0xfeb46674, 0xe6576f7c, 0x7f18677b, ++ 0xe1c8a1c5, 0xa034e6e7, 0xfad59993, 0x39193cf3, 0x266f73fe, 0xfb5ee3cc, ++ 0xeed0330b, 0x33af259e, 0xc3fbf229, 0x5eb91d62, 0x50a3bcc7, 0x250c5e3f, ++ 0x1a9fb006, 0x49f29520, 0xf28c7f8e, 0x1b4001e8, 0x3e907e5b, 0xdc0f861f, ++ 0xc3e38536, 0x3fba26cf, 0xb9871bd5, 0xa2f6359b, 0xf22abf24, 0xf1217773, ++ 0xf1f7b47b, 0xf8b3093e, 0x4cf74098, 0x7df9123a, 0xa017ba3a, 0x5effabc6, ++ 0xf21f3fd4, 0x67231b56, 0x44776491, 0xf1857e93, 0xb1d92b79, 0x758edcd1, ++ 0xb9d5cf44, 0xba99d1c7, 0xcc34decc, 0xbb388efd, 0x4ed82eab, 0xbb5a9c15, ++ 0xd34dec13, 0x01f3a094, 0x98e9ddaa, 0xd14cb6ec, 0x14adf5c8, 0xdb53fabf, ++ 0x94119993, 0x643fa887, 0x9ee55d42, 0x785a1dd7, 0xbc00fc70, 0xbfe53099, ++ 0x46ccde26, 0xcde0e878, 0xc6f0f4f7, 0xf1c38532, 0x90ffd37d, 0xc68663ad, ++ 0xde7ed42b, 0xa82dbab7, 0x2fb7ad8f, 0x97bde0b1, 0xe2dbb74e, 0x58f3f2b0, ++ 0x7eeff7c1, 0x38bdc93d, 0xeec97c78, 0xa022f3a3, 0xedea368f, 0x347d3853, ++ 0xc9b3e141, 0x6666fcca, 0xe17f7e32, 0x0db7c17e, 0xb67a82ec, 0x467c84c9, ++ 0x125d1fad, 0x8ef63b39, 0x4f7fe26c, 0x1867adea, 0xf886d7fe, 0xeffcb378, ++ 0x715e8ab7, 0xc61fae1b, 0xf5ccd459, 0xa67619fa, 0x75fdbfab, 0x14baece4, ++ 0x4633a42b, 0x87af0d34, 0x161f3984, 0xa9ff7f41, 0x8f1c6cd8, 0x49d80fe3, ++ 0x27453cff, 0x22fdf74e, 0xcf4e1e5e, 0xbb39183f, 0x9868d4e8, 0x62bb236f, ++ 0xd3877f42, 0x1e8665f8, 0xc04d1b7c, 0x1fbe746f, 0xe735922b, 0xd9531ac9, ++ 0xdaadd00f, 0xdfafa099, 0x45e850ed, 0xcb42efd5, 0x1ed044b7, 0xf1c6c848, ++ 0x3b879e38, 0x08abf837, 0xb90b47c6, 0x7a0fe2df, 0x7f740df4, 0xe18f9755, ++ 0xe2dfad27, 0x09bbd63a, 0xe4a185bf, 0x7c5bf45b, 0xd8e1c456, 0x737e2619, ++ 0x4afb722a, 0x5e012fe7, 0x4f5f2599, 0xf25b1c4f, 0x50c4f435, 0x6f5e193e, ++ 0x2e3f9c8f, 0x31e388c3, 0x4c2b3efa, 0x1187f19c, 0x235487dc, 0xafa5a78e, ++ 0xeaee0546, 0x89281e7c, 0x6a735d98, 0x77e311a2, 0xef79e48c, 0x039e5ced, ++ 0x78e52dbd, 0xae37bfc2, 0x718ada4b, 0x7bba20a1, 0x744e8f58, 0xe4a5aee8, ++ 0xab85fce6, 0x8ff2f0f4, 0x7270bba5, 0x6fc29d64, 0x7562163f, 0x20ff73ef, ++ 0xbdcbfa72, 0x4ad7e839, 0xdfe79fd4, 0x9b1e6e45, 0xfafecb6f, 0x673d4cf2, ++ 0xd682aff9, 0x32aefeef, 0xf3912def, 0x308ca423, 0x70adca0e, 0x72923672, ++ 0x8e483e34, 0x83e186d6, 0x724f9c91, 0x3baa7c10, 0x6653a204, 0x561f1463, ++ 0x78895bef, 0x9838c59f, 0x37b833ff, 0x51a547f5, 0x070459a5, 0x5bdeaf35, ++ 0x4e3e0489, 0x3c44de30, 0xd0edc9c1, 0xa599efd0, 0x6ffcc452, 0x4d3bffc8, ++ 0xc967f7df, 0x5929e7e1, 0xc9e90cdd, 0x68656f6c, 0x563b9a6f, 0xf318f9d1, ++ 0xf47e55ec, 0x810eb25f, 0xb66121de, 0x92fe3413, 0xe411ef74, 0x74f9430f, ++ 0x7ee4c467, 0x4defe221, 0xbd4051fa, 0x7f8d9b71, 0x53fd7c7a, 0xcfc8a2a5, ++ 0xad4e0bdb, 0x7f7d42ff, 0xfd1db040, 0x6758fd02, 0x4acbdcf2, 0xd9da8393, ++ 0x37127bf8, 0x06f79f7b, 0x7e7b413e, 0xdf59ce5f, 0x13b2880a, 0xa5df0591, ++ 0x37a4654a, 0x0ebbca48, 0x183afdea, 0x6fbd18ef, 0x6f20ce73, 0x72af72a4, ++ 0x6c71c47e, 0xa77d2162, 0x5f50a3fb, 0x36ecf7e4, 0xf3b512c9, 0xdb147a8e, ++ 0xe326976d, 0xf7e82239, 0x6f9d1c58, 0x99373f71, 0x237937f7, 0x9967ae0b, ++ 0xb4c3f4ac, 0x0fbaf4f7, 0xa8b951c5, 0xf7b5bfd4, 0x7c2876ef, 0xf0e04cab, ++ 0xdaefbf57, 0x3fee97b1, 0xa6eb9f56, 0x3be5787b, 0xaf288dbb, 0x47b9cfcb, ++ 0xe067c70f, 0xc1286897, 0xa4a09fc4, 0xeb4ec182, 0x843f3016, 0x13df6d2f, ++ 0x5fd30f23, 0x1b6eb9f9, 0x76bbc3da, 0xa7f57458, 0xefd72940, 0xfd87eda5, ++ 0xcac65aa8, 0x8d0fe455, 0xc346b099, 0xbbed3b0f, 0x73d63d69, 0xf46fba7e, ++ 0x7a09de6c, 0xdf1ca0e7, 0x1c719043, 0xa7fdee9f, 0xbf76e7f5, 0xc5f11137, ++ 0x50391cc6, 0xbf1cf3af, 0xaf3fbfa7, 0x0f9e3b7a, 0xc23bdf52, 0xca1e8d77, ++ 0xa6f79e0b, 0x37e8a5c4, 0x198eedb3, 0x04bf8c3b, 0x3af587d7, 0x97840dd2, ++ 0xefe6f3fb, 0x78a18410, 0x3ee49b6f, 0x69ac9a56, 0x8ac87967, 0x9619aceb, ++ 0xfd3077ef, 0xa5a7f238, 0x65da5f5c, 0x46b25a72, 0x07457c20, 0xdb2dce50, ++ 0x8c271af7, 0xdbe78853, 0x7c1f0e8c, 0x44b92a3d, 0x14d1e384, 0x38026d81, ++ 0x1ddf4fae, 0x495f9c33, 0xc36783c5, 0x294767ac, 0xb63a63b7, 0xf74fdc77, ++ 0xe846078f, 0x7a1109f2, 0x0a72fba1, 0x77cbc89f, 0x1a2d2e5f, 0x630def0a, ++ 0xc58fc9ba, 0x057fe606, 0xbf9a7f5f, 0xe9bdd4c3, 0x37205adf, 0xe1eb676b, ++ 0xf1e6f968, 0xaca9577c, 0x3aea57e1, 0x8b9625db, 0x86bcd3f7, 0xa9f20768, ++ 0x117ed639, 0x46999dcf, 0x558fc804, 0xbef1c659, 0xc967e55d, 0xd3199f9c, ++ 0xd1b27e38, 0x68577f32, 0xe913206c, 0x6c7fed59, 0x6f794199, 0xbf1d2fad, ++ 0xb13989cf, 0x36307646, 0x41b62caa, 0x89cd7804, 0x0b26b13f, 0x716519f2, ++ 0x7bac220d, 0x2b89da4e, 0xaee83659, 0xc7e79e2c, 0x0632b89f, 0x366559f2, ++ 0x0d87c79e, 0x2b0b0146, 0xe6f0684b, 0x4d36ff61, 0x12f063ff, 0x4f37f25d, ++ 0x6e83668d, 0xb28261dc, 0x7099f87e, 0xbfef571c, 0x65c3fc52, 0xbcf1fab1, ++ 0x429a7323, 0x14501ee2, 0x8d900f74, 0xaef92388, 0x4bbbebde, 0xf8a41ff4, ++ 0xf04fc589, 0x90758dbd, 0x7ad0083d, 0xcdc17ae9, 0x538283db, 0xd7dad72b, ++ 0xf1147732, 0xbc36c5f7, 0xa73027e7, 0xbf8f3ae1, 0x757c70b8, 0x43f8ea3e, ++ 0x8b5b05e6, 0x5e7065fc, 0xea3f50af, 0x364e2ebc, 0x7a9e517b, 0x6b6e59ab, ++ 0x0a2e9c10, 0x9d05bf81, 0xf6f97d9b, 0xbee2365f, 0x640d8c5e, 0xe2ff900a, ++ 0x9f68a7ad, 0xfe07262f, 0xe5047056, 0xef1f7c4d, 0xf683bb29, 0xbce89671, ++ 0x5af10ca7, 0xbc6176b2, 0x6e3a2ba1, 0x7d6f9e22, 0x45edd936, 0xe77807be, ++ 0xbcb677c0, 0x07639219, 0x50a6b3cc, 0xa1b97e7b, 0xd397f38c, 0x30cdbe0a, ++ 0x0e3d6a6f, 0x23d9e978, 0xdf5075b0, 0x84b2ed73, 0xde9cde7a, 0xff9e12d3, ++ 0x5a73d96a, 0x3cc53192, 0x8af2d3f4, 0x3c9feba4, 0xf454665f, 0x59b71e6c, ++ 0x3a70e36d, 0x99ee3192, 0x969f3011, 0x1fbd02a5, 0xc25f7ab2, 0x6eafcc0c, ++ 0x763255c2, 0x331bc57f, 0x5c1a5d10, 0xb4c19f07, 0x191ff591, 0xd0b42801, ++ 0x9072646d, 0x7968b83e, 0xf483930c, 0x24d686c1, 0x1371be4d, 0x4844ceec, ++ 0xda69a6d7, 0x9b5d3c31, 0x0cadef82, 0x8c14c4fe, 0x2df9f057, 0x87d73fb4, ++ 0x6e85b8f1, 0xa83fb793, 0xebbd39bf, 0xb44ff444, 0x7a0e0ab4, 0x64cbc136, ++ 0xaf88b76c, 0xb0715210, 0x467dc03e, 0xdef4408f, 0xe1f46cd2, 0x7b8b217b, ++ 0x78b57db8, 0x0593e0b9, 0x373f0384, 0xa811e9eb, 0x42f3d3dc, 0x3cafc60d, ++ 0x33bbf86b, 0xb6e2a329, 0xf552bde1, 0x32a36d1e, 0x71ef4f57, 0xe8b3f613, ++ 0x07de8171, 0xdf675e62, 0x37f9a0d8, 0x4b3acfd6, 0xff85e9f8, 0xb3ae0f15, ++ 0xce947e5e, 0xfe8e372b, 0x81c9de94, 0xd7e99df5, 0x6f9b53c0, 0x1be6d568, ++ 0xdbf36ad7, 0x497794cb, 0x48f1b3c6, 0x04cabb4f, 0xaafdcf11, 0xa71973f9, ++ 0x9fe7867e, 0xd7ae8817, 0x9b2360ca, 0xd444ff25, 0x6e8816c3, 0xf0e5abca, ++ 0x55eb85bd, 0x44fd27e2, 0x67d102c7, 0xc369c9bb, 0x2bbccbf7, 0x45dbc205, ++ 0x9f8eae58, 0xf29f5835, 0x8ff9a1c6, 0xdd1db8cb, 0x435ae51e, 0x8203a7fe, ++ 0xa90bdf0d, 0x62629d11, 0xbd45d11e, 0x57eabf1e, 0x7867e1e8, 0x35e61d1b, ++ 0xf614910e, 0xf13ddc69, 0xdc7a8e74, 0xd17934bf, 0x005719be, 0xdd232078, ++ 0x7cdad81b, 0x23e2454c, 0x8c3f0377, 0xb19c7482, 0xfbf89ebb, 0xdfc6c924, ++ 0x60b3b38d, 0xa5dce17e, 0x577d273d, 0xa7d231fa, 0x1cf2deef, 0x9b1f039d, ++ 0x017fcced, 0x1f1468e5, 0x827dd9ff, 0xd3f41d6f, 0xc7e3c792, 0x702d0123, ++ 0xc2bb16dc, 0x8f807b47, 0xfd87ebaa, 0x0d7c891d, 0xcecc040f, 0x2d5371a3, ++ 0x893bb62a, 0x6afe0a0f, 0x46cffa03, 0x5b3ee32a, 0xa7fd1325, 0xe02dda3c, ++ 0x779833ba, 0xfde3009d, 0x45b1031c, 0xb637e983, 0x76b46ad3, 0xddd118da, ++ 0xa56b7c80, 0xf1e25fbd, 0xf28480dd, 0xffec5be1, 0x61febd61, 0xa0aef4f9, ++ 0x18668fca, 0xfea1c5af, 0xf640fab4, 0xde8c3648, 0x3418b464, 0x8b64c47c, ++ 0xbb9bf0d6, 0x67fcb572, 0x77cb438e, 0xad9257be, 0x1ceb9f29, 0x67bf29af, ++ 0xbf268156, 0xa9ae55c0, 0x74fd5f7f, 0xaf6cde4d, 0x928fd4d3, 0x31f269e7, ++ 0xea6bf7b9, 0x68963ac7, 0x793fcdca, 0xfbc05eb3, 0xbf6f1610, 0x05d0e01b, ++ 0x389251b4, 0xc7c64728, 0xa3486541, 0x98aca20b, 0xfb364d76, 0x46ba4f11, ++ 0xc7897c81, 0xfddb8ff6, 0xfe258fd0, 0xf2680b35, 0x5f049fec, 0x01f41275, ++ 0xdea37260, 0xda53c777, 0xa6bbc0f3, 0x92ac7a29, 0x4f77284e, 0x6f3480ab, ++ 0xdfc69ca7, 0x03bbe9a1, 0xcd12c7f7, 0xd7b45eb8, 0x24d17a42, 0xf4829bd4, ++ 0xaaabe7c3, 0xddb1cbf2, 0x913bce53, 0xb30f582e, 0x1b6abfa1, 0xe728901a, ++ 0x1a77f2f6, 0x0dfa7af3, 0x7efa20ce, 0x21eb9ca7, 0xefaabb2f, 0x7a5bfec4, ++ 0x3d22ca41, 0x4244f96d, 0xf7a5af7d, 0xb3ca1c60, 0x244fae89, 0xbf063bb4, ++ 0x0c4e722b, 0x8239e344, 0xea36ee7f, 0xaab0ffbe, 0x51ffdf9c, 0x786835df, ++ 0x5de378dc, 0x41e2aa83, 0x46f0dcfe, 0xf1846fc0, 0x79af801b, 0x8f5937f9, ++ 0xfe7f034f, 0xbedf9824, 0x60f20a9c, 0x91a7f512, 0xf897f707, 0x967f244d, ++ 0xce37eb6b, 0x1877a5af, 0xbf6b8f81, 0x002aef2b, 0x1ea133a7, 0x5b5d7c0d, ++ 0xaf837e5e, 0x3e075de7, 0xff4b81f0, 0xa7378bbd, 0x0fdeb489, 0x1f69d3dc, ++ 0xe278065e, 0x8797fc7d, 0xf5c38fc0, 0x3af6e0ab, 0xfed040e2, 0x383bd685, ++ 0xebdfef8d, 0x31f6f861, 0x09b77f65, 0x54c8f97d, 0xc268ae3d, 0xa69645df, ++ 0x700a6715, 0x44ef3e5f, 0x4de1b23b, 0xfdbca181, 0xa49fc1d5, 0x6fbb3bd0, ++ 0xf7c1491c, 0x47dd3c67, 0x8e1df052, 0x0ebc9366, 0x0fc079f5, 0x2d3fea07, ++ 0xff9a7e3d, 0x7a02eeca, 0x8f656287, 0xec9640e0, 0x96a973d9, 0x3bfac9d6, ++ 0x16daeed1, 0x97cf5e66, 0x52df7c73, 0x3cfcd32e, 0x00437a6e, 0x3e7d9bda, ++ 0xf801f101, 0x1f6bce13, 0xdf9057d8, 0x7edf41b6, 0xef02a9fe, 0x86241bc3, ++ 0x433508ef, 0xd1c75c7b, 0x0592a38c, 0x580de9f1, 0x38eb8097, 0xfb0620be, ++ 0xa862635f, 0x3bf3a867, 0x11f7d19f, 0xa5c3ffae, 0x92a97c26, 0x12352fb5, ++ 0xc35c3fbc, 0x43e313f5, 0x0699deff, 0x978085f9, 0xd0eb0f78, 0xd347cbd2, ++ 0x970fdfa0, 0xfa6d3d73, 0xcba22643, 0xbeb8ab85, 0x2ad78a12, 0x82b5fede, ++ 0x1bf8a1a7, 0xf043b78a, 0xc337f975, 0x95cb37d7, 0xb3c63977, 0x61f72889, ++ 0x448c67ff, 0xd1927a3c, 0xd7f559bb, 0xc246990e, 0xda74c7bc, 0xb201601c, ++ 0x33df4609, 0x0e37c829, 0xcdc9f2f1, 0x7fce055b, 0x7d71fbe4, 0xc3125d69, ++ 0x72b1d6b8, 0x531f0fae, 0x01664df6, 0x3137ef01, 0xf20c6fb1, 0xce252ca9, ++ 0xeac4dbb1, 0x53fb40df, 0xc267fce4, 0x375bed8f, 0x13efe106, 0x7caa5e0a, ++ 0xdcc4bc71, 0x2b5da06f, 0x0b9a8f76, 0xdcaebcfd, 0xfa54c93f, 0xd40ec9cb, ++ 0xacf485ce, 0x0509fe32, 0xbffcd47f, 0xdcc0742b, 0x739e0917, 0x75fe1c2c, ++ 0x718bfd6b, 0xeecdb31d, 0x7ca1ca0f, 0x66a9e676, 0x635d7b94, 0x71e3cdde, ++ 0xe1e90733, 0x87fe051e, 0xcaf77f4a, 0xa8deb063, 0x7f69a3db, 0x60bc0ea3, ++ 0xca8e7c43, 0x9c391c29, 0x9ab9ef7d, 0x8049dcc5, 0x29b35757, 0xdf73f355, ++ 0x93f52b39, 0x96a9705d, 0x2a6ae5e8, 0x7ddb577d, 0x827bcca8, 0x7ac0e1c4, ++ 0x06dc9047, 0x04962dbe, 0x385539c5, 0x547af6a8, 0xafda76ce, 0xc9b156c7, ++ 0x17b1e6a4, 0xc736f394, 0xe7e82685, 0x64d3933e, 0x8a9f7805, 0x26715faf, ++ 0xdb77b187, 0xd8cb71d0, 0xe6166dfb, 0xb8f40dbe, 0xfbe51b36, 0x3f94ecda, ++ 0xda5326d1, 0x86bae518, 0xb8705a70, 0x76e10735, 0xabb36328, 0xf8b9c61a, ++ 0x41e089be, 0xfdf8063b, 0x976b8298, 0x02cc8d7b, 0x08f797e5, 0x9d4cde74, ++ 0xd35703ff, 0xcbf81b98, 0xd078e1bf, 0x5fdae570, 0x2c73df10, 0x768b54bf, ++ 0xd3e6e4d2, 0xacf7989d, 0xea2d43fd, 0x3c811f17, 0xbd033c41, 0xe405d99f, ++ 0x1925c727, 0xd5f160f0, 0x75e7ea24, 0xe916a043, 0xc0b6fbce, 0xea3f3f10, ++ 0xe48d24b9, 0x05ae8af2, 0x7746d2be, 0x8ad4d8ec, 0x7a4fce04, 0xfef81b27, ++ 0xef821a16, 0xe3bc1e3b, 0x7ee1c6ff, 0x3fcad658, 0xcb59df47, 0xba432331, ++ 0x881d58de, 0xf70f3bd3, 0x878bf401, 0x981d70eb, 0x4bd79686, 0xb4071cde, ++ 0x38f057ab, 0xe2b4bcb4, 0xc4c2bf86, 0x63a0c8fd, 0x03f3f0a6, 0x25806bf8, ++ 0x1d9227c5, 0x7a068fe4, 0x7e9de86e, 0x55b4c456, 0xed689f60, 0x9049f633, ++ 0x0f0e1f1e, 0x5f45366f, 0x833927cf, 0x8323b479, 0x1da24fef, 0xb0def7a9, ++ 0xc8ec6339, 0x9e68fce1, 0x60efd07e, 0x71405abf, 0xdf109392, 0x617a53c7, ++ 0xce997adf, 0x360745ed, 0xe360bca3, 0xac77640c, 0xa1f56af4, 0x7db8d309, ++ 0x87d14132, 0xfd8056e6, 0xd86ecb94, 0xcd27604f, 0xec08fd47, 0x9877b8a4, ++ 0xfd0a7ec6, 0x0593f64e, 0x1dc60ae9, 0x5bb3fb0f, 0x55a67f6f, 0x4648ac2f, ++ 0x7844dafa, 0x11cf00ce, 0xb9d742bf, 0x4bcf82b4, 0x4885eba5, 0x3dbf88d7, ++ 0xfb43ae9c, 0xb55699ad, 0x21b3e714, 0x32c1bdcc, 0xb72b9d65, 0xcf2f0408, ++ 0xd3822496, 0x55c5b679, 0x1e79780d, 0xf00db1e6, 0x15cba2f2, 0x2fed0093, ++ 0xf8315dba, 0x3e542c77, 0x8625b2d0, 0x3b186dda, 0xf209a92f, 0x7f782a4f, ++ 0x05ba67a1, 0x16c0fce1, 0x78ea7f4e, 0x2617f91f, 0x99153d21, 0x7f9e1202, ++ 0x1d3def4c, 0xd1607a87, 0x90927bbe, 0x73cdc30e, 0x9fce54e5, 0x6c7dae56, ++ 0x8e2499c5, 0x638f780f, 0x3cdf2285, 0x8425fb4f, 0x8cb58aff, 0xdee0f7f0, ++ 0x1d20b55f, 0xb18de85f, 0x7f3c3ca1, 0xfc8bc620, 0x66dbe2ff, 0x3b20419f, ++ 0x7c0f1bc4, 0xffa9bced, 0xf737d26e, 0x3f686d19, 0xfdfede7a, 0xcf47a466, ++ 0x7e6a335e, 0xfaef456c, 0x9af7284b, 0x2b3cef7b, 0x645afa62, 0xdae561e9, ++ 0x6abd6827, 0x166df7fe, 0x05e8f919, 0x1589f391, 0xfd223f3d, 0xcbb5c577, ++ 0x7acfd113, 0x147fc0fe, 0xfcf35f23, 0xe462e5cb, 0x97fd9e67, 0xf3dcb18b, ++ 0x3d5698e3, 0x34d2e5bd, 0xe55207ee, 0x5149d665, 0xa45a2fe3, 0x8eac85c8, ++ 0x00c6b34d, 0xcf8e8afc, 0x6abbf3a7, 0xc18e5179, 0x7e8bf585, 0x50f49359, ++ 0x3e8ebb50, 0x85a4e291, 0x96626bc7, 0x6ba5e106, 0x37f5499a, 0x0f3f237e, ++ 0xeabbe296, 0x7d3afc37, 0xd4146706, 0xdca7d0db, 0xefce5e9f, 0x12fe834f, ++ 0xa9f48eda, 0xf1248f8b, 0xeba2d2fb, 0x988509ae, 0xeafba1cf, 0x32396bcc, ++ 0x5a5f4836, 0xe3f067d8, 0xefa82ddf, 0xdf49fb35, 0x534f13ef, 0x1ea3d15e, ++ 0xd8bbf4b8, 0x4fc7412c, 0x06627b93, 0x7f50f1f2, 0x7162fc0d, 0x757eaade, ++ 0x8ffb952a, 0x866d5bd2, 0xc5af3039, 0xc93efc1d, 0xfd4ebf10, 0x8517f24c, ++ 0xbee477fa, 0x4ed82c97, 0xe1b06b1e, 0x14bd557c, 0x0e8f71f7, 0x2a68781f, ++ 0xbe9573a7, 0x1c78fa3a, 0xdaafa3bb, 0x07957182, 0x63dafa14, 0xc02f3033, ++ 0x9ef7a3a5, 0xe85fe81d, 0xcc5f76b8, 0xe3a71804, 0x34f63ce4, 0xb55b01f2, ++ 0x5ddb0725, 0x9059699b, 0xa1378837, 0xca984de3, 0xbea0e6f9, 0x32ff2fa0, ++ 0x4a457995, 0xfa9a8e0e, 0x608390dd, 0xe54d679f, 0xee22f9f6, 0x79f6e13f, ++ 0xf950fca8, 0x3cefdab2, 0xf2879f65, 0xe7a4b3e5, 0x7c4d1d80, 0x9954de79, ++ 0xcef7a5ea, 0xfafb224d, 0xd924fce4, 0x6cffb43a, 0xcc4861d1, 0xaabfda1b, ++ 0xcebc79cf, 0x7bb41623, 0x4fa2469c, 0x87c17ccf, 0xff553971, 0xd204b8f3, ++ 0x4d8b3dcb, 0xcea7ac3e, 0xf73e6fab, 0x9a702ec7, 0xa807efe8, 0x47aaa27a, ++ 0x087728de, 0x95eaae54, 0xe7d8feaa, 0xf9ddfee2, 0x31bcbc85, 0xc2277dca, ++ 0xbbfc23eb, 0x4ac7c804, 0x41efe505, 0x5da08eb9, 0x02bddf75, 0x5858efe3, ++ 0xaa1a7834, 0x9bd67e77, 0x1f9c3f1d, 0x3f0515ea, 0x0ccb3a55, 0x8e550fa1, ++ 0xf1c8a93d, 0x05e39416, 0xd0bfc728, 0xfda1e7e8, 0x986f1c82, 0xb518ed4a, ++ 0xe8a5fc2f, 0x2fd7b3d2, 0x54aefd2a, 0x70efaff7, 0x8337ce15, 0x3b43adf5, ++ 0x757c9c33, 0xb84e7a2b, 0x6e2b27f2, 0x28b79e8e, 0x3d148beb, 0xa11df4bf, ++ 0xa1fa1be7, 0x9f7f4614, 0xb837f556, 0xd6c6d1ff, 0xbfa42abe, 0x77e44cf7, ++ 0xacd7ad0f, 0x644c73e8, 0x9239fd9a, 0x3ed01921, 0xfee72cf2, 0xf904ae83, ++ 0xfcc764e7, 0x9fb0c8c4, 0xa20f6015, 0xd5e8f71e, 0x519b4a04, 0xd174865f, ++ 0x8f14e3ce, 0x3b5cb458, 0xe9f42eff, 0x5955fb62, 0x0377cef4, 0x533f21ab, ++ 0xad826f43, 0x5742841d, 0xa451f772, 0xa30eef2b, 0xfeb823bc, 0x0b7d6a23, ++ 0x4dadc3f7, 0x35ec51f5, 0x68681f44, 0xb5fbd50d, 0xe2b941fa, 0x27a70a37, ++ 0xc5183fec, 0x2331caf9, 0xfa0b79d1, 0x2631269b, 0xe0be72f5, 0x24fdcb59, ++ 0xe2ebbd2d, 0x4acde018, 0xec407ca5, 0xc5143f23, 0xd9eaa0d7, 0xe85217de, ++ 0x1b53b03e, 0xfdb95a4f, 0x432fc497, 0x7b894ae3, 0x34f25f38, 0x5238951b, ++ 0x95f980b1, 0x448e4f60, 0xbf9652fd, 0x79877087, 0x1bf11f31, 0xb2efc6a7, ++ 0x7d2b894d, 0x64b7ec76, 0x17da2e87, 0x55d48e26, 0x4e48e3c7, 0x238fd4e6, ++ 0x26923d1d, 0xa91c757f, 0xdd38e7a5, 0x78aafc47, 0x5aa985d2, 0x9168e3bf, ++ 0xf74777fb, 0x57f4360a, 0xebe5ee8d, 0x9a21b29e, 0xdfdaebf4, 0x7e424d2c, ++ 0x85d3eea0, 0x17be1cb9, 0x8552bc3e, 0x237f8aed, 0x5d60a2da, 0xf35c3ffb, ++ 0x979e348b, 0x5bb6322d, 0xccf68313, 0x8eacdf85, 0x87eef841, 0xc7e7f714, ++ 0x1dffe81f, 0xfe8355b0, 0xf234e36a, 0x6afe2b3b, 0xec61e411, 0xb4275fa0, ++ 0x5da526dd, 0xe42b9817, 0xe3c7dcd7, 0xeea95dfe, 0xd5ffca3a, 0xf483b618, ++ 0xa3f92744, 0x8d78047f, 0xb0f1a37e, 0xff4b8c58, 0x60759a30, 0xd92ba91c, ++ 0xd1d12efd, 0xa464195f, 0xf14f6823, 0x321bef27, 0x7d7447c9, 0xa2679c61, ++ 0xf7c17304, 0x8cf16870, 0x63eca1dd, 0x18b3d82a, 0xccd98267, 0x78f438c7, ++ 0x3133de25, 0xffd8899a, 0x46f726b3, 0xd9e9a77c, 0x57bd2283, 0x124744cc, ++ 0x8d0b7bde, 0x1e4e093b, 0x4fe3572f, 0x5c3cdc6a, 0x71c049fc, 0xe3fc7226, ++ 0x029db5e7, 0x38d5d3c6, 0x45d7bb13, 0x92f6afc1, 0xb5573a56, 0xdf08831e, ++ 0x76697c6e, 0x67fc4e85, 0xe2530561, 0xe378dad2, 0x84dddcc6, 0xce375fa7, ++ 0xb7ea65b8, 0xcb996f3d, 0x177990d7, 0x42967c26, 0xff97d776, 0x6ce48e27, ++ 0x879265ef, 0xd6660317, 0x7ec7fe47, 0x35ef77ee, 0x22e19f91, 0x41c96fd8, ++ 0x056f7672, 0xde9df7ef, 0x7bff84e9, 0xb0626afa, 0x7df2bf7e, 0xf7f9c9c3, ++ 0xedefbea0, 0x4db9f913, 0x3db1edc6, 0xea11627d, 0xbee2df2d, 0x6755323c, ++ 0x2e68967d, 0x28e9429f, 0x4ca3a153, 0x805803fc, 0xe43fd337, 0x0d679876, ++ 0x14d8af8f, 0xe569e0be, 0x19a3f571, 0x4fea8229, 0x7f17a91f, 0xb92017d9, ++ 0x7f08f0d1, 0xe366fa4f, 0xeaa62f2f, 0xf517e3c7, 0xbf8fd69c, 0xfe25aacc, ++ 0x1d9fce19, 0xc1fec7ea, 0x4dff8534, 0x366c7ee0, 0x4eeb46cd, 0x355c9d6c, ++ 0xffae0d92, 0xa987dc5b, 0xfe36b795, 0xb5bce8da, 0xfe81dffd, 0xffd85bdb, ++ 0x76b7e583, 0x716eabfe, 0x62dc2fff, 0xc5bd9cf8, 0xc5b89ffd, 0x27a9d9f0, ++ 0x9eabfe1f, 0xff8d080f, 0x08179e87, 0xfe60073d, 0x2c5e43c9, 0x173c2f5b, ++ 0x896a43f0, 0x002f5bdb, 0xb613141f, 0xd9dcf9d3, 0xb61e3ca5, 0xdbe2c6a1, ++ 0x1b9e0c2a, 0xb735e150, 0xb611db8a, 0x3c5e4bbc, 0xece99bd7, 0x7f4249ab, ++ 0x3b232959, 0x8f1462f8, 0x96d1318b, 0x41ce973a, 0x81e752db, 0xa515d25e, ++ 0x0ffd671f, 0x861762a7, 0x57cf2391, 0xbf229555, 0x77b985b3, 0x87e282f3, ++ 0xfbf0f5b4, 0x53944cdb, 0x72b8d1e7, 0xf143ea2a, 0x38f7f987, 0xa56e733f, ++ 0xf359c979, 0xb3941ec8, 0x2a2f7e70, 0xbac4dff1, 0x97e85971, 0x10bd044e, ++ 0x602f82e3, 0x59ec907c, 0xc753d51b, 0xaf92af7b, 0x131345ff, 0xbdeb9e30, ++ 0x62739f9d, 0x71352fae, 0xfe4df7bd, 0xc5024d33, 0xc257e6f5, 0xf06a7efc, ++ 0x52cb6de7, 0x9be01890, 0xf146c7b7, 0xfe959fc6, 0x2f3f2e43, 0x8f7ce3cb, ++ 0x439578d9, 0x3cc33768, 0x40503b1e, 0x9de8bbf8, 0x18b5ffd2, 0x22b18fed, ++ 0x5d8879c1, 0x3e0bf8a9, 0xaa1dfc50, 0x6f8d40bf, 0x93f15afd, 0x17fe847c, ++ 0x1fd1fb48, 0xcaaae902, 0xa27ef23f, 0xd4ac7f0e, 0x0a2f2fe1, 0xfde43fdc, ++ 0x150ff729, 0xe0ec8e48, 0x597f94f3, 0xc9b1f7c9, 0xaa17e3cf, 0x951fe7bf, ++ 0x693c14f5, 0xa2fbe3f4, 0x24139d05, 0x9d05f394, 0x4e98d119, 0x290cfa74, ++ 0x4b85ef00, 0xfba830df, 0x5d4787a7, 0x1c373aca, 0xef7c500b, 0xff712147, ++ 0x79f92af7, 0x3e2a9a86, 0x1be0f78f, 0x88e58fa6, 0xe3d628ed, 0xbd466c2b, ++ 0xd80352b8, 0xa6cf38c5, 0x156f3e2e, 0x797e0dde, 0xfa738e3a, 0xd313a048, ++ 0xd359e5fc, 0x7cdeefc9, 0x37f513a9, 0x47cbb5cf, 0x265fc92b, 0x3c4f68c9, ++ 0xbbf5afd0, 0xfdc5583d, 0x05423fef, 0xa776e11c, 0xc171f648, 0x4fe1229d, ++ 0xd9144362, 0x662689af, 0x2e7e62b4, 0x67f28bd7, 0x798e988d, 0xf4813f36, ++ 0x7263fcc1, 0x579b9e02, 0x778960fd, 0x384649ae, 0x559c557d, 0x4635a7f5, ++ 0x7ee17739, 0xeb38dd7e, 0xd24ff7ca, 0x5d755379, 0x78d45c2a, 0xab38b869, ++ 0x33c1ee7a, 0x9ce68aeb, 0xd40c4786, 0xe0b1ffa2, 0x394969c0, 0x67b3697f, ++ 0x0b61c60d, 0xf8a25df6, 0xf56f1aab, 0xbd225eb4, 0xd849da1a, 0x8f1b4f7e, ++ 0x7985eebf, 0xeb03da60, 0x3df19a76, 0xbda53b11, 0xfefc6eb0, 0xa52e5b76, ++ 0xa50736fe, 0x5095b4ef, 0x226e7f8a, 0xb6e31135, 0xdb6e2897, 0xfb8da957, ++ 0x05bd71a9, 0xc817eba2, 0x7ee282af, 0xfb8d0f94, 0xbfb9a319, 0x44cc73c6, ++ 0xde7aecef, 0xaeff10b7, 0x8d1a6dea, 0xc7e7c1f6, 0xde71a3dd, 0x0b77182d, ++ 0x4e0b8bc2, 0xda025447, 0x14472ec1, 0x0e0adbc6, 0x3cf0959e, 0x27d88b4c, ++ 0x660c3fa1, 0x1647869e, 0xf12e7b3d, 0x55bdbf73, 0xafdf0851, 0x7cf58f8c, ++ 0xff63e337, 0xc340d61f, 0x00800092, 0x00000000, 0x00088b1f, 0x00000000, ++ 0x17adff00, 0x67534c5d, 0xdb977cf4, 0x179fcb72, 0x71914414, 0x505112c1, ++ 0x1a744c2b, 0xac745ee5, 0x9514b653, 0x351804a5, 0xd09b1973, 0x96166732, ++ 0xe34eb43d, 0x0c60f740, 0x493f660f, 0x64b8d45d, 0x5992750f, 0x8b2aeab7, ++ 0xf11a2586, 0xb0f88e61, 0x06646180, 0x37187137, 0xce761737, 0x2f6d6f77, ++ 0x920f64d6, 0x9f9ee734, 0xfcef9cef, 0xe34f4c7f, 0x84c00d5f, 0x4ac6525f, ++ 0x27177e01, 0x800ae4b3, 0x56d3e19d, 0xa9c3e095, 0xbf842e65, 0x5aa7fb9d, ++ 0x7df000c9, 0x880d5537, 0xaa9dbefb, 0x4cefbe26, 0xe910577a, 0x189e86d3, ++ 0x002969f4, 0x334e012b, 0x5f908770, 0xa3d412e9, 0xdb550704, 0xb97115eb, ++ 0xa4e0975e, 0x92f6bdf3, 0xb9f7a26c, 0x2477b24a, 0x14e7dbe8, 0xe7a4419d, ++ 0x25b768bc, 0x0b3407d2, 0x19d22e40, 0xec4942b8, 0xb702a997, 0x9be4f3bf, ++ 0xf01263bd, 0x75fc69bf, 0xe136de86, 0xbd7bf0be, 0x7c716563, 0xc3cc7d27, ++ 0x422646df, 0xce874035, 0x53d11282, 0xcebea2a6, 0x942b11fc, 0xead26510, ++ 0xbaf18a5a, 0xe5b0f522, 0xbece1700, 0xc1523451, 0x03c82545, 0xf5ce3268, ++ 0x6514773a, 0x0c0801ce, 0xd32942a7, 0xddf22269, 0x5470a1f4, 0x334ed111, ++ 0x9b95e17d, 0x4a1a3ff2, 0x63d08659, 0xdc248c09, 0xa829d9ab, 0xf76e2cb6, ++ 0x924c8699, 0x62fce317, 0xccf93a52, 0xa984a596, 0xc13e4205, 0x26ac0140, ++ 0x57b45d20, 0x80ddedc7, 0x94768fe0, 0xd10a726f, 0x8ee3b454, 0xf50146a4, ++ 0xf0453a56, 0xdbb08b3f, 0xc4662c12, 0x5f394717, 0xf89eab79, 0x02cae4fb, ++ 0xbe7e3f40, 0x1767956c, 0x8d8dfbf3, 0xe1d1c424, 0x8253d63c, 0xcc1d1de7, ++ 0xb7356e41, 0x97f8f99b, 0x19b67e49, 0x9f9bc971, 0x02cc39f5, 0x785f0d68, ++ 0xac0f00be, 0x1b3d4380, 0xbb0afcf1, 0x6f114720, 0x6f9f32ed, 0x316f3b73, ++ 0x183a27ba, 0x75b738c2, 0x6754f99b, 0x0bde90a7, 0x87ac4ce0, 0xda0ea336, ++ 0x67e1c654, 0x98c381eb, 0x99b9d89e, 0xc86fd3f5, 0x8317d4cf, 0x4b9f88c7, ++ 0x6bd959f5, 0x0bd6fca7, 0x7883ed80, 0xd04f64ad, 0xb9154bb7, 0x00b2c39e, ++ 0x17db9401, 0x619c7ad9, 0x7c3df6fc, 0xb9446a41, 0x54ad723b, 0x7dc7119a, ++ 0x309eb197, 0x1e17552e, 0xfbbc51d4, 0x686c0c22, 0xf78f97ca, 0xf3aab945, ++ 0x965b20da, 0xbfdd4f78, 0x50f9cc3e, 0x2381d506, 0x40bf741b, 0xce0678c2, ++ 0xb471e0b1, 0x6f7f5957, 0x70711d20, 0x154a3b65, 0x9bdf63b2, 0x5eafb881, ++ 0x7708c95c, 0xb7c201e1, 0x9f84a0b1, 0x6fb6af5b, 0xd553b402, 0xe51ae2b8, ++ 0xe2c5b1a5, 0xebf1e1b0, 0x693bdcb3, 0xeabd6c4e, 0x47f9d3ae, 0x7e23483f, ++ 0x14d87319, 0x896b3ba2, 0xa8cbf9be, 0x12fcf548, 0xde216945, 0x4898f2ed, ++ 0xf366d37d, 0xaa3ea61c, 0xe823406a, 0x5b16b6df, 0x8c6bfc90, 0x83205834, ++ 0x7d408fb7, 0xdb918ef7, 0x67ef0bef, 0x2a7d208d, 0xfc8b3552, 0xb4996d9a, ++ 0xa156103a, 0x083979ee, 0x02b5ddcf, 0x9c4f83f6, 0xd728cab4, 0x2ec4c7ef, ++ 0x2fdaf802, 0xcbf61871, 0x7c02a6a0, 0x30e7cfe3, 0xfd3857e2, 0xc38cbfbc, ++ 0xe1c1dfa8, 0x87357f80, 0xe3ccaafd, 0x57723cb9, 0x34e4fba0, 0xf364ae08, ++ 0x1f51976d, 0x91697cb1, 0xcf7445ed, 0x453cd7fb, 0x18f91272, 0xc2058b44, ++ 0x193fbd6a, 0xbce7cce6, 0xbc764757, 0xce9fb230, 0x586f9829, 0x11872005, ++ 0xfd727dce, 0xbc08d68d, 0xf005b2fe, 0x62ffe324, 0x952627d4, 0xa49773c7, ++ 0x2585fff7, 0x4a78f37f, 0x5aeae561, 0x30779bcc, 0x7e915205, 0xfb9f56a0, ++ 0x630cf533, 0x76e3013c, 0x7049e303, 0x0d6ddf26, 0xdc3e5294, 0xe7248f74, ++ 0xc4fa8d47, 0x32b8b00a, 0x9c329cf5, 0x1cc62d7f, 0xcc40c568, 0x84b63cc2, ++ 0xfb0d3459, 0xe1b235bb, 0x8bb04896, 0xfcf34dc1, 0x79b19b80, 0xf8e4f297, ++ 0x25e85ffe, 0xbc71a57d, 0x134a83c9, 0x3a7b6de7, 0xb847f24d, 0x59c7a694, ++ 0xc7b0eab2, 0xf5b5efa6, 0x31075e9a, 0x71e9a358, 0x82cd483f, 0x2cf07df5, ++ 0xfec1ee0b, 0x1a5c56f3, 0x5735f9a6, 0xe1c6e805, 0x88cfcde3, 0x0f3cd0a6, ++ 0x9a3f6e5b, 0x731fd8e3, 0x725a1915, 0x30638c68, 0x8cf36f31, 0xc601203b, ++ 0x73458e51, 0x9472e984, 0x80f8305b, 0x14d41df4, 0xd5ef2f6e, 0xa1740310, ++ 0x687b0210, 0x82b45cbe, 0x77ed0a76, 0x43d833f4, 0x006c1dfd, 0x1fe90aa5, ++ 0x05ffd8df, 0x4cfdbdd2, 0x19d475a6, 0x7cf7c6ba, 0xfbc438a7, 0xb0991bc7, ++ 0x8d0c7af2, 0x5330f4ea, 0xfaf24983, 0x37dfb1be, 0x46e7c0aa, 0x6094eee7, ++ 0xebadda2a, 0xd7dafbd7, 0x7e0a82c5, 0x577c2a5e, 0x2cf5bc24, 0xc734b983, ++ 0x74dca194, 0x40b6efe2, 0x55fb98b0, 0x27ec25af, 0x77e429fc, 0xf6c67f6c, ++ 0x2f26178f, 0xb6bd5015, 0x07ed0733, 0xcd373fdc, 0x922f05fb, 0x872fdf17, ++ 0xc17ee1e6, 0x1e1cdcbd, 0xc21cd0b5, 0x6f92647d, 0xd16eeb53, 0x633dc51c, ++ 0x7fd82fa6, 0xfb82f297, 0xa45f44c5, 0xc719ce65, 0x543943b8, 0x5b3ce34c, ++ 0xb8f32359, 0x798c3dbb, 0xb96a682a, 0x384fc83a, 0xb79a64cf, 0x4eb5e333, ++ 0x7360fbd3, 0xe6374180, 0xaf5584f7, 0x586b138f, 0x9bf28030, 0x9fbca511, ++ 0xc03dbf38, 0x9513cfd0, 0x3c5021cc, 0xb1e30848, 0x62cf88c9, 0xc4b8c008, ++ 0xd37d0a9f, 0x7197cf98, 0x9eb0d8bd, 0x00f51b36, 0x1a76e410, 0xe945a48e, ++ 0x12d0711d, 0x77f077ca, 0x77df8049, 0x3085f282, 0x92ba152d, 0x4d62ebf5, ++ 0x3cf9a09b, 0x4fdff4f1, 0xf1f72d2e, 0x3487d3f7, 0x2bced113, 0x2fc9131a, ++ 0xf5396f8c, 0xebc2edf7, 0x36880359, 0x3a26ae8a, 0x2e8d61d7, 0x146efaa3, ++ 0xf18f1c3d, 0xfda5ee91, 0x26ef8b82, 0x8c0091f5, 0x650387cf, 0x2f28595f, ++ 0xdd8f44cd, 0xc72e38b7, 0xf1c794f1, 0xb69e1571, 0x926a47df, 0xa29f1bbc, ++ 0xef648cfe, 0x5fa8a7d2, 0xdfe892d2, 0x492ff34b, 0xe6315cfd, 0x7902c020, ++ 0xce313d3c, 0xcfec1a98, 0x3af0325d, 0xf5ec68be, 0x44fca61e, 0x83f0287b, ++ 0xf12b8e05, 0xa993dab9, 0x98d4ffeb, 0xc67831a7, 0x5d163d80, 0x01fda66e, ++ 0x5453bec3, 0x293aa13f, 0x9280293f, 0x50d2f7e0, 0x7e09281a, 0x98e70f2f, ++ 0xf9d115f0, 0xc1aaf926, 0xe57f1312, 0x7f1312d0, 0x09a570d5, 0x8d646e7f, ++ 0xafed7e49, 0xdd7c26b5, 0x7c9326e4, 0x4c5b5fcd, 0x357fac78, 0x73c4dcac, ++ 0x4cd7a41b, 0x66ed0572, 0xccbb0abf, 0x9b75157e, 0x2de98afd, 0x5bfd980e, ++ 0x2ff663d8, 0x3c8ffb27, 0xffa1de85, 0xfb4599fe, 0xc53237a0, 0x326774f3, ++ 0x8e688615, 0x7efa2388, 0x5ef85888, 0x2fff83b8, 0x21e426e6, 0x9db8555f, ++ 0x1b42c881, 0xb4ec3b9d, 0x56dde8db, 0xf28a7382, 0xdbb01ff6, 0x0e70044a, ++ 0x00000e70 + }; + + static const u32 csem_int_table_data_e1h[] = { +- 0x00088b1f, 0x00000000, 0xe24bff00, 0x51f86062, 0x38cfc10f, 0x90981819, +- 0x770143f8, 0x01684331, 0x21060616, 0x62636620, 0x22676060, 0x072bbf5e, +- 0x9d877d82, 0x1038e181, 0x781f67df, 0x5e240d7f, 0xbb3f4dcd, 0x2ed1d37e, +- 0x7e27f062, 0x02af8606, 0x058b0c0c, 0x210b7c21, 0xfccff954, 0x18a47608, +- 0x02a57665, 0x150003f5, 0x8051b77b, 0x008051b7 ++ 0x00088b1f, 0x00000000, 0xe4b3ff00, 0x51f86066, 0xb97bc10f, 0x726e1818, ++ 0x0143f821, 0xd08667cf, 0x0c0c2c6a, 0xc6cc401a, 0xcec0c0c4, 0x717ebc44, ++ 0x1d7b044e, 0x4cc30307, 0x31c8de20, 0x481afef0, 0x7e87957c, 0x42f2a976, ++ 0x81c16968, 0x970837f7, 0xd430310b, 0x04303309, 0x4ff84088, 0x2be55045, ++ 0x366c1084, 0x12ecca49, 0x0007ea02, 0x0fb3beda, 0x00000380 + }; + + static const u32 csem_pram_data_e1h[] = { +- 0x00088b1f, 0x00000000, 0x7dddff00, 0x45547c79, 0xbedd70b6, 0x97a7774b, +- 0x42c84274, 0x4010dc20, 0x804d8854, 0x024de3b0, 0x10602a31, 0x66b71c11, +- 0x04484b0f, 0xd3ce7cde, 0x0831baf9, 0x544e38e8, 0x387c0666, 0xa8d041af, +- 0x1a0c1a51, 0x166bc3b0, 0x26665419, 0xb8c38e3a, 0x6c8a89bc, 0xfd011242, +- 0x5f283798, 0x3b75539d, 0x4dba6f7d, 0xe3fbe65c, 0x45a7efcb, 0xeab7badd, +- 0x9cead9d4, 0x25aaa753, 0xd7a92059, 0xfe197212, 0x48a6f968, 0x51d11908, +- 0x1fb715b6, 0x04846927, 0x6dd5915e, 0x7fc22102, 0x0ed722b9, 0x16c8e427, +- 0xf5a56821, 0x21075ec8, 0xd3767eb4, 0x9735a0b4, 0x0e057d90, 0xbb3fde0d, +- 0x25eb08b5, 0x96e2febb, 0x2ee57b68, 0x65ba8251, 0x8b7729ef, 0x6b2a9093, +- 0xe963a3f3, 0x225df6f3, 0x228742d9, 0x490b1281, 0x8db8e427, 0xac8bbfb0, +- 0xaacec0be, 0xddf79b95, 0x3456fd05, 0xf69d895a, 0xe17bb953, 0xbeb4b1d4, +- 0xe04cb0f0, 0xab6dca95, 0xbeb45e94, 0xa0842828, 0x0fdec0fe, 0x62b69c70, +- 0x4c1a1152, 0x8dbf69c8, 0xbad057a8, 0x067d39bb, 0xb838be7d, 0x5fde14a3, +- 0x2d782f5c, 0x9bc5fdf4, 0xfe819df6, 0xfdc83717, 0x92ffda45, 0x0751073a, +- 0x132fb1b1, 0xa9fcc798, 0x1be56f00, 0x7ad2b132, 0x0a15a5c5, 0xb5491c01, +- 0xc60bb94a, 0x5d514c7f, 0x1c61ce30, 0xe567c747, 0xfa1c7473, 0x0497b2dd, +- 0x996d4c2f, 0x9e00f885, 0x59f6ddd6, 0x5e613b4f, 0xf08194ab, 0x0ab5eefd, +- 0x3830b7bc, 0x0abb15fb, 0x4a566df0, 0x9b4dce01, 0x3b830595, 0xf7525bfa, +- 0xe3ae0196, 0x7c32f21b, 0xf2e6ed31, 0xd5109fb4, 0x4c5f51da, 0x02721688, +- 0xda6541dc, 0x17e78e90, 0xf7a41484, 0xa8913a92, 0x29fe8eb6, 0x49e90861, +- 0xfa17ffff, 0x2683e04f, 0x6e5b7057, 0x7b96bd07, 0x0ed5bfe8, 0x70f39d7a, +- 0x85ed49fa, 0xe5ebfdb1, 0x0a0740a3, 0x83dfad4f, 0x4cfee3e5, 0x55fbd72c, +- 0xfc6fdbc4, 0xe0dcb083, 0x27f3e2f7, 0xdcb0a3fd, 0xfcb0d7e4, 0xcb0cbf9d, +- 0xdf1cbfa0, 0x859fe2db, 0x0fbf56e5, 0xafe33f9f, 0x5fceb2c0, 0xf79fcf8d, +- 0xbd658bdf, 0x5fcf803f, 0x32c3aff2, 0x72c5afe4, 0x96037fa7, 0xbe20fe0d, +- 0x0ebf8af7, 0x087f46cb, 0x37f1ef9f, 0x47f61962, 0xf40bdcb0, 0xdfc465a5, +- 0xff7ee58c, 0xfa0f2c51, 0x43bbf05b, 0x3e5893fe, 0x1eeef1c2, 0x8a248a47, +- 0x3c46b737, 0xea485c54, 0xa648ad64, 0x5672d4f5, 0x5023bf4f, 0xba7ad0a4, +- 0x1e29d68f, 0x148d2d7b, 0x57bd6959, 0xb9cf6b35, 0x68db149f, 0xdac0273d, +- 0x15a23dfb, 0x5fbd69db, 0xb81f6b2d, 0x449c5029, 0xac8303eb, 0x48faaafd, +- 0xafd683b1, 0xfcf6b10a, 0xd2712930, 0xd5847e7a, 0x25688e0b, 0x682f5a2e, +- 0x0fc2f566, 0x5a6e2503, 0xdf616c2f, 0x2913398f, 0x31f5a649, 0xc27daced, +- 0x43d13225, 0x808813eb, 0xd16762f5, 0x2f5a14c4, 0x697ab0f6, 0x1a92d9ef, +- 0xcaf6ff87, 0xe509732d, 0x4dc0ba85, 0xeb45949a, 0xe20acb4a, 0xcc0cf8a5, +- 0x26447ac2, 0x48fda0f3, 0x8d26b660, 0xac8575a6, 0x0efff684, 0xfdf6c62c, +- 0xeded8ab2, 0xbed81581, 0xddb1515f, 0xac7eeab2, 0x6c35941f, 0x20f55b4f, +- 0xd1507fbe, 0xaae07db0, 0x487eb147, 0xa8fb61f6, 0xf7c5bf55, 0x6c3e290f, +- 0x50757c7f, 0xffeb489b, 0x00b6f821, 0xbe08d75f, 0xfc07920a, 0xa72cca1a, +- 0x2046bafc, 0x1e3e40b3, 0xf2a6a606, 0xd14b26b0, 0xfdedbf40, 0x5169f0ba, +- 0x069dbce0, 0x3ccf05f5, 0xbcfd8b9c, 0xb4c8fd80, 0x7eebb11f, 0xca337c26, +- 0x6f84cfd0, 0x1a7ef42a, 0x7b1abde0, 0xfbd9faf7, 0x3c2318cd, 0xfbd62cdf, +- 0x5c7ec269, 0x84d79bdd, 0xf08ce3cb, 0xf7aa5e5c, 0x49fb0873, 0x113c1ee9, +- 0x9fa1a479, 0xef50bc88, 0x4fd84fe7, 0xa3c1eecf, 0xfd0da329, 0xbd22ca68, +- 0x4fd8a39f, 0x89faf756, 0xf08d6328, 0x7ef44b28, 0xfa7ec63e, 0x9a5e6f74, +- 0x1e11bc75, 0xcfdea56b, 0x6e7ba469, 0xefd9faf7, 0xbf67e232, 0xf39f8a2b, +- 0xee80cf08, 0x6dd8abcd, 0x3bb14fc4, 0xd84b9f8a, 0xebdd95cf, 0x88dbbf67, +- 0x28eefd9f, 0xe601647e, 0xf37ba435, 0xe2364e2a, 0x8a3938a7, 0xf000b71f, +- 0x3c1eed0c, 0xf11a7b07, 0x1467b073, 0xcf08193f, 0x33c1ee88, 0x9f88dd31, +- 0xfc51e989, 0xe8cf08a8, 0x3073f5ee, 0x839f88dd, 0x5cfc51e9, 0xef8cfd89, +- 0x6626bcde, 0x3133f118, 0x029f8a23, 0x57c8a7ec, 0xda10f087, 0x3f712b8f, +- 0xf118fa87, 0x144fa873, 0x9fb1633f, 0xbc9fb449, 0xcd29fbae, 0x34a7e231, +- 0x899f8a27, 0xbbebe788, 0x1ca1cfd7, 0xe50e7e23, 0x0533f144, 0xbdd299fb, +- 0x35f69579, 0x2fb4a7e2, 0xd2b5cfc3, 0xe8675c50, 0xe915e9da, 0x2ef5d727, +- 0xbefa04d2, 0xd17561e8, 0xf76025e3, 0x433dba88, 0xbe91359a, 0x294facef, +- 0xdac49878, 0x0277c535, 0xcad45c7e, 0x926bb58b, 0xec192547, 0xd52d14a8, +- 0xd651ef50, 0xcf7ef0cb, 0xf6867ef2, 0x1957598c, 0x057cb3da, 0xc5767a86, +- 0x7dfbc318, 0xf50d8baa, 0x60def7be, 0x70373f78, 0xb79ea1b3, 0xf78627ee, +- 0x31ced407, 0x61b15fb4, 0xcafda1b1, 0xfd4372e0, 0x377fbaea, 0xf4243fbc, +- 0x9afda180, 0xed0d87c6, 0x1b8f2343, 0x3f0ec3ea, 0x447f7869, 0xfb4316f3, +- 0x1bcfa3c8, 0xecb747da, 0x9ec7d434, 0x7f7863dc, 0x437efb7c, 0x6f8bdafd, +- 0x222fde1a, 0xdbda367f, 0xef0c0fb6, 0x6a7cf24f, 0xf32ebf68, 0xea9d9373, +- 0x9abf1cf4, 0x2b9045d7, 0x20497e82, 0x357b414b, 0xaeb052e2, 0x3f3272f4, +- 0x3d40b5c5, 0xd947f946, 0x434d573f, 0xd47fa4be, 0x55ea286e, 0x7d0b4571, +- 0xbe31d3fe, 0xf9f43c2b, 0x35df154f, 0x0df6389e, 0x648137e5, 0xa05aa942, +- 0x95afb734, 0x6717bf19, 0x31f81a5f, 0xd2cabefd, 0xd685303e, 0x2145897b, +- 0x04578f90, 0x49d5da0b, 0xf786a922, 0xfd04ac92, 0x85b9b5a6, 0xe462074f, +- 0x6a1f5d61, 0xfd1d0867, 0x997d93ae, 0xfaad4768, 0xce760028, 0x5e743e9a, +- 0x4d7908bd, 0xe81228f8, 0xb3efbf4f, 0xfb47d320, 0xcfd42ab3, 0xa15f1d88, +- 0xf1c60fe3, 0x870f2023, 0x9d11fc60, 0x1bf6b7c7, 0x96df1865, 0xdf186153, +- 0x3df1d0a6, 0xf55c3fd4, 0x129f1f19, 0x6f210c61, 0xf8e19f09, 0x1c0a9cd6, +- 0xfd42ad7f, 0x93f1d8ae, 0xc337e3a2, 0x344bdffc, 0x8c637eff, 0x6c59cff3, +- 0xe6c2bf9c, 0xb3aafeff, 0x9c24fc7c, 0x59c207ff, 0xc59cff36, 0xd656fe6c, +- 0x777c746f, 0x302dff14, 0xe304f1fe, 0x19c6f35b, 0xa977dfe7, 0x3656fe71, +- 0x5f55e9fe, 0x389df1f2, 0x97c2e7fe, 0x977dfe6c, 0xd58af8e2, 0x51fe05e7, +- 0x83aa93b2, 0x9bd27c74, 0x600cbe2a, 0x940e3a17, 0xd0a95283, 0xe84db210, +- 0x34fc7087, 0x57dbf189, 0x50df9449, 0x39f0059f, 0x59cd5209, 0xce46fd48, +- 0x8bea4beb, 0xd87bd014, 0xf9adfd4e, 0x8d79d41c, 0x5937f222, 0xa00e0d6f, +- 0x8a36b6f0, 0x5bcfa801, 0xfa083e3f, 0xee4acab5, 0x24ef872e, 0x9fe78112, +- 0x96c87afd, 0xcb9979d8, 0xf1f2b5f9, 0x8b791896, 0x64c581fa, 0x6f853550, +- 0x88c13012, 0xd427fa8e, 0xf8c7038f, 0x10f7ea43, 0x2a7cffea, 0x9bfef1b3, +- 0x6f507bfa, 0x3a1efea1, 0x7e1564ce, 0x377bbb47, 0xce5fc293, 0x6244ffe1, +- 0x1dc9faf2, 0xe5403042, 0x0d9fabf3, 0xeefaff45, 0xe9141d7b, 0x0ecc701d, +- 0xe9d430f4, 0xa74002bc, 0xe0d6ddf6, 0xabf10116, 0xa1a6be02, 0x77321268, +- 0x75c5365d, 0xdd7ffbc7, 0xe090e53b, 0xa256e426, 0xfdf419c9, 0x7d0a573b, +- 0x19dc743c, 0xad80b59a, 0x05b65a43, 0x5b649ae5, 0x73721146, 0xf69950c3, +- 0xf269a640, 0xe3312d27, 0xd6332f4e, 0xeb1b9467, 0x5b26b2ad, 0xd3ad5c28, +- 0xf699b204, 0xb196733b, 0xbfa71f5d, 0x99d19525, 0x714e578f, 0xcd1f4592, +- 0x1e00b284, 0xb3ce907b, 0x1d5bec3c, 0x32b9aa9e, 0x1f1fa089, 0xae8049e8, +- 0xef7c3481, 0x6f361e27, 0x64b3bc33, 0xe74e569b, 0x18b66b39, 0xc336fe04, +- 0x875efeff, 0xe5a7c966, 0x626427ba, 0x331f3ce9, 0xccf9b7fc, 0xb0c909f3, +- 0x615edfce, 0xe6f8ce7e, 0x27ffa738, 0x3cb41fc0, 0xe141fc01, 0xa3f9c63f, +- 0xfe32af43, 0xa6fab2a8, 0x6fb43f02, 0x95d20914, 0x9cadcbf3, 0x1ad7e65f, +- 0x9f1082f9, 0x385c740c, 0x3878284b, 0x72660f86, 0xc1b8583e, 0x927737c8, +- 0x87159c80, 0xdfadb72e, 0xdaa660fc, 0x711f7e79, 0x91fdb9be, 0xce9f887d, +- 0xba7464f3, 0xcee9d38b, 0xadfb636a, 0x7277ae9c, 0xf0daceba, 0x7d54ebd8, +- 0x41a89f90, 0xeabde419, 0x2d9e9d3e, 0x38fa7a06, 0xde70cd3d, 0xd779e9c5, +- 0xcd3d18cf, 0x7a70b6f0, 0x2f386cb6, 0xe19d7e93, 0xf777c335, 0x83e69dbd, +- 0x81d9ad71, 0x6aacf4f8, 0x2c715a2c, 0xe86579e6, 0x62c715fa, 0xdd496ce4, +- 0x517d4334, 0xfbc336f0, 0x36cc370b, 0x5dafcfb4, 0xbb9f6864, 0x7d431eee, +- 0x8667e076, 0x77beeff7, 0xcefda195, 0xed0c87ea, 0x663c57b7, 0xdbe6dfa8, +- 0xe67f7868, 0xf686cdac, 0x19cfe519, 0xed97a7da, 0x69a7d430, 0x0bef0dbb, +- 0x6df5177b, 0xf7d575c1, 0xef10199f, 0xf9159bfc, 0x74efacd4, 0xafcc78bd, +- 0xfee3f3e2, 0xf49e5841, 0x69f9f17b, 0x572c28ff, 0xeba6fe81, 0x2b376582, +- 0xdd9f1eab, 0x9742f817, 0x6f654f8b, 0xaed9e80e, 0xbefea1f4, 0xbfd1ef59, +- 0x8a7678ec, 0x48152e5e, 0x6d83ac39, 0x9fd74edc, 0x4ecc2ddb, 0x2c01e420, +- 0x6e4c2a97, 0x2accee97, 0x47a86e26, 0x133b5606, 0x02424bf7, 0x6d7e67ce, +- 0x85ce019e, 0xc136ae1b, 0x6af905b7, 0xe1987051, 0xb1ba92f9, 0xecceef86, +- 0x65be1113, 0x61a3e320, 0xdf7f2b39, 0x7233fa02, 0x10fa6720, 0x00fb5780, +- 0xd13d8deb, 0x2fe33b9e, 0x006c715b, 0xcb1cb9e0, 0x5859fe93, 0xb0fbf71e, +- 0xc0afe63c, 0x357f13f2, 0x7bfe2d96, 0x7f6ffcb1, 0xfd0fcb00, 0xdf7cb0eb, +- 0x51e58b5f, 0xdf2c06ff, 0x7cb107f3, 0xe5875fd7, 0x9610fe3b, 0x2c46fecd, +- 0x961afd5b, 0xf0c4bcba, 0x18acdf4b, 0x9ff5d17e, 0x724f1fae, 0xfc0d397e, +- 0xb62f8f12, 0x84e2f918, 0x617c8d5c, 0x3a6687d6, 0xf7dff598, 0x3f2987e5, +- 0xd0743f12, 0xef44db3b, 0x9de8aebc, 0x7bd0c629, 0xe0c3c58a, 0x05fef4e1, +- 0x5ec71bc0, 0xfb8b049f, 0x483b1888, 0xfac0b22b, 0x2fef9cb0, 0x3f5807d0, +- 0xa1aec7c7, 0xbda335dd, 0xfa041c14, 0xffa0dcf8, 0xf9f10819, 0x51294773, +- 0xcfcf1372, 0x7884bf4c, 0xabe8f180, 0x2e94820b, 0xdbb73a3d, 0xed5e1893, +- 0xe8465216, 0x80d0f17a, 0x0673bc67, 0xa9225d63, 0x3bd07df0, 0x5fa715cd, +- 0x7e02836a, 0x8d6bc2bb, 0xe87cabeb, 0xff93f8ef, 0x8a72842c, 0x49a1d985, +- 0x87b44407, 0x2f69e449, 0xefaa37e0, 0x884cdead, 0x500fb763, 0x931eb83c, +- 0x02fe2312, 0x3dfc06c5, 0x8cd47144, 0x266d59eb, 0x57ffafe2, 0x81bab303, +- 0x64f4aebf, 0x039cf857, 0xe017fef3, 0xd5fd2bb3, 0x9a22de95, 0x9d2352fa, +- 0x21dedb7f, 0x30ab0f05, 0x5be3b7ee, 0xc332b7df, 0x7c8ef813, 0xf3ae96dc, +- 0xa10e7371, 0xf2e59ce3, 0x8ae1ae72, 0xb44ba064, 0x29e82e9f, 0x3947d7fc, +- 0xe6cebfa0, 0x6b5bfb1a, 0x21592fee, 0x5c7435c2, 0x6490a297, 0xbe885642, +- 0x06fd115a, 0xfc004b6f, 0x6f0ebdf1, 0xd8fe0a8d, 0x54463fe9, 0xb7e8d9e8, +- 0xb4fc3b9f, 0xe59bfc1b, 0xb1f56299, 0xcbd47438, 0xb56e50ca, 0x680fd633, +- 0xd5cfd634, 0x9c21650a, 0xcb7c9a97, 0x3c075810, 0xd064c7d5, 0xea5899cb, +- 0x54cf2cfd, 0x7f4a1c70, 0x53ea47a6, 0xf69ccf50, 0x1fbdf0db, 0xfd448e1b, +- 0x40d1c074, 0x83dfa53e, 0x4bce5d88, 0x39427efc, 0x10282e90, 0xf961248f, +- 0xecdff02b, 0xfdcbbff4, 0xeb095fa0, 0x2155bf7a, 0x06bd6031, 0xc61bd79e, +- 0xfaa9dfa3, 0x977c2c1e, 0x7224de58, 0x4a77e75c, 0x7ef837b7, 0x7b3a92f1, +- 0x4c2ed1b5, 0x1aabd431, 0x760daab3, 0x0c03fc22, 0x02410ae1, 0x6729777b, +- 0xb9c936bf, 0x2b68f80e, 0xdf80fb04, 0xa55ef605, 0xa9f145ad, 0xc0cd2628, +- 0xe946739f, 0xfcceaf7c, 0x53a7ea80, 0xe404c96f, 0x50a25c8b, 0x47f47615, +- 0xa1625057, 0x36bcb9f5, 0x64c961a7, 0xbd4eaf58, 0xf5da2372, 0x1bb948f3, +- 0x520acdfc, 0xcff1085b, 0x0652c4b3, 0xbc967972, 0x23161ee3, 0x0545e787, +- 0xcebb99e1, 0x7f531768, 0xb85f50d9, 0x405f58c1, 0x7d874e6e, 0x65eb05f0, +- 0x5f401412, 0x153fdb18, 0x242d1c99, 0x7d606bd5, 0x75b32f5f, 0x48878e6c, +- 0x555f54d9, 0xe154fabe, 0x1fff5a6c, 0xf42dc591, 0xa945dd7d, 0x1c589fcc, +- 0xb468acda, 0x6186d3fd, 0x43cd52b7, 0x81ae0fbf, 0x4bb02af5, 0x3b536ef0, +- 0xc2bbefd3, 0x5f57866f, 0x2fed3bff, 0xeb2a3873, 0xc7182d04, 0x0249b00e, +- 0x580377f7, 0x863c960e, 0x5328c2b8, 0x53f37bfd, 0xd3f0311a, 0x4aa7d156, +- 0x80ff193d, 0xed48253f, 0xf487ef8a, 0xffa9d99f, 0xff6a3fc1, 0x85ff69bd, +- 0xfd47fe86, 0xeff7fda8, 0x6944ff04, 0x2bfee744, 0x95f17d5f, 0x8b27d500, +- 0x4ddaffb7, 0x4a78fae8, 0x52f74daa, 0xf6dd2efa, 0x7ce81ba0, 0x81b80a52, +- 0xc5054f5f, 0xf59c60b2, 0xe0493eea, 0x14e6a2f6, 0xff058e20, 0x7e9ffda4, +- 0xdfe817fe, 0xf64db57f, 0xceaa7c60, 0x3952b11a, 0x68b0d65c, 0xfac7c932, +- 0xf6beacc7, 0x8dea110b, 0xfc5bfe46, 0x21d3afec, 0x0a7282df, 0xd044d78f, +- 0xf5b65d9e, 0x975852b3, 0xca3b48aa, 0x183bf991, 0xea2a62ff, 0x724ad9bf, +- 0x270a76e7, 0x1c55ddfa, 0xbf0d552f, 0x437442f8, 0xd009fd79, 0x4043d417, +- 0x5dfcd8bf, 0x974fb705, 0xe3b4ae4a, 0x232714d4, 0x8bd048c9, 0x90485e3a, +- 0xabe2a7d9, 0x3c43e54f, 0xb7d6ccf2, 0xbe0c42dc, 0x173a7974, 0x7b9ffb9a, +- 0xb77ac4d4, 0xac5bca95, 0x5bafa41d, 0xabb7236a, 0x2a5cacc3, 0x1f90dc47, +- 0xecb374b3, 0x4bc7d00d, 0x99fa7c5f, 0xf83e2127, 0x0077ab37, 0x8bc97fed, +- 0x8637bfaf, 0x90ec97d6, 0x69b326d3, 0x0ef48538, 0xffd154fa, 0xa0e82dee, +- 0x5f97e2c7, 0xec21d457, 0x1da9fdf9, 0x63b25974, 0x7486429f, 0x684947c6, +- 0x8ce2d29f, 0xc7d09f43, 0x882760a5, 0x00ad7eaf, 0x15ed4ffd, 0x1c6e4648, +- 0x1d7e6e7c, 0x13c000ed, 0x2bd393d2, 0xfbd33f4a, 0xa02e9455, 0x32f4cdb7, +- 0xf40537bf, 0x2fd608cb, 0xfe502de4, 0xe40f697e, 0xf56fbd15, 0x5e2a1e02, +- 0xf986e15a, 0x19aa909c, 0x60f53f9f, 0xafc746ba, 0x1ee90390, 0x8af3d92c, +- 0xf21bfddf, 0xffb7c2df, 0x35e31d2d, 0xe0b2cb44, 0x82c8145a, 0x34dfce79, +- 0x80b9e703, 0x2b0f90f8, 0x41cb129e, 0x91297e1f, 0xe4711db2, 0x93973ce4, +- 0x71285b13, 0xd04f3ce9, 0x6df30665, 0xdb8311de, 0x87beded0, 0x37f83e80, +- 0x316a173e, 0x1b4bfd60, 0x921bd7a3, 0xab5197ee, 0xb77f9633, 0x3a066dae, +- 0x65a3ee9d, 0x15463ec0, 0x1f1c0291, 0xafda65c2, 0x0ca4f6f8, 0x4aa22746, +- 0xba3bfc85, 0x73c097ee, 0xd659bf78, 0xef86f9ec, 0x8edce5c8, 0xf1f257f1, +- 0xb049dc29, 0x8f489f5e, 0xb2aab76f, 0xbae807ae, 0x3167c31d, 0x7fe4cef2, +- 0xde4c43eb, 0x4e0ff975, 0x0bf6832b, 0x823932ef, 0xa43d60ef, 0xb0324570, +- 0x022ddf7d, 0x892b07ea, 0xadf393c4, 0x63739732, 0x285f99bb, 0x1c9092fc, +- 0x4e3037c3, 0xf701d22a, 0xa7ac1631, 0xd1e8c7df, 0xddd7182a, 0x8e5d5fb9, +- 0xd07d7217, 0x6407d26a, 0x8903d313, 0xae00aaed, 0xe0e54b7f, 0xfc824f33, +- 0xa80d7952, 0x3972bf20, 0xfaf3ffcc, 0x84fdef03, 0x21e7cdca, 0x7a8d6e5d, +- 0x15b72cd5, 0x7890473b, 0xd3b9fb72, 0x2dcae24b, 0x6e571e7d, 0xcfc82d9d, +- 0xaaf5afff, 0x990cc78e, 0x0eeaf1e2, 0x327aea3c, 0x7acd3e11, 0xc6a4a772, +- 0xeff493d5, 0x99d8525d, 0xd43e751f, 0x0bf16ff9, 0x1f417d95, 0xe754f945, +- 0xea9f28c3, 0x5e29d87c, 0xb9a3c06a, 0xefb0effd, 0xdb62fc01, 0x7518f538, +- 0x015e6d21, 0x338afee5, 0xb4afcc16, 0x5f70170d, 0x0906d064, 0x3c5b6feb, +- 0x9d4ec023, 0xcfd5f63a, 0xbbbe467f, 0xcb7df07f, 0x3f3e2957, 0x6ec84019, +- 0x5f046528, 0xc8e7a58a, 0xeab38330, 0x43f60908, 0xe589a0fd, 0xcff4fe31, +- 0xbdf76665, 0x61cee1fa, 0xb6a2c780, 0xa82dc9c1, 0x9fa20737, 0xc8f5c559, +- 0x0c9a80b9, 0x385cf5fa, 0x73c9fd0f, 0xbc574587, 0x38e7c6fc, 0xf8805f7d, +- 0xb6db2d19, 0xf2915a92, 0x47691b5d, 0xd5b022bb, 0xd9c5b646, 0x9990aadf, +- 0xf8a1fc9e, 0x3e03fa00, 0x94b7b39e, 0x73b1c796, 0xbbeb9dff, 0x81fffba9, +- 0xe155e6eb, 0xa7b016cd, 0x316adaae, 0xeb9605c4, 0x0a405d7c, 0xeea7af80, +- 0x0386bbb7, 0x5e8b0f1e, 0x0aad03c8, 0xe2f8a17f, 0xf9e68df8, 0x8f60ff43, +- 0x707b2b3d, 0xd0e4d7dc, 0x6bc3c05c, 0xf6046d67, 0xb52b76d3, 0xf9c1e24b, +- 0xb9c1852b, 0xcba318fb, 0xa297858f, 0x18a46736, 0x095b3de2, 0x3a676df2, +- 0x73f3e413, 0x2ab82475, 0xb22de817, 0x68353d7a, 0x9414fbe8, 0xef838e5f, +- 0x635ed12e, 0xc68af3e4, 0xf4082f1d, 0xc16165bd, 0xcbeda163, 0xf80516a4, +- 0x4531aaa5, 0x54367d04, 0x3d5bf3d5, 0xe1896e43, 0x096567bf, 0xcc6079e7, +- 0x5e03b76b, 0x08519fce, 0x076801e4, 0xf84f31db, 0xf218787c, 0xbd79a25b, +- 0x275327ec, 0x410fd0ca, 0x71d3363e, 0xa1927d70, 0xd7c4b63e, 0x6a9ae00b, +- 0x8de9596d, 0x1c01f783, 0x7c963fef, 0x5b765576, 0xe5d5df7e, 0xc79627d7, +- 0x9d57ddf0, 0x9e2337e5, 0xa55f2efc, 0x97bcc066, 0x0065e537, 0x21bf973e, +- 0x57c78cf7, 0xdf99fa2f, 0x03e79db8, 0xf95035b7, 0x7e4626bd, 0xc6fca81b, +- 0xfcb61389, 0x22fbf2c8, 0x7b3c6fc8, 0x9757cf8c, 0xc7f0fcdf, 0x0df9bf28, +- 0xca1e4316, 0xefaf9969, 0xe857e509, 0xd41a4b79, 0x8e23af65, 0x403c06be, +- 0xdf3b739c, 0x40718007, 0xbbe5558e, 0xfc7ff1c9, 0xf978e58b, 0x3379822e, +- 0xe4cde99d, 0x2a6ef978, 0x9dd002c7, 0x26f2f1c9, 0x9db9c72a, 0x275077e5, +- 0x2fdf65f9, 0xabefb08b, 0x7b7f731a, 0x40af1d07, 0xfa36bd93, 0x3c87417e, +- 0x6795888f, 0xcf204955, 0xcf27bb87, 0x533cb8bb, 0x8de7ed39, 0xd86f5743, +- 0xdaf61f98, 0x2ff513e8, 0x41fe5f03, 0x6de9ff44, 0xff73b30b, 0x70c4fa38, +- 0x00db8be0, 0x632fca1e, 0xfd5a1d39, 0x74bfec01, 0x9074c6cc, 0xb5839293, +- 0xec3c81bf, 0x0132adca, 0xe1acb87d, 0xcd53f463, 0xbedd1771, 0x745fc732, +- 0xc38e623d, 0xbd33a92c, 0x9dbe30a7, 0xbc20b626, 0x77a24fe4, 0xd3be1c5b, +- 0xe704ebdf, 0x9cf7dae1, 0xece03bc3, 0xcfa42e2a, 0xf4b82ba3, 0x7c2b9579, +- 0x864a1bbd, 0xe291bc41, 0xf025e511, 0xaa7188a6, 0x8601a2f2, 0x72b70cf3, +- 0x16d58738, 0x62d84095, 0x80ebe41a, 0x9ee1b55f, 0x368fb043, 0x005aa8e2, +- 0x31d8f566, 0x57f81f56, 0x51dbd9cf, 0x3cba759e, 0x3964f9c4, 0x5eb5e7ef, +- 0x6fc0c5d5, 0x07828d55, 0xc8aa9dd6, 0xc6dcf03f, 0x955f8d81, 0x6a2d1f02, +- 0xe4563c12, 0xf0142fc3, 0xfae94afb, 0x2c34fc0b, 0xbfda05fc, 0x448a9a8b, +- 0x6ed17ef8, 0xbbe41301, 0xe9774fc2, 0xf7c396b6, 0x04efc022, 0xbad9db38, +- 0xdbd3e1c6, 0x0180a4ab, 0x2f2792fe, 0x7066c9ae, 0x03b556ab, 0x785111de, +- 0xaf388b67, 0xe3abc26e, 0x1f782bbd, 0xe3deb852, 0xb8d3fc74, 0x222f18f3, +- 0xf96e94e1, 0x6e35df37, 0xd19a4555, 0x57e3d35f, 0x2adf455b, 0x6588e219, +- 0xf38c6482, 0xfbfc63b6, 0x7fffe847, 0xf07fadbe, 0xdd74222f, 0xd3fd7dfa, +- 0xcfb3ef88, 0xe8153c7f, 0x9135e4b2, 0x5a5d28d8, 0x82245deb, 0x054124fb, +- 0x41b8b0e8, 0x240e30d4, 0xbba70a45, 0xc351f162, 0x85ddb1f0, 0x4ef1707a, +- 0xfd32706b, 0x9f2bf17e, 0xd33d83e6, 0xa1fb40fa, 0x3c03886c, 0x931ca02f, +- 0xec3e4b40, 0xd8962d13, 0xbf198dbe, 0x87c58511, 0xcc76eccf, 0xea107902, +- 0xc5a9b9d8, 0x35b299a1, 0x557e1ec6, 0x641c5991, 0x15af3b37, 0xbcc04e78, +- 0xf62f8031, 0x8f9e8edc, 0xe639e673, 0x946e2c97, 0x6afe7083, 0x568edd71, +- 0x3e2c9b88, 0xad75c56a, 0x8c0beeaa, 0x7f6c96fb, 0x6aef9d91, 0x72fe0d14, +- 0x4eb53f27, 0xbfc1588c, 0x38c4a86a, 0x8c7fad3c, 0x0bf710f5, 0xb51fa3bf, +- 0x2bd37b64, 0x25c28a01, 0xc6eb3f2f, 0xdbcd5873, 0xd6afe8dc, 0xa8dc7b7d, +- 0x7a1a5f93, 0x53a5fb88, 0x97df804e, 0xcd3d2fc8, 0x62b4e4f9, 0x7aebeff2, +- 0xe14abfa0, 0x638f2c2c, 0xfff947b7, 0x077f2fc5, 0x3b33d571, 0xc01dff3f, +- 0xf39bf4bd, 0xe28fbbbf, 0x7bb5ec93, 0x3d560f40, 0x438c17ff, 0x5649dfe9, +- 0x7b9fafae, 0xad78e316, 0xa17ab37f, 0x13a6d6b7, 0x6ac71039, 0x748ff1dd, +- 0x365653b0, 0x6bbb424d, 0x0c92aee5, 0xd04ec712, 0x60dfe04b, 0x6688e237, +- 0x38681dba, 0x9e700390, 0x748774a5, 0x21bc68be, 0x38e2c954, 0xd4338f2a, +- 0x76db8fc7, 0x4c342b8a, 0x70fc69bf, 0x4aaf6528, 0x785f11ba, 0x9af3d297, +- 0x9eb1d06e, 0x534291c7, 0x70be35be, 0xe941fe16, 0xc6356795, 0x986cbe17, +- 0x424f9fff, 0x848f435b, 0x374885f1, 0x85c7a7f0, 0xdf2d14db, 0xf3b9720a, +- 0x00eb8c05, 0x09d326fd, 0x65f8beb7, 0x4fd5c40e, 0x6177edca, 0x15935bbe, +- 0x3717d7f7, 0xa9e515fd, 0x68dbd775, 0x9f1e127f, 0x3fd1256d, 0xb9e34716, +- 0x5d5b55aa, 0xe9c12e2c, 0xd50b7100, 0x7c79cf8d, 0x1eb5f182, 0xaf1448b7, +- 0xc7ed6058, 0x5c594ef3, 0x07eb72a5, 0x83c5310a, 0xeb1d5184, 0xe97a227e, +- 0x1e00f078, 0xe3c6c646, 0xa287c7e2, 0xdd1338f1, 0x87109e80, 0x68dbc68b, +- 0x5dc437bd, 0xe35fc282, 0x375b77c5, 0xab5e38b3, 0xe95bcc6c, 0xcf8b13a0, +- 0x5bd136cd, 0xeb576f9f, 0xf8f35756, 0x069a78ae, 0xcecf768b, 0x29733af8, +- 0x6d5f7ebe, 0x3ed87e15, 0xbcc13ceb, 0x7c0353ef, 0xb1f0d959, 0xfa8d7902, +- 0xf7cfa6fa, 0xcfcfb70c, 0x5e622f3c, 0x01d09aee, 0xfd66efd4, 0x61ce0cb1, +- 0x37f781c4, 0x8d65de1c, 0xb338fd6c, 0xd27415d3, 0xdfecce7e, 0xacbd7c8d, +- 0x402563fe, 0xf7543bfb, 0x49fcc2b2, 0x7eb04726, 0x3fe06304, 0x7cbed2f3, +- 0xfe647f16, 0xad9c7980, 0x85563f5c, 0x55538fe3, 0x9c6185ff, 0xc2908125, +- 0x7dbfacf2, 0x3692d3bc, 0xdd3bfa13, 0xb3c8132c, 0xcb121d3c, 0xae6bede2, +- 0x5f7ccab5, 0xb9c596b3, 0xe78a3ae9, 0x9cec5c5e, 0x60aa988b, 0x6ba5641c, +- 0x5f3851d4, 0xa8a5d2b9, 0xacd51fe0, 0x35bcfb62, 0x0266f73f, 0x6e526bbd, +- 0xad6d78c5, 0x349ebf09, 0x7f9c114f, 0x1f2c4cf1, 0xd66aec0e, 0xc59a293b, +- 0x574aff00, 0xe14a8659, 0x81fb4d5c, 0xf244a8f3, 0xd11c39e2, 0xf3065a5d, +- 0x8f163d11, 0x4c7c4e3d, 0x5f139676, 0x8f645e0c, 0xb90cdcf1, 0x7e854c34, +- 0xa5d9fdf4, 0xd843e6b6, 0xe004d1e8, 0xc7ef892b, 0xc1e2dd17, 0x0bd5b779, +- 0xaa71605e, 0x3a4f559e, 0x758033cb, 0x72676da4, 0x3f06b93e, 0x5f5d1a24, +- 0x50b9fc1c, 0xe81f6fbf, 0xa26ed5a5, 0xa33950a5, 0x3cc55558, 0xd4343f38, +- 0x9f01e426, 0xd7c7f17e, 0xb0f6bf68, 0xa0352048, 0x19e7a9cd, 0x67202969, +- 0xe608f20e, 0x5f2b0093, 0xa701d1ee, 0xc084cf39, 0x97e7312b, 0x8c4e8927, +- 0x24db9c7f, 0x922b9fa2, 0x8e3b7eab, 0x0824edf9, 0x65f5f3f0, 0x1cf38709, +- 0xf0231175, 0xe30bbd7e, 0x98df0bf3, 0x7403f28b, 0x8f57c588, 0xb91fa332, +- 0x87ceeec1, 0x768d9dfd, 0x492816f7, 0xbc866b40, 0xdfbc79e6, 0x73c6e59e, +- 0x030c5448, 0xe7ce7f60, 0x82f9faf2, 0xaf98c3d2, 0x7a805be0, 0xf196633e, +- 0xbed9929c, 0x1fb50897, 0x0a0d7d61, 0xb38908de, 0x19b8dfaf, 0xdecaeee1, +- 0xb0e8f1d7, 0x3909bd51, 0x04e24e42, 0x97d6263c, 0x65b7e05d, 0x0dc76fe0, +- 0xb5f8eeff, 0x6bf11a66, 0x75f88d57, 0xcfe3320c, 0xd7975f88, 0xe6ca2f88, +- 0x6fc36fc1, 0xb9e328f2, 0x7e157faf, 0x1db8d987, 0xff4af1c9, 0x4ce96dca, +- 0x59dc0365, 0xc2e50452, 0xced9472c, 0xeeff0088, 0x855c1693, 0xe85d795f, +- 0xf9f264af, 0x77d8f308, 0x1123900e, 0x1ca2f5e0, 0xd00bc9c1, 0xa1f20ef3, +- 0x2169e807, 0x57cb929f, 0x8ae7a627, 0x9e3f0769, 0x04dabf43, 0xf20d7bfc, +- 0x955f3b03, 0xb935824a, 0x0f5ea720, 0xbf21dfac, 0x864f3bcd, 0x3bc4f673, +- 0xaf9c006f, 0x68f960f7, 0x6dbf7b01, 0x1a73c130, 0x7485c8a1, 0xf3554fd0, +- 0xbfe83949, 0xa9f69547, 0x6cbef7e0, 0x1bbdf167, 0xd3ea0aec, 0xae16eda7, +- 0x71be2757, 0xb6c7952d, 0xf9c2acb0, 0x36f0b6c0, 0x37a800db, 0xbd6e788a, +- 0x4af6a52a, 0x2c35bf18, 0xd9e6b833, 0xbfc00382, 0x3d71926f, 0x0e379d68, +- 0xed44c1cf, 0x4fdb30b7, 0xea7f0b6c, 0xcfa31b9e, 0xb89f1b5b, 0x1b0fe212, +- 0x31f7f12d, 0xdf2cd857, 0xae8d7fcb, 0xf29d0dbf, 0x58d8562e, 0xfda3c75e, +- 0x4d963ce8, 0x61d7c73b, 0x39630f26, 0xb82e0f9d, 0x2bbfe701, 0x3a7cfd4c, +- 0x8ef1528f, 0x79d0871b, 0xc48bfe8e, 0x26d12bf4, 0x47674ecf, 0x1afde080, +- 0x5fa82fd0, 0x0e2cff6b, 0x44a0b887, 0xf0c45ce0, 0x6fe805ea, 0x7ca6e6bd, +- 0x50a2f94e, 0xbe030d0b, 0xc14e189d, 0x3eaa0a7b, 0x8fd76824, 0xfc0c9668, +- 0xd5d7c859, 0x9f1616c2, 0xd8d4791f, 0x3245ba3e, 0x8c4141d9, 0x693d8f1f, +- 0xf3ab5e7c, 0x03a49bb9, 0x24bfaf9f, 0xd517900a, 0x0fbc4ed6, 0xe6dbb850, +- 0xda3842f5, 0x2b29c02e, 0xcb125e5a, 0x9bf7ade2, 0x6b0f2c6d, 0x9d7042a3, +- 0x89c0b8d9, 0x17fb08fb, 0xeb3cc62c, 0xebe67eaf, 0x5edcef1b, 0x664a7e8c, +- 0x325af5fb, 0xbdfc0519, 0xaf78605a, 0xb7dd8acd, 0x9f9d4bd2, 0xf9d6fe75, +- 0x92416b3a, 0xcbde5e2f, 0x7bb33b60, 0x120c178a, 0xf6d7f014, 0xa9fc780a, +- 0x219f01f5, 0x065cdb7f, 0x00d903c8, 0x79e3554f, 0xe16dbbb4, 0xfb5479f8, +- 0x0fe66e6d, 0x0558103e, 0xa53f1e79, 0x327a09c2, 0xd1ebbf71, 0xa083aadf, +- 0xab677c2a, 0xa6e78d9d, 0x16c8dbe6, 0xb54ad388, 0x80bb3759, 0x5fae4bff, +- 0xb27de143, 0xebeb82dc, 0xf08bd946, 0xc1092a07, 0xa73f03f8, 0xd92a7bd5, +- 0xec7e7b1c, 0xa8e8ad88, 0xa8f7ce8d, 0xeef383cd, 0x000af3e1, 0xffebf7bf, +- 0xa6bb06e3, 0xe915a2ed, 0x43fb8bd8, 0x6de777fa, 0xd80f4f0c, 0x7be077b5, +- 0x72869152, 0xbdb9f5e2, 0x39c186f3, 0x18f78a55, 0x5fa0ea39, 0xea91e700, +- 0xc28e3aa3, 0x20b4ea93, 0x534d125f, 0x031e7a3d, 0xc8c5efe1, 0x04088905, +- 0xbd741cf2, 0x8885842a, 0x70c1ca8b, 0x7e02339b, 0x9d056a47, 0x4ec10537, +- 0x66bfac6c, 0x1cf44ce9, 0x5251e61c, 0xe4842cbe, 0x12798279, 0xfd05a890, +- 0xd756faeb, 0x0853abd3, 0xc7eacbca, 0xed0d60a4, 0x62d49367, 0xae4af887, +- 0x56c316a6, 0xe2a4aa74, 0x153ebcf9, 0x1c73f304, 0x44a54f79, 0xf42a16ed, +- 0xef11bf43, 0x1fe7178e, 0xe5f1d76a, 0x2be027fb, 0x7efb70ff, 0x76bc6f30, +- 0x75f79e36, 0x51e9da1b, 0xb1edc1fd, 0x8efebe52, 0x2bed8cfe, 0x24b5c893, +- 0xd66f8e36, 0x327dba1f, 0x03cb7c7a, 0x6feef80e, 0xadda4e0c, 0xe08ddf06, +- 0x13ea8df3, 0x0c8e6ebe, 0xbf427d53, 0x3b0f082f, 0x82eef100, 0x771c990f, +- 0x038727d2, 0xfbefe022, 0x5f3311ea, 0xb9508d0c, 0x5583ede4, 0x89ecbf38, +- 0xafbda1d6, 0xd277a8dd, 0x40cf0da6, 0x9bf3973b, 0x7cbacf19, 0xe0bee59b, +- 0x2b01ef5e, 0x60910b83, 0x1d08871e, 0xa079a870, 0x60888e97, 0x5115b7ef, +- 0x0eb8503c, 0xb94bf972, 0xe61ebc10, 0x9d7c3ebf, 0x7be4e41d, 0xfa1127af, +- 0xf27c4c75, 0xde37d171, 0xdcf8f2ce, 0xfb658780, 0x24f5f02e, 0xca8ef482, +- 0xd8939501, 0xffce8978, 0xe5d77e66, 0x3a0e06a3, 0x0bf9e1e7, 0x28aceb02, +- 0xbdf0f084, 0x00f26c95, 0xbb7b755e, 0x24b7db86, 0xdff68590, 0xebe10f4a, +- 0xf8104e51, 0xedd646a4, 0x362daf75, 0x55d2b53e, 0xfb6df19c, 0xa9175535, +- 0x8793167f, 0xa3b5255d, 0x517556ff, 0x1bdfe7c1, 0x450a617f, 0xf37f01ba, +- 0xe33b3ded, 0x57c83c6f, 0xe62fffcf, 0xbf3ccab7, 0xfcc76ab5, 0x6bdf12c6, +- 0x147f542d, 0xe35758ae, 0x7793f150, 0xeb3b0b33, 0x657cfd05, 0x96603d22, +- 0x6b4b91f7, 0xb498600f, 0x72af790b, 0x3212fc70, 0x98d9f41d, 0x725bb508, +- 0x05ffcb3b, 0x072abf3e, 0xaddb7bc3, 0x9e4103ed, 0xdfbe8856, 0x16a811d9, +- 0x8aec058b, 0x1eed04dd, 0x6e63beef, 0x1ee6f794, 0xb3a7f586, 0xf660105d, +- 0xf4475f26, 0x48d0a7b8, 0x738e80e5, 0x0e7beec4, 0x30f1affa, 0x340e14bf, +- 0x623a7e81, 0x5e03d5f3, 0x24c6141d, 0x28324f38, 0x28e2cb92, 0x25dc8311, +- 0x49873392, 0xde74428e, 0xe805aeb0, 0x484036ba, 0x7b02cf0c, 0xd502230a, +- 0xf4b7602e, 0xb06c242e, 0x06f30465, 0x7bb3e77b, 0xb0177a00, 0xb4dec77b, +- 0x5bc938b3, 0xcbd11d7c, 0x03f2b623, 0x912cbf00, 0xfbe0b580, 0x42a00dc3, +- 0x5d88f17c, 0xb27807db, 0x8f386995, 0x0af10f6c, 0x52d98e94, 0xad7d8048, +- 0xc0aaa5d4, 0xad848ae2, 0xfed25043, 0x45ab27b2, 0xfeecf740, 0x6509cf04, +- 0x4713fd83, 0xe5d98e6e, 0x6b07161f, 0x1f8764ec, 0x487172e3, 0x31edf3a1, +- 0x473fe599, 0x7c1439e3, 0xebab6fc0, 0xeb6c9c56, 0x225f2c97, 0x6cf0c290, +- 0x6080cbf6, 0xd7892f30, 0x6488541f, 0x29bf454f, 0xb0197c00, 0x726fd0d8, +- 0xef086f10, 0xc7ea4949, 0xbc1145ee, 0x2bfea0eb, 0xf706dda9, 0xa0f2e825, +- 0xe3a3f9f3, 0xf44af66e, 0x73f8f755, 0x52d3e0f9, 0xe027ff7e, 0xb9dc75b9, +- 0x2671ab81, 0xef8c39ed, 0x6790d134, 0x51afd3a9, 0x0ecfd036, 0xfd5892f1, +- 0x810652ed, 0x242ade3d, 0x6a5fc179, 0x7830245d, 0x43cf1b05, 0xccf30c95, +- 0xa33f3074, 0xfec5eb8d, 0x0f38b949, 0xf3a09d7d, 0x5d71875b, 0xe7a23cd3, +- 0x8ce74c8e, 0x3290e7cc, 0x9df1a2f3, 0x2b07cc2c, 0x184ee057, 0x40ec2e72, +- 0xddcaacfb, 0x9ce2439e, 0xb168c993, 0xa6073dc7, 0xfd6f1497, 0x5e427a92, +- 0xe80a7561, 0x993b8cd9, 0xa3e3307e, 0x3d0c084d, 0x7f63fb04, 0xa3eee390, +- 0xe66665eb, 0xe8f3298d, 0xd75999fb, 0xdf3fa963, 0xc6e294e0, 0x0925c70b, +- 0x0c8fcc3f, 0x18df3cb2, 0xf3071dfe, 0xe77beb39, 0xbfc50d3d, 0x1be9e31d, +- 0x37de1892, 0x6fbc3124, 0xaa7c7450, 0x1d7f20c9, 0x5f21af75, 0x96dfbd62, +- 0x509e4122, 0x73e50b20, 0xbbd187be, 0xed0d7de3, 0xbb449e96, 0x125036fe, +- 0x0db265eb, 0x7dc59ef9, 0xdfe0bcf4, 0x994b9ff8, 0xdba7ed48, 0x8d505f38, +- 0xc29be8c0, 0x7eb0bee0, 0x4e9b8e12, 0x1481da2d, 0x2dca0bcf, 0x9d07885e, +- 0x1bbef39d, 0xc9cdc88e, 0x78242e6e, 0x0d7ab5f4, 0x157f73f8, 0xd125b77d, +- 0x5036d27e, 0xf183d545, 0xa525c805, 0x8fb8f5d3, 0x3712db39, 0xc497cfef, +- 0x925776fc, 0xccc8e107, 0xea748a9c, 0x014e4fa8, 0xa7ccc37f, 0xe6b35e54, +- 0xb738ef0d, 0x1166f946, 0x6f2cd9e0, 0x1469326d, 0x208add70, 0x7674d2be, +- 0x975b7ae6, 0x43903497, 0xa72a8fd8, 0x73a7547a, 0x3a6afe3f, 0x4ff13bc6, +- 0x1ffeff08, 0xc7b847e0, 0xd45ea317, 0x620c88e5, 0x7a0ede7a, 0xd9ce2637, +- 0x3ed7f4d6, 0xd1f89fb0, 0x60bbcfcf, 0x52efe93f, 0xecf40bbb, 0xecfffbc9, +- 0x8f863c82, 0x8ef167ee, 0xd7fe4cbb, 0xff4c4923, 0x5e54947f, 0xdbbaf303, +- 0x2fa175ff, 0xbdc95f86, 0x51645f6c, 0x6f9d3450, 0xae379e34, 0x17cf990c, +- 0x95df1007, 0xfd78fc52, 0xe71624fe, 0x59bf5459, 0x7c6156c9, 0xae81afdf, +- 0x797fb927, 0x03dd81b2, 0xa733c3a2, 0x3e02a87e, 0x56c3dfd7, 0x2cdeafbe, +- 0x9b43f5b3, 0x3e62fb0c, 0x9c33378e, 0xa4fdf887, 0xa22d7ff3, 0x8e9b33df, +- 0xc3d52f75, 0xf3cb30be, 0xfe63cf35, 0x9c296a47, 0x90ff9fe7, 0xbc34fe80, +- 0xcf5d3f7f, 0xc5aef77c, 0x3cf333fd, 0xa08fdf3b, 0x90b5dfa1, 0xce7cdbd3, +- 0xed98616a, 0x3e23cf6f, 0xf94ecf94, 0x0f966118, 0x9e238e6d, 0x00e79c3b, +- 0xf126343c, 0x3242ab7d, 0x762ef212, 0xfc97ee1e, 0x675ef96d, 0xd3f2b9f8, +- 0xa4f44f3c, 0x9359609f, 0xdbf3b2a4, 0x814bb7e1, 0xee3596bf, 0xbe657bc0, +- 0x0caa3eab, 0x84ff729f, 0x6a25e874, 0xe811fe5f, 0xc1827c48, 0xf9b65cee, +- 0x65fcc2bc, 0xf83b9f86, 0x1f003bf3, 0xeececfb8, 0xa963b90f, 0xdef6217c, +- 0x8c92f799, 0xa267ebfb, 0x3cd9e4e7, 0x93bef92a, 0x5f333f3e, 0x9b3e70d7, +- 0x9ada75b7, 0x35ca745e, 0xf872274d, 0xfbcc0779, 0x2166f9d6, 0x8acd2f29, +- 0xbd3a1fc3, 0xfe107ca2, 0xd3abc225, 0x6ced5e69, 0x2640af3e, 0x84cbf7df, +- 0x2f9992b8, 0xd76f3aba, 0x80e4b72a, 0xdee99abc, 0xfb3ce09a, 0x3ed893df, +- 0x2b553ced, 0x9f38bd05, 0xc4f1af94, 0xa5272bd8, 0x81f743da, 0x7c656d1c, +- 0xe06bd51c, 0x7ebe82bc, 0x7cf5c64b, 0x80cd4bb9, 0x1e90917b, 0x87615e70, +- 0xe9ef0035, 0x6bf71ce3, 0xf0197f5a, 0x69e5865d, 0x7fd6b97f, 0x82fb4740, +- 0x10dde78d, 0x441b6dc7, 0xead3be30, 0x71ebc232, 0xc78f0888, 0xa5bbd6c1, +- 0x1f37f352, 0xdada0e80, 0xc711f98c, 0xd0f8f12f, 0xbc596b25, 0x10ed5e79, +- 0xdd05f70c, 0xf74ae5c5, 0xf4e6ee3f, 0xf6cc2bbb, 0x9a6ce7bd, 0xdf30f486, +- 0xfb847267, 0x041bb32d, 0xfa6623d4, 0x775ef7cc, 0xdcedf40a, 0xdf7e1160, +- 0x11e45e89, 0x6e99bba4, 0x761e1deb, 0xad548dbf, 0xc73f7dc0, 0x4fb80937, +- 0xde8124b8, 0x8f0777fb, 0x3e737767, 0x822479e6, 0x55d6e17f, 0x98117a6b, +- 0xf80550ff, 0x3ebf0cdc, 0x6344f9ff, 0x37cf877a, 0xcb48bcd1, 0x829f2cb5, +- 0xc28be3af, 0x65a97eec, 0xaf2c888f, 0x748bc793, 0xcd7875f8, 0x971528f3, +- 0xdb6f3e62, 0x09f31106, 0xd7040aef, 0x77cbbdc0, 0x3d7016ad, 0x5d27444d, +- 0x32fbe84f, 0x63671acb, 0xf68f957e, 0xdb697603, 0xd9170487, 0xde0275b6, +- 0x9e90937f, 0x94579661, 0x30849e88, 0x74a3cdba, 0x7e6e387b, 0x3fd6915c, +- 0x78273f76, 0x763fd6bd, 0x3084897f, 0xdd4964af, 0x4af3c334, 0x774f5187, +- 0x3aa47f25, 0x2e9cde7e, 0xe9fcba6f, 0x9c1eb8f2, 0xa51fb073, 0x5ceca1e0, +- 0xe863cfc0, 0xfbfd50af, 0xff8b0773, 0x7d1b7a3c, 0xf3c6d965, 0xf984fd86, +- 0xe6bd18a3, 0x79f1938b, 0xe28375a2, 0xd787a0c1, 0xf87a8c3a, 0x9f47ce87, +- 0xfa272e87, 0x6272ccfc, 0x0f4cdefe, 0xa6670e3d, 0x001e998b, 0x470df827, +- 0x07c11c9a, 0x04479c28, 0xc9a07706, 0x66b7708e, 0xfe706896, 0xedd65966, +- 0x0f811e58, 0x57bd8347, 0xed038cfe, 0x7957ee56, 0x4503e7e3, 0xf76e25ed, +- 0x41961988, 0x93111e30, 0x2ec790bc, 0x77aa5b66, 0x7d8a79d2, 0xd2183969, +- 0x9c22bd99, 0x992daee7, 0x143dc220, 0x77bcfc35, 0x379d858d, 0xc3dbfbd3, +- 0xed97a0f1, 0x8046f28e, 0x9a9fece7, 0xfe2c1d0b, 0xce0afe8c, 0x143dee13, +- 0x760dbfa8, 0xf304ebf0, 0xc8d20b69, 0x83b7a001, 0xee40a368, 0x72a4743f, +- 0xffed9c3b, 0x286cbfd1, 0xcbcb56bd, 0x3f9097aa, 0x49b3e2fc, 0x37b25f70, +- 0x9722b2d9, 0x38e2ffd6, 0xb9ee093d, 0xce5b66f3, 0xfda87ae7, 0xd59cf8ed, +- 0xef9cb6af, 0x737feb47, 0xd875619c, 0xf87b82a8, 0x0527671c, 0x1e38c306, +- 0xb5eae7a6, 0x243e41ab, 0xa597f30b, 0xc3c60afd, 0xd5fdfdf5, 0x17e0e694, +- 0x79f9c87f, 0x17e2aacd, 0x2c67101c, 0x6fd854d6, 0x71be0ade, 0xea5fefcf, +- 0x161d1578, 0x4a0367bc, 0x1ca7ffc0, 0x485d3a9f, 0xe4357683, 0x7690923d, +- 0xb483ec35, 0x1dc77c3b, 0x91d87db4, 0x572009e6, 0x5fbcef0d, 0xf68df788, +- 0xa30cfd65, 0xf3a6e20c, 0x9f6afb39, 0x8afbb1cd, 0xcfa28eed, 0x0c943e81, +- 0xaa084768, 0xed41dc87, 0xa88d1a86, 0x31f81e4a, 0x81bdbb46, 0x49d7d9f3, +- 0xcf91e7e5, 0x9f50477a, 0x7df0e53c, 0xfd9be305, 0xda9cd211, 0xf253fe2d, +- 0x7af8c5ef, 0xd1e3766a, 0xff9f2039, 0x0afdcec5, 0x7af9869a, 0x9ef7a3db, +- 0x1df7f410, 0x710bc924, 0x9925e236, 0xb71e7481, 0x4abe30b0, 0x4bf18c2b, +- 0xf7e87cf8, 0x951ee113, 0x1fb60e91, 0x8227e74c, 0xa894369f, 0xf8830e58, +- 0x9ab01e43, 0x487beb0f, 0xb47de8e8, 0xccedc7ff, 0x11d5b7ef, 0x84675c43, +- 0x7707d993, 0x275c58b9, 0x0cdd0e49, 0x0be93dfa, 0xdefd01e2, 0xe12294f6, +- 0xb9e4a67e, 0x0e39f711, 0xf82e3059, 0x40f41cac, 0x4afdbd7c, 0x3a42dd49, +- 0x74e36bfa, 0x5c7dfbd7, 0x7884af51, 0xb3175cca, 0x222d9e27, 0x7edaf798, +- 0xfec2094a, 0xadb66a57, 0xcf4fd63a, 0x4faddfe7, 0xa4e41e2e, 0x8929a865, +- 0xf723f8c0, 0xd2928352, 0x02fa85e3, 0x76c5f03b, 0x43c511c0, 0x0f73d5aa, +- 0x9e7a97f4, 0xcf8b9bc2, 0xa4afc435, 0xf8a64d0e, 0x5383731d, 0x9e297b85, +- 0xc06e87b5, 0x2d17bf3c, 0x76d3ff78, 0xea0d3bc5, 0x1ea9cfdb, 0x9b3d0788, +- 0xf9c24a1b, 0xf9c168bc, 0xbf6a4f6c, 0xfb85396a, 0x8e2c41e1, 0x64883920, +- 0x2a79054b, 0xcfa1ef56, 0x7d993bc7, 0xe4c2dabb, 0x62a9daa9, 0x8e8171fd, +- 0x15ef005f, 0xf9e91ca1, 0xeced6d17, 0x5bcf471c, 0xe7e0459a, 0x3fba69a4, +- 0x0fc1111f, 0x704e571f, 0x94e71d5d, 0xad3a2a83, 0x2176739a, 0xd6ceffdc, +- 0x2e1f098d, 0x29f2cc9d, 0xefc2efbd, 0xf2701c21, 0xbef836fb, 0x4f9cb5d0, +- 0xd11693c6, 0x5fc7db46, 0x2e48de24, 0x8c6af7dc, 0x5a633edf, 0xfef127e7, +- 0x44cf76b5, 0x8c445c78, 0x0da4f0eb, 0xae20a7a5, 0x09344c5c, 0x66c4a9f8, +- 0xdcf5876a, 0x9ac4f70d, 0xf273c9ee, 0xe4872b75, 0xe8fde6c4, 0xe249fb71, +- 0x47688de0, 0xc05e2994, 0xf6a70ecb, 0x0d4fd857, 0xdbf2f750, 0xf8cf3de2, +- 0xa0d67e59, 0x57020e8b, 0x74fe50ff, 0xdaae7cc2, 0xd3b01b50, 0x9fd55f79, +- 0x087c0ff5, 0xa78ae5fa, 0xbe807ad2, 0xe97a7377, 0xc077cea5, 0xc6649e5f, +- 0x3a6b9e5f, 0x273ef3e4, 0xf2e89b8b, 0xfd077c06, 0xb78391ec, 0xa41fdbc7, +- 0xf01f7afc, 0x41270eeb, 0x5917fa7b, 0x672059b6, 0x9dfb38fa, 0xe5cdff8c, +- 0xf7cb559a, 0x0412efc1, 0xc6eb64be, 0x31175ec4, 0x6eba2e4f, 0xab783327, +- 0x53e9dad4, 0x29c76f21, 0x3a4e5e63, 0xcb16373f, 0xfc31592f, 0xab5df3a2, +- 0x3adff993, 0xfeec94ff, 0x284b9e33, 0x06fa92f9, 0x376a24b9, 0x2133fcea, +- 0xb37dc110, 0x89d98409, 0x99d9fe66, 0x2e8a7f80, 0xade812a8, 0x9873fc4e, +- 0xbe224ff1, 0xb048fda1, 0xe7f99a0e, 0xe3b72719, 0x25cff212, 0x6569e037, +- 0xeeb7c953, 0x8dfa34ef, 0x72e67cf9, 0xbe7e23b4, 0xef1c67e7, 0x1bda95bb, +- 0x4c6f41f3, 0x2f4178b1, 0xbec8ee50, 0x3bbbc299, 0xb5d7bf49, 0x3bea0f3a, +- 0x7687a624, 0x87a8ad84, 0x3e7d3876, 0xb2658b8c, 0xf24474f3, 0xb6fe40b5, +- 0x8d4d97b7, 0x7efb27bd, 0x39218fce, 0xd804fa32, 0x3e306f45, 0x00a53518, +- 0x5921bc6e, 0x185e98f3, 0x0cd9527e, 0xd0b28fbf, 0x9386f455, 0x74067fbe, +- 0xc753ac07, 0x60b7bc14, 0xf50531d9, 0xdf7babe3, 0x93b8852e, 0x723a179e, +- 0xc5a5dbcf, 0xc67de183, 0xfd736f6f, 0x6531d7aa, 0xe9a5f41e, 0x84d1d85e, +- 0xbdf331e9, 0x47c0e5ae, 0xe6ed1df9, 0x49434efb, 0x933d2e2c, 0x0e9bb2a8, +- 0xf958fd31, 0x885d7083, 0x99d3def9, 0x4fd01b91, 0x5f5de5b8, 0x394f7bfc, +- 0xdfef987f, 0x77c93afc, 0xf95fe61a, 0x985ef342, 0xbad95102, 0xafaa521d, +- 0x579ef766, 0xe93f01e7, 0x147f8872, 0x068fa17f, 0xf5ddee19, 0x11e8f5f2, +- 0x7beec4af, 0xbf705168, 0x7d8497e7, 0x98ebe217, 0x40f4c5cd, 0x6e97cac1, +- 0x55873807, 0x2e800768, 0xf9993bff, 0x1122bfd7, 0xcdd01e5b, 0x3a9c612b, +- 0x2725ab24, 0x88f78e84, 0xce083e54, 0x99e9ed75, 0x5fc60c34, 0x5c39f2e8, +- 0xed486f60, 0x91bbe187, 0x81860a63, 0x5d0e771e, 0x35d603dd, 0x570a6e1d, +- 0x076736d9, 0x175c3a1c, 0x742cbf39, 0x7ab876cd, 0x2f40efb2, 0xdc7c7e35, +- 0xfcebdf06, 0x82fa6a10, 0x5f0c41f1, 0xf0741f00, 0xd4377085, 0xf1a43c75, +- 0xd8ffaf52, 0x97fba17c, 0xf805f25d, 0xc5efee8f, 0x715c4317, 0x73da82f8, +- 0xd9b9e1c3, 0x2c290b9e, 0xfcfccccf, 0xbe114729, 0xe60855ef, 0x76bd9089, +- 0xbe3bbbf6, 0xbf2f8c14, 0xb66361ec, 0x073c747d, 0x5ceb957c, 0xf90e4ca9, +- 0x2343df3d, 0x439fda02, 0x03b8a2a9, 0xa8debced, 0x7f1cbd27, 0xc020b8e4, +- 0x4b985dfd, 0x68760d9c, 0x6bd807a4, 0x2393ad43, 0x1d3b0f20, 0x7ec1b213, +- 0xcb8c702c, 0x32bff983, 0xb05be568, 0xabd2bda4, 0x6aade5e2, 0xeba57d87, +- 0x5bbc03c3, 0x5d5bfc7d, 0xd5ae3f8c, 0xd010f9d8, 0xe870b1eb, 0x099003eb, +- 0x332210e0, 0xa81d972d, 0x142dc3c7, 0x1c02d76f, 0x04fb0f14, 0x43f600d2, +- 0x2b4b4591, 0x67b03b01, 0xdb380244, 0x0391fe9a, 0xe1c9a771, 0x78051fdf, +- 0x5bfbeb27, 0x96fee35e, 0xedd6ded9, 0xd0ffdd21, 0x228925ed, 0xa0abb742, +- 0xa73c047d, 0xbdc0f4f8, 0x45beb0e0, 0xf53e786c, 0x95ea73f1, 0x8967971a, +- 0x9f3263ce, 0x19a44dc7, 0x2e9722e1, 0xe9471e5f, 0x63e39533, 0x491261f2, +- 0x427687ca, 0xfdc014a6, 0x4c902433, 0x15e299c7, 0x7c3127c8, 0x6328d373, +- 0xa426fe1d, 0xd5d3f477, 0x6375e6fb, 0xffce29ac, 0x7ec3cb43, 0x4dfc6e76, +- 0x3c173b3f, 0x90189fa6, 0x951dfd60, 0x7b03cecb, 0x2b0e1e18, 0x23b1d7f1, +- 0x58c79e5c, 0x3ce1f25a, 0xff3dbee4, 0xff7375c4, 0x07be7f9e, 0x53e8e476, +- 0xc63c8112, 0x2786a731, 0x28ebbee3, 0xef4af915, 0x06b3eab7, 0x49cf6107, +- 0x87e87dec, 0x15da3c28, 0xcb0d9f00, 0xfe3cced7, 0xe177f404, 0xf3624498, +- 0x5f154be4, 0x968f887f, 0x0ff17bf2, 0xd29ecc09, 0xfbf10fdb, 0x78b977a8, +- 0x93d28e7c, 0x1ac4c7fb, 0x5429e743, 0x74172513, 0xc9ca75d0, 0x7e5253b2, +- 0xdfc0fa67, 0x7e1f3a27, 0x57749e4b, 0xfb0e7ea5, 0x5eb62ef7, 0xc37f0392, +- 0x35d70cf3, 0xfd8123dc, 0x48a65d7e, 0xaf7198b4, 0x1fa7a957, 0xebd8f713, +- 0x07bfd932, 0x2a627b9e, 0x111e79e4, 0x2aac6531, 0x7cade3bc, 0x718b37a8, +- 0xf19ba7cf, 0x1ef85d7b, 0x887ff809, 0x574dc99b, 0x8ab98fe3, 0x4035c9f2, +- 0xc0ecc277, 0xc8e50142, 0x7bfddf4c, 0xcb47a3fe, 0x4ef8c4e0, 0x1d337f44, +- 0x8c533b5e, 0xd15d21fb, 0x7bb7ccc3, 0x57033ce9, 0xd97aefc0, 0xd77f0048, +- 0x83f583cb, 0xebac4cfe, 0xf4d55afc, 0xf3b00f74, 0xd49d3e74, 0xe8cdf183, +- 0x20f44fdd, 0x997a0ece, 0x19b826f1, 0x75d976fd, 0x633bc4bb, 0x67f47d2a, +- 0xa3210eba, 0xe4334806, 0x587394d9, 0x8a5bbe67, 0xf9e10976, 0x6df5e6ff, +- 0x24c778a6, 0xdd5da750, 0x3a8b7f4b, 0xb9f75bbb, 0x95a91d97, 0x952c1d60, +- 0xc63d3256, 0x1e1d78ed, 0x42ff9d33, 0x44fe11ca, 0xc0f999f0, 0x68aee70c, +- 0xeb86b27e, 0xfb4f7e81, 0x72b9fef4, 0xe8799c6a, 0xd085b8f8, 0xfbaf38f5, +- 0xdb8e71eb, 0x4fe7ffc8, 0xa013fc4e, 0x99bc9135, 0xd76e66e9, 0x0c2947f5, +- 0x00658050, 0xee2193ec, 0xd2879474, 0x60d10a8b, 0x9db7ba5f, 0x379b1a7c, +- 0xe40af93a, 0xf61e15b7, 0x2dbf112c, 0xdf1228bb, 0x93be0eb0, 0x00731f1b, +- 0x6a96eddf, 0xf7f45e1d, 0x5324d5a7, 0xacfc4d3c, 0x073c16f8, 0x102162de, +- 0xfe149b5a, 0x19c400e2, 0xcc128eaa, 0xef0e2f07, 0x3d3e012b, 0x9fa33528, +- 0x908176d5, 0xceec62c7, 0x038d70c6, 0x34c6b2ec, 0x50e99e76, 0x9be4310a, +- 0x7d33711e, 0xdcec78dd, 0xbb4e2d54, 0x79f8cc98, 0xf2d2d13a, 0xd74b3fe9, +- 0x3f00fe51, 0xe30ba7b8, 0xef051324, 0xb76069eb, 0x9feec6dc, 0xf91a6b6c, +- 0xb7851a7a, 0xd414cef5, 0xd71a9333, 0x84a1e3de, 0x0c3d7d08, 0x16cfb79f, +- 0x7be85bbc, 0xeb17aaa5, 0xd172f3a5, 0x4df91bef, 0xa193e98f, 0xfd197afd, +- 0x52e2499e, 0x6755e209, 0xf0028533, 0x2d08f727, 0xf2f7e0ab, 0x38d8d302, +- 0x01e813c4, 0x933be9fe, 0xdfc50c7b, 0xfaf55174, 0x205dfc00, 0x56dff262, +- 0xcfbf3aee, 0xce57db4a, 0x733f3010, 0x049b2792, 0x74a7f862, 0xbaf3829d, +- 0x0c519c39, 0xccbd3d7c, 0xc22c4e78, 0xe519c9ed, 0xdd8c120e, 0x283c1527, +- 0xedec87d7, 0x5cefe2b7, 0xe604c936, 0x0df9cba7, 0xce67df9c, 0x6ef861ea, +- 0xa776611a, 0x7237572e, 0xfb81bbf9, 0xb2f9b7cd, 0x1397e30d, 0x81fd0f66, +- 0x92044fb4, 0x3cb32794, 0xcdeda9a2, 0x2f0edeef, 0x8047bd89, 0x9071bc3e, +- 0x9715efc9, 0xc8be46ae, 0xc780bc14, 0xfb635e29, 0xe74ca34d, 0x6bf24d14, +- 0x20330fd6, 0xacec4a3b, 0x307d7427, 0x219449a3, 0x88a3341e, 0x62ed19e2, +- 0x95dedda3, 0x949918be, 0x525c5f40, 0xa433041f, 0xb0f8be93, 0x8be97bec, +- 0x32dba957, 0x36f5ca8a, 0x21f46f5d, 0x4c6f407d, 0x009feb12, 0xeba36a3e, +- 0x1f0e35a6, 0x1e8eebe9, 0x72a52807, 0x0ce07a8c, 0x749e2fcb, 0x86048b31, +- 0xa201c475, 0x25da847a, 0xd2f638de, 0x619e777e, 0x57aa23ff, 0xb912ec62, +- 0x25db87f0, 0xaa3da893, 0xbd7c0014, 0xc252be11, 0x90a596e2, 0xc3f102c8, +- 0x0e302fcc, 0x7f512554, 0xa7e7d716, 0xffa39e99, 0xe43b5212, 0xe8af6cc3, +- 0x3c09e871, 0x97e6617e, 0x16f23c68, 0x3a42e319, 0x3e02949f, 0x116ffe41, +- 0x2ba09f71, 0x37c7d1be, 0x14c44bf3, 0x5f92ea1f, 0x577ddcb8, 0xe6ed397e, +- 0xa4fea1f1, 0x44f8777f, 0x5f9d0fe7, 0x9bcdebcc, 0xa25138a6, 0xb09fe6f5, +- 0xbc4cf4de, 0x483ebcde, 0x95debd46, 0x992e735d, 0x6e89f9e9, 0x75773b0f, +- 0xd8270ce5, 0x59921335, 0x6ebe817e, 0x1b5de345, 0xdebc9f18, 0x7d824732, +- 0x1fd02aa6, 0xd0741db9, 0x5f3ac5e3, 0x60275b2e, 0xd732747c, 0x2c4dad5f, +- 0x5135585e, 0x8fd1c20c, 0x4f63f092, 0x6fbb3ab0, 0x14efa746, 0xd24527ce, +- 0xff7e093e, 0xe0af26f4, 0xc693b885, 0x35538de3, 0x668de301, 0x44d7b5bd, +- 0x1fbce9f7, 0xbbe0bff0, 0x2084ca9b, 0xfd6693f8, 0xb322fd36, 0x53d93a2f, +- 0xccd89f7c, 0x7326572f, 0xf497d0fd, 0x15da57fd, 0xddbf92a3, 0xefbfd0ae, +- 0xb065ce8a, 0xc0ffa0a6, 0x3b0193ee, 0xdd7ce81e, 0x2dfb0945, 0x49da3649, +- 0xfc14ce17, 0xfe4f7d0a, 0x3a1ef9be, 0x1aba7cf3, 0x17f750bf, 0x8fa0ffb8, +- 0xcec4837b, 0xa7d79bf7, 0xfe23d72e, 0x775e999d, 0xb5e31b24, 0x3d745d3a, +- 0x5cef09dc, 0x5ba2274f, 0xd75a7a57, 0x3d6aff87, 0xafaff7ad, 0x66b8fa23, +- 0x7fc89dfd, 0x9af1f5d4, 0xdb8c16cd, 0xfa7ee78c, 0xfe3f1e78, 0x7ee7b705, +- 0xdffccc99, 0x166d2fb6, 0x32436f58, 0xec0b27db, 0x69fc6273, 0x07665efb, +- 0xbe2a5cd9, 0x6220a0f7, 0x11c1e47c, 0xd4d7d416, 0xf3061a07, 0x19098a96, +- 0xbdbdfb04, 0xbd6f7ed8, 0x7d472914, 0x9c0895ef, 0x8c5d13d3, 0x1fdc1e1f, +- 0x7ffa1db8, 0x968193f0, 0x474f8c1a, 0x1a5ec19a, 0x7ee12059, 0xc5558a59, +- 0x936b7678, 0x6a3bef15, 0xf6bffddb, 0x97cfd0c9, 0xe52e0bc4, 0x746b26c1, +- 0xc7f40abf, 0x0888f124, 0xed6d1cf9, 0x1b03ef04, 0x02522b37, 0xd278d97e, +- 0xfffe035c, 0xc1e58518, 0x6cd4f19b, 0xfbcca75a, 0x2c4d255d, 0xc5c4a5ff, +- 0xed3a5ff3, 0xefe33457, 0x04904f26, 0xbce90d6f, 0xc992f15f, 0xefd8e9df, +- 0xd15fb04a, 0x77d1f4c8, 0x0318afdd, 0xde7ca034, 0xd701cba4, 0xbec1244f, +- 0xed8576c5, 0xcdbfb577, 0x6993d3ed, 0x5d46e371, 0xdeec5fed, 0x7dc1a49b, +- 0xeff9db23, 0xdbdeec6c, 0x13f3534b, 0xd2df9fbf, 0xd8d30c5e, 0x84b37f5e, +- 0xbe3c73f9, 0x9a0b8d1b, 0x90e9cbf1, 0x6b481f68, 0xf5041cf4, 0xe7df7095, +- 0xaae18a82, 0x5d4f8aef, 0x4f1fb66e, 0xb7ef80d2, 0x01a5ef1f, 0xdc79fb1c, +- 0xbcf56bd0, 0xeec2f605, 0x7092e763, 0x54d1583f, 0x53da4ff0, 0xae765e6c, +- 0x2841c992, 0xf610606b, 0xeff0f7ab, 0xbfb527b6, 0xec5a7579, 0xbfdb0e7e, +- 0xd7d9cfd1, 0x47f30428, 0x3f961602, 0x0cdfc662, 0x3b938f0f, 0x2274faf1, +- 0xbc62a9a7, 0x096f503c, 0x3f3057cb, 0xce4c3c97, 0xfdfe2fff, 0x80006684, +- 0x00008000, 0x00088b1f, 0x00000000, 0x5bbdff00, 0xd554780d, 0xdceefe99, +- 0xf26677b9, 0xfc999933, 0x4dc2fe10, 0x00908102, 0x7e100843, 0x502021d4, +- 0x4540647e, 0x043abaec, 0xa1bf9085, 0x56d3ebb1, 0x4126e1f7, 0x27d3e08a, +- 0x6796dd6d, 0x57067db5, 0x3b1254b6, 0x770704c1, 0x08a00ec2, 0x80a0db54, +- 0x11dae3c2, 0x2486a229, 0xec56bb0d, 0x3befdd6e, 0x6664dce7, 0xecfa5c18, +- 0xf8728376, 0x9cf739ee, 0xfbdf7cef, 0xb3739dfd, 0x330001d3, 0x68776e01, +- 0xdb00d900, 0x8c802f64, 0xde0820cf, 0x16e91bf4, 0xd305d609, 0x7ae77688, +- 0xa9dfe0a7, 0xce1a6ba6, 0x2cb0ef91, 0x7a448f35, 0x42d1e986, 0xc639e7a4, +- 0x699e7a72, 0xf806e286, 0xba5bc867, 0xcfc00e68, 0x03875e9c, 0xd257e9d7, +- 0x00194876, 0x65049366, 0x528ed859, 0xec373803, 0x65ac0152, 0x3c1daeb8, +- 0xaa40174e, 0xd21b7405, 0x54fb360d, 0x1e95f1a0, 0xd11a4b6d, 0x87c43d00, +- 0xa5039a39, 0xd336bed8, 0xbe00b304, 0xadc1fb4d, 0x1ef8aaa4, 0xc5a8ffbe, +- 0xfb81ce37, 0xec46b7ab, 0x1ff6015a, 0xa40473ba, 0x6c1d7ed1, 0xcf2f25bf, +- 0xc60285cb, 0x33ffe157, 0xf8c9655f, 0x75f0a6da, 0x2c940f7a, 0x64bf5c04, +- 0x1a5f8a1c, 0x59994fd6, 0x416dcf63, 0xf49f3d00, 0x9095c9e0, 0xeeaa716e, +- 0xce34f99d, 0xb6f267d0, 0x21fd4145, 0x69aa725f, 0xce51e90b, 0xc0e96d30, +- 0x89874ef6, 0xac58bfcd, 0xb7903003, 0x8e0df51a, 0x5335bc81, 0x96fa4d38, +- 0x4881b2e5, 0x9b7f5239, 0x871e7eee, 0x0f8198c2, 0xddfa471e, 0x3bdc4a07, +- 0xc290be91, 0x502eb1e5, 0x7a4512d0, 0x363025ba, 0x9d397c82, 0xf7c92f3e, +- 0x04c0969b, 0x2db4a786, 0xe4bf34e9, 0xca0ef801, 0x3d104243, 0xf16efb80, +- 0x0216a680, 0x1ce7808c, 0x90004b97, 0x332af82b, 0x2560bad9, 0x8737deb9, +- 0x1758d5cb, 0x1c856865, 0x3f82a7e4, 0xf5c0f837, 0xc1beb47d, 0x301f10cf, +- 0x153971c6, 0x4857cfd8, 0xd33cd1f7, 0x0a321e50, 0xfff3d705, 0xa0b014de, +- 0x3ff8fdfc, 0x325f2fd1, 0xc9897405, 0x2cfd6d3d, 0x33ad88f6, 0x9966ade7, +- 0x9fe3ab31, 0xecd44c59, 0xbb543ca7, 0xf748ec02, 0xad462f98, 0x37f61d62, +- 0x9cf91c6e, 0x7d9fde27, 0x8d30b7c2, 0xc7e2f7da, 0xffa783cd, 0x15fbe320, +- 0xe5019010, 0xd09a2732, 0x31fe5a1f, 0x4aef3fcd, 0x77bff3fc, 0x7db167a4, +- 0x5f51828d, 0x77227db1, 0x95a35eb8, 0x66f837af, 0xd3e10641, 0xa2d9466c, +- 0x864d55fc, 0xa2bf6c0a, 0x3a003b9f, 0x0b38e2b7, 0x56adc1c0, 0xe3394ed6, +- 0x84eb40d8, 0x269022b6, 0x35babc02, 0x1d86b597, 0x0f03394d, 0x7598d4c1, +- 0x390dde04, 0xe5c7be0e, 0xe93a3d38, 0x5691f3a7, 0xd010284e, 0x5730e586, +- 0x5d106bc8, 0xf079e906, 0x475b9a4a, 0xbbc9d67a, 0x4b4fb265, 0x98b409ae, +- 0x14b4d9fd, 0xd30d26d0, 0x715c93a9, 0xb8f42cb4, 0x9e7f66cd, 0xf4f742e1, +- 0x333ae2e4, 0xeee93ac4, 0x41f37151, 0xe8c4ff00, 0xe2d755f3, 0x67ee1213, +- 0x0af55a46, 0x454657da, 0xe5fcdc41, 0xbbcbc66f, 0x091ebc0c, 0x8fbf765f, +- 0xb3fbe3fc, 0xcc7f60ce, 0x2b488af8, 0xfbc547c3, 0x5ee7cff1, 0x6f3ba78a, +- 0xc99bb7a6, 0x74fea613, 0x2e5fd67e, 0x5e27a74f, 0xe34b999e, 0x8ded99e5, +- 0x7588e797, 0xe91af2f1, 0xe8c7978b, 0xfd71c9ea, 0xc594b763, 0x33bee3d1, +- 0xbe7c6e37, 0x1747195e, 0x371658ee, 0x9aeb427e, 0xeee27a38, 0x2f8dc66f, +- 0xf5c5540e, 0xf9abec97, 0x253ff48b, 0x9e3718d8, 0x1afa6cc4, 0x7d0b4ffd, +- 0xbfbd6e2f, 0x9dfffe96, 0xcf7e8ff4, 0x7a44bfd0, 0x42fa499f, 0x1c36593f, +- 0x06b89c9f, 0xf8674bf9, 0xda12eb8d, 0xe9a95ea5, 0x0cbebcc4, 0xf7d82ddc, +- 0xc895ec8c, 0x51468dbf, 0x6c6fd09b, 0xf9354133, 0x4c981ffd, 0x86d3790f, +- 0x94e4dced, 0xaacffcd8, 0x14b8a660, 0xe94d6e3b, 0x4da338f0, 0x78d89a77, +- 0xd37edfc3, 0xd144b5a2, 0xb9974e9f, 0x9b3f453f, 0x707f44ee, 0x21427a41, +- 0xe964a937, 0xc594af8a, 0xd8bc879d, 0x6a4b213a, 0xd86336c4, 0xa15f6bbf, +- 0x81a82e52, 0xfe213fbd, 0xbdeec94f, 0x486fffc8, 0x17492320, 0xef3f166e, +- 0xa696fc37, 0xf8633865, 0xe2334c1a, 0xf14196ad, 0x42e1f073, 0x3fced7e6, +- 0xf50b4e88, 0xfbe55e7f, 0x115fc631, 0xe153ed7e, 0x9fc97ad7, 0xabfb8659, +- 0x5d38fcf7, 0x4fce79c3, 0x18c1a582, 0x390b1539, 0x2c1c1981, 0x3ae3ccee, +- 0x4bb350bb, 0xdff388d9, 0xa16c2ef7, 0x13fbee75, 0x6f7d896c, 0xfe6153b6, +- 0x6653b671, 0x726c5aed, 0x316bce51, 0x18cb39a6, 0x5db0911d, 0xb2140275, +- 0x7cbed5cb, 0x0ef28485, 0xe176cfb8, 0xd1480b92, 0xe03ddef8, 0x9fffc855, +- 0x9d3eb07b, 0xf3cd0dc6, 0x117713c6, 0xa2a2d73e, 0xd7792f29, 0xe8392ba9, +- 0x936e060f, 0x75c49c58, 0xfbdcf4ac, 0x2927e8c0, 0xdf039cbe, 0xafa8b3d5, +- 0xf366e035, 0x7222f319, 0x05ccfce3, 0x38992215, 0x12c17e8f, 0x347c8bd8, +- 0xfa825e52, 0xc11eec69, 0xcd7f5fe2, 0x827fdb1f, 0x1d1a1ee3, 0xfaf14b1d, +- 0x8a9fcd42, 0xeff7cf48, 0x7d434196, 0x77c5377e, 0x90c0e117, 0xaf87f9c3, +- 0xc63f53a5, 0xd867a65d, 0x65ef716f, 0xdecfdbf2, 0x73adc633, 0xde9bb82e, +- 0xd0140a83, 0x67f11b9c, 0x496814b4, 0xe06a352e, 0x3e43dfe7, 0xe6c294e1, +- 0x59b2f033, 0x5f31a5e0, 0x978b111b, 0xbc21f4c6, 0x71ab7cb0, 0xa6ecccaf, +- 0x0016dbb1, 0x8159cb94, 0xebfeff3b, 0x234f7d2f, 0x1f3de782, 0xc4346e21, +- 0x3711efc9, 0x8fbdc61a, 0x3f443711, 0x886b7b2a, 0xfe9e8fdf, 0x79a3eec8, +- 0xbe35b9ef, 0x7381a5fb, 0x3df2437f, 0x083ef1c9, 0x5f98e783, 0x28d62cef, +- 0xf0785baf, 0xebca39fa, 0x9a2d3a1a, 0xceabe905, 0x6967f1e8, 0x680921fc, +- 0xc6c4437c, 0xa743559c, 0x7f61b014, 0xfb63a84d, 0xda6ba468, 0xd8539756, +- 0x7221dbf0, 0x901ff507, 0x7fd8cd02, 0x7b5eab79, 0xf0b87509, 0x6997ebd5, +- 0xf957bede, 0xeab657bc, 0x9013cc1b, 0x03feb03e, 0xd3aeaf9a, 0x6fd43602, +- 0x8ea2339f, 0xa43af5a6, 0x1d57ad20, 0xf34aa1fc, 0x7ab0bf57, 0xb539a53c, +- 0xc6aa9afb, 0xbebff8c7, 0x0d55a783, 0xf9dd54e5, 0x5c62c5c3, 0x015f0f39, +- 0xfec63766, 0x369a0737, 0x2ee36398, 0x7b275bfe, 0x2df77e12, 0xe175ff21, +- 0x271216c2, 0x67ae95fa, 0x7657e625, 0xb872bf33, 0x85fedffd, 0x8bf43bd6, +- 0x281b8409, 0x837935bf, 0xb1716757, 0x5703ac41, 0x9ea951de, 0x2e54e869, +- 0x7c65e7c7, 0x77a735fc, 0xf92673af, 0x85b49855, 0x79f13bd5, 0x25940ee2, +- 0x7e7ae1e5, 0x390fb30a, 0x8f5d406d, 0x069f7cfc, 0xc7663f20, 0xf4855a80, +- 0x5718970e, 0xcdec0d60, 0x3ebf91bf, 0x67ad99a7, 0xac5f002d, 0xcfda30df, +- 0x82b1ff44, 0xd528d54f, 0x9515da17, 0xf910db70, 0x7f90d544, 0xc5c3e87f, +- 0x7def249e, 0x6295fc22, 0x29ef56f2, 0x468fb61f, 0x714a39a9, 0x44d0f1aa, +- 0xd67a674d, 0x2ebf8ca3, 0x58fb469b, 0x5993f078, 0x3ef998d1, 0x578c7c43, +- 0x5f86e986, 0x2155387d, 0xe1fcbdb9, 0xcc7a7354, 0xaad2723e, 0xe0f94903, +- 0xbb49e2f1, 0x5bad0af7, 0x35a2d07f, 0xdcdb7c33, 0x3877c211, 0x44668dd5, +- 0xcb9b56f8, 0x3f7df163, 0x2c21bbe3, 0xd0e911bb, 0x6bed5a10, 0xddd3e362, +- 0xb43906a4, 0xc99c2740, 0x23c32f0e, 0x37ae27fc, 0xfe30e28b, 0x756a3fa0, +- 0x78477efa, 0x55e9a731, 0xdaf898e6, 0x35e68a60, 0x5f3fa44b, 0xfb1882eb, +- 0xad74d393, 0x99e48b39, 0x61b596e9, 0xae2629fd, 0x6a2d3e97, 0xdb1c5177, +- 0xbd91f38a, 0x93b13e44, 0x3687b7fc, 0x3beec958, 0x47ae0e9c, 0x481cd755, +- 0x877a09b7, 0xbb26adea, 0xc29391da, 0x2e31b5eb, 0x09ffef86, 0xaf647daf, +- 0x3e028eb8, 0x09f77f56, 0x058df5bc, 0xf7297fe6, 0x94c99c23, 0x199215ef, +- 0xce341cf9, 0xbdaa6a1f, 0x87976b14, 0x7f1373ee, 0x1f7f0a4a, 0x135e3872, +- 0x7175cdd7, 0xaa693d9c, 0x13105d6a, 0xe5c71387, 0xc399b8d0, 0xceb30072, +- 0x697001ce, 0xfefc324f, 0x776959c2, 0xde5dfe91, 0xcd87e449, 0x51e118c4, +- 0x81f29353, 0xd95cb3e3, 0x2e4de3c3, 0x554f5b07, 0xeb920e7c, 0xad39397f, +- 0x67265ea8, 0xec8d6c34, 0x057f6878, 0x9b3b526a, 0x91def82e, 0xc4f7af1f, +- 0x38c4d371, 0x56e7a4c5, 0x65879f11, 0xdafd3766, 0x31bfd300, 0x9d723fae, +- 0xed7c3feb, 0x79d90f2e, 0xcf865afe, 0x5c597f4f, 0xbbccc726, 0x853959ce, +- 0x12e793f6, 0x5cf45078, 0x2ba47be2, 0x733f1f7e, 0x62b8677a, 0x4c601fce, +- 0x04e12dd6, 0x16e07d44, 0x83eb0ef1, 0xb57c6649, 0xe4dc521f, 0x1e443bdf, +- 0xc32f066c, 0x35b82a49, 0xe07af756, 0x7f70f3d7, 0xb04c472d, 0x1d3b4913, +- 0xf3628c72, 0x04d8b079, 0x8a326cbb, 0x4b158f08, 0x323212bd, 0x9ae25fec, +- 0xc86d8df6, 0x65d021ef, 0xd7c73f5e, 0x3c91e0c1, 0xfbfd6c52, 0xd5adcd5a, +- 0x5af9cfbf, 0xeb13cec8, 0xd31139df, 0x16e3357a, 0x96d7e0ea, 0x1f83ad25, +- 0x53d7c574, 0xc634bb0f, 0xc712705c, 0x12923061, 0x3028e7e0, 0x845c7083, +- 0xedfa84e1, 0xa555bc39, 0x275649be, 0xf4d733c6, 0x418c76a7, 0xe5cf1b3b, +- 0xfd0b7440, 0x8df3ca3b, 0xb5fabaa1, 0x44ff2cc9, 0x7ab3247f, 0x497821d2, +- 0xe6395fd0, 0x7118bc49, 0x91e5d5c7, 0xc9da5fe3, 0xb4bbb6ff, 0x067e92df, +- 0x7940ca4e, 0x551ccd9c, 0xebec499d, 0x98b3e520, 0xe2e4bc8f, 0x921ad67e, +- 0xdf5c013c, 0xe28079aa, 0x98e1cdbc, 0x59d8c72e, 0x85c78b95, 0xf217e3fa, +- 0xaf23cc54, 0x97b4de9a, 0x5d75fce2, 0xcc74ec07, 0xedfe7b53, 0xb4147459, +- 0x4edbecc8, 0xb4a9fb76, 0xf94ac8a7, 0x54c08ee1, 0x52304f92, 0x77714190, +- 0x7374198a, 0xf8fc8dd9, 0x50a6e377, 0x33bb0d86, 0x3c253b59, 0xa7e51363, +- 0x2fdf08fe, 0x0ba0a1ad, 0x8c490e2c, 0xb8b50bee, 0xbfff3e68, 0x3f228f76, +- 0x9f9b3fb5, 0x45f8be2f, 0x0cdf7f09, 0xacff1a66, 0x1ef029cb, 0xd479d130, +- 0xd58e717e, 0xc6cc85f7, 0x094feb19, 0x881d902d, 0xeb48d283, 0x164e7651, +- 0xca7cb0b6, 0x797002f6, 0xa3cf3184, 0x4bc39cf3, 0xbf51e280, 0xf612dc13, +- 0xb00ca7b7, 0xdba067fc, 0x912f3da2, 0xec815adc, 0x75e55dbd, 0xf602314b, +- 0x73f0da40, 0xf85b3d63, 0x44e674a7, 0xfc50f0b8, 0xe15b99b3, 0x7958b4b6, +- 0x877933a7, 0xa6c80f29, 0x34a62275, 0x77d1cfca, 0x1af8cf3e, 0xbad813e6, +- 0xccc59f06, 0x03abb7cf, 0x62cf1f97, 0x0708397c, 0x84f9c0c5, 0xfc8d44f0, +- 0x61e1cd9c, 0x3439b0fb, 0xc8dd2eb7, 0x262a7f97, 0x3f3f6860, 0x7b218668, +- 0xa7f6fb26, 0xb456d30c, 0x8e02f685, 0x3c37d06b, 0x0c7e68b5, 0x62a68e4d, +- 0xaed3fdf8, 0x1b6d4f8d, 0x748dcec3, 0x8a9ff519, 0xf68bba6d, 0xbd0aedc9, +- 0x8cbb27a7, 0x728dc1cb, 0xfef2b54a, 0xf388f1a1, 0xf8d3a234, 0x91c5b738, +- 0xd99f2cba, 0x18bd900b, 0xa5b7d9f9, 0x503be5c8, 0xf43fbdb5, 0xbee29466, +- 0x1f474d7a, 0x9f71c36b, 0x45160fad, 0x7d50fea8, 0x5f3e13ef, 0xd76abf79, +- 0xedbbf214, 0xf9057b8a, 0x23fea89f, 0xa8bf0796, 0xec633b68, 0xe40cc60e, +- 0xd7137e10, 0xfe6f9ff1, 0xfdb9e511, 0xaacd2487, 0xc81dff91, 0xc21bbe23, +- 0xd7e4ab1f, 0x643e87fd, 0x9913ed79, 0x5eb42bbe, 0x2169a845, 0xb40e75c9, +- 0x2edf90b6, 0x3041f911, 0xc193fb97, 0x37cf4533, 0x9ec1e8c5, 0x0edc7129, +- 0x9c51c6f8, 0x3d7b0b0a, 0xb627f54c, 0x2fee475d, 0x44bbf9a4, 0xd7bc6c7d, +- 0x93474704, 0x35e19bdc, 0x9dc50ed6, 0xe1297980, 0xf59ce4ac, 0x78cc4f21, +- 0xbf3f266b, 0x02f58ab5, 0x133fbe99, 0x2e47b5bf, 0xe7da76aa, 0xd51e60a5, +- 0x93ac4195, 0xc8fc491d, 0xd826fd90, 0xa03cdf93, 0x15ff78d2, 0xf5057e60, +- 0xf5032dbd, 0x685cffb7, 0xde7c7af2, 0xa0c93a85, 0xaf3ce17c, 0xef14bb13, +- 0x74df1a68, 0xe4a9f3f6, 0xa82806c7, 0x779f7fe1, 0xb9238ed7, 0x532bfe21, +- 0x803acec8, 0x4ec335f9, 0xf14ec94b, 0x7fc252fd, 0xccc5d139, 0x3dabb72f, +- 0x765d98cb, 0x12ec8099, 0x01eccff1, 0xb8a0eff1, 0x7b40ea5c, 0x644fef60, +- 0x63dede76, 0x167cb0f2, 0x4604fafd, 0x744dde57, 0x0722cf7b, 0xe21373b3, +- 0x35ec8cb9, 0x13cd9472, 0xa634a004, 0xec6f025c, 0xcb954139, 0xf86cf0ce, +- 0x7ec22dcb, 0x0cb49383, 0x5523ee37, 0x23ece396, 0x5a725e26, 0x7fc7d3c4, +- 0x9ea793fc, 0xa78f4f99, 0x10e138f3, 0xce9b5271, 0x22a3fefc, 0x3ebe3556, +- 0xe51b5577, 0xacc96fe5, 0xa738b0ff, 0x1c9c0888, 0x1414e715, 0xcfd43437, +- 0x75fce26b, 0xf41ed226, 0x5b3cb3a3, 0x556e5216, 0x18f5b4b1, 0xc1bd73b5, +- 0xce329485, 0x4c73d75f, 0x425e66e1, 0xfa3cebf8, 0xf933128d, 0xcebcf3bd, +- 0xe072fceb, 0x0e511783, 0xf9461d8f, 0xb8538927, 0xcc3f861d, 0xee4346b3, +- 0x92fdfd8d, 0xf97e47e1, 0xfa43aa0d, 0x1a61e53a, 0x020363e3, 0x9955e89b, +- 0x474a78bf, 0xf4c83ec6, 0x7944c9ac, 0x35bed9ca, 0x9cef9499, 0xcc8732fe, +- 0x45ccebb2, 0xaa773f56, 0x4fc2129e, 0x9c960167, 0x7b7a7049, 0x51f4c2a6, +- 0x673f896e, 0x84c7da31, 0xb0e9141d, 0xb1f5624b, 0xfd5008ec, 0x547b29dc, +- 0x80ae83cc, 0xf91e76be, 0xf81e711b, 0x0f1f8808, 0x6cfd41fe, 0x9423e414, +- 0xdadc60b7, 0x77128cf8, 0x2de4673e, 0xb07bc675, 0xdaf844c5, 0x1fe09614, +- 0xcfd51651, 0xa3af8fc5, 0xd9e705bc, 0x7c73da1c, 0xe6b5ea34, 0xca7e8485, +- 0x79b9d85b, 0x75a3d590, 0xfe5c4a6d, 0x38a658f2, 0x42842c0f, 0x57105fca, +- 0x66284fcc, 0x1c416138, 0x6df6c84f, 0x6fdf3b20, 0xff42f2e2, 0x0373ecca, +- 0xb79f15e1, 0x34bf7257, 0xcc021570, 0x8f05f67e, 0xb9df91d9, 0x5a6ef96d, +- 0xf799ae63, 0xf3e50dcf, 0x40730d7b, 0xa90a8d5e, 0xb316f8f0, 0x9cf75afc, +- 0x54b945c9, 0x0e097f0b, 0x59b5fe7e, 0xe45abeec, 0x4a039b77, 0x2fcefcd2, +- 0x4081cdc6, 0x69bbad0b, 0x47cec49f, 0x8fc5f76b, 0xd5390bf7, 0x9c7d3eed, +- 0x83eafd8e, 0x4e42fd09, 0xf3fc50fe, 0x78727c03, 0x1e5390d6, 0xf373b1e4, +- 0x6756b713, 0x7cf0a67d, 0x8f316de3, 0x38161fd1, 0x906dc06a, 0x7202eb7e, +- 0x2d547080, 0xf79e76e9, 0xdc7ada42, 0x060306df, 0xb941fe1a, 0xb4e42c3c, +- 0xed87e041, 0x7fafdf1f, 0xbdd00a4e, 0xc74fc3d3, 0x5e035ff3, 0xdf3e3475, +- 0x952df9d8, 0xf112f5ce, 0xb0a6dd56, 0xc846b7fc, 0x355f1127, 0x5569f843, +- 0xe225be29, 0xdd27c1ab, 0xb79e7f84, 0x37f96fff, 0xa6235cf4, 0xec2255a9, +- 0x1ff6a89c, 0xddaeb724, 0xfb435f7c, 0x4bfbfb11, 0xd0de75f7, 0xcc9864f7, +- 0xf334bdf4, 0xf8a5eb16, 0xe543bb7c, 0xe6683376, 0x9e06cae7, 0x2c5fdf12, +- 0xbb25f5f2, 0x357ade79, 0xe74ecd74, 0x833dfdc4, 0x69ad6076, 0xa247c529, +- 0xa5f8c7c7, 0x5d79324f, 0xa3f73dbd, 0xbf3e501f, 0x637143a4, 0x637507a6, +- 0xf1c52f15, 0xe7afb1ba, 0x2bad8f8c, 0x1d25f8c5, 0xe8db348f, 0x9297e23c, +- 0x3fb2cc9b, 0x894777fc, 0xf724dbd6, 0x78ff7c04, 0xe66fe0cf, 0x53725e91, +- 0xfe7cd167, 0xda4b3bee, 0xfcfe3e91, 0xfd6c770c, 0xf7c5dc79, 0xc2ac64b7, +- 0xa8ef6ae2, 0x415a7fd4, 0x3d9e85e7, 0x5f7bbecc, 0xfb25597d, 0x20976fef, +- 0x9e3a1717, 0x1d25ec7b, 0xf07bdde5, 0xfac94ab4, 0x6ad3cec2, 0x85f26bf4, +- 0x458e58ab, 0xab6a79d8, 0xb78f754a, 0x946af7eb, 0x3e17a7f2, 0x3554e764, +- 0x3e53e794, 0xd01c9cf6, 0xbac79ff0, 0x4f09515f, 0x8c126d0d, 0x57ed8fc8, +- 0x41f93f58, 0xe36e3fa2, 0x69c0d4fe, 0x81a5c095, 0x55b70353, 0xd86cffc2, +- 0x86971c91, 0x9e08da9f, 0xbe70a3ed, 0xabd6da47, 0xd23d0794, 0x137e3f1a, +- 0x68d399d5, 0xa6e5c73c, 0x9bfdf1dd, 0x33a8f087, 0xefe89d3f, 0x1e04b24a, +- 0xf098a18b, 0x1aa91838, 0x7fdc4667, 0x1c66ba7e, 0x7947b924, 0x2377c453, +- 0xbe4cdebe, 0x2a6ba17d, 0x18ff45c5, 0xfe17d585, 0xc6a1ff31, 0x166665e2, +- 0xf0e2cbc7, 0x569e981f, 0xa22c8f84, 0xaf8256f5, 0x32bce48e, 0x7ca0ea9c, +- 0xdb944579, 0x25b0b2f1, 0x3f889010, 0x2b878b13, 0x708db821, 0xc2d87fd0, +- 0x955f29cf, 0xc204de58, 0x72126dbf, 0xbce424df, 0xd1b1eb09, 0xa883ddf4, +- 0xdd441bc7, 0x9ed279bd, 0x340254e3, 0x93bafe88, 0xe724ecc7, 0xcffdc065, +- 0x3ff720b2, 0x788cfe86, 0x18f76892, 0xfd241ea9, 0x402d86d7, 0x172c33df, +- 0x1b7967fe, 0x46e91ffa, 0x323fd03f, 0xef47e195, 0xc6277ce2, 0xf8ce86cf, +- 0x78b20bf1, 0xf2283a3e, 0x712caae0, 0xb6f4203e, 0x4b520062, 0x9a65be71, +- 0xb7b00eec, 0xfeb4cc7a, 0x4788a989, 0x5684ff9c, 0xa24be198, 0x8dfda34f, +- 0x7a0defc8, 0xe18b9d15, 0x35a3a0f8, 0x7f7eb62d, 0xebd78b2b, 0x9d647335, +- 0xef5310f4, 0x4fcb2aac, 0x377cef5a, 0x31bfc70b, 0xd3d3c366, 0xcf1deb63, +- 0xe3c2229e, 0xbc7f73f7, 0xf157be82, 0xd2ff71b7, 0x66f38157, 0x2c0efe50, +- 0x59b7f61f, 0xf8975402, 0x37544f11, 0x90bc212c, 0x3ba586bd, 0x2f582f09, +- 0xaff3493c, 0xdc3b2ba6, 0xc610eaff, 0xf57e9c69, 0xfc303fa2, 0xf7cf1c9d, +- 0x911b728d, 0xea307eac, 0x782f8686, 0x6f3c6a7e, 0xfd594730, 0x189610d0, +- 0x5e8f3b7e, 0x7e47cbcf, 0x98ffbbfb, 0x50db1eb7, 0x9db38f16, 0xf48bc195, +- 0xede7c91d, 0xe879a4d6, 0xb6971f90, 0x50697b31, 0x3f2c39a2, 0xe0f98439, +- 0xde37ac6c, 0x1bd594fe, 0x0f6d479d, 0xcab43cb1, 0x35f1ce37, 0x66826a7a, +- 0xc336cf96, 0x9e52d636, 0x6dff9b13, 0x52eff072, 0x48388a36, 0xeb8813f4, +- 0xf6f6388d, 0x83fd1bb2, 0x05ea6fe1, 0xbe8337ae, 0xa3749e7d, 0x7617a89f, +- 0x67ba5b53, 0x8968a53b, 0xb0bd5079, 0x59fccc27, 0x83cc4bdc, 0x6bc04ade, +- 0x2c29dbd3, 0x293fedcf, 0x184ce83b, 0x51f3fbe5, 0x7e61ef94, 0x1ce4905f, +- 0xcf8153f4, 0xd9ff715e, 0xf9332154, 0xd6f0e699, 0x8e509bc8, 0xa7fd370c, +- 0x275402d3, 0xa57e1c94, 0xbb507080, 0xdac5c70f, 0xc7d1ea1f, 0xf00a0fbe, +- 0x2a60a573, 0xfa31d3bb, 0x657e1ff7, 0xe9ade132, 0xb88b2fed, 0xa917ae7e, +- 0xcfe73759, 0xd7892568, 0xd78926bf, 0xa8e65dbf, 0xff2eea9d, 0x881bd921, +- 0xefa1abd1, 0xc08e040f, 0x8bfcebcc, 0x9ba31a59, 0xa61f1cc2, 0xfae2de6e, +- 0x8f39f96b, 0xa1bfd6c2, 0xf37112bf, 0x880ef135, 0x5f80c42f, 0xf3f86019, +- 0x7e31369f, 0x7307a7fc, 0x4ebee362, 0xff208ef3, 0xcc0754d7, 0xf902a49f, +- 0x3a67f45d, 0xdfcbcbd5, 0xea7cb1b3, 0x15aec178, 0xc8157fcc, 0xb1ebfe40, +- 0xc6266bb7, 0x598d8bc6, 0x254c3f32, 0x1652e439, 0x5f5f0cf3, 0xd619a1c8, +- 0x8e027388, 0xb9338fe7, 0xeafac15f, 0x89cf64cf, 0xe6add5f5, 0x16dd4dc5, +- 0xff6473a0, 0xcefb0b05, 0x4deef3e4, 0x2f877eac, 0xdfc9137c, 0x8d37cf80, +- 0x6f0ec7da, 0x3fcf489a, 0x1a79bc3f, 0x9a94f73b, 0x4e99e2e3, 0xbe52e5fc, +- 0xc3473674, 0xb3eefafe, 0xfab8bbec, 0x4ff1856e, 0xcb3c6c74, 0xefe7e6c8, +- 0xec6c47fd, 0x0282437c, 0x1f18038e, 0xe75d6f37, 0xa8bf2ceb, 0x589ec90b, +- 0x8def183c, 0xb171e6cb, 0x20e05b30, 0x9e987928, 0x175b783b, 0x53f1997a, +- 0x1e9904ab, 0xde14da9b, 0xcc5bcedf, 0x3a1f193b, 0xbfe274b8, 0xf9bfce83, +- 0xe73b08bd, 0x3ecc91c0, 0x07152706, 0x6bfd2276, 0x1d72847a, 0x3f80980c, +- 0xe4fbb0b7, 0x19851396, 0x13c1fb84, 0x8b25672f, 0x3dd26f1b, 0x54e5420a, +- 0x1243af3e, 0xf3652ffb, 0xe75387f3, 0xb53b3fb9, 0x993137c0, 0x92a1d35f, +- 0x9092e9d7, 0x34b2a777, 0x45dc7dd9, 0x31bedf31, 0x4fda29fa, 0xdd8d876f, +- 0xf93af5c7, 0x03c2ea79, 0x1499cd27, 0x99a53b7f, 0x276a4714, 0xbe88bbbd, +- 0x9cba4003, 0xe46d5afc, 0xac77bb10, 0xec58eb6f, 0x4747c249, 0x32dfc736, +- 0xe67df935, 0x3bff44b7, 0x7516cee0, 0xae132ed4, 0xc50acef7, 0x1de593b1, +- 0xe891b49e, 0x7e12ef87, 0x0a95eef8, 0x01de53cb, 0x16f7e14d, 0x95617efc, +- 0x0977b3f0, 0x22aabcff, 0x57be3fb9, 0x39fab3cc, 0x17ee9278, 0xc7e27b56, +- 0xbdf22bdd, 0xf361e035, 0xa134bddf, 0xf77de45f, 0xc1f2137a, 0x8b87e16c, +- 0x70fc88a0, 0xe903e310, 0xc6d8b1bd, 0x29f2ece2, 0x09e69213, 0xd2ffd1c7, +- 0xc42703f7, 0xfe860477, 0x65df8a9b, 0x91d4ebf1, 0x99392ff3, 0x4141b6ff, +- 0xe1b1fb92, 0xfdd865f8, 0xe2ef5c3d, 0xc1dea1be, 0x7ff43479, 0xd8a32b15, +- 0xff432d73, 0x7f73674f, 0xb6cfbb59, 0xb0bef625, 0xa38ce83e, 0x5b91a1fd, +- 0xfbf8c52e, 0x8c73815a, 0x73d8e601, 0xdf641790, 0xf4d9d9d3, 0xcb2f6b3d, +- 0x2c0771af, 0xf2bee17e, 0x2cf2bec4, 0xeae97131, 0x7149f5c8, 0x973fbc3c, +- 0x167ffdce, 0x5b148f6b, 0x07d5fd98, 0x6bdd00a5, 0x3db847d5, 0xb123dfd6, +- 0xcea2c273, 0x857bec23, 0xb7248bb5, 0x33b1bb87, 0xa3819fc4, 0xcf1e5655, +- 0xc90cbc0d, 0xfa88e04b, 0x25dfbe29, 0x9e227be2, 0x62cf4226, 0x8f3eff9a, +- 0xecefa6e4, 0x75a38a6e, 0x30a75fd3, 0x211c3374, 0x9bf2152e, 0x24fa7889, +- 0xf249d7db, 0xed71fac3, 0x54ff9c14, 0x8479c7f1, 0xd89b869f, 0x1d856fd1, +- 0x4fd34bed, 0x3baffc51, 0x0fd5ee20, 0x24a28714, 0xf2c01397, 0xcf675ec0, +- 0x1f9e46f6, 0xfaf57bb3, 0x0f7d8d88, 0x754e1f58, 0x6cee88db, 0x754c994a, +- 0xa7765864, 0xf3a2bd22, 0xdfaa22f4, 0xeff39457, 0x01d41a3c, 0x3ab68796, +- 0xbf89277d, 0xb8a6ee95, 0xcf8374fb, 0xd13de19b, 0xe1245dcf, 0xfcf5ff64, +- 0x972145cf, 0x72d793c6, 0x9d7e1326, 0x5365dfbe, 0x45fd793c, 0xfcf6ae95, +- 0x9c595f93, 0x8d38d1a9, 0x76d95b8d, 0xe31d1b64, 0xcf4ffc1a, 0x4efe3076, +- 0x2c318129, 0xb5bd2cbf, 0x0e9a4bef, 0xf29531bd, 0x2723bee9, 0x3831aaa7, +- 0x7f446def, 0x4d7f449d, 0x6bf61260, 0xad24ad66, 0xb70ef911, 0xb1f77f67, +- 0xe85f3a1c, 0xa52e3b25, 0xe29dacf6, 0x3bc77d64, 0x779409f6, 0x98d6f174, +- 0x66586aef, 0x2d1cc0e3, 0x963d37ba, 0x7f1927bf, 0x1e7c8357, 0xddd16880, +- 0x5bfb6253, 0x40fdaffe, 0x03f30e7a, 0x603f38d1, 0x7bab09c8, 0x8799d59d, +- 0x9e9eec2d, 0xbf625bee, 0xe1ce2acf, 0x1636697e, 0x73af643d, 0x90b99ee8, +- 0x3c333352, 0x2219b440, 0x07dd1766, 0xddfe6447, 0xe7e618da, 0x67f58967, +- 0xe847239b, 0xe239cdbb, 0xf42e727e, 0xc3b771b0, 0xe03d6b00, 0x095b5330, +- 0x5856d66e, 0x6ca9cb23, 0x65060d2f, 0xc7247fd2, 0xe56cbcec, 0x4c90f2bf, +- 0x3372c3df, 0x1e4365c3, 0xf163dd32, 0xf712ffef, 0xf1c39953, 0xfdc3db38, +- 0xf416a50f, 0x040566dd, 0x6df9fdd9, 0xe8f71510, 0x0f31f7c9, 0x37ba37eb, +- 0x99d30dbb, 0x008f2614, 0xf69f3f1b, 0x4fdb2723, 0x33533974, 0x7f10722c, +- 0xf4c72452, 0xefadea55, 0xd8073fa3, 0x030df6bc, 0x0f978f7d, 0xc3ba3bdf, +- 0xdf47bc6f, 0x0f1e4a99, 0x6dd50efb, 0x1d508b4d, 0x1de8da83, 0xe80563f2, +- 0x56aa7337, 0xfe1ccce6, 0xc07c1f9e, 0xfc48cfbe, 0x7bb69f9e, 0xbbf86725, +- 0xd27be32f, 0x9a35817d, 0x2eb1f109, 0x1196eacb, 0xbcd6651f, 0x657bec19, +- 0xe1256fa7, 0x36d482ea, 0x0e624d81, 0xa87964cc, 0x782a55c0, 0x92ff682a, +- 0x027df8c7, 0xc5d17860, 0x039eb7f9, 0x5238f7ec, 0x2bf7fc2d, 0xad0e2176, +- 0x8d7e862e, 0x27858fbe, 0xef946a16, 0xdd5a776e, 0x8859cf94, 0x7e61d4df, +- 0x3bfcac5b, 0x5e6b168a, 0xf1b8fc80, 0x3ca2585d, 0x3d16505b, 0x56dd0ecc, +- 0xfc272f96, 0xc59b47fe, 0xcf922df7, 0x472bd3b7, 0xf25c1e50, 0x2cb9f9ab, +- 0xcc79472f, 0xba61e437, 0x7028f7f1, 0xfda1dfff, 0x82fefe27, 0x04546fb1, +- 0xc8438f03, 0x838390d3, 0xc77144f4, 0xf4327a83, 0x9f2c305c, 0x0e5c295d, +- 0x52417d0a, 0xc8d5dec8, 0x6ff7135e, 0x01bfefec, 0x8f1a3ec3, 0x00003430 ++ 0x00088b1f, 0x00000000, 0x7de5ff00, 0xd554780b, 0x733ef0b5, 0x7993331e, ++ 0x0f20f264, 0x0084f102, 0x010e02a2, 0x93c443c2, 0x80d06210, 0x2a5e4041, ++ 0x24863bc3, 0xa7f68113, 0x84cef7ad, 0x36b5a220, 0x97836c5a, 0x8d04077a, ++ 0x68d03a8a, 0x00e84e03, 0x6bdab11a, 0xeada5454, 0x8088a0ed, 0xc5978490, ++ 0xd7bfca96, 0x7324e7da, 0x6a24264e, 0xffffdffb, 0x6df9f8fe, 0xece7d9f6, ++ 0xed7af6bd, 0x7b5ed6b5, 0x21f5208f, 0x72113789, 0x1968fe19, 0x7d2109e1, ++ 0xfcb6cb3a, 0x992463f6, 0xa22bff10, 0x84239dbc, 0x7c239dfb, 0xde4228d3, ++ 0xcc05c2de, 0x6bde1eb4, 0x4fd68423, 0x301e9e6f, 0x6fb21167, 0xf7815984, ++ 0xc3cb6f4f, 0x3f97a4fa, 0xbdb40a70, 0x805e65e2, 0x09ef69ba, 0x884ec467, ++ 0xc8f2dcd7, 0xfb79f40d, 0x4ad93ccb, 0x49fe2287, 0xc8429226, 0x7f610b31, ++ 0x997d5917, 0xb62b5595, 0xfa1bbbec, 0x13346d2d, 0x62a7ed2b, 0x3769f2f7, ++ 0x83f2fad0, 0x2a578122, 0x7d4b57b6, 0x009efd69, 0xdafa8417, 0x71c67fbd, ++ 0x6949f2da, 0x27212870, 0x5f22167d, 0x96ceeb4d, 0x79f45994, 0x21676059, ++ 0x83b65fbc, 0xfbe89b73, 0x7df79b65, 0x3597fd0c, 0xda790388, 0x1b7a8aff, ++ 0xb1b08791, 0xc798132f, 0x6f0069d2, 0x31229bc5, 0xa5e97ad3, 0x1c011255, ++ 0x8952b509, 0x547fc603, 0xce301d92, 0xc3471c41, 0x74b3c567, 0xe55dfa1c, ++ 0xa61b9c8b, 0x1e226956, 0xb775a780, 0x7653ce75, 0x34b55798, 0xfddfbe18, ++ 0x2def0480, 0xc57c2c0f, 0x5b7c032a, 0x738042a4, 0xd96916f3, 0x56feced0, ++ 0x83a5bfd4, 0x765d58eb, 0xddaa27aa, 0x11f49e58, 0xeb3b9b22, 0x41288465, ++ 0x901dc03b, 0x7ceb0fa6, 0x204b9e7e, 0xcff43464, 0xd9d2d913, 0xf20c253f, ++ 0xfa03ff81, 0x2683e04f, 0x567b6047, 0xba56bd27, 0x4ee5bfe8, 0xa9759d7a, ++ 0x73da13f4, 0xcad7fba3, 0x140e8047, 0x0b9f5a9e, 0x697cc7cb, 0xc9f46e58, ++ 0xfa5fb788, 0xe7596086, 0x27f3e373, 0xdcb1637c, 0x7cb053ec, 0x658457d2, ++ 0xef8257c0, 0xc1cdf56d, 0x83cf9b72, 0x95f69fcf, 0xabef5962, 0xf9cfe7c2, ++ 0xc3b960d6, 0x2fe7c7e7, 0x196036fa, 0xb962d5f4, 0x658757cb, 0xef802f83, ++ 0xc7abe2bd, 0xc417d1b2, 0x8d7c7be7, 0x617c8658, 0x7d02f72c, 0xb5f61969, ++ 0x77dfb960, 0x7cd7cb18, 0xd9aefc11, 0x87cb1c77, 0x273bbc55, 0xe2813c90, ++ 0x1710a9cd, 0x58921715, 0xb489e4ac, 0xeac2589e, 0xf3fa7729, 0xf14f5a24, ++ 0x63c53ad0, 0x9e70f2df, 0x56fbd699, 0xfbccf6b1, 0xd685be48, 0x7dacfd33, ++ 0xbe4ac3c0, 0xd407d695, 0x9bc1f6b2, 0xb471f9fd, 0xdac0383e, 0xce11ddaf, ++ 0xb5fad1b7, 0x3c3ed641, 0x69d92644, 0xd598787d, 0x2656de73, 0xa73d6839, ++ 0x3f73d585, 0xd2724ff6, 0x7d846e7a, 0x7854fe3f, 0x8fad3c52, 0x13ed676f, ++ 0x1702912f, 0x1c244fad, 0x79edf3d6, 0x9eb40905, 0xc2f562ef, 0x39050b7e, ++ 0x15edff06, 0xe5098b23, 0x6dff7a85, 0xeb4e908a, 0x71156452, 0xe7fa7c53, ++ 0x922c3d60, 0xb6fed025, 0x8c22a17f, 0xac8975a3, 0xf6fff686, 0x7efb6197, ++ 0x76f6c651, 0xdf6c2aff, 0x6ed8c92f, 0xeb0fbeaa, 0xb60a89af, 0x8fdf5727, ++ 0x2926bfef, 0xfab83ed8, 0x8b37ac11, 0x5b1f6c1e, 0xbf7c2bfd, 0xfb60f259, ++ 0x4a02eb63, 0x07ffad01, 0x7c0ad9e7, 0x4a79c35d, 0x6bf03649, 0xf284ad30, ++ 0xcc8e7aeb, 0x0878f901, 0xc3ca9a98, 0x014974fa, 0x1ff7b6fd, 0x9cf14fb9, ++ 0x50c9dbca, 0x43f4f65f, 0xf3cfd859, 0xfb488fd8, 0x67ee7be1, 0x756337e2, ++ 0xa6fc4cfd, 0x01a7eb54, 0xf6b1abde, 0xdfbd9fae, 0xf3c3d78c, 0x4fd6994d, ++ 0xe8e3f613, 0x5e26bcdd, 0xe787a09e, 0x4fd6b972, 0xd093f633, 0xe2c2783b, ++ 0x613f5d18, 0xcfd6b971, 0x9f4fd83b, 0x48a3c1de, 0x28fd74e3, 0x3f5a3dd2, ++ 0xf49fb187, 0x9613f5de, 0x23c3d06e, 0x39fad0ad, 0xeff4fd82, 0xf314bcdd, ++ 0xcc787a8d, 0x273f5a15, 0xbd59ee91, 0x43bf67eb, 0x8efd9f8f, 0x439cfc0e, ++ 0x6ef50678, 0x3d4ef95e, 0x1d9df27e, 0xfd84b9f8, 0x7ebbd35c, 0xf8f53bf6, ++ 0xc0ecefd9, 0xbcc1c88f, 0x5e6ef586, 0xfc7af1f9, 0xe077c7e4, 0x3c01c9c7, ++ 0xcf077a23, 0xf8f47d6b, 0x074fad79, 0x9e11527e, 0xa783bdd1, 0x9f8f4520, ++ 0xfc0e9482, 0xb8cf08c8, 0x5af3f5de, 0xaf3f1e8a, 0xe7e074a5, 0xc6e7ec1a, ++ 0x20abcdde, 0x829f8f55, 0xe4fc0ed4, 0x9e793f60, 0xd087847a, 0xf7dd1c7e, ++ 0x8f5fdcd3, 0x1dfee69f, 0xfb01b9f8, 0xc9fb4c99, 0xc29fb9ee, 0x0a7e3d4c, ++ 0x53f03b33, 0xd29e7880, 0x339a7ebb, 0xce69f8f5, 0x54cfc0ec, 0xef6a67ec, ++ 0x957855e6, 0x57853f1e, 0x24dcfc31, 0x8675c08c, 0x9e6e9dae, 0xbf73727e, ++ 0xefa3853c, 0xe7562ef3, 0x76026e5d, 0x33d9af0f, 0xe9e145a4, 0x091df6fb, ++ 0x68910f39, 0x2eff26bb, 0x5a838fc0, 0x4d76d179, 0x9d38d8fc, 0x24a0951d, ++ 0x4549eaea, 0xf7ef757d, 0x6ba01929, 0xad739d4f, 0x93dd3dae, 0x9467aba3, ++ 0xdfbdd78e, 0x575f2abf, 0x2dcd6abf, 0xfcb3f7ba, 0xd9eaebb7, 0xdee9e61b, ++ 0x48bb541f, 0x5d757ed7, 0x9afdae99, 0xfd5d4ac0, 0xeb1ffaba, 0x5c161fde, ++ 0xbebf6bab, 0xfb5d21f1, 0xba63f088, 0x4f83c8fa, 0xdd1fdee8, 0x3ed755b2, ++ 0xba73f0e6, 0x5d9171f6, 0xc70dfaba, 0xbfdee8f7, 0xaebf7db1, 0xdfc5d37e, ++ 0x23cfdeeb, 0x6dedebef, 0xef759fcb, 0xa67d764f, 0xed39bf6b, 0x6a9d834b, ++ 0x4ebb1d77, 0x5720f3ad, 0x7f12fd04, 0x6af684ba, 0x5d6121d8, 0x7e676bea, ++ 0x7c99638a, 0xb48ff294, 0x8c9cb17f, 0xa8ff497c, 0xb7d790dd, 0x7d08eaf4, ++ 0x9ef1c3fe, 0xf9f45dab, 0xf5cf250f, 0x0df618ae, 0xa48e37e5, 0xa09b2941, ++ 0x203fb634, 0xcfcf7e32, 0x08f834b8, 0x6a6bdefd, 0xeb409c1f, 0x4179f3d7, ++ 0x38578f90, 0x71d5da13, 0xf782a93c, 0xfd04cce2, 0x72b207a6, 0xc947f29f, ++ 0xd4fe86c3, 0xfb3ae0ce, 0xd27a20dd, 0xfeaa8ed0, 0xce760fc4, 0x5e74fefa, ++ 0x9579097d, 0x1fec24fb, 0xbfefbf48, 0xfb43cd2c, 0xcfd44b33, 0xa25f1e88, ++ 0xf1c50fe3, 0xcd0f20c3, 0xaee8fe30, 0x8c079be3, 0xc96f8dd5, 0x6f8dd52c, ++ 0x2ef8e891, 0xfd5f7e42, 0x253e3ab9, 0xde4278c2, 0xf1c73ee2, 0x38a599cd, ++ 0xf51203fe, 0x8fc7a2bb, 0x05bf18eb, 0x7761ffe6, 0x5e301ff3, 0x32ccff3f, ++ 0x3625fcfd, 0x9f553fff, 0xc38fc756, 0x3b99fff9, 0x599fe6cd, 0x666fe6c6, ++ 0xef8c76fd, 0x047fc0ec, 0xcdd63fc6, 0x09ece6f8, 0x555ff9fa, 0x99bf9fae, ++ 0xfab27f8d, 0x1dbe3a82, 0xbb92ffc7, 0x557fe6c0, 0x992f8e39, 0x1fe06e3d, ++ 0x2aae2329, 0xfd27c740, 0x054be2a8, 0x40e3a176, 0x0a912439, 0xb9db210d, ++ 0x0fc70801, 0x7dbf18e3, 0x0df94715, 0x9f1f99f5, 0x9cd50093, 0x546fd4b9, ++ 0x8ec57d79, 0x1ef4093c, 0x6b7f53b6, 0x92ea0aa9, 0x9bf91e46, 0x0607346c, ++ 0x1b5b7851, 0x97d43f79, 0x0031bc6c, 0x266bd5fa, 0x3be04a0b, 0xf9e18481, ++ 0xdb0f8fe7, 0x632f3d1a, 0x3c56b4b9, 0xb7928916, 0x9f303f0e, 0xf0a2a90c, ++ 0x1826064d, 0x94ff59dd, 0x18e071fa, 0x1efd4c7f, 0xcf9ffd42, 0x7fde3644, ++ 0xea0f7f53, 0xa1efea11, 0xf1aa4ce3, 0xa1ddda3b, 0x897f0a34, 0x02a7ff0a, ++ 0xef4fd793, 0x2a7e02e4, 0x68fd5f9f, 0x0bd7fa04, 0xd228d8d6, 0xe858e13b, ++ 0xe9d5d24f, 0xa740fcbc, 0xc0e6ddf6, 0x2bf10e56, 0xa3a6be03, 0x78b21268, ++ 0x75c50643, 0xed1ffbe7, 0x39ccda9d, 0x2883b909, 0xff7d2a62, 0x7f5cd5ae, ++ 0x96771d17, 0xeb61ce62, 0x42619290, 0xa61926b9, 0xdedc84b1, 0x3da44230, ++ 0xf88ae990, 0xdc6a2469, 0xfafa4519, 0xbd7d12ac, 0x13445455, 0x3a75ab85, ++ 0x7ed0b647, 0xb7d1cf67, 0x340ce36b, 0xab3a3225, 0x9c5095e3, 0xb347d3a4, ++ 0xc781cca1, 0x1cf3a42e, 0x8356fb17, 0x2458bbc7, 0xfde3f461, 0xd5d0087d, ++ 0xcdef8c9f, 0x1b79b173, 0x5a239de1, 0xcf3a1294, 0x00f90b39, 0xfe11b7f0, ++ 0x29b5ed3f, 0xdcb4e1a6, 0x98910bf0, 0x08c7ceba, 0x718f5cff, 0xd611413e, ++ 0xc6a5f9f9, 0x8e6f8ce7, 0x14fff4a9, 0x5f9683f8, 0xf8507f00, 0xd1fcaa8f, ++ 0x7f1957a9, 0x699ecd78, 0x9bed0fc0, 0x55748278, 0x950ee5f9, 0xead6965f, ++ 0x8f1082f9, 0x3e5c7408, 0x2879cb87, 0xab660f8a, 0x4ebcb07c, 0x117737cf, ++ 0x831e98bf, 0x6e37732e, 0xee4d3fb9, 0x544fbf3a, 0xf0ff99be, 0xd74fc43e, ++ 0xdd3a3279, 0xaee9d2ad, 0x1dfb7d2a, 0x52ef5d2a, 0xeea73ae9, 0xfaa9d7d1, ++ 0x80e4f320, 0xfdeef208, 0x88cf4689, 0x951e9e8e, 0xef38469e, 0xf779e956, ++ 0x8d3d188f, 0x7a5446f0, 0x89ceea46, 0x78574064, 0x582df08d, 0x183e65d3, ++ 0x8fe85ad7, 0x636f4f4d, 0x51a3aade, 0x53822bcf, 0x928d1d56, 0xd3f515b3, ++ 0x027bf575, 0x2fef7573, 0x6ba85baf, 0x8f7b5a5f, 0x86f17dae, 0x85f5757b, ++ 0xdee91ffe, 0x5aa6b05f, 0xd5577ed7, 0xf9f6ba83, 0xeaea8fa5, 0x749b3d73, ++ 0xb39ecfef, 0xab3ed745, 0xfb5d59e4, 0xba9da28c, 0xb76574fa, 0xded37dee, ++ 0xfe036e6b, 0x9e03fb7c, 0xc1713d80, 0x33c605fd, 0x3745b82f, 0x27d473bc, ++ 0xf31f5f23, 0xb8f2c10d, 0x7f7c8dcf, 0xcb1637d2, 0x7603c6d6, 0xbae82758, ++ 0x10248cb8, 0x579a68d2, 0xac1fa1bd, 0xd3d704d3, 0xed53c990, 0x2603f5a7, ++ 0xb8a1e519, 0x91e1224e, 0xd8b07084, 0xf3b470a8, 0x1e91ed51, 0xe2a8ebda, ++ 0x5edaea4f, 0xdcfd891c, 0xabc2d8fb, 0x5bbb2f80, 0x065fe81f, 0xaa6d3dd8, ++ 0x2f6c6f5d, 0xf44948e7, 0x22d64273, 0xb313561c, 0x2625ca3b, 0xd2bbe5ff, ++ 0xea1389f3, 0x5755c1e1, 0x99482f1a, 0x24f8153c, 0xcbc7275b, 0xe9d3aeeb, ++ 0xe4d10277, 0x236fc03e, 0xd457cf75, 0xeefba0df, 0xe11e3ed4, 0x315d04ae, ++ 0x92c5960e, 0x87a04ccf, 0x673207c3, 0x9538030c, 0xec6f58a3, 0x29e17683, ++ 0xa3aad15f, 0x257e8083, 0xcdf71e58, 0xcf98f2c1, 0x5f51e583, 0xfa9f9629, ++ 0xf88cb0aa, 0xdff960d6, 0x1f963f3e, 0xf96036fb, 0x962d5f27, 0x58757d87, ++ 0x600be87e, 0x8f57c879, 0x20be7be5, 0x46be2d96, 0x0a7d5b2c, 0xf5dc9a96, ++ 0xd5c777c4, 0xf024f875, 0x933e0c5f, 0x1bd5fc6a, 0x59f27426, 0xf200ff1c, ++ 0xe2e78699, 0x0fcab33a, 0x487e3a29, 0xf90e5f00, 0x3af687ac, 0xeec3e551, ++ 0xeedd8fbe, 0xe1affadd, 0x93dfa9b7, 0x29f93adf, 0xd94fc0c3, 0x30d3f13d, ++ 0xa69f8a3e, 0xeecc5c9a, 0xa7e9f951, 0x7e188f30, 0x42303cc5, 0x6bd944fa, ++ 0xd6099e4a, 0x3eea95b1, 0xf5807d08, 0x35d8eab3, 0xb416ddf4, 0x604302eb, ++ 0xe43b38dd, 0x1f61836f, 0x4a61ece1, 0xe7eeacfc, 0xee93e467, 0x7fa0aef1, ++ 0x89402cb3, 0xddb5d49e, 0x6af0c71a, 0x42229135, 0x0707b5d7, 0x345eed3d, ++ 0x4902eb14, 0xee03ef84, 0xfd188ee9, 0xf0195b52, 0x6b5e13db, 0x870d5f1c, ++ 0xf13d8efe, 0xa7285cf7, 0x1cbd989a, 0xbb478077, 0x729f849d, 0xd63b7e03, ++ 0x0d3bb325, 0x83edede2, 0x0dda1724, 0x7f1e9264, 0xfe1d7cfe, 0x6a38a41e, ++ 0x36b775c1, 0xf037f10d, 0xbde9c1ab, 0xfa4f5fc0, 0x2e7c27bd, 0x0bff7982, ++ 0x7e93d9f0, 0x122f49ec, 0x91b17e45, 0xef6dbfce, 0x64879cb0, 0xf8caf718, ++ 0x8cd7f6d6, 0x2dfe3cf0, 0x452db8f9, 0x4c96e3e3, 0x2a907e02, 0xae1b672f, ++ 0x74ba078e, 0x3d03d3f4, 0x927ddfb9, 0xe9fbfe09, 0x0f7f7d2c, 0x978bfb18, ++ 0x1d3d7708, 0x244921d7, 0xbc95fa9e, 0xfe8f3b67, 0x87e23b8c, 0x9b5ec1b8, ++ 0xbf0646bb, 0x857fe4f1, 0x1f59e865, 0xf07b385f, 0x61f82729, 0xaaf8d32b, ++ 0xa8e831a3, 0xacc11595, 0xbfb47b2a, 0x9fafa8d2, 0x828ae5ad, 0x7e392f38, ++ 0x675830e6, 0x4547555c, 0x5869fbd0, 0x4cacfd6a, 0x939c7093, 0xccf1d9f5, ++ 0x7d300bff, 0xf50123b2, 0x059f49cd, 0xc367ffdf, 0x1a3f5dd3, 0x9034843c, ++ 0xcfa02ccf, 0xf7765b69, 0x0f2b77ef, 0xe20979c2, 0x7e2424a7, 0x95a6fe05, ++ 0x00797ffe, 0x5d602bf4, 0xe41bd7eb, 0xe1ebe6fd, 0x78dd0ef9, 0xdb593bf4, ++ 0xbaef8633, 0x1c813b97, 0xd29ef8d3, 0xfeea2fef, 0x6b7a8af6, 0x4d8ede95, ++ 0x8dbdd5d0, 0xbb3a55e9, 0x8601fe16, 0xc027157b, 0xb2ae5612, 0xdf609b61, ++ 0x07b4fc00, 0xbfe09382, 0x0abdec70, 0xc8f2444b, 0xc02d2e28, 0x6ac68ba7, ++ 0xfecf2ffc, 0x2753d533, 0xc80912de, 0xa144b919, 0x8fecedca, 0x44c4f4ae, ++ 0xdad58beb, 0xc51586a2, 0x789d6eb0, 0x43f456e5, 0x27129096, 0xa4a5c7f8, ++ 0xb5e21736, 0x08a989a7, 0x7934f3e4, 0x4a3239cf, 0x8482ad1e, 0x41bc5cf3, ++ 0xff53c76f, 0x5e5f575e, 0x232fafa7, 0xbec0a7b7, 0x228db2fd, 0x37a07009, ++ 0xf35fedf4, 0x3977ec2e, 0xeb0f5aa9, 0xad9146f6, 0x445c8b67, 0xab7aa0c8, ++ 0xcebfb7e2, 0x2eeb485d, 0xb459c581, 0x127be87d, 0x1653ff99, 0xb42922dc, ++ 0x9186b3fd, 0x440d5077, 0x87ac0fbf, 0x32ffcb75, 0x772edee7, 0x85b7dfa5, ++ 0x66af08df, 0x0fd9740f, 0xa8a8e157, 0x0c4094e7, 0xe053207b, 0xfaa99c98, ++ 0xe9705f2e, 0x0cd31ee2, 0x4fcceff5, 0x4fc744c9, 0xae4f787b, 0x0ff19a30, ++ 0xd09c7ff8, 0x4fbe792e, 0xfa5d69ff, 0xf6a7ffcf, 0x9ff68fdf, 0xda7febab, ++ 0x81ffb53f, 0x179fe05d, 0xdf8affab, 0x9f8af0be, 0x97b293ea, 0xba12771e, ++ 0x6a109e4e, 0xbe94dc53, 0x77efdbe5, 0x0b8f9d02, 0xebf0277e, 0x145f0089, ++ 0x3d6eb188, 0x3c6a702a, 0x1073b146, 0xd27f8377, 0xf73e4ffe, 0x7c478c53, ++ 0x61745db5, 0x1cdead3c, 0xac395336, 0x98a7b86c, 0x11fac70c, 0x0ce07f56, ++ 0x3d46f50f, 0xf33d95ff, 0x87e40a78, 0xe3514e50, 0x67b4614b, 0x5e7db72b, ++ 0x9793eb08, 0x191ca3b4, 0x2ff183bf, 0x5bfea226, 0x6d77c528, 0x9c6270a7, ++ 0xc5e2abc0, 0x33d3f0db, 0x29ca13bc, 0xa0be805f, 0xf1fa089e, 0x554aefc6, ++ 0xe0ad753b, 0xa3663e48, 0xc6431eff, 0xf0d45e80, 0x4ecc0242, 0x57f679ad, ++ 0xb8508fc3, 0xcb7b6d4e, 0x4be145c9, 0xc1b3a793, 0x47b9ffc5, 0xb6ef5eee, ++ 0xb68b7952, 0x4b75b487, 0xebed546e, 0xc5cb2b10, 0x79f213b0, 0x6e88b7ca, ++ 0xfe5c7d3f, 0x3f4f53c2, 0x3fccf101, 0x6883dd9a, 0x785e2bff, 0xb4f1c3fd, ++ 0x98a762be, 0x61a6cc5c, 0xe93a52e7, 0xafffa5e3, 0x47a4e9c9, 0x975e6fd9, ++ 0xf9ec61e4, 0x749d897d, 0x9f73b159, 0xc5758644, 0x3ee0a4c7, 0x418f6229, ++ 0x4291e09f, 0x9e6a17b0, 0x7104abfd, 0x397b13c6, 0x03159a92, 0x475e5b9f, ++ 0x84f0007b, 0xd5e954f4, 0xfbc33f41, 0xd0174a5e, 0x197a46db, 0xeaac5bdf, ++ 0xf217e817, 0xbf7f282c, 0xa0f207b8, 0x037664fe, 0x5c5f4a1e, 0x7cf984e5, ++ 0x3e315421, 0x29fdf5ff, 0x54bf1d0a, 0xb0b8a7f4, 0x9f4bcf64, 0xdff201fc, ++ 0x907f77f2, 0xa225f182, 0x2d709ba4, 0x3cc3a7f2, 0x859e6e97, 0x3c465cf3, ++ 0xbfa587c8, 0x1f404be6, 0xd148105e, 0x627218ce, 0x7c9c9915, 0x971295b1, ++ 0xf00bf3ce, 0xe83f2127, 0x1db03e3d, 0x097beeed, 0xa81f83e8, 0x0316a173, ++ 0x18582fd6, 0xaea2febd, 0xcfac040b, 0xf6ddfe68, 0xe9d00b40, 0x15257f64, ++ 0x44bc5df6, 0xe0f8abf0, 0xf97ed32e, 0x32a72777, 0xc859113a, 0xeba3bf55, ++ 0x0e7824fe, 0x8a88b7ef, 0x3beeb875, 0x73ab3972, 0xf8ead5fc, 0x5838ee14, ++ 0x8948bfaf, 0x8ae6bf6d, 0xeba01e9a, 0x459f1476, 0xff933bc9, 0x79320f6d, ++ 0x303fe4d7, 0xcfda08bd, 0x0472621f, 0x487ac1df, 0x62a70ae1, 0x1c99befb, ++ 0x47ea07ea, 0x6df392c7, 0xfae72aa2, 0x50bf2376, 0x3e2e05f8, 0x9c606f8a, ++ 0xee03a444, 0x48db2cbb, 0xa3d28fbf, 0xd9d7185e, 0x8e4d5fb5, 0xab7e6b97, ++ 0x6407d7a8, 0xdd03d333, 0xc47e55db, 0x7818b953, 0x5f9009fa, 0x197eaf2a, ++ 0x812c57e4, 0xe3b97ff9, 0xa8f387c0, 0xd4197edc, 0x57af56e4, 0xba5b728d, ++ 0x2589346b, 0xddda5fb7, 0xd2dca624, 0xd6e531e7, 0xfe7e411e, 0x3557ad3f, ++ 0x3c030e3c, 0x4789d75e, 0x87764f4d, 0x3c9ea34f, 0x5788c828, 0x7fa49ea3, ++ 0x576e4887, 0x50f8d47e, 0xe7b2bfe3, 0x7d02ae2b, 0x1aa7c1d4, 0xa9f0761f, ++ 0xe25d87c6, 0x1a3c3abb, 0x3ec02fdb, 0xbe6b850d, 0xa3b4d365, 0xb4b495d4, ++ 0xc9b7dc13, 0xbee3c99b, 0x613ce5aa, 0xc4442079, 0x4c8fd0fc, 0x4ec1a355, ++ 0x3bf7f89d, 0xc290ff4e, 0x45f89f3b, 0x2b501796, 0xe97fdda2, 0x7409e5f2, ++ 0x3c54f33e, 0x9f68a7cf, 0x4732e94a, 0x1471c2e0, 0xf102b9ce, 0xfc4227c7, ++ 0x469f2396, 0x54bf31c1, 0x89bf875f, 0xf4fd9d29, 0xf5b7fef4, 0xf96bbe53, ++ 0xa7eba52e, 0x1f790883, 0x1787114a, 0x3a6af9a2, 0xcfe295d0, 0x0c0b8a3b, ++ 0x11153d40, 0xaefca24a, 0x7f664517, 0x63305bbe, 0x7937d834, 0x33c587b3, ++ 0x7e8c1f7e, 0x67d557af, 0x3c72fd67, 0xa1b3f9e8, 0xcf6ff46c, 0x88ec5c1e, ++ 0x407a1795, 0xd5d7b3e5, 0x3b36977d, 0xfe53cb57, 0x68ed236f, 0x56edf8df, ++ 0xbec63db2, 0xd35126e0, 0xe8dd2ad7, 0x9fc74f1f, 0x5ce1f2a3, 0x4e7c69fa, ++ 0x4e66dd14, 0xbb38213d, 0x3efe01d2, 0xbec3f28d, 0xaf817e2f, 0xac07bf01, ++ 0x1892c291, 0x2af3fbf6, 0xffee26fe, 0x0b73f31a, 0xe0027942, 0xebcec0b1, ++ 0x694f20e2, 0x0c943af2, 0xee26b805, 0xa367e7bf, 0x0f7b1f29, 0xc7c86ef2, ++ 0x48ce86f5, 0xb0fe189e, 0x3fd09f11, 0x444799d8, 0x03ebe217, 0xe02964b1, ++ 0x565983f5, 0xef9afb02, 0x588aee4b, 0xb3342e70, 0x292e66f5, 0xfb8a30b9, ++ 0x79bf0fbf, 0x7ce11db3, 0x76b38f8a, 0x95ddf796, 0x9fdc98ff, 0x6a817175, ++ 0x6790f80e, 0x002e64f5, 0xe242b471, 0x0e04d9f9, 0x68a6fde5, 0x38d795fd, ++ 0xebc805fd, 0x2e710ca9, 0x14af6d13, 0xb1f01222, 0x00a771b7, 0x32adfbf6, ++ 0x211e3051, 0x199b0d54, 0x223af715, 0x03af880a, 0x17779b7f, 0x4cdcf7e0, ++ 0x94b80133, 0x609c67a1, 0x8d0b9c07, 0x6ee83944, 0x91f07f5e, 0xf4220569, ++ 0x8c3f9043, 0x6c9850fc, 0x4d67d5d3, 0x94dcfd22, 0x91cd136e, 0xf418ee55, ++ 0x9f1891ab, 0x59bf5af5, 0x6fd33ffe, 0x637ea813, 0xeb462d7c, 0xc6255bb7, ++ 0x2dfa51f7, 0x5b7e9635, 0x02a72d59, 0xca6cac5f, 0xaeba054e, 0x9f69737c, ++ 0x0dedfa58, 0xdfeff31f, 0xdbccf354, 0x76fd51fa, 0xeb7e947d, 0x8c5bf547, ++ 0xa968eeb8, 0xf2cdfa97, 0x6f7f233f, 0x318b7e80, 0x7f1522df, 0x0a2b7e9a, ++ 0x2b7ea355, 0xf2ebc7ea, 0x7a926ea5, 0x1f0b6fd2, 0xd175859f, 0x3fc18b6d, ++ 0x6fd05780, 0x0e7aaa6f, 0xf73d01c6, 0x5beb92ef, 0xde8ab9e9, 0x21ffb9ea, ++ 0x6e7a6b3c, 0xed0e7f65, 0xc87cae99, 0x2ccadcf4, 0x3656e7a6, 0x72b73d31, ++ 0x4673d310, 0x45df96fd, 0x2befb1bf, 0xd1efd087, 0xd5facc8f, 0x78bdb49d, ++ 0xd0b6e88e, 0xed658bf7, 0xe8d5467c, 0xeff77d68, 0xcefa3752, 0xb9cf067d, ++ 0xdeefa4f4, 0x08377d01, 0x9040d8f5, 0xdc7f2323, 0xcba6d032, 0xebe0fba7, ++ 0x04bfcf63, 0x1e07f2f2, 0x4c8feffd, 0xfbda4fcc, 0x2091b1f5, 0x3c001f77, ++ 0xab3ddf54, 0xcfab5ff2, 0xd274fa8f, 0x15ef2650, 0x55fc31f7, 0xbe6c7036, ++ 0x0c80f9ab, 0x2edfc0eb, 0x577d1fa2, 0x67a3f313, 0xd8fa5b9b, 0x5fffcfc0, ++ 0xfd25ca22, 0xc5185e2b, 0x962e730f, 0x5773dc61, 0xf82b739c, 0x62047399, ++ 0xc1763b01, 0x804e5bc1, 0xe2e0bafd, 0x177bb406, 0xd244f3c0, 0xb731f791, ++ 0xedea4f43, 0x3b8d79d7, 0x5d20cf5f, 0x9a2621f3, 0xae265d19, 0xb25b02e2, ++ 0x5047e6ba, 0x5bf30cbb, 0xbf12798c, 0x9b3fe757, 0xc8be208f, 0x7b7bbc3b, ++ 0xbdf9f90c, 0x866e4f11, 0xbcd58a97, 0x5c554f1e, 0x4a513c4c, 0xe94c2f17, ++ 0x2f5dcbc4, 0x4067d647, 0xfa1c3dfb, 0x6b79c65b, 0x5fce3378, 0xdfe6a3c3, ++ 0x9fdf502c, 0x33123a1f, 0x73c3444f, 0x0d117c97, 0xbc7c06ef, 0xeb99e9ad, ++ 0xcb9030c8, 0x9f9e4c8f, 0xfa3e068d, 0xdd718f3d, 0xd20ee63b, 0x4f7a579d, ++ 0xcf54cbc5, 0x19148291, 0x80aa48f0, 0xee95e6cf, 0xce853d7c, 0x2b2536ef, ++ 0xb3ea4207, 0x207926fe, 0xdac0711e, 0xe3507a8e, 0x266651c3, 0xaf556617, ++ 0x55d7d07c, 0x234deb80, 0x0af942e7, 0x9a9cf41b, 0x8fbde667, 0xee01dfc9, ++ 0x4633ebaf, 0xb9619e21, 0x7ada8520, 0xffa17405, 0x74621a9c, 0xe85d02f1, ++ 0xf691a73f, 0x657bc066, 0xc30ee732, 0xef3b8dfb, 0xc37a7e07, 0x9c839f4a, ++ 0xadee7297, 0xf4f61d0c, 0xb1f22b94, 0x318f8b10, 0xb9db9198, 0xf7802e7e, ++ 0x27dabb12, 0x1f2dcd13, 0xa9131c00, 0x87816cdc, 0x145ffa01, 0x8bf68dfd, ++ 0xca7a0f91, 0xdf8eea07, 0xbf3c5473, 0x03b07401, 0xb025dbbe, 0xb661bc87, ++ 0x5eed68fe, 0xbc402e41, 0xa4687469, 0x4628cbeb, 0x3c0c5307, 0x55d5a6df, ++ 0x9c437b3c, 0xa14fdf08, 0x07126ffe, 0x375f7ebb, 0x966efc6b, 0xe209e2bb, ++ 0x7a51e90a, 0xf45bf403, 0xe36566be, 0x5baf88bb, 0x4cf35356, 0x8d2f8aee, ++ 0xaf07a03e, 0xe56eb784, 0xcc48f1a7, 0x2b6fb0bc, 0x7acca33f, 0x6d6bd9f9, ++ 0x887aeb7f, 0xa87135ab, 0x41284857, 0x69983f17, 0x01cb7666, 0xbcf907ab, ++ 0xbdd14dfd, 0x7faaee55, 0x0174ab26, 0x7cfa257f, 0x089824e2, 0x95974de8, ++ 0x7bcda67c, 0xe8b7e300, 0xab0de0f5, 0x5dd7e907, 0xcccc33ff, 0x1eceedfe, ++ 0xc337ead3, 0x28d79078, 0xae33c7eb, 0xa95c5a47, 0xd47979a7, 0xbcebbf71, ++ 0xedbe71b4, 0xb49784be, 0xdb4e3c60, 0x7bc3d89f, 0x3f608976, 0x7e827116, ++ 0xf71daf1f, 0xfd09ff37, 0xee8d26df, 0x1f887fbe, 0xdf9e2985, 0xc614f1d8, ++ 0x773f4fb1, 0xcfc81a64, 0x6279578a, 0xbad7f2a1, 0x2cc241c3, 0x3b02444f, ++ 0x5781aca1, 0x842fce30, 0xd9446773, 0x6193d419, 0x81c978f8, 0x976caf7a, ++ 0xbf4c5039, 0xb3e57b2f, 0x6b7f10e1, 0x9ff4cb5d, 0x1f9539ff, 0x90e191fd, ++ 0xb026500f, 0x7d2379fd, 0xf3f9531e, 0x1cdb6ed4, 0x3d5cdfd0, 0x165bc73b, ++ 0xa39a2d9c, 0x9a0f0ce2, 0xdee71645, 0x6c3cc36d, 0xe61cb3ff, 0xd17c0331, ++ 0xfcb548e7, 0x32cf53d0, 0x28d65cbd, 0x703ce006, 0x56cefd59, 0x1d978b88, ++ 0xeafda336, 0xfb833fad, 0x7a5e937a, 0x6e379d81, 0xd0f175e4, 0x7ac8712e, ++ 0xf8866c3e, 0xea054359, 0x823f5a01, 0xf71aa0f5, 0xb27196fb, 0xbd352f15, ++ 0x5c28a7e2, 0x9c679bf1, 0x65b82e78, 0x91e313bb, 0x17de57f5, 0x0c7712e8, ++ 0x1dc6a83e, 0x70417ea7, 0x771d887d, 0x49f2a93c, 0x3b8facc8, 0x8c24fa92, ++ 0x73385247, 0x2fc4624b, 0x85fff83a, 0xbec24f0b, 0x5f5da9d9, 0x9770093e, ++ 0xc9ee737f, 0x527c509f, 0x7582e405, 0x07dcfbdb, 0x7da0cfb8, 0x4faaa1f7, ++ 0x067d9f5a, 0xff5a69f7, 0x6f437668, 0x645f4dad, 0xeb453ec2, 0x2053afce, ++ 0x69babb8e, 0xab6bfa32, 0x4a949e5f, 0x5a03f862, 0xe81bfc09, 0x91913ec5, ++ 0x0e1a076e, 0xa79c0264, 0xfd61dd29, 0x072788ee, 0x5e9c582b, 0x3bc8e356, ++ 0x75cbef62, 0xcc371b89, 0x5846edb8, 0xb7441bc7, 0x3f117a4c, 0x79e9443e, ++ 0xb8e82f7d, 0x0827dd43, 0xfc62bd4e, 0x83fc34f8, 0x5982ebd2, 0xd0bf871f, ++ 0x9f3ff4b0, 0xa486b680, 0xe1c7e36e, 0xdb4fe05e, 0x5667dbf7, 0x68e40588, ++ 0xb718f3d7, 0xdf51fa07, 0x70beb483, 0x2ee21321, 0xbbf6c5c7, 0xc9baff31, ++ 0x6554798c, 0x3ca11f4d, 0x2efcbeb5, 0x7511abee, 0x7495adff, 0x127db1fc, ++ 0x6ef3a7d5, 0xb3b8b073, 0x4b88074a, 0xae7c4ecb, 0x5f199fc6, 0xeee9716b, ++ 0x2d63d1e2, 0xbbfed803, 0xb1591fba, 0x3112cfed, 0xb1b9fbc4, 0x5723af40, ++ 0xf0d547dc, 0x8c3c02e0, 0x896fde89, 0xd8efff1d, 0x0dd0316f, 0x58f609e8, ++ 0xad0a7ec7, 0x7ab883f7, 0xd628fb80, 0x16eb5dfe, 0x2ad34fb6, 0xd45bcec6, ++ 0x5a465ff6, 0x812efb0c, 0xf4bbedde, 0x8b6f8f34, 0x42706ca7, 0xd7c574fb, ++ 0xf5b14ba9, 0x4e161dfb, 0x3be037bd, 0x7397ebee, 0x5981bcc6, 0x0d1597c0, ++ 0xa7b02447, 0x9b4df5b4, 0x7fd529ef, 0x8f1cf53e, 0x07d644e7, 0x377ea00f, ++ 0xc24a8fea, 0x784686e2, 0x6f4c2d4b, 0xf5b23655, 0x472ed4e3, 0x39fb4ec0, ++ 0xf2377fb5, 0x238ee575, 0xd7f69f92, 0x291bff5c, 0x05679512, 0x0a2047eb, ++ 0xee2f53fe, 0x97f6ce1b, 0x1c6ebf98, 0x38ea87e7, 0x71ec50de, 0xe8ce3bbc, ++ 0x0fe159c6, 0xcfdcec4a, 0x293bc795, 0xbfa1b328, 0x81222d93, 0x4193ffbc, ++ 0xde5628be, 0xa88b5cca, 0xfc98b3c5, 0xcf1475d0, 0xb9d83a61, 0x42513e4b, ++ 0x63b57bbb, 0xef3861ec, 0xc921dabf, 0xa9a8bf10, 0x353c7966, 0x034ee6ff, ++ 0xdc24d77a, 0xb571fb81, 0x92bafc06, 0xd710795d, 0x8c941570, 0xea357602, ++ 0xa4c5049d, 0xa3b57f83, 0x70a65528, 0x34ed53ae, 0x5cf1b822, 0x2c2cef28, ++ 0x2ef0f982, 0x631acb93, 0x97b441df, 0x5e144f10, 0x1cfe9744, 0x5234b927, ++ 0xfcb47e86, 0x4b4b729b, 0x14ba3633, 0xc616314c, 0x66f377b2, 0x6dde70ba, ++ 0x41ff543b, 0x852bb221, 0x3ac191e5, 0x7e2bb6d2, 0x3f1eb938, 0x47e50a24, ++ 0xdb9cfa9b, 0xe81f6fb1, 0xa24e75a5, 0xa3395024, 0x6cf99558, 0xc23acf38, ++ 0x9f0365c2, 0x57aff99e, 0x10d6bf69, 0x9b457e8f, 0x5527cb5d, 0x6cce4012, ++ 0x1bcc61e4, 0x9cbe5604, 0x31a709d4, 0x2bc0909f, 0x4c69f751, 0x0fe8ede6, ++ 0xe2ccdd9d, 0xf6b93c03, 0x7c581357, 0x7e00048e, 0xa1597d75, 0x109679c2, ++ 0xdfde1877, 0xc078c0e1, 0xa31737f2, 0xa21d00fc, 0xa45495f1, 0x675af73f, ++ 0x7f070e75, 0xf5559366, 0x0b4afc6b, 0xa259b39c, 0x44a7dbf6, 0x8a962e7f, ++ 0x75e41fa1, 0x5faf2aa9, 0x883c2b2e, 0x659e68f9, 0xe753e7a8, 0x1acdcfe8, ++ 0xa204b4f3, 0xe601c9fa, 0xdbc9773f, 0x7082dc6a, 0x56b7f31b, 0x1aebebd4, ++ 0xbd013f1e, 0x93a00d79, 0x0714afd8, 0x91bf11ec, 0x309abfc1, 0xd7e3dbea, ++ 0xafc7a69c, 0xd7e3d655, 0x3f88c436, 0x6e1d7e3d, 0xbf34be3d, 0xc6fc3bb4, ++ 0x439fd58f, 0x57e157fe, 0xa476aab4, 0x57fa578a, 0x2a614962, 0x174ee01b, ++ 0x461728c2, 0x87b0ca39, 0xff77f839, 0x7e3540e4, 0x7ea076e5, 0xc3e7534f, ++ 0xd9df612d, 0x80788e40, 0x04728dd7, 0xcf410127, 0xaec7c8db, 0xd6205663, ++ 0x75f2e467, 0xd573d3dd, 0x2c8ed7f4, 0x066d5fa2, 0xf91ebdfe, 0x4df79d81, ++ 0x2c9a8124, 0x0bb75390, 0xcfa0efd6, 0xc2225ee2, 0xbdc42fbd, 0xf7dc1064, ++ 0x11f2c2e2, 0x6da55f35, 0x8373c128, 0x14f9f0c1, 0xe48f4fd0, 0xbd034fb4, ++ 0x4a4a5de7, 0x20fe0f40, 0x781f9d8e, 0xc5fb2d48, 0x2d5eaa49, 0xf826f378, ++ 0x70ca243e, 0xb42dbd5e, 0xea0832dd, 0xa3de3c8d, 0xbda84de2, 0x0d6fc606, ++ 0x25ae0c89, 0x8820c096, 0x38893483, 0x0992eb6e, 0xc3b32e78, 0x7cb10b7e, ++ 0x67d0b691, 0xfa51c5ce, 0x17f1b5bc, 0x6b9c40d7, 0x9e762993, 0xe9ab64ca, ++ 0xc1bfadfb, 0x937b792e, 0xeeaf2cad, 0x1e740191, 0xaacfd395, 0x879330eb, ++ 0xbf3a541b, 0x9c16ecb6, 0x4e21cbff, 0x90a47586, 0x61d6f3bf, 0x3ee39e74, ++ 0x0cf8d410, 0x528e578b, 0xfd01afdf, 0xf6b5fa82, 0xdc3e9e7d, 0x7020547d, ++ 0xd5546f4e, 0x5eb7f432, 0xa73e5275, 0x04ab917c, 0x16df0247, 0xdef01284, ++ 0x04c7ef1c, 0x2dd1faed, 0x733f8e82, 0x373575d5, 0x4c05e542, 0xf6fac394, ++ 0x60c11171, 0xe0780507, 0xeb8e1baf, 0xaab22f9f, 0xa4939776, 0xbc6f9f00, ++ 0xf79073c4, 0xdc4ed6da, 0x6ddc296b, 0x1c22fa4b, 0xd4e1e76d, 0xf12f2d2f, ++ 0xfbd6b145, 0x17c65655, 0xeb82249b, 0x7665a6cc, 0x5fee2f8c, 0xac157656, ++ 0xc8fd5fef, 0x73ac5573, 0x29fa51e4, 0x2963e59e, 0xf02c64f1, 0xe18e3af7, ++ 0x24bd36bd, 0xc6bfbe46, 0x6b7f1acf, 0x2cbe9d7c, 0xaf2b13ce, 0xb32b1bf1, ++ 0x0d97f2d3, 0xd7f024e1, 0x1c7872f6, 0xe7ad75b7, 0xfc6ee78a, 0xc0066d64, ++ 0x873c6de3, 0x1425b776, 0xa3764f3b, 0xb7fd89d5, 0x4357f5ae, 0xa90fdf1e, ++ 0xec9e8270, 0xe88ddfbe, 0x8218fd6f, 0xa59df0b2, 0xe39e2176, 0x5b216a5d, ++ 0xd42dde21, 0x00eedfa6, 0x65349ffe, 0x89f7853d, 0xafae1312, 0xc237449b, ++ 0x0420afef, 0x3c6a0fe3, 0xb234dfb7, 0xf33cfa25, 0xe7bcd693, 0xcf1e94ac, ++ 0x97485d59, 0x039b8f24, 0xf8ffddf8, 0xbbe413ab, 0xe919a2ed, 0x87f557d8, ++ 0xb75eefb4, 0x666dbb32, 0xbe0db29c, 0x28c9a527, 0xd38f6e27, 0xdc2464bd, ++ 0x1ef1409b, 0xf49d4725, 0x8977e3f3, 0x28e3aa1e, 0x1376893c, 0x145125f2, ++ 0x538ba5d9, 0x348e51fa, 0x8e6120b9, 0xa69b1e40, 0x1710b957, 0x18395076, ++ 0xc187b165, 0xa52c48ef, 0x5820a6f3, 0xd7f58589, 0x38ea9c22, 0xf2798d97, ++ 0xe1732f94, 0x90c11470, 0x42e22428, 0xd5be9aff, 0x04baf4f4, 0xeeb2f282, ++ 0x43502151, 0x442cd9fb, 0xc95f10ac, 0x487ce452, 0x64144a35, 0xbfde2f3c, ++ 0xa5fe6094, 0x09d7fb2d, 0x150b761d, 0xf0df11fa, 0xe7ed620b, 0xbe1a71f1, ++ 0xbd007f3c, 0xfb60fc31, 0xdc6f307e, 0xfb9e3656, 0xe9da0b75, 0xb543fa1d, ++ 0xf5d50ac7, 0x26e7dc77, 0xbe104f96, 0xb3ef4489, 0x6687f519, 0x31bb8c9f, ++ 0x8bf616b2, 0xc191fdc6, 0xe055bb49, 0x7cead1bb, 0xba89f43b, 0x51098e6e, ++ 0xcfbf427d, 0x003c8d09, 0x7ce560f7, 0x8bb8e4cc, 0xe7e8393e, 0x55df7f01, ++ 0x62f9188f, 0xa5ca9844, 0x86543eda, 0x1d5c34fb, 0x633f6875, 0xd3c93bd0, ++ 0x9da2a547, 0x119bf2ab, 0x1b7c9acf, 0x8d673ee5, 0xc19980fb, 0xc348fcc5, ++ 0x84eb8438, 0xbd06ce43, 0xf60f36f4, 0xc51e5b7e, 0x97eb8503, 0x7e947f20, ++ 0x5303e709, 0x431bfe60, 0x4e415b37, 0x127af3be, 0xe5475fa2, 0x7bc33f69, ++ 0xe0fae3e2, 0x3c04e27a, 0xaf3bee54, 0xa46127ae, 0x501c8777, 0x978e8939, ++ 0xe46ffc68, 0x6a3e4d77, 0x6c8de2e0, 0x6047673c, 0x20b9e59d, 0x2663065e, ++ 0x57805d9b, 0x51aedecd, 0x4fe25bed, 0xb56ffb47, 0x51eba88b, 0xa4f80066, ++ 0x75ecd446, 0x3e3a25b7, 0x9f91dab5, 0x54fda57a, 0x9fea45ef, 0xf1b39d45, ++ 0xbfe8ed0a, 0xf84a2f79, 0xafe33bfc, 0xab914291, 0xb898dfc3, 0x17f15dd1, ++ 0xbb08471f, 0xf9ffec2f, 0xf230cdf9, 0xe77203c7, 0x9e206efc, 0x7f542357, ++ 0x50daaee4, 0x93f19363, 0x5db96943, 0xffb682f5, 0x301e9dd9, 0xf298fbca, ++ 0x6e1803da, 0xbdde41e9, 0x84bf1536, 0x367d00cc, 0x96ed4c3e, 0x7ff2aeac, ++ 0xd79f9d5e, 0x76def0c6, 0x9060fb47, 0xa7bc0da7, 0xc5ed0e2a, 0x7604c988, ++ 0x76826ec5, 0x51df7b8f, 0x4b7bca27, 0xe9fd6e92, 0x51f8176a, 0x54fb353e, ++ 0xef8d4bb3, 0xeaa5d875, 0x47c5a37a, 0x2f2a46b9, 0xe2a79e14, 0xa3807e3c, ++ 0x57fcc5c6, 0x7a0ae038, 0xa7ab49ec, 0x46cbf806, 0xfb0712e7, 0x59c24325, ++ 0xd612de2c, 0xf27767c9, 0x5bc83368, 0xd607e290, 0xff5d3f3f, 0xc3dd7106, ++ 0x812e3633, 0x10b54bc1, 0x72fd37d8, 0x92ac1b09, 0xbf78fe60, 0x9afeece1, ++ 0xbeec397e, 0xcc712dcc, 0x286ad97e, 0x3c96b49f, 0x0512f301, 0x7ce737e2, ++ 0x5401b877, 0x153e4388, 0x3e01d4a7, 0xce0a452c, 0xdc45c323, 0x8677a51c, ++ 0x6f20e410, 0xe65cb122, 0x7491fc58, 0xfed23fee, 0x3ce58a32, 0x818c8fe0, ++ 0x668dcf04, 0x83149d80, 0x89c6af4e, 0x6f5ecfdf, 0xe60e72e8, 0x9a7e5555, ++ 0xa4df3a25, 0xa60e7662, 0xc143ee23, 0x3ab6fc07, 0xb6c9c0ee, 0xacfb605e, ++ 0x678604fe, 0x0406ffa3, 0x6a097983, 0x08897efd, 0xaff444d6, 0x7ebfc0fc, ++ 0x2bfd0593, 0x4107711b, 0xc7147edf, 0x39ebb3e2, 0xffa806f7, 0xc0b7685c, ++ 0xdc9a3f3d, 0xc8f0f268, 0x02dddb84, 0xe379d57d, 0xfbe0e1d9, 0x0f78b952, ++ 0xe13adcf0, 0x3875e0ec, 0xc64cf693, 0xcbaf0a77, 0xd7e8d7b7, 0x67e8ea28, ++ 0xb44ab885, 0x4348779e, 0xe56f6ec0, 0x57e0dce2, 0x31c3deb5, 0x7a8b3978, ++ 0xcdd0411e, 0xfcc6cd33, 0x7f553691, 0x0b2e3dfe, 0x4f5b51f9, 0x6036fce8, ++ 0x8f30d7fc, 0x86a8738e, 0x73c6a773, 0x1dd969a9, 0xcc74a071, 0xe0912dc7, ++ 0x3672332e, 0xce3b4364, 0x24cf6ceb, 0xa64bce31, 0xcf31ac46, 0xc5256b05, ++ 0xb780d7db, 0x012ab154, 0x5dea71f4, 0xf1188f4c, 0x47f9c6d1, 0xda3ec334, ++ 0xf998c41f, 0x96995a28, 0x12c26b76, 0xfa5a7efa, 0xe7b52c14, 0x66217675, ++ 0xc6c9315c, 0x9373bf7d, 0xf062c475, 0xb46c9337, 0xf79ed3bf, 0xfc50543e, ++ 0x5eee31db, 0x5ef0c717, 0x5ef0c717, 0x94f86927, 0x3afe41e3, 0xde5d6eeb, ++ 0x259f46d3, 0x443c8041, 0xe7ca3a7f, 0x77a31752, 0xda0afbe7, 0x32887d37, ++ 0x89282e65, 0x8ed9228d, 0x43e2cf7c, 0x5f90f9da, 0x804d9efa, 0x2db7297c, ++ 0x2df7f54b, 0x0c09be8c, 0x271bf3ee, 0x6429b8e3, 0xc53075ad, 0x9312b2f3, ++ 0xa746e21b, 0x09c9fd17, 0x6517a647, 0x3c82e4b4, 0x48f9c2a4, 0xde69defa, ++ 0x267986e3, 0x954551d7, 0xe402f8c4, 0x0a69d292, 0x342e77ee, 0x1ebbccc5, ++ 0xa7fb6363, 0x585ce347, 0x434da5a6, 0x8bd6753a, 0x312fc013, 0xd79529f2, ++ 0x3aa325f4, 0xbe5331cf, 0xe4316c51, 0x8d244dad, 0x616fae1c, 0xc6b257c4, ++ 0xd6deaace, 0xe41925e4, 0x4aadf610, 0xe8d51ea8, 0x357d403c, 0xf8a2e305, ++ 0xf8de85c7, 0xe70dfc1a, 0x17a8f98d, 0x43223935, 0x82b79e98, 0x878a8dde, ++ 0xd47d35b6, 0x3f1df61f, 0x0e73b7f9, 0x8bfa77d8, 0x3d00eed0, 0xf7befc7b, ++ 0xe98e701d, 0x5c58fb93, 0x9f836ee4, 0xf4c6d8b6, 0x64ada37f, 0x816bcc1e, ++ 0x9eb91fef, 0x6b257e28, 0x3dc9fed8, 0xde70de01, 0x506f7f5d, 0x70c93045, ++ 0xf11f908f, 0x8ec4215a, 0xb1b26feb, 0x3b3dcb78, 0x321948b6, 0x8729ef8c, ++ 0x7eab8ff1, 0x7606f1e8, 0xcf06957f, 0x24231da2, 0x12fecdf0, 0xeffbab32, ++ 0x3f5b222d, 0x3fd86294, 0x3378a8f3, 0xdeacd9c2, 0x71f4bdab, 0x90b31f96, ++ 0xea86b58e, 0x9d884f61, 0x63ce30f7, 0x617227e9, 0xd2de252a, 0xbbf43907, ++ 0xe8fbfde1, 0xf359e67a, 0x19b3ee00, 0x5ef5d9e7, 0xb3fd051f, 0x8dbd2ae5, ++ 0x87976de7, 0x12f83ed8, 0xecf941e2, 0xc436fe72, 0xe318c5ce, 0x660f678d, ++ 0x3f0f00db, 0xc4f1a9b7, 0xce06325c, 0x383aef6d, 0xf74afe20, 0xef529f56, ++ 0xbb7b828b, 0x23ee3ca1, 0x2303ce58, 0x3cbbe290, 0xf0216ef4, 0x4ee36557, ++ 0xdbed0fbc, 0xd08aa3ea, 0x52e42709, 0xda897a6b, 0x8e81dba1, 0xb3a70964, ++ 0x9cb72b4f, 0xcd5f9893, 0xfaa773f0, 0xc7c04efc, 0x96f7c870, 0xd2813a7f, ++ 0xf172cefb, 0x697df47c, 0xfbf4d82f, 0xaf9dbdf0, 0x750acf36, 0xbf9b4aff, ++ 0xa9e7ef91, 0xdb64b87c, 0x297df5f4, 0xbe9a6a4a, 0xc5cf54c8, 0x8d20f9e1, ++ 0x929396af, 0xfc18f4c2, 0x83b3d1a3, 0xc33f424f, 0x5c7468f9, 0x9d50bb52, ++ 0xdd4d3fb7, 0xf8834c3f, 0x7a6f9194, 0x2add973a, 0x9e413246, 0xdad17c8d, ++ 0x7b27fdcd, 0x589ecc6c, 0xa0852b22, 0xbbb9a937, 0xcf6515de, 0x9b6a171c, ++ 0xb672027f, 0x8779f18d, 0x182703de, 0x225bf9f4, 0x1d2bf7ae, 0xf7dc2a72, ++ 0x071af487, 0x3f6608f9, 0x738da7bc, 0x0328a7cc, 0x1177c045, 0x257d2796, ++ 0x9d41c0ca, 0x9d36cbed, 0xddbd8273, 0x9c608436, 0x87a1d5a8, 0x8f1b4bf7, ++ 0x954be27a, 0xcb42e51e, 0x1d067f37, 0xf305adb5, 0x525d8e2c, 0xcc974ce3, ++ 0x29e6b145, 0x4a3ad9d9, 0xeecd7bd4, 0xf34ee556, 0xf4a81663, 0xf6c43bbb, ++ 0x9e6d17cf, 0x92e8f48e, 0x3ffaa96f, 0xd4381b0b, 0x2cfa4633, 0xf98cdf75, ++ 0x79038b67, 0x7a177df8, 0xee918791, 0xed79ba46, 0x9b6f762e, 0x3dc12550, ++ 0x7336c776, 0xa2b8dfb8, 0xcb38bd1b, 0xf356fa6e, 0x3ba3ce31, 0xab6f97f8, ++ 0xc097df5e, 0xc04847fc, 0xb5f846e7, 0x0a252ff9, 0x7cea4bd3, 0x89179bbb, ++ 0x32f2c4dc, 0x1efe75d4, 0xfb02a738, 0x2cf30f25, 0x3b8d5b7f, 0xf06bf069, ++ 0xc851e71a, 0x8279e397, 0xf31e3ab6, 0x07f6efb0, 0x09efc3d6, 0xc38ebddc, ++ 0x3a3bb6f5, 0xdb447a69, 0x5c6ca9df, 0x1e5a7988, 0xadd80fda, 0xb6131f6d, ++ 0xc381b12f, 0xa5badd7b, 0x27e58867, 0x424f4775, 0x5096dd18, 0xd9bf81ba, ++ 0x3c84bef5, 0xbef46065, 0x328a6050, 0x8a9f7a30, 0x653f3104, 0xdd74fd45, ++ 0x5ebb22f3, 0x7f24f78f, 0x66212aa4, 0x37934b3c, 0x7934fe4d, 0x6665daf4, ++ 0xe6810a5f, 0xcfc02c8c, 0x50cfe8a3, 0xaec73cfd, 0xa5cc4bee, 0x3a6e54af, ++ 0x5897dba7, 0x6bd1963a, 0xcf8c5f29, 0x14b3d3bb, 0xbd3d3a0f, 0xbbcfaec8, ++ 0xd1f3bef8, 0x89c9a1e6, 0x9ca33f36, 0xd237bf18, 0x19e78b43, 0x07a462e9, ++ 0xc57e09c0, 0xc0b64ddb, 0xdbe70a5a, 0xdfdb831c, 0x5bb84564, 0x702926d3, ++ 0x7d32b34e, 0x807f963e, 0x1ec1d30f, 0xa3b6a92c, 0x5dfaa87f, 0x87177aa3, ++ 0xb0ed51c8, 0x48caad97, 0x24a9ce76, 0x6264f809, 0xc5866475, 0x0fa3c845, ++ 0xf7085cdf, 0x347c4fed, 0xef420332, 0x853c3f8f, 0xde47b7d5, 0xfee1b8b7, ++ 0xf10b5bfe, 0x2fd07dfe, 0x52bf7e30, 0x6ddf7c1b, 0x5cae789d, 0xa3fbd997, ++ 0xd9f325cc, 0xbdacd5bd, 0x1663da9c, 0x1f95deba, 0xc81afc1a, 0x714b796f, ++ 0xca81c411, 0xd74ee221, 0x19c50abb, 0xeb670db6, 0xdefa78fc, 0x1b679b61, ++ 0x75c5d7f2, 0x1f962eb8, 0xc8be5012, 0x158f1641, 0xf4ad5ce8, 0xd47175bb, ++ 0x5df8a62e, 0x83716897, 0xfb9f4c1f, 0x975e3fc1, 0xd472c8a8, 0xf07e8d73, ++ 0xceb1c01d, 0xf607f2c4, 0x3e3839bd, 0x603b0572, 0x83148f9f, 0x67c072ff, ++ 0x9ed8d2c1, 0xfcf0b927, 0xc5899e46, 0xefed8c47, 0xc8987a68, 0x9517c019, ++ 0x7f942507, 0xb37b03f8, 0xa9393082, 0x59dcec24, 0xe78221c5, 0x160f2a6c, ++ 0x381b39e2, 0x4ea9f087, 0xce6bfc0f, 0x15f274d9, 0xc0be53c3, 0xe3510b15, ++ 0xbaadd816, 0x1a6a9f3a, 0x7c21f302, 0x89ce1b9c, 0xaaa619f0, 0xfcfe745d, ++ 0xf8a4b455, 0x1e6e5c10, 0x9da99bee, 0xfb879134, 0xfbd46ab2, 0xec4c6a68, ++ 0xde36bc3c, 0x5a3f1551, 0xf251d7d9, 0xf4fdd029, 0x36b92d3b, 0x7e827fb6, ++ 0x1adf36b4, 0xf81c214e, 0x3c13af67, 0x4c9390bf, 0x6cfe000e, 0xfc0b1944, ++ 0x55123926, 0x6bfdb37c, 0xa50197fa, 0x8dfa6cdb, 0xaffdf94c, 0x10b8ff0f, ++ 0xc77609ee, 0xd165569b, 0x8fbb65fa, 0xe74c33d5, 0x730b28b2, 0x5fab3f0e, ++ 0x80373a67, 0x354779d6, 0x2b46c3ab, 0xc744f85d, 0x50ff42da, 0xf7e54718, ++ 0xc075ca1d, 0xc58982df, 0x12fd8471, 0xf968e7ee, 0xcf28eb29, 0x0e4a3f00, ++ 0xaa65c599, 0x41b79ff3, 0x915f3c9c, 0x8f625f21, 0x77d1ef7a, 0xf2bc352d, ++ 0x07de1336, 0xdfe02506, 0xd4f860e1, 0x941a42e8, 0x976f20eb, 0x60eb9504, ++ 0xc3afaf1f, 0xfec072e3, 0x132ddbc4, 0xbc379f41, 0xbc5ca7f7, 0xd62afdbf, ++ 0xa9b7c8cf, 0x73e748cf, 0xb7fdb7fa, 0xf78bef44, 0x81f5e475, 0xd01928ef, ++ 0x1764e57e, 0x61ca93b9, 0x2964428d, 0xbd6bfc1b, 0x9840d93f, 0x2b6c3a7e, ++ 0x7d40efe9, 0x6c75c612, 0x4323dd8d, 0x9327e8dd, 0xe55ec496, 0xd7c349d9, ++ 0x6250fee0, 0x45e1e346, 0x8efc2eb0, 0x29c24bdd, 0xbe9be60a, 0x1b3f71d4, ++ 0x8d9438c1, 0x4e21b9c4, 0xcd24dc4c, 0xd3c6a29f, 0x92af8c4c, 0x65fca373, ++ 0xfbf43e75, 0x1f8bc802, 0x0cf96363, 0xe83c7e74, 0xc64411d7, 0xc5c42472, ++ 0x1ea481b2, 0xc121efac, 0xfda13fc3, 0xf165663f, 0xd13d4b28, 0x38171bc5, ++ 0xc1ba5d98, 0xdbfbb229, 0x60ede0c4, 0x219dc457, 0xda2bb02e, 0xb8092d7e, ++ 0x6eb82f1f, 0x66ba7dc5, 0x9fb5c613, 0xd82e0311, 0x46bf6a1f, 0xce92b790, ++ 0xba54dafe, 0x263efd6b, 0x9c40d7c9, 0x564e67ef, 0x608f267f, 0x09fb76de, ++ 0xb7fb0029, 0xaa961989, 0x1cd1f8e8, 0x9b77b307, 0x3bb7f95c, 0x14dd9e20, ++ 0x31fc6047, 0x404ce37b, 0xe477e78f, 0x5e2f8158, 0x3c511c02, 0xf75d9a24, ++ 0xe7897f42, 0xf859bc28, 0x0bf3e59c, 0x8a7888f2, 0xd8b7f1df, 0xeb37b865, ++ 0x16f06b19, 0xc17d53cc, 0xbf04f784, 0x43a7b924, 0xb2b3a5fd, 0x33f0f40b, ++ 0x9c38c159, 0x9c260bcf, 0xed714bcf, 0x70a4aed7, 0xc584343f, 0x111b04b7, ++ 0xa60b3f40, 0xf05ef97c, 0xd63e5453, 0xaa13f5f4, 0x11c63d1c, 0x9820b73c, ++ 0xb48e50f2, 0x76b6a1fc, 0x7d43f982, 0xc0f0b666, 0xb5d371cf, 0x87985338, ++ 0x1284d0f8, 0x04dcf682, 0x5ae788bb, 0xce197f20, 0xf5544db7, 0xcb8fc4f0, ++ 0xb03e598b, 0xe3dc10fb, 0xdeaec079, 0x6beea607, 0xc9f2a4de, 0x5bc2248d, ++ 0x178dfb68, 0x059c3b89, 0xf7ebe7f7, 0xd8369e1f, 0xfed59397, 0x01577695, ++ 0x7a23ce3c, 0x5d726ffb, 0x0f5809e1, 0x002289f3, 0x18b24d3f, 0x748ec1da, ++ 0xfafbbdc2, 0xaa1c1be7, 0x324994bd, 0xb4d6f3a3, 0xfcc9a77d, 0xbf684dd0, ++ 0xc06e4916, 0xf2bb4ecb, 0xf803e411, 0xa572445b, 0x3ed3e438, 0xe4385f96, ++ 0x15c08da2, 0xed3f9485, 0xeb6b9f30, 0x3a56fd6a, 0xb2076bef, 0x410f81fe, ++ 0xebfd5cbf, 0xf7d024e4, 0x697a5563, 0xc077c6a5, 0xc678ae5f, 0x3bebae5f, ++ 0x83bb73e5, 0x7934f3c5, 0x7e83be03, 0xf98188f6, 0x29b7f6b1, 0xbd076ebf, ++ 0xd04ed3b1, 0xba69fb8f, 0x99c80e65, 0x9529ce36, 0xfae58daf, 0xe0fb95ea, ++ 0x17fc9e77, 0xd051bad8, 0xbd14a2f7, 0x302527ee, 0xd72bddff, 0x790698ce, ++ 0xf3117667, 0x73d452ca, 0x92fcd150, 0x1a2fc51e, 0x59dab5df, 0x9fe3485c, ++ 0xe7dfbb49, 0x0ba4f9e1, 0x48b2b884, 0xf1a2bf87, 0x187f44cf, 0x12277df7, ++ 0xf9189fe6, 0xfc375767, 0x165e7793, 0xe1756f40, 0x7f8c839f, 0xda1be3ba, ++ 0x6163de0f, 0x87169fe4, 0xcb743fea, 0xfcf0973f, 0x49a6eafe, 0x6c9fdc57, ++ 0x51f3e9f4, 0x5b38e58d, 0xa7657cec, 0x52ddf78a, 0x41c3aded, 0xb1354c6f, ++ 0xc9027af3, 0xbbc29db8, 0x27bb4e3b, 0xea1b2abf, 0x87a6053b, 0xa8cc8676, ++ 0x3dda7687, 0xa6d78c1e, 0x5579d859, 0xf38113c1, 0x16beee07, 0x4777fa39, ++ 0x71b0769e, 0xdc786282, 0xbf8f6017, 0xec60f8c9, 0x521e1cd4, 0x3097d2cf, ++ 0xb8ea30bd, 0x6f7e05b4, 0xde6751ee, 0x298bd039, 0x8be03b80, 0xabde12a3, ++ 0x42547954, 0xbddbf8fd, 0x3c4216ef, 0x1e6bcb54, 0xc2dde7b3, 0x3b3f887c, ++ 0x5dfdbf19, 0x8ead3be5, 0x5f403e47, 0x1fd9ee1a, 0x4afe71d7, 0x097e4f7f, ++ 0xcef0d1f0, 0xf1fde376, 0x5fb638c1, 0x22c89b32, 0x68e3310c, 0x9d70fdc9, ++ 0xf91ef199, 0xde7661d9, 0x4f21e66d, 0x55e47bec, 0x67de30fe, 0x64efed4e, ++ 0xcfdfd827, 0xd085ecb7, 0xbad99108, 0xaeaa941d, 0x55467e63, 0x2693f036, ++ 0xf147f887, 0x8864fc17, 0xe60c77ee, 0xc3d1eba9, 0x47dd816e, 0x1f709115, ++ 0x7d8467f2, 0xb1d75417, 0xbe16671c, 0xc5fab397, 0xc8e700f9, 0xd000e552, ++ 0xe3c5dea5, 0xb0939ff3, 0xe6e81b25, 0x24ff7016, 0xbe93ca28, 0x23df3ae0, ++ 0x3b10c942, 0x27d3df6d, 0xff8c246e, 0xda33d3a8, 0xd0a07609, 0x1bbe107e, ++ 0x24673e33, 0x88fb71e8, 0xaeb04975, 0xb8537069, 0x3bdbb68a, 0x1ae0d0e1, ++ 0xf2fc64e0, 0x68e173a8, 0x077c03c0, 0xc8f1a97a, 0xaf7c0b31, 0xe9b043f1, ++ 0x2883e30c, 0xe83e00be, 0x016e0be4, 0x4c3c35d4, 0xab41f954, 0x42f9b3ff, ++ 0xc8f46b8b, 0x70b71017, 0x98be277e, 0xf235780d, 0xeee7b505, 0xe7b0c676, ++ 0x93cb1282, 0x635f3e34, 0xddf7c3cf, 0x273cc112, 0x7ecad7b2, 0x8093d0c7, ++ 0x71bf1efb, 0x3edb31b1, 0x4d499639, 0x93af7251, 0xefdaf5d9, 0x73088ca6, ++ 0xa08e7f68, 0xb44ee28a, 0x9ea1faf3, 0x23f8ab74, 0xee0e38c7, 0xf85cc517, ++ 0xc343b00c, 0x8daf6049, 0x41871730, 0x26d9761e, 0x98fd8066, 0x0d909b63, ++ 0xc8657ff3, 0x4960b7ea, 0xe96fa57b, 0x9dc9b66f, 0x0fa695f6, 0x6adda80f, ++ 0x6c9dfbe3, 0x6149bb7d, 0xaf409be7, 0xada1c347, 0x8026400f, 0x36cf0b83, ++ 0x1ea1b65d, 0xde28450f, 0x2838026e, 0xa471f61e, 0x3c87ec01, 0x093c9293, ++ 0x613ec0ec, 0x6b6ce001, 0xe2133afa, 0x37a1c59d, 0xc5bc030e, 0x5babbeda, ++ 0xb46aefbf, 0x487b35b7, 0x7b343ff3, 0xc17bf349, 0x05f682ae, 0xfc1773ea, ++ 0x6fac0ace, 0x9fde0b61, 0xf959d8f0, 0x6795451a, 0x58a3ce81, 0xa46dc79d, ++ 0xeed2e105, 0xe2a6994f, 0xf520f8a3, 0x3b438757, 0x1e295321, 0xa7f7aaa6, ++ 0xefeb754c, 0x6c6db887, 0xb453fbec, 0xdf7a7a7e, 0x60dc6eb8, 0xbefa7fd8, ++ 0xbb1f41e5, 0x3ef7e52f, 0x1f8f0fe6, 0x5805fbc0, 0xb166c77f, 0x0c5c26fb, ++ 0xd8a5070f, 0xaa57d8eb, 0x45378f3c, 0xebf9c386, 0x8efe7b7d, 0x3dfee6eb, ++ 0xec10ff7f, 0x042771c8, 0xe3b87902, 0xc78a8c4f, 0x32b1807c, 0xafd695f2, ++ 0x1b06f3f7, 0xf449cf61, 0x5334cbef, 0x01ab9478, 0xaf960b3e, 0x17ec7a9e, ++ 0xa3f9dfd0, 0xe73e8902, 0x06792851, 0x50be5c42, 0x66a19dfd, 0x5a53d98e, ++ 0xfbfab37b, 0x6a717f1e, 0x411688f1, 0x1cc557bb, 0xeaa9e745, 0x5d1a1f7d, ++ 0x3a2f1ea7, 0x4aef0c21, 0x67fbf81f, 0xf8b421c4, 0x2f5519c3, 0xc47f0392, ++ 0x373738f3, 0xfd802bdc, 0x4f1a737e, 0xa771a894, 0x8fd3d4c8, 0x771c438a, ++ 0x03dfec1a, 0x1a62fecf, 0xcdbf29e4, 0x37a3ca63, 0xe1adf3b4, 0x63e16f50, ++ 0xc462a3de, 0x7ba1cdef, 0xd9951ef1, 0x7a3e4cf1, 0xb5fc7f1a, 0x07ae4f94, ++ 0x076613ba, 0x487bb2e6, 0xbfddf48c, 0x22923fe7, 0x77c7bb43, 0xd237f477, ++ 0xf953d5e1, 0x13d56fb8, 0xbb7c8c3d, 0x7fd3ce97, 0xaa4efc35, 0x77f1f885, ++ 0x7f585d52, 0x758697cd, 0x4dbd5f8d, 0x9d81254f, 0xe4e9f1a7, 0xe337c624, ++ 0x8922ff76, 0x65e93bd8, 0xf175dbc4, 0x5b2f7e8c, 0x3dc4bb35, 0xf47d1a6b, ++ 0x90875d3e, 0x05a4fd51, 0x544ac4f2, 0x2a1f6758, 0xa884bb44, 0xeb8c57e7, ++ 0xcefe6cdb, 0x7b4ea0c9, 0x999f9dfa, 0xfd5ec2f2, 0xdbd14e3e, 0x83ac02b5, ++ 0xa66ac285, 0x5e3b54c7, 0xe748c783, 0xc209480f, 0x467c1ddf, 0xf9c2303e, ++ 0xbd7e4772, 0xf681eb82, 0x063337bb, 0x31898966, 0x63e1a1e6, 0x71eba126, ++ 0xe3d7ef76, 0xfdbd78a2, 0xc178ee7e, 0xeed6803b, 0x3748cde4, 0x3fa6bb63, ++ 0x1c80610a, 0x9f60fd2c, 0x414f8ecc, 0x28bc2879, 0x25f20511, 0xf1cfe9fa, ++ 0x91abe293, 0xd8b956df, 0xadf8eeb3, 0x3c4f22f2, 0x4ef93b23, 0x06d47c6c, ++ 0xa85bb77c, 0xf51c41b5, 0x1af4fb46, 0xcf82bd10, 0x7de267f3, 0x81131115, ++ 0xd0e4dad0, 0x67100399, 0x78261ef0, 0xb43f219e, 0xe9f0126f, 0xfa0b426b, ++ 0xa9e76d59, 0x776516ad, 0x6c6a8636, 0x26359760, 0xcd78f3b3, 0x2f974409, ++ 0xafca95fd, 0x4ecf478d, 0x0fb46253, 0x3e7d3173, 0xc3c92883, 0x370b3fe9, ++ 0x3f00fe50, 0xe3038fb8, 0xfb9c0524, 0x5bb064f5, 0xb1fbb2e6, 0xbcc69adb, ++ 0x6de14c9e, 0xf5012bbd, 0x07c6e4cc, 0x425175ee, 0x1231ff04, 0xe42fb79f, ++ 0x4284bef0, 0xc2f58dd9, 0xf7e85925, 0x6926f98d, 0x4fb43146, 0x99efd111, ++ 0x100b97cc, 0xc69d3aaf, 0x7b1dd5e1, 0xfc3548b8, 0x3a7fb0fe, 0xfcb8871b, ++ 0xbe9fe049, 0x02349c57, 0xd64f237f, 0x77f083ea, 0x7fc18916, 0xb9f2fd5b, ++ 0xbeda667d, 0xf987167a, 0x195d93c5, 0x3fc51fc4, 0x9c241b85, 0xd4a1edd7, ++ 0x19ebe07c, 0x8e73fa45, 0x9c9ed561, 0x81236255, 0xce48fde8, 0x6cdd7285, ++ 0x7f03bf6d, 0x2449bc37, 0xce4d3f30, 0x7df9516f, 0xdd249cf6, 0xb309d377, ++ 0xbab9353b, 0x5bbf9555, 0xae79bf54, 0x7e374327, 0xd0f66109, 0x017b481f, ++ 0x2ec7ec90, 0xad3d1fb6, 0x7cd0e5bd, 0x37ef8978, 0xade1f41a, 0x2f7e0c43, ++ 0xf90ebe5f, 0xe3738d22, 0x7d6e31bd, 0xf5636dfb, 0x1afca375, 0xc82cc3f5, ++ 0xeabbe3da, 0xcc1f4d09, 0x8845e26a, 0xa3cacd07, 0x58bb4678, 0xa4f7b76f, ++ 0x75c4c62f, 0xc92e2fa3, 0xd21983f7, 0x5c7c5f45, 0xc5f49df4, 0x32dba96f, ++ 0x3bf5ca96, 0x4fe8de9a, 0x98de83fa, 0x05f8efcc, 0x5d1b51f0, 0xf831cd37, ++ 0xb4775b48, 0x95214038, 0xa703d463, 0xe4cc7ed8, 0x3fc4e98b, 0xd00e33b2, ++ 0x5da847a1, 0x2f618ee2, 0xd6cf8a9d, 0xa1d24fdd, 0x12eca257, 0xdbfbf731, ++ 0x3da99325, 0x7c00e52a, 0x42be10fd, 0x42921ef5, 0xf882b048, 0x8c19da61, ++ 0xea057903, 0xfcfae2cf, 0xf473d314, 0xa7625c5f, 0x15ed187c, 0xea5d0e2d, ++ 0x3d29ecd2, 0x23c474bf, 0x577bb267, 0x04293e35, 0xcffc827c, 0xc09f71e4, ++ 0x1bff37c8, 0xfa32ca23, 0x00008000, 0x00088b1f, 0x00000000, 0x7cbdff00, ++ 0x55547809, 0x753eeeb6, 0x2a490d4e, 0x62c65549, 0x4a61270a, 0x0843c048, ++ 0x91602018, 0x520c6201, 0xad0e2280, 0x210c0e05, 0xfaf5cd09, 0xe76f6dba, ++ 0xd11a0484, 0xfdb1c5af, 0x15fbbe9e, 0x2b8fbd5e, 0x30188a41, 0x015b9260, ++ 0x06d88081, 0x9f3e01c1, 0xa88d2a5d, 0x6e874921, 0x3efdd82f, 0xef6b5ade, ++ 0x8a555493, 0x77befa6e, 0x66f6d25f, 0xf5af3d9f, 0x610f69af, 0x4cd9532a, ++ 0xf83096c6, 0xb05b1951, 0xd3dcc2d5, 0x7f36ef21, 0xfa31b415, 0x05ff06b9, ++ 0x635e1262, 0x33739889, 0x5dd8c696, 0xbfb2fea2, 0xf3f19ba8, 0xfaf0f2b2, ++ 0xdf85b177, 0xdd8c094a, 0x3666bcc1, 0x3d3bb18e, 0xff4fe591, 0xbbf28641, ++ 0x4f7f8456, 0x5ca7c471, 0x8c7f8388, 0xc9afe367, 0x4dc9958c, 0xc05edfcf, ++ 0x5949df58, 0x266af2b3, 0x0751ff1c, 0xf6d1ff1f, 0xc7967492, 0xc53dbbd8, ++ 0x8f485e89, 0x270cc1d6, 0x6755d631, 0xe404f4a3, 0x1af0d07d, 0xeb02dcfe, ++ 0xdfaf30b3, 0x94f6290e, 0x92cea94f, 0x80e09b18, 0x7f21534e, 0x0c9fd605, ++ 0xd863a365, 0x5e62d9d7, 0xc91d8c59, 0xa0fb9736, 0xa7f4075d, 0xe801bf43, ++ 0x0f7e875f, 0xff2839d5, 0xf28b9d5e, 0xf5129ca3, 0x13089353, 0x4558c19c, ++ 0x2f769dce, 0xc8e35bb4, 0x9cab3ca2, 0x1b7a4264, 0x797b2ff3, 0xde81d334, ++ 0x14ab8247, 0x5ab18529, 0x3359a497, 0xab00f887, 0xfa84afb1, 0x35de8295, ++ 0x83e6255b, 0xaf9f95ef, 0xbf4064af, 0x0f1876de, 0x2a5b53e8, 0xcff06cfb, ++ 0x9f67b692, 0xb33379e7, 0xf886d44a, 0x852f88bb, 0x153a57cd, 0x58b38c1b, ++ 0xc6193493, 0xf6f1b771, 0x9f25bbb7, 0xa45cff0a, 0x23a3f385, 0x44cbef82, ++ 0xfff18b3f, 0x72e2dda0, 0x7e8017c9, 0xb7861716, 0xc165765b, 0xe1d4d2b7, ++ 0x7c865a38, 0x2f1c3a9f, 0x8fbe0ccb, 0xef916365, 0x7e962f97, 0xf10d9538, ++ 0xe48d322d, 0xf5f96473, 0x6feabcf8, 0xff68d9f0, 0x11bcf8b7, 0x3cfc8269, ++ 0xc6a2d57c, 0xedb0b633, 0x79f20aa7, 0xfa8515e1, 0xe4f5c6ad, 0xcb067942, ++ 0xb1fcf5c0, 0xdb99ff27, 0xdafd50d9, 0xbc583fb6, 0x9ebfae53, 0x37be35bf, ++ 0xe075a551, 0xa1bceeb8, 0xc0142b71, 0xb6f3ac20, 0x46fa70ec, 0x5f9235f2, ++ 0x48bb444b, 0x58896d7e, 0xd617c187, 0x111a2003, 0x6457ee85, 0xf8f5c79a, ++ 0x8b17c836, 0x3796bc77, 0x7fb19cbc, 0xf50eba21, 0xbac4f827, 0x3e14cf15, ++ 0x3c88732f, 0x44f5ae00, 0x17656fe0, 0xc4c2c40b, 0xff2c5d16, 0x9354c156, ++ 0xeb2157d8, 0x0caf9fc0, 0xfd43cb3e, 0x41195d97, 0x5b8c67f2, 0x92dd30a6, ++ 0x5cb9df8f, 0x06afce46, 0xf58099fb, 0x96ffa275, 0x7e15a61d, 0x0b5cc758, ++ 0x6983c07b, 0x1c5b4f2c, 0xdfb7f512, 0x7d7aa261, 0xd899b27f, 0xe9ed8c4d, ++ 0x30662f48, 0x78eacd3f, 0xdfa2f51f, 0x7e7da8cc, 0xe6e7e702, 0xc0c7a678, ++ 0xb6e94cf8, 0x4a270079, 0x20d96331, 0x8b48ca67, 0x6cba01af, 0x941e0252, ++ 0x614d3ebb, 0x537720f5, 0xb38c1db0, 0x2f7e90f9, 0xfe6c9603, 0x21a9a26a, ++ 0xba07db13, 0x9bbd40e7, 0x1b7515f3, 0xd55a7154, 0x6f79629f, 0xed81d5bb, ++ 0xb7fc0efa, 0xf3f6334e, 0x0cc1a627, 0x00ed7bd9, 0xb22f282a, 0x37a87d9b, ++ 0xb293e4ca, 0xfd7df209, 0x2a3ea18c, 0x6128115a, 0xacb9b7c0, 0xe901c1bb, ++ 0x1463e46c, 0xf5c55dfe, 0x6b7ae0ce, 0x9e69f004, 0xa13cd3e0, 0x65da4aaf, ++ 0xf1251bd2, 0x0e658fb2, 0x045ba7e9, 0xdde9e68f, 0xee308925, 0x1ad2453c, ++ 0x15cb7f20, 0x6f8f0c25, 0x69ba3ea1, 0x89951f48, 0xaafdddfe, 0xcd819602, ++ 0x2df8e167, 0xa87ae56b, 0x5df116c4, 0x49681fd8, 0x84732ab8, 0xdd46cf97, ++ 0x60bef809, 0x25e85fe0, 0xca7f6116, 0x0424bfe4, 0x2c7b0e81, 0xc0e74fee, ++ 0x994ffbbc, 0x9df06bd9, 0xaccc845d, 0x8d69f4e1, 0xe99147b0, 0xb7588e81, ++ 0x83daf30a, 0x7e63b238, 0x7a9d5ba4, 0x8353fafd, 0x8cb8c5fd, 0x154b4d3d, ++ 0x3cb04596, 0xa21b4ae3, 0x0afa30fb, 0xb5d2443e, 0x7779e859, 0x543de3ab, ++ 0xd8e8c3c3, 0x79ec80b5, 0x05551fc9, 0x4bdfdf55, 0xf65e434f, 0x2375885c, ++ 0x185cf7fe, 0xf479c6e9, 0x1bdc73c4, 0xfce070f2, 0x51ea2c40, 0x00aaa7a0, ++ 0x369dfa4e, 0x33c235ed, 0x88ff0397, 0x906dbe89, 0x71cf1f3f, 0xffb627bf, ++ 0x7dd22e44, 0x0d7b4991, 0x8c365187, 0xf5053a5b, 0xe7a5d6e7, 0x6e498ccd, ++ 0xe40cfd26, 0xec1d5249, 0x9075483e, 0x9e9fc427, 0x27287cc4, 0x3867e666, ++ 0xbd9b836e, 0x22bce982, 0x3ee91135, 0xdb767d00, 0x11353fb1, 0x72fecf71, ++ 0xca67a679, 0xd737fa70, 0xe3028f31, 0x3cd9d4b4, 0xfd85e80a, 0xb7ca0e75, ++ 0x3d28b9d6, 0xba52a758, 0x9f84fde9, 0xeb50ffa1, 0x109478b6, 0xc49e52bd, ++ 0xd03cc3f5, 0x79af383b, 0x80e9f24c, 0x304f79bd, 0x03904792, 0xf90926df, ++ 0x1ec9eb05, 0x67f027a2, 0x67921820, 0x8ce34a8d, 0xe20a9234, 0x89ae7e7b, ++ 0xe01383da, 0x7873237b, 0x587fe07d, 0x5bf0b97e, 0x4bba77ee, 0x65be909c, ++ 0x813994f7, 0x5dd2cdbe, 0xca312f87, 0xcdefc42f, 0x25f2ddd2, 0x607a7fe8, ++ 0xd819fb3e, 0x18c0e98b, 0xdcfc2ba4, 0xd19ff38b, 0x1fc86169, 0x9f24ac30, ++ 0xfe7c86f9, 0x60174920, 0x6ba1143c, 0xb59da0a3, 0xda788032, 0x48c982cf, ++ 0x279b02f7, 0xb977e50e, 0x2dc1e393, 0xa092e9dd, 0x16a959bf, 0x3a55464d, ++ 0x037d33ce, 0x1533afd0, 0x9dfa8406, 0xd5a3699d, 0xb1db443c, 0xddbe50cf, ++ 0x26407b36, 0x09ee64c3, 0x74f3d886, 0xe503aaf6, 0x35dc7517, 0xbf5d23b0, ++ 0xcf49d04b, 0x50f8b15d, 0x4e9d75af, 0xce3002d0, 0xf2362bdc, 0x21b19b2f, ++ 0x6c476dc8, 0x33d254c2, 0xa0c3413b, 0x3af8d8fc, 0xebbd9a16, 0x02dfa49c, ++ 0x76803f87, 0x18c03eff, 0xddb9d7ea, 0x87e8cb9f, 0xd2729896, 0xc3cf3083, ++ 0x4c44a4d2, 0x425dfa5f, 0x13a7a51e, 0x1d3e907a, 0xc71538a6, 0x2d4eb8fd, ++ 0xf9780f1d, 0x8e958ea0, 0x587c7c07, 0x54f4a367, 0xd3d2839d, 0x0f4a2e75, ++ 0xe7e23943, 0xbe239408, 0xe639418e, 0xa639438f, 0x983f43ef, 0x9bb43fba, ++ 0x7de77e50, 0xcd305768, 0xd29e37bf, 0x2de27be6, 0x048e8eb8, 0x8f8c64d6, ++ 0x06c40a78, 0xfa06985a, 0x49fd2923, 0x9fb018db, 0x6914ef56, 0x293d2c1a, ++ 0xf20556fd, 0xf8cc2fef, 0xbca09ff9, 0x49e32928, 0x8ef7cc1b, 0x9396f6d3, ++ 0x6e7e2f90, 0xc47693ec, 0xa0b1fbe7, 0x990e9124, 0x9b20ddc7, 0x8c6951d3, ++ 0x59bbb224, 0x8d93e421, 0xa5ade67c, 0x25e58500, 0x64e65cc1, 0xb367d9ec, ++ 0x7d01b56e, 0xff79c797, 0xbd16f311, 0x0c74bcab, 0x40ee99e6, 0x3ecc9779, ++ 0x52d1f792, 0x7fb052ca, 0x82deec5b, 0xc07f10a4, 0x193efd2d, 0xb74cc3f5, ++ 0xc4299cc4, 0x6904df6f, 0x6f51bbe8, 0x20acbd8b, 0xc3b47009, 0x669e1329, ++ 0x9f6e4914, 0x1afcb87d, 0x579c66f5, 0x337f914b, 0xc4682e2f, 0x93b97174, ++ 0x37159ef2, 0x97fca237, 0xbed7afda, 0xe5bfda84, 0xc538d334, 0x628bd40a, ++ 0xd37a8d17, 0x7fe86401, 0xf58f1ff7, 0x3eb886bd, 0x87886de3, 0x332b997c, ++ 0x9a3a165f, 0x63b9de51, 0x1e57961b, 0xd2b92169, 0x133535e2, 0x9a5dd8a1, ++ 0xedf3e50c, 0x15401692, 0x6365f458, 0x243b9632, 0xdf36c90d, 0x0283ed3d, ++ 0x6b2f1f2c, 0x467f31f3, 0x7a40752d, 0xe73f995a, 0x985bd412, 0xa0d9a89d, ++ 0xcfc0e9dd, 0xe77e232f, 0x316bc767, 0xbe05c62a, 0xaf306a57, 0x157ab559, ++ 0x496cf1d7, 0x4aa3f602, 0xcdf2099a, 0x13fc97b7, 0x93d8a3ce, 0xcb0924c8, ++ 0xb1fa0a9d, 0x97eefd2f, 0xd7a80ea5, 0x9431219c, 0x9c81d39f, 0xf3fe71ef, ++ 0x18d562bb, 0xc5b35098, 0x9aed8a51, 0x1363922d, 0x58253de5, 0x56689f5f, ++ 0x4f7e80df, 0xf64713de, 0x3cc3f2a0, 0xde4e8bf2, 0x42ec8a33, 0xc54587e5, ++ 0x71349e98, 0xc3f2bdbf, 0x372a72ca, 0x952a00b1, 0x427f7bca, 0xfc97b6ed, ++ 0xfa0534b2, 0x93ac7f7f, 0xa9f00b74, 0x6bd10954, 0xd8499f50, 0xaa6adefe, ++ 0xffa529df, 0xbfd43cfc, 0x6f98979c, 0xa417f185, 0x2fd584c4, 0xcb0ced1f, ++ 0x511f8c57, 0xb1d884aa, 0xb0ccbcca, 0x5205edfc, 0xfa90f8e9, 0xb098a29e, ++ 0x6752d2fc, 0xfa90f8e9, 0x088e5477, 0x23bf2fcb, 0xdf3f2c33, 0x8feb8b34, ++ 0xca59563a, 0x94b2bee5, 0xd22ccdfc, 0x5e0ef943, 0x3f9418f7, 0xc7f9e504, ++ 0xef953fb9, 0xf80a7f04, 0x80bc7a52, 0xd0e380fc, 0xe20bcb0e, 0x59d31e84, ++ 0xda266bb7, 0x83e3f101, 0x8b17c85f, 0xf06efcec, 0x5f22a60b, 0xcc876ec1, ++ 0x6e1ed4bf, 0xb9639bc7, 0xbcce509f, 0x67e04e8d, 0xf9055779, 0xf5296557, ++ 0xf4860105, 0x391f6f0c, 0xcfa2506f, 0xec3887df, 0x966f4852, 0xef188e8f, ++ 0xfc9da978, 0x95dfe118, 0xb8c6568b, 0xa377774c, 0xc3ac637f, 0xeb7aff18, ++ 0xc88b9729, 0xeb5bfc2f, 0xa4bd905a, 0xfcea2934, 0x133f9037, 0x249ccf39, ++ 0x7f82af11, 0x57617e45, 0xf08bf912, 0x4fcd1293, 0x4a9ffc30, 0x50ce73d0, ++ 0x5297673d, 0xbeb94c96, 0xbdfa339e, 0x1837ff9e, 0xacf68887, 0x8df1a649, ++ 0x55df83f6, 0x9df7fa29, 0xca3e3f50, 0xfa2914f7, 0xebc3d7f7, 0x06d453cf, ++ 0x09f3c83b, 0xd23a6926, 0xa0aaa4fd, 0xc672566b, 0xd96988dd, 0xdd055ee7, ++ 0xf5e785c2, 0xf4e74c46, 0x615a4ef8, 0xcb66b7fd, 0x183fee2a, 0xbae4517e, ++ 0x7f7127d6, 0x3515c4e4, 0x66f2854e, 0xb8c38d5d, 0x3509f9a3, 0x66abe30e, ++ 0x38c72b37, 0xb4ce3dd2, 0x7710e301, 0xff90a42e, 0xf7d71249, 0x48ded15e, ++ 0x2f5eca0f, 0x5b6adfea, 0x93e8d7f0, 0xb7ed5cd4, 0xa04e2e20, 0xdc3797bf, ++ 0xf8a13bdf, 0x89de38ec, 0x4f767c27, 0x51bf3e88, 0x6083cf7f, 0x9538819a, ++ 0xa4faa13c, 0x09e316c4, 0x0e651fd5, 0x1a7e5867, 0x6ed03ffa, 0x58446ba1, ++ 0xccd55bbb, 0xc7e07ab0, 0xd43fa366, 0x0ad96160, 0xac5353ea, 0x245e7e86, ++ 0xeb10bf1d, 0x740eecd7, 0x453998a3, 0xec51bd95, 0xe9c25693, 0xc9fdf917, ++ 0x25cf1e24, 0x1cf5f327, 0x6bf3e24b, 0x99dc3d94, 0xf119ff03, 0x58879910, ++ 0x07f60575, 0x7710bb3d, 0x32e99c5a, 0xe76ce0b8, 0x2ab71573, 0xba6d6780, ++ 0x41c61fe9, 0xde73d0fe, 0x07f0155b, 0xb7a639b4, 0xdeff20b3, 0xf9792b73, ++ 0x66e9a64d, 0xd57fb18d, 0x0a5add57, 0xcf148af9, 0x7d7f106f, 0x0956fb66, ++ 0x926280f4, 0x50ca7e58, 0x0594fc5c, 0x16302aec, 0x0276e640, 0x3cace3ed, ++ 0x0189ae8e, 0x8bf587fd, 0xabd22add, 0x73e0c626, 0x3bed0d30, 0xd8466f7b, ++ 0x059c5c7e, 0x32fb41da, 0x715ff79b, 0x205b6abc, 0xf47d0541, 0x74b281e8, ++ 0x24b1c5c4, 0xf73fad07, 0xd42e39ed, 0x37af3053, 0x1fff5711, 0xe38075e7, ++ 0x8d5e7c38, 0x4f4e3e66, 0xda096e73, 0xc0b1dcdf, 0x5f88690e, 0xdf4a8af9, ++ 0x1580fc63, 0x2eddcff2, 0x706c6fdc, 0xd7f4345a, 0x535e218f, 0x106d3c6f, ++ 0x1c7216fb, 0x689c8dc7, 0xd217b0da, 0x7cbc0adf, 0xe2a6e388, 0x4b19fd38, ++ 0xd1cc0f00, 0x0a74b19f, 0x641e23cf, 0xfd1fbf39, 0xc49ffeee, 0x8f2f146b, ++ 0x17e2ffee, 0xbef4ff90, 0xc2ed0d5c, 0x9f4e58b9, 0x86acbe15, 0x59a7e420, ++ 0x9f70637d, 0x3dec9fd1, 0xc7bfeb8b, 0x78409bea, 0xc7886fb3, 0xa33725fe, ++ 0xf388c478, 0x2d539e20, 0xfffb86e3, 0x3665c7c3, 0xb35df3a4, 0x718d9d38, ++ 0xb436a681, 0xf2169f3f, 0x603cc6ef, 0x7c716ffc, 0xf3833e63, 0x641da360, ++ 0x5fdf180f, 0x43f115ea, 0xfbe76c99, 0xd137bfb3, 0x0a2d4abe, 0x3edfe421, ++ 0xcf38a26f, 0x602ddfd8, 0x1f599c7c, 0xb269926c, 0x14cefc3a, 0xa4d8295b, ++ 0xf6e28ab5, 0x444add19, 0x3b26ed5c, 0xbfb44739, 0x625bcbb9, 0xf0b3f4c7, ++ 0x7c44737a, 0x327cc85e, 0x82b34fc6, 0xb7ade511, 0xcffd837d, 0xddfe18b9, ++ 0xdcec2c92, 0x74323648, 0x88a363ff, 0x664e0687, 0x155e2225, 0xa0640188, ++ 0x599545bf, 0xfe90d261, 0x7a83a968, 0x3693d456, 0x719ca74a, 0xb4e3883c, ++ 0x27b001d6, 0x5174bea1, 0x94d5c86a, 0x3601ec33, 0x811c6435, 0x038e837f, ++ 0x4e3a719f, 0xa6ff660b, 0x2ee6f208, 0x43a9f333, 0xe82d9874, 0xc5196105, ++ 0xed170375, 0x1e669764, 0xbca3265f, 0xa6265d5a, 0x462fac86, 0x886a658d, ++ 0x4ecb8d9e, 0x82cbcb0a, 0xe1318d8f, 0x3174c7fe, 0x3236bc4e, 0x0fc33fac, ++ 0x3079f831, 0xfa174169, 0x6bedd327, 0x2c491fc8, 0xbfeb0acc, 0xbd3864e0, ++ 0x8dc799f3, 0x39f6af71, 0xe67eff23, 0xefcc2519, 0x276c0c28, 0x1e7e147c, ++ 0xf9f67dfe, 0x64dcfcf0, 0xc9156fb1, 0x93d1ebb7, 0x514dfd4d, 0x4f4fdfca, ++ 0x9e9c3ba7, 0xf4e1e5c9, 0xd384f54c, 0x38457d33, 0xc37846bd, 0xcd6a31e9, ++ 0x31f2b0e4, 0xf2c3f21b, 0x3b367f63, 0x18267eac, 0xb8fcd0c2, 0xf56115ad, ++ 0x1a5f6c27, 0xf2f49f96, 0x73f5613d, 0xcac2ab7c, 0xfbae7773, 0xc53ff8bb, ++ 0x3eac31bf, 0x57f4d992, 0xeb537ff8, 0xfde361e3, 0x9ffff157, 0x8b76e422, ++ 0x604edbd0, 0x1987ee2b, 0x0ddd0af6, 0xb6ce97d4, 0x3f715763, 0x69562f46, ++ 0x60af4a1f, 0xbd94035a, 0xd4247b20, 0xd480a36f, 0x8d1bd026, 0xf506b626, ++ 0x264daffe, 0xe4349fda, 0xf732477c, 0xf3247633, 0x29b3acfd, 0xd3ce225a, ++ 0x4ce7a7d0, 0x7ea03fdb, 0x1bea6c13, 0x814c7f64, 0x730e305b, 0x579fb4a9, ++ 0xe2a85092, 0x523caa3e, 0x70133c5b, 0x33293968, 0xe1ac8930, 0x201ff3e4, ++ 0x6ddb2e3d, 0x4e54e22a, 0xb768eaf2, 0x37fe5d60, 0xec057920, 0x6353da2b, ++ 0xe9d69f1e, 0x325e30ab, 0x1b5c2bf2, 0x15fd6336, 0x809fcdf7, 0xf7e0ec71, ++ 0x9557eafb, 0x742bd086, 0xf8a34b5d, 0xdcc94d47, 0xb9eb19ae, 0x0436aac7, ++ 0x64d3de61, 0x2ec1ffae, 0xbac32534, 0x984f49cf, 0x9ba59fb9, 0x3b02cfd1, ++ 0x4e01e749, 0x4237a870, 0x8f64389a, 0xa2006bd4, 0x1bdf1673, 0x4e5d212f, ++ 0xc3c61ac8, 0x6109c5bf, 0x646aa11c, 0xf436efff, 0x3a26aaac, 0x6035e643, ++ 0x0757f70f, 0x7a471a1e, 0xa0fdecf8, 0x67af0164, 0x463d7c2d, 0x0f428bfd, ++ 0x70f4277f, 0x90dfea0f, 0x3b35e87d, 0x3f478f9e, 0xf7366cfb, 0x67ef8dab, ++ 0xc639f992, 0x57ee6499, 0xd98ced57, 0xaf043e70, 0x58677ed5, 0xc475b6be, ++ 0xca7dd086, 0x5e3d632a, 0xacf5c149, 0xdd537217, 0x87b84c15, 0x1a7e5f91, ++ 0xe3b356e9, 0xb1fbfdf2, 0x8d3fa9bd, 0xc69d53db, 0x4653ebbb, 0x7f5dfdfe, ++ 0xe9fe6166, 0x9a66c9d7, 0x2f38d7d7, 0xe2439748, 0x072c1c00, 0xf4c4ef1b, ++ 0x9402d158, 0x901ef837, 0x8bb8bf20, 0x2d5f5199, 0x919a66f1, 0xf699a7f8, ++ 0x5a583ef1, 0xed4ab26f, 0x3a1e60ef, 0xfee4fea7, 0x37ac78ea, 0x0fd19fd8, ++ 0x6ffa0008, 0x73753a9f, 0xccdfee1a, 0x807fc895, 0xddf86cf1, 0xcda8df73, ++ 0xf18d7768, 0x4bde613e, 0x963e031f, 0x35fa8d32, 0xdc7867fa, 0xcf87a212, ++ 0xf7005859, 0x5673f473, 0x9f301bdf, 0x01c7e88d, 0xa7b6361e, 0xb7d07f93, ++ 0xbf763fee, 0x181ef504, 0xfe831c15, 0x7f75b9cc, 0xbab8889e, 0xa99965fb, ++ 0x9c4f1f80, 0x3f48cff7, 0x1f672e83, 0xe58f1cba, 0xae1097e0, 0x86ab2ed8, ++ 0xdd6e7272, 0x7ea189ae, 0x3e6539bf, 0xa2e7414b, 0x39ea3930, 0xb97c6445, ++ 0xe7fbe2ce, 0x4eee51c7, 0x033fa998, 0x3e056b9f, 0xe9aa6637, 0x18dcf8a1, ++ 0xf24f883f, 0x21be374f, 0xd8d95e93, 0x3ee7431e, 0xd45c0b1f, 0xd6fabaee, ++ 0xb8662ae3, 0xe035f85f, 0xfe5c0554, 0x82aa701e, 0xe00df05f, 0x655bf314, ++ 0xf7ce3a4f, 0x4ebfa7eb, 0x8ef8b8a0, 0x9f779b1b, 0xbdc9ffd4, 0x5ce3df48, ++ 0xc0d806be, 0x5af76427, 0x83f45472, 0xfd5ff64b, 0x4d43f504, 0x65f6958b, ++ 0x4783392f, 0x07fac15f, 0x6bf58624, 0xcca43102, 0x1f245a6b, 0x6bad67ee, ++ 0x1465bbdd, 0x2d35d7e4, 0xd6984029, 0x63d23026, 0x0f92cd35, 0xd42eb7f7, ++ 0xee7855e9, 0xeaf07250, 0xf7b7ec05, 0x62f7ef20, 0xc620fe9d, 0x2bcdbd8b, ++ 0xd6fec0bf, 0x0c5958b7, 0xb019cfe2, 0xf6f1c28c, 0x6f1c7e4a, 0x0b59ff8d, ++ 0xf5e6bff6, 0x0dd1e325, 0xbf59daac, 0xa87f742a, 0x8b29ff77, 0xd35a740a, ++ 0x5102ecf2, 0x779b80af, 0xe9b9d85f, 0x83fd5f5a, 0x7822f1a1, 0x399f4cb3, ++ 0x03e36f74, 0x6d15ff41, 0x9c901ae3, 0xbdf6c7a0, 0x2b1e9122, 0xd63d414b, ++ 0xbd7ffbb1, 0xf81de38b, 0x3710139f, 0xe8c6e0ac, 0xf93a3ccd, 0x1c62350d, ++ 0x05b4f176, 0x169ac1e3, 0xe76885f3, 0xcf14be41, 0x88cf1c52, 0xe8fd2367, ++ 0x8c4b40ad, 0x58ccf45b, 0xded90f92, 0xf309596f, 0x805615f9, 0x7e8e28f9, ++ 0x6fc82acb, 0xb2f5124d, 0x7168be6c, 0x0a292bf0, 0xc596c7d1, 0xcb239fcf, ++ 0x87e5165f, 0xe0b3beb3, 0x7a8d5bfe, 0xadb882d1, 0xcfcb7c09, 0x5cbf5beb, ++ 0xeed28ee0, 0xf76e14a5, 0x9acf26cc, 0xf243051d, 0x14da51b1, 0xf1b5bb44, ++ 0x275524c0, 0x9a41eb3e, 0x1518bedf, 0xffb251d7, 0x90c199db, 0x7c07befe, ++ 0x91bf7ee0, 0xe5f3d9af, 0xedd23354, 0x2aa72fed, 0x7bdf43f1, 0xa26becd3, ++ 0x94bc97ed, 0xe6eeedc2, 0x1c45cf04, 0x55bf7ab7, 0x8ef844dd, 0xef8802d1, ++ 0xdf3a38b6, 0x365b7c00, 0xfbe28415, 0x4d779a6e, 0xbda1ac9b, 0xe25d69ad, ++ 0xf1faa7ad, 0x6e41b21a, 0xce23af9d, 0xf0878764, 0xe302fec8, 0x3ae714cd, ++ 0xa6e68fa0, 0xb9469f78, 0xaafaec54, 0x1a8afdd0, 0xcf033053, 0xbd9ab619, ++ 0xc887e7db, 0xd5d76c9f, 0xa5cf784d, 0xd5935935, 0x4d99fe21, 0x6abd2f9c, ++ 0xed092130, 0x9271d826, 0x09b7c097, 0xad2dff48, 0xee50da0f, 0x70714fef, ++ 0x15745a3e, 0xc6ee67f7, 0xab7bac3c, 0xe506b3c5, 0x2c5a6b6a, 0xdf476f8f, ++ 0x2f59bed8, 0x3c04ebca, 0xfed2f407, 0x5bc0af45, 0xfa4618ef, 0xccd0ee97, ++ 0xad3722c2, 0x0ebcc6d7, 0x5adb57ac, 0xf76a155f, 0xa5dc0f7a, 0xb1ccfce1, ++ 0xe34b3dbc, 0xf71c8d78, 0xf90ce208, 0x7db55a64, 0x8fdd887e, 0xd45877ac, ++ 0x14c0e833, 0x6051f69d, 0xfc347768, 0xfc5291de, 0xe6d1ca2e, 0xea364f24, ++ 0x86270561, 0x512d5478, 0x3bf501e7, 0xfd466f91, 0x168e823d, 0x7481d7b3, ++ 0xcde4537d, 0x19d10f16, 0x39455b04, 0x965f5c1e, 0x7d9caa25, 0x35bde621, ++ 0x91ef9c33, 0xf2173ef5, 0xaee93666, 0x0ecf3855, 0x4fa6e499, 0x1bfe27ed, ++ 0x5702faf5, 0x2edbff39, 0x5cf78edf, 0x272e66b6, 0x6ff77e7c, 0x4872f939, ++ 0xe294e6bf, 0xf7feb873, 0x9ab63e05, 0xfbce1775, 0x2a3ac468, 0x94c13c52, ++ 0x36247d90, 0x7086e53a, 0xa4fc44c2, 0xf1077b09, 0xf5bbed13, 0xafba58b1, ++ 0x09c457b5, 0x4e10f30a, 0x92a698e2, 0xef66e31f, 0x868c3de3, 0x06db134e, ++ 0x14dc04d9, 0x4b27390a, 0x90464d90, 0x2841b6e5, 0x58b6c78c, 0x3617c7fe, ++ 0xf9e23457, 0xee65d33f, 0x13ef850f, 0x96e4b730, 0xde07f742, 0xfb63775b, ++ 0x1b7aaf03, 0xf723ce50, 0x4c056607, 0x37892d2b, 0x5ef04fb0, 0x827dd445, ++ 0x78f0d4b8, 0xd2aa99d3, 0x1cd9fce4, 0xac40fe87, 0xb13bef8f, 0xd3e388e9, ++ 0x7f285348, 0x8b53c5d7, 0x736d9bd4, 0xfc5fa902, 0x45adb6d5, 0x39e36720, ++ 0x80df301d, 0x7f720e60, 0xe1df7063, 0xefe4c9bd, 0x29923e82, 0xb98876de, ++ 0x00aff044, 0xac1e24fc, 0x16fb6169, 0x263fa381, 0x9dddfea0, 0xfc887ea4, ++ 0xd32e3fe9, 0x25188dbd, 0x91467168, 0x3fe8fdaf, 0x6f723f83, 0xb6b3d72a, ++ 0x67ce7e56, 0xed0cdd53, 0x31c38c7c, 0xb3910e4d, 0x37ee54c4, 0x973d1f57, ++ 0xf27f0161, 0x4264e992, 0x7ebff41e, 0x6e02735f, 0xfd9d5583, 0x955e2668, ++ 0x4ef147b9, 0xdf7a854f, 0xda263b49, 0xeadc3fd0, 0xf1f48a9b, 0x3ee8b207, ++ 0xe98514e3, 0xf9f0fe4a, 0x8b0cbed4, 0xf35c9302, 0x53a53272, 0x46afa6da, ++ 0xc036b53f, 0x98638bd7, 0xb4e60541, 0x6def944a, 0xfec2486d, 0x7dbdff6a, ++ 0x5da9ea24, 0xf67f7ca9, 0xbcb92bcd, 0xac14c2bd, 0x14ea9e5f, 0x7099f778, ++ 0xd8976ebf, 0x22bdebe7, 0xfc633d53, 0x65f3ad29, 0x2f20e007, 0xed10fdb0, ++ 0xc959b62b, 0x9d798a9f, 0xc5b47a71, 0x6d5479d0, 0xf68642c7, 0x34c9cfa8, ++ 0xc777ca09, 0xd3ff93f6, 0xf1556edf, 0xb1c633fc, 0xefbca19d, 0x72a7f716, ++ 0xf6cdb000, 0x78c6efa1, 0xc1bf6d31, 0x05c4393d, 0x28c6c39d, 0x7b5cd9db, ++ 0x89e3bd28, 0xee716bde, 0xc04e38a9, 0xfd12e784, 0xa35f3ba0, 0x93cd0d79, ++ 0x3cc6b8d1, 0xefcf4873, 0xf85ff4b6, 0xcbcd0a45, 0x61c83881, 0x6dac9e7c, ++ 0x31abc512, 0x23ad370e, 0xba6aa1c6, 0xb55e7c34, 0x0301c153, 0x26f5f9f9, ++ 0x28cf2836, 0x43b1b5df, 0xc2c81b79, 0xe4262cee, 0xd2b6e0ff, 0x283cd0a2, ++ 0xf6a1c29a, 0x6db17cbf, 0xed11635b, 0xf032e9ab, 0xf8d20e3f, 0x97275c24, ++ 0x7709102b, 0x03a73e6a, 0xb38ba3de, 0xfac1f2f1, 0xe63b7380, 0x669ebced, ++ 0x6455c475, 0x79d0bc92, 0x3d9fe19c, 0xdc2e052a, 0x79edac02, 0x079893d6, ++ 0x1d31eaeb, 0xea09ac7a, 0x3fd2bf7d, 0x4ef90031, 0xc449f7ab, 0xaf9f3be7, ++ 0xea0a6a7a, 0xad66dddd, 0x504ff512, 0xe0fc8e7f, 0xb6eacd37, 0xa363b910, ++ 0x9ee8d3fb, 0xb538c45e, 0x873d3767, 0x01df6e7e, 0xe7f3c549, 0x067f733e, ++ 0xeda6bbce, 0xf5ea0b1b, 0x925f03da, 0xe6939b5f, 0xf815317d, 0x4f5ad857, ++ 0xb166cdf7, 0x2cdf74ed, 0x7e07f857, 0x0327d717, 0x56be2667, 0x7787c21f, ++ 0x7eb1bc85, 0x53b458ef, 0x3b5e426d, 0x7485de30, 0xe3dde75f, 0x227dffb0, ++ 0xd5da371e, 0x90a343b3, 0x7bd89bee, 0x1dda0e94, 0x7df7429f, 0x3db13f73, ++ 0xbfa90ee0, 0xbeffc84f, 0x2df7ee54, 0xc2eef34a, 0x7e7556f9, 0x78abc165, ++ 0x19fde7b5, 0x21fa5f18, 0xd144772e, 0x1bf28323, 0x4ab54f21, 0xd7eb05bf, ++ 0x57a4645e, 0x898ddf80, 0x9f5dbfc0, 0x095e4eb4, 0x4f01f7df, 0x385fd112, ++ 0x7dc4e3cb, 0xac28cf66, 0x0ff1ff5f, 0xfd8f5153, 0xfc049c0f, 0xaaf687ef, ++ 0xc03748b1, 0xca2c717f, 0x7a465ed9, 0x3cd390cd, 0x9f685394, 0xc02ff887, ++ 0xe5e90e7c, 0x0aee96dd, 0x267dcb92, 0xf8097286, 0xfc007927, 0xe72ed03b, ++ 0xa81e4039, 0xf39224fd, 0x3726dddd, 0xd7a0b3f9, 0x78be5027, 0x7777e619, ++ 0xce483a97, 0x1f3edcf1, 0x887035e5, 0x8633f1fa, 0xc4814c6e, 0x12fba13c, ++ 0xc409a989, 0x8e5f4337, 0xcfebf211, 0x58351356, 0x872c9c47, 0xbd8847c9, ++ 0x4f6179e4, 0x6d2ed3b3, 0x7e34617b, 0x84edc69e, 0x7549d843, 0x7ffde91a, ++ 0xe36ab610, 0x9b8bd991, 0x40ff2fd0, 0xb10ef2a6, 0x3810122f, 0x45f62439, ++ 0xc9a86ed0, 0x7e2dbefc, 0xbc79019f, 0xbdd33d8f, 0x51cd04a1, 0xc3f6f961, ++ 0xf8f6ce98, 0x2c65d04b, 0xd87dd15a, 0x173cc5cc, 0xe872d7f1, 0xbfbc5cd6, ++ 0xc79677d6, 0xf63f2d79, 0xd026f17f, 0xa00eb1e1, 0x053b147f, 0x81fc21cb, ++ 0xb98a359f, 0x49f79786, 0xd7e88f42, 0xbd8f102a, 0x1e50f22d, 0xc0035226, ++ 0x5e5ffcc6, 0x74dbdffc, 0xe6953fc8, 0xf09086be, 0xa1af7ba7, 0xfa9df6fc, ++ 0x72c50d31, 0x28af99df, 0xb8b16e7e, 0x2d3f1173, 0x46721059, 0xa9f7e9c1, ++ 0x8143e266, 0x173d4595, 0xe5c6971c, 0x9ecea260, 0x963e2892, 0x9f8c3e1d, ++ 0x05b7645b, 0x4c8ba0fc, 0xf5073e5f, 0x7d2fd88d, 0x371f8998, 0x1e7f02fc, ++ 0xd187d911, 0xf5bb016f, 0xe7910bc8, 0x5bf26eee, 0xc622fd8c, 0x5f109836, ++ 0xf624dbab, 0x6b1681df, 0xbfaf0d5e, 0x5f2bdc5e, 0xe8e3badb, 0xbaebe028, ++ 0xd1ca23d7, 0x0573a16f, 0xeba3c53f, 0xffcfc29b, 0xff09a5c7, 0x871b1c65, ++ 0x8ae00bfe, 0x615984f4, 0xf1c0565d, 0x075ee947, 0x899771d2, 0x2bf40bd3, ++ 0xf843a7c9, 0xb98bbb31, 0xc4bfea5e, 0xce4f5ee8, 0xbc61ff4e, 0x29bb333f, ++ 0x6631c353, 0x767cbc2b, 0xf73f266b, 0x9e327c51, 0xbdba17fb, 0xd6bfc80b, ++ 0x7ef067dd, 0x2fa11ac6, 0x717e0399, 0x7eac457f, 0xd6eff08d, 0x55ef22fa, ++ 0x8ad53a72, 0xaf98b37a, 0xbd5dc701, 0xaa0fdf93, 0xbf5e19da, 0xfd69d056, ++ 0xe28ea7cb, 0x3fb55cb6, 0xa9d05ca2, 0xdee235b6, 0x959cef07, 0x657d89a7, ++ 0x46fc1f71, 0x6f7c27ef, 0x47c6fee6, 0x7ca31fa2, 0x57df1a6d, 0x206581ad, ++ 0x64fbd77f, 0x8d68e21f, 0xbf7027a4, 0xc257d997, 0x60341efa, 0x3eb3ee20, ++ 0xa0f4e824, 0x1fad0fc0, 0xcabf57da, 0xf43c23df, 0xd7fcf874, 0x14658f31, ++ 0xe5a47f7c, 0xdfdc16a7, 0x9adbc48b, 0xbff93326, 0x227d04eb, 0x106eb5f1, ++ 0x682ddb3f, 0x55f122df, 0x33ae95e3, 0xffb7ee7f, 0xe0dfcedf, 0x4dd13af3, ++ 0xfb403995, 0x4a2f5544, 0x7f5eae9a, 0x11eb835d, 0xd77bfbeb, 0x8b90c5b5, ++ 0xf1326cc9, 0x06f93cbb, 0x7f70a5e3, 0xcb85af7b, 0xf7c280cd, 0x453c0db1, ++ 0xfc205fb6, 0x732f85f5, 0xeb52f5bf, 0x97dc04e5, 0x481eebee, 0xca9a9460, ++ 0x7e623ed1, 0x7a5e887c, 0x93c78d29, 0xff5f5c5b, 0x85f9fd1a, 0xde1acd7b, ++ 0xc63f5aef, 0xbe3b41ec, 0xb491cc7e, 0xe77621f1, 0xe17f5155, 0xc53787de, ++ 0xbfc47ee0, 0x658a1a49, 0x1e3fdb5f, 0x24debcc2, 0xfda01369, 0xdf81eed1, ++ 0x6aeebde2, 0xec4cdc57, 0x2cbdb6af, 0x8fe43777, 0x0b5d36be, 0x268f3f8d, ++ 0x1c2df5f1, 0xdabb2663, 0x5fee3233, 0xd0bf712a, 0xbbe483bd, 0x16dbe0e7, ++ 0x5bbfb7ba, 0xe8182e62, 0x5bf0eba8, 0x67bbd03a, 0x3a0b29ff, 0xa72d25eb, ++ 0xe2bfc12c, 0x70825c2f, 0xa9fb402c, 0x2f742ddb, 0x2defdf71, 0xf3525e78, ++ 0x4fb497fa, 0x7cfd0eb5, 0x955ec7f4, 0xe1cf1de9, 0x882c77f6, 0x89269aa7, ++ 0x968667a5, 0xf51ca99b, 0x69bfe620, 0xc0d4fae2, 0x4b812ae9, 0x6e06a703, ++ 0xf3fd0957, 0xb8e8d6e0, 0x23d4f434, 0x2465bdcc, 0xd370f7f4, 0xf35fba4a, ++ 0xfaf0f6f0, 0xbcce31ab, 0x5c73eb09, 0xbc397eae, 0x1e20ed7c, 0x91d3d275, ++ 0x4333eefa, 0x1cb0e4ff, 0x6040e3c4, 0x700558d5, 0x75a9c3ff, 0x73945963, ++ 0xbec2939b, 0x7af5f61b, 0xbd6dedf4, 0x58bb416c, 0xf14cda3b, 0x3fe8ed45, ++ 0xf2f14259, 0x82cbc095, 0x9f103fb6, 0xe93adb2a, 0xe622e87e, 0x5e748f5d, ++ 0x40e716d4, 0xc832b97f, 0xcda2b8e5, 0x3849f3ea, 0xc3d9133f, 0x88dfcc45, ++ 0xe0ebe838, 0x83f42cef, 0x4c4df912, 0x82d5b7e8, 0x9d05abee, 0x363c4357, ++ 0x8889ef0a, 0xc446bc78, 0x77b36bdd, 0x15abc51c, 0xfd7ca235, 0x4809c3f1, ++ 0xf5c60ae7, 0xeb9f854f, 0x867f831f, 0x7b94893d, 0x23f754b0, 0xacdaabff, ++ 0x36fb5f74, 0x6b6e7fa1, 0x0d23fd02, 0x237d03d7, 0xf9bdf8e2, 0x91de7c7d, ++ 0x25a6b3f6, 0x5a6f7ebc, 0x406bd12a, 0xe989c1f8, 0xbe088f42, 0xb8b3f655, ++ 0x42afe83c, 0xb51f3595, 0xfc7056ea, 0x4780a9ae, 0x1d4bbfe8, 0x9eed1897, ++ 0x56fe9192, 0x7e46f7f8, 0x418bee31, 0xbb63bf7d, 0x7f7e343d, 0x97db9d3c, ++ 0x1d64b375, 0xef1210f9, 0x8ccfce2c, 0x4c4cef1a, 0xa32e7bc7, 0x5a7a7c1f, ++ 0xdee3bc68, 0xf8f11131, 0x95f3d72b, 0xb6a7bf78, 0xde97eb89, 0x1137e842, ++ 0xfe4677fd, 0xd5936d70, 0x2d497187, 0x65de89e0, 0x5e505e21, 0xc232a4db, ++ 0x3f379a4b, 0xb7bd067d, 0xd5bde334, 0xa760ad25, 0xa525fba1, 0x1dfc207f, ++ 0x0dd7cf1f, 0x168f4b74, 0x4371183f, 0x9fee15cd, 0x946bdf1a, 0x350fc520, ++ 0x729efc6d, 0x19aba1cb, 0xbedf3099, 0x58c8fff6, 0xe9c3e909, 0x296b5fdc, ++ 0xf7857ff6, 0x6dd87e6c, 0x0e87ea8b, 0x91a971ea, 0x1cc6a5e4, 0xe4ff234c, ++ 0x3783f800, 0xd1f1bc43, 0xb46f1477, 0x00798a1c, 0x577bc3f7, 0xfe3ac779, ++ 0xd9ea9f0a, 0x3767f226, 0xd14a46b1, 0xfff509cf, 0xbdf83b56, 0x1d84479d, ++ 0x8013fcc4, 0xeea047eb, 0xfae1fcbc, 0xd537d0c1, 0x996bd702, 0x348e65be, ++ 0x0b544f5c, 0xdbcaa9b9, 0x91df4741, 0x90b5507e, 0xc9fcf027, 0x41fa45ee, ++ 0xeb87a78f, 0x628ffa99, 0x3bedcfc9, 0x4f703b2e, 0xcffbe818, 0x03dfd123, ++ 0xca2b3eff, 0x0277e83e, 0xbce23d9f, 0x2650beb5, 0xf16699fa, 0x809bf0d4, ++ 0xbe9b848e, 0xc61f7653, 0xef1db909, 0xaa0e2164, 0x50bd4276, 0x7a3e03f9, ++ 0x8f94fee9, 0xe3f92bef, 0x28c74ce8, 0xcef1d5df, 0xfd5bc464, 0xe44e3f47, ++ 0xd13ab9fc, 0xf9fd7292, 0xf124a919, 0xf124d7f8, 0x129f77f8, 0xabb8c04c, ++ 0x09ec80f6, 0xf06ec7bd, 0x238129fb, 0xff38f0a6, 0xe6957499, 0xf1c6df53, ++ 0x29e76a61, 0xef9cbf8c, 0xfc6998f3, 0x80c5e561, 0xef62bf9b, 0x300bce18, ++ 0x27ee6b50, 0x329ed5fc, 0x4f6a7cd1, 0xda85a40d, 0x4dfb1d7d, 0xbf57fd47, ++ 0x893e919e, 0x6f77a863, 0x908177c3, 0x18b3edbf, 0x668ea7f2, 0xfa49553d, ++ 0xa8664b2b, 0x68fb1ebf, 0x7b50a4dd, 0xcfce9c91, 0xc1d219b7, 0x0bcc5e85, ++ 0x87417c7c, 0xd8a96c4d, 0x7e78e027, 0x103fc441, 0x8f4aed5f, 0xa8dd5f12, ++ 0x6edf5c5f, 0x5c8fb865, 0xf74ace7b, 0x5f687e70, 0xbb3bf14d, 0xfa849de2, ++ 0x37bd7986, 0xc758fa61, 0xfdf849ea, 0x37b58e87, 0xb4a7bed1, 0xe99ecc29, ++ 0xfa173f38, 0xe1a71f4b, 0xf6ea98bb, 0x611ee98f, 0xe699bb75, 0x7b50f98f, ++ 0xedce96d6, 0x0c675f59, 0x2c486fed, 0x8d80e38b, 0x7d77eb0f, 0x2ff211cb, ++ 0x61cab7d6, 0x768c1aef, 0x7ef9d327, 0x0381b77f, 0x3e26e4bf, 0xfae9e5ef, ++ 0x3e69b7d6, 0xf13f6655, 0xccc9beb1, 0x14f377cb, 0xa76a4efc, 0xe71d24b3, ++ 0xbff717bf, 0xed08b9f9, 0x924d4073, 0x1cec818f, 0x7887be1f, 0x5d013f1f, ++ 0xc6267c07, 0x3ce95bbf, 0x1c6ba1b9, 0xe819b7bd, 0x9a253b7a, 0xe78938dd, ++ 0x13950028, 0x890e3c99, 0xc5d67f2c, 0x9c4e1ff7, 0xc4ecfae5, 0x68a4ef7c, ++ 0xc5674d7a, 0x04974e3c, 0xbbf85bbd, 0xcf7ac8f0, 0x8e76fe88, 0x7ae04fd6, ++ 0xd0c6f67a, 0x938f5c79, 0x3496a7ef, 0xddf0571f, 0x348b5546, 0x5548ed03, ++ 0xaef4a7f6, 0xa805f203, 0x0702aad7, 0xbab1dce8, 0x7702ef69, 0xefdc7994, ++ 0xc2ad76e2, 0x333cfd12, 0x79f1c5c3, 0x22a9699a, 0x04ca7a8e, 0x34ae9de3, ++ 0x2cfbf83b, 0x76f33efe, 0x2d9787a1, 0x729f9332, 0x7e66a99a, 0x17cfc16e, ++ 0x7b3d0b16, 0x91cfd0bb, 0x7d0d86ef, 0x67e8a77c, 0x336cabc9, 0xbe442f9e, ++ 0xf853be23, 0x9b994b7b, 0xff7c8ffa, 0xfbf0a77d, 0x404eff22, 0xe1e84b9a, ++ 0xea226c89, 0x07d83f61, 0x9cc6fbe4, 0xb7b3b218, 0xd510994d, 0xd4f7c04f, ++ 0x8d4f78aa, 0xfaffc1a9, 0x7ec94f9c, 0xfb3ce89d, 0x3fc3dd16, 0xa2b2c31b, ++ 0xd90d8f9c, 0xefee432f, 0xe7177ce0, 0x3e0ed50d, 0x97ff8347, 0xdd0a3220, ++ 0x3ff832d7, 0x3fe1f04b, 0x9b266f7d, 0x20fba129, 0x2cef6507, 0xffde2a57, ++ 0x1aff21ed, 0x0bf64056, 0xd62195d6, 0xb10d6195, 0xac46974b, 0xa1e38a8c, ++ 0x5ce925f5, 0xda50a7ff, 0xf9256399, 0xf44bf6ab, 0xc03aae3e, 0x0efab1e5, ++ 0x2709f689, 0x7dd274b6, 0x92a5e585, 0xec6ae6e6, 0xc0cfce0c, 0xb71b62d1, ++ 0x065e06e7, 0x847025e9, 0x6fdf68e5, 0x123df617, 0xf758934f, 0x2effec02, ++ 0x3de1a4b7, 0x68e2ebc4, 0xa823b4c5, 0x2387afae, 0xf519a5c0, 0x5e9e2466, ++ 0x22577972, 0x5c7e20fd, 0x3ffa053e, 0x064df391, 0x3ae6a7e2, 0x9084f472, ++ 0xfd769db3, 0xf5ffda04, 0xbd5ce2cd, 0x8835a739, 0xe462e974, 0xbb38f607, ++ 0xfee46cb7, 0x57ab9d31, 0xbee86207, 0x1c5b7564, 0x6eaaafbd, 0x8c9d8fa9, ++ 0xac9b6471, 0xb2be41c5, 0xc62954e5, 0xfc0595ef, 0xa58d479e, 0xb9d0fc9f, ++ 0x5cc7de29, 0x7afdf033, 0xba79d87d, 0xe1ebcf31, 0x3dcf523d, 0xea56be83, ++ 0x79fe9d7f, 0xe365d046, 0x9369cbf1, 0x7aa31e19, 0xf779c69f, 0x82d3791d, ++ 0x276a054f, 0xaf00b3bf, 0x52e33d56, 0xa6a2dea9, 0xc6dc46ce, 0x45ffe635, ++ 0xefbf83ba, 0x9346fb30, 0x6377997f, 0x0fea4bf7, 0xfe8a9b1c, 0xf1e76f74, ++ 0x9c1096a9, 0x7d046cf7, 0xf57f851d, 0x57e424cc, 0x969254a1, 0xcb877f0a, ++ 0xe1fb6d73, 0xe85fdc34, 0xc3ce3941, 0xb404e3f4, 0x4f7bd593, 0xbf404c27, ++ 0x8d4f1f63, 0xc9b52efe, 0xc1298f54, 0x87c67789, 0xcd336fce, 0xf79f92ef, ++ 0xe27058c3, 0xe5a129b2, 0xf5afff0d, 0x77a441c0, 0xa6182db5, 0x413a0c07, ++ 0x5cef4f74, 0x9d2b0ef5, 0x4b79e3d3, 0x4facfde8, 0x866eff04, 0x75e507a0, ++ 0x8f339e16, 0x614cd743, 0x615e61f7, 0xcf092501, 0xbf320383, 0xf49a36b7, ++ 0xfe314cfc, 0x13a04acd, 0x12ceb5ef, 0x59b393e7, 0xc79bd537, 0x337529fa, ++ 0x2dd3bd07, 0x85a51a66, 0x186dc0b6, 0xfdf9e5fe, 0x9024fef4, 0xd82f38a6, ++ 0x28e07bc4, 0x9ba21efc, 0xf4182ec2, 0x8b1cf190, 0x5c8c07df, 0x1eb19f4f, ++ 0xe83fd737, 0xd6bde05a, 0xf3a7e642, 0x282cb9f3, 0xafa3d1ce, 0x6fc40e63, ++ 0x17366e78, 0xa25899dc, 0x17ea8f87, 0x68e47ae1, 0x46de09eb, 0x0ea5666c, ++ 0x48149f9c, 0xbb8b5d33, 0xe1f475f1, 0x67dc472d, 0xf7bfb07e, 0xe7430517, ++ 0xb1db5a8e, 0xae1ef0cf, 0x3dd376e4, 0x35df0d5d, 0x50129c63, 0x58f5067a, ++ 0xd755a816, 0x8f511faa, 0x981def19, 0x8cfdd197, 0xb80ef7c8, 0x7f218bdc, ++ 0xbfb8c7af, 0x54b7d3ba, 0xb0efbfc5, 0x7f46c522, 0x96df2607, 0x0ff71d31, ++ 0x1fdec9fd, 0xa4e75711, 0x89d409a6, 0x7e419be2, 0x1c55c0a8, 0xfae21773, ++ 0xdef1b725, 0x065e1182, 0x31a7d5df, 0x6712f77a, 0x9e51efe5, 0x92da1c02, ++ 0xde2afd08, 0x944f661f, 0x6eefe8a8, 0xf434da71, 0xdf38ace7, 0x36f9a1b8, ++ 0x8a3df8d8, 0x0f865b06, 0x2f71b8f5, 0x0d9e922c, 0x926e8b40, 0xfe46cd43, ++ 0x997bc472, 0x19bcda5f, 0x8f1d6023, 0xdfd317c6, 0x53ddca07, 0xbcbf42e4, ++ 0x69bbbc41, 0xc7d27490, 0xefc4d3ba, 0x17773233, 0x8b7693f9, 0x9dfb8dba, ++ 0x206faf74, 0xf3bf2545, 0xd896fc70, 0x586f90c9, 0xaa3dd129, 0x31355486, ++ 0xcbef00b3, 0x7bf50ccb, 0x17495743, 0x8f6c07da, 0x93837c7e, 0x53d6e3df, ++ 0x43ebdd19, 0x7c19143e, 0xc1f10d30, 0xe4f7ee2f, 0x831adedb, 0x52d3f5fb, ++ 0x9bb60958, 0x404f7016, 0x4bef189a, 0x46b32f80, 0xf0f7e2a4, 0x714c567b, ++ 0x830a7dd0, 0x0214002f, 0xdbf043b7, 0x78c393e0, 0xc256ef1f, 0xfc1bc7de, ++ 0xf3962a7b, 0x5c378cc9, 0x155b51c6, 0xcfe48dfb, 0xec3501ff, 0x4a307ca6, ++ 0x00004a30 + }; + + static const u32 xsem_int_table_data_e1h[] = { +- 0x00088b1f, 0x00000000, 0x277bff00, 0xa3f0c0cd, 0xa5fd811e, 0x79ba1818, +- 0x8968c550, 0x30327137, 0x303170b0, 0x06710268, 0x2036ded0, 0x17c40edd, +- 0x1022f880, 0x3033719b, 0x11710214, 0xf2032f10, 0x56dcd093, 0x50c0c4c1, +- 0x4035c405, 0x3ac4075c, 0xba0c0c8c, 0x1fdbc48c, 0xf0c0c42f, 0xd7c10c42, +- 0x48606710, 0xff9fa491, 0x54ee1b07, 0xc27dafa1, 0x860c0caa, 0x4662a8ba, +- 0x5d637c68, 0xa09866fc, 0xf1a29bc9, 0x17e8f0cd, 0x87e540b4, 0xe3f2a219, +- 0x7618198c, 0x3709a922, 0x7416efc4, 0xf7a802fc, 0x00031025, 0x22037beb, +- 0x00000368 ++ 0x00088b1f, 0x00000000, 0x92cbff00, 0x51f86061, 0xa507c08f, 0xf3761818, ++ 0x12d18aa0, 0x6064e29f, 0x6062e190, 0x19e20470, 0x00977b40, 0xfc40a5e9, ++ 0x03df880e, 0x03371871, 0x9e2054c3, 0x8047c406, 0x6e6849fc, 0x6062616b, ++ 0x0ee20368, 0x6202ee20, 0x0606461d, 0xede2465d, 0xc0c42a3f, 0xe08e2010, ++ 0xafb2004f, 0xffcfd24a, 0xb67f0d83, 0x357dafa2, 0x290c0cd6, 0x71fe082e, ++ 0x54860667, 0x69355417, 0x48cdf82e, 0x40cf9347, 0xd1e267e3, 0x951f5dff, ++ 0xca89a32f, 0x6066d337, 0xf04034a8, 0xbbf13565, 0x00af1d05, 0x40695dea, ++ 0x232efabc, 0x3195be54, 0xe8000684, 0xa8f9d363, 0x00a8f9d3 + }; + + static const u32 xsem_pram_data_e1h[] = { +- 0x00088b1f, 0x00000000, 0x7de5ff00, 0xd5547c09, 0x73b9f8b9, 0xc999dee7, +- 0xac84992c, 0x5d86f12c, 0x48409c04, 0x5876c443, 0x0622b4a4, 0x30a20a97, +- 0x9037d96c, 0xff69f0fa, 0xa5ab0819, 0x68d06a1a, 0x68304ec1, 0x1a0741b0, +- 0x01c04830, 0x6a2be2d4, 0x6d8ad3ec, 0x2c3480c5, 0x0dc46486, 0x3ff2d3de, +- 0xcdce77df, 0x11337bdc, 0xbffbfb6c, 0x4f169fe5, 0xb7fb3dce, 0xe77cef9d, +- 0x92cc5f3b, 0x407e1240, 0xa1f865c8, 0x211318e9, 0x5d245c64, 0x88fdfd6c, +- 0xe5227d53, 0xacc8957f, 0x465a48e0, 0x46dbe42a, 0xb213be45, 0xb16feb12, +- 0x589346b9, 0xc402d348, 0x93df3f45, 0x84592268, 0xf826e7dc, 0x9bce25b3, +- 0x12126426, 0x6f7168de, 0x25dfa74d, 0xd02425c5, 0xb720fd74, 0x4a76805f, +- 0xebc3e412, 0x9a56f725, 0x165f5f27, 0xcad9bda1, 0x27e813da, 0xf87c9089, +- 0xd221107d, 0xe8f89145, 0x024ba4fc, 0x32245ba6, 0x4fce972f, 0x2646df72, +- 0x73f3223a, 0x9392e427, 0x994efbf4, 0x52efd396, 0x37d5ae42, 0x2d7e5232, +- 0xe4fe7011, 0x5fec4aeb, 0xfbb56f1d, 0xd717ab36, 0xdfb517eb, 0x5c17dcbb, +- 0xcb757df0, 0x2d0fd8ed, 0xc39675c1, 0x9e5a14fc, 0xa6265270, 0x3811ff48, +- 0x351c7005, 0x71d0b4af, 0xf08847bf, 0x84ed37ca, 0xb76abbae, 0x5c2858a4, +- 0x4296ef26, 0xd2f9a03f, 0x7900213a, 0x211b01d3, 0x9b9d6e14, 0x94e43e59, +- 0x7cff50bd, 0x2ed3cd3d, 0x8fad2dca, 0xdd7000dc, 0x38ad922d, 0xe609ae4c, +- 0xadc2aedb, 0x6cf3e599, 0x775a5b2c, 0x2fb42e70, 0x1b10b668, 0x6f74afed, +- 0x681b8cfe, 0x4488ff3e, 0xb6e94aa0, 0x9a5f7215, 0x41080c2f, 0x224d77c8, +- 0x8f7fbe38, 0xeb46d818, 0x935ab977, 0x3c70a4ee, 0xca256957, 0x676f3a30, +- 0x141dd26b, 0x9d81450e, 0x515da153, 0x1201e0a3, 0xdb7bbc9a, 0x5db4a9eb, +- 0x63c176e9, 0x6e2970a1, 0x386513b0, 0xfa65c39b, 0x0c49bdaf, 0x2f9680fd, +- 0xe924eba5, 0xa9ead780, 0x37f18444, 0x02338aca, 0xc39573a7, 0xe4896289, +- 0x71d3b74b, 0x17b2bb68, 0xb12c0f04, 0x407c44cc, 0x6d7b9d97, 0xc0719eb3, +- 0x43c856fa, 0xb5aeb09d, 0x0fcbd432, 0x5363dfcc, 0xf2757e60, 0xb45e5a54, +- 0xd3ce4eb9, 0xe1b8bfe0, 0x3558a23a, 0x941daaf3, 0x630fa5ac, 0x89928e7a, +- 0x84453e76, 0x200e8378, 0x533c8083, 0x857d17c3, 0x7177c438, 0x9feba883, +- 0x44909242, 0xe8f7dffa, 0xfe5e14af, 0xab844efd, 0x9ca5b78a, 0x5dbc548e, +- 0xcc43fce0, 0xff6d2ce1, 0xe008fa6a, 0xbaa7ce81, 0x2fe98dd2, 0xad30532b, +- 0x3f1054a9, 0x68fc038f, 0xdbcf81ba, 0x344c8135, 0x5e5d71d3, 0x8b3606e2, +- 0x289dee9f, 0x2e7c7cd1, 0xe3dd27cb, 0x596f9413, 0x2e3e9abf, 0x4f03e6f9, +- 0xbd53226e, 0x979a54e6, 0x87884b7d, 0xd5be6f8e, 0x213c653b, 0xa3df12af, +- 0xe4d17eb0, 0x12bc002b, 0xa5c94c12, 0x50235978, 0xb5e14239, 0xe1491616, +- 0xd29526b0, 0xe3d3c533, 0x233d66f7, 0x09ad7c0a, 0xf67bcf90, 0xa7ec74e1, +- 0x6991fb16, 0xdcae833f, 0x6cdcd24f, 0x73493f5d, 0xea7ed40b, 0xab989fb0, +- 0xb9f1e7eb, 0xccf9fa39, 0x79fb522d, 0xae89ea1e, 0xd2575bab, 0xf9fa09bc, +- 0x7ec12bcc, 0x10f1ef92, 0xaa2fad1f, 0xbd5a43f4, 0x34772d22, 0x98798dc6, +- 0xd268e968, 0x49cfe81e, 0x474b4ab9, 0x3a31d9b1, 0xc6f38a7e, 0xa67df2eb, +- 0x4fd5d5f5, 0x2ba81dcc, 0xc2359e4f, 0x770e9740, 0x0f3c75fb, 0x91597293, +- 0x32bee5ef, 0x7d899dca, 0xfbff38ad, 0xee503afb, 0x1be39fdc, 0x86f3a6e6, +- 0xff8a12b9, 0xf5df65fb, 0x437428ee, 0x149025d7, 0xa4131548, 0x12b5f2c6, +- 0x7ea4db83, 0x413d0f5f, 0xc29b97db, 0xfe68e343, 0x8ff13088, 0x80bfeeb0, +- 0x8b78a530, 0xd4054911, 0x9410b18b, 0xb3d36b7f, 0xe06bf19e, 0xa5006eba, +- 0xefd22117, 0x0297c93a, 0xafe6d8f4, 0xae7d03f0, 0x60532019, 0x54827212, +- 0x6983fc84, 0x297901fb, 0x4c8b7f00, 0x7c7687e5, 0x123f8e99, 0xf1876fc7, +- 0xdf197a3b, 0x375b3032, 0x40ad35be, 0xa655be37, 0x08fe53e3, 0xf1f397fb, +- 0x0872fc29, 0xc72c94f9, 0x05692df1, 0x995afe38, 0x8fc6e814, 0x4bff1ee9, +- 0x186bf718, 0xfaca313f, 0xd7e8e607, 0x5fa4569f, 0x4fd6ccbf, 0xf8f9f856, +- 0x417eb831, 0xa7f5b3f0, 0x5bf5b115, 0xe3ddbf58, 0x2fe1babb, 0x875c740b, +- 0x07facbd0, 0xffafd04d, 0xfafd129a, 0xf77c6c2d, 0x7c7c758a, 0x271f8e07, +- 0xbfeb63ac, 0x97c704a6, 0xd00f3e2d, 0xa62fdc91, 0x69fb0022, 0xc940ca7f, +- 0x98bd0328, 0x84278f0e, 0x93df93ca, 0xfb870881, 0x7ddd1863, 0xcde94319, +- 0x24a79111, 0xee903940, 0xa69c65c3, 0xca271b8b, 0xe3f67f6c, 0x4f98bebe, +- 0x88b35175, 0x2c6a4d74, 0xbe742181, 0x1fa2cd9d, 0x6e6a8bf2, 0x9fb8880c, +- 0x98823d32, 0xffbe0849, 0xada8d375, 0xd31975da, 0x7b52d5c5, 0xbaaf869b, +- 0x3224fbe5, 0xafce82bc, 0x5c608802, 0xe54edf24, 0xf872a134, 0x90c79524, +- 0x5e98969e, 0x71ca8a72, 0x37cb4c32, 0xe25e982b, 0xa70eef27, 0x9f09fff3, +- 0xc199bb7f, 0x10997dbb, 0xb97ff800, 0xf20c8971, 0x9db5716c, 0x8f323d02, +- 0xf0a78e72, 0xf5004b5e, 0x001dba29, 0x5642ee7c, 0x03c3e424, 0x502ebcb7, +- 0xb6bf2d3d, 0x3dddae8f, 0x853ab024, 0x61b85fd6, 0x5d3700fe, 0x96599cff, +- 0x4fec2231, 0x84cfdbc4, 0x99fa4c7c, 0xd59909b2, 0x47ea51b4, 0x92cd7733, +- 0xda69b64e, 0xf3e9f6cf, 0xf9f40a73, 0x9920294e, 0x14299f40, 0xf7ed1d48, +- 0xb97d0ade, 0x2134ce3a, 0x8f95e19e, 0x830a13f7, 0x5ee9fa54, 0x67c0c748, +- 0xae75e237, 0xe755b59b, 0x44a0fe53, 0xb71fb842, 0x7fc41225, 0xb9f3d622, +- 0xf38dbad9, 0xbd592b9d, 0x733e74b9, 0x9e11101f, 0x1db7f9c6, 0xa34d7bb0, +- 0x99fb5a69, 0x5c682404, 0xf3fe718f, 0xe3d71b96, 0x987f6196, 0x677e37ef, +- 0xa7a46274, 0x8f89e6f2, 0x53d0d29d, 0x8f47f069, 0x2bb4d29d, 0xcba9986e, +- 0xeb660617, 0xced7e7ea, 0xae2f95d7, 0x2f95d42e, 0x9744b75c, 0x407fef9f, +- 0xf2de7f57, 0x7bf2ba15, 0xcaebd62b, 0xd46c14e7, 0x9efb67e5, 0x6bbfd5d4, +- 0x5cae9d56, 0x4d785038, 0xdf55ca1b, 0xb7a0a935, 0x4021607e, 0xabbd2a8f, +- 0xea8670fc, 0xa39e902d, 0x2ba40b7a, 0xff294f80, 0xb4b2f69b, 0x6bfceb7c, +- 0xfebd1adc, 0x069154b4, 0x7ba464fc, 0xf48d3c23, 0x45fa7f4d, 0xb4d487db, +- 0x20b92044, 0x7ef8bae7, 0x5ebf7eae, 0x647a7130, 0x7e129de7, 0x95d9289e, +- 0x3bce093a, 0x68687225, 0x7ef7a385, 0x75c05049, 0x13d2d010, 0x5a946f01, +- 0x6e2b7035, 0x679ba418, 0xc71141c7, 0xa5de032f, 0xe4832ff2, 0x0f200b36, +- 0x6ed38742, 0xf1f3051f, 0x4cf905ee, 0xff71139a, 0xf69ca8ed, 0xe00929d8, +- 0x99e98b97, 0xb69859ca, 0x3d30fa57, 0xe9805955, 0x4c0acac9, 0x63972adb, +- 0x8fd2bc7a, 0xd72a5fe9, 0xcaa7fa61, 0x558f4c6a, 0xc7fa62d6, 0x9da600ca, +- 0x554c5e95, 0x9396edba, 0xe56f5cb9, 0x81fa0be7, 0x2d7cade9, 0x15bdfd22, +- 0x0293d1f9, 0xf1c178fc, 0xcbd050e5, 0x48a31c2f, 0x5e1def4e, 0x15e87a46, +- 0x7a8bc4ae, 0xe2805e45, 0x72cf4fb9, 0x93c30c5b, 0x11a644cd, 0x0fd6372a, +- 0x60b3d679, 0x24cde624, 0x3c07da1e, 0xfa519d33, 0xe0147ba5, 0x22784aeb, +- 0x3868f0de, 0xf53fb70f, 0xefd0599f, 0xb640c2f5, 0x71161e5f, 0x67a124bf, +- 0xefaf803c, 0x95e1370a, 0x6f80d30f, 0xf0aa27ce, 0x34234d6b, 0xb1b8225d, +- 0x164d0bff, 0xb6380662, 0x847003d8, 0x19e470bd, 0x4b77ec17, 0x53eac453, +- 0x57877b63, 0xdabd3069, 0x794f59a1, 0xa17f3eb3, 0xcec6985a, 0x1dec4af9, +- 0xdcae80a3, 0x0086a7d5, 0x553053fe, 0x229a59fb, 0xb9ea38e3, 0x21c63496, +- 0x2173d29d, 0xcf67fbd6, 0x227eb7a3, 0x1f2268f3, 0xbb01d853, 0xe5741e5c, +- 0x7c0f4bf3, 0x73973f9b, 0xd22d4f01, 0xc79fb097, 0x07977fd0, 0xcc66bf42, +- 0x0796fdab, 0x7ae5bf45, 0x1ba8def8, 0xd453b68f, 0xebb43733, 0xa4cd5e9d, +- 0x15275d5d, 0xdedc196d, 0xab60dc52, 0x38fdcbd6, 0x39bcbe5d, 0x0fb75ab5, +- 0xef942fc0, 0x06608149, 0x54e129ba, 0xac7665d4, 0x1cfce813, 0x2dfb0526, +- 0x52bd5817, 0x53ec9b6b, 0x415b0c90, 0xad90580f, 0xd7729dd2, 0x3e5ca99f, +- 0x3c897bfb, 0xeedce50c, 0x2547f6a2, 0xfcd13130, 0xd05b9e42, 0xe41d3c54, +- 0x373dd9dd, 0x88b0fea3, 0x10e0bae4, 0xb3aa4053, 0x4f390f40, 0xee80d34c, +- 0xb83f93cf, 0x03ce6ac6, 0xce324c73, 0xfd3ae167, 0x27f5483e, 0x56bf3e5d, +- 0xb723cf9f, 0xe79d0125, 0x202448d5, 0xcbea3f00, 0x7e31366f, 0x6b1527c8, +- 0xc5587f60, 0xdc0b13cf, 0xf28fdcc4, 0x5b4be97b, 0x79d3e6b2, 0xf931302c, +- 0x0bdf9ead, 0x511e99e3, 0xc193ac14, 0xd371f39e, 0x40dc9fd8, 0x0d607da0, +- 0xbbfc31d8, 0xa536cf05, 0xebbefe27, 0x55f38dfc, 0x761e8ff7, 0xd28f3e04, +- 0x881bc106, 0x98548fb2, 0xf8ffbe04, 0xeb097e99, 0x1b99e8d6, 0x435af90c, +- 0xff90debe, 0x812de9bb, 0x61cde8e8, 0x25306df2, 0xfd02fa32, 0x6587304a, +- 0x7fd23fdf, 0x6bfe8f4a, 0xf7fda9ff, 0xe967fda7, 0xa7ffaffa, 0xc7b83ff6, +- 0xfad183fc, 0xc7697d2f, 0x37953f1e, 0x726e2f45, 0x9cffba11, 0x79275735, +- 0xb64bfe28, 0xe2fb46ad, 0x05dfb319, 0x20367cf4, 0x39440b4e, 0x71369f57, +- 0x3af125bb, 0xc0f73804, 0x73ffb4af, 0x067cffcf, 0xdcbe5b9c, 0x3cf1b926, +- 0x590960d3, 0x35969f28, 0xa3274e15, 0xe5827f31, 0x422a7ed7, 0x9f4f59be, +- 0x4a6dcf45, 0xa51bfb02, 0x87efae14, 0xab2a5f50, 0xd854ebff, 0x1849ca7f, +- 0x0ed8ccf9, 0x8f18bfc6, 0x1cbe71f2, 0xce9cb3db, 0x72f0f513, 0xa6f2970e, +- 0xba2a7f9f, 0x69d1fd20, 0x369317b4, 0xed8d93d4, 0x73feb80a, 0x684ce4cc, +- 0xf91eaaa7, 0xc81ef91e, 0x242e154d, 0xf11ff4c0, 0xe1a32da5, 0xff51dafc, +- 0x81a0977b, 0x176fca97, 0xfd7f0b82, 0x5cbbd2b2, 0xb1e7e4ee, 0xb600bb48, +- 0xdeb99a53, 0x12d2c2d6, 0x7b02e429, 0xe49d4969, 0x25cfd3f1, 0xf6799e3b, +- 0x7e4f3829, 0xa10cf160, 0x78ef17fd, 0x34398fed, 0x4a53bc5f, 0x4049ce98, +- 0xa7e08a48, 0x3e5bfe9c, 0xa28f8226, 0x2b26bedf, 0x87f7d8a3, 0x297823e2, +- 0x265079de, 0x63c27aa3, 0xdca0f072, 0x9f8288e6, 0xa0a989e0, 0x7d2f895f, +- 0xcffe0323, 0x7248101e, 0xd678147a, 0x027a86bd, 0xc9f109c0, 0x3f8dd5f1, +- 0x8a72fd43, 0x46eb9017, 0xedeb197c, 0xfa05f2e5, 0xa521fb05, 0x065e17ef, +- 0x2c9ff33b, 0xc143801e, 0x60b9f70b, 0x15cda73d, 0xacb7ce8c, 0xf1d2f24e, +- 0x927f240b, 0xbdf6531b, 0x229fe9e0, 0xf3bfe5fd, 0x7e7624d3, 0x709aa6f3, +- 0xc2a7f2af, 0xbe6f173a, 0x4799d713, 0x0587487c, 0x905cc45b, 0xc9985f97, +- 0xf8519db4, 0xe4c89e64, 0x14ade9e6, 0xa79d74b9, 0x768436e9, 0x81883fd7, +- 0x58bf686d, 0xfc1e4042, 0x9397b554, 0xc2ff98a5, 0x4e35f0ca, 0xaa7ef554, +- 0xb7e969f5, 0xe02b6d7e, 0x6f00dce9, 0xcabdd832, 0xe1cfd989, 0xfda65c21, +- 0x94dcef8a, 0x1444f0cc, 0x476f1673, 0xf0c982f5, 0x4ab7ea1d, 0x5d68db5e, +- 0x3d39723b, 0x3e32fe32, 0x0c779d3e, 0x93a7e7ec, 0xca304148, 0xaa8836fa, +- 0xbafba01c, 0xfc34ce86, 0x7ebff8ce, 0x9577e33d, 0xa73303ff, 0xefe7f941, +- 0x76823e32, 0x79d25fb0, 0xfcb19285, 0xca021de0, 0x45090b07, 0x897af3e3, +- 0xdcbeb9f3, 0xfe742f48, 0x43562166, 0x3c4e3037, 0x5eed01e2, 0xbdb43579, +- 0xb8c2ae56, 0xaafd9eae, 0xe5cf9c7c, 0x9522ddc1, 0xe445d707, 0xe4ccd901, +- 0x977aef40, 0x2258f11f, 0x0a7d9e05, 0xabf297f8, 0x95fe015f, 0x9ffd6172, +- 0xe3fe1e34, 0x3e6f94dd, 0xab7caa09, 0xbe46ab97, 0x2e35d82d, 0xb27edf2a, +- 0xdf3a2321, 0xf951efd2, 0xdbe30376, 0x5572d7ff, 0xa8956385, 0x9caaab97, +- 0x469e0dec, 0x2a269939, 0x9ca35708, 0x92ef3fa4, 0xa8f49eac, 0x7f4aa1d2, +- 0xbd29bf45, 0x3751e406, 0xd874aa9d, 0x1d2aa74d, 0xe89fb0f6, 0xbf2c68e0, +- 0xd2826819, 0xf7deee4b, 0x78a3f6a6, 0xf761692d, 0xebddb450, 0xf2f0a790, +- 0xaa4736e2, 0xa097ef5f, 0xf90c07cd, 0xd7bea1a0, 0xd435cf90, 0x15f219f7, +- 0x6601fa86, 0x2c3e683f, 0x9087a413, 0x92b4beae, 0xb7609df8, 0xdda22fdb, +- 0x79ce8bae, 0xd5df6d0d, 0x53f01e98, 0xc6dab0f9, 0x44e18fce, 0xb3c80d79, +- 0x15d8772e, 0xd31b790f, 0xc372bb7b, 0xfe8d38ae, 0x4445a278, 0x2016dc79, +- 0x8cf6b4d3, 0x21545f08, 0x6f48dafe, 0xd90ecce5, 0x77eec315, 0x691d126f, +- 0x59dce1cb, 0x19287a2d, 0xee2b4590, 0xba898172, 0xadd065ab, 0xc5f7e8b3, +- 0x5aec886f, 0xa735efc4, 0x670dce6a, 0x09f1ff88, 0x6d97dc02, 0x6c2ffc40, +- 0x4588e761, 0x73d3a21b, 0xe7976f11, 0xdc832658, 0x49fffaa4, 0xed559dad, +- 0xe1b360a7, 0x9ccdcb7b, 0x3cf1abee, 0x2faf5457, 0xd0f3f1f7, 0x647e5549, +- 0x1f940c90, 0xf381d070, 0x37bb9738, 0x9d6f2389, 0x75d0f145, 0x37402444, +- 0xc4445a17, 0x764685c3, 0x89fc495f, 0x24653fc8, 0x854ef28c, 0xc7f00757, +- 0x50e5deb0, 0xb30feec7, 0x4a55a41e, 0xf479fcf6, 0xb1da68af, 0xfba183e7, +- 0xfbd2ff20, 0x3d267f69, 0x603e4feb, 0xd76e3b43, 0xbbde2701, 0x337fed74, +- 0xefc841ed, 0xbef078b5, 0xa357c0f9, 0x56ba8e81, 0x8e400a5a, 0xf7600d75, +- 0xbffb55f4, 0xfb86dd1a, 0x9fc42ae7, 0x5fceccd3, 0xf3fe5a17, 0x5fb3dc38, +- 0x02aba168, 0x1d80e0fd, 0x2fe5e1ed, 0xd08ed0db, 0x2cabffb5, 0xb79fe39f, +- 0xbf7e329e, 0xb324e5d2, 0xe2fcc176, 0x7cba5d98, 0x5667f8df, 0xd373fdc0, +- 0x2d217941, 0x37cafc9f, 0x763e41a3, 0x4f7a62ed, 0x34f6d4a7, 0xaca41fdc, +- 0xa242b4ba, 0xe604ee70, 0xf94f4be8, 0xf92672ab, 0xcb834647, 0xb91f6837, +- 0xff5c785a, 0x021e063f, 0xb49623de, 0x01560338, 0xf8e97dd6, 0x1c1e419f, +- 0xaa5d20b0, 0xb824fdeb, 0x2b91f502, 0xac067bad, 0xd37ff13b, 0xd5d085ba, +- 0xbff4bbac, 0xe33fbe39, 0x0f91a8fb, 0xfef9d27a, 0xc3bf31fb, 0x5ef9c1e9, +- 0xe2ffbd25, 0x77de1b7f, 0xaebbbc51, 0xffc6eebc, 0x1deeebe6, 0xe5cc6fef, +- 0xfdc37778, 0xdf2bf97b, 0xabbefce0, 0x3ffa3b9c, 0xbeaafd74, 0xf2933bfe, +- 0x3fad066e, 0x403b548d, 0xe951f8b1, 0x683237a1, 0x1ffaefe9, 0x4ef9838e, +- 0xc635f7e2, 0x66637df9, 0x7049bee7, 0x25c7436f, 0xef3f0271, 0x3f5273b1, +- 0x5bf45fae, 0x487a8796, 0x40bffebf, 0x9598827d, 0xfc0fb81a, 0x0f42da5d, +- 0x319036fa, 0x77907cc7, 0xfaf3c8df, 0x04afe2f3, 0xcaab85e2, 0x1f37697e, +- 0x7fb53d01, 0x58f5117f, 0xfafea29a, 0xfb1a6baa, 0xceeb225e, 0xf4523f33, +- 0x09a99be7, 0x14d073fa, 0x844ddfde, 0x8726ffcd, 0x38500810, 0x58f01a4c, +- 0x2743d802, 0x4088910d, 0x6f8953f3, 0xa61b9c15, 0x7dfdf438, 0xe3c4f700, +- 0xb7cc7022, 0x7f022dee, 0xc047ab3e, 0x987586fe, 0x33589e50, 0xe183a405, +- 0xbfcc66b5, 0x038f7263, 0xe1b8cf38, 0x201e4fa5, 0xcaf55760, 0x65cba14c, +- 0x2faff1f6, 0x05909e5f, 0x03f66fe7, 0x50b778fe, 0x66d17d7d, 0xeba18a12, +- 0xfe266c5d, 0x8bb078d8, 0xcea4e40a, 0xc3cfaa2e, 0x2293f7cf, 0x7ea95cfd, +- 0xcff8746f, 0x74a25f4e, 0x2108727f, 0xfbc5217b, 0x53cf662e, 0x6bdf57cf, +- 0x3f2af061, 0xd903024a, 0xab98b8bd, 0x2c5a3fb9, 0xe97bba31, 0xc2c6bb2f, +- 0xd76266b9, 0x8fc658c8, 0x904fcc99, 0x881797eb, 0x0071eb12, 0xc58a0e3f, +- 0xa223b17b, 0xd9df9a33, 0xfade7e76, 0xd297dc0d, 0x549eabb4, 0x93f7a08b, +- 0xfcf9da30, 0x2db256f5, 0xae427f8a, 0x382ddaa4, 0x988fe8de, 0x367af605, +- 0x34da62fe, 0x8eb78b56, 0xa3cd67e9, 0x7e01e27b, 0x2bee6a4e, 0xc2f851fe, +- 0xbbe00ef9, 0x3536d6dd, 0x2edf0a37, 0x633d9890, 0x784ba1c6, 0x52d11ebe, +- 0x1f3e0267, 0xddd26f51, 0x712dddbb, 0x190c7dfd, 0x719af303, 0x04cce6c8, +- 0x3d111cbc, 0xde57efe0, 0x8beca9f2, 0x84646f72, 0xf60ff427, 0x8dc95ad6, +- 0x8293eee3, 0xfbae010b, 0x9c095bce, 0xd5caf6b7, 0xe9e6d1c5, 0x2e79b0b0, +- 0x46fbc126, 0x83f7ffa7, 0x472ec4ef, 0x579c1268, 0x75f209ea, 0x4823fa4f, +- 0x481a17c7, 0x9c31e400, 0x5c2e406f, 0x1fb82468, 0x02fc9050, 0xdf946bce, +- 0xc73da07f, 0xf9de6b0f, 0xca47d81b, 0x9837045a, 0x6dcccba0, 0xcaedd832, +- 0x9044e39b, 0xea8a19db, 0x751ee90f, 0x6a2f8687, 0xebc23325, 0x39bece70, +- 0x1d67ee30, 0xcd7d8132, 0x05d86afb, 0x96b3ff72, 0xbd07c8b1, 0x95b7ebad, +- 0x048a68a4, 0x6ba410fd, 0x6c8c3d23, 0x6fe5d18c, 0x817d7d10, 0xda5866bf, +- 0xe0a27996, 0x7c66472f, 0x2df2d57a, 0x7c99fff0, 0x6f95577b, 0xc357313e, +- 0xd1992647, 0x25be46bd, 0x4b6f9347, 0xe0192505, 0xa0ff74be, 0xd2ebc064, +- 0x68c4a437, 0x25476df2, 0x917b07bb, 0x3576b1fb, 0xbd76f951, 0x5135be46, +- 0x4fc516f9, 0xf13243a0, 0xf20aedfd, 0xc35ff02d, 0xbe403b7f, 0xbe67a345, +- 0x6df2a83f, 0x9409cb74, 0x4c9ba36f, 0x2fccff3a, 0x84df28af, 0x9f403bc4, +- 0xec79223a, 0x0767e851, 0xe45edfd7, 0x0e30367e, 0xb271b9c8, 0x5abfc71b, +- 0xb5729739, 0x08bfee72, 0x5b9caace, 0x9fa09bba, 0x643a4f6a, 0x5ee96e72, +- 0xa004e72a, 0x96e72647, 0x8ecc27ee, 0xc36f9063, 0x8237c87b, 0xac42cbf5, +- 0xfa73797d, 0xfed0f713, 0x8f2578c6, 0x131fd695, 0xb4e37791, 0x6c9c6ef2, +- 0x90f73846, 0x4eae4777, 0xf2e6edde, 0x81b1ca8e, 0xf48d5f20, 0xfbd169e1, +- 0x7f1beeff, 0xc0b7f1ba, 0x788a6f2f, 0x898ef50f, 0x35bc17dd, 0xd02674fe, +- 0xc99906d7, 0x7b971f5f, 0xec7e959d, 0x6cabf27f, 0xec8da57d, 0x1359413d, +- 0xeacb0fd3, 0x7f4280c5, 0x09739a9d, 0xf70a93ef, 0xe699240b, 0x1faa5a67, +- 0xfd3e8077, 0x3eb8449c, 0x43433d3d, 0x8bb28b0f, 0x655bced1, 0x94256d73, +- 0x8999178f, 0xc5b9ec15, 0x4167a98e, 0x66ce2d9f, 0xfe62dff6, 0x544bf55d, +- 0xf78d33fd, 0x4bcd79e9, 0x7a47ef5e, 0xb0cfabde, 0x78cebc30, 0x1f800846, +- 0xf67bcf61, 0xe285ca00, 0x15f7fd06, 0xc533fd7c, 0x79178436, 0x8b6cf45b, +- 0x8c2b3fc2, 0xe1c23a70, 0x83a2e144, 0x0a884053, 0xe9e98a27, 0xb8114919, +- 0xb6d9be14, 0x85c0ec06, 0x6f780a4f, 0x0ab75c68, 0x55fae337, 0xd176aa38, +- 0x7e5fde62, 0x33be1d4b, 0x8545c231, 0xdd1e11b3, 0xa3c03770, 0xfff6e64a, +- 0xfc16320c, 0xa0dd2858, 0x9bfff19c, 0xb90ffe88, 0xdee88713, 0xf2e7ac43, +- 0xc4f56c7f, 0x3ddd70c9, 0xe182fc13, 0xc976ae3e, 0x37dfe0eb, 0x063298ee, +- 0x721bd3b6, 0x97b83e2c, 0xa30b6edb, 0xf0e9541c, 0xcd874e23, 0xfafbbe1c, +- 0x73c24c56, 0x06e0b361, 0x643ca43d, 0x5396b843, 0x2ad1b47a, 0x72fc9f87, +- 0x1bab872a, 0xf334bbdf, 0xc1e289fd, 0x751fe704, 0xf7b00abf, 0x185b6331, +- 0x181bca5e, 0x1849325e, 0xb565efed, 0xd7442782, 0x04bcd653, 0xf95582fd, +- 0x5a1c7f4c, 0x5fa1453c, 0x25fa3473, 0x8acc9c60, 0xbcc59bec, 0xf54b0cde, +- 0x3f9ec11f, 0x1d47f283, 0xdffd2192, 0x95f7d0b7, 0xf88c45fc, 0x6dc390fa, +- 0x01d5c007, 0xfd330bf0, 0xdf09742b, 0xe5e5a8cd, 0xae0ebf66, 0xc8ba9f93, +- 0xa0bf6fe8, 0x1ba51d80, 0xb4cf406e, 0x370a9c7c, 0x43c067a0, 0xf2117ccb, +- 0x7dde1479, 0x17ae7bd2, 0x7cb4c7ee, 0x04ffb85f, 0xe08b7feb, 0xfdd65121, +- 0x3bfbe99d, 0xfc6f75d2, 0xbe8191fe, 0x8f85b2df, 0xdefa058e, 0x93df202f, +- 0x3dfd3896, 0x4dcecc97, 0x0f946ddb, 0x0de61ee0, 0xe955b3c9, 0x1cc21f29, +- 0x509e70ce, 0x6b927634, 0x57e02161, 0xff4560d8, 0x40c79c30, 0xe56aafa6, +- 0x491b0ef5, 0xf7b323bc, 0xf9c6fffe, 0x497d37ac, 0xf1828fcd, 0xd3368e40, +- 0xc64786f1, 0xaa17ee33, 0xeb4ae01d, 0xb1fe5bb2, 0x7ce3a975, 0x7299ff57, +- 0x28f78ad2, 0xc38d1faa, 0xe0942be4, 0x304d3afc, 0xc2d1fdeb, 0x70ffcf1c, +- 0x2dfcb2ff, 0xab1493fd, 0x4de2fdee, 0x29f883a2, 0x4af33edc, 0xcb542fc8, +- 0xec026f78, 0x3ee8931f, 0x8ecf9348, 0x1eff7b8e, 0x5ef1172c, 0xfb37d6e6, +- 0xd5bdc294, 0x8a67ccad, 0xa0219adc, 0x740ef0fe, 0x70f41e36, 0xf85af12b, +- 0xfb3cb490, 0x7801717b, 0x5f519067, 0x7ca1593d, 0x5021a63d, 0x7267a905, +- 0xc02de138, 0x009144d7, 0x7dbd5abe, 0x7bfec326, 0x06495fdf, 0x9ea8ce98, +- 0x398cfd80, 0x5ea11242, 0x8f11378e, 0x3e9be333, 0x3a76f77f, 0x4547f1bf, +- 0xcdeb428f, 0x0070ec3c, 0x6cdf0d9f, 0x5c0d3e22, 0x0aa04872, 0x4fe347ec, +- 0x79076f79, 0x1ef54050, 0x682ff7f0, 0x4172aba9, 0xed80b37e, 0xa9befdcb, +- 0x1dbf3a2e, 0xbd4e9fb5, 0xad02e40e, 0x6f94dd07, 0xebcaf566, 0xb2b80f05, +- 0x946cb5e6, 0x0bd46e51, 0x476ca0f8, 0xd6562040, 0xfb4ac06f, 0xb699b1dd, +- 0x8bfd84cf, 0xeb7e87b6, 0x76f77d3f, 0x9e743b90, 0xdd91bed8, 0x76d1e6cf, +- 0xfd49f00a, 0x70afec12, 0x5de040b3, 0xdb234142, 0x4a8e0a9f, 0x3a6f281e, +- 0xbbee24f8, 0xa978e9d3, 0x851fb0e9, 0x8efbe0a6, 0xdf1b82b1, 0x43494dd5, +- 0x0b05d5b9, 0x01d60686, 0xe05cbeec, 0x51fe7e79, 0x2d37bff5, 0xcf377fcc, +- 0x43ee42b3, 0x3b2b79fb, 0xf484dd31, 0xfa0ca9f4, 0x6f0a29da, 0x3bf7851f, +- 0x70e17fdc, 0x9b72c7f6, 0x673c7f66, 0xbff48419, 0xfa2279a8, 0xb9262d4b, +- 0x633faf78, 0xdf3bd33c, 0x0016d1be, 0x52dbddbb, 0x3f7c3fb8, 0xbf05a37c, +- 0x7260ee77, 0x1b4073b8, 0x6f4f69da, 0x47bc0896, 0xa22cdaa8, 0x28dd389c, +- 0xb8b5fde1, 0x9db94245, 0x21e983bf, 0x7eb33787, 0xfd30374f, 0x3b96f26d, +- 0x9c3ec2a7, 0xefbd4dbf, 0x3d5a7266, 0x0bb9e687, 0x519bfb75, 0xb872aace, +- 0xa0a3c394, 0x5fef0eba, 0x54b7728d, 0xf20d0fdd, 0x65ee14b6, 0x8435fef1, +- 0x341a547c, 0x983913fa, 0x0d73863c, 0x12e843d0, 0x51d977d2, 0x46b9c089, +- 0x2a63b8f8, 0xec2ce7ac, 0x7c7cb4f7, 0xfb85e08b, 0x966382f0, 0x81e3ea00, +- 0x15fef3f9, 0x2c0f99f6, 0xbfc05044, 0xca83e29d, 0xf84b6ca9, 0xefd18f2f, +- 0x82b1df67, 0x9fa508a7, 0xd57f08f9, 0x1b73342f, 0x7cc8f3f3, 0xde0926a7, +- 0x7d29927f, 0xd7e40e50, 0x91a7c48a, 0xef05671b, 0xfdb377ed, 0xfff5adc1, +- 0xf3ab94cc, 0x6fed9f60, 0xd951f265, 0xddfbe126, 0x447cfcc3, 0xb7e80bcf, +- 0x6377b859, 0x87a1ac92, 0x931bfdc2, 0x6b20e8a8, 0x15447fb8, 0x285bf77f, +- 0x0f0a71b3, 0xcd3aee08, 0x6a3f6a38, 0xd65ef2bf, 0x967ed06e, 0x217fd6f6, +- 0xf9d70fcc, 0xc3720c85, 0xf18f4fd8, 0xfb27e97b, 0xc0d62fdf, 0xb7eced3b, +- 0xce6e7445, 0x20fa78fe, 0x9a80bded, 0x590c7eaa, 0x57889aef, 0xbfecbf03, +- 0x06af10c4, 0x28e34ddf, 0xddfc53ff, 0xb9f4ccd2, 0xe42771a6, 0xbbcc4cd2, +- 0xb8cbdf81, 0x0a6cba3d, 0xca69efbb, 0xf0156778, 0x014cf4ff, 0x7df881e9, +- 0xd4049f72, 0x4ff014df, 0xed64cfce, 0xe07b69f3, 0x1927a6cb, 0xa179529f, +- 0xdb293c80, 0xd62a71bc, 0xe81417af, 0x3e6ea9bf, 0xd90525ea, 0xfaf2c122, +- 0x1527a813, 0x00489f34, 0x5bfca67e, 0xd940fa03, 0xc41b8b04, 0x2a97cab1, +- 0xfdcdbf9f, 0x3dd58989, 0xcbf8fc0a, 0xf0a2a980, 0x709478b7, 0x65f195bd, +- 0xdbe33679, 0xb04877b7, 0x73e1abc2, 0x8f956be4, 0xcce3e045, 0xde1f1f08, +- 0xbe06593c, 0xd0101d3e, 0xc83262ef, 0xedf3e001, 0x31efb702, 0xf96af63d, +- 0x667a4afc, 0xd85fe529, 0x573e552f, 0xcfc8daf9, 0x3bb6e6ad, 0xddf71e60, +- 0x4c75c368, 0x3fdefefe, 0x15e4c7de, 0xfe4dd7de, 0x204903fe, 0xccccf31f, +- 0x6b8547af, 0x81f999a9, 0xcd5798f5, 0x6af5390a, 0xc79867e6, 0x5ede8b46, +- 0xc712d872, 0x25eb9dfc, 0xf12bfba4, 0xbb3e0f67, 0x5abcfe4a, 0x7f12babe, +- 0xfb8be3aa, 0x061cfdf5, 0xd9eb8e20, 0x6385275f, 0x77f1c288, 0x5fa0cf8d, +- 0x4fe7f9d9, 0x143c00cc, 0x0e74a3ef, 0x24e8d5f4, 0xe6739021, 0x455bee00, +- 0xfd17a24d, 0xaca1cd65, 0x3e5a9ddb, 0xc53ffe66, 0x9e913a2f, 0x0259768a, +- 0xa2fb69d3, 0x468f1f3d, 0x61958c3f, 0x3ff24ff4, 0x7f65f5cf, 0x83e068db, +- 0x43f33322, 0x9985ca32, 0x773fa656, 0x82cfb5ec, 0x2c0d09f5, 0xf05140de, +- 0xb9a2c92e, 0x956698a7, 0x2f787ad4, 0x0c74a7e8, 0x7e6131ef, 0xaaee77da, +- 0x76c751ff, 0x9a8a2726, 0x2dc400a5, 0xd9d86a28, 0x45a5fe09, 0xff682cc7, +- 0x14f86f2a, 0xbf27e7fd, 0x2bed03b8, 0xeea2cde5, 0x3f87ad3e, 0xb218835f, +- 0x535a1f80, 0xd1ffde29, 0x07cc09fc, 0x77dcffb9, 0x7e2b37f4, 0x3f1eff71, +- 0x6ff16105, 0x7c81739f, 0xcdbad739, 0x0d7d7e85, 0xdb5feedf, 0xb82f7fc3, +- 0xddeffb9e, 0xb9e09a72, 0xdeffba26, 0x3285f839, 0xbd5683ca, 0xe8691eff, +- 0x9d25fa83, 0x946e5667, 0xfd6e8ffb, 0x4f17c77c, 0xc779ff83, 0x869e4fae, +- 0xedfc9779, 0xafc1a7b3, 0xe1b01c88, 0xfcfe57be, 0xabafe87b, 0x6564dbb6, +- 0xfdb9da74, 0xee77f439, 0x81e2c0fc, 0x9ff73ade, 0xb2ff034e, 0x92979dce, +- 0x6cb99ec0, 0xef684dff, 0x727bb65d, 0x6fb28932, 0x6fd029a8, 0xadfc2ae0, +- 0xdc3b788d, 0x9ffd1874, 0x83bc53ce, 0xcbf6ec1c, 0x7f32960c, 0x63fb8557, +- 0x6ff74636, 0xd97fe1ef, 0x37adfb74, 0x626ffc82, 0xfd15e4fa, 0xf8a5df30, +- 0xf02afebc, 0x6dfdc8d8, 0xab7cb783, 0xf879e61f, 0xc9abe285, 0x9a2fc780, +- 0x29faff16, 0xd3ea6b28, 0xe8661fab, 0xfaa7e02a, 0xdeadfbcf, 0x6fc0ac57, +- 0xfe837ebb, 0xe9bf80af, 0x5f47ec0a, 0x83fbc1a4, 0x2e785233, 0xfde13fec, +- 0x52bf8c16, 0xe47dffb4, 0xefddcea7, 0x709a9da0, 0xd24ef63f, 0x8dfcc3fd, +- 0x7adebe05, 0xe4dff327, 0x4eff0078, 0xb9df85c5, 0x6ba3271f, 0x37b3bfd5, +- 0xacafcebf, 0xfd56ff4c, 0xffeb4bfa, 0x2324fdcc, 0x01b21378, 0xf5be275f, +- 0x070a823d, 0x11cb9737, 0x7ee8e5bf, 0xcb7eddb4, 0x3e01bc06, 0xf6ea9f61, +- 0xfef9a64b, 0xf24ed063, 0xf83f347e, 0xefe63ace, 0xdfe929dc, 0xc4f0468f, +- 0x0d5823df, 0xab81cbfe, 0xd2be5ff3, 0x9c2bbe3a, 0x3452824e, 0x3abc27ae, +- 0xdf2e8ebe, 0x3fc26d13, 0x916d5ef6, 0x931f7c60, 0x7f044b60, 0xcf681390, +- 0xf37f3eec, 0xfb7076f5, 0x22f3c77b, 0x09aebffa, 0x6ef9461e, 0x10651f94, +- 0x7cca2347, 0xbe98d987, 0xf6ccd65e, 0xce5d8e8f, 0xd3f68380, 0xd22f6871, +- 0x09e35975, 0x7bfb4fd9, 0x32b7e1bd, 0x7c62c7bb, 0x4047fb04, 0x178e9eb3, +- 0x7e668e0e, 0x6fdeccda, 0x1f1c671c, 0xfa25bca7, 0x9f8de538, 0xf629c6ea, +- 0xe3b76507, 0x339de3ca, 0xfe82ef7b, 0x3d32b5ce, 0x9c505cf1, 0x587ded16, +- 0xf7e24d8a, 0xa52cd561, 0x25c628fb, 0x2438b271, 0xf5062ba2, 0xecce65ce, +- 0x9009b163, 0x5407e8ca, 0x0dfb82b5, 0x0293ccfd, 0xfe72aef8, 0x577cc098, +- 0xf6357c03, 0x23edc91f, 0x294aafa0, 0x776099b9, 0x391dca30, 0x1a0244c1, +- 0x4e732f7c, 0x5ef0564b, 0xf01fd424, 0xb4e33c79, 0x647efd04, 0x647d5fb0, +- 0xe9926b26, 0x0bf23efc, 0x5fb4159e, 0x03c7f5f2, 0xfb3d9d72, 0x87bef357, +- 0xa9bd9d44, 0x0e3e12cc, 0x8af215e7, 0xc423ef0d, 0xe78c3603, 0x0db4fe50, +- 0xf7787bd7, 0xdea2cf57, 0x610b6bfd, 0x54f443f7, 0xdca47103, 0xbbd38fac, +- 0x3ffa7abf, 0xc686af41, 0xa7fcfc74, 0x4f387d69, 0xfcf1da34, 0x762bb5d3, +- 0xafcfea34, 0xe403383c, 0xd19dbe5a, 0xc98bfe63, 0x5fda2a81, 0xb7cb227b, +- 0xf18018ef, 0x39778a03, 0xf0f11fd1, 0x60ca97ee, 0xd17cea9f, 0xa4066e0e, +- 0xffae15f3, 0x3bc786ff, 0xad1495aa, 0x3121725f, 0x2077da2b, 0xe56790c5, +- 0x7f049ef8, 0x811f38b2, 0x1639ab1d, 0xbd508fdf, 0x79cfd758, 0x07bf7c29, +- 0x97dfd8e9, 0xf5099bbd, 0xac607905, 0x1fff96a7, 0xe5b7931b, 0x11ceda16, +- 0x872e5fa9, 0xbabe58f3, 0xad27932f, 0x2ae7ff58, 0x9ef2f39d, 0xebfab2fd, +- 0xf575036d, 0x3c65f6d4, 0x7e9188de, 0x16fde71f, 0x2c337c37, 0x288d3c5a, +- 0x3fefc7f3, 0x04df8815, 0x1b4ecb7a, 0x778251c6, 0xbf0fe0f8, 0x5ff76647, +- 0xc610ae25, 0xe5c7d933, 0x084c4971, 0xe5f4abe3, 0x90fa80f3, 0x17b6d627, +- 0x2fa5ef00, 0xe7c408d9, 0xe9c57d29, 0xee977c05, 0x57fdaaf9, 0x66efe099, +- 0xe95ebb47, 0x7482ff2b, 0xcd096a50, 0x3b6578c5, 0x99e2042d, 0x237cec75, +- 0x43b5f80d, 0x7fc5a50a, 0x695ebdcb, 0x478862d0, 0x52efe7e0, 0x7de18303, +- 0xb33efabd, 0xd33917a8, 0xdef76365, 0xbdde6cfb, 0x7d77e436, 0x95739edc, +- 0xefb483cd, 0xe8948bb4, 0x9b4df172, 0x69d977f4, 0xa3b8e5bb, 0x37c73bc7, +- 0x49e73e61, 0x2018126b, 0x0e3ea8cb, 0x21a8bcf2, 0x0fd83fbd, 0x77d4d90e, +- 0xec2c4aec, 0x05248747, 0x0687d9cf, 0xfbb5fd28, 0xab4a99cc, 0xaed09662, +- 0xdd576983, 0x097d79a7, 0x66da27f8, 0x1f7b9345, 0x8f08ecd9, 0x1bc5ab22, +- 0x07649ded, 0x02deafdf, 0x1b224063, 0x1d43f817, 0x401490f7, 0x4628bc39, +- 0x0ff4fd61, 0xb8bdf0c8, 0x2d20ef61, 0xd5cd0a1c, 0x29f28f58, 0xd490b3c2, +- 0xf91a99c8, 0xb8578ead, 0xf198a1dc, 0x3ff9ba3d, 0x8c55e9ba, 0xc88d19e0, +- 0x7472789a, 0xb33b45c7, 0x2cc0eefa, 0x7e015ae5, 0x9b75c932, 0x6a952045, +- 0x1218f7e4, 0xd541d4c4, 0xaabf162e, 0x3c9c8082, 0x83471dd3, 0xd7811a60, +- 0xfdf72803, 0x92190803, 0x1286fa0e, 0xefc0d6eb, 0xf385cd92, 0x082b98b1, +- 0xddd31793, 0x7e0a7fa0, 0xe94cb91f, 0x61b2aaa9, 0x40f78b10, 0x0d7ef0bc, +- 0x3f3a5855, 0x4bf5fb97, 0xd5f907a0, 0x27df70b8, 0x620a2a81, 0xbb453370, +- 0xe2c224eb, 0x463bad99, 0xb48fe7b4, 0xffaf8118, 0x0731ca20, 0x6984fc89, +- 0xc82ac41e, 0xbfd8aadb, 0x9cfdc365, 0xa0424dc3, 0x241dda1f, 0x63a9a764, +- 0x969cf9a4, 0x34995dff, 0xf74ba1af, 0x91b97d04, 0x335ca82f, 0xf8441b8c, +- 0x373f7ed1, 0xa1b9fbf4, 0xadbfcfdf, 0xe54e155f, 0x10e941d6, 0x65756087, +- 0x8d8dc390, 0xa370e567, 0x710e19f0, 0xc62988d7, 0x11cdefc3, 0x367c31ae, +- 0xf14fa816, 0x1d26273a, 0xd8f3f4e1, 0xaff06103, 0x04b50925, 0x04abc3ce, +- 0xc922fe35, 0x11da6875, 0x70f915b7, 0x4e671f3d, 0xf577a30c, 0xfacf7c1d, +- 0xe8efbc36, 0x5bd6df51, 0xf5e898fd, 0xc7cdbd9d, 0xdf3e751e, 0xbd94ce55, +- 0x705bfef2, 0x6f2ddb5f, 0xfa9414dc, 0x6273db77, 0x71a5bf68, 0xc36b7fed, +- 0xb46f4c2f, 0x2fe3d7f6, 0xd295e806, 0xfd60cc4f, 0x7bde2377, 0x7cf997a3, +- 0x48ef341d, 0x9bbaeba5, 0x9ea53f8f, 0xb3df77dd, 0xe8e3d98c, 0xf50bcff1, +- 0x77faf0e7, 0xaed1f35b, 0x87e62270, 0x9ee12718, 0xde17a65a, 0xf78890f3, +- 0x08e23dab, 0x7f942fc1, 0x042e5dee, 0xe2d1e942, 0xe3779122, 0xf8f3ff68, +- 0x4338c6f8, 0x5d4ca23e, 0x338b4627, 0x7d4ce8c4, 0x5f8c6587, 0xf2e488b0, +- 0xeffa51f8, 0x933736ed, 0x5c80e687, 0x2fb2323d, 0x3a5237f9, 0xd2927d06, +- 0x8967dc31, 0x712d3dfc, 0xfabfccc9, 0x3c9d788e, 0xb128a0bb, 0xc536bfb8, +- 0x2e1be2eb, 0xc724af1d, 0xf9b5e469, 0xbf175da2, 0xa4f24aa5, 0x2e92bc80, +- 0xca14475e, 0x3ec5f257, 0x5394d144, 0x1999143d, 0xee5136dc, 0x200398a4, +- 0x5ceecce7, 0x6c7a0f92, 0xb54fa31c, 0xa2309cbe, 0x9b7c6f5b, 0x262c7bfe, +- 0xe96cf911, 0xc6192512, 0xeb73da09, 0xcae893e1, 0x3d1cf8f6, 0x83bfc1e9, +- 0xd60abbad, 0x3d73de9d, 0x83c7b255, 0x774e73fa, 0xcc2b1bbc, 0xef28b44f, +- 0xdfbf302b, 0x2aec044b, 0x39e3e13d, 0xbbf0a013, 0x7e87e810, 0xf4ec6221, +- 0xc3afe8a1, 0x1075e4f5, 0xf5ca91cf, 0xe3be3c55, 0xf1cf1e2a, 0x737f1e61, +- 0xa8f38f0d, 0xa9eacfc2, 0xd68238c6, 0xab7facc1, 0xc127e39b, 0x43e3e1c4, +- 0x529ac97d, 0x3684f781, 0xe2084577, 0x74fe9171, 0xbb69809f, 0xb27e11ab, +- 0x927da09b, 0x05bcc7d6, 0x6a9534f2, 0xcc1e2247, 0x4f920aee, 0xfbb61fcb, +- 0xd9b802de, 0x41bc7d14, 0xc340ca4b, 0x9e01b0bd, 0xc93d3d2a, 0xa70262e4, +- 0x127c2327, 0x53df1664, 0xf4dea3a5, 0xcfee2aaa, 0x83d2a9bb, 0x2b8f1569, +- 0x84710555, 0x8f294e20, 0xcfc89423, 0x8e145589, 0xbe09fdf0, 0x6655566f, +- 0x9da67963, 0xa60953ed, 0xc012838a, 0xbb309e25, 0xf49f8267, 0x55cc22cf, +- 0xfc527e14, 0x7abc8144, 0xe7c3588f, 0x7441e9cd, 0xe1710d9b, 0x2f002794, +- 0x26486f35, 0x9715e7b8, 0xd63e4cdf, 0xcb38b3d0, 0x3476071b, 0x6013e1d1, +- 0xe039fbff, 0x2367ce95, 0x59c6179d, 0x9ab0f4e5, 0xa72d7de3, 0xde3cf587, +- 0x5d382fe7, 0x0fd74a3c, 0x7b0f2af9, 0x1a61b037, 0xc84b8bf3, 0x68b8f130, +- 0x3bf5a221, 0x8904f38b, 0x3c89d74c, 0x718a60aa, 0x0b31c8ef, 0x247d8bd2, +- 0x7e508af1, 0x8b0081ec, 0x0a9b9963, 0x1a9c66fb, 0x128272b7, 0xb61f1b37, +- 0x3e3ccc86, 0x1dcec89c, 0x3de351ad, 0x590e7956, 0xdbdefce1, 0xdcce0e7c, +- 0xf6bc6043, 0xd20e8851, 0x7b3b97c7, 0x6a3bcd31, 0x7f4dfea9, 0xda5f1eec, +- 0x5ae7a06a, 0x373f010b, 0xbe7f9d07, 0xf7b1af46, 0xd9080762, 0xa9d8a47f, +- 0x45074b3c, 0x97f7e283, 0x006c83b5, 0x05730a67, 0xa49b1dec, 0x039054dc, +- 0xdba2e29b, 0x4cec626d, 0x8e65765f, 0x8d75d1d0, 0xee76c5e4, 0xf4746309, +- 0x4fe5c35f, 0xdd1c94fc, 0x7cde5577, 0x0bfac31e, 0x30997dda, 0x998ba4af, +- 0xb709bfc8, 0x553f9745, 0x3887ec92, 0x98a35500, 0x94cff3bc, 0x43d59e99, +- 0x7539309e, 0xf8f08c81, 0x86467435, 0xbf07d413, 0xe2eb299c, 0x3e03ae19, +- 0x63710619, 0x02affd19, 0x38a9a07e, 0x89fa4658, 0xf3c26e9f, 0x5fce1aea, +- 0xda7e730f, 0x11e9f9c0, 0xc40b23e0, 0x677c659f, 0xb0e19e26, 0x58b9549f, +- 0xfe012ddc, 0xc5549b4f, 0x7187982c, 0x04598f8e, 0x32a89fb8, 0x4317537b, +- 0x59e2d6be, 0xe31e60a9, 0xed6bfb01, 0xdf7f344a, 0x2ce27d90, 0x6cd7853b, +- 0x6ac7bf8e, 0xacfe22c7, 0xac014f6e, 0xc188eccb, 0x50d57df3, 0x73b4416b, +- 0xb33b74c2, 0x2f78508f, 0x4cfa7e84, 0x873ee9cb, 0x66a19981, 0xfdc21666, +- 0x1d077831, 0xedca7e85, 0xfd218f4c, 0x46b064fd, 0x38f0d40e, 0x93f14471, +- 0xb0791ae1, 0x0254c872, 0x729e9e76, 0xb83917a0, 0x2ac1c98d, 0x062fef81, +- 0xf8f156bc, 0x341caadb, 0xc4a35e03, 0x4d7d5ad7, 0xbe7deeb6, 0xb1b8e5c4, +- 0x3b3b3ade, 0x9e21ad37, 0x59e84fb0, 0x0eb4e14e, 0x3fd914e0, 0xa0e3ba73, +- 0x3aca20fd, 0x0ceff28c, 0x532083ec, 0x338c3ecc, 0x9e5648b2, 0xe5720f18, +- 0x4cbf98df, 0x3a827a6f, 0x42c5fe5e, 0x2ef267dc, 0xbffdc78e, 0x213c76a0, +- 0x2b02ae70, 0xf69de6bd, 0x753fcde9, 0xd74ede01, 0xcdd3fbf2, 0x57fc0052, +- 0x2eaed74e, 0x4db57cc3, 0xfc4c9c01, 0x882e03e5, 0x69e8b2cb, 0xcf53ef11, +- 0xd0d3f8c4, 0xcbebefff, 0x7f8d4597, 0xb5ba8ac4, 0x169f2069, 0xef8b5d6d, +- 0x7bc4ceec, 0xf26ae687, 0xbd415324, 0x96d38d50, 0x0bc58cf7, 0xfb6f5dfa, +- 0xe8e6de52, 0xf82afde7, 0xca5af415, 0x1eb7a02f, 0x4384e574, 0x7e67ff14, +- 0xb27d4369, 0x4277f64a, 0x1dab6abe, 0xf8aa905a, 0x1e3ff1e8, 0x0bb4dfb6, +- 0x76c3c7e4, 0x89483eef, 0xed4bc583, 0xf8ea3e6d, 0x856b60ed, 0x78a7b77b, +- 0xa78a141c, 0x1bbb3a99, 0xe76b77bb, 0xed621476, 0x97863ca5, 0xbb94bd2b, +- 0x710c9f98, 0xe7572f47, 0x1f9f9673, 0x07b56d17, 0x03d14656, 0x84f7f116, +- 0x867df88b, 0xbb672f4a, 0x67462df5, 0x1725ff6a, 0x62f465af, 0xb9e14ba0, +- 0x9f874851, 0x7f70911d, 0x11bb9e11, 0x5d94b4e3, 0x12fd61b4, 0xf828f3d1, +- 0x45b79377, 0xdefbd3a4, 0x59f78718, 0x9078861d, 0x09e983a2, 0xb1779a6a, +- 0xe69fa758, 0xb0ca1605, 0x2c5de79f, 0xf60c7463, 0x93983867, 0x689b5e6f, +- 0x0396f4e6, 0xb4dd2fed, 0x6fcbd692, 0x264ef463, 0xbed0cbf8, 0x3cf76758, +- 0x8a0e451c, 0x3717450e, 0x84adbf34, 0x49f873b5, 0x7ffee682, 0x9e8b8f11, +- 0x45c5917f, 0x493f6e24, 0xf2e73a01, 0xfa9f4229, 0x261db5f8, 0x7ae32f86, +- 0x133af813, 0x437bd7ba, 0x3efdeb2f, 0x0fd72f5b, 0x1bc6dbf2, 0xf1abf5d6, +- 0x5915d6d1, 0x5fac04cf, 0x970de3c2, 0xd5de1898, 0x4c1d1bf2, 0x7b69ab0e, +- 0xa5e22ce5, 0x8f2151fb, 0xb81798ab, 0xcf3e064f, 0x2f171cdb, 0x5f99d668, +- 0xa7e7473b, 0x1f3b5792, 0x6fe570e3, 0xd02f2f9e, 0x9e3755f0, 0x6baf29fc, +- 0x86e374f1, 0x3a57533e, 0xbdca1f60, 0x3ee301d6, 0x65f73a5b, 0xbc32fd02, +- 0xa3fd919d, 0xdd0e502b, 0xcef68ae7, 0xdbc046e5, 0x387ced38, 0xc9fb06de, +- 0xa37bed48, 0x58e3d18b, 0xbe2b6fb6, 0xdbbbee1f, 0x4451649f, 0xd137977a, +- 0xe38469f1, 0x59bf0e2c, 0x8e1c70dd, 0x8657547e, 0x7f3a75e3, 0xc8e15ea9, +- 0x49c2aff1, 0xb0f54efd, 0x18448e99, 0x57f7b097, 0x0aafe3b5, 0x27f1917e, +- 0xa1defaf0, 0xa2fc824f, 0xf4f812f2, 0x1f3fb3ec, 0xb0f76dad, 0x30bde27d, +- 0xbabea90e, 0xd83fb57b, 0xdf50797d, 0x0473c93f, 0xadfe6bce, 0xae8aa7a2, +- 0xa9f630bb, 0x56ae10ce, 0xaeaddfbf, 0x760e186c, 0x20caaad6, 0x40bb54a6, +- 0x8a6a8bbd, 0x685fd01e, 0x78b46f15, 0xbc39eb54, 0x32b65757, 0x4fd5913b, +- 0x240f60dc, 0x99c92f8c, 0x333768b1, 0x837af43b, 0x60dcf92c, 0x7bf993a7, +- 0x5becc967, 0xe7099e97, 0xbf0c84e0, 0x1d6bbe06, 0x4362ffcc, 0xf83f52ca, +- 0x3ec159ed, 0x22ed0839, 0x81767417, 0x9c8bcd57, 0xf0d4ee94, 0xf58331a3, +- 0x904252e5, 0x246e1da0, 0x479daefd, 0x2eceab42, 0xd98b846a, 0x12fbc2ea, +- 0x2ef6e133, 0xeff50f0e, 0x72e5ac64, 0xcddb86b8, 0x197b071e, 0xbb4adf85, +- 0x35a3f70b, 0x39d898d7, 0xf3c66ac3, 0x40f1b835, 0x8fd6397d, 0x7ac1b0eb, +- 0x43f3d044, 0xe4427798, 0x7b43111a, 0x238f9009, 0x3ef9008a, 0xf406b424, +- 0x6d89aed6, 0xd9f7c3f7, 0xe01d5f36, 0xd6d4cbf7, 0x4fd802e3, 0x00c37d73, +- 0x3fa2b5ce, 0x7ff5a143, 0xa033862d, 0x3a2d1a5e, 0x6bd2cf16, 0xa7daafc0, +- 0xf16197b9, 0xb1792340, 0xe59afe67, 0xc53dc366, 0xe5b4c3d7, 0x2d946cfb, +- 0x7bfcf5c6, 0x0b1f0929, 0x74b6ef28, 0xf173c9db, 0x8e51d07d, 0xa00fa44f, +- 0xbf6c23af, 0x625660be, 0x4dfd99e3, 0x67675579, 0x6aaf2ab6, 0xf3f333c6, +- 0x57a53d50, 0x74aba7b0, 0x35ecd832, 0xa90d3d01, 0x74b5dfa6, 0x832f4511, +- 0x72f70671, 0x0fcea11f, 0x3c0007de, 0x6c598bc5, 0xc5d031bf, 0x25fb6ebe, +- 0xb32a7bfb, 0xaf33c255, 0xa238f962, 0xd1fc60fe, 0xe3edba0f, 0xcdde58ab, +- 0xd80be572, 0x05a1dc7d, 0xa6d7e8b1, 0xcb7663ce, 0xc3d056da, 0x2ea4b766, +- 0xd999fb84, 0x0afeebd6, 0x7c293ee9, 0xe2720ec8, 0xe79e2ca7, 0x2abdefdd, +- 0xfbba69d9, 0xdef8addd, 0xcfdf34fa, 0x04b092e6, 0xb711f7f8, 0x01ebeccc, +- 0xc405d3e4, 0x0941f3c3, 0x84f7bdce, 0x42de7702, 0x1abef773, 0x628e05b8, +- 0x5f848f73, 0x82f97403, 0xc368a9ee, 0x7b35db56, 0xd679675e, 0x66fd7bae, +- 0xb227ae2b, 0x5fae2b5e, 0xf6441f5d, 0xb8eef2c4, 0x912e2cc0, 0x0b498f0a, +- 0xdb67bad9, 0x7c98fce7, 0xdb39de8b, 0xccafea3a, 0xc7cd887f, 0xa1cf9f08, +- 0x4ec5ca88, 0xa4e4d787, 0xe1d0ffeb, 0x5eb49d15, 0x669c3589, 0x62fc881e, +- 0xe8997c81, 0xae8926bb, 0xdf00fcff, 0x438044b0, 0xd2ab9f6b, 0xf4e4df2f, +- 0xefa726fd, 0xe3bbd337, 0x1ea02718, 0xae024f7d, 0xb3a7066b, 0x47dfbb35, +- 0x6ff3cc3f, 0xa54b78b0, 0x83eb72a2, 0x49133768, 0x6aac38b4, 0xdfb726fa, +- 0x0e954e28, 0x0dce3c03, 0x4d1997e3, 0x9fbbf476, 0xf4ea2991, 0x029919f0, +- 0x1d6b87f7, 0x2f4e877d, 0xd2f5c55d, 0xff80fd9e, 0x859fb181, 0x39e327cb, +- 0x9eec8f6c, 0xffdff208, 0x85b3a334, 0x293c2853, 0x13ace5dd, 0xfc70def0, +- 0xf20236a9, 0x1c4d6170, 0x85f3fb81, 0x20fbfc0f, 0xd650c788, 0x81b734aa, +- 0x1e080c9c, 0x8b25bfb0, 0x467e324b, 0x10e9b5e7, 0xbf2187db, 0xf0e9e604, +- 0x3d8d0e2a, 0xc8aa43ba, 0xdf5d0370, 0x3c82f0eb, 0xf7877f98, 0x6fe78c03, +- 0x7b041d0e, 0xf99ebab7, 0x00d928f7, 0x9b41f9ff, 0x312b5317, 0x36b950c7, +- 0x90ac4cdf, 0x6cc4cb26, 0x73cb7c83, 0x1e4bb05f, 0x18e4eeb6, 0xdfdf6562, +- 0x72f404b8, 0x5bac835d, 0x3ea0a8f7, 0x3eb37d7f, 0xe7d2119f, 0xe7d11ec7, +- 0x431a83b7, 0xffc395f1, 0xfda1d4ce, 0x877f0216, 0x0b45f8a6, 0x0cbeb3fa, +- 0x05fa007b, 0x4dde50da, 0x82c96e2e, 0x5e4fd6fb, 0x9ce09a70, 0xdf9befbf, +- 0x786d7de2, 0xc9e31d87, 0x0c53fc1f, 0xc07f0189, 0xa15b6d17, 0x04e298bc, +- 0x2fc577ec, 0x0ec0eada, 0x7a8467b2, 0x5fa00d1e, 0x31bf9ec5, 0x76f0f9bf, +- 0x6fee004b, 0xdcfbd93f, 0x9f6f400b, 0xfa87ef6c, 0xdf82cbce, 0xd7f9fd04, +- 0xc4e67c33, 0x272d7db0, 0xde33d286, 0x75cfebbb, 0x1c993bf7, 0x1e6caf69, +- 0x4e59fb01, 0xb47fb33c, 0x011c1e57, 0x8f0e5cfb, 0x49eaae43, 0xbc7e3c39, +- 0x274fea9b, 0xe51439d9, 0x0fce70c2, 0xb2058179, 0xd5fa01d7, 0x5390188a, +- 0x79e5675d, 0xac358fe0, 0x15470f56, 0xf406d7cf, 0x7cf92bdf, 0xf7cd1016, +- 0x56f7b874, 0xbd00a4d6, 0xbea2433d, 0xf9c35c7b, 0x65e7f9e8, 0xf22fbcf5, +- 0xd14468f8, 0xc88acfbc, 0x1facb273, 0xbe0025f8, 0x17be4606, 0xfb55c61b, +- 0xfffbca9f, 0x92fccacc, 0xce1c3813, 0x7d411e55, 0xaddf5ba0, 0x68a77af4, +- 0x07b579f2, 0xfc23e693, 0xd02d260e, 0x1fb6f39e, 0xfe039a4e, 0xfc660d36, +- 0xb32553bb, 0x27247d9f, 0x418bbe01, 0x03942798, 0xaf823b1c, 0xd51ea0b9, +- 0xfd68c767, 0x6f6bf257, 0xecd14ef2, 0xce95dfd7, 0xbb65e3bb, 0xca5e5c19, +- 0x16fdbdce, 0xa2cdbba0, 0x0715aa07, 0x1479bcef, 0x84b37bc0, 0x764b72ef, +- 0xbdb7184a, 0xb406eebc, 0xbe371453, 0xffe31533, 0x03df393d, 0x9332caf3, +- 0x9a0c715c, 0xf480ee18, 0x8c6ecb4c, 0x61fc57af, 0x60566c8d, 0xa3ba7abe, +- 0xa3f08c74, 0x6dd6541a, 0x15de53c0, 0x7eab3fe8, 0x30b7e237, 0xc46f6fa0, +- 0x1ba72b53, 0x8b5c33fa, 0x3ebd636f, 0x8ef8fdd3, 0x953964b2, 0x543b1a63, +- 0xf46aa9c9, 0x038e33d7, 0xa344da37, 0x7703eca7, 0x1dafe01b, 0xfe836fcc, +- 0xee2cd608, 0xe5883ad7, 0xd0200e31, 0x047fac15, 0x3bc0a299, 0x34c8dbcc, +- 0xd1b95548, 0x0d1c1d91, 0xda165ff5, 0xf615fd9e, 0xed7e44e7, 0x2e308770, +- 0x3efe5f62, 0x796143b5, 0xa83aeff5, 0x362d45e5, 0xe4f8f3f4, 0x71f28cbc, +- 0x4197f805, 0x266c17fd, 0x3ebfdd13, 0x1267d9d9, 0x04762df8, 0x73dcbc59, +- 0xe4933ec1, 0x8d77d96f, 0x0fdd4172, 0x74afc04f, 0xe9c2fcdf, 0x4b7ec30d, +- 0xcebf3156, 0x19153ee4, 0xa4f05115, 0x2b904bb6, 0x123ce032, 0xd9e1d7be, +- 0xa7f2708a, 0xc1723ec3, 0x81f68297, 0x121edcf9, 0x06fdceef, 0xbad275fa, +- 0xfe2ffa5e, 0xe815b888, 0x73d163eb, 0xe4507bbf, 0xa6516f9e, 0x90f3df0f, +- 0xb45cec55, 0x66424cd0, 0x842eefaa, 0xe63463fd, 0xb85bbf71, 0xa6ff4059, +- 0xebf41b45, 0xdaad7881, 0x405087bf, 0x22dfb1aa, 0x60b4c412, 0x10bcbeb3, +- 0xf81723f6, 0xfc7bb067, 0xb97d7aa2, 0xa4a84efa, 0x1a25b2f1, 0xea20bedc, +- 0x2ec9bcfa, 0xb36e179a, 0xdbeefce2, 0x35eecb14, 0x7d85e264, 0x89c9bc30, +- 0xf898bc72, 0xbe3f3bd8, 0x303f960f, 0xd288bbdf, 0x85f2d767, 0x307d45de, +- 0x7d81077e, 0xf895b16f, 0x1e58635d, 0x0b2017e2, 0x38b29f21, 0xed4eb051, +- 0x29e2963b, 0x15c03424, 0x53ac2f59, 0x65de4e5b, 0x116e2cf8, 0xbd60a342, +- 0x64427ef0, 0x2bd6d5eb, 0x692870e1, 0x11ece8b4, 0x0a7fe0a5, 0x974d337e, +- 0xb97eba2d, 0x8fdd1f3f, 0x69e28d89, 0x0ddcb753, 0x4fcd1b5c, 0xd78738fe, +- 0x52f33ba6, 0x051f3f81, 0x072fb33d, 0x173d3668, 0x61cc9083, 0x71d2b780, +- 0xe776c662, 0x256b3cb1, 0x647d4fcb, 0x51e90fe0, 0x1bcefe1b, 0x142c6fde, +- 0xf7875f73, 0x7db9cf57, 0x71d1763f, 0x69bc9a16, 0xef53e466, 0x5cd7f450, +- 0xc4ffd6ce, 0x2b6b8a98, 0x557b9ca2, 0x042e3e7c, 0xbfd1bef1, 0xceabed97, +- 0x7da4b0cc, 0xc5c8b45f, 0xa1ec4fe4, 0x10777c36, 0xbbe02dde, 0x138527c7, +- 0xc9f02ef8, 0xce04291f, 0x6f1429e5, 0x149f1f20, 0xbf882ac8, 0x7334d995, +- 0xbf806bc9, 0xa3d418cc, 0x8a269b4a, 0x3f5c0ea5, 0x15eca3d3, 0x99ef7075, +- 0x18f86f3c, 0xeeba6ba0, 0xff01b779, 0x5b8414bb, 0x41d183aa, 0xfa7f4aca, +- 0x7e3091d2, 0x80d792ee, 0xe0c546ef, 0x0a64d93b, 0xa63c672b, 0x4a2f40eb, +- 0x41071921, 0x574ca78e, 0x772d80c6, 0x938d8b93, 0xcde71268, 0x0c6dfd04, +- 0x243fc7cb, 0x7122b778, 0x2575c46d, 0x369fd85b, 0x7fa0ef82, 0x804ec15a, +- 0xe78601e5, 0x301915c9, 0x9620f27e, 0xf421c826, 0x8dda3a53, 0xcdea1f77, +- 0xe504dccb, 0x134bb2f2, 0xfb69e393, 0xc0f41da3, 0xd1d5e54c, 0x1d9eaafe, +- 0x439e8072, 0xf5670f06, 0x2cb15eb9, 0x27e5f983, 0x10faa9a4, 0x7925d7ab, +- 0xfc82c763, 0xdbe9877c, 0xb1bc3b9f, 0x837737e0, 0xb80fdd1c, 0xfca9e386, +- 0x34049da2, 0xd67cbff2, 0xa4def897, 0xf74ba2fc, 0x69c9e21d, 0x0a4b49fd, +- 0xe3dc610e, 0x7e8ad252, 0xbd41a5c9, 0x310debff, 0xe955c7d1, 0x48a2fcbc, +- 0x95c751fc, 0xf62fdff5, 0xd13efe21, 0xbfe925ea, 0xf9f4145f, 0x3d78afe6, +- 0xd9277e33, 0xc7382e6d, 0x077d874d, 0xe4c049e4, 0xe08fae97, 0xa6ddd3a5, +- 0x153a6fdb, 0x71e2ef96, 0xb572d575, 0x3259ceff, 0xc6139f7f, 0xa92a3a71, +- 0x79f0a240, 0xb453e5aa, 0x1cb496a3, 0x74a8f844, 0x9d938111, 0x4a7035f8, +- 0x990d6aaa, 0xfeff8f28, 0x476b4591, 0x72514b5e, 0x3fb3f388, 0xf297ad6f, +- 0x2fc4126f, 0x3db7f0d7, 0x51df9bb3, 0x89326ccc, 0xbf99dedc, 0x4d04ca76, +- 0x6eefd79e, 0x21f82fef, 0x648e6794, 0xa47bdfed, 0x072b77f0, 0x5d13e447, +- 0x53ae5a47, 0xf21ab793, 0xa51f9a0e, 0xe50dbbc9, 0x14f28609, 0xab3fbe43, +- 0xa50ce1df, 0xda421e89, 0x21fd291e, 0x8eb95dfc, 0x885cd0d4, 0xac41b038, +- 0xddfc21f8, 0xf64cd2c9, 0x5acb1477, 0xb3730f04, 0xf32bf062, 0x87307bb0, +- 0x385e4da7, 0xfad0e012, 0x9283c83a, 0xfa0dc166, 0x33b823be, 0xa7687984, +- 0xd905da68, 0xe092ad3b, 0x6bd76c09, 0xc84dc3ff, 0x3f0f0fcf, 0xe4aef589, +- 0xeba644ef, 0xf37be0fd, 0x7c9874b3, 0x53df6117, 0xec770ce3, 0x77f23f7c, +- 0xcef7e8ed, 0x9461ef54, 0xaaf786a7, 0x471f30e5, 0x38545f84, 0x02fc3c3e, +- 0xf3fc5dc6, 0x40f796a8, 0xfb2fb00d, 0x95e80574, 0x1e9e961f, 0xc4167a07, +- 0xe3fd846e, 0x2d702171, 0x114f47ec, 0xee30b5df, 0x0e43a5bd, 0x39949fc2, +- 0x816db52e, 0x1ec31050, 0x3ff08f5d, 0x001b6cee, 0xdae8927f, 0x4f961ad8, +- 0x1008c36c, 0xfd37626b, 0x39fb4cd0, 0x806da03e, 0xc547e689, 0x43e5661e, +- 0xfe40b6da, 0xb0dfd8ce, 0x036d51f2, 0x1d1c3744, 0xdb7f111a, 0x3ef9d1dc, +- 0x1bc9962d, 0x06437e75, 0x4163537b, 0xfb612a8f, 0xb4873c0e, 0xb73ab952, +- 0x6d8edce8, 0xff731e14, 0x6ef28ed5, 0x3fedc75b, 0x3fb1fa66, 0x92a0fc17, +- 0x5f71bc39, 0x466ef944, 0xf61521bd, 0x3e08f8c2, 0x0aad699d, 0x2a231bee, +- 0x905e8276, 0xee24773c, 0xef4e9d1b, 0x9171d8da, 0x9a048bf4, 0x8dac79d2, +- 0x2ef93375, 0x5b3df09a, 0xd44e83f2, 0xf1e51e9f, 0x21df29ba, 0x5e38387d, +- 0x8cf5f2c6, 0xa1e7658d, 0xd84dd744, 0xaf5cddcf, 0xd81f59ad, 0xfff0a36e, +- 0xde0e7a93, 0x39e4f4c8, 0xc4ee5475, 0x37817f82, 0x1cc9e415, 0x8c8f07b0, +- 0xbfbd55e4, 0x1de68326, 0xcd58f391, 0x36aa6f4c, 0x1d4d782e, 0x55e5572b, +- 0xaf6b3a4d, 0x55c95bee, 0x8fc93e0c, 0xd615bb5e, 0xff333761, 0x86b3c581, +- 0x7a815d6e, 0x5f386dc0, 0xc2a6f5e2, 0xe154fcb9, 0xa3e81340, 0x0da67e2a, +- 0xeb82def6, 0x2a38f7e1, 0xd7f1d49e, 0x142f75f2, 0xf6011ea9, 0xe10fb774, +- 0xd18af549, 0xe99d72ec, 0x5ae96b15, 0x7c2a1f01, 0x1c6db989, 0x045fff7c, +- 0x0cffa5a7, 0x7eddfd38, 0xbc7bd3dc, 0xfd0359c7, 0xad3f2e97, 0xe1c38f7f, +- 0x9210b8fe, 0xf1353392, 0x3877e853, 0xf2eade77, 0x735622fd, 0xc1f735bf, +- 0xd53fd452, 0xe5ffd8f5, 0x917769a5, 0xd469fc9e, 0xc9ff8f0f, 0x02ec01ba, +- 0xca20e5c7, 0x263fe3e3, 0x38e42ef8, 0xeaa5678f, 0x5aff59b7, 0x6dce147c, +- 0x222b11ff, 0x7a54d87d, 0xe6777210, 0xa7aef851, 0x3bbc39db, 0xd464fd57, +- 0xc786bafd, 0xe079ada1, 0xd1af7c3a, 0x3cf0da45, 0x2826cfee, 0x67cbbb3f, +- 0x4a72c50f, 0xc81b7e27, 0x8c18c289, 0x41935fc7, 0xcd497df0, 0x0e5811ec, +- 0xc7f458e7, 0x71c56d99, 0x3a32666a, 0x478c29ac, 0x5dc8217b, 0x746f5b80, +- 0xecc55494, 0x1decc41f, 0x7f1fbdad, 0xf9f9962f, 0x76db33db, 0xed7a0fbf, +- 0xb5ea1b06, 0x57bc4280, 0xf1c64ea9, 0x8fec3d28, 0xcd97fdc5, 0xa963e163, +- 0x5c718781, 0xd603da0f, 0x51f3bd3a, 0xaeccfdce, 0xdb37fcc0, 0x18eb3ac8, +- 0x5590e638, 0x7cf92f28, 0xe813f548, 0xeb8f3157, 0x5c151f89, 0x721e8270, +- 0x1edbb634, 0xf9f385e0, 0x17cac202, 0x013f643c, 0x0f05abe7, 0x64b778b1, +- 0xfd5e4ddd, 0x6b9d093d, 0xf9d3d812, 0x09d86d4f, 0x3b41f070, 0x1ffff417, +- 0xe41f784e, 0xc3bd887b, 0x7eda7e25, 0x47fda478, 0x9760f7c0, 0x49fcd917, +- 0x16895da5, 0x58a3f4e7, 0xfd5397ee, 0x9e3b5784, 0x5fb18e3a, 0x036c8e7a, +- 0x0f70a37e, 0xf0a83bc1, 0x59dfd8cf, 0x4137ce30, 0x46c2ff0e, 0x8a56e7cb, +- 0x3c292b71, 0xb89dcb7d, 0xf3be755e, 0xa237c392, 0x7fd0c29d, 0x0b2cbdbb, +- 0x79eae7ec, 0x39a43c88, 0xe45c21ff, 0xf8845e48, 0x573c6101, 0xcfcef8f5, +- 0x2873c6cd, 0x68b37f21, 0x2bbf75eb, 0xfcc30450, 0x82295d39, 0xe3e6f019, +- 0x1cb2fef7, 0xeb720b9e, 0x50eb02ff, 0x8000589e, 0x00008000, 0x00088b1f, +- 0x00000000, 0x7dc5ff00, 0xd5547c0b, 0x73b9f899, 0x3332bcef, 0x49324cc9, +- 0x9b8f2126, 0x80402107, 0x52024c49, 0x1878431f, 0xa4076b35, 0x438b5b16, +- 0x921123c2, 0xb175b689, 0x5100cb65, 0x8d042208, 0x41380abc, 0xbb6bba50, +- 0x060222c1, 0xb6a2d11a, 0x6eb42fea, 0xfdfeed57, 0x58f88845, 0x16544649, +- 0xefffad5b, 0x99b9cefb, 0x514493b9, 0x67f4ddbb, 0x739ee72f, 0x77cef9cf, +- 0xcef9f7be, 0xe99a1619, 0xf4662deb, 0xfc3e79f7, 0x33577f87, 0x3034e896, +- 0x7cd8ca96, 0x96773599, 0xeb47df44, 0x6d67aa25, 0x34967d5b, 0x0bbc02c6, +- 0x66f536e6, 0x607da1fb, 0x694df9b9, 0xeb88bc22, 0x6330b19f, 0xb56d8c15, +- 0x993590b2, 0xf4126db1, 0xbbcf0e53, 0x7935e16c, 0x23580d8c, 0xc602b08f, +- 0x59afc782, 0x1bfbef80, 0x4d065412, 0x08589876, 0x8ee3a1cb, 0x576c3ef0, +- 0x64c45bd4, 0x7c1807a8, 0x24be786e, 0x0d248477, 0x5e9ac608, 0x87acf792, +- 0xae47fd76, 0xb2acfde5, 0x41ca0ca9, 0xb8c136a8, 0x575fd0c1, 0xa4c644b2, +- 0xff1a1639, 0x6c2921cc, 0x66c3fac6, 0x85e0d3e6, 0xbfe1faff, 0x2f1832fa, +- 0x2719086c, 0x102b13c1, 0x8236c38e, 0x40da6603, 0x813f7de3, 0x9bf187ad, +- 0x00cf920c, 0x8db74df5, 0xf0e1af0b, 0x67e01858, 0xc9ad0099, 0xe8245ac0, +- 0xb5e0532f, 0xe8ba70c9, 0xa75e128e, 0xf8a5bb40, 0x3dda950f, 0xcb9c012b, +- 0x647a1b2c, 0xe1399380, 0x0dbfa83f, 0xeba2f3eb, 0xbfe1b4d0, 0x3479c33f, +- 0x2db8041d, 0x3d97b851, 0x6dc79fa6, 0x27ad14cc, 0x7eb443b8, 0x2f8e72b6, +- 0x47858336, 0x510ebc03, 0x84f755b6, 0xf2c7c465, 0x65ccece9, 0xef44f4d0, +- 0xeb1dbf2c, 0x3c2d593b, 0x5f30ef83, 0xda9ee018, 0x28ccf1d5, 0xeeaaef68, +- 0x06e9c6c9, 0xa0b1ff97, 0x3ae8b2ef, 0xde5e706b, 0x766659b5, 0x03be8f1a, +- 0xec077c50, 0x9cec6ed4, 0xd5cfb109, 0x41aa5df4, 0xebc715be, 0x881957c5, +- 0x04865f1c, 0xc8696ce3, 0xdabae037, 0xb0057814, 0xb31b6a2e, 0xd9e11567, +- 0xc1c73457, 0xec8983d8, 0xd3e13f56, 0xfe87e95b, 0x2d56751e, 0xe97f4274, +- 0x9d5baaae, 0xbf1c7ca9, 0x029fa703, 0x6ba50d40, 0x47e1a9ed, 0xd05e976b, +- 0x1f6cda5c, 0xc4db9db9, 0x9ed916f1, 0xf083de14, 0x17951228, 0xb1d8deff, +- 0x8853e09e, 0x95d8ee6e, 0xebf84617, 0xe9099b59, 0x9b0b197c, 0x5b178e90, +- 0xe8112858, 0x4b343162, 0x6d92e782, 0xacc6a666, 0x5f58435f, 0xae1ced66, +- 0xd3f74a65, 0x4dd22252, 0x74b3f50f, 0xb2ddbebf, 0x01dbac19, 0xd6168df5, +- 0xa767c36d, 0x4589bebe, 0xe1e08e08, 0xfebacdcf, 0xc3ad1b59, 0xc8632b76, +- 0xbe6549a7, 0xfe01bbbc, 0xef460bc8, 0xb7cfa01e, 0x7868bac4, 0x35567648, +- 0x64139e20, 0xb233cd03, 0x03de16ca, 0xb033ecf3, 0x4de75c7a, 0x1ceb762e, +- 0x64aff678, 0xa12342be, 0x77ae2263, 0x1fd73e3c, 0x7d23d6b5, 0x13f9416c, +- 0x38373f43, 0x5ee7848d, 0xbe47ab13, 0xfd0d5ca9, 0xa6a5c8c5, 0xfc01ec9b, +- 0x9726976e, 0xc46f9d60, 0xa86b6675, 0x9e91ed8c, 0x4fe32e12, 0x83bdbbed, +- 0xa7f337ed, 0x4b7bf9c2, 0xae074243, 0x0cee9453, 0xc4aee88c, 0xf7c00a6f, +- 0x583c8547, 0x38fdf960, 0x40a3f7a4, 0xa1f7c808, 0x0b972b4e, 0x72fe738a, +- 0xa77d1f28, 0x455ebbc4, 0xe272e0fa, 0xd812f7e8, 0xf9f2186a, 0xdef5fef7, +- 0xfcfea197, 0x0cd5263b, 0x46910bf5, 0x4a8f3d60, 0x85e387cc, 0xf787309e, +- 0xc065bbc1, 0xb2cf08b6, 0x28c213e3, 0x02990edf, 0x38e117db, 0xfbbd1b8f, +- 0x8965bbe0, 0x423c5fe1, 0xa05e19f5, 0x9194f644, 0x88e861d3, 0x109f7f8d, +- 0xb95fb7fe, 0x1bdd3eb1, 0xac7bf682, 0x07c81381, 0x09356699, 0x97bf65fb, +- 0xbba71f19, 0x3bf805c8, 0x824af38d, 0x38495427, 0xfa83974e, 0x58cafe01, +- 0x699cfd04, 0x80f9a74d, 0x38e1f4dc, 0xf79a3667, 0x32dcdca0, 0xed44ae38, +- 0xb3fd1b4f, 0xfa7ca032, 0x2aef5289, 0x9bf01aa8, 0x7f404dba, 0x5f4b4dc1, +- 0xea17a064, 0xc46eea0c, 0xa36e3b0f, 0x11eb6879, 0x06a4b8dc, 0xadb783eb, +- 0xdae501b8, 0x7289fc48, 0xbbc8c59a, 0x41c9167e, 0x9f51dffa, 0xfa8dd9df, +- 0x57ac6ba0, 0x2c0f5aa6, 0x9387d03e, 0x7233edb7, 0x198e46fc, 0xb52f4f89, +- 0xa50ba47f, 0x1c0feb92, 0x94f20827, 0xf242fc69, 0x0f2ca634, 0x18ebe657, +- 0xfc4e9a3c, 0xdb3f5f1f, 0xf908f811, 0xfffee9a7, 0x8ab96379, 0x9e4845e3, +- 0xe254b6b1, 0xdbbb8033, 0x6df7df02, 0xe55f1077, 0xf70f50ae, 0x741ebae2, +- 0x335d3cd1, 0xcb03b27c, 0x3ca8f33b, 0x1c6dc855, 0xe2c6f516, 0xcaf48c29, +- 0x58b59962, 0xd17de8ca, 0xf67f6876, 0xcf5a6c89, 0xceb666c5, 0x36ce7c02, +- 0xdb3ffa70, 0xf00a7201, 0x25ee6753, 0x4dfecb39, 0xb518fb62, 0xcb76c16b, +- 0xb28c9060, 0xb94378a1, 0x385bc3a5, 0x7ffa0ca6, 0xe907676a, 0x8a720601, +- 0x9a05d8c5, 0xa4f9431c, 0xcdfd9efb, 0x4863c7ac, 0xc7c4b793, 0xd9f4a930, +- 0x28f2a213, 0x72cfe9d9, 0x30a16055, 0x5677f11d, 0x04e9dc0e, 0x8584b6f9, +- 0xb0363e48, 0xe36a7a6e, 0x72e5bc81, 0x2ee5c2d7, 0x412e133e, 0x3ac6defe, +- 0xa2366e49, 0xee4e1a44, 0x3bb900ae, 0xcbb96471, 0xe2297358, 0xdd8b7835, +- 0x221e788b, 0xd77c857f, 0xc4dd31d6, 0x15d4f0e5, 0x44959961, 0xe89a90f1, +- 0x115a969b, 0x57c1abd5, 0x1275162d, 0x1f2cfd96, 0xda63ade5, 0x7d41a7bf, +- 0x943e6150, 0xe61eb69b, 0xbbf780eb, 0xf3f5fd84, 0xf1fa9534, 0x185d3898, +- 0x852b3f15, 0x9eaacafa, 0x49f2036e, 0xbca2732a, 0xfef0f477, 0xbbe03977, +- 0xcb8efc32, 0x2defc1cd, 0xe62125ac, 0x56a3aafb, 0x470ba3a2, 0xe933611c, +- 0x0bae40c3, 0xb3fb4bfa, 0xfea4ec99, 0xf3920ea3, 0xaf3646fd, 0xd1bbda13, +- 0xbcf5a21e, 0xaefbfa87, 0x219e8f2b, 0x218a3556, 0x8dd74aed, 0xecd65642, +- 0x9ebcc683, 0x1edf489b, 0xc7c8ab30, 0x77bd5c17, 0x63c61962, 0xedbf2728, +- 0xf05da952, 0x9fd2f4e0, 0xdfa0fbc2, 0x0dd8e5ee, 0x98bd2294, 0x64dd1fe5, +- 0x259b7581, 0x05dc88af, 0xdb663670, 0x6787289d, 0x9fd7fee4, 0xbbf2866e, +- 0x8ccc8d07, 0xfa6fbeeb, 0xb23f963c, 0x1b08689c, 0xd0c6f74f, 0xfafdd2eb, +- 0xbea76372, 0x2fac3c1c, 0xb872e1df, 0xde278ecf, 0xf40e7ef4, 0xbf373664, +- 0x9af001d3, 0xdc93329f, 0xf815debc, 0x26e7a467, 0xe224e443, 0xfefb9cd1, +- 0x73ae00c4, 0x3e1207d7, 0x3d2640cd, 0xc8bf1c25, 0x0bac1757, 0xd8c39d72, +- 0x857b51eb, 0x47840c59, 0x513d06b0, 0x20e410f9, 0xdef95f01, 0xbfe61a7d, +- 0x73824e78, 0xd5f1bd35, 0xbda25454, 0xe0b23042, 0x45df6bb6, 0x35da1ebb, +- 0x0d989c90, 0xfaae00ed, 0x2f6e5c6d, 0xc8893d63, 0xd7604d0f, 0x7f096058, +- 0xb1f4e2e7, 0xd95225b4, 0x4f6cff0d, 0x708b1eae, 0x7e299f2a, 0xd8b5ff5c, +- 0xf61d8c6f, 0x1dfb8b90, 0xdb5bf74b, 0xa1f862fa, 0x2ba5d3b1, 0xb4670f07, +- 0x5de2c5f5, 0x25533ff0, 0xb6ded625, 0xb90f021b, 0x7b0f9152, 0xfc60d34d, +- 0x88fb3fab, 0xe592f7f4, 0x0a9d90cf, 0xedc058f3, 0x728aab36, 0x4f5dc975, +- 0x2fcd7bd3, 0x276d9b38, 0xed99e0bf, 0x99765e66, 0x17767ca8, 0x74965bf7, +- 0xa79c614a, 0xca62e734, 0xbba79434, 0x1b334e8c, 0x3c78d78a, 0x3ff3bdbe, +- 0xf54c1913, 0xfa3a426d, 0x1bb71213, 0x6489cd9c, 0x89cdaa9f, 0xb7051f68, +- 0xca2ef35d, 0x64bb25a9, 0x7635ea2f, 0xcd1de1cc, 0xec733cb0, 0xf3f63b22, +- 0x8034ca61, 0x4cf77da3, 0x65ef4ca7, 0x48f9187f, 0x0d5cf5f1, 0x93dd95ef, +- 0x67b7e455, 0x97f87177, 0x208f2cb8, 0x99fd5d1d, 0x62b2764c, 0xcfb40160, +- 0xb1be4dda, 0xceeab7c8, 0x7d70b37d, 0x699d9ede, 0x94bff6a0, 0xe2f11398, +- 0xef869e5a, 0x1f8a4897, 0x5b7eb4f9, 0x7eac4d43, 0x1325d5be, 0x5dcb4dbf, +- 0x276bd691, 0xf509babe, 0xe02ee355, 0xce7f1c23, 0xd9ba7feb, 0x692be51d, +- 0xa61bb6ce, 0x1a8fff62, 0x8377c8bd, 0x3fe7777a, 0x5fe17d11, 0x6dca2577, +- 0xca6faf8e, 0xc69b6667, 0x2845cd27, 0x6eac973f, 0x630e722e, 0xc9f20fcf, +- 0x6f97ce4e, 0xb7ee24b9, 0xeceb2566, 0x00fc91dd, 0x87c1b17b, 0x9978b7f8, +- 0xd33c1f6f, 0x7f430dc1, 0xa159212f, 0x136484fa, 0xe4f949e1, 0xa92ffd8e, +- 0x3e071768, 0x65ccfa44, 0x27d452be, 0x9559c46a, 0xec2b7484, 0xdb93b605, +- 0x907f6081, 0x9525b5bd, 0xc63eb23d, 0xfe8933ff, 0x8a7c4e40, 0xb5ffa272, +- 0x7e224f4f, 0x9fde729b, 0x783afa88, 0x0a9323f1, 0x4977b5f3, 0x5eedbf24, +- 0x09ba433f, 0x0b66cd76, 0x3772a24b, 0x217ae5e8, 0x26375e7e, 0x751cb91b, +- 0xab9fa847, 0xb73f3852, 0xd3d118bb, 0x6409e58e, 0x8770ee97, 0x57f408ad, +- 0x29f65be5, 0xe7587568, 0x675f0b06, 0xfb5fdecb, 0xb0f3a464, 0x658d1ce4, +- 0x40c7f395, 0x0cb0fcfd, 0xb7bbbce3, 0x83e54420, 0xd432bcd3, 0xbc3ef7d9, +- 0x74f11f2e, 0xf6c5e8d8, 0x226f6f76, 0xbdddefce, 0x7e711267, 0x9a657bf5, +- 0x83f87d77, 0x512545b4, 0x2917f139, 0x768c9050, 0xc7b25b82, 0xf7778bca, +- 0xd0b6987e, 0xd253fdce, 0xe3c3e597, 0xad35dd25, 0xfabfbf18, 0xef2ebe2a, +- 0x461cd2fd, 0x159ef839, 0xfc8c59f4, 0xf5c1cf7d, 0xcd64d4db, 0x41cce8cf, +- 0x565833fd, 0xfc701ac6, 0xfcf9391f, 0x1ccea6dd, 0x96ffcbe4, 0xb6dcfdf4, +- 0x9061664e, 0x24eb0d4b, 0xff990616, 0xcc9e2fde, 0xeefff941, 0x6a7327be, +- 0xff8be063, 0xd0ce7b4e, 0x9af113c6, 0xd78da65a, 0xd5e3859d, 0xa26fcd7a, +- 0x66eb619c, 0x26f906fa, 0xdb633f9f, 0x8a3e6db3, 0xd7000ca7, 0xdf6a1d22, +- 0xf827d40d, 0xcc2eb82c, 0x4e90c612, 0x6ddc976d, 0xbe7cfec6, 0xdfda3742, +- 0xfd71f7da, 0x927a0ab7, 0xa7e44b0e, 0x24224ada, 0xfcb6bf9f, 0x13d7e8f7, +- 0x4c98d9d6, 0x72723ff2, 0x30fa2314, 0x4d4cde21, 0x55f50576, 0x5f4e1ada, +- 0xc81b1f91, 0x2427701f, 0x3f60644e, 0x763d3299, 0x17576f94, 0x9218b425, +- 0x184e7df0, 0x166767db, 0x2aa177d3, 0x34a1ff4e, 0x0c9e7146, 0xff212cd6, +- 0x97b72732, 0xe730a6b3, 0x4fee287a, 0x878c76e6, 0x05c9b779, 0xc612feb4, +- 0x68bc3425, 0x08e901fa, 0x927be5e5, 0xea48e885, 0x947ec892, 0xb1f39d0d, +- 0xeae891df, 0x8ad75c6e, 0x960d5d28, 0xb57441ff, 0x086f1b49, 0xa254055d, +- 0x78658f2b, 0xf62552ba, 0x90b3da95, 0x74affd1f, 0x424daf81, 0x6c7e44fe, +- 0x4016f1e1, 0x46b7ce19, 0xb16357f4, 0x47a8cb77, 0x63f7c6bc, 0xc13b8fe3, +- 0x25ff45ee, 0x787ced03, 0x40b35a8e, 0x3d6375a5, 0xdaefe8bd, 0x5f485b26, +- 0xc9e86bde, 0x7d263b43, 0xa401f35c, 0x25f9f48f, 0x6fc86b65, 0x5ea172cb, +- 0x714b5d40, 0xfdd3e587, 0x7e808edc, 0x9b668e91, 0xba6b3fc8, 0xdb9f9a6b, +- 0x2fc4d511, 0x15560dc1, 0xaef4e0f5, 0xf76455bc, 0x335e60af, 0xf6c771d1, +- 0x9c2f18c5, 0xaca2f76b, 0x213c62b3, 0xe7afe705, 0x93a956bb, 0xb5d0f1ec, +- 0x5d728bcc, 0xbbb6478b, 0x14ff777a, 0x09437ff5, 0xf183f7f9, 0x7a4642c9, +- 0xcbe5dda3, 0x1ebc0648, 0xa78f1bfa, 0x194297b5, 0xf5894f9e, 0xcbed9f6c, +- 0x76b94170, 0xdef09583, 0x07ebc1de, 0x49a0801c, 0xfea4a714, 0xeb859258, +- 0x81f2a1a1, 0x53699be2, 0x0db7f698, 0xb95a99cb, 0x41d92b6d, 0xe7b7ff1a, +- 0x251c7871, 0xc8b43cfe, 0xf1dcdf2f, 0x47f0027c, 0xa68dc61a, 0xb42117d2, +- 0xc92e29f7, 0x7cb614cb, 0x648000d0, 0xeb27f162, 0x5b115c67, 0xdfa3ede6, +- 0x7ac7af5b, 0xf583bfd0, 0x65e83608, 0x02b3ecad, 0xd11d6b1c, 0x60ec057a, +- 0x7c4961cb, 0x3375e4ff, 0x92fe610b, 0x93f43f18, 0xafc61f56, 0x5e374cac, +- 0x5c4a7c2c, 0xdfe846ff, 0x77ed6aae, 0x0684cf56, 0xe569960f, 0xb2f9d78f, +- 0xbea33fa0, 0xf8a9423f, 0x78da0b1e, 0x63383dcf, 0xa8ac86fd, 0xc2f6007d, +- 0x34cf2827, 0xebed613b, 0x60936d35, 0x43f39b2c, 0x4d5fea13, 0x12dd07df, +- 0xfcf121d9, 0xbe914b6a, 0x085d7d99, 0xcea575f6, 0x70a5b6be, 0xb2167afb, +- 0x2425f824, 0xfc2b83bf, 0xb05bed0c, 0xbeb0924b, 0xcff7b5ff, 0xfdf50d3e, +- 0x7272fe73, 0x6eed8a94, 0x557e8f9f, 0xf242a2f0, 0x0e5fb837, 0x9637c04b, +- 0x83576e2e, 0xb478a73e, 0x39b73f46, 0x42b8fd05, 0xed6ce30c, 0xa40aa4c7, +- 0x73a3f077, 0xf96b03be, 0x665f14a3, 0x9fd4454a, 0x65f79f8c, 0x189e3c29, +- 0x5edaae2c, 0x95effd84, 0xeb0bda18, 0x2da74f8b, 0xcdea7f24, 0xdf3145b4, +- 0x907e1c35, 0xdfb0d9f0, 0x2f1e2c38, 0x8f09914b, 0xf09e474d, 0x2f78dca1, +- 0xa84c912c, 0x68adc257, 0x1bd7d6d7, 0xe56422d0, 0x533705e1, 0x899e7d7c, +- 0x65f9868d, 0xdc177d08, 0x2a68637f, 0x93fe1bce, 0xff0ed5e0, 0x3b139262, +- 0xb4ec59e6, 0x7b5c514f, 0x99c1e13b, 0xac3c43e0, 0xc0caae2f, 0xcf669a71, +- 0x1e5c5272, 0x6fac39ec, 0x147bebba, 0x5ae0d7a7, 0x8d58d87f, 0xd8254ef6, +- 0xb806bf75, 0xabaf93b3, 0x8f5f02f6, 0xfe940f92, 0x465bca10, 0xba2fe390, +- 0x48b45d39, 0xcbb7d0fe, 0x62c78e29, 0x87b972e3, 0x7d78fdb9, 0x69da898a, +- 0x514fafef, 0x8457af08, 0xb923a67a, 0x6d7a571c, 0x99075768, 0xabf403ef, +- 0xeeaedf99, 0xf2e275a3, 0xa552bdcb, 0xddc59378, 0xac24ef7b, 0x7f2142bf, +- 0x0fbd2986, 0xadfdb8e0, 0x267aef6e, 0x77cb00f8, 0xea1c5095, 0x1e604a68, +- 0xb0a56fae, 0x5c8ffb57, 0x125b5a53, 0xf75abfb5, 0x01abc239, 0xf50ead0f, +- 0x93946afe, 0x2724289f, 0x33d22599, 0xf869fa1d, 0xfbf5326b, 0x0ea05b07, +- 0x86b569fb, 0x420e915b, 0x73b5321d, 0x6374b1cf, 0xe23eef3f, 0xd33b40e8, +- 0x48636ee8, 0x50bee0c7, 0xf6e2c49c, 0xd3ca1533, 0x09140b43, 0x5d9c45f5, +- 0x49e31d33, 0x29b8b7e4, 0xf82558de, 0xc1503463, 0x42b10b59, 0x5129e7cb, +- 0x4ff9e73b, 0x52f82ae7, 0x160c7fb3, 0x319e1f1e, 0xf8e1812f, 0x49c89eec, +- 0xdd9bc603, 0xe1ed0c3d, 0xc6894ec6, 0xdc7e2c69, 0xd2cbfe84, 0x41dfce4e, +- 0xfe006fe1, 0x58aed072, 0x76136291, 0x77a70b66, 0x147273d6, 0xbe31f9e2, +- 0x3b418c9e, 0xb2dfac47, 0xfd69da8a, 0xbc9c4499, 0x4093c451, 0xdafd5213, +- 0x58cecd14, 0xc26d9e2d, 0x6ee3e0ce, 0x327c7a91, 0xd254b3e2, 0xe7b573c5, +- 0x9277216e, 0x2166444e, 0xbe8046ff, 0x5db4ae30, 0x6ffb7d9a, 0x2bdb7e61, +- 0x14d179c6, 0xc93900f3, 0x481ef865, 0x7e5ef011, 0x485983f8, 0x119aac37, +- 0x9e1d36bf, 0xfd8a3726, 0xd217b404, 0x581dcd6d, 0x316b7e9f, 0xef8c67e9, +- 0x5ec0bee3, 0x3b0cd781, 0x5679eb8f, 0x9f70f287, 0xff84e92d, 0xf8e2dff6, +- 0x1f681213, 0xc6d61d23, 0x75cf4c91, 0xb0f2d718, 0x3f51a7d2, 0x32d46a7b, +- 0x4fdb4784, 0xd9a8fdc2, 0xa9c72425, 0x7c95ec9c, 0xabf9e07b, 0x01e11714, +- 0x846abcfc, 0xed87df17, 0xf4adfdd1, 0x38a5cde9, 0xe11fee2e, 0x5ba33fb3, +- 0xeb3538a1, 0xfc8fbddd, 0xf113b37e, 0xb9f87355, 0xd6ff5157, 0xed275858, +- 0x2dd9c5f7, 0xf1bc4e3f, 0x03a39449, 0xbeeecee7, 0xcefae11b, 0xd6806f21, +- 0x5c8f6f47, 0xcfb7157d, 0x5367dbdf, 0x23dc8ed1, 0x8fd836e4, 0x5fa127c4, +- 0xde327f72, 0x45397c8e, 0x960c9fef, 0x2476eeff, 0xf0042f87, 0xef918bed, +- 0x0dffe141, 0x444f9fd4, 0x20faf5fd, 0x2bffa03c, 0xed5076a3, 0x2bed1b5e, +- 0x7117fa0f, 0x8ff3c8f6, 0x0f4842d8, 0x14ad3be7, 0xfec45477, 0xe44739cc, +- 0x8b52444e, 0x284de4eb, 0xbdb7836f, 0xf0032bf7, 0xf7c1d29f, 0xec49143b, +- 0x3320bc87, 0x73e37fbe, 0x294feec6, 0x5f1e59ae, 0x3e47ca09, 0x6e2265ef, +- 0x48b92cb4, 0x7c32fbe5, 0x62596a5f, 0x53da1177, 0xb43d094f, 0xabef812c, +- 0xdd4cb80c, 0xac7baeb8, 0xb429f381, 0x67bfc2ff, 0xb1ab31bf, 0x611d2ffb, +- 0x299dd76e, 0x609b7436, 0x1f681d9e, 0xe06dbae0, 0xfb8330fb, 0x1dcdc7d5, +- 0x51938266, 0xc455a079, 0x95fdb5eb, 0x571e3ce3, 0xce51f627, 0x10fc59cc, +- 0x48b5a96e, 0x9fe8d5cd, 0x8d3f585d, 0xde77d7e2, 0x759e9b3f, 0xf771f4eb, +- 0xde99acc5, 0x5a94fb6b, 0x7996bbbc, 0x8e5edc4d, 0x600d11c6, 0x94eba8bf, +- 0x7997d42a, 0xe51ab9cc, 0xd5821abf, 0x16cf0c9a, 0x2ed1a278, 0x73b42419, +- 0x02775694, 0x16daefae, 0x50a9e903, 0xed87c18b, 0xb8e73c34, 0xd2a91c79, +- 0xb01ae3cd, 0x471c6154, 0x4518b67b, 0xb7f45fdc, 0xf1ba198a, 0x73f89069, +- 0x1ea953ad, 0xfd6b5f4e, 0x2d9b18b5, 0x648ba718, 0x7dae281b, 0x479be4c1, +- 0x22e4e371, 0xb67c0216, 0x55d79a38, 0x9de27af3, 0x9f88d60b, 0xb854afea, +- 0x64d4c921, 0x376e9f94, 0xe3c6538f, 0xbe9b516d, 0xd21fbf1c, 0xeb97d610, +- 0x464c6058, 0x883fdf01, 0x7376ef7d, 0x7d6175f9, 0xd7b7c09e, 0x9b567284, +- 0x8e2caaff, 0x7f364337, 0xcd5767e6, 0x77c83a43, 0x203f2899, 0xabe3c5df, +- 0x3f821330, 0x44b74aff, 0x6f0711f4, 0x486d1a0b, 0xdf7cad5f, 0x1fc2abee, +- 0xee55f70f, 0x7c1fa134, 0xab67dc1e, 0xdf689a73, 0x24e352f4, 0x72f5bab7, +- 0xf7fcb068, 0x9fb967f7, 0x3c8b2ad4, 0xa1c9270e, 0xcb9f275a, 0x48fbc919, +- 0x83b7be37, 0x68f3809d, 0x6ed0cb95, 0x9da37e99, 0xdc74d1e6, 0xc6e0714a, +- 0xa839bd15, 0x7aaa9bc7, 0x203f308b, 0xad08bf1e, 0x682fc9a2, 0xff06eb57, +- 0xd884ed03, 0xc547e476, 0x7efa07ef, 0x3f454ee4, 0xe781cce7, 0xb01d5f50, +- 0x7f82be92, 0x38c66d3d, 0xb23c91cb, 0x023ac6a3, 0x305db02b, 0xa3f77ba1, +- 0x70b76879, 0xcbb1a9bb, 0x617681dc, 0x3ecc4b6d, 0x06dffe1b, 0x5b1bbefd, +- 0x77f14c97, 0x5f7faed6, 0xbbee33bf, 0x6d70fb21, 0x4c5bceb4, 0xefc8b181, +- 0x9f6877a0, 0x81835cfc, 0x64ebb7f6, 0xb79462ef, 0x7b7aace7, 0xaf839cfc, +- 0x9addcfd7, 0xc22de13d, 0x0f2c1e75, 0x116f6759, 0x819d73ae, 0x69fb6205, +- 0xf58675c4, 0xf9d6265d, 0x8b9313dc, 0x3fdf9d70, 0xd708b930, 0xcdb18b79, +- 0xa8f37c87, 0x1b90f033, 0xe99bedfa, 0xf70a7b27, 0x2e8f913d, 0xc40f1e95, +- 0xff81e3d1, 0xefa47a3d, 0xc787d246, 0xebd0e106, 0xcd49b743, 0x6b507942, +- 0x5ea17f31, 0xe361bfc4, 0xc5331678, 0xfa7f8e3b, 0x5047c6e1, 0x64c9740e, +- 0x1dfd688f, 0x68050257, 0xd57f1d0f, 0x23490de3, 0xed18bff7, 0x07da0aad, +- 0x455c610c, 0x7b3403f3, 0x9f1e5e32, 0xc779f312, 0x7b42abed, 0x8dc6ebfc, +- 0x4b3bc5eb, 0xe76e43f8, 0x3cbc95ee, 0x7149dc6e, 0x0b63a6e4, 0x7e27189c, +- 0xc6e3cc27, 0x52944f4d, 0xfc21b8dc, 0x2de6374c, 0x89c92eb1, 0xdec347fe, +- 0xdb171337, 0xf82e7ea3, 0x5f236fb5, 0x3f7e8b31, 0x99f09de9, 0xc13b3ac4, +- 0x71ea157d, 0x42623b9b, 0x7f026fba, 0x9ad4f30f, 0xec49c894, 0x28cdc9b7, +- 0xb0fca31f, 0xf2d3ffde, 0x4df876a2, 0x74777724, 0xd7946149, 0x5e40a669, +- 0x9635ea16, 0x8b6b3ce5, 0x6ec7d9f2, 0x77f71b9f, 0xbedbfba3, 0xe4c771ff, +- 0x4f6ef51b, 0x35edfa22, 0xe5139f32, 0x908776d9, 0xb7c90a67, 0xc2ba778f, +- 0xb788ff3c, 0xedcc38ff, 0xef2d0684, 0x0add6148, 0xb9e2d7ac, 0xbd70d7be, +- 0xc777de51, 0xb2d8fbc9, 0x14bd2fb6, 0xf6e3d1f7, 0x0ddb63bf, 0xecc7e7ee, +- 0x61faeb7f, 0xb96aa5cd, 0x5f5bff7e, 0x327ee21f, 0xb2f2c3f0, 0xeb6afd28, +- 0x936fd1a0, 0xeb074388, 0xf483df4f, 0x392c3c1b, 0xe65bbed1, 0x0cbbf4e5, +- 0xc4f32dfc, 0x3acefca1, 0x238979f5, 0xaa697ff1, 0xcb07ff9e, 0xeaf8a0ff, +- 0x9c9aa915, 0xcdaf7ce4, 0x0fdb8b5f, 0xe24bb3ce, 0xaf37197c, 0x3e353f78, +- 0x99f9aede, 0x6f0f2a97, 0xe387841c, 0x0ffcb063, 0xc6b78796, 0xfda465e1, +- 0x0f2caf8c, 0x35f797ff, 0x35b63a1e, 0xb40efd11, 0x594fd1e3, 0xf3c8cfb7, +- 0xb1fd0023, 0x64b3c5fb, 0x9fef8fbb, 0x7ebd5aca, 0x259d5e1f, 0x5f39e1f6, +- 0x4c84f33f, 0xf628d6eb, 0x398f1b89, 0xdeb4d8bc, 0x69f684be, 0x6f4ff7e3, +- 0xe1660763, 0xa3efc552, 0x2e7e432e, 0xd4fdf2f8, 0xbcc1d4d6, 0x5bcc3c85, +- 0xcbd2aca8, 0x1fec67f9, 0xd66204a6, 0x1c04aabd, 0xdbe86182, 0x725884a2, +- 0xa9adfbcc, 0x467eaedc, 0x4c78f7e4, 0xa5e61d6c, 0x7cd8726c, 0x0c78cfe8, +- 0x47e8ff3c, 0x28edfe29, 0xc0aa2d17, 0x32ef91eb, 0x21e5e003, 0x95c92763, +- 0x8bdda350, 0xdf8b5072, 0x2c7ffd68, 0x592ec1f6, 0xfbd1c7ff, 0x7a65ff81, +- 0x53cfc78f, 0x755f78da, 0xe01b6edf, 0x8c17c746, 0xdc45f8e8, 0x4a1bca5f, +- 0x33f523bf, 0x9cbf1d12, 0x95217fea, 0x226fa2e4, 0xa25c2be5, 0x4795b19c, +- 0x889c60ce, 0x18ab341d, 0x0938c4d7, 0x190dc7e9, 0x5bd26f22, 0x80f29b39, +- 0xbf9895bd, 0xf3fe06f5, 0xc8ed91f2, 0xe1f5c1be, 0x88df6476, 0xecf5f3eb, +- 0xfe9dbbc8, 0x7d6748b3, 0x6f947cd3, 0xf001d6be, 0x0bf87fa3, 0xd3b4779e, +- 0xa773e9ca, 0x2d92e9c4, 0x78a4b94f, 0x7471a7cb, 0x91ffe9f5, 0x8da4b51c, +- 0xbdfe5764, 0x125fe8e5, 0x723a7e31, 0xa79e213f, 0x7843d55b, 0xd8931c8b, +- 0x76b8989e, 0xe0cff310, 0xaf010cfb, 0xe123fef6, 0xf34c2c37, 0xfbc1a665, +- 0x58b35ff7, 0x3e981258, 0x362e5ce5, 0xafb4edf9, 0xf3c9d4d0, 0x30569a5f, +- 0x184de392, 0x78c12d37, 0x98b66ce2, 0x428189e2, 0xfb5b93cc, 0x27243dba, +- 0x0e7dbc61, 0xffaf3b43, 0xdebe5e35, 0xfec62815, 0x697a2b83, 0xce7da31f, +- 0x5587947b, 0xf787f9f9, 0xbc139754, 0x9b704f14, 0x6e25e7f5, 0x0efbe34c, +- 0xa69fd3da, 0xe28fbbad, 0xf3d7eff9, 0xdba0e2bc, 0x84b8c4e7, 0xa9b70f16, +- 0xd0afb43d, 0x6f1b9074, 0x0f9f3295, 0xd11669fb, 0x69c1d353, 0x653718a5, +- 0xb452d69d, 0x6cff2b77, 0xfdefbf27, 0x4f2932bb, 0xe04a68e2, 0x51d7846a, +- 0xed16be1e, 0x07185cd3, 0x0ff7deed, 0x708a5b5c, 0x0b6ff26b, 0xfda1cdc6, +- 0x1e3e8716, 0xdf3c2cce, 0x51d1e1bb, 0x1abcdc5a, 0xf045b3f1, 0x55b7b321, +- 0xef861ece, 0x974f7e35, 0xfa7fd40d, 0x3fb42df7, 0x2d83c9ae, 0x14b01646, +- 0x24c8e544, 0x74183f91, 0xaec5fc8b, 0x453f3cd9, 0xa9e2ed94, 0xf71df3e1, +- 0xaf3849cc, 0x37ca6949, 0x4a72c7db, 0xac7dd8f6, 0xea0148bf, 0xd0c4f317, +- 0xa515874f, 0x22ed8b78, 0x9df3a3b7, 0xc723a226, 0xa7f7c63a, 0x9ed08e80, +- 0x33d222bf, 0x59e6093d, 0x057dded8, 0x45f8f7e2, 0x3293ad03, 0x97da45fb, +- 0x78f89249, 0x5b7a1b05, 0xc61c60c7, 0xb895caf9, 0xb39b6a94, 0x36f8b70a, +- 0xa477fcb9, 0x1737df11, 0xff5578e3, 0x9379e461, 0x5f146cc7, 0x4659cf68, +- 0xaffd9379, 0x3ee7759b, 0xb6219fe2, 0xf324f29a, 0xf691ff0f, 0x25071c07, +- 0xe7b4de1d, 0xbe76697d, 0x99ea156f, 0x5735b945, 0x2abe49b8, 0x421cfec7, +- 0x5569437b, 0x16b0f250, 0x4560cfa3, 0x518ab5f9, 0xbb747f3c, 0x95eb80d3, +- 0x0662f22b, 0x6275ff8e, 0x6d15fc80, 0xf3cc203f, 0xf7bd8c9a, 0xaca61fa0, +- 0x842abdea, 0x65d071eb, 0xa9b8c268, 0xf144d231, 0x8a366396, 0x2e1ee6af, +- 0x282dfd58, 0xd273aee7, 0xd1c0d7fe, 0x6f94b9a5, 0x3d1cf30e, 0x4cef3ccc, +- 0xcd4879e3, 0x63945e82, 0x33ea0336, 0xe2f33365, 0x3e2d79e8, 0x7ef802e7, +- 0x3a2153b4, 0x0816985f, 0x9e0e7ae3, 0xc09e596f, 0x3c28b7cf, 0xfe58e23e, +- 0xdcf12ffa, 0xb7116ec8, 0xfc7c713d, 0xb5f38a1c, 0xfde2122a, 0x51e78b82, +- 0x3fa6963e, 0xf7c51087, 0xcd47ca09, 0xae47f63f, 0xf60da0bf, 0x7d3918af, +- 0x0eeead28, 0x3bf6278c, 0x7b7f9402, 0x4cb74b65, 0xbece63fb, 0x18d5aa07, +- 0xd71b66bf, 0xb9fb4d27, 0xc7ef1e1f, 0xf91e997c, 0xe13ca0ed, 0xfcb0647a, +- 0x7a4fb20f, 0x57c7f4e2, 0xde984ff6, 0x53b78baf, 0x21b8fde2, 0x7f5c7776, +- 0x5a2bd923, 0x745549be, 0x3b376e1c, 0xa4287b34, 0xb2a9c7cb, 0x166bf38b, +- 0x260fff7d, 0x22ff793b, 0x8d6d273f, 0x7d414aba, 0xe28c2ff5, 0x90fe5a73, +- 0xaa142f96, 0x213d79e2, 0xb7ce8583, 0xe51b5879, 0xdd628d09, 0xb4714492, +- 0xa7df865e, 0x7c10be63, 0xf2d2ffff, 0xcc5dffa9, 0x39264ebb, 0xbf084aa9, +- 0x524cf315, 0xf6f0ee10, 0x77de38c5, 0x159e34ec, 0xc8524cf3, 0xcdfe209f, +- 0xd4fcf3f4, 0x7f7cf5e9, 0x30f41321, 0x390b3396, 0x99e75a5d, 0xcb555f28, +- 0x4cf2d11f, 0x0954bc34, 0x598e677c, 0x5072879c, 0x92d947cb, 0xfb44ade0, +- 0x7b0255a7, 0x90d3e71a, 0x784bf220, 0xf90dedbf, 0xaff7a461, 0x8f127f9b, +- 0x650f2d67, 0x3d206272, 0x5e7a22bd, 0xd11fcb4e, 0x3d6626e8, 0xc71dae09, +- 0x555f3db8, 0x0c79a26f, 0x71475c34, 0x030681c9, 0xd55fbd43, 0x1874e665, +- 0x798ede37, 0xfd8dd626, 0xe52b612a, 0xf87a0bd7, 0xd6167b32, 0xbee318b7, +- 0x2fee5627, 0x7fde03e8, 0x3d276576, 0xa752ac07, 0x33ce893c, 0x950947ce, +- 0x5eb8e9e3, 0x6af31cb9, 0x90123922, 0x0fed84d0, 0x353950d7, 0xa79606f2, +- 0x51ae5e7a, 0x8c0c4f40, 0xa096ec8e, 0x2ddb7fbd, 0x99b48cbc, 0x7d3dfa09, +- 0xe4a84d76, 0x363be81b, 0x2aa36f24, 0x37e2953d, 0xbc50f4f7, 0x72bbe848, +- 0x0cd91f2e, 0xabc79873, 0x9d9b8a54, 0x3b23c8ca, 0x7f9c5ec0, 0xb3eb07b0, +- 0x836714cc, 0x53ffa27a, 0x7af1a7a3, 0xcb3faf95, 0x0dfcf072, 0xf9421bd6, +- 0x1a6f2a76, 0x911babc5, 0xb29ec03f, 0x7073023b, 0x3d49cf5d, 0x9c3f2277, +- 0x25cff99a, 0x0ee7e748, 0xe510b4fd, 0xb02635cf, 0x379187d3, 0xde5c1969, +- 0xebed180c, 0x65e7e824, 0xd8fbe07b, 0xf9b6abcf, 0x7cd530b3, 0x1334ca5e, +- 0xa1601d1e, 0xff28c85f, 0xb9fac552, 0xd1fb72e6, 0x612fc335, 0x2b1ae81e, +- 0xa0352387, 0x099ec8f8, 0x03be95cc, 0x09235ff3, 0x49a986fb, 0x6aa887e4, +- 0xcb21fa12, 0x5946b9c4, 0xf82cb7f0, 0x7b2b0ffb, 0xd830150a, 0x2cdcef2e, +- 0xdedfe70f, 0x686fe718, 0x5ce94dcf, 0xd591cf4e, 0x6e1f4809, 0xd7df91e3, +- 0x26c93ac0, 0xbdf1186f, 0xfb41db26, 0x2a3b4fb7, 0xafd0bd3d, 0xe52ffb94, +- 0x26bd5798, 0x71ca5ffb, 0xf64e4d9f, 0xe531fc7a, 0xf52ae94d, 0x21db0337, +- 0xe5cd6cfe, 0xbbfd7f18, 0xfd0497f5, 0xfefd7c95, 0x7331fb06, 0x225996b8, +- 0xddf00a39, 0x03c0d6cd, 0x16177eb8, 0xb3fb49bc, 0x7a9e6677, 0x4e2bf303, +- 0x88cf9919, 0x9c432472, 0x8ebd033f, 0x75cc9ee3, 0xce53f3f1, 0xb113d36d, +- 0xf2e9c05c, 0x7da6165a, 0xfcb99af5, 0xacf5e3bc, 0xda17a5a7, 0xaa31e35d, +- 0x71fc31bd, 0x5f2faaad, 0xd72fac5f, 0x7f8e3c88, 0xdfdfeaf2, 0xd20a22c0, +- 0x7ca7b7e9, 0xfdf62636, 0x2fdf5653, 0x929e8f90, 0xe867de78, 0xfb24e672, +- 0xd0852dd9, 0x64ff199e, 0xc9ff38a6, 0x55ff13f3, 0x4e4f5ff8, 0xb69f5461, +- 0x82c7b2df, 0x2d9e22f5, 0x1ef1fa8b, 0x264dc966, 0x30fa49b9, 0x473c8922, +- 0xb0f1ed37, 0x793bb743, 0x9ada175c, 0x0b439fa0, 0x9a4bc254, 0x42aec0dd, +- 0x10b72bfe, 0xbe7469ff, 0x0af40ac6, 0x651ca978, 0x5dfa4049, 0xc36ef463, +- 0xb304e4be, 0x5a6ffa8a, 0x96fa85a2, 0xfe90a67f, 0x33356558, 0xdc4f9427, +- 0x68654097, 0x44e07247, 0x718c2985, 0xee4235ee, 0x481bf7cb, 0xcc2a567f, +- 0xd01b798f, 0x9fdf1bae, 0x3b50b0c8, 0x7c5cd298, 0xf1a8ca7f, 0xf28534d5, +- 0x1aec0538, 0xf488c13f, 0x57e0ab7e, 0xb3cdf059, 0xfb8d0700, 0x7141dc82, +- 0x05bd5530, 0x632de7cb, 0x70511ce8, 0x629b9cf0, 0x9d8ac1c0, 0xf8bbdf82, +- 0x3f8d3339, 0xd2017935, 0x28b710ad, 0x6d0e3125, 0x3ea1a7af, 0x6b5f6466, +- 0x07edaafc, 0x76b45b66, 0xcffb0f8a, 0x3cd9df10, 0xdcb84279, 0x47fca668, +- 0x7aea5ef1, 0x1fa413ee, 0xaf77af8d, 0x3d7c40bd, 0x3fc5df14, 0x0e75f2a6, +- 0x98f7c727, 0x391fe42c, 0xea164c61, 0xaf2e359f, 0x17298fea, 0x4bcff903, +- 0x3b407c46, 0x7d58df28, 0x918950aa, 0xe70f36f3, 0x4be76857, 0xb09f7c01, +- 0x67c859aa, 0xc8db8cc3, 0x7dfdb5c7, 0xb8c0f5c7, 0x0384eed0, 0x7b7685c6, +- 0x436ee6ad, 0x4fe370e2, 0x2fbc7151, 0x6eb1971b, 0x04eb9e22, 0x420e815e, +- 0xe13a3718, 0x5e3d1030, 0x4f7bf227, 0x58f1f2a4, 0xa65f3eb1, 0x40d0e810, +- 0xfcfa58f9, 0x9da46b98, 0xb6efa82d, 0x20f7135a, 0xe8273ddd, 0x67eda4e2, +- 0x3cef6885, 0x59e8bf37, 0x92b3eb94, 0x9120b556, 0x893ac75c, 0x757935ef, +- 0x4acde321, 0x1adc832c, 0xbff581e7, 0x7cd4ff33, 0xd759fcec, 0x5fd442d6, +- 0x7bc60f20, 0xafc28752, 0x37069fd1, 0xfbd221d2, 0xc1c61d20, 0xbb11d1af, +- 0x0b1293a1, 0x88bd8177, 0x047ecd4f, 0x91e7884f, 0xf9d1d9ab, 0xb2cf1101, +- 0x3479f334, 0x6bee0884, 0x9e500f5c, 0x0199e5d9, 0x69d6079f, 0x720fa4de, +- 0x59ec6c14, 0x76e30630, 0xffb4ef00, 0xede3784b, 0xa7cb2fe5, 0xb58f891e, +- 0xfb39a5f1, 0x383a9f29, 0xd5f94ed7, 0x693e45d3, 0x7140deb0, 0xc8abf074, +- 0x96626f1e, 0xa9ddca30, 0xf2d5bec2, 0x3c4a8ffc, 0xc27a193e, 0xb18beeac, +- 0x59e68793, 0x1dc794ab, 0xb1f3c15a, 0x46e0ed07, 0x9060ec95, 0x0573badb, +- 0x765ca5ed, 0xd2aedfb7, 0x24a79979, 0x80b43ede, 0x7db3dc51, 0xe45fa8b6, +- 0x58f76b0c, 0x7cd16948, 0x460ef6f7, 0xc8eedff4, 0x594cfaa7, 0x16fdcb9c, +- 0x79ed37d7, 0xbf6c4fdc, 0xb7ea88b9, 0x52c78424, 0x87d88f5e, 0xf5fb81df, +- 0x7f1fb05f, 0xe3f3479f, 0xb0751c78, 0xa38a77fc, 0xb40cea3e, 0x2a2dfd21, +- 0x8118e5f1, 0x3c4cea5e, 0xbaf40a9e, 0x7a6187b3, 0xfa21735f, 0xe6b2d73b, +- 0x44050c57, 0x2e905baf, 0x7a078de7, 0xebd1d02d, 0x97054f56, 0x469708db, +- 0x5a7483af, 0x17379f1c, 0x76fb6308, 0x9b9fe757, 0x32e83fd0, 0x30de797b, +- 0x978c83cf, 0x2cf0310f, 0x6e3c3854, 0xf6782659, 0xc1c4ff13, 0x137c2973, +- 0x8ce9a74b, 0xfc48c7f3, 0x90b0ae93, 0x3fca2ca3, 0x4f03594f, 0x7c83b8e2, +- 0x0bf70f74, 0xdb2dc087, 0xba6e9e89, 0x0517ef99, 0xe3ef5c6d, 0x8c0651be, +- 0x7f8c5b3f, 0x867fab53, 0x96cddb0b, 0xe1ba1e38, 0x1cff007f, 0xabbb3f51, +- 0xe6c6f291, 0x8e9e30cc, 0x793473b5, 0xcd53eda9, 0x746fed13, 0x1e6236ce, +- 0xfd1adcf7, 0x5bbcd0fe, 0x4dd4fef8, 0xccfdf573, 0xa03e1b63, 0x6cd646fc, +- 0xbbcdfc44, 0x8aff5f45, 0x695f7067, 0x3d2bee0c, 0x0329e22b, 0x47c827c0, +- 0xb25d4dbf, 0xf3a076f3, 0x292f3f31, 0xcccf38c3, 0x9bbd86b4, 0x8ee8fca1, +- 0x6dfe5471, 0x747ff7da, 0x1777eb0a, 0x41867951, 0x90c7e7e2, 0x8acf810f, +- 0x2ebe6f2b, 0x89f5112f, 0x4676f7e8, 0x81093def, 0xced0d9f6, 0xf29f3133, +- 0xf888673e, 0x5e22c0c0, 0x0724fd7f, 0x55bded4f, 0x8ceaf8a5, 0xe47cc884, +- 0xff4b1783, 0x90f30cb3, 0x728be467, 0xb0e353d9, 0xc1f4acfc, 0xfd67d47c, +- 0xd705768d, 0xc79329a1, 0x4b17c7a5, 0xe22763dd, 0x7fd12c79, 0x4d579f23, +- 0x91322fd9, 0xf154664f, 0xa77bc67e, 0x3b6016b5, 0xf72a79c3, 0x11125a67, +- 0x19bf1aff, 0xd9a41f84, 0x27217e8d, 0xd9bdf49e, 0xfafd0292, 0xa717922d, +- 0x26f29fe8, 0x9d9817c5, 0xfbf3a79f, 0x6b8c14f2, 0x3cf1f74f, 0xd8ab6dd5, +- 0xb6f3b42a, 0xd653e95d, 0x0b74fd40, 0x7a04f5a3, 0xbd206537, 0x2720fe4f, +- 0xaecc8911, 0x9e8d77a7, 0x3e746b66, 0xc0cf4f43, 0xfefc76a7, 0x8eb5e4cb, +- 0x7a51ad9e, 0x09ce291e, 0xa0646570, 0x5e96f85c, 0x138e0d8f, 0xe3f18fc7, +- 0xf027248e, 0x46de562f, 0xbe24ebe1, 0xbfecc2cb, 0x36cbe402, 0xe1c72f8d, +- 0x1e864cfc, 0x2b943f3a, 0x01d1c779, 0x0b5e29dc, 0xfe38b9e9, 0xc6cbe0d4, +- 0x50d972d8, 0xd14ff0b8, 0xe7fe50ec, 0x9643f8c6, 0x7cef87a8, 0x170a392c, +- 0xf1153f8c, 0xf0e1eec0, 0xb99a92ec, 0x867e115c, 0xd268b716, 0x3f587be6, +- 0x7e04cadf, 0x7183df8e, 0x285bda26, 0xf708371d, 0x3683ac25, 0xdfd0a09f, +- 0x877e2d73, 0x1df6e609, 0xcfd11d57, 0xba834177, 0x811d5d70, 0x279c236f, +- 0xe863a10c, 0x3e622d8f, 0xfa065fda, 0x445467f0, 0x37834bd7, 0x234d4f1e, +- 0xf9f8d1c8, 0xba27e3c4, 0xf8193d6e, 0x0de7ced4, 0xe712f7ce, 0xb89f6f19, +- 0x5f78fa4d, 0x25cb88b2, 0xc570e347, 0x12c35f58, 0xf38714bc, 0xd5bfe44a, +- 0x7281bd80, 0x519aa6b9, 0x6ed9243c, 0x669c38a0, 0x27c48c77, 0x48c55f57, +- 0x632cd54e, 0x9f205ce2, 0xa63d3c5f, 0x931fdeb3, 0xb7516bff, 0xaf7e442f, +- 0xf0f2ebb7, 0x6e3cec6b, 0x1b935ebf, 0xf502b7ac, 0x887960fc, 0x40adef9e, +- 0xff7f13b9, 0x1e45cd57, 0x28be4e2f, 0xfbc6b3d1, 0xf9ea0566, 0x0adeeae4, +- 0x240f5f94, 0x75c5eef9, 0xe3c0c37d, 0xdcf8f1ea, 0xe2d0619a, 0xa74497c5, +- 0x78347cf1, 0xd811dace, 0xf168e381, 0x0f5273a4, 0x38a64f8f, 0x3c81ff45, +- 0x4ba067a4, 0x20669a23, 0x1cff3f27, 0x37fc519d, 0xf726ede0, 0x7b9c9aed, +- 0x18dce498, 0x5cfdd7a1, 0xbe9cf89e, 0x4e1c19bd, 0x021dcbc2, 0x9e85332f, +- 0x2653bf3d, 0xaf86643f, 0xa16e2b78, 0xb2379f04, 0x8fb1f130, 0x8f76a3f4, +- 0xa83079d7, 0x63fdb1ba, 0x4bb7d20e, 0xfda3a85e, 0x0cdb31a5, 0x97d18d4c, +- 0xba09c363, 0xefc641fb, 0x2795d64f, 0xdaea6674, 0xaf9c3a4f, 0x1eed2fab, +- 0xecbfaba7, 0xb95d32f9, 0xaeaa67a2, 0xab57e4fd, 0x7bcbe574, 0x7fb5d3af, +- 0xe03df504, 0xccef5bf5, 0xefffbdd1, 0xc79eb31d, 0x232bdcfd, 0x7f7dd3df, +- 0x5819c446, 0x0c53d7c8, 0xd1a85ff3, 0xdd5ac5ef, 0x74d660f7, 0x0728954b, +- 0x0dc2dff8, 0x1a7d4f3c, 0xbfb62c60, 0x7b7a6d45, 0x508b2662, 0x58535f7e, +- 0xcc3376f2, 0x37d7d353, 0xbc20ee1c, 0x013dd97e, 0x0c0bdc63, 0x197d0f48, +- 0x858c6760, 0x14b0a47f, 0x891bb3cc, 0xfd6cbfff, 0xd7e1588b, 0x47b37f5a, +- 0x5556febf, 0x62b6febf, 0xbc3bfafd, 0x9a4ff5fa, 0x977f5fa2, 0x29febf4f, +- 0x4ff5fad5, 0x3fd7ebf5, 0xfd7e9e7d, 0xf5fa0233, 0x5faf551f, 0xfd66ecf7, +- 0xd72ee77a, 0xe85e6baf, 0x36fdfd36, 0xd1a07471, 0x0b4f2693, 0x7711ddd6, +- 0x19818e1f, 0xa342e862, 0x7afe85b3, 0xdd1a5fca, 0x78dd13f6, 0x8631f4f1, +- 0x6fcbbc89, 0x99851f48, 0x7f981740, 0x3f92cc99, 0x1bef3d27, 0xd43a999d, +- 0x56e4d0be, 0xf58f3eac, 0x6792478f, 0xf094f443, 0x53d44797, 0xa35b2fe8, +- 0x7448f2fe, 0xfd031afa, 0xa06f834a, 0x4ecdd838, 0x0489c70e, 0x887fb76e, +- 0x3b439755, 0xe0053368, 0x03e70d7d, 0x3096bfe3, 0xdf1de29e, 0x1c469d63, +- 0x43d616f7, 0x422cf9cf, 0xea7300cf, 0x642c7dce, 0x7f88937e, 0x8159975c, +- 0x4ade9171, 0x1617a394, 0xf6837a9c, 0xb94c5eb3, 0x4e327ba4, 0x68c97ee3, +- 0xb90acec6, 0x26fb87d1, 0x8ab7ee50, 0xa98fa078, 0x9e7c18ee, 0xdacbf115, +- 0x57e912e9, 0x7e502726, 0x2577ed57, 0xffb54fd2, 0x99759fc3, 0xff1eae3c, +- 0xc35cb35c, 0x0bb09b6b, 0x5f707db8, 0xbbf54aa6, 0xb276aa60, 0x944ebd43, +- 0xdf1fd0ff, 0x44d878c7, 0xc2c7b9fe, 0xa29504e1, 0xe3a64c5c, 0xb8eeb474, +- 0xcbee78fe, 0x4df0e163, 0x22e59850, 0x02cf1fbc, 0x95de1764, 0xdffd4f99, +- 0xe38880ab, 0xfec38ffd, 0x15684a3d, 0xc07fd1c5, 0x5bf471f4, 0xa38a259a, +- 0x85e000ff, 0xf5e9c7a7, 0xcad61ea0, 0x33bc05ab, 0x4fbc1db0, 0x184b34f7, +- 0xfdbafaff, 0x78c3f60d, 0x7887f83f, 0x59a1e2d7, 0x58668740, 0x603fbdd7, +- 0x8f8bcf14, 0x41928e8b, 0x93fe63a2, 0xf7ab9f91, 0x9fb8db28, 0xd4ebd27a, +- 0xd1987dc5, 0xbf20e785, 0xbcc2decc, 0xe731b3e5, 0x87bd600c, 0xe9747fbd, +- 0xbf2fbe28, 0x31676566, 0x4fd88dd1, 0x7ee57bbc, 0x978acb2a, 0x3ef10af2, +- 0xf7cc572a, 0xc7d43726, 0x8762bbf0, 0x90e463ef, 0xcba7eed1, 0xd959ee57, +- 0x4678fb43, 0xdad66f71, 0x819c3bac, 0x2fc77898, 0x631d8533, 0x1a673109, +- 0xfc37a613, 0xe19d33bd, 0xe54ecafa, 0xcb5fac6c, 0x886c979e, 0xcf4146b7, +- 0xd7ba092f, 0x607b36e0, 0x5eb818bc, 0xe8def412, 0x3ce131ec, 0xe8b5825e, +- 0xd2b4b8c1, 0xd3fba6e3, 0x1c93716e, 0x83ac41ba, 0x8dd4a0f9, 0x0acc4ae7, +- 0x5ec5f99e, 0x832fda7a, 0x64bcf726, 0x76efb864, 0x2435c54f, 0xcdc94d4f, +- 0x8fa06ede, 0xc8b4be1f, 0xaf061819, 0x51ecd3da, 0xc5cac42e, 0x5f8532e7, +- 0xc64d993e, 0x1e061975, 0x743f93d2, 0x587e6ff2, 0x7e58f3c1, 0xf94603f8, +- 0xfc396ced, 0x94f14655, 0xf724bcca, 0x2f422c5c, 0x0604ac37, 0xe8f6031c, +- 0x980b0b4a, 0x66b21f41, 0x98d2d3b2, 0x4369e88f, 0x3ade8be9, 0xf65ecef8, +- 0xcff462bb, 0xaff8abef, 0x2a3b2c66, 0xf2c7af5f, 0x758fb1fa, 0x1d9a0e62, +- 0xde537161, 0xe0af1850, 0xaff7184c, 0x3b6357fb, 0x1f798f7c, 0xe01ef0d5, +- 0x574277b9, 0x26dbdb04, 0xeb077d1e, 0x96ddec13, 0xe12ef802, 0x0055e616, +- 0xf2dea95f, 0x74f00569, 0xb02f4395, 0xbdf136d4, 0x37ef0a6d, 0xdd26bf7e, +- 0x43df87be, 0xfb130573, 0x045efca2, 0xd5233f6d, 0x0aada7be, 0xbea156e5, +- 0x8f8141fe, 0xcfe3fb14, 0x303d63e7, 0xad1668dc, 0xbbd4407f, 0x54f78fec, +- 0xdd165cf1, 0xff459bf7, 0x97037649, 0xfb132a57, 0x937ebcb6, 0xf56ab7a8, +- 0x65f6261e, 0xa8ab7d79, 0xde79db37, 0xeeb7b012, 0xfc62b5fb, 0x2c0c5bb4, +- 0xeecf4310, 0x102c09b9, 0x35c91f43, 0xd1b2bac9, 0x3b25cfce, 0xbeea6467, +- 0x5bbdfad3, 0x45789b8c, 0x4b3beebe, 0xfb7d38e1, 0xcfa4c9b9, 0x367810ee, +- 0xeae99565, 0xacfef3b5, 0xf273b45d, 0xaa7b8a76, 0xaaf3dfae, 0xe072849a, +- 0xdd1ae5ec, 0xb7482d7a, 0xd3f23877, 0xbc21bf71, 0xa3353a12, 0xa788b13c, +- 0x683d3c53, 0xa553c05c, 0x7b889e72, 0x853959ae, 0x6e807bca, 0x95a1feb1, +- 0x82ef2a5e, 0x9fcf0ab2, 0xbc2a3f43, 0x60fd0edf, 0x83f42b79, 0x1fa107cf, +- 0xe3003e7c, 0xf866fd61, 0xa09bcb0e, 0xb7df2c3f, 0x7be547d2, 0xb9535657, +- 0xca9fa575, 0xa3ce576b, 0x032bdde7, 0xb2b35cf4, 0x8e67ea9e, 0x6bedfae2, +- 0xb39405e7, 0x9980bcf8, 0xe7a22aa3, 0x80bcb43a, 0xfef0d30e, 0xb8a3cddc, +- 0xfe65cc1c, 0xfe9c2da7, 0xecc89ee9, 0xa34f9d0d, 0xe7e29bdf, 0xa1b191eb, +- 0xd55dea99, 0x3bed1c7c, 0xacb10ee6, 0x158c7e4a, 0xea4bf5db, 0x1997ca6a, +- 0xcceae3cb, 0x256a6213, 0xfe974ebf, 0x13e90894, 0x5f2f58a5, 0xdfc3ccf3, +- 0xe3101d53, 0x3ecd85c8, 0x8a658e9c, 0xc4f31bbf, 0x9d00deed, 0x08bdcfef, +- 0x9b1f839d, 0xa62af174, 0xaee2e982, 0xc9d1dbd1, 0x7674ca33, 0x89b17caa, +- 0xbeb259da, 0x72676ba7, 0xd5daead7, 0xc7bbcd2e, 0xc518f883, 0xb0de61e7, +- 0xb8c0658a, 0xd337da8b, 0xbac5ebb8, 0xbdf97cc1, 0x3e2407d6, 0x3dbf615f, +- 0xb5f314ea, 0x3ab9206c, 0x458bc5c6, 0xca032149, 0x9d7ff7c3, 0xc8fafc44, +- 0x478a0643, 0x0361658e, 0x5078d7ae, 0x813f58d3, 0x127952f5, 0x9728574a, +- 0xf2c65532, 0x7e422c65, 0xab6fd82e, 0xe49b9d71, 0x285643c0, 0x3c0ecb9f, +- 0xba91f3ca, 0x8914af49, 0xecd228f5, 0x7c4a6dd8, 0x28dd6f7c, 0xe7f58ff2, +- 0x9bf7e295, 0xd32a3957, 0x1fe8fed1, 0xe6cc7f21, 0x42dcf339, 0xe32dbfc0, +- 0xef6a7a4d, 0xc30d55ef, 0x787de39e, 0xf2cdf494, 0xfbfac33e, 0x1fde81b8, +- 0x2b9c79c6, 0x5e6603f9, 0x08c2a6b1, 0x8c6b09f9, 0x93509c9a, 0xecb63d98, +- 0xf331624d, 0xabe56478, 0xec090a05, 0x764de100, 0xe7cc746a, 0xea527f2b, +- 0x22a63cc4, 0x7fb93791, 0x8ce14665, 0x7befd1d1, 0xb3141d04, 0xc5ff924e, +- 0xfc97836e, 0xe7539f48, 0xdb0b5a77, 0x445e787c, 0x98bcc71e, 0xb5963363, +- 0xf96b39d1, 0x23c9326f, 0x4cb5c4f9, 0xc123bb05, 0x7b216619, 0xfc265fb4, +- 0xf9091fd7, 0x067d91f9, 0x68e72fc1, 0xc8f9e1f7, 0xe9c8f9de, 0xd49e6275, +- 0xfa46ed47, 0xafad3e48, 0x5f7a762f, 0x2e9d000d, 0x22f3683e, 0x6dc50978, +- 0xbca03f74, 0x1259625b, 0x20f3c1c1, 0x6cbdb993, 0x42c956dc, 0x1b579eb0, +- 0xbf098702, 0x8321eabd, 0x5da1fca6, 0xee898a63, 0x78831f67, 0x6e5e23b1, +- 0x43819c2e, 0x1e131617, 0xbf798917, 0x26b1e625, 0x80bfc35b, 0x787cf987, +- 0x76e2e09f, 0xcfd6efcd, 0xaa92def3, 0x4b7d636f, 0xa0f94c8f, 0x973cf8f1, +- 0x44c4a7f8, 0xf1daf058, 0x70046e3c, 0xa0fc85be, 0x8829dc20, 0xb69fbe5f, +- 0xe30a69c4, 0xa97ee039, 0x30f29ab3, 0x7f281827, 0xdf2e9e35, 0xf368f617, +- 0x6d3d2728, 0xcf44b39e, 0x73df72d1, 0x7fc8530b, 0xaed67ae0, 0x9f16bcf0, +- 0xf78d8d4f, 0x28e2d7ad, 0x413f5f22, 0xdf783bc0, 0x479e38d8, 0xdb3d6768, +- 0x24664f30, 0x9590c6bf, 0xc0d7e717, 0x54fd20d2, 0x651f2858, 0xa4e796bd, +- 0x8f29529e, 0xe7989e1b, 0xba741164, 0xb9efc1d6, 0x3a37e6d0, 0xd1d1cb8b, +- 0x06ff9c59, 0x86de5a2c, 0x2634a6af, 0xabb6bfff, 0x6d75fc8e, 0xc4406a3f, +- 0xf4120649, 0x820d47fb, 0x6d9e0614, 0x7dc04aab, 0x1fbe3690, 0x3d75d0d5, +- 0xd8f2efbf, 0x285f7403, 0x3d22a9f4, 0x75f689d4, 0xfafef4eb, 0xe201fda2, +- 0x4078f8d7, 0x980fffbc, 0x1e5da133, 0x67e7ffef, 0xcbdf7f09, 0xe9bf714a, +- 0x938286cc, 0x29b70009, 0xd1b9d18f, 0x74e3f251, 0xa5583bef, 0x26cf786d, +- 0xcaf7e12b, 0x0fffafc4, 0x97844db2, 0xdf5f12fd, 0xf13b68d0, 0x2e0afec1, +- 0x7d3ff607, 0x28d186fe, 0x7d2572cf, 0x91ae713e, 0x818b77df, 0xc9df787e, +- 0xf970f558, 0x0cb23362, 0x5fcf4cdf, 0x8d7b97a1, 0xda4f7b87, 0xd37f9254, +- 0x4f3d70b3, 0x84b125fe, 0xf74228f8, 0x83b9a3e6, 0x78dc21e3, 0xe180e36e, +- 0xf4b1f983, 0x452cddf0, 0x66f86dc0, 0x1e8678f2, 0xaf2573ae, 0xe1c75da4, +- 0xf50b29ba, 0xb4e9f763, 0x0d7c7cd8, 0xc35503ae, 0xf86e2b9f, 0x029a78a6, +- 0x8b0e54f0, 0xc22ffaa7, 0xf0d301d3, 0xc04cfcf0, 0xf2cf6ff3, 0xd6862efb, +- 0x6dfb437f, 0x1efe1c67, 0xc509b9eb, 0x33fbc036, 0x2fa79fc2, 0x04c2f68d, +- 0x05cb3afe, 0xf90b967d, 0x895f25e3, 0x4c9f5f05, 0x0a9d64f9, 0x72c1a94b, +- 0x2aef42e5, 0x4a7f7a35, 0xfca010d0, 0x79baf67c, 0x4477f958, 0x990385c8, +- 0x3878b0d2, 0xf4f9e628, 0xa8b9b58b, 0xd57dee67, 0xb42e50cc, 0x5efdfb08, +- 0xef05a767, 0x88f0d59f, 0x067832e5, 0x5ec5914d, 0x647f972c, 0x8cc3ed51, +- 0x6de3e067, 0x6d1be38a, 0xabf9ed3c, 0x0fae62ac, 0xcc6567a5, 0xc574dfdb, +- 0xd42f742b, 0x648572a6, 0x7fc6d7ef, 0xce5e9ebb, 0x7692bf75, 0x5f97a703, +- 0x4934bd21, 0x1b7e256f, 0xf22941ca, 0xcbee0972, 0xff34029b, 0x43b1e020, +- 0xeda78a1a, 0xf9b45e82, 0xe0d7f369, 0x90b95c76, 0x9af1c1d6, 0x41c69499, +- 0x17d35ed1, 0xe1ff4249, 0x5c5f48bc, 0x0f73f0a1, 0xfbad0a15, 0xe95329a6, +- 0xb101ca5c, 0xdcb91e2f, 0xf83dec34, 0xf76f027d, 0x0f63fc5e, 0x2ea1b5fa, +- 0xc00bdd23, 0x8dcf5e94, 0x4bf12f78, 0x0c33dd0a, 0xf78d54f4, 0xe2fd3d1c, +- 0xf3b444f9, 0xf2e2ccde, 0x2e2ccdec, 0xca2e070f, 0xe45e74d5, 0x729c8fc5, +- 0xce9ffd0c, 0x4d3ec592, 0x039e0f4f, 0xf3c658d9, 0x1ec2eddf, 0x57d8bfb0, +- 0xa7dbf08f, 0xc52cc4fc, 0xb21fdbd0, 0x46d704cc, 0x0bcd2453, 0xc98f05fd, +- 0x82ec9bac, 0x6dafba5e, 0x939b9cf0, 0xfca9a1e3, 0x8ef68659, 0xe3df8bbd, +- 0xe54b3a76, 0x3ee01672, 0xc613ef04, 0xc3ace47e, 0x2f1872fa, 0xc3bdfa3f, +- 0xa133d7c9, 0xb2a3df82, 0x383f8ae9, 0x24b89ef1, 0xc7fdd189, 0xea36c83f, +- 0x57ada1ce, 0x2cec1cb9, 0x3b41e9ef, 0x2854e42e, 0xfbb3a72f, 0xfbda0b0e, +- 0xf2f85f1a, 0x8ad7bcf8, 0x4ed77cfb, 0x39e30e29, 0xd78e8d14, 0x202e0764, +- 0xbe046edf, 0xafec9c78, 0xc274ff1e, 0xf314b38f, 0x1eb0275c, 0x9586afba, +- 0x87c89c9b, 0x8e8306c5, 0xe6c9aedf, 0x413da374, 0xf3dd93fd, 0x9abb4163, +- 0x2c3b97de, 0x7db5cf0c, 0x1276717c, 0xb672a7da, 0x9d79ef66, 0xed8fc788, +- 0x7c4ec973, 0x0df6b7fb, 0xda0779b1, 0x73f02df3, 0xcb44c7bb, 0x59febc8b, +- 0x0b317ed8, 0xe97683dc, 0x775976e2, 0xc16dffde, 0xda2e8be7, 0x9d8c7758, +- 0xf7ca68bf, 0xa2d2bce8, 0xfef4898b, 0xf49f916d, 0x2a4bc8b6, 0x8af0f314, +- 0xdfd915e7, 0xc6f7fed0, 0xff5dcbc9, 0x972d48f9, 0xd0d98597, 0x6bd4a36f, +- 0xe36a7f42, 0xb9d0bfd4, 0x7fc0b791, 0xd17f36ef, 0x7758533c, 0xed83b8cc, +- 0x77595a2e, 0xa8baec4a, 0xbe747704, 0x6b7faa76, 0xf04be7a5, 0xc7874a38, +- 0x3a05ff68, 0xbfed0e3c, 0x5adfea88, 0xfd25fc59, 0xffa11f8f, 0xd1fc1d3c, +- 0x7de90b7e, 0x47da89ff, 0x272fc06d, 0x78ef57ba, 0x8eebf30a, 0x7cfee99b, +- 0x8ab3b876, 0x92fdafce, 0x3bc6b9d1, 0x06f27f8f, 0xb9ddcde6, 0x31c5e4c7, +- 0xf9918c06, 0x43f461de, 0xf0867321, 0x79ed291e, 0xcd017643, 0x45bdfe27, +- 0x0f313b09, 0x38ac52ce, 0x58593f51, 0xf135784f, 0x93e48583, 0xfad79716, +- 0x2672871d, 0xf76a3e46, 0xf62bbc85, 0x0b60ff8d, 0xc0aecc2c, 0x8157f732, +- 0x9c623773, 0xd961e1ad, 0x7421efc9, 0xc5a23f91, 0xf3f415bb, 0xe3d4300a, +- 0xe3fe7867, 0x4b03723f, 0x0e7e6e91, 0xdfe300e2, 0x01bd84f2, 0xff0a4f8a, +- 0x8f6b3eef, 0xf7231bc7, 0xdf2b6456, 0x8b6fdf4c, 0x7f1537d3, 0xeb9ba47a, +- 0x8f38159b, 0x57e7b946, 0x8e7879b5, 0x1bdc57a9, 0x5bdd92a5, 0xee927e5b, +- 0xfcd5ab97, 0xfbf175f9, 0xb42ed9ec, 0x7cf8b583, 0xa13fe622, 0xf3c8dfbe, +- 0xbc6cebef, 0x14fbf75c, 0x4789cf3a, 0xef104a45, 0xdf97b29d, 0xfc24e82b, +- 0x0f30179e, 0x20e63658, 0x9e04077e, 0x433d77cf, 0x5f9e18f7, 0xa0e89a37, +- 0xa53f37ee, 0x640ec97b, 0x63acfc8a, 0x7543d20e, 0xde256f66, 0x93207793, +- 0x4a9d9bdb, 0x8c596277, 0xab36b9fd, 0xfbebe48a, 0xd01b46eb, 0xbaf0d73e, +- 0x8d85c853, 0x89503c5a, 0x6dfde254, 0xbf7797ef, 0xa0f07a4c, 0xc6e77e95, +- 0x4a93e870, 0xa3714fba, 0xafa5ee99, 0xcb76343a, 0x2c6fa83c, 0xa8be5032, +- 0xe09590e1, 0xdf9eb739, 0xa2df84ef, 0x343c6ebe, 0xa80f7e8a, 0xbca116ce, +- 0x6f04c6ae, 0xd497ee11, 0xdd16fa1d, 0xbee67f27, 0x372839b1, 0x39aaa74f, +- 0x7dee7f74, 0xf7987480, 0xf86363e9, 0x74c9d6fb, 0xd1b1d25e, 0xae2e1816, +- 0xf893e9a1, 0x640ea3fb, 0x461ff696, 0x78b58cfc, 0x917940f7, 0xb8b03f76, +- 0xf9eeac0f, 0xf3151cc8, 0x557f85ac, 0x33ef7f67, 0xfdadf7ba, 0x3d385bcd, +- 0xcd027df3, 0xb71f8b3f, 0x039de84e, 0xfc7cc8a6, 0x35baa67d, 0x9e26ff02, +- 0x28675687, 0xd327dfa5, 0xee31bff0, 0x0457d57e, 0x99e7b5de, 0xb7ba1517, +- 0x1c81ec0e, 0x733a57dc, 0x76f44cdc, 0x3a78e366, 0x578dad2f, 0x0271b807, +- 0x564e9e9f, 0xfefae227, 0xbaafc859, 0xd4efdc35, 0x3619d7de, 0x477ae357, +- 0x6f94c98e, 0x248ce033, 0xd6887ee2, 0xce0f2b4e, 0xdfa64ba7, 0xf9903a19, +- 0xd03bad34, 0x32ba4315, 0xfa41c6fc, 0xfe1bf836, 0x97ef457b, 0xf50d90b3, +- 0xf266abf4, 0x331c4ed3, 0xf03c1d93, 0x3b773f1a, 0x7b2f1ee4, 0xadef0724, +- 0x1466fe0c, 0xec81b5c9, 0x376e6ec8, 0xb8dee95b, 0xc9815381, 0x432cff62, +- 0x81978bdc, 0x6385daf6, 0xd7b46ed6, 0x20fb49e0, 0x43d7b621, 0xe8db8fef, +- 0xd2780ffe, 0x1d260939, 0x9cefd0f4, 0x7df136b0, 0x677f7d0f, 0xca0c604e, +- 0xa00b3be9, 0xdf7e3b7f, 0xe42eed47, 0x19612607, 0x78c532fe, 0x766fd499, +- 0x4bde9720, 0xeff8791f, 0xfa89b47b, 0x9a0faa1e, 0x1e699303, 0x8eb0767f, +- 0x4df9e661, 0x2f7b7fef, 0x9be4853b, 0x99e03706, 0xbc78bfec, 0xe20c7278, +- 0x3e385df7, 0x7072e9e2, 0x3e04bf3d, 0x5f90a78c, 0x71d7c5d2, 0x971358fd, +- 0xc9e3ad27, 0x431ba5ce, 0x569af262, 0xe89b7b1d, 0xdbe8c072, 0x72297a8a, +- 0xbdf8c8ca, 0x6019606a, 0x6f0a619c, 0xfce36757, 0x9ef1c1a4, 0x686e6fc8, +- 0xef4f79e5, 0x9cede2fd, 0x273c7605, 0x9ceeb6fb, 0x83f716ac, 0xae31124e, +- 0x89aaf762, 0xdedc25b5, 0xfe2e0996, 0x8d1b4dfb, 0x554efd2a, 0x14b1bee8, +- 0x5263384f, 0x8ebdd10f, 0x901827eb, 0x5cbd5a9e, 0xf8da84f6, 0x9afbb4bc, +- 0xe2977bb4, 0x9cddf2f1, 0x38bbfe02, 0xde2b702c, 0xa99a7dd9, 0x8db36269, +- 0xc7ab9fee, 0xebca017f, 0x2b3e0d0b, 0xbd25bfcf, 0x379ef430, 0x8efc97d3, +- 0xf96dffd5, 0xe68cb907, 0x250dead9, 0xc77d5ea2, 0x583efdc9, 0xbbf4953d, +- 0x7749e7cc, 0xbea066e8, 0x939adff6, 0x0724f54a, 0x7d7891df, 0xf2699d3c, +- 0x903e086e, 0xfc5fb06e, 0x3dbefa0e, 0x48d5c787, 0x79bde058, 0x7ba2642c, +- 0x0abe8461, 0xcf018a4a, 0xd4b9f775, 0xbecba444, 0x55e482d6, 0x52e0a798, +- 0xe862cad3, 0xa32cf824, 0x9e2accf3, 0xbf8c984f, 0x889be273, 0xc903bcf1, +- 0x3c4238fa, 0xeb4f8f3c, 0xff5b1f9d, 0x772e1cd3, 0x1fb8735b, 0x261cebf8, +- 0x3c78feec, 0x22583a72, 0x1bd5a0e8, 0xcafc8ab8, 0xb64b76b8, 0x88fa0925, +- 0xd4f6df7b, 0xcabe533f, 0x85bdfd4e, 0xde3d6235, 0x9214de79, 0x8133e126, +- 0x37eb8df2, 0xff577973, 0x5dd14d42, 0xfce74cbc, 0x4ddc75a7, 0x70b30fbf, +- 0xc622cccf, 0x8bad17e5, 0x730b9f46, 0xdf68457c, 0x4ecbb645, 0x6dfa93e4, +- 0xaad3c132, 0xc3b659b4, 0x8cdbb3fb, 0x0bd5f764, 0x0566ce78, 0x14dd6912, +- 0xef0098a6, 0x22409567, 0xc5dbb5d9, 0xcdc4e0ef, 0xa2bdda03, 0x1f830d94, +- 0xc2675f0b, 0x7430c14f, 0xeb40ca70, 0x898130b4, 0xe89347df, 0xecd9c79c, +- 0xee58adc0, 0xee9e7f03, 0xa06b6e9f, 0xf1e2557b, 0x2012d67d, 0xe6225d7a, +- 0x7e33e1a3, 0x039f0d1c, 0x9fb44f88, 0xfa41df9e, 0x8ca0f82f, 0xee9ecc14, +- 0xecfc90fa, 0xbe66c769, 0xbf7c2df1, 0x1518ec19, 0xcbfe6df5, 0x077d47df, +- 0x98ed0a72, 0x690563da, 0xa36f4e2c, 0xd2fb593f, 0x8c4344dc, 0x976d6cbe, +- 0xb5a59f69, 0x22e24e70, 0x06fe7f6a, 0xaad3afa4, 0xa62cad37, 0x9a392bdd, +- 0xaf5fa93f, 0x4d7fcdba, 0x37ea71c4, 0xda5e6918, 0x4c000cba, 0x6cdb8724, +- 0x81ffa461, 0xabf508ac, 0x7d20d3ad, 0xf4683ae3, 0xcd3eed04, 0x78718a71, +- 0x2f2fb6bc, 0x861de950, 0x003f164e, 0xdb7f62e3, 0xe69f741c, 0xe1ab8ea5, +- 0x05bd7063, 0xd719535f, 0xc51e7771, 0x14a70dc7, 0xdd3f064a, 0xf20e4d76, +- 0x07d81d71, 0x93a88718, 0xbdd06f22, 0x74ccc7a6, 0xe6dd6fef, 0x78e2b7a5, +- 0x0d99af75, 0xfc77df58, 0x5704899a, 0x9e02badc, 0xf7a38672, 0x8e48bc81, +- 0x607f0637, 0x6b7f1057, 0x9b8189f3, 0x8b3f00e0, 0xc819c5ee, 0x918cf583, +- 0xe1cd7f03, 0xef681af1, 0xf37d1134, 0xe706997b, 0xaf9b8ceb, 0xafbe6e33, +- 0xe66fa230, 0x167cd00d, 0xe0366ebe, 0x5ff785fb, 0xb771845f, 0x69d3f5be, +- 0xbec97d5e, 0x7d5fc889, 0x30ffd039, 0xfde172f2, 0x2f92cf30, 0x959b6798, +- 0x79c46bd6, 0xb3764726, 0x27a7982f, 0xb7cf3f57, 0x7e913514, 0xcc88e34f, +- 0xcc128e30, 0x16fc6ff6, 0x97efd32f, 0x1e9c8d05, 0x746d9b82, 0x8bbfaa2e, +- 0xc9af8fdf, 0x12ef1801, 0xf440c1e9, 0x6ea557d0, 0x75f48299, 0xfdc4ec9f, +- 0x97f5be8a, 0x2fbf8cbd, 0x7651b7d7, 0x57d0dda2, 0xf207f1c5, 0x5f78f480, +- 0x2a06ff8e, 0xefd2371f, 0xfb699da4, 0x3ee89feb, 0xfa466382, 0x3c81e23d, +- 0x5879c6ff, 0xae517806, 0xe26e5e01, 0xe691ab76, 0xc1eebadf, 0xda1f5875, +- 0x6fce8936, 0x7ad7d50c, 0x906fd73c, 0x14c87c75, 0xde0bc695, 0x17ee8a3f, +- 0x120cf0d1, 0x23fd08b6, 0x9e581f0d, 0x978a213b, 0x8f7f38a0, 0x8fbf0276, +- 0xc433c84b, 0x13d73e4f, 0xe5058e78, 0x19a79e18, 0xcbc55f49, 0x7bbd789f, +- 0x4fb6ae63, 0x0dc797a9, 0x79afbf71, 0x69795c5b, 0x1658dc9c, 0x5718df57, +- 0x86f9fa0f, 0xcfd2e2e1, 0xa2cf8e0c, 0x1a21927e, 0x4fb81d1f, 0x56b4bf22, +- 0x07e84d51, 0xeb8d3e3d, 0x59853ae7, 0xe4be22ae, 0x156a73e7, 0xc32e62d6, +- 0xac535ef7, 0xb5fd04bf, 0x9ca19398, 0xb410e5c0, 0x94c536ab, 0xc1ab7935, +- 0xa3c04ab3, 0x9c76bf3d, 0x7dc466a0, 0x15b9558c, 0xca31f743, 0xbf5ffce4, +- 0x11d67e88, 0xe0ccfc99, 0xb0ff5c0b, 0xf2dc3f4f, 0x3bef1b98, 0x323ca02e, +- 0x78f1fe6d, 0x61fc381c, 0xe4defd22, 0x5f3a26f3, 0x5295db5e, 0x72587e45, +- 0x6fbc5864, 0x44fae5cd, 0xe95fafeb, 0x6b1d9c4d, 0xc4deb347, 0xadf7dfd8, +- 0x4ae1fc3d, 0x7f016bf4, 0x8e463921, 0x5a96399f, 0xdd65fe85, 0xf0ab32ef, +- 0x5cd1efbc, 0x3ea00e2d, 0xe6f901bc, 0x13e29988, 0x33cc2ffd, 0x2ffdf7e0, +- 0x9de78bd4, 0xff609f74, 0x7072675b, 0xfe8344fc, 0xcf7f89be, 0x9d54f6e5, +- 0x57ddcde1, 0x9a3ffca2, 0x2626b79e, 0x28675d0e, 0x31f8bf23, 0xc23e6463, +- 0x3aff760d, 0xfad503cc, 0x12ab9a39, 0xde47fd1c, 0xe1f28dde, 0x32ecc6cc, +- 0x47fd2b14, 0xdc1f90c6, 0x4565daff, 0xff6b5f78, 0x945e197d, 0xd5198f0b, +- 0xe2dfb93b, 0x8bc9eef0, 0xe0e387f6, 0x91ff63fe, 0x3f1895c9, 0xc38d7fe8, +- 0x278a650b, 0xe610bb40, 0x26fd6a5f, 0x984dd41a, 0x677ece8f, 0x8ee2bf24, +- 0xf1d20acf, 0xd344957e, 0xa050f7f0, 0xc3cfa11f, 0xd6f34d5e, 0xfde37df2, +- 0x37ff2d0c, 0xeed30fde, 0x17f78f8b, 0x3ddb59eb, 0xef1c9798, 0x6e618237, +- 0xdf89a509, 0x4ebfa733, 0xf74bf7d2, 0xdfd66e7f, 0xf6121d9f, 0x71e48580, +- 0x7ae3f02d, 0x79853f8a, 0x3c9d6fdc, 0xc5ec7eec, 0x6fa76e5c, 0x7e6dfdb5, +- 0x9ebacc6f, 0x03c53036, 0x626d3d78, 0x70d94f16, 0x9c85e3fe, 0xc37b925a, +- 0xb1758dfb, 0xa1b1d6f7, 0xaae9e47e, 0x9df9e530, 0xefd32f5e, 0xf5c3c459, +- 0xf8c8fd55, 0xebdfb5ef, 0xc4ed04f8, 0x00938c54, 0xe45fc9a4, 0xd5e1eb3f, +- 0xbf1569f0, 0x01fff2a3, 0x949113dd, 0x00008000, 0x00088b1f, 0x00000000, +- 0x7db5ff00, 0xc5547c0b, 0xbddcf8d5, 0xc3764cfb, 0x083c8426, 0x813bcd84, +- 0x44902c24, 0x8f2ed4ac, 0x0310f0c4, 0x5850822a, 0x89de4020, 0xc5b0fd60, +- 0x40802166, 0x151a86d1, 0x260dda2b, 0x22ec1208, 0x760d1201, 0x4a888941, +- 0xadb45503, 0x202a25f2, 0xd4109204, 0xeb6bfe8f, 0x73339cff, 0xd0820fb3, +- 0xcfe8fbf6, 0x99dee64e, 0x7de733b9, 0xfd999cce, 0xf7f87bfe, 0x17bec613, +- 0x62a2d9a5, 0xc963106c, 0x2d9990ff, 0x43b2b194, 0x891ae71a, 0xafdac0b1, +- 0xf50b999f, 0x398d16ee, 0xf958c2c6, 0x6726d921, 0x659ac630, 0x3e0c4267, +- 0x08a822ff, 0x8f3797de, 0x33cccb31, 0x9cb3795e, 0xac654ce7, 0xd86ae9ab, +- 0x671a54e2, 0xfd88c5ba, 0xa1dab69f, 0xc2acc834, 0x57b4f465, 0x4c8b58ca, +- 0x69de28f3, 0x9932fea8, 0xe1efbfd1, 0xb05752bf, 0x29bcbd4f, 0xbd4bfab2, +- 0x7f8c5ea7, 0x367fc244, 0x8c5967a6, 0xec57f095, 0x6187ea72, 0x5dde6053, +- 0x1912e7b5, 0xb2a8d12c, 0xa1325ac7, 0x169df89e, 0x67b58ceb, 0x7e6899e5, +- 0x67981641, 0x20dbf3b7, 0xb7d2f306, 0xbf9c36c8, 0x2c32fcff, 0xff32c65a, +- 0xc2e5f983, 0xf33cc2fc, 0x5864f983, 0x59e67906, 0xb2d1e966, 0x3e879858, +- 0xc48d9d28, 0xa369b616, 0xfc22fda0, 0x6a2fde13, 0x058d3c59, 0x79a93631, +- 0xe0031ac9, 0xb25abba1, 0x7e79e0ea, 0xf00dc00b, 0x764dbf90, 0x932f005a, +- 0x311d5692, 0xd3f17d40, 0xe6ba1ef0, 0xcf4ee3c8, 0x9ecbf686, 0xb87ea990, +- 0x1ad391f6, 0x0d36ebc4, 0x031e21d3, 0xef8bb682, 0xa15f9c31, 0xcb615f98, +- 0x7c120bd4, 0xd921d96f, 0xf5fec6ea, 0x5f3e2b26, 0x79f341bc, 0x96fad7bb, +- 0xde301fe0, 0xd392ad92, 0xa92de30d, 0x95df7df6, 0x38b2d0e9, 0xefd5bfe8, +- 0x99faed79, 0x54b14247, 0x51d60933, 0x8f7df4e8, 0xf986deff, 0x77bf8b94, +- 0x8c1e6c26, 0x3032e9f8, 0x61f806d6, 0x8630f6ea, 0x1a3dbba5, 0x7cd5d8f1, +- 0x58f11a36, 0x24fffafe, 0xa7f07eb2, 0x14c5ac94, 0xe0102e7a, 0xf7d89169, +- 0xabfba42a, 0x69faf3d3, 0xe7087a3f, 0xc71a9d8b, 0x3fbc2b60, 0x746dfb52, +- 0xb349d23b, 0x1fb9987d, 0x9f1bedfa, 0x08aa0c39, 0x8606dd2c, 0x3ccb8665, +- 0x4de4f905, 0xd213798d, 0x33f5f6c7, 0xf0dd43b7, 0x00660686, 0xf12304f5, +- 0x12c7f20b, 0x3e1571af, 0xd9b129d9, 0x99426654, 0x6892f38a, 0x930fdf5e, +- 0x1e771e88, 0xd09e9dee, 0x69867cdf, 0x21e8dda8, 0x347dda8c, 0xd2356f2c, +- 0x11ca805b, 0x3660f884, 0xe014259b, 0xaafa092b, 0xe121595a, 0x4d5608f3, +- 0xa2e610e5, 0xecc605f2, 0xaccf6c46, 0x63338466, 0x7e118343, 0x5eb4f3c4, +- 0xe6e90abb, 0x9b770267, 0x8e0f4e24, 0x87ace660, 0x3d5ae5bf, 0xa6300793, +- 0xd841ed65, 0xf33694c9, 0xbde0c3d7, 0x255943e6, 0x43c8bd01, 0xcd5a7c15, +- 0x8c6fdf88, 0xc6f00df7, 0x17f7e1df, 0xa578e2e5, 0x83a665fb, 0x6a372ef1, +- 0xed88db98, 0x9da05f81, 0xb5affde6, 0x5a972831, 0xeb009624, 0x3e3a8728, +- 0xb6a71f2f, 0x52e0bd39, 0x78f0e16f, 0xf04892da, 0x8edb52e8, 0x33fa434d, +- 0x2c3ad22f, 0x2e7e4e38, 0x11347183, 0xaf38b48b, 0xd04fefc3, 0x82de20c7, +- 0xeb37c4d5, 0xb6ef945b, 0x64fc7199, 0x78f329d5, 0xa993df78, 0xf1e1db66, +- 0xcdc6a3f9, 0xf7ca47c8, 0x3f1c2cba, 0x12812b67, 0x97cf3c92, 0x8397dc64, +- 0xfb3297fd, 0xa5a3a47a, 0x7b733235, 0x0d79fdd1, 0x6b92f7c7, 0xc63dcc81, +- 0x4cc45fab, 0x6b92d75a, 0xbcfcf441, 0x6f3bb781, 0x9ef174e2, 0xc7c5d385, +- 0x885fbbe2, 0xaf2dbffa, 0xeaf2beac, 0xef1f0bf2, 0xd6e5c458, 0xa547487b, +- 0x44ce7b52, 0x88fac4f8, 0xf5ca2d5e, 0xe66695b3, 0x3ad0fdd6, 0xd7b73207, +- 0x5ddafb77, 0x40f73033, 0x6859b86f, 0x1af59efe, 0xcad9fde9, 0x31c09b88, +- 0x9e8e07ca, 0xe07ce3f1, 0x89f8fd78, 0x656cfef4, 0x1fc64df2, 0x63f18371, +- 0x19efe67c, 0xaf9e9e37, 0x20b1554d, 0x9fb5aba0, 0x6cc49ce8, 0x74a7ae7a, +- 0xbad6ef82, 0xfd2de927, 0x4d83aff0, 0xe163628a, 0x8b9ca37d, 0xbcd97c74, +- 0xae7c8cc8, 0x74b90609, 0xd8d7f41b, 0x7180ef72, 0x0321c175, 0x5aaf7e91, +- 0xdf5d68e2, 0x1d105706, 0xb4743b7f, 0x8fc188ec, 0x7d61e454, 0x997c90ed, +- 0x59fab378, 0x7ae5f392, 0x21d37dfe, 0x9fe44a60, 0xaf42f5db, 0x18bcc9ff, +- 0xd43553be, 0xf4c98fae, 0xf994c7cc, 0xb33c4336, 0x9430fb26, 0x819b8f03, +- 0x801f896f, 0x5abd61af, 0x3bbbfec9, 0x9fd81f80, 0x8a1eac75, 0x24f60d6f, +- 0x471f17b3, 0x09fd70c4, 0x728510dc, 0xa86ac1d1, 0x4aba6f2c, 0xff00b670, +- 0xf794bae2, 0xe087ace5, 0xc2cd7c8e, 0x16d52691, 0x4f64df7a, 0xccf34bca, +- 0x78eecfa3, 0x0150e8c7, 0xfd0ee9ff, 0xd9e10823, 0x6e99eead, 0x22d5d285, +- 0x77c37a07, 0x8fe70c64, 0x4ebf4309, 0x65e7876f, 0xd3e40fd8, 0x27166f23, +- 0xd329fca1, 0xbce3a4f5, 0xf7f9bc8f, 0xdff79474, 0x861e2a1e, 0x7b4277cf, +- 0x3db413b2, 0xf1af5665, 0xa1d999e2, 0x9329eb1a, 0xef88e263, 0x3cef9ffc, +- 0xe7183554, 0x886200d1, 0x5677c085, 0xe5f717be, 0xdb072440, 0x18672853, +- 0x0b7a97c8, 0xcaf74dda, 0x3eca5728, 0xea04db02, 0xbf5ccd19, 0x4e650c67, +- 0x67da0c55, 0x7c46cd1f, 0xcd6a6595, 0xc04a582a, 0x1ae736a8, 0xa9901f78, +- 0x1d1ea337, 0x5f7f843e, 0x0e3cfa8b, 0x440f67fb, 0xe414fdbc, 0x0f247fec, +- 0x2becfcea, 0x06b2a9f7, 0xdca95ef8, 0x00e51d3e, 0x31e985c8, 0x07d97e30, +- 0xb5489f5f, 0x309e8b60, 0xd0b74fc4, 0xe3127f3f, 0x37931a3c, 0xfbaae913, +- 0xe3d777fe, 0xbb2437a3, 0x88e3d71d, 0x5f515bd4, 0xec6708b0, 0xcebc2f4c, +- 0xba09518d, 0xba01ee01, 0xb6e62e1d, 0x796bb067, 0x6725e930, 0xb943d208, +- 0x1e51d98a, 0xd40069b2, 0xf32e91db, 0xf5a666d2, 0xd0d79fa7, 0x6c62cb78, +- 0x4abe708b, 0xcd668ffb, 0xc3f7b34d, 0x04a94887, 0x21ebad4f, 0xa94f679c, +- 0xf01dbad1, 0x82be21f0, 0xd2cd2f7e, 0x93b065b9, 0x0dc635ba, 0x27d1d012, +- 0x075bf381, 0x184ffac1, 0xceb815ed, 0x5e4c0fd9, 0xc8e9758f, 0xa472cb40, +- 0x59ed85cb, 0x06399788, 0xbef8c3fb, 0x161f6f44, 0x3cbc4b06, 0x00349ed4, +- 0x40de6a95, 0x97966f0e, 0xfcefd796, 0x753c7cf9, 0x54b7fa46, 0x31b7a5c0, +- 0x49d9006e, 0x67480daf, 0x152e9f30, 0xd0fd402b, 0x15fbe625, 0x25e623e8, +- 0x279c0ba7, 0x7da10bb5, 0xed49dd61, 0x97f5af22, 0xeae08582, 0x3a7a2ec7, +- 0x1745db86, 0xdbfefdf7, 0x9d50c05f, 0x44481cdf, 0xba58b5bb, 0x76faeb44, +- 0x62f9c9d7, 0xbeb8d57d, 0xa27b7a47, 0x12aeb0b5, 0x972d61d7, 0xea7d621f, +- 0x5a1fc49e, 0x2daa975f, 0x80e2e887, 0xf18fae64, 0x3c6d2bf4, 0xf4051399, +- 0x3c17505e, 0x9674e65a, 0xe8567488, 0xd1788f84, 0x028e32b1, 0xde42e59f, +- 0xf014aef5, 0xb676e009, 0xfbe51f02, 0x33e0fc67, 0x8d93dd5f, 0x2abf98f3, +- 0xa9e5c558, 0x7947e893, 0xefa560bf, 0xfb14ab77, 0x49c931e7, 0x7ebc66f3, +- 0xdcec11d0, 0xea9d7504, 0xa2f787ea, 0xb2a690dd, 0x2db0dda2, 0x68c06400, +- 0xf028fec6, 0x07c802f3, 0xdf3d087d, 0x0223cf80, 0x6788ff78, 0xe82ace54, +- 0x99a1379f, 0x32a5f0e8, 0x6f8655a3, 0x98e0642d, 0x331614c0, 0x67d9d91b, +- 0x50fdffc7, 0x68f3ac3b, 0xf08ddd8c, 0x1550305f, 0xc3cd21fd, 0xda06623e, +- 0x1c38e36f, 0xfd17b3af, 0x99933fe0, 0xb1e46435, 0xfbe42acd, 0x94be6699, +- 0xe3e71225, 0x834d997b, 0xd99fbbdf, 0x2ea9dda9, 0x93fd0dad, 0xc15be853, +- 0x0e601fbc, 0x39873e7a, 0xdccb9ca9, 0xaca7fed4, 0x1f0aea9d, 0x082ffd00, +- 0x3e7ff4e5, 0xf9ba265c, 0x327de718, 0x4ae87d30, 0x678cc758, 0x5fc81293, +- 0xf04419ab, 0x67bcd9b9, 0x8f8e1c48, 0x71dbd8c6, 0x6fdcde9c, 0x7181ac5e, +- 0xd1377a54, 0x989c9f5f, 0xe1d04834, 0xb689cb0f, 0xcc7f3ede, 0xb8700918, +- 0x2ef4a04b, 0x63f9315b, 0x3991b2d9, 0xe36d3f00, 0x53fa2764, 0x43ab6cc7, +- 0x93aa6543, 0xcab36d5e, 0x59dff7a4, 0x50194ccd, 0xc694677f, 0x6b74455a, +- 0x5d3c3d23, 0xcd7d978c, 0x7800f6fe, 0x586e5d3e, 0xdcf50c1b, 0x790fe021, +- 0xd0e4d5d1, 0xb3e46abd, 0xcfbef129, 0xfafaa5a7, 0x6ab3774d, 0x3d3be119, +- 0x61ddb7c3, 0x95d00b84, 0x3ffb962a, 0xfe1b386c, 0x8fe1ecbd, 0x31f9147b, +- 0x1bb6aaed, 0xd62631e6, 0xf585886e, 0xecfbbf2f, 0x532efc7c, 0xa0c60fb3, +- 0xb3213a5e, 0x73fef04d, 0xd81b13e0, 0x82565f4b, 0x397e0306, 0xd61ff607, +- 0x0d3b02bf, 0x16958bcb, 0x5d812f2a, 0x2abbef85, 0x207f54ad, 0x16242f36, +- 0xc368bf40, 0xed1db515, 0xfa2ceafe, 0x5f410afe, 0x2ab72a6d, 0xbb67f910, +- 0xb87d4564, 0x2136d0c2, 0xa2b6e010, 0x180ac63e, 0xae4d4566, 0xbe7e9c56, +- 0xd1072f3b, 0x4558f4b8, 0xd7a5962b, 0xd2076624, 0x8bce417e, 0x3ebbf1c6, +- 0xddd67cfc, 0xe57cfcf0, 0x85fefa58, 0xbf7d1b4a, 0xca9732b3, 0x3c7b588a, +- 0x74b5b3b6, 0x20b40eb4, 0x7d10ae36, 0xa1d0dddc, 0xb67a828e, 0xdf21b24d, +- 0x4e6369dd, 0xab75e027, 0xada9eb86, 0x0f90a7a0, 0x7ccda7c7, 0x7a8661e1, +- 0xe38e9ec4, 0x30a53fdc, 0x3e99c71b, 0xdb1aa176, 0x631df03d, 0x743c6303, +- 0x65ba3376, 0xf2fc727e, 0xddd1129b, 0x1ee59565, 0xc71cabb4, 0x7a0fb265, +- 0x185530d5, 0xe193f7bf, 0x74e0074e, 0x70b8fef9, 0x35cb6794, 0x2f10f096, +- 0x27e9d639, 0xdcf73ac7, 0xdfade116, 0xdf5c433a, 0xd0e505fe, 0x810e5c67, +- 0xb7ee74a5, 0x118ca728, 0x976fc456, 0x520043f0, 0xcb8fa881, 0x406f82b4, +- 0x33bd608e, 0x83c82d80, 0x51abd67a, 0xf00f9013, 0x8f24967b, 0xf57c499c, +- 0x585fd8d9, 0xe9dbdf3c, 0xdf97f25a, 0x53b2fd42, 0x5e80d0e5, 0x5d5cccba, +- 0xeabae3af, 0x17b4568c, 0xc0752593, 0xefec10ca, 0x964bbe24, 0x2095ea2c, +- 0xfabd7647, 0x19e7e0c2, 0x8d8c09da, 0x6c6ff785, 0xf3392409, 0x667ac686, +- 0x817ff625, 0xc9f97ff7, 0xc26f3f47, 0xd1d289f2, 0x1059428f, 0xcd70421b, +- 0x70e14dff, 0x5111b3a4, 0x6f180680, 0x6dc941f7, 0xad2c6748, 0x489af0e6, +- 0x6dc8cf98, 0x50c1aa1d, 0xaa93aa8e, 0xca611cb0, 0xfbc3263d, 0xcd0b58b2, +- 0x8c434c63, 0x32ec851c, 0x9f97f9d8, 0x6be1bd90, 0x5cd6a487, 0x79983099, +- 0x92e191ec, 0xa5e222eb, 0x347a74ca, 0x4d563be9, 0xb96fece3, 0x69734ff7, +- 0xe0e9601d, 0xad6a17bc, 0x8e9c1fa4, 0xcbb3a45a, 0xd92b64f6, 0xe78e79e7, +- 0xed97bf10, 0x17d45661, 0xff5fc007, 0xa33fb611, 0xac1e75a6, 0xf184193b, +- 0x07e0019b, 0xe97de01b, 0x93d21ea8, 0x0c2d43a5, 0xc5f43bbf, 0x3e1172bb, +- 0x6bfb8d65, 0xbd129c69, 0x82d9fd15, 0x515b57fd, 0xccc9b26f, 0xd5f4809a, +- 0x9abfebc8, 0x1ea2b364, 0x86fda82d, 0xa8f2dbd7, 0x83de079e, 0xe62fdb1a, +- 0x42b3d976, 0x74f6b12f, 0xb2445b92, 0x7ebe0f16, 0xfdf1af05, 0x644718d6, +- 0xcfa3d185, 0x416d0f40, 0xf2d488fe, 0xe6136dfe, 0x6e5c1346, 0xe3290f51, +- 0x0e65ab3c, 0x2d45ea03, 0x20f597d7, 0x603e902f, 0x7c7117fc, 0xc9466f45, +- 0xac235a52, 0x1d59ea3b, 0xf8b7b397, 0xd603d99d, 0xec54de93, 0x1f6172b8, +- 0xe8136154, 0xbfb465df, 0x8970f282, 0x6d4cb3d0, 0xe3bb4549, 0x776da333, +- 0x6071d92c, 0x7f48a8e7, 0x65eb1efd, 0x7175d832, 0x319d765e, 0x17f496e4, +- 0xe3f6d933, 0x7db56e7a, 0x9fe798a8, 0x03433cc5, 0x1d2c9da2, 0x87f80afd, +- 0x7858e984, 0x587186d2, 0x447ef1f4, 0xc156eb24, 0xe11d073a, 0x8bb1e3f5, +- 0x1b05acb7, 0x77a47dfd, 0x3382470e, 0xfb430050, 0xca6e794c, 0x6210f4e0, +- 0x11dd93d7, 0x5462b03e, 0x337d1785, 0xc20c7bb5, 0x653fd363, 0xdb7684b7, +- 0xfc5233ff, 0x86de7fc7, 0xfd7fee38, 0x150e624c, 0x2d15d7d2, 0xb4d16bb5, +- 0xf43dfeef, 0xb54c296b, 0x007b3fa2, 0x71c7adf0, 0x8ec96a66, 0x05db416a, +- 0x09ccb7da, 0x86f7b923, 0xc741cb86, 0xdfde009c, 0xf7c10000, 0x689dc3ab, +- 0x55d60da7, 0xe38697bc, 0xdf120557, 0x1b9c68b4, 0xc7fc7162, 0xb2f8d206, +- 0xe8e1bdfe, 0xe4227d7f, 0x9ee49551, 0xc76df18b, 0xefc32d15, 0xa3bb04d5, +- 0x535ea1ca, 0x7fda9c38, 0xed192a02, 0x5b609ac4, 0x03d9ca24, 0xfe4994ff, +- 0xba828cd5, 0xc513e491, 0xd8666a61, 0xfea18322, 0x4d4bc0a0, 0x99feb3ad, +- 0x4c9e7c50, 0xb8c60ce3, 0xe18bb61e, 0xc345fce3, 0x07a7d9fb, 0x075ed1aa, +- 0xf089144d, 0x027e6dfb, 0xe3c2d2c5, 0x0871c826, 0xcfb7e15f, 0x19477216, +- 0xb3e83b1f, 0xffe30ed0, 0x37a92ce6, 0x5fdd7f20, 0x0d00e860, 0x58293ec2, +- 0xf5bf4263, 0xd6ecbb7e, 0xf7605c81, 0xecfadb65, 0xdf1c5882, 0xbd21c726, +- 0x937e2be5, 0xf5c2317b, 0xdb3d1ecd, 0xe0237644, 0xba7aed35, 0x1fdf80bb, +- 0xf8e3fe80, 0xc7fdbca7, 0x9fe71d42, 0x6887480b, 0x43da060f, 0x4de5fe70, +- 0xf6f29f93, 0x592ce72b, 0x40724417, 0xa552f77c, 0x132fa9ed, 0xa5c84ed0, +- 0xf2aef952, 0x7a99dcbd, 0xfe8a149b, 0x7189ce8d, 0x0ec205c0, 0x67b9d72d, +- 0x673e3f21, 0xefa30fb0, 0x474c5d14, 0x6674317b, 0x475c00f2, 0x0e60bbf7, +- 0x0233db41, 0x805067cf, 0x4c2b9e23, 0xd44c3744, 0x4818bfed, 0xdf04b9f6, +- 0x62fa3a41, 0xda3b698d, 0x2dad7673, 0xd1d20972, 0x47b240f2, 0xc1dc80ce, +- 0x0494cf71, 0xfbce1d13, 0xc8fbf175, 0xb4f2676f, 0x5a679f44, 0xe9f7bdb8, +- 0x85add94a, 0xbccd77f5, 0xf4224cf6, 0x45f55aeb, 0xdb2856d6, 0x1a35fcd7, +- 0x35bcd1f5, 0xdfb0d3a5, 0xd355a2bc, 0xe2374e11, 0x3a2579f3, 0x6e1cccc1, +- 0xb76ce353, 0x6742be23, 0x3941cb5e, 0xe4b8b83d, 0x17c18c39, 0xc4efd9c7, +- 0xdb6997f5, 0x651e10cb, 0x8d167c6f, 0xf37773f6, 0xa15b7bcb, 0x27d9336c, +- 0x35b2bf60, 0xc3acc577, 0x55ff84c1, 0x017c06a6, 0x671e7d1d, 0xe5f7c1cf, +- 0xd889dc93, 0x2da692ef, 0x56c6e107, 0x7ddd9add, 0x80fea5b1, 0x40607e84, +- 0xb295194b, 0xd1e71d33, 0xa483b929, 0xd8238438, 0x4beeb00f, 0x70507766, +- 0xc98d452a, 0xe9de289e, 0x5a9a3ebb, 0x403b8898, 0x6c9762bf, 0x32dd2033, +- 0xebe716a7, 0x9e18bedf, 0x7c5bbb53, 0xfc5cc45e, 0x93d37079, 0xab7d2077, +- 0x37f71b99, 0xd84aee2e, 0xbcbff88e, 0x6f44e5ff, 0xbcbfd83f, 0xfd7cbe7e, +- 0x00be9097, 0x89e0978e, 0x41abe906, 0x75ffe3e7, 0xfa248aed, 0xfd11ef82, +- 0x724aed74, 0x8f92f26e, 0x307e425d, 0x066b2bab, 0x95cdbdd2, 0x22967685, +- 0x95de982f, 0xb25bfe4e, 0x15fd1d2b, 0x3cb0de45, 0x773d2257, 0xfdb112ba, +- 0x8d67f401, 0xed16ef9e, 0xc4ddaa8e, 0x550e8ee3, 0x6c47d606, 0xee32bac7, +- 0xb497d6cd, 0x4f53eb55, 0x9fd6fa71, 0x95fcf210, 0x1f8ab457, 0x82bf0b2c, +- 0x5a3c1459, 0x7046fdb8, 0x8156b3f9, 0x5951c3cb, 0xbf803718, 0xdcde6962, +- 0xfb857e6f, 0xd94607cd, 0x2aae50a3, 0x6081f9fe, 0x5ea2a7a8, 0xea56f3e5, +- 0xe7fc1c0a, 0x4bcfe6bd, 0xf7be30a3, 0x1f8f1c46, 0xbcb81955, 0xb97032aa, +- 0x1594dab4, 0x34abef8e, 0xa2a6c760, 0xee2c72bf, 0x0e078d4b, 0x366d2ae7, +- 0xf57dc110, 0xe9475ba5, 0x6d976f91, 0xa6f7a51b, 0x639daa8f, 0xde60598e, +- 0xadaa7697, 0xb52a84b8, 0xd7b449f3, 0x2eca76aa, 0x7af7a307, 0x64bfb41b, +- 0xdb02723c, 0xe3c6dd2d, 0x65ff4a16, 0xf96db35b, 0xb11ef35e, 0x69be17d3, +- 0xc8fadf2e, 0x51fadf26, 0xfd0645b4, 0xb946fdeb, 0x8e63eb7d, 0x7fcfd6f9, +- 0x242cf0f8, 0xf1d902c3, 0xe3f68ca4, 0xa18e735f, 0xc0eaf93e, 0xf78a20c1, +- 0x8adf967c, 0xadb2f176, 0x3c0770be, 0x3827684a, 0x77a44876, 0xfcfe9d0b, +- 0x031f3fd2, 0x5f389446, 0x14dd37b2, 0x3aab4731, 0x9df6fae6, 0x86cb35cc, +- 0x7f95a571, 0x8c72fb8a, 0x5ddbdc67, 0x0fe8b45b, 0x46f77ff9, 0x368ccb7c, +- 0x1637c60b, 0x7eefe58e, 0xfb2272b4, 0x7cdbc702, 0x71e90732, 0xd224afe1, +- 0x25f70bc3, 0xd3748dbd, 0x14ce77b1, 0x12e5672a, 0xcbb8943c, 0x6dc916b2, +- 0x2c79ba82, 0x650fdbeb, 0x6b45ef30, 0xa1f13e75, 0xf3becdfc, 0xfbe35a58, +- 0xe1d3597e, 0x6bbee1bf, 0xda45fe81, 0xa6d82ea7, 0x396b8bf3, 0xbd3b42df, +- 0x7e462be8, 0xf7dd5178, 0x5ee2feba, 0x143ac44b, 0xee3990fb, 0x6e4eb864, +- 0x8edf8202, 0x3d7207ff, 0xc4d76cc4, 0x8dd8f20f, 0x95a9aa3f, 0xcca57e11, +- 0x8e3988fe, 0x207751fc, 0x0ea967cc, 0xa4d1b1ec, 0x577d6987, 0x78a00eb7, +- 0x06673c07, 0xb5957e78, 0xbe7ea165, 0xf2b268da, 0x965b5938, 0xa0cbea19, +- 0x602bf08e, 0x12a704d5, 0xa732cb94, 0xddb79b1b, 0xb3adf4e0, 0x97b76e6a, +- 0x1187dda8, 0x9dacc51e, 0xbd1e21fa, 0xbac095db, 0x3b41093e, 0xb33fafc4, +- 0xdcbc9c52, 0x95fc25a8, 0xf3af7d37, 0x0bf8af7e, 0xc4a2ff8a, 0xf4577ee1, +- 0xb7d20060, 0x3587d846, 0x5b7b9d1b, 0x94eb3d61, 0x0316deb8, 0x6b07a7c9, +- 0x7b07bcb9, 0x59d71130, 0xd68525b3, 0x8b64a0fd, 0xf6b68759, 0x7fd13d0c, +- 0xd3d8304d, 0x924764a1, 0x237600bd, 0x733dadd9, 0x12edceb4, 0x372e8fda, +- 0x4f35c1da, 0xca06f8f3, 0x9f6bb249, 0x527d9030, 0x27db8333, 0xa9c25b35, +- 0xca705fff, 0xf2576891, 0x913cd4f9, 0x995dedc6, 0x8ce163f7, 0x65f607e6, +- 0x5e6bdea2, 0xb2ff5d8a, 0xf1113ed9, 0x26b7acad, 0xfb84c7b8, 0xe060ac1d, +- 0x7af9e92d, 0x007abfa1, 0xff07180e, 0xc56bca52, 0xdda5097d, 0x1f5cf17d, +- 0xedb04d64, 0x5e28ed10, 0xb19aaf9e, 0xa79827e9, 0x52ca8cf0, 0x7f05e315, +- 0xd7112d9b, 0xc316e5ff, 0x99d3c468, 0x679e5c51, 0x05f1e04d, 0xdb6c5bf0, +- 0x5e22ff71, 0xfd7713e5, 0x614ef8a9, 0xf5e685bc, 0x2f8f3665, 0x28f2329a, +- 0xdab6038e, 0xf5f6fe82, 0xbef9e30b, 0xef36be68, 0x99fb8ff8, 0x3617028f, +- 0x5f17fb89, 0xbe91243e, 0x9a24f584, 0x1bf59ea1, 0xbe7fc503, 0xc1477a14, +- 0x2651d007, 0xc72161e9, 0xc67e90c2, 0x19e7e878, 0xa40e1741, 0xfd378b0b, +- 0x83c7d2f8, 0x09ecff02, 0x04d69f6e, 0x13cd7af3, 0x9fa03729, 0x650ffdfe, +- 0xfcb535bd, 0x01dfbfbd, 0xde36b074, 0x74fe9e0b, 0x4cced4c0, 0x7f35fdef, +- 0x8d96c83a, 0x57e728c9, 0xb4560148, 0xfe0857c7, 0x1184b158, 0x0ab1463d, +- 0x8235f909, 0x008f29b9, 0xc70181e4, 0xc00f71fb, 0x7f0f8bdc, 0xbccf4d72, +- 0x1678dff5, 0xa89f53ec, 0x9f69f48f, 0x79f18e6d, 0x8a44577f, 0x96c9fbcf, +- 0xa9f53e51, 0xb4fbb7c9, 0xde3adbbf, 0xd8cf7ea7, 0x67ed3ec9, 0xd4f866d8, +- 0xc6accc6d, 0xee54b7f9, 0xcde0fb24, 0x97dc574a, 0x65c3d709, 0x3ec8ee9c, +- 0xa6b1958b, 0xaa6707ba, 0x0dc61e81, 0x0622b238, 0xede387ea, 0xe4751ebc, +- 0xb1998c6a, 0xf217e2b7, 0x572388fa, 0x347ea163, 0xdfaf117e, 0x7f5fc8c1, +- 0x4cf17e27, 0x15c52a47, 0x667e218f, 0x8a38ab5d, 0xab47e16e, 0x41892e67, +- 0x24c92f1e, 0x67ecae39, 0x3f6313dc, 0xbcacfc84, 0x8d9fda57, 0xafbbfde7, +- 0x7ddff970, 0x2377cb85, 0xfe83291a, 0x32fc12fd, 0x0e04fefa, 0x6f413622, +- 0xa62ffda4, 0x8bea5cd7, 0x94fc8343, 0x3c618c6c, 0xf012a5af, 0xd370809d, +- 0x34aee953, 0x32a47953, 0x2bb7ca82, 0xe01f2c2d, 0x4c995ada, 0x2b4ab1e5, +- 0x395e3f3d, 0x2bf7ca96, 0xa89e546d, 0xadb2a5cc, 0x094a8f32, 0x2879a98c, +- 0x3758763f, 0x0e2e1068, 0xbd39f075, 0xc6e52f27, 0xcecd4c72, 0xc685f829, +- 0x5f6c186f, 0x31dd93c4, 0x71714cc4, 0xd35bbcf1, 0x73d222f3, 0xc16615d5, +- 0xa6c3b87c, 0x9fb416d3, 0x44f532ab, 0x9b4f52ef, 0xb8ebe505, 0xbaaf5e0c, +- 0x675166d2, 0xfdea3af0, 0x28d760ee, 0xa5550bd4, 0x189aeb46, 0x448eef7c, +- 0xa157197e, 0x387fa2b5, 0x3e67a7a9, 0xa338f1f2, 0xf47a82d6, 0x2df5a9b0, +- 0x73ca3df1, 0xdcc2bba9, 0x3457dc2a, 0xe2cc59b4, 0x7c0e383b, 0xc1f50637, +- 0xbbe187b8, 0xed056e34, 0x679b8d07, 0xe4aefbec, 0x0ffd5df7, 0xe4a2777f, +- 0x5ef8ddf5, 0xff3a6ef8, 0xbbe7c5ae, 0xe5ec996e, 0x0fb26e2b, 0x11ad83ba, +- 0xfa955f28, 0x4a9f7c24, 0x33d24271, 0x196e2ce3, 0xe887eff7, 0x070d3cb8, +- 0xa5e0d2f3, 0x6278956f, 0x675f2f5d, 0x08bba557, 0xb0926af9, 0x59692657, +- 0xa993c232, 0x98fe2802, 0x1ad77f2d, 0xcde5f505, 0x9dcc28d2, 0xdbcba498, +- 0x9aae7e46, 0xca161dcb, 0xb75332f5, 0xed0cbe15, 0x5945854e, 0x486adf31, +- 0x0f1601c4, 0x3cbb3872, 0xfaf51537, 0xd4df9129, 0x484f641c, 0x9bdc7980, +- 0x254a720a, 0xd9f71988, 0xde490372, 0xca4a1f77, 0xa67f7b44, 0x019fb2ce, +- 0x3c26a71f, 0x720d5333, 0x4b00e671, 0xfac664a6, 0xb70f5e36, 0xbde097ec, +- 0x73333d99, 0xc1ffedd2, 0x4934fafe, 0x381f97ed, 0xadf80136, 0xc8b2f734, +- 0xfb21ec57, 0xe498c7f6, 0x77e28834, 0x9ec7a46e, 0x03d226c9, 0x8e5b8f18, +- 0x92d53bf2, 0x35a2ed89, 0xff08413d, 0x94d4efee, 0x832d023f, 0xe38af3ee, +- 0xf3c2d8bc, 0xe3f9fc4a, 0xabd70272, 0x9f3cf1e5, 0xaf422ca9, 0x4ae5b2a7, +- 0x8f7ca30e, 0x3ff478bc, 0x57edeac1, 0x0277febf, 0x598e1fdf, 0x47f1e5af, +- 0x6530a114, 0xea53005b, 0xa96bcc0e, 0x3140247d, 0x4e006d46, 0x547ec5a6, +- 0x24cdfa6f, 0x1b7b4fb5, 0x67bcf7b6, 0xd29f0436, 0xcf7ea4bf, 0x8bc6d66f, +- 0x2cbd21ef, 0x825c4e65, 0x4da9febf, 0x0bfc510c, 0xa10bf3c2, 0xe38bf206, +- 0xa057a065, 0x1740a8cf, 0x0ceb33c5, 0xdcc17e9c, 0xc54eb2a0, 0xc0036bdf, +- 0x50fa85fe, 0x9a3ee3a8, 0x22bed13b, 0x67f51071, 0xef2fec66, 0x2291fea5, +- 0x1f794e6f, 0x1979518e, 0x0cdae9f3, 0x55938e58, 0x4e4dc2fd, 0xc46bff1c, +- 0x83a55777, 0x2fd2f59d, 0x2b41815d, 0x8654f1bd, 0xfdde8dfd, 0xa53f5026, +- 0xfdd8297f, 0x9c920767, 0x8d297a26, 0x2b3e5157, 0x4b6fcdf8, 0x36b0d768, +- 0xa561ea2d, 0xab9069df, 0x410fbdf8, 0x09f962ce, 0xc0b3d7c8, 0x9ca97f9b, +- 0x95a7e54d, 0xa67e7a76, 0xf6ca80b2, 0xfe7a0aca, 0x2a4ae579, 0x6535cd67, +- 0x37949f20, 0xbd6766ad, 0xa5d4bae8, 0x4bef7bb1, 0x3fdf1e9e, 0xe04aecbd, +- 0x98e9dd76, 0x95bbdffe, 0xbc7277f7, 0x817d8375, 0xdfd024f6, 0x8dc8735a, +- 0x136e8ced, 0x377abfdf, 0x7773d385, 0x25d7af24, 0x536ea868, 0xffd8adb1, +- 0xd12d14dd, 0xc6448aeb, 0x2c7889db, 0xdf8d1fd0, 0x3e54e707, 0x19ced28e, +- 0x2fedcaaf, 0xf225984f, 0xe89f4476, 0xc63d202f, 0x9967d178, 0x9fd3e885, +- 0x39136a2e, 0x38ebc4df, 0x2ea145dd, 0x708c7dc2, 0x0a731383, 0xdc36be60, +- 0x3893af57, 0x9f475e3d, 0x5d9fee2a, 0x0e309f47, 0x5ce809c1, 0x7ec7f282, +- 0xef94a3f4, 0x0b6fbe0a, 0xe08cfd33, 0xa331a2dc, 0x0cb1f8be, 0xaafec580, +- 0x0f9813de, 0xb266151e, 0xf6489ee0, 0xfe8ac6e3, 0x123fc7e4, 0x6ffd7db8, +- 0x1f8fbfaf, 0xdd7fd77d, 0xd07ec5ba, 0xe49baead, 0xa44bca09, 0xc3e47e9f, +- 0x3e4504a5, 0x1391fa70, 0x3f50e76d, 0x35064b74, 0x0dbbb3c6, 0x83ae2e9c, +- 0x4fa70a5b, 0x056a3e85, 0xbae1447d, 0xe9eb3ce2, 0xdf807f9b, 0xca3196fa, +- 0xa3c7f0eb, 0xd6bc5722, 0x2f04f7f5, 0xd818c279, 0x487fd017, 0x09f69189, +- 0x099a2457, 0xce83dd7e, 0x6f02dfcf, 0xe27a159f, 0xa7df1579, 0xdf76e450, +- 0x305e4973, 0x9e47d523, 0x7a33b433, 0xbf88e90e, 0xf0562adc, 0xf851fa1a, +- 0x70bf2f29, 0xef53c0ac, 0xee154cec, 0x6b7d75bf, 0xcd1e5074, 0x68339ee0, +- 0x056d7447, 0x7ffc8003, 0xf40934db, 0x878c12d9, 0xafbe3058, 0x8be8fda7, +- 0x24b20f60, 0x72bae768, 0xf298ed06, 0x07a664e7, 0x7dcfc9d0, 0x65e90b33, +- 0x998d21e9, 0x4fad9aec, 0x3b7a431d, 0x505928d7, 0xc23577df, 0xb39f71b2, +- 0x4034e4c6, 0x63a81cfb, 0x653b65fb, 0x03522527, 0x14fe907b, 0x286b3bdf, +- 0x777b458b, 0xa33f73e2, 0xb5a5f8fd, 0x71870b12, 0xa2badadf, 0xe7ea1235, +- 0xf9fcf1b6, 0x7fcf032a, 0x6b3791cf, 0xb47c6307, 0x312f3f96, 0x7bfe50e6, +- 0x75662ed1, 0xaf65bc63, 0xa5f3fc89, 0x1579be35, 0xeb7cdb05, 0x5cbe2285, +- 0xbcfbe754, 0x4f37c1a4, 0xc8a24c63, 0xa36148c3, 0x135a5e28, 0x22807642, +- 0x77e46f4f, 0x397396d9, 0x61d7d8c9, 0x0f95ef18, 0xb9fd137d, 0x8867d791, +- 0x2fd4077a, 0xa2f1c37f, 0xc94ca5c0, 0x1964882b, 0x23cc0cae, 0x3f719834, +- 0x8bf9acaa, 0x73f98620, 0x89d3ed01, 0x29975f3f, 0x93636adf, 0xa569fb4c, +- 0x3097862d, 0xff6cb0cf, 0x84c5ad49, 0xec887f70, 0x6398bb80, 0x6e8bfa3d, +- 0x6fe44a95, 0x8ddc51b7, 0x52967ad9, 0x60d9bb7c, 0xf65afd46, 0x73adc7fa, +- 0x625fbeb1, 0xd0e3c406, 0xa593a276, 0x5fb4c9cf, 0xc9f2d0cd, 0x8c89d0f2, +- 0xbb3c4578, 0xcf3ed006, 0xe23bc432, 0xe78ef019, 0x34e7e41b, 0xbba5f784, +- 0xb55f7a64, 0xed8b4ab5, 0x7e3939cf, 0xc8e7bc15, 0x45cf08ab, 0x4e7c702f, +- 0x99feae7c, 0x5d83a400, 0xdf73b21a, 0x79837e82, 0xd03a1f3f, 0x77e3e21e, +- 0xdf144bd5, 0x6683a3ea, 0xe01d1f5d, 0x07466f3c, 0x67a49fc0, 0x0607466f, +- 0x4fe41794, 0x8a1a3b8f, 0xf8cfedf6, 0x9db8947c, 0x1f9b9712, 0x10fa59d2, +- 0xd8884d34, 0x1b2cf647, 0x08955f60, 0xe4cce672, 0x74dc280f, 0x51eeca6a, +- 0xff034f94, 0xbf9461f4, 0xfb7cf047, 0x444b7fe7, 0x331dd079, 0x18c1db63, +- 0xae0767c2, 0x90383ba7, 0x923dd3eb, 0x3ae7a253, 0x93be0eb7, 0xf915720d, +- 0xa3a9bd92, 0xa0f743f8, 0x893e1e07, 0x184f68fb, 0xc92e88ad, 0xe2bafdc6, +- 0xc13e7796, 0xcc6b27f8, 0x7df8f9b6, 0x462b2fc2, 0x37df10bf, 0xb5e85f80, +- 0x3f9928df, 0x4bbf7ea0, 0xcb75a58c, 0xf256eb2a, 0x0598eadf, 0xe5eb95ed, +- 0xaff9233f, 0x686eafc4, 0x01e9f99f, 0x76e7fc8f, 0xf10c7319, 0xe5c0b73b, +- 0xf71132d3, 0x71c8fa3d, 0x675c40f5, 0x53373f1d, 0x297202d8, 0xf8a5ce94, +- 0xd13297c8, 0x19d23cfe, 0x472bf1c0, 0xec9501c5, 0x9d3e472d, 0xec94e384, +- 0x2194e3e2, 0x981c20fd, 0xdc0099fb, 0x28697027, 0x84c4591e, 0x5932695c, +- 0xe47e96dd, 0x7aed5d48, 0xe9fd7f34, 0x37ec18a7, 0x1d3f845c, 0xb6fa3595, +- 0x97ca03fb, 0xd25f2411, 0x077f47be, 0x23d32369, 0xd4e5b247, 0xf5afe801, +- 0xe400cb32, 0xb9e91be3, 0xdac0ada4, 0x38a6e35e, 0xb3ed4cf5, 0xa9f6615f, +- 0x7c22b9a7, 0xb26c8fda, 0xe51fbcf8, 0x3f79f64e, 0xa7d598e6, 0xd636d99e, +- 0x9f6dfda7, 0xb7ea7cd8, 0xb4fae7b7, 0x3cabe3bf, 0x2a6f7a9f, 0xf607e7ac, +- 0x908aeeef, 0xb64fda7c, 0x07c67c18, 0x99f04e0d, 0xf3ec1c9a, 0xe1c8d7bc, +- 0xef71a374, 0xab8efab6, 0x8cf7b9f8, 0x867f1df5, 0x5bdc77cd, 0xd00ec3c5, +- 0x4d106a9b, 0x628f413b, 0xc0254af9, 0x86f1ec1d, 0xbfaa08ca, 0xd2a1695a, +- 0xcf4c9955, 0x52b4ab5f, 0x2c72b1bd, 0x7d800fd5, 0xb026f58f, 0x1d7cb1f7, +- 0x7e7c7cec, 0x8ab57833, 0xdf131eef, 0xcbbe2e3d, 0x076e16d8, 0xef2e04dc, +- 0x4427fe8b, 0xafec36ff, 0x6961d0f1, 0x1aeaa66e, 0x90f8edf0, 0x2f8c5a0b, +- 0xe7b796d8, 0xf3df9fa0, 0x03b6ccae, 0xf3bb305f, 0xea286558, 0x1f3c81a9, +- 0x3de7af21, 0xed97178c, 0xfee3338f, 0x3fa6c6c7, 0x5df7c09d, 0x33c5328d, +- 0x117d348e, 0xba5ce384, 0x503ecc06, 0x97a837e8, 0xfaa24dfc, 0x798f7826, +- 0x82f793f8, 0xcb7a4b61, 0x52eb7a45, 0xd27752bc, 0x86bc8df9, 0xda76dabd, +- 0xef4bdc57, 0xf5be05df, 0xd6b3bf79, 0xdb19bde7, 0xdab67ee3, 0xc5f77e49, +- 0x373c6526, 0x97892fb5, 0xc5d23ce8, 0xc7ad6f9d, 0xbdd2be7c, 0x3ee2070b, +- 0xc9c37160, 0x003fc5b0, 0x7607cbff, 0x2f5ca2a7, 0xf9c5966d, 0x695e3e23, +- 0x891e72b3, 0x7e24bfcf, 0xca084e6f, 0x218906ed, 0x6ab12e7a, 0x6e2a8fca, +- 0x39412faa, 0x573c9c5a, 0x9721f143, 0x3c01e22c, 0xccc4b0df, 0xbae67db8, +- 0x35e7841a, 0x3a3ae0ff, 0xba85f31d, 0xc20ade5b, 0xf9e376ef, 0xdefc2f13, +- 0xdcedc493, 0xdfb8927b, 0x2df1a974, 0xd1b93f3a, 0xbb8716f5, 0x3feb4dda, +- 0x50ddea22, 0x649bbc12, 0x35e17f5a, 0x8ca0f099, 0x4c9260f7, 0x4a6e4de3, +- 0x4ebae130, 0xf2f7f8b9, 0x79fc2c93, 0x9c7cc2fc, 0x3988f1ff, 0x95d93299, +- 0x3ddf2e3c, 0xca3d6a7c, 0xe80fcc51, 0x047b0fcf, 0xb5f985c7, 0x77c63c8a, +- 0x0eb5f7e3, 0xcf1fb806, 0x748a381d, 0x274fe280, 0x473dfb71, 0x3d478f6b, +- 0xa168ca71, 0xdc9af838, 0xf7e21338, 0x3cf89608, 0x57da25f7, 0xdfe46a28, +- 0x0b6e653b, 0xd53bba42, 0x3b464638, 0x40af1946, 0xbe8fb77c, 0x20e6f0fb, +- 0x6b38153c, 0x078e388d, 0x7e79fc7f, 0x71e69992, 0x167279dc, 0x92a74bda, +- 0x68cec903, 0xfcfdf2d5, 0xef6e06e2, 0xaa896a9e, 0x5bf6bd95, 0xba3e05f2, +- 0xd7845593, 0x688d26ae, 0xf99eb737, 0x7c70d3b4, 0xc7cef9d5, 0x1278ecec, +- 0x1792eced, 0x54933a64, 0xc308a9a2, 0xe6df9ff5, 0x0102bf3b, 0x3b8d12e7, +- 0x5e8bcc2c, 0xf8fb9a4b, 0xde7448c6, 0x8589f0ac, 0xf1e0a9f0, 0xc73f3254, +- 0x9f822a72, 0x5bd92a83, 0xd1ed744f, 0x19ae3cf7, 0xbf3c5ff5, 0xae7e66f6, +- 0xf9780f62, 0x3cfd0c49, 0xa65c6e4d, 0xf7a3d62a, 0xbf6d137b, 0xfe841a4b, +- 0x85f91e53, 0x8a26ec40, 0x3c7da08b, 0xa7efe500, 0x7b77e0cf, 0xd879f91b, +- 0x11737d52, 0x5af5fbee, 0xbe604181, 0x4e34dbbd, 0xd118cfe1, 0xec2a5d4e, +- 0x7b16f3d4, 0xa3fb8c96, 0xaeb455ab, 0x89d90692, 0x425d98f9, 0x1bde5dde, +- 0x69d20f73, 0x8cd931c9, 0x5744cdfe, 0x65c7afcc, 0xfb26de90, 0xedc5ccae, +- 0x129db2dc, 0x7d8ab5d9, 0x8bec2a51, 0x3d8ec273, 0xdb87bab7, 0xf62487b7, +- 0xcec78c54, 0x45761528, 0x3d79bca9, 0x9ffb2be6, 0x396c2daf, 0xfd89e74c, +- 0xef16d5cf, 0xba97adf4, 0xbf8aeb7c, 0x9f524ef7, 0xfe82927f, 0x94a7d809, +- 0xc0a9f12f, 0xacafe2a7, 0x2386b348, 0x5b546fbf, 0x037128a6, 0xa1f95784, +- 0x6f38857d, 0x95804967, 0x6f9587fc, 0xbfbb5c10, 0x77497ee6, 0x77f5a304, +- 0xeedf0e33, 0xe5df4e26, 0xc7a9c91a, 0x7023a8fe, 0x5ce4bd3c, 0xa3a8768d, +- 0x12e48837, 0xf7c1e1e6, 0xfee1cf96, 0xa3630da7, 0x855a9530, 0x29fd140f, +- 0xa9decdce, 0xbd83976e, 0x2495c3e4, 0x124e776e, 0x4c2b48f9, 0x835fd256, +- 0xc1ebb9c5, 0x0f6f6e7a, 0x53573b56, 0x6631fe3c, 0xf2714359, 0x4e90a303, +- 0xf14eae30, 0x123d55ff, 0xeb1fc3c5, 0x063f9091, 0x7911ad9b, 0xf849f55e, +- 0x0763d53e, 0x48f6330c, 0xc7ba9df8, 0xd73af894, 0x66d433ef, 0x894fce0d, +- 0x87fb293b, 0x7394fcca, 0xf3e7ff08, 0x8cfcc333, 0xbe01f99e, 0xabff6007, +- 0x0fb25619, 0xe72867a2, 0x1e482afd, 0x04bcf028, 0x70093ef4, 0xa41d3185, +- 0x876d929b, 0x40fe7873, 0xcbdf9d1b, 0xc8ebe209, 0x39e3f911, 0x941cbc01, +- 0x2b35f1cc, 0x9e8bc799, 0x3722a510, 0x85b649df, 0x2fb94325, 0x39322f39, +- 0x62ce73d3, 0x9cfc07f9, 0x87bcbf85, 0x574f44e7, 0xee510f81, 0x3242b4fd, +- 0x63d8fbc7, 0xf9cabf9c, 0x2a3e3ea3, 0xe225e0fe, 0xb5b0e613, 0x9e618725, +- 0x05efe702, 0x78e60d2b, 0x1728be2f, 0xc5a6207e, 0x7297fee2, 0x5cc0be4e, +- 0xec40e748, 0xe8ccc32b, 0x97cb9597, 0xafff5e28, 0x93795df2, 0xe06ddd6f, +- 0x4936eff4, 0x9edcffe4, 0x13cf67dc, 0xfe0b463f, 0xb44bb5a8, 0x9dfb5c2f, +- 0xe6dbc79a, 0xbb5f1449, 0x7cf21e1f, 0x60aed17a, 0xdd9be53c, 0x37da550f, +- 0xfb1509ab, 0x9fb4a1d6, 0xf7589f77, 0xe2df22fd, 0x8315c6a8, 0xa5a3a0f1, +- 0x3f8e2b7a, 0x7f68b987, 0xa36b1e7d, 0xd96074f2, 0xee0d377e, 0xfcfe8a18, +- 0xc51d76c7, 0x6ed76aa1, 0x4f5ca137, 0xb8cd6b67, 0xd8a006cf, 0x5b98fdf9, +- 0xf2538fdf, 0x0e2ec189, 0xfc04fa47, 0x7ffc46cf, 0x1889b805, 0xe2ff7d7d, +- 0x3e53f68f, 0xfbc3e752, 0xd0c03d66, 0xff21eaaf, 0xb562a8a8, 0x1c4df686, +- 0xcb392dac, 0xef055783, 0xf0fade0a, 0x1f16616a, 0x869ac2bc, 0x4be49c20, +- 0xfd2e4833, 0x77a8664e, 0x0557866f, 0xf8113fee, 0xe5ccd659, 0x15be3f97, +- 0xe7803c3c, 0xdf48e2a3, 0x313c236e, 0x7f4bc91d, 0xbe19b87a, 0xe1e73080, +- 0x3aa189ab, 0x54a32ff2, 0x2d469e5c, 0x38be2895, 0xb50fd997, 0xf02b3943, +- 0xbbd10d53, 0x813cdbc0, 0xf3998fb7, 0xff98e4ee, 0x93bdbc3d, 0x3c9d579c, +- 0xf5be7ae8, 0xf11bd3e7, 0xfac58965, 0x3a5f4547, 0x1fa3f219, 0x6bf1fb3f, +- 0xf0ad1e1f, 0xda3c2f3f, 0x5f110657, 0x6e5be1f6, 0x88bd35b8, 0xaa1c607f, +- 0x716bdf89, 0x60957e53, 0x57cf8021, 0xa6f57d93, 0x2e053782, 0x9deb8a37, +- 0xc23b72d6, 0xfb4c88f1, 0xee499f98, 0x639466a3, 0xfce8a729, 0xb3fed29b, +- 0x1f436dd5, 0x1b3e7182, 0x5ad3cbcf, 0xd4a91f9e, 0x3e3c016d, 0xcea459f8, +- 0x4cfdeb81, 0xfa80994a, 0xbfe933e2, 0xb87af3a6, 0x39f582d6, 0x50cc13e1, +- 0xe251ad3f, 0x7c446b89, 0x67e549c0, 0x449b6e73, 0x36f624ed, 0x3f9f8ef3, +- 0x7cfc512a, 0x9c728801, 0x6784cc5f, 0xfeaf3173, 0x46e3cfcc, 0x72df3ed1, +- 0x1f50f1df, 0x921c50c7, 0x5e778bfb, 0xf42cd1eb, 0x7a7d3bd2, 0xfe15d270, +- 0xce933f3c, 0xd808161b, 0xb85242da, 0xe7e4ec7f, 0xd33d1536, 0xd19f6c7b, +- 0x417a4e3b, 0xeafb95c4, 0x7b444f29, 0x3bc3a9eb, 0xe388957e, 0xe91d6814, +- 0xabfb7e78, 0xd1a3e7da, 0xf1d8289e, 0xb7d92278, 0xa226363b, 0xfdb0529f, +- 0xaa368957, 0x4fc9da07, 0x7775f352, 0xa5fdb9ee, 0xe77a5e4d, 0x6fdce1d1, +- 0x9c3fa799, 0x94ee768d, 0x61d79711, 0xe7e13e3c, 0xf387dd12, 0x0eb6d653, +- 0x64fcdff5, 0x46acef4e, 0xe199724f, 0x73c02df9, 0x75ddca7d, 0x93c7a7c8, +- 0x43e4d0bf, 0x9a8a5d3b, 0x399f33e0, 0x7ee38737, 0x5cc906f6, 0x0fdbbccf, +- 0x85cafda5, 0x446d256b, 0xe0b7ea28, 0xea3fe851, 0x1e698252, 0x6a8c368b, +- 0x57f3e7c5, 0x7453e7f1, 0x3853c6ce, 0xca5ab3ce, 0x10f90237, 0xafc79deb, +- 0xf1e7e14b, 0xc8966c17, 0x93be57ae, 0xad584cf0, 0x29753af7, 0xd4672f42, +- 0xce51dc91, 0x755b4e09, 0x1808edf2, 0xbb6a9ff7, 0x39c60529, 0x78b9f4f1, +- 0x149f3c37, 0xfd152172, 0xfdad049b, 0xeeb885b7, 0x83ca3aed, 0x928f48cb, +- 0xe8fda1c3, 0x853fc787, 0x0b5582e5, 0xf2885b7f, 0x147eab71, 0xf3e6174f, +- 0x55592e5b, 0xaadf3f28, 0xc211607d, 0xf5a7abed, 0xaf2f9764, 0xfd670a4d, +- 0xbe528ff0, 0x8dc7f80c, 0x7a955d82, 0x9a57772a, 0x9eda3ce9, 0xffaa08ca, +- 0x2542d2be, 0x6be9cd9b, 0x8dcb99b9, 0xe6378d1b, 0x80b3205a, 0xc1b19abd, +- 0x70632cc0, 0x9c96ce5f, 0x18487002, 0xa37dba5e, 0xa56e1758, 0x4cc4728c, +- 0x6c643844, 0x4d15a87c, 0xee14d0da, 0x6a77bd67, 0xedf23443, 0x2f1d55b2, +- 0x537ae216, 0x7f6146f2, 0x142bb6fd, 0xf9ab7837, 0xef08f9f1, 0xbe3aed82, +- 0xafeeb13e, 0xff0c4e9e, 0x78ef8c2d, 0x7c7e4357, 0x178eb6f9, 0x78b94237, +- 0x6f5a43f3, 0xf5d5bf7a, 0xfbe14c8e, 0xabe3379d, 0x5fe1c11b, 0x455fabe7, +- 0x7f6cff13, 0xf9e1ee9c, 0x7caaf977, 0xdf826ad5, 0xd9bc94ba, 0x695f5f48, +- 0x4fc8d11c, 0x98fca55f, 0x4871dce8, 0xf22bf822, 0x4b3fe955, 0xe558bfc0, +- 0xc62e3cda, 0x61bf5f23, 0xc3df0419, 0xd113e7cd, 0x69a6fdae, 0xfbae0fce, +- 0xb7bf2540, 0xebe009a5, 0x52882f7d, 0x71ed6966, 0x965f5856, 0xffe0c738, +- 0x12a291de, 0x6fdf2cf6, 0x57927fc7, 0x17e8077e, 0x4f9800c7, 0x0ee48b49, +- 0xe9ae3f40, 0x20ea0bae, 0xfb1233d4, 0xc91e27dc, 0x7a5ee7d8, 0xbdf346f6, +- 0xe3865959, 0xeee47824, 0x7ca89f6d, 0xbdb963ee, 0x7ee7c03d, 0x03ff3e93, +- 0x3f69699e, 0x3956b227, 0x4c7980bf, 0x7429cd5d, 0x9682e25e, 0x00ebb1e3, +- 0x3e3c39d8, 0x7baf64c3, 0x77342e22, 0xf59ca3a6, 0xebd96f5f, 0x251f449d, +- 0x215f8f4d, 0xf269b63f, 0xcdfa7505, 0x47787fd7, 0x71dbdd27, 0x859ed341, +- 0xb69754fe, 0x50f11d3d, 0xe79706f6, 0x941c2aff, 0x601b85e7, 0x65e7c021, +- 0x24e89e92, 0x7144be5b, 0x3c63ae81, 0xfcd6502e, 0xded3c912, 0x29971e16, +- 0x84e5b557, 0xa2a31c63, 0x59e515a3, 0x93f7046f, 0x09bdc4ca, 0x1e84e2e3, +- 0xe344f754, 0xd8b70e79, 0x3bfc5627, 0xf90187bc, 0x2ae55cb5, 0xf4a5fca1, +- 0x2dfb8640, 0xe19f9117, 0x3195fcf9, 0xbfce91eb, 0x8d1a0e72, 0xf4bdf1f2, +- 0x1c5197bf, 0x66810fef, 0xd911ec99, 0x6fbc2f27, 0x27994e1d, 0xaec530c8, +- 0x8bc9f409, 0xee5ad72e, 0x38f67b21, 0x1f2b7fdf, 0xbd89f9ce, 0x74a9f9ce, +- 0x846d61ed, 0x820d78d7, 0x6efb149f, 0x4efe1fca, 0xd138797c, 0x92f91c76, +- 0x78e215ce, 0x929c0311, 0x7965da24, 0x2d8d1bf6, 0x95cfafc2, 0x93797de9, +- 0x8e5f70cc, 0x2f289845, 0x53559720, 0xe614e57e, 0x339b471a, 0xf127f6ea, +- 0x7fa99b5e, 0xfe60c790, 0xb441f816, 0x60139d7f, 0xa6fcc78f, 0xc0492ad3, +- 0xc33195d5, 0x87e99f4b, 0x4e353d73, 0xf58f4896, 0x9d920644, 0xe9767932, +- 0x69fb6f3c, 0x83b78ab4, 0x626ec871, 0xae7e1ece, 0xee93ddc6, 0xacc8ef7d, +- 0x9056043f, 0x8cae645e, 0x89df5e59, 0xe6f5ce1c, 0x06ffdc55, 0xfb17293a, +- 0x77f2d9ac, 0xbd3da0cf, 0x5fdf10fc, 0xf98aad3c, 0xe8b3f318, 0xe784b6dc, +- 0x7939f9a3, 0xbc366766, 0x6d2baf67, 0x2a079d10, 0xcc3123df, 0xd66b2b73, +- 0x5138c76d, 0x0c3da699, 0xd36379e9, 0xe7a45a47, 0x4d77dc72, 0x79abe7e3, +- 0x724f5cdc, 0x48ccdcbc, 0x2536957f, 0xbbf18c7d, 0x8b5c63d2, 0x924faa96, +- 0x1b728e7f, 0xb8dc57bf, 0x12f1fc97, 0xbc7f26e6, 0x6e97c1a4, 0x8ffa237a, +- 0xb70e47df, 0x3233dcf8, 0x8fe72b79, 0x325ee259, 0x93b0e226, 0xbd6bc223, +- 0x0a4531cf, 0xcee4d83c, 0x74c76875, 0xbc564ac7, 0xc03ba697, 0x23ed16b1, +- 0x6bb72247, 0x9ddcdfba, 0x8be494b1, 0x34dee333, 0xdb8757bc, 0x6c3793b1, +- 0xf35ecb51, 0xe3ee2c99, 0x05600eeb, 0xf6ef0807, 0x908f8821, 0xe1a8bca4, +- 0x9e3ee883, 0x7c607713, 0xf27b9c48, 0x446fc75f, 0x38b8e85c, 0x7bcca9bf, +- 0x9714546a, 0x7449cc67, 0x19ce2ad4, 0x4a367929, 0x1eb10aff, 0x3d077ec5, +- 0xfb43fe1d, 0x934fb825, 0xf269f62f, 0xbe4d3ec5, 0x17c9a7d8, 0x62f934fb, +- 0xec5f269f, 0x7d8be4d3, 0x4fb17c9a, 0x69f62f93, 0x0d3ec5f2, 0x54e2c3e5, +- 0x11cdff31, 0xd1ea34fb, 0xc1b5e456, 0x10e9fa9e, 0xdf60fabf, 0x2443a7f6, +- 0x8960fadf, 0x257c4fda, 0x118769f6, 0x2166a3e3, 0x547c789f, 0x2a79df39, +- 0xe1193ed0, 0xfce79cac, 0x03a9f72a, 0x42934fc8, 0xd9bf90e6, 0xca26fe0b, +- 0xf6e1caa3, 0xec776c3c, 0x2df8c4d8, 0x140d2724, 0xe0fd3ce7, 0x98739f08, +- 0xacc793e3, 0xc6307bc5, 0x7e71251b, 0x9e647abc, 0x38c1ffe2, 0x66165b13, +- 0x307cb9a8, 0x2d9cbda3, 0x77e3e497, 0xc61a4796, 0x24d61ca0, 0xf70ee7db, +- 0x8339db92, 0x5da3c597, 0x7cb1aad4, 0xc75af18c, 0xbf3a1a07, 0x94f5c4ab, +- 0x8d25ef76, 0x937ec42f, 0x8ed6e393, 0xfcf5f1c6, 0x969b38be, 0x6cfce035, +- 0xee8940aa, 0x3516616e, 0xe1c283ca, 0x58266e9c, 0xd6ec7db8, 0x1821d45a, +- 0x1f18098f, 0xad13798a, 0x04c7cf02, 0x3c0b8f9e, 0xa4d77ee3, 0x85dfbe04, +- 0x6177ee25, 0xd58de4a9, 0x1f2de4a5, 0x27b4f24e, 0xc4ace11a, 0xe728a6fd, +- 0xee8b98fc, 0xd0517c33, 0xbe70d26d, 0x7261f2cf, 0x09c3a3de, 0xb73a2e3f, +- 0x69e22c59, 0x437f629d, 0xcfd2a759, 0xfbf19fd3, 0x0732465c, 0x83b367ee, +- 0x08764f22, 0x9f5023d8, 0xe49c3079, 0x7a1e7290, 0x07ee18e6, 0xfce27db0, +- 0x13258462, 0xc44aa3f9, 0xfc9cbb53, 0x48696d1c, 0x239e225b, 0xa57c12e8, +- 0xd17395d4, 0x6ea1a3a5, 0x284b9cf4, 0x8896d99d, 0x24ba12e7, 0x0dce8a83, +- 0x4fefe76f, 0x8d2bbe09, 0xf729e315, 0xd15de84e, 0x43ee8788, 0xbcf1a307, +- 0x7ba326dd, 0x6efb9729, 0x2811de7e, 0x3a96f316, 0xcc19d725, 0xf7747dcf, +- 0x1e63f71b, 0xf5c6a77d, 0xdb1fd622, 0xcc7ee87d, 0xf694edcf, 0xbf7b319e, +- 0xc68ae41f, 0x7747ddfc, 0x83f7f0b7, 0x6c18bef6, 0x5e6baaf5, 0xb5ef833b, +- 0x8fdd0e6b, 0x7553bcf9, 0x489563ce, 0x74e7bf2f, 0xffb3d865, 0xb8adc21c, +- 0x13eddb99, 0xf4bfecf6, 0xfde5ea1a, 0x3fefda26, 0xe0863c38, 0xf2fcd55d, +- 0xaeb3a466, 0xbfde3cbd, 0x17a3e1a9, 0x74ed417f, 0x54dc0d74, 0xc1832b9d, +- 0x9eecd677, 0x1a9af34b, 0xeb1afae8, 0x46388d4f, 0x903a98f3, 0x11d6f3f3, +- 0xe78fddef, 0xeff6ba01, 0x6ef90479, 0x683000ea, 0xf9bb3e71, 0x7da2a0f9, +- 0xbfd09329, 0xcdb532ef, 0x5ecbf1c7, 0xf339d1d1, 0x74e17da2, 0xc3dbc72f, +- 0x9939f963, 0xa8d1d5e1, 0xefaf5567, 0x508bf1da, 0xfda0676c, 0x6e10f29e, +- 0xb5c915e7, 0xfe110f59, 0x3cf1da5e, 0x81977bce, 0x310b5ff6, 0xc2f502a6, +- 0xa714091d, 0x5f1fe37f, 0x643c47cc, 0x7ce8dbcb, 0x0675d7cf, 0x94e1c215, +- 0xcf0036d6, 0x694e38d3, 0x142cdfc8, 0xfcd3c2f5, 0x60517dbc, 0x2fe10e7b, +- 0xf51a3ab4, 0x47c0d16c, 0xa7bce3a7, 0xa22fd5ca, 0xe65ec3bf, 0xd85dc6f7, +- 0x7e837005, 0x9435ea17, 0xcbb5daad, 0x3be2e744, 0x78f9eaa5, 0x9ea3893f, +- 0x5434ebb7, 0xf51d3c13, 0xb4defc49, 0x48e8305d, 0xe7c5b76c, 0x97fa85f9, +- 0xbd1fd1d3, 0xf254caf8, 0x55fa154b, 0xcea8a5f8, 0x3f1d7cff, 0xfe245ab7, +- 0x33076666, 0x2e93c57a, 0xebae781e, 0xffd3ccb7, 0xce868362, 0xd8ea1779, +- 0x560fcc5a, 0xea28a1f8, 0x5f5c5cae, 0x1136aa91, 0x31c296ed, 0x2f91f3ed, +- 0x3e98182e, 0x27bdda02, 0xe35155f4, 0xff6819ea, 0xa63e68de, 0xbf8f9c11, +- 0xeb7ae089, 0xd383269b, 0xbfd1bf7b, 0x9992b4fc, 0xd4f04fdf, 0x7be15a7f, +- 0xad3df0de, 0xb4fd04ab, 0x3f2e10b2, 0xbc7b40ce, 0x7c502e93, 0xbf4ac167, +- 0x78239273, 0xb699645e, 0x9ef5113d, 0x863ffe32, 0xa85db99b, 0xb7fba76e, +- 0x454dfbfc, 0xc8e50473, 0xb79e7e6e, 0xa0ea51a8, 0x52082273, 0x8b667baf, +- 0xe6270ef4, 0x8787f509, 0x07812c88, 0x11b9eb18, 0xa28f3431, 0x079d0306, +- 0x0f680e2f, 0xc4a93b42, 0xf6841ed4, 0x32ebd74f, 0xe889c3dd, 0x8fc6550b, +- 0x894f7cf5, 0x34ba1613, 0xdf7f4336, 0x1c60e583, 0x0dfe1972, 0x047578a0, +- 0x682a27df, 0xcfe7e40a, 0x1e74edcd, 0x263cffdb, 0xc5ecd3ae, 0x2f4d5d8f, +- 0xe9fb7985, 0x797047a3, 0x10752dd0, 0xe3ff74df, 0x83a468f3, 0x8b5b1522, +- 0x251795fb, 0xea022e7e, 0xa2e21e74, 0xfa2cf7d8, 0xf48018d6, 0x129bf173, +- 0xa92ee3e2, 0xfb5ce49d, 0x7c933fee, 0x93b4d2e8, 0xc468fb9c, 0xe8fc937f, +- 0x8f9f6e0a, 0x447dab72, 0xd91f7f0f, 0x23cf1f3e, 0x7c7589bd, 0x81fff78f, +- 0xfddaeffe, 0xefa8fded, 0x8f3ccaa7, 0x31a4bd82, 0x8710f8f3, 0x270132f7, +- 0xae9c36c6, 0x6343ff24, 0x2dd0fd41, 0x166f03e8, 0x98fe5e64, 0xcc5d4fc2, +- 0xf911a7b2, 0xc7df80b3, 0xc3557603, 0xcdff686b, 0x84fba309, 0xeca6e1fc, +- 0xfc868633, 0x69e2296d, 0xc0fec986, 0x69538008, 0x17f93b6a, 0x87a4ed40, +- 0x91d4deca, 0xe9add99f, 0x2bf281d9, 0x8b9f64c5, 0x6db44aed, 0xbc2433eb, +- 0x15bda0a7, 0xca29fa4d, 0x3997c7f9, 0xbea575bd, 0x884dcfc4, 0x8162ca7d, +- 0xb25bbc07, 0xe243e916, 0x69ab7e78, 0x6f28fbdf, 0x48e2daba, 0xd3f3fb4e, +- 0xe8a7a685, 0x404f8a9e, 0xe2bc3baf, 0x7c2c9f00, 0x6601f299, 0xf1881e63, +- 0xbdbe73fa, 0xfe4bdddf, 0xf5ecdb20, 0xc6b1e91c, 0x170feeb7, 0x0fb74ba4, +- 0xde68381f, 0x00df903b, 0xda13c5fe, 0xbe877ee8, 0xcba84cfa, 0x7e23f55e, +- 0x78f6bf75, 0x0fda005f, 0x505d843b, 0x9a7dd432, 0x3c3df7fc, 0xf40ab76f, +- 0x07f7d51a, 0x6aa57e52, 0x50ade80f, 0x5f50b7ae, 0x51b50714, 0xbf6baadc, +- 0xd779f68e, 0xc68f9f34, 0x523d03f5, 0xf9b8a67c, 0x7ccbdd20, 0x4c87fd10, +- 0x94618fd2, 0x39bfb317, 0xe510fd0c, 0x95ca8979, 0xd3f5f228, 0xcf287e51, +- 0x2277654b, 0xda95f39d, 0x8388fee8, 0x2a25de62, 0x1758cba8, 0xdf3896f3, +- 0x2f7e66b3, 0x5ede3f96, 0x76edc119, 0x9f740f90, 0x79d79ae7, 0x079140dc, +- 0x1cae4285, 0x9ca9e7c1, 0x3ecacdff, 0x442d7411, 0x4e47efbe, 0x0b308f24, +- 0xe282b87f, 0x58463b3a, 0xa7f45d78, 0x89dc7971, 0xd1bd97de, 0x8a9b1e99, +- 0x3dca2cfd, 0x14791e5f, 0x282f91e7, 0x0e482207, 0xc184d1ac, 0x945e8aba, +- 0xc2a2fee8, 0xa073ab79, 0x7ea65b39, 0x2d49ee88, 0xe35bbcc0, 0xa7f2f3f5, +- 0x57b8f1a3, 0xec52f288, 0xe0ed1503, 0x351740fb, 0xe40d1f7c, 0x2ff5e50d, +- 0x073ab49b, 0x68496ff9, 0x4fdbd6a9, 0xd7f8d9be, 0x58af5b9d, 0x0fde139d, +- 0xdcad179f, 0x5d883ad2, 0xbda15e3f, 0x72cc2736, 0xde6573fd, 0x3cca0d17, +- 0x79066827, 0xeaf663c3, 0x734fbc1c, 0x85dffe99, 0xc5f75f07, 0xf51b9d66, +- 0xf697c02e, 0x56bcee83, 0xbd5f13e1, 0xcc8578d9, 0x371ffb49, 0x597fbf9a, +- 0x534fb922, 0x57f02d5e, 0xf9d9f13d, 0xa0fdef68, 0xf6be4229, 0x160a25c5, +- 0x407ba30e, 0x79870bec, 0x4bfc25c7, 0x55839410, 0xa0e23394, 0xbe70f812, +- 0x28781fb5, 0x0467ffed, 0x329a4fcf, 0xe0d5f382, 0xbdcfc5a9, 0xa39e28c6, +- 0xe3741d4e, 0x54a621f3, 0x7cb74fce, 0x2062643e, 0x60c8776f, 0xf74fb8c6, +- 0x5c51bfa1, 0x719d7bb8, 0x306fdf36, 0xdf7848b2, 0xddb6911a, 0x8afbfe3b, +- 0xe7814738, 0x7efce9be, 0xe387e6b2, 0xbea6a94a, 0x1bd912b8, 0xcfb481a9, +- 0x9574d5d2, 0x4b775bf4, 0x43f719a6, 0x469cdaba, 0x7ff2b7e4, 0xea184ffc, +- 0xb396aee1, 0xf5d69794, 0x57ca79dd, 0x06f228db, 0x7c89348f, 0x098b36af, +- 0x7ee7779f, 0x36ed8391, 0x5713d289, 0xa53171e0, 0x2565fc54, 0xff75e07e, +- 0x6b8428d1, 0x93e379bd, 0xa60f3019, 0x1ddfa6af, 0x0439ff00, 0xae2787f5, +- 0xa1ff0960, 0x2b8c4a3c, 0xb8f027c4, 0x57189602, 0xb8f0d788, 0xae31d602, +- 0x15c62580, 0x15c639f0, 0x05718eb0, 0x015c63ac, 0xc05718eb, 0xf80ae312, +- 0x8e716bfc, 0x378c1ba3, 0x9234f71e, 0xcf515ffc, 0x88576bf7, 0xd457a1fb, +- 0x85b7944a, 0x0f5038e7, 0xd3c7975e, 0x5c78f228, 0xb03f685b, 0x456cbf7c, +- 0x0f79e154, 0x79f30e87, 0x3c628e7a, 0x64af7ca8, 0xe7c16d5d, 0x1b1e69b3, +- 0x9e3f325b, 0x35ebcf87, 0xac97bc56, 0x309be5bb, 0xb515778c, 0x6adc53d4, +- 0x2d21f852, 0x6241b9e1, 0xa59d6f18, 0xa9727ee3, 0xd3474f0c, 0xd1d929be, +- 0xf236baa5, 0x4a778a5f, 0xddf3ef66, 0x90af63e5, 0x9bcbe89c, 0xf9cc1972, +- 0xc6d5fa3e, 0x4ff0aef3, 0x57d88fc4, 0xf49bca5e, 0x3d9159e5, 0x2d1f65e2, +- 0x7c64fdc5, 0xe7477f2e, 0xd1c14a4b, 0x93f5281d, 0xcfb7e587, 0x77b2d45c, +- 0xe29bde3d, 0x77dcdfbf, 0x9f6fcf5e, 0xd8aa6579, 0xcfc51e4f, 0x9d3ee489, +- 0x7c3f67bf, 0x475ab7af, 0x70e54af6, 0x266a657b, 0x28d86be6, 0x90f472ee, +- 0x2fadfc81, 0xc4f924b7, 0x21e5b25d, 0xae58f714, 0x6b8f4891, 0xb0ebed92, +- 0xc5dcc4df, 0x18996f14, 0x567e2261, 0xa4bdf0e8, 0xfdf1c7bc, 0xc50b34f2, +- 0xec75b2bb, 0xc89e3467, 0xf89282ef, 0xa24abb2d, 0x3217a97b, 0x597b9d2b, +- 0xf2f7e360, 0x2de8f729, 0x41cf3c60, 0x5be5aba1, 0x282bb224, 0xfb861100, +- 0x0b9e1c9d, 0x7ba1de5a, 0xc4eb164f, 0xbe2a7e3d, 0x89b51e1f, 0xc12cbfe7, +- 0xdef0a41b, 0x58abd010, 0xb37d9e82, 0x03db9e1d, 0x3b734487, 0xe38e12df, +- 0xa1ae3c2f, 0xf0ece13c, 0xa4ed13bb, 0x3e5127ef, 0xf6ef5e03, 0x921f88fd, +- 0x0cf9bea3, 0x43793547, 0x48addd70, 0xb1e714a7, 0xb2bc7953, 0x9e254a80, +- 0x762fe4a3, 0x17b83a1f, 0xce5d9fbf, 0xe1bde5ef, 0xfe80bd79, 0xe729adcf, +- 0xf9145e15, 0x53aa5175, 0x75fcf063, 0x2b46b7d4, 0xfc3b3fae, 0x8af79d10, +- 0x4e1fe313, 0xe5037bcc, 0x39882d8a, 0xcbee1fb0, 0x733c0354, 0xc6120170, +- 0x3c365dcd, 0x4873d337, 0xf51e5332, 0xcb73f275, 0x29efcc3a, 0xdee8978f, +- 0xea809cf0, 0x3f1830ec, 0x8ac63627, 0x89bcbbf2, 0xa0bb5dc7, 0xc3bf78e4, +- 0x3181f749, 0x14d73f7e, 0x2490b781, 0x4cd489fb, 0x82a9f3cf, 0xae5bba6f, +- 0x9be1fcf2, 0xe8eb65c7, 0xb06613be, 0x21b1f72a, 0x188ea7de, 0x8559f14a, +- 0xc21b7a6e, 0x7cdd23b7, 0xbcc3f42e, 0x68352779, 0x6c987c3f, 0x30e10cff, +- 0xbacaff3f, 0xff675a30, 0xcf2531f1, 0xa63e3fde, 0xabffedc8, 0x2bf7fafc, +- 0x513ca82b, 0xb6ca92b9, 0x07bd074a, 0xea75f0bd, 0xff55c5ad, 0x8ff5f08e, +- 0x65bd32ab, 0xe057e900, 0xf6c71e6f, 0x5f02a38b, 0x7af8bcab, 0xa2f04b62, +- 0xd47f680d, 0x4ffee968, 0x615e77cc, 0x49a03924, 0xaa9e37eb, 0xf148cdc0, +- 0x18665ed7, 0x909ff08d, 0xc156a71c, 0x926901fb, 0xf200fecf, 0xf90fae09, +- 0x13e44b04, 0xf3dc57b5, 0x70b02d05, 0x1c07b706, 0x08180f64, 0x8357ebaf, +- 0x1ef090fc, 0xfc8fb325, 0x3f27e4b8, 0x907971c0, 0xf0b57dce, 0xef2526fc, +- 0xd7140273, 0x4f23f746, 0x0c9e5c5c, 0xc2ed700d, 0x0b2d0cef, 0xa3e2bca0, +- 0x475f4e1a, 0xb9bcf237, 0xefc7967c, 0xae5eba6f, 0x163e2104, 0xf339ec0f, +- 0xfc5fb43c, 0x35d9232b, 0x669723eb, 0x257227fd, 0xc3c38d20, 0x63258131, +- 0xcacdf27e, 0xe045ee7e, 0x314e66f7, 0x2e5b9f91, 0x7cb2a0ec, 0x72a7f133, +- 0xed4cb43e, 0xed8f58ea, 0xff3c4d42, 0xbee8cd43, 0xc1aa5396, 0xc1599efc, +- 0xc4a6a767, 0x58605e51, 0xa887bf15, 0xee896ee7, 0xc8149e03, 0x56c857ef, +- 0x0cbc95e5, 0xb956dfef, 0x54c1efc5, 0x122bf8d3, 0x73d15c79, 0x6bdb951e, +- 0xba26b951, 0xbaf6413f, 0xc631a93f, 0x39f45eeb, 0x6ecfbefc, 0x4dff72a7, +- 0xa087bcde, 0x7e1ccd5f, 0xb33766cf, 0x03fb813c, 0x7100828e, 0xb5e8127f, +- 0x99fdcf0c, 0xedc9fe07, 0x15429ebc, 0x19ad539d, 0xeb8d5965, 0x42cc79aa, +- 0x27f73def, 0xe8dcf871, 0x82db9c3e, 0x8369f9ec, 0xe717bfae, 0xce6f2919, +- 0x669fec12, 0xe34ff7e4, 0xeed08de5, 0x4fe19ce8, 0x0e3840ec, 0x3da264b1, +- 0x706c68be, 0x11f40496, 0x06f306a5, 0xd4630fe8, 0x46d05f74, 0x71f313b5, +- 0x7dc5a887, 0xef216a01, 0xd180c861, 0x85a6ded4, 0x96a7c2fa, 0xabea1b31, +- 0xf3f74628, 0xfef9ebc6, 0x5863f438, 0x4646b862, 0x7c78c83d, 0x3e00e168, +- 0x4670c2fe, 0x45a5cfbf, 0x3bf25016, 0x2677f0b3, 0xb0bbc518, 0xea68d07f, +- 0xfef150ef, 0xc3943536, 0x523df8e2, 0xb474eb3d, 0xf1f0ba2f, 0xa71fa4a1, +- 0x773df04d, 0xe78d327f, 0xb8e5282d, 0x9f0f8b74, 0x429b5a2f, 0xd68b8bfb, +- 0x3b4529ce, 0x4810dec4, 0xef3b02e7, 0xef0ba97b, 0x9d962f71, 0xf5823f4b, +- 0x57b74ecc, 0x4a2f7c23, 0xa1fbf996, 0xdffba2c1, 0x8c9e62d2, 0xf2e335dd, +- 0x774e50eb, 0xf7813dec, 0x4fbf4de4, 0x19d3fea6, 0xad9a8fbf, 0xde6cf7e5, +- 0x8ea2b8ed, 0x1eeff180, 0xbcbc5127, 0x468e60c3, 0xc0a16efb, 0x5c69f3d7, +- 0x3f5c2f7e, 0xebfd1134, 0xbddf71bb, 0x5a733d1f, 0x0fde53b4, 0xfc7cc89b, +- 0xfbc54f9b, 0xfef8d34f, 0xfe38b0fc, 0xae837f3e, 0x4b082e23, 0x4a093b8d, +- 0x4ec2758d, 0x58b4cf5c, 0xe115b396, 0x378f28f8, 0x9b981876, 0x8d3eb1e8, +- 0x3d676ae0, 0x3ae38f1d, 0x3ad046ea, 0xa39bc63a, 0x710e5ee9, 0x3312eb7f, +- 0xe31d4f97, 0x98ce77f9, 0xa9214ddb, 0x1ef07f9c, 0xa502c5d7, 0x3d565767, +- 0x5bb41b79, 0xe74f4abc, 0x7d3c9735, 0x8b2bf92f, 0xa73a646b, 0xdefb36c9, +- 0xc4fa0ae3, 0xbff3f38d, 0xdeffd58f, 0xd239c455, 0x8966fe41, 0x955868e8, +- 0xf1fb8b55, 0x4ec05b3d, 0x46f9f780, 0x05da3c77, 0x758356f9, 0xbdcfd48d, +- 0xdc01dfac, 0x6b9ef0b2, 0xcf93f146, 0xe01fedd3, 0x2f561777, 0x03507ba4, +- 0x1714ed53, 0x217e061b, 0x48413fda, 0x69d7003f, 0x7fba5e00, 0x891edd42, +- 0x34facffe, 0x9cc43cf1, 0x34ba2468, 0x0ee7e430, 0xe711398d, 0xa0ceb1d7, +- 0x6d319942, 0xe04fa70d, 0x347abd1b, 0x0160339e, 0x4bbfbfc8, 0x6f3974e3, +- 0x16af3ab5, 0x6d4043ea, 0x6e90429b, 0x4e7d1146, 0x50ebdab6, 0x18f57daf, +- 0x73728b1b, 0x7c2de6f1, 0x4cff025e, 0x34e746dd, 0x198faabf, 0x0a06798d, +- 0x4eb64c3d, 0x4de69b38, 0x8449f707, 0x31cf587f, 0xeb1a37d4, 0x2f5c4ea2, +- 0xf48c3f3c, 0x9b826d31, 0xe5b212f2, 0xbcfdfa12, 0xf74608de, 0xce32f4f2, +- 0xd41bbdaf, 0x391467a4, 0xa003c8a1, 0xd39e1b07, 0x7ffdf055, 0xf2287f65, +- 0x7243e006, 0x8a1b9145, 0x4be8517c, 0x74fe3391, 0x7cc01f35, 0x4fea68e7, +- 0x63914cf2, 0x68d50eb8, 0xf0517c8f, 0x5e30d9ac, 0x81577145, 0xd2f96ce7, +- 0x8708839e, 0x2dd92302, 0xea31707d, 0x5ad12e09, 0xcff784d6, 0xb7943d56, +- 0xe3d22977, 0xd063732f, 0xe05b98fe, 0xa7f29e7b, 0x28e7be15, 0x3df4ac17, +- 0xe56f3947, 0xfc628e9f, 0x0fb00d89, 0x9cfc074b, 0x17b9e5f9, 0xefea863e, +- 0x8131797e, 0xea97d9fb, 0xaeefc59f, 0x68f3100a, 0xa55af3e7, 0x4c31bd25, +- 0x0ff881d8, 0x7188b2f1, 0x13185d3e, 0xdff5027c, 0x093f105f, 0xf1c1ffb8, +- 0x67e04673, 0xe80fc211, 0xae3ae17e, 0x121c3a97, 0xad1623c5, 0xc1ba7c15, +- 0xe7f47cf7, 0x303dac91, 0xfa8e73ce, 0xa312c7f3, 0x7395af91, 0xfc0df6d3, +- 0xf2b4b55c, 0x762fd918, 0x872d7ee5, 0x2b5afddf, 0xebf9f95b, 0xcd73df76, +- 0x2d361981, 0xf7182bc5, 0x1f2516a3, 0xd536f9e1, 0xbbf71992, 0xfcf3c5f3, +- 0xb9cf920d, 0x1e749cb9, 0xa698da17, 0xa3b63c26, 0xcaf1429d, 0x0a2fd26a, +- 0xa0dc829d, 0xd5f97c73, 0xbd4bb4a3, 0xf122e8e4, 0xcab2717c, 0x36d777e7, +- 0xebfdf1a6, 0x181a6476, 0xac725377, 0x3bc90976, 0x9547c50b, 0x47928bf6, +- 0xc1b8c7af, 0xebf8cda2, 0x33fe9e47, 0x367cf9d3, 0xdc94f98a, 0xe5f7ce40, +- 0xb79fe155, 0x9fc9bcd3, 0xf7757a2e, 0x033bf8ab, 0x91d57f45, 0x291a299e, +- 0x9d53d9f6, 0x3ed2f759, 0x55d73f32, 0x693df026, 0xe84167f7, 0xf2379427, +- 0xeca1b2fb, 0x556cb2c0, 0x65fbf901, 0x9087e056, 0xdfbff3eb, 0x41aff57e, +- 0x88ecbe3c, 0x47ffbf12, 0xd65563bf, 0x1fc505f8, 0x64772ed0, 0x4f9478d0, +- 0x5cbfdfee, 0xfb882efa, 0x9704edb1, 0x84df43ec, 0x5ff63cd1, 0xf979b8a5, +- 0xf66175a1, 0xdd7dd67e, 0xcf110139, 0x2af81728, 0xe0af9b67, 0xaaf95afe, +- 0xc82cf3dc, 0xbf7fbe33, 0xce22e975, 0x8dbb1b70, 0x4cd5d6f2, 0x5ccf7de5, +- 0x07e133af, 0xb7cb25f3, 0xbd9d73f2, 0xdc00cb6a, 0xe716eb97, 0x1ddbfcb4, +- 0xc37ee74f, 0x0c27e065, 0xc8377444, 0xddd3cfb4, 0x6578e3c0, 0xe2b54f0d, +- 0x7032d8f9, 0x959d919c, 0x8d654473, 0xeb7bd332, 0x1a47cc35, 0x1679e378, +- 0xfdd136ef, 0xc92e8534, 0xe9f30f56, 0x90697f05, 0x165e7cd7, 0x73ac5574, +- 0xcaf8e165, 0x72105ffc, 0xd857694c, 0xb79d14f2, 0x645d7685, 0x903efc9f, +- 0x9eb2fdf1, 0xcecf3813, 0x7f68636d, 0xb7b5d0ab, 0x0d8fe28c, 0x72b79481, +- 0x7e7be351, 0xdef89f7b, 0x676e74be, 0x24de6274, 0xa6557ff6, 0x13ce19b8, +- 0xe4a2f1f9, 0x2cd1cf9b, 0x73a735fa, 0x3a7e653b, 0x7da503e7, 0x2823aba1, +- 0x6f9fda1e, 0x6f9513fa, 0x6f7c7b61, 0xbd474b6c, 0x9031be79, 0x6f9ed3ce, +- 0x0de73e7c, 0xd765def8, 0x8bc950f8, 0xf3a74ebf, 0x6de5e5f8, 0x73b05ce2, +- 0xe26738a0, 0x3674f5a2, 0x5fe84944, 0xaffc8a96, 0x417dc6ce, 0xc75fe22a, +- 0x627bf67f, 0xefbbafb3, 0x264c77ac, 0xf76cbf9e, 0x7fecefb9, 0xf132fc6b, +- 0x13caa8dc, 0xb7bfe1df, 0x5ddf94ca, 0x4a76f331, 0x48fe763c, 0x0e7803cb, +- 0x7fc7bd97, 0xfeec0d97, 0x9a3fd167, 0xe481c7ff, 0xadefe27f, 0xf7ebfd60, +- 0xfcd9bef9, 0x44ae4231, 0x4cbe53b4, 0x1fb70c47, 0xcc48364a, 0x062b7006, +- 0x680072fa, 0xb3329c4b, 0x231dfde3, 0x2772fef9, 0x2476bfd0, 0x67ca0bc9, +- 0x1dfe0339, 0x6bc10efd, 0x24b93f7c, 0xe7889dd6, 0x5e453b03, 0x3b884941, +- 0x7b8c2071, 0xc949d049, 0xb7a2774c, 0xddb2537f, 0x9735794d, 0xbe1d3e44, +- 0xc95e78c7, 0x23aede68, 0xe745dcc6, 0x189bf638, 0x83aaabda, 0xd2c3a226, +- 0xbddb0d97, 0x4699d5cf, 0x92fffb72, 0xee1bdf96, 0x53e7c1d8, 0xe34d5418, +- 0x5df4125c, 0xf34d5018, 0x29ce233b, 0xbd796a17, 0xbee8c343, 0xfc5d9efe, +- 0x918ba13e, 0x3bf0076d, 0x50a57717, 0x8c4769de, 0xbd136973, 0x452679e7, +- 0x38dce8af, 0x4cbb0baf, 0xf7282e74, 0x9f695b97, 0x274eb7b1, 0xc2e1dc61, +- 0x1ee74620, 0x220fd42e, 0xb2417d7d, 0xc2f37c50, 0xbc6903bb, 0x7495caa2, +- 0xc408a5be, 0x509dda04, 0x76bda2e6, 0x68b9fea1, 0x6fa85fe4, 0x559dbac0, +- 0xf239ffcf, 0xbbfe4ee9, 0xf95f1710, 0xbef78a7b, 0xeffa528f, 0x54f8289f, +- 0xe48da7de, 0x923698fc, 0x91a8f3f3, 0x3bde7e66, 0x2c4cf5d0, 0x37f38fad, +- 0x02fc99c0, 0xafba27e0, 0x39ab8ce7, 0x8a71824c, 0xa86c9a0e, 0xee343bdf, +- 0x0e09e7c4, 0x7877e281, 0x1785f918, 0xbf240c76, 0x1a68ac1c, 0x348ec2e7, +- 0xf252d3ca, 0xada1a64d, 0x234c7846, 0xdbcb66f8, 0xe5fee9d2, 0xc7ca40ba, +- 0x36fc7a29, 0xc89fe515, 0x7a2eeedc, 0x5134f175, 0x4d7ee1b7, 0xa17fcfd1, +- 0x93e28bc0, 0x89695e4a, 0x8fa5a390, 0xf30031df, 0x651fd970, 0xaabb93ca, +- 0xfe8f79e6, 0x48e5f970, 0xbc0f4721, 0x025b7c40, 0xc3bf8e74, 0xc2f22c54, +- 0x71e15f8b, 0x77f5e296, 0xf1f24b3c, 0xde618684, 0x53d725ef, 0x2f70de41, +- 0x96e5c918, 0xda95bfa7, 0xde7b4317, 0x9a20bdff, 0xe50d0ecf, 0xebe3fb29, +- 0x22bffb96, 0x8bfd5bff, 0xf407605c, 0x957c1fb3, 0x57f23db5, 0x060d0394, +- 0xf29e83ab, 0x8d4ebdfc, 0xdf3f296b, 0xd0f92060, 0xaf7e2c19, 0x11e792b5, +- 0xfa9faf14, 0x3857ca6b, 0x699d2f75, 0x7fece65a, 0xa474aebf, 0x0f8bef86, +- 0x3e400eb4, 0xe07c052c, 0x3a1f8078, 0xa8fece5f, 0xebfefea1, 0xcb923a99, +- 0xdc3e3ef5, 0x3ba1f3c3, 0x74bc7307, 0x7a449abe, 0xd39823a7, 0xfc97cc35, +- 0x5e60ced4, 0xe604a252, 0x3d3998df, 0x91778e74, 0xed29ddff, 0xc343b2a5, +- 0x14ad15fb, 0xe6e22bbf, 0x482523f9, 0xff7871b3, 0xb436e6cf, 0x671e503b, +- 0xadd2a68d, 0x1efeb90b, 0xf263a076, 0x7e0a8eef, 0xe870f252, 0xae280177, +- 0x3ca2d2e9, 0xafbb0bb5, 0xdffae1a4, 0xefe7e08b, 0xae43ca25, 0xfb29291b, +- 0x540794ec, 0x2b3c25cc, 0x9fb44876, 0xa1f6bc5f, 0xe2fba442, 0x91732d8a, +- 0x1475941f, 0xfa2e59ab, 0x4c921d49, 0x7ebf01f3, 0xebd4ccc1, 0xf7c0a7bf, +- 0x197ccaf7, 0x3d27cfdf, 0x6fb6bc03, 0x53b145a4, 0x578c3559, 0x4cda56b2, +- 0xfc5189df, 0x053ebe4e, 0x83efb84e, 0x3c4a8cf9, 0x57eb46e0, 0xf9a379e6, +- 0x75e423bc, 0xd7e58c47, 0x1fdf10e3, 0xae4f24c8, 0x4066377e, 0x6dd80fc8, +- 0xcaa14bf4, 0x0fff3078, 0x38c11751, 0x56790acf, 0x79c3f30c, 0xfdf36e26, +- 0x3ae4807d, 0x06f0fadf, 0xa36a7adf, 0xc5bd3d6f, 0xdb7d6eb7, 0xdf82deb7, +- 0x09c0f4cd, 0x073c61fd, 0x879c53b1, 0xcf187f40, 0x8c3fa133, 0xb187f475, +- 0x9f187f44, 0x758c3fa3, 0x8eb187f4, 0x8925b0fe, 0xa258c3fb, 0x65cf8c3f, +- 0x4953872b, 0x023f8f2d, 0x2fb46c1e, 0x5df9473f, 0xd10bf00a, 0x421c2d1e, +- 0x7cc61d76, 0x7e9577e9, 0xd2296d79, 0xfd930cd1, 0xcc4cc8d2, 0x1f5b6ac7, +- 0xf2fded89, 0x1b464a94, 0x686f188c, 0x3d7e775f, 0x2629219a, 0xaf6c15fb, +- 0xae952fe4, 0x4f7e8b7c, 0xe5b57daf, 0x78e13f8f, 0xf287b8a2, 0x78454f7b, +- 0x714cbe4f, 0xf8a33d2e, 0xdfdf559e, 0xf9fedc3d, 0x679ab746, 0x5801fff4, +- 0x00db8bbb, 0x0000db8b, 0x00088b1f, 0x00000000, 0x7ccdff00, 0xd594740b, +- 0xe6feefbd, 0x49324995, 0x41e42126, 0x21e4cc20, 0x49389311, 0x47114bc8, +- 0xa8d53048, 0x684d43c3, 0x4092138c, 0xa3c30480, 0x7b96c4eb, 0xa4401833, +- 0x51b78d70, 0xa13a3951, 0xe85de94a, 0xb6950a09, 0x1006739c, 0x4e6d8ac5, +- 0xb6abad5b, 0xa9078838, 0x68349687, 0x69edec57, 0xdff7ffef, 0xbef997df, +- 0xbc7b5249, 0xacdd77ab, 0x7bfe7ba5, 0xfe3f6fef, 0xeffffdef, 0xfc42108d, +- 0xfb5bfe85, 0xdaf08c7c, 0x85fdff05, 0x442fdfff, 0x59cf10b9, 0x0e9d3247, +- 0xd77c2e21, 0x4f5c5bbe, 0x1868ac65, 0x06e6a42a, 0x09a449bb, 0xb8df11b1, +- 0x5335a884, 0xef0479a7, 0x28c7f651, 0xa4f34c42, 0x885d3108, 0x49f933d1, +- 0x05fffa82, 0x2c4f377f, 0xa8cac75b, 0xadde0eb3, 0x6ccf3098, 0x548af09b, +- 0x735dfb1a, 0x4f1a05f0, 0xa24d79d4, 0xea4d8842, 0x35ece71a, 0x59105109, +- 0x38c1b5ef, 0xbfeb7421, 0x018a60ee, 0x619a1a2e, 0xb1fd7fe8, 0x497b431c, +- 0xbda1ae68, 0x13d6f96d, 0x962144e6, 0xf4332eed, 0xbc116abb, 0xa7cfabcf, +- 0xea6e0307, 0xf0d1bbe7, 0x3aea109d, 0x936eb29d, 0xc3fce475, 0xd1d37fd4, +- 0xe3004f4c, 0x2f0b35ee, 0x8d03b7ed, 0x2b6442a5, 0x4f181d81, 0x179e2a0c, +- 0x6a56bc68, 0xe8bb53f7, 0x9d38f3b1, 0x2c3b7e2a, 0x2da4e022, 0x9bf3447d, +- 0xd1e77fa9, 0xc256e0f4, 0xc9c61f4b, 0xf0a776a4, 0x6b78d326, 0x87170ee6, +- 0x6f359c68, 0xd042bb7e, 0x83ccbb16, 0x215cced9, 0x03c12b36, 0x9f10b34e, +- 0xab4e1ca4, 0xd98776a6, 0xf443c8bf, 0xfca67cb9, 0xe78455c7, 0x1ecc87cb, +- 0x0d6d93cc, 0x291295a5, 0xab268385, 0x038cec06, 0xcdfb07fd, 0x63a24175, +- 0x9cc3ad16, 0xc18fe112, 0x797169fe, 0x35bec88e, 0x0b6d987e, 0x7d84dccd, +- 0x79eb1cbd, 0x0a3f8041, 0x9dbc62ef, 0x8fe02b31, 0x80945b8e, 0x3ec8faed, +- 0x77e53a37, 0xea3e7eda, 0x7c0632a5, 0xdb3e65e6, 0xbe5fb6ac, 0x8bb144f6, +- 0x7bd9d1f6, 0x2c4cdb2c, 0xe874ceb0, 0x01952640, 0xfb19bfbb, 0xffcc18e9, +- 0x679a7cc5, 0x61663bed, 0x3efffea6, 0x9ab128b0, 0x8bc9f7f6, 0xc13d4f56, +- 0xdb7ff70f, 0xac7da616, 0x1e6d04b5, 0x3bbe3b2a, 0x7952f368, 0xae41c1eb, +- 0x65b0755f, 0xb575f831, 0x7d81dee8, 0xbf12b25f, 0xb1d1f0eb, 0xa4e7d950, +- 0x31eebf75, 0xc4777f31, 0x6bda3f09, 0xa74ff3cd, 0x95077f62, 0xb97b2c12, +- 0x85adb0ef, 0x7ed47bea, 0x7a32f2d1, 0x74ed5976, 0xa43a3fea, 0x92a7de30, +- 0xd743bb8f, 0x1b2c7cb2, 0x7cb97373, 0x88213aec, 0xbe11df25, 0xa5744122, +- 0x3ef01ab5, 0xfcccd67a, 0x1cdc7a39, 0x8749f414, 0x0cba942d, 0x2b17f874, +- 0xf88ba1d3, 0xa4f88aa7, 0x40df7e8b, 0xd9be6fa5, 0xd40fbfc0, 0xbdf81bc4, +- 0x88e4e841, 0xcc47bbc6, 0xebcbc030, 0xeffd0d73, 0x945d7e5d, 0xda46943c, +- 0x0dfff8cd, 0xbb827691, 0x4a5c04b6, 0xc685a022, 0x30b72a7a, 0xf866dd9f, +- 0x8d2c4bbe, 0x3f9f03f4, 0x678c6fff, 0x4b6d8621, 0x26bf688b, 0xafd107a2, +- 0xad5e7fc1, 0x6d3d730f, 0xb39720c4, 0x98bf3d73, 0xf2317c4f, 0x47ec55b6, +- 0xdf089fc5, 0x7f46e815, 0x20e913b9, 0x9d5a1104, 0xb1d68937, 0xa9c908fe, +- 0x618a5f41, 0x06eb17d0, 0x74b6ba1d, 0x2a628bd4, 0xb4059be9, 0xb0c0ae8f, +- 0xf8c1dbad, 0x4a1164b7, 0xa22bf7d6, 0xdbfb8527, 0xbc2452b3, 0xac47f505, +- 0xf875861f, 0x686378c3, 0x816e633f, 0xafb744bc, 0xac0b7da7, 0x3dfeec47, +- 0x2dfad5f4, 0xde631f75, 0xea3cdaf5, 0xae9f1af8, 0xebdf4bde, 0x9e3d1dd6, +- 0x72c5c4a3, 0xe1e0f6bd, 0x7e1067d7, 0x4b92f996, 0x439d4720, 0x852dac4b, +- 0xd34df913, 0x9a0f57fb, 0xf06e3183, 0xb7e629df, 0x8f5683d1, 0xb2f01bf8, +- 0x0f182bde, 0x8ab87cd1, 0xf9a765f6, 0x3c511d57, 0x03f64541, 0xf146d67e, +- 0x9acdc627, 0xbe1a6f04, 0xd517f1c6, 0x683f1abe, 0x298fab9d, 0x09cbe841, +- 0xa7c68978, 0x3f2acf3a, 0x0aeb90fd, 0xc6a2baf2, 0xf2d15515, 0xfe86c9b8, +- 0xe114fba3, 0x1f18be54, 0x2c6cc74b, 0xe573b3df, 0x2a8e47fe, 0xddf4fd9e, +- 0xae16633d, 0x1f1fe71f, 0xf214ade1, 0x921f0137, 0x7e527c9f, 0xe34b1eee, +- 0x7c5efeef, 0x34fc45f5, 0xefdc573b, 0x7af44473, 0x621e9e44, 0x49294b3e, +- 0x5b48bd48, 0xace5dfa0, 0x3b3d541f, 0x4d243e95, 0xfc94facf, 0x71e7e603, +- 0xf894e3bb, 0xa57568dc, 0xeb4f8327, 0xd468f68c, 0xd64a4ae2, 0x642d21f9, +- 0xc0d35d67, 0xc2d333bf, 0x609f8e34, 0x4f4d57e8, 0x76f1d5fb, 0x0ecdcb6c, +- 0x6ff3beeb, 0xea09a6b7, 0x1a75bd9f, 0xceb12d97, 0x9691d834, 0xec1f66ad, +- 0xa48f87e3, 0x5f1155a7, 0x9addb87d, 0x7c434f5a, 0x6cbce0f8, 0x96b80451, +- 0xc58f0bcb, 0x131d0434, 0x625d55f7, 0xfd747c62, 0xaed8f7f7, 0x3674d6fd, +- 0xb77201b1, 0x156268fd, 0xfb6eb38d, 0x649c2acf, 0xfe4c87cf, 0xffda12ba, +- 0xdb20ca27, 0x2c1ce173, 0xfc4515f6, 0x6bdbb589, 0x3bf761d3, 0x59ea7cff, +- 0x56ff7dd8, 0xf8899a6b, 0x273f37e8, 0x3db0a87b, 0x52e23f63, 0x4be3e4ac, +- 0xfb07c42f, 0x292fff88, 0xf54b1bc2, 0x8a27cc6b, 0x7afb069d, 0xffcc1efc, +- 0xb79a76cf, 0x0f06f31c, 0x4f5e6064, 0xebcc1ae0, 0xe49f9adf, 0xddfe2bff, +- 0x7fa57b03, 0xe7b54077, 0xa0328857, 0x3b5ec1db, 0x97abffc3, 0x88473d10, +- 0x0c19bd43, 0xe2ebd4bf, 0x80b7a872, 0x3914d7eb, 0x46fbbd25, 0x3cd2364a, +- 0xa0a28581, 0xa3aded9b, 0xdfeb42c0, 0xe079c4a4, 0x3c526c4f, 0xfdd04ee9, +- 0xced2c9e7, 0x5e8bf4aa, 0xe4234dcf, 0xf3f8e983, 0x68bb31e6, 0x2deff1d3, +- 0x2f00d922, 0xfa1a67b2, 0x86dd3ad7, 0xae335bf6, 0xc57fb435, 0x6f806255, +- 0xf436a82f, 0x8b73c3bf, 0xeaabbe01, 0x4bfe862b, 0xf00c4bbc, 0x4346bab2, +- 0x2d7dbbff, 0x1b7bf686, 0x1bda18d6, 0xf00c1bfd, 0x341e3b57, 0x7bafbff4, +- 0x2bdda1ab, 0xbbd8169c, 0x171f44e3, 0x885ffde1, 0xbd37282e, 0xd3d0ef9d, +- 0x5322fe75, 0x7c24d0f7, 0xf48968fb, 0xea517e6f, 0x98fe05dd, 0x487c9265, +- 0xc3ae17a5, 0xd427b033, 0x0a42259e, 0x38622bfb, 0xdd137c13, 0x7e7dba2f, +- 0x2eabc9fc, 0xf4ada1a2, 0xe90b06c3, 0x2795f98d, 0xbe0972cb, 0x1b6be5f3, +- 0xe61fa42d, 0x2af278df, 0xb6951fe0, 0x32fb7235, 0xc345aec1, 0x04376fcb, +- 0x6ff39d68, 0x81edd9ce, 0xe913f3df, 0x9fc54cf7, 0xbe5b77d8, 0x10ca37dc, +- 0x93ca23f1, 0x5f288fc4, 0xb36c7e23, 0xfc47bf92, 0xaf4cf288, 0xd47feb87, +- 0xd9e5c55b, 0x3f972f5e, 0x72e3adee, 0xe5c7d7b8, 0xb81b7b4f, 0x9faf79fc, +- 0xb7b77bbf, 0x7af7cb83, 0x97feb9bb, 0xfe5c3dbd, 0xf5c037aa, 0x2c2896af, +- 0x0102b4ff, 0x037b05bd, 0x776f5dfe, 0x77a4cc84, 0xe5eb31c5, 0xf24abd71, +- 0xdda578ad, 0xa2a95c54, 0x6ebeca89, 0x5c878e11, 0x17c92d86, 0x39f8be89, +- 0x7a237ed9, 0xea2e22d4, 0xc61fadfc, 0xaf424f7a, 0xc9d33108, 0xffad58fa, +- 0x69ef52a7, 0x15ee5fae, 0x977a7d7a, 0xd023ffdb, 0xb2f71dfb, 0xec3332fc, +- 0x24e9f753, 0x24c77a6a, 0x93e3263a, 0x593e5467, 0xc62c4f60, 0x3d816ef9, +- 0xb27b083b, 0x83ee12c0, 0x4cfbea1e, 0x3d221eb8, 0xc6c12274, 0x11efa97a, +- 0xca13fb0b, 0x9be182a7, 0x7dc30552, 0xa19b0d9f, 0x3d381777, 0x54576c19, +- 0x022ecf38, 0xdd722949, 0x4a1e6758, 0xa7cd53c2, 0xf3b045e1, 0x2e6c3937, +- 0x5f9c09e8, 0xcf314a62, 0x02bcdabb, 0xd7bd52e3, 0xff3fdf46, 0x68990899, +- 0x5fa8b35d, 0x10a5f32c, 0x87d81728, 0x87923ecd, 0x276f5499, 0x9bd51678, +- 0x02d7bb65, 0x6c3a7c3a, 0x76a11d86, 0x03db2491, 0x7cc894a6, 0x2c133ada, +- 0xeca97e34, 0xe72a5897, 0x39c0bc01, 0x3ad0a254, 0x1e1cbafb, 0x02dd21e0, +- 0x5efee7de, 0x543f7f33, 0x3a1e04e2, 0xfb411e1d, 0xe2052c20, 0xaf1fb94a, +- 0xd722c133, 0x5fa9f353, 0x432fd178, 0x71d46278, 0x803db2ec, 0x0d4a6e71, +- 0x8f805a65, 0x20279b6e, 0x9d62f1c7, 0xfb2f17e8, 0xb93acc85, 0xad03fbcd, +- 0xacffec97, 0xf4376194, 0x4c43f12e, 0x2bd4f829, 0x539961f9, 0xa97083f2, +- 0x1a1fcab0, 0x4a752cbf, 0xedcafc92, 0x78d29677, 0xafe718be, 0x7fce49e3, +- 0x97e6e4aa, 0x512cdf10, 0x1fbff5fd, 0xfd2578bf, 0x7bbd5267, 0xf468df22, +- 0xe347f8d1, 0xd23e6883, 0xb7a340f8, 0x7f345df6, 0x3455f345, 0x4bb02d3f, +- 0x0f8e833a, 0x49f91329, 0x906874f9, 0x6769dfd7, 0x4fcd16bb, 0x35307cd1, +- 0x4e7dc93f, 0xfd08a3e4, 0xcf2f8f81, 0xde6ec347, 0xa4fb66c7, 0x8ff1a47c, +- 0x1f1a4fc6, 0x16223fdd, 0xcb535127, 0x9475eb98, 0xcffc727b, 0x8ab48f40, +- 0xab33165b, 0xbe45cd38, 0x9efd8984, 0x5bdfa298, 0x501fc4b1, 0x2f73c23c, +- 0x2e3381fc, 0x7ec5d8ab, 0x4251d7b6, 0xeaa45bf4, 0x9ba233d1, 0x8fb91ced, +- 0x46b5d001, 0xc2a2f125, 0xd77fecd5, 0x2c7e8c38, 0x88fc232c, 0x17efd4db, +- 0x0db7c9ff, 0x6a9c58eb, 0x536f6ff4, 0x455be3fd, 0x375f8f3f, 0xf0bdaa33, +- 0x6f9bf656, 0x6fd633cb, 0x5efd5528, 0xcf4370b7, 0x5c8f08d6, 0x7ecdd89f, +- 0x572a8d6b, 0x72fd2a59, 0x9f31665d, 0xfc2b58f0, 0xd7f72816, 0x62f3677e, +- 0x80455bdc, 0x2088afe1, 0x108bb797, 0x1907738f, 0x0977c002, 0x69dc0561, +- 0x91b6c91f, 0xfb37ad48, 0xf85f803f, 0x39fe59db, 0xc636c738, 0xcf20fbfa, +- 0x6cefe2a7, 0x5be6807a, 0x0f28b654, 0x71ac9ddf, 0xd2753fb1, 0x1dfecb9e, +- 0x129ac2e4, 0xc937cf91, 0xfd91e63e, 0x13f6453a, 0x9fb269e5, 0xdec76479, +- 0xf809fb20, 0x02ad82b6, 0x29762ddf, 0xb7dba2c2, 0xceedfdf6, 0x6d32c245, +- 0x7b74fb6a, 0xfa67f7f1, 0x4adf7f89, 0x1223539e, 0x60d65651, 0xa7256fbf, +- 0x6319649b, 0xd5e8b2e3, 0x4ffcc9bc, 0xf322ff8d, 0xa6f9e62d, 0xd786b3c2, +- 0x786a7c68, 0x7d7812fe, 0x3ebc3269, 0xced82253, 0x595fda8f, 0x5755b88f, +- 0xde6fd4bc, 0x06441357, 0xa3c6eff1, 0x1bfd1cf2, 0xe313312c, 0xf7b53c4b, +- 0xe42c28dc, 0x2bdc7f4a, 0xaaf3c002, 0x8fae6a9e, 0xf7898f8e, 0x6bf8616e, +- 0xd9572f2a, 0xdde821fd, 0x6ba1a5cb, 0x1f12c3c8, 0xbc4bebef, 0xedf9e681, +- 0xce0f664b, 0xd7669d27, 0xace20f6e, 0x2f3d996f, 0x9d3ffbe0, 0x724a5eca, +- 0x369f9e25, 0xd3ac39e9, 0x9da8f12e, 0xe39dbec3, 0xce14b963, 0x23c80cb2, +- 0x5f9829fd, 0x92665ff3, 0xfe27692f, 0xe59367dd, 0x454cfe54, 0x529fe91c, +- 0x50facfee, 0xc77d1fa3, 0x538d1670, 0xeb26fa41, 0xaf3e38d1, 0xf7de9d78, +- 0x08d50ed8, 0xc5afbf83, 0x25534623, 0x6b88171e, 0xb03c449e, 0x04558ce6, +- 0x82147da9, 0x250cf68f, 0x7a35bd08, 0xfa19aae6, 0x114136b6, 0x542f60d3, +- 0x6193127d, 0x3e9d2e12, 0x09c57588, 0xe38f8e97, 0x700c520b, 0xa1866782, +- 0x8e55527f, 0x3bd93da1, 0xad3ed0d7, 0x4f00d4ae, 0xe860ddf7, 0xd0b0de9f, +- 0x6ffa6700, 0xeacff433, 0x35806a58, 0xab25957d, 0x15eeacc4, 0xf767ef86, +- 0x77f434ac, 0xda1ad607, 0xfb8971cd, 0xbc068f59, 0x4e3405c3, 0xee4e3a9d, +- 0x7e868dce, 0xaa6dd082, 0xbfc89c80, 0xceeb1267, 0x3acf4428, 0xc87aaac7, +- 0xd7ff7e69, 0xd734eb8d, 0xbca9925b, 0x7fd465d5, 0x784619b5, 0x4284e391, +- 0x4e458b43, 0xeace1ea3, 0x8ce018b6, 0xd79bd232, 0x51628fd1, 0x2f82f1cc, +- 0xae7fbfa2, 0x78d1fe81, 0x84f07e22, 0x69ec9fd0, 0xb37aeb00, 0x8f7b02d5, +- 0x1f7e82fc, 0xf1e82fc8, 0x1e82fc80, 0xdf417e46, 0x7d05f91f, 0xfa0bf23b, +- 0x4633b2f6, 0x1b0f97fa, 0x9ef95fe9, 0x5f1afe91, 0xeaa7454e, 0x843f91b0, +- 0x7f2bf15f, 0x5e374e85, 0x344ff232, 0x37266e7d, 0xf4153927, 0xd7213c50, +- 0x9dd7a797, 0xfa22f451, 0xf7c04c04, 0x9f4904cc, 0xa04975d0, 0xb319ed57, +- 0x8ffc1208, 0xc77cfb51, 0x23286fe2, 0xab86f03d, 0xebfa0334, 0x147ae166, +- 0x9dc5db71, 0x86884f26, 0x7e35115d, 0x7dff0cf5, 0x1a17a465, 0xb6cd5da6, +- 0xfc463f81, 0xdc9e7073, 0xd9ddeaa5, 0xc0fc7271, 0x127cc142, 0xd839baf8, +- 0x339ee347, 0xcfd02bf5, 0xb7f44fdf, 0x0bfbfbe3, 0xd47f79bb, 0xcdf7c143, +- 0x0d931aff, 0xe0b679b8, 0x0c28b073, 0x88492f97, 0x2ce6c5e8, 0xd43b27aa, +- 0xe39ea655, 0xdf4ed43c, 0xb8c99775, 0x69c7824e, 0xa15178e3, 0x444e22f0, +- 0xe6ecafc7, 0x6ce3e022, 0x63e01cec, 0xde41e4c0, 0x25756c20, 0xde051f41, +- 0xbde40b34, 0x9fc217e0, 0x57faa59b, 0x29e46259, 0x5ece73ac, 0xd7abb061, +- 0x62c2ed06, 0x0d397fc8, 0x8650d170, 0xc7f5ffa1, 0x92f6865c, 0xbda18150, +- 0x00c78cec, 0x19570f97, 0xe7be57fa, 0xe1d5c035, 0x1bff433a, 0xf00cf92f, +- 0xef9e456c, 0x239653bf, 0x992e21f3, 0x387e6bdf, 0x6bfa5079, 0xf9afdcf2, +- 0x49ffa2d5, 0x38711daf, 0xbf357f95, 0x6da3f35c, 0xcfd04084, 0xf6c2d3b6, +- 0xfa5da660, 0xf62dfec9, 0x6827c8f3, 0x57e6bafe, 0x08a9fe6b, 0x76f57ad4, +- 0xf693be87, 0x35ebf545, 0x8bf359ff, 0x4c5d8b13, 0xb236eb3f, 0x4b07e0ab, +- 0xae761338, 0x1a4c4639, 0x4cb9790f, 0xd7a25b9e, 0x7a2badaf, 0xa762c4fe, +- 0xdc7517e4, 0x7ee2ec17, 0xccfe24df, 0xf57caabf, 0x63beb99f, 0xad67cfe0, +- 0xbb56f79e, 0xf4f3ebff, 0x1321fc25, 0xf5f352fe, 0x264dfd72, 0xc767c713, +- 0xd72e5fd7, 0x0bf595af, 0xd921dfc9, 0x37e2f359, 0x1fc83af7, 0xc2c7b678, +- 0xaf339671, 0xe40c6c5c, 0x5e121fc1, 0xfc9b338c, 0x3e07d07c, 0x0b07ce05, +- 0xdf3ccdcb, 0x772932a5, 0xcf2cbd11, 0xd242a365, 0xc6c7b47f, 0xe849d479, +- 0xeda07ccd, 0x8b43f107, 0x510dc655, 0xc9686e22, 0xc0437197, 0x44a21b88, +- 0x2ff510dc, 0x3e187af7, 0xf0c55bd2, 0x0cbd7af7, 0xe3adeb1f, 0x3ebd07f2, +- 0x26f8d7ae, 0x79da5f1a, 0xc43fa34b, 0x2f237610, 0x1feb1f8a, 0x6d72f492, +- 0xd3f6fab0, 0xa24deb16, 0xe08d294e, 0x8f151ef3, 0x3c49e633, 0x7fe41fa0, +- 0xe6b57eaa, 0x9bc424c2, 0xc92b8547, 0xaae257f9, 0x687c2f7f, 0x973f1f78, +- 0x949bcb8e, 0x52e4a987, 0xceeb3f3b, 0xd1772cab, 0xb72d18f2, 0x3fe778d1, +- 0xfc7bb9dd, 0x53c5ab5c, 0xe8d53954, 0x55b5c9a2, 0x5fa11b84, 0xce267982, +- 0x609c3f53, 0xf3c5a394, 0x077f7e24, 0xbcf2a239, 0x326699cb, 0xfdb2f847, +- 0x1017f271, 0x4869ef1f, 0x8059e0e4, 0x7dba8fce, 0xd2faf02e, 0x2b7ea06e, +- 0xd062ac07, 0xb0757d85, 0x44096d1d, 0xd8471b9f, 0xaddb6c9f, 0x3e469f38, +- 0xe7e4e77f, 0xd13fce4a, 0x6fc26d38, 0xfbdbbac3, 0xab56fd8d, 0xfce8cae7, +- 0xd53cd54a, 0x878479de, 0x7f351ffd, 0x19f6a1de, 0x6e609fe7, 0x60df1a92, +- 0x1432a479, 0xb9bf3ba3, 0x8b28ef90, 0xb8b784c0, 0x6dc3d802, 0x6bbe4f16, +- 0x7869bf22, 0x97e7989b, 0xf7c41bf7, 0xa0fcf962, 0x232ff9e5, 0x6afa0fcf, +- 0xffb514f9, 0x985980e5, 0x48e0df71, 0x7fa7e70c, 0x4f7b3a6b, 0x7f974b8e, +- 0x11b79099, 0x309fb889, 0x27ba687a, 0xb4bac930, 0x1b361fd2, 0x684c91ee, +- 0x11347adf, 0x17cec9e7, 0xf3a69e65, 0x796953c5, 0x3cd7bd3a, 0x1bfbc2cf, +- 0xe7dbf932, 0x9bdc8f4d, 0x60c7fb58, 0x357aca31, 0x9fbd127e, 0x5f36bd71, +- 0xa519fe61, 0xab5eb1fd, 0xa47f7853, 0x49e40517, 0x112fd7cb, 0x5a9454a1, +- 0xb3bfc43e, 0xe5a0e99a, 0xd5425a43, 0xfbbb8fbc, 0xa8e35b56, 0x2da9f84b, +- 0x48ae71b5, 0x4b3c249e, 0x2a99bfde, 0xac6cb25f, 0x3e5bc784, 0xb38f2376, +- 0xe65b9e6d, 0xd9edb64f, 0xee6fff00, 0x1e056141, 0x4e3956c2, 0x553e9e34, +- 0xdcb924e5, 0x6e37b7a8, 0x6f6f5855, 0xf796ad84, 0x6b6f587c, 0x157ed5f0, +- 0xa6f095ae, 0x5b0e12ed, 0x24953b1d, 0x05c45fb9, 0xd8944fb0, 0x87b1ce0f, +- 0xf60238d4, 0x40fb1281, 0x6015f43d, 0xd0c02be8, 0xafa18057, 0xa15f4250, +- 0x65f0a57e, 0xbc888e23, 0x4e4e8d4e, 0xd1a9d790, 0xebc81ff9, 0x75e461e8, +- 0xd791fdf4, 0xaf23b7d1, 0x5e476fa3, 0xaf230f47, 0xbc8fefa3, 0x5e461e8e, +- 0x791fdf47, 0xbc8c3d1d, 0xf23fbe8e, 0xe476fa3a, 0xc8edf475, 0xe461e8eb, +- 0x91fdf475, 0xdfb7d1d7, 0xf218a3df, 0x9a93f73e, 0xeeb5df06, 0x71fcc69d, +- 0x313bedda, 0x41fbe88f, 0x66bf9ffc, 0x8f9d01cd, 0x6edf01af, 0x48f38aec, +- 0x49d7f73a, 0xa4849bba, 0xd32348f3, 0xc24d8b79, 0xe7749eb5, 0xf20ffe24, +- 0x99563529, 0x7c89414f, 0x53e44a0a, 0x529f2250, 0x29f32f93, 0x414f9128, +- 0x2829f23d, 0x89414f91, 0xe44a0a7c, 0x9f225053, 0x14f91282, 0x0a7c877c, +- 0x5053e44a, 0x4a0a7c8f, 0x7f5053e4, 0xbc81d68e, 0xf82eb68a, 0xf38679cb, +- 0xe1a1f11c, 0xc034e73c, 0xfdf597f0, 0xdbeb2fe1, 0xdbeb2fe1, 0x61eb2fe1, +- 0xfefacbf8, 0xb0f597f0, 0xe58b9e69, 0xfeb37e0c, 0x7acdf83b, 0x703fa8b8, +- 0x3ba0b11a, 0x35eefdf6, 0xe504e194, 0xdf49c559, 0x15b7ff97, 0x638583c8, +- 0x0f64ec95, 0x0fadbfd9, 0xd821a8ad, 0x2ba7deaf, 0xd0262316, 0x44d8f39b, +- 0x04487f37, 0xe8a08f71, 0xd76e4cf3, 0x47fcaaf2, 0x22392f74, 0x535f0fd8, +- 0x7da5d724, 0x334e11ef, 0x047fad4a, 0xf45fbc9e, 0xd63f5afc, 0x9075ba97, +- 0xfdc12c9d, 0x8e2d9286, 0x4fc45dd2, 0xfb0a4c07, 0x9fc807a1, 0x5e893a5a, +- 0xa3fd50aa, 0x27c3a603, 0xa22f70e3, 0xa7ecf145, 0x88b1afa1, 0xe052d633, +- 0xfe14bba9, 0xb2797642, 0xdf75afea, 0xda3f7b80, 0x1db8b5ba, 0xf22f09e9, +- 0x8447f3ef, 0xb9e68dad, 0x6b6153e9, 0x9366df87, 0xc3be02fe, 0x80baedb9, +- 0xe3afdde2, 0x697282ef, 0x0d81fcff, 0xfd51b437, 0x6fba8775, 0x171f8768, +- 0xcefbbf27, 0xc78c8973, 0xfb29b73b, 0xf99fb4cd, 0x90778487, 0xcb9495fa, +- 0x8775dff3, 0x9e36b69c, 0xd76b69d7, 0x97d843df, 0x5ce1736d, 0x8835c228, +- 0x8a7989ff, 0xf0444178, 0x0d7bfb46, 0x4486bbfb, 0x75d7f105, 0x3ffb6307, +- 0xd751f1d2, 0x7e01b250, 0xff6658e0, 0x59fe3a47, 0x72441f87, 0xec206e41, +- 0xf24aa756, 0xc3bd6af5, 0x79c51be4, 0x623ecba2, 0x9a6efe03, 0x7b8b5c97, +- 0xf0b8e26c, 0xe6ef83e4, 0x4e9f6cb5, 0xbd07f2eb, 0xba03dc1e, 0xd3eed3e9, +- 0x63ef3f0c, 0x82a7d998, 0x70f6c7d7, 0xc509404e, 0x0cee2a13, 0x09529a0c, +- 0xd5b023be, 0x87fe869a, 0x00ee0784, 0xa0b12899, 0x42afb234, 0x558a6c31, +- 0xd4e22fc0, 0x91ff1d34, 0x7e0e58e6, 0x0558f129, 0xc58963f8, 0x89be8569, +- 0xefa237f6, 0x71ff907f, 0x6867bcaf, 0x6b1ec0b5, 0x538b51fe, 0x36eaf5ae, +- 0x2d1ffb2b, 0xd0ffc947, 0xfcd52bdd, 0x085eed0d, 0x109e1df9, 0xdb91f8ec, +- 0xb9d42e39, 0x7fbe1de1, 0x783b89f1, 0xfaf89920, 0xf7c39c93, 0xb7e1b954, +- 0xc94fac28, 0x272ce86f, 0x3f6cb63c, 0x55f3889d, 0xfb0af038, 0x3db7571b, +- 0x08e3289e, 0xa6d11f32, 0xcf8b49e2, 0x68f4abb4, 0x7d01ef53, 0x3bcb7a48, +- 0x086eed87, 0xbd6836f7, 0xfb4457ec, 0xb91f9a87, 0x384f1b4e, 0xa45c45df, +- 0x8bb7f683, 0x5bbbd5a0, 0x89886476, 0xd53ae3fe, 0xcdb35caf, 0x3a7ef7ca, +- 0xc2ed9044, 0x3f54609a, 0xbacfbef5, 0x9dfac683, 0xa7fe51e5, 0xeed22e7a, +- 0x7dbcb6e5, 0x7ff66eea, 0x6f9cadba, 0xfd2ada6b, 0x04587121, 0x8bc015f3, +- 0x3704b14c, 0x947af51d, 0x27e7f849, 0x1f545faa, 0x2ebc658e, 0x7d678b19, +- 0x8b2c74b2, 0x32c67be1, 0x4c77bcb9, 0x8a5c8bde, 0x3bd10c58, 0x9104ab5c, +- 0xea99fb4f, 0x7b8ddd0f, 0x2063a092, 0x9479f99d, 0x145319f8, 0xae6a7aab, +- 0x77053957, 0xdfeadeb3, 0xf5987b8e, 0xcbfd8283, 0xd137e03b, 0xa3f00df8, +- 0xdc1e41a6, 0xb73f7cb5, 0x6ef9114e, 0x9506c3c8, 0x041e49ff, 0xeb2f0feb, +- 0x41259ab5, 0xf069afdc, 0xee81361f, 0x03f81c9a, 0xef802de7, 0x57362808, +- 0xf8279f21, 0x79f1acbc, 0xc7343cb4, 0x8725f1ab, 0xfb8d1f8c, 0x9d2c58a7, +- 0xd7e045bb, 0xded4bc2b, 0x0ce0188c, 0xf7081195, 0xfdb28509, 0xaf5fd1e4, +- 0xd3c386d8, 0x343f8c97, 0xaf4c4c99, 0xf6f7f211, 0x70c56043, 0x65e43a6d, +- 0xcbba52b7, 0x53cf5915, 0x572f0b95, 0x2bc5cee8, 0xf922f955, 0x63f9c74b, +- 0xe9f923e3, 0x40ff1262, 0xcf095b2b, 0xa4e6b390, 0xa214d7f0, 0xc2e527cc, +- 0xdb0c435b, 0xe27dd428, 0x73ad0422, 0x7c670a85, 0x9dfdee2f, 0x861f8c85, +- 0x5e5f962f, 0xbffc2811, 0x8a4d87d0, 0xab57ef85, 0xfc9871f8, 0xefc3951f, +- 0x831787b7, 0x2385f1ae, 0x1a2dd036, 0x1eedf73f, 0xf08733da, 0xe9215190, +- 0xb7eb64d7, 0x045179f2, 0xb55f88ad, 0x22fb4a16, 0xafecae2c, 0xc5c43e72, +- 0xdf6d3e71, 0x89f7aa1f, 0xace1f1a3, 0x7e027690, 0xf48e6bb2, 0x4fc25193, +- 0xf81c7dc6, 0x27e180c9, 0x8c9f84a3, 0x80c9f87a, 0x860327e1, 0x7e180c9f, +- 0xc9f84a32, 0xe4c27fa8, 0xd130ff3d, 0xf05369f3, 0xa7c4abf0, 0x4dfaa59f, +- 0xa7feb415, 0xd79b8f71, 0x11fde7ef, 0x195eb0df, 0x5fc453d7, 0x1f088af6, +- 0x70b9ecad, 0xe11394d4, 0xbf9db6a7, 0xe205ea7f, 0x17e4958f, 0x3bfd9e42, +- 0xf14c5095, 0xdcf67cd4, 0x979638da, 0x636ebee7, 0x1b64dbfd, 0x47776d3e, +- 0xcf7ef9f0, 0x7d4ab4ff, 0xd177ca19, 0x63ba2bb8, 0x4fffd03d, 0xb1d2fa55, +- 0x0f42f8de, 0xad32e5d3, 0x251def89, 0xbf50b3fa, 0x9ebf0c52, 0xbf9afd41, +- 0xda3676f1, 0xb6ee381f, 0x1cb70f41, 0xe191d92b, 0x177ef7c2, 0xe1c5b5f8, +- 0x58cfc1b4, 0xed992dbf, 0x8cba736e, 0x73c712db, 0x47a34bde, 0xb78c8555, +- 0xb829527d, 0x979ea2bc, 0x25d64108, 0x6e927e86, 0xc5a6f2d1, 0x58e3a311, +- 0xf3ca7891, 0x0710733b, 0x3e9e1549, 0x217c44d7, 0x8d2b61ce, 0xe3a251c4, +- 0x6af2e31d, 0x9df88613, 0x50a9ae56, 0xdbcef70c, 0x85abcfc7, 0xd7e1d38b, +- 0x1138a63f, 0xb8736e6f, 0xb826adee, 0x37158ced, 0x8a7d4532, 0xf04996cb, +- 0x738a23c8, 0xb9bde83f, 0x1356f584, 0xf78a5268, 0xb72cd50b, 0xcb2a416d, +- 0xafef96a6, 0xd66a763e, 0x90afb1f7, 0xb67586d7, 0x14b6bd39, 0xdad3df9d, +- 0xf7f578af, 0xb1b83520, 0x9b0dc642, 0xfc0118e8, 0x6dd9b7dd, 0x2538895b, +- 0xffb83fb9, 0x13e546b7, 0xc7ea3bed, 0x73ea1ff7, 0xabe0ebc4, 0xf417da11, +- 0xd52be616, 0xe312bf8d, 0xfea7e6eb, 0x56b5b7ec, 0x2d78f024, 0x1bb7da4e, +- 0x49d793a5, 0x8d3c6078, 0x5cf1a1ec, 0xbde30f3c, 0x7ab41435, 0xbbdc1eb0, +- 0x33857820, 0x2b3cc568, 0x7c7095b7, 0xce5bbfdf, 0x6c99dfe3, 0x675f822b, +- 0xe966da71, 0x3be23dfd, 0x0e1365f0, 0x5ebca9f7, 0x08db87f6, 0x43f0294f, +- 0x75ffc853, 0x8b57c44c, 0xfeb6feba, 0xd8ffa364, 0xf41598ff, 0x4aed5469, +- 0x549e1d34, 0xb6e578f9, 0xd7786c5b, 0xf2f166d0, 0x8abf07bb, 0x10df7fef, +- 0x90f90bbb, 0xad2781c6, 0xae1f826e, 0x93f67e90, 0xeadf9215, 0xb8f94273, +- 0x21b231e7, 0x3721ef96, 0xbf79fb3a, 0x9c7ef8e3, 0xc4ff03f0, 0x137c63e9, +- 0x9f70049f, 0x48c06daf, 0x127ac8df, 0x81b6dc78, 0x55bf9616, 0xa9cdbf16, +- 0x13dec75f, 0xa5e10af9, 0x815ee491, 0xb3fa71fd, 0x1f173fc1, 0xf79b37bf, +- 0x7be4eb49, 0xe2d71e54, 0x37cc798c, 0xff1ad7cc, 0x79499734, 0xa97be6d6, +- 0xbdf3c2c2, 0xb4e525f4, 0xdf0b776d, 0x10cd6983, 0x62f9451e, 0x53e4d539, +- 0x3546d793, 0x7bbad92e, 0xf4ebf089, 0xeeefd90d, 0xcfc12797, 0x2b9d7565, +- 0x3e127a54, 0xb8ba135f, 0x3d2abbdd, 0x728c729b, 0xee30f18f, 0x9bee5529, +- 0x37f28616, 0x6bfa4614, 0xc8a536f3, 0xe0ffc0ef, 0xbd2a53b3, 0xf7237fd1, +- 0xeaa4f157, 0xbd71d68d, 0x1a7b6871, 0x8561c6f4, 0xf71b54f3, 0xe36ebf48, +- 0xe71c098b, 0xaf8d8ffa, 0xea1ef8fe, 0x8313c9f7, 0x13f7facd, 0x27a9216d, +- 0x829fc9da, 0xdaa558de, 0xff6286fd, 0x72742b4f, 0x17adf6dc, 0xac5c81af, +- 0xf8b92a18, 0x0efbc14b, 0xeafcdf41, 0x73be1fc5, 0x5f622b83, 0xdcac7db5, +- 0x16d66ff9, 0x726f1e87, 0x560abb9f, 0x493cef0a, 0x5ac39c2f, 0x1df229b7, +- 0xfd8d8f59, 0xd1de8d4f, 0xf242d07c, 0xf088eadb, 0xa9ff4681, 0x78db26fc, +- 0x5fd24e3e, 0x07c6b7a3, 0x3a35bd1a, 0x9d297bf1, 0xfbadafff, 0x2b5e9533, +- 0x531dfe54, 0x87456ee5, 0xe58ab6db, 0x056b6ddd, 0xb1fa6bdf, 0x4e3f58cd, +- 0x7eb8e727, 0xc0b901df, 0x69d022bb, 0xc655b774, 0xa04d0f23, 0xbeec3653, +- 0x6ad58eb6, 0x8d5db1dc, 0xfcd2ae1f, 0x4c7f62e0, 0xab4e8ea5, 0x6a74939f, +- 0x5fede97d, 0xfbc5c0ff, 0x4f6c7a93, 0x2b8bfb0c, 0xbd330e87, 0x663e771a, +- 0xf4bf5375, 0x5f41b74a, 0x389776b7, 0xb15f3711, 0xf90ad073, 0x4d74af4f, +- 0xea4defca, 0xaf0d60bd, 0xce8a3fb0, 0xa1fd69ee, 0x3cd30ef7, 0x26c4379b, +- 0x368d1ee2, 0xf252b78f, 0x72776b75, 0xed6be60a, 0x381ff96e, 0x3f7a68cf, +- 0xc42eee5a, 0x4958794a, 0x2f2e429f, 0xdec9e2dc, 0x3f313858, 0x959595a6, +- 0x10cf6e92, 0x256f717a, 0xbbe87e2b, 0x03d643c0, 0x93e41e71, 0x41c2f2f3, +- 0xc63e0bcc, 0x17a46dba, 0xaf25ff71, 0xac7bfc33, 0xbe745c83, 0x213282ef, +- 0xd23be645, 0x926fde08, 0xcc72b3ef, 0x52afbcb2, 0x0f6a3bda, 0x86a45da1, +- 0x68ffb1cb, 0x5f9535bd, 0x36a7f1a1, 0x9a9eb44e, 0x57777f6a, 0xa2fa794a, +- 0xab705dfd, 0x4f029371, 0x6de69db6, 0x078e747e, 0xda2fa471, 0xe64e2da7, +- 0x4bf7c697, 0x32955acc, 0xe4f37ec9, 0xfdea6839, 0x4da6d40e, 0x7909dfb2, +- 0xb44e555f, 0x79e3efbb, 0x27997e92, 0xdd90a0b9, 0x6c2eefa2, 0x65fbe588, +- 0x38b4beda, 0x5efadffd, 0x14cac1e1, 0x4e14fe35, 0x14d93f80, 0x487fcaa7, +- 0xa25fa8c2, 0xfdecd7ab, 0x21386739, 0x3f9fa745, 0xa1ed56ea, 0x3c81ef08, +- 0x815c9e8b, 0xfeb9c778, 0x42a6090b, 0x9f5ca7f0, 0xab66ddf6, 0xf40f5ce7, +- 0xbe18f6dc, 0xd37e4eef, 0xda93c40e, 0xa71cc903, 0xeca7afb9, 0xe71a5ee2, +- 0xfc596dbe, 0xf3f350de, 0x2ffaa957, 0x8ecb737e, 0xebdff44a, 0x6f8fc276, +- 0x886cf877, 0x2c0fc5c3, 0xdfb0e5b1, 0x5a01cf2b, 0x22b36ade, 0x0c9efc7c, +- 0x657211fa, 0x7b07913a, 0xf4af7ab3, 0x624debff, 0xb39bf227, 0x338b7cfb, +- 0x529e1fa1, 0xc527f03c, 0xdaa3d23e, 0xc7748c79, 0x6fbec587, 0xef68bf41, +- 0xc6c2e6ef, 0x219fb19a, 0x829dce2f, 0x07ec0bfc, 0xa65e01eb, 0x6e71fca9, +- 0xab827ce0, 0x2fcf8230, 0xe3481efb, 0xd67f2d0b, 0x194ff88e, 0x0d29a3f8, +- 0xe6a6d1fc, 0x2c0c76c9, 0x707db862, 0xe9fbbf19, 0x473a6743, 0xfb563db6, +- 0xef08a044, 0xda3e2578, 0x09dd16ba, 0x7f63a8bf, 0x35ce324c, 0xb640d6d9, +- 0x1b6d0fde, 0x01df987c, 0xe58c1a5d, 0xce354077, 0x67b83525, 0x7c9f6ab3, +- 0x3bf5a767, 0xb597eaa1, 0xef0c8b5d, 0x4c69da79, 0xd9ff8d27, 0x5fdf3c50, +- 0x04e9ded3, 0x95e3feec, 0x4ebdf2e5, 0xd3be4bb5, 0xaefee4c9, 0x5af4e349, +- 0xbe57b179, 0x3bbdd0fb, 0xbe91b3ba, 0x257aecef, 0x7bace311, 0x4e1567fc, +- 0xceb7c713, 0x77f1fc60, 0xbbe57b47, 0x27c7f6a3, 0xbe03ff7f, 0x1c767f06, +- 0xc6790c53, 0xec4982fb, 0xc243fa87, 0xdfb6fc86, 0xbdcfd829, 0xb03d1664, +- 0xa25f9aeb, 0xc552ffd5, 0xfea4a5c3, 0xcd7fd06c, 0x61b32781, 0x20937e37, +- 0xf703a6e1, 0xc87a08fe, 0xf48c7cff, 0xfd822dbf, 0xf480d6db, 0x64f7b597, +- 0x38ec7842, 0x19547f87, 0x46b9f2cf, 0xada4977d, 0xae0bfc8b, 0xd4458dff, +- 0x6f781d61, 0xdf7e7e04, 0x3d076a12, 0x147f27df, 0x2a138f79, 0x6fdfbdff, +- 0x87f7cc5e, 0x57e01048, 0x4affdfbc, 0x9a89f202, 0xfe6b561f, 0xb4ef1795, +- 0xef951e37, 0x870be381, 0xd4231cf9, 0xa77ac978, 0xdf8db7e4, 0x4ace2eb7, +- 0x6b8abf65, 0xdb212d3a, 0xab5af464, 0xf0e34dfa, 0x2e7cc391, 0xfd243ceb, +- 0xf3a1ce82, 0x7e6817ec, 0x70bef686, 0xecf3a1dd, 0xaddf6827, 0xd2f1223f, +- 0xb7d64475, 0x78b49814, 0xc3c9578b, 0x38615979, 0xb4d2c2bf, 0x9b9b00d5, +- 0x3a505ab6, 0x08c878d5, 0x0abbe5fb, 0x99e7ca7e, 0xb8ea6dae, 0xf3755b04, +- 0x974d56c5, 0x3ea8daef, 0xa5ef81d7, 0xbbdad73d, 0x50f3c88e, 0x276e2ba8, +- 0xef5d83df, 0xebeca0b0, 0xdf3db072, 0xc02a6dd7, 0x12af757d, 0x71dcfec7, +- 0xf4d6fef5, 0x22c6ef75, 0x4629904e, 0x7cdc994e, 0x15666b6f, 0x022e9b8d, +- 0x7b4b8f7c, 0x9fe5744f, 0xf8c32e3f, 0xafc2620b, 0x5b980220, 0x7909a335, +- 0xe1490593, 0xf73c6032, 0xd384ba58, 0x0e20afc3, 0x37240ce5, 0xa5f28f21, +- 0x8af54ae3, 0x30eece21, 0x0a07aff9, 0xdb2ec6ba, 0xc4635c64, 0x5799b906, +- 0xfa68f925, 0xe2473a49, 0x83b9f51c, 0xd3e981cf, 0x9b9df9ba, 0xa1970c28, +- 0x837c71df, 0x8c7f60fb, 0x420eff93, 0xf6f5979e, 0x027558c6, 0x3de99797, +- 0xa425aeaa, 0x9f0363e6, 0xf7f8829b, 0xa12b8e04, 0xbcfdeb6f, 0x4f292aee, +- 0x979918be, 0xceb14bbd, 0xe4fa27fa, 0x835fdb90, 0xcc72fa75, 0xb8b92545, +- 0x7def2b17, 0xb7f3515f, 0x50bcbf9a, 0x7a96769d, 0xc8cdb3ce, 0xb4fe4070, +- 0xd78a89fb, 0x1f52efcb, 0x8ad93c2a, 0xc4737f75, 0x1620efce, 0x73c9c48e, +- 0xb63a8cd5, 0xd9b17daf, 0x2e283fec, 0xfea2688b, 0x214d0b27, 0xa6ffdfdc, +- 0x599e73b0, 0x6dfca3d8, 0xc3df2c53, 0xf1bf8e56, 0x964dec39, 0x92a7f7f9, +- 0xff599f68, 0x8ba078a0, 0xfe2f479b, 0x6ca84fe3, 0x187fdb1a, 0xfe4911fb, +- 0xb9c3f066, 0x7ef3bad1, 0x9d37f542, 0xb48f7643, 0x8fbf4263, 0x9e7e0fe3, +- 0xac8a6298, 0xc5c8caef, 0x879d5f17, 0xe9f1ced2, 0x32cdc785, 0x9eb5159e, +- 0xbe2e192b, 0x98fd4e0f, 0xa61c573e, 0x0b87ce20, 0x0f7a9f8f, 0x7b885beb, +- 0xd83738ce, 0xf6f597ad, 0x2566b84e, 0x150e7e23, 0x88ac97fa, 0xb540783e, +- 0xae7d694b, 0x7b08dc9f, 0x2059a6f9, 0x651440ee, 0x07d6883e, 0x425f833f, +- 0xaa37c6fe, 0x07ed79e4, 0x546fbe39, 0x67065cb1, 0x9be72e41, 0xb69fbf27, +- 0xe3514aaf, 0xd1ae9259, 0x8ba68b74, 0xe7716f86, 0x8524e9f0, 0xa8f45cf1, +- 0xc62eefc4, 0xb767e7ef, 0x198a9893, 0xc636fbff, 0xf86ffff3, 0xca7de2fd, +- 0xfbe373f7, 0xd3ed3afc, 0x77e7d86d, 0x93ed1ffe, 0xbcdfc0f5, 0x3ee361cf, +- 0xb142fad3, 0x8f37c073, 0x8acfd89b, 0x0a2a37be, 0x66d1eb04, 0x53c71c73, +- 0xddf271fd, 0xd3cfe901, 0xde9a9fd0, 0x2e175d9c, 0x4e71bf82, 0xaeb16788, +- 0xeb8869b0, 0x30e5562f, 0xc314ccdf, 0xc27efc99, 0x3f872e12, 0x35bfb66b, +- 0x4bb223f7, 0x0f048f03, 0xf4e34abf, 0x56a7c129, 0xeddd5f41, 0x95dcfce0, +- 0xa56029a0, 0x45920679, 0x7f9a31f1, 0xce5ccd60, 0xaa115cb3, 0xb1b06a9e, +- 0xecf6a29e, 0xca37b41e, 0xf9fdeff6, 0xa3f81ec2, 0xf782f923, 0xae225033, +- 0xc0f04bd9, 0xff6e0292, 0xf6e7a6a1, 0x97efc824, 0x8193e608, 0xef7c2935, +- 0x83a7e9e4, 0x0e8ec2d7, 0x11337a0c, 0xf44cab57, 0x19c74187, 0x079f6966, +- 0xe54f54dc, 0xb1af8a13, 0xc914e31d, 0xe31b86f5, 0x43403a5e, 0x2a91e6c5, +- 0x3d73faa5, 0xd5cf9c09, 0x638b47e4, 0x7f9c0ecf, 0xded2780a, 0xf2a07f23, +- 0xc5778699, 0xa667df2b, 0xe8d678aa, 0x6a5bf1a0, 0xa6cf7c9c, 0x377c916c, +- 0xbd791f7e, 0x33c8fbe0, 0x27782969, 0x71e31cd7, 0x4adfdf01, 0xfd618ff2, +- 0x3e881b7d, 0xd243ec66, 0x5bde1ce1, 0x997fe24e, 0x7e5a4dab, 0x3463df9f, +- 0x9a5fa90b, 0x3d17f7b5, 0x2217f7c6, 0xef19333c, 0xe89f9891, 0x3edd67fb, +- 0x5fbe355b, 0xd2fb65ee, 0xd9def2ac, 0x7a4f34ff, 0x5aa9286f, 0x623b95da, +- 0x9dfc89fd, 0xf3450efa, 0x7c96cfc3, 0xe4f60b3c, 0xcc6f83dc, 0xa2577944, +- 0xf69ab92f, 0x1fe344f3, 0x7dc4c316, 0xf7e61990, 0xfe341f34, 0xe5c71671, +- 0xfcc1bcb7, 0x57aeb7ff, 0x01ffc75b, 0x0934e170, 0x000048d0 ++ 0x00088b1f, 0x00000000, 0x7de5ff00, 0xd5547c09, 0x73b9f8b9, 0x2cc99997, ++ 0x2cac8499, 0x04455871, 0x0310849c, 0x11161da2, 0xb4a0e22d, 0x044c0b82, ++ 0xf5206fb2, 0x032fb541, 0x1ad2d361, 0xd1a0c06a, 0xb068304e, 0x301b0701, ++ 0xd4018048, 0xa1ad2be2, 0x18b6adc5, 0x9316c314, 0xdabe1b80, 0x77df3ff2, ++ 0xbdee4dce, 0xfdb60899, 0xfbdefafd, 0x387b3fa7, 0xb7cb3dcb, 0xe77cef9d, ++ 0x4a48df3b, 0x1efb893c, 0x8fe09721, 0x089937a6, 0xd3bb6321, 0x23739685, ++ 0xaee98e4e, 0xb32644ff, 0x1d692343, 0x1cee5529, 0xc84e5dd5, 0x8cff6c0a, ++ 0x449a39d5, 0x24129a43, 0x185c5a4e, 0x8419226f, 0xf822e83c, 0x378c4cf7, ++ 0xa4274845, 0xb5d9bd73, 0x972d2079, 0x8e214edd, 0x760e8fa6, 0xcef80405, ++ 0xcef9009d, 0x66d76547, 0x5cdf279a, 0xc97be112, 0xd027bec2, 0x3921024f, ++ 0x84c1eff0, 0xe24517c8, 0xafd343ef, 0x919f4c05, 0x9d1f3cc9, 0x93baec9f, ++ 0xcf77b44c, 0x23e715cf, 0x1df2d11f, 0xe5a7ad0a, 0xe2cf9c72, 0x7f5dd91f, ++ 0xfe70110d, 0xec329be4, 0x956f1d5f, 0x178b4eeb, 0xb5101bd7, 0x0bae1de5, ++ 0xd55f284e, 0x43f61774, 0x259d706b, 0xad373f30, 0x2148fb8f, 0xbbfeeea6, ++ 0x71c414e1, 0x89bbbcd4, 0x213d7b8e, 0xb5bffec2, 0xf2eeba12, 0x4cdbb29d, ++ 0xa77932e1, 0xcd1efe1c, 0x4108d517, 0x59f69bc8, 0x6b70a109, 0xb0f966af, ++ 0xfb42f143, 0x9e696b4f, 0x6e625176, 0x000df9fe, 0xd9229dd7, 0x4cf8c38c, ++ 0x1556df30, 0x9f2c8d6e, 0xa2d9656d, 0xe173039a, 0x3346dcfb, 0x8afed2b1, ++ 0xb8cce776, 0x0e73e681, 0x149a04cb, 0xf4ae596d, 0xa0bcf9a5, 0xc77c8210, ++ 0x07e38224, 0x2dc18976, 0xb3877db4, 0x1407e139, 0x2ccb678e, 0x9d357dc4, ++ 0x6139a3b7, 0x7e438516, 0xf854c770, 0xf05ebf2e, 0xde4d0900, 0x648de5b9, ++ 0x56d15dfa, 0x70a663c1, 0x11b3a829, 0x873670f7, 0xd6bff44b, 0x3dfc3106, ++ 0xae98bf5a, 0xbc040c93, 0x22254c56, 0x715ebf8c, 0x74e1ba3b, 0x71386cb6, ++ 0x45f3bb9b, 0xf438e95b, 0x82ede2bb, 0x6c589607, 0xcba07e22, 0xd9d6ddf6, ++ 0x7d61d9cf, 0x0e6195cb, 0x051ad758, 0xb304e5da, 0x30dd5976, 0x2a651abf, ++ 0xaeafcfad, 0xf835b251, 0x96bba82f, 0x799a2db8, 0xd44e0d55, 0x3d3187d2, ++ 0x3b44c94b, 0xbc427c9f, 0x41903b21, 0xe1a99950, 0x0c42be8b, 0x4ea0bbe2, ++ 0x214ff5d4, 0xfd3c4849, 0x3fe9b7ff, 0x7b02bc29, 0x1557081d, 0x1d398b6f, ++ 0xc0bb78a9, 0x9d4887f9, 0xd5feda19, 0x0780e7f4, 0x328a9f3a, 0x28bfa617, ++ 0xb2b4c24b, 0xd9f88dcc, 0xe9a3f008, 0xe76f3e3a, 0xa2513204, 0xc4bd3ae3, ++ 0x3b166c05, 0xa6513bdd, 0xcb1f58f9, 0x17e7dc27, 0x7eb2dfdc, 0xfb28dd35, ++ 0x372780b3, 0x295ea990, 0xff15e699, 0xe3a1e222, 0xa778774b, 0x35e4238c, ++ 0xd61c7fe2, 0xe7f052bf, 0x09095e02, 0x5e28f925, 0x8e540b56, 0x81ad7850, ++ 0xac385245, 0x4cf4a64e, 0xfef1b4f1, 0x8144e78c, 0xf20e35af, 0x363fcfd9, ++ 0xc2a9fb10, 0xcfda647e, 0x93f7cbe0, 0xd7533730, 0x5cdcc24f, 0xec1a9fb5, ++ 0xfd657ac7, 0x5e3b9c6c, 0xf9b99f3f, 0x422f3f6a, 0x2b8e95bb, 0xbcc2575b, ++ 0xccf9fa09, 0x127ec42b, 0x3f10f3ef, 0xf4aa2f6d, 0x22bd9a43, 0xc7d7b7ad, ++ 0xb4463da4, 0x17693474, 0x5ca0e7f4, 0xe8a3a5a5, 0x3f1d28cc, 0x756378c5, ++ 0xfad33ef9, 0xfbc7daea, 0x13eae906, 0xd0308f67, 0x7ad5dda5, 0x49d3cf2d, ++ 0x9c146385, 0x4157d2af, 0xafb133b9, 0xf50ff305, 0x79dca3b5, 0x6affbc68, ++ 0xcc379d17, 0x3ffc5095, 0x73aff8a4, 0xba1ba045, 0x4124812e, 0x6a4136ea, ++ 0x33235fac, 0xf7ea4db8, 0xf413b0cd, 0xe75312fb, 0xff9a18b0, 0x1df130a3, ++ 0x419ff758, 0x45bc5298, 0xda14a489, 0xca099945, 0x330335bf, 0xe0680b9e, ++ 0xa50076ba, 0xdfbba117, 0x093fb2b5, 0x5025b1e8, 0x5cfa001a, 0xa7ae803d, ++ 0x4827212f, 0x84303869, 0x3b203f7e, 0x566fe009, 0x8ed0fca8, 0x47f1d0af, ++ 0x30adf8e2, 0xe32f5b7e, 0xea65079b, 0xe4a4b7c6, 0x28b7c6ea, 0x1fca7c74, ++ 0x7ca5819d, 0xf1bf0a7c, 0x4b279c84, 0x4a737c71, 0x46bf8e2e, 0xf1bab921, ++ 0xffc6baa3, 0x06fdc612, 0xb08f8fc6, 0xf5e341fe, 0xd7c94feb, 0xeb615faf, ++ 0x7c03cb27, 0xbf5c28fc, 0xfad80420, 0xfad9f253, 0xaedfaccd, 0xf05d9df1, ++ 0xae3a0457, 0xfd65e85d, 0xd7e82783, 0x7ea1557f, 0xbe3666fd, 0x3e5af96b, ++ 0x8fc71dbe, 0xf5b2d611, 0xe388555f, 0x07bf662b, 0x17e948e8, 0xfd841a55, ++ 0xa0653fb4, 0x5e819444, 0x12c7874c, 0x6fc9e542, 0xc38420c9, 0xee8c5143, ++ 0xf4a28cbe, 0xa796ef66, 0x90394824, 0x9cc5c3ee, 0x27ea0ba6, 0x0e7f6c2a, ++ 0x90bebee0, 0xa341754f, 0xa919fb88, 0xd2870734, 0x8a37b6f9, 0xa82fc801, ++ 0xe22831bc, 0x08f4ca7e, 0x94309122, 0xd461b27f, 0x8cbaed66, 0xb90ac2e9, ++ 0x57c345b5, 0x127df25d, 0xe74a5e19, 0x30440a57, 0x4adf3bb6, 0x72a134e5, ++ 0x8f2a23f8, 0x33253d21, 0x9524e4bd, 0x2d6ae4e3, 0x7a672cdf, 0x1b1c8049, ++ 0x43ffe74e, 0x8956ff3e, 0x8975bbc1, 0x7ff80410, 0x02917eb9, 0x85616cf2, ++ 0x7bbd028d, 0x4f1c251e, 0x41cdbb9d, 0x76e8a7d4, 0x1bb9f000, 0xbf909159, ++ 0x0dfdbbec, 0x3969ea81, 0xdf747d55, 0xab8247dd, 0xf9fb6892, 0xb806b2eb, ++ 0x9deffae8, 0x61134e6d, 0x7ede227f, 0xd263e426, 0xc84994cf, 0x72f586ec, ++ 0x7bb99a3f, 0x8b51fcb6, 0x7e39fbe6, 0x5cdefe7d, 0x0e5dbe7d, 0x67d026ca, ++ 0x435204f2, 0x54bfbdfb, 0x338eaf5f, 0x7865884d, 0x90fde3e5, 0x169920c2, ++ 0x1a690fdd, 0xaf10bb14, 0x5bec5d73, 0x0f253e75, 0xfb8c24cb, 0x413c4b71, ++ 0x3b63c7fc, 0xdbad8bbf, 0xb2b9df38, 0xf3a3ebc5, 0x444cbb99, 0xdfe71a78, ++ 0x35e6cfb2, 0xd569a68d, 0xa0903267, 0xf9c63d71, 0x5c6a5bcf, 0xfd814b8f, ++ 0x2c602b21, 0xa4627467, 0x89c692a7, 0xd0d49c4f, 0xd6e85153, 0xbe6a4e27, ++ 0xa99ba82b, 0xe705e7cb, 0x54e7dae8, 0x17eae965, 0xeae9e456, 0xa45dafe7, ++ 0x960567cb, 0x5bcfdae9, 0x7f575cba, 0xbaa3e97f, 0xd7737bfa, 0xfc73f2eb, ++ 0xefed749b, 0xaba35d9e, 0xe6bbed37, 0xf2a3e00e, 0xfb0245b7, 0xd6f617c6, ++ 0xf9be839f, 0x00f25d85, 0x7d534e3e, 0x2ce0f805, 0x6d2057d5, 0x7a831c6f, ++ 0xd9839535, 0xd550aa84, 0xdac091c2, 0x09972009, 0xf0a0cfca, 0x3fa04087, ++ 0x6e082f21, 0xa5589f84, 0x61253090, 0xd176c481, 0xa9a8a771, 0x7d4cb96f, ++ 0x31f46515, 0x96c5eb3d, 0x9b25e5c8, 0xd972aeb3, 0xf407977b, 0x73ec1faf, ++ 0x301f5c1d, 0xc40a17d6, 0xcf572da7, 0x4c09d74f, 0x73f217ce, 0xc9cbe14a, ++ 0x551ce093, 0x958784a8, 0x2178db7e, 0x9390540a, 0x03c7fda0, 0xd02e503d, ++ 0x6ea0a3e0, 0xdbbf8eb0, 0xaf38880e, 0x54099062, 0xdf12a6ae, 0x4ce40121, ++ 0x5dca50f8, 0xde1e60a3, 0x93ee40d7, 0xd7dc78c6, 0x3da6cadb, 0xfc065271, ++ 0x5d3d30f8, 0xd6d31b36, 0x27a63f32, 0xfd3172cb, 0xd314aca8, 0x98a5b296, ++ 0x600b2f1e, 0xb5b2e7fa, 0xaca9fe98, 0xcaf7d302, 0xa77d30aa, 0x7b69882c, ++ 0x95531799, 0xafe4ba1f, 0xfcc3eb8f, 0x980b42dc, 0xb2d7cc3e, 0x466db692, ++ 0x0124f73e, 0x7fb05f9f, 0xfdf40c39, 0x2251ef0b, 0xbc3bd81a, 0x3bd6f48c, ++ 0xafa8bd1e, 0xf1290764, 0x6f59e9f4, 0xb278628d, 0x4234c89a, 0x43a3d1e5, ++ 0x303cf79f, 0x9012f312, 0xcf54a50c, 0x7e84474c, 0xf807dee9, 0x889e1cba, ++ 0x9c3473b7, 0xfa9f5bb3, 0x7bf4066b, 0xed88309d, 0xdc4487c3, 0x39f84987, ++ 0xbbebe00f, 0xffd84dc2, 0xda169497, 0xf82ed3ee, 0x9a10a735, 0xd85c122e, ++ 0x330685ff, 0x4d8e0091, 0x8d1c20b6, 0xce7e1c2f, 0x38b8fc09, 0xdad0ac49, ++ 0x51698c03, 0x5d856068, 0x46929eb3, 0x8542fe7d, 0x0fd98d30, 0x46b3d1dc, ++ 0x2ab95d01, 0xfc050e4e, 0xf6aa6127, 0xc14938b3, 0x0dd6ce71, 0x77fb668e, ++ 0xf583ed90, 0xf4af4831, 0xffed89dc, 0xade9f3d5, 0x843e751f, 0x2d8f9034, ++ 0xdd680f20, 0x8f9fcbe0, 0xfa5de07a, 0xbe01f15c, 0x412fe49a, 0xffa2885f, ++ 0xfd041a5d, 0xfb57984a, 0x0189092d, 0x5e5075f3, 0x7e8f1baf, 0xf4cf56e7, ++ 0x74ef5df0, 0x7556912b, 0xdd5e549d, 0x0539edc8, 0xfd0ad675, 0xcba312be, ++ 0x57263497, 0xf819f6e8, 0x527fe507, 0x3f40482a, 0x3a9a9c85, 0x815afb24, ++ 0xe4c92fce, 0x044b7ec6, 0xd2c8aed6, 0x48ddf8a2, 0x67a0cd8e, 0xd2a9903c, ++ 0x0feefb9f, 0xf33fbca8, 0x063c995b, 0xa3aedcf5, 0x087747f6, 0xf9f9a262, ++ 0x4340f73c, 0x7b9074c1, 0x1f7d7667, 0xc40593f5, 0x524384e7, 0x00c8a92e, ++ 0x6253e73d, 0xfff4069a, 0x7383f929, 0x91bce68c, 0x3e705263, 0xf7ead7f3, ++ 0xe99faa59, 0xfa5539f2, 0x33b9367c, 0xbb3de801, 0x0b7ba652, 0xfebea5f0, ++ 0xf90b936e, 0xae94872b, 0x92bfb906, 0x701e579f, 0xe51fa911, 0x9e57a2fb, ++ 0x091ac8c9, 0xbf260876, 0x5e40fb55, 0xf253d32c, 0xd80a3543, 0x186e3e8b, ++ 0x081bc3f3, 0x0d5c1f7c, 0x4ec09276, 0xddc5b3c1, 0x75df7f13, 0xaaf9c6fe, ++ 0x3b0f49fb, 0x51479f05, 0x460de09d, 0x311e4fd8, 0x0adf5c09, 0xaf8eba60, ++ 0xab5bd55b, 0x435af90c, 0xffc8643e, 0x4716f4c3, 0x6496f474, 0xe29957f2, ++ 0xbe817d19, 0x8a9d4820, 0x3fe99fff, 0xb5ff47a9, 0xfbfed2ff, 0x7433fed3, ++ 0xa5fe87fd, 0x31e90ffd, 0xfd48a6ff, 0x6db2bd17, 0x9bca8057, 0x383697fc, ++ 0xce87dd09, 0x1e091548, 0x2dc2ff8a, 0x797ed0ab, 0x81380a5a, 0xc504cf9e, ++ 0xe708c169, 0xdc4ccff6, 0x76bc4a2e, 0xf055ce01, 0xd9ffda4f, 0x033a7f17, ++ 0xb72fb9f4, 0x2f3c2ec8, 0x66c399d5, 0x0dc5a7ca, 0x68c9d379, 0xf9609fcc, ++ 0xc845e735, 0x33e9ea37, 0x090d85ff, 0x94a3df60, 0x6113cfc2, 0x6b8a97d4, ++ 0xfb0a993f, 0x44e90950, 0x077e333e, 0x458c5fe3, 0x44a598f9, 0xf3a7acf7, ++ 0x84bf3d44, 0xe1a4a5c3, 0x2745e7a7, 0x429eb7a4, 0x4169347b, 0x5df8dc3d, ++ 0x4e83d72e, 0xad711c9a, 0xae4508f4, 0xdc83d727, 0x8242e154, 0xdf2a0f4c, ++ 0x13e8e4fa, 0xb56d5e74, 0x1a0a75bf, 0x76fca978, 0x97ff3421, 0x977bbaaf, ++ 0xbcfcedcb, 0x105dfdd7, 0x723773bf, 0xa589adfd, 0x09d87285, 0x8d6171fa, ++ 0xe2d009ec, 0x3dcf6dc2, 0x579c14ff, 0x867b37df, 0xb60bfed2, 0x78cefebd, ++ 0x21d82f9a, 0xcb674dc7, 0xdd090bb0, 0xffa129f8, 0xc6eb4d2d, 0x5faffe47, ++ 0x58a3dc57, 0xddb123f9, 0x71d82978, 0x7aa32140, 0xe87263c2, 0x8f62d280, ++ 0x89d09f80, 0x9567a0a9, 0x814afd6f, 0x7d99e573, 0x181c4902, 0xaf359e01, ++ 0x7000bea3, 0x7c727c42, 0xd0cfe175, 0x05e284be, 0x5f11bae4, 0x83af76c6, ++ 0xfacb197c, 0xa524fb05, 0x82afedef, 0x664ffb1d, 0x7721c00f, 0x584e83fb, ++ 0x94a929cf, 0xab33f9d1, 0xfc74bc12, 0xe090395c, 0xe79594c2, 0xa423fb3e, ++ 0x3fa39cbf, 0x43e7604a, 0xf709b26f, 0xac3240aa, 0x0ff56173, 0xc4d99d70, ++ 0xfb98748f, 0x7903e88c, 0xa64485f9, 0x27c088ed, 0x93e32205, 0x72299b53, ++ 0xc14f3ae9, 0xfbe40539, 0x16e0c41f, 0x222c8fb4, 0xa47e0f20, 0x62c9e3da, ++ 0x61617fcc, 0x9a289af8, 0x45ae73d4, 0x6bb5bf47, 0x674f019a, 0xc1137807, ++ 0xa44256ae, 0x70878700, 0x1e2bf689, 0xe19139bd, 0x0ca5b889, 0x0bd51dfe, ++ 0xb4394326, 0xd6bd966f, 0xc8efbad1, 0xe3dd81a5, 0xd3e3e12f, 0x7ec14779, ++ 0xe4812a7e, 0xafac2286, 0x00e5544a, 0x7435d7dd, 0xc677e1a6, 0x328fb5ff, ++ 0x3ff9577e, 0xd41a7338, 0xf18c7e7f, 0xfb077c11, 0x38579d25, 0xcc0feb11, ++ 0x983e5012, 0x9f123849, 0xcf9ccad7, 0x7a46f5f5, 0x8497f3a1, 0xc0dd0d68, ++ 0x0788b138, 0x5765abb4, 0x72b5efd2, 0xf675c615, 0xe3e557ec, 0xb20f2e1c, ++ 0xae0f2a45, 0xa40796ed, 0xde81c99a, 0x3b00aef5, 0xe7c1c9bf, 0xa5fe029f, ++ 0x03701afc, 0x583ecaff, 0x43fab9ff, 0xf943dcef, 0xe5485cf6, 0x355cbd5b, ++ 0xcbee6df2, 0x53a0045b, 0xcb9edf23, 0x244a5aa5, 0x11e5a5be, 0xe5b736f9, ++ 0x555722df, 0xea2e3e38, 0x272aaae5, 0x51a7837b, 0xdd108e4e, 0xfd24e511, ++ 0x7a32463b, 0x874aa3d2, 0xffe5fd2a, 0xb42ae8aa, 0xaa74a827, 0x9d1761d2, ++ 0xc3d874aa, 0xa383a33e, 0xa06efeb1, 0xdf04ba09, 0x89ed196e, 0x3eec4d85, ++ 0x46f77e8e, 0x978474bf, 0x5239b717, 0x38bf46f1, 0xc8683e6d, 0xbded0c87, ++ 0xd0cfbc86, 0x97c86fde, 0x3617daea, 0xd208521e, 0xced75841, 0xf269f4bc, ++ 0xac738471, 0x34950fba, 0x4002579c, 0x153bfd1f, 0x0af27f90, 0xfd807012, ++ 0xf688af70, 0xe30a0ec3, 0x8e9c74d5, 0x00c181fa, 0xacab2395, 0x19d9bcec, ++ 0xb906acaf, 0x74eae1d7, 0xcade42c6, 0x5f0ee3f4, 0xa34633a7, 0x12689e67, ++ 0x04b76e51, 0x7648b4c9, 0x20b3ba11, 0x6f485b3c, 0xda1eccf5, 0x99eec511, ++ 0x29ed166f, 0x5a9ce14b, 0xb9287a21, 0xefcb0590, 0xbca98276, 0x1df069a3, ++ 0xc2f969b3, 0x3d764537, 0xc94af013, 0x69c5f39a, 0x4138d812, 0x75bb7b80, ++ 0x9bf32748, 0xc16379d8, 0x9f74c8ba, 0xb6cbbfcf, 0xbe40512f, 0x47c273d2, ++ 0xdaaf7b5a, 0xa1b56e4f, 0x9cfbe9bc, 0xdcf02a3f, 0xafab5f97, 0xd373f3f7, ++ 0x499caa67, 0x6728a925, 0xe70440e0, 0x6f9f2e77, 0x31de4716, 0xe3a1e29b, ++ 0x1ee048b0, 0x889342f5, 0xcf50b878, 0x20494dee, 0x98acf91e, 0x545ca274, ++ 0x7c06d5e1, 0xf2ef7574, 0x5fe76daa, 0x7a061e32, 0xe8c1f5d9, 0xb6da69a7, ++ 0x7b61fdeb, 0xbbcaff20, 0x9e901f29, 0xb3ef27ed, 0x63b93da2, 0xbce9039f, ++ 0x52efef63, 0x6efc861e, 0x3af1da33, 0x1a357df6, 0x8563aee8, 0x5de41739, ++ 0x2fe600c7, 0xabf7be50, 0xcfb82dd1, 0xa5fc44ae, 0xf9e20a48, 0x8f5fd342, ++ 0x85ff7dc3, 0xd02aba26, 0x90d9f623, 0xb55e4a8f, 0x63a1dda2, 0x7e1957ef, ++ 0x3d6ebffb, 0xa79efcc5, 0xbf6641c3, 0x618bf30c, 0x3d92f1f6, 0x0e5b9ee3, ++ 0x070de0f7, 0x7eb4f994, 0x8dbffef2, 0xf1da3906, 0xda8fd332, 0xe16796e5, ++ 0xc91ae31e, 0xf8a642b4, 0xea66076a, 0x6911f54b, 0xc8c0a4f2, 0x1bf97048, ++ 0x14ae53da, 0x9d895e1e, 0xc3e7ff5b, 0x3932f043, 0x045a08e7, 0xc7d7f758, ++ 0xb079003f, 0xa9748ccf, 0x685cf7ae, 0x972dea39, 0xffbcf75b, 0xa5707435, ++ 0x57c216eb, 0xfcffeeb2, 0x496ebe1f, 0x8cfce372, 0xce93d07c, 0xf9843ef7, ++ 0xce0f0e6d, 0xfde90af7, 0xf46bffd9, 0xbbc532fe, 0xdeebf2f3, 0xef16bffb, ++ 0x78e5ce6f, 0x401f8177, 0xe1bffec9, 0x9cabbefc, 0xd2ffcbfb, 0xfd7aabf5, ++ 0x63ee4c6f, 0x34fdb4a9, 0xc5076152, 0x83a2d6e2, 0xdad2a66f, 0x143ff4df, ++ 0x649df303, 0x5351d7b8, 0x4fcecca7, 0x877ee093, 0x04624b8e, 0xe7642e7e, ++ 0xbf5c7ea9, 0x1b24b7e8, 0xfd7e90f5, 0x04fa867f, 0x7095dc91, 0x949bf92f, ++ 0xb1f41ef9, 0xf9ef6920, 0x91baef21, 0xcae7f5e7, 0x85e205a7, 0x297ed32b, ++ 0xfa0c3fdf, 0x22feff6c, 0x4534bbea, 0xe735f73d, 0xa85e5634, 0xb73dcee8, ++ 0xa0e7f5ba, 0xf3fa71a9, 0xdfde14d2, 0xffcd84cd, 0x0c10bb66, 0x1a4c3852, ++ 0xd81c44f0, 0x950d274d, 0x53f34089, 0x9c257f89, 0xf5d8a62f, 0xfb859dfd, ++ 0x70ddb1ea, 0x245f6fec, 0x034c5d01, 0xb40c747d, 0xfef9654f, 0x2fef0901, ++ 0x8b7a3eb8, 0xfb84917b, 0x0954ff6b, 0xd9639be0, 0xae127f9d, 0xce023daa, ++ 0x1336eae3, 0xba4b21ca, 0xbc33f480, 0x51fcc24a, 0xe02c6b93, 0xaf0dc667, ++ 0xc0465b9c, 0x9855eb6e, 0xf663e822, 0x5d2e6ff7, 0xe701909a, 0xfe07f67b, ++ 0xf3d3b784, 0x126a82c0, 0x5a70a28e, 0x74409128, 0x055dd82c, 0xeece91f2, ++ 0xdfc3cfaa, 0xfddd094d, 0x6f7dae5c, 0x4eaffbf4, 0xf2fca15f, 0x764250d1, ++ 0x6af78a43, 0x9ea85ecc, 0x626faedf, 0x42392af0, 0xbdd88382, 0xdcd3e8be, ++ 0x6644fd53, 0xfe57e076, 0x3818f2fc, 0x18ec4d37, 0x38f8cd19, 0x7239f99d, ++ 0x7102f4bd, 0xc0ec7b47, 0xf1a383c7, 0xe8b0edfe, 0xb737e488, 0x7ee79f95, ++ 0x340dfe05, 0x1525a8ed, 0x48179c22, 0x0311da27, 0x25b216b5, 0xae457f82, ++ 0xc374e26c, 0xc4ff46f1, 0x600fb80c, 0x9fa42fe3, 0xd6f16b46, 0x348cfd36, ++ 0xe01e27ba, 0x7dcd23ef, 0x5f0b3fc8, 0x7c023f38, 0xa65b5ab7, 0xfbf022fa, ++ 0xcfbf398f, 0xda35f838, 0xd53446dd, 0x477e8098, 0xf7749ad4, 0xae658b7b, ++ 0x3491a7f7, 0x838cd798, 0xe03a4756, 0x01e8b0e5, 0xa692c57f, 0xc23f8af3, ++ 0x9e1194bd, 0x73d83fd0, 0xc70bb243, 0xe68723dd, 0x7cf75c03, 0x4e70216a, ++ 0x1454addb, 0x10e79a44, 0x42e79b33, 0xf4707a12, 0xf079ffc0, 0x0f61d89d, ++ 0x4e73824f, 0x6ae7e12d, 0xa411fd23, 0x24750be3, 0xce1c7208, 0x2e172045, ++ 0x47dc13d4, 0x067e4828, 0xefca3ce7, 0x09dad3df, 0xf1dc6eae, 0x8a7fd82b, ++ 0x9817049b, 0x16a58bb8, 0x2582ec05, 0xc822318d, 0xeab754fb, 0x351ae9cf, ++ 0x2117c34b, 0x1d784259, 0x5ee7bf1a, 0x36b3f718, 0xe87ec085, 0x09d3ad7d, ++ 0x4d67c5fb, 0x7a0f9063, 0xcbafd75b, 0x1914fe48, 0x5fc821fa, 0x59187a46, ++ 0xdfcba51f, 0x02fbfa20, 0xb730cd7f, 0xc044f12c, 0xc30a9ddf, 0xb7cb15df, ++ 0xf267ffe0, 0xdf2a98ed, 0xeb4fa2fc, 0xa6e1cb97, 0x91896f91, 0xc162dbe4, ++ 0x5f70089d, 0x227077bc, 0x9bf175e0, 0xf9247c72, 0xdd8cadb6, 0xfdc4bdb3, ++ 0xa81a3b70, 0x234ebb7c, 0x7ca81adf, 0x208fe08b, 0xdf285729, 0xfe1eff82, ++ 0x2df206db, 0x15137ac2, 0xf2a83fb6, 0x09d3746d, 0x1ba36f94, 0x52ff3a4c, ++ 0x7eedc2a7, 0x2137cabd, 0x61e8167e, 0x2d8f6587, 0xe36cfd02, 0xdc4bdf7a, ++ 0x01c60e2f, 0xe2bb7739, 0x54aff1c2, 0x54ae79ce, 0xe09bfdce, 0xc5b9caac, ++ 0xd9fa093b, 0x2643a4f6, 0xa6ef16e7, 0x7a004e72, 0xf16e7264, 0x3fecc25e, ++ 0xbc36f906, 0xd8237c87, 0xbecc38be, 0xf81c692f, 0xbfb47de4, 0xb1ecaf34, ++ 0xdd69f6d0, 0x56ac6ef2, 0x48aeddde, 0xf21ee708, 0xc995f0ee, 0xde5c9dbb, ++ 0x08363951, 0x3e91abe4, 0xff7a4d3c, 0x4ee33de5, 0xf81affd5, 0xde2277e5, ++ 0xb1351d73, 0x8fdf88fb, 0xf40e953b, 0xf930ab55, 0x5fd394bb, 0xfb00597b, ++ 0x5b1afc9f, 0xb33d515f, 0x303716bf, 0x56b8b0fd, 0x3fe9ba0c, 0x5aff8ea7, ++ 0xede7f981, 0xcd224815, 0x6c5734cf, 0xfe1e83b4, 0x1eb84c82, 0x43553d3e, ++ 0x0b320b0f, 0x6e5c8ed0, 0x94266e75, 0xc448178f, 0x02e2f602, 0xa033d4fb, ++ 0x32641707, 0x2f0172fb, 0x552afd57, 0x7de352ff, 0xa2e3767d, 0x9e91fa37, ++ 0xcc33f6f7, 0x9e33af0c, 0x07e08213, 0x3f1ef3d9, 0xa0a17288, 0x89be5f4e, ++ 0xd8a67faf, 0x6f22f082, 0x112d9e89, 0x119367f8, 0x9c39874e, 0x70745c28, ++ 0xe1110a0a, 0x3d3d3144, 0x2e1ba135, 0x596bbf79, 0xbce6760d, 0x4bde024d, ++ 0xc2add71a, 0x157eb8cd, 0xb53daa8e, 0xd397f780, 0x64ef8354, 0xe151708c, ++ 0x1747846c, 0x78f00ddc, 0xa933955a, 0xc9f80c64, 0x3941ba50, 0x112ff813, ++ 0x137c2bfd, 0x73deea87, 0x3ff970d4, 0x64e262a6, 0x099f4eb8, 0x3eb4cd7e, ++ 0x1bd16abb, 0x631e14c9, 0xc1a773df, 0x78c37a76, 0xfdee1fb3, 0x513b5ab6, ++ 0xf874aa0e, 0x66c3a715, 0xbe9ecfde, 0x3cf093a5, 0x40b828d9, 0x5b09290f, ++ 0x9425ae11, 0xc9b4ad1e, 0x4e5f4da1, 0xe17570e5, 0xbe469d7b, 0x983c513f, ++ 0xeea4dce0, 0xbef64157, 0xc3134c67, 0xc31d494b, 0x44e93a4b, 0x95717efb, ++ 0xf5d309e0, 0x422e3714, 0x3e5566bf, 0x16bb3fd3, 0x57e8114f, 0x04bf448a, ++ 0xdd199a8c, 0x6f0166fb, 0xf15cc337, 0xcc1bdc0e, 0x8351fca0, 0xf7ff4864, ++ 0x397df42d, 0xbe23147f, 0xb974e0be, 0x076ae00d, 0xfd3275f8, 0xbe35fc2b, ++ 0x4beb51fb, 0xae0e80a4, 0xc8ba9f93, 0xe0af6fe8, 0x174bfb06, 0x699e80dc, ++ 0x6e1558fd, 0x8780cf40, 0xf2112ca6, 0x7dde14d9, 0x2f5cf606, 0xf969bfdc, ++ 0x09ef6f3e, 0x8233ffd6, 0xf7584487, 0xefefa677, 0xf1bdd748, 0xfa0657fb, ++ 0xf3b5bdfe, 0xefa018c8, 0x3df202bd, 0xddd18a69, 0x999a25a3, 0x4ad5b15e, ++ 0x6fee00f9, 0x9b3d94de, 0x83e53ddd, 0x0ce0ccc5, 0xc6b709e7, 0x2c0d72be, ++ 0xeb17fc04, 0x867fe82c, 0xf4c418f3, 0xdebcad55, 0xb3f12566, 0x3fef7bd2, ++ 0x9bdff781, 0x47e6a4be, 0x472078c1, 0xc378e91b, 0xee33c7bb, 0xe0fdaa17, ++ 0xfc1aeb72, 0x1d4bae4f, 0xe7fabbe7, 0x00895094, 0x9faa2ff7, 0xbfc9924e, ++ 0xfd7b865c, 0xf7a48269, 0x78e4eb77, 0x4ffba7fe, 0x7fa5be51, 0xbdd16492, ++ 0xb459bcbf, 0xdb850093, 0xf9195e67, 0x6f196a85, 0x63fd804f, 0x6907dd12, ++ 0xb191d9f2, 0xf587deef, 0xdce7de22, 0x453ebbf1, 0x0775df70, 0x7722c9f3, ++ 0x3fa80aa4, 0xc6ce851c, 0x216e1e81, 0x921f335e, 0x1f5e67d6, 0x12778413, ++ 0x9315b5a9, 0xd3af94dd, 0x90e582ea, 0xc677267a, 0x35f01efd, 0xaf802451, ++ 0xc99f6f66, 0xf83effb0, 0xab854909, 0x6027aa5d, 0x4987693f, 0xef1bb43c, ++ 0xcce3c78d, 0x8fcf86b8, 0x37e745dd, 0x71e888ee, 0x0f3376d3, 0x67c0edd9, ++ 0xc44dabc3, 0x78cb81af, 0xbb072c12, 0xde93b8d3, 0xe41e40bb, 0xde07bd52, ++ 0xd536e42b, 0x5f213b94, 0x25f7e02d, 0x2754ff01, 0xaab6df9d, 0x05af53f3, ++ 0x41db40b9, 0xacd52537, 0xe0ad495d, 0xecd99701, 0xdfe8f5a6, 0xe02b5d92, ++ 0x416db883, 0xbf585881, 0x77ed0b41, 0x3efd355b, 0xfa2ff61d, 0x7b5bf43d, ++ 0x205dd8fe, 0xf13ce877, 0xff767afb, 0x73bf4d9b, 0x2ed49f03, 0xaaf2fec2, ++ 0x2aef0205, 0xfed9eb72, 0xf6447b94, 0x81c37d40, 0x4eefb84d, 0x0f25e3a7, ++ 0x3c28fd84, 0x8ca7df05, 0x2ef85c11, 0xe50536b0, 0x182c074a, 0xc01dc83e, ++ 0x9e05e3ee, 0x551fe7e7, 0xccc4fbff, 0x3db384fc, 0xb43e95cb, 0xc667df9f, ++ 0x3d21340f, 0xdd7bc79d, 0x7ede1493, 0xdca3ef0a, 0xe650e23f, 0x668b4ac7, ++ 0x0659347f, 0x682ffd23, 0x037e889c, 0xfd0f890b, 0x638c6606, 0x375be77a, ++ 0xef60835a, 0xecee4b7b, 0x6e87e50f, 0xfb796334, 0xdb872636, 0x7da0b407, ++ 0x4cb554f7, 0x79453de0, 0xe27288b5, 0xef8cbd54, 0xd867c540, 0x36ce797d, ++ 0xaa1c87a6, 0xaa9efd66, 0xe4dbfa63, 0x15307e67, 0x2d9ce1f6, 0x2aa8ddec, ++ 0x6873d5a7, 0xb74f2bb6, 0xace519bf, 0x388b872a, 0x6a2b723c, 0x28d6def0, ++ 0xfdd48b77, 0x8b6f20d0, 0xef173ee0, 0x47c8c36d, 0xbfa32145, 0x5cfbbd92, ++ 0xfe10f403, 0xf8bbe91a, 0x5ce04c88, 0x36dc7c23, 0x60a3fd15, 0xe3f5a7bf, ++ 0xdc2f049a, 0x67bee7a3, 0x1e3ea20e, 0x63f79acc, 0x37de67d8, 0xd0827813, ++ 0x72a0f80a, 0xf9dcd32a, 0xf96827e7, 0xf016a399, 0x93f4a144, 0xfd57f085, ++ 0x30b7d34e, 0xa3f4923f, 0x7ef00995, 0x83e94c95, 0x4aa72072, 0xdc8d7e24, ++ 0xef782338, 0x0fed87ba, 0x697fad2e, 0x0d9152ba, 0x85ba6cfb, 0x16f747c9, ++ 0x7f1fdf19, 0xf447cfc0, 0xa17e80bc, 0x27d7bb79, 0xc87a1a28, 0x813ebbdb, ++ 0x9ab20e8a, 0xf3945ffb, 0x0a79cb77, 0x9f6f271b, 0x8cd1aae0, 0xf6a3f6a3, ++ 0xdf66ecab, 0xd2cbde0d, 0x83cffade, 0xbf3ae1f9, 0x186e4050, 0x7e31e9fb, ++ 0xfe64fd2f, 0xbc2562f1, 0x4b7ccf33, 0xcce9e744, 0xd60fa78f, 0xa9a827de, ++ 0x38ce676a, 0x0d5e2266, 0x1cff32fc, 0x7c1abc45, 0xfca58c37, 0x7b77f14f, ++ 0x1ae7d323, 0x8a509ec6, 0x02ef31d2, 0xf6e62f7e, 0xec29e2e8, 0xf521a89e, ++ 0xffe04ae8, 0xd202e9e9, 0x95f80903, 0xbfa8713e, 0x39ffc1b9, 0x9f7d9d27, ++ 0xbe07bf43, 0xf8c4d86c, 0x370bca94, 0xeae293c8, 0x7db153f5, 0xfe86e0ad, ++ 0x50b26a1b, 0x14cdc92f, 0x9ed7d609, 0xb7293d40, 0xf01c44f1, 0x4adfe533, ++ 0x278a07d0, 0x8e205d98, 0xf954be55, 0xafee2dfc, 0x51ae2c4c, 0x35605ef0, ++ 0xfe045530, 0xae108f16, 0x2cbe32b7, 0xfb7c64c9, 0x561936d6, 0x8e7c2578, ++ 0xb1f2ad7c, 0xde9c7c08, 0xaa87c7cd, 0xd7c02b27, 0xfa0282a7, 0x39064c6b, ++ 0x55be7c00, 0x7a619bf5, 0xf9f295ec, 0x22ccf4e5, 0x5fb0bfca, 0xf2ae7caa, ++ 0x9b9f91b5, 0x305996a5, 0xb46f078f, 0xdf263ae2, 0x079dfbb4, 0x7bc2bc99, ++ 0x2d37c9be, 0x98f9004b, 0x21bf312d, 0x1245ae15, 0x31eb33f3, 0x4ae5caaf, ++ 0xcfcc95f2, 0x66ad8f30, 0x03e4bdbd, 0xa7f30c73, 0xee9195ae, 0x3d9fc72f, ++ 0xf90aecf8, 0xeaf94af3, 0x8ea9fc72, 0xf7d5ee2f, 0x710001f3, 0xdafecf6c, ++ 0x14c31c29, 0x7fa9bf8e, 0x3f4dfd0e, 0x0cc4f17d, 0x1ec143c0, 0x5f40e74a, ++ 0x06120ef5, 0x71052739, 0x106fcadf, 0x2b8fe8bd, 0x72ee3385, 0xf998f968, ++ 0xe4bc150d, 0x7fca7a40, 0x4e9c1cd9, 0xf5dfcfbf, 0xdff468f1, 0x7e89d158, ++ 0xb9178150, 0x19681cbe, 0x2f907c0d, 0xa325ff31, 0x30b3c85c, 0xb76db9fd, ++ 0x4fac366d, 0x12f163a8, 0xcb7743f2, 0x853dcd66, 0xb8e322df, 0x27de1db4, ++ 0xc31d2806, 0x9f98527b, 0xeabe9df6, 0x95b6d4b7, 0x46fc89c9, 0x17710839, ++ 0xb476ebf2, 0xfe6aff83, 0x7fb4667b, 0x479dd495, 0x2fc9fcff, 0x4afb436d, ++ 0xbba8a349, 0x2fe1eb87, 0xcd862758, 0x50d6e7e0, 0x3486f784, 0x21f3027f, ++ 0x1df79fee, 0x5e0ad9fd, 0x402bbbda, 0xebf05841, 0x5f209c17, 0x716f36ce, ++ 0xbf69dc02, 0xdbbfeadf, 0xf4303fc3, 0xbc0ff728, 0x73c114fd, 0xc0ff644d, ++ 0xca0ff0b3, 0xf4584f28, 0xaea481fe, 0x7497ea0f, 0x08be199e, 0xfa5d1ff7, ++ 0x9e2fb6f9, 0xb6f6ff05, 0x0b3dcf97, 0xfbfc2ef3, 0x3f82cf67, 0xc567d912, ++ 0xc5e4af7d, 0xb81fd1b7, 0xf7c1dceb, 0x2fadf6bd, 0xfb753fa0, 0xf40f66fb, ++ 0x54f7bed6, 0xb5a5f80a, 0x013af8ef, 0xf64b99ec, 0xdef68cde, 0x27273b25, ++ 0x86fb0892, 0x06fd029a, 0xdb9fc0af, 0x0d43b788, 0xea6fd087, 0x90778a53, ++ 0x9f7e5d83, 0x4fe622a1, 0x9efee6eb, 0xe7fd91f5, 0x3677f87b, 0x8dc775dc, ++ 0x981bff20, 0x3f59793e, 0x9f1463cf, 0x1e015dd7, 0x6f3fb9eb, 0xf56ff6e8, ++ 0xfe14fcf3, 0xc475f141, 0x1a2fc780, 0x29f2fe16, 0xd3e86ba8, 0xf8679fab, ++ 0xfaa7e00a, 0xbc5957e7, 0x8f805aef, 0xfa15fe5e, 0xa6fe02d7, 0xfa3f61bb, ++ 0x37de0522, 0xe73b969c, 0xb9d3fec2, 0x63f18cd7, 0x8bbef7f2, 0xf3bed4fc, ++ 0x09a9da28, 0x276f93f7, 0x9fcc7f5d, 0xadebe059, 0x50ff3075, 0x1ff0078e, ++ 0x9cb13b75, 0xba3289fb, 0x7b47fd56, 0xb68d1bf3, 0x7d5bfd32, 0xfb545037, ++ 0xecc7f701, 0x09909bc6, 0xadf13af8, 0x1c2ab97e, 0x772e5c5c, 0xf64745fb, ++ 0x8bf2edd3, 0xf00de036, 0x9754fb09, 0xf7cd33df, 0xc93b434f, 0xecfc91bb, ++ 0x3f986bdb, 0xf91cbb75, 0x27eaaafd, 0xf835651d, 0xccaf0747, 0xeb72fa3f, ++ 0xfa70aef8, 0xc68a506f, 0xdb5784f6, 0xfbe59137, 0x0ff0ab28, 0xdebbef9d, ++ 0xc60a14df, 0xad233df7, 0xe48fc163, 0xbb33da04, 0xbd7cdfce, 0xdefedc6d, ++ 0x7e88a2f6, 0x8743abb3, 0xe51bbe50, 0x01c43147, 0xefdf3089, 0x3716f9f1, ++ 0xeda3fdb2, 0x4ed04765, 0xb83b69fb, 0xb8bae91b, 0xedfa04fe, 0x6bf751be, ++ 0x3fe345a5, 0x5047fb01, 0xedb69eb3, 0x3ca34607, 0x8c46f1e7, 0xc7cedce3, ++ 0x3c8a6929, 0x79fd494e, 0x810538dd, 0x5fb2e290, 0x92b3bc7e, 0xefe86ef7, ++ 0x13d3336c, 0x69c486cf, 0x799fde91, 0x0fbf32ac, 0xdd2960ab, 0x8aae3147, ++ 0x1151c583, 0x77a8519d, 0xbe64712e, 0xa9071d17, 0xe543fe82, 0xd1bfb9cb, ++ 0x80493c4f, 0x6dc772ef, 0x0abbe604, 0xffb1abe0, 0x013f2ec8, 0xf24e557d, ++ 0xc1dd83a5, 0x38947728, 0xf06a0913, 0x2d31c4bd, 0x22f78dd1, 0xcf80fee1, ++ 0x64a7a9e3, 0x8343f7e8, 0x8943eafd, 0xf3a44eac, 0x782030fb, 0xc97ed396, ++ 0xf00f1f37, 0xdff67a39, 0x223c37a5, 0xc54decea, 0x70e3cee6, 0xadfb215e, ++ 0xee211f78, 0x8a3c62b3, 0xb8ad6792, 0xbf3b43de, 0xeef51e7a, 0xbb099a5f, ++ 0x1aa7a21f, 0x62e58388, 0xf9da9c7d, 0x057fb3d5, 0xa63e1abd, 0x4b3ce7e3, ++ 0xa279c3db, 0x9fe786de, 0x47a3978e, 0xffbcfea3, 0xd72019e1, 0x1e8c6c72, ++ 0x0c4a5e73, 0x5afed396, 0x75be59e3, 0x7f8c00db, 0x03b2f050, 0xed0f18fd, ++ 0xf618a57c, 0x6c97f6a9, 0xda4066e0, 0xfffd73f7, 0x535e3c57, 0xfad6ec95, ++ 0xc911e733, 0x52677dad, 0x8f567900, 0x2ff055ef, 0xd811f383, 0xf1a31ab1, ++ 0x8bd50a7d, 0x2a7cfd75, 0x41e43e77, 0x65f40e3a, 0x7dc272ef, 0xdb181e41, ++ 0xb91bf5a9, 0xd3312dbc, 0xedddecef, 0x6cce944b, 0xcbe8af96, 0xb63349e4, ++ 0x73a54e7f, 0x5fb3df5e, 0x3ac6bed6, 0xfd4ed748, 0x4bc798be, 0x76efd231, ++ 0xd9dfc0ab, 0x48eaedfe, 0xcc2240f1, 0x247fcb1f, 0xf4098090, 0x8c561d96, ++ 0xfdef0503, 0x977e8fc1, 0x0abfeec2, 0xc78c619d, 0xe3cb87b2, 0xc630a8c2, ++ 0xe7cbe987, 0x4f21ed01, 0x01db2d2c, 0x58af45ef, 0x2a17c409, 0x02f0efda, ++ 0x7d768bbe, 0x3a74fad5, 0xd0d9c9f8, 0xffb457ae, 0x8a0e903f, 0x18b9e1cc, ++ 0x99876d6f, 0xb6b63c40, 0x00a66f1d, 0xe1c9b6bf, 0xb96fd894, 0x990a2bd7, ++ 0xf9d4eff5, 0x0596ce3a, 0x7e3bc087, 0x7e67fdf5, 0x1cc6722f, 0x3febf4c5, ++ 0xad47bd5a, 0xb8faefc8, 0x1acb6743, 0x83df6b07, 0xcb23bbe7, 0xf2ac4fc5, ++ 0xedc7273f, 0x7e51de3d, 0x94f9f302, 0x01802734, 0xe3ea98b2, 0xebf3cf20, ++ 0xfb028fce, 0xea5187c1, 0x3477797b, 0x2a1f47ec, 0xfe40a39d, 0x39d2987d, ++ 0x9ccfbb4a, 0x25b8b32e, 0x983aed19, 0xcf9cd476, 0xafc04bee, 0x923b3ad1, ++ 0x6acafbdc, 0x3fe47843, 0x7a46f362, 0x31452987, 0x63056aba, 0x171b3c40, ++ 0xf71d43f8, 0x72882543, 0x1b944578, 0x07fbf3eb, 0xa82f2815, 0x0b583ddb, ++ 0x02a93c87, 0x453e51db, 0x4a91e678, 0xbf235d25, 0x96f2f1d5, 0xbe12ddda, ++ 0xbbfe9777, 0x6ec55e8b, 0x5911a33c, 0xee8f0f13, 0x566768b8, 0xb2482bdf, ++ 0x53f002cf, 0x8925cf88, 0xc8152a40, 0x842451ef, 0x5daa9da9, 0x2956fe2c, ++ 0x9a793901, 0x1d83efdf, 0x786ed20c, 0x1fb9432d, 0xd0c84018, 0xc0bf1081, ++ 0xc0d2ed1d, 0xeb2e062f, 0x52cc7ce9, 0x62f26129, 0x4ff40bba, 0x9727e021, ++ 0x97953d28, 0x71660dd5, 0xde178825, 0x4b0aa1c7, 0xbd74e7e7, 0x41e835f1, ++ 0x5c594e94, 0xb0489bbb, 0x0c7f005c, 0x08932796, 0xf6b6c78b, 0x7f3da23d, ++ 0x7c094464, 0x8e5007fd, 0x5ff749d9, 0x5883cd27, 0x1e5b7905, 0xb84cf7fd, ++ 0x48bbb39f, 0x9b43f418, 0x346d849d, 0xce948fb5, 0x99dff96a, 0xba1af34e, ++ 0xd7d04d74, 0xca82f91b, 0x21b8c335, 0xf7ed1f84, 0x9fbf4373, 0xfcfdfa1b, ++ 0xe155fadb, 0x3c196254, 0xac1ce210, 0xb8710b2a, 0x1c2cf1b1, 0xc33e146e, ++ 0x311c6e21, 0xbdf87945, 0x8a35c239, 0xed0cc6cf, 0x45975e29, 0xfd38440d, ++ 0x275f7a34, 0xb892e5f8, 0xe1e7022a, 0x3f1a8295, 0x9aecf892, 0x82cb88ef, ++ 0x1f28f87c, 0x77a71967, 0xcf7d9df5, 0xbfd456f6, 0xf6b7b47a, 0x722a3ed6, ++ 0xf36f477b, 0x4f9e45b1, 0x57fd2f4c, 0xfff622d8, 0xf152e55d, 0x0f7f77fe, ++ 0xf25dbbf7, 0xaf4145c9, 0x459733d7, 0xd3199e81, 0x2c16f7fa, 0xa5a67a61, ++ 0x51df1ebf, 0xde94df40, 0xcbe886a2, 0x8112748d, 0x74c9ecbe, 0xf1f0f7dd, ++ 0xbd8479ee, 0x20e9528b, 0x4a6faf8b, 0xbf27bb2d, 0xe3b3096f, 0x17a363d1, ++ 0xf5e5efea, 0xfd3155f7, 0x4447bef1, 0xc63587bc, 0x9ff13a4b, 0xfdc3ae2c, ++ 0xedf94050, 0x3042a5fe, 0x1c52303c, 0x862c7228, 0xcf8f3bf6, 0xc95718c7, ++ 0xd753dc4f, 0x2ae2918a, 0xdf54ba31, 0x29e3197b, 0x1e3e202c, 0xfe5f4b2f, ++ 0xc98bab77, 0x54a82961, 0xc7deec8c, 0xdd29eb02, 0xe949fe83, 0x44bfee1e, ++ 0x3897befe, 0x3dc7e615, 0xff27562b, 0x47770c2e, 0x5e4d7ec3, 0x562ee5e3, ++ 0x3b9c78be, 0xdf234631, 0x5d368ba5, 0xd972995c, 0x4df20493, 0x712d78be, ++ 0x2e543e53, 0x4d6e21f6, 0x915bd53d, 0x13cdc1f9, 0x149254e5, 0xb928b904, ++ 0xf407247c, 0xcf4618de, 0x6e257b6a, 0xf99e9744, 0x476ffd16, 0xe5f23c54, ++ 0x44ee45e2, 0xcd98e718, 0x49e81077, 0xfc7a6674, 0x10f49ef6, 0x5dd6c6d8, ++ 0xd81eeb0e, 0x8ae53d73, 0xf6fa83c7, 0x3c38aef8, 0x689f9816, 0x86ebbf76, ++ 0x2656fdf9, 0x09e98760, 0x20e9cf1f, 0xec10bfad, 0x62247e87, 0x3061f4f4, ++ 0x729f1abe, 0xa4afc42d, 0x1e4ac0fb, 0x8f2572cf, 0x8f18f95f, 0xc79aba37, ++ 0x67e154b5, 0xdc6054f1, 0xd610cb44, 0xf1c5c5bf, 0xf0e26713, 0x657ea3f1, ++ 0x7bc52a49, 0x34abab45, 0x48c7f10c, 0xc0afba7f, 0x08155db4, 0xd045c53f, ++ 0x63db499e, 0x9a790cde, 0x112355ca, 0x94ab920f, 0xedfad0e4, 0x801b7f36, ++ 0xc7d6ead2, 0x0d273457, 0x1b23dc32, 0xd3d2a9e0, 0xe3472626, 0xe1193d38, ++ 0x78b0a713, 0xf51d2aa6, 0x739587a6, 0x1e72dfff, 0xe21cae4f, 0x6cb8511a, ++ 0x5a62f328, 0x951be3ce, 0xbcb1f853, 0x7e78d307, 0xcb2f2cce, 0xf927fac4, ++ 0x365e5bbe, 0x3659d30d, 0x99c5cfb6, 0x00c80f4a, 0xecc258a7, 0xd20171a6, ++ 0x5730833f, 0x0a4bf853, 0xd5e43710, 0x3d5ac87b, 0xc92e887d, 0xfdcf1710, ++ 0xf2a9e024, 0xf704d94d, 0xefd2e2c4, 0x8aa3deeb, 0x6031bdb3, 0x7eed1387, ++ 0x9fcff601, 0xfce99e02, 0x6279d3d6, 0x1f4e599c, 0xac1d38ab, 0x28f1f4e1, ++ 0x33fa778f, 0xd38f274e, 0xdcbe4275, 0xac2bdec3, 0xeafcc69b, 0x3c4d52e2, ++ 0x68985c2e, 0x3c62d6fd, 0x75d0a221, 0xc6ed0ea2, 0x91fee314, 0x3f48ccf7, ++ 0x2bc491b6, 0xcb7bfd42, 0xa78e2c82, 0xddf6192f, 0xe76e3518, 0x1ccc7704, ++ 0x961b887c, 0x913c7c78, 0x239a5b9d, 0xf72cbbc6, 0xf9c0b41c, 0x1cf9b7bf, ++ 0xc08bb998, 0x21d7d978, 0xbf1f487a, 0x9a42ce6f, 0xfd5157b7, 0x3cd9fe9d, ++ 0x40558cfe, 0x020e55df, 0x3a76727e, 0x9d0d1cff, 0x23b17ad8, 0xeaddb49c, ++ 0x9f7e51b5, 0xc50a8a08, 0x06aa2fef, 0x14ce015b, 0x97b06ee6, 0xc97d906c, ++ 0xc4361720, 0x8cfbb644, 0xb9f3b1b0, 0x8e847d33, 0x2f652bce, 0x909ae77e, ++ 0x4a87e3a6, 0xa7628f2e, 0xab95d78c, 0xc6ce27f2, 0x3663f7f4, 0x4d1b2cff, ++ 0x214e2e13, 0xb8bdca84, 0xa3cb233b, 0x40095972, 0x51f2829c, 0xb205fe4c, ++ 0xf5a7a614, 0xed042f90, 0xc3fc17f1, 0x45bd8336, 0x8415b3a5, 0x6100b3c9, ++ 0xaeba8bfa, 0x28f7408d, 0xff485c77, 0x681f812b, 0xb0a21c5e, 0x99f7ad78, ++ 0x9abbbcf0, 0x9c63dbf3, 0xfe71d6cf, 0x97f039fa, 0x7aefe219, 0xe705fd30, ++ 0x43e04aab, 0x31b0ae9a, 0xcf18c87d, 0x0d25857a, 0xdb95dce3, 0xa49f284d, ++ 0x3b41cdf7, 0xc607a1e8, 0x20cec0b9, 0x7e5dd23a, 0x5ba7d407, 0x110f70bc, ++ 0xba02ee93, 0xe0b1d2f9, 0xbbf36faa, 0x78c7e8a4, 0x878f12ab, 0x2ebfc6ad, ++ 0x21aaefe7, 0x45d8363e, 0xb52b8c9f, 0xd9179c02, 0x2aac79d8, 0x4ee1032b, ++ 0xa6c6b1f1, 0xce240f39, 0x4e2badbe, 0x64ff7419, 0x9fb3ef2f, 0x87bd31b0, ++ 0x21900ff4, 0xc551391a, 0x7711e0e3, 0xc8d70c80, 0xa743158b, 0xf523b012, ++ 0xc8bd1394, 0x6e4c2dcd, 0x3f7c0b96, 0x9cbde032, 0xe55727c7, 0x8f7804a6, ++ 0xd56c1f10, 0xef74d355, 0xf72e64c9, 0x6deaed8d, 0x9ab65cec, 0x42fd3a78, ++ 0xa70a7acf, 0x949c2d7a, 0xcebadbb8, 0xb08bdfc5, 0x3c7ca30e, 0xc826fb0d, ++ 0x718fc91c, 0xee281652, 0xdc81c727, 0x8fe62ff9, 0xa15e9bd3, 0x3173978e, ++ 0xeca5f70f, 0x5f50e38b, 0x15baadc8, 0xb70243f7, 0xe3f79a00, 0xe47faaa7, ++ 0xaa9ebc04, 0xd5b3f7e2, 0x63fc1072, 0x2aad554e, 0xd5857cc6, 0xf899380d, ++ 0x884e658b, 0x59e0b32b, 0x4f6bef11, 0xd0520547, 0x4b9bf0bf, 0xff8d4497, ++ 0x359af2c5, 0x0b874029, 0xf7c1af36, 0xbd63a77f, 0x3c9a7cc3, 0xbea37749, ++ 0xcb9bc6a8, 0x05ecce7e, 0x7a37af7d, 0x6c8eaecd, 0x7f87284f, 0x3c4c1e82, ++ 0x3dcf41c3, 0x19df1ce0, 0xfd3ff8a6, 0x9dea2b0b, 0x1da04ae5, 0x6d9be5f2, ++ 0x8f2905f0, 0x64bf1c8d, 0x77e6edbb, 0xb76cbe40, 0x94843f79, 0x3ef163d8, ++ 0x61fe77a1, 0x2d82b7e3, 0x9ef5ee17, 0x285c71e2, 0xecea669e, 0xaf5eec7a, ++ 0x8869db95, 0x28fa97a5, 0xa5eeef5e, 0x70fcc9de, 0xfd722b88, 0x18df6c3f, ++ 0x20fce3d9, 0x50fce1d8, 0xfbf56e75, 0x53b7a258, 0xdfe7e19f, 0xc16d9b05, ++ 0x92f41115, 0xe51dfc05, 0xa31f7e02, 0x2e99e3d2, 0xb1d18ffd, 0x4a42ff3a, ++ 0x068f4897, 0x185e17ba, 0xd9fe7485, 0x37f71961, 0x311b85e1, 0x45f14d8e, ++ 0x42ffca2b, 0xf838f3d1, 0x44b793a7, 0xdf0783e4, 0x71f78b1c, 0x9a78866d, ++ 0x4f4cec63, 0x8becd351, 0x397d3a05, 0x015f383b, 0x62fb227d, 0xb013e331, ++ 0x8161839f, 0x5131bfc4, 0x1e3cf4e2, 0xba998fbe, 0x69cbb682, 0x2644fc61, ++ 0x3ed18a04, 0x80f3635a, 0x1f48cd1d, 0x9d6eec63, 0x4b4e635f, 0x1ecefb21, ++ 0xff1a7120, 0x2e3c0585, 0x1645ce7d, 0x02b8923f, 0x88f80924, 0xfa6ebfcb, ++ 0x6e0fc7d7, 0x307a3133, 0x5f0a77ae, 0xf5ae94e7, 0x7acbd0de, 0xe5eb626f, ++ 0xcb4e49fa, 0x9ebac338, 0x5d69171e, 0x8099ebdd, 0xbc790bed, 0xc31342e7, ++ 0x645f5abb, 0x4d5e7267, 0x1366cb5b, 0x79a7952f, 0x7664fe3c, 0xe40541f0, ++ 0x4c757648, 0x6759a0ac, 0x3abdd54e, 0xaaec9b3f, 0x96538c2c, 0x3ca59d53, ++ 0x2edbe1a0, 0x3a3c053c, 0xbbad153c, 0xd274f116, 0x07639be6, 0xe8be7cfe, ++ 0xf40957a1, 0x5a76f0cb, 0x452e8c09, 0x33a0f739, 0x229d3bd2, 0xed58dbc0, ++ 0x86de387c, 0xed48c804, 0x918ba97b, 0x6eb67de3, 0xee087829, 0xb1375beb, ++ 0xcbbd2ba8, 0x34f8c8b3, 0xc72d71c2, 0x52b69aa3, 0x457fc23d, 0xe756bc70, ++ 0x1c2bd5ef, 0x3855fe39, 0x0f54e5a9, 0x60720e5c, 0x58ecf02d, 0x15dc6fe8, ++ 0xfc7bafc1, 0x77bdbc09, 0x8f9026d8, 0x9f031e54, 0xa7fe799e, 0x6ddfb5a3, ++ 0x19fc4db7, 0xae2a438c, 0x64d05eec, 0xbc046ff7, 0x0e792606, 0xb031f9c3, ++ 0xd394f459, 0x3f45e775, 0xd5c61ed5, 0x55d3f7ea, 0x83878765, 0xacbcb89d, ++ 0xeb995319, 0xbbf40477, 0x7eae2c81, 0xbb5d78a4, 0x2aaedd39, 0x2e76666b, ++ 0xc0b8804b, 0x5f18499e, 0xd063d392, 0xf5d927ee, 0xfb22897a, 0x5467605d, ++ 0x596f3bf8, 0x981daff2, 0xb8f2e70e, 0xbe0680d4, 0x3c59d8af, 0x074975af, ++ 0x363f605d, 0xdec1fed3, 0x5d2fe960, 0x5e29d9d0, 0x28381693, 0x5a61a9dd, ++ 0x2bc848a3, 0xb9b76808, 0x5cdbb060, 0xae23cdd0, 0x35d76759, 0x38b245c2, ++ 0x2247bef1, 0xe1c75edc, 0xc94efea1, 0x2b872e1a, 0x236fddb9, 0x8286fbd8, ++ 0xfdc4ea9e, 0x2655f56e, 0x48b1ce76, 0xdc068718, 0x12bda090, 0x0561d6cd, ++ 0xe708b17b, 0x1de6308c, 0xc447b110, 0xe40267d0, 0x805b8863, 0x5e121f7c, ++ 0xc7737a0d, 0xa08796c4, 0x7fd5917c, 0xcbe1e814, 0x02e3e6e4, 0xfe7d7fd8, ++ 0x55ce01ab, 0x4dd52062, 0xec52ffdb, 0x2976854c, 0x58bdeab4, 0x7e055e96, ++ 0xbdcd7ee1, 0xda978b12, 0xe67b179d, 0x192a5aaf, 0xb9be59ee, 0x47ff5b5a, ++ 0xe805b7ab, 0x357bf8cc, 0x280b1f71, 0xaab19eef, 0xdf0f99fb, 0xf1c37d37, ++ 0xf401f489, 0x03e99875, 0x74772417, 0xba1fb32c, 0xc9d9d35f, 0x34d7ee2d, ++ 0x3cfc49e3, 0x15e94b56, 0x3a5403ee, 0x4d792219, 0x2b434f40, 0x2e96b968, ++ 0xb17de822, 0x1c1b0c76, 0x9d453ef1, 0x006fbc1f, 0xa7178a78, 0xa46a3ee2, ++ 0xf65d3d8b, 0x367bf657, 0x93c25473, 0x0c7cb256, 0x9cf0ff51, 0x7d977ef2, ++ 0xbbcb257f, 0x01e4ae58, 0xa7f89f76, 0xcbf468ac, 0xa731e753, 0xe8334d69, ++ 0x929a7379, 0xd2fdc3e7, 0x3fabdc9c, 0xdc8f7481, 0x7206d079, 0xde2c47e2, ++ 0xbf6f3de9, 0xba68db26, 0x7c66d8f3, 0x60e89e2f, 0x749738fc, 0x3f7f80ca, ++ 0x7eec2971, 0x0fe58820, 0x87cf0f10, 0xdf773864, 0xe0fe0e17, 0xffbb9a76, ++ 0xa0ede0b5, 0xdc3dccbe, 0xcba03af9, 0x454d721f, 0x5dfabc1b, 0x960de7a3, ++ 0xad75df67, 0x7ae0b25f, 0xc16bd7ba, 0xa3ebabf5, 0x77f84533, 0x63c787c1, ++ 0x6931e152, 0x1cf75b3e, 0x91b7bddb, 0xe76bd16f, 0xc27d4658, 0x7cd89ffc, ++ 0x1cf9f08c, 0x4c5ca8aa, 0x1cd37871, 0xf0e1deb4, 0xd0b4818e, 0x0d2299d2, ++ 0x1eb97e42, 0xffa2c5f2, 0xfeba04aa, 0xaff8074f, 0x3438078e, 0xfd22b9f7, ++ 0xc995b8f5, 0xdf40e381, 0x03e3bc74, 0x8f06f3d5, 0x87185f8b, 0xe9c79aeb, ++ 0x53cef56c, 0x7e0f5f6f, 0x38b26f49, 0xfba24553, 0x8ed1878e, 0x71489227, ++ 0x38f4d56a, 0x1cfb2f3f, 0x20d67bea, 0xf8c3ef8f, 0x0d835e65, 0x5bcc0ddf, ++ 0x5de2ea2a, 0xfcca5bcf, 0x3cd48907, 0xef4e967a, 0x3f6bd95d, 0xf6379e70, ++ 0x64e97f33, 0x52ede73c, 0x7cf1135c, 0xb3a32cff, 0x22bc53f9, 0x5f8f5df8, ++ 0xe7bde02b, 0xc6ee93b8, 0x1f9f9a16, 0x9b00f18c, 0xc7f65fce, 0xa24f10c1, ++ 0xf9d999b8, 0xa945c512, 0x86e9a13f, 0x85ff6c83, 0x938022fc, 0x6bb6ebdd, ++ 0x726ddfec, 0xe80baa69, 0x17bb7ef9, 0x2cd640e4, 0x5780fbef, 0xeaaf7cf5, ++ 0x7dd0af11, 0xb2e8fc19, 0x026773ee, 0xac85649d, 0x442d4c5e, 0x2d72a28a, ++ 0x4816224b, 0x59221513, 0x16228d21, 0xb0563348, 0x55d9e2b8, 0x773f7133, ++ 0x8814fa66, 0xf4d59c2f, 0x7df017c2, 0x203e148e, 0xab2ae868, 0xf1afcde9, ++ 0x87d7925d, 0xd6d7927e, 0xd4f3ba29, 0x7f3e90a8, 0x9f3ea35d, 0xc7e7d61a, ++ 0x8fe7d61c, 0xe943ba83, 0x3dff3c69, 0xcd7b83b0, 0xa82f7e04, 0xfa3325e0, ++ 0x7b0abeed, 0x5a3ffa05, 0x2e4e2e51, 0x7b80ca68, 0x1ddb73e5, 0xedbbb026, ++ 0xf1afdbf9, 0x9b73ba5e, 0xd65f808d, 0x91453f81, 0x7c7bf028, 0xea19bac9, ++ 0x609f680b, 0xc9782c67, 0x07fe035a, 0x74a846bb, 0x91ff441a, 0xef677f5d, ++ 0x9ab73a03, 0x7d4f7083, 0xdb0bf76e, 0x6dcf2e81, 0xd17a87ed, 0x04c042ab, ++ 0x651e05fd, 0xc51f1f78, 0x147c7ee8, 0x3a82fba3, 0x57f2f9fd, 0x7adf550e, ++ 0x7bec046f, 0xbc1963e3, 0xb04ecb5b, 0xaeeb8f3c, 0x79e353ea, 0xc5177e3c, ++ 0xbb2347e7, 0xf39c3cf1, 0x01f0764d, 0x5af88bc5, 0xacf2051e, 0x0f328ce3, ++ 0x57572bec, 0xd2a8e1e9, 0x7d4135f7, 0x7f970379, 0xf94d100f, 0x77dfb840, ++ 0xfd824eaf, 0xf11239fb, 0xce1ee77d, 0xa8be2f6f, 0xf220fca8, 0xadc471f8, ++ 0x2dd68779, 0x7e92c9f7, 0xf8017fe0, 0x5e5dd41a, 0xed571860, 0xffde61ff, ++ 0x7fe61667, 0x70e1c71d, 0xea30ecb6, 0x717a5d0d, 0x453bd799, 0x3aaecf93, ++ 0xf0859090, 0x80f0903b, 0xf5b83cf6, 0xe0bdc250, 0xe1275457, 0xce1583ef, ++ 0xe3e7fe79, 0x0c5ca0e3, 0x1ea13cc1, 0x7a16d8e0, 0xa8ed09dd, 0xf5a69bde, ++ 0xbaa9c9d3, 0xc3453bd9, 0xce95dff7, 0xbb8ee2bb, 0xc95e5c18, 0x3b75ddf4, ++ 0xe8b55dd0, 0xa1056681, 0x147f7c1f, 0xc65abbc0, 0x3b85c7f7, 0x5f838c64, ++ 0xda037352, 0x8fea0a4b, 0x8a78c54e, 0x303cb29b, 0xf8890caf, 0x753434c4, ++ 0x74f482cc, 0x3f8c4ed3, 0x4a97f058, 0xe5094205, 0x8ee9e954, 0x8fc231d2, ++ 0x77195a6a, 0x97794f02, 0x5ab09fa3, 0x5e6fc46e, 0x11bdff50, 0x5053b24f, ++ 0xd70eb2e3, 0xaed8dbe2, 0xbe00f4cf, 0x4a5c2d17, 0x1ec69de5, 0x02b27856, ++ 0xe38d12fd, 0x977dcdc0, 0x037a657c, 0x6d7f0371, 0xf429fe63, 0x7064b04f, ++ 0x2cc1ddff, 0x8112718f, 0x23fd60ae, 0xbc3714c8, 0x4c93bd37, 0x1b955483, ++ 0xd1a1996d, 0xa155fed0, 0xb1a7f9e5, 0x6bf2073f, 0x718c2b9b, 0x77f2fb23, ++ 0x966e6db8, 0x433f7f57, 0xb26fcfad, 0xb9cb3fa2, 0xa394154f, 0x0e8fc1cb, ++ 0x9ab76fda, 0x3b8f544c, 0x24cfa3b7, 0x0b6ccff0, 0x67c3b8b1, 0x29267d43, ++ 0x1b3fb2df, 0x6fba82e5, 0xd27f809e, 0xd38475fd, 0x7a09d43b, 0xbfe64ad5, ++ 0x34a7d89a, 0x9e0234b5, 0x94e2efd4, 0xb73854d2, 0xf76fde74, 0x0538466c, ++ 0x87684a06, 0x423b424e, 0xdc9bb716, 0x39a5f2e6, 0x6da7bf61, 0xd8bff4bd, ++ 0xa066e2c3, 0xcf458faf, 0xddc1ae43, 0xd20b93f7, 0x096ef8fd, 0x8e82e87f, ++ 0x61225f3f, 0xf3c5ea89, 0x8d19bf61, 0xe717dc79, 0xc7e80b57, 0x7e9d60b5, ++ 0x56f7103d, 0x92e64fbb, 0x9f37ec0a, 0xadcd3084, 0xc1e7d7d6, 0x95e142be, ++ 0x0afe616f, 0x7afab5f9, 0x61543df5, 0x247325fd, 0xd4417db8, 0x03a779f5, ++ 0x2d3b84dc, 0x3707bf38, 0x17fbb344, 0xdf617885, 0x40e0dcec, 0xfc405e39, ++ 0xf87b8f38, 0x2cb25dfe, 0xa680bbcb, 0x7be74b1d, 0xf781f417, 0x439f6cc8, ++ 0x64be4196, 0xa60ab371, 0x1600f090, 0xfec084c7, 0x8424d059, 0x42de4147, ++ 0x5634ce02, 0x601cf10e, 0x3c77dafd, 0xdd61faea, 0x8c7272da, 0xde1f37e1, ++ 0xdd6c888b, 0x0e42fada, 0xb37ac28f, 0xbe317ece, 0xae38085e, 0x2d257783, ++ 0xc3715df8, 0x5faeb325, 0x7dd33fbe, 0xde29589d, 0x88d6e7c6, 0x5d0d98b0, ++ 0x4d7838f2, 0xc70277a4, 0xfc371c39, 0xf8193b20, 0x53d071f6, 0x674072fb, ++ 0x0818f212, 0x210cf1cf, 0xd45e3a16, 0xd63cae98, 0xf960ac67, 0x4df9fcff, ++ 0x3aa3d0b7, 0xde1f4efc, 0x7d17cccf, 0xb3fbc06f, 0x15fe5c8f, 0x4df37f40, ++ 0xf90914de, 0xed0c3bd7, 0x1c194b80, 0xbd2b4c9e, 0xb9c234a6, 0x46f3c559, ++ 0xa7f78421, 0xbf6cdd81, 0xca77a475, 0xd555f7da, 0x1f452e5c, 0x1777c16c, ++ 0x7c053b9d, 0x3849b9f7, 0x3722ef81, 0x7026eadd, 0x78a24fae, 0x49b9b902, ++ 0x6e212b20, 0xccc37a59, 0x9e03af45, 0x703ca3d3, 0x30d45b2f, 0xe3b22c51, ++ 0x663e99fa, 0x7b81ad2b, 0xc379c492, 0xe9de80d3, 0x49dde7ba, 0xdd3b37cb, ++ 0x3b64af38, 0x8ad27bc3, 0x23c5c0c0, 0xa2df7c61, 0x471f81d7, 0xe13be145, ++ 0x472b0a44, 0x416ba62c, 0xa9224acf, 0x27be4007, 0x81a7774d, 0x938379ad, ++ 0x126f138d, 0x3d04cde7, 0x63e58d30, 0x9bbc111f, 0xe3d70891, 0xf6668938, ++ 0x0e5054d3, 0xec05a37a, 0xbe0d760c, 0xc2a69727, 0x598389f8, 0xfb84a71a, ++ 0xba473f43, 0xbd47eef0, 0xa08b897b, 0xf5f25ebc, 0xdf3844c4, 0x07a3691d, ++ 0x8ec72a6e, 0x9fcf57f4, 0xe9ea3b61, 0xf6b38643, 0x9258df5c, 0xc425deca, ++ 0x127aa8a5, 0x7b21d76b, 0x5c80c7a3, 0xf5f4ca3d, 0xb45eedcf, 0x44a0decf, ++ 0xc23e83f6, 0xd17254f1, 0x7d9a8246, 0x97f664a1, 0x5c9647a8, 0x21caea74, ++ 0x9fd69f0e, 0x20f730b6, 0x222f49c6, 0x5d97e8cd, 0xfffbd214, 0x791510de, ++ 0x4bce955c, 0x10248a2e, 0x5f455c71, 0x090fb17e, 0x2ed489f4, 0x517e5f41, ++ 0xbf1be7d0, 0x2c24ede2, 0x4e2d9927, 0x874e0738, 0x3be688fd, 0x7c80a682, ++ 0xda5e375d, 0x7dba2d5d, 0xf2cddda8, 0x4bbefc1d, 0x6ffb57ad, 0xf7f0ad9f, ++ 0x725e2c49, 0x4015195b, 0x354f3e14, 0x6c3b479d, 0x8401d361, 0xdd174a8f, ++ 0x8091b270, 0xe5094e06, 0xe51361cd, 0xc0f1f171, 0x50d7919a, 0xf9c83b12, ++ 0x8d62b039, 0x026ff297, 0xf0d787c4, 0x8bbd2db7, 0x6cdc51df, 0x5edc8930, ++ 0xca66be5a, 0xb79e4d04, 0xb03efaef, 0x942996f2, 0xb247d2b6, 0xaf8f1def, ++ 0xf00acdfa, 0xb7f2e899, 0x39f14cee, 0x218b7934, 0x51f9a76f, 0x50cbbc9a, ++ 0x4fa8671f, 0xb3fbe432, 0x708e6df6, 0xd5a1e88a, 0x0b7a3f8f, 0x5b602efc, ++ 0x442e7872, 0xae27585c, 0x377e05bb, 0xfd9d28b4, 0x9371660e, 0x723411e0, ++ 0xeec3d8b4, 0x169eece9, 0x8048fe65, 0x201bf343, 0x051b0a0f, 0xec039c17, ++ 0xcc611da1, 0xcd6e77c3, 0xce762177, 0xc09d0c2c, 0x7fed7aef, 0xf9f909b8, ++ 0x611fe1b1, 0xbbddcbbb, 0xdffae990, 0x1eede9c5, 0xf7e4c926, 0xc777c744, ++ 0xf1db6e67, 0x12eff76e, 0x64f6f2d2, 0xa79421ef, 0x25baf786, 0x377b1f30, ++ 0x7c70a8bf, 0x8c05f86c, 0xa8c1f957, 0x3d41b7a6, 0xbf392db0, 0xbfcdf41c, ++ 0x0b1a9d14, 0xbcc417fa, 0xa363fd84, 0xf606bc10, 0xff88a7a5, 0xfef7181a, ++ 0xe007a1a2, 0xcb8e7b27, 0x2840cf2d, 0x6f8f798c, 0x071a45b9, 0x0196bbe7, ++ 0x594fd3f0, 0xc7c421d1, 0x8c16f8f1, 0x7a2fb180, 0x680fcb07, 0xf9a26019, ++ 0xb21fd185, 0x9e5b43f6, 0xa2cffc81, 0xa3f2c37f, 0x2e88065a, 0xbe1c5238, ++ 0xbf6d0a65, 0xef9915c5, 0xcecd187f, 0x0efcea5d, 0x04cef10c, 0xb64290b8, ++ 0x5073c0ef, 0x73ab950b, 0xdb6ecff3, 0xf731e142, 0x779436c7, 0xbaeeda5b, ++ 0x01cde98d, 0x2575f81f, 0xbee37872, 0x425df288, 0xf619227d, 0x7c6ed8c2, ++ 0xdd9a523a, 0x288c6fb8, 0x43fa01dd, 0xb891dce2, 0x7a760c6f, 0xed8f47f7, ++ 0x678def4e, 0x1768fee9, 0x09a2df93, 0x1f1207fd, 0xf55ea076, 0x4e738f38, ++ 0xc3e90ef9, 0x1052f1ce, 0xa2fcfdcd, 0x36e939d9, 0xcfd8cde7, 0xaddf5c3d, ++ 0xd5b8347c, 0x27ffe14a, 0x9ebc7cf5, 0xd6f7cfe9, 0x0d13b950, 0x64de11fe, ++ 0x82f72790, 0x7764793d, 0x540f3d5e, 0xbdbcd2a6, 0x39569cfb, 0xbdac9bd3, ++ 0x61acadff, 0xaabcaaf5, 0x57bec81c, 0x72c4adf7, 0xc7c49f06, 0xeb0cd9af, ++ 0xfd0449b0, 0x1ece1769, 0xea3979b6, 0x47ee7701, 0xc9bd7bf8, 0x993f5e70, ++ 0x7a04c837, 0x939f8aaa, 0x70abbc43, 0x481efc3d, 0xfe3a93c5, 0xf9eebe7e, ++ 0xe823d522, 0x3f2ec33a, 0x15ea9fae, 0x3fe5d9a3, 0xd3f62bd3, 0x55de02b5, ++ 0x65a912f8, 0x1fff942c, 0x508bd382, 0xe9c2cfff, 0x35e7be1f, 0x6f2a21c8, ++ 0x8a7cc1f6, 0xbfd29e96, 0xdf70e247, 0xc4e58428, 0x18fc4d74, 0xd1e70e5a, ++ 0xebff4e35, 0xcd7b9ad1, 0xa1170fb9, 0xc7aea9fe, 0x4caf1ff6, 0xe4f49bbb, ++ 0x787ea34f, 0x75964ffc, 0x42547768, 0xdf8f8f28, 0xcc5df046, 0x4bcf1e71, ++ 0x7e336fd5, 0xce04705c, 0x112e6973, 0xe95563e1, 0xc8edf041, 0x947df0a6, ++ 0xeef0e76e, 0xf993303e, 0x75fba8f9, 0x5bdf8f25, 0x7c5aecb9, 0x5a41d2af, ++ 0xc81e9cf0, 0xbb3f2824, 0xc30ce7ea, 0x01274a7a, 0xbc89c82b, 0x831dfc28, ++ 0xef8254ca, 0x8ce72a6b, 0xdf387ac0, 0x1cd13fa2, 0x39538e0b, 0x6561d193, ++ 0x1bda2c5e, 0xdc02ee41, 0x84a3a37a, 0x21176672, 0xf6b47792, 0x62e1defe, ++ 0x7a5b7976, 0x4177cecb, 0x45675daf, 0x885016bd, 0x891532f7, 0x87a51e38, ++ 0xd4be902f, 0xc913dcf3, 0x5c70c7c1, 0xd609da0f, 0x2859bc38, 0x73627ee7, ++ 0xadabfcc3, 0x0d25ad64, 0x2564438e, 0x1f3e4bca, 0xd124f152, 0xcc3f73da, ++ 0x3d00e0bd, 0xea097244, 0xe178cbef, 0x6100fedc, 0x210ffff5, 0x0004212a, ++ 0x00000421, 0x00088b1f, 0x00000000, 0x7dc5ff00, 0xd554780b, 0x733ef0b5, ++ 0x9267bcce, 0x9924c933, 0x124e3c84, 0x0c020108, 0x51680869, 0x62311087, ++ 0x16a4076a, 0xe121c5ad, 0x44c92891, 0xe96c5adb, 0x08149065, 0x791a8622, ++ 0x0b84e915, 0x1fed6d8a, 0x40d4522c, 0x6f4a4407, 0xb6a87fb5, 0x6f7f6d57, ++ 0x151f1484, 0x6b4b3e32, 0x6b5affad, 0x99cc93ef, 0xedaa9524, 0xd87b3f4d, ++ 0x1fb3ef67, 0x5ad7bdeb, 0x4add4f7b, 0x24d22be7, 0xca56eac6, 0x630a6b31, ++ 0x8195fd6c, 0xbfa31b5e, 0xd3f88a8f, 0x8858c996, 0x716dbf89, 0x94227077, ++ 0xff683bf1, 0x757f0d3f, 0xc32c2e6b, 0x8b0fd0f7, 0x83a5f7c0, 0xf0a967df, ++ 0x16c60c8f, 0xac4581ca, 0xcabdfe02, 0xa095eda9, 0x18aeff0e, 0xf0a9667c, ++ 0xb7d42a72, 0x8e240d6f, 0xdc938fa7, 0xe0351cef, 0xe67da153, 0xf54b161a, ++ 0x8eff1632, 0x0d2ddd1c, 0x12d7af9d, 0xf50ec7bf, 0x9ec9570b, 0xfde10abb, ++ 0x57ad370a, 0x59cdef9f, 0xf158cbf1, 0x3acffed0, 0x5c152b9b, 0xc6748aff, ++ 0xd2b9e1b2, 0xb80602ca, 0x32cb0658, 0xfc584b63, 0xe61a4984, 0x8a3b12bd, ++ 0x91da5ff3, 0xfffd3df0, 0xed89addf, 0x27040260, 0xf34949a6, 0x5d073767, ++ 0x55b15ef4, 0x431c7bc2, 0xf12c5183, 0xa1b2c185, 0x39e1d6f3, 0xb809355b, ++ 0xb2ae96b3, 0x8d9ef0a1, 0x0a18cef0, 0x37a5af6f, 0xad0dfb0f, 0x929c12b0, ++ 0x4a2c67fb, 0x676ada78, 0x901a7b11, 0x00fd0483, 0xe9ddb75e, 0xf801ae8c, ++ 0x0fe3dbf6, 0x47c33c22, 0x9f7c22ae, 0x0c68746f, 0xc0b0ec9a, 0x391ca102, ++ 0xc5ee8ee2, 0x25bd2576, 0x1e7dd60c, 0xfc0010e6, 0xee567f9c, 0x24fa488c, ++ 0x567e6b18, 0xda01bdde, 0x6afc7f9d, 0xa76acfde, 0x461ca0c6, 0xe1b8c308, ++ 0x18ab07c8, 0x679a55c0, 0x1ccff1a3, 0xac56a294, 0xd670043f, 0x9dff0be7, ++ 0xca1aff87, 0x29a8bc61, 0x4f0c9e62, 0x1c79c0ac, 0x603cd272, 0xde348da5, ++ 0x036c1c57, 0x926cdf8c, 0x6fa82602, 0x747c65be, 0x8d8f9f0d, 0x8b967c01, ++ 0x589b35a9, 0xe5fd04ab, 0x9b36b808, 0x5edc974e, 0x6814ebc6, 0xf8e32b77, ++ 0x25c77681, 0xdb72e798, 0xe9191ec6, 0xea00f917, 0xc2fac16f, 0x6f343c41, ++ 0xb887d3fc, 0x4603e68e, 0x63fe58fa, 0x496e3ae3, 0x41c2aba4, 0x7056717a, ++ 0x166ab178, 0x75f3031d, 0xa6b3b28b, 0x3c232a27, 0x6762cc56, 0x8f4d073e, ++ 0x3a46cef5, 0xb1745772, 0x5f86783a, 0xcc288163, 0xceeed2fb, 0x7b4146a7, ++ 0x1e4f4d4f, 0xe2bc372e, 0xcfbee2b9, 0x9f59e20d, 0x9bdd25e7, 0xf1a2e665, ++ 0x4a983be8, 0xda8bbf60, 0x31379b8d, 0x7d1779f1, 0x89926197, 0x15f17b6e, ++ 0xc8128ff2, 0x2d9c6096, 0xc426458d, 0x578153ab, 0xed25d730, 0x26af7763, ++ 0xe64a0738, 0x3fbb19b9, 0xe09de805, 0x3944afe9, 0xdaad5a73, 0xe4de7c89, ++ 0x66aadaa9, 0x6e8271f0, 0xe5f03e5c, 0x5ae94325, 0x93f00e7f, 0xdc559768, ++ 0x35c5a532, 0x33e03b72, 0x7b7c5b82, 0x8a23972a, 0xbfa5e544, 0xa06e7732, ++ 0x374429f9, 0x18503fb7, 0xb037f9c5, 0xf9d20b76, 0x20b51672, 0xb1b52f1d, ++ 0xc5d00a48, 0x0a966852, 0xacdb65cf, 0x5fc04b4c, 0x5e58d463, 0xadc2e42e, ++ 0xbfbe87ac, 0x7d525f75, 0xa1b98b35, 0x62c6c9be, 0x19767c4e, 0x9c599beb, ++ 0xfa1f0fc6, 0x9ef89ac8, 0xdef5f075, 0xa9eef02c, 0x5821ca8e, 0x633b76f7, ++ 0xf0c0afc8, 0x574b9f84, 0x533e1276, 0xdf8503cb, 0x7fc57585, 0x06eff669, ++ 0xc0a3fdba, 0x399f0e97, 0xc227556a, 0x689b21df, 0xced5f1fd, 0x7f586ee8, ++ 0x2035899f, 0xb0f5effe, 0xf3c1e79b, 0x18162afc, 0x4d30266d, 0x86483a42, ++ 0xec2786f3, 0xa737480d, 0xd0252e50, 0x4cd55ad5, 0x6b0b5ee5, 0xbcaa7e40, ++ 0x904bfa0b, 0xbbd7cd57, 0x0bddf842, 0xfc007eba, 0x67f8875f, 0xd86f086b, ++ 0xf1cce91e, 0xbfd4fe39, 0xbe5d1ffb, 0xa9fccdb1, 0xd2dfbe70, 0xfc44e8e8, ++ 0x89a3d20d, 0x05963d11, 0x27a7082d, 0x64589c84, 0x3ef8d3fb, 0x4013e500, ++ 0x220f2820, 0x2f2e765d, 0x0ae17514, 0x5af13f28, 0x86837f99, 0xc7e5c374, ++ 0xd83a3713, 0xc9e4305d, 0xf7787e37, 0xedfea1af, 0x159a2cd7, 0xed2317ea, ++ 0x909e3e00, 0x8bc70058, 0xa28d663c, 0xec0e5bfe, 0x7e59f38c, 0xe5146264, ++ 0x684b41de, 0xe71c12fb, 0x2f7fb351, 0x253cb77c, 0x5483f0fa, 0x0a07ed9f, ++ 0x399a4f65, 0x771e467d, 0xd11deff2, 0x8bc4fd1f, 0x08fe59f5, 0x1ec27fb4, ++ 0x23f910fa, 0x92a5aac7, 0xcc95fd9e, 0x12b138f8, 0x34efc00f, 0x9e152bae, ++ 0x38e12550, 0x07ea6edd, 0x097b2ef8, 0x2da673f4, 0xf203d68b, 0x9ce38034, ++ 0x8ddd64d9, 0xc0cb74f2, 0x3fb512b8, 0xcece0e6d, 0xc7e9f286, 0x4357f8a6, ++ 0x12d07f55, 0x867d00b3, 0x19f5bdef, 0xdea2fa06, 0xf842eda4, 0x5a4e23b0, ++ 0xf08f8e87, 0x58b565a6, 0xe565be1f, 0x46ef28b5, 0xdf945be2, 0x9e0e412c, ++ 0xe47cf167, 0x450d1d8f, 0x13d4315d, 0xa4fce3dd, 0x900f992e, 0xf2a1f40f, ++ 0x0e667db6, 0x3361f8df, 0xf6c5eff1, 0x54a1748f, 0xe382bd72, 0x32ce4184, ++ 0xce489f9d, 0xe1e59426, 0xe18f1cca, 0x2e48b227, 0x75afd724, 0x007b2687, ++ 0xfbdfcd2f, 0x342bcbf3, 0x724e2f1c, 0x1067b58e, 0x0399f59f, 0x3d6e910b, ++ 0x5d4b31d5, 0xe55fdd02, 0xdebbfae1, 0x630cf5ca, 0x977e0b31, 0x65595f5c, ++ 0xfd01fba4, 0xe2fce1ee, 0x7af2e1ee, 0xf049bd68, 0xd45675d3, 0x29f2974b, ++ 0x0bd402b3, 0xa35fec2e, 0x2d7d2ffe, 0x7287a966, 0x6598cac1, 0x9f2278a9, ++ 0x3663bc00, 0x76df7758, 0x0403c937, 0x74b3f603, 0xb7fd233a, 0xb6ad6654, ++ 0x1daf7c72, 0x9cbc05ea, 0xf443cc7d, 0x5006fec5, 0x622f7801, 0xad959da2, ++ 0xfa5c81b7, 0xb314ab59, 0xdb45bb41, 0x85edbbac, 0xd901d7c8, 0x407cf88d, ++ 0xa8b4b922, 0x76c96675, 0x6072df28, 0x653fe122, 0x5bcba73a, 0x73d21ea2, ++ 0x57790a97, 0x145a8d6f, 0x923f87d4, 0xfd465ed8, 0xcbff62b7, 0xf2eca3e1, ++ 0x394070a1, 0x6887a06d, 0x9dec1942, 0x9cb8bb4b, 0x599f2064, 0xcba41d82, ++ 0x2ccb946f, 0xd233aec9, 0x2fd74447, 0x5a638edc, 0x8389dcd6, 0x1a8e7672, ++ 0x7843ddbc, 0xf8859d18, 0x3d727c05, 0xb8225fb4, 0xd216b136, 0x1f5cba0f, ++ 0x85e85718, 0xeb8472b3, 0x7a66eb1f, 0x1214f3ae, 0x5d616f5e, 0x3d741fa4, ++ 0xac1d1231, 0x12347413, 0x7417ac1d, 0x1635fcb0, 0x5bc60cbb, 0x9ac592be, ++ 0x7ba7f126, 0xae3be912, 0xef5c6cf7, 0x1171d3e1, 0xdf592ffa, 0x64b7eb25, ++ 0xe16596bd, 0xb3c74bfa, 0xcd649f6e, 0xd2fd7ae2, 0xc1995195, 0x04a4e6fa, ++ 0x18c8ca1e, 0x2fc253b4, 0x64da6cd8, 0x1159072c, 0x994e2bb4, 0xdf059599, ++ 0x40161585, 0x5c0272be, 0x03fde13a, 0xb3959ec2, 0x167d7af8, 0x2566bf4e, ++ 0x10b8a6c8, 0x13313d2f, 0xa98325e2, 0x3c3a8f48, 0x77c3701f, 0xd71df8e5, ++ 0xdbdf0337, 0xe123ab58, 0xec27aafb, 0x7fde7fa4, 0x92b51ddc, 0xf02a117d, ++ 0xbf997f40, 0x79dd92b7, 0xe93709fe, 0xb666f3c7, 0x7bda0ba0, 0x7a24bed1, ++ 0x3dfd4b59, 0x40cd788e, 0xc51aaa6a, 0x39a5f690, 0xea0450a3, 0x879356f6, ++ 0xed434ddb, 0xd85f511b, 0x2ba73d73, 0xf1f286ab, 0x1def4f7d, 0x30f98658, ++ 0x05fb3fd4, 0x6607c39e, 0xbc36f94d, 0x7e5d070f, 0x14d0fd0e, 0xfcab57a4, ++ 0x406debf5, 0x95e5b35f, 0x1d613bf1, 0x152e794d, 0xc1755bf5, 0x03777e1f, ++ 0x603f5f94, 0xf3c45666, 0x580b59de, 0xb7f2c8d1, 0xdd3e6a31, 0xb72fc09b, ++ 0x9b9633ee, 0xf0e58cba, 0x05f96321, 0x767bdb8f, 0xff0ec902, 0x56d74047, ++ 0x9d6bcb6b, 0x93eb5f30, 0x8f47d256, 0x8fff4278, 0x7e29ade4, 0x2d6ce102, ++ 0x08527378, 0x2dfba0e9, 0x60569f09, 0x0e329ea3, 0xf7ebe47f, 0xd40a8bed, ++ 0x0836e061, 0x1133663f, 0xe6fac19c, 0x6173924f, 0x4b5e27c1, 0xb0a3f5e0, ++ 0x1cf3a5fe, 0x26f45dea, 0x12b53b50, 0x239a43ed, 0xfabb6f0b, 0x4147dc75, ++ 0xffc446bb, 0x0ed0b9d9, 0x8db0d5e6, 0xace5c3eb, 0xb6f90527, 0x1b48ec19, ++ 0xc69fd8a0, 0x6b6b70f1, 0xff0632bc, 0x19ab48ec, 0x3e54f387, 0x1f488254, ++ 0x04dfb0eb, 0xc69cd7bb, 0x7dd6f7f9, 0x033ef6f6, 0xe50c793f, 0xf6eca1f0, ++ 0x0bb844be, 0x2572c3f9, 0xe37f7125, 0x69cc8533, 0x7a5f2819, 0xfc61332d, ++ 0x977c3e2b, 0x15b2fde4, 0x00bed14f, 0xdb88b1d6, 0xe50d76c9, 0x8f3bb2d3, ++ 0x1f7d7bd2, 0x45cf3676, 0xb6a7b0fb, 0x63d9795b, 0x07d9f2a1, 0x59713ef8, ++ 0x75c51497, 0xa42ef34a, 0xf0bd44cf, 0xb2b55980, 0x864d70a1, 0xff3babe3, ++ 0x52c1853b, 0xe3a0255f, 0xf6e24dfe, 0x4292da98, 0x25ad01fb, 0xf0ceed05, ++ 0x475eabb6, 0x01ecb8f9, 0x02f68fd9, 0x8ff6ec3b, 0x72be5861, 0xf61712dc, ++ 0x4cfa4ef3, 0xaec74798, 0xde99552b, 0x739441cb, 0x5cf60f60, 0x5d95ef01, ++ 0xc7e434d3, 0xf9f00fe3, 0x1ed8f32f, 0xe2ba3a44, 0x4bf89943, 0xda10b131, ++ 0xc0961dbd, 0x6d6be438, 0x88d9dee7, 0xe6e7579f, 0x23fda898, 0x2e115312, ++ 0xf899159e, 0x04a4997e, 0xb61b8f91, 0xda26d635, 0x647b4f3d, 0x0599cbe2, ++ 0x5d7b332b, 0xa3d757c4, 0x007a6d3e, 0x9fc708f8, 0x6eefd2f7, 0x95f20ef0, ++ 0xb5db6f34, 0x0fff6297, 0x77c8fd99, 0xceccf603, 0xe17d102f, 0xb5e00c5f, ++ 0xd3ebc04c, 0xa9d599f2, 0x094b49f3, 0x7765d5ca, 0xc3a894b5, 0x7c0319d8, ++ 0xe5f393b2, 0xfb126935, 0x957484c8, 0x8c47d866, 0x9572efb4, 0xd8cf489a, ++ 0x17b02cfc, 0xedb0599e, 0x4b75fdc5, 0x69f0429a, 0x3b50b349, 0xefb72fe5, ++ 0xf5d6167b, 0x4374279e, 0x602fbc1a, 0xd7a82981, 0x055ab8b4, 0x9a822d66, ++ 0x93b630ec, 0xd760d7db, 0x25bb1d91, 0x21b83d83, 0x1cbdbf61, 0x724a9bfb, ++ 0x39fb0ea2, 0x4edfe2ff, 0xf39b7c20, 0xf6849cdf, 0xbbc2f842, 0xebd60d16, ++ 0xbe4896ea, 0x8641fcbb, 0x9eee1374, 0x0d9716cb, 0x9fb0e5ca, 0x75e48deb, ++ 0xe6669e3d, 0xa71bd472, 0x73a4f67e, 0x30f0ee7e, 0x2b1da7a2, 0xefef641c, ++ 0x38ed46f0, 0x6f967fe9, 0xd1a9fb75, 0xdb6cf1c6, 0x8c80d3f3, 0xd4951e74, ++ 0x38d65831, 0x2c37f47f, 0xce30ca8c, 0x238a7beb, 0xd3303e54, 0x6b9d432f, ++ 0x2fae7fcf, 0x321d3842, 0xcbbdb1fb, 0xeb829bdf, 0x99cf7d7b, 0xc35f5c14, ++ 0xddd6991e, 0x732b7d10, 0x9ca0d949, 0x6d429b30, 0x4aa62f08, 0x975f1c2e, ++ 0x79efaf17, 0x8bb17327, 0x9f4803fb, 0x970f0c56, 0x4dcccf26, 0xb8ae5728, ++ 0x8de5e39c, 0x9451ac47, 0x41d86f83, 0xdfc825df, 0xff5cdc37, 0xfdf4d345, ++ 0xea3e575b, 0x32b2819f, 0xe27284ce, 0xbf5f2aeb, 0x8f95d2d7, 0xc927f97c, ++ 0xeb2dcfd8, 0xb9051665, 0x625eb8d4, 0x6ff99051, 0x7cb3fc3c, 0xefafff94, ++ 0x5d7e59fd, 0xbf92fcc2, 0xd43f9fd3, 0xb1fe13c7, 0x178fa63a, 0xeaf1c5cb, ++ 0x97ee56fc, 0xaa5fc11c, 0xb8db67b7, 0xb81fb3df, 0xff50e916, 0x11c1bfae, ++ 0x9fb77b40, 0x42e8a2d9, 0xfe16ebab, 0xb46040d7, 0xfa35f717, 0xf7fd49f7, ++ 0x0e927a0b, 0x701fe449, 0x3e49c596, 0xeff9627f, 0xc8267c05, 0xadf3c07f, ++ 0x5b26e788, 0x4628c4fc, 0xb84161f4, 0x0a5d9a59, 0x35ccabea, 0xdfe2be9c, ++ 0xcb3ed130, 0xc49948eb, 0xe4b2bec0, 0xdf285cf8, 0xb47128ae, 0x7df1529a, ++ 0xe7db147e, 0x77d294e5, 0xff4e2a91, 0x7e464c91, 0x22d66cb5, 0xed55df91, ++ 0xee503f25, 0x806ea674, 0xb73a4a62, 0xbfcc7d5f, 0xfc262e4d, 0xd207e84b, ++ 0x07eba2e1, 0x979423a4, 0xa236486f, 0x225ba923, 0x7536547b, 0x477ec42d, ++ 0x253faba2, 0xfe9fd5d1, 0xdef574cd, 0xd2157488, 0xb67cae88, 0xf84ae9e1, ++ 0x3dba2f85, 0x5f71048b, 0x75e0259b, 0xf13f90af, 0x3f74d86f, 0xadeb84b9, ++ 0xdad5fd15, 0xf519315c, 0x66fcdf88, 0x2777bfa2, 0x7fb8c5d8, 0x1ebb46ca, ++ 0x2cd6a39e, 0xac6f08d2, 0x08fd17a7, 0xd23669ce, 0x7a9b7797, 0xc98ed10a, ++ 0x1fb2df1a, 0x616b23e9, 0xda1af959, 0x507ae617, 0x25aea02f, 0x598ace7f, ++ 0x40476e41, 0x734748bf, 0x69cfb42d, 0x906673be, 0xc43511db, 0x768de12f, ++ 0xace0f50d, 0x48d5c2ee, 0xcc95e11f, 0xee3a256f, 0xfd14bedc, 0x7e5df3b3, ++ 0xf4767594, 0x607ee0d3, 0xdaef91bd, 0xd7b22ea4, 0x3f335723, 0xffdd75ca, ++ 0xdde9e1db, 0xffd46df5, 0x37e4658d, 0x8f07f019, 0x3a37a466, 0x34ec813c, ++ 0xbfc1eb80, 0xc765ff73, 0xf3c32814, 0x8ecf8149, 0x0f6c81b9, 0xda36eb94, ++ 0x9d1dee09, 0x0ddfbebc, 0x7e4c9a00, 0xa58fea61, 0x1a1eb8da, 0x9fc81f2a, ++ 0xe99d399c, 0x9cb0db7f, 0xb7db97a3, 0xf3a41d92, 0x9f21477f, 0x582cbb8f, ++ 0xf7f91688, 0xa4e6ff37, 0x1327e803, 0xb37c71fd, 0x00fdc116, 0x997981f9, ++ 0x9bf7c4dc, 0x58392260, 0xf543647c, 0x6f32c48c, 0x8cfdf83f, 0xf41eb06b, ++ 0x4e3d40ef, 0x5eb2f41b, 0x1e61d80e, 0xf583dceb, 0xb6c1d80a, 0xfef89243, ++ 0x8257398d, 0xc497eeaa, 0xda4791f8, 0xb417e802, 0x8978c333, 0xfa9253f3, ++ 0x2eff4337, 0x6cff6f4d, 0x61a395cd, 0xb97ae5be, 0xf3002db4, 0xec6cd7bb, ++ 0xbe2a408f, 0xde3e82c7, 0xdcdf2dc4, 0xa0c671b0, 0xc2f6007d, 0x8319e9cd, ++ 0x97bac276, 0xc327db6a, 0x1df54e58, 0x5d5fea0b, 0x12bd87df, 0xfcc921d9, ++ 0xf73a5b7a, 0xf9627ca3, 0xafb10daa, 0xf9274b6f, 0x591b3bda, 0x2425f612, ++ 0x832bc3bf, 0xb05bed0c, 0xf381be4b, 0x9be2ff3d, 0xfd428f67, 0x3d7f79f9, ++ 0x76c34a31, 0x7dc42db7, 0x4282f855, 0x4fbc37f2, 0x37c04a8e, 0x576e6eb6, ++ 0xff273e83, 0xb73f4ebf, 0x3c7e82a8, 0xcbfe8611, 0x54d2c38e, 0xa8b077a4, ++ 0xb804bff2, 0x103d297c, 0x7ec471a1, 0xdbdd7933, 0x287fb9d3, 0xbdb55a5c, ++ 0x23dffb04, 0x3617b431, 0x5cce9e94, 0x57a9fb4c, 0x7c249732, 0x7ee878d7, ++ 0x3ee36782, 0xdc70b0f3, 0xdc932e9e, 0xb1fc7e6b, 0x378dca00, 0x84c912a2, ++ 0x86da2506, 0x83436d76, 0x56422d09, 0x03745d11, 0x581633c5, 0xdf5818d8, ++ 0xc2efa12a, 0x5c8baefb, 0xff86eb8a, 0x23b57824, 0xc4e494b8, 0x1736058e, ++ 0xeb4a85c5, 0xa838236e, 0x61c2008e, 0x36556943, 0x773cd38e, 0x10714ab6, ++ 0xbeb0e7b0, 0xc91bcef9, 0x6bcfa45f, 0x0d7321c3, 0x60953bda, 0xe614fdd7, ++ 0xa736979d, 0x3d7c0fc6, 0xe53fde4a, 0x32de506b, 0xcf2f1c82, 0x55bc72e0, ++ 0x58be460a, 0x9651fe41, 0x382cefe8, 0xfdc7edc4, 0xd57edce9, 0xe74fefdf, ++ 0x488ced76, 0x97242ccf, 0x13af4a23, 0x0b30eaed, 0x6afb85bc, 0x7b697416, ++ 0x7e5c4f09, 0xe4695779, 0x7b79b337, 0xf58c9eef, 0xcfda1433, 0x3ef7a530, ++ 0x9b7cf71c, 0x0981bfd7, 0x9df2c03e, 0xc7945165, 0x0474379a, 0xd852ace9, ++ 0xbf1fe7ab, 0x17fa0a6a, 0x6dabfb75, 0xf18a3baf, 0xf6b736d0, 0x93941abd, ++ 0x4e48517f, 0x67bc5b32, 0xf8d3f416, 0x6bf51a41, 0x897e8572, 0xa3d9b4fd, ++ 0x9107486d, 0x79da994e, 0xd862d9e7, 0xba0febcf, 0x34ced13b, 0xd219db7b, ++ 0xc85f6c31, 0x06f3628f, 0x6785c619, 0x12291645, 0xbb248bea, 0xb1fa1666, ++ 0x25e2df68, 0xe0956e3f, 0x0540318f, 0x0ac46d67, 0x0fa51fad, 0xff2739da, ++ 0x97c15f36, 0xb263fdba, 0xf57bbf71, 0xf1c30702, 0x09f8dad9, 0xbdf1fa13, ++ 0xe1ed0c3d, 0xc6892ea6, 0xd47d2a69, 0x5b97fb82, 0x877f38bb, 0xe0037ec5, ++ 0xa5f14f97, 0x83f0a774, 0x677a72b6, 0x2146273d, 0xf1cc7f9c, 0x4bb418c9, ++ 0xb632bbf0, 0xd103cb9a, 0x1fc4459f, 0x09bf849a, 0x9fd52134, 0x15e3d74b, ++ 0x3b678977, 0xb7718a7f, 0x19013d48, 0x324539e1, 0xa7f5c9f8, 0xa7dfe5e2, ++ 0x46cf8b1e, 0x7d038dfe, 0xbb69dfa1, 0xa7b6f734, 0xa7db7d61, 0x29a3f78e, ++ 0x927203e6, 0x903df1cb, 0xe2bdc022, 0x91b35bd0, 0x230d586e, 0x343e6d7e, ++ 0xf1726e53, 0x0bda0d38, 0x4e96ce59, 0xb9bacfac, 0xc633f494, 0xe2de304d, ++ 0x66b872f0, 0xcf1fb8bb, 0x10a45777, 0xc7a99ae3, 0x8d3db782, 0x90744fe3, ++ 0x700b361f, 0xe7a34ee3, 0xf97bf47a, 0xa8a394d8, 0x5ab57d9f, 0x8f47ce39, ++ 0x6ffc61df, 0x71c9196e, 0xa5f9a72a, 0x3fdc6ec0, 0x6fdc3d79, 0x38356567, ++ 0x751f7c5f, 0xd113c60d, 0x62e3879f, 0xe79f0ebc, 0xf90a63b3, 0xaeef59ff, ++ 0xb7efb4bd, 0xdaaf08aa, 0x0178bf43, 0x8dad6ff5, 0x357c5175, 0x24796ec9, ++ 0x2f3cbae5, 0xee7fd38c, 0xe2efaeec, 0xd074bebc, 0x18fc221f, 0x2e2b91ed, ++ 0x1bf9f6e7, 0xda1a9d7b, 0xdc85bb91, 0xf891fb06, 0xdf08f224, 0x91db264f, ++ 0xbf1d5e15, 0x281c8edc, 0x2476e67f, 0x2f645f9f, 0xe5d09bcf, 0xffec587b, ++ 0x4ede1bfa, 0x1815fd41, 0xffe80f98, 0xa83b41ca, 0xefc88f6e, 0xbf3e1ee8, ++ 0xce83e4e3, 0xdbc3d208, 0x4bf2765d, 0x75ee222a, 0x03bf1dce, 0x39ead481, ++ 0xdbca3d71, 0xfc6f2df0, 0xa7fc04c4, 0x9238f274, 0xd3388922, 0xe3c6652f, ++ 0x31350162, 0x6678a7ee, 0x286502fb, 0x97baf91f, 0xf2d1bf0b, 0xc78d12b4, ++ 0x6fbc78bb, 0x04ac4a79, 0x8527a9ed, 0xe0ee5a1e, 0x8f7eaaf1, 0x7d788625, ++ 0x805a1ec2, 0xf2b1cc78, 0xadcfd9ef, 0xab5c625a, 0xbaedca33, 0x98a6a533, ++ 0x89d9d605, 0x6de201f6, 0x0d6f8f23, 0xb11c07e4, 0x9e695a76, 0x6dfdca8c, ++ 0xeb272485, 0x11d5b8f5, 0x17ab8fee, 0xf333a9f1, 0x4300fe96, 0x4b52ad95, ++ 0xdecfee0d, 0xfc9330df, 0x6f7c77e8, 0xd7eb3d2e, 0x4bfefd1b, 0x3c5f4fd1, ++ 0xfdd61718, 0x6fcc75ef, 0xa0f2f6e1, 0xf604d11f, 0xa95eb68b, 0xc8597d42, ++ 0xfe50bbd4, 0xd6c0116b, 0xc2b67834, 0xc9768d13, 0xa39da124, 0x881d79b4, ++ 0x26ad75df, 0x569153d2, 0xe9db0053, 0x72f56e70, 0x2f4ed23f, 0xaa006bf7, ++ 0xfe8e38a2, 0xb88b356c, 0x356fe883, 0x69f0c533, 0x9d73f892, 0xa70cd4aa, ++ 0x5afef5af, 0xf4362dcd, 0x4cf3c5d3, 0xdf7ef7e4, 0x7e405812, 0x1612b4e3, ++ 0xbab67801, 0xf0d7d65b, 0xf79de27a, 0xd520f1ed, 0x4370a65f, 0x28696992, ++ 0xe5e5bf3f, 0xdc3244f6, 0xcb1bb496, 0xc698f1c9, 0xcf5cb1a8, 0x8bb36342, ++ 0xf120fc79, 0x7e50b7fd, 0x153c454d, 0x2dfb780a, 0xf5f56728, 0x70e5ceaf, ++ 0x67f1e533, 0x02d55e51, 0x8f2283a4, 0x8a31f285, 0x0abfdc3c, 0x17f9a12b, ++ 0x8895e65d, 0xdbe6923e, 0xd21b468a, 0x878f1b57, 0x4ff3b3fe, 0x6f1ef79e, ++ 0x80dbe0a6, 0xf597e30f, 0xd1e285aa, 0x7927eb17, 0xcfdc6bda, 0xfb3f940e, ++ 0x27df2cfd, 0x6f22c9b5, 0x54392546, 0x9cb5f2a7, 0xc60ffc91, 0xec0bbdf0, ++ 0x9b475c04, 0xcb768e5c, 0xb45cebac, 0x7623e68e, 0xad3703f2, 0x3d47cdec, ++ 0x5bd55cde, 0x649b7182, 0x156ce2f8, 0xbb417e5d, 0x3fec2f3a, 0x6c484ed0, ++ 0x8caff227, 0x4bc0d671, 0x37ee2728, 0x0bffd99d, 0xedfb57d4, 0x5fe0afa4, ++ 0x67e8ad47, 0xec90bc79, 0xa1dc1ba8, 0x27b45ed3, 0x0f5db11d, 0xc2dda215, ++ 0x6ea6a6ed, 0x85da276b, 0x7109ad75, 0x8dbffc3e, 0x5b1fb8c6, 0x77fe469f, ++ 0xdf7c61d6, 0xbbe933b0, 0x76c07121, 0x4b16f3c2, 0x3bf21c68, 0x3fca1de8, ++ 0xa268d738, 0xd97a81bc, 0xede514bf, 0x1ed1bb39, 0xf8e6e73f, 0x3c743292, ++ 0xcf104bfb, 0x7821e503, 0x9e2097f6, 0x942c4deb, 0xe2134fd8, 0x5cbbf019, ++ 0x63dcf9e0, 0xcf104ad3, 0x569fee6f, 0x62de7882, 0xdf200f6e, 0xe643569c, ++ 0xdf67980c, 0xa7b24195, 0xf9072f30, 0x31e962e8, 0x17a8c32b, 0x22ffca07, ++ 0xfa48caff, 0x5e0078b0, 0xb5e87d46, 0x0f28b968, 0x7fd66cea, 0x6ff117a8, ++ 0xcd9e3f58, 0x238efe4a, 0xd3677b7f, 0xba072883, 0xf447b265, 0xa1288efe, ++ 0x8e87b462, 0x47f3e0bc, 0x7ffb91a4, 0xa9d8ed06, 0xa08c2714, 0x07df455f, ++ 0xb264f6e8, 0xd6269e3c, 0x60466d73, 0xd827fa5f, 0xe37eea8f, 0x16cef106, ++ 0xb9db877d, 0xf73f247b, 0x1f91771b, 0x22f0f9b9, 0xafc4fd15, 0xb8dfb945, ++ 0xe429b1f9, 0x3e8c6e37, 0x313cc315, 0xb8a92dd6, 0xf3dc68ff, 0x03e60a4a, ++ 0xd85cfbe8, 0x83217ed7, 0xefdc6cf0, 0x933d16be, 0x3003f982, 0x6f383def, ++ 0x416e37a7, 0xfd866fba, 0x3605e61e, 0xd813f12b, 0x5197b36f, 0x21c54b9e, ++ 0x8f4ffee3, 0x5a08eef3, 0xe8eeee48, 0xaf28a296, 0xc2a12d33, 0x2c6bd45c, ++ 0x1ceb3d57, 0x64afb3e4, 0xf185be04, 0x7af8c1df, 0x1919abe0, 0xbd5df983, ++ 0x7e8953db, 0xa02ccd7b, 0xeedb3ca2, 0x214cf216, 0x4edef6f9, 0x7be7944f, ++ 0x45eff6f1, 0xa8d09db9, 0x2c2979e7, 0x96be00a6, 0x88bc0fce, 0x1f7946f8, ++ 0x89f7924b, 0x7f6e3d65, 0x5e918b2b, 0x274cc26a, 0xd895ef91, 0x8fae392e, ++ 0x3f4370f1, 0x868a65ac, 0x5c9bb07e, 0xc60f9c7e, 0x11f58dc7, 0x7e064fbe, ++ 0x483e5158, 0x741e3abf, 0x7e166dfa, 0xe9c370e8, 0xe1bf48b5, 0xf68a9243, ++ 0xa73f72dd, 0xdfb0e5df, 0x64d8bcc2, 0xc65d677e, 0xf891d03c, 0xdf00eb7f, ++ 0x3adffe71, 0xd7fa9ca2, 0x277757f8, 0x7ebebdf1, 0xb03f6fdd, 0xf3896ece, ++ 0x92bad265, 0xfec9a9f7, 0x799f7d76, 0xf1f0f2b1, 0xfe3c7824, 0x48c7862f, ++ 0x01e9f0f2, 0x0f2c9cb9, 0x7f8cf18d, 0x8bfe1e5a, 0x383f1ae3, 0xf70535bc, ++ 0xe3c7681d, 0x5efd653e, 0x009fcf33, 0x8bc627f0, 0x00aecb67, 0x7aca9f8f, ++ 0xaf0e31bd, 0x787116cd, 0x3d4fd7ce, 0x9ade1326, 0xe9b89c44, 0x4d8fdbb0, ++ 0x28cb5c1b, 0x3f1c9b4e, 0x9fed85bd, 0x8e4aa88d, 0x7e472ea3, 0x78f8fe2e, ++ 0x40c67f6a, 0xe62142de, 0x6de7242d, 0x277ae53d, 0xf780943d, 0x10d832aa, ++ 0x36df430c, 0x12d2c225, 0xc1987fde, 0x894fffe3, 0x859f22fc, 0x95bcc7ad, ++ 0x00cedd7b, 0x267c67ee, 0x52f4ff9e, 0x9423f07a, 0xc04d3683, 0x332ff1f5, ++ 0x07e5c013, 0x2b922ee6, 0x1f972691, 0xbfeea0e5, 0x4afffbd1, 0x8bd7a73a, ++ 0x4999ffd6, 0xff2f5ffa, 0x50bff89b, 0x8d9fef1f, 0xd8036ddb, 0x1182f818, ++ 0xf1833f1d, 0xf4a1c2a5, 0x233f523b, 0x664571d1, 0xb7267270, 0xbe5127f3, ++ 0x19ca45c2, 0x0cfc4567, 0x01d889fa, 0x4d7e86ab, 0x7e9093f4, 0xf22d98dc, ++ 0x7395fd51, 0x5fdaef29, 0x2f63f989, 0x192f3fe3, 0x939c8ed9, 0x0723b469, ++ 0x1d919fca, 0xb5835319, 0xdf5fd099, 0xf7e500cc, 0xfcc373af, 0x30f87f71, ++ 0x69da3bcf, 0x53b9f4e7, 0x9fa974e2, 0x7f38f8af, 0x51a65d4b, 0x388dd68e, ++ 0x1cad7fef, 0x4694ce6d, 0x6b3f2bb0, 0x14d7fa39, 0xdc8e9ff4, 0x7fe4444f, ++ 0xe2dc10f6, 0x3bb62587, 0xee1dafc1, 0xab7bf9e1, 0xf7f57cc4, 0xf03d0a37, ++ 0x0881995f, 0x2f9be3d2, 0x152c6cda, 0xcb82b3e8, 0x8ba0e6c5, 0x5dcd0ae2, ++ 0x79a5ff3c, 0xde392325, 0x5c537e8c, 0x0cb9a1ff, 0x3cf7beed, 0xfdf80da1, ++ 0x115c97ba, 0xedfd1539, 0x79da18f3, 0xe5e45fe7, 0x4da13c47, 0xd95e1f58, ++ 0x8e8c714b, 0x1e506f79, 0xef47e556, 0xa0a9adac, 0xc13f92f9, 0x4f9e356b, ++ 0xcb933c79, 0x7079fd33, 0xf201de00, 0xc0d9bfe7, 0xdec3b5f3, 0x097e8a80, ++ 0xd4ee1fdd, 0xd0ae287a, 0x6f1b807c, 0x0f5f3295, 0xd12e76fb, 0x9981f353, ++ 0xca6fd053, 0xd053ecba, 0xbdfcadde, 0x6f7df68b, 0x794399de, 0xb4379a12, ++ 0xaeebe717, 0xf68d5e88, 0x838c0169, 0xfb9bef76, 0xf3829eaf, 0x16dfe5d6, ++ 0xfb439bf4, 0x3fa36e2d, 0x1e78d99c, 0xa343e37d, 0x4ff9bf74, 0x08b60f90, ++ 0xf6ae643e, 0xf0c3b9ca, 0x59efcebd, 0xcffa89b2, 0xe28d8afa, 0xd83cbae3, ++ 0x5b216662, 0xb91ca0f1, 0x7ee3533f, 0x6fc8af6a, 0xf3cb9eec, 0xe5d94453, ++ 0x5e79e635, 0xfde5719b, 0x33fb8f38, 0xc7174f95, 0x13c90d72, 0xc7933fb8, ++ 0x4fb82cb1, 0xbf928c07, 0xdb8179c5, 0x85aa45d1, 0x9ebdc8e8, 0xd014f8f1, ++ 0x33f3da11, 0xf0b33de2, 0x8ee8d6bc, 0xef840cd8, 0xc2260b91, 0x19f73293, ++ 0x4aa4cb8a, 0x8de2bc7c, 0xd1636dbd, 0x7f3ea30f, 0x6b52a219, 0xc430ab57, ++ 0xf8279ef7, 0x7df12642, 0x578e294b, 0xcf335bf5, 0x24ec3cab, 0xfe4742ff, ++ 0x3cabca72, 0x70d592ff, 0x19f926ce, 0x1e517761, 0xe7a1d165, 0x3ee03e28, ++ 0x1f9b0d20, 0x8ba64efb, 0x3d22adc7, 0x66b729b3, 0xabe49786, 0x11f7f872, ++ 0x369437b4, 0x6b0f2505, 0x784c0735, 0x9ab22cce, 0x4c7f3f91, 0x7c426a87, ++ 0x98bc8815, 0x4c1f23fe, 0x457ed10a, 0xe944078f, 0xd77b98a9, 0x594c3ee2, ++ 0x04797bdd, 0x63c071f1, 0xa9bf466a, 0xfe4cde39, 0xf24ec396, 0x2a1c16af, ++ 0x50f3ebbe, 0x52af582e, 0x89ffabfc, 0x8f280b5b, 0x6639d61f, 0x21fe7598, ++ 0x3ffbccd3, 0x1ea134ec, 0x3f333653, 0x3278aa8e, 0xf7de68ab, 0xf9fa1943, ++ 0x33a7265d, 0x7e8a5e3d, 0xff4fd428, 0x61b21995, 0xf9c0ec9e, 0x7e0e15a2, ++ 0xfee148be, 0x978af712, 0x3b73c11e, 0xf71f84bb, 0xf30991d8, 0xa6d7efc8, ++ 0xf7878848, 0xd2af3c3d, 0xc832659b, 0x1ff8419f, 0xa2d5fca3, 0x7d71cfc3, ++ 0xff616306, 0x8bd3998a, 0x44ede6d2, 0x4a7162ff, 0x2f75f288, 0x14c98d6b, ++ 0xeefb532f, 0xf612d1ab, 0x7eb8db39, 0xf7c7de69, 0x9afbc9e5, 0x132bd38f, ++ 0x657a8cb3, 0xb26ffca0, 0x1967a657, 0x7a7ff2ed, 0xfb8cc2bf, 0x25bb64bc, ++ 0xc4375f79, 0x6fea4f0e, 0xcf45fb24, 0x1c1aa93f, 0x6ed1db87, 0x188a3edd, ++ 0x5caa73f2, 0xcda0fce2, 0x6907ffd8, 0xcf57ad2a, 0xa35cc9d7, 0xfd7cc6ad, ++ 0xf91877f8, 0x227cf4eb, 0x52287f3d, 0x227cf3c5, 0x2f9d1b26, 0xca76b1f4, ++ 0x62c51a1b, 0xb57e4492, 0x67df865e, 0x7c10fe61, 0x1156657f, 0xe601ffcd, ++ 0xdc932f5f, 0xbf9c24d4, 0xd24ef31d, 0xedd1de71, 0x2fbc714b, 0x3b3c68b9, ++ 0xd3a49de6, 0x39f882fe, 0x55f3c827, 0x78f03567, 0x65e80e43, 0xe68ce72c, ++ 0x605f6974, 0x3d55fca1, 0x3bcf449f, 0x2552e1d1, 0x76339de0, 0x45ca2169, ++ 0x8b653f3d, 0xf6895fc3, 0xf6049b50, 0xd1a7ae35, 0x784df221, 0x458d1dbf, ++ 0x4ff7a451, 0x0c928f9a, 0x252f3d67, 0x855a129c, 0x579fa3fc, 0x7449f3d4, ++ 0x27c049ba, 0x61c76bcd, 0x3557df6e, 0xfd1d6858, 0x4fc8738d, 0x6268dfd9, ++ 0x75540768, 0x261d395b, 0x8163b78d, 0x5fb0c585, 0x79476a25, 0xc7c3d3aa, ++ 0xdf80b7d9, 0x1f03f452, 0xb8afb55b, 0xf8ff780f, 0xf67a2eaa, 0x792ea5db, ++ 0x5d279d32, 0x1eeb9288, 0x51af6fdf, 0x9b3cc12e, 0x2404be78, 0x0ffb2bb4, ++ 0xee364ab5, 0x632fe2ab, 0x966de1f9, 0x98fd502f, 0xda092ef8, 0x51d7dcff, ++ 0xcda4654b, 0x75bf681c, 0xf5c46d7d, 0xdfdff429, 0xc71e7258, 0xc832b30f, ++ 0x87b6b39f, 0xff4247fc, 0xc8f97055, 0xee51adaa, 0x8fc8d2bf, 0x90bb2a76, ++ 0x695702ec, 0xac1e81d1, 0xdf92b5cf, 0xfe89ea0d, 0xc9998d4f, 0x7f8e35eb, ++ 0xf9e6eb96, 0x8237ac1c, 0xe154edf2, 0x375ff24c, 0x7d807f21, 0x7a1dc335, ++ 0x4e7af102, 0xf903b9ea, 0xdf95d4e1, 0x3f3a432c, 0xa3dbf077, 0x655cfe51, ++ 0x187dbb01, 0x9b2eb379, 0xb37e9bcb, 0xfd04bd6b, 0x7a15ddfc, 0x82f1d70a, ++ 0x3c6ce173, 0x7d20b002, 0x1a8f05a6, 0x32c3c8b0, 0xe04337ae, 0xdb9f33cf, ++ 0xa0ea9e93, 0x6ba17984, 0x191e7cec, 0xf6402521, 0xf4be684d, 0x1aff5825, ++ 0x4c3bd849, 0x497da54b, 0x718a96a9, 0x5ce2e5c1, 0x5bf82ca9, 0x9bfdfc16, ++ 0x15a3bd55, 0xe92ee030, 0xb70f2cda, 0x692ebddf, 0xff3fa1ff, 0x3ce6e42c, ++ 0xf4889b59, 0xfb9f35e1, 0x5be02d55, 0x08a3f8b6, 0x6e7935ef, 0x751ee78a, ++ 0xa17afa57, 0x3be0a95f, 0xbd679815, 0x153bef26, 0xd3937718, 0x4260befc, ++ 0x6e78cff9, 0x679e2a63, 0x3f087680, 0xfa054b67, 0xfeb33f63, 0xb2bfa152, ++ 0x40dfde4f, 0xaf3e563f, 0x3e78b6e5, 0xcdbf4f9e, 0xf100fa1e, 0x57a2fef7, ++ 0x477b5e28, 0x3197a9ce, 0x9994e2df, 0x9e48e7cb, 0x1d6793c8, 0xae8052b3, ++ 0x447b144e, 0x8b8f08be, 0xfdcb189e, 0x785f209b, 0x8938e75e, 0xe76b03f2, ++ 0xd7a7f3f3, 0xded69eb0, 0xce2f3c42, 0xbd3d9bfb, 0x5ad3ec90, 0xfb31bf91, ++ 0xe20a6085, 0xe397f671, 0x48e1d20a, 0x3e55d6f6, 0xc09bd6b3, 0xc66b5767, ++ 0xc6a535f2, 0xc6fc17f2, 0x7fa717f2, 0xfcb13638, 0xf3e03d9c, 0xc839454d, ++ 0x972347f3, 0x70ec9530, 0xbb4114af, 0x72cfc268, 0x9e5db9c4, 0xb143f8e7, ++ 0x74d9fb8f, 0xfb99f546, 0x586dbb6c, 0xb2e2fc2f, 0x63e09fa8, 0x823482b6, ++ 0xb8d1e907, 0xbd25f224, 0x07622b14, 0x7fb9536f, 0xa05ada18, 0x348b839f, ++ 0xe997f73a, 0x91cbb132, 0xc46c2b6f, 0xac7f3ab7, 0x039d03b1, 0xd9472b1c, ++ 0x6bf7481c, 0xd86dfecc, 0x6ab0ec97, 0xa66737a8, 0xf96fa8d8, 0x3bd2143f, ++ 0xa656edab, 0x3dd8f942, 0x3b432a0e, 0xa6c71f92, 0x2fe8a25a, 0x85f4235f, ++ 0xe9133dfc, 0x05854add, 0xda03ff31, 0xb1fdf0c5, 0x83b51b6c, 0xf7c7cd25, ++ 0x3f3acca7, 0x1f2854ce, 0xe75dcc54, 0xde911843, 0x2e7c156f, 0x0e3b7e0b, ++ 0x7f71a0f3, 0x3f927729, 0x09bb54ad, 0x36db7ffb, 0x852bce96, 0x2961ce07, ++ 0x54ac1c26, 0x9ba27215, 0xf9d3979f, 0x2033975a, 0xa8634715, 0x50e31253, ++ 0xf5133e98, 0x5d3b2338, 0xae3d73e7, 0xdbd36798, 0x3fec0129, 0x2df77c5b, ++ 0xbce1a15f, 0x2f78a65a, 0x2fe2ff75, 0x3cba8f48, 0xf49d65d8, 0x70f66d4c, ++ 0x06fd2ef0, 0x55b8e795, 0xb9b1ef0e, 0x63b277c8, 0xadea2e6c, 0x16bf1e35, ++ 0xc297284c, 0x1a416676, 0x41da03c2, 0x579abaf9, 0x71892b46, 0x73e71f67, ++ 0x07481768, 0x6bb31f78, 0xc39fc8b9, 0xc7c4db8c, 0xe3b67e75, 0x685c60fa, ++ 0xe30dcc77, 0x763dbb42, 0x3294cc6b, 0x35d3f8dc, 0xc6e3ef1c, 0xc4462c65, ++ 0x15c04733, 0xfe8220e8, 0x136e63a7, 0x911ce3d1, 0x832c7c27, 0x8d4ac78f, ++ 0x81a33779, 0xd7944d0e, 0xb9b3cc65, 0x8ad9da4a, 0x3dab727a, 0xddd23765, ++ 0x9c5d042f, 0x68c7fe70, 0xb17e93b4, 0xc938e4b0, 0xadd5d491, 0x58732448, ++ 0x5d13c917, 0xfd9fbdce, 0x4196254a, 0xbe476dde, 0xd4e8a3bf, 0xb8fcec42, ++ 0xd468eb67, 0x760f207b, 0x9d0ea6f8, 0xfa7f4ebf, 0x910e91bc, 0x30e807de, ++ 0x1d3afe69, 0x28bb6bb1, 0xb001f141, 0xdba9f133, 0xf0b58c9d, 0x6f2d747c, ++ 0xc4407d70, 0x7c2d6db3, 0x9a118d1d, 0xfb9e55f7, 0x47ed5f28, 0x83ffa139, ++ 0xf9305af3, 0x1b057cad, 0xc58d16fb, 0xb7cc15fd, 0xbff197cb, 0x3b64df37, ++ 0xb2f2e3fb, 0x7d63e247, 0x3ede697c, 0xcf0ecbca, 0xf69e5177, 0x1a97912c, ++ 0x3f91306e, 0x6463f61e, 0x5b3337c7, 0xa5eee514, 0xcfd62ec2, 0x71213c0b, ++ 0x31e4673f, 0xc137b6ab, 0xaf9a1ebe, 0x783e51ad, 0xebcf2564, 0x9b9fb01e, ++ 0x079fb234, 0x9f3898f4, 0xcb8531d0, 0x34db8eee, 0xa4f3773a, 0x1647dbc4, ++ 0x1d8bd231, 0x12fd4573, 0x3fdfaa35, 0xe60e6522, 0x327477cd, 0x770effa2, ++ 0xc8e7d511, 0xcfb0df5c, 0x51d37d73, 0x1d97f7c8, 0xfd509437, 0x1c744716, ++ 0x788907e5, 0xfb8c0efe, 0xfeb883ff, 0x7f467cdf, 0x33f940ec, 0x569ec7f2, ++ 0x9d211f43, 0xe40b292d, 0xf58f404b, 0x0597ee16, 0xc3d9dd7a, 0x65b04d30, ++ 0xae93ee34, 0x9bcf2d66, 0xcd5e898a, 0xc17ed0d9, 0x62d7a004, 0xb25abd03, ++ 0xc6dcb833, 0x3af4e979, 0xc9a5a740, 0x54a177f9, 0xe9e1df6c, 0xee337dfa, ++ 0x7eadba2b, 0xf3cc7f9e, 0x43e59329, 0x2b167cc2, 0x595e3e7c, 0x0d64f9a6, ++ 0xe18b9f37, 0xcd3a449b, 0x463f9c62, 0x852c9fe2, 0x83e5dc45, 0x3d9cf3fc, ++ 0x0ee38254, 0xbe5ad1f0, 0x6f321c9f, 0x74f445d9, 0xee3c0dfd, 0xbd727614, ++ 0x6ca7f18f, 0x18ae7f18, 0x60b6faff, 0xcddb07b5, 0x621c3895, 0xff983ff0, ++ 0xb73f513c, 0xcff289bb, 0x4f9b55e6, 0xba39da27, 0x5de3d4bc, 0xebfb440b, ++ 0xcc66b9d4, 0x6b5f9f07, 0xb82d338c, 0xaeb9c789, 0x67ec6f9f, 0x16f8db01, ++ 0x16b249e5, 0xc16fc233, 0x59fac64d, 0xa9f103d9, 0x3a9f18b1, 0xfd30fc2e, ++ 0x47c827c0, 0xdb2c674f, 0xf9d01b79, 0x9597efd8, 0xcaeedfa3, 0x9b3dc6cc, ++ 0x8ed0fca1, 0x3a7e54f1, 0x3f5f2bf3, 0x4abbf585, 0x978d5ca8, 0x11bee121, ++ 0xacf810f9, 0x3986f2b4, 0x4fa82985, 0x31b7bf44, 0x8473ef7a, 0x3b42e63a, ++ 0xca22a4df, 0x7e16ad1f, 0xbc25fe85, 0x6ec99afe, 0xb37c229e, 0x6ada7e46, ++ 0xe8f7bf07, 0x5dff2999, 0xd5ccf98e, 0xfe5ca245, 0x1f2c78e4, 0xfba2de97, ++ 0xb937ce14, 0x7343c414, 0x4f6ff70e, 0xe3629528, 0x69d52e00, 0xbe26ffa2, ++ 0x87f2daae, 0xaa4f9073, 0x133f78ab, 0x8adb33fc, 0x6de99db1, 0xb1cf9f2a, ++ 0x75fc20a5, 0xb65afb7e, 0x37614fe0, 0xf89c8506, 0xd695e059, 0x6837e874, ++ 0xc4b8fc93, 0xc857f4e0, 0xfc5cc12f, 0x50305e5c, 0x7c7fa0a8, 0xbbe78056, ++ 0x6756d956, 0x36bc3ca3, 0x75c0a964, 0xc729b6a9, 0x75211f31, 0x94a9ccfa, ++ 0x84636d1f, 0x6fffa05f, 0x7b4ffd12, 0x89053f2b, 0x7fa465ce, 0xeae6be9d, ++ 0xa46d5f74, 0xefdbe06f, 0x271ff7e0, 0x6df40dbf, 0x91efa41f, 0xd79879ec, ++ 0x6bd46c86, 0xb5ea379f, 0xf8927181, 0x91dc7933, 0x25fe06e4, 0xf9c1dfca, ++ 0xe61f1175, 0x31615662, 0xcebb69f2, 0xf5c7dfa7, 0x743d4c59, 0xf240a92e, ++ 0xbd83a78f, 0xd236fdd3, 0xaafc497b, 0x7d0f2fcf, 0xe743e5d6, 0x6e8a7f85, ++ 0x2f3ff297, 0x457231fa, 0x60177c3d, 0x82f38369, 0x72447ff1, 0xcf9f2d71, ++ 0x970b5203, 0xa1df6233, 0xf59a3ffb, 0xae321ef5, 0xefc1d2b7, 0xbfa1f00f, ++ 0x5316628a, 0xfbcc0fc6, 0xafa0f022, 0xf9f42c27, 0x6dd05b7c, 0xc97db581, ++ 0xf3f44f53, 0x1ea8d065, 0x1ddf8b80, 0x8ebe218a, 0x71872299, 0x0584b73f, ++ 0xf40d6e28, 0xc13b3471, 0xd7f01a6e, 0x79a9c124, 0xbc9ab904, 0x0cf8649e, ++ 0x1b27ade2, 0xbfb9fa9f, 0xe45ef581, 0x15ed933a, 0x37e8c5af, 0xbdfe134c, ++ 0x5e7f41b4, 0x32d7d629, 0x79fc9f87, 0x73f6897e, 0xa07f60b5, 0x61adae9c, ++ 0x734957e4, 0xa79fc899, 0xf12321db, 0x739715c9, 0x9cbb55b9, 0x7c86f389, ++ 0x98f4c97d, 0x81bf7ac5, 0xb69b5acf, 0x7ff2317d, 0xdf90cb83, 0xf1e2eb5f, ++ 0x39740f80, 0xa2a77ac2, 0x0f281fde, 0x53bdfbd1, 0xdf250e51, 0x817b56e3, ++ 0x2ed39dfb, 0xf5acf448, 0xf51532bf, 0xef4d5a7e, 0xbf679454, 0x0dfc0d4a, ++ 0x1365f2e9, 0xc327cff7, 0xd26396d3, 0x451798e3, 0xa47cc9a7, 0xb8671fc7, ++ 0x8c9cce43, 0x39d4bf41, 0x9cfc87a9, 0xe8aae9fd, 0xf488543f, 0x670b51ec, ++ 0xbe697fa2, 0x768cc5ad, 0x94350af1, 0xe8e5c39e, 0x66e11f47, 0x1c029b15, ++ 0xfa1d54bf, 0x2587c2ae, 0xe02edc38, 0xb3d0a570, 0x6994ef6f, 0x281d521f, ++ 0x98a18add, 0x8b3349f0, 0x4806df12, 0xaff7ea3f, 0x1f240dbd, 0x763ff6c3, ++ 0xf65dbe93, 0x538a7acb, 0x6266dd8d, 0x1cbe825a, 0xee187517, 0x2fb0991d, ++ 0xd89e50cd, 0x3f686395, 0xa19150f9, 0xbc6c4a7e, 0x2773fea1, 0xa9e50dcb, ++ 0xda1a973d, 0xcaa17b4f, 0x77a4be50, 0x83fda18e, 0x8e01efa8, 0x9e6d7f9f, ++ 0x769ffde1, 0x71893ecc, 0x37e2cbe1, 0x233fbe1a, 0x122c0cfc, 0xf58529e8, ++ 0xf5e9d62f, 0x7be19d42, 0x52626b30, 0xff3df225, 0xe791bc5b, 0x8804cfbb, ++ 0xa4b7f625, 0x5c4f68dd, 0x2794e2c9, 0xfc951cd8, 0x6ef98631, 0x43c6fac6, ++ 0x8fd7049d, 0xac606fbb, 0x4d099177, 0xc072ebf5, 0x808718ce, 0x5f30d360, ++ 0xff7e246f, 0xb097fc38, 0xff089fd1, 0xff119f56, 0x7f88cd76, 0xff11a967, ++ 0xff11bf6e, 0xf88dd3a9, 0xf88c04f7, 0xe231af4f, 0xc468233f, 0x2302d67f, ++ 0x4643b3fe, 0x306a8ffc, 0xc5af3de2, 0x1582ef88, 0x4616bc46, 0x27d4316e, ++ 0x4f4e81d3, 0x5e2cfcba, 0x3db1bb7f, 0x4094c500, 0x2d9d3a17, 0x1e50360e, ++ 0x6ff698d4, 0xa64bc619, 0xe44cb18f, 0xfa4a7e6f, 0xc2e90fb8, 0xa0174839, ++ 0xa6723a97, 0x15b19d92, 0x0ac60b9f, 0xbc383ffb, 0xafcba19d, 0xb89ebd44, ++ 0xae491e6f, 0x6257d10d, 0xbea23d1f, 0x7db47dc2, 0x123d1f70, 0x40c8befd, ++ 0x1be0d2cf, 0x83763fc9, 0xcc71e7ca, 0x77f9edc1, 0x6812eab0, 0xc3a66d07, ++ 0xf5c45f7c, 0x3a2ff8c0, 0xe41f9026, 0xc665d646, 0x3d626f71, 0xe2c85cf4, ++ 0xd5310cf4, 0x3164ae70, 0x5f845a0b, 0xb4e11ba4, 0x895bd6dc, 0x45fdff7a, ++ 0xf8a65ea7, 0x17e933d8, 0x69c70f75, 0x618cbf8c, 0x2790acec, 0x8187187d, ++ 0xf0bb79f2, 0xe6980613, 0x59e7804d, 0x9bacd7e1, 0x659e9125, 0xc7f283b2, ++ 0x912cbeea, 0x33fbaa9e, 0x8736fe7f, 0xe7e4b5eb, 0x5c3a159a, 0xc07d85db, ++ 0x1e0704ed, 0x1df8a576, 0x1ec8b90b, 0x6f88abf5, 0x45c78fe8, 0xfb42d3fe, ++ 0xcf8d9f76, 0x298911f3, 0xb8e8d3d3, 0xf11de11e, 0x7ccae78f, 0x47bf3e36, ++ 0xf086cccc, 0x6442c09d, 0x80adde1f, 0x8efde3c8, 0x2a9efde7, 0xc3a17f42, ++ 0xaa17db71, 0x74f3c12f, 0x9fe4d591, 0xfa332aff, 0x916a6fe7, 0x55ff3fc8, ++ 0x7d3c3798, 0x7a87dfaa, 0x947f2f59, 0x3f7f71a3, 0x59f783b6, 0xfd0916be, ++ 0x7f599f63, 0xdbc5be07, 0x06fec27d, 0x5e7c61fa, 0xd4f887f8, 0x40b9affd, ++ 0x97a056df, 0xe4655f3d, 0xc3f64c3f, 0x8341928e, 0x9996de60, 0x53e007df, ++ 0xf17df1b6, 0xf06abf09, 0x07b33133, 0x9c7e6fcf, 0xd6f9873d, 0x47ce1367, ++ 0x7b0d1d00, 0xa3abed4f, 0x66b29db8, 0xd1294f55, 0x7e7b88a3, 0x2a49d577, ++ 0xf29f8acb, 0x2d9ef121, 0x16f7c24f, 0xc827d42f, 0xdf05c517, 0xb33dc827, ++ 0xc697482b, 0x43d55dac, 0xb8b346f1, 0xee5d6c0f, 0xc1286aed, 0x147e32bf, ++ 0x6cc4b73f, 0x3266a611, 0xdfc3da61, 0xd218b36b, 0x672aac8f, 0xecd1f713, ++ 0xb844e4a4, 0x793e0935, 0x3e8ff059, 0xc60fab6f, 0xcbd7984b, 0x36cf6e76, ++ 0x5c163da9, 0xfa85cbc7, 0x19bd3bbd, 0xee5d8fe4, 0xb376f925, 0x80f583c0, ++ 0x30f3c314, 0x2acf0556, 0xbfbd2f63, 0xb17c069d, 0xc33359f6, 0x3bdae0f8, ++ 0x72893aaf, 0xe2d692c4, 0x7c7d018f, 0x6a25d9ed, 0xeab81868, 0x794fab4f, ++ 0x570e513f, 0x007e128f, 0x99878721, 0xafe5e90f, 0xaf9bfca9, 0xfda669dd, ++ 0xcabed7f4, 0xad9f2f28, 0x41cabf80, 0x3f306538, 0x8b0f53c9, 0xab8dcbd3, ++ 0x32c7b180, 0x8d9561b6, 0x7fa0ac85, 0x7dd90b59, 0xf4402c99, 0x5c7fd1b4, ++ 0xa7ba7245, 0x3e20f9e2, 0x69ee9437, 0xeef3f347, 0xf83d03b2, 0xc08c6174, ++ 0x514e794b, 0x8dd5a2bc, 0xa947cc65, 0xef8c3281, 0x008ef510, 0xbd453b2f, ++ 0x9f6f3a73, 0xf2c9ef1c, 0xe16693cf, 0x9a9bf5d3, 0xb52f9462, 0x16af9f8c, ++ 0x71e834f7, 0x6fd70c91, 0xce50b382, 0xb7113355, 0x8bf7f5e5, 0x76bba675, ++ 0xfac22faf, 0xfbfac619, 0xb5c7bd44, 0xfb0abdbb, 0xdfac6d1f, 0x754ffa2c, ++ 0xee927a3d, 0x8e35c9e5, 0xb7a8af7f, 0xa1ed1ebb, 0xefc6bdef, 0xd5bd44db, ++ 0xe0a8f3c5, 0xccee22df, 0xf189d7eb, 0xb1326f33, 0x7a9d0250, 0x28583be7, ++ 0xb569ef01, 0x19b28669, 0x7cf1c3fb, 0xb5615efc, 0xbdf0c73a, 0xc577ffde, ++ 0x8a3329f8, 0x46dbdf0c, 0x9fb6378f, 0xf07a469f, 0x4b770176, 0xfea1b96e, ++ 0xf4af1ebc, 0xb607bcf0, 0x7957b447, 0xa97bc57b, 0x4bb7ffa1, 0x7bcc54b5, ++ 0xbb320b38, 0xf8ac7107, 0xb7cfc86d, 0x90b28bbb, 0xa6aba34e, 0x720271a3, ++ 0xe2b23e03, 0x9f4f1553, 0x7289af78, 0xe9fb28a9, 0xabfc2859, 0x50d5566b, ++ 0x2bd03779, 0x2ab07f3e, 0xa007cf40, 0xdf77c1ac, 0x28357e87, 0xb17e876f, ++ 0xc5fa15bc, 0x2fd0fde7, 0x7e83ef3e, 0xf4337eb1, 0x617be58b, 0x07be583e, ++ 0xddf2c1fa, 0xdb963fd0, 0xbca90556, 0x7a02d56e, 0x8855777e, 0x35566b9e, ++ 0x51d1fd50, 0xdbcba7d2, 0x5b4100ab, 0x385bc869, 0xe0ea6a3a, 0x6f3d1439, ++ 0xfc32d3a1, 0x42b7f13e, 0xe0b015fe, 0x0157f451, 0x9abdd37d, 0x8ebb1b79, ++ 0x3d3a7ee2, 0xbd93f1c8, 0x3dea85b1, 0xfd1c7c35, 0xb08de63b, 0xec7e4adc, ++ 0x979ddb16, 0x9f28bbb4, 0xdff71c67, 0x69845f33, 0x65bafc95, 0xa4e253fa, ++ 0xa3529447, 0x0eb42d5c, 0x1ff98f7f, 0xe8f238c4, 0xc72e0096, 0xc3183d36, ++ 0x3f9776bc, 0x1411f744, 0x930d985c, 0x70bafe04, 0xe9e0d339, 0xebda35ad, ++ 0x06e5d569, 0xd0be587b, 0xb96ced4c, 0x59da1a37, 0x768675bc, 0xae16b775, ++ 0x463c21f5, 0x375875f1, 0x30d966ae, 0xcd8e92ee, 0x9725ae34, 0xcbd60de3, ++ 0x2fdf3def, 0x7b0af5f1, 0xac5521f0, 0xe491b6d7, 0x2f0f58e9, 0x4c46a496, ++ 0xfcdf0728, 0xc3f12a69, 0x91303f83, 0x8b1c73df, 0x135f109a, 0xfd633d40, ++ 0xe54bd644, 0xa15528c9, 0x3269853c, 0xe2c73f96, 0x3d832764, 0x9851f7f8, ++ 0x7e8728b7, 0xb9f28760, 0x3c43d0bc, 0xfa462a5f, 0xa3e044a4, 0xb78bb744, ++ 0x437ec929, 0x42fc9725, 0xc955f3c6, 0xeed5ed71, 0x3bb42cca, 0xdf908fce, ++ 0xf99df4e6, 0xc1cfe2c5, 0x7a15fb33, 0xd6efefea, 0x3b9ec34c, 0x3e95c82e, ++ 0xdb867ddd, 0xe9192e40, 0xfa1720bd, 0x9bf6573b, 0xcd1fd44c, 0x1fb4e3a3, ++ 0xe5d66359, 0x5cca9686, 0x2a7f6589, 0x83c7584b, 0x56285eab, 0x08872048, ++ 0xd3aab26e, 0xfcaf5f31, 0xe62a2997, 0x3c889559, 0xb2ab7dcf, 0x498f5747, ++ 0xf588d3f0, 0x93aeb294, 0xbd4a1fa8, 0x57ed3f26, 0x7f61aa03, 0x1edd1f6b, ++ 0xf22df3c0, 0x1cc7e678, 0x9dac71a0, 0x7fcb85ce, 0xc91e4997, 0x1a66aec7, ++ 0x350e1bd8, 0x498f30ca, 0x7d8997ef, 0x5c85d7f2, 0x4d55d77d, 0x75f397f3, ++ 0x3b201dbd, 0xafd55de7, 0xbbd71e62, 0x48fa661d, 0x2fac6d3e, 0x842ffd55, ++ 0x1e974e80, 0x7a71fa70, 0xba76d28e, 0x25de50cf, 0xe60a1c31, 0xd334f3c1, ++ 0xde6dfdb8, 0x8022c956, 0xa14c6bcf, 0xaf6f820a, 0x2ba4d076, 0x94d7687d, ++ 0xfbfba16e, 0x5c5c22c7, 0x461b9708, 0xa3d0e357, 0x4b8e094b, 0x8917bac4, ++ 0xd3c9ac75, 0xc3e62fe1, 0xffbc0102, 0xbe876970, 0xf3ae37bf, 0x2faab2ee, ++ 0x8f6b7d62, 0xc9da794c, 0xf2973cf0, 0x401494bb, 0xee04dd78, 0x2e79828f, ++ 0x382a79c2, 0x2f8474ef, 0x532ddb8f, 0xb73c512d, 0xaaea5e7c, 0xd133fd21, ++ 0xc9b6f944, 0xcb90d974, 0x4737d0ed, 0x4ed7c4a9, 0xe7a259df, 0x2fdf72c1, ++ 0x7ed3a716, 0xb731eb84, 0x2058f5c2, 0x11fa25a0, 0x1afee837, 0x21c0be71, ++ 0x3f703be6, 0xe79e78da, 0xdb3d62e8, 0xa4678f30, 0xe47fd27d, 0x93ed2616, ++ 0x3f483500, 0xf7946d53, 0xc3cf41b2, 0x94694ed2, 0x3c4f0e77, 0x7413621f, ++ 0xbc6dceba, 0xac53b62f, 0xa3e053af, 0x87e7a6df, 0x24a76a04, 0xeba8579c, ++ 0x80bf27ae, 0x17eaf71e, 0x877e98fe, 0x28d54e31, 0x78ffa148, 0xe303957b, ++ 0xee3ced2d, 0x0d7dd8d5, 0xf0f39fbf, 0x29bf747d, 0x3d21a9f4, 0xf5f68bd4, ++ 0x817e8deb, 0xc442fb25, 0x877ec9af, 0x40033f64, 0x78f682ce, 0x57619fb2, ++ 0xfd67b0ae, 0xb5c60a6c, 0x3e2c6cce, 0x5b7980e1, 0x739d190a, 0x4a3f251d, ++ 0x358307f7, 0x82f78eda, 0x0f7e32b2, 0x7cfd90ce, 0xb2e0859e, 0x18efc74f, ++ 0xbec1f117, 0xec0e5ca9, 0xb5f6fa3b, 0x6f9fa063, 0x7ee1926b, 0x666b6ffb, ++ 0x0c39eefa, 0x2efbc020, 0xcb866ac6, 0x9ae58b67, 0x9f9e9d3e, 0x8a9dfc61, ++ 0x27bd43a6, 0xbfc91a9c, 0xf7dd239f, 0x4a6bf89f, 0x9c51f119, 0x03e1577e, ++ 0xe707cf8d, 0xf64ce78d, 0x985ade9b, 0xe5cf0f48, 0xa6de622a, 0xab8f274f, ++ 0x573af38d, 0x1ce67cf6, 0xa0dfaf3e, 0x3b1f397e, 0x7e78999d, 0xfed79f40, ++ 0xff35ee11, 0xcf9da7e3, 0x487ea374, 0xce1f5380, 0xed382467, 0x9f3f0cb7, ++ 0xfdbc0abf, 0x9fbf38e8, 0xa7fd6863, 0x8c3adfb4, 0xe3f73df3, 0x6c51eb9e, ++ 0x4aff7cc3, 0x65f5f3f0, 0xc04d8c52, 0xd042abaf, 0x3f908567, 0xb12bda7e, ++ 0x28d34bf0, 0x614bad6f, 0xae58b5e9, 0xad5fec5c, 0x12f7de0d, 0x79893d06, ++ 0xeb25ec71, 0x6a6ff2b0, 0xfb0b971e, 0xe161a473, 0x47f517e0, 0x402ba99f, ++ 0x0bf7733d, 0xa1728656, 0xdd9fe455, 0xf0d976ad, 0x8e1d5cbe, 0x67872e58, ++ 0xea5f12d8, 0xbbc572c7, 0xcc35cd36, 0xde3e2678, 0xa37c49bd, 0xc73fa78f, ++ 0x7d7295e7, 0xf1971d28, 0x33bdc15c, 0xac7ba79e, 0x4850adee, 0xf8627ef6, ++ 0x7f824c6f, 0x6bccf9ec, 0xcf8cbd39, 0x4b37f803, 0x22f94c7f, 0xfc52c394, ++ 0xff1865d7, 0xfd6884b7, 0xa7638061, 0x194e1434, 0xf45e9c79, 0xd7ebe9f5, ++ 0x6cbeede7, 0xfdc1e131, 0x869495a2, 0xdfa4cf3f, 0x35724917, 0x5c3fe855, ++ 0x198be917, 0x31973f0a, 0xdfbc2155, 0x3a52fd3b, 0xc45fb347, 0x5897e3df, ++ 0x843dfd86, 0xeeff1890, 0xe0f5cf0b, 0x6dd233be, 0x600c7ba6, 0x0ebbef9f, ++ 0x567e51ef, 0x81917ba1, 0x5ef06a9e, 0xbccfa3a6, 0xde76829d, 0x3cb8f357, ++ 0x8790aafb, 0x1ae417fd, 0xccf2df3a, 0x409caabb, 0x64f30bff, 0xf4f49f61, ++ 0x4d95b9e0, 0xdf3f3ce5, 0xd701ec25, 0x380d7d33, 0x6ff4d77f, 0x7a04a559, ++ 0x4acf36bb, 0xc4b26ddf, 0x5fd0fd33, 0x62ccb0f8, 0xd2f41764, 0xe70372fd, ++ 0x870e54f2, 0x0ce38ae6, 0x37571ded, 0x616e77bf, 0x2ce5c69e, 0xbc20fbcc, ++ 0x577b8c77, 0x0afac7ad, 0xf068af18, 0xf1cab77b, 0xefca98e9, 0xc677b97d, ++ 0xd7bc546f, 0x7462552e, 0x628bf35f, 0x2cbcfa9d, 0x5d0f1c85, 0x683d3d15, ++ 0x855445c7, 0x62ba7ff2, 0xded0dbb7, 0xbba2f9d7, 0x9d7baf90, 0xdd787fb8, ++ 0x9e28d2f4, 0xf8e9d193, 0xedd0bca3, 0x809b3748, 0xfb251e2f, 0x8b3827ab, ++ 0xc14ea3e0, 0xa447dcbc, 0x275fba1e, 0x22a2d532, 0x4c9a961f, 0x02c273c6, ++ 0x3013fa6f, 0x37cf7649, 0x7aeaed04, 0x31b4ee5f, 0xdef7873c, 0x68a9b985, ++ 0xba79ca9f, 0x1157e7bd, 0xe6b9ef8e, 0xeaf89d93, 0x898daed3, 0x72030df9, ++ 0xb1b9f616, 0x25e583b1, 0x6c6ce0fe, 0xd68594bf, 0xb4ba5da2, 0x4fdc3643, ++ 0xf3e0aaf0, 0x2c9c1725, 0x2fe76096, 0x9d237e99, 0x21725aaf, 0x2abfde85, ++ 0x155ea0f2, 0xb1514ff9, 0xe78b1f8e, 0x694fbca1, 0xf493fbff, 0xfdff03cd, ++ 0x97971d60, 0x538c3cd1, 0xdc16bd4a, 0xf4ba6d4f, 0xe5ae74af, 0x8f7fb08f, ++ 0x3ad1ff59, 0x612c59d3, 0x177681dc, 0x9e962cec, 0xe68d1788, 0x175eb83d, ++ 0x9571ffd5, 0x38e063ef, 0xc1c700ca, 0x700d8bfe, 0x097fda1c, 0x5571ffd5, ++ 0x3ff4c7e9, 0x0bfe8461, 0xec1ff30d, 0x3fbd3477, 0x21eeac7f, 0xb1cbf027, ++ 0x9e3b5dd8, 0x23be3cc4, 0x9fefba56, 0xa2aaea1d, 0x308f76f3, 0xc779873a, ++ 0x8cbcbf91, 0xec7779f9, 0x8c71f8b6, 0xa17c737e, 0x30fd187f, 0xbc11a99a, ++ 0xfe7f4af7, 0xad315e57, 0x4dbdf927, 0x6f98aa89, 0x54552b67, 0xd6364fd4, ++ 0xf70bbd13, 0x9236151d, 0x5f9fba4f, 0x5cc1f7ef, 0xf51f20d9, 0x175e4dfb, ++ 0x2b9368f1, 0xf6fc8bd4, 0x57ef83ba, 0xa136b381, 0x3ff1ad1f, 0xc1e79565, ++ 0xa23f687b, 0xdc15b9fb, 0x6ba315e7, 0x7cf0c828, 0xf42d5cca, 0x7dff7e2a, ++ 0xf7e80710, 0x09ee2796, 0x3dd29e61, 0x8f77ff62, 0x4fe7c7bd, 0xf2177b90, ++ 0xefa74f94, 0x77e893db, 0x8c1eefea, 0x01737d71, 0xf724d1e7, 0x10aea4fc, ++ 0x8af559cf, 0xb234ae7b, 0x4e2aeb7b, 0x75787dd0, 0x7d7e7efa, 0xcf3efc72, ++ 0xdd78fb83, 0x79829f2f, 0x37efa856, 0xead27bf1, 0xff5cbc9d, 0xefca74ab, ++ 0xb38c7d87, 0x7ed0e50c, 0x41efcfd9, 0x6fbe0954, 0xdbf7398b, 0x7c23e536, ++ 0xdf9c05fb, 0xee8a7eee, 0xfd7b7c5d, 0xfa83a218, 0xee9b7f9f, 0x239fdb51, ++ 0xbb0ec0f2, 0x5bd50f49, 0xaf7895fd, 0x6e1cfedf, 0xb129766f, 0xfb04f294, ++ 0x156e5d73, 0xd737d7c9, 0x7da1318f, 0x97d5c3ae, 0x26c2e5cf, 0x895d9f3d, ++ 0x92b9e257, 0xbf622b37, 0xc0783d26, 0x6477bf4e, 0x4a97f83a, 0x9371ffba, ++ 0xafd1ee95, 0xcb6e383a, 0x2a6fa802, 0xaa5e5131, 0xe69da0e9, 0xbf036e73, ++ 0x45bf0a8f, 0x7074dd7d, 0x542efd14, 0xf94e33bd, 0x7f0e4d63, 0xea49c609, ++ 0xee9e7e0f, 0xcf733fbf, 0x9b947cb8, 0x7cb433a7, 0x1ef7efba, 0xfbac3a00, ++ 0xfcb1e1f4, 0x3a34db7d, 0xe4dee9df, 0xd7e70d0c, 0xf249f5d0, 0x73fb577d, ++ 0x843f9ca6, 0xf36719f0, 0x12f286ef, 0x71633efd, 0xc9fd597f, 0xf30d3cf8, ++ 0xaafec5b9, 0x87c6f5de, 0xc75d4f74, 0x7a71372b, 0x7d01f1e6, 0x6e3c967f, ++ 0xfb3bd0bd, 0xf885f12d, 0x6bf55d3b, 0xefc5fc04, 0xa69bd607, 0xe9d7efd0, ++ 0x7494dff0, 0xc0506c1f, 0x799e7f5d, 0xf67ba146, 0xc7c81ec0, 0x2399d278, ++ 0x33b7a256, 0xf9d0269b, 0x7abc7d6e, 0x7c0a8d80, 0x9b4d3a7a, 0x72fdf884, ++ 0x7fefc6be, 0x9df7c35b, 0xd37afbfa, 0x77c41ae6, 0x794cb0fc, 0x3c6afd3c, ++ 0x7a20e305, 0xb03cbd3b, 0x7e996e9e, 0xce7f6a6f, 0xd03bc251, 0x32ba4315, ++ 0xfa4ddcfd, 0xfe73fc36, 0x566f55bb, 0xe91388b0, 0xed2b05f7, 0xb61d8ed3, ++ 0xffdc1d92, 0x3c273f22, 0x5731dee4, 0xd9ef1f3c, 0x147cff0c, 0xbcfeb5c9, ++ 0x376e2ef8, 0xbb9ee9db, 0x69a153fe, 0x2d966e22, 0x46cbf1ee, 0xc3fded7b, ++ 0x6bda18f6, 0x47f8a4f0, 0xd1f1ed84, 0xba4e23fb, 0x749e04af, 0x0749831e, ++ 0x2dbbf47c, 0xdf7c5dac, 0x91dfdf43, 0x728b1a1f, 0xe8628efa, 0xf7df85df, ++ 0x8bf7bb51, 0x0cb19342, 0xbc62397f, 0x2f37ea1c, 0xa5ef4054, 0xf7fc7d77, ++ 0x7d45da48, 0xad87d50f, 0x8eb469a1, 0xe759bbdf, 0xb4fceb30, 0xcd2dd5f7, ++ 0xd03a274f, 0x26700de7, 0x2e192ffb, 0xcedcf91d, 0x4c91e1d5, 0xfcf80397, ++ 0x3fa1f998, 0x1f39ce85, 0x30dc78e6, 0x49e5c2ce, 0x73b204db, 0x849386e9, ++ 0x87d5a97c, 0xecba255f, 0xa2b60737, 0x329f8a5e, 0x1c0f7e33, 0x67e80658, ++ 0xd5dbce98, 0xe93f393b, 0xe44378f3, 0xf1b63751, 0x1e37aa7c, 0x917f357e, ++ 0xbef1cf0b, 0xabc7386a, 0x93a0fdfb, 0xb8abf414, 0x5d4a5afc, 0x65b7b719, ++ 0x3dff179a, 0x8d664dac, 0x722caf7e, 0x27f238cf, 0x0768b19c, 0x0dca1ee9, ++ 0x4f484d13, 0x7b2e7e6d, 0x5d7ced22, 0xfa52fdfa, 0x70c9513d, 0x98bf2e79, ++ 0x0b0f8eff, 0x8c778cdd, 0xa65a669f, 0x7dd1b208, 0x2ff80d79, 0x68c37900, ++ 0xf3cec053, 0x0c2f497c, 0xf2ce97bd, 0xf667bf31, 0xb17e5bbf, 0xdb3ad180, ++ 0xd41491fc, 0x7ca9afab, 0xd5a747df, 0x7ccbbf51, 0x6fe7749d, 0xe0ebea36, ++ 0xa833f3ef, 0x6be0e49e, 0xa64faf12, 0x0dde5d33, 0x0dd20781, 0x41df8bf6, ++ 0x0bf2e7df, 0x9902dc79, 0x63f9ef1f, 0xe7e60b11, 0x2c2afae9, 0x773c2629, ++ 0x52d1e7de, 0xdafb2e90, 0x6356d38a, 0xcb4783de, 0x93a04f2c, 0xe74671f0, ++ 0x073c35ad, 0x977f0d31, 0xfd093025, 0x8cd3fb79, 0xf9e4847e, 0x77b33a3c, ++ 0x9ffd6261, 0xc0ffb9f3, 0x69f9c05c, 0x30cf80b2, 0x744743bf, 0x41d04cb0, ++ 0x39743f9b, 0xda932bed, 0x2a96db2d, 0x7de923e8, 0xa4df93fb, 0xc69d97fc, ++ 0x8a4f167b, 0x693b5ef1, 0xf1934889, 0xe6bca0e9, 0xde5ccd86, 0xb6b2fc35, ++ 0xa65e4ee4, 0x7666097b, 0xcf7e977e, 0x2beef166, 0x5f97184b, 0x3e9d1784, ++ 0x4a07e717, 0x6f8bbed0, 0x93e45597, 0xcd326d86, 0xb7694da7, 0x67f7876d, ++ 0xeec999b7, 0x39f3106b, 0x214a1b9b, 0xb14c29bc, 0x2acfdc00, 0x6bb214a1, ++ 0xeddf8bb7, 0xb4075a49, 0x1f295e7b, 0x8e363e06, 0xf14f8267, 0xca707430, ++ 0xec5a7844, 0x8b77fc60, 0x4f3a253a, 0x742f3672, 0x60fb9633, 0x65f74f3f, ++ 0x3dd237b7, 0x3ef0c930, 0xbd110b6b, 0xd1eb132e, 0x8e3c99e1, 0x847ecf0e, ++ 0x274fda27, 0x0bfe9077, 0x05232fdf, 0xefdda3b3, 0xe67b3ed0, 0xfe5f2be1, ++ 0x0cdfbe3c, 0xfa868c76, 0x5fd7e8b6, 0x72077d41, 0xba98ed0a, 0x2c99c5c3, ++ 0x7ee36f49, 0xf9d9eeb2, 0x7d04a629, 0x5321d6d9, 0xf46da59c, 0xd42594bc, ++ 0x916bedfe, 0xfe6b4ebe, 0x7684f2cc, 0xbf4902c1, 0xaf80c087, 0xa41fcdfa, ++ 0x1b0d38e0, 0x1d2eb4cd, 0x2730fd2f, 0xceedc392, 0x7f7fd228, 0xd5fa9c6e, ++ 0xdf4034f1, 0x9e9d0788, 0x028adda0, 0xfdc38c55, 0xa1857db5, 0x7430ff4a, ++ 0x183ef4b2, 0xe6dbfb17, 0x2f3ffba6, 0x1e1d5c76, 0x7c16f803, 0xe3c4654d, ++ 0x8ff242ae, 0x94294e9b, 0xfdba7e64, 0xe3e47caa, 0xd00fb07a, 0xc52f510f, ++ 0x587ba65f, 0x9ee95b0f, 0xb7cdfae2, 0xd5e38cde, 0x613568bf, 0xab91df7d, ++ 0x92bcd126, 0xca700af0, 0xfbde8e1f, 0xfef9e30b, 0x5d81f804, 0xafadfc41, ++ 0x34de6127, 0xd167d80f, 0x85fd3e3d, 0x3904cf80, 0x1f814df0, 0x885aaf68, ++ 0x523df9be, 0x9355eb03, 0xad26abd6, 0xf44679f7, 0x5a21fccd, 0xac97e2cf, ++ 0xf8bf7c26, 0xa094d77b, 0xc36faddf, 0x5f575a2c, 0xf212605a, 0xf43e5f57, ++ 0x5cbc8c3f, 0x67583dfc, 0x67583fd9, 0x35f09dbb, 0xe2d33ae2, 0x583fd8bb, ++ 0xb7014767, 0xfe75f533, 0xe852d151, 0x971e3ff7, 0xc251fa19, 0x9f4dc179, ++ 0xbdfa65e7, 0x1bc8b0b5, 0xd2766f08, 0xddf3abf9, 0x5d7f3efc, 0x1778c00e, ++ 0xa2260f49, 0x6d2abe87, 0xafa474cb, 0xe315647b, 0x3e1b7d15, 0x3dfc6bf7, ++ 0xb24dbebc, 0x5f43768a, 0xc81f8715, 0x7de3d203, 0xa96bc1f9, 0xbf4cc47c, ++ 0xfda676eb, 0x7dd1df83, 0xf4cd8709, 0x85fdd57b, 0xb00b4dc1, 0xb945f30c, ++ 0x9eb97006, 0x5a66addb, 0xfbfadb7f, 0x647d63d7, 0x273a64db, 0x1b5f5432, ++ 0x51b0dce1, 0x5321f036, 0xfc2f1a34, 0xff7451bd, 0x90670e89, 0x3fb825b0, ++ 0xe581e1d2, 0xe10713f9, 0x03f71612, 0xefc09da0, 0x0cf2130f, 0xf5c453e1, ++ 0x41979e04, 0x76e78639, 0xc957d246, 0xef5927f2, 0xb901dffe, 0x8dc79462, ++ 0x7ab3bf49, 0xd6f9524b, 0x3cb1b924, 0xa929bea9, 0xb5f3f41e, 0xafa5f9c3, ++ 0xad728cd0, 0xf751c04e, 0xc3dff68f, 0x29d7bbcf, 0x41f7059a, 0xfae4ce8f, ++ 0xb6615eb9, 0xf92f89cb, 0x853aa039, 0xf1cb5ab5, 0xb892dfbd, 0x5afe825f, ++ 0x765069ad, 0xed043970, 0x65092c6a, 0xf3eade5d, 0xb7d050f9, 0x7ec4fcfe, ++ 0xe311da82, 0x0c161f18, 0x9729ef13, 0x0cfa7e8b, 0x971eb3ee, 0xfe199f69, ++ 0xff3fd725, 0xb89ea81f, 0x008000ee, 0x00000000, 0x00088b1f, 0x00000000, ++ 0x7db5ff00, 0xd5547c09, 0xb3b9ffbd, 0x84eb2665, 0x08109084, 0x2481d933, ++ 0x2a22c24c, 0xa20900ea, 0x088b0d22, 0x8059388a, 0xda808d90, 0x066d5697, ++ 0xda2d1612, 0x2d8a8cf0, 0x510140ea, 0x50542f23, 0xe0ffd1a8, 0x8da97142, ++ 0x9a56b16b, 0x46b20a80, 0xd3df4b50, 0x7f7dfffa, 0xdee4dee7, 0x7beb5121, ++ 0x87a3e7cd, 0x67b9ef73, 0xe77efdf9, 0xe2339fb7, 0xb40f73eb, 0xfb510bc6, ++ 0xdbb89a42, 0x26efc425, 0x238b9b8a, 0x7f16f885, 0x6796f457, 0x4e8b9cf6, ++ 0x0fa7e7a5, 0x28c5c2d8, 0xe3db4a21, 0x85a2d926, 0x7ba039d8, 0xe3ed5f7a, ++ 0x03108a5c, 0x6d3bfb7b, 0xa19e8ce9, 0x745a776b, 0xe9cccf46, 0x39ee97ad, ++ 0xa8f220d7, 0xb9bf08b4, 0x7d35fa80, 0xde98a0be, 0xe07e791f, 0x2f3d3324, ++ 0x24f06d7b, 0xd0e39513, 0xee2158ef, 0xbb7ebab5, 0xdfede68e, 0x4ad9e61b, ++ 0xeafd3ef3, 0x3fbe135c, 0x5a856afd, 0xe5cbd4fe, 0x30524727, 0xf849b47e, ++ 0x8de374da, 0x9fb89974, 0x23d75332, 0xf2a18d97, 0x8ddc83f7, 0x65f7deee, ++ 0xe5cc82a6, 0xdad5bed4, 0x3ef300bd, 0xcab588ad, 0xc67ede80, 0xfdfc5cb9, ++ 0x1f47bde9, 0x71e69db9, 0x05a1dee4, 0x567a8166, 0x9fde8f9e, 0xa67460fe, ++ 0x7d3dfa93, 0xa567924f, 0x3f5c7e82, 0xcceed415, 0xcd9e515d, 0x30fedeee, ++ 0xdffa1d4e, 0x1f38d17b, 0x7ce40fca, 0x93e79ea9, 0x8295fae3, 0x4da37ede, ++ 0xa04d5fae, 0x566bc47e, 0x962a56cf, 0x2836937f, 0xd1b3eb16, 0x43c0fabc, ++ 0xe130dad9, 0xf7fc16ca, 0x257fff2d, 0x7854bbcf, 0xbe4d226c, 0xf7def617, ++ 0x9f98a2e5, 0x3e366c2f, 0xf8ea245f, 0xc60de2f9, 0x79a215e7, 0x6fad2775, ++ 0x5cf8c049, 0x9fdd8458, 0xd0a54420, 0xc56cdafe, 0x6d544251, 0xd0cc36ff, ++ 0x4e99f84e, 0x578263f8, 0xe04a3de9, 0x29efea6e, 0x09581025, 0xe665defc, ++ 0xebae8675, 0xbf9b9756, 0x9fe2307b, 0x78753a0b, 0x96126c3d, 0x61eb8244, ++ 0x1627b09b, 0x14211fa0, 0x7cffd7ea, 0x7d2b6058, 0xaff0f772, 0x30734a52, ++ 0xd049a25e, 0xd2756efc, 0x2b95093f, 0x829a3f9e, 0x16d6ca7e, 0xf3753b79, ++ 0x3ef5633b, 0xdf7d3b78, 0x6c5596fd, 0x278776a6, 0xd1279a05, 0x6ddf0ebc, ++ 0x31f634f6, 0xcd6be3af, 0xf0471022, 0x81114bb8, 0xfc7f54d1, 0xe1094a68, ++ 0x47adb3e5, 0xf4f54a53, 0x7ab988af, 0x9a4ad47a, 0x36e7e309, 0x61e50b1a, ++ 0x13d60b5a, 0xbf17aeda, 0xf06af9c6, 0x5d459874, 0x0eb0f45f, 0xb3ef4f74, ++ 0x2f0b31bf, 0xd6f3fdf6, 0x6233e800, 0xdc0f17d3, 0xb76cfa08, 0xf634dd3a, ++ 0x5ecde7d2, 0xec5bad33, 0xdc320735, 0xba247e78, 0xdd2fde92, 0xd669da3b, ++ 0x5ee97bad, 0xf4007173, 0x425ce7be, 0x33f70e59, 0xef8915dd, 0x7e80f7ef, ++ 0x23c79bfb, 0xafaf332e, 0xf9a3bb6a, 0xd67d1d63, 0xea1ac5b4, 0x3524f74b, ++ 0x5f5bac7f, 0x4491fe15, 0x608979ff, 0xad5109c6, 0x9ca9d752, 0x06ae1377, ++ 0x69f4d81f, 0xbb0130a6, 0xb45c47be, 0x5f99d3ce, 0xa21750db, 0x8fe81c73, ++ 0xa2ed17e6, 0x7c099e79, 0x5e682d15, 0x37b376f6, 0xda1e07d0, 0xddffb65c, ++ 0xfcd2a6fc, 0x47e77a12, 0x7cc369f3, 0xbad679b4, 0x95226dba, 0xce8f61e6, ++ 0x05a53f03, 0xc04fcb4d, 0x58f494be, 0x4d365eda, 0xdc2d7f10, 0x83a570bb, ++ 0x59a670f0, 0xf3d184f1, 0x1b8276f2, 0xa37ca1e1, 0x502d8039, 0x8bc77598, ++ 0xdd97aa0e, 0xd3e9ef4f, 0xef09e629, 0x8bf6a5cf, 0x7d7331ef, 0xbe9fa6df, ++ 0x375e056f, 0xf018455a, 0x59bd1e18, 0x7e604f1d, 0x2df9d44b, 0x33e6bf69, ++ 0xfc5bc685, 0xc413d9bc, 0x3ca35bf7, 0xd6b65e78, 0x5f4f587a, 0xea0ff10b, ++ 0x2506e16f, 0x4f837410, 0x1e9fdf18, 0x44f957eb, 0xab4df3c8, 0x8f18be67, ++ 0x171422d2, 0x3df185f8, 0xf9a65efe, 0xbdff552c, 0x60dd633d, 0x43b4e7e0, ++ 0x57ec0e88, 0x4082674b, 0x014cec19, 0xfdef4f1e, 0x5c780524, 0x67bffbfa, ++ 0xd7f03e8a, 0xa3da9fb3, 0x108d3fe2, 0x8dc910e2, 0xf741536f, 0xf717a6e7, ++ 0x10c77ed1, 0x5bb62fb9, 0xf43d83fd, 0x5f4dc5fe, 0xb3383f31, 0xd9cc37d7, ++ 0xeef6fd07, 0x94c3bf57, 0x10e83288, 0x39b4c728, 0x793ec6af, 0x1bbceac1, ++ 0xf579b1f4, 0x7754cdcc, 0xe485673c, 0x22334b12, 0x7f60bf79, 0xabf5d42c, ++ 0xe0ed93ed, 0x4ac7280b, 0x8863b0fe, 0xabb7a394, 0xbefb6f72, 0xfa33d3b3, ++ 0x2eedcf98, 0x31dbb72b, 0x198df244, 0x5c6fe2ae, 0xfc9b8654, 0xf087c0d1, ++ 0x04f15d7a, 0xafa5455f, 0x053afac6, 0x334513cf, 0x1b444397, 0xe10b0f97, ++ 0xe17b448b, 0x42ce0271, 0xfc058d0c, 0x7af3cf78, 0x6f37cc7d, 0x5e077153, ++ 0xc7f07a0d, 0xfa56c08a, 0x5d9379b7, 0xb0846398, 0x47c77c91, 0x7f33b951, ++ 0x5bde8c35, 0x149b35df, 0x50f317a2, 0x271e9f0d, 0xe465fbf0, 0xfe3d18ec, ++ 0x3a51bdf6, 0xecd5fd15, 0xea308b36, 0xab2ed4ef, 0x3da24608, 0x676a17ed, ++ 0x9b0be37d, 0x5da97c1b, 0x8eb41911, 0xf3c754a5, 0xde2c13a5, 0x6e2e0e80, ++ 0x10e195b7, 0xb864ceeb, 0x0f78b69c, 0x39fd034c, 0x177e6d4b, 0x0a9f29fa, ++ 0x2c4d6379, 0xfb5e61b5, 0x776498de, 0x16b16f03, 0xdbab37de, 0x9c3b71b5, ++ 0xf4db3fe8, 0xbd2273b6, 0x116b1eef, 0xd1f1e99b, 0x61d72257, 0x55e3691f, ++ 0x3e9e25ba, 0xc84a2069, 0x70be7dea, 0xf829eccc, 0xadf0917e, 0x6a2d1d06, ++ 0x8ea08b31, 0x255a8fee, 0x8f9e17be, 0xbad1c110, 0xf26712ef, 0x8f9e16ba, ++ 0x1d47e7e6, 0x28d1ddb2, 0xaa571749, 0xcb52cde3, 0x47f2d59b, 0x918f2bf3, ++ 0xf87a9d5f, 0x254adbcf, 0x4dd2badf, 0x9d28d6fd, 0x10d32653, 0xdacf13ab, ++ 0x693fd7c0, 0xd8608a70, 0x4e33ad77, 0xf6e37504, 0x10ef3bb4, 0xdc3d38c1, ++ 0xdeef3c5c, 0xfbf246f5, 0xbf121a4f, 0x06c98e07, 0x9ff6f638, 0x85e38066, ++ 0xfbf267fd, 0xbfb21a4f, 0xfd91ffa7, 0xcc36eff4, 0x74dfb7bf, 0x6394de7e, ++ 0x5744d112, 0x02c3074d, 0x52ecd9bc, 0xfba9854e, 0x685829ae, 0x7fb1f577, ++ 0x5930a2fd, 0xbbf7a78c, 0xc74153cc, 0x4ea59ca7, 0x2c6b73ec, 0xe88ba5f1, ++ 0xea77ab7b, 0x586fd4a5, 0xd03880ec, 0x1a7752ef, 0xd8abebaf, 0xafe3a63a, ++ 0xbbf4fd48, 0x315d4831, 0xca434dea, 0x9b37bccd, 0xbf3e641f, 0x8fc72ed4, ++ 0x7accde7a, 0xaed8b896, 0x9c77f5ca, 0x50cf9865, 0x6c7b935f, 0xc6a27cef, ++ 0x67802cbe, 0x0c37c7b1, 0x938d607c, 0x07ef2df6, 0x5eb4d7da, 0xf47be29b, ++ 0x1fa1e852, 0x67e80984, 0x597c395f, 0x6e3edd4e, 0xbd54db71, 0xbe0c982e, ++ 0x5c2d17e8, 0x8e73dd2e, 0xfda2ece1, 0xef69758b, 0x866e8a97, 0x18b5f63b, ++ 0xb8b49a04, 0x5f1efdf8, 0xef6e7156, 0x8ef47a3c, 0x4dfa443f, 0x9ec2ffb4, ++ 0xf01a26ff, 0x9ee9633c, 0xadb2a1ee, 0x87a11cdd, 0xc96e93ef, 0xfd0d2737, ++ 0x9e93af22, 0xe23be2d7, 0xa17d3f4f, 0xa7fc0b2a, 0x0f3bac36, 0x85f17ef3, ++ 0xbf03c9ff, 0xaaf9eaff, 0x9dbe7861, 0x609eb3da, 0xe8f5aeeb, 0x4e174bfa, ++ 0x6f7c69bf, 0x187805b9, 0xedf3e17b, 0xc60e37cf, 0x0d895a3c, 0x6adfd209, ++ 0xfb4f5feb, 0xe0e40e38, 0x467c0fbd, 0xbb617f10, 0x332ccf65, 0x7bed4af8, ++ 0x7d509ba4, 0xdf295ecc, 0x01150cc7, 0xd9fa1b93, 0xaf81737b, 0xa736b1da, ++ 0x9e129689, 0x717ac1df, 0x13bb58f8, 0x10db7472, 0xf20dbe39, 0x17df0d3c, ++ 0x1f6f01c5, 0x5ffd9f10, 0x218d83f1, 0x76f820fc, 0x578d2b6d, 0x0e9cee63, ++ 0xe17c403e, 0xda85f035, 0x66f17e3f, 0xba2d0b8e, 0x57bf5813, 0xed477dc7, ++ 0xefb76be7, 0x9f2ba04f, 0x8b9ef3bd, 0x7375dda8, 0xc7605292, 0x9476a894, ++ 0xb9404698, 0x9c557418, 0x2fb7333b, 0x95ed2af9, 0x0f9f14e7, 0xd927f070, ++ 0x2333903d, 0x693d8593, 0x20541800, 0x7b8d2675, 0xe9526dc8, 0xcd1d768d, ++ 0xa6ba847b, 0x2db706a7, 0x1679658f, 0xfa3a0018, 0xee3dc757, 0x75827ef6, ++ 0x9bdfed6a, 0xafae6373, 0xe9abfd8f, 0xdb5b36dd, 0xbbb3cc32, 0xbced9226, ++ 0xbe8af177, 0xb09cedfb, 0xf61a39a0, 0x855ae444, 0xc460efe8, 0x0903fd82, ++ 0xf48cff1e, 0x73ff439d, 0x356abfaf, 0x718bcaea, 0xe7a0e5ae, 0xc071ce92, ++ 0xef8732e7, 0x6d5f78ef, 0xa04b0df7, 0xea1a9e25, 0x30818acb, 0x78938e2e, ++ 0xc5b9c512, 0xce5fce7d, 0xe39144a7, 0x1e3a9897, 0x3dfe88b9, 0xa4a7ca21, ++ 0x566abad2, 0xd3bd48c6, 0xf78e31d2, 0xee40d357, 0x544d94ef, 0x6bafa5f4, ++ 0xaea438f0, 0x5c559f67, 0xb9d69e7e, 0xa78c7d6f, 0xbe5de691, 0x4b05fae6, ++ 0x2a685ca9, 0x0d9a084e, 0x78c18ff3, 0x6192fed5, 0x9d7fa449, 0xaff3aab2, ++ 0x716fe757, 0x75f7ea66, 0x351bfce8, 0x854ee2fd, 0xa3fe37ed, 0xd8feb3fa, ++ 0x0f54ddc0, 0x777b9d33, 0xae72e416, 0xbcb903c9, 0x18f69c31, 0x527f7dd9, ++ 0xed30f9e7, 0x7e00fb3f, 0x13cf16be, 0x89f7e5c3, 0xb002980f, 0xed278bf7, ++ 0xb6fd7c65, 0xa663d236, 0x29044ab1, 0x32bf34fe, 0xf63d65e1, 0xf3ff8993, ++ 0x2bad277c, 0x8d97d537, 0x671cdc75, 0xe797794a, 0x03391be1, 0xb904d1fa, ++ 0x0fd0ef8e, 0x85331d79, 0x944acad3, 0x3c826758, 0x4b94e998, 0x7dc8a859, ++ 0xad784b32, 0xe13aef18, 0x9f6f76e3, 0xffa179b6, 0x85db0dbf, 0xf0bd7de6, ++ 0x2279f3f3, 0x228de5c0, 0x126fedc8, 0xe0d75c9d, 0x7372744d, 0xa393a4bc, ++ 0xff0ccc83, 0xb7ef302b, 0xd686f222, 0x3c663ad3, 0xf6c19598, 0x8640cb50, ++ 0x7bcdf7cf, 0xb43f4a86, 0xaaa6a78f, 0xf53678fb, 0x90eaf333, 0x50385c7d, ++ 0x77c667c3, 0xb38ea7ed, 0x644ef63d, 0x4ae1c112, 0x7a57a515, 0x29ded8ab, ++ 0x3f0a4732, 0x8263a7e1, 0xe57b0039, 0x7c457780, 0x2ceb99bc, 0x663c3ab7, ++ 0x587fab96, 0x50c6a221, 0x56f90ffd, 0x9ecd3fa6, 0x57f6ae99, 0x72f7de74, ++ 0x6e9f3d0c, 0xa58a6d6e, 0x6421d4fa, 0xdef8e86f, 0x2d3bf155, 0x4eaebfb0, ++ 0x969f3e37, 0xae4bb463, 0xc066cd15, 0x6318fa77, 0x0b807dbb, 0x2a6555d1, ++ 0xe92317d9, 0x88c423df, 0x82bf196f, 0xa89fe3f5, 0x769d9c7d, 0xe68676ce, ++ 0xb7d539b1, 0xb440952c, 0x164fdafc, 0x11615c60, 0xbe0d1c7f, 0xfd99a6ff, ++ 0x6f49876e, 0xf23e92f4, 0x08490371, 0x253e1652, 0x63f50afd, 0x3ca107a4, ++ 0xf2e2e0de, 0x782de924, 0xc3c1ba7f, 0xc5a9fdf5, 0xa5bf473f, 0x00b73f6b, ++ 0x121c6b1f, 0x291c6bbe, 0x2abff801, 0x90a79ada, 0xf72a2efa, 0x5947edb4, ++ 0x029e2c1e, 0x40e8bb31, 0x6b947edd, 0x3aabec7a, 0xea57db3b, 0xe9516ffc, ++ 0x99a896f3, 0x9c12e4d7, 0xf66bd96f, 0xcce87d70, 0xa3c6d759, 0x7f7ae56e, ++ 0x5e7353f4, 0x1ada3e11, 0xf7bd9b8f, 0xf6de7e60, 0xb471fdae, 0xe30da3ce, ++ 0x359ffe79, 0x27fe7978, 0xf972a61a, 0xfbe2d4b7, 0x9cf89db8, 0x5b6bcbf5, ++ 0xd4c92cbb, 0x78abc8be, 0xf72f5fb1, 0xe880408a, 0xca558361, 0x07240d81, ++ 0xe6277fb0, 0x56f87cce, 0x7bed3e01, 0xdd79f418, 0x308a4bd5, 0x25f1f4ce, ++ 0xfebbb416, 0xdce2216b, 0x7df9f4bd, 0xbfadaef4, 0xa9dfc546, 0xe7861417, ++ 0x27eb9329, 0xaffc77d0, 0x9f6e5999, 0xa954d0b5, 0x4707b3ff, 0x0b44fc04, ++ 0x0da777cb, 0xdcb0de82, 0x40341aea, 0x209d07a7, 0x9e9d0abc, 0xffa9e27c, ++ 0xdfe9f448, 0xeafb680f, 0x1f5fe02f, 0x1a45fe49, 0x06bfa7cc, 0xe8921b7f, ++ 0x5a78fd81, 0xaf480fb5, 0xab9c808b, 0xe07cfd55, 0x089fa83f, 0x71d5fe97, ++ 0x6127923b, 0x573c60ff, 0xca7f2f56, 0xea60f1dc, 0xf1deaeed, 0xfc2db7b6, ++ 0x7ea9afcb, 0x5bf2602a, 0x129d0e49, 0x8f7fa76d, 0x64896d75, 0x62b65b3f, ++ 0x5c87af09, 0xafde0115, 0x52cb8ad9, 0xf1e7fc4f, 0xfe0f0f1d, 0x161c808d, ++ 0x7fbd3c62, 0xf3047d6e, 0x9eace7a7, 0xfef8f543, 0x63fdf961, 0xf0ecfef7, ++ 0xd4f7941e, 0xca8cfc14, 0xe00ea73f, 0x73ffca7e, 0x9bac08c9, 0xa248b6e4, ++ 0x567c9efe, 0x3e883a09, 0xadf65b73, 0x8cf9a24c, 0x1a65d8da, 0x16fe654c, ++ 0xc8e511a5, 0x400f53a1, 0xea947e5e, 0x6e8cbc62, 0xb1939b75, 0xfe0706cd, ++ 0x73cb0572, 0x69cf9ca3, 0x60d27cf9, 0x47ef2bd1, 0x57c76d28, 0x0cd7de10, ++ 0xf580bf7d, 0xf3ccd158, 0xeb3eddd8, 0x1d791b9d, 0xde6049a4, 0xcb0f3625, ++ 0x137f8095, 0x2f94ece8, 0x737ac3db, 0xe021ffb1, 0xc12f94f7, 0x0cf33903, ++ 0xa097d1d9, 0xaf0b21fd, 0x6f2dd9f3, 0x12afc345, 0x83a9f643, 0x77e4d7de, ++ 0x9afb414f, 0x7a012ea1, 0x95c8fa18, 0xda9f0153, 0x7137bb5d, 0x0f76d53f, ++ 0xdd8accec, 0x4327f6e7, 0x784abbff, 0xbb5f4032, 0x8597fd64, 0x96998f5e, ++ 0x4be9b15a, 0xe628ef59, 0xf569317a, 0x932fb416, 0xaa83cf7a, 0x799d133c, ++ 0x6498efcc, 0xfaf8bd5d, 0xfbc6bd25, 0x127f6e0d, 0x1c9acafc, 0xd225f924, ++ 0xf26c05b0, 0x37498efb, 0x7e5c30a6, 0xa9b2fca0, 0xefeb4872, 0x3bf09b41, ++ 0xf4a19fa8, 0x8dec7e1c, 0xb7772936, 0xbd00df12, 0xc6977268, 0xe58da675, ++ 0x97e0bdef, 0x772566c9, 0xf923c117, 0xb7c930c1, 0x73f8e07f, 0x1cb35663, ++ 0xa5a7f4d6, 0xc1cf92e1, 0x53ef8b07, 0xb0437ca2, 0xdcaa85be, 0x0e571616, ++ 0x28a88af4, 0x5f8c50ef, 0xc14eef6d, 0xba1e481a, 0x4cd6aed1, 0x4e9a54fa, ++ 0xf01c8a9f, 0x27a1e483, 0xef859bca, 0x49fb687f, 0x18cf3411, 0xa38fc494, ++ 0x14766a51, 0xf27d1559, 0x36d6d4db, 0xc3fbdbf0, 0x1a8dbf24, 0x5b457ccd, ++ 0x2f38e867, 0x11f77ed1, 0xe485797f, 0xfdf68f86, 0x1689c8e4, 0xa6cbebc6, ++ 0x5f24fdea, 0x2008e48b, 0x18ec4b68, 0x08a37bae, 0x6691858e, 0x3ec3ebe1, ++ 0xdbc24ad7, 0x94e75895, 0xbb4308f8, 0x1b58f8a2, 0x5d0ff1f6, 0x93c559bf, ++ 0x23ca5c39, 0x6f26b873, 0xb222f15c, 0xf5cbf5af, 0x3b18e2de, 0xa499f008, ++ 0xc775b0fc, 0x046f8b58, 0xe647279e, 0x1c9c1cb3, 0x4f90e339, 0xf04a3af0, ++ 0xa1bd743c, 0x1ff612eb, 0xa6dd0fa6, 0xfb09bf08, 0xfb1b73f1, 0x9daddabb, ++ 0xc117fe4f, 0x8e497db5, 0x33f97607, 0xb0ec2fb4, 0x58da6653, 0x8e876d5f, ++ 0x07dbed48, 0xcfb0033a, 0xbacab39f, 0xbdfa9e7f, 0x6b7cb043, 0xe598379f, ++ 0x1a30e0c8, 0xa379f608, 0x5bb4578c, 0xfc875eeb, 0xec915f6d, 0xb30819a1, ++ 0x8f88c4fd, 0x10fd9347, 0x51bbfc90, 0x3f08de09, 0x9b73ffbd, 0xd896fb40, ++ 0xaa54dac0, 0xc699dcb7, 0xf64839f3, 0x578c52f5, 0xab7cce11, 0x049bd625, ++ 0x3fccf4f9, 0x5a372ccd, 0xc91ea9f2, 0x4afd9d7c, 0x49bc332d, 0xabc52788, ++ 0x24d96b78, 0x7f860fdf, 0xf2ddef12, 0x6558bffb, 0x76d41bfb, 0x3f7e2af1, ++ 0xf694e950, 0xdf07f33f, 0xe80b08f4, 0xe95a677f, 0x9103c0c3, 0x31e2125f, ++ 0x60cf2ebf, 0x950de1df, 0x9e99b957, 0x5cc53f54, 0xfd6b9f95, 0x38fb03e2, ++ 0x6ff2c5e8, 0x0eadc2de, 0x1575f7d0, 0xcc922e8e, 0xcac560e2, 0xd7e9d828, ++ 0x30c1ccf9, 0x76625fda, 0x4f47b791, 0x5eb8c54b, 0x66b96e39, 0x00cb05ef, ++ 0xedba17df, 0xe3d66ee2, 0xf6f5a383, 0xcfe78693, 0xadbee5c2, 0x9f789b69, ++ 0x125e5ede, 0x67cff926, 0x9b3f72e1, 0xe8ad7d22, 0xab9ee97f, 0xd1dbd3ee, ++ 0x8aae16f3, 0x8ea87de6, 0x7bc1b27b, 0xd019c7df, 0xa972a6db, 0x378dab8d, ++ 0xabdda675, 0xeece9e10, 0xefc00b0a, 0xf74ab379, 0x7382c34b, 0x3a76cfc0, ++ 0x9c797b7c, 0xd879e3ca, 0xb333f1cf, 0x338eb063, 0x4a7a92af, 0xf4a90f6d, ++ 0xe38cfb00, 0x4c51755d, 0xfbad425f, 0x7b638f6e, 0x4071a149, 0x4656476f, ++ 0xed7e866d, 0x169379b3, 0x47979e82, 0x10f51c70, 0x3fb521f6, 0xf4cb1d54, ++ 0x5557ff38, 0x87af006f, 0xb74c6d8a, 0xfea5da87, 0x737ad7fd, 0xd3dff110, ++ 0x903fcf33, 0xbe9ddf49, 0x0db8c8e3, 0xfcae7654, 0xf982ed90, 0xe1a66b2b, ++ 0x7795f9bb, 0xfa9c074c, 0xabf357db, 0xa3c3718d, 0xb077de69, 0xe799f8ce, ++ 0xbfa89bf7, 0x0fd555c1, 0x9610e621, 0xe7883bee, 0x5aceb6b5, 0xb9f6a3c0, ++ 0xcf60528f, 0xd8fbd99c, 0x5a54fdce, 0x657f7da3, 0x4af2bebe, 0x66742af7, ++ 0x7c04cee9, 0x2f842d6b, 0x2f2a91d0, 0xf474aa97, 0x61df748b, 0xf95eafb4, ++ 0x23c7d607, 0x5f243a72, 0xf187e3bb, 0x5bede381, 0xbbe8519f, 0x5af6f0aa, ++ 0x3c81cd2e, 0x1284ebcc, 0x00d2568c, 0x9d176957, 0x63a30674, 0xce6bd873, ++ 0xf6d55b7a, 0xa6293890, 0x5dfaa09a, 0x36aabbe8, 0x3a01d7b3, 0xe61b0116, ++ 0x8abeda1f, 0x1fbb739e, 0xb452bcf8, 0x7bb1e7c9, 0xf414bdee, 0xc441116e, ++ 0x9e3f8e77, 0x70f419b1, 0x9963f76a, 0x6864b8fa, 0xe57ce179, 0xde824ffa, ++ 0xe927ae08, 0xd6f41589, 0xcfb0661a, 0xc49e3f4f, 0x31e346f4, 0x3c7e9d3d, ++ 0x5abae38b, 0x53fc5abf, 0xcdc6da78, 0xb6f03ec0, 0xab3e838d, 0x6f6119f1, ++ 0x3afb63cb, 0xf60f2dbb, 0x449fc6a4, 0x3f265b71, 0xa265b40f, 0xe92633fd, ++ 0xadc6d0af, 0xd379327c, 0xeaefd2dd, 0x7d418d37, 0xb5d466e4, 0x7d6fbf7e, ++ 0x866c1b59, 0x4840f0fa, 0x13fa5d3d, 0x9e82789f, 0x5660be4b, 0xd2e13eed, ++ 0x7a92e8f0, 0x03e5c332, 0x5b97069b, 0x558f8993, 0x3ca96e61, 0x9e07296f, ++ 0x678d7e90, 0xe0c97df2, 0x1eb1a7b3, 0xaa58e7f0, 0x914f40e7, 0x1aead6f3, ++ 0xbde7421c, 0xc94583f2, 0x9f5e6ff0, 0x1a1af32e, 0x357f921d, 0x5a9f243a, ++ 0x106e3511, 0xc95a37de, 0x3d81c85e, 0x63ed2079, 0x3e1c2f6b, 0x897af06d, ++ 0x17d4f725, 0x63b7c86d, 0x98de2c3f, 0x47d3d76f, 0x07d1f6e3, 0x938b7248, ++ 0x2c1e2ddb, 0xb812d1a1, 0xe3717a17, 0x5f9b7376, 0x97bb7bf0, 0x7c8c9fda, ++ 0x5bb44df1, 0x00b631b4, 0xfdf6ac7a, 0xde450de2, 0x47bcdd72, 0x37c2376e, ++ 0x1f58cdb7, 0x2f58c7b5, 0x7f4c1749, 0xf977eaff, 0xf47d6341, 0xe8fd6301, ++ 0x01ceb7bb, 0xfd985619, 0xa7a19af7, 0x00e5387f, 0x67b1cbe4, 0xbe068d9e, ++ 0xdf2a3eaa, 0x3423fb0f, 0xa8f081ff, 0x6ff73f40, 0x5ebe5853, 0xcfd10790, ++ 0xfce2d63e, 0xdd3d70a0, 0x7eff0a54, 0xf6c2fb8b, 0x1cdb4427, 0x7559d12f, ++ 0x90693bfd, 0x17bf5aff, 0x41b7adb7, 0xb71d0a5f, 0x222b7dbf, 0x9ff82ebd, ++ 0x77cbc64a, 0x164fd497, 0xbadfd047, 0x1e80a6b7, 0xb0a97e4b, 0x3a792e5c, ++ 0x4dd065eb, 0x5779ced7, 0x2a673973, 0x8bf343c3, 0x82576e2d, 0x8e775451, ++ 0x60f13d17, 0x6d2ef341, 0x85f6d30a, 0x175927cc, 0x62d24792, 0xcf78bf7c, ++ 0xee207fbe, 0x847f615c, 0x1b15f4e3, 0x9d69ef8d, 0xaa1ec12f, 0x4fd8263c, ++ 0xdbe5b952, 0xb97be330, 0x3aea85ae, 0xf845bd34, 0xe758172f, 0xf8a9b225, ++ 0xbe23ff18, 0xb7d3b57e, 0xaf607d29, 0xcb4972be, 0x57e03326, 0x753f7c23, ++ 0x1fddb1a6, 0x2cf9a08c, 0xf60c3d22, 0x5e65c90c, 0x310db9df, 0xe7a28fec, ++ 0xcfcf41c2, 0x90718e89, 0x4576e7d7, 0xa5dc6479, 0xea939c63, 0xf80ea98b, ++ 0x86668855, 0xb2f83553, 0x578dd259, 0x8c0447af, 0xed2cd175, 0x704b6aa0, ++ 0x2551e01f, 0xe03bf93a, 0x9aaedf51, 0x007075d6, 0xef9092f4, 0x04e38785, ++ 0x8c6d234b, 0xbe7ba5bf, 0xd7bfd30d, 0x4ecd31ec, 0x8fa4fcd4, 0x0e10de56, ++ 0x7aaab6fa, 0x815dcb65, 0x3d69fb9d, 0xebbf34ab, 0xa7f3077a, 0x7e49361b, ++ 0x2663fa4f, 0x7eb2d9d6, 0x06fbaf38, 0x055eebc5, 0x5d86757d, 0xef492fd5, ++ 0xd225fbc3, 0x267a422f, 0x49ba49fb, 0x40acdddf, 0x420b6cdf, 0xdfb96e7f, ++ 0xf82cfacd, 0xeff5fb24, 0xd2beb071, 0x2bea4332, 0xf107eb2d, 0x94c17ff7, ++ 0xca87a093, 0x93dcb4f9, 0x60f47acb, 0x0c4efcb3, 0xd23f3c12, 0xbaed334b, ++ 0xe7fa6979, 0x6fefa761, 0xb6f5bae9, 0x214776c4, 0xe22a23de, 0xdf9c907e, ++ 0x6eafcaaa, 0xf9fc0382, 0xfbc52b1f, 0xdad19711, 0xb8cba775, 0xde49b8eb, ++ 0xf63b6a6d, 0x669b97fb, 0xf2057ddc, 0xb9301e34, 0xf83add1a, 0x5899bd7b, ++ 0x1debc7ff, 0xb8d3c005, 0x737fd249, 0xf5f25f28, 0xf3823188, 0xf6a1fe51, ++ 0x93748ffb, 0x270c4ca1, 0x3e7ea4ba, 0xdffe922e, 0xecc531a8, 0xeddd232f, ++ 0x1af2bee6, 0x5e5219ac, 0x5f8adb95, 0xf98facbb, 0x85117068, 0xf1f59fd2, ++ 0x9cb36532, 0xd7f39797, 0x83a7fdc6, 0xab1f6cfd, 0x07c34772, 0x9658d1d1, ++ 0x8b1f2ac3, 0xf59fa10d, 0x0fd00ba0, 0xa7a5c2e8, 0xdc7d231f, 0x47fb48a0, ++ 0xb27293cc, 0x5bc25625, 0x0fd133c3, 0xe89bbde3, 0x108fd243, 0x8bef8dff, ++ 0x0a9ed25c, 0x75b45bb1, 0x10b767f7, 0x7433b83d, 0x7a50ce71, 0xd8c09610, ++ 0x94478aef, 0xa71d8f8e, 0x2d922a10, 0x70461fc2, 0xb8646c83, 0xac0965dd, ++ 0xb10cf9a4, 0xb50cfc48, 0x2923fa48, 0xe02f0fe3, 0xd51b5ef6, 0x2c5bee4b, ++ 0x24bed4bc, 0x283fb059, 0x9894f49d, 0x409dfc01, 0x1999f089, 0xf12a127e, ++ 0xec8c497d, 0x1ce884bf, 0x9fd45a79, 0x654034d7, 0x6f10e36a, 0xe04fac14, ++ 0xfe02e8fb, 0xdf926fde, 0x0e542d7b, 0xa9fb934b, 0xc318557b, 0xd0cd64af, ++ 0xb4cbd04c, 0x697a4649, 0xa5f490c9, 0xb922df95, 0x2793e582, 0xb4a67211, ++ 0x99cb3869, 0xcd714746, 0xa7d7ec6e, 0xb250bda4, 0xc76ba6fa, 0xe23b7e62, ++ 0xc7cad83c, 0x38e4efa7, 0xbcd36944, 0xdd83dedb, 0xcfc1ddb1, 0x8afa6487, ++ 0x2b37a033, 0xe9bb05ae, 0x2f75e941, 0x7be912d9, 0x538cdb5f, 0xba72a7bf, ++ 0xd09be77f, 0x36cfa623, 0x42e9fb73, 0x934545fa, 0xff5ae71c, 0xea4496e7, ++ 0x0a09daef, 0x1cbbd587, 0x886594ce, 0x9df8a83f, 0xa379d2af, 0x5dfdcc43, ++ 0x3435e624, 0xfe073533, 0xfb2cd27b, 0xd21f6fd0, 0x36544fda, 0x361a4f42, ++ 0xad43ee59, 0xbf41fa3d, 0x7d48668f, 0x170ab16a, 0xe5704ead, 0xc36be5f6, ++ 0x51a2d2ba, 0x5459835a, 0xa9359ebe, 0x969ceb0a, 0x006ca62a, 0xe6667fdc, ++ 0x872e917c, 0x6f1d3208, 0xf83c65cd, 0x1ad77744, 0x48cb6fac, 0x44d75f5e, ++ 0x9d72ca67, 0x29d0bc1d, 0x52e81f58, 0x390f67f3, 0x4806a33b, 0xc3db117f, ++ 0x7c092a65, 0x2f78df52, 0x7765aae2, 0x3720bbd8, 0x8b3fde16, 0x2d65e1e3, ++ 0x7c930f64, 0xf68ceb13, 0x8dabd930, 0x5da85f98, 0x82bf6a1b, 0xe5374046, ++ 0xbba614eb, 0x5b1e8d61, 0xc537f312, 0x4794f589, 0x0721d306, 0xce0e3dca, ++ 0xbec0bd6f, 0x3ce09afd, 0xc1587e0e, 0x32db43c9, 0x77d8cd7d, 0x6c25cd25, ++ 0xf8e4464f, 0x330d6f98, 0x6e885c13, 0x6de952df, 0xe089fc1a, 0x24ce9647, ++ 0x78c9c3ec, 0x700e780e, 0x1d324666, 0x6bf8043b, 0x8999d597, 0x72ad75f9, ++ 0x9c231098, 0x33d252b6, 0x85bb33ed, 0x22cbbfbe, 0x7dffb1c2, 0x57f3bf6a, ++ 0x51378a58, 0x585d887d, 0x9e8006a2, 0x639e99f2, 0x318b7db2, 0x8a7763af, ++ 0xca1bd0f1, 0xf397add6, 0x5841e952, 0x68e30a3a, 0xdd5b639c, 0x6bc7f005, ++ 0x3d9313f4, 0x9e867b69, 0x8c2b660e, 0x01cf5a7f, 0xcf5f39f8, 0xf781dd2a, ++ 0xe81f7cf4, 0x60a4da63, 0x645bf03a, 0xcbbce6ae, 0x03c289b3, 0x90ace27d, ++ 0x5aecfbfb, 0x8d43f30b, 0x83fc68af, 0x4f6bc1e8, 0xb6f7c5e8, 0xf1129a06, ++ 0x760dedee, 0x70689f2e, 0xbbc10b0a, 0xeb9121b5, 0x5c5c1a3b, 0xf36435b6, ++ 0x7835dff3, 0x61abbeb8, 0x699fd73c, 0x4f7d72f0, 0x7f2e54c3, 0xcfcc50df, ++ 0xf044fe35, 0xf1a43e61, 0x691f8d19, 0xa5f1a5f4, 0x405aba50, 0x80bcbe60, ++ 0xa7fe67bf, 0xc3ac3df1, 0x8fcbd054, 0xd75b3c34, 0x5fb1344e, 0x9173c552, ++ 0xcf53e4f9, 0x91150e02, 0x03d8e79c, 0xc33b4897, 0xf626c525, 0x5c6f8ec0, ++ 0xa35aede6, 0x5637bf93, 0xa3a2c228, 0x1cea9be3, 0xe3a3a2c2, 0x0d63eb9b, ++ 0xeff5f9f5, 0xfa8832bc, 0x3be31f1f, 0xfa1cfc0c, 0xff0fa7c5, 0xfa3f9e99, ++ 0xc019e38b, 0xeb63cd3b, 0x8ef71883, 0x9d1e7570, 0xd8775e72, 0x4c369fd8, ++ 0xcfe10bf5, 0x2cd7cbae, 0xf9bec771, 0xe015f418, 0x57f9e087, 0x54873f15, ++ 0x7e0294fc, 0xab25f744, 0xf2eb3ca4, 0x7c05012b, 0xa7dd49b0, 0x825e3cfa, ++ 0xd124e1e7, 0xedde0119, 0x98f10215, 0xa66677c3, 0x642b5f60, 0x5f87cd54, ++ 0x0e1fed6d, 0xfea53fa2, 0x3ecfeb00, 0x17e7247b, 0xa4f5bf08, 0x7ea51fbe, ++ 0x9d13b73f, 0x7c790c43, 0x36bc6311, 0x069a07f4, 0x5fb34abe, 0xa2dfd814, ++ 0x45027159, 0xf2f3eae5, 0x3f218ab5, 0xe66991d6, 0xc32538fd, 0xb16fe5c2, ++ 0xd10839d7, 0xa348f2cc, 0x9c1be253, 0x9cde578f, 0xe3a45b6f, 0xf3eaa5bf, ++ 0x21936cb2, 0x864a6f5f, 0x2dfdb7cc, 0x77951398, 0x16daa767, 0x7173bf32, ++ 0xbed6b8de, 0x3560bb34, 0xeba59bfc, 0xfbd33590, 0x8b4cc0fd, 0x9ca72f3a, ++ 0x56e49d8f, 0xf4afe714, 0xbd35ffc9, 0x79fe18e5, 0xed9fcf31, 0x4f1dcaa9, ++ 0xac3c40ee, 0x9630c3f2, 0x54a39543, 0x604e447f, 0x77d62cdc, 0xad0a91bc, ++ 0x7bc556b3, 0x451f93e1, 0xe9686f23, 0xa47fe92e, 0xed650bb2, 0xffec151d, ++ 0xbed0f5aa, 0x6afe0018, 0xbcbf2b8c, 0x4ee8c3e3, 0x93f85bf6, 0xce51fcd5, ++ 0x75ddaa83, 0xe0a3f384, 0xe18ff2a7, 0x36cf38fe, 0xcaa5fbf4, 0x12976cd7, ++ 0x453e1962, 0xc0997fcf, 0x2e7dd8f3, 0xe96d7c01, 0xfa12abf3, 0xed0953ca, ++ 0x6b9b8b47, 0x62a5b17e, 0x6f38e7dd, 0xa98ef4b1, 0x6f744547, 0x5ddfa1ff, ++ 0xbdc6a995, 0xb117122f, 0x3822c3ff, 0x9ab961af, 0x90367667, 0xc3be2311, ++ 0x0374b4af, 0x3887147d, 0xf9062baa, 0xd4c867b6, 0xf74f0bea, 0x7d394a66, ++ 0xe215f68a, 0xcd5a67a8, 0x699e2fac, 0x53fde28d, 0x7edf7adb, 0xb76b65c4, ++ 0xab061c28, 0x479c1d11, 0x2ccbbb56, 0x06f97aec, 0xff5c4ebf, 0x327aacf3, ++ 0xb5f40eaa, 0x6ef14da4, 0xb59cf9a5, 0xea0662bb, 0xd2a553e6, 0xdb585557, ++ 0xcdaff438, 0xcfce04bf, 0x96edbd81, 0xf9c7dfb4, 0x34eed480, 0x15ff2feb, ++ 0x9262f1c1, 0x9e626f5c, 0xf68e3627, 0xd25d8ec0, 0xf596b3b6, 0x2708d6de, ++ 0x56e39154, 0xff8079e3, 0x516378c0, 0x04e37d4a, 0x4fed1f4d, 0xdeb330ec, ++ 0x5f62798b, 0x85f3571e, 0x54eeefb5, 0x8553bbbf, 0xdca66a5b, 0x25fb5a9f, ++ 0xe9d15d6d, 0x9ee8fed4, 0xa35cb877, 0xd9125fb6, 0x79f90791, 0xd4c45774, ++ 0x99bf9700, 0x778d1cf2, 0xbc626daa, 0xbf67dba2, 0x7f72b4ce, 0x3cca36a7, ++ 0xc0ec3e45, 0xaf1b40f6, 0xb26b44e7, 0x0d5fbf02, 0xc0f64de0, 0x474f5d89, ++ 0xfb1f789b, 0x68f977ff, 0x484b1573, 0x91c1fd3e, 0x9dec63d0, 0xb77f7e6a, ++ 0xbff967ea, 0x7d56bfe9, 0x562a689e, 0xfaf991c7, 0x700fcb42, 0xe64576ca, ++ 0x77d8419c, 0xaeb9460b, 0xf3fc11bf, 0x27d79975, 0x841eb886, 0x4fe0b79d, ++ 0x238f6c71, 0x2ff5002f, 0x94c320de, 0xb460b3e0, 0x3b1257ca, 0xd9ffc2c7, ++ 0x447a96e5, 0x88325af5, 0x44556e08, 0x6d027e5f, 0x7c2cc075, 0x33397f54, ++ 0xd101d255, 0x22e38dbf, 0x45f84cc1, 0x9f84d90f, 0x93bf3fe3, 0x6a7573f6, ++ 0xe6fe1330, 0x544fd813, 0x66080f56, 0xa71fc1c6, 0x4cf549d2, 0x97a3af7a, ++ 0x4cc1cdea, 0x6d2749e8, 0xf788efd2, 0x0baa87b0, 0xb72ebb64, 0xb5db34f3, ++ 0xf404a3bb, 0x51b3d356, 0x8f35874c, 0xa07e3839, 0x4a96f3f5, 0xfb0fd4a7, ++ 0xe4dbfd5d, 0x3744967c, 0x55273f73, 0xde125efa, 0xa43bf3cc, 0xb12d99e6, ++ 0x55977ac9, 0xfba3fc70, 0xb3b630f1, 0x3c75278f, 0x3f8e7183, 0xe9e39c3e, ++ 0xa2c0ee5d, 0xc1defc3d, 0x9f2a70e7, 0x5e620b08, 0xc51e3d9f, 0xbfa9a77e, ++ 0xed00b0d8, 0x53096ecf, 0x6cf93f10, 0xc625b0a0, 0x40cddce3, 0x299fdb96, ++ 0x7c978e2e, 0xf71c6af6, 0xcf50d957, 0x624a8971, 0xa93fd013, 0xedbd0a9c, ++ 0xa50fadb3, 0x7d52ff60, 0xd13eea2d, 0xd8e7e0bc, 0xd823dba7, 0x89fc71bf, ++ 0xcfae19ff, 0xcacad0df, 0x95bf462d, 0xfded4f86, 0x9ed299e7, 0xda533cff, ++ 0x3a665f11, 0x11355e19, 0xf2a40f6d, 0x26fee4fa, 0x407db338, 0xf38129fb, ++ 0x26f6db1a, 0xe54fd428, 0xc85e51b3, 0x306b2ef9, 0x870c37f3, 0x445f3508, ++ 0xd9f93db0, 0xaff638b6, 0xfdcd3693, 0x972db67c, 0x5bc7effd, 0x99a71cad, ++ 0xf18d9d06, 0x2df0cb98, 0x63cc6f32, 0x0896d5ff, 0xb958f013, 0x373e22e6, ++ 0xfd66eb47, 0xd94772bb, 0x45eeb534, 0xe7f2bf7c, 0xf2f06bb7, 0x0245ffc3, ++ 0xb568f996, 0xd66b47ca, 0xfc831a5c, 0x3327f164, 0xb39fe5e7, 0x4f810678, ++ 0x5265c286, 0x9f47ca96, 0x6df79879, 0xf239d135, 0x726caa84, 0x284f557e, ++ 0xad55efac, 0xe641f4be, 0x055a6f8f, 0xb64f94f2, 0x87ad17dd, 0xe4964e7b, ++ 0x7bdfbd5b, 0xb5157db8, 0x1ebfdf97, 0x66d9f3cd, 0xa13e60f5, 0xdfc1faf8, ++ 0x51fe613f, 0x91b657df, 0xe177901e, 0x8e89cffa, 0x3e087e9f, 0xff60ead0, ++ 0xcf99e117, 0xb6b09cb3, 0x4ffac22d, 0xfe60e53c, 0xcd562270, 0xe7b927f7, ++ 0xae7cc2cf, 0xbbfb15f9, 0x20259ede, 0x8c07162f, 0xcaf36afd, 0xb9fc92cf, ++ 0x8313ce26, 0xf843587d, 0x9f847f40, 0x7ff7f09f, 0xa1f7f2b2, 0x77c189eb, ++ 0xf0fb7563, 0xc3a608a9, 0x5e258313, 0x62c8ec4e, 0x2b15d3b9, 0xcbe69ae9, ++ 0x5889eaf6, 0x0924e259, 0x29d2a1e8, 0xc4c4e1e9, 0x4fcfb636, 0xecb93b28, ++ 0x2aefcab2, 0x2d38d5eb, 0xe82269d1, 0xf88b3407, 0x075d7d94, 0xe3f00ef4, ++ 0x065c0571, 0xe85c06c3, 0x663a26c7, 0x2caeef3b, 0xc604df29, 0x2ae3504b, ++ 0xb36d87ec, 0x54fa9f81, 0xf5baafbd, 0xf01b78c2, 0x70aadd54, 0xeb42a89c, ++ 0xaf1d6687, 0x2e89e1f9, 0x178afcab, 0x4d5549f9, 0xee8096cb, 0xdfd6eaab, ++ 0xada0fd88, 0xa622caa3, 0x52ea5ec2, 0xb21f3ccc, 0x79c66fef, 0x34f1d0d6, ++ 0x3bd2def8, 0x726a708e, 0x7fdaf686, 0x5f18b964, 0x7f5337a8, 0x3aca4dd5, ++ 0xd9adc71e, 0x1a7d729f, 0x362c089c, 0xbf34ddf8, 0xd7eb7f40, 0x7cdfd9e6, ++ 0xf925997e, 0x9e5b9750, 0xa3feed27, 0xb9c9f999, 0x0cc747af, 0x8dbd0ef8, ++ 0xfeb5cd33, 0x901bfe68, 0xdcfd466b, 0x59f92598, 0xf30fcd15, 0x8c68dccc, ++ 0x316f64af, 0x1ab447d6, 0x8cbb39eb, 0x6376bcf5, 0xb1b2f3dd, 0xd5c757ee, ++ 0x18bb04e0, 0x8bb06f79, 0x762ec251, 0x18bb4985, 0x28c5d875, 0x39e31761, ++ 0x61d462ec, 0xbb0ea317, 0xc5d87518, 0xe3176128, 0x9c2aabf9, 0x25ff55aa, ++ 0x58f9c0f0, 0x7c5a1d7b, 0x99cbf79d, 0xff920979, 0x78bda45a, 0xeb0e4966, ++ 0xe90e5d79, 0x619ee9e7, 0x696e40f7, 0xa3ab3c79, 0x0d674f7c, 0x63b41c44, ++ 0xbf9b9275, 0xd2f0bf63, 0x70bf4bdf, 0x12238175, 0x55ce88fe, 0x3d435747, ++ 0xdbe51799, 0xac67f683, 0xdf00dbdd, 0x3897fa9a, 0xc2b9dd6e, 0x242ba7f5, ++ 0xa22fd8fe, 0x4094e5e5, 0x236f81ae, 0x49f1c10e, 0xd7ef5d8f, 0x88d38d0c, ++ 0xf43aba75, 0x3d63169c, 0xbe032e34, 0xabec35e6, 0xa3ffc666, 0xf024eed6, ++ 0xdb8f23fd, 0x11d47cf9, 0xe6268fd5, 0xd26f59da, 0xf9e46ef4, 0xbf2caf82, ++ 0x790cd947, 0x00d641fd, 0x03d9f386, 0x60f38619, 0xf9d965a1, 0xf777acd1, ++ 0x2629d7d4, 0xa6cc338c, 0x37df91fa, 0xf54cbc4b, 0x45ba7cb2, 0x06d6639d, ++ 0xc3fe6193, 0x7a06e103, 0x407db91a, 0xb0713c48, 0x3da8fda1, 0xc4f121a9, ++ 0xd738c611, 0x60fb15ec, 0x375acf7f, 0x9ceed0da, 0xb7383f1a, 0xcff31065, ++ 0x434be2f2, 0x3cea5be2, 0x2dd9f29d, 0x6a17a256, 0x24eecb7f, 0x24e50f96, ++ 0x8871bc5f, 0xbfce0927, 0xabfc514b, 0x526f8f99, 0x4cb16f38, 0xdea23f95, ++ 0x2c2b8f28, 0x9c44efc2, 0x7e87c680, 0x507bbd58, 0x4bd28560, 0xe14e157f, ++ 0x96fea58d, 0x83c8e88c, 0xd5e4b97d, 0x3d038edf, 0xa53798d5, 0xab760e20, ++ 0x8386d812, 0xec07c7be, 0xde98b84c, 0x8e7d9a27, 0x0777e86c, 0x9e39bec6, ++ 0xd5b27ce0, 0x2938c1ec, 0x414260d6, 0xa5dd2f64, 0xc0e19d58, 0x3366a6ff, ++ 0x67f011db, 0xd2f40799, 0xb8e6a6c7, 0xdec8f4f0, 0x30f46b75, 0x721c16cc, ++ 0x3bf5d60b, 0xa459eb07, 0x3abcb357, 0xfaccc077, 0xc544c55c, 0xbaaf7acf, ++ 0xf94ee5ce, 0x8f9eb69d, 0xcc50fb55, 0x75ce1af6, 0x2fbe1c9f, 0xab8d470f, ++ 0x98a4f61b, 0xad4dd7c1, 0xdca892db, 0x63a5f760, 0x329b153d, 0xc6813cfe, ++ 0x2ccf7ca9, 0xa4fea710, 0xc5f47265, 0xb29f3bd0, 0x7d51a67a, 0x6d6ff34d, ++ 0x2d2befd0, 0xd4ec1b01, 0xd937c78a, 0xb95e54bc, 0x5f3f137d, 0xed84bdb4, ++ 0x8ea2c5f5, 0x5a63ceed, 0x8f0aaebe, 0x46ca498a, 0x5d7bcd27, 0x2b8fd4b6, ++ 0x481e65c2, 0x2bc27991, 0x76df58f1, 0x5da79f25, 0x7386d3bc, 0xedab97e2, ++ 0xd9cbf742, 0x0d156637, 0x4daa1f84, 0xb7f7b861, 0x0e0bae3f, 0xeb31fde7, ++ 0xd9cb9bbc, 0x1db247e7, 0xeb209ef6, 0x2723f208, 0x437dfec4, 0x459fd5e6, ++ 0x527d0f5e, 0xcfc60b61, 0x905e1e02, 0x10d40bf7, 0x802f8cfd, 0x25c42d5d, ++ 0x0f231654, 0x154f6f5f, 0x7de81846, 0x23edd0ae, 0x188e6fea, 0x9ecfa86c, ++ 0x7f686696, 0x2191ecfd, 0xf7a0a1fb, 0x4badf33d, 0xbd53df7a, 0x4bbf0ee6, ++ 0x24c4bf61, 0xef2a73e3, 0xdabb3a60, 0x988d7df0, 0x740edbd9, 0x862de5be, ++ 0x361d10b3, 0xea154fd8, 0xbeb985f9, 0x2779f52e, 0x1885a73f, 0x34b0e5f6, ++ 0x9ca59fcf, 0x5f3fb2b4, 0xc5cf6ff3, 0x92fad3bf, 0xf93de193, 0x852fc885, ++ 0xd467c23f, 0x8ed83a43, 0x350f1214, 0x26a8bfaa, 0x6a8bfa5b, 0xe4361dfc, ++ 0x2dfc12ef, 0xda9204c9, 0x80fd8566, 0x3c9eded4, 0xc0efd640, 0x73c65df3, ++ 0x3cefe809, 0x97301fde, 0xbe84bf60, 0x4375a5af, 0xcfc2d41e, 0xa9aa7ec3, ++ 0xa54fd947, 0xaff6a38d, 0x39e869d1, 0xdefed0ee, 0xdf3176ce, 0x73bedcae, ++ 0xcf8260ff, 0x7cd8e2ac, 0xb6eaa3ec, 0x9c92d619, 0xe34de90b, 0x4c2ae7fb, ++ 0xf676e79c, 0xde98978d, 0x3c5856ce, 0xbbf98f32, 0x95eb52e1, 0x3a50d0fe, ++ 0x42eb445c, 0x2ed177fc, 0x645013c5, 0x3067c03b, 0x3e0433e8, 0x4dc07dc9, ++ 0xfc0f5783, 0xc62fde42, 0x5f20c63f, 0xbf7b9e41, 0xf0a12e00, 0xe459c754, ++ 0xd26fac13, 0xaf3c02bc, 0xf8c57e90, 0x8b78fdd0, 0x8dd8ed8d, 0xdf2a708a, ++ 0xe7998f0f, 0x58659fa5, 0xf77f5c9a, 0xbd03c56e, 0x0b79ce7d, 0x9fa1ef3f, ++ 0x3d979962, 0xbf719a7b, 0xb153d0f6, 0x9dd73fdc, 0xfeefe04f, 0x7df5745d, ++ 0x53c5a4f4, 0xb59df342, 0xb30743f3, 0x58e3bf55, 0x7fdbf631, 0x587b6f21, ++ 0xaf09b9cf, 0x2fc07e41, 0xa683ff03, 0xc1e0f42f, 0xd5898ae2, 0x242521e9, ++ 0xa0715d67, 0xf00921df, 0xff54fadb, 0x7da7c69f, 0x9bab7f6a, 0xf7f452d2, ++ 0x5956f891, 0xb29b1fd9, 0x12cb8e22, 0x72013387, 0xbc8564a4, 0x5df0e337, ++ 0x13c61283, 0x655e1d5d, 0x5d469f8d, 0x98d9fe1c, 0x7a8b9114, 0xd6479711, ++ 0xfbd5cd87, 0x6cca7bc9, 0xfcd697a9, 0xb5cb20e2, 0xa237a653, 0xaddf62e7, ++ 0x948d1dda, 0xef55aa9c, 0x3c92738c, 0xa2f9376f, 0x9f858f87, 0x73cb1370, ++ 0x0794dce1, 0x4fa6993f, 0x1a2aae54, 0xfd5fb904, 0x811e97cf, 0xb0adf7dc, ++ 0xfd0f4026, 0x57995dec, 0xf58cf24a, 0x490e6388, 0x46b6c7c7, 0x63b9b9f0, ++ 0x0e22f08a, 0x2fbcc4b4, 0xaf9069cf, 0xfe3073ed, 0xdc6d767b, 0x8c44b6c0, ++ 0x3e73f1eb, 0x46456fa6, 0x13fe5f4c, 0x41ba5cad, 0x34db77ea, 0x17eaaf7f, ++ 0x3a8f5e86, 0x25917af4, 0xa1d47af5, 0x5e84a3d7, 0xaa99e78f, 0x63587fff, ++ 0x52ec3e77, 0x5d9124ff, 0x3236f2c7, 0x2dfb7a1b, 0x7c07b84a, 0x33c516e7, ++ 0xeffee388, 0xab394ac6, 0x3e742fe2, 0x0e937597, 0x2bcfa3a6, 0x3e85dbce, ++ 0x88a26d7f, 0xdb27d435, 0x8bed0c93, 0xfbc36e9c, 0x1b87132b, 0xcae55fde, ++ 0xc9afd437, 0xfed0d8be, 0x4344cf5a, 0xafe327fd, 0xe19fb432, 0xcfa8619d, ++ 0xd0cf3a9a, 0x12e2bafe, 0xe7ebfbc3, 0x9fbc312e, 0xa8665be7, 0x33f158df, ++ 0xea9bfb43, 0x7bde1856, 0x7902d385, 0x8b7b0ed7, 0xec02fee0, 0xf96f2a2d, ++ 0x1ea44663, 0x9b2613af, 0xe5f7bcfa, 0xbf52e1ba, 0xde11aff9, 0xe503e1e2, ++ 0xe1d011f9, 0x487cf550, 0xbf1770d9, 0x4541164f, 0x491dbbda, 0x76d09ba0, ++ 0x4427efa1, 0x45ce78bc, 0xf8737c38, 0xe216d9fe, 0x7a2e1307, 0xd51a7471, ++ 0xbe889f13, 0xbe97eb8e, 0xd52a74f8, 0xcb144753, 0xcf17a8fa, 0x27e6fde1, ++ 0x967d65e2, 0xf3c35560, 0x7ed9cec4, 0x2b84f79a, 0xa479d752, 0xfbcfa4bf, ++ 0x7012b487, 0xe024de40, 0xf4483280, 0xa245f289, 0x132f944f, 0x855b967d, ++ 0x89f44fd8, 0x9dd900f2, 0xd91afe78, 0x20df289d, 0x9be513bb, 0xeca27764, ++ 0xe513bb20, 0xb9730ddb, 0xc7c1b77c, 0x50dfbddf, 0x86c1e5c1, 0x97fe7e3a, ++ 0xff2e7a86, 0xe7e7e0da, 0xed15c30d, 0x61fb3dbc, 0x2d54f8b4, 0xff8882e2, ++ 0xd49eb1ed, 0xaf156bc7, 0x3c5aa394, 0x744eb1b1, 0x769f6046, 0xb53f625a, ++ 0xfb09c6f7, 0xf116abe7, 0x7aff4ea9, 0x7bbde1c7, 0x8637fb38, 0xd4671138, ++ 0xb3121f9e, 0x9e101686, 0x9afb775e, 0x82bafef1, 0xc43155b2, 0xbaf8ae3f, ++ 0x797a0ace, 0x79f7d4cf, 0x4e9532e3, 0xdef08cd6, 0x5cb93a0f, 0x72e727bd, ++ 0xbbdbccbb, 0x08d9d2dc, 0xa5f8d47e, 0x66ef2170, 0x4fcc945f, 0xc2cbbc6f, ++ 0x17ca7a79, 0xc597eb82, 0x7e37ae0b, 0x7e79c1d9, 0x893d3b97, 0xbad45f2c, ++ 0x13d37f96, 0x2e9fc76f, 0x7f8b46af, 0x8535796b, 0x864e745f, 0xa459701e, ++ 0x121615cd, 0x7b9c47af, 0xdafbd45f, 0x1dbef8bc, 0xe5beae2d, 0xfdc4114b, ++ 0xfcfc5a65, 0x1b877b72, 0x6ecb837e, 0x79f47bb5, 0x5c9c5a43, 0x0cc3a2f9, ++ 0x05e5a339, 0xf368e369, 0x7f50b28e, 0x3f79bd05, 0xf2db3b97, 0x58d10f91, ++ 0x0dfdc913, 0x02b6e7a2, 0xf335e76e, 0xc8f96d77, 0x3aacb8d7, 0xde9423d2, ++ 0x7520fcf8, 0xb91651dd, 0x7c2fc2ce, 0x99709f9c, 0x7e809f9a, 0xdf3df2ec, ++ 0x7c5976cb, 0xf582c930, 0xf03cd9d7, 0x48ac3e73, 0x2f96b07f, 0xba11f680, ++ 0xa2798c7d, 0x68aff4df, 0xbddbd0be, 0x2cef865e, 0xe14fa4a7, 0xdcaaeb52, ++ 0x72270715, 0x8bd6acdd, 0x211f9cc3, 0xea985e0e, 0x783a083b, 0xc8cb495b, ++ 0x6d20bb67, 0x8cfdf620, 0xfadd7b90, 0xfe8f9fa0, 0x2bc7e86f, 0xb0443ef1, ++ 0x8e942d9f, 0xf468fc34, 0x3fbde1a4, 0x40e8d2ba, 0x78c5ef97, 0x52dfc9ef, ++ 0xb7a50bfb, 0xa34ce8fe, 0x92edcbaf, 0xe467800e, 0xa57468e5, 0xe7c6d17c, ++ 0xb6ab2f1b, 0xe8d3fcb3, 0x2e2e942a, 0xa7492ba4, 0xb9d9b78d, 0xaae90bbf, ++ 0x97001e97, 0x1d574f1f, 0x7fe3c866, 0xee6e9e95, 0xce705316, 0x6bbce4bb, ++ 0x53afca3f, 0x77c0657d, 0x05389899, 0xe69c2624, 0x42bdf85c, 0xa8d359db, ++ 0xdb0bd8dd, 0xe85fd285, 0xa1693977, 0xe8e5a7fd, 0xcaac9bbf, 0xa6efd0ca, ++ 0x68ddf05d, 0xdd784fce, 0x7893e5a1, 0x727e87ae, 0x779565c0, 0x646f092a, ++ 0xf953fa3e, 0xc75101f8, 0x59d49772, 0x5429c63f, 0xce726a49, 0x0a07b662, ++ 0xeb8efb23, 0x3f7ead5f, 0x26e2ebe5, 0xbc4a63cc, 0x5abedf51, 0x14afd7d5, ++ 0xe87fdccd, 0x73abf939, 0x3e3d64ae, 0x55fc9cf4, 0xdc3d5423, 0xf3e0dc2d, ++ 0xe723c285, 0x506fdea7, 0x64efeea8, 0x5cd25e95, 0x00613166, 0x2cfa1fce, ++ 0xe32f2e10, 0x8c3c837e, 0x55fae7eb, 0x35e5c022, 0x5cfdc822, 0xf508824b, ++ 0xe4aa109f, 0xfcf206bd, 0xf7d9ad66, 0xdaa9e837, 0x0e65cdb9, 0x08238ddf, ++ 0x4c452f8f, 0x27fb8f9f, 0x9c9e8f26, 0x2c5eef8e, 0xf77eb174, 0xf58d3da2, ++ 0xeb47ec4d, 0xf0fe5e80, 0xf4e7c92a, 0x108e790c, 0xa611ce25, 0x03fd1c93, ++ 0xafd46fc9, 0xf0215ece, 0x319714dd, 0xfefb48bf, 0x6164e71a, 0x3e5feb89, ++ 0x77b7935e, 0x5e2ff208, 0x442acd8f, 0xd8f5e0fc, 0xdeb10a8b, 0x990763d7, ++ 0xe3661964, 0xf4d9f732, 0x8d61f4be, 0x9bc77bde, 0x07f5e3c2, 0xa1ae0d67, ++ 0xfce0d4f0, 0xbabae023, 0x0d96b82f, 0x6b4fd217, 0x7e16ba7f, 0xc9089ab4, ++ 0x46cfbd57, 0x975bc409, 0x36f796ef, 0x2229867c, 0xe12edd9f, 0x52feb0b4, ++ 0xf1cd1961, 0xbce03f2c, 0x7e62fea8, 0x13afea1e, 0xdc344eef, 0xf76c562f, ++ 0xe341186d, 0x66082c9d, 0x8e27c692, 0x73e46c6e, 0x9876a7d8, 0xaa97b03d, ++ 0x1e75aecd, 0x375f7df8, 0xf8a51e73, 0xc414a5fa, 0xbe96c54d, 0xedabbbf3, ++ 0x5d9a8e12, 0x98ad3038, 0x1fb6a5f7, 0x5cae7a85, 0x84869fd3, 0xed68fcc9, ++ 0xfa7f737c, 0xc970b8d4, 0x498486b7, 0x6fe1ab7e, 0xeb954da3, 0xe238cfd4, ++ 0x0abfc993, 0xdea9fb67, 0x7c036de9, 0xfb06a109, 0x9c8ff343, 0xbc70978d, ++ 0x083e645c, 0x01e164ff, 0xfbd008ab, 0x78f8d8b3, 0xa4e3289f, 0x339c0f67, ++ 0x4517af83, 0x81cf7c29, 0x2c27ee76, 0x3a5c24d1, 0x8570e07e, 0x8d01ee1b, ++ 0xa8601ec8, 0x1b067947, 0x4f8cc7da, 0xf58fbc35, 0x8fbc308e, 0xa8605a9b, ++ 0xc4be2c0f, 0xdcd07ed0, 0x927a8649, 0xfb436aef, 0x86998ae4, 0x92afc6ba, ++ 0xb43123e5, 0xf7c306ee, 0x0d4beac3, 0x4afedded, 0xee337bc3, 0xf51f0435, ++ 0x13b23b7b, 0xfca2fd70, 0x3cbb5b4b, 0x9353fee4, 0x1deee930, 0x3cb44df9, ++ 0x723532d7, 0x923fdf11, 0xe373fcd1, 0x2cd3cd3c, 0xe95e54b1, 0xa2bff232, ++ 0x727d6344, 0x71053ee4, 0x234ec9c3, 0xb3ae4e1f, 0x23ddea18, 0xb4847de4, ++ 0x7fd8f327, 0xf7f87df1, 0x3fe0308d, 0x0f444e14, 0x59e35f7c, 0xcc7edf92, ++ 0xbe32d5eb, 0x0ef104d7, 0xef103afd, 0xf101c3d0, 0xf11d7d0e, 0xc47b7d0e, ++ 0x11eff43b, 0x1fbfd0ef, 0xff88c07d, 0xfc461db1, 0x88d0745f, 0xfb2e8d7f, ++ 0x9dc5d3c3, 0x3e10fa46, 0x077ca7c5, 0x663d2e9e, 0xfc509fa4, 0x54ea415c, ++ 0xa1f03c6c, 0x1fae8278, 0x91ccaf8f, 0x7e117c46, 0xece5bf38, 0x9f892890, ++ 0x2bce48e0, 0x16603a29, 0xe1e49fb8, 0x6a7e7590, 0xd24679f1, 0xab83ff3e, ++ 0xebfc1120, 0xade3210a, 0x9e4daa53, 0x105b7520, 0x8393ffd2, 0x7ed1637d, ++ 0x14b9dc6e, 0x5ba3e81b, 0xac567fde, 0xff2d5df2, 0xc8493fd4, 0x373f3373, ++ 0x7cff9007, 0x80acd4c8, 0xed1e7f3f, 0x4af90cbb, 0xf1d4e737, 0xf14512fa, ++ 0x37c845ce, 0x29617ffa, 0x26182fa8, 0x391499ef, 0x437e7c9d, 0x920b8be3, ++ 0xd1523e65, 0xed4e3548, 0x53497991, 0x533f4a47, 0xf9c9c794, 0xf23925d2, ++ 0x7f990a7c, 0x01720b29, 0x591c378f, 0x898b4780, 0xb4ec4def, 0xdcf862ba, ++ 0x8166abd0, 0x5bf41c38, 0x554393e8, 0x03f1ae7d, 0xcff31dbb, 0x720c20da, ++ 0x6ec07875, 0xb91dd3c8, 0xe7a869dd, 0xda1a25b6, 0x32e3da8f, 0x660fcfbc, ++ 0x3e8fde1b, 0xc7d431e0, 0xb4378c76, 0xd7a0e8bf, 0x73b8bf50, 0xa5fda1aa, ++ 0xf50d8ac7, 0x10fdd164, 0x914c3be0, 0xc8ff077e, 0xbb6f6954, 0xc171dc64, ++ 0xee79589a, 0x6847f554, 0xbf96bbfa, 0x38e953ed, 0x21b02ed4, 0xb3f04fc0, ++ 0x5cb0b5ad, 0x7daff2d0, 0x9ad6f921, 0xfe73d09d, 0xbfcc6fc3, 0x7baef2d6, ++ 0x4ed508ec, 0x9ef1f4d0, 0x6326ebbc, 0xb082f5de, 0xfde7efbe, 0xd0f78aa5, ++ 0x0af36bf9, 0xf82dff1d, 0xf6f6c6dd, 0xf7ded5bb, 0x2a0da479, 0x5e943d7d, ++ 0xfa741ebc, 0x7073d588, 0x1f5ffbb1, 0xabea31a7, 0xdde71f24, 0x37cff9c9, ++ 0x919e6e99, 0xcd85f7c3, 0xdc6e9dfd, 0x36f1d4c7, 0xdd74aae4, 0x620b38cf, ++ 0xedf1f8d4, 0x7edd79ea, 0x89b44dc6, 0x3701e826, 0x07bb6bad, 0x6df31ba9, ++ 0x5ebdeacd, 0x3ef02b01, 0x57e9126d, 0xb637c4f9, 0x9244b6d6, 0xbd48f3fe, ++ 0x3b4afd85, 0x3ae0fc9e, 0xf9ef7a7f, 0xc7646192, 0xc3a00e80, 0xcec9fec0, ++ 0x6fff7335, 0xbcfb948e, 0xfb480e57, 0xf390acf3, 0xe36f5b3b, 0x741f7238, ++ 0xada6f4c5, 0x4e75dfe7, 0x50cfa340, 0xeb7668f8, 0x86e73d5b, 0x0f4b5ca4, ++ 0x9ced7ba1, 0xb5996b86, 0x9f247378, 0x7c8a98f7, 0x61bf1eb3, 0x39774aae, ++ 0x07680e12, 0xbb5fd37e, 0x0c4e7322, 0x8567edfc, 0x07d9c62b, 0xbfe569bd, ++ 0xc304dcf1, 0x5f73bfbd, 0xfeffedfd, 0xee857dce, 0x10fe50fb, 0xfbfe770a, ++ 0x34c0e701, 0xc3fc68bc, 0x81e73a2a, 0x4dd2058f, 0x135fa71c, 0x39afdc65, ++ 0xefbe1239, 0xc57e948e, 0xc133972e, 0xcba5ee64, 0x399bf785, 0x7eac777e, ++ 0x4bf3df2e, 0x5f323cf2, 0xbdcbceb7, 0x509709c5, 0xab16d2bb, 0xbac2e4d8, ++ 0x976e582a, 0xd4ed43f8, 0xcb5fd66e, 0x5fce29d7, 0x6fbc2fbb, 0x3877d35a, ++ 0xb9c2e6fe, 0x3f7a9f04, 0x62ddb1bd, 0x8d0d8ed5, 0xa8e4a52f, 0x3c23d5f2, ++ 0xf9a96fac, 0x9b6a1503, 0xa409fa1e, 0x1c7ea8c5, 0x72548fde, 0x0f0699fe, ++ 0xa33de217, 0xb704eb7b, 0xdfc86cf0, 0xf99f4b26, 0x2edc1a81, 0xf99073cc, ++ 0x0719e21d, 0x9e5a2bdb, 0x39e449c3, 0x3c5abf00, 0xd27f6d49, 0xe466166f, ++ 0xe30aec5b, 0xd329fcf8, 0x2570731b, 0xe9fc4f56, 0x8895b882, 0xd9c67e46, ++ 0xdaf79956, 0x75f07edf, 0x34790d9a, 0xb15fbc17, 0xa92fef9b, 0xa9c64a7e, ++ 0x297a9faa, 0x27275d21, 0x4c2c730a, 0xdf26ed4f, 0x7b033935, 0xff2a46f3, ++ 0x7287903b, 0x0a1fea9a, 0x5f0f4f5d, 0xf8c8a09b, 0xf98fad2f, 0x7e7954da, ++ 0xc0a2f89c, 0x15f2d27e, 0x3c608866, 0xe41e2d4a, 0xe3317b5b, 0x95078b41, ++ 0x75e62f04, 0xd8b8d75c, 0x3b1dab8a, 0x28a3ba1f, 0x271bd5dc, 0xf32a1cea, ++ 0x178bfa8f, 0xcf9f3acd, 0x7f3ecdfd, 0x9953f729, 0x567a96e3, 0xa0cb3dd3, ++ 0x2ed88e6f, 0xa74380ac, 0xfafbefb5, 0x93eea2ff, 0x8d5f83bf, 0xad35e5d5, ++ 0x2f6f9850, 0xf3204e87, 0x6b6f989c, 0x6acd73f5, 0x6fd648bd, 0x9deb2559, ++ 0xdb56fdea, 0xd604bf54, 0x81eb1289, 0xfaaadcdd, 0x940eb02d, 0x839e0758, ++ 0x7e0ea15f, 0x15f83a85, 0x2857e0ea, 0xbcf0afc1, 0xc0a71454, 0x56b88a7f, ++ 0x209f6ea1, 0xd3a855ae, 0xd2d71077, 0xd2d711d7, 0x4b5c47b7, 0x2d711eff, ++ 0xb5c47bfd, 0xb5c475f4, 0xd711edf4, 0xd711d7d2, 0x5c47b7d2, 0x5c475f4b, ++ 0x711edf4b, 0xc47bfd2d, 0x11eff4b5, 0x11d7d2d7, 0x47b7d2d7, 0xfeff4b5c, ++ 0x10c57ae6, 0xbd59baf7, 0x436ca0e7, 0x6e47d31c, 0x3963f16a, 0x45bfdf84, ++ 0x6b36f3fc, 0xbedcf02a, 0xbcbb7404, 0xf123dc26, 0xe2553cdc, 0x9e2424dd, ++ 0x9e31e7bb, 0x7ac9b0ef, 0x0e87cc91, 0x8fc41fa5, 0x7e32ad0a, 0x23f11284, ++ 0xa11f8894, 0x30a8fc44, 0x508fc643, 0xe7847e22, 0x44a11f88, 0xe22508fc, ++ 0x3f112847, 0x11f88942, 0xf08fc44a, 0x2847e21d, 0x73c23f11, 0x22508fc4, ++ 0x87e7847e, 0x23881e68, 0x7e82f369, 0x1fb06e9e, 0xf60d0e89, 0x8750d3a3, ++ 0x0f6fae7e, 0x1eff5cfd, 0x3dfeb9fa, 0x1d7d73f4, 0x3dbeb9fa, 0xfd7d73f4, ++ 0xef1748d8, 0xfae9e833, 0xeba7a0ef, 0xfecdb9eb, 0xba7be057, 0x97e9e376, ++ 0x29467651, 0xfa4e288f, 0x8e6ea73e, 0x4eb1f485, 0xeb129287, 0xe2b7f921, ++ 0x548539b6, 0x84f9a9f7, 0x04dba279, 0x9f1c737c, 0x0a0be6f0, 0xfdce7fce, ++ 0xd7bf1247, 0x47fccae2, 0x25dfcf78, 0x54cfdf58, 0xdf6aa7cf, 0xccd3847b, ++ 0xfb6aaff9, 0xeddf7ade, 0xdad7c742, 0xcdd4bf31, 0x3e64e483, 0xeff23bf2, ++ 0x5e402c88, 0x229336ff, 0xca575ef3, 0xba50e3bc, 0xe32b921a, 0x3b4cdb1f, ++ 0x5e470c5f, 0xf9c28948, 0x711699a7, 0x38005ac0, 0x5f4015d5, 0xaac6e4b0, ++ 0x04bbaaeb, 0xbcda4f79, 0xf1213f35, 0x37773e09, 0xcad85ba1, 0xbecb9c69, ++ 0x6efc3610, 0xd49b34c1, 0xec1df017, 0xc57e91c4, 0xdf4759bb, 0xedbeaad1, ++ 0xa4bb2ff3, 0x6c8f9e9c, 0xe704bbad, 0xcb85a6f9, 0x347b1eef, 0xbd38e19a, ++ 0xfb8cd949, 0x0ab42656, 0x0ee7ce2f, 0x91baf552, 0x395b4ead, 0x73e4eb8f, ++ 0x25bf5a80, 0xdcf8531b, 0x2ce88962, 0x8c51bf84, 0x71fef851, 0xbeb46e0d, ++ 0x4cbeb197, 0xf7f02ada, 0x40f3e8fe, 0x90fe06a4, 0x8d9740f3, 0x1e422d89, ++ 0xf797689f, 0xa63b5e39, 0x9a40d564, 0xef202f97, 0x8becbc73, 0xbeb857ba, ++ 0xc8e7de45, 0xe78e33e4, 0xcb30f2c7, 0x237df0af, 0x4c9bfdd3, 0x4b9c2ef1, ++ 0x404d615e, 0x81e156fb, 0x6734803a, 0xd6d5ab9c, 0x4c3a2395, 0x22f4050e, ++ 0xd1d38a5e, 0xd98e711f, 0x8f7c97a0, 0x9b35ef95, 0xc15a7161, 0x8df5426f, ++ 0xd217fcd0, 0x7997ae3f, 0xe40b5696, 0x951fa6b1, 0xcf5ce538, 0xff595935, ++ 0xdeadd928, 0x6fa21f67, 0xa4317968, 0x90827877, 0x61aebbe3, 0xb2f5543f, ++ 0xe4ff38f7, 0x0db03bb8, 0x4f1e71f7, 0xbc6739dd, 0xc28b7a1b, 0x86f494fc, ++ 0x7103b999, 0x3e15f61e, 0x7fe9d1d7, 0x738df59a, 0xcb47f74d, 0xfe325cf3, ++ 0x49c2ae51, 0x542d07f3, 0xe6ae51f1, 0x906e1d41, 0xdc92e6f7, 0x68457be5, ++ 0x8457acbe, 0x1e9a87ea, 0x23b3dda9, 0xf87df384, 0x7d682a61, 0x78bb0338, ++ 0x44eac95d, 0x58fea171, 0x4b95eaa5, 0xf79cac9a, 0xb3dea154, 0x25fbfa15, ++ 0x53be6a55, 0xfc90f6d5, 0xfd10dca6, 0x50efbb53, 0xc7f2536d, 0xfd63ae97, ++ 0x71cacea7, 0xa42bf9c5, 0x8a76243e, 0xcc69ce00, 0x84d9315f, 0xefe632fb, ++ 0x3e947af6, 0xaa4fe7e8, 0xd3ad345e, 0x719d70c1, 0xc9f9823e, 0x5cc9f3cc, ++ 0x893e739f, 0xcbcfebcb, 0xf099d0bc, 0x3bbe10fd, 0xfeb9e48b, 0xe87d5477, ++ 0x0289e43a, 0x4c41fe8f, 0x9e8967cf, 0xca9e4431, 0x957846a7, 0x4e6ea097, ++ 0x2156fab3, 0x26da750f, 0xb5e5fac1, 0xffa89bd0, 0xe2a3d0b9, 0x45dc1fb0, ++ 0x553c9f9c, 0xd73b73e1, 0xd2a6598e, 0xc107ed3f, 0x19ef83fc, 0x08ce15f1, ++ 0xae68bf20, 0x7809a76f, 0xcf81f6d7, 0x57f7c5df, 0x6c57eb5e, 0xa7cfd7b8, ++ 0x9d1acbda, 0x0587ee87, 0x2b3faa11, 0x7aabfa52, 0x2c9859fc, 0x77f1ff2e, ++ 0xeebe41cc, 0x071cf802, 0xb04084ab, 0xef91ca8f, 0x31d53fb7, 0xce7489a7, ++ 0x98e7eb1f, 0x73c9326f, 0x71efa45b, 0x28e8bdfe, 0xb2fd841a, 0xfe40294e, ++ 0x869f36bf, 0xcede9351, 0xa5c5d9d3, 0xced2feea, 0x2bbf2e0f, 0x9d77d063, ++ 0x38232d97, 0x882d9f63, 0x214dbce9, 0x0ae474cc, 0xee22616f, 0x25da1703, ++ 0x39e44147, 0xffd6a0de, 0xef37d4f9, 0xf8648daf, 0xdc8dfd70, 0x5e41cdbf, ++ 0x87e68fcb, 0xfe8b15f3, 0xff7096f7, 0xc1f32e7f, 0x6bc029ce, 0xdf374e44, ++ 0x1f0a109b, 0xcff24fcd, 0x87bc975c, 0x525fc421, 0x8be52396, 0x6e52b8b0, ++ 0x8b8bf8e4, 0xbada8afd, 0xe78d5b0f, 0x2bf2b55b, 0xbbfc4e55, 0x603c7dce, ++ 0xfc0cf792, 0xf9d814da, 0x8de9d12c, 0x72c77d03, 0x46bffe69, 0xdfcf3b1e, ++ 0xeed3ebc7, 0x53e1e8eb, 0x1a1cfdea, 0x1fd6951d, 0xed4a6dd9, 0xb5f2a7a5, ++ 0x35b43f9f, 0xd801f71e, 0x7c9077f8, 0xfe79156b, 0x7b3a1fbf, 0xf79c32b4, ++ 0xb73fa3cb, 0x6f9dff31, 0xeec578eb, 0x87e785ee, 0x9569fff5, 0x819832fc, ++ 0xa86ed6fb, 0xc57df073, 0xbf8aa30d, 0x72227e01, 0xb7978c3c, 0x8fb50631, ++ 0x7929f189, 0x74076103, 0x5f844fec, 0xf23ff6f8, 0xdb4bc03d, 0x61ff7cdd, ++ 0xd5fc9ec9, 0x61a597b8, 0x7a06cf94, 0xda74892d, 0x36d467a0, 0x5ddcb2c5, ++ 0xb73d4830, 0xce39ba2a, 0x2523e1a6, 0x1dbbda4f, 0x6738e4a3, 0x00897b54, ++ 0x68619d64, 0xb15fb7d7, 0x10889ee7, 0x3faf563f, 0x6bdf0b65, 0xf2178b6a, ++ 0x7810e0de, 0x2b61cfc1, 0x84a3f5e8, 0xf67a3bfa, 0xdfefadab, 0x9e49fc37, ++ 0x5fbbc862, 0xe6af63d8, 0xbd04194c, 0x84e2bd7e, 0xd23cbb7f, 0x54c5fd75, ++ 0x45603f2f, 0x3698aa46, 0x45ef25c0, 0x8bde4bb9, 0x3e6b7a52, 0xc0f9adf3, ++ 0x6fce0149, 0xb6fbcc5c, 0xe8e5403c, 0x8df7f7fe, 0xba1a5feb, 0x7a0aeb17, ++ 0xb97dbcf9, 0xdfd36bd3, 0xacd65e23, 0xd04bee18, 0x49e457ea, 0x327ce1bf, ++ 0x9bbf0023, 0x70db756e, 0x527cd127, 0xf8ff907f, 0x21973c93, 0x38ed4c8e, ++ 0xaa5a63bf, 0xabef2fd8, 0xe5bb79a2, 0xfeba0578, 0xf78d9b4b, 0xd67b503e, ++ 0x8bcaaedb, 0x9c4afee2, 0x4a376eb4, 0xe093cf27, 0xbeea70c0, 0xf173fa87, ++ 0xb2f70c38, 0xc1eac060, 0x4257907c, 0x019c1bf5, 0x6d29c62b, 0xf8aff792, ++ 0x7c71c9d6, 0xb96d636b, 0x4e2cebd0, 0xbebd50db, 0x1bef24d7, 0x6efeaf9e, ++ 0xf597cd03, 0x138272e1, 0x3ce1a9ce, 0x285a6420, 0xf9d44abc, 0x1ac73797, ++ 0xf5e6c7f5, 0x5e67e056, 0xdc42f73f, 0x6971d2a9, 0xc73e44d3, 0xf2f16e5f, ++ 0x0a9f0fb9, 0x39964fef, 0x62fc46ee, 0x5683cb5e, 0xf26bd537, 0x277d9ea4, ++ 0x70103ce0, 0x7df0660a, 0x9c1ccb4b, 0xd9cf3d87, 0x81edebcc, 0x1f04fdf7, ++ 0x62ce27e8, 0x89d13786, 0xe58cf91f, 0xf6fc462d, 0xfb8a27ce, 0xe1296f2d, ++ 0xe2c8b7fd, 0xf3f539b3, 0x032fb0d8, 0x68f339f9, 0x293ee3df, 0x79f1f4e1, ++ 0xbfef4fd2, 0x0d1f7f9e, 0x317ce4f3, 0xee0a6b8f, 0x61ba224f, 0x47e8d6ba, ++ 0x8dae873b, 0xfd2792d7, 0xbaea2d3a, 0x5a7dd5fe, 0xf384aebe, 0x8512ca7c, ++ 0x7c33f707, 0xf6d53edf, 0xe75fb6a7, 0xb2c97ea9, 0x0ef83375, 0x90df8d22, ++ 0x5dfbaefc, 0x5b79f01f, 0xa83727e5, 0xbe7824f8, 0xbb7e742c, 0xcf5f7576, ++ 0x7bee354f, 0x1f7e87f4, 0x7f3df157, 0xe7033052, 0xdaf6b554, 0xc807f3b8, ++ 0xa0ff40ef, 0xf1d5c7b3, 0xb7397ed0, 0x46f81937, 0x68df0f59, 0xbe00955d, ++ 0x2efe53b1, 0xa47bf2df, 0x29fcb75e, 0xc4fd5e79, 0x9cdf67f2, 0x3f8eed43, ++ 0xfe8169b0, 0x507948fc, 0xa48589f2, 0x2c6f814f, 0x90fee552, 0x3c9edf4c, ++ 0xbf2e3edd, 0xec4ca9ef, 0xf2da1b8b, 0x6c9dc53f, 0x47be6eb4, 0x3d4fafe9, ++ 0xae25def7, 0xadaaf95e, 0x5bed74a3, 0x3d4892d6, 0xefbae4dc, 0xf3e52ece, ++ 0xec17c0e3, 0x4526b2b0, 0x6dea41c6, 0xf86a7fac, 0x1283a50e, 0x9165bfda, ++ 0xd457de17, 0xe1a4de9f, 0x86bfc359, 0x85fb9eef, 0x786b7c54, 0xd193eed2, ++ 0xef36aae4, 0xdf79d50f, 0x21efd2a0, 0x50dddf75, 0xe22db6e1, 0xe1b6eefd, ++ 0xa9e72877, 0x1b95e7ef, 0xc9e0f79f, 0x57dfc3d9, 0x5ce05f63, 0x7674f015, ++ 0x23fa559d, 0x53c02f5b, 0x36bee40a, 0xdfaac58f, 0x3feaa171, 0xc1eaa45c, ++ 0x7a53a784, 0x547e2d3c, 0xc76ca9e2, 0x3dc23f1f, 0x5553f367, 0xbc8f763e, ++ 0x6db4a0e7, 0xde6be327, 0x3756f5da, 0xcf26fbb5, 0xa44fb86d, 0x09df2eac, ++ 0x6b0df9bf, 0xffb15937, 0x79f951bf, 0x57cfbd28, 0xb835a2f3, 0x3a28fe42, ++ 0x07b5a7b9, 0xe349dbdf, 0x11ccbadc, 0xbafdffad, 0xae9251cc, 0x0762eacb, ++ 0xbab2bc60, 0xcf617b92, 0x743f7c68, 0xc8711ddf, 0xfd4a50fd, 0x991e5f61, ++ 0xe073e1e8, 0x25f5c388, 0x928e875f, 0x5637eafb, 0x72667f79, 0x80e3db44, ++ 0x70d2f243, 0xe9d7e20f, 0x4f7c9de9, 0xf318e82d, 0xfde499b6, 0x9dd5e99b, ++ 0xe91e639f, 0xa0d7e642, 0x885dfdc4, 0x7d502477, 0x4f9e49b3, 0x72cb354b, ++ 0x0f4928f2, 0xf7883ef4, 0xef93be22, 0x5be50bf3, 0x1a15e9fd, 0x84fd6a7d, ++ 0xd6fea9f2, 0x4928e977, 0xbeb7df97, 0x6fd56e23, 0xc149ed92, 0x7e0bf13d, ++ 0x85f7c595, 0x6d3adf7e, 0x3d8fbdea, 0xbf930deb, 0x7ac171c3, 0xd41da5d3, ++ 0x8a5b7aff, 0xef58fa12, 0x7565f105, 0xffb9689f, 0x6692713d, 0xa2392719, ++ 0xefa2dc90, 0x70732c8e, 0x2eb69b3e, 0x43ff4fcd, 0x3cdc6bcf, 0xbfea806a, ++ 0x3e828ce8, 0x3dfd5f39, 0x75941113, 0x7ba19f3c, 0xed7bc9ae, 0x3f8d3c3e, ++ 0xcaa75c7f, 0x0f79d143, 0x4fa8b3f6, 0x0e587be3, 0xc2891f35, 0x264733fd, ++ 0xdf69f9ca, 0x6efeaadd, 0xc6155889, 0x37a4fdf9, 0x693f86ad, 0xfd963fa1, ++ 0x8fd53734, 0xf7f714fe, 0x2c94d4dd, 0x7aa9a5cf, 0xff9522fe, 0xb25adc45, ++ 0xdfb422fa, 0x61dfe6e0, 0x6c59185b, 0xa22e1f83, 0x952d8665, 0x07695ef5, ++ 0x5bab7168, 0xe7cc5115, 0xc07bd4e9, 0xa5f699a6, 0xde2cde43, 0x69fff520, ++ 0xf116b126, 0xc58d61cd, 0x1fc09253, 0xfde4521e, 0xf78d1b1e, 0x2ccb6d82, ++ 0xc028d9fe, 0xbd7ee42b, 0x5e6dad5b, 0xf4829dd8, 0xf307ac0b, 0xa1fe5c01, ++ 0x2d43c7f2, 0xbe4f7c5d, 0x7b1fcf06, 0x0ba34a1e, 0x10b67e2d, 0xa0d19ffe, ++ 0xff7cf98f, 0x271ab954, 0x9932dd5b, 0xcd370beb, 0x8d4f73e2, 0x64764c68, ++ 0x07a2faf9, 0xc738b9fc, 0x5e51e12c, 0xf43a7933, 0x61cd8aa2, 0x526bb0b1, ++ 0xbd14feac, 0x69be5a1e, 0x3a839f0d, 0xe7c1c9b6, 0x339d0aa0, 0xb3d7910a, ++ 0x673ca368, 0x4c7bb5a8, 0x35957fdd, 0x99e70d93, 0xb89f5216, 0xb6cbf4c7, ++ 0xd397ce08, 0xb06d29ce, 0x1a8f36fb, 0x5d2bcf2b, 0x94e792ec, 0xabbdb892, ++ 0x56bd3f4f, 0xcf20da7e, 0x5dcee8bd, 0xdf479f4d, 0x1d3cd757, 0xeeaa7e8d, ++ 0xd39c677f, 0x1dadfec4, 0xdce7bfe8, 0xee7906d5, 0x7dfde16a, 0xeed27f9f, ++ 0xa3d8a8b5, 0x378ce218, 0x0f586205, 0x0d8505f5, 0x539f6df1, 0xcc7b9eb0, ++ 0xd721ea2c, 0x7b44bd35, 0xecf9541e, 0xfe6698b1, 0xdb25f11d, 0xe37be41e, ++ 0xf5928b3e, 0x7faedbf9, 0xb7c87c0d, 0xdfea4c25, 0x6dfac116, 0xcbea5f99, ++ 0xdc3a79da, 0xfc3b0017, 0xf21151b5, 0x5cf5287e, 0xed2f3696, 0x2ccfe11e, ++ 0x9c219ef2, 0x7f3d02b7, 0x042e0968, 0x7d243f3e, 0xc78f7114, 0x61f4fe54, ++ 0x1f7f99b3, 0x011b4fc7, 0xcd87c57a, 0x9e21474f, 0x4561e9a8, 0xeff2bfe6, ++ 0x2ddf2f4d, 0x3ee343cf, 0x555bbe7e, 0x3ad497f5, 0xdf2dbd25, 0xfb829d6b, ++ 0xe2af49a0, 0xa096d527, 0x557c2fad, 0x4f537aaa, 0xb64ed77d, 0xa55baacb, ++ 0xd6dd505e, 0xa6817ac5, 0x2be76867, 0x58bb5aab, 0xabbed04f, 0x52e125dd, ++ 0x2f3e4bb3, 0xe93bb9c1, 0xe92af16f, 0xae1597b0, 0xfdfde447, 0x7d1615fa, ++ 0x57ebabfd, 0xaa74a3a4, 0xd66e90fe, 0x7eceefcb, 0x9a99ed9b, 0xaa5fb526, ++ 0x9de3755b, 0x281ee6c1, 0xe245a79f, 0x7ec1977b, 0xed25d9ab, 0xf84d60a1, ++ 0xadbbce5a, 0xeff0b48d, 0xb244d4e0, 0x6758df3c, 0xbe3e46ca, 0x7d670957, ++ 0x17cd5dae, 0xbef5581b, 0x24827e03, 0xee12fdd1, 0xda3cfe2f, 0x38d0f267, ++ 0x4ca61fff, 0x8000e1a2, 0x00008000, 0x00088b1f, 0x00000000, 0x7dedff00, ++ 0xd554780b, 0xb3dae8b9, 0x926619e7, 0x4c90c93d, 0x08498120, 0x9dc46c10, ++ 0xb00d0417, 0x18081303, 0x42c144ea, 0x440130c5, 0x57c05790, 0xc193c6f4, ++ 0x188208f0, 0xdb151104, 0xe5a2d101, 0x1e8a84f4, 0x54076c50, 0x813d568a, ++ 0x55fb6a5a, 0x5b515a88, 0x1ed62124, 0xfef5b53d, 0xced6bfff, 0x0f0c9ecc, ++ 0xdbdef5ad, 0xaed7e2ef, 0x8f5ec7ac, 0xebfffdff, 0x242c1931, 0xfeb19931, ++ 0x41b1222c, 0xf0be758c, 0x80b07141, 0x3b0331b1, 0x630a613e, 0xe9a61596, ++ 0x258c51fe, 0xcbe990a9, 0x28e82b18, 0x7f0a5c0e, 0x02b3621e, 0xb51ec64e, ++ 0x114716b0, 0xec039b94, 0x603f286a, 0x8c3dbf82, 0x2927fe85, 0x7f04b8fc, ++ 0xa58c69e7, 0xc1dcb633, 0xe41f3ff8, 0x6dd63047, 0xb608d9e7, 0x9ff68129, ++ 0xe78fc29b, 0xe452f7c0, 0x97cf9c31, 0x632c6ff8, 0x50685413, 0xe6c058ca, ++ 0x1852916c, 0x64b24abb, 0x910e07ff, 0xc2a7ec1b, 0xf2b9027c, 0xef3085a5, ++ 0x528323ee, 0x169dde70, 0x3eb58ede, 0xdc61d9a8, 0x6cd86271, 0x54b10b13, ++ 0xbcfdacc6, 0x58cc964e, 0x387923b3, 0xa6927683, 0xff9806b1, 0xe68705dd, ++ 0x75d7bce0, 0xe60d99d9, 0xe92bae31, 0x65da091d, 0xb132abf7, 0x407ed8e1, ++ 0x7c93bf18, 0xda133666, 0x45302a1f, 0xd99ed8cc, 0xd99ed8c3, 0x7c8eb52b, ++ 0xb997d63e, 0xa1c98e30, 0x81d277e1, 0x412e7c5f, 0xfb3e5fda, 0xb3ac0a62, ++ 0xda92edff, 0xbb6a6d0c, 0x5ffa3d4f, 0x6cfcce90, 0x4f5c1ec7, 0x44b04a59, ++ 0xe89e7585, 0xe8277aae, 0x36957e83, 0xfbc05abb, 0x81c75d8b, 0x4e4f3e3b, ++ 0xd7e74535, 0xdfea75d9, 0x5304b3ff, 0x77c12abb, 0x11c80ee3, 0xf3def0db, ++ 0xc4c2f4e9, 0xc23b5107, 0x14d3a74f, 0xff6c2496, 0xbf385be2, 0x44677671, ++ 0x2cefc64e, 0xd1ec3ba7, 0xdb2f98ef, 0x0c3bea7d, 0xecbec251, 0xc426c54f, ++ 0x036c52e7, 0x901f75e3, 0x2eeebfa9, 0x7f419867, 0x2e9ccde9, 0xe9e9fc74, ++ 0xfda09aaf, 0x14aba050, 0x1056df56, 0x9aaa9f2d, 0x0553bf08, 0x0a0de79e, ++ 0x32bc44cc, 0xe03b3873, 0x3b34f1a2, 0xb134cbd0, 0xd12bc07e, 0x9fc62c93, ++ 0xcd30e026, 0x9eebe269, 0x416eb71a, 0x8ef8f10f, 0x66c3d3e2, 0xc4f146a6, ++ 0x397f6cee, 0x73f08725, 0x2f1c7de9, 0x3e5e1237, 0x65d56d7f, 0xd7f7ef90, ++ 0x7f9f84c9, 0xa6225e02, 0x9780af92, 0xd25e2376, 0xa18e239b, 0x07ae8780, ++ 0xa40eea4c, 0x11544477, 0xd6099aa5, 0xbe59f2c7, 0x95affa19, 0x607bd493, ++ 0x8024c17d, 0x93282c07, 0x826cbd75, 0x0390867c, 0x2e3aab03, 0x09ffd065, ++ 0xf3807ec6, 0x51b530ea, 0x2e6a13f9, 0xb58b27e1, 0x33396267, 0xed5e9477, ++ 0xe9fc3c42, 0x33143f92, 0x786d79b6, 0x3f427fcf, 0xa1f852cd, 0xd3ffc879, ++ 0xb0e3ea9c, 0x29b0ceee, 0x36718164, 0x7df0d9bb, 0x05e6fe30, 0x2c21a897, ++ 0xa7ef8267, 0xa1ef895b, 0xd603407e, 0xcff5e0cf, 0x7bbdfdfe, 0x067ae247, ++ 0xe6cf5a33, 0x2b643642, 0xe4d737e4, 0xbaf3fd53, 0xc5d7b8dc, 0x72e1afbf, ++ 0xd482f367, 0x0ff20870, 0xa61e1c3f, 0xde6e1d00, 0x42a665ae, 0x183934ba, ++ 0x27eaba46, 0x9cdbfa73, 0x6e90e503, 0x6e330291, 0xe52e7ec0, 0x9198edf3, ++ 0xa02793f4, 0x881e472b, 0xd13f2826, 0xe721dae0, 0xe8f5e944, 0x30e08560, ++ 0x43cef430, 0x38d0a708, 0xfd0f5f96, 0xa674149f, 0x31025dc3, 0xf77000d7, ++ 0x78eb3808, 0x93cde9d0, 0xf287f404, 0x5dd391a1, 0xcf589c68, 0x966e1612, ++ 0xa3acce10, 0xd6b9c00f, 0xde10faa6, 0xee094cbf, 0x2f37f9c3, 0xb8c8fc03, ++ 0x13878e0e, 0x963f3626, 0x45f4f49f, 0x44beabe4, 0x4bf2122e, 0x52fce32d, ++ 0x7484f48b, 0x14f400d8, 0x23ac8743, 0x8faa7dcb, 0xbef827a0, 0x8c3c15dc, ++ 0x724e2de3, 0x963ffcd2, 0x2b02357e, 0x3c9bfb5f, 0xff78d13d, 0xed0bfc85, ++ 0xdf04706f, 0xb37dfe20, 0x72c4e482, 0x5afb8f85, 0x28d907e1, 0xf1dc4f9f, ++ 0xd74c2c8b, 0x628e0724, 0xfe332dbb, 0xc6550132, 0x0b0eccc9, 0x8ce4e7ae, ++ 0x01f6c9ff, 0x7f1b6b3c, 0xb17ff441, 0x51e7d5f3, 0xec5682c3, 0xf40586a7, ++ 0x98ea0074, 0x9726a61a, 0xa79d34f0, 0xb8fc2e5d, 0x3cacf986, 0x53da4455, ++ 0x872d3abe, 0x51a70fca, 0xf3fa267b, 0x5e52f6ad, 0x9435e099, 0x3271fcc3, ++ 0xb970b14c, 0x6b49cff5, 0x07d42cec, 0xafedcce8, 0x7001dd5b, 0x2dbbf0cc, ++ 0x9627a41d, 0x2e5d5e91, 0x9b9022e4, 0x73f210b3, 0xb94fde05, 0x2e500382, ++ 0xc6e87c1f, 0x54fed801, 0x18038de5, 0x903fefa4, 0x547c4161, 0x3f503f62, ++ 0xd58deb77, 0x5a739748, 0x0473206d, 0x757fe1bc, 0x2194362d, 0x79a3f93d, ++ 0xef814b8a, 0xe93ffa8e, 0x35f1a41b, 0x6235cb92, 0x67f200bc, 0xaf37e426, ++ 0x6bf28b39, 0x7df8c856, 0x1f89d6cd, 0x0d3538e0, 0xa14f72c6, 0x657883cb, ++ 0x44bf532a, 0x24406a78, 0x9bd37aa3, 0x10c7029e, 0x00f9e9dd, 0x043c22eb, ++ 0x17885e00, 0x59bfaf48, 0xf227d4c2, 0x44d7a8aa, 0x41f2203e, 0xf28bd691, ++ 0x455b4890, 0x6da45879, 0xf2223ca2, 0x35df22ed, 0xc7694cc0, 0x9abf5108, ++ 0x81c1b8d1, 0x9fb7ca1e, 0x4338f890, 0x72d106d3, 0xe947682d, 0x2bc42ce9, ++ 0x51bb99f0, 0x4b363922, 0x7313c293, 0xa68bb77a, 0xbb636f5d, 0x77cda340, ++ 0x843b4c4f, 0x98a2b8ff, 0x3d34e03c, 0x61ef2635, 0xbe6c465a, 0xd47de731, ++ 0x8b3b0183, 0x724e19f4, 0xccbde09f, 0x58509c11, 0x9245fd4a, 0x5cab7db1, ++ 0xa436e34a, 0x162f5e11, 0x04fec01f, 0x123d4c1f, 0x6f9101a6, 0x14fc2135, ++ 0xdf389416, 0xfbe84930, 0x935347ff, 0xdb41f084, 0x3bf3e10e, 0x10b8b035, ++ 0xcc68a0e0, 0x4c1c0412, 0x553bf1d3, 0x9c81e50a, 0x86756f4f, 0x323c0227, ++ 0x72ec4aa6, 0xf5b4e3c0, 0xf6476449, 0xcaf8e2cf, 0x1d90b332, 0x0eae2dd2, ++ 0x6fda1793, 0xbbd4cfd9, 0x19c1fda1, 0xb410a5ab, 0x54c752df, 0xda65bf6c, ++ 0x89cc998d, 0x212ad472, 0x80e62a1f, 0x62bcf905, 0x05c90d6a, 0x34c30f1d, ++ 0xf8e509ab, 0x7f009db4, 0x9ab4a76c, 0xbcd10502, 0x6c67b45f, 0x30f1f13a, ++ 0x1bd7d3fc, 0x0476bfbf, 0xf60495b2, 0x4de69e9d, 0xa0262295, 0x402d0aa7, ++ 0xc69a64f2, 0x61c7d7fb, 0xfbd47ec2, 0xf79c72c7, 0x6439a9b4, 0xdfab9fbf, ++ 0x5a3f68cd, 0x09bfbb19, 0x6890d284, 0x5755fdf9, 0xbebbf0bb, 0x052736d3, ++ 0xda6bcc13, 0x2c763dd4, 0x9233b61f, 0x6016e98a, 0xc3ce0888, 0x7cd0741c, ++ 0xd3bd7c82, 0xfb26e47a, 0x3f3897fb, 0x6e5d03cc, 0x815cda99, 0x0825b67c, ++ 0xbde10912, 0xfa83b673, 0xc7357e99, 0x933798ab, 0x12be5267, 0xbdece8e1, ++ 0xfcc5fbce, 0x2c05e5a7, 0x3d43c10a, 0x34d8f688, 0xd432a98d, 0x59cd4f77, ++ 0xeef5f661, 0xb4095a67, 0xfc09f487, 0xa9bdd61e, 0x367ea149, 0xff297935, ++ 0xfb03c200, 0xc87f59dd, 0x8081fd81, 0x9eea7643, 0x4961535a, 0x8f9f9fd4, ++ 0xd77c547f, 0x890dfd8e, 0xe884fff6, 0xdf4eda77, 0x37f60f2a, 0xa15f9f5d, ++ 0x5e606004, 0xf2097433, 0xa486abc5, 0xabc7e87a, 0xf614ea41, 0xac77f43d, ++ 0xbfbcbf57, 0x7e9ffb5f, 0xf26816f8, 0x9ffbc99d, 0x93e90bda, 0x5a9ff7fe, ++ 0x597afd00, 0x30adf645, 0x9597778e, 0x53dda2fc, 0xc03ee7b7, 0x7ddfded0, ++ 0xe70c33c9, 0x125c71bd, 0x4980e3ce, 0xd012f9b5, 0x9f0e54cf, 0x0e1a3a78, ++ 0x89fe40d3, 0x62a387a7, 0x8e82ed9d, 0xd4f0109e, 0xc544f9e7, 0x02df0f83, ++ 0x77190efd, 0x909bd147, 0xc2dc68fe, 0xa0de709b, 0x26fa7e07, 0xc9c9ffe0, ++ 0x0cd8ec8f, 0xc1857ef9, 0x1c7ca23f, 0xefaee13a, 0x13f6c5ef, 0xce0f161d, ++ 0x15fa99cf, 0x9e8f55f5, 0x1fa428b2, 0x1791567c, 0x3d72b329, 0x7623edc3, ++ 0x7ff07d4e, 0x24d01a67, 0xb918bfa2, 0xfac114a8, 0x7cbcfc6b, 0xa2b6ab36, ++ 0xc2d95d1d, 0xf5ecdef5, 0x05a7f712, 0x3e09d61f, 0x4ed58604, 0x7e40dfc1, ++ 0xc3804bec, 0xbde7617c, 0xbbe8c79b, 0x30a51b77, 0xbdac3078, 0xf60b3de5, ++ 0x41caeef7, 0xbbffd8c9, 0x89ac832d, 0x96eccae4, 0xf79bcbf3, 0x2e801e90, ++ 0x09f26dde, 0x3df4e67a, 0x5abfb75b, 0xd0095724, 0xa9268d65, 0x7049a113, ++ 0xf686d4bd, 0x8e4b467f, 0x412bec95, 0x8c5d475f, 0x255d1dda, 0x174377a9, ++ 0xe46d2b07, 0xdedd1ce7, 0xe279e887, 0x98a3f74a, 0x18dbf3af, 0x0c563be6, ++ 0x5ecef9a5, 0xb797f859, 0x21755d60, 0xe5055a9b, 0x0a7e0bef, 0x58c97568, ++ 0xf23c212f, 0x9608f0a3, 0x432ddf2b, 0xea2df9f8, 0xbc28bedd, 0xf00f582c, ++ 0xbcc91d9b, 0xe71816fe, 0x62a490c3, 0xeb5ce628, 0x4d85677e, 0x08d0c7c8, ++ 0xb6ef2bd4, 0x0651bda6, 0x5cd9cdfd, 0xc7d01871, 0xc83a2b3a, 0x0764580f, ++ 0x3ce006bb, 0x29d9ed6f, 0x11562900, 0x5ff43492, 0x85b5ef66, 0xd987806d, ++ 0x9c348c80, 0x8a0e5bcf, 0x257ae80b, 0x75672718, 0xbfe3eafc, 0x8c941a1b, ++ 0x45bdb972, 0x2f9dfe4e, 0x2dd9c78a, 0x09bd8769, 0x51e3ade6, 0x85b3e397, ++ 0xdf01dacd, 0x1e01fce3, 0xbcff9c2e, 0xad9ed1b0, 0xd8314c6d, 0xfa75e39d, ++ 0x37f4e46b, 0x50c335a7, 0x859cff0f, 0xfe3cffd0, 0xe7e79b37, 0x1689f276, ++ 0xffec5ef9, 0xb66b86fd, 0x76f2848c, 0x2405b4e9, 0x5add9b14, 0xad698c98, ++ 0x5adfedc6, 0xe8bbd83f, 0xe9d9c7c7, 0xc1948fe8, 0x474b47d0, 0x06dd2326, ++ 0x7b57ba57, 0xeafc517d, 0xab61bbf8, 0x2b9e4ed1, 0x4ae0aaec, 0xf6a2bae3, ++ 0xbb45669f, 0xd78ede24, 0x17683ced, 0xdb555142, 0xbb07ac68, 0x6951556f, ++ 0x9b03ce94, 0xb9253ed2, 0xad729173, 0x41efed16, 0xabbf453c, 0xa059ed12, ++ 0x3d0d598b, 0x10e3cd7c, 0x0021c78c, 0xf9bfc253, 0x9eb94b57, 0x59eefdd2, ++ 0x3f49670d, 0xf4e46acd, 0x78c3cbaa, 0x8d514e38, 0xccaab8f8, 0x9a35a748, ++ 0xa9af2e91, 0x3f68681a, 0x50d4302d, 0x97e9bdff, 0x0467ea19, 0xd7f21a47, ++ 0x686b1fcd, 0x44fd7d7f, 0xe9bfdd23, 0xa0bc7ee6, 0xffe173d7, 0xdf57a135, ++ 0xf4cfb388, 0x6ff8bab4, 0x27c7c8d9, 0x36f4d86b, 0x8a31a74c, 0xe0ac9c23, ++ 0x1e62a0e9, 0xf31673ff, 0x45a7c238, 0x9770bf3c, 0x310ff5a3, 0xe6dc59f3, ++ 0xee97e436, 0x43fd6ccb, 0x0a167acc, 0x245bb2b8, 0x22d9f233, 0xb316c55e, ++ 0x6728018e, 0xf51f26bc, 0x91d4c4bb, 0xd64ef98e, 0x5e90ae95, 0xea5f108d, ++ 0x28e93af8, 0xc44cdbb7, 0x16fe3c1f, 0xc0387f1f, 0x99b7e47c, 0x25293ed9, ++ 0xe3d1ef1a, 0x0472bf3b, 0xe91f20cf, 0x3ce3d7eb, 0x8b8b71f1, 0xc2aeabe5, ++ 0x3c4567e0, 0xabd0639e, 0x5b7984ff, 0x737efb8a, 0x293b06f3, 0x5bf4b8a5, ++ 0xf1567799, 0xeaef0837, 0x6290e0c2, 0x1e25bc23, 0xe7c6f8e7, 0xc24dfc5d, ++ 0x13b0967b, 0xb509e3e3, 0x4dfdc64e, 0x7900be3d, 0x5332d3d4, 0x528bbfbf, ++ 0x0273ffbe, 0xa5095765, 0xef37f261, 0x51e4f5b0, 0x8bb89f7e, 0x3c801fe7, ++ 0xeebaefa3, 0xb4c1cdcd, 0x694f95c3, 0x5991fa98, 0x32f5f93d, 0x41923f6b, ++ 0x720fa0e5, 0xe5c0faa2, 0x72efc7d2, 0xe57aa60d, 0x63aede7e, 0x0bd92e4a, ++ 0xa8c84f5c, 0xf85da827, 0x5f688648, 0x3902ed49, 0x71d38d12, 0x9213f450, ++ 0xf0f76529, 0x0cf6e176, 0xdc6547ea, 0x2ea9e51e, 0x56e27f77, 0x8c9fa3a7, ++ 0x2a721a5b, 0xe83311a5, 0x458bb7cd, 0xcc1cd4dc, 0x03edbc24, 0x6e765ec0, ++ 0xb0b49fb8, 0xbbd0f184, 0x5c3b1c84, 0xbef4a66c, 0x224b6ef2, 0x9fa7b4ff, ++ 0x3855533c, 0x95bffd41, 0x3591fdf0, 0x73df3e2e, 0xa572738d, 0x5df7e139, ++ 0xf353dea2, 0x7b3e7492, 0x29996537, 0xff504e10, 0xfe3e62b7, 0x4d26b763, ++ 0x5673fec7, 0x05c96ced, 0x90d939fa, 0x217e8856, 0xfd19aa90, 0x24286f2c, ++ 0x1fef832d, 0xf831ce29, 0xdf1ab337, 0xc1e19559, 0x910a7bf5, 0x7905bf96, ++ 0x7e8bdc7e, 0x2f1894bb, 0xf47ac573, 0xe8a741fd, 0xb43401ef, 0xf7485d70, ++ 0xa36704b0, 0x9871f68d, 0xd7ec37ea, 0x62c49f30, 0xe9dbd3bf, 0x2a368dfc, ++ 0x7214f4e3, 0x9bf74514, 0x633a51bc, 0xff3a6748, 0x4b0ff7c7, 0xecc7250d, ++ 0xeb0578db, 0x48667f63, 0xfb82a303, 0xc8f45e51, 0x11a99f89, 0x9c9c4b8c, ++ 0x2a3f2766, 0x98737188, 0x69cfa98f, 0x1b07b78a, 0xc50a5c84, 0x4d7d1fed, ++ 0x21d272f9, 0xeb8bb6f4, 0x957ebd71, 0x148fdfd0, 0x7b7a7b7f, 0xf9e045c0, ++ 0xd28cc587, 0xb412a193, 0x016a58c8, 0x932c30c3, 0x7e432a9d, 0xbe0b2acc, ++ 0xd7a06c57, 0xdb84249c, 0xcb278657, 0xcd6e2852, 0xb17ebdb8, 0x52e5d4f0, ++ 0xd88b337f, 0x694893e0, 0x63d453f0, 0x7e296520, 0xebf3cfa1, 0x978eaff2, ++ 0x6c162601, 0xa61f204b, 0x3bfa8895, 0x34f9233f, 0xc51748eb, 0xd6356653, ++ 0x78df3c0d, 0x654d07a8, 0xf3276ab0, 0x1f23ced9, 0x2e2f387d, 0xdd225767, ++ 0x92fbd567, 0x95af20ea, 0x3b54b970, 0xae124875, 0x63ec02b5, 0x9da14f8c, ++ 0x90e262cc, 0x6c73f6b1, 0x765cf0fc, 0xd607eeb5, 0x5c00dc0a, 0x3eae3843, ++ 0x4ec2359f, 0x9d873e6d, 0x574066ba, 0xe9f68ab6, 0x084bb75d, 0x462d1d8f, ++ 0x78d19db9, 0x1d031576, 0x43b91199, 0xae6a61f2, 0x3818d497, 0x3bfe9ad9, ++ 0xf279e71b, 0x2576ffae, 0x86c9df82, 0x78425c4f, 0x2b5bff90, 0x272c5ffc, ++ 0xf8f237f8, 0xfa77fc45, 0xf3d5b6fa, 0x2e3464f9, 0x4fc83493, 0x612f599c, ++ 0x589d61bc, 0x6a99acd7, 0x56594504, 0xf9425841, 0xabbeab3c, 0x9dabc712, ++ 0xca32f5df, 0xa602dae1, 0xdb5e506a, 0xeae89070, 0xf8e0b2b9, 0x1d28d292, ++ 0xf606f4ea, 0x896e4bc0, 0x15887be4, 0x95549f11, 0x7d2abe00, 0x3f389d47, ++ 0xc5b7ddbd, 0xe3f55927, 0xa8eb1842, 0x5371e7a8, 0x94f43ba0, 0x041d7d60, ++ 0xa4a3732f, 0x5cdca046, 0xb07d556f, 0x86a1b93e, 0xf9e575f6, 0x76835556, ++ 0x888d9787, 0xb07f7ca0, 0x44711241, 0x566e1fa3, 0x83e95fea, 0x134cd176, ++ 0xd06ec993, 0x57dfd1aa, 0x62ad9d04, 0x58c1f681, 0xf07fc1ae, 0x5728b25d, ++ 0xc6abcfe6, 0x8d66b24c, 0xfc68178b, 0x6390829c, 0x918d86f6, 0xacf34c0c, ++ 0xae4bff06, 0x01f14d5f, 0xc687b61b, 0xfab8ac96, 0x9f6813f9, 0xe58c564c, ++ 0x3cb89477, 0x750fffb8, 0x74564fb4, 0xefa6f147, 0xee4a7cc1, 0x9857e6ba, ++ 0x823e254a, 0x371588db, 0x3f874da7, 0xba6d56cb, 0xdc1fd306, 0xcbaf97f1, ++ 0x7296cce7, 0x97ae7cf1, 0xcbe42cbf, 0x1cfcf905, 0x7e4e7afc, 0x93b62c69, ++ 0x737c169c, 0x8493f1b2, 0x37ce95f6, 0xa7ac7cf1, 0x0f202eeb, 0xc8e80dd6, ++ 0x713efe46, 0xfc7cc8c7, 0xf6e1b6be, 0xe5166183, 0x65c6daff, 0x6b303fb4, ++ 0xa4aa5326, 0xbe27f2de, 0x575f3ebf, 0xf7adc43e, 0x389c80ff, 0x8c4e4892, ++ 0xd987fbfd, 0xda9fa3e7, 0x8fda2eac, 0x4b447f02, 0xa5fda7a4, 0x94e40f5c, ++ 0x849d28da, 0xc2441e02, 0xf706f864, 0xbad6651d, 0x37d81d6d, 0x15f98163, ++ 0x05469bc8, 0x68728b7f, 0x406de432, 0x6e249327, 0x73370cff, 0xb3f5197d, ++ 0xdba5ddb8, 0xd9cfe959, 0xa298fa3b, 0x6b70d376, 0x43f40cc7, 0xc561de4e, ++ 0xe4ec2f93, 0xfb79fffe, 0xb2b73c76, 0x860eaedf, 0xd8518439, 0xfb3efd60, ++ 0xa24f3c76, 0xdb2773db, 0xe02ecec0, 0xb1ed1afa, 0xed128d59, 0x909f813b, ++ 0x78465ca4, 0x4571aa4b, 0xe870b6ed, 0xc06de910, 0xab9d7677, 0xfd077db7, ++ 0x7867ec30, 0x0564cd63, 0xdcadb5e6, 0x8f489554, 0xfa7016ef, 0xfe0bfcba, ++ 0x63f400df, 0x0e789e70, 0x83be664a, 0x558fdc26, 0x68be7e01, 0xc8eff07b, ++ 0x2286f7ce, 0x65f70d92, 0x3515e656, 0xcbb4be73, 0x2a4cfedc, 0x207dc52d, ++ 0x2a6e5f51, 0xf745f66a, 0xd9875885, 0xf8e7718d, 0xe7bd1973, 0x74a76665, ++ 0xc8478979, 0xa53d0446, 0xdbebe809, 0x94b32fd2, 0x7f79f4c4, 0x0d5f9729, ++ 0x674a0ea5, 0x025da079, 0xfa5b5239, 0xd7bdd9ad, 0xdbe8395e, 0xb1b7cb83, ++ 0xad7faa9e, 0x2c996cf5, 0x27ad4bff, 0x16bfd27d, 0x9b7f8e7e, 0xee7f01eb, ++ 0x35c9123f, 0x5e2fd0af, 0xa7ef3f27, 0xaf904fcb, 0xedf694cf, 0x03fea7ed, ++ 0xa5e7f572, 0xef8f7b7d, 0xe29539c1, 0xc5175226, 0x54a12ceb, 0x59c7fa2b, ++ 0xf4b8231a, 0xcbca33f3, 0xfd429768, 0x0e4c0f40, 0x031a2bca, 0x3aa73c76, ++ 0x186263d0, 0x546bab77, 0x256b3ca9, 0x9d822b8f, 0xbe81f618, 0x71e217ec, ++ 0xd7907ebe, 0xcdaabf20, 0x4237cfcc, 0xf77de31e, 0xfdb05a01, 0xed00ce3b, ++ 0x2baccadb, 0x0e8bf713, 0xf2a565df, 0x49f13d95, 0x8e037b56, 0x71cffa23, ++ 0x9f68c205, 0xc3897caf, 0xc7681def, 0x516c07bf, 0x5023b1bc, 0x99e3c396, ++ 0x5c8f1e36, 0x8d89cd61, 0x51840647, 0x869d91ae, 0x91fb1068, 0xd2bcbfd4, ++ 0x8de313bc, 0xcbb046e6, 0xd6e14787, 0x319d7cfb, 0x0bfba8ae, 0xbd5c5983, ++ 0x8a0617f0, 0xbe21c1f2, 0x0fd7a86f, 0x37ef1cdc, 0xf57ef2f0, 0x6793cb89, ++ 0x7300fd1a, 0xd3a39f88, 0x631ecdeb, 0x57417f7d, 0x8d93dc7a, 0xca837e10, ++ 0xb8df688a, 0xa0bb2245, 0xcb82ed0e, 0x100d76a2, 0x753fc51c, 0xc558eaba, ++ 0xc87082ed, 0x7d36f1c4, 0x93f20ec8, 0xbf53579c, 0xb7a07dba, 0x4ee95baf, ++ 0xec764d9d, 0x26de3cdd, 0x2da7e5f8, 0x0fd0ebc5, 0x9afebbd9, 0x6cfa625f, ++ 0x667dcdeb, 0xa95abc10, 0x9bcdbedd, 0xdebcc4ae, 0x2bd3e00f, 0xe33278f3, ++ 0x6f76e571, 0x2431e132, 0x033e3af2, 0x1e7f0833, 0xd3879d2b, 0x416656e9, ++ 0xac1ef1c6, 0x693a23aa, 0xa530f915, 0x3d7cbc47, 0xbe3c9dab, 0x1ca1f50d, ++ 0xcabbe76a, 0xe89b6944, 0x12feb227, 0x9fbb574e, 0x35fdb4a2, 0xcd3f6f9e, ++ 0xf27de0f3, 0x3895edf9, 0x7a08161d, 0xa73965bc, 0x343e7163, 0xfa2c6478, ++ 0xd8935ea5, 0x21d40cff, 0xed53cb1d, 0x8c37e60a, 0xfbe5e11a, 0x7bdcfc23, ++ 0x63d19c4f, 0xb36338a5, 0x728636eb, 0xdbd2deea, 0x47207822, 0xafe462ce, ++ 0xe52a59ca, 0xc601f06d, 0x43cf81f9, 0x0be90e74, 0xe8230290, 0xb3fd28dc, ++ 0xbc0e824a, 0x1ac7c21e, 0x1c5e6dd7, 0xdba8c364, 0x9befc2de, 0x0fea56dd, ++ 0x7c8e99c6, 0xf22592de, 0x55bc4f25, 0x16978317, 0xf276dde7, 0xe3cee2df, ++ 0x764304b7, 0xecd45f3c, 0x30fbb22b, 0xdf911675, 0xfd4ea7a2, 0x632b3e9c, ++ 0x171a4fb4, 0x5d3d94ff, 0xc33f744d, 0x3ac3e23d, 0xbc4376b1, 0x87a1c055, ++ 0xf8e3f23e, 0xc4b18be4, 0xbddfbaa7, 0xbaf9c5cb, 0xe30b1879, 0xc4b3453e, ++ 0xaacccaf1, 0x24abef17, 0x9ac458f9, 0x268e5bdc, 0xe2663b39, 0x1f7d643c, ++ 0x5cf3c045, 0xa5d9b772, 0xe7c5137a, 0x1bfbfa63, 0x815269f2, 0x1fe93f91, ++ 0x530937cc, 0xa93dff58, 0x3e23844f, 0xf285ec5e, 0xac6e423e, 0x655ee5f3, ++ 0x53db45f2, 0xdfb08317, 0x57d432d0, 0x9dd8dd3a, 0x6091cd56, 0x753cee9c, ++ 0x2aa21cfa, 0xfc7b9516, 0x2f37913c, 0xf4067c66, 0x2bb1788e, 0x8f87f2f1, ++ 0x16677fab, 0x55bf40e3, 0xc2996357, 0x5121a5fb, 0x96993a7e, 0x9bc7e31c, ++ 0xbafec67d, 0x6e505ef1, 0x3fc877dc, 0xdf270ece, 0x0d3b6367, 0xfe2513f1, ++ 0x79cd10fb, 0xf88d4ed8, 0x3f272ae1, 0xd2dcd0d7, 0x7e82625d, 0xae356e87, ++ 0x33e791df, 0x9d91f79c, 0xd7845f4a, 0xe9116f6a, 0x0bf3dec3, 0x72e4fa85, ++ 0x7a3c2180, 0xbe0e33e1, 0xf017be09, 0x166bf4e4, 0xa7ef8970, 0xdc7f7ef7, ++ 0x96cd0e79, 0xb26b1d70, 0xf913d8b7, 0xc6cce37d, 0xa77e2273, 0x1e09fbf1, ++ 0x96557d63, 0x793b2f31, 0x6857ccff, 0xe73775c7, 0x7b3b1f01, 0x7afc71f3, ++ 0x7e3af87b, 0x41d844bf, 0x13ee7951, 0x7077d87a, 0x7cd9c52b, 0x859ef107, ++ 0x2fb4055c, 0x35f914f1, 0xf92bf715, 0xbf90a07e, 0x553be26d, 0x24862fec, ++ 0x645fdc83, 0x7da0e715, 0x25b945bf, 0xd7195997, 0x6f072103, 0x0f32beaf, ++ 0x036c2ef2, 0xdda3f7f5, 0x59bb7f00, 0xd503d717, 0x24df2a26, 0x24fb8eec, ++ 0xd5ddca95, 0x284c2d20, 0x66bef87f, 0xb8c4d306, 0x71632bea, 0xed136adc, ++ 0xa2c2ae4f, 0x46b5044c, 0x2b58d9df, 0x61bbebb5, 0x27bc0ae8, 0x058377d6, ++ 0xd6b0486f, 0xcd6fc3ba, 0xb0f631f1, 0x73b7fea5, 0xb5b91e50, 0xf1507983, ++ 0x64f4e8e2, 0xdc9bbf94, 0xffc70526, 0xedfd5b89, 0xf34f985c, 0xc5ff7e14, ++ 0x1d8370d6, 0xef83dea7, 0x2fa4a911, 0x30565ad3, 0xada7478c, 0xfb107a1f, ++ 0x14ab334d, 0x66ad4e8f, 0xc0fda25a, 0x7ee48cdf, 0x90e51aea, 0x778c0e77, ++ 0xce9fcc3f, 0x23f58aa7, 0x9b4e905c, 0xfa204d47, 0x3e6bf6ed, 0xce6043bc, ++ 0x41e4b60e, 0x5c55adbb, 0xd3cd6e5f, 0x96997ff7, 0xd4f9c452, 0x901af14a, ++ 0x38b690a7, 0x845ce658, 0x152490cf, 0xbc3d8028, 0x22664b60, 0x7117957a, ++ 0xdbdf8f79, 0xebd77a8a, 0x595706e9, 0x959bea26, 0x387c4653, 0xe0f1e617, ++ 0xaf28db94, 0x4234fbcb, 0x71bf4c7d, 0x535dd2f1, 0xdd9bde38, 0xde6007a0, ++ 0x980f409b, 0x3566a011, 0xfc04eaf3, 0xaab723dd, 0xfe401eb9, 0xd699fdc5, ++ 0xe7f9098a, 0xab98b78b, 0xd5493eb8, 0xba9546f5, 0xf06ee302, 0x30ed047d, ++ 0x77cf07ec, 0x7ae1aa43, 0xb7f5245b, 0x8a725f74, 0x98f787d5, 0xd20f33ce, ++ 0xf8b8e61f, 0x4f8114f1, 0xa985e226, 0xda740758, 0xe4b75162, 0x532dbf41, ++ 0x2876ea4c, 0x945d54da, 0xad28ff70, 0x1cfbf39a, 0x1250ea8b, 0x313737d4, ++ 0xedd8f73a, 0x7d9b8f57, 0xd39f99e7, 0x2351af38, 0x0e9bfef9, 0x731edd07, ++ 0x456c7557, 0x26734bba, 0x4249b9d1, 0x8547ca1a, 0xd6f40b7f, 0x2f596882, ++ 0x5945fdf1, 0x726d8bec, 0x7f213d01, 0xbe74acba, 0xdca7d4d1, 0xc83c3e77, ++ 0x1317a0d5, 0x7eddcdc4, 0x9ff0df21, 0xffe0276e, 0x17a0cc69, 0xd20ef5e5, ++ 0xdef9e76f, 0x21f5d667, 0xcccd152c, 0x59ccfed8, 0xea3dfe26, 0x99b7c441, ++ 0xbd45ac85, 0x2657ebfb, 0x0cb4f7e9, 0xe82acbdf, 0x7f5a64d7, 0xe009f908, ++ 0x4278fc42, 0x10967802, 0xb5fbf0bd, 0xb979716f, 0x1617db29, 0x9f4840f7, ++ 0xdcaff15b, 0xfb75e3de, 0x157cf95b, 0xc89fdd16, 0xf5f5e689, 0x7e71243f, ++ 0x68ca5d09, 0x68fdde9c, 0x9de57fa4, 0xcecfea61, 0xd0e98e7c, 0x4da83ece, ++ 0x5bd39b9d, 0xdbfb76ff, 0xbc012e5a, 0xa9ea7bad, 0xda9079b6, 0x0fbecc7d, ++ 0xeecf71e0, 0xc53e1f1d, 0x666ff77a, 0xdf813f9c, 0x429b1d69, 0x0e51f29b, ++ 0xf0fbae39, 0x69833c51, 0x4127db8d, 0xb2bfa004, 0x82d83ab6, 0xdfdf1a74, ++ 0xabdc96a6, 0x9deb8ccc, 0x1cfbe20c, 0x40f2cb92, 0xd20f7a9f, 0x97fb9da1, ++ 0x46129a72, 0x1d569e79, 0x641eb854, 0x4d970879, 0x6af64502, 0xc09fe916, ++ 0x752f5abe, 0xe23df03c, 0x08f74663, 0xe279f7e3, 0x239ffbe7, 0xb4f784dd, ++ 0x07da2eaa, 0x0bd7f6e9, 0x23af817b, 0xbfe39e9e, 0x77d804f7, 0x356ddee9, ++ 0xcfbaafdf, 0x78c5e5d2, 0x82f77df0, 0xe76b169f, 0xece1c1c4, 0x6f5cbe88, ++ 0x473a3354, 0x11ccff7c, 0xbab7bc0e, 0xe1c8aaa9, 0xac764613, 0x7aa9bdbd, ++ 0x17dbb736, 0xec1bbb71, 0xe0ffba25, 0x8f7d06ac, 0xff611271, 0xe23189a7, ++ 0xa0a6fff5, 0xfdc3d7e8, 0xd7e7163f, 0x73ffb05c, 0x95b613d8, 0x3a7744a5, ++ 0xb71daf3d, 0x82f51325, 0xb35beebe, 0xa0e7b36f, 0x626498bc, 0x9376ff78, ++ 0x1eb4d738, 0x1c8effe4, 0xd7a0ff94, 0xe9ea0e88, 0x7726e79e, 0x8f41d11e, ++ 0xca7299be, 0xa4d9788b, 0x7a8ad88e, 0x5ceafef5, 0xfefa4e07, 0xa2d7bbaa, ++ 0x341d5d5c, 0x8f4c58f1, 0x3d2e735d, 0x77cefaa8, 0xebffe65f, 0xff4c7fbf, ++ 0x0a667ae9, 0xba06be1e, 0x62a475b8, 0x8d115738, 0xdf84041b, 0x27bf09af, ++ 0xaff37e3e, 0x3fc69e91, 0x395d0ec1, 0xacba302a, 0x5bef1a34, 0xfa1a5793, ++ 0xb5fdc31e, 0xc0377ea9, 0xd187927b, 0xa78b1b7d, 0xda2fb0cb, 0x03b6a591, ++ 0x2f2bb119, 0xbe7ed5bd, 0x2cb66af3, 0x60748e96, 0x4ca807db, 0x35bb7739, ++ 0xae28a7d9, 0xb7bddefa, 0x6e3cf9db, 0xf6f3b3b5, 0x76c1eadb, 0xbdea59ef, ++ 0x4d630e78, 0x77da08f6, 0x17f9066d, 0x92bf1271, 0x3479b0f0, 0x8d6a2d4a, ++ 0xc2dbf919, 0xdd4cbef8, 0xa9cd5baa, 0xb9f10718, 0x9cd35f69, 0xe44b3015, ++ 0x18672cbf, 0x09e49a8f, 0xcfa01405, 0xadf09ec9, 0x6be26d0a, 0x91e28e3c, ++ 0x93ffc84c, 0xe56fcccd, 0x96378cfb, 0xf2ad1d01, 0x1d63bbbc, 0x06706bc2, ++ 0xe1d3779d, 0xb6eb5169, 0x6e3463af, 0x1031f504, 0x1b49e925, 0x165e3fee, ++ 0xcfd47fdd, 0x90fbe84f, 0x8972ca5b, 0xc3aca53e, 0x1bbca39f, 0x969874ae, ++ 0x2c927c03, 0x07c8751d, 0x71801a6b, 0x64d60f80, 0xc0ab3f71, 0xe8f5cfc5, ++ 0x596c99f7, 0xd075e981, 0x3b0ee92e, 0xefe007cd, 0x71a25254, 0x17b04cbb, ++ 0xe558ded0, 0x11d4a1d9, 0xd6f36efc, 0x7a27d025, 0x582b3c3a, 0x7018708d, ++ 0xd1f90367, 0x0cf523b6, 0x2b2d95e5, 0x8afb5178, 0xf11f1816, 0x31b2736f, ++ 0x5583a3e7, 0x89e9d6d9, 0x613691fc, 0x83470cff, 0x877fd705, 0x6bb9e29d, ++ 0x56f9dff6, 0x3f74495d, 0xb7332816, 0x3ee8d2e6, 0x336e7eac, 0xb3de8e3e, ++ 0x39f8caaf, 0xbeae3d3b, 0x4573025a, 0x76faf8a6, 0x2a6f8be4, 0x88c6febe, ++ 0x12cb8fe0, 0x5b59d7c4, 0x0fed45da, 0xd3368d24, 0xb90189b9, 0xffbb182c, ++ 0x65c051b8, 0xea7c0f63, 0xc16fbf49, 0xe7a526cb, 0x3fd44f86, 0xc0dc6756, ++ 0x1f22dfe3, 0x8cbaf8a6, 0xc5064037, 0xba1de1fa, 0x0fcbd47c, 0x0767b8f2, ++ 0xc8f62b8f, 0x330adf4f, 0x7243c7f7, 0xb7f96c4e, 0xa55d4f2b, 0x09be1c25, ++ 0xa697bbee, 0x3fd10913, 0x8a3cf54f, 0xaf3b37b3, 0xa7ef6256, 0x7924f1eb, ++ 0x23773f3e, 0xf1104f57, 0x31498973, 0x602d347a, 0x55c933d4, 0x73af7cc6, ++ 0xf6fa713a, 0xcf872141, 0xecfb8994, 0x2f88d823, 0xa7e4e0f9, 0x1d738b25, ++ 0x0eb951ae, 0x72aac3b2, 0x0919bce9, 0x49ba1889, 0xf79df2ad, 0xe101da9e, ++ 0xdc4cfd9f, 0xfb888cbb, 0xfdc4878c, 0xfef097b5, 0x0ec610da, 0x7a53e537, ++ 0xf2a549a4, 0x84ca9b57, 0xc4321093, 0x9f022c67, 0xb85b9296, 0x6be6209f, ++ 0xbc05f316, 0x3a788b27, 0xa55c4bdd, 0x1ac1b8f0, 0x17413fe0, 0xd73f1e11, ++ 0xabfa73a6, 0xddf316bf, 0x47f72a59, 0xd397bd58, 0xb795ab61, 0x71361d0f, ++ 0xb88ab53a, 0x8fbc424a, 0xf7b78aee, 0xcfd8f979, 0x93ee1392, 0xfbf8b054, ++ 0xbc7cbc5b, 0x7ec2607d, 0x09a1952a, 0x5ef44fdb, 0x24fdb096, 0xe584c8df, ++ 0x4d8fe657, 0xf705cfd8, 0x7b5a428f, 0xbdf47a7e, 0x2ef29e86, 0xbbbe0ff8, ++ 0x5cedd041, 0xd3379f85, 0xbb886feb, 0xf9d3a5df, 0x6e7eb8c2, 0xb76c6adc, ++ 0xbfb8cb30, 0x7eee20b5, 0xc26542dc, 0x2ce3b107, 0xd7ac65dc, 0x8f2693f7, ++ 0x923df412, 0xfb2afc8d, 0xba3e7aa2, 0xe9d0134f, 0x29f78f4b, 0x46611f3c, ++ 0xc5c4a539, 0xd7913501, 0x7974f7f7, 0x3ef89117, 0xb3c8974c, 0x24af5e54, ++ 0x2a967909, 0xe8ae64e4, 0xf7f448af, 0x1f3e3cd3, 0x6b91d7d3, 0x53f277a8, ++ 0x457ef98d, 0xb11cfcd1, 0x5ae502ff, 0xe03b4c5a, 0xed8bcd56, 0x2ef7f3d6, ++ 0xac6cdeb0, 0x7a130d0f, 0x8e5312cd, 0x5247395b, 0x5a33bbf9, 0x8d27ef11, ++ 0xc8588bb7, 0xe377690f, 0x9fd5903a, 0x53ede22b, 0x22d0bb78, 0xf498579a, ++ 0x1c378e09, 0x21aaf5f3, 0x5e20adde, 0xc4a57be0, 0x03cac523, 0x4533888b, ++ 0xba11d2f1, 0xead6d60c, 0x2360f2e1, 0xe30903ca, 0x762c4525, 0xb7df591f, ++ 0xa2abf6eb, 0x19b8a95c, 0x9f9c7ff8, 0x8b76f091, 0xb88c2bf8, 0xca8fef02, ++ 0xae171e7e, 0x1bfa4660, 0xf0314f6f, 0xe462a559, 0x235e89f7, 0x19f24f9f, ++ 0xd7e41bf9, 0x3f61b32c, 0x90b37db0, 0xbe14e647, 0xc94fe80f, 0xbff8eaf9, ++ 0xbe657a50, 0xbd009e51, 0xd671c4ae, 0xd8a8c160, 0xda0b11f6, 0x9e6e8857, ++ 0x2f26cc46, 0xf2998ff1, 0xec341feb, 0x92ab5573, 0x6edee303, 0x1cd2fc0d, ++ 0x3b5aafda, 0x99619508, 0x40fb2149, 0xc413e9f8, 0xef016ed8, 0xc91d4ac3, ++ 0x98bb7bed, 0x8d90f184, 0xc2ba8b1e, 0xbb6fd007, 0xf5e50b3a, 0x33aa49c4, ++ 0x5955f005, 0xfa9ebf54, 0xcfb233f5, 0x9f6e355b, 0x7bf2746e, 0x3cc68a2b, ++ 0xec3d2073, 0xa8ce2995, 0x9f497d49, 0x27aafdb9, 0xfde88fd6, 0xbddf4a9d, ++ 0xfb20ea5e, 0x32abbc70, 0x7351dfa1, 0x6e418e79, 0xf5209598, 0x92ab0bfb, ++ 0xc6d17689, 0x820adbca, 0xb14ba694, 0xa4b3bbdf, 0x1eb5e784, 0x7446dcbc, ++ 0xffa9695f, 0xdb8051f3, 0xe289bf06, 0xe3fc1bd4, 0xabe60b24, 0xddc5c519, ++ 0xd20f8325, 0xee820a3b, 0x69f74165, 0x3e238efe, 0x9996638c, 0x9776ac54, ++ 0xb7027df1, 0xf9e127df, 0x6e2aeee4, 0xe4b3b84b, 0xf7ac3515, 0x46d5a9f8, ++ 0x4b51b67d, 0xc7efee7c, 0xdd685b97, 0x525db21b, 0x52cfce1e, 0xe5c50b7f, ++ 0xf1ec5db2, 0x74bce89c, 0x6b0bfcfd, 0x23c2017d, 0xb848acd9, 0xf3f7e91f, ++ 0x2b32eef6, 0x06e76bbd, 0x92bcc436, 0x803b0ae5, 0xae6427fe, 0xb7778862, ++ 0x7f408d8f, 0xb2b5a1c2, 0x07880539, 0xfc5e218b, 0xa4ea7f0b, 0x2adda06b, ++ 0xaca78f27, 0xe10aac62, 0xa54b587a, 0x3b4f4ef8, 0x389bfb4f, 0xd1d9d929, ++ 0xc2017667, 0xf4e4e823, 0xa9784a92, 0x9d6c77f6, 0x6b57e303, 0x7b45de8c, ++ 0x95066fb9, 0x6607f78f, 0x363d3cd2, 0xbe749e7d, 0x6669afd6, 0xf654738c, ++ 0xfef79cb5, 0x4a92ab43, 0x7f46d476, 0x7e8894aa, 0x86edb8f4, 0x1dbce951, ++ 0x0fd63bcc, 0xf88cf875, 0x973cbf28, 0xf28ec3e8, 0xfed6e301, 0xebdbd100, ++ 0xc6154096, 0xb52f5e95, 0x5ebcbd10, 0xce3fe7ca, 0x5af9d0af, 0x525b9977, ++ 0xe42fbaf8, 0xbf979d3f, 0x858eb5cb, 0xcff28f08, 0x81a35092, 0x632ede9f, ++ 0x067f67fe, 0x55f8c2ba, 0xb9ef5f35, 0xebfb77fa, 0xb0f51f69, 0x3c212d37, ++ 0x810cfc7a, 0x87f2f8c7, 0x87fe172e, 0xdf1965f3, 0x24f90c2d, 0xfedc33f2, ++ 0x4029f1f6, 0xd707e307, 0xaf20bbd0, 0x4cd47e97, 0xfd78c3f5, 0xbbadd778, ++ 0xb35a9e91, 0x77d8b0fa, 0xadf4f4d3, 0x3dae1c51, 0x7ce345fa, 0x49afe63c, ++ 0xba368f24, 0x0729614c, 0xee066553, 0x1d4a851f, 0x58dd4f14, 0x24235569, ++ 0xb8d1e69f, 0xf4c2678a, 0xc97d201b, 0x9aa3f7cf, 0x6f49b303, 0x5750d78c, ++ 0xa69cffc1, 0xcc8f48c7, 0xcf72499f, 0x66aeec2d, 0xd70738e7, 0xac7b4663, ++ 0xc4745fd5, 0xd6b5df07, 0xcdac549b, 0xe7738d72, 0x5fb87a11, 0x76f19031, ++ 0x95fd8503, 0x9e8567fc, 0x8c6acc99, 0x68d727df, 0x972154bc, 0x0ae165dd, ++ 0x84335174, 0x6f9ee2bd, 0x8f54b3a4, 0x99e1876e, 0xe257687d, 0xf8e30c78, ++ 0x7ec6999e, 0xa7ee1553, 0x3b8dcbc4, 0x5fec4f2f, 0xd759fae8, 0x3625adc7, ++ 0x1f3af392, 0x2e70fcea, 0x47dfd0ba, 0x17f84379, 0xf890ad01, 0x2ff098ef, ++ 0xa5ef14de, 0xc5fe171c, 0x57f792a6, 0x9fdea1a6, 0xf39f68c9, 0xfc6fe12d, ++ 0xbf1bf84e, 0x08637f47, 0x20ed11ca, 0x2bafc5ca, 0x25463bb7, 0xfb965d11, ++ 0x18478e8e, 0xea3fc98f, 0x144bb58c, 0x30aaafdd, 0x97a41599, 0x89954906, ++ 0x152bbb6e, 0xa959d414, 0xed050464, 0x12b0c3ee, 0x567c43b0, 0x9e95a437, ++ 0x3e226b42, 0x87fae089, 0x17653fa0, 0xf857947e, 0xafdd7c51, 0x24be758a, ++ 0xedd0e7de, 0x15d7905b, 0xc1ba5fb8, 0xa727bc62, 0x2cf951a7, 0x779086e4, ++ 0x199bb213, 0x208d8fea, 0xc792258f, 0xb23b5e5c, 0xea9ec98a, 0x7f9ce7cd, ++ 0x9e005836, 0x92cf0405, 0x19cff284, 0xf00902d0, 0x79cbbbfd, 0x238374fc, ++ 0xc0197330, 0x2325436b, 0xc85e36b9, 0xdd179869, 0xf56b71b3, 0x14cf908b, ++ 0x1bd46be0, 0x1d302d7e, 0x2cfe0fe3, 0x2e8bf117, 0x9e9c599f, 0x9da725ec, ++ 0xffdf14a9, 0xddb4e4a6, 0x9c21aad3, 0xc399f2a2, 0xed33e40b, 0xf25b7fef, ++ 0xe3e33479, 0x14ccfe8e, 0xf5f6ff46, 0xe0af51d2, 0xb7215f3b, 0xbbec1d49, ++ 0x2b341cb0, 0x5cd75e5c, 0x2a7e88ce, 0xca3e6765, 0x24a59bd1, 0xbe18e515, ++ 0xbff08761, 0x6e7e06f9, 0x77f0bfa1, 0x36dee2bc, 0xed03ac70, 0xe05dd1f6, ++ 0x8dc8c623, 0xd9d99fb1, 0x557818dc, 0x3f21b730, 0x68699ede, 0x18e4a95f, ++ 0x877a27ea, 0xf927ea19, 0x2bf90d0a, 0xda1947f3, 0x0c2b514f, 0x26caabf9, ++ 0x68d7da19, 0xc6bc8635, 0xf4ff7a14, 0x41aed340, 0x1c60b07f, 0x1fd06da3, ++ 0x5786f706, 0xd3d0edb9, 0xdcb4a03e, 0xdebbefe7, 0x9e5bfc0c, 0x1ce6e872, ++ 0xfcf25fc8, 0x60cdebe6, 0x3ff79737, 0xb00e49f4, 0x0ff3c160, 0x1ceffaf0, ++ 0xf21724fa, 0xc2df9fc3, 0xc180afeb, 0xfd7581fa, 0x87d783fc, 0xcc7fce00, ++ 0x015e1609, 0xb3f6be70, 0x8e5197fa, 0xd5c57aff, 0xf8c8e437, 0x764d5dfe, ++ 0x97e7cc3e, 0x5821c139, 0xf67d2d3f, 0xfd8014aa, 0xe9ea2fd8, 0xaf77e19e, ++ 0x9e75dfe0, 0x767aefe5, 0x78efe59e, 0xc44231e2, 0x314dd7db, 0x68fa8a9e, ++ 0x39cd071c, 0x34957ddf, 0xc6007efe, 0xe60ee67d, 0x314c1f71, 0xc62983ee, ++ 0xb8c5307d, 0x8f0b5ccf, 0x718a60fb, 0xb8c72c1f, 0x35afa60f, 0xd1be9469, ++ 0x7b694554, 0x9ed28053, 0xa84fc97b, 0xc899162d, 0x45c56bfd, 0xaad0e57f, ++ 0x0973a0af, 0x9dd373c6, 0x901fae96, 0x7ccb3ebe, 0xeb80bef4, 0x96fd0fb8, ++ 0xd13b52e6, 0xeed5d4b9, 0x797d43b3, 0x9f37cf09, 0x3ca1f76d, 0x53ee3cc4, ++ 0x0adbba77, 0x2f37ae51, 0x4f78aa76, 0x246cf9bb, 0xbca4f913, 0x79e2aade, ++ 0x57577f14, 0xd3a5f12d, 0xf23b43ea, 0x8bf0eba0, 0xaf3a3c62, 0xa32cf3bc, ++ 0x1d3ae9f7, 0x8c453eed, 0xb8c0fd83, 0xcb7fa839, 0xbbd3b16f, 0xeb67cd7a, ++ 0x333f5197, 0x4ae33d9d, 0xcfdae371, 0x2978ee3f, 0x6ebcdc66, 0x1f387718, ++ 0x371867d7, 0x42b9e322, 0x39464fe8, 0xbd56e9d7, 0xbcf5a728, 0xff21eb1f, ++ 0x1c8585a0, 0x22f7a8a9, 0x3c4dea32, 0xd70765b6, 0xa1c4033a, 0x308d8c83, ++ 0x476813c9, 0xbb3b04fb, 0x34cf3af9, 0x7e426e45, 0x68778bf2, 0xaefe56fd, ++ 0xa9253302, 0x29515fb8, 0x3fb8717f, 0x97ef97e4, 0xfbce510a, 0xc86d816d, ++ 0x5ccc4b8f, 0x838f30de, 0xe665d7de, 0x823f05f6, 0xfbd2c776, 0x5620f7ab, ++ 0xbcb2cfbd, 0x697ef862, 0x89fa0155, 0x13bcf0c7, 0x3936777c, 0xe3f901b8, ++ 0x3d7a829a, 0x78fd405e, 0x40ecfaab, 0x85f3be3f, 0x47c8a5a1, 0xcf7cdb57, ++ 0x1ec58780, 0xe255fe78, 0x7c53abcf, 0xf98292a5, 0xabdfe276, 0xe0cf7c33, ++ 0xf4252c11, 0xccfef5ea, 0x405ee07f, 0x7b4664b5, 0x8a98916c, 0x8edc14d7, ++ 0xf55c5bf3, 0xafcf95b1, 0xf6fe8acb, 0x08f85713, 0x310f7d7e, 0x6bb9877a, ++ 0x03bc2b92, 0x56919be6, 0x33fb885f, 0xef47c0ac, 0x74b00e5f, 0x3bfc2325, ++ 0x2defe0bf, 0xa9e4cb40, 0x3f2bfb31, 0x7c272038, 0x39416187, 0xe697a7b7, ++ 0x1e23d739, 0x76ed7896, 0x9d9c0f4a, 0xe6e19b40, 0x479e1e40, 0x566cacd5, ++ 0x5d7d3d22, 0x39d3d739, 0xc724adab, 0x94c27448, 0xe7a624b5, 0xd2f40c43, ++ 0xe0a0dbf6, 0xe00f5e72, 0x26c1d664, 0xa8f33f91, 0xaf686cdf, 0x3d68fb61, ++ 0xfa7c10d3, 0xe2b9bff7, 0xe65747dd, 0x5e90f189, 0xde30b1e6, 0x3bd78d7f, ++ 0xa353a3b9, 0xcf0057e7, 0xdb1c7a8f, 0x3279cf11, 0x9481a7df, 0xd35fb829, ++ 0xfa83c607, 0x84773ffe, 0x769e819b, 0xe73d383a, 0xd3ba7899, 0x935bdbc4, ++ 0xfa97bbf8, 0xa315ed7b, 0x4bcb6783, 0xf5089fa9, 0xac29ef23, 0xdb6a2277, ++ 0x7e3c79c4, 0x976f500e, 0x84907a05, 0x086bb995, 0x365cabe2, 0x8ae78425, ++ 0xa2bf8af2, 0x14d33a7c, 0xe8c7ef62, 0x927d339b, 0xb7f1621b, 0xc677bf04, ++ 0xbe8e377e, 0xdc5fbfd3, 0x4fbd9e30, 0xa211069b, 0x2679c5a3, 0x25f8fd0d, ++ 0xa2497b32, 0xbd3b5af8, 0x777fa5c3, 0x8e2de41c, 0x5fc826f7, 0xb902df4c, ++ 0xed05befb, 0xfe94e9e4, 0xe54829be, 0x53e69a27, 0x4f54d1da, 0x3536efe5, ++ 0x75ed7a50, 0x9fe412ae, 0xb056fba5, 0x7de863f7, 0xd8259b71, 0x5e3f9311, ++ 0x728e9891, 0x5f008e90, 0xd71273c7, 0x8fd7ae5f, 0xbcecf8e1, 0x00979f81, ++ 0xa4a95cba, 0xe8eedb9e, 0xcc41ef14, 0xd3a224d4, 0xef9e4cce, 0xbca16e5f, ++ 0xf15b6266, 0x4f7899fb, 0x35cffb1a, 0x2d7ac7cd, 0x7c7bf795, 0xb1de8988, ++ 0x322bf936, 0x3a5a8f11, 0xf3451794, 0xf5e12fc7, 0xae5e3f5a, 0x3faf57cf, ++ 0x73f0ae5b, 0x9def0270, 0xa0165de2, 0x6f5fea77, 0x3e38e0ff, 0xe1f6f8bf, ++ 0x97f1c4bc, 0x4b7c137f, 0xe8fe817c, 0xa57f7e3c, 0xf8962f87, 0x3a742f88, ++ 0x772fe9d4, 0x3cd7e734, 0x3ef3a09b, 0x7f6afefc, 0x5df085d4, 0xed070cff, ++ 0x345c0257, 0x29de1fdc, 0xe7897e09, 0xce514807, 0xf3a0fceb, 0xfdef4e81, ++ 0x6a6c20f1, 0xe3a31d74, 0xc74f55e8, 0xb775f397, 0x256ebba7, 0x28b01ebc, ++ 0x6346b7a8, 0x65e71ca0, 0x3ae37eea, 0x9774cfe4, 0x95fb630f, 0x89f59c6b, ++ 0xfaffd8e4, 0xcba1e147, 0xa3c07385, 0x3cac1c17, 0x2070aafd, 0x1c728739, ++ 0xdc8137e9, 0xcbae5f9a, 0x2bbf4e2d, 0xd8d9b5ca, 0x30e4a74f, 0xe9df63a3, ++ 0xc8aefc48, 0x43af8d4c, 0x345ca3a7, 0xff62fbfc, 0x38ce74ed, 0xebe9ee5e, ++ 0x8de759e9, 0x5e5fe48c, 0xc78f2f12, 0x18aebeb3, 0xde50d7f9, 0xc64f0a37, ++ 0x7e81fec0, 0xe93916b2, 0x72d9c8fe, 0xfb3ab7ae, 0x91bb507e, 0x632fd745, ++ 0x88f77c39, 0xd07a2649, 0xb94f4bf5, 0x29aacf24, 0x861de830, 0x0bd750f6, ++ 0x88f7e236, 0x29ffcd89, 0xf638f77c, 0xf39fb319, 0xdd43d0ac, 0x784d4bd3, ++ 0x5fcce1be, 0xd23ef49c, 0x275d7e99, 0xb339ded0, 0x17e742d5, 0x04943ef0, ++ 0xf406f77a, 0xd3c8609d, 0x81833fe8, 0xa7f447f1, 0xb6bb4287, 0xded027b3, ++ 0x4c90fa5a, 0x87e4ef47, 0xe916bd3e, 0x160bde69, 0xadafec85, 0x3d208e9b, ++ 0xf92bda9e, 0xb3392ed0, 0xed0f9617, 0x71166f17, 0xfb63c84b, 0x61c9771b, ++ 0x19d5c49f, 0xde3179e9, 0xb9258efb, 0x7f8f9768, 0xc23356e8, 0x8976de7d, ++ 0x17bfb9e1, 0x387cdeb7, 0xb6a7f213, 0x9a2077f1, 0x703bc91d, 0xf5e413fe, ++ 0x7e507ed6, 0xbe5e76d3, 0x23e139c8, 0xd3719f3c, 0x4ee28c93, 0x9171ed37, ++ 0xb36f3c5f, 0x188edde5, 0x36fe63bb, 0x6b017e63, 0x6f4977a3, 0x5f2c69da, ++ 0x31f21bb4, 0xb94f79f2, 0x8c3587b8, 0x66dc5215, 0xe84b8f33, 0x7db7bdf2, ++ 0x69bc221d, 0x66dcb9cb, 0xf4e9cfec, 0x7c2f0bfb, 0x275de03a, 0xfc88d7cf, ++ 0xf8ff903b, 0x1d178e53, 0xd8c44b2e, 0x92b2671f, 0x92e75836, 0xfe0a1c17, ++ 0xfd92c28e, 0xc03325ef, 0x8ea4d2ff, 0x3eff12ef, 0xef682b27, 0x8727ddad, ++ 0x0f8bbe10, 0xf3c31e38, 0x399e4b00, 0xc4f8a56a, 0xaf6465de, 0xd5a1644c, ++ 0x4c4747e8, 0x744ed626, 0x3b256ed4, 0x879aeb46, 0xefd99cfd, 0x580ed050, ++ 0x0e6fdcf2, 0x67f9875f, 0x8eef8624, 0x20eec99e, 0x10f7993a, 0x7fc7e09d, ++ 0xaeefb8d5, 0x788c89d3, 0xa5b73c45, 0x46ef3c50, 0x19e23bc4, 0x0af78ef0, ++ 0x842c87e5, 0xca4f79f7, 0xb5bcdf54, 0x4fed8ad9, 0x757e3985, 0x1b904fbc, ++ 0x3d37cf09, 0xfe39f1ca, 0xe0b7c7a1, 0x9ef3c23b, 0xfe3d90b4, 0x8fd77c22, ++ 0x03a0677f, 0xffbc0beb, 0xf7f38f33, 0x60e87b2a, 0x0e87adbf, 0xa2179e70, ++ 0xd253e003, 0x83a217fb, 0xef8ce535, 0x9c5fc843, 0x70ed047a, 0x2de29597, ++ 0xe846effa, 0x77d113bf, 0xf197f1e1, 0xdec1e17d, 0xaeeec9a7, 0xe2d3fd4d, ++ 0x9f7e8c65, 0xb728afe4, 0x7d7a4c4e, 0xd8efa215, 0xd2171fe4, 0xc74b0d3d, ++ 0xfc520fe3, 0x3c8a8fa1, 0xb35399dc, 0xc39f7f0d, 0x80f9fa9f, 0xa58eb03d, ++ 0x7429b33f, 0xa9b470e6, 0x73c37ec7, 0xc7198b9f, 0xce9de003, 0x603e2e63, ++ 0xf63af7e3, 0x7eb16a56, 0xa7266768, 0x576b4af3, 0x188dc62d, 0x48e387f4, ++ 0x174ff71a, 0xdfbfe01e, 0x0b93fba0, 0xd871dff5, 0x4f1f7c6d, 0x76a75e52, ++ 0x1e3cd1be, 0xb4632832, 0xe6f2ed0f, 0x34982c19, 0x82fa7ce8, 0x5479f79f, ++ 0xb4e745f8, 0x37a1cf27, 0x85923b74, 0x12c1dee2, 0x1e46eb72, 0xdf2f61fb, ++ 0xe319aaf6, 0x253b9d9a, 0x0382cbc2, 0xb83caf20, 0xc8316e5f, 0xfda2259d, ++ 0xc97f4807, 0xfd6ecef8, 0x563926b3, 0x8fdefcbe, 0x927a2cfd, 0xe904b3f7, ++ 0x91bee28a, 0xdfd0492d, 0xed0b36e9, 0x84c4de73, 0x52e7d9bc, 0x2f581ef1, ++ 0xfb73b2f9, 0xe3df346a, 0xd8216ae9, 0x7888b899, 0xd7b25afa, 0xdd1b4ed8, ++ 0xc52e7723, 0x8d579ffb, 0x40fee267, 0x0a9dc448, 0xecdfd052, 0xe414be66, ++ 0x287d1eef, 0x4398e319, 0xc7cb02b7, 0x6c2c3bf4, 0x22507be7, 0x8a5d9dff, ++ 0x9b697f21, 0xb2fed0d7, 0x7d433e7d, 0x50df2461, 0x35447c5f, 0xcbdb4be4, ++ 0xbe47ed0c, 0xa3f219a5, 0xed0caa3a, 0x6030f8af, 0xc01777c8, 0x0fb3ce7a, ++ 0x192bd132, 0x39f24fda, 0x995ffd0c, 0xbbe436ef, 0xc23e029d, 0xdfedd4ce, ++ 0x7db9a325, 0xf0ea9f14, 0xc71aa29d, 0xabf6fdd1, 0xd5e38cca, 0x2ef1c668, ++ 0x8ef82f16, 0xd84419bb, 0x98b7d02e, 0x7804d53e, 0x77623f00, 0x3ff29793, ++ 0xda51f269, 0xe54f94d6, 0x29526d3f, 0x8ca9b7bf, 0x5f82cff2, 0xe07df982, ++ 0x1cfa60a7, 0x7e5827f8, 0x161df821, 0xe3111ee3, 0xfdc62abe, 0x4d7a70ba, ++ 0xe886f7f4, 0xc793df0f, 0x5c5faf54, 0x0cfa6a55, 0x8fd4bfed, 0xd13f18ac, ++ 0xc04c7796, 0x2bd74638, 0x7c01db32, 0x23e182c3, 0x6fd41e4d, 0x8c0f7469, ++ 0x697eba05, 0x8333fcc2, 0xb9e73c14, 0xdeafdf76, 0x7b33fac0, 0x1cd78a65, ++ 0x325ef7da, 0xb3fa73f6, 0x4b71b43e, 0x8bf2117a, 0x7f28973e, 0x3ee3d40f, ++ 0xb23da4e7, 0x8dbb1f78, 0x3ce9ddf4, 0xe2b61f3d, 0xf760653e, 0x7bff7a1e, ++ 0x543daee1, 0xb5f00aff, 0x76d77ea1, 0xed82bd43, 0x0e685d21, 0x8fe15c53, ++ 0x22fef4fb, 0x9e517ed4, 0xfeb8f744, 0xd5c5ebb8, 0xde3ea057, 0xfb869753, ++ 0x1f770b5f, 0x1e739f4d, 0xecfc7c7c, 0x0f500b8f, 0x8b2fde2c, 0xbfbcb373, ++ 0x222dfbc5, 0x28bfe7cf, 0x5484cf6f, 0x25bb1c54, 0x9a7ebbba, 0xd5b9d2b5, ++ 0x5f1efb85, 0x61767284, 0x8a1675fe, 0x22c9b57f, 0x5fdfc1de, 0x6e30a45b, ++ 0x927db5d7, 0x3fc5fb8c, 0xbbf97b6f, 0xc0f7e21a, 0xa0af748b, 0xf06caf73, ++ 0xcd1cdea7, 0x4737e5ed, 0xf4efff73, 0xf19317de, 0xb6daf07e, 0xcddc3917, ++ 0x21ff5a11, 0x9484ef91, 0xa64fbde0, 0x4cf82ff5, 0xfde83c26, 0x05c7049d, ++ 0x6fb49bfb, 0x75d70bb0, 0xf78f8dac, 0x7a0fa811, 0x6eaf2847, 0x55ffce2e, ++ 0x99528cef, 0xfbd393ef, 0x5c979de4, 0xd9ca38f9, 0x96b26d85, 0xabfbdfc8, ++ 0xd8b0f7e8, 0xef2579b7, 0x00fdc3e9, 0xa556afee, 0xf79ec615, 0x33f844ff, ++ 0x3cc1ac13, 0x9cc723d4, 0x9c3dfa3e, 0xb906abbb, 0x3087bf10, 0xc7aaf2c5, ++ 0xa6e95f68, 0x63bc7cbd, 0xd2327b4a, 0xc5bdb1dd, 0x3f662872, 0x371c63e7, ++ 0x78a3fe86, 0xe69e110b, 0x3ed3b787, 0xbc7f147a, 0x0ad1a3fc, 0x7c357fb5, ++ 0xb3b45af4, 0x21f7e58e, 0x95b0e4fb, 0x70bd7f91, 0x8f93b737, 0x3dbfe81d, ++ 0x23f63f76, 0xf99d6fc1, 0x99c61cfc, 0xeed1167d, 0xa199c7ba, 0x4fdff71d, ++ 0x47ce34ef, 0x01b3bf09, 0x8f45f3ed, 0xe156f4ca, 0x3a7d4b22, 0x6d83ffae, ++ 0x17cdf9c6, 0x89645e70, 0xd0c7a7a4, 0x3dfda2eb, 0x3a24e37c, 0x89f3afdf, ++ 0xe3a9f08f, 0xccbe58f1, 0xd1b5e5e7, 0x7b45c37d, 0xeeba271e, 0xf1e25f1d, ++ 0xdbb7fedb, 0x5d2f8a55, 0xedd69fc0, 0x8b7f1886, 0xa968ffa1, 0xf78a541a, ++ 0xe0fb7587, 0xe0dad1d6, 0x0fd17d31, 0x799f900b, 0x0b7d818c, 0xfb462e63, ++ 0xf2e5053a, 0xb8e0b7ef, 0x742d7bdd, 0x7db1616e, 0x007f4dff, 0x8156ed3a, ++ 0xddde6051, 0x143ef8db, 0x9da323ee, 0xb9d84f3b, 0x2382f81f, 0xc5835df0, ++ 0xbeb44c2b, 0xb0e5bb45, 0x51e30723, 0xbc7dee5c, 0xa42ae727, 0x644745d7, ++ 0xf1a3fd05, 0x95f7396d, 0x277e9097, 0x1b49757b, 0xec9793b7, 0xd62ec892, ++ 0xc2c590ed, 0xec25390e, 0xba2b53e0, 0x82fc7db8, 0xbb4136c4, 0x8f604975, ++ 0x1717bcc0, 0x76bb264c, 0x757ebcb1, 0x0f9e1f7f, 0x0b0dda34, 0x77a41c0e, ++ 0x31cec040, 0x65dc2f94, 0x336e2fcc, 0x717f75e6, 0x2fb118ca, 0x430d8c3d, ++ 0x2e52a6ff, 0x987e40cf, 0x55e3863d, 0xbe6e77f7, 0xbe40cd54, 0x4df66b5f, ++ 0x0812e3d6, 0x3c2fa5af, 0x1de700bd, 0x92a4945e, 0x3cf0d1ff, 0xcff3b5c1, ++ 0xc4e9afdc, 0x67e438bd, 0xb9dbe1c6, 0x52f9d38f, 0x8bc6148b, 0x57514bb2, ++ 0x29767f60, 0xcee302bc, 0x9264eea1, 0xc3bce24f, 0x7fdc19f2, 0xed1e7745, ++ 0x4463a1c2, 0xaf4e2adc, 0xc877318e, 0x713918ee, 0x9a5c98fb, 0xcfcadfbf, ++ 0x52ecdf6b, 0xb40dbf49, 0xa07d7b73, 0x03ebdb9d, 0xe82b5dcd, 0x49fb24f7, ++ 0xf8639f7c, 0xb07fb473, 0xf693896e, 0x9d6f2417, 0xaeb1e119, 0x6f9d1d5f, ++ 0xe5b4a819, 0xe7a75fa3, 0x105f58fd, 0x38260fb5, 0x671c6683, 0xf624a667, ++ 0xad3eb811, 0x77162b31, 0x6c657e8c, 0xe7d7b505, 0xf1bfbfa7, 0x029f9f4f, ++ 0xe74673f3, 0xc14ef807, 0x51293fef, 0x50186ec9, 0xe49c3a03, 0x7635bd42, ++ 0xd034f73f, 0x45701fbb, 0xdd022b6f, 0x9076da2c, 0xacc5cbfc, 0x377e357d, ++ 0x63af9921, 0x5fbf9582, 0xa789213a, 0xf2e18c8f, 0x4d22f7eb, 0xec192b1b, ++ 0xd58fefd8, 0xfc818db6, 0x1f81b1a8, 0xd6bb218e, 0x9377f0c9, 0x932ebf96, ++ 0xf72f175f, 0xe9e89ca1, 0x9443e013, 0x4bd7d77f, 0x73825e4a, 0x51794b1d, ++ 0x7c2d1f0f, 0x13e231fd, 0x7ceefcfd, 0xa4bbc4c6, 0x862f250e, 0xbf22962f, ++ 0x801fbda1, 0x9c6046ff, 0xaf9bff80, 0x24f3a02c, 0x057486c1, 0xf2a5bafd, ++ 0xf897da69, 0x74b77caa, 0x711f319f, 0xb88ffa70, 0x7e93f224, 0xeec7a63e, ++ 0x201c7e27, 0x907b63f8, 0xf6ca6eff, 0x9e3ccc2f, 0xf8a25337, 0x6c2834dd, ++ 0xc4931548, 0xe82bf376, 0xc634e45e, 0xcdb3a88f, 0x82bfbe1e, 0xa99eb095, ++ 0xccd3dd62, 0x57288391, 0xe5b4b65e, 0xe5e93c60, 0xfb1576c5, 0x377e219f, ++ 0xbdf8a66d, 0x967de3b4, 0xcea1133c, 0x7748d943, 0x28da09bf, 0xe57db59e, ++ 0x71177a0e, 0xe0a95b38, 0x6280227e, 0x17c597d7, 0xbfa8efbf, 0x72f60323, ++ 0xe027d206, 0xffe204ff, 0xb78dc043, 0x0bf7f7a8, 0xfd0cfd7f, 0x6e9fc6ee, ++ 0xbc5afa79, 0xeb13751f, 0xa6ea3f22, 0x3bf415fa, 0xed4e401e, 0x78a223f9, ++ 0xe3aef1d5, 0x3eaf07ad, 0xaf162ff8, 0x84d47e1e, 0x486ba7c9, 0xa650fd2e, ++ 0xc21750f3, 0xb1f70eab, 0xee373f02, 0x1e2bf2e7, 0xbe1e3adf, 0x374bbf87, ++ 0x36eef488, 0x91b313c2, 0x87a78cbc, 0x080be10b, 0x8d562673, 0x0fc8d8f7, ++ 0xf2e26fed, 0x893cffb4, 0xb1d795e2, 0x901d0be0, 0xf7e7db5e, 0x954f7e16, ++ 0xc0a66de3, 0x78586fdb, 0xfeffbe0a, 0xfbede14d, 0x63e90363, 0x3c6df013, ++ 0x2f8b9e9f, 0xffd4f917, 0x9865f5d2, 0x188fefd1, 0x5f8e39f9, 0xc2a8f07b, ++ 0x0c78317f, 0x5f132436, 0xde5be0f6, 0x117a717d, 0xd638c0ff, 0xef8c293e, ++ 0x5f905fde, 0xe0085825, 0x51ac64b3, 0xd378ea6f, 0xb8ae72e1, 0xf22cdbe0, ++ 0xbed122b2, 0xdbe3e70a, 0x4d1f746c, 0xf7d157df, 0x390aa64f, 0x0dbe9f19, ++ 0x57ee12f6, 0x8c7f93dd, 0x6e3945de, 0xfbe1fbd5, 0x68af6fbf, 0xddf7c6cf, ++ 0xe9e0aedf, 0xddff2b71, 0x25af3d51, 0xdbe4b8f1, 0xc210b699, 0xd8696de9, ++ 0x6f33d438, 0x977fb74b, 0x3eac33e7, 0x18c8cfcc, 0x8ecdf787, 0xe638f45b, ++ 0x876e42dd, 0x8c663cf9, 0x893b53f4, 0xf0f084bd, 0xe3402c49, 0x156a5248, ++ 0x5bede7cc, 0xfee11707, 0xc6becf44, 0x57876e58, 0xa07ae58c, 0x877fee27, ++ 0x59ff7144, 0x7f709aa8, 0x5583dc62, 0xe27e50b9, 0xb48541ce, 0x38dcba6f, ++ 0x1cfdea3e, 0xa46e978a, 0xd67cc67e, 0xd18ba965, 0xd6fa3d6f, 0xcf97967f, ++ 0x9d21352d, 0xd43817cc, 0xff718752, 0x05283c3c, 0xcfae97f5, 0xed3c8fba, ++ 0x7ee78d8c, 0x3ddfe224, 0x0ef761f9, 0x0787d588, 0x0437589f, 0x0d6f99fb, ++ 0xfca1570d, 0x0c8fedc3, 0xfe65bb40, 0x90866b13, 0xdac4fd3d, 0xcd17e821, ++ 0x886eb1df, 0x413ef946, 0x7ccccbf2, 0xf7fa7fdd, 0x507e7451, 0xc155cfef, ++ 0xf6998afd, 0xb7a89583, 0xe3e77f27, 0x307fb855, 0xe2894ef8, 0xf6b3d77f, ++ 0x6b67a855, 0xb15f39f3, 0xff9276cd, 0xd7ed1fd0, 0x0a6c3e3e, 0x6af687bd, ++ 0xb9967bfe, 0x7c61eed0, 0xbe2fb588, 0x8f5e1dbf, 0x16b2c4ef, 0xd17ee289, ++ 0xffb4d9f6, 0xb252b75b, 0xd75313e2, 0x9ee9bbd7, 0xdd63c3e2, 0x2dd9c704, ++ 0xbcb18785, 0x4f9791b6, 0x1ef785b6, 0xb41e7ec3, 0x904f39d2, 0xf7b1b943, ++ 0x6b1e1fdf, 0xae6eefe5, 0xd08fc897, 0x25bc19c7, 0x3aec7b7d, 0x67f8161f, ++ 0x7c93bfa1, 0xa5e04abb, 0x4be8f1ba, 0xe94a7bf8, 0xe5186096, 0x9c0f1bc9, ++ 0x8c308bca, 0xe7447e83, 0x835b070e, 0x75c02f0f, 0x9c51b0ef, 0x7f7864b4, ++ 0x17da0339, 0x09b152dd, 0x758d59d3, 0x39402f0f, 0xc85ed5bc, 0xf9f2578f, ++ 0x1354972d, 0xb717e9ca, 0xc2366f7f, 0xf807c3ed, 0xdf2f86ef, 0x2583343e, ++ 0xfd3d53e0, 0x371fe011, 0xb26c9e34, 0x26e3fa53, 0x84d5e185, 0x52f26f7f, ++ 0x7c9a3ffe, 0x9ce9b294, 0xcfdff4be, 0xc57f573d, 0x3e61f59f, 0x5a4b8bb0, ++ 0x8c57cc1c, 0xe7b4a4e7, 0x06bc02c7, 0xc778b25f, 0x3c2eb15a, 0xca18567f, ++ 0x28708f19, 0x7e8cbb59, 0xa847eb47, 0xbf1e0060, 0x0032d63c, 0x8d8df585, ++ 0x7f00fcef, 0x6c7baf8f, 0xdefc25e0, 0xc52cedbe, 0xbfdc5e29, 0x3de116a6, ++ 0x973f077f, 0xc3fbafad, 0x3c648607, 0x57e5f18c, 0x5837142c, 0x1f9dedba, ++ 0xce7485ac, 0xdf8665fa, 0xf5d8bb5b, 0xb9f3121e, 0x0b9d5f10, 0xaf9d5f0e, ++ 0xfe200dd6, 0x557c01d9, 0x6af9f5f0, 0x820ae369, 0xfc0b579f, 0x43ebe909, ++ 0xf200684b, 0x46c387d3, 0x5e879d13, 0xbafe0890, 0x9f99ef1c, 0x5342ef58, ++ 0x9cf2fadb, 0x94ff1ca8, 0x0f7c1095, 0x0860ffee, 0xee9fcfda, 0x75de719b, ++ 0x8eeb0b3f, 0x9d78c50c, 0xfaf8d29d, 0x20e0d611, 0xe237d615, 0xffffef1c, ++ 0x18a4006f, 0x008000fe, 0x00000000, 0x00088b1f, 0x00000000, 0x5aa5ff00, ++ 0x559c500b, 0xffffbe96, 0x6e8683f7, 0x3cd00868, 0x0849d212, 0x93b048c1, ++ 0x24d1c640, 0x4863cd36, 0xb125d998, 0x24464dd6, 0x3678628d, 0x6cadd460, ++ 0x12345acd, 0x053a8359, 0x31f1ab2b, 0xf89224da, 0x0d1db320, 0x3da24491, ++ 0xa366c359, 0x44aa616b, 0xd52a6ab7, 0x9091d66a, 0x763e09a5, 0xe7ba89ac, ++ 0xd2dfff3b, 0x7667504d, 0x3ede3353, 0xb9ee71f7, 0x9df39ee7, 0x02cfcf73, ++ 0x8a442ca7, 0x86637fa0, 0x7fe08b4a, 0xcd10aa52, 0x11e14fea, 0x44909bc2, ++ 0x881488f4, 0xf87a27cd, 0x78ba1367, 0xf892fd6a, 0xf39d4628, 0xa3f736ad, ++ 0xe8568d5c, 0xd377f8ff, 0x80b6de5f, 0xf17072cf, 0xc4285109, 0x45903e4f, ++ 0x9f767720, 0x4563069f, 0x12df6220, 0xf3fb7083, 0x19f507e8, 0x3a98840a, ++ 0xbddfde9e, 0xfd1d6884, 0x35f4192f, 0x184f41fb, 0xc7e30fa8, 0x12c75f24, ++ 0x6eb2bd75, 0xc7139cf6, 0x799df327, 0xe5b79f57, 0xa08e64c4, 0x7fe1e6fe, ++ 0xf9f12cbc, 0xf2e84d37, 0xbffcfc7f, 0x1f99383b, 0x7d5f1334, 0xd6959d70, ++ 0xf982194f, 0x5e5b6a0e, 0xfb0b2a7b, 0x087aa5fc, 0x483c37f7, 0xe34b5907, ++ 0x9bbc8c52, 0x2e552ce4, 0x5ce1263d, 0x48c2f467, 0x7e396ae7, 0x3a39e8e0, ++ 0x9c48ccf7, 0x6885d843, 0x6ccac795, 0xf6dfc912, 0xe88da8e1, 0x82473499, ++ 0x9dfcccd5, 0x65fadbd0, 0xf4254762, 0xdace9ba7, 0x9b884ab2, 0xd8850f61, ++ 0x4fdb83b7, 0xafb085db, 0xb37f1f00, 0x3f22be20, 0xbf100c4e, 0xdc31ed8b, ++ 0x497bbd5f, 0x7ff51a57, 0x43594bea, 0xe56f16c7, 0x7a05a9ff, 0xce237a6e, ++ 0x9e812caa, 0xfee237a8, 0x4f873bbe, 0xfd08ce11, 0x271f3d35, 0x5af3119c, ++ 0xc6bff60d, 0x1567ad7e, 0x5afda5e1, 0xc5186e57, 0xe484e23e, 0xf0e74e58, ++ 0x219df9ec, 0x4ddf822d, 0xc766bd4e, 0xe6f72c3d, 0x2594fe37, 0x0dae28e8, ++ 0x449cdbce, 0xcc4c91c7, 0x27c12d2f, 0xba3cda49, 0x064d16ff, 0x8ea488f3, ++ 0xde3c2b97, 0x7488ac3a, 0xf8b349ac, 0xca39d396, 0x2c4e8f45, 0xbfc2be23, ++ 0xbaa0e05e, 0xa46fafe0, 0x94378af1, 0x0644ddb5, 0xd247a44c, 0x3bac596b, ++ 0x73e9177b, 0xbd34965c, 0xd7a00bfa, 0x394f9cb0, 0xbd739625, 0xdfb13922, ++ 0x6f9c7a74, 0xda6d753f, 0xbc82a9e6, 0x651b79e1, 0xa9f11e75, 0x4df6fb67, ++ 0x7f816fe7, 0xb7f3a606, 0xdde7665a, 0x9b5c46f2, 0x5fc2e30f, 0x3ec44b70, ++ 0xaf034e83, 0x215b6cff, 0x17eb49db, 0x0eb8af66, 0x31e572f6, 0x75ddf689, ++ 0x0245ec92, 0xcbef25ff, 0xe92f0e74, 0x493af719, 0x1234eaf7, 0x3a70b73b, ++ 0x52ab3fe1, 0xd69ff07c, 0x15d092c3, 0xfb8cbec0, 0x8b5e6863, 0x7b0a983e, ++ 0x9efc3bde, 0x3adcf601, 0xbec1aef4, 0xc8e9eb0a, 0x2313c87a, 0x56adbf43, ++ 0x1afb89fa, 0xadfef15e, 0x4673cfc4, 0xf7457151, 0x3fc041ae, 0x6bf63e68, ++ 0x0ca47a3a, 0x7408b374, 0x079b3ec1, 0x2666eda3, 0x9d609ecd, 0x9d066fc7, ++ 0xd8ff28f6, 0x8ff54fb4, 0xe6d1145b, 0x2772f337, 0x9a5371ec, 0x8a5bbfad, ++ 0x3af1275c, 0x80f932a7, 0x2d0ae48d, 0xb1121c95, 0xf77ac50a, 0x1c8fa158, ++ 0x8b403ac9, 0x54bfaf43, 0xc5f193b0, 0x9d337057, 0x7c10642f, 0xec1e9b1f, ++ 0xf21129d5, 0x9c511a6c, 0xac5087b8, 0xf7c63fa8, 0xfb885eee, 0xe5437c78, ++ 0x217f616f, 0x373bf4c3, 0x992196d2, 0x3eaf9bd6, 0x2aa36d87, 0x353259cf, ++ 0xee4d6fbe, 0x154ccc8a, 0xed8f84cf, 0xf7565468, 0x8a753727, 0x75ebb335, ++ 0x52faea45, 0xa416cf25, 0xc3925df1, 0x9f679d66, 0xf4907b70, 0xf4f74b5e, ++ 0xda37dd3c, 0xa2addb17, 0xb066f096, 0xdfe98d3d, 0xf5b9dbb6, 0xff72e7b7, ++ 0xa60eedcb, 0xcf5fb68f, 0x2776b1f4, 0xe5edc3d3, 0xaf689edc, 0x10b3fee4, ++ 0xa7fc06f5, 0x18bb07d9, 0xcc65af85, 0x7349e3d2, 0xf9e88ce8, 0x345249e3, ++ 0xfcf1219d, 0xcfb36771, 0x06d1744b, 0x764f86ab, 0x63e9254b, 0x5f3e3622, ++ 0x9b210824, 0xa677bfdd, 0x09f2ce80, 0x969f4f8a, 0xfe0c7a3f, 0xbdb49254, ++ 0x93367e0a, 0xa3c0146c, 0x8fee4505, 0x99ccef31, 0xc65eece2, 0x48c39349, ++ 0xcbfe3ef7, 0xefa0136b, 0x422bbfd0, 0x728b2da1, 0x2029eed7, 0xb12cc8ba, ++ 0x5c5e12fd, 0xb1714957, 0x4f893f15, 0x814d48f1, 0xeb07c54e, 0x6f7a0972, ++ 0xbb3ec5ae, 0x816b4dd2, 0x746d0fc3, 0xec23394f, 0x2ea32cb2, 0xe87d0ddb, ++ 0x34cbefed, 0x7a1ffbcf, 0xeef34031, 0xeca238b6, 0xa2c6cb7a, 0x536f902b, ++ 0x6b3db2ee, 0x0d9c9fc0, 0x3cee4778, 0x729cf908, 0xf8c9d49c, 0x0f01d765, ++ 0xec7668ae, 0x7f6c4bb2, 0x975d8301, 0xb103fc44, 0x5a5ec945, 0xf3ddaa37, ++ 0xcf9eed19, 0x36fcf76a, 0xfb5097f5, 0x1da3f50e, 0x97b47ea3, 0xd5fa6bd7, ++ 0xbf40e74d, 0x1a56713f, 0xd3df588a, 0x7a43a059, 0xb7f60db1, 0xe2a5fe19, ++ 0x86f2164e, 0x4f7ecd6c, 0xada87700, 0xa2d2a9bb, 0x9f33f3ae, 0xb269c426, ++ 0x8fac49c7, 0xbaf0cbb0, 0xdb82f5d9, 0x6f09d7ad, 0x55fef00c, 0x127a0f93, ++ 0x212f290b, 0x36abeb7a, 0x662523c6, 0xf205e572, 0x056badf3, 0xc578a8e3, ++ 0xb34bcea8, 0x484fc217, 0x94cfbc47, 0xc9eaf64f, 0x63493c3e, 0xc3884939, ++ 0xe9857f9a, 0x8c28df63, 0x44359edb, 0xa49afb53, 0x75b3cf9e, 0xeb11272c, ++ 0xfb0c9325, 0xc757ecf2, 0xe7fe69cf, 0xd3f1aa59, 0xfc6223ce, 0xd08fb859, ++ 0x6eb357c9, 0x1cdbba27, 0x7fe2a9d8, 0x5b718720, 0x02b67204, 0x79ff251f, ++ 0x72c210e1, 0xfba35f4a, 0x7fe1f429, 0x29e27406, 0x474b4aa3, 0xc7235bce, ++ 0x9259fc53, 0xa341b415, 0xe8933c8f, 0x2ff5a088, 0xe1b8c79f, 0x094d637e, ++ 0xdf4615d1, 0xcdd87699, 0x65f6a8bf, 0x09f43c3a, 0xdc74d6f4, 0xeb81f9c8, ++ 0x97a5d0f0, 0x2c879f11, 0x457cc00e, 0x77d612d1, 0x0f43f1e7, 0x8ea6dec3, ++ 0xba1fd9e8, 0xe67bdf07, 0x28cf3c57, 0x46156e60, 0x7da0817f, 0xb80d4f52, ++ 0xc744e975, 0xbd073ff9, 0x72c495c2, 0xfd502c54, 0x5295cf3a, 0x86de85e3, ++ 0xfc1dff0e, 0x784122af, 0x25e2b761, 0xd46247ba, 0x2535caf8, 0x29a7f282, ++ 0xf83558cb, 0x7468bcb7, 0x5f1b4ec0, 0xb7e0b9b1, 0x72968adb, 0xd9586adc, ++ 0x2b788593, 0xe0e1789f, 0xcf3192af, 0x6b6f2024, 0x35ef9a92, 0xeeebfd2a, ++ 0x703bfbe2, 0xfdc829f0, 0x27ec4982, 0x03c40d3e, 0x5c1c35fb, 0xd1d2f3ee, ++ 0xe3fafb5e, 0xa943dc6a, 0xf441f4f2, 0x499cfe7f, 0x19ce1e86, 0xe01b099c, ++ 0x8ef4e787, 0xe8d3ac01, 0xaa05f186, 0x32c1713c, 0x9ee4bfbe, 0xc6dbc42c, ++ 0x57ff7f05, 0xe942bb90, 0x9c49e679, 0x205190e7, 0x40bc4c3e, 0x1375a37a, ++ 0xb835fa03, 0x2c17a9e5, 0xa4cbd83a, 0x24fd53d4, 0xf3a80ff8, 0xac3d4d26, ++ 0x0ac0ef4f, 0x9e68fd81, 0x949e3c40, 0x27faa37a, 0xbbe50e06, 0x5f177f49, ++ 0x4773c8ac, 0x5fd86fd8, 0x46339f1a, 0x024645c5, 0xed46a5c2, 0x857ab0b7, ++ 0x836ee299, 0xf63c5e46, 0x6293d4c4, 0x41c5fd76, 0x3a40c07d, 0x3d8a306a, ++ 0xfeb34931, 0xb3f998d0, 0x51af9c72, 0xfe41cfee, 0x5836b0d2, 0x3098bf0d, ++ 0x9a349889, 0xb71696f7, 0x6c768f1a, 0x7dfc1e41, 0x716bf4f2, 0x35348be8, ++ 0x6c317d7e, 0xefa579f2, 0x6fbf438f, 0x97b7d617, 0xb5b7d2cf, 0x0f973919, ++ 0xe0cb7bf3, 0x5f20766f, 0xe3f1524d, 0x241fcd3c, 0x48b67b1c, 0xec768fcd, ++ 0x57df9e8e, 0x2dfdc494, 0xe20e6086, 0x6f7f985f, 0x82d71851, 0xb9abc039, ++ 0x96902aeb, 0x925e4700, 0x8f1a4718, 0xf12a1f4a, 0x67534a9a, 0xe318d9f5, ++ 0xf3f929f5, 0x3ada43df, 0xd7881eed, 0x57ea972a, 0xa726838d, 0xc534f889, ++ 0x2f91e306, 0xf1825b35, 0x4ea683c8, 0x76bf6228, 0xfe61c97d, 0xabf7674b, ++ 0xf7ea11e7, 0xf9a69deb, 0x08e3a3f6, 0xdf87579a, 0x6b970aa4, 0x3f57ef29, ++ 0x09fbc71c, 0xec1d706b, 0xe8e9feb6, 0x35a73875, 0x86a71fc2, 0x23baa40f, ++ 0x86a8cfe2, 0x43e92107, 0xd7d09bf6, 0x0ec1651f, 0x47b1651a, 0xa45ed522, ++ 0xa624a635, 0x7b4a8c45, 0x8df9644d, 0x61639a5f, 0x68bf173f, 0x929e3f66, ++ 0xf7738c82, 0xf8c65a9c, 0x320fa530, 0xaeb835ce, 0x4c7e01a9, 0x81ab0625, ++ 0x6eb8f75b, 0x83d3c750, 0xdf1a76d5, 0x8be31a0a, 0xf701e704, 0x9e32729f, ++ 0x6fd32854, 0x038a6e21, 0x24fc2b7a, 0x4d3aefac, 0x383c424f, 0x10efcede, ++ 0xa1f11dbd, 0x796925d3, 0xfcf66182, 0x4d3facca, 0xa3e1fb09, 0xb37acff0, ++ 0x7d478063, 0x0f232f83, 0xe8ea9edc, 0x37ad5fb6, 0x2672439e, 0x13b57d27, ++ 0x7165d4f7, 0x79be224f, 0xcefc82f2, 0x38e76b20, 0x91baf2d4, 0xfd219bdf, ++ 0xd7e041f4, 0x843b8b76, 0xb186cd79, 0xe91202ae, 0x8a383e92, 0xec337ed4, ++ 0xb544718d, 0x03bca9b7, 0x47d3e606, 0x7ff3a54a, 0xa083ddab, 0xec3f4e47, ++ 0xf9ef5243, 0x795f875f, 0x3533781b, 0x7a718cb6, 0x0c4d3fae, 0xdc0f1a3f, ++ 0xbbe280f8, 0xff6cc577, 0x0c873507, 0x7cf6dfe8, 0xd2ef01bf, 0x9f44f7db, ++ 0xcdcae66f, 0x0f142efc, 0x1ec3f447, 0xb9e9a2fb, 0x065d817a, 0xcbc0fca2, ++ 0xfc0377fe, 0xd726da8d, 0xf0f40b58, 0x6895bd1d, 0x353e8225, 0x5f339e87, ++ 0xc3f9aa54, 0xf582450d, 0x3028bcd1, 0xc3f8efce, 0xef7c017a, 0xf4c6b8a4, ++ 0xef0f9c50, 0xc530f919, 0x6e3564ad, 0xc5345e21, 0x5ee3558f, 0x568c86a6, ++ 0xf8ffbfcc, 0x7e70b21f, 0x9c2cc7b2, 0xabf8e9b7, 0x57df78a9, 0x3f79d914, ++ 0x18a98f8a, 0x9e3a1a6f, 0xb848f78a, 0xe7f659bf, 0x94ca2e40, 0xe11f81f2, ++ 0xc8128f7e, 0xd24dfc81, 0x2bc63e58, 0x659bb934, 0x9ad015a2, 0xf7ea92dc, ++ 0x38c2b8e2, 0x36def73f, 0xf84af66a, 0xf07c8f90, 0xfd6a13fe, 0x0d078c20, ++ 0x429cae1a, 0xffea9e7f, 0x4e1a75d6, 0xf806d2d0, 0x31383cfd, 0xd13dc612, ++ 0x1b9df5c6, 0xe1dcaa5c, 0xdf97ccf5, 0x6f1e5e17, 0x7f326d79, 0xd9d61e69, ++ 0x781175b5, 0x5f166cb4, 0x8c690380, 0x53ebf703, 0xcf8d5ce9, 0x5a4e8e48, ++ 0x51d550d2, 0x9d45d346, 0xe832aeee, 0xf9785eb5, 0xae57373d, 0x1ef476b9, ++ 0x7e0294f4, 0xf1bc3bea, 0x24ebe4a0, 0xd6122eb9, 0xbc61ada7, 0xea7f0009, ++ 0xe0ca3a4a, 0x7b26777f, 0xe5ef910c, 0xb3bfe31f, 0x6bae9a2f, 0xcdb328eb, ++ 0xbb8de7e3, 0xc453477b, 0xdc1afcd5, 0xf6a965fd, 0x72c3fbab, 0xe585345f, ++ 0x2253e974, 0xa3adb1f5, 0xbada852c, 0x3eabff98, 0x3c5f73d4, 0xee200c6e, ++ 0x380d7e92, 0xb63fc6ff, 0xfb712219, 0x0835f8c7, 0xc975995f, 0xb73fcbf7, ++ 0xe302966d, 0xf2092ba8, 0x33f601af, 0xfd889bf2, 0xa9cd17ce, 0x2cd7d44f, ++ 0xdc2dde46, 0xeb238b35, 0x025b7313, 0x7af90cca, 0xc96e37b6, 0xf31dab0f, ++ 0xff3c23e8, 0x76c29721, 0xabf35e78, 0x27a68a8c, 0xd75c165e, 0x7a22e7d9, ++ 0xfe732283, 0x7e9f773e, 0x52c69fcd, 0x9ec2f72d, 0x2b7a2342, 0xa28364fc, ++ 0x9e5333ea, 0x98fe0779, 0x77b16a99, 0xe2d2bf12, 0x49de7538, 0x9ff51593, ++ 0xb2afc9d0, 0xf437c49c, 0xd71b7980, 0x91667457, 0x69a3e34e, 0xbfdf18ab, ++ 0xab153bab, 0xa815c4fb, 0xae6b4ef9, 0x4beb87fe, 0xeaef9679, 0xe46f9c4b, ++ 0x7396f9c5, 0xe38cfe1c, 0xd0a4685b, 0xef81d8aa, 0xadfc333e, 0x49ffebf5, ++ 0x1a9e1c45, 0x3b78aff9, 0x1fcaeb70, 0x7b3f61e2, 0x078e3f87, 0x5e1a9c3e, ++ 0x6e7b4166, 0x7f416ecc, 0x32e3fca8, 0xdad6ebcc, 0x5a82fad9, 0xe1b70b1f, ++ 0x8eb87377, 0xd3377e10, 0xf434fa3b, 0xfbdd603a, 0x439202eb, 0x03acf4c4, ++ 0x3a3bd02e, 0xb663f109, 0xcdb760be, 0xac898f57, 0x572f642f, 0x51680beb, ++ 0xabd6c85f, 0xa8d005f5, 0x7d45a02f, 0x2fa8fd01, 0x017d4680, 0xa00bea34, ++ 0x8b405f51, 0x3ffa02fa, 0xe48b3d47, 0xa6f2510d, 0x8ccd3fd6, 0x280f77ff, ++ 0x77f5e43e, 0xba54549f, 0xbee1f25f, 0x88fed12f, 0xd5cfa183, 0x450857fa, ++ 0x8ff3bc43, 0x107df9ea, 0x2f96f7f2, 0x290dbdc5, 0x45d55c0e, 0xc5324dc4, ++ 0x69f4fd56, 0x8f5a85d4, 0x3b0e8e48, 0x1cb1b7fa, 0xdf0a477b, 0x80ff42af, ++ 0x71db21de, 0xa2a45f5f, 0x3238d5ee, 0x12abf5c0, 0xdf0349db, 0x5024a0f3, ++ 0xa8c5bd77, 0x0a3d93be, 0xe3dc92f5, 0x68f39906, 0xdf8c718f, 0x4bcf4d2f, ++ 0x3c88dad6, 0xcbfaf5b4, 0xa69d138c, 0xd790fdf8, 0x6b5937e3, 0x93abe2a3, ++ 0x7e0f3ef3, 0xcebc7ee2, 0x77a25cb1, 0xc78453aa, 0x9c01365c, 0x22247ce0, ++ 0x6d69da3f, 0x33f239f8, 0xe1d15ca1, 0xe87a1efc, 0xeaf9202e, 0x0a3fe9f6, ++ 0xe0dfec46, 0x471ba68b, 0x0a65748e, 0x8fdd19c8, 0xb2e2034a, 0x6fdd1fc7, ++ 0x7f24b62e, 0x563f4712, 0xb7c8d58b, 0xf6b9ffca, 0x37ed10f0, 0x7ce463d3, ++ 0x7b914165, 0xd7d93141, 0xeb93bd69, 0x9a4fa72f, 0xa175bdf8, 0xfd544577, ++ 0xc85954a5, 0x7a5d8ff5, 0x43f8e389, 0x58e9dd1b, 0x077e5c57, 0xd38a5dd7, ++ 0x61cfec2c, 0xb1b2dc3b, 0xbbe31332, 0xeeb9d956, 0xf7146a55, 0x7bf23f32, ++ 0x3d11e7be, 0xa7695bfb, 0xae8993e4, 0xfc030e11, 0x93a9076b, 0x7e6f49ed, ++ 0xd87f2250, 0x45557b41, 0x5eaed5d8, 0x2e0af389, 0xab9e9040, 0x18ee7d35, ++ 0x24afb7f9, 0x8c3b97f2, 0x299c1e6a, 0xb33fcccb, 0xcd16e29b, 0x0db853bf, ++ 0x1475d788, 0x9c52d157, 0xfd483d7d, 0x5985b8ee, 0xb76f9e6a, 0x59cd7f81, ++ 0x949e00bd, 0xe3917eda, 0x625f78e6, 0x5bee84fd, 0x7caadc0a, 0xe10fed7b, ++ 0x127c4ea8, 0xd69ed791, 0xfa43f8ab, 0x28d6f7e4, 0x3eeb95ec, 0xb6cf6e6e, ++ 0x797b73d7, 0xd9ef8abd, 0x67b79a8a, 0x93595dd3, 0x04716eb8, 0xcd5b4beb, ++ 0x8c3fe80e, 0xf969cf0b, 0x2d4cb67d, 0x562e7bcd, 0xc7440d6d, 0x6a22ff50, ++ 0x0bf31245, 0xa36f3158, 0x5330f19d, 0x0ed6b73e, 0x76697c7d, 0xb6a51f40, ++ 0xeef1ab93, 0x77f1a658, 0x82dca86d, 0x0bc672fb, 0xf7c7f62f, 0x6fd21e9a, ++ 0xa1240e19, 0x2a77ee9e, 0x949f8fa8, 0x5fd778ac, 0x0fbda78d, 0xd967e158, ++ 0xdb751592, 0xd29ed8b2, 0xb65fe254, 0x78038974, 0xf5caf84e, 0x556a29b0, ++ 0xa7d1b83b, 0x5d5aea48, 0xeaf8ea2a, 0xc1be3e3d, 0x385c5b5d, 0xf9a15fdb, ++ 0xb3e46851, 0x3fd7c478, 0x1cfb5ea3, 0xc9857bf8, 0x87f1a031, 0xbb5c541d, ++ 0x61b6eb88, 0xb4199a3b, 0xed1d87ed, 0x5545e2d6, 0xe47abbd5, 0xb9377513, ++ 0xaa1e86ef, 0x903f2f6b, 0xbf9ce7ca, 0x9bb8465e, 0x5b9ddc00, 0xf8e30b2f, ++ 0x0eeead41, 0xf569d5bc, 0xcf569d5c, 0x5cf569d5, 0xd5cf569d, 0x9d5cf569, ++ 0x69d5cf56, 0x569d5cf5, 0xf569d5cf, 0x09d71d5c, 0xa77db8db, 0x63b7377d, ++ 0xa71e5eed, 0xfc5dd138, 0x7b5bd5e7, 0xb7a9e78b, 0x027b188a, 0x77f25bc7, ++ 0xa73dbeb5, 0x2e7e4abe, 0xf179f847, 0x0fede248, 0x33e91f22, 0x510c4838, ++ 0xdf677066, 0x785c666d, 0xaeaffc0a, 0x66f586b3, 0x8cecbae6, 0xfe81ad30, ++ 0x74cbb95d, 0x680f8d32, 0x73ae10f7, 0x3e705fc2, 0xf85a0bf8, 0xacf96e8b, ++ 0x40c6fcbf, 0xe6a05d2e, 0x0fce5e07, 0x5daf7c4c, 0x4427841d, 0x51ac21df, ++ 0x0e697278, 0xe643d09e, 0xe7639097, 0xab745188, 0x37e025fe, 0xb8fe6a2e, ++ 0xf17c1e66, 0x28b2f8ab, 0xf602ffd6, 0xeb12d459, 0x7e4c3e40, 0x7a75f6ce, ++ 0x5e7ec4af, 0xdf792a2b, 0x1e267079, 0x82c771f7, 0xd14ff3e9, 0x321e3bfc, ++ 0x95d39e73, 0xffdd73be, 0xc57c6707, 0x6f1e3eaa, 0x205e340f, 0x7f604a59, ++ 0xd877f1d7, 0xcb87ae5c, 0xa507ecb1, 0xbe12c3ca, 0x4dbaeec7, 0x977dc6ac, ++ 0x869f2b18, 0x73f2369c, 0x6b26f77e, 0x58dd5d75, 0xcfa221c3, 0xf03a66a5, ++ 0xda616d1d, 0x16bd9131, 0x079e5438, 0x7a273c9c, 0x1cbbac24, 0xf84ffeef, ++ 0x7479cde9, 0xcfd6796a, 0xfb71e56c, 0x563ef9bb, 0xb7dee214, 0xa843ed1a, ++ 0xa78b0433, 0x35b0aeb9, 0x3a885ec1, 0x4bf8b043, 0x87d9b695, 0x3f9e0724, ++ 0x6d2f5cd3, 0x73d4de7a, 0x7abe2221, 0x745189fc, 0xcf7a70eb, 0x94efc885, ++ 0x73ef41f8, 0x274973f1, 0xa793be22, 0xb04beec9, 0x7ff94f43, 0x3178efab, ++ 0x72f1f1cd, 0x95f59db1, 0x60044a72, 0x2c9bd3cf, 0xb6cfbdfc, 0xea356da0, ++ 0x5ecf226c, 0xcf947988, 0x1d7ce0ce, 0xa19f9deb, 0x6dced4cd, 0x054fd7c3, ++ 0x426631d6, 0x0efb567b, 0xabbb2a39, 0x7bc596d0, 0xfb2fdc75, 0x25bed00a, ++ 0x3f41effb, 0x9037c5f9, 0xd5d1eca7, 0xce89732b, 0xb757fa34, 0x9d271199, ++ 0xbdff82df, 0x24a29c1b, 0x7f7aeae5, 0x923e76a7, 0xf1f18747, 0xfbf3991c, ++ 0x1b6a95f1, 0x12cc8bb6, 0x585fff35, 0xfad1faa2, 0xf23bf54e, 0x5859fb5c, ++ 0xf9386b22, 0xbc9372c3, 0x2c2fd8c9, 0x29a9e8bf, 0x6f243c80, 0x6f2a894a, ++ 0x4e615a2a, 0xf7cc3ae2, 0x9357abdb, 0xc253b54b, 0x2a0ba6c5, 0xa39b722e, ++ 0x5f2225f3, 0x97cfb8c8, 0xfa337908, 0x6a764da7, 0x9b4ef59f, 0xfb3c3790, ++ 0xf426d30f, 0xe514eb3f, 0x757ee1f3, 0x737cc289, 0xfaf34fd6, 0x8c7bf4c5, ++ 0x89d307df, 0xea72dbc8, 0xc97834df, 0xa3ec576e, 0xb6f2a37d, 0x8b5f8e5c, ++ 0x7c5a5b35, 0x0f602c9f, 0x9c109f8b, 0x64928aa7, 0x518c6f1e, 0xbef1bffd, ++ 0xd1d8647b, 0x3b923e35, 0xec56fec2, 0xa304cdd3, 0x5d7806f8, 0x941b8693, ++ 0x7b8d45a7, 0xe4f23988, 0x908f0d0c, 0xde115637, 0xfcdfea78, 0xc19eff8a, ++ 0x8fc39faf, 0xc38c29b0, 0xfdd6f102, 0x3f0ed07a, 0xf3b79e88, 0xe1755fd6, ++ 0xd55f5b5d, 0x7177e06b, 0xb42e91ed, 0x1aefcdcd, 0xcaf3826c, 0x5794f9a8, ++ 0xc957d146, 0x968e4739, 0xd9772e7b, 0xec97d9e6, 0xed236fe0, 0x7fdeb4e0, ++ 0xa7a9de0d, 0x2f0eb13d, 0x5dff11c7, 0xcdfd97c0, 0xcae20766, 0xb1727f81, ++ 0x82ed857d, 0x9d80efd6, 0x751db8fd, 0x4baf7cf2, 0x7e6fc2e4, 0x1e029dac, ++ 0x43c28f2e, 0x372bd72f, 0x5ae7185b, 0x4b5ff7b5, 0x90f395ad, 0xe8b75fb0, ++ 0x61761ffc, 0xbf85b25e, 0xe6dc1043, 0xce56efe2, 0xee8e19c9, 0xdce27c88, ++ 0xd03e65e6, 0x00fe9da9, 0x42ff4ef8, 0x5c7ea072, 0x6ae2a712, 0x7cd95ca9, ++ 0x94dfc688, 0xbf1b8c03, 0xf8287e01, 0x6e368a3b, 0xbf57af2f, 0xbf09a4ab, ++ 0x82fdfea4, 0xf4ef10bd, 0xbeb477f0, 0x4723bebd, 0x7c97cef1, 0x5d44ec4f, ++ 0x2ccc6ff4, 0x7b27c84f, 0xbe9e74f5, 0xddb8c144, 0xe3873db7, 0x5654484e, ++ 0x67bc85dd, 0x4fd72c5b, 0x8fed12fb, 0x5f697be0, 0xe7ce4ac3, 0xc6a37d8f, ++ 0x312de9fb, 0x7d6fe40e, 0x381dedab, 0x767ddf57, 0x524d7f1e, 0x511f79f9, ++ 0x45b7d3f5, 0x435f673d, 0xc2cbbf12, 0xefd7d0f7, 0xb777c74c, 0x3ef778d6, ++ 0xf6867bdc, 0x096fb1dd, 0x98fb53f5, 0x4efdb954, 0xcaa559f0, 0x9dbd797b, ++ 0xf6f4e6f1, 0x541c8f95, 0xf7c019f5, 0x16cdd6af, 0x2fffb77e, 0xfb20ee11, ++ 0x000024f0 + }; + + #endif /*__BNX2X_INIT_VALUES_H__*/ +diff -r ddb96c0bbe13 drivers/net/bnx2x_init_values_e1.c +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/bnx2x_init_values_e1.c Tue Jun 16 13:15:30 2009 +0100 +@@ -0,0 +1,13899 @@ ++/* init_ops array contains the list of operations needed to initialize the chip. ++ * ++ * For each block in the chip there are three init stages: ++ * common - HW used by both ports, ++ * port1 and port2 - initialization for a specific Ethernet port. ++ * When a port is opened or closed, the management CPU tells the driver ++ * whether to init/disable common HW in addition to the port HW. ++ * This way the first port going up will first initializes the common HW, ++ * and the last port going down also resets the common HW ++ * ++ * For each init stage/block there is a list of actions needed in a format: ++ * {operation, register, data} ++ * where: ++ * OP_WR - write a value to the chip. ++ * OP_RD - read a register (usually a clear on read register). ++ * OP_SW - string write, write a section of consecutive addresses to the chip. ++ * OP_SI - copy a string using indirect writes. ++ * OP_ZR - clear a range of memory. ++ * OP_ZP - unzip and copy using DMAE. ++ * OP_WB - string copy using DMAE. ++ * ++ * The #defines mark the stages. ++ * ++ */ ++#include ++#include ++#include ++#include ++#include ++#include "bnx2x_compat.h" ++#include "bnx2x_init.h" ++#include "bnx2x.h" ++ ++ ++static const struct raw_op init_ops_e1[] = { ++/* #define PRS_COMMON_START 0 */ ++ {OP_WR, PRS_REG_INC_VALUE, 0xf}, ++ {OP_WR, PRS_REG_EVENT_ID_1, 0x45}, ++ {OP_WR, PRS_REG_EVENT_ID_2, 0x84}, ++ {OP_WR, PRS_REG_EVENT_ID_3, 0x6}, ++ {OP_WR, PRS_REG_NO_MATCH_EVENT_ID, 0x4}, ++ {OP_WR, PRS_REG_CM_HDR_TYPE_0, 0x0}, ++ {OP_WR, PRS_REG_CM_HDR_TYPE_1, 0x12170000}, ++ {OP_WR, PRS_REG_CM_HDR_TYPE_2, 0x22170000}, ++ {OP_WR, PRS_REG_CM_HDR_TYPE_3, 0x32170000}, ++ {OP_ZR, PRS_REG_CM_HDR_TYPE_4, 0x5}, ++ {OP_WR, PRS_REG_CM_HDR_LOOPBACK_TYPE_1, 0x12150000}, ++ {OP_WR, PRS_REG_CM_HDR_LOOPBACK_TYPE_2, 0x22150000}, ++ {OP_WR, PRS_REG_CM_HDR_LOOPBACK_TYPE_3, 0x32150000}, ++ {OP_ZR, PRS_REG_CM_HDR_LOOPBACK_TYPE_4, 0x4}, ++ {OP_WR, PRS_REG_CM_NO_MATCH_HDR, 0x2100000}, ++ {OP_WR, PRS_REG_CM_HDR_FLUSH_NO_LOAD_TYPE_0, 0x100000}, ++ {OP_WR, PRS_REG_CM_HDR_FLUSH_NO_LOAD_TYPE_1, 0x10100000}, ++ {OP_WR, PRS_REG_CM_HDR_FLUSH_NO_LOAD_TYPE_2, 0x20100000}, ++ {OP_WR, PRS_REG_CM_HDR_FLUSH_NO_LOAD_TYPE_3, 0x30100000}, ++ {OP_ZR, PRS_REG_CM_HDR_FLUSH_NO_LOAD_TYPE_4, 0x4}, ++ {OP_WR, PRS_REG_CM_HDR_FLUSH_LOAD_TYPE_0, 0x100000}, ++ {OP_WR, PRS_REG_CM_HDR_FLUSH_LOAD_TYPE_1, 0x12140000}, ++ {OP_WR, PRS_REG_CM_HDR_FLUSH_LOAD_TYPE_2, 0x22140000}, ++ {OP_WR, PRS_REG_CM_HDR_FLUSH_LOAD_TYPE_3, 0x32140000}, ++ {OP_ZR, PRS_REG_CM_HDR_FLUSH_LOAD_TYPE_4, 0x4}, ++ {OP_RD, PRS_REG_NUM_OF_PACKETS, 0x0}, ++ {OP_RD, PRS_REG_NUM_OF_CFC_FLUSH_MESSAGES, 0x0}, ++ {OP_RD, PRS_REG_NUM_OF_TRANSPARENT_FLUSH_MESSAGES, 0x0}, ++ {OP_RD, PRS_REG_NUM_OF_DEAD_CYCLES, 0x0}, ++ {OP_WR, PRS_REG_FLUSH_REGIONS_TYPE_0, 0xff}, ++ {OP_WR, PRS_REG_FLUSH_REGIONS_TYPE_1, 0xff}, ++ {OP_WR, PRS_REG_FLUSH_REGIONS_TYPE_2, 0xff}, ++ {OP_WR, PRS_REG_FLUSH_REGIONS_TYPE_3, 0xff}, ++ {OP_WR, PRS_REG_FLUSH_REGIONS_TYPE_4, 0xff}, ++ {OP_WR, PRS_REG_FLUSH_REGIONS_TYPE_5, 0xff}, ++ {OP_WR, PRS_REG_FLUSH_REGIONS_TYPE_6, 0xff}, ++ {OP_WR, PRS_REG_FLUSH_REGIONS_TYPE_7, 0xff}, ++ {OP_WR, PRS_REG_PURE_REGIONS, 0x3e}, ++ {OP_WR, PRS_REG_PACKET_REGIONS_TYPE_0, 0x0}, ++ {OP_WR, PRS_REG_PACKET_REGIONS_TYPE_1, 0x3f}, ++ {OP_WR, PRS_REG_PACKET_REGIONS_TYPE_2, 0x3f}, ++ {OP_WR, PRS_REG_PACKET_REGIONS_TYPE_3, 0x3f}, ++ {OP_WR, PRS_REG_PACKET_REGIONS_TYPE_4, 0x0}, ++ {OP_WR, PRS_REG_PACKET_REGIONS_TYPE_5, 0x3f}, ++ {OP_WR, PRS_REG_PACKET_REGIONS_TYPE_6, 0x3f}, ++ {OP_WR, PRS_REG_PACKET_REGIONS_TYPE_7, 0x3f}, ++/* #define PRS_COMMON_END 1 */ ++/* #define TSDM_COMMON_START 44 */ ++ {OP_WR, TSDM_REG_CFC_RSP_START_ADDR, 0x411}, ++ {OP_WR, TSDM_REG_CMP_COUNTER_START_ADDR, 0x400}, ++ {OP_WR, TSDM_REG_Q_COUNTER_START_ADDR, 0x404}, ++ {OP_WR, TSDM_REG_PCK_END_MSG_START_ADDR, 0x419}, ++ {OP_WR, TSDM_REG_CMP_COUNTER_MAX0, 0xffff}, ++ {OP_WR, TSDM_REG_CMP_COUNTER_MAX1, 0xffff}, ++ {OP_WR, TSDM_REG_CMP_COUNTER_MAX2, 0xffff}, ++ {OP_WR, TSDM_REG_CMP_COUNTER_MAX3, 0xffff}, ++ {OP_ZR, TSDM_REG_AGG_INT_EVENT_0, 0x2}, ++ {OP_WR, TSDM_REG_AGG_INT_EVENT_2, 0x34}, ++ {OP_WR, TSDM_REG_AGG_INT_EVENT_3, 0x35}, ++ {OP_ZR, TSDM_REG_AGG_INT_EVENT_4, 0x7c}, ++ {OP_WR, TSDM_REG_ENABLE_IN1, 0x7ffffff}, ++ {OP_WR, TSDM_REG_ENABLE_IN2, 0x3f}, ++ {OP_WR, TSDM_REG_ENABLE_OUT1, 0x7ffffff}, ++ {OP_WR, TSDM_REG_ENABLE_OUT2, 0xf}, ++ {OP_RD, TSDM_REG_NUM_OF_Q0_CMD, 0x0}, ++ {OP_RD, TSDM_REG_NUM_OF_Q1_CMD, 0x0}, ++ {OP_RD, TSDM_REG_NUM_OF_Q3_CMD, 0x0}, ++ {OP_RD, TSDM_REG_NUM_OF_Q4_CMD, 0x0}, ++ {OP_RD, TSDM_REG_NUM_OF_Q5_CMD, 0x0}, ++ {OP_RD, TSDM_REG_NUM_OF_Q6_CMD, 0x0}, ++ {OP_RD, TSDM_REG_NUM_OF_Q7_CMD, 0x0}, ++ {OP_RD, TSDM_REG_NUM_OF_Q8_CMD, 0x0}, ++ {OP_RD, TSDM_REG_NUM_OF_Q9_CMD, 0x0}, ++ {OP_RD, TSDM_REG_NUM_OF_Q10_CMD, 0x0}, ++ {OP_RD, TSDM_REG_NUM_OF_Q11_CMD, 0x0}, ++ {OP_RD, TSDM_REG_NUM_OF_PKT_END_MSG, 0x0}, ++ {OP_RD, TSDM_REG_NUM_OF_PXP_ASYNC_REQ, 0x0}, ++ {OP_RD, TSDM_REG_NUM_OF_ACK_AFTER_PLACE, 0x0}, ++ {OP_WR, TSDM_REG_INIT_CREDIT_PXP_CTRL, 0x1}, ++ {OP_WR_ASIC, TSDM_REG_TIMER_TICK, 0x3e8}, ++ {OP_WR_EMUL, TSDM_REG_TIMER_TICK, 0x1}, ++ {OP_WR_FPGA, TSDM_REG_TIMER_TICK, 0xa}, ++/* #define TSDM_COMMON_END 45 */ ++/* #define TCM_COMMON_START 66 */ ++ {OP_WR, TCM_REG_XX_MAX_LL_SZ, 0x20}, ++ {OP_WR, TCM_REG_XX_OVFL_EVNT_ID, 0x32}, ++ {OP_WR, TCM_REG_TQM_TCM_HDR_P, 0x2150020}, ++ {OP_WR, TCM_REG_TQM_TCM_HDR_S, 0x2150020}, ++ {OP_WR, TCM_REG_TM_TCM_HDR, 0x30}, ++ {OP_WR, TCM_REG_ERR_TCM_HDR, 0x8100000}, ++ {OP_WR, TCM_REG_ERR_EVNT_ID, 0x33}, ++ {OP_WR, TCM_REG_EXPR_EVNT_ID, 0x30}, ++ {OP_WR, TCM_REG_STOP_EVNT_ID, 0x31}, ++ {OP_WR, TCM_REG_STORM_WEIGHT, 0x2}, ++ {OP_WR, TCM_REG_PRS_WEIGHT, 0x5}, ++ {OP_WR, TCM_REG_PBF_WEIGHT, 0x6}, ++ {OP_WR, TCM_REG_USEM_WEIGHT, 0x2}, ++ {OP_WR, TCM_REG_CSEM_WEIGHT, 0x2}, ++ {OP_WR, TCM_REG_CP_WEIGHT, 0x0}, ++ {OP_WR, TCM_REG_TSDM_WEIGHT, 0x5}, ++ {OP_WR, TCM_REG_TQM_P_WEIGHT, 0x2}, ++ {OP_WR, TCM_REG_TQM_S_WEIGHT, 0x2}, ++ {OP_WR, TCM_REG_TM_WEIGHT, 0x2}, ++ {OP_WR, TCM_REG_TCM_TQM_USE_Q, 0x1}, ++ {OP_WR, TCM_REG_GR_ARB_TYPE, 0x1}, ++ {OP_WR, TCM_REG_GR_LD0_PR, 0x1}, ++ {OP_WR, TCM_REG_GR_LD1_PR, 0x2}, ++ {OP_WR, TCM_REG_CFC_INIT_CRD, 0x1}, ++ {OP_WR, TCM_REG_FIC0_INIT_CRD, 0x40}, ++ {OP_WR, TCM_REG_FIC1_INIT_CRD, 0x40}, ++ {OP_WR, TCM_REG_TQM_INIT_CRD, 0x20}, ++ {OP_WR, TCM_REG_XX_INIT_CRD, 0x13}, ++ {OP_WR, TCM_REG_XX_MSG_NUM, 0x20}, ++ {OP_ZR, TCM_REG_XX_TABLE, 0xa}, ++ {OP_SW, TCM_REG_XX_DESCR_TABLE, 0x200000}, ++ {OP_WR, TCM_REG_N_SM_CTX_LD_0, 0x7}, ++ {OP_WR, TCM_REG_N_SM_CTX_LD_1, 0x7}, ++ {OP_WR, TCM_REG_N_SM_CTX_LD_2, 0x8}, ++ {OP_WR, TCM_REG_N_SM_CTX_LD_3, 0x8}, ++ {OP_ZR, TCM_REG_N_SM_CTX_LD_4, 0x4}, ++ {OP_WR, TCM_REG_TCM_REG0_SZ, 0x6}, ++ {OP_WR, TCM_REG_PHYS_QNUM0_0, 0xd}, ++ {OP_WR, TCM_REG_PHYS_QNUM0_1, 0x2d}, ++ {OP_WR, TCM_REG_PHYS_QNUM1_0, 0x7}, ++ {OP_WR, TCM_REG_PHYS_QNUM1_1, 0x27}, ++ {OP_WR, TCM_REG_PHYS_QNUM2_0, 0x7}, ++ {OP_WR, TCM_REG_PHYS_QNUM2_1, 0x27}, ++ {OP_WR, TCM_REG_PHYS_QNUM3_0, 0x7}, ++ {OP_WR, TCM_REG_PHYS_QNUM3_1, 0x27}, ++ {OP_WR, TCM_REG_TCM_STORM0_IFEN, 0x1}, ++ {OP_WR, TCM_REG_TCM_STORM1_IFEN, 0x1}, ++ {OP_WR, TCM_REG_TCM_TQM_IFEN, 0x1}, ++ {OP_WR, TCM_REG_STORM_TCM_IFEN, 0x1}, ++ {OP_WR, TCM_REG_TQM_TCM_IFEN, 0x1}, ++ {OP_WR, TCM_REG_TSDM_IFEN, 0x1}, ++ {OP_WR, TCM_REG_TM_TCM_IFEN, 0x1}, ++ {OP_WR, TCM_REG_PRS_IFEN, 0x1}, ++ {OP_WR, TCM_REG_PBF_IFEN, 0x1}, ++ {OP_WR, TCM_REG_USEM_IFEN, 0x1}, ++ {OP_WR, TCM_REG_CSEM_IFEN, 0x1}, ++ {OP_WR, TCM_REG_CDU_AG_WR_IFEN, 0x1}, ++ {OP_WR, TCM_REG_CDU_AG_RD_IFEN, 0x1}, ++ {OP_WR, TCM_REG_CDU_SM_WR_IFEN, 0x1}, ++ {OP_WR, TCM_REG_CDU_SM_RD_IFEN, 0x1}, ++ {OP_WR, TCM_REG_TCM_CFC_IFEN, 0x1}, ++/* #define TCM_COMMON_END 67 */ ++/* #define BRB1_COMMON_START 88 */ ++ {OP_SW, BRB1_REG_LL_RAM, 0x2000020}, ++ {OP_WR, BRB1_REG_SOFT_RESET, 0x1}, ++ {OP_RD, BRB1_REG_NUM_OF_FULL_CYCLES_4, 0x0}, ++ {OP_SW, BRB1_REG_FREE_LIST_PRS_CRDT, 0x30220}, ++ {OP_WR, BRB1_REG_SOFT_RESET, 0x0}, ++/* #define BRB1_COMMON_END 89 */ ++/* #define BRB1_PORT0_START 90 */ ++ {OP_WR, BRB1_REG_PAUSE_LOW_THRESHOLD_0, 0xb8}, ++ {OP_WR, BRB1_REG_PAUSE_HIGH_THRESHOLD_0, 0x114}, ++ {OP_RD, BRB1_REG_NUM_OF_PAUSE_CYCLES_0, 0x0}, ++ {OP_RD, BRB1_REG_NUM_OF_FULL_CYCLES_0, 0x0}, ++/* #define BRB1_PORT0_END 91 */ ++/* #define BRB1_PORT1_START 92 */ ++ {OP_WR, BRB1_REG_PAUSE_LOW_THRESHOLD_1, 0xb8}, ++ {OP_WR, BRB1_REG_PAUSE_HIGH_THRESHOLD_1, 0x114}, ++ {OP_RD, BRB1_REG_NUM_OF_PAUSE_CYCLES_1, 0x0}, ++ {OP_RD, BRB1_REG_NUM_OF_FULL_CYCLES_1, 0x0}, ++/* #define BRB1_PORT1_END 93 */ ++/* #define TSEM_COMMON_START 110 */ ++ {OP_ZP, TSEM_REG_INT_TABLE, 0x960000}, ++ {OP_WR_64, TSEM_REG_INT_TABLE + 0x360, 0x140223}, ++ {OP_ZP, TSEM_REG_PRAM, 0x34b80000}, ++ {OP_ZP, TSEM_REG_PRAM + 0x8000, 0x34e90d2f}, ++ {OP_ZP, TSEM_REG_PRAM + 0x10000, 0x9dd1a6a}, ++ {OP_WR_64, TSEM_REG_PRAM + 0x11400, 0x5d800225}, ++ {OP_RD, TSEM_REG_MSG_NUM_FIC0, 0x0}, ++ {OP_RD, TSEM_REG_MSG_NUM_FIC1, 0x0}, ++ {OP_RD, TSEM_REG_MSG_NUM_FOC0, 0x0}, ++ {OP_RD, TSEM_REG_MSG_NUM_FOC1, 0x0}, ++ {OP_RD, TSEM_REG_MSG_NUM_FOC2, 0x0}, ++ {OP_RD, TSEM_REG_MSG_NUM_FOC3, 0x0}, ++ {OP_WR, TSEM_REG_ARB_ELEMENT0, 0x1}, ++ {OP_WR, TSEM_REG_ARB_ELEMENT1, 0x2}, ++ {OP_WR, TSEM_REG_ARB_ELEMENT2, 0x3}, ++ {OP_WR, TSEM_REG_ARB_ELEMENT3, 0x0}, ++ {OP_WR, TSEM_REG_ARB_ELEMENT4, 0x4}, ++ {OP_WR, TSEM_REG_ARB_CYCLE_SIZE, 0x1}, ++ {OP_WR, TSEM_REG_TS_0_AS, 0x0}, ++ {OP_WR, TSEM_REG_TS_1_AS, 0x1}, ++ {OP_WR, TSEM_REG_TS_2_AS, 0x4}, ++ {OP_WR, TSEM_REG_TS_3_AS, 0x0}, ++ {OP_WR, TSEM_REG_TS_4_AS, 0x1}, ++ {OP_WR, TSEM_REG_TS_5_AS, 0x3}, ++ {OP_WR, TSEM_REG_TS_6_AS, 0x0}, ++ {OP_WR, TSEM_REG_TS_7_AS, 0x1}, ++ {OP_WR, TSEM_REG_TS_8_AS, 0x4}, ++ {OP_WR, TSEM_REG_TS_9_AS, 0x0}, ++ {OP_WR, TSEM_REG_TS_10_AS, 0x1}, ++ {OP_WR, TSEM_REG_TS_11_AS, 0x3}, ++ {OP_WR, TSEM_REG_TS_12_AS, 0x0}, ++ {OP_WR, TSEM_REG_TS_13_AS, 0x1}, ++ {OP_WR, TSEM_REG_TS_14_AS, 0x4}, ++ {OP_WR, TSEM_REG_TS_15_AS, 0x0}, ++ {OP_WR, TSEM_REG_TS_16_AS, 0x4}, ++ {OP_WR, TSEM_REG_TS_17_AS, 0x3}, ++ {OP_ZR, TSEM_REG_TS_18_AS, 0x2}, ++ {OP_WR, TSEM_REG_ENABLE_IN, 0x3fff}, ++ {OP_WR, TSEM_REG_ENABLE_OUT, 0x3ff}, ++ {OP_WR, TSEM_REG_FIC0_DISABLE, 0x0}, ++ {OP_WR, TSEM_REG_FIC1_DISABLE, 0x0}, ++ {OP_WR, TSEM_REG_PAS_DISABLE, 0x0}, ++ {OP_WR, TSEM_REG_THREADS_LIST, 0xff}, ++ {OP_ZR, TSEM_REG_PASSIVE_BUFFER, 0x400}, ++ {OP_WR, TSEM_REG_FAST_MEMORY + 0x18bc0, 0x1}, ++ {OP_WR, TSEM_REG_FAST_MEMORY + 0x18000, 0x34}, ++ {OP_WR, TSEM_REG_FAST_MEMORY + 0x18040, 0x18}, ++ {OP_WR, TSEM_REG_FAST_MEMORY + 0x18080, 0xc}, ++ {OP_WR, TSEM_REG_FAST_MEMORY + 0x180c0, 0x20}, ++ {OP_WR_ASIC, TSEM_REG_FAST_MEMORY + 0x18300, 0x7a120}, ++ {OP_WR_EMUL, TSEM_REG_FAST_MEMORY + 0x18300, 0x138}, ++ {OP_WR_FPGA, TSEM_REG_FAST_MEMORY + 0x18300, 0x1388}, ++ {OP_WR, TSEM_REG_FAST_MEMORY + 0x183c0, 0x1f4}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x2000, 0xb2}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x23c8, 0x181}, ++ {OP_SW, TSEM_REG_FAST_MEMORY + 0x23c8 + 0x604, 0x10227}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x1020, 0xc8}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x1000, 0x2}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x1e38, 0x2}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x1e30, 0x2}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x800, 0x2}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x808, 0x2}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x810, 0x4}, ++ {OP_SW, TSEM_REG_FAST_MEMORY + 0x1fb0, 0x50228}, ++ {OP_SW, TSEM_REG_FAST_MEMORY + 0x4cb0, 0x8022d}, ++/* #define TSEM_COMMON_END 111 */ ++/* #define TSEM_PORT0_START 112 */ ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x22c8, 0x20}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x4000, 0x124}, ++ {OP_WR, TSEM_REG_FAST_MEMORY + 0x4920, 0x0}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x1400, 0xa}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x1450, 0x6}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x1500, 0x2}, ++ {OP_SW, TSEM_REG_FAST_MEMORY + 0x1500 + 0x8, 0x50235}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x1500 + 0x1c, 0x9}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x1580, 0x14}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x9c0, 0x48}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x800, 0x2}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x820, 0xe}, ++ {OP_SW, TSEM_REG_FAST_MEMORY + 0x1fb0, 0x2023a}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x2c28, 0x2}, ++/* #define TSEM_PORT0_END 113 */ ++/* #define TSEM_PORT1_START 114 */ ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x2348, 0x20}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x4490, 0x124}, ++ {OP_WR, TSEM_REG_FAST_MEMORY + 0x4924, 0x0}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x1428, 0xa}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x1468, 0x6}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x1540, 0x2}, ++ {OP_SW, TSEM_REG_FAST_MEMORY + 0x1540 + 0x8, 0x5023c}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x1540 + 0x1c, 0x9}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x15d0, 0x14}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0xae0, 0x48}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x808, 0x2}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x858, 0xe}, ++ {OP_SW, TSEM_REG_FAST_MEMORY + 0x1fb8, 0x20241}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x2c30, 0x2}, ++/* #define TSEM_PORT1_END 115 */ ++/* #define MISC_COMMON_START 220 */ ++ {OP_WR, MISC_REG_GRC_TIMEOUT_EN, 0x1}, ++ {OP_WR, MISC_REG_PLL_STORM_CTRL_1, 0x71d2911}, ++ {OP_WR, MISC_REG_PLL_STORM_CTRL_2, 0x0}, ++ {OP_WR, MISC_REG_PLL_STORM_CTRL_3, 0x9c0424}, ++ {OP_WR, MISC_REG_PLL_STORM_CTRL_4, 0x0}, ++ {OP_WR, MISC_REG_LCPLL_CTRL_1, 0x209}, ++ {OP_WR, MISC_REG_SPIO, 0xff000000}, ++/* #define MISC_COMMON_END 221 */ ++/* #define NIG_COMMON_START 264 */ ++ {OP_WR, NIG_REG_PBF_LB_IN_EN, 0x1}, ++ {OP_WR, NIG_REG_PRS_REQ_IN_EN, 0x1}, ++ {OP_WR, NIG_REG_EGRESS_DEBUG_IN_EN, 0x1}, ++ {OP_WR, NIG_REG_BRB_LB_OUT_EN, 0x1}, ++ {OP_WR, NIG_REG_PRS_EOP_OUT_EN, 0x1}, ++/* #define NIG_COMMON_END 265 */ ++/* #define NIG_PORT0_START 266 */ ++ {OP_WR, NIG_REG_LLH0_CM_HEADER, 0x300000}, ++ {OP_WR, NIG_REG_LLH0_EVENT_ID, 0x28}, ++ {OP_WR, NIG_REG_LLH0_ERROR_MASK, 0x0}, ++ {OP_WR, NIG_REG_LLH0_XCM_MASK, 0x4}, ++ {OP_WR, NIG_REG_LLH0_BRB1_NOT_MCP, 0x1}, ++ {OP_WR, NIG_REG_STATUS_INTERRUPT_PORT0, 0x0}, ++ {OP_WR, NIG_REG_LLH0_XCM_INIT_CREDIT, 0x30}, ++ {OP_WR, NIG_REG_BRB0_PAUSE_IN_EN, 0x1}, ++ {OP_WR, NIG_REG_EGRESS_PBF0_IN_EN, 0x1}, ++ {OP_WR, NIG_REG_BRB0_OUT_EN, 0x1}, ++ {OP_WR, NIG_REG_XCM0_OUT_EN, 0x1}, ++/* #define NIG_PORT0_END 267 */ ++/* #define NIG_PORT1_START 268 */ ++ {OP_WR, NIG_REG_LLH1_CM_HEADER, 0x300000}, ++ {OP_WR, NIG_REG_LLH1_EVENT_ID, 0x28}, ++ {OP_WR, NIG_REG_LLH1_ERROR_MASK, 0x0}, ++ {OP_WR, NIG_REG_LLH1_XCM_MASK, 0x4}, ++ {OP_WR, NIG_REG_LLH1_BRB1_NOT_MCP, 0x1}, ++ {OP_WR, NIG_REG_STATUS_INTERRUPT_PORT1, 0x0}, ++ {OP_WR, NIG_REG_LLH1_XCM_INIT_CREDIT, 0x30}, ++ {OP_WR, NIG_REG_BRB1_PAUSE_IN_EN, 0x1}, ++ {OP_WR, NIG_REG_EGRESS_PBF1_IN_EN, 0x1}, ++ {OP_WR, NIG_REG_BRB1_OUT_EN, 0x1}, ++ {OP_WR, NIG_REG_XCM1_OUT_EN, 0x1}, ++/* #define NIG_PORT1_END 269 */ ++/* #define UPB_COMMON_START 308 */ ++ {OP_WR, GRCBASE_UPB + PB_REG_CONTROL, 0x20}, ++/* #define UPB_COMMON_END 309 */ ++/* #define CSDM_COMMON_START 330 */ ++ {OP_WR, CSDM_REG_CFC_RSP_START_ADDR, 0xa11}, ++ {OP_WR, CSDM_REG_CMP_COUNTER_START_ADDR, 0xa00}, ++ {OP_WR, CSDM_REG_Q_COUNTER_START_ADDR, 0xa04}, ++ {OP_WR, CSDM_REG_CMP_COUNTER_MAX0, 0xffff}, ++ {OP_WR, CSDM_REG_CMP_COUNTER_MAX1, 0xffff}, ++ {OP_WR, CSDM_REG_CMP_COUNTER_MAX2, 0xffff}, ++ {OP_WR, CSDM_REG_CMP_COUNTER_MAX3, 0xffff}, ++ {OP_ZR, CSDM_REG_AGG_INT_EVENT_0, 0x2}, ++ {OP_WR, CSDM_REG_AGG_INT_EVENT_2, 0x34}, ++ {OP_WR, CSDM_REG_AGG_INT_EVENT_3, 0x35}, ++ {OP_WR, CSDM_REG_AGG_INT_EVENT_4, 0x20}, ++ {OP_WR, CSDM_REG_AGG_INT_EVENT_5, 0x21}, ++ {OP_WR, CSDM_REG_AGG_INT_EVENT_6, 0x22}, ++ {OP_WR, CSDM_REG_AGG_INT_EVENT_7, 0x23}, ++ {OP_WR, CSDM_REG_AGG_INT_EVENT_8, 0x24}, ++ {OP_WR, CSDM_REG_AGG_INT_EVENT_9, 0x25}, ++ {OP_WR, CSDM_REG_AGG_INT_EVENT_10, 0x26}, ++ {OP_WR, CSDM_REG_AGG_INT_EVENT_11, 0x27}, ++ {OP_WR, CSDM_REG_AGG_INT_EVENT_12, 0x28}, ++ {OP_WR, CSDM_REG_AGG_INT_EVENT_13, 0x29}, ++ {OP_WR, CSDM_REG_AGG_INT_EVENT_14, 0x2a}, ++ {OP_WR, CSDM_REG_AGG_INT_EVENT_15, 0x2b}, ++ {OP_ZR, CSDM_REG_AGG_INT_EVENT_16, 0x56}, ++ {OP_WR, CSDM_REG_AGG_INT_MODE_6, 0x1}, ++ {OP_WR, CSDM_REG_AGG_INT_MODE_7, 0x1}, ++ {OP_WR, CSDM_REG_AGG_INT_MODE_8, 0x1}, ++ {OP_WR, CSDM_REG_AGG_INT_MODE_9, 0x1}, ++ {OP_WR, CSDM_REG_AGG_INT_MODE_10, 0x1}, ++ {OP_WR, CSDM_REG_AGG_INT_MODE_11, 0x1}, ++ {OP_WR, CSDM_REG_AGG_INT_MODE_12, 0x1}, ++ {OP_WR, CSDM_REG_AGG_INT_MODE_13, 0x1}, ++ {OP_WR, CSDM_REG_AGG_INT_MODE_14, 0x1}, ++ {OP_WR, CSDM_REG_AGG_INT_MODE_15, 0x1}, ++ {OP_ZR, CSDM_REG_AGG_INT_MODE_16, 0x10}, ++ {OP_WR, CSDM_REG_ENABLE_IN1, 0x7ffffff}, ++ {OP_WR, CSDM_REG_ENABLE_IN2, 0x3f}, ++ {OP_WR, CSDM_REG_ENABLE_OUT1, 0x7ffffff}, ++ {OP_WR, CSDM_REG_ENABLE_OUT2, 0xf}, ++ {OP_RD, CSDM_REG_NUM_OF_Q0_CMD, 0x0}, ++ {OP_RD, CSDM_REG_NUM_OF_Q1_CMD, 0x0}, ++ {OP_RD, CSDM_REG_NUM_OF_Q3_CMD, 0x0}, ++ {OP_RD, CSDM_REG_NUM_OF_Q4_CMD, 0x0}, ++ {OP_RD, CSDM_REG_NUM_OF_Q5_CMD, 0x0}, ++ {OP_RD, CSDM_REG_NUM_OF_Q6_CMD, 0x0}, ++ {OP_RD, CSDM_REG_NUM_OF_Q7_CMD, 0x0}, ++ {OP_RD, CSDM_REG_NUM_OF_Q8_CMD, 0x0}, ++ {OP_RD, CSDM_REG_NUM_OF_Q9_CMD, 0x0}, ++ {OP_RD, CSDM_REG_NUM_OF_Q10_CMD, 0x0}, ++ {OP_RD, CSDM_REG_NUM_OF_Q11_CMD, 0x0}, ++ {OP_RD, CSDM_REG_NUM_OF_PKT_END_MSG, 0x0}, ++ {OP_RD, CSDM_REG_NUM_OF_PXP_ASYNC_REQ, 0x0}, ++ {OP_RD, CSDM_REG_NUM_OF_ACK_AFTER_PLACE, 0x0}, ++ {OP_WR, CSDM_REG_INIT_CREDIT_PXP_CTRL, 0x1}, ++ {OP_WR_ASIC, CSDM_REG_TIMER_TICK, 0x3e8}, ++ {OP_WR_EMUL, CSDM_REG_TIMER_TICK, 0x1}, ++ {OP_WR_FPGA, CSDM_REG_TIMER_TICK, 0xa}, ++/* #define CSDM_COMMON_END 331 */ ++/* #define USDM_COMMON_START 352 */ ++ {OP_WR, USDM_REG_CFC_RSP_START_ADDR, 0x365}, ++ {OP_WR, USDM_REG_CMP_COUNTER_START_ADDR, 0x354}, ++ {OP_WR, USDM_REG_Q_COUNTER_START_ADDR, 0x358}, ++ {OP_WR, USDM_REG_PCK_END_MSG_START_ADDR, 0x375}, ++ {OP_WR, USDM_REG_CMP_COUNTER_MAX0, 0xffff}, ++ {OP_WR, USDM_REG_CMP_COUNTER_MAX1, 0xffff}, ++ {OP_WR, USDM_REG_CMP_COUNTER_MAX2, 0xffff}, ++ {OP_WR, USDM_REG_CMP_COUNTER_MAX3, 0xffff}, ++ {OP_WR, USDM_REG_AGG_INT_EVENT_0, 0x46}, ++ {OP_WR, USDM_REG_AGG_INT_EVENT_1, 0x5}, ++ {OP_ZR, USDM_REG_AGG_INT_EVENT_2, 0x5e}, ++ {OP_WR, USDM_REG_AGG_INT_MODE_0, 0x1}, ++ {OP_ZR, USDM_REG_AGG_INT_MODE_1, 0x1f}, ++ {OP_WR, USDM_REG_ENABLE_IN1, 0x7ffffff}, ++ {OP_WR, USDM_REG_ENABLE_IN2, 0x3f}, ++ {OP_WR, USDM_REG_ENABLE_OUT1, 0x7ffffff}, ++ {OP_WR, USDM_REG_ENABLE_OUT2, 0xf}, ++ {OP_RD, USDM_REG_NUM_OF_Q0_CMD, 0x0}, ++ {OP_RD, USDM_REG_NUM_OF_Q1_CMD, 0x0}, ++ {OP_RD, USDM_REG_NUM_OF_Q2_CMD, 0x0}, ++ {OP_RD, USDM_REG_NUM_OF_Q3_CMD, 0x0}, ++ {OP_RD, USDM_REG_NUM_OF_Q4_CMD, 0x0}, ++ {OP_RD, USDM_REG_NUM_OF_Q5_CMD, 0x0}, ++ {OP_RD, USDM_REG_NUM_OF_Q6_CMD, 0x0}, ++ {OP_RD, USDM_REG_NUM_OF_Q7_CMD, 0x0}, ++ {OP_RD, USDM_REG_NUM_OF_Q8_CMD, 0x0}, ++ {OP_RD, USDM_REG_NUM_OF_Q9_CMD, 0x0}, ++ {OP_RD, USDM_REG_NUM_OF_Q10_CMD, 0x0}, ++ {OP_RD, USDM_REG_NUM_OF_Q11_CMD, 0x0}, ++ {OP_RD, USDM_REG_NUM_OF_PKT_END_MSG, 0x0}, ++ {OP_RD, USDM_REG_NUM_OF_PXP_ASYNC_REQ, 0x0}, ++ {OP_RD, USDM_REG_NUM_OF_ACK_AFTER_PLACE, 0x0}, ++ {OP_WR, USDM_REG_INIT_CREDIT_PXP_CTRL, 0x1}, ++ {OP_WR_ASIC, USDM_REG_TIMER_TICK, 0x3e8}, ++ {OP_WR_EMUL, USDM_REG_TIMER_TICK, 0x1}, ++ {OP_WR_FPGA, USDM_REG_TIMER_TICK, 0xa}, ++/* #define USDM_COMMON_END 353 */ ++/* #define CCM_COMMON_START 374 */ ++ {OP_WR, CCM_REG_XX_OVFL_EVNT_ID, 0x32}, ++ {OP_WR, CCM_REG_CQM_CCM_HDR_P, 0x2150020}, ++ {OP_WR, CCM_REG_CQM_CCM_HDR_S, 0x2150020}, ++ {OP_WR, CCM_REG_ERR_CCM_HDR, 0x8100000}, ++ {OP_WR, CCM_REG_ERR_EVNT_ID, 0x33}, ++ {OP_WR, CCM_REG_STORM_WEIGHT, 0x2}, ++ {OP_WR, CCM_REG_TSEM_WEIGHT, 0x0}, ++ {OP_WR, CCM_REG_XSEM_WEIGHT, 0x5}, ++ {OP_WR, CCM_REG_USEM_WEIGHT, 0x5}, ++ {OP_ZR, CCM_REG_PBF_WEIGHT, 0x2}, ++ {OP_WR, CCM_REG_CSDM_WEIGHT, 0x2}, ++ {OP_WR, CCM_REG_CQM_P_WEIGHT, 0x3}, ++ {OP_WR, CCM_REG_CQM_S_WEIGHT, 0x2}, ++ {OP_WR, CCM_REG_CCM_CQM_USE_Q, 0x1}, ++ {OP_WR, CCM_REG_CNT_AUX1_Q, 0x2}, ++ {OP_WR, CCM_REG_CNT_AUX2_Q, 0x2}, ++ {OP_WR, CCM_REG_INV_DONE_Q, 0x1}, ++ {OP_WR, CCM_REG_GR_ARB_TYPE, 0x1}, ++ {OP_WR, CCM_REG_GR_LD0_PR, 0x1}, ++ {OP_WR, CCM_REG_GR_LD1_PR, 0x2}, ++ {OP_WR, CCM_REG_CFC_INIT_CRD, 0x1}, ++ {OP_WR, CCM_REG_CQM_INIT_CRD, 0x20}, ++ {OP_WR, CCM_REG_FIC0_INIT_CRD, 0x40}, ++ {OP_WR, CCM_REG_FIC1_INIT_CRD, 0x40}, ++ {OP_WR, CCM_REG_XX_INIT_CRD, 0x3}, ++ {OP_WR, CCM_REG_XX_MSG_NUM, 0x18}, ++ {OP_ZR, CCM_REG_XX_TABLE, 0x12}, ++ {OP_SW, CCM_REG_XX_DESCR_TABLE, 0x240243}, ++ {OP_WR, CCM_REG_N_SM_CTX_LD_0, 0x1}, ++ {OP_WR, CCM_REG_N_SM_CTX_LD_1, 0x2}, ++ {OP_WR, CCM_REG_N_SM_CTX_LD_2, 0x8}, ++ {OP_WR, CCM_REG_N_SM_CTX_LD_3, 0x8}, ++ {OP_ZR, CCM_REG_N_SM_CTX_LD_4, 0x4}, ++ {OP_WR, CCM_REG_CCM_REG0_SZ, 0x4}, ++ {OP_WR, CCM_REG_QOS_PHYS_QNUM0_0, 0x9}, ++ {OP_WR, CCM_REG_QOS_PHYS_QNUM0_1, 0x29}, ++ {OP_WR, CCM_REG_QOS_PHYS_QNUM1_0, 0xa}, ++ {OP_WR, CCM_REG_QOS_PHYS_QNUM1_1, 0x2a}, ++ {OP_WR, CCM_REG_QOS_PHYS_QNUM2_0, 0x7}, ++ {OP_WR, CCM_REG_QOS_PHYS_QNUM2_1, 0x27}, ++ {OP_WR, CCM_REG_QOS_PHYS_QNUM3_0, 0x7}, ++ {OP_WR, CCM_REG_QOS_PHYS_QNUM3_1, 0x27}, ++ {OP_WR, CCM_REG_PHYS_QNUM1_0, 0xc}, ++ {OP_WR, CCM_REG_PHYS_QNUM1_1, 0x2c}, ++ {OP_WR, CCM_REG_PHYS_QNUM2_0, 0xc}, ++ {OP_WR, CCM_REG_PHYS_QNUM2_1, 0x2c}, ++ {OP_WR, CCM_REG_PHYS_QNUM3_0, 0xc}, ++ {OP_WR, CCM_REG_PHYS_QNUM3_1, 0x2c}, ++ {OP_WR, CCM_REG_CCM_STORM0_IFEN, 0x1}, ++ {OP_WR, CCM_REG_CCM_STORM1_IFEN, 0x1}, ++ {OP_WR, CCM_REG_CCM_CQM_IFEN, 0x1}, ++ {OP_WR, CCM_REG_STORM_CCM_IFEN, 0x1}, ++ {OP_WR, CCM_REG_CQM_CCM_IFEN, 0x1}, ++ {OP_WR, CCM_REG_CSDM_IFEN, 0x1}, ++ {OP_WR, CCM_REG_TSEM_IFEN, 0x1}, ++ {OP_WR, CCM_REG_XSEM_IFEN, 0x1}, ++ {OP_WR, CCM_REG_USEM_IFEN, 0x1}, ++ {OP_WR, CCM_REG_PBF_IFEN, 0x1}, ++ {OP_WR, CCM_REG_CDU_AG_WR_IFEN, 0x1}, ++ {OP_WR, CCM_REG_CDU_AG_RD_IFEN, 0x1}, ++ {OP_WR, CCM_REG_CDU_SM_WR_IFEN, 0x1}, ++ {OP_WR, CCM_REG_CDU_SM_RD_IFEN, 0x1}, ++ {OP_WR, CCM_REG_CCM_CFC_IFEN, 0x1}, ++/* #define CCM_COMMON_END 375 */ ++/* #define UCM_COMMON_START 396 */ ++ {OP_WR, UCM_REG_XX_OVFL_EVNT_ID, 0x32}, ++ {OP_WR, UCM_REG_UQM_UCM_HDR_P, 0x2150020}, ++ {OP_WR, UCM_REG_UQM_UCM_HDR_S, 0x2150020}, ++ {OP_WR, UCM_REG_TM_UCM_HDR, 0x30}, ++ {OP_WR, UCM_REG_ERR_UCM_HDR, 0x8100000}, ++ {OP_WR, UCM_REG_ERR_EVNT_ID, 0x33}, ++ {OP_WR, UCM_REG_EXPR_EVNT_ID, 0x30}, ++ {OP_WR, UCM_REG_STOP_EVNT_ID, 0x31}, ++ {OP_WR, UCM_REG_STORM_WEIGHT, 0x2}, ++ {OP_WR, UCM_REG_TSEM_WEIGHT, 0x4}, ++ {OP_WR, UCM_REG_CSEM_WEIGHT, 0x0}, ++ {OP_WR, UCM_REG_XSEM_WEIGHT, 0x2}, ++ {OP_WR, UCM_REG_DORQ_WEIGHT, 0x2}, ++ {OP_WR, UCM_REG_CP_WEIGHT, 0x0}, ++ {OP_WR, UCM_REG_USDM_WEIGHT, 0x2}, ++ {OP_WR, UCM_REG_UQM_P_WEIGHT, 0x7}, ++ {OP_WR, UCM_REG_UQM_S_WEIGHT, 0x2}, ++ {OP_WR, UCM_REG_TM_WEIGHT, 0x2}, ++ {OP_WR, UCM_REG_UCM_UQM_USE_Q, 0x1}, ++ {OP_WR, UCM_REG_INV_CFLG_Q, 0x1}, ++ {OP_WR, UCM_REG_GR_ARB_TYPE, 0x1}, ++ {OP_WR, UCM_REG_GR_LD0_PR, 0x1}, ++ {OP_WR, UCM_REG_GR_LD1_PR, 0x2}, ++ {OP_WR, UCM_REG_CFC_INIT_CRD, 0x1}, ++ {OP_WR, UCM_REG_FIC0_INIT_CRD, 0x40}, ++ {OP_WR, UCM_REG_FIC1_INIT_CRD, 0x40}, ++ {OP_WR, UCM_REG_TM_INIT_CRD, 0x4}, ++ {OP_WR, UCM_REG_UQM_INIT_CRD, 0x20}, ++ {OP_WR, UCM_REG_XX_INIT_CRD, 0xe}, ++ {OP_WR, UCM_REG_XX_MSG_NUM, 0x1b}, ++ {OP_ZR, UCM_REG_XX_TABLE, 0x12}, ++ {OP_SW, UCM_REG_XX_DESCR_TABLE, 0x1b0267}, ++ {OP_WR, UCM_REG_N_SM_CTX_LD_0, 0xc}, ++ {OP_WR, UCM_REG_N_SM_CTX_LD_1, 0x7}, ++ {OP_WR, UCM_REG_N_SM_CTX_LD_2, 0xf}, ++ {OP_WR, UCM_REG_N_SM_CTX_LD_3, 0x10}, ++ {OP_ZR, UCM_REG_N_SM_CTX_LD_4, 0x4}, ++ {OP_WR, UCM_REG_UCM_REG0_SZ, 0x3}, ++ {OP_WR, UCM_REG_PHYS_QNUM0_0, 0xf}, ++ {OP_WR, UCM_REG_PHYS_QNUM0_1, 0x2f}, ++ {OP_WR, UCM_REG_PHYS_QNUM1_0, 0xe}, ++ {OP_WR, UCM_REG_PHYS_QNUM1_1, 0x2e}, ++ {OP_WR, UCM_REG_UCM_STORM0_IFEN, 0x1}, ++ {OP_WR, UCM_REG_UCM_STORM1_IFEN, 0x1}, ++ {OP_WR, UCM_REG_UCM_UQM_IFEN, 0x1}, ++ {OP_WR, UCM_REG_STORM_UCM_IFEN, 0x1}, ++ {OP_WR, UCM_REG_UQM_UCM_IFEN, 0x1}, ++ {OP_WR, UCM_REG_USDM_IFEN, 0x1}, ++ {OP_WR, UCM_REG_TM_UCM_IFEN, 0x1}, ++ {OP_WR, UCM_REG_UCM_TM_IFEN, 0x1}, ++ {OP_WR, UCM_REG_TSEM_IFEN, 0x1}, ++ {OP_WR, UCM_REG_CSEM_IFEN, 0x1}, ++ {OP_WR, UCM_REG_XSEM_IFEN, 0x1}, ++ {OP_WR, UCM_REG_DORQ_IFEN, 0x1}, ++ {OP_WR, UCM_REG_CDU_AG_WR_IFEN, 0x1}, ++ {OP_WR, UCM_REG_CDU_AG_RD_IFEN, 0x1}, ++ {OP_WR, UCM_REG_CDU_SM_WR_IFEN, 0x1}, ++ {OP_WR, UCM_REG_CDU_SM_RD_IFEN, 0x1}, ++ {OP_WR, UCM_REG_UCM_CFC_IFEN, 0x1}, ++/* #define UCM_COMMON_END 397 */ ++/* #define USEM_COMMON_START 418 */ ++ {OP_ZP, USEM_REG_INT_TABLE, 0xc90000}, ++ {OP_WR_64, USEM_REG_INT_TABLE + 0x368, 0x130282}, ++ {OP_ZP, USEM_REG_PRAM, 0x34110000}, ++ {OP_ZP, USEM_REG_PRAM + 0x8000, 0x37b70d05}, ++ {OP_ZP, USEM_REG_PRAM + 0x10000, 0x2e7d1af3}, ++ {OP_WR_64, USEM_REG_PRAM + 0x16f40, 0x52180284}, ++ {OP_RD, USEM_REG_MSG_NUM_FIC0, 0x0}, ++ {OP_RD, USEM_REG_MSG_NUM_FIC1, 0x0}, ++ {OP_RD, USEM_REG_MSG_NUM_FOC0, 0x0}, ++ {OP_RD, USEM_REG_MSG_NUM_FOC1, 0x0}, ++ {OP_RD, USEM_REG_MSG_NUM_FOC2, 0x0}, ++ {OP_RD, USEM_REG_MSG_NUM_FOC3, 0x0}, ++ {OP_WR, USEM_REG_ARB_ELEMENT0, 0x1}, ++ {OP_WR, USEM_REG_ARB_ELEMENT1, 0x2}, ++ {OP_WR, USEM_REG_ARB_ELEMENT2, 0x3}, ++ {OP_WR, USEM_REG_ARB_ELEMENT3, 0x0}, ++ {OP_WR, USEM_REG_ARB_ELEMENT4, 0x4}, ++ {OP_WR, USEM_REG_ARB_CYCLE_SIZE, 0x1}, ++ {OP_WR, USEM_REG_TS_0_AS, 0x0}, ++ {OP_WR, USEM_REG_TS_1_AS, 0x1}, ++ {OP_WR, USEM_REG_TS_2_AS, 0x4}, ++ {OP_WR, USEM_REG_TS_3_AS, 0x0}, ++ {OP_WR, USEM_REG_TS_4_AS, 0x1}, ++ {OP_WR, USEM_REG_TS_5_AS, 0x3}, ++ {OP_WR, USEM_REG_TS_6_AS, 0x0}, ++ {OP_WR, USEM_REG_TS_7_AS, 0x1}, ++ {OP_WR, USEM_REG_TS_8_AS, 0x4}, ++ {OP_WR, USEM_REG_TS_9_AS, 0x0}, ++ {OP_WR, USEM_REG_TS_10_AS, 0x1}, ++ {OP_WR, USEM_REG_TS_11_AS, 0x3}, ++ {OP_WR, USEM_REG_TS_12_AS, 0x0}, ++ {OP_WR, USEM_REG_TS_13_AS, 0x1}, ++ {OP_WR, USEM_REG_TS_14_AS, 0x4}, ++ {OP_WR, USEM_REG_TS_15_AS, 0x0}, ++ {OP_WR, USEM_REG_TS_16_AS, 0x4}, ++ {OP_WR, USEM_REG_TS_17_AS, 0x3}, ++ {OP_ZR, USEM_REG_TS_18_AS, 0x2}, ++ {OP_WR, USEM_REG_ENABLE_IN, 0x3fff}, ++ {OP_WR, USEM_REG_ENABLE_OUT, 0x3ff}, ++ {OP_WR, USEM_REG_FIC0_DISABLE, 0x0}, ++ {OP_WR, USEM_REG_FIC1_DISABLE, 0x0}, ++ {OP_WR, USEM_REG_PAS_DISABLE, 0x0}, ++ {OP_WR, USEM_REG_THREADS_LIST, 0xffff}, ++ {OP_ZR, USEM_REG_PASSIVE_BUFFER, 0x800}, ++ {OP_WR, USEM_REG_FAST_MEMORY + 0x18bc0, 0x1}, ++ {OP_WR, USEM_REG_FAST_MEMORY + 0x18000, 0x1a}, ++ {OP_WR, USEM_REG_FAST_MEMORY + 0x18040, 0x4e}, ++ {OP_WR, USEM_REG_FAST_MEMORY + 0x18080, 0x10}, ++ {OP_WR, USEM_REG_FAST_MEMORY + 0x180c0, 0x20}, ++ {OP_WR_ASIC, USEM_REG_FAST_MEMORY + 0x18300, 0x7a120}, ++ {OP_WR_EMUL, USEM_REG_FAST_MEMORY + 0x18300, 0x138}, ++ {OP_WR_FPGA, USEM_REG_FAST_MEMORY + 0x18300, 0x1388}, ++ {OP_WR, USEM_REG_FAST_MEMORY + 0x183c0, 0x1f4}, ++ {OP_WR_ASIC, USEM_REG_FAST_MEMORY + 0x18380, 0x1dcd6500}, ++ {OP_WR_EMUL, USEM_REG_FAST_MEMORY + 0x18380, 0x4c4b4}, ++ {OP_WR_FPGA, USEM_REG_FAST_MEMORY + 0x18380, 0x4c4b40}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x1aa0, 0xc2}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x1020, 0xc8}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x1000, 0x2}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x1400, 0x40}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x5098, 0x4}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x5080, 0x5}, ++ {OP_SW, USEM_REG_FAST_MEMORY + 0x5080 + 0x14, 0x10286}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x5000, 0x20}, ++ {OP_SW, USEM_REG_FAST_MEMORY + 0x2830, 0x20287}, ++ {OP_WR, USEM_REG_FAST_MEMORY + 0x10800, 0x1000000}, ++ {OP_SW, USEM_REG_FAST_MEMORY + 0x10c00, 0x100289}, ++ {OP_WR, USEM_REG_FAST_MEMORY + 0x10800, 0x0}, ++ {OP_SW, USEM_REG_FAST_MEMORY + 0x10c40, 0x100299}, ++/* #define USEM_COMMON_END 419 */ ++/* #define USEM_PORT0_START 420 */ ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x1500, 0xb4}, ++ {OP_WR, USEM_REG_FAST_MEMORY + 0x1dc8, 0x0}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x4000, 0xd8}, ++/* #define USEM_PORT0_END 421 */ ++/* #define USEM_PORT1_START 422 */ ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x17d0, 0xb4}, ++ {OP_WR, USEM_REG_FAST_MEMORY + 0x1dcc, 0x0}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x4360, 0xd8}, ++/* #define USEM_PORT1_END 423 */ ++/* #define CSEM_COMMON_START 440 */ ++ {OP_ZP, CSEM_REG_INT_TABLE, 0x920000}, ++ {OP_WR_64, CSEM_REG_INT_TABLE + 0x380, 0x1002a9}, ++ {OP_ZP, CSEM_REG_PRAM, 0x2cd10000}, ++ {OP_ZP, CSEM_REG_PRAM + 0x8000, 0x2ae40b35}, ++ {OP_WR_64, CSEM_REG_PRAM + 0xdc60, 0x62da02ab}, ++ {OP_RD, CSEM_REG_MSG_NUM_FIC0, 0x0}, ++ {OP_RD, CSEM_REG_MSG_NUM_FIC1, 0x0}, ++ {OP_RD, CSEM_REG_MSG_NUM_FOC0, 0x0}, ++ {OP_RD, CSEM_REG_MSG_NUM_FOC1, 0x0}, ++ {OP_RD, CSEM_REG_MSG_NUM_FOC2, 0x0}, ++ {OP_RD, CSEM_REG_MSG_NUM_FOC3, 0x0}, ++ {OP_WR, CSEM_REG_ARB_ELEMENT0, 0x1}, ++ {OP_WR, CSEM_REG_ARB_ELEMENT1, 0x2}, ++ {OP_WR, CSEM_REG_ARB_ELEMENT2, 0x3}, ++ {OP_WR, CSEM_REG_ARB_ELEMENT3, 0x0}, ++ {OP_WR, CSEM_REG_ARB_ELEMENT4, 0x4}, ++ {OP_WR, CSEM_REG_ARB_CYCLE_SIZE, 0x1}, ++ {OP_WR, CSEM_REG_TS_0_AS, 0x0}, ++ {OP_WR, CSEM_REG_TS_1_AS, 0x1}, ++ {OP_WR, CSEM_REG_TS_2_AS, 0x4}, ++ {OP_WR, CSEM_REG_TS_3_AS, 0x0}, ++ {OP_WR, CSEM_REG_TS_4_AS, 0x1}, ++ {OP_WR, CSEM_REG_TS_5_AS, 0x3}, ++ {OP_WR, CSEM_REG_TS_6_AS, 0x0}, ++ {OP_WR, CSEM_REG_TS_7_AS, 0x1}, ++ {OP_WR, CSEM_REG_TS_8_AS, 0x4}, ++ {OP_WR, CSEM_REG_TS_9_AS, 0x0}, ++ {OP_WR, CSEM_REG_TS_10_AS, 0x1}, ++ {OP_WR, CSEM_REG_TS_11_AS, 0x3}, ++ {OP_WR, CSEM_REG_TS_12_AS, 0x0}, ++ {OP_WR, CSEM_REG_TS_13_AS, 0x1}, ++ {OP_WR, CSEM_REG_TS_14_AS, 0x4}, ++ {OP_WR, CSEM_REG_TS_15_AS, 0x0}, ++ {OP_WR, CSEM_REG_TS_16_AS, 0x4}, ++ {OP_WR, CSEM_REG_TS_17_AS, 0x3}, ++ {OP_ZR, CSEM_REG_TS_18_AS, 0x2}, ++ {OP_WR, CSEM_REG_ENABLE_IN, 0x3fff}, ++ {OP_WR, CSEM_REG_ENABLE_OUT, 0x3ff}, ++ {OP_WR, CSEM_REG_FIC0_DISABLE, 0x0}, ++ {OP_WR, CSEM_REG_FIC1_DISABLE, 0x0}, ++ {OP_WR, CSEM_REG_PAS_DISABLE, 0x0}, ++ {OP_WR, CSEM_REG_THREADS_LIST, 0xffff}, ++ {OP_ZR, CSEM_REG_PASSIVE_BUFFER, 0x800}, ++ {OP_WR, CSEM_REG_FAST_MEMORY + 0x18bc0, 0x1}, ++ {OP_WR, CSEM_REG_FAST_MEMORY + 0x18000, 0x10}, ++ {OP_WR, CSEM_REG_FAST_MEMORY + 0x18040, 0x12}, ++ {OP_WR, CSEM_REG_FAST_MEMORY + 0x18080, 0x30}, ++ {OP_WR, CSEM_REG_FAST_MEMORY + 0x180c0, 0xe}, ++ {OP_WR, CSEM_REG_FAST_MEMORY + 0x183c0, 0x1f4}, ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x5000, 0x42}, ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x1020, 0xc8}, ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x1000, 0x2}, ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x2000, 0xc0}, ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x25c0, 0x240}, ++ {OP_SW, CSEM_REG_FAST_MEMORY + 0x2ec8, 0x802ad}, ++ {OP_WR, CSEM_REG_FAST_MEMORY + 0x10800, 0x13fffff}, ++ {OP_SW, CSEM_REG_FAST_MEMORY + 0x10c00, 0x1002b5}, ++ {OP_WR, CSEM_REG_FAST_MEMORY + 0x10800, 0x0}, ++ {OP_SW, CSEM_REG_FAST_MEMORY + 0x10c40, 0x1002c5}, ++/* #define CSEM_COMMON_END 441 */ ++/* #define CSEM_PORT0_START 442 */ ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x3040, 0xa0}, ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x3540, 0x10}, ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x36c0, 0x30}, ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x4000, 0x200}, ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x35c0, 0x20}, ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x3840, 0x30}, ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x3000, 0x8}, ++ {OP_WR, CSEM_REG_FAST_MEMORY + 0x5118, 0x0}, ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x2300, 0xe}, ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x2410, 0x30}, ++/* #define CSEM_PORT0_END 443 */ ++/* #define CSEM_PORT1_START 444 */ ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x32c0, 0xa0}, ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x3580, 0x10}, ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x3780, 0x30}, ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x4800, 0x200}, ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x3640, 0x20}, ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x3900, 0x30}, ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x3020, 0x8}, ++ {OP_WR, CSEM_REG_FAST_MEMORY + 0x511c, 0x0}, ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x2338, 0xe}, ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x24d0, 0x30}, ++/* #define CSEM_PORT1_END 445 */ ++/* #define XPB_COMMON_START 462 */ ++ {OP_WR, GRCBASE_XPB + PB_REG_CONTROL, 0x28}, ++/* #define XPB_COMMON_END 463 */ ++/* #define DQ_COMMON_START 484 */ ++ {OP_WR, DORQ_REG_MODE_ACT, 0x2}, ++ {OP_WR, DORQ_REG_NORM_CID_OFST, 0x3}, ++ {OP_WR, DORQ_REG_OUTST_REQ, 0x4}, ++ {OP_WR, DORQ_REG_DPM_CID_ADDR, 0x8}, ++ {OP_WR, DORQ_REG_RSP_INIT_CRD, 0x2}, ++ {OP_WR, DORQ_REG_NORM_CMHEAD_TX, 0x90}, ++ {OP_WR, DORQ_REG_CMHEAD_RX, 0x90}, ++ {OP_WR, DORQ_REG_SHRT_CMHEAD, 0x800090}, ++ {OP_WR, DORQ_REG_ERR_CMHEAD, 0x8140000}, ++ {OP_WR, DORQ_REG_AGG_CMD0, 0x8a}, ++ {OP_WR, DORQ_REG_AGG_CMD1, 0x80}, ++ {OP_WR, DORQ_REG_AGG_CMD2, 0x81}, ++ {OP_WR, DORQ_REG_AGG_CMD3, 0x80}, ++ {OP_WR, DORQ_REG_SHRT_ACT_CNT, 0x6}, ++ {OP_WR, DORQ_REG_DQ_FIFO_FULL_TH, 0x7d0}, ++ {OP_WR, DORQ_REG_DQ_FIFO_AFULL_TH, 0x76c}, ++ {OP_WR, DORQ_REG_REGN, 0x7c1004}, ++ {OP_WR, DORQ_REG_IF_EN, 0xf}, ++/* #define DQ_COMMON_END 485 */ ++/* #define TIMERS_COMMON_START 506 */ ++ {OP_ZR, TM_REG_CLIN_PRIOR0_CLIENT, 0x2}, ++ {OP_WR, TM_REG_LIN_SETCLR_FIFO_ALFULL_THR, 0x1c}, ++ {OP_WR, TM_REG_CFC_AC_CRDCNT_VAL, 0x1}, ++ {OP_WR, TM_REG_CFC_CLD_CRDCNT_VAL, 0x1}, ++ {OP_WR, TM_REG_CLOUT_CRDCNT0_VAL, 0x1}, ++ {OP_WR, TM_REG_CLOUT_CRDCNT1_VAL, 0x1}, ++ {OP_WR, TM_REG_CLOUT_CRDCNT2_VAL, 0x1}, ++ {OP_WR, TM_REG_EXP_CRDCNT_VAL, 0x1}, ++ {OP_WR, TM_REG_PCIARB_CRDCNT_VAL, 0x1}, ++ {OP_WR_ASIC, TM_REG_TIMER_TICK_SIZE, 0x3d090}, ++ {OP_WR_EMUL, TM_REG_TIMER_TICK_SIZE, 0x9c}, ++ {OP_WR_FPGA, TM_REG_TIMER_TICK_SIZE, 0x9c4}, ++ {OP_WR, TM_REG_CL0_CONT_REGION, 0x8}, ++ {OP_WR, TM_REG_CL1_CONT_REGION, 0xc}, ++ {OP_WR, TM_REG_CL2_CONT_REGION, 0x10}, ++ {OP_WR, TM_REG_TM_CONTEXT_REGION, 0x20}, ++ {OP_WR, TM_REG_EN_TIMERS, 0x1}, ++ {OP_WR, TM_REG_EN_REAL_TIME_CNT, 0x1}, ++ {OP_WR, TM_REG_EN_CL0_INPUT, 0x1}, ++ {OP_WR, TM_REG_EN_CL1_INPUT, 0x1}, ++ {OP_WR, TM_REG_EN_CL2_INPUT, 0x1}, ++/* #define TIMERS_COMMON_END 507 */ ++/* #define TIMERS_PORT0_START 508 */ ++ {OP_WR, TM_REG_LIN0_LOGIC_ADDR, 0x0}, ++ {OP_WR, TM_REG_LIN0_PHY_ADDR_VALID, 0x0}, ++ {OP_ZR, TM_REG_LIN0_PHY_ADDR, 0x2}, ++/* #define TIMERS_PORT0_END 509 */ ++/* #define TIMERS_PORT1_START 510 */ ++ {OP_WR, TM_REG_LIN1_LOGIC_ADDR, 0x0}, ++ {OP_WR, TM_REG_LIN1_PHY_ADDR_VALID, 0x0}, ++ {OP_ZR, TM_REG_LIN1_PHY_ADDR, 0x2}, ++/* #define TIMERS_PORT1_END 511 */ ++/* #define XSDM_COMMON_START 528 */ ++ {OP_WR, XSDM_REG_CFC_RSP_START_ADDR, 0x614}, ++ {OP_WR, XSDM_REG_CMP_COUNTER_START_ADDR, 0x600}, ++ {OP_WR, XSDM_REG_Q_COUNTER_START_ADDR, 0x604}, ++ {OP_WR, XSDM_REG_CMP_COUNTER_MAX0, 0xffff}, ++ {OP_WR, XSDM_REG_CMP_COUNTER_MAX1, 0xffff}, ++ {OP_WR, XSDM_REG_CMP_COUNTER_MAX2, 0xffff}, ++ {OP_WR, XSDM_REG_CMP_COUNTER_MAX3, 0xffff}, ++ {OP_WR, XSDM_REG_AGG_INT_EVENT_0, 0x20}, ++ {OP_WR, XSDM_REG_AGG_INT_EVENT_1, 0x20}, ++ {OP_WR, XSDM_REG_AGG_INT_EVENT_2, 0x34}, ++ {OP_WR, XSDM_REG_AGG_INT_EVENT_3, 0x35}, ++ {OP_WR, XSDM_REG_AGG_INT_EVENT_4, 0x23}, ++ {OP_WR, XSDM_REG_AGG_INT_EVENT_5, 0x24}, ++ {OP_WR, XSDM_REG_AGG_INT_EVENT_6, 0x25}, ++ {OP_WR, XSDM_REG_AGG_INT_EVENT_7, 0x26}, ++ {OP_WR, XSDM_REG_AGG_INT_EVENT_8, 0x27}, ++ {OP_WR, XSDM_REG_AGG_INT_EVENT_9, 0x29}, ++ {OP_WR, XSDM_REG_AGG_INT_EVENT_10, 0x2a}, ++ {OP_WR, XSDM_REG_AGG_INT_EVENT_11, 0x2b}, ++ {OP_WR, XSDM_REG_AGG_INT_EVENT_12, 0x2c}, ++ {OP_WR, XSDM_REG_AGG_INT_EVENT_13, 0x2d}, ++ {OP_ZR, XSDM_REG_AGG_INT_EVENT_14, 0x52}, ++ {OP_WR, XSDM_REG_AGG_INT_MODE_0, 0x1}, ++ {OP_ZR, XSDM_REG_AGG_INT_MODE_1, 0x1f}, ++ {OP_WR, XSDM_REG_ENABLE_IN1, 0x7ffffff}, ++ {OP_WR, XSDM_REG_ENABLE_IN2, 0x3f}, ++ {OP_WR, XSDM_REG_ENABLE_OUT1, 0x7ffffff}, ++ {OP_WR, XSDM_REG_ENABLE_OUT2, 0xf}, ++ {OP_RD, XSDM_REG_NUM_OF_Q0_CMD, 0x0}, ++ {OP_RD, XSDM_REG_NUM_OF_Q1_CMD, 0x0}, ++ {OP_RD, XSDM_REG_NUM_OF_Q3_CMD, 0x0}, ++ {OP_RD, XSDM_REG_NUM_OF_Q4_CMD, 0x0}, ++ {OP_RD, XSDM_REG_NUM_OF_Q5_CMD, 0x0}, ++ {OP_RD, XSDM_REG_NUM_OF_Q6_CMD, 0x0}, ++ {OP_RD, XSDM_REG_NUM_OF_Q7_CMD, 0x0}, ++ {OP_RD, XSDM_REG_NUM_OF_Q8_CMD, 0x0}, ++ {OP_RD, XSDM_REG_NUM_OF_Q9_CMD, 0x0}, ++ {OP_RD, XSDM_REG_NUM_OF_Q10_CMD, 0x0}, ++ {OP_RD, XSDM_REG_NUM_OF_Q11_CMD, 0x0}, ++ {OP_RD, XSDM_REG_NUM_OF_PKT_END_MSG, 0x0}, ++ {OP_RD, XSDM_REG_NUM_OF_PXP_ASYNC_REQ, 0x0}, ++ {OP_RD, XSDM_REG_NUM_OF_ACK_AFTER_PLACE, 0x0}, ++ {OP_WR, XSDM_REG_INIT_CREDIT_PXP_CTRL, 0x1}, ++ {OP_WR_ASIC, XSDM_REG_TIMER_TICK, 0x3e8}, ++ {OP_WR_EMUL, XSDM_REG_TIMER_TICK, 0x1}, ++ {OP_WR_FPGA, XSDM_REG_TIMER_TICK, 0xa}, ++/* #define XSDM_COMMON_END 529 */ ++/* #define QM_COMMON_START 550 */ ++ {OP_WR, QM_REG_ACTCTRINITVAL_0, 0x6}, ++ {OP_WR, QM_REG_ACTCTRINITVAL_1, 0x5}, ++ {OP_WR, QM_REG_ACTCTRINITVAL_2, 0xa}, ++ {OP_WR, QM_REG_ACTCTRINITVAL_3, 0x5}, ++ {OP_WR, QM_REG_PCIREQAT, 0x2}, ++ {OP_WR, QM_REG_CMINITCRD_0, 0x4}, ++ {OP_WR, QM_REG_CMINITCRD_1, 0x4}, ++ {OP_WR, QM_REG_CMINITCRD_2, 0x4}, ++ {OP_WR, QM_REG_CMINITCRD_3, 0x4}, ++ {OP_WR, QM_REG_CMINITCRD_4, 0x4}, ++ {OP_WR, QM_REG_CMINITCRD_5, 0x4}, ++ {OP_WR, QM_REG_CMINITCRD_6, 0x4}, ++ {OP_WR, QM_REG_CMINITCRD_7, 0x4}, ++ {OP_WR, QM_REG_OUTLDREQ, 0x4}, ++ {OP_WR, QM_REG_CTXREG_0, 0x7c}, ++ {OP_WR, QM_REG_CTXREG_1, 0x3d}, ++ {OP_WR, QM_REG_CTXREG_2, 0x3f}, ++ {OP_WR, QM_REG_CTXREG_3, 0x9c}, ++ {OP_WR, QM_REG_ENSEC, 0x7}, ++ {OP_ZR, QM_REG_QVOQIDX_0, 0x5}, ++ {OP_WR, QM_REG_WRRWEIGHTS_0, 0x1010101}, ++ {OP_WR, QM_REG_QVOQIDX_5, 0x0}, ++ {OP_WR, QM_REG_QVOQIDX_6, 0x4}, ++ {OP_WR, QM_REG_QVOQIDX_7, 0x4}, ++ {OP_WR, QM_REG_QVOQIDX_8, 0x2}, ++ {OP_WR, QM_REG_WRRWEIGHTS_1, 0x8012004}, ++ {OP_WR, QM_REG_QVOQIDX_9, 0x5}, ++ {OP_WR, QM_REG_QVOQIDX_10, 0x5}, ++ {OP_WR, QM_REG_QVOQIDX_11, 0x5}, ++ {OP_WR, QM_REG_QVOQIDX_12, 0x5}, ++ {OP_WR, QM_REG_WRRWEIGHTS_2, 0x20081001}, ++ {OP_WR, QM_REG_QVOQIDX_13, 0x8}, ++ {OP_WR, QM_REG_QVOQIDX_14, 0x6}, ++ {OP_WR, QM_REG_QVOQIDX_15, 0x7}, ++ {OP_WR, QM_REG_QVOQIDX_16, 0x0}, ++ {OP_WR, QM_REG_WRRWEIGHTS_3, 0x1010120}, ++ {OP_ZR, QM_REG_QVOQIDX_17, 0x4}, ++ {OP_WR, QM_REG_WRRWEIGHTS_4, 0x1010101}, ++ {OP_ZR, QM_REG_QVOQIDX_21, 0x4}, ++ {OP_WR, QM_REG_WRRWEIGHTS_5, 0x1010101}, ++ {OP_ZR, QM_REG_QVOQIDX_25, 0x4}, ++ {OP_WR, QM_REG_WRRWEIGHTS_6, 0x1010101}, ++ {OP_ZR, QM_REG_QVOQIDX_29, 0x3}, ++ {OP_WR, QM_REG_QVOQIDX_32, 0x1}, ++ {OP_WR, QM_REG_WRRWEIGHTS_7, 0x1010101}, ++ {OP_WR, QM_REG_QVOQIDX_33, 0x1}, ++ {OP_WR, QM_REG_QVOQIDX_34, 0x1}, ++ {OP_WR, QM_REG_QVOQIDX_35, 0x1}, ++ {OP_WR, QM_REG_QVOQIDX_36, 0x1}, ++ {OP_WR, QM_REG_WRRWEIGHTS_8, 0x1010101}, ++ {OP_WR, QM_REG_QVOQIDX_37, 0x1}, ++ {OP_WR, QM_REG_QVOQIDX_38, 0x4}, ++ {OP_WR, QM_REG_QVOQIDX_39, 0x4}, ++ {OP_WR, QM_REG_QVOQIDX_40, 0x2}, ++ {OP_WR, QM_REG_WRRWEIGHTS_9, 0x8012004}, ++ {OP_WR, QM_REG_QVOQIDX_41, 0x5}, ++ {OP_WR, QM_REG_QVOQIDX_42, 0x5}, ++ {OP_WR, QM_REG_QVOQIDX_43, 0x5}, ++ {OP_WR, QM_REG_QVOQIDX_44, 0x5}, ++ {OP_WR, QM_REG_WRRWEIGHTS_10, 0x20081001}, ++ {OP_WR, QM_REG_QVOQIDX_45, 0x8}, ++ {OP_WR, QM_REG_QVOQIDX_46, 0x6}, ++ {OP_WR, QM_REG_QVOQIDX_47, 0x7}, ++ {OP_WR, QM_REG_QVOQIDX_48, 0x1}, ++ {OP_WR, QM_REG_WRRWEIGHTS_11, 0x1010120}, ++ {OP_WR, QM_REG_QVOQIDX_49, 0x1}, ++ {OP_WR, QM_REG_QVOQIDX_50, 0x1}, ++ {OP_WR, QM_REG_QVOQIDX_51, 0x1}, ++ {OP_WR, QM_REG_QVOQIDX_52, 0x1}, ++ {OP_WR, QM_REG_WRRWEIGHTS_12, 0x1010101}, ++ {OP_WR, QM_REG_QVOQIDX_53, 0x1}, ++ {OP_WR, QM_REG_QVOQIDX_54, 0x1}, ++ {OP_WR, QM_REG_QVOQIDX_55, 0x1}, ++ {OP_WR, QM_REG_QVOQIDX_56, 0x1}, ++ {OP_WR, QM_REG_WRRWEIGHTS_13, 0x1010101}, ++ {OP_WR, QM_REG_QVOQIDX_57, 0x1}, ++ {OP_WR, QM_REG_QVOQIDX_58, 0x1}, ++ {OP_WR, QM_REG_QVOQIDX_59, 0x1}, ++ {OP_WR, QM_REG_QVOQIDX_60, 0x1}, ++ {OP_WR, QM_REG_WRRWEIGHTS_14, 0x1010101}, ++ {OP_WR, QM_REG_QVOQIDX_61, 0x1}, ++ {OP_WR, QM_REG_QVOQIDX_62, 0x1}, ++ {OP_WR, QM_REG_QVOQIDX_63, 0x1}, ++ {OP_WR, QM_REG_WRRWEIGHTS_15, 0x1010101}, ++ {OP_WR, QM_REG_VOQQMASK_0_LSB, 0xffff003f}, ++ {OP_ZR, QM_REG_VOQQMASK_0_MSB, 0x2}, ++ {OP_WR, QM_REG_VOQQMASK_1_MSB, 0xffff003f}, ++ {OP_WR, QM_REG_VOQQMASK_2_LSB, 0x100}, ++ {OP_WR, QM_REG_VOQQMASK_2_MSB, 0x100}, ++ {OP_ZR, QM_REG_VOQQMASK_3_LSB, 0x2}, ++ {OP_WR, QM_REG_VOQQMASK_4_LSB, 0xc0}, ++ {OP_WR, QM_REG_VOQQMASK_4_MSB, 0xc0}, ++ {OP_WR, QM_REG_VOQQMASK_5_LSB, 0x1e00}, ++ {OP_WR, QM_REG_VOQQMASK_5_MSB, 0x1e00}, ++ {OP_WR, QM_REG_VOQQMASK_6_LSB, 0x4000}, ++ {OP_WR, QM_REG_VOQQMASK_6_MSB, 0x4000}, ++ {OP_WR, QM_REG_VOQQMASK_7_LSB, 0x8000}, ++ {OP_WR, QM_REG_VOQQMASK_7_MSB, 0x8000}, ++ {OP_WR, QM_REG_VOQQMASK_8_LSB, 0x2000}, ++ {OP_WR, QM_REG_VOQQMASK_8_MSB, 0x2000}, ++ {OP_ZR, QM_REG_VOQQMASK_9_LSB, 0x7}, ++ {OP_WR, QM_REG_VOQPORT_1, 0x1}, ++ {OP_ZR, QM_REG_VOQPORT_2, 0xa}, ++ {OP_WR, QM_REG_CMINTVOQMASK_0, 0xc08}, ++ {OP_WR, QM_REG_CMINTVOQMASK_1, 0x40}, ++ {OP_WR, QM_REG_CMINTVOQMASK_2, 0x100}, ++ {OP_WR, QM_REG_CMINTVOQMASK_3, 0x20}, ++ {OP_WR, QM_REG_CMINTVOQMASK_4, 0x17}, ++ {OP_WR, QM_REG_CMINTVOQMASK_5, 0x80}, ++ {OP_WR, QM_REG_CMINTVOQMASK_6, 0x200}, ++ {OP_WR, QM_REG_CMINTVOQMASK_7, 0x0}, ++ {OP_WR, QM_REG_HWAEMPTYMASK_LSB, 0xffff01ff}, ++ {OP_WR, QM_REG_HWAEMPTYMASK_MSB, 0xffff01ff}, ++ {OP_WR, QM_REG_ENBYPVOQMASK, 0x13}, ++ {OP_WR, QM_REG_VOQCREDITAFULLTHR, 0x13f}, ++ {OP_WR, QM_REG_VOQINITCREDIT_0, 0x140}, ++ {OP_WR, QM_REG_VOQINITCREDIT_1, 0x140}, ++ {OP_ZR, QM_REG_VOQINITCREDIT_2, 0x2}, ++ {OP_WR, QM_REG_VOQINITCREDIT_4, 0xc0}, ++ {OP_ZR, QM_REG_VOQINITCREDIT_5, 0x7}, ++ {OP_WR, QM_REG_TASKCRDCOST_0, 0x48}, ++ {OP_WR, QM_REG_TASKCRDCOST_1, 0x48}, ++ {OP_ZR, QM_REG_TASKCRDCOST_2, 0x2}, ++ {OP_WR, QM_REG_TASKCRDCOST_4, 0x48}, ++ {OP_ZR, QM_REG_TASKCRDCOST_5, 0x7}, ++ {OP_WR, QM_REG_BYTECRDINITVAL, 0x8000}, ++ {OP_WR, QM_REG_BYTECRDCOST, 0x25e4}, ++ {OP_WR, QM_REG_BYTECREDITAFULLTHR, 0x7fff}, ++ {OP_WR, QM_REG_ENBYTECRD_LSB, 0x7}, ++ {OP_WR, QM_REG_ENBYTECRD_MSB, 0x7}, ++ {OP_WR, QM_REG_BYTECRDPORT_LSB, 0x0}, ++ {OP_WR, QM_REG_BYTECRDPORT_MSB, 0xffffffff}, ++ {OP_WR, QM_REG_FUNCNUMSEL_LSB, 0x0}, ++ {OP_WR, QM_REG_FUNCNUMSEL_MSB, 0xffffffff}, ++ {OP_WR, QM_REG_CMINTEN, 0xff}, ++/* #define QM_COMMON_END 551 */ ++/* #define PBF_COMMON_START 572 */ ++ {OP_WR, PBF_REG_INIT, 0x1}, ++ {OP_WR, PBF_REG_INIT_P4, 0x1}, ++ {OP_WR, PBF_REG_MAC_LB_ENABLE, 0x1}, ++ {OP_WR, PBF_REG_IF_ENABLE_REG, 0x7fff}, ++ {OP_WR, PBF_REG_INIT_P4, 0x0}, ++ {OP_WR, PBF_REG_INIT, 0x0}, ++ {OP_WR, PBF_REG_DISABLE_NEW_TASK_PROC_P4, 0x0}, ++/* #define PBF_COMMON_END 573 */ ++/* #define PBF_PORT0_START 574 */ ++ {OP_WR, PBF_REG_INIT_P0, 0x1}, ++ {OP_WR, PBF_REG_MAC_IF0_ENABLE, 0x1}, ++ {OP_WR, PBF_REG_INIT_P0, 0x0}, ++ {OP_WR, PBF_REG_DISABLE_NEW_TASK_PROC_P0, 0x0}, ++/* #define PBF_PORT0_END 575 */ ++/* #define PBF_PORT1_START 576 */ ++ {OP_WR, PBF_REG_INIT_P1, 0x1}, ++ {OP_WR, PBF_REG_MAC_IF1_ENABLE, 0x1}, ++ {OP_WR, PBF_REG_INIT_P1, 0x0}, ++ {OP_WR, PBF_REG_DISABLE_NEW_TASK_PROC_P1, 0x0}, ++/* #define PBF_PORT1_END 577 */ ++/* #define XCM_COMMON_START 594 */ ++ {OP_WR, XCM_REG_XX_OVFL_EVNT_ID, 0x32}, ++ {OP_WR, XCM_REG_XQM_XCM_HDR_P, 0x3150020}, ++ {OP_WR, XCM_REG_XQM_XCM_HDR_S, 0x3150020}, ++ {OP_WR, XCM_REG_TM_XCM_HDR, 0x1000030}, ++ {OP_WR, XCM_REG_ERR_XCM_HDR, 0x8100000}, ++ {OP_WR, XCM_REG_ERR_EVNT_ID, 0x33}, ++ {OP_WR, XCM_REG_EXPR_EVNT_ID, 0x30}, ++ {OP_WR, XCM_REG_STOP_EVNT_ID, 0x31}, ++ {OP_WR, XCM_REG_STORM_WEIGHT, 0x3}, ++ {OP_WR, XCM_REG_TSEM_WEIGHT, 0x6}, ++ {OP_WR, XCM_REG_CSEM_WEIGHT, 0x3}, ++ {OP_WR, XCM_REG_USEM_WEIGHT, 0x3}, ++ {OP_WR, XCM_REG_DORQ_WEIGHT, 0x2}, ++ {OP_WR, XCM_REG_PBF_WEIGHT, 0x0}, ++ {OP_WR, XCM_REG_NIG0_WEIGHT, 0x2}, ++ {OP_WR, XCM_REG_CP_WEIGHT, 0x0}, ++ {OP_WR, XCM_REG_XSDM_WEIGHT, 0x6}, ++ {OP_WR, XCM_REG_XQM_P_WEIGHT, 0x4}, ++ {OP_WR, XCM_REG_XQM_S_WEIGHT, 0x2}, ++ {OP_WR, XCM_REG_TM_WEIGHT, 0x2}, ++ {OP_WR, XCM_REG_XCM_XQM_USE_Q, 0x1}, ++ {OP_WR, XCM_REG_XQM_BYP_ACT_UPD, 0x6}, ++ {OP_WR, XCM_REG_UNA_GT_NXT_Q, 0x0}, ++ {OP_WR, XCM_REG_AUX1_Q, 0x2}, ++ {OP_WR, XCM_REG_AUX_CNT_FLG_Q_19, 0x1}, ++ {OP_WR, XCM_REG_GR_ARB_TYPE, 0x1}, ++ {OP_WR, XCM_REG_GR_LD0_PR, 0x1}, ++ {OP_WR, XCM_REG_GR_LD1_PR, 0x2}, ++ {OP_WR, XCM_REG_CFC_INIT_CRD, 0x1}, ++ {OP_WR, XCM_REG_FIC0_INIT_CRD, 0x40}, ++ {OP_WR, XCM_REG_FIC1_INIT_CRD, 0x40}, ++ {OP_WR, XCM_REG_TM_INIT_CRD, 0x4}, ++ {OP_WR, XCM_REG_XQM_INIT_CRD, 0x20}, ++ {OP_WR, XCM_REG_XX_INIT_CRD, 0x2}, ++ {OP_WR, XCM_REG_XX_MSG_NUM, 0x1f}, ++ {OP_ZR, XCM_REG_XX_TABLE, 0x12}, ++ {OP_SW, XCM_REG_XX_DESCR_TABLE, 0x1f02d5}, ++ {OP_WR, XCM_REG_N_SM_CTX_LD_0, 0xf}, ++ {OP_WR, XCM_REG_N_SM_CTX_LD_1, 0x7}, ++ {OP_WR, XCM_REG_N_SM_CTX_LD_2, 0xb}, ++ {OP_WR, XCM_REG_N_SM_CTX_LD_3, 0xe}, ++ {OP_ZR, XCM_REG_N_SM_CTX_LD_4, 0x4}, ++ {OP_WR, XCM_REG_XCM_REG0_SZ, 0x4}, ++ {OP_WR, XCM_REG_XCM_STORM0_IFEN, 0x1}, ++ {OP_WR, XCM_REG_XCM_STORM1_IFEN, 0x1}, ++ {OP_WR, XCM_REG_XCM_XQM_IFEN, 0x1}, ++ {OP_WR, XCM_REG_STORM_XCM_IFEN, 0x1}, ++ {OP_WR, XCM_REG_XQM_XCM_IFEN, 0x1}, ++ {OP_WR, XCM_REG_XSDM_IFEN, 0x1}, ++ {OP_WR, XCM_REG_TM_XCM_IFEN, 0x1}, ++ {OP_WR, XCM_REG_XCM_TM_IFEN, 0x1}, ++ {OP_WR, XCM_REG_TSEM_IFEN, 0x1}, ++ {OP_WR, XCM_REG_CSEM_IFEN, 0x1}, ++ {OP_WR, XCM_REG_USEM_IFEN, 0x1}, ++ {OP_WR, XCM_REG_DORQ_IFEN, 0x1}, ++ {OP_WR, XCM_REG_PBF_IFEN, 0x1}, ++ {OP_WR, XCM_REG_NIG0_IFEN, 0x1}, ++ {OP_WR, XCM_REG_NIG1_IFEN, 0x1}, ++ {OP_WR, XCM_REG_CDU_AG_WR_IFEN, 0x1}, ++ {OP_WR, XCM_REG_CDU_AG_RD_IFEN, 0x1}, ++ {OP_WR, XCM_REG_CDU_SM_WR_IFEN, 0x1}, ++ {OP_WR, XCM_REG_CDU_SM_RD_IFEN, 0x1}, ++ {OP_WR, XCM_REG_XCM_CFC_IFEN, 0x1}, ++/* #define XCM_COMMON_END 595 */ ++/* #define XCM_PORT0_START 596 */ ++ {OP_WR, XCM_REG_GLB_DEL_ACK_TMR_VAL_0, 0xc8}, ++ {OP_WR, XCM_REG_GLB_DEL_ACK_MAX_CNT_0, 0x2}, ++ {OP_WR, XCM_REG_WU_DA_SET_TMR_CNT_FLG_CMD00, 0x0}, ++ {OP_WR, XCM_REG_WU_DA_SET_TMR_CNT_FLG_CMD10, 0x0}, ++ {OP_WR, XCM_REG_WU_DA_CNT_CMD00, 0x2}, ++ {OP_WR, XCM_REG_WU_DA_CNT_CMD10, 0x2}, ++ {OP_WR, XCM_REG_WU_DA_CNT_UPD_VAL00, 0xff}, ++ {OP_WR, XCM_REG_WU_DA_CNT_UPD_VAL10, 0xff}, ++/* #define XCM_PORT0_END 597 */ ++/* #define XCM_PORT1_START 598 */ ++ {OP_WR, XCM_REG_GLB_DEL_ACK_TMR_VAL_1, 0xc8}, ++ {OP_WR, XCM_REG_GLB_DEL_ACK_MAX_CNT_1, 0x2}, ++ {OP_WR, XCM_REG_WU_DA_SET_TMR_CNT_FLG_CMD01, 0x0}, ++ {OP_WR, XCM_REG_WU_DA_SET_TMR_CNT_FLG_CMD11, 0x0}, ++ {OP_WR, XCM_REG_WU_DA_CNT_CMD01, 0x2}, ++ {OP_WR, XCM_REG_WU_DA_CNT_CMD11, 0x2}, ++ {OP_WR, XCM_REG_WU_DA_CNT_UPD_VAL01, 0xff}, ++ {OP_WR, XCM_REG_WU_DA_CNT_UPD_VAL11, 0xff}, ++/* #define XCM_PORT1_END 599 */ ++/* #define XSEM_COMMON_START 616 */ ++ {OP_ZP, XSEM_REG_INT_TABLE, 0xb50000}, ++ {OP_WR_64, XSEM_REG_INT_TABLE + 0x368, 0x1302f4}, ++ {OP_ZP, XSEM_REG_PRAM, 0x35dc0000}, ++ {OP_ZP, XSEM_REG_PRAM + 0x8000, 0x3a440d78}, ++ {OP_ZP, XSEM_REG_PRAM + 0x10000, 0x3b701c0a}, ++ {OP_ZP, XSEM_REG_PRAM + 0x18000, 0x22622ae7}, ++ {OP_WR_64, XSEM_REG_PRAM + 0x1c6e0, 0x472402f6}, ++ {OP_RD, XSEM_REG_MSG_NUM_FIC0, 0x0}, ++ {OP_RD, XSEM_REG_MSG_NUM_FIC1, 0x0}, ++ {OP_RD, XSEM_REG_MSG_NUM_FOC0, 0x0}, ++ {OP_RD, XSEM_REG_MSG_NUM_FOC1, 0x0}, ++ {OP_RD, XSEM_REG_MSG_NUM_FOC2, 0x0}, ++ {OP_RD, XSEM_REG_MSG_NUM_FOC3, 0x0}, ++ {OP_WR, XSEM_REG_ARB_ELEMENT0, 0x1}, ++ {OP_WR, XSEM_REG_ARB_ELEMENT1, 0x2}, ++ {OP_WR, XSEM_REG_ARB_ELEMENT2, 0x3}, ++ {OP_WR, XSEM_REG_ARB_ELEMENT3, 0x0}, ++ {OP_WR, XSEM_REG_ARB_ELEMENT4, 0x4}, ++ {OP_WR, XSEM_REG_ARB_CYCLE_SIZE, 0x1}, ++ {OP_WR, XSEM_REG_TS_0_AS, 0x0}, ++ {OP_WR, XSEM_REG_TS_1_AS, 0x1}, ++ {OP_WR, XSEM_REG_TS_2_AS, 0x4}, ++ {OP_WR, XSEM_REG_TS_3_AS, 0x0}, ++ {OP_WR, XSEM_REG_TS_4_AS, 0x1}, ++ {OP_WR, XSEM_REG_TS_5_AS, 0x3}, ++ {OP_WR, XSEM_REG_TS_6_AS, 0x0}, ++ {OP_WR, XSEM_REG_TS_7_AS, 0x1}, ++ {OP_WR, XSEM_REG_TS_8_AS, 0x4}, ++ {OP_WR, XSEM_REG_TS_9_AS, 0x0}, ++ {OP_WR, XSEM_REG_TS_10_AS, 0x1}, ++ {OP_WR, XSEM_REG_TS_11_AS, 0x3}, ++ {OP_WR, XSEM_REG_TS_12_AS, 0x0}, ++ {OP_WR, XSEM_REG_TS_13_AS, 0x1}, ++ {OP_WR, XSEM_REG_TS_14_AS, 0x4}, ++ {OP_WR, XSEM_REG_TS_15_AS, 0x0}, ++ {OP_WR, XSEM_REG_TS_16_AS, 0x4}, ++ {OP_WR, XSEM_REG_TS_17_AS, 0x3}, ++ {OP_ZR, XSEM_REG_TS_18_AS, 0x2}, ++ {OP_WR, XSEM_REG_ENABLE_IN, 0x3fff}, ++ {OP_WR, XSEM_REG_ENABLE_OUT, 0x3ff}, ++ {OP_WR, XSEM_REG_FIC0_DISABLE, 0x0}, ++ {OP_WR, XSEM_REG_FIC1_DISABLE, 0x0}, ++ {OP_WR, XSEM_REG_PAS_DISABLE, 0x0}, ++ {OP_WR, XSEM_REG_THREADS_LIST, 0xffff}, ++ {OP_ZR, XSEM_REG_PASSIVE_BUFFER, 0x800}, ++ {OP_WR, XSEM_REG_FAST_MEMORY + 0x18bc0, 0x1}, ++ {OP_WR, XSEM_REG_FAST_MEMORY + 0x18000, 0x0}, ++ {OP_WR, XSEM_REG_FAST_MEMORY + 0x18040, 0x18}, ++ {OP_WR, XSEM_REG_FAST_MEMORY + 0x18080, 0xc}, ++ {OP_WR, XSEM_REG_FAST_MEMORY + 0x180c0, 0x66}, ++ {OP_WR_ASIC, XSEM_REG_FAST_MEMORY + 0x18300, 0x7a120}, ++ {OP_WR_EMUL, XSEM_REG_FAST_MEMORY + 0x18300, 0x138}, ++ {OP_WR_FPGA, XSEM_REG_FAST_MEMORY + 0x18300, 0x1388}, ++ {OP_WR, XSEM_REG_FAST_MEMORY + 0x183c0, 0x1f4}, ++ {OP_WR_ASIC, XSEM_REG_FAST_MEMORY + 0x18340, 0x1f4}, ++ {OP_WR_EMUL, XSEM_REG_FAST_MEMORY + 0x18340, 0x0}, ++ {OP_WR_FPGA, XSEM_REG_FAST_MEMORY + 0x18340, 0x5}, ++ {OP_WR_EMUL, XSEM_REG_FAST_MEMORY + 0x18380, 0x4c4b4}, ++ {OP_WR_ASIC, XSEM_REG_FAST_MEMORY + 0x18380, 0x1dcd6500}, ++ {OP_WR_FPGA, XSEM_REG_FAST_MEMORY + 0x18380, 0x4c4b40}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x3c40, 0x4}, ++ {OP_SW, XSEM_REG_FAST_MEMORY + 0x3c40 + 0x10, 0x202f8}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x3000, 0x48}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x1020, 0xc8}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x1000, 0x2}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x3128, 0x8e}, ++ {OP_WR, XSEM_REG_FAST_MEMORY + 0x3368, 0x0}, ++ {OP_SW, XSEM_REG_FAST_MEMORY + 0x3370, 0x202fa}, ++ {OP_SW, XSEM_REG_FAST_MEMORY + 0x3a70, 0x402fc}, ++ {OP_SW, XSEM_REG_FAST_MEMORY + 0x3d00, 0x20300}, ++ {OP_SW, XSEM_REG_FAST_MEMORY + 0x1500, 0x20302}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x1500 + 0x8, 0x100}, ++ {OP_WR, XSEM_REG_FAST_MEMORY + 0x1970, 0x0}, ++ {OP_WR, XSEM_REG_FAST_MEMORY + 0x1978, 0x0}, ++ {OP_SW, XSEM_REG_FAST_MEMORY + 0x1960, 0x20304}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x4ac0, 0x2}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x4b00, 0x4}, ++ {OP_SW, XSEM_REG_FAST_MEMORY + 0x1f48, 0x20306}, ++ {OP_WR, XSEM_REG_FAST_MEMORY + 0x10800, 0x0}, ++ {OP_SW, XSEM_REG_FAST_MEMORY + 0x10c00, 0x100308}, ++ {OP_WR, XSEM_REG_FAST_MEMORY + 0x10800, 0x1000000}, ++ {OP_SW, XSEM_REG_FAST_MEMORY + 0x10c40, 0x80318}, ++ {OP_WR, XSEM_REG_FAST_MEMORY + 0x10800, 0x2000000}, ++ {OP_SW, XSEM_REG_FAST_MEMORY + 0x10c60, 0x80320}, ++/* #define XSEM_COMMON_END 617 */ ++/* #define XSEM_PORT0_START 618 */ ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x3a80, 0x14}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x3b20, 0x24}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x1400, 0xa}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x1450, 0x6}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x3378, 0xd8}, ++ {OP_WR, XSEM_REG_FAST_MEMORY + 0x3a38, 0x0}, ++ {OP_SW, XSEM_REG_FAST_MEMORY + 0x3c58, 0x20328}, ++ {OP_SW, XSEM_REG_FAST_MEMORY + 0x3c68, 0x10032a}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x5020, 0x2}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x5030, 0x2}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x5000, 0x2}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x5010, 0x2}, ++ {OP_WR, XSEM_REG_FAST_MEMORY + 0x5040, 0x0}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x5048, 0xe}, ++ {OP_WR, XSEM_REG_FAST_MEMORY + 0x50b8, 0x1}, ++ {OP_SW, XSEM_REG_FAST_MEMORY + 0x4ac8, 0x2033a}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x4b10, 0x42}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x4d20, 0x4}, ++/* #define XSEM_PORT0_END 619 */ ++/* #define XSEM_PORT1_START 620 */ ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x3ad0, 0x14}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x3bb0, 0x24}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x1428, 0xa}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x1468, 0x6}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x36d8, 0xd8}, ++ {OP_WR, XSEM_REG_FAST_MEMORY + 0x3a3c, 0x0}, ++ {OP_SW, XSEM_REG_FAST_MEMORY + 0x3c60, 0x2033c}, ++ {OP_SW, XSEM_REG_FAST_MEMORY + 0x3ca8, 0x10033e}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x5028, 0x2}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x5038, 0x2}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x5008, 0x2}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x5018, 0x2}, ++ {OP_WR, XSEM_REG_FAST_MEMORY + 0x5044, 0x0}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x5080, 0xe}, ++ {OP_WR, XSEM_REG_FAST_MEMORY + 0x50bc, 0x1}, ++ {OP_SW, XSEM_REG_FAST_MEMORY + 0x4ad0, 0x2034e}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x4c18, 0x42}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x4d30, 0x4}, ++/* #define XSEM_PORT1_END 621 */ ++/* #define CDU_COMMON_START 638 */ ++ {OP_WR, CDU_REG_CDU_CONTROL0, 0x1}, ++ {OP_WR, CDU_REG_CDU_DEBUG, 0x264}, ++ {OP_WR, CDU_REG_CDU_CHK_MASK0, 0x3d000}, ++ {OP_WR, CDU_REG_CDU_CHK_MASK1, 0x3d}, ++ {OP_WB, CDU_REG_L1TT, 0x2000350}, ++ {OP_WB, CDU_REG_MATT, 0x200550}, ++ {OP_ZR, CDU_REG_MATT + 0x80, 0x2}, ++ {OP_WB, CDU_REG_MATT + 0x88, 0x60570}, ++ {OP_ZR, CDU_REG_MATT + 0xa0, 0x18}, ++ {OP_WR, CDU_REG_CDU_DEBUG, 0x0}, ++/* #define CDU_COMMON_END 639 */ ++/* #define DMAE_COMMON_START 660 */ ++ {OP_ZR, DMAE_REG_CMD_MEM, 0xe0}, ++ {OP_WR, DMAE_REG_CRC16C_INIT, 0x0}, ++ {OP_WR, DMAE_REG_CRC16T10_INIT, 0x1}, ++ {OP_WR, DMAE_REG_PXP_REQ_INIT_CRD, 0x1}, ++ {OP_WR, DMAE_REG_PCI_IFEN, 0x1}, ++ {OP_WR, DMAE_REG_GRC_IFEN, 0x1}, ++/* #define DMAE_COMMON_END 661 */ ++/* #define PXP_COMMON_START 682 */ ++ {OP_WB, PXP_REG_HST_INBOUND_INT + 0x400, 0x50576}, ++ {OP_WB, PXP_REG_HST_INBOUND_INT + 0x420, 0x5057b}, ++ {OP_WB, PXP_REG_HST_INBOUND_INT, 0x50580}, ++/* #define PXP_COMMON_END 683 */ ++/* #define CFC_COMMON_START 704 */ ++ {OP_WR, CFC_REG_CONTROL0, 0x10}, ++ {OP_WR, CFC_REG_DISABLE_ON_ERROR, 0x3fff}, ++ {OP_WR, CFC_REG_INTERFACES, 0x280000}, ++ {OP_WR, CFC_REG_LCREQ_WEIGHTS, 0x84924a}, ++ {OP_WR, CFC_REG_INTERFACES, 0x0}, ++/* #define CFC_COMMON_END 705 */ ++/* #define HC_COMMON_START 726 */ ++ {OP_ZR, HC_REG_USTORM_ADDR_FOR_COALESCE, 0x4}, ++/* #define HC_COMMON_END 727 */ ++/* #define HC_PORT0_START 728 */ ++ {OP_WR, HC_REG_CONFIG_0, 0x1080}, ++ {OP_ZR, HC_REG_UC_RAM_ADDR_0, 0x2}, ++ {OP_WR, HC_REG_ATTN_NUM_P0, 0x10}, ++ {OP_WR, HC_REG_LEADING_EDGE_0, 0xffff}, ++ {OP_WR, HC_REG_TRAILING_EDGE_0, 0xffff}, ++ {OP_WR, HC_REG_AGG_INT_0, 0x0}, ++ {OP_WR, HC_REG_ATTN_IDX, 0x0}, ++ {OP_ZR, HC_REG_ATTN_BIT, 0x2}, ++ {OP_WR, HC_REG_VQID_0, 0x2b5}, ++ {OP_WR, HC_REG_PCI_CONFIG_0, 0x0}, ++ {OP_ZR, HC_REG_P0_PROD_CONS, 0x4a}, ++ {OP_WR, HC_REG_INT_MASK, 0x1ffff}, ++ {OP_ZR, HC_REG_PBA_COMMAND, 0x2}, ++ {OP_WR, HC_REG_CONFIG_0, 0x1a80}, ++ {OP_ZR, HC_REG_STATISTIC_COUNTERS, 0x24}, ++ {OP_ZR, HC_REG_STATISTIC_COUNTERS + 0x120, 0x4a}, ++ {OP_ZR, HC_REG_STATISTIC_COUNTERS + 0x370, 0x4a}, ++ {OP_ZR, HC_REG_STATISTIC_COUNTERS + 0x5c0, 0x4a}, ++/* #define HC_PORT0_END 729 */ ++/* #define HC_PORT1_START 730 */ ++ {OP_WR, HC_REG_CONFIG_1, 0x1080}, ++ {OP_ZR, HC_REG_UC_RAM_ADDR_1, 0x2}, ++ {OP_WR, HC_REG_ATTN_NUM_P1, 0x10}, ++ {OP_WR, HC_REG_LEADING_EDGE_1, 0xffff}, ++ {OP_WR, HC_REG_TRAILING_EDGE_1, 0xffff}, ++ {OP_WR, HC_REG_AGG_INT_1, 0x0}, ++ {OP_WR, HC_REG_ATTN_IDX + 0x4, 0x0}, ++ {OP_ZR, HC_REG_ATTN_BIT + 0x8, 0x2}, ++ {OP_WR, HC_REG_VQID_1, 0x2b5}, ++ {OP_WR, HC_REG_PCI_CONFIG_1, 0x0}, ++ {OP_ZR, HC_REG_P1_PROD_CONS, 0x4a}, ++ {OP_WR, HC_REG_INT_MASK + 0x4, 0x1ffff}, ++ {OP_ZR, HC_REG_PBA_COMMAND + 0x8, 0x2}, ++ {OP_WR, HC_REG_CONFIG_1, 0x1a80}, ++ {OP_ZR, HC_REG_STATISTIC_COUNTERS + 0x90, 0x24}, ++ {OP_ZR, HC_REG_STATISTIC_COUNTERS + 0x248, 0x4a}, ++ {OP_ZR, HC_REG_STATISTIC_COUNTERS + 0x498, 0x4a}, ++ {OP_ZR, HC_REG_STATISTIC_COUNTERS + 0x6e8, 0x4a}, ++/* #define HC_PORT1_END 731 */ ++/* #define PXP2_COMMON_START 748 */ ++ {OP_WR, PXP2_REG_PGL_CONTROL0, 0xe38340}, ++ {OP_WR, PXP2_REG_PGL_CONTROL1, 0x3c10}, ++ {OP_WR, PXP2_REG_PGL_DEBUG, 0x2}, ++ {OP_WR, PXP2_REG_PGL_INT_TSDM_0, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_TSDM_1, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_TSDM_2, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_TSDM_3, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_TSDM_4, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_TSDM_5, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_TSDM_6, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_TSDM_7, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_USDM_1, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_USDM_2, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_USDM_3, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_USDM_4, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_USDM_5, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_USDM_6, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_USDM_7, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_XSDM_2, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_XSDM_3, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_XSDM_4, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_XSDM_5, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_XSDM_6, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_XSDM_7, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_CSDM_0, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_CSDM_1, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_CSDM_2, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_CSDM_3, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_CSDM_4, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_CSDM_5, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_CSDM_6, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_CSDM_7, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_XSDM_0, 0xffff3330}, ++ {OP_WR, PXP2_REG_PGL_INT_XSDM_1, 0xffff3340}, ++ {OP_WR, PXP2_REG_PGL_INT_USDM_0, 0xf0003000}, ++ {OP_WR, PXP2_REG_RD_MAX_BLKS_VQ6, 0x8}, ++ {OP_WR, PXP2_REG_RD_MAX_BLKS_VQ9, 0x8}, ++ {OP_ZR, PXP2_REG_RD_MAX_BLKS_VQ10, 0x2}, ++ {OP_WR, PXP2_REG_RD_MAX_BLKS_VQ17, 0x4}, ++ {OP_WR, PXP2_REG_RD_MAX_BLKS_VQ19, 0x4}, ++ {OP_WR, PXP2_REG_RD_MAX_BLKS_VQ22, 0x0}, ++ {OP_WR, PXP2_REG_RD_MAX_BLKS_VQ25, 0x0}, ++ {OP_WR, PXP2_REG_RD_START_INIT, 0x1}, ++ {OP_WR, PXP2_REG_WR_DMAE_TH, 0x3f}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_ADD0, 0x40}, ++ {OP_WR, PXP2_REG_PSWRQ_BW_ADD1, 0x1808}, ++ {OP_WR, PXP2_REG_PSWRQ_BW_ADD2, 0x803}, ++ {OP_WR, PXP2_REG_PSWRQ_BW_ADD3, 0x803}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_ADD4, 0x40}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_ADD5, 0x3}, ++ {OP_WR, PXP2_REG_PSWRQ_BW_ADD6, 0x803}, ++ {OP_WR, PXP2_REG_PSWRQ_BW_ADD7, 0x803}, ++ {OP_WR, PXP2_REG_PSWRQ_BW_ADD8, 0x803}, ++ {OP_WR, PXP2_REG_PSWRQ_BW_ADD9, 0x10003}, ++ {OP_WR, PXP2_REG_PSWRQ_BW_ADD10, 0x803}, ++ {OP_WR, PXP2_REG_PSWRQ_BW_ADD11, 0x803}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_ADD12, 0x3}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_ADD13, 0x3}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_ADD14, 0x3}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_ADD15, 0x3}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_ADD16, 0x3}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_ADD17, 0x3}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_ADD18, 0x3}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_ADD19, 0x3}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_ADD20, 0x3}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_ADD22, 0x3}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_ADD23, 0x3}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_ADD24, 0x3}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_ADD25, 0x3}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_ADD26, 0x3}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_ADD27, 0x3}, ++ {OP_WR, PXP2_REG_PSWRQ_BW_ADD28, 0x2403}, ++ {OP_WR, PXP2_REG_RQ_BW_WR_ADD29, 0x2f}, ++ {OP_WR, PXP2_REG_RQ_BW_WR_ADD30, 0x9}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_UBOUND0, 0x19}, ++ {OP_WR, PXP2_REG_PSWRQ_BW_UB1, 0x184}, ++ {OP_WR, PXP2_REG_PSWRQ_BW_UB2, 0x183}, ++ {OP_WR, PXP2_REG_PSWRQ_BW_UB3, 0x306}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_UBOUND4, 0x19}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_UBOUND5, 0x6}, ++ {OP_WR, PXP2_REG_PSWRQ_BW_UB6, 0x306}, ++ {OP_WR, PXP2_REG_PSWRQ_BW_UB7, 0x306}, ++ {OP_WR, PXP2_REG_PSWRQ_BW_UB8, 0x306}, ++ {OP_WR, PXP2_REG_PSWRQ_BW_UB9, 0xc86}, ++ {OP_WR, PXP2_REG_PSWRQ_BW_UB10, 0x306}, ++ {OP_WR, PXP2_REG_PSWRQ_BW_UB11, 0x306}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_UBOUND12, 0x6}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_UBOUND13, 0x6}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_UBOUND14, 0x6}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_UBOUND15, 0x6}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_UBOUND16, 0x6}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_UBOUND17, 0x6}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_UBOUND18, 0x6}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_UBOUND19, 0x6}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_UBOUND20, 0x6}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_UBOUND22, 0x6}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_UBOUND23, 0x6}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_UBOUND24, 0x6}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_UBOUND25, 0x6}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_UBOUND26, 0x6}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_UBOUND27, 0x6}, ++ {OP_WR, PXP2_REG_PSWRQ_BW_UB28, 0x306}, ++ {OP_WR, PXP2_REG_RQ_BW_WR_UBOUND29, 0x13}, ++ {OP_WR, PXP2_REG_RQ_BW_WR_UBOUND30, 0x6}, ++ {OP_WR, PXP2_REG_PSWRQ_BW_L1, 0x1004}, ++ {OP_WR, PXP2_REG_PSWRQ_BW_L2, 0x1004}, ++ {OP_WR, PXP2_REG_PSWRQ_BW_RD, 0x106440}, ++ {OP_WR, PXP2_REG_PSWRQ_BW_WR, 0x106440}, ++ {OP_WR, PXP2_REG_RQ_RBC_DONE, 0x1}, ++/* #define PXP2_COMMON_END 749 */ ++/* #define MISC_AEU_COMMON_START 770 */ ++ {OP_ZR, MISC_REG_AEU_GENERAL_ATTN_0, 0x16}, ++/* #define MISC_AEU_COMMON_END 771 */ ++/* #define MISC_AEU_PORT0_START 772 */ ++ {OP_WR, MISC_REG_AEU_ENABLE1_FUNC_0_OUT_0, 0xbf5c0000}, ++ {OP_WR, MISC_REG_AEU_ENABLE2_FUNC_0_OUT_0, 0xfff51fef}, ++ {OP_WR, MISC_REG_AEU_ENABLE3_FUNC_0_OUT_0, 0xffff}, ++ {OP_WR, MISC_REG_AEU_ENABLE4_FUNC_0_OUT_0, 0x500003e0}, ++ {OP_WR, MISC_REG_AEU_ENABLE1_FUNC_0_OUT_1, 0x0}, ++ {OP_WR, MISC_REG_AEU_ENABLE2_FUNC_0_OUT_1, 0xa000}, ++ {OP_ZR, MISC_REG_AEU_ENABLE3_FUNC_0_OUT_1, 0x5}, ++ {OP_WR, MISC_REG_AEU_ENABLE4_FUNC_0_OUT_2, 0xfe00000}, ++ {OP_ZR, MISC_REG_AEU_ENABLE1_FUNC_0_OUT_3, 0x14}, ++ {OP_WR, MISC_REG_AEU_ENABLE1_NIG_0, 0x55540000}, ++ {OP_WR, MISC_REG_AEU_ENABLE2_NIG_0, 0x55555555}, ++ {OP_WR, MISC_REG_AEU_ENABLE3_NIG_0, 0x5555}, ++ {OP_WR, MISC_REG_AEU_ENABLE4_NIG_0, 0x0}, ++ {OP_WR, MISC_REG_AEU_ENABLE1_PXP_0, 0x55540000}, ++ {OP_WR, MISC_REG_AEU_ENABLE2_PXP_0, 0x55555555}, ++ {OP_WR, MISC_REG_AEU_ENABLE3_PXP_0, 0x5555}, ++ {OP_WR, MISC_REG_AEU_ENABLE4_PXP_0, 0x0}, ++ {OP_WR, MISC_REG_AEU_INVERTER_1_FUNC_0, 0x0}, ++ {OP_ZR, MISC_REG_AEU_INVERTER_2_FUNC_0, 0x3}, ++ {OP_WR, MISC_REG_AEU_MASK_ATTN_FUNC_0, 0x7}, ++/* #define MISC_AEU_PORT0_END 773 */ ++/* #define MISC_AEU_PORT1_START 774 */ ++ {OP_WR, MISC_REG_AEU_ENABLE1_FUNC_1_OUT_0, 0xbf5c0000}, ++ {OP_WR, MISC_REG_AEU_ENABLE2_FUNC_1_OUT_0, 0xfff51fef}, ++ {OP_WR, MISC_REG_AEU_ENABLE3_FUNC_1_OUT_0, 0xffff}, ++ {OP_WR, MISC_REG_AEU_ENABLE4_FUNC_1_OUT_0, 0x500003e0}, ++ {OP_WR, MISC_REG_AEU_ENABLE1_FUNC_1_OUT_1, 0x0}, ++ {OP_WR, MISC_REG_AEU_ENABLE2_FUNC_1_OUT_1, 0xa000}, ++ {OP_ZR, MISC_REG_AEU_ENABLE3_FUNC_1_OUT_1, 0x5}, ++ {OP_WR, MISC_REG_AEU_ENABLE4_FUNC_1_OUT_2, 0xfe00000}, ++ {OP_ZR, MISC_REG_AEU_ENABLE1_FUNC_1_OUT_3, 0x14}, ++ {OP_WR, MISC_REG_AEU_ENABLE1_NIG_1, 0x55540000}, ++ {OP_WR, MISC_REG_AEU_ENABLE2_NIG_1, 0x55555555}, ++ {OP_WR, MISC_REG_AEU_ENABLE3_NIG_1, 0x5555}, ++ {OP_WR, MISC_REG_AEU_ENABLE4_NIG_1, 0x0}, ++ {OP_WR, MISC_REG_AEU_ENABLE1_PXP_1, 0x55540000}, ++ {OP_WR, MISC_REG_AEU_ENABLE2_PXP_1, 0x55555555}, ++ {OP_WR, MISC_REG_AEU_ENABLE3_PXP_1, 0x5555}, ++ {OP_WR, MISC_REG_AEU_ENABLE4_PXP_1, 0x0}, ++ {OP_WR, MISC_REG_AEU_INVERTER_1_FUNC_1, 0x0}, ++ {OP_ZR, MISC_REG_AEU_INVERTER_2_FUNC_1, 0x3}, ++ {OP_WR, MISC_REG_AEU_MASK_ATTN_FUNC_1, 0x7}, ++/* #define MISC_AEU_PORT1_END 775 */ ++ ++}; ++ ++static const u16 init_ops_offsets_e1[] = { ++ 0x0000, 0x002e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x002e, ++ 0x0050, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0050, 0x008d, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x008d, 0x0092, ++ 0x0092, 0x0096, 0x0096, 0x009a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x009a, 0x00db, 0x00db, 0x00e9, 0x00e9, 0x00f7, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x00f7, 0x00fe, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x00fe, 0x0103, 0x0103, 0x010e, 0x010e, 0x0119, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0119, 0x011a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x011a, 0x0152, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0152, 0x0176, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0176, 0x01b5, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x01b5, 0x01f0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x01f0, 0x0235, 0x0235, 0x0238, 0x0238, ++ 0x023b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x023b, ++ 0x0276, 0x0276, 0x0280, 0x0280, 0x028a, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x028a, 0x028b, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x028b, 0x029d, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x029d, 0x02b2, 0x02b2, 0x02b5, 0x02b5, 0x02b8, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x02b8, 0x02e6, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x02e6, 0x036d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x036d, 0x0374, 0x0374, 0x0378, ++ 0x0378, 0x037c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x037c, 0x03bb, 0x03bb, 0x03c3, 0x03c3, 0x03cb, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x03cb, 0x041f, 0x041f, 0x0431, 0x0431, ++ 0x0443, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0443, ++ 0x044d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x044d, 0x0453, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0453, 0x0456, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0456, 0x045b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x045b, 0x045c, 0x045c, ++ 0x046e, 0x046e, 0x0480, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0480, 0x04ed, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x04ed, 0x04ee, 0x04ee, 0x0502, ++ 0x0502, 0x0516, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 ++}; ++ ++static const u32 init_data_e1[] = { ++ 0x00010000, 0x000204c0, 0x00030980, 0x00040e40, 0x00051300, 0x000617c0, ++ 0x00071c80, 0x00082140, 0x00092600, 0x000a2ac0, 0x000b2f80, 0x000c3440, ++ 0x000d3900, 0x000e3dc0, 0x000f4280, 0x00104740, 0x00114c00, 0x001250c0, ++ 0x00135580, 0x00145a40, 0x00155f00, 0x001663c0, 0x00176880, 0x00186d40, ++ 0x00197200, 0x001a76c0, 0x001b7b80, 0x001c8040, 0x001d8500, 0x001e89c0, ++ 0x001f8e80, 0x00209340, 0x00002000, 0x00004000, 0x00006000, 0x00008000, ++ 0x0000a000, 0x0000c000, 0x0000e000, 0x00010000, 0x00012000, 0x00014000, ++ 0x00016000, 0x00018000, 0x0001a000, 0x0001c000, 0x0001e000, 0x00020000, ++ 0x00022000, 0x00024000, 0x00026000, 0x00028000, 0x0002a000, 0x0002c000, ++ 0x0002e000, 0x00030000, 0x00032000, 0x00034000, 0x00036000, 0x00038000, ++ 0x0003a000, 0x0003c000, 0x0003e000, 0x00040000, 0x00042000, 0x00044000, ++ 0x00046000, 0x00048000, 0x0004a000, 0x0004c000, 0x0004e000, 0x00050000, ++ 0x00052000, 0x00054000, 0x00056000, 0x00058000, 0x0005a000, 0x0005c000, ++ 0x0005e000, 0x00060000, 0x00062000, 0x00064000, 0x00066000, 0x00068000, ++ 0x0006a000, 0x0006c000, 0x0006e000, 0x00070000, 0x00072000, 0x00074000, ++ 0x00076000, 0x00078000, 0x0007a000, 0x0007c000, 0x0007e000, 0x00080000, ++ 0x00082000, 0x00084000, 0x00086000, 0x00088000, 0x0008a000, 0x0008c000, ++ 0x0008e000, 0x00090000, 0x00092000, 0x00094000, 0x00096000, 0x00098000, ++ 0x0009a000, 0x0009c000, 0x0009e000, 0x000a0000, 0x000a2000, 0x000a4000, ++ 0x000a6000, 0x000a8000, 0x000aa000, 0x000ac000, 0x000ae000, 0x000b0000, ++ 0x000b2000, 0x000b4000, 0x000b6000, 0x000b8000, 0x000ba000, 0x000bc000, ++ 0x000be000, 0x000c0000, 0x000c2000, 0x000c4000, 0x000c6000, 0x000c8000, ++ 0x000ca000, 0x000cc000, 0x000ce000, 0x000d0000, 0x000d2000, 0x000d4000, ++ 0x000d6000, 0x000d8000, 0x000da000, 0x000dc000, 0x000de000, 0x000e0000, ++ 0x000e2000, 0x000e4000, 0x000e6000, 0x000e8000, 0x000ea000, 0x000ec000, ++ 0x000ee000, 0x000f0000, 0x000f2000, 0x000f4000, 0x000f6000, 0x000f8000, ++ 0x000fa000, 0x000fc000, 0x000fe000, 0x00100000, 0x00102000, 0x00104000, ++ 0x00106000, 0x00108000, 0x0010a000, 0x0010c000, 0x0010e000, 0x00110000, ++ 0x00112000, 0x00114000, 0x00116000, 0x00118000, 0x0011a000, 0x0011c000, ++ 0x0011e000, 0x00120000, 0x00122000, 0x00124000, 0x00126000, 0x00128000, ++ 0x0012a000, 0x0012c000, 0x0012e000, 0x00130000, 0x00132000, 0x00134000, ++ 0x00136000, 0x00138000, 0x0013a000, 0x0013c000, 0x0013e000, 0x00140000, ++ 0x00142000, 0x00144000, 0x00146000, 0x00148000, 0x0014a000, 0x0014c000, ++ 0x0014e000, 0x00150000, 0x00152000, 0x00154000, 0x00156000, 0x00158000, ++ 0x0015a000, 0x0015c000, 0x0015e000, 0x00160000, 0x00162000, 0x00164000, ++ 0x00166000, 0x00168000, 0x0016a000, 0x0016c000, 0x0016e000, 0x00170000, ++ 0x00172000, 0x00174000, 0x00176000, 0x00178000, 0x0017a000, 0x0017c000, ++ 0x0017e000, 0x00180000, 0x00182000, 0x00184000, 0x00186000, 0x00188000, ++ 0x0018a000, 0x0018c000, 0x0018e000, 0x00190000, 0x00192000, 0x00194000, ++ 0x00196000, 0x00198000, 0x0019a000, 0x0019c000, 0x0019e000, 0x001a0000, ++ 0x001a2000, 0x001a4000, 0x001a6000, 0x001a8000, 0x001aa000, 0x001ac000, ++ 0x001ae000, 0x001b0000, 0x001b2000, 0x001b4000, 0x001b6000, 0x001b8000, ++ 0x001ba000, 0x001bc000, 0x001be000, 0x001c0000, 0x001c2000, 0x001c4000, ++ 0x001c6000, 0x001c8000, 0x001ca000, 0x001cc000, 0x001ce000, 0x001d0000, ++ 0x001d2000, 0x001d4000, 0x001d6000, 0x001d8000, 0x001da000, 0x001dc000, ++ 0x001de000, 0x001e0000, 0x001e2000, 0x001e4000, 0x001e6000, 0x001e8000, ++ 0x001ea000, 0x001ec000, 0x001ee000, 0x001f0000, 0x001f2000, 0x001f4000, ++ 0x001f6000, 0x001f8000, 0x001fa000, 0x001fc000, 0x001fe000, 0x00200000, ++ 0x00202000, 0x00204000, 0x00206000, 0x00208000, 0x0020a000, 0x0020c000, ++ 0x0020e000, 0x00210000, 0x00212000, 0x00214000, 0x00216000, 0x00218000, ++ 0x0021a000, 0x0021c000, 0x0021e000, 0x00220000, 0x00222000, 0x00224000, ++ 0x00226000, 0x00228000, 0x0022a000, 0x0022c000, 0x0022e000, 0x00230000, ++ 0x00232000, 0x00234000, 0x00236000, 0x00238000, 0x0023a000, 0x0023c000, ++ 0x0023e000, 0x00240000, 0x00242000, 0x00244000, 0x00246000, 0x00248000, ++ 0x0024a000, 0x0024c000, 0x0024e000, 0x00250000, 0x00252000, 0x00254000, ++ 0x00256000, 0x00258000, 0x0025a000, 0x0025c000, 0x0025e000, 0x00260000, ++ 0x00262000, 0x00264000, 0x00266000, 0x00268000, 0x0026a000, 0x0026c000, ++ 0x0026e000, 0x00270000, 0x00272000, 0x00274000, 0x00276000, 0x00278000, ++ 0x0027a000, 0x0027c000, 0x0027e000, 0x00280000, 0x00282000, 0x00284000, ++ 0x00286000, 0x00288000, 0x0028a000, 0x0028c000, 0x0028e000, 0x00290000, ++ 0x00292000, 0x00294000, 0x00296000, 0x00298000, 0x0029a000, 0x0029c000, ++ 0x0029e000, 0x002a0000, 0x002a2000, 0x002a4000, 0x002a6000, 0x002a8000, ++ 0x002aa000, 0x002ac000, 0x002ae000, 0x002b0000, 0x002b2000, 0x002b4000, ++ 0x002b6000, 0x002b8000, 0x002ba000, 0x002bc000, 0x002be000, 0x002c0000, ++ 0x002c2000, 0x002c4000, 0x002c6000, 0x002c8000, 0x002ca000, 0x002cc000, ++ 0x002ce000, 0x002d0000, 0x002d2000, 0x002d4000, 0x002d6000, 0x002d8000, ++ 0x002da000, 0x002dc000, 0x002de000, 0x002e0000, 0x002e2000, 0x002e4000, ++ 0x002e6000, 0x002e8000, 0x002ea000, 0x002ec000, 0x002ee000, 0x002f0000, ++ 0x002f2000, 0x002f4000, 0x002f6000, 0x002f8000, 0x002fa000, 0x002fc000, ++ 0x002fe000, 0x00300000, 0x00302000, 0x00304000, 0x00306000, 0x00308000, ++ 0x0030a000, 0x0030c000, 0x0030e000, 0x00310000, 0x00312000, 0x00314000, ++ 0x00316000, 0x00318000, 0x0031a000, 0x0031c000, 0x0031e000, 0x00320000, ++ 0x00322000, 0x00324000, 0x00326000, 0x00328000, 0x0032a000, 0x0032c000, ++ 0x0032e000, 0x00330000, 0x00332000, 0x00334000, 0x00336000, 0x00338000, ++ 0x0033a000, 0x0033c000, 0x0033e000, 0x00340000, 0x00342000, 0x00344000, ++ 0x00346000, 0x00348000, 0x0034a000, 0x0034c000, 0x0034e000, 0x00350000, ++ 0x00352000, 0x00354000, 0x00356000, 0x00358000, 0x0035a000, 0x0035c000, ++ 0x0035e000, 0x00360000, 0x00362000, 0x00364000, 0x00366000, 0x00368000, ++ 0x0036a000, 0x0036c000, 0x0036e000, 0x00370000, 0x00372000, 0x00374000, ++ 0x00376000, 0x00378000, 0x0037a000, 0x0037c000, 0x0037e000, 0x00380000, ++ 0x00382000, 0x00384000, 0x00386000, 0x00388000, 0x0038a000, 0x0038c000, ++ 0x0038e000, 0x00390000, 0x00392000, 0x00394000, 0x00396000, 0x00398000, ++ 0x0039a000, 0x0039c000, 0x0039e000, 0x003a0000, 0x003a2000, 0x003a4000, ++ 0x003a6000, 0x003a8000, 0x003aa000, 0x003ac000, 0x003ae000, 0x003b0000, ++ 0x003b2000, 0x003b4000, 0x003b6000, 0x003b8000, 0x003ba000, 0x003bc000, ++ 0x003be000, 0x003c0000, 0x003c2000, 0x003c4000, 0x003c6000, 0x003c8000, ++ 0x003ca000, 0x003cc000, 0x003ce000, 0x003d0000, 0x003d2000, 0x003d4000, ++ 0x003d6000, 0x003d8000, 0x003da000, 0x003dc000, 0x003de000, 0x003e0000, ++ 0x003e2000, 0x003e4000, 0x003e6000, 0x003e8000, 0x003ea000, 0x003ec000, ++ 0x003ee000, 0x003f0000, 0x003f2000, 0x003f4000, 0x003f6000, 0x003f8000, ++ 0x003fa000, 0x003fc000, 0x003fe000, 0x003fe001, 0x00000000, 0x000001ff, ++ 0x00000200, 0x00007ff8, 0x00007ff8, 0x0000026f, 0x00001500, 0x00000001, ++ 0x00000003, 0x00bebc20, 0x00000003, 0x00bebc20, 0x00000001, 0xffffffff, ++ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, ++ 0xffffffff, 0xffffffff, 0x00000000, 0xffffffff, 0x00000000, 0xffffffff, ++ 0x00000003, 0x00bebc20, 0xffffffff, 0x00000000, 0xffffffff, 0x00000000, ++ 0xffffffff, 0x00000003, 0x00bebc20, 0x00002000, 0x000040c0, 0x00006180, ++ 0x00008240, 0x0000a300, 0x0000c3c0, 0x0000e480, 0x00010540, 0x00012600, ++ 0x000146c0, 0x00016780, 0x00018840, 0x0001a900, 0x0001c9c0, 0x0001ea80, ++ 0x00020b40, 0x00022c00, 0x00024cc0, 0x00026d80, 0x00028e40, 0x0002af00, ++ 0x0002cfc0, 0x0002f080, 0x00031140, 0x00033200, 0x000352c0, 0x00037380, ++ 0x00039440, 0x0003b500, 0x0003d5c0, 0x0003f680, 0x00041740, 0x00043800, ++ 0x000458c0, 0x00047980, 0x00049a40, 0x00008000, 0x00010380, 0x00018700, ++ 0x00020a80, 0x00028e00, 0x00031180, 0x00039500, 0x00041880, 0x00049c00, ++ 0x00051f80, 0x0005a300, 0x00062680, 0x0006aa00, 0x00072d80, 0x0007b100, ++ 0x00083480, 0x0008b800, 0x00093b80, 0x0009bf00, 0x000a4280, 0x000ac600, ++ 0x000b4980, 0x000bcd00, 0x000c5080, 0x000cd400, 0x000d5780, 0x000ddb00, ++ 0x00007ff8, 0x00007ff8, 0x00000174, 0x00001500, 0x00001900, 0x00000000, ++ 0xffffffff, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, ++ 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, ++ 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, ++ 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, ++ 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, ++ 0x40000000, 0x40000000, 0x40000000, 0x00007ff8, 0x00007ff8, 0x00000509, ++ 0x00003500, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, ++ 0xffffffff, 0xffffffff, 0xffffffff, 0x40000000, 0x40000000, 0x40000000, ++ 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, ++ 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, ++ 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, ++ 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, ++ 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x00001000, ++ 0x00002080, 0x00003100, 0x00004180, 0x00005200, 0x00006280, 0x00007300, ++ 0x00008380, 0x00009400, 0x0000a480, 0x0000b500, 0x0000c580, 0x0000d600, ++ 0x0000e680, 0x0000f700, 0x00010780, 0x00011800, 0x00012880, 0x00013900, ++ 0x00014980, 0x00015a00, 0x00016a80, 0x00017b00, 0x00018b80, 0x00019c00, ++ 0x0001ac80, 0x0001bd00, 0x0001cd80, 0x0001de00, 0x0001ee80, 0x0001ff00, ++ 0x00007ff8, 0x00007ff8, 0x00000448, 0x00001500, 0x10000000, 0x000028ad, ++ 0x00000000, 0x00010001, 0x00120005, 0xccccccc1, 0xffffffff, 0xffffffff, ++ 0x7058103c, 0x00000000, 0x00000000, 0x00000001, 0xcccc0201, 0xcccccccc, ++ 0x00000000, 0xffffffff, 0x40000000, 0x40000000, 0x40000000, 0x40000000, ++ 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, ++ 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, ++ 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, ++ 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, ++ 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x000e01b7, 0x011600d6, ++ 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, ++ 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, ++ 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x00100000, 0x00000000, ++ 0x007201bb, 0x012300f3, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, ++ 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, ++ 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, ++ 0x00100000, 0x00000000, 0xfffffff3, 0x318fffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cf300, 0xf3cf3cf3, 0x0000cf3c, 0xcdcdcdcd, 0xfffffff1, 0x30efffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0001cf3c, 0xcdcdcdcd, ++ 0xfffffff6, 0x305fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, ++ 0x0002cf3c, 0xcdcdcdcd, 0xfffff406, 0x1cbfffff, 0x0c30c305, 0xc30c30c3, ++ 0xcf300014, 0xf3cf3cf3, 0x0004cf3c, 0xcdcdcdcd, 0xfffffff2, 0x304fffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0008cf3c, 0xcdcdcdcd, ++ 0xfffffffa, 0x302fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, ++ 0x0010cf3c, 0xcdcdcdcd, 0xfffffff7, 0x31efffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cf300, 0xf3cf3cf3, 0x0020cf3c, 0xcdcdcdcd, 0xfffffff5, 0x302fffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0040cf3c, 0xcdcdcdcd, ++ 0xfffffff3, 0x310fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, ++ 0x0000cf3c, 0xcdcdcdcd, 0xfffffff1, 0x310fffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cf300, 0xf3cf3cf3, 0x0001cf3c, 0xcdcdcdcd, 0xfffffff6, 0x305fffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0002cf3c, 0xcdcdcdcd, ++ 0xfffff406, 0x1cbfffff, 0x0c30c305, 0xc30c30c3, 0xcf300014, 0xf3cf3cf3, ++ 0x0004cf3c, 0xcdcdcdcd, 0xfffffff2, 0x304fffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cf300, 0xf3cf3cf3, 0x0008cf3c, 0xcdcdcdcd, 0xfffffffa, 0x302fffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0010cf3c, 0xcdcdcdcd, ++ 0xfffffff7, 0x30efffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, ++ 0x0020cf3c, 0xcdcdcdcd, 0xfffffff5, 0x304fffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cf300, 0xf3cf3cf3, 0x0040cf3c, 0xcdcdcdcd, 0xfffffff3, 0x31efffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0000cf3c, 0xcdcdcdcd, ++ 0xfffffff1, 0x310fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, ++ 0x0001cf3c, 0xcdcdcdcd, 0xfffffff6, 0x305fffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cf300, 0xf3cf3cf3, 0x0002cf3c, 0xcdcdcdcd, 0xfffff406, 0x1cbfffff, ++ 0x0c30c305, 0xc30c30c3, 0xcf300014, 0xf3cf3cf3, 0x0004cf3c, 0xcdcdcdcd, ++ 0xfffffff2, 0x304fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, ++ 0x0008cf3c, 0xcdcdcdcd, 0xfffffffa, 0x302fffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cf300, 0xf3cf3cf3, 0x0010cf3c, 0xcdcdcdcd, 0xffffff97, 0x056fffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cc000, 0xf3cf3cf3, 0x0020cf3c, 0xcdcdcdcd, ++ 0xfffffff5, 0x310fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, ++ 0x0040cf3c, 0xcdcdcdcd, 0xfffffff3, 0x320fffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cf300, 0xf3cf3cf3, 0x0000cf3c, 0xcdcdcdcd, 0xfffffff1, 0x310fffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0001cf3c, 0xcdcdcdcd, ++ 0xfffffff6, 0x305fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, ++ 0x0002cf3c, 0xcdcdcdcd, 0xfffff406, 0x1cbfffff, 0x0c30c305, 0xc30c30c3, ++ 0xcf300014, 0xf3cf3cf3, 0x0004cf3c, 0xcdcdcdcd, 0xfffffff2, 0x304fffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0008cf3c, 0xcdcdcdcd, ++ 0xffffff8a, 0x042fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cc000, 0xf3cf3cf3, ++ 0x0010cf3c, 0xcdcdcdcd, 0xffffff97, 0x05cfffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cc000, 0xf3cf3cf3, 0x0020cf3c, 0xcdcdcdcd, 0xfffffff5, 0x310fffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0040cf3c, 0xcdcdcdcd, ++ 0xfffffff3, 0x300fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, ++ 0x0000cf3c, 0xcdcdcdcd, 0xfffffff1, 0x300fffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cf300, 0xf3cf3cf3, 0x0001cf3c, 0xcdcdcdcd, 0xfffffff6, 0x305fffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0002cf3c, 0xcdcdcdcd, ++ 0xfffff406, 0x1cbfffff, 0x0c30c305, 0xc30c30c3, 0xcf300014, 0xf3cf3cf3, ++ 0x0004cf3c, 0xcdcdcdcd, 0xfffffff2, 0x304fffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cf300, 0xf3cf3cf3, 0x0008cf3c, 0xcdcdcdcd, 0xfffffffa, 0x302fffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0010cf3c, 0xcdcdcdcd, ++ 0xffffff97, 0x040fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cc000, 0xf3cf3cf3, ++ 0x0020cf3c, 0xcdcdcdcd, 0xfffffff5, 0x300fffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cf300, 0xf3cf3cf3, 0x0040cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, 0x0000cf3c, 0xcdcdcdcd, ++ 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, ++ 0x0001cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cf3cc, 0xf3cf3cf3, 0x0002cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, 0x0004cf3c, 0xcdcdcdcd, ++ 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, ++ 0x0008cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cf3cc, 0xf3cf3cf3, 0x0010cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, 0x0020cf3c, 0xcdcdcdcd, ++ 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, ++ 0x0040cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cf3cc, 0xf3cf3cf3, 0x0000cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, 0x0001cf3c, 0xcdcdcdcd, ++ 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, ++ 0x0002cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cf3cc, 0xf3cf3cf3, 0x0004cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, 0x0008cf3c, 0xcdcdcdcd, ++ 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, ++ 0x0010cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cf3cc, 0xf3cf3cf3, 0x0020cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, 0x0040cf3c, 0xcdcdcdcd, ++ 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, ++ 0x0000cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cf3cc, 0xf3cf3cf3, 0x0001cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, 0x0002cf3c, 0xcdcdcdcd, ++ 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, ++ 0x0004cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cf3cc, 0xf3cf3cf3, 0x0008cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, 0x0010cf3c, 0xcdcdcdcd, ++ 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, ++ 0x0020cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cf3cc, 0xf3cf3cf3, 0x0040cf3c, 0xcdcdcdcd, 0x000c0000, 0x000700c0, ++ 0x00028130, 0x000b8158, 0x00020210, 0x00010230, 0x000f0240, 0x00010330, ++ 0x00080000, 0x00080080, 0x00028100, 0x000b8128, 0x000201e0, 0x00010200, ++ 0x00070210, 0x00020280, 0x000f0000, 0x000800f0, 0x00028170, 0x000b8198, ++ 0x00020250, 0x00010270, 0x000b8280, 0x00080338, 0x00100000, 0x00080100, ++ 0x00028180, 0x000b81a8, 0x00020260, 0x00018280, 0x000e8298, 0x00080380, ++ 0x00028000, 0x000b8028, 0x000200e0, 0x00010100, 0x00008110, 0x00000118, ++ 0xcccccccc, 0xcccccccc, 0xcccccccc, 0xcccccccc, 0x00002000, 0xcccccccc, ++ 0xcccccccc, 0xcccccccc, 0xcccccccc, 0x00002000, 0xcccccccc, 0xcccccccc, ++ 0xcccccccc, 0xcccccccc, 0x00002000 ++}; ++ ++static const u8 tsem_int_table_data_e1[] = { ++ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xfb, 0x51, ++ 0xcf, 0xc0, 0xf0, 0x03, 0x8a, 0x7b, 0xd8, 0x18, 0x18, 0x36, 0x70, 0x20, ++ 0xf8, 0x43, 0x01, 0x5f, 0x64, 0x62, 0x60, 0xb8, 0x0c, 0xc4, 0x57, 0x81, ++ 0x58, 0x80, 0x99, 0x81, 0x21, 0x98, 0x91, 0x81, 0x21, 0x84, 0x91, 0x78, ++ 0xfd, 0x49, 0xa2, 0x08, 0xf6, 0x2b, 0x21, 0x06, 0x06, 0x31, 0x61, 0x06, ++ 0x86, 0x68, 0x41, 0xa0, 0xb9, 0xc2, 0x08, 0xf1, 0xa3, 0x40, 0x35, 0x56, ++ 0x22, 0x0c, 0x0c, 0x7f, 0xa1, 0x62, 0x8d, 0x40, 0x36, 0x9b, 0x28, 0x75, ++ 0xdc, 0x3f, 0xd0, 0x78, 0x93, 0x14, 0xa6, 0xd8, 0x7a, 0x09, 0x04, 0x7b, ++ 0x33, 0x16, 0x79, 0x64, 0xbc, 0x05, 0x4d, 0x9e, 0x4f, 0x12, 0x95, 0xbf, ++ 0x95, 0x80, 0xfe, 0x81, 0xc6, 0x8f, 0x15, 0x51, 0xf9, 0x62, 0x0a, 0x10, ++ 0x3a, 0x1f, 0x2a, 0xfe, 0x04, 0x4d, 0x5e, 0x1c, 0x2a, 0x7f, 0x19, 0xea, ++ 0xaf, 0xa7, 0x8a, 0xd8, 0xcd, 0xbd, 0x02, 0x95, 0x07, 0x00, 0xc8, 0xe9, ++ 0x67, 0x44, 0x60, 0x03, 0x00, 0x00, 0x00, 0x00 ++}; ++ ++static const u8 tsem_pram_data_e1[] = { ++ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xed, 0x7d, ++ 0x0b, 0x78, 0x54, 0xd5, 0xb5, 0xf0, 0x3e, 0x73, 0xce, 0x9c, 0x99, 0x49, ++ 0x66, 0x26, 0x27, 0x21, 0x4f, 0x1e, 0x61, 0x12, 0x20, 0x82, 0x86, 0x38, ++ 0xbc, 0x02, 0x28, 0xbd, 0x4e, 0x08, 0x44, 0xac, 0x5c, 0x0d, 0xf8, 0x42, ++ 0x8b, 0x3a, 0xbc, 0x43, 0xde, 0x50, 0xb4, 0xb4, 0xb5, 0x5f, 0x26, 0x10, ++ 0x22, 0x4f, 0x6f, 0xf0, 0x47, 0x45, 0x2f, 0xd8, 0xe1, 0x61, 0x45, 0x8b, ++ 0x36, 0x60, 0xa4, 0xd1, 0x02, 0x1d, 0x40, 0x10, 0x7b, 0xbd, 0xb7, 0xc1, ++ 0x52, 0x8b, 0xd5, 0xfa, 0x45, 0x54, 0x50, 0x0c, 0x24, 0x72, 0x8b, 0xd2, ++ 0x5b, 0x7b, 0xfd, 0xd7, 0x5a, 0x7b, 0xef, 0xcc, 0x39, 0x93, 0x09, 0x60, ++ 0xff, 0xf6, 0xfe, 0xf7, 0xbf, 0xdf, 0x1f, 0x3f, 0xbf, 0xc3, 0x3e, 0x67, ++ 0x3f, 0xd6, 0x5e, 0xaf, 0xbd, 0xd6, 0xda, 0x6b, 0xef, 0xb1, 0xb3, 0x14, ++ 0xa6, 0xdf, 0xc0, 0xd8, 0xd7, 0xf8, 0x07, 0xcf, 0x1a, 0x1b, 0x63, 0x2c, ++ 0x2d, 0xfa, 0x7c, 0xca, 0xce, 0xee, 0x2f, 0x75, 0x33, 0x96, 0xb7, 0xd1, ++ 0xb7, 0xdc, 0x9d, 0x0a, 0xef, 0x5b, 0x73, 0x76, 0x25, 0xfa, 0x18, 0xcb, ++ 0xda, 0xbb, 0x5e, 0x99, 0x08, 0xef, 0xb3, 0x36, 0x35, 0x29, 0xb3, 0xf3, ++ 0xa3, 0xed, 0x47, 0xbb, 0xe0, 0xe3, 0x18, 0x78, 0xdf, 0xba, 0x5e, 0x29, ++ 0x82, 0xf7, 0x59, 0x6f, 0x36, 0x29, 0xb3, 0xf0, 0xe9, 0xb0, 0xb1, 0x36, ++ 0xa8, 0xcf, 0x34, 0x5f, 0x12, 0xc3, 0x27, 0x0b, 0x30, 0x96, 0xce, 0xd8, ++ 0xa0, 0x71, 0x4c, 0xfc, 0x05, 0xdc, 0x59, 0x85, 0x8c, 0xf5, 0xc7, 0x7f, ++ 0x42, 0x17, 0xe7, 0x8d, 0x44, 0xe8, 0x8c, 0xb1, 0x9c, 0x15, 0xb6, 0x70, ++ 0x48, 0x81, 0xf7, 0xc1, 0xb2, 0xa9, 0xcc, 0xcb, 0xd8, 0x36, 0x80, 0x2b, ++ 0x2b, 0x05, 0xda, 0xa9, 0x5f, 0x1d, 0xb0, 0x63, 0xdd, 0x5a, 0xed, 0x64, ++ 0xbb, 0x93, 0x31, 0xa7, 0xe6, 0xd4, 0xbe, 0xce, 0x65, 0x2c, 0x7b, 0x06, ++ 0xb3, 0x31, 0x78, 0x0e, 0x5c, 0xca, 0xdf, 0xe3, 0xdf, 0xd7, 0xf0, 0x7f, ++ 0x4e, 0xc8, 0x5a, 0x1e, 0xc4, 0x4c, 0xe5, 0x1c, 0x2c, 0x7b, 0x52, 0x4f, ++ 0xc1, 0x90, 0xcc, 0xc3, 0x3c, 0x5f, 0xab, 0xf1, 0xe0, 0xed, 0xd2, 0x4b, ++ 0x87, 0x47, 0xe7, 0x29, 0x9f, 0x9b, 0xea, 0x7c, 0xe9, 0x6e, 0xad, 0xe7, ++ 0x7b, 0xf9, 0x5c, 0xbc, 0xe8, 0x13, 0xfd, 0x61, 0x68, 0xfd, 0x34, 0xd6, ++ 0x1b, 0xcc, 0x58, 0x38, 0xa6, 0x7e, 0x55, 0x48, 0xd7, 0xd8, 0xb5, 0xf0, ++ 0x04, 0x04, 0x34, 0xe7, 0xf7, 0x6c, 0x3f, 0x95, 0x15, 0x15, 0x22, 0x1d, ++ 0xee, 0x63, 0x13, 0xe9, 0x59, 0xa3, 0xf9, 0xee, 0x42, 0xbc, 0xd4, 0x1c, ++ 0xb5, 0xb3, 0x10, 0xc0, 0x5d, 0x53, 0x7b, 0xaa, 0x04, 0xcb, 0xac, 0x55, ++ 0x61, 0x43, 0x72, 0x7a, 0xb6, 0x1f, 0xce, 0xec, 0x44, 0x8f, 0x22, 0xa6, ++ 0x68, 0xa7, 0x70, 0xbe, 0x5e, 0xe6, 0xc5, 0xf9, 0xa9, 0x95, 0xbe, 0x27, ++ 0x4a, 0x00, 0xcf, 0x73, 0x13, 0x03, 0x93, 0xb0, 0xdf, 0x75, 0x89, 0x41, ++ 0x7a, 0xca, 0xf7, 0x99, 0xb3, 0xa7, 0x64, 0x06, 0x01, 0x9e, 0xe2, 0x05, ++ 0xf9, 0x21, 0x06, 0x74, 0x3f, 0xbf, 0x51, 0xf1, 0x3b, 0xa0, 0xf9, 0x69, ++ 0x25, 0xac, 0xdb, 0x81, 0x1e, 0x15, 0xb7, 0xd7, 0x16, 0xdc, 0x08, 0xf5, ++ 0x7e, 0xab, 0x07, 0x6f, 0xc6, 0x76, 0x95, 0x33, 0xda, 0x8e, 0x10, 0x3d, ++ 0x58, 0x6d, 0x1e, 0xe2, 0xa9, 0x4d, 0xe7, 0xfc, 0x33, 0xb0, 0xb5, 0xe8, ++ 0x53, 0x0d, 0xe8, 0x36, 0x90, 0xb1, 0x50, 0x52, 0x0a, 0xd2, 0x85, 0xb1, ++ 0x93, 0x26, 0x3a, 0xe0, 0xdf, 0xc9, 0xa1, 0xa2, 0xac, 0xf6, 0x8e, 0xc7, ++ 0xcb, 0x3d, 0xe7, 0x62, 0x3f, 0x1a, 0xf6, 0x12, 0xa6, 0xf9, 0xca, 0xf7, ++ 0x39, 0xa1, 0xa3, 0x83, 0x06, 0xc7, 0x8c, 0xc7, 0x0a, 0x09, 0x1e, 0xc6, ++ 0x90, 0xc7, 0x59, 0xbb, 0x12, 0x8f, 0xae, 0x03, 0x5f, 0x29, 0x3a, 0xaa, ++ 0x15, 0xf4, 0x3e, 0xde, 0xdf, 0x7f, 0x1e, 0x21, 0x2e, 0x87, 0x80, 0x3b, ++ 0xa4, 0x6f, 0x95, 0x47, 0x0f, 0x2f, 0x03, 0xfa, 0x16, 0xbf, 0x6c, 0x8f, ++ 0xdc, 0x00, 0xf4, 0xa8, 0xda, 0xa2, 0x84, 0x1d, 0x50, 0xb6, 0xed, 0x77, ++ 0x05, 0x90, 0x3e, 0xe7, 0xb6, 0x43, 0x19, 0xe8, 0x12, 0xf1, 0xe8, 0x54, ++ 0xff, 0xac, 0xe1, 0xa4, 0x72, 0x8d, 0xa3, 0xed, 0x91, 0xeb, 0xa1, 0xdc, ++ 0xf5, 0xb2, 0xca, 0xb6, 0x62, 0xb7, 0x43, 0x13, 0x6c, 0x28, 0x77, 0xa7, ++ 0x04, 0xec, 0x6c, 0x34, 0x94, 0x01, 0x1f, 0xf3, 0x5d, 0xbc, 0x58, 0xb5, ++ 0xe5, 0xc0, 0x7d, 0xd8, 0x5f, 0x59, 0xab, 0x83, 0xb9, 0xa0, 0xff, 0xaa, ++ 0x57, 0x16, 0xdc, 0x72, 0x3d, 0x94, 0x17, 0x00, 0xbf, 0x61, 0x95, 0xaa, ++ 0x67, 0xea, 0xf5, 0xbe, 0x50, 0x5e, 0x18, 0x56, 0x9a, 0xb1, 0xdc, 0x39, ++ 0x91, 0x11, 0x7f, 0x84, 0x52, 0xf4, 0xf0, 0x33, 0x30, 0x5e, 0xa7, 0xb7, ++ 0x2d, 0xfd, 0x0e, 0x90, 0x97, 0x33, 0x75, 0x4e, 0xe6, 0x03, 0x50, 0x96, ++ 0x7b, 0xda, 0xd2, 0x6f, 0x07, 0x3e, 0x2a, 0x0f, 0xef, 0x2a, 0xc1, 0x76, ++ 0xe5, 0x3b, 0x15, 0x3f, 0xa2, 0xbd, 0xf8, 0xe5, 0x67, 0x8e, 0x64, 0xe1, ++ 0xbc, 0x9e, 0x03, 0xbe, 0x02, 0x3e, 0xaa, 0xd8, 0x91, 0xc8, 0x7c, 0x12, ++ 0x7f, 0xf0, 0xff, 0x29, 0x98, 0xca, 0x0d, 0xf0, 0x7d, 0x31, 0xcc, 0x13, ++ 0xe5, 0x7f, 0x01, 0x6b, 0x2a, 0x61, 0x2a, 0x8e, 0xbf, 0x5e, 0xf7, 0x79, ++ 0xa2, 0xf8, 0x3a, 0x53, 0x67, 0xd0, 0x38, 0xdd, 0xf2, 0xf4, 0x1c, 0x8c, ++ 0x03, 0xed, 0xaa, 0x5f, 0x54, 0xfc, 0x38, 0xc5, 0x6a, 0x1b, 0x0b, 0xa2, ++ 0x5c, 0x9d, 0x7b, 0xc5, 0x35, 0x63, 0x9b, 0x1b, 0xe7, 0x57, 0xaf, 0xe7, ++ 0x79, 0x70, 0x5e, 0x0f, 0xeb, 0x58, 0x6f, 0x41, 0x78, 0xd6, 0x1e, 0x54, ++ 0x59, 0xe5, 0xe1, 0x2d, 0x7a, 0x09, 0x7c, 0x2f, 0xdf, 0xb4, 0x45, 0x9f, ++ 0x9f, 0x8f, 0x78, 0x03, 0xbd, 0x97, 0x8f, 0x70, 0xf5, 0xb1, 0xc2, 0xb5, ++ 0x51, 0x0d, 0x20, 0x7e, 0x17, 0x27, 0x3b, 0xb7, 0xaa, 0x80, 0x1f, 0xe6, ++ 0x0e, 0x64, 0x4e, 0x8f, 0xc3, 0x3f, 0x67, 0xea, 0x40, 0x8d, 0xe5, 0x45, ++ 0xcb, 0xe5, 0x28, 0xdf, 0xa4, 0x4f, 0xc2, 0xfa, 0x34, 0x53, 0xfd, 0x12, ++ 0x25, 0x99, 0xf8, 0xb5, 0x62, 0x87, 0xca, 0x7c, 0x16, 0x7e, 0xe2, 0xf4, ++ 0x0f, 0x1d, 0xe3, 0xf4, 0x0f, 0xed, 0xf3, 0x84, 0x9f, 0xc9, 0x89, 0xd2, ++ 0x6f, 0xb1, 0xc1, 0xf5, 0xa4, 0xa4, 0xdf, 0xe2, 0x64, 0x41, 0x4f, 0xad, ++ 0xab, 0x30, 0x1e, 0x3c, 0x8f, 0x20, 0x3d, 0x00, 0x9e, 0x26, 0xc4, 0x17, ++ 0x3c, 0xd7, 0x0a, 0xf8, 0xbc, 0x13, 0x58, 0x91, 0x06, 0x74, 0xf1, 0x06, ++ 0x98, 0xa1, 0xb0, 0xcb, 0xf3, 0x67, 0x93, 0x9d, 0xcd, 0x62, 0x30, 0xf6, ++ 0x5b, 0x6c, 0x5e, 0x40, 0x1b, 0x0f, 0x65, 0x9d, 0x2d, 0x62, 0x7e, 0xc6, ++ 0x0c, 0xad, 0x2a, 0x30, 0x09, 0xca, 0x5f, 0xb1, 0xd2, 0x37, 0x71, 0x3e, ++ 0x8c, 0xf9, 0x7d, 0xa5, 0x80, 0xe7, 0x46, 0x85, 0xcd, 0xc0, 0x79, 0x1f, ++ 0x46, 0x60, 0x61, 0x3e, 0x8d, 0x59, 0x3a, 0xe1, 0xaf, 0x69, 0x72, 0xe1, ++ 0x36, 0x55, 0x11, 0x30, 0xa7, 0x62, 0x79, 0xfe, 0x4f, 0x56, 0xe7, 0x50, ++ 0xfb, 0xe3, 0xd4, 0x5e, 0x83, 0xf6, 0xc3, 0x7b, 0x6f, 0x6f, 0x94, 0x8c, ++ 0xb3, 0xb4, 0x37, 0x4a, 0xca, 0x64, 0xfb, 0xf7, 0xb0, 0x1e, 0x73, 0x5e, ++ 0xba, 0x7d, 0x53, 0xc9, 0x75, 0xd6, 0xf1, 0x4b, 0xca, 0x65, 0xfb, 0x8f, ++ 0x68, 0x7c, 0xf7, 0xa5, 0xe1, 0x37, 0x6e, 0x9c, 0x60, 0x1d, 0xff, 0xc6, ++ 0x4a, 0x6a, 0x5f, 0xe3, 0xe0, 0xf4, 0xea, 0x4a, 0x76, 0x86, 0xb7, 0x42, ++ 0xb9, 0xc1, 0xe5, 0x0f, 0x68, 0x48, 0x37, 0x8d, 0x45, 0xf0, 0xbd, 0x96, ++ 0x92, 0xb7, 0x15, 0xeb, 0xa9, 0x92, 0x1f, 0x58, 0x5b, 0x40, 0x85, 0xf6, ++ 0xee, 0x9d, 0xc9, 0x23, 0x57, 0x33, 0x33, 0x5f, 0x4c, 0xfc, 0x23, 0x8e, ++ 0xe7, 0x01, 0x69, 0x31, 0xf3, 0x45, 0xd2, 0xb8, 0x04, 0x0b, 0x3f, 0x26, ++ 0x07, 0x52, 0x2c, 0x65, 0xe8, 0xc9, 0x38, 0x75, 0x4d, 0x54, 0x0f, 0x05, ++ 0xbc, 0x4e, 0x82, 0x47, 0xef, 0xab, 0x93, 0xbe, 0x28, 0xea, 0xeb, 0x24, ++ 0x78, 0x1f, 0xdc, 0xef, 0xa2, 0xf2, 0x83, 0xd7, 0x71, 0x78, 0x1f, 0xec, ++ 0xeb, 0x26, 0x39, 0x43, 0x18, 0x58, 0x16, 0x94, 0xf5, 0xe0, 0xb5, 0x86, ++ 0x69, 0x3d, 0x02, 0x38, 0x15, 0x96, 0xc9, 0xd8, 0x05, 0x25, 0xe8, 0x52, ++ 0xc6, 0x98, 0xdf, 0xfb, 0x6c, 0xf8, 0x3e, 0x41, 0x65, 0xb5, 0x38, 0x9f, ++ 0x04, 0x07, 0x23, 0x7d, 0xf4, 0x70, 0x4e, 0xe1, 0xb6, 0x90, 0x09, 0x3f, ++ 0x2b, 0x07, 0x00, 0x7d, 0xa1, 0x9c, 0xaa, 0xe8, 0x1c, 0x8f, 0x02, 0xaf, ++ 0x0f, 0x0f, 0x98, 0x9f, 0x39, 0xcb, 0x34, 0x4e, 0xe3, 0x00, 0x7d, 0xc6, ++ 0xd6, 0x7c, 0xfe, 0x7e, 0x8e, 0x1b, 0xc7, 0x2b, 0x4d, 0x57, 0x50, 0x0f, ++ 0xea, 0x5d, 0x79, 0x86, 0xbb, 0xe7, 0x38, 0x8e, 0xdc, 0x71, 0x96, 0x71, ++ 0x9c, 0xd9, 0x65, 0x34, 0x4e, 0x4e, 0xcc, 0x38, 0x8e, 0xec, 0xb2, 0x98, ++ 0x71, 0x9c, 0x33, 0xb6, 0x8a, 0xf7, 0x62, 0x9c, 0x41, 0x97, 0x1a, 0xe7, ++ 0xe1, 0xdc, 0xeb, 0xac, 0xf3, 0xc9, 0x2e, 0xa7, 0x71, 0x0a, 0x62, 0xe7, ++ 0x93, 0x5d, 0x1e, 0x33, 0x4e, 0x02, 0x9f, 0x0f, 0xbc, 0x17, 0xe3, 0xf8, ++ 0x11, 0x7f, 0xbd, 0xce, 0x67, 0xd0, 0x04, 0xeb, 0x7c, 0x06, 0x56, 0xd2, ++ 0x38, 0xd7, 0xe3, 0x38, 0x63, 0x4c, 0xf3, 0x19, 0x58, 0x19, 0x33, 0x8e, ++ 0x9b, 0xc6, 0xc1, 0xf7, 0x38, 0x0e, 0x18, 0x52, 0x3e, 0x96, 0x01, 0x74, ++ 0x77, 0x74, 0xcd, 0x27, 0xfa, 0xff, 0xd2, 0x45, 0xf6, 0x82, 0xee, 0x08, ++ 0x3e, 0x8b, 0xfd, 0xb2, 0x77, 0x5d, 0x8c, 0xf4, 0x89, 0x0f, 0xc6, 0xcd, ++ 0x40, 0xbd, 0x02, 0x8b, 0x33, 0xc8, 0xaf, 0xa6, 0xa4, 0xd0, 0x38, 0x5f, ++ 0x24, 0x00, 0xfd, 0xdd, 0x66, 0x3a, 0x73, 0x7d, 0x44, 0x4f, 0xd0, 0x3f, ++ 0xf3, 0x04, 0x88, 0x2c, 0x0c, 0x10, 0x81, 0xfe, 0xa9, 0x16, 0x3c, 0x3a, ++ 0x77, 0xe7, 0xb4, 0xec, 0x7a, 0x7c, 0xb6, 0x16, 0x67, 0xce, 0x42, 0xbb, ++ 0x64, 0x83, 0xc7, 0x3f, 0x04, 0x44, 0xe7, 0x5c, 0x6b, 0xb1, 0x3e, 0x27, ++ 0x8e, 0x7d, 0x33, 0xaf, 0xc9, 0x7e, 0xaa, 0xdd, 0xc2, 0xbf, 0x42, 0xef, ++ 0x4d, 0x64, 0x43, 0x6b, 0x61, 0xfc, 0x16, 0x54, 0x36, 0xa6, 0xf2, 0x29, ++ 0xd0, 0x5f, 0x0c, 0xf4, 0xd6, 0x49, 0xd0, 0x5f, 0xf8, 0x3c, 0x2d, 0xec, ++ 0xd3, 0x8f, 0x40, 0xbf, 0x31, 0xdd, 0x0c, 0x6f, 0x3d, 0xcd, 0xe3, 0x94, ++ 0xc6, 0xf1, 0x78, 0x6a, 0x13, 0x5f, 0x47, 0xbe, 0x58, 0x7f, 0xcc, 0x0e, ++ 0xc6, 0x1e, 0x0e, 0x73, 0x3c, 0x1f, 0xe0, 0xbe, 0x53, 0x4c, 0x63, 0x5e, ++ 0x13, 0x18, 0x7f, 0x26, 0x39, 0xab, 0x11, 0xf4, 0xe8, 0x7a, 0xc5, 0x11, ++ 0xde, 0x4a, 0xf4, 0x08, 0xf4, 0xb3, 0x01, 0x9f, 0xb3, 0x8d, 0x7d, 0x00, ++ 0x57, 0xa2, 0x1e, 0xd8, 0x99, 0x7f, 0x10, 0xf6, 0x28, 0xfc, 0xf5, 0xb3, ++ 0x81, 0x2d, 0x7b, 0xcf, 0xca, 0x5d, 0x87, 0xb1, 0xda, 0xdb, 0xca, 0xac, ++ 0x01, 0x8b, 0x61, 0xbe, 0x33, 0x5a, 0xd6, 0xdb, 0xfb, 0x41, 0xf9, 0x9c, ++ 0xbd, 0xfd, 0x3e, 0xbf, 0xdb, 0xd4, 0xcf, 0x0c, 0xfb, 0x49, 0x9c, 0xb7, ++ 0x13, 0xfe, 0xc3, 0x7e, 0xee, 0x0e, 0xda, 0x2d, 0xf6, 0xe9, 0x77, 0xca, ++ 0xac, 0xe5, 0x7b, 0x63, 0xec, 0xd5, 0x4a, 0x25, 0x57, 0xd0, 0x43, 0x8c, ++ 0xeb, 0x0b, 0xdb, 0x91, 0x5e, 0x77, 0xa6, 0x73, 0x78, 0xee, 0xc5, 0xe7, ++ 0x48, 0xfc, 0x6c, 0x10, 0xbd, 0xee, 0x33, 0x78, 0x5b, 0x09, 0x4f, 0xcd, ++ 0x0f, 0xed, 0x2c, 0x42, 0xeb, 0x51, 0x7b, 0x1a, 0xcb, 0x47, 0x7c, 0xa4, ++ 0x91, 0x5d, 0x14, 0x94, 0xeb, 0x4a, 0x0c, 0x7c, 0xf7, 0xd9, 0x9d, 0x81, ++ 0x52, 0xa0, 0xe7, 0x7d, 0xdf, 0x57, 0x09, 0x8f, 0xb1, 0xf0, 0xb6, 0xef, ++ 0x4f, 0x0c, 0xd8, 0xc0, 0x5e, 0x6a, 0xdf, 0xf8, 0xef, 0x76, 0xb4, 0xbf, ++ 0x2f, 0x07, 0xff, 0xfd, 0x4b, 0xad, 0xdf, 0x59, 0x88, 0x8f, 0x27, 0xf1, ++ 0x2a, 0xf9, 0xe0, 0xae, 0x19, 0x45, 0x7d, 0x3e, 0x32, 0xd5, 0xbb, 0x3b, ++ 0x78, 0x53, 0x9f, 0x8f, 0x4c, 0xfc, 0xf2, 0x9d, 0xb2, 0x69, 0x96, 0xf2, ++ 0xbd, 0xb5, 0x77, 0x5b, 0xea, 0xdf, 0xbf, 0x74, 0x96, 0xe5, 0xfb, 0xac, ++ 0xd0, 0x42, 0xcb, 0xf7, 0x39, 0x2b, 0x17, 0x59, 0xca, 0xf3, 0x9a, 0xbe, ++ 0x6f, 0xa9, 0xbf, 0x60, 0x63, 0xbd, 0xe5, 0xfb, 0xc2, 0xf0, 0x2a, 0xcb, ++ 0xf7, 0x8a, 0x1d, 0xeb, 0x2d, 0xe5, 0xaa, 0xe6, 0x27, 0x2d, 0xf5, 0x6b, ++ 0x5a, 0xb7, 0x58, 0xbe, 0xdb, 0xf6, 0x0f, 0xbb, 0x15, 0xe5, 0x71, 0xf9, ++ 0x6f, 0x55, 0x86, 0xf6, 0xd9, 0x05, 0xf7, 0xa9, 0x47, 0xd0, 0xbe, 0xba, ++ 0x60, 0x68, 0x7e, 0xac, 0x53, 0x8d, 0xbc, 0x06, 0x72, 0xf8, 0x49, 0x5d, ++ 0x26, 0xf1, 0xf7, 0x99, 0x3a, 0x1f, 0x3d, 0xcf, 0xb5, 0x8e, 0x72, 0xa2, ++ 0x3d, 0x5e, 0x93, 0x00, 0xf2, 0x0c, 0x6b, 0xfd, 0x7e, 0xe5, 0x0f, 0xa1, ++ 0x95, 0x13, 0x50, 0x8f, 0x40, 0x7d, 0xd0, 0xe1, 0x07, 0x95, 0x0f, 0x43, ++ 0x21, 0x70, 0x9e, 0xde, 0x50, 0x7c, 0xc4, 0xf7, 0xea, 0x46, 0x9d, 0x45, ++ 0x80, 0x55, 0x15, 0xf0, 0xef, 0x24, 0x5f, 0x77, 0xa9, 0xd1, 0xef, 0x5a, ++ 0x3b, 0x7c, 0x1f, 0xd5, 0xfb, 0x77, 0x75, 0xa3, 0x16, 0xf7, 0xbb, 0xd6, ++ 0xae, 0xc5, 0xed, 0xb7, 0x53, 0xe9, 0xca, 0x43, 0xfb, 0x2e, 0xf4, 0x8e, ++ 0x83, 0xa1, 0x1d, 0xd8, 0x9b, 0xfd, 0x00, 0x7f, 0xfd, 0x70, 0xbd, 0xe8, ++ 0xed, 0x7b, 0x87, 0x8d, 0x95, 0x35, 0x9b, 0xf4, 0xce, 0x29, 0xc5, 0x46, ++ 0x7c, 0x70, 0xa7, 0x32, 0xf1, 0x14, 0xea, 0xe7, 0x4a, 0x9d, 0xcb, 0x7b, ++ 0xe5, 0xee, 0xac, 0x89, 0xe8, 0x0f, 0x56, 0xea, 0x91, 0xbc, 0x5a, 0xf7, ++ 0x25, 0xc6, 0x6b, 0x06, 0x60, 0x32, 0xb0, 0x9f, 0x5c, 0x9a, 0xd7, 0xc2, ++ 0x70, 0xbf, 0xa8, 0xfc, 0x12, 0xfd, 0x06, 0x59, 0xe4, 0x7e, 0x09, 0x0b, ++ 0x7e, 0x8c, 0xfa, 0xb9, 0xe3, 0x80, 0x4a, 0x7a, 0x96, 0x45, 0x0e, 0x65, ++ 0xdf, 0x36, 0x1c, 0xc7, 0x0f, 0x9c, 0xc2, 0xf7, 0xac, 0x35, 0x8d, 0xd6, ++ 0xc7, 0xb7, 0xeb, 0x02, 0x7d, 0x3e, 0x02, 0x7f, 0xee, 0x44, 0xdd, 0x14, ++ 0x7a, 0xfe, 0xbe, 0xae, 0xb4, 0xcf, 0x47, 0xa0, 0x6b, 0xde, 0xab, 0x9b, ++ 0x41, 0xe5, 0xf7, 0xeb, 0x82, 0xf4, 0x6c, 0xaf, 0x2b, 0xa3, 0xe7, 0xc9, ++ 0xba, 0x5a, 0xfa, 0xfe, 0x51, 0xdd, 0x52, 0x2a, 0x9f, 0xaa, 0x0b, 0xd1, ++ 0xf3, 0x93, 0xba, 0x95, 0xf4, 0x3c, 0x53, 0xd7, 0x44, 0xdf, 0x3b, 0xea, ++ 0x36, 0x52, 0xf9, 0x5c, 0x5d, 0x98, 0x9e, 0xdd, 0x7e, 0x80, 0xb0, 0x47, ++ 0x59, 0xaa, 0xb0, 0xff, 0x84, 0xbd, 0x0e, 0x2b, 0x07, 0x95, 0xcf, 0x8b, ++ 0x39, 0xa8, 0xf0, 0x6f, 0xee, 0xb7, 0xfa, 0x33, 0x51, 0xae, 0xcf, 0xbb, ++ 0xbf, 0xc8, 0x43, 0x3b, 0xf7, 0xfc, 0x09, 0x30, 0x4c, 0xe2, 0xf8, 0x87, ++ 0xf2, 0x19, 0xcb, 0x6f, 0xbd, 0xd3, 0x2f, 0x40, 0xeb, 0xfd, 0xfc, 0x30, ++ 0xd0, 0x7f, 0x54, 0xcf, 0xef, 0xae, 0x04, 0x4e, 0x1f, 0x97, 0x8d, 0x4d, ++ 0x61, 0xa0, 0x7f, 0x56, 0x0d, 0xd1, 0x99, 0x06, 0xe3, 0x27, 0xfc, 0xf2, ++ 0x1a, 0xb2, 0x97, 0xe1, 0xbd, 0xc6, 0x48, 0x5f, 0x86, 0xfd, 0xd3, 0x3c, ++ 0x71, 0xfa, 0xc7, 0x39, 0x67, 0x5c, 0x9e, 0x4e, 0xdd, 0xfc, 0xf1, 0xd4, ++ 0x9f, 0x0b, 0x31, 0xfe, 0x70, 0xa7, 0xd0, 0x87, 0x09, 0x87, 0xd4, 0x5a, ++ 0x4e, 0xb7, 0x6d, 0x7e, 0xa4, 0x9b, 0x09, 0x7f, 0xdc, 0x2e, 0x7b, 0x59, ++ 0xe8, 0xf3, 0x18, 0x3c, 0x92, 0x2d, 0x97, 0xd5, 0x13, 0x9f, 0x67, 0xd3, ++ 0x24, 0x3e, 0xdb, 0xb2, 0x31, 0x0e, 0xb0, 0x41, 0x29, 0x1d, 0x66, 0x03, ++ 0x3e, 0x38, 0xdf, 0xe2, 0xa0, 0x79, 0x9d, 0xdf, 0x9b, 0x18, 0x66, 0xd8, ++ 0x16, 0x83, 0x23, 0xe3, 0x2f, 0x85, 0x37, 0x0e, 0x47, 0xc5, 0x0e, 0x97, ++ 0x61, 0xd6, 0x0f, 0x55, 0xcd, 0xc9, 0x86, 0x55, 0x5f, 0x64, 0x19, 0x66, ++ 0x7d, 0x71, 0xfe, 0xe8, 0x36, 0x2f, 0xca, 0xfd, 0xe2, 0x4c, 0x9b, 0xf1, ++ 0xd1, 0x28, 0xe4, 0x8f, 0x80, 0xe0, 0x0f, 0xce, 0x77, 0xb2, 0xff, 0xaa, ++ 0xe6, 0x1c, 0xc3, 0x6d, 0xe9, 0xc7, 0x5a, 0x3e, 0xdf, 0xa4, 0x4c, 0x41, ++ 0x3f, 0x08, 0x94, 0x7b, 0xd2, 0xed, 0x71, 0xfc, 0x03, 0xf9, 0x5c, 0x9c, ++ 0xa9, 0x1b, 0x1f, 0x81, 0x7c, 0x9f, 0xd9, 0x31, 0x28, 0x09, 0xc7, 0x05, ++ 0x3f, 0xce, 0xc0, 0x71, 0x3a, 0xea, 0x0c, 0x83, 0x8f, 0x9b, 0x69, 0x98, ++ 0xf9, 0xb2, 0x72, 0x69, 0x02, 0xd5, 0x97, 0xf0, 0xf5, 0xd6, 0xef, 0xdf, ++ 0x1a, 0x3e, 0xb4, 0x0c, 0x3e, 0x74, 0x32, 0x42, 0xfd, 0xd7, 0x83, 0xbe, ++ 0xb9, 0x9f, 0xcd, 0xb4, 0x3f, 0x52, 0x3c, 0x87, 0xed, 0xb5, 0x7f, 0x81, ++ 0xeb, 0x8e, 0x03, 0xfe, 0xff, 0x9a, 0xe2, 0x01, 0x1a, 0x95, 0x65, 0xbf, ++ 0x35, 0xcd, 0x6a, 0xc8, 0x71, 0x2d, 0xbe, 0xdf, 0x69, 0x19, 0x0f, 0xda, ++ 0xf9, 0xa4, 0x0f, 0x8d, 0xeb, 0x55, 0xef, 0x74, 0xd7, 0xd8, 0x29, 0x53, ++ 0x5c, 0xa0, 0x1a, 0xc7, 0x20, 0xff, 0xc8, 0x49, 0x74, 0x0e, 0x42, 0x8f, ++ 0x49, 0xd0, 0x5f, 0xa7, 0xe6, 0x5e, 0xa9, 0xc0, 0x38, 0x53, 0x6c, 0x3e, ++ 0xfa, 0x5e, 0x23, 0xf8, 0xb1, 0xca, 0xd9, 0xae, 0x07, 0xe1, 0xd5, 0xd9, ++ 0x16, 0x4e, 0x8f, 0xde, 0xc6, 0x39, 0x53, 0x77, 0xd4, 0xa7, 0x81, 0xfe, ++ 0x28, 0x73, 0x82, 0x47, 0x06, 0xe3, 0x94, 0x35, 0x0f, 0x9b, 0x84, 0xfa, ++ 0xf1, 0x6c, 0xcb, 0xf2, 0xf4, 0x20, 0xf0, 0x6d, 0x85, 0x7a, 0xfe, 0xc1, ++ 0xd2, 0x38, 0xed, 0x57, 0xda, 0x14, 0x0e, 0x4f, 0xd8, 0xde, 0xd5, 0x6e, ++ 0x9a, 0x8f, 0x8c, 0xa3, 0x30, 0x06, 0xfd, 0x3a, 0xa3, 0xf0, 0x23, 0xa7, ++ 0x9f, 0x32, 0x95, 0x63, 0xf5, 0xb5, 0x7c, 0x3e, 0x8a, 0xfd, 0x02, 0x7f, ++ 0x54, 0xef, 0x3c, 0x56, 0x72, 0x3d, 0xc0, 0x5f, 0xdd, 0xfa, 0xb9, 0x8e, ++ 0x70, 0x4c, 0xb1, 0x05, 0x1f, 0xb5, 0xa5, 0x45, 0xe7, 0xaf, 0xe0, 0xfc, ++ 0xa1, 0x9f, 0xf2, 0x1d, 0x1f, 0xe8, 0x38, 0xbf, 0x4f, 0xec, 0xa1, 0xbc, ++ 0x1f, 0x5e, 0x42, 0x4f, 0xf5, 0x84, 0xd3, 0x9d, 0x49, 0x71, 0x3b, 0x09, ++ 0x5f, 0x88, 0xb5, 0xa1, 0x1d, 0x33, 0xbb, 0x3b, 0xae, 0xe8, 0xbb, 0xeb, ++ 0x5d, 0x10, 0xcd, 0x4f, 0xff, 0xc5, 0xce, 0x56, 0x03, 0x1c, 0xec, 0x2b, ++ 0xa8, 0x05, 0xdf, 0xed, 0xe2, 0xeb, 0x5c, 0x56, 0xea, 0x45, 0x7c, 0xcd, ++ 0x6e, 0xa9, 0xa0, 0xf8, 0xe2, 0xa7, 0x36, 0x69, 0x37, 0x35, 0x15, 0x22, ++ 0x7f, 0x9c, 0x65, 0xb6, 0x29, 0x38, 0xbf, 0xb3, 0xec, 0x2d, 0xef, 0x28, ++ 0x13, 0xfe, 0x5a, 0x6c, 0xdc, 0xee, 0x67, 0x2b, 0xb9, 0x1d, 0x13, 0x82, ++ 0xff, 0x10, 0x1e, 0xb0, 0x67, 0x2d, 0x76, 0xcd, 0x82, 0x8d, 0xd6, 0xf2, ++ 0x7c, 0x36, 0x3d, 0x1d, 0xf5, 0xc6, 0xfc, 0x0d, 0x76, 0x16, 0x06, 0x14, ++ 0x2d, 0x44, 0xbb, 0x48, 0xf2, 0x07, 0xcc, 0x7b, 0xbb, 0x8d, 0xdb, 0xbb, ++ 0x0b, 0x58, 0x6d, 0x23, 0xda, 0x73, 0x9a, 0x83, 0xfb, 0x07, 0xb3, 0x0d, ++ 0xa6, 0xf5, 0x03, 0xb8, 0xaa, 0x7e, 0xbe, 0xb9, 0x10, 0xed, 0xfe, 0x5f, ++ 0xd8, 0x6c, 0x44, 0x1f, 0x19, 0x67, 0x58, 0x98, 0xc2, 0xe1, 0x2e, 0x4f, ++ 0x0d, 0xeb, 0x01, 0xf8, 0xfe, 0x61, 0xcb, 0xa8, 0x3b, 0xaf, 0x47, 0xee, ++ 0x73, 0x84, 0x1b, 0x71, 0x5d, 0x66, 0x49, 0xcc, 0xff, 0x0c, 0xeb, 0x89, ++ 0xcf, 0x39, 0x2b, 0xad, 0xf0, 0x5d, 0x0e, 0xfe, 0x58, 0x78, 0x19, 0x5b, ++ 0x66, 0x81, 0x43, 0xf6, 0x2b, 0xe1, 0x50, 0x77, 0x28, 0x81, 0x70, 0x1c, ++ 0xbe, 0x7b, 0x43, 0xf2, 0x9d, 0xd0, 0x23, 0x29, 0xaa, 0xd5, 0xce, 0xcf, ++ 0x88, 0x29, 0xbf, 0x67, 0x13, 0xf1, 0x4b, 0x95, 0xa9, 0x48, 0xe7, 0xb3, ++ 0x86, 0x33, 0x64, 0x4b, 0xa2, 0xef, 0xfe, 0x08, 0xc6, 0x47, 0x76, 0x3b, ++ 0xfc, 0xcb, 0x81, 0xbe, 0x0f, 0xd8, 0x4a, 0xdb, 0x51, 0x3f, 0x83, 0x5d, ++ 0x50, 0xc0, 0x4c, 0xf5, 0x1e, 0xb0, 0x05, 0xe9, 0x7d, 0x87, 0xf2, 0xe6, ++ 0x7c, 0xb4, 0x4f, 0x99, 0x16, 0x29, 0x40, 0xff, 0x1e, 0xd6, 0x14, 0x0d, ++ 0xf9, 0x41, 0x17, 0xfc, 0xa0, 0x26, 0x78, 0x0b, 0x30, 0x1e, 0xeb, 0x61, ++ 0xb0, 0x7e, 0x82, 0x5c, 0x3a, 0x10, 0x3e, 0xe8, 0xa7, 0xd1, 0x53, 0x36, ++ 0x95, 0x15, 0x60, 0xfc, 0x15, 0xe4, 0x14, 0xfa, 0x5b, 0xe7, 0x2d, 0x39, ++ 0xaa, 0x40, 0xd9, 0xe5, 0x6e, 0x61, 0xd8, 0x9f, 0x23, 0xd3, 0x1a, 0x5f, ++ 0x76, 0xf9, 0xac, 0xe5, 0x1a, 0xfc, 0x07, 0xd2, 0x61, 0x28, 0xa3, 0x38, ++ 0x4e, 0xe2, 0x50, 0xeb, 0x77, 0x58, 0xb0, 0x18, 0xf2, 0x9b, 0xc7, 0x6f, ++ 0x7d, 0xff, 0x1f, 0xdd, 0x78, 0x8a, 0x10, 0xdf, 0x7a, 0x89, 0xa5, 0xe1, ++ 0xe9, 0x74, 0x47, 0x54, 0x18, 0x9f, 0x8d, 0xd3, 0x3a, 0xcc, 0x76, 0x73, ++ 0xb5, 0x93, 0xc3, 0x4f, 0x7e, 0x39, 0xd4, 0x5f, 0x22, 0xec, 0xf9, 0x6a, ++ 0xe6, 0x0b, 0x51, 0x9c, 0x38, 0x93, 0xf3, 0xc1, 0x92, 0x9b, 0x6c, 0x04, ++ 0xcf, 0x12, 0x8f, 0xcf, 0x1f, 0x82, 0xef, 0x8a, 0x16, 0x60, 0x28, 0x7f, ++ 0x18, 0xab, 0x36, 0xaf, 0x63, 0x35, 0x17, 0x41, 0xe4, 0xfa, 0x98, 0xca, ++ 0x5a, 0x97, 0x8e, 0x7c, 0x59, 0x73, 0x51, 0x63, 0x61, 0xd0, 0xf7, 0x05, ++ 0xb6, 0xa0, 0x47, 0x1d, 0x83, 0xf8, 0x0b, 0x90, 0x9d, 0xeb, 0x04, 0x64, ++ 0x7d, 0x0d, 0x20, 0x6b, 0xee, 0x29, 0x16, 0xbb, 0x97, 0xf5, 0x4f, 0x11, ++ 0xeb, 0x6b, 0x7f, 0xc3, 0x2c, 0xaf, 0xfd, 0x91, 0xce, 0x63, 0xa2, 0x74, ++ 0x96, 0x7a, 0xc1, 0x2e, 0xf4, 0x22, 0xe8, 0x8b, 0x0c, 0x35, 0x0d, 0xf5, ++ 0x60, 0x57, 0x09, 0xf9, 0x25, 0xac, 0x9d, 0xf4, 0x84, 0xac, 0xa7, 0x47, ++ 0xeb, 0xf5, 0x47, 0x38, 0x7a, 0xab, 0xe7, 0x8a, 0xd6, 0xcb, 0x89, 0xd7, ++ 0x5f, 0xd5, 0xcf, 0x5f, 0xd8, 0x13, 0x02, 0xfc, 0x97, 0xff, 0xec, 0x31, ++ 0x2f, 0x10, 0x9f, 0x7d, 0xaa, 0x35, 0xa5, 0xfb, 0xe1, 0x7d, 0xe5, 0x33, ++ 0x2b, 0xbc, 0xc8, 0xc7, 0x9f, 0x68, 0x21, 0x2f, 0xce, 0xfb, 0xd3, 0xb0, ++ 0x3a, 0x25, 0x1e, 0x3f, 0xdf, 0xa9, 0x2a, 0xc2, 0x1f, 0x0b, 0xb8, 0x15, ++ 0xf4, 0x87, 0x05, 0x9d, 0xce, 0x3c, 0xbf, 0xe6, 0x16, 0xc4, 0xfb, 0x17, ++ 0xcf, 0xd8, 0x0d, 0xac, 0x52, 0xb3, 0xc3, 0x11, 0x71, 0x00, 0x11, 0xab, ++ 0x5b, 0x16, 0x72, 0x7e, 0xda, 0xe1, 0xf8, 0x80, 0x97, 0x1f, 0xfe, 0x1c, ++ 0xe9, 0x59, 0xd3, 0x6a, 0x95, 0xb7, 0xf2, 0x67, 0x1f, 0x4b, 0xc7, 0x78, ++ 0x27, 0x60, 0x88, 0xfb, 0x8d, 0x2c, 0x42, 0xf6, 0x73, 0xf5, 0xf6, 0x8f, ++ 0x4b, 0xd0, 0x1e, 0xa9, 0x61, 0x5d, 0xa4, 0x27, 0x62, 0xdb, 0xe1, 0xf8, ++ 0x17, 0x53, 0x68, 0xfd, 0x9a, 0xa5, 0x27, 0xf5, 0xfc, 0x2e, 0xf7, 0x5f, ++ 0x6a, 0x04, 0xdf, 0xd7, 0xb4, 0xac, 0xf9, 0x5c, 0xf5, 0x62, 0xd9, 0x2a, ++ 0xdf, 0x65, 0xc2, 0x1f, 0xb9, 0x51, 0xf5, 0xa4, 0x52, 0x5c, 0x69, 0x2c, ++ 0x1b, 0x8b, 0x74, 0x93, 0x78, 0x60, 0x61, 0x6e, 0x0f, 0x2f, 0x7f, 0xee, ++ 0x89, 0x82, 0x0f, 0x00, 0x8e, 0x8e, 0xed, 0xff, 0xe2, 0x55, 0x2c, 0x71, ++ 0x23, 0xae, 0x1f, 0xce, 0x37, 0xcf, 0xf9, 0xf1, 0xab, 0xbe, 0xde, 0xf5, ++ 0xfa, 0x39, 0xe1, 0xcf, 0x47, 0xdb, 0x85, 0xa9, 0x9d, 0xaf, 0x95, 0xdb, ++ 0xef, 0x6c, 0x2f, 0x7f, 0x56, 0xda, 0x23, 0x5e, 0xf4, 0x97, 0x2a, 0xb7, ++ 0xd8, 0xfd, 0x20, 0x99, 0xac, 0xf2, 0x85, 0x6d, 0x3f, 0x79, 0x0a, 0xf9, ++ 0xfa, 0x1d, 0x07, 0xc5, 0x19, 0x2a, 0x5e, 0x38, 0xfc, 0xf6, 0x75, 0x50, ++ 0xae, 0xd8, 0x65, 0x4f, 0x9d, 0xca, 0xa7, 0xe1, 0x56, 0xd2, 0xa3, 0xf4, ++ 0xa8, 0x81, 0xff, 0x97, 0x8e, 0x8c, 0xe2, 0xbf, 0xfc, 0xa5, 0xc3, 0xba, ++ 0x6f, 0x38, 0x7f, 0xff, 0x50, 0x4a, 0x94, 0x0e, 0x15, 0xbb, 0x0e, 0xe8, ++ 0x6c, 0x78, 0x4f, 0xbc, 0x15, 0x37, 0x1f, 0xd0, 0xdb, 0xdd, 0x71, 0xe8, ++ 0xd1, 0xfc, 0x41, 0x09, 0xda, 0xdb, 0xcb, 0x9f, 0xfb, 0x52, 0x47, 0xb9, ++ 0xfa, 0x74, 0xbf, 0xc2, 0x32, 0x72, 0x7a, 0xb6, 0x2f, 0xdb, 0x72, 0x98, ++ 0xec, 0x39, 0xc4, 0x13, 0xd1, 0x4f, 0xd0, 0xa7, 0x9b, 0x5e, 0x3d, 0xe8, ++ 0x14, 0xb9, 0xe5, 0xd5, 0xd1, 0x54, 0xcf, 0xc0, 0xf5, 0xab, 0x37, 0x3a, ++ 0x5d, 0x8d, 0x6b, 0x5f, 0x1a, 0xf1, 0xf1, 0x8b, 0xaf, 0x62, 0xfc, 0xfe, ++ 0xf7, 0x0e, 0x3f, 0xce, 0xbf, 0xec, 0xc5, 0xef, 0x7a, 0x71, 0x1e, 0xa7, ++ 0xb5, 0x5a, 0xce, 0xcf, 0x9b, 0x57, 0xa4, 0x07, 0x60, 0xdc, 0x32, 0x7b, ++ 0x28, 0xdd, 0xa0, 0x27, 0x7f, 0x5f, 0xf6, 0xf4, 0x03, 0xc4, 0x67, 0x0b, ++ 0x8e, 0x3d, 0x90, 0x4e, 0xf1, 0x00, 0x16, 0xc8, 0xb2, 0xd1, 0x1a, 0x1a, ++ 0xca, 0xc2, 0xf9, 0xcd, 0xdb, 0x74, 0x07, 0xcd, 0x6f, 0x3e, 0x0b, 0x12, ++ 0xbf, 0x95, 0x6d, 0x56, 0x4b, 0xc3, 0x18, 0xcf, 0xd2, 0xd8, 0x94, 0x5d, ++ 0x71, 0xe4, 0xe1, 0x4d, 0x21, 0x0f, 0xa7, 0xb7, 0x3a, 0x70, 0xed, 0x61, ++ 0xa7, 0x51, 0xc1, 0xa2, 0x7f, 0xf8, 0x96, 0x4a, 0xfb, 0x04, 0x8c, 0x2d, ++ 0xa2, 0x78, 0xc3, 0x03, 0x72, 0x1f, 0x82, 0x2d, 0xa6, 0xf2, 0x05, 0x27, ++ 0xa7, 0xd3, 0x36, 0xd5, 0x26, 0xe3, 0x1b, 0x4e, 0x0b, 0x9f, 0x6e, 0x7f, ++ 0xb8, 0x0d, 0xe9, 0x73, 0x66, 0x40, 0x20, 0x03, 0xe3, 0x93, 0x80, 0x87, ++ 0x90, 0xc0, 0x97, 0x82, 0x7a, 0x47, 0x3d, 0x36, 0x39, 0x83, 0xd3, 0x87, ++ 0xf9, 0xb4, 0x42, 0xd1, 0x0e, 0xf4, 0x62, 0x31, 0xbe, 0xc7, 0xfa, 0x6d, ++ 0xf6, 0x80, 0xab, 0xc0, 0xd2, 0x4e, 0xac, 0x63, 0x7c, 0xfc, 0x25, 0x62, ++ 0x7c, 0x80, 0x3b, 0x01, 0xed, 0xb1, 0xd3, 0xe9, 0x60, 0xdf, 0xc4, 0x99, ++ 0xdf, 0x97, 0xaa, 0xd4, 0xcb, 0x60, 0x6f, 0x98, 0xf8, 0xcb, 0x24, 0xd7, ++ 0x5c, 0xce, 0xb7, 0xaf, 0xe2, 0x72, 0x2d, 0xe5, 0x3c, 0x3c, 0x6d, 0x0a, ++ 0x7e, 0xff, 0xe3, 0x71, 0x2e, 0x3f, 0xd8, 0x0e, 0xd7, 0x75, 0x80, 0x2b, ++ 0x92, 0x41, 0xdf, 0x0f, 0xdc, 0xae, 0x90, 0x1e, 0x70, 0xb0, 0x48, 0x3c, ++ 0x79, 0xde, 0x6e, 0x17, 0xf2, 0x6c, 0xfd, 0x2e, 0xf7, 0x27, 0x01, 0x6e, ++ 0x0d, 0xd7, 0xa7, 0x28, 0x9f, 0x40, 0xff, 0x29, 0x84, 0x7f, 0xb2, 0xd3, ++ 0xe6, 0x6f, 0x80, 0x76, 0x26, 0xbd, 0x5c, 0x83, 0xe3, 0x51, 0x3d, 0x3d, ++ 0xfa, 0xde, 0xb4, 0xae, 0x2f, 0x10, 0xf2, 0xff, 0xba, 0x2a, 0xf6, 0x47, ++ 0x85, 0xfc, 0xb3, 0x4d, 0x5c, 0xee, 0x7b, 0xb7, 0x7b, 0x43, 0xdc, 0x3f, ++ 0xb0, 0x87, 0x7f, 0xf2, 0x14, 0xca, 0x2b, 0xc8, 0x27, 0xae, 0x33, 0x95, ++ 0x2f, 0xd8, 0x4b, 0x71, 0xde, 0x9f, 0xed, 0x3c, 0xf4, 0xf6, 0x3d, 0xc0, ++ 0xd7, 0x9f, 0x35, 0x4b, 0x39, 0xb5, 0xea, 0xcd, 0x58, 0x39, 0x2d, 0xdb, ++ 0x3d, 0x86, 0xc5, 0x93, 0xd3, 0xcf, 0xdc, 0x7e, 0x16, 0x57, 0x4e, 0xe1, ++ 0x7d, 0x5c, 0x39, 0x75, 0xb7, 0x13, 0x1f, 0xff, 0xbd, 0xf5, 0xa6, 0xc4, ++ 0xdb, 0xb9, 0x18, 0xbd, 0x29, 0xf5, 0x60, 0x6f, 0xf8, 0x8b, 0xd5, 0x83, ++ 0x6b, 0x55, 0x5f, 0x5c, 0x3d, 0x08, 0x7f, 0xc7, 0x59, 0x61, 0x4f, 0xbe, ++ 0x93, 0xfc, 0x26, 0xf9, 0xac, 0xfc, 0xa7, 0x55, 0x03, 0x29, 0x6e, 0x24, ++ 0xf9, 0x51, 0xf2, 0x5b, 0x37, 0x3f, 0x4a, 0x7e, 0x8b, 0x9d, 0xa7, 0x15, ++ 0x6f, 0xb1, 0xdf, 0x5f, 0x11, 0xfa, 0x46, 0xd2, 0xd9, 0xbe, 0x8c, 0x85, ++ 0x3c, 0x18, 0x2f, 0xdd, 0xa7, 0x92, 0x7f, 0xdd, 0x09, 0x30, 0x35, 0x02, ++ 0x7d, 0x3b, 0x77, 0xe6, 0x84, 0x31, 0xee, 0xbc, 0xc2, 0xc5, 0xe3, 0x17, ++ 0x9d, 0x46, 0x97, 0x37, 0x05, 0x9e, 0x2b, 0x92, 0x79, 0xb9, 0x2b, 0x4d, ++ 0x6f, 0x44, 0xfd, 0x20, 0xdf, 0x77, 0xb9, 0x78, 0x7c, 0xbb, 0xb3, 0xb4, ++ 0xcb, 0x9b, 0x6c, 0xf2, 0x2b, 0x3e, 0xd8, 0xab, 0x7a, 0x7d, 0xf0, 0xbd, ++ 0x3d, 0xcc, 0xa6, 0xc4, 0xf3, 0x37, 0x40, 0xf3, 0x12, 0x1c, 0xed, 0xac, ++ 0xb7, 0xef, 0x3c, 0x1e, 0x3c, 0x59, 0x75, 0x67, 0x2f, 0x45, 0xbf, 0xbd, ++ 0x49, 0xa5, 0xfd, 0xec, 0xb9, 0xf5, 0x77, 0x79, 0x71, 0x1f, 0xb8, 0x73, ++ 0xef, 0xa0, 0x7f, 0x42, 0xfd, 0x34, 0xef, 0x0d, 0x30, 0x30, 0x01, 0xde, ++ 0x4e, 0xb4, 0x03, 0x93, 0x70, 0x7a, 0x01, 0x0d, 0xf3, 0x12, 0xe6, 0x08, ++ 0x7a, 0x7f, 0xc2, 0x42, 0x8f, 0x4f, 0x80, 0xf9, 0xcd, 0xd9, 0xcb, 0xfd, ++ 0x85, 0xb9, 0x6b, 0x63, 0xec, 0x7b, 0xf7, 0x12, 0x1d, 0xf5, 0x0d, 0xd8, ++ 0xf7, 0x27, 0xad, 0x71, 0x6d, 0xce, 0x37, 0xe5, 0xa2, 0x9f, 0xb2, 0x4d, ++ 0xd6, 0xef, 0xe5, 0x6c, 0x2d, 0xd1, 0xad, 0x3c, 0x86, 0x8f, 0x82, 0xc2, ++ 0x0f, 0x1c, 0xab, 0x09, 0x3e, 0x1a, 0xc1, 0x46, 0x08, 0x3f, 0x8c, 0xc7, ++ 0x2f, 0x84, 0xbe, 0x9a, 0xac, 0xe6, 0xff, 0x13, 0xda, 0x19, 0x9d, 0x47, ++ 0x79, 0x5c, 0xf1, 0xfc, 0x5e, 0x95, 0xf0, 0x7f, 0x7e, 0xa7, 0x12, 0xc6, ++ 0xb8, 0x0f, 0xc5, 0x77, 0xc7, 0x23, 0xfd, 0xbb, 0x74, 0x66, 0xf2, 0x97, ++ 0x3b, 0x90, 0xdf, 0xf4, 0xde, 0xe5, 0xb8, 0xe3, 0xe5, 0x3f, 0x14, 0xfe, ++ 0x10, 0xaa, 0x54, 0xee, 0x79, 0xb7, 0xe0, 0x9f, 0xe1, 0xd9, 0xb1, 0xe7, ++ 0x9d, 0xbc, 0x5f, 0x60, 0xf9, 0xe7, 0xbf, 0xcb, 0x7e, 0x97, 0xf5, 0xac, ++ 0x5f, 0xbc, 0xff, 0x4f, 0xb4, 0x7f, 0xdc, 0xb9, 0xdf, 0x41, 0x70, 0x74, ++ 0xee, 0x7f, 0x3d, 0xfb, 0x87, 0x58, 0x7e, 0xd5, 0xe1, 0x47, 0x38, 0x3b, ++ 0x97, 0x39, 0x68, 0xff, 0x2c, 0xb4, 0xdf, 0x13, 0x1e, 0x82, 0xdf, 0x07, ++ 0x00, 0xbd, 0x71, 0xdd, 0xdc, 0xf7, 0x65, 0x41, 0x3b, 0xad, 0x3b, 0x0d, ++ 0x44, 0xa7, 0xd9, 0x1a, 0xdf, 0xef, 0x38, 0xbf, 0xf7, 0xcf, 0xef, 0x2b, ++ 0x98, 0x7f, 0xb0, 0xd7, 0xe1, 0xc3, 0x79, 0xd4, 0xec, 0xe7, 0x79, 0x21, ++ 0x35, 0xaf, 0xba, 0x28, 0xee, 0xd2, 0xb9, 0xef, 0xcb, 0xc2, 0xa0, 0xfb, ++ 0x6f, 0x37, 0x9f, 0x6a, 0x9d, 0x05, 0x89, 0xff, 0x3c, 0x6c, 0xc6, 0x6e, ++ 0xe4, 0xd7, 0x64, 0xbe, 0x0f, 0x50, 0xf3, 0x8b, 0xf1, 0xdb, 0xea, 0x71, ++ 0x3f, 0xbc, 0xe5, 0x80, 0x8e, 0xfb, 0x2b, 0xc5, 0xbf, 0xfc, 0x4b, 0x01, ++ 0xea, 0x97, 0xce, 0xdd, 0xdc, 0x4e, 0x38, 0x67, 0x6f, 0x7f, 0x1a, 0xf7, ++ 0x41, 0xab, 0xb4, 0xc1, 0xcb, 0xec, 0x28, 0xf7, 0x68, 0xb3, 0xf5, 0x05, ++ 0xbb, 0xd3, 0x3e, 0x6f, 0x62, 0x28, 0x3f, 0x1e, 0x5e, 0x38, 0x1e, 0x3a, ++ 0x01, 0x0f, 0x38, 0x2f, 0xc0, 0x4b, 0x19, 0xea, 0xc5, 0xde, 0xf0, 0xd1, ++ 0xa0, 0x71, 0x7f, 0xf3, 0xbf, 0x1f, 0x3e, 0x3e, 0xbf, 0x0f, 0xc7, 0xaf, ++ 0xdc, 0x3b, 0x96, 0xe4, 0x26, 0x8a, 0x17, 0x25, 0xc0, 0xdf, 0x7b, 0xc2, ++ 0x4e, 0x85, 0xe6, 0xcf, 0xdf, 0xef, 0xff, 0xb2, 0x00, 0xed, 0x9e, 0xcf, ++ 0x9a, 0xeb, 0x69, 0x1d, 0xbf, 0xdc, 0xbc, 0xb7, 0xfd, 0x8f, 0x9b, 0xb7, ++ 0x12, 0xb9, 0x92, 0x79, 0x1f, 0xfc, 0x6f, 0xce, 0xff, 0x53, 0x34, 0xbe, ++ 0x2e, 0xc5, 0xca, 0x41, 0x4f, 0x3e, 0xff, 0xf9, 0x83, 0x54, 0x7e, 0xd1, ++ 0xe3, 0x27, 0x78, 0xaf, 0x50, 0xfe, 0x4f, 0xfe, 0x4f, 0xa3, 0xfb, 0x6e, ++ 0xa0, 0xbb, 0xf7, 0xf2, 0x74, 0x57, 0xec, 0xff, 0x5d, 0xe7, 0x7d, 0x39, ++ 0xba, 0xbf, 0x21, 0xe8, 0xee, 0x31, 0x30, 0xaf, 0xa0, 0x73, 0xdf, 0x5f, ++ 0x28, 0x5e, 0x2e, 0xe7, 0x7f, 0xb9, 0x79, 0xfb, 0xfe, 0x1f, 0x9d, 0xb7, ++ 0xb4, 0x7f, 0x56, 0xdb, 0xfc, 0x4d, 0xb9, 0x50, 0x7f, 0x2d, 0x8b, 0xb4, ++ 0xf9, 0x00, 0xce, 0x15, 0x43, 0xa7, 0x37, 0x61, 0x98, 0x09, 0xdc, 0x84, ++ 0xd2, 0x78, 0xf6, 0x48, 0xa9, 0x9d, 0xfb, 0x47, 0xaa, 0xc2, 0xe3, 0x30, ++ 0x6c, 0x00, 0x8f, 0x0b, 0x31, 0xe1, 0x4f, 0x50, 0x0a, 0x98, 0x0f, 0xe3, ++ 0x28, 0xf3, 0xc9, 0xae, 0xd3, 0xdc, 0x8d, 0x64, 0x67, 0x32, 0xcd, 0xdf, ++ 0x16, 0x00, 0x7c, 0xac, 0xbe, 0x7a, 0xb6, 0x9f, 0x72, 0x35, 0xd8, 0xc8, ++ 0x13, 0x41, 0x2c, 0xf7, 0x9f, 0xe0, 0xa7, 0xf8, 0x66, 0x8c, 0x5f, 0xd5, ++ 0xa0, 0xb0, 0x80, 0x02, 0xf6, 0x9e, 0x76, 0xf5, 0xb7, 0x8f, 0xa2, 0x9d, ++ 0x6f, 0x1f, 0x6a, 0x8b, 0x38, 0x0a, 0xe8, 0xf9, 0x01, 0x3e, 0x1f, 0x16, ++ 0x71, 0x2c, 0xbb, 0xa1, 0x5b, 0xfc, 0x09, 0x77, 0x8c, 0x3f, 0xe0, 0xf2, ++ 0x59, 0xbf, 0x3b, 0x44, 0x7f, 0x4e, 0x36, 0xb2, 0x29, 0x17, 0xf3, 0x14, ++ 0xdc, 0x9a, 0x11, 0x86, 0xf1, 0xdd, 0x45, 0x4d, 0x34, 0x1f, 0xf7, 0x10, ++ 0xc6, 0x9a, 0x4c, 0xfb, 0x80, 0x0e, 0x66, 0x6a, 0x0f, 0xfd, 0xe5, 0x63, ++ 0x00, 0xd6, 0x64, 0x3f, 0x7e, 0x53, 0xfc, 0xd5, 0x77, 0xe3, 0x6f, 0x64, ++ 0x5b, 0x00, 0xf1, 0x37, 0xcc, 0x46, 0x71, 0x2d, 0x4a, 0xea, 0x23, 0x7c, ++ 0xf8, 0xc3, 0xab, 0xc9, 0xcf, 0xe4, 0xfe, 0x63, 0x14, 0x9f, 0x8d, 0x6d, ++ 0x88, 0x47, 0x8d, 0x81, 0xff, 0xc7, 0xe7, 0x47, 0x7e, 0x23, 0x13, 0xfe, ++ 0xa2, 0x26, 0xba, 0xd0, 0x86, 0xda, 0x02, 0x2e, 0x6b, 0x3d, 0xe1, 0x17, ++ 0x5d, 0x96, 0x3e, 0x9c, 0x1e, 0xd9, 0x95, 0x82, 0x3e, 0x8b, 0x2d, 0xf4, ++ 0x90, 0xf8, 0x8f, 0x43, 0x17, 0x0b, 0x3d, 0x24, 0x7e, 0xbf, 0x29, 0x5d, ++ 0x62, 0xe9, 0x11, 0x8b, 0xf7, 0xdb, 0xed, 0x3c, 0xde, 0x16, 0x4b, 0x27, ++ 0x4b, 0x7e, 0x47, 0x1a, 0xf7, 0x43, 0x22, 0xe0, 0x87, 0xbc, 0xbe, 0x73, ++ 0x1b, 0xc5, 0x3b, 0xce, 0x3e, 0xff, 0xc1, 0x2d, 0x58, 0xbf, 0xe2, 0x17, ++ 0x2a, 0x73, 0x42, 0x3f, 0xe7, 0x76, 0x7a, 0x58, 0x04, 0xe5, 0x57, 0x0b, ++ 0xeb, 0xe8, 0x4f, 0x95, 0xb7, 0xa8, 0x71, 0xe3, 0xbc, 0xd2, 0x2e, 0xaf, ++ 0xf8, 0x99, 0x87, 0xc6, 0x2b, 0xdf, 0xed, 0x08, 0x4f, 0x85, 0xf6, 0xe5, ++ 0x7b, 0x3e, 0x2c, 0x20, 0xbb, 0x69, 0x59, 0xd7, 0x91, 0x7e, 0x18, 0x17, ++ 0x78, 0x5e, 0xe1, 0xf4, 0x0b, 0xb5, 0x17, 0xe0, 0xbe, 0x5d, 0xb9, 0xc6, ++ 0xfd, 0x83, 0xd8, 0xfe, 0x36, 0xd9, 0x79, 0x5c, 0xa0, 0xe3, 0x95, 0xc4, ++ 0x19, 0x18, 0x7f, 0x50, 0x76, 0xf0, 0x7c, 0xc5, 0xf2, 0xe6, 0xbb, 0xec, ++ 0x0e, 0x13, 0xbf, 0xfd, 0x2f, 0x3b, 0xcf, 0x7b, 0x85, 0x7a, 0x24, 0xcf, ++ 0xa1, 0xe7, 0x14, 0x5a, 0x6f, 0x7a, 0xc2, 0xc7, 0xfd, 0x82, 0x8e, 0xe7, ++ 0x14, 0x0e, 0x5f, 0xab, 0x3d, 0x8c, 0x79, 0x8f, 0xe5, 0x3b, 0xb6, 0xe8, ++ 0x41, 0xf4, 0x2b, 0x77, 0x7c, 0x4e, 0x71, 0xec, 0xe2, 0x9f, 0xbd, 0xe0, ++ 0x6d, 0x27, 0x7f, 0x51, 0xb5, 0xfa, 0xcf, 0x3b, 0x54, 0xa2, 0x27, 0x3c, ++ 0x89, 0x7e, 0xb1, 0x7e, 0x6c, 0x75, 0x4b, 0x15, 0xf9, 0x09, 0xd5, 0xcd, ++ 0xc2, 0x4f, 0x8c, 0xf1, 0xa3, 0x2a, 0x7e, 0xb6, 0x6f, 0x4f, 0x08, 0x50, ++ 0x53, 0xf1, 0xd2, 0xb3, 0x5e, 0x8c, 0xbf, 0x9c, 0x69, 0x7b, 0xc6, 0x4b, ++ 0xfe, 0xe9, 0x0e, 0xee, 0x7f, 0x6a, 0x6e, 0x2d, 0xbe, 0x7f, 0x7a, 0x39, ++ 0xbf, 0xb4, 0x79, 0x55, 0x5c, 0xbf, 0xf4, 0x0c, 0xfe, 0x03, 0xfc, 0x89, ++ 0x03, 0xf6, 0x18, 0x7f, 0x7e, 0x47, 0x9f, 0x2b, 0xdb, 0xbf, 0x7c, 0xe1, ++ 0xc2, 0xd3, 0x18, 0x27, 0xed, 0xd8, 0xfd, 0xd9, 0xd3, 0x08, 0x77, 0xe5, ++ 0x7f, 0xfe, 0xfb, 0xd3, 0x68, 0xdf, 0xb3, 0xfd, 0x2e, 0xe3, 0x19, 0x98, ++ 0x6f, 0xcd, 0xf3, 0xbf, 0xa5, 0x78, 0x93, 0x6c, 0xf7, 0xae, 0x90, 0xd3, ++ 0x73, 0x03, 0x58, 0x28, 0x0b, 0xea, 0x9d, 0x7b, 0xc7, 0x41, 0xf9, 0x23, ++ 0xe7, 0xf6, 0x9d, 0xce, 0x46, 0x7f, 0xee, 0xdc, 0xae, 0x3f, 0xa5, 0xa3, ++ 0x5f, 0xbf, 0x64, 0xdf, 0xe4, 0x0c, 0x9c, 0xf7, 0x92, 0x97, 0x8b, 0x33, ++ 0x58, 0x1c, 0x79, 0x97, 0x4f, 0xe4, 0xcb, 0xf0, 0x15, 0xc4, 0x09, 0x63, ++ 0xe9, 0x70, 0xa8, 0xe5, 0x10, 0xf9, 0x21, 0x67, 0x4f, 0x38, 0xc8, 0xef, ++ 0xeb, 0x8e, 0x2f, 0x34, 0x57, 0xf1, 0x78, 0x8d, 0x4f, 0xc4, 0x15, 0x76, ++ 0xc6, 0x8f, 0xc3, 0x4a, 0x7f, 0xb8, 0xba, 0xe5, 0xc3, 0x12, 0x1e, 0x1f, ++ 0x13, 0x7e, 0xf1, 0xe5, 0xe2, 0x08, 0xc7, 0x81, 0x8e, 0xd7, 0x5e, 0x01, ++ 0xbd, 0x76, 0x8a, 0x38, 0x51, 0x0c, 0xbd, 0xce, 0xe2, 0x3f, 0x80, 0x2e, ++ 0x5f, 0xc6, 0xd0, 0xeb, 0x02, 0x0b, 0xfe, 0x38, 0x0b, 0xf7, 0x21, 0x5b, ++ 0xfa, 0xf4, 0x1a, 0x47, 0x88, 0x5c, 0x01, 0x9e, 0x64, 0x7c, 0xf7, 0x88, ++ 0x3d, 0x60, 0xd3, 0x51, 0x0e, 0x76, 0x27, 0x76, 0xd3, 0x69, 0x2a, 0xd2, ++ 0xe9, 0x85, 0x0b, 0xd9, 0x18, 0x0f, 0xff, 0xc4, 0xde, 0x45, 0x76, 0x4f, ++ 0xd7, 0x3e, 0x87, 0x81, 0xfe, 0x7d, 0xf9, 0xbe, 0xdf, 0x91, 0x5c, 0x9c, ++ 0x7b, 0xf9, 0x18, 0xc5, 0x4f, 0x99, 0x88, 0xb3, 0x9e, 0x63, 0xdd, 0x7f, ++ 0x3c, 0x2e, 0xa6, 0x88, 0xf9, 0x6d, 0xf7, 0xf0, 0xf8, 0x83, 0xc0, 0x37, ++ 0xc6, 0x27, 0x7c, 0x5e, 0x7a, 0x2f, 0xe2, 0x10, 0x9c, 0x5f, 0x65, 0x7c, ++ 0xa2, 0xb7, 0xb8, 0xc4, 0x58, 0x5d, 0xe4, 0x3d, 0x89, 0xb8, 0x73, 0xd5, ++ 0xf6, 0x77, 0x75, 0x16, 0x13, 0xe7, 0x51, 0xc6, 0x21, 0x9d, 0x3e, 0xb0, ++ 0xc4, 0xc7, 0xe5, 0xbc, 0x63, 0xfb, 0x33, 0x10, 0x0f, 0x63, 0xcd, 0xf1, ++ 0xb5, 0xf8, 0x71, 0x1f, 0xe9, 0x37, 0x47, 0xe9, 0xc4, 0xe3, 0x6a, 0x32, ++ 0x7e, 0x76, 0x6e, 0x8b, 0x88, 0xbb, 0xc1, 0xfb, 0xfe, 0x23, 0xd1, 0x1f, ++ 0xe4, 0x71, 0x8c, 0x9a, 0xb0, 0xf2, 0x3b, 0x16, 0x47, 0x0e, 0x65, 0x7c, ++ 0x6d, 0xa4, 0x1e, 0x23, 0x87, 0xe1, 0x2b, 0x8b, 0xab, 0x5d, 0x0e, 0xde, ++ 0xbf, 0x16, 0x1f, 0x43, 0x74, 0xbe, 0x3e, 0x48, 0xbc, 0x74, 0x7c, 0x15, ++ 0x5f, 0x0f, 0xff, 0xa3, 0xce, 0xe5, 0x7a, 0x8a, 0x2d, 0x38, 0x55, 0x37, ++ 0xed, 0x67, 0xdf, 0x2f, 0xf6, 0x59, 0x24, 0xbe, 0x24, 0xbc, 0x1d, 0x22, ++ 0x0f, 0xaf, 0xe3, 0x79, 0x95, 0xe2, 0x41, 0x8d, 0xcd, 0x87, 0x48, 0x9f, ++ 0xc6, 0xca, 0x73, 0x75, 0x2f, 0xe7, 0x20, 0xee, 0xd3, 0x79, 0xbc, 0xb5, ++ 0xba, 0xf5, 0x40, 0x01, 0xea, 0x9d, 0x8e, 0x83, 0xaf, 0x10, 0xdf, 0x55, ++ 0xef, 0xfc, 0x40, 0x0f, 0x41, 0x3f, 0x47, 0x76, 0xbc, 0xa4, 0x73, 0x7b, ++ 0x92, 0xf3, 0x39, 0xea, 0xe9, 0xb0, 0x49, 0x4f, 0x77, 0xbc, 0x78, 0xa0, ++ 0x80, 0xc7, 0xfd, 0x78, 0xde, 0x6d, 0x6c, 0xff, 0x15, 0xa2, 0xff, 0x9a, ++ 0xbd, 0xd6, 0xfe, 0x6b, 0x76, 0x7e, 0x6e, 0xe9, 0xbf, 0x22, 0xd4, 0x4c, ++ 0xfb, 0x5f, 0x97, 0x1b, 0xe7, 0x8c, 0x16, 0xb8, 0x0b, 0xe7, 0x7b, 0xa6, ++ 0xcd, 0xce, 0x50, 0xdf, 0x9d, 0x69, 0x56, 0xa7, 0x84, 0xe3, 0xd9, 0x81, ++ 0xba, 0xdd, 0xb2, 0x0f, 0xda, 0x78, 0x4c, 0xa7, 0xf5, 0x6a, 0xf4, 0x5b, ++ 0x09, 0x94, 0x9f, 0xbb, 0xe4, 0xd8, 0x94, 0x77, 0x93, 0x70, 0x9f, 0x0e, ++ 0xc4, 0x0c, 0xed, 0xdf, 0x96, 0x7a, 0xce, 0x57, 0x2d, 0x3f, 0x0a, 0xf4, ++ 0x43, 0xba, 0xb4, 0x1c, 0xbb, 0x47, 0xc5, 0x75, 0x63, 0x0f, 0xe2, 0xd1, ++ 0x64, 0x07, 0x17, 0x1e, 0xaf, 0x2d, 0xf6, 0x80, 0xbc, 0x16, 0xbe, 0x57, ++ 0x3a, 0x1a, 0xd9, 0x2a, 0x56, 0x0f, 0x8c, 0x3d, 0x61, 0xb3, 0xc0, 0x0d, ++ 0xe3, 0x64, 0xa0, 0x3e, 0x6e, 0x80, 0x7e, 0x30, 0x9f, 0x1e, 0xf3, 0x87, ++ 0x70, 0x7f, 0x54, 0xf5, 0x96, 0x4c, 0x41, 0x78, 0x54, 0xc3, 0x66, 0xb8, ++ 0xe2, 0xae, 0x9f, 0xbc, 0x3f, 0xbb, 0xbb, 0x94, 0xa1, 0x5d, 0x6e, 0x37, ++ 0xac, 0xf9, 0xca, 0x99, 0xd3, 0x45, 0x1c, 0x2d, 0x62, 0xcd, 0x5b, 0xcf, ++ 0xd4, 0xd9, 0x50, 0xdc, 0x07, 0x67, 0xb6, 0x04, 0x3f, 0xee, 0x07, 0x2c, ++ 0x1e, 0x16, 0x18, 0x71, 0x18, 0xf3, 0xea, 0xe7, 0x65, 0x52, 0x9c, 0x38, ++ 0xeb, 0x36, 0xde, 0xee, 0xac, 0xe1, 0x0e, 0xd9, 0xae, 0x8d, 0xee, 0xdb, ++ 0x26, 0x5e, 0x84, 0xfe, 0x31, 0x0f, 0xc6, 0x16, 0x5e, 0x3f, 0x13, 0xda, ++ 0x25, 0x6a, 0xcd, 0x0a, 0xee, 0x03, 0xc0, 0x93, 0x21, 0x5d, 0x1e, 0xb0, ++ 0x05, 0xb7, 0xea, 0x69, 0x58, 0x4f, 0x67, 0x3e, 0x50, 0x8d, 0x4f, 0xeb, ++ 0x8a, 0x46, 0xf9, 0x17, 0xe2, 0xdc, 0x8b, 0xec, 0x4f, 0xd6, 0xeb, 0x6d, ++ 0x3f, 0x58, 0x9e, 0x43, 0x52, 0x05, 0xfc, 0x83, 0xc4, 0x7e, 0xf0, 0x00, ++ 0xd6, 0xae, 0xe0, 0x7e, 0xf0, 0x26, 0x0f, 0x3f, 0x8f, 0x34, 0xd0, 0x9d, ++ 0x4a, 0xe7, 0x8d, 0xb6, 0x09, 0xbb, 0xcd, 0x87, 0xfb, 0xae, 0x58, 0xaf, ++ 0xd6, 0xba, 0x6e, 0x5f, 0xf6, 0x3c, 0xd2, 0x4a, 0x6b, 0x39, 0xb5, 0xb8, ++ 0x68, 0xd1, 0x40, 0x3f, 0x63, 0x1f, 0x36, 0x3e, 0x58, 0xac, 0x81, 0x3e, ++ 0x48, 0xbd, 0xab, 0x68, 0x57, 0x3f, 0x03, 0xf7, 0xa5, 0x37, 0x14, 0x63, ++ 0xde, 0x7d, 0xea, 0xb3, 0x45, 0x23, 0xb2, 0xa0, 0x7c, 0x97, 0x63, 0xf8, ++ 0x24, 0xfa, 0xfe, 0xeb, 0xa2, 0x11, 0xd9, 0x50, 0xae, 0x75, 0x8e, 0x9b, ++ 0x44, 0xdf, 0x2b, 0x14, 0xca, 0x0b, 0xdc, 0xa7, 0x77, 0x16, 0x87, 0xf2, ++ 0xa3, 0xf2, 0x99, 0x06, 0xc6, 0x2d, 0xe6, 0x5b, 0x80, 0xdc, 0x1e, 0x44, ++ 0xb9, 0x3d, 0x5b, 0xda, 0xd1, 0x88, 0x5f, 0xab, 0xee, 0xf8, 0x42, 0xe7, ++ 0xe7, 0x61, 0x58, 0x29, 0xce, 0x7f, 0xc0, 0x38, 0x3e, 0xff, 0xfe, 0xee, ++ 0xf7, 0x76, 0xe1, 0x7c, 0x07, 0xda, 0xda, 0xeb, 0x91, 0xff, 0x7e, 0xbc, ++ 0xef, 0xcb, 0x64, 0xac, 0xe7, 0x63, 0x06, 0xcd, 0xd3, 0x60, 0x0d, 0x06, ++ 0xee, 0xcb, 0xc3, 0xab, 0x71, 0x5f, 0x5f, 0x22, 0xff, 0x27, 0x36, 0x0f, ++ 0x46, 0xf2, 0xfb, 0xb6, 0xc4, 0xe0, 0x6f, 0x10, 0x8e, 0x55, 0xb3, 0x87, ++ 0x3e, 0x51, 0x82, 0x3a, 0xb5, 0xd2, 0x4f, 0x7c, 0x14, 0xbb, 0x4f, 0xcc, ++ 0x8c, 0x54, 0xa2, 0xcb, 0x5c, 0x41, 0x17, 0x84, 0xd3, 0x69, 0xca, 0x43, ++ 0x5e, 0xa0, 0x86, 0x28, 0xef, 0x05, 0x4f, 0x24, 0x50, 0x5e, 0x0f, 0x9b, ++ 0x64, 0xe0, 0x78, 0x4a, 0xa8, 0x52, 0xfd, 0xfa, 0x9a, 0x6f, 0x0e, 0xd7, ++ 0x69, 0x5d, 0xe4, 0x1b, 0x88, 0xf3, 0x60, 0xa6, 0xf3, 0x52, 0x67, 0x10, ++ 0xde, 0x75, 0x89, 0x41, 0x7a, 0xc6, 0x9e, 0x97, 0x3a, 0xa8, 0x97, 0x76, ++ 0xe0, 0xfb, 0xac, 0xf9, 0x17, 0xb3, 0x71, 0x1e, 0xf2, 0x1c, 0x54, 0xf1, ++ 0x02, 0x37, 0xc5, 0x07, 0xce, 0xef, 0x65, 0x61, 0x47, 0x1c, 0x39, 0x92, ++ 0xcf, 0xad, 0x75, 0x2c, 0x4d, 0x1b, 0xdc, 0xfb, 0xf7, 0xdf, 0x38, 0x82, ++ 0xff, 0x81, 0xfd, 0xe7, 0xfe, 0xd2, 0xb7, 0xfb, 0x28, 0xf4, 0x77, 0xed, ++ 0x5c, 0xdd, 0x8f, 0x29, 0x6c, 0xd7, 0x2e, 0x1d, 0x9d, 0xa6, 0x8d, 0x62, ++ 0x7c, 0x42, 0x68, 0x57, 0x08, 0xfa, 0x65, 0x22, 0x4d, 0x51, 0xce, 0x1e, ++ 0x64, 0xfc, 0x7c, 0x8e, 0x43, 0x09, 0xa0, 0xff, 0xd8, 0xf9, 0x5d, 0x83, ++ 0xf4, 0x70, 0xff, 0xb9, 0x53, 0xc9, 0xcf, 0xe8, 0x4c, 0xcc, 0x69, 0xc6, ++ 0x3c, 0x8a, 0xce, 0x1f, 0xf2, 0x7c, 0x00, 0x58, 0xe9, 0x15, 0x94, 0x87, ++ 0x01, 0x7b, 0x93, 0x22, 0xe8, 0x07, 0x01, 0x3f, 0x7f, 0x11, 0xc3, 0xcf, ++ 0x5f, 0x58, 0xd7, 0x1b, 0xeb, 0xb8, 0x9d, 0x5f, 0xfb, 0x5a, 0xdb, 0xa9, ++ 0x3f, 0x43, 0xf4, 0x07, 0x06, 0x4f, 0x3a, 0xca, 0x0f, 0xff, 0xeb, 0x54, ++ 0xb9, 0xbd, 0xdd, 0x59, 0xe7, 0x23, 0x38, 0xc0, 0x3c, 0x3c, 0x80, 0xeb, ++ 0xea, 0x95, 0x8e, 0x97, 0xe5, 0x10, 0xf1, 0x70, 0x41, 0x1f, 0xc0, 0x7b, ++ 0x3f, 0x87, 0x09, 0xef, 0x03, 0x1d, 0xbd, 0xd2, 0x2f, 0xd7, 0xc1, 0xe9, ++ 0x47, 0xcf, 0x58, 0xfa, 0xcd, 0x77, 0xd6, 0x66, 0xa3, 0x3c, 0x97, 0x97, ++ 0x36, 0x97, 0xa0, 0x8b, 0xfa, 0x5b, 0x3d, 0x78, 0x15, 0xd6, 0x3b, 0x3d, ++ 0xff, 0x48, 0xa3, 0x1d, 0xea, 0x55, 0xcd, 0xac, 0xcd, 0x43, 0x66, 0xef, ++ 0x49, 0x57, 0x7e, 0x1e, 0x2b, 0x7d, 0xef, 0xac, 0x7a, 0x3b, 0xc6, 0x2b, ++ 0x90, 0x2e, 0xbe, 0x9e, 0xf4, 0xbb, 0x76, 0xa9, 0x3f, 0x4d, 0xeb, 0x63, ++ 0xa1, 0xe7, 0x28, 0x07, 0xf4, 0x73, 0xed, 0xde, 0xcf, 0x6d, 0x08, 0xb7, ++ 0xa4, 0xe3, 0x13, 0x22, 0xcf, 0x3f, 0xb6, 0xfd, 0x3f, 0x38, 0x14, 0x31, ++ 0x6e, 0x65, 0xbd, 0x1d, 0xe3, 0x24, 0xad, 0x3a, 0xd9, 0xb3, 0xb1, 0xf5, ++ 0xa6, 0xe0, 0xa1, 0xaa, 0x31, 0xd1, 0x72, 0x81, 0xb3, 0x90, 0xc6, 0xcd, ++ 0xb0, 0xf1, 0x78, 0x47, 0xcf, 0xfa, 0x7c, 0xfd, 0x8b, 0xf6, 0xeb, 0xa4, ++ 0x73, 0x59, 0xbd, 0xf1, 0x61, 0x81, 0xc1, 0xfb, 0x03, 0xbc, 0x7f, 0x1b, ++ 0xe1, 0x97, 0x78, 0xbf, 0xc5, 0x21, 0xf4, 0x6d, 0x4f, 0xbc, 0x4f, 0xc3, ++ 0x7a, 0x80, 0x77, 0x7a, 0x5e, 0x01, 0xde, 0xef, 0xbc, 0x14, 0xde, 0xa5, ++ 0xfd, 0x5c, 0x21, 0xf4, 0x41, 0x05, 0xee, 0x9f, 0x00, 0xdf, 0x7c, 0x1c, ++ 0x98, 0x9e, 0x3e, 0x18, 0xc6, 0x2d, 0x51, 0xdd, 0xc4, 0xf7, 0x0b, 0x9f, ++ 0x51, 0x49, 0xde, 0xa0, 0xfe, 0xd4, 0xac, 0xf4, 0xa8, 0xfe, 0x58, 0x38, ++ 0xbe, 0xf6, 0x00, 0xce, 0x73, 0xe1, 0x66, 0x85, 0xf8, 0x73, 0xae, 0x38, ++ 0x5f, 0xfa, 0x99, 0xc8, 0xe7, 0x8f, 0xcd, 0x83, 0x9a, 0x3f, 0x23, 0x44, ++ 0xfb, 0x3a, 0x3d, 0xf2, 0xa1, 0xc2, 0x31, 0xfe, 0x5c, 0x4c, 0x9e, 0x7b, ++ 0x75, 0x94, 0x4f, 0x07, 0xf2, 0xfc, 0x34, 0x7e, 0x5e, 0x4b, 0x15, 0x72, ++ 0x50, 0xbc, 0x20, 0x3f, 0x09, 0xed, 0xa0, 0xfd, 0x76, 0xdf, 0xaf, 0xc9, ++ 0xbe, 0x7e, 0x43, 0x65, 0x5b, 0xe3, 0xe0, 0x9d, 0x98, 0x2b, 0x2d, 0x5a, ++ 0x1e, 0x50, 0x6b, 0xb3, 0xe4, 0xc7, 0xb2, 0xb9, 0xc9, 0x96, 0x7e, 0x27, ++ 0x2d, 0xc8, 0xa7, 0xfd, 0xee, 0xc5, 0x1e, 0xdf, 0x25, 0xfd, 0xa9, 0x81, ++ 0x4b, 0xad, 0xeb, 0x75, 0x4e, 0xc8, 0x7a, 0xbe, 0x68, 0xd0, 0x4a, 0xeb, ++ 0xf9, 0xa2, 0x21, 0x4d, 0x7d, 0x2d, 0xf5, 0xaf, 0xda, 0x98, 0x6b, 0xf9, ++ 0x3e, 0x2c, 0x7c, 0xb5, 0xe5, 0xfb, 0x35, 0x3b, 0x46, 0x5a, 0xca, 0xc3, ++ 0x9b, 0xaf, 0xb3, 0xd4, 0xbf, 0xb6, 0x75, 0xa2, 0xa5, 0x3c, 0x22, 0xf2, ++ 0x6d, 0x4b, 0xfd, 0x51, 0x47, 0xa7, 0x5b, 0xca, 0x63, 0xda, 0xee, 0xb1, ++ 0xd4, 0x1f, 0x7b, 0x62, 0xb6, 0xe5, 0xfb, 0xf8, 0xf6, 0x72, 0xcb, 0xf7, ++ 0xeb, 0x3f, 0x59, 0x6c, 0x29, 0x7f, 0xab, 0xeb, 0x07, 0x56, 0xfb, 0xc4, ++ 0xc6, 0x48, 0x1f, 0xb2, 0x04, 0x85, 0xf4, 0xe3, 0x6b, 0x75, 0xe3, 0xb2, ++ 0x31, 0x0f, 0x9b, 0x8d, 0x56, 0x26, 0x21, 0x3e, 0x8b, 0x45, 0x1e, 0xe1, ++ 0x6b, 0x8b, 0x74, 0x9b, 0xe1, 0xc5, 0x67, 0x9e, 0xcd, 0x00, 0x3d, 0x75, ++ 0x70, 0xde, 0x54, 0x5a, 0xef, 0x5f, 0x5b, 0x94, 0x1e, 0xf0, 0xd1, 0xb3, ++ 0x30, 0x80, 0xfe, 0x0c, 0x53, 0x27, 0x8c, 0x8e, 0x97, 0xa7, 0x39, 0xd9, ++ 0x18, 0x9f, 0x6d, 0xce, 0x87, 0x2a, 0x76, 0xda, 0x2d, 0xfa, 0x6c, 0xb2, ++ 0x61, 0x2d, 0xbf, 0x2c, 0xf9, 0x66, 0x20, 0xe7, 0x9b, 0x57, 0x63, 0xf4, ++ 0x99, 0xbd, 0x76, 0x42, 0x04, 0x2c, 0x42, 0xd6, 0x77, 0xe1, 0xe0, 0x0c, ++ 0x1c, 0x0f, 0xe4, 0x6b, 0x9f, 0xd0, 0x6b, 0xfb, 0xae, 0x50, 0xaf, 0x1d, ++ 0x44, 0x39, 0x3c, 0x9d, 0x1e, 0x69, 0xc4, 0xb2, 0x94, 0x2f, 0x26, 0xd6, ++ 0xd5, 0x22, 0xc1, 0x47, 0xf0, 0x0c, 0xe8, 0x98, 0x0f, 0x39, 0xc9, 0x43, ++ 0xeb, 0x6f, 0x00, 0x5f, 0xfa, 0xe8, 0x7d, 0x48, 0x03, 0x39, 0x99, 0xe8, ++ 0xf4, 0xf7, 0x3f, 0x8c, 0xf3, 0xb1, 0xf9, 0x53, 0x91, 0xf9, 0x26, 0xcd, ++ 0x28, 0x7d, 0x8d, 0xe7, 0x56, 0x8a, 0xf5, 0x97, 0x0d, 0xb5, 0x7d, 0x93, ++ 0xf5, 0x57, 0xca, 0x77, 0xa6, 0x4d, 0xe4, 0xab, 0xa5, 0xf0, 0x7c, 0xb5, ++ 0x27, 0xe7, 0xe5, 0x25, 0x31, 0x13, 0x5e, 0xdf, 0x75, 0xd8, 0x84, 0xdd, ++ 0xdc, 0xc4, 0x9f, 0xc6, 0x51, 0x57, 0x77, 0x9e, 0x6a, 0xae, 0xf9, 0xfd, ++ 0x27, 0x09, 0x9a, 0x29, 0x3f, 0x4e, 0x59, 0x30, 0x95, 0xf2, 0x43, 0x32, ++ 0x7b, 0xd1, 0x83, 0x7a, 0x66, 0xee, 0x4d, 0xdb, 0x41, 0xff, 0xea, 0x59, ++ 0x3e, 0x7a, 0xca, 0xf7, 0x8d, 0x33, 0x6c, 0x71, 0xf3, 0xbe, 0xce, 0x09, ++ 0xbd, 0x29, 0xed, 0xab, 0x61, 0x51, 0xfb, 0xea, 0x1c, 0xd2, 0xe1, 0x6c, ++ 0xe6, 0x5b, 0x8f, 0x63, 0x5e, 0x52, 0xf5, 0xcc, 0x2e, 0xb2, 0xaf, 0x32, ++ 0x6d, 0x4d, 0x8b, 0x8e, 0xe0, 0xbc, 0x7e, 0xa5, 0x8a, 0x78, 0xa5, 0x8f, ++ 0x9f, 0xa7, 0x12, 0x76, 0xf1, 0xbc, 0x9b, 0x1e, 0x5d, 0x74, 0x04, 0xf7, ++ 0xa1, 0xff, 0x75, 0x08, 0xe9, 0x25, 0x39, 0xce, 0xa6, 0xba, 0x29, 0x37, ++ 0x69, 0xa6, 0x73, 0xe3, 0xfd, 0x7b, 0xf1, 0x93, 0x86, 0x39, 0xf9, 0xfa, ++ 0xf0, 0x74, 0xdd, 0xd0, 0x9b, 0xe6, 0x52, 0x9e, 0xb6, 0xc1, 0xcf, 0x87, ++ 0x8a, 0xfe, 0xb3, 0x43, 0x55, 0x25, 0x68, 0x27, 0x0f, 0x14, 0xf9, 0xa5, ++ 0x8f, 0xdb, 0xe2, 0xe7, 0xb7, 0x24, 0x38, 0xf9, 0xbc, 0x32, 0x90, 0xe4, ++ 0x08, 0xaf, 0xe1, 0x26, 0xf9, 0x38, 0x3b, 0xff, 0x3d, 0xaf, 0x06, 0xf3, ++ 0x78, 0xca, 0x16, 0x4c, 0x70, 0xe2, 0x3e, 0xed, 0xb5, 0x6d, 0x85, 0xdc, ++ 0xcf, 0x0b, 0xf8, 0xf1, 0xdc, 0x69, 0x76, 0xe4, 0xde, 0xc7, 0xb1, 0x7e, ++ 0x76, 0xa6, 0x46, 0xf9, 0xad, 0xb1, 0xe3, 0x67, 0xcc, 0x0c, 0xae, 0xcc, ++ 0x81, 0xf9, 0x35, 0xa4, 0xd8, 0xfc, 0x6e, 0x2a, 0x77, 0x29, 0x58, 0xdf, ++ 0xf1, 0x10, 0x63, 0x7d, 0xa0, 0x7e, 0xc3, 0x7f, 0xaa, 0x04, 0x4f, 0xc3, ++ 0xc1, 0xf1, 0x94, 0xef, 0xe1, 0x70, 0xd7, 0x32, 0xb4, 0x5f, 0xe5, 0xbc, ++ 0x0e, 0xa5, 0x3c, 0x45, 0xf8, 0x51, 0x5b, 0x12, 0x69, 0xdd, 0x63, 0x62, ++ 0x1f, 0x5c, 0xc6, 0x57, 0x2f, 0x64, 0xce, 0x6d, 0x43, 0xbb, 0xe2, 0xc2, ++ 0x06, 0x3b, 0x8d, 0x77, 0x01, 0xe6, 0x68, 0x40, 0xff, 0x17, 0x5a, 0x54, ++ 0xda, 0x67, 0x3d, 0x92, 0x92, 0x10, 0xb1, 0x41, 0x59, 0x5d, 0xe9, 0x21, ++ 0x95, 0x9a, 0x8d, 0xb6, 0x26, 0xd4, 0x9f, 0xdf, 0xe2, 0x09, 0xfb, 0x72, ++ 0xa2, 0x78, 0xd1, 0x36, 0x4e, 0xa0, 0xf3, 0x2f, 0x8e, 0xfe, 0x7c, 0xfe, ++ 0x0d, 0x29, 0xee, 0xb0, 0x3b, 0x87, 0xe6, 0x9d, 0x82, 0xf3, 0x96, 0x70, ++ 0xca, 0x79, 0x0f, 0xe8, 0xc5, 0xaf, 0xbc, 0x41, 0xe0, 0x31, 0xeb, 0xaa, ++ 0xee, 0x73, 0x19, 0x0c, 0xf9, 0x58, 0x35, 0x34, 0xea, 0x77, 0x5e, 0x32, ++ 0x3f, 0x77, 0x19, 0xae, 0x1b, 0x27, 0xe8, 0x65, 0x9d, 0x4f, 0x63, 0xe6, ++ 0xf4, 0x5b, 0xef, 0xc6, 0xf3, 0x42, 0xc7, 0x55, 0x86, 0xa9, 0x20, 0xbe, ++ 0xf6, 0x26, 0x9a, 0xff, 0x7c, 0x98, 0x3f, 0xc6, 0x77, 0x63, 0xf1, 0x7b, ++ 0xd6, 0x97, 0xf3, 0x85, 0x4d, 0x25, 0x38, 0x6f, 0x40, 0x38, 0xd5, 0x8d, ++ 0x25, 0x34, 0x0f, 0xaa, 0x07, 0xed, 0xaa, 0x7e, 0xac, 0xb0, 0xa7, 0x72, ++ 0x90, 0x0f, 0x83, 0x53, 0x88, 0xae, 0x7d, 0x6d, 0x74, 0x0e, 0x30, 0x16, ++ 0xee, 0x12, 0x27, 0x8f, 0xb3, 0xde, 0xe8, 0xe4, 0xf1, 0x00, 0x3d, 0x33, ++ 0xef, 0xa6, 0xed, 0x7d, 0xf0, 0x39, 0x98, 0xe4, 0xe2, 0x66, 0x67, 0xaf, ++ 0xeb, 0xfc, 0x2d, 0x4e, 0xae, 0x87, 0xe8, 0x79, 0xe5, 0xf7, 0x09, 0x44, ++ 0x2c, 0xeb, 0xbc, 0x1a, 0xb0, 0x91, 0x1d, 0x14, 0x0b, 0x17, 0xe8, 0xad, ++ 0xbb, 0x9d, 0x26, 0xbb, 0x46, 0x4d, 0x7a, 0xa8, 0x00, 0xfb, 0xed, 0xdd, ++ 0x1e, 0xdb, 0x75, 0x40, 0x47, 0x7b, 0xcc, 0xcd, 0xc8, 0x4e, 0x96, 0xfa, ++ 0xb2, 0x37, 0x7b, 0x0c, 0xed, 0x30, 0xe4, 0x37, 0x69, 0x87, 0x2d, 0x70, ++ 0x5a, 0xf5, 0x2e, 0xcc, 0xaf, 0x5c, 0xcc, 0xaf, 0x3c, 0xde, 0xfc, 0xe2, ++ 0xe8, 0xd9, 0x1a, 0xac, 0x77, 0xfa, 0x9e, 0x48, 0x5c, 0x3b, 0x26, 0x4d, ++ 0x8f, 0xaf, 0x87, 0x36, 0x0b, 0xfc, 0xd7, 0x18, 0x3a, 0xa3, 0xb8, 0x52, ++ 0x2f, 0xf1, 0xf0, 0x27, 0x9c, 0xd2, 0x1e, 0xdc, 0x7b, 0x40, 0x47, 0xbc, ++ 0xc2, 0x3c, 0x11, 0xaf, 0x99, 0xe0, 0x1f, 0x97, 0x90, 0x9e, 0xb1, 0xc7, ++ 0xcd, 0xfb, 0xbe, 0x9c, 0x9f, 0x91, 0xbb, 0x26, 0x7f, 0xf7, 0x51, 0xec, ++ 0x0f, 0xec, 0x58, 0xe4, 0x9e, 0xf3, 0x4d, 0xbe, 0xa4, 0x94, 0x4b, 0xd8, ++ 0x11, 0xf6, 0xa5, 0xbf, 0x72, 0x99, 0xf1, 0xf8, 0x48, 0x0c, 0x7f, 0x00, ++ 0xde, 0xd6, 0x3b, 0xb9, 0xfd, 0x47, 0xcf, 0x1e, 0x78, 0x4b, 0x05, 0xbc, ++ 0xd9, 0x2c, 0x78, 0x7b, 0xdc, 0x79, 0x49, 0xfb, 0x8f, 0xeb, 0xdb, 0xbe, ++ 0xe2, 0xfc, 0xc0, 0x39, 0x81, 0x27, 0xd0, 0xbb, 0xdf, 0xc7, 0xfe, 0xcf, ++ 0xde, 0x76, 0xee, 0x4e, 0xf4, 0x0d, 0xab, 0x6e, 0xfb, 0x4a, 0xf8, 0xb5, ++ 0xbc, 0x7e, 0xba, 0xd0, 0xcf, 0xe0, 0xf7, 0xfe, 0xc3, 0xc7, 0x3e, 0xaa, ++ 0xbf, 0x04, 0xc7, 0x89, 0xfa, 0xbf, 0xed, 0x85, 0xe8, 0xf7, 0x2c, 0x7f, ++ 0xf9, 0xaa, 0x24, 0xb4, 0x9f, 0x26, 0xed, 0xb9, 0xdb, 0xc0, 0xe7, 0xf9, ++ 0xd4, 0xc1, 0xb4, 0xfe, 0x9c, 0xdd, 0xe3, 0x08, 0xe0, 0x38, 0x67, 0x53, ++ 0x78, 0x3e, 0xdd, 0xd9, 0x3d, 0x63, 0x8f, 0x60, 0x7c, 0xe0, 0xb3, 0xba, ++ 0xa3, 0xb9, 0x66, 0xfd, 0x7c, 0xf6, 0xc5, 0x63, 0x85, 0x76, 0xe8, 0xe7, ++ 0xec, 0xee, 0x63, 0x85, 0x1a, 0xe5, 0xef, 0x86, 0x2d, 0xf6, 0x78, 0xd5, ++ 0xd7, 0xbf, 0x29, 0xc4, 0x73, 0x52, 0x32, 0xef, 0xb9, 0x9b, 0xce, 0x4e, ++ 0xae, 0xd7, 0x37, 0xb8, 0x78, 0xdc, 0x21, 0x2d, 0x5d, 0x6f, 0xc4, 0x7c, ++ 0xee, 0x8e, 0x84, 0x64, 0x9a, 0xf7, 0x63, 0xe9, 0xb6, 0x47, 0xe2, 0xc5, ++ 0x53, 0x50, 0xdd, 0xd1, 0xbe, 0xba, 0x47, 0xa7, 0x7d, 0xc4, 0xc5, 0xc3, ++ 0x7c, 0xcb, 0xdd, 0x18, 0x4f, 0xc9, 0x31, 0x28, 0x4f, 0x76, 0xb9, 0x12, ++ 0xc8, 0x9a, 0x87, 0xfb, 0x20, 0xd3, 0x9c, 0x7e, 0x8c, 0xd3, 0xa7, 0xe6, ++ 0xb2, 0xa1, 0x39, 0x49, 0x18, 0x6a, 0x0c, 0x32, 0x37, 0xb0, 0x90, 0xe3, ++ 0xb5, 0x26, 0x3a, 0x0e, 0x9a, 0xd0, 0x66, 0x1c, 0x40, 0x33, 0x46, 0xc6, ++ 0x59, 0xb4, 0x62, 0xae, 0x1f, 0xbb, 0xee, 0xd0, 0x29, 0xaf, 0x2b, 0x51, ++ 0xf3, 0x3d, 0x31, 0x13, 0xca, 0x99, 0x33, 0x34, 0x5a, 0x9f, 0x64, 0xdc, ++ 0xe5, 0xcf, 0x09, 0x29, 0x04, 0x9f, 0x8c, 0xbb, 0x74, 0xc3, 0xf3, 0x86, ++ 0x9d, 0xd6, 0x8d, 0xc5, 0x39, 0xc1, 0xa6, 0x22, 0x68, 0xb7, 0x78, 0x7c, ++ 0x0a, 0xb5, 0xf3, 0x4e, 0x7b, 0x9b, 0xe8, 0xdd, 0xe9, 0xb3, 0x85, 0xec, ++ 0x38, 0x1f, 0xad, 0x8b, 0xe2, 0x2f, 0xff, 0x54, 0x37, 0x34, 0x6d, 0x30, ++ 0xe0, 0xd1, 0xc8, 0xb2, 0xdd, 0x44, 0x36, 0xc8, 0x57, 0x80, 0x2d, 0x53, ++ 0x7e, 0xbe, 0x57, 0x63, 0xa1, 0x24, 0xb0, 0x47, 0xd6, 0x00, 0xff, 0x0e, ++ 0x06, 0xfe, 0x6d, 0xa9, 0x73, 0x52, 0xfd, 0x46, 0xb0, 0xe3, 0x8c, 0x14, ++ 0xba, 0xc7, 0x20, 0x7a, 0x0f, 0x87, 0x89, 0xef, 0x77, 0xd7, 0x19, 0x54, ++ 0xef, 0x27, 0x75, 0x99, 0xd4, 0xee, 0xd1, 0x3a, 0x1f, 0x3d, 0xbb, 0xd7, ++ 0x7d, 0xc6, 0xdb, 0x51, 0x39, 0x8e, 0x3e, 0xfc, 0x7b, 0x3d, 0xd7, 0xd5, ++ 0xf1, 0xfb, 0x3e, 0x64, 0xf9, 0xdf, 0x47, 0x83, 0x5d, 0x05, 0xf4, 0x4e, ++ 0x1d, 0x0b, 0x54, 0x05, 0xbc, 0xa4, 0x8a, 0xf3, 0xe1, 0xf2, 0xfb, 0x53, ++ 0x75, 0x6f, 0x0c, 0x9a, 0x34, 0x58, 0x20, 0x03, 0xf0, 0xd9, 0xb7, 0xd2, ++ 0xd8, 0xb2, 0xfa, 0x12, 0xf0, 0xa6, 0x3a, 0xc2, 0xc9, 0x78, 0x04, 0x78, ++ 0xa0, 0x8b, 0x85, 0x26, 0x65, 0x62, 0x1e, 0x5e, 0xd7, 0x23, 0x25, 0xc9, ++ 0x78, 0x7e, 0xa1, 0x7e, 0xd2, 0xa4, 0x61, 0x80, 0x47, 0xdc, 0x7f, 0xbe, ++ 0x0e, 0x5c, 0x09, 0xd7, 0xda, 0x86, 0xd0, 0x04, 0xe0, 0x87, 0x4a, 0x5f, ++ 0x3d, 0xc6, 0xe5, 0xb2, 0x5a, 0x95, 0x66, 0x5c, 0x6f, 0xb2, 0x5a, 0xd7, ++ 0x17, 0x61, 0x9c, 0x1f, 0xea, 0xd1, 0xb9, 0x3e, 0xd9, 0xaf, 0xcb, 0xc5, ++ 0xf5, 0x53, 0xe2, 0xa1, 0x27, 0x95, 0xdc, 0xe1, 0x18, 0xfc, 0xe7, 0xfb, ++ 0xe6, 0x6c, 0x5f, 0x62, 0x38, 0xde, 0xf9, 0xcf, 0xa1, 0x2e, 0xae, 0xa7, ++ 0x06, 0x8b, 0x76, 0x6b, 0xc4, 0xbe, 0x77, 0xd7, 0x34, 0x37, 0xdd, 0x93, ++ 0x90, 0x78, 0xc8, 0x45, 0xfc, 0x92, 0xb5, 0xf7, 0x1a, 0xda, 0x7f, 0x73, ++ 0xf7, 0xb2, 0xef, 0x1b, 0xdb, 0x4f, 0xe2, 0xa1, 0x3f, 0x51, 0x9c, 0xd6, ++ 0xad, 0x34, 0x1d, 0xc0, 0x7d, 0x44, 0x36, 0x8f, 0xdb, 0x8b, 0x92, 0x9f, ++ 0x7a, 0x6b, 0x87, 0xf5, 0xf5, 0x2b, 0xa8, 0xdf, 0xe9, 0xd7, 0x28, 0x6e, ++ 0x0b, 0x66, 0x2a, 0xcd, 0xef, 0xec, 0xb4, 0xfe, 0x84, 0x6f, 0xac, 0x6f, ++ 0xbe, 0xc7, 0xa3, 0x53, 0x8f, 0x6f, 0x47, 0x8d, 0x76, 0x71, 0x3b, 0x75, ++ 0x85, 0x3d, 0xbe, 0xfe, 0xd6, 0x18, 0xb7, 0x0f, 0x46, 0xb7, 0x75, 0xd1, ++ 0x7e, 0x23, 0xde, 0xab, 0x84, 0xf8, 0xce, 0x3a, 0xde, 0xa4, 0xa0, 0x3f, ++ 0x7d, 0x56, 0xe1, 0xf9, 0x12, 0x7d, 0x01, 0x1f, 0xbb, 0xa1, 0x9c, 0x35, ++ 0xa1, 0x89, 0xee, 0x5d, 0xda, 0xe6, 0x0c, 0x5e, 0xe7, 0x02, 0xf8, 0xfe, ++ 0x68, 0x9c, 0xc8, 0x5b, 0x01, 0xe0, 0xb8, 0xf2, 0x7f, 0x9f, 0x8d, 0xed, ++ 0x24, 0x3e, 0xd4, 0x02, 0xdd, 0x89, 0xfa, 0x24, 0x6b, 0xef, 0x07, 0xfc, ++ 0x1c, 0x8e, 0xad, 0x5d, 0xc7, 0xfc, 0xb4, 0xef, 0xac, 0x7a, 0x81, 0xe2, ++ 0x83, 0xaa, 0x5e, 0x9a, 0xc3, 0xcb, 0x75, 0x2b, 0x30, 0x7e, 0x98, 0xe6, ++ 0x2d, 0xdd, 0x82, 0x7c, 0xc2, 0x42, 0x2f, 0x4c, 0x7a, 0x0d, 0x7c, 0x9e, ++ 0xc7, 0xc4, 0xb9, 0x62, 0x7c, 0x83, 0x7a, 0x6f, 0x8d, 0x4b, 0x94, 0x43, ++ 0xcf, 0x37, 0x04, 0x80, 0x4f, 0xd6, 0xd8, 0x79, 0xf9, 0x3b, 0xab, 0x9e, ++ 0x6b, 0xc0, 0x73, 0xc7, 0x6b, 0xec, 0xa5, 0x0b, 0xf1, 0x5c, 0x32, 0x96, ++ 0x1b, 0xa0, 0xff, 0x35, 0xc9, 0xcd, 0x99, 0x36, 0x28, 0xbb, 0xeb, 0x9f, ++ 0x6d, 0x38, 0x3a, 0x00, 0xcb, 0xb2, 0xfe, 0xb3, 0xc4, 0x67, 0x77, 0xba, ++ 0xf8, 0xf9, 0x1e, 0xe6, 0x2e, 0xcd, 0x42, 0xbc, 0x77, 0x97, 0x0d, 0x28, ++ 0x0f, 0x37, 0x95, 0x35, 0x5e, 0x66, 0x4e, 0xfe, 0x94, 0xf3, 0xab, 0x3a, ++ 0xf4, 0xa7, 0x23, 0xfd, 0x80, 0x5f, 0xaa, 0xf7, 0xf2, 0x7b, 0x68, 0xba, ++ 0xf1, 0xd6, 0xba, 0x5e, 0xc1, 0xf5, 0xe4, 0x27, 0x75, 0x47, 0x7d, 0x0d, ++ 0x9a, 0x90, 0x13, 0xa9, 0x3f, 0x60, 0x5d, 0xbe, 0x2a, 0x93, 0x91, 0x5f, ++ 0xa1, 0x87, 0x95, 0x70, 0xae, 0x82, 0xf7, 0x71, 0xac, 0x4c, 0x37, 0xe7, ++ 0x93, 0xdc, 0x9a, 0xa8, 0x88, 0xf5, 0x05, 0xda, 0x9b, 0xe3, 0x82, 0x31, ++ 0xe7, 0xce, 0xe8, 0x28, 0x0b, 0xae, 0xaf, 0x0d, 0x3c, 0x6f, 0x23, 0x96, ++ 0xae, 0x6f, 0x24, 0x14, 0x35, 0x24, 0x8c, 0xc1, 0xf3, 0xa2, 0xc1, 0xd5, ++ 0x2a, 0xea, 0xc1, 0x17, 0xec, 0x06, 0xe5, 0xbd, 0xb7, 0x6b, 0xa4, 0xb7, ++ 0x3b, 0x64, 0xde, 0x7b, 0xad, 0x9d, 0xec, 0xb7, 0x4a, 0x71, 0x0e, 0xd5, ++ 0xbe, 0x2c, 0xb8, 0x7a, 0x18, 0xca, 0xc5, 0xbd, 0x9a, 0x1f, 0xe3, 0x00, ++ 0x15, 0x39, 0x4d, 0x45, 0x68, 0xbf, 0x54, 0xbc, 0x92, 0xe3, 0xaf, 0x67, ++ 0xd1, 0x3c, 0xda, 0x8a, 0xe4, 0xe6, 0xf4, 0x91, 0xee, 0x68, 0x1e, 0xad, ++ 0x2c, 0x2f, 0x17, 0x71, 0xa3, 0x8c, 0xe4, 0xda, 0xe4, 0xe4, 0x7c, 0xdc, ++ 0x2f, 0x59, 0x9f, 0x8d, 0xfb, 0x19, 0xd5, 0xac, 0xe9, 0xbe, 0x1f, 0x20, ++ 0xbc, 0x6f, 0xaa, 0x0c, 0xf9, 0xfd, 0xd3, 0x03, 0xe3, 0x93, 0xf0, 0x5e, ++ 0xa0, 0x2a, 0x28, 0x63, 0x9c, 0xaa, 0xaa, 0xe5, 0x98, 0x1e, 0x84, 0x7a, ++ 0x05, 0x09, 0xfc, 0x3e, 0x9a, 0xea, 0x16, 0xe0, 0x1b, 0x37, 0xbf, 0x27, ++ 0x26, 0x90, 0xc7, 0xd8, 0x16, 0xcd, 0x48, 0x40, 0x3d, 0xff, 0x93, 0x40, ++ 0xed, 0xd5, 0x68, 0xc2, 0x3e, 0xe1, 0x3a, 0x3a, 0xc9, 0x05, 0x74, 0x7d, ++ 0x36, 0x37, 0x60, 0x20, 0x9d, 0x5f, 0x5a, 0xf5, 0x56, 0x83, 0xf3, 0x5b, ++ 0x50, 0xd6, 0x8d, 0x61, 0x6c, 0x04, 0x96, 0xdf, 0x69, 0x40, 0x3e, 0xab, ++ 0x18, 0x61, 0xa3, 0x3c, 0x48, 0x16, 0x7a, 0xe7, 0xb5, 0xc0, 0x60, 0xb1, ++ 0x1f, 0x0b, 0xe5, 0x87, 0x5c, 0x19, 0x93, 0xcd, 0x71, 0xe9, 0x2c, 0xb1, ++ 0x8e, 0xd7, 0x6c, 0x72, 0xd3, 0x79, 0x2d, 0x58, 0x97, 0x1f, 0x47, 0xfe, ++ 0xae, 0xde, 0x68, 0x0b, 0xe1, 0xfe, 0x96, 0xcd, 0xd9, 0x46, 0xe7, 0x74, ++ 0x5e, 0x72, 0xc9, 0xf5, 0xdf, 0x7a, 0xbe, 0x69, 0x83, 0xc2, 0xf5, 0x61, ++ 0x68, 0x1e, 0x8f, 0x73, 0x2e, 0xb9, 0x29, 0xe5, 0xdb, 0x74, 0xbe, 0x69, ++ 0x45, 0xae, 0x11, 0xba, 0x44, 0xbc, 0xb5, 0xec, 0x62, 0x02, 0x9d, 0x63, ++ 0x92, 0xe5, 0x82, 0x04, 0x1f, 0xf5, 0x5f, 0xa6, 0x85, 0x68, 0x9f, 0xa7, ++ 0xec, 0xa2, 0x97, 0xce, 0x3f, 0xfd, 0xed, 0xc6, 0x73, 0x5a, 0xce, 0x53, ++ 0xf5, 0x1c, 0xcf, 0x4d, 0xf0, 0xc8, 0xf1, 0x2a, 0xa3, 0xe3, 0x11, 0x5d, ++ 0x0f, 0x8d, 0xfc, 0xd5, 0xe3, 0x83, 0x81, 0x6e, 0x4b, 0x76, 0xd9, 0x6d, ++ 0x0e, 0x13, 0xdf, 0x2d, 0xd9, 0x25, 0xf6, 0xcf, 0x5d, 0x81, 0x0c, 0xec, ++ 0x27, 0x4d, 0xe7, 0x78, 0x66, 0xe8, 0xbf, 0x01, 0xaf, 0xd1, 0x1d, 0x34, ++ 0xbc, 0x1c, 0xd2, 0x60, 0x1d, 0x58, 0x27, 0xe5, 0x3b, 0xd4, 0xd1, 0x30, ++ 0x69, 0x02, 0xd2, 0x2d, 0xfa, 0x9d, 0x59, 0xe5, 0x3f, 0x80, 0xfe, 0xf3, ++ 0xba, 0x04, 0x59, 0xbe, 0x10, 0xbf, 0x7e, 0x42, 0x4c, 0xfd, 0x5c, 0xd9, ++ 0xff, 0x5f, 0xa8, 0x7e, 0x2c, 0x3c, 0x69, 0x09, 0xd1, 0xb2, 0x13, 0xea, ++ 0x6b, 0x7f, 0x71, 0x74, 0x97, 0x11, 0xbe, 0xf5, 0xb6, 0x98, 0xfe, 0x52, ++ 0x64, 0x59, 0x5f, 0x31, 0xa9, 0x7f, 0x94, 0xaf, 0x1e, 0x5a, 0xe5, 0x3d, ++ 0x1c, 0x02, 0xbe, 0x5a, 0x97, 0xdc, 0x54, 0x84, 0xfa, 0xbf, 0x6b, 0x1e, ++ 0xf3, 0xe1, 0x3d, 0x57, 0xc8, 0xaf, 0x7e, 0x93, 0xbe, 0x7d, 0xc8, 0xc5, ++ 0xf5, 0x6c, 0xd9, 0xc5, 0x5c, 0x0b, 0xbd, 0xa3, 0x78, 0xcf, 0xb3, 0xd0, ++ 0xe5, 0x74, 0x5d, 0xa6, 0x65, 0x5f, 0x72, 0xc1, 0xcc, 0x25, 0xb4, 0x7f, ++ 0xfa, 0x10, 0x0a, 0x0b, 0xf6, 0xc3, 0x42, 0xfc, 0x1c, 0xcc, 0xa6, 0x7e, ++ 0x2c, 0x6c, 0x8a, 0xdb, 0xfc, 0x7f, 0x38, 0xfe, 0x5a, 0x38, 0xae, 0xeb, ++ 0x05, 0x8e, 0x7f, 0xf8, 0x2f, 0x86, 0xc3, 0x67, 0x19, 0x2f, 0x0a, 0xc7, ++ 0x60, 0x0b, 0x7c, 0x7f, 0x2d, 0x1c, 0x5b, 0xef, 0xcc, 0xfb, 0x76, 0x0e, ++ 0x54, 0x79, 0x4c, 0x09, 0x39, 0x73, 0x71, 0x5d, 0xf8, 0x11, 0xcf, 0x5b, ++ 0x53, 0x93, 0x27, 0xf9, 0xea, 0x71, 0xbf, 0xe4, 0x47, 0x1a, 0xc5, 0xdd, ++ 0x87, 0x30, 0x9e, 0x8f, 0x92, 0xab, 0xb1, 0xa3, 0xda, 0x48, 0x94, 0x9f, ++ 0xa6, 0x00, 0xc6, 0x2d, 0xd8, 0x32, 0x6e, 0xaf, 0xc0, 0xfb, 0x95, 0xf6, ++ 0x91, 0xb4, 0x0e, 0x91, 0xbf, 0x30, 0x68, 0xaf, 0x63, 0x16, 0xe6, 0x55, ++ 0xe4, 0x96, 0x05, 0x16, 0xe2, 0x93, 0xf5, 0xcf, 0xa7, 0xfd, 0x18, 0xb9, ++ 0x8f, 0xc9, 0x44, 0x5c, 0x4f, 0xee, 0xbf, 0x0c, 0x31, 0x58, 0x11, 0xde, ++ 0xcb, 0xf7, 0x76, 0xc2, 0x2c, 0x5a, 0xa7, 0x72, 0x4b, 0x67, 0x56, 0x60, ++ 0xfc, 0x5b, 0xf5, 0x8c, 0x4e, 0xc0, 0xf5, 0xf0, 0x31, 0x5b, 0x38, 0x84, ++ 0xe3, 0x85, 0x1e, 0xe5, 0xe3, 0xa5, 0xd9, 0xc2, 0xcd, 0x4e, 0xb4, 0x97, ++ 0xbc, 0x83, 0x0d, 0x5c, 0xef, 0xd2, 0xbc, 0x5c, 0xff, 0xb1, 0xd5, 0xf9, ++ 0xb4, 0xfe, 0x6d, 0xb5, 0xe5, 0x5e, 0xbd, 0x08, 0xe0, 0x58, 0xa1, 0x14, ++ 0x25, 0xbc, 0x81, 0x78, 0x4e, 0xce, 0xa5, 0x38, 0x36, 0xbe, 0xc7, 0x7b, ++ 0x70, 0xb6, 0x8a, 0x75, 0x4b, 0x4d, 0xf6, 0x1b, 0xb8, 0x4e, 0x6d, 0x15, ++ 0xeb, 0xd6, 0x72, 0xa1, 0xdf, 0xe5, 0xfb, 0xc4, 0x94, 0xd2, 0x59, 0x68, ++ 0x47, 0x2c, 0x5f, 0x5d, 0x34, 0xd9, 0x39, 0x1e, 0xf5, 0x90, 0x7f, 0x65, ++ 0x1f, 0xd0, 0x81, 0xcb, 0x56, 0x17, 0xad, 0xc8, 0x1c, 0x8f, 0xeb, 0x8d, ++ 0x2f, 0xd7, 0x09, 0xeb, 0xcb, 0xb2, 0x84, 0xa2, 0x15, 0x4e, 0x98, 0xcc, ++ 0xd6, 0x7a, 0x5f, 0x5f, 0x23, 0x39, 0x5a, 0x1e, 0xf2, 0x17, 0x58, 0xad, ++ 0x49, 0x4f, 0x14, 0xad, 0x40, 0x3b, 0xa5, 0xc1, 0xbd, 0xb8, 0x1c, 0xed, ++ 0x1c, 0xf8, 0x7e, 0x18, 0xfd, 0xc2, 0x67, 0x53, 0xa4, 0xde, 0xe1, 0xdf, ++ 0x73, 0xa5, 0x9e, 0x42, 0xbd, 0x04, 0x7a, 0x4c, 0xad, 0xef, 0x2e, 0x87, ++ 0x50, 0x2f, 0xe5, 0x76, 0xeb, 0x9d, 0x22, 0xd2, 0x3b, 0xdb, 0x9f, 0x56, ++ 0xa9, 0x5c, 0x06, 0xe3, 0xa1, 0xdd, 0x03, 0xf3, 0x08, 0xe1, 0xfd, 0x5d, ++ 0x5d, 0x43, 0x34, 0xf2, 0x8f, 0x5c, 0x00, 0x4b, 0x02, 0x94, 0x5d, 0xc3, ++ 0x72, 0x69, 0x5f, 0x0b, 0xe6, 0xcd, 0x12, 0x30, 0xae, 0x3f, 0x8c, 0x7f, ++ 0x97, 0xfb, 0x12, 0xfa, 0x10, 0x1b, 0xed, 0x4b, 0x60, 0x7d, 0xc4, 0xa3, ++ 0x2b, 0x8b, 0xd7, 0xd7, 0xa7, 0xf1, 0xf3, 0xcc, 0xba, 0xc7, 0x4d, 0x7e, ++ 0x9b, 0xdc, 0xe7, 0x50, 0xc5, 0xbe, 0x5a, 0x82, 0xc8, 0x23, 0x51, 0x8c, ++ 0x69, 0x74, 0xce, 0xd6, 0xb9, 0x76, 0xe4, 0x62, 0xf4, 0xa3, 0x9c, 0x83, ++ 0xad, 0xfb, 0xc7, 0x7a, 0x4c, 0xbe, 0x89, 0x1a, 0x9b, 0x7f, 0xe2, 0x8e, ++ 0x90, 0xdd, 0xd5, 0x90, 0x20, 0xe2, 0xcc, 0x7d, 0x58, 0x26, 0xdd, 0x6b, ++ 0x20, 0xde, 0x33, 0xe6, 0x1f, 0x89, 0xcf, 0xf4, 0xbb, 0x1b, 0x8a, 0xe8, ++ 0xbe, 0x3b, 0x0f, 0x33, 0x30, 0xdf, 0x39, 0x33, 0x18, 0x61, 0x66, 0x7b, ++ 0x49, 0x3e, 0x1d, 0xb0, 0x8e, 0xfa, 0x4c, 0x72, 0xe3, 0x70, 0xb3, 0x40, ++ 0xbc, 0x7c, 0x87, 0x7b, 0x12, 0xb9, 0x3d, 0xec, 0xbe, 0xa8, 0x71, 0x3f, ++ 0x51, 0x01, 0xfb, 0x06, 0xd7, 0x51, 0x8f, 0xb0, 0xc3, 0x85, 0x7d, 0x64, ++ 0x97, 0xf7, 0x10, 0xc5, 0xac, 0xbb, 0xd2, 0x5e, 0xb2, 0x8b, 0xfb, 0xee, ++ 0x96, 0xdc, 0x34, 0x31, 0x03, 0xcf, 0x0d, 0xa9, 0xee, 0x80, 0x13, 0xed, ++ 0x9c, 0x03, 0xc6, 0x48, 0xda, 0x4f, 0x51, 0x99, 0xff, 0xd6, 0x22, 0x93, ++ 0xbd, 0xd3, 0x10, 0xb9, 0x89, 0xe2, 0x89, 0x9a, 0x11, 0x60, 0x68, 0xe7, ++ 0xec, 0x17, 0x76, 0x8e, 0x6a, 0xf8, 0x99, 0xd9, 0xce, 0x69, 0xac, 0x03, ++ 0x07, 0x1c, 0xd6, 0xaa, 0x6d, 0x85, 0x79, 0x74, 0xbf, 0xcc, 0x53, 0xae, ++ 0x88, 0x73, 0x10, 0xd2, 0xf7, 0x31, 0x9b, 0x1f, 0xf5, 0xc6, 0xa1, 0x91, ++ 0xe5, 0x21, 0x05, 0xe3, 0x89, 0x4b, 0x19, 0xc9, 0xe9, 0xb6, 0xc2, 0xf4, ++ 0x89, 0xb8, 0x1f, 0xb0, 0x45, 0x2b, 0x4d, 0xba, 0x17, 0xe5, 0xe5, 0x38, ++ 0x8c, 0xe7, 0xe3, 0x74, 0xe3, 0xfb, 0xcf, 0xcb, 0x15, 0x8c, 0x7f, 0x5f, ++ 0x70, 0x96, 0x26, 0xa1, 0x3e, 0x58, 0x97, 0xcc, 0x2c, 0x7e, 0x54, 0x71, ++ 0x22, 0xf7, 0x47, 0x9e, 0x4c, 0xe0, 0x76, 0xa7, 0xf4, 0x13, 0x1a, 0x01, ++ 0x9e, 0x08, 0xc0, 0xa1, 0x5d, 0xbc, 0x9a, 0xee, 0xdb, 0x19, 0x22, 0xec, ++ 0x52, 0x7d, 0xe6, 0x24, 0x8a, 0x6f, 0x61, 0x9a, 0x0e, 0xc6, 0x2b, 0x1d, ++ 0xac, 0x36, 0x64, 0xb8, 0xa3, 0xf7, 0xc9, 0x39, 0x32, 0x6d, 0x96, 0xfc, ++ 0x44, 0xed, 0x62, 0x01, 0xc5, 0xff, 0x9e, 0x4c, 0xb0, 0x59, 0xf6, 0x8f, ++ 0x1e, 0x16, 0xf7, 0x01, 0xca, 0xb2, 0x93, 0xd5, 0xf2, 0x38, 0x2f, 0xf0, ++ 0x74, 0x3c, 0xff, 0x6d, 0x96, 0x80, 0xd3, 0x01, 0xf6, 0x90, 0x8f, 0xec, ++ 0x93, 0x98, 0xfd, 0xf9, 0x9e, 0xf6, 0x11, 0xd9, 0x2b, 0x92, 0x3e, 0xdd, ++ 0x76, 0x8a, 0xc2, 0xcf, 0x6d, 0xf6, 0x66, 0x1f, 0xd5, 0x5c, 0xb4, 0x59, ++ 0xf4, 0x6c, 0xf4, 0xbc, 0xb9, 0x4e, 0x7a, 0xf9, 0x9c, 0x38, 0xcf, 0x2f, ++ 0xf3, 0x34, 0xdc, 0x42, 0x9f, 0x35, 0x66, 0x06, 0x9b, 0xae, 0xcf, 0x89, ++ 0x9e, 0xdf, 0xd7, 0x44, 0xbe, 0xc6, 0x5a, 0x71, 0x6e, 0x9f, 0x65, 0x6a, ++ 0x5d, 0xe6, 0x73, 0xf2, 0x89, 0x18, 0x8f, 0x81, 0xef, 0x0d, 0x22, 0x6f, ++ 0x23, 0x31, 0xe6, 0xdc, 0xbd, 0xcb, 0xbd, 0x84, 0xfc, 0x05, 0xd7, 0x50, ++ 0xcd, 0x72, 0x4e, 0xcb, 0xc9, 0x82, 0xd4, 0xce, 0xe1, 0xb3, 0xbe, 0xd7, ++ 0x32, 0x63, 0xcf, 0xf3, 0x87, 0xba, 0xf3, 0xb4, 0x28, 0xaf, 0x50, 0x63, ++ 0x4f, 0x2a, 0x74, 0x78, 0x9f, 0xdb, 0xbb, 0xfd, 0x44, 0x9e, 0xd4, 0xd9, ++ 0xc4, 0xf7, 0x0b, 0x51, 0x7e, 0xc1, 0xde, 0xfd, 0xb9, 0x93, 0xf6, 0x11, ++ 0xf8, 0x39, 0x4e, 0x19, 0xcf, 0xfa, 0xa6, 0xf6, 0xf1, 0x7e, 0xb4, 0xab, ++ 0xc6, 0xa0, 0x5f, 0x38, 0x65, 0x04, 0xf6, 0xfb, 0x1d, 0xb1, 0x1e, 0x65, ++ 0xb1, 0xd2, 0x2c, 0xbe, 0x39, 0xd8, 0xcc, 0x28, 0xaf, 0x27, 0xc1, 0xdf, ++ 0xce, 0xf8, 0x9d, 0x60, 0x64, 0x6f, 0xa9, 0x52, 0xcf, 0x85, 0x5e, 0x68, ++ 0x40, 0x3f, 0x2a, 0xcd, 0x6c, 0xdf, 0x99, 0xec, 0xb5, 0x81, 0x6b, 0x5e, ++ 0x68, 0x68, 0xe0, 0x7e, 0x07, 0x95, 0xbf, 0xb3, 0x6a, 0x35, 0xe9, 0xc1, ++ 0x15, 0x2e, 0x59, 0x5e, 0x41, 0x65, 0x58, 0xaf, 0x22, 0xe8, 0xf7, 0xb0, ++ 0x3d, 0x0e, 0x1f, 0xf2, 0x13, 0xb4, 0x0f, 0xa0, 0xdc, 0xb0, 0x3b, 0xf3, ++ 0xc8, 0x5e, 0x56, 0x73, 0xc1, 0xa5, 0x05, 0xb8, 0x27, 0xe1, 0xfd, 0x84, ++ 0x18, 0xcf, 0xdf, 0xe3, 0xd8, 0x8a, 0xf6, 0x2c, 0xf8, 0xb5, 0x77, 0xba, ++ 0x4c, 0x7c, 0x7a, 0xd6, 0x73, 0x22, 0x9b, 0xe5, 0xc7, 0xed, 0x2f, 0x64, ++ 0xe9, 0x2f, 0xfb, 0x9b, 0xf5, 0x07, 0xe3, 0xb7, 0x60, 0x1e, 0x90, 0xfc, ++ 0x3e, 0xc9, 0xbb, 0x31, 0xa2, 0xf2, 0x76, 0x3e, 0x6c, 0xc7, 0xfa, 0xb7, ++ 0xbd, 0x1f, 0x82, 0xfe, 0x1f, 0x7b, 0xd9, 0x41, 0xf7, 0x86, 0xc8, 0x7b, ++ 0x90, 0x63, 0xf9, 0xb5, 0x30, 0x91, 0xdb, 0x0d, 0xa8, 0x37, 0xcc, 0xf9, ++ 0x96, 0xfa, 0xcc, 0xb9, 0x01, 0x64, 0x4e, 0x29, 0x9f, 0x8e, 0xcc, 0x04, ++ 0x4b, 0x9e, 0xb6, 0x94, 0x57, 0xed, 0xe2, 0x50, 0x92, 0x4f, 0xd9, 0x6e, ++ 0x7f, 0x42, 0x0e, 0xbf, 0x9f, 0x4b, 0x0b, 0x50, 0x5c, 0x4d, 0xbb, 0x98, ++ 0x4f, 0xf2, 0xff, 0xa4, 0xa0, 0x6b, 0x63, 0x9d, 0x71, 0x99, 0x71, 0x52, ++ 0x7a, 0x19, 0x67, 0x24, 0xf5, 0xd3, 0xfb, 0x38, 0x85, 0x42, 0x4f, 0x30, ++ 0xb1, 0x9f, 0xa5, 0x19, 0xe6, 0x7b, 0x5e, 0x7a, 0x93, 0xd7, 0xd8, 0xfd, ++ 0xbb, 0x58, 0xfd, 0x26, 0x9f, 0x52, 0xbf, 0xed, 0x16, 0xfd, 0xdf, 0x91, ++ 0x68, 0x8d, 0x0f, 0x97, 0x6f, 0x6c, 0x3e, 0x82, 0x2c, 0xf4, 0x03, 0x5b, ++ 0x70, 0x46, 0xe2, 0x18, 0xcc, 0xcb, 0x7a, 0xcf, 0x8b, 0x4b, 0x71, 0xa5, ++ 0x2d, 0x52, 0x80, 0xf2, 0xf6, 0x40, 0xcf, 0xf7, 0xd5, 0x38, 0xb9, 0x05, ++ 0x2e, 0xbe, 0x3f, 0x91, 0xb7, 0x63, 0xd1, 0x41, 0x64, 0xd7, 0xb9, 0x89, ++ 0xc1, 0x26, 0xb4, 0x67, 0xee, 0x4b, 0x14, 0x71, 0xfb, 0x4c, 0x58, 0xd7, ++ 0x54, 0x5c, 0xb7, 0x78, 0x5e, 0xd1, 0x3a, 0xfc, 0x8e, 0xf1, 0xe7, 0xa0, ++ 0xef, 0x89, 0xc9, 0xa8, 0xa7, 0xa6, 0x95, 0x50, 0xfc, 0x79, 0x5b, 0x62, ++ 0xe9, 0xeb, 0xd8, 0x6e, 0xd5, 0xf4, 0x42, 0x8a, 0x15, 0x48, 0xb8, 0xd7, ++ 0xd4, 0xf1, 0x7c, 0x38, 0xa9, 0x2f, 0xdd, 0x88, 0x2f, 0xa8, 0xef, 0xd0, ++ 0x6a, 0x09, 0x6f, 0x0e, 0x77, 0x20, 0x82, 0xf6, 0x45, 0x63, 0xe2, 0xaf, ++ 0x27, 0xa3, 0x8f, 0xa5, 0x6a, 0x5c, 0x0e, 0x2a, 0xd7, 0xec, 0x25, 0x39, ++ 0x70, 0x6a, 0x7e, 0xe2, 0x2b, 0xa7, 0xdb, 0xe6, 0xc3, 0xf5, 0xdd, 0x09, ++ 0xfe, 0x1d, 0xae, 0x7b, 0xf5, 0x6e, 0x1b, 0xc5, 0x93, 0x96, 0xe3, 0x3d, ++ 0xbd, 0x39, 0x78, 0x1e, 0x60, 0xaa, 0x81, 0xf2, 0xba, 0xd8, 0x93, 0x9b, ++ 0xc1, 0x2e, 0xa1, 0x1f, 0xb5, 0x8b, 0xe9, 0x42, 0xff, 0x5a, 0xef, 0xbd, ++ 0xf9, 0xdb, 0x8f, 0x93, 0x4a, 0xed, 0x7b, 0xdc, 0xaf, 0x73, 0x68, 0x7c, ++ 0x04, 0xfb, 0xd3, 0xfc, 0x8c, 0xf2, 0x5b, 0x10, 0x09, 0x1f, 0x9a, 0xf4, ++ 0xaa, 0x5c, 0xd7, 0x63, 0xdb, 0xc5, 0xf6, 0x2f, 0xf1, 0x29, 0xf1, 0xeb, ++ 0xd0, 0x82, 0x84, 0x57, 0x1d, 0xed, 0x86, 0x38, 0x70, 0x6d, 0xee, 0x8e, ++ 0xcb, 0x70, 0x7d, 0x98, 0x21, 0xf5, 0x67, 0xf2, 0xdb, 0x79, 0x11, 0x78, ++ 0x5b, 0xa5, 0xb4, 0x7b, 0xd1, 0x3e, 0x01, 0xbd, 0xb8, 0x39, 0x11, 0xf5, ++ 0xe2, 0xf0, 0xae, 0x7f, 0x53, 0x7c, 0xa4, 0x4f, 0xd3, 0xb9, 0x3d, 0x13, ++ 0x92, 0xf7, 0x09, 0x58, 0xee, 0x2f, 0x92, 0x71, 0x79, 0xd5, 0xcd, 0xed, ++ 0x1a, 0x09, 0xff, 0xe2, 0x37, 0x1e, 0x73, 0x9a, 0xf7, 0x89, 0x62, 0xe1, ++ 0x8d, 0x5d, 0x2f, 0xdd, 0xf9, 0xd6, 0x3c, 0x0a, 0x67, 0xff, 0x84, 0x98, ++ 0xfb, 0x7c, 0xeb, 0xf9, 0x38, 0x5a, 0x29, 0xf1, 0x8d, 0x7d, 0x42, 0xc0, ++ 0x89, 0x72, 0x52, 0x6f, 0x8c, 0x34, 0xd0, 0x5e, 0x69, 0xd0, 0x7c, 0xbf, ++ 0x0b, 0x50, 0xfe, 0x87, 0x9d, 0xec, 0x66, 0xb0, 0xc3, 0x2d, 0xe3, 0xcb, ++ 0xe7, 0x3a, 0x71, 0x7f, 0xef, 0x61, 0x61, 0x47, 0xc5, 0x7e, 0xf7, 0x88, ++ 0xfb, 0x8e, 0x63, 0xdf, 0x7f, 0x2c, 0xf0, 0xb7, 0xee, 0xc0, 0xdd, 0xa4, ++ 0x87, 0x7b, 0xa3, 0x1f, 0x1e, 0x78, 0x46, 0xfa, 0x7a, 0x72, 0x99, 0x81, ++ 0xe7, 0x67, 0xec, 0x02, 0x5e, 0xef, 0x65, 0xfa, 0xed, 0x8d, 0x8f, 0x1e, ++ 0x39, 0xc0, 0xe3, 0xba, 0xda, 0x38, 0x67, 0x18, 0x5d, 0xac, 0xd8, 0xf1, ++ 0x54, 0x7b, 0x69, 0x00, 0xcf, 0x7b, 0xa9, 0x23, 0x18, 0xd9, 0xbb, 0xea, ++ 0x00, 0x3e, 0x3e, 0xd0, 0xd2, 0xc0, 0xb8, 0xb0, 0x77, 0x74, 0x0a, 0x1b, ++ 0x6a, 0x5a, 0x67, 0x57, 0x0d, 0x9e, 0xce, 0xef, 0x5f, 0x4e, 0x33, 0xe8, ++ 0xfc, 0x9d, 0xea, 0xb1, 0x95, 0xc6, 0xb3, 0x33, 0x25, 0x9e, 0x5a, 0x13, ++ 0x6d, 0x96, 0xfd, 0xf9, 0x4c, 0xc9, 0x37, 0x43, 0x7e, 0x4f, 0xfb, 0x49, ++ 0x26, 0xbe, 0xf9, 0x08, 0xf5, 0x4b, 0x2c, 0xdf, 0xb4, 0x22, 0x0f, 0xa7, ++ 0x71, 0x38, 0xcc, 0xf4, 0x5c, 0x35, 0x38, 0x37, 0x23, 0x1e, 0x7d, 0xa2, ++ 0x7a, 0x91, 0xf3, 0xd5, 0xe5, 0xf8, 0xa2, 0x70, 0x02, 0xe7, 0xf7, 0x0c, ++ 0x78, 0x6e, 0x81, 0x79, 0xb4, 0x88, 0xfb, 0x34, 0xaa, 0x10, 0x57, 0xe0, ++ 0xef, 0x54, 0xde, 0xe5, 0x66, 0x06, 0xac, 0x6b, 0x5f, 0x79, 0x8a, 0xbe, ++ 0x40, 0xf8, 0x0a, 0xdb, 0x0e, 0xf2, 0x7c, 0xf7, 0x96, 0x34, 0x72, 0xfe, ++ 0x2a, 0x27, 0xc4, 0x97, 0x97, 0x45, 0x6e, 0x4e, 0x97, 0x45, 0x6e, 0x1e, ++ 0x47, 0x4d, 0x3a, 0x11, 0xf8, 0x29, 0xde, 0x1b, 0xde, 0xd2, 0x96, 0xe0, ++ 0x53, 0xe0, 0x53, 0x4b, 0x4a, 0x7c, 0x3d, 0x5d, 0xe0, 0x96, 0x72, 0x26, ++ 0xf2, 0x27, 0xb4, 0xf6, 0x02, 0xb4, 0x47, 0x64, 0xfd, 0xc2, 0x99, 0xd6, ++ 0xf1, 0x7c, 0x6e, 0xbe, 0xfe, 0x0d, 0x90, 0xed, 0x42, 0xb7, 0xa6, 0xa0, ++ 0x5d, 0x36, 0x15, 0xbb, 0x00, 0x3c, 0x0e, 0xf2, 0x2b, 0x3c, 0x8f, 0xa3, ++ 0x35, 0x31, 0x8c, 0xf7, 0xd3, 0x83, 0x55, 0xab, 0xdd, 0x06, 0x78, 0xdd, ++ 0x21, 0xfc, 0xbf, 0x1d, 0xe0, 0x17, 0x4e, 0x83, 0x7e, 0xd3, 0x13, 0x58, ++ 0x10, 0xe7, 0x9d, 0xd6, 0x07, 0xca, 0xf9, 0xd4, 0x3e, 0xb0, 0xcb, 0x1d, ++ 0xed, 0xef, 0x4d, 0x8e, 0x32, 0x36, 0x79, 0x50, 0xe9, 0x76, 0xec, 0x6f, ++ 0x72, 0x46, 0xd6, 0x88, 0xe5, 0x39, 0xbc, 0x3d, 0xf6, 0x73, 0x38, 0x81, ++ 0x35, 0x38, 0x47, 0x46, 0xf1, 0x7e, 0xab, 0x03, 0x58, 0x2e, 0x05, 0xbf, ++ 0x87, 0xfa, 0x2e, 0xca, 0x8f, 0xbe, 0x3f, 0x8c, 0xb2, 0x0b, 0xf5, 0xd2, ++ 0xd3, 0xdb, 0x0b, 0x14, 0xdc, 0x97, 0xb4, 0x05, 0xd2, 0x71, 0x1d, 0xf9, ++ 0xe8, 0xd8, 0x0f, 0x28, 0x0f, 0x76, 0x01, 0xde, 0x63, 0xe4, 0xc4, 0x2b, ++ 0x25, 0x54, 0xf2, 0x93, 0x0a, 0x4f, 0x94, 0xd2, 0xbd, 0x65, 0x9f, 0xe2, ++ 0xc7, 0x2c, 0xbc, 0xef, 0xa8, 0x74, 0x98, 0x7b, 0x0c, 0xe6, 0x87, 0x59, ++ 0xef, 0x21, 0x65, 0xdb, 0xf9, 0xf9, 0x19, 0x89, 0xaf, 0x9e, 0xfc, 0xc0, ++ 0xf5, 0x0f, 0xc0, 0x19, 0x72, 0xa6, 0x58, 0xe0, 0x64, 0xe3, 0x10, 0x6e, ++ 0x27, 0x6f, 0x17, 0x8b, 0xdf, 0xee, 0xa7, 0xe0, 0x63, 0x49, 0x4f, 0x40, ++ 0xcf, 0x35, 0x1e, 0x41, 0x4f, 0x94, 0xd3, 0x16, 0x71, 0x2f, 0x66, 0x37, ++ 0xdf, 0x88, 0x7b, 0x15, 0x3a, 0xc4, 0x7d, 0x50, 0xb3, 0x13, 0xc5, 0xbd, ++ 0x50, 0x06, 0xf7, 0xaf, 0xe4, 0x3d, 0x27, 0x2d, 0x5a, 0x20, 0x11, 0xed, ++ 0xf3, 0xd9, 0xdd, 0xf9, 0x09, 0x01, 0x3a, 0x7f, 0x54, 0xe9, 0x0a, 0x24, ++ 0x8d, 0x47, 0xba, 0x1d, 0xe3, 0xfe, 0xd3, 0xe9, 0x22, 0x7e, 0x3f, 0xdd, ++ 0x69, 0x7b, 0x20, 0x09, 0xe5, 0xf5, 0xf4, 0x31, 0x55, 0xa9, 0xa7, 0xfc, ++ 0x0e, 0x9e, 0xf7, 0x29, 0xf3, 0xea, 0x4e, 0xdb, 0x7d, 0x6b, 0xae, 0x86, ++ 0xef, 0x73, 0xfe, 0x59, 0x0d, 0xd4, 0xd3, 0x67, 0xab, 0x5f, 0xd0, 0xc1, ++ 0x02, 0xa3, 0xfe, 0x15, 0xfd, 0xa4, 0x56, 0x95, 0xf6, 0x21, 0x73, 0x1e, ++ 0x9d, 0xa5, 0x0e, 0x87, 0xfa, 0x73, 0xc1, 0x61, 0x40, 0x7d, 0x34, 0xbb, ++ 0xd8, 0x1d, 0x42, 0x3b, 0xae, 0xe5, 0xf7, 0xb5, 0xef, 0xe3, 0x7a, 0x36, ++ 0xe7, 0x69, 0x87, 0x6f, 0x19, 0x8c, 0xf3, 0xda, 0xc6, 0x51, 0x5f, 0x60, ++ 0xf9, 0xd4, 0x5a, 0x8f, 0xcf, 0x41, 0xf1, 0xd6, 0x5c, 0x05, 0xef, 0x8f, ++ 0x5f, 0xb2, 0x3e, 0xc7, 0xa0, 0x7d, 0xc8, 0xa5, 0x4c, 0xc4, 0x99, 0x27, ++ 0x96, 0x14, 0xc3, 0x1a, 0xfc, 0x3c, 0x0e, 0x2d, 0xf7, 0x2f, 0x9c, 0x74, ++ 0x9f, 0xbc, 0xf8, 0x5e, 0xdd, 0x38, 0x09, 0xe6, 0x77, 0x75, 0x5a, 0x8b, ++ 0x0d, 0x51, 0xf9, 0x87, 0xb5, 0xd5, 0x8d, 0x78, 0x9e, 0x6d, 0x45, 0x7d, ++ 0x69, 0x26, 0xc6, 0x11, 0xd6, 0xba, 0x27, 0x37, 0x62, 0x1c, 0x21, 0x3d, ++ 0x3d, 0xd0, 0x76, 0x03, 0xac, 0xeb, 0x11, 0xf7, 0x8d, 0x25, 0x58, 0x6e, ++ 0x79, 0x4a, 0xf6, 0x37, 0xa5, 0x11, 0xe3, 0x06, 0xbf, 0xb0, 0x05, 0x73, ++ 0x14, 0xf8, 0x7e, 0xda, 0x3d, 0xab, 0x84, 0xf2, 0xaf, 0x07, 0xc9, 0xfe, ++ 0x97, 0x34, 0x06, 0x60, 0x4d, 0x98, 0xfd, 0xe3, 0xab, 0xbe, 0x38, 0x81, ++ 0xf9, 0xda, 0xeb, 0x1a, 0x4b, 0xd0, 0x2e, 0x00, 0xba, 0x0a, 0xfb, 0x7a, ++ 0x0d, 0xc1, 0x37, 0x6f, 0x82, 0x2c, 0x37, 0xe9, 0xc5, 0x83, 0xa1, 0x7d, ++ 0x22, 0xb3, 0xc4, 0x53, 0xed, 0xd1, 0xb8, 0x04, 0xc5, 0x6b, 0x5b, 0xba, ++ 0xed, 0xf3, 0x0d, 0x25, 0x18, 0x87, 0x98, 0x33, 0xb1, 0xb6, 0x58, 0x83, ++ 0xfe, 0x0b, 0xd7, 0x3d, 0xd5, 0x98, 0x0f, 0x2a, 0x76, 0x6c, 0x53, 0x91, ++ 0x11, 0x80, 0xf2, 0xf5, 0xeb, 0x36, 0x95, 0xe0, 0xfa, 0xd7, 0xc2, 0x02, ++ 0x15, 0x68, 0x97, 0xdc, 0xb0, 0xee, 0xe9, 0x12, 0x8c, 0xcb, 0xa7, 0xf6, ++ 0xb1, 0xf6, 0x9f, 0xaa, 0x8a, 0xb8, 0x3c, 0xdb, 0xd6, 0x88, 0xfd, 0x15, ++ 0xce, 0x0c, 0x8c, 0x50, 0xa0, 0xfd, 0xbf, 0xac, 0x7b, 0xa9, 0x11, 0xfd, ++ 0x90, 0x34, 0xcc, 0xcf, 0x85, 0xf1, 0x2e, 0x78, 0xfe, 0xd4, 0x18, 0xea, ++ 0x1f, 0xd5, 0x9f, 0xb7, 0x44, 0xef, 0xd1, 0x5a, 0x8d, 0x72, 0x50, 0xe5, ++ 0x6c, 0x3f, 0x82, 0xa1, 0xda, 0xec, 0xa5, 0x5d, 0x3a, 0xcf, 0xdb, 0x16, ++ 0x7a, 0xa3, 0x3f, 0xe7, 0xe7, 0xee, 0xf2, 0xd0, 0x76, 0x9e, 0x5f, 0x2f, ++ 0xcb, 0x99, 0xbc, 0xdc, 0xb2, 0x2c, 0xbe, 0x1e, 0x7a, 0xd4, 0xcb, 0xfd, ++ 0xcd, 0x96, 0x84, 0xf8, 0xdf, 0x5f, 0x15, 0x7a, 0x47, 0xca, 0x4b, 0xd2, ++ 0x09, 0x16, 0xd8, 0x19, 0x47, 0x6e, 0xb6, 0xb8, 0xdd, 0xff, 0x47, 0x72, ++ 0xd7, 0xfa, 0x7f, 0x4b, 0xaf, 0x25, 0x5f, 0x46, 0xaf, 0x25, 0x4b, 0xbd, ++ 0x26, 0xf0, 0x99, 0x6f, 0xd5, 0xd3, 0x30, 0x8c, 0xd0, 0xf7, 0x57, 0xe7, ++ 0xa2, 0x7e, 0x58, 0x80, 0xc9, 0x56, 0x26, 0x7b, 0xa1, 0xb0, 0x6d, 0x3a, ++ 0xad, 0x23, 0xdf, 0xf3, 0x72, 0xfb, 0x99, 0xf9, 0x78, 0xfb, 0xb4, 0x62, ++ 0x9e, 0xef, 0xd4, 0xf5, 0x4a, 0x22, 0xbf, 0x27, 0xd5, 0xd9, 0x96, 0x67, ++ 0xde, 0x17, 0x3d, 0x2e, 0xf0, 0x51, 0xfc, 0xf0, 0xd4, 0x27, 0xe8, 0xbc, ++ 0x7b, 0x9b, 0x9d, 0xd1, 0x39, 0x95, 0x5d, 0x45, 0x97, 0xcc, 0x33, 0xad, ++ 0xc4, 0xf8, 0xae, 0xc9, 0xff, 0xa8, 0xd4, 0x22, 0xe4, 0xd7, 0x57, 0x62, ++ 0x7c, 0x77, 0x14, 0xf6, 0xf7, 0x26, 0x9d, 0x33, 0xc5, 0x7e, 0xf0, 0x1c, ++ 0x0a, 0xee, 0x63, 0x60, 0x7c, 0x36, 0x6d, 0x79, 0x7c, 0xfa, 0x4b, 0x7b, ++ 0xaa, 0xf2, 0xa2, 0xc1, 0x42, 0x7d, 0x7a, 0xae, 0xbb, 0xd1, 0xfe, 0x53, ++ 0x59, 0x68, 0xd4, 0xe5, 0xe7, 0x15, 0xed, 0xcf, 0x1a, 0x7f, 0xe8, 0xd9, ++ 0x9f, 0x2e, 0xf6, 0x83, 0x62, 0xd6, 0x47, 0x3d, 0x3e, 0x9c, 0x7f, 0x96, ++ 0x7c, 0x0a, 0xf8, 0xb6, 0x99, 0xf8, 0x6b, 0x9e, 0xe0, 0x37, 0xb9, 0xaf, ++ 0x7c, 0x6e, 0xcf, 0xb0, 0xad, 0xe6, 0x7d, 0x7c, 0x79, 0x3e, 0x0c, 0xf4, ++ 0xf3, 0x4f, 0xf1, 0x77, 0x30, 0x42, 0xa0, 0xe7, 0xd1, 0xce, 0x2c, 0xd4, ++ 0x02, 0x37, 0x63, 0xfd, 0xc2, 0xb6, 0x14, 0xda, 0x67, 0x92, 0xfc, 0x21, ++ 0xf9, 0x42, 0xd2, 0xb5, 0x25, 0xa5, 0x96, 0xe2, 0x76, 0x5d, 0x4f, 0x2a, ++ 0x74, 0x5e, 0x2f, 0x16, 0x2e, 0x9b, 0x87, 0xd3, 0xb1, 0x70, 0x23, 0xbf, ++ 0x9f, 0x31, 0x63, 0x66, 0x50, 0x35, 0xdf, 0x27, 0x2f, 0xe5, 0x01, 0xfa, ++ 0x6f, 0x11, 0xfd, 0x8f, 0x1e, 0x47, 0xf2, 0xb3, 0x99, 0xcb, 0x03, 0xc8, ++ 0xcd, 0xbd, 0x28, 0xbf, 0x78, 0xdf, 0x0e, 0xce, 0xc3, 0xdf, 0x5e, 0x60, ++ 0xfe, 0xdd, 0x09, 0x09, 0x7f, 0x05, 0xf2, 0x62, 0x1a, 0xd1, 0x91, 0xe3, ++ 0xff, 0x65, 0x17, 0xed, 0xf7, 0xc7, 0xae, 0x93, 0x51, 0xfc, 0xf7, 0xbd, ++ 0x0c, 0x3d, 0xb3, 0x89, 0x9e, 0xd2, 0x0e, 0xaa, 0xec, 0x75, 0xbd, 0xf4, ++ 0xf2, 0xfc, 0xc5, 0x13, 0x11, 0xaf, 0x0f, 0xe3, 0x47, 0xc8, 0xff, 0xa8, ++ 0x4f, 0x9a, 0x3f, 0xa4, 0xfb, 0xe3, 0x5a, 0x5a, 0x55, 0xa6, 0xf8, 0xf8, ++ 0xbc, 0x51, 0x6f, 0x15, 0x76, 0xeb, 0xe3, 0xaf, 0x0f, 0x4f, 0xd4, 0xc8, ++ 0x1e, 0x8b, 0xae, 0x1f, 0x3e, 0xb2, 0xcb, 0xa4, 0xfe, 0x8c, 0x38, 0x9d, ++ 0xd1, 0xfa, 0x5d, 0x6b, 0xbe, 0x9e, 0x8c, 0xfb, 0xcc, 0xa9, 0xe2, 0x7e, ++ 0xe6, 0x54, 0x15, 0x8f, 0x60, 0x47, 0xe1, 0x18, 0xe1, 0xe1, 0x7a, 0x6c, ++ 0x5c, 0x30, 0x7e, 0x3c, 0xb4, 0xc0, 0xed, 0xe1, 0x74, 0x10, 0xf3, 0x78, ++ 0x72, 0xe9, 0x44, 0xf6, 0x21, 0xcc, 0xff, 0x7b, 0x62, 0x9d, 0x1f, 0xd7, ++ 0x1e, 0xa2, 0xdf, 0x4f, 0xb2, 0x23, 0x1e, 0xc7, 0x44, 0xf1, 0x21, 0xf5, ++ 0xd9, 0xad, 0x8e, 0xf6, 0x17, 0xc5, 0xb9, 0x17, 0x0b, 0x3f, 0xca, 0x32, ++ 0xd8, 0x39, 0xd5, 0xb6, 0x41, 0xa6, 0xef, 0x6e, 0xae, 0x77, 0xe5, 0x78, ++ 0x00, 0x6f, 0x03, 0xde, 0xc7, 0x9c, 0x06, 0x4f, 0xbc, 0xfa, 0xff, 0x82, ++ 0x27, 0x47, 0xec, 0xbb, 0x73, 0xbe, 0x3c, 0xb9, 0x27, 0x63, 0x0b, 0xfd, ++ 0x6e, 0xc3, 0xa0, 0xc0, 0x08, 0xd4, 0x37, 0x92, 0xbf, 0x60, 0x3d, 0x11, ++ 0xf3, 0xb5, 0xdd, 0x3f, 0xdd, 0xcd, 0xf9, 0x7f, 0x7a, 0x1c, 0x3a, 0x4c, ++ 0x17, 0x7c, 0x36, 0x6f, 0x23, 0x9f, 0x7f, 0xcb, 0x7f, 0x14, 0xdf, 0x8c, ++ 0x7c, 0xd0, 0xf2, 0x56, 0x4a, 0xf2, 0x32, 0x13, 0xbf, 0xd7, 0x0b, 0xbd, ++ 0x22, 0xfb, 0x95, 0xf2, 0x24, 0xdb, 0xc9, 0xef, 0x33, 0x44, 0x7f, 0xf7, ++ 0x7a, 0xbc, 0xf4, 0xac, 0x17, 0xf8, 0x43, 0x38, 0xe2, 0xe5, 0x57, 0xc8, ++ 0x76, 0x38, 0x5f, 0xd2, 0xd7, 0x2b, 0xb9, 0xbe, 0x86, 0x79, 0x87, 0x90, ++ 0x4e, 0x30, 0xef, 0x10, 0x9e, 0xc3, 0xbf, 0xe0, 0x51, 0x62, 0xf0, 0x2a, ++ 0xd6, 0x07, 0x81, 0xef, 0x2a, 0x1d, 0xf0, 0x0c, 0x78, 0xdc, 0x61, 0x0f, ++ 0xf5, 0xc5, 0x7c, 0xad, 0x34, 0x95, 0xe7, 0xc3, 0x5c, 0x4e, 0x7e, 0x61, ++ 0x3e, 0xe2, 0x77, 0x04, 0x3c, 0xa4, 0x77, 0x62, 0xfb, 0x5f, 0x2b, 0xf8, ++ 0x63, 0x8b, 0xb8, 0x47, 0xf7, 0xb0, 0x0d, 0xe4, 0x19, 0xe5, 0xcc, 0xcd, ++ 0xe1, 0x3d, 0xb7, 0x27, 0x8b, 0xfa, 0xad, 0x13, 0xf5, 0x2e, 0xaf, 0x0f, ++ 0xaf, 0x4c, 0x7e, 0xb6, 0x88, 0x7c, 0x15, 0x80, 0x9f, 0xf2, 0x31, 0xab, ++ 0x5e, 0xed, 0xb7, 0xc5, 0x0a, 0x7f, 0xbd, 0x80, 0x3f, 0xb8, 0x1c, 0xcf, ++ 0x11, 0xa6, 0x3e, 0xc1, 0xfc, 0xcb, 0x19, 0xe1, 0x2d, 0x82, 0xf8, 0x4a, ++ 0xf1, 0xf2, 0xf5, 0xa4, 0x45, 0x0f, 0x92, 0xfd, 0xd6, 0xf5, 0x24, 0x23, ++ 0xbf, 0x75, 0x08, 0xd8, 0x11, 0x3e, 0x28, 0xd7, 0x94, 0xba, 0x47, 0x2a, ++ 0x39, 0x51, 0x39, 0xcd, 0x6b, 0x56, 0x88, 0x8e, 0x85, 0x1b, 0x60, 0x9d, ++ 0x46, 0xbc, 0x39, 0x25, 0xde, 0xde, 0xd8, 0x69, 0x1e, 0x77, 0x83, 0xc7, ++ 0x63, 0xb9, 0x87, 0xa0, 0x52, 0xd0, 0x7f, 0x08, 0xac, 0xef, 0x3f, 0x05, ++ 0x78, 0x87, 0x40, 0x3f, 0x2f, 0x12, 0xdc, 0x1c, 0xae, 0x93, 0x8f, 0x37, ++ 0x5f, 0x8f, 0xf1, 0xb9, 0xee, 0xf5, 0x5e, 0xf0, 0x45, 0x4f, 0x38, 0x23, ++ 0x7a, 0x3f, 0x0e, 0x27, 0xe5, 0x55, 0xa0, 0xbd, 0xe3, 0x1b, 0x1d, 0x85, ++ 0x13, 0xfb, 0xa7, 0x3c, 0x1f, 0x77, 0xe9, 0x32, 0xec, 0xb7, 0xfa, 0x37, ++ 0xbb, 0xfb, 0x99, 0xfb, 0x7d, 0xb1, 0xbb, 0xdf, 0xd9, 0x13, 0x5d, 0xa8, ++ 0xc7, 0xd6, 0x83, 0x5e, 0x25, 0x75, 0x10, 0x3c, 0x84, 0xe7, 0x48, 0xe6, ++ 0xee, 0x4d, 0x36, 0xf0, 0xbe, 0x07, 0xf0, 0x17, 0x6c, 0xe8, 0x17, 0xca, ++ 0x71, 0xe7, 0x6a, 0xf2, 0x77, 0x7f, 0xda, 0x0b, 0xf1, 0xbe, 0xf3, 0xbc, ++ 0xee, 0x71, 0x40, 0x7f, 0x9a, 0xf4, 0xdf, 0x01, 0x8f, 0x9b, 0xd7, 0x77, ++ 0x1e, 0x1c, 0x88, 0xf7, 0x68, 0x33, 0x8d, 0xaf, 0x4f, 0x69, 0x4d, 0xa7, ++ 0x7f, 0x84, 0xfb, 0x10, 0xbd, 0xad, 0xab, 0x7f, 0x2b, 0x7e, 0x00, 0x3a, ++ 0xd2, 0xbc, 0xbb, 0x76, 0xc1, 0xbc, 0x7c, 0x51, 0xfc, 0xb5, 0x34, 0xcf, ++ 0x5a, 0xe6, 0x42, 0x7d, 0x79, 0x82, 0xf9, 0x51, 0x5f, 0xca, 0x79, 0x0d, ++ 0x99, 0xd9, 0xee, 0xc5, 0xfc, 0x9b, 0x1a, 0xa1, 0x47, 0x01, 0x2f, 0x36, ++ 0xe4, 0x83, 0xd4, 0x7f, 0xf6, 0xb1, 0xe5, 0x3e, 0x93, 0x7e, 0x16, 0xf4, ++ 0x1b, 0xca, 0xb8, 0xbc, 0x49, 0xff, 0x64, 0x28, 0x6e, 0x90, 0x40, 0xf9, ++ 0x1d, 0x4f, 0x81, 0xd0, 0x5b, 0x8c, 0xe2, 0x04, 0x27, 0x5f, 0xdd, 0xf7, ++ 0x53, 0x7e, 0x6f, 0x07, 0xa7, 0x57, 0xcd, 0x4c, 0x4e, 0x5f, 0x29, 0xaf, ++ 0x5f, 0x79, 0x82, 0x29, 0x5e, 0xb4, 0x4f, 0xef, 0x7a, 0x68, 0x22, 0xbf, ++ 0x0c, 0x37, 0x42, 0xf7, 0x34, 0x57, 0x6e, 0xe0, 0xe3, 0x40, 0xbd, 0x66, ++ 0x46, 0x72, 0xdb, 0x96, 0x3d, 0x13, 0xf3, 0x2f, 0x91, 0x9f, 0xc6, 0xf4, ++ 0xa4, 0x5b, 0x6a, 0x69, 0xb3, 0x8b, 0xda, 0x0b, 0xfe, 0x3f, 0xfb, 0xca, ++ 0xf0, 0x30, 0xf2, 0x61, 0xda, 0xed, 0x5d, 0xc5, 0xf8, 0x1e, 0xf8, 0x81, ++ 0xe0, 0x69, 0x69, 0xf6, 0x84, 0xd1, 0x5f, 0x26, 0x7b, 0x19, 0xdb, 0xef, ++ 0x53, 0xf8, 0xfa, 0xc5, 0x82, 0x84, 0x97, 0xb9, 0x33, 0x0d, 0xbf, 0x99, ++ 0x4f, 0x24, 0x7c, 0xdd, 0x74, 0x67, 0x40, 0xf7, 0xe1, 0xd1, 0xf7, 0x43, ++ 0x66, 0xf2, 0x7e, 0x6b, 0x5a, 0xa1, 0x5f, 0xde, 0x0f, 0xc9, 0x4f, 0xe5, ++ 0xfd, 0x8c, 0xdf, 0x4f, 0x2d, 0xe8, 0x03, 0xac, 0x16, 0x72, 0x8c, 0x8c, ++ 0xea, 0x1d, 0x28, 0x47, 0x1c, 0x29, 0x51, 0x3c, 0x4a, 0xfc, 0xc9, 0xf6, ++ 0xd5, 0xf7, 0xf3, 0xdf, 0xee, 0xc1, 0x78, 0x01, 0xfa, 0x79, 0x35, 0xac, ++ 0x9d, 0xe2, 0xa6, 0x95, 0x6a, 0x69, 0x7f, 0xf4, 0xd7, 0x58, 0x86, 0x83, ++ 0xce, 0xd9, 0x82, 0xff, 0x4b, 0xfa, 0xe7, 0xb0, 0x8b, 0x69, 0x2e, 0x68, ++ 0xff, 0x3a, 0x3c, 0x71, 0x7d, 0x9f, 0xac, 0x2e, 0xa2, 0xf3, 0x50, 0x93, ++ 0x07, 0x29, 0x24, 0xe7, 0x20, 0x49, 0x32, 0x5e, 0x46, 0xbf, 0x37, 0x76, ++ 0xeb, 0x0d, 0x89, 0x3c, 0xef, 0xed, 0xab, 0xef, 0x0e, 0xc6, 0xf9, 0xa4, ++ 0x25, 0x72, 0xbe, 0x83, 0x7e, 0x9c, 0xa2, 0x1f, 0x27, 0xd9, 0xa9, 0x42, ++ 0x1f, 0xfe, 0x3a, 0x1b, 0xf4, 0xa1, 0xc9, 0x2f, 0x3d, 0xac, 0x28, 0xd4, ++ 0xcf, 0xe1, 0x6f, 0x5d, 0xb3, 0x75, 0xb9, 0x12, 0x9d, 0x27, 0xf6, 0x87, ++ 0x76, 0xc3, 0x61, 0x65, 0x5a, 0x7f, 0xb2, 0x67, 0x45, 0x5c, 0x03, 0xf0, ++ 0x66, 0xc9, 0xc7, 0x8b, 0xf2, 0x6f, 0x48, 0xc0, 0xd5, 0x9e, 0x8d, 0xdf, ++ 0xcd, 0x7e, 0x12, 0xfa, 0x35, 0xdd, 0x7e, 0x16, 0x4b, 0x7a, 0xf8, 0x46, ++ 0xf0, 0xab, 0xc6, 0x4e, 0x69, 0x8e, 0xe0, 0x95, 0xda, 0xf5, 0xa1, 0xe4, ++ 0x1b, 0xbf, 0x07, 0xe3, 0x4e, 0x06, 0x3f, 0xcb, 0x05, 0xf3, 0xef, 0x8f, ++ 0x7c, 0x8c, 0x7e, 0x41, 0x4e, 0x48, 0xf5, 0x22, 0x5c, 0x43, 0x14, 0xba, ++ 0x3f, 0xfa, 0x48, 0x42, 0x30, 0x9f, 0xdf, 0x43, 0xcc, 0xc7, 0x49, 0x17, ++ 0x71, 0xaf, 0x74, 0x91, 0xa7, 0x8d, 0xf6, 0x3c, 0x3e, 0xb7, 0x79, 0xf9, ++ 0x7a, 0x31, 0x3c, 0x89, 0xaf, 0x2f, 0x0f, 0x25, 0xf1, 0x72, 0xba, 0x37, ++ 0x7e, 0x9c, 0xec, 0x09, 0xf1, 0xbd, 0x46, 0xdc, 0xdb, 0xbd, 0xba, 0x28, ++ 0x7e, 0x3e, 0xe0, 0x38, 0xaf, 0x35, 0xce, 0x79, 0xab, 0xd8, 0xf7, 0x01, ++ 0x7f, 0x6b, 0x9c, 0x37, 0x8d, 0xdf, 0x07, 0xcf, 0xf3, 0x94, 0xf9, 0x3e, ++ 0x11, 0xd8, 0xb5, 0x84, 0xdf, 0xe2, 0x87, 0x67, 0xd2, 0xbe, 0xe7, 0x85, ++ 0xb6, 0x3b, 0x92, 0xf8, 0xfd, 0x14, 0x5c, 0xfe, 0x3f, 0x56, 0x02, 0xff, ++ 0x76, 0x97, 0x82, 0xcf, 0x52, 0xba, 0x1f, 0x30, 0xf4, 0x5b, 0x95, 0xf2, ++ 0xfd, 0x3f, 0x32, 0x02, 0x5e, 0xcc, 0x0f, 0xab, 0x4a, 0x88, 0x9f, 0x7f, ++ 0x7e, 0xaf, 0x80, 0xa3, 0x4a, 0xcc, 0xff, 0x74, 0x1d, 0xbf, 0x4f, 0x62, ++ 0x1e, 0xee, 0x47, 0x82, 0xbe, 0xb8, 0x55, 0xf8, 0x67, 0x0b, 0x9a, 0x6e, ++ 0x2b, 0x41, 0x7a, 0x2f, 0x00, 0xff, 0x1d, 0xf7, 0x23, 0x65, 0xde, 0x83, ++ 0xa4, 0x6f, 0xd9, 0x26, 0xd5, 0xb2, 0x1f, 0x31, 0x0f, 0xf7, 0x23, 0xfb, ++ 0xfc, 0x35, 0xfe, 0x83, 0xbf, 0x17, 0xff, 0x61, 0xb4, 0xc5, 0x7f, 0x90, ++ 0xe3, 0xc6, 0xfa, 0x11, 0x27, 0xeb, 0x32, 0x2d, 0xfb, 0x26, 0xb3, 0x9b, ++ 0x06, 0x89, 0x7b, 0x3c, 0x78, 0xfd, 0x39, 0xcc, 0x4f, 0x70, 0xcf, 0x59, ++ 0xd9, 0xcf, 0xb2, 0x7f, 0xca, 0x56, 0xa6, 0x5d, 0xd9, 0x3d, 0xa7, 0xe0, ++ 0x37, 0x84, 0xe2, 0xc2, 0xa7, 0x93, 0x7e, 0x95, 0xef, 0x4f, 0xd6, 0x39, ++ 0x59, 0xc8, 0x0c, 0xc7, 0x27, 0x83, 0x29, 0x6f, 0x64, 0x9c, 0x37, 0xf8, ++ 0x80, 0xd7, 0x02, 0x47, 0x22, 0x0b, 0x99, 0xe1, 0x60, 0x13, 0xf8, 0xef, ++ 0x7a, 0xb9, 0x78, 0xdc, 0x1a, 0xe8, 0x1e, 0x32, 0xdb, 0xd3, 0xb1, 0x70, ++ 0xad, 0xf2, 0xfe, 0xb5, 0x7e, 0x5a, 0x6e, 0x2f, 0x78, 0xce, 0xfb, 0x2f, ++ 0xf1, 0xd3, 0x0a, 0x27, 0x70, 0x7d, 0x86, 0x97, 0x12, 0x61, 0x0e, 0xcc, ++ 0xd8, 0x49, 0x56, 0xbb, 0x79, 0xb3, 0x97, 0xaf, 0x93, 0x9b, 0xbd, 0x89, ++ 0x16, 0xbb, 0x79, 0xee, 0x4c, 0x6b, 0xbd, 0x2d, 0xa2, 0xde, 0x16, 0x51, ++ 0xef, 0x72, 0xfe, 0xbf, 0xd9, 0x5e, 0x56, 0x06, 0xa1, 0xde, 0xe0, 0xfd, ++ 0xc9, 0xdf, 0xe3, 0xc9, 0x39, 0xf3, 0x16, 0xe5, 0x9d, 0xbe, 0xe7, 0xe5, ++ 0x76, 0xc0, 0xf1, 0xa4, 0xc0, 0x0e, 0x94, 0xc7, 0xb5, 0x22, 0x4f, 0x7f, ++ 0xcb, 0x5f, 0x0e, 0x65, 0xce, 0x41, 0xfb, 0xe2, 0x5f, 0xed, 0x94, 0x27, ++ 0x50, 0xb4, 0x79, 0xc9, 0x72, 0xcc, 0xa3, 0x76, 0x37, 0x2b, 0x06, 0x9d, ++ 0x53, 0x6a, 0xb5, 0xf2, 0xd1, 0x3f, 0x2e, 0x6d, 0x1e, 0x38, 0x17, 0xf0, ++ 0xf1, 0x92, 0xa0, 0x53, 0xa5, 0x9f, 0xcf, 0xa3, 0xd2, 0x1f, 0xd1, 0x07, ++ 0xbb, 0x31, 0xaf, 0x9b, 0x8f, 0xdf, 0xbf, 0xf9, 0x80, 0xa2, 0x99, 0xf4, ++ 0x44, 0xff, 0x32, 0x5e, 0x6f, 0x9f, 0xd7, 0x6e, 0x89, 0xbb, 0x1f, 0xf0, ++ 0xf2, 0x7b, 0x24, 0x7e, 0xe9, 0x95, 0xf1, 0xc1, 0xf0, 0x81, 0x9b, 0x52, ++ 0xb1, 0x7e, 0x40, 0xc3, 0x75, 0xa5, 0x2f, 0xfe, 0x0e, 0x0e, 0xc0, 0xd3, ++ 0xb7, 0x96, 0xd1, 0x39, 0xa8, 0xbe, 0xa3, 0xb9, 0x3d, 0xf6, 0x8f, 0xa3, ++ 0xb7, 0x28, 0xf8, 0xbb, 0x5c, 0x72, 0x9e, 0x2b, 0x6d, 0xd3, 0xf2, 0x0d, ++ 0x68, 0xb7, 0x32, 0x3d, 0xd1, 0x8f, 0x7a, 0x3a, 0xdb, 0x08, 0xbe, 0x8e, ++ 0xf3, 0xac, 0x7c, 0x2f, 0x12, 0xc1, 0xf0, 0xcd, 0xd8, 0xf7, 0xda, 0x34, ++ 0xf4, 0x97, 0xfc, 0x46, 0xe0, 0x28, 0xf2, 0xab, 0x9c, 0x97, 0x4f, 0x35, ++ 0xfa, 0xe2, 0x7a, 0x93, 0xf8, 0x1e, 0x87, 0xaf, 0xa9, 0x3b, 0x0e, 0xc1, ++ 0xf5, 0x34, 0x63, 0x6b, 0x84, 0xff, 0xb2, 0x95, 0xdb, 0xb1, 0x2a, 0x3b, ++ 0xca, 0xb8, 0x9d, 0x4b, 0xfb, 0xb5, 0xe9, 0xcb, 0x86, 0xd2, 0x7a, 0x21, ++ 0xe7, 0x93, 0x9e, 0x22, 0xf4, 0x6d, 0x3a, 0x0b, 0xee, 0x26, 0x7b, 0x9b, ++ 0xad, 0xa4, 0xf5, 0xce, 0xc9, 0xd7, 0xcf, 0xf4, 0x65, 0xfc, 0x77, 0xf4, ++ 0x24, 0x3d, 0xa3, 0xf1, 0x93, 0x61, 0x23, 0x31, 0x7e, 0x32, 0x68, 0x6d, ++ 0x44, 0x9b, 0x0d, 0xed, 0x5e, 0xdd, 0x64, 0x8b, 0x7b, 0xef, 0xc6, 0x29, ++ 0x81, 0x77, 0x98, 0xc7, 0x07, 0x38, 0xbf, 0x58, 0xfa, 0xf4, 0xba, 0xee, ++ 0x88, 0x7a, 0xf6, 0x5e, 0xe2, 0x52, 0x92, 0xdf, 0x13, 0xa7, 0xc4, 0xf7, ++ 0xf7, 0x18, 0x7b, 0x84, 0xbe, 0x17, 0x6d, 0x4e, 0xbd, 0x87, 0xe4, 0xb2, ++ 0x41, 0xa7, 0x7b, 0x12, 0x25, 0xfe, 0xfd, 0x46, 0xe9, 0x1f, 0x11, 0x9e, ++ 0xbe, 0xcd, 0x5b, 0x14, 0xc4, 0xcd, 0x49, 0x91, 0xcf, 0x70, 0x72, 0xf5, ++ 0x4f, 0x15, 0xb4, 0xb7, 0xbe, 0xbb, 0x90, 0x19, 0x6a, 0x1c, 0x7e, 0xea, ++ 0x96, 0xd7, 0xa5, 0xbb, 0x07, 0xce, 0x35, 0xe9, 0x1b, 0xe8, 0x9f, 0xe8, ++ 0xb1, 0x25, 0x26, 0x3f, 0x5d, 0xfa, 0x27, 0xee, 0x24, 0xae, 0xc7, 0xe7, ++ 0x19, 0xa5, 0x6a, 0x52, 0x1a, 0xe5, 0x0b, 0x53, 0x1c, 0x6f, 0xe1, 0x76, ++ 0xfe, 0x7b, 0x1c, 0xbd, 0xe2, 0xe3, 0x0a, 0xf1, 0xa5, 0x94, 0x71, 0x3f, ++ 0xa6, 0x72, 0x06, 0xff, 0x3d, 0xd2, 0xa2, 0xcd, 0x1a, 0xd1, 0xbb, 0xa2, ++ 0x81, 0xff, 0x1e, 0x61, 0xe5, 0xce, 0x5d, 0x74, 0x1e, 0x8f, 0x3d, 0xc4, ++ 0xfc, 0x28, 0xef, 0x95, 0xcd, 0xbb, 0x94, 0xb9, 0x30, 0x6e, 0xc5, 0xce, ++ 0x5d, 0xca, 0x3c, 0x13, 0xfe, 0xfa, 0x55, 0x86, 0x29, 0xaf, 0xfb, 0x2a, ++ 0x8f, 0x8c, 0x53, 0x47, 0xe8, 0xde, 0xb1, 0x58, 0xbe, 0xc6, 0xf8, 0x3e, ++ 0xae, 0xef, 0x47, 0x5c, 0x5c, 0xde, 0x3b, 0x8a, 0xdc, 0x21, 0x8c, 0x5b, ++ 0x77, 0xd8, 0x83, 0x95, 0x58, 0xaf, 0x23, 0x2b, 0xd1, 0x8f, 0xfb, 0xa3, ++ 0x12, 0xdf, 0xaf, 0xef, 0xba, 0x91, 0xee, 0x3f, 0xf0, 0xec, 0x76, 0x44, ++ 0xf0, 0xb9, 0xd2, 0xb6, 0x35, 0xd3, 0x09, 0xf5, 0x56, 0x5e, 0xad, 0xfb, ++ 0x91, 0x8f, 0xfc, 0x46, 0x70, 0x28, 0xe2, 0x25, 0x45, 0x2b, 0x6d, 0xc1, ++ 0xf6, 0xc9, 0xa9, 0x1e, 0x3f, 0xc6, 0xbd, 0x7d, 0x0e, 0x36, 0x92, 0xd6, ++ 0xb9, 0x2b, 0xc4, 0xc3, 0xd8, 0x18, 0x7e, 0x18, 0xfb, 0x10, 0x97, 0x93, ++ 0x7b, 0x92, 0xbc, 0xd2, 0xce, 0xa2, 0x7c, 0xab, 0x89, 0x49, 0x1e, 0x69, ++ 0x77, 0x90, 0x7e, 0x3a, 0x62, 0xe7, 0xf3, 0xd8, 0xcd, 0x38, 0xbc, 0xdb, ++ 0xbc, 0x81, 0xb1, 0x08, 0x0f, 0x3b, 0xca, 0x7f, 0x4f, 0xa1, 0x6f, 0x65, ++ 0x44, 0xc1, 0x3c, 0x95, 0xd8, 0x71, 0xa3, 0xfc, 0x14, 0xf8, 0x56, 0xd2, ++ 0x37, 0xe0, 0x6f, 0xb0, 0x97, 0x74, 0xd4, 0xeb, 0x15, 0x42, 0xcf, 0x14, ++ 0x6d, 0xde, 0xae, 0x7c, 0x68, 0x82, 0x7b, 0x2a, 0x1a, 0x23, 0xc8, 0x9f, ++ 0x3b, 0xb7, 0x28, 0x18, 0x57, 0x81, 0xef, 0xa4, 0x67, 0xa0, 0x3e, 0xc3, ++ 0x7c, 0xa8, 0xbe, 0x3b, 0x79, 0x3c, 0xa9, 0x02, 0xbe, 0xcf, 0x33, 0xe9, ++ 0x15, 0x39, 0x8f, 0x38, 0xfa, 0xe5, 0x36, 0x84, 0xcf, 0xfd, 0x5e, 0xdb, ++ 0x6b, 0x5c, 0xbf, 0x44, 0x78, 0x1c, 0x59, 0xc0, 0x1b, 0x4b, 0xcf, 0xfb, ++ 0x93, 0xb8, 0xdd, 0x56, 0x02, 0xcb, 0x2a, 0xbd, 0xd7, 0x43, 0x43, 0xd1, ++ 0xdf, 0x3c, 0x92, 0x9b, 0x40, 0xfd, 0x49, 0x79, 0x8f, 0x95, 0xcf, 0xfb, ++ 0x05, 0x9f, 0xf7, 0xdd, 0xb4, 0x5d, 0xb1, 0xb9, 0x29, 0xde, 0x4e, 0xf6, ++ 0x97, 0x84, 0x4f, 0xd6, 0x3b, 0x9e, 0x34, 0x71, 0x4e, 0xd2, 0x18, 0xc4, ++ 0x43, 0x1b, 0xe1, 0xa1, 0x6a, 0x93, 0x46, 0xf3, 0x99, 0xac, 0x97, 0x0e, ++ 0x5e, 0x64, 0x92, 0x87, 0x45, 0xa2, 0xbf, 0x83, 0x77, 0xbd, 0x4f, 0xf7, ++ 0x02, 0x6d, 0xf8, 0xf9, 0x31, 0xe2, 0xc7, 0xaa, 0x26, 0x85, 0xdb, 0xfd, ++ 0x4d, 0xc7, 0xf4, 0x3b, 0x70, 0x5d, 0x09, 0x3d, 0xa7, 0xe2, 0xfe, 0xc8, ++ 0xcd, 0x7c, 0x29, 0x67, 0x8f, 0x8b, 0xfb, 0xb2, 0x6e, 0x6e, 0xe1, 0xfa, ++ 0xb7, 0xaa, 0x65, 0x97, 0x86, 0xf7, 0x4b, 0x4a, 0x3e, 0xcd, 0x39, 0x73, ++ 0x90, 0xee, 0xd9, 0xaa, 0x6a, 0x76, 0x30, 0xdc, 0x2f, 0x05, 0xfe, 0xfb, ++ 0x1e, 0xe2, 0x27, 0x96, 0x4f, 0x25, 0x7e, 0xa4, 0x7e, 0xed, 0x8d, 0x9e, ++ 0xa0, 0x87, 0xf8, 0x39, 0x85, 0x90, 0x2e, 0xe2, 0xd4, 0xc1, 0x9c, 0xe9, ++ 0x9e, 0xa8, 0x7e, 0xde, 0xe6, 0x15, 0xfb, 0xa3, 0x6e, 0xfe, 0x7e, 0x43, ++ 0x12, 0x2f, 0x47, 0xf9, 0x27, 0xb8, 0x2a, 0xc9, 0xa2, 0x5f, 0x5d, 0x24, ++ 0x17, 0x39, 0x67, 0x46, 0x1e, 0xc4, 0x7c, 0xd0, 0x2a, 0xbf, 0x42, 0xe7, ++ 0x2a, 0x53, 0x8b, 0xc5, 0xef, 0x93, 0x99, 0xe0, 0x32, 0x9f, 0x8f, 0x89, ++ 0xd5, 0x8f, 0x18, 0x0f, 0xe7, 0xf1, 0x93, 0xf6, 0xec, 0xe9, 0xa6, 0xf3, ++ 0x71, 0xdd, 0x7a, 0x5e, 0xb4, 0x7f, 0x02, 0xe9, 0xcd, 0xdf, 0x47, 0xf8, ++ 0x7b, 0x96, 0x8b, 0xeb, 0xb5, 0x84, 0x3f, 0x96, 0x7e, 0x87, 0x84, 0x3d, ++ 0x1e, 0x87, 0xcf, 0xc2, 0x49, 0x71, 0xd6, 0x31, 0xb9, 0xae, 0xe7, 0x3c, ++ 0xbd, 0x5b, 0xc3, 0x7b, 0x94, 0x24, 0xff, 0xdc, 0x8c, 0x74, 0x37, 0xf1, ++ 0xcf, 0xcf, 0x92, 0xf8, 0x7d, 0xbc, 0x3f, 0x4b, 0xd2, 0xa8, 0xff, 0xc7, ++ 0x8b, 0xf8, 0x3e, 0xd5, 0xe3, 0x76, 0xbe, 0x7e, 0x3d, 0x5e, 0xef, 0xa4, ++ 0xfc, 0xcd, 0xd7, 0xef, 0xe6, 0xf9, 0x64, 0x9e, 0x7b, 0xf4, 0x08, 0x3e, ++ 0x0f, 0xdb, 0x66, 0x57, 0xe2, 0xf7, 0xc3, 0x7d, 0x39, 0x1c, 0x2b, 0x6d, ++ 0xcb, 0xe8, 0xbc, 0x1f, 0xc8, 0x65, 0x73, 0x12, 0xf1, 0x8f, 0x97, 0x71, ++ 0xfd, 0xc8, 0xf5, 0xe1, 0x86, 0x97, 0xb8, 0x3e, 0xab, 0x0c, 0xb9, 0xe9, ++ 0xbe, 0xd3, 0xca, 0xe0, 0xed, 0x73, 0x29, 0xcf, 0x36, 0xd5, 0xe5, 0xa7, ++ 0xfb, 0x41, 0x83, 0xaf, 0xe9, 0x77, 0x78, 0x7a, 0xf2, 0x95, 0x6f, 0xf7, ++ 0x01, 0xfa, 0x5d, 0xe4, 0x9b, 0x9b, 0xb9, 0xfc, 0x49, 0x3a, 0x80, 0x3e, ++ 0x25, 0xfe, 0x92, 0xf2, 0x20, 0xf1, 0x1a, 0xc5, 0x27, 0xc7, 0xbb, 0x94, ++ 0x27, 0x49, 0x8f, 0x6d, 0x72, 0x5f, 0x00, 0xf8, 0x85, 0xdb, 0x47, 0xdc, ++ 0x1f, 0xc9, 0x67, 0x2a, 0xed, 0xff, 0x94, 0x39, 0x03, 0x47, 0xf0, 0x5c, ++ 0x66, 0x99, 0xd8, 0x2f, 0xcd, 0x17, 0xbf, 0xfb, 0x22, 0xf7, 0x4b, 0x67, ++ 0x0b, 0xba, 0x14, 0xd8, 0x4a, 0x7f, 0x8d, 0xf3, 0xec, 0xb1, 0x5f, 0x7a, ++ 0x85, 0x76, 0x75, 0xc5, 0xd2, 0x5f, 0x0d, 0xc3, 0x78, 0x48, 0x79, 0xe6, ++ 0x51, 0x7a, 0x4a, 0xb9, 0x05, 0xbf, 0xcf, 0x22, 0xdf, 0xef, 0x0b, 0xba, ++ 0x1f, 0x16, 0xcf, 0x8f, 0x05, 0xdf, 0x54, 0x8c, 0x6e, 0x26, 0xb9, 0xac, ++ 0xf8, 0xa8, 0x96, 0xe4, 0xd9, 0x3d, 0x85, 0xeb, 0x35, 0xf7, 0x7b, 0x56, ++ 0x7d, 0xcc, 0xd8, 0x3a, 0x31, 0xdf, 0xb5, 0xd4, 0x7e, 0x72, 0x62, 0x73, ++ 0x09, 0xee, 0x37, 0x4e, 0xfe, 0xb1, 0x62, 0xa0, 0x3f, 0xdc, 0x1b, 0x9c, ++ 0x0b, 0xf0, 0x9c, 0x1a, 0xfa, 0x47, 0x9b, 0x0e, 0x79, 0x67, 0x21, 0x7e, ++ 0xc5, 0xef, 0x4b, 0xc9, 0xf3, 0x3c, 0x5f, 0x08, 0x3d, 0xd1, 0xb1, 0x43, ++ 0x15, 0xbf, 0xb7, 0x59, 0xab, 0x5f, 0xca, 0xfe, 0xbe, 0x5c, 0x7f, 0x2c, ++ 0x72, 0x5c, 0xa1, 0x7b, 0x4f, 0x84, 0x4f, 0xd5, 0xb1, 0xb3, 0x78, 0xfc, ++ 0xc7, 0xe8, 0xd7, 0xed, 0x48, 0xa2, 0xdf, 0x3f, 0xf9, 0x6c, 0xe7, 0x6d, ++ 0xdf, 0xff, 0x38, 0x15, 0x7f, 0x5f, 0xe4, 0x06, 0x3f, 0xda, 0x09, 0xa9, ++ 0xcb, 0x4b, 0x89, 0x7f, 0xba, 0xd2, 0x5c, 0xfe, 0xad, 0x3c, 0xee, 0x39, ++ 0x05, 0xe3, 0x3a, 0xf5, 0xcd, 0x87, 0xbc, 0x78, 0xfe, 0xe7, 0x7f, 0x03, ++ 0x48, 0x7d, 0x85, 0x83, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xd5, 0x7d, ++ 0x09, 0x78, 0x54, 0xd5, 0xd9, 0xf0, 0xb9, 0x73, 0x67, 0x0b, 0x99, 0x49, ++ 0x66, 0x26, 0x7b, 0xc8, 0x32, 0x09, 0x10, 0x50, 0x49, 0x98, 0x84, 0x84, ++ 0x7d, 0x99, 0x24, 0x84, 0x45, 0x16, 0x27, 0x08, 0x05, 0x64, 0x1b, 0xf6, ++ 0x00, 0xd9, 0x58, 0xda, 0x62, 0xa5, 0x7f, 0x06, 0x83, 0x88, 0x88, 0x6d, ++ 0x68, 0xad, 0x22, 0x5a, 0xbf, 0x01, 0xc1, 0x62, 0xb5, 0x35, 0x60, 0xa4, ++ 0x41, 0x02, 0x0e, 0xb2, 0x08, 0x55, 0x3f, 0x47, 0x0a, 0x16, 0x5b, 0xb4, ++ 0x23, 0x22, 0xb2, 0x84, 0x64, 0x8a, 0xad, 0xa5, 0x5f, 0xf9, 0x3e, 0xfe, ++ 0xf3, 0xbe, 0xe7, 0x9c, 0xcc, 0xdc, 0x9b, 0x09, 0xa8, 0x5f, 0xdb, 0xe7, ++ 0xff, 0xc3, 0xe3, 0x73, 0x3c, 0xf7, 0xdc, 0x7b, 0x96, 0xf7, 0xbc, 0xfb, ++ 0xfb, 0x9e, 0x33, 0x97, 0x5f, 0xee, 0x57, 0x60, 0xb0, 0x13, 0x62, 0xb6, ++ 0x68, 0x08, 0x49, 0x20, 0xe4, 0xca, 0x6b, 0xf2, 0x1a, 0xaf, 0x89, 0x90, ++ 0x87, 0x7f, 0xf1, 0xea, 0x88, 0xa1, 0x85, 0x84, 0x2c, 0xf7, 0x4a, 0x71, ++ 0x06, 0x42, 0x48, 0xeb, 0xee, 0xff, 0xf8, 0x9f, 0xd4, 0x78, 0x42, 0x2a, ++ 0x76, 0xd6, 0x58, 0x24, 0x5a, 0xaf, 0x7f, 0xf9, 0x4d, 0x7d, 0x80, 0xbe, ++ 0xa7, 0xf1, 0x6e, 0x67, 0xcf, 0x77, 0xc7, 0x5a, 0xe0, 0xbd, 0xcb, 0x2f, ++ 0x6c, 0x19, 0x41, 0xfa, 0xd2, 0xf6, 0xc6, 0x7a, 0x6c, 0xbf, 0xf2, 0xc2, ++ 0x76, 0xac, 0xbf, 0xf5, 0x8b, 0x57, 0x0f, 0xfd, 0x17, 0x7d, 0xaf, 0xd2, ++ 0x15, 0xe3, 0x80, 0xf7, 0xae, 0xbc, 0x76, 0x58, 0x0f, 0xcf, 0x2b, 0xdd, ++ 0x5a, 0x67, 0x23, 0x2d, 0x89, 0xfb, 0xa8, 0x7e, 0xaa, 0x99, 0x96, 0x9e, ++ 0x97, 0x64, 0x92, 0x48, 0xc8, 0x78, 0xc2, 0xfe, 0x9e, 0xda, 0x73, 0x58, ++ 0x6f, 0xcf, 0xa5, 0xf5, 0x46, 0x3a, 0x2a, 0xfd, 0x9e, 0x4c, 0xd7, 0x7b, ++ 0x7b, 0x65, 0xd1, 0xef, 0x1a, 0xf7, 0x68, 0x17, 0x98, 0xe0, 0x0d, 0x2f, ++ 0x21, 0x45, 0x74, 0xdc, 0x5f, 0xcc, 0x1d, 0xec, 0x86, 0x7a, 0x33, 0x5d, ++ 0x44, 0x4a, 0xe8, 0xf9, 0x46, 0x3d, 0xf1, 0x18, 0x6d, 0xb4, 0xec, 0x46, ++ 0x48, 0x14, 0x2d, 0xaf, 0x16, 0x9b, 0x3c, 0x52, 0x2c, 0x5d, 0x57, 0x89, ++ 0x69, 0x23, 0x94, 0x57, 0x7f, 0x15, 0x35, 0x1d, 0xd6, 0x5b, 0xad, 0x0f, ++ 0xe4, 0x58, 0x61, 0x3e, 0x7d, 0x89, 0x13, 0xea, 0xdd, 0x01, 0x1e, 0x45, ++ 0x30, 0xce, 0x0a, 0x5d, 0xb5, 0x09, 0xbf, 0xc7, 0x7e, 0x3e, 0xd4, 0x11, ++ 0x02, 0x65, 0x2e, 0xf1, 0x90, 0x8b, 0x7d, 0xe8, 0xfa, 0x09, 0xd9, 0x79, ++ 0xab, 0x3f, 0x8c, 0xf7, 0x6b, 0x84, 0x1f, 0x7d, 0x6f, 0x50, 0x54, 0x01, ++ 0x21, 0xd3, 0x66, 0x7d, 0x2a, 0xc1, 0x7c, 0xa2, 0xfb, 0xd6, 0xea, 0x96, ++ 0xe3, 0x3c, 0x5f, 0x66, 0xed, 0x74, 0xd5, 0xe1, 0xed, 0x03, 0x56, 0xd3, ++ 0xf1, 0xe8, 0xb8, 0xb7, 0xe0, 0x6f, 0x64, 0xa8, 0x2c, 0xb2, 0x98, 0xf0, ++ 0x7d, 0x0a, 0x10, 0x2c, 0x53, 0x9b, 0xca, 0xd3, 0xec, 0xb0, 0xfe, 0x78, ++ 0x83, 0x03, 0xd6, 0x2f, 0xd6, 0x97, 0x5a, 0xe1, 0xae, 0x37, 0xd3, 0xe7, ++ 0xf7, 0xae, 0x76, 0x3b, 0x64, 0xba, 0x8f, 0x6f, 0x5c, 0x3a, 0x35, 0xba, ++ 0x3b, 0xad, 0xff, 0xa2, 0x8f, 0xd4, 0x5f, 0x86, 0xd7, 0x65, 0x69, 0xae, ++ 0x8b, 0xf6, 0x5f, 0xed, 0x31, 0xe1, 0x38, 0x55, 0x6b, 0x4a, 0xc8, 0x67, ++ 0x74, 0xbe, 0x63, 0x60, 0x17, 0xe9, 0xf7, 0x89, 0x16, 0x12, 0x3f, 0x84, ++ 0xae, 0xa7, 0x4c, 0x4b, 0xe2, 0x4d, 0x50, 0x12, 0x72, 0x5a, 0x57, 0x00, ++ 0xfd, 0xef, 0xc2, 0x76, 0xbb, 0x81, 0x38, 0x09, 0xc5, 0x03, 0xfb, 0x9b, ++ 0xd3, 0x76, 0xad, 0xa3, 0x9f, 0x3c, 0xa5, 0x73, 0xa7, 0x14, 0x41, 0x3f, ++ 0x1b, 0xfd, 0x7a, 0x3b, 0x94, 0x3b, 0xd9, 0xfc, 0xe9, 0xf7, 0x16, 0x53, ++ 0x01, 0xf6, 0x67, 0x19, 0x02, 0xdf, 0x1b, 0xc9, 0x4a, 0xf8, 0xae, 0x7d, ++ 0xdd, 0x84, 0xf8, 0x4d, 0x12, 0xf6, 0xeb, 0xd7, 0xd9, 0x42, 0xf3, 0x26, ++ 0x24, 0x98, 0x31, 0x35, 0x97, 0xf5, 0x57, 0x08, 0x70, 0x1a, 0xeb, 0x99, ++ 0x0e, 0xef, 0x13, 0xbb, 0x1e, 0xd7, 0x77, 0x05, 0x5e, 0xc1, 0x7d, 0xf4, ++ 0xe4, 0xcd, 0xce, 0x85, 0xf2, 0x09, 0x36, 0x5f, 0x0d, 0x71, 0x03, 0xbe, ++ 0x24, 0xea, 0x69, 0x89, 0x70, 0x75, 0x67, 0x95, 0x53, 0xbc, 0x59, 0x64, ++ 0x29, 0x76, 0x5b, 0x8a, 0x42, 0x65, 0x62, 0x37, 0xd6, 0xae, 0x86, 0xeb, ++ 0x4e, 0x68, 0xa7, 0xf0, 0xbc, 0x60, 0x71, 0x62, 0x49, 0x76, 0xc7, 0x11, ++ 0x32, 0xb8, 0xf3, 0x7b, 0xa2, 0x14, 0xf0, 0x7f, 0x6b, 0x5a, 0x9b, 0x3e, ++ 0x40, 0xc7, 0x7d, 0xf2, 0xc0, 0xa7, 0x88, 0xb7, 0xd5, 0x80, 0xb7, 0x30, ++ 0xbe, 0xfb, 0x82, 0x1e, 0xd6, 0x21, 0xf0, 0x76, 0x21, 0x7c, 0x42, 0xf7, ++ 0xe1, 0xa9, 0xfd, 0x9f, 0x22, 0xde, 0x2e, 0x6c, 0x96, 0x10, 0x3e, 0xd5, ++ 0xcd, 0xc5, 0xfa, 0x05, 0xb4, 0xbc, 0x5a, 0xe7, 0x24, 0x9f, 0x69, 0x69, ++ 0x9d, 0xe3, 0xdf, 0x53, 0x52, 0x60, 0x31, 0xe0, 0xb5, 0x67, 0x7f, 0x94, ++ 0x65, 0x17, 0x85, 0x53, 0x9b, 0xc0, 0xcf, 0x86, 0x4f, 0x2f, 0xca, 0xf4, ++ 0x79, 0x76, 0x73, 0x8a, 0x5d, 0x82, 0xe7, 0xfb, 0x19, 0x9e, 0x1e, 0xd3, ++ 0x68, 0x3c, 0x00, 0xa7, 0x63, 0x3b, 0xee, 0xd9, 0x5e, 0x2f, 0x85, 0xcf, ++ 0x73, 0x1d, 0xc2, 0x47, 0xaa, 0x20, 0x48, 0x27, 0xd5, 0xb5, 0xc4, 0x6b, ++ 0xa0, 0xed, 0xc5, 0x3f, 0x5f, 0x7d, 0x6a, 0x1c, 0xad, 0x57, 0x55, 0x10, ++ 0x07, 0xd0, 0x79, 0xb5, 0x0a, 0x8f, 0xb2, 0x9e, 0x3f, 0xbf, 0x01, 0xf0, ++ 0xc5, 0x5a, 0x49, 0x0a, 0xa3, 0xec, 0xb0, 0xce, 0x4f, 0x46, 0x77, 0xa7, ++ 0xfd, 0x57, 0x57, 0x92, 0x22, 0xa0, 0xd3, 0xd4, 0x51, 0xce, 0xfd, 0x50, ++ 0x27, 0xcd, 0x12, 0xe9, 0x05, 0xf5, 0x0a, 0xd7, 0x42, 0x18, 0xff, 0xde, ++ 0xf8, 0xa5, 0x0e, 0x99, 0xf6, 0x6f, 0x1d, 0xe5, 0x6a, 0x82, 0xf1, 0xee, ++ 0x8d, 0x1f, 0xee, 0x90, 0x69, 0x7f, 0x4f, 0xa5, 0x37, 0x6e, 0x30, 0xd2, ++ 0x76, 0x4f, 0x19, 0xb1, 0xec, 0x02, 0x38, 0xe8, 0x1a, 0x4a, 0xb4, 0xb4, ++ 0xfe, 0x54, 0x99, 0xdd, 0x42, 0x21, 0x49, 0xe1, 0xb6, 0x33, 0x19, 0xda, ++ 0x49, 0x1f, 0xbd, 0x63, 0x17, 0xe0, 0xb1, 0x7b, 0x61, 0x25, 0xf4, 0x57, ++ 0x9d, 0x3c, 0xd3, 0x01, 0x78, 0xd2, 0x89, 0xfe, 0xf7, 0xaf, 0xeb, 0x03, ++ 0xf3, 0xad, 0xb6, 0x77, 0x73, 0x44, 0xd1, 0xf7, 0xc7, 0x37, 0x4b, 0x88, ++ 0x57, 0xc4, 0x63, 0x22, 0x30, 0xff, 0x6a, 0x0a, 0x5f, 0xa8, 0x8f, 0xf7, ++ 0x0e, 0xf5, 0xc2, 0x7c, 0xae, 0x71, 0xf8, 0x09, 0x38, 0xb6, 0xe9, 0xfc, ++ 0x73, 0x60, 0x7e, 0x6d, 0xaf, 0x1b, 0x88, 0x87, 0xb6, 0x8f, 0x1f, 0xc5, ++ 0xf0, 0xd5, 0x3a, 0xaa, 0x11, 0xf9, 0xc7, 0xdb, 0xfb, 0xc7, 0x9c, 0x90, ++ 0xf2, 0x42, 0x78, 0x69, 0xde, 0x67, 0xf0, 0x41, 0xdd, 0xa6, 0xb5, 0x48, ++ 0x0e, 0xe0, 0x4b, 0xe4, 0x7e, 0x03, 0xcc, 0x67, 0x01, 0x9f, 0x4f, 0x83, ++ 0x8e, 0xcc, 0x75, 0xd1, 0xef, 0xac, 0x63, 0x59, 0x3f, 0x3d, 0x36, 0x4b, ++ 0xc8, 0x2f, 0x7e, 0x0d, 0xf4, 0x94, 0x00, 0xa5, 0x86, 0x97, 0x7a, 0x8e, ++ 0xe7, 0x0d, 0xac, 0xb4, 0x78, 0xf2, 0x5c, 0x14, 0x1f, 0xae, 0xf1, 0xfd, ++ 0x47, 0x34, 0xa1, 0xfd, 0x2e, 0xe7, 0xf8, 0x52, 0xb5, 0xd0, 0x87, 0xf4, ++ 0x54, 0xf9, 0x0a, 0xeb, 0x2f, 0xde, 0xe0, 0xcc, 0x5f, 0x15, 0x86, 0xbf, ++ 0xf1, 0xa5, 0x04, 0xe9, 0x78, 0x77, 0x14, 0x99, 0x5b, 0x4e, 0x9f, 0xef, ++ 0xb6, 0xb2, 0x52, 0x8d, 0xaf, 0xa7, 0x39, 0x5d, 0x67, 0x3d, 0xbf, 0x12, ++ 0xf7, 0x7d, 0x01, 0xdd, 0x77, 0xd8, 0xd7, 0xd4, 0xcd, 0xf4, 0x39, 0xc0, ++ 0x8d, 0xe2, 0x05, 0xc0, 0x8d, 0xee, 0x23, 0xe2, 0xc1, 0xbd, 0xf1, 0x4b, ++ 0x70, 0xdf, 0x16, 0x6c, 0x96, 0x1e, 0xc0, 0x7d, 0xf4, 0x0c, 0x20, 0x50, ++ 0x4f, 0x88, 0x63, 0xeb, 0x54, 0xf7, 0x7f, 0x96, 0xf3, 0xc5, 0xdd, 0x51, ++ 0xae, 0x42, 0x89, 0xf6, 0x17, 0x4c, 0x30, 0x3b, 0x76, 0x48, 0x30, 0x1f, ++ 0xa7, 0x26, 0x0a, 0xea, 0xf9, 0x56, 0xc7, 0x0e, 0x02, 0xdf, 0xbb, 0x76, ++ 0xc2, 0x78, 0x09, 0x49, 0x51, 0x8e, 0xfa, 0x30, 0x7e, 0x45, 0x88, 0xab, ++ 0x50, 0x43, 0xc7, 0xb9, 0x94, 0x68, 0x66, 0xfb, 0xed, 0x7d, 0x5f, 0x3b, ++ 0x39, 0x17, 0xe8, 0xd1, 0x8e, 0xed, 0x09, 0x32, 0xf1, 0x11, 0xe4, 0x3f, ++ 0x24, 0xdb, 0x95, 0x1b, 0xfa, 0xae, 0xac, 0x07, 0xeb, 0xaf, 0x8c, 0xf7, ++ 0x37, 0xa1, 0xc1, 0x93, 0x47, 0xb2, 0x19, 0x3c, 0x10, 0x2e, 0x1c, 0x1e, ++ 0xde, 0x75, 0xdd, 0xa6, 0x87, 0xf3, 0xd3, 0x4f, 0x38, 0x3c, 0xbc, 0x77, ++ 0x91, 0xe9, 0xc0, 0x37, 0x8e, 0xe9, 0x89, 0xc9, 0x08, 0xfd, 0x5b, 0xe8, ++ 0x38, 0xb4, 0xbf, 0xc4, 0x1d, 0x43, 0x5f, 0xd8, 0x84, 0xf3, 0xab, 0xc7, ++ 0x7d, 0x7b, 0xdb, 0x62, 0xc1, 0xb2, 0x2c, 0xce, 0x55, 0x58, 0x0b, 0x2c, ++ 0xb8, 0x87, 0x6b, 0x35, 0xc0, 0x45, 0xac, 0x53, 0x0d, 0x8f, 0x45, 0x1c, ++ 0x1e, 0x6f, 0x4d, 0x9b, 0x93, 0xaf, 0x01, 0x3c, 0x9e, 0x62, 0x72, 0x00, ++ 0xdd, 0x3d, 0x79, 0x40, 0x9a, 0x8f, 0x78, 0xed, 0x31, 0x52, 0xa2, 0x04, ++ 0xbc, 0x67, 0x74, 0x48, 0xe8, 0x7e, 0x00, 0x5d, 0x10, 0xb7, 0x16, 0xf7, ++ 0xa3, 0xba, 0xd6, 0xe5, 0x8d, 0x8c, 0xf7, 0xe5, 0x48, 0x67, 0xd5, 0xf1, ++ 0x51, 0x8e, 0x28, 0x09, 0xf1, 0xde, 0x89, 0xf2, 0xcf, 0x63, 0xf2, 0x32, ++ 0xbc, 0x67, 0xf2, 0x2f, 0x7a, 0x2c, 0x93, 0x57, 0xc0, 0x27, 0xcb, 0x73, ++ 0x3b, 0xf3, 0x03, 0xc1, 0x67, 0x40, 0xbe, 0x01, 0x3e, 0x0b, 0xba, 0xa8, ++ 0x1e, 0x11, 0xc8, 0x81, 0xfd, 0xfd, 0xba, 0x7c, 0xa5, 0x4d, 0xc7, 0xe8, ++ 0xbc, 0x8d, 0xc2, 0x01, 0xe8, 0x48, 0xd0, 0x8d, 0xf9, 0x0d, 0x46, 0x2f, ++ 0x9b, 0xd6, 0xd9, 0x8b, 0xa1, 0x7d, 0x13, 0xa5, 0xfb, 0xf0, 0xfd, 0x3e, ++ 0xae, 0xf7, 0x20, 0xfd, 0x1e, 0xcf, 0xee, 0xe6, 0x80, 0x7e, 0x61, 0x9e, ++ 0x2e, 0x73, 0x88, 0xbf, 0x67, 0x58, 0x5c, 0x36, 0x2b, 0x85, 0x77, 0xb5, ++ 0xc6, 0xb7, 0x41, 0x9b, 0x15, 0xe2, 0xc7, 0xd5, 0x6f, 0x3c, 0x96, 0xe3, ++ 0x8e, 0x80, 0x7f, 0x82, 0x1f, 0x1b, 0xb5, 0x8c, 0xcf, 0x19, 0xbd, 0xd1, ++ 0x5e, 0xd6, 0x2f, 0x1b, 0xcf, 0x48, 0xc1, 0x6d, 0x2e, 0xc0, 0xd2, 0x03, ++ 0xf2, 0x28, 0x7a, 0x0d, 0x83, 0x8f, 0xba, 0x9f, 0x5e, 0x56, 0x21, 0x5f, ++ 0x8d, 0x96, 0x0b, 0x54, 0x8e, 0x4f, 0xa2, 0x9b, 0x14, 0xdb, 0x83, 0x90, ++ 0xb1, 0x1a, 0x77, 0x2f, 0x2b, 0xed, 0xa7, 0xca, 0x18, 0x38, 0x4e, 0x77, ++ 0x96, 0x64, 0xac, 0x09, 0xea, 0x61, 0x1e, 0x89, 0x20, 0xbb, 0x80, 0x7e, ++ 0x76, 0x44, 0x7b, 0x81, 0x6f, 0x25, 0x26, 0x12, 0xf7, 0xde, 0x08, 0xfd, ++ 0x26, 0x59, 0x19, 0x1f, 0x10, 0xfb, 0xd2, 0x60, 0x63, 0x74, 0x94, 0x18, ++ 0xc3, 0xde, 0x2f, 0xb6, 0x32, 0xfe, 0x50, 0x68, 0x65, 0x78, 0x79, 0x2f, ++ 0x2f, 0xc5, 0xfc, 0x05, 0xfe, 0xdb, 0x35, 0xee, 0x4f, 0x89, 0xdc, 0xb5, ++ 0x1c, 0x13, 0xdf, 0xd1, 0x79, 0x61, 0xbb, 0x98, 0x0f, 0xfd, 0x7e, 0x23, ++ 0x61, 0xf2, 0x17, 0xe7, 0x9b, 0xf8, 0x70, 0xce, 0x8e, 0x4d, 0x61, 0xfb, ++ 0x11, 0xa2, 0xa3, 0xbb, 0x0a, 0x60, 0x9f, 0x7a, 0x6c, 0xf6, 0x69, 0xe7, ++ 0x9b, 0x42, 0xe3, 0x08, 0x79, 0xaa, 0xde, 0x7f, 0x98, 0x3f, 0xd0, 0x0f, ++ 0xac, 0xa7, 0xbc, 0x6f, 0xd7, 0xef, 0x35, 0x1c, 0x66, 0xf4, 0xa8, 0xc6, ++ 0xc7, 0x72, 0xce, 0x17, 0x63, 0xad, 0x84, 0xbd, 0xa7, 0xf3, 0xfd, 0x15, ++ 0xe9, 0x6a, 0x85, 0x99, 0xec, 0x80, 0xf9, 0x6d, 0x25, 0xce, 0x38, 0x3a, ++ 0xaf, 0x9a, 0x43, 0xbd, 0x19, 0x3d, 0x38, 0x83, 0x39, 0xd0, 0xff, 0x11, ++ 0x9b, 0xfb, 0x15, 0xd8, 0x8f, 0x81, 0xa3, 0x38, 0x9e, 0xd3, 0xe7, 0x93, ++ 0xe9, 0xf3, 0xe5, 0x5a, 0xe2, 0x31, 0xd0, 0x3d, 0x59, 0xbe, 0x5b, 0xe7, ++ 0x0d, 0x18, 0x19, 0xcd, 0xdc, 0xa2, 0xff, 0x95, 0xd8, 0x58, 0xff, 0xed, ++ 0x66, 0xa3, 0x47, 0xa6, 0x78, 0x7e, 0xc6, 0xe6, 0x76, 0x03, 0x7e, 0x79, ++ 0x4a, 0x88, 0xc3, 0x07, 0x72, 0xe9, 0x07, 0x94, 0x7f, 0x00, 0xfd, 0x11, ++ 0x5f, 0x11, 0xf0, 0x97, 0x1a, 0x12, 0x88, 0x01, 0x38, 0x57, 0xcb, 0xfe, ++ 0x1c, 0x42, 0xf7, 0x7f, 0xb0, 0xc9, 0xbd, 0x08, 0xc6, 0x3b, 0xaf, 0xf1, ++ 0x67, 0xc0, 0x73, 0x42, 0x02, 0x88, 0xaf, 0xe7, 0xa2, 0x62, 0xf2, 0x08, ++ 0xed, 0xaf, 0x49, 0xef, 0x4b, 0xff, 0x3e, 0xcc, 0xfb, 0xa4, 0x4c, 0x76, ++ 0xd0, 0x7e, 0xae, 0x13, 0xe7, 0x78, 0x58, 0xc7, 0x75, 0xbf, 0xc6, 0xe6, ++ 0xa1, 0xeb, 0xf8, 0xb8, 0xf9, 0x77, 0xbf, 0x3a, 0x40, 0xbf, 0x9a, 0x7d, ++ 0xe0, 0xda, 0xec, 0x87, 0x00, 0x4a, 0x9b, 0xa2, 0xe7, 0x3c, 0x4b, 0xcb, ++ 0x59, 0x46, 0x8d, 0x51, 0xdb, 0x3f, 0x04, 0x8f, 0x73, 0xe6, 0xc8, 0xfc, ++ 0xf5, 0x87, 0x1c, 0x7f, 0x12, 0xea, 0x99, 0xde, 0x15, 0x5c, 0x67, 0xf0, ++ 0x02, 0x7c, 0xd4, 0xef, 0x4d, 0xb0, 0xb1, 0xfd, 0xaf, 0xb9, 0x91, 0x4a, ++ 0x3c, 0x71, 0xe1, 0xcf, 0x19, 0x1f, 0xad, 0xd1, 0x06, 0xf5, 0xa0, 0x42, ++ 0xd6, 0xdc, 0xc8, 0x20, 0x1e, 0x3a, 0xee, 0xc7, 0x1a, 0x52, 0xd1, 0x18, ++ 0x41, 0xcf, 0x0c, 0x58, 0x19, 0xff, 0x6a, 0xa2, 0xa8, 0x1f, 0xa9, 0xfd, ++ 0x73, 0x8e, 0x67, 0xbb, 0x75, 0x24, 0x67, 0x2b, 0xcc, 0x67, 0x3b, 0xe5, ++ 0x83, 0x00, 0x3f, 0xad, 0x1d, 0xf9, 0x45, 0xc5, 0x4f, 0xb3, 0x1c, 0x9b, ++ 0x68, 0xb5, 0x29, 0x3b, 0x78, 0x1c, 0xf4, 0x88, 0xe0, 0xcf, 0x24, 0xe4, ++ 0xff, 0xe7, 0x74, 0x8c, 0xef, 0xd0, 0xbf, 0x29, 0xc6, 0x01, 0x21, 0xf9, ++ 0x09, 0xea, 0x09, 0xe8, 0x87, 0x15, 0x16, 0x8f, 0x4f, 0x43, 0xf9, 0x46, ++ 0xc5, 0x6a, 0xb3, 0x4f, 0xce, 0xc3, 0xe7, 0xda, 0x61, 0xb0, 0x77, 0x1e, ++ 0x8b, 0x16, 0xf8, 0xe0, 0x7c, 0x2e, 0x17, 0x17, 0xd4, 0xbe, 0xfd, 0x77, ++ 0x29, 0x86, 0xb6, 0x6b, 0x89, 0x71, 0x18, 0xfd, 0xee, 0x0b, 0xd3, 0xc2, ++ 0x18, 0x10, 0x0b, 0x8b, 0xbf, 0xbb, 0x2a, 0x11, 0x94, 0xef, 0xa4, 0x59, ++ 0x0d, 0x48, 0x9f, 0x84, 0x8c, 0xb2, 0x80, 0x3e, 0x2e, 0x39, 0x27, 0xc8, ++ 0xb7, 0xa2, 0x6f, 0xa7, 0xcf, 0x69, 0x51, 0x6f, 0x47, 0x7c, 0xa1, 0xfb, ++ 0xeb, 0xb2, 0xb9, 0x5e, 0x80, 0xfd, 0x9e, 0x15, 0xcb, 0xe0, 0x3d, 0x6b, ++ 0x55, 0xb4, 0xd7, 0x13, 0xc6, 0xff, 0xa6, 0x71, 0xf8, 0xa8, 0xf1, 0x6c, ++ 0x37, 0xe0, 0x28, 0x9d, 0xef, 0x27, 0x12, 0x93, 0x2b, 0xea, 0x71, 0x5e, ++ 0xb5, 0x95, 0xdc, 0x07, 0x78, 0x97, 0x14, 0xe3, 0xfa, 0x35, 0xf6, 0xbf, ++ 0xea, 0x9a, 0x82, 0x9f, 0xb5, 0x49, 0x81, 0x17, 0x9f, 0x05, 0x7c, 0x5c, ++ 0x61, 0x76, 0xec, 0x62, 0xdd, 0x66, 0xb8, 0xc2, 0xe8, 0xe5, 0x1d, 0x31, ++ 0xee, 0x0d, 0x0d, 0xee, 0x5f, 0x7b, 0xbe, 0x3f, 0x67, 0x4d, 0x16, 0xe0, ++ 0x7d, 0x30, 0xe3, 0xf7, 0x14, 0xce, 0xcb, 0x5b, 0x0c, 0x16, 0x8f, 0x1d, ++ 0xda, 0xf5, 0x8a, 0xfd, 0x3f, 0x5f, 0x47, 0x19, 0x5f, 0x4e, 0xa8, 0x3e, ++ 0xff, 0x52, 0xcf, 0xd1, 0xc4, 0x04, 0xf0, 0x77, 0x6c, 0x00, 0x7c, 0x58, ++ 0xb0, 0x31, 0x9a, 0x78, 0xfa, 0x84, 0xd6, 0x01, 0x0a, 0x37, 0xe0, 0x77, ++ 0xf5, 0x0d, 0x82, 0xfd, 0xcc, 0x6f, 0x79, 0xfb, 0x2c, 0xf0, 0xf3, 0x6a, ++ 0x6d, 0x00, 0xf1, 0x67, 0xbe, 0xd1, 0x84, 0xfb, 0x53, 0x7d, 0x43, 0x8b, ++ 0xf3, 0x20, 0x1b, 0x75, 0xad, 0x01, 0xf1, 0x3d, 0x95, 0xbf, 0xfd, 0x62, ++ 0x9c, 0x27, 0x91, 0xbe, 0x1e, 0x1d, 0x66, 0xbd, 0x78, 0x0f, 0x7d, 0x98, ++ 0x44, 0x9f, 0xe3, 0xfa, 0xdd, 0xef, 0xc3, 0xba, 0x9f, 0x8e, 0x8e, 0x21, ++ 0x4e, 0x46, 0x2f, 0xde, 0xde, 0x74, 0xfe, 0xd7, 0x8d, 0xf6, 0x58, 0x1b, ++ 0x85, 0x57, 0x8d, 0x9e, 0xe2, 0x47, 0x3f, 0xec, 0xc6, 0x65, 0x0c, 0xd3, ++ 0xaf, 0x48, 0x9a, 0x59, 0xb9, 0xff, 0x2d, 0x27, 0xff, 0x0e, 0xf3, 0x59, ++ 0x68, 0x74, 0xeb, 0x41, 0xde, 0x2f, 0x9a, 0x5e, 0xab, 0x07, 0xba, 0x9c, ++ 0x15, 0xeb, 0x2b, 0xb2, 0xf4, 0x0d, 0xdf, 0xf7, 0x61, 0xf2, 0xad, 0x7b, ++ 0xbe, 0xfe, 0xbe, 0x37, 0x71, 0x3e, 0xf4, 0xb1, 0x9e, 0xd2, 0x45, 0x04, ++ 0x3a, 0xfc, 0x9c, 0xc3, 0x7f, 0x02, 0xe0, 0x24, 0x5d, 0xdf, 0xc7, 0xa9, ++ 0x8c, 0x7e, 0x3e, 0xce, 0x20, 0x15, 0x7b, 0xa1, 0xbc, 0x9b, 0x96, 0xf4, ++ 0xbb, 0x8f, 0xb3, 0x79, 0xbd, 0x80, 0xd5, 0xd5, 0xfd, 0x44, 0xd9, 0x18, ++ 0x3d, 0x7f, 0x9c, 0xc7, 0xe4, 0x95, 0x67, 0x25, 0x93, 0x1f, 0xea, 0xf7, ++ 0xfe, 0xc1, 0xc7, 0x73, 0xd9, 0x9c, 0x5f, 0x02, 0x3c, 0xc5, 0x73, 0xa7, ++ 0x8d, 0x3d, 0x7f, 0xd5, 0xe6, 0xfc, 0x0a, 0x9e, 0x53, 0x7e, 0xf8, 0x5f, ++ 0x1c, 0x5f, 0x7d, 0x56, 0xda, 0xdf, 0xac, 0x37, 0x0d, 0x88, 0xaf, 0x64, ++ 0x7d, 0x30, 0x07, 0xf6, 0xb1, 0x63, 0x5d, 0x39, 0x7c, 0xbe, 0x89, 0x91, ++ 0xe7, 0x95, 0x61, 0x63, 0xfc, 0x98, 0xf6, 0x2b, 0xd9, 0x8a, 0xf0, 0x3d, ++ 0x27, 0xea, 0xed, 0x87, 0xa2, 0xbc, 0x60, 0x87, 0x90, 0x09, 0x94, 0x3f, ++ 0x03, 0x3f, 0x5e, 0x99, 0x4e, 0x80, 0x1f, 0xd3, 0x71, 0xa3, 0x6c, 0xac, ++ 0x5f, 0x9f, 0x15, 0xdf, 0x33, 0xe0, 0x3a, 0xc8, 0x46, 0xca, 0xa7, 0x29, ++ 0xde, 0xb6, 0x17, 0xd9, 0x71, 0x5f, 0x36, 0x15, 0x53, 0xfc, 0x04, 0x3e, ++ 0x71, 0xd0, 0x60, 0x01, 0x3e, 0x21, 0xf0, 0x49, 0xe0, 0x91, 0x1a, 0x7f, ++ 0x12, 0x6d, 0x42, 0xfe, 0x31, 0x39, 0x7c, 0x1f, 0xc8, 0x61, 0x19, 0xe5, ++ 0x70, 0xa2, 0x8d, 0xc9, 0x61, 0x3d, 0xd0, 0x39, 0xed, 0x51, 0xcf, 0xf4, ++ 0xc1, 0x9e, 0xb8, 0xdf, 0x88, 0x67, 0xf2, 0xd7, 0xdf, 0xef, 0x3d, 0x46, ++ 0xb6, 0x8f, 0x94, 0xde, 0xed, 0x36, 0x94, 0xfb, 0xbe, 0xdc, 0x70, 0x7a, ++ 0x13, 0x70, 0x16, 0x7c, 0xf2, 0xe3, 0x6e, 0x4a, 0xbc, 0xd8, 0xcd, 0xf9, ++ 0x60, 0x1f, 0x0e, 0xb7, 0x0e, 0x38, 0xdb, 0xd8, 0x7b, 0xf1, 0x3d, 0x98, ++ 0xdc, 0x13, 0xf6, 0xc1, 0x20, 0xbe, 0xae, 0x57, 0x38, 0x3f, 0x17, 0xa5, ++ 0x90, 0x63, 0x03, 0xc7, 0x2a, 0xf5, 0x92, 0x57, 0xb8, 0x5e, 0xf0, 0x8a, ++ 0x35, 0x46, 0xec, 0x4b, 0x21, 0xac, 0x5f, 0xc8, 0xbf, 0x4e, 0xfb, 0xfd, ++ 0x1c, 0xdb, 0x6f, 0xfa, 0xde, 0x60, 0x58, 0xcf, 0x2c, 0x43, 0x70, 0x4e, ++ 0x1c, 0x95, 0x5f, 0xdf, 0xa1, 0x7a, 0x91, 0xbe, 0x00, 0xbf, 0x6b, 0x82, ++ 0xef, 0x3a, 0xf9, 0x29, 0x46, 0x31, 0xb9, 0x5b, 0xb3, 0xd2, 0x4c, 0x40, ++ 0x2f, 0x28, 0xb5, 0x59, 0x18, 0xfc, 0x0b, 0x83, 0x19, 0xd0, 0x1f, 0xe9, ++ 0x13, 0x44, 0x3e, 0x34, 0x9f, 0x50, 0x7e, 0x23, 0xdd, 0x79, 0xff, 0xc0, ++ 0x27, 0x90, 0x42, 0x69, 0x64, 0x69, 0x0c, 0x93, 0x3b, 0x92, 0x4c, 0x07, ++ 0x04, 0x9a, 0xe9, 0x43, 0xec, 0xd0, 0x1f, 0x85, 0xf7, 0x24, 0x5b, 0x51, ++ 0x08, 0xde, 0xea, 0xf1, 0xce, 0x41, 0x13, 0xd5, 0x03, 0xa7, 0xdb, 0x24, ++ 0x2d, 0xee, 0x57, 0x3e, 0xc9, 0x87, 0xfd, 0x9a, 0xf3, 0xc1, 0x97, 0xe6, ++ 0xd9, 0xb4, 0xcb, 0x6b, 0x16, 0xa3, 0x47, 0x43, 0xe5, 0xc8, 0x77, 0x35, ++ 0xee, 0x59, 0xd0, 0x4f, 0xeb, 0x83, 0x27, 0x51, 0xef, 0x3f, 0xa7, 0xf7, ++ 0xe5, 0x34, 0x98, 0x22, 0xb4, 0xeb, 0x7d, 0xcf, 0x3f, 0x2d, 0x85, 0xda, ++ 0xe7, 0xbe, 0x24, 0x7b, 0xf4, 0x94, 0xcf, 0x34, 0xf9, 0x5b, 0x7f, 0x36, ++ 0x8d, 0xe2, 0xe5, 0x7c, 0xbf, 0xec, 0x80, 0x21, 0xe7, 0xaf, 0xfd, 0xeb, ++ 0x7b, 0x03, 0x41, 0x9f, 0xf6, 0xeb, 0x1c, 0x60, 0xd7, 0x52, 0x7d, 0x62, ++ 0xb3, 0x16, 0xe6, 0x5d, 0xcb, 0xf4, 0xcf, 0x73, 0x1a, 0xe5, 0xfe, 0x5f, ++ 0xfd, 0x1e, 0xdb, 0x5f, 0x51, 0x7f, 0x90, 0xe3, 0x0b, 0xd5, 0xb3, 0xb4, ++ 0x64, 0x40, 0x88, 0x5f, 0x09, 0x3d, 0x61, 0x29, 0xf1, 0xf5, 0x02, 0x7d, ++ 0x62, 0x01, 0x71, 0xea, 0xa1, 0x3c, 0xbf, 0x62, 0xc9, 0x04, 0x42, 0xe1, ++ 0xb7, 0xc8, 0xb4, 0x1a, 0xf9, 0xd8, 0xe5, 0x95, 0xe3, 0x50, 0x7f, 0x5e, ++ 0x4c, 0x3c, 0xd8, 0xbe, 0x60, 0xa3, 0xee, 0x7c, 0xb8, 0x7c, 0x59, 0xd4, ++ 0xa0, 0xac, 0x2f, 0xd9, 0xaa, 0xac, 0x2f, 0xf5, 0x2a, 0xeb, 0x42, 0xff, ++ 0x4a, 0x28, 0x8d, 0xac, 0x57, 0xbc, 0xc8, 0xf9, 0xd0, 0x55, 0x2a, 0x2e, ++ 0x6e, 0xa7, 0x57, 0x6c, 0xe1, 0x78, 0x5b, 0xfa, 0xe8, 0x84, 0xa7, 0x91, ++ 0xfe, 0xfd, 0x3a, 0x62, 0xa0, 0xef, 0xad, 0x3e, 0x58, 0x9c, 0x44, 0x22, ++ 0xf4, 0x2b, 0xca, 0x9a, 0x1b, 0xd9, 0xc4, 0x1b, 0x26, 0x87, 0x42, 0xfa, ++ 0x47, 0x0e, 0xf1, 0xf6, 0x87, 0xfe, 0x6e, 0xa2, 0x3f, 0xf0, 0x79, 0xae, ++ 0x9f, 0x40, 0x7f, 0x60, 0xef, 0xae, 0x8e, 0x72, 0x26, 0x81, 0x5d, 0x72, ++ 0xb5, 0x24, 0xf2, 0xbc, 0xb7, 0xf1, 0x79, 0xd7, 0xdc, 0xe8, 0xa6, 0xe8, ++ 0xff, 0xf9, 0x4e, 0x7a, 0x4e, 0x0c, 0x8e, 0x53, 0x73, 0xc3, 0x88, 0x65, ++ 0xe7, 0x79, 0x98, 0xf0, 0xfb, 0xab, 0x8b, 0x23, 0x8f, 0xb3, 0xbb, 0x43, ++ 0x9f, 0xb2, 0x28, 0xe4, 0x69, 0xe8, 0xfb, 0x78, 0x26, 0xff, 0xb8, 0x3d, ++ 0x2f, 0xf0, 0xa1, 0xe6, 0x46, 0x32, 0x3e, 0x17, 0x75, 0xa1, 0x67, 0x87, ++ 0xbe, 0x4b, 0xc3, 0xfe, 0xa8, 0x60, 0xb3, 0x5c, 0x8c, 0x0e, 0xf1, 0x23, ++ 0x5d, 0x37, 0x36, 0x0f, 0x81, 0xff, 0x9f, 0x49, 0xc4, 0x98, 0x82, 0xfe, ++ 0xb1, 0x2d, 0xdc, 0x2e, 0x71, 0xe4, 0x81, 0x9e, 0xfb, 0x19, 0xe8, 0x51, ++ 0x40, 0x7f, 0x63, 0xec, 0x87, 0x02, 0x74, 0x8a, 0x0b, 0x1e, 0x1a, 0x9c, ++ 0xa3, 0xcd, 0x0e, 0xd1, 0x87, 0x7a, 0x1d, 0x14, 0x8f, 0xae, 0x04, 0xc2, ++ 0xe4, 0xfb, 0x21, 0x9b, 0x39, 0x1e, 0xe5, 0xb2, 0x83, 0x38, 0x60, 0x5c, ++ 0x81, 0xdf, 0x73, 0x1e, 0x2c, 0x8b, 0x75, 0xd3, 0xf9, 0xfe, 0x69, 0x6d, ++ 0x69, 0x92, 0xbb, 0x6f, 0x38, 0xdf, 0xf4, 0xe0, 0xf8, 0xd5, 0x7a, 0xa1, ++ 0xbf, 0x99, 0x14, 0xf2, 0x98, 0xa8, 0xe4, 0xf5, 0x82, 0xe6, 0x93, 0xa8, ++ 0x9f, 0x2d, 0x34, 0xba, 0x72, 0x80, 0xc9, 0x7c, 0x7e, 0xf0, 0x41, 0xc4, ++ 0xef, 0xc5, 0xc4, 0x95, 0x08, 0x78, 0xdd, 0x7e, 0xb0, 0x77, 0x86, 0xfb, ++ 0x7f, 0x21, 0xa7, 0xc5, 0x7c, 0xee, 0xf7, 0xcc, 0xd3, 0x31, 0x7d, 0x9c, ++ 0x12, 0x2d, 0xa5, 0xb7, 0xc9, 0x7c, 0x3e, 0xf7, 0xb7, 0x30, 0xfd, 0x50, ++ 0x63, 0x74, 0xea, 0x70, 0x1c, 0x27, 0xb1, 0x5b, 0x12, 0xd1, 0xe4, 0x66, ++ 0xf3, 0xa5, 0xcc, 0x52, 0x4b, 0xeb, 0xc3, 0x3b, 0xe6, 0x0f, 0xce, 0x43, ++ 0x42, 0x86, 0xf1, 0xf9, 0x4b, 0xf0, 0x3d, 0x85, 0xef, 0x70, 0x5e, 0x92, ++ 0xf9, 0xee, 0x64, 0x98, 0xb7, 0x01, 0xc6, 0xa5, 0xe3, 0x45, 0x11, 0x6f, ++ 0x32, 0x94, 0xf5, 0x83, 0x1d, 0x76, 0x28, 0x47, 0x4a, 0x2e, 0x2d, 0x9b, ++ 0x07, 0xdb, 0xe7, 0xd1, 0xa4, 0x36, 0x0d, 0xde, 0xd7, 0x18, 0x03, 0x32, ++ 0x5b, 0x27, 0x9d, 0x41, 0x22, 0x7c, 0xdf, 0x01, 0x2f, 0xac, 0x9b, 0x79, ++ 0x7d, 0xfd, 0x94, 0xeb, 0x73, 0x16, 0xc1, 0x73, 0x93, 0x19, 0xf9, 0x86, ++ 0x9e, 0xcf, 0xe3, 0x16, 0xf0, 0x3f, 0x23, 0xf2, 0x13, 0x23, 0xac, 0xdb, ++ 0x60, 0xf2, 0x5d, 0x86, 0x75, 0x99, 0x79, 0xe9, 0x29, 0x61, 0xfa, 0xb6, ++ 0x27, 0x9b, 0x38, 0xea, 0xe9, 0x6b, 0xdd, 0x48, 0x23, 0x81, 0x71, 0x4d, ++ 0xa6, 0x6b, 0x1e, 0x58, 0xac, 0x85, 0x58, 0x24, 0xa8, 0x47, 0x59, 0xae, ++ 0xfb, 0xc0, 0xee, 0xb8, 0x66, 0x31, 0x79, 0x34, 0xfd, 0x90, 0x2f, 0xca, ++ 0x71, 0x14, 0x7e, 0xad, 0xd2, 0xbb, 0x8b, 0x61, 0x5f, 0x28, 0x1f, 0x66, ++ 0x7e, 0xa8, 0xae, 0xda, 0xb5, 0x3e, 0xb4, 0x77, 0x04, 0x5f, 0xb3, 0xf1, ++ 0xf9, 0xd5, 0x73, 0xbe, 0x96, 0x42, 0x18, 0x1c, 0xe2, 0x89, 0xeb, 0xb0, ++ 0x93, 0xf2, 0x85, 0x9f, 0x98, 0x17, 0x4f, 0x20, 0x31, 0x20, 0x8e, 0xdd, ++ 0x38, 0xfe, 0x33, 0x31, 0x63, 0x4f, 0xc0, 0x7c, 0x01, 0xf0, 0x28, 0xaf, ++ 0xc7, 0x6a, 0xcf, 0x87, 0xcb, 0x8b, 0x04, 0x97, 0x56, 0xc1, 0xb7, 0x92, ++ 0xa6, 0x2b, 0xeb, 0x29, 0x6e, 0x65, 0xdd, 0x48, 0xce, 0x59, 0x00, 0x7f, ++ 0x25, 0x9f, 0x2b, 0xf9, 0x56, 0x1c, 0xda, 0x71, 0x7d, 0xc0, 0x2f, 0xa3, ++ 0xe3, 0xfc, 0x62, 0x4a, 0x37, 0x36, 0x2f, 0x81, 0x3f, 0xd9, 0x71, 0x1a, ++ 0x85, 0x3e, 0xe1, 0xe2, 0x76, 0x7d, 0xb5, 0x4d, 0x4f, 0xd0, 0x1f, 0x98, ++ 0x68, 0x34, 0x92, 0x7e, 0xa8, 0x5f, 0x64, 0xc7, 0x31, 0xfd, 0xe2, 0x13, ++ 0xba, 0xd3, 0xd4, 0xfe, 0x0b, 0x22, 0x1f, 0xce, 0x1f, 0xe9, 0xec, 0xf5, ++ 0x33, 0x0a, 0xe7, 0x0d, 0x1f, 0xc8, 0x8e, 0x87, 0xe9, 0x3e, 0x6d, 0x30, ++ 0xdb, 0xd7, 0x69, 0x41, 0x6f, 0x9b, 0x21, 0x31, 0x3d, 0x5d, 0xdb, 0xe8, ++ 0x03, 0x3f, 0xcf, 0xf6, 0x39, 0x56, 0xc7, 0x26, 0x68, 0x8f, 0x72, 0xfe, ++ 0xf8, 0xbf, 0xa1, 0xfd, 0x03, 0x99, 0x80, 0xde, 0x54, 0x03, 0xfe, 0x75, ++ 0xa4, 0x77, 0x4b, 0x31, 0x7c, 0xb7, 0x3d, 0xc3, 0x82, 0xef, 0xc5, 0x97, ++ 0x06, 0xd1, 0x2f, 0x1a, 0x7c, 0x8c, 0xa0, 0x5e, 0xd4, 0x09, 0x4f, 0x6f, ++ 0xd2, 0xf9, 0x53, 0x78, 0xbf, 0x00, 0x75, 0x0a, 0xdf, 0x9a, 0x85, 0x96, ++ 0xe5, 0xaf, 0xd0, 0xf7, 0x53, 0x5c, 0xd1, 0x0e, 0x29, 0xac, 0x7d, 0x27, ++ 0xb4, 0xd3, 0x79, 0x4a, 0x1c, 0x2f, 0xe0, 0xf9, 0xc8, 0x01, 0x60, 0xc7, ++ 0xb2, 0xbf, 0x1e, 0x2d, 0xf9, 0x7e, 0x27, 0xf8, 0x29, 0x9c, 0x32, 0xca, ++ 0xb5, 0x9a, 0x96, 0xfc, 0x23, 0x26, 0x3a, 0x8f, 0x1e, 0xee, 0x7c, 0x07, ++ 0xa0, 0x6d, 0xcf, 0x16, 0x1e, 0x47, 0x89, 0x37, 0x78, 0x59, 0x1c, 0x81, ++ 0x52, 0x2d, 0x9d, 0xc7, 0x54, 0x23, 0x9b, 0x47, 0x4d, 0x4b, 0xf1, 0x7d, ++ 0x45, 0xb4, 0xbd, 0xa7, 0xbf, 0x3f, 0x81, 0x78, 0x42, 0xf4, 0x09, 0xfb, ++ 0xcc, 0x4a, 0x68, 0xd2, 0x50, 0xfb, 0x19, 0xbe, 0x2b, 0x89, 0x46, 0xff, ++ 0xd5, 0x69, 0xee, 0x47, 0x22, 0x9c, 0x1f, 0x0c, 0x54, 0xd1, 0xdb, 0xd0, ++ 0x10, 0xfe, 0x63, 0x7b, 0xbe, 0xa8, 0x53, 0xf1, 0xef, 0x1c, 0xc0, 0xdc, ++ 0x13, 0x58, 0x8f, 0x67, 0x74, 0xe0, 0x20, 0xe2, 0x8f, 0xd1, 0xe7, 0x10, ++ 0x12, 0xfa, 0x83, 0xef, 0x4b, 0x43, 0xfd, 0x21, 0x3f, 0x1a, 0x15, 0x6a, ++ 0x0e, 0xd1, 0x1b, 0x5d, 0x5a, 0x81, 0xd1, 0x51, 0x5f, 0x49, 0xdf, 0x3b, ++ 0x56, 0x3e, 0x06, 0xf1, 0xb0, 0x06, 0xec, 0x27, 0xba, 0x1f, 0x03, 0xb5, ++ 0xbe, 0xc3, 0x40, 0xdf, 0x43, 0x79, 0x99, 0xcf, 0x4b, 0x32, 0xbf, 0x01, ++ 0xe1, 0xb9, 0x69, 0x9d, 0x53, 0x06, 0xb8, 0x17, 0x11, 0xb7, 0xbc, 0x85, ++ 0xd6, 0x07, 0x19, 0xfd, 0x71, 0x40, 0x0f, 0xc3, 0x8c, 0x81, 0x75, 0x09, ++ 0xb4, 0xbf, 0xc1, 0xd3, 0xe7, 0x25, 0x43, 0xfd, 0x20, 0x28, 0x59, 0x45, ++ 0xa8, 0x67, 0x79, 0xc0, 0x3f, 0x6f, 0x35, 0x69, 0xbc, 0xeb, 0x70, 0x13, ++ 0xf3, 0x1d, 0x40, 0x37, 0xd3, 0xa6, 0x33, 0x3f, 0xeb, 0xd4, 0xe9, 0x46, ++ 0x2f, 0xf8, 0xed, 0xa7, 0x6a, 0x09, 0x8b, 0x6f, 0x69, 0xdd, 0x59, 0xdf, ++ 0xa1, 0xed, 0xdf, 0x99, 0xc5, 0xfc, 0xbb, 0x50, 0x9f, 0x15, 0xe6, 0x3f, ++ 0x11, 0xf1, 0x8c, 0xd3, 0xd4, 0x1e, 0xd9, 0x13, 0xc1, 0x9e, 0x3c, 0x18, ++ 0xc7, 0xe4, 0x93, 0xf8, 0xbe, 0x66, 0xbd, 0x5e, 0x11, 0x37, 0xda, 0x1f, ++ 0x67, 0xc2, 0xf6, 0xff, 0x88, 0x1b, 0xbd, 0x36, 0x0e, 0xf1, 0xdf, 0x9d, ++ 0x05, 0xf4, 0xf7, 0x70, 0x1c, 0xd7, 0xab, 0xfa, 0x90, 0x3e, 0xc0, 0x57, ++ 0xc2, 0xe8, 0x7e, 0x03, 0xbc, 0xd7, 0x5a, 0xfc, 0x4e, 0x57, 0x7c, 0x41, ++ 0xd9, 0xce, 0xf9, 0xc2, 0x54, 0xe7, 0x4f, 0x75, 0xa8, 0x8f, 0x73, 0xfe, ++ 0x20, 0xf8, 0xb0, 0x0b, 0xe8, 0x90, 0x7e, 0xe7, 0x97, 0x9c, 0x3a, 0x80, ++ 0xe7, 0x47, 0x25, 0x0c, 0xfe, 0xa7, 0x8a, 0x97, 0x22, 0x7f, 0x98, 0x46, ++ 0xdc, 0xf8, 0x9c, 0x22, 0x88, 0xce, 0x15, 0xee, 0x37, 0x1a, 0x1b, 0xa6, ++ 0xc7, 0xd0, 0x71, 0xa6, 0xba, 0x94, 0x7a, 0xcd, 0xb4, 0xe9, 0x6a, 0x3d, ++ 0x87, 0xe1, 0xab, 0x18, 0x77, 0x86, 0x5b, 0xd9, 0x3e, 0x59, 0xe8, 0xa9, ++ 0x63, 0x95, 0x7a, 0xea, 0xac, 0xef, 0xdf, 0xb4, 0xa2, 0xfc, 0x4d, 0x7a, ++ 0xb1, 0xea, 0x56, 0x26, 0xc6, 0x49, 0xd0, 0xde, 0xaf, 0xa1, 0xfb, 0xc4, ++ 0xe2, 0x24, 0x5a, 0x16, 0x37, 0x59, 0xaf, 0xf7, 0x82, 0xbe, 0x53, 0xd3, ++ 0xbc, 0xe2, 0x58, 0x02, 0xd0, 0xd1, 0x5a, 0xc2, 0xe9, 0x68, 0x8f, 0xb4, ++ 0x10, 0xe3, 0x38, 0x7b, 0xa4, 0x45, 0x61, 0xfa, 0x43, 0xf7, 0x4a, 0xaf, ++ 0x04, 0x7c, 0xbf, 0x37, 0x5d, 0x93, 0x1f, 0xf7, 0x35, 0x88, 0xf1, 0xa1, ++ 0xd3, 0x3a, 0xef, 0x61, 0x88, 0x9b, 0x9c, 0x5e, 0x4a, 0x57, 0x4c, 0xe7, ++ 0x79, 0x44, 0xcf, 0xe2, 0x8f, 0x47, 0xa3, 0x88, 0x07, 0xfc, 0xcf, 0x02, ++ 0x3f, 0xcd, 0x93, 0x99, 0xff, 0x94, 0xa2, 0x31, 0xc6, 0x41, 0xd2, 0x2c, ++ 0xd1, 0x0e, 0xd0, 0xcb, 0x37, 0x6a, 0x0a, 0xd0, 0xdf, 0xba, 0x31, 0xc6, ++ 0xec, 0x08, 0xf7, 0x6f, 0x6e, 0x5a, 0xe7, 0x2e, 0x0b, 0xf7, 0xb3, 0xda, ++ 0x0d, 0xa4, 0xc0, 0xc2, 0xf1, 0x26, 0x92, 0x1d, 0x7b, 0x8c, 0xf3, 0xc3, ++ 0xa7, 0x24, 0xe6, 0xef, 0xf6, 0xcc, 0x30, 0xa2, 0xdd, 0x96, 0xd0, 0xc3, ++ 0xa5, 0x88, 0x2f, 0x24, 0xc8, 0xe4, 0x2c, 0xf8, 0x0d, 0xd7, 0xc6, 0xd9, ++ 0x51, 0xde, 0x3e, 0xc5, 0xfd, 0x1a, 0x10, 0x9f, 0xeb, 0x4f, 0x4b, 0xaf, ++ 0x44, 0x05, 0x62, 0x7c, 0xd8, 0xf7, 0x32, 0x59, 0x8f, 0x7e, 0x46, 0x15, ++ 0xff, 0x49, 0x88, 0x73, 0xa0, 0x7f, 0x3f, 0x21, 0x36, 0x17, 0xfd, 0xf4, ++ 0xd3, 0x5b, 0xf2, 0x77, 0x22, 0xbf, 0x31, 0x45, 0x39, 0x7a, 0x49, 0xa1, ++ 0xfe, 0xa7, 0xbb, 0xb7, 0x6b, 0x17, 0x81, 0xfe, 0xd4, 0xb2, 0x5d, 0xbb, ++ 0xd0, 0x14, 0xc2, 0xbb, 0xb3, 0x02, 0x5f, 0xa3, 0x49, 0x34, 0xe0, 0x6b, ++ 0x87, 0xdf, 0x6e, 0xaf, 0x01, 0xfd, 0x76, 0xdf, 0xd5, 0xb8, 0xce, 0x01, ++ 0x5e, 0x56, 0xea, 0x7d, 0x79, 0x44, 0x89, 0xcf, 0xf8, 0xbc, 0x2b, 0x39, ++ 0xb6, 0x84, 0xe3, 0x8b, 0xae, 0xc4, 0x35, 0x63, 0x11, 0x9d, 0x4f, 0xfb, ++ 0x7b, 0x7a, 0xe6, 0xc7, 0x5a, 0x4b, 0x90, 0x5e, 0x5f, 0xdb, 0x6f, 0x45, ++ 0xbf, 0xa3, 0x76, 0x32, 0x41, 0x79, 0xb2, 0xbe, 0x98, 0x20, 0x3e, 0xb4, ++ 0x6f, 0x97, 0x50, 0x4f, 0xfe, 0xc2, 0x5a, 0x81, 0xfa, 0xfb, 0x7a, 0xa9, ++ 0x01, 0xe5, 0x44, 0x9b, 0x6d, 0x34, 0xee, 0xdf, 0x32, 0xd3, 0x51, 0xb4, ++ 0x4f, 0x2b, 0x9e, 0xd3, 0x9d, 0x0f, 0xd7, 0xbb, 0x96, 0xed, 0x54, 0xd6, ++ 0x97, 0x13, 0x3f, 0xda, 0xc7, 0x95, 0xaf, 0x74, 0xc2, 0x67, 0xe4, 0x5f, ++ 0x82, 0x3f, 0x56, 0x37, 0x29, 0xbf, 0x23, 0x3d, 0x95, 0xfc, 0x31, 0x9f, ++ 0xf3, 0xfd, 0x02, 0x97, 0xe3, 0xfe, 0x32, 0x98, 0xfa, 0x74, 0x47, 0x0f, ++ 0x66, 0x1f, 0x13, 0x9f, 0x81, 0xae, 0xa3, 0xe8, 0x5d, 0x3d, 0xf7, 0xf7, ++ 0xce, 0x62, 0x72, 0x93, 0xbc, 0x28, 0x81, 0xbe, 0xd5, 0x6e, 0xbe, 0x24, ++ 0x33, 0x3a, 0x67, 0xfc, 0xb8, 0x88, 0xf7, 0xa7, 0x96, 0x43, 0x45, 0x5c, ++ 0x9f, 0x1a, 0x41, 0xf9, 0x16, 0xd8, 0x91, 0x42, 0x3f, 0xa2, 0xef, 0x63, ++ 0xfd, 0xa8, 0xa6, 0x45, 0x4e, 0xd6, 0x84, 0xe6, 0x55, 0xc8, 0xbf, 0x13, ++ 0x7a, 0x99, 0xe0, 0xdb, 0x62, 0x5f, 0x8a, 0x07, 0x81, 0x2d, 0x4c, 0x48, ++ 0x46, 0x3c, 0xd7, 0x6f, 0xb2, 0x49, 0x36, 0xec, 0x2b, 0xed, 0x1f, 0xe9, ++ 0x81, 0x8e, 0xeb, 0xd1, 0xdb, 0xb0, 0x7f, 0x0f, 0xd8, 0x5f, 0x43, 0xf9, ++ 0x78, 0x74, 0xdf, 0x3d, 0x20, 0x67, 0x3d, 0x1a, 0xa3, 0x17, 0xf0, 0x68, ++ 0x83, 0x54, 0x8b, 0x7c, 0xda, 0x48, 0x38, 0xbf, 0x96, 0xdc, 0xf5, 0xf0, ++ 0xf1, 0x6f, 0x3c, 0x1e, 0xe4, 0xdb, 0x83, 0x49, 0xed, 0xfd, 0x13, 0xb2, ++ 0x80, 0x5f, 0xfb, 0xa3, 0x01, 0x1e, 0x14, 0x1f, 0xb2, 0xe3, 0xc3, 0xf0, ++ 0xa4, 0x9e, 0xf8, 0x32, 0xf6, 0x48, 0x0a, 0x7c, 0xc1, 0xf6, 0x56, 0xeb, ++ 0x3b, 0x11, 0xf1, 0x45, 0xc8, 0x17, 0xdf, 0x47, 0x4c, 0xbf, 0x18, 0x4f, ++ 0x57, 0x0c, 0xfd, 0x94, 0x41, 0xe0, 0x86, 0x96, 0x47, 0x25, 0x66, 0xcf, ++ 0x8d, 0x31, 0x3d, 0xa9, 0x85, 0xef, 0xdf, 0xd1, 0x8c, 0x43, 0x7c, 0x18, ++ 0x4b, 0xbc, 0x5a, 0x98, 0x5f, 0x99, 0x45, 0xb9, 0xcf, 0x63, 0x92, 0x95, ++ 0xf5, 0x71, 0xf6, 0x4e, 0x78, 0x20, 0xc3, 0xb8, 0x4e, 0x0e, 0xcf, 0xf1, ++ 0x7d, 0x94, 0xed, 0x4e, 0xc1, 0xd7, 0x88, 0x92, 0xaf, 0x65, 0x91, 0x9b, ++ 0xb8, 0xcf, 0xe4, 0xb1, 0xe3, 0xdf, 0x05, 0xfb, 0x3e, 0x7a, 0x0d, 0xe9, ++ 0x03, 0x7a, 0x07, 0xd5, 0x10, 0x91, 0xde, 0xd4, 0xfc, 0x60, 0x54, 0xbc, ++ 0x49, 0xa1, 0x1f, 0x85, 0xc5, 0x3d, 0x46, 0xc5, 0x27, 0x74, 0x8e, 0x7b, ++ 0xb4, 0x73, 0x3f, 0xee, 0x10, 0x12, 0x58, 0xfc, 0x8a, 0xd4, 0x19, 0x5f, ++ 0xda, 0x8e, 0xad, 0x91, 0x93, 0xc3, 0xf0, 0x4a, 0xe0, 0xf1, 0x1b, 0x3c, ++ 0x4f, 0x42, 0x7a, 0x93, 0xc7, 0x57, 0x0b, 0x99, 0x5f, 0x2f, 0x24, 0xe7, ++ 0x19, 0xbe, 0x0c, 0xe0, 0xb5, 0x21, 0x80, 0x6f, 0xf4, 0xfd, 0x45, 0x02, ++ 0x4f, 0x32, 0x49, 0x26, 0xe0, 0xc9, 0xf0, 0xe6, 0x28, 0x9f, 0x4c, 0xe1, ++ 0x9a, 0xcf, 0xfb, 0x19, 0x02, 0x78, 0x53, 0x10, 0x92, 0xe7, 0x3e, 0x8d, ++ 0xc9, 0xae, 0xcf, 0x06, 0xfc, 0x70, 0x6c, 0x94, 0xe5, 0xce, 0x7a, 0x7b, ++ 0xa2, 0xcd, 0x8e, 0x78, 0xd2, 0x5f, 0x23, 0xe4, 0xbb, 0x23, 0x8e, 0xa0, ++ 0x7c, 0x6f, 0xac, 0xd7, 0xc2, 0xfc, 0xf7, 0x0f, 0xec, 0xee, 0x36, 0x29, ++ 0xf0, 0x62, 0x29, 0xe2, 0x85, 0x44, 0xf1, 0x02, 0xe9, 0xaa, 0x93, 0x5c, ++ 0x54, 0xb6, 0xab, 0xf0, 0x46, 0xec, 0xdf, 0x09, 0xae, 0x2f, 0x8f, 0x21, ++ 0x9e, 0x9e, 0x30, 0x1e, 0x65, 0x63, 0x47, 0x41, 0x5f, 0xf6, 0x65, 0x31, ++ 0xbc, 0x29, 0x23, 0x4e, 0xc4, 0x93, 0xb7, 0xb3, 0xc7, 0xf1, 0xf8, 0xb3, ++ 0x5b, 0x8b, 0xfd, 0x10, 0xa5, 0x3c, 0x2c, 0x35, 0x2a, 0xf1, 0x40, 0x8d, ++ 0x57, 0x74, 0x44, 0x4d, 0xf8, 0xb8, 0x6a, 0x3c, 0xeb, 0x0a, 0x6f, 0x32, ++ 0x01, 0x6f, 0x84, 0x3c, 0x8c, 0xbb, 0x33, 0xde, 0x3c, 0xde, 0x35, 0xde, ++ 0x3c, 0x7e, 0x3b, 0xbc, 0x51, 0xe3, 0x8b, 0xe0, 0x27, 0x7b, 0xa2, 0x2c, ++ 0xa5, 0xa0, 0x97, 0xd6, 0x54, 0x48, 0xc8, 0x87, 0xfb, 0xbf, 0xd7, 0xb3, ++ 0x1e, 0xea, 0xbd, 0xab, 0xb2, 0x30, 0x8f, 0x65, 0x8f, 0xd5, 0x81, 0x7a, ++ 0x6b, 0x4d, 0x2d, 0x6b, 0x2f, 0xf4, 0x3b, 0x65, 0xc8, 0x73, 0xe9, 0xb1, ++ 0x9a, 0xb7, 0x67, 0xb9, 0x4a, 0xa1, 0x5e, 0xb3, 0x86, 0xc5, 0x1b, 0x8a, ++ 0x4e, 0xb3, 0x3c, 0x98, 0x9e, 0x6b, 0x59, 0x7b, 0xfe, 0xc3, 0xb5, 0x47, ++ 0xcc, 0x20, 0xdf, 0x3d, 0xec, 0xfb, 0x37, 0x2e, 0x6f, 0x90, 0x63, 0x68, ++ 0xbb, 0x77, 0x03, 0xff, 0xbe, 0xb8, 0xa1, 0x14, 0xea, 0x35, 0x1b, 0xd9, ++ 0xf7, 0x5f, 0x40, 0xbc, 0x88, 0xee, 0xef, 0x80, 0xb3, 0xde, 0x7a, 0x78, ++ 0x7e, 0xd7, 0xe6, 0x2c, 0x07, 0x33, 0x3f, 0x99, 0x3e, 0x3b, 0x92, 0xe3, ++ 0xe9, 0x1e, 0x69, 0xef, 0x11, 0xfc, 0xae, 0x81, 0x7d, 0xb7, 0xe4, 0xb8, ++ 0xb1, 0x1b, 0x41, 0x3d, 0x98, 0xe9, 0xad, 0x23, 0xf8, 0x3a, 0x47, 0x3e, ++ 0xc7, 0xd6, 0x19, 0xff, 0xd9, 0xbd, 0x63, 0xed, 0x14, 0x7f, 0x17, 0x05, ++ 0x3d, 0xa8, 0x37, 0x5d, 0xd4, 0x54, 0x0e, 0x40, 0x7e, 0xd3, 0x85, 0x9d, ++ 0x59, 0x2c, 0x35, 0xa4, 0x41, 0x49, 0xf1, 0x06, 0xf9, 0x8c, 0xd3, 0x48, ++ 0xf1, 0x3a, 0x9b, 0xc5, 0x13, 0x77, 0xd0, 0x21, 0xde, 0x8e, 0x67, 0x7a, ++ 0xa0, 0x88, 0xc3, 0x41, 0x5e, 0x40, 0x78, 0x1e, 0xc0, 0xdb, 0xf1, 0x4c, ++ 0xde, 0x8b, 0xf7, 0x12, 0x6d, 0x84, 0xc5, 0x8d, 0xb7, 0x99, 0xd1, 0xaf, ++ 0x2b, 0xe2, 0x84, 0xbe, 0xa7, 0x89, 0x04, 0x74, 0x06, 0x6b, 0xe4, 0xf2, ++ 0x3f, 0x62, 0xdc, 0x70, 0x4c, 0x8f, 0x5a, 0x8c, 0x17, 0x8e, 0xc9, 0x14, ++ 0xf1, 0xc2, 0x80, 0x76, 0x3e, 0x1d, 0x37, 0xff, 0xd6, 0x97, 0xa3, 0x23, ++ 0xf9, 0x51, 0xfe, 0x93, 0x8f, 0x7b, 0x89, 0xe7, 0x39, 0x88, 0xe7, 0x15, ++ 0xde, 0x2c, 0x0d, 0xe0, 0xc5, 0x1e, 0x40, 0x92, 0x54, 0x00, 0x52, 0xf5, ++ 0x6f, 0x41, 0x6f, 0xda, 0x03, 0x7e, 0x54, 0x26, 0x34, 0x3c, 0x64, 0x10, ++ 0xec, 0x2b, 0xab, 0x9f, 0x8b, 0x5f, 0xb6, 0x69, 0x23, 0x35, 0xd2, 0x97, ++ 0x68, 0x6a, 0xb5, 0x1e, 0x10, 0x32, 0x19, 0xd4, 0xfe, 0xa2, 0x5d, 0x4f, ++ 0xf2, 0x13, 0x5f, 0x6c, 0x4c, 0xe7, 0xf9, 0x8f, 0xd1, 0x12, 0x1f, 0xc8, ++ 0x27, 0xa2, 0x65, 0xf3, 0x5f, 0x5c, 0x4f, 0xe5, 0xa0, 0x14, 0xe2, 0x4b, ++ 0x53, 0x05, 0xdb, 0x19, 0xd6, 0x0b, 0xe9, 0x74, 0x0a, 0xdf, 0xa7, 0xcb, ++ 0xf1, 0x5c, 0xdf, 0xe8, 0x4f, 0xfa, 0x03, 0xbf, 0x99, 0xca, 0xf7, 0xed, ++ 0x3b, 0xc6, 0x5a, 0x1d, 0x93, 0x97, 0x0d, 0x3a, 0x15, 0xfd, 0x5f, 0x43, ++ 0xfa, 0x7f, 0xa6, 0x4b, 0xbd, 0x59, 0xd9, 0xae, 0xe2, 0x0f, 0x15, 0x7c, ++ 0xdc, 0xc5, 0x5c, 0x5f, 0x5e, 0x4a, 0x82, 0xa8, 0x17, 0x5c, 0x94, 0xbc, ++ 0x58, 0x5e, 0x7a, 0x86, 0xe9, 0xcb, 0xcb, 0x4d, 0xa7, 0x51, 0xaf, 0x68, ++ 0xdf, 0xc6, 0xf4, 0xc4, 0x4a, 0x12, 0x40, 0xbd, 0x43, 0xed, 0xf7, 0x5b, ++ 0xbe, 0x5b, 0x59, 0xaf, 0x6a, 0x54, 0xd6, 0x6b, 0x9a, 0x95, 0xf5, 0xf6, ++ 0x5c, 0x0f, 0x8e, 0xd3, 0xfe, 0x4c, 0xd5, 0x00, 0xf0, 0xbf, 0x55, 0x6c, ++ 0x7d, 0x0f, 0xfd, 0xbb, 0x15, 0x82, 0x4f, 0x78, 0x95, 0x7c, 0x82, 0x2a, ++ 0x48, 0x8c, 0x4f, 0x3c, 0x7d, 0x37, 0xfa, 0x6d, 0x34, 0x46, 0xca, 0x27, ++ 0x0a, 0x01, 0x5c, 0xdd, 0x30, 0x6f, 0xa4, 0x3f, 0x71, 0xc6, 0x01, 0x3f, ++ 0x00, 0x21, 0x7b, 0x8b, 0xd6, 0x1f, 0x83, 0x4f, 0x52, 0x68, 0x5d, 0xe3, ++ 0x8a, 0x49, 0x40, 0x3f, 0xd6, 0xd8, 0xb8, 0x0b, 0x62, 0x7c, 0x19, 0xe3, ++ 0xb2, 0xef, 0x39, 0xed, 0xa1, 0x7d, 0xe9, 0xb0, 0x0b, 0x55, 0x7c, 0x22, ++ 0x5f, 0xf8, 0x63, 0x7a, 0xda, 0xd0, 0x5f, 0x25, 0xf8, 0x46, 0x3e, 0x61, ++ 0x72, 0x42, 0xad, 0x17, 0xf5, 0x49, 0x50, 0xda, 0x39, 0x42, 0xaf, 0xc8, ++ 0x07, 0xbd, 0x82, 0xe2, 0x85, 0x5f, 0x63, 0xf2, 0x6a, 0x34, 0xe1, 0x7a, ++ 0x84, 0x17, 0xe9, 0x8f, 0xda, 0x8b, 0xe3, 0xa3, 0xb2, 0x01, 0x65, 0x5c, ++ 0x32, 0xd4, 0xfb, 0xcf, 0x28, 0x34, 0xf2, 0x7d, 0x27, 0xaa, 0x7d, 0xed, ++ 0x9b, 0x70, 0x7b, 0x7b, 0x49, 0xd9, 0xae, 0xda, 0x77, 0x61, 0xaf, 0x0c, ++ 0xe0, 0xfb, 0x3e, 0x83, 0xb8, 0xbb, 0xc3, 0x3e, 0x4c, 0x21, 0xae, 0x63, ++ 0x20, 0x17, 0x4e, 0x7d, 0x54, 0xa1, 0xb0, 0x93, 0x3e, 0xfa, 0xc3, 0x68, ++ 0xe1, 0x47, 0x41, 0x7b, 0xe9, 0x9b, 0xdb, 0x49, 0x4e, 0xf9, 0xdb, 0xd8, ++ 0x49, 0x1d, 0xfb, 0x1d, 0x45, 0xf5, 0x46, 0x5a, 0x96, 0x4e, 0x1e, 0xd7, ++ 0xeb, 0x67, 0x10, 0xdf, 0x6e, 0x8a, 0xc2, 0xbc, 0xcd, 0x1a, 0x89, 0xed, ++ 0x6f, 0xe2, 0x8c, 0xd3, 0x19, 0xe1, 0x7e, 0xc3, 0x53, 0x75, 0x24, 0x41, ++ 0x1b, 0x46, 0xef, 0xf5, 0xe3, 0x0c, 0x46, 0x88, 0xef, 0xd5, 0xeb, 0x98, ++ 0x1d, 0x31, 0x79, 0xfc, 0xc7, 0x03, 0xe6, 0x87, 0xf1, 0x8b, 0x17, 0x8c, ++ 0xc5, 0x2e, 0x80, 0xd7, 0x06, 0xc9, 0xff, 0xbd, 0x3f, 0x82, 0x5d, 0x71, ++ 0x52, 0x26, 0x98, 0x17, 0xd3, 0x92, 0x80, 0xfb, 0x7d, 0xbd, 0x81, 0x3e, ++ 0xa7, 0x78, 0x76, 0xfd, 0xb9, 0x7b, 0x1c, 0x1e, 0xfa, 0xf8, 0xaa, 0x8e, ++ 0xc5, 0x0b, 0xbf, 0x90, 0x6a, 0x17, 0x43, 0x2a, 0x93, 0x98, 0xc7, 0xe2, ++ 0x35, 0xbf, 0x8d, 0xd2, 0x52, 0xf9, 0x75, 0x25, 0xfa, 0x10, 0xc6, 0x83, ++ 0xcf, 0xe8, 0xdd, 0xb3, 0x01, 0xef, 0x96, 0xbd, 0xb3, 0x0f, 0xfd, 0x91, ++ 0x95, 0xa0, 0x77, 0xf7, 0x08, 0xf5, 0xdb, 0xb5, 0xdf, 0xd1, 0x83, 0x76, ++ 0x89, 0xfe, 0x2d, 0x26, 0x07, 0x83, 0x52, 0x37, 0x07, 0xe6, 0x25, 0x10, ++ 0x4f, 0x4e, 0x78, 0x9c, 0x68, 0x56, 0x22, 0xe3, 0xaf, 0x67, 0x6c, 0xae, ++ 0xa5, 0x30, 0x7f, 0x21, 0xe7, 0x84, 0xdf, 0xff, 0xdc, 0x8a, 0x31, 0xb1, ++ 0x20, 0x0a, 0xfe, 0x42, 0x9c, 0xb1, 0x10, 0x9f, 0x94, 0x28, 0x4c, 0xba, ++ 0xdb, 0x3a, 0x8f, 0x07, 0xf9, 0x00, 0xeb, 0xc3, 0xfc, 0xcc, 0xe7, 0xa2, ++ 0x94, 0xf1, 0x05, 0x51, 0x7e, 0x2f, 0x81, 0xf9, 0xbf, 0xf7, 0x01, 0x2d, ++ 0xd1, 0xf1, 0xd2, 0xac, 0xce, 0xef, 0xc3, 0xfa, 0x2e, 0x71, 0x7b, 0xef, ++ 0x12, 0x8f, 0x53, 0x5d, 0x8a, 0x61, 0x71, 0xab, 0x87, 0x13, 0x18, 0xff, ++ 0xdd, 0xc7, 0xbf, 0xdb, 0xca, 0xcb, 0x4b, 0x3c, 0xae, 0x75, 0xc9, 0xa6, ++ 0xb4, 0x13, 0xc5, 0x7b, 0xdb, 0xf8, 0x77, 0x17, 0xea, 0x8c, 0xc6, 0xf5, ++ 0x61, 0xfb, 0x68, 0x7f, 0xda, 0x50, 0xeb, 0xc5, 0x3c, 0x28, 0x9e, 0xf7, ++ 0xb1, 0x9a, 0x30, 0xbb, 0x68, 0xbf, 0x75, 0xfb, 0xa6, 0xb0, 0xf8, 0xc1, ++ 0xae, 0x84, 0xe2, 0x7d, 0x30, 0xaf, 0x84, 0x1e, 0x4e, 0x7d, 0x0a, 0xc0, ++ 0x6f, 0x3f, 0x93, 0xbb, 0x10, 0x47, 0x86, 0x78, 0xef, 0x30, 0x8b, 0xbb, ++ 0x01, 0xe0, 0x55, 0x6d, 0x27, 0x4e, 0x88, 0x97, 0x12, 0x7b, 0x40, 0x7f, ++ 0x3f, 0xc4, 0x0d, 0xc1, 0xce, 0x44, 0x7d, 0x81, 0xe1, 0x49, 0x7b, 0x14, ++ 0x2b, 0xc5, 0xbc, 0x76, 0x25, 0x94, 0xef, 0x43, 0x38, 0xaf, 0x08, 0x20, ++ 0xdf, 0xea, 0xa8, 0x97, 0x33, 0x7e, 0xb8, 0x2b, 0xc1, 0x85, 0xe3, 0xb6, ++ 0x4f, 0x15, 0xed, 0xbc, 0xfe, 0x04, 0xab, 0x13, 0xee, 0x2f, 0x10, 0xfe, ++ 0xeb, 0xae, 0xe2, 0x58, 0xea, 0xb8, 0x15, 0xcc, 0x18, 0xf5, 0xea, 0x28, ++ 0xc6, 0xb7, 0xd4, 0xf1, 0xea, 0xd9, 0x82, 0x6f, 0xf1, 0x78, 0xf5, 0x2c, ++ 0xce, 0x87, 0x66, 0xb7, 0x30, 0x7f, 0xf8, 0x1c, 0x23, 0xd9, 0xd0, 0x9d, ++ 0xb6, 0xcf, 0x6d, 0x49, 0x62, 0xf6, 0x61, 0x8c, 0x27, 0x47, 0x11, 0xaf, ++ 0xf6, 0x44, 0x7f, 0xa3, 0x3c, 0x05, 0x81, 0x9f, 0xed, 0xe9, 0xfe, 0x8e, ++ 0x38, 0xeb, 0xb6, 0xb0, 0x38, 0x6b, 0x15, 0x8f, 0xd3, 0x55, 0x89, 0xf5, ++ 0x35, 0x29, 0xd7, 0x77, 0x24, 0xa1, 0xcb, 0x38, 0xeb, 0x91, 0x84, 0x08, ++ 0x71, 0x56, 0x75, 0x3c, 0x7f, 0x1f, 0xc8, 0xf3, 0x9e, 0x21, 0x78, 0xae, ++ 0xb4, 0xb0, 0xf5, 0x97, 0xc9, 0x95, 0xa5, 0x7a, 0xe0, 0x0f, 0x0b, 0x09, ++ 0xe6, 0x7f, 0xaf, 0x3c, 0xb9, 0xa0, 0xde, 0x48, 0xeb, 0x2b, 0x1f, 0x03, ++ 0x4f, 0x1f, 0xf2, 0x21, 0xd4, 0x4f, 0xab, 0x38, 0xbc, 0xba, 0x9a, 0x5f, ++ 0x82, 0x4b, 0x43, 0xec, 0x0a, 0xbf, 0x70, 0x37, 0x62, 0x0f, 0xb3, 0x83, ++ 0x53, 0xdc, 0x36, 0x45, 0x1d, 0x35, 0xde, 0xb0, 0xfc, 0xc9, 0xee, 0x15, ++ 0xa9, 0x8a, 0xef, 0xd3, 0x6b, 0xb3, 0x15, 0xef, 0x67, 0xae, 0xb9, 0x5b, ++ 0xd1, 0x9e, 0xe5, 0x29, 0x50, 0xd4, 0x7b, 0x6c, 0x1c, 0xa2, 0x78, 0xbf, ++ 0x57, 0x43, 0x89, 0xa2, 0xde, 0x7b, 0xeb, 0xbd, 0x8a, 0xf7, 0xf3, 0x49, ++ 0x76, 0x2c, 0xfa, 0x8f, 0x4e, 0xc8, 0xe0, 0x1b, 0x21, 0x77, 0x79, 0x27, ++ 0x2b, 0xda, 0xef, 0xd9, 0xfd, 0x80, 0xe2, 0xfb, 0x2f, 0x48, 0xed, 0x53, ++ 0xc3, 0xe8, 0x7b, 0x4d, 0x51, 0x8c, 0xff, 0x13, 0x8f, 0xd3, 0xdf, 0x77, ++ 0x40, 0x28, 0x5f, 0x38, 0xb7, 0x71, 0xbe, 0xe2, 0xfb, 0x7a, 0xa9, 0x71, ++ 0x80, 0x8f, 0xbe, 0xbf, 0xd0, 0xcf, 0xfc, 0xeb, 0xfd, 0x9a, 0x97, 0x29, ++ 0xfa, 0xbb, 0x1a, 0x33, 0x9a, 0xd9, 0x0d, 0x3c, 0x4e, 0x58, 0x4b, 0xff, ++ 0x31, 0xfe, 0x6d, 0x97, 0x51, 0xff, 0x69, 0x96, 0xc8, 0x36, 0xa9, 0x73, ++ 0xdc, 0xb0, 0xa2, 0x65, 0xcb, 0x86, 0xee, 0x24, 0x52, 0xfc, 0x90, 0xc9, ++ 0xf5, 0x65, 0x54, 0xae, 0x83, 0xde, 0xa4, 0xd6, 0x2b, 0x0c, 0x89, 0x3c, ++ 0x8e, 0x94, 0x4a, 0x52, 0x6f, 0x85, 0xd1, 0x55, 0x08, 0x0f, 0x4c, 0xa8, ++ 0x77, 0x5d, 0x7f, 0x4e, 0x46, 0xff, 0x59, 0x3e, 0xc9, 0x79, 0x7a, 0x18, ++ 0xc2, 0x47, 0x47, 0xbc, 0xf6, 0xce, 0xfb, 0x75, 0x9d, 0x30, 0xbf, 0xce, ++ 0xf5, 0x57, 0xcc, 0x0e, 0xf0, 0x8f, 0x2d, 0x39, 0xb9, 0x00, 0xf1, 0xcf, ++ 0x90, 0xac, 0xc4, 0x83, 0x28, 0xbb, 0x12, 0x0f, 0xa2, 0xfb, 0x28, 0xf1, ++ 0xc0, 0xec, 0x50, 0xee, 0x7b, 0xec, 0x20, 0xe5, 0xbe, 0xab, 0xe1, 0x6c, ++ 0x75, 0x2a, 0xf1, 0x40, 0xc0, 0x51, 0xc0, 0x39, 0x6e, 0xac, 0x12, 0x2f, ++ 0x04, 0x7c, 0x07, 0xd1, 0x7f, 0x00, 0xdf, 0x02, 0x12, 0x3c, 0x8e, 0xf9, ++ 0xd1, 0x5e, 0xc9, 0xe1, 0x23, 0x11, 0xe2, 0xb2, 0xcd, 0xdb, 0x71, 0x1d, ++ 0x77, 0xd2, 0xd3, 0xf2, 0x55, 0xf0, 0xec, 0x7f, 0xd4, 0x59, 0x6f, 0x42, ++ 0x38, 0xb1, 0x7c, 0x29, 0xa1, 0x17, 0x19, 0xb8, 0x5e, 0xa2, 0xf6, 0x93, ++ 0x77, 0xf8, 0x57, 0x12, 0xb9, 0xde, 0xc3, 0xfb, 0x11, 0x7e, 0xed, 0x0d, ++ 0x92, 0x07, 0xf5, 0x9c, 0x8e, 0xf8, 0xd5, 0x20, 0x5f, 0x86, 0x2f, 0x0b, ++ 0xf4, 0x9d, 0x5a, 0xc2, 0xfc, 0x23, 0xae, 0xb2, 0xc4, 0xc8, 0x7e, 0x34, ++ 0x7c, 0xde, 0x95, 0x1f, 0x4d, 0xc0, 0x51, 0xe8, 0x31, 0xcb, 0x41, 0x8f, ++ 0xa1, 0xe3, 0x2c, 0x22, 0x6e, 0xe4, 0x4b, 0x17, 0xb8, 0x1e, 0xb3, 0xc4, ++ 0xf4, 0x24, 0xc6, 0x01, 0xaf, 0xfe, 0x81, 0xc1, 0xb7, 0x82, 0x78, 0x91, ++ 0x5f, 0x7f, 0xe3, 0xb8, 0x36, 0xd5, 0x0b, 0x49, 0x98, 0x7f, 0x51, 0x0d, ++ 0x47, 0xa9, 0x45, 0xf2, 0x99, 0x81, 0x0e, 0x38, 0xdf, 0x4e, 0x25, 0x2d, ++ 0x82, 0x6f, 0xbb, 0x31, 0xdf, 0x81, 0xa2, 0x9d, 0x71, 0x80, 0x22, 0x9e, ++ 0xa0, 0xd4, 0x3b, 0x89, 0x53, 0x0a, 0xe7, 0x4f, 0x42, 0x0f, 0x15, 0xe3, ++ 0x09, 0x78, 0x0a, 0xbe, 0x25, 0xc6, 0x33, 0x90, 0x5a, 0x39, 0x19, 0xe8, ++ 0x40, 0xc5, 0xc7, 0x48, 0x1f, 0x75, 0x3c, 0x43, 0xe9, 0xe7, 0x10, 0x7e, ++ 0x11, 0x1c, 0x2c, 0x2c, 0x6e, 0x31, 0xb0, 0x23, 0x1e, 0xc1, 0xec, 0xc2, ++ 0x90, 0x9f, 0x8b, 0xf9, 0x35, 0xe4, 0xcc, 0xac, 0x7a, 0x02, 0xfa, 0xb6, ++ 0x45, 0xf8, 0x31, 0xfc, 0x33, 0xe1, 0xb9, 0xf0, 0x63, 0xa8, 0xed, 0xf9, ++ 0x3b, 0xc5, 0x41, 0xef, 0xf7, 0x48, 0x81, 0x67, 0xb3, 0x3a, 0xc7, 0x3f, ++ 0x45, 0x3c, 0x95, 0x2e, 0xf3, 0xb3, 0x3f, 0xd2, 0x8f, 0x87, 0x49, 0xf6, ++ 0x74, 0x18, 0x6f, 0xf2, 0x1b, 0xbd, 0x13, 0x88, 0x26, 0x92, 0x1f, 0xce, ++ 0x71, 0xf6, 0x00, 0xed, 0x47, 0xd6, 0x04, 0xe3, 0xc2, 0xfd, 0x63, 0xc2, ++ 0x5f, 0xfd, 0xb6, 0x14, 0xc0, 0x79, 0x7f, 0x87, 0x38, 0x1f, 0x21, 0x61, ++ 0xfa, 0x42, 0x35, 0x69, 0x1c, 0x3d, 0x33, 0x0b, 0xfc, 0x9d, 0x54, 0x6e, ++ 0xc5, 0x40, 0xc9, 0xfc, 0x3c, 0xa4, 0x59, 0xad, 0x8f, 0xb2, 0xf8, 0xa1, ++ 0x86, 0xae, 0x04, 0xf0, 0x7b, 0x39, 0x09, 0x8b, 0x0f, 0x66, 0x85, 0xda, ++ 0xb1, 0x2e, 0x77, 0xae, 0x8b, 0xfc, 0x94, 0x3b, 0xc9, 0xf7, 0x5e, 0x49, ++ 0x16, 0x71, 0x2e, 0x25, 0x87, 0xb5, 0x33, 0xfe, 0x26, 0xec, 0xb5, 0xae, ++ 0xec, 0x23, 0x11, 0xbf, 0x3f, 0xa6, 0xa7, 0x30, 0x29, 0x08, 0xe5, 0xa3, ++ 0x34, 0x26, 0x72, 0x3f, 0x56, 0x1e, 0xc9, 0x83, 0xfe, 0x29, 0x5d, 0x35, ++ 0x25, 0x26, 0x80, 0x3d, 0x4e, 0xe9, 0x50, 0x0a, 0xa7, 0xbb, 0x8e, 0xfc, ++ 0x15, 0x6c, 0xef, 0x44, 0x77, 0xaa, 0xf5, 0x8b, 0xf8, 0xbd, 0x6c, 0x2e, ++ 0x44, 0x3f, 0xcb, 0x82, 0xf0, 0xf5, 0x7e, 0x0d, 0x78, 0x08, 0x3d, 0xe2, ++ 0x06, 0x5d, 0x1b, 0xac, 0xf7, 0x47, 0x89, 0x76, 0x2c, 0xab, 0xba, 0x9d, ++ 0xfb, 0xd0, 0x09, 0xcd, 0x85, 0x7e, 0x45, 0x1e, 0x62, 0x8d, 0x9e, 0xe5, ++ 0xfd, 0x92, 0x46, 0xa5, 0xfe, 0x7c, 0x36, 0x51, 0xc4, 0x59, 0x99, 0x9d, ++ 0x71, 0x27, 0x38, 0x75, 0xbd, 0x0f, 0x3c, 0x9f, 0x8b, 0xef, 0xc3, 0xd7, ++ 0xd5, 0x87, 0x44, 0x3e, 0x97, 0x80, 0xdf, 0x27, 0x82, 0x0f, 0x86, 0xe0, ++ 0x7d, 0x5e, 0x01, 0xcf, 0x0e, 0x7b, 0xad, 0x03, 0xde, 0xe7, 0x23, 0xc1, ++ 0x5b, 0xc0, 0xe3, 0x5a, 0x91, 0xff, 0x45, 0xd8, 0x27, 0xd9, 0x7c, 0x3a, ++ 0x11, 0xe0, 0x9c, 0x14, 0xe3, 0xfa, 0x02, 0xf8, 0x62, 0xfa, 0xd9, 0xc0, ++ 0x45, 0x49, 0x13, 0x9a, 0x57, 0x99, 0xdc, 0x8a, 0x79, 0x9c, 0xd7, 0x9b, ++ 0x65, 0xb4, 0x8f, 0xaa, 0x87, 0xb3, 0x7c, 0x9e, 0xea, 0xfd, 0x18, 0x24, ++ 0x27, 0x6d, 0x2d, 0x06, 0x8c, 0x03, 0x56, 0x34, 0x1f, 0x41, 0xfd, 0xac, ++ 0xb5, 0x8e, 0x32, 0xd2, 0x9e, 0x5d, 0xc3, 0xa9, 0x63, 0xbd, 0x2a, 0x78, ++ 0x77, 0x65, 0xaf, 0x88, 0xf5, 0xdc, 0x52, 0xad, 0x5f, 0xe4, 0x87, 0x40, ++ 0x7c, 0x3f, 0xa9, 0xe8, 0xb6, 0x70, 0x50, 0xb6, 0x73, 0x38, 0x88, 0x7c, ++ 0x96, 0x32, 0xb9, 0x6f, 0x6c, 0x20, 0xcc, 0x2e, 0xf1, 0xf1, 0x7d, 0x8f, ++ 0xd2, 0xba, 0xa2, 0x92, 0xe8, 0xf8, 0x85, 0xbf, 0x4b, 0x8b, 0x01, 0xf8, ++ 0x94, 0xc9, 0x2d, 0xc7, 0x53, 0x01, 0x0e, 0xab, 0x25, 0x3c, 0x67, 0x34, ++ 0xd2, 0x40, 0x3c, 0xe0, 0xdf, 0x4f, 0xe1, 0xe7, 0xcd, 0x06, 0x05, 0x6a, ++ 0x1d, 0x16, 0x0a, 0x8f, 0xe4, 0x34, 0x13, 0x9e, 0x1b, 0xea, 0xfd, 0x5d, ++ 0xd9, 0x05, 0xf1, 0xcb, 0x8f, 0x57, 0xaf, 0xb2, 0xc1, 0xb9, 0xa8, 0x2b, ++ 0x75, 0x74, 0x68, 0x6a, 0x77, 0xf4, 0x96, 0x34, 0x2e, 0xc4, 0x37, 0xb2, ++ 0xf7, 0x93, 0x1f, 0x14, 0x42, 0x5c, 0x6d, 0x16, 0xe6, 0x17, 0xcf, 0x36, ++ 0xb0, 0x78, 0x7f, 0xd6, 0xf7, 0xa2, 0x7d, 0x3d, 0x28, 0x9f, 0x78, 0x53, ++ 0x4f, 0x8c, 0x40, 0x6f, 0xba, 0xec, 0x5a, 0x3c, 0x57, 0x11, 0xb4, 0xca, ++ 0x68, 0x6f, 0xc4, 0xcb, 0x64, 0x14, 0xe0, 0x97, 0x80, 0x73, 0x7c, 0x34, ++ 0x5b, 0x87, 0x78, 0x5e, 0xfc, 0xf3, 0x9d, 0x12, 0xe4, 0x21, 0x89, 0xe7, ++ 0x23, 0xeb, 0x83, 0xfd, 0x57, 0xd2, 0xf2, 0x73, 0xd8, 0xf7, 0x84, 0xd0, ++ 0x3a, 0x47, 0x96, 0x06, 0xfb, 0xd7, 0x9a, 0x42, 0x70, 0x16, 0xf9, 0x7d, ++ 0x44, 0x1b, 0xcc, 0x98, 0x1c, 0x46, 0x1f, 0x47, 0x38, 0x3c, 0xaa, 0x13, ++ 0xf4, 0x1b, 0x40, 0x1e, 0xb6, 0x19, 0xb9, 0x1d, 0xc8, 0xed, 0x41, 0x62, ++ 0xd1, 0x22, 0x1f, 0x59, 0xcd, 0xe3, 0xeb, 0xe7, 0x7a, 0x11, 0xe2, 0xc7, ++ 0x7e, 0x7c, 0x66, 0xc8, 0xa7, 0xaa, 0x8e, 0x72, 0xc6, 0x0e, 0x04, 0xff, ++ 0x16, 0xe4, 0x0f, 0xd0, 0xe2, 0x2f, 0x16, 0x67, 0xac, 0x15, 0xd7, 0x6f, ++ 0x47, 0xbd, 0x79, 0x35, 0xd7, 0xaf, 0xda, 0x78, 0x7e, 0xf6, 0xea, 0x71, ++ 0x25, 0x49, 0x60, 0x4f, 0x25, 0xd4, 0x47, 0xce, 0x63, 0x1a, 0x9d, 0xc4, ++ 0xf4, 0xfc, 0x4a, 0x1e, 0xf7, 0x16, 0xcf, 0x2b, 0xb5, 0x3e, 0xcc, 0x47, ++ 0xaa, 0x84, 0x7c, 0xe1, 0xb0, 0xfc, 0xa8, 0x6f, 0x9a, 0x2f, 0x2c, 0xf2, ++ 0xc4, 0xbb, 0x84, 0x83, 0x55, 0x4b, 0xb4, 0x14, 0x0e, 0xd5, 0x12, 0x71, ++ 0xdd, 0xee, 0xbd, 0x03, 0xff, 0x23, 0x47, 0xb4, 0x77, 0xab, 0x92, 0x34, ++ 0xb7, 0xcd, 0x63, 0x5b, 0xc8, 0xd7, 0x27, 0xf2, 0xd3, 0xaa, 0x21, 0x3f, ++ 0x8d, 0x3e, 0x5a, 0xbd, 0xbf, 0x38, 0x89, 0x44, 0xe8, 0xaf, 0x43, 0xde, ++ 0xdc, 0x18, 0xa2, 0xc8, 0x0b, 0x13, 0xf9, 0xcd, 0xd5, 0x37, 0x46, 0x60, ++ 0x5e, 0x58, 0xe9, 0xa3, 0xad, 0x78, 0xbe, 0x0f, 0xfa, 0xb1, 0x9b, 0x42, ++ 0x79, 0x69, 0x5d, 0xc1, 0xf9, 0x48, 0x22, 0x9b, 0x47, 0x35, 0xe4, 0x8b, ++ 0xf5, 0x0f, 0x7f, 0xce, 0xf8, 0x47, 0xa8, 0xff, 0x78, 0xdc, 0x87, 0x5f, ++ 0x02, 0x00, 0xc1, 0xcf, 0xd1, 0x2c, 0xa3, 0x1f, 0xf6, 0x97, 0x27, 0x34, ++ 0x63, 0x77, 0x44, 0x98, 0xef, 0x16, 0xbe, 0xfe, 0xbb, 0x13, 0xb4, 0x48, ++ 0x1f, 0xf7, 0xf8, 0x88, 0x73, 0x7b, 0x84, 0xf1, 0xc5, 0x7b, 0xe2, 0xfc, ++ 0x07, 0xc0, 0xb9, 0x3c, 0xb7, 0xf3, 0xfc, 0x9a, 0x4a, 0x02, 0x73, 0x60, ++ 0xfe, 0x90, 0x77, 0x1a, 0x69, 0xbc, 0xf5, 0x49, 0xcc, 0xce, 0x16, 0xf3, ++ 0x6e, 0xb2, 0x05, 0x16, 0x73, 0x3c, 0xc7, 0xf3, 0x17, 0x1d, 0x75, 0x8b, ++ 0x72, 0x1f, 0x5f, 0xe0, 0xfb, 0xd8, 0x74, 0x6f, 0x20, 0x03, 0xcf, 0x11, ++ 0x8d, 0x8b, 0x9c, 0x07, 0x2f, 0xf6, 0xfb, 0xa6, 0xd9, 0xfd, 0x26, 0xf0, ++ 0xdb, 0xca, 0x69, 0xf4, 0x65, 0xf0, 0xb3, 0x6b, 0x6b, 0x25, 0x4b, 0x18, ++ 0x7d, 0x75, 0xb5, 0xdf, 0x21, 0x38, 0x6b, 0x14, 0xf9, 0x7f, 0x9d, 0xe1, ++ 0xac, 0xc7, 0xfd, 0x15, 0xfd, 0x09, 0x7b, 0xe4, 0xf2, 0x56, 0x19, 0xe3, ++ 0xfb, 0x97, 0x4f, 0x71, 0x7a, 0x24, 0x4e, 0x93, 0x44, 0xe9, 0x6a, 0x1e, ++ 0x97, 0x57, 0x97, 0x09, 0x8b, 0x13, 0x5c, 0x6e, 0x90, 0xd0, 0x0e, 0x99, ++ 0xef, 0x26, 0x64, 0x0d, 0xe5, 0x2b, 0xf3, 0x76, 0x2e, 0xc7, 0x38, 0xcd, ++ 0xe2, 0x5d, 0xfd, 0x37, 0x80, 0x98, 0x82, 0xe7, 0x6b, 0x29, 0xff, 0x98, ++ 0x97, 0x4c, 0xc8, 0x08, 0x5a, 0xce, 0x5f, 0xaf, 0x8c, 0xd3, 0x2e, 0xdc, ++ 0xdc, 0xc9, 0xff, 0x46, 0xc2, 0xe5, 0x22, 0x55, 0x3b, 0xd1, 0xae, 0x5e, ++ 0xfc, 0xa4, 0xf2, 0xbb, 0x0a, 0xb2, 0xf9, 0xcf, 0xa0, 0xf7, 0x54, 0xa8, ++ 0xf4, 0x9a, 0xde, 0xdc, 0xbf, 0xb5, 0x2f, 0x89, 0xda, 0x09, 0xa0, 0xd7, ++ 0x0d, 0x20, 0x03, 0x80, 0xaf, 0xaf, 0xdc, 0xf5, 0xa5, 0x1e, 0x52, 0x6d, ++ 0xbb, 0xc2, 0xf3, 0x2b, 0x94, 0x9e, 0x7b, 0x6a, 0x81, 0xff, 0x59, 0xb0, ++ 0x3c, 0x91, 0xe4, 0x3c, 0x08, 0xfc, 0xfd, 0xf7, 0x49, 0x6e, 0x1f, 0x94, ++ 0xed, 0x1f, 0x30, 0x38, 0x5c, 0xaf, 0xbc, 0xce, 0xf8, 0xfd, 0x73, 0xf1, ++ 0x28, 0x67, 0x0c, 0xc0, 0x94, 0xe9, 0xff, 0x1a, 0x66, 0xb2, 0x78, 0xeb, ++ 0xa3, 0x94, 0x4d, 0x40, 0x9c, 0xcd, 0x60, 0x60, 0x7a, 0x8d, 0xd0, 0xe7, ++ 0x64, 0x79, 0x95, 0x1c, 0x43, 0xdb, 0x07, 0x7f, 0xbe, 0xda, 0x06, 0xfe, ++ 0xbf, 0xf8, 0x97, 0xc7, 0x8c, 0x05, 0x7d, 0x3f, 0xe1, 0xe5, 0x68, 0x27, ++ 0xc0, 0x6b, 0x53, 0xb1, 0x33, 0x1f, 0xec, 0xff, 0x4d, 0xe5, 0x26, 0xcc, ++ 0x5b, 0x30, 0x1a, 0x58, 0x9c, 0xd7, 0xfb, 0xcb, 0xc1, 0x6f, 0x81, 0xdb, ++ 0xbf, 0x67, 0xe3, 0x96, 0x12, 0xb0, 0x3f, 0x2d, 0x2d, 0x87, 0x7d, 0xe0, ++ 0x1f, 0xd9, 0xa8, 0xf9, 0x33, 0x9e, 0x1b, 0xd9, 0x38, 0x82, 0xe5, 0xb5, ++ 0x75, 0xe4, 0x4f, 0xb6, 0x94, 0xef, 0x81, 0xf9, 0x64, 0x4c, 0x61, 0xf2, ++ 0x62, 0x53, 0x96, 0x33, 0xdf, 0x12, 0xd6, 0x2f, 0xe1, 0xfa, 0x59, 0x35, ++ 0x87, 0x59, 0xfb, 0xc1, 0xde, 0x3f, 0x86, 0xf3, 0xea, 0xcf, 0x9e, 0x40, ++ 0xf5, 0x98, 0xae, 0x2f, 0x1b, 0xfd, 0x70, 0x77, 0x13, 0xb6, 0x9f, 0x22, ++ 0x7f, 0x0a, 0xc6, 0x0e, 0xd7, 0x43, 0x5b, 0xa9, 0xdc, 0x81, 0x24, 0x3c, ++ 0x51, 0xbf, 0xbb, 0x51, 0xf2, 0xe9, 0xe8, 0x7a, 0xaa, 0x9a, 0xf6, 0x60, ++ 0xbc, 0xa2, 0xf2, 0x61, 0x5f, 0xe2, 0x4c, 0x90, 0x2f, 0x2f, 0x69, 0x31, ++ 0xde, 0x23, 0xe6, 0x17, 0xff, 0x66, 0x4a, 0x09, 0xc4, 0x75, 0x84, 0x5c, ++ 0x99, 0x29, 0x59, 0x98, 0x9f, 0x91, 0xeb, 0xd9, 0x33, 0x88, 0xf8, 0x63, ++ 0x71, 0xa1, 0xe9, 0x1c, 0x0f, 0x66, 0x70, 0xfd, 0x7a, 0x66, 0x34, 0x83, ++ 0xef, 0x7c, 0xe2, 0xc8, 0x80, 0xef, 0x1e, 0x30, 0x92, 0x18, 0xf0, 0x4f, ++ 0xcf, 0x2c, 0x6d, 0x2c, 0x42, 0xb9, 0xb3, 0x5c, 0x67, 0x05, 0x79, 0x2e, ++ 0xe2, 0x1b, 0x5d, 0xeb, 0x01, 0x91, 0xfd, 0x44, 0xd5, 0x2f, 0x9a, 0xd9, ++ 0xf9, 0x57, 0x29, 0x98, 0x03, 0x9d, 0x5c, 0xa1, 0x76, 0x07, 0x61, 0xfe, ++ 0xa2, 0x88, 0x79, 0xbf, 0xe6, 0x64, 0x4e, 0x67, 0x39, 0x5c, 0xdf, 0xeb, ++ 0x49, 0x9c, 0x10, 0x4f, 0xab, 0x3e, 0xd4, 0x7b, 0x3b, 0xf8, 0x03, 0x0c, ++ 0xdd, 0x58, 0xdc, 0x95, 0xf2, 0x1b, 0xe3, 0xa0, 0x02, 0xd4, 0x77, 0x8d, ++ 0x60, 0xc7, 0x2c, 0x3d, 0x10, 0xe5, 0x63, 0x7e, 0x6a, 0x2f, 0x3f, 0xe7, ++ 0xea, 0xcc, 0x87, 0xfc, 0x8f, 0x9a, 0xc9, 0x69, 0x05, 0x98, 0x87, 0x70, ++ 0x96, 0xf2, 0x0d, 0x33, 0x9c, 0x1f, 0x0c, 0x64, 0x20, 0x9d, 0x52, 0x7e, ++ 0x22, 0x51, 0x99, 0x96, 0x93, 0x6c, 0x9e, 0xa0, 0x85, 0x73, 0x7e, 0xa9, ++ 0x54, 0x9f, 0xa2, 0xf5, 0x29, 0x5b, 0x53, 0x27, 0x68, 0x29, 0xbe, 0x57, ++ 0x67, 0x07, 0x16, 0x6b, 0x68, 0x7d, 0x6d, 0x72, 0x21, 0x6b, 0xbf, 0x3b, ++ 0x70, 0x11, 0xea, 0x1b, 0x92, 0x47, 0xb2, 0xf6, 0x82, 0xc0, 0x62, 0x99, ++ 0xd6, 0xb7, 0x27, 0x4f, 0x64, 0x75, 0x30, 0xec, 0x28, 0x62, 0xfd, 0x3a, ++ 0x79, 0xca, 0x04, 0x0f, 0xed, 0xff, 0x8a, 0x95, 0xcb, 0x69, 0x47, 0x00, ++ 0xcf, 0xfd, 0x56, 0xbf, 0xd1, 0x5b, 0x13, 0xee, 0xa7, 0xdc, 0x06, 0xc9, ++ 0x0b, 0x14, 0x3e, 0x57, 0xb8, 0xbf, 0xf5, 0x4a, 0x16, 0x99, 0x3b, 0x19, ++ 0xe0, 0xdd, 0x27, 0x80, 0xe7, 0xca, 0xc4, 0x7b, 0xff, 0x87, 0xbf, 0x27, ++ 0xf2, 0x7d, 0xc5, 0x3a, 0xc5, 0x77, 0x24, 0x39, 0x72, 0xff, 0x45, 0xfc, ++ 0xbb, 0xa5, 0xfc, 0xbc, 0xee, 0xc8, 0x68, 0xb2, 0x31, 0x8a, 0xc5, 0xa5, ++ 0x3c, 0x31, 0x14, 0xfe, 0x47, 0x5b, 0x7a, 0x63, 0x5c, 0x2d, 0x35, 0xd9, ++ 0xc6, 0xfa, 0xb7, 0xd0, 0x7e, 0x0a, 0x43, 0xfd, 0x08, 0x38, 0x8a, 0xfe, ++ 0xc4, 0xb8, 0xcb, 0x40, 0x9e, 0x02, 0x9f, 0xd5, 0x31, 0x7f, 0xa9, 0x68, ++ 0x2f, 0x49, 0x66, 0xfc, 0x9b, 0x8e, 0xb3, 0x1e, 0xc7, 0xe9, 0xe9, 0x64, ++ 0xe7, 0x50, 0x27, 0xa7, 0xe5, 0xc3, 0xbe, 0xd1, 0xfd, 0xd2, 0xf2, 0xfd, ++ 0xd2, 0x32, 0xbb, 0x73, 0x3b, 0x9b, 0x1f, 0xed, 0xd7, 0x9a, 0x87, 0x7c, ++ 0xbd, 0x3f, 0xf8, 0xbb, 0x8f, 0xde, 0xa4, 0xef, 0x67, 0x85, 0xe6, 0xad, ++ 0xc6, 0x8f, 0xfb, 0x38, 0x7e, 0x2c, 0xad, 0x67, 0xf1, 0xc4, 0xa0, 0xb5, ++ 0x07, 0xe2, 0xd1, 0xc8, 0x68, 0xa6, 0xe7, 0x91, 0x42, 0xe5, 0x3a, 0xb6, ++ 0x27, 0x33, 0xbe, 0xbf, 0x2d, 0xd9, 0xca, 0xf0, 0xa2, 0x63, 0x3f, 0x92, ++ 0x24, 0x1c, 0xa7, 0x9e, 0xc3, 0x31, 0x8d, 0xc2, 0x3d, 0xf7, 0x9b, 0xaf, ++ 0x7b, 0x1e, 0x9f, 0xcf, 0x3f, 0x7b, 0xdd, 0x61, 0xfb, 0xe5, 0x84, 0xfc, ++ 0xbe, 0xa3, 0xcd, 0x77, 0xed, 0x08, 0x5f, 0x8f, 0xc8, 0xcf, 0x16, 0xfd, ++ 0x5c, 0x59, 0xa7, 0xfa, 0x6e, 0x10, 0xcb, 0x93, 0xaa, 0xb6, 0xf5, 0xc0, ++ 0xef, 0x1e, 0x8d, 0x22, 0x46, 0x7c, 0x4e, 0x76, 0x74, 0x7c, 0x97, 0x95, ++ 0xc7, 0xf4, 0x4b, 0xd0, 0x3b, 0xc5, 0x7d, 0x0c, 0xc4, 0x33, 0x02, 0x9d, ++ 0x04, 0x95, 0x9c, 0x6b, 0x74, 0xdc, 0xaf, 0xd0, 0xc8, 0xf3, 0x05, 0x3b, ++ 0xd6, 0x37, 0xa1, 0x90, 0xaf, 0xcf, 0xc2, 0xd7, 0x67, 0x31, 0x86, 0xdd, ++ 0xab, 0xd0, 0x41, 0x8f, 0xa7, 0x83, 0x19, 0x53, 0xcc, 0x9d, 0xf1, 0xb7, ++ 0x03, 0xee, 0x1d, 0xfd, 0xf5, 0x2d, 0xe0, 0xfd, 0x29, 0xe8, 0x3a, 0x52, ++ 0x7f, 0x40, 0x1f, 0x5d, 0xed, 0xc7, 0x4f, 0xff, 0xd9, 0x78, 0x28, 0xe6, ++ 0xa9, 0x82, 0x67, 0x07, 0x9c, 0x55, 0xf3, 0x13, 0xf0, 0x04, 0x7a, 0xc6, ++ 0xef, 0xfa, 0x2a, 0xf1, 0x51, 0xcc, 0x73, 0x43, 0xc7, 0x3e, 0xaa, 0xe8, ++ 0x3a, 0xeb, 0x5b, 0x8e, 0x57, 0xcc, 0xbe, 0xab, 0x7a, 0x90, 0xe7, 0xfd, ++ 0xda, 0x95, 0xf8, 0x5c, 0xd5, 0x94, 0xa5, 0x81, 0x78, 0xb9, 0xf8, 0x6e, ++ 0x2c, 0xf8, 0xd8, 0x13, 0x42, 0xfe, 0xb6, 0x7d, 0xc9, 0xdc, 0x6e, 0x4b, ++ 0x23, 0x69, 0x5d, 0xe4, 0xbb, 0xbd, 0x91, 0x9c, 0x10, 0xd1, 0x4f, 0x87, ++ 0xcf, 0xd5, 0x76, 0x5b, 0xbb, 0x95, 0xe5, 0x39, 0xab, 0xfd, 0x06, 0xed, ++ 0x09, 0x0e, 0x3f, 0x9c, 0xc3, 0xf3, 0x5c, 0x63, 0xe7, 0xcf, 0x87, 0xaa, ++ 0xf4, 0x0d, 0x88, 0xbf, 0xec, 0x35, 0x85, 0xbe, 0x0b, 0xc9, 0x13, 0x65, ++ 0xdd, 0x90, 0xc2, 0xf8, 0x5b, 0x67, 0x3f, 0x50, 0x10, 0xcf, 0xcb, 0x16, ++ 0x1a, 0x4a, 0x5e, 0xb3, 0x3b, 0x28, 0xba, 0x24, 0x2f, 0x43, 0xfe, 0x5d, ++ 0x18, 0x5b, 0xb2, 0x2a, 0x8b, 0xd6, 0x3f, 0x4a, 0xae, 0x44, 0x7e, 0x5d, ++ 0xd8, 0xbd, 0xe4, 0xcb, 0x2c, 0xca, 0xbf, 0xff, 0x98, 0x5c, 0xc5, 0xea, ++ 0xf7, 0x94, 0x7c, 0x99, 0x0d, 0xf5, 0xad, 0x55, 0xec, 0xfd, 0x91, 0xce, ++ 0xd7, 0x80, 0xbf, 0x13, 0x4f, 0xd5, 0x84, 0x51, 0x29, 0x21, 0xfd, 0xe1, ++ 0x5c, 0xb2, 0x9d, 0xe9, 0x1f, 0xa5, 0x1a, 0x02, 0x78, 0x64, 0x90, 0x57, ++ 0x38, 0x40, 0x4e, 0x0a, 0x78, 0x76, 0x55, 0x16, 0x1a, 0x34, 0xb5, 0x11, ++ 0xcf, 0xb5, 0x76, 0xe0, 0x01, 0x8b, 0x4f, 0x0c, 0xe2, 0xf2, 0x79, 0x90, ++ 0xb0, 0xcb, 0x03, 0x5a, 0x85, 0x5d, 0xde, 0x1e, 0xc3, 0xce, 0x13, 0xb7, ++ 0x83, 0x3c, 0xa5, 0xeb, 0x0d, 0x26, 0xbb, 0xaf, 0x00, 0xfc, 0x6b, 0xa2, ++ 0x5b, 0xe7, 0x64, 0xd1, 0xae, 0x1e, 0x8e, 0xfe, 0x44, 0x0f, 0xfa, 0x90, ++ 0xe4, 0xa4, 0xfa, 0x06, 0xf8, 0x39, 0xec, 0x16, 0x32, 0x0b, 0xf2, 0xe7, ++ 0x5a, 0x37, 0xb9, 0x40, 0x3f, 0x22, 0xcb, 0x1c, 0x46, 0x2d, 0xc2, 0x93, ++ 0xfb, 0x9d, 0xe8, 0xda, 0x6e, 0xd1, 0x7e, 0x0e, 0x1c, 0x7a, 0xe9, 0xa1, ++ 0xee, 0x6c, 0x18, 0x17, 0xcc, 0x63, 0x30, 0xa7, 0xff, 0x9a, 0x43, 0x7f, ++ 0xff, 0x0a, 0xe2, 0xa2, 0x35, 0x57, 0x4c, 0x0e, 0x50, 0xff, 0x06, 0xb7, ++ 0x3c, 0xb3, 0x0a, 0xf4, 0xab, 0xc1, 0x2d, 0xef, 0xfc, 0x9d, 0xc9, 0x5b, ++ 0x76, 0x2e, 0x43, 0xcc, 0x7b, 0x30, 0xf8, 0x0f, 0xe9, 0xf3, 0x41, 0xcd, ++ 0x06, 0x9c, 0xff, 0xe0, 0x96, 0xbb, 0x16, 0xc1, 0xfb, 0x43, 0x7f, 0xd7, ++ 0xd2, 0x03, 0xf0, 0x63, 0xf8, 0x39, 0x5f, 0x3d, 0xb0, 0x83, 0xf6, 0x83, ++ 0xbf, 0xe9, 0xae, 0x38, 0x8f, 0x41, 0xbe, 0x90, 0xbe, 0xcd, 0x79, 0x8c, ++ 0x0e, 0x78, 0x7c, 0x4e, 0x95, 0xa7, 0x58, 0x84, 0x87, 0x29, 0x05, 0xe1, ++ 0x71, 0x13, 0xf3, 0xa2, 0xda, 0x12, 0x4e, 0x6d, 0x08, 0xa0, 0x9e, 0xa6, ++ 0x3c, 0xf7, 0x42, 0xf5, 0x72, 0x8c, 0xaf, 0x5e, 0x27, 0xdd, 0x1c, 0x10, ++ 0x27, 0x10, 0xe7, 0xb4, 0xd5, 0xfe, 0xca, 0xb3, 0xe5, 0x74, 0x7d, 0xf4, ++ 0xf9, 0xf0, 0x20, 0x9d, 0x41, 0x98, 0xbe, 0x3c, 0xf2, 0x06, 0xb5, 0xeb, ++ 0xc3, 0xf4, 0xec, 0x62, 0x62, 0x55, 0xd4, 0x4b, 0x8d, 0x29, 0x8a, 0xf7, ++ 0xcb, 0x2c, 0x59, 0x8a, 0xf6, 0x31, 0xc9, 0x77, 0x29, 0xda, 0xc7, 0xd9, ++ 0xf3, 0x15, 0xf5, 0xf1, 0x7d, 0x06, 0x2b, 0xde, 0x9f, 0xe8, 0x28, 0x56, ++ 0xd4, 0xef, 0x1b, 0x34, 0x4e, 0xf1, 0x7e, 0xb9, 0xb3, 0x5c, 0x51, 0xcf, ++ 0xf7, 0x35, 0x2a, 0xde, 0xef, 0x7f, 0xa2, 0x59, 0xd9, 0x7e, 0xda, 0x8e, ++ 0xfb, 0xd0, 0xff, 0x9c, 0xab, 0x14, 0xf4, 0x78, 0x87, 0xdf, 0x5d, 0x0f, ++ 0xe5, 0xc0, 0xd6, 0x86, 0xd2, 0x58, 0x3b, 0xe9, 0xe4, 0xa7, 0x2d, 0x0c, ++ 0x78, 0xeb, 0xe1, 0xf9, 0xd0, 0x9b, 0xb5, 0x45, 0x3e, 0x12, 0xe1, 0xbc, ++ 0xca, 0x32, 0x37, 0xfa, 0xf7, 0x3b, 0x9d, 0x57, 0x29, 0x66, 0xe7, 0xd7, ++ 0xdb, 0x34, 0xec, 0xbc, 0x86, 0xf0, 0xcb, 0x0e, 0x36, 0xb9, 0x8b, 0x61, ++ 0x9f, 0xde, 0x96, 0x28, 0xd8, 0x29, 0xb0, 0x47, 0x18, 0x83, 0x71, 0xb0, ++ 0x5f, 0x65, 0x73, 0x9f, 0xc0, 0xfc, 0xa8, 0xeb, 0x41, 0x82, 0x7e, 0xac, ++ 0x26, 0x7d, 0xe0, 0x47, 0x43, 0x41, 0xce, 0xcf, 0x96, 0x51, 0xef, 0x6d, ++ 0xe2, 0x79, 0x35, 0x4d, 0xd3, 0x73, 0x31, 0xdf, 0xfd, 0xac, 0x14, 0xd8, ++ 0x07, 0xf1, 0x79, 0xcf, 0x6c, 0x76, 0x1e, 0x60, 0x38, 0xd5, 0x70, 0x71, ++ 0xdd, 0x10, 0xd3, 0x94, 0x60, 0x9f, 0xdc, 0x8a, 0x75, 0x17, 0x93, 0xa5, ++ 0xaa, 0x7d, 0x5a, 0xa1, 0xa8, 0x97, 0x59, 0x1e, 0x54, 0xbc, 0x3f, 0x26, ++ 0x79, 0x9d, 0xa2, 0x7d, 0x9c, 0xfd, 0x31, 0xd5, 0x3e, 0x6d, 0x51, 0xd4, ++ 0x27, 0x3a, 0x9e, 0x51, 0xed, 0xd3, 0x76, 0xd5, 0x3e, 0xbd, 0xa4, 0x68, ++ 0x1f, 0x7e, 0x21, 0x50, 0x0f, 0x64, 0x34, 0xb2, 0xd5, 0x23, 0x9b, 0xe9, ++ 0xfc, 0x87, 0x9c, 0x6d, 0x28, 0x85, 0x7d, 0x19, 0x7a, 0xce, 0x33, 0x1b, ++ 0xe8, 0xa5, 0xd0, 0xe7, 0xae, 0x07, 0x76, 0x58, 0x74, 0xb4, 0xf6, 0x08, ++ 0x94, 0x3e, 0x6a, 0x4f, 0x81, 0x7f, 0xea, 0xad, 0xba, 0x64, 0x2c, 0x8f, ++ 0xd6, 0xd9, 0xd1, 0xbf, 0x74, 0xbc, 0xae, 0x0f, 0x96, 0x27, 0xea, 0x1c, ++ 0xf8, 0xfc, 0xb7, 0x75, 0x83, 0xb0, 0x7c, 0xb7, 0xce, 0x89, 0xe5, 0x7f, ++ 0xd6, 0x8d, 0xc5, 0xd2, 0x5f, 0xe7, 0xc2, 0xb2, 0xb1, 0xae, 0x11, 0xdf, ++ 0xdf, 0x5b, 0xd7, 0x8c, 0x25, 0x85, 0x60, 0x3a, 0xc8, 0x8b, 0xf8, 0xb8, ++ 0x8e, 0x7b, 0x13, 0xd2, 0xc1, 0x8e, 0x6f, 0xd3, 0x04, 0xaa, 0x21, 0x82, ++ 0xfa, 0xfd, 0x67, 0x0e, 0x22, 0x5f, 0x6c, 0xeb, 0x16, 0x68, 0x83, 0xfa, ++ 0xc3, 0xa4, 0x65, 0xc2, 0x28, 0x5a, 0x9f, 0x0f, 0xc6, 0x14, 0xe8, 0x57, ++ 0x50, 0xd2, 0xfd, 0xf4, 0xa4, 0x3a, 0xff, 0x2b, 0x05, 0xf2, 0x29, 0x52, ++ 0xd8, 0x73, 0x91, 0x97, 0xd0, 0xa8, 0x71, 0xe6, 0x83, 0x7e, 0xfd, 0xf8, ++ 0x33, 0xc7, 0x36, 0x6b, 0xd3, 0x09, 0x79, 0x64, 0x9d, 0x2b, 0xd9, 0x62, ++ 0x65, 0x75, 0x23, 0xad, 0xe3, 0x66, 0x43, 0x1f, 0x9e, 0x63, 0x9b, 0x9d, ++ 0x69, 0x84, 0xfc, 0x0a, 0x44, 0xc6, 0x10, 0xac, 0x4f, 0x80, 0x7a, 0x7b, ++ 0x14, 0x6b, 0xdf, 0xf0, 0xcc, 0xb1, 0x09, 0x1e, 0x9c, 0x1f, 0x8b, 0x1f, ++ 0x4f, 0x09, 0xc5, 0x8f, 0x1f, 0x4f, 0x89, 0x10, 0x3f, 0xfe, 0xd5, 0x25, ++ 0xbb, 0x19, 0xfc, 0x28, 0xa7, 0x6e, 0xf6, 0x36, 0xc3, 0xba, 0x4e, 0x71, ++ 0xbf, 0x91, 0x93, 0xe4, 0xeb, 0xe6, 0xd1, 0xb2, 0x58, 0x9b, 0xaf, 0x03, ++ 0xb9, 0x78, 0x56, 0xa5, 0x47, 0x88, 0xb2, 0x46, 0x53, 0xfc, 0x24, 0xe0, ++ 0x69, 0xa3, 0xc6, 0x31, 0x15, 0xf3, 0x80, 0xef, 0xd5, 0x11, 0xc8, 0x3b, ++ 0x9f, 0x2c, 0x31, 0x7b, 0xb4, 0x43, 0x0f, 0x4c, 0x65, 0xf2, 0xa8, 0x7d, ++ 0xa2, 0x01, 0xed, 0x9d, 0xd3, 0x1a, 0xe7, 0x22, 0xcc, 0x6f, 0x92, 0x82, ++ 0xcf, 0x03, 0xbc, 0x5e, 0x49, 0xf9, 0x10, 0xe1, 0xd7, 0x6e, 0x0e, 0x66, ++ 0x00, 0x1c, 0x7e, 0x99, 0x72, 0x86, 0xd5, 0x13, 0x82, 0xcf, 0x4b, 0x8e, ++ 0xb0, 0xba, 0x8e, 0xad, 0xf3, 0x85, 0x94, 0xd3, 0x5d, 0xad, 0x73, 0x37, ++ 0xcc, 0xa7, 0xd3, 0x3a, 0x53, 0xd8, 0x7d, 0x31, 0xc4, 0xe7, 0x4c, 0x07, ++ 0xf9, 0x2b, 0xea, 0xa7, 0xcb, 0x9d, 0x55, 0x20, 0x27, 0x4e, 0x17, 0x3b, ++ 0x7b, 0xc1, 0x7c, 0x4e, 0xb9, 0x0c, 0x48, 0x3f, 0x1e, 0x97, 0xd9, 0x0b, ++ 0xf9, 0x95, 0x44, 0xeb, 0x2c, 0x9a, 0x1a, 0xe6, 0x4f, 0xe9, 0x9d, 0xaa, ++ 0xc3, 0xef, 0xa6, 0xe8, 0x19, 0x9d, 0x91, 0x07, 0xe4, 0x88, 0xe7, 0xc4, ++ 0xcb, 0x52, 0x99, 0x9e, 0x85, 0xfb, 0x06, 0xf6, 0xdc, 0x8c, 0x68, 0xd4, ++ 0xc3, 0x4f, 0x6b, 0x22, 0x9f, 0xf3, 0x9e, 0xcd, 0xe1, 0x73, 0xb5, 0x5b, ++ 0x64, 0xff, 0xca, 0x1c, 0xde, 0x5e, 0x72, 0xbf, 0x19, 0xfb, 0x6b, 0x5f, ++ 0x1d, 0x85, 0xf1, 0xdb, 0x76, 0x57, 0x6f, 0xd4, 0x83, 0xda, 0x6b, 0x29, ++ 0x94, 0x28, 0x7d, 0xb4, 0x5f, 0xaa, 0xbd, 0xf6, 0x3a, 0xb6, 0x1b, 0x44, ++ 0x68, 0x0b, 0xe3, 0x94, 0x33, 0x39, 0x9f, 0xfa, 0x55, 0xcb, 0xaa, 0xbf, ++ 0x9e, 0xa1, 0xef, 0x7f, 0xb2, 0x3a, 0xda, 0x81, 0x3c, 0xdc, 0x72, 0x37, ++ 0xca, 0xa7, 0x07, 0xf8, 0xcb, 0xb3, 0xe3, 0x8c, 0xa8, 0xb7, 0xcc, 0x9e, ++ 0x9c, 0x5e, 0x02, 0x72, 0x69, 0x26, 0x8f, 0x77, 0xcd, 0x31, 0x6b, 0x13, ++ 0x31, 0xec, 0xa5, 0xb5, 0xea, 0xe1, 0x0a, 0xa0, 0x85, 0xa6, 0xfc, 0x0d, ++ 0x20, 0xfe, 0x17, 0xc7, 0x97, 0xeb, 0xad, 0xb4, 0x5e, 0x91, 0xb6, 0x62, ++ 0x03, 0x94, 0xcb, 0x7a, 0x6e, 0xd1, 0xc3, 0x91, 0xcf, 0xca, 0xbe, 0x7b, ++ 0x36, 0x80, 0xfa, 0x58, 0x45, 0x49, 0xab, 0x08, 0xed, 0xa5, 0xc0, 0x7b, ++ 0x75, 0x74, 0x5e, 0x73, 0xd7, 0xc8, 0x76, 0x66, 0x3f, 0x89, 0x73, 0x86, ++ 0xcb, 0xbf, 0x51, 0x7e, 0x85, 0xc0, 0xc3, 0xd3, 0x3c, 0x4f, 0x86, 0xc2, ++ 0x17, 0xed, 0xc2, 0xb9, 0xa9, 0x92, 0xc2, 0x2e, 0x99, 0x9b, 0xca, 0xf4, ++ 0x86, 0x6b, 0x29, 0x5c, 0x6f, 0xcb, 0x25, 0xb9, 0xb7, 0x94, 0x71, 0x9c, ++ 0x3f, 0x03, 0x3d, 0xb4, 0xce, 0x7e, 0x2f, 0xa7, 0x0b, 0x7f, 0xbb, 0xb2, ++ 0x9d, 0xeb, 0x6d, 0x1f, 0xea, 0xd9, 0xb8, 0xea, 0x7b, 0x26, 0xc4, 0xb8, ++ 0x6e, 0x3e, 0x8f, 0xd3, 0x7a, 0xe2, 0x94, 0x40, 0x8f, 0x7b, 0xc0, 0x8c, ++ 0xf8, 0x91, 0x37, 0xfd, 0xcb, 0x87, 0x8b, 0xe8, 0xfa, 0xf3, 0x5a, 0x2c, ++ 0x1a, 0x8c, 0xc3, 0x0b, 0x3e, 0xee, 0x67, 0xf7, 0x7d, 0x15, 0x5d, 0x70, ++ 0x23, 0x9f, 0x1b, 0xd8, 0x1a, 0x78, 0xf1, 0x0c, 0x41, 0x3c, 0x6f, 0x06, ++ 0x3a, 0xb9, 0x93, 0x9c, 0xba, 0xdf, 0xb3, 0x0e, 0xe5, 0xc3, 0xe0, 0xbf, ++ 0x50, 0xf9, 0x03, 0x7c, 0xf1, 0xa6, 0xfb, 0x93, 0x33, 0xd8, 0x1a, 0x1f, ++ 0xf1, 0xfc, 0xa5, 0xaf, 0xae, 0x82, 0xf3, 0xc7, 0x5a, 0xe4, 0x6b, 0x47, ++ 0xeb, 0xd6, 0x60, 0xfd, 0x78, 0x9d, 0x07, 0xcb, 0x13, 0x75, 0x1b, 0x39, ++ 0x7f, 0x6c, 0xc0, 0xf6, 0x77, 0xeb, 0xb6, 0x72, 0xfe, 0xe8, 0xe5, 0xfc, ++ 0x71, 0x37, 0x3e, 0x6f, 0xa9, 0x9b, 0x8e, 0xe5, 0xa1, 0x3a, 0x37, 0x96, ++ 0x49, 0x31, 0xae, 0xc4, 0x54, 0xa0, 0x0b, 0xa3, 0x1b, 0xf3, 0x31, 0x8f, ++ 0x3d, 0x63, 0x20, 0x32, 0xc4, 0x19, 0x5a, 0x0c, 0x88, 0xa7, 0x94, 0x02, ++ 0x9e, 0x7f, 0x36, 0x1e, 0xf2, 0x5f, 0x0c, 0x16, 0x38, 0x67, 0xa7, 0xce, ++ 0x83, 0x51, 0xf3, 0xdb, 0x8e, 0xfd, 0x6f, 0xea, 0x74, 0x8f, 0x45, 0x76, ++ 0x6a, 0x51, 0x58, 0xde, 0x0b, 0xe8, 0x67, 0x99, 0x5d, 0xe3, 0xcf, 0x29, ++ 0x62, 0x37, 0x03, 0x3f, 0x19, 0xb2, 0x2d, 0x65, 0x22, 0xf0, 0x8f, 0x53, ++ 0x76, 0xbb, 0x19, 0xf4, 0xd6, 0xa1, 0xa9, 0xa9, 0xac, 0xee, 0xb4, 0x9b, ++ 0x75, 0xb4, 0x3e, 0x6c, 0x1b, 0xaf, 0xbb, 0xed, 0x66, 0x03, 0xad, 0x0f, ++ 0x4f, 0xed, 0x3e, 0x11, 0xf4, 0xde, 0x53, 0x1e, 0xbb, 0x39, 0x8a, 0xd6, ++ 0x47, 0x6c, 0xeb, 0xce, 0xda, 0xbd, 0x04, 0x83, 0xd4, 0xa5, 0xdb, 0xec, ++ 0x13, 0x81, 0xff, 0x14, 0x13, 0xe9, 0x28, 0xd0, 0x43, 0xa9, 0x31, 0x6b, ++ 0x14, 0xa4, 0xc8, 0x96, 0x59, 0x8a, 0x8f, 0x02, 0x1d, 0x8c, 0x49, 0x9e, ++ 0x37, 0x0a, 0xe8, 0x60, 0x6f, 0x8a, 0x1d, 0xf1, 0x61, 0x9c, 0x7d, 0xdd, ++ 0x51, 0xa8, 0x8f, 0xef, 0xb3, 0x5d, 0x0b, 0x47, 0x6b, 0x9c, 0xa6, 0xfc, ++ 0xf5, 0xf0, 0x5d, 0x49, 0x7c, 0xb9, 0x16, 0xbe, 0x1b, 0x95, 0xb6, 0x62, ++ 0x3d, 0x7c, 0x37, 0xba, 0xe7, 0x16, 0x6d, 0xf8, 0x77, 0x63, 0xfb, 0xee, ++ 0x59, 0x0f, 0xf5, 0x09, 0x8e, 0xed, 0x5a, 0xd0, 0x07, 0xf7, 0xa6, 0xb0, ++ 0xf8, 0xa7, 0xe8, 0x47, 0xd4, 0x45, 0xbb, 0xe0, 0xaf, 0x22, 0x4f, 0xab, ++ 0x5f, 0x8b, 0x0b, 0xf9, 0x78, 0x5e, 0xb3, 0x0b, 0xf9, 0x78, 0x87, 0x3f, ++ 0x62, 0x4a, 0xf9, 0x23, 0xe0, 0xa7, 0xab, 0x69, 0x96, 0x2c, 0x12, 0xcc, ++ 0x63, 0x8a, 0xd4, 0x11, 0x7c, 0x87, 0x5c, 0xb8, 0xea, 0x9b, 0x94, 0x5a, ++ 0x28, 0x9f, 0x9d, 0xbc, 0xed, 0x1e, 0xf3, 0x3a, 0x4a, 0x5f, 0x35, 0x50, ++ 0x1f, 0x82, 0xf5, 0x27, 0xd6, 0x45, 0xe6, 0xbb, 0xd3, 0x52, 0x23, 0xf0, ++ 0xdd, 0xdf, 0x73, 0x3a, 0x05, 0xb9, 0x09, 0xf9, 0xcf, 0xbf, 0xd7, 0xb3, ++ 0x7b, 0x38, 0x7e, 0xc3, 0xd7, 0x57, 0xd3, 0x32, 0xcf, 0x3c, 0x0f, 0xed, ++ 0x19, 0xb7, 0x19, 0xe4, 0xeb, 0xc1, 0x14, 0x26, 0x27, 0x0f, 0x73, 0xf9, ++ 0xf8, 0x67, 0x5e, 0x7e, 0xc5, 0x9f, 0xd7, 0x68, 0x9c, 0xf3, 0x60, 0xff, ++ 0x2b, 0x52, 0x79, 0xdc, 0xb6, 0x33, 0x5d, 0x57, 0xc2, 0x3c, 0x28, 0xdd, ++ 0xaa, 0xce, 0x05, 0x74, 0xd1, 0xce, 0xe9, 0xba, 0x3a, 0x95, 0xcb, 0x07, ++ 0x7e, 0xdf, 0x41, 0x15, 0x61, 0xe7, 0x87, 0xee, 0x94, 0xaf, 0xb5, 0x34, ++ 0xdc, 0x7e, 0xcb, 0x82, 0xbc, 0x9c, 0xc6, 0xe3, 0x90, 0x27, 0xaa, 0xce, ++ 0x7f, 0x10, 0xf9, 0x8d, 0xea, 0xbc, 0x5f, 0xca, 0x17, 0xf1, 0x5e, 0x17, ++ 0xd2, 0xac, 0xcc, 0x1b, 0xed, 0xb0, 0x3f, 0xba, 0x31, 0xbe, 0x07, 0xc7, ++ 0x15, 0xc1, 0xe8, 0x78, 0x34, 0xb5, 0x4b, 0x7e, 0xf6, 0xf8, 0x1d, 0xd6, ++ 0xfd, 0x78, 0xa4, 0x75, 0x2f, 0x25, 0x2c, 0x9f, 0x59, 0xbd, 0x0e, 0xe2, ++ 0x4e, 0x40, 0xda, 0x12, 0xf9, 0xcd, 0x9d, 0xd7, 0x13, 0x88, 0xbc, 0x9e, ++ 0x4e, 0xeb, 0x68, 0x50, 0xdc, 0xbf, 0x20, 0xfc, 0xec, 0x54, 0x0f, 0x7a, ++ 0x16, 0xe6, 0x53, 0x36, 0xd7, 0x4c, 0xc0, 0x7f, 0x13, 0xce, 0x27, 0xce, ++ 0xdc, 0x86, 0x4f, 0xa8, 0xf9, 0xce, 0x3f, 0x8b, 0x9f, 0xdd, 0x86, 0xdf, ++ 0x34, 0xc2, 0x3c, 0xd5, 0xfc, 0x46, 0x9c, 0x6f, 0x56, 0x97, 0x42, 0x9f, ++ 0x83, 0x73, 0x51, 0x90, 0x6f, 0x07, 0xf7, 0xb4, 0x80, 0x9f, 0xfe, 0xa1, ++ 0x44, 0xf7, 0x01, 0xc0, 0xdb, 0xf6, 0x92, 0xe0, 0x57, 0x1a, 0xb0, 0xcf, ++ 0xe2, 0x03, 0x88, 0x67, 0x69, 0x56, 0xf7, 0x21, 0x78, 0x2e, 0xe9, 0x59, ++ 0xdc, 0x5d, 0xe4, 0xb1, 0x5e, 0xd2, 0x78, 0x7e, 0x0d, 0x7a, 0xd1, 0x6f, ++ 0xb7, 0x2d, 0x42, 0x3e, 0xd4, 0x06, 0xc2, 0x81, 0xd2, 0xe3, 0x5b, 0xb4, ++ 0x0e, 0xfe, 0xd3, 0x61, 0x16, 0xd7, 0x51, 0x98, 0x17, 0xe9, 0xc3, 0xf0, ++ 0xa7, 0xab, 0xfc, 0xcc, 0x77, 0xb8, 0x1e, 0xd2, 0xb9, 0x64, 0x74, 0x25, ++ 0xf2, 0x14, 0xdb, 0xb7, 0xff, 0x3d, 0x03, 0xfd, 0x58, 0x77, 0xc0, 0xf7, ++ 0xae, 0xe0, 0x50, 0x26, 0x0f, 0x0b, 0x40, 0xfe, 0xff, 0xf5, 0x41, 0xd1, ++ 0xa8, 0xf2, 0xb4, 0x4a, 0xc4, 0x27, 0x15, 0x40, 0x9e, 0x75, 0x22, 0xea, ++ 0x11, 0xad, 0xe9, 0x7a, 0x2d, 0x94, 0xff, 0x6c, 0x3b, 0xb1, 0x35, 0x3d, ++ 0x07, 0xfb, 0x57, 0xdb, 0x8b, 0xad, 0x29, 0x83, 0x8c, 0x6c, 0xdc, 0xd1, ++ 0x63, 0xa1, 0x6c, 0xd6, 0xbb, 0xb7, 0xce, 0x03, 0x3b, 0x69, 0xb0, 0x01, ++ 0xed, 0xa4, 0xf7, 0x79, 0x7e, 0xdf, 0xa4, 0xf3, 0x37, 0xe3, 0x41, 0x5e, ++ 0x4d, 0x92, 0x7d, 0x89, 0x79, 0x52, 0x67, 0x3b, 0xb3, 0xf5, 0xe4, 0xac, ++ 0x12, 0x7b, 0x5e, 0x67, 0x7b, 0x93, 0xae, 0x6f, 0x14, 0xac, 0xef, 0x4e, ++ 0x76, 0xa7, 0xcb, 0xe8, 0xb7, 0x01, 0x18, 0xd5, 0xf6, 0x67, 0xe5, 0x9a, ++ 0xaf, 0x08, 0xe4, 0x43, 0x0f, 0x5d, 0x73, 0x93, 0xc0, 0x7d, 0x63, 0x77, ++ 0xb6, 0x47, 0x89, 0x0c, 0x6c, 0xa2, 0xe0, 0xac, 0xe3, 0x08, 0x94, 0x45, ++ 0x17, 0x9c, 0x98, 0x86, 0x33, 0xe0, 0x52, 0xed, 0x11, 0x28, 0x07, 0xff, ++ 0x85, 0x99, 0xe7, 0x77, 0xca, 0x27, 0x1a, 0x72, 0xa3, 0xf1, 0x08, 0x3b, ++ 0x0e, 0xde, 0x57, 0x79, 0xbf, 0xc2, 0xa0, 0x77, 0x98, 0xbd, 0xca, 0xcb, ++ 0x4e, 0xf7, 0xb0, 0x2d, 0xf3, 0x28, 0xf3, 0xd4, 0x8a, 0x7d, 0x45, 0x98, ++ 0x3f, 0x21, 0x07, 0x62, 0xa0, 0xbc, 0x26, 0x05, 0xd0, 0xef, 0x25, 0x6b, ++ 0xd8, 0xbd, 0x0b, 0xe2, 0xbe, 0x05, 0x6a, 0xc7, 0xa6, 0x76, 0x4f, 0x00, ++ 0xbb, 0x97, 0xe5, 0x4b, 0x8d, 0x84, 0x3c, 0x23, 0x3a, 0xb9, 0xb2, 0x1f, ++ 0x7c, 0x34, 0xe7, 0x21, 0xa4, 0xfb, 0x28, 0xd4, 0x7f, 0x3a, 0xec, 0xd8, ++ 0xd7, 0x35, 0x98, 0x1f, 0xd0, 0xa4, 0x75, 0xc6, 0x0e, 0x07, 0x3b, 0x76, ++ 0x4d, 0x2f, 0xc7, 0x3a, 0x5a, 0xff, 0x93, 0x3f, 0xe1, 0x67, 0x07, 0x68, ++ 0x59, 0x63, 0xf9, 0x8a, 0x84, 0xdf, 0xcf, 0x56, 0xb9, 0xe6, 0xba, 0xa2, ++ 0xde, 0xba, 0x2e, 0x74, 0xbf, 0x0f, 0xe4, 0x41, 0x57, 0xfe, 0x8f, 0x8c, ++ 0x72, 0xa7, 0x92, 0x90, 0x8d, 0xb0, 0x5f, 0x95, 0xe4, 0x2d, 0xfd, 0xca, ++ 0x30, 0x39, 0x48, 0x1a, 0xff, 0xdc, 0x01, 0xf7, 0x7e, 0x94, 0xcf, 0x95, ++ 0x03, 0xe0, 0xd0, 0xae, 0xd2, 0x4e, 0x72, 0xd2, 0xf7, 0xca, 0xb9, 0xbd, ++ 0x41, 0x3c, 0x8f, 0xb0, 0x3a, 0xb7, 0xb3, 0x08, 0xf9, 0x7c, 0xa2, 0x93, ++ 0xf6, 0x5b, 0x9e, 0xc0, 0xdf, 0x27, 0x33, 0x58, 0x7b, 0xba, 0x68, 0x7f, ++ 0x80, 0xd5, 0x7b, 0x89, 0xfe, 0xf6, 0x4f, 0xc4, 0x7a, 0x8a, 0xa8, 0xf3, ++ 0xfe, 0xee, 0x12, 0xf5, 0x2d, 0xac, 0x9e, 0x25, 0xbe, 0xdf, 0xcb, 0xea, ++ 0xb9, 0x62, 0xfc, 0xf7, 0xd9, 0x78, 0x66, 0xf6, 0x7e, 0x69, 0xf7, 0xef, ++ 0x4d, 0x02, 0xfd, 0x43, 0xf0, 0xf7, 0x71, 0xdd, 0x95, 0xf7, 0xf2, 0x50, ++ 0x7e, 0x3f, 0xb1, 0xfb, 0xed, 0xf3, 0x49, 0x94, 0xed, 0x5c, 0x1e, 0x88, ++ 0x7b, 0x78, 0xca, 0x7e, 0x30, 0x2e, 0xfa, 0x3d, 0xa0, 0xe7, 0x46, 0x09, ++ 0x73, 0xdf, 0x2a, 0xd7, 0xea, 0xd0, 0xbf, 0x7d, 0xd5, 0xd6, 0x98, 0x17, ++ 0x7e, 0x1e, 0x59, 0xe4, 0x9f, 0xb8, 0x4a, 0xcd, 0x4e, 0xd0, 0xf7, 0xaa, ++ 0xf6, 0xf5, 0xde, 0x21, 0xf3, 0x7c, 0x1c, 0xd0, 0x37, 0x7e, 0xc4, 0xe3, ++ 0xca, 0x65, 0xb2, 0x09, 0xe3, 0x11, 0xd7, 0x37, 0x33, 0x3e, 0xdf, 0x95, ++ 0xbe, 0xb6, 0x78, 0xcd, 0x1b, 0x8a, 0xfd, 0xec, 0xd4, 0xce, 0xef, 0x49, ++ 0xc6, 0x40, 0x1d, 0x1d, 0xef, 0xda, 0x13, 0x49, 0x98, 0xdf, 0x4e, 0x7a, ++ 0xfa, 0x31, 0x0e, 0xbe, 0xbc, 0xbb, 0x24, 0xe2, 0xed, 0x78, 0x9e, 0x55, ++ 0xe4, 0x7b, 0xc5, 0xf7, 0x20, 0x4e, 0xb0, 0x4f, 0xe3, 0x7f, 0x13, 0xc5, ++ 0xee, 0xa1, 0xbc, 0xe0, 0x47, 0xfe, 0xbb, 0xf8, 0x37, 0xcc, 0xdf, 0x5b, ++ 0xf5, 0xcc, 0x11, 0x94, 0x73, 0xf3, 0x65, 0x3b, 0xe2, 0xf1, 0xf1, 0x2c, ++ 0xf7, 0x0a, 0x80, 0x4f, 0x9b, 0x99, 0xdd, 0x37, 0xb8, 0x78, 0xcd, 0x21, ++ 0xa4, 0xd7, 0xb5, 0x99, 0x5c, 0x4f, 0xb0, 0x04, 0xfb, 0x86, 0xc3, 0xf3, ++ 0xc1, 0xce, 0xf0, 0xff, 0xe1, 0x1d, 0xe0, 0xff, 0xc3, 0x7f, 0x27, 0xfc, ++ 0xd5, 0x7e, 0x66, 0x71, 0x1e, 0x7a, 0xd9, 0x37, 0xcc, 0x4b, 0x6b, 0x33, ++ 0xb3, 0x38, 0xa8, 0x83, 0xef, 0xd3, 0x79, 0x8d, 0x7d, 0x00, 0x87, 0xd7, ++ 0xd3, 0x40, 0xe7, 0xd7, 0x16, 0xf9, 0x73, 0xac, 0x32, 0x24, 0x0d, 0xfb, ++ 0x13, 0x59, 0xbe, 0xd1, 0xbb, 0x45, 0x60, 0x07, 0x5d, 0xaf, 0x35, 0xe3, ++ 0xfd, 0x44, 0xb3, 0x56, 0x7d, 0x9c, 0x17, 0x7e, 0x1e, 0x45, 0x94, 0x6a, ++ 0xfd, 0xff, 0x73, 0xa0, 0xa3, 0x84, 0x10, 0xbc, 0x76, 0x75, 0xe7, 0xfa, ++ 0x5e, 0x08, 0xbe, 0x2f, 0xdd, 0x01, 0xbe, 0x2f, 0xfd, 0x3b, 0xe1, 0x9b, ++ 0xa4, 0x0d, 0xe8, 0x1d, 0x10, 0x37, 0x3d, 0xcb, 0xee, 0x0b, 0x1b, 0xe0, ++ 0x3f, 0xaf, 0x0f, 0xcf, 0x73, 0x39, 0xd9, 0x9d, 0xc9, 0xdd, 0xd8, 0x66, ++ 0x16, 0x27, 0x52, 0xe7, 0x6b, 0x9d, 0xec, 0x6e, 0x66, 0x78, 0xc5, 0xe3, ++ 0x31, 0x55, 0x93, 0xdf, 0x1d, 0x06, 0xf1, 0x18, 0x41, 0x0f, 0x23, 0xa3, ++ 0x49, 0x23, 0xf8, 0xd7, 0x29, 0x5e, 0x3b, 0x38, 0x5e, 0x3b, 0x00, 0xaf, ++ 0x05, 0xfe, 0x86, 0xe2, 0x32, 0xf4, 0xbb, 0x08, 0xf4, 0x15, 0xc2, 0x5f, ++ 0xc2, 0xec, 0x62, 0x0e, 0x27, 0x7f, 0x67, 0xbc, 0x3d, 0x7d, 0x07, 0xb8, ++ 0x9e, 0xfe, 0x77, 0xc2, 0xb5, 0x89, 0xea, 0xbf, 0x18, 0xc7, 0x7c, 0x3d, ++ 0x0a, 0xfd, 0x27, 0x6a, 0x38, 0xff, 0x8d, 0xd3, 0xbb, 0x80, 0xb7, 0x31, ++ 0xed, 0xf6, 0x70, 0x36, 0xa6, 0xfd, 0x6b, 0xe0, 0x6c, 0x4c, 0xb3, 0x2b, ++ 0xf2, 0xd2, 0x04, 0xbc, 0xbb, 0x92, 0x4f, 0xea, 0xfd, 0x11, 0xf3, 0x8e, ++ 0x40, 0xa7, 0x45, 0xdf, 0x86, 0x4e, 0x1f, 0x4d, 0xe7, 0x7c, 0x4a, 0x1b, ++ 0xc0, 0x3c, 0x51, 0xf5, 0xbe, 0xc7, 0xa6, 0x75, 0xda, 0xf7, 0xb8, 0xb4, ++ 0xdb, 0xef, 0xbb, 0xb2, 0xfd, 0x5f, 0xbc, 0xef, 0x6a, 0xb8, 0xa9, 0xcb, ++ 0x4a, 0x1e, 0xdf, 0x54, 0x3f, 0xcf, 0x4f, 0xd3, 0xfc, 0x4b, 0xe1, 0xf8, ++ 0xff, 0x9b, 0xff, 0x7c, 0x76, 0xed, 0x61, 0x45, 0xfb, 0xdc, 0x35, 0x27, ++ 0x15, 0xed, 0xf3, 0x3c, 0x1f, 0x28, 0xea, 0xc3, 0x02, 0xfe, 0x52, 0x40, ++ 0x73, 0xe1, 0x0f, 0x1f, 0x71, 0x29, 0x88, 0xfa, 0xe5, 0xb7, 0xf5, 0xab, ++ 0x77, 0xe5, 0x4f, 0x9f, 0xf4, 0xda, 0x12, 0x0d, 0xc4, 0xdb, 0x06, 0xf9, ++ 0x99, 0x3f, 0xbf, 0x2d, 0xdd, 0xbd, 0x01, 0xf0, 0xeb, 0x7d, 0x8d, 0xb7, ++ 0xde, 0x4c, 0xe1, 0x3a, 0xf0, 0x5c, 0x23, 0xbb, 0xa7, 0xab, 0x22, 0x07, ++ 0xf3, 0x87, 0x56, 0xf1, 0x39, 0x7e, 0x39, 0xec, 0x6f, 0x9f, 0x3c, 0x44, ++ 0xf1, 0xe6, 0x4b, 0x62, 0x40, 0x7f, 0xa7, 0xef, 0xf0, 0x5d, 0x5a, 0x7b, ++ 0x6e, 0x67, 0x3c, 0x28, 0xbe, 0xa1, 0x21, 0xce, 0xb0, 0x3c, 0xb4, 0x62, ++ 0xa3, 0x55, 0xeb, 0x44, 0x7f, 0x0d, 0x71, 0x46, 0xc2, 0x9b, 0xc7, 0xd3, ++ 0x18, 0xde, 0x61, 0xfe, 0x0f, 0xa5, 0xf7, 0xe9, 0x46, 0xa2, 0x8b, 0xa7, ++ 0x74, 0x3e, 0x7d, 0xba, 0x84, 0xf9, 0x4e, 0xd3, 0x09, 0xcb, 0x87, 0xa6, ++ 0xa5, 0xcf, 0x4d, 0xdb, 0x27, 0x69, 0x89, 0x0f, 0xee, 0x35, 0x2e, 0x37, ++ 0x69, 0x7d, 0x06, 0x8c, 0xf3, 0x29, 0xcf, 0x2f, 0x1b, 0xf8, 0xbd, 0xc7, ++ 0x24, 0x3e, 0x4e, 0x71, 0x8e, 0x59, 0x76, 0xca, 0x98, 0x97, 0x36, 0x75, ++ 0x10, 0x8b, 0x0f, 0x3e, 0x60, 0x6a, 0xc4, 0x73, 0xa4, 0x33, 0x4e, 0x3c, ++ 0x7c, 0xed, 0x21, 0xda, 0x4e, 0xd6, 0x7b, 0x8a, 0x58, 0xbe, 0xb5, 0x38, ++ 0x7f, 0xf6, 0x07, 0xcd, 0x37, 0x89, 0xfb, 0x3d, 0x9e, 0x46, 0x98, 0x9f, ++ 0x5d, 0xe2, 0x71, 0x64, 0x49, 0x87, 0xf7, 0x61, 0xa9, 0xbf, 0x9b, 0xcb, ++ 0xd7, 0x3b, 0x49, 0x5e, 0x27, 0x43, 0xbe, 0x4b, 0xf0, 0x03, 0x82, 0x7a, ++ 0xb7, 0xa0, 0x3b, 0xba, 0xbe, 0x13, 0x86, 0x02, 0x76, 0xbe, 0x02, 0x7e, ++ 0x77, 0xa2, 0x9c, 0xe8, 0x7c, 0xbd, 0xf1, 0x7c, 0xf3, 0x96, 0x52, 0x78, ++ 0xbf, 0xf2, 0xb4, 0x1d, 0xe1, 0x52, 0x33, 0x68, 0x5d, 0x1e, 0xec, 0x63, ++ 0xcd, 0x28, 0xe9, 0x53, 0x43, 0x5e, 0xc8, 0xae, 0xa9, 0x59, 0xf3, 0x17, ++ 0xec, 0xa7, 0x4c, 0x7e, 0xa5, 0x1e, 0xde, 0xbf, 0x7e, 0x96, 0xb9, 0xc2, ++ 0x07, 0xb6, 0x52, 0x3b, 0xc5, 0x1e, 0xee, 0xaf, 0x0c, 0xcc, 0x01, 0xba, ++ 0xbc, 0x93, 0xfd, 0x23, 0xe6, 0x7d, 0xae, 0xce, 0x87, 0xf8, 0xf4, 0x49, ++ 0xdd, 0x09, 0x2c, 0xdf, 0x1f, 0xf1, 0x4e, 0x11, 0xe8, 0x19, 0x81, 0x3a, ++ 0x7f, 0x44, 0xbf, 0xe4, 0xb7, 0xf5, 0x0f, 0x08, 0xbf, 0x80, 0xf0, 0x13, ++ 0x08, 0x3e, 0x20, 0xee, 0xe1, 0x7b, 0x3d, 0x8d, 0xf3, 0x05, 0xa3, 0xd4, ++ 0x1d, 0xef, 0x4f, 0xd3, 0xb2, 0x52, 0xf0, 0xcb, 0x03, 0x9d, 0xf9, 0xeb, ++ 0x9b, 0x77, 0xe0, 0xaf, 0x6f, 0xfe, 0x3b, 0xf9, 0xeb, 0xd7, 0xc5, 0xf3, ++ 0xca, 0x64, 0x26, 0x17, 0xd5, 0xf8, 0xad, 0xc6, 0x6b, 0x81, 0xcf, 0x70, ++ 0x5f, 0x37, 0xfc, 0xde, 0xc0, 0x03, 0x54, 0xdf, 0x03, 0xb9, 0x3a, 0x93, ++ 0x78, 0x72, 0x2b, 0x29, 0x9f, 0x9d, 0xbe, 0xa4, 0x41, 0x37, 0x54, 0xfa, ++ 0xf6, 0x78, 0xbd, 0xcc, 0x74, 0x21, 0x83, 0x44, 0x38, 0x67, 0xf2, 0xcd, ++ 0xf9, 0xb9, 0x1d, 0xf7, 0x4d, 0x2e, 0x95, 0xd1, 0x3e, 0x10, 0xf9, 0x09, ++ 0x62, 0x1f, 0xae, 0xa7, 0x75, 0xd2, 0x33, 0xbf, 0x4a, 0x4b, 0xb8, 0xed, ++ 0xbe, 0x29, 0xdb, 0xff, 0xed, 0x7a, 0xfc, 0x85, 0x39, 0xdf, 0x4e, 0xae, ++ 0x11, 0x85, 0x3e, 0x60, 0x4d, 0xef, 0xb4, 0xee, 0x84, 0xf4, 0xdb, 0xaf, ++ 0x5b, 0xd9, 0xfe, 0x2f, 0x5e, 0x77, 0xd8, 0xf9, 0x97, 0x39, 0xb2, 0x26, ++ 0x74, 0xde, 0x03, 0xf2, 0x87, 0x21, 0x8f, 0xb1, 0xdd, 0xcb, 0xce, 0x33, ++ 0x56, 0x64, 0x35, 0xe0, 0x3d, 0xf1, 0x64, 0x50, 0x30, 0x06, 0xf4, 0xc6, ++ 0xa5, 0x07, 0x65, 0xc4, 0x43, 0xa2, 0x75, 0x6a, 0x53, 0xc2, 0xee, 0x97, ++ 0x6a, 0x25, 0xbe, 0x0f, 0x01, 0x1f, 0x97, 0x0c, 0x5b, 0x82, 0xe7, 0xe0, ++ 0x3a, 0xdd, 0x0b, 0x65, 0x6a, 0xc2, 0x73, 0x71, 0xea, 0xfb, 0xa1, 0x44, ++ 0xbe, 0x70, 0x35, 0xef, 0x47, 0x7d, 0x4f, 0x54, 0x35, 0xcf, 0x13, 0xae, ++ 0x56, 0xe5, 0xed, 0x0c, 0x49, 0xe7, 0xe7, 0x08, 0x0b, 0x48, 0x01, 0xcb, ++ 0xaf, 0x50, 0xea, 0xa5, 0xea, 0xb2, 0xad, 0x8e, 0x28, 0xfc, 0x92, 0x6d, ++ 0x37, 0xeb, 0xd0, 0x0f, 0x50, 0x92, 0xbe, 0xf7, 0x47, 0x9e, 0xb4, 0xd0, ++ 0x3e, 0x8c, 0xed, 0xbc, 0x6f, 0x13, 0xee, 0xb0, 0x6f, 0x13, 0xfe, 0x9d, ++ 0xfb, 0xa6, 0xc6, 0x57, 0xd9, 0xbc, 0x13, 0xcf, 0x43, 0x7d, 0x53, 0x7c, ++ 0x25, 0x76, 0xe7, 0x3c, 0x98, 0xb7, 0xe0, 0xc3, 0xb3, 0x20, 0x87, 0x8b, ++ 0x8e, 0x3b, 0xeb, 0x80, 0xc1, 0x0b, 0xf7, 0xf9, 0x8b, 0x7b, 0xad, 0xdb, ++ 0x25, 0x76, 0xff, 0x4c, 0xfb, 0xa7, 0x04, 0xfd, 0x46, 0x77, 0xba, 0x17, ++ 0x79, 0xf0, 0x69, 0x37, 0x9e, 0xe7, 0x1c, 0xf8, 0xae, 0x53, 0x66, 0x79, ++ 0x04, 0x2c, 0xdf, 0x40, 0xe8, 0x29, 0x42, 0x6f, 0x19, 0xda, 0x1a, 0x94, ++ 0xd9, 0xfd, 0xf5, 0xfc, 0x1c, 0x14, 0xcf, 0x0b, 0xfa, 0xba, 0xfc, 0xcb, ++ 0xe1, 0xb7, 0xa0, 0x9e, 0x23, 0xfc, 0x6f, 0xff, 0x2c, 0xbf, 0xb5, 0x90, ++ 0x73, 0x7b, 0x8c, 0x8c, 0x3e, 0x84, 0x7f, 0xb0, 0x30, 0xe0, 0x42, 0x3d, ++ 0xae, 0x4d, 0xe7, 0x2b, 0x82, 0x7b, 0xe8, 0x3d, 0xfb, 0xa3, 0x22, 0xea, ++ 0x01, 0x3f, 0x49, 0x67, 0xfb, 0xd4, 0xd5, 0xbd, 0xad, 0x49, 0x31, 0xee, ++ 0x9f, 0xa4, 0x43, 0x3b, 0xe7, 0xef, 0xe2, 0xfe, 0xd6, 0x32, 0x99, 0xdd, ++ 0xd3, 0x7c, 0xdd, 0x2f, 0xa3, 0xff, 0x6e, 0xf5, 0x0f, 0x7f, 0xf7, 0xeb, ++ 0x67, 0xed, 0x77, 0xb6, 0xeb, 0x6b, 0x2c, 0xd7, 0x23, 0xda, 0x45, 0xa2, ++ 0xac, 0xd1, 0xb0, 0x73, 0x12, 0x05, 0xa5, 0x76, 0xcc, 0xdb, 0x03, 0x7b, ++ 0x09, 0xfc, 0x77, 0xc2, 0x9f, 0xa7, 0x7e, 0xff, 0x50, 0x66, 0xc9, 0xce, ++ 0x74, 0xf4, 0x2f, 0x0d, 0xc3, 0xfb, 0x34, 0xaf, 0x6f, 0x65, 0xf3, 0xe9, ++ 0x6a, 0x5f, 0x6a, 0xd6, 0x04, 0x71, 0xfc, 0x2e, 0xdb, 0xf9, 0xf8, 0x35, ++ 0x07, 0x8b, 0x2c, 0xe1, 0xf7, 0x60, 0x7c, 0x9e, 0x2e, 0x09, 0x7c, 0xb6, ++ 0x5c, 0x34, 0x86, 0xf6, 0xf5, 0xeb, 0xee, 0xff, 0xf0, 0xe0, 0x74, 0x85, ++ 0x7e, 0xf3, 0xff, 0xba, 0xdd, 0x30, 0x49, 0xa6, 0xaa, 0x23, 0x95, 0x8f, ++ 0xb9, 0x92, 0x97, 0xe9, 0xa7, 0x84, 0xe9, 0xa9, 0xb3, 0x88, 0x1f, 0xcb, ++ 0x39, 0x24, 0x88, 0xa5, 0x9b, 0xb0, 0x7c, 0xfa, 0xf9, 0xc4, 0x81, 0xe5, ++ 0x42, 0xe2, 0xc2, 0xd2, 0x95, 0xe9, 0xfe, 0x28, 0x1d, 0xf3, 0x5b, 0x82, ++ 0x89, 0x98, 0x0f, 0xb9, 0xef, 0x1f, 0x7d, 0x01, 0x6f, 0xae, 0x8d, 0x18, ++ 0xda, 0x00, 0xb9, 0x73, 0xff, 0x2a, 0x3d, 0xad, 0x3d, 0xdf, 0x8e, 0xe3, ++ 0xb7, 0xbf, 0xfe, 0x8f, 0x0c, 0xc8, 0x6b, 0xb9, 0x13, 0xfd, 0xf7, 0x8b, ++ 0x71, 0xb6, 0xa6, 0x47, 0x88, 0x27, 0xff, 0x67, 0xb1, 0x8c, 0xf1, 0x13, ++ 0x92, 0xbc, 0x12, 0xe9, 0xa1, 0x9c, 0xdf, 0x92, 0x40, 0x46, 0xb1, 0xb8, ++ 0xd8, 0x8f, 0x12, 0xb3, 0xd8, 0x3d, 0xf5, 0x1d, 0xfc, 0x2f, 0x69, 0xbb, ++ 0xe0, 0x7f, 0x10, 0x6f, 0xcd, 0xfd, 0x54, 0xc3, 0xf2, 0x43, 0x96, 0x4a, ++ 0x78, 0x7f, 0x6b, 0x73, 0x40, 0x83, 0xa4, 0x95, 0xbb, 0x28, 0xcb, 0x0b, ++ 0xf7, 0xf1, 0x34, 0x37, 0xb1, 0xf6, 0xdc, 0x2a, 0xab, 0x57, 0xa2, 0xf5, ++ 0xdc, 0xc1, 0x51, 0xac, 0x7d, 0x85, 0xd5, 0x0b, 0xe7, 0x1e, 0x66, 0x93, ++ 0x00, 0xd2, 0xe3, 0x5c, 0x38, 0xf5, 0x20, 0xc3, 0x39, 0x18, 0xc6, 0xdf, ++ 0xc4, 0x3d, 0xe5, 0x54, 0x63, 0xcf, 0x06, 0x3d, 0x6b, 0x51, 0x8b, 0x91, ++ 0xe5, 0xef, 0x93, 0x40, 0x4f, 0xe0, 0xe3, 0x79, 0x5d, 0xd8, 0x37, 0x63, ++ 0x33, 0x98, 0x5d, 0xdc, 0x2f, 0x9b, 0xf1, 0xed, 0x7e, 0x25, 0x4a, 0x3f, ++ 0x44, 0x4c, 0x06, 0xe3, 0x03, 0x55, 0x99, 0x25, 0x4b, 0x33, 0x68, 0xb9, ++ 0x2a, 0xc3, 0x19, 0x0b, 0x65, 0x3f, 0x9b, 0x7f, 0xd3, 0x4f, 0x0b, 0xd1, ++ 0x2f, 0x8f, 0xbf, 0xa3, 0xf2, 0xc5, 0xe0, 0x07, 0x31, 0x7e, 0x28, 0xbe, ++ 0x7b, 0x32, 0xb3, 0x24, 0x1e, 0xde, 0x7b, 0x55, 0x62, 0xf9, 0xe6, 0x9e, ++ 0x83, 0xfc, 0xf7, 0x06, 0x48, 0x30, 0x31, 0xfc, 0xfe, 0x50, 0x57, 0x66, ++ 0x69, 0x6a, 0x06, 0x1d, 0x3f, 0x2b, 0x83, 0x30, 0x3a, 0xea, 0x02, 0xae, ++ 0xf0, 0x7b, 0x73, 0xae, 0x08, 0xf6, 0x9c, 0xc8, 0x67, 0xec, 0x07, 0x36, ++ 0x15, 0xfa, 0xc7, 0xd9, 0x3d, 0x54, 0xaf, 0x4a, 0xac, 0x5e, 0xf0, 0xbc, ++ 0xed, 0xbe, 0xf5, 0x7d, 0xd1, 0x87, 0xef, 0x01, 0xbd, 0xf6, 0xc9, 0x4c, ++ 0xf7, 0x3d, 0x38, 0x7f, 0x3d, 0x21, 0x26, 0x98, 0xff, 0xcf, 0x0d, 0xde, ++ 0x1d, 0xa8, 0x7f, 0xd6, 0x66, 0x80, 0x3f, 0x72, 0xc9, 0xf3, 0x06, 0x0d, ++ 0xe8, 0x05, 0x1f, 0x51, 0xb1, 0x0a, 0xe7, 0x4a, 0xfe, 0x58, 0x67, 0xc4, ++ 0xf2, 0x63, 0x6a, 0xe7, 0x42, 0xf9, 0x27, 0x6a, 0xe7, 0x42, 0xf9, 0x29, ++ 0xb5, 0x73, 0xa1, 0xfc, 0x8c, 0xda, 0xb9, 0x50, 0x2e, 0xba, 0xe1, 0x20, ++ 0x84, 0xf2, 0x8f, 0xf7, 0x32, 0x9c, 0xa3, 0x32, 0x8a, 0x42, 0xf1, 0x36, ++ 0xf5, 0x7c, 0x87, 0x73, 0x78, 0x76, 0x8c, 0x7f, 0x50, 0x8f, 0xe3, 0x57, ++ 0x65, 0xba, 0x11, 0xbe, 0x1d, 0xfb, 0xbd, 0x9f, 0x78, 0x21, 0x1e, 0xf2, ++ 0xaa, 0x35, 0x98, 0x6a, 0xbb, 0x0d, 0xbe, 0x75, 0xcd, 0x67, 0x3c, 0xdc, ++ 0xde, 0x8b, 0x9c, 0x9f, 0xd5, 0x9f, 0xef, 0x7b, 0x5e, 0x93, 0x16, 0xe5, ++ 0x78, 0x5e, 0x73, 0x20, 0x66, 0x71, 0xd8, 0x7b, 0x93, 0x33, 0xf4, 0xd8, ++ 0x9e, 0xfb, 0xfa, 0x05, 0x3c, 0x1f, 0xda, 0x66, 0xe9, 0x80, 0xaf, 0x53, ++ 0xa2, 0x4b, 0x9e, 0xa4, 0x61, 0xf5, 0xc9, 0xcf, 0xf7, 0x41, 0xf8, 0x56, ++ 0x65, 0x3a, 0x97, 0xc2, 0x3e, 0x52, 0xfa, 0xfe, 0x0e, 0x94, 0x79, 0xcd, ++ 0xbf, 0xfb, 0x09, 0x9c, 0xe7, 0xa1, 0xfd, 0x63, 0x1e, 0x41, 0xbb, 0x14, ++ 0x7c, 0x0a, 0xf5, 0x7c, 0xd5, 0x3a, 0xd4, 0x70, 0x10, 0xeb, 0x7a, 0xd5, ++ 0xea, 0xdf, 0x04, 0xdf, 0xbf, 0xfa, 0x7a, 0x36, 0xac, 0x84, 0xf2, 0x1b, ++ 0xc2, 0xe8, 0x06, 0xf0, 0x48, 0x8a, 0xb4, 0xde, 0x75, 0x08, 0xd7, 0xfb, ++ 0x0c, 0xc1, 0x42, 0x38, 0xa7, 0x72, 0xdf, 0x2d, 0x39, 0x62, 0xde, 0x70, ++ 0x55, 0x66, 0x31, 0xc2, 0x59, 0x27, 0xf0, 0x4d, 0xc0, 0x89, 0xef, 0xd7, ++ 0xb7, 0xa5, 0xeb, 0x8e, 0x78, 0x36, 0xc7, 0x53, 0x22, 0xee, 0xd7, 0x00, ++ 0xde, 0x69, 0x07, 0x39, 0x74, 0x33, 0x06, 0xf4, 0xba, 0x72, 0x1e, 0xaf, ++ 0x6f, 0x6e, 0xea, 0xf9, 0x3e, 0xac, 0xcf, 0x73, 0x42, 0x26, 0xbd, 0xec, ++ 0x88, 0xbf, 0x0a, 0xba, 0x7b, 0x8e, 0xef, 0x8f, 0x28, 0x73, 0x0f, 0xea, ++ 0x5d, 0xb0, 0x4f, 0xaf, 0x1e, 0xbc, 0xd8, 0x13, 0xee, 0x5b, 0xa5, 0xfb, ++ 0xd2, 0x13, 0xee, 0x5f, 0xdd, 0x9c, 0xd1, 0x4b, 0x91, 0xdf, 0x94, 0x3b, ++ 0xf8, 0xef, 0xdb, 0x7e, 0x1a, 0x8f, 0xef, 0xe3, 0xef, 0x7c, 0xce, 0x20, ++ 0xdb, 0xcb, 0x20, 0x9f, 0x64, 0xa6, 0xf1, 0xf0, 0x31, 0x58, 0xd2, 0x6c, ++ 0xcb, 0xa7, 0x65, 0x90, 0x4f, 0x32, 0x37, 0x59, 0x3a, 0x0e, 0xe5, 0x3c, ++ 0x7b, 0xd6, 0x68, 0xc8, 0x23, 0x11, 0xf9, 0xee, 0x0b, 0xfa, 0x14, 0x1f, ++ 0x07, 0x52, 0x9a, 0xe0, 0x28, 0x47, 0x7d, 0xac, 0x18, 0x98, 0x4b, 0x98, ++ 0x3c, 0x28, 0x35, 0x46, 0xf3, 0xcb, 0x9f, 0x85, 0xfc, 0x89, 0x53, 0xd4, ++ 0xc7, 0x24, 0x77, 0x57, 0xbc, 0x3f, 0xce, 0xde, 0x43, 0xd1, 0x3e, 0xbe, ++ 0xcf, 0x3d, 0x8a, 0x76, 0x31, 0xee, 0x04, 0x47, 0x7f, 0xc5, 0x7b, 0xfd, ++ 0x6c, 0xc1, 0x6c, 0xb0, 0xbf, 0xe8, 0x3a, 0xd8, 0x7d, 0xd7, 0xbb, 0x64, ++ 0xcc, 0xbb, 0xcb, 0x7d, 0xfd, 0xf4, 0xbd, 0xf7, 0xd0, 0xfa, 0xa4, 0x17, ++ 0xa7, 0xe2, 0xfd, 0x7e, 0xaf, 0xf2, 0xf6, 0x49, 0x7b, 0x4b, 0xf1, 0xf7, ++ 0x03, 0xdb, 0x29, 0x3c, 0xf5, 0x54, 0x91, 0xba, 0x34, 0xe8, 0xb1, 0xa7, ++ 0x7e, 0x0a, 0x9d, 0xa9, 0xf4, 0xfb, 0xca, 0x83, 0x2f, 0x1c, 0x77, 0xda, ++ 0x6f, 0xa3, 0xdf, 0xdf, 0x41, 0xaf, 0x17, 0xfc, 0x75, 0x79, 0x8b, 0xb1, ++ 0x08, 0xf8, 0xeb, 0xd7, 0xd5, 0xf3, 0xd5, 0xfb, 0xb2, 0x3f, 0x83, 0x9f, ++ 0x0b, 0xe4, 0x7a, 0x7f, 0x57, 0xf8, 0xd2, 0x41, 0x0f, 0x92, 0x9d, 0xe1, ++ 0x0b, 0xbf, 0x67, 0x4b, 0x8d, 0x2f, 0x90, 0x59, 0xca, 0xf0, 0x8f, 0x95, ++ 0x93, 0x4e, 0xb1, 0x73, 0x60, 0xdf, 0x94, 0x8f, 0x7d, 0x0e, 0x7c, 0x2c, ++ 0xec, 0x1c, 0x66, 0x47, 0xa9, 0xf2, 0xb7, 0xf5, 0xd3, 0x3b, 0xde, 0x5f, ++ 0x05, 0xfe, 0xf7, 0xf7, 0x64, 0x82, 0xe7, 0xea, 0xf8, 0xf9, 0xbc, 0xc5, ++ 0xf0, 0xff, 0x72, 0x08, 0xcf, 0xc9, 0xc2, 0xed, 0x8f, 0xc0, 0x7d, 0x52, ++ 0xf4, 0xb9, 0x07, 0xf4, 0x4f, 0x38, 0x07, 0xea, 0xa4, 0xfd, 0xff, 0x39, ++ 0x83, 0xeb, 0x4d, 0x95, 0x87, 0x1f, 0x49, 0x29, 0x0c, 0xb5, 0x93, 0xd5, ++ 0x9f, 0x2a, 0xde, 0x27, 0x6b, 0xa5, 0x0d, 0x8a, 0xfa, 0xfa, 0x2c, 0x65, ++ 0x7d, 0x73, 0xf1, 0x86, 0xf0, 0xef, 0xbb, 0xe2, 0x87, 0x8b, 0xb7, 0xce, ++ 0xd3, 0xbb, 0xf1, 0xfc, 0xa6, 0x14, 0xf1, 0xf7, 0x5a, 0xc5, 0x7c, 0xca, ++ 0xde, 0x8a, 0xc2, 0xfc, 0xbc, 0x89, 0x90, 0x77, 0x42, 0x1f, 0x55, 0x17, ++ 0x7e, 0xa0, 0x85, 0xf8, 0xea, 0xc4, 0x2e, 0xe4, 0xa7, 0xe0, 0x3b, 0x33, ++ 0x64, 0x52, 0x1b, 0xa9, 0xfd, 0x66, 0x06, 0xf3, 0xdf, 0x4f, 0x78, 0x2b, ++ 0x0a, 0xf3, 0x59, 0xbe, 0x69, 0xbf, 0x1f, 0x51, 0x58, 0x62, 0xbe, 0xe0, ++ 0x6f, 0x98, 0xfc, 0xfc, 0x28, 0xd6, 0xaf, 0x0d, 0xdf, 0x77, 0x43, 0x26, ++ 0xeb, 0xff, 0x5a, 0xd1, 0x96, 0x1f, 0x7e, 0x05, 0x71, 0xcf, 0xfd, 0x04, ++ 0xf3, 0x37, 0xaf, 0x59, 0x19, 0xdf, 0xcf, 0x6b, 0xfa, 0x42, 0xa3, 0xa1, ++ 0x65, 0xbf, 0x6e, 0x0c, 0x5f, 0xf2, 0x2c, 0x01, 0x0d, 0xc8, 0x93, 0xf6, ++ 0x8a, 0x68, 0x0f, 0xe4, 0xe7, 0xd7, 0x2c, 0x35, 0x63, 0x5e, 0x67, 0xbf, ++ 0xec, 0xe0, 0x87, 0xc6, 0x7c, 0x42, 0x62, 0x33, 0x37, 0xff, 0xd8, 0x48, ++ 0xf7, 0xed, 0x0f, 0x70, 0x98, 0x31, 0x4c, 0x9e, 0xb6, 0x83, 0x8d, 0x43, ++ 0xeb, 0xc9, 0xff, 0xf1, 0x38, 0xf2, 0xfb, 0xf1, 0x6f, 0x45, 0xf9, 0x34, ++ 0xdf, 0x62, 0x3d, 0xc9, 0x54, 0x87, 0x42, 0x79, 0x5d, 0xc2, 0xe8, 0x7b, ++ 0x0e, 0xe0, 0x0d, 0x97, 0x2b, 0xe0, 0x3b, 0xaf, 0x79, 0x84, 0x74, 0xc8, ++ 0x19, 0xe0, 0x07, 0xb0, 0x7e, 0xa8, 0x4f, 0xca, 0xfc, 0xf1, 0xfb, 0x4f, ++ 0xd2, 0x71, 0x6b, 0x4e, 0x32, 0xfa, 0x86, 0x4c, 0x39, 0xb5, 0xdd, 0x3e, ++ 0x33, 0xcc, 0x6e, 0x27, 0xcf, 0x31, 0xba, 0x34, 0xd2, 0x7f, 0xa0, 0xcf, ++ 0x2d, 0x3b, 0xda, 0xa0, 0x07, 0x7b, 0xee, 0xce, 0xf4, 0xdd, 0x88, 0x79, ++ 0x33, 0x5f, 0x97, 0xae, 0x0b, 0x32, 0x95, 0xf6, 0x7b, 0x04, 0x3a, 0x3e, ++ 0x35, 0x9e, 0xee, 0x4b, 0xcd, 0x7e, 0x76, 0xbf, 0xc4, 0xf5, 0x96, 0x5e, ++ 0x78, 0xae, 0xb5, 0x2b, 0xf9, 0x5d, 0xb3, 0x55, 0x83, 0xf4, 0x27, 0xea, ++ 0x6d, 0x2d, 0xf2, 0x58, 0xc0, 0x57, 0xf5, 0xf9, 0x70, 0x01, 0x4f, 0x62, ++ 0xc9, 0x51, 0xdc, 0xe3, 0xb4, 0x72, 0xf8, 0xdf, 0x26, 0x83, 0x9c, 0x5c, ++ 0x79, 0x50, 0xcb, 0x92, 0x3d, 0xba, 0x1a, 0x67, 0xa3, 0x86, 0xd8, 0xc3, ++ 0xc6, 0x79, 0xf5, 0x90, 0xa1, 0x82, 0xfd, 0x0e, 0x25, 0x9b, 0x7f, 0xbb, ++ 0x90, 0xcf, 0x07, 0xff, 0x6a, 0x2b, 0xee, 0xcb, 0xca, 0x75, 0x11, 0xe4, ++ 0x1c, 0x95, 0xcb, 0xba, 0x78, 0x90, 0xcb, 0xe5, 0xec, 0xf7, 0x15, 0xce, ++ 0x1c, 0x4c, 0x2a, 0x01, 0xf8, 0x9f, 0x91, 0x88, 0xcf, 0x8e, 0xe7, 0xae, ++ 0x58, 0x9e, 0xf1, 0xfd, 0xac, 0x3b, 0x78, 0x6e, 0xc2, 0xfb, 0x43, 0x92, ++ 0xfb, 0x68, 0xc3, 0xef, 0x37, 0x14, 0x76, 0xe4, 0xd4, 0x83, 0x53, 0x7b, ++ 0x81, 0x1e, 0xf9, 0x61, 0xd3, 0xfc, 0x33, 0x74, 0x67, 0xc8, 0xa2, 0xcc, ++ 0x1e, 0x38, 0xde, 0x34, 0xe2, 0x41, 0xbd, 0xf7, 0x8c, 0xd5, 0x95, 0x0e, ++ 0xfe, 0x86, 0x49, 0x3c, 0xde, 0x7f, 0xc6, 0x1a, 0x6c, 0x05, 0x7e, 0x7c, ++ 0x66, 0x78, 0xb4, 0x04, 0xf1, 0x7b, 0xda, 0xff, 0x7a, 0x12, 0x76, 0x5f, ++ 0xdf, 0x19, 0x9d, 0x2b, 0x9d, 0xdd, 0x03, 0x21, 0xf2, 0x8a, 0xef, 0xfe, ++ 0x56, 0xf7, 0xb6, 0x95, 0xc9, 0x6b, 0x8b, 0xc7, 0x43, 0xbc, 0x7a, 0x16, ++ 0xb1, 0x80, 0x1d, 0x79, 0x9f, 0xcc, 0xf4, 0x5a, 0xf2, 0x26, 0xa3, 0x4b, ++ 0xc1, 0xef, 0x6a, 0x24, 0xbf, 0x0d, 0xe6, 0xe9, 0xca, 0x9c, 0xfc, 0xfd, ++ 0x4c, 0xfa, 0x5d, 0xd2, 0x9a, 0x1f, 0xa1, 0x5d, 0xd9, 0x01, 0x37, 0x2d, ++ 0xff, 0x9d, 0xa6, 0xaf, 0xa9, 0xd7, 0x76, 0xd8, 0xaf, 0xbb, 0x25, 0x76, ++ 0x3f, 0x89, 0x83, 0xe9, 0xfb, 0xd5, 0xc3, 0xae, 0xfe, 0x6c, 0x1a, 0x9c, ++ 0x73, 0xa3, 0x76, 0xb6, 0x44, 0xe7, 0x33, 0xbf, 0xf9, 0x30, 0xde, 0xc3, ++ 0xa3, 0xb6, 0xab, 0x3b, 0xec, 0x9b, 0xff, 0xa5, 0x7f, 0xb4, 0xb3, 0x7d, ++ 0xe4, 0xda, 0x92, 0x59, 0x14, 0xf2, 0x7b, 0xab, 0xed, 0xa4, 0x0e, 0xbd, ++ 0x5c, 0xe8, 0x77, 0xbb, 0x58, 0x9e, 0xfb, 0x91, 0xe1, 0x4f, 0xb7, 0x2d, ++ 0xa7, 0xf5, 0xd5, 0xbb, 0xa2, 0x11, 0x8e, 0x97, 0x9f, 0x37, 0x78, 0x80, ++ 0x7f, 0x5f, 0xde, 0x61, 0x40, 0x7b, 0xe7, 0xb2, 0x2d, 0x78, 0x6e, 0x15, ++ 0xd4, 0xf7, 0xe6, 0x3a, 0x3c, 0x38, 0x5a, 0x0e, 0x9e, 0xef, 0x12, 0xf8, ++ 0xbd, 0x44, 0x63, 0xff, 0x3d, 0xc8, 0x1d, 0xf2, 0x5b, 0x1d, 0xde, 0xb7, ++ 0xf1, 0xc5, 0xcf, 0x0d, 0xf8, 0x7b, 0x1e, 0x4b, 0x5f, 0xb8, 0x6b, 0x07, ++ 0xd8, 0x4f, 0x5f, 0xa4, 0xdb, 0x5f, 0x7e, 0x05, 0xfc, 0x7b, 0x2f, 0x27, ++ 0xe0, 0x7d, 0x00, 0x24, 0x99, 0x7d, 0x3f, 0x91, 0xd3, 0x23, 0xd0, 0x97, ++ 0x9d, 0xee, 0x87, 0xfc, 0x0b, 0x33, 0xea, 0x0d, 0x4b, 0x5f, 0x4b, 0x41, ++ 0xfe, 0x25, 0xf6, 0xef, 0xd2, 0xcf, 0xa3, 0xf0, 0x1c, 0xfc, 0xe5, 0x13, ++ 0xf7, 0xc7, 0x82, 0x1f, 0xac, 0x55, 0xb3, 0x87, 0xfd, 0x8e, 0xa4, 0x6c, ++ 0xf2, 0x00, 0x1f, 0x5e, 0xbe, 0x23, 0x0a, 0xf5, 0x3e, 0xa2, 0x77, 0xbf, ++ 0x06, 0xeb, 0x2f, 0xfd, 0xc5, 0xc4, 0x69, 0xfd, 0x61, 0xfc, 0xdf, 0x25, ++ 0x10, 0x58, 0x4f, 0x7b, 0xcb, 0x6b, 0xe8, 0x7f, 0x0c, 0xed, 0x6f, 0x64, ++ 0xb9, 0x7e, 0xbd, 0xa5, 0x07, 0xe3, 0x03, 0x1d, 0x72, 0x96, 0xe5, 0xcd, ++ 0xce, 0x0d, 0xdd, 0xcb, 0xbc, 0x1f, 0xf0, 0xa7, 0x8a, 0x88, 0x7b, 0x10, ++ 0x59, 0xde, 0x6c, 0x81, 0x2c, 0xb1, 0xdf, 0x95, 0x7c, 0x22, 0xf2, 0x39, ++ 0xf0, 0xdf, 0x66, 0xf2, 0x38, 0xa9, 0xf0, 0x97, 0xc4, 0x11, 0x63, 0x32, ++ 0xd0, 0xa1, 0x9b, 0xb0, 0x7b, 0x1f, 0x9f, 0xe8, 0x8d, 0xf7, 0xea, 0x9e, ++ 0xcf, 0xe4, 0xe7, 0x97, 0x49, 0x90, 0x9f, 0x77, 0x14, 0xf8, 0x76, 0xae, ++ 0xfa, 0x00, 0xfa, 0x4b, 0x0c, 0x2c, 0x5f, 0xaf, 0x8b, 0x7b, 0x2d, 0x3f, ++ 0xcc, 0x64, 0xe7, 0x82, 0x17, 0x1b, 0xff, 0xa2, 0xf0, 0x9b, 0x54, 0xaf, ++ 0xb9, 0xa1, 0xac, 0xf7, 0x65, 0xbf, 0xb3, 0x5c, 0x50, 0x6f, 0xef, 0xbf, ++ 0x82, 0x96, 0xab, 0x38, 0x9c, 0xff, 0x91, 0xe4, 0xfa, 0x08, 0xd6, 0xb7, ++ 0xac, 0x71, 0xcb, 0xbe, 0x77, 0x11, 0x2e, 0xcf, 0x7d, 0xef, 0x0f, 0x30, ++ 0xee, 0x09, 0x13, 0xfa, 0x69, 0xc8, 0xbb, 0x0c, 0x7e, 0x6a, 0xfb, 0x65, ++ 0xb1, 0x31, 0xc8, 0xe3, 0x0e, 0xdb, 0x15, 0x71, 0xf5, 0x8b, 0xcf, 0xfc, ++ 0x1e, 0xf3, 0x47, 0x2e, 0xbe, 0x7e, 0x0f, 0xfe, 0xbe, 0xd8, 0x7c, 0xd9, ++ 0x7f, 0x11, 0xee, 0xc7, 0x6a, 0x33, 0xfb, 0x3f, 0x79, 0x88, 0x96, 0x7b, ++ 0x4f, 0x9c, 0xc2, 0x7d, 0x51, 0xcf, 0xb7, 0x53, 0x1c, 0x5e, 0x62, 0x7c, ++ 0xa5, 0x12, 0xd6, 0xd1, 0x1f, 0xf2, 0x57, 0x5c, 0xed, 0x99, 0x48, 0xb7, ++ 0x8c, 0xde, 0xcf, 0x6f, 0xca, 0x45, 0xf8, 0x09, 0x3f, 0x6d, 0xfb, 0xe5, ++ 0xc8, 0xf6, 0x95, 0x98, 0xa7, 0xe8, 0x5f, 0xcc, 0x4f, 0xf4, 0x2f, 0xde, ++ 0xfb, 0xef, 0x4c, 0xa6, 0xdf, 0x5f, 0xd3, 0xfb, 0xf3, 0x40, 0x2e, 0xef, ++ 0x84, 0x38, 0x44, 0x98, 0x3e, 0x7f, 0x2d, 0xc6, 0x9f, 0x07, 0x3f, 0x75, ++ 0xbb, 0x33, 0x9d, 0xe5, 0x73, 0x5f, 0xb3, 0xd1, 0x7a, 0x18, 0xde, 0xfc, ++ 0x5f, 0x8a, 0x9c, 0x0c, 0xc3, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xad, 0x58, ++ 0x0d, 0x6c, 0x14, 0xd7, 0x11, 0x9e, 0xb7, 0x7b, 0xb7, 0x77, 0xc6, 0x77, ++ 0xf6, 0x81, 0x8d, 0x7f, 0xe2, 0x1f, 0xf6, 0xce, 0xc4, 0x18, 0x7c, 0xf8, ++ 0x16, 0xff, 0xd5, 0xb1, 0x4d, 0x39, 0xfc, 0x83, 0x28, 0x42, 0xcd, 0xf1, ++ 0x93, 0xd4, 0x4a, 0x21, 0x6c, 0x9a, 0x40, 0x28, 0xc4, 0xf8, 0x64, 0x43, ++ 0x8b, 0x92, 0xaa, 0xac, 0x7b, 0x95, 0xf9, 0x11, 0x51, 0x5c, 0x35, 0x8a, ++ 0xa0, 0x4d, 0xab, 0x83, 0x08, 0x14, 0x55, 0x54, 0x18, 0x17, 0x22, 0x8a, ++ 0x30, 0xbd, 0x04, 0x15, 0x70, 0x1b, 0xd1, 0x43, 0x89, 0x14, 0x92, 0x5a, ++ 0x68, 0xeb, 0x36, 0xd4, 0x6d, 0x0c, 0xe7, 0xd2, 0xa4, 0x2d, 0x6a, 0x24, ++ 0x77, 0xe6, 0xed, 0x1e, 0x77, 0xeb, 0x9f, 0xb4, 0x89, 0x7a, 0x96, 0x6f, ++ 0x3c, 0xef, 0xcd, 0x9b, 0x37, 0xf3, 0xcd, 0xbc, 0x99, 0xf7, 0xdc, 0x01, ++ 0xf8, 0xa9, 0x06, 0xe8, 0x70, 0x82, 0x3d, 0x37, 0x17, 0x69, 0x07, 0x53, ++ 0x22, 0x38, 0xd4, 0x01, 0xa0, 0xc1, 0x3c, 0x4e, 0x63, 0x2a, 0xce, 0x3f, ++ 0x57, 0x70, 0x01, 0x6c, 0x35, 0x24, 0x0c, 0x21, 0x67, 0x1e, 0xc0, 0x63, ++ 0x60, 0x7e, 0x72, 0x73, 0x6c, 0x50, 0x0f, 0xb0, 0x91, 0xfe, 0x96, 0x71, ++ 0xbc, 0xe1, 0xb7, 0xf7, 0x59, 0x16, 0xc0, 0x13, 0x30, 0x60, 0x87, 0x32, ++ 0x80, 0x9b, 0x42, 0xef, 0x1e, 0x49, 0x04, 0x18, 0x1f, 0xf8, 0xa1, 0x5d, ++ 0x75, 0x91, 0x50, 0x9b, 0xe7, 0x76, 0x05, 0x00, 0xd3, 0x3e, 0x10, 0x26, ++ 0x2b, 0x01, 0x26, 0xe9, 0xb3, 0x62, 0x3a, 0x05, 0xb0, 0x01, 0xc9, 0xd1, ++ 0x67, 0x52, 0xa4, 0x6f, 0x0d, 0x60, 0x3e, 0x7e, 0xb7, 0x40, 0x45, 0x18, ++ 0xf5, 0xdc, 0xf1, 0xb8, 0x34, 0x21, 0x00, 0x50, 0x2a, 0x33, 0x1b, 0x97, ++ 0x2b, 0x81, 0x12, 0x92, 0xc3, 0x79, 0x25, 0x56, 0x8b, 0x74, 0xd0, 0xa1, ++ 0x44, 0xd0, 0x9e, 0x3d, 0x42, 0xc8, 0x27, 0xe3, 0xba, 0xe7, 0xa4, 0x58, ++ 0x15, 0x88, 0xa9, 0x75, 0x7b, 0x04, 0x95, 0x8f, 0x8f, 0xb3, 0xb7, 0xb7, ++ 0x81, 0x8f, 0xb6, 0x8b, 0x55, 0x85, 0xdc, 0x00, 0x89, 0xb9, 0x12, 0xb0, ++ 0x6c, 0xa4, 0xf3, 0x95, 0x78, 0x10, 0xf1, 0xd0, 0x3e, 0x01, 0xe5, 0x04, ++ 0xea, 0x49, 0xd8, 0xa1, 0x63, 0x10, 0xf7, 0xad, 0x6d, 0x15, 0xc2, 0x83, ++ 0xdc, 0x0f, 0xdb, 0xa8, 0x8e, 0xfb, 0x0a, 0xc0, 0xb8, 0x7d, 0xb5, 0x95, ++ 0x38, 0xee, 0x07, 0x58, 0x4e, 0xe3, 0x4e, 0xd3, 0x6e, 0x2f, 0x8e, 0x07, ++ 0xac, 0xf2, 0x29, 0x7f, 0xac, 0xfc, 0x05, 0x59, 0xe0, 0xfe, 0xd5, 0xe6, ++ 0x08, 0xe1, 0x01, 0xff, 0x74, 0x3c, 0x36, 0xd0, 0x7c, 0x1d, 0x40, 0x04, ++ 0x62, 0x22, 0xe1, 0x8a, 0x9f, 0x8d, 0x4e, 0xc4, 0xbd, 0xc9, 0xc4, 0x1d, ++ 0x20, 0x28, 0x02, 0xc6, 0x65, 0x97, 0xc9, 0xef, 0x72, 0xba, 0x62, 0x62, ++ 0x15, 0xda, 0x9d, 0xe5, 0xd4, 0x44, 0xf4, 0xa7, 0xe9, 0x22, 0xc6, 0x05, ++ 0xf9, 0x26, 0x5b, 0xec, 0x4d, 0xa2, 0x2c, 0x08, 0xb0, 0x17, 0xe3, 0x0b, ++ 0xe7, 0xed, 0xe3, 0x0f, 0xec, 0x20, 0x1c, 0x0a, 0x2a, 0x6d, 0xa4, 0xa7, ++ 0xd1, 0x0c, 0x2f, 0x43, 0x5d, 0x9b, 0x50, 0xae, 0x8f, 0x85, 0x81, 0xf6, ++ 0x75, 0x42, 0x3f, 0xa7, 0x87, 0x58, 0x9c, 0xdb, 0xf1, 0x65, 0x98, 0xe0, ++ 0x34, 0x08, 0x1e, 0x1b, 0x51, 0x84, 0x9f, 0xd3, 0x36, 0x08, 0x71, 0xba, ++ 0x0a, 0xc2, 0x9c, 0xae, 0x86, 0x7e, 0x4e, 0xd7, 0xc0, 0x00, 0xa7, 0x6b, ++ 0x21, 0xce, 0x29, 0x2c, 0x89, 0x45, 0xc0, 0x4b, 0x3b, 0x7d, 0xc7, 0x73, ++ 0x3b, 0x13, 0xc9, 0x57, 0x9e, 0x15, 0x26, 0x91, 0xd6, 0x7e, 0x0d, 0xc2, ++ 0x03, 0xae, 0xe9, 0x38, 0xec, 0x31, 0x71, 0x9a, 0x1d, 0x07, 0x8d, 0x51, ++ 0x3e, 0x7e, 0x5e, 0x1c, 0x56, 0x81, 0x5a, 0xc0, 0xf5, 0x4d, 0xc5, 0xa3, ++ 0xb8, 0x82, 0xe7, 0xf7, 0x54, 0x3c, 0x1c, 0x94, 0x8f, 0x18, 0xb7, 0x0c, ++ 0x88, 0x16, 0x10, 0x5d, 0x0e, 0xba, 0x48, 0x74, 0x05, 0x25, 0x2e, 0xea, ++ 0x59, 0x09, 0xb2, 0x8d, 0xf8, 0x56, 0x08, 0x72, 0xbe, 0xfd, 0x7f, 0xc4, ++ 0xa1, 0x41, 0x57, 0x6d, 0xaa, 0x7f, 0x06, 0x3c, 0x5a, 0x67, 0xce, 0x8b, ++ 0xef, 0x9a, 0x79, 0x21, 0x12, 0x86, 0x75, 0xa9, 0x38, 0x9d, 0x91, 0x65, ++ 0xce, 0x27, 0xe3, 0x05, 0x68, 0x67, 0x68, 0xe9, 0xf4, 0x38, 0x26, 0xc7, ++ 0x6b, 0x33, 0x5b, 0xfe, 0x2e, 0x7b, 0x00, 0x8e, 0x46, 0xdb, 0x42, 0xb6, ++ 0x42, 0xe4, 0x6b, 0x5a, 0x7a, 0xca, 0x90, 0xff, 0x99, 0xbc, 0xd1, 0xe0, ++ 0x9b, 0x5a, 0x7e, 0xe1, 0x43, 0xfe, 0x54, 0xf4, 0x31, 0x83, 0x0f, 0xb4, ++ 0xd4, 0xd8, 0x15, 0x80, 0xde, 0xde, 0xc7, 0x43, 0x6d, 0x8f, 0x00, 0xa8, ++ 0x19, 0x59, 0x55, 0x10, 0xa0, 0xc2, 0x51, 0x2e, 0x50, 0xfe, 0xec, 0xf6, ++ 0x18, 0xf8, 0xab, 0xbd, 0x7b, 0x14, 0x0f, 0x9e, 0x23, 0xb5, 0xc4, 0xa5, ++ 0x90, 0x7f, 0x4e, 0x07, 0x62, 0x86, 0xf8, 0x89, 0x65, 0x22, 0x34, 0x20, ++ 0x6d, 0x93, 0xd4, 0x97, 0x65, 0xb4, 0xb3, 0x74, 0x75, 0xbc, 0xcf, 0x40, ++ 0xb8, 0x25, 0xbf, 0x03, 0xcf, 0xef, 0x78, 0xdc, 0x0e, 0x87, 0x70, 0xfd, ++ 0x7e, 0xc9, 0x90, 0x77, 0xe0, 0x3a, 0x67, 0x75, 0xca, 0x2f, 0x1c, 0xd7, ++ 0x32, 0x90, 0x1f, 0x1c, 0xac, 0xec, 0x61, 0xbe, 0xd9, 0xf7, 0x47, 0xfd, ++ 0xc7, 0x48, 0xbf, 0xda, 0xfb, 0xb0, 0x06, 0x64, 0xc7, 0x39, 0xa6, 0x7c, ++ 0xd6, 0x3e, 0x3f, 0xce, 0x57, 0x4f, 0x92, 0x3c, 0x38, 0xcb, 0x81, 0xe2, ++ 0x5e, 0xe4, 0x34, 0xf4, 0x8c, 0x0f, 0x56, 0x56, 0x52, 0x5c, 0xce, 0x10, ++ 0x48, 0x34, 0x9f, 0xeb, 0xad, 0x21, 0xdc, 0xfe, 0x92, 0x1f, 0x3a, 0x43, ++ 0xf2, 0x09, 0xb7, 0x91, 0x5f, 0x67, 0x28, 0x07, 0xe7, 0xcf, 0x4e, 0xdf, ++ 0x97, 0x83, 0xa7, 0x49, 0x7e, 0xea, 0x78, 0xe2, 0x43, 0x34, 0x00, 0xd7, ++ 0xbf, 0x25, 0xab, 0xe7, 0x68, 0xbe, 0x2b, 0xf3, 0xd3, 0x72, 0xaa, 0x4b, ++ 0x77, 0x97, 0xbd, 0xd3, 0xa7, 0x7b, 0x53, 0x79, 0xca, 0x70, 0xff, 0x4d, ++ 0xe8, 0x77, 0x24, 0x08, 0x51, 0x89, 0xd7, 0x91, 0x66, 0xcf, 0x6d, 0xac, ++ 0xa3, 0x80, 0x31, 0x99, 0xc4, 0x78, 0x26, 0xb6, 0xa2, 0x1e, 0xc4, 0xa1, ++ 0x36, 0xa4, 0x46, 0xec, 0x38, 0xfc, 0xa5, 0x4d, 0x13, 0xf5, 0x58, 0xa4, ++ 0x48, 0x6f, 0x8c, 0xea, 0x5d, 0x97, 0xa4, 0x97, 0x2e, 0xc3, 0x75, 0x2f, ++ 0x6f, 0xb8, 0x25, 0x19, 0x79, 0x56, 0x6c, 0xe4, 0x99, 0x59, 0x87, 0x86, ++ 0x2e, 0x0d, 0xbf, 0x50, 0x64, 0xb0, 0x21, 0x48, 0x3b, 0x57, 0x5d, 0x97, ++ 0xee, 0xff, 0xe3, 0xf7, 0x88, 0x5f, 0xd7, 0x3d, 0x97, 0x42, 0xe2, 0xa9, ++ 0xf3, 0x74, 0xb4, 0x07, 0xb2, 0x48, 0xc8, 0x65, 0xa9, 0x1b, 0xc9, 0x73, ++ 0xd6, 0x78, 0xde, 0x11, 0x13, 0xb3, 0x88, 0x5f, 0xbc, 0x95, 0xe4, 0x96, ++ 0xbf, 0x33, 0x52, 0x46, 0x7e, 0xad, 0x18, 0xd1, 0x23, 0x6e, 0xd2, 0x33, ++ 0xf4, 0x5e, 0x91, 0x61, 0x87, 0xd9, 0x17, 0x82, 0xff, 0x64, 0x5f, 0xa4, ++ 0x2f, 0xb4, 0x8b, 0x54, 0x9c, 0x01, 0xba, 0xcf, 0x89, 0x51, 0x07, 0xe2, ++ 0xd5, 0xcd, 0xc2, 0x97, 0xdd, 0xc4, 0xff, 0x9c, 0x29, 0x1a, 0xda, 0xff, ++ 0x67, 0x27, 0xe6, 0x47, 0x36, 0xc9, 0x07, 0x5d, 0x85, 0xe8, 0xd7, 0x76, ++ 0xd3, 0xaf, 0xce, 0xe1, 0x13, 0x7d, 0x6e, 0xa4, 0xdb, 0x5f, 0x7d, 0x7a, ++ 0x2d, 0x54, 0xd1, 0x71, 0xb0, 0xf3, 0xfa, 0x2d, 0xe3, 0x0f, 0x9d, 0xff, ++ 0x9d, 0xaf, 0xdb, 0x53, 0xf5, 0x9c, 0x7f, 0x63, 0x20, 0xd0, 0xcf, 0x2e, ++ 0x48, 0x7e, 0x62, 0x12, 0xe5, 0x41, 0xe7, 0x80, 0x55, 0xae, 0x0b, 0x0e, ++ 0xff, 0x8d, 0xea, 0x4e, 0x57, 0x7a, 0x9d, 0x47, 0xbb, 0x26, 0x64, 0x77, ++ 0x2e, 0xc7, 0xdb, 0xec, 0x57, 0x40, 0x2d, 0x04, 0xf5, 0x3d, 0x6b, 0xae, ++ 0x25, 0x3f, 0x5c, 0x64, 0xf7, 0x90, 0x14, 0x75, 0x30, 0xa4, 0x3f, 0xe9, ++ 0x51, 0x3c, 0xc4, 0x9b, 0xe7, 0x07, 0x2e, 0x7e, 0x0f, 0xd2, 0xe5, 0xe1, ++ 0xd5, 0x1c, 0x1e, 0xfb, 0xe4, 0x79, 0xfa, 0xe6, 0x01, 0xb4, 0x3d, 0x27, ++ 0x85, 0x57, 0xe0, 0xa4, 0x23, 0x48, 0xb8, 0x07, 0x4e, 0xe6, 0x07, 0xc9, ++ 0xbf, 0x80, 0x04, 0x5b, 0x42, 0x1c, 0xef, 0x28, 0xcf, 0xe3, 0x00, 0xe6, ++ 0x06, 0xc3, 0x7c, 0x3a, 0x3d, 0x77, 0xc2, 0x27, 0xe0, 0x3e, 0xa7, 0x87, ++ 0x2a, 0x14, 0xac, 0xa0, 0x70, 0x61, 0x5f, 0x10, 0xfe, 0xb8, 0x30, 0x65, ++ 0x5f, 0xb7, 0x79, 0x9e, 0xda, 0xc5, 0x53, 0xad, 0x12, 0xe6, 0xc1, 0xbd, ++ 0x67, 0xc0, 0x83, 0x47, 0x12, 0xba, 0x87, 0x5f, 0x8b, 0x38, 0x91, 0xef, ++ 0x3e, 0x08, 0x24, 0x01, 0xf7, 0xe8, 0x0b, 0xf5, 0xdc, 0x1b, 0x13, 0xa2, ++ 0xa4, 0xa7, 0x71, 0xb8, 0xa6, 0x80, 0xe2, 0x7d, 0xd6, 0x3c, 0x9f, 0x8e, ++ 0x02, 0x01, 0xe4, 0x34, 0x9c, 0x32, 0xe4, 0x39, 0x20, 0x57, 0xa4, 0xf8, ++ 0x24, 0xbe, 0x0e, 0x33, 0x3e, 0x99, 0x15, 0xf3, 0x2c, 0xf3, 0x6e, 0xe5, ++ 0x21, 0xcb, 0xfa, 0xec, 0x06, 0x9f, 0x75, 0xbd, 0x16, 0x8c, 0xfb, 0xeb, ++ 0xa9, 0x1e, 0x1b, 0xeb, 0xe7, 0x06, 0x97, 0x58, 0xe4, 0xf7, 0x67, 0xad, ++ 0xba, 0x46, 0x79, 0xb9, 0x3c, 0xbe, 0x6d, 0x2d, 0xe1, 0x92, 0xb3, 0xba, ++ 0xda, 0x32, 0x5f, 0x0f, 0x4e, 0x7e, 0x7f, 0xa8, 0x2b, 0x76, 0x29, 0x51, ++ 0x5c, 0x0f, 0x1f, 0x1b, 0xfd, 0xbc, 0x01, 0x7f, 0x78, 0x3f, 0x80, 0xb0, ++ 0x48, 0xfe, 0x35, 0xe9, 0x00, 0x3f, 0xc2, 0x78, 0x34, 0x8e, 0xdb, 0x2c, ++ 0x71, 0xcf, 0xd0, 0x31, 0x1f, 0x51, 0x2e, 0xe3, 0xdd, 0xb4, 0xb8, 0xe3, ++ 0xaf, 0x43, 0xb6, 0xf2, 0xcb, 0xbc, 0x66, 0x1e, 0x14, 0x43, 0x71, 0x7a, ++ 0x1e, 0xa4, 0x70, 0x76, 0x3d, 0xc0, 0x91, 0xe7, 0xc1, 0x30, 0x0a, 0x11, ++ 0xce, 0x6e, 0x29, 0x8a, 0x57, 0x8e, 0x69, 0x38, 0xd5, 0xc3, 0xc2, 0x6c, ++ 0x9a, 0xaf, 0xbb, 0x26, 0x42, 0x94, 0xe3, 0xde, 0xa3, 0xc4, 0x70, 0x7c, ++ 0x7e, 0xc8, 0x8a, 0x77, 0x7e, 0x87, 0x15, 0xef, 0x42, 0xd5, 0x8a, 0x6f, ++ 0xd1, 0x76, 0x2b, 0xbe, 0x25, 0x61, 0x2b, 0xbe, 0x0b, 0xf6, 0x5a, 0xf1, ++ 0xf4, 0x6a, 0x56, 0xfc, 0xca, 0x0e, 0x34, 0x5a, 0xe4, 0x1f, 0xee, 0x6f, ++ 0xb1, 0xf0, 0x8b, 0x8e, 0xac, 0xb1, 0xc8, 0x2f, 0x8e, 0xae, 0xb7, 0xf0, ++ 0x95, 0xaf, 0x3f, 0x61, 0x91, 0x5f, 0x3a, 0xf0, 0x0d, 0xcb, 0x7c, 0xe0, ++ 0xfc, 0x0e, 0xcb, 0x7c, 0x32, 0xaf, 0xa6, 0xc6, 0x7d, 0x59, 0xac, 0xdb, ++ 0x22, 0x37, 0x35, 0xee, 0x35, 0xd7, 0x9e, 0xb7, 0xe8, 0x4d, 0xc6, 0x59, ++ 0xc3, 0x9f, 0xff, 0x67, 0x9c, 0x77, 0x4d, 0x89, 0xf3, 0xf3, 0x68, 0x1b, ++ 0x9d, 0xbb, 0xeb, 0x59, 0x63, 0x87, 0xe9, 0x18, 0x7e, 0x35, 0xd3, 0xa8, ++ 0x4b, 0xed, 0x62, 0x73, 0x3c, 0x48, 0xf1, 0x6e, 0xb6, 0x2b, 0x14, 0xd3, ++ 0xdf, 0xc9, 0x39, 0xad, 0x6e, 0x3a, 0xef, 0x66, 0x1f, 0x0a, 0x99, 0x7d, ++ 0x08, 0xd4, 0x3e, 0x1e, 0xf7, 0x90, 0x99, 0x27, 0x4a, 0x5c, 0xb9, 0x4c, ++ 0x75, 0xb4, 0xfa, 0x66, 0xa8, 0x35, 0x0b, 0xf9, 0x5a, 0x3d, 0x7c, 0x99, ++ 0xca, 0x71, 0xfd, 0x58, 0x7f, 0x6b, 0xb6, 0xcc, 0xd3, 0x44, 0xf6, 0xa0, ++ 0x3c, 0x33, 0x71, 0x79, 0xb4, 0x81, 0x81, 0xcd, 0x72, 0x5e, 0x90, 0xcf, ++ 0x4b, 0xe1, 0xb6, 0x41, 0xeb, 0x15, 0xb3, 0x51, 0xb8, 0xe9, 0xd3, 0x68, ++ 0x84, 0x97, 0x4b, 0x4a, 0x2a, 0xdc, 0x7f, 0xbd, 0x39, 0xcf, 0x1a, 0x8c, ++ 0xba, 0xbe, 0x2e, 0x98, 0x01, 0xb6, 0x34, 0x3c, 0x96, 0x9b, 0xe3, 0x00, ++ 0x7e, 0x6e, 0x5f, 0xb3, 0x31, 0x05, 0x1b, 0xcc, 0xf7, 0x00, 0xde, 0xcb, ++ 0x41, 0xa2, 0x7b, 0xb9, 0xe0, 0x8c, 0x46, 0xbc, 0x33, 0xdd, 0x27, 0x95, ++ 0x23, 0x22, 0xbf, 0x27, 0xa9, 0xfc, 0xde, 0x74, 0x95, 0xa9, 0x76, 0xa2, ++ 0x1b, 0x9d, 0xf1, 0x52, 0xea, 0x5f, 0xc7, 0xf2, 0xd4, 0x23, 0x5e, 0xac, ++ 0xf3, 0x77, 0x05, 0x45, 0xe6, 0xf7, 0x2c, 0xa6, 0x47, 0xc8, 0xa9, 0x04, ++ 0x39, 0xc6, 0x9b, 0xce, 0x8d, 0x50, 0xd0, 0x4f, 0xf7, 0x77, 0xfc, 0xf3, ++ 0x21, 0xac, 0xbb, 0xc2, 0xf5, 0x90, 0xe6, 0xe7, 0xe6, 0x7b, 0x74, 0xb4, ++ 0x5f, 0x35, 0xed, 0x39, 0xe1, 0x55, 0x8f, 0x91, 0x9e, 0x51, 0xe6, 0xe9, ++ 0xab, 0xc1, 0xb5, 0xd7, 0x1b, 0x3f, 0x2a, 0xa5, 0xfe, 0xe3, 0x10, 0x11, ++ 0x09, 0xac, 0x83, 0x81, 0xac, 0xe0, 0x6b, 0x34, 0xaf, 0xed, 0x6f, 0x9e, ++ 0xcb, 0xfb, 0x6a, 0x3e, 0xfa, 0x87, 0x75, 0x54, 0x17, 0x64, 0x7e, 0x7f, ++ 0xd0, 0x9e, 0x67, 0xfc, 0x3d, 0xf0, 0x11, 0x29, 0x7b, 0x24, 0xed, 0x9c, ++ 0x1e, 0xb0, 0xf3, 0xbe, 0x03, 0xe6, 0xfb, 0x68, 0xb3, 0x89, 0x57, 0xf2, ++ 0x7d, 0xb4, 0xc9, 0xdc, 0x7f, 0x14, 0x55, 0x6c, 0xc7, 0x3a, 0xbd, 0xf9, ++ 0xfc, 0x55, 0x8e, 0xcb, 0xce, 0x82, 0x71, 0xb0, 0xe5, 0xf0, 0x7c, 0xe3, ++ 0xf7, 0xa4, 0xa7, 0x8b, 0x5d, 0xd5, 0x87, 0xc8, 0xa7, 0x60, 0x8d, 0xb2, ++ 0x7e, 0x29, 0x8d, 0x27, 0xdf, 0x4b, 0x45, 0xe2, 0xe7, 0xe9, 0x8b, 0xed, ++ 0xa2, 0x3f, 0x5b, 0x9f, 0xe1, 0xbe, 0x98, 0xa4, 0x3b, 0x0b, 0xc6, 0xf8, ++ 0x7b, 0xee, 0xc1, 0xfa, 0x53, 0x46, 0x1f, 0x99, 0x5d, 0xbf, 0xc6, 0xfb, ++ 0x6c, 0xca, 0x6f, 0x43, 0xff, 0xe8, 0xc1, 0x4c, 0xde, 0x5f, 0x46, 0x0f, ++ 0x96, 0xb4, 0x10, 0x4d, 0xe9, 0xbf, 0xcb, 0xf5, 0x6f, 0x0e, 0xdf, 0xb0, ++ 0xe4, 0xc9, 0x96, 0xbd, 0xef, 0x5b, 0xf2, 0xef, 0x29, 0xed, 0x0f, 0x96, ++ 0x79, 0x3d, 0x77, 0xc2, 0x5e, 0x84, 0xfe, 0xeb, 0x6f, 0x14, 0xae, 0xfa, ++ 0x3a, 0xe2, 0x77, 0xe7, 0x9c, 0xa3, 0x9e, 0xde, 0x8d, 0x18, 0xb7, 0x9b, ++ 0xde, 0xba, 0x94, 0x7e, 0xfd, 0xc5, 0x45, 0x6d, 0xb4, 0xdf, 0x7f, 0xf7, ++ 0xf3, 0xaf, 0x1c, 0xdf, 0x91, 0x7d, 0x71, 0xb0, 0x2d, 0x4c, 0xf9, 0x79, ++ 0x6b, 0xdf, 0x4d, 0xce, 0xeb, 0xfb, 0x74, 0x4e, 0xa7, 0xfa, 0x99, 0x7c, ++ 0x67, 0x26, 0xa9, 0xf4, 0x16, 0x54, 0xd8, 0x30, 0x3e, 0x13, 0x6c, 0x8e, ++ 0x72, 0xdc, 0x3b, 0x7d, 0x9f, 0x2d, 0x3e, 0xe3, 0x5d, 0x32, 0xb2, 0x32, ++ 0xaf, 0x85, 0xfa, 0xec, 0x48, 0x89, 0x64, 0x33, 0x68, 0xb9, 0xc1, 0x17, ++ 0x36, 0x38, 0x0d, 0x7e, 0xd5, 0x6a, 0xa2, 0x09, 0xbb, 0xeb, 0x00, 0xbd, ++ 0x33, 0x47, 0x18, 0x04, 0x19, 0xe6, 0xc3, 0x26, 0x16, 0xfa, 0xe9, 0x53, ++ 0xe8, 0xf7, 0x0b, 0x79, 0xea, 0x27, 0x94, 0x7f, 0x5d, 0x3b, 0x26, 0xaa, ++ 0x6c, 0x78, 0x1e, 0xba, 0x02, 0xfa, 0x93, 0x0c, 0xe3, 0x59, 0x3c, 0x57, ++ 0xfd, 0x17, 0xf9, 0xcf, 0xf0, 0x7a, 0x57, 0x38, 0x8f, 0xdb, 0x59, 0x4e, ++ 0xf7, 0x8e, 0x31, 0x41, 0xab, 0x62, 0x58, 0x0b, 0xaa, 0x7d, 0x85, 0xeb, ++ 0x6c, 0x18, 0x97, 0xb1, 0x39, 0xda, 0x5d, 0xea, 0xc4, 0x4b, 0x8e, 0xe7, ++ 0x1a, 0xbc, 0x64, 0x9c, 0x8f, 0x46, 0xdf, 0x24, 0x3f, 0x0f, 0xcd, 0x1e, ++ 0x55, 0xf0, 0xa1, 0x9e, 0x0f, 0x99, 0x18, 0xe3, 0xf9, 0xfc, 0x4b, 0x16, ++ 0x3d, 0xc1, 0xf3, 0x4d, 0x97, 0xd6, 0xbb, 0xf9, 0x79, 0xea, 0xa0, 0x77, ++ 0x17, 0xbd, 0x77, 0xe9, 0xbd, 0x91, 0xc8, 0x30, 0x68, 0x86, 0x8f, 0x71, ++ 0xff, 0xe6, 0x4c, 0xa1, 0x0b, 0x7d, 0x46, 0x3d, 0x6b, 0x34, 0x69, 0xbb, ++ 0x78, 0xb8, 0x9c, 0xd1, 0xfd, 0xe0, 0x88, 0x03, 0xe8, 0x3c, 0xe0, 0x3e, ++ 0x41, 0x81, 0xf6, 0x19, 0x72, 0x44, 0x4f, 0x20, 0x9f, 0x87, 0xb6, 0xd3, ++ 0x3d, 0xe5, 0xd7, 0x92, 0x71, 0x9f, 0xaf, 0xfe, 0x95, 0x23, 0x46, 0x75, ++ 0x63, 0x9b, 0xf3, 0x63, 0x1e, 0xa7, 0x12, 0x9f, 0x97, 0xeb, 0xc9, 0x2d, ++ 0xc3, 0xca, 0x85, 0xeb, 0x72, 0x5f, 0x72, 0x44, 0x23, 0x64, 0x9f, 0x1e, ++ 0x2f, 0x5d, 0x87, 0xf6, 0xf5, 0xdb, 0xf1, 0xfe, 0x42, 0xef, 0xe9, 0x77, ++ 0x71, 0x1e, 0xcf, 0xdd, 0x9d, 0x17, 0x17, 0x1d, 0x3f, 0x94, 0x16, 0x8f, ++ 0x12, 0x33, 0x0e, 0xf0, 0x0c, 0x80, 0x31, 0x9f, 0x7f, 0x8c, 0xe6, 0x3b, ++ 0x87, 0x47, 0x6f, 0x51, 0x1d, 0xb9, 0xe2, 0x55, 0xbd, 0xe4, 0xff, 0xa8, ++ 0x20, 0xd7, 0x53, 0x1d, 0xe9, 0xcc, 0x7a, 0x53, 0xa2, 0xfa, 0x53, 0xe3, ++ 0x93, 0xf9, 0x3a, 0xb4, 0x97, 0xfb, 0x8f, 0xf5, 0xe0, 0xfb, 0x8c, 0xe3, ++ 0xec, 0xf4, 0xfc, 0x09, 0xf3, 0x75, 0x0b, 0x16, 0x9b, 0x6c, 0x7a, 0xbf, ++ 0x09, 0xea, 0x62, 0x5a, 0xdf, 0xe9, 0xd4, 0x25, 0xd2, 0x87, 0x19, 0xc1, ++ 0xef, 0x7f, 0xb3, 0xf9, 0x7f, 0x67, 0x6b, 0xfc, 0x15, 0x3f, 0xd2, 0xbb, ++ 0x6e, 0xa5, 0x94, 0xf6, 0x49, 0xee, 0x8b, 0x76, 0xd4, 0x90, 0x9e, 0xa4, ++ 0xdf, 0x49, 0x3b, 0x52, 0x7a, 0x3e, 0x3b, 0xaf, 0xb7, 0x39, 0x27, 0x2c, ++ 0xe7, 0xf7, 0xf6, 0xd1, 0xfd, 0xe5, 0x74, 0x4e, 0x10, 0x5f, 0x95, 0xec, ++ 0xaf, 0x16, 0xd9, 0x96, 0xf5, 0x33, 0xac, 0x7f, 0xdc, 0x8c, 0xdb, 0xbf, ++ 0xf3, 0x43, 0x2b, 0x7d, 0x48, 0x77, 0x84, 0x7f, 0xf0, 0xc6, 0xdb, 0x72, ++ 0x6a, 0x3e, 0xc1, 0xfa, 0xbf, 0xf5, 0x01, 0xc5, 0x6b, 0xd8, 0xc5, 0xeb, ++ 0xdc, 0x6c, 0xeb, 0xa7, 0xfa, 0xd9, 0x79, 0x69, 0x98, 0xe3, 0x81, 0x7e, ++ 0x3e, 0x49, 0xfe, 0xa5, 0xf9, 0xf9, 0x28, 0xed, 0x93, 0xf4, 0xf3, 0xce, ++ 0xd0, 0x7b, 0xaf, 0xf8, 0xe5, 0x2f, 0xee, 0x5f, 0xa2, 0x24, 0x2e, 0x91, ++ 0xde, 0xc4, 0xb1, 0xfb, 0xa5, 0x32, 0xae, 0xef, 0xbc, 0x78, 0xf5, 0x26, ++ 0xe5, 0x4f, 0xa7, 0xf9, 0xce, 0x87, 0xb3, 0xd6, 0xf7, 0xbb, 0x63, 0x0e, ++ 0xbe, 0x13, 0xe7, 0xa5, 0xd5, 0x73, 0xaa, 0x71, 0x0b, 0xf8, 0x34, 0x4b, ++ 0xbf, 0x3f, 0x39, 0x92, 0xeb, 0x8b, 0x6d, 0xd6, 0xf5, 0x78, 0x51, 0x16, ++ 0x70, 0xbf, 0xb3, 0xe6, 0xfb, 0xe1, 0x3c, 0x9d, 0xdb, 0x19, 0xde, 0x99, ++ 0x67, 0xe3, 0x02, 0x6f, 0x95, 0x67, 0x0b, 0xf0, 0x7e, 0x46, 0x7d, 0x00, ++ 0xfb, 0x2e, 0xd5, 0xfd, 0x64, 0xdf, 0xdd, 0x7d, 0x43, 0xe0, 0xf9, 0xb8, ++ 0xdb, 0x0b, 0x7c, 0x9e, 0xec, 0xa2, 0xfc, 0x67, 0xfa, 0x15, 0xde, 0x07, ++ 0x92, 0xff, 0x47, 0x88, 0x30, 0xec, 0x6f, 0x98, 0x07, 0xdd, 0x92, 0xfa, ++ 0x6d, 0xca, 0x0f, 0x50, 0x7b, 0x78, 0x5f, 0x10, 0x17, 0xb8, 0x14, 0xca, ++ 0xe3, 0xc1, 0xdf, 0xac, 0x31, 0xdf, 0x4b, 0x46, 0x9f, 0xa9, 0x33, 0xfb, ++ 0x4a, 0x1d, 0xe9, 0x21, 0xfb, 0xfd, 0xd9, 0xbc, 0xdf, 0xd4, 0x9a, 0xfb, ++ 0xd6, 0x3b, 0xf1, 0x1e, 0xe3, 0xa3, 0x92, 0xad, 0x99, 0xff, 0x2f, 0x31, ++ 0xff, 0xaf, 0x70, 0xf0, 0x0a, 0x7f, 0x67, 0xfd, 0x07, 0x74, 0x15, 0x3e, ++ 0xc9, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00 ++}; ++ ++static const u8 usem_int_table_data_e1[] = { ++ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xfb, 0x51, ++ 0xcf, 0xc0, 0xf0, 0x03, 0x8a, 0xb7, 0xc9, 0x33, 0x30, 0x98, 0x29, 0x31, ++ 0x30, 0x24, 0x2a, 0x33, 0x30, 0x9c, 0x01, 0xe2, 0x24, 0x79, 0x84, 0x1c, ++ 0xad, 0xb0, 0x2a, 0x07, 0x65, 0xfa, 0x5f, 0x30, 0x32, 0x30, 0xbc, 0x02, ++ 0xe2, 0x37, 0x40, 0xfc, 0x8e, 0x91, 0x74, 0xfd, 0x3f, 0x85, 0x10, 0xec, ++ 0x87, 0xbc, 0x0c, 0x0c, 0xbf, 0x80, 0xfc, 0x8d, 0x40, 0x5a, 0x4c, 0x80, ++ 0x81, 0xe1, 0x26, 0x90, 0xfd, 0x1b, 0x88, 0xbf, 0x03, 0xf9, 0xe2, 0x7c, ++ 0x0c, 0x0c, 0xca, 0x40, 0x6c, 0x06, 0xe4, 0xbb, 0x00, 0xe9, 0x3c, 0x20, ++ 0xf6, 0x07, 0xe2, 0x3f, 0x40, 0x7e, 0x1b, 0x1f, 0x6e, 0xf3, 0xff, 0x0a, ++ 0xe1, 0xb7, 0xff, 0xaa, 0x00, 0x2a, 0x9f, 0x57, 0x10, 0x95, 0xff, 0x91, ++ 0x1f, 0xbf, 0xfe, 0x0e, 0x41, 0xfc, 0xf2, 0xbc, 0x04, 0xec, 0xc7, 0x86, ++ 0x4f, 0xa8, 0x91, 0x1f, 0x1f, 0x3c, 0xea, 0xb4, 0x4f, 0x33, 0xd4, 0xc4, ++ 0x37, 0x19, 0x50, 0xf9, 0xa7, 0x65, 0x18, 0x18, 0xee, 0xca, 0x32, 0x30, ++ 0x28, 0xc8, 0x43, 0xf8, 0xd7, 0x90, 0xe4, 0x8d, 0x80, 0x62, 0x67, 0x64, ++ 0x20, 0xec, 0xad, 0x62, 0x0c, 0x0c, 0x7b, 0xe5, 0x18, 0x18, 0x2e, 0x33, ++ 0x60, 0x37, 0x77, 0x1b, 0x50, 0x7e, 0x1f, 0x50, 0xde, 0x0e, 0x6a, 0x0e, ++ 0x00, 0xb5, 0xbc, 0x7b, 0x1e, 0x68, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00 ++}; ++ ++static const u8 usem_pram_data_e1[] = { ++ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xe5, 0x7d, ++ 0x0b, 0x78, 0x54, 0xd5, 0xb5, 0xf0, 0x3e, 0x73, 0xce, 0x99, 0x57, 0x66, ++ 0x26, 0x93, 0x84, 0x84, 0x84, 0xf0, 0x98, 0x24, 0x80, 0x3c, 0x02, 0x0e, ++ 0x01, 0x02, 0x48, 0xa8, 0x93, 0x07, 0x14, 0x25, 0xc0, 0x08, 0xa8, 0x68, ++ 0x11, 0x06, 0x51, 0x08, 0x8f, 0x3c, 0x44, 0xed, 0x97, 0x6b, 0xdb, 0xcb, ++ 0xf0, 0x4a, 0xd1, 0xd2, 0x36, 0xd6, 0xb6, 0xd2, 0x5e, 0xd4, 0x01, 0xe1, ++ 0x5e, 0xa4, 0x58, 0x03, 0x44, 0x8d, 0x1a, 0x60, 0x80, 0x60, 0x51, 0xc1, ++ 0x06, 0xeb, 0x03, 0xab, 0xd6, 0x00, 0xb6, 0x08, 0x02, 0x19, 0xa0, 0xea, ++ 0x48, 0xf1, 0xf7, 0x5f, 0x6b, 0xed, 0x7d, 0x92, 0x73, 0x26, 0x33, 0x40, ++ 0x7b, 0xfb, 0xdf, 0xbf, 0xdf, 0xff, 0x8f, 0xb5, 0xdb, 0x7d, 0xce, 0xde, ++ 0xfb, 0xec, 0xbd, 0xde, 0x6b, 0xed, 0xb5, 0x77, 0x54, 0x96, 0xca, 0xd8, ++ 0x8d, 0x8c, 0x7d, 0x83, 0x3f, 0x28, 0x1f, 0x90, 0x18, 0x63, 0xe9, 0x9d, ++ 0x25, 0xfc, 0xfe, 0xd7, 0x37, 0x19, 0x8c, 0x4d, 0xb5, 0xc2, 0x7f, 0xc9, ++ 0x8c, 0x8d, 0x97, 0x1d, 0x8c, 0x8d, 0x60, 0x6c, 0x8a, 0x83, 0x85, 0x2c, ++ 0xd0, 0x66, 0x4a, 0x11, 0x3c, 0xec, 0xc6, 0xd8, 0x9b, 0x9b, 0xa4, 0x90, ++ 0x8c, 0x7d, 0xa0, 0x5d, 0xb0, 0x90, 0xb1, 0x45, 0x8c, 0xff, 0xa6, 0x2a, ++ 0xac, 0x49, 0xba, 0x9e, 0xb1, 0x0b, 0xa3, 0x77, 0xd6, 0x0d, 0xf3, 0x30, ++ 0x26, 0xf9, 0x7c, 0xac, 0xb6, 0x00, 0x4a, 0x8f, 0x9b, 0xcd, 0xc2, 0xb2, ++ 0x68, 0xef, 0x57, 0x92, 0x8b, 0xb1, 0xe4, 0xd1, 0x26, 0xc6, 0x06, 0xf0, ++ 0x3e, 0xdf, 0xc0, 0xbf, 0x29, 0x3e, 0x3b, 0x8d, 0xa5, 0xd5, 0xd3, 0x26, ++ 0xa6, 0x1a, 0xea, 0xe9, 0xfe, 0x1e, 0x86, 0xf6, 0xdd, 0x67, 0xe6, 0x1a, ++ 0xde, 0x67, 0x05, 0x06, 0x19, 0xde, 0x67, 0x57, 0x14, 0x18, 0xea, 0xbd, ++ 0x6a, 0x6e, 0x30, 0xb4, 0xef, 0x53, 0x5b, 0x62, 0xa8, 0xe7, 0x04, 0x6f, ++ 0x36, 0xb4, 0xcf, 0x5b, 0x33, 0xcd, 0x50, 0xef, 0x57, 0x7f, 0xa7, 0xa1, ++ 0xfd, 0x75, 0xeb, 0xee, 0x36, 0xbc, 0x1f, 0x18, 0x5a, 0x64, 0x78, 0x3f, ++ 0x78, 0xcb, 0x52, 0x43, 0x7d, 0x48, 0xc3, 0x43, 0x86, 0xf6, 0xd7, 0x37, ++ 0xad, 0x30, 0xbc, 0x1f, 0x16, 0x7e, 0xc4, 0xf0, 0x7e, 0xf8, 0xc1, 0x9f, ++ 0x19, 0xea, 0x23, 0x5b, 0x7f, 0x6d, 0x68, 0x3f, 0xea, 0xe8, 0x46, 0xc3, ++ 0xfb, 0x31, 0x6d, 0x5b, 0x0d, 0xef, 0xc7, 0x7e, 0xba, 0xc3, 0x50, 0x1f, ++ 0x17, 0x79, 0xd9, 0xd0, 0xfe, 0xc6, 0xe8, 0x3e, 0x43, 0xbd, 0x98, 0xbd, ++ 0x61, 0x68, 0x5f, 0x6a, 0xfd, 0x83, 0xa1, 0x3e, 0xde, 0xfd, 0x81, 0xa1, ++ 0xfd, 0xb7, 0x33, 0x4f, 0x18, 0xde, 0xdf, 0xe4, 0xf9, 0xcc, 0xf0, 0x5e, ++ 0xa3, 0x83, 0x49, 0x03, 0x2e, 0x1a, 0x9e, 0x4f, 0xf6, 0xfe, 0xcd, 0xd0, ++ 0x4f, 0x61, 0x7e, 0x00, 0x36, 0x63, 0x66, 0x56, 0x43, 0xa5, 0x95, 0xd5, ++ 0x53, 0x69, 0x67, 0x0d, 0x54, 0x3a, 0x58, 0x2b, 0x95, 0xdf, 0xed, 0x1d, ++ 0xb8, 0x93, 0xe8, 0xf3, 0xc9, 0x60, 0x1d, 0x03, 0xba, 0x5b, 0x19, 0x8c, ++ 0xfc, 0x29, 0x0d, 0xca, 0x37, 0x47, 0xe7, 0x25, 0x07, 0xf2, 0x71, 0x34, ++ 0x1f, 0x63, 0x40, 0xb7, 0x53, 0xf8, 0xd0, 0x6c, 0x8a, 0xd5, 0x11, 0x96, ++ 0x81, 0xce, 0x2c, 0x56, 0x16, 0xb4, 0x01, 0x29, 0xb8, 0xa2, 0x40, 0x6f, ++ 0x69, 0x40, 0x77, 0x51, 0x46, 0xa5, 0x3b, 0x0a, 0xf4, 0x36, 0x1c, 0xe8, ++ 0x2e, 0x6a, 0xa5, 0x32, 0x35, 0x9a, 0x4a, 0xcf, 0xd3, 0xa2, 0x6e, 0x2a, ++ 0xbb, 0x45, 0x7b, 0xd0, 0xf3, 0xf4, 0x68, 0x26, 0x95, 0x19, 0xd1, 0x5c, ++ 0x2a, 0xbb, 0x47, 0x3d, 0x54, 0x66, 0x46, 0x07, 0x51, 0x99, 0x15, 0x1d, ++ 0x40, 0x65, 0x8f, 0x68, 0x01, 0xf5, 0xcb, 0x8e, 0x7a, 0xa9, 0xec, 0x19, ++ 0xbd, 0x81, 0x9e, 0xf7, 0x8a, 0x8e, 0xa6, 0xb2, 0x77, 0xb4, 0x84, 0x9e, ++ 0xf7, 0x89, 0xfa, 0xa8, 0xf4, 0x44, 0x6f, 0xa6, 0x32, 0x27, 0x3a, 0x91, ++ 0xca, 0xdc, 0xe8, 0x34, 0x6a, 0x97, 0x17, 0xf5, 0x53, 0xd9, 0x37, 0x7a, ++ 0x27, 0x3d, 0xef, 0x17, 0x9d, 0x49, 0x65, 0xff, 0xe8, 0xdd, 0x54, 0x5e, ++ 0x17, 0x0d, 0x50, 0x39, 0x20, 0xba, 0x88, 0xca, 0x81, 0xd1, 0x0a, 0x2a, ++ 0x07, 0x45, 0x97, 0x52, 0xbf, 0xc1, 0xd1, 0x1a, 0x2a, 0xf3, 0xa3, 0x0f, ++ 0xd1, 0xf3, 0x21, 0xd1, 0x5a, 0x2a, 0x87, 0x46, 0x57, 0x50, 0x79, 0x7d, ++ 0x34, 0x48, 0xa5, 0x37, 0xfa, 0x08, 0xb5, 0x1b, 0x16, 0x5d, 0x43, 0x65, ++ 0x41, 0xf4, 0x67, 0xf4, 0x7c, 0x78, 0xb4, 0x9e, 0xca, 0x11, 0xd1, 0x5f, ++ 0xd3, 0xf3, 0x91, 0xd1, 0x75, 0x54, 0x16, 0x46, 0x37, 0x52, 0x39, 0x2a, ++ 0x1a, 0xa2, 0x72, 0x74, 0x74, 0x2b, 0x95, 0x63, 0xa2, 0x5b, 0xa8, 0xbc, ++ 0x21, 0xba, 0x83, 0xfa, 0x8d, 0x8d, 0x36, 0x50, 0x59, 0x14, 0x7d, 0x99, ++ 0x9e, 0x8f, 0x8b, 0x36, 0x51, 0xf9, 0x2d, 0xa4, 0xb7, 0x34, 0xa4, 0xbb, ++ 0x30, 0x95, 0xbe, 0xe8, 0xeb, 0xf4, 0xbc, 0x38, 0x7a, 0x90, 0xca, 0x92, ++ 0xe8, 0x5b, 0xf4, 0xbc, 0x34, 0xda, 0x4a, 0x65, 0x59, 0xf4, 0x8f, 0xf4, ++ 0x7c, 0x7c, 0xf4, 0x28, 0x95, 0x13, 0xa2, 0xc7, 0xa9, 0xfc, 0x76, 0xb4, ++ 0x8d, 0xca, 0x89, 0xd1, 0xd3, 0x54, 0xde, 0x14, 0xfd, 0x94, 0xca, 0x9b, ++ 0xa3, 0x17, 0xa8, 0xdf, 0xa4, 0x68, 0x84, 0xca, 0xf2, 0xe8, 0x25, 0x7a, ++ 0x3e, 0x39, 0x1a, 0xa5, 0x52, 0x93, 0x77, 0x6c, 0xb4, 0x7a, 0xa6, 0x4d, ++ 0xa3, 0xbf, 0x5c, 0xfc, 0xff, 0x59, 0xee, 0xbf, 0x0c, 0x06, 0xb9, 0xc4, ++ 0x02, 0xa6, 0x6f, 0xa0, 0x64, 0x0e, 0xa0, 0x83, 0x31, 0x9d, 0xed, 0x63, ++ 0x4b, 0x90, 0x76, 0x24, 0x27, 0x55, 0xa0, 0xab, 0x24, 0xa0, 0xef, 0x14, ++ 0x90, 0x85, 0x28, 0x0f, 0xa7, 0xd4, 0x48, 0xa1, 0x6f, 0xe7, 0x00, 0x7d, ++ 0x74, 0x6b, 0x6b, 0xc1, 0xba, 0x3a, 0xda, 0xe2, 0xb1, 0x40, 0xfd, 0x2e, ++ 0x16, 0x51, 0x91, 0x7e, 0x3f, 0x62, 0x6d, 0x4e, 0x94, 0xa7, 0x7b, 0xc7, ++ 0x9c, 0xec, 0xd9, 0x06, 0xf4, 0xfa, 0x66, 0x7a, 0xb8, 0x17, 0x10, 0x37, ++ 0xfe, 0x48, 0xde, 0xaa, 0x38, 0xa7, 0x3c, 0x94, 0xb7, 0x67, 0x94, 0x36, ++ 0x78, 0x3e, 0xa5, 0xdb, 0xbe, 0xf4, 0x80, 0x03, 0xfb, 0x03, 0x6f, 0x14, ++ 0x20, 0x79, 0xc3, 0xf7, 0x91, 0xbe, 0x81, 0x1c, 0x71, 0x9c, 0xbb, 0x14, ++ 0x16, 0x74, 0xc1, 0x54, 0x8f, 0xe0, 0x08, 0x63, 0xa8, 0x5d, 0xd8, 0x02, ++ 0xf5, 0x59, 0xe5, 0xcc, 0x57, 0x00, 0xed, 0xeb, 0xc6, 0x58, 0x66, 0x86, ++ 0xe0, 0x3b, 0x75, 0x05, 0xfe, 0x0a, 0x3f, 0x94, 0x3f, 0xce, 0xf1, 0xcf, ++ 0xc4, 0xf2, 0x75, 0x64, 0x1e, 0x98, 0xff, 0x7e, 0x51, 0x1e, 0x61, 0x26, ++ 0x2a, 0x7f, 0xdc, 0xdb, 0x4d, 0xe5, 0xac, 0xfb, 0xfa, 0x71, 0x7e, 0x2a, ++ 0x03, 0x20, 0x66, 0x5d, 0x1d, 0x0e, 0xe9, 0x19, 0xbc, 0x1f, 0x73, 0x44, ++ 0x7a, 0xfb, 0x87, 0x5c, 0x7b, 0x3f, 0x85, 0x41, 0xbf, 0x91, 0x9d, 0xed, ++ 0x9f, 0x61, 0xfe, 0x77, 0xf0, 0x79, 0xb0, 0x84, 0x0d, 0xa8, 0x71, 0x74, ++ 0xb6, 0x83, 0xe7, 0x47, 0xb1, 0x5d, 0x9c, 0xe7, 0x1f, 0xc4, 0x7b, 0xde, ++ 0x60, 0x02, 0x41, 0x00, 0xfa, 0x2a, 0x98, 0x6a, 0x0e, 0x6d, 0x46, 0xfd, ++ 0xc4, 0x3c, 0xc9, 0xb7, 0xe0, 0xbc, 0xac, 0x9e, 0xe4, 0x69, 0xce, 0xc4, ++ 0xf3, 0x7a, 0x78, 0x59, 0x66, 0xbe, 0xd2, 0x57, 0x3f, 0xcf, 0x10, 0xcd, ++ 0xef, 0x61, 0x89, 0xcd, 0x6c, 0xa0, 0xf1, 0x7d, 0x99, 0xd3, 0x86, 0xd0, ++ 0xf8, 0x84, 0xef, 0x60, 0xaa, 0x35, 0xb4, 0x39, 0x87, 0x50, 0x61, 0xa0, ++ 0x97, 0xbf, 0x22, 0x3c, 0xa1, 0x5f, 0xbe, 0xdd, 0xdf, 0x4e, 0xeb, 0x83, ++ 0x7e, 0x7e, 0x27, 0xc2, 0xc7, 0x7d, 0x4d, 0x70, 0x81, 0x7e, 0x5f, 0x10, ++ 0x3c, 0x15, 0xe8, 0x37, 0xe4, 0xda, 0xfb, 0x25, 0x2e, 0xeb, 0x99, 0x98, ++ 0x87, 0x87, 0xc6, 0x13, 0xcf, 0xab, 0x2d, 0x2c, 0x28, 0x01, 0x9c, 0x22, ++ 0x9b, 0x9d, 0xa1, 0x8d, 0x39, 0xb8, 0x26, 0x0f, 0xc9, 0xcf, 0x0a, 0xb7, ++ 0x10, 0xa0, 0xdd, 0x00, 0x18, 0xa0, 0xd7, 0x2b, 0x52, 0x10, 0x84, 0x8c, ++ 0xb5, 0xec, 0x4e, 0x0a, 0x9b, 0xa0, 0x7d, 0xd1, 0x66, 0xe7, 0x46, 0xb4, ++ 0x03, 0xda, 0x4b, 0x82, 0x19, 0x53, 0x11, 0x0e, 0x1b, 0x55, 0xb6, 0x19, ++ 0x9a, 0xac, 0xd8, 0xfd, 0xa3, 0x77, 0xff, 0x03, 0xea, 0x45, 0x1b, 0x54, ++ 0x66, 0x81, 0xfa, 0xc2, 0x8b, 0x3f, 0x2f, 0x64, 0x40, 0x47, 0xd7, 0x49, ++ 0x12, 0xff, 0x7e, 0xd0, 0xb7, 0xb7, 0x2f, 0x8c, 0x1f, 0x60, 0xda, 0xcf, ++ 0x27, 0xe1, 0xf8, 0x0b, 0x18, 0x1f, 0xbf, 0x5d, 0x12, 0x70, 0xdd, 0x9c, ++ 0x4c, 0x78, 0xfb, 0xb4, 0x6c, 0x53, 0xdd, 0x58, 0x28, 0xdb, 0x76, 0x55, ++ 0x96, 0x33, 0x90, 0xe3, 0x27, 0x01, 0xac, 0x59, 0x40, 0xdf, 0x0b, 0xed, ++ 0x4c, 0xc1, 0x72, 0x56, 0xcd, 0x76, 0x33, 0xd1, 0x69, 0x50, 0xfd, 0xa4, ++ 0x4d, 0xd3, 0x2f, 0xc4, 0xcf, 0x4a, 0x67, 0x5d, 0xee, 0x5a, 0x5f, 0x80, ++ 0x75, 0x8d, 0xff, 0x61, 0xdd, 0x0b, 0x43, 0x6a, 0x67, 0x1d, 0xfe, 0x5d, ++ 0xbc, 0xc5, 0x58, 0xd7, 0xc1, 0x8b, 0xec, 0xa0, 0xc8, 0x79, 0x25, 0xb4, ++ 0x91, 0xe8, 0x2a, 0x9b, 0xc3, 0x47, 0x83, 0x97, 0x2f, 0x9b, 0xc3, 0x4f, ++ 0xc0, 0xab, 0xec, 0xbc, 0x12, 0x34, 0x75, 0x23, 0x78, 0x85, 0x50, 0x0e, ++ 0x24, 0x4b, 0x1e, 0x82, 0x43, 0xc5, 0x79, 0x25, 0x2c, 0xc3, 0x38, 0x15, ++ 0x00, 0x47, 0x64, 0xc1, 0x8a, 0x5d, 0x0f, 0x67, 0x20, 0x9c, 0x16, 0x6f, ++ 0xb1, 0xb9, 0x3f, 0xd1, 0x7d, 0xb7, 0xb2, 0x21, 0xc5, 0x50, 0xaf, 0x6e, ++ 0xca, 0x72, 0x7f, 0xa2, 0xd3, 0xa3, 0x17, 0x0e, 0x3e, 0xed, 0xc2, 0xf5, ++ 0x2f, 0xcd, 0x34, 0xb9, 0x3f, 0x01, 0xf9, 0x76, 0x66, 0x99, 0x2f, 0xed, ++ 0x13, 0x40, 0xd9, 0xb9, 0x65, 0x13, 0xa9, 0xd4, 0xe8, 0xa3, 0xb2, 0x21, ++ 0xc7, 0xed, 0x30, 0x8c, 0x63, 0xac, 0x5f, 0xa8, 0x97, 0x26, 0x36, 0x90, ++ 0xfe, 0xf4, 0x24, 0xcf, 0x18, 0x92, 0x98, 0xce, 0x96, 0x66, 0x9a, 0xdd, ++ 0x9f, 0x00, 0xab, 0x9e, 0xde, 0xc2, 0xf5, 0xed, 0xe9, 0x65, 0x56, 0x37, ++ 0x7e, 0xe7, 0xcc, 0x32, 0xb7, 0x9b, 0x7f, 0x37, 0x93, 0x4a, 0x0d, 0x5e, ++ 0x4b, 0x6a, 0xed, 0xd4, 0x5e, 0x9b, 0x5f, 0xa2, 0x71, 0xff, 0xd9, 0xf3, ++ 0x63, 0xac, 0x91, 0x9d, 0xb0, 0xa2, 0x3c, 0x87, 0x77, 0x79, 0x89, 0xdb, ++ 0x27, 0xe4, 0x27, 0xe5, 0xaf, 0x66, 0xe2, 0x93, 0x66, 0xf5, 0x0b, 0xa4, ++ 0x1b, 0x2b, 0xfc, 0xfb, 0x8d, 0x89, 0xe8, 0x88, 0xea, 0xda, 0xb8, 0xd5, ++ 0x0d, 0x72, 0xd0, 0x72, 0x3d, 0x3e, 0xdf, 0x66, 0xf8, 0x1e, 0xf4, 0xf3, ++ 0xfc, 0x45, 0xa7, 0x5f, 0x12, 0xf3, 0xad, 0xc2, 0xfe, 0xa2, 0xa3, 0xcb, ++ 0xfb, 0x71, 0x00, 0xe2, 0x53, 0x2b, 0xe1, 0x39, 0x00, 0x23, 0x26, 0xc3, ++ 0x78, 0xed, 0x8a, 0x63, 0x0d, 0xda, 0x51, 0x93, 0x05, 0xfd, 0x54, 0x63, ++ 0x3b, 0x90, 0x07, 0x95, 0xd6, 0x36, 0x73, 0x00, 0x1e, 0x9d, 0x6d, 0xe4, ++ 0xf8, 0x48, 0xf4, 0x9d, 0xd3, 0xcb, 0xb6, 0x64, 0xa3, 0x5c, 0xab, 0xb0, ++ 0xd6, 0x9b, 0x51, 0x58, 0x55, 0x34, 0x0c, 0x2c, 0x43, 0x7e, 0x3a, 0xdb, ++ 0xb8, 0x32, 0x03, 0xf5, 0xcb, 0x62, 0xf9, 0xc2, 0x77, 0xfd, 0x71, 0xfa, ++ 0xff, 0x58, 0xe3, 0xdb, 0x90, 0x1a, 0x31, 0xea, 0xcb, 0x90, 0x98, 0x27, ++ 0x8c, 0x6b, 0xe0, 0x33, 0xe6, 0xe8, 0x58, 0x37, 0xd4, 0xcf, 0x98, 0xe0, ++ 0x53, 0x8e, 0xae, 0xe3, 0x3e, 0x2e, 0x71, 0xbd, 0x53, 0xb5, 0xed, 0xc8, ++ 0x84, 0xb1, 0x30, 0xff, 0xaa, 0xa6, 0xf3, 0x66, 0x9c, 0xc7, 0x64, 0x29, ++ 0xf0, 0xb8, 0x94, 0xde, 0xb9, 0x7e, 0x09, 0xd7, 0x0f, 0xe3, 0x2c, 0xda, ++ 0x72, 0x8c, 0xf8, 0xfc, 0x53, 0x35, 0xd8, 0xff, 0x7b, 0x39, 0x57, 0x80, ++ 0x67, 0x97, 0x79, 0x3a, 0x32, 0xff, 0x92, 0xa4, 0x9b, 0x5f, 0x10, 0x0c, ++ 0x49, 0xe0, 0xd7, 0xbb, 0x47, 0x0b, 0x7e, 0x65, 0x9e, 0xdb, 0x3f, 0x00, ++ 0xfe, 0x3c, 0xf5, 0x86, 0xca, 0x1e, 0x81, 0x79, 0xb0, 0xcb, 0xd0, 0x0a, ++ 0xde, 0xf7, 0x16, 0x6f, 0xef, 0x61, 0x7e, 0x17, 0xc2, 0xeb, 0xee, 0xc6, ++ 0xc5, 0x24, 0x7f, 0x4e, 0xa1, 0xfc, 0x41, 0x3d, 0xcc, 0xea, 0x0b, 0x91, ++ 0x3e, 0xce, 0x32, 0xd3, 0x44, 0x5c, 0xdf, 0x59, 0xf6, 0x96, 0x6b, 0xb8, ++ 0x0e, 0x7e, 0xfb, 0x24, 0xb3, 0x80, 0x0f, 0x98, 0xb2, 0x20, 0x0f, 0x2c, ++ 0xf4, 0x29, 0x82, 0x5b, 0x16, 0xea, 0x01, 0x4b, 0x45, 0x5d, 0xab, 0x3c, ++ 0x14, 0x9f, 0x2b, 0x41, 0x21, 0x97, 0xa4, 0x6f, 0x48, 0x9e, 0x84, 0x24, ++ 0xd2, 0x13, 0x15, 0xfc, 0x79, 0x90, 0x59, 0x97, 0xd3, 0x3a, 0xd6, 0x70, ++ 0x79, 0x14, 0x84, 0x7f, 0xb0, 0x7e, 0x6f, 0xbd, 0x51, 0x3e, 0x2d, 0x58, ++ 0x67, 0xac, 0xcf, 0x67, 0xd3, 0x32, 0x14, 0x90, 0x2f, 0xf3, 0x7f, 0xae, ++ 0xc2, 0x88, 0x20, 0xdf, 0xf4, 0xf2, 0x0f, 0xe0, 0xf7, 0x8c, 0xc4, 0xf5, ++ 0xee, 0x02, 0x56, 0x53, 0xe7, 0x86, 0xf9, 0x3f, 0x61, 0x06, 0x3c, 0xc1, ++ 0xfc, 0xef, 0x76, 0x33, 0x25, 0x1b, 0xd6, 0x57, 0xf9, 0xe2, 0x13, 0x85, ++ 0x73, 0xa1, 0xfe, 0x9a, 0xc4, 0xf5, 0xd8, 0xe9, 0x65, 0x30, 0xfd, 0xfe, ++ 0x30, 0x4e, 0x2a, 0x5f, 0xff, 0xa2, 0xda, 0x90, 0xd9, 0x97, 0xdf, 0x75, ++ 0x7d, 0x27, 0x1a, 0x87, 0xdf, 0x36, 0x96, 0xd1, 0x78, 0x24, 0x27, 0x83, ++ 0x8b, 0x34, 0xfd, 0xcb, 0x3c, 0x4a, 0x21, 0x49, 0x4b, 0x30, 0x72, 0x13, ++ 0xaf, 0x3f, 0xbb, 0x51, 0xf6, 0xd9, 0x5c, 0xd8, 0x0e, 0x9e, 0xeb, 0xe4, ++ 0xf3, 0xbc, 0x35, 0xc6, 0xf5, 0x5d, 0x6d, 0xfd, 0xb1, 0xeb, 0x65, 0xec, ++ 0x67, 0x44, 0x6f, 0x8b, 0xb6, 0xdc, 0xc2, 0x90, 0xce, 0xb4, 0xf5, 0x68, ++ 0xf8, 0xd2, 0xd6, 0xa3, 0x6e, 0x91, 0x7c, 0xa1, 0x38, 0x7c, 0xd0, 0x26, ++ 0xe8, 0x55, 0x93, 0x6b, 0x11, 0x01, 0x3f, 0xcd, 0xee, 0xf8, 0x3c, 0xa6, ++ 0x7e, 0x29, 0xa6, 0xfe, 0x4d, 0x4c, 0x5d, 0xa3, 0x6f, 0x55, 0xf0, 0x37, ++ 0xd0, 0xfd, 0xe7, 0xd2, 0x48, 0xe4, 0xe7, 0xc8, 0x04, 0x4e, 0x27, 0x6d, ++ 0x5c, 0xaf, 0x89, 0x76, 0xe6, 0xce, 0x76, 0x97, 0xae, 0xd4, 0xce, 0x22, ++ 0xf8, 0x05, 0xda, 0x7d, 0x73, 0xa5, 0x76, 0xb6, 0xce, 0xf1, 0x14, 0x53, ++ 0x7a, 0xd7, 0x76, 0x95, 0x2f, 0x3e, 0xfb, 0x42, 0x10, 0xe8, 0x7b, 0xd1, ++ 0x73, 0xbf, 0x70, 0x31, 0xa0, 0xc7, 0x53, 0x4a, 0x7d, 0x86, 0x17, 0x9e, ++ 0x2f, 0xd9, 0xbc, 0xda, 0x85, 0x70, 0xfa, 0x54, 0x09, 0xba, 0x90, 0x6e, ++ 0x4e, 0x85, 0xe4, 0x89, 0xf1, 0xe0, 0x35, 0xc6, 0x24, 0x69, 0xf6, 0x86, ++ 0x43, 0x02, 0xbc, 0x57, 0x69, 0xf4, 0x5f, 0xb4, 0x7c, 0x0a, 0xea, 0xf7, ++ 0x2f, 0x36, 0xab, 0xee, 0x47, 0x00, 0x2f, 0xd5, 0x5b, 0x2c, 0x61, 0x0b, ++ 0xe0, 0xbb, 0xaa, 0x71, 0x61, 0x39, 0x1b, 0x4a, 0xf5, 0x63, 0xbc, 0xfe, ++ 0xc3, 0xf3, 0x48, 0x1f, 0xd5, 0x4d, 0xea, 0x71, 0x3d, 0x5e, 0x17, 0xfd, ++ 0xd7, 0x2f, 0x32, 0x3c, 0x4e, 0xc2, 0x43, 0xb6, 0x09, 0x6d, 0x60, 0x16, ++ 0xce, 0x66, 0x50, 0x56, 0x6d, 0xfa, 0xf3, 0x04, 0xb4, 0xa3, 0xab, 0x59, ++ 0x84, 0xe8, 0x39, 0xb6, 0x1f, 0x7e, 0x1f, 0x5d, 0x3b, 0x90, 0xd7, 0x73, ++ 0xcd, 0xc9, 0x5d, 0xdf, 0x6b, 0x7e, 0x63, 0x35, 0x7f, 0xc4, 0xaa, 0x1b, ++ 0x7f, 0x74, 0x1e, 0xfd, 0xc6, 0x6a, 0xa6, 0x1c, 0xd7, 0xd3, 0x51, 0x05, ++ 0xd2, 0x32, 0xd8, 0x79, 0x83, 0x4c, 0xce, 0x6e, 0xe8, 0x2f, 0xb0, 0x51, ++ 0x6c, 0x14, 0xca, 0x15, 0x0d, 0x0e, 0x2c, 0x94, 0x4e, 0x72, 0x79, 0xe5, ++ 0x33, 0x8f, 0x0f, 0x3d, 0x06, 0xf3, 0x38, 0xb3, 0xe9, 0x0d, 0x97, 0xa4, ++ 0x83, 0x0f, 0x58, 0x48, 0x04, 0x97, 0x0b, 0x0d, 0xf3, 0x3e, 0x4e, 0xbb, ++ 0x82, 0x5e, 0x38, 0x07, 0xf4, 0xc9, 0xfa, 0xeb, 0xfb, 0x85, 0xa8, 0x9f, ++ 0xa7, 0x09, 0x26, 0xd0, 0x1d, 0xaa, 0xcd, 0xbc, 0x5c, 0xa2, 0x86, 0x5d, ++ 0x63, 0x01, 0x9e, 0x4b, 0x36, 0xa8, 0x5e, 0xa0, 0x4c, 0xb6, 0xe4, 0xd9, ++ 0xa7, 0xff, 0xf3, 0xd7, 0xc0, 0x77, 0xec, 0x7d, 0x8b, 0xb7, 0x1f, 0xc0, ++ 0x7b, 0xf1, 0xb3, 0x07, 0xde, 0xbd, 0x01, 0xea, 0x8b, 0xb7, 0xab, 0xdd, ++ 0xca, 0xf9, 0x32, 0x1c, 0x52, 0x46, 0x27, 0x3e, 0xaa, 0xe1, 0x5f, 0x8c, ++ 0xcb, 0x68, 0xf0, 0x5f, 0xb4, 0xf3, 0x80, 0xd9, 0x33, 0x84, 0x3f, 0xff, ++ 0x7e, 0x6a, 0x27, 0x1e, 0x16, 0x6f, 0xdf, 0x6b, 0x66, 0x43, 0xba, 0xc2, ++ 0xad, 0xb4, 0x61, 0xaf, 0xb9, 0xcd, 0x11, 0x07, 0x1f, 0x0d, 0xc7, 0x26, ++ 0xa0, 0x3d, 0xb3, 0xf2, 0x99, 0x2f, 0xcd, 0x88, 0xef, 0x53, 0xbb, 0x25, ++ 0xd6, 0x3d, 0xa7, 0x6b, 0xff, 0x8a, 0x0d, 0x07, 0xc8, 0x7e, 0x41, 0x38, ++ 0x11, 0xfe, 0x04, 0x7e, 0x3a, 0xf0, 0xd5, 0x05, 0x4f, 0xe1, 0x29, 0x2f, ++ 0x8f, 0xa0, 0x76, 0x6e, 0x94, 0xd7, 0x89, 0xf0, 0xe4, 0x44, 0x5d, 0x3d, ++ 0x92, 0xe8, 0xf8, 0xb7, 0x2f, 0xc3, 0xf7, 0x2b, 0xfe, 0x68, 0xf1, 0xe2, ++ 0xfa, 0x2b, 0x7e, 0x7b, 0xbf, 0x0b, 0xd7, 0x71, 0x52, 0xa9, 0xe1, 0xf4, ++ 0xfc, 0xc4, 0xea, 0x0c, 0x1f, 0x7c, 0xb7, 0x42, 0x0d, 0x66, 0xb8, 0xa9, ++ 0xe4, 0xcf, 0x2b, 0x9e, 0x7c, 0x90, 0xe8, 0x6c, 0xc1, 0x91, 0x07, 0xc9, ++ 0x2e, 0x03, 0xfa, 0xc8, 0x32, 0x91, 0xce, 0x08, 0x66, 0xe1, 0xfa, 0xee, ++ 0x5d, 0x7f, 0x2b, 0xad, 0x6f, 0x3e, 0x0b, 0x10, 0xbd, 0x55, 0x3c, 0x21, ++ 0xfb, 0x43, 0x28, 0x07, 0x14, 0x36, 0x71, 0x7b, 0x1c, 0x7e, 0x78, 0x4e, ++ 0xf0, 0xc3, 0xc9, 0x8d, 0x20, 0x29, 0x61, 0x7d, 0x27, 0x51, 0x3e, 0xa2, ++ 0x9d, 0xfb, 0x96, 0x2c, 0xe4, 0xe3, 0x7d, 0x64, 0x47, 0x3e, 0x28, 0xd6, ++ 0x0a, 0x96, 0x0c, 0xd5, 0x3f, 0xb7, 0x72, 0x3c, 0xd5, 0x99, 0x4c, 0x5a, ++ 0x5c, 0xce, 0x6a, 0xa0, 0xd3, 0x4d, 0x3f, 0x24, 0x39, 0x7a, 0xba, 0x97, ++ 0xaf, 0xbb, 0x3b, 0x9f, 0xe0, 0xa0, 0xc9, 0x4d, 0x92, 0xa7, 0xf2, 0x91, ++ 0xf1, 0xdd, 0x39, 0x7e, 0xb8, 0xfc, 0xa5, 0x7e, 0x40, 0x77, 0xa5, 0xf8, ++ 0x1c, 0xdb, 0xb7, 0xaa, 0x3e, 0xdb, 0x50, 0x43, 0x3f, 0x21, 0x2f, 0xf9, ++ 0xf7, 0x1f, 0x10, 0xdf, 0x87, 0x79, 0xdb, 0xd1, 0xfe, 0x38, 0x99, 0xc1, ++ 0xf5, 0x44, 0xec, 0xfa, 0xfe, 0x68, 0xd2, 0xe4, 0x23, 0xe8, 0x57, 0x1d, ++ 0x7d, 0xe9, 0xf8, 0x9a, 0xf3, 0xf9, 0xa6, 0x87, 0x39, 0x5f, 0x6b, 0x7c, ++ 0x1e, 0xba, 0x65, 0x22, 0xbe, 0xff, 0xeb, 0xdb, 0x9c, 0x7f, 0xb0, 0x1f, ++ 0xea, 0x1f, 0x98, 0x57, 0xb8, 0x3b, 0xbd, 0xdf, 0x3b, 0x43, 0x22, 0x39, ++ 0x60, 0x61, 0xe1, 0x78, 0xfc, 0xbc, 0x49, 0x15, 0xfc, 0x6c, 0x7c, 0x0f, ++ 0x12, 0x9a, 0xec, 0x37, 0x98, 0xb7, 0x22, 0x25, 0xeb, 0xe9, 0x04, 0xc6, ++ 0x4f, 0x25, 0xf8, 0x93, 0x5d, 0x32, 0xff, 0xe7, 0xd0, 0x4f, 0x67, 0x4f, ++ 0x57, 0xe3, 0xf7, 0xa8, 0x9d, 0xb9, 0xf3, 0x79, 0x4e, 0x27, 0xdf, 0x2e, ++ 0x10, 0xfc, 0xbf, 0x15, 0xf9, 0x3f, 0xa9, 0x93, 0xff, 0xd9, 0xfa, 0xf4, ++ 0x6b, 0xf2, 0xcf, 0x96, 0xa8, 0xa1, 0xff, 0xfc, 0x35, 0xf2, 0x2b, 0xf0, ++ 0x67, 0xd0, 0x83, 0xfc, 0xaa, 0xfa, 0x71, 0xdd, 0x9f, 0x6d, 0xdb, 0xff, ++ 0xee, 0x9d, 0x40, 0xd7, 0x9f, 0x35, 0x68, 0x7c, 0x6a, 0x94, 0x9b, 0xb1, ++ 0x7c, 0x5a, 0xb1, 0xe3, 0x41, 0x86, 0xf4, 0x19, 0xcb, 0xa7, 0x9f, 0xf5, ++ 0xac, 0x61, 0x71, 0xf9, 0x14, 0x9e, 0xc7, 0xe5, 0xd3, 0x9e, 0x6d, 0xff, ++ 0x23, 0x72, 0x53, 0x83, 0xdb, 0x91, 0x18, 0xb8, 0x81, 0x1c, 0x7c, 0xea, ++ 0x65, 0x4f, 0x62, 0xf8, 0xc5, 0xca, 0xc1, 0x6a, 0x93, 0x27, 0xae, 0x1c, ++ 0x84, 0xdf, 0xdb, 0xac, 0xb0, 0x2b, 0xdd, 0x69, 0xf4, 0xa6, 0xd1, 0xd9, ++ 0xa2, 0xdf, 0x54, 0xf6, 0x41, 0x79, 0xd3, 0x41, 0x8f, 0x1a, 0xbd, 0x75, ++ 0xd0, 0xa3, 0x46, 0x6f, 0xb1, 0xeb, 0x34, 0xc2, 0x2d, 0xf6, 0xfd, 0x7a, ++ 0x94, 0x37, 0x3a, 0xfb, 0x40, 0x5d, 0xc1, 0x82, 0x4e, 0xc0, 0x73, 0x64, ++ 0x97, 0x4c, 0x7e, 0x62, 0xbb, 0x27, 0xe2, 0x4a, 0x85, 0xef, 0xae, 0xb6, ++ 0xb1, 0x39, 0x68, 0x67, 0xb7, 0xbb, 0x45, 0x3d, 0x85, 0xd7, 0x23, 0xe9, ++ 0xe6, 0x3a, 0x94, 0x0b, 0xda, 0xf3, 0x88, 0x8d, 0xc7, 0x1b, 0xda, 0xfd, ++ 0x11, 0x57, 0x8a, 0xce, 0x7e, 0x3e, 0xd6, 0x2c, 0xbb, 0x3c, 0xf0, 0xbe, ++ 0x2d, 0xc4, 0x26, 0xc6, 0xb3, 0xab, 0x41, 0xe2, 0xd2, 0xf7, 0xdb, 0x58, ++ 0xa2, 0xf7, 0xcb, 0x09, 0x7e, 0xe3, 0x65, 0x47, 0xef, 0xda, 0x11, 0xe8, ++ 0x57, 0xc9, 0x5e, 0xb4, 0xdd, 0xee, 0x59, 0x7e, 0xbb, 0x0b, 0x43, 0x16, ++ 0xed, 0xcd, 0x79, 0x53, 0x67, 0xc2, 0xf3, 0x7b, 0x5f, 0x93, 0x29, 0xa6, ++ 0xd1, 0x6e, 0x77, 0x0d, 0xc5, 0x79, 0x81, 0xdf, 0xae, 0x64, 0x01, 0x7c, ++ 0xe7, 0x09, 0x3c, 0x7f, 0xca, 0x82, 0xbf, 0x2c, 0x82, 0x75, 0xcd, 0x6b, ++ 0xe6, 0x76, 0xf1, 0x3d, 0x6b, 0x8d, 0xf0, 0x98, 0xef, 0x78, 0xc0, 0x8c, ++ 0x72, 0x06, 0xec, 0xcf, 0x4e, 0x3a, 0xd0, 0xd1, 0x8b, 0xb6, 0x4f, 0x50, ++ 0xb1, 0xde, 0xf8, 0x7e, 0x11, 0x5b, 0x4b, 0xf8, 0x5a, 0x14, 0x43, 0x3f, ++ 0x01, 0xe1, 0xef, 0x64, 0xc9, 0x82, 0x7e, 0x86, 0xb1, 0x61, 0xc2, 0xdf, ++ 0x30, 0xe1, 0x78, 0x4b, 0x85, 0x9c, 0x1a, 0x2f, 0xe7, 0x4f, 0x9d, 0x09, ++ 0x70, 0x6f, 0x3f, 0x28, 0x33, 0x0b, 0xd4, 0x2f, 0x34, 0xcb, 0xac, 0x0e, ++ 0xd7, 0xb9, 0x4d, 0x0a, 0x31, 0xe4, 0xe3, 0x60, 0x3a, 0xd1, 0x61, 0x15, ++ 0xc8, 0x07, 0xa6, 0xf3, 0x0b, 0xcf, 0x20, 0x9d, 0x99, 0x13, 0xf3, 0xef, ++ 0x99, 0xe7, 0x3f, 0x2a, 0xfc, 0x1e, 0x34, 0x59, 0xf2, 0xc2, 0x07, 0x43, ++ 0xff, 0x03, 0xca, 0x33, 0x2f, 0xbc, 0xdf, 0xff, 0x15, 0xac, 0xbf, 0xf8, ++ 0x5e, 0xef, 0x0f, 0x58, 0xd7, 0xf6, 0xa5, 0xbb, 0xbf, 0x9a, 0x8d, 0xf2, ++ 0xbd, 0x7d, 0xb7, 0x85, 0x51, 0x9c, 0x64, 0xf7, 0xef, 0x7a, 0x7f, 0x0f, ++ 0xeb, 0x2f, 0x5b, 0xbc, 0x14, 0xe7, 0x58, 0x61, 0xe1, 0xf1, 0xa9, 0xdd, ++ 0xce, 0x50, 0x3f, 0x7c, 0xdf, 0x0b, 0xf0, 0x8d, 0xfa, 0x72, 0xd7, 0x97, ++ 0x43, 0xdb, 0x48, 0xdf, 0xac, 0x22, 0x3c, 0x95, 0xc9, 0xdc, 0x8f, 0xb8, ++ 0xd0, 0xfc, 0xb7, 0x3f, 0x49, 0xdd, 0xb0, 0x84, 0x55, 0xa1, 0x1e, 0xdd, ++ 0x9d, 0x44, 0xf6, 0x75, 0xf5, 0xcb, 0xb6, 0x10, 0x3a, 0x9d, 0xed, 0xbb, ++ 0xbe, 0x2c, 0x0c, 0x38, 0xfe, 0x79, 0xeb, 0xa9, 0x32, 0xb3, 0x00, 0xd1, ++ 0x9f, 0x93, 0xcd, 0xdc, 0x81, 0xf4, 0x9a, 0x02, 0x88, 0x83, 0xef, 0x57, ++ 0xbf, 0x32, 0xe6, 0xe9, 0xe5, 0xf0, 0xfd, 0xca, 0xc6, 0xbd, 0xe6, 0x79, ++ 0xf0, 0xbe, 0x74, 0xcf, 0xd7, 0x43, 0x51, 0xae, 0xb4, 0xef, 0xe0, 0xf6, ++ 0xc1, 0x39, 0xb5, 0xed, 0x49, 0xe6, 0x65, 0x6c, 0xaa, 0xfc, 0x8b, 0xe5, ++ 0x2a, 0xe0, 0xeb, 0x1c, 0xda, 0x6a, 0x3d, 0x40, 0x2e, 0xc9, 0xef, 0x16, ++ 0x07, 0x1d, 0xf1, 0xe0, 0xc2, 0xe1, 0xd0, 0x0e, 0x70, 0xc0, 0x75, 0x01, ++ 0x5c, 0x2a, 0x50, 0x1e, 0x26, 0x82, 0xc7, 0xfc, 0x7f, 0x59, 0x78, 0x9c, ++ 0x9f, 0x8d, 0xdf, 0x5f, 0xd2, 0x3c, 0x8a, 0xc9, 0x39, 0x7a, 0xb8, 0x48, ++ 0x3e, 0xfe, 0xdc, 0x19, 0xb2, 0x4a, 0xb4, 0x7e, 0xfe, 0x7c, 0xf7, 0x97, ++ 0x43, 0x51, 0xee, 0x7e, 0xd6, 0xb0, 0x9c, 0xf4, 0xf7, 0xd5, 0xd6, 0xbd, ++ 0x1a, 0xd7, 0x9d, 0xfe, 0xff, 0xd2, 0xba, 0xa5, 0xf0, 0xb5, 0xac, 0x7b, ++ 0xd3, 0xbf, 0xec, 0xba, 0x39, 0xfd, 0x0f, 0x92, 0xb9, 0x3e, 0x8a, 0xe5, ++ 0x83, 0xae, 0x74, 0xfe, 0xe2, 0x77, 0xa9, 0xfe, 0x5b, 0xa7, 0x97, 0xe6, ++ 0x7b, 0x8d, 0xfc, 0xdf, 0xf2, 0x2f, 0xbb, 0xfe, 0x7f, 0x10, 0xef, 0x3b, ++ 0x24, 0xda, 0x8f, 0xbb, 0x1a, 0xde, 0x4f, 0xfc, 0xcb, 0xae, 0xfb, 0x6a, ++ 0x78, 0x7f, 0x4d, 0xe0, 0xdd, 0xe9, 0xc6, 0x78, 0x6f, 0xfb, 0xae, 0xaf, ++ 0x7b, 0x33, 0xdd, 0xfa, 0xaf, 0xb6, 0x6e, 0x93, 0xf2, 0xaf, 0x2a, 0xdf, ++ 0xae, 0xbc, 0x6e, 0xcd, 0xee, 0x69, 0x35, 0xd5, 0xb8, 0x47, 0xc0, 0xfc, ++ 0xde, 0x67, 0xf5, 0xb7, 0xe6, 0x40, 0xf9, 0x7b, 0xdf, 0xc5, 0x6e, 0xe8, ++ 0x8e, 0x02, 0x0f, 0xf8, 0xe3, 0xf9, 0x0d, 0x05, 0x0a, 0xf7, 0x1b, 0x2c, ++ 0x18, 0x67, 0xc2, 0x86, 0xb7, 0x4a, 0x5a, 0xbc, 0xa8, 0xd5, 0xb0, 0x8f, ++ 0xdb, 0xb3, 0x82, 0xec, 0x8c, 0x29, 0xbe, 0x1f, 0x93, 0x7d, 0xc0, 0x94, ++ 0x9a, 0xd6, 0x62, 0x68, 0xdf, 0x5a, 0x32, 0xcf, 0xfb, 0x08, 0xb5, 0x28, ++ 0x38, 0x1a, 0xc0, 0xfa, 0x8c, 0x71, 0xa2, 0x6e, 0xf4, 0xa7, 0xde, 0x94, ++ 0x98, 0x4f, 0x02, 0x3b, 0x76, 0x4a, 0xc9, 0xa4, 0x83, 0x68, 0xdf, 0x4d, ++ 0xf5, 0xc9, 0x64, 0xff, 0x41, 0x49, 0x76, 0xdf, 0x3b, 0xbd, 0x27, 0xf0, ++ 0xe7, 0xa3, 0x8d, 0x7e, 0xc4, 0x1d, 0x31, 0x7e, 0xc0, 0xed, 0x33, 0x8d, ++ 0xef, 0x6f, 0x15, 0xe3, 0xdd, 0xc6, 0x96, 0xba, 0x47, 0x00, 0xbc, 0x6e, ++ 0xeb, 0xa9, 0xb8, 0x43, 0x00, 0xa2, 0x3b, 0x8a, 0x6b, 0x54, 0x5c, 0xcf, ++ 0x1d, 0x77, 0x49, 0xac, 0x5e, 0x17, 0xaf, 0xbc, 0x35, 0x66, 0x3c, 0x97, ++ 0xc2, 0x44, 0x9c, 0xe4, 0x1f, 0x83, 0xdf, 0x3d, 0x1d, 0xf0, 0x5b, 0x4a, ++ 0xf0, 0x60, 0xc5, 0xb2, 0x77, 0x33, 0xbb, 0x06, 0xf8, 0x31, 0x0e, 0xef, ++ 0xd6, 0x19, 0xc3, 0x42, 0x18, 0x87, 0x61, 0x8a, 0x97, 0xc3, 0xef, 0xb6, ++ 0x4a, 0x2f, 0xc5, 0x41, 0x85, 0x9f, 0xa9, 0x8a, 0xfe, 0xaa, 0x63, 0x4d, ++ 0x2b, 0xf2, 0xad, 0xca, 0x8c, 0xfe, 0xa5, 0xe6, 0x27, 0x26, 0x82, 0x33, ++ 0x13, 0x7e, 0x27, 0x8d, 0x93, 0xdb, 0x09, 0x77, 0xd5, 0x27, 0x93, 0xdf, ++ 0xa9, 0x1b, 0x8f, 0xe0, 0xa1, 0xe1, 0xe3, 0xef, 0xc5, 0x83, 0x86, 0xbf, ++ 0xff, 0x2e, 0x3e, 0x0a, 0x11, 0x1f, 0x71, 0xf6, 0xcf, 0x16, 0x5a, 0xad, ++ 0xb7, 0xe2, 0xfe, 0x85, 0x75, 0x80, 0x44, 0x7e, 0xfb, 0xd4, 0xb5, 0x32, ++ 0xe5, 0xc1, 0x58, 0xf3, 0x25, 0x82, 0xa3, 0x7f, 0xb4, 0x4a, 0xfb, 0x3b, ++ 0x7f, 0x36, 0xf9, 0x0b, 0xd1, 0x70, 0x2e, 0x1f, 0x3e, 0xaa, 0xea, 0x21, ++ 0x3e, 0xac, 0x17, 0xe1, 0xb3, 0x50, 0xc0, 0x71, 0x3e, 0xab, 0x21, 0xbb, ++ 0x93, 0x5d, 0xfe, 0xe6, 0x9b, 0x22, 0xdc, 0x37, 0x22, 0x08, 0xc1, 0x7b, ++ 0x1f, 0x63, 0x93, 0xc1, 0x0f, 0x99, 0x5f, 0x24, 0x85, 0xed, 0xb0, 0xfe, ++ 0x05, 0x0a, 0x0b, 0x26, 0x17, 0x60, 0x5c, 0x53, 0x62, 0xc7, 0xf5, 0x71, ++ 0xcd, 0x90, 0xb1, 0x8e, 0xbf, 0x6f, 0x65, 0x74, 0x8e, 0x73, 0xb5, 0xf6, ++ 0x89, 0xe4, 0xc3, 0x3f, 0xbb, 0xfc, 0x18, 0xe4, 0xd1, 0xf1, 0xbe, 0xe0, ++ 0xaf, 0x60, 0xa9, 0xd0, 0xe7, 0x15, 0xbd, 0x9f, 0x38, 0xa7, 0x99, 0xc3, ++ 0xb1, 0x7a, 0x89, 0x14, 0xca, 0x25, 0x3a, 0x0a, 0xab, 0x7e, 0xdd, 0xbe, ++ 0xce, 0xfb, 0x82, 0xae, 0x3f, 0xfe, 0xfe, 0x70, 0x92, 0x73, 0xc5, 0x3f, ++ 0x1d, 0x92, 0x4c, 0xfe, 0xab, 0x6f, 0x10, 0xd9, 0xfb, 0xd5, 0xc2, 0xde, ++ 0xbf, 0x10, 0xf4, 0x24, 0x63, 0xbc, 0xe6, 0x42, 0x73, 0x5e, 0x32, 0xc6, ++ 0x63, 0x2e, 0x1c, 0x2c, 0x75, 0xe9, 0xe5, 0xa2, 0x56, 0x1e, 0x11, 0x7e, ++ 0xe4, 0x1f, 0x96, 0x59, 0xa9, 0x6c, 0x2f, 0x93, 0xea, 0x65, 0xf4, 0xb7, ++ 0x58, 0x64, 0x0a, 0xe9, 0xe1, 0x32, 0x1b, 0x43, 0xb9, 0x13, 0xdb, 0xef, ++ 0x25, 0x45, 0x8b, 0xbb, 0xd4, 0x98, 0x29, 0x2e, 0x0f, 0x3f, 0xb9, 0x10, ++ 0xf1, 0xc8, 0x7f, 0x0b, 0xa0, 0x6b, 0x72, 0xaa, 0x0e, 0x6f, 0x6b, 0x27, ++ 0x9f, 0x52, 0x86, 0x76, 0xc5, 0x03, 0xfe, 0x8e, 0xeb, 0xf6, 0x49, 0xfe, ++ 0xbb, 0xf0, 0x45, 0xbf, 0x15, 0xe1, 0x7a, 0xc4, 0xd6, 0x36, 0xc1, 0x1f, ++ 0x67, 0xbd, 0x6f, 0x08, 0xf8, 0x95, 0xef, 0xfb, 0xca, 0x8c, 0x71, 0x82, ++ 0x69, 0xcd, 0x39, 0x2a, 0xc2, 0x65, 0x5a, 0x99, 0x6c, 0xc8, 0xbb, 0xd9, ++ 0xaf, 0x08, 0x7f, 0x6a, 0x38, 0x1b, 0x8e, 0xf3, 0x2a, 0xdf, 0x77, 0x93, ++ 0x6b, 0x0c, 0xe2, 0xe5, 0xa0, 0xec, 0xb5, 0x01, 0x7c, 0xab, 0x9b, 0xcf, ++ 0x9b, 0x03, 0x71, 0xf6, 0xdb, 0x62, 0xe1, 0x89, 0xe3, 0x63, 0x5c, 0xf8, ++ 0x84, 0xea, 0x9d, 0x8f, 0xf0, 0x3c, 0xf1, 0x63, 0x1b, 0x0b, 0x02, 0x3f, ++ 0x1c, 0x16, 0xfb, 0x3f, 0xf0, 0xca, 0x87, 0xf2, 0x0b, 0x86, 0xf2, 0x61, ++ 0x7c, 0xec, 0x6d, 0x85, 0xef, 0x2b, 0x0c, 0x54, 0x79, 0x5c, 0x7c, 0x7a, ++ 0x79, 0xb1, 0x9a, 0x0e, 0xdf, 0xcd, 0x6f, 0x74, 0x0f, 0x43, 0x15, 0xd3, ++ 0x43, 0xb4, 0x1f, 0xa8, 0x7a, 0xe8, 0x7d, 0xb6, 0xe8, 0xa7, 0xb5, 0xeb, ++ 0xb1, 0x84, 0xb7, 0x3b, 0x66, 0x76, 0x57, 0xc5, 0x5b, 0xff, 0x64, 0x33, ++ 0x5f, 0xff, 0x02, 0xe6, 0xfd, 0xee, 0x68, 0xe9, 0x5f, 0x0f, 0x6f, 0xc5, ++ 0x3f, 0x75, 0x86, 0x4b, 0x50, 0xbf, 0x97, 0x49, 0x24, 0x47, 0xba, 0xd2, ++ 0x35, 0x23, 0xfe, 0xb8, 0x30, 0x51, 0x0a, 0xa1, 0xfe, 0x45, 0x3f, 0x96, ++ 0xea, 0xe5, 0x12, 0xe9, 0xff, 0xc3, 0x5a, 0xfe, 0xc1, 0x34, 0xae, 0x2f, ++ 0x35, 0xba, 0x8f, 0x85, 0xb3, 0xa4, 0x72, 0x38, 0x6b, 0xdf, 0xcf, 0x51, ++ 0x39, 0x3d, 0x9b, 0x55, 0x0e, 0x1f, 0x0d, 0xce, 0x1a, 0x7c, 0x63, 0xe7, ++ 0xab, 0xb5, 0x07, 0x79, 0x75, 0xa3, 0x3e, 0xbe, 0x32, 0xb5, 0x69, 0xd8, ++ 0x6f, 0xd1, 0x3e, 0xa9, 0x6a, 0x96, 0xdc, 0x18, 0xfa, 0xab, 0x52, 0xda, ++ 0xcc, 0xc8, 0x87, 0xd5, 0x4d, 0x8f, 0xaa, 0xb8, 0x5f, 0x70, 0x87, 0x87, ++ 0x8f, 0xcb, 0x14, 0xff, 0x50, 0xfd, 0x7e, 0xed, 0x40, 0x55, 0xa1, 0xf9, ++ 0xec, 0x2f, 0x18, 0x4b, 0xf6, 0xe3, 0xc5, 0xb5, 0xdc, 0x3e, 0xf6, 0xdd, ++ 0x73, 0xde, 0x85, 0x76, 0xd0, 0x61, 0x93, 0xf7, 0xf7, 0x63, 0x91, 0x1f, ++ 0xdf, 0x94, 0x29, 0x9f, 0x20, 0x11, 0x1c, 0x3f, 0x58, 0xb6, 0x65, 0x46, ++ 0x99, 0xa2, 0x1f, 0x37, 0x87, 0xe6, 0x39, 0x7d, 0x49, 0xb1, 0x8a, 0xe1, ++ 0xa0, 0xef, 0x2c, 0xd9, 0xab, 0x76, 0xd7, 0xd1, 0xd3, 0x40, 0x35, 0x95, ++ 0xde, 0x6b, 0xcf, 0x7b, 0x2c, 0xf1, 0x14, 0xe0, 0x73, 0xf8, 0x1e, 0xcd, ++ 0x23, 0xf8, 0x13, 0x0b, 0xc3, 0x3c, 0x8e, 0xfc, 0x86, 0xd6, 0x92, 0x24, ++ 0x78, 0xff, 0x9d, 0x9a, 0x14, 0x4e, 0x87, 0x15, 0x0d, 0x7b, 0xcd, 0x54, ++ 0xcf, 0xa1, 0xf6, 0xda, 0xf7, 0xb4, 0xef, 0xc4, 0xf2, 0xd3, 0x8c, 0xf2, ++ 0x24, 0x43, 0x7d, 0x5e, 0x69, 0x5b, 0x4f, 0x84, 0x4b, 0xb9, 0x25, 0xfc, ++ 0x80, 0x37, 0x0e, 0x9d, 0xb6, 0xa8, 0xda, 0x3e, 0xc9, 0xdf, 0xa9, 0x27, ++ 0x7c, 0x40, 0xb7, 0x43, 0xff, 0x7f, 0xd0, 0x13, 0xe7, 0x27, 0xf8, 0xe2, ++ 0xc0, 0xed, 0x31, 0xb5, 0x8b, 0x7e, 0xe8, 0x1e, 0x4f, 0x3f, 0x2c, 0x5d, ++ 0xee, 0xe9, 0x8e, 0xf0, 0x5f, 0xba, 0x2b, 0xaf, 0x3b, 0x32, 0xc7, 0xd2, ++ 0xd7, 0xc6, 0x67, 0xc4, 0xd3, 0x0f, 0xef, 0x2c, 0xe3, 0xfb, 0x81, 0xef, ++ 0x81, 0x3c, 0xc3, 0xb2, 0x7d, 0x06, 0xe8, 0x87, 0xeb, 0x75, 0xfa, 0x61, ++ 0x86, 0x8d, 0xe8, 0x23, 0xb6, 0xdf, 0x0f, 0xd4, 0x6b, 0xd4, 0x0f, 0x1a, ++ 0xbe, 0xfe, 0x87, 0xe5, 0xcc, 0x3b, 0xa8, 0x1f, 0xe2, 0xf0, 0x75, 0xbd, ++ 0x6a, 0xd4, 0x0f, 0xb7, 0x35, 0xcf, 0x25, 0xfd, 0x70, 0xdb, 0x0c, 0x99, ++ 0x79, 0x74, 0xf1, 0xb8, 0x1f, 0xaa, 0x62, 0x9f, 0x2b, 0xa1, 0x7e, 0x28, ++ 0xce, 0xb8, 0x83, 0xea, 0xaa, 0x37, 0x29, 0x0e, 0xdd, 0xbc, 0x23, 0xfc, ++ 0x12, 0x84, 0x2b, 0x96, 0xf8, 0x1d, 0xd4, 0x13, 0x7b, 0x84, 0xdc, 0x8f, ++ 0xd5, 0x17, 0x89, 0xe4, 0xf9, 0x34, 0xb3, 0x24, 0xf6, 0xab, 0xaf, 0x22, ++ 0xcf, 0xff, 0x2f, 0xc1, 0x59, 0x93, 0xe7, 0x4b, 0xc1, 0x7f, 0x41, 0x3b, ++ 0xb0, 0x2b, 0x1d, 0x32, 0x92, 0xd7, 0x4b, 0xef, 0x00, 0x79, 0x2e, 0x21, ++ 0x3d, 0x72, 0x79, 0xbe, 0xf4, 0x2e, 0x11, 0x97, 0x8c, 0x91, 0xaf, 0x7e, ++ 0x94, 0xaf, 0x23, 0xf4, 0xf2, 0x95, 0xf7, 0xaf, 0x0a, 0x70, 0x7d, 0x50, ++ 0xdd, 0x94, 0xf3, 0xf8, 0x2c, 0x78, 0x7f, 0x67, 0xbd, 0xea, 0xb5, 0x42, ++ 0xfb, 0x3b, 0x3b, 0xe5, 0x6d, 0xa1, 0x5e, 0xde, 0xee, 0x11, 0xf2, 0x16, ++ 0xe0, 0xdc, 0xdb, 0x1d, 0x07, 0xbf, 0x33, 0x67, 0x25, 0x31, 0x8f, 0x51, ++ 0x5e, 0xf5, 0x45, 0x39, 0x75, 0x62, 0xd8, 0xef, 0xf2, 0x77, 0x22, 0xdd, ++ 0x1f, 0x96, 0x69, 0x1f, 0xf1, 0xcf, 0x42, 0x8f, 0x1f, 0x1a, 0xf6, 0xbb, ++ 0x11, 0x18, 0x3f, 0xef, 0x66, 0x56, 0x88, 0x7e, 0xfe, 0x2c, 0xe4, 0xd7, ++ 0xb9, 0x65, 0xa1, 0x19, 0x65, 0xc0, 0xc7, 0xa5, 0xf7, 0x70, 0x7b, 0xb8, ++ 0x72, 0x9b, 0x4c, 0x70, 0xa8, 0x6a, 0xe4, 0x76, 0x5e, 0x55, 0x5f, 0x7b, ++ 0xc8, 0x03, 0xf5, 0x09, 0x05, 0x5f, 0xd1, 0x7e, 0xe0, 0xe2, 0x5d, 0x7c, ++ 0x3f, 0x10, 0x00, 0x55, 0x5e, 0xac, 0xc3, 0xe3, 0xe2, 0xc3, 0x6d, 0x75, ++ 0xd9, 0xf8, 0x7e, 0x83, 0x44, 0xfb, 0x99, 0xf3, 0xbd, 0x8b, 0x29, 0x8e, ++ 0xcf, 0xd6, 0xf1, 0x38, 0xb1, 0x15, 0xfe, 0xe1, 0x79, 0x1d, 0x3e, 0x8a, ++ 0x23, 0x57, 0x0a, 0x78, 0x2d, 0x6c, 0xde, 0x40, 0xf1, 0xe6, 0x85, 0x21, ++ 0x63, 0x1c, 0xba, 0xb2, 0xef, 0xcd, 0xa7, 0xd0, 0x1f, 0xd0, 0xe4, 0xef, ++ 0xe2, 0x2d, 0x31, 0xef, 0xbd, 0x0f, 0xd3, 0x7e, 0x45, 0x25, 0xc6, 0x9b, ++ 0x75, 0x7e, 0x88, 0x2c, 0xec, 0x87, 0x7b, 0xe5, 0x70, 0xfe, 0x4e, 0xcc, ++ 0xed, 0xfc, 0x3d, 0xf7, 0xab, 0x62, 0xf1, 0xaf, 0xb5, 0xeb, 0x58, 0x7f, ++ 0xc5, 0x7f, 0x73, 0xfd, 0x47, 0x60, 0xfd, 0x23, 0xfe, 0xf9, 0xeb, 0xbf, ++ 0xd6, 0x75, 0xab, 0x66, 0xc1, 0xef, 0x05, 0x6c, 0x04, 0xf2, 0xc7, 0x9f, ++ 0x4d, 0x3e, 0xe2, 0xf7, 0xe0, 0xeb, 0xb0, 0x7e, 0xf8, 0xce, 0x3d, 0x8f, ++ 0xf6, 0xeb, 0xae, 0xcf, 0x33, 0x4a, 0x13, 0x7c, 0x79, 0xd8, 0x14, 0xa8, ++ 0xcb, 0xc2, 0x76, 0x55, 0x12, 0xb5, 0x5b, 0xb0, 0x7e, 0xfb, 0x81, 0x0c, ++ 0xa8, 0xcf, 0x6a, 0x60, 0xc3, 0x30, 0x4c, 0xbf, 0x60, 0x9d, 0x51, 0x2f, ++ 0x76, 0xe8, 0xe1, 0x46, 0x0f, 0xe9, 0xd9, 0x59, 0x35, 0xdb, 0xa5, 0xbb, ++ 0xf3, 0x11, 0xde, 0xac, 0x06, 0xe9, 0x6c, 0x5e, 0x81, 0x25, 0x80, 0xfb, ++ 0xa9, 0x47, 0x6c, 0x11, 0x92, 0x5f, 0x1a, 0xdd, 0x8d, 0x33, 0x73, 0x7a, ++ 0x1e, 0x2b, 0xbe, 0x7b, 0xa2, 0x47, 0xa4, 0x8c, 0xfc, 0x88, 0x26, 0xc9, ++ 0x4d, 0x7c, 0x11, 0xb6, 0x71, 0xbf, 0x02, 0xe0, 0x6f, 0x83, 0xfa, 0xfe, ++ 0x31, 0x5f, 0x4e, 0x10, 0xf0, 0xa6, 0x78, 0x4c, 0x75, 0x13, 0xc7, 0x4f, ++ 0x35, 0xe0, 0x03, 0xf9, 0x6a, 0x42, 0xb3, 0xa8, 0x6f, 0xe1, 0x76, 0xd8, ++ 0x77, 0x40, 0xdf, 0xd0, 0x7e, 0x58, 0xf3, 0x5e, 0x15, 0xfb, 0x55, 0x40, ++ 0xfb, 0x34, 0x92, 0x37, 0x83, 0x0c, 0xfb, 0x5c, 0xb8, 0x3f, 0x57, 0x9c, ++ 0xa1, 0xc3, 0xdb, 0xae, 0x63, 0x9c, 0x6e, 0x37, 0x4b, 0x5e, 0x16, 0x07, ++ 0x6f, 0x03, 0xe0, 0x9f, 0xb8, 0x78, 0xfb, 0x27, 0xd1, 0xab, 0x06, 0x8f, ++ 0x71, 0x66, 0x61, 0xcf, 0x0b, 0xfc, 0x1d, 0xb1, 0xb5, 0x96, 0x0f, 0xa7, ++ 0x7d, 0x28, 0xc9, 0xbb, 0x11, 0x1b, 0x37, 0xa7, 0xd0, 0x3e, 0xca, 0x27, ++ 0xf5, 0x79, 0x84, 0xc7, 0x49, 0x82, 0x7e, 0x63, 0xe9, 0x1a, 0xed, 0x7b, ++ 0x8f, 0x2e, 0x9e, 0x74, 0x0b, 0x4e, 0x1c, 0xe4, 0x2b, 0x9b, 0x68, 0xa3, ++ 0x3c, 0x37, 0xfa, 0x6e, 0x2e, 0xb7, 0x7f, 0xf4, 0xf2, 0x24, 0xd6, 0x6f, ++ 0xae, 0x66, 0xad, 0x64, 0xc7, 0x4c, 0x96, 0x02, 0x1f, 0x29, 0xba, 0xbc, ++ 0xb6, 0xdb, 0x44, 0xfe, 0x89, 0xb6, 0x4f, 0xab, 0x6b, 0xf7, 0xb8, 0x7a, ++ 0x85, 0x76, 0x2c, 0xd3, 0x6d, 0x42, 0x39, 0x79, 0xbf, 0x96, 0x6f, 0x89, ++ 0xf9, 0xc3, 0x19, 0x94, 0xb7, 0x44, 0xbf, 0xfd, 0xbd, 0x0a, 0xdf, 0x9b, ++ 0x05, 0xeb, 0xbd, 0xb8, 0x46, 0xf6, 0xe2, 0xfe, 0xcf, 0xed, 0x26, 0xcf, ++ 0xbb, 0x45, 0xc8, 0xbf, 0x8f, 0xa8, 0x0c, 0xe9, 0xf2, 0xe2, 0x21, 0xd5, ++ 0xc7, 0xed, 0xce, 0x24, 0x92, 0xbb, 0x73, 0x0f, 0x9f, 0x50, 0x31, 0x14, ++ 0x32, 0x17, 0x60, 0x82, 0xf8, 0x9e, 0xfb, 0x03, 0x2e, 0x5f, 0x4f, 0xe0, ++ 0x60, 0xf0, 0xec, 0x8f, 0xa0, 0xb7, 0x7c, 0xb8, 0x57, 0xcf, 0x1a, 0x46, ++ 0x62, 0xfe, 0xf0, 0x0c, 0xef, 0xde, 0xf1, 0x1e, 0xc0, 0xcb, 0xad, 0x23, ++ 0x8e, 0xac, 0xc6, 0x7d, 0xb8, 0xe9, 0xa5, 0xee, 0x77, 0xdf, 0x45, 0xf8, ++ 0x3e, 0x2c, 0x33, 0x84, 0xef, 0xf1, 0x35, 0xa5, 0xe4, 0x9f, 0xdc, 0x7f, ++ 0x9f, 0x44, 0x74, 0x7d, 0x14, 0xe0, 0x88, 0xfd, 0x6f, 0x9d, 0x91, 0xf3, ++ 0xee, 0xbb, 0xf0, 0xdd, 0xbb, 0xd6, 0xa4, 0xd3, 0xbe, 0xda, 0x2c, 0xdf, ++ 0x81, 0xf1, 0x48, 0x67, 0xf3, 0xa6, 0x3a, 0x1d, 0xb8, 0xbf, 0x36, 0x69, ++ 0x80, 0xcc, 0x02, 0x3a, 0x38, 0xde, 0xc5, 0x5a, 0x57, 0xa3, 0xbc, 0x9e, ++ 0x55, 0x73, 0xdf, 0xad, 0x38, 0xdf, 0x0a, 0xd0, 0x03, 0x18, 0x67, 0xad, ++ 0x68, 0x3e, 0x32, 0xbe, 0x3b, 0xd6, 0xd7, 0x4b, 0x5e, 0x0f, 0x8c, 0x5f, ++ 0x1d, 0x0c, 0x98, 0xbb, 0x03, 0x0a, 0x5b, 0xd7, 0x9d, 0x37, 0x63, 0xbc, ++ 0x63, 0x3e, 0xb4, 0x43, 0xf4, 0x54, 0xaf, 0xe7, 0xed, 0xaa, 0x37, 0x49, ++ 0x5e, 0x1b, 0xd2, 0x63, 0xf3, 0xa3, 0x24, 0x77, 0xe6, 0x6f, 0x92, 0x98, ++ 0x1b, 0xdb, 0x83, 0xbd, 0x67, 0xe5, 0xe3, 0x86, 0xac, 0x30, 0x6e, 0xeb, ++ 0x7a, 0xe8, 0x0f, 0xf5, 0x05, 0xd8, 0x1f, 0xc7, 0xdd, 0x94, 0x72, 0x1b, ++ 0xee, 0xa3, 0x55, 0x1f, 0x92, 0x79, 0xff, 0xd1, 0xcb, 0x5f, 0x45, 0xb9, ++ 0x34, 0x1f, 0xfa, 0xc1, 0x6b, 0xd6, 0xba, 0xe9, 0x3e, 0x1a, 0x6f, 0xe1, ++ 0x7a, 0x89, 0x65, 0xc2, 0x78, 0x15, 0xa3, 0x73, 0x7e, 0x32, 0x1a, 0xc7, ++ 0x3b, 0xa4, 0x7a, 0xf1, 0xfd, 0x7b, 0x7b, 0x7f, 0x65, 0xc6, 0x79, 0xcf, ++ 0x86, 0xef, 0x65, 0xc1, 0xf8, 0xf3, 0xe4, 0xb6, 0xf1, 0xd8, 0x9e, 0x7d, ++ 0x4f, 0x72, 0x6f, 0xa6, 0x78, 0x13, 0xcf, 0x93, 0x6d, 0x17, 0x7c, 0xc0, ++ 0xde, 0xce, 0xe2, 0xfc, 0x25, 0x89, 0xba, 0xb0, 0x03, 0x35, 0x7d, 0xf8, ++ 0x07, 0x73, 0x2e, 0xd1, 0xd3, 0xfc, 0xda, 0xe5, 0x75, 0xb8, 0xae, 0xb6, ++ 0x60, 0x7a, 0x0e, 0xba, 0x40, 0xd5, 0x4d, 0xe7, 0xcd, 0x68, 0xd7, 0x7d, ++ 0x02, 0x70, 0x0e, 0x80, 0xdd, 0x76, 0x42, 0xe4, 0xb1, 0xed, 0x0f, 0x9e, ++ 0x30, 0xb7, 0xe9, 0xe4, 0x54, 0xc4, 0x9c, 0x47, 0xfd, 0xef, 0x69, 0x2a, ++ 0x26, 0xfe, 0xbe, 0x97, 0xf9, 0x69, 0xbf, 0x3b, 0xb0, 0x9c, 0xeb, 0xe1, ++ 0x63, 0xab, 0x6d, 0x21, 0x09, 0xed, 0x0f, 0xd5, 0x4d, 0x7a, 0x72, 0xff, ++ 0xea, 0xeb, 0x7e, 0x89, 0xeb, 0x3f, 0xf7, 0xac, 0x4a, 0xfb, 0xa3, 0xe7, ++ 0x7a, 0xb5, 0x51, 0x3c, 0xf6, 0xe4, 0x7a, 0x95, 0x05, 0x61, 0x8e, 0x2b, ++ 0xd7, 0xcb, 0x24, 0x37, 0x4e, 0x6e, 0xe3, 0x71, 0x20, 0xf9, 0x09, 0x95, ++ 0xea, 0x0b, 0x1e, 0x34, 0x53, 0x7d, 0xff, 0xfa, 0xe9, 0x13, 0x50, 0x1e, ++ 0x9e, 0x04, 0xf8, 0x23, 0x1d, 0x96, 0x3e, 0x31, 0xde, 0x8c, 0xf5, 0x05, ++ 0x20, 0xd7, 0x2d, 0x71, 0xe4, 0xc7, 0x7c, 0xcf, 0x22, 0x2e, 0x2f, 0x62, ++ 0xe4, 0xc3, 0x82, 0x75, 0x46, 0xfe, 0xef, 0x22, 0x2f, 0x1e, 0x98, 0xc0, ++ 0xe5, 0x7b, 0x8c, 0x3c, 0xa8, 0xec, 0x59, 0x47, 0x71, 0xbe, 0x58, 0x39, ++ 0x51, 0xcd, 0x1c, 0x9a, 0x7c, 0x28, 0xc0, 0x7a, 0x6b, 0x38, 0x8b, 0xe8, ++ 0xb7, 0xea, 0x90, 0xca, 0xd0, 0x9e, 0xab, 0x52, 0xdc, 0xb3, 0xd7, 0x21, ++ 0xdd, 0xcc, 0xb2, 0xe1, 0x4e, 0x31, 0xf0, 0x45, 0xf8, 0x00, 0xca, 0xb5, ++ 0x8b, 0x21, 0xc9, 0x13, 0x84, 0xf7, 0xdf, 0x99, 0xf3, 0xd2, 0x48, 0x84, ++ 0xdf, 0x5f, 0x10, 0xde, 0xc8, 0x17, 0x6b, 0xd3, 0x68, 0x3f, 0x75, 0x7e, ++ 0x68, 0x2e, 0xc1, 0x55, 0xcb, 0x27, 0x5c, 0xb0, 0xce, 0x48, 0xcf, 0x5a, ++ 0xfe, 0xd2, 0x1d, 0x01, 0x99, 0xf9, 0xf4, 0x7a, 0xa0, 0x22, 0x89, 0xf9, ++ 0x74, 0xed, 0xde, 0xfb, 0x01, 0xd0, 0x25, 0x7c, 0x6f, 0x4e, 0x93, 0x14, ++ 0xb2, 0x49, 0x58, 0x3f, 0xf6, 0xea, 0x83, 0x23, 0xa8, 0xee, 0x46, 0x3a, ++ 0xac, 0xaa, 0x15, 0xfa, 0x74, 0xad, 0x93, 0xe8, 0xf6, 0xbd, 0x7f, 0x3b, ++ 0xbf, 0x1a, 0xe9, 0x72, 0xf6, 0xf7, 0x25, 0x9a, 0x3f, 0x0b, 0x06, 0xea, ++ 0x50, 0xaf, 0x54, 0xad, 0x93, 0x3c, 0x18, 0xc7, 0x5c, 0xf0, 0x7d, 0xde, ++ 0x7f, 0x01, 0xf4, 0x47, 0x7a, 0x79, 0xef, 0x57, 0x9c, 0x7e, 0x80, 0x8e, ++ 0x3d, 0x48, 0xe7, 0x55, 0xeb, 0x1f, 0x7d, 0x95, 0xda, 0x6f, 0x92, 0x3c, ++ 0x38, 0xfe, 0x7b, 0x1b, 0xe6, 0x92, 0xfe, 0xad, 0x08, 0xca, 0x8c, 0xde, ++ 0x6f, 0x3a, 0x46, 0xf6, 0x31, 0xe8, 0x01, 0xca, 0x03, 0xda, 0x1f, 0x94, ++ 0x33, 0x90, 0xce, 0xab, 0x56, 0x59, 0xdc, 0x88, 0x47, 0x8d, 0x5e, 0x34, ++ 0xfa, 0x3b, 0xa6, 0x8a, 0x73, 0x02, 0x56, 0xef, 0xd0, 0xe9, 0xd0, 0x6f, ++ 0x83, 0xd9, 0x43, 0xeb, 0x8e, 0xa5, 0x3b, 0x79, 0x66, 0x0e, 0xd1, 0x57, ++ 0xf5, 0x36, 0x95, 0xe8, 0xa3, 0x3a, 0xc8, 0xe9, 0xe9, 0xd8, 0xb3, 0x32, ++ 0xd1, 0xe1, 0xfe, 0xd5, 0xb7, 0x13, 0xfd, 0x9c, 0xdb, 0x2c, 0x25, 0xa0, ++ 0xbf, 0x52, 0x73, 0x16, 0xd2, 0x5f, 0x88, 0xbf, 0xef, 0xa0, 0xbf, 0x67, ++ 0x24, 0x41, 0x7f, 0x9c, 0xae, 0x4f, 0x3e, 0xc0, 0xe9, 0xb1, 0x14, 0xdf, ++ 0x23, 0xfd, 0x3d, 0x2f, 0xec, 0x53, 0xc6, 0x1c, 0x7a, 0xbb, 0x43, 0xa3, ++ 0x3f, 0x8d, 0x9e, 0xae, 0x46, 0x77, 0x5d, 0xf4, 0x52, 0x02, 0x7a, 0x03, ++ 0xdb, 0xf8, 0x36, 0x9c, 0xd7, 0xfd, 0xab, 0x6d, 0x34, 0xef, 0xd2, 0xba, ++ 0x97, 0x6e, 0xab, 0x25, 0xbe, 0x51, 0x69, 0x7f, 0xbe, 0xb4, 0xee, 0xdf, ++ 0x32, 0x90, 0x4f, 0xe7, 0x2b, 0x3c, 0x0f, 0x43, 0x83, 0x63, 0xa5, 0xc2, ++ 0xf3, 0x74, 0xba, 0xcc, 0xe3, 0xe7, 0xcb, 0xcd, 0x59, 0xd7, 0x32, 0x9f, ++ 0x98, 0x79, 0xec, 0xed, 0xd4, 0x8b, 0x05, 0xa8, 0x17, 0x31, 0xaf, 0x24, ++ 0x0c, 0xdf, 0xf9, 0xdd, 0xb6, 0xa7, 0x29, 0x7f, 0xed, 0xec, 0xd6, 0x63, ++ 0x94, 0x97, 0xb8, 0xf8, 0x15, 0xc0, 0x3b, 0xb4, 0x3f, 0xb7, 0xcd, 0xc9, ++ 0xc2, 0x64, 0x4f, 0x87, 0x48, 0xbe, 0x2c, 0x6a, 0x94, 0x29, 0x2f, 0x94, ++ 0x29, 0xe1, 0xc2, 0xe9, 0xba, 0xf3, 0x23, 0x5a, 0xbe, 0xc5, 0xe2, 0xe7, ++ 0x9c, 0x04, 0xdf, 0x45, 0x3b, 0x2c, 0xa1, 0x72, 0xe8, 0xbf, 0xe8, 0x85, ++ 0x13, 0x43, 0x69, 0x3f, 0x7c, 0x45, 0xe4, 0x55, 0xe4, 0x9f, 0xe0, 0x56, ++ 0x89, 0xc7, 0xe5, 0x83, 0x6d, 0x43, 0xa7, 0x63, 0x5e, 0xa5, 0xc2, 0xf3, ++ 0x3e, 0x62, 0xf5, 0xee, 0x18, 0x0b, 0x8f, 0xd7, 0x9c, 0x79, 0x29, 0x69, ++ 0x26, 0xda, 0x3f, 0xd2, 0x96, 0xbd, 0xb4, 0x9f, 0xb4, 0xa8, 0xe1, 0x76, ++ 0xd5, 0xa2, 0x8b, 0x4f, 0x7a, 0x2d, 0x2a, 0x7d, 0x17, 0xda, 0xd1, 0x3e, ++ 0x4d, 0x10, 0xf0, 0x8e, 0xfb, 0x88, 0x38, 0xbf, 0x5b, 0x86, 0xe8, 0xe7, ++ 0xb7, 0x9c, 0x8f, 0xf7, 0x0c, 0xe7, 0x9b, 0x45, 0x4d, 0x2a, 0xd9, 0x45, ++ 0x8b, 0xb6, 0x6c, 0xa0, 0xb8, 0x5e, 0xf5, 0x96, 0xf3, 0x94, 0xf7, 0x5a, ++ 0xfa, 0xdc, 0xb3, 0x2e, 0x84, 0x43, 0x75, 0x93, 0x6c, 0xcc, 0x87, 0xda, ++ 0x22, 0x87, 0x2d, 0x94, 0xaf, 0x25, 0x1f, 0xb3, 0x70, 0xf9, 0x64, 0xc8, ++ 0x4b, 0xaa, 0x6a, 0xe4, 0xe7, 0x32, 0xaa, 0x1a, 0x44, 0xde, 0x4f, 0x4c, ++ 0x5e, 0xcc, 0xe2, 0xe7, 0x76, 0xbd, 0x10, 0x04, 0xd0, 0x2c, 0xde, 0xf9, ++ 0x5f, 0x2e, 0xe4, 0xa3, 0xd3, 0xad, 0x9b, 0x5d, 0x08, 0x4f, 0x18, 0x8f, ++ 0xf2, 0x89, 0xa6, 0x8e, 0x4e, 0x90, 0x6f, 0x74, 0xb5, 0x3c, 0xa3, 0x86, ++ 0x87, 0xe3, 0xe6, 0x19, 0x9d, 0xc6, 0xff, 0x00, 0x02, 0x99, 0x6d, 0x31, ++ 0xe6, 0x67, 0xb2, 0x2d, 0x5c, 0x4e, 0x01, 0xd6, 0x0b, 0xfd, 0x71, 0xe2, ++ 0x99, 0x9a, 0xbd, 0xb2, 0xf8, 0xd9, 0xcf, 0x9f, 0xc4, 0xbc, 0xd7, 0x33, ++ 0x3b, 0x3e, 0x7b, 0x12, 0xe7, 0xbd, 0xe4, 0x7f, 0x5d, 0x7c, 0x12, 0xf3, ++ 0x36, 0xd8, 0x6e, 0x9b, 0x1b, 0xed, 0x87, 0xea, 0xad, 0xef, 0x50, 0xfe, ++ 0xa0, 0xd6, 0xaf, 0xd6, 0x22, 0xfc, 0x9f, 0x67, 0xfe, 0x8b, 0xf2, 0x2e, ++ 0xcf, 0xbd, 0x6f, 0x21, 0xfb, 0xef, 0xdc, 0xae, 0x93, 0xbd, 0xd1, 0x3e, ++ 0x38, 0xb7, 0xfd, 0xab, 0x0c, 0xcc, 0xa7, 0x7c, 0x60, 0xd7, 0x78, 0x8a, ++ 0x3f, 0x3c, 0xf0, 0x7c, 0x69, 0x77, 0x16, 0xc7, 0xbf, 0xd5, 0x4a, 0xa4, ++ 0xcb, 0xd0, 0x35, 0xe4, 0x7d, 0xc6, 0xe2, 0x61, 0x7f, 0xa3, 0x1c, 0x76, ++ 0xc0, 0x3c, 0xcf, 0x1e, 0xb5, 0x10, 0x7f, 0x77, 0xe4, 0x8b, 0x35, 0x54, ++ 0xf2, 0xfc, 0x3b, 0x8f, 0xc8, 0x13, 0xdb, 0x16, 0x3f, 0xaf, 0x56, 0xcb, ++ 0x6f, 0xaa, 0x6a, 0x9c, 0x3e, 0x75, 0x1c, 0xca, 0xb7, 0x46, 0xae, 0xc7, ++ 0x3b, 0xf2, 0x9d, 0xae, 0x96, 0x1f, 0xf6, 0x36, 0xe0, 0xf3, 0xfa, 0x6b, ++ 0xc0, 0xdb, 0x36, 0x91, 0xff, 0x17, 0x83, 0xb7, 0xb3, 0xf8, 0x1f, 0x80, ++ 0x9f, 0x5f, 0x58, 0x8c, 0xf9, 0x61, 0x9f, 0x37, 0xde, 0xfb, 0xd4, 0xaf, ++ 0xf1, 0x5d, 0x63, 0xfc, 0xf3, 0x64, 0x1a, 0x1f, 0x5f, 0x0d, 0x5e, 0x5a, ++ 0xde, 0xee, 0x3c, 0x8b, 0x2f, 0x64, 0x41, 0xbe, 0xd9, 0xf1, 0x1b, 0xca, ++ 0xc3, 0x43, 0x7c, 0x95, 0x7b, 0x50, 0xcf, 0x7f, 0xde, 0x1b, 0xe3, 0x96, ++ 0x9f, 0xaa, 0x11, 0x8a, 0x07, 0x46, 0x76, 0x59, 0xdc, 0x98, 0xb7, 0xb5, ++ 0x68, 0xd7, 0x7b, 0xc4, 0x1f, 0xe7, 0x9e, 0x3f, 0x42, 0x79, 0xb1, 0x4c, ++ 0xe4, 0xcf, 0x9e, 0x63, 0x1d, 0x3f, 0x9e, 0xef, 0x28, 0x62, 0x12, 0xd5, ++ 0x9b, 0x9c, 0x3c, 0xaf, 0x4c, 0xc0, 0x1d, 0xf3, 0xce, 0x3c, 0x2e, 0x7a, ++ 0x2e, 0xf2, 0xcb, 0x38, 0xdd, 0x6a, 0x79, 0x67, 0x89, 0xf2, 0xcd, 0xde, ++ 0xb1, 0xe4, 0x8a, 0x73, 0x17, 0x3c, 0x2f, 0xae, 0xd2, 0xd3, 0x6a, 0x46, ++ 0xf8, 0xeb, 0xf3, 0xd0, 0xa4, 0xd1, 0x88, 0xa7, 0x63, 0x86, 0xfc, 0x3d, ++ 0x6d, 0xdd, 0xb1, 0xe3, 0xb9, 0x11, 0x0e, 0xa3, 0xf4, 0x79, 0x93, 0x89, ++ 0xf2, 0xf9, 0x84, 0x3d, 0xde, 0x81, 0x27, 0x2e, 0x87, 0xcf, 0x6d, 0x10, ++ 0x79, 0x94, 0x1d, 0xf9, 0x91, 0x8c, 0xf5, 0x2c, 0xc0, 0x7c, 0x1f, 0xae, ++ 0xef, 0xaa, 0x43, 0xd2, 0x7b, 0x2c, 0x0e, 0x3f, 0x6a, 0x79, 0x93, 0xad, ++ 0xb1, 0xfc, 0x18, 0xba, 0xb6, 0x7c, 0xc9, 0xab, 0xcf, 0xf7, 0x1f, 0x83, ++ 0xc7, 0x7e, 0x0b, 0x8f, 0x3f, 0x69, 0x70, 0x39, 0x73, 0x39, 0xbe, 0x3c, ++ 0xfe, 0x4c, 0xf0, 0x37, 0xf8, 0x25, 0xa7, 0x2d, 0xba, 0x73, 0x29, 0x73, ++ 0x84, 0x5f, 0xa2, 0xe5, 0x91, 0x69, 0xf3, 0xad, 0x6b, 0xe0, 0x7a, 0xf7, ++ 0xcc, 0x16, 0x6e, 0x17, 0xc6, 0xf2, 0x73, 0x95, 0x88, 0xb7, 0xc7, 0x7e, ++ 0xe7, 0x2b, 0xf1, 0x9d, 0xaa, 0xa6, 0xbd, 0x43, 0x51, 0xee, 0x9c, 0xd9, ++ 0xf7, 0x92, 0xa0, 0x37, 0x4e, 0xcf, 0x55, 0xdb, 0x8e, 0x99, 0x83, 0x42, ++ 0x3e, 0x87, 0xf4, 0xf2, 0x19, 0xc7, 0x8b, 0x23, 0x4f, 0x64, 0x2b, 0x1f, ++ 0x0f, 0xfc, 0xd8, 0xb8, 0xe3, 0x55, 0x6f, 0x3b, 0x1f, 0x77, 0xbc, 0xd3, ++ 0x8a, 0xef, 0x76, 0x9c, 0xff, 0xe9, 0x56, 0x6e, 0x67, 0x9c, 0x6e, 0x90, ++ 0x27, 0x86, 0xe2, 0x8c, 0x7f, 0x56, 0xe8, 0x9f, 0x8e, 0x75, 0x3b, 0xcd, ++ 0xe4, 0x57, 0xc9, 0x2e, 0x3b, 0xc9, 0x9f, 0x07, 0x9c, 0xa3, 0x8f, 0x26, ++ 0x77, 0xc3, 0xd2, 0x4c, 0xf9, 0x0b, 0x2b, 0x97, 0x8b, 0x7c, 0x87, 0x1f, ++ 0x78, 0x33, 0x11, 0xce, 0x2b, 0x9d, 0x37, 0x33, 0x9c, 0xcf, 0x6a, 0x84, ++ 0x8f, 0xce, 0xcf, 0x54, 0xdd, 0x01, 0x86, 0x76, 0x8e, 0x9a, 0xe9, 0x1f, ++ 0x81, 0xfe, 0x93, 0x36, 0x5f, 0xed, 0xbd, 0xb9, 0x9b, 0x89, 0x85, 0xf4, ++ 0xf8, 0x57, 0x82, 0x3d, 0x31, 0xee, 0x3a, 0x25, 0xf7, 0x4b, 0x05, 0xf5, ++ 0x4b, 0xeb, 0x32, 0xe3, 0xb9, 0x8e, 0x56, 0xc5, 0x7d, 0x20, 0x0d, 0xc6, ++ 0x6b, 0x2d, 0x93, 0xbc, 0x68, 0xcf, 0x76, 0xa5, 0x33, 0xe3, 0xf8, 0xb7, ++ 0xf8, 0x64, 0x43, 0x3c, 0x0c, 0x63, 0xcf, 0xb8, 0xae, 0x0b, 0x5e, 0x13, ++ 0xe1, 0xd3, 0x69, 0x0a, 0xbb, 0xa1, 0x09, 0x73, 0xda, 0x5a, 0x33, 0xc9, ++ 0x91, 0xf3, 0x30, 0x8f, 0x92, 0x41, 0x29, 0xdd, 0xb4, 0xbf, 0xfd, 0xc8, ++ 0xb2, 0x2d, 0xbd, 0xf0, 0x9c, 0x95, 0x8b, 0x79, 0x25, 0x7c, 0xef, 0xf4, ++ 0x76, 0x9c, 0x6f, 0xa1, 0xf1, 0x92, 0x59, 0x6c, 0x9e, 0x35, 0x7b, 0xbb, ++ 0x6f, 0x21, 0x13, 0x47, 0x80, 0xf1, 0xbd, 0x7b, 0x2f, 0xc6, 0x25, 0xec, ++ 0x03, 0xd8, 0x00, 0x3c, 0xbf, 0xe3, 0x66, 0x76, 0x2f, 0xde, 0xaf, 0xf0, ++ 0x98, 0x38, 0xf7, 0xb8, 0xd6, 0x19, 0x20, 0x7d, 0x9b, 0x90, 0x6f, 0xbc, ++ 0xfc, 0xdc, 0x8b, 0x16, 0x27, 0x4a, 0x1e, 0xad, 0x18, 0xce, 0xc5, 0xa4, ++ 0xf8, 0x8c, 0xf5, 0xb4, 0x98, 0x73, 0x90, 0x9a, 0xbc, 0xa6, 0x23, 0x74, ++ 0x00, 0xff, 0x09, 0xe2, 0xde, 0x87, 0x94, 0xf1, 0x7c, 0xfd, 0x18, 0xaf, ++ 0xea, 0x97, 0xd1, 0x39, 0xdf, 0x94, 0x74, 0xe6, 0x0d, 0xe3, 0xfb, 0xc9, ++ 0x0e, 0xca, 0x67, 0x76, 0x38, 0xf8, 0xfc, 0xb4, 0xf9, 0xc2, 0x7c, 0x48, ++ 0x1e, 0x00, 0x98, 0xf8, 0x7c, 0xf2, 0xdb, 0x82, 0x68, 0x87, 0xc3, 0xbc, ++ 0x62, 0xf8, 0x98, 0xd1, 0xb9, 0x27, 0x98, 0xdf, 0xf1, 0x98, 0xf9, 0x19, ++ 0xec, 0xb8, 0x3b, 0xac, 0x42, 0x3f, 0x28, 0x4c, 0x41, 0x39, 0xe2, 0xb0, ++ 0xb6, 0x32, 0x01, 0xe7, 0x0b, 0xc6, 0x3c, 0xd3, 0x20, 0xc3, 0xbc, 0x83, ++ 0xe4, 0x0e, 0xb8, 0xc2, 0x7b, 0x18, 0x27, 0x47, 0x9a, 0x6a, 0xc1, 0xbc, ++ 0x05, 0x37, 0x7a, 0xc1, 0x79, 0xf4, 0xbd, 0x98, 0x7e, 0x3d, 0xdd, 0xfa, ++ 0xf3, 0x62, 0xd7, 0x0b, 0xbd, 0x51, 0x94, 0xc9, 0xf2, 0xe9, 0x5c, 0x61, ++ 0x73, 0x37, 0x92, 0x5b, 0xb9, 0xb5, 0x25, 0xec, 0x04, 0xd4, 0xa5, 0x7a, ++ 0x4e, 0x1f, 0x7d, 0xd7, 0x32, 0xa2, 0xfb, 0xbe, 0x11, 0x91, 0xc7, 0xb2, ++ 0xca, 0x4e, 0xf6, 0x98, 0x76, 0xef, 0x80, 0xa4, 0xb0, 0xa0, 0x5a, 0xd0, ++ 0x49, 0x6f, 0x00, 0x91, 0x15, 0x78, 0x2e, 0x54, 0x59, 0x03, 0x34, 0x03, ++ 0xfd, 0x9a, 0x23, 0x25, 0xa6, 0x7b, 0x01, 0xa8, 0x0d, 0xf8, 0x0a, 0xc6, ++ 0xbf, 0xd7, 0xea, 0x7b, 0xd0, 0x0a, 0xed, 0xea, 0x6e, 0x09, 0x64, 0x9a, ++ 0x86, 0xe1, 0x72, 0x8a, 0x57, 0xb5, 0x14, 0xd1, 0x29, 0xde, 0x81, 0x18, ++ 0x61, 0x32, 0x2d, 0xf7, 0xb5, 0x1c, 0xec, 0x45, 0xa2, 0x86, 0xb1, 0x1b, ++ 0xf0, 0xbd, 0xaf, 0x05, 0x69, 0xb5, 0x5e, 0xab, 0x83, 0x40, 0xc4, 0xfb, ++ 0x16, 0xea, 0xed, 0x1d, 0x75, 0x9f, 0x15, 0xe4, 0x64, 0x7d, 0x2e, 0xaf, ++ 0xaf, 0x5c, 0xe3, 0x5b, 0xb5, 0x06, 0xc6, 0x93, 0x9d, 0xfe, 0x95, 0x56, ++ 0xe4, 0x63, 0xab, 0x7b, 0x10, 0xed, 0x5f, 0x84, 0xaf, 0xed, 0xdc, 0xbb, ++ 0x36, 0xcf, 0x01, 0x9b, 0xc2, 0xa5, 0x76, 0x98, 0xc4, 0xcd, 0x11, 0x00, ++ 0x28, 0xe0, 0xbf, 0x1f, 0xf2, 0x20, 0xd9, 0xc9, 0xad, 0x66, 0x24, 0x92, ++ 0xcd, 0x0e, 0xad, 0x1e, 0x26, 0x3b, 0xda, 0xdf, 0x78, 0x84, 0xfc, 0xf2, ++ 0xca, 0x86, 0x23, 0xf4, 0xde, 0x84, 0x75, 0x28, 0xfb, 0xa4, 0x85, 0x4b, ++ 0xb3, 0x61, 0x9d, 0x1b, 0xad, 0xb7, 0x94, 0x65, 0x0e, 0x84, 0xf1, 0x1a, ++ 0xe7, 0x66, 0x9a, 0x40, 0x44, 0xff, 0xc6, 0x7a, 0x4b, 0x8b, 0x92, 0xae, ++ 0x87, 0xc3, 0xad, 0x06, 0x38, 0x28, 0x2b, 0xa6, 0xb7, 0x1c, 0x1c, 0xa7, ++ 0x87, 0xc3, 0xf4, 0x16, 0xd4, 0xd7, 0xd7, 0x0a, 0x87, 0xdf, 0xac, 0x99, ++ 0xbe, 0x6a, 0x4d, 0xcf, 0x6b, 0x5f, 0x77, 0x96, 0xcd, 0xbf, 0x15, 0xf1, ++ 0x32, 0xa9, 0xd8, 0x44, 0x72, 0x6a, 0xd4, 0x51, 0x07, 0xf9, 0x6b, 0xf0, ++ 0xb3, 0x51, 0x7c, 0x4a, 0x8c, 0xb3, 0x21, 0xc1, 0xb9, 0x47, 0xcd, 0x1e, ++ 0xd7, 0xda, 0x69, 0x74, 0x94, 0x88, 0x4e, 0xf2, 0x98, 0x7b, 0x10, 0xd7, ++ 0x2f, 0x46, 0x7a, 0xa9, 0xc7, 0xfc, 0x6e, 0x8c, 0xdf, 0x05, 0x02, 0xde, ++ 0xb2, 0xe1, 0x9d, 0x74, 0xca, 0xdc, 0x81, 0xe1, 0x78, 0x3e, 0x3d, 0xcb, ++ 0x76, 0x77, 0xd8, 0xaa, 0x8b, 0xeb, 0x4d, 0x2a, 0x5e, 0x2a, 0xe7, 0xc2, ++ 0x7c, 0x28, 0x67, 0x06, 0x9e, 0xa7, 0xd7, 0x06, 0x6d, 0xfd, 0x81, 0x4e, ++ 0xd3, 0x7d, 0x26, 0xca, 0x47, 0xce, 0xb2, 0x05, 0x0e, 0xe0, 0xba, 0x5c, ++ 0x33, 0x23, 0x61, 0xcc, 0xd5, 0x19, 0xc5, 0x02, 0xf7, 0x4b, 0x79, 0x9d, ++ 0xf4, 0xae, 0x7d, 0xa7, 0x6e, 0x17, 0xf7, 0x53, 0xeb, 0xe6, 0x9a, 0x42, ++ 0x2b, 0x48, 0x1e, 0xb4, 0x49, 0xb8, 0xee, 0x4e, 0xbc, 0xb7, 0xc5, 0xe0, ++ 0x3d, 0xc2, 0xf1, 0xde, 0x74, 0x8c, 0xf0, 0x5e, 0xd5, 0x7c, 0x8c, 0xe3, ++ 0xbd, 0x69, 0x79, 0x89, 0x5d, 0xec, 0x6f, 0xa0, 0x1f, 0x58, 0xcf, 0x22, ++ 0xc3, 0x10, 0x9f, 0x1f, 0xac, 0xa9, 0x2c, 0x53, 0x80, 0xae, 0xfb, 0x24, ++ 0x45, 0xea, 0x90, 0x1e, 0x54, 0xb6, 0xb8, 0xac, 0xdc, 0x46, 0x70, 0x7f, ++ 0x1f, 0xd7, 0xd3, 0x05, 0xee, 0x62, 0x7e, 0x1a, 0xfc, 0x13, 0xe1, 0xad, ++ 0xfe, 0x60, 0xee, 0x8f, 0xf2, 0xd1, 0x4f, 0x3a, 0x64, 0xa2, 0xfd, 0x0c, ++ 0x0d, 0x5e, 0x1d, 0xed, 0x6c, 0x3c, 0xef, 0x6e, 0x8f, 0x3d, 0xf0, 0x17, ++ 0xfc, 0x4e, 0xf5, 0xe8, 0xb6, 0x57, 0x51, 0xbc, 0xef, 0x38, 0xf8, 0x16, ++ 0xed, 0xab, 0xbb, 0x0e, 0x4d, 0xdb, 0x8b, 0xfd, 0x5d, 0x33, 0x00, 0x13, ++ 0x9e, 0xce, 0xef, 0xd6, 0x1f, 0x5a, 0x51, 0x82, 0xf4, 0x5f, 0x1f, 0xa1, ++ 0xb0, 0x1a, 0xc8, 0x99, 0x48, 0x10, 0xed, 0x8e, 0xc4, 0xf0, 0xe0, 0x7c, ++ 0xd1, 0x01, 0x8f, 0xc6, 0x63, 0x04, 0x1f, 0x13, 0xd6, 0xe1, 0xf9, 0x56, ++ 0x71, 0x2e, 0xa5, 0xa8, 0x49, 0xf2, 0xa1, 0xde, 0xed, 0x93, 0x04, 0x76, ++ 0x09, 0x94, 0x5f, 0x59, 0xb9, 0x5f, 0xe8, 0xb4, 0xc9, 0xb4, 0x1e, 0xa7, ++ 0x8d, 0xeb, 0xf7, 0xf4, 0x43, 0xfb, 0x64, 0xf4, 0x33, 0x8a, 0x56, 0x99, ++ 0xa8, 0x7d, 0x3a, 0x96, 0xf9, 0xfa, 0xf5, 0xaf, 0x12, 0xfd, 0x14, 0x43, ++ 0x9e, 0x99, 0x86, 0x4f, 0x8d, 0x8e, 0x80, 0x70, 0x92, 0x6e, 0x81, 0x39, ++ 0x8f, 0x49, 0x0e, 0x98, 0x6d, 0x23, 0xf5, 0x74, 0x93, 0x9a, 0x94, 0x0b, ++ 0xef, 0x47, 0xb5, 0xdc, 0x7d, 0x3f, 0xea, 0x37, 0xad, 0xdf, 0x4f, 0x96, ++ 0x31, 0xef, 0x3d, 0xba, 0xf3, 0xe5, 0x40, 0x3f, 0x27, 0x0c, 0xf4, 0x36, ++ 0x44, 0xb5, 0x21, 0xdc, 0xb4, 0xf6, 0x48, 0x97, 0xfe, 0x38, 0xf7, 0x2e, ++ 0x40, 0xbf, 0x6e, 0xb6, 0x74, 0xfe, 0x1d, 0x8c, 0xab, 0x6e, 0x6f, 0x59, ++ 0x2a, 0xd3, 0x39, 0xc5, 0x6b, 0xc4, 0x6b, 0xa1, 0x85, 0xd5, 0xe0, 0xfc, ++ 0x0b, 0x93, 0x58, 0xcd, 0x0e, 0xe8, 0x5f, 0x98, 0x0c, 0x25, 0xd6, 0xd3, ++ 0x44, 0xbd, 0xbb, 0xa8, 0x67, 0x8b, 0xb2, 0x8f, 0x78, 0x3e, 0x98, 0xd7, ++ 0xf3, 0x3e, 0xf4, 0x9a, 0x24, 0x07, 0xc6, 0x69, 0x78, 0xdc, 0x70, 0xa8, ++ 0x4d, 0xec, 0xe7, 0x2a, 0xee, 0x41, 0xc8, 0x47, 0x43, 0x6d, 0x3c, 0x3e, ++ 0x5e, 0x94, 0x69, 0x27, 0xf9, 0xaf, 0xf1, 0xab, 0x02, 0xe0, 0xc4, 0xfd, ++ 0x46, 0x45, 0xec, 0x3b, 0xe6, 0x46, 0x72, 0x4d, 0x88, 0x47, 0x8d, 0x7f, ++ 0x95, 0x88, 0x29, 0xec, 0x04, 0x3d, 0x98, 0xab, 0x78, 0x4c, 0xb8, 0xff, ++ 0xfc, 0xfa, 0x32, 0x80, 0x83, 0x92, 0x58, 0xbe, 0xdc, 0x3c, 0x90, 0x9f, ++ 0x1f, 0x8b, 0x7d, 0x3e, 0xd6, 0x66, 0x32, 0x9c, 0x07, 0xf7, 0x75, 0x9e, ++ 0xef, 0x1c, 0x8b, 0x78, 0xaa, 0xb4, 0xb6, 0xfd, 0x64, 0x1a, 0xbc, 0xad, ++ 0x1a, 0x78, 0x91, 0xf6, 0x7f, 0x56, 0x24, 0x55, 0x8d, 0xbd, 0xd2, 0x39, ++ 0xf0, 0xd8, 0x79, 0xbc, 0x7e, 0xf9, 0x77, 0x49, 0x48, 0x5f, 0xcd, 0x51, ++ 0x4b, 0xdc, 0xf3, 0x22, 0x0f, 0x88, 0xf5, 0x1f, 0x5c, 0x36, 0x93, 0xfa, ++ 0x3d, 0xac, 0x9d, 0x07, 0x11, 0x76, 0xcb, 0xb7, 0x48, 0x34, 0x41, 0xd9, ++ 0x97, 0xc7, 0x8f, 0x0a, 0x2d, 0x41, 0x25, 0x15, 0xf5, 0x5f, 0x12, 0x8f, ++ 0x77, 0x14, 0x26, 0x71, 0xfd, 0xc8, 0xba, 0xe7, 0xd0, 0x3d, 0x19, 0x85, ++ 0xd8, 0x17, 0x85, 0xf5, 0x75, 0x83, 0x28, 0x6f, 0xa5, 0x30, 0x2d, 0x54, ++ 0x4e, 0xf5, 0xc1, 0x79, 0x8c, 0xe7, 0x7d, 0xea, 0xf2, 0x0b, 0x2d, 0xac, ++ 0xc3, 0xbe, 0x22, 0x94, 0xe7, 0x22, 0x3e, 0x03, 0x2b, 0xf1, 0x5c, 0x0d, ++ 0x93, 0x73, 0x68, 0xfc, 0x1b, 0x99, 0xd1, 0x9e, 0x2a, 0xcc, 0xae, 0xd9, ++ 0x4f, 0xef, 0x2d, 0x39, 0xb4, 0x0f, 0xc5, 0xa2, 0xdc, 0xbe, 0xd1, 0xec, ++ 0xa1, 0xf1, 0x62, 0x7f, 0xa5, 0xb0, 0x4f, 0x7d, 0x19, 0xcd, 0x33, 0x99, ++ 0x8f, 0x53, 0xcc, 0x8c, 0xe7, 0x87, 0x0b, 0xaf, 0x0b, 0x2a, 0x78, 0xcf, ++ 0x05, 0xcb, 0xcb, 0xa1, 0x79, 0x95, 0x5a, 0x63, 0xde, 0x0f, 0xe6, 0xf7, ++ 0x8b, 0x68, 0xeb, 0x18, 0xdf, 0xc5, 0x8e, 0xaa, 0xf7, 0xe2, 0x3d, 0x23, ++ 0x93, 0x06, 0xcc, 0xf5, 0x96, 0x89, 0xe7, 0x17, 0xe1, 0xdf, 0x3e, 0x16, ++ 0x36, 0xe7, 0x96, 0xfc, 0x4e, 0xf9, 0x7e, 0x93, 0xe7, 0x0e, 0x6f, 0x99, ++ 0xc1, 0xfe, 0xa8, 0xf7, 0x22, 0x1f, 0xbe, 0xf1, 0xb5, 0x3c, 0x27, 0xde, ++ 0x3e, 0xf8, 0x61, 0xc1, 0xf7, 0x07, 0x97, 0xf9, 0xbd, 0xb8, 0xdf, 0xf8, ++ 0x9c, 0x0d, 0xf0, 0x01, 0x7e, 0x77, 0x89, 0x47, 0x5a, 0xe5, 0xf4, 0x5c, ++ 0x1d, 0x7e, 0xb1, 0x78, 0x8b, 0x85, 0xdf, 0xb7, 0x9a, 0xe7, 0x93, 0xfd, ++ 0x16, 0x0b, 0xb7, 0xe2, 0x0f, 0xbd, 0x65, 0xa9, 0x9e, 0xae, 0x70, 0x8a, ++ 0x85, 0xcb, 0x78, 0x56, 0x3f, 0x80, 0xee, 0xaf, 0x11, 0x70, 0x8e, 0x85, ++ 0xcb, 0xeb, 0x56, 0x4e, 0x0f, 0xaf, 0xe7, 0x5b, 0x42, 0xe8, 0x5f, 0xbc, ++ 0xae, 0x00, 0x9c, 0x01, 0x5f, 0xaf, 0x7b, 0x24, 0xf2, 0x37, 0x0a, 0xc5, ++ 0xfd, 0x1a, 0x40, 0xe4, 0x9c, 0x5e, 0x34, 0xfa, 0x49, 0xca, 0xe1, 0xf4, ++ 0x92, 0x6c, 0x84, 0x7b, 0x2c, 0x7c, 0x63, 0xe1, 0xa9, 0xc9, 0x81, 0x57, ++ 0x11, 0x5e, 0x94, 0x5f, 0xe2, 0x2b, 0x1f, 0x9f, 0xd1, 0xb9, 0xfe, 0xc2, ++ 0xee, 0x35, 0x2d, 0x29, 0x3a, 0x7a, 0xd1, 0xd6, 0x5f, 0x98, 0x2d, 0xe8, ++ 0x74, 0x4f, 0x7f, 0x3e, 0x0f, 0x4d, 0x6e, 0x5c, 0x27, 0xe4, 0x88, 0x90, ++ 0x1f, 0x9a, 0xbd, 0x3c, 0x5e, 0x8c, 0x07, 0xf6, 0x32, 0xd9, 0xc3, 0xa5, ++ 0xe9, 0x4e, 0x8a, 0xcb, 0x96, 0x56, 0xf2, 0x71, 0x4a, 0xfb, 0x39, 0x36, ++ 0x62, 0x7e, 0x03, 0x0b, 0xdf, 0x48, 0xf9, 0xb2, 0x85, 0x4c, 0xfc, 0xa2, ++ 0xdc, 0xbe, 0x05, 0x7b, 0x94, 0xd3, 0x67, 0xf3, 0x84, 0x53, 0xe8, 0x5f, ++ 0xf7, 0xb1, 0x04, 0x56, 0x39, 0x31, 0x0e, 0x21, 0xa5, 0xd0, 0xbe, 0x12, ++ 0xc0, 0xfd, 0x78, 0x0c, 0xdc, 0x8f, 0x1b, 0xe1, 0x6e, 0xb4, 0x93, 0x63, ++ 0xe1, 0xf0, 0x1c, 0xfe, 0xc7, 0x98, 0xae, 0xf0, 0xd2, 0xe8, 0xad, 0xc5, ++ 0x26, 0xec, 0xea, 0x1e, 0xac, 0x27, 0xda, 0xbd, 0x43, 0x5f, 0x1a, 0x91, ++ 0x8c, 0xf2, 0x9b, 0x35, 0xa7, 0xc6, 0xf5, 0xd3, 0x47, 0x1d, 0xf5, 0x77, ++ 0x8c, 0x23, 0xe8, 0x96, 0xe8, 0x52, 0x62, 0x81, 0x8e, 0xe7, 0x6e, 0xa0, ++ 0x83, 0xa6, 0x01, 0xab, 0x1f, 0x43, 0x73, 0x66, 0xac, 0xb5, 0x5e, 0x46, ++ 0xfa, 0x1b, 0xcb, 0x7c, 0x69, 0x78, 0x9f, 0x09, 0x26, 0xc9, 0xe2, 0x3c, ++ 0xb5, 0x79, 0x0d, 0x97, 0xfc, 0xef, 0xa0, 0x3c, 0x1b, 0xd3, 0x36, 0x31, ++ 0x4d, 0x7f, 0xbf, 0x89, 0xf6, 0x7d, 0x0d, 0xce, 0xe3, 0x04, 0x9c, 0xc7, ++ 0xb1, 0xe0, 0x5e, 0x8c, 0xa3, 0x8c, 0x63, 0xca, 0x5f, 0xf5, 0xf1, 0x06, ++ 0x6d, 0xbc, 0x3f, 0xd9, 0x44, 0xbc, 0x21, 0x9b, 0x65, 0xe3, 0x7a, 0x8a, ++ 0x70, 0x73, 0x20, 0xbd, 0x73, 0x3c, 0x6d, 0x7d, 0x7d, 0xf2, 0x58, 0x98, ++ 0xee, 0xbf, 0x91, 0xac, 0x74, 0x4e, 0x0f, 0xfe, 0x17, 0x34, 0xa7, 0x76, ++ 0x7e, 0x4f, 0xcb, 0x7f, 0x9e, 0xe4, 0x9c, 0xf6, 0xa9, 0x8d, 0xe4, 0x70, ++ 0x0d, 0xe3, 0x79, 0x3e, 0x61, 0x42, 0x62, 0x91, 0x78, 0x5f, 0x24, 0xee, ++ 0x19, 0x63, 0x11, 0x25, 0xd1, 0xbd, 0x52, 0xec, 0x9b, 0xa4, 0xce, 0xf9, ++ 0x7d, 0x61, 0x93, 0x14, 0xba, 0x27, 0x43, 0xcc, 0xef, 0xec, 0x16, 0x6b, ++ 0x10, 0xf3, 0x8d, 0x1e, 0x92, 0x02, 0x97, 0xf0, 0x3b, 0x67, 0xa4, 0x43, ++ 0x43, 0x89, 0x5f, 0x95, 0x70, 0x7f, 0xba, 0x67, 0x22, 0xe6, 0xfd, 0xc5, ++ 0xa6, 0x96, 0x2a, 0x7c, 0x0f, 0xed, 0xe6, 0x53, 0x3b, 0xb1, 0xae, 0xc5, ++ 0x32, 0x8f, 0xf3, 0x46, 0x76, 0x59, 0xe8, 0x3e, 0x9f, 0x84, 0xf6, 0xa7, ++ 0x15, 0x54, 0x97, 0x4e, 0x0e, 0x14, 0xd9, 0xb9, 0x1c, 0x19, 0x8f, 0xf1, ++ 0xbe, 0x3c, 0x92, 0x17, 0x0a, 0x96, 0xbb, 0xcf, 0xf3, 0xbc, 0xf1, 0xe2, ++ 0xa6, 0x02, 0x05, 0xbf, 0x73, 0xe0, 0x02, 0xcf, 0xb3, 0x2e, 0x61, 0x3e, ++ 0x05, 0xfd, 0xae, 0x1b, 0xa3, 0x46, 0x7f, 0xed, 0xaa, 0x74, 0xea, 0x8e, ++ 0x8d, 0xdf, 0x88, 0x7b, 0x89, 0x94, 0x48, 0x6f, 0x84, 0xab, 0x66, 0x97, ++ 0xe5, 0xdb, 0x03, 0xdd, 0xed, 0x80, 0xaf, 0x55, 0x42, 0xbe, 0x35, 0x9f, ++ 0x9f, 0xe0, 0x41, 0x7c, 0x6d, 0x1c, 0x30, 0xf2, 0xe6, 0xe9, 0xd0, 0x24, ++ 0x77, 0xe0, 0xf0, 0x69, 0x68, 0x56, 0x98, 0xac, 0xad, 0x2a, 0xea, 0xbb, ++ 0xbb, 0x04, 0x5d, 0x8d, 0x46, 0xba, 0x92, 0xc8, 0xea, 0xd1, 0xe8, 0xca, ++ 0x63, 0x47, 0x3b, 0x7a, 0x4d, 0x0c, 0x5d, 0xb9, 0x53, 0x0d, 0x7e, 0xdc, ++ 0x2c, 0x16, 0xa6, 0x03, 0x8f, 0x45, 0x35, 0xea, 0x25, 0x83, 0x3f, 0x28, ++ 0xec, 0x90, 0x58, 0xfb, 0xbc, 0xd3, 0x2e, 0xaf, 0x8f, 0xeb, 0xcf, 0xb1, ++ 0x16, 0x70, 0x50, 0x81, 0x7e, 0x66, 0x0b, 0xf8, 0xae, 0x4a, 0x31, 0x07, ++ 0x51, 0x6e, 0x29, 0xf7, 0xf1, 0x7c, 0x9f, 0xbb, 0x18, 0xeb, 0x8d, 0x79, ++ 0x40, 0x77, 0xd5, 0xa8, 0x06, 0xff, 0x73, 0x76, 0x8a, 0x42, 0xf8, 0x9b, ++ 0xbd, 0xdc, 0x46, 0x79, 0x9e, 0x78, 0x6f, 0xd4, 0x5c, 0xa8, 0x07, 0xe0, ++ 0x39, 0x9d, 0x6b, 0x18, 0xc0, 0xef, 0x91, 0xea, 0xc0, 0x67, 0xad, 0xae, ++ 0x3f, 0xd2, 0x81, 0x23, 0x83, 0xe8, 0x76, 0xb6, 0xd8, 0x0f, 0xff, 0x93, ++ 0xc4, 0xfd, 0xf0, 0xd9, 0x29, 0x9f, 0xa4, 0x93, 0xd3, 0x1e, 0x54, 0x2f, ++ 0xe8, 0xe9, 0x33, 0xf6, 0xfb, 0x09, 0xc7, 0x8d, 0xe9, 0xb7, 0x4a, 0xe2, ++ 0xf1, 0x9c, 0x55, 0xaa, 0x2f, 0xd3, 0xab, 0xb3, 0x37, 0x26, 0xda, 0xb9, ++ 0xfd, 0x74, 0xc1, 0x5d, 0xb6, 0xce, 0x74, 0x85, 0xfb, 0x0d, 0x02, 0xd6, ++ 0x1e, 0xf9, 0x8a, 0xee, 0x3e, 0xa0, 0xb6, 0x14, 0xeb, 0xcc, 0x78, 0xf7, ++ 0x48, 0x68, 0xe3, 0x69, 0xf6, 0x5e, 0x51, 0x80, 0xfb, 0xe1, 0x89, 0xc6, ++ 0xed, 0x1b, 0x29, 0x23, 0x3b, 0xcc, 0xf4, 0xf3, 0xb0, 0x8c, 0xf6, 0x75, ++ 0xdf, 0x08, 0x23, 0x7b, 0xb8, 0x28, 0xe2, 0x33, 0xcd, 0x33, 0xd8, 0xe5, ++ 0xdc, 0x1f, 0xed, 0x62, 0x97, 0xe3, 0x7d, 0x06, 0x50, 0x5f, 0xd2, 0xb8, ++ 0x97, 0xdb, 0xe5, 0x0d, 0xcb, 0xc9, 0xbe, 0x5f, 0x02, 0xf6, 0x3d, 0xca, ++ 0xf3, 0x0d, 0xb8, 0xe7, 0xd9, 0x83, 0xf1, 0x09, 0xe5, 0x93, 0xbd, 0xde, ++ 0xe1, 0x57, 0x62, 0x7e, 0x4b, 0x51, 0x83, 0xd4, 0xe1, 0x77, 0x2a, 0x80, ++ 0xf7, 0xbc, 0x7a, 0xde, 0x7e, 0xd5, 0x23, 0xe3, 0xd4, 0x87, 0x15, 0xf4, ++ 0x0b, 0x03, 0x99, 0xaa, 0x17, 0xc3, 0x03, 0x25, 0xab, 0xad, 0xe0, 0xe7, ++ 0xd4, 0xe5, 0x30, 0x1b, 0x03, 0x3f, 0x67, 0x85, 0xbd, 0x64, 0xfc, 0x5a, ++ 0xf4, 0x4b, 0x53, 0x7d, 0x12, 0x4b, 0xa1, 0xfa, 0x6a, 0x47, 0xd6, 0xb5, ++ 0xfb, 0xb1, 0xab, 0xec, 0xc5, 0xab, 0xd1, 0x8f, 0x4d, 0xe4, 0x4f, 0x56, ++ 0xdb, 0x3d, 0x04, 0xbf, 0x44, 0xfe, 0xa4, 0xec, 0xf4, 0xaf, 0xb2, 0xeb, ++ 0xe2, 0x00, 0x20, 0x17, 0xe3, 0xda, 0x1f, 0x93, 0x9c, 0x25, 0x6b, 0xb0, ++ 0x9d, 0x26, 0x2f, 0x1e, 0x36, 0x85, 0xf3, 0x7e, 0xda, 0x8d, 0xf2, 0x83, ++ 0x28, 0xbf, 0xe2, 0xe6, 0xda, 0xbb, 0xc9, 0xde, 0x9f, 0x5c, 0x5b, 0xe1, ++ 0xc5, 0x2b, 0xdd, 0xda, 0xf7, 0x5d, 0xee, 0x8f, 0xf9, 0x15, 0x45, 0x02, ++ 0xdf, 0xbf, 0xb0, 0x73, 0x7b, 0xb2, 0x3a, 0x89, 0xdb, 0x91, 0x92, 0x14, ++ 0xf8, 0x05, 0xf2, 0x67, 0xeb, 0x80, 0xa7, 0xd7, 0x16, 0x00, 0x7f, 0xcc, ++ 0x6a, 0xe2, 0x79, 0x1b, 0xb6, 0xeb, 0x2e, 0xf7, 0xa6, 0xfb, 0x80, 0x46, ++ 0x3e, 0xfd, 0xf3, 0x02, 0x18, 0xff, 0xa3, 0x88, 0x42, 0xf1, 0x85, 0x66, ++ 0x27, 0x8f, 0x37, 0x7f, 0xc4, 0x24, 0xb2, 0x57, 0x8b, 0x8e, 0x58, 0xfc, ++ 0x8d, 0x80, 0x87, 0xcb, 0x20, 0xa1, 0xec, 0x3a, 0xbf, 0xe5, 0x32, 0x2b, ++ 0xa3, 0x3a, 0xeb, 0x99, 0x61, 0x38, 0x1f, 0xfc, 0x11, 0xdb, 0x9b, 0xf7, ++ 0x53, 0xf8, 0x4e, 0xb0, 0x86, 0xe7, 0x29, 0x5d, 0xa8, 0xc9, 0x49, 0x46, ++ 0xbc, 0x37, 0xab, 0xc6, 0xf8, 0xef, 0x56, 0x3b, 0xcf, 0x6f, 0xdb, 0x2a, ++ 0xe8, 0x6f, 0x16, 0xde, 0x1b, 0x39, 0x1c, 0xdb, 0x85, 0xb3, 0xf1, 0xfe, ++ 0x96, 0x59, 0x4a, 0x58, 0xa5, 0xfc, 0x8c, 0xa8, 0x99, 0xdf, 0x73, 0x08, ++ 0xf3, 0xc0, 0xf9, 0x34, 0xdb, 0x8c, 0xe3, 0xec, 0xb4, 0x73, 0xbf, 0x6b, ++ 0xa7, 0x9d, 0xdb, 0xf1, 0xb3, 0xc4, 0xbd, 0x93, 0xcd, 0xb6, 0xd8, 0x71, ++ 0x14, 0x3e, 0xbe, 0xb8, 0x67, 0x2e, 0x16, 0xee, 0x69, 0xf6, 0xd2, 0x17, ++ 0x71, 0x3d, 0x97, 0x99, 0xaf, 0x89, 0xf0, 0x04, 0xf2, 0x0a, 0xf5, 0x42, ++ 0xd1, 0x88, 0x96, 0xa3, 0x68, 0x2f, 0x5c, 0x5d, 0xff, 0xf8, 0x24, 0xd4, ++ 0x3f, 0xd5, 0x97, 0xa5, 0x70, 0x1f, 0x8c, 0x4f, 0x37, 0xaa, 0xe4, 0xbf, ++ 0x9f, 0x11, 0xe7, 0xc4, 0xcf, 0x36, 0xee, 0xcf, 0xb8, 0x1b, 0xca, 0xca, ++ 0xed, 0x7f, 0x70, 0xa1, 0xbf, 0xf7, 0x9a, 0xc0, 0xd3, 0x59, 0xa5, 0x95, ++ 0xee, 0x79, 0x59, 0xf2, 0xbc, 0x4c, 0xf7, 0x14, 0xc0, 0x77, 0x33, 0xbe, ++ 0x43, 0xfd, 0xe7, 0x15, 0xf2, 0x73, 0x56, 0xfc, 0x9c, 0x90, 0xa6, 0x97, ++ 0x0b, 0xbe, 0xde, 0x9f, 0xed, 0xe7, 0xc1, 0x41, 0x3a, 0xf7, 0xa3, 0xd9, ++ 0x9d, 0xe3, 0xac, 0xc1, 0x10, 0xce, 0xaf, 0x79, 0xb9, 0x4c, 0x72, 0x03, ++ 0xf4, 0xb6, 0xe1, 0xde, 0x9f, 0x1b, 0xc5, 0xbd, 0x3f, 0xb1, 0xf6, 0xe8, ++ 0xc7, 0x76, 0x2d, 0xce, 0x9c, 0x41, 0x79, 0x3f, 0x0f, 0xb8, 0xf9, 0x77, ++ 0x12, 0xf1, 0x7f, 0x51, 0x34, 0x95, 0x85, 0x74, 0xf2, 0xa1, 0x48, 0x09, ++ 0xcb, 0x38, 0xff, 0xa2, 0x68, 0x06, 0x0b, 0x01, 0x7c, 0xcf, 0x1e, 0xcc, ++ 0x7d, 0xac, 0x1c, 0xe9, 0x95, 0xa9, 0xde, 0x7e, 0x38, 0xac, 0xc2, 0x5a, ++ 0xc8, 0x1e, 0x16, 0xfb, 0x37, 0xf0, 0x6b, 0xc1, 0xfb, 0xe9, 0x76, 0x8b, ++ 0xca, 0x9e, 0xc6, 0x8b, 0xd3, 0xc7, 0x12, 0xf3, 0xb9, 0x57, 0x0d, 0x86, ++ 0x36, 0xdf, 0x0a, 0x07, 0xba, 0x91, 0x7d, 0x8c, 0x21, 0xd0, 0xc2, 0x4e, ++ 0xbb, 0xef, 0xc6, 0xa8, 0x31, 0xae, 0x1a, 0x6b, 0x27, 0x97, 0x34, 0x0f, ++ 0x5b, 0x85, 0x26, 0xe5, 0x19, 0x7c, 0x80, 0xf4, 0x17, 0xe1, 0xf7, 0x22, ++ 0x75, 0xb1, 0x9f, 0x23, 0x13, 0xe2, 0xda, 0xcd, 0x8c, 0x3d, 0x4a, 0x70, ++ 0x28, 0x78, 0x3e, 0x6f, 0x12, 0xde, 0xf7, 0x52, 0xf0, 0x9a, 0xc9, 0x8d, ++ 0xdf, 0xdd, 0x83, 0x7c, 0x8d, 0xf1, 0xfc, 0xc6, 0x8b, 0x74, 0x1f, 0x49, ++ 0x15, 0x0b, 0xdf, 0x86, 0xef, 0xab, 0x1a, 0x65, 0x77, 0x98, 0x5d, 0x29, ++ 0x9e, 0xb5, 0xea, 0x8d, 0x1b, 0x61, 0x1e, 0x7b, 0x22, 0x8a, 0x07, 0xf9, ++ 0x7f, 0x4f, 0xa4, 0xc5, 0x3a, 0x94, 0xea, 0x26, 0x8a, 0x63, 0x14, 0x1d, ++ 0x2e, 0x1a, 0x8c, 0x7c, 0xdb, 0x1c, 0x51, 0x28, 0xfe, 0x5f, 0x74, 0xbe, ++ 0x25, 0x69, 0x5e, 0x7e, 0xa7, 0xfd, 0xd2, 0x7c, 0xd9, 0x44, 0xcf, 0xf7, ++ 0x5c, 0xde, 0x47, 0xcf, 0xb5, 0x71, 0x9b, 0x23, 0xa9, 0x83, 0x51, 0x1f, ++ 0x6f, 0x37, 0x71, 0x7f, 0xba, 0xe5, 0xd5, 0x4b, 0x49, 0x28, 0x4f, 0xf7, ++ 0x5c, 0xbe, 0x90, 0xc6, 0xef, 0x1f, 0x5a, 0xae, 0xdd, 0x0b, 0x14, 0x6b, ++ 0x37, 0x13, 0x5c, 0x4a, 0x9d, 0x72, 0x47, 0x9c, 0x59, 0x6f, 0xa7, 0x33, ++ 0xb9, 0xe8, 0x6d, 0xcc, 0x57, 0x1a, 0x9f, 0xac, 0x32, 0x99, 0xf0, 0xc0, ++ 0xfd, 0xcd, 0x2e, 0xf6, 0xc7, 0x87, 0x6c, 0x95, 0x93, 0x75, 0xb5, 0x43, ++ 0x4a, 0xd0, 0xae, 0x91, 0xe3, 0xd8, 0x23, 0x9d, 0xf0, 0x36, 0xd8, 0xcf, ++ 0xfd, 0x93, 0x84, 0xfd, 0xd8, 0x8b, 0x15, 0xe0, 0x7d, 0x6e, 0x4d, 0x97, ++ 0xd3, 0x16, 0xd3, 0xb9, 0xce, 0xe6, 0x24, 0xf7, 0x0a, 0x8a, 0x3b, 0x71, ++ 0xfb, 0xa1, 0xbd, 0xe5, 0xf4, 0xcf, 0x26, 0xe1, 0xf3, 0x43, 0x32, 0x3f, ++ 0xd7, 0x7f, 0x59, 0x26, 0x7e, 0xda, 0xb7, 0x7b, 0x71, 0x9f, 0x36, 0x87, ++ 0x1e, 0xde, 0x75, 0x84, 0xbf, 0x2f, 0xb2, 0xce, 0x9f, 0x7b, 0x05, 0xda, ++ 0x7f, 0x71, 0xc0, 0x4e, 0xf1, 0x72, 0xa6, 0x78, 0x07, 0xc7, 0x8b, 0x8b, ++ 0x74, 0xc6, 0x89, 0xc3, 0x3d, 0xf8, 0xfe, 0x56, 0xb0, 0x07, 0xbf, 0x7f, ++ 0x86, 0xc7, 0x01, 0xbe, 0xd5, 0x19, 0x07, 0x28, 0x4a, 0x1a, 0xc9, 0xef, ++ 0x6f, 0x42, 0xb5, 0xd4, 0x7f, 0xfd, 0x31, 0x33, 0xc6, 0x51, 0xf6, 0xd8, ++ 0xfd, 0xdf, 0x4a, 0x22, 0xbe, 0x69, 0x48, 0x42, 0x39, 0x51, 0x61, 0xe7, ++ 0x72, 0x29, 0xc8, 0x4a, 0xb2, 0xc1, 0x48, 0x62, 0xcf, 0x1f, 0x34, 0x95, ++ 0x20, 0x9d, 0x8c, 0x58, 0xee, 0x21, 0x7c, 0x6f, 0x55, 0xc1, 0x94, 0x42, ++ 0xbe, 0xd8, 0xcc, 0xfd, 0xf6, 0xad, 0x78, 0x0e, 0x14, 0xc6, 0x59, 0xd8, ++ 0x50, 0x6f, 0xce, 0xd1, 0xe1, 0x77, 0xa1, 0xd8, 0x6f, 0xfa, 0x54, 0x0d, ++ 0xf6, 0x4e, 0xd5, 0x3d, 0xff, 0x7d, 0x12, 0xf7, 0x4b, 0x3f, 0x3d, 0xb0, ++ 0xe8, 0x29, 0xca, 0x47, 0x78, 0xdf, 0xc2, 0xfa, 0xc5, 0xb1, 0x3f, 0x43, ++ 0x49, 0x5c, 0x0e, 0xee, 0x34, 0x07, 0x27, 0x6d, 0xc3, 0x76, 0xc7, 0x4d, ++ 0x74, 0xce, 0xa3, 0xe5, 0xd5, 0x97, 0x5f, 0xed, 0x01, 0xf8, 0x5d, 0x78, ++ 0xd4, 0x33, 0x0c, 0xe5, 0xff, 0xb2, 0x24, 0x0f, 0xc1, 0xab, 0xe9, 0xd0, ++ 0xd6, 0xba, 0x1e, 0xd0, 0xae, 0xe9, 0x43, 0xd4, 0x92, 0x60, 0x72, 0x6f, ++ 0x9a, 0x2b, 0x9b, 0xe0, 0xbb, 0xaf, 0x30, 0x0f, 0x8f, 0xe7, 0xbd, 0x6d, ++ 0xa2, 0xf9, 0x76, 0xc4, 0x3f, 0xc1, 0x0e, 0xc4, 0xf5, 0xfe, 0x40, 0xcc, ++ 0xe7, 0x95, 0x83, 0x26, 0xc3, 0xfe, 0xd5, 0x2b, 0x76, 0xae, 0xd7, 0x2a, ++ 0x93, 0x54, 0x7a, 0x3f, 0x2f, 0x89, 0xc7, 0xd3, 0x76, 0x1c, 0x2c, 0x49, ++ 0xc3, 0xfc, 0xd3, 0x3d, 0xf6, 0xc0, 0x7c, 0x84, 0x67, 0xf5, 0x27, 0x6d, ++ 0x75, 0x2e, 0x4f, 0x67, 0xfc, 0x4f, 0xb3, 0x03, 0xc7, 0xbc, 0xbd, 0x63, ++ 0xd2, 0x10, 0xf8, 0xcf, 0x31, 0x67, 0x4c, 0x6e, 0x44, 0x9f, 0xe7, 0xed, ++ 0x8d, 0x32, 0xae, 0xd7, 0xf3, 0x29, 0x63, 0x29, 0x52, 0xd7, 0xf8, 0x14, ++ 0x8c, 0x57, 0x83, 0x78, 0xd0, 0xc6, 0x7b, 0xe5, 0x0c, 0x1f, 0x0f, 0xe6, ++ 0xb1, 0x0f, 0xf9, 0x2d, 0xb2, 0x9c, 0xb9, 0x29, 0x2f, 0x93, 0xf9, 0x7f, ++ 0x94, 0x0f, 0xf5, 0x57, 0x5a, 0x95, 0x54, 0xcc, 0x5b, 0xda, 0x2a, 0xf6, ++ 0x55, 0x35, 0x3c, 0x68, 0xeb, 0xd1, 0xe6, 0xe1, 0x69, 0x60, 0xbe, 0x0d, ++ 0x0e, 0x62, 0x0d, 0xdf, 0x8e, 0x2b, 0xc5, 0x99, 0x45, 0x7e, 0xe4, 0x70, ++ 0x21, 0x37, 0xbf, 0xb6, 0xfb, 0x82, 0x49, 0x3c, 0x0e, 0x48, 0xf6, 0xf6, ++ 0xa7, 0x07, 0xec, 0x64, 0x77, 0xed, 0x14, 0xf1, 0x6a, 0x96, 0x39, 0xb7, ++ 0x0f, 0xc2, 0x4f, 0xc3, 0xd3, 0x7a, 0x51, 0xc6, 0xce, 0x27, 0xd1, 0xf7, ++ 0x1f, 0x4f, 0xe2, 0x7a, 0x43, 0x2b, 0xb7, 0xaa, 0x9e, 0x20, 0xd1, 0xc3, ++ 0xf3, 0x5c, 0xdf, 0x6e, 0x75, 0x86, 0xad, 0x79, 0x28, 0xff, 0x5e, 0xca, ++ 0xa3, 0xba, 0x27, 0x18, 0x4c, 0x1a, 0x8a, 0x79, 0x50, 0x4d, 0xfd, 0xbc, ++ 0xb8, 0xdf, 0x87, 0xf9, 0x9f, 0x49, 0xba, 0x7d, 0xd6, 0x71, 0x82, 0xce, ++ 0x3d, 0x0d, 0x11, 0x73, 0x8e, 0x0e, 0x0f, 0x89, 0xe5, 0x1a, 0x87, 0x7b, ++ 0x07, 0xfd, 0x28, 0x0d, 0x44, 0x57, 0x4d, 0x47, 0x19, 0xf1, 0xdb, 0xa2, ++ 0x2d, 0xf7, 0xf1, 0xf8, 0x22, 0xc8, 0x03, 0x71, 0x9f, 0x13, 0xed, 0x1f, ++ 0x23, 0x5f, 0x88, 0x7d, 0xe4, 0x2c, 0x89, 0x97, 0x2e, 0xe4, 0x93, 0x31, ++ 0xcd, 0x1b, 0x56, 0x66, 0x7b, 0xe8, 0x7c, 0x01, 0xed, 0xdb, 0x6a, 0x70, ++ 0xf0, 0x20, 0x5f, 0x40, 0xb9, 0x5b, 0xe0, 0x05, 0xe1, 0x82, 0xef, 0x5f, ++ 0x12, 0xeb, 0xd6, 0xde, 0xbf, 0x28, 0xe0, 0x37, 0x5e, 0xce, 0x4f, 0xd6, ++ 0xe7, 0x23, 0xc6, 0x96, 0x7b, 0x96, 0x65, 0x52, 0x4c, 0x51, 0xab, 0xbf, ++ 0x24, 0xe6, 0xbf, 0x90, 0x3d, 0x4a, 0x76, 0xe8, 0xc2, 0xcb, 0xf5, 0x64, ++ 0x9f, 0x7a, 0x6a, 0x78, 0xb9, 0xf0, 0x01, 0x5e, 0xf6, 0x5f, 0x3f, 0xd7, ++ 0x8c, 0xf1, 0xdf, 0x85, 0xeb, 0xe2, 0xdf, 0x5b, 0x37, 0x2a, 0x89, 0xdb, ++ 0x2f, 0x67, 0x05, 0x1f, 0x30, 0x93, 0xbd, 0x07, 0xe6, 0x73, 0x74, 0xe8, ++ 0xc7, 0x24, 0xae, 0x5f, 0x4f, 0x35, 0x3e, 0xb6, 0x3f, 0x9b, 0xf4, 0x49, ++ 0xe0, 0x55, 0xa4, 0x8f, 0x1b, 0x9a, 0x1e, 0xfd, 0x25, 0x82, 0x49, 0xa3, ++ 0xff, 0x53, 0x9b, 0x54, 0xea, 0xaf, 0xc9, 0x11, 0xad, 0xff, 0x1b, 0x62, ++ 0xfc, 0xe7, 0xdf, 0xe6, 0xfc, 0x33, 0x66, 0x93, 0x5a, 0x82, 0xf7, 0x18, ++ 0x8d, 0x09, 0x32, 0x37, 0xc6, 0xc9, 0x5f, 0xd9, 0xb4, 0x59, 0x46, 0xb9, ++ 0xfe, 0x0a, 0xf2, 0x47, 0x0e, 0x97, 0x1b, 0xa8, 0x8f, 0x3f, 0x3d, 0xf0, ++ 0x48, 0xd2, 0x43, 0x48, 0x07, 0xc7, 0x4c, 0x0c, 0xe3, 0xf1, 0x3b, 0xcd, ++ 0xac, 0x62, 0xbb, 0x0e, 0xbf, 0x2d, 0x1b, 0x5e, 0x34, 0xc8, 0x83, 0x45, ++ 0x5b, 0x96, 0x4f, 0xc2, 0x71, 0x46, 0xb5, 0xa5, 0x4a, 0x28, 0xff, 0x35, ++ 0x39, 0xa0, 0xe1, 0x7b, 0xa7, 0xd9, 0x7b, 0x13, 0xc9, 0x93, 0x29, 0x31, ++ 0xf2, 0xa4, 0x8c, 0xf7, 0x8f, 0x0a, 0x78, 0x3e, 0x26, 0xe4, 0xc9, 0x63, ++ 0x13, 0x41, 0x9e, 0xc0, 0xa3, 0x94, 0x4d, 0x29, 0x12, 0x8e, 0xb3, 0xd3, ++ 0x1c, 0xff, 0x5e, 0xab, 0xcf, 0x34, 0xbe, 0x13, 0xf4, 0x38, 0xb6, 0x53, ++ 0xee, 0x7e, 0xc6, 0xe5, 0x6e, 0x9b, 0x2b, 0x0f, 0xc6, 0xa9, 0x9a, 0x7c, ++ 0x81, 0xe2, 0xaf, 0x1d, 0xdf, 0x11, 0x74, 0xf7, 0x58, 0x99, 0x46, 0x77, ++ 0x39, 0x12, 0xc2, 0x11, 0xec, 0x79, 0x53, 0x5f, 0x5c, 0x37, 0xc0, 0x07, ++ 0xe9, 0x1f, 0xec, 0xf9, 0x39, 0xd3, 0xf2, 0x89, 0x4b, 0x0f, 0x2a, 0xb4, ++ 0xef, 0x23, 0xf6, 0x91, 0x44, 0xde, 0x04, 0x71, 0x98, 0x8e, 0x7f, 0x35, ++ 0x39, 0xf7, 0xb5, 0x3d, 0xf0, 0x37, 0xe4, 0x93, 0xc2, 0xb2, 0x9a, 0x95, ++ 0xe8, 0x67, 0xa4, 0x95, 0x07, 0x89, 0xae, 0x4f, 0x49, 0x81, 0x3e, 0xa9, ++ 0xa0, 0xaf, 0x4e, 0x21, 0x5f, 0xc7, 0x91, 0x0b, 0xc7, 0xc5, 0x7a, 0xbe, ++ 0x50, 0x03, 0x7d, 0xdc, 0x71, 0xde, 0x77, 0xf2, 0x11, 0xeb, 0x81, 0x7c, ++ 0x50, 0xc1, 0x02, 0x26, 0x5c, 0x07, 0x5b, 0x2f, 0xb9, 0xf5, 0xe7, 0x1f, ++ 0x3c, 0xeb, 0x39, 0xbd, 0xa5, 0x38, 0x24, 0x43, 0xfe, 0xb8, 0x56, 0xd7, ++ 0xe0, 0x75, 0x23, 0xeb, 0xb8, 0x67, 0x30, 0xc5, 0x91, 0x4e, 0x7a, 0xca, ++ 0x8c, 0x79, 0x95, 0xfd, 0x43, 0x5c, 0x4f, 0x31, 0xa9, 0x84, 0xe8, 0x91, ++ 0x99, 0x6e, 0xee, 0x81, 0xfc, 0x76, 0x4a, 0x65, 0x44, 0x3f, 0xa7, 0x40, ++ 0x2e, 0x22, 0xdc, 0x16, 0xda, 0x8d, 0x7e, 0x88, 0xb6, 0xae, 0x9e, 0x0e, ++ 0xce, 0x57, 0x5f, 0xa4, 0xf0, 0x75, 0xfc, 0x51, 0xf0, 0x1d, 0xf9, 0xb8, ++ 0x23, 0xa9, 0x1d, 0xb7, 0xb3, 0x8a, 0x4d, 0xb4, 0x0f, 0x8b, 0xf4, 0x41, ++ 0xf4, 0x36, 0x25, 0x95, 0xfc, 0x14, 0x70, 0x8c, 0x14, 0xe2, 0xf3, 0x8e, ++ 0x7d, 0x86, 0xb0, 0x2c, 0x71, 0x79, 0x20, 0xe3, 0x3c, 0xdc, 0xe8, 0xbf, ++ 0x51, 0x1c, 0x68, 0x03, 0xcf, 0x0b, 0xdb, 0xb6, 0x81, 0xe8, 0x26, 0x65, ++ 0xa2, 0x9b, 0xce, 0x33, 0x3c, 0xa6, 0x78, 0x6d, 0x29, 0xba, 0x38, 0x6e, ++ 0xcb, 0xe6, 0xc7, 0xc9, 0x6f, 0x44, 0x7a, 0xc2, 0x39, 0x24, 0xa2, 0xc7, ++ 0x0a, 0xa4, 0x47, 0x16, 0x87, 0x0e, 0x43, 0x40, 0x87, 0xd0, 0x2f, 0x75, ++ 0x62, 0x0d, 0xe1, 0x11, 0xf0, 0x3b, 0xca, 0x01, 0xe3, 0xa6, 0x94, 0x05, ++ 0x64, 0xa4, 0x9b, 0x58, 0xfc, 0x6a, 0xfb, 0x87, 0x1a, 0x3c, 0x76, 0xc6, ++ 0xec, 0x37, 0x7e, 0xcf, 0xc1, 0xf9, 0x72, 0xa2, 0x28, 0x3d, 0x09, 0xf2, ++ 0x4e, 0x3a, 0xf5, 0x84, 0x51, 0xde, 0x02, 0xbe, 0xbe, 0xcd, 0xf1, 0xd5, ++ 0x49, 0xdf, 0x88, 0x37, 0x8d, 0xdf, 0x86, 0x3b, 0xae, 0x4c, 0xe7, 0x21, ++ 0x07, 0xbf, 0x0f, 0xbc, 0xee, 0xa3, 0x79, 0x94, 0xef, 0xa1, 0xed, 0x33, ++ 0x69, 0xfb, 0xc6, 0xda, 0xf7, 0xef, 0x10, 0xf4, 0x92, 0x68, 0x9f, 0x28, ++ 0xcb, 0x16, 0x98, 0xe9, 0x30, 0xec, 0x47, 0x2d, 0xa5, 0xfd, 0x2e, 0x8d, ++ 0x4f, 0xb4, 0xbf, 0x4b, 0xb1, 0x74, 0x33, 0xcf, 0x7b, 0xdb, 0x8e, 0x6f, ++ 0x10, 0xee, 0x2d, 0xf6, 0x90, 0xfe, 0xbc, 0x9e, 0x5b, 0x61, 0x3e, 0xc4, ++ 0x67, 0x85, 0x23, 0x87, 0xbe, 0xa7, 0xe1, 0xd7, 0x53, 0x6b, 0x66, 0x7d, ++ 0xc1, 0x5f, 0xf8, 0x22, 0x67, 0x6e, 0x0b, 0xbe, 0xfa, 0x76, 0x6b, 0xb0, ++ 0x7c, 0x08, 0xac, 0x63, 0xbb, 0x39, 0x38, 0x63, 0x32, 0xd9, 0xdd, 0xde, ++ 0x9b, 0x70, 0xfc, 0x9b, 0xca, 0x4d, 0xee, 0x47, 0x24, 0xcc, 0x17, 0x70, ++ 0x4b, 0x18, 0xef, 0x20, 0x12, 0x47, 0xbe, 0x38, 0xc4, 0xbf, 0xc3, 0x3c, ++ 0x5e, 0xc3, 0xbc, 0x97, 0x0a, 0xb8, 0x6b, 0x78, 0xd2, 0xe0, 0x90, 0x48, ++ 0x5f, 0x25, 0xc2, 0x4f, 0x48, 0xc0, 0x27, 0x5d, 0xbc, 0x8f, 0xe5, 0xeb, ++ 0x72, 0x07, 0xe7, 0xe7, 0x7c, 0xc7, 0xb5, 0xf2, 0x75, 0x50, 0x46, 0xba, ++ 0x77, 0xb1, 0xc0, 0x0a, 0xbc, 0x7f, 0x9a, 0x15, 0x71, 0x39, 0xd4, 0xc1, ++ 0xd7, 0x45, 0x8c, 0xf6, 0x11, 0xd7, 0x8a, 0xf1, 0xb4, 0xe7, 0x5a, 0x3d, ++ 0x0e, 0x5f, 0xaf, 0x75, 0x8c, 0xd4, 0xf1, 0xf5, 0xe8, 0x36, 0x23, 0x5f, ++ 0x83, 0x85, 0x2b, 0xf4, 0x29, 0xf1, 0x57, 0xfa, 0x26, 0x95, 0xe7, 0xd1, ++ 0x0a, 0x3e, 0xfb, 0xc2, 0xc6, 0xe7, 0xfb, 0x2b, 0x07, 0xb7, 0xc7, 0xd2, ++ 0x51, 0x7f, 0x00, 0xfe, 0xd2, 0x83, 0x7c, 0x3f, 0x75, 0xa9, 0xa0, 0x33, ++ 0xa0, 0x20, 0xca, 0xcb, 0xab, 0xdf, 0x64, 0x61, 0x88, 0x07, 0x8d, 0xef, ++ 0x5d, 0x33, 0x58, 0x89, 0x8a, 0xfb, 0xb2, 0xa8, 0x6f, 0xb0, 0xd5, 0x8c, ++ 0xc0, 0xd1, 0x71, 0xb8, 0x1f, 0x9b, 0x69, 0xf6, 0xe0, 0xfe, 0xf0, 0x29, ++ 0x35, 0x42, 0x78, 0x3a, 0x05, 0x0e, 0x6a, 0x3d, 0xe1, 0xd3, 0x4f, 0x79, ++ 0x26, 0xa7, 0x0e, 0xdc, 0xc0, 0xe5, 0xc1, 0xe4, 0x0e, 0xfd, 0xe3, 0xc3, ++ 0xfd, 0x9e, 0xe0, 0x1f, 0x7b, 0xf2, 0xfd, 0x1c, 0xb9, 0x99, 0xe8, 0x7a, ++ 0xe9, 0x78, 0x46, 0xfa, 0xa3, 0x65, 0xf3, 0x28, 0xa2, 0x83, 0x8a, 0xf2, ++ 0x5c, 0x09, 0xe9, 0x6c, 0xd1, 0x96, 0x14, 0x09, 0xdf, 0xa7, 0x96, 0xb9, ++ 0x4d, 0xb2, 0x4e, 0x2e, 0x8e, 0xaa, 0x35, 0xb1, 0xbe, 0xc3, 0x89, 0x6e, ++ 0x9f, 0x73, 0xe8, 0xe4, 0xe2, 0xa8, 0x60, 0x8d, 0x8c, 0x70, 0xe9, 0x93, ++ 0x16, 0xc8, 0x54, 0x53, 0xc0, 0x6e, 0x70, 0xcc, 0x99, 0xa0, 0x8f, 0xff, ++ 0xbc, 0x02, 0x75, 0x7d, 0xfc, 0x07, 0xea, 0x75, 0x7f, 0x4f, 0xfc, 0x67, ++ 0xf7, 0xda, 0xbb, 0xea, 0x30, 0xfe, 0xd3, 0x9e, 0xe4, 0x6b, 0x46, 0x7c, ++ 0x64, 0xd9, 0xfc, 0xbb, 0xf1, 0xfb, 0x85, 0xd9, 0x35, 0x32, 0xd3, 0xc9, ++ 0x8b, 0xab, 0xd9, 0x4d, 0xd5, 0x22, 0x7e, 0xf4, 0xe1, 0xea, 0xd7, 0x37, ++ 0xcf, 0x85, 0x75, 0xcf, 0x7a, 0x38, 0xb2, 0x1a, 0xdf, 0xce, 0xc1, 0xf8, ++ 0xea, 0x00, 0xcc, 0x0b, 0xe0, 0xf1, 0xd5, 0xea, 0xe6, 0x23, 0x14, 0x77, ++ 0x6d, 0x16, 0xfc, 0x3c, 0x5c, 0xf2, 0x1f, 0xc6, 0xef, 0xde, 0x55, 0x73, ++ 0x93, 0x31, 0xce, 0x1a, 0xb9, 0xb6, 0xef, 0x76, 0x13, 0x7c, 0xcb, 0x3e, ++ 0x64, 0x04, 0xff, 0x6e, 0xfe, 0x1a, 0x19, 0xe3, 0x11, 0x9a, 0x5c, 0xf8, ++ 0x00, 0xff, 0x1e, 0x03, 0xf7, 0x1b, 0x25, 0xdc, 0x57, 0xd3, 0xf8, 0x01, ++ 0xe5, 0x0a, 0xda, 0x9f, 0x5a, 0x7e, 0x03, 0xc6, 0xbd, 0x9c, 0xa9, 0x9d, ++ 0x72, 0x19, 0xeb, 0xc9, 0x3a, 0xbd, 0xba, 0xb6, 0xdc, 0x14, 0xf7, 0xbe, ++ 0xda, 0xd3, 0x0e, 0x87, 0x41, 0x6f, 0x69, 0x72, 0x90, 0x35, 0xff, 0xed, ++ 0x85, 0x87, 0xb4, 0x7b, 0x33, 0xb9, 0x5c, 0x3c, 0xed, 0xd0, 0xe9, 0xfd, ++ 0xc7, 0xca, 0x8f, 0xd3, 0x79, 0x62, 0x26, 0xee, 0xa1, 0xbb, 0x5f, 0xf8, ++ 0x90, 0x4f, 0xad, 0xf0, 0xfe, 0xfe, 0xba, 0x6e, 0x9d, 0xe7, 0xd8, 0x87, ++ 0x59, 0xcc, 0x41, 0xcc, 0x9f, 0x04, 0xb7, 0xd7, 0xe3, 0xd6, 0xe5, 0xc3, ++ 0x4a, 0xcd, 0x52, 0xd8, 0x89, 0x79, 0x96, 0x97, 0xd0, 0x73, 0x01, 0xfc, ++ 0x5d, 0x32, 0x51, 0xf9, 0xd4, 0xbf, 0xfb, 0x27, 0xe6, 0xa0, 0x1f, 0xdf, ++ 0x64, 0xf2, 0x82, 0x25, 0x80, 0x79, 0x12, 0x44, 0xc7, 0xde, 0x3e, 0x8c, ++ 0xce, 0x3d, 0x34, 0x88, 0x7d, 0xd8, 0xe2, 0xfd, 0x0e, 0x9f, 0x3a, 0x02, ++ 0xef, 0xcd, 0xb7, 0x92, 0xfc, 0x6b, 0xdf, 0x6b, 0x0f, 0x22, 0x5f, 0xb7, ++ 0x3b, 0x4d, 0x14, 0x3f, 0x6e, 0xd9, 0x65, 0x21, 0xb8, 0x5e, 0xec, 0x6b, ++ 0x17, 0x7e, 0x75, 0xc8, 0xe0, 0x7f, 0x6b, 0xfb, 0x1b, 0x36, 0x4b, 0xdb, ++ 0x5b, 0x45, 0xd0, 0x7f, 0xa3, 0x8d, 0x8f, 0xbb, 0xf1, 0xe1, 0xfe, 0x74, ++ 0x9f, 0x46, 0xa2, 0xfd, 0xee, 0xa2, 0xda, 0x5c, 0x8a, 0xe7, 0x69, 0xf1, ++ 0xc5, 0xdc, 0x88, 0xc7, 0xc4, 0x93, 0xc2, 0xf8, 0xf8, 0x4a, 0x84, 0xd1, ++ 0xba, 0xb4, 0xfd, 0xef, 0x75, 0x98, 0x7f, 0x31, 0x22, 0x71, 0xfe, 0x45, ++ 0x2f, 0xa7, 0x59, 0xf3, 0x97, 0x32, 0x9c, 0x48, 0x87, 0x33, 0xdb, 0x5e, ++ 0xc5, 0xb9, 0xc5, 0xfa, 0x5f, 0x19, 0x87, 0x8e, 0xef, 0xc5, 0x71, 0x32, ++ 0x6a, 0x79, 0x58, 0x60, 0xdd, 0xa1, 0xa5, 0x12, 0xae, 0x6f, 0xdd, 0xac, ++ 0xf8, 0xfe, 0x97, 0x46, 0x3f, 0xeb, 0x44, 0x9c, 0x4b, 0x97, 0xe7, 0x90, ++ 0xe7, 0xd4, 0xeb, 0x95, 0xb9, 0xa9, 0x49, 0xb9, 0x3a, 0xb9, 0xa9, 0xf5, ++ 0xfb, 0xa5, 0xc8, 0x73, 0x18, 0xd5, 0x72, 0xf7, 0x4e, 0xb4, 0xef, 0x80, ++ 0xaf, 0xd3, 0x9c, 0x3a, 0xbe, 0x9e, 0x34, 0x64, 0xb5, 0x2d, 0xde, 0x7e, ++ 0xbb, 0xbf, 0xf6, 0x21, 0x8a, 0x7f, 0x26, 0xa2, 0x7b, 0xbf, 0x89, 0xdf, ++ 0xb7, 0x14, 0xfb, 0x7c, 0xbc, 0x53, 0xd8, 0x31, 0x4a, 0xa4, 0x07, 0xd9, ++ 0x81, 0x7b, 0xbe, 0xb0, 0x7b, 0xe2, 0xe4, 0x3f, 0xf8, 0x77, 0x99, 0xe8, ++ 0xef, 0x82, 0x68, 0xf1, 0x98, 0xae, 0xdf, 0xff, 0x77, 0x9a, 0xff, 0x8d, ++ 0xce, 0x8e, 0x7d, 0xbd, 0x1e, 0xd7, 0xb2, 0xaf, 0x17, 0x3b, 0xef, 0x56, ++ 0x95, 0xf5, 0x8a, 0xa7, 0x4f, 0x62, 0xf3, 0x26, 0xb5, 0xef, 0xc5, 0xe9, ++ 0x7f, 0x97, 0xfe, 0xde, 0x03, 0xbf, 0x99, 0x05, 0xb6, 0x3b, 0xba, 0xf6, ++ 0xd3, 0xec, 0x5d, 0xbf, 0xc4, 0xef, 0x9d, 0x62, 0x1f, 0x31, 0xd2, 0xab, ++ 0x1a, 0x9d, 0x00, 0xdc, 0xef, 0x40, 0x7c, 0x0d, 0x3d, 0x3c, 0x6f, 0x38, ++ 0x86, 0x52, 0x99, 0xb5, 0x46, 0x46, 0x39, 0x70, 0xb1, 0xa9, 0x25, 0x1b, ++ 0xe3, 0x54, 0x89, 0xfc, 0x42, 0x6d, 0x3e, 0xf0, 0xeb, 0x17, 0x2f, 0xce, ++ 0xe2, 0xc7, 0x7b, 0x95, 0xe2, 0xac, 0xef, 0x7e, 0x81, 0x07, 0xbf, 0xca, ++ 0xed, 0x4f, 0xa9, 0xf8, 0xc0, 0x77, 0x70, 0x5e, 0xfe, 0xf3, 0x66, 0x49, ++ 0x7f, 0x0e, 0x63, 0x8e, 0x53, 0x32, 0xf0, 0x93, 0x16, 0x07, 0x6d, 0x3e, ++ 0xff, 0xee, 0x70, 0x92, 0x8f, 0x6a, 0x38, 0x3b, 0x1e, 0xfc, 0x62, 0xf7, ++ 0x2d, 0xe7, 0x60, 0xd0, 0x8a, 0xeb, 0x39, 0x0e, 0x07, 0x01, 0x97, 0xba, ++ 0x62, 0x56, 0x62, 0xe9, 0x46, 0x71, 0x02, 0xb6, 0xd1, 0x83, 0xfe, 0x1f, ++ 0x97, 0x93, 0x9e, 0x5a, 0x46, 0xfc, 0x7d, 0xbd, 0xe4, 0xa3, 0x75, 0xaf, ++ 0x70, 0x72, 0xbb, 0x66, 0x1d, 0x6b, 0xa5, 0xbc, 0xc6, 0x8b, 0x87, 0x78, ++ 0x1e, 0xf2, 0xd0, 0xfb, 0x3c, 0xf4, 0xf7, 0xb9, 0x40, 0x1f, 0x04, 0x91, ++ 0x6e, 0x47, 0xb1, 0xc0, 0x4e, 0x93, 0x2e, 0xaf, 0x4b, 0xa3, 0x87, 0xba, ++ 0x67, 0xc1, 0x3e, 0x31, 0xc4, 0xab, 0x38, 0xff, 0x68, 0x7e, 0x6b, 0x2f, ++ 0x11, 0xf7, 0xe9, 0x89, 0xf7, 0x84, 0xe8, 0xda, 0x75, 0x9f, 0x09, 0xa4, ++ 0xaa, 0x93, 0xf7, 0x59, 0x01, 0x2b, 0x53, 0x74, 0xf1, 0xb5, 0xec, 0x0a, ++ 0xb7, 0xa1, 0xde, 0xab, 0x26, 0xd3, 0xd0, 0x3e, 0x33, 0x18, 0x96, 0x90, ++ 0xaf, 0x32, 0x6b, 0x3d, 0x86, 0xe7, 0x9d, 0x72, 0x8a, 0xaf, 0xb7, 0x57, ++ 0x90, 0x6d, 0x40, 0xbd, 0xbf, 0x8e, 0xb5, 0xd1, 0xfa, 0x7a, 0x8b, 0xf9, ++ 0x5c, 0x2f, 0x05, 0x88, 0x3e, 0x2e, 0x1e, 0x3a, 0x91, 0x8a, 0x71, 0xc8, ++ 0x90, 0xc0, 0x07, 0xac, 0xf7, 0x49, 0x5a, 0x6f, 0x6d, 0xe0, 0xa2, 0x9e, ++ 0x3e, 0xb4, 0xf5, 0x5e, 0x6d, 0x5d, 0x1f, 0x2e, 0x83, 0xf9, 0x00, 0xdf, ++ 0xff, 0x09, 0xfd, 0x72, 0x28, 0xef, 0x7a, 0xe0, 0x98, 0xd4, 0x9d, 0xe0, ++ 0xee, 0xa6, 0xb4, 0xdf, 0x39, 0xa2, 0x5f, 0xaf, 0xef, 0x1f, 0x21, 0xff, ++ 0xb1, 0x57, 0x4d, 0x2b, 0xd9, 0xef, 0xb3, 0x6b, 0xf7, 0x4a, 0xa8, 0xb7, ++ 0x40, 0x6e, 0x50, 0xbf, 0x75, 0xcb, 0xac, 0x54, 0xfe, 0x7a, 0x99, 0x9b, ++ 0x64, 0xa8, 0x86, 0xdf, 0x9e, 0xd0, 0x0e, 0xf3, 0x8e, 0xb4, 0xfb, 0xe0, ++ 0x13, 0xe9, 0xa5, 0x5d, 0xce, 0x6b, 0xd6, 0x4b, 0xbb, 0x9c, 0x71, 0xf4, ++ 0x92, 0xc9, 0x1a, 0x79, 0x0d, 0xf7, 0xb7, 0x2b, 0x9b, 0x65, 0x0f, 0xd2, ++ 0xc1, 0xca, 0xef, 0xa7, 0x52, 0xfe, 0xc4, 0x53, 0x0d, 0xfc, 0x5c, 0xe2, ++ 0xfe, 0x66, 0x9e, 0xcf, 0xf7, 0x54, 0x1d, 0xcf, 0xdb, 0xd6, 0xbe, 0x7b, ++ 0xee, 0xf9, 0x64, 0xda, 0xdf, 0x39, 0x27, 0xf6, 0xf9, 0x98, 0xef, 0x52, ++ 0xc6, 0x34, 0xda, 0xf7, 0xbe, 0x94, 0x81, 0xe7, 0x8b, 0x3e, 0x76, 0x04, ++ 0xde, 0xd0, 0xcb, 0xc1, 0xa7, 0x9a, 0x3f, 0xb7, 0xa1, 0xbe, 0x18, 0xac, ++ 0xe5, 0xc9, 0xc6, 0xe8, 0x17, 0x14, 0xbc, 0x78, 0x5e, 0x85, 0xce, 0x3e, ++ 0x4a, 0x68, 0xf7, 0x0c, 0x5b, 0x23, 0xe3, 0x3a, 0x6e, 0x0b, 0x0c, 0xc7, ++ 0x94, 0x36, 0xe0, 0xef, 0x77, 0x38, 0x7d, 0x72, 0x3d, 0xf4, 0x9b, 0x6d, ++ 0x25, 0x26, 0xfd, 0x3d, 0x1d, 0x17, 0x9b, 0xfe, 0x3a, 0x7b, 0x9f, 0xa7, ++ 0x73, 0xdf, 0x48, 0xdb, 0x57, 0xd2, 0xde, 0x6b, 0xfb, 0x4e, 0x92, 0x14, ++ 0xf8, 0x58, 0x2f, 0xd7, 0x63, 0xf7, 0x95, 0x62, 0xf7, 0x43, 0x64, 0x97, ++ 0x95, 0xf2, 0xac, 0xbd, 0xb2, 0xdd, 0x2b, 0x1b, 0xf5, 0x2a, 0xd1, 0xdd, ++ 0xca, 0x7e, 0x5c, 0x6f, 0xae, 0xdc, 0x6b, 0x27, 0xb8, 0xad, 0xec, 0xe7, ++ 0xa0, 0xfd, 0x5b, 0x98, 0xef, 0x19, 0x9c, 0x6f, 0x0b, 0xe8, 0x2d, 0x3c, ++ 0x87, 0x77, 0xf1, 0xa8, 0x83, 0xda, 0x69, 0xf3, 0x87, 0xf9, 0x0e, 0x3d, ++ 0xa4, 0x9b, 0x6f, 0xb5, 0x29, 0x32, 0x7b, 0x9f, 0x14, 0x77, 0xbe, 0x9f, ++ 0xeb, 0xe1, 0xd8, 0x75, 0xbe, 0xc6, 0x7c, 0x64, 0x6d, 0x7e, 0xb2, 0x53, ++ 0xa1, 0x79, 0xb7, 0x33, 0xbb, 0x17, 0xf1, 0xd6, 0x60, 0xe6, 0xf7, 0xb7, ++ 0x05, 0xdf, 0xb4, 0x53, 0x3c, 0xb4, 0xdd, 0x77, 0xc9, 0x86, 0xf7, 0x06, ++ 0xb7, 0xb3, 0x4b, 0x36, 0x8c, 0xd3, 0x9e, 0x76, 0x04, 0x24, 0x17, 0x7c, ++ 0x47, 0xee, 0x15, 0x71, 0xa1, 0x1f, 0xb2, 0xbf, 0xf9, 0xe2, 0x40, 0xa4, ++ 0xff, 0x44, 0xfb, 0x7c, 0x83, 0x9c, 0x25, 0x2a, 0xb6, 0x87, 0x75, 0x5a, ++ 0xb1, 0x1c, 0xe5, 0x0e, 0x5c, 0xdc, 0xc6, 0x38, 0x9f, 0x05, 0xae, 0xd0, ++ 0x6f, 0x92, 0xb3, 0xc4, 0xe1, 0x1a, 0xf9, 0x77, 0xad, 0x3f, 0xdd, 0x75, ++ 0x45, 0x7c, 0x19, 0xd7, 0x5f, 0x8d, 0x7f, 0x07, 0x45, 0x67, 0x47, 0x49, ++ 0x42, 0xde, 0xc6, 0xd2, 0x9b, 0xd4, 0xbc, 0xf7, 0x2b, 0x8c, 0xeb, 0x03, ++ 0x7f, 0x51, 0xbe, 0x68, 0xb0, 0x37, 0x0b, 0xad, 0x04, 0x38, 0xd5, 0x0d, ++ 0x11, 0x74, 0x37, 0x83, 0x89, 0xbf, 0x83, 0x64, 0xa4, 0x87, 0x8f, 0x1d, ++ 0xfe, 0x7e, 0xb8, 0x5e, 0x8d, 0x2f, 0xaf, 0x00, 0x9f, 0x81, 0x38, 0xef, ++ 0xb7, 0x1c, 0xfe, 0xc1, 0xd8, 0x1e, 0xe7, 0x81, 0xe7, 0x79, 0x40, 0xee, ++ 0x0c, 0x71, 0x71, 0x3d, 0xb5, 0x13, 0x8f, 0x2c, 0x6b, 0xf6, 0x53, 0x9f, ++ 0x3c, 0x2e, 0xc7, 0x22, 0x29, 0x8c, 0xf2, 0x4c, 0x62, 0xf7, 0x67, 0x27, ++ 0x39, 0xa7, 0x8d, 0xc0, 0x7e, 0xb9, 0x03, 0x3c, 0x26, 0xbc, 0xc7, 0xfd, ++ 0xef, 0xa0, 0xf7, 0x71, 0x57, 0x86, 0x5f, 0x98, 0xf2, 0x54, 0xb4, 0xf3, ++ 0xc4, 0x95, 0xb8, 0x4f, 0x88, 0xe7, 0xf8, 0x1a, 0xd5, 0x33, 0xc6, 0xbf, ++ 0x97, 0x64, 0x84, 0xc3, 0x69, 0x87, 0xff, 0xdb, 0x38, 0x6e, 0xb0, 0xa4, ++ 0x93, 0xae, 0x56, 0x7a, 0xae, 0x08, 0x8f, 0x49, 0x08, 0x87, 0xb7, 0x1c, ++ 0x81, 0x29, 0x58, 0x3a, 0x55, 0xa0, 0x17, 0x04, 0xca, 0xe8, 0xb9, 0xf4, ++ 0xf7, 0xab, 0xb2, 0x6c, 0xbe, 0x55, 0xb8, 0x7f, 0xb9, 0x75, 0x39, 0x87, ++ 0x43, 0xfb, 0xb3, 0x1c, 0x0e, 0xdb, 0x5b, 0x4c, 0x44, 0xc7, 0x1b, 0xd8, ++ 0x20, 0xe2, 0xbf, 0x41, 0xa6, 0x0b, 0xb3, 0x71, 0x7c, 0x90, 0x2f, 0x33, ++ 0x71, 0x9c, 0x11, 0xad, 0xf5, 0x26, 0xcc, 0xe7, 0xeb, 0x17, 0xf2, 0x98, ++ 0xe8, 0x1e, 0xa7, 0xd6, 0x06, 0x93, 0xe9, 0xca, 0x74, 0x3b, 0x4b, 0xd0, ++ 0xed, 0x1c, 0x81, 0x87, 0xfb, 0x11, 0x0f, 0x83, 0xb7, 0xf1, 0xb8, 0xca, ++ 0x15, 0xe8, 0x76, 0x9e, 0xa0, 0xdb, 0x6b, 0x85, 0xfb, 0x12, 0xd7, 0x15, ++ 0xf9, 0xb6, 0x0b, 0x5d, 0xd5, 0xe8, 0xe9, 0xea, 0x5a, 0xf3, 0x87, 0x24, ++ 0x71, 0x0e, 0x36, 0x76, 0x3c, 0xc6, 0xda, 0x28, 0x7e, 0xbf, 0xf7, 0x25, ++ 0x0b, 0xc9, 0xef, 0xaa, 0x1d, 0xfc, 0xdc, 0x6f, 0xd5, 0xee, 0x93, 0x74, ++ 0x5e, 0xb4, 0xea, 0x65, 0x0b, 0x11, 0x65, 0xd9, 0xcb, 0x36, 0x7e, 0x7e, ++ 0xa5, 0x91, 0xbf, 0x3f, 0x57, 0x1c, 0x7f, 0x7f, 0xf9, 0xdf, 0x5c, 0xdc, ++ 0xbf, 0xaa, 0x6c, 0xb8, 0xcf, 0xab, 0xd7, 0xd7, 0x9a, 0x1d, 0xf0, 0x53, ++ 0xdf, 0x05, 0x77, 0x5f, 0xb9, 0x73, 0x9f, 0x2e, 0x6d, 0x32, 0x3f, 0x0f, ++ 0xb2, 0xd2, 0xa6, 0xe5, 0x83, 0xf2, 0xfd, 0x3a, 0x97, 0xa0, 0xb3, 0xb4, ++ 0x5e, 0x7e, 0x1f, 0xea, 0x9d, 0xb4, 0xf1, 0x3c, 0x2e, 0xe4, 0x72, 0xcc, ++ 0xa7, 0xfd, 0xba, 0xae, 0xe7, 0x3e, 0x38, 0xdf, 0xa6, 0x8b, 0x7e, 0x6e, ++ 0xb7, 0x87, 0xec, 0x81, 0xd8, 0x73, 0x20, 0xe9, 0x78, 0x2f, 0x38, 0xdf, ++ 0x77, 0x25, 0x7a, 0x91, 0x4d, 0x76, 0x2f, 0xee, 0x5b, 0xa6, 0x4d, 0x8c, ++ 0x69, 0xe7, 0x98, 0x48, 0xf9, 0x73, 0xe9, 0x31, 0xfb, 0x79, 0x21, 0x97, ++ 0xb0, 0x83, 0xcd, 0x2c, 0x93, 0xe4, 0xa8, 0x2d, 0xfe, 0x79, 0x2f, 0x25, ++ 0x59, 0xb3, 0xe7, 0xec, 0x26, 0xbd, 0x3c, 0x41, 0x39, 0x4f, 0xf7, 0xf5, ++ 0x38, 0xad, 0xb4, 0xee, 0xa5, 0xe9, 0x2c, 0xad, 0x1c, 0xe3, 0x03, 0x4e, ++ 0x85, 0xce, 0x7b, 0xc6, 0x8e, 0xa3, 0x95, 0x29, 0x3e, 0x93, 0xe1, 0x3c, ++ 0x51, 0xda, 0x44, 0xbb, 0xe1, 0xbe, 0x8c, 0x74, 0x7f, 0xaa, 0xa1, 0xde, ++ 0x7d, 0x66, 0x0f, 0x43, 0xfb, 0xac, 0x40, 0xae, 0xe1, 0x7d, 0x76, 0xc5, ++ 0x20, 0xc3, 0xfb, 0x5e, 0x35, 0x05, 0x86, 0x7a, 0x9f, 0xda, 0x1b, 0x0c, ++ 0xed, 0x73, 0x80, 0xe0, 0xf4, 0xf5, 0xbc, 0x35, 0x37, 0x1b, 0xda, 0xf7, ++ 0xab, 0x9f, 0x66, 0xa8, 0x5f, 0xb7, 0xee, 0x4e, 0x43, 0xfb, 0x81, 0xa1, ++ 0xbb, 0x0d, 0xef, 0x07, 0x6f, 0x59, 0x64, 0x78, 0x3f, 0xa4, 0x61, 0xa9, ++ 0xa1, 0x7e, 0x7d, 0xd3, 0x43, 0x86, 0xf6, 0x72, 0x02, 0xfb, 0x5a, 0x83, ++ 0xb3, 0xac, 0xd9, 0xd7, 0xce, 0x11, 0x01, 0x3a, 0x3f, 0xe6, 0xb4, 0x4a, ++ 0x7a, 0x3b, 0xe4, 0xb0, 0x8b, 0xdb, 0xe1, 0xc5, 0x2e, 0x2b, 0xc1, 0x7f, ++ 0xb5, 0xd0, 0xc7, 0xab, 0xc5, 0x79, 0xb3, 0xd5, 0x42, 0x1f, 0xb7, 0xa4, ++ 0x17, 0x5e, 0x71, 0x7f, 0xe5, 0x1f, 0xf5, 0xc7, 0xce, 0xba, 0x8c, 0x71, ++ 0xaf, 0x12, 0x11, 0xf7, 0x3a, 0xb7, 0xcf, 0x6c, 0x42, 0xba, 0xaf, 0xda, ++ 0x0f, 0x74, 0x41, 0x7f, 0x97, 0x2b, 0x70, 0xd6, 0xc5, 0xed, 0xaf, 0x29, ++ 0x73, 0x69, 0xf5, 0xfc, 0x1c, 0x65, 0x6b, 0x82, 0x7c, 0x8e, 0x2f, 0x5d, ++ 0x9a, 0x9f, 0x07, 0x7e, 0x49, 0x1c, 0xff, 0xce, 0x94, 0xec, 0x89, 0xeb, ++ 0x5f, 0x81, 0x5c, 0xbb, 0xe4, 0xd2, 0xfb, 0x41, 0xac, 0x46, 0x46, 0x39, ++ 0xa0, 0xc9, 0xa5, 0xea, 0x24, 0x46, 0x76, 0x5b, 0xbb, 0x2b, 0xda, 0x1f, ++ 0xf9, 0x08, 0xe4, 0x94, 0x94, 0x9c, 0x8e, 0xf2, 0xe9, 0xb1, 0x9a, 0x7d, ++ 0x28, 0x9f, 0x9a, 0x2d, 0x24, 0x9f, 0x5e, 0x1f, 0x70, 0x82, 0xfc, 0xea, ++ 0x9b, 0x6b, 0xe7, 0x13, 0x5c, 0x0e, 0xbb, 0x78, 0xbc, 0x56, 0x36, 0x7b, ++ 0x3d, 0xfc, 0x9c, 0xa9, 0x51, 0xef, 0x1e, 0x52, 0x5b, 0x29, 0x4f, 0xfb, ++ 0xd0, 0x48, 0x99, 0xe1, 0xfd, 0x28, 0x17, 0xbd, 0xa3, 0xe8, 0x3c, 0x73, ++ 0x22, 0x78, 0xbe, 0x89, 0x7e, 0x33, 0xc8, 0xae, 0xfd, 0x28, 0x1b, 0x46, ++ 0x5e, 0xdd, 0xef, 0x3c, 0xb4, 0xac, 0x82, 0xf2, 0x99, 0x13, 0x8d, 0x77, ++ 0x68, 0x98, 0x8d, 0xe2, 0x9e, 0xe5, 0x31, 0xf7, 0xe0, 0x0e, 0x12, 0x74, ++ 0x54, 0x96, 0x2c, 0xe0, 0x69, 0xe1, 0xfe, 0xe3, 0xd9, 0x17, 0x9c, 0x94, ++ 0x5f, 0x7c, 0xb6, 0xe0, 0x1d, 0xfa, 0xfb, 0x45, 0x67, 0x1b, 0xff, 0x30, ++ 0x3c, 0x48, 0x7f, 0xaf, 0xab, 0xf5, 0x7e, 0xdc, 0x7f, 0x0f, 0xfe, 0xd5, ++ 0x41, 0x71, 0x99, 0xf2, 0x61, 0xef, 0x0c, 0x5f, 0x4e, 0x76, 0xad, 0x8f, ++ 0xfb, 0x6f, 0xe2, 0xef, 0x82, 0x8d, 0x7b, 0xf1, 0xb0, 0x0b, 0xfd, 0xee, ++ 0xf2, 0xed, 0xfb, 0xbb, 0x05, 0x75, 0xf8, 0x8b, 0xf5, 0xdb, 0xca, 0xc4, ++ 0xfa, 0x98, 0xd2, 0xd6, 0x9f, 0xf2, 0x42, 0x5f, 0x39, 0x45, 0x7f, 0x37, ++ 0xa6, 0xfc, 0xa5, 0x03, 0xdd, 0x78, 0x5c, 0xc8, 0x98, 0xb7, 0x12, 0xeb, ++ 0xaf, 0x97, 0xd7, 0x56, 0x11, 0xde, 0xb4, 0x7a, 0x65, 0xd4, 0x6a, 0xc8, ++ 0x5f, 0xa9, 0x54, 0xf8, 0xb9, 0xdf, 0xca, 0xa8, 0x83, 0xf2, 0x57, 0x5c, ++ 0xc9, 0x46, 0x7f, 0x3e, 0x21, 0xbc, 0xae, 0x11, 0x9e, 0xb1, 0xcf, 0x35, ++ 0x78, 0x1e, 0x1a, 0x76, 0x8a, 0x9f, 0x5f, 0xb7, 0xc5, 0xa7, 0xdf, 0x9a, ++ 0x64, 0x63, 0x7c, 0x38, 0xf6, 0x5c, 0x41, 0xa2, 0xfc, 0xf5, 0xdb, 0x45, ++ 0xbf, 0x8b, 0xde, 0x31, 0x74, 0x0e, 0xbe, 0xdc, 0x1c, 0xee, 0x7b, 0x2d, ++ 0xf1, 0x05, 0x0d, 0x4e, 0xaf, 0x5f, 0x5e, 0x40, 0xe7, 0x15, 0x5e, 0x48, ++ 0x70, 0x5e, 0xc1, 0x9f, 0xcc, 0xe3, 0xee, 0x2f, 0x0c, 0xb8, 0x97, 0xf2, ++ 0x8e, 0xc7, 0x58, 0x6b, 0x4a, 0x51, 0x7f, 0x8f, 0x11, 0xf1, 0xcb, 0x38, ++ 0x79, 0xc7, 0xf7, 0x24, 0x8f, 0xc4, 0x7c, 0xe6, 0x7f, 0x4e, 0xde, 0x71, ++ 0xa5, 0x86, 0x1f, 0x91, 0xd7, 0x3b, 0x06, 0xf9, 0x38, 0x9d, 0x75, 0xc9, ++ 0x3b, 0xbe, 0xda, 0x79, 0x90, 0x49, 0x78, 0x1f, 0x77, 0x1c, 0xfe, 0xba, ++ 0xa9, 0x03, 0x7e, 0xef, 0xcf, 0xc0, 0x7b, 0x9d, 0xee, 0x7f, 0x42, 0xa5, ++ 0x3c, 0xa0, 0x05, 0x30, 0x87, 0x20, 0xc6, 0x4d, 0x36, 0xa8, 0x14, 0x3f, ++ 0x3d, 0x7c, 0xd9, 0xc2, 0x30, 0x9e, 0x7d, 0x72, 0xbd, 0xfa, 0x34, 0xe6, ++ 0xab, 0x54, 0x3c, 0xb1, 0xbf, 0xe7, 0x63, 0x18, 0xbf, 0x1e, 0x66, 0xa1, ++ 0x3c, 0xba, 0x05, 0x1b, 0xf8, 0x7d, 0x20, 0x6c, 0x98, 0x2d, 0x84, 0x79, ++ 0x1a, 0x15, 0x1b, 0x1e, 0xcc, 0xc0, 0xfc, 0xc8, 0xcf, 0x80, 0x6f, 0x97, ++ 0xc0, 0xbc, 0x16, 0x3c, 0x91, 0x4e, 0x79, 0x3c, 0x87, 0x5b, 0x1e, 0xc9, ++ 0x40, 0x3c, 0x9d, 0x12, 0xfc, 0x5c, 0xf1, 0xf5, 0x0f, 0x6f, 0x43, 0xf8, ++ 0x6f, 0x37, 0xbb, 0x07, 0x0f, 0x83, 0x72, 0xc9, 0x36, 0xc9, 0x90, 0x07, ++ 0xbe, 0x68, 0x93, 0xcd, 0x50, 0xd7, 0xf2, 0x80, 0x34, 0xfc, 0x31, 0xa9, ++ 0x33, 0x3f, 0xdc, 0x03, 0x72, 0xf4, 0xf1, 0x64, 0xe3, 0xf9, 0x96, 0xe1, ++ 0x9d, 0xfb, 0x0a, 0x8f, 0x27, 0x0b, 0x79, 0x3a, 0x1d, 0xe6, 0x5b, 0x35, ++ 0xf2, 0xa2, 0x19, 0xf1, 0xb8, 0xff, 0x55, 0x3b, 0xcd, 0x7b, 0x8f, 0x83, ++ 0xdf, 0xaf, 0x16, 0x1e, 0xf6, 0xe5, 0x1b, 0xd7, 0x43, 0xbd, 0xf4, 0x6b, ++ 0x45, 0xbb, 0x57, 0xc7, 0x90, 0x57, 0xc4, 0x70, 0x13, 0x02, 0xef, 0x39, ++ 0x11, 0xf9, 0x7f, 0xa5, 0x2f, 0x29, 0x1d, 0xf9, 0xf9, 0xc2, 0x6f, 0x70, ++ 0x8c, 0xd7, 0xe5, 0x41, 0x87, 0x97, 0xd5, 0x10, 0xdf, 0x94, 0xfe, 0x8a, ++ 0xfb, 0xc5, 0xa5, 0x36, 0x9e, 0xaf, 0x9b, 0x30, 0xdf, 0x88, 0x75, 0xc9, ++ 0x67, 0x1e, 0x80, 0xf2, 0xbc, 0x4b, 0x9e, 0x51, 0xe7, 0x79, 0x08, 0x83, ++ 0x5d, 0xa2, 0xd1, 0x4d, 0x63, 0xb2, 0xc8, 0x37, 0x12, 0x7c, 0xbd, 0xff, ++ 0x55, 0x9e, 0x57, 0x34, 0xff, 0x90, 0xb0, 0x27, 0xaf, 0x22, 0x37, 0xdf, ++ 0xc4, 0x79, 0x2b, 0x88, 0xaf, 0xd7, 0x67, 0xe1, 0xbe, 0xe3, 0x61, 0x01, ++ 0x8d, 0xc3, 0x97, 0x4f, 0xae, 0xa2, 0x7b, 0x88, 0x46, 0x4b, 0x18, 0x61, ++ 0x63, 0x27, 0x2f, 0xc7, 0xe7, 0x1b, 0xb3, 0x26, 0x3f, 0x31, 0x7f, 0x7f, ++ 0x40, 0x27, 0x7e, 0x26, 0x7b, 0x17, 0x76, 0xd4, 0x91, 0x2d, 0xa7, 0x8e, ++ 0xbe, 0xcf, 0x70, 0xae, 0xe0, 0xda, 0xe5, 0xcd, 0x95, 0xe5, 0x49, 0x6d, ++ 0x32, 0x3f, 0x7f, 0x17, 0x2b, 0xdf, 0x63, 0xe9, 0xfe, 0xff, 0x94, 0x7c, ++ 0x2f, 0x1f, 0x76, 0xa0, 0x37, 0x9e, 0x93, 0x87, 0xf2, 0x3f, 0xe9, 0xbc, ++ 0xfc, 0x76, 0x2e, 0x1f, 0x63, 0xf9, 0x3c, 0x56, 0x9e, 0xdf, 0x14, 0x23, ++ 0x07, 0x3b, 0xe5, 0xb8, 0xc9, 0x20, 0xc7, 0x6f, 0x12, 0xfa, 0xbc, 0x53, ++ 0x9e, 0x9b, 0x49, 0x9e, 0x83, 0x79, 0xc6, 0xef, 0x6f, 0x29, 0x54, 0x42, ++ 0x2b, 0x25, 0xf2, 0x7b, 0xbe, 0x40, 0x7d, 0x9d, 0xef, 0xf0, 0xa4, 0x15, ++ 0x43, 0x97, 0x55, 0xee, 0xdc, 0xa4, 0xc0, 0x95, 0xfd, 0xd0, 0x4b, 0xc8, ++ 0x27, 0xed, 0xb6, 0xc0, 0xd7, 0x58, 0xf6, 0xf9, 0xcd, 0x20, 0xfa, 0xbb, ++ 0x9e, 0x83, 0xb7, 0xd5, 0x9b, 0x90, 0x7f, 0xdb, 0x13, 0xd8, 0x1f, 0xff, ++ 0x1b, 0x88, 0xda, 0x63, 0xb3, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xcd, 0x7d, ++ 0x09, 0x7c, 0x94, 0xd5, 0xb5, 0xf8, 0xfd, 0xe6, 0x9b, 0x2d, 0xc9, 0x4c, ++ 0x32, 0x99, 0xec, 0x2b, 0x13, 0x76, 0x15, 0x70, 0x80, 0x10, 0x10, 0xa2, ++ 0x7e, 0x49, 0x00, 0xa3, 0x10, 0x1c, 0x50, 0x01, 0x35, 0xe8, 0x24, 0x90, ++ 0x84, 0x2d, 0x24, 0x20, 0x5a, 0xfa, 0x6a, 0x5f, 0x26, 0x24, 0x60, 0xc4, ++ 0x68, 0x43, 0xb5, 0x8a, 0x8a, 0x76, 0x50, 0xf0, 0x51, 0x45, 0x0d, 0x82, ++ 0x35, 0xb6, 0x51, 0x27, 0x80, 0x14, 0xac, 0x4b, 0xac, 0xb6, 0xa5, 0xad, ++ 0x62, 0x10, 0x44, 0x36, 0x25, 0x82, 0xfa, 0xa7, 0x7d, 0x2a, 0xef, 0x9c, ++ 0x73, 0xef, 0xcd, 0xcc, 0x37, 0x99, 0xb0, 0xf4, 0xf9, 0x7e, 0xbf, 0x7f, ++ 0xfa, 0xb3, 0x97, 0xfb, 0xdd, 0xfd, 0xec, 0xe7, 0xdc, 0x65, 0x66, 0x45, ++ 0x1b, 0x18, 0x1b, 0xc3, 0xd8, 0xb3, 0x26, 0x36, 0xbb, 0xd5, 0x06, 0xa9, ++ 0x02, 0xe9, 0x30, 0xc6, 0xce, 0xe2, 0xdf, 0xd5, 0x8c, 0xc5, 0x38, 0x0a, ++ 0x66, 0x45, 0x27, 0x31, 0xb6, 0xdf, 0x0a, 0x29, 0xd4, 0x63, 0xcc, 0xea, ++ 0x38, 0x34, 0x94, 0xb1, 0x5c, 0x66, 0x60, 0x71, 0x2a, 0x63, 0x25, 0x8a, ++ 0x37, 0xc6, 0x01, 0xe5, 0xd5, 0xd6, 0xae, 0x07, 0xca, 0xa0, 0x74, 0xc9, ++ 0x6f, 0xbe, 0x35, 0x43, 0x11, 0xdb, 0x10, 0xed, 0x4d, 0x35, 0x26, 0x32, ++ 0xe6, 0x4b, 0x37, 0xbb, 0x37, 0xe5, 0x04, 0xfb, 0x93, 0x69, 0x92, 0x03, ++ 0x2a, 0x41, 0xbb, 0xfe, 0x2b, 0x0a, 0xd9, 0xc1, 0x04, 0xc6, 0x2c, 0x56, ++ 0xe6, 0x8b, 0x1a, 0xc5, 0x98, 0x62, 0x64, 0x3e, 0xd3, 0x28, 0x1c, 0xc7, ++ 0xb5, 0xd2, 0x00, 0xed, 0x8d, 0x4d, 0x8c, 0xad, 0x81, 0xf6, 0xb1, 0x76, ++ 0x46, 0xf3, 0x64, 0x43, 0x53, 0x0d, 0x2c, 0x99, 0xb1, 0x3b, 0xac, 0x8c, ++ 0xfe, 0x7c, 0x85, 0x0c, 0x27, 0xc3, 0x7c, 0x3b, 0xa2, 0xfd, 0x0d, 0x0a, ++ 0x63, 0xdf, 0x33, 0x2d, 0x03, 0xe7, 0xf3, 0x03, 0xd3, 0x32, 0x1d, 0x50, ++ 0xff, 0x23, 0xa6, 0x65, 0x61, 0x5e, 0x8e, 0xdb, 0x28, 0xd6, 0x69, 0x34, ++ 0x30, 0xef, 0x56, 0x5b, 0xef, 0x79, 0xcd, 0x74, 0x28, 0x7c, 0x1c, 0xe6, ++ 0x19, 0xec, 0x81, 0x31, 0x2b, 0x0a, 0x99, 0x37, 0x14, 0x1e, 0x32, 0x2d, ++ 0x70, 0x18, 0xa9, 0x5e, 0xc1, 0xc3, 0x37, 0x67, 0x77, 0x41, 0xf9, 0x67, ++ 0x1d, 0xb7, 0x64, 0x33, 0xe8, 0x6f, 0xd7, 0xaf, 0xc6, 0xc6, 0x75, 0x45, ++ 0xa8, 0x2f, 0xd3, 0xb5, 0x75, 0xb5, 0xee, 0x89, 0xd0, 0xf4, 0xfe, 0x3a, ++ 0x2f, 0xa5, 0xf1, 0x8c, 0x69, 0x38, 0x9f, 0x5f, 0xd4, 0xcd, 0xa7, 0xbc, ++ 0x13, 0xf2, 0x5b, 0xa1, 0x7d, 0x85, 0xd9, 0x33, 0x38, 0x3e, 0xa4, 0x9f, ++ 0x81, 0x8e, 0x78, 0x82, 0x97, 0xa3, 0xe0, 0x4f, 0x9e, 0x01, 0x00, 0x97, ++ 0x43, 0xcd, 0xaa, 0x43, 0x71, 0x41, 0xca, 0x0c, 0xc5, 0xd8, 0xfe, 0xa0, ++ 0x3f, 0xae, 0x78, 0xbb, 0x68, 0x97, 0xa8, 0x6b, 0xc7, 0xe7, 0xa9, 0x32, ++ 0x8d, 0xb1, 0x01, 0xb0, 0x6e, 0x9b, 0xf1, 0x5f, 0x5d, 0x02, 0x76, 0x67, ++ 0x19, 0xae, 0x97, 0x51, 0xbf, 0x7d, 0xad, 0x73, 0xa6, 0x83, 0xd3, 0x87, ++ 0x99, 0xb9, 0xad, 0xd8, 0xde, 0xbc, 0xe3, 0x3a, 0x2b, 0xe2, 0x57, 0x55, ++ 0x34, 0x07, 0xe6, 0x25, 0x3d, 0x5c, 0x01, 0x23, 0x20, 0x3d, 0xdc, 0x83, ++ 0x9f, 0xae, 0x60, 0x6c, 0xb4, 0xe2, 0xf5, 0x38, 0xa8, 0x9d, 0x96, 0x20, ++ 0xcb, 0xcf, 0xe6, 0xe0, 0xf8, 0xc5, 0x94, 0x97, 0xe3, 0xb3, 0x4c, 0x58, ++ 0x71, 0x5a, 0xdf, 0xf0, 0x62, 0x8a, 0x76, 0x13, 0xe2, 0xef, 0x08, 0xd3, ++ 0x66, 0x62, 0x7f, 0xad, 0x66, 0x76, 0x99, 0x03, 0xd6, 0xdb, 0x1a, 0xcd, ++ 0xe6, 0x47, 0x9a, 0x6f, 0xa9, 0xc0, 0x5f, 0xba, 0x43, 0xd0, 0x0b, 0xb3, ++ 0x39, 0x0e, 0x5f, 0x26, 0xc6, 0x83, 0xf9, 0x9d, 0x8c, 0xd1, 0x6e, 0xc7, ++ 0x7e, 0xd2, 0xa2, 0x3c, 0x65, 0xd8, 0x6f, 0x5e, 0x46, 0xad, 0x6a, 0x82, ++ 0x26, 0xb3, 0xa2, 0x1d, 0xa2, 0xbe, 0xa6, 0x78, 0x86, 0x53, 0x79, 0x25, ++ 0xd6, 0x63, 0xa9, 0x9a, 0x52, 0x02, 0xf0, 0xce, 0xfb, 0x04, 0xe8, 0x10, ++ 0xb2, 0xdb, 0xf6, 0x14, 0x2a, 0x2e, 0x18, 0x3f, 0xb1, 0x73, 0xa2, 0xe2, ++ 0x82, 0xf1, 0x13, 0x05, 0xfe, 0x7a, 0xcd, 0x5f, 0xc0, 0xed, 0x25, 0xc6, ++ 0x8a, 0x23, 0xcd, 0x73, 0x56, 0x34, 0x9f, 0xe7, 0x52, 0x01, 0xff, 0xfd, ++ 0x56, 0x0f, 0xf1, 0xd7, 0xea, 0x1c, 0x6f, 0x6a, 0x2d, 0xf4, 0xe7, 0x6a, ++ 0x65, 0x9a, 0x1f, 0xda, 0xb5, 0xe2, 0x94, 0x42, 0xe0, 0xf3, 0x96, 0xc3, ++ 0x4c, 0xf5, 0x37, 0x44, 0x77, 0xf9, 0x54, 0xa4, 0xfb, 0x5b, 0x98, 0x7b, ++ 0x13, 0xd0, 0x41, 0x4a, 0xbe, 0x4f, 0x31, 0x42, 0x9a, 0x31, 0xb5, 0xa5, ++ 0x00, 0x30, 0xce, 0x1a, 0x1c, 0x4e, 0xea, 0xdf, 0x59, 0xec, 0x4d, 0x55, ++ 0xa0, 0x5e, 0x7a, 0xaa, 0xd9, 0xad, 0x2a, 0x17, 0xce, 0x6f, 0xc3, 0x5a, ++ 0x35, 0xd5, 0x0b, 0xe3, 0xe7, 0x7a, 0x0d, 0x34, 0x8f, 0x75, 0x9d, 0xbe, ++ 0xa8, 0xc1, 0x30, 0xaf, 0xe4, 0x4e, 0x6f, 0x81, 0x19, 0xd2, 0xa2, 0xf8, ++ 0x64, 0xea, 0x3f, 0x85, 0xd5, 0xd6, 0x23, 0x3e, 0xa0, 0x3d, 0x43, 0xbe, ++ 0x1c, 0xed, 0xe0, 0xff, 0xcc, 0xf5, 0x16, 0xaa, 0xae, 0x10, 0xb8, 0xe4, ++ 0xcd, 0xab, 0x6d, 0x30, 0xc3, 0xf7, 0xef, 0xa3, 0xbd, 0x6b, 0x43, 0xf9, ++ 0x31, 0x63, 0xb1, 0x8f, 0xc6, 0x39, 0xaa, 0x78, 0xfb, 0x39, 0x81, 0x9e, ++ 0x8e, 0xbe, 0x19, 0x3d, 0xdb, 0x8f, 0xfd, 0x05, 0x9c, 0x44, 0x47, 0xb2, ++ 0xde, 0x53, 0x88, 0xd7, 0x24, 0xa4, 0x87, 0xc2, 0x74, 0x96, 0x0a, 0xfd, ++ 0x6f, 0x34, 0xd1, 0xbc, 0x72, 0x37, 0xfe, 0xea, 0x36, 0xe4, 0xff, 0xdc, ++ 0x8d, 0xd7, 0x18, 0x95, 0x10, 0x39, 0xf3, 0x8a, 0xc3, 0x44, 0xf5, 0x8f, ++ 0xbe, 0xb9, 0xb0, 0x1f, 0xae, 0xdf, 0xf7, 0x37, 0x0b, 0x1b, 0x14, 0x41, ++ 0x0e, 0xbd, 0x28, 0xe8, 0xe5, 0x61, 0x81, 0x87, 0x6d, 0xe6, 0xc8, 0x74, ++ 0xf5, 0x9c, 0x1c, 0x5f, 0xd0, 0xfb, 0x04, 0xa6, 0x48, 0xf9, 0xf7, 0x9c, ++ 0x90, 0x7f, 0xb1, 0x03, 0x60, 0x7d, 0x4b, 0xaa, 0x4f, 0x91, 0xfc, 0x6b, ++ 0x76, 0xb8, 0xa8, 0xfe, 0xe3, 0xc6, 0xd6, 0xdd, 0xe9, 0x00, 0xd7, 0xc7, ++ 0xe7, 0x31, 0xb7, 0x0f, 0x3e, 0x2d, 0xdc, 0xbc, 0x41, 0xc1, 0xf5, 0x6e, ++ 0x33, 0xb7, 0x5e, 0xbb, 0x05, 0xe7, 0xb5, 0xc4, 0xc0, 0x10, 0x7f, 0xbb, ++ 0x76, 0xff, 0x6e, 0x77, 0x3a, 0xe4, 0xe7, 0xcf, 0x73, 0x8d, 0xb4, 0xb8, ++ 0x42, 0xda, 0xbf, 0xfd, 0xec, 0x6a, 0xfc, 0xfe, 0xf8, 0x7c, 0x36, 0x12, ++ 0xe1, 0x9a, 0xe6, 0x5f, 0xab, 0x18, 0x00, 0x3e, 0xdf, 0x46, 0xb5, 0xd0, ++ 0xba, 0xbf, 0xdd, 0x64, 0x61, 0xf5, 0x30, 0xb5, 0xc7, 0x37, 0x3e, 0x92, ++ 0x6c, 0xc7, 0x7a, 0x5e, 0x83, 0x03, 0xeb, 0xf5, 0xe2, 0x23, 0x40, 0xb3, ++ 0x21, 0x15, 0xd3, 0x80, 0xc9, 0x30, 0x8e, 0xe3, 0x11, 0xe5, 0x95, 0xc4, ++ 0x9f, 0x84, 0x3b, 0xae, 0x1f, 0xe5, 0xe2, 0xae, 0x4d, 0xaf, 0xd0, 0xbc, ++ 0xe5, 0x7c, 0x80, 0x50, 0xcc, 0x08, 0xf7, 0xa2, 0x78, 0x17, 0xc1, 0x6b, ++ 0xe1, 0xe6, 0xad, 0xd7, 0x22, 0xf1, 0xa7, 0x2f, 0x76, 0x2a, 0x6a, 0x4e, ++ 0x70, 0x5e, 0xe7, 0x93, 0xfb, 0x1f, 0x0a, 0xbe, 0xb8, 0x50, 0x3a, 0x7c, ++ 0x33, 0x9e, 0xf3, 0x31, 0xc8, 0x79, 0x0d, 0xc7, 0xf3, 0xe5, 0x19, 0x49, ++ 0xce, 0x7f, 0x62, 0xf3, 0xfe, 0x1d, 0xe1, 0x3e, 0xcc, 0xe6, 0x4a, 0x28, ++ 0x80, 0x29, 0x35, 0x3a, 0xfa, 0xc7, 0x78, 0x61, 0xfc, 0x7e, 0x03, 0xd8, ++ 0xed, 0x9e, 0x08, 0xfc, 0x78, 0xa9, 0xbd, 0x70, 0x3f, 0xd6, 0x3f, 0x19, ++ 0xe5, 0x3d, 0x80, 0x7c, 0xdd, 0xef, 0xb9, 0x4b, 0x27, 0xb2, 0x58, 0xc6, ++ 0x2e, 0xdb, 0xd2, 0x62, 0x40, 0x7c, 0x9c, 0x54, 0xb8, 0x5e, 0xe8, 0xcd, ++ 0xa7, 0x42, 0x3f, 0x0a, 0xbd, 0x28, 0xf5, 0xa4, 0x2c, 0x3f, 0x29, 0xe8, ++ 0xe2, 0x0e, 0xa1, 0x27, 0x23, 0xe8, 0xc7, 0x93, 0x91, 0xf4, 0xa3, 0x8b, ++ 0xb9, 0xee, 0x1b, 0x06, 0xf8, 0x62, 0x6f, 0x1b, 0x88, 0x7f, 0xc3, 0xc7, ++ 0x5d, 0x2a, 0xe8, 0x72, 0x82, 0xe6, 0x2d, 0x42, 0x7e, 0x9e, 0x1d, 0xe3, ++ 0x3d, 0x83, 0xf3, 0xbe, 0x62, 0x9c, 0x7f, 0xa7, 0x0a, 0xf5, 0xc7, 0x16, ++ 0xfb, 0x76, 0x22, 0xbf, 0xe7, 0x2a, 0xb5, 0x3b, 0xed, 0x00, 0x17, 0x76, ++ 0x2d, 0x97, 0x03, 0x09, 0x5d, 0xac, 0x03, 0x96, 0xc5, 0xe2, 0xf7, 0x75, ++ 0x69, 0xb1, 0x90, 0x9f, 0x8b, 0x72, 0x00, 0xc6, 0x1f, 0x7f, 0x44, 0xeb, ++ 0xc0, 0xf1, 0xe2, 0x3c, 0x4c, 0xc1, 0xf6, 0xcf, 0x22, 0x9d, 0xc3, 0x3a, ++ 0x5a, 0x9c, 0xec, 0xf6, 0xe9, 0x11, 0xe8, 0xfd, 0x36, 0xb1, 0x2e, 0xc3, ++ 0x43, 0xdd, 0x66, 0xd4, 0x67, 0x89, 0xed, 0x0a, 0xf1, 0x5b, 0x6f, 0xf8, ++ 0x70, 0x79, 0x04, 0xf2, 0x32, 0x26, 0x1e, 0xe6, 0x97, 0xd7, 0x0f, 0xe4, ++ 0x69, 0x4e, 0x6f, 0x79, 0x1a, 0x01, 0x7f, 0xce, 0x78, 0x68, 0x77, 0xc9, ++ 0x96, 0xc0, 0x0e, 0xac, 0x35, 0x2a, 0x7e, 0x60, 0x0c, 0x34, 0x3b, 0x17, ++ 0xfe, 0x92, 0xe3, 0x09, 0x7f, 0x5a, 0x0a, 0x8e, 0x23, 0xf1, 0x75, 0xe9, ++ 0x59, 0xf5, 0x76, 0xcf, 0xb0, 0xde, 0xf8, 0xca, 0x8e, 0xe7, 0xf3, 0xbf, ++ 0xd3, 0xae, 0x65, 0x61, 0xbb, 0xcf, 0x84, 0x3e, 0xe8, 0x0b, 0x8f, 0xc3, ++ 0xe3, 0x39, 0xfe, 0x8a, 0xe2, 0xb9, 0x9d, 0xf3, 0xac, 0x5d, 0xd4, 0x8b, ++ 0xd2, 0xd7, 0x2b, 0x8b, 0xe7, 0x78, 0xa9, 0x88, 0xd7, 0xcb, 0x83, 0x10, ++ 0x7c, 0x0f, 0x8f, 0x8f, 0x80, 0x6f, 0x29, 0xc7, 0xb7, 0xed, 0x79, 0x49, ++ 0x45, 0xbc, 0xe5, 0x4d, 0x6c, 0x69, 0x40, 0x3c, 0x00, 0x5e, 0x47, 0xe3, ++ 0x7a, 0xc6, 0xe7, 0xd7, 0x36, 0xe0, 0xf7, 0x84, 0xa9, 0x5c, 0x1e, 0x86, ++ 0xe3, 0x55, 0xca, 0xc3, 0x70, 0xfc, 0x86, 0xe3, 0x95, 0xb1, 0x7a, 0x9a, ++ 0x1f, 0xe0, 0xe3, 0xaa, 0xf8, 0x08, 0xfa, 0x4b, 0xf6, 0x13, 0xae, 0xc7, ++ 0x42, 0xe4, 0x04, 0xad, 0x6b, 0x9d, 0xa0, 0x4f, 0x1f, 0xd2, 0x27, 0xe3, ++ 0xfa, 0x68, 0x83, 0x2d, 0xb8, 0x0e, 0xc9, 0x3f, 0xb7, 0x09, 0x78, 0x4c, ++ 0xf0, 0x7a, 0x8b, 0xcc, 0x9c, 0x4e, 0x4b, 0x70, 0xdc, 0x2b, 0x66, 0xfb, ++ 0x77, 0x9a, 0x90, 0x4e, 0xe7, 0xfb, 0x76, 0x9a, 0x43, 0xe9, 0x74, 0x01, ++ 0xa3, 0xfe, 0xe4, 0x3c, 0x32, 0xba, 0x7c, 0xb4, 0x9e, 0xb4, 0x7d, 0xde, ++ 0x02, 0x4c, 0xc7, 0x1f, 0x09, 0x74, 0x0c, 0x83, 0x7a, 0x29, 0xb5, 0xb0, ++ 0x1e, 0x16, 0x5c, 0x4f, 0x56, 0xe7, 0x87, 0x0a, 0xca, 0xab, 0xac, 0xda, ++ 0x4e, 0x85, 0xa1, 0xfc, 0xdc, 0xb3, 0x83, 0xe6, 0x9d, 0xd9, 0xb9, 0x8b, ++ 0xa7, 0xa8, 0x87, 0x87, 0xf5, 0xd6, 0xb7, 0x8c, 0xad, 0x14, 0x74, 0xc8, ++ 0xfb, 0x79, 0x33, 0x9e, 0xcb, 0xd5, 0xd5, 0x5f, 0xcc, 0x4d, 0x45, 0xba, ++ 0x59, 0x5d, 0xc0, 0xf5, 0xed, 0x2a, 0xbb, 0x56, 0x8e, 0xf3, 0xbe, 0xc3, ++ 0xa1, 0xcd, 0x45, 0xfc, 0xad, 0xb3, 0x6b, 0xf3, 0x30, 0x3f, 0x2b, 0x9a, ++ 0xeb, 0x85, 0xe1, 0xf1, 0x5a, 0x25, 0x7e, 0xcf, 0xea, 0x43, 0xdf, 0x2f, ++ 0x11, 0x70, 0x00, 0xb8, 0x57, 0x63, 0xbb, 0xc4, 0xe5, 0xcc, 0xa7, 0xc0, ++ 0x3a, 0xc6, 0xee, 0xb3, 0xf9, 0x41, 0x55, 0x00, 0xe9, 0xc3, 0xbc, 0x61, ++ 0x41, 0x89, 0xb5, 0x3e, 0xc5, 0x0c, 0x70, 0x4d, 0xd4, 0x98, 0x1b, 0xe5, ++ 0x74, 0xbf, 0x04, 0x6f, 0xbd, 0x09, 0xea, 0x75, 0x5f, 0xc1, 0xdc, 0x4f, ++ 0x41, 0x3e, 0xae, 0xd4, 0x51, 0x80, 0xf0, 0x72, 0xce, 0x77, 0x77, 0x20, ++ 0x3c, 0x57, 0x7f, 0xa1, 0x92, 0x7d, 0xbb, 0x7a, 0x29, 0xf3, 0xaf, 0xa4, ++ 0x7e, 0x18, 0xff, 0x3f, 0x6f, 0x7f, 0x3f, 0xca, 0x57, 0xe4, 0xdf, 0x50, ++ 0x7e, 0xf1, 0x89, 0x79, 0xf8, 0xe2, 0x39, 0x1f, 0x80, 0xbd, 0xf3, 0xf3, ++ 0x78, 0xce, 0x9f, 0x75, 0xc4, 0x9f, 0xc2, 0xde, 0x91, 0x7c, 0xd9, 0x97, ++ 0xfd, 0x12, 0xc2, 0xd7, 0xab, 0x2f, 0x92, 0xaf, 0xef, 0xbf, 0x48, 0xbe, ++ 0x5e, 0x2b, 0xf8, 0xfa, 0x97, 0x94, 0x9e, 0x87, 0xaf, 0x1f, 0x0d, 0xf2, ++ 0xf5, 0x3a, 0x9c, 0xd7, 0xf9, 0xf8, 0x7a, 0xb3, 0xe0, 0xe7, 0x37, 0x05, ++ 0x7f, 0xf7, 0xc5, 0xd7, 0x7f, 0x10, 0x70, 0x7b, 0x27, 0xbe, 0x4f, 0x3f, ++ 0x67, 0x33, 0x8e, 0xd7, 0x5b, 0x8e, 0x73, 0xba, 0x93, 0x7c, 0xf1, 0xd2, ++ 0x9e, 0x51, 0x31, 0xe5, 0xd0, 0xef, 0x4e, 0x31, 0xcf, 0x10, 0xf9, 0xdd, ++ 0x8a, 0xeb, 0x3b, 0x9f, 0xfc, 0xfe, 0x37, 0xf8, 0xfc, 0xf7, 0xd8, 0xef, ++ 0xf9, 0xec, 0x54, 0xd9, 0xaf, 0xc4, 0xf7, 0xf9, 0xf8, 0x64, 0xb8, 0xd3, ++ 0x43, 0xf0, 0x92, 0xf6, 0x68, 0xac, 0xdd, 0x41, 0xeb, 0x91, 0x7c, 0x0f, ++ 0xfc, 0xb2, 0x47, 0xf0, 0xcb, 0x5e, 0xc1, 0x2f, 0x6f, 0x61, 0x3a, 0x2b, ++ 0x9a, 0xdb, 0x07, 0xe1, 0xfc, 0xd5, 0xa3, 0xef, 0x3a, 0xb9, 0x3c, 0x01, ++ 0x4f, 0x26, 0x06, 0xe9, 0x47, 0x8e, 0x7f, 0xa4, 0x37, 0xbc, 0xfe, 0x12, ++ 0x09, 0x5e, 0x59, 0x4c, 0xc0, 0xab, 0x98, 0xcb, 0x91, 0x4c, 0xe6, 0x53, ++ 0x63, 0xb1, 0xdf, 0xa9, 0x0e, 0xca, 0x3b, 0x4e, 0x38, 0xea, 0xd1, 0x55, ++ 0x8c, 0x3d, 0xd4, 0xed, 0x43, 0xb8, 0x7d, 0x1b, 0xcf, 0xfd, 0xcc, 0x5c, ++ 0x85, 0x79, 0x22, 0xd9, 0x75, 0xc7, 0x04, 0x9f, 0x24, 0x76, 0x16, 0x92, ++ 0x7c, 0x01, 0x78, 0x1e, 0xc2, 0x71, 0x25, 0xbd, 0x27, 0x32, 0xc7, 0x14, ++ 0xf4, 0x73, 0xa2, 0x9c, 0x5c, 0x6e, 0x8c, 0x1e, 0xa7, 0xed, 0x44, 0xb9, ++ 0xe4, 0xd0, 0x3c, 0x2a, 0xda, 0x1b, 0xb9, 0x4e, 0xce, 0x0f, 0x12, 0x4e, ++ 0xd0, 0xfe, 0x8b, 0x48, 0xf8, 0xd8, 0x8e, 0xf8, 0x18, 0xd6, 0xdb, 0x6f, ++ 0x08, 0xc7, 0xc3, 0xa7, 0x62, 0xbe, 0x51, 0x4e, 0x0e, 0x8f, 0xf0, 0xfe, ++ 0xa5, 0xfc, 0xc1, 0xfe, 0x87, 0x53, 0xff, 0x2e, 0x03, 0xf6, 0x2f, 0xdb, ++ 0xff, 0x10, 0x94, 0x43, 0xdf, 0x23, 0x7e, 0xc6, 0x2e, 0xaf, 0x55, 0x71, ++ 0x5d, 0x89, 0x4c, 0x8b, 0x41, 0xf9, 0x23, 0xe5, 0x24, 0xcb, 0x84, 0xf6, ++ 0xb9, 0xbd, 0xdb, 0x9b, 0xc4, 0xb8, 0xd0, 0xde, 0xe4, 0x84, 0x74, 0x6c, ++ 0x2d, 0xb4, 0x1f, 0x16, 0x6c, 0x9f, 0xc5, 0x02, 0x0a, 0xc2, 0xc3, 0x39, ++ 0x1f, 0xe4, 0x14, 0x43, 0xfb, 0xdd, 0x4d, 0xf6, 0x6c, 0x9b, 0xd5, 0x63, ++ 0x73, 0x12, 0xbd, 0x30, 0x2e, 0xaf, 0x0a, 0x0c, 0x24, 0x0f, 0xa6, 0xd9, ++ 0x34, 0xe2, 0xa7, 0x48, 0xfa, 0xdf, 0x79, 0x91, 0xfa, 0xdf, 0x29, 0xf4, ++ 0xbf, 0xf3, 0x42, 0xf4, 0xbf, 0x33, 0xa8, 0xff, 0xb1, 0x9d, 0x72, 0x3e, ++ 0xfd, 0x2f, 0xea, 0x8f, 0x70, 0x9e, 0x5b, 0x4e, 0xb8, 0x7b, 0xf0, 0x22, ++ 0xe3, 0x04, 0xbd, 0xf5, 0xbf, 0x33, 0x82, 0xfe, 0xdf, 0x6f, 0xd5, 0xa8, ++ 0xdf, 0x08, 0x7c, 0x34, 0x12, 0xd7, 0x13, 0xe3, 0xd0, 0x46, 0x61, 0x0a, ++ 0x7c, 0x34, 0xda, 0x99, 0x14, 0xd4, 0x3b, 0xd0, 0x6e, 0x0c, 0x7e, 0x6f, ++ 0x13, 0xed, 0x9b, 0xa7, 0x1a, 0x86, 0x92, 0x7d, 0xcd, 0xa2, 0xdd, 0x91, ++ 0xfc, 0x99, 0x42, 0xa7, 0x4d, 0x37, 0xaf, 0x2b, 0x85, 0x9f, 0xc2, 0xda, ++ 0xff, 0xfb, 0xb7, 0xff, 0x91, 0xc7, 0x58, 0x0d, 0x16, 0xf1, 0x79, 0x16, ++ 0x3a, 0x43, 0xfc, 0x96, 0x07, 0xa7, 0x7e, 0x9a, 0xec, 0x25, 0x3f, 0x8e, ++ 0xe9, 0xe2, 0x2b, 0xbf, 0x5e, 0xe9, 0x7e, 0x6f, 0x08, 0x8e, 0xf7, 0xae, ++ 0xca, 0x90, 0xbf, 0x7e, 0xfd, 0x9f, 0x5d, 0x66, 0x84, 0x77, 0x6b, 0x74, ++ 0xec, 0x08, 0x16, 0x17, 0x1c, 0xb7, 0xe6, 0x5f, 0x40, 0x58, 0x60, 0xcf, ++ 0x9f, 0xfc, 0x97, 0x81, 0x52, 0x89, 0xc7, 0x25, 0xed, 0xca, 0x68, 0x06, ++ 0x0c, 0x59, 0xb0, 0xf3, 0x3b, 0x8a, 0x93, 0x9c, 0xec, 0xf8, 0x17, 0xc5, ++ 0x49, 0x2e, 0xb5, 0x97, 0xcf, 0xc0, 0x75, 0xed, 0x7a, 0x8d, 0xc7, 0x4b, ++ 0x4e, 0xbf, 0x7d, 0xd0, 0x89, 0x74, 0x24, 0xc7, 0x5f, 0x26, 0xfc, 0xc8, ++ 0x49, 0xea, 0xb0, 0xd6, 0x00, 0xd0, 0xd3, 0xa9, 0xcd, 0x66, 0x37, 0xfa, ++ 0x21, 0x2a, 0x73, 0x3d, 0x92, 0x0f, 0xf3, 0xa9, 0xd9, 0x63, 0x62, 0x7e, ++ 0x92, 0x83, 0xcc, 0x8a, 0xf5, 0x4d, 0x7c, 0xba, 0xcc, 0xb4, 0x79, 0x75, ++ 0xa7, 0x1a, 0x8b, 0x79, 0xa3, 0x4f, 0xc4, 0x39, 0x94, 0xb3, 0xa4, 0xef, ++ 0x5c, 0x71, 0x48, 0x97, 0xa6, 0x3d, 0x2a, 0xf9, 0x15, 0x2c, 0x91, 0x97, ++ 0xd7, 0x32, 0x6b, 0xfd, 0xd9, 0xfe, 0x20, 0x57, 0xc7, 0x19, 0x98, 0x2b, ++ 0x24, 0x2e, 0x12, 0xaf, 0x45, 0x33, 0x57, 0x48, 0x9c, 0x22, 0xa1, 0xd8, ++ 0xa9, 0xcb, 0x33, 0x8c, 0xa7, 0xc0, 0xb8, 0x8b, 0x18, 0x9f, 0x67, 0x92, ++ 0x27, 0x5d, 0xd7, 0x3e, 0x65, 0x76, 0x7f, 0x5d, 0xfd, 0x34, 0xef, 0xa5, ++ 0xba, 0xf2, 0x8c, 0xf9, 0xa3, 0x74, 0xf9, 0xac, 0xda, 0xf1, 0xba, 0xfa, ++ 0xfd, 0xc0, 0x3f, 0x0a, 0xcd, 0xe7, 0xf8, 0xae, 0xd3, 0xd5, 0x1f, 0xd0, ++ 0x34, 0x43, 0x97, 0x1f, 0xd4, 0x72, 0x8b, 0xae, 0xfe, 0xe7, 0xac, 0xf6, ++ 0xe1, 0x7c, 0x5c, 0xb7, 0x4f, 0xeb, 0x1c, 0x08, 0xf3, 0x9c, 0x27, 0xe6, ++ 0x39, 0x64, 0x5d, 0xb9, 0xae, 0xdd, 0xa5, 0x86, 0xd6, 0x3c, 0xe0, 0x68, ++ 0x36, 0x2f, 0xb0, 0x70, 0x2a, 0x1b, 0x01, 0xfc, 0xe8, 0x5f, 0xa8, 0xeb, ++ 0xe7, 0xf8, 0xb3, 0xc5, 0x7b, 0x14, 0xf8, 0xce, 0x5a, 0x4c, 0x87, 0x38, ++ 0xbc, 0x6a, 0x19, 0xc2, 0x8b, 0xd6, 0x0f, 0xf0, 0xac, 0x6c, 0x53, 0xd8, ++ 0x63, 0xd0, 0xbe, 0x6a, 0x1d, 0x2f, 0x97, 0xed, 0xe6, 0xb7, 0xaf, 0x5d, ++ 0x9d, 0x01, 0xe9, 0x02, 0xbf, 0xfe, 0x3b, 0x63, 0x7e, 0x33, 0xca, 0xfd, ++ 0x45, 0x9b, 0xf5, 0xdf, 0x1f, 0x74, 0xda, 0x13, 0x29, 0x4e, 0x93, 0xce, ++ 0xd2, 0xcf, 0xaa, 0x91, 0xe8, 0xc0, 0x46, 0xe3, 0x9d, 0x5a, 0xaf, 0xfa, ++ 0x2d, 0x80, 0x3f, 0xd5, 0x37, 0x24, 0x8c, 0x0e, 0xf4, 0xf8, 0x60, 0xff, ++ 0x4b, 0xba, 0x70, 0x09, 0xba, 0xb0, 0xa4, 0xea, 0xe9, 0x22, 0xca, 0xa5, ++ 0xa7, 0x8b, 0xaa, 0xbd, 0xdb, 0xf2, 0x02, 0xac, 0x37, 0x9c, 0x63, 0x86, ++ 0x3a, 0x23, 0xc2, 0x51, 0xc2, 0xd9, 0xee, 0xd6, 0xd3, 0x8b, 0x84, 0x2f, ++ 0xe8, 0xc9, 0xff, 0x13, 0xf8, 0xbe, 0x81, 0xf0, 0x8d, 0x09, 0xc2, 0x37, ++ 0x2d, 0xca, 0xbb, 0x03, 0xf9, 0xef, 0x74, 0xdb, 0x72, 0x95, 0xe1, 0x78, ++ 0x5e, 0xef, 0x68, 0x6c, 0xd7, 0x97, 0xfc, 0x9d, 0x62, 0x2f, 0xdc, 0x8d, ++ 0xf2, 0xe2, 0x74, 0xdb, 0xd7, 0xb7, 0xed, 0x80, 0xf5, 0xd5, 0xc4, 0x70, ++ 0xfe, 0x3f, 0xb9, 0xe3, 0xbb, 0xc1, 0x28, 0xdf, 0x64, 0xbd, 0xeb, 0x56, ++ 0x94, 0xbb, 0x27, 0x8e, 0x06, 0xe0, 0x2a, 0xde, 0xf7, 0xb0, 0x7f, 0xf9, ++ 0xbd, 0x73, 0xe8, 0xd3, 0xcd, 0xa3, 0x60, 0x3d, 0xa5, 0x6d, 0x2a, 0xf1, ++ 0xf1, 0x49, 0xa3, 0xad, 0x49, 0xb9, 0x9c, 0x96, 0xe9, 0x72, 0x00, 0xdc, ++ 0x94, 0x1e, 0xbc, 0x71, 0x3c, 0x4a, 0xbc, 0x29, 0xed, 0x3b, 0xff, 0xa9, ++ 0x00, 0xde, 0x2c, 0x30, 0x43, 0x13, 0xc6, 0x1b, 0xc7, 0xb9, 0xad, 0x38, ++ 0x4f, 0x8c, 0xf4, 0x21, 0xbd, 0x28, 0x60, 0x87, 0x9e, 0x8d, 0x21, 0x7d, ++ 0xf2, 0x31, 0xce, 0xcf, 0x57, 0xa8, 0x31, 0x8a, 0xf7, 0xfc, 0x89, 0xb9, ++ 0x1b, 0xa0, 0x56, 0x83, 0x3d, 0xef, 0xb2, 0xf3, 0xc4, 0x05, 0x0e, 0x38, ++ 0x49, 0x5f, 0x7a, 0x1b, 0x51, 0xbe, 0x8e, 0xed, 0xf4, 0x9e, 0xde, 0x82, ++ 0xdd, 0x1b, 0x3b, 0x1d, 0x18, 0xff, 0x9d, 0xe2, 0xf5, 0xd2, 0x7a, 0x2e, ++ 0xc7, 0x09, 0x82, 0xfd, 0xc4, 0x1c, 0x00, 0x27, 0x7b, 0xb0, 0x3d, 0xb4, ++ 0x3b, 0x8e, 0xe3, 0x4e, 0x29, 0x70, 0xc6, 0xa0, 0xbd, 0xb5, 0x75, 0xd7, ++ 0x32, 0xf2, 0xdf, 0x58, 0x7b, 0x22, 0xd9, 0x83, 0x48, 0x32, 0xa1, 0x76, ++ 0x4e, 0xb8, 0x9f, 0x25, 0xed, 0x46, 0xb0, 0xd3, 0x4f, 0xf1, 0x79, 0x78, ++ 0xbe, 0x76, 0x86, 0xda, 0xe9, 0xc2, 0x6e, 0x93, 0xf6, 0x76, 0x5f, 0xfd, ++ 0x80, 0x7e, 0x1d, 0x8a, 0xf6, 0x41, 0x5f, 0xa9, 0xb2, 0x43, 0x1d, 0x6a, ++ 0x04, 0xb8, 0x74, 0x2b, 0xd1, 0xee, 0xa7, 0x22, 0xe8, 0x0d, 0x4b, 0x82, ++ 0xde, 0x9f, 0xbd, 0x32, 0x18, 0xdf, 0xb2, 0x24, 0x84, 0xe8, 0x89, 0x25, ++ 0x77, 0x9e, 0xde, 0x8d, 0xfa, 0x03, 0xe0, 0x1d, 0x9d, 0x00, 0xf3, 0xb4, ++ 0xdb, 0x41, 0x7f, 0x2b, 0x17, 0xa4, 0xbf, 0x63, 0xb1, 0xfe, 0x23, 0x31, ++ 0xb1, 0x44, 0xd7, 0xdd, 0x7b, 0x55, 0xff, 0x10, 0x68, 0x70, 0xca, 0xea, ++ 0x8a, 0x73, 0x02, 0xbc, 0xf2, 0x51, 0x9f, 0x5c, 0x4e, 0x71, 0x20, 0x96, ++ 0xe1, 0x0c, 0xb6, 0xab, 0xb5, 0xa6, 0x0f, 0x33, 0x82, 0x3e, 0xc9, 0x3f, ++ 0x35, 0x34, 0x8e, 0x9d, 0x23, 0xae, 0x9e, 0x8f, 0xf5, 0x46, 0x07, 0xf3, ++ 0xed, 0x51, 0x4c, 0x67, 0x17, 0xac, 0x1e, 0xc5, 0xe7, 0xe5, 0x12, 0xeb, ++ 0x3c, 0x10, 0xc5, 0xed, 0xac, 0xb1, 0x22, 0x5f, 0x13, 0x16, 0x8f, 0xaa, ++ 0x69, 0xe2, 0xf1, 0xd7, 0x0d, 0x66, 0x60, 0xb5, 0x90, 0x7e, 0xc6, 0x26, ++ 0xd8, 0x79, 0xbc, 0xc7, 0x5a, 0x30, 0x16, 0xd7, 0xb3, 0x41, 0xc4, 0xa1, ++ 0x57, 0xe7, 0x28, 0x64, 0x27, 0xac, 0x56, 0x14, 0xb2, 0x1b, 0x76, 0xda, ++ 0x0a, 0xa9, 0xfc, 0x90, 0xb3, 0x20, 0x0f, 0xe1, 0x77, 0xb9, 0x18, 0x67, ++ 0x2c, 0x8c, 0x81, 0xfa, 0xb9, 0xa5, 0xbf, 0x98, 0x8f, 0xb0, 0xc7, 0x64, ++ 0xff, 0xdd, 0xa2, 0x7e, 0xb7, 0xb3, 0x90, 0xd2, 0xb1, 0x09, 0x0e, 0x81, ++ 0x17, 0xc7, 0xa5, 0x88, 0xff, 0x0a, 0xab, 0x46, 0xfd, 0x9a, 0x55, 0x35, ++ 0x22, 0x9c, 0xf3, 0x13, 0xb8, 0xfd, 0x53, 0x13, 0xcd, 0xa4, 0x9f, 0x46, ++ 0xfc, 0x34, 0x49, 0xf0, 0xd7, 0x64, 0x21, 0x47, 0x8b, 0xec, 0x20, 0x47, ++ 0xb9, 0x1f, 0x38, 0x75, 0x12, 0x94, 0x5f, 0x25, 0xf9, 0x4f, 0xcd, 0xff, ++ 0xd0, 0x0c, 0xa4, 0x3b, 0x29, 0xce, 0xc4, 0x30, 0x5e, 0x7c, 0x95, 0x90, ++ 0x57, 0xec, 0x8c, 0xf1, 0x53, 0x94, 0x27, 0x0e, 0xf8, 0x1f, 0xca, 0x27, ++ 0x6d, 0xa8, 0x63, 0x17, 0x8c, 0xc4, 0x0a, 0x98, 0xe9, 0xd3, 0x50, 0x39, ++ 0x53, 0xc8, 0x3a, 0xd3, 0x91, 0x3e, 0x8a, 0xac, 0xfa, 0xef, 0x93, 0xb6, ++ 0x4f, 0x3e, 0x8a, 0xf2, 0x6f, 0x12, 0x33, 0x06, 0xbf, 0xe7, 0x70, 0x78, ++ 0xc7, 0x38, 0x83, 0x7c, 0x70, 0x63, 0x42, 0x8f, 0x1e, 0xc8, 0x44, 0x39, ++ 0xd5, 0x16, 0xdd, 0xf5, 0xcb, 0x29, 0xe8, 0x1f, 0xbf, 0xa3, 0xba, 0x9f, ++ 0x62, 0xbd, 0xd7, 0x5b, 0x91, 0xc0, 0xed, 0xb0, 0x66, 0xb4, 0xa3, 0x6d, ++ 0x04, 0x2a, 0x0d, 0xe3, 0x97, 0xd9, 0x62, 0x1f, 0xa5, 0x77, 0x7d, 0x0e, ++ 0x9f, 0x0d, 0x7d, 0xc4, 0x79, 0x2b, 0xac, 0x05, 0x73, 0x11, 0xbe, 0xaa, ++ 0xdd, 0x53, 0x81, 0x29, 0xb0, 0xc3, 0xa5, 0xc8, 0xef, 0x6d, 0x66, 0x6f, ++ 0x03, 0xfa, 0x1d, 0xdd, 0x2f, 0x33, 0x9a, 0xc7, 0x50, 0x3f, 0xdb, 0x81, ++ 0xf9, 0xe1, 0x3e, 0x17, 0x2e, 0x17, 0xf0, 0xef, 0x8b, 0x19, 0x81, 0x74, ++ 0x3d, 0xd2, 0x40, 0x7e, 0xbc, 0x6b, 0x5d, 0xcb, 0xce, 0x28, 0x28, 0x77, ++ 0xad, 0x57, 0x9c, 0x0a, 0xe4, 0x4d, 0x46, 0xe6, 0xb3, 0x8f, 0x0a, 0xca, ++ 0x93, 0xc6, 0x84, 0x1c, 0x9a, 0x6c, 0x73, 0x57, 0xf9, 0x0e, 0x3b, 0x94, ++ 0x27, 0xad, 0x9f, 0xae, 0xf4, 0x87, 0xf9, 0xb4, 0xb0, 0x96, 0xa2, 0x58, ++ 0xb4, 0xb7, 0xd6, 0xb3, 0x88, 0x71, 0xc1, 0x3a, 0x41, 0x47, 0x53, 0x0a, ++ 0x76, 0x50, 0x7c, 0x3d, 0xa9, 0x1b, 0xe8, 0x34, 0x02, 0x1d, 0xd4, 0x25, ++ 0x18, 0xa4, 0x1d, 0xff, 0x9f, 0xb8, 0x8e, 0xb1, 0xdd, 0xde, 0xd1, 0x4a, ++ 0xff, 0xa0, 0x3c, 0x22, 0x51, 0x8b, 0x7e, 0xd3, 0x2e, 0x83, 0x3f, 0x52, ++ 0x9c, 0x76, 0x9a, 0xad, 0xa8, 0x11, 0xdb, 0x0d, 0xf7, 0xb3, 0x88, 0x71, ++ 0xbf, 0x9a, 0x68, 0x3e, 0x8f, 0x26, 0xab, 0x67, 0x0d, 0xd2, 0xe9, 0xf0, ++ 0xed, 0x01, 0xf2, 0x87, 0xaa, 0xa4, 0x5c, 0x9f, 0x67, 0x60, 0x46, 0xa0, ++ 0xab, 0x1b, 0x84, 0x1c, 0xbf, 0x61, 0x7d, 0xc7, 0x3f, 0xc9, 0x8e, 0xf8, ++ 0xee, 0xec, 0x59, 0x55, 0xda, 0xa1, 0x8c, 0xfa, 0x67, 0x28, 0x97, 0xaa, ++ 0x6e, 0xb4, 0xfb, 0x31, 0x7e, 0x5f, 0xd5, 0x9e, 0xe3, 0xa3, 0x79, 0x79, ++ 0x14, 0xf7, 0x20, 0x48, 0x6a, 0xda, 0xdf, 0xf7, 0x60, 0xbe, 0x2a, 0x37, ++ 0xd7, 0x81, 0x71, 0x66, 0xed, 0xef, 0x4c, 0x39, 0x3c, 0x94, 0x4c, 0x58, ++ 0xc6, 0xe5, 0x9f, 0x91, 0x1d, 0x96, 0x7a, 0x96, 0xec, 0x06, 0x74, 0x8a, ++ 0x18, 0x9b, 0x21, 0xe8, 0xb9, 0x06, 0xfd, 0xd1, 0x24, 0xd2, 0x1f, 0xcd, ++ 0x31, 0x00, 0xff, 0xaa, 0xf5, 0xf5, 0x3b, 0xd2, 0xa0, 0xbf, 0x3f, 0x3f, ++ 0x0d, 0x7d, 0x40, 0xd1, 0x3e, 0xd5, 0xbb, 0xef, 0x67, 0xd0, 0xef, 0x4d, ++ 0xa0, 0xc4, 0x56, 0x8c, 0xc2, 0xd4, 0xc8, 0x4a, 0x29, 0x0e, 0x9d, 0x4a, ++ 0xfd, 0xdc, 0x28, 0xfa, 0xf1, 0xfd, 0x0b, 0xc6, 0xb5, 0x06, 0xc7, 0xbd, ++ 0xa9, 0x7d, 0x2f, 0xad, 0x67, 0x9f, 0x89, 0xf9, 0xac, 0x40, 0xbf, 0xa6, ++ 0x42, 0x3e, 0xb4, 0xe9, 0x3f, 0xe2, 0xfc, 0x0d, 0x28, 0x08, 0x99, 0x9f, ++ 0xe8, 0x6c, 0xa6, 0xb5, 0x65, 0x12, 0xea, 0xd7, 0x93, 0xe6, 0xee, 0x11, ++ 0x6e, 0xb4, 0x7f, 0x5f, 0xfb, 0x6b, 0x96, 0x0f, 0xe0, 0xff, 0xf1, 0xcf, ++ 0x4f, 0xdb, 0xd1, 0x2e, 0xfe, 0xc4, 0xd8, 0x6d, 0xc7, 0xef, 0x47, 0xee, ++ 0xfe, 0xc0, 0xae, 0x01, 0xfc, 0x3e, 0xbe, 0x5b, 0x2d, 0x46, 0x78, 0xdf, ++ 0x26, 0xf4, 0x8d, 0x84, 0x77, 0x87, 0xc0, 0x7b, 0x42, 0xa2, 0xa7, 0x0d, ++ 0xf1, 0x72, 0x7b, 0xdd, 0xf7, 0x79, 0xde, 0x10, 0xbc, 0xb3, 0x15, 0x49, ++ 0xc4, 0x3f, 0x0b, 0xfc, 0x30, 0xc3, 0x10, 0xbb, 0x63, 0xd1, 0xe6, 0x18, ++ 0xb4, 0x84, 0x7a, 0xf2, 0xd5, 0xad, 0x09, 0xba, 0xbc, 0xd4, 0x1f, 0xd5, ++ 0x16, 0x56, 0x1b, 0x29, 0x0e, 0xf4, 0x8d, 0xe0, 0x97, 0x05, 0x5b, 0x36, ++ 0x98, 0x33, 0x5c, 0x38, 0xbe, 0xf7, 0x2d, 0x1c, 0xff, 0x88, 0x91, 0xd3, ++ 0xcf, 0x91, 0xed, 0x76, 0xbf, 0x2f, 0x27, 0x38, 0x9f, 0xf2, 0x2d, 0x23, ++ 0xcd, 0x68, 0x97, 0x7c, 0xd2, 0x6e, 0x61, 0x01, 0xd4, 0x83, 0xc6, 0x4e, ++ 0x13, 0xb3, 0x71, 0x39, 0xa3, 0x00, 0x3d, 0x78, 0x05, 0xde, 0xc3, 0xe7, ++ 0xb9, 0xfb, 0xf5, 0x18, 0xea, 0xaf, 0xe2, 0x57, 0x5c, 0x2e, 0x95, 0xc1, ++ 0x58, 0x2b, 0x00, 0xae, 0xde, 0xf6, 0x05, 0x24, 0x7f, 0xc2, 0xd7, 0x51, ++ 0xf1, 0xb1, 0x6b, 0x72, 0x0a, 0xc0, 0xbb, 0xe2, 0x5e, 0x85, 0xe1, 0xbe, ++ 0x0a, 0xd6, 0xbf, 0x1b, 0xf0, 0xe6, 0x5d, 0x71, 0xcf, 0x57, 0x68, 0xe7, ++ 0x85, 0xaf, 0xb3, 0xcc, 0xa7, 0x97, 0x47, 0x73, 0x9b, 0xf4, 0x79, 0x29, ++ 0x27, 0xab, 0x04, 0xbe, 0xe7, 0x31, 0x77, 0x13, 0xda, 0xcf, 0x15, 0x2d, ++ 0xfa, 0x7a, 0x55, 0xed, 0xf7, 0x51, 0xff, 0x55, 0x61, 0x72, 0xec, 0x78, ++ 0x82, 0xb0, 0xaf, 0xf2, 0xd8, 0xd8, 0xb3, 0x60, 0xa7, 0x34, 0xd8, 0xfa, ++ 0xc7, 0x79, 0xcf, 0xa1, 0xaf, 0x4e, 0xd4, 0x81, 0x5c, 0x1f, 0xcc, 0xd8, ++ 0xb1, 0x3a, 0x2b, 0xa5, 0x47, 0xea, 0x18, 0xa5, 0x6d, 0x09, 0x2e, 0x82, ++ 0xf7, 0xe2, 0xf6, 0xf7, 0xef, 0x42, 0xba, 0x59, 0xd2, 0xb6, 0xd5, 0x8c, ++ 0xfd, 0x34, 0xfa, 0x27, 0x39, 0xc6, 0x43, 0x15, 0x4b, 0xfb, 0xcd, 0x0c, ++ 0xbf, 0x5b, 0x70, 0x5f, 0x15, 0x9a, 0xce, 0xc1, 0x7d, 0x55, 0x98, 0x27, ++ 0xda, 0x3a, 0x88, 0xff, 0xd1, 0x8a, 0xe7, 0x7b, 0xe4, 0x47, 0x93, 0x23, ++ 0x6c, 0x9f, 0x55, 0xac, 0xaf, 0x54, 0xc0, 0x9f, 0xd9, 0xb8, 0x5d, 0x51, ++ 0x8a, 0xeb, 0x19, 0x81, 0xdf, 0x8d, 0x5f, 0x87, 0xae, 0xe7, 0xd4, 0x9e, ++ 0xd1, 0x56, 0x1c, 0xd7, 0x9c, 0x28, 0xe4, 0xf1, 0x58, 0x58, 0x97, 0x7a, ++ 0xe1, 0xeb, 0x92, 0xeb, 0x91, 0xeb, 0x93, 0xe5, 0xd5, 0x2a, 0xd0, 0x59, ++ 0x84, 0xf6, 0x92, 0xbe, 0xdb, 0x04, 0xbd, 0xcd, 0xdb, 0x38, 0x7d, 0x75, ++ 0x3a, 0x80, 0xa2, 0xe1, 0xb5, 0xcf, 0xb3, 0xbb, 0xb8, 0x5f, 0x4a, 0xf6, ++ 0xbc, 0x51, 0xe0, 0xc7, 0x68, 0x5b, 0x43, 0xf6, 0xbc, 0x91, 0x81, 0xbd, ++ 0xce, 0xd7, 0x29, 0xec, 0x79, 0xf6, 0x21, 0xf2, 0xad, 0xa4, 0xb3, 0x70, ++ 0x3a, 0xaa, 0x42, 0x38, 0x50, 0x00, 0x87, 0xb7, 0xb3, 0x0a, 0x3b, 0xbf, ++ 0x87, 0x7e, 0xda, 0xef, 0x27, 0x78, 0x48, 0x3c, 0x03, 0x7f, 0xa4, 0x8a, ++ 0x7d, 0xb3, 0x54, 0xdc, 0x37, 0x03, 0x3a, 0x3a, 0x14, 0x46, 0x47, 0xba, ++ 0x7c, 0x45, 0x8b, 0x3e, 0xff, 0xa5, 0xa9, 0x2b, 0x1b, 0xf9, 0x1b, 0xe8, ++ 0xe5, 0x50, 0x28, 0x7c, 0xbf, 0x0c, 0x3b, 0x67, 0x21, 0xd3, 0xa4, 0xc4, ++ 0xfe, 0x04, 0x87, 0x79, 0x2e, 0x6d, 0xb2, 0x03, 0xca, 0x2b, 0x98, 0x67, ++ 0x35, 0xdf, 0x5f, 0x6d, 0x21, 0xb8, 0x1c, 0x31, 0xb6, 0xec, 0xfe, 0x19, ++ 0xf2, 0xdd, 0x46, 0x4e, 0xf7, 0x9f, 0x08, 0xbc, 0xff, 0x32, 0xd1, 0x33, ++ 0x21, 0x11, 0xf5, 0x95, 0x51, 0x1b, 0x81, 0xf2, 0xbd, 0x70, 0x65, 0x9a, ++ 0x9a, 0x08, 0xf5, 0xca, 0x9a, 0x15, 0x07, 0xf2, 0xd3, 0xdc, 0xc6, 0x91, ++ 0x93, 0x91, 0x0f, 0x47, 0x31, 0x8d, 0xfa, 0x9b, 0x93, 0x10, 0xd9, 0x4e, ++ 0x9b, 0x93, 0xc8, 0xe1, 0x5f, 0x5e, 0x6b, 0x62, 0x66, 0xb0, 0xef, 0xcb, ++ 0x61, 0x0c, 0x94, 0x6b, 0xe5, 0xdb, 0x55, 0xe2, 0x73, 0xa0, 0x23, 0x5b, ++ 0x09, 0xe0, 0x61, 0xbe, 0xc0, 0x43, 0xf5, 0xbd, 0x5b, 0xcd, 0x69, 0x90, ++ 0xce, 0xaf, 0xad, 0xe2, 0x76, 0x82, 0x9f, 0xf3, 0x0b, 0xc0, 0x95, 0xec, ++ 0x84, 0x85, 0xcd, 0x1d, 0x66, 0xa4, 0x57, 0xf0, 0x47, 0x22, 0xf2, 0x9b, ++ 0xd4, 0x03, 0xd5, 0xad, 0xfa, 0xf2, 0x1a, 0xd6, 0x4c, 0x78, 0xa8, 0x41, ++ 0x3e, 0x93, 0x74, 0x0c, 0xe3, 0xcf, 0x4e, 0x14, 0x7c, 0xe6, 0x66, 0x6e, ++ 0xa4, 0x47, 0xef, 0x5d, 0x76, 0xab, 0x12, 0x77, 0xfe, 0xf5, 0xb2, 0xde, ++ 0x71, 0x05, 0x8a, 0x3b, 0x9c, 0xda, 0x33, 0x88, 0xec, 0xca, 0x53, 0x2e, ++ 0x57, 0x0a, 0xd6, 0xf3, 0x02, 0xce, 0x3b, 0xd1, 0x5e, 0x36, 0x7a, 0xc7, ++ 0xe2, 0x77, 0x80, 0x13, 0xe9, 0xa3, 0xee, 0xfa, 0x18, 0x3f, 0xda, 0xcd, ++ 0x07, 0xce, 0x80, 0x3f, 0x88, 0x36, 0x9c, 0xc3, 0x3b, 0x16, 0xed, 0xa4, ++ 0xae, 0xbf, 0x67, 0xb1, 0x35, 0x4a, 0x90, 0x3e, 0xe5, 0x7a, 0x6a, 0xac, ++ 0xcd, 0x44, 0x9f, 0x35, 0x4c, 0xef, 0x6f, 0x96, 0x81, 0x63, 0x83, 0xfb, ++ 0x9b, 0x65, 0x9b, 0x12, 0xfc, 0x3e, 0x85, 0xfa, 0x1f, 0xd1, 0x86, 0x76, ++ 0xc5, 0x26, 0x13, 0xd9, 0x0d, 0x3e, 0xb6, 0x2c, 0x95, 0x01, 0x9d, 0x79, ++ 0x56, 0x99, 0x48, 0x1e, 0x96, 0xb7, 0xc5, 0x93, 0xbf, 0x5b, 0xde, 0xc8, ++ 0xf7, 0x01, 0xca, 0xb7, 0xc4, 0xfb, 0x55, 0xee, 0xd7, 0x7f, 0x38, 0x30, ++ 0x2f, 0x88, 0x87, 0x03, 0x8d, 0x45, 0xe6, 0x34, 0xc2, 0x53, 0x8e, 0x9b, ++ 0xe2, 0xc3, 0x6d, 0x26, 0x1d, 0x7d, 0x4b, 0xfc, 0x84, 0xfb, 0x8b, 0x0b, ++ 0x9b, 0x3a, 0x76, 0xa7, 0xba, 0x7a, 0xfb, 0x8b, 0x11, 0xf0, 0x73, 0xa8, ++ 0x0f, 0xfc, 0x1c, 0x0a, 0xc5, 0x4f, 0x73, 0x18, 0x7e, 0xd8, 0xdd, 0x09, ++ 0x5c, 0xce, 0x2c, 0x7d, 0x73, 0x90, 0x15, 0xe6, 0x77, 0xaa, 0x36, 0xca, ++ 0xad, 0x46, 0xb0, 0x37, 0xa4, 0x1e, 0x62, 0x99, 0x40, 0x80, 0x79, 0xc1, ++ 0xf8, 0x53, 0x71, 0x3a, 0xc7, 0x07, 0x33, 0xba, 0x93, 0x11, 0x9f, 0xa7, ++ 0x9b, 0xc7, 0x10, 0xbe, 0xc2, 0xf1, 0x54, 0xfc, 0xc3, 0x5c, 0xc2, 0x07, ++ 0xfb, 0xbb, 0x9d, 0xa1, 0x3d, 0x33, 0x07, 0xfc, 0x90, 0x19, 0xf0, 0xfd, ++ 0x76, 0x85, 0xf3, 0xc7, 0x9c, 0x86, 0x6b, 0x8b, 0x51, 0x5f, 0x6f, 0x4a, ++ 0xe4, 0x72, 0xe6, 0x3d, 0x90, 0x4f, 0x9a, 0x99, 0xb1, 0xf7, 0x41, 0x3e, ++ 0x69, 0x20, 0x9f, 0x3e, 0x00, 0xb9, 0x85, 0xf9, 0x3f, 0xd7, 0xa5, 0x52, ++ 0xfe, 0xaf, 0x75, 0x2e, 0x4a, 0xff, 0x56, 0x37, 0x94, 0xd2, 0x43, 0x62, ++ 0xbf, 0x54, 0xf2, 0x0d, 0x10, 0x80, 0x19, 0xed, 0xc2, 0xe7, 0x04, 0xbf, ++ 0x3c, 0x97, 0x28, 0xe3, 0x81, 0xcb, 0x53, 0xd1, 0x74, 0x28, 0xfe, 0xe1, ++ 0x83, 0x31, 0x06, 0x34, 0xdd, 0x7d, 0x33, 0xaf, 0x9b, 0x94, 0xc5, 0xd8, ++ 0xf5, 0x9a, 0x5e, 0xdf, 0xcd, 0xbe, 0x51, 0xaf, 0xcf, 0xba, 0x4c, 0x8e, ++ 0xc9, 0xa9, 0xe8, 0xb7, 0xde, 0xab, 0x90, 0xdd, 0x57, 0xee, 0x99, 0xa0, ++ 0xab, 0xcf, 0x8c, 0x2e, 0xf3, 0x74, 0x0c, 0x6c, 0x0f, 0x1d, 0x1d, 0xfc, ++ 0x4e, 0xf6, 0x9c, 0xcb, 0x3c, 0x03, 0xf8, 0xfd, 0xe6, 0xa9, 0x09, 0xba, ++ 0xfa, 0x33, 0x9b, 0x32, 0x74, 0xf9, 0x9d, 0x89, 0x2e, 0x5a, 0xf7, 0xf4, ++ 0xe2, 0x01, 0xba, 0xef, 0xb7, 0x94, 0x5e, 0xa6, 0xcb, 0x97, 0x9d, 0x01, ++ 0x20, 0x8c, 0x46, 0x6a, 0x76, 0x12, 0x1e, 0x96, 0x5b, 0x99, 0x30, 0x16, ++ 0x9d, 0x3c, 0x2e, 0xe8, 0xe0, 0x75, 0xbf, 0xae, 0x1d, 0x9b, 0xf2, 0x13, ++ 0x98, 0xef, 0xd7, 0x6f, 0x9b, 0xa8, 0x3c, 0x1c, 0x1f, 0x12, 0xaf, 0xf3, ++ 0xd6, 0x19, 0x98, 0x17, 0xa6, 0x36, 0x77, 0x1d, 0xac, 0x0d, 0xfa, 0x3d, ++ 0xd4, 0x02, 0x78, 0x82, 0x76, 0xc7, 0xf7, 0xd9, 0xc9, 0xbf, 0x58, 0xbd, ++ 0x65, 0xf4, 0xbb, 0xe3, 0x20, 0x7f, 0x60, 0x8b, 0x89, 0xe2, 0x02, 0x07, ++ 0x1a, 0x13, 0x1e, 0x40, 0xfb, 0xe8, 0xc0, 0x96, 0xa4, 0x58, 0x06, 0xa9, ++ 0x77, 0xb5, 0x2a, 0xec, 0x08, 0x87, 0x99, 0x85, 0xc8, 0xab, 0xa2, 0xc6, ++ 0xfa, 0xdb, 0x50, 0x2e, 0x95, 0xf9, 0x2d, 0x6e, 0xb2, 0x17, 0x76, 0xf9, ++ 0x9e, 0x94, 0x79, 0x17, 0xfa, 0xa3, 0x38, 0x49, 0xe4, 0x97, 0x0f, 0x55, ++ 0x3f, 0xc6, 0xb7, 0x00, 0x7f, 0x3c, 0x2e, 0xf0, 0xac, 0x85, 0xec, 0xdd, ++ 0x23, 0x60, 0xb7, 0xe1, 0xd6, 0xf8, 0x11, 0x85, 0x35, 0x62, 0x8a, 0x8a, ++ 0x25, 0x0e, 0xca, 0xbf, 0xe9, 0x4c, 0xf2, 0x23, 0x3f, 0x17, 0xff, 0xa0, ++ 0x6a, 0xa9, 0x48, 0x4f, 0xcf, 0x46, 0x51, 0x7d, 0x8a, 0x50, 0x40, 0xf9, ++ 0xb1, 0xf7, 0x07, 0x3d, 0xb5, 0x86, 0xe8, 0xcb, 0xd5, 0x1a, 0x20, 0xbe, ++ 0xb5, 0x90, 0x3f, 0x30, 0xb7, 0x8b, 0xaf, 0x8f, 0x29, 0xa3, 0x32, 0x10, ++ 0xff, 0x47, 0xe2, 0x99, 0x16, 0x0f, 0x93, 0xa8, 0x5e, 0xf6, 0xd7, 0xfd, ++ 0x46, 0xc0, 0xd3, 0x82, 0xc1, 0x9d, 0x23, 0x02, 0xd0, 0xae, 0x34, 0x27, ++ 0x90, 0x34, 0x0b, 0xda, 0x9d, 0xd8, 0x68, 0xa2, 0xf3, 0x20, 0xd8, 0xaf, ++ 0x03, 0xf2, 0xd5, 0xcf, 0x59, 0x36, 0x70, 0x39, 0xa2, 0xa5, 0x4c, 0x1f, ++ 0x1e, 0x0a, 0x4f, 0xff, 0x08, 0x5c, 0xf7, 0x1c, 0x83, 0xe7, 0xff, 0x25, ++ 0x02, 0xfe, 0x8e, 0x55, 0xfa, 0x47, 0x90, 0x3c, 0xbb, 0x3b, 0x89, 0xf8, ++ 0x2a, 0x1c, 0xee, 0x87, 0xcc, 0x5e, 0x82, 0xaf, 0x0f, 0xf9, 0x40, 0x09, ++ 0xca, 0xc7, 0x20, 0x9f, 0xf1, 0x7d, 0x1e, 0x10, 0x6a, 0x69, 0x28, 0x67, ++ 0xe6, 0x9a, 0xdc, 0xc9, 0xa8, 0x9f, 0x0e, 0x35, 0x9b, 0xc8, 0xee, 0x04, ++ 0xfd, 0x11, 0x3b, 0x9d, 0xe2, 0x2b, 0x2f, 0x11, 0x1d, 0x1f, 0x32, 0xba, ++ 0x26, 0xe3, 0xba, 0x0f, 0x35, 0xe5, 0x30, 0x94, 0x57, 0x72, 0xdc, 0xf2, ++ 0x66, 0x95, 0xfc, 0x02, 0xa4, 0x3f, 0xaa, 0xbf, 0x56, 0xf5, 0x82, 0x8d, ++ 0xc0, 0xa4, 0x9e, 0xf2, 0x35, 0x29, 0x5e, 0x96, 0xd2, 0x9b, 0x6e, 0xee, ++ 0x58, 0x3a, 0x36, 0x05, 0xd7, 0x13, 0x6e, 0xdf, 0xca, 0xf4, 0x4b, 0xe0, ++ 0x55, 0x6f, 0x88, 0xbd, 0xb0, 0xf0, 0x35, 0xd5, 0x43, 0xe7, 0x81, 0x72, ++ 0xbb, 0x8c, 0x37, 0x0e, 0x0f, 0x5d, 0x47, 0x23, 0xe7, 0xb7, 0x54, 0xde, ++ 0xff, 0x72, 0x21, 0xd7, 0x17, 0xf7, 0xff, 0xc3, 0x7e, 0x9b, 0x01, 0xe5, ++ 0xfa, 0x80, 0x38, 0x8c, 0x93, 0x1f, 0xfd, 0x50, 0x25, 0x3a, 0x3b, 0xda, ++ 0xbf, 0x25, 0x2f, 0x15, 0x48, 0xff, 0x84, 0x61, 0x47, 0xde, 0x4f, 0x20, ++ 0x7f, 0xbc, 0xc4, 0x77, 0xd8, 0x08, 0xf9, 0x27, 0x2d, 0xde, 0x81, 0x49, ++ 0xb0, 0xa4, 0x45, 0x86, 0xe6, 0x6c, 0xf4, 0x8f, 0x4e, 0xb6, 0x1f, 0x7c, ++ 0x60, 0x02, 0xb4, 0x3b, 0xf6, 0xbc, 0xc9, 0x8d, 0xc3, 0x2e, 0x7c, 0x76, ++ 0x41, 0x3f, 0x8a, 0xe7, 0x08, 0xfb, 0xba, 0xb7, 0xdc, 0x0a, 0xa4, 0x73, ++ 0xfb, 0x40, 0x4b, 0x53, 0x00, 0x9e, 0x8b, 0x5c, 0xad, 0xa4, 0xb7, 0x5d, ++ 0x5b, 0x14, 0xc6, 0xd7, 0xef, 0xe7, 0xe7, 0x05, 0x84, 0x1e, 0x77, 0x3c, ++ 0xa4, 0xa0, 0x2d, 0xc5, 0x0e, 0x8e, 0xb1, 0xaf, 0xc1, 0x78, 0xc7, 0x5c, ++ 0x60, 0x8f, 0x50, 0xbb, 0xfb, 0xa0, 0x89, 0xdb, 0x05, 0x79, 0x49, 0x5c, ++ 0x9e, 0x48, 0xfd, 0xbe, 0x5c, 0xe4, 0xe7, 0x1a, 0x38, 0x5d, 0xb3, 0xd7, ++ 0x15, 0xff, 0x26, 0x61, 0xef, 0x84, 0xea, 0x01, 0x29, 0x97, 0x27, 0x25, ++ 0xf5, 0xa7, 0xfa, 0x3d, 0x7a, 0x99, 0xb5, 0x92, 0xbc, 0xaa, 0xc4, 0x73, ++ 0x1d, 0xb0, 0xbe, 0xc5, 0x9b, 0x2d, 0x7e, 0x7f, 0x0e, 0xb5, 0x71, 0x20, ++ 0x9f, 0x2f, 0xe0, 0xe8, 0x61, 0xf5, 0x49, 0x2e, 0x7e, 0xbe, 0xc7, 0xfc, ++ 0xfc, 0xc3, 0xc8, 0x43, 0x55, 0xac, 0x93, 0xe6, 0x7d, 0xcc, 0xe4, 0xaf, ++ 0xec, 0xcc, 0xc1, 0xf6, 0x1b, 0x1a, 0x9d, 0xd4, 0xde, 0xe4, 0xa6, 0xb8, ++ 0xab, 0xd0, 0x27, 0x56, 0x60, 0x20, 0x94, 0x47, 0x55, 0x82, 0xef, 0xaa, ++ 0x5b, 0x14, 0x7f, 0x80, 0xf8, 0x86, 0xeb, 0xc5, 0x0a, 0xd1, 0x3f, 0x43, ++ 0x3d, 0x13, 0x22, 0xbf, 0x7a, 0xeb, 0x15, 0xbd, 0x3e, 0xa9, 0x10, 0x7a, ++ 0xb4, 0x82, 0x85, 0xc5, 0x6d, 0x5b, 0xf4, 0xfa, 0xcd, 0x13, 0x63, 0xa7, ++ 0x75, 0x2d, 0x84, 0x71, 0x51, 0x5f, 0x06, 0xe7, 0x05, 0xf6, 0x31, 0xc0, ++ 0xac, 0xd2, 0xeb, 0xdf, 0x3d, 0x8d, 0xe6, 0xad, 0xb8, 0xfd, 0x11, 0xe6, ++ 0x51, 0xc5, 0xba, 0x03, 0x78, 0x9e, 0xae, 0x7a, 0x8b, 0xe2, 0x0e, 0xb0, ++ 0xde, 0xf3, 0x0a, 0x5f, 0xc7, 0x85, 0xce, 0xb3, 0xd2, 0x3d, 0x7d, 0x62, ++ 0x7c, 0x6e, 0xc8, 0xb8, 0x61, 0xf3, 0x96, 0xf0, 0xa6, 0xc0, 0x6f, 0x08, ++ 0x1e, 0x24, 0xdc, 0x2b, 0x7d, 0x1c, 0x9e, 0x95, 0xed, 0x0a, 0xe1, 0xeb, ++ 0x33, 0x61, 0x97, 0xc1, 0x1f, 0xc5, 0x9b, 0x25, 0xde, 0xab, 0x98, 0x67, ++ 0x1a, 0x9e, 0x37, 0xa8, 0x7a, 0x08, 0xe4, 0x65, 0x4e, 0x90, 0x0e, 0x7a, ++ 0xf4, 0xfe, 0x56, 0xbf, 0x19, 0xed, 0xde, 0xe3, 0xac, 0x25, 0xd6, 0x06, ++ 0x74, 0xbf, 0x78, 0xdd, 0xd6, 0x99, 0x57, 0x60, 0xbb, 0xf5, 0xef, 0x93, ++ 0x7f, 0x51, 0xea, 0x0c, 0x0c, 0x32, 0xc4, 0x83, 0x7f, 0xe7, 0xeb, 0x58, ++ 0x53, 0x9c, 0xd5, 0xdb, 0x4e, 0x08, 0xb7, 0x0f, 0x7e, 0x2c, 0xf8, 0xe0, ++ 0xec, 0x8d, 0x79, 0xa2, 0x1d, 0xc0, 0xa3, 0x62, 0xa3, 0xaa, 0x45, 0x8d, ++ 0xd0, 0xd5, 0xa3, 0xf6, 0xd2, 0x3e, 0x98, 0xef, 0xf3, 0x99, 0x31, 0x9e, ++ 0x39, 0x5f, 0xc4, 0x09, 0xcf, 0x37, 0xcf, 0x1a, 0xac, 0x37, 0xea, 0x42, ++ 0xe6, 0x1b, 0xd9, 0x9e, 0xf9, 0xdf, 0xce, 0xfb, 0x85, 0x24, 0xe1, 0x3f, ++ 0xf5, 0xb2, 0x87, 0x06, 0x45, 0xf4, 0xa3, 0x7a, 0xec, 0xa0, 0xf3, 0xe8, ++ 0xdf, 0x8f, 0x4c, 0x81, 0x2c, 0xd4, 0xbf, 0xdd, 0x59, 0x46, 0xd2, 0x3f, ++ 0x5f, 0x1b, 0xdd, 0x7f, 0x2d, 0x48, 0x44, 0x7d, 0x3c, 0x88, 0xfc, 0x82, ++ 0xbe, 0xe4, 0x6b, 0xa5, 0xd0, 0xc3, 0x15, 0xa8, 0x97, 0x21, 0x3d, 0xbc, ++ 0x6e, 0x5b, 0x2c, 0xfa, 0xed, 0x9f, 0x3d, 0xb4, 0x8d, 0xf6, 0xff, 0xcc, ++ 0xcf, 0x57, 0xc4, 0xa2, 0x5d, 0x7c, 0x78, 0xdd, 0xdc, 0x07, 0x7c, 0xc0, ++ 0x52, 0x87, 0xb7, 0xcc, 0x25, 0x3d, 0x5c, 0xf5, 0x98, 0xd4, 0xc3, 0x5e, ++ 0x73, 0xa8, 0x7e, 0x2f, 0x5a, 0x57, 0xf6, 0xeb, 0x9f, 0x23, 0x7d, 0x6e, ++ 0x8e, 0x72, 0x5b, 0xa0, 0xb8, 0x72, 0x97, 0x57, 0xd8, 0xdd, 0x20, 0xef, ++ 0x50, 0x0e, 0xae, 0xe3, 0xf2, 0x8e, 0x3d, 0xc4, 0xe5, 0x61, 0x15, 0xea, ++ 0xab, 0x61, 0xa4, 0xaf, 0x86, 0x60, 0xbd, 0xbb, 0x2a, 0xbd, 0x43, 0x90, ++ 0xce, 0x43, 0xbe, 0x93, 0x1e, 0xbb, 0x6b, 0xae, 0x77, 0x2c, 0xb5, 0x67, ++ 0x8e, 0x00, 0xfa, 0x5d, 0x20, 0x39, 0x03, 0xa8, 0xaf, 0xa4, 0x3e, 0x95, ++ 0x7a, 0xd6, 0x68, 0xf0, 0x7e, 0x94, 0x84, 0xfc, 0xa3, 0xbe, 0xfd, 0xe7, ++ 0x9f, 0xc2, 0xfa, 0xbf, 0x78, 0x49, 0x25, 0xf7, 0xae, 0x5a, 0xdd, 0x90, ++ 0xed, 0xc0, 0xfd, 0x82, 0x3e, 0xe4, 0xf6, 0xbf, 0x0f, 0x6f, 0x43, 0x0f, ++ 0xbc, 0x73, 0x2e, 0x00, 0xde, 0xe5, 0x08, 0x6f, 0xb2, 0x7f, 0x38, 0xbc, ++ 0x3f, 0x6d, 0xe2, 0x70, 0x3e, 0xd8, 0xcc, 0xe1, 0xbe, 0x7a, 0xcb, 0x80, ++ 0x58, 0xf4, 0x6f, 0x3f, 0x6d, 0x1a, 0x40, 0x76, 0xcf, 0xa7, 0x5b, 0x06, ++ 0x11, 0xbc, 0xe7, 0xad, 0x01, 0x78, 0x93, 0xdd, 0xeb, 0xd2, 0xdb, 0x3d, ++ 0x4d, 0x00, 0x6f, 0xb4, 0xf3, 0x11, 0xde, 0x30, 0x6e, 0xf9, 0x2e, 0x97, ++ 0x80, 0xb7, 0x9b, 0xc3, 0xbb, 0x49, 0xe8, 0x9d, 0x66, 0x9e, 0xce, 0xeb, ++ 0x05, 0x57, 0x1f, 0x9d, 0x1b, 0xbd, 0xeb, 0x69, 0x8b, 0x1b, 0xf5, 0xf9, ++ 0x91, 0xa8, 0x40, 0x12, 0xfa, 0x23, 0x47, 0xb6, 0xaa, 0x0c, 0xf7, 0xe5, ++ 0x7b, 0xec, 0x22, 0x61, 0xbf, 0x48, 0x38, 0x7f, 0xc3, 0x5a, 0x9e, 0x44, ++ 0x3b, 0xaa, 0x97, 0x3d, 0xb3, 0xd6, 0xc2, 0x1c, 0xd0, 0xdf, 0x82, 0x97, ++ 0xed, 0x7e, 0x06, 0xf9, 0x63, 0x4a, 0x41, 0x0a, 0x22, 0xe0, 0x44, 0xcb, ++ 0x1f, 0x62, 0x71, 0xbc, 0xe0, 0xf8, 0x3d, 0x76, 0x8c, 0x23, 0x79, 0x4c, ++ 0x88, 0x1d, 0x73, 0x81, 0xf8, 0x59, 0xc2, 0x3c, 0x74, 0x7e, 0x7d, 0x49, ++ 0xfb, 0x1f, 0xf6, 0xa1, 0x1d, 0xaf, 0x68, 0xdc, 0xaf, 0x5f, 0x62, 0xb5, ++ 0x05, 0x90, 0x6f, 0xc1, 0xdf, 0x39, 0x11, 0x2a, 0xcf, 0x15, 0x17, 0xca, ++ 0x34, 0x8c, 0x93, 0xb8, 0xad, 0x56, 0xa4, 0x83, 0x4c, 0xe6, 0xd2, 0xef, ++ 0x1b, 0x79, 0x19, 0xee, 0x1b, 0x7d, 0x3b, 0xe8, 0xab, 0xdb, 0x96, 0x11, ++ 0x3f, 0x77, 0x0f, 0x0e, 0xdd, 0xd7, 0xa9, 0x89, 0x0e, 0x98, 0x30, 0xbe, ++ 0xd4, 0xbd, 0x55, 0x21, 0x7c, 0x57, 0x2f, 0x2f, 0x88, 0x2d, 0x60, 0xb8, ++ 0x2f, 0x55, 0x4b, 0xf3, 0x18, 0x9e, 0xcc, 0xf5, 0xb1, 0xa2, 0x69, 0x14, ++ 0x37, 0xb4, 0x00, 0xdd, 0x44, 0xc3, 0x78, 0xee, 0x64, 0x17, 0xff, 0xee, ++ 0x72, 0xf0, 0x38, 0xe2, 0x7a, 0x18, 0xd7, 0x1e, 0x9c, 0x6f, 0xf8, 0xf7, ++ 0x69, 0x48, 0x7a, 0xa8, 0xcf, 0x6d, 0x06, 0xd2, 0xe7, 0xe1, 0xeb, 0xbf, ++ 0x2d, 0x99, 0xfb, 0x2b, 0xd5, 0xaa, 0x81, 0xfc, 0x8e, 0xc5, 0x66, 0xee, ++ 0x7f, 0xc8, 0xf3, 0x0f, 0x57, 0x8a, 0xf2, 0x2b, 0x93, 0x79, 0xbc, 0xb7, ++ 0x28, 0x99, 0xef, 0x17, 0x9c, 0x8c, 0x62, 0xa4, 0x37, 0x4e, 0xae, 0x8d, ++ 0xf1, 0xd7, 0xd3, 0xfa, 0x26, 0x52, 0x3c, 0xb3, 0x27, 0x7e, 0x22, 0xe1, ++ 0xe6, 0x30, 0x7e, 0xd9, 0x23, 0xaf, 0x90, 0xaf, 0x44, 0xfc, 0x60, 0x3f, ++ 0xb6, 0x81, 0x79, 0xce, 0xb3, 0x88, 0x78, 0x2e, 0xa8, 0x58, 0x6c, 0x7f, ++ 0xab, 0x68, 0x7f, 0x6b, 0xcb, 0x3b, 0xb4, 0x2f, 0x07, 0x9e, 0xcb, 0x13, ++ 0xa8, 0x77, 0xe7, 0xac, 0xb0, 0xb8, 0xd1, 0x7e, 0xf5, 0xbd, 0x66, 0x21, ++ 0xba, 0xbb, 0x27, 0x9a, 0xef, 0xa3, 0xb0, 0xc4, 0x38, 0x23, 0xf2, 0xd1, ++ 0x2d, 0x42, 0xce, 0xde, 0xda, 0x72, 0x9f, 0x07, 0xcf, 0x3d, 0xcc, 0x69, ++ 0x89, 0xd1, 0x30, 0x85, 0x71, 0x7c, 0x4c, 0xc4, 0x4f, 0x73, 0x71, 0x1f, ++ 0x36, 0xdd, 0x4c, 0xf1, 0xd3, 0x52, 0x6b, 0xd7, 0xf3, 0xe8, 0x66, 0xdf, ++ 0x9e, 0x7a, 0xf0, 0x4e, 0x2b, 0x2c, 0xad, 0xde, 0xc0, 0xed, 0x96, 0x7a, ++ 0x27, 0xa3, 0xf3, 0x23, 0x97, 0x83, 0xd9, 0x8e, 0xf1, 0x58, 0x28, 0xda, ++ 0x7e, 0x36, 0xe1, 0x5c, 0xf4, 0xa3, 0x8f, 0x0f, 0x2f, 0xc6, 0x38, 0xed, ++ 0x78, 0xc6, 0x09, 0x6b, 0x1c, 0xc1, 0x55, 0x97, 0x5f, 0x6c, 0xe6, 0xe5, ++ 0xcb, 0x93, 0x47, 0x4d, 0x79, 0x28, 0x93, 0xb1, 0x3f, 0x31, 0xd7, 0x70, ++ 0xc4, 0xf7, 0x62, 0x84, 0x0d, 0xd2, 0x43, 0x59, 0x1c, 0xc5, 0x01, 0xae, ++ 0xc7, 0x78, 0xb1, 0x13, 0x53, 0x23, 0xd1, 0xd9, 0x0c, 0x23, 0xf3, 0x19, ++ 0x78, 0xda, 0x84, 0xa1, 0x35, 0x19, 0x3f, 0x9e, 0x26, 0xd6, 0x7d, 0xd3, ++ 0x38, 0x16, 0x88, 0x83, 0xf5, 0x06, 0xf6, 0xea, 0xe3, 0xd7, 0xb3, 0x02, ++ 0x86, 0xc0, 0x10, 0xc0, 0xc3, 0xf5, 0xc6, 0x40, 0x07, 0xd2, 0xb5, 0xc1, ++ 0xea, 0x32, 0xa1, 0x3f, 0xe0, 0x29, 0x56, 0x46, 0xa1, 0x9f, 0xbc, 0x78, ++ 0xe5, 0x85, 0xcd, 0xf7, 0x9e, 0xe4, 0x2b, 0x69, 0xbe, 0x8b, 0x0d, 0x06, ++ 0x3e, 0xcf, 0x9f, 0x2a, 0xfe, 0xa7, 0x00, 0x4e, 0xb7, 0x02, 0x93, 0x23, ++ 0x7d, 0xde, 0x66, 0x64, 0xbb, 0xd4, 0x51, 0x1c, 0x7f, 0x48, 0x7f, 0x35, ++ 0x4e, 0x97, 0x8f, 0xea, 0x2d, 0xe5, 0xf4, 0x2d, 0xe3, 0xe6, 0x12, 0x4f, ++ 0x23, 0xa1, 0xfb, 0x50, 0xf8, 0xde, 0x2a, 0xe6, 0x07, 0xfd, 0x34, 0xc5, ++ 0x62, 0x7b, 0x73, 0xe4, 0xf8, 0xd1, 0x83, 0xc9, 0xd2, 0x0f, 0xe6, 0xf6, ++ 0xe6, 0x22, 0xc1, 0xaf, 0x8b, 0x24, 0xbd, 0x6d, 0xd1, 0xf3, 0xe9, 0x36, ++ 0xe4, 0x17, 0x3c, 0x9f, 0x83, 0x76, 0x2d, 0xc0, 0xed, 0x56, 0x91, 0xf6, ++ 0x45, 0xef, 0xad, 0x82, 0xde, 0x5b, 0x05, 0xbd, 0x3f, 0x29, 0xf2, 0x17, ++ 0x3a, 0x5e, 0xb5, 0x85, 0x05, 0x68, 0xdd, 0xaf, 0x59, 0x08, 0x8f, 0x72, ++ 0xdc, 0xeb, 0x45, 0xfa, 0x42, 0x32, 0xb7, 0x9b, 0xe5, 0x3c, 0x24, 0x3d, ++ 0x33, 0x11, 0x87, 0x32, 0x80, 0xe4, 0x40, 0x3a, 0x3a, 0xd4, 0xd2, 0x40, ++ 0x76, 0xd3, 0xfc, 0xb0, 0x38, 0x30, 0x0b, 0x8d, 0x57, 0xa9, 0x91, 0xf2, ++ 0x3d, 0xf2, 0xc7, 0x70, 0x16, 0x53, 0x73, 0xf7, 0x3c, 0x9c, 0x8f, 0x72, ++ 0x55, 0x94, 0x1b, 0xe9, 0xfa, 0x56, 0x73, 0xeb, 0xa0, 0x5a, 0x5b, 0xef, ++ 0x7a, 0x72, 0x1f, 0xb7, 0x94, 0x75, 0x9a, 0xf8, 0xbd, 0x1b, 0x11, 0xcf, ++ 0x12, 0xfa, 0x6a, 0x92, 0x6a, 0xa3, 0x73, 0x41, 0xa5, 0x4a, 0xb4, 0x1b, ++ 0xed, 0xdf, 0x93, 0x05, 0x76, 0x9f, 0x21, 0x0e, 0xe3, 0x2d, 0x26, 0x42, ++ 0x6d, 0x29, 0xd0, 0x03, 0xca, 0xe7, 0x8f, 0xa2, 0xf8, 0xbe, 0xfd, 0x9c, ++ 0xb8, 0xbb, 0xa6, 0xa1, 0x5d, 0x58, 0x1a, 0x6b, 0x36, 0x62, 0x7a, 0x3b, ++ 0xeb, 0xb4, 0xe7, 0xe4, 0x04, 0xed, 0x92, 0xd5, 0x05, 0x2a, 0xee, 0xc1, ++ 0xc1, 0xc0, 0xd5, 0x53, 0x34, 0xc8, 0x37, 0xa0, 0x3c, 0xe1, 0xf9, 0xfb, ++ 0xb4, 0x4c, 0x8a, 0x0e, 0x89, 0xfc, 0xb2, 0x3f, 0x62, 0xf9, 0x8d, 0xdf, ++ 0x01, 0xfe, 0x29, 0x7f, 0xc7, 0x14, 0x0d, 0xe4, 0xc5, 0xc9, 0x37, 0x45, ++ 0x39, 0x5b, 0x4e, 0xed, 0x4f, 0xae, 0x12, 0x74, 0xec, 0x5b, 0x31, 0x05, ++ 0xf7, 0x39, 0x4e, 0xfe, 0x4a, 0x96, 0xff, 0x9c, 0x97, 0xdf, 0x2b, 0xcb, ++ 0xeb, 0x79, 0xf9, 0xfd, 0xb2, 0x7f, 0x91, 0x5f, 0x1b, 0x56, 0x5e, 0x1f, ++ 0x56, 0xfe, 0x28, 0xcf, 0x77, 0x3d, 0x5c, 0x3f, 0xc5, 0x87, 0x70, 0x12, ++ 0xfb, 0x31, 0xa5, 0xe3, 0x15, 0x92, 0x27, 0x2e, 0x41, 0x67, 0xa5, 0x2b, ++ 0x03, 0x04, 0xdf, 0x52, 0xc3, 0x0e, 0x9e, 0x16, 0xb2, 0x80, 0x21, 0xf7, ++ 0xfc, 0xf5, 0x6c, 0x29, 0x1e, 0x57, 0x32, 0xed, 0x0b, 0x1e, 0xb2, 0xa3, ++ 0xde, 0x4e, 0x48, 0xd3, 0x5c, 0xc9, 0x50, 0xcf, 0x96, 0xe4, 0x3d, 0x8e, ++ 0xdf, 0x17, 0x4e, 0x57, 0x7c, 0x66, 0x94, 0x93, 0x1f, 0xfa, 0x07, 0x0b, ++ 0xb9, 0x1e, 0xf1, 0x5c, 0xad, 0x4b, 0xd0, 0x6d, 0x54, 0x2a, 0xef, 0x4f, ++ 0xc2, 0x1b, 0xfa, 0xf9, 0x1a, 0xfb, 0xbb, 0xd8, 0x7e, 0xd6, 0xe1, 0xbc, ++ 0x92, 0x74, 0xfd, 0x7c, 0xff, 0xef, 0xf4, 0x33, 0x2f, 0xb5, 0x57, 0x3f, ++ 0xe6, 0x94, 0x7f, 0xa3, 0x9f, 0xbd, 0x61, 0xeb, 0x92, 0x76, 0x51, 0x59, ++ 0xba, 0x96, 0x83, 0xfd, 0xb1, 0x43, 0x89, 0xba, 0xf3, 0x65, 0x8b, 0xfe, ++ 0xd3, 0x1d, 0x87, 0x76, 0x15, 0xc3, 0xf3, 0x65, 0x00, 0xfa, 0x45, 0x2b, ++ 0x5b, 0xb3, 0x47, 0x43, 0xff, 0x8b, 0x5e, 0x78, 0x35, 0xbb, 0x32, 0xc4, ++ 0xef, 0x5e, 0x72, 0xc6, 0xc0, 0x34, 0xb0, 0x9f, 0x6a, 0xce, 0x30, 0x4a, ++ 0x8f, 0x77, 0xfc, 0xcd, 0xec, 0x82, 0xf9, 0x2c, 0xd9, 0xde, 0x61, 0x9e, ++ 0x0c, 0xf5, 0x6a, 0x20, 0x2d, 0x0a, 0x99, 0xd7, 0x62, 0x79, 0x4e, 0x92, ++ 0x75, 0x19, 0x67, 0x84, 0xe8, 0xf5, 0xc1, 0x29, 0x06, 0x21, 0x9f, 0xd6, ++ 0xd2, 0x7c, 0x17, 0xbd, 0x70, 0xd4, 0x88, 0xf8, 0x5c, 0x64, 0x68, 0x3d, ++ 0xfc, 0x18, 0xc6, 0x7b, 0xc6, 0x2b, 0x11, 0xf7, 0x5d, 0x63, 0x45, 0xbb, ++ 0xfd, 0x7d, 0xdc, 0xe7, 0x1a, 0x96, 0xc2, 0xe5, 0x9e, 0x27, 0x53, 0xbb, ++ 0x2c, 0x05, 0xcf, 0x45, 0xa0, 0xcc, 0x40, 0x7d, 0xdc, 0x10, 0x79, 0x9f, ++ 0xfe, 0x4e, 0xd1, 0x5f, 0x69, 0x34, 0x97, 0x6f, 0x73, 0xf3, 0xec, 0x56, ++ 0x17, 0xc0, 0x79, 0xcc, 0x87, 0x7c, 0x9f, 0xb9, 0x72, 0x7d, 0xce, 0x28, ++ 0x8c, 0xe3, 0x5e, 0x9e, 0x54, 0x38, 0x06, 0xfb, 0xeb, 0x3b, 0x2e, 0xda, ++ 0xcd, 0xe3, 0xa2, 0xed, 0x3c, 0x2e, 0x5a, 0xea, 0xec, 0x5c, 0x0e, 0xc2, ++ 0x9b, 0xd5, 0xa6, 0x6c, 0xb8, 0xcf, 0x7a, 0x25, 0x63, 0x53, 0x1e, 0x91, ++ 0x7c, 0x06, 0x2c, 0x0b, 0x6d, 0x8b, 0x2d, 0x32, 0xdf, 0x36, 0x65, 0x62, ++ 0x3e, 0xc5, 0xb9, 0x28, 0x7f, 0xc3, 0x23, 0x5b, 0xef, 0x43, 0xbe, 0xd9, ++ 0x13, 0xcd, 0xcf, 0x4d, 0xcc, 0x19, 0x3b, 0x3c, 0x1a, 0xe5, 0x42, 0x57, ++ 0x4e, 0x8c, 0xc1, 0x01, 0xf2, 0x62, 0x5c, 0x62, 0x59, 0x2d, 0xe2, 0x6f, ++ 0xce, 0xd8, 0x2b, 0x27, 0xe3, 0xf7, 0x02, 0x8b, 0x7d, 0x70, 0x19, 0x8f, ++ 0xab, 0x13, 0x5d, 0x8c, 0x4b, 0xf4, 0x4c, 0xc1, 0x72, 0xac, 0x8f, 0x71, ++ 0x0d, 0xaf, 0x99, 0xc7, 0xb9, 0xbc, 0x6f, 0xa9, 0x14, 0xe7, 0xf2, 0x8e, ++ 0x88, 0xf1, 0x46, 0xda, 0x47, 0xbe, 0x56, 0xc0, 0xa1, 0x36, 0x85, 0x9f, ++ 0x73, 0xdd, 0x03, 0x68, 0x46, 0xbb, 0x43, 0xce, 0x43, 0x8e, 0x0f, 0x86, ++ 0xca, 0xf2, 0x4e, 0xe8, 0xef, 0xd0, 0xca, 0xb4, 0x91, 0x6b, 0x5c, 0xb8, ++ 0xdf, 0x51, 0x50, 0x43, 0xf4, 0x24, 0xc6, 0xff, 0x65, 0xa2, 0xb7, 0x34, ++ 0x74, 0x7c, 0x58, 0xee, 0x08, 0xfc, 0x7e, 0xa1, 0xf3, 0xb8, 0x39, 0x85, ++ 0xd3, 0x6f, 0x0d, 0xe2, 0x0d, 0xf1, 0x98, 0xaf, 0x32, 0x2d, 0xc4, 0x5f, ++ 0x9c, 0x31, 0x31, 0x46, 0x97, 0xbf, 0x71, 0x6a, 0x02, 0xd3, 0x42, 0xe3, ++ 0xad, 0x37, 0x66, 0xe8, 0xf2, 0xb3, 0x4b, 0x07, 0xe8, 0xea, 0xdf, 0x32, ++ 0xef, 0x32, 0x5d, 0x79, 0x89, 0xa5, 0x33, 0xb7, 0xf6, 0x22, 0xec, 0xdf, ++ 0x1a, 0xbb, 0x3d, 0x1a, 0xed, 0xb0, 0x8f, 0xdb, 0xbf, 0xf9, 0xcb, 0xad, ++ 0x68, 0xd7, 0x6d, 0x54, 0xdd, 0x0a, 0xac, 0x67, 0xc1, 0x6b, 0x9b, 0xfe, ++ 0x32, 0x01, 0x6a, 0x9d, 0xc2, 0xe3, 0x97, 0xfc, 0xfe, 0x14, 0xc5, 0xbd, ++ 0x8e, 0xe1, 0x79, 0x36, 0xe4, 0x3d, 0xa3, 0x66, 0x0c, 0xdd, 0xaf, 0xf9, ++ 0x82, 0x75, 0xd2, 0xb9, 0xc0, 0x90, 0xfd, 0x00, 0xdd, 0xbe, 0xcb, 0x22, ++ 0xc7, 0x2e, 0x3a, 0xaf, 0xfa, 0x63, 0xed, 0xd7, 0x3c, 0x90, 0x22, 0xfc, ++ 0xdf, 0x51, 0x6c, 0x14, 0xea, 0xbf, 0x53, 0xb5, 0x7f, 0xa6, 0x38, 0xdb, ++ 0x12, 0x1b, 0x5f, 0xcf, 0x17, 0xaf, 0x1e, 0x30, 0xe3, 0x39, 0x06, 0x3c, ++ 0x17, 0x70, 0x16, 0xe8, 0xfb, 0x1a, 0x6c, 0xa8, 0x22, 0x9f, 0xfb, 0x28, ++ 0x0e, 0x5d, 0xd4, 0x76, 0xc0, 0x8c, 0xfe, 0x91, 0x3b, 0x85, 0xcb, 0xe5, ++ 0x25, 0x99, 0x4b, 0x8d, 0x60, 0x91, 0xb1, 0x1a, 0x48, 0x51, 0x6f, 0x4c, ++ 0x06, 0xf9, 0x14, 0x07, 0xf4, 0xd1, 0xd9, 0xc1, 0x86, 0x6f, 0xc7, 0x73, ++ 0x13, 0x39, 0x76, 0x3a, 0x07, 0x5e, 0x7d, 0x66, 0x06, 0x08, 0x69, 0xa4, ++ 0x23, 0xdf, 0xb0, 0xa5, 0x50, 0x6f, 0x51, 0x53, 0x31, 0xe5, 0x97, 0x9c, ++ 0x89, 0xa6, 0x7e, 0xdf, 0x53, 0x3b, 0x27, 0xd3, 0x79, 0xe4, 0x57, 0x14, ++ 0xda, 0x2f, 0x28, 0xc9, 0x98, 0xb3, 0x12, 0xed, 0x51, 0xac, 0x7f, 0x07, ++ 0x8c, 0x57, 0xf2, 0xe2, 0x35, 0xc5, 0x08, 0x9f, 0x25, 0xdb, 0xf9, 0xbd, ++ 0xa7, 0x12, 0xf5, 0x4f, 0xb9, 0xd8, 0xcf, 0xe2, 0x96, 0x62, 0x6a, 0x5f, ++ 0xa2, 0xb2, 0x3d, 0x0a, 0xd8, 0x07, 0x53, 0x8a, 0xb8, 0x9e, 0x2d, 0x41, ++ 0xdd, 0x0e, 0x79, 0x35, 0xcf, 0xbe, 0x06, 0xf5, 0xab, 0x6a, 0x0e, 0x0c, ++ 0x7e, 0x1c, 0xe5, 0x89, 0xd9, 0x4e, 0xf2, 0x24, 0xee, 0xcc, 0x2d, 0x34, ++ 0x7e, 0xcd, 0x19, 0x2b, 0xb5, 0xff, 0xad, 0x90, 0x17, 0xa6, 0x2e, 0x3e, ++ 0xaf, 0x49, 0x67, 0x3c, 0xf4, 0x5d, 0xe2, 0xbd, 0x3d, 0x85, 0xef, 0x03, ++ 0xca, 0xbc, 0x29, 0x69, 0xa3, 0x11, 0xef, 0x15, 0x98, 0xba, 0x18, 0xd5, ++ 0xbf, 0xee, 0xcc, 0xa5, 0x94, 0xca, 0x75, 0xbe, 0x35, 0xf4, 0xe9, 0x44, ++ 0x94, 0x63, 0xa6, 0xa4, 0xaf, 0x27, 0x67, 0x00, 0x7d, 0xbc, 0x95, 0xa8, ++ 0x38, 0xc8, 0xdc, 0x08, 0x93, 0xb7, 0xa7, 0x6b, 0xc7, 0xc6, 0xb1, 0x08, ++ 0xf2, 0xa8, 0x67, 0x9c, 0x33, 0xfc, 0xfc, 0xae, 0xe5, 0x0c, 0x3f, 0xcf, ++ 0xdb, 0x9e, 0xa6, 0xfd, 0x09, 0xf9, 0x6a, 0xda, 0xdd, 0x5d, 0x46, 0xdc, ++ 0xbf, 0x61, 0x36, 0xab, 0x03, 0xe1, 0x35, 0x6d, 0xdc, 0x48, 0x57, 0x65, ++ 0x08, 0x1f, 0xa9, 0x3b, 0x6e, 0x36, 0x23, 0x5e, 0x4c, 0x0f, 0xbd, 0x6f, ++ 0x46, 0x7d, 0x6c, 0x81, 0xb4, 0x28, 0xa4, 0xbc, 0x5a, 0x9e, 0x3b, 0x0f, ++ 0x93, 0xc7, 0xfb, 0x04, 0xdf, 0xc9, 0x7b, 0x07, 0x52, 0xbf, 0x30, 0xdf, ++ 0x6c, 0xb2, 0x47, 0x6f, 0x13, 0xfe, 0xb7, 0xe4, 0x93, 0x37, 0x45, 0x7d, ++ 0xd9, 0xbe, 0x13, 0x69, 0x1c, 0xf1, 0xf8, 0xb2, 0x85, 0xfc, 0xa7, 0x3f, ++ 0xa7, 0x79, 0x8f, 0xa3, 0xbc, 0xec, 0x2c, 0x60, 0xb3, 0x5f, 0x22, 0xf9, ++ 0xd8, 0x99, 0x8d, 0xfb, 0x26, 0x3f, 0xd6, 0xfc, 0x01, 0xcf, 0x56, 0x85, ++ 0xec, 0xfb, 0x2e, 0x3a, 0xcf, 0x3e, 0x6d, 0x9c, 0xcb, 0x80, 0xfb, 0x01, ++ 0xdd, 0x3d, 0xeb, 0xe0, 0xfc, 0x7a, 0xbe, 0x75, 0x7c, 0x2c, 0xea, 0xbf, ++ 0xa7, 0xb2, 0x15, 0xd8, 0xef, 0x7b, 0x57, 0x5f, 0xdd, 0xa9, 0x41, 0x7f, ++ 0x1d, 0x3f, 0x1b, 0x3d, 0x1a, 0xe5, 0xbe, 0x1c, 0x57, 0x49, 0xe5, 0xf7, ++ 0x70, 0x98, 0xa3, 0xfb, 0x3b, 0xf4, 0xe7, 0x6a, 0x5e, 0x8f, 0x71, 0x21, ++ 0x5f, 0x97, 0xa0, 0x73, 0x94, 0x1b, 0xb4, 0x63, 0xe1, 0x3b, 0xc3, 0xf8, ++ 0x5f, 0xcd, 0xeb, 0x96, 0xa7, 0x14, 0x28, 0xaf, 0x89, 0x05, 0x7f, 0x16, ++ 0xc6, 0x2f, 0x7a, 0x23, 0x2a, 0x80, 0x74, 0xdc, 0xf1, 0x46, 0x94, 0x11, ++ 0xf5, 0x43, 0x7d, 0xa6, 0x57, 0x49, 0x1d, 0x83, 0xdf, 0x87, 0x4c, 0x44, ++ 0xff, 0x4d, 0x6b, 0xb7, 0x18, 0x19, 0xd9, 0x37, 0x9a, 0x01, 0xbf, 0xf7, ++ 0x35, 0xdf, 0xf3, 0xc9, 0xa7, 0x70, 0x3a, 0x93, 0x7c, 0xe9, 0x6d, 0xe2, ++ 0xfc, 0x52, 0x26, 0xe8, 0xb4, 0x5c, 0xf0, 0x9f, 0x57, 0xf0, 0xd1, 0xe9, ++ 0xda, 0x14, 0xe2, 0xc3, 0xd3, 0x77, 0xc3, 0xa4, 0x71, 0x9f, 0xf3, 0x6e, ++ 0x65, 0xf8, 0x76, 0xb4, 0x07, 0x5c, 0x76, 0xf7, 0x20, 0x57, 0x90, 0x2f, ++ 0x4b, 0xd0, 0xef, 0x81, 0xef, 0x25, 0x97, 0xc5, 0x93, 0xff, 0x17, 0xc2, ++ 0x77, 0xc4, 0x87, 0x8b, 0xcf, 0x38, 0xa8, 0xbf, 0xea, 0x33, 0x2e, 0xc1, ++ 0xe7, 0x4e, 0xca, 0x4b, 0x7e, 0x2b, 0x17, 0xfc, 0x62, 0x11, 0x76, 0xc4, ++ 0x3c, 0x41, 0xdf, 0x49, 0xe9, 0xde, 0x91, 0xa9, 0x30, 0xff, 0x92, 0x06, ++ 0xe0, 0x77, 0x18, 0xc7, 0xbb, 0x32, 0x2d, 0x17, 0xf9, 0x28, 0x48, 0x2f, ++ 0x66, 0x07, 0xd2, 0x15, 0xd0, 0x4b, 0x6a, 0x65, 0x08, 0xdf, 0x34, 0x74, ++ 0xdc, 0xcc, 0xd0, 0xfe, 0xb0, 0x24, 0x7a, 0x88, 0x5e, 0xe6, 0x41, 0x1a, ++ 0x6a, 0x7f, 0x54, 0xf4, 0xd8, 0x1f, 0x8e, 0xc9, 0xc9, 0x30, 0xef, 0x69, ++ 0x8d, 0x39, 0xba, 0x7b, 0x16, 0x79, 0xa9, 0x17, 0x47, 0xf7, 0x03, 0x52, ++ 0xc5, 0xbe, 0xbc, 0x2d, 0x30, 0x08, 0xed, 0x55, 0x53, 0x6d, 0x94, 0x1b, ++ 0xef, 0x83, 0x9d, 0x4a, 0xe4, 0xfb, 0x33, 0xcb, 0xee, 0xe5, 0xf0, 0x5b, ++ 0x66, 0xf2, 0x14, 0xa1, 0xfd, 0xb0, 0xec, 0x51, 0xc5, 0x0d, 0x98, 0x21, ++ 0xbb, 0x02, 0xe5, 0x51, 0xde, 0xbe, 0x5a, 0x73, 0x68, 0xbc, 0xf1, 0xe6, ++ 0x33, 0x23, 0x98, 0x0b, 0xe0, 0x70, 0xc3, 0x99, 0x81, 0x94, 0x5e, 0x9e, ++ 0xe4, 0x9d, 0x88, 0xf8, 0x2f, 0x3b, 0x33, 0x53, 0xc0, 0x6b, 0xc4, 0xbf, ++ 0xb5, 0x0f, 0x38, 0x46, 0xe3, 0xf1, 0x25, 0x93, 0xdf, 0xe2, 0xde, 0x80, ++ 0xfb, 0x6c, 0x51, 0x5e, 0x15, 0xf1, 0x7b, 0x24, 0x8b, 0x39, 0x1e, 0x0c, ++ 0x89, 0x2f, 0x61, 0x3c, 0x0c, 0xe3, 0x62, 0x72, 0x7f, 0x50, 0xc6, 0x9b, ++ 0x2c, 0xb8, 0x9f, 0x1a, 0xa2, 0x27, 0xbf, 0x31, 0xb6, 0x64, 0xa3, 0xbf, ++ 0xd3, 0x2b, 0xee, 0x54, 0xa0, 0xdf, 0x47, 0x5b, 0xdc, 0xf1, 0xa7, 0x3c, ++ 0x03, 0x94, 0x1f, 0xcb, 0xd1, 0x28, 0xfe, 0x34, 0xc7, 0xe0, 0xbd, 0x0d, ++ 0xf1, 0xba, 0x70, 0x86, 0xff, 0x05, 0x13, 0xe4, 0x17, 0xdd, 0xbf, 0x2d, ++ 0x16, 0xe3, 0xdd, 0x12, 0x9e, 0xad, 0xc6, 0xc0, 0x20, 0xd4, 0x93, 0xad, ++ 0x00, 0x47, 0x8c, 0x83, 0xb5, 0x36, 0xab, 0xc5, 0x7e, 0x6e, 0xcf, 0xc4, ++ 0xf0, 0xfd, 0x2f, 0x4e, 0xd7, 0x92, 0x8e, 0xc3, 0xe9, 0x7b, 0xe1, 0x99, ++ 0xfe, 0x44, 0x4f, 0xa7, 0x6b, 0x2d, 0xa4, 0x77, 0x4e, 0x03, 0xbd, 0xb2, ++ 0x10, 0xbd, 0x23, 0xf5, 0x8d, 0x94, 0xef, 0x52, 0xef, 0x48, 0x7a, 0xae, ++ 0x36, 0x72, 0xb9, 0x55, 0x6d, 0x8b, 0xa3, 0x73, 0x15, 0x41, 0x7d, 0x33, ++ 0xdd, 0x83, 0x71, 0x5c, 0x36, 0x94, 0x9f, 0x7f, 0x0b, 0xea, 0x9b, 0xa7, ++ 0x1e, 0x18, 0x8f, 0xf4, 0x7f, 0x32, 0x91, 0xce, 0x35, 0x87, 0xd3, 0xff, ++ 0x2b, 0x75, 0xa9, 0x74, 0xce, 0x46, 0xea, 0x91, 0x70, 0x7d, 0x23, 0xe5, ++ 0xb9, 0x94, 0xef, 0x52, 0x5f, 0xdd, 0x95, 0xe6, 0x5d, 0x8b, 0x70, 0x2a, ++ 0x7c, 0xee, 0xbf, 0xb7, 0xfd, 0x1d, 0x3e, 0x5d, 0x67, 0xe4, 0x7a, 0xeb, ++ 0x3a, 0xa3, 0x9d, 0xe8, 0xe7, 0xc2, 0xe5, 0xe6, 0x01, 0x21, 0x37, 0x0f, ++ 0xe8, 0xe4, 0xe6, 0x92, 0x3e, 0xe4, 0xfe, 0xc3, 0x17, 0x49, 0xff, 0x8d, ++ 0xa2, 0x3e, 0xd8, 0xaf, 0x64, 0x17, 0xa2, 0x5c, 0x0f, 0xed, 0xef, 0xcf, ++ 0x69, 0x85, 0xbf, 0x41, 0xfa, 0x7d, 0x21, 0x95, 0xeb, 0xd5, 0x1f, 0x6b, ++ 0xde, 0x7d, 0xc9, 0xfb, 0x17, 0x52, 0xa5, 0x1f, 0x71, 0x61, 0xf2, 0xfe, ++ 0x71, 0x51, 0xff, 0x7c, 0xf2, 0xbe, 0x43, 0xc8, 0xfb, 0x70, 0xf9, 0xce, ++ 0xa0, 0x3f, 0x94, 0xef, 0x27, 0x5f, 0xbb, 0x84, 0xf6, 0xa7, 0xf7, 0x33, ++ 0xd0, 0x07, 0xa8, 0xf7, 0xda, 0x63, 0x5c, 0x9b, 0x84, 0xfc, 0x27, 0xfd, ++ 0x10, 0x1d, 0xe7, 0x3f, 0x97, 0xfc, 0xf7, 0x64, 0xce, 0xed, 0xe8, 0x43, ++ 0xfe, 0xef, 0xf8, 0xdf, 0xc8, 0x7f, 0x49, 0x8f, 0x92, 0x5f, 0x24, 0x7f, ++ 0x48, 0x7e, 0x08, 0xe7, 0x1f, 0xc9, 0x0f, 0x53, 0xee, 0x03, 0xff, 0x0f, ++ 0xf1, 0xf4, 0x1e, 0xbf, 0x5f, 0x54, 0x6d, 0xf4, 0x6d, 0xa1, 0xfd, 0x43, ++ 0x57, 0xcc, 0x48, 0xe4, 0xcb, 0x1e, 0xbb, 0x6d, 0xbb, 0x42, 0x7c, 0xd6, ++ 0x4b, 0x2f, 0x08, 0xbe, 0x09, 0xf2, 0x89, 0x5e, 0x4f, 0x48, 0xbe, 0x90, ++ 0x7c, 0x22, 0xf9, 0xa3, 0x5a, 0xf0, 0x43, 0x45, 0x18, 0x3f, 0xec, 0x54, ++ 0x5b, 0x1f, 0x1c, 0x0f, 0xed, 0x6e, 0x4e, 0xf3, 0x9e, 0x0e, 0xe5, 0x8b, ++ 0xc5, 0x2f, 0x85, 0xeb, 0x85, 0x3e, 0xe9, 0x0a, 0x23, 0x86, 0xac, 0x22, ++ 0xb1, 0x96, 0x21, 0x5d, 0x55, 0x43, 0x1a, 0x4a, 0x57, 0x96, 0x3e, 0xf8, ++ 0xe1, 0x4c, 0x0f, 0x3d, 0x5d, 0x18, 0x3f, 0x1c, 0xbe, 0x40, 0x7a, 0x8a, ++ 0x49, 0x33, 0x53, 0xbd, 0xff, 0x43, 0x7a, 0x8a, 0x49, 0x4b, 0x8a, 0x48, ++ 0x4f, 0xb6, 0xb4, 0x1f, 0xd1, 0x9e, 0x38, 0x5d, 0xfb, 0xd7, 0x5c, 0x17, ++ 0xcc, 0xe7, 0x74, 0x2e, 0xc8, 0xd9, 0x9c, 0x20, 0xbd, 0x4d, 0xf9, 0x23, ++ 0xe3, 0xf6, 0xc2, 0x00, 0x6e, 0xf7, 0xef, 0x89, 0xe6, 0xeb, 0xdc, 0x63, ++ 0xce, 0xa2, 0x78, 0xce, 0x94, 0xb3, 0xfc, 0x5c, 0xab, 0xa4, 0x4b, 0x89, ++ 0x67, 0x69, 0x07, 0x54, 0x88, 0x78, 0x42, 0x71, 0xba, 0xc7, 0x8d, 0xf3, ++ 0x95, 0xfe, 0xc2, 0x85, 0xe2, 0xd9, 0x92, 0xd8, 0x69, 0x46, 0x3f, 0xa4, ++ 0x02, 0xd2, 0x50, 0xfd, 0xdf, 0x97, 0xbd, 0x3b, 0x26, 0xed, 0xe2, 0xf0, ++ 0x3c, 0x20, 0xed, 0xc2, 0xec, 0xc4, 0xc9, 0x02, 0xcf, 0x3f, 0xa2, 0x9d, ++ 0x38, 0x3d, 0x12, 0x5e, 0x99, 0xc3, 0xa9, 0x8b, 0x43, 0x80, 0xfe, 0xbb, ++ 0x81, 0xec, 0xb7, 0x80, 0x91, 0x8e, 0xc8, 0xf4, 0xe9, 0x57, 0xac, 0xe3, ++ 0x70, 0x96, 0xf9, 0x55, 0x01, 0xa3, 0xd4, 0xb7, 0x09, 0xa8, 0x6f, 0x81, ++ 0x5e, 0x66, 0xe0, 0x78, 0xff, 0x2e, 0xbd, 0x94, 0x14, 0x31, 0x11, 0x0f, ++ 0x7c, 0x79, 0xaa, 0x96, 0x0f, 0x78, 0xff, 0x85, 0xc8, 0xb3, 0x57, 0xa7, ++ 0x22, 0x7e, 0x66, 0x8e, 0x93, 0xe5, 0xbf, 0x6d, 0xd6, 0x06, 0xa2, 0xdc, ++ 0x61, 0x32, 0x8e, 0x4e, 0x71, 0x91, 0xf7, 0x54, 0x91, 0xf7, 0xbd, 0xf2, ++ 0xf6, 0x44, 0xa8, 0x3f, 0xe5, 0x41, 0x16, 0x8c, 0xb3, 0x43, 0xf9, 0xa4, ++ 0xfc, 0xb8, 0x9e, 0x38, 0x8a, 0xc2, 0x82, 0xf5, 0x97, 0x3e, 0xba, 0xfd, ++ 0xed, 0x66, 0xc2, 0x33, 0x3f, 0xf7, 0xc2, 0xbc, 0x5d, 0x46, 0xbe, 0xcf, ++ 0x24, 0xf2, 0xb9, 0x90, 0xb7, 0x87, 0xe4, 0xc7, 0x85, 0xe5, 0xd7, 0xf3, ++ 0xfa, 0xb1, 0xc6, 0x2e, 0xc6, 0xcf, 0x29, 0xfa, 0x39, 0xbf, 0xaa, 0xb8, ++ 0xf5, 0xc6, 0xe9, 0xc7, 0x13, 0x62, 0x8f, 0x00, 0x26, 0x27, 0xe3, 0x79, ++ 0x82, 0x69, 0xdb, 0x15, 0x07, 0xc6, 0x41, 0x6e, 0xc9, 0x3f, 0x49, 0xfb, ++ 0xb1, 0xc1, 0xf5, 0xbf, 0x41, 0xeb, 0x5f, 0xd2, 0xae, 0x88, 0xfc, 0xce, ++ 0xb7, 0x71, 0xbd, 0xb7, 0x6c, 0xe7, 0xf9, 0x47, 0x1e, 0xfd, 0x43, 0xb3, ++ 0x6f, 0xa0, 0xe8, 0x2f, 0x99, 0xe2, 0x64, 0xf4, 0x67, 0x6a, 0x55, 0x34, ++ 0x3c, 0xff, 0xb0, 0x78, 0x9c, 0xe2, 0xef, 0x9f, 0xd3, 0x1b, 0xce, 0x8f, ++ 0xa4, 0xe9, 0xfd, 0x1b, 0xfc, 0x33, 0xea, 0xdb, 0x33, 0x3c, 0x7f, 0x77, ++ 0x31, 0xed, 0x11, 0xcf, 0xd4, 0xbe, 0x3f, 0xb5, 0x0f, 0x58, 0x2e, 0x62, ++ 0xfc, 0x59, 0xf9, 0x91, 0xef, 0x3d, 0xfc, 0x97, 0xac, 0x27, 0xe2, 0x09, ++ 0xd4, 0x3f, 0xc0, 0xf2, 0x86, 0xd6, 0xc8, 0xef, 0x97, 0xbc, 0x28, 0xf8, ++ 0xb1, 0x13, 0xf7, 0x4d, 0x08, 0x5e, 0x1f, 0x35, 0x23, 0xfc, 0x3a, 0xcd, ++ 0x12, 0x9e, 0xff, 0x68, 0xc6, 0x78, 0x37, 0xdd, 0x9f, 0x81, 0xfc, 0xab, ++ 0x8f, 0xfe, 0x63, 0xaa, 0x6f, 0x18, 0x9f, 0xbe, 0x16, 0xb6, 0xfe, 0x73, ++ 0xcd, 0xff, 0xf1, 0x08, 0xeb, 0x77, 0xe9, 0xdb, 0x07, 0xce, 0x05, 0xbf, ++ 0x0d, 0xbd, 0xda, 0x0b, 0xfa, 0x99, 0xaf, 0xa7, 0xa7, 0x38, 0xa3, 0x67, ++ 0xd7, 0x69, 0xe8, 0x27, 0x0e, 0xfc, 0x7f, 0xb4, 0x8b, 0x97, 0x78, 0xa2, ++ 0x9a, 0xd1, 0xfe, 0x0f, 0xd2, 0xc7, 0x61, 0xa2, 0x8f, 0x4e, 0x19, 0xcf, ++ 0xef, 0x45, 0xff, 0x9f, 0x4f, 0x9d, 0x68, 0x23, 0xfb, 0x47, 0xd4, 0x3f, ++ 0xda, 0x8c, 0x7a, 0xcc, 0x63, 0xe8, 0xa9, 0xcf, 0xf9, 0x41, 0xd2, 0x17, ++ 0x5e, 0x05, 0xc2, 0xb3, 0x73, 0x8c, 0xb7, 0xff, 0xe0, 0xd1, 0x23, 0xcd, ++ 0x08, 0x1f, 0xc0, 0x0f, 0x95, 0x53, 0xde, 0x78, 0x0e, 0x7e, 0x68, 0x0d, ++ 0xcb, 0xe7, 0x87, 0xf1, 0x8f, 0xa0, 0x7f, 0xe2, 0x5f, 0x94, 0xf3, 0x00, ++ 0x9f, 0x41, 0x11, 0xe4, 0xcc, 0x29, 0x01, 0x9f, 0x2f, 0xc4, 0xb9, 0xea, ++ 0xce, 0x42, 0x6e, 0x27, 0x76, 0xf6, 0xe7, 0xa9, 0x33, 0x9d, 0xdb, 0x85, ++ 0xff, 0x12, 0xf8, 0x36, 0xa4, 0xf3, 0xfa, 0x9d, 0xd1, 0x21, 0x70, 0x08, ++ 0xc1, 0x33, 0xfc, 0x05, 0xd0, 0x0f, 0x09, 0x59, 0x37, 0xc1, 0xe9, 0xe6, ++ 0x44, 0xb9, 0xee, 0xa8, 0x92, 0xa9, 0xb0, 0xae, 0x4e, 0x27, 0x2f, 0xb7, ++ 0xa5, 0x9b, 0xee, 0xf7, 0xe5, 0x07, 0xf3, 0xe1, 0xfd, 0xc5, 0xa6, 0x47, ++ 0x95, 0x20, 0x5c, 0x82, 0xfd, 0x5b, 0xde, 0x41, 0xb9, 0x74, 0xb3, 0x80, ++ 0x9b, 0x33, 0xdd, 0xfa, 0x8e, 0x8f, 0xcb, 0x43, 0x05, 0xf9, 0xb2, 0x9a, ++ 0x08, 0x04, 0xe8, 0x62, 0xbb, 0xe2, 0x53, 0xd1, 0x4f, 0x40, 0xba, 0x88, ++ 0xb0, 0xee, 0xbf, 0xf7, 0xa6, 0x2b, 0x5f, 0x58, 0x7b, 0xcd, 0x74, 0x8e, ++ 0xf6, 0x5d, 0xbd, 0xdb, 0x6b, 0x61, 0xed, 0x99, 0x29, 0xf7, 0x62, 0xda, ++ 0x0b, 0xbc, 0x4d, 0x0d, 0xc3, 0x6b, 0x71, 0x18, 0x5e, 0x27, 0x86, 0xe5, ++ 0x4b, 0x65, 0xde, 0xaf, 0x93, 0x7f, 0x52, 0x2e, 0x96, 0xb7, 0xad, 0x5d, ++ 0x95, 0x9c, 0x88, 0x71, 0x49, 0x85, 0xee, 0x8a, 0x06, 0xe9, 0x39, 0xa5, ++ 0x04, 0xe9, 0x79, 0x91, 0x43, 0xd2, 0x6f, 0x2a, 0xc1, 0x35, 0x48, 0xcf, ++ 0x69, 0xef, 0x20, 0xfd, 0xce, 0x68, 0x95, 0xf2, 0x30, 0xfd, 0x7e, 0x0d, ++ 0xf0, 0x36, 0x1d, 0xe5, 0xe1, 0xf8, 0x60, 0xfe, 0x06, 0x94, 0x17, 0x94, ++ 0xcf, 0x28, 0xd1, 0xe2, 0x42, 0xf5, 0x45, 0x26, 0x95, 0xcf, 0x6a, 0x92, ++ 0xf5, 0xb3, 0xee, 0x27, 0x79, 0xda, 0x28, 0xfb, 0xcb, 0xa6, 0xbc, 0xc4, ++ 0x23, 0xf3, 0xf5, 0x2b, 0x21, 0xbc, 0xe6, 0x0a, 0x7d, 0xe1, 0x73, 0xbd, ++ 0x83, 0xe5, 0x0b, 0xdb, 0x79, 0xfb, 0x49, 0x8f, 0xe5, 0xbc, 0x73, 0x4e, ++ 0x7e, 0x68, 0x09, 0x83, 0xcb, 0xfa, 0xb0, 0xbc, 0x2f, 0xac, 0xfe, 0x43, ++ 0xe7, 0xd1, 0x2f, 0x8d, 0x61, 0xed, 0xef, 0x0e, 0x2b, 0x6f, 0x0e, 0xcb, ++ 0xaf, 0x0b, 0xcb, 0x37, 0xe9, 0xdb, 0x97, 0xcd, 0x53, 0x88, 0x0f, 0xcb, ++ 0x80, 0x1e, 0x10, 0x11, 0xe7, 0xe3, 0xcb, 0x9b, 0xd2, 0x7b, 0xec, 0xd4, ++ 0x1e, 0x7d, 0xaa, 0xd8, 0xc8, 0x6e, 0xd3, 0xf1, 0xd5, 0x94, 0x06, 0x9e, ++ 0xbf, 0xfd, 0xb1, 0x11, 0x25, 0x4d, 0xb6, 0x90, 0x7c, 0xba, 0xbb, 0x24, ++ 0x94, 0x2f, 0xe4, 0xbd, 0x60, 0x4b, 0x22, 0x23, 0xbe, 0x30, 0xf5, 0x21, ++ 0x2f, 0x4b, 0xd2, 0xf5, 0xfe, 0x59, 0xcf, 0x7a, 0x86, 0x86, 0xeb, 0x5b, ++ 0x5e, 0xfe, 0x09, 0xfe, 0x33, 0x8d, 0xf6, 0x77, 0x74, 0x76, 0xc1, 0x4e, ++ 0x55, 0x9f, 0xef, 0x50, 0xe5, 0xbc, 0xaf, 0x7a, 0x67, 0xb9, 0x2d, 0x64, ++ 0x1f, 0x94, 0x5d, 0x59, 0x82, 0xf1, 0x95, 0xbe, 0xf7, 0x5b, 0x26, 0x94, ++ 0x4c, 0xcc, 0x0c, 0xb1, 0x4b, 0x7c, 0xe3, 0x4b, 0xb4, 0x90, 0x75, 0xca, ++ 0xfa, 0x93, 0xbf, 0x3f, 0xab, 0xe2, 0x78, 0x77, 0xa6, 0x8f, 0x2f, 0xd9, ++ 0x88, 0xfb, 0x39, 0x85, 0x62, 0x1f, 0xd2, 0xc9, 0x53, 0xd0, 0x6b, 0x2a, ++ 0xea, 0xcd, 0x1a, 0x11, 0x8f, 0x99, 0x8c, 0xe7, 0x63, 0xb1, 0x5e, 0x74, ++ 0x60, 0xd0, 0xb2, 0x50, 0x3b, 0x84, 0xb5, 0x0e, 0xc6, 0x75, 0x76, 0xfc, ++ 0x8c, 0xdf, 0x1b, 0xf0, 0x35, 0x00, 0x7e, 0x30, 0xbe, 0xc6, 0xdc, 0x66, ++ 0x8c, 0xa7, 0x74, 0xc4, 0xc5, 0xad, 0x78, 0x06, 0xea, 0xef, 0xfc, 0x99, ++ 0xba, 0x02, 0xf5, 0xe8, 0xfe, 0x15, 0x09, 0x74, 0x2e, 0xe9, 0x4f, 0xe9, ++ 0xdc, 0xff, 0xdc, 0x19, 0xd7, 0x2f, 0xb9, 0x02, 0xf2, 0x1d, 0x31, 0xb7, ++ 0x9b, 0xf1, 0xbd, 0x92, 0x8e, 0x7b, 0x26, 0x51, 0xba, 0x43, 0xd5, 0x56, ++ 0x77, 0x03, 0xaf, 0x3d, 0xf8, 0xd8, 0xb5, 0x25, 0xb6, 0x4b, 0xb0, 0x3c, ++ 0x8e, 0xe0, 0xf3, 0x8b, 0xf4, 0x49, 0x25, 0xf5, 0x40, 0xd7, 0xbf, 0xc4, ++ 0x4b, 0x3b, 0xd0, 0xde, 0xeb, 0x74, 0x24, 0xe3, 0xbd, 0x06, 0xb6, 0xc6, ++ 0x44, 0xfb, 0x7a, 0x8c, 0xb9, 0x9f, 0x24, 0xba, 0xb9, 0xdf, 0x32, 0x12, ++ 0xfd, 0xe7, 0xb2, 0xfa, 0xcb, 0x68, 0xdf, 0xaa, 0xfc, 0x57, 0xd3, 0x27, ++ 0xd3, 0xbd, 0x85, 0x55, 0x26, 0xda, 0xcf, 0x80, 0x3f, 0x3a, 0x7f, 0xe2, ++ 0x5d, 0x33, 0x89, 0xce, 0x3d, 0xcd, 0x6b, 0x14, 0xa9, 0xef, 0x1a, 0x4a, ++ 0xdf, 0xf8, 0xe1, 0xe9, 0x06, 0xbc, 0x1f, 0xd9, 0xfd, 0x84, 0x42, 0xf7, ++ 0x25, 0xae, 0xfc, 0xba, 0xf5, 0x8f, 0x23, 0xf0, 0xdc, 0x63, 0xd3, 0x00, ++ 0x37, 0xa2, 0xe6, 0x75, 0xb0, 0xeb, 0xf1, 0x3c, 0xd2, 0xa7, 0xeb, 0x86, ++ 0xd0, 0x3d, 0x89, 0x83, 0x51, 0xb5, 0x74, 0xee, 0x13, 0xea, 0x33, 0xac, ++ 0x5f, 0xf5, 0x9d, 0xeb, 0xdd, 0x69, 0xb9, 0x58, 0x5f, 0x75, 0xe0, 0xd1, ++ 0x8a, 0xc3, 0xf0, 0x1d, 0xed, 0xe1, 0xc3, 0xf7, 0xaa, 0x4f, 0xe1, 0xfd, ++ 0xc3, 0xb2, 0x58, 0x7b, 0x34, 0x9e, 0x97, 0x3e, 0xfc, 0xbd, 0xeb, 0x5d, ++ 0xb4, 0x6b, 0xa1, 0xdc, 0xb1, 0x12, 0xbe, 0x1f, 0x5e, 0xb5, 0x20, 0x19, ++ 0xed, 0xac, 0xc3, 0x8a, 0x2b, 0x16, 0xdf, 0x12, 0x79, 0xf1, 0xb1, 0x59, ++ 0x25, 0xa9, 0x69, 0x78, 0x2f, 0xdf, 0x22, 0xf0, 0x39, 0xcb, 0x5e, 0x06, ++ 0x7c, 0x5e, 0x66, 0xe8, 0xa1, 0x17, 0xd2, 0x1f, 0x95, 0xf1, 0x3c, 0xff, ++ 0x62, 0xfa, 0xac, 0x92, 0x4d, 0x30, 0xff, 0xc3, 0x8f, 0x0e, 0xa1, 0x73, ++ 0x5f, 0x83, 0x33, 0xb4, 0xd6, 0x74, 0xc0, 0xd3, 0xe9, 0x0c, 0x6d, 0x2b, ++ 0xa6, 0x07, 0xc5, 0x7d, 0xe5, 0x37, 0x7e, 0xe0, 0xfb, 0x85, 0xbf, 0x3f, ++ 0x51, 0x9e, 0x8c, 0xf4, 0xf4, 0x7b, 0x41, 0xc7, 0xaf, 0x9f, 0x29, 0x4f, ++ 0x2e, 0x0f, 0xb1, 0x77, 0x2a, 0xbf, 0x30, 0x12, 0xde, 0xdf, 0x30, 0xbb, ++ 0x96, 0xe3, 0x3c, 0xdf, 0x88, 0xce, 0x52, 0xe8, 0x7c, 0x36, 0x6b, 0x4d, ++ 0xc0, 0x78, 0xf7, 0x3c, 0xe1, 0x7f, 0x00, 0xfd, 0xae, 0xd8, 0x16, 0xc1, ++ 0xee, 0x79, 0x38, 0x5d, 0x25, 0x3c, 0x75, 0xdc, 0x97, 0x94, 0x8f, 0x78, ++ 0x0d, 0xd2, 0x71, 0x25, 0xc9, 0x4b, 0xf2, 0x1b, 0x20, 0xff, 0xf6, 0x63, ++ 0xe5, 0xa4, 0xd7, 0x0e, 0x59, 0x56, 0xb0, 0x83, 0x68, 0x37, 0x8a, 0xf3, ++ 0x8b, 0x6c, 0x67, 0x14, 0xbf, 0xef, 0xb8, 0x25, 0xca, 0x1f, 0x95, 0x83, ++ 0xf1, 0x4f, 0x6d, 0x32, 0xb6, 0x63, 0xa9, 0xad, 0x83, 0x67, 0xd8, 0x43, ++ 0xf8, 0x4e, 0xd4, 0xff, 0xd8, 0xc7, 0xcf, 0xe7, 0x7e, 0x0c, 0xf5, 0xd1, ++ 0x7f, 0xfb, 0xd8, 0xf7, 0x0f, 0x7b, 0xe8, 0x3e, 0x84, 0xac, 0x5f, 0x15, ++ 0x6b, 0xf7, 0xa1, 0x31, 0xf1, 0xb9, 0xdd, 0x6e, 0x44, 0x3c, 0xec, 0x37, ++ 0xd6, 0x1d, 0xc6, 0x73, 0x7d, 0x95, 0x4f, 0x98, 0x48, 0xee, 0x57, 0x3e, ++ 0x91, 0x74, 0x77, 0x37, 0xca, 0x1b, 0xa0, 0x17, 0x8c, 0x8f, 0x85, 0xaf, ++ 0x2b, 0x35, 0xc3, 0x44, 0xf0, 0xea, 0x93, 0x0f, 0x7d, 0x77, 0x94, 0x4c, ++ 0xd4, 0xf9, 0x07, 0x77, 0x9c, 0x93, 0x0f, 0x0f, 0x3f, 0xb6, 0xac, 0x64, ++ 0xa3, 0xad, 0x6f, 0x3e, 0xac, 0x12, 0x7e, 0xca, 0xe4, 0x27, 0x4c, 0x74, ++ 0x4e, 0xbd, 0x6a, 0x8c, 0xdd, 0x88, 0xfb, 0x8f, 0x85, 0x4f, 0xbc, 0xb9, ++ 0x89, 0xee, 0xad, 0x2e, 0x8d, 0x1a, 0x85, 0xf7, 0x13, 0xaa, 0x9e, 0xb0, ++ 0x10, 0xbe, 0xba, 0xec, 0x76, 0x9f, 0x03, 0xf7, 0x47, 0x63, 0xed, 0xc6, ++ 0x78, 0x48, 0xbf, 0x16, 0x76, 0x48, 0x12, 0x5e, 0xae, 0xc4, 0xb8, 0x8c, ++ 0xca, 0x8c, 0xd6, 0x51, 0x94, 0xd2, 0xbd, 0x04, 0xb9, 0xaf, 0x77, 0x74, ++ 0xc5, 0x83, 0x0f, 0xe3, 0x31, 0xca, 0x63, 0xcc, 0x3f, 0x73, 0x2c, 0xc0, ++ 0xef, 0x14, 0x22, 0x0c, 0xe0, 0x72, 0x4a, 0xde, 0xcb, 0x0a, 0xdb, 0xe7, ++ 0xab, 0xde, 0xbb, 0xcd, 0x5c, 0xc0, 0xce, 0xb1, 0xcf, 0x77, 0x9e, 0xfd, ++ 0x3d, 0x20, 0x5f, 0x7a, 0x47, 0xe2, 0x42, 0xf7, 0xf9, 0x62, 0x32, 0xc4, ++ 0xbd, 0x9f, 0x9e, 0x7d, 0x3e, 0x13, 0xbd, 0x0b, 0x51, 0x25, 0xf6, 0xf9, ++ 0x8a, 0xd6, 0xf3, 0xf3, 0x5b, 0x55, 0x2b, 0xf8, 0xfb, 0x1d, 0x45, 0x09, ++ 0x3c, 0xde, 0x7b, 0xa8, 0xce, 0x87, 0x8f, 0xc4, 0xe2, 0x7a, 0x7d, 0x0e, ++ 0xbc, 0x9f, 0xfb, 0x10, 0xd7, 0x2f, 0x55, 0x4c, 0xf1, 0x5b, 0xe1, 0x9f, ++ 0xd7, 0xac, 0x5f, 0x6a, 0xa4, 0xfb, 0x8f, 0xe9, 0x1c, 0x3e, 0x65, 0xe2, ++ 0x1d, 0xa7, 0x83, 0x51, 0xee, 0x6c, 0xf4, 0xd3, 0x2b, 0x9f, 0x88, 0x22, ++ 0xb8, 0x56, 0x3d, 0xb9, 0xe0, 0x2f, 0x8f, 0x42, 0xbb, 0xae, 0xfa, 0x92, ++ 0xc4, 0x50, 0xbf, 0x38, 0x47, 0xd0, 0x03, 0xf4, 0xcf, 0xf0, 0x9e, 0xae, ++ 0xec, 0xe7, 0xf3, 0xfa, 0x9f, 0x67, 0x23, 0xdd, 0x17, 0xfd, 0x1a, 0xfc, ++ 0x5b, 0xbc, 0xef, 0x17, 0xcf, 0x5e, 0xb8, 0x39, 0x07, 0xf1, 0x94, 0x96, ++ 0x8d, 0xfb, 0x91, 0xb2, 0x5e, 0xd5, 0xca, 0x9f, 0x0d, 0xe6, 0xf5, 0xc0, ++ 0x3f, 0x06, 0x3f, 0xb8, 0xec, 0x5e, 0x95, 0xbf, 0xbf, 0xf6, 0xb2, 0x85, ++ 0xf4, 0x1d, 0xf0, 0x78, 0x2a, 0x0b, 0xb9, 0xcf, 0x3c, 0xaf, 0x71, 0xaf, ++ 0xd9, 0x3c, 0x2c, 0x78, 0xff, 0xeb, 0x53, 0xc8, 0xe3, 0x95, 0xfb, 0x90, ++ 0x7b, 0x60, 0x66, 0x84, 0x97, 0xbc, 0x97, 0x84, 0x7f, 0xa9, 0x79, 0xc2, ++ 0xde, 0x76, 0x91, 0xfc, 0xa0, 0x77, 0x78, 0x4b, 0x0d, 0x0a, 0xdd, 0x5f, ++ 0x02, 0xc9, 0x45, 0xf7, 0x7e, 0xae, 0xcf, 0xe0, 0xf6, 0xeb, 0xc4, 0x0c, ++ 0x7e, 0xde, 0xa9, 0x2c, 0xdb, 0x4d, 0xf7, 0x5f, 0xaa, 0x1f, 0xb0, 0xb8, ++ 0x57, 0xe6, 0xf0, 0x7e, 0x7a, 0xee, 0x55, 0xe3, 0x39, 0x27, 0x43, 0x67, ++ 0x25, 0xed, 0x3f, 0xfe, 0xd6, 0x42, 0x71, 0x91, 0x9a, 0xc6, 0x28, 0x2d, ++ 0x2a, 0x96, 0x9f, 0x8b, 0x78, 0x69, 0x18, 0x9d, 0x8b, 0x36, 0x9a, 0x71, ++ 0xdf, 0xc4, 0xc5, 0xe5, 0xc4, 0xf5, 0x82, 0xfe, 0x6a, 0x5c, 0xd3, 0xaf, ++ 0x41, 0x7a, 0x81, 0xf2, 0x7d, 0x46, 0x3c, 0x87, 0x65, 0xe7, 0xf2, 0xb0, ++ 0x3a, 0x1e, 0xe0, 0xce, 0xf5, 0xb0, 0x66, 0x80, 0x71, 0x4e, 0xe2, 0xbf, ++ 0x06, 0xf0, 0x7e, 0xd3, 0x46, 0x84, 0x8c, 0xaf, 0x88, 0xef, 0xd0, 0x8f, ++ 0x2b, 0x36, 0xd8, 0xef, 0x1e, 0x03, 0x6b, 0xc2, 0xb8, 0x0b, 0xd6, 0xbf, ++ 0x64, 0x04, 0xc2, 0x31, 0x61, 0xe6, 0x6c, 0x9c, 0xdf, 0xf3, 0x2a, 0xf1, ++ 0x31, 0x2c, 0xfe, 0x81, 0x71, 0x68, 0xdf, 0x3d, 0xaf, 0x8e, 0x46, 0xbf, ++ 0xb6, 0xec, 0xde, 0x9d, 0x93, 0xd7, 0x61, 0x7e, 0xeb, 0x48, 0xbc, 0xb1, ++ 0xc0, 0xca, 0x5e, 0xf8, 0x80, 0xf4, 0xc5, 0x22, 0x81, 0xff, 0x2e, 0x71, ++ 0x1e, 0xac, 0x1c, 0xf2, 0x78, 0xdf, 0x7f, 0x7e, 0x06, 0x97, 0x93, 0x5e, ++ 0x95, 0xc7, 0x7b, 0xe6, 0x0b, 0x78, 0x49, 0x3a, 0x90, 0xe5, 0xd5, 0xf7, ++ 0xf2, 0xf3, 0x50, 0xd5, 0xab, 0x2c, 0x64, 0xbf, 0x54, 0xd7, 0xff, 0x95, ++ 0xfa, 0xad, 0xb6, 0x77, 0x26, 0xa3, 0xdc, 0xad, 0x7e, 0xd9, 0x44, 0xf7, ++ 0x98, 0x17, 0x89, 0x79, 0x97, 0xd7, 0x67, 0xe5, 0xef, 0x03, 0xba, 0x2a, ++ 0x37, 0xc5, 0xd1, 0x7b, 0xcb, 0x8b, 0x7d, 0x25, 0x66, 0xcc, 0x2f, 0x6e, ++ 0x51, 0x28, 0x1f, 0x6c, 0x97, 0x94, 0x8d, 0x74, 0x7a, 0xbc, 0xf1, 0x95, ++ 0x58, 0xa4, 0x9f, 0x83, 0x51, 0x81, 0x41, 0xa8, 0x87, 0xba, 0x97, 0x46, ++ 0xb9, 0xf1, 0x1c, 0x9e, 0x8c, 0xb7, 0x1d, 0x6f, 0x1c, 0xf4, 0x14, 0xc6, ++ 0x65, 0xe6, 0x39, 0x3a, 0xed, 0x78, 0x1f, 0x69, 0xde, 0xf2, 0x01, 0x4e, ++ 0x94, 0xdb, 0xfb, 0x1d, 0x01, 0x33, 0x96, 0xef, 0x6f, 0xcd, 0x31, 0x60, ++ 0x5e, 0x73, 0x38, 0xf2, 0x31, 0xaf, 0x19, 0x2f, 0xa7, 0xfc, 0x71, 0x71, ++ 0xee, 0x84, 0xfe, 0x90, 0x5e, 0x14, 0x8e, 0xe7, 0xc5, 0x5b, 0x76, 0x9a, ++ 0xfb, 0xc3, 0x78, 0x2d, 0x82, 0x2e, 0xbe, 0x78, 0xfe, 0x83, 0xc1, 0xa8, ++ 0xa7, 0xaa, 0xb3, 0x3b, 0x07, 0xa3, 0x3e, 0x01, 0x3a, 0x18, 0x9c, 0x81, ++ 0x70, 0x7e, 0x56, 0x21, 0x3d, 0xbc, 0x64, 0x0b, 0x3f, 0xa7, 0x2e, 0xe9, ++ 0x60, 0x09, 0xd2, 0x01, 0xf0, 0xdd, 0x42, 0x41, 0x07, 0x4b, 0xb6, 0xbf, ++ 0xf2, 0x13, 0xe4, 0x87, 0x25, 0x88, 0xff, 0x51, 0xbd, 0xe9, 0x08, 0xe8, ++ 0x74, 0x17, 0x7d, 0x7f, 0x69, 0xc3, 0x64, 0xc6, 0xdb, 0xef, 0x42, 0x3a, ++ 0x91, 0xfa, 0x0b, 0xf2, 0x8d, 0x26, 0x27, 0xc6, 0xdf, 0x44, 0x1e, 0xc6, ++ 0xc1, 0xfc, 0x5a, 0x01, 0x4f, 0x28, 0x9f, 0xc8, 0xcb, 0x7d, 0xc3, 0xf8, ++ 0x39, 0xb7, 0x2e, 0x3a, 0xb7, 0x57, 0x23, 0xee, 0x2b, 0xf6, 0xc8, 0xa7, ++ 0x3e, 0xf0, 0xfc, 0x82, 0xc0, 0x63, 0x79, 0xbd, 0x85, 0xe4, 0xed, 0x0b, ++ 0x02, 0xcf, 0x5d, 0xf7, 0xbe, 0x1c, 0x8b, 0x78, 0xfc, 0xe2, 0xf9, 0x9d, ++ 0xbb, 0x71, 0x9f, 0xa4, 0xfa, 0x25, 0xc5, 0xc1, 0xf7, 0xab, 0xc2, 0xf8, ++ 0x42, 0xc0, 0xa5, 0x06, 0xe1, 0x10, 0x4b, 0xeb, 0x20, 0xbb, 0xa2, 0x06, ++ 0xd7, 0x1d, 0x1b, 0x84, 0x43, 0x0f, 0xfd, 0x0b, 0x7e, 0xac, 0x61, 0x7c, ++ 0x9d, 0x72, 0xdd, 0x35, 0x46, 0x01, 0x07, 0x59, 0x2e, 0xda, 0xbf, 0x88, ++ 0xeb, 0x4c, 0x42, 0xf8, 0x0a, 0xb8, 0x6d, 0x1f, 0xc2, 0xf9, 0x4f, 0xf0, ++ 0x1b, 0xf2, 0x33, 0xbd, 0xcf, 0x23, 0xd6, 0xe7, 0x75, 0xea, 0xdf, 0xdd, ++ 0xfe, 0x30, 0x83, 0xeb, 0x83, 0xd7, 0x44, 0xba, 0x18, 0xe8, 0x02, 0xef, ++ 0x67, 0x31, 0xbc, 0x9e, 0x28, 0xe5, 0x04, 0x14, 0x7d, 0xb1, 0x75, 0x03, ++ 0xc5, 0x7d, 0x24, 0xbe, 0xe4, 0xbc, 0x0f, 0x07, 0xf5, 0x88, 0x16, 0xef, ++ 0x0c, 0xe2, 0xb1, 0xcb, 0xc0, 0xef, 0x2f, 0x86, 0xeb, 0xcb, 0x77, 0x04, ++ 0xfc, 0x0e, 0xac, 0x4a, 0xc9, 0x6e, 0x03, 0xb8, 0x1d, 0xdf, 0x4c, 0xcf, ++ 0x54, 0x12, 0xbd, 0x1a, 0x43, 0xc6, 0x93, 0x74, 0x23, 0xc7, 0x2b, 0x7a, ++ 0x6e, 0xfa, 0x75, 0xb8, 0x5e, 0xe8, 0x3f, 0x80, 0xfd, 0xcb, 0x71, 0xf7, ++ 0xfb, 0x62, 0x8c, 0xd8, 0xcf, 0x7e, 0xc6, 0xf9, 0x03, 0xe9, 0x13, 0xe5, ++ 0xa7, 0xe4, 0xcb, 0xa2, 0x86, 0x39, 0xd7, 0x8d, 0xc4, 0x73, 0xbf, 0xbe, ++ 0x2f, 0xec, 0x03, 0x86, 0xe1, 0x7a, 0x39, 0xdd, 0x1e, 0xce, 0xe0, 0xe7, ++ 0x7f, 0x34, 0xb4, 0x13, 0xa0, 0xbd, 0xd6, 0xa6, 0x50, 0xdc, 0xf9, 0x80, ++ 0xf0, 0xe7, 0x0f, 0xac, 0x7a, 0x25, 0xb6, 0x3c, 0x04, 0x4e, 0x87, 0x44, ++ 0x3b, 0x49, 0x67, 0xf8, 0x87, 0xf1, 0x28, 0x39, 0xdf, 0x3d, 0x4e, 0x1e, ++ 0xc7, 0x0d, 0x9f, 0xb7, 0x94, 0x43, 0x72, 0xde, 0x45, 0xf7, 0xcc, 0xba, ++ 0x0e, 0xbf, 0xcb, 0xf9, 0x4b, 0x7a, 0x95, 0xf4, 0x29, 0xe1, 0x28, 0xe9, ++ 0x54, 0xde, 0x7f, 0x0b, 0xa7, 0x57, 0xa2, 0x35, 0xa9, 0x3f, 0x55, 0x9d, ++ 0xbc, 0x27, 0xfd, 0x78, 0x4d, 0xe6, 0x57, 0x66, 0xaf, 0xad, 0xf7, 0xf7, ++ 0xf0, 0xbc, 0xb4, 0x83, 0x0e, 0x8a, 0xf3, 0xdb, 0xdd, 0x49, 0x8c, 0xc7, ++ 0xeb, 0x1b, 0x53, 0x77, 0x85, 0xde, 0xf7, 0x81, 0x3f, 0x5b, 0xa8, 0xde, ++ 0x09, 0xd1, 0x27, 0xcd, 0xc6, 0x10, 0x7d, 0x22, 0xf5, 0x7f, 0x4d, 0xa2, ++ 0x76, 0x14, 0xf1, 0x55, 0x9c, 0xc9, 0xcf, 0x95, 0x1c, 0x63, 0xad, 0xe6, ++ 0x02, 0xe8, 0x77, 0xf1, 0x91, 0xce, 0xc9, 0xf8, 0x4e, 0xa2, 0xb4, 0x3b, ++ 0xaf, 0xfc, 0x3a, 0xa0, 0xc6, 0x61, 0x1c, 0x6a, 0x3b, 0x3f, 0x7f, 0x26, ++ 0xe1, 0xbd, 0xf8, 0xc4, 0x2e, 0xa2, 0xfb, 0x6a, 0x71, 0x2f, 0xa9, 0xec, ++ 0xde, 0x0f, 0x4a, 0xc6, 0x22, 0x7d, 0xff, 0xc6, 0x44, 0xfb, 0x31, 0x65, ++ 0xab, 0x26, 0xd1, 0xfd, 0xe3, 0x05, 0x9b, 0xe6, 0xe6, 0x21, 0xfd, 0xe0, ++ 0x7d, 0x06, 0x94, 0xe7, 0x47, 0x37, 0x8e, 0x19, 0xcd, 0x9f, 0xf3, 0x72, ++ 0x24, 0xcf, 0xc4, 0x7b, 0x0d, 0x1b, 0x1f, 0x9c, 0x79, 0x0b, 0x7c, 0x9f, ++ 0xd7, 0xa6, 0xba, 0x49, 0xae, 0x43, 0x3f, 0xc8, 0xaf, 0x65, 0x77, 0x8e, ++ 0x66, 0x48, 0x2f, 0x07, 0xa3, 0xba, 0x4a, 0xc6, 0xa3, 0xbd, 0xfe, 0x53, ++ 0xd5, 0x81, 0xf6, 0xfa, 0x84, 0x4d, 0x63, 0xee, 0xc6, 0xfa, 0x13, 0xec, ++ 0xfd, 0xe2, 0x71, 0x3d, 0xda, 0xc6, 0x04, 0xca, 0x6b, 0xc6, 0x38, 0xd2, ++ 0x0b, 0xd2, 0xce, 0x95, 0xe7, 0xf2, 0x1a, 0x4c, 0x9c, 0x1e, 0x46, 0x65, ++ 0x72, 0xfe, 0xb9, 0xa4, 0x27, 0x55, 0xc4, 0x79, 0xbc, 0x86, 0xc1, 0xb8, ++ 0x7f, 0xde, 0xbd, 0x21, 0x8a, 0xde, 0x41, 0x2a, 0x35, 0x8b, 0x7b, 0x9c, ++ 0xaf, 0xa5, 0x90, 0x3f, 0x51, 0x63, 0xc6, 0x2b, 0x85, 0x74, 0x2f, 0x94, ++ 0xec, 0xb0, 0xf9, 0x66, 0x66, 0x4d, 0xe3, 0xe7, 0x9d, 0xad, 0x69, 0xf0, ++ 0x7d, 0xaf, 0xa9, 0xf3, 0x4e, 0xd4, 0x1f, 0x7b, 0xef, 0xb4, 0x8f, 0xa4, ++ 0x73, 0xf5, 0xea, 0x77, 0x79, 0xe5, 0xdc, 0x7e, 0xe6, 0xfb, 0x85, 0x09, ++ 0xfa, 0x77, 0x87, 0xe4, 0x3c, 0x46, 0x8a, 0xf1, 0xc3, 0xfb, 0x93, 0xed, ++ 0xf7, 0x88, 0xf3, 0xc6, 0x07, 0xc5, 0xfc, 0x8f, 0x36, 0xfe, 0x66, 0x26, ++ 0xea, 0xbf, 0xa3, 0x9b, 0x07, 0x39, 0x71, 0xdd, 0x9f, 0xbf, 0x16, 0x45, ++ 0xe7, 0xf0, 0x3f, 0x0f, 0x7b, 0xb7, 0xf0, 0x62, 0xef, 0x69, 0x01, 0xdd, ++ 0x86, 0xdd, 0x83, 0x5a, 0xc9, 0xe5, 0x45, 0xa6, 0xfe, 0x9c, 0x96, 0xa4, ++ 0xf3, 0xf3, 0xde, 0x53, 0xfa, 0x28, 0x31, 0x6c, 0x3f, 0xe0, 0xdc, 0xe7, ++ 0x8b, 0x4e, 0xd4, 0x31, 0xba, 0x4f, 0x6d, 0x01, 0x5f, 0x98, 0xec, 0x99, ++ 0x98, 0xef, 0xb7, 0xe1, 0xb9, 0xbe, 0xca, 0x16, 0x8b, 0x03, 0xef, 0xb3, ++ 0x1c, 0x42, 0xba, 0xa7, 0xf3, 0x3c, 0x2a, 0xbf, 0x77, 0x6b, 0xe5, 0x7c, ++ 0x70, 0x68, 0xeb, 0x48, 0x3f, 0xfa, 0x8d, 0x95, 0x1f, 0xf1, 0xfb, 0x45, ++ 0xbb, 0xd6, 0xde, 0x43, 0xe7, 0x0a, 0x2a, 0xc0, 0xae, 0xc4, 0xa3, 0x54, ++ 0x3d, 0x76, 0xf2, 0x43, 0x6b, 0x67, 0x22, 0x1b, 0x9c, 0x72, 0x7b, 0x57, ++ 0xe3, 0x3b, 0x2f, 0xa7, 0x36, 0xf3, 0x73, 0x10, 0xbd, 0xde, 0x2d, 0xd8, ++ 0xbb, 0x6d, 0x77, 0xe8, 0xbb, 0x05, 0x17, 0x6b, 0x1f, 0x5f, 0xa8, 0x5d, ++ 0x2c, 0xe3, 0x0a, 0x35, 0x99, 0xfa, 0x7b, 0xf1, 0x12, 0xae, 0xd2, 0x3f, ++ 0x7a, 0x03, 0xf0, 0x3f, 0x6e, 0x54, 0x10, 0x4e, 0x5f, 0xd6, 0xcd, 0x27, ++ 0xbb, 0xf8, 0x44, 0x9d, 0x97, 0xd2, 0x93, 0xca, 0x81, 0x07, 0x26, 0x20, ++ 0xdd, 0xda, 0xe3, 0xe8, 0xbc, 0xfe, 0xef, 0xdb, 0x1e, 0x54, 0xf1, 0x9d, ++ 0x95, 0xea, 0xed, 0x23, 0xbf, 0x43, 0xff, 0x76, 0xbc, 0x2d, 0xce, 0x81, ++ 0xfc, 0xfa, 0x65, 0xdd, 0x0a, 0xda, 0xef, 0x3c, 0x51, 0x57, 0x4b, 0x69, ++ 0xf0, 0x5d, 0x57, 0x3f, 0xa5, 0x57, 0x6e, 0xef, 0xa0, 0x76, 0x5f, 0xb6, ++ 0x8d, 0x6e, 0xc7, 0x7b, 0xae, 0xaf, 0xdb, 0xe2, 0x84, 0xbc, 0x0f, 0xdf, ++ 0xd7, 0xe1, 0x78, 0xec, 0xeb, 0xfe, 0xae, 0x5c, 0xd7, 0xb1, 0x9f, 0x72, ++ 0x7c, 0xca, 0x79, 0x1f, 0xdb, 0x3c, 0x37, 0x16, 0xd7, 0xd5, 0xf1, 0x78, ++ 0x42, 0xfb, 0x15, 0x88, 0xc7, 0x98, 0x38, 0x07, 0xda, 0x77, 0x55, 0xe2, ++ 0x9c, 0xc7, 0xe1, 0x75, 0xdc, 0x7e, 0x3e, 0x62, 0x8d, 0x7b, 0x66, 0x2a, ++ 0x9e, 0x0f, 0x59, 0x7f, 0x43, 0x32, 0xbe, 0x83, 0x53, 0xd1, 0x71, 0xe3, ++ 0x4c, 0xfc, 0x5e, 0xf9, 0x9a, 0xe2, 0x40, 0xbb, 0xdf, 0xfd, 0xda, 0xf4, ++ 0x58, 0x8c, 0xa3, 0x7d, 0x66, 0xec, 0x8a, 0xc5, 0x7b, 0x4d, 0x9f, 0xad, ++ 0x93, 0xf7, 0xa1, 0xfc, 0xf4, 0x1e, 0xe9, 0xf8, 0x62, 0x46, 0xfb, 0x4e, ++ 0xe3, 0x03, 0x46, 0xe6, 0xca, 0xe1, 0x5b, 0xcc, 0x48, 0x27, 0x57, 0x9c, ++ 0x30, 0xd2, 0xbd, 0xd3, 0xe3, 0xb8, 0x1f, 0x85, 0x71, 0x8f, 0xef, 0xa2, ++ 0x29, 0xee, 0xc1, 0xc4, 0x3e, 0x53, 0xc5, 0xab, 0x3c, 0x5e, 0xd2, 0xe3, ++ 0xc7, 0x0a, 0x3f, 0x6e, 0x82, 0x58, 0xf7, 0x5b, 0x99, 0x4e, 0xb9, 0x7f, ++ 0x40, 0xdf, 0x8b, 0xc6, 0xf1, 0xef, 0x9f, 0xaf, 0xdf, 0x36, 0x0d, 0xfb, ++ 0x3b, 0xba, 0xd1, 0xe4, 0xc0, 0x79, 0x7f, 0xb9, 0x91, 0xbf, 0xcf, 0xb0, ++ 0x10, 0xfc, 0x2f, 0xbc, 0x9a, 0x72, 0x64, 0x33, 0xf7, 0x6f, 0x16, 0xb6, ++ 0x2a, 0xe4, 0x0f, 0x1f, 0xdd, 0x0c, 0xfa, 0x19, 0xd6, 0x55, 0xbd, 0xd4, ++ 0xa4, 0xf1, 0xfb, 0x9a, 0x7a, 0xfa, 0x2b, 0x82, 0x72, 0x3c, 0xd7, 0x28, ++ 0xe9, 0x6f, 0xa1, 0xe6, 0x27, 0xba, 0x0e, 0x7f, 0x3f, 0x23, 0x9e, 0xb5, ++ 0xd2, 0xbd, 0xae, 0x1f, 0x8b, 0x1e, 0x03, 0x99, 0x7a, 0x3f, 0xad, 0x87, ++ 0x0e, 0xfb, 0xc2, 0xbf, 0x80, 0x13, 0xf2, 0x2d, 0xd2, 0xa1, 0xc4, 0xf3, ++ 0xc2, 0x75, 0x7c, 0xdf, 0xdc, 0xd9, 0x3a, 0xb2, 0x00, 0xe9, 0x49, 0xe2, ++ 0x5d, 0xca, 0x05, 0x79, 0x5f, 0xa1, 0xc1, 0xcc, 0xf8, 0x7b, 0xa5, 0x86, ++ 0x68, 0xfa, 0x3d, 0x80, 0xe9, 0x36, 0x97, 0x49, 0x81, 0xf5, 0xdf, 0x90, ++ 0xd8, 0x35, 0x11, 0xc5, 0xe7, 0xb0, 0x2c, 0x6e, 0x7f, 0xa8, 0x45, 0x06, ++ 0x0d, 0xef, 0xa1, 0xb1, 0x06, 0x4b, 0xc4, 0xf7, 0xa8, 0xfe, 0x26, 0xe4, ++ 0xe8, 0x9c, 0x2c, 0x46, 0xe9, 0x37, 0x99, 0xdc, 0x5e, 0x90, 0xf7, 0xb1, ++ 0x64, 0x0a, 0x0b, 0xc9, 0x42, 0x3d, 0x3d, 0x3d, 0xc6, 0xf9, 0x8d, 0x0b, ++ 0xaa, 0x1c, 0x5e, 0xbf, 0x74, 0x9a, 0x11, 0xe6, 0x3f, 0x7d, 0x82, 0xf3, ++ 0xce, 0x01, 0x6e, 0xc0, 0xdb, 0xfa, 0x9f, 0x4c, 0x33, 0x02, 0xdd, 0x4e, ++ 0x1f, 0xed, 0x7c, 0xb9, 0x3f, 0xe4, 0xbb, 0x33, 0xef, 0xe2, 0xf9, 0xcb, ++ 0x9d, 0x63, 0x4c, 0x90, 0xaf, 0xaf, 0x5f, 0x31, 0x6d, 0x22, 0xd4, 0xb7, ++ 0x67, 0x69, 0x87, 0x32, 0x43, 0xc6, 0x91, 0xfd, 0xc2, 0xf7, 0xcf, 0xf1, ++ 0xbb, 0x3f, 0xc1, 0x7b, 0x0c, 0xd3, 0x1a, 0x33, 0xbf, 0x1f, 0x75, 0x52, ++ 0xe9, 0x1e, 0xb1, 0x22, 0x27, 0x58, 0xff, 0x7d, 0x85, 0xed, 0xff, 0xbd, ++ 0x12, 0xcc, 0x77, 0x99, 0x18, 0xbd, 0x03, 0xf3, 0x4d, 0xa6, 0x9c, 0x7f, ++ 0xe4, 0x74, 0x4c, 0x96, 0x76, 0x3a, 0x73, 0x4c, 0xef, 0xef, 0xe5, 0x8c, ++ 0xad, 0xa2, 0xf3, 0x71, 0x3e, 0x7e, 0xbf, 0x05, 0xfe, 0x3c, 0xd6, 0x64, ++ 0xbc, 0x7f, 0xc4, 0xe9, 0xa9, 0x5c, 0xde, 0x77, 0x69, 0xd2, 0xdf, 0x77, ++ 0x61, 0x6e, 0x7e, 0xff, 0x4a, 0xde, 0x43, 0x92, 0xf7, 0x8c, 0x2e, 0x09, ++ 0xde, 0x9f, 0x5a, 0x7f, 0x31, 0xf7, 0xa7, 0x4e, 0x9a, 0x60, 0xbd, 0x71, ++ 0xbd, 0xef, 0xb3, 0x29, 0xed, 0x7f, 0xa0, 0xf7, 0xb0, 0x1a, 0x7c, 0xac, ++ 0x2b, 0x8a, 0xf0, 0xa0, 0xbf, 0xbf, 0x52, 0x1d, 0xc3, 0xdf, 0xf7, 0x5b, ++ 0xf6, 0xf2, 0x17, 0xbb, 0x90, 0xac, 0x16, 0x48, 0x7b, 0x05, 0x95, 0x6d, ++ 0x5e, 0xf0, 0xfe, 0x3e, 0x4b, 0xe5, 0xfb, 0xfe, 0x77, 0x0a, 0x3a, 0xfc, ++ 0xbc, 0x8e, 0x0d, 0x1c, 0x08, 0xac, 0x7c, 0x7d, 0x67, 0x67, 0xac, 0x0b, ++ 0x26, 0x7b, 0x62, 0x5a, 0x60, 0x30, 0xf2, 0xb7, 0xcb, 0xe2, 0xcd, 0xc8, ++ 0x42, 0x3f, 0x7e, 0x7d, 0x43, 0xe6, 0xb2, 0x44, 0xbc, 0xf7, 0x69, 0x71, ++ 0x4f, 0x85, 0xfa, 0x47, 0xfc, 0xfc, 0x5e, 0xe5, 0x62, 0x61, 0x6f, 0xb2, ++ 0x8d, 0x49, 0x82, 0xcf, 0xd5, 0xc0, 0xd5, 0x50, 0x6f, 0x4f, 0xce, 0x25, ++ 0xf4, 0x7e, 0xc3, 0xa0, 0x2c, 0xee, 0x47, 0x9c, 0xc8, 0x09, 0x64, 0xe3, ++ 0x7b, 0x3a, 0xbe, 0x1c, 0xee, 0xdf, 0x40, 0x3d, 0x3a, 0xbf, 0x56, 0xbc, ++ 0xf2, 0x9a, 0x24, 0xac, 0x77, 0x62, 0xeb, 0x3d, 0x03, 0x2b, 0x00, 0x6f, ++ 0x16, 0x7c, 0xbf, 0xcd, 0x49, 0x29, 0xc3, 0xfb, 0x4f, 0xd7, 0x42, 0xdf, ++ 0xe3, 0x9c, 0xf4, 0xae, 0x1b, 0x53, 0x69, 0x9f, 0xd6, 0x4f, 0xfd, 0x61, ++ 0xbd, 0x58, 0xd4, 0xeb, 0xae, 0xb9, 0xa9, 0x3c, 0x8e, 0xce, 0xef, 0xcd, ++ 0x49, 0x3c, 0x49, 0xf8, 0xf7, 0xc2, 0x0b, 0x4c, 0x01, 0xed, 0x51, 0x83, ++ 0x95, 0x99, 0x70, 0xfe, 0x97, 0xb0, 0xf5, 0x0e, 0xe4, 0x53, 0x89, 0x1f, ++ 0xf9, 0xfe, 0xe9, 0xb2, 0x97, 0x79, 0xfc, 0x64, 0x99, 0xd2, 0xd5, 0x98, ++ 0x80, 0xf9, 0xe7, 0x15, 0x3a, 0xff, 0xf6, 0xb9, 0x95, 0xdf, 0xeb, 0xe9, ++ 0xad, 0xe7, 0x36, 0x99, 0x11, 0xd4, 0xf3, 0xd7, 0xcf, 0xd5, 0xbd, 0xcf, ++ 0x23, 0xdf, 0x19, 0xfd, 0xb1, 0xe3, 0x40, 0x53, 0xb3, 0x84, 0x7c, 0x19, ++ 0xc9, 0x46, 0x86, 0xbe, 0xe3, 0x5a, 0x25, 0xda, 0x4e, 0x52, 0x4b, 0x5d, ++ 0xf8, 0xde, 0xdb, 0xb2, 0x24, 0x2b, 0xbd, 0xdb, 0xb1, 0xec, 0x89, 0x01, ++ 0xa4, 0x4f, 0xd8, 0xdb, 0x77, 0xb0, 0xd0, 0x7a, 0x6c, 0x7d, 0x02, 0xd1, ++ 0xc7, 0xea, 0x1c, 0x95, 0xe0, 0xbc, 0xa0, 0x8d, 0xd1, 0xbb, 0x3b, 0x25, ++ 0x6d, 0xe9, 0x74, 0x5e, 0x71, 0x6a, 0x9b, 0x93, 0xd2, 0xd8, 0x33, 0xa9, ++ 0xf4, 0xfd, 0xe8, 0x33, 0x7f, 0xcc, 0xe5, 0xf2, 0x87, 0xe3, 0xa1, 0xe4, ++ 0xbf, 0x52, 0x0a, 0xe9, 0x7c, 0xd0, 0x7f, 0x0d, 0xa1, 0x94, 0xf5, 0xf5, ++ 0xae, 0xb0, 0xcd, 0x4a, 0xf7, 0x68, 0x97, 0xed, 0xe5, 0x7a, 0x69, 0xd9, ++ 0x4d, 0x2a, 0xc5, 0x27, 0x99, 0xb8, 0x1f, 0xee, 0x11, 0xd3, 0xf1, 0xd8, ++ 0x9a, 0x28, 0x9e, 0xe3, 0x61, 0x91, 0xdf, 0x8f, 0xf5, 0xc8, 0xf7, 0x63, ++ 0x35, 0xd3, 0x39, 0xdf, 0x8f, 0x95, 0xf0, 0xb5, 0x08, 0xfc, 0x84, 0xbf, ++ 0x27, 0x7b, 0xd3, 0xde, 0xd1, 0xa9, 0xf4, 0x1e, 0xab, 0x78, 0x4f, 0x76, ++ 0xb6, 0xa8, 0xd7, 0x29, 0xee, 0x6d, 0x85, 0xbf, 0x2b, 0x7b, 0x4f, 0xec, ++ 0x64, 0x7a, 0x57, 0x76, 0xb6, 0x56, 0x15, 0xf1, 0x5d, 0x59, 0xa3, 0x2f, ++ 0xca, 0x8d, 0xf6, 0xad, 0x29, 0xd3, 0xc6, 0xdf, 0x6b, 0xf0, 0x86, 0xbf, ++ 0x33, 0xdb, 0x65, 0xc4, 0x75, 0xcf, 0xcc, 0xe7, 0xef, 0xcc, 0xde, 0x34, ++ 0x3b, 0xe4, 0x5d, 0x04, 0xf8, 0xcf, 0x94, 0xff, 0x15, 0xc9, 0x69, 0x53, ++ 0x7e, 0xaf, 0xf7, 0x81, 0x4c, 0x48, 0xdf, 0x16, 0x8f, 0xbe, 0x7e, 0xb3, ++ 0xc4, 0xff, 0x25, 0xec, 0x92, 0x73, 0xbe, 0xe3, 0x9b, 0x69, 0xa6, 0x77, ++ 0xde, 0x8c, 0xf8, 0x9e, 0x33, 0xe4, 0x67, 0x8a, 0x77, 0x7c, 0xd1, 0x8e, ++ 0x43, 0xfb, 0xfc, 0x94, 0xc6, 0xdf, 0x95, 0xb3, 0x88, 0x77, 0xa6, 0x3b, ++ 0x59, 0x6e, 0x2a, 0xf2, 0xfd, 0xc5, 0xbe, 0xd3, 0xfc, 0xff, 0xdb, 0xbb, ++ 0xcc, 0xe1, 0xef, 0x2f, 0x87, 0xbf, 0xb7, 0x7c, 0xd9, 0xe6, 0x65, 0xba, ++ 0xfc, 0xf0, 0xd6, 0xff, 0xd0, 0xd5, 0xbf, 0xbc, 0x6d, 0xa5, 0xae, 0x7c, ++ 0x64, 0x60, 0x8d, 0xae, 0x7c, 0xf4, 0x9e, 0x5f, 0xea, 0xf2, 0x63, 0x3a, ++ 0x1f, 0xd3, 0xd5, 0x1f, 0xbb, 0xef, 0x29, 0x5d, 0xf9, 0x15, 0x5d, 0xcf, ++ 0xea, 0xca, 0x27, 0x1c, 0x79, 0x49, 0x97, 0xbf, 0xb2, 0xfb, 0x77, 0xba, ++ 0xfa, 0x57, 0x9f, 0xd9, 0xa1, 0xcb, 0x17, 0xb0, 0x3f, 0xea, 0xea, 0x17, ++ 0x59, 0x3f, 0xd0, 0xe5, 0x27, 0x39, 0xfe, 0xa1, 0xab, 0x7f, 0x4d, 0xea, ++ 0x41, 0x5d, 0xf9, 0xb5, 0xae, 0xe3, 0xba, 0xf2, 0x29, 0x43, 0x4f, 0xeb, ++ 0xd7, 0x63, 0xf4, 0xfe, 0x0d, 0xe5, 0x7c, 0x89, 0xfb, 0xbf, 0x75, 0xed, ++ 0xa6, 0x31, 0xd7, 0x2f, 0xf0, 0xfd, 0xe7, 0x59, 0x89, 0x06, 0x7a, 0xaf, ++ 0xe3, 0x1f, 0x59, 0xc2, 0x7f, 0x11, 0x74, 0xf7, 0x57, 0xa9, 0xb7, 0x07, ++ 0xb2, 0x6c, 0x94, 0x5f, 0x93, 0xd4, 0xfc, 0x00, 0xd1, 0x5d, 0x9b, 0xc2, ++ 0xdf, 0x1f, 0x0e, 0xd3, 0x63, 0xc6, 0xe3, 0x1e, 0x0d, 0xe3, 0x71, 0xec, ++ 0x15, 0x7e, 0xff, 0x2b, 0x0e, 0xec, 0x3e, 0x63, 0xc8, 0x78, 0xf1, 0x9a, ++ 0x15, 0x1c, 0xc2, 0x60, 0x3e, 0xa1, 0xd8, 0xa1, 0xcb, 0x27, 0x79, 0x52, ++ 0x75, 0xf5, 0x53, 0x66, 0xbb, 0x74, 0xe5, 0x69, 0xde, 0xa1, 0xba, 0xf2, ++ 0x8c, 0xf9, 0x6e, 0x5d, 0x3e, 0xab, 0x76, 0x9c, 0xae, 0x7e, 0xbf, 0x15, ++ 0x9a, 0x2e, 0x9f, 0xe3, 0x2b, 0xd6, 0xd5, 0x1f, 0xd0, 0xe4, 0xd1, 0xe5, ++ 0x07, 0xb5, 0xcc, 0xd6, 0xd5, 0x1f, 0xb2, 0xce, 0xab, 0x2b, 0xbf, 0xc4, ++ 0x3f, 0x5f, 0x57, 0x7e, 0xd9, 0xe6, 0x5a, 0x5d, 0x7e, 0x78, 0xeb, 0x0a, ++ 0x5d, 0xfd, 0xcb, 0xdb, 0x7c, 0xba, 0xf2, 0x91, 0x81, 0x26, 0x5d, 0xf9, ++ 0xe8, 0x3d, 0x2d, 0xba, 0xfc, 0x98, 0xce, 0x75, 0xba, 0xfa, 0x63, 0xf7, ++ 0xf9, 0x75, 0xe5, 0x57, 0x74, 0x6d, 0xd6, 0x95, 0x4f, 0x38, 0xd2, 0xaa, ++ 0xcb, 0x5f, 0xd9, 0xdd, 0xa6, 0xab, 0x7f, 0xf5, 0x99, 0x80, 0x2e, 0x5f, ++ 0xc0, 0xf6, 0xea, 0xea, 0x17, 0x59, 0xdf, 0xd7, 0xe5, 0x27, 0x39, 0xfe, ++ 0xa6, 0xab, 0x7f, 0x4d, 0xea, 0x01, 0x5d, 0xf9, 0xb5, 0xae, 0xa3, 0xba, ++ 0x72, 0x69, 0xb7, 0x4c, 0x19, 0xfa, 0x95, 0xfe, 0xbb, 0xb0, 0x63, 0x4a, ++ 0xdc, 0xff, 0xd4, 0xb5, 0xf7, 0x15, 0x8a, 0x77, 0xa5, 0x5f, 0x52, 0xdc, ++ 0x0d, 0x2e, 0x58, 0x4f, 0x76, 0x7f, 0xae, 0xef, 0x41, 0x80, 0x46, 0xe1, ++ 0xbb, 0x88, 0x3e, 0x0f, 0xc5, 0x7d, 0x9c, 0x78, 0xb0, 0x0f, 0xe5, 0x14, ++ 0xde, 0xbb, 0x76, 0xf2, 0x73, 0x31, 0xa5, 0x14, 0x3f, 0x4a, 0x24, 0x3b, ++ 0x87, 0x54, 0x91, 0x0b, 0xcf, 0xe9, 0x80, 0x1d, 0x10, 0x8b, 0xde, 0x55, ++ 0x4e, 0x0e, 0xda, 0xc9, 0x31, 0x41, 0x7b, 0x2c, 0xf3, 0x6c, 0xc8, 0x39, ++ 0xb9, 0xf3, 0xd9, 0x63, 0xd7, 0x64, 0x33, 0x9a, 0xc7, 0x5d, 0xd9, 0xde, ++ 0xfc, 0xec, 0x24, 0xf4, 0x3f, 0xb6, 0x4e, 0xa6, 0x77, 0xc1, 0x99, 0x6f, ++ 0x35, 0xce, 0x43, 0xbe, 0x73, 0xf7, 0x6e, 0xd8, 0x7b, 0xc8, 0x32, 0xbd, ++ 0xd6, 0x7a, 0x84, 0x19, 0x43, 0xec, 0xbf, 0xbd, 0x51, 0x2d, 0x99, 0xa3, ++ 0xce, 0xe1, 0xbf, 0x5f, 0x6b, 0x3d, 0xc1, 0xf0, 0x9d, 0xe5, 0x9e, 0x7e, ++ 0x45, 0xbc, 0x42, 0x81, 0xf5, 0x2d, 0x0b, 0xe9, 0xff, 0x01, 0xf0, 0x17, ++ 0x8c, 0x03, 0x19, 0x6b, 0xa9, 0x03, 0xbe, 0xc1, 0x7d, 0xe1, 0x3a, 0x07, ++ 0xe5, 0x1f, 0xaa, 0x4b, 0xa5, 0xfc, 0xc3, 0x75, 0x2e, 0x4a, 0xd7, 0xd5, ++ 0x0d, 0xa5, 0xf4, 0xb1, 0x3a, 0x37, 0x95, 0xaf, 0xaf, 0x1b, 0x47, 0xf9, ++ 0x27, 0xeb, 0x34, 0xca, 0xfb, 0xeb, 0x8a, 0x29, 0x7d, 0xaa, 0xce, 0x43, ++ 0xdf, 0x37, 0xd6, 0xcd, 0xa6, 0xfc, 0x33, 0xe0, 0x17, 0x63, 0xba, 0x19, ++ 0xfc, 0x64, 0x4c, 0x9f, 0x05, 0x7f, 0x17, 0xcb, 0xb7, 0x80, 0xff, 0x8b, ++ 0xf9, 0x17, 0xea, 0x7c, 0x94, 0xb6, 0xd6, 0x35, 0xd1, 0xf7, 0x97, 0xea, ++ 0x5a, 0x28, 0xbf, 0xbd, 0x6e, 0x1d, 0xe5, 0x7f, 0x5b, 0xe7, 0xa7, 0xb4, ++ 0xad, 0x6e, 0x33, 0xa5, 0xbf, 0xab, 0x6b, 0xa5, 0xf2, 0xf6, 0xba, 0x36, ++ 0xca, 0xbf, 0x5e, 0x17, 0xa0, 0x7c, 0xa0, 0x6e, 0x0f, 0xe5, 0x77, 0xd4, ++ 0x75, 0x52, 0x7e, 0x57, 0xdd, 0x3e, 0xca, 0xef, 0xae, 0xeb, 0xa2, 0x74, ++ 0x4f, 0xdd, 0x11, 0x4a, 0xdf, 0xaa, 0xeb, 0xa6, 0xf2, 0xb7, 0xeb, 0xce, ++ 0x50, 0xfe, 0x98, 0x88, 0xb7, 0x2e, 0xcf, 0x56, 0x74, 0xf7, 0x95, 0x64, ++ 0x5e, 0xbe, 0xc7, 0x20, 0xed, 0xbf, 0x69, 0x68, 0xbf, 0x23, 0x71, 0x8c, ++ 0x33, 0x7d, 0xa9, 0xb3, 0xdf, 0xc3, 0xec, 0xe8, 0x70, 0x7c, 0xc8, 0x71, ++ 0x82, 0xef, 0x27, 0x0c, 0x7e, 0xaa, 0x21, 0xc4, 0x7f, 0xf2, 0x65, 0x73, ++ 0xff, 0x4a, 0xbe, 0xc7, 0x10, 0xfe, 0x8e, 0x02, 0x13, 0xf6, 0xa9, 0x7c, ++ 0xf7, 0x54, 0xbe, 0xd7, 0x50, 0x29, 0xe6, 0x55, 0x25, 0xf8, 0x61, 0x0c, ++ 0xd2, 0xe7, 0x50, 0xa2, 0xcf, 0xb7, 0x2f, 0xc6, 0x5f, 0x90, 0xfe, 0xa0, ++ 0x2d, 0xc9, 0xdb, 0x42, 0xf4, 0x99, 0x65, 0xf0, 0x91, 0x3f, 0x6c, 0xe3, ++ 0xf7, 0x89, 0x2f, 0x4f, 0xf2, 0x3e, 0x98, 0x3d, 0x06, 0xf7, 0x0b, 0x2b, ++ 0x76, 0xd3, 0x78, 0x0e, 0x37, 0xed, 0x1b, 0x96, 0x58, 0x02, 0x49, 0xb3, ++ 0x72, 0xe9, 0x9d, 0x70, 0x8a, 0xcb, 0xf5, 0x35, 0x5e, 0x8d, 0x38, 0xf7, ++ 0xdd, 0x67, 0xf9, 0xeb, 0x47, 0x33, 0xd1, 0x9e, 0x2e, 0xfe, 0x41, 0xa5, ++ 0x77, 0xb6, 0xde, 0x35, 0xd9, 0x67, 0xa3, 0xff, 0xff, 0x8c, 0xc0, 0xc3, ++ 0x33, 0xd9, 0x06, 0x5d, 0xba, 0x2d, 0xc9, 0xbb, 0x09, 0xe7, 0xf3, 0xad, ++ 0xbd, 0xf6, 0x36, 0x03, 0xcc, 0xff, 0xdb, 0xab, 0x96, 0x3e, 0x73, 0x47, ++ 0x4e, 0xd0, 0x4f, 0xbe, 0x1e, 0x5d, 0x4d, 0xf0, 0x6f, 0xa6, 0x33, 0x97, ++ 0x89, 0xce, 0x15, 0x32, 0xed, 0xcd, 0x1c, 0xb4, 0x9b, 0xc0, 0xb0, 0xc2, ++ 0xfc, 0x2c, 0xe6, 0xa3, 0x74, 0x5c, 0xa2, 0xf7, 0x05, 0xec, 0xe7, 0x66, ++ 0x30, 0xb8, 0x31, 0xef, 0x1d, 0x6f, 0xc9, 0x8e, 0xb4, 0xae, 0xf0, 0x79, ++ 0xbd, 0x2a, 0xf0, 0xf5, 0x6a, 0xb6, 0x41, 0x97, 0x1e, 0x48, 0xf2, 0xb6, ++ 0x21, 0xfc, 0xbe, 0xb5, 0x6b, 0x34, 0xaf, 0x77, 0xaf, 0xb8, 0x66, 0x30, ++ 0xae, 0x4b, 0xce, 0xab, 0xbf, 0x78, 0x77, 0x64, 0x1a, 0xeb, 0x7e, 0x12, ++ 0xe7, 0xf7, 0xed, 0x6b, 0x5f, 0x1d, 0x56, 0x06, 0x04, 0xe1, 0x2f, 0xfd, ++ 0x71, 0xba, 0xd7, 0x8f, 0x72, 0x6c, 0xa9, 0x22, 0xde, 0xb5, 0xeb, 0xf5, ++ 0x8e, 0x00, 0x95, 0x97, 0xde, 0xa9, 0x90, 0x7d, 0x36, 0x07, 0xfc, 0x19, ++ 0xdc, 0x1f, 0x92, 0xef, 0x06, 0x9c, 0xaa, 0x35, 0xd1, 0x3b, 0xf2, 0xf8, ++ 0xce, 0x00, 0xee, 0x9f, 0x9d, 0xaa, 0xfd, 0xcc, 0x86, 0xe4, 0x0c, 0xf5, ++ 0x18, 0xee, 0x6f, 0x34, 0xe0, 0x01, 0x1d, 0x28, 0x6f, 0xf8, 0x29, 0xbf, ++ 0x4f, 0x5f, 0x8a, 0xef, 0x62, 0x8c, 0xc2, 0x77, 0x0b, 0xac, 0xbc, 0xdf, ++ 0xbb, 0x15, 0xa2, 0xbb, 0xa4, 0xe4, 0x1c, 0x7e, 0xff, 0x19, 0xec, 0x3d, ++ 0xf2, 0x9f, 0x12, 0xbb, 0xe9, 0x9e, 0x1e, 0xd0, 0xc9, 0x9f, 0x11, 0x6e, ++ 0x0b, 0xaf, 0x50, 0xe9, 0xde, 0xf9, 0xbb, 0x06, 0xff, 0x60, 0x85, 0xf6, ++ 0x93, 0x2b, 0xcc, 0x0a, 0xcc, 0xaf, 0x2a, 0x11, 0xe8, 0xa3, 0x7f, 0xdf, ++ 0x74, 0xb0, 0x44, 0xdc, 0x17, 0x90, 0xdf, 0x81, 0xbe, 0x3e, 0x41, 0xb8, ++ 0x7d, 0xf9, 0xea, 0xd8, 0xa1, 0x14, 0x7f, 0x7f, 0xfd, 0x0a, 0x17, 0xc2, ++ 0xab, 0xc1, 0xc0, 0xef, 0x0f, 0xf9, 0xde, 0x52, 0xf9, 0xef, 0x2e, 0x09, ++ 0x11, 0xad, 0x4e, 0x18, 0x4e, 0x71, 0x46, 0x66, 0x74, 0xbb, 0x31, 0x5e, ++ 0x54, 0x22, 0xee, 0x9b, 0x74, 0xa8, 0x6c, 0x45, 0xa4, 0xf7, 0xc4, 0x95, ++ 0x7e, 0x9c, 0x8e, 0xde, 0x4d, 0xe5, 0xef, 0xe7, 0x35, 0x84, 0xed, 0xb3, ++ 0xfc, 0x53, 0xd0, 0xd5, 0x3f, 0x05, 0xbd, 0x95, 0xec, 0xd8, 0x4b, 0xef, ++ 0x08, 0x2d, 0xd9, 0xc3, 0xdf, 0x3b, 0x64, 0xb9, 0x5d, 0xc3, 0x42, 0xdf, ++ 0x9d, 0xe9, 0x59, 0xcf, 0x8a, 0xb7, 0x2e, 0x19, 0x18, 0xb2, 0x8e, 0x9a, ++ 0xb6, 0x03, 0xfc, 0x7c, 0x05, 0xeb, 0x1a, 0x16, 0x7a, 0x9e, 0x3c, 0x5d, ++ 0x8c, 0x2f, 0xe9, 0x48, 0x35, 0xdb, 0xbd, 0x1b, 0x6c, 0xa1, 0xf3, 0xeb, ++ 0xa1, 0x6b, 0xd6, 0x0f, 0xe9, 0x27, 0x1e, 0xe8, 0x7a, 0x00, 0xd1, 0xf5, ++ 0x61, 0xdc, 0x57, 0x9c, 0x66, 0x71, 0xc5, 0xcd, 0x82, 0xb4, 0x0b, 0x40, ++ 0x84, 0xef, 0xfb, 0x78, 0x7f, 0xed, 0xa0, 0xf3, 0x41, 0xf2, 0x9c, 0xd0, ++ 0x3c, 0xe6, 0xa1, 0xb4, 0x0a, 0xc8, 0x00, 0xe9, 0xd8, 0xe3, 0x5b, 0x4b, ++ 0xef, 0xb9, 0x2e, 0xc4, 0x5f, 0x62, 0xc5, 0xf7, 0x78, 0xc6, 0xcd, 0xcd, ++ 0xc6, 0x7c, 0x0d, 0xeb, 0x9e, 0x98, 0x0a, 0x70, 0xbb, 0xa9, 0xa9, 0xfe, ++ 0x4d, 0x7c, 0x0e, 0xef, 0x86, 0x96, 0xb5, 0x93, 0x30, 0xbe, 0x3a, 0xc3, ++ 0x5f, 0xf6, 0x26, 0xa6, 0xd3, 0x37, 0x2a, 0x87, 0xd1, 0x4f, 0x05, 0xbe, ++ 0x88, 0xef, 0x87, 0xf1, 0x10, 0xa5, 0x76, 0x15, 0x1e, 0xc9, 0xbc, 0x65, ++ 0x4b, 0xc1, 0x2a, 0xdc, 0x7a, 0x99, 0xa6, 0x72, 0x7c, 0xb0, 0x3f, 0x72, ++ 0x7c, 0x00, 0xdd, 0x68, 0xaa, 0xb3, 0xf7, 0x3a, 0x81, 0x0f, 0xd2, 0xf8, ++ 0x3a, 0x34, 0x5a, 0x87, 0x1a, 0x5b, 0xac, 0xe3, 0x83, 0xd2, 0x95, 0x4c, ++ 0x53, 0x12, 0x83, 0xe7, 0xdd, 0x7b, 0xf8, 0x62, 0xdc, 0xa2, 0x4f, 0x70, ++ 0x4b, 0x8d, 0x19, 0xbb, 0x69, 0xdf, 0xbc, 0xe6, 0x75, 0x8b, 0x13, 0xf1, ++ 0xbc, 0x90, 0x71, 0xbd, 0x1d, 0x8c, 0x67, 0x48, 0x7d, 0xcd, 0x88, 0xce, ++ 0x17, 0xb1, 0x68, 0x37, 0xd6, 0x3b, 0x26, 0xe8, 0xfa, 0x58, 0x16, 0x23, ++ 0xba, 0x3e, 0xa6, 0x30, 0xba, 0xa7, 0x2e, 0xed, 0x48, 0x96, 0xed, 0x4d, ++ 0x1d, 0x35, 0x20, 0xa8, 0x77, 0x8f, 0x19, 0xfc, 0x79, 0xb1, 0x03, 0x48, ++ 0x2f, 0xbb, 0x71, 0xbd, 0xbb, 0x53, 0x6f, 0x70, 0x61, 0x1c, 0x6c, 0x51, ++ 0xa2, 0x95, 0xde, 0x3f, 0x3d, 0x16, 0xef, 0xcf, 0x0e, 0x7b, 0xe7, 0x83, ++ 0xde, 0x23, 0x92, 0x71, 0xac, 0x07, 0x4c, 0x3c, 0xae, 0x14, 0x3e, 0x2f, ++ 0x65, 0xdc, 0x6e, 0xfe, 0x7b, 0x18, 0x66, 0xe6, 0xc3, 0xfd, 0x09, 0xfc, ++ 0xfd, 0xe3, 0x3c, 0xe4, 0x67, 0x7c, 0x37, 0x47, 0xa1, 0x77, 0xa0, 0xbb, ++ 0x90, 0xef, 0x4d, 0x85, 0x1e, 0x57, 0xa4, 0xfe, 0x1b, 0x45, 0xbf, 0x7b, ++ 0xbe, 0xe7, 0xfe, 0xae, 0x0f, 0xd6, 0x83, 0xf7, 0x1b, 0x7b, 0x8d, 0xe3, ++ 0x10, 0xe3, 0x44, 0xf3, 0x71, 0xa4, 0xfe, 0xe8, 0xf9, 0xbd, 0xe5, 0x64, ++ 0xa6, 0x1b, 0x6f, 0x7a, 0x3f, 0xce, 0xcf, 0xef, 0xda, 0x35, 0x9a, 0x7f, ++ 0xbd, 0x21, 0x9e, 0xe4, 0x4d, 0x9a, 0xd5, 0xeb, 0x41, 0x7c, 0xc9, 0xb8, ++ 0x8e, 0xf4, 0x03, 0xf7, 0xe4, 0x7c, 0x3e, 0x90, 0xfc, 0xf5, 0xef, 0x1a, ++ 0x32, 0xd1, 0x3e, 0xa7, 0x77, 0x08, 0xd0, 0xfe, 0xbe, 0x8a, 0xcb, 0xa5, ++ 0x77, 0x4d, 0x2e, 0x7a, 0x77, 0xf7, 0xdd, 0x82, 0x1c, 0x8a, 0xdf, 0x4b, ++ 0x79, 0x7b, 0xfd, 0x38, 0x1e, 0xff, 0xba, 0x5e, 0xc6, 0xbb, 0xf2, 0xc3, ++ 0xe2, 0x5d, 0x61, 0xf1, 0x16, 0x96, 0x1f, 0x39, 0xfe, 0xc5, 0x98, 0xdb, ++ 0x84, 0xe3, 0x5e, 0xc2, 0x3e, 0x92, 0xf0, 0xa1, 0x38, 0xcb, 0x8e, 0x7c, ++ 0x23, 0xe1, 0x5d, 0xfe, 0xbe, 0xd2, 0x0e, 0xe1, 0x7f, 0x9e, 0x2a, 0x4e, ++ 0xcc, 0x45, 0x3a, 0xff, 0x5d, 0x3f, 0x55, 0x77, 0xae, 0x40, 0xa6, 0x6b, ++ 0x44, 0x7c, 0xb4, 0x39, 0xec, 0xbd, 0xeb, 0x35, 0xb9, 0xcb, 0x1c, 0x78, ++ 0x1e, 0xc0, 0xf2, 0x3c, 0xdf, 0xef, 0xbd, 0xbf, 0x30, 0x7a, 0x7e, 0xe8, ++ 0x39, 0xf4, 0x27, 0x07, 0xf1, 0xf3, 0x29, 0xee, 0xc1, 0x05, 0x9b, 0x11, ++ 0x4e, 0xc3, 0x6c, 0xfe, 0x42, 0x52, 0xcb, 0x9a, 0xd1, 0x85, 0xf3, 0x56, ++ 0xc4, 0x3a, 0x2e, 0x73, 0x00, 0x9c, 0x0d, 0x68, 0x6f, 0x7a, 0x44, 0x9c, ++ 0xd3, 0x6d, 0xe5, 0xf1, 0xa5, 0x89, 0xa4, 0x97, 0x25, 0x7e, 0x2f, 0x54, ++ 0x2f, 0x3f, 0x6b, 0xf4, 0xaf, 0x8c, 0xc6, 0x75, 0x26, 0xf2, 0xdf, 0x19, ++ 0xb0, 0xaf, 0xb3, 0x92, 0xdc, 0x54, 0x5b, 0xb5, 0x00, 0x1e, 0x89, 0xfe, ++ 0x72, 0xd0, 0x8c, 0x55, 0x48, 0xb7, 0xcc, 0xe8, 0x19, 0x8a, 0xe3, 0x74, ++ 0xe4, 0x45, 0x33, 0x1b, 0xd4, 0xff, 0xb6, 0xc3, 0x4c, 0xf1, 0xa7, 0xd7, ++ 0x0d, 0xe5, 0xbf, 0xc6, 0xf3, 0xea, 0xdd, 0x7f, 0xb3, 0x30, 0x3c, 0xdf, ++ 0xd0, 0x6a, 0xcf, 0x30, 0xa2, 0x71, 0xdb, 0xfa, 0x3d, 0xff, 0x5d, 0xab, ++ 0x56, 0xfb, 0x84, 0xc9, 0xfc, 0xdd, 0x49, 0x16, 0x83, 0xef, 0x63, 0x8e, ++ 0x74, 0xb0, 0xa7, 0x5f, 0x44, 0xe4, 0x88, 0x7b, 0x61, 0xad, 0x0a, 0xdb, ++ 0xc3, 0x1f, 0x69, 0xd5, 0x62, 0xf0, 0x7d, 0xb7, 0x56, 0x03, 0x3b, 0x7d, ++ 0x35, 0xcc, 0xeb, 0x25, 0xdb, 0xa8, 0x07, 0x2f, 0x27, 0x12, 0xf3, 0xa8, ++ 0xb8, 0xce, 0x67, 0x07, 0x7a, 0xd7, 0xe1, 0x3c, 0xf2, 0x58, 0x2d, 0xe5, ++ 0xef, 0x37, 0x7b, 0xe6, 0x6f, 0x80, 0x71, 0xef, 0x77, 0x5a, 0x89, 0x2e, ++ 0x0a, 0x07, 0x7a, 0x1e, 0xe7, 0xf3, 0x64, 0xab, 0xa6, 0xc2, 0xfc, 0xae, ++ 0x2a, 0x52, 0xe8, 0xf7, 0xd6, 0x56, 0x89, 0xdf, 0x77, 0xb0, 0xbb, 0xa3, ++ 0x75, 0xef, 0xec, 0x7a, 0xce, 0x0c, 0x26, 0x3d, 0xf1, 0x4c, 0x3f, 0xae, ++ 0x57, 0x1b, 0x53, 0xb5, 0x4e, 0xbc, 0xd0, 0xd1, 0x27, 0xdc, 0x1c, 0xc6, ++ 0x6e, 0xdd, 0xfb, 0x58, 0x2c, 0x93, 0xe2, 0x72, 0x12, 0x8e, 0xa1, 0xf8, ++ 0x72, 0xe4, 0xe9, 0xf0, 0xe5, 0x35, 0x85, 0xe2, 0xab, 0xe7, 0x77, 0x6b, ++ 0x24, 0xbe, 0xf8, 0xef, 0xd6, 0x5c, 0x28, 0xbe, 0xea, 0xfa, 0x31, 0x9a, ++ 0xaf, 0xa4, 0x47, 0x5f, 0xa1, 0x6b, 0xed, 0xc4, 0x5c, 0xae, 0xbf, 0x1a, ++ 0xa8, 0x96, 0x23, 0x17, 0xfb, 0xdf, 0x11, 0x9d, 0x31, 0x2c, 0xf4, 0x77, ++ 0x01, 0x24, 0x3d, 0x4a, 0xfa, 0x8c, 0x40, 0x97, 0x4b, 0x77, 0xa2, 0xdc, ++ 0xcd, 0x32, 0x38, 0x30, 0xfe, 0x79, 0xcf, 0xd4, 0x68, 0xd2, 0x63, 0x92, ++ 0x4e, 0x25, 0x7d, 0x7e, 0x9c, 0xd3, 0x43, 0xa7, 0x43, 0xfa, 0x63, 0x1c, ++ 0xde, 0xe6, 0x99, 0x84, 0xb2, 0x22, 0x9c, 0x4e, 0x31, 0xbe, 0x15, 0x4a, ++ 0x8f, 0xa5, 0x7d, 0xd2, 0x2d, 0x73, 0x84, 0xf2, 0xe5, 0x34, 0xb0, 0x13, ++ 0xe2, 0x9c, 0x68, 0xd7, 0x1c, 0xd9, 0xd8, 0x1a, 0x42, 0x8f, 0xa5, 0xb5, ++ 0x5f, 0x19, 0xb9, 0x9c, 0x38, 0x7b, 0x75, 0x74, 0x5e, 0x30, 0x1e, 0x37, ++ 0x2d, 0x5f, 0x61, 0x9f, 0x86, 0xe2, 0x15, 0xfe, 0xfb, 0x74, 0xa8, 0x58, ++ 0x1f, 0xd9, 0x35, 0x46, 0xf2, 0xa7, 0x24, 0xfc, 0x2e, 0x14, 0xce, 0xa6, ++ 0x1b, 0xeb, 0x87, 0xa2, 0x9d, 0xb6, 0x1a, 0xef, 0x0d, 0x02, 0xbc, 0x9a, ++ 0x14, 0xb7, 0x96, 0x02, 0xfd, 0x19, 0x6b, 0x0f, 0xdc, 0x81, 0xdf, 0x57, ++ 0x89, 0x7b, 0xbb, 0xbe, 0x61, 0x66, 0x6e, 0x3f, 0x09, 0xfe, 0x90, 0xfd, ++ 0x7d, 0x39, 0xa8, 0xf0, 0x38, 0xd2, 0xa3, 0x7d, 0xec, 0x89, 0x98, 0x4a, ++ 0xa8, 0xf7, 0x6d, 0xb2, 0xc1, 0x85, 0xc0, 0x59, 0xe5, 0x2a, 0x7f, 0x91, ++ 0xf8, 0x6d, 0x5f, 0x0c, 0xbd, 0x37, 0x11, 0x9b, 0xd0, 0x39, 0xff, 0x69, ++ 0xe2, 0x9f, 0x21, 0x0c, 0xf7, 0xf3, 0xbe, 0x5d, 0xe0, 0xed, 0x87, 0xfb, ++ 0xea, 0xf7, 0x02, 0x9e, 0x3e, 0xa5, 0xfb, 0x39, 0xfe, 0x14, 0xfe, 0xee, ++ 0x61, 0x57, 0x0a, 0x7f, 0x5f, 0xd6, 0x25, 0xde, 0xa1, 0xf7, 0xa6, 0xf2, ++ 0xef, 0x4c, 0x94, 0xfb, 0x29, 0x7f, 0x47, 0x4e, 0x7f, 0xe1, 0x57, 0x68, ++ 0xa2, 0x7e, 0x17, 0xd5, 0xbf, 0xd7, 0xdc, 0x62, 0x8d, 0xc6, 0x71, 0x72, ++ 0xac, 0x8e, 0xa7, 0x42, 0xe8, 0xfc, 0x6a, 0x11, 0x1f, 0xff, 0x1f, 0xc1, ++ 0x80, 0x23, 0x7d, 0x00, 0x80, 0x00, 0x00, 0x00, 0x1f, 0x8b, 0x08, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xed, 0x7d, 0x0d, 0x78, 0x54, 0xd5, ++ 0xb5, 0xe8, 0x3e, 0x33, 0x67, 0x7e, 0x33, 0x09, 0x27, 0xc9, 0x24, 0x0c, ++ 0xf9, 0x81, 0x33, 0xc9, 0x24, 0x84, 0x64, 0x02, 0x93, 0x04, 0x10, 0x44, ++ 0x65, 0x12, 0x02, 0x0d, 0x08, 0x3a, 0xfc, 0xd5, 0x20, 0x89, 0x0c, 0x8a, ++ 0xde, 0xa8, 0x24, 0x93, 0x42, 0x6c, 0xa3, 0xd7, 0x77, 0x33, 0x90, 0x80, ++ 0x01, 0xec, 0x2d, 0xa2, 0xb5, 0x68, 0x79, 0x3a, 0xd0, 0x42, 0xf1, 0xaf, ++ 0x37, 0x28, 0xa5, 0xa1, 0x8d, 0x74, 0x12, 0x7e, 0x2e, 0x5a, 0x2a, 0x83, ++ 0xd5, 0x16, 0x5b, 0xb5, 0x81, 0xfa, 0xac, 0xb6, 0x05, 0x82, 0x78, 0x5b, ++ 0xbc, 0x97, 0x96, 0xbb, 0xd6, 0xda, 0xe7, 0x64, 0xe6, 0x4c, 0x26, 0x80, ++ 0xf6, 0xbe, 0xbe, 0xef, 0xdd, 0xf7, 0xe6, 0x5e, 0xbb, 0xb3, 0xcf, 0xde, ++ 0x67, 0xff, 0xac, 0xbd, 0xfe, 0xd7, 0xda, 0x87, 0x1c, 0x59, 0xc7, 0x58, ++ 0x06, 0x63, 0xec, 0x52, 0xbb, 0x3c, 0x3f, 0x99, 0xb1, 0x1c, 0x59, 0xa0, ++ 0xfa, 0xe3, 0x6d, 0x5b, 0x7d, 0x1f, 0xb8, 0x18, 0xdb, 0xd0, 0x16, 0xa2, ++ 0x32, 0x7d, 0x6e, 0x88, 0xf9, 0x4b, 0x19, 0xb3, 0x16, 0x05, 0xe5, 0x20, ++ 0xf4, 0x33, 0xaf, 0x65, 0xfe, 0x2e, 0x1b, 0x63, 0x97, 0xf1, 0x37, 0x3d, ++ 0x5a, 0x3e, 0xe0, 0x14, 0x19, 0x9b, 0x04, 0xed, 0x7d, 0x4f, 0x31, 0x19, ++ 0xfa, 0xa5, 0xbb, 0x3c, 0x82, 0x1f, 0xfa, 0xd9, 0xe7, 0xc2, 0x78, 0x45, ++ 0x8c, 0x7e, 0x97, 0xe1, 0xbf, 0x5b, 0x18, 0x0b, 0x8e, 0x28, 0x87, 0x7e, ++ 0x3b, 0x98, 0x97, 0x4d, 0x64, 0x6c, 0x9d, 0x6c, 0x0d, 0x05, 0x85, 0xa1, ++ 0xe3, 0xdd, 0x92, 0x51, 0x75, 0x54, 0x4c, 0x19, 0xfa, 0x7c, 0xb0, 0xfd, ++ 0x06, 0x81, 0x9d, 0x36, 0x47, 0xc7, 0xc5, 0xdf, 0x69, 0x75, 0x1e, 0x3d, ++ 0x8c, 0xff, 0x57, 0xbd, 0xbf, 0xcb, 0x8d, 0x35, 0x87, 0x8e, 0x65, 0x32, ++ 0xd6, 0x82, 0x7d, 0x65, 0xc6, 0xaa, 0xf3, 0xe0, 0x0f, 0x9c, 0xb7, 0xd5, ++ 0xb8, 0xdd, 0x04, 0xf3, 0x4e, 0x96, 0x53, 0x69, 0xdf, 0x9f, 0xda, 0xab, ++ 0x46, 0x30, 0xf7, 0xf0, 0xf3, 0x3d, 0xd3, 0x06, 0x0b, 0x2f, 0x64, 0x2c, ++ 0xd4, 0x66, 0xa6, 0x72, 0x47, 0x9b, 0xc4, 0x82, 0x46, 0xc6, 0xbe, 0xdb, ++ 0xe6, 0xa0, 0xfa, 0xae, 0x36, 0x99, 0xca, 0xdd, 0x6d, 0x45, 0x54, 0x3e, ++ 0xdf, 0xe6, 0xa1, 0xf6, 0x17, 0xdb, 0xa6, 0x50, 0xfd, 0xfb, 0x6d, 0x5e, ++ 0xaa, 0x77, 0xb5, 0xd5, 0x50, 0xfd, 0xe5, 0x36, 0x1f, 0xd5, 0xf7, 0xb6, ++ 0xd5, 0x52, 0x7d, 0x5f, 0x9b, 0x9f, 0xca, 0xee, 0xb6, 0x06, 0x2a, 0x7f, ++ 0xd4, 0xd6, 0x4c, 0xed, 0x3d, 0x6d, 0xad, 0x54, 0x9f, 0x6e, 0x62, 0xcd, ++ 0xb4, 0x9f, 0xa2, 0xa0, 0x63, 0x01, 0x9c, 0x47, 0xe7, 0x83, 0x46, 0xaf, ++ 0x0c, 0xf0, 0x69, 0x54, 0xce, 0xf1, 0xa0, 0x37, 0x2f, 0xdd, 0x63, 0x67, ++ 0xcc, 0x52, 0xa4, 0x63, 0x26, 0xe8, 0x66, 0x39, 0xb6, 0x85, 0xe1, 0x7e, ++ 0x2c, 0x0e, 0x9d, 0x37, 0x04, 0xe7, 0xb0, 0xde, 0xb1, 0x85, 0xdd, 0x05, ++ 0xa5, 0x61, 0x72, 0x72, 0xa7, 0x30, 0x02, 0xf6, 0xff, 0x92, 0xad, 0x53, ++ 0x98, 0x00, 0xed, 0xe2, 0xe3, 0x4c, 0x86, 0xe7, 0xcf, 0x08, 0xc1, 0x06, ++ 0xe6, 0x61, 0x6c, 0x91, 0x3c, 0xd6, 0x27, 0x8e, 0x62, 0xcc, 0xe5, 0xf8, ++ 0x4a, 0x55, 0x1a, 0xd4, 0x6f, 0x97, 0x4b, 0x37, 0x9b, 0x9d, 0x8c, 0x15, ++ 0xca, 0xf3, 0x6b, 0xd7, 0xc4, 0xd4, 0xe5, 0xe4, 0xf2, 0xfb, 0xf6, 0x48, ++ 0xd1, 0xfa, 0x18, 0xf7, 0x76, 0xd1, 0x0a, 0xed, 0xcb, 0x42, 0x13, 0x36, ++ 0xdb, 0x05, 0xbe, 0x0e, 0x96, 0xc5, 0xd8, 0xbd, 0x72, 0xb9, 0x6f, 0x0d, ++ 0xe0, 0x51, 0x38, 0x8f, 0x05, 0x11, 0xee, 0x03, 0x4e, 0x63, 0x68, 0x07, ++ 0xb4, 0xaf, 0xc0, 0xf3, 0x12, 0x71, 0xfd, 0x12, 0xad, 0xff, 0x66, 0xd6, ++ 0xee, 0xd0, 0xc1, 0xfa, 0xc7, 0xc8, 0xc6, 0x72, 0x26, 0x50, 0xff, 0x30, ++ 0xb3, 0x5f, 0x7b, 0xff, 0x46, 0x59, 0xa6, 0xe7, 0xf1, 0xef, 0x5d, 0xa9, ++ 0x9f, 0x6e, 0xe2, 0x35, 0xf5, 0x63, 0xfa, 0x2b, 0x8c, 0x87, 0xed, 0xc2, ++ 0x15, 0xc6, 0x31, 0x0b, 0x0b, 0xcd, 0x11, 0x58, 0xfb, 0x26, 0x03, 0xfc, ++ 0x0f, 0x3c, 0x0f, 0x66, 0xd8, 0x42, 0x3b, 0x01, 0x5e, 0x9d, 0x06, 0xb6, ++ 0xcc, 0x07, 0x70, 0xef, 0xb4, 0xf0, 0xf2, 0x88, 0x93, 0xd3, 0xdf, 0xb3, ++ 0xce, 0xaa, 0xf1, 0x4e, 0xa0, 0xa3, 0xf1, 0x4e, 0x7e, 0xae, 0x9d, 0x96, ++ 0xa0, 0x54, 0x85, 0xf3, 0x97, 0xea, 0x3c, 0x3b, 0x10, 0x9d, 0x5b, 0x9d, ++ 0x3f, 0xcf, 0x83, 0xf9, 0xbe, 0xfa, 0xba, 0xc8, 0x36, 0xca, 0x51, 0xfc, ++ 0xec, 0x40, 0x3c, 0x80, 0xf7, 0x0a, 0xc6, 0x24, 0x7b, 0x71, 0x1e, 0xf6, ++ 0x8f, 0xe6, 0x50, 0x01, 0xcc, 0xf3, 0xa5, 0x31, 0x2f, 0x75, 0xa4, 0x41, ++ 0xbd, 0xe0, 0x3b, 0x1e, 0x8f, 0x1e, 0xfa, 0x6f, 0x62, 0x1e, 0x2b, 0xe2, ++ 0x49, 0xf0, 0x51, 0x1d, 0xdb, 0x09, 0xf5, 0x17, 0x26, 0xe6, 0xa7, 0xcd, ++ 0x87, 0xee, 0x25, 0x93, 0x7e, 0x90, 0xe6, 0x07, 0x7c, 0x39, 0x8d, 0x7c, ++ 0x00, 0xc6, 0x09, 0x31, 0x56, 0x83, 0xf8, 0xb6, 0x66, 0xdd, 0x3d, 0x63, ++ 0xfa, 0xa1, 0xfc, 0xd3, 0x09, 0xff, 0x18, 0x09, 0xd6, 0xf9, 0xb8, 0x32, ++ 0xcf, 0x76, 0x43, 0xa4, 0x99, 0xce, 0x73, 0x92, 0x8d, 0xe1, 0xbe, 0x19, ++ 0xdb, 0x9c, 0xa4, 0x73, 0x40, 0x7f, 0x07, 0x1c, 0xd2, 0x75, 0x8c, 0xe9, ++ 0x46, 0xf1, 0xd2, 0x68, 0x90, 0x6e, 0xc7, 0x7e, 0xc6, 0x75, 0x46, 0x16, ++ 0x84, 0xf5, 0x18, 0xff, 0x72, 0x9d, 0xd9, 0x07, 0xe3, 0xb5, 0x5f, 0x34, ++ 0xd5, 0x20, 0x1f, 0x61, 0x2c, 0x92, 0xa4, 0x9b, 0x02, 0xcf, 0x2d, 0x7e, ++ 0x29, 0x15, 0x9e, 0x6f, 0x0e, 0xea, 0x88, 0x2f, 0xb4, 0xcb, 0xb6, 0x90, ++ 0x00, 0xe3, 0x6e, 0xb2, 0x95, 0x1f, 0x95, 0xa1, 0x1e, 0x94, 0x74, 0x9e, ++ 0x02, 0x84, 0xa3, 0x5b, 0x47, 0x70, 0xec, 0xb0, 0x7d, 0x39, 0xa4, 0x87, ++ 0xf1, 0x44, 0x61, 0x4d, 0x03, 0xcb, 0x87, 0xf5, 0x4a, 0x2f, 0x9b, 0x9d, ++ 0xf0, 0x3c, 0xe4, 0xd6, 0x49, 0x48, 0xe7, 0x21, 0xef, 0x82, 0x1a, 0xac, ++ 0x07, 0xfd, 0xa2, 0xa7, 0x40, 0x56, 0x18, 0x04, 0xb6, 0xfb, 0xd3, 0x42, ++ 0x1b, 0x71, 0x5c, 0x36, 0xf0, 0xd3, 0x09, 0xd8, 0x5e, 0xc7, 0x3c, 0x08, ++ 0x87, 0x75, 0x99, 0xff, 0xde, 0x97, 0x04, 0xf5, 0xf6, 0xc5, 0x92, 0x47, ++ 0xcf, 0x7b, 0xcb, 0xe2, 0x64, 0xc6, 0x46, 0xe1, 0x5f, 0x30, 0x65, 0xbb, ++ 0xa1, 0x7f, 0x6d, 0x12, 0xae, 0x63, 0x09, 0xef, 0x0f, 0x7f, 0x79, 0xe6, ++ 0x03, 0x1d, 0xa6, 0x98, 0xf8, 0xf9, 0x7d, 0xa3, 0x77, 0xb6, 0x94, 0x57, ++ 0x8a, 0xcf, 0xc5, 0x60, 0x3f, 0xe7, 0x4b, 0xc2, 0x65, 0x20, 0x44, 0xd1, ++ 0xe0, 0x31, 0x7b, 0xa0, 0x7d, 0xbc, 0xad, 0xbc, 0xc6, 0x0b, 0xa5, 0x98, ++ 0x5c, 0x6e, 0x96, 0x61, 0x9f, 0x1d, 0x52, 0xb9, 0x79, 0x39, 0xed, 0x9f, ++ 0xd9, 0x18, 0xcc, 0x93, 0xce, 0x38, 0x7f, 0x6a, 0x97, 0x74, 0x35, 0x21, ++ 0xa5, 0xfd, 0x2e, 0xa4, 0x77, 0x91, 0x1d, 0x72, 0x4d, 0x26, 0x52, 0xa2, ++ 0xf6, 0x0e, 0xdb, 0x96, 0x5e, 0x84, 0x87, 0x78, 0x37, 0x63, 0x4e, 0x19, ++ 0xd7, 0x07, 0xf3, 0xa9, 0x7c, 0x0f, 0xe0, 0x61, 0xce, 0xbf, 0xe1, 0xa8, ++ 0x0c, 0xfb, 0xe8, 0xbc, 0x27, 0x8d, 0xf6, 0x21, 0x0a, 0x1e, 0xaa, 0xb3, ++ 0xbb, 0x45, 0x5a, 0x77, 0x96, 0x6c, 0x0d, 0xb3, 0xf1, 0x70, 0x8e, 0xc6, ++ 0x79, 0x47, 0x19, 0xf0, 0x8f, 0x2c, 0xf3, 0xfd, 0x73, 0xb1, 0x3e, 0xaa, ++ 0x41, 0xfc, 0xa0, 0x3f, 0x86, 0x4f, 0x8f, 0xf4, 0x6b, 0xeb, 0x19, 0xb5, ++ 0xda, 0x7a, 0x3a, 0x83, 0xba, 0x39, 0x3a, 0xef, 0x6f, 0x14, 0xf9, 0x11, ++ 0x0f, 0xb7, 0x78, 0x78, 0x8c, 0x92, 0x3a, 0x4e, 0xe0, 0xfa, 0x47, 0xf9, ++ 0x45, 0x7a, 0x18, 0xbf, 0xfe, 0xa7, 0xa4, 0x27, 0x52, 0x2b, 0x19, 0xae, ++ 0xd3, 0x46, 0xeb, 0xcc, 0xb4, 0xdd, 0x59, 0x09, 0x10, 0x82, 0xa1, 0x7d, ++ 0x6b, 0x10, 0xff, 0xfe, 0xd6, 0x75, 0x8e, 0x97, 0x16, 0x98, 0x9d, 0x30, ++ 0xff, 0x78, 0xbb, 0x0e, 0xc1, 0xc9, 0x26, 0xb0, 0x81, 0xb5, 0x38, 0xee, ++ 0x26, 0x05, 0xdf, 0x3b, 0x9d, 0xfc, 0x3c, 0xa3, 0x74, 0xa5, 0x57, 0xe9, ++ 0x72, 0x24, 0xd2, 0xe5, 0x98, 0x56, 0x1d, 0x0b, 0xc6, 0xc8, 0x1d, 0x67, ++ 0xd0, 0xca, 0x82, 0x31, 0xf3, 0xe5, 0x77, 0xa6, 0x69, 0xea, 0x05, 0x9b, ++ 0xb3, 0x34, 0xfd, 0xc7, 0x6e, 0xcd, 0xd3, 0xb4, 0x8f, 0x0b, 0x15, 0x6b, ++ 0xda, 0x4b, 0x76, 0x97, 0x6b, 0xea, 0xa5, 0x5d, 0xd7, 0x6b, 0xfa, 0x4f, ++ 0xe8, 0xae, 0xd2, 0xd4, 0xcb, 0xc2, 0x73, 0x34, 0xfd, 0x2b, 0x8e, 0x2e, ++ 0xd0, 0xd4, 0x27, 0x45, 0x6e, 0xd7, 0xf4, 0xbf, 0xee, 0xe4, 0x9d, 0x9a, ++ 0xf6, 0xa9, 0xfd, 0xf7, 0x69, 0xda, 0xa7, 0x7d, 0xb4, 0x4a, 0x53, 0xbf, ++ 0x71, 0xe0, 0x21, 0x4d, 0x7f, 0x20, 0xe3, 0x86, 0xae, 0x04, 0x72, 0x32, ++ 0x55, 0xe1, 0x57, 0x1d, 0x0e, 0x6f, 0xc4, 0x9b, 0x40, 0x9e, 0xab, 0x25, ++ 0x93, 0xc4, 0x81, 0xc1, 0xf3, 0x00, 0xde, 0x69, 0x72, 0x00, 0x66, 0xc7, ++ 0xcc, 0x97, 0xec, 0xb1, 0x02, 0x12, 0x47, 0xeb, 0xa0, 0x99, 0x48, 0x1f, ++ 0x26, 0x29, 0x75, 0x92, 0xeb, 0xed, 0xf2, 0x5a, 0xc4, 0xe7, 0x14, 0x23, ++ 0xe1, 0xb3, 0x88, 0xf2, 0x1c, 0xea, 0xab, 0x1e, 0x34, 0x86, 0x4c, 0x88, ++ 0xff, 0x37, 0x79, 0x64, 0xe4, 0x2f, 0x26, 0x27, 0xe7, 0x63, 0xfb, 0x0a, ++ 0xbd, 0xa3, 0x9d, 0xb0, 0xae, 0xca, 0x14, 0x33, 0xc9, 0x05, 0xd1, 0xc6, ++ 0xfb, 0x89, 0xb6, 0x59, 0xa4, 0xa7, 0x8c, 0xde, 0x0a, 0x7c, 0xa9, 0x02, ++ 0xea, 0x12, 0x1b, 0x6c, 0x4f, 0x42, 0xfe, 0xdc, 0x16, 0xf4, 0xb9, 0x5c, ++ 0xd1, 0x75, 0x5b, 0xa4, 0xcd, 0x0c, 0xe9, 0xb7, 0x32, 0xa5, 0x86, 0xf5, ++ 0xdb, 0xa2, 0xef, 0x8b, 0x92, 0x97, 0xf9, 0x93, 0x71, 0x3e, 0x99, 0xeb, ++ 0x3f, 0x52, 0x90, 0xfa, 0x59, 0x64, 0x78, 0x3f, 0x66, 0x5f, 0x07, 0x74, ++ 0x3a, 0x66, 0x43, 0x3e, 0xde, 0x0b, 0x72, 0x02, 0xc6, 0xef, 0x4a, 0xce, ++ 0x16, 0x91, 0xfe, 0xba, 0xfe, 0x52, 0x5c, 0x4d, 0x65, 0xf2, 0xb4, 0x59, ++ 0x88, 0xef, 0x65, 0x12, 0xfb, 0xce, 0xbf, 0x40, 0xff, 0x2e, 0x81, 0x1d, ++ 0x65, 0xa0, 0x27, 0x75, 0xe9, 0xd8, 0x85, 0xe9, 0xb0, 0xef, 0x97, 0x6d, ++ 0xe5, 0x8f, 0x83, 0xb8, 0x06, 0xd6, 0xe8, 0xd3, 0x23, 0xbf, 0x9b, 0xcc, ++ 0x9a, 0xa9, 0x1c, 0xad, 0x63, 0x56, 0x2c, 0xb7, 0x0b, 0xfd, 0xab, 0x19, ++ 0xf4, 0x73, 0x37, 0x9f, 0xa8, 0x1a, 0x09, 0xfd, 0x9e, 0x77, 0xf9, 0xbd, ++ 0xb8, 0xef, 0xaf, 0x83, 0x0e, 0x81, 0xfb, 0xfa, 0xfa, 0x78, 0xae, 0x67, ++ 0xad, 0xcb, 0x9c, 0x23, 0xa3, 0x5e, 0xd6, 0xe9, 0xec, 0x3a, 0x9a, 0x87, ++ 0xeb, 0xc9, 0x00, 0xb9, 0x82, 0x84, 0x20, 0xfa, 0x3c, 0xa8, 0x57, 0xa8, ++ 0xfb, 0xbd, 0x4f, 0x39, 0x4f, 0x31, 0xaf, 0xb3, 0x1f, 0xe5, 0xdf, 0xaa, ++ 0x54, 0xb3, 0x8c, 0xfa, 0x92, 0x68, 0xde, 0xec, 0xfb, 0x00, 0xe0, 0xf5, ++ 0x8c, 0xa1, 0xff, 0xb9, 0x76, 0xa8, 0x77, 0x08, 0xd2, 0xca, 0x2e, 0xe4, ++ 0x8b, 0x0f, 0xda, 0x3c, 0x3b, 0x19, 0xea, 0x8f, 0x1c, 0x6e, 0x72, 0xb2, ++ 0xae, 0x62, 0x2d, 0x8c, 0xdb, 0xb5, 0xc6, 0x2b, 0xa6, 0x42, 0x7b, 0xd7, ++ 0x06, 0xe6, 0xe9, 0x40, 0xfa, 0xb0, 0x57, 0xae, 0x4d, 0x85, 0xe7, 0x05, ++ 0x39, 0xcb, 0x75, 0x69, 0x48, 0x0f, 0xae, 0x35, 0x6b, 0xb1, 0xac, 0x73, ++ 0xe6, 0x11, 0xfc, 0xc6, 0xb9, 0xb7, 0xeb, 0xd2, 0xa1, 0xbd, 0x64, 0x62, ++ 0x65, 0x2d, 0x43, 0xd9, 0x2b, 0xc1, 0x7c, 0xe9, 0xc3, 0xe3, 0x93, 0x3e, ++ 0x65, 0x2b, 0xc3, 0xfd, 0x30, 0x97, 0xf8, 0x21, 0xe2, 0x95, 0x4e, 0x06, ++ 0x3e, 0x03, 0x4b, 0xaf, 0x4c, 0x83, 0xf3, 0x86, 0x79, 0x2d, 0x78, 0xde, ++ 0x02, 0x95, 0x04, 0x07, 0xcb, 0x45, 0x5b, 0xc8, 0x82, 0x75, 0x17, 0x87, ++ 0x8b, 0xc5, 0x2b, 0x84, 0x92, 0xa0, 0x6e, 0x77, 0x79, 0x05, 0xaf, 0x1b, ++ 0xdf, 0xdb, 0x4a, 0xe7, 0x6b, 0x09, 0x6b, 0xf5, 0xd8, 0x2a, 0x97, 0xff, ++ 0x3e, 0xa4, 0x7f, 0xfb, 0x5c, 0xed, 0xb9, 0x8a, 0xe6, 0x27, 0x68, 0x7d, ++ 0x9b, 0x74, 0x9c, 0x2e, 0x3a, 0x53, 0xe5, 0x63, 0x28, 0x9f, 0x3b, 0x9d, ++ 0xae, 0xb4, 0x76, 0x39, 0xba, 0x4e, 0x95, 0xaf, 0x3c, 0xa0, 0xe8, 0x6b, ++ 0xea, 0x73, 0x95, 0xaf, 0xfc, 0x0e, 0xcf, 0x20, 0x23, 0xaa, 0xdf, 0x00, ++ 0x9e, 0x6f, 0xd5, 0xe5, 0xa3, 0x7e, 0xb6, 0x99, 0x21, 0x7f, 0xb2, 0x3c, ++ 0xbc, 0x99, 0x21, 0x5e, 0x5b, 0xa4, 0xa0, 0xcc, 0x50, 0x0f, 0xff, 0xa7, ++ 0x20, 0xe1, 0xb9, 0xaa, 0xdf, 0xae, 0x56, 0x68, 0xa6, 0x3a, 0xaf, 0xd6, ++ 0x8c, 0xf2, 0xfa, 0x82, 0xbd, 0x9c, 0xf4, 0x59, 0x4b, 0xeb, 0x2e, 0x3a, ++ 0xaf, 0x78, 0xb8, 0x59, 0xfa, 0x75, 0xcc, 0x7b, 0x05, 0xb8, 0xa6, 0x14, ++ 0x3e, 0x4d, 0xf2, 0x1d, 0x18, 0xb0, 0x5c, 0x00, 0xf0, 0xe9, 0xcb, 0xb4, ++ 0x35, 0x6c, 0x4f, 0xa0, 0xf7, 0x8f, 0x50, 0xf4, 0x85, 0x0d, 0x40, 0xc6, ++ 0x11, 0x92, 0x57, 0x3e, 0x33, 0xf2, 0x6b, 0x83, 0x1e, 0xf4, 0x55, 0x92, ++ 0x6f, 0xb0, 0x61, 0x90, 0x07, 0x17, 0x24, 0x46, 0xf2, 0x8b, 0x75, 0x39, ++ 0xa9, 0xbe, 0x3a, 0x95, 0xd7, 0xd5, 0x71, 0x56, 0x67, 0x94, 0x8f, 0xbc, ++ 0x92, 0xfe, 0x6d, 0xd9, 0x6a, 0x66, 0xfe, 0x98, 0x7d, 0x6c, 0x80, 0x79, ++ 0x10, 0x2e, 0xeb, 0x2e, 0xcd, 0xaf, 0x41, 0xb8, 0x32, 0x91, 0x88, 0x83, ++ 0x6d, 0xfa, 0x8b, 0x7b, 0xfb, 0x46, 0xa0, 0x2f, 0xd5, 0xae, 0x19, 0xa1, ++ 0xe8, 0x2b, 0x39, 0x38, 0x37, 0x94, 0xa3, 0x8d, 0x8c, 0xec, 0x02, 0x8f, ++ 0x7d, 0x6e, 0x0d, 0xd2, 0x9d, 0xef, 0x62, 0x1e, 0x09, 0xdf, 0x83, 0xce, ++ 0x34, 0x6a, 0xf7, 0x04, 0x99, 0xbe, 0x99, 0xd6, 0x6d, 0x50, 0xe5, 0x92, ++ 0xee, 0xf2, 0x04, 0x5a, 0xab, 0x6c, 0x54, 0xe5, 0x30, 0xa9, 0xb6, 0x5c, ++ 0x6e, 0xc1, 0xff, 0xf7, 0x5e, 0x16, 0x90, 0xef, 0xc7, 0xc8, 0x31, 0x5e, ++ 0x90, 0x5c, 0x57, 0xe5, 0x76, 0xc1, 0x66, 0x6d, 0xfb, 0xd8, 0xad, 0xda, ++ 0xfa, 0xb8, 0xd0, 0x90, 0xf7, 0xdf, 0x42, 0xb9, 0xbf, 0x98, 0xff, 0x0d, ++ 0x72, 0x41, 0xdb, 0xfe, 0xb4, 0x22, 0xbf, 0x17, 0xa3, 0xfc, 0x86, 0x92, ++ 0x2d, 0x32, 0x90, 0xdc, 0x33, 0xc3, 0x8a, 0x2e, 0x73, 0xb9, 0x1b, 0x95, ++ 0x83, 0xc0, 0x17, 0x72, 0xbb, 0xc2, 0x95, 0xc8, 0x46, 0x73, 0x5a, 0x62, ++ 0xe4, 0x21, 0xa3, 0x7d, 0x68, 0xe4, 0x63, 0x95, 0x4b, 0x26, 0xfc, 0xf3, ++ 0x1d, 0x15, 0x0d, 0x78, 0x8e, 0xbe, 0x8b, 0x60, 0x7c, 0x54, 0x0c, 0xe5, ++ 0xcb, 0xa3, 0x4d, 0x1c, 0xde, 0x7d, 0xc6, 0xe4, 0xd0, 0x5a, 0x78, 0xef, ++ 0x51, 0xb0, 0x8b, 0xfc, 0xd0, 0x75, 0x3d, 0xd8, 0x43, 0x7e, 0x20, 0xb5, ++ 0xaf, 0x8b, 0x9e, 0x5f, 0xd6, 0xa1, 0x9d, 0x75, 0x54, 0xef, 0x01, 0x8c, ++ 0x1d, 0x3c, 0xa7, 0xf8, 0x73, 0xf5, 0xe4, 0xa9, 0x7a, 0xaf, 0xef, 0x2d, ++ 0xa4, 0x03, 0xc6, 0xfa, 0x2b, 0x7c, 0xc9, 0x7c, 0x3e, 0x7f, 0xcc, 0x7c, ++ 0x7d, 0xd6, 0x94, 0xf1, 0x0c, 0xec, 0x96, 0x5d, 0x85, 0xfe, 0x5f, 0x61, ++ 0xbf, 0x4f, 0x6a, 0xec, 0x13, 0x91, 0x3f, 0x98, 0x72, 0x98, 0x01, 0xe9, ++ 0x13, 0xe7, 0x67, 0xca, 0xfc, 0xcc, 0x88, 0xfa, 0x33, 0x3f, 0xef, 0x4d, ++ 0x9e, 0x37, 0x9b, 0x0f, 0xc2, 0x3a, 0x1e, 0x39, 0x69, 0x42, 0x75, 0x9c, ++ 0xcd, 0xd4, 0x1f, 0x3b, 0xda, 0x06, 0xf5, 0x55, 0xb9, 0x22, 0xf1, 0x33, ++ 0xe9, 0xba, 0x95, 0xcf, 0x5a, 0x81, 0x0f, 0x54, 0xfd, 0x1a, 0xda, 0xe1, ++ 0x9d, 0x47, 0x64, 0x79, 0x24, 0xe9, 0xe9, 0x47, 0x0d, 0x0c, 0xf5, 0xf4, ++ 0x2a, 0x05, 0x8f, 0xab, 0x14, 0xfb, 0xeb, 0x99, 0x02, 0x03, 0x8d, 0xfb, ++ 0x89, 0x22, 0x5f, 0xce, 0x3a, 0x55, 0xbd, 0x27, 0x68, 0x45, 0xfd, 0x17, ++ 0x2c, 0x02, 0x2b, 0xea, 0xb3, 0x25, 0xbb, 0x81, 0x17, 0x6b, 0xcf, 0x33, ++ 0x89, 0xb7, 0x7b, 0x49, 0xdf, 0x2d, 0xed, 0x8a, 0x6f, 0xf7, 0x32, 0xa4, ++ 0xe3, 0x62, 0x05, 0x5f, 0xa0, 0x6e, 0xab, 0x84, 0x7a, 0x99, 0x52, 0xef, ++ 0x62, 0x42, 0xba, 0x04, 0xe7, 0x38, 0xa1, 0xb6, 0xbf, 0x0f, 0x4d, 0x09, ++ 0xf7, 0x6b, 0x87, 0xad, 0x88, 0x87, 0x7b, 0x2c, 0x5c, 0x7f, 0x7b, 0x5e, ++ 0xc1, 0x87, 0x4c, 0x26, 0x78, 0xc2, 0xb0, 0xfe, 0xcc, 0xdd, 0x36, 0x4f, ++ 0x08, 0xfa, 0x25, 0xeb, 0xd9, 0x9e, 0x08, 0xec, 0xc3, 0x73, 0x48, 0x3c, ++ 0x1d, 0x7b, 0xee, 0xe3, 0x7b, 0xb4, 0x75, 0x37, 0x8b, 0xa9, 0x3b, 0x71, ++ 0x1d, 0xda, 0xfa, 0xa3, 0x72, 0xb3, 0x80, 0x70, 0x79, 0xb4, 0x0e, 0x74, ++ 0x74, 0xd8, 0xb2, 0x35, 0x2f, 0xd9, 0xfe, 0x61, 0x09, 0x43, 0x98, 0x17, ++ 0x22, 0x7e, 0xcd, 0xd4, 0xdb, 0xca, 0xd0, 0x9e, 0x5a, 0x55, 0x69, 0x63, ++ 0x08, 0x57, 0xd3, 0xa9, 0xb1, 0xdf, 0x8a, 0x20, 0xff, 0x38, 0xa1, 0x67, ++ 0x28, 0x17, 0xa4, 0x24, 0xf9, 0xb1, 0x6a, 0x78, 0x5f, 0xfa, 0x69, 0xba, ++ 0x67, 0x8d, 0x1c, 0x3d, 0xff, 0xe7, 0xdb, 0x90, 0x75, 0x33, 0xf6, 0xe4, ++ 0x65, 0x0f, 0xeb, 0x00, 0x9e, 0xfc, 0xf5, 0x2a, 0x6b, 0x03, 0xea, 0xbf, ++ 0x2f, 0xc2, 0x79, 0xa2, 0x1c, 0xf9, 0x3e, 0xd8, 0xd9, 0xd8, 0xde, 0x05, ++ 0xe7, 0x8a, 0xf5, 0x97, 0xc1, 0xce, 0xc6, 0x72, 0x2f, 0xd8, 0xd9, 0xf8, ++ 0x7c, 0x1f, 0xd8, 0xd9, 0x58, 0xef, 0x06, 0x3b, 0x1b, 0xcb, 0x1f, 0x81, ++ 0x9d, 0x8d, 0xcf, 0x7b, 0xc0, 0xce, 0xc6, 0xba, 0xa7, 0xb0, 0x72, 0x74, ++ 0x1e, 0x9c, 0x4f, 0xbd, 0xcd, 0x37, 0x53, 0x40, 0xb8, 0x7a, 0x45, 0x59, ++ 0x02, 0xba, 0x12, 0xa2, 0x70, 0x66, 0x1f, 0x16, 0x61, 0xbd, 0x5f, 0xb8, ++ 0x0c, 0x04, 0x52, 0x27, 0xb1, 0x7e, 0x13, 0xc0, 0xf5, 0xf8, 0x18, 0x99, ++ 0xce, 0xd7, 0xc4, 0x7c, 0x0c, 0xe5, 0x2b, 0xf3, 0x7b, 0xcc, 0x88, 0x97, ++ 0x57, 0x1f, 0xc7, 0xab, 0x8e, 0xe3, 0x37, 0x24, 0x1a, 0x67, 0x0a, 0x8c, ++ 0x43, 0x76, 0x82, 0x59, 0x42, 0xbf, 0x48, 0x1e, 0xbc, 0x31, 0x02, 0x9e, ++ 0x9f, 0x79, 0xf0, 0x57, 0xbb, 0x50, 0x5e, 0xcc, 0x13, 0xfc, 0x1e, 0x5c, ++ 0x6f, 0xe3, 0xa4, 0xd3, 0x46, 0xae, 0x3f, 0x0f, 0x18, 0xb1, 0xff, 0x36, ++ 0x0b, 0xe0, 0x3f, 0xf0, 0xa1, 0x1c, 0x85, 0x0e, 0x82, 0x55, 0x00, 0x4f, ++ 0x94, 0xbb, 0xaf, 0xeb, 0x3d, 0xed, 0xd0, 0xeb, 0xa6, 0x19, 0xa7, 0x56, ++ 0x67, 0x80, 0xfd, 0x5d, 0x95, 0xe7, 0x9c, 0x2f, 0x4e, 0x85, 0xfa, 0xfd, ++ 0xa7, 0x2a, 0x46, 0x43, 0xbd, 0x73, 0xc7, 0xa6, 0xf9, 0x68, 0xcf, 0xdf, ++ 0xf4, 0xbd, 0x53, 0xaf, 0x64, 0x03, 0x0f, 0x3e, 0x9b, 0x37, 0x8f, 0xb7, ++ 0x3f, 0x7e, 0xea, 0x42, 0x0e, 0xb4, 0x8f, 0x60, 0x5f, 0x9b, 0x5f, 0x0d, ++ 0xed, 0x29, 0xe9, 0x5c, 0x3e, 0x6d, 0x13, 0x58, 0x6d, 0xac, 0x7e, 0x77, ++ 0x6b, 0x1e, 0xc7, 0xf3, 0x40, 0xeb, 0x16, 0x92, 0x73, 0xc0, 0xdf, 0x19, ++ 0xc2, 0xa1, 0x3d, 0xd3, 0x47, 0xf2, 0xf1, 0x9c, 0x7d, 0x20, 0x65, 0x39, ++ 0xf4, 0x0f, 0x64, 0x0c, 0x64, 0xde, 0x79, 0x05, 0xfe, 0x1d, 0x68, 0x7d, ++ 0x92, 0xe4, 0x50, 0x7b, 0xca, 0xef, 0x49, 0xff, 0x68, 0x1f, 0x94, 0x17, ++ 0x1e, 0x92, 0x17, 0xea, 0xbc, 0xaa, 0xbc, 0xf8, 0x44, 0xc1, 0x3d, 0x55, ++ 0x5e, 0xac, 0xb2, 0xf0, 0xea, 0x60, 0x3f, 0x7f, 0x3e, 0x3d, 0x7f, 0x5c, ++ 0xf1, 0xeb, 0xb0, 0x50, 0x01, 0xd5, 0xd3, 0x2d, 0xbc, 0xfe, 0xcf, 0x55, ++ 0xf2, 0x71, 0xb4, 0x7b, 0x00, 0x3e, 0x64, 0xe7, 0x1e, 0x4c, 0x29, 0xfe, ++ 0xc6, 0x0d, 0x68, 0x57, 0xd6, 0x88, 0x1e, 0x13, 0xd4, 0x1f, 0xb7, 0x95, ++ 0x5b, 0x50, 0xde, 0xfc, 0xa3, 0xc2, 0x7f, 0x60, 0xdc, 0x20, 0xda, 0xf1, ++ 0xc1, 0x99, 0xe6, 0xd0, 0x4e, 0x3c, 0x54, 0xbb, 0x4c, 0xf4, 0x98, 0xa6, ++ 0x8e, 0x6f, 0x77, 0xa1, 0xd2, 0xc5, 0xd2, 0x94, 0x75, 0x1c, 0xba, 0xde, ++ 0x1a, 0x46, 0x3b, 0xbf, 0xbd, 0xda, 0xbc, 0x03, 0xf5, 0xc9, 0x2d, 0xb6, ++ 0x3c, 0x1a, 0xaf, 0x7d, 0x8a, 0x31, 0x88, 0xfe, 0x15, 0xb5, 0xbe, 0xf6, ++ 0xfa, 0xeb, 0xcd, 0xa8, 0x4f, 0xa4, 0xa6, 0xa4, 0x39, 0xb1, 0xae, 0xf2, ++ 0xa7, 0x8d, 0x80, 0xf7, 0x58, 0xc2, 0x4f, 0x8f, 0xe3, 0x56, 0x29, 0xdb, ++ 0xad, 0x32, 0xdb, 0xc2, 0x7a, 0xe4, 0xe7, 0x66, 0xc3, 0x1f, 0x63, 0xf5, ++ 0x64, 0x1b, 0x8b, 0x10, 0xfe, 0x78, 0x74, 0x60, 0x90, 0x00, 0xbd, 0x19, ++ 0xf3, 0x39, 0x5e, 0x55, 0x30, 0x4f, 0x2d, 0x3e, 0x37, 0x0a, 0xcd, 0x41, ++ 0x44, 0xc6, 0x6d, 0xb8, 0x76, 0xdc, 0x47, 0xb2, 0x91, 0xfc, 0x0c, 0x8c, ++ 0x65, 0xf3, 0x75, 0xab, 0xfb, 0xf0, 0x66, 0xf3, 0x7d, 0xa9, 0xfb, 0x48, ++ 0x36, 0x06, 0x95, 0x7d, 0x90, 0x9e, 0xb4, 0xc5, 0xa6, 0x0b, 0xa3, 0xbe, ++ 0xb7, 0x05, 0xf6, 0x85, 0xe3, 0x05, 0xf2, 0x64, 0x82, 0x4f, 0xfc, 0xbe, ++ 0xe0, 0xe7, 0xc3, 0x71, 0x67, 0x4c, 0x51, 0xd6, 0x2d, 0xdd, 0xb0, 0x17, ++ 0xd7, 0x31, 0x53, 0xe7, 0xed, 0xc0, 0xf7, 0x0e, 0x7f, 0x56, 0x67, 0x07, ++ 0xf4, 0x62, 0xb3, 0x58, 0xb3, 0x88, 0xcf, 0xf3, 0xc1, 0xa2, 0xfd, 0xd0, ++ 0x4c, 0xa2, 0xb3, 0xe3, 0xf2, 0x15, 0xf4, 0x0e, 0x14, 0xe4, 0x1f, 0xc6, ++ 0xc8, 0xad, 0x9b, 0x7e, 0x2b, 0xd0, 0x7e, 0xd8, 0xfd, 0x46, 0x3a, 0x97, ++ 0xcd, 0x05, 0x7c, 0xdf, 0x4f, 0x1b, 0x43, 0x4e, 0x46, 0x06, 0x6e, 0x68, ++ 0xd4, 0x82, 0xe4, 0xe1, 0xf1, 0xf7, 0x85, 0x21, 0xf8, 0xeb, 0x65, 0x48, ++ 0x4f, 0xed, 0x69, 0x5e, 0x8e, 0xbf, 0xd2, 0x40, 0xca, 0x1a, 0xc4, 0xdf, ++ 0xd4, 0x81, 0xcc, 0xb5, 0xb4, 0xaf, 0x70, 0xc2, 0xf3, 0x88, 0xc7, 0xe3, ++ 0xf8, 0xf3, 0xd9, 0x07, 0xff, 0x29, 0x72, 0x40, 0x8f, 0xf0, 0xbd, 0xda, ++ 0x79, 0xaa, 0xe7, 0xa8, 0xe2, 0x41, 0xbc, 0xfc, 0x32, 0xe6, 0x4b, 0xea, ++ 0xf9, 0x3a, 0x68, 0x9f, 0xde, 0x22, 0x4e, 0x07, 0xaa, 0x1e, 0xc5, 0xc0, ++ 0xce, 0x49, 0x1e, 0x0a, 0xbf, 0xf5, 0x30, 0x9e, 0x5c, 0x18, 0xad, 0x1b, ++ 0x1d, 0x3e, 0xd2, 0x8f, 0x0d, 0x76, 0x4f, 0x11, 0xfa, 0x6f, 0xdb, 0xff, ++ 0xaa, 0x6f, 0x48, 0xe4, 0xbf, 0xfd, 0x50, 0x81, 0xd3, 0x9a, 0x14, 0x2b, ++ 0xe9, 0xcd, 0xed, 0x29, 0x5c, 0x6f, 0xee, 0x4d, 0x99, 0xa3, 0xb1, 0x77, ++ 0xaa, 0xc1, 0xfe, 0x11, 0x00, 0x3f, 0xf4, 0xe9, 0xac, 0x0b, 0xe9, 0x48, ++ 0x3f, 0xe2, 0x76, 0xf2, 0x7f, 0xe9, 0x47, 0xa2, 0x86, 0x84, 0xeb, 0x8a, ++ 0xd3, 0x47, 0x47, 0xcc, 0xe5, 0xfa, 0xa8, 0x04, 0xfa, 0x68, 0x82, 0x79, ++ 0xd5, 0x52, 0x44, 0x7d, 0x34, 0x81, 0x9e, 0x3a, 0xa8, 0x8f, 0xa6, 0xcd, ++ 0xe1, 0xfa, 0x68, 0x8a, 0x91, 0xf4, 0xd1, 0x6d, 0xc9, 0xc6, 0xda, 0xed, ++ 0x09, 0xf8, 0xcd, 0x81, 0x3c, 0xae, 0x5f, 0xf7, 0xe2, 0x3e, 0x12, 0xd8, ++ 0x7b, 0x60, 0xe7, 0x91, 0x1f, 0x52, 0xb5, 0xf3, 0x8c, 0x92, 0x9f, 0xec, ++ 0x35, 0x75, 0x9f, 0x07, 0x14, 0x7c, 0x57, 0xfb, 0x9b, 0xa4, 0x66, 0x86, ++ 0x7e, 0x31, 0xbd, 0xd1, 0x23, 0xa3, 0xbe, 0xa9, 0xb7, 0x72, 0xfd, 0xd1, ++ 0x04, 0xdb, 0x2c, 0x8a, 0x91, 0xdf, 0xea, 0xfc, 0xfb, 0xf3, 0x0c, 0xf4, ++ 0xfe, 0xb7, 0x0b, 0xb9, 0x1e, 0xaf, 0x33, 0x73, 0xfd, 0xe4, 0xa6, 0xe3, ++ 0x42, 0x73, 0x22, 0xb8, 0xff, 0x59, 0x81, 0xfb, 0x70, 0x78, 0xf7, 0x37, ++ 0xe0, 0x0d, 0xf1, 0x85, 0x72, 0x9b, 0xd1, 0x8b, 0xfa, 0x41, 0xb9, 0xcd, ++ 0x51, 0x85, 0xfa, 0xc1, 0x70, 0xef, 0x81, 0xa9, 0x19, 0xfc, 0x28, 0x2d, ++ 0xca, 0x57, 0x3c, 0x7f, 0x9d, 0xac, 0x27, 0xf9, 0x23, 0x7a, 0x1c, 0x88, ++ 0x67, 0x5d, 0x86, 0xfe, 0x57, 0x8e, 0xa3, 0x1d, 0x77, 0xd8, 0x46, 0xf2, ++ 0x46, 0xd5, 0x9b, 0xc1, 0x4e, 0xf5, 0x7a, 0xe0, 0xe5, 0x3d, 0xff, 0x01, ++ 0x14, 0xa8, 0x1b, 0x6a, 0x9f, 0x82, 0xdd, 0x24, 0xe5, 0xc3, 0x78, 0x7d, ++ 0xab, 0x32, 0x27, 0xf2, 0xf1, 0x40, 0xbf, 0x2b, 0x1d, 0xaa, 0x4f, 0xc6, ++ 0xfb, 0x01, 0x06, 0xe9, 0x3c, 0x65, 0x97, 0x93, 0xbf, 0x17, 0x1a, 0x85, ++ 0xef, 0x09, 0xab, 0xa6, 0x8c, 0x44, 0x7c, 0x8a, 0xa7, 0x73, 0xb5, 0xcc, ++ 0x75, 0xbc, 0x9e, 0xbb, 0x02, 0xd6, 0x95, 0x3b, 0xea, 0x28, 0x95, 0xea, ++ 0xf3, 0xff, 0xc9, 0xf4, 0xe4, 0x57, 0x8b, 0xef, 0x3f, 0x36, 0x5f, 0x85, ++ 0x3f, 0x97, 0xc7, 0xe3, 0x60, 0xb2, 0x11, 0x7a, 0x92, 0xc3, 0x63, 0x71, ++ 0xdd, 0x67, 0x5a, 0xde, 0xcc, 0xf4, 0xc0, 0x52, 0x9a, 0xc4, 0xf3, 0x24, ++ 0x8f, 0x3f, 0x69, 0x9e, 0x32, 0xe2, 0x11, 0x99, 0xf3, 0xd9, 0xdd, 0x28, ++ 0x5f, 0xbe, 0x22, 0x12, 0x9f, 0xcd, 0xb9, 0xb7, 0x37, 0x35, 0x2d, 0xe6, ++ 0x7c, 0x9f, 0x6e, 0xeb, 0xce, 0x15, 0x5d, 0x18, 0x2f, 0x88, 0xe4, 0x56, ++ 0xbb, 0xc8, 0x0e, 0xf0, 0x26, 0x5a, 0xef, 0x42, 0x75, 0xfe, 0xf0, 0x18, ++ 0xe2, 0xcb, 0x06, 0xe5, 0xfc, 0x65, 0x7b, 0x64, 0xf6, 0x58, 0x80, 0xb7, ++ 0x6c, 0xd3, 0x79, 0xd0, 0x15, 0x0d, 0x42, 0x57, 0x43, 0xff, 0x95, 0x62, ++ 0x6a, 0xb5, 0x04, 0xf3, 0xe7, 0xb6, 0x31, 0x8f, 0x0d, 0xea, 0x4e, 0x26, ++ 0x91, 0x1f, 0x2b, 0xf7, 0xb2, 0x9e, 0xf0, 0x2c, 0xf7, 0xe0, 0x12, 0xc2, ++ 0xdf, 0x31, 0xf6, 0x01, 0x21, 0xe8, 0x8e, 0x99, 0x07, 0x59, 0x70, 0x4c, ++ 0x3c, 0xe4, 0xd3, 0xe6, 0x6a, 0xa2, 0xcb, 0xdc, 0x91, 0x83, 0xf6, 0x1b, ++ 0xc5, 0x0d, 0x3e, 0xb5, 0x87, 0xe7, 0x23, 0x5d, 0x7f, 0xfa, 0x04, 0x5f, ++ 0x51, 0xee, 0x77, 0xb4, 0xed, 0x20, 0x5b, 0xc9, 0xcf, 0x7c, 0x4f, 0x8b, ++ 0x35, 0x84, 0x26, 0xe0, 0x98, 0x87, 0x25, 0x1d, 0xd6, 0x73, 0x9f, 0x15, ++ 0x58, 0x8e, 0x13, 0xd7, 0x71, 0xd0, 0xf9, 0x08, 0xfa, 0x69, 0x7e, 0x98, ++ 0x44, 0x7e, 0x1a, 0xfd, 0x56, 0x17, 0xf9, 0x59, 0x9e, 0x15, 0xfc, 0xd3, ++ 0xf2, 0x81, 0x2e, 0xce, 0x84, 0xe4, 0xaf, 0xa2, 0x7d, 0x4b, 0x3f, 0xe8, ++ 0xd7, 0xf8, 0x35, 0xeb, 0x8e, 0x8d, 0x24, 0xbf, 0x22, 0xb3, 0x49, 0x7e, ++ 0x3d, 0xa0, 0x63, 0x3b, 0x13, 0xf8, 0x91, 0x6e, 0xcf, 0xe7, 0xf6, 0xdc, ++ 0xd2, 0x7c, 0x4e, 0x5f, 0xb9, 0x8e, 0x37, 0x72, 0x57, 0x54, 0x60, 0x79, ++ 0x8c, 0xce, 0xfb, 0x5a, 0xe9, 0xa8, 0x13, 0xf9, 0x35, 0x8c, 0xf3, 0xc8, ++ 0x88, 0xcd, 0x14, 0xe7, 0x0a, 0x56, 0xb1, 0x22, 0xb4, 0xfb, 0x3a, 0x0d, ++ 0x80, 0x57, 0x09, 0xe8, 0xf4, 0x5f, 0xf3, 0x95, 0x78, 0x99, 0xca, 0x87, ++ 0x15, 0xf8, 0x59, 0xd0, 0x4a, 0x81, 0x7d, 0xe8, 0x05, 0x45, 0xbf, 0xdb, ++ 0xfd, 0xfc, 0xf3, 0xcf, 0x67, 0xa2, 0xbc, 0x66, 0xa8, 0xdc, 0x0d, 0xd2, ++ 0x9b, 0x3a, 0x4e, 0x52, 0x51, 0x17, 0x35, 0x26, 0x79, 0xbc, 0x0c, 0xfd, ++ 0x0d, 0x82, 0xe4, 0xe5, 0xfc, 0x55, 0x0a, 0x3a, 0x82, 0x18, 0xd7, 0xf9, ++ 0x8b, 0x3e, 0x21, 0x5e, 0x3f, 0xa9, 0x9c, 0xdf, 0x1a, 0xe7, 0x7a, 0x07, ++ 0xf6, 0xaf, 0x76, 0x79, 0x1c, 0x48, 0x07, 0xbd, 0xce, 0xc9, 0x8e, 0x3b, ++ 0x01, 0x7e, 0x36, 0x9b, 0x91, 0x99, 0x62, 0xf8, 0xaf, 0x8a, 0x27, 0x87, ++ 0x92, 0x27, 0x93, 0xfe, 0xa1, 0x8e, 0xb3, 0x2a, 0x39, 0xef, 0x8a, 0x76, ++ 0xb6, 0x11, 0xf8, 0xb0, 0x7c, 0x05, 0xf9, 0x6c, 0x44, 0x7f, 0x37, 0xea, ++ 0x31, 0x7d, 0x53, 0xcd, 0x32, 0xac, 0x77, 0xbd, 0xad, 0x3c, 0x82, 0x7a, ++ 0xd6, 0x7a, 0x9b, 0xbd, 0x9c, 0xfc, 0xe6, 0x36, 0xe0, 0x17, 0x31, 0x7e, ++ 0x24, 0x9b, 0xed, 0x08, 0xe1, 0xa1, 0xcd, 0xc3, 0xfd, 0x6b, 0x36, 0xe4, ++ 0xbb, 0xe8, 0x47, 0x52, 0xf6, 0xdf, 0xeb, 0x3c, 0x42, 0xfb, 0x57, 0xfb, ++ 0xad, 0x52, 0xf8, 0x8f, 0xcd, 0x13, 0xe6, 0x71, 0x47, 0xb0, 0x62, 0xb0, ++ 0x9f, 0x45, 0xf4, 0x05, 0xd1, 0xbe, 0xb0, 0xd8, 0x19, 0xd9, 0x93, 0x16, ++ 0x33, 0xa7, 0xa7, 0x24, 0x38, 0x0e, 0x73, 0x0c, 0x1f, 0x51, 0xe7, 0xbd, ++ 0x3f, 0x9f, 0xdb, 0x69, 0xeb, 0x73, 0xca, 0x23, 0x95, 0xb4, 0x3e, 0x11, ++ 0x3d, 0x01, 0x6c, 0xbd, 0xa3, 0xdc, 0x41, 0x72, 0x10, 0xe1, 0x8c, 0x7a, ++ 0xe8, 0xa8, 0x41, 0x3d, 0x94, 0xfc, 0x25, 0xcf, 0x29, 0x70, 0x56, 0xc7, ++ 0x69, 0xef, 0xe5, 0xfb, 0xf4, 0xb5, 0x3a, 0xbc, 0xd5, 0xe9, 0x68, 0x7f, ++ 0xfa, 0x9e, 0x45, 0xbe, 0xb0, 0xde, 0x76, 0xa7, 0x39, 0x88, 0xf2, 0x20, ++ 0x79, 0xe2, 0x15, 0xc7, 0x7b, 0x25, 0x5f, 0xd0, 0xf8, 0x7b, 0xa2, 0xe3, ++ 0xb5, 0xce, 0x50, 0xc6, 0x7b, 0x0e, 0xc7, 0xd3, 0x27, 0x97, 0x4b, 0x38, ++ 0x9e, 0x01, 0xf9, 0x44, 0x02, 0xfc, 0x0b, 0x2b, 0xeb, 0xfa, 0xa2, 0xfe, ++ 0x30, 0x80, 0xa8, 0x44, 0xf6, 0x1a, 0xe3, 0x7a, 0x15, 0x60, 0xbc, 0x23, ++ 0x91, 0xfe, 0xa0, 0x96, 0x66, 0xc5, 0xaf, 0x35, 0xf4, 0x3d, 0xce, 0x27, ++ 0x9d, 0x8a, 0xdd, 0x02, 0x7c, 0xf2, 0x18, 0xae, 0xbf, 0x31, 0xe7, 0xf4, ++ 0x91, 0x4a, 0xea, 0xc5, 0xed, 0x95, 0xb4, 0xd9, 0x62, 0x91, 0x08, 0xe7, ++ 0xf5, 0x09, 0x9c, 0xa0, 0x5e, 0x88, 0xda, 0xef, 0xf1, 0x7a, 0x4c, 0xa5, ++ 0x7e, 0x80, 0xe4, 0x99, 0x2a, 0x87, 0x54, 0xb9, 0xf4, 0x34, 0xea, 0x31, ++ 0xc6, 0x28, 0x3d, 0xa9, 0x7e, 0x97, 0xec, 0x06, 0x1f, 0xc9, 0x6b, 0xc1, ++ 0xee, 0x23, 0xbc, 0x01, 0xbd, 0x46, 0x46, 0xba, 0xd1, 0x63, 0xbc, 0x37, ++ 0x01, 0xdc, 0x24, 0x17, 0x87, 0x9b, 0x90, 0x32, 0x45, 0x46, 0x7a, 0xa9, ++ 0xbe, 0xd4, 0x9f, 0x4d, 0x72, 0x3e, 0xf9, 0xa3, 0x6c, 0x16, 0xe3, 0x3f, ++ 0x53, 0xf9, 0xe1, 0xa1, 0xcf, 0x76, 0x59, 0xb0, 0xfd, 0xd3, 0x86, 0xaa, ++ 0x2b, 0xea, 0x2b, 0x6a, 0x3c, 0x78, 0xb8, 0x38, 0x70, 0xca, 0x43, 0xbf, ++ 0xff, 0x4a, 0xac, 0xbe, 0x32, 0x5c, 0x5c, 0xf8, 0x6a, 0xf1, 0xe0, 0xbe, ++ 0x14, 0x23, 0xf9, 0xdd, 0x9e, 0x11, 0xb4, 0x7c, 0xc9, 0xea, 0xe2, 0xfc, ++ 0xc8, 0xe0, 0x52, 0xfd, 0x27, 0xfe, 0xbf, 0xe0, 0x39, 0x3c, 0x23, 0xf8, ++ 0x3c, 0xa4, 0x2f, 0x2a, 0x7e, 0x94, 0x7d, 0x85, 0x7e, 0xe6, 0x42, 0xbf, ++ 0x57, 0xa7, 0x91, 0x05, 0xe1, 0x3c, 0x0f, 0x7c, 0x36, 0xd9, 0x81, 0xf8, ++ 0x71, 0xad, 0xf0, 0x55, 0xfd, 0xe6, 0x59, 0x8a, 0x1e, 0x95, 0x65, 0xdb, ++ 0x25, 0x20, 0x9d, 0x66, 0x35, 0x84, 0x04, 0xf4, 0x7b, 0x67, 0x37, 0x74, ++ 0x09, 0xde, 0x2b, 0xf4, 0x7b, 0x07, 0xe9, 0x39, 0x23, 0xda, 0xdf, 0xa0, ++ 0x8c, 0x3f, 0x5d, 0x1c, 0xd0, 0xa3, 0xbc, 0x9a, 0xae, 0xd0, 0x71, 0xf6, ++ 0x45, 0x91, 0x15, 0xc5, 0xe8, 0x7f, 0x6f, 0xe5, 0x73, 0x3d, 0xca, 0xa0, ++ 0xe8, 0xed, 0x29, 0x7d, 0xcf, 0x59, 0x70, 0xbc, 0x3e, 0x9d, 0xaf, 0xb3, ++ 0x10, 0xe5, 0x43, 0x8a, 0x4e, 0xde, 0x19, 0x43, 0xef, 0x86, 0x7b, 0xcb, ++ 0xcd, 0x55, 0x31, 0xf0, 0x69, 0xc7, 0x78, 0x4e, 0x82, 0xf3, 0x2b, 0x77, ++ 0x0d, 0xea, 0x5b, 0x64, 0x17, 0xa9, 0xf2, 0xd6, 0xa0, 0xca, 0x09, 0xbb, ++ 0xa8, 0x91, 0x13, 0x81, 0x24, 0x8e, 0xb7, 0xaa, 0xbe, 0x13, 0xb8, 0x9e, ++ 0xdb, 0x41, 0x82, 0xe0, 0x2f, 0x41, 0xb8, 0x9e, 0xbb, 0xfe, 0xf7, 0xb7, ++ 0xe0, 0x16, 0xcf, 0x09, 0x61, 0x83, 0xdd, 0x79, 0xf5, 0x78, 0xc6, 0xa0, ++ 0x5e, 0xa3, 0x0b, 0x2d, 0x57, 0xed, 0x17, 0xa4, 0x97, 0x2e, 0x83, 0xdc, ++ 0xdd, 0x4f, 0xfa, 0x55, 0x8a, 0x07, 0xfd, 0x00, 0xaa, 0x5e, 0x55, 0xf6, ++ 0x3d, 0x21, 0x1f, 0xfb, 0x79, 0x04, 0x2f, 0xd1, 0xc9, 0x24, 0xe6, 0xa7, ++ 0xf2, 0x3a, 0xc6, 0xf5, 0x40, 0xd0, 0xaf, 0x6e, 0x70, 0x91, 0xbe, 0x07, ++ 0x5b, 0x89, 0x39, 0x77, 0x86, 0xae, 0x88, 0xcc, 0xab, 0xef, 0xaf, 0x00, ++ 0xfd, 0xe0, 0x18, 0x27, 0x10, 0x23, 0xe4, 0x4f, 0xfd, 0xfa, 0x25, 0x81, ++ 0xf8, 0x7b, 0x3c, 0xdc, 0xda, 0x06, 0xe1, 0x36, 0x18, 0xcf, 0xd3, 0xf8, ++ 0x45, 0xb3, 0x15, 0x79, 0x97, 0xad, 0xb4, 0xcb, 0xe8, 0x17, 0x75, 0x62, ++ 0x7c, 0x4a, 0xeb, 0xb7, 0xac, 0x38, 0xaa, 0xad, 0x4f, 0x8a, 0x68, 0xeb, ++ 0xd7, 0x9d, 0x8c, 0xf3, 0x83, 0x06, 0xbd, 0x6f, 0xbb, 0x32, 0x79, 0xfc, ++ 0x1f, 0x07, 0xdd, 0x06, 0xf4, 0x86, 0x7c, 0x62, 0x85, 0x12, 0xb7, 0xcc, ++ 0x09, 0x86, 0x2a, 0x25, 0x58, 0x6f, 0x2e, 0xeb, 0xa2, 0xf8, 0x60, 0x76, ++ 0x43, 0x9a, 0x06, 0xde, 0x37, 0xe9, 0x95, 0xbc, 0x09, 0xe6, 0x15, 0x98, ++ 0xba, 0x4e, 0xf8, 0x65, 0x8b, 0xf3, 0x3e, 0xc6, 0xf7, 0x5b, 0x5c, 0x83, ++ 0xfe, 0x3b, 0xd2, 0xbf, 0xee, 0x51, 0xda, 0xff, 0xa1, 0x7a, 0xc5, 0x57, ++ 0x3b, 0xd0, 0x96, 0xde, 0x6c, 0x20, 0xff, 0xa8, 0x19, 0x26, 0x47, 0x78, ++ 0xfd, 0xc3, 0xec, 0x05, 0x33, 0xf1, 0xbc, 0x87, 0xf8, 0x57, 0x9b, 0xb5, ++ 0x7e, 0xd5, 0xec, 0xd8, 0x76, 0x80, 0xc3, 0x3d, 0xdb, 0x0c, 0x9a, 0x76, ++ 0x9f, 0xb7, 0x8c, 0xec, 0x82, 0x85, 0x8a, 0xdf, 0x76, 0x70, 0xbf, 0xb8, ++ 0x8e, 0x0c, 0xbe, 0xdf, 0xec, 0xf2, 0xa1, 0xf3, 0x5f, 0x7d, 0x5e, 0xf8, ++ 0x2f, 0x6d, 0xe8, 0xfc, 0xea, 0xb8, 0x4f, 0x03, 0x1f, 0x42, 0xfe, 0xca, ++ 0x2e, 0xc1, 0xb9, 0x4e, 0x46, 0xb8, 0x31, 0xf4, 0x40, 0xb0, 0x5c, 0x31, ++ 0x2c, 0x60, 0x9c, 0x3a, 0xab, 0x99, 0x79, 0x51, 0x4f, 0xce, 0x6e, 0x61, ++ 0xde, 0x44, 0xfe, 0xfe, 0x5d, 0x0a, 0xbc, 0xe2, 0xe1, 0xcc, 0x82, 0xd3, ++ 0x09, 0x7e, 0x33, 0x94, 0x67, 0x59, 0x36, 0x3d, 0xd9, 0xed, 0x59, 0x2d, ++ 0x3a, 0xd2, 0x0f, 0xb3, 0x80, 0x4f, 0x20, 0x7f, 0xb8, 0x65, 0x25, 0x90, ++ 0x11, 0xd4, 0xb3, 0x57, 0xca, 0xa4, 0x5f, 0xde, 0xda, 0xa0, 0x63, 0x28, ++ 0x1f, 0xd8, 0xa5, 0x36, 0xcd, 0xfb, 0xb0, 0x5c, 0xf2, 0x7f, 0xaa, 0xe7, ++ 0xfe, 0x34, 0x8e, 0x87, 0xfa, 0x65, 0x23, 0x0b, 0xe9, 0x70, 0x3f, 0xcd, ++ 0xc5, 0x44, 0x67, 0xb4, 0xae, 0xbc, 0x28, 0x3e, 0x00, 0xbc, 0x4e, 0x73, ++ 0x78, 0x99, 0x09, 0x5e, 0xb7, 0x4e, 0x31, 0x68, 0xfc, 0x9c, 0xb9, 0xe8, ++ 0xd7, 0x8c, 0x81, 0x8b, 0x8a, 0x07, 0xd9, 0x71, 0xcf, 0xbf, 0xe4, 0x92, ++ 0x34, 0x74, 0x01, 0x72, 0x6e, 0x97, 0x8b, 0xf0, 0x84, 0xcb, 0xbf, 0x02, ++ 0x94, 0x7f, 0xb0, 0xa4, 0x33, 0x53, 0x4f, 0xee, 0xea, 0x82, 0xf5, 0xdd, ++ 0xb4, 0x96, 0xd1, 0x7e, 0x07, 0x52, 0xad, 0x21, 0x9e, 0x0f, 0x31, 0x18, ++ 0x3f, 0xd0, 0x5f, 0x1e, 0x0b, 0x7c, 0xcb, 0x3c, 0xa3, 0x08, 0xfd, 0x2c, ++ 0x9b, 0x24, 0xab, 0x0e, 0xf3, 0x16, 0x0e, 0xa4, 0xf6, 0x7f, 0x9b, 0xa5, ++ 0x32, 0xd6, 0x0d, 0x6a, 0x71, 0x75, 0x0e, 0x63, 0x3f, 0xb1, 0x0e, 0x94, ++ 0x08, 0x50, 0x3f, 0xe4, 0x6a, 0xd8, 0xd2, 0x79, 0x23, 0xb4, 0x5b, 0x06, ++ 0x5e, 0x40, 0xe7, 0xaf, 0xcd, 0x16, 0x58, 0x50, 0x13, 0x53, 0x4f, 0x49, ++ 0x69, 0x5f, 0x50, 0x83, 0x87, 0x36, 0x85, 0xc9, 0x22, 0xc0, 0xc7, 0x8a, ++ 0x33, 0xc0, 0x3e, 0xad, 0xd2, 0x9c, 0xdd, 0x7a, 0x98, 0xdf, 0xea, 0xb6, ++ 0x91, 0x53, 0xd2, 0xca, 0x06, 0xe9, 0x94, 0xf6, 0xd3, 0x71, 0xbd, 0xfc, ++ 0x28, 0xe6, 0x7d, 0x74, 0x14, 0xe8, 0x48, 0x7f, 0x62, 0xb1, 0xed, 0xb0, ++ 0x8f, 0xb2, 0x02, 0x49, 0xa1, 0x03, 0x6f, 0x11, 0xf1, 0x8f, 0x1a, 0x1e, ++ 0xc7, 0x8f, 0x1d, 0x5f, 0xb4, 0x5f, 0x61, 0xfc, 0x39, 0x30, 0xfe, 0xc4, ++ 0xcf, 0x31, 0xbe, 0x99, 0xaf, 0x3f, 0x13, 0x1f, 0x81, 0xdc, 0xc9, 0xc4, ++ 0xf5, 0xa3, 0xdf, 0x1a, 0xc7, 0xc7, 0xf3, 0x45, 0xe7, 0x51, 0xec, 0xfc, ++ 0xca, 0x78, 0x22, 0x0b, 0x6e, 0xc7, 0x78, 0x0b, 0xcc, 0x67, 0x13, 0xf8, ++ 0x7c, 0x12, 0xe6, 0x95, 0x64, 0x32, 0x6d, 0x1e, 0xc1, 0xe0, 0x7c, 0x12, ++ 0xcc, 0x57, 0xfa, 0x77, 0xd8, 0x4f, 0xed, 0xd0, 0xf3, 0x30, 0x5c, 0xe9, ++ 0x3c, 0x6e, 0xff, 0x7c, 0xe7, 0xd1, 0xa1, 0xf3, 0xd2, 0x7a, 0x83, 0xe3, ++ 0x6d, 0x64, 0x17, 0x31, 0x68, 0xd6, 0x4d, 0x46, 0xfb, 0x83, 0xcf, 0x67, ++ 0x11, 0xd9, 0x21, 0xb1, 0x9c, 0xc3, 0xb5, 0x63, 0x72, 0x14, 0xae, 0xa0, ++ 0x07, 0xd2, 0xb8, 0xd0, 0x7d, 0xcd, 0x65, 0x05, 0xce, 0x06, 0x84, 0xb3, ++ 0x64, 0x24, 0x38, 0x0f, 0x07, 0xb7, 0x3e, 0x89, 0xe7, 0x35, 0x6d, 0x90, ++ 0xac, 0xa1, 0x35, 0xce, 0xff, 0x03, 0xe7, 0xe5, 0xe0, 0xe7, 0x15, 0x3b, ++ 0x1f, 0xea, 0x93, 0xd7, 0x3c, 0xdf, 0xed, 0x30, 0x9f, 0xfd, 0xda, 0xe7, ++ 0x43, 0xf8, 0x22, 0xfd, 0x0c, 0xc2, 0x17, 0xce, 0x64, 0x6d, 0xe6, 0xb5, ++ 0xc3, 0x17, 0x56, 0x15, 0xbc, 0x16, 0xf8, 0xf6, 0xc1, 0xb8, 0xba, 0x18, ++ 0xb8, 0x46, 0xf3, 0x87, 0x9e, 0x92, 0xd0, 0x2e, 0xb0, 0x18, 0x7c, 0x66, ++ 0x0f, 0xf0, 0xdf, 0x9b, 0x0a, 0x52, 0x49, 0xde, 0xba, 0xed, 0x0b, 0xcc, ++ 0x94, 0x4f, 0x90, 0xb1, 0xc0, 0x8c, 0x79, 0x7a, 0xeb, 0xdc, 0xb6, 0x1a, ++ 0xcc, 0xe7, 0x5b, 0xe7, 0x5a, 0x64, 0x36, 0xc4, 0xc8, 0xe9, 0x75, 0xee, ++ 0x3a, 0x6a, 0x87, 0xfe, 0x94, 0xf7, 0xe4, 0x0e, 0x5b, 0xd1, 0x6d, 0xc1, ++ 0x4a, 0x59, 0x84, 0xfc, 0x02, 0x1b, 0x6e, 0xa8, 0x76, 0x2c, 0x47, 0xfc, ++ 0x69, 0xe6, 0x79, 0x54, 0x6a, 0x5e, 0x91, 0x2a, 0x0f, 0x99, 0x12, 0xaf, ++ 0xa4, 0x7d, 0xc1, 0x8b, 0x23, 0x6e, 0xdc, 0x3b, 0xd0, 0x07, 0xfd, 0x37, ++ 0x34, 0x4f, 0xa4, 0xbc, 0xb1, 0x11, 0xa9, 0xff, 0x4e, 0xf9, 0x52, 0x9b, ++ 0x1a, 0x3c, 0x1e, 0x6c, 0xff, 0xb6, 0x85, 0xc7, 0x1d, 0x9f, 0x54, 0xe2, ++ 0x4e, 0x88, 0xa8, 0xe4, 0x57, 0x1b, 0x7f, 0xfd, 0x77, 0x30, 0xfe, 0x5a, ++ 0x5e, 0xb0, 0x4a, 0xa0, 0x78, 0xe3, 0xca, 0x2b, 0xc7, 0x1b, 0xcb, 0xcf, ++ 0x47, 0xaa, 0x30, 0xef, 0x8a, 0x2d, 0xe7, 0x79, 0x55, 0x8e, 0x3a, 0x31, ++ 0x4e, 0x1e, 0x6a, 0xe9, 0x76, 0x13, 0xc2, 0x95, 0xe7, 0x3f, 0x85, 0x04, ++ 0x0e, 0x5f, 0xcd, 0x78, 0x2d, 0x05, 0x19, 0x3c, 0x1e, 0xed, 0xda, 0xc1, ++ 0xd0, 0xee, 0x7b, 0x05, 0xc6, 0xd2, 0x6b, 0xe9, 0x4b, 0x87, 0x79, 0x48, ++ 0xf1, 0xf4, 0x28, 0x1a, 0xbd, 0x52, 0x25, 0xea, 0xeb, 0xab, 0x74, 0xb4, ++ 0x8e, 0x6c, 0x0c, 0xed, 0x83, 0x88, 0x2b, 0x2f, 0x9d, 0xeb, 0x58, 0x0e, ++ 0xcf, 0x73, 0xee, 0x16, 0x3d, 0x02, 0x3c, 0x1f, 0xe9, 0x7e, 0x98, 0xf2, ++ 0x91, 0x40, 0xdb, 0x27, 0x7d, 0xc3, 0xed, 0x3e, 0x56, 0x85, 0xf5, 0x21, ++ 0xfb, 0x5c, 0xa1, 0xdd, 0x47, 0xfc, 0xbe, 0xe2, 0xd7, 0x0d, 0x82, 0x8b, ++ 0xd6, 0xad, 0x9e, 0x57, 0xf9, 0x79, 0x4f, 0x12, 0xda, 0x57, 0xe5, 0x05, ++ 0x0b, 0x28, 0x5f, 0x8c, 0x7e, 0x2a, 0xbd, 0xeb, 0xe3, 0xf6, 0x93, 0x8e, ++ 0x76, 0xb1, 0xce, 0x6b, 0x19, 0x8f, 0x76, 0x41, 0xcc, 0xbe, 0x98, 0xa6, ++ 0x9f, 0x62, 0xbf, 0xfd, 0xd7, 0xd6, 0xef, 0x44, 0x64, 0x42, 0xbd, 0x30, ++ 0x3e, 0x1e, 0xf6, 0x4f, 0x3e, 0x5a, 0xa7, 0x89, 0x79, 0xcc, 0x46, 0x7a, ++ 0xaf, 0x8e, 0xec, 0x48, 0x35, 0xce, 0x96, 0x85, 0xb4, 0x83, 0xe7, 0x3e, ++ 0x9a, 0xf1, 0x38, 0x45, 0xfc, 0xfb, 0x93, 0xf9, 0xfb, 0xcc, 0xc1, 0xe3, ++ 0x6e, 0x26, 0x2b, 0x98, 0xa4, 0x40, 0x7f, 0xc2, 0x7d, 0x56, 0xf2, 0x67, ++ 0x9a, 0x4c, 0x50, 0x87, 0xf3, 0x11, 0x8c, 0xcc, 0x3c, 0x0a, 0x9e, 0x3f, ++ 0xad, 0xf8, 0x03, 0xd7, 0x08, 0x4c, 0xc4, 0x7a, 0x74, 0xbe, 0x30, 0xc3, ++ 0xf9, 0xda, 0x05, 0xdf, 0x66, 0x8f, 0x13, 0x4b, 0x6e, 0x47, 0x19, 0x52, ++ 0x7d, 0x94, 0x6f, 0x88, 0x61, 0xdb, 0x58, 0x7b, 0xb4, 0x0f, 0xf3, 0x38, ++ 0xa0, 0x7d, 0xd5, 0xbd, 0xce, 0x91, 0xe8, 0xcf, 0x1b, 0x01, 0x04, 0x11, ++ 0x41, 0x7b, 0x5a, 0x89, 0x53, 0xa9, 0xfe, 0x93, 0x94, 0xfc, 0xfe, 0xa5, ++ 0x28, 0xbf, 0x5f, 0x2c, 0xf8, 0x68, 0x81, 0x19, 0xe5, 0x33, 0x3a, 0x9c, ++ 0xae, 0x67, 0x6c, 0xff, 0xce, 0xd3, 0x5b, 0x82, 0x39, 0x51, 0xba, 0x34, ++ 0x5d, 0xcc, 0x62, 0x72, 0x8c, 0x5d, 0x63, 0x12, 0x9b, 0x29, 0x9f, 0xc3, ++ 0x74, 0x71, 0xb4, 0xc6, 0xcf, 0x12, 0x56, 0xec, 0x31, 0xb5, 0xee, 0xb5, ++ 0x8b, 0xd5, 0x38, 0x5f, 0x04, 0xed, 0x05, 0xcc, 0x5f, 0x62, 0x52, 0x07, ++ 0xbe, 0x57, 0x09, 0x40, 0x91, 0x63, 0xfd, 0xa6, 0x17, 0x1d, 0x9a, 0x71, ++ 0xa2, 0xe3, 0xe7, 0x68, 0xe6, 0x0d, 0x83, 0x5d, 0x1d, 0x1b, 0x17, 0x18, ++ 0x7e, 0xfc, 0x24, 0x26, 0x17, 0xc5, 0x8e, 0x9f, 0x37, 0xcc, 0xf8, 0x85, ++ 0x71, 0xe3, 0x4b, 0x09, 0xc7, 0x8f, 0x8e, 0x9b, 0xae, 0x19, 0x77, 0x9d, ++ 0xc8, 0xf9, 0x45, 0xd0, 0x6e, 0x0d, 0x25, 0xf2, 0xf3, 0x9d, 0x2d, 0xa8, ++ 0x7a, 0x1b, 0x49, 0x79, 0xb8, 0x7c, 0xb3, 0x33, 0x05, 0xdc, 0x0f, 0x08, ++ 0xfc, 0x58, 0xa4, 0x38, 0x94, 0x82, 0x37, 0x8f, 0x38, 0x9a, 0x29, 0xff, ++ 0x4c, 0x6f, 0xe5, 0xf1, 0x52, 0x83, 0x12, 0x3f, 0x39, 0x98, 0xdc, 0xc0, ++ 0xf3, 0x24, 0x72, 0xb4, 0xf9, 0x67, 0x55, 0x4c, 0x12, 0xb1, 0x7d, 0x5d, ++ 0xca, 0xac, 0xa3, 0x02, 0xb4, 0x57, 0xd9, 0xb4, 0x7a, 0xfa, 0xf4, 0x4b, ++ 0xa7, 0xf5, 0xc8, 0x77, 0xa6, 0x8b, 0x5a, 0x3d, 0xdd, 0xcb, 0x9a, 0x09, ++ 0x3f, 0x6f, 0x62, 0xda, 0xe7, 0x86, 0x1c, 0x2d, 0x1f, 0xd8, 0xa8, 0xd0, ++ 0x87, 0x2e, 0x79, 0x62, 0x84, 0xf2, 0xd4, 0x32, 0x6c, 0x94, 0x77, 0x30, ++ 0x9c, 0x5f, 0xe1, 0xdd, 0x36, 0x46, 0xf9, 0x53, 0x86, 0x24, 0x5f, 0x33, ++ 0xca, 0x38, 0x63, 0xe1, 0xa5, 0xb4, 0x75, 0x0e, 0xa8, 0x8f, 0xe0, 0xf8, ++ 0x65, 0x2f, 0x4c, 0x5d, 0x88, 0x7e, 0xa2, 0x77, 0x15, 0x3c, 0x5e, 0x07, ++ 0x74, 0x8f, 0x70, 0xac, 0x5b, 0x35, 0x72, 0xbb, 0x3e, 0x66, 0xdc, 0x3a, ++ 0x63, 0xb8, 0x00, 0xe5, 0x48, 0x9d, 0x8e, 0xe7, 0xeb, 0xd3, 0x0f, 0xe6, ++ 0x7f, 0x37, 0x23, 0x8b, 0xfc, 0xac, 0xf1, 0xf3, 0x52, 0xc6, 0x6f, 0x8c, ++ 0xdf, 0xab, 0xbe, 0x59, 0xf0, 0xb9, 0x62, 0xf6, 0xf1, 0xae, 0x42, 0x17, ++ 0x83, 0xf3, 0xad, 0xce, 0xde, 0x8e, 0x7a, 0xec, 0xe0, 0x7c, 0xa6, 0xf0, ++ 0x24, 0x9a, 0x6f, 0x30, 0xef, 0x47, 0x99, 0x2f, 0xf3, 0x8b, 0xcd, 0xf7, ++ 0x9e, 0x42, 0xcf, 0xea, 0x7c, 0xf5, 0x5f, 0xd5, 0xee, 0xaf, 0xde, 0x18, ++ 0xa1, 0xfd, 0xd5, 0xeb, 0x98, 0x92, 0xe7, 0xcf, 0xe7, 0x7b, 0x0f, 0xf7, ++ 0xe7, 0xfc, 0x02, 0xf3, 0x29, 0xf9, 0x5b, 0x83, 0xf3, 0x7d, 0x4d, 0xbb, ++ 0xbf, 0x7a, 0x53, 0x84, 0xf6, 0x57, 0x3f, 0x68, 0x4f, 0x2a, 0xf3, 0x65, ++ 0x7e, 0xb1, 0xf9, 0x4c, 0xc6, 0x66, 0x8a, 0xcf, 0x3c, 0x26, 0xf0, 0x73, ++ 0x9d, 0xbb, 0x6b, 0xd4, 0xe3, 0xe8, 0xa7, 0xbf, 0x30, 0x77, 0x95, 0x8c, ++ 0xf8, 0xa6, 0xda, 0x67, 0xb7, 0xe0, 0x0b, 0x80, 0x67, 0xb7, 0x28, 0xf9, ++ 0x4d, 0xb7, 0xe6, 0x18, 0x49, 0x6f, 0x50, 0xc7, 0xdd, 0xdd, 0x36, 0x85, ++ 0x79, 0x8d, 0xdc, 0x9f, 0x83, 0x65, 0xd1, 0x0d, 0x02, 0xe5, 0xfb, 0x8f, ++ 0x9b, 0x22, 0x78, 0x31, 0x3e, 0xb6, 0x0d, 0xe8, 0xde, 0x5b, 0x88, 0xfe, ++ 0x2a, 0x89, 0xda, 0x43, 0x6d, 0x0e, 0x2a, 0x77, 0xb4, 0xc9, 0x54, 0x7e, ++ 0x17, 0xec, 0x41, 0x2f, 0xf9, 0xad, 0x3c, 0x54, 0xff, 0x1f, 0x85, 0xdc, ++ 0xce, 0x7f, 0x6c, 0x94, 0xb4, 0x64, 0x05, 0xea, 0x0b, 0x95, 0x56, 0x9e, ++ 0xef, 0x7c, 0xc3, 0x34, 0xd0, 0x44, 0xa3, 0xf6, 0x16, 0x18, 0x60, 0x7d, ++ 0x16, 0xcc, 0x2b, 0xfc, 0x32, 0x2b, 0xdb, 0x08, 0xb5, 0xc2, 0xad, 0x1c, ++ 0x1e, 0xf6, 0xea, 0xcc, 0x10, 0x9e, 0x93, 0xb5, 0xec, 0x50, 0xa4, 0x0d, ++ 0xea, 0xa6, 0xa9, 0x7a, 0x19, 0xf3, 0xb8, 0x4d, 0x4e, 0xe6, 0x4b, 0xe4, ++ 0x8f, 0x69, 0x2d, 0xe4, 0x7e, 0x9e, 0x47, 0xd4, 0xfc, 0xf8, 0x1b, 0x05, ++ 0x1e, 0x7f, 0x07, 0x7d, 0xa4, 0x12, 0xf6, 0xbf, 0x4c, 0x01, 0x35, 0xd3, ++ 0xcf, 0x15, 0x50, 0xaf, 0xba, 0xf5, 0x6b, 0xa9, 0xa4, 0x8f, 0xd4, 0x2d, ++ 0xea, 0x4f, 0x96, 0x60, 0x1d, 0x77, 0x08, 0x65, 0x6f, 0xbb, 0x00, 0x1e, ++ 0xbf, 0x51, 0xf4, 0x91, 0x65, 0xa3, 0x39, 0x1d, 0xc7, 0xdb, 0x93, 0x76, ++ 0x94, 0x2c, 0x13, 0x31, 0x7f, 0x4f, 0x1f, 0x0a, 0xc1, 0x9f, 0x0b, 0x93, ++ 0x17, 0x92, 0x3d, 0xba, 0x70, 0x31, 0x63, 0x69, 0xf0, 0xfe, 0xad, 0xf8, ++ 0x1e, 0xc8, 0x95, 0xe3, 0x8a, 0x3e, 0xf3, 0x46, 0xbf, 0x89, 0xa1, 0xbd, ++ 0x16, 0xac, 0xe6, 0x71, 0xe7, 0x3b, 0x1e, 0xd6, 0xda, 0x91, 0x8f, 0x59, ++ 0xc2, 0x12, 0xea, 0x71, 0x8f, 0x95, 0xd9, 0x19, 0x9e, 0x47, 0x5d, 0x8b, ++ 0xb6, 0xfd, 0x11, 0x25, 0x8e, 0xb0, 0x30, 0xce, 0xae, 0xbc, 0x35, 0x2e, ++ 0xaf, 0x06, 0xb4, 0x4c, 0x9e, 0x1f, 0x82, 0x7b, 0x9e, 0xca, 0xd8, 0x03, ++ 0x85, 0xda, 0xbc, 0x9a, 0x8a, 0x42, 0x99, 0xf3, 0xb9, 0x1c, 0x3b, 0x25, ++ 0x55, 0xa7, 0xcd, 0x76, 0x8d, 0xc0, 0x78, 0xa4, 0xc9, 0x98, 0xf8, 0x1e, ++ 0x8e, 0x3a, 0xde, 0x33, 0xaa, 0x5c, 0xb6, 0x7b, 0x09, 0x0e, 0x6a, 0x1e, ++ 0x1a, 0xd3, 0xbf, 0x58, 0x46, 0xef, 0x2b, 0xf3, 0xa9, 0xef, 0x3d, 0x2d, ++ 0xbc, 0x38, 0xea, 0x4a, 0xfe, 0x4e, 0xd0, 0xdb, 0x3e, 0xec, 0x2f, 0xe2, ++ 0xf2, 0x19, 0xf5, 0xeb, 0x8d, 0x71, 0xeb, 0xbc, 0x30, 0x37, 0xef, 0x1b, ++ 0xd5, 0x2c, 0x11, 0xde, 0x0e, 0x88, 0xe8, 0x57, 0x50, 0xd7, 0xff, 0xbf, ++ 0x0b, 0x5f, 0xab, 0xd1, 0xa7, 0x01, 0x78, 0x74, 0x7c, 0xc6, 0xa7, 0x13, ++ 0x29, 0x0e, 0xc3, 0x72, 0x68, 0xdf, 0xb7, 0xa8, 0xf8, 0xa3, 0xe4, 0x57, ++ 0x2d, 0x1c, 0xac, 0x8b, 0x4c, 0x8c, 0xc9, 0xaf, 0x63, 0x8e, 0x01, 0x37, ++ 0x9e, 0xf7, 0x5b, 0x37, 0x26, 0x79, 0x36, 0x12, 0xfe, 0x29, 0xfa, 0x43, ++ 0xf8, 0x1d, 0xdd, 0xe5, 0xa4, 0xcf, 0x3f, 0xde, 0xe0, 0x3a, 0x1c, 0xde, ++ 0x5c, 0xee, 0x8f, 0xab, 0x96, 0x28, 0x3f, 0x48, 0x19, 0x6f, 0x38, 0x38, ++ 0xc7, 0xe7, 0x3f, 0xa8, 0x7e, 0x1b, 0xfa, 0xc5, 0xe4, 0x1f, 0xb6, 0x6f, ++ 0xe7, 0xf9, 0x8f, 0x59, 0xf6, 0xaa, 0x8f, 0xf1, 0x9e, 0x14, 0x3e, 0x3f, ++ 0xad, 0xc1, 0x2b, 0xed, 0x7d, 0xa8, 0xf6, 0xde, 0xe7, 0x04, 0xb4, 0x2f, ++ 0xbe, 0x8d, 0xf7, 0xbb, 0xc4, 0xe8, 0x7c, 0xe8, 0xbf, 0x0d, 0x92, 0xfe, ++ 0xaa, 0xbd, 0xa7, 0x15, 0xbf, 0x2e, 0xf5, 0xfe, 0x8d, 0xba, 0x9e, 0x76, ++ 0x23, 0x2b, 0x22, 0x7b, 0x54, 0x07, 0xfc, 0x01, 0xe6, 0x9b, 0x67, 0xeb, ++ 0x17, 0x05, 0x19, 0xfd, 0xf1, 0x03, 0x22, 0xc5, 0xcb, 0xc7, 0x72, 0x3f, ++ 0x11, 0xe6, 0x08, 0xf3, 0x7b, 0x2f, 0x5c, 0xcf, 0xd3, 0x67, 0xeb, 0x78, ++ 0x3e, 0xc7, 0x18, 0x99, 0xeb, 0x7d, 0xae, 0x81, 0xd1, 0xb1, 0xf1, 0xa2, ++ 0x8f, 0x0a, 0xb9, 0x5c, 0x9f, 0x97, 0xf4, 0x66, 0x8b, 0x0c, 0xf2, 0xef, ++ 0xfd, 0xc2, 0xc0, 0x42, 0xcc, 0x57, 0x9a, 0x37, 0xe2, 0xcd, 0x16, 0x27, ++ 0xd4, 0x4f, 0x15, 0x36, 0x2f, 0xc4, 0x7c, 0xa6, 0x79, 0xd9, 0x6f, 0x7e, ++ 0xea, 0x04, 0x9d, 0xed, 0xb7, 0x85, 0x5f, 0xe1, 0xf5, 0x92, 0x37, 0x3f, ++ 0xcd, 0x83, 0xfa, 0xff, 0x2a, 0x5c, 0xc5, 0xeb, 0xd3, 0x18, 0x01, 0xe5, ++ 0x77, 0x85, 0xab, 0x17, 0x22, 0x5f, 0xfd, 0xa8, 0x50, 0x52, 0xfc, 0x97, ++ 0x91, 0x1c, 0x9c, 0x6f, 0x9e, 0xc0, 0xf1, 0xe5, 0x8b, 0x96, 0x7a, 0x93, ++ 0x2e, 0x61, 0x3c, 0xff, 0x7c, 0xa1, 0xea, 0x4f, 0x64, 0x06, 0x9c, 0xc7, ++ 0xd7, 0xf3, 0xaf, 0x27, 0x91, 0x1f, 0xf9, 0x54, 0xff, 0xab, 0x57, 0x1b, ++ 0x87, 0x64, 0xd8, 0x94, 0x89, 0xf7, 0x86, 0x94, 0x9f, 0x3d, 0x85, 0xf4, ++ 0x99, 0x39, 0xf8, 0x37, 0xc0, 0xf3, 0x66, 0x31, 0xdc, 0x8b, 0xef, 0xeb, ++ 0xcc, 0x61, 0x82, 0xeb, 0x58, 0xcc, 0xa3, 0x29, 0x22, 0x14, 0x78, 0xe2, ++ 0xf2, 0x15, 0xf2, 0x25, 0xe2, 0xf1, 0x48, 0x00, 0x74, 0x6d, 0x45, 0x7d, ++ 0x59, 0x96, 0x58, 0x1d, 0xe8, 0xc7, 0xed, 0xad, 0xcc, 0x6f, 0xc9, 0x8f, ++ 0xc1, 0x73, 0xe6, 0x55, 0xf0, 0x9c, 0xe7, 0xf5, 0xa8, 0xeb, 0x51, 0xe7, ++ 0x1f, 0xb2, 0x2e, 0x38, 0x52, 0x31, 0x2d, 0x76, 0x5d, 0xdb, 0x68, 0x1c, ++ 0x75, 0x5d, 0xe7, 0xca, 0x4c, 0x41, 0xbc, 0x5f, 0xa6, 0xc6, 0x55, 0xd5, ++ 0x75, 0x9d, 0x13, 0x06, 0x9e, 0x41, 0x67, 0xc4, 0x9c, 0x92, 0x9d, 0x8b, ++ 0xf1, 0x5c, 0xcf, 0x25, 0x0f, 0x8c, 0x16, 0xa0, 0xfe, 0xfc, 0xd8, 0xb7, ++ 0xe9, 0x9c, 0xcf, 0x65, 0x0c, 0x3c, 0x23, 0x78, 0x62, 0xea, 0x06, 0x7e, ++ 0x8e, 0x23, 0xc7, 0x3e, 0x4a, 0x7a, 0x4f, 0x8b, 0xe0, 0x1d, 0x39, 0x16, ++ 0xf9, 0xa5, 0xd1, 0x46, 0xf7, 0xd8, 0x3a, 0x15, 0x3d, 0x6f, 0x53, 0x86, ++ 0x3f, 0xc8, 0xb8, 0x7e, 0x4f, 0xf9, 0x8f, 0xc1, 0x5c, 0x7e, 0x3f, 0xa0, ++ 0x7a, 0xa2, 0xe0, 0x8d, 0x8d, 0xfb, 0x3b, 0xc7, 0xf2, 0xb8, 0x49, 0x48, ++ 0x29, 0x67, 0x9a, 0x36, 0x37, 0x9f, 0x00, 0x7c, 0x0c, 0xec, 0x15, 0xd8, ++ 0x1a, 0xe8, 0x1f, 0xb8, 0x74, 0xc1, 0x88, 0xf6, 0xf8, 0xbc, 0x9e, 0x53, ++ 0x46, 0xb4, 0xbb, 0x9b, 0xf6, 0x9e, 0x32, 0xa2, 0x5d, 0xdd, 0x84, 0x75, ++ 0x18, 0xa7, 0x69, 0x9b, 0x91, 0xf8, 0x55, 0x3c, 0xbc, 0x77, 0x8e, 0xd5, ++ 0x6b, 0xe2, 0xeb, 0xaa, 0x3d, 0x71, 0x38, 0xb7, 0x70, 0x9d, 0x1d, 0xd6, ++ 0xd3, 0xb4, 0x42, 0xf0, 0x60, 0xca, 0xec, 0xaa, 0xfd, 0xa9, 0x33, 0xb1, ++ 0xbe, 0x6a, 0x39, 0xee, 0x92, 0xb1, 0xdb, 0x6f, 0xd8, 0x33, 0x13, 0xd1, ++ 0xa5, 0xde, 0xd7, 0xbb, 0x0e, 0xcb, 0x65, 0xac, 0xff, 0x30, 0xde, 0x9f, ++ 0x5b, 0xe2, 0xd7, 0xea, 0xf9, 0x4b, 0x1b, 0xb4, 0x7a, 0x79, 0x7d, 0xb3, ++ 0x56, 0x9f, 0x5e, 0xb6, 0x19, 0x4e, 0x07, 0xe4, 0xd7, 0xb2, 0xd6, 0x6c, ++ 0xcd, 0x7b, 0x0c, 0x35, 0x64, 0x58, 0xcf, 0x12, 0xe5, 0x3c, 0x97, 0x38, ++ 0x1e, 0x8d, 0xe8, 0xc7, 0x63, 0x3d, 0xe6, 0x5e, 0x8e, 0x40, 0x64, 0x4d, ++ 0xfe, 0x9d, 0xa5, 0x7c, 0x07, 0x50, 0x6a, 0xfd, 0x16, 0xf3, 0x7a, 0x04, ++ 0xa2, 0xe3, 0xa6, 0x5a, 0x33, 0xf9, 0x5f, 0x0f, 0xe7, 0xf2, 0x7c, 0xfa, ++ 0xc0, 0x4a, 0x3d, 0xe5, 0x09, 0x05, 0x10, 0x1d, 0xb0, 0xde, 0x2c, 0x28, ++ 0xfe, 0x2c, 0x2f, 0xf1, 0x47, 0x55, 0x7e, 0xcf, 0xec, 0x3e, 0x7f, 0x24, ++ 0x1b, 0xdf, 0x5f, 0x69, 0x20, 0x38, 0xb0, 0xa0, 0x37, 0x82, 0x7e, 0xfd, ++ 0x5a, 0x05, 0x9f, 0x96, 0xd5, 0xd6, 0x7c, 0x8c, 0x78, 0x56, 0x2b, 0xdf, ++ 0xc7, 0xe5, 0xf8, 0x98, 0x5d, 0x06, 0xf2, 0xaf, 0xf8, 0xb9, 0x3e, 0x2e, ++ 0x2b, 0xfe, 0xef, 0xba, 0xee, 0xc7, 0xaa, 0xd3, 0x50, 0xff, 0x6c, 0x11, ++ 0xc8, 0xbf, 0xb1, 0xb4, 0x41, 0xab, 0xaf, 0xd7, 0xe3, 0x1f, 0xa8, 0xbf, ++ 0xb5, 0x0a, 0xa1, 0xb0, 0x13, 0xe1, 0xa4, 0x6d, 0x5f, 0xd6, 0xaa, 0xad, ++ 0xdf, 0x35, 0x56, 0x91, 0x63, 0x25, 0xac, 0x04, 0xe9, 0xa4, 0x61, 0xac, ++ 0x20, 0x12, 0xdd, 0x28, 0xf5, 0x3f, 0xe6, 0xfe, 0xe2, 0x8d, 0x30, 0x4c, ++ 0xf4, 0x90, 0xe0, 0xbb, 0x7f, 0x2c, 0x1c, 0xd0, 0x4a, 0x63, 0x78, 0x3c, ++ 0xca, 0xb5, 0x87, 0x04, 0x3f, 0xd5, 0xd5, 0x76, 0x78, 0xde, 0xc4, 0xe5, ++ 0x0e, 0x97, 0xf7, 0x3a, 0xa0, 0x28, 0xe2, 0xbb, 0x06, 0xee, 0x57, 0x08, ++ 0x36, 0x0a, 0x84, 0x8f, 0x4b, 0x87, 0xc8, 0xff, 0x18, 0xfd, 0x40, 0x3f, ++ 0xb4, 0xfe, 0xcc, 0x58, 0x2e, 0xdf, 0xda, 0x2d, 0xbe, 0x16, 0xb2, 0x97, ++ 0x5e, 0x15, 0x24, 0xd4, 0x47, 0xaa, 0x45, 0xaf, 0x98, 0xe6, 0x8e, 0xda, ++ 0xb3, 0xf1, 0xf8, 0xf8, 0xac, 0x82, 0xdf, 0x6f, 0xb0, 0x7e, 0x37, 0xae, ++ 0xab, 0x10, 0x81, 0x0e, 0xf0, 0x2f, 0x5c, 0x38, 0x22, 0x84, 0xfe, 0xb0, ++ 0xc2, 0x9f, 0x2c, 0xa7, 0x7c, 0xc7, 0xc2, 0x0a, 0xc1, 0xa3, 0x23, 0x7a, ++ 0xd6, 0xb1, 0xd6, 0x72, 0x2c, 0x45, 0xe2, 0x0f, 0xa8, 0x6f, 0x5a, 0xa0, ++ 0x2c, 0xd4, 0x77, 0xd5, 0x12, 0xbf, 0x9e, 0x60, 0x94, 0x78, 0x3e, 0xa1, ++ 0x83, 0xc5, 0xf2, 0x01, 0xef, 0x73, 0x4c, 0xc0, 0xbc, 0x3e, 0x5c, 0x3a, ++ 0xce, 0x7b, 0x73, 0xce, 0xd1, 0xcf, 0xf0, 0x1c, 0x6f, 0xd9, 0xfa, 0xe8, ++ 0x79, 0xe4, 0x77, 0xae, 0x7c, 0x6f, 0xf9, 0x63, 0xb0, 0xbe, 0x4d, 0x16, ++ 0x3e, 0xff, 0xa6, 0xfd, 0x02, 0xe9, 0xaf, 0x4d, 0xee, 0x23, 0xc4, 0x17, ++ 0x47, 0x02, 0x9a, 0xe0, 0xbc, 0x4d, 0x0e, 0x85, 0x3f, 0x76, 0x03, 0x7f, ++ 0x54, 0xf7, 0x0f, 0xe7, 0x3d, 0x12, 0xf9, 0x15, 0x5e, 0x10, 0x99, 0xeb, ++ 0xa6, 0x79, 0x47, 0xa9, 0xf1, 0x01, 0x35, 0xdf, 0x36, 0x5c, 0xa5, 0xbb, ++ 0x0c, 0xe7, 0x37, 0x52, 0x99, 0x77, 0x67, 0xa9, 0x4c, 0xfb, 0xce, 0xbc, ++ 0xaf, 0x4b, 0xc0, 0x7d, 0xe7, 0xb2, 0xe0, 0x1a, 0xf4, 0x13, 0xfd, 0xf3, ++ 0x58, 0x46, 0x70, 0x54, 0x4b, 0xd5, 0x8f, 0xbf, 0x38, 0x1a, 0xc7, 0x76, ++ 0xe2, 0x79, 0x36, 0x3a, 0xfa, 0x8d, 0xa4, 0x7f, 0x2b, 0x71, 0xec, 0x04, ++ 0xfd, 0x4a, 0x12, 0xf6, 0xf3, 0x32, 0x8d, 0x1f, 0x61, 0xa6, 0xfe, 0x52, ++ 0x0a, 0xc6, 0x9b, 0x57, 0xbd, 0x9a, 0x7f, 0xc5, 0x7c, 0x0b, 0xbd, 0x59, ++ 0xa7, 0xa1, 0x57, 0x83, 0x64, 0xd5, 0xd0, 0xf5, 0xcd, 0x45, 0x5a, 0x3a, ++ 0x9f, 0xe7, 0xd1, 0xd2, 0xf7, 0xad, 0x53, 0xf2, 0x35, 0xed, 0xf3, 0xbd, ++ 0x25, 0x9a, 0xf6, 0x85, 0x35, 0x15, 0x9a, 0xfa, 0x62, 0xdf, 0x34, 0x4d, ++ 0xff, 0xdb, 0x6a, 0x67, 0x68, 0xed, 0x7d, 0xc7, 0x1c, 0x4d, 0x7f, 0x8b, ++ 0xbc, 0x40, 0x53, 0x4f, 0x2a, 0xba, 0x5d, 0xd3, 0x3f, 0xd9, 0x73, 0xa7, ++ 0x96, 0xdf, 0xd8, 0xbb, 0x28, 0xaf, 0xc0, 0x68, 0x0e, 0xf6, 0xfb, 0x01, ++ 0x0e, 0x9d, 0x80, 0xab, 0x53, 0xd2, 0xa2, 0xfc, 0xba, 0x24, 0xc5, 0x8c, ++ 0x49, 0xc7, 0xcc, 0x5a, 0x61, 0xb1, 0x61, 0xd9, 0x59, 0x66, 0x0a, 0xe3, ++ 0xb9, 0x75, 0x66, 0xf1, 0x38, 0xab, 0xe9, 0xb5, 0x07, 0x1c, 0x61, 0x84, ++ 0xfa, 0x88, 0x17, 0xcd, 0x95, 0x50, 0xbe, 0x20, 0x84, 0xaa, 0x30, 0x5e, ++ 0x64, 0x56, 0xec, 0xbc, 0xe2, 0x87, 0x99, 0x86, 0x9f, 0x8f, 0x2d, 0xe1, ++ 0x78, 0xae, 0x96, 0xef, 0x8f, 0xf5, 0x7f, 0x5c, 0x04, 0xa5, 0x7b, 0xb7, ++ 0x9c, 0xcd, 0xf3, 0xa7, 0x23, 0xc5, 0x78, 0x3e, 0x66, 0x74, 0x20, 0x22, ++ 0x1e, 0xef, 0x33, 0x93, 0xde, 0x31, 0x21, 0x4e, 0xff, 0xfd, 0x5e, 0x69, ++ 0xe5, 0x6f, 0x51, 0xae, 0xb8, 0x1f, 0xf6, 0xce, 0x26, 0xbf, 0x54, 0x37, ++ 0x93, 0xf0, 0xfe, 0xec, 0x0e, 0x23, 0xcf, 0x73, 0x0a, 0xee, 0xe3, 0xf9, ++ 0xb4, 0xee, 0xee, 0x7e, 0x9d, 0x37, 0x86, 0xde, 0x02, 0x45, 0x5c, 0xde, ++ 0x7f, 0xd3, 0x57, 0x45, 0x79, 0x4b, 0x4d, 0x3d, 0x20, 0xcd, 0x10, 0xbf, ++ 0xb7, 0x9e, 0x36, 0xa2, 0xdf, 0xae, 0xa9, 0xa7, 0x37, 0x05, 0xe5, 0xc6, ++ 0x78, 0xdf, 0x69, 0x23, 0xea, 0xd7, 0xd1, 0xe7, 0x8a, 0x3c, 0x11, 0x07, ++ 0xac, 0x18, 0xbf, 0xfc, 0x97, 0xae, 0xc4, 0xf9, 0x69, 0x63, 0x8a, 0x8c, ++ 0x34, 0xfe, 0x11, 0x85, 0xdf, 0xd6, 0x3f, 0xc0, 0xf9, 0x2d, 0x20, 0xdc, ++ 0x5c, 0xb4, 0x8f, 0x54, 0xfe, 0x59, 0xbf, 0x87, 0xef, 0xaf, 0x7e, 0xb1, ++ 0x91, 0xe8, 0x5b, 0xe5, 0xa3, 0xc0, 0x3f, 0x35, 0xf1, 0xb0, 0x78, 0xbe, ++ 0xbc, 0xf4, 0x86, 0xd0, 0x3a, 0xa4, 0x5d, 0xe0, 0xa3, 0x1a, 0xfb, 0x65, ++ 0xd9, 0xa2, 0x59, 0x1f, 0xa3, 0x3d, 0xc4, 0x58, 0x98, 0xf4, 0x18, 0xe0, ++ 0xa3, 0xda, 0xf6, 0x9c, 0xf5, 0x44, 0xdf, 0xcb, 0xe2, 0xec, 0x9b, 0xe4, ++ 0x22, 0xe0, 0xa7, 0xa8, 0x47, 0x94, 0x30, 0xf7, 0x65, 0xa0, 0x97, 0x93, ++ 0x3e, 0x5d, 0xc2, 0x7d, 0xb9, 0x4b, 0xf8, 0xf7, 0x02, 0x4e, 0xfa, 0x67, ++ 0x10, 0xbc, 0xbf, 0x09, 0x70, 0x43, 0xbb, 0xf1, 0x9b, 0x43, 0xe0, 0xc4, ++ 0xe1, 0x77, 0x35, 0xf8, 0xbc, 0xa4, 0xf8, 0x13, 0xd5, 0x73, 0x8a, 0xef, ++ 0x57, 0x56, 0xc2, 0xf9, 0xe8, 0x4b, 0xc3, 0xf0, 0xcb, 0x07, 0x8a, 0x78, ++ 0xfb, 0x0e, 0x21, 0x52, 0x8e, 0xcc, 0x2c, 0xe0, 0xb3, 0x12, 0x9e, 0x2e, ++ 0x35, 0x9b, 0x17, 0x63, 0xfe, 0xc1, 0x91, 0xdc, 0x3f, 0xad, 0xc7, 0x78, ++ 0x42, 0xfd, 0x0f, 0x04, 0xb4, 0x65, 0xd9, 0xaf, 0x7b, 0x5f, 0xcb, 0xc4, ++ 0x7c, 0x04, 0xe3, 0x9e, 0xc3, 0x99, 0x98, 0x27, 0x11, 0xe8, 0x3a, 0x9c, ++ 0xc9, 0x00, 0x4e, 0x2b, 0x0d, 0xf2, 0x1a, 0xd4, 0x8b, 0x01, 0x0f, 0x3c, ++ 0x6b, 0xe0, 0x5c, 0x9a, 0xba, 0xc3, 0xb4, 0xfe, 0xc6, 0xae, 0x8a, 0x5e, ++ 0x7c, 0xde, 0xd8, 0x2d, 0x78, 0x90, 0x15, 0x06, 0xf6, 0x9e, 0x9f, 0x45, ++ 0xfb, 0x64, 0xfd, 0xeb, 0x51, 0x8f, 0xdf, 0x31, 0xcc, 0xba, 0xa6, 0x15, ++ 0x71, 0x7d, 0x78, 0x56, 0x91, 0xcc, 0xf3, 0x98, 0xfd, 0x30, 0x27, 0xca, ++ 0xd9, 0xbd, 0x26, 0xb2, 0x63, 0xeb, 0xf7, 0x00, 0x1f, 0xc2, 0x75, 0xed, ++ 0x17, 0xe8, 0x5e, 0xc6, 0x8e, 0x0d, 0xe6, 0xda, 0x44, 0xfa, 0xc9, 0x64, ++ 0x84, 0x37, 0xc0, 0xe9, 0xd0, 0x06, 0x23, 0xc3, 0x38, 0xca, 0x4a, 0x78, ++ 0x1f, 0xf7, 0x71, 0x24, 0xf7, 0x88, 0xd1, 0x8c, 0x78, 0xb3, 0x47, 0x20, ++ 0x9b, 0x30, 0xd0, 0x75, 0x62, 0x31, 0xfa, 0xe3, 0x03, 0x2d, 0x06, 0x86, ++ 0x71, 0x5b, 0x75, 0x7d, 0x67, 0x72, 0x23, 0xef, 0xe3, 0xfe, 0xdf, 0x59, ++ 0x61, 0x60, 0x78, 0x8f, 0xb0, 0x7d, 0x05, 0x8f, 0xc7, 0xbe, 0xd3, 0xa2, ++ 0xa7, 0x71, 0xf4, 0x77, 0x1b, 0xa8, 0xbe, 0xe4, 0x5e, 0x9e, 0x37, 0x7c, ++ 0x70, 0xc5, 0x6f, 0xd7, 0x67, 0xc3, 0xb8, 0xef, 0xac, 0x14, 0x28, 0xdf, ++ 0x7e, 0xc6, 0xdd, 0xff, 0x76, 0x04, 0xeb, 0x4b, 0xee, 0xe5, 0x7a, 0x50, ++ 0x3c, 0xfe, 0x0e, 0xe2, 0x6b, 0x1c, 0x7e, 0x2e, 0xf1, 0x6b, 0xf1, 0x6e, ++ 0x08, 0x9e, 0x36, 0x7c, 0x31, 0x3c, 0xbd, 0x33, 0x8a, 0xa7, 0xe3, 0x51, ++ 0xce, 0xc2, 0xb9, 0xcf, 0x1c, 0x89, 0xf8, 0xf3, 0x20, 0xa3, 0x7b, 0x8c, ++ 0xb5, 0x97, 0x0e, 0x1a, 0x46, 0xc2, 0x7a, 0xf3, 0xd6, 0x4b, 0x1e, 0x0c, ++ 0xed, 0x96, 0xea, 0x43, 0xeb, 0x32, 0x91, 0x2f, 0x1c, 0xe4, 0xed, 0x65, ++ 0x2b, 0xb7, 0x0b, 0x9c, 0xbf, 0xc8, 0x74, 0xbf, 0x3d, 0xbb, 0xd3, 0xc8, ++ 0xd0, 0x6e, 0x7c, 0x40, 0x39, 0xaf, 0x07, 0x94, 0xf3, 0x92, 0xd9, 0x80, ++ 0x80, 0xf9, 0x6e, 0x4c, 0x8c, 0xe4, 0xe1, 0xfa, 0x9c, 0x4a, 0x7e, 0xd7, ++ 0xcb, 0x06, 0x56, 0xbb, 0x07, 0xfd, 0x48, 0x22, 0xe7, 0x2f, 0xa5, 0x3f, ++ 0x74, 0x6c, 0x8f, 0xf5, 0x23, 0xb9, 0x14, 0xbe, 0xa2, 0xf2, 0xbd, 0x12, ++ 0xb0, 0xf7, 0xf7, 0x90, 0x1f, 0xba, 0x2b, 0x0b, 0xef, 0x9d, 0xbf, 0x64, ++ 0xe0, 0xfe, 0xb1, 0xd1, 0xca, 0x78, 0x05, 0xf9, 0x03, 0xb3, 0xe6, 0x43, ++ 0xf9, 0xcd, 0x22, 0xce, 0x07, 0xdb, 0x94, 0x75, 0xa8, 0x75, 0xaf, 0x82, ++ 0xff, 0xcc, 0xbe, 0x83, 0xe0, 0x3b, 0xcf, 0xcc, 0xe1, 0x3e, 0xa7, 0x35, ++ 0x5c, 0x87, 0xfb, 0xb8, 0x47, 0xf4, 0xaf, 0x2b, 0x82, 0xf6, 0xb9, 0xa3, ++ 0x7f, 0xb1, 0x92, 0x51, 0x7e, 0xe4, 0xeb, 0x6e, 0x3f, 0xf9, 0xb9, 0x8a, ++ 0x49, 0xae, 0x05, 0x94, 0xf3, 0x38, 0x38, 0xf5, 0x77, 0xdb, 0x56, 0x63, ++ 0x1e, 0xde, 0x38, 0x2b, 0x9d, 0xe3, 0xfc, 0xbe, 0xa7, 0x22, 0x78, 0xae, ++ 0x4d, 0x2e, 0x91, 0xf2, 0x0f, 0x2d, 0x05, 0x13, 0x47, 0xfa, 0xaf, 0xe0, ++ 0x47, 0x08, 0x5c, 0x94, 0x35, 0xf7, 0xf8, 0x9a, 0x7a, 0xce, 0xcf, 0xf2, ++ 0x26, 0xa0, 0xeb, 0x69, 0xca, 0x7a, 0x4b, 0x95, 0xfb, 0x7a, 0xac, 0x87, ++ 0xfb, 0x0f, 0x80, 0x1f, 0x8b, 0x53, 0xca, 0xa3, 0xfd, 0xd4, 0xfd, 0xab, ++ 0x7e, 0x0f, 0x4b, 0xc1, 0x77, 0xe9, 0x9c, 0x56, 0x7f, 0x85, 0x95, 0xf1, ++ 0x7b, 0xfc, 0x8f, 0xd1, 0xfe, 0x97, 0xae, 0x3c, 0x21, 0xe0, 0x3d, 0x95, ++ 0xdb, 0x0c, 0x5e, 0x83, 0x0d, 0xe0, 0xfc, 0x8b, 0x11, 0x6c, 0x31, 0xda, ++ 0xc1, 0xaf, 0xb7, 0x31, 0xba, 0xb7, 0x76, 0x0c, 0xef, 0xaf, 0x01, 0x2b, ++ 0x79, 0xa3, 0x4d, 0xa2, 0x7a, 0x44, 0xb9, 0xc7, 0xf6, 0x66, 0x9b, 0x4c, ++ 0xe5, 0x6d, 0x46, 0xdf, 0x6e, 0x84, 0xcf, 0xe2, 0x43, 0xcd, 0x05, 0x08, ++ 0xaf, 0x83, 0xb9, 0x4f, 0xfa, 0xf0, 0xbb, 0x0c, 0xe7, 0x8e, 0x29, 0xfa, ++ 0x2c, 0x93, 0xf8, 0xbd, 0x46, 0x05, 0xf7, 0x2e, 0xf4, 0xe8, 0x99, 0x19, ++ 0xda, 0x2f, 0xec, 0x15, 0x42, 0xe4, 0x34, 0x51, 0xd6, 0x7f, 0xc7, 0xc5, ++ 0x2c, 0xe6, 0x07, 0x7e, 0xf2, 0x2b, 0xe5, 0xbe, 0x5c, 0x63, 0xeb, 0xcf, ++ 0x89, 0xcf, 0x79, 0x1a, 0xce, 0xcf, 0x42, 0x3b, 0xa3, 0x6c, 0xe5, 0xa9, ++ 0xf5, 0x58, 0x0f, 0xb4, 0xfe, 0xdb, 0x2c, 0xd4, 0x1b, 0xde, 0x07, 0x39, ++ 0x81, 0xf8, 0x15, 0xe8, 0x16, 0x98, 0x03, 0xc6, 0xa9, 0xbb, 0x98, 0x46, ++ 0xef, 0x37, 0x76, 0x9f, 0x30, 0xa2, 0x3d, 0xff, 0x92, 0x6e, 0x60, 0x16, ++ 0xc2, 0x3f, 0x78, 0x40, 0xa0, 0x7b, 0x56, 0x81, 0xe6, 0xf3, 0xc4, 0x3f, ++ 0xb7, 0x29, 0xfe, 0x95, 0x8f, 0x8a, 0x78, 0x1c, 0x31, 0xd0, 0x53, 0xa6, ++ 0xa3, 0xf3, 0xf4, 0x16, 0x73, 0xfb, 0x44, 0x39, 0xff, 0xde, 0xe2, 0x7f, ++ 0x4f, 0x41, 0xfe, 0x65, 0x6e, 0x95, 0x8f, 0x4f, 0xc3, 0x73, 0x3c, 0xaa, ++ 0xa7, 0x73, 0xdc, 0x58, 0x35, 0x90, 0x22, 0x25, 0x38, 0x97, 0x93, 0x30, ++ 0x2e, 0xe6, 0x8f, 0xfc, 0x4a, 0xc9, 0xd3, 0x8b, 0x6f, 0xaf, 0x35, 0x06, ++ 0xc9, 0x2f, 0x5b, 0xab, 0xe0, 0x6d, 0x7c, 0xfb, 0x07, 0x0a, 0x3e, 0x02, ++ 0x84, 0x0d, 0x4a, 0x9e, 0x12, 0x13, 0x60, 0x3d, 0x75, 0x0a, 0x7e, 0xd5, ++ 0xe3, 0xf7, 0x61, 0xd2, 0x50, 0xcf, 0x17, 0xc2, 0x56, 0xa0, 0xdb, 0xfa, ++ 0x9e, 0x19, 0xe4, 0xdf, 0xa8, 0x6f, 0xbe, 0xf2, 0xf7, 0x5e, 0x86, 0xc3, ++ 0xb7, 0x6b, 0x2d, 0x9b, 0x18, 0xf7, 0x6f, 0xa8, 0x75, 0xb4, 0xbf, 0x62, ++ 0xf3, 0xb8, 0xd0, 0xfe, 0xd2, 0xde, 0x4b, 0x0f, 0xd2, 0x3e, 0x4c, 0xb9, ++ 0xae, 0x91, 0xfe, 0x2b, 0xe8, 0x77, 0x81, 0xfe, 0x2c, 0x8a, 0x9f, 0x34, ++ 0x75, 0x32, 0x8a, 0x97, 0x34, 0x5e, 0x2c, 0xa6, 0xf2, 0xec, 0xfe, 0x47, ++ 0xe8, 0x1e, 0x94, 0xd9, 0x3a, 0xf0, 0x24, 0xca, 0x05, 0x56, 0xa8, 0x23, ++ 0xbd, 0xbe, 0x31, 0xa8, 0xd5, 0x6f, 0x8e, 0x17, 0x73, 0x3a, 0x38, 0x5e, ++ 0xcc, 0xe9, 0xf9, 0x52, 0x11, 0xd8, 0x27, 0x66, 0x36, 0x68, 0x9f, 0x80, ++ 0x1d, 0x72, 0x19, 0xf1, 0x12, 0xec, 0x90, 0x94, 0x3e, 0xa6, 0xb1, 0x4f, ++ 0xe2, 0x9f, 0x93, 0x7d, 0x62, 0x56, 0xfc, 0x86, 0xa0, 0x2e, 0xf9, 0x5f, ++ 0x4e, 0xb0, 0xee, 0xb7, 0x8a, 0xab, 0xc4, 0x71, 0x19, 0x48, 0x57, 0x9b, ++ 0x09, 0xbf, 0x19, 0xe0, 0x37, 0xe2, 0x55, 0xfc, 0x3e, 0x47, 0x8c, 0xe3, ++ 0xeb, 0x52, 0xe9, 0x79, 0x49, 0xdf, 0xc7, 0x46, 0xd4, 0x77, 0x03, 0xdd, ++ 0x89, 0xe9, 0xf9, 0x37, 0xc5, 0x95, 0x23, 0x70, 0xdc, 0x0d, 0xc3, 0xe4, ++ 0xe5, 0xbd, 0x5d, 0xcc, 0xf9, 0x5d, 0xe3, 0x56, 0x46, 0xf0, 0x0a, 0x6c, ++ 0x4d, 0x23, 0x38, 0x9d, 0x61, 0x5b, 0x7d, 0x55, 0x80, 0x97, 0x67, 0x60, ++ 0x1d, 0x78, 0x4f, 0xfd, 0x9c, 0xcf, 0x97, 0x94, 0x0a, 0xef, 0x9f, 0xf3, ++ 0xfb, 0x92, 0x30, 0x3e, 0xa7, 0xd2, 0x7f, 0xd3, 0x56, 0x2b, 0xbd, 0xb7, ++ 0xc1, 0xb5, 0x20, 0x1d, 0xbf, 0xab, 0xe1, 0x1a, 0xc7, 0xbf, 0xeb, 0x73, ++ 0xb6, 0x7b, 0x86, 0x19, 0xe1, 0x7c, 0xc7, 0x56, 0x4e, 0x77, 0xea, 0x7c, ++ 0xef, 0x87, 0x97, 0xa4, 0x23, 0xfd, 0x4c, 0x32, 0x0c, 0x18, 0xd1, 0x3f, ++ 0x99, 0xd3, 0x73, 0x2a, 0x05, 0xf5, 0xba, 0x49, 0xfb, 0x17, 0xa6, 0x23, ++ 0xfd, 0x0d, 0xb7, 0x4e, 0xbb, 0x72, 0x1e, 0x8d, 0xad, 0x59, 0x8b, 0xe9, ++ 0x1e, 0x10, 0xfc, 0xf4, 0x40, 0xf7, 0xf7, 0x2b, 0x72, 0x2c, 0xb0, 0x36, ++ 0x6c, 0x44, 0xf8, 0xdf, 0xdf, 0xca, 0x08, 0x7f, 0x7b, 0xf7, 0xfd, 0xba, ++ 0x09, 0xe9, 0xf7, 0x6c, 0x4f, 0x92, 0x84, 0x72, 0xf2, 0xcc, 0xab, 0x49, ++ 0x41, 0xe4, 0xf7, 0xe7, 0x0e, 0x98, 0x42, 0x3a, 0x18, 0x6a, 0xa5, 0xf2, ++ 0x3d, 0xa4, 0x33, 0x86, 0xfe, 0x5b, 0x48, 0x7f, 0xdc, 0xaf, 0xa7, 0x7c, ++ 0x85, 0xc0, 0x81, 0x3f, 0x3c, 0x89, 0xf4, 0x18, 0xd8, 0x67, 0xa2, 0x7b, ++ 0x35, 0xf7, 0xf7, 0x3c, 0x72, 0x1e, 0xe5, 0xdc, 0xca, 0x9e, 0xd9, 0x1f, ++ 0x8b, 0x58, 0xbe, 0xf8, 0xf7, 0xa5, 0x87, 0xc6, 0xd6, 0xd1, 0x8b, 0x63, ++ 0xf3, 0x8e, 0xff, 0xd0, 0xb6, 0x3b, 0x0b, 0xf9, 0xe7, 0x59, 0x91, 0xf3, ++ 0x89, 0xfb, 0xbb, 0x5f, 0x21, 0x7d, 0xf6, 0xfe, 0x4b, 0x17, 0xc6, 0x63, ++ 0xfe, 0xe0, 0x99, 0x57, 0xff, 0x63, 0x32, 0xf2, 0xb3, 0xc0, 0x4f, 0x2e, ++ 0x4c, 0x46, 0x3e, 0x16, 0xf8, 0xf1, 0x85, 0xc9, 0xd8, 0x1e, 0xf8, 0x61, ++ 0x52, 0x73, 0x22, 0xfd, 0x64, 0x66, 0x09, 0xff, 0xce, 0x86, 0x2a, 0x1f, ++ 0x9d, 0x6f, 0x89, 0x1a, 0x3f, 0xcb, 0x39, 0x05, 0x3f, 0x9c, 0x1d, 0x9b, ++ 0x6b, 0xf0, 0xbb, 0x05, 0x93, 0x4e, 0x2c, 0xa2, 0x38, 0x80, 0xda, 0x3e, ++ 0xa9, 0x40, 0xe7, 0xc3, 0xfe, 0x93, 0xde, 0xae, 0x4e, 0xbf, 0x3b, 0xe6, ++ 0xbd, 0x8e, 0x88, 0x48, 0xf9, 0x12, 0x13, 0x4f, 0x54, 0x27, 0xad, 0x88, ++ 0xc1, 0xcb, 0x0f, 0x8a, 0x0d, 0xaa, 0x9f, 0xee, 0xda, 0xfc, 0x23, 0x4a, ++ 0x1e, 0x82, 0xea, 0x1f, 0xd9, 0x10, 0x11, 0xf9, 0x3d, 0xbb, 0x06, 0x7d, ++ 0x08, 0xf3, 0x7b, 0x97, 0x46, 0x78, 0xfc, 0x3d, 0xde, 0x6f, 0xc2, 0x98, ++ 0xef, 0xe6, 0x52, 0x3c, 0xef, 0x7b, 0x33, 0x3c, 0xf8, 0xbd, 0x1e, 0xbc, ++ 0xa7, 0x8e, 0x71, 0x91, 0x73, 0x0f, 0x16, 0x84, 0xe8, 0x9e, 0x7a, 0xd0, ++ 0x7c, 0xd8, 0x15, 0xa3, 0x07, 0x2d, 0x89, 0xe8, 0xc2, 0x26, 0xf4, 0x83, ++ 0xf4, 0x98, 0xc2, 0xa8, 0x0f, 0x2d, 0x89, 0x88, 0xa7, 0x4c, 0x31, 0x7e, ++ 0x91, 0xf7, 0xa5, 0x97, 0xd7, 0xa1, 0x1a, 0xbf, 0xc4, 0xaf, 0xf5, 0x63, ++ 0xc4, 0xfb, 0x41, 0xe0, 0x97, 0x2c, 0xc6, 0xc4, 0x4f, 0xea, 0x5b, 0xc2, ++ 0x06, 0x55, 0x4e, 0xcd, 0x83, 0xf9, 0x7f, 0xb1, 0x8e, 0x49, 0x18, 0xb7, ++ 0x19, 0xe2, 0x1f, 0xa9, 0xfd, 0x12, 0xf9, 0x61, 0xe2, 0xfd, 0x24, 0x72, ++ 0xe4, 0x09, 0x33, 0xbe, 0x27, 0xbb, 0xf8, 0xf7, 0x75, 0x54, 0x3d, 0x13, ++ 0xcf, 0x6b, 0x6f, 0x02, 0x7a, 0xb7, 0x29, 0x74, 0xa2, 0xd2, 0x51, 0x47, ++ 0x44, 0x47, 0xe7, 0xd0, 0x11, 0xa9, 0x32, 0xbb, 0xa0, 0x34, 0x28, 0xed, ++ 0x7b, 0x41, 0x6c, 0x06, 0x31, 0x2f, 0xa8, 0x67, 0xe1, 0x4e, 0xb4, 0xd3, ++ 0x3b, 0x2e, 0xdd, 0x96, 0x84, 0xf0, 0xea, 0x78, 0x6b, 0x01, 0xc3, 0xef, ++ 0x47, 0x9c, 0x93, 0xaa, 0xcc, 0x05, 0xf8, 0xde, 0xa5, 0x2f, 0x99, 0x17, ++ 0xbb, 0xa3, 0xf8, 0x31, 0x84, 0x7f, 0x8c, 0xe3, 0x72, 0x65, 0x50, 0x1f, ++ 0x18, 0x46, 0xce, 0x1d, 0x51, 0xf8, 0xd6, 0xdf, 0x4b, 0xde, 0xf5, 0x8d, ++ 0xfb, 0xef, 0x21, 0xef, 0xc0, 0xae, 0x7e, 0x6d, 0x1c, 0xb7, 0xab, 0x97, ++ 0x72, 0xbf, 0x07, 0xb7, 0xab, 0xe3, 0xe5, 0x84, 0xca, 0x7f, 0xd5, 0x71, ++ 0x3f, 0x53, 0xe0, 0x3d, 0x94, 0xff, 0x7e, 0x4c, 0xfa, 0x0b, 0xd8, 0xbf, ++ 0xc4, 0x7f, 0x3f, 0x1b, 0x27, 0xf3, 0xef, 0x34, 0xf4, 0xcc, 0x4f, 0x27, ++ 0xbb, 0xf8, 0xad, 0x45, 0xe9, 0xb2, 0x6d, 0xe8, 0xf8, 0xf9, 0xa2, 0x47, ++ 0x97, 0xe6, 0x1e, 0x3a, 0xbe, 0xaa, 0xaf, 0x05, 0x82, 0xde, 0xc3, 0x66, ++ 0xb4, 0x63, 0xbc, 0x3c, 0xff, 0x34, 0xb0, 0x48, 0xa0, 0xef, 0x48, 0x05, ++ 0x7c, 0x02, 0xe9, 0xd9, 0x81, 0x3a, 0x43, 0x08, 0xdb, 0xd5, 0xf5, 0x44, ++ 0x16, 0xf1, 0xb8, 0xe0, 0x62, 0x8f, 0x40, 0xdf, 0x05, 0x51, 0xf5, 0x3f, ++ 0x55, 0x3f, 0x1c, 0x6c, 0x9f, 0x08, 0xed, 0xce, 0xa8, 0xbe, 0xa8, 0xea, ++ 0x85, 0x11, 0x1f, 0xf7, 0x8b, 0x2e, 0xf2, 0x1a, 0xa8, 0xfd, 0x36, 0xa3, ++ 0x7f, 0x60, 0xdc, 0x24, 0xdc, 0x9f, 0x85, 0x9e, 0x4f, 0x9a, 0xca, 0xc7, ++ 0x05, 0x3e, 0x70, 0x18, 0xfd, 0x9f, 0xb7, 0x7d, 0x59, 0xa0, 0xef, 0x76, ++ 0xa9, 0xfa, 0xa2, 0x8a, 0x9f, 0xf1, 0xfa, 0xe4, 0x27, 0x3d, 0xf9, 0x57, ++ 0xfc, 0x1e, 0xdd, 0x36, 0x05, 0x2f, 0x55, 0xfa, 0x1a, 0x1d, 0x47, 0x17, ++ 0xaa, 0x9c, 0x72, 0x29, 0xf0, 0x69, 0x42, 0x39, 0x9d, 0x8e, 0x72, 0xfa, ++ 0x33, 0x63, 0xbf, 0x6d, 0x78, 0xbd, 0x1b, 0xe4, 0xb4, 0x58, 0x4c, 0xef, ++ 0x31, 0xc2, 0xdb, 0x89, 0x6f, 0x8b, 0xbe, 0x44, 0x76, 0xf7, 0xb7, 0xc6, ++ 0x71, 0x7e, 0x6c, 0x2f, 0x56, 0xce, 0x2d, 0x72, 0xa8, 0x12, 0xd7, 0x9b, ++ 0xcb, 0x22, 0x94, 0x17, 0x35, 0x9c, 0xfc, 0xfc, 0xb4, 0x98, 0xd3, 0xc3, ++ 0x70, 0xed, 0xae, 0x71, 0x5c, 0xcf, 0xb9, 0x1a, 0x1d, 0x4f, 0x2f, 0xfe, ++ 0xfb, 0xd2, 0xf1, 0xb4, 0xe2, 0xff, 0x1e, 0x74, 0x3c, 0xa8, 0xff, 0x19, ++ 0x13, 0xef, 0xf3, 0xad, 0xe2, 0xca, 0x6a, 0x3c, 0x7f, 0xab, 0xbe, 0x99, ++ 0xee, 0x4d, 0xb1, 0x9f, 0x1a, 0xc8, 0x6f, 0x1d, 0xdf, 0xef, 0x33, 0x05, ++ 0xfe, 0x20, 0xcf, 0x34, 0x78, 0x7c, 0x38, 0xd7, 0xa8, 0x43, 0xbb, 0x27, ++ 0xd0, 0xc0, 0xed, 0xfe, 0xce, 0x54, 0xf9, 0x38, 0xd9, 0x27, 0xaf, 0xf1, ++ 0x7b, 0xf8, 0xf7, 0x2b, 0xf9, 0x4a, 0xf7, 0x5d, 0x94, 0xa8, 0xec, 0xc4, ++ 0x0f, 0x85, 0x61, 0xfb, 0x03, 0x4e, 0xf2, 0xdb, 0xdc, 0xb7, 0xfb, 0x84, ++ 0xc1, 0x0b, 0xef, 0x2f, 0x6d, 0x11, 0xca, 0xd0, 0x1f, 0xb4, 0xb4, 0x41, ++ 0xbb, 0x9f, 0xce, 0x0c, 0xef, 0xec, 0x58, 0x3f, 0x78, 0xe7, 0xa8, 0x2e, ++ 0x8a, 0x2b, 0x04, 0x77, 0xe6, 0xcb, 0x38, 0x7e, 0x3d, 0x6e, 0x16, 0xfd, ++ 0x21, 0x9d, 0x59, 0x21, 0x8c, 0x3d, 0x36, 0xa1, 0x1f, 0x67, 0x02, 0x3e, ++ 0x8f, 0xb9, 0x87, 0x01, 0xf3, 0x34, 0x2a, 0xcf, 0xa7, 0x29, 0xfe, 0x1d, ++ 0x16, 0xa7, 0x07, 0xfc, 0xb8, 0xf7, 0x1d, 0xf2, 0xf7, 0x60, 0x5c, 0x08, ++ 0xe9, 0xd7, 0xd8, 0x23, 0x50, 0x5e, 0x48, 0xe0, 0x28, 0xf7, 0x77, 0x34, ++ 0xf5, 0x70, 0xbe, 0xf0, 0x51, 0x83, 0x40, 0xfc, 0xe4, 0x23, 0x25, 0x3f, ++ 0x23, 0xd0, 0x6a, 0x21, 0xff, 0xb6, 0xaa, 0x47, 0x7c, 0xac, 0xf4, 0xbb, ++ 0xf7, 0x41, 0x81, 0xf4, 0xbd, 0x21, 0x7a, 0x85, 0x57, 0x1b, 0x77, 0x69, ++ 0xfc, 0xee, 0xdb, 0xc4, 0x17, 0xe3, 0xf5, 0x88, 0xb4, 0xbd, 0x7c, 0x1c, ++ 0x8c, 0xb7, 0xa0, 0x5f, 0xe6, 0x70, 0xee, 0x64, 0x01, 0xeb, 0x8d, 0x60, ++ 0x17, 0x8e, 0x44, 0x7d, 0x51, 0x96, 0x6f, 0xcd, 0xe6, 0xeb, 0x63, 0x21, ++ 0xe2, 0x2f, 0x5e, 0x8d, 0x1f, 0xe5, 0x93, 0xa3, 0xbf, 0x25, 0x3b, 0x72, ++ 0xe9, 0x7e, 0x81, 0xa5, 0x93, 0xde, 0x11, 0x17, 0x7f, 0xe9, 0x9c, 0x13, ++ 0x17, 0x7f, 0x39, 0x72, 0x38, 0x1b, 0xc7, 0x51, 0xf4, 0x0c, 0x09, 0xfe, ++ 0x0f, 0xfd, 0x87, 0xf1, 0x7a, 0x46, 0x53, 0xf7, 0x09, 0x03, 0xda, 0x05, ++ 0x57, 0x8b, 0xb3, 0x6c, 0x2e, 0xd6, 0xfa, 0x05, 0xc7, 0x88, 0xdc, 0xcf, ++ 0x3a, 0xa6, 0x47, 0x90, 0xd0, 0x9f, 0x34, 0x46, 0x81, 0xd3, 0x75, 0x1b, ++ 0xac, 0x04, 0xa7, 0x59, 0xef, 0xad, 0x48, 0x47, 0x3a, 0x57, 0xcf, 0xe7, ++ 0xec, 0x7c, 0x7e, 0x5e, 0x67, 0xdf, 0xf9, 0xb4, 0x12, 0xdf, 0x9b, 0xfc, ++ 0x9e, 0x28, 0x21, 0xbf, 0xfd, 0xf1, 0x3b, 0x2d, 0x3f, 0xcf, 0xe6, 0x75, ++ 0xd9, 0x2c, 0xe3, 0x7b, 0x2d, 0x49, 0x68, 0x87, 0x9c, 0x7d, 0x6f, 0x55, ++ 0x12, 0xc2, 0xf1, 0xc7, 0x50, 0xe2, 0xf7, 0x92, 0x7e, 0x78, 0x52, 0x4c, ++ 0xe8, 0x3f, 0xfc, 0x6b, 0xf1, 0xa0, 0xdf, 0x78, 0x67, 0x31, 0xca, 0xb7, ++ 0x87, 0x15, 0xbf, 0xb1, 0x08, 0xf2, 0x2d, 0x39, 0xea, 0x7f, 0x89, 0x7f, ++ 0x2f, 0xa7, 0x84, 0xf3, 0xa9, 0x4e, 0xfc, 0x8e, 0x11, 0xe2, 0xdf, 0x7e, ++ 0x1e, 0xdf, 0xee, 0x1c, 0xe5, 0x9f, 0x43, 0xf5, 0xa7, 0xf2, 0x78, 0x1e, ++ 0xb1, 0xc8, 0xf1, 0xf5, 0x95, 0x9e, 0x54, 0x09, 0xf5, 0xbd, 0x12, 0xd8, ++ 0x2c, 0xc6, 0x61, 0xbf, 0x6f, 0x65, 0x1d, 0x18, 0x5f, 0xe9, 0xcc, 0xf0, ++ 0xbf, 0x4e, 0xf4, 0xf1, 0x94, 0x8e, 0xf0, 0x17, 0xde, 0xe7, 0xdf, 0xa1, ++ 0xd8, 0x23, 0x93, 0xbc, 0xc3, 0xd0, 0x14, 0xc6, 0x3f, 0xc6, 0x83, 0xac, ++ 0x31, 0x53, 0x5e, 0xa3, 0x9d, 0xe2, 0x20, 0xea, 0x77, 0x62, 0x46, 0x81, ++ 0x1d, 0xaa, 0x7c, 0x57, 0x61, 0x11, 0xc6, 0x5d, 0x4b, 0x94, 0x38, 0xc8, ++ 0x78, 0x2b, 0x13, 0x71, 0xfc, 0x4d, 0x06, 0xff, 0xc6, 0x71, 0x18, 0x77, ++ 0xe9, 0x15, 0x3d, 0x6b, 0xf0, 0x1d, 0xd1, 0x93, 0x8e, 0xdf, 0x45, 0x8a, ++ 0x8f, 0xc7, 0xa8, 0xf1, 0x61, 0x35, 0x2e, 0xa3, 0xc6, 0x89, 0x87, 0x8b, ++ 0xcb, 0x08, 0x38, 0xcf, 0x78, 0x8e, 0x67, 0xb1, 0xdf, 0x3d, 0x51, 0xe3, ++ 0x2f, 0xec, 0xcb, 0x3c, 0x7f, 0xb3, 0x7d, 0x4a, 0x33, 0xdd, 0x8b, 0xdd, ++ 0x8e, 0x31, 0x12, 0xe2, 0x9f, 0x43, 0xe2, 0x29, 0x7f, 0x46, 0x3b, 0x35, ++ 0x3e, 0x9e, 0x22, 0xa2, 0xfc, 0xa1, 0x38, 0x8d, 0x36, 0x9e, 0xb6, 0xb1, ++ 0xe8, 0x65, 0xc2, 0xb7, 0xcf, 0x1b, 0x47, 0x9b, 0x5e, 0x3c, 0xdc, 0xfc, ++ 0x32, 0xb7, 0xe7, 0xe2, 0xe6, 0x9f, 0x98, 0xfa, 0x49, 0x26, 0xd9, 0x2f, ++ 0x7f, 0xf9, 0x73, 0x0a, 0xc9, 0xb3, 0x9e, 0x0b, 0x24, 0x77, 0xce, 0x0d, ++ 0x98, 0x94, 0xfb, 0x9d, 0xfd, 0xdc, 0x4f, 0xdd, 0x63, 0x20, 0x7b, 0xfd, ++ 0x1c, 0xd8, 0x41, 0x19, 0x31, 0xf2, 0x6c, 0xf9, 0x38, 0x0e, 0x87, 0xbe, ++ 0x9e, 0x19, 0x84, 0x8f, 0x7b, 0x23, 0xd5, 0x49, 0xd8, 0xbf, 0x53, 0xd1, ++ 0x73, 0x36, 0xbc, 0xb5, 0x68, 0x21, 0xea, 0xd3, 0xc1, 0x88, 0xc8, 0xf3, ++ 0xb1, 0x19, 0xb7, 0x6b, 0xf6, 0x46, 0xc4, 0x49, 0x5c, 0x3f, 0x18, 0x02, ++ 0x27, 0xa9, 0x38, 0x41, 0xdc, 0xc9, 0x6c, 0x4d, 0x9c, 0x07, 0x14, 0x56, ++ 0xfc, 0x05, 0x61, 0x65, 0xdf, 0x33, 0xde, 0xe1, 0xf6, 0x4a, 0xa0, 0x85, ++ 0xc7, 0x0f, 0x24, 0x85, 0xde, 0x02, 0x35, 0x46, 0xe2, 0x27, 0x47, 0x72, ++ 0x33, 0x05, 0xd5, 0x8f, 0x3c, 0x32, 0x51, 0x7c, 0x61, 0xff, 0x00, 0xf1, ++ 0xd9, 0xfa, 0x7b, 0x79, 0x7c, 0xf7, 0x9a, 0xe3, 0x0b, 0xdd, 0xbd, 0x06, ++ 0x96, 0x97, 0xc0, 0x6f, 0x5b, 0x33, 0x8b, 0xf8, 0xcd, 0xb5, 0xfa, 0x6b, ++ 0x19, 0x5a, 0xc1, 0x93, 0xa3, 0xfc, 0x39, 0xab, 0x44, 0xe1, 0x27, 0xa5, ++ 0x8a, 0xff, 0xb6, 0x98, 0xe7, 0xf3, 0xa7, 0x35, 0x97, 0x55, 0xe2, 0xf7, ++ 0xef, 0xc2, 0xc3, 0x9e, 0xb7, 0x7f, 0x63, 0x49, 0x82, 0xf3, 0x4e, 0xd0, ++ 0x6f, 0xab, 0xfb, 0xda, 0xe2, 0x81, 0xbf, 0xbe, 0xc6, 0xb8, 0x61, 0x6a, ++ 0xd1, 0xb5, 0xf5, 0x1b, 0x93, 0x88, 0x1e, 0x12, 0xf4, 0x9b, 0x7e, 0x8d, ++ 0xe3, 0x7d, 0xf3, 0x1a, 0xfb, 0xb5, 0x5d, 0xe3, 0xbc, 0x0b, 0xc7, 0x25, ++ 0xea, 0xf7, 0xff, 0x68, 0xfc, 0x33, 0x3e, 0xbe, 0x19, 0x1f, 0x0f, 0x8d, ++ 0x8f, 0x73, 0x9a, 0x5e, 0xbb, 0x3b, 0x88, 0x6d, 0x8f, 0x08, 0x8f, 0x0e, ++ 0x84, 0x11, 0xba, 0x29, 0xfb, 0x6a, 0x05, 0x20, 0x55, 0x31, 0xf5, 0xbb, ++ 0x66, 0xe4, 0x6b, 0x73, 0xa7, 0xf2, 0x78, 0xc0, 0x86, 0x6a, 0x73, 0x68, ++ 0xbb, 0x10, 0x8d, 0x8b, 0xaa, 0xf0, 0x0a, 0x96, 0x72, 0xbd, 0x4b, 0x72, ++ 0x9f, 0x0f, 0xe2, 0x77, 0x12, 0x47, 0x7b, 0x23, 0xd5, 0xe9, 0x40, 0xc7, ++ 0xe7, 0xa6, 0x32, 0xb2, 0x1b, 0xce, 0x59, 0x94, 0xef, 0x23, 0x89, 0xd2, ++ 0xa8, 0xf9, 0x74, 0x7e, 0x12, 0x7d, 0x1f, 0xa7, 0xd3, 0x92, 0x38, 0xbe, ++ 0x34, 0x51, 0x19, 0x6f, 0x38, 0x3e, 0xf2, 0xbd, 0xd2, 0xca, 0xf5, 0x48, ++ 0x2f, 0xd2, 0x30, 0xdf, 0xaf, 0xc8, 0x2d, 0xe1, 0x76, 0x80, 0xd4, 0xcd, ++ 0xc8, 0x5f, 0xc3, 0x44, 0x79, 0xd4, 0x02, 0x9a, 0x57, 0x1e, 0x45, 0xdf, ++ 0xdf, 0x3b, 0xc4, 0x9f, 0xa7, 0x84, 0x19, 0xe5, 0xf7, 0x41, 0xbb, 0x73, ++ 0x01, 0xe9, 0xcf, 0xb2, 0x13, 0xd7, 0xb7, 0x45, 0x89, 0x7b, 0xa5, 0xcd, ++ 0x29, 0x74, 0xa2, 0x9f, 0x2e, 0x0d, 0xe4, 0x2d, 0xc6, 0x45, 0x1e, 0xc3, ++ 0xf8, 0x08, 0xf9, 0xf5, 0x25, 0xea, 0xa7, 0xce, 0x97, 0xec, 0xe6, 0xf3, ++ 0x6d, 0x31, 0x30, 0x01, 0xe3, 0x58, 0xc1, 0x71, 0x3c, 0xaf, 0x82, 0x75, ++ 0x7c, 0x5f, 0x13, 0xd7, 0x38, 0x66, 0x08, 0x7f, 0xb0, 0x5c, 0xa0, 0xb8, ++ 0xc6, 0x76, 0x5c, 0xff, 0xcf, 0x74, 0x61, 0xf7, 0x0e, 0x27, 0x3f, 0x17, ++ 0x84, 0xaf, 0x7b, 0xaf, 0x44, 0xf1, 0x96, 0x37, 0xa6, 0x7e, 0xaf, 0x88, ++ 0xee, 0xcb, 0x2b, 0x71, 0x8e, 0xd5, 0x12, 0xef, 0x72, 0x10, 0xed, 0x0c, ++ 0x58, 0xc7, 0xea, 0x57, 0x2b, 0x08, 0x7f, 0x97, 0xf6, 0x4d, 0xfd, 0x65, ++ 0x1d, 0xea, 0x83, 0x2e, 0x91, 0xe0, 0x3c, 0x44, 0x0f, 0x57, 0xec, 0xab, ++ 0x93, 0x8a, 0x7d, 0xa8, 0xda, 0x57, 0xfd, 0x68, 0x27, 0xc6, 0xd8, 0x1b, ++ 0x3f, 0x50, 0xf4, 0x86, 0x04, 0x74, 0xf5, 0x83, 0x44, 0x7c, 0x69, 0x8b, ++ 0xc0, 0xed, 0xdf, 0xe0, 0xcf, 0xb8, 0xfd, 0x5b, 0x61, 0xf4, 0xe4, 0xc7, ++ 0xe6, 0x53, 0xf5, 0x2a, 0x71, 0x92, 0xe5, 0x61, 0xee, 0x87, 0x55, 0xed, ++ 0xda, 0xf1, 0xde, 0x90, 0x2e, 0x13, 0xe0, 0x50, 0xf1, 0xa0, 0x3e, 0x6c, ++ 0x02, 0x39, 0x5d, 0xb1, 0xbe, 0xd4, 0x88, 0xfc, 0xba, 0x62, 0x7d, 0xae, ++ 0x95, 0xfc, 0x4a, 0x2b, 0xf6, 0xe8, 0x54, 0x78, 0x27, 0x3a, 0xf7, 0x9f, ++ 0x2a, 0xeb, 0xdc, 0x70, 0x74, 0x80, 0xe2, 0x12, 0xaf, 0xc4, 0xc5, 0x27, ++ 0x93, 0xdd, 0x46, 0x6a, 0x7f, 0x48, 0xc1, 0x9f, 0x64, 0x3c, 0x5b, 0x28, ++ 0x57, 0x17, 0x88, 0xed, 0x28, 0x7e, 0x47, 0xdc, 0x20, 0xe9, 0x13, 0xf9, ++ 0xc5, 0xeb, 0x41, 0xef, 0xc7, 0xf5, 0x2d, 0xef, 0xe4, 0xeb, 0x55, 0xe3, ++ 0x20, 0xf5, 0x61, 0x79, 0x06, 0xce, 0x73, 0xea, 0xf0, 0xc0, 0x7a, 0x2c, ++ 0xcb, 0x1b, 0x9c, 0x33, 0xc8, 0x6f, 0xb8, 0xf2, 0xfc, 0x7a, 0x94, 0x9b, ++ 0x81, 0x4b, 0x17, 0x8e, 0x4c, 0x27, 0x3f, 0x80, 0x51, 0x4e, 0x74, 0x5f, ++ 0x60, 0x4b, 0x29, 0xf7, 0x1f, 0xbe, 0x82, 0x8a, 0x08, 0xc2, 0x6b, 0xb6, ++ 0x48, 0x79, 0xbb, 0x15, 0xb3, 0x45, 0x3a, 0xef, 0xb4, 0x7a, 0x0b, 0xd9, ++ 0xe1, 0x69, 0x06, 0xa6, 0xc7, 0xef, 0xb0, 0xa6, 0xcd, 0xe7, 0x72, 0xac, ++ 0xbc, 0xc6, 0x3e, 0x03, 0xeb, 0x6c, 0x51, 0x2a, 0xc9, 0xe1, 0xf2, 0xa3, ++ 0x72, 0xea, 0xdd, 0xee, 0xa8, 0x9d, 0x9f, 0x36, 0xbb, 0x25, 0x03, 0xe1, ++ 0x74, 0xb5, 0xf8, 0x90, 0xea, 0x2f, 0xb8, 0xcd, 0xe8, 0xfd, 0x63, 0x49, ++ 0xc6, 0xe7, 0x8f, 0x0f, 0x35, 0x1e, 0x7b, 0x8b, 0xf2, 0xcc, 0xee, 0xe8, ++ 0xd7, 0xc6, 0x87, 0xd4, 0x78, 0xcf, 0x70, 0xf1, 0x21, 0x35, 0x3e, 0x1b, ++ 0xa8, 0xf9, 0x54, 0x13, 0x4f, 0x0e, 0x88, 0x03, 0xb3, 0xd0, 0xaf, 0x52, ++ 0xf1, 0xea, 0x29, 0x8a, 0x0f, 0x07, 0xba, 0x05, 0xc9, 0xe1, 0x8c, 0xc6, ++ 0x8d, 0x02, 0x7b, 0xcf, 0x1b, 0x09, 0xbe, 0x4a, 0xbc, 0x08, 0xfa, 0x1b, ++ 0xf1, 0xbd, 0x0a, 0x38, 0xf6, 0x51, 0x69, 0xf8, 0x1d, 0x02, 0x1e, 0x3f, ++ 0xda, 0x87, 0xf9, 0xb8, 0x46, 0xfc, 0xbe, 0x9e, 0x44, 0x79, 0xb7, 0x3f, ++ 0xc2, 0x7c, 0xdc, 0x42, 0xfc, 0xbe, 0x1e, 0xcf, 0xc7, 0x3d, 0x80, 0xf9, ++ 0xb8, 0x46, 0xbc, 0xff, 0xc1, 0xf3, 0x71, 0xfb, 0x94, 0xfc, 0xde, 0x40, ++ 0xcf, 0x79, 0x8a, 0x37, 0xa5, 0xb9, 0x87, 0xe4, 0x53, 0x51, 0x3c, 0xe2, ++ 0x21, 0xc1, 0x97, 0xe1, 0x9e, 0xa4, 0x89, 0x57, 0x50, 0x3d, 0x3e, 0x5e, ++ 0xa1, 0xb7, 0x72, 0x3b, 0x34, 0x70, 0xd4, 0x40, 0xdf, 0x3f, 0x0f, 0x1c, ++ 0x33, 0x13, 0x9f, 0xad, 0xec, 0x59, 0x3e, 0x06, 0xf5, 0x31, 0xf5, 0xbb, ++ 0xe4, 0x4d, 0x18, 0x2f, 0x88, 0xf1, 0x2f, 0x9d, 0xf5, 0x7a, 0x2c, 0x78, ++ 0xbf, 0xe7, 0xac, 0xcf, 0x63, 0xc1, 0x38, 0x41, 0x45, 0xef, 0xc7, 0x46, ++ 0x99, 0xf8, 0x4e, 0x38, 0x1b, 0x53, 0x98, 0x9a, 0xc4, 0x88, 0x11, 0xed, ++ 0x7d, 0x84, 0x03, 0xe5, 0xf9, 0xf5, 0x54, 0x5a, 0x10, 0xae, 0x57, 0xf5, ++ 0xeb, 0x77, 0xff, 0x7f, 0xbf, 0xfe, 0xe7, 0xf1, 0xeb, 0x7f, 0x2b, 0x4a, ++ 0x97, 0xc4, 0x3f, 0xca, 0x7d, 0x3a, 0xba, 0x57, 0x5e, 0x7e, 0xd4, 0x6b, ++ 0xb9, 0x3b, 0x86, 0x3f, 0x6c, 0xf0, 0x71, 0xff, 0xf0, 0x06, 0x57, 0x1e, ++ 0xd1, 0xdf, 0x13, 0xbe, 0xbc, 0xd4, 0x15, 0xb1, 0x7e, 0xfc, 0x1a, 0x6e, ++ 0xbf, 0xa5, 0xcd, 0x76, 0x59, 0x62, 0x9f, 0xbf, 0x5b, 0xca, 0xfd, 0xf8, ++ 0x69, 0x42, 0xe2, 0xfb, 0x05, 0x77, 0xb9, 0x87, 0xe5, 0xb7, 0x77, 0xb9, ++ 0x13, 0xea, 0x3b, 0x89, 0xe3, 0x01, 0x1b, 0x6a, 0x38, 0x1f, 0x51, 0xfd, ++ 0xfd, 0x43, 0xe3, 0x03, 0x9e, 0xd7, 0x5c, 0x31, 0x7e, 0xfe, 0xb3, 0x3f, ++ 0x33, 0xd3, 0xbf, 0xaf, 0xd0, 0xbb, 0xdf, 0x44, 0xf2, 0xfc, 0x4f, 0xaf, ++ 0x9a, 0x76, 0xa0, 0xde, 0x5d, 0x5e, 0xb3, 0x62, 0x4c, 0x32, 0xd4, 0xcb, ++ 0x4f, 0x9a, 0x98, 0x93, 0xcb, 0x23, 0x4d, 0x5c, 0x61, 0x69, 0x8d, 0xce, ++ 0x6b, 0x49, 0x49, 0x14, 0x47, 0xf0, 0x66, 0xd3, 0xf7, 0x43, 0xe3, 0xe3, ++ 0x05, 0x35, 0x3a, 0xe2, 0xef, 0x83, 0xf1, 0x82, 0x1a, 0xf1, 0x14, 0xd5, ++ 0x15, 0xfd, 0xfc, 0x8e, 0xf3, 0xbf, 0x4b, 0xc6, 0x4f, 0x94, 0xbe, 0x22, ++ 0x84, 0x3a, 0xd1, 0xbe, 0x78, 0xa5, 0x51, 0xf0, 0xf4, 0xb2, 0xa1, 0xf1, ++ 0x03, 0x18, 0x38, 0x9b, 0x4d, 0x81, 0x5d, 0xd4, 0x70, 0x3b, 0xc1, 0x53, ++ 0x6b, 0x26, 0xbb, 0xe0, 0x6a, 0x71, 0x85, 0xba, 0xbd, 0x27, 0xd6, 0xa1, ++ 0x9f, 0xa0, 0x8c, 0x6d, 0xee, 0xc4, 0xef, 0x51, 0x96, 0xb9, 0x74, 0x12, ++ 0x88, 0xa2, 0x04, 0x71, 0x05, 0x9e, 0xdf, 0x59, 0xae, 0xe8, 0x11, 0xf1, ++ 0xfe, 0x01, 0xc4, 0x0f, 0x94, 0xfb, 0xf1, 0x7e, 0xc1, 0xad, 0x6e, 0x6e, ++ 0x9f, 0x6f, 0x55, 0xe4, 0x7e, 0x5e, 0x09, 0x97, 0x33, 0xea, 0x38, 0xea, ++ 0x7b, 0xf1, 0xe7, 0x7e, 0xc6, 0xad, 0x8d, 0x3f, 0xc4, 0xb7, 0xbf, 0xa7, ++ 0xb4, 0x77, 0xd4, 0x94, 0x6f, 0xc0, 0x73, 0x0b, 0xce, 0xd5, 0x31, 0xe4, ++ 0xff, 0x1d, 0x35, 0x55, 0x66, 0x57, 0xcc, 0x78, 0x2f, 0xb8, 0x79, 0xde, ++ 0xcc, 0x16, 0x8c, 0x53, 0xd8, 0x63, 0xe3, 0x14, 0x3c, 0x1e, 0x11, 0x1f, ++ 0x9f, 0x50, 0xf9, 0x53, 0x45, 0xef, 0x67, 0xb3, 0xf0, 0xdc, 0x9f, 0xe8, ++ 0xe1, 0xfe, 0xa3, 0x80, 0x83, 0xfb, 0x33, 0x2b, 0x0e, 0x54, 0xd2, 0x3d, ++ 0x93, 0xe8, 0x3a, 0x39, 0x7e, 0x3e, 0xe1, 0x18, 0xbc, 0x67, 0x98, 0xca, ++ 0xf8, 0xbe, 0x98, 0x99, 0xfb, 0xb9, 0xc8, 0xaf, 0x50, 0x3e, 0xf7, 0xd3, ++ 0x3e, 0xfc, 0xf7, 0x07, 0x98, 0x2f, 0x95, 0xfe, 0x3d, 0x83, 0xc0, 0x31, ++ 0x57, 0xbb, 0x0d, 0xf9, 0xc8, 0x5c, 0x71, 0x92, 0x20, 0x93, 0x7f, 0x7b, ++ 0xd0, 0xdf, 0x8d, 0xfe, 0xa8, 0x85, 0xc7, 0x1b, 0xe6, 0x60, 0x3e, 0x70, ++ 0xc5, 0xe2, 0xb2, 0x13, 0x78, 0x2e, 0x8b, 0xeb, 0x0c, 0x94, 0x77, 0xb4, ++ 0xf0, 0x78, 0x2d, 0x7d, 0x67, 0x5c, 0x95, 0x57, 0x15, 0x8b, 0xb7, 0xaf, ++ 0xb5, 0x62, 0x7b, 0x91, 0xe0, 0xb1, 0xc8, 0xd8, 0x5e, 0x53, 0x85, 0xed, ++ 0x37, 0xbf, 0x18, 0x46, 0xcf, 0x1e, 0x9b, 0x87, 0xbb, 0x07, 0x7a, 0x89, ++ 0x1c, 0x83, 0xde, 0x79, 0xe4, 0xdf, 0xfe, 0x29, 0xda, 0x45, 0x15, 0xf3, ++ 0x15, 0xbf, 0x77, 0x1d, 0x97, 0xab, 0x8b, 0x7b, 0xe6, 0x1b, 0xf8, 0x47, ++ 0xaf, 0xb4, 0x72, 0xee, 0x60, 0xee, 0x9f, 0xc8, 0x6e, 0xbe, 0xd0, 0x53, ++ 0x41, 0xfe, 0xec, 0x74, 0x8c, 0xb7, 0xba, 0xa3, 0x72, 0xa6, 0xe2, 0x55, ++ 0x90, 0x3f, 0xc9, 0x51, 0xf9, 0xf3, 0xb7, 0xca, 0x9d, 0x33, 0x6e, 0x9e, ++ 0xe7, 0x3f, 0x01, 0xe4, 0x0f, 0xae, 0x27, 0x6d, 0x3e, 0x8f, 0x0b, 0xc6, ++ 0x9f, 0xff, 0x0b, 0x0a, 0x3e, 0x0d, 0x27, 0x4f, 0x86, 0xe3, 0x9f, 0x28, ++ 0x3f, 0x74, 0x53, 0x38, 0xbd, 0x08, 0x8e, 0xa8, 0xdc, 0x95, 0xd1, 0x9e, ++ 0xbe, 0x2e, 0x2a, 0x7f, 0xa5, 0x6e, 0xa8, 0x8f, 0x1c, 0x1e, 0xff, 0xf2, ++ 0x15, 0xbc, 0x4e, 0x1d, 0x46, 0xff, 0x1a, 0x5d, 0x2a, 0x28, 0xdf, 0x1b, ++ 0x1b, 0x26, 0x5f, 0xa3, 0xfb, 0xef, 0xe3, 0xf7, 0xce, 0x2a, 0x55, 0xf9, ++ 0xe7, 0xff, 0xe5, 0x7e, 0x6f, 0xc5, 0xbe, 0x51, 0xfd, 0xdf, 0xaa, 0x3d, ++ 0xd4, 0xa2, 0xc0, 0x59, 0x2d, 0x1f, 0x50, 0xf4, 0xd9, 0xbf, 0x39, 0x5f, ++ 0x19, 0x85, 0x62, 0xc2, 0x7c, 0xe5, 0xb4, 0xc4, 0xf9, 0xca, 0x77, 0x74, ++ 0x09, 0xf4, 0x1d, 0x16, 0x25, 0x5f, 0xf9, 0xb0, 0x91, 0x55, 0xee, 0xb1, ++ 0x63, 0x9e, 0x9e, 0x72, 0x2f, 0x21, 0xe4, 0x23, 0xfd, 0xe6, 0xf0, 0xd3, ++ 0xbf, 0x5a, 0xff, 0x9c, 0x1d, 0xef, 0x25, 0x08, 0x12, 0x8a, 0x9d, 0xc6, ++ 0xae, 0x13, 0x24, 0x9f, 0x1b, 0x41, 0x9f, 0x21, 0x3d, 0xa8, 0xe7, 0x0f, ++ 0xdc, 0x2f, 0xd5, 0xc5, 0xf3, 0x4b, 0x1b, 0xbb, 0xb5, 0xf7, 0x1f, 0xd4, ++ 0x72, 0x5b, 0x29, 0xbf, 0xaf, 0x50, 0x0d, 0xfb, 0x21, 0x3f, 0xb2, 0x92, ++ 0xc7, 0x37, 0x6b, 0x2f, 0xa7, 0xeb, 0x80, 0xd7, 0x18, 0x92, 0x9d, 0xe8, ++ 0x17, 0xfa, 0xaa, 0x18, 0xeb, 0x17, 0x0a, 0xc8, 0x91, 0x0c, 0x35, 0x3f, ++ 0x30, 0xc4, 0xe5, 0x52, 0xc2, 0x3c, 0xbe, 0x26, 0x36, 0x40, 0xf9, 0x7e, ++ 0x4d, 0x0d, 0x82, 0x07, 0xe5, 0xc1, 0x17, 0xf6, 0x13, 0x79, 0x79, 0x7e, ++ 0xdf, 0xb5, 0xfa, 0x89, 0xea, 0x4b, 0xb5, 0x7e, 0xe6, 0xb5, 0x25, 0xdc, ++ 0x2f, 0x54, 0xeb, 0x17, 0x04, 0xd4, 0x47, 0xcd, 0x3a, 0xdf, 0x4a, 0xca, ++ 0xef, 0x3d, 0x20, 0x48, 0x89, 0xf2, 0x44, 0x57, 0x2b, 0xf8, 0x7e, 0xb3, ++ 0xe2, 0xa7, 0xdd, 0x65, 0xe4, 0x78, 0xb0, 0xeb, 0x7a, 0x81, 0xf2, 0x6a, ++ 0xf1, 0x5e, 0x0c, 0x9e, 0xef, 0xae, 0x03, 0x3c, 0x7f, 0x7e, 0x57, 0x39, ++ 0xcf, 0x9f, 0x57, 0xfd, 0xb2, 0x6a, 0x5e, 0xfc, 0xb8, 0xa8, 0x5f, 0x96, ++ 0xee, 0xc3, 0xa8, 0xf9, 0xf4, 0x6a, 0x7e, 0xbc, 0x7a, 0x3f, 0x74, 0xfe, ++ 0x56, 0x6b, 0x18, 0xf5, 0x8b, 0x4d, 0x86, 0x2e, 0x07, 0xd2, 0xa1, 0x9a, ++ 0x57, 0xe4, 0x2a, 0xe5, 0x72, 0xce, 0xaa, 0x7c, 0x77, 0x3c, 0x7e, 0x9d, ++ 0xcb, 0x4a, 0x2b, 0x5d, 0xa5, 0x18, 0xa7, 0x2b, 0xd5, 0x0d, 0xe7, 0xe7, ++ 0x6a, 0x2b, 0x4d, 0xa0, 0xdf, 0xbc, 0xae, 0xc8, 0xcf, 0x75, 0xa5, 0xc3, ++ 0xea, 0xe5, 0x9d, 0xa5, 0x5a, 0xbd, 0x9c, 0xea, 0xf1, 0x7a, 0xf9, 0x7f, ++ 0x95, 0x5f, 0x76, 0xcc, 0xf0, 0x7e, 0xe1, 0x5f, 0x97, 0x5c, 0x9b, 0xdf, ++ 0xea, 0x96, 0xc4, 0x7a, 0xdc, 0x90, 0x7e, 0x95, 0xa5, 0x09, 0xc6, 0x6b, ++ 0xb7, 0x24, 0xfe, 0x8e, 0xe8, 0xef, 0x54, 0xfe, 0x1b, 0xf7, 0xef, 0x8f, ++ 0xb0, 0x21, 0xf7, 0x7b, 0xb8, 0x7c, 0xeb, 0x14, 0xe4, 0x5f, 0x4e, 0xa3, ++ 0x38, 0x97, 0x81, 0xe2, 0x5c, 0x2a, 0x7f, 0xe9, 0x4c, 0xe6, 0xe3, 0xef, ++ 0x53, 0xf8, 0x8a, 0x5a, 0x9e, 0x50, 0xc6, 0x1f, 0xee, 0x7b, 0x93, 0xef, ++ 0x2a, 0xfd, 0x5a, 0x04, 0xef, 0x0f, 0x70, 0xdd, 0x25, 0xbb, 0xb5, 0x7e, ++ 0xb2, 0xd2, 0x2e, 0xad, 0x9f, 0x6c, 0x42, 0x77, 0x9a, 0xa6, 0x5e, 0x16, ++ 0xce, 0xd2, 0xf4, 0xaf, 0x38, 0x9a, 0xa7, 0x69, 0x9f, 0x14, 0x29, 0xd6, ++ 0xb4, 0x5f, 0x77, 0xb2, 0x5c, 0x53, 0x9f, 0xda, 0x7f, 0xbd, 0xa6, 0xff, ++ 0xb4, 0x8f, 0xaa, 0x34, 0xf5, 0x1b, 0x07, 0xb4, 0x7e, 0xb2, 0xe9, 0x17, ++ 0x17, 0xc4, 0xdd, 0x3b, 0xe2, 0xf8, 0x5d, 0x09, 0x18, 0x11, 0xfb, 0xde, ++ 0x0c, 0xf3, 0x5d, 0x9a, 0x7e, 0xd9, 0x0d, 0xda, 0x7d, 0xe5, 0x36, 0x6b, ++ 0xf7, 0x35, 0xa6, 0x55, 0xbb, 0x2f, 0x75, 0x5c, 0x67, 0x50, 0xbb, 0xbf, ++ 0xfc, 0x4e, 0xed, 0xfe, 0xd2, 0xd0, 0x7f, 0xef, 0xfe, 0xe2, 0xfe, 0xfb, ++ 0xdb, 0xdd, 0x32, 0xcd, 0xd3, 0xd7, 0x93, 0x4f, 0xdf, 0x03, 0xdc, 0x52, ++ 0xe3, 0xa2, 0xef, 0x5e, 0xab, 0xf7, 0xff, 0xfe, 0x13, 0x07, 0xaf, 0xfb, ++ 0x52, 0x40, 0x6f, 0x00, 0x00, 0x00, 0x00, 0x00 ++}; ++ ++static const u8 csem_int_table_data_e1[] = { ++ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x53, 0xe1, ++ 0x67, 0x60, 0xf8, 0x51, 0x0f, 0xc1, 0x5b, 0xf9, 0x18, 0x18, 0x2e, 0xf0, ++ 0x21, 0xf8, 0xf4, 0xc0, 0x1c, 0xcc, 0x0c, 0x0c, 0x9c, 0x40, 0xac, 0xc8, ++ 0xc8, 0xc0, 0x20, 0x01, 0xc4, 0xfc, 0x40, 0xcc, 0x06, 0xc4, 0x9e, 0x0c, ++ 0x0c, 0x0c, 0xff, 0x81, 0xf8, 0x1b, 0x10, 0xbf, 0x05, 0xe2, 0x27, 0x40, ++ 0xec, 0x0c, 0xc4, 0x07, 0x58, 0xb0, 0x9b, 0xe3, 0xc6, 0xca, 0xc0, 0xe0, ++ 0x01, 0xc4, 0xdc, 0x40, 0xb3, 0x78, 0x98, 0x89, 0xb7, 0xdf, 0x89, 0x17, ++ 0xc1, 0x7e, 0xcc, 0xc3, 0xc0, 0x70, 0x0e, 0x88, 0x9f, 0xf1, 0xd0, 0x37, ++ 0x0c, 0x06, 0x1b, 0x5e, 0x27, 0x40, 0x3f, 0xbb, 0x7e, 0x43, 0xed, 0x3a, ++ 0x29, 0x32, 0xf0, 0xfe, 0x06, 0x61, 0x21, 0x31, 0x60, 0x9a, 0x14, 0x47, ++ 0xf0, 0xa7, 0x8a, 0xa3, 0xca, 0x0b, 0x8b, 0x21, 0xd8, 0xc9, 0xd2, 0x94, ++ 0xd9, 0x95, 0x0f, 0xd4, 0x0f, 0x00, 0xf1, 0x93, 0x21, 0xf0, 0x80, 0x03, ++ 0x00, 0x00, 0x00, 0x00 ++}; ++ ++static const u8 csem_pram_data_e1[] = { ++ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xed, 0x7d, ++ 0x0b, 0x7c, 0x94, 0xc5, 0xb5, 0xf8, 0x7c, 0xbb, 0xdf, 0xbe, 0x92, 0xdd, ++ 0xcd, 0x26, 0xe4, 0x49, 0x00, 0x37, 0x09, 0x60, 0x50, 0x1e, 0x4b, 0x80, ++ 0xc8, 0x4b, 0xdd, 0xf0, 0x32, 0x52, 0xc4, 0x04, 0x11, 0x82, 0x8a, 0x2c, ++ 0xaf, 0x10, 0x02, 0x79, 0x14, 0xa9, 0xa5, 0xff, 0xda, 0xbb, 0x0b, 0x28, ++ 0x04, 0xaa, 0xde, 0x58, 0x51, 0xa3, 0x7f, 0x6a, 0x17, 0x04, 0x1b, 0x2d, ++ 0xda, 0x80, 0xd1, 0x1b, 0x6d, 0xe0, 0x2e, 0xa2, 0x08, 0xd5, 0x6a, 0x68, ++ 0x45, 0x51, 0xab, 0x0d, 0x88, 0x88, 0x08, 0x49, 0x8c, 0x8f, 0x6a, 0xb5, ++ 0x7a, 0xcf, 0x39, 0x33, 0xdf, 0x66, 0xe7, 0xcb, 0x2e, 0x89, 0xb6, 0xfe, ++ 0x6f, 0xff, 0xbf, 0x7b, 0xc3, 0xaf, 0x1d, 0xe7, 0x9b, 0x99, 0x33, 0x67, ++ 0xce, 0x39, 0x73, 0xe6, 0xcc, 0x99, 0x99, 0xb3, 0x26, 0x96, 0xc4, 0x0c, ++ 0x17, 0x30, 0xf6, 0x0d, 0xfe, 0x5d, 0xce, 0x98, 0xcd, 0xc4, 0x18, 0x1b, ++ 0xd3, 0x95, 0xb6, 0x2b, 0x1d, 0xc3, 0xd5, 0x9c, 0xae, 0xf2, 0xdb, 0xfc, ++ 0x5e, 0xe6, 0x35, 0x33, 0x56, 0xe7, 0xb7, 0x52, 0xba, 0xc5, 0x9f, 0xce, ++ 0xbc, 0x83, 0xe1, 0xbb, 0xcf, 0x50, 0x18, 0xb4, 0x33, 0x76, 0xaf, 0xdf, ++ 0x45, 0xf9, 0x5f, 0xf8, 0x0b, 0x29, 0xad, 0xf5, 0x17, 0x51, 0xbd, 0x3b, ++ 0xfd, 0x25, 0x94, 0xbf, 0xdd, 0xef, 0xa3, 0x74, 0xb3, 0xbf, 0x8c, 0xbe, ++ 0xd7, 0xf8, 0xab, 0x29, 0xbf, 0xc1, 0xbf, 0x86, 0xd2, 0x4d, 0xea, 0xa2, ++ 0x34, 0x96, 0x02, 0x7d, 0xb3, 0xa2, 0xc2, 0xac, 0x64, 0xc6, 0xaa, 0x9e, ++ 0xc9, 0xc9, 0xdb, 0x0c, 0xb9, 0x2d, 0xb3, 0xc6, 0x27, 0xa8, 0xa3, 0x21, ++ 0xff, 0x8a, 0x91, 0x19, 0xb3, 0x00, 0xbe, 0x4f, 0xa5, 0xfe, 0x98, 0xea, ++ 0xde, 0x34, 0x70, 0x74, 0x57, 0x3d, 0x0d, 0xcf, 0x4d, 0xea, 0xa4, 0x7e, ++ 0x08, 0xa7, 0x76, 0x09, 0xc7, 0x8b, 0x59, 0x99, 0x2d, 0x46, 0xbd, 0x2c, ++ 0x1c, 0xe7, 0x9d, 0x4b, 0x04, 0x3c, 0x7b, 0x6b, 0x4d, 0x4e, 0x72, 0xd4, ++ 0x7a, 0x83, 0x11, 0xde, 0xed, 0x25, 0x00, 0x6f, 0x28, 0x14, 0xb8, 0x42, ++ 0xd6, 0x9c, 0xe8, 0xf0, 0x2e, 0x46, 0x78, 0x9b, 0x4b, 0x54, 0x5e, 0x2f, ++ 0x39, 0x58, 0x93, 0x1d, 0x1d, 0x9e, 0x07, 0xeb, 0xd5, 0xdc, 0x20, 0xe0, ++ 0xa5, 0x07, 0xac, 0x31, 0xea, 0x8d, 0xc1, 0x7a, 0x1b, 0x6e, 0x10, 0xf8, ++ 0xf5, 0xf3, 0xd5, 0x64, 0x45, 0xef, 0x77, 0x3c, 0xd6, 0x63, 0x2e, 0xf5, ++ 0x6f, 0xad, 0x56, 0x46, 0x7f, 0xdf, 0x64, 0xe3, 0xff, 0xdb, 0x5d, 0xa7, ++ 0x2e, 0x16, 0x79, 0x23, 0x66, 0x93, 0x18, 0x1b, 0xd7, 0xd5, 0x4e, 0x9f, ++ 0x32, 0x16, 0x60, 0x38, 0x4e, 0x95, 0xf9, 0x0a, 0x89, 0x0f, 0xee, 0xcc, ++ 0xaf, 0xbf, 0xc9, 0x67, 0xec, 0x26, 0x84, 0x09, 0xed, 0x03, 0x93, 0x58, ++ 0xc8, 0x08, 0xfd, 0x07, 0x92, 0x58, 0x70, 0x7d, 0x96, 0x54, 0x7f, 0x26, ++ 0xd5, 0x6f, 0xed, 0xfb, 0xf5, 0x37, 0xa9, 0x52, 0xfd, 0x80, 0x21, 0x4a, ++ 0x7d, 0x13, 0x6b, 0x50, 0xb0, 0xfc, 0xe7, 0x28, 0x47, 0xc0, 0xf7, 0xfb, ++ 0xfc, 0xb9, 0x94, 0x6e, 0x14, 0xf2, 0x73, 0xdf, 0x50, 0x03, 0x63, 0xd8, ++ 0x2e, 0xdd, 0x1c, 0x1c, 0x04, 0xed, 0xee, 0xf1, 0x7b, 0x48, 0x5e, 0xee, ++ 0xf6, 0x8f, 0xa5, 0xf2, 0xbb, 0x84, 0x1c, 0xfe, 0xbb, 0x90, 0xb3, 0xa0, ++ 0x90, 0xb3, 0x07, 0x51, 0xce, 0x20, 0xdd, 0x8a, 0x72, 0x66, 0xc6, 0xfe, ++ 0x7c, 0xad, 0xa5, 0x00, 0xa7, 0x7d, 0x6f, 0x3c, 0xdb, 0xec, 0x26, 0xf9, ++ 0x5a, 0x4c, 0x78, 0xaa, 0x8c, 0xe0, 0x6f, 0xd8, 0x3b, 0x64, 0xfb, 0x66, ++ 0x80, 0x7f, 0xdf, 0x0d, 0xab, 0x4e, 0x6f, 0x03, 0xfa, 0xb7, 0x35, 0x0f, ++ 0xf3, 0x18, 0xa1, 0xde, 0x3d, 0x43, 0x35, 0xf9, 0x62, 0x5e, 0x96, 0xdc, ++ 0x55, 0xef, 0x9e, 0xd9, 0x27, 0x9c, 0x8b, 0x86, 0x12, 0xbd, 0xcb, 0x10, ++ 0xce, 0xdd, 0x1e, 0xc1, 0x3f, 0x15, 0x06, 0x16, 0x51, 0xef, 0xee, 0x19, ++ 0xe1, 0x7a, 0x15, 0x58, 0xef, 0x2e, 0x4f, 0x18, 0x5e, 0x28, 0xb2, 0xdf, ++ 0xbb, 0xa6, 0x84, 0xeb, 0xad, 0x22, 0x3e, 0x2b, 0xac, 0xa4, 0xc1, 0xde, ++ 0x9d, 0x2f, 0x3b, 0x98, 0x42, 0xf3, 0x11, 0x04, 0x85, 0xe8, 0x6b, 0x42, ++ 0xfa, 0xc2, 0xbc, 0x7c, 0x76, 0xc0, 0x75, 0x4a, 0x2b, 0xb4, 0x4f, 0x49, ++ 0xce, 0x4b, 0x63, 0xd0, 0xee, 0x7e, 0x9c, 0x8f, 0x66, 0x9c, 0x77, 0x6e, ++ 0xa2, 0x8b, 0xd6, 0x1e, 0xe9, 0xec, 0x83, 0xef, 0x19, 0x16, 0x56, 0x8d, ++ 0xf0, 0x81, 0xb2, 0xfb, 0x8d, 0x80, 0xaf, 0x69, 0xb6, 0x3b, 0x11, 0xe9, ++ 0x72, 0xfb, 0xb5, 0x45, 0x4c, 0x19, 0xc6, 0x58, 0x5f, 0x51, 0x9e, 0x1a, ++ 0x28, 0x52, 0xb2, 0x00, 0xae, 0x7d, 0x4e, 0x91, 0x82, 0xdf, 0x4d, 0xb3, ++ 0xa1, 0x1c, 0xbe, 0xbb, 0x44, 0x79, 0xf2, 0x1a, 0x5e, 0x7e, 0x3b, 0x96, ++ 0x3b, 0xba, 0xca, 0x13, 0xb1, 0x1c, 0xbe, 0x27, 0x55, 0x43, 0x39, 0xe4, ++ 0xed, 0x73, 0x79, 0xf9, 0x1d, 0x7e, 0xe0, 0xc4, 0xe0, 0xae, 0x7a, 0x9b, ++ 0x80, 0xcf, 0x3e, 0xe2, 0x77, 0x3a, 0xff, 0x0e, 0x6c, 0x45, 0xfa, 0x98, ++ 0x46, 0xf3, 0x54, 0xc3, 0xfb, 0x09, 0x14, 0x12, 0xa0, 0xdf, 0x41, 0x4c, ++ 0xc7, 0x74, 0xe1, 0xbf, 0x69, 0xd0, 0xbd, 0x19, 0x0b, 0xed, 0x5d, 0xf8, ++ 0xda, 0x06, 0xd7, 0x53, 0x5e, 0xc3, 0x6f, 0xd3, 0xe0, 0x38, 0xca, 0x6b, ++ 0xf8, 0xd8, 0x2e, 0xec, 0x97, 0xb1, 0x10, 0xd2, 0xbe, 0x4b, 0xfa, 0x32, ++ 0x6f, 0xae, 0x98, 0x0f, 0xac, 0x3b, 0x9d, 0x13, 0xbd, 0xd9, 0x52, 0x79, ++ 0xa6, 0xea, 0x49, 0x50, 0x81, 0x4e, 0x99, 0x2f, 0x19, 0x59, 0x00, 0x58, ++ 0x90, 0x09, 0xe2, 0x89, 0xf0, 0xf4, 0xed, 0x8a, 0x98, 0x81, 0xf0, 0xec, ++ 0x71, 0xfe, 0x25, 0xf7, 0x6e, 0xfe, 0x99, 0x86, 0xca, 0x74, 0xd0, 0xd2, ++ 0xa3, 0x82, 0x1e, 0x1a, 0x1d, 0x36, 0xf6, 0x97, 0xe9, 0x60, 0x19, 0x20, ++ 0xd3, 0x61, 0xe3, 0x00, 0x99, 0x0e, 0x96, 0x0b, 0xce, 0x4f, 0x87, 0x1d, ++ 0xcc, 0x4d, 0x74, 0x8e, 0x45, 0x0f, 0xad, 0xdf, 0xcd, 0x43, 0xe4, 0x7e, ++ 0xe3, 0x2e, 0x92, 0xfb, 0xdd, 0x7c, 0x91, 0xdc, 0x6f, 0xdc, 0xc5, 0xff, ++ 0x9c, 0x7e, 0x6b, 0xb2, 0xe4, 0x7e, 0xad, 0xd9, 0x72, 0xbf, 0x35, 0xd9, ++ 0x72, 0xbf, 0xd6, 0x9c, 0x7f, 0xac, 0x5f, 0xa6, 0x7a, 0x60, 0x32, 0xa0, ++ 0xbe, 0xd2, 0xfe, 0x2e, 0x94, 0xf4, 0xdb, 0xd5, 0xcc, 0x77, 0x16, 0xdb, ++ 0xa3, 0x9e, 0xc3, 0xf9, 0xa4, 0xe9, 0x39, 0x53, 0xb2, 0x8f, 0xf9, 0xec, ++ 0x5d, 0xfc, 0x84, 0x75, 0x8a, 0xb1, 0xfc, 0x48, 0x38, 0x83, 0x25, 0xbd, ++ 0x0a, 0x70, 0x3e, 0xc5, 0x7a, 0x00, 0xc7, 0x7b, 0x7e, 0x38, 0x2e, 0x1d, ++ 0x9c, 0x41, 0x7a, 0x38, 0x5f, 0x0b, 0x7c, 0x58, 0xa4, 0x9e, 0xee, 0x06, ++ 0x87, 0x0d, 0xd4, 0x8f, 0xc3, 0xa4, 0xf0, 0x76, 0x21, 0x43, 0x44, 0xff, ++ 0x4c, 0xf5, 0xb1, 0x22, 0x47, 0x64, 0x3b, 0x8f, 0xae, 0xff, 0x1c, 0x7d, ++ 0xff, 0x4e, 0x45, 0x8c, 0xc3, 0x70, 0xde, 0xfe, 0xdd, 0x3a, 0xba, 0x66, ++ 0xeb, 0xf1, 0x49, 0x13, 0xf8, 0x30, 0xc3, 0xf9, 0xe8, 0xc1, 0x5c, 0x3a, ++ 0x38, 0x59, 0x7a, 0x38, 0x6e, 0x81, 0x4f, 0x48, 0x39, 0x2f, 0x1c, 0xb7, ++ 0x7e, 0x1c, 0x17, 0x8a, 0xfe, 0x03, 0x8a, 0xb4, 0x7e, 0x01, 0x3d, 0x86, ++ 0x75, 0xb5, 0x6b, 0x07, 0xfc, 0x68, 0x9d, 0xca, 0xb3, 0x04, 0x77, 0x82, ++ 0x7e, 0x08, 0xed, 0xfb, 0xf2, 0x14, 0xae, 0x03, 0xe7, 0x1a, 0xaf, 0x75, ++ 0x5b, 0xa0, 0xfe, 0xfe, 0x91, 0x96, 0xd0, 0xe5, 0x50, 0x7e, 0x2e, 0x58, ++ 0x10, 0xb4, 0x40, 0xf9, 0xe4, 0x27, 0x8f, 0x3a, 0xd1, 0x8e, 0xa9, 0x78, ++ 0xd2, 0xa8, 0x62, 0xb9, 0x61, 0x9f, 0x8d, 0xd6, 0x97, 0xb6, 0x1d, 0x0a, ++ 0x95, 0x57, 0x59, 0x5a, 0xee, 0x9c, 0x00, 0xe5, 0x1d, 0x4f, 0x1a, 0xd9, ++ 0x76, 0xea, 0x2e, 0xd3, 0x80, 0xe3, 0x3b, 0x25, 0x74, 0x0a, 0x0b, 0xf1, ++ 0x7c, 0xa9, 0x8d, 0x67, 0x2b, 0xb6, 0xed, 0xbf, 0x11, 0xdb, 0x97, 0x35, ++ 0x59, 0x98, 0x0d, 0xe0, 0x55, 0x3c, 0xbd, 0x6c, 0xe6, 0x04, 0xc8, 0x2f, ++ 0x3b, 0x64, 0x62, 0x58, 0xa5, 0x62, 0xe7, 0x5a, 0x73, 0x5f, 0xc8, 0x2f, ++ 0x0f, 0x2a, 0x0d, 0x98, 0x07, 0x7c, 0x69, 0x9d, 0x0a, 0xe4, 0xd9, 0x82, ++ 0x3b, 0xa1, 0xfe, 0xba, 0x7d, 0x5f, 0xb6, 0x21, 0xfe, 0xe7, 0x1a, 0x4d, ++ 0x83, 0x10, 0x9f, 0x33, 0xb0, 0x4e, 0xb8, 0x61, 0x9d, 0x78, 0xc9, 0xd1, ++ 0x92, 0x3a, 0x1b, 0xe8, 0x53, 0x1e, 0xdc, 0x3d, 0x0d, 0xdb, 0x97, 0xef, ++ 0x52, 0x3c, 0xa0, 0xe1, 0x00, 0xff, 0x9d, 0x07, 0x33, 0x10, 0xff, 0x47, ++ 0x14, 0x8f, 0x05, 0x58, 0xb8, 0xa2, 0x3e, 0x9e, 0xb9, 0x23, 0xe6, 0xcb, ++ 0xa9, 0x46, 0x23, 0x8d, 0x77, 0xd5, 0x36, 0x25, 0xc8, 0x00, 0xde, 0x32, ++ 0x56, 0x3b, 0x0d, 0xe9, 0x59, 0x81, 0xc4, 0x41, 0x3c, 0x3c, 0x96, 0xa0, ++ 0x4d, 0xe9, 0x9a, 0x6f, 0x67, 0xfc, 0x75, 0xd4, 0x9f, 0x96, 0xaf, 0x78, ++ 0x04, 0xfa, 0x83, 0xf6, 0x95, 0x8f, 0x2b, 0x1e, 0x1c, 0x72, 0xa5, 0x81, ++ 0xf9, 0x70, 0x1e, 0xb7, 0x3d, 0x6d, 0x2b, 0x79, 0xc8, 0x8e, 0xe3, 0x5d, ++ 0x6b, 0x1e, 0xec, 0xc0, 0x71, 0x6e, 0x34, 0x63, 0xbd, 0x65, 0xc1, 0x85, ++ 0x4f, 0xd9, 0xdc, 0x88, 0xe7, 0x36, 0xf3, 0x34, 0xc4, 0x77, 0xeb, 0x36, ++ 0x73, 0xe9, 0x50, 0xa4, 0x23, 0x5b, 0x50, 0x34, 0x14, 0xf1, 0xfb, 0xbf, ++ 0x32, 0x7e, 0x75, 0x46, 0x2f, 0x8e, 0x77, 0xd5, 0x48, 0xcb, 0x76, 0x23, ++ 0xe0, 0xc1, 0xec, 0xa1, 0x81, 0xb3, 0x1c, 0xdd, 0xf5, 0xec, 0x19, 0x58, ++ 0xaf, 0xdc, 0x11, 0xeb, 0x67, 0x39, 0x03, 0xbd, 0x4f, 0xeb, 0x77, 0xd0, ++ 0x5c, 0x3c, 0xac, 0xeb, 0xfb, 0x97, 0x86, 0x44, 0xd2, 0x1f, 0x2b, 0xea, ++ 0x8d, 0xcc, 0x6d, 0xed, 0xea, 0x47, 0x93, 0x8f, 0xc0, 0x11, 0x21, 0x1f, ++ 0x7b, 0x1d, 0x44, 0x6f, 0x8d, 0x9f, 0xab, 0x5c, 0x7c, 0x0a, 0x68, 0xfc, ++ 0x5c, 0x95, 0x28, 0xf8, 0xab, 0x76, 0xe4, 0xcf, 0x1a, 0xd6, 0x1d, 0x9f, ++ 0x3b, 0x91, 0x2f, 0x64, 0x4f, 0xbb, 0x28, 0xfd, 0x05, 0xac, 0x9b, 0x98, ++ 0x6e, 0x81, 0x75, 0x1e, 0xe9, 0x77, 0x2f, 0xd8, 0x4f, 0x6e, 0xb2, 0xcb, ++ 0x3d, 0xf4, 0xfd, 0x01, 0xb0, 0x93, 0x30, 0xdd, 0x0a, 0x76, 0x12, 0xa6, ++ 0x0f, 0x82, 0x9d, 0xe4, 0x16, 0x76, 0x12, 0xd6, 0xdb, 0x0e, 0x76, 0x12, ++ 0xa6, 0x3b, 0xc0, 0x4e, 0xc2, 0xef, 0x0f, 0x83, 0x3d, 0x8e, 0x69, 0x3d, ++ 0xd8, 0xe3, 0xf8, 0xfd, 0x51, 0xb0, 0xc7, 0x31, 0xdd, 0xe5, 0x0f, 0xd0, ++ 0xf7, 0xc7, 0xfd, 0x35, 0x94, 0x36, 0xf8, 0x6b, 0x29, 0xdd, 0x83, 0x7c, ++ 0x83, 0xb4, 0xd1, 0x1f, 0xa4, 0x7a, 0x4f, 0xf9, 0xeb, 0x29, 0x6d, 0xf2, ++ 0x37, 0xd0, 0xf7, 0x67, 0xfc, 0x4d, 0x94, 0xde, 0x2e, 0xe8, 0xe8, 0x9c, ++ 0xc8, 0x0a, 0x70, 0x1d, 0x75, 0x7a, 0x99, 0x0b, 0xc9, 0x9e, 0x34, 0xc3, ++ 0x5b, 0x60, 0x82, 0x7c, 0x52, 0x11, 0xcf, 0xa7, 0xde, 0x10, 0x28, 0x30, ++ 0x43, 0x3e, 0xd5, 0x07, 0x79, 0xa0, 0x4b, 0xdf, 0x95, 0xa1, 0x02, 0x0b, ++ 0xe4, 0xfb, 0x56, 0xf3, 0xf2, 0x01, 0xb7, 0xb0, 0x49, 0x56, 0xc8, 0x0f, ++ 0x08, 0xf0, 0xf2, 0xec, 0xdb, 0xbd, 0x93, 0x6c, 0x90, 0xcf, 0xae, 0xe5, ++ 0xe5, 0x83, 0xb7, 0x06, 0x26, 0xc5, 0x41, 0x7e, 0x70, 0x90, 0x97, 0x5f, ++ 0xb4, 0x2b, 0x34, 0x29, 0x1e, 0xf2, 0x17, 0x35, 0xf0, 0xf2, 0xe1, 0xcd, ++ 0x6c, 0xb2, 0x1d, 0xf2, 0xc3, 0x43, 0x3c, 0x9f, 0xf7, 0x92, 0x77, 0xb2, ++ 0x03, 0xf2, 0x79, 0x2d, 0x3c, 0x9f, 0xff, 0xe7, 0xc0, 0x64, 0x27, 0xe4, ++ 0xf3, 0x5b, 0x79, 0xfb, 0xf1, 0x67, 0x83, 0x46, 0x77, 0x94, 0xf5, 0x77, ++ 0x8f, 0xc9, 0xbd, 0x18, 0x55, 0xce, 0x01, 0xe5, 0x6d, 0xaf, 0x9a, 0x01, ++ 0x79, 0xb3, 0xfb, 0x26, 0x54, 0x89, 0x47, 0x95, 0x53, 0x94, 0x6f, 0x34, ++ 0x79, 0xa9, 0xfc, 0x7d, 0xa5, 0xdd, 0xab, 0xc2, 0x3a, 0xdf, 0x68, 0xf6, ++ 0x52, 0xf9, 0x17, 0xca, 0xe7, 0x94, 0x7f, 0xca, 0xe4, 0xa3, 0xf2, 0x78, ++ 0x83, 0x52, 0x40, 0x79, 0xb3, 0x8f, 0xca, 0xfb, 0x1b, 0xe2, 0x28, 0xdf, ++ 0x64, 0x0a, 0x50, 0xf9, 0x08, 0x43, 0x1f, 0x9e, 0x37, 0x07, 0xa8, 0xbc, ++ 0xc0, 0xd0, 0xaf, 0x00, 0xe1, 0x3f, 0x63, 0x0a, 0x52, 0xf9, 0x35, 0x86, ++ 0x41, 0x3c, 0x6f, 0x0e, 0x52, 0xf9, 0x2f, 0xd4, 0xe1, 0x05, 0x53, 0xa0, ++ 0xfe, 0xe3, 0x06, 0xdf, 0x5e, 0xd4, 0x77, 0xeb, 0x15, 0x5f, 0x19, 0xda, ++ 0x87, 0x4c, 0x6d, 0x48, 0x47, 0x7d, 0xa5, 0xd9, 0x95, 0x3b, 0x71, 0x70, ++ 0x68, 0x67, 0x66, 0x98, 0x69, 0x1e, 0xec, 0xf9, 0x43, 0xfe, 0x43, 0x34, ++ 0x0f, 0xf0, 0x2f, 0x19, 0xf3, 0xa5, 0x0f, 0xa3, 0x5d, 0x0a, 0x70, 0x0e, ++ 0x12, 0x1c, 0x13, 0xc0, 0x31, 0xf6, 0x0c, 0x27, 0xef, 0xe5, 0xb1, 0x12, ++ 0x9c, 0xbc, 0x97, 0xcb, 0x34, 0x38, 0xaf, 0x10, 0x1c, 0x5b, 0xef, 0xe0, ++ 0xec, 0x79, 0x79, 0xbc, 0x8c, 0xcf, 0xcb, 0xe5, 0x1a, 0x9c, 0x63, 0x04, ++ 0xc7, 0xd1, 0xbb, 0x71, 0xe5, 0xbd, 0x32, 0x51, 0xc6, 0xe7, 0x95, 0x95, ++ 0x1a, 0x9c, 0xe3, 0x04, 0x27, 0xb1, 0x77, 0xf8, 0x34, 0x1e, 0x95, 0xe9, ++ 0xd3, 0x78, 0x34, 0x4c, 0x9f, 0x33, 0xb8, 0x3e, 0xac, 0x4f, 0xe9, 0x1d, ++ 0x3e, 0xa3, 0x5f, 0x93, 0xe9, 0x33, 0xfa, 0xb5, 0x30, 0x7d, 0x3e, 0x26, ++ 0x7c, 0x32, 0x7a, 0x07, 0xa7, 0xf1, 0x35, 0x99, 0x3e, 0x8d, 0xaf, 0x85, ++ 0xe9, 0xf3, 0x15, 0xc1, 0xe9, 0xdf, 0xbb, 0x71, 0x8d, 0x7e, 0x5d, 0xa6, ++ 0xcf, 0xe8, 0xd7, 0xc3, 0xf4, 0x31, 0x19, 0x10, 0x4e, 0x56, 0xef, 0xe0, ++ 0x3c, 0xf5, 0xb6, 0x4c, 0x9f, 0xa7, 0xde, 0x0e, 0xd3, 0xc7, 0x69, 0x40, ++ 0xfa, 0x0c, 0xea, 0xdd, 0xb8, 0xf2, 0xdf, 0x91, 0xe9, 0x93, 0xff, 0x4e, ++ 0x98, 0x3e, 0x69, 0x84, 0xcf, 0x90, 0xde, 0xc1, 0x79, 0xea, 0x1d, 0x99, ++ 0x3e, 0x4f, 0xbd, 0x13, 0xa6, 0x8f, 0x9b, 0xf0, 0x19, 0xd6, 0xbb, 0x71, ++ 0xe5, 0xff, 0x45, 0xa6, 0x4f, 0xfe, 0x5f, 0xc2, 0xf4, 0x19, 0x42, 0x70, ++ 0x46, 0xf6, 0x0e, 0x9f, 0xa6, 0xf7, 0x64, 0xfa, 0x34, 0xbd, 0x17, 0xa6, ++ 0x4f, 0x1e, 0xc1, 0x19, 0xd3, 0x3b, 0x7c, 0xc6, 0x9e, 0x92, 0xe9, 0x33, ++ 0xf6, 0x54, 0x98, 0x3e, 0x13, 0x08, 0xce, 0xb8, 0xde, 0xc1, 0x69, 0x3a, ++ 0x25, 0xd3, 0xa7, 0xe9, 0x54, 0x98, 0x3e, 0x53, 0x88, 0xce, 0x97, 0xf6, ++ 0x6e, 0x5c, 0x63, 0xdf, 0x97, 0xe9, 0x33, 0xf6, 0xfd, 0x30, 0x7d, 0xae, ++ 0x22, 0x38, 0x05, 0xbe, 0x7a, 0xc2, 0x87, 0x01, 0x1c, 0x47, 0x6c, 0x38, ++ 0xcf, 0x9c, 0x93, 0xe9, 0xf3, 0xcc, 0xb9, 0x30, 0x7d, 0xe6, 0x10, 0x9c, ++ 0xa9, 0x00, 0x27, 0xa7, 0x67, 0x38, 0xe3, 0xdb, 0x64, 0xfa, 0x8c, 0x6f, ++ 0x0b, 0xd3, 0x67, 0x01, 0xc1, 0xb9, 0xb2, 0x77, 0x70, 0x9e, 0x69, 0x93, ++ 0xe9, 0xf3, 0x4c, 0x5b, 0x98, 0x3e, 0x65, 0x44, 0xe7, 0xab, 0x7a, 0x37, ++ 0xae, 0xf1, 0xed, 0x32, 0x7d, 0xc6, 0xb7, 0x73, 0xfa, 0x54, 0x59, 0x3c, ++ 0x93, 0x1d, 0x68, 0xdf, 0x25, 0x32, 0xcf, 0x76, 0x68, 0x72, 0xc9, 0xc9, ++ 0x86, 0x03, 0x4e, 0xc8, 0x9b, 0xec, 0xcc, 0x83, 0x60, 0x5f, 0x52, 0x42, ++ 0x3b, 0x10, 0x3e, 0xac, 0x95, 0x64, 0x17, 0xaa, 0x1e, 0xcd, 0x4e, 0xf1, ++ 0x30, 0xb4, 0x43, 0x67, 0x38, 0xdd, 0x1e, 0xf4, 0xfb, 0x18, 0x35, 0x7b, ++ 0x84, 0xb5, 0xd0, 0x7e, 0xc1, 0xbe, 0x2b, 0x51, 0xf2, 0x07, 0x7d, 0x69, ++ 0x98, 0x74, 0x0b, 0xe2, 0xeb, 0x00, 0xab, 0x2d, 0xd2, 0x2e, 0x49, 0x18, ++ 0x1b, 0x27, 0xd9, 0x43, 0x89, 0xde, 0x24, 0x29, 0xdf, 0xa7, 0xb0, 0xaf, ++ 0x54, 0x3f, 0xa5, 0x28, 0x5b, 0x2a, 0x4f, 0x2b, 0xb9, 0x48, 0x2a, 0xcf, ++ 0xf0, 0xe5, 0x49, 0xf9, 0xcc, 0xb2, 0xf1, 0x52, 0xfd, 0xfe, 0xd5, 0x93, ++ 0xa4, 0xfc, 0x05, 0x6b, 0xa6, 0x4b, 0xf5, 0xb3, 0x02, 0xb3, 0xa4, 0x7c, ++ 0x4e, 0xcd, 0x75, 0x52, 0xfd, 0x41, 0xb5, 0x8b, 0xa4, 0xf2, 0x0b, 0xeb, ++ 0xca, 0xa5, 0xf2, 0x21, 0xc1, 0x55, 0x52, 0xfe, 0xe2, 0xfa, 0xff, 0x23, ++ 0xd5, 0x1f, 0xd6, 0xb0, 0x4e, 0x2a, 0x1f, 0xd1, 0xb4, 0x59, 0x2a, 0x1f, ++ 0x19, 0xfa, 0x85, 0x94, 0x1f, 0x75, 0xe8, 0x01, 0xa9, 0xfe, 0x98, 0x96, ++ 0xed, 0x52, 0xf9, 0x25, 0xc7, 0x1e, 0x95, 0xca, 0xc7, 0xb5, 0xee, 0x91, ++ 0xf2, 0x13, 0x4e, 0x3f, 0xa3, 0xb3, 0x03, 0xe5, 0xfd, 0xff, 0xfa, 0x02, ++ 0xc6, 0xed, 0xc1, 0x0c, 0x33, 0xd9, 0x83, 0x21, 0x87, 0x99, 0xf2, 0xe6, ++ 0x7d, 0x36, 0xb2, 0xff, 0xf7, 0x63, 0x1e, 0xf8, 0x69, 0xee, 0x3b, 0x83, ++ 0xf2, 0xe6, 0x67, 0x17, 0xbb, 0x93, 0x71, 0x3f, 0x8d, 0x00, 0x60, 0xbd, ++ 0x2f, 0xe8, 0x5b, 0x76, 0x21, 0xfa, 0x7b, 0x6e, 0x1e, 0xef, 0xbb, 0xd0, ++ 0x05, 0xdf, 0x6f, 0x36, 0xfb, 0x46, 0xb8, 0xa2, 0xf8, 0x23, 0x3c, 0xaa, ++ 0x6f, 0x9f, 0x81, 0xfc, 0x45, 0x2d, 0x0a, 0x4b, 0xc7, 0xd4, 0x6d, 0xc0, ++ 0x34, 0xce, 0x28, 0xf6, 0xeb, 0x16, 0x2e, 0x5f, 0x1b, 0xb3, 0xf2, 0x1f, ++ 0x0a, 0x44, 0xc8, 0x69, 0x4d, 0x7f, 0x98, 0x7f, 0x90, 0x3f, 0x6c, 0x30, ++ 0x93, 0xfd, 0xaa, 0xc9, 0xf7, 0xc6, 0xfe, 0xa5, 0xe9, 0x0b, 0x23, 0xfa, ++ 0xd9, 0xd0, 0xdf, 0x5c, 0xb2, 0x7d, 0x28, 0xff, 0xbe, 0xd8, 0x8e, 0xfd, ++ 0x15, 0xbd, 0x88, 0xf3, 0xac, 0xca, 0xdc, 0x31, 0x18, 0xf1, 0xd2, 0xf7, ++ 0x63, 0xc9, 0x1e, 0x2b, 0xf5, 0x63, 0x1d, 0x50, 0x46, 0xfd, 0xbc, 0x86, ++ 0xfd, 0x44, 0xf8, 0xbd, 0x2c, 0x03, 0xca, 0x74, 0xfd, 0x58, 0x4b, 0xb6, ++ 0x8b, 0xef, 0xa2, 0x9f, 0x63, 0x38, 0xae, 0x58, 0xfd, 0x6c, 0xcc, 0x1e, ++ 0x2f, 0x8f, 0x67, 0x40, 0x39, 0xf5, 0xf3, 0xae, 0xae, 0x9f, 0x8d, 0x03, ++ 0xca, 0x75, 0xfd, 0xc4, 0xf1, 0xf1, 0xc0, 0x77, 0xd1, 0xcf, 0x7b, 0xe7, ++ 0x1d, 0x4f, 0xce, 0x44, 0x79, 0x3c, 0x17, 0xac, 0xa4, 0x7e, 0x3a, 0x74, ++ 0x74, 0xb3, 0x5c, 0xb0, 0x52, 0xd7, 0x8f, 0x9d, 0xfa, 0xc1, 0xef, 0x8b, ++ 0xc9, 0x9f, 0x0b, 0xbb, 0x80, 0x34, 0xe0, 0xb3, 0xa5, 0xa3, 0x94, 0xe4, ++ 0xe0, 0x3f, 0x6d, 0x2c, 0x00, 0x72, 0x61, 0xce, 0x2c, 0xff, 0x35, 0xe6, ++ 0xd9, 0x5b, 0x36, 0x36, 0x08, 0xfb, 0x71, 0x43, 0xbf, 0x50, 0x8f, 0xe5, ++ 0x72, 0xff, 0xd1, 0xd3, 0x86, 0x24, 0x1a, 0xcf, 0x67, 0x71, 0xc0, 0xff, ++ 0x08, 0x3b, 0xb5, 0x6b, 0x3f, 0x1b, 0xa0, 0x7d, 0xf1, 0x52, 0x81, 0x22, ++ 0x0b, 0x02, 0x46, 0xb0, 0xbf, 0xad, 0x14, 0xb2, 0xb9, 0x64, 0x57, 0xf1, ++ 0x80, 0x9b, 0xdc, 0x90, 0x36, 0x1d, 0x18, 0x78, 0x37, 0xf6, 0xb3, 0xc5, ++ 0xe1, 0x19, 0x04, 0xf9, 0xb6, 0xa6, 0xc9, 0xe6, 0xc5, 0x51, 0xe4, 0x69, ++ 0x69, 0xad, 0xe9, 0x54, 0x6b, 0xa4, 0x5f, 0x44, 0xdb, 0xdf, 0x4c, 0x62, ++ 0xb9, 0xd5, 0xd0, 0xff, 0x2e, 0x9b, 0x4b, 0xca, 0x6b, 0xe9, 0x4a, 0xc5, ++ 0xc5, 0x84, 0x3f, 0x82, 0xf2, 0x27, 0x60, 0xdf, 0xc2, 0x60, 0x3f, 0xf0, ++ 0x67, 0xd8, 0x17, 0x30, 0x20, 0xd5, 0xbb, 0x26, 0xbe, 0x4f, 0x7b, 0x07, ++ 0xf6, 0x37, 0x98, 0x6f, 0x85, 0xfd, 0x0d, 0x96, 0x33, 0xb6, 0x96, 0xda, ++ 0x9d, 0x10, 0x7e, 0xda, 0x13, 0xb7, 0x2b, 0x41, 0xa4, 0xf7, 0x67, 0x3f, ++ 0xf9, 0xa1, 0x89, 0xf4, 0x78, 0x80, 0xbd, 0x9a, 0x9e, 0x8a, 0x7e, 0x37, ++ 0xfe, 0xb7, 0x60, 0x4d, 0x3c, 0xfa, 0xf8, 0xc3, 0xf8, 0x2d, 0x0c, 0xf4, ++ 0x91, 0xf2, 0xa0, 0x2e, 0x33, 0x0d, 0xe9, 0xb4, 0x2f, 0xa4, 0xfd, 0x6f, ++ 0xc7, 0xd3, 0x96, 0xe0, 0x76, 0xa4, 0x6b, 0x4d, 0x26, 0xd0, 0x54, 0xd4, ++ 0xcb, 0x66, 0xec, 0x75, 0xd8, 0xe4, 0x66, 0x24, 0x51, 0x36, 0xd3, 0x30, ++ 0x96, 0xb1, 0xd9, 0xd5, 0xc5, 0x53, 0xd3, 0x68, 0x16, 0x29, 0xfd, 0x57, ++ 0x01, 0x9e, 0xb3, 0x1a, 0x47, 0x9a, 0xa0, 0x05, 0x6b, 0x33, 0xb5, 0xde, ++ 0xe8, 0xb1, 0x77, 0xc1, 0x65, 0x5e, 0xd3, 0x09, 0xa4, 0x8f, 0x15, 0xfe, ++ 0x21, 0x9c, 0x6b, 0x0a, 0x21, 0x1f, 0xd1, 0xff, 0xb5, 0x45, 0x72, 0x7e, ++ 0x2e, 0x53, 0xbb, 0xf2, 0xc0, 0xef, 0xc1, 0xc6, 0x6c, 0xc1, 0x37, 0xd1, ++ 0xaf, 0xdb, 0x6b, 0x42, 0xbe, 0x16, 0xa5, 0x72, 0x7c, 0xe6, 0x62, 0x9a, ++ 0x87, 0xc5, 0xdc, 0xdf, 0x51, 0xe2, 0xe2, 0x6d, 0x35, 0x7c, 0xaa, 0x16, ++ 0x9b, 0x58, 0x88, 0xf6, 0xa7, 0x81, 0x14, 0x86, 0xfe, 0xe8, 0x40, 0x32, ++ 0xd5, 0xbb, 0x4e, 0xdb, 0x67, 0xea, 0xf0, 0x2b, 0x31, 0x59, 0xbd, 0x45, ++ 0x40, 0xd7, 0x92, 0x85, 0x46, 0xa2, 0xab, 0x1e, 0xdf, 0x37, 0xf7, 0xc5, ++ 0x7b, 0x0d, 0xc3, 0x21, 0xad, 0xb9, 0xdb, 0x84, 0xae, 0xcd, 0x9e, 0xf0, ++ 0x9f, 0xe7, 0x93, 0xcb, 0x59, 0x19, 0xef, 0x4f, 0xa3, 0xab, 0x26, 0x2f, ++ 0xa7, 0x04, 0x7f, 0x4f, 0x20, 0xff, 0x21, 0x7d, 0x1f, 0xf9, 0x0f, 0x78, ++ 0x9f, 0x14, 0xfc, 0xef, 0x92, 0x63, 0xce, 0xff, 0x2a, 0x8b, 0x6f, 0x26, ++ 0xf2, 0xbf, 0xe3, 0x7e, 0x23, 0x23, 0x7e, 0x09, 0xbe, 0xcf, 0x11, 0x7c, ++ 0x5f, 0x5a, 0x2b, 0xf3, 0x7d, 0x0e, 0xfa, 0xc9, 0xa1, 0xfe, 0x9c, 0xd5, ++ 0x59, 0xc1, 0xf5, 0x58, 0xbf, 0xae, 0x8f, 0xc4, 0x5f, 0x18, 0xb8, 0x4c, ++ 0x87, 0xda, 0xbb, 0xa6, 0x82, 0x5a, 0xed, 0x86, 0xff, 0xdb, 0x42, 0x0e, ++ 0xae, 0xab, 0xd9, 0xfd, 0x3c, 0xb2, 0xf7, 0xfa, 0x32, 0xdd, 0xf8, 0x04, ++ 0x1f, 0x6e, 0x14, 0x7c, 0x98, 0xaf, 0xa3, 0xc7, 0x1c, 0xc1, 0xb7, 0xf9, ++ 0x82, 0x6f, 0xcb, 0x58, 0xe0, 0xb6, 0x0c, 0xf2, 0x1f, 0x05, 0x4d, 0xe8, ++ 0x17, 0x9b, 0x57, 0xa6, 0x30, 0xd4, 0x17, 0x55, 0x3f, 0xd5, 0xf8, 0xd6, ++ 0x2a, 0xf1, 0xcd, 0xa7, 0xf1, 0x4d, 0x87, 0xef, 0x8d, 0x82, 0x6f, 0x37, ++ 0xfe, 0x84, 0xf3, 0x4d, 0x8f, 0x77, 0xab, 0xe0, 0x5b, 0x6b, 0xdd, 0xc7, ++ 0x26, 0x96, 0xdd, 0x1d, 0x6f, 0x3d, 0x9e, 0x0b, 0xd6, 0xe8, 0xc6, 0x15, ++ 0xd0, 0xf3, 0xad, 0x56, 0x9c, 0x3b, 0xb8, 0xcc, 0x68, 0xef, 0x14, 0x7b, ++ 0x0b, 0xfa, 0x9c, 0x8c, 0xa8, 0x7f, 0x4d, 0xe1, 0x95, 0x7d, 0x4e, 0x46, ++ 0xe8, 0x85, 0x6b, 0x8b, 0x8a, 0xa5, 0xfc, 0xdc, 0x92, 0x79, 0x52, 0xfd, ++ 0x79, 0xbe, 0x85, 0x52, 0xf9, 0xf5, 0x65, 0xcb, 0xa5, 0xf2, 0xf9, 0xd5, ++ 0x3f, 0x94, 0xf2, 0x0b, 0xd6, 0xfc, 0x44, 0xaa, 0xbf, 0x30, 0xb0, 0x56, ++ 0x2a, 0x5f, 0x5c, 0xb3, 0x49, 0x2a, 0x5f, 0x5a, 0x7b, 0x97, 0x94, 0x5f, ++ 0x56, 0x77, 0xbf, 0x54, 0x7f, 0x79, 0x70, 0x9b, 0x54, 0xbe, 0xa2, 0xfe, ++ 0x11, 0xa9, 0xbc, 0xa2, 0x61, 0xb7, 0x94, 0xaf, 0x6a, 0x7a, 0x5a, 0xaa, ++ 0x6f, 0xd8, 0x37, 0xe4, 0x6a, 0x94, 0xaf, 0x97, 0x8e, 0x1a, 0x19, 0xfa, ++ 0xcb, 0x3e, 0xf5, 0xbc, 0x4f, 0xfe, 0xba, 0x4f, 0x3d, 0x26, 0x0f, 0xd6, ++ 0xa9, 0x44, 0x99, 0x1b, 0x87, 0xf2, 0xec, 0x26, 0x79, 0x3e, 0xe5, 0xcf, ++ 0xa5, 0xf4, 0xb4, 0xdf, 0x43, 0xf2, 0x7e, 0xc6, 0x3f, 0x96, 0xd2, 0xb6, ++ 0xa6, 0x03, 0x76, 0xf4, 0x3f, 0x56, 0xc5, 0x81, 0xde, 0x4f, 0x04, 0x3b, ++ 0xdc, 0xf8, 0xe6, 0xda, 0x9a, 0x7e, 0xb8, 0xde, 0x40, 0xfb, 0xf1, 0x8c, ++ 0x35, 0x1b, 0x5b, 0xd7, 0x06, 0x20, 0x7f, 0x00, 0x0f, 0xa3, 0x60, 0xde, ++ 0xcc, 0xa8, 0x33, 0xb3, 0xd0, 0x28, 0x06, 0xd2, 0xdd, 0x37, 0x2c, 0xcf, ++ 0x1d, 0xc6, 0x88, 0xf2, 0xd6, 0x1e, 0xca, 0xeb, 0x54, 0x16, 0xea, 0xd3, ++ 0xbd, 0x7c, 0x46, 0x6b, 0xf4, 0xef, 0xed, 0x4a, 0xc7, 0xe0, 0x0c, 0xf4, ++ 0x13, 0xbe, 0x61, 0x61, 0x3b, 0x23, 0xfc, 0x75, 0xdd, 0xcf, 0x2b, 0x58, ++ 0x26, 0xda, 0x15, 0xb1, 0xca, 0xcf, 0x1a, 0x58, 0x59, 0xe4, 0x79, 0xd6, ++ 0x49, 0x23, 0x3f, 0x27, 0x71, 0x1a, 0x27, 0x9d, 0x34, 0x42, 0xba, 0xd2, ++ 0xcc, 0xe7, 0xff, 0xca, 0x3d, 0x19, 0x93, 0x98, 0x13, 0xf3, 0xa1, 0xc1, ++ 0xd5, 0x51, 0xfc, 0x2e, 0xe1, 0xfe, 0x1a, 0x00, 0x99, 0x34, 0xe4, 0x73, ++ 0x8e, 0x34, 0xef, 0x97, 0xd5, 0x5d, 0xdc, 0x35, 0xcf, 0x19, 0xf6, 0x93, ++ 0x4d, 0x72, 0xbb, 0x3c, 0x38, 0x4a, 0xfa, 0xbe, 0xa2, 0x7e, 0x82, 0xd4, ++ 0x2e, 0x57, 0xf1, 0xbd, 0x6b, 0x84, 0x7a, 0x67, 0xf7, 0x1b, 0x69, 0xbd, ++ 0x66, 0xa1, 0x03, 0x03, 0xae, 0x19, 0x86, 0xf8, 0x79, 0x4f, 0xe2, 0x77, ++ 0xd6, 0x94, 0x42, 0x76, 0x57, 0x8b, 0xdf, 0xdb, 0xe7, 0xe4, 0x40, 0xc6, ++ 0xfe, 0xe8, 0x2f, 0xa4, 0xf4, 0x55, 0x7f, 0x11, 0xa5, 0xaf, 0xf9, 0x4b, ++ 0x28, 0x3d, 0xe6, 0xf7, 0x51, 0xfa, 0xa6, 0xbf, 0x8c, 0xd2, 0x3f, 0xfb, ++ 0xab, 0x29, 0x7d, 0xc7, 0xbf, 0x86, 0xd2, 0x56, 0x7f, 0x80, 0xd2, 0x13, ++ 0xfe, 0x1a, 0x4a, 0x4f, 0xfa, 0x6b, 0x29, 0x3d, 0xe5, 0xaf, 0xa3, 0xf4, ++ 0xb4, 0x3f, 0x48, 0xe9, 0x19, 0x7f, 0x3d, 0xa5, 0x67, 0xfd, 0x0d, 0x94, ++ 0xb6, 0xf9, 0x9b, 0x28, 0xd5, 0xf4, 0x67, 0x4f, 0xf2, 0x77, 0x5a, 0xac, ++ 0xaf, 0x67, 0x50, 0xfe, 0xa2, 0xc8, 0x99, 0xf9, 0x56, 0xb6, 0xae, 0x66, ++ 0x62, 0x97, 0x9c, 0xc5, 0xa9, 0x96, 0x75, 0x28, 0x67, 0x1a, 0x7d, 0x67, ++ 0xd4, 0x59, 0x84, 0x3c, 0xa4, 0x4a, 0xf2, 0x90, 0x88, 0xeb, 0x30, 0xc9, ++ 0x59, 0x0f, 0xe5, 0x75, 0x26, 0x21, 0x87, 0xb1, 0xda, 0x47, 0x2f, 0x47, ++ 0x79, 0xeb, 0xfb, 0x3d, 0xc8, 0x1b, 0x63, 0xeb, 0x48, 0x0e, 0x66, 0x0a, ++ 0xb9, 0xfb, 0xae, 0xf2, 0xc6, 0xd0, 0x1b, 0x9f, 0x82, 0xf2, 0x94, 0xa9, ++ 0x93, 0x27, 0x59, 0x0e, 0x35, 0x39, 0xd2, 0xf4, 0x40, 0xae, 0x52, 0x34, ++ 0x5c, 0x1d, 0xd3, 0x25, 0x57, 0x33, 0x8d, 0xdc, 0x4e, 0xd2, 0xe4, 0xea, ++ 0xe7, 0x68, 0x27, 0x46, 0xb1, 0xb7, 0x6e, 0x50, 0x15, 0xb1, 0xfe, 0x71, ++ 0xfb, 0x88, 0xf9, 0x32, 0x0c, 0x68, 0xbf, 0xad, 0x12, 0x7e, 0x7f, 0xe6, ++ 0x4e, 0xa7, 0x7c, 0xa7, 0xe8, 0x7b, 0x3d, 0x80, 0x6b, 0xc1, 0x7a, 0x6a, ++ 0x30, 0x17, 0xd7, 0x91, 0xce, 0xdc, 0xbf, 0x0d, 0x46, 0xff, 0x78, 0xe7, ++ 0x31, 0x0b, 0x43, 0x3f, 0x7c, 0xac, 0xf1, 0xe9, 0xe5, 0x25, 0x36, 0xdd, ++ 0xbd, 0xb4, 0x7f, 0x28, 0x0d, 0xc2, 0xa2, 0x36, 0xaa, 0x7b, 0xb9, 0x2d, ++ 0x8e, 0xd3, 0xd5, 0x66, 0x60, 0x85, 0x2c, 0x0f, 0xcf, 0x67, 0xf3, 0x8f, ++ 0xf9, 0x80, 0x9f, 0x71, 0xff, 0x79, 0x71, 0x1e, 0xee, 0x6b, 0xe1, 0xbb, ++ 0xca, 0xc8, 0xae, 0x0a, 0x7a, 0x8a, 0xa3, 0xf8, 0xdb, 0x19, 0xca, 0x78, ++ 0x5a, 0xcf, 0xf4, 0xd5, 0xea, 0x9f, 0x7a, 0xe0, 0xcb, 0x7c, 0x3c, 0x37, ++ 0x9f, 0x29, 0xe6, 0x79, 0xdc, 0x01, 0x23, 0x3f, 0xd7, 0x0e, 0x3d, 0xe4, ++ 0xb9, 0x26, 0xe2, 0x7c, 0x06, 0xf6, 0xdb, 0xe9, 0xe8, 0x77, 0xee, 0x18, ++ 0x64, 0x76, 0x91, 0xfd, 0x10, 0xea, 0x2b, 0xd3, 0x31, 0xd8, 0x57, 0xa2, ++ 0xe3, 0x81, 0x41, 0x9f, 0x0d, 0xc6, 0xf3, 0x8d, 0x4d, 0x20, 0x87, 0x38, ++ 0xbf, 0x3a, 0x07, 0x0e, 0x4e, 0x60, 0xe7, 0x91, 0x8f, 0x9e, 0xf4, 0x7c, ++ 0x4f, 0xf4, 0x5c, 0x14, 0xec, 0xdb, 0x4b, 0x7a, 0x9a, 0x19, 0x9e, 0x1b, ++ 0x01, 0x3d, 0xb7, 0xe3, 0xfd, 0x97, 0xde, 0xd2, 0xb3, 0x27, 0x3d, 0xd9, ++ 0x93, 0x7e, 0x3c, 0xb1, 0x99, 0xd3, 0xd9, 0x29, 0xec, 0xd3, 0x58, 0x74, ++ 0x6e, 0x9f, 0x04, 0xf3, 0x2e, 0x8a, 0x1c, 0xdf, 0xa3, 0xaa, 0xb2, 0x1c, ++ 0xb3, 0x81, 0xfc, 0xbc, 0x43, 0xa3, 0x3f, 0xee, 0x4b, 0x23, 0xe8, 0x7f, ++ 0xa9, 0xdd, 0x4d, 0xf5, 0x9f, 0xdb, 0xf7, 0xd6, 0x80, 0x56, 0xe8, 0xa7, ++ 0xb3, 0xf1, 0xc2, 0x04, 0xc6, 0xcf, 0x73, 0xc8, 0xae, 0xeb, 0x78, 0x52, ++ 0xd8, 0xed, 0xee, 0x4c, 0x99, 0x8f, 0xad, 0x7d, 0x09, 0xae, 0x06, 0xe7, ++ 0xb9, 0x27, 0x5f, 0x1f, 0x80, 0xfb, 0xe4, 0xdb, 0x30, 0x03, 0xf3, 0xec, ++ 0xc9, 0xf8, 0xa2, 0x5f, 0xa9, 0x29, 0x5d, 0xf0, 0x7a, 0x7b, 0x0e, 0x1f, ++ 0x6b, 0x5c, 0xbb, 0xbf, 0xe5, 0xfc, 0x6c, 0x4f, 0xd5, 0xe6, 0x67, 0xcb, ++ 0x00, 0x94, 0xa7, 0xcf, 0x84, 0x1e, 0x88, 0x39, 0xbe, 0x9e, 0xe4, 0x14, ++ 0xc7, 0x07, 0x70, 0xae, 0x52, 0xf8, 0xf8, 0x36, 0x18, 0x8b, 0x7e, 0x87, ++ 0x7a, 0x26, 0x3c, 0xbe, 0xd1, 0x29, 0xbd, 0x1a, 0x5f, 0x55, 0x82, 0x99, ++ 0x29, 0x23, 0x00, 0x3f, 0x87, 0xd9, 0xcc, 0x12, 0x18, 0xdb, 0xa1, 0xfa, ++ 0x0e, 0xaa, 0xb4, 0x8f, 0xf3, 0xb4, 0x06, 0xd0, 0x4f, 0xb1, 0x2f, 0xde, ++ 0xb3, 0x1e, 0x58, 0x52, 0xe5, 0x3c, 0xf3, 0x72, 0xc8, 0x8d, 0xed, 0x64, ++ 0x7f, 0xc6, 0x8a, 0x7a, 0x9b, 0x4b, 0xb6, 0x9f, 0x12, 0x5d, 0xb2, 0xfd, ++ 0x94, 0xe1, 0x8a, 0xb4, 0x9f, 0x3a, 0x0f, 0x3d, 0xe4, 0xf4, 0x01, 0x7e, ++ 0xab, 0xd2, 0x0d, 0xae, 0x93, 0xa3, 0x70, 0x9d, 0xf3, 0x8a, 0x75, 0x8e, ++ 0xaf, 0xab, 0x1a, 0x7e, 0x15, 0x0d, 0x59, 0x2e, 0xbb, 0x04, 0x47, 0xce, ++ 0x77, 0xd6, 0x2a, 0x85, 0x0d, 0x24, 0x4f, 0xee, 0x84, 0xd9, 0x51, 0xce, ++ 0xcb, 0xb4, 0x74, 0x55, 0xba, 0xd9, 0x75, 0x12, 0xd6, 0xab, 0x33, 0xf5, ++ 0x39, 0x09, 0xd8, 0xef, 0x19, 0xbf, 0xd5, 0xc5, 0xd7, 0x57, 0x97, 0x8b, ++ 0xf7, 0x9b, 0xee, 0x8a, 0x5c, 0x5f, 0x57, 0xae, 0x89, 0xa3, 0xfa, 0x1a, ++ 0x7e, 0xb1, 0xe0, 0xfe, 0xb3, 0xf1, 0x63, 0xac, 0x91, 0xbd, 0x6b, 0xc5, ++ 0x75, 0x11, 0xca, 0x72, 0x62, 0xd7, 0x8f, 0xc9, 0x4f, 0xf5, 0x13, 0x33, ++ 0x9d, 0x4b, 0x37, 0x9b, 0x3e, 0x43, 0xfb, 0xdd, 0x96, 0xab, 0xd9, 0xef, ++ 0x2a, 0xe5, 0x35, 0xb8, 0x55, 0x0d, 0xc6, 0x80, 0x65, 0x04, 0x7e, 0xdf, ++ 0x25, 0xf5, 0x07, 0xed, 0xdc, 0xda, 0x19, 0x33, 0xb6, 0x8b, 0x2d, 0x37, ++ 0x2a, 0x3b, 0xa5, 0xf1, 0x13, 0xf8, 0x6f, 0xc5, 0x83, 0x77, 0xda, 0xb7, ++ 0x5a, 0x89, 0xcf, 0x3e, 0x80, 0x98, 0x00, 0xf0, 0xda, 0x55, 0x7b, 0x0d, ++ 0xca, 0xd5, 0x09, 0x95, 0xcf, 0xe7, 0x2a, 0x21, 0xa7, 0x15, 0xd6, 0x56, ++ 0xb3, 0xcf, 0x4d, 0xe4, 0x6e, 0x41, 0x79, 0x5e, 0x34, 0x96, 0x69, 0x13, ++ 0x66, 0xee, 0x5b, 0xa0, 0xa7, 0x3f, 0x78, 0xd1, 0x44, 0xf7, 0xb4, 0xd8, ++ 0x57, 0x00, 0x3d, 0xbf, 0xeb, 0xaa, 0xc0, 0x12, 0x56, 0xe4, 0x44, 0xa7, ++ 0xe7, 0xa2, 0xc6, 0x15, 0x33, 0x70, 0xdd, 0xfe, 0xc0, 0xa0, 0xed, 0x87, ++ 0x6b, 0xf3, 0x71, 0xdc, 0xe7, 0x98, 0xa1, 0x10, 0xf5, 0xd2, 0x39, 0xf6, ++ 0x47, 0xe7, 0xa8, 0x88, 0xf9, 0x3a, 0xc4, 0xc4, 0xfd, 0x31, 0xac, 0x86, ++ 0xef, 0x73, 0x02, 0xf0, 0x0f, 0xc7, 0xb7, 0xb4, 0x56, 0xde, 0xf7, 0x2c, ++ 0xab, 0x93, 0xf3, 0xa5, 0x6c, 0x56, 0x2a, 0xea, 0xdb, 0xd2, 0x2d, 0x26, ++ 0x16, 0x04, 0xdc, 0x97, 0xe3, 0xbe, 0x49, 0x1b, 0x37, 0xe8, 0xdf, 0x0c, ++ 0x13, 0xf7, 0x6b, 0x2c, 0x63, 0xd5, 0x1b, 0x70, 0x9f, 0x7e, 0xaf, 0x89, ++ 0xfb, 0x7b, 0x16, 0xb9, 0x98, 0x9a, 0x09, 0x78, 0x55, 0xfc, 0xc7, 0x2f, ++ 0xf3, 0xd1, 0xef, 0xe3, 0x31, 0x71, 0xbb, 0x43, 0x3b, 0x4f, 0x5e, 0x9e, ++ 0xc4, 0xf1, 0x2e, 0x9f, 0x1d, 0x34, 0x7b, 0xa1, 0xfe, 0xbb, 0x8d, 0xa3, ++ 0xe6, 0x80, 0xc6, 0x85, 0xf6, 0xc1, 0x0d, 0x64, 0xff, 0x14, 0x33, 0xcf, ++ 0x4e, 0xd6, 0x9d, 0xee, 0x8b, 0x6b, 0x64, 0xfc, 0x7a, 0xc2, 0x5f, 0x8f, ++ 0xaf, 0x66, 0x07, 0x75, 0x3b, 0xd7, 0x16, 0x78, 0x24, 0xd7, 0x2b, 0xde, ++ 0x60, 0x14, 0x3d, 0x77, 0x99, 0x49, 0x11, 0xfb, 0x3f, 0x3e, 0x3f, 0x66, ++ 0x9b, 0x64, 0x7f, 0xce, 0x3c, 0x93, 0xec, 0xf7, 0xd1, 0xe4, 0xc0, 0x24, ++ 0xe4, 0xe0, 0x84, 0xea, 0xbb, 0xda, 0x34, 0x86, 0xf3, 0x1d, 0xf9, 0xa8, ++ 0xa8, 0x1d, 0x66, 0x5f, 0x44, 0x3d, 0x73, 0x57, 0xbd, 0xd9, 0xe7, 0xab, ++ 0x67, 0xc1, 0x7a, 0x46, 0xaa, 0x37, 0xcf, 0x94, 0x82, 0xf5, 0x3a, 0xa6, ++ 0xd1, 0xfe, 0x98, 0x81, 0x3c, 0x0d, 0xed, 0xaa, 0x67, 0xeb, 0x82, 0x77, ++ 0x23, 0x87, 0x27, 0xd7, 0xab, 0xf8, 0x8f, 0xc7, 0x9e, 0x0a, 0x80, 0xbc, ++ 0x94, 0xff, 0xf6, 0x1e, 0x27, 0x83, 0x75, 0xf3, 0x03, 0xb5, 0x36, 0xd5, ++ 0x03, 0xdf, 0x57, 0xee, 0xbc, 0xcd, 0xe9, 0x85, 0xf4, 0xb4, 0x1a, 0x70, ++ 0x22, 0x3f, 0x3f, 0x08, 0x1a, 0x0b, 0xa3, 0xd1, 0x63, 0x4b, 0x98, 0x1e, ++ 0x5e, 0xbb, 0x82, 0xfe, 0x34, 0x21, 0x9f, 0xac, 0x26, 0x40, 0x7e, 0x8a, ++ 0xcf, 0x76, 0x9a, 0x5c, 0xe4, 0xe7, 0xaf, 0xb7, 0x84, 0x2c, 0x20, 0xa7, ++ 0x95, 0x8d, 0xcb, 0x67, 0xb0, 0xe1, 0x94, 0x3f, 0xce, 0xf3, 0x1b, 0x3f, ++ 0x32, 0x62, 0xbe, 0x49, 0xe6, 0x57, 0xf9, 0xaf, 0xef, 0x49, 0x75, 0xf3, ++ 0x7b, 0x36, 0xdc, 0x9f, 0xc4, 0x42, 0x64, 0xe7, 0x56, 0xee, 0x78, 0x6f, ++ 0x1a, 0xae, 0x17, 0x55, 0xac, 0x83, 0xe4, 0x4c, 0xdf, 0x0e, 0xfb, 0xff, ++ 0x3c, 0x89, 0xe6, 0xf5, 0x42, 0x73, 0x42, 0xf7, 0x72, 0xc0, 0x93, 0xfc, ++ 0x09, 0x55, 0x62, 0x96, 0x55, 0x35, 0xfe, 0xfc, 0x23, 0xa3, 0x13, 0xf3, ++ 0xb2, 0x7c, 0x94, 0x09, 0x7b, 0x15, 0xe9, 0x84, 0xfb, 0xfc, 0xdb, 0x4c, ++ 0x8e, 0xe4, 0x53, 0xf1, 0x90, 0xbd, 0x84, 0x5d, 0x82, 0xf3, 0x5c, 0xa3, ++ 0x07, 0x0b, 0x72, 0xbb, 0x75, 0xfd, 0x23, 0xf7, 0x0d, 0x3f, 0x0e, 0xf8, ++ 0x9c, 0xdd, 0xf1, 0xa2, 0x53, 0x19, 0x1a, 0xa9, 0x1f, 0xb8, 0x9c, 0x75, ++ 0x36, 0x2c, 0xfe, 0x95, 0xd5, 0x10, 0x5b, 0x8f, 0xb4, 0x81, 0x1c, 0x46, ++ 0xda, 0x47, 0x00, 0x98, 0xda, 0xb9, 0x9b, 0x84, 0xbd, 0xdd, 0xcc, 0xd3, ++ 0x95, 0xa6, 0x90, 0x13, 0xef, 0xb3, 0xac, 0xdc, 0x66, 0xf2, 0x80, 0x04, ++ 0xb2, 0x95, 0x8f, 0x19, 0x19, 0xde, 0x03, 0x60, 0x6f, 0x58, 0x82, 0xe8, ++ 0x17, 0x5d, 0xf1, 0xd8, 0xf3, 0xaf, 0x8d, 0x07, 0xba, 0xaf, 0xd8, 0x6d, ++ 0x4a, 0x9e, 0xc1, 0x87, 0x63, 0x57, 0x52, 0xbb, 0xf8, 0x52, 0x05, 0xff, ++ 0x5b, 0x93, 0xd7, 0xc5, 0x87, 0xf2, 0x27, 0x9e, 0x37, 0xbb, 0x87, 0xf1, ++ 0xef, 0xb7, 0x24, 0x75, 0xf1, 0x63, 0xc5, 0xee, 0xfd, 0x66, 0x36, 0xac, ++ 0x3b, 0xfd, 0x26, 0x37, 0xec, 0x37, 0xb7, 0xda, 0xa3, 0xf0, 0xa5, 0xe1, ++ 0xf8, 0x34, 0x5c, 0x67, 0xd7, 0x3f, 0xf2, 0x57, 0x33, 0xfa, 0x13, 0x3f, ++ 0xd8, 0xa7, 0xb0, 0xb4, 0xac, 0xee, 0xed, 0xcb, 0xb6, 0x3d, 0x4f, 0xeb, ++ 0x1d, 0xd2, 0x89, 0xf8, 0x28, 0xf8, 0x14, 0xe6, 0x5b, 0x37, 0x7e, 0x85, ++ 0x66, 0x3e, 0x33, 0x9a, 0xea, 0xb9, 0x50, 0x0f, 0xc6, 0xe2, 0xd7, 0x32, ++ 0xa1, 0x77, 0x41, 0x9e, 0x1f, 0x7f, 0x06, 0xef, 0xff, 0xbc, 0x69, 0xf1, ++ 0xe0, 0xf8, 0xcb, 0x1e, 0xbf, 0xc9, 0x89, 0xe3, 0x78, 0x5f, 0xad, 0xe6, ++ 0x72, 0xfd, 0xcb, 0xdb, 0x52, 0x71, 0x7e, 0x97, 0x99, 0x02, 0xa9, 0x2e, ++ 0x4a, 0xf9, 0xf7, 0xb2, 0x07, 0x7f, 0x44, 0xf2, 0xb6, 0xec, 0xc8, 0x8f, ++ 0x52, 0xc9, 0x5e, 0x60, 0xde, 0x0c, 0x03, 0xe9, 0xe2, 0x40, 0x06, 0x8e, ++ 0x6f, 0xe9, 0xd6, 0x6b, 0x69, 0x7c, 0xa5, 0xcc, 0x47, 0x72, 0x57, 0xf6, ++ 0x4b, 0x63, 0x11, 0xde, 0x47, 0xfc, 0x54, 0x65, 0x85, 0xbb, 0xa3, 0xcc, ++ 0x8b, 0x38, 0xb3, 0x42, 0xf8, 0xbc, 0xbf, 0x1d, 0x0c, 0x19, 0x18, 0xdf, ++ 0xfb, 0xb8, 0xbf, 0x44, 0x7d, 0xf6, 0x47, 0x23, 0xdd, 0x8b, 0x62, 0xec, ++ 0x87, 0x74, 0x6f, 0xec, 0x47, 0x62, 0xac, 0xb0, 0xf2, 0x51, 0xfe, 0x53, ++ 0x2b, 0xe7, 0xd3, 0x71, 0xa1, 0x27, 0x71, 0x22, 0x4b, 0xf2, 0xba, 0x63, ++ 0x63, 0x0b, 0xf2, 0xe7, 0x4c, 0x7f, 0x6f, 0x1a, 0x9e, 0x73, 0x00, 0x1d, ++ 0x02, 0x82, 0x5e, 0xca, 0x37, 0x00, 0xd7, 0x78, 0x64, 0x6a, 0x1a, 0xe7, ++ 0x0f, 0x73, 0xab, 0xf9, 0xa2, 0x1d, 0xe8, 0xf7, 0xc9, 0xf8, 0x1d, 0xeb, ++ 0xb7, 0x98, 0xbc, 0xb6, 0xe1, 0x52, 0x3b, 0xa1, 0x0f, 0x79, 0xff, 0xab, ++ 0x45, 0xff, 0x80, 0x77, 0x1c, 0xae, 0x57, 0xef, 0xa7, 0x46, 0xb7, 0xf7, ++ 0xc6, 0x88, 0xf1, 0xc1, 0x5f, 0x0b, 0x8b, 0x90, 0xaf, 0x88, 0xf9, 0xcd, ++ 0xe7, 0xfb, 0x8e, 0x4d, 0x7c, 0x7e, 0x6b, 0xf3, 0x3d, 0x58, 0x5c, 0x88, ++ 0xe5, 0x9f, 0xbc, 0xca, 0xe7, 0x0f, 0xb6, 0xc3, 0xf5, 0x01, 0xf0, 0x0a, ++ 0xa5, 0x51, 0xf9, 0xfe, 0xd9, 0x0a, 0xe9, 0x03, 0xd8, 0x57, 0x47, 0x9b, ++ 0xd7, 0x3b, 0x4c, 0x62, 0x5e, 0xcb, 0xe5, 0x60, 0x29, 0xd2, 0x7a, 0x0f, ++ 0x78, 0xab, 0x4a, 0x42, 0xa4, 0x9c, 0x00, 0xfc, 0x24, 0xa2, 0x3f, 0xed, ++ 0x83, 0x4b, 0xb7, 0x40, 0xbb, 0x08, 0xfb, 0xab, 0x0a, 0xfb, 0xa3, 0x7a, ++ 0xe6, 0xae, 0xef, 0x11, 0xeb, 0xc3, 0x32, 0xa1, 0x07, 0x4c, 0x66, 0x98, ++ 0xff, 0x17, 0x77, 0xcd, 0x7f, 0xb6, 0x95, 0xcf, 0xfb, 0x9e, 0xec, 0xc9, ++ 0x95, 0xa6, 0xe0, 0xc3, 0x0f, 0xe0, 0x7c, 0x7d, 0xc3, 0xe2, 0x09, 0xb8, ++ 0x71, 0xbe, 0x9a, 0x8a, 0x70, 0xdc, 0x1f, 0xee, 0x3a, 0xf0, 0xda, 0x75, ++ 0x20, 0xd7, 0x1f, 0x36, 0x68, 0xf3, 0x54, 0xd6, 0x9f, 0xfa, 0x79, 0x5a, ++ 0xb6, 0x67, 0x0c, 0x8b, 0x36, 0x4f, 0x3f, 0xb4, 0xc3, 0xfe, 0x2a, 0xda, ++ 0x3c, 0x85, 0xef, 0x51, 0xe7, 0xa9, 0xbd, 0x95, 0xe4, 0xf8, 0xfb, 0xd6, ++ 0x9f, 0x1a, 0xdd, 0x86, 0x9a, 0x65, 0xbd, 0x89, 0x7a, 0xf0, 0x19, 0x77, ++ 0x6c, 0xfa, 0xe9, 0xf5, 0xe0, 0xef, 0x4d, 0x6e, 0xa2, 0xa3, 0x5e, 0x0f, ++ 0xc2, 0xdf, 0xab, 0x2c, 0xbf, 0xbb, 0xdc, 0x69, 0xf2, 0xa6, 0xc9, 0x59, ++ 0xf9, 0x6f, 0x2a, 0x2e, 0x40, 0x7d, 0x13, 0x96, 0x47, 0x4d, 0xde, 0xc2, ++ 0xf2, 0xa8, 0xc9, 0x9b, 0x7e, 0x9c, 0x32, 0xdd, 0xf4, 0xe5, 0x7f, 0x15, ++ 0xfa, 0xe6, 0x7a, 0x6b, 0xe1, 0x35, 0x68, 0x17, 0x5b, 0x3b, 0x18, 0xed, ++ 0x57, 0x0a, 0x66, 0x1b, 0x83, 0xb8, 0x4f, 0xb6, 0x7e, 0xc2, 0x68, 0xbe, ++ 0x4f, 0xba, 0x21, 0x9e, 0xf2, 0x73, 0x8d, 0xad, 0x4f, 0xa0, 0xcd, 0xf7, ++ 0x56, 0xc5, 0xdc, 0x61, 0xb8, 0x8e, 0x5f, 0xcf, 0x02, 0x26, 0x7e, 0x6e, ++ 0x5e, 0x6b, 0x22, 0x3b, 0xf5, 0xab, 0x6f, 0xbe, 0x99, 0x08, 0xe3, 0xb9, ++ 0x4e, 0xd0, 0xf5, 0x7a, 0x20, 0xf3, 0x55, 0xc0, 0x87, 0x12, 0x55, 0x09, ++ 0xc5, 0x01, 0x9e, 0xf3, 0x54, 0x16, 0x48, 0x48, 0x42, 0x7f, 0xb1, 0xc2, ++ 0x4e, 0x44, 0xe0, 0x71, 0x7d, 0x99, 0x9c, 0xc7, 0xbf, 0xcb, 0x52, 0xbb, ++ 0xe0, 0xf4, 0x54, 0xff, 0xdb, 0xda, 0xd5, 0xdf, 0x35, 0x3d, 0xe2, 0xe7, ++ 0x67, 0x57, 0x7f, 0xc2, 0x94, 0xf6, 0x17, 0x60, 0x38, 0x47, 0xc8, 0x51, ++ 0x71, 0x33, 0x3f, 0xa7, 0xa8, 0x1a, 0xad, 0x04, 0xb3, 0x69, 0xfe, 0xb5, ++ 0xaa, 0x45, 0x11, 0xfb, 0x84, 0xc7, 0xcc, 0xdc, 0xce, 0x38, 0x32, 0xe5, ++ 0x9a, 0x31, 0x48, 0xbf, 0x82, 0xb9, 0xc3, 0x12, 0x48, 0xbe, 0x6b, 0x87, ++ 0xd0, 0x3e, 0xb0, 0x4a, 0xe8, 0xad, 0xce, 0x80, 0x3b, 0x01, 0xf5, 0x79, ++ 0x67, 0x73, 0x0e, 0xed, 0xfb, 0x3a, 0x0f, 0x2d, 0x76, 0xf8, 0xa2, 0xe8, ++ 0xaf, 0x03, 0x42, 0xce, 0x9e, 0x17, 0xe7, 0x2c, 0xed, 0x76, 0xa5, 0xd6, ++ 0x08, 0xf2, 0xde, 0xce, 0x3a, 0xc8, 0x6e, 0x09, 0xd8, 0x6d, 0x51, 0xfd, ++ 0x6e, 0x75, 0x66, 0x83, 0xb0, 0x77, 0x04, 0xdf, 0xe0, 0xcf, 0x08, 0xfd, ++ 0x97, 0x08, 0x39, 0x9c, 0x07, 0x4d, 0x13, 0xf2, 0x22, 0xf8, 0x36, 0xfb, ++ 0xaa, 0x0f, 0x54, 0x67, 0x77, 0x3e, 0xe0, 0xdf, 0x89, 0x88, 0x7d, 0xc3, ++ 0x3f, 0x4a, 0x5f, 0x94, 0x6b, 0xa4, 0xef, 0x01, 0x5b, 0xeb, 0xb4, 0xa2, ++ 0x28, 0xfe, 0x99, 0x47, 0x85, 0xbe, 0xbe, 0xec, 0xd9, 0x2f, 0xcc, 0xb8, ++ 0xce, 0x4d, 0x69, 0x2e, 0x50, 0x91, 0x8e, 0x53, 0xec, 0x46, 0xc9, 0xdf, ++ 0xb1, 0x5d, 0x9b, 0xaf, 0x43, 0xd9, 0x50, 0xc4, 0xeb, 0xb2, 0x67, 0x97, ++ 0xdf, 0x31, 0x06, 0xe4, 0xb8, 0xea, 0x90, 0xd1, 0x63, 0x83, 0xf1, 0x55, ++ 0x35, 0x7f, 0x64, 0xf6, 0x45, 0xd9, 0xbf, 0xe9, 0xe9, 0x89, 0xf0, 0xd1, ++ 0x7e, 0x6c, 0x35, 0x73, 0xfb, 0xf8, 0xa8, 0xa9, 0x68, 0x29, 0xd2, 0xf5, ++ 0xe8, 0xb5, 0xfc, 0x3c, 0xf7, 0x4f, 0x66, 0x4f, 0x45, 0x34, 0x3c, 0x67, ++ 0x5b, 0x39, 0x9e, 0xf3, 0x58, 0xd1, 0xa7, 0xa3, 0x95, 0x7f, 0x3d, 0xfa, ++ 0x16, 0xcc, 0x75, 0x84, 0x26, 0x01, 0x3d, 0x3a, 0xed, 0xfc, 0x7e, 0x72, ++ 0x77, 0xf9, 0xe3, 0xf3, 0xbe, 0xd3, 0xa5, 0x04, 0xd7, 0x2a, 0x28, 0x87, ++ 0x46, 0x9e, 0x4f, 0xe6, 0xf7, 0x7f, 0xa7, 0x31, 0xdf, 0x1d, 0x13, 0x15, ++ 0x9a, 0xef, 0x97, 0x47, 0xea, 0xaf, 0x82, 0xa6, 0xe2, 0xc7, 0xf0, 0x3e, ++ 0x4b, 0x65, 0xb3, 0xe2, 0x32, 0x40, 0x79, 0xa5, 0xda, 0x6a, 0x46, 0x39, ++ 0xae, 0x6a, 0xda, 0xad, 0xa2, 0x5d, 0xfe, 0x03, 0x37, 0x7f, 0x67, 0xc1, ++ 0xd4, 0xea, 0x61, 0xb3, 0x23, 0xfc, 0x5b, 0xad, 0x66, 0xee, 0x4f, 0x3a, ++ 0xf0, 0xb7, 0xeb, 0xe6, 0x23, 0x7d, 0x3f, 0x9e, 0x6d, 0x61, 0x88, 0x97, ++ 0x77, 0xe8, 0x47, 0x4e, 0x5c, 0xef, 0x3f, 0x6e, 0x1e, 0x45, 0xf3, 0x20, ++ 0xd6, 0xb8, 0xfe, 0xe0, 0xf7, 0x5c, 0x33, 0x05, 0xfd, 0xf1, 0x66, 0xae, ++ 0xcf, 0xf4, 0xf2, 0x30, 0x2d, 0x39, 0x5e, 0xca, 0x5f, 0x3b, 0x99, 0xf5, ++ 0xc3, 0x73, 0xde, 0xcb, 0x2c, 0xad, 0x37, 0x79, 0xa2, 0xf0, 0x6f, 0x9d, ++ 0x85, 0xcf, 0xd3, 0x5e, 0xeb, 0x37, 0xeb, 0xff, 0x30, 0xfd, 0x36, 0x11, ++ 0xf4, 0x1b, 0x97, 0x6b, 0x53, 0xa4, 0x7e, 0x9b, 0x6e, 0xe1, 0x72, 0x1f, ++ 0xa1, 0xdf, 0xd2, 0xa2, 0xe9, 0xb7, 0x55, 0x6b, 0xdd, 0x69, 0x28, 0x17, ++ 0xab, 0xf6, 0xe6, 0xa4, 0x21, 0x5f, 0x57, 0x1d, 0x5e, 0x9a, 0x12, 0x4d, ++ 0xbf, 0xbd, 0x20, 0xf6, 0xb5, 0x87, 0xc5, 0x3d, 0xe9, 0xf6, 0x7e, 0xa0, ++ 0xdf, 0x46, 0x44, 0xe8, 0xb7, 0x7e, 0xa0, 0xdf, 0xa2, 0xf8, 0xc1, 0x47, ++ 0x5b, 0x34, 0xbb, 0xb3, 0x07, 0xfd, 0x66, 0xfd, 0xef, 0x99, 0x7f, 0x2f, ++ 0xa0, 0x7e, 0x8b, 0x32, 0xde, 0x2b, 0x84, 0xdc, 0x69, 0xfa, 0xad, 0xb0, ++ 0x79, 0x2d, 0xe9, 0xb7, 0xc2, 0x7e, 0x46, 0xe9, 0x3e, 0xd2, 0x65, 0x16, ++ 0x61, 0xc7, 0xc5, 0xd4, 0x6f, 0x0b, 0xef, 0xb9, 0x96, 0xf2, 0x26, 0x4f, ++ 0x7c, 0x14, 0xf9, 0x41, 0xba, 0xa2, 0x7e, 0x3b, 0x2c, 0xf4, 0x1c, 0xf6, ++ 0x83, 0x7a, 0xee, 0x67, 0x96, 0x6f, 0xa7, 0xe7, 0xe6, 0x59, 0x39, 0xbe, ++ 0x3d, 0xea, 0xb9, 0xff, 0x26, 0x3a, 0x6b, 0x7a, 0x6e, 0x55, 0x7f, 0x85, ++ 0xec, 0x97, 0xee, 0x72, 0xc8, 0xf5, 0xdc, 0xaa, 0x2c, 0xae, 0xe7, 0x56, ++ 0xed, 0xe5, 0x7a, 0x6e, 0xd5, 0x20, 0xae, 0xe7, 0xf4, 0xfa, 0x6d, 0x52, ++ 0x37, 0xfd, 0xc6, 0xdb, 0x57, 0xe6, 0x42, 0x7b, 0xda, 0x27, 0x66, 0xdd, ++ 0x77, 0x03, 0xde, 0xe7, 0x2b, 0x31, 0x79, 0xac, 0x50, 0x7f, 0x86, 0x5b, ++ 0x7b, 0x5f, 0x50, 0x3d, 0x26, 0x52, 0xdf, 0xfd, 0xcc, 0x12, 0x43, 0xdf, ++ 0x79, 0x40, 0xdf, 0xd9, 0x7b, 0xd6, 0x77, 0xaf, 0xa0, 0xbe, 0x53, 0x49, ++ 0x8f, 0x0d, 0xc4, 0x79, 0xa4, 0x97, 0x8f, 0xe9, 0x03, 0xe3, 0xa5, 0xfb, ++ 0x6a, 0x47, 0xbf, 0x38, 0xf5, 0x9b, 0xdf, 0xe2, 0x7c, 0xf9, 0x83, 0x91, ++ 0xee, 0x03, 0xbd, 0x6e, 0xe0, 0xfb, 0xa1, 0x7d, 0x5f, 0x9c, 0x1a, 0x85, ++ 0xf3, 0xee, 0x65, 0xc4, 0x07, 0xe6, 0xcb, 0x4e, 0x21, 0x7f, 0x6d, 0xfe, ++ 0xb1, 0xa4, 0x4f, 0x27, 0x0f, 0xe5, 0xf3, 0xbd, 0xe2, 0x50, 0x1c, 0xad, ++ 0x13, 0x95, 0x8d, 0x0a, 0x1f, 0xef, 0x2d, 0x4a, 0xd0, 0x8d, 0xeb, 0xc0, ++ 0xdf, 0x3e, 0xa7, 0x7d, 0xf2, 0xfc, 0xbd, 0x7c, 0x9f, 0x3c, 0xd7, 0xc2, ++ 0xe9, 0xc1, 0x7e, 0x6c, 0xe4, 0xef, 0x22, 0x80, 0x04, 0x0b, 0x23, 0xe4, ++ 0xa1, 0xe4, 0xf3, 0x72, 0xf2, 0xf3, 0x95, 0xa8, 0xcc, 0x8a, 0xf6, 0xeb, ++ 0x82, 0x43, 0xd3, 0x3f, 0x40, 0xbb, 0x75, 0xc1, 0xe7, 0x35, 0x64, 0xef, ++ 0x2e, 0xc0, 0xef, 0x78, 0xbf, 0x62, 0x77, 0xeb, 0x86, 0x4c, 0xe8, 0x77, ++ 0xfe, 0x72, 0x85, 0xf6, 0x1b, 0x4c, 0xdc, 0x87, 0xd0, 0xee, 0x4b, 0x5c, ++ 0xdf, 0xbc, 0x9f, 0xee, 0xaf, 0xe8, 0xef, 0x41, 0x68, 0xfa, 0x7c, 0x7e, ++ 0xb5, 0xfc, 0x7d, 0x81, 0xce, 0xae, 0x3f, 0x20, 0xc6, 0x09, 0xf6, 0x2c, ++ 0xd1, 0x85, 0xbd, 0x62, 0x8c, 0xea, 0x9f, 0x3b, 0xa0, 0xa7, 0x87, 0x87, ++ 0x8f, 0xbf, 0x62, 0x35, 0xb7, 0x8f, 0xc3, 0xf4, 0x00, 0xfa, 0xb8, 0x95, ++ 0xee, 0xf4, 0x00, 0x8e, 0xce, 0x58, 0x98, 0xda, 0x35, 0xfe, 0xf9, 0x4f, ++ 0xc2, 0xb8, 0x92, 0xbb, 0xc6, 0xa5, 0xd1, 0x43, 0x3f, 0x3e, 0x6d, 0x7f, ++ 0xb2, 0x40, 0xcc, 0x8d, 0x58, 0xe3, 0xd5, 0xe8, 0xd7, 0x6d, 0xbc, 0x1a, ++ 0x3d, 0x75, 0xe3, 0x7e, 0xde, 0x22, 0xec, 0xa2, 0x8b, 0xd9, 0x30, 0x9c, ++ 0x67, 0xaf, 0x1b, 0x7c, 0x77, 0x8c, 0x41, 0xb9, 0xf8, 0x3d, 0x8c, 0x1f, ++ 0xf0, 0x99, 0x33, 0x6f, 0x50, 0x5a, 0xa4, 0x1e, 0x7e, 0x51, 0xe8, 0xf3, ++ 0xab, 0x7c, 0xc7, 0xa7, 0xa4, 0xba, 0x91, 0x5e, 0xfc, 0xfd, 0xdd, 0x75, ++ 0x65, 0xbb, 0x9f, 0x4f, 0x85, 0x71, 0x5c, 0xed, 0xcd, 0xca, 0xc3, 0xab, ++ 0x08, 0xd7, 0xfe, 0xcd, 0xec, 0x43, 0x3f, 0xc2, 0x01, 0x5b, 0x07, 0xe9, ++ 0x35, 0x4d, 0xae, 0x2e, 0xb4, 0x72, 0x39, 0xff, 0xbb, 0x80, 0x73, 0xb4, ++ 0xaf, 0x6b, 0x0a, 0xad, 0x1f, 0x4d, 0x8a, 0x8b, 0xe6, 0x4b, 0x48, 0xa7, ++ 0xb7, 0xc4, 0xbd, 0xb0, 0x2a, 0xa0, 0x27, 0xce, 0xc7, 0xaa, 0x26, 0xb1, ++ 0xde, 0x80, 0xbc, 0xe1, 0x7c, 0x9b, 0xa6, 0xad, 0x3f, 0x48, 0x7f, 0xf8, ++ 0xcf, 0xab, 0x9a, 0x39, 0xfd, 0xab, 0xaa, 0x15, 0xa2, 0xff, 0x4c, 0xd6, ++ 0x71, 0x10, 0xe9, 0x5b, 0x99, 0xac, 0x78, 0x42, 0x00, 0x6a, 0x5a, 0xd3, ++ 0xee, 0xdb, 0xf0, 0x1e, 0xd5, 0x0b, 0x36, 0xf8, 0x8e, 0xf3, 0xb6, 0x4c, ++ 0xf1, 0x6c, 0xe7, 0xe4, 0xb0, 0x67, 0xa4, 0x46, 0x95, 0x4b, 0x35, 0x9a, ++ 0x5c, 0xb2, 0xea, 0x21, 0xe4, 0x57, 0xd0, 0xd6, 0xc1, 0x05, 0x58, 0x2f, ++ 0x09, 0xdf, 0x8b, 0xbc, 0x9e, 0x82, 0xf6, 0x89, 0xde, 0xde, 0xb8, 0xcc, ++ 0xd2, 0x72, 0x14, 0xf1, 0xb8, 0xec, 0xc7, 0x26, 0xb6, 0x8d, 0x75, 0xb7, ++ 0x3f, 0x34, 0x7e, 0xe7, 0xc2, 0xbf, 0x6f, 0xa2, 0xdd, 0xe7, 0xe9, 0x41, ++ 0x7e, 0x07, 0x09, 0xfb, 0xf2, 0x05, 0xa4, 0xb7, 0x1d, 0xe9, 0xda, 0x61, ++ 0x46, 0xb9, 0xaf, 0x0a, 0xf1, 0x75, 0x43, 0x2b, 0xaf, 0x52, 0xdd, 0x53, ++ 0x88, 0x3e, 0x1a, 0xbd, 0x9b, 0x60, 0x5d, 0x18, 0xcd, 0xe9, 0x8d, 0xef, ++ 0xbe, 0xf4, 0xf4, 0xbc, 0x5a, 0xcb, 0xa3, 0x3c, 0x63, 0xfd, 0x66, 0xc5, ++ 0x84, 0xed, 0xaf, 0x04, 0x3e, 0xf4, 0x81, 0xa2, 0xc9, 0x86, 0x2f, 0x0e, ++ 0x6a, 0xf2, 0x8b, 0xef, 0xc4, 0xf4, 0x74, 0xc1, 0xfd, 0x7f, 0x46, 0xc4, ++ 0x7c, 0x47, 0xbd, 0x14, 0x79, 0xee, 0x58, 0xd9, 0x74, 0x84, 0xe8, 0x32, ++ 0x7d, 0x35, 0x98, 0x55, 0x11, 0x74, 0x47, 0x7d, 0x75, 0x3e, 0xfa, 0x74, ++ 0x9b, 0x0f, 0x4d, 0xfb, 0xa3, 0xde, 0x83, 0xfa, 0xb6, 0xf3, 0xe1, 0x42, ++ 0xab, 0x3c, 0x1f, 0xf6, 0xd9, 0x3a, 0x5e, 0x1c, 0x81, 0xfe, 0xad, 0xbd, ++ 0x0a, 0xe9, 0x03, 0xd6, 0x9c, 0x28, 0xed, 0xef, 0xaf, 0xb0, 0xf2, 0x7d, ++ 0xd3, 0x01, 0x9b, 0x8f, 0xe4, 0xb6, 0xe3, 0xb0, 0x89, 0xee, 0x7b, 0xeb, ++ 0xf5, 0xc6, 0x58, 0x41, 0x7f, 0xdc, 0x4f, 0x44, 0xbe, 0x83, 0x9b, 0x8c, ++ 0x03, 0xc1, 0xf3, 0x5d, 0x97, 0x8d, 0xbd, 0xab, 0xe1, 0x91, 0xcd, 0xe5, ++ 0x27, 0x52, 0x5f, 0xbf, 0x60, 0xf3, 0x11, 0x9f, 0x62, 0xc1, 0x9f, 0x26, ++ 0xe0, 0xc7, 0xb2, 0x97, 0xc2, 0xf8, 0x62, 0x7f, 0x78, 0x9e, 0xe2, 0x96, ++ 0xfb, 0xd3, 0xaf, 0x17, 0x9a, 0x9f, 0xa7, 0xa7, 0x71, 0x5d, 0x23, 0xd6, ++ 0xfb, 0xef, 0x3a, 0xae, 0xf0, 0xf9, 0x24, 0x6b, 0x31, 0x33, 0xee, 0xcf, ++ 0xdf, 0x6d, 0x8e, 0x38, 0x67, 0x9a, 0x23, 0xfc, 0xfc, 0x9a, 0x1f, 0x2c, ++ 0xa2, 0xde, 0x4c, 0xcb, 0x98, 0xd8, 0xf5, 0xd0, 0xdf, 0x12, 0x82, 0x71, ++ 0xbf, 0xb0, 0xeb, 0x21, 0xf2, 0xeb, 0x9e, 0x7b, 0xf4, 0xf8, 0x4c, 0x94, ++ 0xdb, 0x15, 0xbf, 0x33, 0x32, 0x2b, 0xf0, 0xb9, 0x6d, 0x97, 0x83, 0x85, ++ 0xf8, 0x3d, 0x0a, 0x33, 0xae, 0xab, 0xe5, 0x8d, 0xc6, 0xa8, 0xe7, 0x22, ++ 0x8c, 0xad, 0x27, 0xfc, 0x56, 0xfc, 0xd6, 0x41, 0x7a, 0xa5, 0x7c, 0x8f, ++ 0x25, 0x38, 0x03, 0xda, 0x97, 0x3f, 0xf5, 0xee, 0x70, 0xf4, 0x4f, 0xb5, ++ 0xad, 0xe3, 0xfa, 0x25, 0xf0, 0xa8, 0x90, 0x8f, 0x40, 0xeb, 0x70, 0x3c, ++ 0x2f, 0x2f, 0x57, 0xf9, 0x79, 0xb1, 0x1e, 0xde, 0x8f, 0x85, 0xbc, 0x9c, ++ 0x7d, 0x3a, 0xbe, 0x04, 0xf5, 0xa3, 0x52, 0xcf, 0xdf, 0x75, 0x96, 0x37, ++ 0xcc, 0x35, 0x59, 0x22, 0xf6, 0xe5, 0x95, 0x78, 0xe0, 0xc6, 0xeb, 0xd1, ++ 0x3d, 0xe4, 0xc0, 0x23, 0x0a, 0xf9, 0xc1, 0xbb, 0xe3, 0xb7, 0x96, 0xd7, ++ 0x7b, 0x84, 0xeb, 0xbd, 0xf2, 0x26, 0x53, 0x10, 0xdf, 0x87, 0x96, 0xd7, ++ 0x6f, 0xa3, 0xfd, 0x6c, 0x55, 0xfd, 0x47, 0x66, 0xb4, 0xe3, 0x26, 0xff, ++ 0xf6, 0x31, 0xb2, 0x23, 0xaa, 0x9a, 0x8c, 0xb2, 0x9f, 0xb0, 0xde, 0x18, ++ 0xb2, 0x90, 0x1f, 0xd3, 0x78, 0x1c, 0x53, 0xbd, 0xbf, 0xae, 0xb2, 0xb1, ++ 0x82, 0xe6, 0x63, 0x65, 0x83, 0xf0, 0x87, 0xe9, 0xfc, 0x45, 0x2b, 0x7e, ++ 0xbb, 0xf7, 0xa9, 0x00, 0x90, 0x66, 0xc5, 0x13, 0xbf, 0x76, 0xa2, 0x9e, ++ 0x39, 0xd3, 0xb2, 0xd3, 0x49, 0x7e, 0xb8, 0x7a, 0xee, 0x67, 0x53, 0xed, ++ 0x6a, 0x74, 0x3f, 0x5c, 0x4f, 0xfe, 0xb7, 0x86, 0x4d, 0x51, 0xfd, 0x6f, ++ 0x67, 0xf0, 0x3f, 0x60, 0xfe, 0x6d, 0xb5, 0xca, 0xfe, 0x37, 0x56, 0xdf, ++ 0xa7, 0x57, 0xe7, 0xe0, 0x2b, 0x1e, 0xfb, 0xf4, 0x41, 0x3c, 0x17, 0x3a, ++ 0xbb, 0xe7, 0xc3, 0x07, 0x11, 0xef, 0x95, 0x5f, 0x7f, 0xfc, 0xe0, 0x4f, ++ 0xd1, 0x3e, 0xd9, 0x67, 0x73, 0xe1, 0x7a, 0x57, 0xf5, 0xe8, 0x51, 0xf2, ++ 0xab, 0x6b, 0xed, 0x9e, 0x12, 0xf3, 0xaa, 0xed, 0x91, 0x5f, 0x3f, 0xfc, ++ 0x00, 0xcc, 0xbf, 0xb6, 0x37, 0x2c, 0x74, 0xff, 0xaa, 0x6d, 0xef, 0xfb, ++ 0x03, 0xdc, 0x30, 0xce, 0xb6, 0xdd, 0x5f, 0xa4, 0xa2, 0xff, 0x72, 0xf5, ++ 0xde, 0xa9, 0xb4, 0x6f, 0x59, 0xfd, 0xe4, 0xe4, 0xb4, 0xf3, 0xdd, 0x23, ++ 0x41, 0xb9, 0x0c, 0xf6, 0xe2, 0x3c, 0x44, 0xcf, 0x87, 0x03, 0x8d, 0x46, ++ 0x86, 0xef, 0x20, 0xcf, 0x1d, 0xb3, 0x90, 0x9d, 0x11, 0xf6, 0xa3, 0x36, ++ 0x54, 0x70, 0xbf, 0xb4, 0x5b, 0xf8, 0x4f, 0x77, 0x45, 0x3f, 0x77, 0xd2, ++ 0xfc, 0x7e, 0x95, 0x8d, 0xd7, 0x5c, 0x7d, 0x29, 0xae, 0x7b, 0x8d, 0x26, ++ 0x8f, 0x9b, 0xbe, 0x0b, 0x3f, 0x60, 0x4f, 0x7e, 0xd3, 0x57, 0x81, 0x9f, ++ 0x23, 0x7a, 0xc1, 0xb7, 0x5d, 0xc2, 0x2f, 0xae, 0xe3, 0xdb, 0x39, 0xfc, ++ 0x0f, 0xe0, 0xcf, 0x9f, 0xac, 0xb2, 0xbf, 0xf9, 0xd3, 0xc6, 0xa5, 0xbf, ++ 0x7a, 0x00, 0xcb, 0x1a, 0xfb, 0xc4, 0xf4, 0x9b, 0x86, 0x7a, 0x41, 0x2f, ++ 0xed, 0x5c, 0x6b, 0x9b, 0xd5, 0xfb, 0x8e, 0x15, 0xe7, 0xc3, 0x9e, 0xdf, ++ 0x90, 0x7f, 0x1a, 0xf9, 0x05, 0x36, 0x37, 0x6b, 0x7b, 0xec, 0xd3, 0x01, ++ 0xe8, 0x6f, 0x38, 0x6d, 0xea, 0xb8, 0x91, 0xee, 0x5f, 0xec, 0xb5, 0xd0, ++ 0x3d, 0xa1, 0xf2, 0xbd, 0xaf, 0xd3, 0xfc, 0x68, 0x7b, 0xf2, 0x08, 0x9d, ++ 0x17, 0x31, 0x71, 0xae, 0xd4, 0xc6, 0xc2, 0x7f, 0xfc, 0x1c, 0x40, 0xec, ++ 0x65, 0xaa, 0x76, 0x38, 0xb8, 0xbf, 0x55, 0xd0, 0x1d, 0xfd, 0xb1, 0x6e, ++ 0x27, 0x7d, 0x17, 0x7e, 0x57, 0x2e, 0xb7, 0x9a, 0x3f, 0x36, 0x96, 0x1f, ++ 0xb6, 0x8f, 0x4d, 0xdc, 0x03, 0x17, 0xe7, 0x6c, 0x15, 0x3b, 0xde, 0x32, ++ 0x33, 0x9d, 0x5f, 0x5b, 0x19, 0x8b, 0x7c, 0x3a, 0x2e, 0x9d, 0x0b, 0x6a, ++ 0xe3, 0xd6, 0xc3, 0x73, 0x21, 0x1d, 0x2e, 0x89, 0x3c, 0x4f, 0x88, 0xe5, ++ 0xe7, 0x16, 0x7a, 0x34, 0xcc, 0x27, 0x7e, 0x8e, 0xd0, 0xb6, 0x4d, 0x9c, ++ 0x2f, 0x84, 0xcf, 0x0d, 0x18, 0xeb, 0x97, 0x87, 0xf7, 0xdf, 0xf9, 0x79, ++ 0x77, 0x55, 0x50, 0x79, 0x9d, 0x45, 0x99, 0x8f, 0xda, 0x79, 0x82, 0xd3, ++ 0xa6, 0x9b, 0x8f, 0xc1, 0xde, 0x9d, 0x23, 0xf4, 0x8c, 0xef, 0x77, 0xa3, ++ 0x87, 0x62, 0xe3, 0xfb, 0x56, 0x8d, 0x2e, 0x67, 0xbf, 0x8a, 0xae, 0x8f, ++ 0x87, 0xd8, 0x14, 0xf1, 0xfe, 0xc0, 0x97, 0x6b, 0x8b, 0x58, 0x77, 0x16, ++ 0x88, 0xf5, 0xa4, 0x12, 0xe8, 0xc5, 0xdf, 0x93, 0x71, 0x7c, 0xcf, 0x8a, ++ 0xfd, 0xdd, 0xd9, 0x47, 0x8d, 0x41, 0xdc, 0x07, 0x6f, 0x68, 0x38, 0x40, ++ 0x7a, 0x55, 0x3f, 0xaf, 0x2b, 0x59, 0xf4, 0xf8, 0x21, 0xe3, 0x6d, 0x5c, ++ 0x9f, 0x54, 0x36, 0xed, 0x1f, 0x8e, 0xfa, 0xe7, 0xec, 0xb3, 0x4f, 0x93, ++ 0xdc, 0x55, 0xee, 0x3a, 0x6e, 0x0e, 0x00, 0x9c, 0x83, 0xf5, 0x4f, 0x98, ++ 0x5b, 0x87, 0x76, 0xc9, 0x39, 0xea, 0xeb, 0x60, 0x84, 0xbe, 0x3e, 0xfb, ++ 0xf8, 0xfe, 0xe1, 0xfc, 0x9c, 0x83, 0xef, 0x23, 0xf5, 0xf0, 0xaf, 0x10, ++ 0xf0, 0xab, 0x9a, 0x65, 0xf8, 0x55, 0xbb, 0x3e, 0x92, 0xe0, 0xaf, 0x08, ++ 0x34, 0x98, 0x5d, 0xf6, 0x9e, 0xfb, 0x39, 0xa3, 0x7a, 0xe7, 0xe2, 0x78, ++ 0xcf, 0xb4, 0x98, 0x28, 0x2e, 0xca, 0x99, 0x06, 0x63, 0x61, 0xb4, 0x78, ++ 0x25, 0x43, 0x31, 0x90, 0x54, 0x4a, 0x17, 0x9d, 0x36, 0x38, 0xf8, 0xfb, ++ 0x38, 0x63, 0x92, 0x99, 0xec, 0xc8, 0xd5, 0x8e, 0xb1, 0xc7, 0x12, 0x92, ++ 0x31, 0x35, 0xbb, 0x71, 0x1f, 0xbd, 0x7e, 0x2d, 0xbf, 0x0f, 0xb9, 0xfe, ++ 0x67, 0x9e, 0x74, 0xe4, 0xcb, 0xfa, 0xc4, 0x39, 0x74, 0x0e, 0x54, 0xab, ++ 0xa3, 0xa3, 0x2b, 0xd9, 0x55, 0x80, 0xfb, 0x6b, 0xd7, 0x94, 0xa2, 0xd1, ++ 0x28, 0x56, 0x7a, 0x3d, 0x90, 0xe8, 0x35, 0x48, 0x78, 0xaf, 0x76, 0x14, ++ 0xa6, 0xe1, 0x7b, 0xee, 0x5b, 0x85, 0x3d, 0xc2, 0x54, 0x0f, 0xbd, 0xdf, ++ 0x33, 0x3a, 0xa7, 0x15, 0xe2, 0x38, 0x8c, 0x2e, 0x83, 0xcb, 0x16, 0x75, ++ 0x1d, 0xe5, 0xf0, 0x4c, 0xf6, 0x22, 0x8a, 0x17, 0x61, 0x72, 0xc9, 0xef, ++ 0xe9, 0xbe, 0xf7, 0xf8, 0x0f, 0xee, 0x7e, 0x72, 0xfc, 0x87, 0x40, 0xbf, ++ 0x7f, 0x34, 0xfe, 0x03, 0xa3, 0x38, 0x18, 0xff, 0xef, 0xe3, 0x3f, 0x04, ++ 0xb0, 0x9f, 0x7f, 0x81, 0xf8, 0x0f, 0x21, 0xf2, 0xdb, 0x68, 0xf1, 0x1f, ++ 0x92, 0xbf, 0xe7, 0xf8, 0x0f, 0x6b, 0x99, 0x1c, 0xff, 0x41, 0xf0, 0x33, ++ 0x1c, 0xff, 0x41, 0xf0, 0xf3, 0x7f, 0xe3, 0x3f, 0xfc, 0xff, 0x15, 0xff, ++ 0xc1, 0x18, 0xf7, 0xf7, 0x29, 0x18, 0x9f, 0x41, 0x8b, 0xff, 0x90, 0x12, ++ 0x67, 0x9e, 0x1a, 0x19, 0xff, 0xe1, 0xc2, 0xb8, 0x84, 0xa9, 0x91, 0xf1, ++ 0x1f, 0xc6, 0xc5, 0xa5, 0x4f, 0x8d, 0x8c, 0xff, 0xf0, 0x83, 0xb8, 0xac, ++ 0xa9, 0x91, 0xf1, 0x1f, 0xe6, 0xc7, 0x5d, 0x34, 0x35, 0x32, 0xfe, 0x43, ++ 0x55, 0xdc, 0xa8, 0xa9, 0x91, 0xf1, 0x1f, 0xd6, 0xc6, 0x4d, 0xa4, 0xbc, ++ 0x16, 0xff, 0xe1, 0xee, 0xb8, 0xa9, 0x53, 0xe5, 0xf8, 0x0f, 0x33, 0xa7, ++ 0x4e, 0x81, 0x7c, 0x5b, 0x9c, 0xef, 0xef, 0xb8, 0x5e, 0xc5, 0x8a, 0xff, ++ 0xf0, 0x1e, 0x4e, 0x96, 0x31, 0x3d, 0xc7, 0x7f, 0x00, 0x38, 0xe6, 0xb8, ++ 0x31, 0xb1, 0xe3, 0x3f, 0xe8, 0xe1, 0xc4, 0x8a, 0xff, 0x00, 0x70, 0x12, ++ 0x08, 0x4e, 0x8c, 0xf8, 0x0f, 0xdd, 0xf0, 0x89, 0x11, 0xff, 0x01, 0xe0, ++ 0xa4, 0x13, 0x9c, 0x18, 0xf1, 0x1f, 0xba, 0xe1, 0x13, 0x23, 0xfe, 0x03, ++ 0xc0, 0xc9, 0x22, 0x38, 0x31, 0xe2, 0x3f, 0xe8, 0xe1, 0xc4, 0x8a, 0xff, ++ 0x00, 0x70, 0x2e, 0x8a, 0x4b, 0x89, 0x1d, 0xff, 0x41, 0x0f, 0x27, 0x56, ++ 0xfc, 0x07, 0x80, 0x33, 0x8a, 0xf0, 0x89, 0x11, 0xff, 0xa1, 0x1b, 0x3e, ++ 0x31, 0xe2, 0x3f, 0x00, 0x9c, 0x89, 0x04, 0x27, 0x46, 0xfc, 0x87, 0x6e, ++ 0xf8, 0xc4, 0x88, 0xff, 0x00, 0x70, 0xa6, 0xd2, 0xb8, 0x62, 0xc4, 0x7f, ++ 0xd0, 0xc3, 0x89, 0x15, 0xff, 0x01, 0xe0, 0xcc, 0x24, 0x7c, 0x62, 0xc4, ++ 0x7f, 0xd0, 0xc3, 0x89, 0x15, 0xff, 0x01, 0xe0, 0xcc, 0x25, 0x7c, 0x62, ++ 0xc4, 0x7f, 0xe8, 0x86, 0x4f, 0x8c, 0xf8, 0x0f, 0x00, 0xc7, 0x47, 0xf8, ++ 0xc4, 0x88, 0xff, 0xd0, 0x0d, 0x9f, 0x18, 0xf1, 0x1f, 0x00, 0xce, 0x72, ++ 0x82, 0x13, 0x23, 0xfe, 0x83, 0x1e, 0x4e, 0xac, 0xf8, 0x0f, 0x00, 0x67, ++ 0x15, 0xc1, 0x89, 0x11, 0xff, 0x41, 0x0f, 0x27, 0x56, 0xfc, 0x07, 0x80, ++ 0xf3, 0x53, 0x82, 0x13, 0x23, 0xfe, 0x43, 0x37, 0x7c, 0x62, 0xc4, 0x7f, ++ 0x00, 0x38, 0xb7, 0x12, 0x9c, 0x18, 0xf1, 0x1f, 0xba, 0xe1, 0x13, 0x23, ++ 0xfe, 0x03, 0xc0, 0xb9, 0x83, 0xe0, 0xc4, 0x88, 0xff, 0xa0, 0x87, 0x13, ++ 0x2b, 0xfe, 0x03, 0xc0, 0xb9, 0x97, 0xe0, 0xc4, 0x88, 0xff, 0xa0, 0x87, ++ 0x13, 0x2b, 0xfe, 0x03, 0xc0, 0xf9, 0x15, 0xc1, 0x89, 0x11, 0xff, 0xa1, ++ 0x1b, 0x3e, 0x31, 0xe2, 0x3f, 0x00, 0x9c, 0x7a, 0x92, 0xc3, 0x18, 0xf1, ++ 0x1f, 0xba, 0xe1, 0xf3, 0x5d, 0xe3, 0x3f, 0xd8, 0x42, 0x03, 0x95, 0x1c, ++ 0x8a, 0xff, 0x40, 0x71, 0x22, 0xc3, 0xf1, 0x1f, 0x92, 0xbf, 0x75, 0xfc, ++ 0x87, 0x66, 0xc4, 0xf7, 0x7f, 0xe3, 0x3f, 0xfc, 0xcf, 0x8c, 0xff, 0x70, ++ 0xb3, 0xdd, 0xf7, 0x75, 0x1c, 0xf9, 0x41, 0xbf, 0x5b, 0xfc, 0x07, 0x5b, ++ 0xfc, 0xb7, 0x8b, 0xff, 0x70, 0xb3, 0xbd, 0x28, 0x3e, 0x1e, 0xf7, 0x97, ++ 0xdf, 0x32, 0xfe, 0x43, 0x6a, 0xfc, 0xb7, 0x8b, 0xff, 0x00, 0xfd, 0xa4, ++ 0xc7, 0x8f, 0x89, 0xdd, 0x4f, 0xac, 0xf8, 0x0f, 0x39, 0xba, 0x7e, 0x7a, ++ 0x8a, 0xff, 0x00, 0xfd, 0x0c, 0x3a, 0xef, 0x78, 0x62, 0xc4, 0x7f, 0xf0, ++ 0xe8, 0xe8, 0xf6, 0x7d, 0xc5, 0x7f, 0xf8, 0x22, 0xee, 0xfc, 0xf1, 0x1f, ++ 0xfe, 0xe5, 0xe2, 0x2c, 0xc0, 0x36, 0x05, 0xcf, 0x7f, 0x8a, 0x49, 0x14, ++ 0xd9, 0xbf, 0x4c, 0xdc, 0x85, 0x6b, 0xe3, 0xff, 0xc9, 0x71, 0x17, 0xc8, ++ 0x58, 0xf8, 0x57, 0x8a, 0xbb, 0xa0, 0xbd, 0xdf, 0x6f, 0x30, 0xe1, 0x7a, ++ 0xf5, 0xa6, 0xe0, 0xfb, 0x6b, 0x42, 0x2e, 0xde, 0x12, 0xf1, 0x17, 0x8e, ++ 0xc5, 0x8c, 0xbf, 0x10, 0xbc, 0x8a, 0xfc, 0xa2, 0xcb, 0xe5, 0xf8, 0x0b, ++ 0xd3, 0x05, 0x1f, 0xe7, 0xf9, 0x64, 0x79, 0x98, 0xce, 0xf8, 0x79, 0xc3, ++ 0xf4, 0x29, 0x59, 0x3c, 0x5e, 0x66, 0x99, 0x2e, 0xfe, 0x42, 0xae, 0x7c, ++ 0x7e, 0x3d, 0xc3, 0x77, 0x64, 0x0a, 0x80, 0x63, 0x57, 0x79, 0xe4, 0x71, ++ 0x1c, 0x11, 0xf2, 0x30, 0xb3, 0xe4, 0xa3, 0xe7, 0x90, 0x3d, 0x57, 0x8f, ++ 0x8d, 0x1e, 0x7f, 0x61, 0x96, 0xe0, 0x47, 0xb1, 0x8e, 0x2e, 0xd3, 0x05, ++ 0xdf, 0x8a, 0x45, 0x7a, 0x3d, 0x3e, 0x49, 0x01, 0x79, 0x9e, 0x51, 0x76, ++ 0x44, 0x45, 0xba, 0xce, 0x74, 0xb7, 0xaa, 0xe4, 0xd7, 0xfe, 0x81, 0xc6, ++ 0x3f, 0xb7, 0xc4, 0xbf, 0xd9, 0x02, 0xae, 0x1e, 0xdf, 0x59, 0x82, 0x7f, ++ 0xb3, 0xae, 0xe4, 0xfc, 0xd3, 0xe3, 0xfd, 0x2a, 0xf2, 0xcf, 0x09, 0x69, ++ 0xd9, 0x28, 0xe2, 0x9f, 0x1e, 0x6f, 0x3d, 0x9e, 0x7a, 0xfe, 0xb3, 0x48, ++ 0x7e, 0x47, 0xc4, 0xcd, 0x28, 0x60, 0x72, 0xdc, 0x85, 0xc9, 0x56, 0x39, ++ 0xee, 0xc2, 0x54, 0x97, 0x1c, 0x77, 0xe1, 0x8a, 0x74, 0x39, 0xee, 0xc2, ++ 0x95, 0x6e, 0x39, 0xee, 0xc2, 0x0f, 0x72, 0xe5, 0xb8, 0x0b, 0x57, 0x79, ++ 0xe4, 0xb8, 0x0b, 0x57, 0x8f, 0x95, 0xe3, 0x2e, 0x14, 0x7b, 0xd7, 0xea, ++ 0xe2, 0x3e, 0x6c, 0xd2, 0xc5, 0x7d, 0xb8, 0x4b, 0x17, 0xf7, 0xe1, 0x7e, ++ 0x5d, 0xdc, 0x87, 0x6d, 0xba, 0xb8, 0x0f, 0x8f, 0xe8, 0xe2, 0x3e, 0xec, ++ 0xd6, 0xc5, 0x7d, 0x78, 0x5a, 0x17, 0xf7, 0x61, 0xbf, 0x94, 0x5f, 0x5c, ++ 0x73, 0x58, 0xaa, 0xbf, 0xb4, 0xf6, 0x88, 0x94, 0x5f, 0x56, 0xf7, 0x86, ++ 0x54, 0x7f, 0x79, 0xf0, 0xb8, 0x54, 0xbe, 0xa2, 0xfe, 0x03, 0xa9, 0xbc, ++ 0xa2, 0xe1, 0x23, 0x29, 0x5f, 0xd5, 0xf4, 0x85, 0x54, 0xbf, 0xb7, 0x71, ++ 0x1f, 0x5e, 0x15, 0xef, 0x81, 0x5f, 0x13, 0xef, 0x81, 0x8f, 0x89, 0xf7, ++ 0xc0, 0x6f, 0xc6, 0x88, 0xfb, 0xf0, 0xd7, 0x9f, 0x7f, 0x71, 0x5b, 0xe4, ++ 0x7b, 0xfc, 0x2f, 0x7f, 0xfe, 0xcd, 0x6d, 0xf8, 0x1e, 0xdf, 0x20, 0xde, ++ 0xc1, 0xc6, 0x8a, 0xfb, 0x10, 0x2e, 0x8f, 0x11, 0xf7, 0xa1, 0xab, 0xfd, ++ 0xb7, 0x8f, 0xfb, 0x90, 0x92, 0xfc, 0xcf, 0x7f, 0x87, 0x9f, 0x63, 0xe7, ++ 0xe7, 0x9b, 0x13, 0xe2, 0x27, 0xe5, 0xd8, 0x53, 0xbe, 0xfb, 0x3b, 0xfc, ++ 0x6b, 0x8b, 0xe4, 0xf7, 0xcc, 0x73, 0x4b, 0xe4, 0xf7, 0xcc, 0x39, 0x76, ++ 0xae, 0xcf, 0xe7, 0xf9, 0xe4, 0x77, 0xcd, 0xd7, 0x97, 0xc9, 0xef, 0x9a, ++ 0xcb, 0x6c, 0xbe, 0x6c, 0xc4, 0x43, 0x1f, 0xf7, 0x61, 0x42, 0xbc, 0x37, ++ 0xc7, 0x8e, 0xfa, 0x52, 0xbc, 0xcf, 0x0f, 0xe1, 0xfb, 0x54, 0x58, 0x1b, ++ 0x9f, 0xc5, 0xf7, 0xa9, 0x90, 0x3e, 0x87, 0x71, 0x1f, 0x20, 0x3d, 0x88, ++ 0x71, 0x1f, 0x20, 0x3d, 0x84, 0x71, 0x1f, 0x20, 0xfd, 0x3d, 0xc6, 0x7d, ++ 0x80, 0xf4, 0x25, 0x8c, 0xfb, 0x00, 0xe9, 0xcb, 0x18, 0xf7, 0x41, 0xc5, ++ 0xb8, 0x11, 0x01, 0x11, 0x37, 0xa2, 0x46, 0xc4, 0x8d, 0xa8, 0x15, 0x71, ++ 0x23, 0xea, 0x44, 0xdc, 0x88, 0xa0, 0x88, 0x1b, 0x51, 0x2f, 0xe2, 0x46, ++ 0x34, 0x88, 0xb8, 0x11, 0x4d, 0x22, 0x6e, 0x44, 0x88, 0xe0, 0x9c, 0xf0, ++ 0x1f, 0xa2, 0xf4, 0xa4, 0xbf, 0x85, 0xd2, 0x53, 0xfe, 0x63, 0x94, 0x9e, ++ 0xf6, 0xb7, 0x52, 0x7a, 0xc6, 0x7f, 0x9a, 0xd2, 0xb3, 0xfe, 0x0e, 0x4a, ++ 0xdb, 0xfc, 0x9f, 0x53, 0xda, 0xdb, 0xb8, 0x11, 0x9a, 0x5c, 0xfe, 0x19, ++ 0xed, 0x06, 0x33, 0xf6, 0xcf, 0xe5, 0x58, 0x93, 0xd3, 0x19, 0xf6, 0x81, ++ 0x1b, 0x22, 0xe5, 0xb4, 0xc8, 0x7e, 0xd1, 0x06, 0x94, 0xd3, 0x58, 0xf1, ++ 0x22, 0xe6, 0x22, 0x4d, 0x53, 0x62, 0xc7, 0x8b, 0x08, 0x97, 0xc7, 0x88, ++ 0x17, 0xd1, 0xd5, 0x3e, 0x76, 0xbc, 0x88, 0xb4, 0xd1, 0xdf, 0x5f, 0xbc, ++ 0x88, 0x7f, 0x8b, 0xe7, 0xf2, 0xfa, 0x8f, 0xc6, 0x8b, 0x98, 0x5f, 0x2d, ++ 0xc7, 0x33, 0x58, 0xb0, 0xe6, 0xfc, 0xf1, 0x22, 0xca, 0x6c, 0x45, 0xab, ++ 0x51, 0x2e, 0x35, 0x79, 0xfc, 0xb7, 0x78, 0x7e, 0x5e, 0xd5, 0x53, 0xbc, ++ 0x88, 0x6d, 0x76, 0x45, 0xac, 0xd7, 0x40, 0x17, 0xb4, 0xbb, 0x80, 0x2e, ++ 0xb4, 0x5e, 0xf7, 0xf0, 0xde, 0xfe, 0x39, 0xc7, 0xc3, 0xb9, 0xb8, 0x9f, ++ 0xe8, 0xcc, 0xbd, 0xe8, 0xbc, 0x71, 0x0e, 0xf4, 0x72, 0x11, 0x9b, 0xde, ++ 0x3c, 0xae, 0xc1, 0x75, 0xdf, 0x73, 0x9c, 0x88, 0x9e, 0xe8, 0xaa, 0xd5, ++ 0x7f, 0xb3, 0x9c, 0xc7, 0x2f, 0xf8, 0xb7, 0xf8, 0xf3, 0xc7, 0x2f, 0xe8, ++ 0x16, 0x27, 0xa2, 0xa7, 0xf8, 0x02, 0x83, 0x3e, 0x23, 0x3d, 0xd9, 0xdb, ++ 0x38, 0x11, 0x3d, 0xad, 0x0b, 0x3d, 0xd1, 0x73, 0xd6, 0xf7, 0x1c, 0x27, ++ 0xa2, 0x27, 0xbd, 0xda, 0x93, 0x3e, 0xfd, 0xe3, 0x74, 0x4e, 0xe7, 0x09, ++ 0xf1, 0xe7, 0x8f, 0xc7, 0x11, 0x8e, 0x0b, 0x67, 0x6d, 0x39, 0x48, 0x8d, ++ 0x5d, 0x5e, 0x9a, 0xda, 0xaa, 0x78, 0x07, 0x5e, 0x30, 0xdb, 0x45, 0xfe, ++ 0x93, 0xf6, 0x5d, 0xe2, 0xde, 0x98, 0x97, 0xb9, 0x5d, 0xa9, 0xfc, 0x9d, ++ 0x3a, 0xda, 0x9b, 0xed, 0x7b, 0x12, 0x86, 0x33, 0x7a, 0xbf, 0xee, 0x62, ++ 0x5e, 0xe0, 0x4f, 0xbc, 0xf8, 0xae, 0xec, 0xda, 0xbf, 0x1f, 0xcf, 0xd3, ++ 0x6f, 0x75, 0x32, 0x6f, 0x62, 0x12, 0xc5, 0x83, 0x77, 0x1b, 0x73, 0x70, ++ 0x1f, 0x36, 0xd2, 0x8a, 0xfe, 0x94, 0x8a, 0xc6, 0x8f, 0x5e, 0xfe, 0x1d, ++ 0xc0, 0xb5, 0x35, 0x1b, 0xe9, 0x3e, 0x59, 0x3b, 0xe0, 0xd0, 0x42, 0x76, ++ 0x9f, 0x37, 0x11, 0xf9, 0x16, 0xcf, 0x6e, 0xa7, 0x7d, 0x3a, 0x9e, 0x71, ++ 0x7d, 0xd3, 0x27, 0xf2, 0x3d, 0xb3, 0xee, 0xf7, 0x1b, 0xb0, 0x4a, 0xc4, ++ 0xf9, 0xcd, 0x54, 0xa3, 0x9d, 0xf6, 0x4d, 0x9d, 0x5b, 0xf9, 0x3d, 0x4f, ++ 0x23, 0xbb, 0xe8, 0xbe, 0x89, 0xc9, 0x74, 0x9f, 0x9a, 0x05, 0xdd, 0xc4, ++ 0x3f, 0xb2, 0x53, 0x57, 0x08, 0x3c, 0x3b, 0x31, 0xc5, 0xfa, 0x3e, 0x2b, ++ 0xd9, 0x8f, 0xcb, 0x0e, 0x3f, 0x91, 0x1f, 0x62, 0xfc, 0xbc, 0x32, 0xd2, ++ 0x6f, 0xd0, 0xa7, 0x50, 0xf6, 0xd3, 0xd4, 0xd9, 0x9c, 0xc3, 0xf1, 0x5d, ++ 0x25, 0x0b, 0x78, 0x5b, 0xd0, 0xfe, 0x5e, 0x22, 0xe0, 0xa5, 0x14, 0xc9, ++ 0xfe, 0x9b, 0x0f, 0x17, 0x15, 0x1e, 0xc2, 0x73, 0xfa, 0x25, 0xbe, 0x52, ++ 0xba, 0x87, 0x90, 0x56, 0x22, 0xfb, 0x73, 0x98, 0x78, 0x37, 0x8e, 0xdb, ++ 0xb1, 0xf0, 0x7d, 0x39, 0xc0, 0xa7, 0xb4, 0x49, 0x61, 0x0f, 0x28, 0xdd, ++ 0xdf, 0x91, 0x97, 0x35, 0xdf, 0xb5, 0x01, 0xf7, 0x39, 0xcb, 0x83, 0x7a, ++ 0xfb, 0x9b, 0xe5, 0xa2, 0x9c, 0x95, 0xb3, 0x38, 0x0f, 0xee, 0x7b, 0x57, ++ 0xd4, 0xcb, 0xe5, 0x0e, 0x87, 0xb8, 0xcf, 0x61, 0x67, 0xf6, 0x5e, 0xd1, ++ 0xad, 0x75, 0xf0, 0x7d, 0x13, 0x47, 0x9f, 0x97, 0x6e, 0x9e, 0x10, 0xd6, ++ 0xdf, 0xe5, 0xa0, 0xfb, 0xb0, 0xcb, 0x0e, 0x2f, 0x36, 0x23, 0xb3, 0x2c, ++ 0xe9, 0x32, 0xdd, 0x6c, 0x6e, 0x99, 0x6e, 0xf1, 0xb9, 0x32, 0x7d, 0xf4, ++ 0xf4, 0x73, 0x78, 0x64, 0xfa, 0xe8, 0xe9, 0x97, 0x30, 0x56, 0xf6, 0x7f, ++ 0x69, 0xf4, 0xd3, 0xee, 0x1b, 0xaa, 0x4c, 0xdc, 0x17, 0x0d, 0xf2, 0x7b, ++ 0xa4, 0xdd, 0xde, 0xe1, 0x37, 0x6d, 0x23, 0x3c, 0xf5, 0xf4, 0xd3, 0xd3, ++ 0x6b, 0x94, 0x43, 0xdc, 0x93, 0xe8, 0xa2, 0x57, 0x91, 0x35, 0x95, 0x54, ++ 0x3e, 0xe1, 0x99, 0xa1, 0x86, 0x48, 0xbe, 0xf5, 0xf3, 0x21, 0xd3, 0x1e, ++ 0x52, 0xf0, 0xbf, 0xfb, 0x27, 0x07, 0xd7, 0x52, 0x2b, 0x8f, 0x43, 0x45, ++ 0xbd, 0x95, 0xce, 0x41, 0x33, 0x65, 0x09, 0x6f, 0x17, 0x8f, 0xf3, 0x01, ++ 0xe3, 0xca, 0x32, 0x0f, 0xcd, 0x07, 0xdc, 0xd1, 0xa3, 0x7f, 0x37, 0x9e, ++ 0xfd, 0x59, 0xc8, 0xfd, 0xbb, 0xec, 0x1b, 0x48, 0x6f, 0x2a, 0x7e, 0xee, ++ 0xf8, 0x22, 0x28, 0xdd, 0x8a, 0xf2, 0x36, 0x82, 0xff, 0xfe, 0x02, 0xf9, ++ 0xab, 0xb4, 0xdf, 0x4d, 0x60, 0x1e, 0x17, 0xee, 0xa3, 0x1a, 0xfc, 0x56, ++ 0xf7, 0x12, 0x15, 0xcf, 0x05, 0x99, 0x7b, 0xc9, 0x40, 0x3c, 0x0f, 0x74, ++ 0x51, 0x7a, 0xa7, 0x78, 0xf7, 0xdb, 0x3e, 0x94, 0xd1, 0xbe, 0xbf, 0x21, ++ 0xf4, 0x49, 0x2a, 0x9e, 0xa3, 0xdd, 0x99, 0xd7, 0x31, 0x13, 0xfd, 0x0f, ++ 0x55, 0x4b, 0x59, 0x11, 0xae, 0x5f, 0x3f, 0x72, 0xf2, 0x77, 0x17, 0x9b, ++ 0x44, 0x3a, 0xc2, 0xc9, 0xfd, 0x33, 0x9b, 0x8b, 0x0c, 0xcc, 0x3b, 0x1a, ++ 0x7f, 0x87, 0xc7, 0x18, 0x54, 0xd0, 0xef, 0xea, 0xf2, 0x1e, 0xbe, 0x1c, ++ 0xed, 0xd1, 0x66, 0x93, 0x9b, 0xde, 0x11, 0xbb, 0x3a, 0x5e, 0xbe, 0x9e, ++ 0xca, 0x47, 0xd1, 0xfb, 0xe8, 0x0c, 0x43, 0xed, 0x48, 0xc4, 0x07, 0xea, ++ 0xd3, 0xfb, 0xda, 0xf6, 0xe6, 0x77, 0x9d, 0x8b, 0x23, 0xf4, 0x70, 0x5b, ++ 0xd3, 0xdd, 0x43, 0xf0, 0x7e, 0xf1, 0xfd, 0x86, 0xe8, 0xef, 0x7a, 0x4b, ++ 0x1d, 0xda, 0xfb, 0x36, 0x7e, 0xbf, 0x63, 0x44, 0x57, 0x9c, 0x81, 0x52, ++ 0xc7, 0x18, 0x8a, 0x47, 0x70, 0x67, 0x36, 0xf4, 0x53, 0x59, 0xdc, 0x49, ++ 0x7c, 0xd4, 0xe4, 0x72, 0x82, 0xa0, 0xff, 0x73, 0xa5, 0xd3, 0x09, 0xbf, ++ 0x27, 0x9b, 0x15, 0x37, 0xfa, 0xeb, 0xa6, 0x19, 0x6f, 0xf8, 0xc1, 0x30, ++ 0xc0, 0x6f, 0xdc, 0x51, 0x95, 0xeb, 0x2f, 0x71, 0xaf, 0x7b, 0xb4, 0xa8, ++ 0xff, 0x34, 0xf3, 0xa4, 0x23, 0xbe, 0xe3, 0x2e, 0x65, 0x0a, 0xce, 0x9f, ++ 0x71, 0x6f, 0x30, 0x4f, 0x00, 0x49, 0x5c, 0x5d, 0x4a, 0xf7, 0xe9, 0x7e, ++ 0xe7, 0x9c, 0x76, 0x08, 0xf9, 0x35, 0xa5, 0x19, 0xe4, 0x09, 0xf5, 0xc8, ++ 0x59, 0xbb, 0x07, 0xaf, 0xca, 0x8f, 0x69, 0x91, 0xef, 0xcb, 0x25, 0x4e, ++ 0xf1, 0x1d, 0xc0, 0xfb, 0x85, 0x97, 0x1c, 0x63, 0xa4, 0xcf, 0x2e, 0x39, ++ 0xa6, 0xea, 0xef, 0xc7, 0x18, 0x71, 0xbf, 0x3f, 0xae, 0x55, 0xfe, 0x3e, ++ 0x41, 0xb7, 0xff, 0x5c, 0xa7, 0xc9, 0x9d, 0x93, 0xa5, 0xa2, 0xdc, 0x6d, ++ 0xf9, 0xca, 0x48, 0x78, 0xb5, 0x77, 0x30, 0xcf, 0x3a, 0x80, 0xdb, 0xbe, ++ 0xa4, 0x2f, 0x9d, 0xdb, 0xb6, 0x7f, 0xc2, 0xc8, 0x4e, 0x6c, 0xff, 0xca, ++ 0x58, 0x18, 0xed, 0x7e, 0xc9, 0xdd, 0x0e, 0xee, 0xf7, 0xba, 0xdf, 0xcc, ++ 0x48, 0x7f, 0xdf, 0x5f, 0x6a, 0xa7, 0x77, 0x0e, 0xcf, 0x96, 0x96, 0x5f, ++ 0x80, 0xf6, 0xc5, 0x67, 0x3f, 0xf1, 0x5d, 0x10, 0xcd, 0x4f, 0x19, 0x61, ++ 0xa7, 0x25, 0xf0, 0xf7, 0xe7, 0xde, 0x04, 0x36, 0x16, 0xe5, 0xf0, 0x56, ++ 0x85, 0xd3, 0xbb, 0x36, 0xa3, 0x28, 0xca, 0xba, 0xa5, 0xc9, 0x9d, 0x26, ++ 0x87, 0x9a, 0xfc, 0x65, 0x94, 0xc6, 0xf9, 0xa2, 0xdd, 0xd7, 0x4c, 0x76, ++ 0x72, 0xfb, 0x68, 0x52, 0x69, 0xae, 0x62, 0x46, 0xf9, 0xd9, 0xa7, 0x30, ++ 0xa4, 0x6b, 0xdb, 0x3a, 0xc0, 0xeb, 0x3c, 0xeb, 0x76, 0x80, 0xad, 0xcb, ++ 0x44, 0x7c, 0xaa, 0x9a, 0x3e, 0xa6, 0x7b, 0x58, 0xd6, 0x66, 0x25, 0xea, ++ 0xef, 0xf2, 0x3c, 0xe1, 0x70, 0xf2, 0xfb, 0x80, 0xeb, 0x02, 0x6b, 0xf1, ++ 0xfe, 0xc5, 0xcd, 0x30, 0x89, 0x50, 0x4f, 0x65, 0x98, 0x6b, 0xb3, 0xa2, ++ 0xc1, 0x0f, 0xb0, 0x2d, 0x64, 0x97, 0x3e, 0xe0, 0x70, 0xf3, 0x77, 0x03, ++ 0x56, 0x11, 0x47, 0x48, 0xad, 0xcd, 0xc0, 0xfb, 0x08, 0x6d, 0x4d, 0x93, ++ 0xaf, 0xdc, 0x00, 0x78, 0x3e, 0x00, 0xf3, 0x01, 0xf9, 0x7b, 0xbf, 0xc9, ++ 0x43, 0x78, 0x07, 0x2a, 0x18, 0xa3, 0xfb, 0xa4, 0xc2, 0x5f, 0xd7, 0x6f, ++ 0x26, 0xdb, 0xb6, 0x39, 0xc2, 0xfe, 0xdd, 0xeb, 0x28, 0x38, 0x8c, 0x72, ++ 0x7b, 0xd8, 0xc1, 0xed, 0xc6, 0x3e, 0x3e, 0x8f, 0x82, 0x78, 0x7b, 0xfe, ++ 0xfe, 0x57, 0x27, 0xc2, 0x6f, 0xff, 0xdc, 0x42, 0xfc, 0xeb, 0x2b, 0xec, ++ 0x4d, 0xad, 0xdd, 0x49, 0x07, 0xa7, 0x4f, 0x89, 0xd3, 0x7b, 0x00, 0xdb, ++ 0xb3, 0xb2, 0x64, 0x52, 0x3e, 0x1e, 0x9f, 0xd3, 0xbd, 0xa4, 0x0f, 0xfa, ++ 0xcd, 0x81, 0xde, 0x51, 0xec, 0x2b, 0x6d, 0x5d, 0x4f, 0xf2, 0x31, 0x3a, ++ 0x9f, 0x48, 0xb2, 0x1b, 0x82, 0xa4, 0x9c, 0xbc, 0x5e, 0xb7, 0x4b, 0xba, ++ 0xef, 0x1d, 0xa0, 0x79, 0xa3, 0xcd, 0x03, 0x16, 0x52, 0x18, 0xbe, 0xd7, ++ 0xd7, 0xf4, 0x9b, 0xd2, 0xac, 0x84, 0x1c, 0x20, 0xf7, 0xa3, 0xad, 0xf6, ++ 0x10, 0xde, 0x3f, 0x4b, 0x2a, 0x83, 0x71, 0x27, 0x63, 0x3c, 0x0f, 0x2b, ++ 0x87, 0xd7, 0xa2, 0x9e, 0x95, 0xfd, 0x5a, 0x20, 0x8f, 0xf9, 0x68, 0xdc, ++ 0x33, 0x7a, 0xef, 0x8f, 0x8e, 0x54, 0x84, 0xaf, 0xe9, 0x3d, 0x4d, 0x5f, ++ 0xde, 0x9a, 0xc8, 0xf5, 0xd1, 0xad, 0x77, 0xa9, 0x14, 0x0f, 0x74, 0xab, ++ 0xda, 0x6a, 0x43, 0x7f, 0x6a, 0x96, 0xd7, 0x3d, 0x09, 0x43, 0xd3, 0x24, ++ 0xa9, 0x6e, 0xba, 0x97, 0xd2, 0xbf, 0x8c, 0xcf, 0xc3, 0xf8, 0x9c, 0x5f, ++ 0x26, 0x86, 0xed, 0x00, 0x98, 0xe4, 0x23, 0xbf, 0x36, 0x2e, 0x88, 0xf6, ++ 0x9e, 0x29, 0x03, 0xe5, 0x29, 0x05, 0xe9, 0xe5, 0xfb, 0xd0, 0x01, 0xe9, ++ 0xf0, 0x43, 0x1d, 0xcf, 0xa2, 0xb9, 0xe0, 0xb1, 0xb1, 0x3e, 0xfc, 0xfe, ++ 0x94, 0xd0, 0x13, 0xc2, 0xae, 0x99, 0x26, 0xd6, 0xbb, 0x71, 0xef, 0x19, ++ 0xf8, 0x3b, 0xca, 0xd0, 0xe5, 0x2c, 0xf2, 0x7d, 0x91, 0x5e, 0x4f, 0x80, ++ 0xdc, 0xff, 0x09, 0x7f, 0xbf, 0xe7, 0xfe, 0xf7, 0x54, 0x8a, 0x13, 0x1a, ++ 0xd6, 0x0f, 0xa5, 0xd3, 0x68, 0x7d, 0x62, 0xc6, 0xa1, 0x07, 0x50, 0xce, ++ 0x26, 0xbc, 0xc8, 0xf8, 0x71, 0x94, 0xd0, 0x0f, 0x2e, 0xf8, 0x87, 0xf4, ++ 0xb9, 0xe4, 0x25, 0xdf, 0x7a, 0x44, 0xe3, 0xbb, 0xea, 0x05, 0x3d, 0xbf, ++ 0x59, 0xc8, 0x1a, 0xce, 0xe3, 0x4f, 0xb3, 0x8d, 0x3a, 0x04, 0xf3, 0x2d, ++ 0x72, 0x9d, 0x75, 0x8a, 0xf5, 0x5e, 0xe8, 0x91, 0x9b, 0x8a, 0x07, 0xae, ++ 0xc7, 0xf9, 0xa5, 0xc9, 0xd1, 0x05, 0xb7, 0x78, 0x8c, 0xbe, 0x08, 0x3a, ++ 0xea, 0xdb, 0x87, 0xfd, 0x94, 0x8a, 0x35, 0xfc, 0xdd, 0x9d, 0x83, 0x7a, ++ 0xe4, 0x25, 0x23, 0xde, 0x0f, 0x6b, 0x2f, 0x00, 0x7e, 0x03, 0x5d, 0x9e, ++ 0xc4, 0xf9, 0x02, 0xf4, 0x4e, 0xfc, 0x24, 0x78, 0x25, 0xf2, 0x7d, 0x4b, ++ 0xf3, 0x15, 0x36, 0x94, 0xef, 0x5b, 0x43, 0x93, 0x5c, 0x33, 0xa0, 0x4d, ++ 0xa2, 0xb5, 0x88, 0x98, 0x97, 0xc8, 0xbc, 0xe4, 0xcf, 0xc9, 0x03, 0xea, ++ 0x60, 0x9c, 0x88, 0xf5, 0x24, 0x14, 0xb0, 0x5f, 0x57, 0x8b, 0xb2, 0x9c, ++ 0x29, 0x78, 0x8f, 0xab, 0x50, 0xf2, 0xf7, 0x68, 0xbf, 0x8b, 0x07, 0x03, ++ 0x25, 0xbe, 0x84, 0xf9, 0x00, 0x72, 0x1c, 0x79, 0x8f, 0x55, 0x93, 0x4f, ++ 0xbd, 0x3c, 0x6a, 0xf2, 0xbb, 0x1e, 0x37, 0x58, 0x78, 0x7e, 0x87, 0x1e, ++ 0x73, 0x48, 0x8d, 0x4a, 0x03, 0x31, 0xc8, 0xc2, 0xb6, 0xba, 0x50, 0xcf, ++ 0x6a, 0xf6, 0xe5, 0xfa, 0xb0, 0x3d, 0x97, 0x48, 0xfb, 0x8c, 0xd5, 0xc2, ++ 0x2e, 0x5a, 0x6f, 0x9f, 0x66, 0x25, 0x35, 0xb0, 0x3f, 0x99, 0xd6, 0xf3, ++ 0xd5, 0xb8, 0x3e, 0xc1, 0xf8, 0x57, 0xa7, 0x30, 0x9a, 0x07, 0xda, 0x38, ++ 0xf4, 0xf2, 0x58, 0xf5, 0xb9, 0x81, 0x05, 0x23, 0xf6, 0x07, 0x55, 0x6a, ++ 0x07, 0xdd, 0xe3, 0xab, 0xfa, 0xdc, 0xcc, 0x82, 0x7d, 0x70, 0xdc, 0xbe, ++ 0x49, 0x38, 0x6e, 0x8d, 0x2e, 0x23, 0x05, 0x5d, 0xf4, 0x74, 0xc8, 0x76, ++ 0x8a, 0xfd, 0xa6, 0xa0, 0x47, 0x6c, 0x3c, 0xf3, 0x5d, 0x78, 0x7f, 0x36, ++ 0xd1, 0xea, 0x65, 0x1b, 0x09, 0xcf, 0x49, 0x74, 0xcf, 0xb9, 0x21, 0x94, ++ 0x67, 0xc5, 0xf5, 0xf6, 0x36, 0x1d, 0x9e, 0xbd, 0xc0, 0x6f, 0x4e, 0x34, ++ 0xfc, 0x54, 0x7b, 0x0c, 0xfc, 0x44, 0xfc, 0xb6, 0x09, 0xcc, 0xf7, 0xbb, ++ 0x56, 0x90, 0xd7, 0xfc, 0x9b, 0xea, 0x32, 0xf8, 0x7a, 0xc1, 0x5e, 0x4d, ++ 0x8f, 0xe0, 0x9f, 0x7e, 0xde, 0x8c, 0x6d, 0xaa, 0x3e, 0x60, 0x8e, 0x98, ++ 0x2f, 0x9a, 0x5f, 0x57, 0x3f, 0x4f, 0x46, 0x34, 0xb3, 0x6b, 0x90, 0xee, ++ 0xe3, 0x42, 0x2a, 0xc3, 0xf3, 0xd7, 0x9e, 0xe6, 0xcb, 0x27, 0x62, 0xbc, ++ 0x55, 0xf1, 0x9c, 0x5e, 0xed, 0x73, 0x3a, 0x06, 0xa3, 0x7c, 0xee, 0x50, ++ 0x7d, 0xd5, 0x4e, 0xb2, 0x2f, 0x5a, 0x0d, 0x18, 0xf7, 0xb7, 0xfd, 0x69, ++ 0x46, 0xf3, 0xd9, 0xb3, 0xff, 0xa4, 0x93, 0xe2, 0x1b, 0xb5, 0xf4, 0xee, ++ 0x7e, 0xba, 0x66, 0x47, 0x69, 0xf6, 0x93, 0xbe, 0x9e, 0x66, 0x3f, 0x69, ++ 0x7a, 0x57, 0xbb, 0x1f, 0xbe, 0xdd, 0xe9, 0xf3, 0x63, 0xff, 0x4a, 0x13, ++ 0xc8, 0x27, 0x8c, 0x7f, 0xbd, 0x8b, 0xef, 0x8b, 0xf6, 0x3a, 0x7c, 0xeb, ++ 0xf0, 0x7b, 0x3c, 0x8c, 0x01, 0x8f, 0x92, 0x58, 0x6e, 0x28, 0x8b, 0xbf, ++ 0x7f, 0x95, 0xe5, 0x3f, 0x96, 0xbc, 0xc7, 0xeb, 0xe4, 0xb9, 0x01, 0xe8, ++ 0x44, 0xbf, 0x93, 0x05, 0xfa, 0x7f, 0x90, 0xd2, 0x1d, 0x0f, 0xad, 0xff, ++ 0x29, 0xce, 0x44, 0x7e, 0xde, 0x02, 0xb3, 0x19, 0xf5, 0x50, 0xbf, 0x7c, ++ 0xc6, 0x3b, 0xab, 0x64, 0x74, 0x7f, 0xb2, 0xdf, 0x70, 0xe6, 0xc3, 0xf5, ++ 0xa9, 0x5f, 0x1e, 0xbf, 0xf7, 0x17, 0x14, 0xeb, 0xf6, 0x36, 0xa1, 0x6f, ++ 0xb5, 0x74, 0xaf, 0xa3, 0xe8, 0x7e, 0xc4, 0xdf, 0xa4, 0xb2, 0x80, 0x25, ++ 0xef, 0xbb, 0xe3, 0x8d, 0xa8, 0xe2, 0x7d, 0xec, 0xed, 0x4e, 0xef, 0x7d, ++ 0x28, 0x7f, 0xd6, 0x42, 0x2f, 0x8d, 0x23, 0xd3, 0xc5, 0x3c, 0x68, 0x7f, ++ 0x66, 0xaa, 0x0d, 0x0a, 0xbe, 0x9b, 0x4c, 0x5a, 0xe9, 0x56, 0xf8, 0x3d, ++ 0x6c, 0xd6, 0xf5, 0x8e, 0x09, 0xe0, 0x65, 0xce, 0x70, 0x17, 0xa0, 0x9c, ++ 0x64, 0xe2, 0x3e, 0x1a, 0xeb, 0x37, 0x47, 0x8f, 0xa3, 0xf5, 0x84, 0xd3, ++ 0x24, 0xd9, 0x99, 0x1e, 0x16, 0x8e, 0x53, 0xf5, 0x04, 0xf6, 0x0b, 0x76, ++ 0xe6, 0x41, 0x33, 0xe0, 0xdd, 0x67, 0x86, 0x16, 0xf7, 0x4a, 0x3b, 0xb7, ++ 0xf1, 0x28, 0x48, 0xa7, 0x36, 0xc7, 0x1c, 0x42, 0xba, 0xed, 0x53, 0x85, ++ 0xdb, 0xe3, 0x89, 0x9c, 0x5e, 0xfa, 0xfd, 0x00, 0x12, 0x1e, 0xf1, 0x53, ++ 0x45, 0xfe, 0x36, 0x33, 0x53, 0x6d, 0x49, 0xac, 0xeb, 0x77, 0x38, 0x0d, ++ 0x56, 0xb2, 0xe3, 0xe3, 0x99, 0xa7, 0x01, 0xf5, 0xd2, 0xcb, 0xce, 0x6c, ++ 0x71, 0x2e, 0xea, 0xa9, 0xc1, 0xfc, 0xbf, 0xab, 0x1d, 0xd6, 0xc4, 0xa1, ++ 0x5d, 0x72, 0x7c, 0xe7, 0xc4, 0x59, 0x1e, 0x15, 0xaa, 0x38, 0x2f, 0xed, ++ 0x1c, 0x8e, 0x7b, 0x26, 0x90, 0xe7, 0xc3, 0x88, 0x6f, 0xdb, 0xc4, 0xce, ++ 0xc1, 0xb7, 0x12, 0x31, 0x3a, 0x06, 0x70, 0xb9, 0xf1, 0x1a, 0xa5, 0xb8, ++ 0x38, 0x1a, 0xfd, 0x9b, 0x4c, 0x12, 0xfd, 0x6d, 0xb8, 0xcf, 0x8e, 0xd4, ++ 0x83, 0x0e, 0x33, 0xed, 0x23, 0xdb, 0x94, 0x38, 0x0f, 0xce, 0xb3, 0xb6, ++ 0xe5, 0x0a, 0xc7, 0x53, 0xb1, 0x8a, 0xb8, 0x41, 0xaa, 0xbc, 0xff, 0x17, ++ 0xfa, 0x48, 0xd3, 0xaf, 0x9d, 0xce, 0x2c, 0xc2, 0x3f, 0x9e, 0x05, 0x68, ++ 0x1f, 0xc0, 0xac, 0x1e, 0x2b, 0xdd, 0x63, 0x17, 0xf8, 0x63, 0x5c, 0x45, ++ 0xf2, 0xeb, 0xec, 0x8d, 0x0f, 0x6e, 0xc7, 0xf3, 0x28, 0x5d, 0x1c, 0x45, ++ 0x7d, 0x9c, 0xc5, 0xc9, 0x8b, 0xed, 0x74, 0xef, 0x62, 0xcb, 0x5e, 0x1b, ++ 0xed, 0x4b, 0x3b, 0x8b, 0xf8, 0xf9, 0x7c, 0x67, 0xb3, 0x85, 0xf4, 0x6f, ++ 0xac, 0x79, 0x9a, 0x86, 0xca, 0xe0, 0x3c, 0xf1, 0x02, 0x81, 0x6e, 0x1d, ++ 0x48, 0xb7, 0x34, 0x53, 0x75, 0x22, 0xea, 0xbd, 0xb4, 0xf9, 0x7c, 0xfe, ++ 0xeb, 0xe9, 0xd1, 0x8e, 0x03, 0xc5, 0xfd, 0xce, 0x1f, 0x4c, 0xc1, 0x68, ++ 0xef, 0xd5, 0xb5, 0x34, 0x3d, 0xbd, 0x6f, 0x31, 0xda, 0x65, 0xe9, 0x19, ++ 0xe9, 0x94, 0x6a, 0xdf, 0xeb, 0xec, 0x6a, 0xd4, 0x7b, 0xd8, 0xc6, 0x04, ++ 0x45, 0x8a, 0xd3, 0x37, 0x04, 0x7a, 0x14, 0xfb, 0x1c, 0x63, 0x02, 0x7c, ++ 0x3f, 0xe7, 0xfb, 0xe3, 0x6b, 0x5e, 0xd6, 0x75, 0xaf, 0xbd, 0x2e, 0x8e, ++ 0xd3, 0xaf, 0xd3, 0x37, 0x3e, 0xe1, 0x61, 0x94, 0x2b, 0x10, 0x38, 0xfa, ++ 0x3d, 0x01, 0xed, 0x5c, 0x53, 0xec, 0xe7, 0xb5, 0xf8, 0x49, 0x5a, 0x3f, ++ 0x5b, 0xfc, 0xd6, 0x62, 0x0c, 0xf9, 0x59, 0xb7, 0x68, 0xba, 0x0d, 0xd7, ++ 0x81, 0x14, 0xe6, 0xbd, 0x72, 0x1e, 0x4e, 0xca, 0x2d, 0x26, 0xb6, 0x93, ++ 0xda, 0xe5, 0x4a, 0xf7, 0x5d, 0xef, 0xf5, 0x8f, 0x2c, 0xc6, 0xf7, 0xc9, ++ 0x99, 0x09, 0xfc, 0x1e, 0xed, 0x27, 0x5b, 0xa6, 0xd2, 0x7b, 0xe6, 0x54, ++ 0xb6, 0xce, 0x36, 0x18, 0xe8, 0x50, 0x5a, 0x64, 0xf0, 0xa0, 0x3f, 0xe0, ++ 0xdc, 0xa2, 0x37, 0x9d, 0x06, 0x90, 0x9f, 0x45, 0x99, 0x2d, 0xf9, 0x28, ++ 0xa7, 0x09, 0x26, 0x5f, 0x66, 0xc2, 0x18, 0x72, 0x5d, 0xd1, 0x7e, 0x63, ++ 0x59, 0x89, 0x39, 0x18, 0x02, 0x7a, 0x25, 0xd7, 0x81, 0x42, 0x20, 0x3a, ++ 0x06, 0xae, 0x24, 0x3a, 0x2e, 0x34, 0x44, 0xf5, 0x0f, 0x67, 0x27, 0xf0, ++ 0x7d, 0xe7, 0x5b, 0x62, 0x3d, 0x49, 0x4f, 0x1f, 0x50, 0xbc, 0x64, 0x54, ++ 0x64, 0xbe, 0x1f, 0xd1, 0x55, 0x93, 0x23, 0x98, 0x3f, 0x19, 0x4b, 0x46, ++ 0x77, 0xc5, 0xc3, 0x04, 0x7e, 0x5e, 0x94, 0x10, 0x65, 0x1e, 0xb4, 0x9b, ++ 0x58, 0x13, 0xbe, 0x97, 0xd0, 0xf4, 0x51, 0xb2, 0x10, 0x33, 0x4d, 0x1f, ++ 0x6a, 0x72, 0x9c, 0x8c, 0xf3, 0x03, 0xed, 0xb8, 0x22, 0xd0, 0x4f, 0xd2, ++ 0x79, 0x1f, 0x54, 0x4d, 0xed, 0xfa, 0x3d, 0x43, 0xa5, 0xf9, 0x85, 0x2f, ++ 0xd0, 0x8e, 0x75, 0x5e, 0x3a, 0x89, 0xf4, 0x0d, 0xcc, 0xdb, 0x1a, 0x92, ++ 0xf3, 0x5c, 0xae, 0x3f, 0x6d, 0xa8, 0xcf, 0x22, 0xfc, 0x56, 0xed, 0x7b, ++ 0x5f, 0xef, 0x8f, 0xef, 0x98, 0xde, 0xfe, 0xd9, 0xc7, 0x0e, 0x7c, 0xd7, ++ 0xf2, 0x17, 0xb5, 0xc3, 0x81, 0xfa, 0xeb, 0xf4, 0x2d, 0x7f, 0x72, 0x60, ++ 0x1c, 0xb0, 0xb7, 0x6f, 0xe1, 0xfb, 0xe4, 0x1b, 0x75, 0xf6, 0xff, 0x55, ++ 0x42, 0x3e, 0x82, 0x09, 0x45, 0x53, 0x90, 0xae, 0x0b, 0xfc, 0x7f, 0xcf, ++ 0x8f, 0xb4, 0xd7, 0xd8, 0x1a, 0xee, 0x7f, 0x5e, 0x1e, 0x94, 0xdf, 0xaf, ++ 0xe2, 0xfd, 0xef, 0x48, 0x3f, 0x60, 0x45, 0x83, 0xfe, 0x3e, 0x40, 0x80, ++ 0xc7, 0x29, 0x13, 0xbf, 0xcf, 0xa9, 0xe7, 0xc3, 0x3a, 0xc1, 0x87, 0xe5, ++ 0xbb, 0xb6, 0x99, 0x33, 0xdd, 0xd8, 0xbf, 0x6f, 0x0e, 0xf6, 0x7f, 0x5a, ++ 0xec, 0x6f, 0x4e, 0x37, 0x3a, 0xe8, 0x3d, 0x85, 0x86, 0xcf, 0xa2, 0x5d, ++ 0x23, 0xcd, 0x68, 0xf3, 0xff, 0xa5, 0xd9, 0x22, 0xde, 0xe9, 0xb5, 0x98, ++ 0xb8, 0x5e, 0xf6, 0xce, 0xc0, 0xf7, 0x39, 0x3e, 0x41, 0x37, 0x3d, 0x9e, ++ 0x07, 0xf7, 0xc5, 0x13, 0xbc, 0xa5, 0xf7, 0xf0, 0xf7, 0xab, 0x0b, 0xa1, ++ 0xaf, 0x35, 0xa0, 0x17, 0x7d, 0xcd, 0x3c, 0x8e, 0x92, 0x7e, 0x1c, 0x4b, ++ 0xdf, 0x76, 0x4f, 0x43, 0x3f, 0xfa, 0xd2, 0x4d, 0x0a, 0xed, 0xe3, 0xb0, ++ 0xfe, 0x2d, 0xb0, 0x4e, 0xf8, 0xd6, 0x6c, 0xa4, 0x77, 0x3c, 0xfa, 0x71, ++ 0x2e, 0x0c, 0xc8, 0xfe, 0x1c, 0x7d, 0xbc, 0x46, 0x6d, 0x3f, 0xb0, 0x4c, ++ 0xf0, 0x7f, 0x09, 0xfe, 0x1a, 0x6f, 0x4e, 0x94, 0x38, 0x8e, 0xcd, 0xfc, ++ 0x3d, 0xdd, 0x32, 0x9d, 0x7d, 0xd1, 0x79, 0x28, 0x27, 0x1e, 0xc7, 0xbf, ++ 0x26, 0x41, 0xd8, 0xd9, 0xf9, 0xec, 0x12, 0x8c, 0xdb, 0xb9, 0xe7, 0x50, ++ 0x76, 0x42, 0xb4, 0x78, 0x18, 0x5a, 0x7a, 0x56, 0x9c, 0xf7, 0xe3, 0xbd, ++ 0x7e, 0x4c, 0x4f, 0xfb, 0x19, 0xa5, 0x53, 0x12, 0xdc, 0x3c, 0x5e, 0x57, ++ 0xf3, 0x91, 0x9b, 0x51, 0xae, 0x2a, 0x9b, 0x76, 0x53, 0x7c, 0xc4, 0x7d, ++ 0xc1, 0xf7, 0xfa, 0x8c, 0x87, 0x2a, 0x05, 0xcd, 0x5f, 0x18, 0x51, 0xa8, ++ 0x0a, 0x84, 0x3d, 0x36, 0x5f, 0xd8, 0x63, 0x7b, 0x18, 0x97, 0x1b, 0xb0, ++ 0xa3, 0x37, 0xa3, 0xfc, 0x5f, 0xfe, 0xb9, 0xce, 0x8e, 0x16, 0xe3, 0xbc, ++ 0x41, 0x93, 0xfb, 0x43, 0x49, 0x24, 0x37, 0x37, 0xe0, 0xb8, 0x86, 0xe3, ++ 0x77, 0xf5, 0x93, 0x68, 0xe3, 0xba, 0x3b, 0x41, 0x7e, 0xff, 0xd5, 0xdb, ++ 0x71, 0x69, 0xe3, 0xd1, 0xc6, 0xa7, 0x95, 0x57, 0x88, 0xf7, 0xe7, 0xfa, ++ 0x76, 0x9a, 0x9c, 0x4f, 0x11, 0x72, 0xb7, 0x64, 0x47, 0xf1, 0x86, 0xbe, ++ 0x40, 0x8a, 0xf5, 0x7b, 0xdf, 0x1f, 0x20, 0xe2, 0xc8, 0x51, 0x9c, 0x2d, ++ 0x4d, 0x8e, 0xf4, 0x72, 0xb2, 0x4c, 0xf0, 0x2d, 0x2c, 0x0f, 0xcd, 0x77, ++ 0xd0, 0xb8, 0x34, 0xbe, 0x81, 0xbc, 0xa7, 0x8b, 0x77, 0x49, 0xe9, 0xe8, ++ 0xcf, 0xe8, 0x49, 0x2e, 0xf4, 0xfc, 0x6f, 0x33, 0xb5, 0x0e, 0xc0, 0xf9, ++ 0xaa, 0xe7, 0x7f, 0x5b, 0x8c, 0x73, 0x9f, 0xed, 0x09, 0xfc, 0x5c, 0x63, ++ 0x89, 0xdb, 0x3b, 0x0d, 0xfd, 0x2b, 0x60, 0x1e, 0x6e, 0x70, 0x45, 0xd8, ++ 0x0f, 0xa7, 0xd5, 0xda, 0x83, 0x3f, 0xc5, 0x79, 0xb4, 0x83, 0xcb, 0x71, ++ 0xe4, 0xba, 0x48, 0xc6, 0xd2, 0x8b, 0x26, 0x5a, 0x67, 0x57, 0x39, 0xdc, ++ 0x69, 0x89, 0x76, 0xc1, 0xb7, 0x71, 0xf8, 0x7e, 0xd1, 0x12, 0xc0, 0x7a, ++ 0x5a, 0x3f, 0xa7, 0xfc, 0x35, 0xb3, 0x06, 0xd2, 0x79, 0x63, 0xed, 0xac, ++ 0x81, 0x03, 0xe9, 0xdd, 0x06, 0xa5, 0x5a, 0x79, 0xe9, 0xfd, 0x1f, 0x3b, ++ 0xd1, 0x3e, 0x6d, 0xcf, 0x65, 0xe4, 0x5f, 0x68, 0x73, 0xc8, 0xf8, 0x1e, ++ 0xc1, 0xc5, 0x66, 0x0c, 0xa6, 0x9c, 0xfe, 0x2b, 0xd5, 0x96, 0xaf, 0xdf, ++ 0x42, 0x1d, 0xb4, 0xa3, 0x85, 0xe2, 0xb7, 0x9e, 0xfa, 0x4a, 0xf8, 0x27, ++ 0xbe, 0xb2, 0x14, 0x46, 0x1b, 0xe7, 0xd9, 0x04, 0x6e, 0x07, 0x6a, 0xf7, ++ 0x4f, 0x6e, 0x14, 0xf3, 0xe8, 0xc6, 0x66, 0xfe, 0xde, 0x6e, 0xd1, 0xd6, ++ 0x62, 0x33, 0xf9, 0x01, 0xd6, 0xc8, 0xf7, 0x35, 0x5e, 0x52, 0x5c, 0xd3, ++ 0x32, 0xa1, 0xa9, 0xaf, 0x61, 0xa4, 0x19, 0xf9, 0xac, 0xe7, 0xc7, 0x52, ++ 0xcf, 0x15, 0xf4, 0x0e, 0xbc, 0x1b, 0x5f, 0xd8, 0xed, 0xc4, 0xd7, 0xa5, ++ 0xfa, 0x77, 0x6d, 0xe2, 0x1e, 0xd3, 0x02, 0x21, 0x1f, 0x33, 0x5d, 0x6e, ++ 0x61, 0xa7, 0xf9, 0xe8, 0x1d, 0xf1, 0x92, 0x3a, 0x23, 0xd9, 0xf7, 0xcb, ++ 0xdc, 0xd5, 0xb4, 0xbf, 0x59, 0xa1, 0x46, 0x7f, 0x8f, 0x35, 0xc6, 0x65, ++ 0x38, 0xef, 0x78, 0xf4, 0xe3, 0x58, 0xd8, 0xa8, 0x90, 0xde, 0xd3, 0xe3, ++ 0xbf, 0x6c, 0xc7, 0xda, 0x0d, 0x7d, 0x19, 0x8e, 0x9f, 0x8f, 0xaf, 0xfb, ++ 0x38, 0x42, 0xfd, 0x48, 0xcf, 0x88, 0x71, 0xb2, 0xd6, 0xcb, 0xf9, 0xbb, ++ 0x4c, 0xb1, 0x6e, 0xff, 0x17, 0xf6, 0xee, 0x23, 0x93, 0x00, 0x80, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x0b, 0xb5, 0x7c, 0x0d, 0x78, 0x54, 0xd5, 0xb5, 0xe8, 0x3e, 0x73, ++ 0xce, 0xfc, 0x24, 0x33, 0x49, 0x26, 0xff, 0x21, 0x41, 0x3c, 0x21, 0x11, ++ 0x12, 0x12, 0xe2, 0x90, 0x84, 0xf0, 0x2b, 0x4e, 0x7e, 0x89, 0x18, 0x61, ++ 0x20, 0x40, 0x10, 0xac, 0x0e, 0x28, 0x8a, 0x90, 0x1f, 0x44, 0x6f, 0xeb, ++ 0x7d, 0xf5, 0x36, 0x13, 0x12, 0xad, 0x45, 0x9f, 0x37, 0x8a, 0xb5, 0xdc, ++ 0xd6, 0xde, 0x6f, 0xb0, 0xd2, 0xaa, 0x80, 0x04, 0x08, 0x1a, 0x68, 0x92, ++ 0x4e, 0x40, 0x31, 0x40, 0xd0, 0x20, 0xa8, 0x60, 0x69, 0x0d, 0x48, 0x11, ++ 0x5b, 0x20, 0x03, 0x58, 0x8b, 0xd5, 0xf7, 0x7c, 0x6b, 0xad, 0xbd, 0x4f, ++ 0x66, 0xe6, 0x24, 0x11, 0x7a, 0xfb, 0x3a, 0xb4, 0xee, 0xec, 0x73, 0xf6, ++ 0xd9, 0x67, 0xed, 0xf5, 0xbf, 0xd6, 0x5e, 0xfb, 0x2c, 0x67, 0x4f, 0x5f, ++ 0x92, 0x73, 0x18, 0x7b, 0xb0, 0x5d, 0x66, 0x2c, 0x9f, 0xb1, 0xda, 0xa7, ++ 0x65, 0x2f, 0x4b, 0x65, 0x6c, 0x39, 0x53, 0x4e, 0xf7, 0x65, 0x30, 0xfa, ++ 0x7d, 0x9b, 0x8a, 0xff, 0x75, 0x56, 0x2c, 0x4d, 0x60, 0xec, 0x6e, 0xfc, ++ 0x53, 0x85, 0xb6, 0xbd, 0xa6, 0x82, 0xc1, 0x73, 0x65, 0x72, 0xf5, 0x6c, ++ 0x7c, 0xae, 0x7f, 0x83, 0xcc, 0xcc, 0x12, 0x5c, 0xf7, 0x78, 0x9f, 0x48, ++ 0x8e, 0x83, 0xb6, 0x49, 0x72, 0x34, 0xc2, 0x38, 0xf6, 0xa8, 0xf1, 0x74, ++ 0x9f, 0x85, 0x31, 0x0b, 0xfc, 0xfb, 0x76, 0x34, 0xcd, 0xc3, 0x58, 0x02, ++ 0xce, 0xcf, 0x7f, 0x3d, 0x12, 0x7b, 0x22, 0x05, 0xe6, 0x3f, 0xab, 0xf8, ++ 0xdf, 0x8d, 0x80, 0xe7, 0xce, 0x02, 0x1c, 0x1e, 0x98, 0x67, 0xa9, 0x87, ++ 0x3f, 0x47, 0xef, 0x87, 0xff, 0x2f, 0x77, 0xcc, 0xfc, 0x5c, 0x82, 0xf7, ++ 0xdd, 0xdb, 0x2e, 0x9f, 0x32, 0xe7, 0xe0, 0xd5, 0xd5, 0x26, 0x03, 0x8c, ++ 0x5f, 0xf6, 0xa2, 0xc4, 0xd6, 0xc1, 0xf8, 0x7b, 0x9f, 0xd4, 0x8d, 0x17, ++ 0xeb, 0xd2, 0xaf, 0xe3, 0x81, 0x0d, 0x3f, 0x99, 0x97, 0x9e, 0x11, 0x18, ++ 0xf7, 0xa0, 0xf7, 0xd9, 0x90, 0x3e, 0xac, 0x4d, 0x65, 0x05, 0x8c, 0xdd, ++ 0x23, 0xe0, 0x63, 0xaf, 0xfc, 0x57, 0xe0, 0x3e, 0x87, 0xdf, 0xe4, 0x8a, ++ 0x60, 0x2c, 0xd3, 0x1e, 0x11, 0x77, 0x36, 0x0b, 0xba, 0x05, 0x6c, 0xd2, ++ 0xb7, 0x69, 0x8c, 0xd5, 0x59, 0x23, 0x73, 0x58, 0x14, 0xb4, 0x66, 0x46, ++ 0x78, 0x64, 0x87, 0x8c, 0xde, 0x4d, 0x00, 0xd7, 0x9a, 0x08, 0x58, 0x30, ++ 0xc0, 0xb9, 0x66, 0x6b, 0xb4, 0xd7, 0x83, 0x78, 0x5c, 0x1d, 0xcd, 0xd8, ++ 0x08, 0x18, 0xd7, 0xbe, 0xd1, 0xe4, 0xb6, 0xc1, 0x9c, 0xf8, 0xbb, 0x95, ++ 0xb1, 0x73, 0xf5, 0xcd, 0xf3, 0xd2, 0xd3, 0x61, 0xfd, 0xf5, 0x4f, 0xce, ++ 0x4b, 0x57, 0x18, 0x9b, 0x6d, 0xb7, 0x33, 0x36, 0x11, 0xe8, 0xd1, 0xf6, ++ 0x2c, 0x8d, 0xeb, 0x56, 0x5c, 0x93, 0xec, 0xd0, 0xaf, 0xb1, 0xf4, 0x3d, ++ 0x73, 0xa7, 0x1a, 0x84, 0xc7, 0xc9, 0x9c, 0x1e, 0xcb, 0xe5, 0x0a, 0x13, ++ 0x33, 0x04, 0xe6, 0xd3, 0xb7, 0xcb, 0x9b, 0x8d, 0x5f, 0xf4, 0x05, 0xad, ++ 0xb3, 0x10, 0xe1, 0xb7, 0xc2, 0x1f, 0x93, 0x00, 0x7e, 0xf9, 0xbb, 0xe0, ++ 0x57, 0x13, 0xa3, 0x6d, 0x01, 0xb8, 0xf5, 0xf3, 0xfe, 0xb9, 0x7e, 0x43, ++ 0x08, 0xdc, 0xab, 0x14, 0xe6, 0x6c, 0xb1, 0x05, 0xd6, 0xa3, 0x8d, 0x9b, ++ 0x68, 0x37, 0xd0, 0x7a, 0xf4, 0xcf, 0xeb, 0xe9, 0xc1, 0x98, 0x97, 0xc6, ++ 0xe9, 0xe9, 0xb2, 0x0a, 0xe9, 0x10, 0x44, 0x5f, 0x84, 0x53, 0x01, 0xbc, ++ 0xf6, 0x74, 0x58, 0xbd, 0x6b, 0x25, 0xe2, 0x23, 0x82, 0xdb, 0xd3, 0x11, ++ 0x46, 0x70, 0x5f, 0x4c, 0x5a, 0x37, 0xef, 0x4c, 0x1e, 0x63, 0x87, 0xf1, ++ 0x01, 0x80, 0xbb, 0x76, 0xc4, 0x4b, 0xd4, 0x7f, 0x59, 0x71, 0xb9, 0xed, ++ 0xf1, 0x78, 0xd1, 0x3f, 0xca, 0x35, 0x1e, 0x9f, 0x89, 0x65, 0x6c, 0xca, ++ 0xf0, 0x78, 0x83, 0x19, 0x19, 0x83, 0xf1, 0xb9, 0x38, 0x3f, 0x8c, 0xdb, ++ 0x15, 0xe6, 0xcc, 0x63, 0x32, 0x5e, 0x77, 0xc5, 0x22, 0x1f, 0xcc, 0x68, ++ 0xe8, 0xab, 0xb4, 0x00, 0xa9, 0xea, 0xec, 0x93, 0xca, 0x15, 0x78, 0xcf, ++ 0x8c, 0x67, 0xfb, 0x2a, 0xc3, 0xa0, 0xff, 0x90, 0x7d, 0x32, 0xef, 0x6f, ++ 0xea, 0x3b, 0x6a, 0x71, 0x30, 0xd6, 0xc0, 0xa6, 0x94, 0x97, 0xc0, 0xf3, ++ 0x8f, 0xc0, 0x3d, 0x9c, 0xef, 0x5a, 0x6d, 0xbe, 0xd9, 0xb5, 0x84, 0x01, ++ 0x5f, 0x55, 0x03, 0x4e, 0x2d, 0x31, 0xd0, 0x1e, 0x1b, 0xf3, 0x16, 0xca, ++ 0x5b, 0x75, 0x6f, 0x45, 0xb9, 0x14, 0x09, 0x2d, 0x63, 0x3e, 0x29, 0x17, ++ 0xf8, 0xc1, 0x19, 0xe9, 0xb3, 0xe6, 0x50, 0x9f, 0x4d, 0x85, 0x71, 0x9d, ++ 0x51, 0xee, 0xff, 0xc0, 0xf5, 0xd5, 0x5c, 0x6d, 0xba, 0x24, 0xe3, 0xb8, ++ 0x63, 0x0a, 0x97, 0x97, 0xee, 0x38, 0xc2, 0x83, 0x02, 0xb0, 0x87, 0xc1, ++ 0x73, 0x4d, 0xe1, 0x4e, 0xd5, 0x0e, 0xf8, 0x6a, 0x8a, 0xb1, 0x38, 0x1a, ++ 0x53, 0xe9, 0xba, 0x27, 0x2c, 0x06, 0xfb, 0x4e, 0x55, 0x0d, 0xba, 0xae, ++ 0xd1, 0x03, 0x9f, 0x43, 0x38, 0x9a, 0x0c, 0xcc, 0x19, 0x0d, 0x6d, 0xd7, ++ 0x81, 0x31, 0x51, 0x7d, 0xd9, 0xc3, 0xe3, 0xad, 0xab, 0x5e, 0xad, 0x54, ++ 0x80, 0xfe, 0xfb, 0xea, 0x33, 0xa8, 0xd5, 0xdf, 0x2f, 0x34, 0xd9, 0xd3, ++ 0x1d, 0xf0, 0x7c, 0xa1, 0x81, 0xb9, 0x5b, 0x6c, 0x83, 0xef, 0xbf, 0x82, ++ 0xfc, 0x42, 0x74, 0x52, 0x53, 0x90, 0xce, 0xb5, 0xdd, 0x26, 0x92, 0x73, ++ 0xfc, 0x49, 0xc0, 0xf7, 0x35, 0x42, 0x0f, 0xd5, 0x02, 0x81, 0xa2, 0x00, ++ 0x9e, 0x9a, 0x63, 0xcc, 0x17, 0x1e, 0x89, 0xe3, 0xca, 0x3e, 0x57, 0xb0, ++ 0x6d, 0x95, 0xd8, 0xe9, 0x10, 0xbe, 0x62, 0x81, 0xbe, 0x3c, 0x3c, 0xdc, ++ 0xd7, 0xdb, 0xd6, 0xe2, 0x7c, 0x4a, 0x30, 0x9f, 0x70, 0x3c, 0x15, 0x29, ++ 0xa9, 0x95, 0x4a, 0xd0, 0x7b, 0x4b, 0x6c, 0x99, 0x21, 0x7d, 0x39, 0xd1, ++ 0x90, 0x81, 0xeb, 0x61, 0x72, 0xb8, 0x63, 0x13, 0xe0, 0x57, 0x4e, 0x31, ++ 0xac, 0xde, 0x01, 0xeb, 0x97, 0x6f, 0x84, 0x16, 0xf0, 0xa1, 0xd8, 0x1d, ++ 0xf2, 0x52, 0x68, 0x9b, 0x8b, 0x67, 0xc8, 0xcb, 0xa0, 0x6d, 0x34, 0xb2, ++ 0x45, 0x2d, 0xd8, 0x1a, 0xd8, 0x8a, 0x60, 0x3c, 0x75, 0x08, 0x79, 0xd2, ++ 0xda, 0x4b, 0x76, 0xd7, 0x6f, 0x91, 0xee, 0x17, 0xde, 0xeb, 0x2d, 0xb0, ++ 0x92, 0x9e, 0x1a, 0x69, 0x27, 0xf9, 0x16, 0xeb, 0x6d, 0x94, 0x1c, 0x3e, ++ 0xd4, 0x43, 0x9e, 0x2e, 0xe6, 0xd8, 0x04, 0xd7, 0x9a, 0x64, 0x17, 0xe3, ++ 0x7c, 0xdc, 0xc2, 0x90, 0x8f, 0xff, 0x20, 0xe6, 0x71, 0x98, 0x0d, 0x3b, ++ 0x55, 0xe0, 0xd7, 0x77, 0xed, 0xf7, 0x13, 0xff, 0x3a, 0xa2, 0x0c, 0x0f, ++ 0xa7, 0x42, 0xff, 0xc3, 0xe6, 0x95, 0xe5, 0x0a, 0xf0, 0xaf, 0x23, 0xc5, ++ 0x70, 0x25, 0x15, 0x78, 0xf4, 0x78, 0xf3, 0x2a, 0xde, 0xcf, 0x32, 0x5c, ++ 0x19, 0x0d, 0xfd, 0x8f, 0x9b, 0xab, 0x79, 0x7f, 0x1a, 0x4c, 0x99, 0xcc, ++ 0xd8, 0xc9, 0xe6, 0x9a, 0x72, 0x4f, 0x36, 0xce, 0xcb, 0xf5, 0x18, 0xdb, ++ 0xe2, 0xcc, 0xc2, 0xf7, 0x28, 0x06, 0x89, 0xe4, 0x54, 0xd9, 0x6b, 0xf2, ++ 0x36, 0xc2, 0x9f, 0x4d, 0x91, 0x9c, 0x9f, 0x9a, 0x8c, 0xc0, 0x97, 0x31, ++ 0x38, 0x5e, 0xa5, 0xf1, 0x4f, 0x34, 0x14, 0x6d, 0xb6, 0x02, 0xff, 0x2b, ++ 0x45, 0x4e, 0x75, 0xb5, 0x8d, 0xe3, 0x1a, 0xf9, 0xe1, 0x7f, 0xda, 0x6a, ++ 0x78, 0x94, 0xad, 0x86, 0xd5, 0x88, 0x47, 0x6c, 0x11, 0xdf, 0x67, 0xc4, ++ 0xba, 0x35, 0x3a, 0xb0, 0x56, 0x67, 0xd6, 0x5c, 0xd4, 0x0b, 0x2d, 0xce, ++ 0xac, 0x79, 0x11, 0x88, 0x57, 0xf7, 0x67, 0x88, 0xd7, 0xbc, 0x9e, 0xde, ++ 0x19, 0xa8, 0x87, 0x5b, 0xdf, 0xff, 0xb8, 0xc0, 0x9d, 0xcd, 0xe9, 0x85, ++ 0xf3, 0xe4, 0xf5, 0x30, 0x16, 0x09, 0xeb, 0xb9, 0xf0, 0xe6, 0x0d, 0x1b, ++ 0x65, 0x29, 0x40, 0x9f, 0x4b, 0xf6, 0xc2, 0xf3, 0xa8, 0xaf, 0x25, 0x50, ++ 0xd3, 0x8f, 0xc2, 0xba, 0x24, 0xd5, 0xce, 0xee, 0x02, 0xb9, 0x6b, 0x74, ++ 0x32, 0xd5, 0x04, 0xeb, 0x4a, 0x64, 0x2f, 0xda, 0xd1, 0x7e, 0x18, 0x90, ++ 0x3e, 0xa0, 0x82, 0x5a, 0x19, 0xd7, 0x2f, 0x9d, 0x51, 0xae, 0x2f, 0xf0, ++ 0x39, 0x36, 0xd2, 0x47, 0x76, 0xa6, 0xca, 0xee, 0xfa, 0x12, 0xdf, 0xaf, ++ 0xe9, 0x67, 0xd6, 0x1b, 0x33, 0xa4, 0x1e, 0xd6, 0xeb, 0x2b, 0x53, 0xce, ++ 0xa3, 0x32, 0x03, 0x3e, 0x88, 0x49, 0x69, 0x3b, 0xbe, 0x0c, 0xf5, 0xf9, ++ 0xef, 0xcc, 0x8e, 0x9b, 0x54, 0x84, 0xc7, 0xc9, 0x1e, 0x05, 0x38, 0xb6, ++ 0x19, 0x98, 0xc2, 0x62, 0x88, 0x3d, 0x32, 0x14, 0xb8, 0x6f, 0x65, 0xe1, ++ 0x8e, 0x75, 0x28, 0xef, 0x0e, 0x96, 0xe4, 0x01, 0xf9, 0x42, 0xb4, 0x11, ++ 0x70, 0xf0, 0x8b, 0x03, 0x7b, 0x68, 0x14, 0x32, 0xa4, 0xad, 0x03, 0x9e, ++ 0x2f, 0x61, 0xd0, 0x4e, 0x42, 0xb8, 0x6e, 0xa6, 0x75, 0xc9, 0xc8, 0x4f, ++ 0x13, 0x98, 0x4b, 0x46, 0xbd, 0x55, 0xc0, 0xbc, 0x56, 0x6c, 0xfb, 0x3b, ++ 0xde, 0x4c, 0x42, 0x7c, 0x3d, 0x17, 0xc6, 0xee, 0x71, 0x41, 0x6b, 0x79, ++ 0x85, 0x39, 0xbd, 0x41, 0x7a, 0x23, 0x3f, 0x5a, 0x22, 0xfc, 0xcf, 0x8e, ++ 0x31, 0x52, 0x1b, 0x6e, 0x6c, 0x99, 0x87, 0x7c, 0x1a, 0x7e, 0x89, 0xd9, ++ 0xd1, 0x0f, 0xe8, 0xff, 0xa5, 0x49, 0xc1, 0xf9, 0x41, 0x30, 0x6e, 0xc7, ++ 0xeb, 0x8e, 0xfd, 0x06, 0x86, 0x70, 0xfe, 0xc6, 0xe8, 0xb5, 0x47, 0x41, ++ 0xdf, 0x9f, 0xa9, 0xa8, 0x2f, 0xb1, 0xc0, 0x7c, 0xfd, 0x82, 0xce, 0xda, ++ 0xbc, 0xcf, 0x99, 0xd4, 0xcc, 0x68, 0xe8, 0x57, 0xc6, 0x48, 0x84, 0x97, ++ 0xdf, 0x14, 0x72, 0x7b, 0xec, 0xff, 0xdc, 0xe4, 0x7d, 0x29, 0x15, 0xf1, ++ 0x63, 0x59, 0xed, 0x0d, 0x92, 0xab, 0xf1, 0xd1, 0x7c, 0x5c, 0x5d, 0x5c, ++ 0xd1, 0xd8, 0x68, 0x78, 0xbe, 0xa5, 0x23, 0x9c, 0xe1, 0xfb, 0x27, 0x75, ++ 0x86, 0x1b, 0x10, 0xff, 0x9b, 0xb7, 0xe4, 0x86, 0x21, 0x1f, 0x6c, 0x43, ++ 0xdc, 0xc0, 0xfa, 0x63, 0xcc, 0xf6, 0x87, 0x70, 0xbe, 0x98, 0x2b, 0x00, ++ 0x6f, 0x2a, 0x5d, 0x77, 0x12, 0x5e, 0x15, 0x75, 0x42, 0x14, 0xe0, 0x75, ++ 0xea, 0x2c, 0x9b, 0xba, 0x0e, 0xf0, 0xfe, 0x9b, 0xb0, 0x96, 0x59, 0xc8, ++ 0xf7, 0xfe, 0xad, 0x06, 0xf6, 0x12, 0xbc, 0x62, 0x9b, 0xc9, 0x31, 0x17, ++ 0xfb, 0xdb, 0x2e, 0xab, 0x76, 0xd4, 0xb3, 0xbf, 0x49, 0x6d, 0x09, 0xa7, ++ 0xf5, 0x6c, 0x35, 0xd0, 0x7a, 0xb6, 0x85, 0xfb, 0xc7, 0xad, 0x01, 0xb8, ++ 0xd7, 0x65, 0x28, 0xe5, 0x08, 0x9f, 0x62, 0x65, 0x0a, 0xea, 0x5f, 0xc5, ++ 0x50, 0xa4, 0x3e, 0x04, 0xd7, 0xa7, 0x47, 0x73, 0xfd, 0xa8, 0xe9, 0xe3, ++ 0xea, 0x68, 0x95, 0xfa, 0xcf, 0x49, 0xf0, 0xfe, 0x5c, 0x1c, 0x57, 0x48, ++ 0x72, 0x53, 0x2a, 0xdb, 0x48, 0xde, 0xfa, 0xfd, 0xcc, 0x6b, 0x86, 0xf7, ++ 0xc4, 0xcf, 0xef, 0x95, 0x91, 0x1e, 0xe1, 0x73, 0x81, 0x95, 0x90, 0xdf, ++ 0x15, 0x9f, 0xcc, 0x70, 0x3e, 0x17, 0x12, 0x1a, 0x5a, 0x9b, 0xd1, 0xab, ++ 0x92, 0x9e, 0x75, 0xda, 0x96, 0x02, 0xdd, 0x67, 0x08, 0x3d, 0x3b, 0xe3, ++ 0x64, 0x75, 0x05, 0x8b, 0xc4, 0x8e, 0xe3, 0xd8, 0x34, 0x98, 0x6f, 0x9f, ++ 0xcd, 0xc8, 0x70, 0x5d, 0xb7, 0xb0, 0x3e, 0xd9, 0x02, 0xfd, 0x5b, 0xae, ++ 0x32, 0x87, 0x0f, 0xf9, 0xe7, 0xaa, 0x42, 0x7e, 0x98, 0x1d, 0xfe, 0x05, ++ 0xfb, 0x7b, 0xa5, 0x62, 0x9e, 0x5f, 0x4b, 0x4c, 0x89, 0x82, 0x71, 0x85, ++ 0x5f, 0xa8, 0x0a, 0xf2, 0x57, 0x21, 0x0b, 0xf5, 0xdb, 0x4a, 0x37, 0x94, ++ 0x7d, 0x8e, 0xf6, 0xad, 0xd8, 0xa2, 0xbb, 0x8e, 0xfe, 0x5c, 0x24, 0xb6, ++ 0x4a, 0xe0, 0x3a, 0xcc, 0xb3, 0x38, 0x5a, 0xf8, 0x61, 0xa3, 0xd8, 0xa8, ++ 0x6f, 0x49, 0x9f, 0xc1, 0xac, 0x09, 0xc2, 0x8e, 0xaa, 0xb8, 0xfe, 0xec, ++ 0xff, 0xc2, 0x75, 0xf5, 0x97, 0x9b, 0x1c, 0xb8, 0xfe, 0xed, 0x36, 0xe7, ++ 0x47, 0xd3, 0x50, 0x0f, 0xf6, 0x1a, 0xd9, 0x26, 0x36, 0xbc, 0x1c, 0xfd, ++ 0xba, 0x1e, 0x34, 0xfa, 0x18, 0x10, 0x8e, 0xab, 0xe1, 0xcc, 0x1b, 0x4b, ++ 0x7c, 0x68, 0x43, 0xfa, 0x8f, 0xdb, 0xd0, 0xec, 0x09, 0x83, 0xf5, 0x8e, ++ 0x4b, 0xe7, 0xf3, 0x23, 0xbf, 0xa1, 0xde, 0x18, 0xfb, 0xcb, 0xb8, 0x58, ++ 0xd4, 0xdb, 0x11, 0xd1, 0x5c, 0x9f, 0x68, 0xad, 0xc6, 0x5f, 0xc8, 0x47, ++ 0xf6, 0x28, 0xce, 0x47, 0xf6, 0x9b, 0x03, 0xf2, 0xf7, 0x83, 0xe8, 0x54, ++ 0x1a, 0xa7, 0xc9, 0x13, 0xf2, 0x17, 0xce, 0xb3, 0xc7, 0xe8, 0x5d, 0xe2, ++ 0x1a, 0xc2, 0x2e, 0x02, 0x5f, 0xfe, 0x00, 0xf9, 0x72, 0xbb, 0x8d, 0x95, ++ 0x23, 0x9f, 0x3f, 0x35, 0xc2, 0xb2, 0x08, 0xe5, 0x49, 0x7b, 0xcf, 0x6e, ++ 0xc1, 0xf7, 0xfa, 0xf6, 0x89, 0x86, 0x35, 0x5d, 0x46, 0x5c, 0xf7, 0x5f, ++ 0x41, 0xff, 0x03, 0xdc, 0x25, 0xc9, 0x57, 0x4d, 0xc1, 0xf6, 0xbb, 0x2b, ++ 0x8e, 0xc3, 0x5b, 0x2a, 0x7f, 0x43, 0x7e, 0xf5, 0xc5, 0x76, 0x89, 0xfc, ++ 0xf9, 0x84, 0x76, 0xae, 0xaf, 0x83, 0xf9, 0x62, 0xc4, 0xd0, 0x7c, 0xf1, ++ 0x3c, 0xe2, 0xf5, 0x5a, 0x7c, 0xa1, 0x8f, 0x03, 0x34, 0xbe, 0xd8, 0x71, ++ 0x2d, 0xbe, 0xe8, 0xfe, 0xc7, 0xf8, 0xe2, 0x97, 0xd1, 0xc2, 0xbf, 0x1d, ++ 0x96, 0x2f, 0xbe, 0x89, 0xc4, 0xf5, 0x3f, 0xd2, 0x51, 0x9c, 0xc8, 0xbe, ++ 0xc3, 0x8f, 0x69, 0x13, 0x7c, 0x30, 0xdc, 0xfd, 0x29, 0x56, 0xae, 0xd7, ++ 0xf4, 0xd7, 0xdb, 0x05, 0x3e, 0x77, 0x9b, 0x9a, 0x6f, 0xcf, 0x41, 0xb9, ++ 0xbf, 0xc3, 0xe0, 0x40, 0xb9, 0x06, 0xaa, 0xa7, 0xcc, 0x03, 0xfb, 0xb2, ++ 0x3b, 0x9c, 0x3f, 0xc7, 0x94, 0xd5, 0x69, 0xd8, 0xdf, 0xae, 0x70, 0x3d, ++ 0xb2, 0xbd, 0xdd, 0x4c, 0x7a, 0x64, 0xbb, 0xcd, 0xed, 0x26, 0x7b, 0x9d, ++ 0x64, 0x61, 0xe8, 0x27, 0x30, 0xc5, 0xdd, 0xf7, 0x43, 0xd4, 0x7f, 0xc9, ++ 0x16, 0x75, 0x5d, 0x10, 0xdf, 0x3e, 0x2a, 0xf4, 0x40, 0x8b, 0xd1, 0x37, ++ 0xe5, 0x33, 0xf4, 0x7f, 0x0f, 0x70, 0xfa, 0x4e, 0xbe, 0x23, 0x57, 0x36, ++ 0xc1, 0xb8, 0x11, 0xf7, 0x71, 0xb9, 0xce, 0x3f, 0x67, 0xda, 0x28, 0xc3, ++ 0x3c, 0x55, 0x31, 0x85, 0xbe, 0x68, 0x18, 0xdf, 0x17, 0xcd, 0xed, 0x62, ++ 0xdd, 0x19, 0x18, 0x05, 0x7c, 0x59, 0x7b, 0xc6, 0x44, 0xfa, 0xed, 0xcd, ++ 0xce, 0x23, 0x65, 0x4e, 0x1b, 0xf9, 0x37, 0x4e, 0xe4, 0xaf, 0x49, 0x7b, ++ 0x8e, 0x94, 0x15, 0x65, 0xe3, 0x78, 0xce, 0x47, 0xdd, 0xa2, 0xd5, 0xfa, ++ 0x53, 0x70, 0x4d, 0x31, 0x64, 0x76, 0x8e, 0x25, 0x01, 0x7e, 0x5d, 0xc2, ++ 0x4e, 0x4c, 0x61, 0x5c, 0x0f, 0xb9, 0x90, 0x3f, 0x72, 0x02, 0x7d, 0xe6, ++ 0x34, 0x52, 0x3c, 0xa6, 0xf1, 0x41, 0x15, 0x63, 0x59, 0x68, 0x27, 0xe6, ++ 0xf5, 0x39, 0x4a, 0x91, 0x8d, 0x2a, 0xcb, 0x43, 0xe9, 0x5b, 0xe5, 0x9b, ++ 0x45, 0x71, 0xdf, 0x82, 0xe3, 0xce, 0xd2, 0x08, 0x58, 0xd7, 0x02, 0x97, ++ 0xee, 0xbe, 0xa0, 0x7f, 0x95, 0x8e, 0xfe, 0xe0, 0x07, 0xff, 0x11, 0xe5, ++ 0xa4, 0x66, 0x73, 0x6f, 0xa7, 0x0d, 0xf9, 0x56, 0xe5, 0xf6, 0xb4, 0xc5, ++ 0xb4, 0x3a, 0x8b, 0xfb, 0x3d, 0xab, 0xd3, 0xd0, 0xff, 0xd7, 0xe4, 0x88, ++ 0x7e, 0x80, 0xa7, 0x96, 0x3f, 0x64, 0xbc, 0xb4, 0x2e, 0xc8, 0x8e, 0xab, ++ 0x31, 0x7c, 0x9d, 0x4f, 0x3b, 0x14, 0xba, 0xef, 0xe9, 0x33, 0x79, 0x6f, ++ 0x82, 0x4b, 0xff, 0x9b, 0xf1, 0xe7, 0x5a, 0x84, 0xbd, 0xf9, 0x46, 0xc8, ++ 0x71, 0xee, 0x23, 0xaf, 0x2f, 0x41, 0xfe, 0xcd, 0x5b, 0xe1, 0xdc, 0x87, ++ 0xf8, 0x5f, 0x1c, 0x27, 0xd3, 0xf5, 0xff, 0x64, 0x3e, 0x4b, 0x1a, 0xd2, ++ 0xc7, 0xa1, 0x90, 0xff, 0xd5, 0x62, 0x54, 0x8b, 0x3f, 0x93, 0x02, 0xe3, ++ 0x98, 0xe2, 0xca, 0xb0, 0xc1, 0xfd, 0x3d, 0xf1, 0xe1, 0x79, 0xf8, 0xfe, ++ 0xaa, 0x18, 0xf7, 0xb7, 0x48, 0x27, 0xa6, 0xf8, 0xbb, 0xf1, 0xb9, 0x49, ++ 0x53, 0x73, 0xf3, 0x50, 0xae, 0x6c, 0x13, 0x9a, 0x62, 0xd1, 0xfe, 0x68, ++ 0x70, 0x03, 0x5c, 0xe5, 0x9b, 0x6c, 0x01, 0x38, 0x34, 0xb8, 0xce, 0x0b, ++ 0xfd, 0x53, 0x15, 0xb3, 0xf4, 0x5b, 0xc4, 0x03, 0x3e, 0x87, 0x7a, 0xa5, ++ 0xed, 0xd4, 0x59, 0x0b, 0x3e, 0xaf, 0xd1, 0xbd, 0xa5, 0xe3, 0x12, 0xa7, ++ 0x77, 0x10, 0xfd, 0x91, 0xde, 0x01, 0xfa, 0x4b, 0xf7, 0x60, 0x5f, 0xc3, ++ 0x83, 0x45, 0xb4, 0x5a, 0xff, 0x9f, 0xa7, 0xbf, 0x6f, 0x24, 0xd2, 0x63, ++ 0x58, 0xfa, 0x63, 0xdc, 0x1f, 0xf9, 0x3f, 0xa2, 0xff, 0xa8, 0x98, 0x21, ++ 0xe8, 0x0f, 0xfe, 0x54, 0x3a, 0x5e, 0xd7, 0xfc, 0xa9, 0x16, 0x13, 0xf8, ++ 0xd5, 0xd9, 0x81, 0xbe, 0x46, 0xf7, 0x2a, 0x7b, 0x21, 0x8d, 0x73, 0x98, ++ 0x60, 0x65, 0xe8, 0x3f, 0x75, 0x42, 0x5c, 0x89, 0x72, 0xe8, 0x8e, 0x46, ++ 0xe7, 0x86, 0xed, 0xb4, 0xf3, 0x77, 0xf5, 0xff, 0xe1, 0xec, 0x28, 0x70, ++ 0x01, 0xd9, 0xa4, 0x98, 0x18, 0x2e, 0x4f, 0x26, 0xff, 0x18, 0xf4, 0x37, ++ 0x26, 0xf8, 0x24, 0xf2, 0xfb, 0x26, 0x80, 0xc0, 0xdf, 0x45, 0x7e, 0xd6, ++ 0x48, 0xd2, 0x77, 0x0e, 0x81, 0x1f, 0x76, 0x56, 0x92, 0xce, 0x66, 0x70, ++ 0x17, 0xfc, 0xdb, 0x14, 0xf4, 0xff, 0x7c, 0xb1, 0x28, 0x07, 0x13, 0xcc, ++ 0x15, 0x3e, 0xe4, 0xf7, 0x1d, 0xd6, 0x19, 0x29, 0xe8, 0xbf, 0xe5, 0x5a, ++ 0xa7, 0xa7, 0x21, 0x3f, 0xbd, 0x91, 0xf1, 0xc8, 0x21, 0x34, 0x39, 0x6f, ++ 0x24, 0xaf, 0xd8, 0xf9, 0xb2, 0x1a, 0xf0, 0x73, 0x34, 0xbd, 0xb6, 0x4f, ++ 0x4c, 0xab, 0xbd, 0xbf, 0x2c, 0x86, 0xd3, 0xff, 0x56, 0x50, 0xb3, 0xe8, ++ 0xef, 0xa1, 0x6b, 0x18, 0x0c, 0x87, 0xa6, 0xbf, 0x91, 0x2c, 0x08, 0x87, ++ 0xe4, 0xab, 0x32, 0x7c, 0x6b, 0x25, 0x7d, 0xdc, 0xde, 0x07, 0xf8, 0xba, ++ 0x15, 0xe1, 0x00, 0xbc, 0x76, 0x49, 0xac, 0x15, 0xf5, 0x77, 0xa1, 0xc1, ++ 0x19, 0x57, 0x8c, 0xfe, 0x58, 0xbc, 0x4f, 0xe1, 0x7e, 0xdd, 0x57, 0xa3, ++ 0x54, 0xe0, 0x9b, 0x8a, 0xf6, 0x77, 0x8e, 0x23, 0xbc, 0x15, 0x16, 0x9b, ++ 0x0f, 0xf3, 0x2d, 0xcc, 0x61, 0x3c, 0xdf, 0x17, 0x94, 0x2f, 0xd1, 0xfb, ++ 0xb9, 0x9a, 0x5f, 0xa2, 0xf9, 0xfd, 0x9a, 0xdf, 0xa2, 0xc5, 0x97, 0xe8, ++ 0xdf, 0xe0, 0xfd, 0x7c, 0xbc, 0x0e, 0xf0, 0xdb, 0xcd, 0x00, 0x20, 0xda, ++ 0x1f, 0x9f, 0xc5, 0xdb, 0x00, 0xef, 0x7f, 0xee, 0xb2, 0x9a, 0xe9, 0x14, ++ 0xf2, 0xaa, 0xc0, 0x3a, 0x2a, 0xc4, 0x3a, 0xe6, 0xb0, 0x5e, 0x82, 0x8b, ++ 0x7d, 0xf3, 0xed, 0xb7, 0xd3, 0x81, 0x3e, 0xb3, 0x05, 0x3e, 0x2a, 0xba, ++ 0x21, 0x2e, 0xcc, 0xc1, 0xfb, 0x8c, 0xdd, 0x01, 0x78, 0xb8, 0x43, 0xe1, ++ 0xf1, 0xe2, 0x1d, 0x0e, 0x88, 0x0f, 0x83, 0xf8, 0x68, 0xce, 0xe4, 0xd0, ++ 0x3e, 0xfe, 0x66, 0x24, 0x04, 0xe6, 0xb9, 0xd6, 0x78, 0xbd, 0xfe, 0x9f, ++ 0x26, 0xf2, 0x05, 0xff, 0x6c, 0x9c, 0xa9, 0xb5, 0xdd, 0x60, 0x87, 0x4e, ++ 0x03, 0x03, 0x1c, 0xac, 0xe7, 0x31, 0xcd, 0xd4, 0xd1, 0xb2, 0x47, 0xc1, ++ 0x78, 0xc0, 0x9d, 0x69, 0x40, 0x7e, 0xac, 0x13, 0x76, 0x0d, 0xc2, 0xe4, ++ 0xa1, 0xed, 0x91, 0x90, 0xd7, 0xa9, 0x86, 0xbe, 0x1c, 0x07, 0xe0, 0xb7, ++ 0x6b, 0xcf, 0xd7, 0x64, 0xff, 0xf6, 0xee, 0xf9, 0xfa, 0x43, 0xf4, 0xe7, ++ 0xa6, 0x7c, 0xae, 0x30, 0x33, 0x3c, 0x3f, 0xf5, 0xf3, 0xfc, 0x28, 0xd4, ++ 0x0f, 0xcc, 0x15, 0x3a, 0x6f, 0xdd, 0x9f, 0x5a, 0xad, 0x8c, 0x5f, 0x27, ++ 0xfe, 0xa9, 0x15, 0x6b, 0xdf, 0x5f, 0x8f, 0x19, 0x31, 0x84, 0xcf, 0x42, ++ 0xed, 0x6f, 0xcf, 0x3f, 0xb7, 0x1e, 0xe7, 0xfb, 0xe2, 0x8c, 0xc2, 0x79, ++ 0x5b, 0xbc, 0xbf, 0xcc, 0xe4, 0x4e, 0xb7, 0xdb, 0xb0, 0xe5, 0xf1, 0xfe, ++ 0x7e, 0x89, 0xfb, 0x3b, 0xda, 0xfd, 0xfd, 0x46, 0x80, 0x1b, 0xae, 0x6f, ++ 0x8a, 0xd1, 0xe2, 0xfe, 0x5e, 0x85, 0xf2, 0x33, 0xf0, 0x33, 0x07, 0xd1, ++ 0xf9, 0x0e, 0x8c, 0xf7, 0x73, 0x03, 0x74, 0xbd, 0xe3, 0x5c, 0xf9, 0xe7, ++ 0x4a, 0xce, 0x60, 0xfa, 0xe0, 0xef, 0xff, 0x47, 0xbc, 0xaf, 0xc5, 0xf9, ++ 0x6f, 0x8a, 0xf8, 0x81, 0xed, 0x3b, 0x61, 0x52, 0x01, 0xae, 0x99, 0xad, ++ 0x0f, 0x29, 0xe8, 0x47, 0xcf, 0x4c, 0x92, 0x99, 0x33, 0xe8, 0xbd, 0xb7, ++ 0xa9, 0x56, 0xe6, 0x0c, 0x8a, 0xf7, 0x5f, 0x8f, 0xd1, 0xf9, 0x21, 0xfb, ++ 0x5e, 0x5d, 0x3f, 0x1b, 0xec, 0x48, 0x5d, 0x8f, 0xec, 0x08, 0x43, 0x79, ++ 0x6d, 0xdf, 0x7e, 0x28, 0x07, 0xfb, 0xbd, 0xb2, 0xc3, 0x3a, 0x04, 0x1f, ++ 0xe9, 0xf1, 0x3b, 0xb3, 0xfd, 0x21, 0x05, 0xf9, 0x3f, 0x21, 0x96, 0xcb, ++ 0xcd, 0xb5, 0xde, 0x3f, 0x75, 0x1c, 0xf0, 0xc9, 0xcd, 0x48, 0x77, 0x46, ++ 0x7e, 0xdc, 0xc5, 0x02, 0x89, 0xe4, 0x48, 0x4f, 0xdf, 0xbd, 0x7b, 0x7e, ++ 0x11, 0xdb, 0x97, 0x3d, 0x3c, 0xbe, 0x87, 0xa3, 0xbf, 0x9e, 0x0e, 0xbf, ++ 0x3d, 0x5f, 0x14, 0x85, 0x78, 0xb9, 0x16, 0x3d, 0xf4, 0x7c, 0xdb, 0x09, ++ 0xeb, 0xf4, 0xc0, 0xfa, 0x7c, 0xb0, 0x4e, 0x0f, 0xf8, 0x5b, 0x7b, 0xeb, ++ 0xed, 0xd4, 0x7f, 0xab, 0x3e, 0x89, 0xfa, 0x1a, 0xbf, 0xd6, 0x75, 0xfc, ++ 0x2a, 0x16, 0xfd, 0x35, 0x8d, 0x4f, 0x4b, 0x63, 0x39, 0xdf, 0x4c, 0xd9, ++ 0xbd, 0x3e, 0x96, 0xd9, 0x02, 0xf4, 0xd2, 0xf0, 0x75, 0x51, 0xd0, 0xad, ++ 0x8a, 0x39, 0x16, 0xcc, 0x86, 0x3f, 0x77, 0x49, 0x8e, 0x08, 0xd2, 0x13, ++ 0x1e, 0xd6, 0x9b, 0x54, 0x10, 0xb0, 0x57, 0x55, 0xc7, 0xca, 0xc8, 0xcf, ++ 0xd0, 0xec, 0x55, 0x95, 0x9c, 0x6d, 0x44, 0xfd, 0xab, 0xd9, 0x2b, 0x4c, ++ 0x0b, 0xa3, 0x3e, 0xd3, 0xdb, 0xa7, 0x05, 0xe9, 0x85, 0x46, 0x54, 0xab, ++ 0x7a, 0xbb, 0x04, 0x0b, 0x34, 0x22, 0xff, 0x56, 0x2d, 0x0a, 0xbd, 0x5e, ++ 0xde, 0xd3, 0xac, 0x44, 0x50, 0xcf, 0x40, 0x74, 0x92, 0x24, 0x81, 0x0f, ++ 0xe1, 0x57, 0x6b, 0xf0, 0x7c, 0xc0, 0x5c, 0x04, 0xaf, 0x9e, 0x9e, 0x1a, ++ 0x7c, 0x7a, 0xb8, 0x34, 0x7f, 0xba, 0x4a, 0xd0, 0x0d, 0xd6, 0x59, 0x8a, ++ 0x4b, 0x9f, 0xa7, 0x16, 0xd2, 0x3a, 0x06, 0xd9, 0x55, 0xb1, 0xde, 0xeb, ++ 0xb5, 0xa7, 0xe6, 0xd8, 0xd0, 0x38, 0xeb, 0xca, 0xb9, 0x92, 0xf7, 0x72, ++ 0x86, 0xe0, 0xd7, 0xe1, 0xf8, 0x56, 0x7f, 0x5f, 0xd3, 0x03, 0x65, 0xf8, ++ 0x82, 0x5c, 0x6a, 0x3d, 0xe8, 0x47, 0x24, 0xc4, 0x26, 0x10, 0xbd, 0xca, ++ 0xae, 0x9a, 0x98, 0x13, 0xec, 0x05, 0x1b, 0x19, 0xc6, 0x3e, 0x0d, 0xce, ++ 0xbf, 0xbf, 0x9c, 0x49, 0xf6, 0xee, 0x61, 0x61, 0x7f, 0x87, 0xe3, 0x9b, ++ 0xda, 0xab, 0x06, 0xe6, 0x8e, 0x0d, 0xf0, 0x8f, 0xb1, 0xed, 0x59, 0x2b, ++ 0xf2, 0xcf, 0x6e, 0xa5, 0xd9, 0x8a, 0x79, 0xc7, 0x5b, 0x6c, 0x73, 0x1b, ++ 0xa3, 0x00, 0x4f, 0x25, 0x7f, 0x2a, 0x9a, 0x8f, 0x7e, 0x5d, 0x5d, 0x9f, ++ 0x81, 0x61, 0x6a, 0xaa, 0xb4, 0xfd, 0xd2, 0x3e, 0x8c, 0xdb, 0xeb, 0x8e, ++ 0x33, 0x07, 0xea, 0xc3, 0xa2, 0xf6, 0xae, 0x62, 0xe4, 0xb7, 0xb7, 0x94, ++ 0x5e, 0x99, 0xe2, 0xe8, 0x2f, 0x18, 0x7b, 0x36, 0xc8, 0x3f, 0x6c, 0x6b, ++ 0x6f, 0xb4, 0xa2, 0xff, 0xd4, 0x16, 0x27, 0x53, 0x9c, 0xbe, 0x3f, 0x9a, ++ 0xf3, 0xa3, 0x76, 0xbf, 0x25, 0x96, 0xf3, 0x5f, 0xdb, 0x99, 0xcb, 0xb3, ++ 0x9d, 0x43, 0xdc, 0xff, 0x54, 0xdc, 0x2f, 0x39, 0x95, 0x6b, 0x44, 0x23, ++ 0xd9, 0x1f, 0x1f, 0x41, 0xf9, 0x86, 0xb2, 0x27, 0x0d, 0xb4, 0xfe, 0x12, ++ 0xc9, 0x5e, 0x59, 0x81, 0xfe, 0xc7, 0x6d, 0x46, 0xf2, 0xeb, 0x21, 0x6e, ++ 0xf9, 0xe3, 0x0f, 0x31, 0xdf, 0xd4, 0x66, 0xde, 0x8e, 0xa9, 0xfa, 0xd2, ++ 0xb6, 0x1f, 0x3f, 0x64, 0x07, 0x42, 0xb4, 0xfc, 0x9f, 0x4f, 0x1b, 0xcc, ++ 0x98, 0x3f, 0x98, 0x2b, 0x39, 0x5e, 0x82, 0x71, 0x65, 0xaa, 0xbf, 0x0b, ++ 0xfb, 0x65, 0xf3, 0x53, 0x69, 0x1f, 0x66, 0xd2, 0xff, 0x95, 0xc9, 0x7f, ++ 0xf5, 0xdf, 0x29, 0x51, 0xde, 0xa3, 0x0c, 0xd8, 0x05, 0xfb, 0x65, 0x77, ++ 0xa5, 0x7a, 0x31, 0xff, 0xb0, 0x47, 0xe2, 0x7d, 0x4f, 0x07, 0xcf, 0xfb, ++ 0x33, 0xbb, 0x27, 0x76, 0x36, 0xbc, 0xe7, 0xfd, 0x8a, 0xd8, 0x09, 0xeb, ++ 0x88, 0xa7, 0xb4, 0xfe, 0x4d, 0xb9, 0xeb, 0x98, 0x60, 0xe0, 0xa0, 0x78, ++ 0xea, 0x91, 0x5d, 0x7c, 0xff, 0xe8, 0x91, 0x52, 0x89, 0xf6, 0x8f, 0x4a, ++ 0xed, 0x29, 0xcc, 0x13, 0xc4, 0x57, 0x65, 0x4f, 0x02, 0x3d, 0xf3, 0x80, ++ 0x1f, 0xdb, 0x13, 0x8b, 0x90, 0x7f, 0x2b, 0xcb, 0x65, 0xe6, 0x0d, 0xe2, ++ 0xeb, 0x05, 0x2e, 0x2b, 0xf3, 0x06, 0x8d, 0xdf, 0x1f, 0xc6, 0xe1, 0xf1, ++ 0x4b, 0x66, 0x2f, 0xe6, 0x4b, 0x34, 0x79, 0x9d, 0x25, 0xf8, 0xbb, 0x6a, ++ 0x51, 0x6c, 0xc8, 0xf8, 0xb9, 0x8c, 0xfb, 0x89, 0x8b, 0x58, 0xb3, 0x11, ++ 0xe5, 0xbb, 0x4e, 0xc0, 0x53, 0x57, 0x08, 0xf0, 0xc0, 0xf3, 0xb3, 0x44, ++ 0x9c, 0x7a, 0xa7, 0x3b, 0x25, 0xe4, 0xbd, 0x15, 0x98, 0x05, 0x81, 0xa1, ++ 0x59, 0x71, 0xa3, 0xc9, 0x3e, 0xce, 0xf9, 0xa2, 0x8f, 0xcc, 0xea, 0x5c, ++ 0xf9, 0xe4, 0xb1, 0x25, 0xf0, 0x1e, 0x96, 0xc1, 0xe5, 0x43, 0x93, 0xb3, ++ 0x52, 0xb9, 0xba, 0x89, 0xf8, 0x20, 0x49, 0x72, 0x60, 0x7c, 0xbc, 0x40, ++ 0x02, 0xaf, 0x52, 0x46, 0x7d, 0x17, 0x2a, 0x47, 0x73, 0x26, 0x87, 0xf6, ++ 0xe7, 0x3a, 0xf5, 0xfa, 0x21, 0x54, 0xde, 0xf5, 0x7a, 0x5c, 0x93, 0xf3, ++ 0x05, 0x1d, 0xb2, 0x11, 0xe3, 0xe8, 0x05, 0x85, 0x92, 0x83, 0x0d, 0xa1, ++ 0x0f, 0xf4, 0xfe, 0xb4, 0x5e, 0x0f, 0x4c, 0x32, 0x38, 0xde, 0xc6, 0xb8, ++ 0x7a, 0xde, 0x55, 0x27, 0xf1, 0xd7, 0x20, 0x3d, 0x70, 0xb2, 0xfc, 0x1f, ++ 0xd2, 0x03, 0x6f, 0x82, 0x6c, 0x4d, 0x06, 0x79, 0xfd, 0x89, 0xa6, 0x0f, ++ 0x6e, 0x60, 0x37, 0xa0, 0x3e, 0x28, 0x95, 0xb7, 0xac, 0x47, 0xfe, 0xe8, ++ 0x07, 0xbb, 0x66, 0x1e, 0x82, 0x3f, 0x34, 0xbb, 0xa0, 0xc5, 0xdb, 0x65, ++ 0x20, 0x9f, 0xc8, 0x0f, 0xec, 0x3c, 0xdf, 0x97, 0x28, 0xbd, 0x0a, 0x72, ++ 0x1a, 0x1b, 0x88, 0xb7, 0x07, 0xf4, 0x03, 0xf8, 0x0d, 0x8e, 0x21, 0xfc, ++ 0x99, 0x5f, 0xc7, 0xa6, 0x85, 0xec, 0x27, 0x0d, 0xe8, 0x8b, 0x20, 0xbf, ++ 0xc1, 0x58, 0xf0, 0xcf, 0xfb, 0x0d, 0xa5, 0xe0, 0x2f, 0x9a, 0x72, 0x11, ++ 0xbe, 0x91, 0xcc, 0x93, 0x47, 0x7a, 0x8a, 0xf2, 0x7b, 0xd0, 0xfa, 0x28, ++ 0xcf, 0x96, 0x74, 0x89, 0xf2, 0x28, 0x75, 0x10, 0xc7, 0x53, 0x3c, 0xcf, ++ 0x7e, 0x45, 0x70, 0xa1, 0x5e, 0x93, 0x62, 0x02, 0x7c, 0xaf, 0xf7, 0x27, ++ 0xb4, 0x3c, 0xed, 0x08, 0x91, 0x27, 0xd0, 0xf3, 0xc3, 0x40, 0xde, 0x6e, ++ 0xbe, 0xd1, 0x8b, 0x7c, 0xa6, 0xf1, 0x43, 0x99, 0x9d, 0xcb, 0x45, 0xd9, ++ 0x7c, 0x99, 0xf2, 0xe7, 0x7a, 0xfe, 0xd0, 0xde, 0x77, 0x2d, 0xbe, 0xf0, ++ 0x49, 0xc0, 0x17, 0xd2, 0x77, 0xf0, 0x85, 0x90, 0xa7, 0xeb, 0xe5, 0x8b, ++ 0x43, 0x1a, 0x3f, 0xa4, 0xb3, 0xf4, 0xeb, 0xe1, 0x07, 0x8d, 0x0f, 0x34, ++ 0xbe, 0xd0, 0xdb, 0x8b, 0x83, 0xba, 0xbc, 0xcb, 0x70, 0xf6, 0xe2, 0xe4, ++ 0x35, 0xec, 0xc5, 0xdb, 0x19, 0x46, 0xd2, 0xcb, 0x7a, 0x3b, 0xa1, 0xd9, ++ 0x85, 0x03, 0x71, 0x5c, 0xff, 0x8e, 0x8f, 0xe5, 0xfb, 0x14, 0xb3, 0x32, ++ 0x17, 0xd8, 0xd0, 0xaf, 0x18, 0x81, 0xfa, 0x00, 0xfd, 0x3d, 0x61, 0x6f, ++ 0x06, 0xf2, 0x46, 0x1b, 0x38, 0x1f, 0xbc, 0xdd, 0xb7, 0x4c, 0x91, 0xd0, ++ 0x6e, 0xa0, 0x1e, 0x48, 0x0d, 0xc2, 0xbb, 0xc8, 0x9b, 0x6a, 0x7c, 0x57, ++ 0xfb, 0x24, 0xa3, 0xfc, 0x61, 0x85, 0xd0, 0x3f, 0x17, 0x3b, 0x78, 0x3e, ++ 0xad, 0xae, 0x44, 0xf6, 0x5a, 0xe0, 0xcf, 0xe2, 0xf6, 0x67, 0xd7, 0xf3, ++ 0xbe, 0x91, 0xf2, 0x6d, 0x85, 0x4a, 0x97, 0x62, 0x81, 0x79, 0xe7, 0x38, ++ 0x24, 0x07, 0xe6, 0x6b, 0x9c, 0x22, 0xff, 0x36, 0xfb, 0xaa, 0xc9, 0xab, ++ 0x52, 0x7e, 0x7e, 0xe8, 0xfd, 0xf4, 0x4a, 0xc1, 0x37, 0x18, 0xe7, 0xe0, ++ 0xf8, 0x39, 0x4e, 0xc9, 0x0b, 0x21, 0xe8, 0x20, 0x3d, 0x54, 0x79, 0x95, ++ 0xdb, 0x7d, 0xbd, 0x3e, 0xaa, 0x14, 0xfb, 0xe5, 0x95, 0xba, 0xfd, 0x72, ++ 0x53, 0x9c, 0xa0, 0xeb, 0x8d, 0xec, 0xc6, 0x7f, 0xa5, 0xdd, 0x8f, 0x8f, ++ 0x4b, 0xe0, 0x72, 0x33, 0x0c, 0x1d, 0xb5, 0xe7, 0x35, 0x3a, 0x6a, 0xf4, ++ 0x9b, 0x80, 0x63, 0x51, 0x7e, 0xf6, 0x7d, 0x65, 0x52, 0x23, 0xb8, 0x7f, ++ 0x8c, 0xf4, 0x9b, 0x79, 0x55, 0xa1, 0x79, 0x46, 0xc5, 0x85, 0xfa, 0x2d, ++ 0x5f, 0x9c, 0xcf, 0xfd, 0x4f, 0x8a, 0xe9, 0xc4, 0xf8, 0xba, 0xf6, 0x4b, ++ 0x26, 0xf7, 0xf8, 0xe1, 0xe1, 0xbf, 0x96, 0x5f, 0x7a, 0xa3, 0xe6, 0x87, ++ 0x0b, 0xbf, 0x5c, 0x7b, 0xef, 0x2c, 0x90, 0xf1, 0x14, 0x74, 0x0c, 0x75, ++ 0xf6, 0x43, 0x7b, 0xcf, 0x35, 0xed, 0x85, 0x78, 0x5e, 0x4f, 0xa7, 0xc9, ++ 0x71, 0xa1, 0xf1, 0x84, 0x46, 0x0f, 0x4d, 0x8f, 0x0e, 0xc2, 0xb7, 0xd0, ++ 0xb3, 0xc3, 0xd1, 0xeb, 0x5a, 0x7a, 0x56, 0xd3, 0x67, 0xff, 0x6a, 0x3d, ++ 0xab, 0xcd, 0xaf, 0xd9, 0x01, 0xed, 0xbd, 0x7a, 0xfd, 0x3b, 0x5c, 0x7c, ++ 0xa6, 0xe9, 0xd3, 0x27, 0x36, 0x1a, 0x28, 0x2f, 0x72, 0x8b, 0x88, 0x83, ++ 0x6f, 0x11, 0x79, 0xd6, 0xfb, 0x85, 0x9c, 0xaf, 0x10, 0xfa, 0xb6, 0xff, ++ 0xaf, 0x16, 0x03, 0xfa, 0x59, 0xdb, 0x3a, 0xb9, 0x3f, 0xe2, 0x30, 0xdb, ++ 0x0f, 0xa1, 0xdf, 0x10, 0xc8, 0xe7, 0x71, 0xba, 0x3e, 0x1e, 0xc1, 0x3c, ++ 0xb8, 0x5f, 0xce, 0x94, 0x5e, 0x0b, 0xed, 0x5f, 0x16, 0x01, 0x49, 0x71, ++ 0xff, 0x32, 0x99, 0xef, 0x5f, 0x6e, 0x51, 0x7c, 0x2e, 0xd2, 0xd3, 0x0e, ++ 0x85, 0x35, 0x80, 0xbc, 0xfc, 0x4d, 0xe4, 0x2d, 0x1e, 0xdf, 0xeb, 0x59, ++ 0x82, 0x7a, 0xfa, 0xf1, 0xd3, 0x63, 0x0c, 0xb4, 0x8f, 0xae, 0xf8, 0x7a, ++ 0x31, 0x2e, 0x9e, 0x94, 0xab, 0xd0, 0x7e, 0x50, 0xb4, 0x59, 0xa5, 0x7c, ++ 0xef, 0xc5, 0x0e, 0xb3, 0x1d, 0x9f, 0xeb, 0xdf, 0xfd, 0x83, 0x2e, 0x23, ++ 0xce, 0xf3, 0x57, 0xe6, 0xc0, 0x50, 0xed, 0xad, 0x0e, 0xf3, 0xc0, 0x7e, ++ 0x0c, 0xea, 0x85, 0x52, 0xb9, 0x47, 0xc6, 0xbc, 0x7c, 0xbf, 0x1f, 0x7c, ++ 0x71, 0x18, 0x3f, 0x7d, 0x91, 0xaf, 0x18, 0xe3, 0x9d, 0x5b, 0x58, 0x6f, ++ 0x23, 0xc6, 0xd5, 0x53, 0x91, 0x8e, 0x43, 0xd0, 0xef, 0x15, 0x9d, 0x7d, ++ 0xd1, 0xe7, 0xed, 0x8b, 0x3b, 0xb8, 0x9f, 0x54, 0x1c, 0xc1, 0xeb, 0x7e, ++ 0x66, 0x00, 0x1a, 0xf1, 0xbd, 0x33, 0xda, 0x4c, 0xe4, 0x17, 0x5e, 0x2b, ++ 0x6f, 0x5f, 0xf8, 0x05, 0x23, 0x7f, 0x69, 0x50, 0xbe, 0xbe, 0x8d, 0xeb, ++ 0x19, 0x18, 0x44, 0x7c, 0x72, 0xbd, 0x79, 0xfb, 0xa9, 0xe8, 0xeb, 0x01, ++ 0x1f, 0xff, 0x54, 0xa7, 0x77, 0xd8, 0x30, 0xf9, 0xfb, 0x6d, 0x26, 0xbe, ++ 0x9f, 0xe3, 0x3f, 0x62, 0x64, 0xe8, 0xf7, 0xb2, 0x73, 0x71, 0x43, 0xe6, ++ 0x5d, 0xae, 0x95, 0xc7, 0xdf, 0xdd, 0x19, 0xee, 0x54, 0x23, 0x71, 0xdf, ++ 0x8d, 0xfb, 0xe7, 0xbb, 0x3b, 0x93, 0x9d, 0x6a, 0xce, 0xf0, 0xe3, 0x73, ++ 0xfa, 0xfc, 0x45, 0x98, 0xaf, 0xdc, 0xb6, 0x65, 0x9e, 0x42, 0x71, 0xa2, ++ 0xc8, 0x7f, 0x0e, 0xda, 0x17, 0xd1, 0xe1, 0x6f, 0x87, 0xc4, 0x9a, 0xac, ++ 0x98, 0x4f, 0x6b, 0x77, 0x94, 0x60, 0xfc, 0x31, 0xdc, 0x3e, 0x47, 0x91, ++ 0xdf, 0x49, 0xf3, 0x5e, 0x2f, 0xde, 0x18, 0x6b, 0xe6, 0x74, 0x16, 0xf5, ++ 0x4b, 0xb7, 0x0a, 0x19, 0xdb, 0x76, 0x36, 0xdc, 0x89, 0xfc, 0xbd, 0xed, ++ 0x6c, 0xb2, 0x13, 0xe1, 0xd9, 0x2d, 0xf8, 0x53, 0xe3, 0xf7, 0xdd, 0x67, ++ 0x2e, 0x87, 0xd3, 0x7e, 0xa6, 0xc9, 0xa9, 0xe2, 0x3e, 0xb0, 0x3f, 0xda, ++ 0xe2, 0x78, 0x89, 0xf8, 0x95, 0xf3, 0x79, 0xcb, 0x88, 0x31, 0x5e, 0xdc, ++ 0x6f, 0xdd, 0x2e, 0xe4, 0x61, 0x5b, 0xb8, 0xff, 0x60, 0x56, 0x5c, 0xf0, ++ 0x7e, 0x06, 0xdf, 0xbf, 0xe8, 0xac, 0xf7, 0x54, 0x9e, 0x49, 0xa7, 0xfd, ++ 0x6e, 0x09, 0xf3, 0x8d, 0xda, 0x3e, 0xb1, 0x07, 0xe4, 0x85, 0xea, 0x72, ++ 0x62, 0x18, 0xf1, 0x93, 0x91, 0xb5, 0x30, 0x7c, 0x6f, 0xa3, 0x93, 0xfd, ++ 0x02, 0xdb, 0x19, 0xd3, 0xd5, 0x28, 0xc4, 0xf7, 0xe5, 0x38, 0x6d, 0x3f, ++ 0x52, 0x8d, 0xa2, 0x3c, 0xc3, 0x37, 0x57, 0x0a, 0x5c, 0xe3, 0x07, 0xe3, ++ 0x7d, 0x47, 0xbd, 0x8b, 0xea, 0x49, 0x5a, 0xeb, 0x17, 0x55, 0x2a, 0x00, ++ 0xe3, 0x1b, 0xf5, 0x6e, 0x6a, 0xdb, 0xea, 0x57, 0x50, 0xbb, 0xa7, 0x7e, ++ 0x35, 0xdd, 0x5f, 0x7b, 0x28, 0xf2, 0x51, 0xb4, 0xfb, 0x75, 0xce, 0x85, ++ 0x95, 0x4a, 0x90, 0xde, 0xf8, 0x34, 0x9e, 0xe7, 0x97, 0x72, 0xb3, 0x4e, ++ 0x17, 0x23, 0x9f, 0xb3, 0xaf, 0x19, 0xc3, 0x78, 0x67, 0xc6, 0x63, 0x7d, ++ 0x32, 0xea, 0x89, 0x5b, 0xaf, 0xc2, 0x3a, 0x42, 0xea, 0x46, 0x94, 0xcb, ++ 0x88, 0x67, 0xca, 0x5f, 0xa6, 0x05, 0xfa, 0xa9, 0xd2, 0xd2, 0x30, 0xe4, ++ 0xcb, 0x5b, 0xaf, 0x42, 0x3f, 0x68, 0xbc, 0x14, 0x1f, 0xcd, 0xe9, 0xd0, ++ 0xa4, 0x34, 0xdd, 0x54, 0x40, 0xd2, 0x42, 0xfc, 0x10, 0x16, 0xef, 0xbc, ++ 0x18, 0x07, 0xd7, 0x7f, 0x6c, 0x77, 0xf9, 0xe3, 0xe2, 0x91, 0x0f, 0xaa, ++ 0xf6, 0x5d, 0x60, 0xd4, 0xbf, 0x8c, 0xd7, 0x77, 0x48, 0x77, 0xca, 0x17, ++ 0x60, 0x5c, 0x9e, 0xaf, 0x90, 0xf2, 0xc6, 0x79, 0x98, 0x37, 0xce, 0xa5, ++ 0x69, 0x97, 0x20, 0xfe, 0x26, 0x76, 0x99, 0x68, 0xdf, 0x5b, 0xcb, 0xdf, ++ 0xe6, 0x8a, 0x79, 0x9d, 0x5f, 0x86, 0xe6, 0x91, 0xf3, 0x44, 0xde, 0xf6, ++ 0x0d, 0xd6, 0x47, 0xf9, 0xe4, 0x7c, 0x0b, 0x04, 0x56, 0x06, 0x84, 0x8b, ++ 0xd3, 0xcf, 0x29, 0x2d, 0x48, 0x92, 0x30, 0xdf, 0x17, 0x6f, 0x72, 0x60, ++ 0xbd, 0xc2, 0xc4, 0x34, 0x57, 0x1e, 0xe6, 0x5b, 0xbb, 0xe2, 0x19, 0xe5, ++ 0x4f, 0xbb, 0xba, 0x12, 0x46, 0xaa, 0x80, 0x07, 0xa7, 0xc2, 0xf3, 0xba, ++ 0x4e, 0x2d, 0xaf, 0xcb, 0xbe, 0x3b, 0xaf, 0xdb, 0xfd, 0x49, 0xa4, 0x87, ++ 0xf4, 0x15, 0xf8, 0x29, 0xa8, 0x9f, 0xba, 0x8f, 0x46, 0x3a, 0x7c, 0xb4, ++ 0xff, 0x67, 0x21, 0xff, 0x6f, 0x07, 0x3e, 0x88, 0xf5, 0x0d, 0xe1, 0xbc, ++ 0x5e, 0x80, 0xcd, 0x9f, 0x4f, 0x79, 0xf4, 0x5b, 0x2d, 0x7c, 0x1d, 0x60, ++ 0x7f, 0xe2, 0xe3, 0x29, 0xef, 0xe7, 0xdb, 0x77, 0x18, 0x9e, 0xfb, 0xdd, ++ 0x65, 0xc6, 0xf7, 0x11, 0x7b, 0x4f, 0xd2, 0xfe, 0x74, 0xb1, 0x21, 0x33, ++ 0xb1, 0x0f, 0xe0, 0xdc, 0x27, 0x8d, 0x8d, 0xc2, 0xf6, 0x85, 0x4f, 0x22, ++ 0xb3, 0xa9, 0x3d, 0x1a, 0x79, 0x1e, 0xf1, 0xd3, 0x69, 0xb0, 0xaa, 0xf8, ++ 0xde, 0x0f, 0xea, 0x59, 0x25, 0xd6, 0x9d, 0x39, 0xdf, 0xb3, 0xd1, 0x7e, ++ 0xc6, 0x8c, 0xf7, 0x6c, 0x0a, 0xb6, 0x87, 0xeb, 0xfb, 0xa8, 0x1e, 0xed, ++ 0xbd, 0xfa, 0x73, 0xd4, 0x1e, 0xa9, 0xf7, 0x53, 0x7b, 0xb4, 0xfe, 0x2a, ++ 0xb5, 0x6f, 0xc3, 0x75, 0xe4, 0x9f, 0x43, 0xf0, 0x3c, 0xb6, 0xb9, 0x4b, ++ 0x22, 0xe8, 0xb9, 0x1d, 0x8b, 0x23, 0x4c, 0x08, 0x6f, 0x67, 0x24, 0xdb, ++ 0xa2, 0xbd, 0x07, 0xeb, 0xcd, 0x7c, 0xe1, 0xbe, 0x56, 0x4c, 0xe6, 0xbf, ++ 0x1b, 0xff, 0xd9, 0x3a, 0xcb, 0x0d, 0x60, 0xef, 0xcc, 0xee, 0xf1, 0xd2, ++ 0x04, 0xc6, 0x4e, 0xc4, 0x7f, 0x36, 0x4b, 0x81, 0xfe, 0xa1, 0x99, 0xa3, ++ 0xfe, 0xfd, 0xaf, 0x70, 0xff, 0xf7, 0x3f, 0xbd, 0xb0, 0xce, 0x02, 0x70, ++ 0xcd, 0x3f, 0x6a, 0x6b, 0xed, 0x81, 0xfe, 0x27, 0x3f, 0xbd, 0xb8, 0xce, ++ 0x86, 0x7a, 0xf6, 0x50, 0x38, 0x28, 0x3b, 0xd4, 0x1b, 0xfd, 0x07, 0x41, ++ 0xd2, 0x59, 0x1e, 0xda, 0xf4, 0x64, 0xc6, 0x15, 0xec, 0x64, 0xe8, 0xc7, ++ 0x8a, 0xbe, 0xa7, 0x7f, 0x56, 0x09, 0x90, 0x7c, 0x61, 0x71, 0x5f, 0x16, ++ 0x03, 0xd6, 0x9a, 0xf2, 0x53, 0xff, 0x2c, 0x0b, 0xe0, 0x71, 0xa1, 0xd5, ++ 0xfd, 0x6f, 0xd8, 0x37, 0x79, 0x5e, 0x9c, 0x55, 0x72, 0x03, 0xf6, 0x99, ++ 0x07, 0xeb, 0xb9, 0xfc, 0x92, 0x91, 0xe2, 0x7b, 0x36, 0x52, 0x8a, 0xc3, ++ 0xfa, 0x95, 0xe5, 0x76, 0xf7, 0xb1, 0xf8, 0x20, 0xfb, 0xed, 0x94, 0xfe, ++ 0x44, 0xfb, 0x47, 0x05, 0x4e, 0x89, 0x45, 0xc7, 0x11, 0x5d, 0x69, 0x3f, ++ 0x8b, 0xd9, 0x4f, 0xc5, 0x06, 0xcb, 0xdb, 0x72, 0x7b, 0xe9, 0x31, 0xa4, ++ 0xc7, 0x6d, 0xf1, 0x7c, 0xff, 0x6a, 0xe2, 0x74, 0xc9, 0x19, 0x5c, 0x27, ++ 0xa1, 0x1f, 0x37, 0xf1, 0x8c, 0x5a, 0x82, 0x74, 0x2a, 0x38, 0x57, 0xd6, ++ 0x84, 0xed, 0x9c, 0xf2, 0x68, 0xea, 0xbb, 0x16, 0x4d, 0x6a, 0x42, 0x79, ++ 0x2e, 0xb1, 0x0d, 0xf7, 0x7c, 0x31, 0x3d, 0xbf, 0x30, 0xde, 0x48, 0xfc, ++ 0x59, 0xa4, 0x48, 0x21, 0xf5, 0x21, 0xfa, 0x71, 0x79, 0xc0, 0x4c, 0xe8, ++ 0x1f, 0xfb, 0x0f, 0x84, 0x53, 0x5e, 0x60, 0xe2, 0x31, 0x77, 0x23, 0xd6, ++ 0x8d, 0x96, 0x26, 0xa5, 0xe6, 0xca, 0x42, 0xe7, 0x31, 0xea, 0x47, 0x6f, ++ 0xc4, 0x7d, 0xb4, 0x89, 0x15, 0x1f, 0x94, 0xc4, 0xa2, 0xfc, 0xd8, 0x24, ++ 0x07, 0x9a, 0x87, 0x02, 0xd6, 0xd7, 0x14, 0x1b, 0x87, 0xf5, 0x8f, 0x58, ++ 0x10, 0x85, 0xeb, 0x7a, 0xb6, 0x18, 0xeb, 0x77, 0x26, 0xaa, 0x92, 0x03, ++ 0xd1, 0x56, 0xe8, 0xec, 0x6a, 0xc5, 0xe7, 0x0b, 0x1d, 0x11, 0x8e, 0x42, ++ 0xf4, 0xc7, 0x8f, 0xa9, 0x25, 0x68, 0x72, 0x8e, 0x2a, 0x13, 0x0e, 0xe7, ++ 0xc3, 0xb8, 0x99, 0xe9, 0xb2, 0xc3, 0x02, 0x13, 0x1d, 0xf5, 0xdd, 0x36, ++ 0xed, 0x02, 0xf4, 0x0b, 0x33, 0xa2, 0x28, 0x8f, 0x5b, 0xa8, 0xac, 0xbe, ++ 0x72, 0x98, 0xfa, 0x11, 0x8e, 0x06, 0x15, 0xd7, 0xb1, 0xf1, 0x17, 0xb5, ++ 0x34, 0x8f, 0x99, 0xec, 0xf9, 0x8e, 0xd9, 0xc5, 0xff, 0x81, 0xfc, 0x53, ++ 0xe4, 0x8a, 0xa2, 0x9c, 0x5f, 0x89, 0xed, 0xd4, 0xbc, 0xe0, 0xba, 0x30, ++ 0x58, 0x37, 0xc1, 0x5d, 0x68, 0x97, 0xbd, 0x61, 0x12, 0xf2, 0xf7, 0x8f, ++ 0x4a, 0xec, 0xd0, 0xdf, 0x31, 0x4a, 0x62, 0x28, 0x3f, 0x47, 0x7d, 0x99, ++ 0x7f, 0xa1, 0xfb, 0xdd, 0xe1, 0x6a, 0x18, 0x00, 0xba, 0xc3, 0x64, 0x2f, ++ 0xc1, 0xf9, 0x76, 0x98, 0x24, 0xfb, 0x5a, 0xea, 0xbb, 0x8a, 0x71, 0xbc, ++ 0x67, 0x8c, 0x51, 0xc5, 0x3c, 0x51, 0x59, 0xdc, 0xe7, 0x21, 0xf3, 0xcf, ++ 0x2c, 0x91, 0xa6, 0x9c, 0x41, 0xf8, 0xb3, 0xa3, 0x26, 0xe0, 0xb5, 0xf2, ++ 0x91, 0x97, 0x42, 0xee, 0xf7, 0x2c, 0xb6, 0x92, 0x9d, 0xa8, 0x78, 0x2f, ++ 0x9b, 0xfc, 0xa1, 0x9e, 0xc5, 0x29, 0x64, 0x2f, 0x2a, 0xde, 0x9b, 0x5e, ++ 0x84, 0x6d, 0x8f, 0x81, 0xfb, 0xe9, 0x15, 0xef, 0x55, 0x94, 0xd3, 0x7d, ++ 0x03, 0x8f, 0x7f, 0x2b, 0x96, 0x7c, 0xcf, 0x29, 0xfa, 0x14, 0xef, 0x56, ++ 0x2c, 0xa9, 0xa1, 0x7e, 0x97, 0x94, 0xf8, 0xef, 0xf8, 0xbe, 0x2b, 0xd9, ++ 0x51, 0xb9, 0x98, 0x47, 0x9b, 0x95, 0xfe, 0xd5, 0x3c, 0x25, 0xd8, 0xff, ++ 0x5b, 0x9d, 0x49, 0xf2, 0x9f, 0x2b, 0xf2, 0x78, 0x85, 0x86, 0xcc, 0xf5, ++ 0xd3, 0x01, 0xfe, 0x87, 0x0f, 0xf0, 0x7d, 0x88, 0x8a, 0x6c, 0x29, 0xa4, ++ 0x6e, 0x6e, 0x76, 0xfe, 0xa9, 0x90, 0x7a, 0x50, 0xd7, 0xf4, 0xcf, 0x43, ++ 0xfa, 0xf3, 0x4a, 0x2e, 0x85, 0xd4, 0x87, 0xce, 0xaf, 0xf8, 0x2a, 0xa4, ++ 0xbf, 0x70, 0xbe, 0x54, 0x19, 0x3c, 0xbe, 0xe4, 0x40, 0x3e, 0xd9, 0xd7, ++ 0x7c, 0x51, 0xbf, 0xa4, 0xe5, 0x97, 0x0a, 0x05, 0x0b, 0xbd, 0x5d, 0x9f, ++ 0x51, 0x59, 0x02, 0x72, 0x79, 0x00, 0xda, 0xfb, 0x40, 0x3f, 0x14, 0xf6, ++ 0x8a, 0xbc, 0xab, 0xc2, 0xe3, 0xea, 0x0c, 0xf8, 0x87, 0x7a, 0xb0, 0xc4, ++ 0xa6, 0xcb, 0xef, 0x32, 0x95, 0xf6, 0xb3, 0xcb, 0xbb, 0xf9, 0xbe, 0x75, ++ 0x59, 0x9c, 0xf1, 0x74, 0xb0, 0x7d, 0x28, 0x97, 0x1f, 0xe3, 0xfe, 0x82, ++ 0x6e, 0xfd, 0xb9, 0x07, 0x8c, 0x64, 0x27, 0x73, 0xa3, 0x65, 0xca, 0x57, ++ 0x69, 0xf0, 0x95, 0x8f, 0x0c, 0x7d, 0x5e, 0xf3, 0xbf, 0xca, 0x05, 0x9c, ++ 0x3b, 0x0c, 0xee, 0xa6, 0x18, 0xca, 0x8f, 0x39, 0x7b, 0xd1, 0xff, 0xd0, ++ 0xe0, 0xd7, 0xde, 0xaf, 0xc1, 0x5d, 0x2e, 0xdf, 0x55, 0x42, 0xdb, 0x7f, ++ 0xd7, 0x80, 0x5f, 0x0f, 0x2f, 0x00, 0x4a, 0xfe, 0x9b, 0x1e, 0x8e, 0x03, ++ 0xf1, 0x22, 0x0e, 0x01, 0x7f, 0x83, 0xfc, 0xb3, 0x6e, 0x5e, 0x97, 0x06, ++ 0xbf, 0xb8, 0xa1, 0xec, 0xb6, 0xe6, 0x9f, 0x57, 0x80, 0x9e, 0x8a, 0x0e, ++ 0xd6, 0x53, 0x36, 0x29, 0x0e, 0xeb, 0xed, 0x86, 0xd3, 0x53, 0xda, 0xbc, ++ 0xc3, 0xf9, 0x61, 0xda, 0xbc, 0xcb, 0xed, 0x2e, 0x7a, 0xde, 0xb9, 0xf5, ++ 0xd3, 0xa3, 0x53, 0xe5, 0xa0, 0x7e, 0xea, 0xa9, 0xd8, 0x98, 0xe0, 0xfe, ++ 0xab, 0x9f, 0xae, 0x0f, 0xb9, 0x1f, 0x7f, 0xaa, 0x32, 0x3a, 0xb8, 0xbf, ++ 0xe9, 0xd3, 0x4a, 0xbc, 0x3f, 0x43, 0x51, 0x1b, 0x6d, 0xc0, 0x8f, 0x07, ++ 0x99, 0xe4, 0xf0, 0x20, 0x7f, 0xf6, 0xa8, 0x0a, 0xee, 0x3f, 0x17, 0x1f, ++ 0x73, 0x36, 0x61, 0x5b, 0x7a, 0xd2, 0x8d, 0x65, 0xa6, 0x6c, 0xe6, 0x19, ++ 0x4f, 0x13, 0xb6, 0xd3, 0xce, 0x7b, 0x7b, 0xcc, 0xb0, 0xae, 0xdb, 0x32, ++ 0x64, 0x15, 0xe3, 0x76, 0xcd, 0xff, 0xd0, 0xc3, 0x6b, 0x4e, 0xe0, 0x71, ++ 0xc8, 0xc1, 0xab, 0xaa, 0x15, 0xf7, 0x4f, 0x77, 0x78, 0x54, 0x2b, 0xfa, ++ 0xef, 0x3b, 0x1e, 0x53, 0xad, 0xe8, 0x7f, 0xec, 0x70, 0xb2, 0x72, 0x8c, ++ 0xc7, 0x9c, 0x69, 0x86, 0xd5, 0xe8, 0xcf, 0x3b, 0xb3, 0x78, 0x9d, 0xe1, ++ 0x55, 0xa1, 0x87, 0xbf, 0x8e, 0xe7, 0xcf, 0x6b, 0xed, 0x69, 0xc5, 0xfd, ++ 0x35, 0xea, 0x45, 0xac, 0x0b, 0x47, 0x9f, 0xa0, 0xf6, 0x2b, 0x3f, 0xd5, ++ 0x81, 0x1f, 0x44, 0xbf, 0x2a, 0x7b, 0xb0, 0x5f, 0x75, 0x50, 0xf1, 0xda, ++ 0xf0, 0x7d, 0x07, 0x1f, 0xf3, 0xda, 0x82, 0xf7, 0x09, 0xaf, 0xd7, 0xaf, ++ 0xfa, 0x0b, 0xda, 0xe8, 0x78, 0xe4, 0xb3, 0xb9, 0x21, 0xf2, 0x59, 0x6c, ++ 0xb9, 0xb3, 0x32, 0x58, 0xbe, 0x4b, 0xed, 0x4b, 0x43, 0xee, 0x7f, 0x12, ++ 0xa7, 0x12, 0xfc, 0x33, 0x93, 0x1e, 0x0c, 0x19, 0x77, 0x9b, 0xfa, 0x50, ++ 0x48, 0x1f, 0xfc, 0xc5, 0x0c, 0xf4, 0x47, 0x1a, 0x4d, 0x8c, 0xea, 0x64, ++ 0x3d, 0x06, 0x5e, 0x27, 0xab, 0xc7, 0xe3, 0xc3, 0x02, 0x8f, 0x0e, 0x9b, ++ 0x1d, 0xdd, 0x18, 0x66, 0x8c, 0x53, 0xa9, 0xae, 0x4d, 0x3f, 0xce, 0x51, ++ 0xcc, 0xf1, 0xa7, 0xbf, 0x9e, 0x9e, 0xc0, 0xe3, 0xa2, 0x8d, 0x20, 0x33, ++ 0xd8, 0xde, 0x95, 0xc0, 0xe1, 0xd3, 0xd7, 0xc5, 0xea, 0xfb, 0x10, 0xf3, ++ 0x2d, 0xc2, 0xf9, 0x60, 0xe6, 0x24, 0xe4, 0x73, 0x87, 0xd5, 0x70, 0x05, ++ 0x5c, 0x5d, 0xe6, 0x4c, 0x48, 0xba, 0x9d, 0xea, 0x65, 0xf3, 0x0c, 0x0f, ++ 0xa7, 0x41, 0xbf, 0x2a, 0x21, 0x8b, 0xf7, 0xa7, 0x19, 0x76, 0x62, 0x7d, ++ 0xec, 0x9d, 0x09, 0xd9, 0xbc, 0x7f, 0xb3, 0x21, 0xcf, 0x08, 0x7e, 0xc0, ++ 0xaf, 0xd9, 0xf8, 0xdb, 0xb1, 0x1e, 0xbc, 0x36, 0x4c, 0xd4, 0x75, 0xde, ++ 0x97, 0x48, 0xfb, 0x61, 0x5a, 0x7c, 0xa3, 0x18, 0x4e, 0xbd, 0xb0, 0x04, ++ 0xe3, 0xcc, 0x3d, 0x46, 0x86, 0xf9, 0xfb, 0xa7, 0x4c, 0x60, 0xf7, 0x72, ++ 0x03, 0xfb, 0xe6, 0x56, 0x33, 0x8f, 0x4b, 0xad, 0x26, 0x5e, 0xb7, 0xfd, ++ 0x44, 0xea, 0xd1, 0x27, 0x50, 0x6f, 0xa8, 0x61, 0xee, 0x19, 0x09, 0xe4, ++ 0x47, 0x15, 0xa9, 0x88, 0xbf, 0xf3, 0x76, 0x0b, 0xd5, 0x75, 0x3e, 0xb2, ++ 0xbb, 0x34, 0x11, 0xe9, 0x7f, 0x57, 0x02, 0xcf, 0x73, 0x65, 0xed, 0x9c, ++ 0x96, 0x84, 0xfa, 0xe5, 0x5f, 0xf0, 0xfe, 0xd9, 0x09, 0x13, 0x87, 0x7f, ++ 0x3f, 0xd6, 0xf9, 0xe2, 0x3c, 0xe7, 0x77, 0x64, 0x91, 0xff, 0x9d, 0x75, ++ 0x23, 0xa0, 0x57, 0x0a, 0xe0, 0x1f, 0xc2, 0x63, 0xba, 0x1e, 0x06, 0x61, ++ 0x02, 0x9d, 0x97, 0x60, 0xce, 0x24, 0xcc, 0xb3, 0x35, 0x46, 0x9b, 0x68, ++ 0x9e, 0xbb, 0x12, 0x38, 0xff, 0x5d, 0x6f, 0x3b, 0xa8, 0xee, 0x37, 0xca, ++ 0xb0, 0x7a, 0x3b, 0xb4, 0xf7, 0x0a, 0xfa, 0xdf, 0x87, 0xef, 0x25, 0x7c, ++ 0xf9, 0x47, 0xcd, 0xc5, 0x8d, 0x39, 0xbb, 0x7f, 0xd4, 0xbc, 0xf1, 0xbc, ++ 0x8f, 0xf4, 0x95, 0xe5, 0x5c, 0x3f, 0xfa, 0xb1, 0xfe, 0xef, 0x45, 0xd0, ++ 0xbe, 0x0a, 0x1b, 0xe9, 0xa7, 0xfd, 0x97, 0x8f, 0xee, 0xca, 0x72, 0xa0, ++ 0x7f, 0xfa, 0x71, 0x38, 0xc7, 0xdf, 0x22, 0xef, 0xe8, 0xc6, 0x3e, 0x15, ++ 0xeb, 0x37, 0xbc, 0x37, 0x60, 0xbd, 0x44, 0x46, 0xa2, 0xbb, 0x16, 0xf1, ++ 0xb0, 0xd8, 0xec, 0xbd, 0x89, 0xf8, 0xc7, 0xb6, 0x3a, 0x02, 0xe7, 0xbf, ++ 0xde, 0x7a, 0xe0, 0xc1, 0xef, 0x85, 0x00, 0x12, 0xe8, 0x53, 0x35, 0x85, ++ 0xd3, 0x47, 0x7b, 0x2f, 0xe0, 0xd4, 0x82, 0xf6, 0xe0, 0x23, 0x71, 0x0e, ++ 0x44, 0x83, 0x03, 0xde, 0xff, 0x23, 0xe4, 0x03, 0x0d, 0x9e, 0x01, 0x38, ++ 0x74, 0x75, 0xe1, 0x5a, 0x9e, 0xb9, 0xee, 0x4f, 0x06, 0xca, 0x33, 0xd4, ++ 0x49, 0xa0, 0xf7, 0xa0, 0xbf, 0xf3, 0x24, 0x73, 0x78, 0x60, 0x9e, 0x8b, ++ 0x9a, 0xbf, 0x2e, 0xf2, 0x9a, 0xb8, 0x15, 0x85, 0xef, 0x99, 0x72, 0x78, ++ 0x59, 0xb1, 0x0d, 0xda, 0xfc, 0xb6, 0x55, 0x3c, 0xce, 0xed, 0x55, 0x42, ++ 0xf2, 0x5c, 0x93, 0x8e, 0x2b, 0xfa, 0xfd, 0x0e, 0xb2, 0x5b, 0xd3, 0xb4, ++ 0xe7, 0x75, 0x79, 0xc6, 0x69, 0x22, 0xae, 0x9d, 0xa6, 0x8b, 0x6b, 0x5f, ++ 0x48, 0x10, 0x76, 0x26, 0x99, 0x25, 0x07, 0xe7, 0x01, 0xd6, 0x88, 0xb8, ++ 0xe1, 0x72, 0xcf, 0xe8, 0x28, 0xf4, 0x33, 0x51, 0x47, 0xc9, 0x80, 0x57, ++ 0x93, 0x2a, 0xb3, 0xc9, 0x31, 0x01, 0x39, 0x6f, 0x85, 0xb8, 0x9f, 0x05, ++ 0xc5, 0xfd, 0x1a, 0x9f, 0x8d, 0x3f, 0x66, 0xbf, 0x17, 0xe1, 0x1e, 0x7f, ++ 0x8c, 0xdd, 0x43, 0x76, 0x5d, 0x9b, 0x77, 0x20, 0xbf, 0xc0, 0xf1, 0x72, ++ 0xf9, 0x38, 0xc7, 0xcb, 0x84, 0xbe, 0x8c, 0x9f, 0x4d, 0x87, 0xbe, 0xb1, ++ 0xdb, 0xc8, 0xbc, 0x6a, 0x60, 0x3d, 0x53, 0x39, 0xa8, 0xec, 0x32, 0xfe, ++ 0x07, 0xc7, 0xdb, 0x4d, 0x5e, 0xac, 0x5b, 0x2e, 0x38, 0xf0, 0xab, 0x3c, ++ 0x1f, 0x5c, 0x32, 0x27, 0x19, 0x98, 0x1a, 0x84, 0x87, 0x30, 0x35, 0x9c, ++ 0xa9, 0x41, 0x7a, 0xd1, 0x9a, 0x11, 0x13, 0xd2, 0x97, 0x35, 0x7c, 0x0b, ++ 0x7b, 0x9e, 0x27, 0xe6, 0x8f, 0x70, 0x24, 0x87, 0xcc, 0xb3, 0x27, 0xa6, ++ 0xac, 0x1b, 0xed, 0x7b, 0x9e, 0x6d, 0x05, 0xd9, 0xf7, 0xa8, 0xc9, 0xa3, ++ 0x43, 0xe6, 0x61, 0x3d, 0x4a, 0x88, 0x9d, 0x87, 0x45, 0xd1, 0xfe, 0xe5, ++ 0x44, 0x00, 0xea, 0xe7, 0x80, 0xd7, 0x82, 0x63, 0x4a, 0x88, 0x3d, 0x9f, ++ 0x14, 0xe7, 0xc1, 0x15, 0xb3, 0xc9, 0x27, 0x15, 0x9d, 0xfd, 0x6f, 0x96, ++ 0x51, 0x0e, 0xa6, 0x9e, 0x09, 0xbd, 0x7e, 0x60, 0x38, 0xba, 0x0c, 0x87, ++ 0x3f, 0x96, 0xf3, 0x33, 0xf4, 0xef, 0xfe, 0x51, 0xfc, 0x45, 0x3b, 0x43, ++ 0xf1, 0x17, 0x5b, 0x1e, 0x8a, 0xbf, 0x78, 0x57, 0x28, 0xfe, 0x12, 0x17, ++ 0x85, 0xe2, 0x69, 0x84, 0x3b, 0x14, 0x2f, 0x29, 0x2b, 0xc6, 0x85, 0xdc, ++ 0xbf, 0x61, 0x75, 0x6e, 0x48, 0xff, 0xc6, 0x47, 0xa7, 0x86, 0x8c, 0x4f, ++ 0x05, 0x83, 0x14, 0xdc, 0x4f, 0x7b, 0x72, 0x56, 0xc8, 0xf8, 0x9b, 0x9a, ++ 0xe7, 0x85, 0xf4, 0xc7, 0x6e, 0x58, 0x1c, 0x32, 0x3e, 0xd3, 0xbb, 0x2c, ++ 0xe4, 0x7e, 0xd6, 0x2b, 0x2b, 0xaf, 0x8b, 0xde, 0xe3, 0x5b, 0xd6, 0x84, ++ 0x8c, 0xd3, 0xd3, 0xfb, 0xe6, 0xb6, 0xff, 0x15, 0x32, 0xaf, 0x46, 0x6f, ++ 0x0f, 0xfc, 0xfb, 0x57, 0xd0, 0xdb, 0x9c, 0x18, 0x4a, 0xef, 0x54, 0xa1, ++ 0x5f, 0xa3, 0x9d, 0xbc, 0xbe, 0xac, 0xdf, 0x68, 0x7b, 0x52, 0x02, 0x7d, ++ 0x84, 0x69, 0x22, 0xd4, 0x6b, 0xd1, 0xed, 0xef, 0x7c, 0x85, 0x79, 0x08, ++ 0x4f, 0x91, 0x4a, 0xf5, 0x73, 0x9e, 0x59, 0x8c, 0xf6, 0xa1, 0x9f, 0x97, ++ 0x5d, 0x12, 0xea, 0xa1, 0x14, 0x98, 0xc2, 0x90, 0x46, 0xf5, 0xeb, 0x54, ++ 0x7f, 0xf7, 0x8c, 0xc1, 0x10, 0xb2, 0x2f, 0x9e, 0x98, 0xc8, 0xed, 0x7b, ++ 0x62, 0x22, 0xcf, 0xd7, 0xfc, 0xc2, 0xc4, 0xcf, 0x2d, 0xa5, 0x80, 0xff, ++ 0x48, 0x76, 0xc8, 0xc0, 0x02, 0xf1, 0x32, 0xe0, 0x21, 0x12, 0xe3, 0x65, ++ 0x8a, 0xa7, 0x9f, 0x79, 0x0a, 0xe3, 0x65, 0x98, 0x8f, 0xfa, 0xe9, 0x3f, ++ 0x7b, 0xe6, 0x76, 0xcf, 0xf4, 0x80, 0xbe, 0x5c, 0x6c, 0x56, 0x1b, 0xfb, ++ 0x00, 0x1f, 0x13, 0x64, 0xae, 0x0f, 0x41, 0x4f, 0xa6, 0x25, 0xc2, 0xfc, ++ 0x1f, 0x4b, 0x8f, 0x19, 0xb9, 0x1f, 0xe1, 0x31, 0xa2, 0x1f, 0x91, 0x62, ++ 0x61, 0x9e, 0xc8, 0x5c, 0xb2, 0x1f, 0x94, 0x3f, 0x8e, 0x66, 0x71, 0x12, ++ 0xd6, 0xe3, 0x47, 0x05, 0xf4, 0xb4, 0xfa, 0x2d, 0x10, 0x6b, 0xdf, 0xca, ++ 0x2c, 0x3a, 0x07, 0xf5, 0x2e, 0x42, 0x82, 0xfe, 0xaf, 0x25, 0x86, 0xec, ++ 0xe8, 0x9d, 0x9a, 0x7e, 0x5a, 0x91, 0x49, 0xfa, 0xe9, 0xb2, 0x2d, 0xd4, ++ 0x0f, 0xbb, 0x7c, 0x5f, 0x1a, 0x5d, 0x3f, 0x71, 0xb7, 0x99, 0xf6, 0xfb, ++ 0x4f, 0x88, 0x3a, 0x44, 0x6d, 0xfd, 0xe7, 0x84, 0xde, 0xfa, 0x73, 0xbd, ++ 0x85, 0xda, 0xf3, 0xf5, 0xf6, 0x10, 0x3d, 0xb6, 0x62, 0xe3, 0xfa, 0x08, ++ 0xf4, 0x1f, 0x4f, 0x64, 0x70, 0x7f, 0x51, 0xbb, 0x5e, 0x8c, 0x78, 0x9b, ++ 0x88, 0xad, 0x2c, 0xec, 0x9a, 0xc5, 0x8e, 0xf9, 0xac, 0xbb, 0xc0, 0x38, ++ 0x47, 0x01, 0xbe, 0x6b, 0xba, 0xfb, 0x22, 0x17, 0x33, 0xf2, 0x1b, 0x8b, ++ 0x70, 0xdd, 0xb5, 0x1b, 0xaf, 0xdc, 0xfd, 0x06, 0xf4, 0xeb, 0x0c, 0xfe, ++ 0x04, 0x6e, 0x1f, 0x3c, 0xbc, 0x5e, 0xe6, 0x23, 0x46, 0xfe, 0x67, 0xd5, ++ 0xd7, 0x2c, 0xc4, 0x7f, 0x9a, 0x97, 0xc8, 0xe3, 0xf4, 0x79, 0x62, 0xfe, ++ 0x85, 0xd0, 0xd8, 0x01, 0x4f, 0x0b, 0x01, 0xff, 0xd1, 0xd8, 0xbe, 0x33, ++ 0xbd, 0x0c, 0xf9, 0x13, 0xae, 0xd3, 0xf9, 0xb4, 0x39, 0xdd, 0x8c, 0xea, ++ 0x4f, 0xe6, 0xba, 0x53, 0x69, 0x9f, 0xf1, 0x28, 0x73, 0x7c, 0xb0, 0x0b, ++ 0x40, 0xfc, 0x5e, 0xa2, 0x4a, 0x70, 0xce, 0x67, 0x2e, 0xda, 0xaf, 0xff, ++ 0xf0, 0xee, 0x9a, 0x08, 0x1c, 0x37, 0x30, 0x9f, 0x36, 0x0f, 0x30, 0x0a, ++ 0xfa, 0x1b, 0x1f, 0x45, 0x7b, 0x8c, 0x09, 0x18, 0xf7, 0xdf, 0xc2, 0xeb, ++ 0x1b, 0xe0, 0x7d, 0x16, 0xbc, 0xee, 0xba, 0x2b, 0xe5, 0x71, 0xb4, 0x43, ++ 0xda, 0xfb, 0x3e, 0x64, 0xee, 0x0b, 0x1f, 0xe0, 0x7e, 0x37, 0x73, 0xd0, ++ 0xbc, 0xda, 0xfc, 0x8c, 0xc5, 0x84, 0xe8, 0xa7, 0x1d, 0x2b, 0x56, 0x7d, ++ 0x12, 0x0b, 0xef, 0x5b, 0x73, 0xc0, 0x40, 0xf9, 0x84, 0x35, 0x1d, 0x66, ++ 0x8a, 0xbb, 0xfa, 0x57, 0xfe, 0x6d, 0xeb, 0x0b, 0x70, 0xff, 0x9e, 0x94, ++ 0xbe, 0x1b, 0xd0, 0x2e, 0x7f, 0xbc, 0xf2, 0xeb, 0x31, 0xc8, 0x0f, 0x77, ++ 0x6e, 0x00, 0x3d, 0x04, 0x6b, 0x9c, 0x1a, 0xe5, 0x7e, 0x30, 0x31, 0x28, ++ 0x4e, 0x39, 0x71, 0xdf, 0x95, 0x08, 0xbc, 0x0f, 0xf6, 0x75, 0xd3, 0x0b, ++ 0x68, 0x1c, 0x37, 0x9b, 0xa9, 0xbe, 0xf7, 0xe3, 0x95, 0x9b, 0xc7, 0x04, ++ 0xfb, 0xa3, 0x0f, 0x27, 0x16, 0xd6, 0xe2, 0x73, 0x6c, 0xf2, 0xf5, 0x9d, ++ 0x37, 0x2c, 0x7e, 0x2d, 0x33, 0x91, 0xea, 0xb1, 0x04, 0x3f, 0x3d, 0x28, ++ 0xf8, 0x69, 0xcd, 0xab, 0x63, 0xc9, 0x8f, 0x5a, 0x13, 0x31, 0xc0, 0x4f, ++ 0xbc, 0xbf, 0x89, 0xd7, 0x77, 0x68, 0xeb, 0xf8, 0x40, 0xf0, 0xe3, 0xca, ++ 0xd7, 0xbe, 0x2a, 0x08, 0x3e, 0x67, 0xba, 0x03, 0xf8, 0x48, 0x1d, 0xc3, ++ 0xf7, 0xb5, 0x54, 0x90, 0xa9, 0x9d, 0x3d, 0x97, 0x73, 0xf0, 0xfe, 0xcb, ++ 0x8a, 0xbb, 0x09, 0xe1, 0xeb, 0xbc, 0x7a, 0x3a, 0x12, 0xfb, 0x3b, 0xdf, ++ 0xfd, 0x3b, 0xc1, 0xcf, 0xe6, 0x5f, 0x1f, 0xbc, 0x28, 0x83, 0x9e, 0x82, ++ 0xc0, 0xfe, 0xb2, 0x76, 0xee, 0x72, 0x51, 0x7b, 0x6c, 0x1e, 0xd2, 0x1d, ++ 0xe4, 0xac, 0x19, 0xe7, 0x5f, 0xfc, 0xdb, 0x57, 0x2f, 0xfc, 0x1e, 0xf1, ++ 0xd3, 0xb1, 0x79, 0xd3, 0x0f, 0x71, 0xcc, 0x75, 0x9e, 0xbf, 0x64, 0xc2, ++ 0xbe, 0x38, 0x04, 0x1e, 0xc0, 0xbe, 0x50, 0x7c, 0xd0, 0xcf, 0xc2, 0xf9, ++ 0xb9, 0x0e, 0xa1, 0x47, 0x15, 0xdc, 0x41, 0x4f, 0xc3, 0xf3, 0x4c, 0x0e, ++ 0x95, 0xf8, 0xd9, 0xc9, 0x0e, 0xe1, 0xbe, 0x4b, 0x63, 0x97, 0x81, 0x61, ++ 0xdd, 0x4a, 0x24, 0x6e, 0xda, 0x04, 0xe5, 0xd9, 0x22, 0x65, 0x83, 0x66, ++ 0x84, 0x9c, 0x96, 0x24, 0xd0, 0xcf, 0x42, 0xaf, 0xbc, 0x9c, 0x78, 0xf2, ++ 0xf6, 0x26, 0xf2, 0xf3, 0x43, 0xfd, 0x9e, 0xfc, 0xb7, 0x56, 0x86, 0xf8, ++ 0x3b, 0x2e, 0xf8, 0x47, 0xfe, 0xce, 0x8b, 0xee, 0x46, 0xcc, 0x03, 0x5d, ++ 0xd3, 0xef, 0xf1, 0x19, 0x96, 0x9a, 0xa2, 0xae, 0xdf, 0xff, 0x81, 0x40, ++ 0xd8, 0x29, 0x15, 0x88, 0x2d, 0x1c, 0xf8, 0xb5, 0x25, 0x8a, 0x7d, 0x11, ++ 0xa1, 0x87, 0x3b, 0x51, 0x8e, 0xb0, 0xfe, 0x1f, 0xe7, 0xc2, 0x7c, 0xbd, ++ 0x2f, 0x9c, 0x9f, 0x33, 0x06, 0x53, 0x81, 0x7a, 0xfc, 0x47, 0xb0, 0x26, ++ 0x7c, 0xd8, 0x94, 0x22, 0x5a, 0xe9, 0x62, 0x86, 0x25, 0x9a, 0xb1, 0xbd, ++ 0x89, 0x7f, 0x7c, 0xea, 0x49, 0xd0, 0x93, 0x96, 0x74, 0xbe, 0x5e, 0xec, ++ 0x37, 0xe2, 0xdf, 0xdd, 0x9c, 0xdf, 0x06, 0xfc, 0xab, 0xb7, 0xc6, 0x91, ++ 0x9e, 0x62, 0xdf, 0xc0, 0xdb, 0x10, 0x0f, 0x22, 0x5f, 0xa1, 0xa7, 0x53, ++ 0x3e, 0xc8, 0x07, 0x8b, 0x0d, 0x92, 0x33, 0xf1, 0xbc, 0x6f, 0xff, 0xdf, ++ 0x23, 0x31, 0x4f, 0xbb, 0x35, 0x46, 0x7d, 0x0f, 0xe9, 0xe0, 0x3f, 0x20, ++ 0xd3, 0x3e, 0x4d, 0x98, 0xd2, 0x67, 0x8a, 0x1e, 0x22, 0x2e, 0x7b, 0x03, ++ 0xf5, 0x9e, 0x89, 0xfb, 0x4d, 0x54, 0x6f, 0xde, 0xc6, 0xf3, 0x81, 0x16, ++ 0xd5, 0xc9, 0x30, 0x0e, 0x08, 0xb3, 0xdb, 0x27, 0x04, 0x9f, 0xb3, 0x6b, ++ 0x17, 0xfa, 0xae, 0x66, 0xff, 0xc7, 0xa3, 0x4c, 0x40, 0x87, 0x0b, 0x86, ++ 0x9e, 0xc8, 0x6c, 0x98, 0xbf, 0x7a, 0xd7, 0x8e, 0x48, 0x74, 0xe3, 0xef, ++ 0x36, 0xba, 0x3f, 0x41, 0xbe, 0x5b, 0x75, 0xe2, 0xfd, 0x02, 0x3b, 0x9d, ++ 0x67, 0xdb, 0x38, 0x8a, 0xce, 0x01, 0xf8, 0x46, 0x53, 0xdd, 0xc1, 0x78, ++ 0x85, 0x79, 0x94, 0xdc, 0xc1, 0x70, 0xd4, 0x6d, 0xc8, 0x25, 0x63, 0x5c, ++ 0xbb, 0x81, 0x92, 0xf1, 0x6c, 0x7c, 0x7b, 0xde, 0x03, 0xa8, 0x8f, 0xea, ++ 0x7c, 0x7c, 0x9d, 0x38, 0x37, 0x16, 0xfe, 0x65, 0xb6, 0x31, 0xea, 0x5f, ++ 0x6c, 0x6b, 0x8c, 0xc1, 0xf9, 0xea, 0x7e, 0xd7, 0x91, 0x8c, 0xf2, 0xb3, ++ 0x39, 0x9e, 0xc7, 0x89, 0xaf, 0x5d, 0x1d, 0xc7, 0x9f, 0x57, 0x98, 0x82, ++ 0xe3, 0xbf, 0x48, 0x8c, 0x16, 0xfc, 0xec, 0x35, 0x60, 0x9c, 0xb1, 0x59, ++ 0xc4, 0x27, 0x17, 0xaf, 0x1a, 0x68, 0x9c, 0xf6, 0xfe, 0xf1, 0x6d, 0x85, ++ 0xb2, 0x1d, 0xf8, 0x21, 0xdb, 0xd7, 0xbc, 0x97, 0xe2, 0xa1, 0x76, 0xb3, ++ 0x8a, 0x74, 0x0d, 0x7b, 0x99, 0x71, 0x3c, 0xb4, 0x87, 0x91, 0x9c, 0xd7, ++ 0x75, 0xce, 0x64, 0x98, 0xcf, 0xef, 0x8f, 0x66, 0x0e, 0x09, 0xee, 0x6f, ++ 0x0d, 0xf7, 0xff, 0x91, 0xce, 0x99, 0x75, 0x98, 0x55, 0xcc, 0x8f, 0x86, ++ 0xd9, 0x9b, 0x59, 0x0c, 0xcc, 0xbf, 0x55, 0xec, 0x87, 0x66, 0x02, 0x47, ++ 0xe1, 0x79, 0x25, 0xed, 0xba, 0xf6, 0xbe, 0xb0, 0xf6, 0x9f, 0x61, 0x2c, ++ 0x81, 0xfc, 0x40, 0x79, 0xda, 0x30, 0xa5, 0x99, 0xdd, 0x62, 0x0b, 0xc6, ++ 0x73, 0x04, 0xe1, 0x39, 0x1e, 0xf9, 0x29, 0x1e, 0xdf, 0xe3, 0x33, 0x60, ++ 0x7e, 0xc4, 0x7f, 0x13, 0x63, 0x2f, 0x11, 0x5c, 0x01, 0x38, 0x19, 0xbd, ++ 0x57, 0x83, 0x33, 0x93, 0xfc, 0xb9, 0xad, 0x26, 0xff, 0x59, 0x3c, 0xbf, ++ 0x02, 0x70, 0xd9, 0x91, 0xfe, 0x99, 0x8c, 0xc3, 0xc9, 0xda, 0xc7, 0xaa, ++ 0x18, 0xdf, 0x87, 0xd9, 0x9d, 0xb4, 0x8e, 0x30, 0xbb, 0xea, 0xf0, 0x48, ++ 0x83, 0xe1, 0xaa, 0xcb, 0x61, 0x5e, 0xb4, 0xdf, 0xcf, 0xac, 0x65, 0x03, ++ 0xf2, 0x8a, 0xf2, 0x5b, 0x17, 0x1e, 0xe8, 0x5b, 0x40, 0x06, 0xb6, 0x8e, ++ 0x66, 0x42, 0xbe, 0xed, 0x4f, 0x97, 0x4c, 0x0f, 0xee, 0x83, 0x22, 0x99, ++ 0x1c, 0x78, 0x7e, 0xdc, 0x86, 0x98, 0xa7, 0x9b, 0x46, 0x52, 0xdc, 0xe0, ++ 0x91, 0x31, 0x8e, 0x85, 0x36, 0x22, 0x06, 0xd7, 0xa9, 0xf2, 0xf3, 0xce, ++ 0x98, 0x1a, 0xca, 0xe5, 0x78, 0xc0, 0x7d, 0x71, 0xab, 0x85, 0xdf, 0x1f, ++ 0x18, 0x0f, 0xfc, 0x6d, 0xc3, 0xbe, 0x8d, 0x8f, 0x73, 0x44, 0xd9, 0xad, ++ 0xb3, 0x24, 0x92, 0x13, 0xca, 0xeb, 0xd5, 0x0a, 0x79, 0x7f, 0x44, 0xf2, ++ 0x9d, 0xbd, 0x15, 0xe4, 0xf4, 0xaf, 0xbe, 0xbd, 0x39, 0x2a, 0xc0, 0x52, ++ 0xfd, 0xce, 0x1e, 0xe2, 0xd3, 0x55, 0x86, 0xf6, 0x17, 0xc6, 0xc3, 0xfd, ++ 0x8d, 0x16, 0x77, 0x7e, 0x12, 0xe0, 0xf3, 0xcd, 0x93, 0x06, 0x3a, 0x47, ++ 0xfa, 0xe7, 0x57, 0xc3, 0xbc, 0x15, 0x18, 0x3f, 0xee, 0xde, 0x98, 0xe0, ++ 0x1c, 0x42, 0x3e, 0xf4, 0xf3, 0xff, 0xf8, 0xf8, 0xda, 0xe7, 0x52, 0x90, ++ 0xfe, 0xbb, 0x25, 0x15, 0xf3, 0xa6, 0xfd, 0x46, 0xff, 0x28, 0x84, 0xb7, ++ 0xb6, 0xfd, 0x33, 0x13, 0xd5, 0x23, 0xb4, 0x9d, 0xa2, 0xfa, 0xa4, 0x23, ++ 0x49, 0x6e, 0x27, 0xbe, 0x67, 0x72, 0x5b, 0x03, 0xed, 0x1b, 0x4f, 0x61, ++ 0xcd, 0xb4, 0x6f, 0x9c, 0x25, 0xce, 0x5f, 0xb7, 0x24, 0x71, 0xfd, 0x71, ++ 0xf9, 0xd8, 0x98, 0x97, 0x1a, 0x82, 0xf0, 0x7f, 0x7f, 0x12, 0xf7, 0xc3, ++ 0x98, 0xdf, 0x7d, 0x23, 0xca, 0x4d, 0xbb, 0x90, 0xcf, 0x4e, 0xf4, 0x4b, ++ 0xa0, 0xdd, 0x25, 0xfc, 0xa3, 0x5d, 0x5d, 0x77, 0xa6, 0xa9, 0x41, 0x79, ++ 0xbf, 0x06, 0xb6, 0x37, 0x05, 0xf1, 0xbd, 0x96, 0xbd, 0x45, 0xad, 0x76, ++ 0xbd, 0xdf, 0xcb, 0xcf, 0x33, 0x66, 0x7d, 0x68, 0xb9, 0xc7, 0x19, 0xc4, ++ 0x7f, 0xee, 0x24, 0xee, 0xe7, 0xb9, 0xc5, 0xfb, 0xfc, 0x49, 0xee, 0x85, ++ 0x49, 0x28, 0xb7, 0x5d, 0xa7, 0x4d, 0x91, 0x2a, 0x9e, 0x57, 0x69, 0x19, ++ 0x85, 0x76, 0xa4, 0x05, 0xfc, 0x27, 0xfb, 0x10, 0x78, 0x19, 0x90, 0x5b, ++ 0x9d, 0x1c, 0xd5, 0x29, 0x7e, 0x13, 0x8e, 0xaf, 0x3b, 0xc7, 0xcf, 0x9d, ++ 0x02, 0x9d, 0x9b, 0xb0, 0xfe, 0x7f, 0xf3, 0x87, 0x6d, 0xe3, 0x96, 0xc2, ++ 0xf5, 0x5d, 0x80, 0x6b, 0xac, 0xf7, 0xf4, 0x9c, 0x30, 0x53, 0xdd, 0xe3, ++ 0x2e, 0xa3, 0x2b, 0x05, 0xc7, 0x37, 0x7c, 0xf0, 0x65, 0x0e, 0xea, 0xad, ++ 0x72, 0x44, 0x1a, 0xfc, 0xef, 0xcb, 0x8e, 0x55, 0x37, 0x22, 0xde, 0x80, ++ 0xef, 0x8b, 0xc2, 0x51, 0xbe, 0xb6, 0x33, 0xd2, 0x63, 0x9a, 0x7c, 0x66, ++ 0xa3, 0x7c, 0xc2, 0xf3, 0xd9, 0xc8, 0xf7, 0xf9, 0xd8, 0xcf, 0x24, 0x3d, ++ 0xbc, 0xd5, 0xd4, 0xcb, 0xcf, 0x7d, 0xee, 0xe2, 0xe7, 0x3e, 0x81, 0xef, ++ 0x49, 0x0e, 0x80, 0xef, 0xed, 0xe8, 0x27, 0x64, 0xdb, 0x41, 0x0e, 0xe8, ++ 0xf9, 0xb1, 0x24, 0xdf, 0x5b, 0x7b, 0x0d, 0x74, 0x3e, 0xd5, 0x03, 0x7a, ++ 0xfc, 0x26, 0xea, 0x17, 0x55, 0x62, 0x7f, 0x6b, 0x6f, 0x89, 0x9d, 0xe4, ++ 0x1b, 0xf3, 0xf0, 0xb9, 0x28, 0xa7, 0xbe, 0xbd, 0x34, 0x4f, 0x0b, 0xc4, ++ 0x20, 0x48, 0x3a, 0x89, 0xb9, 0x82, 0xfd, 0xc7, 0xf6, 0xc4, 0x48, 0xe2, ++ 0x63, 0x4d, 0x3f, 0x1e, 0x4c, 0xe4, 0xfa, 0xbf, 0x25, 0x43, 0x8d, 0xc2, ++ 0xfa, 0x7f, 0xab, 0x2c, 0x87, 0xc8, 0x45, 0x90, 0x1d, 0xe4, 0x7d, 0x61, ++ 0x27, 0x7b, 0x37, 0x14, 0x3d, 0xfd, 0xfc, 0x74, 0xb4, 0x77, 0xc2, 0x2e, ++ 0x08, 0xff, 0x89, 0x1d, 0xe7, 0x7a, 0xfe, 0x61, 0x61, 0xab, 0xd6, 0xbc, ++ 0x3d, 0x75, 0xce, 0x16, 0x58, 0xe7, 0x9a, 0xc3, 0xf2, 0x40, 0x3d, 0x37, ++ 0xfa, 0xab, 0x3e, 0xc1, 0x27, 0x7b, 0x85, 0xff, 0x8a, 0x76, 0x42, 0xcd, ++ 0xe3, 0xf5, 0x33, 0x78, 0x7d, 0xe2, 0x06, 0x5e, 0xe7, 0x5a, 0xe0, 0x5c, ++ 0x5d, 0x8c, 0x65, 0x1c, 0x93, 0xcb, 0x9b, 0xf7, 0x61, 0x3b, 0xd5, 0xd5, ++ 0x52, 0x8c, 0x67, 0x8e, 0xa7, 0x2f, 0xea, 0xdd, 0xc7, 0xcf, 0x1e, 0xf3, ++ 0xf3, 0xe3, 0xad, 0x7b, 0x6f, 0xcb, 0xc2, 0x7d, 0xea, 0xfe, 0x13, 0x66, ++ 0x86, 0xfb, 0x24, 0xad, 0x7f, 0xf7, 0xff, 0xf1, 0x35, 0xc0, 0xc3, 0xf7, ++ 0x3b, 0x01, 0xff, 0x43, 0xd8, 0x25, 0x58, 0x0e, 0xf1, 0x1f, 0x58, 0xea, ++ 0x14, 0x96, 0x34, 0xf8, 0x7e, 0xbf, 0xa4, 0xe9, 0x8f, 0x05, 0x15, 0x28, ++ 0x6f, 0x17, 0x5b, 0xe5, 0x40, 0x1f, 0xec, 0x61, 0x2d, 0x30, 0x38, 0xf6, ++ 0x7f, 0x93, 0x54, 0xf9, 0xb4, 0x07, 0x00, 0x4b, 0x1b, 0xe1, 0x7c, 0x0d, ++ 0x59, 0x62, 0x6a, 0xb2, 0x9b, 0xda, 0xfe, 0x23, 0x7f, 0x4f, 0x40, 0x5b, ++ 0xb0, 0xeb, 0x18, 0xf7, 0x9b, 0x5a, 0x4d, 0xce, 0x2c, 0xe4, 0x9f, 0xd6, ++ 0xd1, 0xa1, 0xe7, 0xf5, 0xb5, 0xf6, 0x85, 0x24, 0x7e, 0xce, 0x39, 0xdf, ++ 0xcc, 0x86, 0xcc, 0x4b, 0x1e, 0x12, 0x76, 0x6f, 0x8c, 0x87, 0x3d, 0x85, ++ 0x7c, 0x54, 0xdb, 0x2a, 0xdb, 0xbd, 0x40, 0xf7, 0x0b, 0xad, 0xb2, 0xd3, ++ 0x04, 0xfe, 0xcd, 0x59, 0xa7, 0x3b, 0x01, 0xcf, 0xca, 0x9c, 0x63, 0x9e, ++ 0x85, 0xd3, 0xd0, 0xce, 0x8b, 0xb8, 0x51, 0xfb, 0x9e, 0xca, 0x72, 0xf4, ++ 0x4f, 0xc0, 0x4e, 0xdd, 0xff, 0xfc, 0xa0, 0x3c, 0xbe, 0x01, 0xf9, 0xe8, ++ 0x81, 0x76, 0x89, 0xfd, 0x1c, 0xd6, 0xbc, 0xe2, 0xc5, 0xa1, 0xf7, 0x15, ++ 0xaa, 0xc5, 0x3c, 0x0f, 0xb6, 0x6d, 0xdc, 0x9f, 0x02, 0x74, 0x5c, 0xf9, ++ 0x72, 0xe8, 0xb8, 0x6a, 0x51, 0x27, 0x56, 0xad, 0xf3, 0x5f, 0x0e, 0x25, ++ 0x89, 0xf8, 0x30, 0x8d, 0xa5, 0xa1, 0x5f, 0x02, 0xfc, 0x43, 0x7a, 0xc1, ++ 0xa8, 0xb0, 0x6e, 0x33, 0xf0, 0xeb, 0xfd, 0xc9, 0xee, 0x0e, 0x8c, 0x37, ++ 0x36, 0x8b, 0xef, 0x18, 0x80, 0xfe, 0x24, 0x39, 0xec, 0x10, 0x7c, 0xb9, ++ 0x55, 0xd4, 0x09, 0xf8, 0xb7, 0x4a, 0xb4, 0xaf, 0x97, 0xf9, 0x8a, 0x57, ++ 0x36, 0xc0, 0xf3, 0x53, 0x15, 0xaf, 0x8c, 0x76, 0x8a, 0x41, 0x8b, 0xfb, ++ 0x04, 0x93, 0x9d, 0xee, 0x32, 0xc4, 0x2f, 0xac, 0xfb, 0x18, 0xee, 0xd7, ++ 0xac, 0x10, 0x7a, 0x70, 0x85, 0xe6, 0x97, 0x79, 0xf9, 0x7e, 0x06, 0x98, ++ 0x5b, 0xf2, 0xcb, 0xa6, 0x30, 0x6f, 0x63, 0x24, 0xae, 0xfb, 0x15, 0xc9, ++ 0xe1, 0x53, 0xf1, 0x3b, 0x22, 0x83, 0xea, 0x70, 0x69, 0xdd, 0x75, 0x62, ++ 0xdd, 0xd5, 0x1b, 0x8e, 0xec, 0xc7, 0x30, 0xae, 0xa6, 0x25, 0x74, 0x5c, ++ 0x9d, 0x58, 0x77, 0x9d, 0x6e, 0xdd, 0xda, 0xbe, 0xf6, 0x5f, 0x92, 0x74, ++ 0xe7, 0x90, 0xaf, 0x73, 0xdf, 0xe2, 0x2f, 0x46, 0xee, 0x27, 0xbc, 0x2f, ++ 0xe6, 0xd1, 0xee, 0x9b, 0x47, 0x70, 0x7d, 0x58, 0x0b, 0xe0, 0x21, 0xdd, ++ 0xaa, 0xbd, 0xb2, 0xd7, 0xcb, 0xfd, 0x3a, 0x1b, 0x7e, 0x87, 0xe7, 0x5e, ++ 0x01, 0xef, 0xbd, 0x82, 0xde, 0x75, 0xcc, 0x67, 0x4a, 0x81, 0x71, 0x35, ++ 0xcf, 0xf3, 0x75, 0xb2, 0xa7, 0x43, 0xeb, 0x3f, 0xef, 0x6f, 0x7d, 0xc8, ++ 0x84, 0xf1, 0x95, 0x9e, 0x2f, 0x56, 0x6c, 0x31, 0x92, 0x3f, 0x0a, 0x88, ++ 0x33, 0xa1, 0xbf, 0xa8, 0xe7, 0x8b, 0x95, 0x62, 0xdd, 0x2b, 0x75, 0xeb, ++ 0xae, 0x75, 0x4b, 0x3a, 0xb8, 0xb8, 0x9f, 0x3c, 0x18, 0xae, 0x96, 0x85, ++ 0x48, 0xd7, 0x9a, 0x2d, 0x46, 0x86, 0xf5, 0x88, 0x7a, 0xb8, 0x96, 0xb7, ++ 0x2c, 0x2d, 0x43, 0x3e, 0x1b, 0xcc, 0xaf, 0x9c, 0x2e, 0x2b, 0xc5, 0x7c, ++ 0x01, 0x38, 0x57, 0xd3, 0x39, 0xbe, 0xeb, 0x85, 0x73, 0xd4, 0x08, 0xc1, ++ 0x97, 0xe3, 0xd8, 0x38, 0xa2, 0x4b, 0x79, 0xec, 0x75, 0xd1, 0x45, 0xef, ++ 0xc7, 0x6e, 0xdf, 0x3f, 0xce, 0x8a, 0xf2, 0x7d, 0xb9, 0x7b, 0x34, 0xc5, ++ 0xef, 0x1a, 0xdd, 0xf5, 0xcf, 0x97, 0x09, 0x3f, 0x78, 0xe6, 0x06, 0x46, ++ 0xed, 0x85, 0xb6, 0x62, 0xeb, 0x78, 0x8c, 0x53, 0x7a, 0x0c, 0x0e, 0x49, ++ 0xa5, 0x78, 0x2b, 0x72, 0x3c, 0xe0, 0x23, 0xaf, 0x43, 0x66, 0x15, 0xd0, ++ 0xef, 0x6f, 0x4f, 0x5b, 0xef, 0x01, 0xbc, 0xe7, 0x1e, 0xce, 0xaf, 0xc4, ++ 0x78, 0x3e, 0xef, 0xb0, 0x81, 0xce, 0xbb, 0xed, 0xec, 0xce, 0xa7, 0x7d, ++ 0xe0, 0xbc, 0x03, 0xe9, 0xb1, 0x69, 0x94, 0x8f, 0x76, 0xd0, 0xf7, 0x66, ++ 0x60, 0x1e, 0xb2, 0x9f, 0xfd, 0x3d, 0xb9, 0xeb, 0xf1, 0x5c, 0x40, 0x7f, ++ 0x4f, 0x49, 0x3e, 0xce, 0x2b, 0xc1, 0x38, 0xb4, 0xf3, 0xb9, 0xc2, 0x0e, ++ 0x34, 0xf4, 0xe4, 0x5a, 0x83, 0xcf, 0x77, 0x17, 0x8c, 0xe0, 0xf1, 0xfa, ++ 0x13, 0x49, 0x9f, 0x3e, 0x83, 0x7e, 0xf8, 0xcc, 0xed, 0x46, 0x3a, 0xdf, ++ 0x30, 0xd3, 0xe8, 0x7f, 0x17, 0xeb, 0xa7, 0x76, 0x76, 0x2b, 0xb4, 0x6f, ++ 0x5d, 0x7d, 0x78, 0xd9, 0xda, 0x30, 0xa4, 0xeb, 0xab, 0x12, 0xed, 0x5b, ++ 0xef, 0xef, 0x5d, 0x13, 0xb7, 0x04, 0xf9, 0xaa, 0xdd, 0x68, 0xc7, 0x7d, ++ 0xe8, 0xfe, 0xf6, 0x7f, 0xdb, 0x8b, 0xf7, 0x3d, 0x5b, 0x24, 0xfa, 0x9e, ++ 0x44, 0x5d, 0x47, 0x69, 0xd6, 0x56, 0xe8, 0xe7, 0x6e, 0xcc, 0x73, 0x04, ++ 0x9f, 0xf7, 0xca, 0x8d, 0x56, 0x09, 0x3e, 0x36, 0xc2, 0x4a, 0xf1, 0xf0, ++ 0xcc, 0x1b, 0x8c, 0x64, 0x17, 0xcf, 0x27, 0x5b, 0x7f, 0x85, 0xfe, 0xcd, ++ 0x4a, 0xe7, 0x46, 0x92, 0xe3, 0xf3, 0x7b, 0x76, 0x9a, 0xa8, 0x7e, 0x6e, ++ 0xab, 0xc4, 0xd0, 0xf4, 0xef, 0x4f, 0xda, 0xf7, 0x3a, 0xe2, 0xe3, 0xfc, ++ 0x1b, 0x47, 0x4c, 0xe8, 0x64, 0x17, 0xb7, 0x1e, 0x31, 0xf5, 0x7d, 0x87, ++ 0xbd, 0xbf, 0xe0, 0x85, 0xc0, 0x9f, 0xe2, 0xe0, 0x66, 0x13, 0xc6, 0x29, ++ 0x35, 0x1b, 0xb5, 0x7e, 0x9f, 0x09, 0xe9, 0xe4, 0x12, 0xfe, 0x4f, 0xed, ++ 0xcb, 0xa7, 0xa8, 0xbf, 0xb2, 0x4d, 0x22, 0x3d, 0xb3, 0xf2, 0x45, 0x99, ++ 0xce, 0xb3, 0xef, 0xeb, 0x78, 0xd3, 0x84, 0x7c, 0x5c, 0xbb, 0x45, 0x62, ++ 0x89, 0xa9, 0x41, 0xf7, 0x37, 0x48, 0x21, 0xdf, 0x41, 0x58, 0xc6, 0x38, ++ 0x1f, 0x2c, 0x13, 0x7a, 0x66, 0x15, 0xf3, 0x3e, 0x91, 0x0c, 0xe3, 0x56, ++ 0x35, 0xf3, 0x3a, 0x02, 0xf6, 0x64, 0x68, 0x5d, 0xee, 0xaa, 0x2d, 0x73, ++ 0xe9, 0xbb, 0x4d, 0xcb, 0x9b, 0x87, 0xd6, 0x37, 0x0f, 0x0a, 0xbe, 0x7e, ++ 0x00, 0xe3, 0xc1, 0x9b, 0xf1, 0x3b, 0x48, 0xa1, 0xe3, 0x1e, 0xd4, 0xbe, ++ 0xcb, 0xa5, 0xe3, 0xe7, 0x47, 0x35, 0x7e, 0xce, 0x64, 0x99, 0xc8, 0xcf, ++ 0x5f, 0x16, 0xaa, 0x51, 0xd9, 0x70, 0xfd, 0xcb, 0x23, 0x2b, 0x6f, 0x1c, ++ 0xea, 0x1c, 0x7b, 0x8f, 0xb0, 0xc3, 0x9a, 0x1d, 0xbc, 0xec, 0x33, 0x90, ++ 0x1d, 0xd1, 0x8f, 0xbb, 0xd8, 0x76, 0x85, 0xe0, 0xad, 0xeb, 0xb9, 0x6c, ++ 0x42, 0x3b, 0x58, 0xd6, 0x7e, 0x89, 0xf0, 0x5e, 0xd1, 0xde, 0x45, 0x75, ++ 0x1c, 0x77, 0x30, 0x77, 0x35, 0xe2, 0xe9, 0x8e, 0x76, 0xab, 0x1d, 0xe5, ++ 0xb8, 0xa2, 0x8f, 0xeb, 0xa5, 0x59, 0xed, 0x66, 0xaf, 0x57, 0xc2, 0xfb, ++ 0x2d, 0x4d, 0x48, 0xcf, 0xfe, 0x4e, 0x5e, 0xb7, 0xe8, 0xd9, 0x23, 0x91, ++ 0xff, 0xa2, 0xe9, 0xab, 0x07, 0x04, 0xfe, 0x1e, 0x10, 0xf8, 0x7b, 0x00, ++ 0x14, 0x74, 0x4a, 0x2e, 0xfa, 0xb1, 0x3c, 0xee, 0x7d, 0x30, 0x63, 0xe3, ++ 0xfe, 0x18, 0xb8, 0x5f, 0x2b, 0xae, 0x57, 0x1f, 0xd8, 0x17, 0x89, 0xfe, ++ 0xde, 0x2c, 0x76, 0xe9, 0x6e, 0xa4, 0x07, 0xbc, 0x87, 0xe1, 0x7b, 0xd8, ++ 0x8b, 0xa1, 0x78, 0xbe, 0x9d, 0x71, 0x38, 0x6e, 0xdf, 0xc2, 0xeb, 0x9d, ++ 0xf5, 0xf6, 0xaa, 0x7f, 0x44, 0xd6, 0x1c, 0xca, 0x3f, 0x42, 0xdc, 0x89, ++ 0xf0, 0x54, 0x6f, 0x09, 0xc5, 0x73, 0xad, 0x2e, 0xde, 0x5e, 0x37, 0x82, ++ 0xdb, 0xe7, 0x4d, 0x3a, 0x3c, 0x57, 0xf8, 0x99, 0x35, 0x1b, 0xe1, 0x50, ++ 0x65, 0x87, 0x97, 0x46, 0xf7, 0x2a, 0xf8, 0xde, 0xee, 0x1c, 0x89, 0xf2, ++ 0xab, 0xdd, 0x6a, 0x5a, 0xd4, 0x50, 0xfb, 0x8f, 0x5a, 0xfb, 0xae, 0xf0, ++ 0x9b, 0xb5, 0xfe, 0x1c, 0x71, 0xbe, 0xba, 0xc5, 0xde, 0x6c, 0x0b, 0x8e, ++ 0x83, 0x4d, 0xc9, 0xdc, 0xfe, 0xaf, 0x9c, 0x22, 0x7b, 0x90, 0x4e, 0x03, ++ 0xf1, 0x43, 0xfa, 0xbe, 0x1c, 0xd5, 0x10, 0x88, 0x1f, 0x20, 0x6e, 0xf8, ++ 0xed, 0x88, 0x78, 0x1e, 0x47, 0x60, 0x41, 0xc7, 0x3b, 0x23, 0x65, 0x16, ++ 0x17, 0x17, 0x88, 0x1f, 0x7e, 0x9c, 0xb4, 0xbe, 0x22, 0x17, 0xfa, 0x75, ++ 0x5b, 0xb8, 0x9c, 0x5f, 0x9c, 0x0c, 0xf3, 0xe1, 0xf7, 0xbd, 0x14, 0x46, ++ 0xfe, 0x65, 0xdd, 0x16, 0x33, 0x9d, 0x03, 0xac, 0x03, 0xba, 0x53, 0x9c, ++ 0xd0, 0xce, 0xcf, 0x31, 0xb8, 0xda, 0xa5, 0x52, 0xa4, 0x37, 0xf8, 0xdf, ++ 0xef, 0x8c, 0x98, 0x88, 0xe7, 0x6a, 0x98, 0x31, 0x0e, 0xd6, 0x3d, 0xb7, ++ 0x8d, 0xf3, 0xf9, 0xdc, 0x92, 0x4b, 0xc4, 0x27, 0x07, 0xd2, 0xf9, 0x7a, ++ 0x2f, 0x2b, 0x6a, 0xe2, 0x50, 0xfe, 0xb8, 0xe6, 0x87, 0xe3, 0x39, 0x2c, ++ 0x35, 0xf8, 0xfc, 0x03, 0xc8, 0x25, 0x8e, 0xaf, 0x6d, 0xe7, 0xf5, 0x40, ++ 0xad, 0x7b, 0xbf, 0x1a, 0x95, 0x8a, 0x7a, 0xad, 0xe3, 0x6f, 0xa3, 0x96, ++ 0x42, 0x7b, 0x65, 0x04, 0x5f, 0xbf, 0xe6, 0xe7, 0xf9, 0xc1, 0xcf, 0x1b, ++ 0xcd, 0xfd, 0x9c, 0x63, 0xe8, 0x7f, 0xde, 0xaf, 0xc9, 0x8d, 0x9d, 0xef, ++ 0xa3, 0xdd, 0x2f, 0xec, 0x0c, 0x93, 0x9a, 0x88, 0xbf, 0x6b, 0x8d, 0x2d, ++ 0x6f, 0xc5, 0xa0, 0xdf, 0xb4, 0x95, 0xef, 0xdb, 0xb3, 0xdd, 0x46, 0xfc, ++ 0xc6, 0x19, 0x6b, 0x78, 0xff, 0xb5, 0xa6, 0x18, 0x58, 0xf7, 0xc5, 0xd7, ++ 0x24, 0xaa, 0x47, 0xc3, 0xe7, 0x1f, 0x03, 0x3e, 0xbb, 0xb8, 0xac, 0xe5, ++ 0x34, 0xfa, 0xd1, 0x5f, 0x6e, 0xb5, 0x90, 0xff, 0x78, 0x3f, 0xf8, 0x88, ++ 0x33, 0x72, 0x07, 0xcb, 0xa3, 0x26, 0xb7, 0xda, 0x77, 0xa7, 0x1a, 0xd8, ++ 0x5a, 0xf2, 0x27, 0xd7, 0xb2, 0x26, 0x6a, 0x6b, 0x04, 0x1f, 0x5f, 0x6c, ++ 0x6b, 0x34, 0x51, 0xde, 0xcc, 0x1b, 0xf4, 0xfc, 0xe8, 0xc1, 0x7e, 0x47, ++ 0x8d, 0x8e, 0xef, 0x4c, 0xc9, 0xa1, 0xfc, 0xd6, 0xf0, 0x7e, 0x38, 0xf9, ++ 0x7f, 0xfd, 0x07, 0x64, 0x3b, 0xee, 0x9f, 0x00, 0x9e, 0xfe, 0x3b, 0x39, ++ 0x18, 0x1f, 0xc2, 0xbf, 0x68, 0xdd, 0x1b, 0x46, 0xf4, 0xec, 0x3f, 0x62, ++ 0x23, 0x7b, 0xf1, 0x67, 0xc1, 0x67, 0xe7, 0x45, 0xde, 0xb8, 0x61, 0xb2, ++ 0x4c, 0xeb, 0x37, 0x4c, 0xe1, 0x6d, 0x56, 0xe7, 0x9b, 0xa3, 0x91, 0x7e, ++ 0x88, 0x6f, 0xac, 0x7b, 0xdf, 0xdc, 0xf9, 0xe6, 0x38, 0x7e, 0x9e, 0xda, ++ 0x4b, 0x78, 0x5f, 0xf5, 0x0a, 0x26, 0xc5, 0x83, 0xe0, 0x6c, 0xb1, 0x52, ++ 0x6e, 0x4f, 0xeb, 0x37, 0xbc, 0xbf, 0x98, 0xbe, 0xc3, 0x53, 0xb7, 0x67, ++ 0x00, 0xae, 0x31, 0xa6, 0xb8, 0x00, 0x5c, 0xc3, 0xf1, 0xbf, 0x24, 0xf1, ++ 0x78, 0xd0, 0x20, 0x85, 0xc6, 0x83, 0x75, 0xbb, 0x65, 0x57, 0x70, 0xbd, ++ 0x17, 0xac, 0xe7, 0x1e, 0xd4, 0x3f, 0x49, 0x42, 0x0e, 0x98, 0xe2, 0x4f, ++ 0x40, 0xbf, 0x64, 0x64, 0xb2, 0x4a, 0xf6, 0xab, 0xa1, 0x9d, 0xd3, 0xd3, ++ 0xd0, 0xc1, 0x5b, 0x78, 0xff, 0x42, 0x9e, 0xef, 0x30, 0xd2, 0xfb, 0x07, ++ 0xdd, 0x2f, 0xf2, 0x54, 0xe3, 0xfd, 0x2f, 0x53, 0xad, 0x7c, 0x3f, 0xf9, ++ 0xaa, 0xa7, 0x02, 0xfb, 0xdf, 0x1f, 0x2d, 0x53, 0x3d, 0xe5, 0xf7, 0xdf, ++ 0x5f, 0x39, 0x36, 0x58, 0x6f, 0x32, 0x84, 0x13, 0xe8, 0x59, 0x67, 0xf4, ++ 0x27, 0x50, 0xdc, 0x78, 0xc4, 0x40, 0xf0, 0xd5, 0x1d, 0xb9, 0x9c, 0x90, ++ 0x6e, 0x43, 0x7d, 0xb4, 0xb1, 0xc4, 0x9e, 0x8d, 0x7a, 0x87, 0xeb, 0xbb, ++ 0xfd, 0xa3, 0xad, 0x2b, 0x90, 0x8f, 0x3d, 0xf8, 0xde, 0xc4, 0xc0, 0x3c, ++ 0xaf, 0x0a, 0x7b, 0xcb, 0x70, 0xbd, 0x49, 0xe8, 0x55, 0x3c, 0xcf, 0xe7, ++ 0x15, 0xeb, 0x5d, 0xcb, 0xe6, 0x89, 0xf8, 0x98, 0xf3, 0x51, 0xb6, 0xf0, ++ 0xf7, 0x20, 0xae, 0x98, 0x98, 0x3c, 0x71, 0x70, 0x5c, 0x71, 0xbd, 0xfe, ++ 0x24, 0xd8, 0x83, 0xa3, 0x4b, 0x24, 0xac, 0x27, 0x52, 0x3c, 0x18, 0xd7, ++ 0xee, 0x3c, 0xce, 0xf5, 0x41, 0x43, 0xc7, 0x03, 0x9f, 0x20, 0x9f, 0xd7, ++ 0x7d, 0x6c, 0xa6, 0xfa, 0xaa, 0xef, 0x77, 0x3e, 0x30, 0x96, 0xea, 0x6c, ++ 0xdd, 0xee, 0x9b, 0xd1, 0xaf, 0xf8, 0xb2, 0xf3, 0xc1, 0x9b, 0x29, 0xcf, ++ 0x27, 0xad, 0x25, 0xb8, 0x3c, 0x08, 0x5f, 0x12, 0xfa, 0x2f, 0x1f, 0x24, ++ 0x60, 0x3d, 0x68, 0x4d, 0xc7, 0x07, 0x09, 0x64, 0x5f, 0x77, 0x4d, 0x5c, ++ 0xef, 0x89, 0x40, 0x3f, 0x25, 0xf7, 0x76, 0xbc, 0x0e, 0x7e, 0x03, 0xf1, ++ 0x1f, 0xf8, 0x2f, 0xc4, 0x7f, 0x3b, 0x7b, 0xf2, 0x35, 0x7f, 0xc5, 0x8a, ++ 0xf3, 0xd6, 0x1c, 0x50, 0x5c, 0x88, 0x9f, 0x9a, 0x03, 0xf9, 0x87, 0x2a, ++ 0xd0, 0x8f, 0x38, 0x5c, 0x94, 0x8f, 0x6a, 0x5c, 0x3a, 0x9c, 0x4f, 0xfe, ++ 0x4a, 0x1e, 0xfa, 0x2b, 0xb6, 0x80, 0xff, 0xa2, 0xad, 0xa7, 0x22, 0x99, ++ 0xd7, 0xbb, 0xf4, 0x77, 0x85, 0x51, 0x9e, 0x40, 0x62, 0xa3, 0x39, 0xff, ++ 0xb0, 0xf4, 0x10, 0xfe, 0xa9, 0x6e, 0x7d, 0x9b, 0xec, 0x7a, 0x75, 0x9b, ++ 0x1c, 0x52, 0x37, 0xa8, 0x3d, 0xe7, 0x4e, 0x56, 0xf8, 0x3e, 0xbf, 0xc6, ++ 0x3f, 0x2d, 0x92, 0x93, 0xf8, 0x63, 0x3b, 0x6f, 0xab, 0xdb, 0x76, 0xd2, ++ 0xfa, 0x56, 0x19, 0x5b, 0x88, 0xde, 0x0d, 0x5b, 0x8c, 0xfc, 0xfe, 0x56, ++ 0xde, 0x6a, 0x75, 0xd5, 0x1e, 0x16, 0xe3, 0x41, 0x7c, 0x1c, 0xc2, 0x4b, ++ 0x40, 0x87, 0x59, 0x26, 0x2f, 0x7d, 0xb7, 0xe2, 0x60, 0x2a, 0xf7, 0xdf, ++ 0xf5, 0xf4, 0xf8, 0x34, 0x99, 0xe7, 0x31, 0x0e, 0x9e, 0x70, 0xdf, 0x88, ++ 0xfc, 0x72, 0xb0, 0xd0, 0x3d, 0xd6, 0x3e, 0x84, 0x7d, 0xf0, 0xb0, 0x22, ++ 0x1e, 0x9f, 0x4a, 0x02, 0xdf, 0xad, 0xfc, 0xbc, 0x92, 0x7e, 0xdc, 0xa9, ++ 0x64, 0x1e, 0xc7, 0x47, 0xc6, 0x86, 0x9e, 0x1f, 0x1d, 0xb0, 0x2f, 0xc9, ++ 0x9c, 0x7f, 0x66, 0x99, 0x86, 0xfe, 0x9e, 0xde, 0xcf, 0x35, 0x79, 0x62, ++ 0xec, 0x29, 0x03, 0xf0, 0xc5, 0xd1, 0x0a, 0xa3, 0x7d, 0x9d, 0xf0, 0xdb, ++ 0x47, 0x04, 0x7d, 0x2f, 0xa1, 0xf2, 0x0e, 0x23, 0xf9, 0x07, 0x47, 0x99, ++ 0xfd, 0x6d, 0xac, 0x33, 0x9c, 0xad, 0xe9, 0xd7, 0xc9, 0xdc, 0xae, 0x6a, ++ 0xf9, 0x6e, 0xd7, 0x06, 0x95, 0xef, 0xeb, 0x0c, 0x3e, 0xd7, 0x48, 0x7a, ++ 0x72, 0x81, 0x36, 0x9f, 0xfe, 0xbc, 0xb4, 0xf0, 0x6b, 0x16, 0xe8, 0xfc, ++ 0x9a, 0xf5, 0x9a, 0xfe, 0x1b, 0xc3, 0xc6, 0xa0, 0xfe, 0x6b, 0x11, 0xe7, ++ 0xdc, 0xd6, 0x64, 0x86, 0x79, 0x83, 0xf3, 0x51, 0xfa, 0x76, 0xbf, 0xd8, ++ 0xc7, 0xc0, 0xf3, 0x3a, 0xd8, 0x36, 0x64, 0x7e, 0x44, 0x79, 0x9b, 0x83, ++ 0x5d, 0x27, 0x5e, 0xa7, 0x3a, 0xb3, 0x13, 0x61, 0x6c, 0x34, 0xcf, 0xcb, ++ 0x51, 0xfe, 0xba, 0x66, 0x98, 0xfc, 0x75, 0xc3, 0x80, 0x3c, 0xce, 0x0f, ++ 0xe1, 0x2f, 0x8d, 0x1e, 0x17, 0xc4, 0x77, 0x55, 0xf4, 0xf4, 0x78, 0x5d, ++ 0xe0, 0x5d, 0xdb, 0x67, 0x0b, 0x17, 0xfb, 0x6c, 0xa7, 0x15, 0xf7, 0xeb, ++ 0xc9, 0x54, 0x97, 0x75, 0xde, 0xc4, 0xbf, 0xa3, 0xe6, 0xa7, 0xf8, 0xaa, ++ 0x21, 0x93, 0xfb, 0x47, 0x17, 0x4a, 0x25, 0xda, 0x17, 0x07, 0x38, 0x47, ++ 0x99, 0x83, 0xf4, 0xfa, 0x85, 0x11, 0x3c, 0xae, 0xfa, 0xfe, 0x42, 0x89, ++ 0xf2, 0xa6, 0x5d, 0x38, 0x1e, 0xe3, 0xa7, 0x16, 0x89, 0xea, 0xaa, 0x6b, ++ 0x7c, 0xbd, 0x26, 0xe4, 0xa3, 0x31, 0xad, 0x4b, 0x1f, 0x27, 0x79, 0xf5, ++ 0xb0, 0x63, 0x2c, 0xe8, 0x3b, 0x15, 0x73, 0x2c, 0xdc, 0x2e, 0x0e, 0xd0, ++ 0x4d, 0x5b, 0xf7, 0x80, 0xdd, 0x8a, 0xf1, 0x70, 0x3d, 0x1c, 0x47, 0x2d, ++ 0x8e, 0x47, 0x3b, 0x38, 0x5b, 0xd8, 0x3d, 0xfd, 0x39, 0xa4, 0xb1, 0xac, ++ 0xb7, 0x0c, 0xe3, 0xca, 0x2a, 0xa7, 0xe4, 0xc0, 0x7d, 0x7b, 0x3d, 0xbd, ++ 0xe7, 0x2d, 0x9a, 0xf0, 0x76, 0xfc, 0x3f, 0x40, 0xe7, 0x73, 0xc9, 0xee, ++ 0x23, 0xa4, 0xdf, 0x7a, 0x2f, 0x2f, 0xc4, 0xfc, 0xe7, 0xc1, 0xcc, 0xcf, ++ 0x46, 0xa1, 0xbd, 0xac, 0x1d, 0x86, 0x6f, 0x7f, 0x2f, 0xf8, 0x56, 0xfb, ++ 0x3e, 0x8b, 0x63, 0xac, 0xda, 0x88, 0xdf, 0x27, 0xf9, 0x49, 0xa2, 0xfb, ++ 0x63, 0xc4, 0x6f, 0xbf, 0xe1, 0x9b, 0xc8, 0x71, 0x0c, 0x9f, 0xef, 0xfb, ++ 0xef, 0x35, 0x12, 0xd2, 0x85, 0x11, 0x3d, 0x86, 0x93, 0x93, 0x53, 0x62, ++ 0xbe, 0x53, 0xc9, 0xe2, 0xbb, 0x84, 0x71, 0x7c, 0x9f, 0x64, 0x05, 0xf6, ++ 0x51, 0x5e, 0x8d, 0xde, 0x91, 0x94, 0x5f, 0xc8, 0xbe, 0xbe, 0x7d, 0xa9, ++ 0x86, 0xdd, 0xef, 0xe4, 0xa0, 0xde, 0xba, 0xd8, 0x75, 0x20, 0xc7, 0x14, ++ 0x44, 0xc7, 0xf3, 0x6b, 0x40, 0xde, 0xd1, 0x7e, 0x74, 0xec, 0x4b, 0x50, ++ 0x6d, 0xc1, 0x7c, 0x66, 0x20, 0xfe, 0x92, 0x24, 0x8d, 0xdf, 0x14, 0x61, ++ 0x17, 0x43, 0xf9, 0xee, 0x3c, 0xf2, 0x5d, 0x36, 0xb6, 0x1f, 0x44, 0xa6, ++ 0xa3, 0xde, 0xdd, 0x7e, 0x34, 0xf2, 0x26, 0x9c, 0x6f, 0x17, 0x6f, 0x07, ++ 0xf8, 0xb3, 0x5d, 0xa6, 0x71, 0x10, 0xef, 0x8c, 0x59, 0x10, 0x11, 0x0c, ++ 0xdf, 0xe3, 0x04, 0xdf, 0x85, 0x16, 0x3e, 0x0f, 0x63, 0x7d, 0x63, 0x2a, ++ 0xc7, 0x07, 0xdf, 0x6f, 0x1c, 0x8e, 0x6f, 0x8d, 0x29, 0xbc, 0x9e, 0x30, ++ 0x84, 0x6f, 0xb5, 0xf5, 0xb6, 0xe0, 0xf7, 0x70, 0xd0, 0xbf, 0xef, 0x34, ++ 0xd3, 0xf7, 0x70, 0x30, 0xdf, 0x1c, 0x1d, 0x24, 0x17, 0xa9, 0x29, 0x5c, ++ 0x1e, 0x26, 0x89, 0xef, 0xdf, 0x4c, 0x61, 0x1e, 0xfa, 0x1e, 0xe0, 0x24, ++ 0xf1, 0x1d, 0x9c, 0x29, 0x0a, 0xf3, 0x29, 0x31, 0xb8, 0xcf, 0xe5, 0x93, ++ 0xf9, 0xbe, 0x2c, 0x3f, 0xcf, 0x50, 0x20, 0xf8, 0x77, 0x92, 0xe2, 0xeb, ++ 0xc2, 0x3a, 0x87, 0x29, 0x62, 0x5f, 0x66, 0x2a, 0xeb, 0xa5, 0x71, 0x33, ++ 0x98, 0x9f, 0x5a, 0x27, 0xb3, 0xd3, 0x39, 0x85, 0x22, 0xe6, 0xa0, 0x76, ++ 0xb2, 0xc5, 0x77, 0x3b, 0xa6, 0x5d, 0xb2, 0x5b, 0x5a, 0xa8, 0xfe, 0xcf, ++ 0x97, 0xa0, 0x44, 0x9f, 0xb5, 0x88, 0xf3, 0x10, 0x43, 0xd0, 0x2d, 0xb0, ++ 0x7e, 0x85, 0xbe, 0x7b, 0x43, 0x7c, 0x29, 0xe3, 0x79, 0x98, 0xa1, 0xbf, ++ 0x9b, 0x52, 0x91, 0xc2, 0xe5, 0x9c, 0x3e, 0xce, 0x81, 0xf4, 0xbd, 0xc0, ++ 0x28, 0x3f, 0x85, 0xdf, 0x37, 0xc3, 0x97, 0x4c, 0x53, 0x58, 0x39, 0xd6, ++ 0x1d, 0xdd, 0xa2, 0x30, 0x4b, 0x38, 0xc0, 0xbb, 0xfd, 0x2d, 0x03, 0xc9, ++ 0x6f, 0x67, 0x9f, 0xea, 0xc5, 0x3a, 0x50, 0x47, 0xac, 0x78, 0xee, 0x73, ++ 0x46, 0xf5, 0xae, 0x93, 0x9c, 0x5c, 0x3e, 0xd1, 0xb4, 0x60, 0x9d, 0x84, ++ 0xb6, 0x5e, 0x3d, 0x1e, 0xa6, 0xc2, 0x7c, 0x98, 0x1f, 0x9b, 0xa4, 0x40, ++ 0x64, 0x49, 0x78, 0xf4, 0xd1, 0xfb, 0x6e, 0x65, 0xfc, 0x9c, 0x46, 0x21, ++ 0x53, 0xe9, 0x03, 0x2b, 0xb7, 0xe2, 0xc7, 0x93, 0x49, 0xaf, 0xfb, 0x29, ++ 0x4e, 0x2a, 0x86, 0x38, 0x09, 0xf5, 0xba, 0xc1, 0xe2, 0x21, 0x7c, 0x94, ++ 0x62, 0x72, 0x65, 0x22, 0xdf, 0xdf, 0x88, 0x84, 0x79, 0xa6, 0x36, 0x4b, ++ 0xec, 0x38, 0xee, 0x57, 0xa4, 0xf1, 0xf5, 0x6a, 0xf3, 0x4f, 0x05, 0x46, ++ 0xc0, 0x73, 0x7b, 0xa5, 0x62, 0xbd, 0x98, 0x02, 0x3d, 0x1e, 0xc3, 0xf7, ++ 0x3d, 0x22, 0xa9, 0x70, 0xb8, 0xc4, 0xce, 0xbf, 0x13, 0x94, 0x40, 0xdf, ++ 0x09, 0xba, 0x5e, 0xbc, 0xf6, 0x27, 0xf0, 0xef, 0x42, 0x46, 0xde, 0xeb, ++ 0xbf, 0xf8, 0xc3, 0xfc, 0xc0, 0xfe, 0x8f, 0x03, 0xbf, 0x1b, 0x14, 0x19, ++ 0xf8, 0x1e, 0xa5, 0x03, 0xcf, 0x99, 0x60, 0xfe, 0xce, 0xa7, 0x9c, 0x0f, ++ 0xf6, 0x9b, 0xef, 0x4c, 0x59, 0x56, 0x95, 0x32, 0x31, 0x50, 0x2f, 0xc7, ++ 0xdc, 0x4c, 0x45, 0xbf, 0x42, 0x5f, 0x2f, 0x87, 0xe8, 0x3b, 0x17, 0x74, ++ 0xbe, 0x59, 0xab, 0xf7, 0x78, 0xc5, 0x3b, 0x4f, 0xc5, 0x73, 0x73, 0x8b, ++ 0xe2, 0x2c, 0x74, 0x9e, 0x36, 0xd7, 0x32, 0x2a, 0x0f, 0xed, 0x56, 0x46, ++ 0xa2, 0xbb, 0x2a, 0x85, 0xea, 0x3e, 0xb6, 0xdc, 0x44, 0x93, 0x28, 0xde, ++ 0x89, 0xae, 0x88, 0x00, 0x9f, 0x5b, 0x99, 0x73, 0x32, 0xe2, 0x39, 0x50, ++ 0xaf, 0xc7, 0xbf, 0x9f, 0x34, 0x70, 0x9e, 0x29, 0x81, 0xd1, 0xf9, 0x3f, ++ 0xab, 0x99, 0xd7, 0x33, 0x3e, 0x05, 0x72, 0x81, 0xdf, 0x2f, 0x02, 0xa9, ++ 0x52, 0xb1, 0xae, 0x85, 0x3d, 0x56, 0x4c, 0xf5, 0x8f, 0x4f, 0x44, 0x5b, ++ 0x1c, 0x78, 0x0e, 0xc1, 0x8c, 0xf0, 0x5a, 0x03, 0xf0, 0x36, 0x5a, 0x44, ++ 0xdd, 0x8f, 0xae, 0xee, 0xb2, 0xd1, 0x66, 0xa0, 0xef, 0x71, 0x36, 0xb2, ++ 0x70, 0x3a, 0xcf, 0x3d, 0x3b, 0xcc, 0xfd, 0x03, 0x5c, 0xff, 0x23, 0x11, ++ 0x45, 0x74, 0x5e, 0x3a, 0x6b, 0xdb, 0xf4, 0x24, 0xf2, 0x07, 0x61, 0xbd, ++ 0xd3, 0xb5, 0xf5, 0x1a, 0x06, 0xd7, 0x21, 0x62, 0xfd, 0x1f, 0x3e, 0xa7, ++ 0xaf, 0xff, 0xd3, 0xd6, 0x85, 0xc7, 0xd7, 0xf1, 0xbd, 0x76, 0x81, 0x2f, ++ 0x6d, 0x9d, 0x76, 0xed, 0xbc, 0x8f, 0x53, 0x09, 0x39, 0xef, 0xa3, 0xad, ++ 0xff, 0xa9, 0x70, 0xbe, 0x4e, 0x23, 0xee, 0xc4, 0xa7, 0xd1, 0xb3, 0x2a, ++ 0xea, 0x07, 0xfd, 0xfa, 0x34, 0x7e, 0xf8, 0x7f, 0xb9, 0x32, 0xe6, 0xdc, ++ 0x60, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ++}; ++ ++static const u8 xsem_int_table_data_e1[] = { ++ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xbb, 0x2c, ++ 0xcb, 0xc0, 0xf0, 0xa3, 0x1e, 0x81, 0x19, 0x65, 0x18, 0x18, 0x26, 0xf1, ++ 0xa1, 0x8a, 0xd1, 0x12, 0xcf, 0xe0, 0x66, 0x60, 0x78, 0x04, 0xc4, 0x2c, ++ 0x3c, 0x0c, 0x0c, 0x85, 0x40, 0x7b, 0x23, 0x80, 0x74, 0x24, 0x10, 0x1f, ++ 0x01, 0xe2, 0xa3, 0x40, 0xac, 0xc2, 0xcb, 0xc0, 0x10, 0x0b, 0xc4, 0x71, ++ 0x40, 0x3c, 0x07, 0xc8, 0x9f, 0x0b, 0xc4, 0xa5, 0x40, 0x9c, 0x05, 0x75, ++ 0x63, 0x2b, 0x0b, 0x03, 0x43, 0x3b, 0x10, 0x77, 0x02, 0x71, 0x37, 0x10, ++ 0xeb, 0x30, 0x33, 0x30, 0xe8, 0x32, 0x13, 0x6f, 0x7f, 0x81, 0x08, 0x03, ++ 0xc3, 0x43, 0x09, 0x04, 0x5f, 0x4e, 0x92, 0x81, 0x41, 0x51, 0x9a, 0x7e, ++ 0xfe, 0x1f, 0x6c, 0x78, 0xaa, 0x3e, 0x7d, 0xed, 0xe3, 0x30, 0x60, 0x60, ++ 0x58, 0x64, 0x81, 0xe0, 0x0b, 0x03, 0xd9, 0x8b, 0x2d, 0x50, 0xd5, 0x2c, ++ 0xb1, 0xc0, 0x6f, 0xc6, 0x52, 0x34, 0xf9, 0x65, 0x68, 0xfc, 0xe5, 0x78, ++ 0xf4, 0xef, 0xd6, 0x43, 0xe5, 0x6b, 0x6b, 0xa0, 0xb9, 0x4f, 0x8b, 0x81, ++ 0xc1, 0x1c, 0x29, 0x4c, 0x74, 0x34, 0xf0, 0xbb, 0x05, 0x1d, 0xa7, 0x01, ++ 0xf5, 0xa6, 0x03, 0x31, 0x00, 0xa6, 0x8b, 0xff, 0x47, 0x68, 0x03, 0x00, ++ 0x00, 0x00, 0x00, 0x00 ++}; ++ ++static const u8 xsem_pram_data_e1[] = { ++ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xe5, 0x7d, ++ 0x0b, 0x78, 0x54, 0xd5, 0xb5, 0xf0, 0x3e, 0x73, 0x1e, 0xf3, 0xc8, 0xcc, ++ 0x64, 0x12, 0x42, 0x08, 0x10, 0xc2, 0x09, 0x2f, 0xa3, 0x0d, 0x38, 0x21, ++ 0x21, 0x05, 0x8a, 0xed, 0x10, 0x20, 0xa2, 0x45, 0x8d, 0x8f, 0x2a, 0x54, ++ 0xd4, 0x09, 0x8f, 0x24, 0xe4, 0x35, 0x01, 0x1f, 0x17, 0x6b, 0xdb, 0x0c, ++ 0x04, 0x23, 0x20, 0x68, 0xb0, 0x58, 0xa2, 0x46, 0x3b, 0x41, 0x50, 0xf0, ++ 0x06, 0x1d, 0x68, 0x90, 0x20, 0x01, 0x07, 0xb0, 0x1a, 0x7a, 0x7d, 0x04, ++ 0xaf, 0xf5, 0xd1, 0xf6, 0x7a, 0x83, 0x52, 0x40, 0x08, 0x24, 0xe2, 0x0b, ++ 0x7b, 0x6d, 0xfd, 0xf7, 0x5a, 0x7b, 0x9f, 0xcc, 0x39, 0x27, 0x33, 0x40, ++ 0xff, 0xf6, 0xff, 0x6f, 0xff, 0xfb, 0xc7, 0xaf, 0x3d, 0xec, 0x73, 0xf6, ++ 0x63, 0xed, 0xf5, 0xda, 0x6b, 0xad, 0xbd, 0xf6, 0x1e, 0x99, 0x24, 0x13, ++ 0x69, 0x38, 0x21, 0xdf, 0xc2, 0xdf, 0x0f, 0x08, 0x99, 0x29, 0x11, 0x42, ++ 0x06, 0x46, 0x9f, 0xce, 0x57, 0x88, 0x4a, 0x12, 0x09, 0xa9, 0xcf, 0xa1, ++ 0xe5, 0x14, 0x42, 0xd2, 0x47, 0x91, 0x10, 0x11, 0x08, 0x29, 0xa8, 0xa1, ++ 0xe5, 0x3c, 0x42, 0x1e, 0xba, 0x8d, 0x84, 0xac, 0x99, 0x84, 0xec, 0x7f, ++ 0xdd, 0x82, 0xdf, 0x57, 0xf9, 0x59, 0x99, 0xb6, 0x0b, 0x5b, 0x2e, 0xa7, ++ 0xdf, 0x47, 0xb3, 0xf7, 0x8f, 0x65, 0xd1, 0x76, 0xf4, 0xfd, 0x63, 0xe7, ++ 0x44, 0x6c, 0x17, 0x9c, 0x45, 0x42, 0x9b, 0x69, 0x39, 0x89, 0xd0, 0xde, ++ 0x46, 0x12, 0x3a, 0x84, 0x1f, 0x9f, 0x05, 0xde, 0x06, 0xfb, 0x58, 0x5a, ++ 0xbf, 0xe9, 0x36, 0x0b, 0xb1, 0xaa, 0x84, 0x3c, 0x4a, 0x87, 0x21, 0x93, ++ 0x08, 0x71, 0x11, 0x9f, 0x9d, 0xd0, 0xa6, 0xab, 0x46, 0xb1, 0xfe, 0x1e, ++ 0x99, 0x65, 0x79, 0x46, 0x14, 0xe0, 0x63, 0x24, 0x6d, 0x3e, 0x2d, 0xaf, ++ 0x9e, 0x5e, 0x92, 0xbf, 0x9a, 0x96, 0xd6, 0xc8, 0x0c, 0xae, 0xc6, 0x39, ++ 0x25, 0xcf, 0x04, 0x69, 0xff, 0x1e, 0xcb, 0x48, 0x9c, 0x07, 0xad, 0xf7, ++ 0x98, 0x93, 0xd6, 0x7b, 0xf8, 0xfd, 0x52, 0xb2, 0x9a, 0xb6, 0xdb, 0x30, ++ 0xd7, 0x22, 0x94, 0x64, 0xd3, 0x7a, 0xcd, 0xca, 0xec, 0x50, 0x76, 0x74, ++ 0xfe, 0xda, 0x73, 0x2e, 0x91, 0x78, 0xbb, 0xa0, 0xd5, 0x32, 0x11, 0x9e, ++ 0x3e, 0xfe, 0x8c, 0x28, 0xf0, 0xfc, 0xc5, 0x14, 0x0b, 0x8e, 0xb3, 0xb6, ++ 0x86, 0xe1, 0x83, 0xd6, 0x53, 0x2c, 0x69, 0x84, 0xb4, 0x76, 0x1e, 0xb0, ++ 0xf9, 0x69, 0x7f, 0x6b, 0x2b, 0x5b, 0x0f, 0x17, 0xd2, 0xef, 0x0f, 0x8e, ++ 0xb2, 0x78, 0x29, 0x06, 0xc9, 0x83, 0x9d, 0x07, 0xec, 0x97, 0xd0, 0xf1, ++ 0x83, 0x79, 0x16, 0xef, 0x68, 0x5a, 0x3b, 0x5d, 0x8a, 0x08, 0x1e, 0x67, ++ 0x74, 0xbc, 0x49, 0x84, 0x02, 0x3e, 0x81, 0xd6, 0xf3, 0xee, 0xb0, 0xa9, ++ 0xce, 0xfe, 0xf5, 0x69, 0xbf, 0x53, 0x61, 0xde, 0x6b, 0x28, 0xde, 0xc5, ++ 0xcc, 0x68, 0xbb, 0xf1, 0x00, 0x27, 0x6d, 0xb7, 0x96, 0x92, 0x2c, 0x4c, ++ 0xc7, 0xfd, 0xa5, 0xec, 0x3d, 0x04, 0xe3, 0xfe, 0xf2, 0x9a, 0x64, 0x21, ++ 0x48, 0xa2, 0xf5, 0xae, 0x02, 0x20, 0xa1, 0xde, 0x5c, 0x0b, 0x89, 0xd0, ++ 0x7a, 0x44, 0xea, 0xb5, 0x11, 0x3a, 0xce, 0xea, 0x29, 0x6f, 0xdb, 0x46, ++ 0xd3, 0xfa, 0xab, 0x8b, 0x2c, 0x30, 0x09, 0xb2, 0xd6, 0xab, 0x7d, 0xf7, ++ 0xda, 0x09, 0xf4, 0x37, 0x63, 0xcc, 0xa1, 0x51, 0x40, 0xd7, 0xab, 0xe8, ++ 0x77, 0x98, 0x47, 0xf6, 0x23, 0xb3, 0x61, 0xde, 0x0f, 0x4f, 0x57, 0x08, ++ 0xe0, 0xff, 0x97, 0x02, 0xad, 0x47, 0x51, 0xdc, 0x58, 0xac, 0xfc, 0x10, ++ 0xe0, 0x73, 0xd5, 0x10, 0x0f, 0xbc, 0xa7, 0x4f, 0x5f, 0x2c, 0xbc, 0xb6, ++ 0x09, 0x36, 0x84, 0x83, 0xac, 0xd9, 0x40, 0x48, 0x3e, 0x01, 0x10, 0xf0, ++ 0x6f, 0xb5, 0x2f, 0xb4, 0x72, 0x04, 0xf0, 0x57, 0x1e, 0xf1, 0x42, 0x39, ++ 0xdd, 0x4b, 0xdb, 0x3b, 0xfb, 0xb7, 0xef, 0x12, 0xac, 0x48, 0x97, 0x46, ++ 0x39, 0x38, 0x18, 0xf0, 0x17, 0x8f, 0x7e, 0xa3, 0x38, 0x3e, 0x57, 0x67, ++ 0x2d, 0xb1, 0x03, 0x3d, 0x08, 0x69, 0x48, 0x2b, 0x1a, 0x4b, 0xc8, 0x7a, ++ 0xc0, 0x13, 0x0c, 0x2a, 0xf9, 0xd5, 0xeb, 0x5d, 0xd1, 0xfa, 0x2b, 0x05, ++ 0x86, 0x9f, 0x75, 0x32, 0xf1, 0x09, 0x74, 0x7e, 0x09, 0x79, 0x4a, 0x68, ++ 0x19, 0xc5, 0xb3, 0x25, 0xdb, 0x33, 0x07, 0xe6, 0xeb, 0xf4, 0x2b, 0xe4, ++ 0x4a, 0x5a, 0x5e, 0x25, 0x04, 0x07, 0x8b, 0x40, 0x97, 0xb1, 0x0a, 0xd9, ++ 0xac, 0x22, 0x5f, 0xd8, 0x47, 0xd3, 0xf2, 0xda, 0x4b, 0x93, 0xbd, 0xc0, ++ 0x7f, 0xf5, 0x42, 0x38, 0x4d, 0x82, 0xef, 0xd7, 0xd0, 0xef, 0xb4, 0xcb, ++ 0x03, 0x45, 0xe3, 0xe7, 0x00, 0x7f, 0x36, 0x79, 0x15, 0xe4, 0x67, 0xca, ++ 0x3f, 0x87, 0x00, 0xdf, 0x6b, 0xfd, 0xc9, 0x64, 0xb5, 0x8a, 0xdf, 0x3b, ++ 0xb1, 0xbd, 0x73, 0x94, 0xc7, 0x8a, 0x98, 0xa0, 0xf0, 0x50, 0xbc, 0x0c, ++ 0xa0, 0xbc, 0x04, 0x78, 0xcd, 0xb9, 0xae, 0xfe, 0xaa, 0x91, 0x40, 0x9f, ++ 0x09, 0x16, 0x0f, 0x50, 0x68, 0xb5, 0x30, 0x55, 0x9d, 0x0f, 0xf2, 0x93, ++ 0x64, 0xf3, 0xc0, 0xf8, 0xf2, 0x84, 0x1b, 0x90, 0x7e, 0xf2, 0xc0, 0x64, ++ 0x81, 0xe8, 0xe8, 0xfd, 0x73, 0xa0, 0x37, 0xc5, 0xd3, 0x4f, 0xd5, 0xa2, ++ 0x9f, 0xc3, 0xbc, 0x9e, 0xc8, 0xfb, 0x28, 0x69, 0x34, 0xad, 0xbf, 0x26, ++ 0xe7, 0xc5, 0x46, 0xa0, 0xd3, 0x93, 0xf7, 0xd8, 0x90, 0x7e, 0x4f, 0x4e, ++ 0xe8, 0x5c, 0x0c, 0x72, 0xf5, 0xd8, 0xb9, 0xdc, 0xf7, 0xfd, 0x28, 0x97, ++ 0x8a, 0x77, 0x33, 0xed, 0xe7, 0xa9, 0x9c, 0x63, 0x99, 0x84, 0x0e, 0xf8, ++ 0xc8, 0xcc, 0x8f, 0x92, 0x00, 0x7f, 0xc3, 0x46, 0x35, 0xdc, 0x49, 0xdc, ++ 0xf4, 0x39, 0xab, 0xb7, 0x96, 0x8c, 0xa3, 0xf0, 0x91, 0x86, 0xa2, 0x05, ++ 0x99, 0xc8, 0x27, 0xc2, 0x8d, 0x14, 0xaf, 0xc3, 0x96, 0x2a, 0x44, 0xb5, ++ 0x31, 0x5a, 0x7e, 0x4b, 0xe0, 0x3b, 0xf1, 0x85, 0xb3, 0x59, 0xd9, 0x49, ++ 0xe7, 0x33, 0x8c, 0xd3, 0xb9, 0xb5, 0xf3, 0x6d, 0x5b, 0x31, 0xf4, 0x37, ++ 0x97, 0x44, 0xc6, 0xb8, 0xf1, 0xbd, 0x2d, 0x35, 0x39, 0xaa, 0x67, 0x86, ++ 0xe5, 0x91, 0x48, 0x2a, 0xed, 0xff, 0xb1, 0x85, 0xaf, 0xa2, 0x9c, 0x3f, ++ 0x79, 0x59, 0xaa, 0x97, 0xc9, 0x79, 0x1a, 0xf2, 0x4b, 0x06, 0xef, 0x27, ++ 0x1d, 0xea, 0x53, 0xfd, 0x92, 0x66, 0x23, 0xc1, 0x04, 0xfa, 0x1c, 0xd6, ++ 0xd1, 0x7b, 0x03, 0xc0, 0x35, 0x2c, 0xeb, 0xd8, 0x5c, 0x80, 0x73, 0xff, ++ 0x1b, 0xaf, 0x0a, 0x40, 0xb7, 0xa7, 0xc6, 0xa5, 0xaa, 0xa0, 0x8f, 0x92, ++ 0xfc, 0x9d, 0xa4, 0x8b, 0xd2, 0x7d, 0x58, 0xf6, 0xbb, 0xf7, 0x41, 0x3d, ++ 0x97, 0x33, 0x94, 0x56, 0x94, 0x8d, 0xf5, 0xff, 0x82, 0xed, 0x4c, 0xf0, ++ 0x3f, 0xae, 0xfa, 0x36, 0x01, 0xfe, 0xb6, 0x09, 0x35, 0x87, 0x80, 0x3e, ++ 0xc1, 0x1c, 0x8b, 0x97, 0xd1, 0x9b, 0xe9, 0xc1, 0x35, 0x77, 0xa5, 0x86, ++ 0x40, 0x8f, 0x0c, 0x73, 0xfc, 0xf1, 0x7a, 0x71, 0x04, 0xf2, 0x01, 0x21, ++ 0xa9, 0x14, 0x3e, 0x0f, 0x41, 0x39, 0xa9, 0x17, 0x22, 0xb6, 0x91, 0xd0, ++ 0xee, 0x5e, 0xd6, 0x6e, 0x38, 0x09, 0x09, 0x80, 0xe7, 0x61, 0x59, 0xc1, ++ 0xc5, 0xa2, 0x1b, 0xea, 0xfb, 0x85, 0x22, 0x57, 0xff, 0x71, 0x5b, 0x41, ++ 0x23, 0x82, 0x7c, 0x50, 0x4e, 0x07, 0x7e, 0xdd, 0xae, 0x90, 0xf2, 0xa2, ++ 0x18, 0x72, 0xf0, 0x32, 0x97, 0xe7, 0x7a, 0x81, 0xcc, 0x46, 0x7e, 0x26, ++ 0xd2, 0x5f, 0x81, 0x6f, 0x86, 0x27, 0x31, 0xbe, 0xd1, 0xca, 0x4f, 0x01, ++ 0x3c, 0x74, 0xdc, 0xed, 0xaf, 0x24, 0xff, 0x30, 0x9b, 0xc2, 0xf3, 0xab, ++ 0xa5, 0x23, 0x72, 0x44, 0x0a, 0xcf, 0x43, 0xd0, 0x2e, 0x86, 0xdc, 0xac, ++ 0xe5, 0x72, 0xe0, 0xe8, 0x20, 0x41, 0x81, 0xe2, 0x75, 0xff, 0x6f, 0x7f, ++ 0x6b, 0x07, 0xbc, 0x6d, 0xb7, 0x90, 0x32, 0xa8, 0x3f, 0x35, 0x2b, 0x6c, ++ 0xeb, 0xe2, 0x74, 0x05, 0x7a, 0x2c, 0x24, 0xac, 0xff, 0xa6, 0xec, 0x8d, ++ 0x36, 0xd4, 0x17, 0x42, 0x16, 0xf2, 0xdd, 0xc2, 0x89, 0x8a, 0xcf, 0x3e, ++ 0x0e, 0xe4, 0x6f, 0xb9, 0xe0, 0xa7, 0xed, 0xd3, 0x3c, 0x4c, 0x2f, 0xbb, ++ 0xbc, 0x4a, 0x08, 0xf4, 0xb2, 0x2b, 0x2d, 0x28, 0x58, 0x28, 0x3c, 0x6a, ++ 0x36, 0xf1, 0x6c, 0xcc, 0x64, 0xdd, 0x05, 0x29, 0xfe, 0xe6, 0xc1, 0x3f, ++ 0x80, 0xd1, 0x25, 0x56, 0x7f, 0xcd, 0xda, 0xa4, 0xd0, 0x6a, 0xfa, 0x7d, ++ 0x5e, 0x36, 0x15, 0x34, 0xc0, 0x1b, 0xc5, 0x95, 0x85, 0x8e, 0xbb, 0x80, ++ 0xb0, 0x79, 0xce, 0xf3, 0xd6, 0x2f, 0x06, 0xfa, 0x11, 0x52, 0x64, 0x01, ++ 0x7c, 0xae, 0xf6, 0x30, 0xfa, 0x34, 0xc1, 0x38, 0x74, 0x2a, 0x4d, 0xe9, ++ 0xac, 0x9f, 0xb5, 0x77, 0x93, 0xd0, 0x72, 0xe0, 0x23, 0x0f, 0x6b, 0x3f, ++ 0x0a, 0x9a, 0x50, 0xba, 0x8d, 0xca, 0x7b, 0xf1, 0x5f, 0x04, 0xda, 0x6f, ++ 0x3a, 0x6f, 0x07, 0x72, 0x0f, 0xed, 0x12, 0xd2, 0x42, 0x36, 0x0b, 0x6d, ++ 0xa7, 0xd6, 0x58, 0x08, 0xc2, 0x27, 0x45, 0x0e, 0x09, 0x40, 0xf7, 0xb1, ++ 0xa9, 0x2a, 0xc0, 0xd3, 0x94, 0xe6, 0xfd, 0xf7, 0x59, 0x00, 0xff, 0x6c, ++ 0xc9, 0xbb, 0x91, 0x7e, 0x1e, 0x05, 0x70, 0xd0, 0x7e, 0x9a, 0x6a, 0x2c, ++ 0x3e, 0xd4, 0x17, 0x79, 0x4a, 0x33, 0xe8, 0xe9, 0xd5, 0x3e, 0xa6, 0xe7, ++ 0x35, 0x7c, 0x65, 0xf2, 0x71, 0xd3, 0xbd, 0x11, 0x81, 0xce, 0x9d, 0x64, ++ 0x52, 0x3d, 0x89, 0x78, 0xf2, 0x45, 0xec, 0x1e, 0x28, 0x67, 0x33, 0x78, ++ 0x32, 0xf3, 0xd8, 0xbc, 0xfa, 0xe0, 0x1f, 0xab, 0x84, 0x96, 0xd3, 0xc6, ++ 0xe9, 0xb6, 0x08, 0x81, 0x7a, 0x1a, 0x1e, 0x4a, 0x78, 0x7f, 0x25, 0x7c, ++ 0x1e, 0xce, 0xb4, 0xd0, 0x4a, 0x09, 0xe0, 0xce, 0x63, 0x70, 0xd3, 0x75, ++ 0x19, 0xe1, 0x49, 0xcf, 0x56, 0x9a, 0x41, 0x0e, 0xd2, 0xd3, 0x58, 0x7f, ++ 0x2a, 0xc5, 0x8f, 0x86, 0x77, 0x80, 0xcb, 0xa1, 0xc1, 0x95, 0x47, 0xeb, ++ 0x83, 0x1e, 0xf6, 0x2a, 0xcd, 0xc0, 0x0a, 0x0e, 0x0e, 0x5f, 0x49, 0x36, ++ 0x83, 0x67, 0xff, 0xeb, 0x6f, 0x77, 0x08, 0xac, 0x3f, 0x94, 0x2b, 0x07, ++ 0x87, 0xd7, 0xc1, 0xe7, 0x4f, 0x00, 0xde, 0x54, 0xae, 0xd7, 0x69, 0x7f, ++ 0x2d, 0x72, 0x44, 0x10, 0x69, 0xfd, 0xd0, 0x04, 0xa2, 0x6e, 0x64, 0xa3, ++ 0xa9, 0x52, 0x7e, 0xf4, 0xfb, 0x23, 0x35, 0x14, 0x0f, 0xb4, 0xe0, 0xe4, ++ 0xe3, 0x90, 0xf5, 0x56, 0x94, 0x07, 0xfa, 0x2a, 0xf8, 0x2d, 0xe5, 0x83, ++ 0xf9, 0x0d, 0xb4, 0x9c, 0x15, 0x95, 0x8f, 0xd1, 0x2b, 0xad, 0x06, 0x79, ++ 0x71, 0xf2, 0x79, 0x93, 0x06, 0x26, 0x47, 0x94, 0x6d, 0x22, 0xd0, 0x2e, ++ 0x93, 0xb0, 0xb2, 0x05, 0xca, 0x74, 0x1e, 0x25, 0x59, 0x46, 0x39, 0x23, ++ 0x5e, 0x5d, 0x99, 0xc2, 0xe1, 0x02, 0x7e, 0xa7, 0xfa, 0x67, 0xd9, 0x24, ++ 0x85, 0xf1, 0xcf, 0xa5, 0xcc, 0x8e, 0x21, 0x44, 0x57, 0x0f, 0xf8, 0x7c, ++ 0x82, 0xfa, 0xf4, 0x1a, 0xfc, 0xae, 0xe0, 0xba, 0x9e, 0xf1, 0x53, 0xc5, ++ 0x00, 0xdf, 0xb0, 0x9a, 0xd4, 0x02, 0x11, 0xf4, 0x49, 0xc7, 0xe3, 0x37, ++ 0x58, 0x80, 0xaf, 0xee, 0x22, 0x16, 0x31, 0x11, 0xf9, 0x59, 0xe8, 0xd3, ++ 0x5f, 0x74, 0xbc, 0x1d, 0x4b, 0x22, 0x76, 0x98, 0xa4, 0xa3, 0xa3, 0x28, ++ 0x19, 0xf0, 0x96, 0x51, 0x93, 0x5c, 0xa0, 0x00, 0x1e, 0x3b, 0xfc, 0x58, ++ 0x76, 0x74, 0xd4, 0xf8, 0xf0, 0x09, 0x4b, 0xd3, 0x78, 0x42, 0x86, 0x10, ++ 0xdd, 0x38, 0x99, 0xa0, 0x5f, 0x3d, 0x15, 0x2d, 0x14, 0xaf, 0xa4, 0x46, ++ 0x09, 0x83, 0xbe, 0x9e, 0xa0, 0x87, 0x93, 0x7e, 0xcf, 0x78, 0xa5, 0xe1, ++ 0x7a, 0xa0, 0xd7, 0x03, 0x8b, 0x5f, 0x1d, 0x0c, 0xf2, 0x9b, 0x6a, 0x6a, ++ 0x3f, 0xce, 0x32, 0x02, 0xe5, 0x74, 0xd8, 0x2b, 0xb4, 0x16, 0x8e, 0x7f, ++ 0xec, 0x67, 0x50, 0x7f, 0x15, 0xd7, 0x27, 0x0e, 0x80, 0x78, 0x3c, 0x3e, ++ 0x5f, 0x81, 0xe7, 0x30, 0x27, 0xd5, 0xb3, 0x54, 0x4f, 0x67, 0x50, 0x04, ++ 0x2b, 0xe3, 0xa3, 0xfa, 0x62, 0xf5, 0xa5, 0xef, 0xe6, 0xf8, 0x9d, 0x9c, ++ 0x7f, 0x92, 0xf1, 0x19, 0x81, 0xa7, 0x59, 0xaf, 0xe8, 0xea, 0x5f, 0xca, ++ 0xeb, 0x07, 0x85, 0xf3, 0xd6, 0x3b, 0x86, 0xf5, 0x34, 0x78, 0xcc, 0xdf, ++ 0xcf, 0x08, 0x16, 0xd4, 0x53, 0x2e, 0xb0, 0x33, 0x29, 0x7e, 0x1f, 0x26, ++ 0x9e, 0x39, 0xb8, 0x2e, 0x7b, 0x2d, 0xb8, 0x2e, 0x26, 0xf0, 0xf7, 0x61, ++ 0xef, 0x81, 0x02, 0xa4, 0x67, 0x98, 0x78, 0x85, 0x4c, 0xd0, 0xb7, 0x7f, ++ 0xb5, 0xea, 0xf9, 0xe0, 0x27, 0xf0, 0x12, 0xf4, 0xad, 0x14, 0x46, 0x39, ++ 0x51, 0x32, 0x1c, 0x68, 0x1f, 0x52, 0x39, 0x4e, 0x80, 0x75, 0xaf, 0x49, ++ 0xaa, 0x29, 0x83, 0xf7, 0xe1, 0x74, 0x07, 0x01, 0xbd, 0x70, 0x60, 0xc6, ++ 0xab, 0x02, 0xe0, 0x33, 0xbd, 0xcd, 0x3f, 0x1c, 0xe4, 0x50, 0xb3, 0x73, ++ 0x0b, 0xbc, 0xe1, 0x34, 0x78, 0xff, 0xe0, 0x21, 0xff, 0x25, 0x28, 0x9f, ++ 0x71, 0xec, 0x46, 0xcd, 0x4e, 0x34, 0xcf, 0x67, 0xe8, 0x15, 0xcb, 0x51, ++ 0x1f, 0x0c, 0xf7, 0xf7, 0x76, 0xc0, 0x7a, 0xef, 0xac, 0x94, 0xbc, 0x57, ++ 0x02, 0x7f, 0xf9, 0x29, 0x5c, 0x4e, 0xd4, 0x93, 0x2a, 0xf9, 0x2e, 0x85, ++ 0xdf, 0x1b, 0x5c, 0x06, 0x7a, 0x56, 0xf5, 0xd3, 0xf2, 0x20, 0xfa, 0xac, ++ 0xe4, 0xcf, 0x32, 0xf6, 0x7d, 0x55, 0x6d, 0x59, 0xee, 0x51, 0x29, 0xda, ++ 0xef, 0xaa, 0x51, 0xd4, 0x1e, 0xa5, 0x7a, 0x71, 0x7d, 0xe7, 0x7a, 0xdb, ++ 0x35, 0x60, 0x67, 0xd4, 0x58, 0x54, 0xe0, 0xdb, 0xb5, 0xde, 0xb7, 0x6d, ++ 0x3e, 0x27, 0x94, 0x0b, 0x06, 0x00, 0x9e, 0x5b, 0x8b, 0x34, 0xbb, 0x2f, ++ 0x22, 0xc0, 0x78, 0xe9, 0xef, 0xf8, 0xd0, 0xce, 0x9b, 0xe0, 0x51, 0x3c, ++ 0xa0, 0xb4, 0xc6, 0x5a, 0x23, 0x83, 0x3d, 0xba, 0xf5, 0xa2, 0x69, 0xc6, ++ 0xbb, 0xe3, 0x01, 0x0e, 0x72, 0x13, 0x25, 0xe2, 0xe0, 0xf8, 0x74, 0xa4, ++ 0xf3, 0x45, 0x3e, 0x8b, 0xb7, 0x9e, 0x00, 0x2c, 0x16, 0xdd, 0x3a, 0xb2, ++ 0x3f, 0x6b, 0x07, 0xae, 0x2f, 0x6f, 0x90, 0x4b, 0x91, 0x2e, 0xda, 0xba, ++ 0xa2, 0xad, 0x23, 0xd8, 0x23, 0xd5, 0x2f, 0xf3, 0xb9, 0x1c, 0x3d, 0xa8, ++ 0x86, 0x6d, 0x02, 0xea, 0x2b, 0x2a, 0xbb, 0x94, 0x3e, 0xf3, 0xb9, 0x1e, ++ 0x71, 0x72, 0xbd, 0x49, 0xf5, 0x30, 0xd3, 0x73, 0x7c, 0x3d, 0x59, 0xbb, ++ 0x38, 0x15, 0xd7, 0x13, 0x4d, 0x7f, 0x82, 0x6d, 0x0d, 0x4a, 0x62, 0x3e, ++ 0xd7, 0xb7, 0x6b, 0x73, 0x9e, 0x49, 0xba, 0x86, 0xc2, 0xe4, 0x04, 0x3d, ++ 0x0b, 0x7a, 0x29, 0x8d, 0x14, 0xc0, 0xfa, 0x3b, 0x1a, 0xf4, 0x0c, 0xe8, ++ 0x27, 0x29, 0x28, 0xc0, 0x78, 0x4d, 0x13, 0x3c, 0x64, 0x35, 0xae, 0x63, ++ 0x46, 0x7d, 0x3a, 0xba, 0x86, 0xe9, 0xc1, 0x07, 0xd3, 0x08, 0xf2, 0x13, ++ 0x5d, 0x87, 0x9a, 0x61, 0xbd, 0x6b, 0x4a, 0x0f, 0xa7, 0x41, 0x3f, 0x4d, ++ 0x35, 0x07, 0x04, 0xbf, 0x6e, 0xfd, 0xd4, 0xd6, 0x3b, 0x57, 0x4d, 0x27, ++ 0x01, 0x3d, 0x38, 0x2f, 0x8f, 0xad, 0x73, 0xf3, 0xb2, 0xd9, 0x78, 0xbf, ++ 0x07, 0x04, 0x4d, 0x60, 0xf0, 0x82, 0x5e, 0x35, 0xaf, 0x7b, 0xbf, 0x98, ++ 0xb2, 0x03, 0x95, 0x65, 0x02, 0xb7, 0xb7, 0xcc, 0xf8, 0x17, 0x2c, 0xcc, ++ 0x0e, 0x7c, 0x78, 0xd6, 0xdb, 0x88, 0xc7, 0xb5, 0x0b, 0x1e, 0xc1, 0x27, ++ 0x69, 0xd8, 0x80, 0xfd, 0xa5, 0xd9, 0x18, 0x0d, 0x56, 0x65, 0x1d, 0xc0, ++ 0xf7, 0x6b, 0xfc, 0x96, 0x99, 0x60, 0x77, 0xaf, 0x97, 0x3a, 0x57, 0x8e, ++ 0xa2, 0xf0, 0xaf, 0x9f, 0x39, 0x4f, 0x09, 0xd2, 0xef, 0x6b, 0xbc, 0xcc, ++ 0xef, 0x5a, 0x3d, 0x65, 0xde, 0x33, 0xb0, 0xae, 0x59, 0x2d, 0x0a, 0x83, ++ 0xab, 0xa6, 0x0c, 0xed, 0xd5, 0x04, 0x0e, 0xd7, 0x06, 0xe8, 0x1b, 0xfd, ++ 0x44, 0x05, 0xfd, 0xa2, 0xbb, 0x6f, 0xdb, 0xb8, 0x72, 0x04, 0xed, 0x27, ++ 0x8d, 0xfa, 0x31, 0x82, 0x0a, 0x95, 0x42, 0x36, 0x2b, 0xfd, 0xee, 0x04, ++ 0x9a, 0x82, 0xfe, 0xf6, 0x47, 0x18, 0xfc, 0x5e, 0x52, 0x40, 0x62, 0xc0, ++ 0xff, 0x1f, 0x82, 0x83, 0xf9, 0xa1, 0xfe, 0xce, 0x8e, 0xd1, 0x48, 0x4f, ++ 0x8b, 0x07, 0xe0, 0x4d, 0xf0, 0xf6, 0xda, 0xc0, 0x4f, 0x54, 0xa9, 0x1f, ++ 0xa6, 0xaa, 0x00, 0xaf, 0x6a, 0x1f, 0x8b, 0xf0, 0x5a, 0x3c, 0xcb, 0xd4, ++ 0x68, 0xfb, 0xdf, 0x71, 0x7f, 0xe1, 0x76, 0x58, 0xf8, 0xc1, 0xbe, 0x9f, ++ 0xf3, 0xee, 0x4c, 0x90, 0xaf, 0x75, 0xb7, 0x31, 0xbf, 0xcc, 0x0c, 0xff, ++ 0xdd, 0x53, 0x43, 0x1d, 0x16, 0x1c, 0x87, 0xa0, 0x5b, 0xe7, 0x8a, 0x83, ++ 0xd7, 0xb9, 0xa0, 0xc1, 0x40, 0xff, 0x78, 0x43, 0x08, 0x97, 0x2b, 0x8b, ++ 0xc1, 0x75, 0x54, 0x60, 0xf4, 0x7a, 0xb8, 0xb3, 0xe0, 0x2a, 0xf4, 0x93, ++ 0x8a, 0xe8, 0x7b, 0xda, 0xd1, 0x23, 0x9d, 0x23, 0xec, 0x20, 0xdf, 0x66, ++ 0x7b, 0xef, 0xc9, 0x84, 0x0f, 0x73, 0xd0, 0xde, 0x31, 0xad, 0x33, 0x17, ++ 0x2a, 0x0f, 0x33, 0xe9, 0xfb, 0xb1, 0xd6, 0xf0, 0xd5, 0xc8, 0x6f, 0xdb, ++ 0x2c, 0xa8, 0xa7, 0x08, 0x61, 0x7a, 0x4e, 0x20, 0x16, 0xf5, 0xdb, 0x91, ++ 0xb0, 0x88, 0x30, 0xb8, 0x90, 0xf5, 0xa8, 0xfe, 0x5e, 0x21, 0x47, 0xe6, ++ 0x2c, 0xa0, 0xf5, 0x57, 0xec, 0x74, 0x12, 0xc0, 0x97, 0xc6, 0x0f, 0xe9, ++ 0xbc, 0xcf, 0xd5, 0x35, 0x94, 0x0f, 0x62, 0xcc, 0xbb, 0x43, 0x10, 0xe3, ++ 0xd1, 0x9d, 0xd9, 0x19, 0x9c, 0xee, 0x9d, 0x30, 0xde, 0xc0, 0x0b, 0xd3, ++ 0x9f, 0x4a, 0xb3, 0x1d, 0xec, 0xb6, 0x70, 0xa8, 0x7e, 0x48, 0x39, 0xf8, ++ 0x1f, 0x35, 0xcc, 0xdf, 0x0d, 0x47, 0x0e, 0xa0, 0xfe, 0x49, 0x9f, 0x7e, ++ 0x33, 0xfa, 0x29, 0x5b, 0x9a, 0x53, 0xe7, 0x2c, 0x00, 0xbe, 0xca, 0xf2, ++ 0x79, 0x01, 0x1d, 0x1a, 0x3c, 0x60, 0x9f, 0xc4, 0xf2, 0x13, 0xaf, 0xb6, ++ 0xd8, 0xce, 0xeb, 0xbf, 0xc7, 0xd3, 0xc3, 0x8d, 0x95, 0x2b, 0xd0, 0xef, ++ 0x6d, 0xec, 0x8c, 0x3d, 0xff, 0x29, 0x16, 0xe6, 0x6f, 0x87, 0xa9, 0x9e, ++ 0xf4, 0x66, 0xc7, 0x1f, 0x3f, 0xdf, 0xc2, 0xec, 0xe8, 0x24, 0x0b, 0xe7, ++ 0xbb, 0x19, 0xaf, 0xa6, 0xe9, 0xd7, 0x33, 0x6d, 0x5d, 0xd5, 0xd6, 0xd9, ++ 0x61, 0x12, 0x09, 0x8a, 0xba, 0xf5, 0xf0, 0x26, 0x8e, 0x3f, 0xf3, 0xba, ++ 0x49, 0xa4, 0x06, 0xdb, 0x18, 0xc6, 0xe7, 0xe8, 0x3f, 0x36, 0x2e, 0x60, ++ 0x71, 0x88, 0x0d, 0x53, 0x2c, 0x18, 0x5f, 0xd1, 0xf8, 0x9c, 0xd6, 0x4b, ++ 0x03, 0xbc, 0xd2, 0x79, 0xa0, 0x3d, 0x47, 0xf9, 0x30, 0x04, 0xf6, 0xdc, ++ 0xc3, 0xa4, 0x01, 0xe5, 0x26, 0x48, 0xdb, 0x6f, 0x26, 0xfd, 0xe1, 0xbe, ++ 0x8d, 0x58, 0x2e, 0x6a, 0x7e, 0x93, 0xf9, 0xfc, 0xfa, 0xc6, 0xe3, 0xfe, ++ 0xf5, 0xed, 0x5c, 0x5f, 0xad, 0xcb, 0xb9, 0xc7, 0x0e, 0x5d, 0xd1, 0xf1, ++ 0xd2, 0x80, 0x3f, 0x02, 0x6e, 0xa6, 0x27, 0xab, 0x5c, 0xcc, 0x8e, 0x9d, ++ 0xb6, 0x53, 0x8e, 0xfc, 0x80, 0xc2, 0x51, 0xd5, 0x2c, 0xa0, 0x9d, 0x65, ++ 0xd9, 0x67, 0x47, 0x38, 0xcf, 0x6c, 0xa2, 0x65, 0xda, 0x75, 0xc4, 0xa5, ++ 0x60, 0xfd, 0xd3, 0x1e, 0x1b, 0x96, 0x03, 0xd6, 0xce, 0x87, 0xbe, 0x47, ++ 0xcb, 0xbd, 0x3b, 0x45, 0x82, 0x76, 0x64, 0x96, 0xc3, 0x02, 0xfc, 0x7a, ++ 0x8c, 0xf3, 0x2b, 0xc9, 0xa3, 0x65, 0xb0, 0x87, 0xed, 0xac, 0x58, 0xd5, ++ 0xbc, 0xff, 0x76, 0xe8, 0xaf, 0xac, 0xcd, 0x4a, 0xec, 0xb4, 0xff, 0xaa, ++ 0xdd, 0xa5, 0xd7, 0x7e, 0x8f, 0x96, 0x4b, 0x3b, 0x64, 0x02, 0x55, 0xaa, ++ 0x36, 0x2f, 0x53, 0x86, 0xd0, 0xf2, 0xa2, 0x90, 0x10, 0x86, 0x72, 0x4f, ++ 0x01, 0x5d, 0xa8, 0x00, 0x2f, 0xc9, 0x4a, 0x08, 0xfc, 0xf6, 0x1e, 0x77, ++ 0x67, 0xea, 0x8f, 0xe8, 0xbc, 0x4f, 0xd6, 0xda, 0x88, 0x4a, 0x41, 0xa9, ++ 0x73, 0x75, 0xa6, 0xde, 0x44, 0xf1, 0x51, 0x1e, 0xda, 0x5e, 0x08, 0xed, ++ 0xca, 0x5b, 0x04, 0xd0, 0x88, 0x74, 0x1e, 0x9b, 0x5f, 0x1d, 0x0c, 0xf3, ++ 0xda, 0x2a, 0x78, 0xc1, 0xbf, 0xaf, 0xd8, 0x92, 0x60, 0xb0, 0x07, 0x8f, ++ 0xd1, 0xa9, 0xfc, 0x80, 0x7e, 0x5f, 0x42, 0xe7, 0x09, 0x72, 0x59, 0x4a, ++ 0x1a, 0x0a, 0x61, 0x9d, 0xab, 0xda, 0xbc, 0x4e, 0x51, 0x75, 0xf1, 0x87, ++ 0x93, 0xb5, 0x1e, 0x1c, 0x47, 0x2b, 0x57, 0x6d, 0xa5, 0xe3, 0xd0, 0x76, ++ 0xd5, 0xcf, 0x0b, 0x5e, 0x98, 0x62, 0xb5, 0x85, 0xf8, 0x41, 0x0f, 0x9d, ++ 0xd9, 0x6d, 0x9f, 0xfd, 0xb4, 0x13, 0xe6, 0xb7, 0x4c, 0x19, 0xe3, 0x82, ++ 0x79, 0x3d, 0xa0, 0x40, 0xbd, 0xd2, 0x50, 0xf1, 0x8b, 0x76, 0x15, 0xe0, ++ 0x6b, 0x56, 0x0a, 0xe9, 0xf7, 0xf2, 0xa6, 0x66, 0x05, 0xe2, 0x5b, 0x01, ++ 0x2b, 0xb9, 0x03, 0xfc, 0xdc, 0x8a, 0x2d, 0x03, 0x8c, 0x70, 0x35, 0x8a, ++ 0x28, 0xaf, 0x4b, 0x92, 0x6c, 0x1b, 0x41, 0x9f, 0x13, 0xa7, 0x2f, 0xed, ++ 0x86, 0xb1, 0xfd, 0xe9, 0x7c, 0xb2, 0x96, 0xea, 0xd8, 0x31, 0xd1, 0x72, ++ 0x39, 0xe8, 0x43, 0xe4, 0xc3, 0x90, 0x72, 0xbd, 0xae, 0xfe, 0x70, 0x31, ++ 0x09, 0xf9, 0xb5, 0x62, 0x8b, 0x68, 0xb4, 0xb3, 0xf9, 0xfa, 0x1f, 0x3c, ++ 0xcc, 0xe8, 0x1f, 0xdc, 0xeb, 0xc2, 0xb8, 0x9f, 0x46, 0xbf, 0x25, 0xdc, ++ 0x5f, 0xd6, 0xe8, 0xb7, 0x24, 0x89, 0xd3, 0x53, 0xea, 0xcd, 0x8f, 0x05, ++ 0xcf, 0x43, 0x40, 0x0f, 0x0a, 0x4f, 0x03, 0xe0, 0x8b, 0x3e, 0xd7, 0x70, ++ 0xf8, 0xdc, 0x53, 0xc8, 0x54, 0x88, 0xbb, 0xb8, 0x7d, 0xc4, 0x23, 0xc4, ++ 0xe0, 0x6b, 0xf3, 0xb3, 0x41, 0x26, 0xc5, 0xc0, 0xba, 0xff, 0xba, 0xfc, ++ 0xfa, 0xa9, 0xd2, 0x60, 0x74, 0x1f, 0x16, 0x43, 0xe4, 0xc9, 0xb3, 0x62, ++ 0xce, 0xd4, 0xe9, 0xb4, 0xfc, 0x3b, 0x4b, 0xd1, 0x66, 0x0b, 0xea, 0x0f, ++ 0xaf, 0x0a, 0x72, 0xa4, 0xf9, 0xd9, 0x4f, 0x59, 0x98, 0x5c, 0xd6, 0x0f, ++ 0x56, 0x10, 0x7f, 0x0d, 0x33, 0xf2, 0x9f, 0x66, 0xf1, 0x09, 0x82, 0xeb, ++ 0x5e, 0xc3, 0x8c, 0x92, 0x67, 0xc0, 0x2e, 0xa0, 0xed, 0xb7, 0x59, 0x50, ++ 0x0e, 0x69, 0xfb, 0xb1, 0xf1, 0xdb, 0x7b, 0x0a, 0x27, 0x1a, 0xda, 0x7b, ++ 0x0a, 0xcb, 0xb4, 0xf6, 0x3b, 0xb1, 0xbd, 0xed, 0xfc, 0xed, 0x1b, 0x0a, ++ 0x27, 0x1b, 0xc7, 0x2f, 0x2c, 0xd7, 0xda, 0xef, 0x45, 0xf8, 0x9d, 0xe7, ++ 0x87, 0xdf, 0x73, 0xe5, 0x14, 0xe3, 0xf8, 0x57, 0x56, 0x62, 0xfb, 0x80, ++ 0x95, 0xd1, 0xab, 0x37, 0xc9, 0x86, 0x76, 0xcd, 0x0a, 0xbb, 0xd7, 0x27, ++ 0x31, 0x3b, 0x2a, 0x02, 0xef, 0xa5, 0xe4, 0x31, 0x1b, 0xa1, 0x9e, 0xa8, ++ 0xf1, 0x03, 0xe9, 0xf4, 0x81, 0xfd, 0xed, 0x6c, 0x49, 0x1a, 0xbf, 0x9a, ++ 0xe8, 0xf9, 0xa2, 0xe0, 0x0d, 0x80, 0xc3, 0x45, 0xa5, 0x45, 0xcf, 0x17, ++ 0x89, 0x13, 0x1d, 0x06, 0x7e, 0x4c, 0xf2, 0x25, 0x1b, 0xca, 0xb4, 0x27, ++ 0xcf, 0xb1, 0xef, 0xf0, 0x32, 0x0c, 0xe2, 0xb6, 0x21, 0x3c, 0xca, 0x10, ++ 0x05, 0xf5, 0xc5, 0xd4, 0x21, 0x36, 0x84, 0xf7, 0x9e, 0x7d, 0x76, 0x2c, ++ 0xdf, 0x33, 0x99, 0xc1, 0x7b, 0xcf, 0x10, 0x27, 0xca, 0x19, 0xae, 0x2d, ++ 0x94, 0x8e, 0xf7, 0x28, 0xfe, 0xcb, 0xf5, 0x76, 0x2b, 0xac, 0x4c, 0x10, ++ 0x4a, 0x7a, 0x53, 0xf4, 0x7f, 0x04, 0xf8, 0x8d, 0xbe, 0x57, 0x2d, 0xf0, ++ 0xde, 0x21, 0x92, 0x1a, 0xd4, 0xcf, 0x56, 0x82, 0xfa, 0xe8, 0x81, 0xcc, ++ 0xfc, 0xa7, 0x83, 0x3a, 0xfc, 0xac, 0x1c, 0x46, 0xe9, 0x4b, 0xcb, 0xa7, ++ 0xc1, 0xfe, 0x19, 0x18, 0xc5, 0xeb, 0x03, 0xc3, 0x4a, 0xd2, 0x8a, 0x75, ++ 0xe3, 0xd4, 0x0f, 0x53, 0x66, 0x6f, 0xcc, 0x66, 0xef, 0xe7, 0x3b, 0x61, ++ 0xbc, 0xa2, 0x1e, 0xc0, 0x43, 0x40, 0xe9, 0x1d, 0x03, 0x76, 0xa5, 0x79, ++ 0x1c, 0xeb, 0x88, 0x89, 0x86, 0x71, 0x6c, 0x19, 0x65, 0x38, 0xce, 0x9f, ++ 0x4d, 0xe3, 0x58, 0x33, 0xca, 0x4c, 0xe3, 0xd8, 0x66, 0x6f, 0xe4, 0xef, ++ 0xf9, 0x38, 0xdf, 0xc0, 0xbc, 0xe2, 0x8d, 0xf3, 0xc0, 0x88, 0xc9, 0xc6, ++ 0xf9, 0x64, 0x94, 0xe3, 0x38, 0x56, 0xd1, 0x34, 0x9f, 0x8c, 0x72, 0xd3, ++ 0x38, 0x0e, 0x36, 0x1f, 0xfa, 0x9e, 0x8f, 0x63, 0x17, 0xcf, 0x37, 0x9f, ++ 0x91, 0x53, 0x8c, 0xf3, 0x19, 0x5e, 0x89, 0xe3, 0xa4, 0x88, 0x8a, 0x21, ++ 0x6e, 0x65, 0x1d, 0x5e, 0x69, 0x1a, 0xc7, 0x89, 0xe3, 0xc0, 0x7b, 0x18, ++ 0x87, 0xa4, 0x33, 0xff, 0x46, 0xb1, 0xf6, 0x96, 0x20, 0xfd, 0x5f, 0xb6, ++ 0x13, 0xb0, 0xa7, 0x15, 0xab, 0xff, 0x59, 0xe8, 0x97, 0xfc, 0xc1, 0x4e, ++ 0x50, 0x9f, 0xa8, 0x74, 0xdc, 0x41, 0xa0, 0x57, 0x92, 0x71, 0xbf, 0xe0, ++ 0x3f, 0x2c, 0xc9, 0x38, 0x9f, 0x2f, 0x1d, 0x94, 0xfe, 0x4e, 0x3d, 0x9d, ++ 0x83, 0x9a, 0x5d, 0x80, 0xf6, 0xce, 0x42, 0x0e, 0x22, 0x09, 0xd5, 0xa3, ++ 0x7f, 0x5e, 0xcd, 0x79, 0x74, 0x41, 0xcb, 0xf5, 0x19, 0xcb, 0xe0, 0xd9, ++ 0x36, 0x2d, 0xad, 0x18, 0xfc, 0xec, 0xf5, 0x2e, 0x2f, 0xc4, 0x4f, 0xcf, ++ 0xb4, 0x4d, 0x53, 0xe6, 0xc7, 0xb0, 0x0b, 0x16, 0x36, 0xc8, 0xc7, 0xba, ++ 0x0c, 0xfc, 0xcb, 0xf5, 0x5e, 0x01, 0xc9, 0xaa, 0x01, 0x3f, 0x8b, 0xdb, ++ 0x01, 0x5a, 0xf9, 0x18, 0xd5, 0x5f, 0x84, 0xea, 0xad, 0x8f, 0xa8, 0xfe, ++ 0x82, 0xe7, 0x71, 0x99, 0xea, 0x69, 0xfa, 0xfe, 0x28, 0xd5, 0x6f, 0x44, ++ 0xd1, 0xc3, 0xbb, 0x0c, 0xdb, 0x1d, 0x93, 0x18, 0x1e, 0x8f, 0x35, 0xb1, ++ 0x75, 0xe4, 0xcb, 0x75, 0x87, 0x65, 0x8c, 0xf3, 0x05, 0xc9, 0x3b, 0x59, ++ 0x74, 0x1e, 0x37, 0xf3, 0x69, 0x2c, 0x6c, 0x48, 0x60, 0xbe, 0x02, 0x87, ++ 0x23, 0xc0, 0xe9, 0xd1, 0xbb, 0xdb, 0x1a, 0xda, 0x88, 0xf4, 0xf0, 0x0d, ++ 0x05, 0xbb, 0x87, 0x34, 0x0e, 0xa0, 0xb8, 0xe2, 0xf5, 0x46, 0x00, 0xbe, ++ 0xa8, 0xb8, 0x24, 0x63, 0x71, 0x28, 0xd8, 0x47, 0x3f, 0x5e, 0xb9, 0xfd, ++ 0x37, 0x50, 0xed, 0x5d, 0xa1, 0x78, 0xd8, 0x12, 0x3a, 0xdf, 0xd9, 0xad, ++ 0xeb, 0xe4, 0xa1, 0xb4, 0x7c, 0x46, 0xee, 0xba, 0xdd, 0xeb, 0xd4, 0xf5, ++ 0x33, 0x5b, 0xfe, 0x08, 0xe6, 0x6d, 0xa3, 0xff, 0x41, 0x3f, 0x73, 0xfc, ++ 0xb4, 0xac, 0x1b, 0xff, 0xd6, 0x32, 0x63, 0xf9, 0x36, 0x22, 0x45, 0xcb, ++ 0x94, 0x6e, 0x33, 0xc4, 0x11, 0x9c, 0x1e, 0x7c, 0x5c, 0x35, 0x24, 0x03, ++ 0xbd, 0x6e, 0x4e, 0x65, 0xf0, 0xdc, 0x06, 0xcf, 0xf1, 0xf0, 0xd9, 0x83, ++ 0xf4, 0xba, 0xdd, 0xc3, 0xda, 0x6a, 0xf0, 0x04, 0xee, 0x93, 0x49, 0x04, ++ 0xd7, 0xa3, 0xae, 0x81, 0xcc, 0xb8, 0x1d, 0x88, 0xf5, 0xfc, 0xda, 0xba, ++ 0x62, 0x82, 0xef, 0x76, 0xd9, 0xe6, 0x2b, 0xa2, 0xf4, 0xbc, 0xfd, 0x5e, ++ 0x11, 0xf1, 0x68, 0x86, 0xb7, 0x6b, 0x5f, 0x82, 0xcf, 0x42, 0xfd, 0xaa, ++ 0xae, 0xc6, 0xcf, 0x64, 0xf0, 0x2f, 0x2f, 0x04, 0xff, 0x1d, 0x4b, 0x8d, ++ 0xdf, 0x49, 0x90, 0x8d, 0xa7, 0xe1, 0x55, 0xe3, 0x83, 0x5b, 0x66, 0x4f, ++ 0x1d, 0x70, 0x54, 0x57, 0x6f, 0x8e, 0xff, 0xaa, 0x01, 0x47, 0x75, 0xfc, ++ 0x72, 0x6b, 0xd9, 0xf5, 0x86, 0xf2, 0x6d, 0x35, 0x73, 0x0c, 0xf5, 0xef, ++ 0x58, 0x5a, 0x6c, 0xf8, 0x5e, 0x1c, 0x5c, 0x64, 0xf8, 0x3e, 0x7f, 0xe5, ++ 0x62, 0x43, 0x79, 0x61, 0xc3, 0xbd, 0x86, 0xfa, 0xa5, 0x8d, 0xcb, 0x0c, ++ 0xdf, 0x17, 0x85, 0x56, 0x19, 0xbe, 0x57, 0x6c, 0x59, 0x67, 0x28, 0x57, ++ 0x85, 0x1f, 0x33, 0xd4, 0x0f, 0xb4, 0x35, 0x1b, 0xbe, 0x5b, 0xf6, 0x5d, ++ 0x7a, 0x1d, 0xc8, 0x63, 0xdd, 0xef, 0x44, 0x02, 0xf6, 0xd9, 0x17, 0xce, ++ 0x63, 0x0f, 0x81, 0x7d, 0xf5, 0x85, 0x53, 0x42, 0xbf, 0xaa, 0x1a, 0x78, ++ 0x8d, 0xca, 0xe1, 0x89, 0xda, 0x34, 0xe4, 0xef, 0x93, 0xb5, 0x2a, 0x3e, ++ 0xcf, 0xb4, 0xe5, 0xe2, 0xfe, 0x58, 0xc0, 0x41, 0xe5, 0x99, 0xae, 0xf5, ++ 0x1b, 0xea, 0x0e, 0x2d, 0x5b, 0x39, 0x05, 0xf4, 0x08, 0xad, 0x4f, 0x75, ++ 0xf8, 0x13, 0x75, 0x6f, 0x2d, 0x0b, 0x52, 0xdf, 0x7d, 0x23, 0x04, 0xa9, ++ 0x29, 0xdf, 0x8b, 0x8d, 0x0a, 0x89, 0x0c, 0x00, 0x3f, 0x26, 0xb9, 0x8f, ++ 0xaf, 0x7b, 0x45, 0xdd, 0xf7, 0xae, 0x0b, 0x7c, 0x6f, 0xa4, 0x0b, 0x56, ++ 0x6e, 0xff, 0xef, 0x62, 0x57, 0xec, 0xf7, 0x3d, 0x42, 0xef, 0x18, 0xb0, ++ 0xef, 0x82, 0x1f, 0x58, 0x71, 0xff, 0x26, 0x9e, 0xfd, 0x40, 0xff, 0x86, ++ 0x92, 0x18, 0xfe, 0x83, 0xf6, 0xec, 0x86, 0xf8, 0x86, 0x4e, 0xef, 0xbc, ++ 0x2c, 0x32, 0xbb, 0xfa, 0x72, 0xb1, 0xe0, 0x65, 0x91, 0x3e, 0x2b, 0x15, ++ 0x26, 0xef, 0x95, 0x3b, 0x06, 0x17, 0x40, 0xbc, 0xa0, 0x52, 0x89, 0x8c, ++ 0xa9, 0x89, 0x61, 0x67, 0xf7, 0x8d, 0x17, 0xa6, 0xc0, 0x0c, 0x82, 0x7e, ++ 0x98, 0xbc, 0x2c, 0x0a, 0x0d, 0x8d, 0xca, 0x2f, 0xd2, 0x6f, 0xa4, 0x41, ++ 0xee, 0xaf, 0xb1, 0xf8, 0xf7, 0x81, 0x7e, 0xee, 0xde, 0x2f, 0xb2, 0xfd, ++ 0x81, 0xc8, 0xc1, 0x0c, 0xd8, 0xa7, 0xb9, 0x5c, 0xf4, 0xbd, 0x0c, 0xef, ++ 0x49, 0xdb, 0x40, 0x5c, 0x1f, 0xdf, 0xad, 0xf5, 0x0d, 0x38, 0x3a, 0x8a, ++ 0x90, 0xf7, 0x6b, 0x67, 0xe2, 0xf3, 0xf7, 0xb5, 0x45, 0x03, 0x20, 0x7e, ++ 0xf4, 0xc7, 0xda, 0xd9, 0x58, 0xfe, 0xb0, 0xd6, 0x8f, 0xcf, 0xae, 0xda, ++ 0x32, 0x7c, 0x7e, 0x54, 0x5b, 0x83, 0xdf, 0x8f, 0xd6, 0x2e, 0xc5, 0xf2, ++ 0xb1, 0xda, 0x20, 0x3e, 0x4f, 0xd4, 0xae, 0xc4, 0xe7, 0xc9, 0xda, 0x06, ++ 0xfc, 0xde, 0x5d, 0xdb, 0x88, 0xe5, 0x33, 0xb5, 0x21, 0x7c, 0x6a, 0x72, ++ 0xa0, 0xd9, 0xa3, 0x24, 0x85, 0xdb, 0x7f, 0xdc, 0x5e, 0xa7, 0x2b, 0x07, ++ 0x96, 0xcf, 0xf2, 0x39, 0x88, 0xf4, 0xdf, 0x9d, 0x28, 0xd7, 0xde, 0x34, ++ 0x90, 0xeb, 0xb3, 0xce, 0x2f, 0xc7, 0x80, 0x9d, 0x7b, 0xf6, 0x7d, 0x2b, ++ 0x06, 0xd1, 0xe3, 0xe1, 0xc9, 0xcc, 0x6f, 0xf1, 0xe9, 0xe7, 0xc3, 0xf5, ++ 0xbe, 0x24, 0x44, 0xe9, 0x9f, 0xdb, 0xff, 0xbb, 0xdd, 0xc1, 0xe8, 0x63, ++ 0xb7, 0x90, 0x99, 0xe0, 0x9f, 0xad, 0x1a, 0xad, 0x10, 0x88, 0xab, 0x3b, ++ 0x5e, 0xfe, 0x0e, 0xda, 0xcb, 0xf4, 0xbd, 0x44, 0x50, 0x5f, 0x86, 0xbc, ++ 0xfa, 0x7d, 0xc4, 0xbe, 0xfe, 0x61, 0xce, 0x83, 0x2e, 0x4c, 0x27, 0xad, ++ 0xfe, 0xb1, 0xc7, 0xff, 0x2b, 0x7f, 0x5e, 0x36, 0xd0, 0x87, 0xd1, 0xd7, ++ 0x71, 0x50, 0xac, 0x61, 0x74, 0x7b, 0xda, 0x0b, 0x74, 0xd3, 0xe1, 0x8f, ++ 0xd9, 0x65, 0x3b, 0xb9, 0x3e, 0x37, 0xe1, 0x51, 0xe2, 0x72, 0x67, 0xc6, ++ 0xe7, 0xe9, 0x81, 0x1a, 0x3e, 0x3b, 0x33, 0x20, 0xde, 0x52, 0x25, 0x16, ++ 0x59, 0x24, 0xfa, 0xee, 0x6c, 0xab, 0x15, 0xe7, 0x75, 0xb6, 0x3d, 0x81, ++ 0xed, 0x63, 0x7b, 0x52, 0x2e, 0x2a, 0x9e, 0x57, 0xb1, 0xc5, 0xee, 0xd1, ++ 0xeb, 0x87, 0xaa, 0x70, 0x92, 0xc7, 0xa8, 0x2f, 0x06, 0x7b, 0xf4, 0xfa, ++ 0xe2, 0x6c, 0xc7, 0xd3, 0x6e, 0x90, 0xfb, 0x25, 0x69, 0x16, 0xcf, 0xd1, ++ 0x5c, 0xe0, 0x0f, 0x1f, 0xe7, 0x0f, 0xc6, 0x77, 0x5a, 0xff, 0x55, 0xe1, ++ 0x4c, 0x8f, 0xd3, 0xd0, 0x8f, 0xb1, 0x7c, 0xb6, 0x41, 0x98, 0xc9, 0xf6, ++ 0x15, 0xd5, 0xc4, 0x9b, 0x62, 0xf8, 0x07, 0xda, 0x73, 0x49, 0x9a, 0xe2, ++ 0x39, 0x4a, 0xf5, 0xc2, 0xc9, 0x2d, 0x23, 0x13, 0x61, 0x5c, 0xea, 0xc7, ++ 0x79, 0x60, 0x9c, 0xee, 0x5a, 0x8f, 0x87, 0x8d, 0x9b, 0xe6, 0xd1, 0xf3, ++ 0x65, 0xe5, 0x52, 0x07, 0xd6, 0xd7, 0xe0, 0x8b, 0xd7, 0xef, 0x3f, 0x1a, ++ 0x3e, 0xd8, 0xf1, 0xfb, 0xd8, 0xc6, 0x62, 0x4d, 0x10, 0xa7, 0x89, 0x57, ++ 0x3f, 0x2e, 0x3d, 0xa4, 0xcf, 0x15, 0xf0, 0x0f, 0x48, 0xbb, 0xfc, 0x25, ++ 0xac, 0x3b, 0x8e, 0x2c, 0x6d, 0xdd, 0x91, 0xb0, 0xac, 0xf5, 0x1b, 0x08, ++ 0x8b, 0x41, 0xeb, 0xe5, 0xf0, 0xbe, 0xc5, 0x30, 0x1e, 0x6d, 0xa7, 0x6a, ++ 0x3e, 0x34, 0xb4, 0x8b, 0x4f, 0x77, 0x89, 0x1c, 0xd3, 0xe8, 0x49, 0xf5, ++ 0xe4, 0x95, 0x3c, 0x3f, 0x84, 0x32, 0x33, 0xd2, 0xd9, 0x4f, 0x7b, 0x4c, ++ 0xa4, 0xfd, 0xf5, 0x48, 0xce, 0x95, 0x10, 0xe7, 0xcd, 0x94, 0x54, 0xd4, ++ 0x77, 0x01, 0x18, 0x88, 0xf2, 0x53, 0x95, 0xad, 0x4b, 0xf1, 0xab, 0x88, ++ 0xee, 0x4e, 0x8c, 0x7b, 0x4e, 0xd4, 0xe4, 0x5e, 0xbd, 0xe5, 0x0f, 0x94, ++ 0xe5, 0x3e, 0xf9, 0x37, 0x19, 0xe3, 0x19, 0xe4, 0x1b, 0xda, 0x3b, 0xfd, ++ 0x2e, 0xf3, 0xaf, 0x0b, 0x48, 0x91, 0x1b, 0x9c, 0x8c, 0x79, 0xad, 0x15, ++ 0xb3, 0x40, 0x4f, 0x7e, 0x62, 0xd1, 0xec, 0x81, 0x86, 0x7c, 0x98, 0xf7, ++ 0x69, 0x62, 0xc1, 0xfd, 0xfc, 0xd3, 0xe4, 0x6d, 0x77, 0xae, 0xce, 0x2e, ++ 0x2b, 0x93, 0x78, 0x7c, 0x72, 0x25, 0x5b, 0x9f, 0x83, 0xf4, 0x3f, 0x98, ++ 0x1f, 0xb5, 0xd3, 0x0c, 0xeb, 0x75, 0x69, 0xa3, 0xb1, 0x5c, 0x42, 0x6e, ++ 0x48, 0x05, 0x79, 0x28, 0x59, 0x2f, 0xc3, 0x8e, 0x2d, 0x59, 0x04, 0xeb, ++ 0xbd, 0x6e, 0xdf, 0x64, 0xb6, 0xe4, 0xc1, 0x79, 0x97, 0x92, 0x9a, 0x7a, ++ 0xb0, 0x53, 0x56, 0xcb, 0x6c, 0x1f, 0x75, 0x9e, 0x87, 0x48, 0x43, 0x29, ++ 0x5c, 0x55, 0xbb, 0x9e, 0xcc, 0x07, 0x7b, 0x36, 0x20, 0x31, 0x7d, 0xaf, ++ 0xf9, 0xcf, 0x8b, 0x92, 0x19, 0xdc, 0xe5, 0x29, 0x21, 0xc5, 0x47, 0xbf, ++ 0x7f, 0xdc, 0x9a, 0x7b, 0xf3, 0xf7, 0x08, 0xb4, 0x0f, 0xd5, 0x83, 0x5e, ++ 0x0b, 0xba, 0x88, 0x37, 0x56, 0x3c, 0x66, 0xfe, 0x4a, 0x23, 0x7c, 0x17, ++ 0x82, 0xdf, 0x0c, 0x2f, 0x21, 0xcb, 0x0d, 0x70, 0x68, 0xfd, 0x6a, 0x70, ++ 0x88, 0x5b, 0x84, 0x98, 0x79, 0x1a, 0x3f, 0x93, 0x04, 0x1e, 0xd7, 0x61, ++ 0xf2, 0xb1, 0x56, 0x32, 0xda, 0xaf, 0x8f, 0x70, 0x3c, 0x68, 0xe5, 0x0d, ++ 0xa6, 0x72, 0x93, 0xa9, 0xbe, 0xc6, 0x27, 0x32, 0xe7, 0x93, 0x4c, 0xc9, ++ 0xff, 0x08, 0xe8, 0x9f, 0x2a, 0x5b, 0x6f, 0x21, 0xda, 0x69, 0x84, 0xf2, ++ 0x47, 0x76, 0xb4, 0x9e, 0x12, 0xad, 0xb7, 0xe1, 0x7c, 0xf5, 0xac, 0x50, ++ 0x4f, 0xc4, 0x7a, 0x4d, 0xd2, 0x84, 0xf8, 0xf5, 0xec, 0xd1, 0xfe, 0x9a, ++ 0x63, 0xf5, 0x57, 0xb5, 0x6b, 0xdb, 0x8b, 0x41, 0xca, 0x4f, 0xe5, 0x2f, ++ 0x3c, 0xea, 0x86, 0xa0, 0xef, 0x27, 0x52, 0x43, 0x2a, 0xc4, 0xbf, 0x2a, ++ 0x37, 0xdf, 0xef, 0x06, 0x3c, 0x9d, 0x90, 0x82, 0x6e, 0xa0, 0xf7, 0x27, ++ 0x21, 0x31, 0x66, 0x5c, 0xf0, 0xbd, 0x3e, 0x7c, 0xf9, 0x9c, 0x02, 0xf8, ++ 0x11, 0xc8, 0xda, 0x14, 0xef, 0xcf, 0x3d, 0x78, 0x2d, 0xe8, 0xeb, 0x2f, ++ 0x37, 0xcb, 0x98, 0x17, 0x13, 0xd8, 0x62, 0x8d, 0x58, 0x29, 0x1f, 0x57, ++ 0xb7, 0x2e, 0x9a, 0x05, 0xf1, 0x7b, 0x5a, 0x3e, 0xc2, 0xca, 0x0f, 0x7c, ++ 0x0a, 0xfb, 0x86, 0x81, 0x36, 0x23, 0x3d, 0xcb, 0x9f, 0x7d, 0x34, 0x15, ++ 0xe2, 0x44, 0x14, 0x93, 0xcc, 0xde, 0x26, 0x11, 0xb4, 0x3b, 0xaa, 0x37, ++ 0xfd, 0xa9, 0x10, 0xf4, 0x78, 0x80, 0xf4, 0x22, 0x1f, 0x9a, 0xdb, 0xc1, ++ 0xf8, 0xe7, 0x92, 0x51, 0xee, 0x8b, 0x95, 0xc4, 0xfe, 0xdf, 0xb5, 0x7c, ++ 0x85, 0x00, 0x97, 0xb3, 0x40, 0xeb, 0x83, 0x9f, 0x42, 0x5e, 0x42, 0xc0, ++ 0xc4, 0x3f, 0x65, 0x7d, 0xeb, 0x49, 0x97, 0x02, 0x71, 0x84, 0x0e, 0xc9, ++ 0x95, 0x82, 0x7e, 0xf9, 0x77, 0xc9, 0x77, 0x41, 0x0f, 0x68, 0xf8, 0x20, ++ 0x21, 0x66, 0x4f, 0xd4, 0x6d, 0xdd, 0x30, 0xee, 0x08, 0x85, 0xa7, 0x7b, ++ 0xd3, 0xbf, 0xb9, 0x05, 0x83, 0xdf, 0xcd, 0xf8, 0xf0, 0x6c, 0x78, 0xfe, ++ 0xaf, 0x5e, 0x52, 0xe3, 0xeb, 0x99, 0x33, 0xdc, 0x1f, 0x8a, 0xb6, 0x0b, ++ 0x61, 0x3b, 0xb5, 0x8d, 0xd9, 0x3f, 0xa4, 0x9d, 0x3d, 0x2b, 0xe5, 0x88, ++ 0x1b, 0xec, 0xcd, 0xca, 0x66, 0xd9, 0x4b, 0x39, 0x94, 0x54, 0x6e, 0x7b, ++ 0xfa, 0x99, 0xc7, 0xc1, 0x4f, 0xfb, 0xc0, 0x8a, 0x7e, 0x5a, 0xc5, 0xb6, ++ 0xdf, 0xbc, 0x3b, 0x99, 0x96, 0x2b, 0xb6, 0xcb, 0x29, 0xb3, 0xd8, 0x74, ++ 0x9c, 0x42, 0x6a, 0x94, 0x2e, 0x01, 0xfa, 0xbf, 0xa5, 0xe3, 0xa3, 0x74, ++ 0x28, 0xff, 0xf5, 0x6f, 0x14, 0x75, 0x2c, 0x7b, 0xff, 0xd3, 0xe4, 0x28, ++ 0x3d, 0x2a, 0xb6, 0xef, 0x57, 0xc8, 0xd8, 0xfe, 0xf8, 0x9b, 0x16, 0xde, ++ 0xaf, 0x74, 0x39, 0x63, 0xd0, 0x25, 0x7c, 0xa4, 0x10, 0xec, 0x95, 0xba, ++ 0xad, 0x5f, 0x29, 0xe0, 0x77, 0x7d, 0xb2, 0x4f, 0x20, 0x83, 0x32, 0xfb, ++ 0xb7, 0x2f, 0x6b, 0xfe, 0x0d, 0xae, 0x87, 0x80, 0x27, 0xa4, 0x23, 0xa7, ++ 0x53, 0x1f, 0xdd, 0xfa, 0xd1, 0x2b, 0x72, 0xed, 0x4b, 0x79, 0x58, 0xcf, ++ 0x03, 0x7a, 0x32, 0x1e, 0xbd, 0x9e, 0xe3, 0x7a, 0xb9, 0x6a, 0x97, 0x8b, ++ 0x24, 0x41, 0xfc, 0xf3, 0xf7, 0xd6, 0xd0, 0x2c, 0xa0, 0xe3, 0xf3, 0x77, ++ 0xba, 0x61, 0x1e, 0xc7, 0xa5, 0x1a, 0xc6, 0xd7, 0x4f, 0xde, 0x9f, 0x0a, ++ 0xfb, 0x7f, 0x65, 0x72, 0x30, 0xd5, 0x83, 0x4f, 0xf6, 0xbe, 0xec, 0xa9, ++ 0xbb, 0x91, 0xdf, 0x4a, 0x85, 0x9a, 0x54, 0xb6, 0x8f, 0xe9, 0x1b, 0xcc, ++ 0xe3, 0xe5, 0x83, 0x61, 0x7e, 0x0b, 0x9b, 0x7e, 0x84, 0xf3, 0x2b, 0x21, ++ 0x7e, 0xe4, 0xbb, 0xb2, 0x27, 0xc5, 0x22, 0x88, 0x0f, 0x7f, 0x21, 0x91, ++ 0x99, 0xdb, 0x63, 0xc8, 0xc5, 0x35, 0x32, 0xdb, 0x7f, 0x3a, 0xbe, 0xd1, ++ 0x0a, 0x49, 0x7e, 0xe4, 0x38, 0xd8, 0xf9, 0x60, 0x5f, 0xbf, 0x2d, 0x62, ++ 0x9c, 0x95, 0x90, 0xc5, 0xb8, 0x0f, 0x76, 0xb7, 0x16, 0xc7, 0x25, 0x4b, ++ 0xb0, 0xfc, 0x05, 0xdf, 0x97, 0x1a, 0x25, 0x5b, 0x34, 0xff, 0xd0, 0x66, ++ 0xe0, 0xd7, 0x4d, 0x0f, 0x74, 0x02, 0x7d, 0x4e, 0x0e, 0xf3, 0x0d, 0x02, ++ 0x38, 0x29, 0x1e, 0x82, 0x1c, 0x5f, 0x02, 0xec, 0xf7, 0x8b, 0x87, 0x67, ++ 0x0c, 0x62, 0xf4, 0x61, 0xf9, 0x06, 0xd8, 0x8e, 0xea, 0xff, 0x69, 0xf0, ++ 0x1e, 0xea, 0x77, 0xca, 0xb8, 0x4f, 0xa8, 0x6b, 0xc7, 0xf5, 0x25, 0x1b, ++ 0xff, 0x2e, 0x3e, 0x3e, 0x85, 0xdb, 0x01, 0xeb, 0xd9, 0xf1, 0x54, 0xb6, ++ 0x5f, 0x69, 0x9e, 0xdf, 0x52, 0x3e, 0x3f, 0xfa, 0xd7, 0x49, 0x74, 0xfc, ++ 0xa5, 0x93, 0x6f, 0x26, 0xef, 0x9b, 0x56, 0x31, 0xf9, 0xd6, 0xe4, 0x3d, ++ 0x74, 0xfd, 0x4c, 0xf8, 0xfe, 0xf9, 0x3b, 0x4c, 0x7e, 0xa0, 0x1d, 0xac, ++ 0x1f, 0x14, 0xae, 0xc8, 0x20, 0xfc, 0xbe, 0xff, 0x26, 0x01, 0xf5, 0x81, ++ 0x95, 0x44, 0x62, 0xc9, 0xf5, 0x26, 0x99, 0xcb, 0xb5, 0xf1, 0x7b, 0x80, ++ 0xca, 0x29, 0xc4, 0x05, 0x28, 0xdc, 0x12, 0xe4, 0x33, 0x44, 0xf9, 0x84, ++ 0xf6, 0x9f, 0x8c, 0xf8, 0x47, 0xbf, 0xa4, 0x64, 0x3d, 0x6d, 0xa7, 0xb3, ++ 0xcf, 0x02, 0x30, 0x1e, 0xd6, 0x53, 0xa2, 0xef, 0x75, 0xeb, 0x47, 0x29, ++ 0xd7, 0x03, 0x33, 0x65, 0xa3, 0xfc, 0x93, 0xa6, 0x81, 0x17, 0x65, 0x2f, ++ 0x56, 0xca, 0x24, 0x08, 0xa6, 0x65, 0xe5, 0x07, 0x56, 0xf4, 0xbb, 0x2b, ++ 0xb7, 0xc9, 0x45, 0x30, 0xef, 0x53, 0x2d, 0x07, 0xdf, 0xfd, 0x31, 0xe5, ++ 0xeb, 0x53, 0x61, 0x4d, 0x4e, 0x8d, 0xfa, 0xd3, 0x2c, 0xa7, 0x65, 0x3b, ++ 0x36, 0x0b, 0xc0, 0x9f, 0x66, 0x39, 0x3d, 0x55, 0x46, 0x57, 0xeb, 0x58, ++ 0x72, 0x4a, 0xdf, 0xc7, 0x94, 0xd3, 0xb2, 0xae, 0xff, 0x2b, 0xfa, 0x53, ++ 0xc3, 0x5b, 0xc0, 0x84, 0x37, 0xaa, 0x07, 0x87, 0x27, 0x59, 0xe2, 0xe3, ++ 0xcf, 0xac, 0x07, 0x5d, 0xb2, 0x1a, 0x53, 0x0f, 0xd2, 0xbf, 0x77, 0x48, ++ 0x7e, 0x7f, 0xbe, 0xd3, 0xf8, 0x4d, 0xe3, 0x33, 0x6a, 0xa1, 0x0d, 0x07, ++ 0xfd, 0xdd, 0xc7, 0x8f, 0x1a, 0xbf, 0xf5, 0xf1, 0xa3, 0xc6, 0x6f, 0xe6, ++ 0x79, 0x1a, 0xf1, 0x66, 0xfe, 0x3e, 0x19, 0x0c, 0x35, 0x0a, 0x57, 0xd1, ++ 0x6e, 0x19, 0xfd, 0x92, 0xca, 0x76, 0xb6, 0x7f, 0x43, 0xdb, 0xbd, 0x3a, ++ 0x34, 0x0f, 0xf1, 0xe3, 0xc3, 0xe5, 0x8b, 0x34, 0xbc, 0x3a, 0x34, 0x45, ++ 0x5f, 0x0e, 0x99, 0xca, 0x61, 0x53, 0x7d, 0x9f, 0xa9, 0x5c, 0x64, 0xaa, ++ 0xef, 0x37, 0x95, 0x6b, 0x0c, 0xf5, 0x2b, 0xdb, 0x0e, 0x2a, 0x2c, 0xc9, ++ 0x28, 0x62, 0xa8, 0x67, 0x5d, 0xfa, 0x38, 0xf9, 0x38, 0x86, 0x7d, 0xaf, ++ 0xad, 0x33, 0x81, 0xd6, 0x4f, 0x95, 0x20, 0xf0, 0x43, 0x7a, 0xaf, 0x02, ++ 0x7a, 0x4e, 0x5e, 0x4e, 0x4d, 0x33, 0x88, 0x9f, 0xed, 0x15, 0xd1, 0xdf, ++ 0xea, 0x51, 0x7b, 0xdd, 0xc9, 0xf4, 0xfd, 0xfd, 0x76, 0xe6, 0xc7, 0xf6, ++ 0x78, 0x78, 0x39, 0x89, 0x95, 0x7b, 0x07, 0x2a, 0xf5, 0xa0, 0xe7, 0xb4, ++ 0xf7, 0xbd, 0x76, 0x16, 0xe7, 0xec, 0x29, 0xea, 0x75, 0x27, 0xe9, 0xfc, ++ 0xfb, 0x23, 0xed, 0xa2, 0x1b, 0xf6, 0x83, 0xbb, 0x42, 0x2c, 0x1f, 0xb5, ++ 0x3f, 0x3c, 0x75, 0x28, 0x37, 0x5d, 0x24, 0xde, 0x77, 0x16, 0x17, 0x9c, ++ 0x21, 0x3a, 0x33, 0x96, 0x82, 0xff, 0xd6, 0x20, 0x7a, 0xc1, 0x35, 0x5c, ++ 0xb0, 0xec, 0x16, 0x37, 0xec, 0xbb, 0xf5, 0xb4, 0x8f, 0xbc, 0x6e, 0x36, ++ 0x7d, 0xbf, 0xf0, 0x90, 0x08, 0xe6, 0x33, 0xe9, 0x71, 0xb8, 0xc7, 0x01, ++ 0x5c, 0x24, 0xe8, 0x93, 0x06, 0xe7, 0xf3, 0xfc, 0x09, 0xfa, 0x77, 0x82, ++ 0x04, 0x7f, 0x39, 0x05, 0xf2, 0x26, 0xda, 0x99, 0x7d, 0xbd, 0x60, 0x8d, ++ 0xc9, 0x1e, 0x76, 0xde, 0xa5, 0x60, 0x7e, 0xd9, 0x7a, 0x5d, 0x5c, 0x4b, ++ 0xc7, 0xff, 0xe5, 0xbc, 0x9f, 0xb2, 0x26, 0xe3, 0xf7, 0x72, 0xb2, 0x06, ++ 0xf9, 0xaf, 0xdc, 0x24, 0x0f, 0x7e, 0xee, 0x0f, 0x1c, 0xd6, 0xe4, 0x21, ++ 0x87, 0xe4, 0xb0, 0xfd, 0x6d, 0xc2, 0xfc, 0x58, 0xae, 0x77, 0x67, 0x88, ++ 0xd9, 0xd7, 0xcd, 0xa6, 0x78, 0xef, 0xe9, 0x10, 0x31, 0x6f, 0xf6, 0x6c, ++ 0xbb, 0x48, 0xea, 0x61, 0x9e, 0x2d, 0x02, 0xee, 0x73, 0x92, 0xe0, 0x40, ++ 0x94, 0xab, 0x6a, 0xd2, 0x8b, 0xfa, 0x4e, 0xc3, 0x4b, 0x37, 0xc8, 0x8d, ++ 0x12, 0x5f, 0x1f, 0x75, 0xef, 0xfc, 0x8f, 0xfc, 0xfb, 0x80, 0x3f, 0x5e, ++ 0xfc, 0xc3, 0xb8, 0x27, 0xe8, 0xb3, 0xfb, 0xc5, 0x0f, 0xc6, 0xec, 0x81, ++ 0xf2, 0xae, 0xf7, 0x32, 0xfe, 0x40, 0xfa, 0xd7, 0x9f, 0xb6, 0xef, 0x6b, ++ 0xdc, 0x47, 0xec, 0xd9, 0x67, 0xc5, 0x38, 0x57, 0xcf, 0xbe, 0xd7, 0x32, ++ 0xee, 0x83, 0xf2, 0x4b, 0x56, 0x8c, 0x73, 0xf5, 0x2c, 0xb7, 0xe2, 0x3e, ++ 0x4a, 0x70, 0x9f, 0x2b, 0x34, 0x1a, 0xbe, 0x0f, 0x63, 0xfe, 0x40, 0xdd, ++ 0xde, 0xaf, 0xc6, 0xb1, 0x3c, 0xc9, 0x15, 0x48, 0xa7, 0x6f, 0x64, 0xe6, ++ 0x8f, 0x9c, 0x6d, 0xff, 0xaf, 0x0f, 0x21, 0x7f, 0xe4, 0x6c, 0x3b, 0x9d, ++ 0x15, 0xd8, 0x05, 0xfb, 0x12, 0x50, 0x6e, 0x02, 0x2f, 0xd9, 0xd1, 0xff, ++ 0xee, 0xd9, 0xfb, 0x55, 0xbe, 0xdf, 0xf9, 0x8f, 0x9b, 0x4f, 0xb5, 0x42, ++ 0xfc, 0xc8, 0x7f, 0x2e, 0x32, 0x7b, 0x07, 0xf0, 0x6b, 0x12, 0x8b, 0x07, ++ 0x07, 0xf6, 0x4c, 0x7a, 0x1a, 0xf2, 0x9b, 0xab, 0x5a, 0xf7, 0x2b, 0x10, ++ 0x67, 0x9f, 0xf6, 0xf2, 0x5f, 0xc6, 0x81, 0x9e, 0xec, 0xd9, 0xc1, 0xec, ++ 0x9d, 0x33, 0x72, 0xd7, 0x53, 0xb0, 0x1f, 0x66, 0x55, 0x3e, 0x5d, 0x2e, ++ 0x53, 0x3c, 0x9f, 0x01, 0xe1, 0x19, 0x42, 0xc8, 0xd3, 0xca, 0xf8, 0x69, ++ 0xc1, 0xec, 0x58, 0x78, 0x61, 0x78, 0xe8, 0xa1, 0x78, 0x80, 0x79, 0x51, ++ 0xbc, 0x94, 0x81, 0x7e, 0x8f, 0x87, 0x8f, 0x0c, 0xe5, 0x9f, 0x15, 0x1f, ++ 0x9f, 0xde, 0xce, 0xf4, 0xd8, 0x77, 0x31, 0xcf, 0x3e, 0x8a, 0x17, 0xc1, ++ 0xc7, 0xde, 0xbb, 0x42, 0x36, 0x01, 0xe7, 0xcf, 0xde, 0xef, 0xfb, 0x6a, ++ 0x1c, 0xe8, 0x99, 0x53, 0xe1, 0x65, 0x68, 0x8f, 0x5c, 0x68, 0xde, 0x57, ++ 0x28, 0x6c, 0x9f, 0xe5, 0x7f, 0xce, 0xbc, 0x85, 0xc8, 0xc5, 0xcc, 0x7b, ++ 0xee, 0x3f, 0x2d, 0xbd, 0x19, 0xff, 0x7f, 0x04, 0xeb, 0xeb, 0xc0, 0xfe, ++ 0x72, 0xd0, 0x9f, 0xcf, 0x77, 0xdd, 0x83, 0xe5, 0xe7, 0x5d, 0x5e, 0x84, ++ 0xf7, 0x22, 0xe5, 0xff, 0xa7, 0xff, 0xd3, 0xe8, 0xbe, 0x83, 0xd2, 0xdd, ++ 0x7d, 0x61, 0xba, 0x3f, 0xf1, 0x4f, 0x3b, 0xef, 0x0b, 0xd1, 0xfd, 0x10, ++ 0xa7, 0xbb, 0xcb, 0x03, 0xfb, 0xcb, 0x3d, 0x7b, 0xff, 0x82, 0x71, 0x53, ++ 0x6d, 0xfe, 0x17, 0x9a, 0xf7, 0x4b, 0xff, 0x8f, 0xce, 0x5b, 0xb3, 0xd7, ++ 0x5f, 0xb3, 0xa8, 0xef, 0xe4, 0xd0, 0xfa, 0x87, 0x48, 0xc3, 0x3b, 0x63, ++ 0x04, 0xc8, 0x5f, 0x3c, 0x78, 0x18, 0x8e, 0x80, 0x15, 0x08, 0xa4, 0x28, ++ 0x96, 0x3d, 0x72, 0x52, 0x61, 0xf1, 0x8f, 0x02, 0x81, 0xe5, 0x09, 0x92, ++ 0x24, 0x81, 0xfb, 0x77, 0xcc, 0x2f, 0x1a, 0xca, 0xed, 0x84, 0xa1, 0x77, ++ 0x95, 0xa0, 0x9d, 0x31, 0x34, 0x7d, 0x2d, 0xda, 0x07, 0x44, 0x52, 0xd7, ++ 0xc3, 0x7e, 0xdc, 0x6b, 0x19, 0xf3, 0xbd, 0x2c, 0x1f, 0x6c, 0x3c, 0x9e, ++ 0x43, 0x79, 0xcd, 0x73, 0x05, 0x2f, 0x1b, 0xfd, 0xc3, 0x27, 0x04, 0xe2, ++ 0x83, 0xbc, 0xe1, 0xa1, 0x19, 0x3f, 0xec, 0x00, 0x7b, 0x35, 0x3d, 0x5d, ++ 0x44, 0x7b, 0x96, 0x3e, 0xd1, 0x8e, 0x7d, 0xc5, 0x3d, 0x93, 0xbd, 0xaf, ++ 0x54, 0x0c, 0x7e, 0xd1, 0x55, 0x44, 0x57, 0xa6, 0xf3, 0x2a, 0x4c, 0x31, ++ 0xfa, 0x3f, 0xd3, 0x79, 0x7f, 0x33, 0xc8, 0x88, 0x77, 0x72, 0x28, 0xfc, ++ 0x33, 0x6c, 0xb2, 0x27, 0x44, 0x51, 0x74, 0xd5, 0x54, 0xbf, 0x04, 0xf3, ++ 0xb9, 0x6a, 0xb0, 0x40, 0x1a, 0x74, 0xfb, 0x41, 0xd3, 0x4d, 0x7e, 0xd2, ++ 0xab, 0xe0, 0xd7, 0xea, 0xe2, 0x65, 0x7f, 0x2b, 0xfe, 0xd2, 0xad, 0xcc, ++ 0x8f, 0x2c, 0x10, 0x46, 0xac, 0x2f, 0x02, 0xfc, 0x0d, 0x13, 0x31, 0x1e, ++ 0x78, 0x41, 0xfc, 0x11, 0x96, 0xff, 0xf5, 0x9a, 0x27, 0x87, 0xe5, 0xb5, ++ 0x4a, 0x5e, 0x86, 0xbf, 0xe4, 0x2a, 0x2f, 0xc6, 0x53, 0xb9, 0xdf, 0x0c, ++ 0x61, 0x01, 0xb0, 0x57, 0x24, 0x67, 0x7d, 0x27, 0xc8, 0xad, 0x44, 0xa8, ++ 0xdf, 0xcb, 0xe0, 0x47, 0x7f, 0x59, 0xf3, 0x7b, 0xe3, 0xe1, 0x99, 0x70, ++ 0x3f, 0x5a, 0xe2, 0x43, 0x6a, 0x78, 0x97, 0xd2, 0x45, 0xcc, 0x57, 0xd5, ++ 0xf5, 0x87, 0xf8, 0xd0, 0xe8, 0xf1, 0xb7, 0xd2, 0x41, 0xa3, 0xdf, 0xdf, ++ 0x4b, 0x8f, 0x33, 0x26, 0x7a, 0xa4, 0x7f, 0xee, 0x91, 0x40, 0x3e, 0xa7, ++ 0x71, 0xfb, 0x7f, 0xfa, 0xe7, 0x9d, 0x22, 0x96, 0xd3, 0xbd, 0x12, 0xee, ++ 0x47, 0x71, 0xfb, 0x7f, 0xaa, 0x33, 0x49, 0x02, 0xfb, 0xff, 0x0a, 0xe9, ++ 0xb0, 0x08, 0x72, 0x59, 0x6a, 0x6b, 0xbb, 0x1a, 0xe2, 0xf4, 0x36, 0xaf, ++ 0x80, 0x7c, 0x7d, 0x49, 0xb7, 0x05, 0xfd, 0x1b, 0x5b, 0x9e, 0x80, 0x78, ++ 0xcf, 0x6a, 0x94, 0xb0, 0x7c, 0xd8, 0xe2, 0x99, 0x00, 0x86, 0xf6, 0xb5, ++ 0xdf, 0xdb, 0x75, 0xea, 0x5e, 0x02, 0xf1, 0x61, 0x9f, 0x82, 0x86, 0x37, ++ 0x29, 0x62, 0xf1, 0xf9, 0x6f, 0xbe, 0xfd, 0x76, 0x8a, 0x76, 0x5e, 0x03, ++ 0xbf, 0x13, 0x72, 0x0d, 0xf5, 0xbf, 0x16, 0x34, 0x91, 0x88, 0x83, 0xe2, ++ 0x69, 0xa1, 0x44, 0x82, 0x89, 0xc9, 0x10, 0xdf, 0x15, 0xc8, 0x47, 0x86, ++ 0xf8, 0xae, 0xb1, 0x0c, 0x7f, 0xdf, 0x4f, 0x8d, 0xf6, 0x73, 0xa1, 0xfa, ++ 0xf1, 0xf4, 0xc8, 0x3f, 0xfa, 0xb9, 0x8b, 0xea, 0xad, 0x8f, 0x28, 0x73, ++ 0xec, 0x86, 0x27, 0xee, 0xab, 0x50, 0x96, 0xd0, 0xf9, 0xc7, 0xdf, 0x6d, ++ 0x67, 0xf8, 0x0a, 0xbc, 0x4e, 0x42, 0x23, 0x30, 0xae, 0xe0, 0x13, 0x8b, ++ 0x74, 0xfb, 0x66, 0x0f, 0x5a, 0x99, 0xfe, 0xd8, 0xf5, 0xc7, 0x1d, 0xb9, ++ 0x10, 0x17, 0x9b, 0xda, 0x93, 0x9d, 0xc8, 0xf4, 0xe9, 0x28, 0xf4, 0x0b, ++ 0x02, 0xdc, 0x2f, 0x38, 0x4b, 0xd4, 0x44, 0xc8, 0x3f, 0x38, 0xdb, 0x3e, ++ 0x32, 0x11, 0xf7, 0x05, 0x3b, 0x44, 0x97, 0x3f, 0x46, 0x5c, 0x66, 0x2b, ++ 0xf7, 0x9f, 0xff, 0x15, 0xf2, 0x29, 0xe8, 0xb3, 0x67, 0x13, 0x69, 0x80, ++ 0x73, 0x18, 0x3d, 0xa4, 0x17, 0xe3, 0xb1, 0xc1, 0x4d, 0xb6, 0x98, 0xfb, ++ 0xbb, 0xf7, 0x58, 0xb5, 0x78, 0x13, 0xa7, 0x1b, 0xfd, 0x13, 0xb5, 0xf3, ++ 0x46, 0x2a, 0xe6, 0x8b, 0x04, 0x13, 0xf5, 0x74, 0xeb, 0x9e, 0xf5, 0x89, ++ 0x34, 0xae, 0x3f, 0x1d, 0xe0, 0xef, 0x23, 0xdd, 0x7e, 0xc9, 0xdf, 0x8b, ++ 0x5f, 0xf0, 0xd7, 0x01, 0xbf, 0x5b, 0xed, 0x5d, 0x85, 0xb1, 0xce, 0x83, ++ 0xad, 0xe4, 0xf8, 0xbb, 0xf6, 0xc0, 0xd7, 0x18, 0xc7, 0xbc, 0xac, 0xbd, ++ 0xd9, 0x02, 0xfc, 0x7b, 0xd9, 0x26, 0x8b, 0x61, 0xbf, 0x31, 0x68, 0xe5, ++ 0x7e, 0xd7, 0x78, 0x32, 0x1e, 0xe0, 0xba, 0xf6, 0x80, 0xdd, 0x95, 0x07, ++ 0x74, 0xe9, 0x10, 0xbd, 0x90, 0x3f, 0x18, 0x68, 0xff, 0x54, 0xf1, 0xc7, ++ 0xd8, 0xb7, 0x32, 0xe3, 0x13, 0xfa, 0x87, 0xb8, 0xf8, 0x3e, 0x2b, 0x8b, ++ 0xf3, 0xef, 0x91, 0xc3, 0xf3, 0x01, 0xaf, 0x7b, 0x4e, 0xdb, 0x30, 0x3f, ++ 0x67, 0xb7, 0xd2, 0x50, 0x11, 0x0b, 0xce, 0x4b, 0xec, 0x4c, 0xcf, 0x2d, ++ 0x24, 0xe1, 0x3b, 0xc7, 0x65, 0xfe, 0xf3, 0xe1, 0x77, 0x6a, 0x8f, 0x33, ++ 0x52, 0x00, 0x7e, 0xe6, 0x26, 0xc2, 0xe3, 0x18, 0x66, 0xfe, 0x23, 0xc8, ++ 0xc7, 0x67, 0xb7, 0x10, 0x3c, 0x1f, 0x0a, 0x7e, 0x29, 0xe8, 0x85, 0xb3, ++ 0x2d, 0xec, 0x1c, 0x30, 0x45, 0xc9, 0x5a, 0xf0, 0xa7, 0xa9, 0xbc, 0xff, ++ 0x40, 0x1f, 0x97, 0xb9, 0xa4, 0x6d, 0xfb, 0xbf, 0x82, 0x1d, 0x50, 0xdd, ++ 0x2e, 0x78, 0x20, 0x75, 0xb6, 0x5a, 0xea, 0x52, 0x20, 0xde, 0x1a, 0x68, ++ 0x4b, 0x12, 0x61, 0xdd, 0xcd, 0x51, 0xb5, 0xbc, 0x4a, 0xcf, 0xd8, 0x9b, ++ 0x74, 0x72, 0xb1, 0xcf, 0xca, 0xf2, 0x8d, 0x0f, 0x4e, 0xde, 0x73, 0x2b, ++ 0x8c, 0xfb, 0x59, 0xb7, 0x42, 0xc0, 0x1e, 0xf1, 0xbd, 0xd2, 0xeb, 0x86, ++ 0x75, 0xfb, 0xb3, 0xf6, 0xdc, 0xc4, 0x58, 0x79, 0xf3, 0xda, 0xf3, 0xd7, ++ 0xb5, 0xe4, 0xea, 0xe9, 0x12, 0xf4, 0x43, 0x10, 0xef, 0x66, 0x7e, 0xc8, ++ 0x6e, 0x71, 0x18, 0xca, 0xdf, 0x13, 0xfd, 0x43, 0x40, 0xbe, 0xae, 0xb5, ++ 0x76, 0xdd, 0xe5, 0x8d, 0x41, 0x3f, 0xbf, 0x8d, 0xf1, 0xd9, 0x45, 0xeb, ++ 0xb7, 0xd0, 0xff, 0x67, 0xfa, 0xed, 0x1d, 0x4d, 0xbf, 0xf9, 0xc5, 0x22, ++ 0x9d, 0x1c, 0x65, 0xd9, 0xfa, 0xe9, 0xb7, 0x41, 0xb1, 0xf4, 0xdb, 0x12, ++ 0x41, 0x1d, 0x04, 0x78, 0x5f, 0xb2, 0x77, 0xe4, 0x20, 0xa0, 0xeb, 0x92, ++ 0x43, 0xf2, 0xc0, 0x58, 0xfa, 0x6d, 0x5b, 0x2d, 0xdb, 0xcf, 0x7b, 0x81, ++ 0xe7, 0xc3, 0xf6, 0xb4, 0x52, 0xfd, 0x76, 0xb9, 0x4e, 0xbf, 0xb5, 0xda, ++ 0x30, 0x2f, 0xce, 0xdc, 0x2e, 0xd9, 0x66, 0xe1, 0xeb, 0xe2, 0x05, 0xf4, ++ 0x5b, 0xe8, 0xbf, 0x47, 0xfe, 0xb6, 0x81, 0x7e, 0x8b, 0x31, 0xdf, 0xd1, ++ 0x36, 0xa6, 0x37, 0x34, 0xfd, 0x36, 0xae, 0xfd, 0x08, 0xea, 0xb7, 0x71, ++ 0xad, 0x16, 0x43, 0xde, 0x68, 0xba, 0xed, 0x42, 0xfa, 0x4d, 0x18, 0x78, ++ 0x13, 0xd8, 0xc3, 0x1d, 0xb2, 0x37, 0x21, 0x06, 0xff, 0x6c, 0xe3, 0xf6, ++ 0xf7, 0x0b, 0x3c, 0x0f, 0x0f, 0xc6, 0x01, 0x3d, 0x77, 0xab, 0x8d, 0xed, ++ 0x6f, 0x5e, 0xac, 0x9e, 0xcb, 0xb6, 0x33, 0x7a, 0x5f, 0x50, 0xcf, 0xfd, ++ 0x37, 0xe1, 0x59, 0xd3, 0x73, 0x4b, 0x76, 0x6a, 0xe7, 0x1c, 0xcd, 0x7c, ++ 0xc8, 0xf4, 0xdc, 0x92, 0xdd, 0x54, 0xcf, 0x09, 0xc0, 0x8f, 0x4c, 0xcf, ++ 0x2d, 0xd9, 0xcb, 0xee, 0x71, 0x30, 0xeb, 0xb7, 0xac, 0x7e, 0xfa, 0x8d, ++ 0x60, 0xfd, 0xea, 0x08, 0x6b, 0x1f, 0x68, 0xcb, 0xdc, 0x30, 0x97, 0xf6, ++ 0x37, 0xde, 0x27, 0x7b, 0x6d, 0xb4, 0xfe, 0xf8, 0xa8, 0xbe, 0x9b, 0xa0, ++ 0xd7, 0x77, 0xb7, 0xda, 0xd8, 0xbd, 0x0b, 0xfd, 0xf4, 0x5d, 0xc7, 0xc5, ++ 0xe9, 0xbb, 0x9d, 0x5c, 0xdf, 0x51, 0x3d, 0x36, 0x02, 0xf4, 0xab, 0x99, ++ 0x3f, 0xbc, 0xed, 0xc6, 0xbc, 0xe3, 0x3d, 0x93, 0x8e, 0xb7, 0xfc, 0x1a, ++ 0xe4, 0xe5, 0x0d, 0x11, 0xf7, 0x0d, 0x0f, 0xf3, 0x73, 0x69, 0x6f, 0x4e, ++ 0x3a, 0x9e, 0x07, 0xfc, 0xd5, 0x62, 0x63, 0xfa, 0xb7, 0x8e, 0xf3, 0xdf, ++ 0x99, 0xda, 0x20, 0xf6, 0x3f, 0xed, 0x15, 0x36, 0xbf, 0x2a, 0x27, 0xcb, ++ 0x47, 0xae, 0x6e, 0x65, 0xf6, 0x61, 0x75, 0x8b, 0x10, 0x52, 0xe9, 0x3f, ++ 0x0b, 0x27, 0x7f, 0xad, 0x00, 0xfc, 0x8b, 0xf6, 0x0a, 0x64, 0x10, 0x2d, ++ 0x5f, 0x6f, 0x65, 0xf5, 0xc9, 0xb3, 0xda, 0xbe, 0x17, 0x99, 0x95, 0xa3, ++ 0xe3, 0x87, 0x05, 0x13, 0x2b, 0x30, 0x6e, 0xbf, 0x40, 0x22, 0x36, 0x88, ++ 0xcb, 0x57, 0x38, 0x0b, 0x3f, 0x01, 0xfb, 0xb7, 0x62, 0x22, 0x8b, 0xe3, ++ 0x57, 0xf0, 0xf7, 0x8b, 0x0e, 0x75, 0xd5, 0x43, 0x3c, 0x7b, 0xd1, 0x63, ++ 0x02, 0xee, 0x7b, 0x12, 0x9e, 0x0f, 0xa0, 0xe5, 0x37, 0x96, 0xb6, 0x2f, ++ 0xc3, 0x78, 0xad, 0x39, 0x2f, 0x40, 0xd3, 0xe7, 0x8b, 0x42, 0xc6, 0xf7, ++ 0x15, 0xa6, 0x7c, 0xc6, 0x66, 0x3e, 0xcf, 0xeb, 0xc5, 0x2e, 0xc4, 0x0b, ++ 0x79, 0x4b, 0x8c, 0x99, 0x97, 0xd0, 0x6c, 0xc6, 0x47, 0x07, 0xc7, 0xc7, ++ 0x26, 0x11, 0xd7, 0xcd, 0x3e, 0x7c, 0x50, 0xfc, 0xa8, 0x99, 0xfd, 0xf1, ++ 0x41, 0x29, 0x3a, 0x2b, 0x27, 0x35, 0x3a, 0xff, 0x45, 0x6f, 0xd0, 0x79, ++ 0xe5, 0x45, 0xe7, 0xa5, 0xe1, 0xc3, 0x3c, 0x3f, 0x2d, 0xee, 0x5c, 0xc1, ++ 0xdb, 0xc5, 0x9b, 0xaf, 0x86, 0xbf, 0x7e, 0xf3, 0xd5, 0xf0, 0x69, 0x9a, ++ 0xf7, 0xd3, 0xa0, 0x37, 0x40, 0x21, 0xe4, 0x90, 0x5c, 0xc8, 0x8b, 0xa1, ++ 0x7c, 0x80, 0x7a, 0x23, 0xf8, 0x5b, 0x11, 0xcf, 0xef, 0x17, 0x4d, 0x1d, ++ 0x3d, 0x48, 0xaf, 0x87, 0xb7, 0x72, 0x7d, 0x9e, 0xdb, 0x30, 0x75, 0xda, ++ 0x60, 0x02, 0xf8, 0x22, 0x35, 0xc0, 0x37, 0x25, 0x8d, 0x8b, 0x5f, 0x1d, ++ 0x4c, 0xe7, 0x3d, 0xe1, 0x7d, 0x75, 0x3c, 0x2c, 0x8f, 0xdf, 0x9b, 0x6c, ++ 0xf5, 0xc3, 0xfe, 0xe8, 0x56, 0x7b, 0x2f, 0xea, 0x35, 0x8d, 0xaf, 0xfe, ++ 0xcc, 0xf9, 0xea, 0x5d, 0x8e, 0xc7, 0x3d, 0x43, 0x6a, 0xf0, 0x9c, 0x6a, ++ 0xa0, 0x4d, 0xf0, 0x80, 0x5d, 0x11, 0x88, 0xd8, 0x11, 0x7f, 0x01, 0x8a, ++ 0x3f, 0x38, 0xbf, 0x12, 0xe0, 0xe7, 0x17, 0x03, 0x94, 0xbf, 0x40, 0x9e, ++ 0x0e, 0x3e, 0xf6, 0x25, 0xc3, 0xd7, 0x5e, 0x41, 0x85, 0xf8, 0x78, 0xa1, ++ 0xb6, 0xfe, 0x00, 0xfe, 0x69, 0xfd, 0xdc, 0x76, 0x86, 0xff, 0x40, 0x48, ++ 0x40, 0xfc, 0xe7, 0x91, 0x5e, 0xdc, 0x1f, 0xa9, 0x6e, 0x14, 0xbc, 0x11, ++ 0x5a, 0xbf, 0xba, 0x6d, 0x31, 0xe6, 0x3d, 0x68, 0xfa, 0x96, 0xfe, 0x39, ++ 0xf5, 0xf4, 0xd0, 0xf1, 0xa3, 0x14, 0x8b, 0x1f, 0xb1, 0x92, 0x6e, 0xfd, ++ 0xab, 0xe0, 0xf5, 0xae, 0xb5, 0x36, 0xbc, 0x0b, 0xfc, 0x79, 0xed, 0xb3, ++ 0x32, 0x69, 0xd6, 0xf1, 0x67, 0x16, 0xfd, 0xef, 0xdb, 0x18, 0x74, 0xd2, ++ 0xf0, 0x79, 0x21, 0xbe, 0x3c, 0xc7, 0xf1, 0xb4, 0x0d, 0xf0, 0xe8, 0x04, ++ 0x7c, 0xf5, 0x32, 0xfb, 0x29, 0xf2, 0x35, 0x9e, 0xa3, 0xd1, 0xbe, 0x07, ++ 0xa4, 0xa0, 0x01, 0x8f, 0xd3, 0x1e, 0x3f, 0x77, 0x5e, 0x3c, 0x4d, 0xd0, ++ 0xf0, 0x04, 0x7c, 0x0a, 0x7a, 0xaa, 0xbd, 0x58, 0x84, 0x72, 0x49, 0x9b, ++ 0x40, 0x06, 0x64, 0xf6, 0x9f, 0x27, 0xec, 0x4f, 0xea, 0xe5, 0x76, 0xd1, ++ 0xde, 0x23, 0xac, 0xff, 0x27, 0x05, 0xbc, 0xb7, 0xc4, 0xcc, 0xb7, 0xda, ++ 0xbc, 0xfb, 0xf1, 0x6d, 0x1c, 0x7e, 0x85, 0x73, 0x69, 0xe0, 0x17, 0x5d, ++ 0x2c, 0xdf, 0xfe, 0xd9, 0xc4, 0xb7, 0x6f, 0xda, 0x7b, 0x5f, 0xcf, 0x05, ++ 0xbe, 0xdd, 0x2b, 0xb0, 0xf8, 0x41, 0x7b, 0x92, 0x61, 0x7f, 0x71, 0x88, ++ 0x9d, 0xad, 0xff, 0x5b, 0xed, 0x94, 0xbf, 0x61, 0x5f, 0xeb, 0x90, 0xec, ++ 0xdd, 0xa8, 0xf6, 0x97, 0xef, 0x04, 0xbe, 0x7e, 0x81, 0xdd, 0xaf, 0x3f, ++ 0x97, 0x74, 0x29, 0x4c, 0x04, 0xf2, 0x1e, 0xb7, 0xd8, 0x30, 0x8f, 0x0c, ++ 0xe1, 0x18, 0xc1, 0xec, 0x4a, 0xbd, 0x5e, 0xdd, 0x66, 0x27, 0x03, 0x6f, ++ 0xca, 0x8b, 0xdf, 0xff, 0x60, 0xde, 0x7f, 0x3c, 0xbb, 0x46, 0x2b, 0x8f, ++ 0x85, 0xf1, 0x20, 0xdf, 0xab, 0x8d, 0x8e, 0x97, 0x15, 0x1d, 0xcf, 0xac, ++ 0xd7, 0x35, 0x3f, 0xff, 0x42, 0xf3, 0x1a, 0xf3, 0x77, 0xce, 0xab, 0x2f, ++ 0x0f, 0x93, 0x74, 0xe2, 0xbe, 0x53, 0xa6, 0xe4, 0x7f, 0xd8, 0xaa, 0xcb, ++ 0x83, 0xbb, 0x99, 0xe7, 0x19, 0x51, 0x08, 0xd0, 0xbe, 0xd2, 0xd5, 0xcb, ++ 0xb6, 0x9d, 0xa7, 0x1e, 0x49, 0xf3, 0xe0, 0xf9, 0xa7, 0x3b, 0x3d, 0x1a, ++ 0x9f, 0xb1, 0x7c, 0xf7, 0x22, 0x9e, 0xc7, 0x3e, 0x43, 0x9c, 0xf2, 0x1e, ++ 0xac, 0x9f, 0x9f, 0xf9, 0xd8, 0x3e, 0x5f, 0x9e, 0x85, 0xfc, 0x6e, 0x0a, ++ 0xe8, 0xe7, 0x02, 0x19, 0xcf, 0xf1, 0x7d, 0xf6, 0xba, 0x8c, 0xf1, 0xda, ++ 0xcf, 0xa6, 0xb3, 0x3c, 0xce, 0xeb, 0xde, 0x38, 0x28, 0x41, 0x9c, 0xe6, ++ 0x3a, 0x50, 0x4e, 0x14, 0x1f, 0xd7, 0x4d, 0x10, 0xd0, 0x5f, 0x81, 0x63, ++ 0x58, 0xb0, 0x6f, 0xb6, 0x8b, 0xda, 0x37, 0xbe, 0x31, 0x38, 0x9f, 0x5c, ++ 0x38, 0xc7, 0x95, 0xb3, 0xa9, 0x61, 0x1a, 0x9c, 0x3f, 0x1e, 0xbf, 0x25, ++ 0x54, 0x07, 0x4f, 0xef, 0xb4, 0xde, 0x94, 0x37, 0x01, 0x8f, 0x53, 0x45, ++ 0x02, 0x78, 0xec, 0xf4, 0x0d, 0x98, 0x06, 0xf7, 0x27, 0xdd, 0xf9, 0x27, ++ 0x82, 0xf7, 0x87, 0xd0, 0x75, 0x16, 0xdb, 0x8f, 0xef, 0x20, 0x03, 0xa1, ++ 0xde, 0x64, 0xdf, 0x40, 0x74, 0x07, 0x26, 0xb5, 0xae, 0x9f, 0x06, 0xf1, ++ 0xd1, 0xeb, 0x0f, 0x3a, 0x9d, 0x70, 0x3f, 0x4b, 0x56, 0x93, 0x85, 0xfa, ++ 0x0c, 0x51, 0xfc, 0x4d, 0x26, 0xa1, 0x3a, 0xd8, 0x6f, 0x9f, 0x74, 0xd4, ++ 0x77, 0x23, 0xc0, 0x5b, 0x46, 0xed, 0x05, 0x88, 0x3b, 0x97, 0xb5, 0x37, ++ 0xd7, 0xb9, 0xa1, 0xdc, 0x24, 0x78, 0x55, 0xda, 0x7f, 0x20, 0xe8, 0x2f, ++ 0x74, 0xd3, 0x79, 0x6c, 0x6b, 0xfc, 0xb4, 0xf0, 0x3b, 0x20, 0x8f, 0xb4, ++ 0x1e, 0x74, 0x13, 0x68, 0x62, 0xf5, 0x02, 0x9b, 0xe0, 0xe2, 0x21, 0x78, ++ 0xbf, 0x0e, 0xf3, 0x6c, 0x4a, 0x36, 0x09, 0x78, 0xf0, 0x6b, 0x5b, 0x48, ++ 0x20, 0x36, 0xd6, 0x6f, 0xc8, 0x46, 0xfb, 0xdd, 0xd6, 0x44, 0xdb, 0xe7, ++ 0xc1, 0x3a, 0x41, 0xdb, 0x43, 0xbf, 0x9b, 0x3e, 0x7d, 0xe7, 0x46, 0x90, ++ 0xf7, 0xd7, 0x45, 0xd6, 0xbe, 0x85, 0xed, 0x53, 0x97, 0xd0, 0x76, 0x2a, ++ 0xf0, 0xed, 0xa6, 0xc5, 0xd8, 0xdf, 0xa2, 0x26, 0x81, 0xa4, 0xd1, 0xfe, ++ 0xca, 0x5a, 0xd8, 0x3a, 0x50, 0xf6, 0xba, 0xec, 0x85, 0xef, 0xad, 0xfb, ++ 0x1f, 0xc3, 0x75, 0x6c, 0x16, 0x1d, 0x6f, 0x70, 0x26, 0xe8, 0xfd, 0xc8, ++ 0x74, 0x28, 0x93, 0x5c, 0xc1, 0x83, 0xe7, 0x50, 0x2a, 0xc7, 0x20, 0xdd, ++ 0x7a, 0xb8, 0x9c, 0x93, 0x29, 0xa3, 0x99, 0xfe, 0x10, 0x78, 0x99, 0xfb, ++ 0x0d, 0x9a, 0xdd, 0xf4, 0xae, 0x9d, 0xe5, 0xfb, 0x96, 0x78, 0x97, 0x29, ++ 0x03, 0x68, 0x3f, 0x6f, 0x4e, 0x1c, 0x98, 0x09, 0x69, 0x01, 0x81, 0xb6, ++ 0x4f, 0x71, 0xff, 0xf9, 0x28, 0xc5, 0xb3, 0x9f, 0x76, 0x79, 0x98, 0xe7, ++ 0x6d, 0x1c, 0x9c, 0xf8, 0xb1, 0xd2, 0xa5, 0x5b, 0x87, 0x3e, 0xb3, 0xb3, ++ 0xfb, 0xad, 0x16, 0xb4, 0x4d, 0xc5, 0x7c, 0x86, 0x85, 0xa4, 0x08, 0xf3, ++ 0x19, 0xae, 0x9d, 0xc4, 0xec, 0xb5, 0xb7, 0xae, 0xb0, 0x87, 0xe0, 0x8a, ++ 0x83, 0xb7, 0xe4, 0xde, 0x74, 0x78, 0x7f, 0xf0, 0x0a, 0x2b, 0xda, 0xbf, ++ 0x67, 0xb6, 0xc9, 0xc8, 0x47, 0x67, 0x86, 0x75, 0x61, 0x7c, 0xfa, 0x78, ++ 0x93, 0x8c, 0xe7, 0x86, 0xeb, 0x9a, 0xd8, 0xfd, 0x5c, 0xc7, 0x5b, 0xd8, ++ 0x3a, 0x2e, 0x3e, 0xc9, 0xf6, 0xf5, 0x4b, 0x5d, 0x0a, 0x96, 0x0f, 0x36, ++ 0xdd, 0x58, 0x08, 0xeb, 0xdb, 0xf1, 0x4d, 0xec, 0xbc, 0xe3, 0xb4, 0x27, ++ 0x67, 0x28, 0x50, 0x2e, 0x6d, 0x16, 0xbc, 0xec, 0xfe, 0x22, 0xa6, 0x1f, ++ 0x35, 0xff, 0xad, 0xc4, 0xc3, 0xf2, 0x11, 0x34, 0xfd, 0x57, 0xc5, 0xe7, ++ 0xdd, 0x2f, 0x6f, 0xd1, 0xa4, 0xef, 0xaa, 0xb4, 0xf5, 0xc6, 0xa4, 0xef, ++ 0xaa, 0x60, 0x5f, 0xd9, 0x0d, 0x4f, 0xe3, 0xfb, 0x00, 0x71, 0x32, 0x3d, ++ 0x08, 0x76, 0x3f, 0xd0, 0x3d, 0xf2, 0x35, 0xf2, 0x6f, 0xf5, 0xeb, 0x32, ++ 0x01, 0xbb, 0x5f, 0xf8, 0xb8, 0xbb, 0x10, 0xf3, 0xb1, 0xf6, 0x0a, 0x18, ++ 0xcf, 0x9f, 0xd4, 0x2e, 0xf8, 0x60, 0x5f, 0xbf, 0xec, 0x7d, 0x6b, 0x08, ++ 0xed, 0xd5, 0x50, 0xf1, 0x1d, 0x3f, 0x01, 0x3d, 0xfe, 0x81, 0x95, 0x08, ++ 0x2a, 0xe4, 0xb5, 0x53, 0xbc, 0x53, 0xfd, 0x30, 0xd1, 0xda, 0xfb, 0xc7, ++ 0x5f, 0xd0, 0xf7, 0x9f, 0x1c, 0xb6, 0x41, 0x26, 0x0c, 0xe5, 0x93, 0x62, ++ 0xc4, 0xb3, 0x96, 0xff, 0x99, 0xb7, 0x99, 0xe5, 0xb1, 0xe4, 0x1d, 0x5e, ++ 0x9f, 0x0a, 0xe7, 0x2d, 0xc9, 0xf4, 0x01, 0xa8, 0x6f, 0x4b, 0x1b, 0x45, ++ 0xe2, 0xd7, 0xe9, 0x8d, 0x4f, 0x04, 0xdf, 0x8d, 0x3f, 0x66, 0x7a, 0x19, ++ 0xef, 0xa7, 0xd0, 0xe8, 0x97, 0xa7, 0x34, 0x94, 0xc0, 0x3a, 0x36, 0xd2, ++ 0xc1, 0xf4, 0x92, 0xba, 0x59, 0x86, 0x1c, 0x11, 0x72, 0x88, 0xc7, 0x49, ++ 0xa8, 0x3d, 0x8d, 0xe7, 0x6f, 0x17, 0xed, 0x5e, 0x97, 0xaa, 0xd0, 0x7a, ++ 0xf5, 0x3c, 0xff, 0x63, 0xd1, 0xde, 0x75, 0xa9, 0x22, 0x7d, 0x5f, 0x07, ++ 0xeb, 0x17, 0xad, 0xbf, 0x48, 0x61, 0xfd, 0x2f, 0xda, 0x27, 0x78, 0x9a, ++ 0x75, 0xfd, 0x6b, 0xed, 0xb5, 0xfe, 0xb4, 0x7e, 0x94, 0xdd, 0xc6, 0x7e, ++ 0x46, 0xee, 0xe5, 0xe5, 0x8b, 0xec, 0x47, 0x83, 0x43, 0x1b, 0x3f, 0x9e, ++ 0x3d, 0x3e, 0xf1, 0xdf, 0xcf, 0xad, 0x87, 0xfb, 0x62, 0x26, 0xbe, 0x25, ++ 0x62, 0xd2, 0xf1, 0xc4, 0x8f, 0x67, 0x8d, 0xd4, 0xef, 0x77, 0x68, 0x4f, ++ 0x2d, 0xfe, 0x9a, 0xff, 0x8e, 0x85, 0xf8, 0x74, 0x78, 0x9b, 0xf8, 0x47, ++ 0x07, 0xf1, 0xe9, 0xf8, 0xa2, 0x75, 0x02, 0x95, 0x6f, 0x4a, 0xb7, 0x6b, ++ 0xda, 0x84, 0x10, 0x80, 0xd2, 0x3a, 0xe1, 0x88, 0x52, 0x95, 0x87, 0x65, ++ 0x0f, 0xc8, 0x73, 0x35, 0x8f, 0xd3, 0x56, 0x4f, 0x67, 0xfb, 0x56, 0xad, ++ 0x39, 0x87, 0x57, 0x80, 0x7c, 0xcf, 0xca, 0x13, 0x90, 0x0f, 0x48, 0xd0, ++ 0xaf, 0x0c, 0x48, 0x41, 0x3b, 0x48, 0x85, 0xf8, 0x78, 0x69, 0x1e, 0x6b, ++ 0x5f, 0x4a, 0xdb, 0x83, 0xdc, 0xb5, 0x3e, 0xc6, 0xe4, 0x90, 0xea, 0x03, ++ 0x15, 0xf4, 0x45, 0x75, 0xd3, 0xba, 0x42, 0xac, 0xbf, 0x49, 0x50, 0xa1, ++ 0xff, 0xd6, 0xe6, 0x62, 0x5c, 0xef, 0xcb, 0x26, 0x8a, 0x04, 0xbf, 0x6f, ++ 0x3a, 0x82, 0xf6, 0x47, 0x59, 0xdb, 0x91, 0x14, 0x90, 0x57, 0x2a, 0x9f, ++ 0xeb, 0x61, 0xfd, 0xad, 0x9e, 0x62, 0xc5, 0xfb, 0xbc, 0x34, 0xb9, 0xd3, ++ 0xe4, 0xf8, 0x2d, 0x99, 0xdf, 0xd7, 0x64, 0xf3, 0x8c, 0x85, 0xbc, 0xfe, ++ 0xfb, 0x00, 0xa8, 0x18, 0xf2, 0x2b, 0xbe, 0x4e, 0x98, 0x9f, 0xda, 0x22, ++ 0xa3, 0x9c, 0x05, 0x26, 0x32, 0xb9, 0x7c, 0x6b, 0x9b, 0x88, 0xf2, 0x7c, ++ 0xf0, 0x8a, 0x5b, 0x50, 0x0e, 0xcf, 0x6c, 0x16, 0xe2, 0xc8, 0xf1, 0x34, ++ 0x05, 0xce, 0x25, 0x1f, 0x0f, 0xb1, 0xef, 0x7d, 0x72, 0xbc, 0x55, 0xe0, ++ 0x72, 0xcc, 0xf4, 0xc3, 0x71, 0x27, 0x93, 0xeb, 0x69, 0xf0, 0x1d, 0xe4, ++ 0x78, 0xa7, 0xc0, 0xfd, 0x41, 0x66, 0x0f, 0x9a, 0xe5, 0x58, 0x93, 0xcb, ++ 0x0b, 0xc9, 0x6f, 0xc5, 0x16, 0x93, 0x3c, 0xc7, 0x91, 0xdb, 0x4e, 0xa9, ++ 0xeb, 0x26, 0x18, 0xf7, 0xce, 0x2b, 0xec, 0x08, 0xf7, 0xb4, 0xef, 0xef, ++ 0x7e, 0xf7, 0x4e, 0xd4, 0x3f, 0x32, 0xe6, 0x7d, 0x4c, 0xfb, 0xfe, 0xbd, ++ 0xa9, 0xa0, 0xef, 0x4a, 0x24, 0x96, 0xaf, 0xa4, 0xe1, 0xb1, 0x4a, 0x62, ++ 0xf9, 0x6c, 0xfd, 0xe0, 0x58, 0xbf, 0x4c, 0x19, 0x7c, 0x51, 0xf0, 0x18, ++ 0xe1, 0x78, 0xc2, 0xee, 0x8a, 0xea, 0x0f, 0x11, 0xf8, 0x9c, 0xdd, 0xc3, ++ 0x15, 0xdc, 0x24, 0x23, 0x9f, 0x9b, 0xe5, 0xf0, 0xef, 0x95, 0x9f, 0x7f, ++ 0x94, 0x3c, 0x1f, 0xe2, 0xfc, 0xa3, 0xc1, 0x23, 0xee, 0x65, 0xed, 0x21, ++ 0x7f, 0x2c, 0x42, 0xf1, 0xf4, 0x5a, 0xcb, 0xd3, 0x98, 0xa7, 0x7a, 0xfa, ++ 0xb9, 0x23, 0xd7, 0x02, 0x9e, 0x2b, 0xf6, 0x50, 0xbe, 0xa5, 0xf3, 0x3d, ++ 0xd3, 0xe2, 0xe2, 0xf7, 0xbd, 0x84, 0x70, 0x9d, 0x29, 0x6f, 0x15, 0x31, ++ 0x0f, 0x9c, 0x48, 0x91, 0xfc, 0x1b, 0x5d, 0x7a, 0xb9, 0x64, 0x79, 0x48, ++ 0x15, 0x2f, 0xb8, 0x90, 0x3f, 0xca, 0x77, 0xb0, 0x7c, 0xd2, 0xf2, 0x17, ++ 0x3f, 0x1e, 0x87, 0x79, 0x22, 0xcb, 0x7b, 0x31, 0xbf, 0x2a, 0xf8, 0x1c, ++ 0xb7, 0x37, 0x83, 0x5d, 0xe3, 0x80, 0xaf, 0xcb, 0x25, 0x96, 0x0f, 0x65, ++ 0x96, 0xf3, 0x9b, 0x1c, 0xcc, 0xfe, 0xec, 0xde, 0x9d, 0x30, 0x1b, 0xe6, ++ 0x21, 0x6c, 0x61, 0xe7, 0xf4, 0xcb, 0xc3, 0xb7, 0xc8, 0xc0, 0x87, 0x5a, ++ 0xbd, 0x1f, 0x3a, 0x64, 0xad, 0x1e, 0xee, 0x5f, 0x06, 0x29, 0xdf, 0xc2, ++ 0xfe, 0x3a, 0xc0, 0xa7, 0x3f, 0x77, 0xae, 0xe5, 0x41, 0x75, 0x6f, 0x65, ++ 0x72, 0x5f, 0xde, 0x26, 0xa3, 0xbf, 0x54, 0xbe, 0xa5, 0x19, 0xe3, 0xd8, ++ 0x81, 0x2d, 0x9f, 0x62, 0x9e, 0xfb, 0xb4, 0x17, 0xb6, 0x61, 0xfc, 0x20, ++ 0xd0, 0x26, 0x1a, 0xf3, 0x1e, 0xb7, 0x88, 0x11, 0x2b, 0xe6, 0x65, 0x8a, ++ 0x47, 0xac, 0x6c, 0x9d, 0x32, 0xe4, 0x1f, 0x56, 0xb7, 0x56, 0xe1, 0x7e, ++ 0x5b, 0x75, 0x98, 0xe7, 0xf7, 0x99, 0xf2, 0xdf, 0x2a, 0x5e, 0xd8, 0xfb, ++ 0x62, 0x90, 0xa2, 0xa6, 0xe2, 0xd7, 0xcf, 0xba, 0x41, 0x0f, 0x9c, 0xec, ++ 0xdc, 0xec, 0x06, 0x7c, 0xd2, 0xfe, 0x30, 0x6f, 0xf0, 0xfb, 0x9f, 0x4b, ++ 0x86, 0xbc, 0xa8, 0xf8, 0xf9, 0xbd, 0x3e, 0x63, 0x3e, 0x61, 0x78, 0x55, ++ 0xcc, 0x7c, 0xc2, 0x93, 0xf0, 0x0f, 0xca, 0xe0, 0xf7, 0x3a, 0x38, 0xbf, ++ 0x6a, 0x79, 0x98, 0x5b, 0x06, 0xf0, 0x3c, 0xed, 0x48, 0x7e, 0x51, 0x8c, ++ 0xf8, 0x7d, 0xdf, 0xb9, 0x9d, 0x6d, 0x5f, 0x3c, 0x05, 0x79, 0xee, 0xdd, ++ 0x3b, 0x4e, 0x3d, 0x05, 0x70, 0x57, 0xfe, 0xf5, 0xb3, 0xa7, 0x20, 0x9f, ++ 0x89, 0xec, 0xb3, 0xe3, 0xba, 0x14, 0x78, 0xee, 0x77, 0x98, 0x27, 0xac, ++ 0xb5, 0xfb, 0x85, 0x83, 0xfb, 0xf9, 0x5b, 0x9f, 0xc5, 0xfc, 0xea, 0x33, ++ 0x1f, 0x58, 0xd1, 0xcf, 0x39, 0xb3, 0xf7, 0x78, 0x06, 0xe4, 0xaf, 0x9d, ++ 0xd9, 0xfe, 0x75, 0x2a, 0xc4, 0xe3, 0xee, 0xda, 0x3b, 0x03, 0xe3, 0x95, ++ 0x77, 0xed, 0x9c, 0x36, 0x88, 0xc4, 0xd0, 0xef, 0xda, 0x13, 0xf8, 0x32, ++ 0x74, 0x11, 0xf9, 0xdd, 0x66, 0x3a, 0x1c, 0x6c, 0x3d, 0x88, 0x79, 0x57, ++ 0xa7, 0xdf, 0xb7, 0xa2, 0x3e, 0xeb, 0xcb, 0x0b, 0x0d, 0x57, 0xb1, 0x3c, ++ 0x5b, 0x95, 0xe7, 0x83, 0xb6, 0xc4, 0xce, 0xa3, 0xd7, 0xf2, 0x18, 0xab, ++ 0x5b, 0x6f, 0xbc, 0xee, 0x0a, 0xd0, 0xcf, 0xad, 0xcc, 0x9e, 0xeb, 0xcb, ++ 0x6b, 0xbc, 0x50, 0x1e, 0xe8, 0x3b, 0x94, 0x9e, 0x97, 0x5f, 0x04, 0xdd, ++ 0x5a, 0x78, 0x9e, 0xaf, 0x89, 0x6e, 0xa7, 0xe1, 0x1f, 0x94, 0x3e, 0x61, ++ 0x13, 0xdd, 0xbe, 0x68, 0x5d, 0xf8, 0xab, 0xc7, 0xe1, 0x5b, 0xeb, 0x80, ++ 0xb8, 0x79, 0xa0, 0x91, 0x8b, 0xc0, 0x97, 0x96, 0xa7, 0xff, 0x73, 0x87, ++ 0x6f, 0x8f, 0x03, 0xce, 0xfd, 0xed, 0x48, 0x08, 0xa6, 0x31, 0x7a, 0x85, ++ 0x66, 0x09, 0x60, 0xef, 0x7d, 0x91, 0x01, 0xe7, 0x1a, 0x4e, 0xc8, 0xbd, ++ 0x98, 0xef, 0xd1, 0xbb, 0xd7, 0xea, 0x81, 0x7c, 0xc6, 0xf2, 0xbd, 0xef, ++ 0xa1, 0x7c, 0x9c, 0xd9, 0x79, 0x18, 0xe3, 0xaa, 0x84, 0xe7, 0xc9, 0x9f, ++ 0x21, 0x7d, 0x7f, 0x2c, 0xaf, 0x59, 0xe0, 0xf3, 0xdb, 0xe4, 0x62, 0xf9, ++ 0xa3, 0x1c, 0xef, 0x90, 0x5f, 0xaa, 0xba, 0xf1, 0x3d, 0xcf, 0x23, 0x65, ++ 0x7c, 0xab, 0xe5, 0x97, 0xc6, 0xcb, 0x2b, 0xed, 0x75, 0x8c, 0x60, 0x71, ++ 0x68, 0x7e, 0x6e, 0xa0, 0x8a, 0xfa, 0x49, 0xfc, 0xde, 0xac, 0xbe, 0x7c, ++ 0x53, 0x61, 0x22, 0xd0, 0xe9, 0x88, 0x21, 0x4f, 0x57, 0x9b, 0xb7, 0xb9, ++ 0x3f, 0x0f, 0xd7, 0x9b, 0xd1, 0xfc, 0xe8, 0xd8, 0x79, 0xbb, 0x5a, 0xbe, ++ 0x60, 0x94, 0x4e, 0x6c, 0x1d, 0xd1, 0xf2, 0x9f, 0xcf, 0x34, 0xf3, 0xbc, ++ 0x69, 0xfa, 0x3e, 0x7d, 0x3c, 0xe4, 0xc1, 0xb1, 0xf5, 0x3a, 0x10, 0x12, ++ 0xde, 0x23, 0x31, 0xe4, 0x51, 0xcb, 0x8f, 0x3e, 0xe5, 0x30, 0xe5, 0x45, ++ 0x87, 0x2e, 0x2e, 0x2f, 0xfa, 0x42, 0xf0, 0xfe, 0xef, 0xe2, 0xe3, 0x43, ++ 0x07, 0x8b, 0x57, 0x6b, 0x78, 0xe9, 0xfe, 0x26, 0xb6, 0x3e, 0x56, 0x12, ++ 0x98, 0xdd, 0x49, 0xfd, 0x53, 0x39, 0x01, 0xf7, 0x05, 0x98, 0x7f, 0x7a, ++ 0x07, 0xf7, 0x4f, 0x35, 0x7c, 0x69, 0xf0, 0xd6, 0x87, 0x99, 0xdd, 0xd0, ++ 0xbd, 0x85, 0xf9, 0x07, 0x66, 0x79, 0xae, 0x8e, 0x73, 0x5f, 0x52, 0x0a, ++ 0x1f, 0xa7, 0xba, 0x6d, 0xff, 0x38, 0xd0, 0x3b, 0xdd, 0x07, 0x76, 0x73, ++ 0x7e, 0x63, 0xfc, 0x5c, 0xdd, 0x72, 0x84, 0xe5, 0xdd, 0x52, 0xfd, 0x1c, ++ 0xd2, 0xeb, 0x67, 0x7e, 0xbf, 0x84, 0xb9, 0xbf, 0x0c, 0xde, 0x5f, 0xa0, ++ 0x3d, 0x76, 0x7f, 0x81, 0x96, 0x4f, 0x63, 0xf6, 0x77, 0x52, 0xf2, 0xdd, ++ 0x02, 0xf0, 0x9f, 0xec, 0x64, 0x76, 0xd2, 0xc9, 0xb0, 0x38, 0x33, 0xd6, ++ 0xfd, 0x36, 0xb6, 0x04, 0xd9, 0x90, 0x3f, 0x50, 0xef, 0x62, 0xf7, 0x65, ++ 0x88, 0x6e, 0x07, 0xda, 0x47, 0x77, 0xb9, 0x26, 0xbe, 0x9f, 0x98, 0x02, ++ 0x4f, 0x05, 0xf3, 0x7a, 0xea, 0x96, 0xf1, 0x3c, 0xa0, 0x9f, 0x79, 0xf1, ++ 0x5e, 0xd1, 0x3a, 0xd7, 0xd5, 0x04, 0xe0, 0xb9, 0x1f, 0xf0, 0xa3, 0x8b, ++ 0x33, 0xc8, 0x1e, 0x3f, 0x01, 0x3b, 0x4d, 0x4e, 0x2b, 0xca, 0x13, 0xd5, ++ 0x28, 0xbc, 0x7d, 0xf4, 0x48, 0xb1, 0x90, 0x90, 0x9e, 0xfe, 0x52, 0x24, ++ 0x1d, 0xf4, 0xf9, 0x87, 0x39, 0xc7, 0x65, 0xe8, 0xef, 0x3f, 0x4d, 0xf1, ++ 0x91, 0xff, 0x94, 0x48, 0xfd, 0x20, 0x0a, 0xd7, 0x7f, 0x06, 0x05, 0xef, ++ 0x32, 0x35, 0xbe, 0x5d, 0xad, 0x95, 0xfd, 0x3f, 0x15, 0x0d, 0xf1, 0x8c, ++ 0x6a, 0x6b, 0xef, 0x87, 0x60, 0x9f, 0x93, 0x97, 0xed, 0xb8, 0x1f, 0x2e, ++ 0xee, 0xb3, 0x07, 0x31, 0x3e, 0xf6, 0x14, 0xbb, 0x57, 0xe3, 0xe0, 0xce, ++ 0xaf, 0x9e, 0xc1, 0x7b, 0x79, 0x7e, 0x65, 0x25, 0xdc, 0x2e, 0x14, 0x40, ++ 0x1f, 0x94, 0xf2, 0x38, 0xc5, 0xf1, 0x9d, 0x5f, 0x3d, 0xf5, 0x5f, 0x60, ++ 0x47, 0x42, 0x63, 0x3a, 0x7e, 0xe9, 0x53, 0xb4, 0x3e, 0xd8, 0xcf, 0x2d, ++ 0x09, 0x68, 0xef, 0xf7, 0xec, 0x48, 0x1c, 0x07, 0x71, 0x80, 0xd2, 0x97, ++ 0xef, 0xbb, 0x16, 0xf4, 0x45, 0x29, 0xe8, 0x3e, 0xb0, 0x33, 0x5f, 0x18, ++ 0x14, 0xaa, 0xa3, 0xfd, 0x1d, 0x1b, 0xc8, 0xca, 0xc7, 0xb6, 0x0d, 0xc3, ++ 0x73, 0x01, 0x15, 0x3b, 0x5c, 0x98, 0x4f, 0x78, 0x70, 0xe7, 0xae, 0x6a, ++ 0xd0, 0xf7, 0x67, 0x5e, 0x48, 0x20, 0xa0, 0xef, 0x4f, 0xcb, 0x5d, 0x7f, ++ 0x85, 0x72, 0x60, 0x4f, 0x22, 0x69, 0x56, 0xd1, 0xee, 0x53, 0xf5, 0xeb, ++ 0xea, 0x22, 0x22, 0xa9, 0x7a, 0x7b, 0xae, 0x02, 0xca, 0x86, 0xfc, 0x16, ++ 0x82, 0xf9, 0x2d, 0x18, 0x7f, 0xa3, 0xfc, 0x5c, 0xd1, 0x96, 0x88, 0xe7, ++ 0x3f, 0x74, 0xf5, 0xb8, 0x3c, 0x07, 0x87, 0xf0, 0x7b, 0xa2, 0x86, 0x80, ++ 0xdc, 0x51, 0xbb, 0x51, 0x35, 0xe6, 0x3d, 0xb3, 0xef, 0x0b, 0x12, 0x98, ++ 0xfe, 0x0a, 0x58, 0x7b, 0xef, 0x61, 0xf7, 0x21, 0xb0, 0xfa, 0x01, 0xa5, ++ 0xb7, 0x84, 0x95, 0x1b, 0x86, 0x30, 0xb9, 0xed, 0xc4, 0xfa, 0x8b, 0x35, ++ 0x7e, 0xe5, 0xdf, 0xfb, 0xf7, 0xcb, 0xea, 0x07, 0x12, 0x58, 0x3c, 0x20, ++ 0xda, 0x0f, 0x6b, 0x5f, 0x6d, 0x65, 0xf7, 0x6b, 0x98, 0xe9, 0xfb, 0xd3, ++ 0x04, 0x81, 0x9f, 0xc7, 0xfd, 0xcb, 0x25, 0xb1, 0xee, 0x9f, 0x88, 0x01, ++ 0x3f, 0xbb, 0x97, 0x4b, 0x20, 0x41, 0xb8, 0x7f, 0x95, 0x6c, 0xb7, 0xe3, ++ 0x7d, 0x3c, 0x95, 0x4a, 0x64, 0x0c, 0xe4, 0xab, 0xbf, 0xa8, 0xb0, 0xfd, ++ 0x8f, 0x4a, 0x77, 0x64, 0x0c, 0xe4, 0xab, 0xef, 0xe1, 0xfa, 0xaf, 0xd2, ++ 0x41, 0xcb, 0xf4, 0xfd, 0x10, 0x0e, 0x07, 0xd4, 0x87, 0x32, 0xb1, 0x75, ++ 0x3d, 0x8f, 0xf7, 0x3a, 0xed, 0xb2, 0xe3, 0x7d, 0x78, 0x55, 0x2f, 0xbb, ++ 0x7c, 0xe8, 0x27, 0xbc, 0xf8, 0xd5, 0xb1, 0x27, 0xf2, 0x20, 0x5f, 0x2d, ++ 0x01, 0xf3, 0xa4, 0xab, 0x5e, 0xfe, 0x17, 0xa4, 0x7f, 0x95, 0x35, 0x72, ++ 0x3b, 0xf0, 0x7f, 0xef, 0x76, 0x2b, 0xde, 0x4f, 0xda, 0xbd, 0xfd, 0x50, ++ 0x06, 0xd8, 0x0d, 0xdd, 0x72, 0x24, 0x23, 0xf9, 0x3c, 0xfb, 0x3a, 0x55, ++ 0x61, 0xab, 0x61, 0x9f, 0x5a, 0x9b, 0xc7, 0xc9, 0xda, 0xa5, 0x93, 0xe1, ++ 0x1c, 0xaf, 0x76, 0xce, 0xb0, 0x3c, 0x8e, 0xbe, 0x78, 0x23, 0x81, 0xe5, ++ 0x75, 0x34, 0x27, 0xf8, 0x7e, 0xc5, 0xf4, 0x9c, 0xf1, 0x7e, 0x99, 0x93, ++ 0xb5, 0xb3, 0x0d, 0xf7, 0x26, 0x96, 0xdb, 0x62, 0xeb, 0xb1, 0x16, 0xd0, ++ 0x0b, 0xba, 0x38, 0x9e, 0x18, 0x3d, 0x57, 0xd8, 0x02, 0xfd, 0x9e, 0x26, ++ 0x5d, 0xf5, 0x43, 0x28, 0x49, 0xaa, 0x84, 0x5e, 0xdc, 0x1f, 0x2f, 0xdf, ++ 0x92, 0x99, 0x0e, 0xfe, 0xee, 0x01, 0xfb, 0x25, 0xb8, 0x6f, 0x75, 0x40, ++ 0x56, 0xd1, 0x1f, 0x84, 0xa7, 0x5e, 0x1f, 0x9f, 0xa8, 0xf5, 0xe6, 0x4a, ++ 0x78, 0x9e, 0x3e, 0x2b, 0x57, 0xa2, 0x70, 0xf4, 0x34, 0x7f, 0x5a, 0x32, ++ 0x84, 0x40, 0x7e, 0xa0, 0x7d, 0x76, 0x2c, 0xfd, 0xb4, 0x37, 0x21, 0x01, ++ 0xf9, 0xa9, 0xdc, 0x66, 0x8d, 0x79, 0x7e, 0xf3, 0xb7, 0x9c, 0xdf, 0xb6, ++ 0x81, 0xbc, 0x4d, 0x60, 0xe3, 0x79, 0xb3, 0xa3, 0xe3, 0x1e, 0x90, 0x43, ++ 0x0a, 0xc0, 0x31, 0xc5, 0xa9, 0xe2, 0x7c, 0xca, 0xa9, 0x1f, 0xc0, 0xee, ++ 0x89, 0x9a, 0x93, 0xab, 0x3f, 0xb7, 0xbd, 0x48, 0x6a, 0xc0, 0x7a, 0x54, ++ 0xbe, 0x10, 0x1f, 0x8b, 0xc8, 0x7a, 0x25, 0xcf, 0xd9, 0x5f, 0xaf, 0x2c, ++ 0x5a, 0x9a, 0x97, 0x2b, 0xe5, 0xa2, 0xc2, 0xfa, 0x73, 0x1f, 0xbf, 0x89, ++ 0x51, 0x3a, 0x91, 0x60, 0x0a, 0xda, 0x49, 0x12, 0xa7, 0x21, 0x59, 0x3f, ++ 0xd8, 0x90, 0xef, 0x2f, 0xc9, 0x45, 0x36, 0xc0, 0x97, 0x42, 0x8a, 0x3c, ++ 0x92, 0x08, 0xa4, 0x6e, 0x40, 0x39, 0x75, 0x90, 0x30, 0x3e, 0x9d, 0xd4, ++ 0x0c, 0x61, 0xeb, 0x50, 0x0d, 0x81, 0xf8, 0xf8, 0x09, 0xbe, 0x3f, 0x6b, ++ 0x95, 0xd4, 0x87, 0xf1, 0xbe, 0x99, 0x0e, 0x11, 0xf5, 0xf9, 0x85, 0xf0, ++ 0xf6, 0x5e, 0x82, 0x1b, 0xe1, 0xb6, 0x4a, 0x35, 0xc4, 0x8b, 0xf6, 0xc6, ++ 0x2c, 0x0f, 0xd8, 0x63, 0x42, 0xd0, 0x4f, 0xbe, 0xa5, 0xfc, 0x50, 0x57, ++ 0x3b, 0x33, 0x97, 0x9d, 0x0b, 0x27, 0x3e, 0xc8, 0x77, 0x73, 0x13, 0x06, ++ 0x9f, 0xdb, 0xf3, 0xea, 0xd7, 0x60, 0x1f, 0x50, 0x3e, 0x63, 0xf7, 0x58, ++ 0x7d, 0x9f, 0x84, 0xea, 0xe8, 0x78, 0x70, 0xcc, 0x18, 0xe3, 0x7f, 0x05, ++ 0xec, 0x3e, 0x7b, 0xf3, 0x78, 0xdf, 0x70, 0x3a, 0x90, 0xe0, 0x7e, 0xc3, ++ 0x7d, 0xe7, 0xf0, 0xd7, 0xab, 0xdd, 0x9f, 0x07, 0xfe, 0x7a, 0xe2, 0x5f, ++ 0x27, 0xc2, 0x7e, 0x8c, 0xd3, 0x43, 0x22, 0x60, 0x2f, 0x25, 0x38, 0x49, ++ 0x24, 0x61, 0x1c, 0xdc, 0x93, 0x27, 0x9d, 0xd4, 0xcb, 0xaf, 0x9b, 0xb0, ++ 0xf2, 0x08, 0xca, 0xce, 0xa0, 0xd7, 0x3c, 0x53, 0x8c, 0xdf, 0xcd, 0x7c, ++ 0x4d, 0xbc, 0xd2, 0xe7, 0x7d, 0x7a, 0x51, 0xc4, 0xf6, 0x9f, 0x9b, 0xda, ++ 0x7f, 0x7e, 0xbe, 0xf6, 0x1a, 0x3e, 0x02, 0xb6, 0x8d, 0xde, 0xa3, 0xb9, ++ 0x51, 0xbc, 0x38, 0xf8, 0x1c, 0x82, 0x05, 0xde, 0x73, 0x5d, 0x80, 0x8f, ++ 0x71, 0x6e, 0x6f, 0x1d, 0xd0, 0x51, 0xe9, 0xfd, 0xf0, 0x3e, 0xc0, 0xc7, ++ 0x38, 0x27, 0xf3, 0x07, 0x53, 0x1a, 0x89, 0xde, 0x5f, 0xcb, 0x75, 0x32, ++ 0x7d, 0xb5, 0x82, 0xdf, 0x3f, 0x4d, 0xff, 0x8a, 0x9c, 0xba, 0xfe, 0x88, ++ 0xc7, 0x86, 0xf1, 0xd1, 0x55, 0x1c, 0xef, 0x7d, 0xf5, 0xb5, 0xb8, 0x49, ++ 0xbf, 0xfa, 0x76, 0x09, 0xf0, 0xda, 0xaf, 0xbe, 0x3d, 0x5e, 0x7d, 0x47, ++ 0xec, 0xfa, 0xae, 0x78, 0xf0, 0x24, 0xc4, 0x86, 0x27, 0x29, 0x4e, 0xff, ++ 0xc1, 0xd8, 0xf5, 0xab, 0x5f, 0x7e, 0xef, 0xcd, 0x88, 0x0a, 0x2f, 0x99, ++ 0xde, 0x80, 0xe0, 0x3c, 0x3f, 0xb7, 0x9c, 0xeb, 0x04, 0xff, 0x2a, 0xf1, ++ 0xc3, 0xd4, 0x62, 0xc6, 0x15, 0x6c, 0x3f, 0xc0, 0x44, 0x37, 0x07, 0xf0, ++ 0x1f, 0xe5, 0x07, 0xc7, 0x28, 0xdd, 0x7b, 0xf8, 0xbf, 0x6c, 0x1d, 0xfd, ++ 0x46, 0xc4, 0xa0, 0x3f, 0x89, 0x20, 0xdf, 0x15, 0x73, 0x78, 0x68, 0xd9, ++ 0x39, 0x98, 0xc2, 0xf7, 0x63, 0x0e, 0xee, 0xf4, 0x4d, 0x6c, 0xbf, 0x72, ++ 0xee, 0x5d, 0x2c, 0x4e, 0xf4, 0x63, 0x5b, 0x29, 0xfa, 0xbb, 0x47, 0xf8, ++ 0x7d, 0x40, 0x73, 0x1b, 0x99, 0x5f, 0x3d, 0x77, 0x29, 0xdb, 0x47, 0x24, ++ 0x65, 0xec, 0x9c, 0x8f, 0x87, 0xfe, 0x07, 0xe3, 0xdd, 0x06, 0x9d, 0x50, ++ 0x7a, 0xdf, 0xd6, 0x20, 0x84, 0x22, 0x99, 0x70, 0x6f, 0x8d, 0xc9, 0x7e, ++ 0xed, 0xbb, 0x1f, 0x67, 0x91, 0x02, 0xf5, 0x8b, 0x4d, 0x71, 0x17, 0x8d, ++ 0x9f, 0xb4, 0xf3, 0x48, 0xf3, 0xb9, 0x7d, 0x9d, 0xc9, 0xf9, 0x73, 0x21, ++ 0xe9, 0x75, 0x81, 0xdc, 0x9b, 0xcf, 0xbd, 0xbf, 0xc2, 0xf5, 0x9a, 0xa6, ++ 0xf7, 0x83, 0xeb, 0x48, 0x16, 0x9c, 0xdb, 0x17, 0x2d, 0x0e, 0x2f, 0xec, ++ 0x8f, 0x8a, 0xfc, 0x9c, 0x29, 0x71, 0xb3, 0xfb, 0xfc, 0x88, 0x6f, 0x18, ++ 0xbb, 0x5f, 0x4e, 0xcb, 0xe3, 0xca, 0x52, 0x13, 0x61, 0x7d, 0x23, 0x61, ++ 0xfe, 0x9e, 0xef, 0xb3, 0x2c, 0xb9, 0x4a, 0x1d, 0xa4, 0x3f, 0xa7, 0x25, ++ 0x9d, 0x73, 0xe0, 0xfd, 0x20, 0x75, 0xb2, 0x37, 0x0d, 0xf4, 0xa0, 0x7c, ++ 0x8e, 0xda, 0x75, 0xd4, 0x55, 0x53, 0xce, 0x8d, 0x20, 0xaa, 0xee, 0x1c, ++ 0x19, 0xb5, 0xe7, 0x50, 0xb8, 0x65, 0x0f, 0xbb, 0x2f, 0x51, 0xf2, 0x14, ++ 0x91, 0x52, 0xb0, 0x03, 0xf9, 0xfd, 0x00, 0x24, 0xe5, 0xea, 0x3e, 0xbb, ++ 0xeb, 0x2d, 0x8a, 0x87, 0x25, 0xeb, 0x54, 0x3c, 0xb7, 0xba, 0xd0, 0xc9, ++ 0xec, 0xcc, 0x5f, 0xb8, 0x8a, 0xee, 0x74, 0x4e, 0x00, 0xfb, 0x72, 0xa2, ++ 0x97, 0xdd, 0x73, 0x6b, 0xa4, 0x63, 0x70, 0x27, 0x9b, 0x5f, 0x1d, 0xcc, ++ 0x2f, 0xb3, 0x3f, 0xdc, 0x75, 0x8a, 0xd7, 0x8b, 0x76, 0xe7, 0xd5, 0xd4, ++ 0x62, 0xc0, 0x38, 0x8e, 0x17, 0x7f, 0xdf, 0x41, 0xb4, 0xaa, 0xef, 0xa9, ++ 0x20, 0x8f, 0xff, 0x26, 0xb3, 0xdf, 0x2b, 0xe8, 0x87, 0x07, 0x46, 0xbf, ++ 0xb3, 0x29, 0xc9, 0x78, 0x2f, 0xfb, 0x02, 0xf7, 0xea, 0x0f, 0x81, 0x4f, ++ 0xd7, 0xf0, 0xfb, 0x08, 0x57, 0xd6, 0x66, 0xe1, 0x73, 0x75, 0x6d, 0x1a, ++ 0xda, 0x9d, 0xf5, 0xb5, 0x5e, 0x7c, 0x6a, 0x78, 0xb1, 0x79, 0x1b, 0xf0, ++ 0xde, 0x37, 0xdb, 0x28, 0xd6, 0x9f, 0xcd, 0xe3, 0x67, 0x76, 0x05, 0xb5, ++ 0x65, 0x20, 0x9f, 0x42, 0xf2, 0xd4, 0x44, 0xa0, 0x6c, 0x4b, 0xaf, 0x21, ++ 0x60, 0xef, 0xda, 0xfb, 0xf0, 0xd3, 0x80, 0xf8, 0x51, 0xfa, 0xca, 0x7e, ++ 0x2c, 0x5b, 0x3d, 0xec, 0x77, 0x23, 0xe4, 0xc6, 0x59, 0x88, 0x67, 0xda, ++ 0x9e, 0x94, 0xd2, 0xef, 0x4b, 0x5c, 0xfe, 0xc7, 0x41, 0x4e, 0xec, 0xea, ++ 0x65, 0x86, 0x7b, 0xe4, 0xac, 0x69, 0xe3, 0x4d, 0xf7, 0x0d, 0x9a, 0xf0, ++ 0xa6, 0xf1, 0xc7, 0x36, 0x86, 0xbf, 0xb5, 0x02, 0xe3, 0x0f, 0x33, 0xfe, ++ 0xd6, 0xca, 0x9d, 0x2a, 0xec, 0x2b, 0xaf, 0xbd, 0xaa, 0xef, 0xde, 0x19, ++ 0xc4, 0x1f, 0x35, 0xef, 0x19, 0xfe, 0x7e, 0xcb, 0xf6, 0xd9, 0xe2, 0xe2, ++ 0xcf, 0x93, 0x8c, 0xf6, 0xeb, 0x82, 0xfc, 0xfa, 0xdb, 0xeb, 0xe8, 0xab, ++ 0x07, 0xf9, 0xfe, 0xe2, 0x03, 0xb5, 0x13, 0x11, 0x5f, 0xab, 0xf8, 0x3d, ++ 0x92, 0xf7, 0xd7, 0xfa, 0xf0, 0x29, 0x02, 0xfe, 0xe8, 0xfc, 0xac, 0xd9, ++ 0x41, 0x02, 0xf7, 0xa3, 0xb3, 0xdf, 0x86, 0xa0, 0x4f, 0x67, 0x91, 0x0f, ++ 0xee, 0x9f, 0x05, 0xde, 0x05, 0xfc, 0x89, 0x4e, 0x86, 0x4f, 0x6b, 0x5a, ++ 0x0d, 0xee, 0xaf, 0xd9, 0x9c, 0x0c, 0x5f, 0xa2, 0x33, 0x88, 0x78, 0x91, ++ 0x9d, 0x0c, 0x5f, 0xa2, 0x93, 0xf1, 0x9b, 0xc2, 0xcb, 0x12, 0xe0, 0x2f, ++ 0x17, 0xdb, 0xe3, 0x7b, 0x8a, 0xbf, 0x03, 0xc0, 0x5f, 0xb6, 0xf4, 0xc9, ++ 0x06, 0x7c, 0x29, 0x29, 0x05, 0x17, 0x87, 0xbf, 0xc7, 0x28, 0xfe, 0x28, ++ 0x1c, 0x29, 0x5c, 0xbe, 0xcc, 0x78, 0x48, 0x51, 0xd8, 0xfd, 0x94, 0x9a, ++ 0x5c, 0xc5, 0xb3, 0xe3, 0x1e, 0xa5, 0xf3, 0x87, 0x75, 0x7b, 0x43, 0x2d, ++ 0xc1, 0xe7, 0xc0, 0x38, 0xfe, 0xe2, 0x08, 0x17, 0x5b, 0x37, 0x53, 0x2c, ++ 0x35, 0xfb, 0x65, 0xc0, 0x47, 0x32, 0xe1, 0xeb, 0x49, 0x90, 0xa4, 0xe7, ++ 0x13, 0x96, 0x7a, 0x08, 0x7f, 0x69, 0x41, 0xa2, 0x42, 0x59, 0x60, 0x70, ++ 0x90, 0x86, 0x61, 0x86, 0x7b, 0x25, 0x45, 0x8f, 0x64, 0xba, 0x97, 0x4d, ++ 0xdd, 0x00, 0x7c, 0xb0, 0xfe, 0x90, 0x6c, 0x81, 0xfb, 0xe8, 0xc4, 0xa5, ++ 0x57, 0x1b, 0xce, 0x83, 0x8a, 0xb3, 0x7d, 0x49, 0x2a, 0xe2, 0xd3, 0x8f, ++ 0xf7, 0x34, 0x3f, 0x58, 0xab, 0x22, 0xfd, 0xd6, 0x01, 0x1d, 0xe1, 0x1e, ++ 0x50, 0xee, 0x7f, 0xdd, 0xcf, 0xe9, 0xf9, 0x00, 0xbf, 0x87, 0x72, 0x15, ++ 0x97, 0x8f, 0xb5, 0x5c, 0x5e, 0x1e, 0xe6, 0x72, 0x52, 0xc7, 0xef, 0x4d, ++ 0x5e, 0x33, 0x93, 0xe5, 0x59, 0xa5, 0xe4, 0x58, 0xf8, 0x7d, 0x65, 0x11, ++ 0xa2, 0xcf, 0x63, 0x4a, 0xf2, 0x86, 0x89, 0x42, 0xe1, 0x42, 0x9b, 0x5a, ++ 0xc5, 0x27, 0xde, 0xb3, 0x48, 0xde, 0xb7, 0x86, 0x46, 0xd3, 0x76, 0x09, ++ 0xd9, 0xc4, 0x07, 0x7c, 0x92, 0xf4, 0xfe, 0xbd, 0x21, 0x76, 0x5f, 0x63, ++ 0xd1, 0x60, 0xb0, 0x83, 0x92, 0xb4, 0xfb, 0x17, 0xa7, 0xa8, 0x49, 0x73, ++ 0xf0, 0x20, 0x6c, 0x44, 0x62, 0x7e, 0x07, 0x55, 0x85, 0xe8, 0xc7, 0x74, ++ 0x5a, 0x62, 0xdd, 0x53, 0x55, 0xe7, 0x3d, 0x60, 0x83, 0x78, 0x68, 0x3c, ++ 0x78, 0x12, 0xbc, 0xbe, 0xcc, 0xfb, 0xe9, 0x78, 0x09, 0x8d, 0x2e, 0xb4, ++ 0xdf, 0x07, 0xf8, 0x8b, 0xe6, 0x2c, 0xa4, 0x65, 0x67, 0x63, 0x02, 0xc6, ++ 0xff, 0x12, 0xf8, 0xef, 0xb3, 0x38, 0x29, 0xdc, 0xa5, 0x3a, 0x7a, 0xc7, ++ 0xbb, 0x87, 0x7a, 0xa3, 0xeb, 0xaa, 0x44, 0x17, 0xa5, 0xa7, 0x07, 0x60, ++ 0xa4, 0xcf, 0x47, 0x1a, 0x47, 0xe2, 0xef, 0xb2, 0x3c, 0x2a, 0x17, 0xe1, ++ 0xef, 0xb8, 0x3c, 0xca, 0xd7, 0x53, 0xed, 0x9e, 0x73, 0xad, 0xdd, 0x9f, ++ 0xb9, 0x7e, 0x74, 0xe7, 0x5d, 0x66, 0xf0, 0x5b, 0xd7, 0xcb, 0x3e, 0x6c, ++ 0xe7, 0x99, 0x62, 0x94, 0xff, 0xf5, 0x5c, 0xdf, 0x26, 0x4f, 0x37, 0xf2, ++ 0xb9, 0xa6, 0x6f, 0x8f, 0xf6, 0xe9, 0x5b, 0xff, 0x08, 0x80, 0x27, 0xf5, ++ 0xdc, 0x74, 0xd4, 0x63, 0x29, 0x37, 0xc4, 0xd6, 0xbb, 0x75, 0xb2, 0x82, ++ 0xf7, 0x96, 0xd7, 0x8d, 0x65, 0x72, 0x1e, 0x2c, 0x56, 0xd8, 0xfd, 0xa5, ++ 0xfd, 0xf5, 0x00, 0xc6, 0xa9, 0xcf, 0xfa, 0xc7, 0x6c, 0x04, 0x3d, 0xaa, ++ 0xf1, 0xd5, 0x72, 0xc2, 0xf4, 0x4e, 0x90, 0x38, 0xbc, 0xb8, 0x0e, 0xf1, ++ 0xfb, 0x6d, 0x34, 0x3b, 0x78, 0x25, 0xdc, 0x03, 0xc8, 0xf5, 0x2b, 0x3c, ++ 0xc5, 0x51, 0xec, 0xf7, 0x07, 0x52, 0xe7, 0xb2, 0xfb, 0x7c, 0xd7, 0xf0, ++ 0x7b, 0xac, 0x1e, 0xa2, 0x7c, 0x45, 0xf0, 0xde, 0x53, 0x2f, 0x3e, 0xaf, ++ 0x76, 0xb1, 0xfd, 0x89, 0xe5, 0xb6, 0xf1, 0x78, 0x9f, 0x5a, 0x9d, 0xd3, ++ 0x82, 0x7a, 0x42, 0xfa, 0xc0, 0x1a, 0x02, 0x93, 0x43, 0xda, 0x3f, 0xc9, ++ 0x03, 0xf1, 0x02, 0x49, 0xf6, 0x76, 0xfa, 0x20, 0xde, 0xe7, 0x92, 0xc2, ++ 0x70, 0x6f, 0x6e, 0x9d, 0x33, 0x0f, 0xef, 0x7d, 0x17, 0x92, 0xf2, 0x3c, ++ 0x40, 0xff, 0x2f, 0x5d, 0x0b, 0x86, 0x9f, 0x2f, 0x9f, 0x8e, 0x4e, 0x14, ++ 0xef, 0xcb, 0xf4, 0xa4, 0x14, 0x91, 0x8f, 0xb2, 0x71, 0x37, 0x00, 0xcf, ++ 0x23, 0xcb, 0x9e, 0x1b, 0x08, 0xc4, 0x0d, 0x37, 0xa4, 0xd4, 0xd8, 0x01, ++ 0x6f, 0x93, 0x5c, 0x2c, 0xae, 0xdf, 0x58, 0x9c, 0x8f, 0x78, 0xa4, 0xf8, ++ 0xbd, 0xce, 0x35, 0x30, 0xda, 0xcf, 0xa0, 0xd9, 0x57, 0xf7, 0xdd, 0x83, ++ 0x05, 0xdd, 0x6e, 0x88, 0x73, 0xae, 0xf9, 0x56, 0x17, 0xb3, 0x97, 0x48, ++ 0x7a, 0x90, 0x8c, 0xd2, 0xc9, 0x79, 0xa3, 0xf6, 0x3b, 0x27, 0x6a, 0x90, ++ 0x64, 0xe9, 0xe4, 0x7d, 0xf9, 0xe8, 0x42, 0x02, 0xfb, 0x43, 0xfd, 0xe5, ++ 0x3c, 0x8e, 0x1e, 0xdb, 0xcc, 0xf4, 0xd8, 0x0a, 0x21, 0xb6, 0x1e, 0xd3, ++ 0xec, 0x4c, 0x4d, 0x8f, 0xc9, 0x26, 0xfd, 0xa0, 0x3d, 0xeb, 0x87, 0xcf, ++ 0x34, 0x9c, 0xd3, 0x52, 0x52, 0xbc, 0xc0, 0xbb, 0xf0, 0x0c, 0x5a, 0xbc, ++ 0x60, 0xdf, 0xbd, 0x58, 0x7f, 0x6b, 0x12, 0xe2, 0xa1, 0x06, 0xf0, 0x40, ++ 0xd2, 0xae, 0xee, 0xf3, 0x5f, 0x7f, 0x30, 0x02, 0xec, 0xc7, 0xfc, 0x98, ++ 0xfc, 0x66, 0xd6, 0x5f, 0x0b, 0xfa, 0xd6, 0x73, 0x5f, 0x2a, 0xd0, 0xe9, ++ 0x84, 0xac, 0x0e, 0x9a, 0x03, 0xfc, 0x74, 0x28, 0xf6, 0x7a, 0x3e, 0xf5, ++ 0x91, 0x4b, 0x1f, 0x06, 0x3e, 0x58, 0xf0, 0x5b, 0x51, 0xd0, 0xef, 0xa7, ++ 0x94, 0x9e, 0x5b, 0x89, 0xeb, 0x69, 0xc9, 0xb9, 0x89, 0xf8, 0x2c, 0x6b, ++ 0x9c, 0x89, 0x7c, 0x4f, 0x20, 0x0a, 0xae, 0xf3, 0xc3, 0x8e, 0x37, 0xdd, ++ 0xed, 0x06, 0xb8, 0x8e, 0x37, 0xf2, 0x3c, 0x80, 0x26, 0x39, 0x04, 0xf9, ++ 0x19, 0xc7, 0x1b, 0xef, 0xc6, 0xfb, 0x4a, 0x20, 0xcf, 0x5b, 0xd4, 0xed, ++ 0xef, 0x93, 0x3c, 0x15, 0xed, 0x4b, 0xed, 0x9e, 0xb1, 0xe3, 0xa1, 0x3b, ++ 0xdd, 0xfa, 0xfd, 0xdd, 0x92, 0x5f, 0xd8, 0x7d, 0x60, 0xb7, 0xc6, 0xe3, ++ 0xaf, 0x92, 0xa6, 0xd8, 0x7e, 0x3d, 0xac, 0xa1, 0x10, 0x3f, 0xa5, 0x00, ++ 0x66, 0x81, 0x3d, 0x4c, 0xed, 0x9b, 0xde, 0x08, 0xd8, 0x3f, 0x1b, 0xad, ++ 0xde, 0x20, 0x89, 0x96, 0x83, 0x8f, 0xd8, 0x63, 0xe6, 0x27, 0x2e, 0x71, ++ 0xcd, 0x78, 0x14, 0xf0, 0xbe, 0xc4, 0xe5, 0x7b, 0x12, 0xe4, 0x9c, 0x38, ++ 0xd9, 0xbd, 0xa0, 0xf1, 0xf9, 0x9c, 0x8d, 0x7b, 0x0c, 0x36, 0x81, 0x61, ++ 0xbf, 0xe9, 0x71, 0x9e, 0xa7, 0x29, 0xf9, 0xdd, 0xfa, 0xfb, 0xdd, 0xfa, ++ 0xee, 0xe3, 0xe4, 0x71, 0x12, 0x62, 0x8b, 0xf3, 0xdd, 0xa1, 0xfd, 0xbe, ++ 0x41, 0x9c, 0xef, 0x6e, 0x96, 0xcf, 0x41, 0x3c, 0xb1, 0xbf, 0x6b, 0x7e, ++ 0x42, 0x42, 0xd4, 0x4f, 0x68, 0x83, 0x79, 0x54, 0x35, 0x9e, 0xaa, 0xff, ++ 0x00, 0xf1, 0xc4, 0xfd, 0x04, 0x0e, 0xf7, 0x09, 0x99, 0xc1, 0x7d, 0xe2, ++ 0x19, 0x2b, 0xfb, 0x9d, 0x1b, 0x13, 0x5f, 0x9c, 0xe0, 0xf9, 0x23, 0x8b, ++ 0x04, 0x86, 0x57, 0x8d, 0xbf, 0x4f, 0xf4, 0xd9, 0x3b, 0x7e, 0xbc, 0x87, ++ 0xc6, 0xcc, 0x7f, 0xc2, 0xc6, 0x4b, 0x37, 0x4c, 0xa2, 0xfd, 0x7e, 0xd6, ++ 0x21, 0x63, 0x1c, 0xae, 0x92, 0xf2, 0x0f, 0xf0, 0x8d, 0xb0, 0x71, 0x12, ++ 0xe6, 0xaf, 0x0b, 0x8f, 0x4c, 0x7a, 0x18, 0xf2, 0x92, 0x3e, 0x7f, 0x5d, ++ 0xc4, 0xef, 0xe5, 0xe7, 0x6c, 0xf8, 0xbd, 0xfb, 0x67, 0xde, 0x0d, 0x73, ++ 0x21, 0xce, 0xf3, 0x86, 0x8c, 0xf7, 0x75, 0x7f, 0xde, 0x31, 0x23, 0x91, ++ 0xc5, 0x79, 0x8c, 0x71, 0xe8, 0x85, 0x6e, 0xb6, 0xce, 0x9f, 0xe4, 0x72, ++ 0x5f, 0x72, 0x6e, 0x35, 0xf2, 0x67, 0x1f, 0x7f, 0x34, 0x2c, 0x54, 0x40, ++ 0xae, 0x4a, 0xce, 0x3d, 0x84, 0xf6, 0x4c, 0xc9, 0x16, 0x01, 0xef, 0x89, ++ 0x24, 0xc1, 0xde, 0x57, 0xa7, 0x4a, 0x9c, 0x0f, 0x27, 0x43, 0xfb, 0xd3, ++ 0x85, 0xcb, 0x01, 0xdf, 0x53, 0x1a, 0x70, 0x7f, 0xa3, 0x74, 0xb3, 0xd5, ++ 0xbb, 0x5a, 0xe8, 0x4f, 0xe7, 0x93, 0x2e, 0xd5, 0x70, 0xaf, 0x7a, 0x69, ++ 0xd7, 0x1a, 0xec, 0x97, 0x50, 0x7b, 0x2a, 0x45, 0xb7, 0xdf, 0x7d, 0x82, ++ 0xe7, 0x01, 0x97, 0x9e, 0x63, 0xf7, 0x03, 0x12, 0x4f, 0x90, 0xa4, 0x01, ++ 0xdf, 0x73, 0xbd, 0x13, 0xe5, 0x5f, 0xe3, 0xbd, 0xaf, 0xdd, 0xf6, 0xd8, ++ 0x71, 0xf6, 0x3f, 0x73, 0x7b, 0xa6, 0xe4, 0xdc, 0x64, 0x83, 0xdf, 0x10, ++ 0x9d, 0xdf, 0xf7, 0x99, 0x7c, 0xf2, 0xf5, 0xbc, 0xb4, 0x6b, 0x22, 0x83, ++ 0xab, 0x6f, 0x3e, 0x1b, 0x26, 0xc5, 0x9a, 0x4f, 0x74, 0x1e, 0x53, 0xb0, ++ 0x7d, 0x77, 0x52, 0xec, 0xf1, 0x33, 0x39, 0x9e, 0x8f, 0xd5, 0x96, 0xc1, ++ 0xc9, 0x0d, 0x52, 0xa6, 0xb0, 0x7a, 0x25, 0x0d, 0x77, 0x2b, 0xa0, 0x4f, ++ 0x4a, 0x9a, 0x92, 0x92, 0x05, 0xdd, 0xbc, 0x4a, 0x1b, 0x2b, 0x0c, 0x79, ++ 0x18, 0xa5, 0x4d, 0xc5, 0xca, 0x3c, 0x5d, 0xbf, 0x51, 0x3a, 0x38, 0x5e, ++ 0x9b, 0x3a, 0x2a, 0x4a, 0x87, 0xcc, 0x87, 0xe4, 0x2b, 0x97, 0x3b, 0x61, ++ 0xbd, 0x2f, 0x72, 0xb9, 0x61, 0xbc, 0x8d, 0x8b, 0xf2, 0x7f, 0xa2, 0x42, ++ 0x7f, 0x4c, 0xff, 0x7c, 0x22, 0x37, 0x64, 0xd4, 0xa0, 0x7e, 0xb9, 0xd3, ++ 0x1d, 0xeb, 0x5c, 0x43, 0xa6, 0x5b, 0x35, 0xc4, 0x95, 0x4a, 0x1b, 0x39, ++ 0x7d, 0xa8, 0x9d, 0x9c, 0xa7, 0xa3, 0x8f, 0x46, 0x17, 0x73, 0xfb, 0x63, ++ 0xcd, 0xa5, 0xf9, 0x3f, 0x81, 0x78, 0xf2, 0x63, 0xec, 0x56, 0x90, 0xf8, ++ 0x7a, 0xc7, 0x44, 0xb7, 0xcc, 0xd8, 0x78, 0x9b, 0xdc, 0x87, 0xb7, 0x2c, ++ 0xcc, 0x07, 0xba, 0x30, 0xde, 0xbe, 0x63, 0xc8, 0xfb, 0xe9, 0x87, 0x37, ++ 0x4e, 0x5f, 0x0d, 0x2f, 0xda, 0x7b, 0x6a, 0x1f, 0xe5, 0x02, 0xbe, 0x26, ++ 0x43, 0xc0, 0x69, 0x20, 0xf4, 0xc3, 0xe8, 0x7f, 0x21, 0x7c, 0x45, 0xc7, ++ 0xe5, 0xf4, 0x9f, 0x1a, 0x7b, 0x1e, 0xfe, 0xbe, 0x79, 0x2c, 0x25, 0x41, ++ 0x6a, 0x3f, 0x2c, 0xb8, 0xe0, 0x3c, 0xee, 0x23, 0x41, 0xdb, 0x79, 0xe6, ++ 0xa1, 0xd1, 0x9f, 0x5c, 0x66, 0xa0, 0xbf, 0xff, 0xa1, 0xd1, 0x57, 0x82, ++ 0x1c, 0x6a, 0xf4, 0x5e, 0x70, 0xe0, 0x31, 0xe4, 0xdf, 0x05, 0x54, 0x1e, ++ 0x61, 0x5f, 0xfe, 0x78, 0xc3, 0xdd, 0x86, 0xf5, 0x21, 0x0a, 0x5f, 0x1c, ++ 0xba, 0x8f, 0x0a, 0x92, 0xec, 0xfc, 0xff, 0x73, 0x74, 0xff, 0x44, 0x0e, ++ 0x66, 0x40, 0xde, 0x57, 0x70, 0x1d, 0x5b, 0x47, 0x4e, 0x6c, 0x7c, 0x30, ++ 0x43, 0x8f, 0xe7, 0x25, 0xae, 0xa9, 0x0b, 0x81, 0x2e, 0x64, 0xd3, 0xc0, ++ 0x8b, 0x5a, 0x3f, 0x82, 0x05, 0xde, 0x0e, 0x15, 0xd7, 0x25, 0x19, 0xe3, ++ 0x61, 0xbb, 0x5d, 0xfe, 0x80, 0x9b, 0xbe, 0x2f, 0xe3, 0x7e, 0xf5, 0x8a, ++ 0xa4, 0xc2, 0x31, 0xb1, 0xd6, 0x7d, 0xea, 0x17, 0x4e, 0x81, 0xf8, 0x73, ++ 0x5d, 0xed, 0xcc, 0x29, 0x10, 0x6f, 0x93, 0xb9, 0xdd, 0x08, 0xbf, 0xac, ++ 0x05, 0xf6, 0x26, 0x5c, 0x81, 0x1e, 0xeb, 0x7e, 0xad, 0x06, 0x4e, 0xd7, ++ 0xfb, 0x6b, 0x6b, 0x30, 0x7e, 0x4d, 0x6c, 0x41, 0xe2, 0xd1, 0x9f, 0xf7, ++ 0x25, 0xcc, 0x2e, 0xfa, 0x33, 0x61, 0xf1, 0x16, 0xad, 0x9d, 0x22, 0xfb, ++ 0x3d, 0x10, 0xff, 0x54, 0xf8, 0x79, 0x64, 0x59, 0xf2, 0xaf, 0xcc, 0xcc, ++ 0x83, 0x38, 0x46, 0x4a, 0x4e, 0x50, 0x87, 0xbf, 0x87, 0xdc, 0xcc, 0xae, ++ 0x5b, 0x93, 0x76, 0xc0, 0x03, 0xf9, 0xa4, 0x56, 0xda, 0x3f, 0xc4, 0x63, ++ 0x6c, 0xe9, 0xd2, 0x59, 0xe3, 0x3e, 0x25, 0x2b, 0xe7, 0x08, 0x93, 0x64, ++ 0x98, 0x8f, 0x9c, 0x12, 0x26, 0x18, 0xcf, 0xcc, 0xa6, 0xef, 0x75, 0xf8, ++ 0x56, 0x52, 0x28, 0x9c, 0xe7, 0xf1, 0x37, 0x25, 0x9b, 0x1b, 0xf7, 0x8b, ++ 0x24, 0xc2, 0xec, 0x34, 0x6d, 0xfe, 0xf4, 0x0d, 0xae, 0x67, 0x0f, 0xf0, ++ 0x75, 0x69, 0x39, 0xc4, 0x71, 0x53, 0xc0, 0x0e, 0xb3, 0xa0, 0x3f, 0xb4, ++ 0x9e, 0xc7, 0x29, 0x7f, 0x59, 0x5b, 0xc4, 0xf1, 0x20, 0xe1, 0x3a, 0x66, ++ 0x4d, 0x62, 0xf5, 0x95, 0x44, 0x06, 0xb7, 0x1d, 0xe2, 0xd6, 0x22, 0xac, ++ 0xab, 0x11, 0x2c, 0xbb, 0xe0, 0x86, 0x1d, 0x11, 0xaf, 0x26, 0xc3, 0xdf, ++ 0x1f, 0x4d, 0x22, 0x2a, 0xfe, 0x4e, 0xdf, 0x00, 0x12, 0xa9, 0xc7, 0x7b, ++ 0x4c, 0xa6, 0x76, 0xdd, 0x03, 0xef, 0x7d, 0x09, 0xfe, 0x2d, 0xc0, 0x07, ++ 0x5f, 0x0e, 0xee, 0xfc, 0x50, 0x80, 0x38, 0x74, 0x91, 0xff, 0x12, 0x58, ++ 0x7f, 0x1b, 0xc5, 0x60, 0x8e, 0x4a, 0xeb, 0xff, 0x4a, 0xec, 0xcd, 0x81, ++ 0x7a, 0xf0, 0xfb, 0x5e, 0xef, 0x27, 0xb3, 0xe7, 0x70, 0xc8, 0x5b, 0xf6, ++ 0xeb, 0xf6, 0xa5, 0xd8, 0xbd, 0x9c, 0xaa, 0x3e, 0xae, 0x67, 0x2e, 0x0f, ++ 0x5f, 0x2a, 0x99, 0xf6, 0x6b, 0xbe, 0xb9, 0x44, 0xff, 0xbd, 0x39, 0xc1, ++ 0xb7, 0x0b, 0xe0, 0x48, 0xf9, 0x58, 0xc0, 0x7d, 0x98, 0x3a, 0x3b, 0xbb, ++ 0xd7, 0xa7, 0xce, 0x75, 0x73, 0x22, 0xac, 0xdf, 0x87, 0x39, 0xbd, 0x90, ++ 0xfe, 0xc0, 0x3f, 0x1d, 0xcc, 0x8e, 0x39, 0x2b, 0xa9, 0x89, 0xc9, 0x18, ++ 0xdf, 0xcc, 0xca, 0x7d, 0xc5, 0x30, 0xbe, 0xd7, 0x50, 0x96, 0xb8, 0xff, ++ 0xb6, 0x89, 0xf2, 0xa3, 0xa4, 0xbb, 0x97, 0x75, 0x94, 0xe4, 0xb3, 0x00, ++ 0xbf, 0x8c, 0x6e, 0xa0, 0xef, 0xf5, 0xf4, 0x8b, 0x11, 0x57, 0x4b, 0x76, ++ 0xe2, 0xf5, 0xb7, 0x31, 0xf7, 0x61, 0x34, 0xf8, 0xe8, 0xb8, 0x04, 0xf0, ++ 0x27, 0x9e, 0x2b, 0x64, 0xeb, 0xab, 0x89, 0x0f, 0xf6, 0x08, 0x0c, 0xfe, ++ 0xa0, 0x8b, 0xfb, 0x5b, 0x24, 0x28, 0x02, 0x3d, 0xe7, 0x68, 0xf7, 0x05, ++ 0x4b, 0x2b, 0x58, 0x59, 0xfb, 0xbd, 0x08, 0xa0, 0x22, 0x85, 0xe3, 0x03, ++ 0x6d, 0x7f, 0x81, 0xac, 0x60, 0x65, 0xbe, 0x4f, 0x19, 0x98, 0xc7, 0xf6, ++ 0x21, 0xcd, 0xf0, 0xcc, 0x69, 0x7f, 0xa0, 0x13, 0xe2, 0xfa, 0x73, 0xda, ++ 0x07, 0xcf, 0x87, 0xfd, 0xa9, 0x39, 0xce, 0x31, 0x7f, 0x82, 0xe7, 0x1e, ++ 0xb9, 0xf7, 0x40, 0x02, 0xd8, 0x81, 0x77, 0x0b, 0x78, 0xfe, 0xe3, 0xc7, ++ 0xbf, 0x7b, 0x45, 0x4e, 0xa0, 0xcf, 0x9d, 0xef, 0x6c, 0xc4, 0xf3, 0xc6, ++ 0xa7, 0xb9, 0xdc, 0xdd, 0x4e, 0x7a, 0xf1, 0x1e, 0x76, 0x3f, 0xf1, 0xf0, ++ 0x7d, 0xf2, 0x10, 0xbe, 0x9f, 0x07, 0x3f, 0x30, 0x87, 0xe5, 0xb0, 0x0c, ++ 0x7e, 0xfa, 0xdc, 0x48, 0xe8, 0x47, 0xd7, 0xd0, 0xd2, 0x6d, 0xaf, 0x84, ++ 0xae, 0x01, 0xb3, 0xed, 0xf6, 0x8e, 0xde, 0xdf, 0x80, 0x1a, 0xf0, 0x87, ++ 0x3d, 0x85, 0xb8, 0x07, 0xa0, 0xb5, 0x6b, 0xf3, 0xbe, 0xca, 0xca, 0xac, ++ 0x5d, 0x14, 0x0f, 0x36, 0x6e, 0x8f, 0xda, 0x70, 0x5e, 0xd1, 0x79, 0xdb, ++ 0x10, 0x0f, 0x1f, 0xf4, 0xe5, 0x8d, 0x07, 0x91, 0x1e, 0x7d, 0x78, 0xe2, ++ 0xf7, 0x2a, 0x69, 0x78, 0xe9, 0x9b, 0x77, 0xe2, 0xcd, 0x57, 0x43, 0x9c, ++ 0x37, 0x9e, 0x3e, 0x9b, 0xe3, 0xcc, 0xfa, 0x13, 0xdb, 0xfc, 0x60, 0x70, ++ 0x99, 0xf1, 0xf4, 0x39, 0x7c, 0xa2, 0x76, 0xe4, 0xe7, 0x6e, 0x9f, 0x3d, ++ 0x91, 0xea, 0xb7, 0x8f, 0xdd, 0x3e, 0x07, 0x3c, 0x2b, 0x6d, 0xbd, 0x19, ++ 0xd2, 0x08, 0x94, 0x17, 0x37, 0x94, 0xab, 0x45, 0xff, 0xf0, 0x54, 0x8a, ++ 0x87, 0xd3, 0xc3, 0xfc, 0x97, 0x0c, 0x04, 0x7c, 0x74, 0x0e, 0xb8, 0x28, ++ 0x3d, 0xfa, 0xa1, 0x9d, 0xe9, 0x01, 0x92, 0x97, 0x81, 0xf3, 0xd1, 0xee, ++ 0x7d, 0x3f, 0x78, 0xef, 0x71, 0x17, 0xd8, 0x9d, 0xf5, 0x3b, 0xdf, 0xcb, ++ 0x80, 0x67, 0x95, 0xd8, 0xb5, 0xf6, 0x16, 0x8c, 0x6f, 0x8a, 0xe8, 0x0f, ++ 0x9d, 0x6d, 0xbd, 0xe4, 0xbc, 0xe7, 0xc3, 0x3e, 0x84, 0xb8, 0x13, 0x5d, ++ 0xff, 0x46, 0x27, 0x6a, 0x7c, 0xc8, 0xe6, 0x77, 0x07, 0x3f, 0x5f, 0x73, ++ 0x47, 0x6b, 0x02, 0x9e, 0xaf, 0xb9, 0x63, 0xa9, 0x68, 0xb8, 0xb7, 0xf9, ++ 0x8e, 0xa5, 0x2c, 0xef, 0x8e, 0x48, 0x9d, 0xe3, 0x6e, 0x32, 0xd8, 0xeb, ++ 0x2b, 0xe2, 0xf6, 0x03, 0x71, 0x00, 0x73, 0x3f, 0xf3, 0x97, 0x16, 0x90, ++ 0x8f, 0x07, 0xc0, 0x3e, 0xab, 0x67, 0x2a, 0xc6, 0x05, 0x9e, 0x62, 0xfc, ++ 0x35, 0x7f, 0xba, 0x4f, 0x84, 0x7c, 0xe4, 0xc9, 0x2b, 0x05, 0x8c, 0xb7, ++ 0x4c, 0x3a, 0xaa, 0xb6, 0x75, 0xd1, 0xf2, 0xfc, 0x50, 0x12, 0xfe, 0xde, ++ 0xd1, 0xfc, 0x7b, 0x97, 0xe4, 0xc2, 0x3d, 0x04, 0xd5, 0x9d, 0x2c, 0xbe, ++ 0x37, 0x48, 0x5c, 0x9c, 0xf3, 0x33, 0x88, 0x9f, 0x1c, 0x60, 0xeb, 0x38, ++ 0x94, 0x17, 0x83, 0x7c, 0x3b, 0x7d, 0xaa, 0x53, 0x17, 0xef, 0xef, 0x96, ++ 0x6b, 0x72, 0xe0, 0xde, 0xbd, 0xe0, 0x6d, 0x4e, 0x1f, 0xf0, 0x4f, 0xf1, ++ 0x4d, 0xbe, 0x0f, 0xf0, 0xf7, 0x12, 0x79, 0x1c, 0x42, 0x5b, 0x57, 0x77, ++ 0x35, 0x16, 0x63, 0x1e, 0x6b, 0xf1, 0x5c, 0x75, 0x22, 0xd0, 0xbd, 0x38, ++ 0x6c, 0xc7, 0xdf, 0x1f, 0x2c, 0xb6, 0x11, 0xc9, 0x41, 0xf5, 0x58, 0xb1, ++ 0x44, 0x6c, 0xf0, 0x1c, 0xa4, 0x10, 0xc9, 0x0e, 0x4f, 0x07, 0xb1, 0xc1, ++ 0x33, 0x7f, 0x39, 0xbb, 0x27, 0xbb, 0xa4, 0xf1, 0x7a, 0xb4, 0x0f, 0xdc, ++ 0x13, 0x8b, 0x14, 0xb8, 0xff, 0xb6, 0xb8, 0xfd, 0xd9, 0x2f, 0xa0, 0x7d, ++ 0xa9, 0x14, 0xd9, 0xcf, 0xce, 0xb5, 0x30, 0xfc, 0x14, 0xb7, 0x1f, 0xfa, ++ 0x1a, 0xf8, 0x67, 0xa1, 0xaf, 0x08, 0xf3, 0x0e, 0xbf, 0xb3, 0x45, 0x31, ++ 0xf8, 0x7f, 0x63, 0xc3, 0xc6, 0xf2, 0xe5, 0x6d, 0xc6, 0x72, 0x4e, 0xc4, ++ 0x58, 0xce, 0xed, 0x30, 0x96, 0xb7, 0xc2, 0x1d, 0x67, 0x3a, 0x3b, 0xe2, ++ 0xc0, 0x5e, 0x2b, 0xae, 0x13, 0x15, 0xa7, 0xd8, 0x39, 0xbd, 0x97, 0x04, ++ 0x58, 0x9b, 0x20, 0x1e, 0x6c, 0x45, 0x79, 0x9a, 0x56, 0xd1, 0x9e, 0x0f, ++ 0xfb, 0xd1, 0xa7, 0x9e, 0x77, 0x59, 0xe0, 0xfb, 0x9e, 0xbf, 0x30, 0xbf, ++ 0xb7, 0x77, 0xab, 0x1d, 0xef, 0x7b, 0xdb, 0xff, 0x7b, 0x07, 0x71, 0x40, ++ 0x5e, 0xe1, 0x0b, 0xf6, 0x8d, 0xf0, 0xfd, 0x94, 0x23, 0x9c, 0x0f, 0x71, ++ 0x38, 0x5a, 0x9f, 0xfd, 0xce, 0x56, 0x51, 0x78, 0x0c, 0xf8, 0x6f, 0x2f, ++ 0x5e, 0xa6, 0xf9, 0xe9, 0xa1, 0x71, 0x30, 0xaf, 0x17, 0xff, 0xca, 0xf2, ++ 0x64, 0x7a, 0xb7, 0x5a, 0xf1, 0xf7, 0x53, 0x4e, 0xed, 0x7e, 0xf6, 0x79, ++ 0xd8, 0x17, 0x3b, 0xb5, 0x75, 0x28, 0xda, 0x59, 0x2f, 0x09, 0x41, 0x0b, ++ 0xf4, 0x1b, 0x5c, 0xc5, 0xe8, 0x6f, 0xe6, 0xd3, 0x8a, 0x2d, 0x46, 0xbf, ++ 0xf8, 0x9e, 0x44, 0xa6, 0x6f, 0x7a, 0x04, 0x86, 0xef, 0x4b, 0x1a, 0x8d, ++ 0xf3, 0xbe, 0x34, 0x64, 0x2c, 0xff, 0x3c, 0x91, 0xf9, 0x53, 0xf3, 0x88, ++ 0xee, 0x7d, 0x26, 0xec, 0xdf, 0xab, 0xf5, 0x69, 0xb0, 0xae, 0x3e, 0x1d, ++ 0xfb, 0xbe, 0xe1, 0xfb, 0xb9, 0x5c, 0x3c, 0xf7, 0x9c, 0xa2, 0xf1, 0xad, ++ 0xc8, 0xef, 0x67, 0x23, 0xaa, 0xee, 0xfc, 0xd2, 0x9e, 0xe8, 0xfe, 0xdd, ++ 0x5d, 0x43, 0x21, 0xaf, 0x02, 0x70, 0x31, 0x22, 0xfa, 0xbe, 0xc2, 0x34, ++ 0xae, 0xd6, 0x7f, 0x51, 0x22, 0xdb, 0x87, 0x4f, 0xe1, 0xfb, 0x33, 0xbd, ++ 0x6f, 0x88, 0x88, 0x9f, 0x93, 0xa6, 0xdf, 0x2d, 0xec, 0xb3, 0xeb, 0x6a, ++ 0x6b, 0x06, 0x4f, 0xd7, 0xad, 0x43, 0x25, 0x8d, 0xfb, 0x53, 0x8b, 0xc1, ++ 0x3f, 0x6a, 0xda, 0x9f, 0x3a, 0x4f, 0xb7, 0xbe, 0x54, 0x6e, 0x3d, 0x98, ++ 0x7a, 0x2b, 0xe6, 0x25, 0x49, 0xf8, 0xbb, 0x4c, 0x95, 0x73, 0x9e, 0x79, ++ 0x68, 0x72, 0x0a, 0xbc, 0x17, 0xc3, 0x00, 0x2f, 0x7c, 0x87, 0xb8, 0x57, ++ 0x77, 0xf8, 0x37, 0x6e, 0xa8, 0x47, 0xed, 0xdd, 0xf1, 0xa2, 0x0e, 0xef, ++ 0xa5, 0x8d, 0x77, 0x0f, 0x9e, 0xae, 0x93, 0xd3, 0xbf, 0x95, 0x2f, 0x35, ++ 0x79, 0xaa, 0xe4, 0xf6, 0xc9, 0xae, 0x89, 0x9d, 0x85, 0x90, 0x27, 0x5e, ++ 0xd1, 0xc8, 0x7e, 0xbf, 0xa9, 0x22, 0xfc, 0xa3, 0x1b, 0xe1, 0xf7, 0x17, ++ 0x49, 0x13, 0x3b, 0x67, 0x9a, 0x2f, 0x91, 0x22, 0x91, 0xca, 0x4f, 0xe5, ++ 0xf6, 0x1f, 0xfd, 0x10, 0x7e, 0x8f, 0x2b, 0xf0, 0xe4, 0x04, 0x2f, 0xc0, ++ 0x43, 0xbb, 0xb8, 0x09, 0xde, 0x57, 0xb4, 0x7c, 0x8a, 0xe7, 0x09, 0x56, ++ 0x9b, 0x7e, 0x47, 0x40, 0x7b, 0xee, 0xe1, 0xf4, 0x5d, 0x7d, 0xb3, 0xb3, ++ 0x0c, 0xf4, 0x12, 0xed, 0xef, 0x15, 0xcb, 0x78, 0x6c, 0xdf, 0x01, 0x3f, ++ 0x7d, 0x72, 0xa2, 0x20, 0xf8, 0xe6, 0xad, 0xb4, 0xca, 0x29, 0x12, 0x7e, ++ 0xf7, 0x9a, 0x4c, 0x98, 0x9f, 0x91, 0x9f, 0x28, 0x7f, 0x0a, 0x60, 0x5f, ++ 0xf5, 0x6e, 0x16, 0xf0, 0xf7, 0x6b, 0xa9, 0x45, 0x95, 0x7f, 0x03, 0x98, ++ 0xce, 0xbe, 0x65, 0x98, 0x5f, 0x4b, 0xbf, 0xdf, 0x11, 0xeb, 0x5c, 0xf3, ++ 0xa2, 0x90, 0xb1, 0x1f, 0x33, 0x9d, 0xdf, 0xe3, 0x70, 0xd1, 0xbf, 0x2c, ++ 0x3d, 0xbf, 0x98, 0xeb, 0x0d, 0x98, 0x15, 0xc4, 0xf3, 0x87, 0x95, 0x4b, ++ 0xa9, 0x5e, 0xd3, 0xd9, 0xf3, 0x95, 0x47, 0x1b, 0xf0, 0xde, 0x46, 0xf3, ++ 0x38, 0x18, 0x6c, 0xd3, 0xe5, 0x15, 0xc0, 0xba, 0xa8, 0xa2, 0x1c, 0xdb, ++ 0xb9, 0x7d, 0x40, 0x04, 0x5b, 0x3e, 0xcf, 0x8f, 0x1d, 0xc9, 0xca, 0x78, ++ 0x3f, 0x21, 0xf0, 0x25, 0x65, 0x88, 0x8a, 0xcb, 0xc8, 0x74, 0x15, 0xf0, ++ 0x7a, 0x03, 0x99, 0x09, 0xcf, 0x97, 0x84, 0xc8, 0x43, 0xa2, 0xc8, 0xf4, ++ 0x01, 0xc6, 0x7b, 0xb6, 0x25, 0xa0, 0x3e, 0xe8, 0xf6, 0x74, 0x3d, 0xf3, ++ 0x04, 0xf0, 0x51, 0xcb, 0x58, 0x8c, 0x33, 0x0d, 0xe1, 0xe7, 0x3a, 0xbb, ++ 0xd5, 0x08, 0xde, 0xe7, 0xd8, 0xc3, 0xe3, 0x90, 0xdd, 0x1e, 0x56, 0x2e, ++ 0x6f, 0xb7, 0x63, 0xbe, 0xcb, 0xa9, 0xd3, 0x0a, 0xea, 0xcb, 0x65, 0xe1, ++ 0x83, 0x6e, 0x58, 0x97, 0xba, 0x9f, 0xb7, 0x5b, 0xe0, 0xf7, 0x47, 0x4f, ++ 0x6d, 0x1f, 0x50, 0x00, 0xf9, 0x90, 0xdd, 0x61, 0x76, 0xcf, 0xef, 0xc9, ++ 0xf0, 0x00, 0xfc, 0x9d, 0xd7, 0x78, 0xeb, 0x93, 0x59, 0xee, 0xb5, 0xf5, ++ 0xf0, 0x08, 0xfc, 0x93, 0xae, 0x9b, 0xdf, 0x24, 0xfa, 0xbe, 0x4a, 0x84, ++ 0xf5, 0x66, 0x05, 0xcb, 0x17, 0x1d, 0x34, 0xa0, 0x26, 0x27, 0xd6, 0xef, ++ 0x46, 0x68, 0xed, 0x52, 0x94, 0x9a, 0x1c, 0xf0, 0x47, 0x7a, 0x6f, 0x73, ++ 0x7a, 0xd9, 0xef, 0xfd, 0x06, 0x33, 0x25, 0x8c, 0x53, 0xa7, 0x79, 0x21, ++ 0x5f, 0xe7, 0x7f, 0x01, 0x64, 0xfd, 0x28, 0x59, 0x00, 0x80, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x0b, 0xdd, 0x7d, 0x0b, 0x7c, 0x54, 0xd5, 0x99, 0xf8, 0xb9, 0x8f, ++ 0x79, 0x65, 0x66, 0x92, 0x99, 0xc9, 0x24, 0x99, 0x84, 0x3c, 0x6e, 0x20, ++ 0x84, 0x00, 0x01, 0x27, 0x31, 0x44, 0xa0, 0xa8, 0x97, 0x10, 0x30, 0x68, ++ 0xd4, 0x01, 0x51, 0x63, 0xb5, 0x38, 0xbc, 0x03, 0xe6, 0x25, 0x3e, 0x36, ++ 0x2a, 0x36, 0x83, 0x89, 0x90, 0x20, 0x6a, 0x58, 0x23, 0x12, 0x0a, 0x38, ++ 0x20, 0x58, 0x5a, 0xb5, 0x1b, 0x2c, 0x68, 0xa4, 0x81, 0xdf, 0x80, 0x68, ++ 0xd1, 0xd5, 0xfd, 0x8d, 0xda, 0xba, 0x3e, 0xf6, 0xcf, 0x8e, 0x4a, 0xa9, ++ 0x5a, 0x21, 0x23, 0x5a, 0xea, 0x76, 0xb5, 0xfe, 0xcf, 0xf7, 0x9d, 0x73, ++ 0x67, 0xe6, 0x4e, 0x12, 0xa5, 0xdd, 0xdd, 0xee, 0xef, 0xb7, 0xe9, 0x8f, ++ 0x5e, 0xcf, 0x3d, 0xf7, 0xbc, 0xbe, 0xef, 0x3b, 0xdf, 0xfb, 0x9c, 0x59, ++ 0x24, 0x10, 0x42, 0xa6, 0x11, 0x62, 0x76, 0xf9, 0x64, 0x47, 0x06, 0x21, ++ 0xf6, 0x0a, 0x42, 0x54, 0xfa, 0xcf, 0x75, 0x5c, 0xda, 0x25, 0x15, 0x12, ++ 0xf2, 0x91, 0xe4, 0xbd, 0xd3, 0x31, 0x86, 0x90, 0xa5, 0xc4, 0x67, 0x24, ++ 0xf0, 0xac, 0xf0, 0x1b, 0xc9, 0x68, 0xda, 0xa6, 0x83, 0x7e, 0x9c, 0x4d, ++ 0xc8, 0x12, 0x99, 0x84, 0x64, 0x17, 0x7d, 0x2e, 0x50, 0xdf, 0x15, 0x26, ++ 0x63, 0x99, 0x10, 0xda, 0x7e, 0xc9, 0x36, 0x21, 0xd8, 0x4e, 0xdb, 0x2f, ++ 0xdd, 0x68, 0xa2, 0x9d, 0x13, 0xfc, 0xfb, 0x96, 0xfe, 0x5b, 0xde, 0x43, ++ 0xcb, 0x25, 0xf1, 0xf2, 0x4a, 0x12, 0x34, 0x12, 0x89, 0xfe, 0xc7, 0xb6, ++ 0x84, 0xef, 0x68, 0xff, 0x2b, 0xe5, 0xd0, 0x11, 0x21, 0x95, 0x90, 0x55, ++ 0x66, 0x12, 0xb2, 0xd2, 0x7e, 0x57, 0xed, 0xd6, 0xb7, 0xbb, 0x85, 0x84, ++ 0x70, 0x3e, 0x0d, 0x4f, 0x7f, 0x6b, 0x4a, 0xec, 0x9f, 0x90, 0x00, 0x21, ++ 0x74, 0x6a, 0x7f, 0x24, 0xda, 0xba, 0xd4, 0x3c, 0x58, 0x97, 0xdb, 0x48, ++ 0xcb, 0x6e, 0x42, 0xa2, 0xaf, 0x1b, 0x82, 0xbb, 0xe8, 0xbc, 0x7e, 0x27, ++ 0xf9, 0x70, 0x5d, 0xb7, 0x10, 0x3f, 0xf6, 0xf3, 0xc3, 0xd6, 0x2a, 0xf2, ++ 0x51, 0x3a, 0x21, 0xcd, 0x77, 0xb5, 0x66, 0x2f, 0xa5, 0xcf, 0xc1, 0xd6, ++ 0xbb, 0xb3, 0x97, 0x5e, 0x48, 0xeb, 0x61, 0x1e, 0x74, 0x7c, 0x1b, 0x61, ++ 0xed, 0x09, 0x5d, 0xd7, 0x1e, 0x0a, 0xb3, 0x5b, 0xaa, 0x49, 0x28, 0x8f, ++ 0xce, 0x6f, 0x19, 0x5d, 0x6f, 0x4a, 0x39, 0x2d, 0x0f, 0x08, 0xa1, 0x49, ++ 0x50, 0x36, 0x93, 0x40, 0x6a, 0x39, 0x7b, 0x9f, 0x56, 0xce, 0xd6, 0xab, ++ 0x26, 0xcc, 0xaf, 0x9e, 0x74, 0xe3, 0x78, 0xf5, 0xdb, 0xf4, 0xef, 0xc9, ++ 0x6f, 0xd2, 0x11, 0x9e, 0x0d, 0x24, 0x8c, 0xf5, 0x64, 0x77, 0x42, 0x3d, ++ 0x85, 0x47, 0x03, 0x87, 0x43, 0xc3, 0xd3, 0xf4, 0x7d, 0x02, 0x1c, 0xa6, ++ 0x3f, 0x2d, 0x04, 0xec, 0x17, 0x40, 0x29, 0xd8, 0x9e, 0x49, 0xe7, 0xd7, ++ 0xf4, 0x31, 0x21, 0x1b, 0x68, 0xa9, 0x69, 0xff, 0xb7, 0x26, 0x5d, 0xff, ++ 0xa4, 0x9b, 0x90, 0x29, 0x84, 0x64, 0xa5, 0x10, 0x62, 0xa1, 0xf8, 0x7a, ++ 0x54, 0x20, 0x75, 0x7d, 0xa5, 0xd8, 0x6e, 0xfc, 0xbc, 0x49, 0xf4, 0x1b, ++ 0xf8, 0xbb, 0x14, 0xca, 0x6b, 0xf1, 0xbb, 0x13, 0x1c, 0x7e, 0x8f, 0x5e, ++ 0xbb, 0x3c, 0xdb, 0x4f, 0xbf, 0x7b, 0xd8, 0x49, 0xcb, 0x39, 0x1c, 0xc0, ++ 0x53, 0xe9, 0x18, 0x22, 0x0c, 0x8e, 0xe5, 0x90, 0x99, 0x8e, 0x93, 0x72, ++ 0x61, 0xac, 0x8c, 0xf5, 0x95, 0xf7, 0xb1, 0xf2, 0x55, 0xdd, 0xc5, 0x35, ++ 0x5b, 0x66, 0x10, 0xb2, 0xd9, 0xe0, 0xcf, 0x76, 0x50, 0x20, 0x2e, 0x91, ++ 0x7c, 0x2f, 0x8b, 0x14, 0x7e, 0xbb, 0x5d, 0xfe, 0xf9, 0x80, 0x97, 0x25, ++ 0xa2, 0x9a, 0x2f, 0xc3, 0x7a, 0x89, 0x5a, 0xec, 0xa3, 0xf3, 0x20, 0xad, ++ 0x0c, 0x0e, 0x8f, 0x95, 0xb7, 0x8c, 0x6f, 0x29, 0x8d, 0xcf, 0x2b, 0x3e, ++ 0x3f, 0x86, 0xdf, 0xcd, 0x42, 0x5f, 0x48, 0xa4, 0x74, 0x16, 0x78, 0x41, ++ 0xf0, 0xee, 0x51, 0x80, 0x6e, 0xa3, 0x06, 0xbf, 0x2d, 0xfe, 0x5d, 0x83, ++ 0x43, 0xc0, 0x75, 0xa4, 0x1d, 0x8d, 0xbc, 0x3c, 0x0a, 0xf0, 0x7e, 0x40, ++ 0x20, 0xbb, 0xe8, 0x77, 0xbd, 0xc2, 0x07, 0x2f, 0x8f, 0xa2, 0xed, 0x7a, ++ 0xe7, 0x2a, 0xa4, 0x9d, 0x96, 0x3d, 0x14, 0x4f, 0x52, 0x39, 0xbc, 0x27, ++ 0x1d, 0x02, 0x85, 0x4b, 0xc5, 0xfe, 0x79, 0xb7, 0xbe, 0x04, 0x78, 0xae, ++ 0x48, 0xf1, 0x8e, 0xa5, 0x8f, 0xc6, 0xfd, 0x33, 0xa5, 0x46, 0x1b, 0xae, ++ 0xff, 0x66, 0x1f, 0x9d, 0x4f, 0x96, 0xb5, 0x65, 0xa7, 0x48, 0xeb, 0xb3, ++ 0x6e, 0x2e, 0x29, 0x07, 0xfa, 0xa6, 0xeb, 0xbe, 0x79, 0x3e, 0x7d, 0x7f, ++ 0xab, 0x43, 0xc1, 0xf1, 0xb2, 0x6d, 0x0c, 0xef, 0x9e, 0xfb, 0x02, 0x85, ++ 0xab, 0x4b, 0x61, 0x7c, 0xdf, 0xad, 0x2f, 0xd1, 0xf1, 0xa2, 0x93, 0x52, ++ 0xbc, 0x30, 0x7e, 0x16, 0x85, 0x95, 0xdd, 0x85, 0xcf, 0x4e, 0x0b, 0x7c, ++ 0x47, 0xd6, 0x0a, 0xf0, 0xdd, 0xa3, 0xa9, 0xac, 0xff, 0x0c, 0x51, 0xba, ++ 0x79, 0x1e, 0x94, 0xcb, 0x59, 0xd9, 0xb5, 0x46, 0x50, 0x77, 0x21, 0xf1, ++ 0x6d, 0xc2, 0x75, 0x67, 0x99, 0x48, 0x0d, 0xcc, 0x13, 0xde, 0x07, 0x4b, ++ 0x71, 0xcb, 0xa8, 0xfb, 0xb0, 0x3e, 0xc8, 0xf0, 0x3b, 0xab, 0xa5, 0x0c, ++ 0xfa, 0xcb, 0x1a, 0xc3, 0x9e, 0x6e, 0x63, 0x28, 0x17, 0xfa, 0x79, 0x4d, ++ 0xc3, 0xf7, 0x40, 0xb6, 0x48, 0x32, 0x09, 0xb9, 0xdd, 0x41, 0xff, 0x9b, ++ 0xce, 0xe7, 0xf6, 0x7d, 0x33, 0xb3, 0x5c, 0xb4, 0xfd, 0x6b, 0x9f, 0x99, ++ 0x65, 0x31, 0x8d, 0x3e, 0x3d, 0x84, 0x84, 0xe1, 0x3b, 0x39, 0x64, 0x23, ++ 0xf0, 0x2c, 0x2a, 0x61, 0xdf, 0x9b, 0xf9, 0xf7, 0x65, 0xb3, 0xb2, 0x60, ++ 0x33, 0xb8, 0xf3, 0xf5, 0xdf, 0x0d, 0x1a, 0xd4, 0xb4, 0x0b, 0x29, 0x5c, ++ 0x02, 0x6f, 0x48, 0x04, 0xf0, 0xf1, 0xa5, 0x4d, 0x4d, 0x73, 0xd2, 0xef, ++ 0x7e, 0x60, 0x64, 0xeb, 0x48, 0xc6, 0xe3, 0x4f, 0x00, 0x3f, 0x74, 0x3d, ++ 0xcd, 0x5f, 0xd1, 0x99, 0xa7, 0xc7, 0xdf, 0x37, 0xd7, 0x9d, 0x33, 0x42, ++ 0x7f, 0xcd, 0x5f, 0xc9, 0x24, 0x78, 0x61, 0xfc, 0xfd, 0x67, 0x6d, 0x66, ++ 0x12, 0x2c, 0x4e, 0xc0, 0x6f, 0xfd, 0xd1, 0x39, 0xf0, 0x5d, 0x23, 0x09, ++ 0xaf, 0x03, 0xba, 0x6a, 0xec, 0xb3, 0x92, 0x60, 0x02, 0xbd, 0xff, 0x20, ++ 0x65, 0xf8, 0x71, 0x35, 0xfa, 0x6e, 0xfe, 0x4a, 0x24, 0x81, 0x74, 0x24, ++ 0xdf, 0x5c, 0x9f, 0x1d, 0xe0, 0x13, 0x5d, 0xb7, 0x0c, 0xe6, 0x7f, 0x48, ++ 0x20, 0x7b, 0x08, 0xd4, 0x1b, 0x49, 0x20, 0x61, 0xfc, 0xe6, 0xaf, 0x5c, ++ 0xfa, 0x72, 0x6c, 0x9e, 0x99, 0xd8, 0x4f, 0xfc, 0x3b, 0xa2, 0xff, 0xae, ++ 0xff, 0x4f, 0xf8, 0x1d, 0x99, 0x1a, 0x49, 0x85, 0x71, 0xce, 0x38, 0x22, ++ 0xa9, 0x2e, 0xbe, 0x3e, 0x68, 0x97, 0x23, 0x91, 0x16, 0xc0, 0xcb, 0x60, ++ 0x50, 0x0c, 0x18, 0xe8, 0x3e, 0x3e, 0xa3, 0xb0, 0xfa, 0x41, 0x42, 0x6a, ++ 0xfa, 0x6c, 0xf1, 0xef, 0xb5, 0xfe, 0xce, 0xd4, 0x19, 0x49, 0x08, 0xe1, ++ 0x1e, 0xc5, 0x7e, 0x01, 0x2e, 0x01, 0xca, 0xdb, 0xb6, 0x0e, 0x7c, 0x6e, ++ 0x54, 0x68, 0xb9, 0x61, 0xe0, 0x08, 0xc2, 0x45, 0xa3, 0x87, 0x44, 0xf8, ++ 0x04, 0x12, 0xf8, 0x46, 0x66, 0x7b, 0x38, 0x24, 0xd2, 0x3d, 0xfd, 0x46, ++ 0xf7, 0x8a, 0xce, 0x52, 0x0b, 0x45, 0xc5, 0x51, 0xbe, 0x7f, 0x03, 0x2b, ++ 0x3b, 0x55, 0xba, 0x5f, 0x33, 0x25, 0x51, 0xb7, 0x9f, 0xad, 0x15, 0xb1, ++ 0xfd, 0x8d, 0x6c, 0xe5, 0x51, 0x51, 0x62, 0xfc, 0x20, 0xb0, 0xaa, 0xb3, ++ 0x3a, 0x37, 0xa1, 0xcc, 0xbf, 0x8f, 0xb5, 0x0f, 0xdc, 0x52, 0x53, 0x4d, ++ 0xfb, 0xab, 0x28, 0x65, 0xed, 0xdf, 0xef, 0x6e, 0x38, 0x7e, 0x9f, 0x1c, ++ 0xe7, 0x47, 0x74, 0x1d, 0xf9, 0x00, 0x97, 0x58, 0xd9, 0x9c, 0x54, 0xb6, ++ 0xd1, 0xf2, 0xa4, 0x84, 0xb2, 0x23, 0xa9, 0xde, 0x9d, 0x54, 0xef, 0x49, ++ 0x2a, 0xe7, 0xb2, 0xef, 0x3f, 0xb3, 0x87, 0xf2, 0x25, 0x2f, 0x21, 0xa7, ++ 0xba, 0x5b, 0x6a, 0x64, 0xca, 0x5f, 0x3e, 0xcb, 0x0e, 0x2d, 0x14, 0x68, ++ 0x79, 0xa3, 0x74, 0x5b, 0x4d, 0x35, 0xe5, 0x73, 0x8d, 0x15, 0x61, 0x55, ++ 0x02, 0xfe, 0x39, 0x20, 0x78, 0x05, 0x12, 0x87, 0x5f, 0x93, 0x97, 0xa8, ++ 0x41, 0x0a, 0x3f, 0x9b, 0x37, 0x62, 0x5c, 0x52, 0x0a, 0x70, 0x08, 0xbf, ++ 0x0c, 0xfb, 0xbf, 0xa1, 0x5f, 0x70, 0x08, 0x94, 0xce, 0x6d, 0x7d, 0xfb, ++ 0x42, 0x58, 0x86, 0x76, 0x4a, 0x42, 0xbb, 0x3e, 0x01, 0xdb, 0x35, 0xf4, ++ 0x7d, 0x80, 0xed, 0x46, 0xec, 0xbf, 0x44, 0xc4, 0x7d, 0xbc, 0xa1, 0xe4, ++ 0x43, 0xfc, 0x8e, 0x02, 0xc0, 0x71, 0x92, 0xe2, 0xe9, 0x7a, 0x22, 0x90, ++ 0x34, 0x0a, 0xd2, 0x42, 0xd9, 0xff, 0x27, 0xe0, 0x93, 0x8d, 0x7d, 0xbf, ++ 0x67, 0x72, 0x97, 0x44, 0x8d, 0x6c, 0x7d, 0x8c, 0x0f, 0x9e, 0xc9, 0x56, ++ 0x5f, 0x44, 0x3e, 0x78, 0x48, 0x70, 0xc0, 0xbe, 0x8b, 0xd1, 0x1d, 0xf4, ++ 0x6b, 0x8b, 0xd3, 0xbb, 0xf6, 0xfd, 0xfb, 0x93, 0x06, 0x7e, 0x0b, 0xdd, ++ 0x58, 0x6f, 0xff, 0x7c, 0xad, 0x4c, 0xbf, 0xff, 0x7f, 0x8d, 0xbf, 0x9f, ++ 0x42, 0x28, 0xaa, 0xde, 0x87, 0x4f, 0xa6, 0x01, 0x5f, 0x0d, 0x8e, 0x07, ++ 0x79, 0xbc, 0x95, 0xf8, 0xc7, 0x83, 0x1c, 0xfa, 0x51, 0xe3, 0xd8, 0x23, ++ 0x22, 0xfd, 0xee, 0x84, 0x21, 0xb2, 0x9d, 0x50, 0x78, 0x8d, 0xdd, 0xd4, ++ 0x89, 0xf0, 0x3b, 0x61, 0x8f, 0xe4, 0x09, 0x94, 0x87, 0x8c, 0x73, 0x3e, ++ 0xc2, 0xca, 0x19, 0x91, 0xed, 0x00, 0xcf, 0x7b, 0x9d, 0x3d, 0x35, 0x32, ++ 0xed, 0xe7, 0x44, 0x5e, 0x24, 0x4f, 0xa4, 0xe5, 0x89, 0x9b, 0x0e, 0xb3, ++ 0xf2, 0xd8, 0xc8, 0x76, 0x28, 0x5f, 0xe3, 0xfc, 0x39, 0xfb, 0x7e, 0x52, ++ 0x24, 0x4f, 0xa2, 0xed, 0x47, 0x93, 0xa7, 0x6a, 0xaa, 0x69, 0x79, 0x8f, ++ 0x63, 0xf8, 0xfd, 0x9a, 0xeb, 0x64, 0x7c, 0x5c, 0x9b, 0xdf, 0x07, 0x63, ++ 0xd4, 0x2c, 0x27, 0xac, 0xa7, 0x81, 0xc9, 0x89, 0xed, 0x06, 0x90, 0xf1, ++ 0x84, 0x2c, 0x5c, 0xf5, 0xe9, 0x33, 0x7b, 0x28, 0x1c, 0x16, 0xde, 0x6d, ++ 0x45, 0x3e, 0xb5, 0xe7, 0xb3, 0x6b, 0x2e, 0xf7, 0xe1, 0xfa, 0x03, 0x3e, ++ 0xb9, 0x92, 0xf2, 0x43, 0x46, 0xfa, 0x4c, 0x8e, 0x21, 0x3f, 0x96, 0x51, ++ 0x0f, 0xc8, 0x06, 0xd9, 0xe5, 0x8a, 0xe3, 0xc3, 0x9e, 0x1f, 0x56, 0x90, ++ 0xcf, 0x4f, 0x68, 0xd9, 0x07, 0xf2, 0x3e, 0x6b, 0x61, 0x29, 0xf2, 0xf9, ++ 0x3f, 0xa6, 0xa9, 0x3f, 0x76, 0x66, 0xc4, 0x9f, 0x67, 0x33, 0xd9, 0xf3, ++ 0xc7, 0x4e, 0x07, 0xe3, 0xcb, 0x92, 0xa8, 0xe2, 0xf7, 0xf7, 0xd8, 0x51, ++ 0xef, 0x79, 0xd8, 0xc2, 0xd6, 0x43, 0xf7, 0x0d, 0xe2, 0xd7, 0xc6, 0xf1, ++ 0x51, 0xc6, 0xd7, 0x53, 0xe6, 0x14, 0xf1, 0x39, 0xca, 0x31, 0xfb, 0xc7, ++ 0xb0, 0x9e, 0xf7, 0x04, 0xb5, 0xd7, 0x2c, 0xc1, 0x93, 0x04, 0x2c, 0x80, ++ 0xcf, 0x95, 0x29, 0xa8, 0x67, 0xdc, 0xb8, 0x93, 0xf2, 0x05, 0xca, 0x97, ++ 0x7b, 0xf8, 0xbc, 0x7b, 0x36, 0x8d, 0x0f, 0x06, 0x68, 0xff, 0x37, 0x0a, ++ 0xc4, 0x07, 0x7c, 0xa3, 0xc7, 0xa9, 0x66, 0x03, 0x7f, 0x78, 0xee, 0x2f, ++ 0xd2, 0xcd, 0xb0, 0xde, 0x9e, 0x32, 0x5a, 0xa6, 0xcf, 0x5f, 0x71, 0x7e, ++ 0xdf, 0x33, 0x4f, 0xcd, 0x76, 0x26, 0xc8, 0xc5, 0x9e, 0x9d, 0xac, 0x5e, ++ 0xe3, 0x3b, 0x3d, 0x85, 0xac, 0xbd, 0x26, 0x6f, 0xb2, 0xda, 0xd9, 0x38, ++ 0x59, 0x0f, 0x8f, 0xdf, 0x05, 0xeb, 0xb0, 0xca, 0x44, 0x85, 0xf2, 0xb2, ++ 0xba, 0xe2, 0x5d, 0x6b, 0x51, 0x6e, 0xcf, 0xc7, 0xf9, 0x12, 0x55, 0xcd, ++ 0x16, 0xe8, 0x7a, 0x4f, 0xae, 0x1c, 0x2d, 0x6e, 0x28, 0x8c, 0xe3, 0x47, ++ 0x28, 0x52, 0xaf, 0x80, 0xfa, 0x1f, 0x42, 0xff, 0xb6, 0x38, 0x9e, 0xb4, ++ 0xf1, 0x7f, 0x0c, 0xeb, 0x06, 0xb9, 0x2f, 0x51, 0xb9, 0x4f, 0xd7, 0xbb, ++ 0xc6, 0xe5, 0x47, 0x38, 0x52, 0x3d, 0x60, 0x32, 0xea, 0x81, 0x5c, 0x0f, ++ 0xf8, 0x31, 0xac, 0x77, 0x4a, 0x1c, 0xbe, 0x44, 0x8e, 0x4c, 0x81, 0xf7, ++ 0xff, 0x87, 0xe0, 0xd4, 0x02, 0xeb, 0xfe, 0xaf, 0xc2, 0x69, 0x18, 0x7e, ++ 0x71, 0x2f, 0x7c, 0xd7, 0xd8, 0x4a, 0xf9, 0x85, 0x98, 0xc0, 0x2f, 0x38, ++ 0xfc, 0x36, 0x0b, 0x21, 0x43, 0x16, 0xe3, 0x17, 0x5e, 0x90, 0x73, 0xf0, ++ 0x7e, 0x3e, 0xe5, 0x8f, 0xd7, 0x3b, 0xfc, 0x1d, 0x30, 0x5f, 0x6d, 0xfc, ++ 0x85, 0xf7, 0x34, 0xa2, 0xde, 0xa7, 0xcd, 0xcb, 0xfa, 0x0f, 0xcf, 0xd7, ++ 0x5c, 0x4f, 0x86, 0xee, 0xb3, 0x64, 0xbd, 0xec, 0xc4, 0x7b, 0xe6, 0x8d, ++ 0x84, 0xca, 0xb1, 0x13, 0xc6, 0x3e, 0xe4, 0x8b, 0x27, 0x2e, 0x27, 0xde, ++ 0xb5, 0xc0, 0x3f, 0x44, 0x52, 0x0f, 0x70, 0xd4, 0xf4, 0xca, 0xca, 0xbb, ++ 0x6f, 0x79, 0x8d, 0x50, 0x7d, 0x36, 0xea, 0x94, 0x10, 0xcf, 0x5d, 0x82, ++ 0x9a, 0x0d, 0xeb, 0xea, 0xa2, 0x78, 0x35, 0x83, 0x1c, 0x9e, 0x67, 0x0c, ++ 0xee, 0x29, 0x8c, 0xcb, 0xc5, 0x1e, 0x67, 0xb0, 0x77, 0x39, 0xe0, 0xf5, ++ 0xda, 0x52, 0x6f, 0x40, 0x41, 0xf9, 0x88, 0xfb, 0x2d, 0xd0, 0x6a, 0xc5, ++ 0xef, 0x7a, 0x9c, 0x11, 0x22, 0x43, 0xfd, 0x34, 0xc5, 0x41, 0x67, 0x02, ++ 0x78, 0x46, 0x7c, 0x44, 0x6f, 0x30, 0x06, 0x77, 0x09, 0x80, 0x6f, 0x46, ++ 0x2f, 0x3d, 0x2b, 0x27, 0x04, 0x03, 0x02, 0xe2, 0x3d, 0x80, 0xed, 0x6f, ++ 0x60, 0xf4, 0xd3, 0x33, 0x8f, 0xa0, 0x7e, 0xdf, 0x73, 0x83, 0x07, 0xe9, ++ 0xc6, 0x42, 0x82, 0x16, 0x98, 0xcf, 0x48, 0x74, 0x90, 0xd9, 0x4e, 0x90, ++ 0x8e, 0x88, 0xac, 0x4e, 0x9e, 0x67, 0x8f, 0xc3, 0xe1, 0x9f, 0xf9, 0xbe, ++ 0xb6, 0x56, 0x44, 0x0e, 0xfc, 0x2b, 0xe8, 0x91, 0x1b, 0x2d, 0xa8, 0x47, ++ 0x82, 0xcc, 0x94, 0xa1, 0xdc, 0x9d, 0x85, 0xf3, 0xa5, 0xf8, 0xfc, 0x25, ++ 0xd2, 0x87, 0x66, 0x2f, 0x3d, 0x92, 0x1d, 0x04, 0xfa, 0x20, 0xc4, 0x5b, ++ 0x09, 0xf8, 0x58, 0x6f, 0x57, 0x17, 0xe1, 0xfc, 0xef, 0xb5, 0x2a, 0x30, ++ 0xff, 0x6d, 0x16, 0xd2, 0x69, 0x2e, 0x07, 0xf3, 0x83, 0x74, 0x20, 0xbf, ++ 0xe3, 0xf3, 0x21, 0xdd, 0x8f, 0x11, 0xd0, 0xcf, 0x6e, 0xe6, 0xfa, 0xd9, ++ 0xbf, 0xd7, 0x9f, 0xb5, 0x83, 0x1e, 0x70, 0x94, 0xf3, 0x19, 0x20, 0x14, ++ 0x33, 0xe5, 0x7f, 0x8b, 0x09, 0xab, 0x5f, 0xbc, 0xc6, 0xfa, 0x01, 0xd8, ++ 0x33, 0x8b, 0xd7, 0x48, 0x21, 0x13, 0xb5, 0x57, 0x48, 0xe7, 0x6c, 0x35, ++ 0x92, 0x60, 0x67, 0x20, 0x45, 0xd1, 0xfe, 0xfc, 0x9c, 0x5f, 0x92, 0x2d, ++ 0x51, 0x3b, 0xd0, 0x8d, 0x1f, 0xda, 0xa5, 0x42, 0xff, 0x7f, 0xb6, 0x2b, ++ 0x36, 0x28, 0xd3, 0xf6, 0x93, 0x01, 0xed, 0xb4, 0x7d, 0x49, 0xbc, 0xfd, ++ 0x6f, 0x61, 0xff, 0x65, 0xc0, 0xfc, 0xd8, 0xfc, 0x49, 0x9b, 0x55, 0x01, ++ 0xf8, 0x26, 0xf3, 0xf5, 0xdf, 0x6a, 0xf3, 0xeb, 0x7e, 0x4c, 0x4d, 0x1c, ++ 0x4f, 0x1b, 0x27, 0xb9, 0x5f, 0x6a, 0xc7, 0xbd, 0x0d, 0x74, 0x4d, 0xe1, ++ 0x1e, 0x4a, 0x03, 0x7d, 0xfe, 0x5e, 0x09, 0xf1, 0x9a, 0x3c, 0x5f, 0xb7, ++ 0x31, 0xfa, 0xa0, 0x85, 0xd6, 0x2f, 0x6c, 0x93, 0x9c, 0xf7, 0x51, 0x78, ++ 0xfa, 0x5b, 0xed, 0xb8, 0x5e, 0x6d, 0xbe, 0x37, 0x67, 0x45, 0x2f, 0x46, ++ 0xfb, 0x2a, 0xa9, 0xff, 0x53, 0xd6, 0xa6, 0x4a, 0x19, 0xd6, 0xcf, 0xed, ++ 0x0f, 0xb2, 0x46, 0x6f, 0x7f, 0x11, 0x62, 0x8c, 0x97, 0x29, 0x5d, 0x2c, ++ 0x23, 0x51, 0xb4, 0x63, 0x86, 0xbc, 0xe7, 0x76, 0x6b, 0xb2, 0xdd, 0x47, ++ 0xc8, 0x5f, 0x4c, 0x89, 0xdf, 0x69, 0xfb, 0x85, 0x28, 0x42, 0xd2, 0xfc, ++ 0x39, 0x5d, 0x29, 0x82, 0x0c, 0x78, 0xf3, 0x0b, 0x0c, 0x6f, 0x46, 0x63, ++ 0x74, 0x21, 0xf0, 0x9d, 0xe4, 0x79, 0x6b, 0xf0, 0x94, 0x5d, 0x8c, 0xee, ++ 0x34, 0xba, 0x48, 0x86, 0xb7, 0xec, 0x1a, 0x1e, 0xde, 0x6e, 0x63, 0x24, ++ 0x0f, 0xfa, 0xf5, 0xb7, 0x9a, 0x10, 0x4e, 0xc9, 0xfd, 0x6b, 0x72, 0xf1, ++ 0x31, 0x0b, 0xdd, 0x3f, 0x94, 0xee, 0xb6, 0x08, 0x02, 0xd2, 0xeb, 0x96, ++ 0xbb, 0xac, 0x28, 0xe7, 0x88, 0x99, 0xe1, 0xb9, 0x79, 0x55, 0x8a, 0x02, ++ 0xf4, 0xbb, 0xd5, 0x18, 0x7d, 0x12, 0xf7, 0xd5, 0x41, 0x13, 0x01, 0xbc, ++ 0x0f, 0x5a, 0xa2, 0xcf, 0x21, 0xbf, 0x2a, 0x62, 0x7e, 0x85, 0xc1, 0x7f, ++ 0x91, 0x76, 0xc2, 0x77, 0x67, 0x32, 0x18, 0xdd, 0x9f, 0x79, 0xc1, 0x80, ++ 0xfb, 0x8d, 0x4d, 0x86, 0xea, 0x43, 0xff, 0x22, 0xed, 0xc2, 0x7a, 0x81, ++ 0xf5, 0x7b, 0x66, 0xad, 0x55, 0x81, 0xfd, 0xda, 0x0c, 0x90, 0xa6, 0xe3, ++ 0x37, 0x07, 0xfe, 0xb3, 0x8d, 0x50, 0xf8, 0x7e, 0x24, 0x32, 0x3b, 0xb9, ++ 0xb9, 0x5f, 0x6f, 0x0f, 0x9f, 0xa1, 0xff, 0xea, 0xcb, 0xe3, 0x7c, 0x63, ++ 0x90, 0xb0, 0x71, 0x02, 0xfd, 0x8c, 0x4f, 0xd0, 0x95, 0xae, 0xc4, 0x71, ++ 0x6e, 0x4c, 0x21, 0x1b, 0x68, 0xbf, 0x4d, 0xa2, 0xa0, 0x82, 0xfe, 0xd4, ++ 0xb4, 0x6a, 0x42, 0xb0, 0x9d, 0xd1, 0x93, 0x19, 0xf6, 0x53, 0x03, 0x9f, ++ 0x52, 0x93, 0x48, 0xed, 0xc2, 0xf2, 0xf8, 0xfe, 0x6f, 0x12, 0x3f, 0x2c, ++ 0x06, 0xbb, 0xaa, 0xc1, 0xbc, 0x31, 0x2c, 0xa5, 0x62, 0xfd, 0x31, 0xb0, ++ 0xc7, 0x08, 0xd8, 0x53, 0xb4, 0xdd, 0x2a, 0x68, 0x54, 0x38, 0x14, 0xfe, ++ 0x4d, 0x1b, 0xff, 0xf0, 0x0d, 0xcc, 0xbb, 0x69, 0xbf, 0x9e, 0x2e, 0x1a, ++ 0xe2, 0xf4, 0x23, 0x7c, 0x2b, 0x40, 0xfb, 0x04, 0x7a, 0x2a, 0x8c, 0xd3, ++ 0x09, 0xea, 0xdf, 0xc0, 0x3f, 0xaa, 0x49, 0x70, 0xac, 0xc0, 0xfc, 0x34, ++ 0x50, 0xb6, 0xd6, 0x84, 0x83, 0xe0, 0xa7, 0x69, 0xe6, 0xfe, 0x8b, 0x8c, ++ 0xa3, 0x91, 0x39, 0x40, 0x3f, 0xf6, 0x8a, 0x3e, 0xb2, 0x98, 0x3e, 0x9b, ++ 0x3f, 0x66, 0xfa, 0xc7, 0xf4, 0x81, 0x9d, 0x2f, 0x82, 0x1d, 0xec, 0xac, ++ 0x09, 0xe7, 0xc1, 0x32, 0x9b, 0x5b, 0x57, 0x5f, 0x78, 0xf2, 0xc2, 0x38, ++ 0x7e, 0xb5, 0x79, 0x4e, 0x1b, 0xd8, 0x24, 0x81, 0x7d, 0xa7, 0xe9, 0x2d, ++ 0x09, 0xf6, 0xe5, 0xf8, 0xf9, 0x93, 0x12, 0x9f, 0xf7, 0x61, 0x3b, 0xb0, ++ 0x57, 0x61, 0xbc, 0x08, 0xbc, 0x82, 0x7d, 0x23, 0x33, 0x79, 0xb7, 0x99, ++ 0xcb, 0x3b, 0x2a, 0x17, 0x91, 0x2f, 0x2f, 0xeb, 0x1e, 0x87, 0x72, 0x11, ++ 0xe4, 0x16, 0xf0, 0x37, 0xcd, 0xde, 0x05, 0x7e, 0x07, 0xfc, 0x65, 0xb7, ++ 0xab, 0xea, 0x06, 0x17, 0x5d, 0xe7, 0xa4, 0xf4, 0xaa, 0x05, 0xae, 0x29, ++ 0x6c, 0x1c, 0xd4, 0xf3, 0xc1, 0x48, 0x9a, 0x36, 0x14, 0x9e, 0xc9, 0x72, ++ 0x47, 0xfb, 0x0e, 0xec, 0xde, 0x16, 0xdb, 0xc8, 0xdf, 0xc5, 0xfc, 0x40, ++ 0xbd, 0x69, 0x8c, 0x7f, 0xc8, 0x02, 0x96, 0x97, 0xff, 0xb3, 0x61, 0xe7, ++ 0x06, 0x9c, 0x9f, 0x8c, 0xf4, 0xb2, 0x7a, 0x7b, 0x21, 0xf2, 0x63, 0xcd, ++ 0x5f, 0xd3, 0xc0, 0xfd, 0x54, 0xcb, 0xb9, 0x7f, 0x67, 0x39, 0xf7, 0xef, ++ 0xac, 0xd8, 0x62, 0x22, 0x4a, 0xa2, 0x3f, 0x2b, 0xa8, 0x2f, 0x37, 0x70, ++ 0x7e, 0xd0, 0x48, 0x22, 0xcc, 0xcf, 0xb5, 0x97, 0xd6, 0x27, 0xfa, 0x75, ++ 0xaa, 0x49, 0xc8, 0x0e, 0xf5, 0xe0, 0xdf, 0x81, 0x67, 0x9f, 0xbe, 0x7d, ++ 0x33, 0x09, 0xce, 0x92, 0x01, 0xbf, 0xfd, 0xdf, 0x9a, 0x12, 0xdf, 0x93, ++ 0x1e, 0xb6, 0xde, 0x9b, 0x39, 0xde, 0x7b, 0x2d, 0xcc, 0xaf, 0x33, 0x7d, ++ 0xcd, 0x4e, 0x89, 0x39, 0xab, 0xd8, 0x7a, 0xd3, 0xca, 0xd5, 0xc2, 0xfb, ++ 0x41, 0x8e, 0xbc, 0x62, 0x40, 0xff, 0xc3, 0xef, 0x38, 0x9e, 0x34, 0xb8, ++ 0x98, 0x5d, 0x55, 0x0b, 0x01, 0xde, 0x29, 0x60, 0xaf, 0xc1, 0x77, 0xf7, ++ 0x9b, 0x10, 0x2e, 0x27, 0xa9, 0xbc, 0xde, 0xc7, 0xfd, 0x1e, 0xf3, 0xc1, ++ 0x0e, 0x6d, 0xf3, 0x67, 0x17, 0x15, 0x01, 0x78, 0x1c, 0xf9, 0xf3, 0xed, ++ 0x43, 0xe1, 0xbb, 0xe1, 0xa0, 0xa5, 0x1e, 0xe8, 0xe5, 0x41, 0x17, 0xd3, ++ 0x5b, 0xb4, 0xf7, 0xb3, 0x5c, 0x06, 0x2c, 0xa3, 0x3f, 0x08, 0xe0, 0xbe, ++ 0xd6, 0x8a, 0x7a, 0x37, 0x05, 0xf3, 0x64, 0xa0, 0xa3, 0xca, 0xd1, 0x9a, ++ 0x1c, 0x25, 0x93, 0xc1, 0x0f, 0xf5, 0x81, 0x81, 0xea, 0x63, 0xb4, 0xdc, ++ 0x74, 0x9d, 0xcd, 0x0f, 0xfd, 0x45, 0x40, 0x6f, 0xa0, 0xe5, 0xad, 0x2e, ++ 0xe6, 0x2f, 0xd8, 0xea, 0x32, 0x22, 0xdd, 0x69, 0xe5, 0x98, 0x9d, 0xc7, ++ 0xe9, 0x85, 0x8e, 0x83, 0xfd, 0x81, 0x5f, 0xc6, 0x97, 0x40, 0x07, 0x3b, ++ 0x35, 0xfe, 0xc7, 0xfd, 0x28, 0x9a, 0xdc, 0xdd, 0xbc, 0x32, 0x05, 0xf9, ++ 0x51, 0x9c, 0x6e, 0x45, 0x82, 0x74, 0x5b, 0xea, 0x33, 0x82, 0x3f, 0xe9, ++ 0x20, 0xe7, 0x23, 0x07, 0x29, 0x40, 0xd1, 0xce, 0xea, 0xb3, 0x30, 0x3e, ++ 0x22, 0x33, 0xfe, 0x74, 0xf0, 0xe3, 0x09, 0xc8, 0xf7, 0x8e, 0x7f, 0xba, ++ 0x0a, 0xf9, 0xca, 0xd9, 0xba, 0x14, 0x62, 0x12, 0xf0, 0x7b, 0x55, 0x80, ++ 0xfa, 0x03, 0xa6, 0xe0, 0x7d, 0xb4, 0xbc, 0x94, 0xfb, 0x59, 0x0f, 0x0a, ++ 0x4c, 0x4f, 0x0c, 0x1c, 0xb2, 0x63, 0x3f, 0x0d, 0x46, 0x7f, 0x2f, 0xf8, ++ 0x1d, 0x1a, 0x9e, 0x1d, 0xeb, 0xa5, 0x18, 0x23, 0xcf, 0x19, 0x83, 0x3f, ++ 0x7b, 0x12, 0xea, 0x0f, 0x5b, 0xd0, 0xaf, 0xd5, 0x90, 0xca, 0xe6, 0xd9, ++ 0x70, 0x70, 0x14, 0xf2, 0xc9, 0x5f, 0x19, 0x82, 0x4f, 0xfd, 0x02, 0xfd, ++ 0x14, 0x26, 0xd4, 0xdf, 0x1a, 0x52, 0x94, 0x34, 0xac, 0x7f, 0x35, 0x9d, ++ 0x40, 0x7d, 0xa7, 0xd5, 0x7f, 0x08, 0xf6, 0x51, 0x8e, 0x89, 0xe9, 0x95, ++ 0x0d, 0xc6, 0x50, 0xb1, 0x93, 0xc2, 0xf1, 0xc3, 0x20, 0xd3, 0x8f, 0x3f, ++ 0x04, 0x46, 0x03, 0xfd, 0x0f, 0xd8, 0x51, 0xef, 0xa1, 0xd3, 0xcc, 0x86, ++ 0xf1, 0x3f, 0xea, 0xca, 0xf2, 0x6e, 0x50, 0xe2, 0x70, 0xf9, 0xe8, 0xc1, ++ 0x89, 0x48, 0xff, 0x9b, 0x0d, 0x0c, 0x6f, 0x81, 0x17, 0x98, 0xdf, 0xf3, ++ 0x43, 0x83, 0x6f, 0x4e, 0x36, 0x2d, 0x7f, 0x78, 0xa0, 0xcc, 0x4b, 0x2d, ++ 0x4b, 0x32, 0xe8, 0x33, 0x86, 0x8c, 0x74, 0x8e, 0xcd, 0x0f, 0x33, 0x7d, ++ 0x6e, 0x89, 0xa8, 0xec, 0x68, 0x05, 0xde, 0x74, 0xd8, 0xea, 0xd5, 0xd9, ++ 0xa3, 0x0f, 0xad, 0xa8, 0x85, 0xfa, 0xe6, 0x55, 0x6b, 0xae, 0x02, 0x3e, ++ 0x38, 0xd2, 0x7e, 0x06, 0x7e, 0x9e, 0xe8, 0xcf, 0x3d, 0x43, 0xa2, 0xf9, ++ 0x68, 0x8f, 0xd6, 0x8f, 0xee, 0x0b, 0xd1, 0x71, 0xcf, 0x0c, 0x8c, 0xf7, ++ 0xa2, 0xf8, 0x24, 0x1e, 0x8a, 0x6c, 0x4a, 0x27, 0x0e, 0xf6, 0xed, 0x49, ++ 0x03, 0x85, 0x37, 0xd0, 0xd7, 0x21, 0x03, 0xd2, 0xef, 0xf9, 0xf6, 0x0f, ++ 0xeb, 0x05, 0xfb, 0x10, 0xe4, 0x0b, 0x8c, 0xd3, 0x4c, 0xf9, 0x6f, 0xcc, ++ 0xcf, 0x8c, 0xfc, 0x37, 0xa1, 0x2c, 0x0d, 0x57, 0x66, 0xf8, 0x6c, 0x3e, ++ 0x98, 0xc5, 0xf5, 0x37, 0x7d, 0xfd, 0x8d, 0x69, 0xfe, 0x41, 0xd8, 0x5f, ++ 0x4d, 0xff, 0xf8, 0xa7, 0x13, 0xad, 0x08, 0xdf, 0x28, 0xf2, 0x3f, 0xd2, ++ 0xcd, 0xfc, 0xe7, 0x27, 0x0d, 0xea, 0x42, 0xa0, 0x53, 0x67, 0x75, 0xc8, ++ 0xb8, 0x38, 0x41, 0x6e, 0x9b, 0xd2, 0xb9, 0xfe, 0x6f, 0xe2, 0x7a, 0x1e, ++ 0x09, 0x19, 0x13, 0xf7, 0x9d, 0x56, 0x5f, 0x59, 0xa5, 0xa7, 0x73, 0xed, ++ 0x69, 0x4c, 0x67, 0xf4, 0x6e, 0x0f, 0x33, 0x3e, 0x3e, 0xb4, 0x5e, 0xe4, ++ 0xfb, 0xe1, 0x1a, 0x13, 0xc8, 0x2d, 0xe6, 0xda, 0x21, 0xa4, 0xe0, 0x63, ++ 0xe6, 0xef, 0x30, 0xa5, 0x2b, 0xd8, 0xff, 0xf4, 0x8f, 0x43, 0xc6, 0x25, ++ 0xb4, 0x5c, 0xb0, 0x26, 0x64, 0x5c, 0xce, 0x9f, 0xb0, 0x2f, 0x28, 0xbc, ++ 0x43, 0x66, 0xba, 0xee, 0x93, 0xbd, 0x76, 0xb6, 0x9f, 0x29, 0x18, 0xa0, ++ 0x9f, 0xe5, 0x53, 0x09, 0xea, 0x2b, 0xcb, 0x25, 0xaa, 0xa7, 0x96, 0xc3, ++ 0x7b, 0xa5, 0x3f, 0x42, 0xf1, 0x72, 0xea, 0x80, 0x93, 0xd1, 0xd7, 0xd7, ++ 0x14, 0x2a, 0x14, 0xde, 0x8b, 0x08, 0xff, 0xce, 0x44, 0xf5, 0x5a, 0xca, ++ 0xb7, 0x9e, 0xef, 0x10, 0x42, 0xa0, 0xf7, 0x2f, 0xda, 0x62, 0xda, 0x65, ++ 0x29, 0x84, 0x7d, 0xac, 0x4a, 0x76, 0xc0, 0xe7, 0x76, 0x01, 0xf9, 0xd6, ++ 0xa2, 0x8e, 0x99, 0xc5, 0xbd, 0xb4, 0xbc, 0x6a, 0xff, 0x24, 0xc4, 0x7f, ++ 0xea, 0x54, 0x46, 0x97, 0xab, 0x82, 0x4e, 0x94, 0x7f, 0xd3, 0x39, 0x1f, ++ 0x5c, 0x62, 0x0a, 0x1a, 0x51, 0xcf, 0x7e, 0x8a, 0xf9, 0xf1, 0x68, 0xff, ++ 0xa8, 0x2f, 0x37, 0xd0, 0x46, 0xd9, 0xe5, 0x43, 0xe1, 0x00, 0xfc, 0x5b, ++ 0x47, 0x0f, 0x41, 0x7d, 0x1c, 0x62, 0x7a, 0x1f, 0xe7, 0xa7, 0x7b, 0x13, ++ 0xe2, 0x0f, 0xa3, 0x13, 0xf8, 0x7a, 0x5f, 0x52, 0x7b, 0xaa, 0xe7, 0xe9, ++ 0xe9, 0x23, 0xa0, 0xc9, 0x1d, 0xc6, 0xe7, 0x88, 0x92, 0x05, 0x7c, 0x4e, ++ 0xe3, 0xc3, 0x66, 0x97, 0xaf, 0x3c, 0x1d, 0xf9, 0x58, 0x51, 0x16, 0xe0, ++ 0x97, 0xe2, 0x93, 0xf1, 0xc9, 0x7d, 0x02, 0xc2, 0xb5, 0x91, 0xb4, 0x30, ++ 0xb9, 0xc1, 0xf9, 0x7d, 0x6c, 0x5c, 0x2e, 0x2f, 0x4e, 0x49, 0x01, 0x26, ++ 0x97, 0x4c, 0x9b, 0xf0, 0x79, 0x59, 0x7a, 0x21, 0x8e, 0xb7, 0x0a, 0xe4, ++ 0x0d, 0xfa, 0xd5, 0x99, 0xfd, 0x37, 0x12, 0x1d, 0x5c, 0xf6, 0x3d, 0x74, ++ 0x50, 0x03, 0x74, 0x40, 0xeb, 0x1b, 0x3e, 0x26, 0xa1, 0x8b, 0xe9, 0x78, ++ 0x0d, 0x6b, 0x48, 0xa8, 0x71, 0x32, 0x7b, 0xda, 0x27, 0xa3, 0x1c, 0x64, ++ 0xf2, 0xd0, 0xcc, 0xe3, 0x1d, 0x66, 0x16, 0x0f, 0xf9, 0x3e, 0xb9, 0x98, ++ 0x2c, 0x07, 0x87, 0xc8, 0xbd, 0x24, 0x79, 0x97, 0x65, 0xe4, 0xf2, 0x8d, ++ 0xe3, 0x39, 0xd1, 0xdf, 0x0d, 0xf2, 0x7e, 0xfa, 0x9a, 0xa0, 0x04, 0x7e, ++ 0xcf, 0x51, 0x0e, 0xf5, 0x92, 0xac, 0x8c, 0xb8, 0xfe, 0xd2, 0xfc, 0x8e, ++ 0xd9, 0xac, 0x5c, 0x00, 0x65, 0x1f, 0x19, 0x6d, 0x03, 0xff, 0xcd, 0xcc, ++ 0xbd, 0x1e, 0xf0, 0x3b, 0x53, 0x7b, 0x1d, 0xf6, 0x95, 0x95, 0xc2, 0x65, ++ 0x27, 0x7d, 0xbf, 0x9d, 0xeb, 0xb7, 0x8f, 0x7a, 0x18, 0xdd, 0x7b, 0x8c, ++ 0x8c, 0x7e, 0x0d, 0xb2, 0x8f, 0x94, 0xd9, 0x00, 0x2f, 0x61, 0xb4, 0x67, ++ 0xa3, 0x19, 0xc4, 0x01, 0xf4, 0xa8, 0xc1, 0x73, 0xbb, 0x9d, 0xb6, 0x2b, ++ 0x87, 0x76, 0x4c, 0x1e, 0xc5, 0xda, 0x9b, 0x49, 0x47, 0x4a, 0x42, 0xfb, ++ 0xaa, 0x83, 0x16, 0xe4, 0xab, 0xe7, 0x5e, 0xb0, 0x07, 0x4d, 0xa8, 0x77, ++ 0xf8, 0x0b, 0x9c, 0xb4, 0xbf, 0xcc, 0xf7, 0x4d, 0xa8, 0x87, 0x9e, 0x39, ++ 0x68, 0x47, 0xf9, 0x79, 0x86, 0xcb, 0x3f, 0xb7, 0xe6, 0x17, 0x20, 0xeb, ++ 0xb0, 0xbf, 0xbb, 0x00, 0xaf, 0x53, 0x80, 0x9a, 0xaa, 0x46, 0x81, 0x7f, ++ 0x95, 0x08, 0x97, 0x8f, 0x02, 0x16, 0xa8, 0xe9, 0x61, 0x8d, 0xce, 0x91, ++ 0xfc, 0xdd, 0xbc, 0xbe, 0x30, 0x7c, 0x1d, 0xa3, 0x2b, 0x13, 0xda, 0x93, ++ 0xe7, 0x9c, 0x91, 0x3b, 0xa1, 0x4c, 0xe7, 0x43, 0x40, 0xbf, 0xbe, 0x95, ++ 0xe3, 0xb9, 0x79, 0xff, 0xac, 0xb2, 0x7b, 0xe8, 0xfb, 0x66, 0x9f, 0xcd, ++ 0xcb, 0xa0, 0xef, 0x2f, 0x03, 0x7a, 0x35, 0x49, 0xb7, 0x5f, 0x07, 0x7e, ++ 0x97, 0x39, 0xd2, 0x9a, 0xe8, 0x5d, 0x74, 0x1d, 0x8d, 0x79, 0x36, 0x87, ++ 0x89, 0x36, 0xa9, 0x2e, 0xf8, 0xb7, 0xb7, 0x6f, 0xa0, 0xe5, 0x4f, 0xf6, ++ 0x1b, 0x88, 0x09, 0xf0, 0xbc, 0x67, 0x56, 0x1d, 0x19, 0x3d, 0x32, 0xff, ++ 0x5d, 0x19, 0x34, 0x7c, 0x18, 0x49, 0xd8, 0x2f, 0xb7, 0xec, 0xd5, 0x97, ++ 0x1b, 0xfb, 0xf4, 0xe5, 0x66, 0x22, 0x7f, 0x18, 0x49, 0xe0, 0xc7, 0x5b, ++ 0xd2, 0xed, 0xee, 0x53, 0x13, 0x91, 0x77, 0x78, 0xbf, 0xa5, 0xf4, 0x6d, ++ 0x32, 0xb5, 0x7c, 0xbc, 0x93, 0xce, 0xd7, 0xf4, 0x2b, 0x13, 0xca, 0xa3, ++ 0xc6, 0x74, 0xff, 0xf6, 0x74, 0xe0, 0xb7, 0x62, 0xf4, 0x65, 0x80, 0xb3, ++ 0xa9, 0xe0, 0xb3, 0xc9, 0xe0, 0xc7, 0xa8, 0x2a, 0xf8, 0x1a, 0xe3, 0x3e, ++ 0xe7, 0xee, 0x25, 0x5e, 0x98, 0xf7, 0x39, 0xcb, 0x4c, 0x94, 0xdf, 0xe7, ++ 0x7a, 0x2d, 0x4a, 0x20, 0x81, 0x7f, 0x35, 0x73, 0xfa, 0xef, 0xc9, 0xaf, ++ 0xc5, 0xfa, 0x9e, 0xad, 0x26, 0x45, 0x60, 0xf5, 0xb5, 0x53, 0x2a, 0x41, ++ 0x1f, 0xc4, 0xb1, 0xe1, 0xcf, 0x2c, 0x52, 0xf8, 0x37, 0x6f, 0x99, 0xfb, ++ 0x09, 0xda, 0x4d, 0xa0, 0xb5, 0xd3, 0x72, 0x0f, 0xe8, 0x97, 0xd0, 0xee, ++ 0x59, 0x21, 0xb8, 0x16, 0xf4, 0xc7, 0x2d, 0x4c, 0xee, 0x9d, 0xa6, 0xfa, ++ 0xa3, 0x99, 0xce, 0xe7, 0x23, 0xce, 0x57, 0x9b, 0xa5, 0x81, 0x39, 0x66, ++ 0xfa, 0x9f, 0x3d, 0xae, 0x9a, 0xf1, 0xc0, 0x5f, 0xe4, 0x6f, 0x64, 0x1f, ++ 0xe0, 0x7f, 0x3d, 0x74, 0x95, 0xa0, 0xef, 0x1e, 0xe4, 0x7c, 0x5e, 0xf3, ++ 0xf3, 0x5c, 0x01, 0x7e, 0x9e, 0x31, 0xe8, 0xe7, 0x39, 0x08, 0x7c, 0xa3, ++ 0xd1, 0x1c, 0x31, 0xce, 0xa4, 0xfd, 0x5c, 0xfa, 0xcd, 0x97, 0xc8, 0x97, ++ 0x57, 0xb4, 0x2e, 0x46, 0xbd, 0x3e, 0xae, 0xe7, 0x9a, 0x90, 0x8f, 0xac, ++ 0xb8, 0xcb, 0x8f, 0xef, 0x5f, 0xec, 0xbd, 0x0c, 0xd7, 0x75, 0x8a, 0xae, ++ 0x1b, 0xe0, 0x73, 0x6a, 0x3b, 0xb3, 0xe7, 0x56, 0xe4, 0xda, 0x82, 0x30, ++ 0xbf, 0x4b, 0x9d, 0x4c, 0xff, 0x5d, 0x41, 0xdb, 0x09, 0xc2, 0x50, 0xb8, ++ 0x24, 0xc3, 0xe1, 0xf7, 0xdb, 0x2e, 0xf3, 0x00, 0xbe, 0x7f, 0x4f, 0xd8, ++ 0x78, 0x81, 0x3e, 0xa6, 0x27, 0xfc, 0xde, 0x11, 0x4e, 0x45, 0xfe, 0xa3, ++ 0xb4, 0xa4, 0x82, 0x9e, 0xd7, 0xbc, 0xe5, 0xb2, 0x4f, 0x80, 0x6f, 0xad, ++ 0xd8, 0x2e, 0x79, 0x41, 0x8e, 0x93, 0x43, 0x76, 0xf4, 0x8b, 0xac, 0xd8, ++ 0x3e, 0x7b, 0xfc, 0x32, 0x1b, 0xf4, 0xf3, 0x45, 0xfa, 0x4c, 0x80, 0xdb, ++ 0x8e, 0xd9, 0x0e, 0x09, 0xdf, 0x4b, 0xbe, 0x20, 0xf3, 0xaf, 0x84, 0x2f, ++ 0xa5, 0xef, 0xe5, 0x1d, 0x17, 0x29, 0xb0, 0x4f, 0x8e, 0x6d, 0x37, 0xb1, ++ 0xf9, 0x39, 0xcd, 0x4f, 0xc2, 0xfc, 0x2f, 0xfd, 0x46, 0x42, 0xba, 0x97, ++ 0x45, 0xe2, 0x07, 0x7d, 0xb5, 0xc7, 0xa8, 0x8e, 0x87, 0xfd, 0xa6, 0x6c, ++ 0xdb, 0x33, 0x07, 0xe0, 0xfa, 0xfb, 0x79, 0x39, 0x22, 0x7e, 0xff, 0x8c, ++ 0x40, 0x1c, 0x00, 0x07, 0x67, 0x6b, 0x26, 0xbc, 0x5f, 0x21, 0xc8, 0x3e, ++ 0xd8, 0x5f, 0xf5, 0x5b, 0x56, 0xd6, 0x26, 0xea, 0x23, 0xf7, 0xa7, 0x33, ++ 0x7f, 0xd4, 0xcc, 0x82, 0x35, 0x99, 0x11, 0x1b, 0xd2, 0xfb, 0x75, 0x20, ++ 0xe7, 0x1a, 0xb7, 0x1b, 0x50, 0xaf, 0x3b, 0x36, 0xff, 0xbd, 0xb7, 0x6f, ++ 0x70, 0xc7, 0xe9, 0x7d, 0x85, 0xd4, 0x7d, 0xdd, 0xf4, 0x04, 0x7d, 0xa3, ++ 0x79, 0xdb, 0x95, 0x9c, 0x1e, 0xa8, 0xc4, 0xa6, 0x70, 0x5a, 0xc1, 0xe1, ++ 0x64, 0x2a, 0x58, 0x53, 0x0c, 0xe3, 0x7e, 0x1f, 0xfd, 0xaf, 0xb8, 0xaf, ++ 0xa5, 0x98, 0xc5, 0x6b, 0xbe, 0x7b, 0x1f, 0xc4, 0xf6, 0xf7, 0x36, 0xb6, ++ 0x1f, 0xfe, 0x4c, 0xe5, 0x3d, 0xda, 0xeb, 0xb9, 0x2e, 0x9d, 0x7e, 0x3f, ++ 0x92, 0x1d, 0xa4, 0xf9, 0xa3, 0xcd, 0x5e, 0xa2, 0xee, 0xb1, 0x61, 0x5c, ++ 0x51, 0x05, 0x3b, 0xb7, 0xc0, 0x2d, 0xe3, 0xfa, 0x0b, 0x80, 0x80, 0xe8, ++ 0x77, 0xf2, 0x7f, 0xac, 0xde, 0xfb, 0x3a, 0x9d, 0xff, 0xbe, 0x74, 0xbf, ++ 0xd9, 0x0d, 0xef, 0x89, 0x5a, 0x06, 0x78, 0x55, 0xa2, 0x8e, 0x2a, 0xaa, ++ 0x4e, 0xc2, 0x92, 0x50, 0xff, 0x21, 0xdb, 0x4c, 0x4c, 0x9f, 0x94, 0x99, ++ 0x5f, 0x6e, 0x73, 0x06, 0x79, 0x72, 0x43, 0xc2, 0x3c, 0x47, 0xb9, 0x99, ++ 0xde, 0x4e, 0xf7, 0xa7, 0x13, 0xfa, 0x39, 0xf3, 0xee, 0xd7, 0x2f, 0x03, ++ 0xfc, 0x9a, 0xf2, 0x3f, 0x9b, 0xcc, 0xe2, 0x6d, 0x5f, 0x62, 0xfc, 0xca, ++ 0x36, 0xc0, 0xe2, 0x9a, 0x36, 0xaf, 0x8f, 0x00, 0x5d, 0x34, 0x0f, 0xcc, ++ 0x23, 0x4b, 0x4b, 0xe3, 0xfc, 0xb0, 0xd9, 0xcb, 0xf8, 0x75, 0xf2, 0xba, ++ 0x96, 0xbb, 0x0d, 0x8c, 0x7f, 0xb9, 0xa3, 0xd8, 0xcf, 0xec, 0x0c, 0xb6, ++ 0xcf, 0x34, 0x7f, 0xf0, 0xd6, 0xd6, 0x14, 0xf4, 0xfb, 0x6d, 0x75, 0x07, ++ 0x2d, 0xcc, 0xbe, 0x0d, 0x10, 0xe0, 0xe7, 0x57, 0x55, 0x48, 0x2c, 0x1e, ++ 0xc3, 0xf5, 0x12, 0x1f, 0xf7, 0xa3, 0x99, 0xd5, 0x17, 0x09, 0xc4, 0x6b, ++ 0x88, 0x57, 0xf2, 0x8e, 0xa5, 0xe5, 0xb0, 0xfa, 0x51, 0x47, 0x3a, 0x2d, ++ 0xbf, 0x5e, 0x31, 0xdb, 0x2b, 0xd1, 0xb2, 0x4d, 0x7d, 0xa2, 0x73, 0x34, ++ 0xac, 0xdb, 0x6b, 0xe0, 0xf5, 0x63, 0xd0, 0x9f, 0xf8, 0xda, 0x8c, 0x99, ++ 0xa8, 0x9f, 0x5c, 0xa5, 0x4a, 0x38, 0x2e, 0xa9, 0x4f, 0x45, 0x7b, 0x3d, ++ 0xac, 0xbe, 0xe5, 0x5e, 0x4a, 0xc7, 0xbd, 0x9a, 0xa8, 0xe9, 0x27, 0xe9, ++ 0x18, 0x35, 0x54, 0x58, 0x03, 0x1e, 0xc3, 0x30, 0x36, 0xc5, 0x97, 0x49, ++ 0xf6, 0x4f, 0x71, 0x27, 0xd8, 0xe1, 0x57, 0x7a, 0xe7, 0xa6, 0x9f, 0x4c, ++ 0x94, 0x97, 0x2a, 0x93, 0xff, 0x60, 0x8f, 0xf7, 0xf1, 0xb8, 0xc2, 0x70, ++ 0x70, 0x98, 0x94, 0x3e, 0xf3, 0x07, 0xd0, 0xcf, 0xa5, 0x97, 0x30, 0x3c, ++ 0x7c, 0xfa, 0x0c, 0xb3, 0x3f, 0x3e, 0xb5, 0x30, 0x3f, 0xb7, 0xf6, 0xdd, ++ 0xa7, 0x76, 0x26, 0x67, 0xae, 0x74, 0x6b, 0x76, 0x54, 0x5f, 0x3e, 0xf0, ++ 0xf9, 0x58, 0xf9, 0xa6, 0x12, 0x5d, 0x9c, 0xd8, 0x6d, 0xec, 0xcb, 0x87, ++ 0x7d, 0xf6, 0x07, 0x41, 0xdf, 0xcf, 0xaa, 0x4e, 0x11, 0xe3, 0xb7, 0x2b, ++ 0x3b, 0x09, 0xc6, 0x6b, 0x3f, 0xfd, 0xd9, 0xf3, 0xf9, 0xc0, 0x6f, 0x3f, ++ 0xd9, 0xf3, 0x7c, 0xfe, 0xe2, 0x84, 0xf9, 0x25, 0xb7, 0xd3, 0x9e, 0xd7, ++ 0xbb, 0xf5, 0x7e, 0x29, 0xcd, 0x4f, 0xe9, 0xe6, 0x71, 0xeb, 0xc5, 0x5e, ++ 0x13, 0xf3, 0x07, 0x8e, 0xe0, 0xa7, 0xd4, 0xbe, 0x27, 0x5b, 0x98, 0x3d, ++ 0x36, 0x48, 0xb9, 0x3b, 0xd0, 0x9d, 0xd6, 0x6e, 0xb0, 0x3e, 0x45, 0x05, ++ 0xbd, 0x72, 0x90, 0x98, 0x91, 0x9f, 0x2d, 0x1e, 0xe0, 0x7e, 0x4f, 0x55, ++ 0x2d, 0x72, 0x83, 0xfd, 0xa0, 0xb5, 0x4f, 0xea, 0xbf, 0x1b, 0xe8, 0x87, ++ 0xce, 0x4b, 0xe8, 0x17, 0xd0, 0x3e, 0xb7, 0x96, 0x46, 0x91, 0xbf, 0xae, ++ 0x34, 0xfb, 0x5e, 0x1e, 0xa5, 0x40, 0xde, 0x8a, 0x8a, 0xf8, 0x99, 0x0b, ++ 0x78, 0x14, 0x80, 0x5e, 0x55, 0x23, 0xac, 0x5b, 0xe6, 0x76, 0x9e, 0x49, ++ 0xf6, 0x35, 0xb9, 0x33, 0xc0, 0xef, 0xa1, 0xc7, 0x63, 0x8e, 0xdb, 0xc1, ++ 0xe3, 0x98, 0x6e, 0xc4, 0xbb, 0xb1, 0xc9, 0x26, 0x83, 0x7c, 0xc8, 0x6c, ++ 0xe7, 0xfc, 0xfa, 0x0e, 0x11, 0xed, 0x17, 0x63, 0x8e, 0xc7, 0x06, 0x7c, ++ 0xe9, 0xd2, 0xe2, 0x94, 0x0e, 0x88, 0xcb, 0xbb, 0x53, 0x52, 0x27, 0x83, ++ 0x5f, 0x3d, 0x2f, 0xa7, 0x04, 0xbf, 0x0f, 0x54, 0x31, 0xba, 0x0e, 0x64, ++ 0x12, 0xf4, 0x5b, 0x65, 0x93, 0x16, 0x01, 0xf9, 0xad, 0x83, 0xf9, 0xc1, ++ 0x73, 0xa7, 0x12, 0x07, 0xe4, 0x81, 0xf4, 0xbb, 0x99, 0xde, 0xe0, 0x21, ++ 0xde, 0x2d, 0x12, 0xea, 0x83, 0x7d, 0x02, 0xc6, 0x03, 0xf8, 0xfa, 0x35, ++ 0xbe, 0x0e, 0xf4, 0x02, 0x7c, 0xee, 0x53, 0xc1, 0x8c, 0xf4, 0x22, 0x0c, ++ 0x08, 0xa8, 0xdf, 0x49, 0x62, 0xdf, 0x42, 0xe8, 0x77, 0x24, 0xfa, 0x79, ++ 0x34, 0x89, 0x7e, 0x1e, 0xfd, 0x3b, 0xd3, 0xcf, 0xe3, 0xda, 0x78, 0x43, ++ 0xe8, 0xc7, 0x8f, 0x71, 0xbc, 0xc5, 0x1e, 0xf3, 0xf0, 0xf4, 0xc3, 0xfd, ++ 0xae, 0xe7, 0xfd, 0xfd, 0x48, 0x71, 0xc4, 0x3b, 0xcc, 0x9a, 0x1f, 0x5a, ++ 0x80, 0xf5, 0xd6, 0xf2, 0xfe, 0x6a, 0xcd, 0xb6, 0x90, 0x34, 0x19, 0xf9, ++ 0xc3, 0x67, 0x89, 0xfe, 0xd4, 0x6d, 0x54, 0xcf, 0x04, 0x7b, 0x44, 0x8b, ++ 0x3b, 0x8e, 0x6a, 0x5f, 0xa4, 0x30, 0x3d, 0x3d, 0x1c, 0x01, 0xbb, 0xdc, ++ 0x7a, 0x91, 0x19, 0xe5, 0xdc, 0x03, 0x62, 0xb8, 0x10, 0xf4, 0xf9, 0xe4, ++ 0x38, 0x24, 0x44, 0x44, 0x81, 0xdf, 0x03, 0x8f, 0x41, 0xbf, 0x62, 0x6b, ++ 0x95, 0xef, 0x64, 0x7a, 0x82, 0xbc, 0x3f, 0xc4, 0xec, 0x86, 0xa6, 0xbb, ++ 0x54, 0x7c, 0x3f, 0x6b, 0x80, 0xc9, 0xf7, 0xe6, 0x22, 0x23, 0xea, 0x9d, ++ 0xcd, 0xfd, 0x42, 0x00, 0xf0, 0xdc, 0xe4, 0x33, 0x06, 0xcd, 0x85, 0x18, ++ 0x77, 0x59, 0x84, 0x72, 0xfb, 0x41, 0x8b, 0xc2, 0xe2, 0x28, 0xca, 0x5a, ++ 0x8c, 0xa3, 0xdc, 0xab, 0xb0, 0x38, 0x4b, 0xcc, 0x8f, 0x1a, 0xd9, 0x71, ++ 0x0f, 0xd0, 0x5b, 0xbd, 0x0d, 0xfd, 0x0e, 0xc9, 0xf1, 0x98, 0xe7, 0xfe, ++ 0x22, 0xb1, 0xf1, 0xc7, 0x12, 0x1c, 0xbf, 0xa7, 0x8c, 0xc5, 0x7f, 0x7a, ++ 0xe6, 0x2a, 0xe8, 0xd7, 0x48, 0x8e, 0xb3, 0x91, 0x4e, 0xfd, 0xfe, 0xd5, ++ 0xe2, 0x2c, 0x83, 0x76, 0x0a, 0x18, 0x3a, 0xde, 0xe2, 0x8d, 0x16, 0xc4, ++ 0x43, 0x8e, 0xc4, 0xe0, 0x4c, 0xd2, 0xcc, 0x4c, 0xbe, 0x0c, 0xe5, 0x03, ++ 0xe8, 0xaf, 0xcd, 0x9c, 0xca, 0x11, 0xc3, 0xe3, 0x21, 0xb1, 0x7d, 0x4d, ++ 0x39, 0x03, 0x94, 0x73, 0x78, 0xbd, 0x16, 0xbf, 0xb1, 0x97, 0xfa, 0x0a, ++ 0x41, 0xc3, 0xbd, 0xf1, 0x91, 0x67, 0x5f, 0x49, 0xc9, 0xf8, 0x6b, 0xf2, ++ 0x1d, 0x5a, 0x1f, 0xf8, 0xce, 0x7c, 0x07, 0x62, 0xac, 0x85, 0x7a, 0x33, ++ 0x68, 0xcf, 0xbc, 0x1e, 0xa6, 0x4d, 0xe5, 0xad, 0x56, 0x56, 0x2d, 0x0a, ++ 0xc4, 0x77, 0xe2, 0xf5, 0x32, 0xd5, 0x1b, 0xcd, 0xfd, 0x02, 0xcf, 0x97, ++ 0x38, 0x70, 0xc5, 0x6c, 0x2a, 0x82, 0x07, 0x05, 0x3e, 0x7e, 0xe0, 0xbe, ++ 0x0d, 0x6a, 0x29, 0xc6, 0x93, 0x75, 0xe3, 0x25, 0xce, 0x4f, 0x4e, 0xea, ++ 0xdf, 0x40, 0xfb, 0xb7, 0x29, 0xda, 0xf7, 0xcf, 0xcc, 0x85, 0xfe, 0x1e, ++ 0x2d, 0xe7, 0xe5, 0xc0, 0xb7, 0x5d, 0x2a, 0x9d, 0xdf, 0xc3, 0x06, 0x7d, ++ 0x7f, 0x08, 0x52, 0xde, 0x1e, 0x0a, 0xda, 0x78, 0x47, 0x1e, 0x9b, 0xf3, ++ 0xc0, 0xc6, 0x19, 0x71, 0xb9, 0x4f, 0xf5, 0x00, 0x4b, 0xc6, 0x94, 0xb8, ++ 0xfc, 0x5f, 0xff, 0x5e, 0x6d, 0xf7, 0x05, 0x74, 0x2c, 0xab, 0xe3, 0x0b, ++ 0x23, 0xc8, 0x55, 0x4d, 0x8e, 0x37, 0xbb, 0x59, 0xfe, 0x43, 0xf2, 0x7e, ++ 0x4d, 0xcf, 0x60, 0xfb, 0x95, 0xea, 0xaf, 0xe9, 0x19, 0x09, 0x7a, 0x6d, ++ 0x2d, 0x8f, 0x5f, 0x52, 0x7d, 0x76, 0x0e, 0x6c, 0xad, 0xe6, 0x35, 0x3e, ++ 0x02, 0xf1, 0x4b, 0xaa, 0x2f, 0x64, 0xc1, 0x77, 0x67, 0xde, 0xfd, 0xec, ++ 0xd4, 0x11, 0xc0, 0xdf, 0xfc, 0x4f, 0x51, 0x9f, 0x6f, 0xfe, 0x4a, 0x66, ++ 0x7e, 0x17, 0xaa, 0x77, 0x80, 0x7e, 0x6e, 0xe6, 0x74, 0x4e, 0xfa, 0x0d, ++ 0x28, 0x6f, 0x35, 0x3a, 0x58, 0xc5, 0xf9, 0x4f, 0x8f, 0x93, 0xca, 0x7b, ++ 0xa0, 0xd7, 0x43, 0xc2, 0x94, 0x00, 0xd2, 0x45, 0x4b, 0xfe, 0xb5, 0x14, ++ 0x07, 0xf7, 0x64, 0xa8, 0x85, 0xd8, 0x3f, 0xb7, 0xbb, 0x92, 0xe7, 0x3b, ++ 0x3d, 0x83, 0xd9, 0xc7, 0xcd, 0x25, 0x55, 0xbd, 0xc5, 0xd0, 0xff, 0x6e, ++ 0x81, 0x80, 0xbc, 0xdf, 0x50, 0xf2, 0x61, 0x26, 0xe8, 0x25, 0xcd, 0x03, ++ 0x1f, 0x64, 0x2e, 0x4b, 0x68, 0xb7, 0xb2, 0xff, 0x51, 0x84, 0xc3, 0xca, ++ 0xbd, 0x86, 0x61, 0xd7, 0x3f, 0x3d, 0x43, 0xc2, 0xf5, 0x37, 0xbd, 0x70, ++ 0x00, 0xfd, 0x83, 0x9f, 0x06, 0x05, 0xdc, 0xcb, 0xf5, 0x72, 0xb0, 0x6b, ++ 0x3a, 0x2d, 0xd7, 0xd7, 0x8b, 0xa0, 0xa1, 0x91, 0x8a, 0xe0, 0xa2, 0x1b, ++ 0xd0, 0xdf, 0x5f, 0x67, 0x24, 0x63, 0xe9, 0xfa, 0x14, 0xae, 0xcf, 0x34, ++ 0xef, 0xbd, 0x26, 0x30, 0x1d, 0xec, 0x33, 0xfa, 0x4f, 0xa0, 0xaf, 0xb6, ++ 0xfa, 0x96, 0xa3, 0xdc, 0xdb, 0x5a, 0x67, 0xb6, 0x41, 0xdc, 0xa1, 0xb9, ++ 0x64, 0xf1, 0xad, 0x08, 0x07, 0x47, 0x8a, 0x0a, 0x70, 0xd8, 0x50, 0x52, ++ 0x95, 0x0d, 0xe3, 0x34, 0xcd, 0x9b, 0xe3, 0xc0, 0x38, 0x01, 0xd5, 0xaf, ++ 0xa0, 0xbe, 0xe9, 0xae, 0x1f, 0xa2, 0xdf, 0x44, 0x9b, 0xd7, 0x86, 0x7e, ++ 0x43, 0x0d, 0xe8, 0x5d, 0x95, 0x54, 0xcf, 0xfa, 0x25, 0x9d, 0x77, 0x9e, ++ 0xeb, 0xf2, 0x1a, 0x2f, 0xdd, 0x7f, 0xa3, 0xa4, 0x7d, 0x65, 0xb7, 0xd9, ++ 0x20, 0x6e, 0x3c, 0x3c, 0xff, 0x0d, 0x67, 0x32, 0x7c, 0x76, 0x08, 0xbe, ++ 0xc0, 0xd5, 0x15, 0xe8, 0x27, 0x24, 0x89, 0x7e, 0xbf, 0x82, 0x7e, 0xa6, ++ 0xcf, 0xcd, 0xcf, 0x30, 0xea, 0xe2, 0x0c, 0xf3, 0x33, 0x64, 0x6c, 0x37, ++ 0x23, 0x10, 0x9e, 0x05, 0xb4, 0x77, 0x58, 0x8e, 0x58, 0x41, 0xef, 0x6d, ++ 0x26, 0xea, 0xe7, 0x60, 0x5f, 0x12, 0x9f, 0x4d, 0xd9, 0x83, 0x78, 0x62, ++ 0x7c, 0xc4, 0xdd, 0xa6, 0xa0, 0xff, 0xc8, 0xec, 0x8e, 0x3c, 0x70, 0x01, ++ 0xd4, 0xcf, 0x90, 0xd1, 0x7e, 0x20, 0x72, 0xe4, 0x11, 0x18, 0xf7, 0x4c, ++ 0x97, 0xdb, 0xbb, 0x81, 0x70, 0xfa, 0x85, 0xf2, 0x5d, 0xa5, 0x41, 0xe0, ++ 0xa3, 0xa1, 0x0c, 0xff, 0xcd, 0x40, 0xaf, 0x95, 0x5c, 0x7f, 0x3c, 0xf3, ++ 0xc2, 0x65, 0x65, 0xe0, 0x67, 0xd3, 0xf4, 0xa3, 0xae, 0x9d, 0x96, 0x20, ++ 0xc4, 0x09, 0xbb, 0xec, 0xca, 0x3f, 0xd6, 0x00, 0x1f, 0xfc, 0x0f, 0x99, ++ 0xc5, 0xc5, 0xcd, 0xd1, 0xf0, 0x2c, 0xc0, 0xc7, 0x9f, 0x5d, 0xd8, 0x6f, ++ 0x97, 0x25, 0xd8, 0x05, 0xf8, 0x0f, 0x6c, 0x32, 0x60, 0xfd, 0x0b, 0x76, ++ 0xff, 0x2a, 0xa0, 0x9b, 0x8f, 0xe7, 0xd5, 0x14, 0x63, 0x5e, 0x8e, 0x2d, ++ 0x50, 0x0c, 0x71, 0x60, 0x83, 0xbb, 0x9b, 0x80, 0x9e, 0x40, 0xcd, 0x05, ++ 0xf4, 0x27, 0x98, 0xdd, 0x3e, 0x02, 0xf1, 0xd2, 0x59, 0x81, 0x45, 0xb2, ++ 0x00, 0x7c, 0x3e, 0x49, 0xef, 0x98, 0xc5, 0xf3, 0x4b, 0x91, 0x79, 0xd2, ++ 0xf7, 0x55, 0x9c, 0x8d, 0x8d, 0xa5, 0x54, 0x70, 0xca, 0x8c, 0x5b, 0xa0, ++ 0xe3, 0xdb, 0xf4, 0xb8, 0x1e, 0x72, 0xfc, 0xeb, 0x05, 0x32, 0xbc, 0xd4, ++ 0xf4, 0x13, 0xd1, 0xcc, 0xe2, 0x59, 0xd5, 0x75, 0x29, 0x44, 0x02, 0xba, ++ 0x5f, 0x17, 0x7d, 0x59, 0x04, 0xff, 0xb5, 0x3b, 0x8c, 0xfa, 0x6b, 0x63, ++ 0x9f, 0x80, 0xe3, 0x34, 0x96, 0x3c, 0x8b, 0xf9, 0x62, 0xb7, 0xf0, 0xbc, ++ 0xa4, 0x58, 0x7e, 0x90, 0x1c, 0xc1, 0x7c, 0xa9, 0xf6, 0x0c, 0x2b, 0x97, ++ 0xe3, 0x1d, 0x8c, 0xde, 0x49, 0x18, 0xed, 0x65, 0xf2, 0x34, 0xc3, 0x27, ++ 0x21, 0x11, 0xcc, 0xa3, 0x8a, 0xdb, 0x11, 0x6b, 0xf1, 0x3b, 0xad, 0x3f, ++ 0x23, 0xf7, 0xbb, 0x37, 0x72, 0xbf, 0x0b, 0x95, 0x60, 0x58, 0xff, 0x50, ++ 0x86, 0xe6, 0x77, 0xbf, 0x8f, 0x3f, 0xb5, 0xbc, 0x2f, 0x36, 0xee, 0x66, ++ 0x21, 0xac, 0x4a, 0x00, 0xd7, 0x32, 0x41, 0xe7, 0x2f, 0xd6, 0x9e, 0x7b, ++ 0x78, 0xfb, 0xb4, 0xa3, 0xd1, 0x39, 0xb0, 0x7f, 0xa3, 0x2f, 0x68, 0x79, ++ 0x9c, 0x2c, 0x4f, 0xb3, 0x77, 0xca, 0x04, 0x2f, 0xa8, 0x4e, 0x43, 0xf2, ++ 0x38, 0xfb, 0x3f, 0x9f, 0x03, 0x74, 0x43, 0x15, 0x6d, 0xdc, 0xaf, 0x4d, ++ 0xfd, 0xe7, 0x97, 0xc7, 0xf9, 0x73, 0x0e, 0xd7, 0xff, 0xf6, 0x3c, 0x4e, ++ 0xaf, 0xa0, 0xee, 0xa2, 0xcf, 0xfd, 0x19, 0x4e, 0x7d, 0x1e, 0xa7, 0x97, ++ 0xc1, 0x4f, 0x8b, 0xb3, 0x25, 0xe7, 0x6f, 0x9e, 0xc9, 0x0e, 0xc9, 0x2c, ++ 0x1f, 0x2b, 0xb2, 0x63, 0x0f, 0xd0, 0x67, 0xbf, 0x09, 0xf3, 0xbc, 0x6a, ++ 0xfb, 0x7f, 0xfd, 0x0e, 0xc8, 0xc7, 0x5a, 0x33, 0xe9, 0x83, 0x38, 0x64, ++ 0xb2, 0x9e, 0xb1, 0xc6, 0x71, 0xcd, 0x21, 0xa0, 0xcf, 0xc1, 0xd3, 0xa7, ++ 0x76, 0xdc, 0x4f, 0x20, 0x8f, 0xf7, 0x39, 0x2f, 0xe6, 0x73, 0x24, 0xe9, ++ 0x0f, 0xc9, 0x76, 0xc2, 0x2e, 0xf8, 0x24, 0x7b, 0x64, 0x7d, 0xef, 0xad, ++ 0x0c, 0xbd, 0xbe, 0x17, 0x2b, 0xff, 0xb7, 0xeb, 0x7b, 0x4c, 0x9f, 0x0f, ++ 0xec, 0x61, 0xf9, 0x03, 0x1a, 0x3f, 0x6f, 0xe6, 0xf6, 0xd9, 0x60, 0xfd, ++ 0xd9, 0x54, 0x90, 0x33, 0xff, 0x1e, 0x9b, 0x4f, 0x52, 0x9e, 0xc3, 0x6e, ++ 0x9e, 0xe7, 0x30, 0x30, 0x7c, 0x9e, 0x83, 0xcc, 0xf3, 0x85, 0xa8, 0xbe, ++ 0x1e, 0x40, 0x3a, 0xd9, 0xc7, 0xe2, 0x3a, 0xc7, 0x9f, 0xb4, 0x22, 0xff, ++ 0x38, 0xeb, 0x90, 0x77, 0x81, 0xbe, 0x74, 0xda, 0x1e, 0xbd, 0x13, 0x80, ++ 0x25, 0x73, 0x3d, 0xa9, 0xe3, 0x90, 0x49, 0x01, 0x7e, 0x41, 0xf9, 0x1d, ++ 0xf2, 0xef, 0xc0, 0x3e, 0x03, 0x8b, 0xd3, 0x40, 0xdc, 0x06, 0xe2, 0x38, ++ 0x87, 0xc7, 0xf3, 0x38, 0x0e, 0x8f, 0x17, 0x1d, 0xb4, 0xa2, 0xde, 0xd2, ++ 0x90, 0xaa, 0xa4, 0x41, 0x7b, 0x2d, 0x4e, 0xf3, 0x2b, 0x2e, 0x6f, 0x1a, ++ 0x52, 0x58, 0x7c, 0xa6, 0xd3, 0xea, 0xff, 0x32, 0x63, 0x98, 0xb8, 0xcd, ++ 0x4e, 0xae, 0x7f, 0xed, 0xa4, 0x5d, 0x39, 0xa0, 0xbf, 0x77, 0x4c, 0x3c, ++ 0x8e, 0x4d, 0x19, 0x04, 0xd8, 0x3b, 0x0f, 0xe6, 0xb1, 0xb8, 0x03, 0x8f, ++ 0xdb, 0x0c, 0xf2, 0xb8, 0xcd, 0x47, 0x25, 0x62, 0xc8, 0xc8, 0xfc, 0x10, ++ 0xe8, 0xa7, 0x52, 0x3a, 0x65, 0x92, 0x4d, 0xeb, 0x95, 0x77, 0x2c, 0x41, ++ 0x85, 0xf9, 0xb3, 0xcc, 0x22, 0x95, 0xfb, 0x4b, 0xb4, 0xb8, 0xcd, 0x61, ++ 0xe6, 0xa7, 0x5a, 0xc2, 0xe3, 0x33, 0x1f, 0xcd, 0x9f, 0x83, 0xf9, 0x43, ++ 0xcb, 0x20, 0x3f, 0x5e, 0x02, 0x3f, 0x06, 0xf3, 0x33, 0xc7, 0xf2, 0xf5, ++ 0x89, 0x43, 0x84, 0xf5, 0xdc, 0x42, 0xd9, 0xc5, 0x56, 0x60, 0x31, 0x01, ++ 0x0a, 0xf5, 0x8b, 0xe8, 0x6b, 0x41, 0x14, 0x40, 0x9f, 0x50, 0x3a, 0x68, ++ 0x19, 0x95, 0x65, 0xb5, 0xbb, 0x86, 0x8e, 0xbb, 0xb8, 0x43, 0x44, 0x7b, ++ 0x64, 0x49, 0xa7, 0xde, 0x5f, 0x7e, 0x6e, 0xc3, 0xad, 0x35, 0x20, 0xbf, ++ 0xd7, 0x77, 0xb0, 0xf8, 0x63, 0xa0, 0x53, 0x40, 0xf9, 0xbd, 0x84, 0xa8, ++ 0x1e, 0xd0, 0x37, 0x34, 0x7a, 0x18, 0x9d, 0x99, 0xce, 0xfc, 0x9f, 0x1d, ++ 0xa2, 0x0a, 0xe3, 0x4c, 0xcf, 0x64, 0xfe, 0x09, 0x0a, 0xfa, 0x20, 0xae, ++ 0x8f, 0x3f, 0x3b, 0x0c, 0xdc, 0xcf, 0xce, 0xe7, 0xb1, 0x96, 0x88, 0x21, ++ 0x78, 0x8a, 0x02, 0x7b, 0xae, 0x77, 0xc8, 0x35, 0xc3, 0xca, 0x65, 0xde, ++ 0x5f, 0x87, 0xa1, 0xc5, 0x3c, 0x13, 0xf4, 0xd8, 0x3c, 0x11, 0xfd, 0xbc, ++ 0xe7, 0x8c, 0x6a, 0x1d, 0xfa, 0x49, 0x5d, 0xc5, 0x88, 0xb7, 0x0e, 0x7b, ++ 0x4b, 0x67, 0x0d, 0xab, 0xc7, 0xbd, 0x72, 0xce, 0x12, 0xf5, 0x61, 0xfd, ++ 0xc5, 0x32, 0x53, 0xf4, 0x88, 0xe2, 0x02, 0x3e, 0xe9, 0xc9, 0x64, 0x7a, ++ 0x43, 0xf2, 0x7a, 0x97, 0x75, 0xeb, 0xcb, 0xc9, 0xf1, 0x87, 0x95, 0x41, ++ 0x7d, 0x79, 0x09, 0xf1, 0x8f, 0xcb, 0x86, 0x73, 0x0a, 0x7b, 0xf5, 0xef, ++ 0x3d, 0x99, 0x8c, 0x4f, 0x9d, 0xdb, 0x50, 0xc8, 0xfd, 0xfc, 0x5e, 0xf4, ++ 0xf3, 0x77, 0x18, 0x94, 0x37, 0x0b, 0x81, 0x4f, 0x75, 0xc9, 0xc8, 0x27, ++ 0xd7, 0xe6, 0x32, 0x78, 0x89, 0x79, 0xec, 0x39, 0xda, 0x59, 0x5d, 0x87, ++ 0xfa, 0x81, 0x93, 0xea, 0x15, 0x38, 0x5f, 0x36, 0xff, 0xd1, 0x17, 0xbb, ++ 0x05, 0x90, 0x97, 0x1d, 0x4e, 0x46, 0x97, 0xff, 0xd5, 0x79, 0x27, 0xcf, ++ 0xb7, 0x2a, 0xb3, 0x18, 0xe7, 0xdb, 0x01, 0xca, 0x1d, 0xec, 0xa3, 0x2e, ++ 0x21, 0xc8, 0xe0, 0xc5, 0xe6, 0x7d, 0xbe, 0xfe, 0x8a, 0x25, 0x99, 0x9a, ++ 0x3c, 0x61, 0xfc, 0x27, 0x56, 0xfe, 0xef, 0xb7, 0x37, 0x19, 0x3d, 0x76, ++ 0x49, 0x7c, 0xbf, 0x39, 0x90, 0xff, 0x2c, 0xe6, 0xf1, 0xc6, 0x8f, 0x04, ++ 0xef, 0x93, 0x21, 0x78, 0x6f, 0xa3, 0x7a, 0x01, 0x9d, 0xf7, 0x92, 0x2e, ++ 0xa9, 0x1c, 0xf4, 0x93, 0x59, 0xd7, 0xd8, 0x70, 0x1d, 0x4d, 0x87, 0x2d, ++ 0x41, 0x13, 0xad, 0x6f, 0x5c, 0x13, 0xc9, 0x87, 0x7d, 0xd4, 0x54, 0x15, ++ 0x29, 0x6e, 0x19, 0x06, 0xae, 0x30, 0x5b, 0x59, 0xe3, 0x5b, 0xf4, 0xbb, ++ 0xc5, 0x6e, 0x6a, 0x1f, 0xc0, 0xbe, 0xed, 0xd4, 0xc7, 0xa1, 0x86, 0xc6, ++ 0x15, 0xd5, 0xd6, 0x4c, 0x88, 0x37, 0x88, 0x1f, 0xed, 0xfb, 0x35, 0xe0, ++ 0x7b, 0x9f, 0x05, 0xe5, 0x12, 0xfd, 0xaf, 0x23, 0x26, 0xf0, 0x77, 0xbc, ++ 0x50, 0x88, 0xfa, 0xd2, 0xe4, 0x34, 0x7f, 0x20, 0x13, 0xe4, 0x79, 0x4a, ++ 0x68, 0xc7, 0x4f, 0x0b, 0x41, 0x3f, 0x61, 0xfa, 0x51, 0xe3, 0x80, 0x69, ++ 0x27, 0xe8, 0x7f, 0x8b, 0x3b, 0xf4, 0xe7, 0x6a, 0xc8, 0x46, 0x7d, 0x9c, ++ 0x8b, 0x74, 0xba, 0xd0, 0x9f, 0x41, 0x7a, 0xf4, 0xef, 0xe1, 0xfc, 0x8a, ++ 0xae, 0xdd, 0x90, 0xb8, 0x17, 0x93, 0xf3, 0x9b, 0x8d, 0xfe, 0xf1, 0xa0, ++ 0xd7, 0x5d, 0x7a, 0x09, 0x8b, 0xaf, 0x9f, 0x5e, 0x29, 0x12, 0xc0, 0xef, ++ 0x12, 0xc9, 0xbb, 0x1c, 0xf8, 0xc8, 0x69, 0x8b, 0x5e, 0xef, 0x3e, 0x6d, ++ 0x67, 0xf8, 0x7a, 0x3c, 0x86, 0x67, 0x6f, 0x31, 0xe0, 0xf9, 0xf1, 0x11, ++ 0xf1, 0xec, 0x2d, 0x06, 0x3c, 0x2f, 0x11, 0x89, 0x3f, 0xb1, 0x9f, 0x46, ++ 0xc0, 0x33, 0xc5, 0x6f, 0x03, 0xc7, 0xf3, 0xe9, 0x03, 0x17, 0x15, 0x03, ++ 0x9e, 0x3f, 0xdb, 0x77, 0x51, 0x31, 0xe0, 0x79, 0xb3, 0xa1, 0x5b, 0x85, ++ 0x7d, 0xb3, 0xdb, 0xe5, 0x7f, 0x02, 0xe0, 0x73, 0x72, 0xb6, 0x0f, 0xf5, ++ 0x26, 0x2d, 0xaf, 0xf2, 0x7c, 0xe9, 0xf1, 0x40, 0xa6, 0x5e, 0x1e, 0xc6, ++ 0xca, 0xff, 0x43, 0xfe, 0x8f, 0x91, 0xe4, 0xe0, 0x91, 0xd8, 0x3c, 0xf4, ++ 0x72, 0xd0, 0x6d, 0x54, 0x72, 0x81, 0x1f, 0x2e, 0x36, 0x9b, 0xbe, 0x53, ++ 0x1e, 0xc2, 0xdf, 0xb0, 0xfe, 0x34, 0xb3, 0x09, 0xfd, 0x11, 0x87, 0xbf, ++ 0xfe, 0xe2, 0x21, 0x90, 0x6f, 0x81, 0x01, 0x09, 0xf5, 0x0f, 0xad, 0xbf, ++ 0xc3, 0xb2, 0x7f, 0x0c, 0xf8, 0x0b, 0x0e, 0xbf, 0xe3, 0xf1, 0x06, 0x84, ++ 0x91, 0xfb, 0x6f, 0xe4, 0xf6, 0x8b, 0xc7, 0x4c, 0x02, 0xe0, 0xf7, 0xd0, ++ 0xf4, 0x7d, 0x4d, 0x6f, 0x4c, 0xe6, 0xc7, 0xbf, 0xe5, 0xeb, 0xf9, 0x5d, ++ 0xa6, 0x3a, 0x17, 0xed, 0x44, 0xee, 0x9f, 0xad, 0xe7, 0x7d, 0x9a, 0x83, ++ 0x5f, 0x30, 0xfd, 0x74, 0xb7, 0x80, 0xfe, 0x57, 0xb3, 0xd2, 0xc7, 0xf2, ++ 0xeb, 0x0f, 0x2d, 0x72, 0x80, 0x7f, 0xf6, 0xe3, 0x20, 0xf3, 0xc7, 0x36, ++ 0x1d, 0x28, 0x43, 0x7f, 0xed, 0xca, 0xe0, 0x8b, 0x21, 0xc8, 0x7f, 0x22, ++ 0x03, 0x82, 0x03, 0xec, 0x86, 0x95, 0xbb, 0x3f, 0x48, 0x85, 0x78, 0x36, ++ 0xb5, 0x43, 0x4f, 0x66, 0x22, 0x9d, 0x31, 0x3b, 0x74, 0x36, 0xb7, 0x43, ++ 0x3f, 0x0e, 0x7e, 0x94, 0x0a, 0x71, 0x6f, 0x3a, 0xfe, 0x6c, 0x18, 0xdf, ++ 0xea, 0x8e, 0x1a, 0x81, 0x7e, 0x9b, 0xa8, 0x7d, 0x46, 0x3f, 0x21, 0x4d, ++ 0x72, 0x14, 0xcf, 0x15, 0x35, 0xb9, 0x09, 0xca, 0xfb, 0x8a, 0x7e, 0xbd, ++ 0xbd, 0xa6, 0xc5, 0x27, 0xb7, 0xfa, 0x8c, 0xc8, 0xef, 0xb6, 0x0e, 0x08, ++ 0x41, 0xb0, 0xcf, 0x32, 0x8d, 0xfe, 0xc2, 0x5c, 0x90, 0x4f, 0x24, 0xd7, ++ 0x71, 0xca, 0x1a, 0xdf, 0x2f, 0x67, 0x33, 0x55, 0x27, 0xc4, 0x2d, 0xe3, ++ 0x71, 0x61, 0xf5, 0x4b, 0x98, 0x97, 0xe6, 0xd7, 0x89, 0xf4, 0xa6, 0x21, ++ 0x1d, 0x46, 0x0c, 0x44, 0x45, 0x3d, 0xa0, 0xd7, 0xce, 0xf9, 0x12, 0x8b, ++ 0xd7, 0xfc, 0x71, 0x9b, 0x33, 0xc8, 0xf2, 0x97, 0xd8, 0xf7, 0x7f, 0x0c, ++ 0x16, 0x62, 0x59, 0x93, 0xd7, 0xcb, 0xf9, 0x39, 0xbd, 0xe5, 0xfc, 0x9c, ++ 0x1e, 0xf0, 0xef, 0x50, 0x12, 0xff, 0x4e, 0x2c, 0xc7, 0xe2, 0xcd, 0xda, ++ 0x79, 0x34, 0xca, 0xcf, 0x43, 0xc3, 0xc5, 0xbf, 0x13, 0xf2, 0x96, 0x12, ++ 0xdb, 0x37, 0x91, 0x28, 0xcf, 0xcf, 0xfb, 0xd6, 0xa4, 0xeb, 0x37, 0x96, ++ 0xaf, 0xd3, 0x52, 0xa6, 0xd0, 0x79, 0xdf, 0x72, 0x93, 0xcd, 0x0b, 0xfa, ++ 0x4a, 0x33, 0xa5, 0xeb, 0xd6, 0xf2, 0x38, 0x1d, 0x36, 0xf0, 0xa5, 0x68, ++ 0x74, 0xd8, 0xc4, 0xfd, 0xba, 0xcd, 0xf5, 0x1f, 0xa2, 0x1d, 0xd0, 0x0c, ++ 0xe7, 0x2f, 0x40, 0xaf, 0xf2, 0x32, 0x3a, 0x6c, 0xa0, 0xf6, 0x11, 0xe4, ++ 0x77, 0x26, 0xef, 0x5b, 0xd2, 0xa7, 0xcf, 0x67, 0x1c, 0x69, 0x1f, 0x4f, ++ 0xce, 0xd2, 0xef, 0xe3, 0x58, 0xf9, 0xef, 0xe4, 0xc7, 0x9c, 0x96, 0xa5, ++ 0xdf, 0xbf, 0xda, 0xfa, 0x35, 0x3f, 0x78, 0x6c, 0x9d, 0x03, 0x02, 0xdb, ++ 0x5f, 0x49, 0xeb, 0x4a, 0xb6, 0x2b, 0x93, 0xfd, 0xd7, 0x9a, 0x5d, 0x78, ++ 0xbe, 0x7c, 0xcd, 0x97, 0x04, 0x0f, 0xdf, 0xff, 0x30, 0x3c, 0x46, 0xe2, ++ 0x6b, 0x37, 0x65, 0x8d, 0xc4, 0xd7, 0xf4, 0xf1, 0x81, 0xbf, 0x9a, 0xaf, ++ 0x25, 0xc7, 0x09, 0x8a, 0x98, 0xff, 0x1b, 0xe2, 0x04, 0x10, 0xb7, 0xfd, ++ 0xaf, 0xc6, 0x09, 0x3e, 0x51, 0xba, 0x33, 0x45, 0x96, 0xa7, 0xaf, 0x8b, ++ 0x9f, 0x76, 0x0a, 0x2d, 0x57, 0x99, 0xc7, 0x40, 0x5c, 0x91, 0xc5, 0x97, ++ 0x1b, 0xed, 0x26, 0x8c, 0xc3, 0x26, 0xc7, 0x55, 0x9b, 0x95, 0x39, 0x3c, ++ 0x8e, 0x18, 0x7e, 0x7b, 0x1a, 0xc8, 0xcd, 0xfd, 0x06, 0x02, 0xf2, 0xbc, ++ 0xde, 0xb6, 0x02, 0xe3, 0x95, 0xcd, 0xd2, 0xd3, 0x46, 0x38, 0x72, 0x38, ++ 0x24, 0x9e, 0x28, 0x1f, 0x41, 0xbd, 0xfd, 0xaf, 0x8d, 0xab, 0xb7, 0x67, ++ 0xd9, 0xdd, 0xc8, 0x8f, 0x14, 0x52, 0x08, 0x71, 0xf5, 0xe4, 0xbc, 0xa2, ++ 0x17, 0x6d, 0x5f, 0xa4, 0xfb, 0x13, 0xf0, 0x5b, 0x55, 0x4a, 0x15, 0xfe, ++ 0x61, 0xe8, 0xd8, 0x2c, 0x07, 0x48, 0xe2, 0x79, 0xb5, 0x4d, 0x59, 0x4c, ++ 0x0f, 0x7e, 0x91, 0xe7, 0xbf, 0x78, 0x8c, 0x2c, 0x8f, 0xfd, 0x61, 0x3b, ++ 0xb5, 0xb3, 0xe8, 0xfa, 0x3c, 0x22, 0xcb, 0xcf, 0xb9, 0x27, 0xc3, 0xf7, ++ 0x08, 0xf0, 0x3f, 0xb3, 0xc2, 0xe0, 0xf7, 0xf8, 0x0b, 0xd7, 0x13, 0x38, ++ 0x77, 0xf4, 0xb8, 0xa1, 0x0f, 0xf9, 0x44, 0xa0, 0xd1, 0xe6, 0x05, 0x7e, ++ 0xa7, 0xf9, 0x55, 0xb4, 0xfe, 0x0d, 0xdc, 0x3f, 0x70, 0xbe, 0x74, 0xfd, ++ 0x54, 0x96, 0x5e, 0x7f, 0x8c, 0x95, 0xff, 0x4e, 0xfb, 0xfc, 0x80, 0x36, ++ 0xde, 0x5f, 0x1b, 0xef, 0xda, 0x42, 0x61, 0xa3, 0xa3, 0x7f, 0x82, 0x71, ++ 0xad, 0xd7, 0x20, 0x5e, 0x53, 0x38, 0x94, 0x4e, 0x47, 0xea, 0x67, 0x24, ++ 0x7a, 0x3d, 0x9e, 0xe5, 0x7b, 0x31, 0x0b, 0xf7, 0x99, 0x3a, 0x19, 0xf3, ++ 0x6e, 0xcf, 0x93, 0x9f, 0x58, 0x2b, 0xa2, 0x1f, 0x81, 0xff, 0x86, 0xec, ++ 0x37, 0x29, 0x60, 0x4f, 0x98, 0xf9, 0xb9, 0x0c, 0xb2, 0x31, 0x9b, 0xe7, ++ 0x49, 0x7a, 0x2b, 0xe7, 0x61, 0xbe, 0x30, 0x3b, 0xd7, 0xa0, 0x9d, 0xff, ++ 0x18, 0x49, 0xef, 0x3b, 0x11, 0xdb, 0xef, 0x4c, 0xef, 0x3b, 0x31, 0x22, ++ 0xdf, 0xf9, 0xdb, 0xf4, 0xbe, 0x35, 0x2e, 0x5f, 0x24, 0x0b, 0xf4, 0xbd, ++ 0x99, 0x6a, 0x31, 0xc8, 0xc5, 0xf5, 0x76, 0x3a, 0x7f, 0xb0, 0xe7, 0x7e, ++ 0x66, 0x1a, 0xf6, 0x9c, 0x85, 0x76, 0x1e, 0x80, 0xd2, 0x13, 0x3b, 0x6f, ++ 0xf2, 0x0c, 0x8b, 0x73, 0x27, 0xd3, 0xd5, 0xb9, 0x24, 0x7e, 0x79, 0xee, ++ 0x7f, 0x89, 0x5f, 0x8a, 0x1e, 0x8d, 0xbe, 0xff, 0x87, 0xf9, 0x65, 0xfd, ++ 0x9f, 0x53, 0xc1, 0xaf, 0x39, 0x72, 0x3f, 0x01, 0x9e, 0x9f, 0x18, 0x56, ++ 0x79, 0x5c, 0x8a, 0x40, 0x5c, 0x48, 0x5b, 0x47, 0x73, 0x98, 0xe5, 0x97, ++ 0xa5, 0xf3, 0xf9, 0x6a, 0xef, 0x3f, 0xe7, 0x7a, 0xdf, 0x4d, 0x1e, 0xd5, ++ 0x0d, 0x79, 0x5a, 0x9f, 0xbd, 0x6b, 0x36, 0x93, 0x34, 0xaa, 0xe2, 0x00, ++ 0x8d, 0x81, 0xbe, 0xe5, 0xb3, 0xa1, 0xbf, 0xbf, 0xa9, 0x8f, 0xe5, 0x81, ++ 0x34, 0xad, 0x21, 0x18, 0xd7, 0xd5, 0xce, 0x51, 0x36, 0xf5, 0xcf, 0x23, ++ 0xa0, 0xd7, 0xed, 0x4b, 0xf7, 0xe7, 0x43, 0xfb, 0xf5, 0xef, 0xd9, 0x02, ++ 0x52, 0x1a, 0xf8, 0xc1, 0xe7, 0x13, 0xd0, 0xe7, 0xce, 0xbc, 0xcb, 0xca, ++ 0x8d, 0xe9, 0xfe, 0xd1, 0x1e, 0xb0, 0x8b, 0xd6, 0x44, 0x74, 0x71, 0x85, ++ 0xca, 0x6f, 0xbf, 0x58, 0x07, 0xfe, 0x0a, 0x3a, 0x5f, 0xb4, 0xff, 0xdd, ++ 0x26, 0xfd, 0x79, 0x8a, 0xab, 0x3c, 0x2c, 0x1f, 0x47, 0x7b, 0x5e, 0xc1, ++ 0xf3, 0xbe, 0x62, 0xeb, 0x72, 0xb3, 0x79, 0x92, 0x3e, 0x29, 0x08, 0x7a, ++ 0xa0, 0x55, 0x09, 0xa3, 0x9f, 0xa8, 0x69, 0x3f, 0x53, 0xce, 0x2a, 0x25, ++ 0x15, 0xfd, 0xf1, 0xe4, 0x16, 0x17, 0x9e, 0x8f, 0x68, 0xda, 0x3f, 0xb3, ++ 0x0c, 0xcf, 0x9b, 0xf7, 0x59, 0xca, 0x40, 0x8f, 0xad, 0x7c, 0xbf, 0xd6, ++ 0x01, 0xfe, 0x87, 0xcf, 0x2e, 0x76, 0x63, 0x1e, 0x41, 0xbe, 0x14, 0x59, ++ 0x09, 0x7a, 0x54, 0x28, 0xc3, 0x3f, 0x0d, 0xd6, 0x63, 0xaf, 0x08, 0xce, ++ 0x05, 0x3d, 0xb4, 0x80, 0xea, 0xa1, 0xa0, 0xd7, 0x7e, 0xb6, 0x6f, 0x6e, ++ 0x99, 0x3f, 0xc1, 0x9f, 0xbd, 0x19, 0xfc, 0xd9, 0xb4, 0xdf, 0xcd, 0x76, ++ 0xbd, 0xbf, 0x9a, 0x98, 0x59, 0x1e, 0x78, 0xfd, 0x2e, 0x96, 0xe7, 0xfb, ++ 0x82, 0xdd, 0x3f, 0x0b, 0xfa, 0xdb, 0x6c, 0x61, 0xf3, 0x0d, 0x6c, 0xe2, ++ 0x79, 0xcd, 0xdc, 0x8f, 0x9d, 0xbc, 0xff, 0xb5, 0x7d, 0x1f, 0x3b, 0xe7, ++ 0x78, 0xa3, 0x19, 0xe3, 0xce, 0x1a, 0x5f, 0xd8, 0x6c, 0x20, 0x7e, 0x90, ++ 0x6b, 0x1a, 0x3f, 0x19, 0xef, 0x51, 0x78, 0x3e, 0x06, 0xcf, 0xc3, 0x1b, ++ 0x98, 0xc7, 0xf2, 0x39, 0x78, 0xd9, 0xe6, 0xd6, 0xe7, 0x23, 0xfe, 0x2e, ++ 0x73, 0xf6, 0x78, 0xc0, 0xc7, 0x78, 0x0f, 0xcb, 0x3f, 0x59, 0x66, 0x8e, ++ 0x0a, 0xe0, 0x57, 0x5f, 0xc6, 0xe3, 0xec, 0x97, 0xf1, 0x7c, 0x09, 0x2d, ++ 0x3f, 0xca, 0x24, 0xfb, 0x7e, 0x08, 0xdf, 0x93, 0x35, 0x35, 0xf1, 0xf8, ++ 0xfa, 0x68, 0x68, 0xcf, 0xe3, 0xeb, 0x3c, 0x0f, 0xc6, 0xfa, 0x15, 0xd3, ++ 0x8f, 0x47, 0x3b, 0x8c, 0x48, 0x37, 0x76, 0xba, 0xbf, 0xd0, 0xff, 0x41, ++ 0xe9, 0x06, 0xf0, 0x33, 0x23, 0x1a, 0x9e, 0x05, 0xe7, 0x89, 0x8a, 0x7a, ++ 0x42, 0x33, 0x00, 0x9e, 0x87, 0xbf, 0x12, 0x11, 0x1e, 0xf2, 0xbc, 0xd7, ++ 0x30, 0x3e, 0x92, 0x06, 0x68, 0xa3, 0xfd, 0x8c, 0xd9, 0x18, 0xe9, 0x1a, ++ 0x07, 0x7e, 0x12, 0xc7, 0x6f, 0x2e, 0x06, 0xbc, 0x28, 0xdd, 0x8e, 0x2a, ++ 0x00, 0xdd, 0xbe, 0x74, 0xdf, 0x2a, 0x80, 0x23, 0x91, 0x5b, 0x4a, 0xc0, ++ 0x6e, 0xac, 0xfa, 0xad, 0x81, 0xe5, 0xf9, 0x1d, 0xb2, 0xa2, 0xfd, 0xdf, ++ 0x93, 0xdf, 0x80, 0x79, 0x7e, 0x67, 0xde, 0x33, 0x0d, 0x7b, 0x2e, 0x44, ++ 0x7b, 0x06, 0xc8, 0x7d, 0x98, 0xd7, 0x37, 0xba, 0xff, 0x2d, 0xf4, 0xd3, ++ 0xdb, 0xf7, 0x0b, 0xc3, 0xe6, 0x6b, 0xde, 0xef, 0xb1, 0xb1, 0xf8, 0x51, ++ 0x20, 0x8c, 0xf9, 0x63, 0x64, 0x86, 0x1b, 0xe1, 0x21, 0x1f, 0x7a, 0x1f, ++ 0xe3, 0xba, 0x72, 0x97, 0x8c, 0x1e, 0x8a, 0x0e, 0x83, 0x2a, 0xc2, 0x39, ++ 0xa8, 0xc0, 0x5a, 0x82, 0xfe, 0xc9, 0xb1, 0x3d, 0x0e, 0x11, 0xf0, 0x52, ++ 0xc0, 0xf3, 0x47, 0x06, 0x0f, 0xff, 0xe7, 0x64, 0x3f, 0xda, 0x21, 0x9a, ++ 0x5f, 0x3e, 0x88, 0x4f, 0xd9, 0x10, 0x59, 0x07, 0x76, 0x95, 0xbc, 0x36, ++ 0x72, 0x09, 0xdd, 0xc1, 0xa4, 0x71, 0xbf, 0x53, 0x6c, 0x2a, 0x85, 0xfe, ++ 0xa2, 0x4d, 0x2c, 0x6f, 0xdd, 0x4a, 0x80, 0x4e, 0x0a, 0xfa, 0xc7, 0xdc, ++ 0xf7, 0x03, 0x5a, 0x2e, 0xe8, 0x74, 0x10, 0x01, 0xf8, 0xcf, 0xc1, 0x5b, ++ 0x0a, 0xd0, 0x1f, 0x4a, 0xd7, 0x39, 0x76, 0x98, 0x75, 0x36, 0x79, 0xd8, ++ 0x39, 0x00, 0xf9, 0x90, 0x55, 0x04, 0xb9, 0x25, 0x6f, 0x22, 0x98, 0x5f, ++ 0x28, 0x3b, 0x33, 0xab, 0x70, 0xde, 0x8f, 0xd2, 0x32, 0xed, 0xa7, 0x9e, ++ 0xd3, 0x8d, 0x16, 0x6f, 0xa4, 0xd3, 0xf5, 0x80, 0x3c, 0xba, 0xc9, 0xe3, ++ 0xdf, 0x0a, 0xf8, 0x8e, 0x9d, 0x83, 0x69, 0x4d, 0x61, 0xe7, 0x60, 0xf8, ++ 0xb9, 0x4b, 0x7b, 0xeb, 0x7b, 0xcf, 0xc0, 0xf9, 0x92, 0x1d, 0x46, 0x76, ++ 0xce, 0xf0, 0xe8, 0xe1, 0x89, 0xf3, 0xd1, 0x2f, 0xd7, 0x25, 0x0b, 0x80, ++ 0x87, 0x73, 0xce, 0x45, 0x05, 0x0e, 0xfa, 0x7e, 0x0f, 0xdf, 0xb7, 0x76, ++ 0x39, 0x4c, 0x1c, 0xb6, 0x44, 0xf8, 0x1f, 0xc5, 0x7c, 0xca, 0xd1, 0x87, ++ 0x58, 0xde, 0x99, 0x6c, 0x60, 0x74, 0x22, 0x77, 0xb9, 0x77, 0x82, 0xdf, ++ 0xef, 0x8f, 0x69, 0x7e, 0xcc, 0x1b, 0xbd, 0xb8, 0x23, 0x24, 0x61, 0xbc, ++ 0xca, 0x71, 0xf2, 0x91, 0x1a, 0x25, 0xc1, 0x6e, 0xd9, 0xc2, 0xe4, 0x48, ++ 0xd3, 0x5e, 0x66, 0x2f, 0x27, 0xdb, 0x29, 0xdf, 0x27, 0x3f, 0x0e, 0x7b, ++ 0xf4, 0xf2, 0x23, 0x56, 0xfe, 0x3b, 0xe9, 0x25, 0xaf, 0xc4, 0xc6, 0xff, ++ 0x1b, 0xed, 0x0f, 0xa2, 0xb7, 0xdb, 0x92, 0xf5, 0x93, 0x64, 0x3b, 0x6d, ++ 0x88, 0x5e, 0x9d, 0xd4, 0xdf, 0x48, 0x7a, 0x8a, 0x96, 0xb7, 0x51, 0x15, ++ 0x1f, 0x07, 0xe9, 0xe1, 0x45, 0xbb, 0xa6, 0x07, 0x05, 0x74, 0x79, 0x2d, ++ 0x55, 0x36, 0x7e, 0xae, 0xcd, 0xac, 0xef, 0x7f, 0x8f, 0x9b, 0x9d, 0x2b, ++ 0xd6, 0xf2, 0x5c, 0x32, 0xdb, 0x95, 0xb5, 0x90, 0x37, 0x1e, 0xbd, 0x97, ++ 0xa0, 0x1f, 0x4d, 0xcb, 0xb7, 0x09, 0x54, 0x31, 0xbb, 0x20, 0x20, 0x9a, ++ 0xf1, 0xbc, 0x9b, 0x87, 0x74, 0x63, 0x9e, 0xcd, 0x28, 0x12, 0x12, 0x04, ++ 0xd4, 0xef, 0x23, 0x78, 0xae, 0x33, 0x0b, 0xf2, 0x6d, 0x68, 0xbb, 0xb7, ++ 0x3d, 0xa3, 0xb1, 0xdf, 0xed, 0xc4, 0xdb, 0x29, 0x21, 0x3f, 0x54, 0x04, ++ 0x98, 0xb7, 0x05, 0xf2, 0x34, 0x30, 0x2f, 0x33, 0xd8, 0xbb, 0x1c, 0xc6, ++ 0xb9, 0xd6, 0x86, 0xe3, 0x58, 0x20, 0x4f, 0xe3, 0x42, 0x08, 0xb5, 0xab, ++ 0xbd, 0xc0, 0x3f, 0x67, 0xd5, 0xb3, 0x38, 0x43, 0x0e, 0x95, 0xb7, 0x40, ++ 0xb7, 0x39, 0x45, 0x8c, 0x0e, 0x2d, 0x75, 0x2c, 0x5f, 0x43, 0xcb, 0xc7, ++ 0xd0, 0xf2, 0x27, 0x34, 0x38, 0x54, 0x71, 0xf8, 0xe6, 0x8c, 0x5b, 0x5e, ++ 0x08, 0xfa, 0x7f, 0x97, 0xe0, 0xff, 0x99, 0x76, 0x9e, 0x36, 0xf1, 0x9c, ++ 0x74, 0xec, 0x7c, 0xf4, 0xca, 0xd1, 0x78, 0x9e, 0x24, 0x76, 0x3e, 0xae, ++ 0x88, 0xf0, 0xfa, 0xf3, 0x3b, 0x27, 0x9d, 0x0c, 0x4f, 0x2d, 0x7f, 0xe3, ++ 0x52, 0x87, 0xdf, 0x9e, 0x9d, 0x31, 0xf4, 0xbc, 0xac, 0x46, 0x1f, 0x09, ++ 0x78, 0xc3, 0x79, 0x6d, 0x3d, 0xc4, 0xf4, 0xf5, 0xaa, 0x7a, 0x23, 0xce, ++ 0x7f, 0x70, 0xe5, 0xe5, 0xe8, 0x27, 0x1c, 0x5c, 0x29, 0x12, 0xd8, 0x37, ++ 0x55, 0x03, 0x26, 0x46, 0x6f, 0x49, 0xe3, 0x6d, 0x8d, 0xdd, 0x83, 0x11, ++ 0xb4, 0xe0, 0x7d, 0x17, 0x1c, 0xef, 0xdf, 0xa7, 0xaf, 0x52, 0x7c, 0x96, ++ 0x80, 0x1f, 0xf6, 0x68, 0x5b, 0xcd, 0x85, 0x27, 0x29, 0x6c, 0x8f, 0xb5, ++ 0xf9, 0xf0, 0x39, 0x68, 0x11, 0xfa, 0xa4, 0x0b, 0xf0, 0xbc, 0xe2, 0x42, ++ 0xe0, 0x4c, 0xd1, 0xde, 0x2d, 0xb5, 0x70, 0x4f, 0xc1, 0xa0, 0x3d, 0x9a, ++ 0x0f, 0xf7, 0x1c, 0x44, 0xb7, 0xb6, 0x5f, 0x09, 0xf7, 0x18, 0x0c, 0x66, ++ 0x44, 0x4f, 0x40, 0xd9, 0xba, 0xf5, 0xa9, 0x2b, 0xb1, 0x7e, 0x6c, 0x74, ++ 0x07, 0xdc, 0x7b, 0x50, 0x98, 0xa3, 0xb2, 0x32, 0xd0, 0x60, 0x0e, 0x21, ++ 0xa5, 0xbd, 0x15, 0x57, 0x06, 0x70, 0xdd, 0xcc, 0xaf, 0x34, 0x2b, 0x7e, ++ 0x3e, 0xbb, 0x0c, 0xe0, 0xd3, 0x48, 0x22, 0xeb, 0xc2, 0xe8, 0xbf, 0x61, ++ 0xf9, 0xf9, 0x90, 0xcf, 0x07, 0x78, 0xf0, 0xd8, 0x8c, 0xa8, 0xcf, 0x78, ++ 0x78, 0x1e, 0x25, 0xa9, 0xe6, 0x79, 0x95, 0x10, 0x61, 0xa1, 0xe5, 0xf6, ++ 0xec, 0x32, 0x8c, 0x47, 0xdb, 0x88, 0xb2, 0x3f, 0x0c, 0xf5, 0xb9, 0xec, ++ 0x1c, 0x10, 0xad, 0x47, 0xfa, 0x6d, 0x1f, 0xcb, 0xfc, 0xbe, 0x66, 0x8e, ++ 0x57, 0x92, 0xab, 0xf9, 0x89, 0x22, 0x01, 0xe0, 0x4f, 0xed, 0x85, 0x4e, ++ 0x6c, 0x1f, 0xe3, 0xa3, 0xfb, 0x4d, 0x41, 0xe6, 0xaf, 0x62, 0xe3, 0xbf, ++ 0x71, 0x60, 0x12, 0xc6, 0x8f, 0xb4, 0xfc, 0x50, 0x42, 0x1c, 0x79, 0x0b, ++ 0x26, 0x61, 0x3e, 0x89, 0xae, 0xac, 0xdd, 0x6f, 0x40, 0x64, 0x47, 0x1e, ++ 0xe8, 0x0b, 0xed, 0x06, 0xae, 0x97, 0xf2, 0x72, 0x7a, 0x9a, 0xff, 0xaa, ++ 0xec, 0x04, 0xbd, 0xee, 0x8d, 0xd9, 0xff, 0x50, 0x0a, 0xfb, 0xe0, 0xf4, ++ 0x73, 0xf7, 0x14, 0x01, 0x5f, 0xba, 0xcc, 0x48, 0xf5, 0xf6, 0x61, 0xf8, ++ 0xd0, 0xbb, 0x39, 0x8c, 0x0f, 0x0d, 0x1a, 0x6c, 0x9d, 0x02, 0xd5, 0xd3, ++ 0xde, 0x4a, 0xf5, 0x5f, 0x0f, 0xfd, 0xbc, 0x63, 0x5d, 0x38, 0xc7, 0x49, ++ 0xd7, 0x55, 0x97, 0x3e, 0xd3, 0xe8, 0x84, 0xf9, 0x06, 0x7e, 0x26, 0x01, ++ 0x5f, 0xcc, 0xe0, 0xf8, 0x76, 0x2e, 0x60, 0xf3, 0x73, 0x56, 0xfb, 0x84, ++ 0x65, 0xb4, 0xdf, 0x76, 0x0b, 0xdd, 0xbf, 0xb4, 0x7d, 0x86, 0x5f, 0x56, ++ 0x31, 0x8f, 0xde, 0xbf, 0x40, 0xb8, 0x16, 0xe2, 0xdc, 0x02, 0xe3, 0xb7, ++ 0xb4, 0x51, 0x1a, 0xda, 0x25, 0x25, 0x4a, 0x1a, 0xe4, 0x27, 0x37, 0xf0, ++ 0xf3, 0x90, 0x12, 0xdf, 0xf7, 0xd3, 0xfa, 0x36, 0x49, 0xa0, 0x4f, 0xbf, ++ 0xd9, 0xd6, 0x3f, 0x5d, 0x2e, 0x8a, 0xcf, 0xef, 0x2d, 0x1e, 0x3f, 0x7e, ++ 0xab, 0x90, 0xdc, 0x3c, 0x6f, 0x18, 0xbf, 0xe5, 0x1d, 0xd9, 0x6c, 0xfe, ++ 0xf3, 0x25, 0x65, 0x12, 0xd0, 0xd1, 0xba, 0xb5, 0xcf, 0xbd, 0x56, 0x9b, ++ 0x0d, 0xef, 0x15, 0x7c, 0x3f, 0x3b, 0xb5, 0xb5, 0x02, 0xf2, 0x8a, 0x2f, ++ 0xb3, 0xb6, 0x54, 0x80, 0xfc, 0x19, 0xf2, 0x3e, 0x8d, 0xbe, 0x2f, 0x4d, ++ 0x28, 0x9b, 0xd8, 0x77, 0x0d, 0xe6, 0x68, 0x3e, 0x9c, 0x4f, 0x56, 0xad, ++ 0xfe, 0xbb, 0x00, 0x1e, 0xe7, 0x16, 0x7d, 0x80, 0x71, 0xc9, 0x3b, 0x73, ++ 0xde, 0x38, 0x01, 0x79, 0x05, 0x6f, 0x18, 0xba, 0x67, 0xa5, 0x82, 0x7c, ++ 0x29, 0xe4, 0xe7, 0xfa, 0xb9, 0x5f, 0xf0, 0xe5, 0x71, 0x9a, 0x5f, 0xd0, ++ 0xcc, 0xca, 0x13, 0x99, 0x5f, 0x30, 0x96, 0xaf, 0x35, 0x89, 0xe5, 0x8b, ++ 0xd5, 0x2e, 0x60, 0xe7, 0x10, 0x6b, 0x79, 0x3e, 0xc2, 0x1c, 0x07, 0x3b, ++ 0xb7, 0x33, 0xa7, 0xa2, 0xd0, 0xdb, 0x4e, 0xa7, 0x78, 0x15, 0x89, 0xca, ++ 0xc0, 0xf7, 0xe6, 0xbc, 0xe3, 0x4b, 0x05, 0xbb, 0x9d, 0x2c, 0xf0, 0x57, ++ 0xf8, 0x26, 0x8d, 0xac, 0xcf, 0x10, 0x8f, 0x41, 0x49, 0xdc, 0xaf, 0x73, ++ 0x95, 0x84, 0x32, 0xfd, 0x77, 0x45, 0x89, 0xbe, 0x7c, 0xa5, 0x57, 0x5f, ++ 0xbe, 0x7a, 0xea, 0x37, 0xe3, 0x12, 0xcb, 0x3b, 0xad, 0xea, 0x66, 0x58, ++ 0xf7, 0xaf, 0x04, 0x96, 0xdf, 0x18, 0x98, 0x46, 0x1c, 0xb8, 0x4e, 0xb7, ++ 0x10, 0x00, 0xbd, 0x63, 0xe2, 0xf3, 0x39, 0xfc, 0xfc, 0x26, 0xcb, 0xc3, ++ 0xfb, 0x39, 0xb7, 0x8b, 0x9e, 0x9f, 0x4a, 0xb0, 0x3e, 0x73, 0xaf, 0x79, ++ 0x17, 0xe4, 0xb7, 0x6b, 0x7e, 0x64, 0x89, 0xd7, 0x4f, 0xf4, 0x10, 0x73, ++ 0x81, 0x8b, 0xdd, 0x17, 0x00, 0xf2, 0x2a, 0x2a, 0xf0, 0x7c, 0x3e, 0x37, ++ 0xc6, 0x4a, 0xc8, 0x73, 0xb7, 0x3a, 0x18, 0xfc, 0xe8, 0xb7, 0x46, 0xda, ++ 0xcf, 0x73, 0x8b, 0x14, 0xdc, 0x1f, 0x99, 0x36, 0x91, 0x5c, 0x02, 0x7b, ++ 0xa8, 0xc2, 0x8c, 0x7a, 0x48, 0xe5, 0x28, 0x73, 0x0a, 0xd0, 0xcd, 0x51, ++ 0x4e, 0x77, 0xda, 0x79, 0x5c, 0x8d, 0x0e, 0x2b, 0x65, 0xe2, 0x83, 0xfc, ++ 0x04, 0x3a, 0xf4, 0x02, 0x78, 0xbe, 0x61, 0x70, 0x1c, 0x01, 0xff, 0x71, ++ 0xe0, 0x13, 0x42, 0x18, 0xbe, 0x66, 0xca, 0x98, 0x5f, 0xc8, 0xc7, 0x22, ++ 0x64, 0x2d, 0x96, 0x1f, 0xe3, 0xf4, 0x7d, 0x94, 0xcf, 0x29, 0x70, 0xaf, ++ 0x8c, 0xfb, 0xf9, 0x25, 0xbb, 0x11, 0xf1, 0x29, 0xbd, 0x2a, 0xed, 0x04, ++ 0x39, 0x01, 0xb1, 0x17, 0xf0, 0x0b, 0x9f, 0xdd, 0x38, 0x01, 0xe7, 0xa7, ++ 0xed, 0x1f, 0xba, 0xab, 0x8b, 0xdc, 0x99, 0xe8, 0xb2, 0xe6, 0xfd, 0xca, ++ 0x22, 0x4c, 0xa2, 0x84, 0xeb, 0x13, 0x1a, 0x7d, 0x83, 0x06, 0x04, 0xdf, ++ 0x8d, 0x82, 0xff, 0x2c, 0x44, 0x3a, 0x47, 0x7e, 0x13, 0x9d, 0xc2, 0xee, ++ 0x4f, 0x78, 0xab, 0x90, 0xf1, 0x93, 0xe8, 0x26, 0x17, 0x3f, 0xef, 0xc5, ++ 0xe2, 0x61, 0x79, 0xe6, 0x58, 0xbf, 0x2a, 0xf4, 0x9b, 0x1d, 0x1b, 0x87, ++ 0x9d, 0x27, 0xca, 0xe4, 0x65, 0x5a, 0x15, 0x12, 0xe9, 0xba, 0x4f, 0x66, ++ 0x17, 0x72, 0xb9, 0xfb, 0xeb, 0xff, 0x40, 0xb9, 0x6c, 0xf3, 0xfa, 0x61, ++ 0x1c, 0x63, 0xaa, 0x19, 0xcf, 0xc1, 0x68, 0xfb, 0xc6, 0x21, 0x7f, 0xfa, ++ 0x5a, 0xed, 0x34, 0x58, 0x67, 0xf1, 0x1d, 0xb8, 0xce, 0xcb, 0xed, 0x0e, ++ 0x58, 0x67, 0x09, 0x25, 0xeb, 0x3a, 0x17, 0x3e, 0xd5, 0x74, 0xec, 0x4f, ++ 0x41, 0x3e, 0x2f, 0xa5, 0x78, 0x15, 0xd8, 0x27, 0xd7, 0xd4, 0xbc, 0x30, ++ 0x5d, 0x4e, 0xa0, 0x1b, 0xda, 0xbe, 0x91, 0xb5, 0xb7, 0xea, 0xdb, 0x7b, ++ 0x68, 0x7b, 0x57, 0x42, 0xfb, 0x54, 0xda, 0xbe, 0x74, 0x68, 0xfb, 0xdd, ++ 0x76, 0x73, 0x48, 0x9c, 0x0c, 0xfd, 0x54, 0x2a, 0x11, 0xe4, 0xe7, 0x21, ++ 0x5c, 0xcc, 0xe5, 0x7c, 0x5d, 0x52, 0x26, 0x6b, 0x77, 0x39, 0xcf, 0xf7, ++ 0x2c, 0x4a, 0xa5, 0xdf, 0x83, 0xbc, 0x29, 0xd1, 0xe7, 0x63, 0x90, 0xa9, ++ 0x5e, 0x33, 0xbb, 0xaf, 0x43, 0x9f, 0x7f, 0x71, 0x99, 0xb0, 0x26, 0x1b, ++ 0xf6, 0xd5, 0x5c, 0x73, 0xe3, 0x40, 0x84, 0xf6, 0xf7, 0x6b, 0x8e, 0xb7, ++ 0xcb, 0x44, 0xff, 0x97, 0x70, 0x3f, 0xdd, 0xaf, 0x17, 0x16, 0x1f, 0x83, ++ 0xfd, 0x56, 0x63, 0x0e, 0xca, 0x60, 0x0f, 0x5d, 0x41, 0x42, 0xeb, 0x00, ++ 0x99, 0x83, 0x33, 0xfd, 0x8f, 0x3b, 0xc7, 0x20, 0x3f, 0xf8, 0x4f, 0xd8, ++ 0x17, 0x4d, 0x92, 0x7f, 0x9c, 0x8b, 0x96, 0x4f, 0x1b, 0xba, 0x8b, 0x6e, ++ 0x2d, 0xc4, 0xfd, 0xf2, 0x75, 0xf6, 0x94, 0xa1, 0xf3, 0xd5, 0xe8, 0x42, ++ 0x9b, 0x2f, 0xd0, 0x07, 0xd0, 0x59, 0x8c, 0x3e, 0x92, 0xe6, 0x1d, 0xc3, ++ 0xd3, 0x55, 0x7d, 0x98, 0xa8, 0xb6, 0x9d, 0xea, 0x3d, 0xf0, 0xd4, 0xf4, ++ 0x20, 0x42, 0x5a, 0x58, 0x3e, 0xb1, 0x92, 0x17, 0x5f, 0x17, 0x25, 0xa2, ++ 0x39, 0xe6, 0x96, 0x22, 0xd0, 0x43, 0x7e, 0xbd, 0x36, 0x80, 0x7c, 0xe3, ++ 0x32, 0xe7, 0x23, 0x98, 0xb7, 0xf4, 0x87, 0x51, 0x7e, 0x67, 0x0e, 0xc5, ++ 0x7f, 0xdd, 0x05, 0x9f, 0xe3, 0xbd, 0x26, 0xc4, 0xb3, 0x68, 0x1c, 0xe8, ++ 0xf7, 0x74, 0xbe, 0xae, 0x9c, 0xff, 0xc5, 0xf9, 0x6a, 0xfa, 0xde, 0x90, ++ 0x7c, 0xda, 0x4f, 0x8c, 0xba, 0x7c, 0xda, 0x91, 0xf6, 0x95, 0x36, 0x6e, ++ 0x33, 0x61, 0xf7, 0xd3, 0xcc, 0x1a, 0xd8, 0x89, 0xf9, 0xb1, 0xcd, 0x0b, ++ 0x6c, 0x5e, 0x38, 0xe7, 0xd0, 0x0c, 0xf9, 0x9d, 0x15, 0x18, 0x3f, 0x42, ++ 0x3d, 0x0e, 0xce, 0x01, 0xe3, 0x3d, 0x27, 0x82, 0x99, 0xeb, 0x5d, 0xe7, ++ 0x9b, 0x77, 0xcb, 0xf6, 0x61, 0x4f, 0xa3, 0x82, 0xfa, 0x5b, 0x8c, 0x8f, ++ 0xf3, 0xbc, 0xf1, 0x9e, 0x32, 0x36, 0xef, 0x9e, 0x5b, 0x15, 0xed, 0x9e, ++ 0x13, 0xa6, 0xdf, 0x2d, 0x22, 0xec, 0x9e, 0x14, 0xed, 0x9e, 0x93, 0x65, ++ 0x0e, 0xac, 0xd7, 0xf2, 0xcb, 0x7b, 0x76, 0x32, 0x3f, 0x5e, 0xcf, 0x81, ++ 0x71, 0x78, 0x1e, 0x8a, 0xea, 0x6f, 0xa8, 0x2f, 0x90, 0x34, 0x91, 0xcd, ++ 0xaf, 0x50, 0x7f, 0xbf, 0x0a, 0xfc, 0x09, 0x99, 0xf1, 0x7c, 0xe8, 0xcd, ++ 0x06, 0xa6, 0x6f, 0x6e, 0x15, 0xbd, 0x95, 0x00, 0xe7, 0xad, 0x10, 0xe7, ++ 0xf9, 0x8e, 0xf8, 0xee, 0x82, 0x1c, 0xbd, 0xdf, 0x44, 0x2b, 0x27, 0xfb, ++ 0xf5, 0x76, 0xbb, 0xfc, 0xd7, 0x03, 0xbd, 0x2c, 0x2b, 0x55, 0xf3, 0x05, ++ 0x4a, 0x3f, 0x4b, 0x8c, 0xcc, 0x6f, 0x47, 0xe9, 0x6b, 0x1b, 0x9c, 0x9d, ++ 0xa8, 0x21, 0x2d, 0xbb, 0xe1, 0xfe, 0xc0, 0xb9, 0xa4, 0xe5, 0x37, 0xe2, ++ 0x18, 0xa4, 0xaf, 0x1f, 0x01, 0x1d, 0xd5, 0x4d, 0xfc, 0x9c, 0xdd, 0x2b, ++ 0x18, 0xa7, 0xaf, 0x85, 0x39, 0x19, 0x8c, 0xcf, 0x01, 0x53, 0xd2, 0xe8, ++ 0x2b, 0x46, 0x57, 0x25, 0xc9, 0xf9, 0x53, 0xfe, 0x15, 0xd0, 0x4f, 0x8f, ++ 0xb3, 0xef, 0xfd, 0x26, 0xd0, 0x53, 0x07, 0x4c, 0x88, 0x17, 0x2d, 0x0f, ++ 0x2e, 0x79, 0x1f, 0x27, 0xcc, 0xe7, 0xa4, 0x81, 0xcd, 0xc7, 0x2d, 0x49, ++ 0x38, 0x9f, 0x66, 0xa4, 0xf7, 0xa4, 0xf9, 0x9c, 0x0f, 0x9d, 0x27, 0xd2, ++ 0x57, 0x16, 0x61, 0xf4, 0x3c, 0x12, 0xbd, 0x67, 0xc9, 0x24, 0x60, 0x2f, ++ 0x8f, 0xd3, 0xfb, 0x4e, 0xab, 0xff, 0xc7, 0x30, 0x6e, 0x8c, 0xee, 0xd7, ++ 0x31, 0x7b, 0x64, 0xc8, 0xbc, 0x25, 0x1b, 0xd2, 0xc7, 0x75, 0x37, 0x48, ++ 0x2c, 0x3f, 0xdc, 0xca, 0xe4, 0x15, 0xc4, 0x23, 0xb2, 0xe9, 0xf8, 0xf3, ++ 0xf8, 0xf8, 0xd7, 0x75, 0x31, 0x3a, 0xba, 0xce, 0x6e, 0x44, 0xba, 0x9b, ++ 0x37, 0xd0, 0x88, 0xf9, 0x42, 0xa4, 0x9a, 0xc5, 0x15, 0xbc, 0xf4, 0x7f, ++ 0xcc, 0x0e, 0x54, 0x11, 0xbe, 0x75, 0xbc, 0xdd, 0x02, 0x77, 0x99, 0x01, ++ 0x48, 0x76, 0x41, 0xad, 0x3e, 0xfe, 0x50, 0x67, 0xd3, 0xe2, 0x1b, 0x3e, ++ 0x03, 0xec, 0xc7, 0xeb, 0x16, 0x18, 0x3e, 0x4c, 0x94, 0xf7, 0x75, 0x64, ++ 0xe3, 0xe7, 0x90, 0xd7, 0x56, 0x07, 0x71, 0x0a, 0xad, 0x1d, 0x1d, 0x77, ++ 0x4b, 0x4e, 0xec, 0xfc, 0xdf, 0x38, 0x88, 0x53, 0x1c, 0xe3, 0x76, 0xfa, ++ 0x20, 0xa5, 0x6f, 0xa0, 0xff, 0x97, 0x32, 0x56, 0x6c, 0xbb, 0x95, 0xd2, ++ 0xed, 0xb8, 0x9f, 0x94, 0x96, 0x83, 0x3f, 0x67, 0x76, 0xe6, 0xca, 0xdd, ++ 0x9b, 0x68, 0xf9, 0xa7, 0x5b, 0x27, 0x60, 0xf9, 0xa5, 0xcc, 0x1b, 0x6f, ++ 0x7f, 0x03, 0xea, 0x77, 0x14, 0x63, 0xb9, 0x1a, 0x2e, 0x71, 0x01, 0x7b, ++ 0xa3, 0x91, 0xb5, 0x2f, 0xa9, 0xbc, 0xe1, 0xf2, 0x42, 0x3a, 0xee, 0x31, ++ 0x0b, 0xef, 0x17, 0xf6, 0x15, 0xd8, 0x7d, 0x29, 0xfe, 0x9e, 0x79, 0xf4, ++ 0x3b, 0xcf, 0xe4, 0xd1, 0xe5, 0x90, 0x6f, 0x58, 0xcd, 0xf9, 0xc3, 0xe0, ++ 0xad, 0x2c, 0xdf, 0xfd, 0x8a, 0x0b, 0xec, 0x2c, 0x85, 0x73, 0x85, 0x82, ++ 0x7e, 0xa3, 0xea, 0x14, 0x5e, 0xff, 0x23, 0xd6, 0xef, 0x6b, 0x65, 0xff, ++ 0x5a, 0x0e, 0x79, 0xa7, 0xd5, 0xa3, 0xd9, 0x3d, 0x2e, 0xaf, 0x95, 0xff, ++ 0x6a, 0x02, 0x94, 0x8f, 0x09, 0x9f, 0x2f, 0x1c, 0x2e, 0xfe, 0x3d, 0xb1, ++ 0x44, 0x08, 0x8d, 0xa7, 0xf0, 0xa9, 0x76, 0xb1, 0xef, 0x6b, 0xcb, 0x7f, ++ 0x96, 0x03, 0x76, 0x7c, 0x75, 0x15, 0x2b, 0x4f, 0xf4, 0xce, 0xec, 0x1a, ++ 0x03, 0xf5, 0xe2, 0xd9, 0x85, 0xc3, 0x9d, 0xfb, 0x3c, 0xce, 0xf7, 0x53, ++ 0xec, 0x5c, 0x13, 0xdf, 0xa7, 0xcf, 0xab, 0x1f, 0xe0, 0x39, 0x26, 0x9f, ++ 0x59, 0xf0, 0xc2, 0x12, 0x7d, 0x53, 0x3f, 0x60, 0xf7, 0x12, 0xd9, 0x04, ++ 0x07, 0xf8, 0x1f, 0x7d, 0x6a, 0xa1, 0x0c, 0x7e, 0xd2, 0x59, 0x2a, 0xcb, ++ 0x4b, 0xac, 0x32, 0xaf, 0xcd, 0x06, 0xfb, 0xf7, 0x2a, 0xbf, 0xb1, 0x02, ++ 0xf2, 0x4b, 0x1d, 0xe6, 0xb2, 0x63, 0xa0, 0x67, 0xa4, 0x4d, 0x9d, 0x39, ++ 0x05, 0xf0, 0x3b, 0xcb, 0x4c, 0x0c, 0x20, 0x97, 0x28, 0x9d, 0xbf, 0x86, ++ 0x74, 0x7e, 0xd1, 0xe7, 0xf9, 0xa9, 0x40, 0x5c, 0x36, 0x3d, 0x9d, 0x6b, ++ 0x74, 0x34, 0x4f, 0xa3, 0xef, 0x6a, 0x3d, 0x1d, 0xd3, 0xfd, 0xf9, 0x26, ++ 0xec, 0xb7, 0xef, 0xe3, 0xaf, 0x23, 0xd1, 0x31, 0x1d, 0xff, 0xdf, 0x70, ++ 0xdf, 0xff, 0x40, 0x2f, 0x57, 0x62, 0xfd, 0x25, 0xed, 0xb7, 0xe4, 0xfe, ++ 0x47, 0xe2, 0x03, 0xf0, 0x97, 0xc8, 0xe7, 0xe2, 0xf3, 0xe8, 0xc3, 0x7d, ++ 0x95, 0x0b, 0x59, 0x5f, 0x63, 0x60, 0xdf, 0x75, 0x6b, 0xfb, 0xee, 0x34, ++ 0xc0, 0xc1, 0x28, 0x86, 0xf1, 0x5c, 0x47, 0x81, 0xe0, 0x9d, 0x80, 0x07, ++ 0x1a, 0x47, 0x90, 0xff, 0xda, 0xfc, 0xf2, 0x28, 0x6f, 0x23, 0xe5, 0x43, ++ 0xe7, 0x05, 0x7f, 0xb2, 0xa6, 0x97, 0xb1, 0x3f, 0x37, 0xd8, 0xb9, 0xb9, ++ 0xbc, 0x9e, 0xb6, 0x53, 0x89, 0x2b, 0x3e, 0x2f, 0x3a, 0xfe, 0x37, 0x28, ++ 0x47, 0xd7, 0xb1, 0xf9, 0x6c, 0x17, 0x5a, 0x18, 0xdf, 0xe0, 0x7a, 0xb1, ++ 0x66, 0x1f, 0x37, 0x69, 0xeb, 0xed, 0xd7, 0xaf, 0xb7, 0x32, 0x85, 0x9d, ++ 0x67, 0xf6, 0x80, 0xff, 0x02, 0xda, 0xb9, 0xcb, 0x26, 0x7c, 0xd7, 0xbc, ++ 0x9b, 0xb9, 0xdc, 0x5c, 0x60, 0xf6, 0x3d, 0x68, 0xa2, 0x6b, 0xb8, 0xd6, ++ 0xb9, 0x04, 0xe9, 0xe1, 0x7a, 0x12, 0x38, 0x00, 0xfa, 0x89, 0x29, 0xcd, ++ 0x9f, 0x36, 0x2a, 0x03, 0xec, 0xae, 0xc0, 0xa1, 0x48, 0x21, 0xfa, 0x73, ++ 0x31, 0x2f, 0x80, 0xe2, 0xdb, 0x31, 0x2a, 0x41, 0xde, 0x6b, 0xf3, 0x4a, ++ 0x86, 0x47, 0xd3, 0x08, 0xfc, 0x30, 0x79, 0xde, 0xc9, 0x70, 0x88, 0xe3, ++ 0x27, 0x8c, 0xfa, 0x95, 0x76, 0x3e, 0x2a, 0xb6, 0xae, 0xa4, 0xf5, 0x68, ++ 0xf2, 0xdf, 0x6d, 0xd4, 0xfb, 0x81, 0x5c, 0xdc, 0x6f, 0xe3, 0xe2, 0x7e, ++ 0x1a, 0xa0, 0x10, 0x90, 0x83, 0xb5, 0x24, 0x05, 0xf3, 0x16, 0x66, 0x79, ++ 0x05, 0x94, 0xe3, 0xb5, 0xc4, 0x8c, 0xfc, 0xb3, 0xb6, 0x86, 0xc9, 0x4d, ++ 0x97, 0x8d, 0xc9, 0x79, 0x4d, 0xbe, 0x8e, 0x44, 0xd7, 0x97, 0x5e, 0xc2, ++ 0xf8, 0x4c, 0x6d, 0x03, 0xe1, 0xe7, 0xae, 0xd8, 0xfc, 0x93, 0xe9, 0x2a, ++ 0x8b, 0x44, 0xee, 0x80, 0x67, 0xad, 0x59, 0xe9, 0x5d, 0x0a, 0xfb, 0x15, ++ 0xf4, 0x01, 0x25, 0xbe, 0xdf, 0x6b, 0x6d, 0xcc, 0xaf, 0x3b, 0x67, 0x94, ++ 0xc0, 0xfd, 0xb9, 0x91, 0x29, 0x60, 0xdf, 0xc6, 0xca, 0x43, 0xfc, 0x88, ++ 0x91, 0x29, 0xc0, 0x37, 0x92, 0xef, 0x8b, 0xaa, 0xfd, 0x8a, 0xf9, 0x11, ++ 0x5d, 0xfc, 0x5e, 0xd6, 0x5a, 0xef, 0x07, 0x53, 0xc0, 0x5e, 0x77, 0xd5, ++ 0x44, 0xa6, 0x00, 0xff, 0xd9, 0xe0, 0x54, 0x2f, 0x03, 0xbc, 0x69, 0xf7, ++ 0xb9, 0x25, 0xf3, 0x9d, 0x6b, 0x46, 0x89, 0x9a, 0x1f, 0xf1, 0xbc, 0xe8, ++ 0x2d, 0x19, 0x0f, 0x5a, 0xdc, 0x28, 0x3d, 0xcd, 0x77, 0x2d, 0xd0, 0xcd, ++ 0x69, 0x21, 0x5c, 0x09, 0x95, 0xdd, 0x19, 0xdc, 0xaf, 0x4f, 0xfc, 0x85, ++ 0x40, 0x8f, 0x4e, 0x47, 0xe1, 0x4c, 0xf0, 0x07, 0x50, 0xfe, 0xf6, 0xed, ++ 0xb7, 0x60, 0x54, 0x41, 0x15, 0x85, 0xd7, 0x14, 0x97, 0xff, 0x47, 0xd0, ++ 0xee, 0x7a, 0xe2, 0x9b, 0x0d, 0x67, 0xf1, 0x5c, 0x35, 0x7e, 0x03, 0xf3, ++ 0x73, 0x13, 0x5c, 0xff, 0x6a, 0xbe, 0xfe, 0xd9, 0x5c, 0xee, 0x9d, 0xdd, ++ 0x26, 0xa1, 0x9f, 0xbe, 0x5a, 0x2d, 0x79, 0x0c, 0x5c, 0xe9, 0xcd, 0xc7, ++ 0x0d, 0x24, 0x88, 0xfb, 0x4e, 0x45, 0x39, 0x76, 0x0b, 0x9f, 0xff, 0x59, ++ 0xc2, 0xf0, 0x74, 0xd6, 0xc6, 0xe4, 0xdf, 0x8a, 0x57, 0x7e, 0x59, 0x49, ++ 0x29, 0x97, 0x8c, 0xdb, 0x22, 0xc6, 0xef, 0x31, 0xa0, 0xff, 0xc6, 0x07, ++ 0x53, 0x74, 0xf7, 0x18, 0x4c, 0xdc, 0xeb, 0xd2, 0x95, 0x27, 0xf5, 0xe5, ++ 0xe8, 0xbe, 0xbf, 0xa0, 0x7f, 0xb4, 0xae, 0xbe, 0x2c, 0x34, 0x41, 0x57, ++ 0x7f, 0xe1, 0xf1, 0x72, 0x5d, 0x79, 0x4a, 0x78, 0xba, 0xee, 0xfb, 0x8b, ++ 0xde, 0xa9, 0xd2, 0x95, 0xa7, 0x45, 0x2e, 0xd7, 0x7d, 0xff, 0x83, 0x8f, ++ 0xe7, 0xeb, 0xca, 0x17, 0x47, 0x7f, 0xa8, 0xfb, 0xfe, 0x23, 0x6e, 0x9f, ++ 0x92, 0x80, 0x1a, 0x2e, 0xc9, 0x84, 0x7b, 0xbe, 0x39, 0x5d, 0x7e, 0xb5, ++ 0x58, 0xd7, 0xee, 0x0f, 0xa9, 0x73, 0x8e, 0x03, 0x5d, 0x2e, 0xdd, 0xc8, ++ 0xf2, 0x84, 0x67, 0x52, 0xc8, 0xe8, 0xee, 0x73, 0xe8, 0x66, 0xf2, 0xbd, ++ 0x85, 0xfe, 0x8f, 0xe1, 0xd5, 0x27, 0x03, 0xbc, 0x96, 0x53, 0xbd, 0x17, ++ 0xf2, 0x83, 0x57, 0x6c, 0xd1, 0xcb, 0xff, 0xfa, 0x81, 0x4d, 0xeb, 0x80, ++ 0xa7, 0x25, 0xe7, 0x2f, 0xac, 0x22, 0x2d, 0x55, 0x70, 0x35, 0x5c, 0x72, ++ 0xfe, 0x42, 0xb5, 0x63, 0x91, 0x08, 0x74, 0xb8, 0x65, 0x14, 0xcf, 0x53, ++ 0xb8, 0x88, 0x5c, 0xc4, 0xef, 0x5f, 0xf9, 0x4e, 0xbc, 0x16, 0x93, 0xa2, ++ 0xbf, 0x09, 0xaf, 0x26, 0x8f, 0x1e, 0xaf, 0x16, 0x45, 0x8f, 0x57, 0x6b, ++ 0x89, 0x1e, 0xaf, 0x76, 0xaf, 0x1e, 0xaf, 0x69, 0x53, 0xf5, 0x78, 0x75, ++ 0xaa, 0x7a, 0xbc, 0xa6, 0xd7, 0xe8, 0xf1, 0x9a, 0xe1, 0xd3, 0xe3, 0x35, ++ 0xab, 0x4e, 0x8f, 0xd7, 0x6c, 0xbf, 0x1e, 0xaf, 0xa3, 0xea, 0xf5, 0x78, ++ 0xcd, 0x6b, 0xd1, 0xe3, 0xb5, 0xa0, 0x55, 0x8f, 0xbf, 0xc2, 0xc0, 0x2a, ++ 0x3d, 0xbe, 0x92, 0xf0, 0xad, 0xf1, 0xbf, 0x31, 0x9d, 0xab, 0x75, 0xdf, ++ 0xc5, 0xf0, 0xee, 0xab, 0xc7, 0xbc, 0x93, 0xb1, 0xdd, 0x77, 0xeb, 0xfa, ++ 0xd5, 0xf0, 0x1e, 0xa0, 0xff, 0x63, 0x78, 0x6f, 0xc1, 0xbc, 0xf0, 0xbf, ++ 0x16, 0xef, 0x94, 0xdb, 0xa0, 0x1f, 0x34, 0x19, 0xef, 0x6f, 0x27, 0xe1, ++ 0x9b, 0xca, 0x8d, 0x7f, 0x85, 0xfd, 0x4d, 0xe5, 0xfd, 0x7b, 0xf0, 0xac, ++ 0x1b, 0xc7, 0xf5, 0x6a, 0xdf, 0xf0, 0xf2, 0x5e, 0xe3, 0x3f, 0x89, 0xf2, ++ 0x35, 0xd1, 0x7e, 0x1c, 0x89, 0x2f, 0x0d, 0x91, 0x27, 0xdc, 0x9e, 0x1c, ++ 0x51, 0x9e, 0x24, 0xd9, 0x93, 0xef, 0x42, 0x76, 0x0c, 0xea, 0x29, 0x1b, ++ 0xd1, 0xdf, 0x72, 0x03, 0xa7, 0xcf, 0x2f, 0xe0, 0xd5, 0x34, 0xf0, 0x67, ++ 0xfe, 0x02, 0xe5, 0xe4, 0xbb, 0x74, 0x22, 0x53, 0xe9, 0xbc, 0xde, 0x85, ++ 0x79, 0xd3, 0x71, 0xde, 0x4d, 0x99, 0x88, 0xf6, 0xfe, 0x8d, 0x24, 0x64, ++ 0xc0, 0xfb, 0x77, 0x21, 0xe3, 0x8f, 0x76, 0x7a, 0x33, 0x24, 0x00, 0x4b, ++ 0x70, 0x6f, 0x8e, 0x82, 0xcf, 0x25, 0x5c, 0x8e, 0x2e, 0xe3, 0xfe, 0x00, ++ 0xd5, 0xea, 0xff, 0x7a, 0x14, 0xf3, 0x03, 0x14, 0x64, 0xc2, 0xb8, 0xb9, ++ 0x61, 0x76, 0x0f, 0xf2, 0x6b, 0xe9, 0xe7, 0x75, 0x1f, 0xc0, 0x87, 0xe0, ++ 0x0f, 0x97, 0x09, 0x39, 0x09, 0xfe, 0x70, 0xfa, 0x3c, 0x63, 0x61, 0xf4, ++ 0x70, 0x4a, 0xe3, 0x0f, 0x2a, 0x51, 0xdc, 0x09, 0x70, 0x5b, 0x3c, 0x4b, ++ 0x28, 0x41, 0xbd, 0x51, 0x4a, 0xc1, 0xbc, 0x9c, 0xc5, 0xd7, 0x0b, 0x28, ++ 0x47, 0x16, 0xff, 0x89, 0x3d, 0xd3, 0x73, 0x99, 0xfe, 0x99, 0xfc, 0x6c, ++ 0x6f, 0xd5, 0xe0, 0xc6, 0xec, 0x92, 0x69, 0xb9, 0x0a, 0xf2, 0xf5, 0x5c, ++ 0xd2, 0xc7, 0xe5, 0x1d, 0xf1, 0xdb, 0xc6, 0x60, 0x3f, 0xcc, 0x7f, 0xfd, ++ 0x04, 0xbb, 0x07, 0xf4, 0x19, 0x81, 0xc8, 0x53, 0x5d, 0x78, 0x1c, 0x09, ++ 0xf1, 0x98, 0x65, 0x66, 0xf3, 0x7a, 0xc6, 0x40, 0xcc, 0x00, 0xbf, 0xa7, ++ 0x88, 0x5f, 0x01, 0xb8, 0x3c, 0x20, 0x53, 0xd6, 0xc4, 0xf2, 0xe1, 0x27, ++ 0x00, 0x3d, 0x2c, 0xfe, 0xd3, 0x1b, 0xa3, 0xc1, 0x9f, 0x24, 0x49, 0x69, ++ 0x57, 0xc1, 0x3d, 0xcf, 0xc5, 0x30, 0x1e, 0xf8, 0x5b, 0x6f, 0x6a, 0x11, ++ 0xc0, 0xbf, 0x9a, 0xe5, 0x69, 0x11, 0xc0, 0x7f, 0x33, 0xe4, 0xfd, 0xfe, ++ 0xbb, 0x05, 0x38, 0xc7, 0x17, 0x2b, 0x13, 0xf6, 0x1d, 0xfc, 0x01, 0x1c, ++ 0x34, 0x3f, 0x59, 0x89, 0xc8, 0xe2, 0xc5, 0xd1, 0x5b, 0x99, 0x9e, 0xbf, ++ 0xfb, 0x47, 0x04, 0xfd, 0x3f, 0xed, 0xad, 0x81, 0x99, 0x01, 0x88, 0x13, ++ 0x49, 0xd4, 0x20, 0x83, 0x7c, 0x12, 0x03, 0x3b, 0xf7, 0x3b, 0x2d, 0x97, ++ 0xf9, 0xbf, 0xb2, 0x49, 0x18, 0xef, 0x17, 0x25, 0x2f, 0x73, 0xfd, 0x8c, ++ 0xdf, 0xcb, 0x5e, 0xca, 0xf3, 0xcb, 0xcf, 0xf0, 0x78, 0xcb, 0xf2, 0x9d, ++ 0x66, 0x02, 0xf9, 0x0a, 0xa5, 0xfb, 0x8e, 0xb8, 0x20, 0xbe, 0xb2, 0x9c, ++ 0xe2, 0x32, 0x0c, 0xf2, 0x4c, 0xf6, 0xe3, 0x3d, 0x16, 0xa5, 0xbd, 0x2f, ++ 0xb9, 0xd8, 0x7d, 0xdf, 0x06, 0x27, 0x9c, 0x17, 0xd3, 0xe4, 0xe8, 0xc8, ++ 0xf8, 0x96, 0xc9, 0xa9, 0x84, 0x3c, 0x6d, 0x8a, 0xc7, 0x61, 0xef, 0x8b, ++ 0xbc, 0x21, 0x8f, 0xc9, 0xf1, 0xf6, 0xb6, 0x9a, 0x19, 0x10, 0x1f, 0xd1, ++ 0xe6, 0x73, 0x7f, 0x9b, 0x3a, 0x03, 0xe8, 0x43, 0x92, 0xbd, 0x98, 0xe7, ++ 0x05, 0xf7, 0xdb, 0x38, 0x13, 0xda, 0x1b, 0xdd, 0xb4, 0x3e, 0x61, 0xff, ++ 0xca, 0xb6, 0x1a, 0x5d, 0xd9, 0x60, 0xf3, 0xe1, 0xa5, 0x11, 0xeb, 0xda, ++ 0x5a, 0x90, 0xce, 0x0c, 0xfc, 0x1e, 0x9e, 0xf5, 0xb9, 0xab, 0x1d, 0x89, ++ 0xf7, 0xf7, 0xd7, 0xe5, 0x72, 0x3d, 0xc2, 0x1c, 0x20, 0x8e, 0x4c, 0xc2, ++ 0x55, 0x58, 0x78, 0xca, 0xa7, 0x80, 0x3f, 0xfc, 0x99, 0x30, 0x7b, 0xd0, ++ 0xe4, 0xa1, 0xfd, 0x24, 0xf2, 0xb5, 0xdb, 0xf3, 0x49, 0xa2, 0x7f, 0xb7, ++ 0xb3, 0xcd, 0x87, 0xf3, 0x5d, 0x27, 0xf8, 0xfd, 0xd0, 0x89, 0xa9, 0x88, ++ 0x84, 0x2c, 0xa9, 0x90, 0x3f, 0x00, 0x67, 0x1c, 0xe9, 0xfb, 0xde, 0xcb, ++ 0x8e, 0x43, 0x3e, 0x8b, 0xd1, 0xbe, 0xda, 0x1b, 0x52, 0x46, 0x86, 0x9b, ++ 0xc9, 0x23, 0x9f, 0x4b, 0xe4, 0x4b, 0x2b, 0x73, 0xf5, 0x7c, 0xe9, 0x1f, ++ 0xdb, 0x3e, 0x46, 0x38, 0xb5, 0xb7, 0xd5, 0xe1, 0x78, 0x67, 0x40, 0x97, ++ 0x03, 0xff, 0x4e, 0x36, 0xf3, 0xef, 0xb4, 0xb7, 0x2d, 0xc2, 0xf7, 0x62, ++ 0x8d, 0x82, 0xf4, 0xf4, 0x62, 0xef, 0xb8, 0x23, 0x0a, 0xad, 0x3f, 0x41, ++ 0xff, 0xc1, 0x7d, 0x34, 0x26, 0x37, 0x9b, 0x17, 0xa9, 0xc8, 0x47, 0xf9, ++ 0xb4, 0x90, 0xd3, 0x01, 0xf8, 0x8e, 0xf2, 0x28, 0xfd, 0x9c, 0x68, 0x35, ++ 0x20, 0x9d, 0xdd, 0x96, 0x67, 0x0b, 0xc2, 0x26, 0xbc, 0xed, 0xf5, 0xb1, ++ 0x47, 0xe0, 0x3e, 0x4d, 0x23, 0x85, 0x91, 0xf4, 0x57, 0xcc, 0x3b, 0x36, ++ 0x0e, 0x87, 0x93, 0x91, 0xf3, 0x25, 0x4a, 0x4f, 0x3e, 0xd8, 0x6f, 0xc6, ++ 0x1c, 0x19, 0xfd, 0xb0, 0x2e, 0xc7, 0x7c, 0xc4, 0xd3, 0xdf, 0xda, 0x9f, ++ 0x06, 0x5f, 0xa3, 0x85, 0xe0, 0x7d, 0x2f, 0xc6, 0x3c, 0x1b, 0xfa, 0x4f, ++ 0xce, 0x77, 0x9e, 0x8f, 0x26, 0xc1, 0x97, 0xc2, 0x05, 0xf9, 0xe8, 0x6d, ++ 0x1c, 0x2e, 0x2f, 0xf6, 0xb2, 0xfc, 0x9f, 0x13, 0xb7, 0x13, 0xd4, 0xbb, ++ 0x6f, 0xbb, 0x8b, 0xf9, 0xc1, 0x6e, 0xa3, 0x76, 0x3c, 0xec, 0x4b, 0xd2, ++ 0x4a, 0xff, 0x2a, 0xe3, 0x74, 0xa3, 0xf1, 0xeb, 0x0c, 0xb8, 0x71, 0x03, ++ 0xf4, 0xc9, 0x36, 0xca, 0x68, 0x8a, 0x09, 0x79, 0xa8, 0xcd, 0x0c, 0x27, ++ 0x9c, 0x88, 0x15, 0xfc, 0x55, 0x63, 0xe2, 0x78, 0xec, 0x56, 0x65, 0x27, ++ 0xb8, 0xc5, 0x37, 0x55, 0xbb, 0xe7, 0xc1, 0xf3, 0xa1, 0xa9, 0x27, 0xbb, ++ 0x81, 0xad, 0x3c, 0x3c, 0xe3, 0xcb, 0x30, 0x3c, 0xc1, 0xd7, 0x0c, 0xe3, ++ 0x3b, 0x5a, 0x48, 0x10, 0xf4, 0x4c, 0x8c, 0x89, 0xd2, 0xf1, 0x9d, 0xf5, ++ 0xb4, 0x4c, 0xc7, 0x4f, 0xe5, 0xf5, 0xa9, 0x7e, 0x56, 0x4e, 0xe3, 0xf5, ++ 0x69, 0x75, 0xac, 0x9c, 0xa7, 0x3e, 0x2b, 0x54, 0xc3, 0xc4, 0x92, 0xe2, ++ 0x11, 0x79, 0x36, 0xd7, 0xdc, 0x22, 0xe0, 0x7b, 0x4b, 0x09, 0x3b, 0xdf, ++ 0xca, 0xcf, 0xb7, 0x6f, 0xe7, 0x7c, 0x77, 0x94, 0xcd, 0x35, 0xaf, 0x1a, ++ 0xea, 0x6f, 0x22, 0x98, 0xf7, 0xae, 0xd5, 0xff, 0x84, 0xd7, 0x67, 0xdb, ++ 0x3e, 0xec, 0x1c, 0x03, 0x7c, 0x79, 0x81, 0xbe, 0x7d, 0x2f, 0x87, 0x43, ++ 0x96, 0xed, 0xc3, 0xee, 0x59, 0x18, 0xb7, 0xd0, 0xd7, 0x6b, 0x71, 0x86, ++ 0x0c, 0xdb, 0xd9, 0xe3, 0xd8, 0xbe, 0x54, 0x5f, 0xff, 0x28, 0x6f, 0x6f, ++ 0xb7, 0x9d, 0x0d, 0xcf, 0x82, 0xfa, 0x22, 0xfd, 0xf8, 0x0f, 0xf2, 0x7a, ++ 0xab, 0x8d, 0xf1, 0x43, 0xe2, 0x63, 0xf7, 0x94, 0x6a, 0xf5, 0x0f, 0xf0, ++ 0x7a, 0x8b, 0x8d, 0x9d, 0xf3, 0xa2, 0x3c, 0x59, 0x57, 0xdf, 0xc5, 0xc7, ++ 0x6f, 0x17, 0x82, 0x88, 0x1f, 0xbc, 0x8b, 0x15, 0xf6, 0x4f, 0x06, 0xf3, ++ 0x5b, 0xee, 0x68, 0x23, 0x17, 0xc3, 0xfe, 0xe9, 0x6e, 0x8b, 0xe2, 0x3e, ++ 0x7a, 0xa8, 0xed, 0x2b, 0xc4, 0xd3, 0x20, 0xe4, 0xf9, 0x4c, 0x89, 0xef, ++ 0x2b, 0x47, 0x2b, 0x19, 0xf6, 0xdc, 0xf5, 0x20, 0xe7, 0x27, 0xa9, 0x4a, ++ 0x44, 0x55, 0x87, 0xe1, 0x77, 0x5a, 0xbd, 0xcb, 0xc1, 0xce, 0x95, 0x4b, ++ 0x1e, 0x23, 0xd2, 0x91, 0xc9, 0xc6, 0xf9, 0x05, 0xdf, 0x87, 0x31, 0x7e, ++ 0x21, 0xb4, 0x78, 0x19, 0x71, 0x31, 0x7f, 0xf2, 0xf7, 0xd1, 0x33, 0xdd, ++ 0x60, 0xe7, 0x40, 0xbf, 0xc8, 0xa7, 0x7f, 0x40, 0xcf, 0xb9, 0xb7, 0x8b, ++ 0xc4, 0x9f, 0xc0, 0xb7, 0x72, 0x1a, 0x52, 0x88, 0x3f, 0xe1, 0x7b, 0xcf, ++ 0x52, 0x97, 0xae, 0x9c, 0x79, 0x53, 0x8e, 0xee, 0x7b, 0xf7, 0x82, 0xd1, ++ 0xba, 0x7a, 0x5b, 0xc5, 0x04, 0x5d, 0x3d, 0x51, 0xf3, 0x70, 0xbf, 0xac, ++ 0xe6, 0x74, 0x95, 0x52, 0x5a, 0xae, 0xab, 0xd7, 0xce, 0xbb, 0x93, 0xee, ++ 0x3c, 0x9d, 0xfe, 0x6c, 0x28, 0x9a, 0xae, 0xfb, 0xee, 0x6c, 0x89, 0x82, ++ 0xbf, 0xe3, 0x71, 0x6a, 0xae, 0xf6, 0x7b, 0x1f, 0x5e, 0x33, 0xf0, 0x85, ++ 0xd5, 0xf6, 0xd1, 0x59, 0x20, 0x77, 0x9e, 0x6a, 0x9b, 0x0a, 0x4a, 0x36, ++ 0x79, 0x86, 0xee, 0x27, 0x38, 0xa2, 0xf4, 0xb4, 0x93, 0xe5, 0xf9, 0x3e, ++ 0x0d, 0xf1, 0x51, 0x5a, 0xff, 0xf3, 0x36, 0x15, 0xdf, 0xef, 0xa1, 0xf5, ++ 0x54, 0x73, 0x21, 0x4f, 0xd0, 0xfd, 0xa6, 0xd0, 0xef, 0x77, 0xb6, 0x39, ++ 0xb0, 0xfc, 0x78, 0x9b, 0x07, 0x9f, 0xdb, 0xdb, 0x14, 0x7c, 0xfe, 0xa4, ++ 0xad, 0x04, 0xeb, 0x7b, 0xdb, 0xbc, 0x58, 0x7e, 0x8c, 0xf6, 0x0f, 0xcf, ++ 0x47, 0x69, 0x3f, 0xf0, 0xfe, 0x91, 0xb6, 0x1a, 0x2c, 0x6f, 0x6a, 0xf3, ++ 0x61, 0xf9, 0xe1, 0xb6, 0x3a, 0x2c, 0x3f, 0xd8, 0xe6, 0xc7, 0xe7, 0x03, ++ 0x6d, 0xf5, 0xf8, 0xbe, 0xab, 0xad, 0x05, 0xcb, 0xeb, 0xdb, 0x5a, 0xf1, ++ 0x79, 0x7f, 0x5b, 0x00, 0x9f, 0xed, 0x6d, 0x9d, 0x58, 0x3f, 0x36, 0x8f, ++ 0xe5, 0x25, 0x3f, 0xcd, 0xcf, 0x0b, 0x3e, 0x3d, 0x93, 0x9d, 0xff, 0x4d, ++ 0xc6, 0xe3, 0x84, 0x3c, 0xcd, 0x9e, 0x66, 0x71, 0x7c, 0x7b, 0x3c, 0x8e, ++ 0x3f, 0x21, 0x6f, 0x0a, 0xe4, 0x55, 0x47, 0x74, 0xf7, 0xac, 0xc3, 0xba, ++ 0xb1, 0x3f, 0x0b, 0x5b, 0x7f, 0x72, 0x7f, 0x97, 0xe6, 0x31, 0x3d, 0x68, ++ 0x02, 0x09, 0xaf, 0xb5, 0xb2, 0x7d, 0x8c, 0xf1, 0xbf, 0xb1, 0xfd, 0xde, ++ 0xfb, 0xac, 0x94, 0xde, 0x47, 0xb5, 0x30, 0x3c, 0x14, 0xf6, 0x47, 0xb1, ++ 0x3e, 0xbb, 0x9e, 0xe1, 0xe2, 0x52, 0x2e, 0x8f, 0x89, 0x3b, 0x40, 0x72, ++ 0x2b, 0xd9, 0x71, 0x4f, 0xf8, 0xee, 0x8c, 0x10, 0xae, 0xb2, 0xb2, 0x78, ++ 0x28, 0xfa, 0x03, 0x88, 0x87, 0xae, 0xb3, 0x92, 0xdf, 0x43, 0x83, 0x64, ++ 0x17, 0x14, 0x61, 0x5e, 0xf2, 0x54, 0x26, 0x37, 0x35, 0xbc, 0xc6, 0xd6, ++ 0xed, 0x64, 0xf3, 0x84, 0xf5, 0x0f, 0x37, 0xdf, 0xcb, 0xf9, 0xfa, 0xa5, ++ 0x8a, 0x3e, 0x76, 0xcf, 0x44, 0x4d, 0x77, 0x08, 0xc8, 0x3e, 0x45, 0x6d, ++ 0xc1, 0x7b, 0x26, 0xcc, 0x75, 0xbe, 0x10, 0xfc, 0x8e, 0x84, 0xdb, 0xe7, ++ 0xc7, 0x73, 0xef, 0x13, 0xbe, 0x9a, 0x43, 0x95, 0x3d, 0xca, 0x67, 0xbe, ++ 0xba, 0x84, 0x28, 0xf4, 0x99, 0xdb, 0xa0, 0xb7, 0x7b, 0x72, 0x96, 0x96, ++ 0xeb, 0xec, 0x0b, 0xe9, 0xab, 0x87, 0x88, 0x72, 0x21, 0xed, 0xb7, 0x54, ++ 0x6f, 0x9f, 0xa4, 0x14, 0xad, 0xd6, 0xb5, 0x33, 0xe7, 0xde, 0xad, 0xab, ++ 0x37, 0xba, 0xef, 0xd3, 0xd5, 0x2f, 0xbe, 0xa5, 0x70, 0x9d, 0x07, 0xe0, ++ 0x39, 0x8a, 0x60, 0x9c, 0xc4, 0xb4, 0x71, 0x2d, 0x81, 0xd0, 0xde, 0xb2, ++ 0x9e, 0x4d, 0x38, 0xaf, 0x56, 0x0e, 0xf7, 0x33, 0x82, 0x82, 0xe7, 0x66, ++ 0x03, 0xfb, 0xb4, 0x38, 0x39, 0xd3, 0xcf, 0x7f, 0xca, 0xe5, 0x0a, 0x31, ++ 0x6f, 0xc4, 0xfd, 0x30, 0xce, 0xc9, 0x8a, 0xc5, 0x69, 0x01, 0x11, 0xe4, ++ 0xc2, 0x67, 0xbf, 0x4c, 0x43, 0x7e, 0xf4, 0xe4, 0xe3, 0x62, 0x10, 0xfc, ++ 0xa0, 0xe3, 0x49, 0x50, 0x84, 0xfd, 0x3f, 0x91, 0xaa, 0x7b, 0x50, 0x3f, ++ 0x09, 0x6e, 0xaa, 0x95, 0xf0, 0xea, 0x12, 0x09, 0xca, 0x65, 0x44, 0x91, ++ 0xa0, 0x7c, 0x21, 0x89, 0xa2, 0x7d, 0x42, 0xf5, 0xf3, 0x96, 0xbc, 0x0c, ++ 0xd4, 0xcf, 0x1f, 0xb7, 0x40, 0x9c, 0x2e, 0xcf, 0xff, 0x53, 0x96, 0x3f, ++ 0x14, 0x42, 0xb9, 0x59, 0xcc, 0xf1, 0x59, 0xac, 0xd9, 0x23, 0x5b, 0xe4, ++ 0x64, 0xff, 0xe8, 0x9d, 0x79, 0x48, 0x87, 0xfa, 0x73, 0x43, 0x1d, 0x5c, ++ 0x4f, 0x5f, 0xeb, 0xac, 0xcc, 0x82, 0xf8, 0xe4, 0x99, 0x11, 0xf2, 0xbb, ++ 0xec, 0x9e, 0xe9, 0xd3, 0xe1, 0xf7, 0xac, 0xec, 0xd9, 0x53, 0xf1, 0xa9, ++ 0xbd, 0x7f, 0x50, 0x11, 0x87, 0x3d, 0x0f, 0xdb, 0x95, 0x44, 0xf7, 0xe3, ++ 0x29, 0x91, 0x73, 0xba, 0xef, 0x82, 0x79, 0x9c, 0xae, 0x78, 0x33, 0x13, ++ 0xcc, 0xbd, 0xa6, 0xa2, 0x28, 0xd2, 0xff, 0x19, 0x41, 0xf5, 0x2c, 0x02, ++ 0xb8, 0xbe, 0x22, 0x31, 0x3a, 0x1c, 0xc8, 0xc6, 0x75, 0xc9, 0x1c, 0xae, ++ 0xf2, 0xbe, 0x99, 0x9e, 0x45, 0x14, 0x7e, 0xf2, 0xeb, 0x63, 0xbc, 0x01, ++ 0x12, 0x1f, 0xe7, 0xc9, 0x36, 0x75, 0xba, 0x2c, 0xc7, 0xcb, 0xc5, 0x3c, ++ 0x3f, 0x71, 0x6f, 0xdb, 0xbc, 0xe9, 0xd5, 0x09, 0xef, 0x0f, 0xf0, 0xf9, ++ 0x94, 0x90, 0x70, 0x0d, 0xc8, 0xa7, 0x92, 0x52, 0xd1, 0x1b, 0xc4, 0x9e, ++ 0x3d, 0x3a, 0xfe, 0x65, 0x29, 0xea, 0x56, 0xe1, 0x3c, 0xb7, 0x5c, 0x4e, ++ 0xbc, 0xc0, 0xde, 0xc6, 0x93, 0xee, 0xfb, 0x40, 0x56, 0xcb, 0x7f, 0x91, ++ 0x30, 0xdf, 0x44, 0x3e, 0x3a, 0x8d, 0x28, 0xd4, 0x2e, 0xb0, 0xd9, 0x42, ++ 0x04, 0xf2, 0x73, 0x0e, 0xc4, 0xd6, 0x49, 0x74, 0xbf, 0x73, 0xf4, 0xa5, ++ 0xa3, 0x3a, 0x0d, 0xef, 0xe5, 0xcb, 0x89, 0xf1, 0x3d, 0x90, 0x89, 0xf0, ++ 0xbb, 0x46, 0x61, 0xa0, 0x9f, 0x2f, 0x7b, 0x0c, 0x6c, 0x5d, 0x47, 0xf5, ++ 0xf5, 0x25, 0x36, 0x96, 0x47, 0xb3, 0xbc, 0xc4, 0x18, 0x54, 0x04, 0x08, ++ 0x6f, 0x77, 0xe3, 0xfd, 0x73, 0xf2, 0x0e, 0x81, 0x80, 0xea, 0x2f, 0xff, ++ 0x65, 0x16, 0xc2, 0x81, 0x3c, 0x67, 0x45, 0xfa, 0xb3, 0x6e, 0x99, 0x8c, ++ 0x57, 0x57, 0x5f, 0x25, 0xfb, 0xb7, 0x23, 0x5c, 0x43, 0xca, 0x73, 0xe2, ++ 0x18, 0x4e, 0x8b, 0xf4, 0xbb, 0xc6, 0x89, 0xc6, 0x5d, 0xa0, 0x8f, 0x8d, ++ 0x03, 0xb8, 0xc0, 0x82, 0x8a, 0x4a, 0x10, 0xae, 0xcb, 0xf8, 0x7a, 0xf7, ++ 0xb6, 0x2d, 0x42, 0x38, 0xbd, 0xca, 0xe9, 0xbb, 0x23, 0x2f, 0x69, 0x3e, ++ 0xc4, 0xab, 0xc2, 0xfd, 0x8c, 0xcb, 0x7b, 0x34, 0xff, 0x87, 0x7e, 0x9d, ++ 0x0f, 0x56, 0x54, 0x5d, 0x0d, 0xf7, 0xd9, 0xb5, 0x87, 0x25, 0xae, 0x2b, ++ 0xe9, 0xe1, 0xb9, 0xc1, 0x10, 0x9e, 0xbc, 0x88, 0x76, 0x7d, 0x3a, 0x42, ++ 0xe7, 0x25, 0xe1, 0x3c, 0x5f, 0x05, 0x3a, 0x96, 0xb6, 0x54, 0xe2, 0xef, ++ 0x1c, 0x51, 0x01, 0x82, 0xeb, 0x6b, 0x7c, 0x9c, 0xda, 0xfb, 0x85, 0xc8, ++ 0x8f, 0x6a, 0x50, 0x6e, 0x4f, 0x11, 0x31, 0x4f, 0x34, 0x99, 0xae, 0xde, ++ 0xe0, 0x7c, 0x6c, 0x61, 0x1e, 0xf3, 0xe7, 0xd9, 0x3d, 0x97, 0x4c, 0x87, ++ 0xdf, 0x5b, 0x8b, 0x97, 0x67, 0x20, 0x7d, 0x3e, 0x25, 0x32, 0x3f, 0x6b, ++ 0x40, 0x64, 0xf6, 0xa5, 0x96, 0x47, 0x41, 0x15, 0x07, 0x05, 0xec, 0xba, ++ 0x82, 0x7c, 0x91, 0xe3, 0xad, 0x83, 0x5c, 0x0e, 0xf2, 0xda, 0x29, 0x62, ++ 0xfe, 0x9d, 0xb4, 0x33, 0x05, 0xcf, 0x01, 0x4a, 0x4e, 0x19, 0xf3, 0x7d, ++ 0x3b, 0x6c, 0xd5, 0x8e, 0x55, 0xd0, 0x8f, 0x43, 0xc6, 0xf8, 0xc6, 0x1c, ++ 0x69, 0x46, 0x18, 0xf4, 0x66, 0x93, 0x53, 0xbc, 0x10, 0xf4, 0xee, 0x63, ++ 0xbb, 0xee, 0x0e, 0x43, 0x9e, 0x87, 0x94, 0x27, 0x13, 0xf0, 0x17, 0x75, ++ 0x38, 0x64, 0xa6, 0x77, 0xe4, 0x8a, 0x98, 0x17, 0x25, 0x3b, 0xab, 0xcd, ++ 0x10, 0x0f, 0x29, 0xb6, 0x9d, 0x9c, 0x09, 0xf0, 0x3c, 0xb2, 0xf3, 0x4e, ++ 0xf4, 0x6f, 0x48, 0x77, 0xf0, 0x5c, 0x0d, 0xee, 0x4f, 0x32, 0x70, 0x94, ++ 0x75, 0x90, 0x16, 0xec, 0x3f, 0x90, 0x2b, 0xf3, 0x7b, 0x33, 0xd4, 0xda, ++ 0xb2, 0x4c, 0xee, 0xca, 0x57, 0xc0, 0xfe, 0xa9, 0xf9, 0x04, 0xfc, 0x28, ++ 0xc7, 0x1c, 0x67, 0x2d, 0xa0, 0xaf, 0x28, 0xb6, 0xe5, 0xe8, 0x4f, 0x73, ++ 0xe5, 0x17, 0xe2, 0x7a, 0x0c, 0x10, 0xf7, 0xa2, 0xe5, 0xc7, 0xd7, 0x9c, ++ 0x75, 0x02, 0xdf, 0x7a, 0x65, 0xe7, 0x3a, 0x57, 0x21, 0xe8, 0xcf, 0x41, ++ 0x19, 0x75, 0x90, 0x92, 0x6f, 0xda, 0x73, 0xf0, 0x7c, 0xf7, 0x4e, 0x23, ++ 0x9e, 0x3f, 0xd7, 0xe0, 0x5a, 0x10, 0x90, 0x75, 0xf1, 0xb3, 0xbc, 0x56, ++ 0x7d, 0xd9, 0x94, 0x14, 0x47, 0x33, 0x24, 0x9d, 0xff, 0x31, 0xe5, 0x17, ++ 0x72, 0xbf, 0x6d, 0x1d, 0x09, 0x25, 0xac, 0xc7, 0xe0, 0x61, 0xf6, 0x1a, ++ 0x71, 0xdb, 0x50, 0x1f, 0x77, 0xe5, 0x0b, 0xe4, 0x5b, 0x31, 0x5e, 0xb6, ++ 0xf0, 0xf2, 0x5e, 0x43, 0x20, 0xc7, 0x4b, 0xe1, 0x73, 0x74, 0xe7, 0xf2, ++ 0x02, 0x58, 0xd7, 0xb9, 0x17, 0xfc, 0x98, 0x6f, 0x3b, 0x92, 0xbe, 0xff, ++ 0x4e, 0x9e, 0xc2, 0xc7, 0x0b, 0x58, 0x44, 0xbc, 0xc7, 0x34, 0x64, 0x81, ++ 0xfc, 0xdb, 0xdd, 0x6d, 0x24, 0x03, 0xf4, 0x3b, 0x73, 0x50, 0xc6, 0xfc, ++ 0xe7, 0x3d, 0x9c, 0x9f, 0x15, 0xd9, 0x18, 0xfd, 0x7f, 0x99, 0xcf, 0xf6, ++ 0x6b, 0xf2, 0xb3, 0xa8, 0x9b, 0xed, 0x3b, 0xf9, 0xe9, 0x94, 0xa0, 0x15, ++ 0xf0, 0xe6, 0xe8, 0x2b, 0x0f, 0x50, 0x3a, 0x99, 0xf8, 0xe2, 0x5c, 0xa2, ++ 0x50, 0xf9, 0x57, 0xe4, 0x50, 0xd1, 0x7f, 0x58, 0xd4, 0x6a, 0xcc, 0x80, ++ 0x38, 0xfe, 0x9c, 0x7f, 0xb2, 0x21, 0x9d, 0x9c, 0xb5, 0xa5, 0xa0, 0x9f, ++ 0x50, 0x6e, 0x4d, 0xf1, 0xc2, 0xfb, 0xf6, 0x5d, 0x95, 0x25, 0x89, 0xe7, ++ 0x9a, 0x82, 0x6d, 0x8e, 0x0c, 0xc8, 0x8f, 0xd9, 0xd5, 0x66, 0xce, 0x00, ++ 0x3e, 0x15, 0x1c, 0x81, 0xbf, 0x8e, 0x71, 0x8a, 0x98, 0x37, 0xac, 0x88, ++ 0x2c, 0xaf, 0x6d, 0x2a, 0x9f, 0xd7, 0xd4, 0x7c, 0x2b, 0x3e, 0x2f, 0xe2, ++ 0xe5, 0x27, 0xe4, 0xc0, 0x7c, 0x98, 0xe7, 0x13, 0x14, 0x9f, 0x90, 0xaf, ++ 0x7c, 0x64, 0x23, 0xd3, 0x87, 0x57, 0xaf, 0x35, 0xe3, 0x3c, 0x56, 0xbf, ++ 0x32, 0x06, 0xf5, 0xaa, 0x91, 0xe0, 0xf6, 0x64, 0x9b, 0x27, 0x03, 0xee, ++ 0x61, 0xdf, 0xb5, 0x51, 0xcc, 0x01, 0xff, 0xd1, 0xcc, 0xae, 0xa2, 0x0d, ++ 0x70, 0x1f, 0xc1, 0x6a, 0x3b, 0xbb, 0x8f, 0x55, 0x4a, 0x9b, 0x80, 0xfe, ++ 0x4e, 0xf2, 0xcf, 0x06, 0x02, 0xfa, 0x7b, 0x7b, 0xea, 0x74, 0xef, 0x92, ++ 0x04, 0xfe, 0x2e, 0xa5, 0xcd, 0x28, 0x01, 0xba, 0x92, 0xa4, 0x40, 0x0e, ++ 0xf8, 0x45, 0xae, 0xcc, 0x9f, 0x79, 0x35, 0xe4, 0x35, 0x52, 0xfc, 0x6d, ++ 0x85, 0xf2, 0xb5, 0x3b, 0x4a, 0xae, 0x86, 0x3c, 0xc6, 0xbd, 0xf6, 0x40, ++ 0x0e, 0xe4, 0x39, 0xfe, 0x68, 0x47, 0x29, 0x2b, 0x67, 0x04, 0xb6, 0x42, ++ 0x9e, 0xe3, 0xb2, 0x1d, 0x5e, 0x56, 0xce, 0x0b, 0xe4, 0xc0, 0xef, 0x39, ++ 0x35, 0xee, 0xa8, 0x60, 0xe5, 0xb1, 0x81, 0xad, 0x50, 0xbe, 0x63, 0xc7, ++ 0x54, 0x56, 0x06, 0xdf, 0x13, 0xe5, 0x9d, 0xf7, 0xee, 0x98, 0x71, 0x35, ++ 0xf0, 0xd9, 0x76, 0xa3, 0xb7, 0x1e, 0x18, 0xf2, 0x2f, 0xe8, 0xfc, 0x4b, ++ 0xe9, 0xfc, 0xfb, 0xf8, 0xb3, 0x8d, 0xc3, 0x45, 0xab, 0x7f, 0x16, 0xde, ++ 0x53, 0x38, 0xef, 0xe7, 0xcf, 0xe4, 0xfa, 0xe7, 0x78, 0xbb, 0xfe, 0x11, ++ 0xea, 0x0f, 0xf2, 0xfa, 0x81, 0x11, 0xfa, 0x3f, 0xcc, 0xdb, 0x85, 0x46, ++ 0x68, 0x7f, 0x94, 0xb7, 0x3b, 0x36, 0x42, 0xfb, 0x97, 0x79, 0xbb, 0xe3, ++ 0x23, 0xd4, 0xbf, 0xca, 0xeb, 0x5f, 0x1b, 0xa1, 0xff, 0x7f, 0xe1, 0xed, ++ 0xc2, 0x23, 0xb4, 0x7f, 0x93, 0xb7, 0xfb, 0xcd, 0x08, 0xed, 0xdf, 0xe6, ++ 0xed, 0xde, 0x19, 0xa1, 0xfe, 0x3d, 0x5e, 0xff, 0x6f, 0x49, 0xfd, 0x9f, ++ 0xe0, 0xdf, 0x47, 0xf8, 0xfb, 0xd1, 0xf6, 0x8d, 0xef, 0x85, 0x28, 0xdd, ++ 0x8d, 0xa6, 0x7c, 0x04, 0xf8, 0x52, 0x89, 0x7d, 0xa3, 0x0b, 0xf6, 0xf9, ++ 0xae, 0xce, 0x0a, 0xa4, 0xff, 0xf6, 0x4a, 0x16, 0xdf, 0xd1, 0xe8, 0x7d, ++ 0x34, 0xfc, 0x8e, 0x12, 0xad, 0xa7, 0xda, 0x0c, 0xee, 0xdb, 0x68, 0x3e, ++ 0xe3, 0xe3, 0xbd, 0xf9, 0x4c, 0xee, 0x50, 0x3a, 0x7c, 0x18, 0xe8, 0x6e, ++ 0xf5, 0xeb, 0x12, 0xe6, 0xbb, 0xb4, 0x8b, 0xde, 0x8f, 0x83, 0xc0, 0x47, ++ 0x37, 0x88, 0xa8, 0x0f, 0xac, 0x7e, 0x85, 0xd9, 0xe7, 0xab, 0xbb, 0xe4, ++ 0x60, 0xe2, 0x39, 0x08, 0xad, 0xbd, 0x36, 0xff, 0x75, 0x7c, 0x7e, 0x1d, ++ 0x7c, 0xbe, 0x9b, 0xf2, 0x59, 0x3e, 0xb5, 0xc9, 0xe3, 0xc9, 0xa8, 0x4d, ++ 0xf4, 0x23, 0x39, 0xf4, 0x65, 0x48, 0x8f, 0x02, 0xbe, 0x4b, 0xf9, 0x37, ++ 0xe6, 0xcf, 0x96, 0x74, 0x55, 0x75, 0x96, 0xd0, 0xf2, 0x28, 0x97, 0x88, ++ 0x1a, 0x88, 0xdc, 0x68, 0x0e, 0xc1, 0xbd, 0x08, 0xb2, 0x9d, 0xcb, 0x05, ++ 0x47, 0x45, 0x77, 0x09, 0xcc, 0xcf, 0x26, 0xe3, 0x79, 0x70, 0xd9, 0x29, ++ 0x87, 0xf6, 0x42, 0x7b, 0x4f, 0x05, 0xea, 0x77, 0xda, 0xfc, 0x3a, 0x6c, ++ 0x32, 0xde, 0x8b, 0x25, 0xd9, 0x99, 0x1c, 0x98, 0xf3, 0x4f, 0x33, 0x1c, ++ 0xa0, 0x67, 0x75, 0x10, 0x7f, 0x58, 0x85, 0xf6, 0x1e, 0x19, 0xf5, 0xf7, ++ 0x23, 0x9d, 0xe5, 0x0e, 0xe0, 0x7b, 0x46, 0xfb, 0x52, 0x07, 0xfe, 0x2e, ++ 0xa0, 0xc2, 0xe0, 0x5e, 0xdd, 0x54, 0x92, 0x02, 0xfc, 0x5a, 0x7a, 0x50, ++ 0x44, 0xfe, 0x7d, 0xcc, 0xc1, 0xf6, 0xfb, 0x0e, 0x8f, 0x88, 0x7e, 0x0b, ++ 0x2a, 0x57, 0xf0, 0x5c, 0x09, 0xe5, 0xd7, 0x5e, 0x90, 0x11, 0xe3, 0x48, ++ 0x68, 0x2d, 0xf0, 0xcd, 0xbd, 0x0f, 0x3d, 0xb7, 0x88, 0xf9, 0xf5, 0x88, ++ 0xbd, 0xac, 0x12, 0xcf, 0x6d, 0x68, 0xf1, 0x60, 0x41, 0x4e, 0xd0, 0xff, ++ 0x3f, 0x00, 0xf8, 0xc0, 0x79, 0x09, 0x2e, 0x47, 0x64, 0x90, 0x2f, 0xf4, ++ 0xf9, 0x44, 0x05, 0x3f, 0x6f, 0x10, 0x60, 0xfe, 0xa7, 0x02, 0x99, 0x78, ++ 0x46, 0x25, 0x9c, 0x9b, 0xfc, 0x20, 0x5f, 0x62, 0xe7, 0x3d, 0x64, 0x80, ++ 0x11, 0xed, 0x4b, 0xaa, 0xc5, 0xfb, 0x81, 0xf2, 0xd7, 0xc8, 0x3a, 0xff, ++ 0x7b, 0xee, 0xed, 0xfa, 0xb2, 0x31, 0x49, 0x6e, 0xc8, 0x49, 0x72, 0x65, ++ 0x4c, 0x27, 0xe5, 0x93, 0x09, 0x72, 0xa7, 0x30, 0xe0, 0xd0, 0x95, 0xc3, ++ 0xf9, 0xdc, 0xaf, 0xe3, 0x25, 0x5e, 0xd0, 0x5f, 0xe7, 0xfc, 0xd3, 0x46, ++ 0xe4, 0x87, 0x67, 0x41, 0xbe, 0x09, 0x23, 0xf3, 0xbd, 0x18, 0xff, 0xe5, ++ 0xfc, 0xf8, 0x09, 0x7e, 0xdf, 0xcd, 0x13, 0x01, 0x76, 0x5e, 0xf7, 0xc8, ++ 0xc6, 0xf2, 0x57, 0x01, 0xdf, 0xab, 0xbb, 0x44, 0xbc, 0xdf, 0xf9, 0x7c, ++ 0xf9, 0x68, 0x6f, 0x3e, 0x41, 0x38, 0x8c, 0xf5, 0x53, 0xb9, 0x03, 0xfa, ++ 0x8c, 0x4c, 0x72, 0xc0, 0x5e, 0xfa, 0x3e, 0x38, 0x8c, 0x35, 0xf8, 0x5c, ++ 0x78, 0x7f, 0xc1, 0xf7, 0xc0, 0x63, 0xec, 0xa3, 0x15, 0x2e, 0xe0, 0xb7, ++ 0x63, 0xfd, 0x32, 0xca, 0x9d, 0x21, 0x72, 0xe3, 0x7b, 0xe0, 0xf5, 0x8c, ++ 0xe0, 0x7d, 0xc7, 0x0f, 0x78, 0x74, 0xa6, 0x30, 0xbd, 0xda, 0xc1, 0xd6, ++ 0xdd, 0x91, 0xe9, 0x66, 0xf7, 0xfe, 0xf0, 0x73, 0x80, 0x12, 0xd7, 0xd7, ++ 0xee, 0xe7, 0x7e, 0x70, 0x39, 0x6d, 0x8e, 0x02, 0x3f, 0xc5, 0xd1, 0xe1, ++ 0x6c, 0xc1, 0xf2, 0x3a, 0xc1, 0x9b, 0x75, 0x05, 0xfd, 0x7e, 0xbd, 0xe0, ++ 0x77, 0x40, 0xf9, 0xb8, 0x2b, 0x85, 0xc9, 0x9d, 0xbc, 0x14, 0xa4, 0xc3, ++ 0xbd, 0xa0, 0xcb, 0xe0, 0x7d, 0x82, 0x1e, 0x1f, 0xf8, 0x47, 0xfa, 0x82, ++ 0x46, 0xed, 0x3e, 0xc0, 0x10, 0xfc, 0xdf, 0x3e, 0xc8, 0x93, 0xd1, 0xee, ++ 0x1b, 0xf4, 0xa0, 0x7e, 0xc6, 0xef, 0x27, 0x7c, 0xe0, 0xea, 0x6a, 0xba, ++ 0xbe, 0x3e, 0xd9, 0x31, 0x11, 0x54, 0xce, 0x31, 0x8f, 0x3f, 0xf4, 0xb0, ++ 0x81, 0xea, 0xa0, 0xfb, 0x8c, 0x24, 0xf6, 0x3d, 0x9c, 0x6b, 0x7a, 0xea, ++ 0x98, 0xc8, 0xef, 0x1f, 0xec, 0x79, 0x18, 0xf4, 0xd5, 0x7d, 0x29, 0x44, ++ 0x77, 0xdf, 0xe2, 0x3e, 0xf0, 0xa3, 0x63, 0x7f, 0x8f, 0x3d, 0x0c, 0xf7, ++ 0x27, 0xd2, 0xf1, 0xae, 0x90, 0xa8, 0x0d, 0x36, 0xa5, 0x60, 0xc7, 0xc3, ++ 0xb6, 0xec, 0xf8, 0x7c, 0xbc, 0xca, 0x13, 0x0f, 0xaf, 0xc5, 0x7c, 0x55, ++ 0x66, 0x97, 0x38, 0x09, 0xbb, 0x0f, 0xfb, 0xb4, 0x12, 0x49, 0x85, 0xed, ++ 0x42, 0xed, 0x93, 0xbc, 0x02, 0xb0, 0xcb, 0x77, 0x9e, 0xcc, 0xd4, 0xfd, ++ 0xfe, 0x19, 0xff, 0x3e, 0x8d, 0x7f, 0xdf, 0x34, 0x10, 0x6d, 0x7a, 0x5a, ++ 0xc1, 0xef, 0xc7, 0x14, 0x40, 0x3e, 0x7e, 0x7f, 0x34, 0xb5, 0x14, 0xf7, ++ 0x57, 0xb4, 0x32, 0xf1, 0xfb, 0x54, 0x6e, 0xef, 0x27, 0x7c, 0x3f, 0xfe, ++ 0xbb, 0xbe, 0x2f, 0xd1, 0xe6, 0xf3, 0xf4, 0x9b, 0xd7, 0x95, 0xb2, 0xef, ++ 0x2f, 0x80, 0xef, 0xcf, 0x28, 0x91, 0x4c, 0xcc, 0x3d, 0x49, 0x9a, 0x4f, ++ 0xfa, 0xd0, 0xfe, 0xa7, 0xe0, 0xfc, 0x47, 0xe8, 0x7f, 0x02, 0xff, 0xfe, ++ 0x74, 0xe8, 0x4d, 0xfc, 0xfe, 0x0c, 0x89, 0x64, 0x4e, 0x2a, 0xc4, 0x76, ++ 0x33, 0xa0, 0xdd, 0xe0, 0x6b, 0x6f, 0x56, 0xf2, 0x75, 0x67, 0x82, 0x9e, ++ 0x4c, 0xb9, 0xe2, 0xc5, 0xf0, 0xde, 0xaa, 0x10, 0x7e, 0xef, 0x5a, 0x0b, ++ 0xea, 0xcf, 0x7d, 0xe6, 0x6e, 0x07, 0xe8, 0x6b, 0x16, 0x43, 0xb7, 0x0f, ++ 0xf8, 0x6e, 0x11, 0xdc, 0x9f, 0x34, 0x35, 0xfe, 0x54, 0x0b, 0x8a, 0x98, ++ 0x5e, 0x95, 0xf4, 0xbe, 0xcf, 0x4c, 0xd2, 0x6b, 0x81, 0x1e, 0x5b, 0x45, ++ 0xb4, 0x5f, 0xfa, 0xcc, 0xe1, 0xf2, 0x52, 0xd0, 0xa7, 0x9f, 0xb7, 0x91, ++ 0xb5, 0x74, 0x0c, 0xb1, 0x60, 0x8d, 0x17, 0xf8, 0x60, 0x7f, 0x64, 0xb5, ++ 0xb7, 0x94, 0x7e, 0xb7, 0x23, 0x77, 0x06, 0xda, 0x15, 0xfb, 0x8c, 0x2d, ++ 0x7d, 0x78, 0xce, 0x76, 0x91, 0x0d, 0xcf, 0x81, 0xee, 0x70, 0x74, 0x3b, ++ 0x60, 0xff, 0x58, 0x9c, 0xdd, 0x0e, 0x88, 0x23, 0x48, 0x77, 0x31, 0xfd, ++ 0x49, 0x5e, 0x6c, 0xf3, 0xef, 0x06, 0xfa, 0x0b, 0xad, 0x2e, 0x59, 0x96, ++ 0xb0, 0x7f, 0xbd, 0x0a, 0x3b, 0x3f, 0xd6, 0xf5, 0x92, 0x6d, 0x23, 0xd8, ++ 0x01, 0x5d, 0x06, 0x6f, 0xf7, 0x38, 0xd0, 0xb3, 0xed, 0x32, 0xe6, 0x81, ++ 0xcb, 0x8b, 0x07, 0x2e, 0xc7, 0x73, 0x7b, 0xbf, 0x10, 0x09, 0xf2, 0x77, ++ 0xba, 0xae, 0x2a, 0x5a, 0xee, 0x68, 0x14, 0xf1, 0x5e, 0xf8, 0x35, 0xca, ++ 0xe2, 0x45, 0x80, 0x07, 0x22, 0xfb, 0x7c, 0x55, 0xb4, 0x5d, 0x7e, 0x86, ++ 0x2c, 0xc0, 0x39, 0x88, 0xfb, 0x65, 0x9f, 0x19, 0xe2, 0x17, 0x26, 0xae, ++ 0xb7, 0xed, 0xf0, 0xb2, 0xdf, 0x5d, 0xd5, 0xc6, 0x5d, 0x5f, 0xc0, 0xf8, ++ 0xf8, 0xfa, 0x02, 0x76, 0x3f, 0x54, 0xd7, 0xa2, 0xa7, 0x4b, 0x5e, 0xa6, ++ 0xed, 0x76, 0xb4, 0xae, 0xee, 0x83, 0xf1, 0x2c, 0xe3, 0xcd, 0x04, 0xf2, ++ 0xbd, 0x76, 0xe4, 0x9e, 0xea, 0x82, 0x73, 0x9b, 0x3f, 0xf1, 0x50, 0x8b, ++ 0x97, 0xc2, 0xc1, 0xd6, 0x20, 0xe2, 0xef, 0xa2, 0xfc, 0xa4, 0x96, 0x7e, ++ 0x93, 0x06, 0xfe, 0x0c, 0xa3, 0xce, 0x5f, 0xf1, 0x8c, 0xd0, 0x87, 0xdf, ++ 0x07, 0x1a, 0x45, 0xb4, 0x13, 0x6c, 0xa5, 0x46, 0x9d, 0x7f, 0x23, 0xbd, ++ 0x41, 0x54, 0xc1, 0xef, 0xb8, 0x55, 0xf1, 0xb7, 0x02, 0xfe, 0x2e, 0x7c, ++ 0x5d, 0xbe, 0x02, 0xc6, 0xf3, 0x8c, 0x95, 0x1d, 0x20, 0x9f, 0x1e, 0xf4, ++ 0xfc, 0xc6, 0x2c, 0xd2, 0x79, 0xa6, 0x56, 0xe8, 0xfb, 0x75, 0xcc, 0xd0, ++ 0xf7, 0xe3, 0xaa, 0xd6, 0xd7, 0xbb, 0x6b, 0xf5, 0xf5, 0x99, 0x0b, 0xf4, ++ 0xf5, 0x9e, 0x9b, 0x8c, 0x49, 0xfe, 0x1a, 0x7d, 0xf9, 0x6b, 0x10, 0x44, ++ 0x00, 0x47, 0xca, 0x03, 0x6c, 0x54, 0x0e, 0xa5, 0xb0, 0x2a, 0x92, 0x62, ++ 0x3b, 0x87, 0xbf, 0xcb, 0xd5, 0xe5, 0xdf, 0xd6, 0x3d, 0x8e, 0xae, 0xc7, ++ 0x64, 0x0d, 0x94, 0xbd, 0x4c, 0xe7, 0x9b, 0x32, 0x21, 0x05, 0xed, 0xfd, ++ 0xf5, 0x2f, 0xa5, 0xc0, 0xe6, 0xa3, 0xfc, 0x87, 0x20, 0xdf, 0x59, 0x3f, ++ 0x89, 0x60, 0xfe, 0xe9, 0xd1, 0xbc, 0x3b, 0x3d, 0x20, 0x4f, 0x93, 0xe1, ++ 0xb3, 0x23, 0xd7, 0x88, 0xeb, 0xb5, 0x15, 0x51, 0x78, 0x16, 0x82, 0xbd, ++ 0xfe, 0x31, 0xfe, 0x7e, 0x96, 0x8d, 0x24, 0x7c, 0x57, 0x08, 0xf0, 0x51, ++ 0x7b, 0x0b, 0x58, 0xbe, 0x09, 0xf1, 0x54, 0x82, 0x7f, 0x8e, 0x20, 0x1f, ++ 0x7c, 0x46, 0xf3, 0x1f, 0x5f, 0xcb, 0xce, 0x35, 0xed, 0x68, 0x65, 0x7e, ++ 0xe9, 0x07, 0xeb, 0x58, 0x7e, 0x1e, 0xae, 0xa0, 0x12, 0xf6, 0x37, 0xfb, ++ 0x3e, 0x15, 0x7e, 0xcf, 0x6b, 0x32, 0xf8, 0xed, 0x3b, 0x6f, 0x85, 0xbc, ++ 0xc3, 0x64, 0xb8, 0x66, 0x41, 0x3e, 0x8e, 0x14, 0xa7, 0x8f, 0x75, 0xda, ++ 0x39, 0x12, 0x38, 0xc5, 0x58, 0xc9, 0xd8, 0x32, 0xec, 0xbb, 0x88, 0xc2, ++ 0xee, 0xb9, 0x7c, 0x9a, 0xd3, 0xcd, 0x3e, 0x7e, 0xef, 0x41, 0xec, 0x7b, ++ 0xd8, 0x87, 0x99, 0x84, 0x99, 0xb2, 0xb4, 0xbf, 0xe7, 0x0b, 0x34, 0xff, ++ 0x03, 0xcb, 0xcb, 0xdf, 0xac, 0xc5, 0x63, 0x78, 0x19, 0xae, 0x0b, 0x84, ++ 0xf2, 0xbe, 0x63, 0xae, 0x2b, 0x60, 0x3f, 0x6d, 0x5e, 0xe0, 0x2a, 0x87, ++ 0xfd, 0xb4, 0x9e, 0xeb, 0x65, 0x69, 0xb9, 0x46, 0x75, 0x3c, 0x9d, 0xef, ++ 0x23, 0xc7, 0x8d, 0x01, 0xe1, 0x02, 0x5a, 0x96, 0xc9, 0x31, 0x03, 0x95, ++ 0xe7, 0xfb, 0x5c, 0x6c, 0x5c, 0xe3, 0x2b, 0x29, 0x01, 0x38, 0xd7, 0xf4, ++ 0x88, 0xa7, 0x02, 0xcf, 0x49, 0xbd, 0xc3, 0xc7, 0x7b, 0x76, 0xa6, 0xf7, ++ 0xad, 0x5a, 0xdc, 0x8f, 0x32, 0xe6, 0x39, 0x3d, 0xe2, 0xf6, 0x5a, 0xca, ++ 0x99, 0xbe, 0x01, 0x77, 0x4a, 0x13, 0xfc, 0x49, 0x54, 0xaa, 0x5a, 0x1c, ++ 0xa9, 0x2d, 0x47, 0x3b, 0xf5, 0x11, 0xd5, 0x6b, 0x81, 0xfd, 0xfa, 0x48, ++ 0xae, 0xd7, 0x02, 0x79, 0xc2, 0x96, 0x6c, 0xd9, 0x01, 0xfb, 0xd8, 0xe5, ++ 0x91, 0xf1, 0xbe, 0xaa, 0x47, 0xcc, 0x7e, 0x07, 0xe8, 0x2d, 0x2e, 0x2a, ++ 0x00, 0xe1, 0x77, 0xda, 0x8c, 0x79, 0xdd, 0x73, 0xf1, 0x7c, 0x10, 0x85, ++ 0xa1, 0x58, 0xc9, 0x42, 0x02, 0x84, 0xe7, 0xd3, 0x41, 0x3e, 0x5b, 0x3a, ++ 0x87, 0xd7, 0x0e, 0xcf, 0x52, 0x07, 0x9c, 0x23, 0x77, 0x17, 0xed, 0xff, ++ 0x07, 0xf0, 0xab, 0xa7, 0x43, 0x7f, 0xa9, 0xac, 0x1d, 0xc0, 0xc9, 0xc9, ++ 0xe1, 0x14, 0x29, 0x50, 0x58, 0x7e, 0x30, 0xef, 0x3f, 0x7d, 0xe9, 0xb3, ++ 0xf8, 0x3d, 0xfc, 0x75, 0x54, 0x26, 0xf4, 0xe7, 0x65, 0xf4, 0x65, 0x9c, ++ 0x4b, 0x82, 0xf8, 0x7b, 0x63, 0x7c, 0x7c, 0xad, 0x9f, 0x58, 0xff, 0x44, ++ 0x45, 0xbf, 0xfd, 0xba, 0x57, 0x19, 0xdc, 0xd6, 0xe6, 0xb1, 0x7b, 0x7a, ++ 0x8c, 0xb7, 0x10, 0xb4, 0xc3, 0x9e, 0x9d, 0xe9, 0xdf, 0x7b, 0x04, 0xe0, ++ 0x93, 0x9d, 0x82, 0x76, 0x76, 0x8e, 0x27, 0xa7, 0x0a, 0xe8, 0x23, 0xe7, ++ 0xf8, 0xd6, 0xf9, 0x70, 0x1e, 0x60, 0xdd, 0xab, 0x4c, 0x7e, 0x1a, 0x97, ++ 0xb1, 0x78, 0x53, 0x8e, 0x4c, 0xcc, 0x97, 0xc0, 0xba, 0x33, 0xfc, 0x0e, ++ 0x80, 0x63, 0xf2, 0x3e, 0xcc, 0x3e, 0xd6, 0x3d, 0x0f, 0x88, 0x4d, 0xc3, ++ 0x4b, 0xf2, 0xbe, 0xcc, 0x96, 0x49, 0xa7, 0xe4, 0x1a, 0xba, 0x3f, 0xb3, ++ 0x3d, 0xee, 0xaa, 0xe2, 0xc9, 0xc3, 0xec, 0xd3, 0xa4, 0x7d, 0x90, 0x7d, ++ 0x3c, 0x7a, 0x07, 0xf4, 0x9f, 0xbc, 0x5f, 0xb7, 0x5b, 0x4f, 0x94, 0x31, ++ 0x79, 0x90, 0xf0, 0x5e, 0x8a, 0x97, 0xff, 0x3f, 0xac, 0xef, 0x8b, 0x4d, ++ 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x8b, 0x08, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xd5, 0x7d, 0x0b, 0x7c, 0x94, 0xc5, ++ 0xb9, 0xf7, 0xbc, 0x7b, 0xcb, 0x26, 0xd9, 0x24, 0x9b, 0x04, 0x42, 0x42, ++ 0x48, 0xd8, 0x5c, 0x09, 0xe4, 0xc2, 0x86, 0x9b, 0x88, 0x28, 0x0b, 0x24, ++ 0x88, 0x16, 0x71, 0x11, 0xb9, 0x69, 0x0c, 0x6f, 0x48, 0x80, 0x00, 0x09, ++ 0x04, 0xd0, 0xd3, 0x68, 0x39, 0x66, 0x21, 0x80, 0x68, 0x51, 0x43, 0x8d, ++ 0x8a, 0x16, 0x75, 0xa3, 0xc0, 0x41, 0x45, 0xcf, 0xa2, 0xa0, 0xd8, 0x46, ++ 0xbb, 0x5c, 0xa4, 0xb4, 0xde, 0xd2, 0xaa, 0x2d, 0x55, 0x4b, 0x13, 0xa1, ++ 0x0a, 0x02, 0x12, 0x43, 0xdb, 0x43, 0x7b, 0x3c, 0xf6, 0x9b, 0xff, 0x33, ++ 0x33, 0xc9, 0xbe, 0x4b, 0xa2, 0xb4, 0xdf, 0xe9, 0xef, 0xf7, 0x7d, 0xe9, ++ 0xaf, 0x0e, 0xf3, 0xbe, 0xf3, 0xce, 0x3c, 0xf3, 0x3c, 0xcf, 0x3c, 0xf3, ++ 0xdc, 0x66, 0x96, 0x31, 0xc6, 0xfe, 0x6e, 0xe6, 0xff, 0x61, 0x36, 0xe6, ++ 0xb2, 0x33, 0xfa, 0x43, 0x7d, 0xbd, 0xd6, 0x7e, 0xef, 0x90, 0x51, 0x8c, ++ 0xf9, 0x52, 0x2c, 0xee, 0x1d, 0x2e, 0xc6, 0xd2, 0x42, 0xdf, 0x67, 0xe0, ++ 0xbf, 0xdf, 0x44, 0xa0, 0xae, 0x31, 0x93, 0xeb, 0xef, 0x59, 0x8c, 0xb9, ++ 0x5d, 0xf1, 0x8c, 0xf5, 0xc7, 0xf3, 0x3a, 0x97, 0xb7, 0x90, 0xb1, 0x3d, ++ 0x36, 0xe7, 0x64, 0x47, 0x3f, 0xc6, 0x3a, 0x57, 0x32, 0xf7, 0xd3, 0xfc, ++ 0xfb, 0x49, 0xaf, 0x6e, 0xbe, 0xe5, 0x2d, 0x5e, 0xff, 0x4b, 0x9a, 0xc3, ++ 0x19, 0xc1, 0x5b, 0xa5, 0x1e, 0x6d, 0x6a, 0x2b, 0xe0, 0xcf, 0xd9, 0x7e, ++ 0x7d, 0x08, 0xda, 0x6f, 0xb3, 0xe8, 0x4f, 0x45, 0xf3, 0xf7, 0xdb, 0x8e, ++ 0x0d, 0x60, 0x3e, 0x8d, 0xb1, 0x88, 0x68, 0x56, 0x17, 0x70, 0x70, 0xa8, ++ 0x4c, 0x4c, 0x47, 0xf9, 0x77, 0xfc, 0x4d, 0xc0, 0x38, 0x56, 0x1a, 0xc7, ++ 0xed, 0x32, 0x31, 0x36, 0x9a, 0x31, 0xde, 0x85, 0xdf, 0x94, 0xfc, 0xcf, ++ 0x97, 0x81, 0x41, 0x83, 0xf2, 0x9d, 0x6e, 0xf4, 0x97, 0xdc, 0x66, 0xe7, ++ 0xfd, 0x06, 0x2c, 0xce, 0x7c, 0x0b, 0xaf, 0x67, 0x3d, 0xf5, 0xc0, 0x83, ++ 0xd6, 0x34, 0xcc, 0x83, 0xc3, 0x38, 0x8e, 0xa6, 0xed, 0x61, 0x63, 0x19, ++ 0x7b, 0xfe, 0x30, 0x1f, 0x77, 0x20, 0xaf, 0xf9, 0x9a, 0x1f, 0x2c, 0xb1, ++ 0xf0, 0xf7, 0x51, 0xdd, 0xef, 0x7d, 0x78, 0xbf, 0xc7, 0x64, 0x12, 0x75, ++ 0xdf, 0xa3, 0x0f, 0x96, 0x0c, 0x62, 0x6c, 0xd0, 0xe1, 0xc0, 0x5a, 0x87, ++ 0x93, 0xb1, 0x09, 0x4f, 0x3d, 0xf5, 0xa0, 0x9d, 0xe3, 0x2d, 0xf2, 0x1d, ++ 0xf1, 0xfe, 0x1a, 0x5e, 0xf7, 0x59, 0x80, 0x97, 0x9a, 0xc1, 0xed, 0x7c, ++ 0x7e, 0x07, 0xd3, 0x97, 0xd2, 0xfc, 0x1b, 0x7f, 0x17, 0xc1, 0x22, 0x78, ++ 0xbb, 0x42, 0xb3, 0x7b, 0x2b, 0xea, 0xec, 0xe3, 0x48, 0xb6, 0x83, 0xd7, ++ 0x77, 0xed, 0x1b, 0x3f, 0xd7, 0xc5, 0xdb, 0x35, 0xc6, 0x8c, 0x71, 0xe9, ++ 0x05, 0x8c, 0x4d, 0x74, 0x69, 0x34, 0xff, 0x09, 0xb2, 0x0c, 0x9f, 0x97, ++ 0xd9, 0xe6, 0xd6, 0xdd, 0x8e, 0x4b, 0x9f, 0x5f, 0x29, 0xf1, 0xc6, 0x67, ++ 0x7c, 0xac, 0x85, 0xd3, 0xb7, 0xf0, 0x19, 0x1b, 0xbb, 0x8f, 0xbf, 0xcc, ++ 0x03, 0xdc, 0xa0, 0x57, 0x4b, 0xa4, 0xff, 0x69, 0xd0, 0xb7, 0xe9, 0x51, ++ 0xc6, 0x92, 0x18, 0xab, 0x72, 0x0a, 0x9a, 0x57, 0xbd, 0x72, 0x5f, 0xfa, ++ 0x01, 0x5e, 0xbe, 0x16, 0x33, 0x63, 0x86, 0x8b, 0xe3, 0xa9, 0x2a, 0xa6, ++ 0x24, 0x09, 0xf0, 0xa4, 0x5e, 0x64, 0x4c, 0x4f, 0xe4, 0x74, 0x6b, 0xb0, ++ 0x33, 0x9d, 0xe3, 0x2a, 0xb5, 0xdf, 0x4b, 0x1a, 0xe3, 0xf0, 0x0d, 0xea, ++ 0x77, 0x78, 0x22, 0x73, 0x80, 0x6f, 0xda, 0xd6, 0x3a, 0x51, 0xd6, 0x45, ++ 0x31, 0x5d, 0xf1, 0x0f, 0xe8, 0x7f, 0xd1, 0xc2, 0xf4, 0x91, 0xe8, 0xcf, ++ 0x43, 0xfd, 0xe1, 0xcf, 0x9e, 0x04, 0x2e, 0x14, 0x7f, 0xeb, 0x13, 0x74, ++ 0xb6, 0x96, 0xc3, 0xe3, 0xe3, 0xb8, 0xde, 0x01, 0xee, 0x74, 0x46, 0x75, ++ 0x68, 0x45, 0xfc, 0x1f, 0xc9, 0x25, 0x9e, 0xf6, 0x3c, 0xd9, 0x4f, 0x26, ++ 0xf8, 0x94, 0xcd, 0x0d, 0xf0, 0xf1, 0xca, 0x81, 0x07, 0xde, 0x8f, 0x8d, ++ 0xe3, 0xd4, 0x3a, 0x82, 0x97, 0x0e, 0x4b, 0x30, 0xa2, 0x97, 0xf6, 0x95, ++ 0x12, 0x5f, 0x66, 0xbb, 0x23, 0x68, 0x1e, 0xce, 0x4b, 0xe7, 0x91, 0x63, ++ 0xd4, 0xaf, 0xc3, 0x72, 0xb6, 0xdd, 0xde, 0xd3, 0xce, 0xee, 0xb7, 0x10, ++ 0x3e, 0x58, 0x0d, 0xf3, 0xe7, 0x68, 0x84, 0x27, 0x5f, 0x04, 0xea, 0x71, ++ 0x09, 0x54, 0x67, 0x1e, 0x8f, 0xab, 0x5f, 0x12, 0xf8, 0x9f, 0x11, 0x72, ++ 0x53, 0x2d, 0xec, 0x70, 0x04, 0x1f, 0x97, 0xb8, 0x97, 0xaf, 0x9f, 0x14, ++ 0x16, 0xa4, 0xf2, 0x09, 0x8e, 0x1e, 0x47, 0x16, 0x1a, 0xa5, 0xc5, 0x7f, ++ 0x16, 0xcd, 0xf0, 0x88, 0x81, 0x8f, 0x9f, 0x66, 0x6c, 0x6a, 0x28, 0x5f, ++ 0xab, 0xb2, 0x33, 0xdd, 0x44, 0xf3, 0xc8, 0xae, 0x37, 0xf5, 0x3f, 0xc9, ++ 0xf1, 0x93, 0x7f, 0x28, 0x92, 0xe0, 0xb0, 0x6c, 0x62, 0xfe, 0x48, 0x3e, ++ 0x58, 0x36, 0xe8, 0xc1, 0xe9, 0x96, 0xbd, 0x99, 0xf9, 0x2d, 0x19, 0x68, ++ 0x67, 0xeb, 0x7f, 0x32, 0x11, 0xdf, 0xb9, 0xe8, 0x3b, 0x17, 0x73, 0x9a, ++ 0x18, 0x8d, 0x17, 0x18, 0x86, 0x75, 0xb5, 0xf5, 0x88, 0x63, 0x33, 0x8b, ++ 0x23, 0xfa, 0xce, 0xf7, 0xf2, 0xf1, 0xb6, 0x46, 0xb1, 0x6a, 0xe0, 0x4b, ++ 0x8d, 0xc7, 0xd8, 0x5a, 0xc2, 0xc7, 0x03, 0x92, 0x2f, 0xb6, 0x35, 0x38, ++ 0x89, 0x8e, 0xea, 0xfd, 0xa0, 0x9a, 0x83, 0x61, 0x74, 0x4c, 0x30, 0xd0, ++ 0x51, 0xb5, 0x4b, 0xbd, 0x38, 0x90, 0xe8, 0xd9, 0xd3, 0xaf, 0x9f, 0xfa, ++ 0x4b, 0xad, 0xdf, 0x4b, 0xfc, 0x90, 0x7a, 0x31, 0x5d, 0xf2, 0x89, 0xeb, ++ 0x3b, 0xfa, 0xcf, 0xec, 0xa3, 0xff, 0x64, 0xfa, 0xbe, 0xef, 0xfe, 0x07, ++ 0xd1, 0xf8, 0x4f, 0x04, 0x3f, 0x88, 0x9f, 0xce, 0x51, 0xf1, 0xe3, 0xce, ++ 0xbd, 0xf1, 0x5e, 0x5e, 0x46, 0x5a, 0x9b, 0xbc, 0xee, 0x5e, 0xf0, 0x9c, ++ 0x7a, 0x7b, 0x88, 0x3c, 0xe3, 0xff, 0x1f, 0xbe, 0x9f, 0xd7, 0xf3, 0x7a, ++ 0xea, 0x0a, 0x2f, 0x91, 0x56, 0x4f, 0xbf, 0x19, 0x1c, 0xff, 0x91, 0x77, ++ 0x98, 0xdc, 0x2d, 0xbc, 0xbf, 0x2b, 0x8e, 0x19, 0xdb, 0x4d, 0xcd, 0xf8, ++ 0x30, 0x1e, 0xeb, 0xb1, 0xa7, 0x7d, 0xb0, 0xdf, 0x4c, 0xb4, 0xaf, 0x15, ++ 0xed, 0xaf, 0x3a, 0x65, 0x6c, 0xef, 0x9d, 0xb8, 0x2f, 0xac, 0xbd, 0x80, ++ 0x6f, 0xc2, 0x45, 0x63, 0xbb, 0x70, 0xfa, 0x84, 0xc3, 0xcb, 0xe1, 0xea, ++ 0x3f, 0x2b, 0x04, 0xae, 0xc9, 0xf6, 0x08, 0xc3, 0xf7, 0x73, 0x2b, 0x2e, ++ 0x81, 0xab, 0xff, 0x9c, 0x10, 0xb8, 0xae, 0x4d, 0x36, 0xb6, 0xd7, 0xd7, ++ 0xf6, 0x0e, 0xd7, 0xf7, 0xf2, 0x22, 0xbe, 0x15, 0x2e, 0xd5, 0xee, 0xc6, ++ 0xb1, 0x97, 0xd7, 0x2e, 0x7c, 0x1e, 0x33, 0xa7, 0x46, 0xf4, 0x81, 0x77, ++ 0xd1, 0x7e, 0xce, 0xdc, 0xcb, 0xeb, 0xf7, 0xd6, 0xea, 0x6f, 0x6f, 0x37, ++ 0xbf, 0x3e, 0x7c, 0x1c, 0x9f, 0xdc, 0xaf, 0xf8, 0xda, 0xe2, 0xeb, 0x38, ++ 0x11, 0xff, 0xe0, 0x4b, 0x20, 0xb1, 0xde, 0xe4, 0x89, 0x8c, 0x65, 0xcc, ++ 0xc9, 0x3a, 0x19, 0xd6, 0x51, 0xfb, 0x60, 0x17, 0xb5, 0x4b, 0x60, 0x4e, ++ 0x5a, 0xcf, 0x7c, 0xe1, 0x6b, 0x58, 0x57, 0xef, 0xe3, 0x9f, 0x29, 0x7c, ++ 0xbd, 0x67, 0x78, 0xbf, 0x70, 0x8d, 0x06, 0xfe, 0x3d, 0x65, 0x0f, 0xf3, ++ 0xa6, 0x25, 0x72, 0xbf, 0x62, 0xd3, 0x78, 0x8f, 0x57, 0xa2, 0x73, 0x6f, ++ 0xe1, 0x4d, 0x85, 0x97, 0xf2, 0x1f, 0x63, 0xeb, 0x08, 0xae, 0x9f, 0x6a, ++ 0xba, 0xce, 0x68, 0x9f, 0xb5, 0xbb, 0x77, 0xf0, 0xf5, 0x9d, 0x9f, 0xca, ++ 0xec, 0x29, 0x09, 0xfc, 0x75, 0xb2, 0x3f, 0xf3, 0xa6, 0x18, 0xc6, 0xfe, ++ 0xda, 0x2d, 0xaf, 0xb9, 0xa8, 0xe1, 0x70, 0x0e, 0x93, 0xb8, 0x7b, 0x61, ++ 0x60, 0x60, 0x55, 0x3c, 0xad, 0x73, 0x7f, 0x02, 0xe0, 0xf9, 0x47, 0xc7, ++ 0xb5, 0x66, 0x78, 0x58, 0x46, 0xff, 0x9e, 0xf6, 0xe1, 0xed, 0x7a, 0xda, ++ 0x0b, 0x3c, 0xd9, 0x6c, 0x81, 0x95, 0x80, 0xb3, 0xb3, 0xd6, 0xe1, 0xc6, ++ 0xfe, 0xf0, 0x01, 0x5e, 0xf1, 0xef, 0x9e, 0x99, 0x1d, 0x11, 0x34, 0x73, ++ 0x7c, 0x9d, 0xb7, 0x3a, 0x36, 0x69, 0x5c, 0xce, 0x1c, 0x8b, 0x2e, 0x3f, ++ 0xd2, 0x9f, 0xe3, 0xe1, 0xfd, 0x58, 0x3d, 0x16, 0xfd, 0xcf, 0x9d, 0x73, ++ 0xdd, 0x46, 0xd4, 0xb5, 0x83, 0x89, 0xae, 0x55, 0x1c, 0xbe, 0xf3, 0x15, ++ 0xed, 0x63, 0x80, 0x57, 0x4f, 0xb4, 0x9e, 0x90, 0xc1, 0xe1, 0xa8, 0xb1, ++ 0xeb, 0x83, 0x93, 0xf8, 0x14, 0xcf, 0xa5, 0xe9, 0x43, 0xe2, 0x80, 0x5f, ++ 0x6f, 0x22, 0xe1, 0x95, 0xff, 0xa3, 0xd0, 0xdb, 0x2b, 0xfc, 0x02, 0x9e, ++ 0x12, 0x4d, 0xe0, 0x3f, 0x31, 0x4e, 0x4f, 0xc5, 0x38, 0x25, 0xa6, 0xb6, ++ 0x27, 0xbd, 0x78, 0x66, 0x69, 0x1b, 0x83, 0xef, 0x98, 0xb3, 0x3f, 0xc1, ++ 0x77, 0xce, 0xc6, 0xe5, 0x5d, 0x2f, 0xeb, 0x5f, 0xe1, 0x61, 0x92, 0xec, ++ 0xe7, 0x80, 0xd5, 0xfd, 0x75, 0x27, 0x9f, 0xdf, 0x81, 0x2d, 0x71, 0xee, ++ 0x46, 0x0e, 0x6f, 0x55, 0xe2, 0x9c, 0xf2, 0x15, 0xfc, 0xd5, 0x42, 0x93, ++ 0x37, 0x29, 0x68, 0x36, 0xc0, 0x3d, 0x14, 0xe3, 0xd5, 0x38, 0x2a, 0x06, ++ 0xa7, 0x00, 0x6e, 0xab, 0x84, 0xdb, 0xde, 0x5f, 0xe2, 0xdd, 0x93, 0xfd, ++ 0x6d, 0x70, 0x37, 0x62, 0x3c, 0xec, 0x6b, 0xff, 0xae, 0xf9, 0x77, 0x64, ++ 0x08, 0x5a, 0xa2, 0xfe, 0xaa, 0x2f, 0xde, 0x7f, 0x1f, 0xaf, 0x47, 0x98, ++ 0x2e, 0x7c, 0x00, 0xf9, 0xd1, 0x59, 0x68, 0x72, 0xf3, 0x3d, 0x82, 0x6d, ++ 0xe3, 0xfa, 0x85, 0x9d, 0xef, 0x2b, 0xef, 0x49, 0x7c, 0x3f, 0xc1, 0xd5, ++ 0x1f, 0x7b, 0x02, 0x3d, 0xdf, 0x84, 0xe7, 0xc9, 0x51, 0xe2, 0xfb, 0xe4, ++ 0x47, 0x4c, 0xfe, 0x46, 0xfe, 0xbd, 0x77, 0xd2, 0x6b, 0x44, 0xa7, 0x67, ++ 0x96, 0x3b, 0xdc, 0x66, 0x3e, 0x56, 0x05, 0x73, 0xd9, 0xc0, 0xb7, 0x95, ++ 0xcc, 0x63, 0x03, 0xfc, 0x7f, 0x9c, 0xf8, 0xdf, 0xaf, 0xb7, 0x63, 0xfd, ++ 0x67, 0xe8, 0x93, 0x80, 0xff, 0xf9, 0x89, 0xa6, 0xf4, 0x0f, 0x08, 0x0e, ++ 0x3d, 0x7f, 0x06, 0xe7, 0x37, 0x36, 0x5e, 0xe0, 0xff, 0xbb, 0xf8, 0x81, ++ 0xb1, 0xcd, 0x26, 0x36, 0x86, 0xb1, 0x9b, 0xa4, 0x7e, 0xb0, 0x50, 0xe2, ++ 0x71, 0x26, 0xf3, 0x58, 0x31, 0xce, 0x2c, 0xa6, 0x5b, 0x31, 0xee, 0xaf, ++ 0xbf, 0xb4, 0x79, 0x18, 0xe7, 0x8f, 0x5f, 0x73, 0x5c, 0x31, 0x0e, 0xef, ++ 0x1c, 0xe6, 0xa3, 0xe7, 0xf3, 0x98, 0x9f, 0xca, 0x5b, 0x59, 0x90, 0xda, ++ 0xdf, 0xc6, 0xda, 0xa9, 0xfe, 0xab, 0xe8, 0xa2, 0xb4, 0x7a, 0x0e, 0xdf, ++ 0x8c, 0x47, 0x87, 0xe4, 0x60, 0x3d, 0x86, 0xe0, 0x7d, 0x2e, 0xe1, 0xdd, ++ 0xae, 0xcf, 0xef, 0x27, 0xf8, 0xe5, 0xf3, 0x01, 0xc0, 0x7b, 0x73, 0xff, ++ 0xcb, 0xe2, 0xdf, 0x19, 0x9a, 0xc0, 0xdf, 0x80, 0x0c, 0xbd, 0x02, 0xfd, ++ 0x4c, 0xb6, 0xbb, 0xfa, 0xb9, 0x01, 0x93, 0x73, 0xf2, 0x20, 0x6f, 0x4c, ++ 0xc8, 0xfa, 0x29, 0xe9, 0x2f, 0xf8, 0xcf, 0xe2, 0xcc, 0xf9, 0xb6, 0xf5, ++ 0xd3, 0xd6, 0x15, 0x5b, 0xc4, 0x86, 0x93, 0x3c, 0x70, 0xa4, 0x70, 0x3c, ++ 0x5c, 0x2b, 0x49, 0x79, 0xad, 0x67, 0xd9, 0x34, 0xcc, 0x17, 0x12, 0x04, ++ 0xeb, 0xf5, 0x46, 0xb9, 0x5e, 0x4b, 0xcd, 0x0e, 0xd6, 0x8f, 0xd3, 0xa5, ++ 0xcd, 0x65, 0xf6, 0x47, 0x70, 0x58, 0xa6, 0x4e, 0x5c, 0x99, 0x8c, 0xf9, ++ 0xfe, 0x7c, 0x2d, 0x7b, 0x67, 0x24, 0xa7, 0xdf, 0xcf, 0x27, 0x9a, 0x59, ++ 0x23, 0xb5, 0xf4, 0xd0, 0x77, 0xd3, 0x65, 0x7f, 0xd3, 0x07, 0x4d, 0x39, ++ 0x0d, 0xfd, 0xe4, 0x6d, 0x16, 0xec, 0x37, 0x8a, 0x7f, 0x57, 0x7a, 0x51, ++ 0x3f, 0x1c, 0xc7, 0xf1, 0x33, 0xdd, 0xbc, 0x7b, 0x3d, 0xd7, 0xb8, 0xd9, ++ 0xd4, 0x41, 0xd6, 0x4f, 0xdb, 0x43, 0xe4, 0xda, 0x75, 0xfd, 0xf6, 0x58, ++ 0x18, 0xd7, 0x5f, 0xae, 0xcf, 0x36, 0x3e, 0x9f, 0x56, 0xc0, 0xeb, 0x21, ++ 0x72, 0x77, 0x3a, 0xb3, 0xf4, 0xbc, 0xe7, 0xf4, 0x3f, 0x00, 0xfc, 0x40, ++ 0xee, 0xb0, 0x26, 0x33, 0xf8, 0x77, 0x43, 0x46, 0x4c, 0x3f, 0xe8, 0x2b, ++ 0x6c, 0x18, 0x1b, 0x26, 0xec, 0x03, 0x4e, 0x8d, 0x90, 0xf9, 0x74, 0xd9, ++ 0xbf, 0xb1, 0x9d, 0xe7, 0xdf, 0xed, 0xcf, 0xd0, 0x37, 0x03, 0x9f, 0xab, ++ 0xe2, 0xbf, 0x2c, 0x27, 0xbd, 0xc3, 0x22, 0xe6, 0xb3, 0xfc, 0x5d, 0x33, ++ 0xe9, 0x95, 0x9f, 0x36, 0x30, 0x70, 0x1e, 0x3b, 0xc9, 0xf5, 0x43, 0x4f, ++ 0x2e, 0x63, 0x9f, 0x71, 0xfd, 0x02, 0xf5, 0x53, 0x0d, 0xc9, 0x54, 0x7e, ++ 0xc1, 0xf5, 0x01, 0x94, 0x67, 0x1b, 0xf2, 0xe8, 0xfd, 0x97, 0x0d, 0x6e, ++ 0xaa, 0xff, 0x21, 0xc3, 0xfb, 0x30, 0xfa, 0x5d, 0xb0, 0xe9, 0x2b, 0x0b, ++ 0xf6, 0xa5, 0x7b, 0x22, 0x15, 0xbe, 0x05, 0x1c, 0xab, 0x25, 0xdf, 0xdd, ++ 0x93, 0x36, 0xe6, 0xd1, 0xbf, 0x71, 0xbc, 0xde, 0xf3, 0x36, 0x5f, 0x18, ++ 0x1c, 0x9e, 0xea, 0x40, 0xd3, 0x14, 0x80, 0xbd, 0x3a, 0xed, 0xd3, 0x75, ++ 0xd0, 0x9f, 0x57, 0x3f, 0xab, 0xb9, 0xd1, 0x6e, 0x59, 0xab, 0xc7, 0xe6, ++ 0xe0, 0xf0, 0x2c, 0x3c, 0xac, 0x6f, 0x04, 0x99, 0x17, 0xbf, 0xdd, 0x3e, ++ 0x1d, 0x62, 0xa2, 0x16, 0xfa, 0x2b, 0xd7, 0x1b, 0xee, 0xb5, 0x7a, 0x9f, ++ 0xc1, 0x78, 0xa3, 0x3f, 0x3c, 0x99, 0xa4, 0xf3, 0x06, 0x9e, 0xd6, 0x8e, ++ 0x23, 0x89, 0xbc, 0xfd, 0xe7, 0x0d, 0x63, 0x09, 0xae, 0xd3, 0x0d, 0x1e, ++ 0x82, 0xeb, 0x4c, 0xc3, 0x54, 0x2a, 0x2f, 0x66, 0x78, 0x9f, 0x45, 0x7b, ++ 0x0f, 0xfb, 0xca, 0x86, 0xf6, 0x37, 0xec, 0xee, 0xb0, 0xa4, 0xf2, 0xf6, ++ 0xa5, 0x1e, 0xcd, 0x83, 0xf5, 0x78, 0x8d, 0x87, 0xf9, 0xfd, 0x1c, 0x9e, ++ 0xad, 0x56, 0x21, 0xdf, 0xb7, 0x72, 0xf9, 0x8e, 0xf5, 0x39, 0xb1, 0xf0, ++ 0xa6, 0x27, 0x6e, 0x67, 0x90, 0xbf, 0xfa, 0xcb, 0xf8, 0x7e, 0x56, 0x42, ++ 0x65, 0x69, 0x22, 0x7f, 0x3e, 0x7d, 0x6c, 0x85, 0x05, 0xed, 0xe6, 0x7c, ++ 0xcd, 0x65, 0x5a, 0x46, 0x0f, 0x1f, 0x7e, 0xf7, 0x3a, 0x14, 0xf8, 0xa8, ++ 0x95, 0x74, 0x39, 0xf7, 0x86, 0x46, 0x78, 0x3a, 0xf7, 0x4a, 0xfe, 0x8d, ++ 0x57, 0xf1, 0xfe, 0xde, 0x38, 0x6a, 0x66, 0x66, 0x0e, 0x57, 0xd7, 0x45, ++ 0x13, 0xc1, 0xd5, 0x75, 0x2c, 0xca, 0x0f, 0xa5, 0x55, 0xb5, 0x5b, 0xb5, ++ 0xcf, 0x4c, 0xfa, 0xe4, 0xaa, 0x34, 0x9b, 0x1f, 0xf8, 0x5b, 0xb5, 0x2f, ++ 0x7f, 0x00, 0xf4, 0xa9, 0x33, 0x9c, 0x6e, 0x2c, 0xb7, 0x67, 0xbc, 0x33, ++ 0x2f, 0x7c, 0xdf, 0xa5, 0x87, 0xc8, 0xd1, 0x33, 0x09, 0x81, 0xbf, 0x7c, ++ 0x04, 0x39, 0xf5, 0x7b, 0x21, 0xa7, 0xb8, 0xbe, 0xf9, 0xd9, 0xe3, 0x90, ++ 0x63, 0x83, 0x06, 0xba, 0x41, 0xf7, 0x2f, 0xad, 0x5c, 0x2f, 0x07, 0xa2, ++ 0x59, 0x5d, 0x34, 0xf6, 0xb1, 0xe5, 0x36, 0xb9, 0xbe, 0xb8, 0x9c, 0x41, ++ 0xfd, 0x4c, 0x14, 0x23, 0x7d, 0x74, 0xcc, 0x8b, 0xa9, 0x93, 0xb0, 0x5e, ++ 0x30, 0x9e, 0xcb, 0xd6, 0x23, 0x87, 0x72, 0x5f, 0x7c, 0x34, 0xf3, 0x07, ++ 0xae, 0x9e, 0xf1, 0x76, 0x05, 0x16, 0x7e, 0xf4, 0x38, 0xaf, 0x9f, 0xf3, ++ 0x9b, 0x7c, 0x56, 0xbe, 0xcf, 0x9c, 0x63, 0x81, 0x2f, 0x7f, 0x02, 0x39, ++ 0xba, 0xdd, 0xe1, 0x86, 0x7d, 0x70, 0x8f, 0xc6, 0xe1, 0xc1, 0x3e, 0xba, ++ 0x63, 0x20, 0xd5, 0xf3, 0x34, 0x4b, 0x54, 0x3d, 0xf1, 0xb3, 0x9f, 0xd6, ++ 0x6b, 0x9e, 0xe6, 0xb2, 0xd4, 0x73, 0xf9, 0x53, 0xf3, 0xd2, 0x63, 0x03, ++ 0xc1, 0x4f, 0x3f, 0xe5, 0x38, 0x18, 0xcb, 0xdf, 0xff, 0x74, 0x4b, 0x34, ++ 0xc9, 0xa7, 0x9f, 0x5a, 0xdd, 0xc7, 0xeb, 0xd1, 0xdf, 0x13, 0xa2, 0xbf, ++ 0xff, 0x78, 0xe0, 0xce, 0x4f, 0xf7, 0xa3, 0xbc, 0xbf, 0x76, 0xc4, 0x9d, ++ 0xbc, 0xec, 0xcc, 0x48, 0xa0, 0x7e, 0xaa, 0x7e, 0xb4, 0x64, 0x18, 0xbe, ++ 0xe7, 0xfb, 0x34, 0x4b, 0xe1, 0xfd, 0x3d, 0xff, 0xaa, 0x16, 0x8c, 0xe4, ++ 0xeb, 0xb3, 0xb0, 0xf9, 0xc0, 0xba, 0x14, 0x0e, 0xdf, 0xf0, 0x6d, 0x1d, ++ 0xa6, 0x81, 0xbc, 0x2c, 0xde, 0xae, 0x35, 0xa2, 0xcc, 0x4f, 0xbb, 0xfe, ++ 0xa8, 0x99, 0xbf, 0xff, 0x4b, 0x86, 0x8b, 0xe8, 0x35, 0x72, 0x77, 0x86, ++ 0x39, 0x15, 0xcb, 0x6a, 0xa0, 0xff, 0xa3, 0x09, 0xb4, 0x7f, 0x1b, 0xf7, ++ 0xf5, 0x82, 0xe6, 0xaf, 0x26, 0xc1, 0xbc, 0x54, 0xfb, 0xfb, 0x30, 0x2d, ++ 0xf0, 0x45, 0x0b, 0xec, 0xe1, 0xf4, 0x63, 0x23, 0x74, 0xc2, 0x5f, 0x13, ++ 0xc1, 0xb1, 0xaf, 0x75, 0xe6, 0xfb, 0xb7, 0x32, 0xcc, 0x83, 0x6b, 0x0e, ++ 0x80, 0xbb, 0xc2, 0xe6, 0xa6, 0xfd, 0xc4, 0xef, 0x6b, 0x01, 0x9d, 0xcf, ++ 0xe9, 0x79, 0xee, 0xfb, 0xb0, 0xa6, 0xbd, 0xbe, 0xc7, 0x40, 0xdf, 0x73, ++ 0x7a, 0x92, 0x1b, 0xfb, 0xcb, 0x2b, 0x26, 0x5f, 0xec, 0x38, 0xb4, 0x3f, ++ 0x6e, 0xa1, 0x79, 0xbe, 0xba, 0xfd, 0x57, 0xb1, 0x56, 0x5e, 0x8f, 0xdb, ++ 0x6b, 0x65, 0x91, 0xfc, 0x7d, 0x6d, 0x71, 0xe7, 0x14, 0xb4, 0xaf, 0x4d, ++ 0x73, 0x91, 0x1d, 0x9e, 0xf6, 0xe4, 0xb5, 0x53, 0x81, 0x9f, 0xe5, 0x7b, ++ 0xf7, 0xb5, 0x50, 0x3f, 0x35, 0x76, 0xb7, 0x86, 0x75, 0xb6, 0xef, 0xc2, ++ 0x91, 0x54, 0xd8, 0x43, 0xd7, 0x31, 0x77, 0x0e, 0xf8, 0x6e, 0xaf, 0xa8, ++ 0xff, 0xb0, 0xc4, 0xe3, 0x06, 0xbf, 0x55, 0xb7, 0xfc, 0x59, 0xd4, 0xdb, ++ 0xbc, 0x54, 0xf7, 0x9a, 0x7d, 0x19, 0x16, 0xb4, 0xaf, 0x14, 0x7a, 0xce, ++ 0xa3, 0x72, 0x1f, 0x63, 0xed, 0x45, 0x24, 0xef, 0x88, 0x95, 0x5d, 0x3d, ++ 0xf4, 0xfa, 0x21, 0x7f, 0x8d, 0xf7, 0x5b, 0x33, 0x7c, 0x29, 0x75, 0x8e, ++ 0x9e, 0xfd, 0x8f, 0xef, 0x5b, 0x29, 0x99, 0x58, 0x1a, 0x36, 0xf9, 0xbd, ++ 0x73, 0x66, 0xba, 0xf7, 0x1f, 0xd8, 0xb7, 0x6c, 0x72, 0x1f, 0x52, 0xfd, ++ 0x3d, 0x6a, 0x63, 0xbe, 0x48, 0xde, 0x4f, 0x1a, 0x7f, 0xae, 0x61, 0x5f, ++ 0xb5, 0x89, 0xfd, 0x76, 0x07, 0x97, 0x2f, 0xe0, 0x17, 0xb5, 0xdf, 0xf2, ++ 0x71, 0x87, 0x66, 0x8a, 0xef, 0x3d, 0x90, 0x93, 0xa9, 0x7c, 0x73, 0x2d, ++ 0xe6, 0xf3, 0x49, 0x7d, 0x34, 0xc2, 0x4f, 0x7b, 0xfa, 0x65, 0x8e, 0xaf, ++ 0xf4, 0xa4, 0x15, 0x51, 0x42, 0x9e, 0x29, 0xfd, 0x63, 0x6e, 0x62, 0xe3, ++ 0xeb, 0xed, 0x1c, 0xaf, 0x7f, 0x8a, 0xd5, 0x47, 0x67, 0xf2, 0xf9, 0x2f, ++ 0x94, 0xfb, 0x35, 0xb3, 0xb8, 0x93, 0x31, 0xbf, 0x13, 0xb1, 0x9e, 0x31, ++ 0x99, 0xb4, 0xff, 0x75, 0xa6, 0x63, 0x0e, 0x7c, 0x3f, 0x1c, 0x87, 0x76, ++ 0xcb, 0xcd, 0x5c, 0x7f, 0xca, 0x0a, 0xd1, 0x9f, 0xec, 0x97, 0xb7, 0x1f, ++ 0x46, 0xc4, 0x79, 0x3c, 0xe8, 0xef, 0x72, 0xdb, 0x8f, 0x8f, 0xea, 0x5d, ++ 0xfe, 0x8e, 0xef, 0x1a, 0x4b, 0xf2, 0xf7, 0x75, 0x29, 0x7f, 0x57, 0xff, ++ 0xd9, 0xc4, 0x8a, 0x79, 0x7d, 0xf5, 0xc3, 0x11, 0x24, 0x4f, 0x68, 0x4f, ++ 0xeb, 0x05, 0x2f, 0xaf, 0xf3, 0xf5, 0xae, 0x73, 0xf9, 0xf2, 0x33, 0xf8, ++ 0x0d, 0x78, 0x79, 0xf5, 0x9f, 0xda, 0xcd, 0x64, 0x7f, 0x1c, 0x36, 0xd5, ++ 0x1c, 0xe1, 0xfb, 0x29, 0x0d, 0x9d, 0x89, 0xff, 0x74, 0x36, 0xc6, 0x8d, ++ 0xa2, 0xba, 0x07, 0x64, 0xbe, 0xe6, 0x4f, 0xa6, 0x5e, 0xed, 0x43, 0x55, ++ 0x72, 0x3a, 0x95, 0x63, 0x5e, 0x9e, 0xaf, 0x8d, 0xfe, 0x86, 0x09, 0x5f, ++ 0x3b, 0x6d, 0xd4, 0xbf, 0x23, 0xe1, 0xb2, 0xe6, 0x6b, 0xee, 0x63, 0xbe, ++ 0xe6, 0x58, 0x31, 0xdf, 0x56, 0xcc, 0x97, 0xd3, 0x6e, 0xf5, 0x57, 0x23, ++ 0x48, 0x5e, 0xb6, 0x5e, 0xe6, 0x3c, 0xd3, 0x22, 0x3c, 0x2b, 0x40, 0xb7, ++ 0xf0, 0x79, 0x70, 0xb8, 0xef, 0xe8, 0x0d, 0xee, 0x6e, 0xfe, 0xee, 0xbc, ++ 0x3c, 0xb8, 0xef, 0xd0, 0x98, 0xcf, 0x84, 0x75, 0xf6, 0x95, 0xcd, 0x8f, ++ 0x75, 0xd6, 0xca, 0xc1, 0xc4, 0xba, 0x6d, 0x5d, 0x52, 0xe0, 0xc7, 0x7a, ++ 0x7e, 0xc5, 0x26, 0xea, 0xbe, 0x58, 0x1b, 0xe9, 0x9f, 0xad, 0x31, 0xcc, ++ 0x07, 0xf9, 0xd1, 0x3a, 0x23, 0xc9, 0xef, 0xcb, 0x80, 0x1c, 0x64, 0x42, ++ 0x3f, 0xed, 0xcf, 0xc4, 0xfb, 0x48, 0xf9, 0xfd, 0xbc, 0x24, 0xfa, 0x7e, ++ 0x60, 0x04, 0xe7, 0x7f, 0x5e, 0x67, 0xb7, 0x46, 0xc9, 0xfe, 0xeb, 0xde, ++ 0x2a, 0xc4, 0xfb, 0xb5, 0xa9, 0x6e, 0x0e, 0x01, 0xd7, 0x6f, 0xfd, 0x9b, ++ 0x32, 0x49, 0xbf, 0x35, 0x93, 0xdf, 0xf0, 0x98, 0x94, 0xd7, 0xcd, 0xf1, ++ 0xc1, 0x5b, 0xcd, 0xfc, 0x79, 0xf3, 0x57, 0xb9, 0x0c, 0xe3, 0x1c, 0x63, ++ 0xc1, 0xd4, 0x15, 0x68, 0x57, 0x1d, 0x45, 0x72, 0xa8, 0x39, 0xde, 0x93, ++ 0x92, 0xc0, 0xf1, 0xf8, 0xca, 0x37, 0x66, 0xda, 0x17, 0x9a, 0x8b, 0x79, ++ 0xdd, 0x41, 0x72, 0x9a, 0xfc, 0x3b, 0xcd, 0x33, 0x3c, 0x29, 0xf1, 0xbc, ++ 0x7e, 0x8b, 0xa4, 0x4b, 0x73, 0x8b, 0x7f, 0xc7, 0x23, 0xe8, 0x6f, 0x46, ++ 0x9e, 0xdb, 0xc7, 0xc7, 0x19, 0x68, 0x66, 0x75, 0xd4, 0x2e, 0x43, 0xf4, ++ 0xf3, 0x91, 0x55, 0x7c, 0xf7, 0x3b, 0x49, 0x17, 0xbe, 0x8e, 0x69, 0x9d, ++ 0x1f, 0xc8, 0x5c, 0xf0, 0x22, 0xf0, 0xac, 0x4f, 0x8f, 0xb6, 0xc0, 0x2f, ++ 0xc2, 0x31, 0x9e, 0xa2, 0x71, 0xf8, 0x1f, 0xaf, 0xca, 0x61, 0x24, 0x2f, ++ 0xa5, 0xdf, 0x6b, 0xae, 0xa4, 0xc1, 0x2d, 0x3d, 0x7c, 0xe0, 0xb1, 0x8f, ++ 0x81, 0x5e, 0x2b, 0xfe, 0xe6, 0x2d, 0xdc, 0x11, 0x09, 0x79, 0x3c, 0xab, ++ 0x3a, 0x92, 0xfc, 0x52, 0xc7, 0xaa, 0xd7, 0xc5, 0xb8, 0xf8, 0x78, 0xb3, ++ 0x74, 0x73, 0x30, 0x02, 0xfa, 0xdf, 0xcd, 0xa5, 0x06, 0xbf, 0xd3, 0x81, ++ 0x4c, 0x0f, 0x8d, 0xcb, 0x0d, 0x0b, 0x69, 0x27, 0x04, 0x2b, 0x81, 0xc7, ++ 0x37, 0x3a, 0xed, 0x0c, 0x72, 0xb9, 0x2f, 0x7a, 0xd6, 0x06, 0x26, 0x26, ++ 0x9e, 0x0c, 0xe1, 0x87, 0x6a, 0x9b, 0x90, 0x1f, 0xa7, 0xa4, 0x3e, 0xf4, ++ 0x5a, 0x8c, 0xde, 0x8a, 0x7e, 0x57, 0xec, 0xbf, 0x2e, 0xf1, 0x64, 0x88, ++ 0xbe, 0x57, 0xb5, 0xb0, 0x34, 0x17, 0xfa, 0xb3, 0x1a, 0xef, 0xbb, 0xf8, ++ 0xa6, 0x11, 0x74, 0x1a, 0x4e, 0xeb, 0xd5, 0x67, 0x02, 0x7f, 0x04, 0x22, ++ 0x89, 0xfe, 0x53, 0x6f, 0xb2, 0x13, 0xbd, 0xbb, 0x1c, 0xa6, 0xa7, 0xe1, ++ 0x97, 0x9c, 0x2f, 0xe5, 0x55, 0x23, 0x0c, 0x61, 0xfe, 0xbc, 0x71, 0x5f, ++ 0x84, 0x7f, 0x1d, 0x7f, 0xb6, 0x22, 0x22, 0x38, 0x1b, 0xf2, 0x8a, 0xd3, ++ 0xff, 0xd9, 0x9d, 0xa0, 0xeb, 0xeb, 0x91, 0x44, 0xff, 0x1a, 0x9b, 0xe0, ++ 0xa7, 0x9a, 0x9f, 0xe4, 0x13, 0x7f, 0xbd, 0x62, 0xf3, 0x64, 0x6c, 0x40, ++ 0xff, 0x6f, 0x44, 0x10, 0xdd, 0x6b, 0x62, 0x5d, 0x71, 0xf4, 0xfe, 0x97, ++ 0x89, 0x4c, 0xf2, 0x1f, 0xe9, 0x0d, 0x35, 0x51, 0xc1, 0xdc, 0x78, 0x8e, ++ 0xcf, 0x4d, 0xd1, 0xfa, 0x6f, 0x31, 0x3f, 0xce, 0x77, 0xe4, 0x0f, 0xae, ++ 0xb1, 0x89, 0xe7, 0xc7, 0x25, 0x5f, 0x1d, 0xe7, 0x7d, 0x00, 0x0e, 0x5f, ++ 0x5d, 0x0c, 0xf1, 0x23, 0x93, 0x75, 0xfd, 0x07, 0x89, 0x64, 0x4f, 0x71, ++ 0x7d, 0x94, 0xf8, 0x57, 0x7f, 0x30, 0x9f, 0xea, 0xba, 0xcd, 0x93, 0xb2, ++ 0x10, 0xeb, 0x63, 0x55, 0x34, 0xc1, 0x77, 0x5c, 0xfa, 0xd3, 0x8e, 0xd7, ++ 0xc4, 0x13, 0x7f, 0x97, 0x3d, 0xb8, 0xec, 0x6d, 0xc6, 0xe9, 0x79, 0xdc, ++ 0xbb, 0xf3, 0xde, 0x5c, 0xde, 0xee, 0x78, 0xab, 0xd5, 0x8d, 0x7d, 0xe9, ++ 0x93, 0x7a, 0x73, 0xd0, 0xc6, 0xe9, 0xfa, 0xe5, 0x9a, 0x13, 0x63, 0xb6, ++ 0xf2, 0x7a, 0xfb, 0xba, 0x8f, 0xd3, 0xf5, 0x10, 0x3f, 0x5a, 0xd9, 0xba, ++ 0xda, 0x69, 0xf8, 0xae, 0x6c, 0xe9, 0x9a, 0xe9, 0xd8, 0x2f, 0xfb, 0xc2, ++ 0x77, 0x59, 0x4d, 0x04, 0x97, 0xb9, 0x3d, 0x74, 0x32, 0x65, 0x79, 0xbe, ++ 0x82, 0x3c, 0x48, 0xcf, 0xd2, 0xff, 0x84, 0x72, 0x45, 0x41, 0xfb, 0x22, ++ 0xc8, 0xbd, 0x2f, 0x6d, 0x6d, 0x4f, 0xc2, 0x3e, 0xf8, 0x6d, 0x9c, 0xfe, ++ 0x5f, 0x98, 0xff, 0xf9, 0xd7, 0x3e, 0xdf, 0x49, 0xf2, 0xd0, 0xd2, 0x99, ++ 0x0b, 0xfd, 0x7c, 0xb9, 0x85, 0xf3, 0x01, 0xf8, 0x52, 0xee, 0x9f, 0x2b, ++ 0x24, 0x5f, 0x3e, 0x91, 0xa5, 0xff, 0x0f, 0xed, 0x13, 0x51, 0x41, 0xd2, ++ 0xc7, 0xa3, 0x0b, 0xda, 0x84, 0xdc, 0x5b, 0x73, 0x79, 0x72, 0xfe, 0x8b, ++ 0xd6, 0x1d, 0xaf, 0x68, 0x7c, 0x9c, 0x65, 0x51, 0xad, 0xcb, 0xa9, 0x34, ++ 0xfb, 0x8b, 0xd0, 0xcf, 0x19, 0x2d, 0x18, 0xab, 0x65, 0x01, 0x7f, 0x5c, ++ 0x8f, 0xe3, 0xfd, 0x9d, 0x75, 0x06, 0x63, 0x41, 0x07, 0x5d, 0xda, 0x4d, ++ 0xcb, 0x76, 0x19, 0xe7, 0x85, 0x3f, 0xf8, 0x55, 0x96, 0xe1, 0x1f, 0xfc, ++ 0xbb, 0x65, 0x01, 0x33, 0xf9, 0x55, 0xf8, 0xfe, 0x6e, 0x03, 0xfc, 0xcb, ++ 0xe0, 0xe9, 0x35, 0xc4, 0x13, 0x84, 0x5c, 0xe1, 0xfd, 0x3c, 0x4d, 0xeb, ++ 0xd0, 0xf1, 0x49, 0xf9, 0x0f, 0x38, 0xfe, 0x97, 0x3e, 0x3b, 0x74, 0x04, ++ 0xf4, 0xc9, 0x65, 0xf1, 0xfb, 0x1f, 0xb8, 0x8a, 0xda, 0xf1, 0xef, 0x14, ++ 0x9f, 0x9b, 0x2f, 0xad, 0xab, 0xf9, 0x5c, 0x0a, 0x8f, 0x98, 0xdf, 0x59, ++ 0xc9, 0xe7, 0x67, 0x99, 0x94, 0x83, 0x73, 0x6d, 0xdd, 0x76, 0x38, 0xf4, ++ 0xa0, 0x2f, 0x5f, 0x18, 0x60, 0xe0, 0x9b, 0x2f, 0x9f, 0x1d, 0x4a, 0xf5, ++ 0x2f, 0xb4, 0x4e, 0x2d, 0x8a, 0xc3, 0xf5, 0xa5, 0x94, 0x47, 0xcc, 0x1d, ++ 0x18, 0x33, 0x03, 0x06, 0x84, 0x27, 0x30, 0x06, 0xfa, 0xec, 0x23, 0xf2, ++ 0xf9, 0xb2, 0xc4, 0xc0, 0x18, 0xc8, 0x1f, 0x25, 0x8f, 0x98, 0x3d, 0x50, ++ 0x44, 0x76, 0x75, 0x5e, 0xa0, 0x08, 0xf6, 0xa4, 0x92, 0x67, 0xcc, 0x1b, ++ 0xc8, 0xa5, 0xe7, 0xfe, 0x40, 0x2e, 0xbe, 0x7f, 0xc5, 0x24, 0xfc, 0x14, ++ 0xf4, 0x87, 0x79, 0x3f, 0x9f, 0xda, 0x42, 0x78, 0xb0, 0x8b, 0xf5, 0xb8, ++ 0xf4, 0xf9, 0x7c, 0xc2, 0x8b, 0x1a, 0x27, 0x9c, 0x7e, 0xe1, 0xf3, 0x1d, ++ 0x9f, 0x25, 0xfc, 0xdc, 0x1c, 0xde, 0xf9, 0x5e, 0xde, 0x7e, 0xc8, 0x56, ++ 0x9b, 0xe1, 0xfd, 0x50, 0xbf, 0xb1, 0x5e, 0x22, 0xdb, 0x0f, 0x0e, 0xa3, ++ 0xcb, 0x40, 0x73, 0xe7, 0x81, 0x08, 0xc8, 0xfb, 0x67, 0x18, 0xad, 0xd7, ++ 0xf0, 0x71, 0xbf, 0x27, 0xbf, 0x7b, 0xee, 0xb9, 0x6e, 0x3a, 0x98, 0xa5, ++ 0xbd, 0xc8, 0x5c, 0x8a, 0xfe, 0x2e, 0xa1, 0x6f, 0x5b, 0x81, 0xef, 0xdf, ++ 0x75, 0xe3, 0xfb, 0xf6, 0x54, 0x2e, 0x4f, 0x97, 0x61, 0x8e, 0x99, 0x3d, ++ 0xf3, 0x7f, 0xa5, 0x58, 0x4f, 0x85, 0xdc, 0xff, 0xd2, 0x24, 0xfc, 0xd4, ++ 0xaf, 0xc4, 0xf3, 0x7a, 0x01, 0xf4, 0x1c, 0x81, 0x4f, 0x55, 0x57, 0x78, ++ 0x0c, 0xe7, 0xa3, 0x75, 0xbf, 0x5b, 0x94, 0x8a, 0x78, 0xca, 0xbf, 0x65, ++ 0x99, 0xa4, 0x52, 0xe9, 0x1e, 0x00, 0x7e, 0x6b, 0x84, 0xbc, 0xe4, 0xf2, ++ 0xa2, 0xd1, 0x2a, 0xf0, 0xf1, 0x45, 0x43, 0xf5, 0xc8, 0x93, 0x16, 0xd8, ++ 0xa3, 0x75, 0x29, 0x55, 0x96, 0x9e, 0xf9, 0x2c, 0xda, 0x5a, 0x6c, 0xc7, ++ 0x7a, 0x59, 0xbc, 0xad, 0xd8, 0xbe, 0x20, 0xc4, 0xde, 0x69, 0xdc, 0x35, ++ 0xf2, 0xa8, 0x8b, 0xd3, 0xe5, 0xec, 0x2e, 0x0b, 0xb9, 0x0d, 0x1a, 0x2d, ++ 0xfe, 0x07, 0xa0, 0x47, 0x37, 0xee, 0x32, 0x07, 0x7c, 0x8c, 0xde, 0xdb, ++ 0x3d, 0xbc, 0xfd, 0x59, 0xc7, 0xc1, 0x77, 0xd1, 0x6e, 0xd1, 0xb6, 0xf8, ++ 0x11, 0xd0, 0x7b, 0xd5, 0xf7, 0x8b, 0xb7, 0xde, 0x91, 0x52, 0x15, 0x82, ++ 0xef, 0xfc, 0x5d, 0x46, 0xfc, 0x17, 0x06, 0x8c, 0x75, 0xf8, 0xa3, 0x43, ++ 0xeb, 0x3e, 0xe8, 0x82, 0xa3, 0xff, 0xf1, 0xef, 0x8a, 0x83, 0xc6, 0xfa, ++ 0xc8, 0xa3, 0xc6, 0xfa, 0xe7, 0x1f, 0xdc, 0x3e, 0x1b, 0x6c, 0xfc, 0xea, ++ 0x58, 0xc1, 0xef, 0xa7, 0xfc, 0x31, 0x7e, 0xc4, 0xa9, 0xaa, 0x3f, 0x9e, ++ 0x72, 0x14, 0xfb, 0xda, 0xa9, 0x57, 0x5e, 0x8d, 0x05, 0x7d, 0x96, 0xfd, ++ 0xbe, 0xea, 0x08, 0xec, 0x96, 0xc5, 0x5b, 0x8d, 0x7c, 0xc6, 0xe9, 0xa6, ++ 0x41, 0xaf, 0xf7, 0xed, 0xd4, 0x88, 0x3f, 0x96, 0xf8, 0xc3, 0xd7, 0x9d, ++ 0x5c, 0xef, 0x97, 0xac, 0xc7, 0xb5, 0xca, 0xaf, 0x99, 0x17, 0xca, 0x27, ++ 0xe1, 0xf4, 0x3c, 0xc3, 0x02, 0xb3, 0x3d, 0x9c, 0x9f, 0x6a, 0xea, 0x57, ++ 0x8d, 0x44, 0x3c, 0xa4, 0x7a, 0x1a, 0x67, 0x5c, 0x0e, 0xcf, 0x95, 0x81, ++ 0x2d, 0x36, 0xc4, 0x0d, 0xc2, 0xc7, 0xeb, 0x6b, 0xdd, 0x33, 0x87, 0xc7, ++ 0x05, 0x7f, 0x55, 0xc5, 0x58, 0xf1, 0x6e, 0x5c, 0xfd, 0x24, 0x76, 0x02, ++ 0x4e, 0xdf, 0xcd, 0xbf, 0x9a, 0x82, 0xf5, 0x56, 0xf1, 0x43, 0x8d, 0xf6, ++ 0xff, 0x8a, 0x97, 0x87, 0x1c, 0x86, 0xfc, 0xee, 0xd8, 0x33, 0xef, 0x7a, ++ 0x2a, 0x67, 0x4f, 0x25, 0x3c, 0x28, 0xff, 0xd9, 0xe2, 0x56, 0x2d, 0x18, ++ 0xc3, 0xeb, 0xce, 0xb1, 0xae, 0xfd, 0xed, 0xfc, 0xbb, 0x85, 0x7e, 0x8d, ++ 0xf6, 0x87, 0x05, 0xeb, 0x23, 0x7a, 0xe4, 0x10, 0xff, 0x7f, 0xd5, 0xe6, ++ 0x30, 0x38, 0x9a, 0x43, 0xde, 0x73, 0xf8, 0x17, 0xef, 0x3f, 0xf0, 0x57, ++ 0x8d, 0xf7, 0x5f, 0xbd, 0xcd, 0xf8, 0xdd, 0x12, 0x8e, 0x2f, 0xc8, 0xfd, ++ 0xa5, 0xdb, 0xff, 0x1e, 0x11, 0xfa, 0x5c, 0xd9, 0x7d, 0xe3, 0x5a, 0x5b, ++ 0xcc, 0x98, 0xf7, 0x42, 0x05, 0xbf, 0xef, 0x1a, 0x86, 0x79, 0x89, 0x10, ++ 0x24, 0x17, 0x1d, 0x52, 0x5f, 0x39, 0x89, 0xca, 0x95, 0xb0, 0x5d, 0xbc, ++ 0x6f, 0x64, 0xe1, 0xbb, 0x66, 0xf1, 0x1d, 0x17, 0x58, 0x15, 0x98, 0x6f, ++ 0xad, 0xc3, 0xe6, 0xc2, 0x7c, 0x6b, 0xed, 0x2c, 0x18, 0xcd, 0xe1, 0x38, ++ 0x1a, 0x63, 0xf3, 0x38, 0xf9, 0xf3, 0x0b, 0x5b, 0x63, 0xc8, 0x3f, 0xb5, ++ 0x28, 0x82, 0xeb, 0x85, 0x23, 0xa8, 0x64, 0x91, 0x23, 0xf0, 0x9d, 0x9b, ++ 0xf6, 0xe9, 0xcf, 0xde, 0x33, 0x93, 0xbe, 0x52, 0x8b, 0xb1, 0xd1, 0xcf, ++ 0x53, 0x1a, 0xd9, 0x3f, 0xb5, 0x70, 0x36, 0xa2, 0xfe, 0x8c, 0xa8, 0x2f, ++ 0x61, 0x41, 0x9a, 0x07, 0xf8, 0xc5, 0x13, 0x3a, 0x3f, 0xbf, 0xb1, 0xce, ++ 0x9a, 0x84, 0xdd, 0x54, 0x63, 0x09, 0x1e, 0x00, 0x3e, 0x96, 0xb2, 0x76, ++ 0x61, 0xf7, 0x70, 0x3a, 0x7a, 0x42, 0xe2, 0x71, 0x35, 0x7c, 0x9e, 0xc7, ++ 0x12, 0xa0, 0x0f, 0x19, 0xbf, 0x5f, 0xc1, 0x02, 0xd4, 0x7e, 0xc5, 0xfe, ++ 0xbf, 0x47, 0x84, 0x3e, 0x0f, 0xf1, 0x93, 0x92, 0x3d, 0xa7, 0xec, 0x4a, ++ 0xb3, 0x8d, 0x79, 0xa0, 0x1f, 0x9b, 0xef, 0x8e, 0xa2, 0xfd, 0x9e, 0x0b, ++ 0xe2, 0x28, 0xf2, 0x77, 0x69, 0x9e, 0xc7, 0xec, 0x66, 0x94, 0x62, 0x5e, ++ 0xbe, 0x2d, 0x42, 0xff, 0xb9, 0xa5, 0x45, 0xec, 0x17, 0x5c, 0x3f, 0xcd, ++ 0x05, 0x7e, 0x9a, 0xb7, 0x0c, 0x75, 0x43, 0x4f, 0xb9, 0x85, 0xeb, 0xd9, ++ 0x91, 0xd0, 0x23, 0x96, 0x44, 0x51, 0xbb, 0xe6, 0x78, 0x46, 0xfe, 0x95, ++ 0xe6, 0x79, 0xb9, 0x42, 0xcf, 0xfe, 0xe6, 0xe5, 0x20, 0xc6, 0xe9, 0x7c, ++ 0x58, 0x23, 0xff, 0x48, 0x73, 0xb1, 0xe8, 0xb7, 0xf9, 0xfe, 0xa1, 0xf4, ++ 0x1e, 0xf2, 0x50, 0xa3, 0x71, 0x22, 0x48, 0x6f, 0x69, 0x9e, 0xa1, 0xde, ++ 0xa7, 0x91, 0x9e, 0xf4, 0x11, 0x40, 0x4b, 0x81, 0x9e, 0x2b, 0x9f, 0xf7, ++ 0x77, 0xd1, 0xf3, 0x81, 0x66, 0x4f, 0x2e, 0xf4, 0x75, 0xf6, 0x50, 0x24, ++ 0xd9, 0xfb, 0x4a, 0xaf, 0xdd, 0x9e, 0xa0, 0x7f, 0x0d, 0x3a, 0xab, 0xf9, ++ 0x2a, 0x3d, 0x98, 0x55, 0x5f, 0x9e, 0xfe, 0xb7, 0x43, 0xee, 0x77, 0x9d, ++ 0x5b, 0x44, 0xfc, 0xf7, 0xa4, 0xe6, 0x3d, 0x62, 0x0a, 0xd1, 0x4b, 0x63, ++ 0xb2, 0x85, 0x9c, 0x1f, 0x33, 0xc9, 0xb3, 0x53, 0xb6, 0xa3, 0x38, 0x40, ++ 0x95, 0x69, 0xc6, 0x7d, 0x13, 0x38, 0x3c, 0x55, 0x8f, 0x98, 0x5c, 0x8d, ++ 0x19, 0x3d, 0x78, 0x67, 0x1e, 0x4f, 0x2e, 0xe6, 0x7f, 0x72, 0x4b, 0xe4, ++ 0x08, 0xf0, 0xd9, 0x98, 0x49, 0xc2, 0xdf, 0x73, 0xbc, 0x58, 0xc8, 0xed, ++ 0xe8, 0x51, 0xcc, 0xe3, 0xe7, 0x65, 0x92, 0xec, 0x37, 0x29, 0xdb, 0x64, ++ 0x28, 0x93, 0xa3, 0x38, 0xff, 0xf1, 0x7e, 0x4e, 0x96, 0x0a, 0xff, 0x70, ++ 0xcc, 0x28, 0x2f, 0xf9, 0xd9, 0xb8, 0xce, 0x46, 0xf2, 0x3b, 0x7c, 0x1e, ++ 0x99, 0xe8, 0x07, 0x71, 0x69, 0x9b, 0xf7, 0x97, 0x57, 0xf7, 0x02, 0x4f, ++ 0x37, 0x1f, 0x94, 0x08, 0x3d, 0xe3, 0xe4, 0x4a, 0xed, 0x69, 0x01, 0x17, ++ 0xa7, 0x2b, 0xaf, 0x8f, 0xf9, 0x51, 0x24, 0xf9, 0xe7, 0x4e, 0xca, 0x7d, ++ 0x45, 0xe1, 0x9f, 0xf3, 0xcd, 0x68, 0xda, 0xa7, 0xa5, 0xbc, 0xda, 0x22, ++ 0xf9, 0x64, 0x0b, 0xe8, 0x8f, 0xfd, 0x6c, 0x89, 0xb0, 0x83, 0x7a, 0xf8, ++ 0xc4, 0xc8, 0x07, 0xb7, 0x68, 0x02, 0xaf, 0xec, 0x7e, 0xa1, 0x9f, 0x36, ++ 0xc7, 0x8b, 0xba, 0xe2, 0x03, 0x6e, 0xef, 0xb0, 0xbf, 0x81, 0x4f, 0x4a, ++ 0x19, 0xe1, 0xbd, 0x2f, 0xbb, 0x47, 0xcd, 0xb3, 0xb9, 0x45, 0xbc, 0xe7, ++ 0xf4, 0x1e, 0x97, 0xdd, 0xff, 0x52, 0xbb, 0x47, 0xd1, 0x9b, 0x59, 0xfc, ++ 0xa3, 0x61, 0x37, 0xf6, 0x45, 0xef, 0x05, 0x63, 0xe3, 0xc7, 0x68, 0x26, ++ 0x8a, 0x5b, 0xfb, 0x10, 0xb7, 0xc6, 0x5e, 0x47, 0x78, 0xb9, 0xd7, 0xe2, ++ 0x5f, 0xc7, 0xe1, 0x18, 0x64, 0x11, 0xf8, 0x4f, 0xb3, 0x08, 0xfe, 0xe2, ++ 0x52, 0xd9, 0x17, 0x35, 0x82, 0xda, 0x7b, 0x6c, 0xbc, 0x5e, 0xf1, 0xd0, ++ 0x62, 0xe6, 0xe1, 0xed, 0x2b, 0x52, 0x19, 0xf9, 0x83, 0x78, 0x7b, 0x16, ++ 0x87, 0xf6, 0xbc, 0x1b, 0x33, 0xfc, 0x23, 0xbc, 0xc4, 0x77, 0x15, 0x71, ++ 0xa2, 0xdf, 0x8a, 0x01, 0x8c, 0xec, 0x04, 0xfa, 0xe3, 0xf2, 0x2a, 0x1b, ++ 0x65, 0x26, 0xf5, 0xeb, 0x31, 0x25, 0x88, 0xef, 0x63, 0x47, 0xd0, 0xf7, ++ 0x3e, 0x93, 0xf8, 0xde, 0x63, 0xe1, 0xe5, 0xe0, 0x2c, 0xa1, 0xcf, 0x77, ++ 0x6e, 0x88, 0xf0, 0x3f, 0x0d, 0xf9, 0x7c, 0x4f, 0x5a, 0x2e, 0xf8, 0x60, ++ 0xda, 0x24, 0x23, 0x1f, 0xbc, 0x20, 0xf9, 0x46, 0x95, 0xc9, 0x39, 0x2e, ++ 0x95, 0xe7, 0x90, 0x8c, 0xf5, 0xbd, 0x60, 0xfd, 0x50, 0xda, 0x2f, 0x1a, ++ 0x23, 0xbd, 0xb5, 0xfb, 0x40, 0xb7, 0x17, 0x84, 0xfe, 0x5f, 0xb1, 0xf1, ++ 0xb6, 0x1b, 0x46, 0x03, 0xbe, 0x17, 0x13, 0xdd, 0x00, 0xef, 0x8b, 0xe9, ++ 0x7b, 0x28, 0xde, 0xb0, 0x60, 0xfd, 0xbc, 0x3b, 0x3e, 0x84, 0xdd, 0xb0, ++ 0x2b, 0x92, 0x9e, 0x8f, 0xce, 0xd1, 0xab, 0xb3, 0x47, 0x43, 0x0f, 0x74, ++ 0x95, 0xef, 0xe3, 0x0f, 0x16, 0xcc, 0x3a, 0x64, 0x4b, 0xe6, 0xdf, 0xeb, ++ 0x81, 0x19, 0xe7, 0x7e, 0xc2, 0xcb, 0xe9, 0xbe, 0x3d, 0xef, 0x42, 0x1f, ++ 0x98, 0x7e, 0xb3, 0x99, 0xda, 0x4f, 0x67, 0xc2, 0x3f, 0xca, 0xd6, 0x8b, ++ 0x71, 0x6e, 0xf0, 0x7d, 0x65, 0x49, 0xe6, 0xfd, 0xdd, 0x30, 0x5e, 0xa3, ++ 0x9c, 0x81, 0x8e, 0x48, 0x67, 0xfa, 0x4a, 0x0e, 0x7f, 0x85, 0xa4, 0xdf, ++ 0xed, 0x92, 0x7f, 0x1b, 0x23, 0xd9, 0xdc, 0x97, 0x1c, 0x80, 0x2b, 0x2d, ++ 0x37, 0x93, 0x3f, 0xbf, 0x01, 0x1a, 0x66, 0x2f, 0xf1, 0xab, 0x97, 0x54, ++ 0xfb, 0x89, 0xda, 0x36, 0xe8, 0x35, 0x83, 0x27, 0x8b, 0xf5, 0xa5, 0xda, ++ 0xa3, 0x1f, 0xf4, 0xbb, 0x3f, 0x5b, 0xe8, 0x41, 0x0d, 0x12, 0x2f, 0xaa, ++ 0xce, 0xf1, 0x4a, 0xed, 0xab, 0x36, 0x45, 0x74, 0x64, 0xc5, 0xa2, 0xb4, ++ 0x06, 0x87, 0xf0, 0xf2, 0x78, 0xee, 0xa4, 0x46, 0xcc, 0x73, 0x5a, 0x26, ++ 0x9b, 0xb2, 0x15, 0x78, 0xbf, 0xd3, 0x8c, 0x5c, 0x05, 0x0e, 0x6f, 0x67, ++ 0x05, 0xad, 0xfb, 0x98, 0x5c, 0x17, 0xf8, 0x54, 0x67, 0x2c, 0x48, 0xf9, ++ 0x11, 0xfe, 0xa1, 0xc4, 0xd7, 0x1d, 0x13, 0x3b, 0x3b, 0xee, 0xe1, 0xf5, ++ 0x8e, 0x96, 0x21, 0x6e, 0xf2, 0xf9, 0x48, 0x3b, 0x7a, 0x21, 0xec, 0x2b, ++ 0x17, 0xde, 0x0b, 0x39, 0xa6, 0xe4, 0xcb, 0x71, 0x67, 0x7b, 0x0c, 0xf1, ++ 0xab, 0xb4, 0xab, 0x2b, 0x25, 0x6b, 0xfc, 0xb1, 0x7e, 0xf2, 0x23, 0x57, ++ 0xf0, 0xf6, 0x95, 0x0e, 0x5b, 0x07, 0xf6, 0x83, 0x85, 0x0f, 0xcf, 0x8c, ++ 0x45, 0x9e, 0x49, 0x65, 0xb3, 0x59, 0xe4, 0x73, 0x6c, 0x36, 0xda, 0xd5, ++ 0xdc, 0xfe, 0x7d, 0x22, 0xbb, 0x17, 0x3b, 0x39, 0xdc, 0x1e, 0x06, 0xcf, ++ 0x80, 0x8f, 0xaa, 0x36, 0x6b, 0xc4, 0x87, 0x83, 0x1b, 0xdd, 0xb6, 0x14, ++ 0x92, 0x63, 0x9a, 0x13, 0xf3, 0xab, 0x72, 0x04, 0xb3, 0x21, 0xdf, 0xab, ++ 0xdc, 0x91, 0x6e, 0xbc, 0x3f, 0xdb, 0xe0, 0x49, 0x3c, 0x99, 0x8d, 0x78, ++ 0xc4, 0x54, 0x2a, 0xd9, 0xd7, 0x1c, 0xef, 0x63, 0xe0, 0x8f, 0x65, 0x94, ++ 0xc4, 0x11, 0xc8, 0xd1, 0x9f, 0x03, 0x9e, 0x2a, 0x9a, 0x2a, 0xc8, 0x5e, ++ 0x8c, 0x2e, 0xd0, 0x49, 0x3e, 0x9d, 0xce, 0x16, 0x7c, 0x37, 0x0d, 0xfe, ++ 0x44, 0xc8, 0x1b, 0x4b, 0x7b, 0x0a, 0xd6, 0xe1, 0xad, 0xea, 0x79, 0x82, ++ 0x33, 0xd7, 0x41, 0xfc, 0x1c, 0xc9, 0x80, 0x87, 0x0e, 0xab, 0x33, 0x17, ++ 0x70, 0x75, 0x6c, 0x88, 0x34, 0x61, 0xdf, 0x9c, 0xb6, 0x4e, 0xf0, 0x35, ++ 0x5f, 0x67, 0x76, 0x0b, 0xff, 0xfe, 0x5e, 0x0b, 0x8b, 0xc2, 0x7a, 0xaf, ++ 0xc7, 0xf7, 0x7c, 0x9e, 0x65, 0x6b, 0x2d, 0xde, 0x16, 0x5e, 0x1f, 0x64, ++ 0x67, 0x96, 0x98, 0x04, 0xf0, 0x55, 0x31, 0xf1, 0xb5, 0x6b, 0x88, 0xde, ++ 0x00, 0x78, 0x4e, 0xfd, 0x3b, 0x1b, 0x8b, 0xfd, 0xbf, 0x72, 0xf3, 0x16, ++ 0x82, 0x47, 0xf1, 0x05, 0xb3, 0xb4, 0x95, 0x24, 0x42, 0xbf, 0xdb, 0x91, ++ 0x31, 0xe2, 0x3e, 0xd6, 0xc3, 0x47, 0xae, 0x21, 0x93, 0x0e, 0xe0, 0xbb, ++ 0x6e, 0x7e, 0xb8, 0x59, 0x23, 0x3e, 0xe0, 0xe5, 0x81, 0x2c, 0xe2, 0x87, ++ 0x9b, 0x8e, 0x10, 0x3f, 0x4c, 0x0a, 0x66, 0xaf, 0x2a, 0x40, 0x1c, 0xab, ++ 0x86, 0x79, 0x10, 0x47, 0x48, 0x66, 0x6e, 0xf8, 0x03, 0xba, 0x58, 0x27, ++ 0xe9, 0x13, 0x5d, 0x5c, 0x9f, 0x80, 0x3c, 0x53, 0xf2, 0x44, 0xc9, 0x0d, ++ 0xce, 0x07, 0x1e, 0xe4, 0xf5, 0x28, 0xfa, 0x2a, 0xf9, 0xb1, 0xb3, 0x81, ++ 0x83, 0xc4, 0xf1, 0xba, 0xab, 0xc1, 0x4e, 0xe5, 0x73, 0x0d, 0x4e, 0x66, ++ 0xe1, 0x32, 0x60, 0x77, 0x43, 0x32, 0xd5, 0x5f, 0x6c, 0x70, 0x51, 0x19, ++ 0x68, 0xc8, 0xa3, 0xe7, 0x2f, 0x35, 0xb8, 0xa9, 0xbe, 0xb7, 0x61, 0x2c, ++ 0xd5, 0x5f, 0x69, 0xf0, 0x50, 0x7d, 0x7f, 0xc3, 0x54, 0x2a, 0x7f, 0xd2, ++ 0xe0, 0xa5, 0xe7, 0x1c, 0x2f, 0x24, 0x87, 0x94, 0x5c, 0x51, 0xf2, 0x48, ++ 0xf1, 0x93, 0x92, 0x4b, 0xe1, 0x7c, 0x54, 0xce, 0xd1, 0x7b, 0xcd, 0x08, ++ 0xfa, 0x9e, 0xe4, 0x9e, 0x92, 0x77, 0x98, 0x87, 0x69, 0x44, 0x8f, 0x3c, ++ 0x52, 0xf4, 0xcd, 0xd4, 0xbc, 0xbe, 0xe4, 0x0c, 0xc8, 0xb1, 0xf6, 0x79, ++ 0x90, 0x17, 0xa5, 0xe6, 0xb3, 0x2f, 0xbc, 0x0a, 0x3f, 0x49, 0xb5, 0xc3, ++ 0x1d, 0xe1, 0x02, 0x5e, 0x84, 0xdc, 0xeb, 0x72, 0xd8, 0x49, 0xce, 0xa7, ++ 0xdb, 0xd8, 0x7e, 0xd8, 0xeb, 0x8d, 0x2b, 0x3d, 0x1d, 0xf7, 0x84, 0xec, ++ 0xab, 0xb7, 0x56, 0x6b, 0xcc, 0x12, 0xc2, 0xa7, 0xb7, 0xd5, 0x45, 0x32, ++ 0x4b, 0x08, 0x1f, 0xcf, 0xaf, 0x8f, 0x37, 0xd4, 0xcb, 0xea, 0xdf, 0x7f, ++ 0x73, 0x00, 0xef, 0xff, 0x1b, 0xa7, 0xfe, 0x37, 0xd0, 0xe5, 0xf8, 0xdd, ++ 0x9f, 0x3d, 0xf1, 0x5b, 0xfe, 0xfc, 0xa9, 0xbb, 0xbf, 0xc8, 0x01, 0xbd, ++ 0x39, 0x1c, 0x3b, 0x1e, 0xc5, 0xb8, 0x6b, 0xa2, 0xba, 0xe1, 0x48, 0x40, ++ 0x7d, 0xbd, 0x95, 0xf4, 0x87, 0xc1, 0x51, 0xc2, 0x0e, 0xc2, 0x1f, 0xe8, ++ 0xb2, 0x80, 0x89, 0xf5, 0xf9, 0xd4, 0xdd, 0x7f, 0xa3, 0xf5, 0xdd, 0x51, ++ 0x1f, 0xe1, 0x32, 0xf3, 0x76, 0x0b, 0xea, 0x23, 0x08, 0x5f, 0x1f, 0x81, ++ 0x4e, 0x1c, 0xaf, 0x9f, 0x48, 0x3a, 0x55, 0x6c, 0x38, 0xf1, 0xc2, 0xab, ++ 0x58, 0xe7, 0x6b, 0x6c, 0x24, 0xe7, 0x16, 0xac, 0x97, 0xeb, 0x72, 0x13, ++ 0xc7, 0x67, 0x88, 0xbe, 0xf6, 0x69, 0x0a, 0x23, 0xbd, 0x4c, 0xf3, 0x70, ++ 0xde, 0xe5, 0x78, 0xfb, 0xf4, 0xdf, 0x6d, 0x41, 0xbe, 0xe7, 0xb3, 0x4f, ++ 0x35, 0xbb, 0x5f, 0x83, 0xee, 0xc3, 0x8d, 0xa4, 0x32, 0xfe, 0x5c, 0xdf, ++ 0xf4, 0x73, 0xca, 0xbf, 0xd2, 0xea, 0x8f, 0x92, 0x3e, 0xac, 0x23, 0x2f, ++ 0x0b, 0x7e, 0x02, 0x9f, 0xd5, 0x90, 0x8f, 0xa5, 0xd5, 0xcb, 0x3c, 0xad, ++ 0xf6, 0x41, 0x86, 0x3c, 0xaa, 0xe8, 0x51, 0x1e, 0x1b, 0xe4, 0x03, 0x78, ++ 0x1a, 0x74, 0x5b, 0x90, 0x77, 0x90, 0x61, 0x5d, 0xb3, 0x26, 0xcd, 0x89, ++ 0x2d, 0xa0, 0x4a, 0x3e, 0xaf, 0xda, 0xa4, 0x91, 0xbe, 0xd1, 0xad, 0x2f, ++ 0xe4, 0x98, 0x69, 0x3d, 0x95, 0x67, 0x5b, 0x88, 0x9e, 0xad, 0x58, 0xe3, ++ 0x64, 0x2f, 0x36, 0xd1, 0xfe, 0xa4, 0xf8, 0x95, 0xcb, 0x0b, 0x8f, 0x1f, ++ 0xeb, 0xa2, 0xa9, 0xd8, 0xb6, 0x28, 0x44, 0x0e, 0x2f, 0x90, 0xcf, 0x2b, ++ 0xf3, 0x4c, 0x54, 0xaa, 0xe7, 0xe5, 0xd9, 0x36, 0xea, 0xa7, 0x15, 0x42, ++ 0x89, 0xf7, 0x7b, 0x5f, 0x5e, 0xa6, 0x6d, 0x21, 0xc9, 0x39, 0x97, 0x0d, ++ 0x72, 0x40, 0xb5, 0x5f, 0x90, 0x37, 0x62, 0x63, 0xe6, 0x28, 0xf4, 0x33, ++ 0xb1, 0x1f, 0x0b, 0x59, 0x8f, 0x45, 0x39, 0x02, 0x9e, 0x72, 0x24, 0x7a, ++ 0x61, 0xff, 0xb2, 0x0b, 0xff, 0x7f, 0x4d, 0x1f, 0xfb, 0x80, 0xd2, 0x4b, ++ 0x4e, 0xe1, 0x9f, 0x57, 0x12, 0xfc, 0x64, 0x6f, 0x2d, 0x7d, 0xf1, 0xf9, ++ 0x17, 0x11, 0x1f, 0x5b, 0xfa, 0x71, 0x04, 0xd1, 0x69, 0xe9, 0x70, 0xe9, ++ 0x8f, 0x28, 0xf0, 0x8f, 0x99, 0x49, 0xfa, 0x8c, 0xc7, 0xa1, 0xf1, 0x79, ++ 0x2e, 0x97, 0xf4, 0x2f, 0x79, 0xfe, 0xf7, 0xb1, 0xed, 0xfc, 0xfd, 0x8a, ++ 0xbd, 0xc2, 0x7f, 0xc9, 0xcb, 0x0e, 0x94, 0xcb, 0xd7, 0x54, 0x93, 0x5f, ++ 0x6b, 0xb9, 0x9b, 0xaf, 0x8f, 0x04, 0xc8, 0x55, 0x63, 0x1c, 0xf9, 0xf0, ++ 0x8b, 0x1f, 0xc7, 0xb6, 0x93, 0x5d, 0xe1, 0x4b, 0x45, 0x7e, 0x21, 0xdf, ++ 0x16, 0x52, 0x59, 0x32, 0xe2, 0x45, 0x27, 0xa6, 0xc0, 0x2f, 0xbe, 0x82, ++ 0x75, 0x6e, 0x44, 0x5e, 0x57, 0xf8, 0x77, 0x2b, 0xb4, 0xaf, 0x63, 0x85, ++ 0x7f, 0x5f, 0xc4, 0xc9, 0x55, 0xfc, 0xb2, 0xf4, 0xf5, 0x3f, 0x27, 0x11, ++ 0x1c, 0xfb, 0x2e, 0x24, 0x41, 0xae, 0xad, 0x78, 0x7d, 0x43, 0x92, 0xde, ++ 0xcb, 0xbc, 0x57, 0x84, 0xc5, 0xaf, 0x55, 0xdc, 0x5c, 0xf9, 0xc1, 0x56, ++ 0xb0, 0xcd, 0x5f, 0x21, 0xee, 0x16, 0xde, 0x4e, 0xcf, 0x91, 0x71, 0xed, ++ 0x2b, 0xd8, 0x15, 0xe4, 0xa7, 0xb0, 0x30, 0xca, 0x63, 0x58, 0x65, 0x17, ++ 0x78, 0xe8, 0xf2, 0xe7, 0xc4, 0xb1, 0x5e, 0xc6, 0xeb, 0x1e, 0x77, 0x2b, ++ 0x17, 0xec, 0xdc, 0x0e, 0xed, 0xb2, 0xb8, 0xe2, 0xdc, 0x1c, 0xce, 0xf3, ++ 0x7d, 0xe4, 0xf1, 0xed, 0xc8, 0x11, 0x7a, 0xed, 0x39, 0x19, 0x47, 0x3d, ++ 0xbf, 0xdb, 0x4c, 0x7a, 0xe1, 0xf9, 0xdd, 0x31, 0xc4, 0xff, 0xcb, 0x77, ++ 0x3f, 0x74, 0xe4, 0x2a, 0x5e, 0x5f, 0xbe, 0x5d, 0xc3, 0xb0, 0xac, 0x96, ++ 0xb5, 0x11, 0x9e, 0x96, 0xef, 0x35, 0x33, 0x7b, 0xa8, 0x7d, 0x03, 0xbf, ++ 0x4d, 0x62, 0xdf, 0x70, 0x2e, 0x7b, 0x3e, 0xa6, 0x0e, 0xfc, 0xb4, 0x24, ++ 0xa0, 0x79, 0x76, 0x14, 0x20, 0x2e, 0xef, 0x8a, 0xeb, 0x1f, 0x02, 0xcf, ++ 0x3a, 0xc9, 0x4f, 0xcb, 0x22, 0x02, 0x63, 0x88, 0x0e, 0x12, 0xfe, 0x7a, ++ 0xa9, 0x1f, 0xa9, 0x76, 0x4b, 0x5a, 0x1f, 0xb2, 0x81, 0x5e, 0xbc, 0xdd, ++ 0x97, 0xa4, 0xb7, 0xfc, 0x67, 0x34, 0x74, 0x6d, 0xfe, 0xd7, 0xf9, 0x2e, ++ 0xe0, 0x3c, 0xb3, 0x6d, 0x24, 0xc5, 0x75, 0x97, 0x04, 0xf6, 0x2c, 0xa7, ++ 0x7d, 0x7f, 0x77, 0xb4, 0x13, 0x53, 0xfc, 0xc2, 0x6a, 0xf4, 0x47, 0x3d, ++ 0x20, 0xc7, 0x7b, 0x20, 0x47, 0xe8, 0x1b, 0x67, 0xa4, 0xff, 0xf7, 0xcc, ++ 0x8b, 0x66, 0x92, 0x3f, 0x80, 0x13, 0xeb, 0xf0, 0x0b, 0x4d, 0xf8, 0x79, ++ 0xbb, 0xf5, 0x5a, 0x7c, 0xd7, 0x1f, 0xa5, 0xd0, 0x6b, 0xae, 0x42, 0x50, ++ 0x71, 0x74, 0x4f, 0xfb, 0x25, 0x81, 0x8e, 0xd8, 0x6c, 0xde, 0xfe, 0xf3, ++ 0xfd, 0xef, 0x53, 0xf9, 0xa4, 0x6c, 0xbf, 0xc4, 0xd1, 0x56, 0x84, 0xfd, ++ 0xf2, 0xf3, 0xbd, 0xd1, 0x53, 0xfd, 0x54, 0xfe, 0x78, 0xca, 0x4f, 0xf9, ++ 0x78, 0xe7, 0x02, 0x13, 0xfb, 0x69, 0x21, 0xeb, 0xea, 0xf9, 0x1c, 0xab, ++ 0xa0, 0xc7, 0x36, 0xf3, 0x54, 0xe0, 0x8b, 0xf9, 0x55, 0x9e, 0x51, 0x80, ++ 0xe6, 0x73, 0x66, 0x77, 0xaa, 0x46, 0x76, 0x2d, 0xf0, 0xcd, 0xf1, 0x73, ++ 0x66, 0xef, 0xcb, 0xb1, 0x26, 0x5a, 0xb7, 0x3e, 0x1a, 0x47, 0xd1, 0xd1, ++ 0x64, 0x17, 0xfe, 0xd4, 0x0c, 0x8b, 0x4b, 0xea, 0x97, 0x76, 0x27, 0xf4, ++ 0x8c, 0x5b, 0xb8, 0x56, 0x17, 0xc7, 0xe5, 0x5d, 0xed, 0x5e, 0x91, 0x0f, ++ 0x10, 0xfe, 0x5c, 0xb5, 0xa7, 0xf5, 0x96, 0x02, 0x7e, 0xef, 0xb4, 0x09, ++ 0xfe, 0x97, 0xf1, 0x7b, 0x19, 0x5f, 0x42, 0x9e, 0x08, 0xc5, 0xe3, 0x63, ++ 0x6c, 0x7e, 0xec, 0xaf, 0xe5, 0xc3, 0x5d, 0x73, 0x6e, 0x85, 0x3c, 0x7b, ++ 0xcb, 0x2a, 0xe8, 0x31, 0xc8, 0xf5, 0x28, 0xec, 0xaa, 0xf2, 0xf7, 0x12, ++ 0xc9, 0x5f, 0xb1, 0xca, 0xea, 0x1a, 0x80, 0xfa, 0x9f, 0xde, 0xb6, 0x92, ++ 0xff, 0xbc, 0x7c, 0xa4, 0x5c, 0xe7, 0xc9, 0xed, 0xa3, 0xe1, 0x9f, 0xec, ++ 0xc8, 0x10, 0xfb, 0x7a, 0xcd, 0x26, 0xbe, 0x42, 0xf8, 0x94, 0x07, 0x72, ++ 0xfa, 0xfb, 0xf8, 0xfc, 0x6a, 0xfc, 0x26, 0xca, 0xa7, 0xfc, 0x55, 0x4e, ++ 0x26, 0xcd, 0xef, 0xf1, 0x6a, 0x93, 0xc7, 0x46, 0x71, 0x8e, 0x60, 0x2e, ++ 0xfc, 0x94, 0xc7, 0x6d, 0xcc, 0x67, 0x86, 0x9e, 0xfc, 0x52, 0x24, 0xe9, ++ 0x77, 0x35, 0x99, 0xc2, 0xef, 0xfe, 0x38, 0xf8, 0x9d, 0x97, 0x35, 0x09, ++ 0xc1, 0xdc, 0x44, 0xf8, 0xbb, 0x24, 0x1d, 0x6b, 0x6e, 0xe2, 0xef, 0x43, ++ 0xe8, 0x59, 0xf3, 0x74, 0x30, 0x17, 0x7a, 0xcb, 0x59, 0x9b, 0xf0, 0xe3, ++ 0xe1, 0xbd, 0x13, 0xe5, 0x08, 0xd1, 0xae, 0x51, 0xf2, 0x0d, 0xfa, 0x41, ++ 0xbf, 0x1d, 0x19, 0xce, 0x2f, 0x49, 0xbf, 0xdc, 0x17, 0xc3, 0xa0, 0xe7, ++ 0x9b, 0x5e, 0x8d, 0x11, 0xfe, 0x84, 0xff, 0x88, 0xa4, 0xb8, 0x83, 0xea, ++ 0xb7, 0x43, 0xf2, 0x55, 0xa3, 0x8c, 0x73, 0xf9, 0x76, 0x08, 0xf8, 0x00, ++ 0x17, 0xf4, 0xe6, 0x25, 0xb6, 0xa6, 0x5c, 0xe8, 0x95, 0x6a, 0xdc, 0x25, ++ 0xb1, 0x4d, 0x34, 0xde, 0x59, 0x39, 0xde, 0x92, 0xa8, 0x26, 0x11, 0x3f, ++ 0x90, 0x79, 0x61, 0x68, 0x4f, 0xe3, 0x5b, 0x99, 0x07, 0xf6, 0x78, 0xe7, ++ 0xb3, 0x11, 0xa4, 0x9f, 0x7e, 0x91, 0xd2, 0xf6, 0x0a, 0xc6, 0xff, 0xe2, ++ 0xd9, 0xa1, 0x14, 0x07, 0xef, 0xc8, 0xf0, 0x2f, 0xda, 0x4f, 0xef, 0xb9, ++ 0xde, 0xc6, 0xe9, 0xb0, 0xf4, 0xb9, 0x88, 0x20, 0xe0, 0x3d, 0xfd, 0x6c, ++ 0x0c, 0xc5, 0x39, 0x4f, 0x5b, 0x85, 0x1e, 0x74, 0x3a, 0x26, 0x89, 0xf4, ++ 0xa0, 0xa3, 0x31, 0x8f, 0x94, 0xa3, 0xbf, 0xae, 0xed, 0x11, 0x1a, 0xfc, ++ 0x29, 0xa7, 0x35, 0x66, 0x4b, 0xc6, 0xfb, 0x1d, 0xfd, 0x29, 0x5e, 0xb5, ++ 0xb4, 0xa1, 0x9e, 0xe2, 0x04, 0x4b, 0xf9, 0x72, 0x47, 0x3c, 0x9a, 0x97, ++ 0x53, 0x11, 0x57, 0x3e, 0xbd, 0x63, 0x28, 0xf9, 0x59, 0x4e, 0xff, 0xc2, ++ 0x4c, 0xf1, 0x45, 0xfe, 0x7c, 0x13, 0x9e, 0xeb, 0xac, 0xa9, 0xfc, 0x2e, ++ 0xac, 0xbb, 0x5d, 0xd1, 0xe4, 0x67, 0xfb, 0xe2, 0xb9, 0xff, 0x1e, 0x1a, ++ 0x1a, 0x7f, 0x50, 0xe5, 0xd2, 0xed, 0x46, 0x7f, 0x92, 0xa2, 0xbf, 0x7a, ++ 0x6f, 0xca, 0x15, 0xeb, 0xcb, 0x94, 0x2b, 0xec, 0x00, 0x5b, 0xae, 0xd8, ++ 0x67, 0x6a, 0xa3, 0x03, 0x8f, 0x64, 0xd2, 0x3c, 0xc5, 0x7a, 0xe5, 0x74, ++ 0x20, 0x7b, 0x8b, 0xaf, 0x8f, 0x24, 0xf8, 0xa7, 0x8f, 0x07, 0x5e, 0x4b, ++ 0xd2, 0x1c, 0xc0, 0x73, 0x30, 0xf7, 0xc7, 0xc0, 0xfb, 0x2e, 0x61, 0xd7, ++ 0x7c, 0xb1, 0xdb, 0x4a, 0x71, 0x91, 0xa5, 0xaf, 0xc6, 0x78, 0xc8, 0x7f, ++ 0x73, 0xcf, 0x15, 0x26, 0xec, 0x17, 0x4b, 0xcd, 0x42, 0xff, 0x5d, 0xca, ++ 0xd9, 0x4d, 0x94, 0xc2, 0x3f, 0xb4, 0x34, 0x36, 0x97, 0xfc, 0x43, 0x1c, ++ 0xdf, 0x64, 0x3f, 0x76, 0xee, 0x30, 0xcb, 0x71, 0xc4, 0xb8, 0xa7, 0x77, ++ 0xa6, 0x09, 0xff, 0x7b, 0x50, 0xd6, 0x5f, 0x29, 0xf4, 0x83, 0xcf, 0xa7, ++ 0x25, 0xb0, 0xf9, 0x37, 0x91, 0x7e, 0xb3, 0xad, 0x08, 0x78, 0xbd, 0xb0, ++ 0x3d, 0xda, 0x04, 0xbe, 0xe0, 0xe3, 0x78, 0x10, 0xb7, 0x5f, 0x7a, 0xd7, ++ 0x0f, 0x04, 0x3e, 0xe3, 0x16, 0x91, 0x3e, 0xce, 0x90, 0x07, 0x3d, 0x06, ++ 0xf1, 0x72, 0x21, 0x2f, 0x6b, 0xef, 0xb9, 0x2a, 0x0e, 0xf9, 0x30, 0xec, ++ 0x3d, 0x33, 0x83, 0xe8, 0xbb, 0x60, 0x71, 0x0f, 0x80, 0x3c, 0x0c, 0xc7, ++ 0xd7, 0xac, 0x5c, 0x29, 0x2f, 0x5f, 0x79, 0xc2, 0x86, 0xf8, 0x59, 0x0d, ++ 0x5f, 0x2f, 0xc8, 0x0f, 0x5a, 0x26, 0xe3, 0xa6, 0xcb, 0x9e, 0xd3, 0x48, ++ 0x9f, 0x5b, 0xb6, 0xf1, 0xaa, 0x47, 0x49, 0x0e, 0xbe, 0x6b, 0x65, 0x39, ++ 0x1c, 0x8e, 0xb3, 0x81, 0x87, 0x62, 0x43, 0xe9, 0x31, 0x41, 0xf6, 0xd3, ++ 0xf3, 0xbd, 0x9b, 0xda, 0x2f, 0xe3, 0xed, 0xc5, 0xf7, 0x6f, 0xc5, 0x12, ++ 0x3c, 0x3b, 0xad, 0x6e, 0xc0, 0x13, 0x4e, 0xc7, 0xcb, 0xfe, 0xfe, 0x39, ++ 0xf3, 0x65, 0x7d, 0xdf, 0xcd, 0x1f, 0x01, 0xbe, 0xaf, 0x17, 0x5d, 0x3a, ++ 0xef, 0x0b, 0xac, 0xed, 0xdf, 0x3e, 0x86, 0x1c, 0xd9, 0x1d, 0xe9, 0xf6, ++ 0xd1, 0xd3, 0x00, 0xc5, 0x9d, 0xcf, 0x58, 0x03, 0x8b, 0x30, 0xef, 0x33, ++ 0x2f, 0x44, 0x92, 0x7c, 0x39, 0x13, 0x2f, 0xd6, 0xfb, 0xe7, 0x5c, 0x1e, ++ 0xfa, 0x6c, 0x80, 0xe3, 0x7b, 0x0f, 0x92, 0x7f, 0xe3, 0xd7, 0x33, 0x19, ++ 0x44, 0xf7, 0x62, 0xbf, 0xb1, 0x5f, 0x35, 0x6e, 0x49, 0xae, 0x38, 0xb7, ++ 0x51, 0x9b, 0xe8, 0x8e, 0x43, 0x3c, 0xa3, 0x96, 0xd3, 0x01, 0xfd, 0x71, ++ 0xba, 0xdc, 0x48, 0xdf, 0xbf, 0x67, 0xa5, 0xef, 0xc3, 0xe7, 0x91, 0x95, ++ 0x2b, 0xe4, 0x76, 0xf7, 0xfa, 0x7c, 0x21, 0x9a, 0xf8, 0xe5, 0xcc, 0x40, ++ 0x41, 0x8f, 0x33, 0x2f, 0x0e, 0xa1, 0x7d, 0xa5, 0x23, 0x5e, 0xf0, 0x39, ++ 0x87, 0x37, 0x1d, 0x76, 0xca, 0x99, 0x78, 0x51, 0x32, 0x28, 0x23, 0x9c, ++ 0x0f, 0x96, 0x4a, 0x3b, 0xf4, 0xcc, 0xc4, 0x00, 0xd9, 0xdd, 0x67, 0xb4, ++ 0x3d, 0x54, 0x76, 0x58, 0xc5, 0x77, 0x4b, 0xeb, 0x65, 0xdc, 0x96, 0xf3, ++ 0x5d, 0x32, 0xf8, 0x06, 0x3c, 0x89, 0xb8, 0x95, 0x7d, 0x73, 0x1b, 0xf4, ++ 0x08, 0xf8, 0xa7, 0xc7, 0x8c, 0xa0, 0x32, 0x18, 0x91, 0x70, 0xa9, 0x9f, ++ 0x19, 0xfc, 0x89, 0x7d, 0x68, 0x5b, 0xae, 0xd8, 0xf7, 0xa1, 0xd6, 0x40, ++ 0xae, 0x53, 0x7c, 0x83, 0xf4, 0x93, 0x80, 0x0d, 0xf2, 0x58, 0x97, 0x7a, ++ 0x5c, 0xcd, 0xee, 0x4b, 0xe3, 0x65, 0x14, 0x07, 0xdd, 0xad, 0x51, 0xdc, ++ 0xe7, 0x07, 0xaa, 0x1f, 0x0e, 0x75, 0x3f, 0xe5, 0x1f, 0xe7, 0xfc, 0xb8, ++ 0xcc, 0xa7, 0x79, 0x90, 0x6f, 0xb4, 0x6c, 0xfd, 0xca, 0x25, 0xe0, 0xf7, ++ 0x65, 0x75, 0x5b, 0x6e, 0x05, 0xbf, 0xab, 0x79, 0x2c, 0xb3, 0xb0, 0xa9, ++ 0xb0, 0xaf, 0x3a, 0x34, 0x33, 0xc1, 0xd3, 0x11, 0xc9, 0xd7, 0x0d, 0xf0, ++ 0x10, 0x3a, 0x5e, 0x66, 0x0f, 0x7e, 0x37, 0x4a, 0x79, 0x40, 0x2b, 0x26, ++ 0x89, 0xf4, 0x4c, 0x52, 0xae, 0xef, 0xcb, 0x75, 0xd1, 0x73, 0xd4, 0x9b, ++ 0x78, 0x7f, 0x35, 0xeb, 0xb5, 0xcd, 0x34, 0x4e, 0x86, 0xb2, 0x27, 0xc5, ++ 0xfc, 0x14, 0x9e, 0x38, 0x5a, 0x6c, 0xf0, 0x93, 0x71, 0x3b, 0x5f, 0xbc, ++ 0xef, 0x63, 0xfe, 0x0a, 0xce, 0xf0, 0xf9, 0x2b, 0x78, 0x9e, 0x94, 0x72, ++ 0xa9, 0x23, 0xc3, 0xf5, 0xe0, 0x78, 0xd0, 0xfb, 0x1d, 0x33, 0xf9, 0x4f, ++ 0x2f, 0x7c, 0x3d, 0x32, 0x2e, 0xe1, 0x5b, 0xf4, 0x32, 0x58, 0x6c, 0xdd, ++ 0xfe, 0x62, 0x0e, 0xff, 0xf3, 0x7c, 0xaf, 0xa6, 0xfd, 0x16, 0xf2, 0xad, ++ 0x3f, 0xf0, 0x17, 0x24, 0x7b, 0x24, 0x77, 0x9b, 0x31, 0xfe, 0x91, 0xb7, ++ 0xdd, 0x58, 0x1f, 0xb6, 0xdb, 0x58, 0x2f, 0xd8, 0x6b, 0xac, 0x17, 0xb5, ++ 0x1a, 0xeb, 0xee, 0xc3, 0xc6, 0xfa, 0x43, 0x18, 0xb7, 0x7f, 0x0f, 0x9e, ++ 0x60, 0xe7, 0x22, 0xaf, 0x0d, 0x76, 0x2e, 0x4a, 0xd8, 0xb9, 0xae, 0x5c, ++ 0x61, 0xe7, 0xa2, 0x0e, 0x3b, 0x17, 0x25, 0xec, 0x5c, 0x3c, 0x87, 0x9d, ++ 0x8b, 0x3a, 0xec, 0x5c, 0xd4, 0x61, 0xe7, 0xa2, 0x0e, 0x3b, 0x17, 0x25, ++ 0xec, 0x5c, 0x3c, 0xff, 0x44, 0xe2, 0xa9, 0x46, 0xfa, 0x1d, 0x41, 0x07, ++ 0xca, 0xaf, 0x7a, 0x2d, 0x52, 0xc5, 0xc1, 0x69, 0xbd, 0x9c, 0x9f, 0x97, ++ 0x44, 0xf2, 0x53, 0xc5, 0x33, 0xcf, 0x2f, 0x29, 0xa0, 0x7a, 0xb7, 0x3f, ++ 0x67, 0x86, 0x9d, 0xfc, 0x39, 0x2a, 0x4f, 0xe7, 0xd6, 0x38, 0xfd, 0x48, ++ 0x2e, 0xc5, 0x0d, 0xdb, 0x36, 0xa6, 0x80, 0x6e, 0x96, 0x76, 0xf2, 0xe3, ++ 0xae, 0xf8, 0x89, 0xf0, 0xe3, 0xd6, 0x8c, 0x88, 0x74, 0xc0, 0xbf, 0xd0, ++ 0xbe, 0xe1, 0xf3, 0x8d, 0x50, 0x9f, 0x8a, 0xe2, 0xf4, 0xb7, 0xd0, 0xfe, ++ 0xbc, 0xb5, 0x73, 0xa7, 0xc8, 0x57, 0x0a, 0x92, 0xdc, 0x68, 0x5f, 0xeb, ++ 0x7a, 0x6f, 0x82, 0xa0, 0x1f, 0xf9, 0x39, 0x54, 0xde, 0x4d, 0x05, 0xf6, ++ 0xbb, 0x84, 0xbe, 0xe9, 0x18, 0x1e, 0x47, 0x61, 0x9b, 0x8d, 0x71, 0x93, ++ 0xf0, 0x38, 0x4a, 0x78, 0xfc, 0x24, 0x9c, 0x0f, 0x54, 0xdc, 0xe4, 0x29, ++ 0x6b, 0x67, 0x0a, 0xe4, 0xfd, 0x89, 0x67, 0xed, 0x9b, 0x01, 0xff, 0x09, ++ 0xe9, 0x1f, 0x63, 0x73, 0x9d, 0xa4, 0x7f, 0x29, 0xbd, 0xba, 0x5b, 0xff, ++ 0xba, 0x5f, 0x7b, 0x1a, 0xfb, 0xf6, 0xd9, 0x5c, 0x91, 0xf7, 0xd7, 0x75, ++ 0x94, 0xeb, 0xdb, 0xbd, 0xec, 0xb7, 0xaa, 0xac, 0xbc, 0x38, 0x82, 0xf4, ++ 0xc6, 0xee, 0xfa, 0x66, 0xcd, 0x44, 0x79, 0x23, 0xc9, 0xb1, 0xb4, 0x0f, ++ 0xad, 0x96, 0x30, 0xa5, 0x6b, 0x9d, 0x1d, 0xf7, 0x40, 0xde, 0xc5, 0x98, ++ 0x68, 0x1f, 0xbf, 0xe0, 0x30, 0x91, 0x5d, 0x70, 0xe1, 0x03, 0x33, 0xe9, ++ 0x11, 0x43, 0xa0, 0x9f, 0x87, 0xcc, 0x67, 0xa8, 0x3f, 0xca, 0xc0, 0x5f, ++ 0xf9, 0xbb, 0x12, 0xc2, 0xe2, 0x7f, 0x03, 0x0d, 0xed, 0x87, 0xef, 0xcf, ++ 0x0c, 0x8b, 0xff, 0x0d, 0x33, 0xc6, 0xa5, 0x6e, 0x5e, 0x7b, 0x00, 0xf6, ++ 0xf5, 0xcc, 0xcd, 0x23, 0x0d, 0xed, 0xaa, 0xbc, 0x57, 0x85, 0xe1, 0x51, ++ 0xc2, 0x2d, 0xf5, 0xd2, 0xc6, 0x35, 0x5b, 0xd3, 0x21, 0x7f, 0x56, 0xc7, ++ 0x74, 0x11, 0xfc, 0xab, 0xf7, 0x45, 0x52, 0x5e, 0x6d, 0x15, 0x87, 0xd7, ++ 0x83, 0xb8, 0x1c, 0x2a, 0x1c, 0x05, 0xd5, 0x76, 0xcf, 0x74, 0xe0, 0xaf, ++ 0x3a, 0x60, 0x8d, 0xc7, 0x3e, 0x5f, 0x29, 0xf7, 0x1f, 0x56, 0x6f, 0xdc, ++ 0x8f, 0xab, 0x2d, 0xcc, 0xe7, 0x4c, 0xe8, 0xe1, 0xbb, 0x6a, 0x27, 0xf3, ++ 0xc4, 0xf3, 0xef, 0xcf, 0x15, 0x37, 0xed, 0x34, 0x71, 0xba, 0x9d, 0x33, ++ 0x6d, 0x7b, 0x64, 0xbc, 0x0b, 0x71, 0xa5, 0x96, 0x74, 0x27, 0xe7, 0xab, ++ 0xdb, 0xb5, 0x40, 0xd2, 0x95, 0xbc, 0xbf, 0xff, 0xb6, 0xe8, 0x03, 0x87, ++ 0x70, 0xbe, 0x4f, 0xb7, 0x06, 0x1f, 0x28, 0x83, 0xbc, 0xdc, 0x93, 0xc5, ++ 0xd6, 0xf2, 0x76, 0x27, 0x36, 0xbf, 0x1c, 0x4b, 0x7a, 0xb7, 0xe4, 0xb3, ++ 0x74, 0xab, 0x33, 0x0a, 0xf4, 0x6e, 0x69, 0x32, 0x93, 0x5d, 0x00, 0xbf, ++ 0x94, 0x39, 0xa1, 0x87, 0x1f, 0x5a, 0x9a, 0x12, 0xa3, 0xb2, 0x1d, 0x3d, ++ 0xf3, 0xec, 0xa1, 0xff, 0xd7, 0x34, 0x3f, 0x4e, 0x17, 0x37, 0xce, 0x29, ++ 0x76, 0x39, 0x0e, 0x0e, 0x5a, 0x0d, 0x3d, 0x2e, 0x20, 0xe6, 0x5b, 0x3d, ++ 0x51, 0xf3, 0x91, 0x9e, 0x2c, 0xe7, 0xb3, 0x4a, 0xee, 0x2b, 0x2c, 0x5b, ++ 0xf4, 0x73, 0xbb, 0xac, 0x9f, 0x94, 0xf6, 0x82, 0x9a, 0xdf, 0xd9, 0xa1, ++ 0x07, 0x8a, 0x5c, 0x88, 0x63, 0x36, 0xec, 0x4f, 0x37, 0x43, 0x8e, 0x9b, ++ 0x76, 0xef, 0xc4, 0xf9, 0x81, 0xbb, 0xa3, 0xf4, 0xd1, 0x43, 0x46, 0x23, ++ 0x5f, 0x32, 0xe7, 0xb7, 0xe3, 0xf9, 0xb8, 0x4b, 0x3f, 0x14, 0xf9, 0xba, ++ 0x7f, 0x6c, 0x9e, 0x1c, 0x7b, 0x25, 0xf4, 0xcf, 0x17, 0xac, 0xee, 0x69, ++ 0xbc, 0x7e, 0x4f, 0xd3, 0x33, 0x36, 0xd8, 0xc5, 0x4b, 0x2d, 0x7e, 0x1b, ++ 0xec, 0xce, 0xea, 0x67, 0x5b, 0x6c, 0x1e, 0x5e, 0x5e, 0xbb, 0xab, 0x85, ++ 0x9e, 0x2f, 0xda, 0x55, 0x41, 0xf6, 0xf6, 0x62, 0x56, 0x47, 0x76, 0xe4, ++ 0x29, 0x95, 0x7f, 0x2b, 0xf1, 0x51, 0x3d, 0x49, 0xdb, 0xe6, 0xe4, 0x70, ++ 0x6f, 0x1b, 0x22, 0xe4, 0x46, 0x75, 0x94, 0xc8, 0xdb, 0x28, 0x35, 0x8f, ++ 0x7f, 0x13, 0x79, 0xe9, 0x17, 0x76, 0x69, 0xc5, 0x98, 0xef, 0xcd, 0xde, ++ 0x3d, 0xb6, 0x0a, 0xfe, 0xfc, 0xc6, 0x21, 0xf2, 0xdc, 0x49, 0xd8, 0xfa, ++ 0xe8, 0x7a, 0x7b, 0x66, 0x69, 0x7f, 0xf8, 0x93, 0x02, 0x22, 0xee, 0xd9, ++ 0xd7, 0x7a, 0x98, 0x15, 0xcc, 0xa3, 0xf5, 0x30, 0xf3, 0xa2, 0x8b, 0xca, ++ 0x9b, 0x2f, 0x0e, 0x23, 0x3b, 0xf6, 0x43, 0xe6, 0x2d, 0x24, 0x39, 0x51, ++ 0x10, 0x66, 0xcf, 0xbe, 0x2d, 0xf2, 0x90, 0xbb, 0x5a, 0xc5, 0x3a, 0xa8, ++ 0xb6, 0x05, 0xfb, 0xcd, 0xc4, 0x3a, 0x79, 0xc3, 0x4a, 0xeb, 0xa4, 0x96, ++ 0xcb, 0xaf, 0xb1, 0x23, 0x60, 0x27, 0x33, 0x36, 0x8e, 0x97, 0xde, 0xf1, ++ 0x66, 0x03, 0xbf, 0xae, 0x28, 0x89, 0x36, 0xf0, 0xf3, 0x5c, 0x96, 0x60, ++ 0x88, 0x23, 0xcf, 0xc6, 0xa1, 0xcd, 0x90, 0xfa, 0xcd, 0xd3, 0xb2, 0x0c, ++ 0xed, 0xe7, 0xdc, 0x9c, 0x1f, 0xc6, 0xff, 0x23, 0x7a, 0xde, 0x93, 0x1c, ++ 0x19, 0x67, 0xc8, 0x33, 0xa9, 0x5d, 0xe3, 0x73, 0x69, 0x94, 0xcf, 0x32, ++ 0xc9, 0xf8, 0x9c, 0x97, 0x6b, 0x88, 0xcf, 0xae, 0x37, 0x7c, 0x5f, 0xcb, ++ 0x6e, 0xea, 0x69, 0x07, 0x3b, 0x78, 0xfb, 0xaf, 0x08, 0xcf, 0x8c, 0xb5, ++ 0xd9, 0x60, 0x6f, 0x55, 0x9b, 0x44, 0x5e, 0xcd, 0x5c, 0xbd, 0x43, 0x3e, ++ 0x6f, 0xa7, 0xe7, 0x7c, 0x22, 0x86, 0x75, 0x38, 0x38, 0xcb, 0xfd, 0x5b, ++ 0xb1, 0x2f, 0x5a, 0xc9, 0x2f, 0xaf, 0xfc, 0xd2, 0x73, 0xf1, 0xef, 0xac, ++ 0xde, 0xf6, 0x45, 0x4e, 0x68, 0x39, 0x2e, 0xf2, 0x43, 0xe1, 0x5f, 0x30, ++ 0xe4, 0x17, 0x72, 0x00, 0xc8, 0xfe, 0x64, 0x82, 0x0e, 0xb5, 0xd2, 0xdf, ++ 0x53, 0x9b, 0x27, 0xfc, 0x3d, 0xb5, 0xbe, 0x36, 0x1b, 0xf2, 0x6f, 0x39, ++ 0xfe, 0x2d, 0xa9, 0x1c, 0x25, 0xcb, 0x9b, 0x34, 0xf2, 0xe7, 0xf1, 0xf6, ++ 0xf6, 0xd4, 0x04, 0x51, 0x5f, 0x83, 0xe7, 0x7b, 0x8d, 0xe7, 0x0d, 0xd0, ++ 0xdf, 0x45, 0xbc, 0x3f, 0x6a, 0xae, 0xc0, 0x7a, 0x09, 0x7f, 0xbf, 0x9c, ++ 0xcf, 0x1b, 0x7a, 0xc6, 0x72, 0xf8, 0x69, 0xe0, 0x67, 0x52, 0xfd, 0xcb, ++ 0x7e, 0x15, 0x7f, 0x2e, 0xde, 0x6a, 0xf4, 0x1b, 0x2d, 0x87, 0x3f, 0x27, ++ 0x84, 0x8e, 0x7f, 0x18, 0xe2, 0x22, 0x3e, 0x5d, 0xba, 0x6b, 0xcf, 0x91, ++ 0x81, 0x1c, 0x2f, 0x33, 0xbd, 0xf1, 0xc5, 0x58, 0x3f, 0x35, 0x81, 0x19, ++ 0xd6, 0x8a, 0x82, 0x4b, 0xf9, 0x4c, 0xc9, 0xf7, 0x0b, 0xd5, 0x26, 0x8a, ++ 0x73, 0x77, 0xbd, 0x7d, 0x88, 0xf8, 0xac, 0xab, 0xda, 0x42, 0xfc, 0xfc, ++ 0x5d, 0xf8, 0x58, 0xee, 0x11, 0xfe, 0xcc, 0x70, 0xfe, 0x5b, 0xc4, 0xe7, ++ 0x83, 0xb8, 0xec, 0xa2, 0xbd, 0x9a, 0xdb, 0xaf, 0x89, 0x76, 0xc0, 0xcb, ++ 0x40, 0xf0, 0x65, 0x18, 0x5e, 0x52, 0x7b, 0xc1, 0x97, 0xc2, 0x53, 0x37, ++ 0xde, 0xc2, 0xde, 0x2f, 0xc6, 0x3f, 0x46, 0x21, 0x6f, 0x40, 0xf3, 0x07, ++ 0x33, 0x7a, 0xc3, 0x8b, 0xc4, 0xa3, 0xea, 0x3f, 0x0c, 0x4f, 0x6c, 0xac, ++ 0x11, 0x0f, 0x8b, 0x74, 0xd7, 0x7b, 0x90, 0x37, 0x8b, 0x8e, 0x9a, 0x99, ++ 0xff, 0x32, 0xe6, 0xbd, 0x18, 0xf3, 0xc3, 0xf8, 0x7c, 0x7e, 0x18, 0xff, ++ 0xa6, 0x8b, 0xc2, 0x4f, 0xa2, 0xe2, 0x06, 0xb3, 0x2f, 0x5a, 0xa8, 0xde, ++ 0xcd, 0x27, 0x5e, 0x91, 0x3f, 0x7d, 0xf3, 0x34, 0xe3, 0xba, 0xec, 0xe6, ++ 0x1b, 0xaf, 0x58, 0x27, 0xb3, 0x2e, 0x26, 0xd1, 0x77, 0xff, 0xdb, 0xfc, ++ 0xf3, 0x5d, 0x7c, 0xa3, 0xe0, 0x0e, 0xcf, 0x4f, 0x56, 0xe7, 0x7b, 0xfe, ++ 0x38, 0x44, 0xfa, 0x09, 0x47, 0xb3, 0xd1, 0xb4, 0xfe, 0x2f, 0x33, 0x6f, ++ 0x58, 0xed, 0xf7, 0x0a, 0xcf, 0x83, 0xef, 0x1e, 0x4b, 0xf9, 0x44, 0x5d, ++ 0x8e, 0x4c, 0xd2, 0x1f, 0xba, 0xf7, 0x1b, 0xa7, 0xf1, 0xfd, 0xaa, 0x98, ++ 0x4c, 0xca, 0x23, 0xd6, 0xa5, 0x7f, 0x4e, 0xc9, 0x5d, 0x5d, 0xb6, 0x53, ++ 0xe3, 0x54, 0xf0, 0xf7, 0xae, 0x91, 0xe0, 0xe3, 0x41, 0x49, 0xf0, 0xbb, ++ 0x6e, 0x5c, 0x9f, 0x95, 0xde, 0x1e, 0xa2, 0x97, 0xe8, 0x1b, 0xac, 0xe4, ++ 0x37, 0x4d, 0x5f, 0x9b, 0x48, 0x65, 0x45, 0xa4, 0x33, 0x09, 0xfb, 0x45, ++ 0xc5, 0x5a, 0xb3, 0x17, 0xfb, 0xe0, 0xa7, 0xf7, 0x0e, 0x48, 0x1a, 0x0b, ++ 0x3f, 0xfc, 0x06, 0x6b, 0xbf, 0x69, 0xbc, 0xeb, 0x4f, 0xef, 0x1c, 0x95, ++ 0xce, 0x0a, 0x51, 0x2f, 0xa5, 0xf2, 0xc4, 0x96, 0x88, 0xb9, 0xa1, 0xfe, ++ 0x6c, 0x55, 0xc6, 0xe6, 0x89, 0xfd, 0xa0, 0xf6, 0xee, 0x63, 0xb4, 0x7f, ++ 0x9d, 0x33, 0xbd, 0x1d, 0x3b, 0x17, 0xeb, 0x6c, 0xc3, 0xbe, 0x58, 0xa4, ++ 0xd4, 0x2c, 0xdb, 0xf0, 0xfe, 0x18, 0x27, 0x57, 0x3d, 0x5a, 0x2c, 0x7a, ++ 0x4c, 0x1e, 0xf2, 0x08, 0xb5, 0x96, 0x9d, 0x4e, 0xe0, 0xcd, 0xd9, 0x52, ++ 0x04, 0x7f, 0x74, 0x5a, 0x1e, 0xe1, 0xb2, 0x5b, 0x4f, 0x58, 0xba, 0xa1, ++ 0x74, 0x00, 0xfc, 0x5f, 0x35, 0xdf, 0x1c, 0x7a, 0x12, 0xfb, 0xbb, 0xbe, ++ 0xd6, 0x9a, 0x04, 0x3d, 0xf3, 0xf4, 0x07, 0x7c, 0xff, 0xd3, 0x68, 0xff, ++ 0x22, 0xfd, 0xe0, 0x14, 0xf2, 0x8f, 0xfb, 0x21, 0x6e, 0x15, 0x4d, 0xe7, ++ 0xdb, 0x4e, 0x69, 0xcc, 0x83, 0xf8, 0xcd, 0x12, 0xf3, 0x81, 0x22, 0xa7, ++ 0x61, 0x3f, 0x6d, 0x9d, 0x0d, 0x38, 0x5e, 0x8b, 0xd2, 0xd3, 0xc4, 0xf8, ++ 0xfe, 0x9d, 0xc9, 0x18, 0xdf, 0xed, 0xa3, 0x7c, 0x49, 0x7d, 0x6d, 0x4e, ++ 0x5c, 0x6f, 0xfe, 0x12, 0x55, 0xae, 0xd8, 0x2a, 0xf4, 0xb7, 0x9d, 0xca, ++ 0x5f, 0x2b, 0xfd, 0xba, 0xd0, 0xdb, 0x51, 0x87, 0xde, 0x8e, 0xa0, 0x10, ++ 0xf4, 0x76, 0xd4, 0xa1, 0xb7, 0xa3, 0x84, 0xde, 0x8e, 0xe7, 0x13, 0xb2, ++ 0x85, 0x9d, 0x31, 0xb8, 0xb1, 0xb3, 0x18, 0x76, 0xa7, 0x6f, 0x12, 0xcb, ++ 0xab, 0xa3, 0xfd, 0xd5, 0x91, 0x07, 0xbd, 0x7c, 0xb5, 0x16, 0xe5, 0x86, ++ 0xbc, 0x59, 0xad, 0xb9, 0x07, 0xc0, 0x0f, 0xc6, 0xb6, 0xa7, 0x88, 0x7d, ++ 0x35, 0x8c, 0xbe, 0xaa, 0xbc, 0xba, 0x93, 0xeb, 0x56, 0x21, 0xfc, 0x3e, ++ 0xe1, 0xa2, 0x9d, 0x85, 0xe6, 0x8f, 0x4d, 0x64, 0xf1, 0x86, 0xfa, 0x64, ++ 0x7b, 0x8a, 0xa1, 0x7d, 0xa9, 0x33, 0xc3, 0xf0, 0xfe, 0xda, 0xe4, 0xa1, ++ 0x86, 0xf7, 0xd7, 0xb9, 0x8a, 0x0d, 0xf5, 0xef, 0xe5, 0x5d, 0x69, 0x68, ++ 0x7f, 0x83, 0x7b, 0xa2, 0xa1, 0x7e, 0xe3, 0xd8, 0xeb, 0x0c, 0xed, 0x67, ++ 0x78, 0x66, 0x18, 0xea, 0x33, 0xa7, 0xce, 0x33, 0xb4, 0x9f, 0xe5, 0xad, ++ 0x30, 0xbc, 0x9f, 0x33, 0x77, 0x89, 0xe1, 0xfd, 0x3c, 0x7d, 0xa5, 0xa1, ++ 0x7e, 0x6b, 0xf5, 0x9d, 0x86, 0xf6, 0xb7, 0xd5, 0xad, 0x35, 0xbc, 0xf7, ++ 0x30, 0xa7, 0x05, 0xfb, 0x5b, 0x2b, 0xec, 0x29, 0x8e, 0xf7, 0x37, 0x60, ++ 0x4f, 0xf1, 0x72, 0xf5, 0x3b, 0x39, 0x8e, 0x50, 0xba, 0x8e, 0x9f, 0x6c, ++ 0xaa, 0xeb, 0xcd, 0x1f, 0x5f, 0x25, 0xf9, 0x77, 0xe3, 0x50, 0xcf, 0x7c, ++ 0xf0, 0x47, 0x9a, 0x3c, 0x07, 0x92, 0x26, 0xcf, 0x73, 0xac, 0xca, 0x73, ++ 0x11, 0xfd, 0x52, 0x71, 0x6e, 0x9f, 0xec, 0xd9, 0xb6, 0x14, 0xe2, 0xdb, ++ 0xb0, 0x76, 0xe1, 0xef, 0xc7, 0x47, 0x1f, 0xbc, 0xe0, 0xe2, 0x34, 0x7c, ++ 0x67, 0xd7, 0x0d, 0x37, 0x5b, 0xb8, 0x7c, 0x18, 0x7f, 0xc5, 0xc1, 0x91, ++ 0x59, 0xa0, 0xe9, 0xd0, 0x75, 0x37, 0x5b, 0xb8, 0x5c, 0x19, 0x7f, 0xd5, ++ 0xc1, 0x97, 0x33, 0x79, 0xdd, 0x3e, 0xb4, 0x55, 0xd4, 0x87, 0x1f, 0xbc, ++ 0x80, 0xf7, 0x77, 0x0e, 0xdd, 0x28, 0xea, 0x33, 0x19, 0xa9, 0x16, 0xce, ++ 0xa1, 0x57, 0xde, 0xec, 0xe3, 0x70, 0x8f, 0x9f, 0x90, 0xb9, 0xd9, 0x2d, ++ 0xfc, 0x21, 0xbd, 0xe6, 0x5b, 0xaa, 0x12, 0x78, 0x40, 0xde, 0x22, 0xf0, ++ 0x80, 0x32, 0xc8, 0xf9, 0x13, 0xe5, 0x41, 0xce, 0x9f, 0x28, 0x0f, 0x73, ++ 0xfe, 0xac, 0xca, 0x66, 0xec, 0x08, 0xe7, 0x4f, 0x94, 0x47, 0xb9, 0x5d, ++ 0x89, 0xe7, 0xbf, 0xe4, 0x76, 0x25, 0xca, 0xb7, 0xb9, 0x5d, 0x89, 0xf2, ++ 0x5d, 0x6e, 0x57, 0xa2, 0x6c, 0xe3, 0x76, 0x25, 0xca, 0x5f, 0x37, 0xcc, ++ 0xa5, 0xf2, 0x83, 0x06, 0x9d, 0xbe, 0xfb, 0x4d, 0x43, 0x35, 0x95, 0xc7, ++ 0x1a, 0xea, 0xe8, 0xf9, 0x47, 0x0d, 0xf5, 0x54, 0x7e, 0xd2, 0xe0, 0xa3, ++ 0xe7, 0x0f, 0xe4, 0x29, 0xff, 0x41, 0x90, 0xfc, 0x2c, 0x2a, 0x9e, 0xb4, ++ 0x1c, 0x71, 0x3c, 0xf8, 0xe1, 0xf6, 0x5b, 0xcf, 0x86, 0xc6, 0x59, 0x55, ++ 0x3c, 0x50, 0xc5, 0xff, 0x1a, 0xeb, 0x58, 0x7b, 0x34, 0xd6, 0x69, 0xbb, ++ 0x25, 0xfe, 0x33, 0x7b, 0x4f, 0x5c, 0xaf, 0x6f, 0x39, 0x6b, 0x61, 0x9f, ++ 0x85, 0xe8, 0x5b, 0x2d, 0xd1, 0x9e, 0xc7, 0xf2, 0x68, 0xfc, 0x41, 0x4e, ++ 0x92, 0xd7, 0xf2, 0xf9, 0x24, 0x6d, 0x66, 0xda, 0x08, 0x5e, 0x7e, 0xee, ++ 0xd2, 0x9f, 0xc2, 0xfb, 0x59, 0x23, 0x2a, 0x37, 0xc4, 0x65, 0xe0, 0x1c, ++ 0x48, 0x9d, 0x15, 0xfc, 0xf2, 0xa1, 0xa9, 0xf7, 0x73, 0xc1, 0xab, 0xf2, ++ 0x84, 0x7e, 0xac, 0x0f, 0xf5, 0x6c, 0x27, 0x3e, 0x91, 0x71, 0x6c, 0x15, ++ 0x47, 0xee, 0xce, 0x4f, 0x09, 0x89, 0x73, 0x9b, 0x42, 0xf2, 0x62, 0xe8, ++ 0x2f, 0x24, 0xbf, 0x45, 0xc5, 0x9b, 0x55, 0x3e, 0xcd, 0x35, 0x76, 0x91, ++ 0x9f, 0xa7, 0xe2, 0xc9, 0x2a, 0x6f, 0x46, 0xf5, 0x57, 0x7a, 0x91, 0x91, ++ 0xbc, 0xbb, 0x7a, 0x93, 0x85, 0xf4, 0x93, 0x18, 0x0b, 0x0b, 0xa2, 0x7f, ++ 0x95, 0x1f, 0x73, 0xb5, 0x3d, 0x50, 0x8c, 0x7c, 0x81, 0xab, 0x6b, 0x1c, ++ 0x94, 0x87, 0x36, 0x80, 0x3f, 0xb7, 0x8d, 0xa0, 0x76, 0x1e, 0x33, 0x2f, ++ 0xb7, 0xff, 0x99, 0xb7, 0x2f, 0xea, 0x89, 0x5f, 0x0f, 0x90, 0xf0, 0xf3, ++ 0xf7, 0x04, 0x7f, 0xe9, 0x45, 0x9d, 0xfc, 0xae, 0x57, 0xcb, 0xf8, 0x3d, ++ 0xbe, 0xb7, 0x8b, 0xf7, 0x3e, 0x7c, 0x8f, 0xdc, 0x29, 0xe8, 0x19, 0xbc, ++ 0x24, 0xbf, 0xda, 0x13, 0xc8, 0x73, 0x1a, 0xd1, 0x13, 0x4f, 0x47, 0xfb, ++ 0x68, 0xd1, 0x3e, 0x88, 0xfe, 0xb2, 0xff, 0xc2, 0xc7, 0x8b, 0xed, 0x59, ++ 0x3f, 0x69, 0x09, 0x81, 0x62, 0xe4, 0x53, 0xa5, 0x2d, 0x77, 0x50, 0x3e, ++ 0xd5, 0xb6, 0x89, 0x41, 0x3a, 0xbf, 0x75, 0x5b, 0x86, 0xde, 0x96, 0xc7, ++ 0xd7, 0x9f, 0x37, 0xc2, 0xf9, 0xfb, 0x68, 0x5a, 0x3f, 0x59, 0x69, 0xf0, ++ 0x13, 0xcc, 0x90, 0x7a, 0xef, 0xb7, 0xd0, 0xe1, 0x43, 0xd0, 0x41, 0xe1, ++ 0x47, 0xe1, 0x59, 0xd1, 0x45, 0xe1, 0x37, 0x24, 0xef, 0x88, 0xf0, 0xda, ++ 0x17, 0x9d, 0xc2, 0xe9, 0x13, 0x4e, 0x17, 0x45, 0x8f, 0xd2, 0x8b, 0x3d, ++ 0x78, 0x06, 0x9e, 0x2e, 0xa5, 0x43, 0x0f, 0x9d, 0xe0, 0x8f, 0xfd, 0x7f, ++ 0x85, 0x0e, 0xa3, 0x2c, 0x01, 0x3a, 0xff, 0x17, 0x51, 0x63, 0x77, 0x03, ++ 0xae, 0xef, 0xa2, 0xcb, 0xfc, 0x4e, 0x36, 0x05, 0xe7, 0x89, 0xfb, 0x67, ++ 0xea, 0xab, 0x80, 0xe7, 0x8a, 0x8b, 0xae, 0x23, 0xa8, 0x57, 0xb2, 0x89, ++ 0x53, 0x20, 0xc6, 0xd4, 0xfb, 0x74, 0xbc, 0x1f, 0xdd, 0xf7, 0xfb, 0xd2, ++ 0xef, 0xf8, 0xbe, 0xb2, 0x8f, 0xef, 0xdf, 0x8a, 0x54, 0xf9, 0x08, 0x1e, ++ 0x47, 0x31, 0xa7, 0xcb, 0x64, 0x29, 0x3f, 0x56, 0x97, 0x0a, 0xfc, 0x4e, ++ 0xcd, 0x30, 0x13, 0x7e, 0x27, 0x17, 0x2c, 0x26, 0x7d, 0x94, 0x39, 0x84, ++ 0x5e, 0xe7, 0xe2, 0xff, 0x83, 0x3c, 0x99, 0xf2, 0xb5, 0x77, 0x3d, 0xfa, ++ 0x9b, 0xd2, 0xcf, 0xa8, 0x1f, 0xaa, 0x78, 0xf0, 0xf5, 0xb2, 0xbf, 0xa9, ++ 0x61, 0x71, 0xe0, 0xeb, 0xa5, 0xde, 0x78, 0x7d, 0x98, 0x5e, 0x98, 0x3d, ++ 0x54, 0xea, 0x7d, 0x19, 0x2c, 0x43, 0xd8, 0x7d, 0xe2, 0x9c, 0x7b, 0x89, ++ 0xdc, 0xa7, 0x53, 0x25, 0x9d, 0xb3, 0xb8, 0x31, 0x3f, 0x1e, 0x74, 0x64, ++ 0xba, 0x05, 0x42, 0xeb, 0x30, 0xce, 0xb9, 0x17, 0xe1, 0x1c, 0xb8, 0x8f, ++ 0xea, 0xd7, 0x31, 0x3f, 0x95, 0xdf, 0x63, 0x41, 0xda, 0xb7, 0x6e, 0xe0, ++ 0x02, 0x0e, 0xf5, 0x1b, 0x19, 0xa3, 0x7c, 0xc6, 0x43, 0xd1, 0xd3, 0xcb, ++ 0x56, 0xf0, 0xfe, 0x26, 0x8f, 0x9c, 0x9c, 0x8d, 0xe7, 0x21, 0xe7, 0xfa, ++ 0x46, 0x0f, 0xed, 0x4f, 0xe7, 0xfa, 0xfe, 0xe0, 0x0c, 0x39, 0xd7, 0x77, ++ 0xb0, 0xc4, 0x45, 0x7a, 0xc3, 0x41, 0x7b, 0x16, 0xe9, 0x31, 0x58, 0x07, ++ 0xd6, 0x10, 0x3f, 0xda, 0x2f, 0xb8, 0xdc, 0x47, 0x2a, 0xc3, 0x21, 0xbe, ++ 0x2f, 0xa0, 0x7c, 0x93, 0xef, 0x0b, 0xd9, 0x9c, 0xc9, 0x7f, 0xce, 0xf7, ++ 0x05, 0xd4, 0xaf, 0xcf, 0x5b, 0xcb, 0xf0, 0xdd, 0x14, 0x97, 0x31, 0xdf, ++ 0x44, 0x7d, 0xff, 0x3d, 0xe7, 0x24, 0x66, 0x19, 0xd9, 0xb7, 0xdc, 0xfd, ++ 0x5e, 0xd1, 0x6b, 0x83, 0xe0, 0x5f, 0x79, 0x2b, 0x7e, 0x48, 0x09, 0xfc, ++ 0xce, 0x6f, 0xc5, 0x5f, 0x51, 0x82, 0xf9, 0xbe, 0x15, 0x3f, 0xc0, 0x24, ++ 0xca, 0x08, 0x1b, 0x95, 0x85, 0xaf, 0x66, 0xf7, 0xa6, 0x67, 0x29, 0x3e, ++ 0xec, 0x19, 0x6f, 0x0a, 0xb3, 0x24, 0x5e, 0x8a, 0x5f, 0x85, 0xcf, 0x70, ++ 0x3c, 0x2a, 0xfc, 0xfe, 0x13, 0xf8, 0x9c, 0xdf, 0x1b, 0x3e, 0x57, 0x49, ++ 0x7d, 0xb4, 0xcb, 0xfe, 0x7e, 0x6c, 0x72, 0x26, 0xe2, 0x5f, 0x62, 0xfd, ++ 0xd7, 0xbe, 0x5a, 0x38, 0x00, 0xf0, 0x9f, 0x06, 0x68, 0xc8, 0x4b, 0xb6, ++ 0x0b, 0xbc, 0x84, 0xfb, 0x77, 0x3e, 0x6f, 0x60, 0x83, 0x80, 0x5f, 0xb6, ++ 0x3d, 0x8e, 0x9e, 0xdf, 0x21, 0x79, 0xe8, 0xea, 0xfa, 0x71, 0xd4, 0xfe, ++ 0x9a, 0xfa, 0xb1, 0x34, 0xbf, 0xab, 0xa2, 0xf4, 0x3a, 0x8c, 0x7f, 0x76, ++ 0x44, 0x30, 0x97, 0x6b, 0x0e, 0xec, 0xf3, 0x6d, 0x8d, 0x74, 0xfe, 0xf6, ++ 0xdc, 0x8b, 0x66, 0x37, 0xf4, 0xef, 0x1a, 0xb3, 0x6b, 0xb3, 0x1b, 0x6b, ++ 0xfd, 0x2d, 0x71, 0x5e, 0x8e, 0x7d, 0x7d, 0x28, 0x1d, 0xf1, 0x36, 0xb6, ++ 0xbd, 0xf7, 0xbc, 0xdd, 0x1a, 0xbb, 0xc2, 0x9b, 0x8f, 0xf0, 0x59, 0x94, ++ 0xe9, 0x59, 0x25, 0xf6, 0x3f, 0x71, 0x8e, 0x58, 0xed, 0xbf, 0x83, 0x22, ++ 0x44, 0xbe, 0xab, 0x3a, 0xcf, 0xda, 0xd7, 0x7e, 0x3c, 0x26, 0x4a, 0xc8, ++ 0x95, 0x41, 0x11, 0x42, 0x0e, 0x2a, 0x3a, 0xf1, 0xef, 0xa8, 0x9e, 0xca, ++ 0xfb, 0x19, 0xc3, 0xe5, 0x46, 0xea, 0x83, 0x51, 0xa4, 0x7f, 0x8f, 0x4e, ++ 0xf0, 0xdc, 0x33, 0x14, 0x7e, 0xa1, 0x12, 0x66, 0xd0, 0x5f, 0x95, 0x5d, ++ 0xdd, 0xd5, 0xcf, 0x4c, 0x71, 0xeb, 0x55, 0x88, 0x5f, 0xf6, 0x83, 0x5d, ++ 0x63, 0x27, 0x7f, 0xce, 0x35, 0x2c, 0xf7, 0x46, 0xe8, 0xc1, 0x25, 0xb0, ++ 0x37, 0x39, 0x1e, 0x4a, 0x7f, 0x51, 0x49, 0xf7, 0x14, 0xa8, 0x73, 0x19, ++ 0x11, 0xc9, 0x26, 0xe3, 0xfd, 0x36, 0xae, 0x28, 0xc3, 0x7d, 0x2d, 0xd1, ++ 0x79, 0x09, 0x86, 0x7a, 0x8c, 0x7b, 0xa0, 0xa1, 0x7d, 0xdc, 0xd8, 0x4c, ++ 0xc3, 0xfb, 0x78, 0xcf, 0x30, 0xc3, 0xfb, 0xc4, 0xa9, 0x23, 0x0c, 0xf5, ++ 0xfe, 0xde, 0x71, 0x86, 0xf6, 0x03, 0xe6, 0x4e, 0x32, 0xd4, 0x53, 0xf4, ++ 0xeb, 0x0d, 0xed, 0x53, 0xab, 0x6f, 0x32, 0xd4, 0x95, 0x7c, 0x49, 0x15, ++ 0x8f, 0x58, 0x5a, 0xdd, 0x2d, 0x86, 0xef, 0x07, 0xd7, 0x2f, 0x30, 0xb4, ++ 0xcf, 0xf0, 0x2d, 0x35, 0xde, 0x3f, 0xe3, 0xf3, 0xb4, 0xe5, 0x25, 0x41, ++ 0x2e, 0x89, 0xbf, 0xac, 0x4d, 0xab, 0x0c, 0xef, 0x7f, 0x1c, 0x2b, 0xce, ++ 0x1d, 0x4c, 0x75, 0x2c, 0xa2, 0xfb, 0x24, 0x72, 0x9a, 0xee, 0x32, 0x8e, ++ 0x6f, 0xfe, 0xda, 0x0c, 0xfc, 0xa6, 0xc6, 0x69, 0xe2, 0xbe, 0x00, 0x97, ++ 0x90, 0x7f, 0x3e, 0xfe, 0x3f, 0xd0, 0xb5, 0x34, 0xd9, 0x28, 0x0f, 0x27, ++ 0x3b, 0x8d, 0xf6, 0x30, 0xd7, 0xd7, 0x34, 0xec, 0xbf, 0xa9, 0x75, 0x16, ++ 0x63, 0x3e, 0x0f, 0xe4, 0x5f, 0x3e, 0xff, 0x47, 0x11, 0x2b, 0x22, 0xf9, ++ 0xf7, 0x0f, 0xd2, 0x39, 0x1c, 0x2f, 0x5d, 0x25, 0xcc, 0x1d, 0x44, 0x7b, ++ 0xe8, 0x2b, 0xbc, 0x7e, 0x8d, 0x3e, 0xec, 0x41, 0xf8, 0x1d, 0x4a, 0xfa, ++ 0x59, 0xdd, 0x7e, 0x26, 0xfc, 0xdd, 0xa1, 0xf3, 0x82, 0xbf, 0x3b, 0x14, ++ 0x0f, 0xf0, 0x77, 0x87, 0xd6, 0xe1, 0xef, 0x36, 0xde, 0xdb, 0x64, 0xa4, ++ 0x3b, 0xfc, 0xdd, 0xa1, 0xef, 0x47, 0x1e, 0x35, 0xd2, 0x7d, 0x74, 0x9b, ++ 0x91, 0xee, 0x57, 0x1c, 0x33, 0xd2, 0x5d, 0xf1, 0x63, 0x38, 0x7d, 0xae, ++ 0x6c, 0x37, 0xf2, 0x43, 0x38, 0x7d, 0xae, 0x3a, 0x15, 0xc6, 0x1f, 0x92, ++ 0x1e, 0x73, 0xf9, 0xff, 0xfe, 0x2e, 0xce, 0x31, 0x13, 0xbd, 0xa6, 0x38, ++ 0x34, 0xf6, 0x78, 0xc6, 0x3f, 0x4f, 0x9f, 0x8b, 0x61, 0xf4, 0xe9, 0xa6, ++ 0x87, 0xc3, 0x4e, 0xfa, 0xe2, 0x35, 0xc1, 0xfc, 0x38, 0xd4, 0x4b, 0xb1, ++ 0xce, 0xa0, 0x37, 0xc8, 0xf9, 0x5c, 0x9b, 0x5f, 0xe7, 0xc8, 0x84, 0x9c, ++ 0xb4, 0xe9, 0xa6, 0x61, 0xa3, 0x7b, 0xf8, 0xa7, 0x31, 0x45, 0xf0, 0x4f, ++ 0xd7, 0xd1, 0x97, 0x23, 0x21, 0xf7, 0x2c, 0xc3, 0x8c, 0xfd, 0x9f, 0x49, ++ 0xd5, 0x23, 0xd0, 0x7e, 0x6e, 0xe2, 0x85, 0x74, 0x1b, 0xf8, 0xa1, 0x53, ++ 0xdc, 0xd7, 0x37, 0x5f, 0xca, 0x4f, 0x95, 0x4f, 0xc8, 0xed, 0x5d, 0x71, ++ 0x9e, 0xee, 0x2e, 0x33, 0xc5, 0xf7, 0x8f, 0x9b, 0x9a, 0xe8, 0xbe, 0xa4, ++ 0x9f, 0x39, 0xf5, 0xb8, 0x61, 0x5c, 0x9e, 0xcc, 0x2f, 0xa8, 0xd3, 0x10, ++ 0x3f, 0x48, 0x66, 0xde, 0x3d, 0x8b, 0xf8, 0x78, 0xe5, 0x3f, 0x8b, 0xa0, ++ 0x78, 0x42, 0xf9, 0x60, 0x71, 0xae, 0x93, 0x15, 0xb4, 0x53, 0x9e, 0xbd, ++ 0x92, 0x73, 0xe5, 0xa9, 0x22, 0x8f, 0x65, 0xc0, 0x30, 0x19, 0x07, 0x75, ++ 0x8b, 0x7c, 0x96, 0x81, 0xc3, 0x84, 0x5e, 0x18, 0xe3, 0x76, 0x52, 0xde, ++ 0x6b, 0x45, 0x81, 0x38, 0x47, 0xc0, 0xcd, 0x82, 0xf4, 0xf2, 0x42, 0xe0, ++ 0xe3, 0xed, 0x48, 0xdc, 0x5b, 0xd8, 0xd5, 0x2c, 0xfc, 0xf7, 0xed, 0x56, ++ 0x71, 0xbe, 0xd4, 0xc7, 0xf9, 0x14, 0x71, 0x31, 0xe8, 0x89, 0xd0, 0xe3, ++ 0xd2, 0xa4, 0x1e, 0xd5, 0xf8, 0x3b, 0xbb, 0x1d, 0xf0, 0x0f, 0xd9, 0xca, ++ 0x0c, 0xfb, 0xe2, 0x50, 0xbf, 0xdd, 0x90, 0x77, 0x99, 0xbf, 0xcb, 0x69, ++ 0xa8, 0x17, 0x06, 0x92, 0x0d, 0xed, 0x87, 0xef, 0x77, 0x19, 0xde, 0x17, ++ 0x07, 0xf3, 0x0c, 0xef, 0x47, 0x1e, 0x75, 0x1b, 0xea, 0xa3, 0xdb, 0xc6, ++ 0x1a, 0xda, 0x5f, 0x71, 0xcc, 0x63, 0xa8, 0x5f, 0xd9, 0x3e, 0xd5, 0xd0, ++ 0xfe, 0xaa, 0x53, 0x5e, 0x43, 0x3d, 0x95, 0x75, 0x3e, 0x06, 0xfc, 0x0e, ++ 0xd6, 0x84, 0x3d, 0x7a, 0xd3, 0xb0, 0x4c, 0x81, 0x27, 0x97, 0x38, 0x7f, ++ 0x50, 0x7e, 0x4f, 0xbc, 0x38, 0x3f, 0x28, 0xed, 0x54, 0xa5, 0x07, 0xab, ++ 0x7c, 0x5c, 0x5d, 0xf2, 0x75, 0xb8, 0x3e, 0x3d, 0xd8, 0xa6, 0x53, 0x7e, ++ 0x6f, 0x63, 0x0a, 0x73, 0xd3, 0x39, 0x00, 0xbb, 0xb4, 0x4f, 0x98, 0x51, ++ 0xcf, 0xd6, 0x65, 0x3e, 0xad, 0xd2, 0x47, 0x99, 0xcf, 0x98, 0x4f, 0xab, ++ 0xf2, 0x68, 0xbb, 0xf5, 0x71, 0xa9, 0x7f, 0x2b, 0x7d, 0x38, 0x24, 0x8f, ++ 0xd6, 0x13, 0x9a, 0x47, 0x5b, 0x2e, 0xcf, 0xf9, 0x86, 0xef, 0x7b, 0xe5, ++ 0x92, 0xee, 0xe1, 0xf0, 0x0f, 0xb6, 0x89, 0xf9, 0x36, 0xde, 0x69, 0xa3, ++ 0x73, 0x0b, 0x0a, 0xae, 0x70, 0x78, 0x4e, 0xcb, 0xfc, 0xce, 0x1d, 0xf6, ++ 0xde, 0xcf, 0x8f, 0xd4, 0x48, 0x3e, 0x7b, 0x35, 0xcb, 0x5b, 0x05, 0x7e, ++ 0x7d, 0x12, 0xe2, 0x29, 0xab, 0xb7, 0xf1, 0xdc, 0xed, 0x3e, 0xce, 0x5f, ++ 0x8d, 0xff, 0x6e, 0x73, 0xaf, 0x73, 0x7d, 0xf7, 0x78, 0xe5, 0xc3, 0xc5, ++ 0x7c, 0xca, 0x4c, 0xa6, 0xf9, 0x33, 0x0a, 0x28, 0x6f, 0x69, 0xee, 0x4b, ++ 0x21, 0xe3, 0xaf, 0x19, 0x26, 0xec, 0xe7, 0x8a, 0x02, 0xad, 0xd7, 0xf9, ++ 0x95, 0xc7, 0x89, 0xbc, 0x22, 0x16, 0x67, 0x73, 0x81, 0x7f, 0xfb, 0x1e, ++ 0x4f, 0xe0, 0x33, 0xd9, 0xc6, 0xd6, 0xd3, 0x39, 0x17, 0x99, 0x77, 0x7e, ++ 0xdb, 0xe6, 0xc0, 0xfd, 0x70, 0x91, 0x97, 0xd9, 0x9a, 0xac, 0xe2, 0xfe, ++ 0x32, 0xbf, 0x15, 0xfc, 0x30, 0x6d, 0x12, 0xd7, 0x9f, 0x8a, 0xe1, 0xb7, ++ 0xfa, 0xf3, 0x43, 0x0e, 0xae, 0x67, 0x3c, 0x59, 0x6f, 0x21, 0x3f, 0x44, ++ 0xe3, 0xb0, 0x92, 0x59, 0xb8, 0x97, 0x52, 0x9d, 0x23, 0x18, 0xcc, 0xed, ++ 0x0b, 0xf0, 0x07, 0x74, 0x15, 0xd8, 0x25, 0x7f, 0xc9, 0x37, 0xd3, 0x38, ++ 0xdb, 0x87, 0x89, 0xf5, 0x5f, 0x6a, 0xfe, 0xba, 0x3b, 0xff, 0x9b, 0xfc, ++ 0xe9, 0x8c, 0xc9, 0xfd, 0x41, 0xd8, 0x2d, 0xbd, 0xf0, 0x1b, 0xf1, 0xa1, ++ 0x9a, 0xc7, 0xbf, 0x3a, 0x0f, 0x3c, 0x1c, 0x4f, 0xca, 0x2e, 0x64, 0x32, ++ 0xef, 0x2e, 0x5b, 0xc2, 0xa5, 0xf0, 0xd7, 0x6d, 0xc7, 0x4b, 0xfc, 0xa9, ++ 0x7c, 0x7c, 0xd7, 0x4a, 0xab, 0xf7, 0x69, 0x07, 0xe5, 0xf5, 0x4f, 0x45, ++ 0x3e, 0x93, 0xa2, 0x5f, 0x54, 0x81, 0xf0, 0x2b, 0xfd, 0x46, 0xe2, 0x03, ++ 0xed, 0x20, 0x8f, 0xfa, 0x6a, 0x57, 0x6a, 0x2e, 0x88, 0x83, 0xbf, 0xb6, ++ 0x8b, 0xb9, 0xe2, 0x9c, 0xdf, 0xe2, 0x8f, 0xfc, 0x57, 0xe1, 0x45, 0xe1, ++ 0xbf, 0xaf, 0xf3, 0x3d, 0x7d, 0xc9, 0x87, 0x4b, 0xe4, 0x42, 0x1f, 0xe7, ++ 0x7d, 0xfa, 0xe2, 0x4f, 0xfa, 0xfb, 0x07, 0xce, 0xfd, 0x84, 0xc8, 0x07, ++ 0x91, 0x5f, 0x22, 0xe9, 0xe1, 0xcf, 0x36, 0x51, 0x3c, 0xf7, 0x9e, 0x18, ++ 0xe3, 0x3a, 0xb6, 0xe6, 0x0b, 0xf9, 0xf0, 0x9c, 0xda, 0x2f, 0x7c, 0xdc, ++ 0x9e, 0x34, 0xca, 0x09, 0x06, 0xff, 0x72, 0xe3, 0x06, 0xb3, 0x94, 0x13, ++ 0x62, 0xdf, 0xc6, 0xfe, 0x89, 0xe7, 0x0b, 0x37, 0x58, 0x49, 0x9f, 0x61, ++ 0xf5, 0x22, 0x1f, 0xb9, 0x5a, 0xca, 0x62, 0xc6, 0xbc, 0x49, 0xe3, 0x46, ++ 0x21, 0x1e, 0x6b, 0xa5, 0xfb, 0xac, 0xae, 0xf1, 0x30, 0xd2, 0x77, 0x16, ++ 0x38, 0x6c, 0xfe, 0x16, 0xde, 0xbe, 0xc2, 0x17, 0xbe, 0x6f, 0x7b, 0xe8, ++ 0x7b, 0x8a, 0xd7, 0xb8, 0x70, 0x6f, 0x89, 0x7b, 0x23, 0xfc, 0xef, 0x95, ++ 0x9b, 0x8c, 0xed, 0x16, 0x3b, 0xc4, 0xbd, 0x5e, 0x0b, 0xc3, 0xec, 0xd2, ++ 0xc5, 0xd2, 0x2e, 0x5d, 0x1c, 0x66, 0x97, 0xfe, 0x97, 0xda, 0x97, 0xdd, ++ 0xcc, 0x4d, 0x7a, 0x99, 0x8c, 0x3f, 0x2b, 0x38, 0xbb, 0xf9, 0xca, 0x9f, ++ 0x45, 0x79, 0xc1, 0xb0, 0x53, 0xcd, 0xc2, 0x5f, 0x42, 0xf9, 0x4a, 0x0a, ++ 0x4f, 0x2e, 0xc4, 0x17, 0x42, 0xee, 0xd1, 0xe4, 0xf8, 0x8c, 0xca, 0xc3, ++ 0xbe, 0xbd, 0xde, 0xd2, 0x6b, 0x1e, 0x59, 0x37, 0x3e, 0xfb, 0x88, 0x93, ++ 0x9f, 0x45, 0x9c, 0xdc, 0x85, 0xf5, 0xdf, 0x45, 0xe7, 0x7f, 0xba, 0xf6, ++ 0x46, 0x8a, 0x38, 0x9a, 0x8a, 0x5f, 0xc8, 0xf6, 0x67, 0x7d, 0x17, 0xe8, ++ 0x3d, 0xda, 0xa3, 0xb7, 0x73, 0xc5, 0x6d, 0x45, 0x88, 0x23, 0x75, 0xc7, ++ 0x3b, 0xc2, 0xe2, 0x26, 0x5d, 0x0e, 0x53, 0xec, 0x58, 0xf4, 0xb7, 0x5b, ++ 0xdc, 0xbf, 0xa0, 0xf2, 0x00, 0x96, 0xfe, 0xcd, 0x5f, 0xe4, 0x0c, 0x89, ++ 0x73, 0xea, 0xed, 0x26, 0x43, 0xde, 0x45, 0x78, 0xa9, 0xaf, 0xdd, 0x47, ++ 0x79, 0x01, 0x2d, 0x16, 0xdd, 0x95, 0xcf, 0xf9, 0xe3, 0x8c, 0xc5, 0x6d, ++ 0xc7, 0x7d, 0x91, 0xf7, 0x3a, 0x0e, 0x26, 0xe1, 0xbc, 0xf6, 0x34, 0xe9, ++ 0xaf, 0x09, 0x87, 0xb7, 0x5b, 0xaf, 0x1a, 0xaf, 0x89, 0x38, 0xa1, 0x4f, ++ 0xe8, 0xb9, 0x5d, 0x53, 0x35, 0xd2, 0x73, 0xb9, 0x5c, 0x64, 0x58, 0x47, ++ 0x2a, 0x9e, 0x3d, 0x83, 0x05, 0xfb, 0xa1, 0x54, 0xf1, 0x03, 0x7d, 0xd3, ++ 0x58, 0xc2, 0xb3, 0x8a, 0x1f, 0x54, 0x04, 0xc7, 0x12, 0x9c, 0xb3, 0x1a, ++ 0x17, 0x5b, 0x71, 0x65, 0x5f, 0xfb, 0x63, 0x6b, 0x4a, 0xa3, 0x5c, 0x3d, ++ 0x71, 0x85, 0xf6, 0x34, 0x91, 0x8f, 0xd2, 0x57, 0x7c, 0x61, 0xe6, 0x45, ++ 0x37, 0xf5, 0x77, 0xf3, 0xc5, 0x71, 0xd4, 0xcf, 0x84, 0xfc, 0x0c, 0xa1, ++ 0x7f, 0xad, 0xbf, 0x7f, 0x25, 0xf8, 0x68, 0xd8, 0x2e, 0x66, 0xc5, 0x3c, ++ 0xdb, 0xc3, 0xf2, 0xb1, 0x55, 0xf9, 0x9f, 0x72, 0x7d, 0xbc, 0x9d, 0xaf, ++ 0xe4, 0xb6, 0xcc, 0x73, 0x59, 0xab, 0x09, 0x3d, 0x5e, 0x63, 0x2a, 0xef, ++ 0x85, 0xe4, 0xb6, 0xaa, 0x5f, 0x68, 0x92, 0xf5, 0x52, 0x51, 0x5f, 0xbd, ++ 0x41, 0xd4, 0xdb, 0xe5, 0x3d, 0x46, 0x3b, 0xa5, 0xbf, 0x01, 0xf3, 0x44, ++ 0x89, 0xf9, 0xc0, 0x2e, 0xde, 0x2d, 0xfd, 0x11, 0x98, 0x07, 0x4a, 0xcc, ++ 0x03, 0xcf, 0x21, 0xa7, 0x50, 0x87, 0x9c, 0x42, 0x1d, 0x72, 0x0a, 0x75, ++ 0xc8, 0x29, 0x94, 0x90, 0x53, 0x78, 0xbe, 0x80, 0x79, 0xd3, 0x8b, 0xcd, ++ 0x22, 0x0e, 0x52, 0x12, 0xb2, 0x6e, 0x10, 0x07, 0x29, 0x09, 0xd1, 0x83, ++ 0x10, 0x07, 0x09, 0xad, 0x23, 0x0e, 0x12, 0xda, 0x1e, 0x71, 0x90, 0xd0, ++ 0xf7, 0x88, 0x83, 0x84, 0xbe, 0x47, 0x1c, 0x24, 0xb4, 0x8e, 0x38, 0x48, ++ 0x68, 0x7b, 0xc4, 0x41, 0x42, 0xeb, 0x6c, 0xec, 0x75, 0x3d, 0x75, 0xc8, ++ 0x35, 0xcf, 0x0c, 0x43, 0x7d, 0x26, 0xd7, 0xf7, 0x4b, 0x42, 0xd6, 0x2d, ++ 0xe2, 0x20, 0xa1, 0xfd, 0x23, 0x0e, 0x62, 0xe8, 0x4f, 0x5f, 0x69, 0xf8, ++ 0xfe, 0x56, 0x56, 0x6f, 0xf8, 0x1e, 0x71, 0x90, 0xd0, 0xf6, 0xf3, 0xeb, ++ 0x35, 0x43, 0x9c, 0x64, 0xbe, 0x3c, 0x97, 0x5e, 0xb9, 0x35, 0x81, 0xf8, ++ 0xe3, 0xda, 0x0c, 0xef, 0x1a, 0xf0, 0xf9, 0x1f, 0xa2, 0xbf, 0xb9, 0xc3, ++ 0x0a, 0x3b, 0xd0, 0xdc, 0xba, 0x84, 0xec, 0xb3, 0xda, 0x28, 0xb7, 0xa0, ++ 0x73, 0xd3, 0x54, 0x41, 0x77, 0x13, 0x13, 0x74, 0xee, 0x9c, 0x47, 0x74, ++ 0x5e, 0x63, 0x13, 0xf5, 0x52, 0x91, 0x17, 0xdb, 0x5b, 0xbc, 0xa1, 0x24, ++ 0x5b, 0xc4, 0x1b, 0x50, 0x22, 0xde, 0x80, 0x12, 0xf1, 0x06, 0x94, 0x88, ++ 0x37, 0xe0, 0x3e, 0x6c, 0xc4, 0x1b, 0x50, 0x22, 0xde, 0x80, 0xe7, 0x88, ++ 0x37, 0xa0, 0x44, 0xbc, 0x01, 0x25, 0xe2, 0x0d, 0x28, 0x11, 0x6f, 0x40, ++ 0x89, 0x78, 0x03, 0x4a, 0xc4, 0x1b, 0xf0, 0x1d, 0xe2, 0x0d, 0x28, 0x11, ++ 0x6f, 0xc0, 0x73, 0xc4, 0x1b, 0x50, 0x22, 0xde, 0x80, 0xe7, 0xc7, 0x11, ++ 0xf7, 0xc8, 0xee, 0x81, 0x0b, 0x7a, 0x7b, 0xb6, 0xc1, 0x7e, 0xe4, 0x7c, ++ 0x68, 0xb0, 0x1f, 0x9d, 0x86, 0x3a, 0xf4, 0xf6, 0xd0, 0xf6, 0xd0, 0xdb, ++ 0x43, 0xdf, 0x43, 0x6f, 0x0f, 0x7d, 0x0f, 0xbd, 0x3d, 0xb4, 0x0e, 0xbd, ++ 0x3d, 0xb4, 0x3d, 0xf4, 0xf6, 0xd0, 0xfa, 0x1b, 0xc3, 0x5c, 0xb4, 0xbe, ++ 0xa0, 0xbf, 0x87, 0x7e, 0x07, 0xfd, 0x3d, 0xb4, 0x5e, 0xd8, 0xe4, 0x7b, ++ 0x13, 0x3e, 0xa6, 0x1b, 0xb6, 0x7d, 0x79, 0x18, 0x65, 0x7b, 0x8c, 0xf6, ++ 0xa4, 0xc6, 0x45, 0xc1, 0xeb, 0xcf, 0x7f, 0x34, 0x0b, 0x71, 0xa1, 0xf6, ++ 0x48, 0x2d, 0x3d, 0x9e, 0x2f, 0x79, 0xab, 0xd6, 0x3e, 0xab, 0x84, 0xeb, ++ 0x67, 0xba, 0xcc, 0x2f, 0x2b, 0x62, 0x9d, 0x74, 0xbf, 0xb3, 0x2e, 0xef, ++ 0xad, 0xd1, 0x83, 0x8c, 0xf2, 0x61, 0x0b, 0xff, 0x9a, 0x2c, 0xe4, 0x82, ++ 0x8c, 0x43, 0xd2, 0x1f, 0xa7, 0x7b, 0xf1, 0x5e, 0x46, 0x76, 0xc0, 0x04, ++ 0x79, 0x7e, 0x50, 0x7d, 0xef, 0x66, 0x4e, 0x33, 0x4a, 0xd5, 0xbe, 0xa7, ++ 0xde, 0x7b, 0xbb, 0xf0, 0xf1, 0x55, 0x3b, 0x92, 0x97, 0x21, 0x70, 0x70, ++ 0x03, 0xb1, 0x18, 0x79, 0x10, 0xc5, 0x6b, 0x1c, 0x23, 0x90, 0xc7, 0xbd, ++ 0xd3, 0xa4, 0x89, 0x3c, 0xc8, 0x75, 0x22, 0x0f, 0x35, 0x9c, 0xaf, 0xbe, ++ 0xca, 0x17, 0x7a, 0xd1, 0x4e, 0xd3, 0x9e, 0x83, 0x51, 0xc8, 0x6b, 0xa9, ++ 0xd0, 0xe8, 0xbe, 0xf8, 0x5c, 0x0b, 0x3b, 0x8a, 0x7b, 0xbc, 0x0b, 0x9b, ++ 0xea, 0x46, 0x40, 0x5f, 0xf8, 0x5d, 0x7e, 0xf7, 0xfd, 0xf2, 0xe3, 0x90, ++ 0x17, 0xa3, 0xe0, 0x56, 0x7e, 0x40, 0x2e, 0x27, 0xe8, 0x5c, 0xd5, 0xf8, ++ 0x4e, 0x66, 0xab, 0x2a, 0xc0, 0x7d, 0x62, 0xcc, 0xb6, 0x10, 0xf2, 0xdd, ++ 0x26, 0xf4, 0x04, 0x7c, 0x07, 0xfb, 0x31, 0xdf, 0xa7, 0x79, 0x9e, 0x0e, ++ 0xe1, 0xef, 0x13, 0xf9, 0x62, 0x7f, 0xd3, 0x7d, 0x2b, 0xc7, 0x55, 0xf1, ++ 0xe7, 0xf9, 0xbb, 0xeb, 0xc6, 0xe1, 0xbc, 0xd6, 0xb4, 0x28, 0xf1, 0xdd, ++ 0x7f, 0x3c, 0x15, 0x4b, 0x78, 0x9c, 0xbe, 0x5e, 0x7b, 0x1a, 0xe7, 0xe2, ++ 0xc6, 0xef, 0x66, 0x1e, 0x9c, 0xbf, 0x3c, 0x2b, 0xe1, 0xce, 0xdf, 0xed, ++ 0xb4, 0x55, 0xd1, 0xb8, 0x4e, 0x3a, 0xe7, 0xa5, 0xfa, 0xad, 0xd8, 0x96, ++ 0x4e, 0xe7, 0xd2, 0x2a, 0x58, 0x7b, 0x49, 0x32, 0xf9, 0xf2, 0x35, 0xba, ++ 0xc7, 0x5c, 0xe1, 0x8d, 0xcf, 0xef, 0x30, 0xe6, 0xc7, 0x45, 0xfc, 0x51, ++ 0x2b, 0xe9, 0xa3, 0xe2, 0xbc, 0x48, 0x94, 0x3c, 0x2f, 0xa2, 0xce, 0x89, ++ 0x64, 0x58, 0xbc, 0x2f, 0xc2, 0x1e, 0x51, 0xe7, 0x45, 0xae, 0x1e, 0x15, ++ 0x5f, 0x8a, 0x7c, 0x2d, 0xd6, 0x2a, 0xee, 0xdd, 0xbb, 0x61, 0x54, 0xc5, ++ 0x86, 0xfe, 0xbc, 0x7f, 0xdd, 0x2f, 0xee, 0xdd, 0xbb, 0xfa, 0x4f, 0x75, ++ 0x6f, 0x52, 0x7d, 0xbb, 0xb8, 0x77, 0x8f, 0xd8, 0x60, 0x0c, 0x8d, 0x43, ++ 0xfb, 0xda, 0x10, 0x9f, 0x46, 0xf7, 0x3d, 0x4c, 0xf7, 0xb5, 0x98, 0xfa, ++ 0xb9, 0x70, 0x7e, 0x74, 0xad, 0x35, 0x09, 0xed, 0x77, 0x33, 0x37, 0xd4, ++ 0x9f, 0x21, 0x4c, 0x9c, 0x83, 0x54, 0xf0, 0x15, 0xb0, 0x36, 0x13, 0xee, ++ 0x1d, 0xe7, 0x5b, 0xcc, 0xa1, 0xc4, 0x10, 0x3e, 0xe2, 0x12, 0xe0, 0x66, ++ 0xd0, 0xbd, 0xd8, 0x6d, 0xa5, 0xfb, 0x20, 0x66, 0x58, 0x9c, 0x56, 0xc8, ++ 0x8d, 0xf0, 0x7d, 0xfc, 0xd2, 0x7c, 0xba, 0x30, 0x3d, 0x21, 0x2c, 0x1f, ++ 0xa2, 0x71, 0xcd, 0xb1, 0x74, 0x73, 0x26, 0xfc, 0x49, 0x26, 0x77, 0x10, ++ 0x72, 0x6b, 0x5f, 0x34, 0xe9, 0x0b, 0x4a, 0xdf, 0xa9, 0x90, 0x79, 0x50, ++ 0x17, 0xd6, 0xbf, 0x49, 0xf7, 0x59, 0x57, 0xec, 0x11, 0xfa, 0x81, 0xce, ++ 0xe5, 0x00, 0xe4, 0x9f, 0xca, 0x8f, 0xa8, 0xcd, 0xf2, 0xa7, 0x9b, 0xa0, ++ 0x2f, 0x0c, 0x6c, 0x29, 0x4a, 0x30, 0x8b, 0xfd, 0xbf, 0x00, 0xe7, 0x91, ++ 0x7c, 0x2f, 0xcf, 0x1e, 0xeb, 0xc2, 0x39, 0xc6, 0x37, 0x29, 0x5f, 0xbf, ++ 0x62, 0xc3, 0xe8, 0x38, 0x71, 0x5e, 0x47, 0xc4, 0x1f, 0xaa, 0x24, 0x9e, ++ 0xaa, 0x64, 0xfe, 0x0b, 0x2b, 0x70, 0x26, 0x41, 0xef, 0x54, 0xf7, 0x98, ++ 0x96, 0x9a, 0xc7, 0xc7, 0xd1, 0x79, 0xb7, 0x26, 0xa1, 0xcf, 0x29, 0xff, ++ 0x4e, 0xc5, 0x3b, 0x23, 0x8f, 0x80, 0xce, 0x15, 0x4f, 0xc8, 0xfb, 0x40, ++ 0x36, 0x55, 0xd0, 0x39, 0xa0, 0xf0, 0x3c, 0x14, 0xa5, 0x1f, 0xaa, 0xfb, ++ 0x4e, 0x96, 0xac, 0xb7, 0x52, 0x7e, 0xcb, 0x92, 0x30, 0x3d, 0x70, 0x99, ++ 0xd4, 0x03, 0x97, 0x85, 0xe9, 0x81, 0x63, 0x0b, 0xc2, 0xf4, 0x40, 0x75, ++ 0x3f, 0x9d, 0x6c, 0x53, 0xf1, 0xce, 0xa1, 0x59, 0xa4, 0xa7, 0xd4, 0x89, ++ 0xfb, 0xf8, 0xca, 0xd6, 0x0a, 0xbd, 0x85, 0xed, 0x11, 0xf7, 0xd8, 0x97, ++ 0xad, 0x9d, 0x6c, 0xc2, 0xbd, 0x15, 0x65, 0xfb, 0x3c, 0x6e, 0xad, 0x17, ++ 0xfe, 0x78, 0x4f, 0xea, 0x2f, 0xd3, 0x30, 0x68, 0x22, 0xf2, 0x7c, 0x06, ++ 0x52, 0x39, 0xfb, 0x62, 0x32, 0x95, 0x73, 0x2e, 0xe6, 0x91, 0x1c, 0xc0, ++ 0x59, 0x0c, 0xd0, 0xbf, 0xfd, 0x35, 0x46, 0xfa, 0xf4, 0xfb, 0x52, 0x5f, ++ 0x99, 0x85, 0x3c, 0x3f, 0x9c, 0x8f, 0xf3, 0x45, 0xc8, 0x7c, 0x3e, 0x46, ++ 0xfa, 0x52, 0x31, 0x73, 0x96, 0x42, 0x6e, 0x0c, 0xf3, 0x68, 0x87, 0xe0, ++ 0xbe, 0x9e, 0x66, 0xd5, 0x37, 0x20, 0x8f, 0x70, 0x5a, 0x0b, 0xa3, 0xf3, ++ 0x30, 0x37, 0x40, 0xaf, 0xe1, 0x2f, 0xe6, 0x42, 0xcf, 0x19, 0x09, 0x3e, ++ 0xcf, 0x28, 0xa5, 0x73, 0x01, 0x53, 0x35, 0x3a, 0x5f, 0x71, 0xc3, 0xa8, ++ 0x95, 0x92, 0xaf, 0x39, 0x9f, 0x33, 0xf0, 0xb9, 0x4f, 0xf2, 0xad, 0x97, ++ 0xea, 0xdd, 0xfb, 0x81, 0xe4, 0x6f, 0xdd, 0xd7, 0x61, 0xa1, 0x7b, 0x59, ++ 0x7d, 0x9a, 0x0d, 0xf7, 0xb2, 0xe9, 0xd2, 0x9e, 0x55, 0xfc, 0x1b, 0xce, ++ 0xe7, 0xe5, 0xf2, 0xf7, 0x26, 0x98, 0x43, 0xf8, 0x99, 0xba, 0xfd, 0x0e, ++ 0x00, 0x96, 0x2e, 0x57, 0x19, 0x3d, 0x1b, 0xf9, 0x96, 0xe5, 0xf0, 0x0d, ++ 0x0e, 0x94, 0x84, 0xe4, 0x28, 0x8a, 0x29, 0x10, 0xef, 0x57, 0x15, 0x8c, ++ 0x9e, 0xbd, 0x1e, 0x39, 0xd6, 0xff, 0x97, 0xfe, 0x89, 0x32, 0xf5, 0x3b, ++ 0x0c, 0x5c, 0xcf, 0x82, 0x3c, 0xbd, 0xed, 0xf6, 0x62, 0xdb, 0x82, 0x10, ++ 0xb9, 0x32, 0xa1, 0x68, 0xd2, 0x96, 0xc2, 0xfe, 0x3d, 0x74, 0x5f, 0xd0, ++ 0x7d, 0x6e, 0xac, 0x60, 0x00, 0xf4, 0xff, 0x55, 0xf7, 0xe6, 0x0c, 0xf8, ++ 0xb6, 0xf3, 0x8b, 0x95, 0x1c, 0xcf, 0x58, 0x1f, 0xe5, 0x71, 0xed, 0x77, ++ 0xe0, 0x66, 0xdc, 0x1f, 0x15, 0x30, 0x4f, 0xc9, 0x58, 0xdc, 0xc7, 0xac, ++ 0xe6, 0xc9, 0x82, 0xc8, 0x57, 0xbb, 0x45, 0xd6, 0x7f, 0x56, 0x50, 0xfe, ++ 0x9b, 0x4d, 0x0e, 0xc2, 0x0f, 0xd5, 0x1f, 0xd8, 0x3d, 0x79, 0xb6, 0x8f, ++ 0xd6, 0x8b, 0x90, 0x57, 0xb7, 0x42, 0x5e, 0x99, 0x21, 0xa7, 0xf4, 0xcd, ++ 0x05, 0x24, 0xa7, 0xda, 0xa7, 0x80, 0x1e, 0xd1, 0x05, 0x9d, 0xf2, 0x3c, ++ 0xbc, 0x3c, 0xc7, 0x1a, 0xe6, 0x8f, 0xf8, 0x59, 0x81, 0xa0, 0x43, 0xb8, ++ 0x5f, 0xa2, 0xb2, 0x40, 0xc8, 0x71, 0x66, 0x71, 0xa5, 0xdf, 0x4a, 0xe7, ++ 0x54, 0x5d, 0xe4, 0xd7, 0x53, 0xf0, 0x7f, 0x6a, 0x35, 0x9e, 0x1b, 0x54, ++ 0xe5, 0xab, 0xd2, 0xbe, 0xfe, 0x57, 0xe5, 0xdb, 0x77, 0x25, 0xe9, 0xbb, ++ 0x20, 0x3f, 0x1e, 0x31, 0x89, 0xf3, 0xdb, 0x03, 0xcd, 0x4d, 0x4c, 0xfa, ++ 0x87, 0xc4, 0xef, 0x64, 0xc8, 0xf5, 0xc3, 0xe4, 0x7d, 0x06, 0x3d, 0xf4, ++ 0xe7, 0x52, 0x03, 0xf4, 0xbf, 0x57, 0x73, 0x86, 0xd2, 0x5f, 0xdf, 0xa4, ++ 0x89, 0x73, 0xd3, 0x7d, 0xf8, 0x71, 0x58, 0x5e, 0xe7, 0x63, 0x3b, 0xe0, ++ 0xc7, 0x6b, 0x10, 0xbf, 0xcf, 0xf1, 0x54, 0xae, 0xe0, 0xa3, 0xa7, 0xee, ++ 0xb2, 0x91, 0xfe, 0x5d, 0x66, 0x6b, 0x7b, 0x13, 0xf7, 0x34, 0x29, 0x3c, ++ 0x7e, 0x5c, 0xff, 0x23, 0x2b, 0xdd, 0xf7, 0xc7, 0x82, 0x39, 0xb8, 0x7f, ++ 0xea, 0x96, 0xba, 0x48, 0xba, 0xef, 0x75, 0x42, 0x91, 0xf7, 0x0d, 0xd0, ++ 0x25, 0xba, 0xc0, 0x4d, 0xf4, 0xd8, 0x52, 0x28, 0xf8, 0xec, 0xf7, 0x4e, ++ 0xef, 0x01, 0xa2, 0xd7, 0xe6, 0x03, 0x4f, 0xe2, 0xfc, 0xf8, 0x8a, 0xd6, ++ 0x0c, 0x3a, 0xd7, 0x58, 0xb1, 0xbf, 0x78, 0x23, 0xee, 0xb5, 0x98, 0x50, ++ 0xa4, 0x1f, 0xc1, 0xfb, 0x0a, 0x87, 0xd3, 0x86, 0xfd, 0x7b, 0xf9, 0xfa, ++ 0x78, 0xda, 0xcf, 0xca, 0x07, 0xc8, 0xf3, 0x85, 0xac, 0x93, 0xe2, 0x54, ++ 0x0a, 0xff, 0xc7, 0x0b, 0xc4, 0x3e, 0xda, 0x5c, 0xc4, 0xe4, 0x3d, 0xa7, ++ 0x32, 0xbf, 0x9e, 0x0b, 0xca, 0x19, 0x86, 0x76, 0x32, 0xaf, 0x38, 0x6c, ++ 0x9d, 0x28, 0xff, 0x60, 0xb8, 0x9f, 0x21, 0xfc, 0x3e, 0x81, 0xbe, 0xd6, ++ 0x8f, 0xf2, 0x27, 0xc0, 0x7f, 0x60, 0x0b, 0xf1, 0x2f, 0x2a, 0xff, 0x84, ++ 0x35, 0xef, 0xd3, 0x79, 0xd8, 0x3f, 0xcb, 0x6c, 0xc6, 0xf3, 0x70, 0xaa, ++ 0x8c, 0x2b, 0x94, 0xfe, 0x37, 0x69, 0x07, 0x2e, 0xec, 0xde, 0xbf, 0x0a, ++ 0xa6, 0x0c, 0x80, 0xbe, 0xbc, 0x45, 0xa3, 0xdf, 0xad, 0xa9, 0x72, 0xb8, ++ 0xe6, 0x5c, 0xc9, 0xeb, 0x55, 0x47, 0xad, 0xc8, 0x14, 0x64, 0xd3, 0x12, ++ 0x5c, 0xe2, 0x1e, 0x89, 0x7b, 0xc5, 0x3d, 0x12, 0x0b, 0xf8, 0x7a, 0x85, ++ 0xbc, 0x29, 0x93, 0x79, 0x43, 0x55, 0x5b, 0xc7, 0xd2, 0x7a, 0xab, 0xf2, ++ 0xf3, 0x32, 0xb1, 0xef, 0x75, 0x79, 0xeb, 0x96, 0x43, 0x69, 0xaf, 0x81, ++ 0x7f, 0x82, 0x1e, 0x3a, 0x27, 0x5e, 0xe5, 0xf4, 0xd8, 0x12, 0x42, 0xd6, ++ 0x7d, 0x65, 0x93, 0x66, 0x38, 0x67, 0xde, 0x5d, 0x2f, 0x10, 0xe7, 0xd8, ++ 0xcb, 0x70, 0x85, 0xf9, 0x08, 0xc8, 0x8b, 0x0c, 0x1b, 0xee, 0x72, 0x29, ++ 0xe3, 0x6a, 0x05, 0xf2, 0xd0, 0xe2, 0x0a, 0x5d, 0x86, 0xb8, 0x2b, 0x6f, ++ 0x47, 0x79, 0x0c, 0xd3, 0x32, 0xd9, 0x11, 0x71, 0x8f, 0x0f, 0x87, 0x3b, ++ 0x43, 0x8c, 0x37, 0x22, 0xa4, 0xff, 0x05, 0x4d, 0xc6, 0xf3, 0xf2, 0xbc, ++ 0x3d, 0xe9, 0x43, 0x91, 0x85, 0x31, 0xc2, 0x5f, 0xe9, 0xe4, 0xf3, 0x86, ++ 0xff, 0xc3, 0xe9, 0x24, 0x38, 0x39, 0x1e, 0x08, 0x4f, 0x9d, 0xf7, 0xf3, ++ 0xfe, 0x5c, 0x34, 0x0e, 0xd1, 0xa3, 0x32, 0xe8, 0xb7, 0xc2, 0xde, 0x2e, ++ 0x43, 0xfe, 0x04, 0xaf, 0xdf, 0xe2, 0xf4, 0x5b, 0x31, 0xce, 0x82, 0xf5, ++ 0xe2, 0xde, 0x0a, 0x7d, 0xb3, 0x18, 0x47, 0xdf, 0x14, 0x6f, 0x2b, 0x84, ++ 0xbe, 0x64, 0x71, 0xda, 0xd2, 0x80, 0x3f, 0x79, 0xaf, 0x3d, 0x87, 0x8f, ++ 0xe4, 0x60, 0x15, 0xc7, 0x0b, 0xce, 0xff, 0xa8, 0x73, 0x80, 0xe1, 0xf8, ++ 0xa9, 0x90, 0xf0, 0x56, 0x35, 0xc5, 0x1b, 0xf5, 0xb0, 0xa6, 0x2d, 0x56, ++ 0xd0, 0x63, 0x5e, 0x1f, 0xe7, 0xe7, 0xaf, 0x2a, 0x14, 0x7c, 0xbb, 0x60, ++ 0xfd, 0x44, 0x3a, 0xff, 0x5c, 0x65, 0xf1, 0x50, 0x7e, 0xbd, 0x2e, 0xf1, ++ 0xfb, 0xc7, 0x95, 0x91, 0xf7, 0x21, 0x3e, 0x30, 0xaf, 0xf9, 0x51, 0x6b, ++ 0x06, 0xf4, 0xc3, 0x42, 0x61, 0x47, 0x5f, 0x55, 0x28, 0xf8, 0x6b, 0x5a, ++ 0x66, 0x30, 0x87, 0xee, 0xa7, 0x59, 0x19, 0xe9, 0x06, 0x9c, 0xf3, 0x9c, ++ 0x4d, 0x34, 0xbf, 0x6e, 0xfc, 0x3e, 0xcc, 0xf1, 0xa1, 0xe1, 0x1e, 0x14, ++ 0x2f, 0xe1, 0x97, 0xf3, 0x85, 0x0f, 0x79, 0x64, 0x55, 0xcd, 0x46, 0x7a, ++ 0xf6, 0xc0, 0x13, 0x23, 0xee, 0x99, 0x6e, 0xae, 0xa0, 0xf5, 0xb6, 0xc8, ++ 0xa2, 0xdb, 0x9c, 0xa1, 0x70, 0x6c, 0x3d, 0x90, 0x83, 0x73, 0x3d, 0xf3, ++ 0xf8, 0xfa, 0xc6, 0xbd, 0x3b, 0xcc, 0xa9, 0xd3, 0x79, 0x9b, 0xcf, 0x1e, ++ 0x9e, 0x93, 0x4e, 0xf3, 0xe4, 0x70, 0x02, 0xaf, 0x31, 0x6e, 0xd7, 0x14, ++ 0xdc, 0x37, 0xc3, 0xf9, 0x84, 0xf8, 0x58, 0xf1, 0x8b, 0x3a, 0x1f, 0xac, ++ 0xc6, 0x9b, 0x59, 0x68, 0xa1, 0xf9, 0xcc, 0x2c, 0xec, 0xdd, 0xbf, 0xde, ++ 0xb3, 0x2e, 0x3d, 0xa4, 0xdf, 0x34, 0x72, 0xfa, 0xc2, 0xef, 0xdd, 0xd7, ++ 0xba, 0xb4, 0xe1, 0xa0, 0x11, 0x1f, 0xd7, 0x56, 0x25, 0xee, 0x01, 0x0b, ++ 0x5f, 0xa7, 0x6a, 0x7d, 0xaa, 0x75, 0xa9, 0xd6, 0xa9, 0x5a, 0xbf, 0x4f, ++ 0x5a, 0xbd, 0xc1, 0x64, 0xad, 0x47, 0xce, 0xf0, 0xfd, 0xb6, 0xee, 0xa5, ++ 0x5e, 0xf0, 0xb4, 0xa5, 0x50, 0xc8, 0x91, 0x5b, 0x24, 0x5d, 0x39, 0x5e, ++ 0x0f, 0x87, 0x9e, 0x2b, 0xba, 0x4b, 0xd2, 0xb5, 0x2c, 0xd3, 0xb8, 0xde, ++ 0xd1, 0x1f, 0xfa, 0xad, 0x56, 0xef, 0x27, 0x05, 0x73, 0x70, 0x0e, 0x50, ++ 0xb5, 0x57, 0xe3, 0x96, 0x25, 0x88, 0xef, 0xc0, 0xf7, 0xe0, 0xb7, 0x6a, ++ 0x39, 0x1e, 0xda, 0xaf, 0xa2, 0xf6, 0xc6, 0xf3, 0x11, 0x95, 0xdd, 0xf2, ++ 0x62, 0xf7, 0x86, 0x24, 0xc8, 0x8b, 0x3d, 0x1a, 0xe9, 0xbb, 0xab, 0xee, ++ 0x3f, 0x94, 0xf6, 0x7d, 0xe8, 0xb1, 0x2f, 0x08, 0x3d, 0xf6, 0x4c, 0xcd, ++ 0x8e, 0xe5, 0x29, 0xf0, 0x1b, 0x58, 0xfc, 0xe9, 0xa1, 0xf7, 0x33, 0x55, ++ 0x05, 0x85, 0x7c, 0x58, 0xc8, 0xf5, 0x1f, 0xc8, 0x8b, 0x45, 0x72, 0x9f, ++ 0x1e, 0x9d, 0xa3, 0x7f, 0xbf, 0x30, 0x64, 0xfd, 0x56, 0x3d, 0xf4, 0x42, ++ 0xae, 0x2e, 0xe4, 0x4b, 0x10, 0xf2, 0xe5, 0x93, 0x17, 0x7e, 0xfa, 0xe1, ++ 0x38, 0x57, 0xcf, 0xfe, 0xa9, 0xe0, 0x5f, 0xb0, 0xe9, 0x57, 0xd6, 0x0a, ++ 0x47, 0x28, 0xbe, 0x34, 0x79, 0x1f, 0x45, 0x17, 0x9d, 0xfb, 0xaa, 0x74, ++ 0xd8, 0x5c, 0xc8, 0xb3, 0xad, 0x5c, 0x5f, 0x41, 0xf2, 0x96, 0x25, 0x73, ++ 0x7b, 0x42, 0x0b, 0xc9, 0x93, 0x0a, 0xe3, 0x83, 0x8a, 0xf5, 0x1a, 0xdd, ++ 0x9b, 0x55, 0x59, 0x3f, 0xc6, 0x6f, 0xfe, 0x5f, 0x94, 0xcb, 0x95, 0x9b, ++ 0x67, 0xd0, 0xdd, 0x3c, 0x8a, 0x4e, 0xea, 0xfe, 0x0d, 0xb5, 0x9f, 0x2a, ++ 0xf8, 0x1f, 0x97, 0xf2, 0xf9, 0x16, 0xc9, 0xc7, 0x4f, 0xc8, 0xf5, 0x77, ++ 0x4b, 0x75, 0x86, 0x6d, 0x11, 0xad, 0xfb, 0x0c, 0x5b, 0x25, 0xf8, 0x5f, ++ 0xbe, 0x9f, 0x57, 0x65, 0x7c, 0xde, 0x4d, 0xa7, 0xee, 0x38, 0x76, 0xc1, ++ 0xc6, 0x64, 0x79, 0x8e, 0x85, 0xec, 0x92, 0xcd, 0x56, 0xe1, 0xdf, 0xdb, ++ 0x1d, 0x43, 0xfa, 0xea, 0x99, 0x55, 0xaf, 0xbe, 0x3b, 0x9b, 0xb7, 0xfb, ++ 0xe2, 0x91, 0x96, 0x74, 0xe8, 0x27, 0x0a, 0x8e, 0xc5, 0xd2, 0x8f, 0xb7, ++ 0x50, 0xfa, 0xe3, 0x16, 0x49, 0xbd, 0x95, 0xd3, 0x69, 0x77, 0x28, 0x9d, ++ 0x16, 0x3f, 0x25, 0xe8, 0x54, 0xf9, 0xe2, 0x3b, 0xbf, 0xc7, 0xfd, 0x50, ++ 0x65, 0x99, 0x52, 0x9e, 0xdd, 0x2f, 0xce, 0x97, 0x2f, 0x08, 0xec, 0x21, ++ 0xba, 0xcd, 0xdb, 0xb4, 0xc5, 0x9a, 0xc1, 0xdb, 0xb5, 0x16, 0x66, 0x18, ++ 0xe4, 0x74, 0x65, 0x5d, 0xb1, 0x13, 0xfe, 0xe9, 0x5b, 0x36, 0xb5, 0x58, ++ 0x21, 0x07, 0x5a, 0xd5, 0x7c, 0xc3, 0xf8, 0xbd, 0x4c, 0xe6, 0xa5, 0x2a, ++ 0xbc, 0x62, 0xdf, 0xd1, 0x42, 0xe2, 0x17, 0xaa, 0x3d, 0xe4, 0xdf, 0x1e, ++ 0x3e, 0xce, 0xed, 0x2b, 0x23, 0x63, 0x91, 0xe7, 0xa2, 0xc6, 0xf9, 0xa3, ++ 0xe4, 0xe3, 0xca, 0xba, 0xf8, 0x04, 0x8c, 0x57, 0x59, 0x57, 0xf1, 0x00, ++ 0xec, 0x1e, 0x25, 0xef, 0xc3, 0xd7, 0xdd, 0x89, 0x48, 0xb1, 0x1e, 0x16, ++ 0xf0, 0xfe, 0xb0, 0x2e, 0x4f, 0x4c, 0x74, 0xd3, 0x39, 0xdb, 0x32, 0xf9, ++ 0xfb, 0x52, 0xe1, 0xed, 0x3f, 0x91, 0x7c, 0xf7, 0x63, 0xab, 0xb8, 0x47, ++ 0x30, 0x35, 0x3a, 0xf0, 0x2c, 0xe5, 0x2d, 0xac, 0x88, 0x72, 0x43, 0x3e, ++ 0x64, 0x67, 0xb7, 0xfb, 0x31, 0x2e, 0xf8, 0x19, 0x70, 0xdb, 0x4c, 0xe2, ++ 0xde, 0xc1, 0xec, 0x9a, 0xf6, 0xaf, 0x00, 0x07, 0x57, 0x8b, 0x29, 0x3f, ++ 0x05, 0x25, 0xee, 0x3b, 0x82, 0x9a, 0x9c, 0xc4, 0xeb, 0x4f, 0x9b, 0xc4, ++ 0x79, 0xa0, 0x4c, 0xb3, 0x28, 0x4d, 0x45, 0x62, 0xfe, 0x70, 0x4d, 0xe1, ++ 0x3d, 0xeb, 0xd7, 0x4e, 0xf7, 0x9f, 0x85, 0xe4, 0x67, 0x1a, 0xf8, 0xd5, ++ 0xc6, 0xb6, 0x6f, 0xc2, 0xfd, 0x2b, 0xb6, 0x7e, 0x8c, 0x7e, 0xef, 0x45, ++ 0xf1, 0xa7, 0xea, 0x47, 0xf1, 0xa7, 0xe2, 0xdf, 0xbe, 0xe6, 0xf7, 0x37, ++ 0xc9, 0x97, 0xdf, 0x35, 0xbf, 0x13, 0x19, 0xd2, 0x0f, 0x91, 0xe7, 0x4e, ++ 0xc7, 0x39, 0x8a, 0xf2, 0x07, 0x87, 0xd0, 0xfd, 0xfc, 0xdf, 0x35, 0x4f, ++ 0x9b, 0xbc, 0x07, 0xaf, 0x7b, 0xbe, 0x11, 0xe2, 0x77, 0x0b, 0x2e, 0x99, ++ 0x6f, 0xb6, 0xb0, 0x5b, 0xfa, 0x9e, 0x6f, 0x73, 0x69, 0x52, 0x2f, 0xf3, ++ 0x0d, 0x9f, 0xa7, 0x5a, 0x27, 0x2a, 0xf7, 0xba, 0x3b, 0xae, 0xd0, 0x24, ++ 0xe2, 0x0a, 0x27, 0x34, 0xbe, 0x7f, 0xf1, 0xef, 0x4e, 0xac, 0x8c, 0xa4, ++ 0xbc, 0x2f, 0x35, 0x2f, 0xe5, 0xf7, 0xbe, 0xdc, 0x7c, 0xf9, 0xf4, 0xa2, ++ 0x04, 0x19, 0x57, 0x68, 0x8f, 0x81, 0x1e, 0x59, 0x26, 0x7f, 0x0f, 0x82, ++ 0x05, 0x45, 0x1d, 0xcf, 0x67, 0x84, 0x3c, 0x57, 0xfb, 0xbe, 0xba, 0x37, ++ 0x4c, 0xc9, 0xe7, 0x93, 0x75, 0x72, 0x5f, 0x64, 0xed, 0xf7, 0x63, 0x3d, ++ 0xb3, 0xfa, 0x2c, 0xba, 0x27, 0xe3, 0x78, 0xd3, 0x89, 0x18, 0xdc, 0xdf, ++ 0x71, 0x62, 0xa2, 0x80, 0x4f, 0x7d, 0x77, 0xbb, 0x55, 0x9c, 0x7b, 0x65, ++ 0x31, 0x36, 0x17, 0xee, 0x4f, 0xe4, 0xf6, 0x15, 0xfd, 0xee, 0xc3, 0xc2, ++ 0xf5, 0x03, 0xc8, 0x8e, 0xbc, 0xad, 0x3e, 0x8b, 0xe4, 0xc2, 0x6d, 0xbe, ++ 0x78, 0xe1, 0x77, 0x90, 0xfa, 0xfd, 0x22, 0x29, 0x07, 0xa3, 0x6f, 0xaf, ++ 0xd8, 0x78, 0x05, 0xda, 0x6f, 0xcd, 0x70, 0x6a, 0x7c, 0x9c, 0x85, 0x0e, ++ 0xf7, 0x67, 0x5b, 0xe9, 0xfb, 0x7c, 0x37, 0xf4, 0xc1, 0xe8, 0xe6, 0x19, ++ 0xb6, 0x4c, 0xd2, 0x7b, 0x85, 0x1d, 0xa0, 0xe2, 0x40, 0xb7, 0x6b, 0xcc, ++ 0x4b, 0xe7, 0x99, 0x20, 0x27, 0xb1, 0xbe, 0x4c, 0x07, 0xb2, 0xb1, 0xef, ++ 0x2c, 0xde, 0x2a, 0xec, 0x80, 0x69, 0x26, 0xb6, 0x09, 0xf1, 0xc2, 0xc1, ++ 0x8d, 0xde, 0x29, 0x29, 0x90, 0x13, 0x8f, 0x89, 0x7b, 0x23, 0xd9, 0x36, ++ 0xe3, 0xbd, 0x4a, 0x81, 0x1c, 0xef, 0x95, 0x45, 0xc0, 0x5b, 0xd8, 0x7d, ++ 0x64, 0xb7, 0x5b, 0x03, 0x9e, 0x01, 0x90, 0xe3, 0x5c, 0xdf, 0x80, 0x9f, ++ 0x69, 0xa1, 0xc3, 0x4b, 0x7a, 0xfb, 0x7e, 0xa9, 0xff, 0x1d, 0x6f, 0xee, ++ 0xa0, 0xfb, 0xc9, 0x15, 0x5e, 0x2f, 0x39, 0xa7, 0x62, 0x13, 0xe7, 0x52, ++ 0x3b, 0x63, 0x4c, 0xe4, 0x7f, 0xbb, 0xdc, 0xf3, 0x2a, 0x55, 0x32, 0x9e, ++ 0xa4, 0xf8, 0x46, 0xc5, 0xa3, 0x1e, 0xc7, 0x7f, 0xae, 0x04, 0x9e, 0x4c, ++ 0xb4, 0xaf, 0x95, 0x9a, 0xcb, 0xe8, 0x5e, 0x9f, 0x8d, 0xcd, 0x93, 0xa9, ++ 0xac, 0xda, 0x52, 0xfa, 0x88, 0xaf, 0x10, 0xe7, 0x61, 0xbd, 0x49, 0xe3, ++ 0x08, 0x6e, 0x2b, 0xf9, 0xc7, 0xaa, 0x6a, 0x27, 0x8b, 0xf3, 0xa3, 0x4f, ++ 0x47, 0xc4, 0xc3, 0xbe, 0x49, 0xb7, 0xfa, 0xd2, 0x43, 0xf5, 0xd2, 0xaa, ++ 0x96, 0x7b, 0xe8, 0x9c, 0xca, 0xa9, 0x96, 0x48, 0x3a, 0xa7, 0x52, 0xe2, ++ 0x9c, 0x51, 0x12, 0xdf, 0x8f, 0xee, 0xdb, 0xa5, 0x73, 0x5f, 0xaa, 0xdd, ++ 0x92, 0x22, 0xb1, 0x2e, 0x97, 0xd6, 0x4e, 0x36, 0x9c, 0x33, 0x59, 0xc8, ++ 0xfb, 0x44, 0x1e, 0xec, 0x9f, 0x03, 0xd1, 0x94, 0x57, 0xaa, 0xce, 0x8f, ++ 0xdc, 0x1d, 0xa5, 0x57, 0x15, 0xf5, 0x17, 0xe7, 0x48, 0xae, 0x74, 0x89, ++ 0xf3, 0x23, 0x29, 0xd4, 0xde, 0xd5, 0xab, 0x3f, 0x5c, 0x95, 0x9f, 0x35, ++ 0x88, 0xf3, 0x08, 0x21, 0xe7, 0x62, 0xa6, 0xcf, 0xe3, 0xdf, 0xd7, 0xd4, ++ 0xbe, 0x1c, 0x8b, 0x7e, 0x96, 0x3d, 0xfc, 0xfe, 0x18, 0x8e, 0x19, 0xf8, ++ 0x9f, 0xea, 0xd0, 0x7f, 0xf7, 0xb9, 0x98, 0xad, 0xe2, 0x5c, 0xcc, 0x4a, ++ 0xd8, 0x4b, 0xd0, 0x23, 0x13, 0xbc, 0xb3, 0xe7, 0x01, 0xff, 0xbf, 0x30, ++ 0x13, 0xfe, 0xfb, 0x1a, 0xaf, 0x1a, 0x3f, 0x4a, 0x12, 0x62, 0x47, 0xdc, ++ 0xe6, 0x8f, 0x23, 0xbd, 0x55, 0x0f, 0x32, 0x1b, 0xe2, 0xc9, 0xba, 0x93, ++ 0x91, 0x5e, 0x7c, 0xca, 0xcc, 0xea, 0xa1, 0x07, 0x28, 0xfd, 0x45, 0x3d, ++ 0x5f, 0x2f, 0xf1, 0x72, 0x2a, 0xae, 0x29, 0x1d, 0xfc, 0xb1, 0x64, 0xe7, ++ 0xa3, 0xe9, 0xd8, 0x5f, 0x4e, 0xc7, 0x88, 0x7a, 0xd9, 0xce, 0x39, 0xbf, ++ 0x84, 0xbc, 0xd2, 0xb7, 0x47, 0x08, 0xfd, 0xdc, 0xc2, 0x48, 0x1f, 0xae, ++ 0xf4, 0x09, 0xfd, 0x9a, 0x55, 0x27, 0xa8, 0x7b, 0x31, 0x23, 0xcb, 0x39, ++ 0x1f, 0x3d, 0x50, 0x14, 0x2d, 0xee, 0xe1, 0x91, 0xe7, 0x67, 0x14, 0x5c, ++ 0xea, 0xbe, 0xd5, 0xd3, 0x16, 0x71, 0x5f, 0x0c, 0xce, 0xc5, 0x80, 0xdf, ++ 0x3f, 0xb6, 0x04, 0x17, 0x82, 0xbe, 0x1f, 0x73, 0xfd, 0x95, 0xee, 0x03, ++ 0x2a, 0x12, 0xfc, 0xf9, 0x71, 0x93, 0x99, 0x7e, 0x77, 0xc4, 0xc7, 0x17, ++ 0x0a, 0xf4, 0x90, 0x8f, 0x9b, 0x5e, 0x8e, 0xc1, 0xf9, 0x5c, 0xa5, 0xaf, ++ 0x95, 0x9a, 0x3f, 0xf1, 0xe0, 0x3e, 0x9a, 0x55, 0xfb, 0xc4, 0x39, 0x55, ++ 0xdc, 0x6b, 0x4e, 0x77, 0x56, 0x4a, 0x3f, 0xc8, 0x72, 0xe9, 0x07, 0x59, ++ 0xf5, 0x9a, 0x75, 0x0a, 0x7e, 0x77, 0x84, 0xeb, 0x5f, 0xf4, 0xa4, 0xc6, ++ 0x12, 0xb4, 0xf5, 0x46, 0xbf, 0xa5, 0x52, 0xbf, 0xea, 0xae, 0xef, 0xdd, ++ 0x43, 0x76, 0x5b, 0xcd, 0x6e, 0xa1, 0x3f, 0xd4, 0x04, 0x3a, 0x48, 0x7f, ++ 0x50, 0xfa, 0x88, 0x3a, 0x17, 0xb7, 0x6c, 0x77, 0x07, 0xe9, 0x13, 0xea, ++ 0xbb, 0xe5, 0x7b, 0x05, 0x5e, 0x6a, 0xf7, 0x8a, 0xe7, 0x15, 0xc8, 0x5b, ++ 0x97, 0xbf, 0x17, 0xaa, 0x65, 0xc3, 0x9e, 0xd6, 0xa8, 0xfe, 0x56, 0xc1, ++ 0xbc, 0x39, 0x6b, 0x2d, 0xa1, 0xf5, 0xb9, 0x73, 0xd6, 0x66, 0xa3, 0x94, ++ 0xfe, 0x7a, 0x4b, 0x27, 0xe9, 0x83, 0xf7, 0xe5, 0xfd, 0x9a, 0xec, 0xf0, ++ 0xda, 0xf5, 0xb2, 0x5f, 0x5e, 0xb7, 0x86, 0x8c, 0xf7, 0x32, 0x98, 0x68, ++ 0xb4, 0x78, 0x9e, 0xe5, 0xc0, 0xf7, 0x2e, 0x83, 0xde, 0x50, 0xbb, 0x37, ++ 0x9e, 0xbe, 0x0f, 0xd6, 0x46, 0x6d, 0xc2, 0x3e, 0xef, 0x59, 0xee, 0xb0, ++ 0xa0, 0x6c, 0xac, 0x75, 0xd0, 0xbe, 0xbf, 0xad, 0xce, 0x94, 0x67, 0x19, ++ 0x05, 0xe0, 0xa2, 0xdc, 0xd0, 0xe3, 0x5a, 0x65, 0xfe, 0x56, 0xff, 0x65, ++ 0xbf, 0x89, 0x84, 0xff, 0x20, 0x85, 0x75, 0x1e, 0xc2, 0xbd, 0xaf, 0x3f, ++ 0x73, 0xea, 0x47, 0x20, 0x67, 0xd4, 0xef, 0x59, 0xaa, 0x73, 0x2f, 0xe7, ++ 0x5f, 0xff, 0x7c, 0x24, 0xfa, 0xbf, 0x66, 0x70, 0xfb, 0x05, 0xdc, 0xf1, ++ 0x60, 0x5d, 0x5b, 0x35, 0x07, 0xf1, 0x89, 0x77, 0x8b, 0xa4, 0x9f, 0xa7, ++ 0xa0, 0x7d, 0x24, 0xf8, 0xba, 0xff, 0x41, 0x21, 0x9f, 0x9f, 0xb0, 0xb2, ++ 0x4d, 0x74, 0x7f, 0xb0, 0xc5, 0xcb, 0xe0, 0xb7, 0x0f, 0xca, 0xb8, 0xa2, ++ 0xef, 0xaf, 0x26, 0xf1, 0xfb, 0x12, 0x5a, 0xf0, 0x99, 0x50, 0xfd, 0xca, ++ 0x34, 0x5c, 0xf0, 0xa7, 0x37, 0x42, 0xc4, 0x17, 0x8b, 0x32, 0xf4, 0xdf, ++ 0x02, 0x8e, 0x1b, 0x35, 0x6b, 0x61, 0x31, 0x6c, 0x6a, 0x97, 0x39, 0x07, ++ 0xfd, 0xab, 0xdf, 0x51, 0x51, 0x7a, 0xea, 0x24, 0x29, 0x9f, 0xd3, 0xa4, ++ 0x7d, 0x65, 0x1b, 0x98, 0xec, 0x00, 0x1f, 0x6b, 0x1e, 0x0f, 0x9d, 0x43, ++ 0x5c, 0x57, 0x70, 0xb0, 0x12, 0xfb, 0xf2, 0x0f, 0x3b, 0xed, 0xf4, 0xfb, ++ 0xaa, 0x2a, 0xcf, 0x6f, 0x52, 0x67, 0x14, 0xe9, 0xad, 0x69, 0x03, 0xa7, ++ 0xd2, 0x7e, 0xa6, 0xb9, 0x2c, 0xac, 0x8c, 0xb7, 0x3f, 0x58, 0x60, 0x0a, ++ 0x22, 0x5f, 0xf5, 0x87, 0xcc, 0x2e, 0xf2, 0x02, 0xec, 0x61, 0x7a, 0xad, ++ 0x29, 0x92, 0xf2, 0x91, 0xb5, 0xd6, 0x9f, 0xff, 0x15, 0xf2, 0x3c, 0xd5, ++ 0xfc, 0xd5, 0x21, 0xfc, 0x4e, 0x49, 0xea, 0xf7, 0x35, 0xba, 0xff, 0xb2, ++ 0xbc, 0xeb, 0xb3, 0x27, 0xf0, 0x1b, 0x33, 0x65, 0xcc, 0x5f, 0x0c, 0xbc, ++ 0x7d, 0xe3, 0xd4, 0x3b, 0x31, 0x8f, 0xe3, 0x5d, 0x53, 0x3b, 0x74, 0x4e, ++ 0xb2, 0x1f, 0x3a, 0x03, 0x76, 0xb7, 0xd8, 0x27, 0x58, 0x28, 0xfc, 0xad, ++ 0x77, 0xfe, 0x35, 0x36, 0xc1, 0xd4, 0x03, 0xd7, 0xf9, 0xce, 0xcf, 0xe8, ++ 0x5e, 0xc1, 0xf3, 0x9d, 0x76, 0xf2, 0xd7, 0x4e, 0x6a, 0x95, 0xf7, 0xed, ++ 0x85, 0xc1, 0x73, 0x3e, 0xd9, 0x45, 0x79, 0xd1, 0xbc, 0x1d, 0xe9, 0x99, ++ 0xe7, 0x1d, 0x26, 0xba, 0x67, 0x6c, 0x52, 0xeb, 0x21, 0xba, 0x37, 0x6f, ++ 0x92, 0xba, 0x57, 0xcf, 0x6e, 0xbc, 0x57, 0x8f, 0xb9, 0xd2, 0xe2, 0xe1, ++ 0x4f, 0x26, 0x1f, 0x2a, 0x57, 0x0a, 0x92, 0x1a, 0x05, 0xdd, 0xae, 0x89, ++ 0x33, 0xda, 0x89, 0x89, 0xc3, 0x85, 0x7d, 0x98, 0x28, 0xe9, 0xa3, 0xf0, ++ 0xd7, 0x65, 0xff, 0xf2, 0x2d, 0x5d, 0xeb, 0x59, 0x87, 0x2b, 0x54, 0xfc, ++ 0x5e, 0xfd, 0xde, 0x54, 0x75, 0x04, 0xfd, 0xde, 0x54, 0x57, 0x6b, 0xd6, ++ 0xb7, 0xde, 0x9f, 0xf0, 0x3e, 0xf4, 0x07, 0xae, 0x17, 0xdc, 0x95, 0xe9, ++ 0x49, 0x1d, 0xde, 0xbf, 0x67, 0xff, 0x9c, 0x25, 0xf1, 0xa2, 0xf6, 0x61, ++ 0xb3, 0xec, 0x7f, 0x96, 0xc4, 0xcf, 0x2c, 0x87, 0x49, 0xe0, 0x23, 0xec, ++ 0xf7, 0x36, 0x14, 0x7f, 0x28, 0xfa, 0x2b, 0x78, 0xd5, 0xb9, 0x23, 0x45, ++ 0x37, 0x76, 0x57, 0xdb, 0x9b, 0x38, 0x17, 0xc4, 0xe9, 0x55, 0xf8, 0x20, ++ 0x23, 0x3a, 0xe5, 0x0c, 0x07, 0x9d, 0xfe, 0xfa, 0xf6, 0x06, 0x1c, 0xf3, ++ 0x1f, 0x68, 0xf6, 0x74, 0xe8, 0x19, 0xff, 0x12, 0x3a, 0x05, 0x71, 0x0f, ++ 0xce, 0x65, 0xd3, 0xa9, 0x2d, 0x9c, 0x4e, 0xc1, 0xc8, 0x21, 0xd0, 0x13, ++ 0x1e, 0x16, 0xbf, 0xbf, 0x15, 0x9e, 0xd7, 0xc8, 0xf2, 0x18, 0xad, 0xf3, ++ 0x72, 0x73, 0x14, 0xf9, 0x01, 0x75, 0x79, 0x2f, 0x38, 0x5f, 0xdf, 0x6f, ++ 0x62, 0x7d, 0xab, 0x75, 0x3d, 0x78, 0x6a, 0x7b, 0x21, 0xf6, 0xc7, 0xe3, ++ 0xdc, 0xf4, 0xa6, 0xdf, 0xbb, 0x34, 0x05, 0xe8, 0x79, 0xd5, 0x70, 0x91, ++ 0x4f, 0x38, 0x88, 0xb5, 0xa5, 0xc8, 0xfc, 0x9b, 0xd1, 0xd0, 0xcb, 0x1a, ++ 0xe5, 0xfd, 0xc7, 0xdd, 0xbf, 0x63, 0xb8, 0xc4, 0x41, 0xf7, 0x8d, 0x9c, ++ 0xf7, 0xab, 0xfb, 0x8f, 0xfd, 0x8f, 0x2d, 0xe2, 0xe3, 0x36, 0xcf, 0x2a, ++ 0x20, 0xbf, 0xfe, 0x79, 0x26, 0xd7, 0x7b, 0x75, 0xf7, 0x3d, 0xd9, 0xe2, ++ 0xfe, 0xe3, 0xee, 0x7b, 0xb2, 0xcd, 0x3e, 0xf2, 0x93, 0xcc, 0x8b, 0x22, ++ 0x3f, 0x4f, 0xf7, 0x3d, 0xd9, 0x39, 0xe2, 0xbe, 0xeb, 0x9f, 0x6a, 0x2c, ++ 0x17, 0xf7, 0xd0, 0xfa, 0x66, 0xd8, 0x29, 0x3f, 0x3e, 0xfc, 0x9e, 0x6c, ++ 0xbe, 0xcf, 0x3c, 0x8b, 0x78, 0xc6, 0xe3, 0xd5, 0x51, 0x14, 0x87, 0x52, ++ 0xf7, 0x23, 0x4f, 0x70, 0xea, 0xe5, 0xe0, 0xa3, 0xf0, 0xfb, 0x91, 0x1f, ++ 0xd1, 0xbc, 0xf3, 0x16, 0xa2, 0xbf, 0x42, 0x07, 0xf5, 0xd7, 0x3e, 0x2f, ++ 0xea, 0xc5, 0x9d, 0x02, 0xcd, 0x41, 0xf8, 0x71, 0x8e, 0xd7, 0xc7, 0xd0, ++ 0xbd, 0xd0, 0x8a, 0x2f, 0x95, 0xff, 0x7a, 0xb0, 0xaf, 0xe3, 0x31, 0xe0, ++ 0x49, 0x9d, 0xeb, 0xfc, 0x83, 0xe4, 0x2f, 0x85, 0x77, 0x75, 0xae, 0x4d, ++ 0xe1, 0x5f, 0xf1, 0x99, 0xba, 0x8f, 0x5d, 0x5b, 0x23, 0xf8, 0xad, 0x3b, ++ 0x4f, 0x76, 0x39, 0x23, 0xff, 0xc8, 0x20, 0x0e, 0x42, 0x34, 0xe5, 0x3d, ++ 0xba, 0x5d, 0xc0, 0xf3, 0x7d, 0xf1, 0xfa, 0x1d, 0x80, 0xbb, 0x71, 0x25, ++ 0x97, 0x1b, 0xe4, 0x17, 0x17, 0xf9, 0x9b, 0xc7, 0x4d, 0xc6, 0xdf, 0xed, ++ 0x55, 0xa5, 0x4f, 0xae, 0x4b, 0x26, 0xf3, 0xff, 0xcb, 0xe5, 0x3e, 0x55, ++ 0xae, 0xf2, 0xfd, 0xeb, 0x8d, 0xf9, 0xfe, 0xe1, 0xf7, 0x67, 0x26, 0xc6, ++ 0x79, 0xd7, 0x81, 0xdf, 0xcf, 0x69, 0xef, 0x8f, 0xc1, 0xc3, 0xb7, 0xff, ++ 0xc7, 0xdc, 0x6b, 0xfe, 0xc8, 0x0f, 0x87, 0x0b, 0x3b, 0x6e, 0x54, 0xb4, ++ 0x7e, 0x1f, 0xda, 0xab, 0x73, 0x0f, 0x4a, 0x2f, 0x7c, 0xbb, 0xf8, 0xf3, ++ 0x34, 0xfa, 0x9d, 0x91, 0xaf, 0x0f, 0xd1, 0xef, 0x29, 0xce, 0x71, 0x7a, ++ 0xef, 0xc7, 0x3c, 0x22, 0xb3, 0x45, 0x1c, 0xe0, 0x0f, 0x29, 0xed, 0x74, ++ 0x4e, 0xe3, 0x0f, 0xf3, 0xfe, 0x96, 0x46, 0x7e, 0xe4, 0x35, 0xe2, 0xde, ++ 0xcf, 0xcb, 0x85, 0xf3, 0xd2, 0x73, 0xb4, 0x82, 0x0f, 0x56, 0x2f, 0x14, ++ 0x79, 0x86, 0xa9, 0xac, 0x8e, 0xf8, 0x36, 0xb9, 0xe7, 0x7c, 0x66, 0x24, ++ 0xe0, 0xf8, 0xff, 0xed, 0x1c, 0x6d, 0xcf, 0x39, 0xd7, 0xa9, 0x23, 0x4f, ++ 0x52, 0xbe, 0x85, 0x97, 0x7e, 0xa7, 0x22, 0x9c, 0x1e, 0xe3, 0x23, 0x0e, ++ 0xbe, 0xec, 0xe2, 0x16, 0xca, 0xe1, 0xff, 0x6c, 0x9f, 0x43, 0xe7, 0x4e, ++ 0xe3, 0x0e, 0xae, 0xce, 0xe0, 0xf5, 0xb7, 0x86, 0xff, 0x71, 0x0e, 0x9d, ++ 0x2b, 0x4d, 0x3d, 0x78, 0x21, 0x03, 0xe7, 0x52, 0x87, 0x7f, 0x26, 0xea, ++ 0xf9, 0x07, 0x2f, 0xe0, 0x1c, 0xea, 0x7b, 0xc3, 0x3f, 0x17, 0xf5, 0xab, ++ 0x18, 0xc5, 0xb1, 0x7e, 0x35, 0xfc, 0xd4, 0x1c, 0x5f, 0x01, 0xfd, 0x1e, ++ 0xe1, 0xaf, 0x41, 0xaf, 0xd9, 0x17, 0xeb, 0xde, 0xc4, 0xb6, 0xfa, 0xe1, ++ 0xda, 0x9b, 0x16, 0x66, 0xd0, 0x39, 0xca, 0x19, 0x69, 0x79, 0xe2, 0x1c, ++ 0xe5, 0x51, 0xbc, 0x9f, 0x95, 0xb4, 0x60, 0x43, 0x9c, 0xd6, 0x73, 0x8e, ++ 0xf2, 0xfc, 0x70, 0x2f, 0x7d, 0x77, 0xfe, 0x2b, 0xc1, 0xe7, 0x19, 0x88, ++ 0x81, 0xf5, 0xff, 0xe7, 0x4b, 0x75, 0x8e, 0x54, 0xc9, 0xd9, 0xbe, 0xe4, ++ 0xa1, 0x5a, 0x6f, 0xff, 0xaa, 0x73, 0xb0, 0x6a, 0xfd, 0xb2, 0x9d, 0xee, ++ 0x4d, 0x56, 0x30, 0xa1, 0xef, 0x9f, 0x3e, 0x9f, 0x7a, 0x8e, 0xd6, 0x4b, ++ 0xd8, 0xf9, 0xd4, 0x37, 0x5f, 0xff, 0xad, 0x0b, 0x79, 0x87, 0xe3, 0x47, ++ 0xd9, 0x89, 0x9f, 0xc7, 0x3b, 0xda, 0x5c, 0xf0, 0x0b, 0xa0, 0x0e, 0xb9, ++ 0xb8, 0xfd, 0x2b, 0x71, 0x9e, 0x0f, 0xed, 0x2c, 0xa1, 0xed, 0xfa, 0x89, ++ 0x73, 0x7c, 0xe3, 0x71, 0x9e, 0x02, 0xfe, 0x83, 0x2e, 0x71, 0xce, 0xf0, ++ 0xcd, 0xd7, 0x7f, 0x9e, 0x02, 0x79, 0x3f, 0xbe, 0xce, 0x46, 0x79, 0x3e, ++ 0x8f, 0xca, 0xdf, 0x05, 0x88, 0x31, 0x1d, 0x30, 0x63, 0x9c, 0x98, 0x2e, ++ 0x21, 0xb3, 0xd5, 0xb9, 0xa0, 0x01, 0x36, 0x91, 0xaf, 0xf9, 0x7f, 0x00, ++ 0xfc, 0xd9, 0x0e, 0xe9, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xb5, 0x7c, ++ 0x0b, 0x78, 0x94, 0xd5, 0x99, 0xf0, 0xf9, 0xe6, 0x9b, 0x6b, 0x32, 0x49, ++ 0x26, 0x21, 0x37, 0x08, 0x84, 0x2f, 0x24, 0xc4, 0x20, 0x21, 0xce, 0xe4, ++ 0x06, 0x6e, 0xd1, 0x1d, 0x2e, 0x89, 0x01, 0x5a, 0x0d, 0xb4, 0x52, 0x90, ++ 0x18, 0x06, 0x8d, 0x90, 0xdb, 0x24, 0x01, 0x6d, 0x97, 0xdd, 0xea, 0x66, ++ 0x68, 0x90, 0x02, 0xd5, 0x5d, 0x58, 0x41, 0x01, 0x91, 0x4e, 0x80, 0x20, ++ 0xd4, 0xb0, 0x1d, 0x34, 0xc1, 0x09, 0x86, 0x32, 0x8a, 0xa4, 0x88, 0xd6, ++ 0x8d, 0xd9, 0x35, 0xf2, 0xff, 0x4f, 0xe1, 0x09, 0x5e, 0x10, 0x08, 0x4e, ++ 0x42, 0xbc, 0xac, 0xfe, 0xa5, 0xe5, 0x7f, 0xdf, 0xf7, 0x9c, 0x2f, 0x73, ++ 0x21, 0x11, 0xed, 0xfe, 0x7f, 0x78, 0xda, 0xe3, 0x7b, 0xee, 0xe7, 0xbd, ++ 0xbf, 0xef, 0x39, 0xdf, 0x3c, 0xa7, 0x63, 0xcc, 0x18, 0xc7, 0xd8, 0xfe, ++ 0x21, 0xe6, 0xd3, 0x44, 0x33, 0x36, 0x21, 0xae, 0x61, 0x35, 0xcb, 0x87, ++ 0xb2, 0xdc, 0x6c, 0x6d, 0x4a, 0x63, 0xf0, 0xe7, 0x66, 0xac, 0x80, 0xb1, ++ 0x94, 0x31, 0xbe, 0xb1, 0x46, 0xa8, 0x4f, 0x79, 0x54, 0x4f, 0xf5, 0x51, ++ 0x9a, 0x1e, 0xa5, 0xc1, 0xcc, 0x98, 0xbf, 0xd1, 0x37, 0xff, 0xe3, 0x0c, ++ 0xc6, 0xe6, 0x46, 0x44, 0xe7, 0xb0, 0x3b, 0xa0, 0xd4, 0xb3, 0x2c, 0x2d, ++ 0xf4, 0x63, 0x9a, 0x08, 0x6b, 0x8b, 0xc4, 0x58, 0x91, 0x7c, 0xbd, 0x2b, ++ 0x05, 0xe0, 0x35, 0x1d, 0x92, 0xcd, 0x00, 0xd5, 0x73, 0x0d, 0xa5, 0xbb, ++ 0x59, 0x3a, 0x63, 0x75, 0x5a, 0x00, 0xe2, 0xf1, 0x7f, 0x26, 0x77, 0x0b, ++ 0xae, 0xa3, 0xed, 0xae, 0x7a, 0x11, 0xfa, 0xf5, 0x24, 0xa6, 0x58, 0x37, ++ 0x03, 0x38, 0x3e, 0xf9, 0x28, 0xcb, 0xc8, 0x83, 0xf1, 0xf5, 0x25, 0xd9, ++ 0x6c, 0x12, 0x63, 0x27, 0x2c, 0x8e, 0xb1, 0xd6, 0x04, 0x68, 0x67, 0x5b, ++ 0x24, 0x1c, 0x1f, 0x99, 0xcd, 0xc7, 0xff, 0xb8, 0x24, 0x72, 0xaf, 0x0c, ++ 0xe3, 0x07, 0x8e, 0xdf, 0x56, 0xe0, 0x80, 0xba, 0x45, 0x06, 0xa5, 0x9d, ++ 0x59, 0x19, 0x53, 0xac, 0x96, 0x25, 0xda, 0x3b, 0x01, 0x8e, 0x51, 0x0a, ++ 0x24, 0x0b, 0xc0, 0x9e, 0x38, 0x0e, 0x27, 0x29, 0xed, 0x12, 0xb4, 0x1b, ++ 0x99, 0x65, 0xc9, 0xdc, 0xb1, 0x78, 0x3e, 0xa3, 0xe5, 0xe3, 0x2c, 0xc6, ++ 0x7e, 0xca, 0x24, 0x16, 0x23, 0x33, 0x96, 0xa6, 0x75, 0x4c, 0xb6, 0xc2, ++ 0x79, 0x9d, 0x25, 0x9f, 0xe9, 0x99, 0x06, 0xdb, 0x07, 0xf5, 0xa5, 0xd3, ++ 0x18, 0x9b, 0x62, 0xb5, 0x10, 0x1e, 0x12, 0xde, 0x00, 0x3c, 0xc1, 0x3e, ++ 0x07, 0xe7, 0x45, 0xb9, 0xf7, 0xc2, 0xf9, 0x58, 0xb6, 0x52, 0x80, 0xed, ++ 0xa9, 0xba, 0xc1, 0x68, 0x0b, 0xe0, 0x63, 0xe0, 0xba, 0xb6, 0xc4, 0x6d, ++ 0xa6, 0x71, 0xd1, 0x3f, 0x81, 0xfa, 0x1b, 0xf8, 0xf7, 0xf7, 0x8c, 0xed, ++ 0xe9, 0x94, 0xa9, 0x5e, 0x85, 0xd5, 0xb2, 0xdf, 0x0a, 0x93, 0xc0, 0xb9, ++ 0xea, 0x33, 0xcc, 0x4f, 0x21, 0xfe, 0xea, 0x92, 0x8d, 0x46, 0x2a, 0x3b, ++ 0xaf, 0x15, 0x33, 0x9c, 0x47, 0x5b, 0x9a, 0xb1, 0x08, 0xe6, 0xb1, 0xeb, ++ 0xd9, 0xf2, 0xd2, 0xec, 0x9b, 0xc7, 0x9f, 0xb3, 0x6a, 0x68, 0x7c, 0xda, ++ 0x06, 0x3d, 0x63, 0xe3, 0x70, 0x5d, 0x66, 0x67, 0x0a, 0xfc, 0x5f, 0x04, ++ 0x53, 0x61, 0x17, 0x9b, 0xc1, 0x58, 0xf3, 0xcf, 0xa1, 0xe2, 0xef, 0x78, ++ 0x3b, 0x9c, 0x84, 0xe9, 0x27, 0x6b, 0x38, 0xec, 0xba, 0x63, 0xc7, 0x5c, ++ 0x6d, 0x48, 0x7f, 0x3b, 0xf6, 0x1f, 0x6e, 0x07, 0xd8, 0xc8, 0x02, 0xe3, ++ 0x1f, 0xf0, 0xa4, 0xef, 0x58, 0xaf, 0x15, 0xeb, 0x21, 0x9d, 0x57, 0x32, ++ 0xf7, 0x64, 0x38, 0x42, 0x0a, 0x6b, 0x90, 0x18, 0xe0, 0x2f, 0x99, 0xf9, ++ 0x88, 0x3e, 0xcf, 0xdb, 0xe2, 0x08, 0x5f, 0xf4, 0x07, 0x74, 0x7a, 0x21, ++ 0xde, 0xd4, 0xbc, 0x19, 0xfa, 0x65, 0xc8, 0xcc, 0x65, 0xca, 0xa5, 0x92, ++ 0x59, 0xa0, 0x4c, 0x89, 0x84, 0xf5, 0xa0, 0x3d, 0xe5, 0x84, 0xc9, 0x8d, ++ 0x7c, 0xb5, 0xdf, 0x04, 0xed, 0x30, 0x34, 0x43, 0xc3, 0xcb, 0xfd, 0x1a, ++ 0xde, 0x5f, 0x1f, 0xc1, 0x5c, 0xc8, 0xa7, 0x13, 0x00, 0x66, 0x50, 0x7a, ++ 0x6d, 0x8e, 0x1a, 0x5b, 0x02, 0xcd, 0xe3, 0xa3, 0x79, 0xe4, 0x23, 0x36, ++ 0xe4, 0xc7, 0xb1, 0xcc, 0x43, 0xeb, 0x27, 0x31, 0x17, 0xed, 0x47, 0xed, ++ 0x37, 0x9e, 0x75, 0x9b, 0x10, 0x66, 0xda, 0xc1, 0x4c, 0xa4, 0xd7, 0x4c, ++ 0x59, 0x33, 0x22, 0x3e, 0x35, 0xb6, 0x59, 0xff, 0x8c, 0xf4, 0xf7, 0x37, ++ 0xda, 0xd9, 0x27, 0xda, 0x40, 0xbd, 0x3f, 0x32, 0x7a, 0x6d, 0x30, 0xfd, ++ 0xea, 0x70, 0xbc, 0x39, 0x78, 0xdc, 0x6c, 0x1a, 0xa7, 0x8e, 0x77, 0xae, ++ 0xd5, 0xb0, 0x4f, 0xc6, 0xe0, 0xe1, 0x7d, 0xc4, 0x3f, 0xce, 0x0c, 0x8d, ++ 0xdd, 0x9d, 0x8d, 0xe3, 0xd8, 0x9b, 0x52, 0x2e, 0xd6, 0x77, 0xeb, 0x4b, ++ 0xa3, 0x02, 0xe3, 0x7a, 0x1b, 0x8d, 0xec, 0x13, 0x90, 0xa3, 0xff, 0x6a, ++ 0x64, 0x54, 0x9e, 0x6d, 0xb4, 0xd0, 0xfa, 0xff, 0xbb, 0x31, 0x99, 0xca, ++ 0x3f, 0x35, 0x2a, 0x54, 0x7f, 0xbe, 0x31, 0x8b, 0xca, 0xbe, 0x46, 0x2b, ++ 0xd5, 0x7f, 0xd8, 0x38, 0x83, 0xca, 0xc5, 0xcb, 0xa2, 0xf2, 0x91, 0xff, ++ 0xeb, 0xbd, 0xb3, 0xd8, 0x27, 0x46, 0x8e, 0xf6, 0x1b, 0xf0, 0x3f, 0xa7, ++ 0x47, 0xe7, 0xe8, 0x0b, 0x82, 0x7b, 0x67, 0x8d, 0xcc, 0x47, 0xfb, 0x91, ++ 0x8f, 0x70, 0x1f, 0x69, 0x23, 0xb7, 0x1f, 0x17, 0x7c, 0xd6, 0x7b, 0x37, ++ 0xa7, 0xe7, 0xc0, 0x23, 0xcc, 0xbd, 0x37, 0x8d, 0xf8, 0x72, 0xbd, 0x25, ++ 0xee, 0x66, 0xfa, 0xc3, 0xf9, 0x4c, 0x78, 0xbe, 0x81, 0x28, 0xb6, 0xc4, ++ 0x03, 0x78, 0xf2, 0xe6, 0x4b, 0x34, 0xff, 0xc0, 0x58, 0x0e, 0xef, 0xb1, ++ 0xea, 0x68, 0x3e, 0xbb, 0x86, 0xed, 0xc0, 0xf1, 0xde, 0x7c, 0x3d, 0x9f, ++ 0x7f, 0x92, 0xa6, 0x12, 0xdb, 0xed, 0x71, 0x7c, 0xde, 0xde, 0x4c, 0x80, ++ 0x61, 0x3f, 0x45, 0x33, 0x66, 0xed, 0x46, 0x3c, 0xd9, 0x13, 0xa1, 0x3e, ++ 0x37, 0x00, 0xf7, 0xde, 0xce, 0xdb, 0xed, 0xe3, 0x78, 0xbd, 0xba, 0x5f, ++ 0xb5, 0xbd, 0xc6, 0x66, 0xa1, 0x79, 0x55, 0xba, 0x0f, 0xe8, 0x60, 0xfd, ++ 0x6c, 0xe2, 0x77, 0x9a, 0x5f, 0xed, 0x7f, 0xa5, 0x90, 0xef, 0x2f, 0xbc, ++ 0xbf, 0x3b, 0x43, 0x53, 0xe2, 0x1e, 0x01, 0x1f, 0x37, 0x84, 0xdc, 0x92, ++ 0x5c, 0x00, 0x3e, 0x5c, 0x28, 0x07, 0x69, 0x41, 0x72, 0x51, 0xa7, 0x90, ++ 0x5c, 0xa8, 0x7c, 0xa8, 0xf2, 0xdf, 0xf3, 0x36, 0x8e, 0xc7, 0x0c, 0x83, ++ 0xe0, 0xf3, 0x48, 0x90, 0x83, 0x38, 0x92, 0x03, 0x1a, 0x97, 0x92, 0x04, ++ 0x72, 0x20, 0x11, 0x5e, 0xec, 0x0c, 0xce, 0xb3, 0x5f, 0x12, 0xf2, 0x12, ++ 0x2e, 0x0f, 0x50, 0x1a, 0x73, 0x03, 0xf2, 0xa0, 0xca, 0x81, 0xca, 0xef, ++ 0x29, 0x20, 0x67, 0x52, 0x5c, 0xe0, 0x1c, 0x77, 0x85, 0xf1, 0xab, 0x5a, ++ 0x9e, 0x12, 0xe7, 0xe8, 0x4e, 0x8c, 0xfa, 0x19, 0xd1, 0xb5, 0x53, 0x67, ++ 0x01, 0x55, 0x08, 0xfd, 0x81, 0x90, 0x71, 0x08, 0xdf, 0x9f, 0x6f, 0x87, ++ 0x71, 0x45, 0xbf, 0x32, 0x37, 0x8c, 0xa4, 0xbf, 0xae, 0xff, 0x4f, 0xf1, ++ 0xa0, 0xea, 0x83, 0x51, 0xf0, 0x70, 0xd3, 0xf9, 0xf5, 0xbc, 0xfc, 0xbe, ++ 0xe7, 0x27, 0xfd, 0x86, 0x7a, 0x1b, 0xf9, 0x76, 0x04, 0x7d, 0x75, 0xc5, ++ 0x1a, 0xc7, 0xe9, 0x2e, 0xf8, 0x56, 0x63, 0xb3, 0x7f, 0x8c, 0xf6, 0x66, ++ 0x40, 0x32, 0x69, 0xa5, 0x18, 0x28, 0x4d, 0x9c, 0x6f, 0xc2, 0xcf, 0xef, ++ 0xcd, 0xe7, 0x72, 0xa3, 0xf2, 0xcf, 0xf3, 0x36, 0xc6, 0xed, 0x25, 0x9e, ++ 0x33, 0xfd, 0x66, 0x7d, 0xa7, 0x9e, 0x67, 0xf8, 0x9c, 0xab, 0x18, 0xe9, ++ 0xbd, 0x8c, 0x08, 0x5e, 0x1f, 0x4e, 0x5f, 0xf5, 0x5c, 0x41, 0x7a, 0xef, ++ 0xff, 0xe0, 0xbe, 0x54, 0x7c, 0x32, 0xe6, 0xb1, 0x59, 0x60, 0x9e, 0xf1, ++ 0xb5, 0x66, 0xeb, 0xe6, 0xb4, 0x00, 0xff, 0xfa, 0x13, 0xbe, 0x59, 0x89, ++ 0xf6, 0x6b, 0x83, 0x55, 0xe1, 0xfb, 0xd2, 0xc8, 0x44, 0x7f, 0xd5, 0x9e, ++ 0x0c, 0xd7, 0x4b, 0xf2, 0xf2, 0x85, 0xd9, 0x21, 0x76, 0x86, 0x59, 0x80, ++ 0x8e, 0x83, 0xc7, 0x0d, 0x24, 0xdf, 0x3e, 0x0d, 0xab, 0x7c, 0x19, 0xc6, ++ 0xb5, 0xe0, 0x52, 0x77, 0x06, 0xce, 0x9d, 0x2f, 0xe8, 0x37, 0xb4, 0x64, ++ 0xb2, 0x66, 0x2d, 0xec, 0xcb, 0xff, 0x95, 0xd9, 0x85, 0x76, 0xcb, 0x3f, ++ 0x6e, 0xf0, 0xbc, 0x04, 0xe3, 0xfd, 0x3b, 0x74, 0xcc, 0x45, 0xfe, 0x83, ++ 0xfd, 0x87, 0x52, 0x22, 0x63, 0x8f, 0x80, 0x4d, 0x41, 0xbb, 0x74, 0x15, ++ 0xf4, 0x1c, 0xcb, 0x64, 0x4c, 0xde, 0xf9, 0xe5, 0x79, 0x09, 0xf6, 0xbd, ++ 0x72, 0xa7, 0xcc, 0x0c, 0x80, 0x3a, 0x3f, 0xa8, 0x6d, 0x19, 0xc6, 0xd5, ++ 0x6f, 0x8f, 0x72, 0x1b, 0xf9, 0x38, 0xc6, 0x60, 0x5c, 0xad, 0x18, 0xd7, ++ 0xb4, 0xe3, 0xf3, 0xc5, 0xc8, 0x5f, 0x17, 0x81, 0x3f, 0x0d, 0xd0, 0xfe, ++ 0x89, 0xa9, 0x6e, 0x12, 0xcb, 0x61, 0x6c, 0xce, 0x4e, 0x1d, 0xe1, 0x71, ++ 0x65, 0x94, 0xde, 0x8d, 0xf5, 0x27, 0x77, 0x3c, 0x73, 0x7a, 0x19, 0xc0, ++ 0x17, 0xdb, 0x24, 0x05, 0xfd, 0x8d, 0x62, 0xd9, 0x4c, 0xed, 0xd5, 0x87, ++ 0x64, 0x37, 0xae, 0x53, 0x6b, 0x2e, 0xbe, 0x2c, 0x81, 0x9f, 0xe3, 0x6f, ++ 0x6b, 0x7e, 0x36, 0x02, 0xea, 0x9d, 0x07, 0x75, 0xcc, 0x04, 0xe3, 0x8a, ++ 0xdb, 0x24, 0xab, 0x0f, 0xe6, 0x5f, 0xe5, 0x89, 0x42, 0xcc, 0xb0, 0x95, ++ 0xdb, 0x74, 0x1f, 0xf6, 0x65, 0x05, 0xf4, 0xe6, 0x3d, 0xc2, 0x8e, 0x55, ++ 0xee, 0x97, 0xdc, 0xc0, 0x31, 0xac, 0x72, 0x77, 0x68, 0x7b, 0xf5, 0xfe, ++ 0x50, 0xb8, 0x96, 0x69, 0x03, 0x30, 0xcc, 0x7f, 0x87, 0x2d, 0x2a, 0xfe, ++ 0xe2, 0x54, 0x00, 0xa6, 0x30, 0xdb, 0x0d, 0xa4, 0xdb, 0xb6, 0x38, 0x34, ++ 0x56, 0xc3, 0x7a, 0x3b, 0x9c, 0xaf, 0xd0, 0x6c, 0x93, 0x7e, 0x5c, 0xc3, ++ 0xf5, 0x31, 0x63, 0x5f, 0x24, 0x2e, 0x02, 0xbe, 0x94, 0x8f, 0x7f, 0x99, ++ 0xfa, 0xa1, 0x99, 0xc3, 0x0b, 0x05, 0x7c, 0x01, 0xe0, 0xcf, 0xbe, 0xe4, ++ 0xf8, 0x57, 0xf1, 0x56, 0x27, 0x74, 0xfe, 0x67, 0x63, 0x59, 0xbe, 0x07, ++ 0xce, 0x59, 0x77, 0xdc, 0x64, 0x71, 0xc1, 0xc1, 0xea, 0x3a, 0x64, 0x3a, ++ 0x87, 0xdf, 0x13, 0x43, 0x78, 0xae, 0x8f, 0xe8, 0xbb, 0x97, 0xe4, 0xf4, ++ 0x98, 0x6c, 0x41, 0x3f, 0x6c, 0x93, 0x57, 0x76, 0x61, 0xbb, 0xb3, 0xd3, ++ 0xb4, 0x4f, 0x03, 0xe7, 0xac, 0x6b, 0x97, 0x98, 0x16, 0x61, 0xaf, 0xc1, ++ 0xcd, 0xf1, 0x74, 0x6d, 0x25, 0xb6, 0xaf, 0xf2, 0x9a, 0x2c, 0x0a, 0xb6, ++ 0x1f, 0x33, 0x30, 0x19, 0xc6, 0xfb, 0x81, 0x6e, 0x26, 0xa4, 0xe3, 0x84, ++ 0x3e, 0xa2, 0x3f, 0xd2, 0xd5, 0x25, 0xd1, 0x16, 0x7e, 0x28, 0x15, 0x06, ++ 0xe8, 0x2f, 0x23, 0xbd, 0xe2, 0x03, 0xf4, 0x6a, 0xda, 0xc1, 0xf7, 0x73, ++ 0xf1, 0x20, 0xa7, 0x4f, 0xb1, 0xfc, 0xb8, 0x96, 0xe8, 0xd5, 0x2c, 0xb1, ++ 0xa4, 0x20, 0x3a, 0xff, 0x41, 0xf3, 0xd2, 0x30, 0xbd, 0xb0, 0xdf, 0x9c, ++ 0x9d, 0xef, 0x77, 0x21, 0x9d, 0x57, 0xc2, 0xfe, 0x0c, 0x0a, 0xd2, 0x5d, ++ 0x26, 0x3a, 0x5f, 0x04, 0xfa, 0xe0, 0xbc, 0xfa, 0xe3, 0x9f, 0xa4, 0xf6, ++ 0x99, 0x03, 0xf4, 0x96, 0x81, 0xde, 0xbf, 0x50, 0xc7, 0x43, 0xff, 0x55, ++ 0xb7, 0xa0, 0x77, 0x25, 0x73, 0x6d, 0x40, 0x7f, 0xee, 0xfb, 0xd2, 0xd9, ++ 0x28, 0xe4, 0x1f, 0xfc, 0xde, 0x8b, 0xcf, 0xa3, 0xdf, 0x1b, 0xa5, 0xb7, ++ 0x22, 0x1f, 0xc6, 0x0b, 0xff, 0x38, 0xa1, 0xa6, 0xf7, 0x54, 0x3c, 0x2c, ++ 0x58, 0x1e, 0xd7, 0xef, 0x5c, 0x0d, 0xf5, 0x93, 0x93, 0x5f, 0x66, 0x19, ++ 0xe0, 0x27, 0xfc, 0xd5, 0xe2, 0x78, 0x0c, 0xf5, 0xd6, 0xf9, 0x79, 0x7f, ++ 0x7c, 0x12, 0xc9, 0xd1, 0x33, 0xff, 0x25, 0x1b, 0xf2, 0x45, 0x93, 0xae, ++ 0xaf, 0xe5, 0x39, 0xa8, 0x70, 0xc5, 0x46, 0x5a, 0x51, 0x06, 0x07, 0xd2, ++ 0x16, 0xee, 0x7e, 0x15, 0xd6, 0x99, 0x1b, 0xf7, 0x4d, 0xea, 0x11, 0x94, ++ 0x97, 0xdf, 0x1b, 0x2c, 0xc8, 0x4e, 0x2e, 0x21, 0x8f, 0xf8, 0x67, 0x04, ++ 0xfa, 0x3b, 0x19, 0xc7, 0x37, 0xd0, 0xf1, 0x02, 0x9e, 0xdf, 0xd9, 0x69, ++ 0xf0, 0x19, 0x00, 0x8f, 0xac, 0xad, 0xc8, 0x3e, 0xec, 0x0f, 0x4c, 0x42, ++ 0x7b, 0xec, 0xd1, 0xa3, 0x9e, 0x2a, 0xd2, 0x0f, 0x96, 0xaf, 0x46, 0x7f, ++ 0x1c, 0xe6, 0xc3, 0x75, 0x24, 0x60, 0x23, 0x94, 0xeb, 0x9a, 0xce, 0x3f, ++ 0x9c, 0x95, 0x60, 0x9c, 0xa4, 0xc4, 0xb3, 0x32, 0x84, 0x8d, 0x66, 0x9f, ++ 0x8c, 0xf3, 0xb4, 0xea, 0xae, 0x0e, 0x9f, 0x1b, 0xe6, 0x91, 0x2c, 0x7f, ++ 0xa4, 0x7e, 0x3b, 0x6d, 0x93, 0x68, 0x1f, 0xe9, 0x49, 0x77, 0x29, 0xa8, ++ 0x7f, 0x9a, 0x96, 0x32, 0x47, 0x44, 0xfa, 0xb7, 0xe9, 0x79, 0x46, 0x7a, ++ 0xfe, 0x05, 0x9d, 0xd0, 0xef, 0xa3, 0xf9, 0x7f, 0xa3, 0xe8, 0x7b, 0xd5, ++ 0xef, 0x63, 0xae, 0xf1, 0xb1, 0x17, 0x61, 0x4e, 0xc4, 0x05, 0x97, 0x1f, ++ 0xae, 0x77, 0x56, 0xcd, 0x60, 0xe2, 0x4f, 0xc8, 0x85, 0x80, 0x2b, 0xd7, ++ 0xb9, 0xa2, 0x8d, 0xd0, 0x79, 0xd5, 0x54, 0x6b, 0x32, 0x9e, 0xff, 0x53, ++ 0xe4, 0xb3, 0x68, 0xe4, 0xbf, 0x77, 0xb4, 0x63, 0x60, 0x5f, 0xb5, 0x2d, ++ 0x12, 0xd1, 0xad, 0x0e, 0xf9, 0x07, 0xce, 0x75, 0x0a, 0xed, 0x1b, 0xd4, ++ 0x0f, 0x78, 0x84, 0x1e, 0x39, 0xd4, 0x3d, 0x77, 0x4c, 0x3c, 0x96, 0x92, ++ 0x15, 0x24, 0x95, 0x55, 0x75, 0xca, 0x56, 0x1f, 0xb4, 0x57, 0x79, 0x39, ++ 0x3f, 0xdd, 0xc4, 0x37, 0x42, 0x7f, 0x54, 0xb7, 0x72, 0xfd, 0x71, 0x13, ++ 0x1f, 0xb5, 0x02, 0x1c, 0xe4, 0xa7, 0xd5, 0x21, 0x5f, 0xa9, 0x30, 0xd0, ++ 0xfb, 0x55, 0xd4, 0x1f, 0x91, 0xa4, 0x3f, 0xa6, 0xdd, 0x80, 0xfd, 0xee, ++ 0x9e, 0xce, 0x04, 0xbd, 0xb9, 0x9e, 0x28, 0x92, 0xb3, 0x63, 0xfa, 0x80, ++ 0x5f, 0x86, 0x98, 0x12, 0x63, 0xc9, 0x0e, 0xb2, 0x5b, 0x12, 0xf7, 0xb7, ++ 0x54, 0xbd, 0x72, 0xdb, 0x0e, 0x50, 0xf5, 0x41, 0xeb, 0x4e, 0x71, 0x1b, ++ 0x99, 0x36, 0x68, 0xdd, 0xa9, 0x07, 0x2d, 0x21, 0xf0, 0x34, 0x4f, 0x72, ++ 0x48, 0xff, 0x3b, 0xbc, 0x4a, 0x48, 0xbb, 0xcd, 0x97, 0x15, 0xd2, 0x9e, ++ 0x77, 0xda, 0x1a, 0x02, 0x17, 0x74, 0xcf, 0x08, 0xe9, 0x3f, 0xfd, 0xac, ++ 0x3d, 0x04, 0xbe, 0xb3, 0xaf, 0x24, 0xa4, 0xff, 0x0f, 0x2e, 0x95, 0x86, ++ 0xc0, 0x43, 0xd9, 0x70, 0x9e, 0x11, 0xfc, 0x0e, 0xb5, 0xbc, 0x27, 0x59, ++ 0x0a, 0xe9, 0x3f, 0x4f, 0x31, 0x85, 0xcc, 0xbf, 0x20, 0x2b, 0x36, 0x04, ++ 0x1e, 0x32, 0x0b, 0xfc, 0x08, 0x3f, 0x50, 0xf5, 0x4f, 0x3f, 0xb1, 0x71, ++ 0x3f, 0x26, 0xbc, 0x54, 0xf1, 0xfb, 0x23, 0x6b, 0xe8, 0x3a, 0x6a, 0x5c, ++ 0x7c, 0xdf, 0x8c, 0xd0, 0xf5, 0x16, 0xda, 0x43, 0xd7, 0xfb, 0xae, 0x74, ++ 0x39, 0x00, 0x7e, 0xbf, 0x16, 0xfc, 0xfa, 0x83, 0x60, 0x1f, 0xb1, 0xfc, ++ 0x2d, 0xf8, 0xff, 0x5a, 0xf0, 0xeb, 0x5b, 0xc1, 0xff, 0x47, 0xf8, 0xdf, ++ 0xc1, 0xff, 0xc7, 0xd2, 0x03, 0xfe, 0x3f, 0xd6, 0xbf, 0x0c, 0xfe, 0x3f, ++ 0xc2, 0x6d, 0xe0, 0xff, 0x23, 0x7c, 0x14, 0xe2, 0x15, 0x84, 0xbd, 0x8d, ++ 0x25, 0x54, 0x1e, 0x6b, 0x2c, 0xa5, 0xfa, 0x5b, 0xe1, 0xaf, 0x4b, 0xac, ++ 0x7b, 0x5a, 0xac, 0x7b, 0x46, 0xac, 0xfb, 0xb7, 0xe2, 0x49, 0x2d, 0x9d, ++ 0x25, 0x93, 0x35, 0x5f, 0x83, 0x9c, 0xce, 0x8a, 0xbb, 0xac, 0x47, 0x3d, ++ 0x6c, 0x5f, 0xd3, 0x57, 0x8c, 0x79, 0x80, 0xc1, 0xb7, 0x64, 0xb6, 0x17, ++ 0x05, 0xc4, 0xe1, 0x3e, 0xdd, 0x18, 0x8f, 0xf6, 0x68, 0x0c, 0x43, 0xbf, ++ 0x85, 0x95, 0x0e, 0xbe, 0xad, 0x41, 0xb8, 0x3d, 0xdd, 0xb2, 0x59, 0x41, ++ 0x3b, 0xf4, 0x9f, 0xef, 0x62, 0xbb, 0xbf, 0x4d, 0x56, 0x50, 0x9f, 0xbf, ++ 0xe1, 0xfd, 0x28, 0x1a, 0xe7, 0xb9, 0xfa, 0x35, 0xc8, 0x61, 0x1e, 0x8e, ++ 0xfb, 0x28, 0x1a, 0xe3, 0xe3, 0xda, 0x6f, 0x18, 0xc1, 0x9b, 0xa1, 0x5d, ++ 0x01, 0x78, 0xde, 0x11, 0x50, 0x0c, 0xe4, 0xcf, 0x80, 0x5e, 0xc3, 0xfe, ++ 0x19, 0x2a, 0xec, 0xd6, 0x33, 0x28, 0x4b, 0x5b, 0x8f, 0xe8, 0x91, 0x1e, ++ 0x35, 0x07, 0x8f, 0x50, 0xfb, 0x5b, 0x1e, 0x5d, 0x68, 0xfb, 0xc1, 0xe6, ++ 0x90, 0x76, 0x0b, 0xf6, 0x87, 0xb2, 0x46, 0xeb, 0xa6, 0xf8, 0xfe, 0x8a, ++ 0x57, 0x9d, 0xcf, 0x47, 0xfd, 0x6b, 0x33, 0x24, 0x3b, 0xfa, 0xc5, 0x57, ++ 0x0e, 0xfe, 0x67, 0xe2, 0x4a, 0xec, 0xd7, 0xfa, 0x5e, 0xe2, 0xc3, 0xdf, ++ 0x82, 0xef, 0xcf, 0x8e, 0xbe, 0x94, 0x8d, 0x7a, 0xdd, 0x09, 0x76, 0xd8, ++ 0x67, 0x0e, 0xcc, 0xe3, 0xec, 0xd0, 0x09, 0x98, 0xef, 0xbb, 0x36, 0xe3, ++ 0x48, 0x71, 0x1c, 0x1a, 0x82, 0x56, 0x89, 0x4d, 0x86, 0xe2, 0x2a, 0xdb, ++ 0xc2, 0xd6, 0x82, 0xbe, 0xab, 0xf1, 0xb6, 0xd4, 0xa2, 0x1e, 0xaa, 0xc9, ++ 0x5a, 0xa6, 0x63, 0x69, 0xa4, 0x8f, 0x44, 0xbe, 0x01, 0xb4, 0x2d, 0xfa, ++ 0x4b, 0x18, 0xdc, 0x03, 0xfe, 0xae, 0x7a, 0x3e, 0x8f, 0x7e, 0x18, 0xe6, ++ 0x3d, 0xe1, 0x39, 0x75, 0xaf, 0x1d, 0xe9, 0xd7, 0x79, 0x32, 0x1a, 0xd7, ++ 0x1d, 0x68, 0x93, 0x43, 0xe2, 0x99, 0x7b, 0x72, 0xb9, 0xdf, 0x7a, 0x4f, ++ 0x2e, 0x8f, 0xbf, 0xae, 0xb6, 0x9d, 0x8c, 0x56, 0xa0, 0x7d, 0x93, 0xe7, ++ 0x24, 0xc7, 0xb7, 0xd6, 0x47, 0xe7, 0x7e, 0x43, 0xc0, 0x03, 0x50, 0x12, ++ 0x9e, 0xbd, 0x32, 0x9d, 0xbb, 0xea, 0x6b, 0x0d, 0xe1, 0x5f, 0x9d, 0x6f, ++ 0x51, 0xae, 0x4c, 0xf3, 0xcd, 0xf3, 0x4e, 0x8e, 0xc2, 0x73, 0xf5, 0x78, ++ 0xf8, 0x7a, 0x65, 0xb9, 0x0a, 0xaf, 0xcf, 0x58, 0x51, 0x81, 0xfb, 0x3f, ++ 0x93, 0xbc, 0xb4, 0x40, 0x26, 0x3f, 0x0f, 0x14, 0x33, 0xea, 0xd5, 0xdb, ++ 0x17, 0xb4, 0x60, 0x7e, 0xa0, 0xc6, 0x23, 0xdb, 0x47, 0x8a, 0xb7, 0xea, ++ 0xc4, 0xbc, 0x5d, 0x3a, 0xce, 0x87, 0x6f, 0x65, 0xbc, 0xd2, 0x35, 0x0e, ++ 0xf8, 0xe3, 0x4c, 0xc9, 0x18, 0x1b, 0xe9, 0x7c, 0xd1, 0x6f, 0x65, 0x2e, ++ 0xf7, 0xc7, 0x8b, 0xf5, 0x8e, 0x0c, 0xb4, 0x0b, 0x3d, 0x66, 0x25, 0x0a, ++ 0xf9, 0xf8, 0x97, 0x25, 0xe9, 0x51, 0x48, 0xd7, 0x37, 0xb0, 0xc4, 0xfa, ++ 0x92, 0x7d, 0x7a, 0x07, 0x94, 0xd5, 0x6d, 0x7c, 0xbd, 0x1e, 0x4b, 0x77, ++ 0x34, 0xf2, 0x5b, 0x4f, 0x5b, 0x9e, 0x8c, 0x7e, 0x8b, 0x3a, 0x9f, 0x03, ++ 0xd7, 0x0d, 0xe6, 0xeb, 0x61, 0xba, 0xb9, 0x88, 0x4e, 0x95, 0xee, 0x66, ++ 0x33, 0xce, 0x13, 0xa0, 0x1f, 0xaf, 0x2f, 0xcb, 0xe5, 0xf9, 0xa2, 0x33, ++ 0xee, 0xf7, 0x16, 0xa3, 0x9f, 0xd2, 0x93, 0x15, 0x69, 0x45, 0xba, 0x74, ++ 0xe9, 0x19, 0xc5, 0xb7, 0x35, 0x40, 0x57, 0xb4, 0x07, 0x3d, 0x9d, 0x29, ++ 0xcd, 0x88, 0x07, 0x75, 0xbd, 0x32, 0x41, 0x8f, 0x81, 0x2c, 0x0d, 0xd1, ++ 0xd5, 0xef, 0xd5, 0x89, 0x7e, 0xcb, 0x5a, 0x58, 0x48, 0x3f, 0x1e, 0x3f, ++ 0x5f, 0xdd, 0x1f, 0xba, 0x1f, 0x8b, 0xfb, 0xc2, 0xbf, 0x2c, 0x43, 0xbb, ++ 0xf4, 0x02, 0xf8, 0xd5, 0x50, 0x5d, 0xab, 0x6b, 0x48, 0xc4, 0xf3, 0x7f, ++ 0xba, 0x3b, 0x74, 0x7f, 0x95, 0x02, 0xcf, 0xb5, 0x3a, 0x5f, 0x62, 0x62, ++ 0x10, 0xbf, 0xd6, 0x76, 0x0c, 0xcb, 0x8b, 0x99, 0xf8, 0xbb, 0x43, 0x95, ++ 0x0f, 0x85, 0xe8, 0xa9, 0xd2, 0xb1, 0x27, 0x8b, 0xfb, 0x6d, 0x3d, 0xc9, ++ 0x06, 0x37, 0xc6, 0x8b, 0xb5, 0x47, 0x5a, 0x88, 0xaf, 0x6f, 0xce, 0xef, ++ 0x74, 0xa7, 0xa1, 0x9f, 0x9f, 0xf2, 0x0f, 0x46, 0xca, 0x1b, 0xde, 0x2a, ++ 0x9e, 0x55, 0xfd, 0x80, 0xa0, 0xb8, 0x87, 0x61, 0x1c, 0xa7, 0x2b, 0x49, ++ 0x2f, 0xd0, 0x4c, 0x0a, 0xd8, 0xfb, 0xab, 0x36, 0xfb, 0x8e, 0xdc, 0x04, ++ 0x8c, 0x87, 0x4a, 0x29, 0xde, 0xeb, 0x61, 0x83, 0x2b, 0xd1, 0xf8, 0x3b, ++ 0xd1, 0x0f, 0x8e, 0x41, 0xbd, 0xfb, 0xa7, 0x67, 0x71, 0xdd, 0xa1, 0x36, ++ 0xf0, 0xf7, 0x60, 0x5d, 0xa7, 0xd1, 0x3b, 0xff, 0x63, 0xf0, 0xb3, 0x86, ++ 0xac, 0x20, 0x28, 0xb0, 0xef, 0xa1, 0xdd, 0x3a, 0xb7, 0x88, 0x4f, 0xcc, ++ 0xe8, 0x9f, 0xae, 0x14, 0xfe, 0xe9, 0xa7, 0x8a, 0xa3, 0x50, 0x06, 0xfb, ++ 0xea, 0x5c, 0xa7, 0xa1, 0xf3, 0xd5, 0x66, 0x47, 0x70, 0xbf, 0x56, 0xe8, ++ 0xc9, 0xcf, 0x8e, 0xa4, 0xdd, 0x87, 0xfc, 0x5a, 0x7b, 0x5a, 0xb6, 0x18, ++ 0xd1, 0x0f, 0x85, 0xb8, 0x85, 0xe0, 0x56, 0xee, 0x17, 0xd4, 0x79, 0xd2, ++ 0xfe, 0x75, 0x26, 0xfa, 0xdb, 0xad, 0x3a, 0xf2, 0x03, 0x54, 0xbf, 0xc3, ++ 0x29, 0xfc, 0x8e, 0x8b, 0xc2, 0x9f, 0xbd, 0xb8, 0x6e, 0x50, 0x4f, 0xfe, ++ 0xea, 0x71, 0x89, 0x3d, 0x03, 0xfb, 0xa8, 0xf4, 0x6e, 0xed, 0x4a, 0x81, ++ 0x76, 0x67, 0xf6, 0x7c, 0xf2, 0x57, 0x9d, 0x72, 0x2b, 0xe5, 0x1f, 0x57, ++ 0xed, 0x08, 0xf5, 0x0b, 0xaa, 0xdc, 0xa1, 0x70, 0xcd, 0xc1, 0x50, 0xd8, ++ 0x19, 0xe6, 0x37, 0xa8, 0x71, 0xdb, 0x89, 0xdc, 0xe1, 0xf8, 0x63, 0x0a, ++ 0xc6, 0x1f, 0x45, 0xf2, 0xcc, 0x24, 0x94, 0x83, 0xff, 0x12, 0xf4, 0x54, ++ 0xe3, 0x91, 0x47, 0xa7, 0x59, 0x93, 0x50, 0xde, 0x37, 0x69, 0x95, 0xf9, ++ 0x6a, 0x3e, 0x00, 0xf1, 0x54, 0x7f, 0xfc, 0x95, 0x2a, 0xdc, 0xaf, 0xbb, ++ 0x36, 0xc2, 0x4a, 0x71, 0xc1, 0xda, 0x63, 0x84, 0xcf, 0x81, 0x2f, 0x78, ++ 0xdc, 0x31, 0x90, 0xcc, 0xb8, 0x7f, 0xc4, 0x38, 0x5e, 0x07, 0xbc, 0x9c, ++ 0xbf, 0xeb, 0x75, 0x12, 0x8f, 0x33, 0x80, 0x5d, 0x69, 0x3e, 0xa3, 0xe4, ++ 0x5e, 0x07, 0x4d, 0x03, 0xae, 0xa1, 0x68, 0xd2, 0x4b, 0x8c, 0x95, 0xa0, ++ 0x3c, 0xac, 0x59, 0xca, 0xe3, 0x48, 0x3b, 0xe6, 0x5c, 0xa1, 0xdc, 0xa5, ++ 0xca, 0x41, 0x98, 0xbd, 0xbc, 0x5b, 0xdb, 0x27, 0xc7, 0x06, 0xe9, 0x87, ++ 0x0b, 0xb9, 0xdc, 0xdf, 0x9c, 0xab, 0x67, 0x0e, 0xb4, 0x53, 0x8f, 0x46, ++ 0x59, 0xc9, 0x6e, 0x4d, 0x34, 0x72, 0x7f, 0xbb, 0xe8, 0x71, 0x8f, 0x0d, ++ 0xf9, 0x60, 0x22, 0xc4, 0xc7, 0x86, 0xa0, 0x7c, 0xf6, 0x44, 0xf3, 0xa0, ++ 0x84, 0xfd, 0xf6, 0x3f, 0x01, 0x21, 0x6e, 0x4e, 0x20, 0xbe, 0x5f, 0xa8, ++ 0xb5, 0xe8, 0x62, 0x83, 0xec, 0x1e, 0x63, 0xeb, 0xa8, 0xbf, 0x3a, 0x3f, ++ 0x68, 0x12, 0x3e, 0xfe, 0x56, 0xf3, 0x5b, 0x60, 0x7e, 0x73, 0x60, 0x7e, ++ 0xc0, 0x77, 0x0c, 0xe2, 0xfb, 0xf3, 0x7c, 0x2b, 0xd9, 0xe3, 0xd4, 0x85, ++ 0x8c, 0x75, 0x93, 0x3c, 0x36, 0x90, 0x3c, 0xaa, 0xe7, 0xb9, 0x0a, 0x7c, ++ 0x36, 0x17, 0xf8, 0x0c, 0x73, 0x26, 0x48, 0xb7, 0xda, 0xdd, 0xaf, 0x53, ++ 0x1e, 0xd8, 0xc9, 0xba, 0x29, 0x1e, 0x29, 0x8e, 0xe6, 0xfb, 0x28, 0xc6, ++ 0xfd, 0x20, 0x1c, 0xc1, 0xcb, 0xbf, 0xe4, 0x72, 0x3b, 0x7c, 0x57, 0x1e, ++ 0xc7, 0x5b, 0x83, 0x28, 0x55, 0xbd, 0x75, 0x34, 0xcf, 0xfe, 0xd7, 0x5c, ++ 0x80, 0xb7, 0xe7, 0x39, 0x34, 0x79, 0xa4, 0xcf, 0x2c, 0xc4, 0x97, 0x8f, ++ 0x0a, 0x5e, 0x01, 0x3f, 0x25, 0xa9, 0x6f, 0x04, 0xbd, 0xbb, 0xe6, 0x8f, ++ 0x3c, 0xae, 0xfa, 0x1c, 0xe4, 0x00, 0xe5, 0xfc, 0xc1, 0x06, 0x49, 0xc9, ++ 0x08, 0xf1, 0x83, 0x38, 0x7f, 0xd7, 0xf3, 0x2a, 0xd6, 0xcf, 0x3c, 0xbd, ++ 0x33, 0x11, 0x0f, 0x2e, 0x7b, 0x77, 0x56, 0x22, 0xc6, 0x51, 0x5c, 0xae, ++ 0x96, 0xaf, 0x35, 0x29, 0x19, 0x41, 0x7c, 0x5a, 0x8f, 0x7c, 0x0e, 0x78, ++ 0xa9, 0xb4, 0x54, 0xfd, 0x10, 0xfd, 0x6e, 0xc7, 0xda, 0x44, 0x05, 0xf3, ++ 0xfd, 0xf5, 0xc8, 0xf7, 0x93, 0x10, 0x8d, 0x9c, 0xaf, 0xe3, 0xe1, 0x1f, ++ 0xc6, 0x17, 0x37, 0xf1, 0xb9, 0x27, 0x14, 0x86, 0xbf, 0xdd, 0xc8, 0x5f, ++ 0x75, 0xcc, 0x60, 0x45, 0x3b, 0x52, 0xef, 0x0d, 0x6f, 0xb7, 0x6a, 0x31, ++ 0xaf, 0xa3, 0xe4, 0x0d, 0xfb, 0xd1, 0x24, 0x07, 0xa9, 0x82, 0x2f, 0x9b, ++ 0x1d, 0x92, 0x1b, 0xf5, 0x7e, 0xf3, 0x75, 0x2d, 0xcf, 0x63, 0x95, 0x49, ++ 0x94, 0xb7, 0xba, 0x1f, 0x2a, 0x91, 0x2f, 0xe9, 0x0f, 0xfb, 0x55, 0xce, ++ 0x72, 0xe3, 0xfc, 0xf7, 0x03, 0x88, 0xf1, 0x10, 0xdb, 0x16, 0x4f, 0x72, ++ 0x43, 0x8d, 0xa0, 0x47, 0x7e, 0x22, 0xce, 0x7b, 0xbf, 0xd6, 0xf7, 0x3a, ++ 0xca, 0xf1, 0x29, 0x9d, 0x27, 0x0d, 0xf3, 0x29, 0xa7, 0x9c, 0x46, 0x2b, ++ 0xce, 0xbf, 0x94, 0x81, 0xc3, 0x01, 0xfa, 0xa5, 0x8c, 0x75, 0x53, 0xd9, ++ 0x1b, 0x59, 0xd7, 0xee, 0xa3, 0xc9, 0x5d, 0x13, 0x30, 0x6e, 0xfe, 0xc0, ++ 0x61, 0xa0, 0x3c, 0x4e, 0xf3, 0xfa, 0xbd, 0x51, 0xa8, 0x4f, 0x73, 0xd8, ++ 0x7a, 0xcb, 0xc5, 0x2c, 0x34, 0xee, 0xec, 0xe0, 0x8d, 0xbc, 0xd1, 0xfd, ++ 0x0a, 0x60, 0x24, 0x76, 0x51, 0xa5, 0x0b, 0xe5, 0x85, 0xb6, 0x88, 0x38, ++ 0x94, 0xd3, 0x75, 0x7b, 0x9e, 0xfd, 0xee, 0xbc, 0x82, 0xd1, 0xc7, 0xd7, ++ 0xbc, 0xdf, 0x7e, 0x2f, 0x86, 0x14, 0x35, 0x3f, 0x6b, 0xd1, 0x27, 0x71, ++ 0xb6, 0xe9, 0xce, 0x2a, 0x0c, 0xd0, 0xaf, 0x9e, 0x79, 0xb2, 0x70, 0xbf, ++ 0x2a, 0xbd, 0x86, 0xe9, 0x07, 0x7b, 0x1e, 0x0f, 0x78, 0x58, 0xc2, 0x06, ++ 0x0b, 0x31, 0xae, 0x51, 0xe9, 0x66, 0x84, 0x7f, 0x23, 0xd1, 0x4d, 0xc5, ++ 0x67, 0xaa, 0x6e, 0xf0, 0xc7, 0x88, 0x32, 0xb0, 0x4b, 0xa4, 0x5f, 0xc2, ++ 0xe9, 0xa9, 0xe2, 0xb7, 0x8e, 0x35, 0xe8, 0x78, 0x9e, 0xab, 0xe1, 0xdd, ++ 0xa5, 0xd0, 0xff, 0x81, 0xf5, 0x1a, 0x05, 0xfd, 0xc3, 0x9b, 0xe8, 0x7b, ++ 0x0b, 0x3a, 0xf8, 0x4c, 0xbc, 0xc9, 0x17, 0x25, 0x51, 0xbc, 0x39, 0x1a, ++ 0x5d, 0x54, 0x7a, 0xa8, 0xf4, 0x39, 0x1b, 0xcb, 0xc7, 0x9d, 0x7d, 0x50, ++ 0xa6, 0x3c, 0xdd, 0xff, 0x6b, 0xba, 0x1c, 0xcd, 0x73, 0x3c, 0xf6, 0x6d, ++ 0xf2, 0x18, 0x2e, 0x7f, 0xa3, 0xc9, 0xdb, 0xf2, 0xb5, 0x61, 0x72, 0x19, ++ 0x26, 0x7f, 0x2a, 0xbd, 0x1c, 0x6b, 0xa3, 0x49, 0xce, 0x54, 0x3a, 0xd6, ++ 0x2a, 0x8c, 0xe2, 0xd6, 0xda, 0xce, 0x28, 0xab, 0x9b, 0x05, 0xe8, 0x67, ++ 0x86, 0x7f, 0x48, 0x3f, 0xbc, 0xa7, 0xa0, 0x7c, 0x4c, 0x9b, 0xc4, 0x76, ++ 0x49, 0xdf, 0x45, 0x0e, 0xfb, 0xe8, 0x5e, 0x23, 0x9c, 0x3e, 0xc0, 0x1b, ++ 0x76, 0xd4, 0xeb, 0x5b, 0xf2, 0x42, 0xed, 0x90, 0x4a, 0xb7, 0xd1, 0xf4, ++ 0x8f, 0xaa, 0xbf, 0xce, 0x31, 0xdf, 0x29, 0x8b, 0x44, 0xf7, 0x03, 0x5c, ++ 0x3e, 0x7f, 0x6e, 0x70, 0xe3, 0xfd, 0xa2, 0x7a, 0x3f, 0xa0, 0xde, 0x03, ++ 0x78, 0x84, 0xde, 0x0b, 0x2f, 0xcf, 0x81, 0xdf, 0x81, 0xf7, 0x2e, 0x9b, ++ 0xb3, 0x7a, 0x12, 0xd0, 0x5f, 0xeb, 0xd5, 0xab, 0xf3, 0xf0, 0xfb, 0xc7, ++ 0x73, 0xeb, 0xba, 0x27, 0xac, 0x86, 0xf1, 0xe7, 0x66, 0xf1, 0xb2, 0x17, ++ 0xfd, 0xb4, 0x20, 0xd8, 0x1e, 0xc1, 0xf3, 0x70, 0xe7, 0xc6, 0x1a, 0x5c, ++ 0x88, 0xb7, 0x73, 0xd2, 0x94, 0xd9, 0x68, 0xc7, 0xcf, 0x49, 0xff, 0x70, ++ 0x2f, 0x87, 0x93, 0xf4, 0x0a, 0xc2, 0x4b, 0x93, 0x66, 0x5b, 0x00, 0xee, ++ 0xd5, 0xa9, 0x79, 0xbb, 0x5f, 0x0a, 0x3d, 0xec, 0xe6, 0xfb, 0x58, 0x3a, ++ 0x7d, 0x2e, 0xf5, 0x93, 0xd8, 0x9b, 0x88, 0x0f, 0x45, 0x62, 0xa5, 0xb4, ++ 0x8e, 0x24, 0xc5, 0x95, 0xc0, 0x7e, 0xce, 0xfd, 0x6c, 0x72, 0x6e, 0x13, ++ 0x0b, 0x9c, 0xff, 0x37, 0x79, 0x3c, 0xaf, 0xf3, 0x82, 0x38, 0xc7, 0x70, ++ 0x1e, 0xfb, 0x1f, 0x25, 0xca, 0x63, 0x2f, 0x07, 0x13, 0x60, 0xc1, 0x7c, ++ 0xfb, 0xec, 0xe7, 0x4a, 0x26, 0x41, 0xfd, 0xf9, 0x7f, 0x4a, 0xb7, 0xd1, ++ 0xfd, 0xdf, 0x9a, 0xd0, 0xf5, 0xd1, 0x8e, 0xa6, 0x51, 0x7e, 0x70, 0x2b, ++ 0xcd, 0x77, 0xf7, 0xd7, 0x83, 0xba, 0x15, 0xd9, 0x81, 0x7d, 0x0d, 0xdb, ++ 0xbf, 0xb9, 0xd7, 0x78, 0x7d, 0xc5, 0x64, 0x8a, 0x27, 0x2a, 0x05, 0x0d, ++ 0xed, 0x71, 0x53, 0x78, 0x1c, 0xeb, 0x4e, 0x8f, 0x41, 0x7b, 0xa4, 0xda, ++ 0xa7, 0xa1, 0xd3, 0xaf, 0x98, 0x83, 0xf3, 0x97, 0x97, 0xc1, 0x7e, 0x31, ++ 0x7d, 0x10, 0x3c, 0xe5, 0xe9, 0xd4, 0x60, 0xfb, 0xf6, 0xfa, 0x81, 0x5f, ++ 0x67, 0xe2, 0x3c, 0x95, 0x7a, 0x57, 0x8e, 0x15, 0xea, 0x2f, 0x35, 0x3f, ++ 0x9f, 0x8a, 0x7e, 0x40, 0xe5, 0x81, 0x5f, 0x65, 0x92, 0x5f, 0x7a, 0x60, ++ 0x53, 0x26, 0xc6, 0x17, 0x95, 0x7b, 0x7f, 0x9d, 0x69, 0x27, 0x38, 0xd2, ++ 0x41, 0xf1, 0x8d, 0x96, 0x9f, 0xbb, 0xff, 0xf0, 0x9d, 0xfb, 0x36, 0x07, ++ 0xf9, 0xc1, 0xab, 0x0a, 0xb8, 0x7f, 0x5e, 0x66, 0x7c, 0xbd, 0x08, 0xfd, ++ 0xd3, 0xf9, 0x53, 0x3f, 0x7b, 0x12, 0xf3, 0xe1, 0x93, 0xff, 0x49, 0xa2, ++ 0xbc, 0xd8, 0x83, 0xac, 0xfb, 0x49, 0xb4, 0x9b, 0xe5, 0x59, 0x5c, 0x8e, ++ 0xd8, 0x36, 0x23, 0xe9, 0x75, 0x98, 0x8f, 0xee, 0x1d, 0x5b, 0xa6, 0xfc, ++ 0x68, 0x3f, 0xea, 0xf3, 0x33, 0x59, 0x1f, 0xe9, 0x2a, 0xa0, 0xdf, 0x57, ++ 0x79, 0x5a, 0x9a, 0xaf, 0x9c, 0xb9, 0x9f, 0x4a, 0xc2, 0x7c, 0xd8, 0x46, ++ 0x89, 0xf2, 0x61, 0x81, 0xfe, 0x13, 0xe8, 0x1e, 0x73, 0xc5, 0x7a, 0x49, ++ 0x9f, 0x1c, 0x8f, 0xf6, 0x30, 0xd6, 0x26, 0x2b, 0x38, 0x2e, 0x96, 0xf0, ++ 0xf8, 0xd0, 0x46, 0x5b, 0x17, 0xd6, 0x97, 0x3f, 0xce, 0xeb, 0xe7, 0x1b, ++ 0xdc, 0x6d, 0x3d, 0x38, 0xcf, 0x73, 0x7a, 0x6b, 0x8b, 0x82, 0x13, 0x95, ++ 0x4e, 0x2a, 0x0d, 0xba, 0x17, 0xfe, 0x2a, 0x4f, 0x4f, 0xe3, 0x96, 0x3f, ++ 0x25, 0x91, 0x3f, 0xae, 0xae, 0x33, 0xf9, 0xd9, 0xc4, 0xe6, 0xe0, 0x73, ++ 0x7e, 0x95, 0x27, 0xe2, 0xec, 0xc1, 0xff, 0x20, 0xfd, 0x76, 0x9f, 0xa0, ++ 0xcb, 0x0f, 0x1f, 0x7f, 0xef, 0xcd, 0x64, 0x05, 0xef, 0x93, 0x1c, 0xd7, ++ 0x51, 0x8f, 0xbc, 0xbb, 0xfd, 0x62, 0x06, 0xea, 0xaf, 0xb9, 0x71, 0x97, ++ 0xb3, 0x91, 0xcf, 0x27, 0xeb, 0x1d, 0xbb, 0xaa, 0xf0, 0xdc, 0x7b, 0x0d, ++ 0x94, 0x3f, 0xcc, 0xcf, 0x49, 0x91, 0x93, 0xa0, 0x7f, 0xee, 0x63, 0xb3, ++ 0x9e, 0xc1, 0x72, 0xf9, 0xe3, 0x2b, 0x76, 0x55, 0x61, 0x1e, 0x74, 0x87, ++ 0x91, 0xe2, 0x28, 0x75, 0x7f, 0x6b, 0x24, 0x45, 0x83, 0xf1, 0xe6, 0xc9, ++ 0xe6, 0x9f, 0x3e, 0x84, 0x78, 0xbb, 0xb4, 0xdd, 0x48, 0x7e, 0xf4, 0x9a, ++ 0xe6, 0xdb, 0x92, 0xd8, 0x08, 0x72, 0xaa, 0x96, 0x2f, 0x02, 0xfd, 0x95, ++ 0x4c, 0xc6, 0x0e, 0x35, 0x1a, 0xa9, 0x7c, 0xa9, 0xd1, 0xc2, 0x14, 0x38, ++ 0xe2, 0xe1, 0xc6, 0x64, 0x82, 0x7f, 0xd7, 0xa8, 0x50, 0xc9, 0x96, 0x70, ++ 0xfe, 0x5a, 0x23, 0xe2, 0xd5, 0xd1, 0xe6, 0xcb, 0x83, 0x78, 0x5f, 0x01, ++ 0x7d, 0x95, 0xbf, 0x11, 0xe6, 0x03, 0x7f, 0xd3, 0x66, 0xb2, 0x27, 0xe5, ++ 0xc3, 0x39, 0x27, 0xdf, 0xee, 0xdc, 0xbb, 0x49, 0x9c, 0x6b, 0x32, 0x8c, ++ 0xb7, 0xb9, 0xd2, 0xe6, 0x20, 0x1e, 0xf2, 0x37, 0xad, 0xee, 0x42, 0x57, ++ 0x54, 0xce, 0xe7, 0xf1, 0xd1, 0xdb, 0x3d, 0x1b, 0x53, 0xc9, 0x8f, 0x7e, ++ 0xfc, 0xc2, 0x9e, 0x2a, 0x68, 0xbf, 0x37, 0xbf, 0x54, 0xc1, 0xf1, 0xc6, ++ 0xdd, 0xd7, 0x28, 0xce, 0x3f, 0xd9, 0xf1, 0xab, 0x72, 0xca, 0xeb, 0xef, ++ 0x35, 0xf0, 0xf3, 0x89, 0x73, 0x5f, 0xda, 0x9e, 0x99, 0xb4, 0x0b, 0xf3, ++ 0xae, 0x6f, 0xe9, 0x28, 0xfe, 0xae, 0xdf, 0x7d, 0x61, 0xcf, 0x26, 0x28, ++ 0x1f, 0x7e, 0x6a, 0xb5, 0x3e, 0x98, 0xdf, 0xbf, 0xeb, 0x79, 0x53, 0xc5, ++ 0x7e, 0x6e, 0x25, 0x57, 0xa3, 0xe1, 0xe1, 0xfb, 0xcb, 0xd5, 0xaf, 0x53, ++ 0x49, 0x7e, 0xf6, 0x82, 0x5c, 0x65, 0xff, 0xed, 0x72, 0x55, 0xff, 0xf8, ++ 0x3a, 0xc2, 0xdf, 0x63, 0xf9, 0xa5, 0xf7, 0xe4, 0x03, 0x9f, 0x5e, 0xd2, ++ 0xb9, 0x52, 0x51, 0x9e, 0x2e, 0x4d, 0xb9, 0x8b, 0xf8, 0xdc, 0x75, 0x5c, ++ 0x22, 0xfc, 0xab, 0x7a, 0x5c, 0x1d, 0x5f, 0x84, 0xe7, 0xc5, 0xfb, 0x54, ++ 0x8d, 0xe7, 0x29, 0xf2, 0x07, 0x85, 0x1e, 0xff, 0x12, 0x22, 0x3f, 0xc4, ++ 0xef, 0xeb, 0x1d, 0x9f, 0x66, 0xa2, 0x3f, 0xfc, 0xa5, 0x77, 0xe9, 0xb7, ++ 0x9e, 0xfb, 0x68, 0x23, 0xde, 0xa0, 0x63, 0x5e, 0xcb, 0x48, 0x65, 0x78, ++ 0x7b, 0xa1, 0xde, 0x91, 0x6e, 0x85, 0xf3, 0x15, 0x6a, 0xb8, 0x1f, 0x1c, ++ 0xde, 0x5e, 0x2f, 0xee, 0xe7, 0xd4, 0xfb, 0x76, 0xfc, 0xc3, 0xbc, 0x70, ++ 0xad, 0xb0, 0x9f, 0x4e, 0xd8, 0x58, 0x4c, 0x1c, 0xda, 0x3f, 0xc9, 0x17, ++ 0x91, 0x83, 0xf7, 0x1c, 0xf7, 0x5c, 0xd6, 0x62, 0xfc, 0x05, 0x71, 0xdd, ++ 0x87, 0xa1, 0xfe, 0x25, 0xfb, 0x30, 0xc8, 0x8e, 0x8f, 0xb6, 0xdf, 0x5b, ++ 0x95, 0x75, 0x38, 0x8f, 0x36, 0xa0, 0x77, 0xa7, 0x9f, 0xd5, 0x30, 0x5f, ++ 0x90, 0xdd, 0xbe, 0xb3, 0x2f, 0x82, 0xf9, 0x82, 0xd6, 0x1d, 0x8e, 0x3b, ++ 0xa0, 0x4e, 0x8f, 0xf7, 0x2c, 0x1d, 0x63, 0x49, 0x2f, 0x20, 0xdd, 0xf0, ++ 0x5e, 0xc6, 0xdf, 0x31, 0x65, 0x2f, 0xc2, 0x97, 0xf5, 0x9c, 0x8e, 0xfe, ++ 0xa3, 0x10, 0x5f, 0xf1, 0xbc, 0x0a, 0x93, 0x0b, 0x03, 0xe7, 0xbc, 0xdc, ++ 0xd1, 0x9f, 0x83, 0x7a, 0x36, 0xfc, 0xbc, 0x75, 0xc7, 0xfa, 0x89, 0x3f, ++ 0x6a, 0xbd, 0xbf, 0xba, 0x26, 0xd1, 0xf9, 0xe7, 0x5d, 0xd6, 0xe6, 0xdc, ++ 0xfa, 0xfc, 0xaf, 0x1f, 0xe8, 0xcf, 0x41, 0xfa, 0x5d, 0xd6, 0xf5, 0x15, ++ 0x62, 0x1c, 0xe5, 0xd7, 0xf7, 0xe5, 0x20, 0x1d, 0xea, 0x5e, 0xe3, 0xfa, ++ 0xfc, 0xfb, 0xe2, 0x41, 0xad, 0xaf, 0xda, 0xa8, 0xe7, 0xf9, 0x3d, 0xc9, ++ 0x42, 0xf1, 0x60, 0x91, 0x7c, 0x95, 0xe2, 0x78, 0xff, 0x69, 0x1e, 0xc7, ++ 0xd7, 0x75, 0xec, 0x23, 0x7d, 0x3a, 0xd4, 0xc9, 0xf3, 0x29, 0xf5, 0x9a, ++ 0xee, 0xe2, 0x24, 0xcc, 0x3f, 0x34, 0x5c, 0xe8, 0x42, 0x7d, 0x36, 0x94, ++ 0xcc, 0xe3, 0x2b, 0x98, 0xdf, 0x8e, 0x78, 0x9b, 0x99, 0x2e, 0xec, 0xa0, ++ 0x76, 0x30, 0x75, 0x21, 0xe8, 0xb5, 0xdf, 0x0d, 0xf3, 0x03, 0x8f, 0xeb, ++ 0x2e, 0xa1, 0xfc, 0xea, 0x71, 0x1e, 0x4f, 0x2d, 0xbd, 0x47, 0xca, 0x89, ++ 0x64, 0xe8, 0x57, 0x5c, 0x41, 0x79, 0x86, 0xfa, 0xf2, 0xb5, 0x69, 0x1b, ++ 0x90, 0xcf, 0x2f, 0xb9, 0x13, 0x30, 0x13, 0xc4, 0xde, 0xce, 0xf9, 0x73, ++ 0x1d, 0xe5, 0xdf, 0x4e, 0x44, 0x5a, 0x64, 0xf2, 0x5b, 0xa1, 0x36, 0x88, ++ 0x7e, 0xc3, 0xe7, 0x70, 0xcb, 0xfc, 0xe1, 0x0c, 0x53, 0xe3, 0xf4, 0x48, ++ 0x66, 0x0f, 0xea, 0x57, 0xaf, 0x57, 0xee, 0xa3, 0xf8, 0xf8, 0x0c, 0xbf, ++ 0x27, 0xab, 0xbf, 0x9d, 0xcb, 0x13, 0x3b, 0xc6, 0xe5, 0xc9, 0xb9, 0xfe, ++ 0x75, 0x7d, 0x72, 0xd0, 0x7c, 0xcf, 0x0b, 0x79, 0x52, 0xfd, 0xc7, 0xf9, ++ 0x27, 0xfe, 0x4c, 0x72, 0xd9, 0x61, 0xb3, 0x77, 0xa0, 0x3e, 0x8b, 0x44, ++ 0x5d, 0x88, 0xf3, 0x25, 0xc7, 0xb8, 0x25, 0x49, 0xf4, 0x2b, 0x0c, 0xdc, ++ 0x03, 0x9a, 0x3b, 0x45, 0x3c, 0x5e, 0x22, 0x53, 0x7b, 0xbd, 0x57, 0x66, ++ 0x63, 0x71, 0x4c, 0x72, 0x14, 0xdd, 0xd7, 0x97, 0xb0, 0x2d, 0x5a, 0xf4, ++ 0x77, 0xe7, 0x33, 0xcf, 0x4c, 0xfe, 0x4e, 0xa6, 0xef, 0x5f, 0x7e, 0x00, ++ 0xed, 0x0b, 0x4e, 0xc8, 0x79, 0xf8, 0x1e, 0x0b, 0xfc, 0x67, 0xba, 0x3f, ++ 0x2e, 0x8e, 0x70, 0x64, 0xac, 0x41, 0xff, 0x48, 0x23, 0x09, 0xbc, 0x7a, ++ 0xf2, 0x17, 0x06, 0xdb, 0x33, 0xf1, 0xce, 0x63, 0xa6, 0x2c, 0x91, 0x1d, ++ 0x1b, 0x1c, 0x1b, 0x49, 0x7e, 0xca, 0xbc, 0x25, 0xce, 0x32, 0xdc, 0xaf, ++ 0xda, 0xaf, 0x44, 0xcb, 0xfb, 0xc1, 0x3c, 0xe4, 0x67, 0x31, 0xf7, 0x60, ++ 0x0e, 0xde, 0x67, 0x32, 0xdf, 0x60, 0x0e, 0xde, 0x73, 0xaa, 0xfd, 0x16, ++ 0x9f, 0x88, 0x6c, 0x20, 0xbb, 0xc8, 0x3c, 0xf9, 0x8b, 0x83, 0xd6, 0x31, ++ 0x14, 0xf0, 0x7c, 0xe5, 0xe7, 0x78, 0xff, 0x0c, 0xfa, 0xa4, 0x5e, 0xdc, ++ 0x7f, 0x16, 0xc9, 0xd7, 0x9f, 0xc5, 0x38, 0x6a, 0xcd, 0x71, 0x7e, 0x4f, ++ 0xd8, 0xab, 0x49, 0xfb, 0x00, 0xdf, 0x6b, 0xb9, 0x00, 0xcf, 0x48, 0xd7, ++ 0x7e, 0xa0, 0xab, 0x1d, 0xed, 0x8f, 0x83, 0xd9, 0xed, 0x28, 0x3f, 0xd3, ++ 0x12, 0xdc, 0x28, 0x3f, 0xf5, 0x87, 0x25, 0x86, 0xef, 0xd6, 0xea, 0x3a, ++ 0x0c, 0x7b, 0x31, 0xaf, 0x53, 0xa7, 0xeb, 0x4b, 0x44, 0x7e, 0xde, 0xe4, ++ 0x7d, 0x5f, 0x8f, 0xfc, 0x5c, 0xdf, 0xfe, 0x9e, 0x5e, 0x99, 0x86, 0xe3, ++ 0x79, 0x1e, 0x08, 0xfc, 0x75, 0x0d, 0xe2, 0xb7, 0x5e, 0xd8, 0x2f, 0xa7, ++ 0xf7, 0xb6, 0x0f, 0x30, 0xef, 0xe6, 0x3c, 0xcd, 0xad, 0xa8, 0x53, 0xfb, ++ 0x1e, 0xc5, 0xf5, 0x35, 0x6d, 0x47, 0x28, 0x7e, 0xaf, 0x65, 0x3e, 0x8a, ++ 0xdf, 0x6b, 0x5b, 0x43, 0xf9, 0x65, 0x28, 0x99, 0xe7, 0xd9, 0xc3, 0xe5, ++ 0xc3, 0x50, 0xa0, 0x84, 0xc8, 0xc5, 0xbc, 0x1d, 0x5c, 0x2e, 0x16, 0xcb, ++ 0xac, 0x01, 0xf5, 0x1c, 0x13, 0x79, 0xd3, 0x79, 0xc9, 0x49, 0xe4, 0x8f, ++ 0x04, 0xc6, 0x09, 0x3f, 0x51, 0xee, 0x7f, 0x12, 0xfd, 0x97, 0x81, 0x49, ++ 0x92, 0x55, 0x82, 0xa9, 0x06, 0x22, 0x5c, 0xeb, 0xd1, 0x2f, 0x72, 0x65, ++ 0x72, 0x7f, 0x66, 0xe0, 0xf7, 0x2f, 0xe5, 0xaf, 0x24, 0xbd, 0xe2, 0xce, ++ 0xff, 0x31, 0xbe, 0x8b, 0x11, 0xfe, 0xee, 0xbc, 0x8d, 0x5b, 0xb5, 0x72, ++ 0xd0, 0x7e, 0xe6, 0x75, 0xf2, 0x3c, 0xe1, 0x40, 0x04, 0xab, 0x3c, 0x4a, ++ 0xf4, 0x76, 0x8c, 0x47, 0x3a, 0x44, 0xe6, 0x96, 0x9a, 0x0a, 0x0a, 0x48, ++ 0xae, 0x72, 0xe8, 0x9d, 0x8f, 0x86, 0xe7, 0x35, 0xc3, 0xcf, 0xb1, 0x59, ++ 0xe4, 0x25, 0xce, 0x60, 0x9e, 0x27, 0x3b, 0xb0, 0xef, 0x05, 0x29, 0x29, ++ 0x5c, 0x8f, 0x31, 0x37, 0xf1, 0x4f, 0x97, 0x86, 0xaf, 0xaf, 0xbe, 0x7b, ++ 0x51, 0xc7, 0x97, 0x8b, 0xf3, 0x0c, 0xc7, 0x43, 0x12, 0xcf, 0x4f, 0x8d, ++ 0xa6, 0x57, 0xf0, 0x1e, 0xa5, 0x42, 0xdc, 0xa3, 0x54, 0x88, 0x7b, 0x94, ++ 0x0a, 0x71, 0x8f, 0x52, 0x21, 0xee, 0x51, 0x2a, 0xc4, 0x3d, 0x4a, 0x85, ++ 0xb8, 0x47, 0xa9, 0x10, 0xf7, 0x28, 0x15, 0xe2, 0x1e, 0xa5, 0x42, 0xdc, ++ 0xa3, 0x54, 0x88, 0x7b, 0x14, 0xac, 0x3f, 0x83, 0x5b, 0xa5, 0xf7, 0x72, ++ 0x3b, 0x77, 0xa1, 0xfd, 0xec, 0x42, 0x19, 0x1b, 0x17, 0x80, 0x7b, 0xe3, ++ 0xc2, 0xe0, 0x71, 0xa1, 0xfd, 0x7b, 0xe3, 0xa4, 0x50, 0x78, 0x9c, 0x44, ++ 0xfd, 0x6d, 0xed, 0x3b, 0x77, 0xb9, 0xb2, 0x31, 0x8f, 0x69, 0x11, 0xf2, ++ 0xad, 0x44, 0xa1, 0xff, 0x75, 0xc9, 0xc4, 0xf3, 0x4b, 0x1d, 0x51, 0x8e, ++ 0xe9, 0x05, 0x80, 0xbf, 0x8a, 0x79, 0x4d, 0x07, 0xf8, 0x7b, 0x44, 0x3b, ++ 0xbd, 0x67, 0x99, 0x1b, 0xb7, 0xb4, 0x0c, 0xe5, 0x6b, 0x28, 0xde, 0xc0, ++ 0x48, 0x0f, 0x15, 0x38, 0xee, 0x46, 0x7a, 0x9c, 0x3e, 0x3d, 0x27, 0x63, ++ 0x2b, 0xe9, 0x47, 0x93, 0x15, 0xef, 0xb9, 0x7b, 0x1f, 0x98, 0x1a, 0x43, ++ 0x79, 0xb9, 0xb7, 0x64, 0x26, 0xc3, 0x92, 0xb3, 0xb2, 0xf2, 0xd6, 0xe7, ++ 0x03, 0x3c, 0xcb, 0x2c, 0x11, 0xdf, 0x82, 0x9e, 0xb8, 0xa3, 0x54, 0x8d, ++ 0x27, 0x61, 0x9e, 0x39, 0x9d, 0xfc, 0x3e, 0xa3, 0x48, 0xae, 0xad, 0xc0, ++ 0xf9, 0xd7, 0x8c, 0x35, 0xe5, 0xa1, 0xde, 0xfd, 0x2c, 0xd7, 0x51, 0x82, ++ 0xfb, 0x50, 0xf1, 0x5c, 0x3c, 0x6e, 0x55, 0x06, 0xfa, 0x41, 0x5d, 0x3a, ++ 0xe5, 0x03, 0xcc, 0xa7, 0xba, 0xfe, 0xa8, 0x63, 0x18, 0x47, 0xa9, 0xf9, ++ 0x37, 0xb5, 0xdf, 0xc9, 0xdc, 0x59, 0x8b, 0x71, 0xdc, 0xbc, 0xac, 0xf4, ++ 0xf5, 0xb9, 0xa8, 0x6f, 0x40, 0xb8, 0x50, 0xbf, 0xd9, 0xf5, 0xac, 0x15, ++ 0xf7, 0x65, 0xd7, 0x44, 0x4a, 0x4d, 0xa4, 0xaf, 0x14, 0x2d, 0xca, 0xff, ++ 0xe2, 0x02, 0xce, 0x2f, 0xb3, 0x15, 0xee, 0x0f, 0xfb, 0xf4, 0x8a, 0x36, ++ 0x0e, 0xe3, 0xf6, 0x88, 0x59, 0xf1, 0x2e, 0x85, 0xdf, 0x57, 0x55, 0x88, ++ 0xfb, 0xaa, 0x0a, 0x71, 0x5f, 0x85, 0xf4, 0x79, 0x07, 0xf3, 0x66, 0x50, ++ 0xbe, 0x0b, 0xf5, 0x58, 0x76, 0x43, 0x3d, 0x96, 0xe1, 0xef, 0xb9, 0x9e, ++ 0xc9, 0x2f, 0x75, 0x14, 0x50, 0xbc, 0x3d, 0x98, 0x1a, 0xfc, 0x1e, 0x6c, ++ 0x3e, 0xca, 0x15, 0xd7, 0x33, 0xa9, 0xc8, 0xcf, 0xcf, 0x09, 0xbe, 0x4d, ++ 0x10, 0x7a, 0xe6, 0x64, 0x5e, 0xe9, 0x2a, 0x3e, 0xce, 0x43, 0xf3, 0xd4, ++ 0x88, 0xfc, 0x5b, 0xbf, 0x2e, 0xf4, 0x1e, 0x4f, 0x1d, 0x17, 0x18, 0xcf, ++ 0xa8, 0x5c, 0x74, 0x07, 0xd7, 0xcf, 0x2c, 0x46, 0xcf, 0xdf, 0xbb, 0x8e, ++ 0x67, 0x2e, 0x7c, 0x4f, 0xbb, 0xe8, 0xd5, 0xb1, 0x94, 0x4f, 0xf2, 0xbb, ++ 0x35, 0x2e, 0x5d, 0x0c, 0xc0, 0x20, 0xe3, 0xa8, 0xbf, 0xd8, 0xab, 0x3c, ++ 0xbe, 0x65, 0xc9, 0x5c, 0x5e, 0x16, 0xbd, 0x92, 0x44, 0xfd, 0x9a, 0x44, ++ 0x1e, 0xd4, 0x19, 0xd7, 0x9d, 0x19, 0x87, 0x76, 0x57, 0xc8, 0x95, 0x0a, ++ 0x1f, 0xfd, 0x2b, 0x7f, 0xe7, 0xe3, 0xcc, 0x05, 0x18, 0xca, 0xd7, 0x24, ++ 0x7e, 0x3e, 0xe7, 0xa2, 0xee, 0xcc, 0x58, 0x80, 0xfd, 0x92, 0x49, 0x83, ++ 0xf9, 0x71, 0xe7, 0x5e, 0xde, 0xde, 0x23, 0xe4, 0xce, 0x39, 0x49, 0xcc, ++ 0x27, 0xce, 0xc3, 0x8c, 0x9e, 0x54, 0xa4, 0xc7, 0xc0, 0xf1, 0x57, 0x53, ++ 0x1f, 0x02, 0x78, 0xb3, 0xd9, 0xb7, 0x92, 0xeb, 0x7b, 0x5f, 0x26, 0xe9, ++ 0x69, 0xe6, 0xcb, 0xc4, 0xf7, 0x42, 0xfd, 0x92, 0xe7, 0x3c, 0xbe, 0xb7, ++ 0xad, 0x28, 0xb4, 0x2d, 0xc3, 0xf7, 0xb5, 0xfd, 0x3a, 0xcf, 0x1e, 0x84, ++ 0x2b, 0x0b, 0xf3, 0x96, 0x69, 0xc7, 0x62, 0xfb, 0x91, 0xf3, 0x96, 0xe0, ++ 0xf6, 0x04, 0x4f, 0x2a, 0xbe, 0xc7, 0xad, 0x28, 0xcc, 0x15, 0xf0, 0x91, ++ 0x3d, 0xb1, 0xd6, 0x20, 0x58, 0xf7, 0xf2, 0x79, 0x6c, 0xd7, 0x6b, 0xf2, ++ 0x96, 0xcd, 0x05, 0x78, 0x81, 0xc1, 0x7d, 0xba, 0x11, 0xf9, 0xe6, 0x77, ++ 0x9c, 0xbf, 0x4c, 0x87, 0xdb, 0x2f, 0x22, 0x7e, 0x6a, 0x3a, 0xb8, 0xbf, ++ 0x3e, 0xfb, 0x70, 0xfb, 0xd5, 0x97, 0xd1, 0x1e, 0xb7, 0x47, 0xd1, 0x7d, ++ 0x7d, 0x4b, 0x41, 0x1a, 0xc9, 0x51, 0x53, 0xc7, 0x8b, 0x4f, 0x21, 0xbf, ++ 0xf9, 0x8f, 0xe8, 0x48, 0x0e, 0x36, 0xb7, 0xbe, 0xbf, 0xe7, 0x17, 0xd4, ++ 0xcf, 0x40, 0x69, 0x94, 0x05, 0x06, 0x4f, 0x3e, 0xa6, 0x5c, 0x9c, 0x47, ++ 0x7b, 0x1e, 0xc0, 0x7d, 0x2e, 0x88, 0xf4, 0x7c, 0x81, 0xf0, 0x3f, 0x1f, ++ 0xbd, 0x8b, 0xf6, 0xb1, 0x60, 0x0c, 0x97, 0xe7, 0xa6, 0xa3, 0xf6, 0x65, ++ 0x28, 0x9f, 0xfe, 0xf6, 0xc3, 0x3f, 0x47, 0xf9, 0x5b, 0x10, 0x03, 0x8e, ++ 0x2c, 0xee, 0xe7, 0x25, 0x13, 0xd1, 0xa7, 0xfa, 0x95, 0x29, 0x73, 0x31, ++ 0x0f, 0xe0, 0x8f, 0xea, 0x2e, 0xc7, 0xf9, 0xeb, 0x7e, 0x6b, 0xb0, 0x22, ++ 0x9f, 0x56, 0xbf, 0x92, 0x34, 0x1b, 0xf3, 0x02, 0x2f, 0x17, 0x4c, 0xa2, ++ 0xfd, 0x54, 0xdd, 0xbe, 0x25, 0x15, 0xed, 0xab, 0xe6, 0xd8, 0xa1, 0x03, ++ 0xbf, 0xc0, 0x3c, 0xe5, 0x6f, 0x4d, 0x74, 0x3f, 0x53, 0x1f, 0xc7, 0xfd, ++ 0xbb, 0x6a, 0xb9, 0xb9, 0x70, 0x35, 0xd1, 0x6f, 0xdf, 0x01, 0x7c, 0x37, ++ 0xe2, 0x3f, 0x64, 0xa2, 0x7b, 0xd2, 0x2a, 0x98, 0x03, 0xd7, 0xab, 0x3a, ++ 0x30, 0x99, 0xf2, 0xea, 0xaf, 0xfd, 0xe5, 0xa3, 0x72, 0xa4, 0x43, 0x91, ++ 0xbc, 0xfb, 0x00, 0xd6, 0x7f, 0xb1, 0xdf, 0xa4, 0x41, 0x3c, 0xf4, 0xe8, ++ 0xed, 0x31, 0x77, 0xa1, 0x1c, 0xf6, 0xe8, 0x28, 0xce, 0xac, 0x12, 0x70, ++ 0x55, 0xef, 0x18, 0xbe, 0x9f, 0xc8, 0xbe, 0x62, 0xa2, 0x5f, 0xfc, 0x96, ++ 0x54, 0xb4, 0xaf, 0xd5, 0x63, 0xfe, 0xf1, 0x5e, 0xdc, 0xf7, 0x02, 0x79, ++ 0xcb, 0x1e, 0x8c, 0x73, 0xd8, 0x8b, 0x06, 0xba, 0x2b, 0xb8, 0x7c, 0x08, ++ 0xf0, 0x06, 0xe3, 0x2e, 0xb7, 0xe8, 0xe8, 0x95, 0xaa, 0xff, 0x50, 0x94, ++ 0x16, 0xf9, 0xa5, 0x5f, 0xda, 0x52, 0xbe, 0x0b, 0xe7, 0x6f, 0xe1, 0xfd, ++ 0xfa, 0x4d, 0x5b, 0x08, 0x9f, 0xae, 0x96, 0xdb, 0x18, 0xae, 0x07, 0xfd, ++ 0x18, 0xea, 0xab, 0x7e, 0x69, 0x6b, 0x48, 0xfd, 0xe5, 0x96, 0x17, 0x73, ++ 0x30, 0x0e, 0xbd, 0xf2, 0xdb, 0x05, 0x14, 0x8f, 0xaa, 0x7c, 0xae, 0xca, ++ 0x4b, 0xf5, 0x7e, 0x43, 0x88, 0x3d, 0x24, 0x4d, 0x90, 0x28, 0xde, 0x4b, ++ 0x90, 0x99, 0x75, 0x31, 0x33, 0xd8, 0xd9, 0x2a, 0x01, 0x5e, 0x39, 0xba, ++ 0xd3, 0xbf, 0x2b, 0xc8, 0x2f, 0xba, 0xd2, 0xaa, 0xf3, 0xe9, 0x01, 0x47, ++ 0x55, 0x06, 0xb6, 0x1e, 0xdf, 0x07, 0xab, 0xf2, 0x50, 0x9d, 0x72, 0x4f, ++ 0x09, 0x9e, 0xaf, 0x5a, 0xd3, 0x9c, 0x89, 0xfe, 0x4a, 0x55, 0x5e, 0x5f, ++ 0x39, 0xca, 0xc5, 0x65, 0x13, 0x33, 0x26, 0x43, 0xbf, 0xb7, 0x85, 0xbd, ++ 0xaa, 0x6e, 0x5b, 0xb7, 0x10, 0xfd, 0xde, 0xd1, 0xf6, 0xf3, 0x67, 0x61, ++ 0x7f, 0xbe, 0x14, 0x72, 0xf8, 0xa5, 0xd7, 0xe4, 0x0e, 0xbe, 0x1f, 0x0c, ++ 0x2f, 0xff, 0xd4, 0xc8, 0x94, 0x77, 0x82, 0xde, 0x0d, 0x3f, 0xd8, 0x60, ++ 0x20, 0xdf, 0x5d, 0x9d, 0xef, 0x6d, 0xbd, 0xa7, 0x16, 0xe3, 0xb3, 0xba, ++ 0x38, 0xae, 0x3f, 0xce, 0x43, 0xff, 0x56, 0xd0, 0x63, 0xdf, 0x08, 0xbd, ++ 0xb7, 0x7c, 0x6d, 0x68, 0x7f, 0x7f, 0x01, 0x7f, 0x47, 0x5d, 0xa7, 0xef, ++ 0xcb, 0x44, 0xbb, 0xa7, 0xce, 0xdf, 0x5f, 0xa0, 0xea, 0xb5, 0xbe, 0x4c, ++ 0xd4, 0x57, 0xe1, 0xe3, 0x16, 0xc8, 0x42, 0xdf, 0xbc, 0x24, 0x91, 0xbe, ++ 0xa9, 0x6e, 0x93, 0x2e, 0xc8, 0x80, 0xa7, 0x6a, 0xa3, 0xcb, 0x8d, 0xef, ++ 0x77, 0xaa, 0x31, 0x98, 0xe4, 0xe7, 0xd4, 0xde, 0x90, 0xf8, 0xb8, 0xe4, ++ 0x42, 0x81, 0x77, 0x18, 0xbb, 0xbe, 0x90, 0xcb, 0x51, 0x75, 0xab, 0xc9, ++ 0x6e, 0x82, 0x71, 0x35, 0x11, 0x7d, 0xd1, 0xe8, 0x0f, 0xd5, 0x46, 0xf5, ++ 0x45, 0xa3, 0x9f, 0xe3, 0x3f, 0x26, 0xb3, 0xbd, 0x82, 0x5c, 0xf1, 0x89, ++ 0x82, 0x3e, 0x93, 0x04, 0xc9, 0x82, 0xf2, 0x8e, 0x55, 0x1e, 0x9d, 0xdd, ++ 0x94, 0x33, 0x02, 0x9d, 0xd1, 0x6f, 0xc2, 0xf7, 0x39, 0xf8, 0xdf, 0xb0, ++ 0xfe, 0xce, 0x42, 0x2e, 0x27, 0x95, 0xde, 0x48, 0x5a, 0x8f, 0x59, 0xfa, ++ 0x0a, 0x91, 0x4f, 0x2b, 0x77, 0x87, 0x8e, 0xc3, 0x73, 0x59, 0x82, 0xe4, ++ 0xcf, 0xef, 0xdd, 0x97, 0x18, 0x1c, 0x8f, 0xa7, 0x8a, 0x7d, 0x0f, 0x48, ++ 0x17, 0x48, 0x4e, 0x06, 0xfe, 0xf2, 0x61, 0x2a, 0xd2, 0xbd, 0x5a, 0xc3, ++ 0xd6, 0xe3, 0x3d, 0xe2, 0x15, 0x18, 0x83, 0xf7, 0x8b, 0x00, 0xd3, 0x77, ++ 0x0f, 0x57, 0xc4, 0x7d, 0x64, 0xf5, 0x57, 0xe6, 0x08, 0xe4, 0x97, 0x2b, ++ 0x5f, 0xd6, 0x92, 0xdc, 0xfa, 0xa5, 0x3e, 0xd2, 0x6b, 0x67, 0x0a, 0xef, ++ 0x23, 0x3d, 0xe6, 0xd7, 0xf5, 0x91, 0x5e, 0x3b, 0x71, 0xf4, 0x27, 0x1c, ++ 0x8e, 0xed, 0x2b, 0x47, 0x3d, 0x75, 0xa6, 0xf0, 0x11, 0xd2, 0x17, 0xfe, ++ 0xb1, 0x7d, 0xe5, 0x0a, 0xb4, 0x1f, 0x52, 0xe1, 0x09, 0x8c, 0xec, 0xfd, ++ 0xd9, 0xa3, 0x35, 0xcb, 0x5c, 0x66, 0xdc, 0x37, 0x7f, 0xdf, 0xc0, 0xf6, ++ 0xe9, 0x2c, 0x3c, 0x0f, 0xb4, 0xb1, 0xb7, 0x91, 0xe2, 0x0a, 0x9d, 0x12, ++ 0x1c, 0x77, 0xff, 0xaf, 0x42, 0xf5, 0xde, 0x46, 0x1f, 0x38, 0xb7, 0x1c, ++ 0x90, 0x1b, 0x3f, 0x53, 0x0e, 0xb7, 0xa1, 0x1c, 0x56, 0x9a, 0x29, 0x9f, ++ 0x03, 0xfe, 0x53, 0xeb, 0xcb, 0xe8, 0xe7, 0x2d, 0x4d, 0xb4, 0x62, 0x5e, ++ 0xbc, 0x12, 0xc7, 0x71, 0x3e, 0xd0, 0x07, 0xdf, 0xff, 0xc5, 0xc7, 0x7d, ++ 0xb3, 0x12, 0xe9, 0xb3, 0x2c, 0xc6, 0x31, 0xbb, 0x10, 0xef, 0xb1, 0xb3, ++ 0xfb, 0x28, 0x7e, 0x00, 0xae, 0x26, 0x3f, 0xbd, 0xee, 0xf7, 0x06, 0x8a, ++ 0x23, 0x07, 0x74, 0x83, 0x07, 0x50, 0x4f, 0xe5, 0xc4, 0x38, 0x8a, 0xb1, ++ 0x5f, 0xad, 0xbe, 0x7b, 0x03, 0xba, 0xf4, 0x57, 0x75, 0x7d, 0x5d, 0x78, ++ 0xef, 0x37, 0x5f, 0xe6, 0xfa, 0x88, 0xbd, 0xc8, 0xf9, 0xca, 0x9f, 0xbd, ++ 0x8f, 0x7f, 0x27, 0xa1, 0xbe, 0x67, 0x14, 0xf8, 0x07, 0xbb, 0xc5, 0x9a, ++ 0x91, 0x2f, 0x24, 0x4e, 0xdf, 0x93, 0xde, 0x57, 0xde, 0x41, 0xbd, 0xe2, ++ 0xef, 0x4e, 0x27, 0x7d, 0x1c, 0x2e, 0x37, 0x97, 0xbd, 0xcf, 0x44, 0xa3, ++ 0x7e, 0x38, 0x0b, 0x76, 0xdc, 0x15, 0x14, 0xe7, 0x9f, 0x5d, 0xf1, 0x22, ++ 0xdd, 0xd3, 0x2f, 0xc1, 0x77, 0x19, 0x50, 0x3e, 0xb4, 0x3e, 0x94, 0x1f, ++ 0x86, 0xae, 0xff, 0x98, 0xe2, 0x3d, 0xf6, 0x54, 0x50, 0x3d, 0xf2, 0xe1, ++ 0xb6, 0x50, 0x38, 0x9c, 0x8f, 0x90, 0x1f, 0x7d, 0x21, 0x7a, 0xc7, 0x45, ++ 0xf2, 0xb4, 0xad, 0x80, 0xfb, 0x61, 0x35, 0xb3, 0xbb, 0xeb, 0x10, 0x0f, ++ 0xc3, 0xf0, 0x22, 0x80, 0xe5, 0x20, 0xf8, 0x8d, 0x30, 0x38, 0xac, 0x3f, ++ 0x2b, 0xe5, 0x7e, 0xc2, 0x36, 0x61, 0xff, 0x6b, 0x27, 0xf8, 0x7a, 0x29, ++ 0x3e, 0x3f, 0xcc, 0xdf, 0xc5, 0x36, 0x81, 0xfd, 0x22, 0xb8, 0x3d, 0x92, ++ 0xee, 0x8d, 0x35, 0x87, 0xc1, 0x3e, 0xc5, 0x73, 0xfb, 0x84, 0x76, 0xa1, ++ 0x26, 0xba, 0x9b, 0xf2, 0x52, 0xfe, 0x76, 0x03, 0xdd, 0x8f, 0xfc, 0xb2, ++ 0xe3, 0x53, 0x7a, 0xcf, 0x08, 0x7c, 0x48, 0xf9, 0x97, 0x9a, 0x8e, 0x57, ++ 0x13, 0x31, 0x6e, 0x6f, 0xc1, 0x38, 0x21, 0x81, 0xec, 0x60, 0x22, 0xbd, ++ 0x53, 0x69, 0xef, 0x48, 0xc4, 0x78, 0x43, 0xad, 0xaf, 0xd5, 0x78, 0x32, ++ 0xc5, 0x7b, 0x7c, 0xf2, 0xd3, 0xd5, 0x7a, 0xa7, 0xec, 0xcb, 0xc4, 0xfd, ++ 0xd7, 0x48, 0xdd, 0x39, 0xd8, 0xde, 0x22, 0xf4, 0x49, 0xad, 0x06, 0x60, ++ 0x19, 0x61, 0x46, 0xe7, 0xa8, 0x95, 0xb8, 0xbc, 0xb3, 0x0e, 0x99, 0xf4, ++ 0x79, 0x38, 0xdd, 0xb6, 0x17, 0x72, 0xbd, 0x05, 0x7a, 0x21, 0x87, 0xde, ++ 0x59, 0x1c, 0xe3, 0x79, 0x01, 0x55, 0x0f, 0x54, 0x09, 0x7d, 0xf2, 0x06, ++ 0xd6, 0x67, 0x73, 0xb9, 0xb7, 0xa8, 0xf7, 0x4a, 0x12, 0xbe, 0x97, 0x8b, ++ 0x1c, 0x51, 0x3f, 0xc4, 0x17, 0x0a, 0xfd, 0xc6, 0x1a, 0x28, 0x6f, 0xb3, ++ 0xb5, 0x50, 0xe1, 0x78, 0x15, 0xe3, 0x69, 0x5e, 0x9e, 0x57, 0xa2, 0xf6, ++ 0xba, 0xd7, 0xfa, 0x73, 0x26, 0x65, 0xe3, 0x38, 0x65, 0xf8, 0x1d, 0xe4, ++ 0xb0, 0x1e, 0x4a, 0x0f, 0xe8, 0x15, 0x94, 0xff, 0x64, 0x92, 0xff, 0x5f, ++ 0xea, 0x12, 0xe1, 0x5c, 0xd5, 0x7b, 0x24, 0x6b, 0x13, 0xea, 0xa9, 0xb2, ++ 0x75, 0xc5, 0xd0, 0x9d, 0xad, 0xd2, 0xae, 0x2e, 0xa6, 0x7c, 0x99, 0x78, ++ 0xff, 0x19, 0xbe, 0xaf, 0x70, 0x3e, 0x9a, 0x56, 0xc8, 0xf1, 0x54, 0xad, ++ 0x89, 0x2d, 0x8a, 0x0f, 0x9a, 0xef, 0x0a, 0x84, 0xeb, 0xc9, 0xb9, 0xa4, ++ 0x67, 0xe8, 0x1d, 0xfd, 0x23, 0xf1, 0x4f, 0x17, 0x63, 0x7e, 0xe2, 0xa7, ++ 0x65, 0x5b, 0x89, 0x9f, 0x87, 0xed, 0x4d, 0xb0, 0x9c, 0xe3, 0x79, 0x76, ++ 0x73, 0x3d, 0x8e, 0x62, 0x73, 0x43, 0x73, 0x33, 0x1f, 0xaf, 0x6a, 0x68, ++ 0xde, 0x90, 0x34, 0xc2, 0x3e, 0xc2, 0xf7, 0x59, 0xe5, 0x68, 0x2e, 0x4e, ++ 0x54, 0x6e, 0xae, 0x57, 0xf7, 0x7b, 0xc5, 0xa4, 0xee, 0x6f, 0xb6, 0x2e, ++ 0x21, 0x18, 0x0f, 0x4b, 0xd6, 0x15, 0x27, 0x40, 0xb9, 0xca, 0xf8, 0xb7, ++ 0xe2, 0x81, 0x9f, 0xf7, 0x4a, 0x87, 0xc1, 0x87, 0x76, 0xb5, 0xaa, 0x6c, ++ 0xf5, 0x86, 0x98, 0x11, 0xf8, 0xe6, 0x26, 0x7b, 0xb0, 0x3b, 0xc8, 0x7e, ++ 0x4d, 0x42, 0xfa, 0xba, 0xe9, 0x5e, 0x63, 0xb4, 0xfd, 0x87, 0x97, 0xb5, ++ 0x92, 0xaf, 0x17, 0xf3, 0x44, 0x0c, 0xe4, 0xaa, 0x85, 0xe4, 0x0b, 0xe4, ++ 0x25, 0xc8, 0x2e, 0x14, 0x08, 0x3e, 0x1d, 0xce, 0x37, 0x54, 0xae, 0x98, ++ 0x88, 0x71, 0x27, 0x73, 0xac, 0x98, 0x88, 0x76, 0x06, 0xe4, 0xaa, 0xdc, ++ 0x3a, 0x42, 0x5c, 0x89, 0x5f, 0x96, 0x68, 0xe8, 0xed, 0x86, 0x8b, 0xca, ++ 0xf0, 0xfd, 0x5c, 0x28, 0xe4, 0xef, 0x92, 0x0a, 0xc4, 0x3e, 0x3a, 0x6c, ++ 0xf6, 0x7e, 0xd4, 0x9b, 0xa3, 0x7d, 0x6f, 0xf1, 0x85, 0xd0, 0xef, 0xa3, ++ 0x7d, 0x6f, 0x91, 0xa2, 0x19, 0x7a, 0x17, 0xe5, 0x2d, 0x25, 0x31, 0x4a, ++ 0xc1, 0x7b, 0xa0, 0xa2, 0x39, 0x91, 0xbc, 0xdf, 0x71, 0x93, 0x05, 0xf3, ++ 0x36, 0x03, 0xc7, 0xbf, 0xa1, 0xbc, 0xee, 0xc0, 0x93, 0xe6, 0x25, 0xfc, ++ 0xbe, 0xc0, 0xcc, 0xc6, 0x42, 0x7b, 0x57, 0xf2, 0xb4, 0xbd, 0xc1, 0x76, ++ 0xe4, 0xe9, 0xe9, 0x7c, 0x9d, 0xc8, 0x7c, 0xee, 0xb7, 0xd4, 0x67, 0xe9, ++ 0xbe, 0x3d, 0x2f, 0x94, 0x1d, 0x35, 0x9c, 0x17, 0x22, 0xbf, 0x21, 0x3b, ++ 0x92, 0xee, 0x49, 0xfc, 0xde, 0xcf, 0xc9, 0x6e, 0x0d, 0x74, 0x16, 0x58, ++ 0xf0, 0x3e, 0xc3, 0xdf, 0x0d, 0xd1, 0x21, 0xc8, 0x53, 0xfd, 0x5f, 0xfe, ++ 0x3b, 0x11, 0xed, 0xab, 0xbf, 0xf3, 0x13, 0x7a, 0x0f, 0xe6, 0xbf, 0xfe, ++ 0x29, 0xbd, 0x13, 0xdb, 0x24, 0xde, 0xe9, 0xbd, 0xe1, 0x15, 0xef, 0xac, ++ 0xba, 0x95, 0x28, 0xfa, 0x2e, 0xae, 0xe4, 0xa3, 0x62, 0xec, 0xb7, 0x59, ++ 0x94, 0x81, 0xfc, 0x00, 0xcf, 0x6b, 0xa9, 0xa5, 0x1a, 0xff, 0x07, 0xc5, ++ 0xbf, 0x49, 0xd3, 0x47, 0x8e, 0x7f, 0xe3, 0x1c, 0xe6, 0xe0, 0xbc, 0x80, ++ 0x92, 0x34, 0x52, 0x1e, 0x25, 0x38, 0x2f, 0x90, 0xa1, 0xe5, 0x79, 0x01, ++ 0x2c, 0x31, 0x2f, 0x90, 0x91, 0xc1, 0xf3, 0x02, 0x08, 0x63, 0x5e, 0x00, ++ 0x4b, 0xcc, 0x0b, 0x60, 0x3d, 0xe6, 0x05, 0x10, 0xc6, 0xbc, 0x00, 0xc2, ++ 0x98, 0x17, 0x40, 0x18, 0xf3, 0x02, 0x58, 0x62, 0x5e, 0x00, 0xeb, 0xbf, ++ 0x10, 0xdf, 0x3f, 0x0c, 0x80, 0x62, 0xe2, 0xf9, 0x4a, 0x33, 0xe9, 0xf5, ++ 0x47, 0xf1, 0x7d, 0x3b, 0xe0, 0xef, 0xd1, 0xe3, 0xfc, 0xde, 0xe9, 0xd1, ++ 0x16, 0x99, 0xee, 0x6f, 0xf1, 0xfb, 0x07, 0xb4, 0x6f, 0x37, 0xbd, 0x9b, ++ 0x69, 0x13, 0xef, 0x66, 0x3c, 0x5b, 0xe9, 0x1e, 0xaf, 0xbe, 0x5d, 0xb6, ++ 0x22, 0x89, 0xea, 0x75, 0x83, 0xa7, 0x30, 0x8f, 0x53, 0x7f, 0x44, 0xb2, ++ 0xae, 0x43, 0xbd, 0xd2, 0xb8, 0x84, 0xd6, 0xdf, 0xd4, 0x59, 0xf0, 0x41, ++ 0x19, 0xd6, 0xb7, 0xe8, 0xac, 0x1a, 0x85, 0xf8, 0x88, 0xd3, 0xb1, 0x59, ++ 0xa2, 0x77, 0xfa, 0xd5, 0x9d, 0x2d, 0x94, 0x77, 0x9a, 0x9b, 0x74, 0x5c, ++ 0x4f, 0xf5, 0xad, 0x12, 0xc3, 0x3c, 0xe9, 0x62, 0x03, 0x8f, 0x73, 0x9d, ++ 0x32, 0xd4, 0xe6, 0xd2, 0x3d, 0x28, 0xf9, 0xc1, 0x4e, 0x43, 0x37, 0xc5, ++ 0x1f, 0x35, 0x07, 0x25, 0xa5, 0x22, 0xf8, 0x9d, 0xc6, 0x8c, 0x6b, 0xa4, ++ 0x07, 0xd4, 0xfb, 0xe4, 0x95, 0xbc, 0x89, 0x39, 0x3d, 0x26, 0xa5, 0x62, ++ 0x84, 0x77, 0x20, 0xc3, 0xef, 0xce, 0xc5, 0xbb, 0xe9, 0x95, 0x78, 0xcf, ++ 0x8c, 0xef, 0xc5, 0xe5, 0xeb, 0xf4, 0xae, 0xdf, 0x09, 0x01, 0xe9, 0x18, ++ 0xe4, 0xc3, 0x1d, 0xfc, 0xfd, 0xb3, 0x05, 0xfe, 0x91, 0xbc, 0x87, 0xbd, ++ 0x6b, 0xaa, 0xee, 0x3c, 0xb2, 0x01, 0xdf, 0x43, 0x85, 0xdf, 0x37, 0x0f, ++ 0x7f, 0x4f, 0x17, 0x76, 0xef, 0xbc, 0x6c, 0xba, 0xb8, 0x57, 0xb6, 0xf1, ++ 0xef, 0x2b, 0x4a, 0xb6, 0x57, 0x1c, 0x6e, 0x87, 0xf5, 0x86, 0xb6, 0x18, ++ 0xc8, 0xdf, 0x70, 0x16, 0x38, 0x1e, 0x42, 0x3e, 0x3a, 0xa5, 0xb3, 0x53, ++ 0x7e, 0xe4, 0xd4, 0x71, 0x13, 0xc5, 0x45, 0x1f, 0x6f, 0xbd, 0x2d, 0x24, ++ 0x3f, 0xf2, 0x59, 0xae, 0x63, 0x15, 0xf6, 0x2b, 0x92, 0xc7, 0x53, 0xbe, ++ 0x62, 0x8d, 0x4e, 0x22, 0x7b, 0x3c, 0xa7, 0x24, 0x3d, 0x09, 0xf1, 0x38, ++ 0xe7, 0xb4, 0x8e, 0xec, 0xce, 0xc9, 0xdc, 0xd2, 0xaa, 0xe9, 0xc0, 0xaf, ++ 0x6b, 0xa6, 0x29, 0x94, 0x8f, 0x2a, 0x32, 0xb0, 0x9f, 0xd1, 0x3c, 0xe2, ++ 0xbd, 0x94, 0x4a, 0x8f, 0xa2, 0x26, 0xc9, 0xad, 0x01, 0x78, 0x05, 0xb3, ++ 0xd2, 0x3b, 0xfb, 0xe5, 0x80, 0x26, 0xcc, 0x57, 0x0e, 0xe8, 0xcc, 0x1b, ++ 0xf1, 0x5d, 0xd3, 0x72, 0xc6, 0xdf, 0x39, 0xa8, 0x7c, 0xb3, 0x66, 0xab, ++ 0x44, 0x7c, 0x83, 0x09, 0x02, 0xc4, 0x67, 0xb9, 0xc0, 0xe7, 0xf2, 0xce, ++ 0x3f, 0x7c, 0x83, 0xef, 0x18, 0x1e, 0x36, 0x70, 0xbf, 0x35, 0x45, 0xc3, ++ 0xef, 0xaf, 0x53, 0x36, 0xf3, 0xf7, 0x0c, 0x8f, 0x30, 0x87, 0x1e, 0xed, ++ 0xec, 0x2a, 0xe4, 0x2e, 0x99, 0xec, 0xe3, 0xef, 0xfb, 0xa0, 0xde, 0x11, ++ 0x39, 0x3e, 0x95, 0xfb, 0xe5, 0x4a, 0x12, 0xce, 0xbf, 0xe2, 0x8c, 0x8e, ++ 0xde, 0xdb, 0x16, 0x25, 0xfd, 0x28, 0xd3, 0x41, 0x76, 0x7a, 0x2e, 0xbd, ++ 0x63, 0x90, 0x7c, 0xcb, 0xe4, 0x1b, 0x53, 0x47, 0x97, 0x9f, 0xf0, 0x77, ++ 0x0c, 0xa7, 0x74, 0x5c, 0xaf, 0x00, 0x1e, 0x29, 0x1e, 0xea, 0x42, 0xbe, ++ 0xa4, 0xbc, 0x8c, 0x83, 0xca, 0x33, 0x8d, 0x95, 0x54, 0xd6, 0x88, 0xef, ++ 0x21, 0x6e, 0x7e, 0xff, 0x3f, 0x78, 0x1e, 0xe3, 0xc4, 0x94, 0xa4, 0x28, ++ 0x2b, 0xea, 0xb9, 0x51, 0xbf, 0x77, 0x8b, 0xf8, 0xf6, 0xef, 0xbd, 0x9e, ++ 0xc3, 0xf7, 0x6b, 0x09, 0x88, 0x8f, 0x9e, 0x3c, 0x05, 0xf1, 0xf1, 0x95, ++ 0xd9, 0x8a, 0xf8, 0x50, 0xdf, 0x09, 0x76, 0xd8, 0x4a, 0xf7, 0x20, 0x9d, ++ 0xec, 0xd1, 0xcc, 0x65, 0xa1, 0xef, 0xc1, 0x40, 0x03, 0x02, 0x5e, 0x8b, ++ 0xf1, 0x20, 0x12, 0xe6, 0xb5, 0x3d, 0x76, 0xfc, 0xee, 0x68, 0xf0, 0xb8, ++ 0x64, 0xa1, 0x77, 0xc9, 0x37, 0xe9, 0xc7, 0xad, 0x4f, 0xe2, 0x3b, 0x91, ++ 0xfa, 0x0c, 0xc9, 0x22, 0x29, 0x98, 0xff, 0xde, 0x52, 0x94, 0x08, 0xfb, ++ 0x2e, 0x9e, 0x94, 0x46, 0xfb, 0xae, 0xf7, 0xf2, 0xfc, 0x28, 0x61, 0x28, ++ 0x11, 0xf3, 0xe7, 0x9c, 0x5e, 0x91, 0xb9, 0x0e, 0xcf, 0xf4, 0x82, 0x40, ++ 0xfd, 0x02, 0x21, 0x37, 0x7e, 0xe8, 0xcf, 0xf9, 0xe4, 0x07, 0x6e, 0xe4, ++ 0xb7, 0xef, 0x90, 0x37, 0xdd, 0x8f, 0xfd, 0x5d, 0xcc, 0x44, 0xdf, 0x53, ++ 0xd3, 0x1f, 0xec, 0x67, 0xc1, 0xd4, 0x09, 0x94, 0x3f, 0x55, 0xf9, 0x66, ++ 0xa8, 0x35, 0x69, 0x2f, 0xf2, 0xcd, 0x9b, 0xd3, 0xf9, 0xb8, 0xb2, 0xb2, ++ 0xf7, 0x74, 0x68, 0xff, 0x4f, 0xe6, 0x39, 0x4e, 0xe0, 0x3e, 0xca, 0x2b, ++ 0xae, 0x3d, 0x99, 0x48, 0xe7, 0x1b, 0x39, 0x7f, 0xa5, 0xbe, 0x53, 0x0f, ++ 0xcf, 0x5f, 0x05, 0xeb, 0xcf, 0xff, 0x1f, 0xef, 0xd3, 0xdf, 0x69, 0x6c, ++ 0xa0, 0xf2, 0xdd, 0xc6, 0xb5, 0x54, 0x76, 0x37, 0xba, 0xa8, 0x3d, 0x48, ++ 0xff, 0x7f, 0x30, 0x8a, 0xfe, 0x0f, 0xcf, 0x7f, 0x9e, 0x9f, 0x3e, 0x42, ++ 0xfe, 0x93, 0x19, 0x95, 0x18, 0xb2, 0x9f, 0x20, 0xdf, 0x3c, 0xdf, 0x1c, ++ 0x96, 0xef, 0x2c, 0x19, 0xf3, 0xd0, 0x46, 0xc0, 0xdf, 0x9c, 0x6d, 0x7a, ++ 0x2b, 0x56, 0xa9, 0xf9, 0x4f, 0x7c, 0x3f, 0xfc, 0xa8, 0x99, 0xf4, 0xc1, ++ 0xa7, 0xd3, 0x83, 0xf2, 0xf0, 0x81, 0xbc, 0xa7, 0x8a, 0x37, 0x33, 0xe5, ++ 0x49, 0x87, 0x98, 0x29, 0x17, 0xf1, 0x3f, 0x3b, 0x2b, 0x5d, 0xab, 0x81, ++ 0xf6, 0x6b, 0x82, 0x0e, 0x6a, 0xde, 0x11, 0xe5, 0x03, 0xcf, 0x87, 0xf2, ++ 0x81, 0x25, 0xca, 0x87, 0x56, 0x1b, 0x90, 0x8f, 0x17, 0xf4, 0x20, 0xc2, ++ 0xf9, 0xdc, 0xce, 0xbb, 0xc8, 0xce, 0x9b, 0x88, 0xae, 0x1b, 0xd6, 0x81, ++ 0xfe, 0x00, 0xf8, 0x61, 0x66, 0x09, 0xd1, 0x1f, 0x57, 0xc3, 0xf4, 0x07, ++ 0x04, 0x1c, 0x0f, 0xd0, 0x77, 0x55, 0x9d, 0x06, 0x86, 0x79, 0x42, 0xf5, ++ 0x1d, 0xe5, 0x6c, 0x28, 0xbe, 0xce, 0x1d, 0x41, 0x9f, 0x78, 0xb8, 0x3e, ++ 0x99, 0x10, 0xe1, 0x39, 0x44, 0xdf, 0xfb, 0xd7, 0x45, 0xd0, 0xfb, 0xdc, ++ 0x53, 0xe2, 0x3d, 0xdc, 0xa9, 0x4d, 0xfc, 0x3d, 0x5c, 0x05, 0x2b, 0xa5, ++ 0x75, 0x47, 0xd0, 0x2b, 0xd1, 0x48, 0x8f, 0x87, 0xc7, 0x0c, 0x9e, 0x7f, ++ 0x1e, 0xfa, 0x3f, 0xfc, 0x6b, 0x33, 0xf9, 0x2b, 0x1b, 0xc6, 0xae, 0x2c, ++ 0xfc, 0x9f, 0xe8, 0x95, 0xab, 0xd3, 0x39, 0x3e, 0x9e, 0xc3, 0xdf, 0x15, ++ 0xd0, 0x7e, 0xdb, 0xef, 0x0a, 0x3c, 0x25, 0xe1, 0x7d, 0xe8, 0x9a, 0x07, ++ 0x99, 0x0d, 0xe9, 0xac, 0xfe, 0xae, 0x40, 0x92, 0xb8, 0xcf, 0xfe, 0x1e, ++ 0xbf, 0x2b, 0x90, 0x31, 0x23, 0xe1, 0xbb, 0xff, 0xae, 0xc0, 0x54, 0x6f, ++ 0x42, 0x59, 0xf0, 0xef, 0x0a, 0x4c, 0x9d, 0x91, 0x5c, 0x16, 0xf2, 0xbb, ++ 0x02, 0xae, 0x84, 0xb2, 0x51, 0x7e, 0x57, 0xc0, 0x3a, 0xa3, 0xe0, 0xe6, ++ 0xdf, 0x15, 0xc8, 0x9f, 0xc1, 0xe3, 0x9c, 0xd1, 0x7e, 0x57, 0x00, 0xfc, ++ 0xc9, 0x02, 0x1c, 0xa7, 0xb1, 0xd9, 0x0b, 0xb1, 0x4c, 0x11, 0xfb, 0x0c, ++ 0xff, 0x9e, 0xf6, 0x8c, 0xb8, 0xbf, 0xeb, 0xd2, 0x38, 0xca, 0xb0, 0x2c, ++ 0x8e, 0x76, 0x69, 0xa9, 0x5e, 0xe3, 0xce, 0xc7, 0xf2, 0x6d, 0x8d, 0xe7, ++ 0x31, 0xac, 0x07, 0x7e, 0x9e, 0x85, 0xf3, 0x14, 0x3f, 0x63, 0xbb, 0x3d, ++ 0x0b, 0xe0, 0x14, 0x83, 0x87, 0xf4, 0xe4, 0xc9, 0x5c, 0xfb, 0x6c, 0xc4, ++ 0xc3, 0x55, 0x9b, 0x7d, 0x0e, 0x96, 0xe1, 0x79, 0x73, 0xa4, 0x2d, 0xc6, ++ 0xf7, 0xb0, 0x9f, 0x7b, 0x70, 0x7c, 0xf8, 0xbb, 0x2b, 0x95, 0x9e, 0xe5, ++ 0x33, 0x44, 0x1e, 0x6b, 0x06, 0xf7, 0x3f, 0x67, 0x36, 0x8d, 0xfc, 0x3d, ++ 0xf9, 0xf2, 0x19, 0xfc, 0x1e, 0xf6, 0x56, 0xfb, 0x86, 0xfd, 0xfe, 0x14, ++ 0xf7, 0xa3, 0xee, 0x9f, 0x6d, 0x59, 0x91, 0x8f, 0xfb, 0x81, 0xfd, 0x2e, ++ 0xc1, 0x7d, 0xc0, 0x7e, 0x97, 0x62, 0xc9, 0xcc, 0x71, 0x21, 0xdf, 0xa7, ++ 0xde, 0xcc, 0x67, 0x2e, 0xb1, 0x2f, 0x46, 0x25, 0xe8, 0xb3, 0x05, 0x1f, ++ 0x73, 0x7f, 0x90, 0xca, 0x4c, 0xad, 0x3b, 0x16, 0xfd, 0xc7, 0x71, 0x4f, ++ 0xb8, 0x63, 0x71, 0xbf, 0xe3, 0x9a, 0x07, 0x4d, 0xf8, 0x1d, 0xc4, 0x6f, ++ 0x5c, 0x83, 0x26, 0xb4, 0xef, 0xbf, 0x79, 0x7c, 0xd0, 0x84, 0xf5, 0xbf, ++ 0xb1, 0xf3, 0xf7, 0xca, 0xe1, 0xf3, 0xef, 0x9e, 0xc1, 0xdf, 0x4b, 0x64, ++ 0xce, 0x1c, 0xa4, 0xf1, 0x13, 0xe1, 0xbf, 0xbb, 0xc9, 0x3f, 0x1f, 0x8c, ++ 0x45, 0xff, 0x29, 0xb3, 0xf2, 0xe3, 0x0d, 0x74, 0xdf, 0x72, 0x70, 0x0a, ++ 0xd9, 0x97, 0x89, 0xc2, 0xbe, 0x4c, 0x7c, 0x62, 0x92, 0xb7, 0x0f, 0xf8, ++ 0x6d, 0xe2, 0xce, 0x18, 0xba, 0xcf, 0x66, 0x73, 0xe3, 0xa9, 0xbd, 0xda, ++ 0xc8, 0xe5, 0xb4, 0xfa, 0x89, 0x8a, 0xa3, 0xed, 0x0a, 0x7d, 0xb7, 0xb5, ++ 0xe0, 0xe3, 0x20, 0x7f, 0x67, 0x8a, 0x1b, 0xf6, 0x1d, 0xe2, 0x7f, 0x69, ++ 0x87, 0xf8, 0xbb, 0x4b, 0x80, 0x11, 0x4f, 0x07, 0x75, 0x04, 0x23, 0xcf, ++ 0xa2, 0x7f, 0xe5, 0x64, 0xfc, 0xdd, 0xe5, 0x38, 0xa1, 0x37, 0xd0, 0x4f, ++ 0x2b, 0x03, 0xbd, 0xe0, 0xac, 0x7c, 0xf3, 0x1b, 0xba, 0xf7, 0xc7, 0xf1, ++ 0x38, 0x1f, 0xde, 0xd1, 0x22, 0xff, 0x79, 0x75, 0x43, 0xe2, 0xfb, 0x34, ++ 0x0b, 0xc6, 0xa1, 0xab, 0x96, 0xac, 0xeb, 0xa2, 0xb8, 0x70, 0xc7, 0x70, ++ 0xbd, 0x88, 0x33, 0x8f, 0x6c, 0xc0, 0xb8, 0x19, 0xfc, 0xb7, 0x90, 0xfa, ++ 0xea, 0x8a, 0xd7, 0xbb, 0xd0, 0xde, 0xd4, 0x1c, 0x0c, 0xad, 0x77, 0x36, ++ 0x5c, 0xa3, 0xf8, 0x15, 0xfc, 0xb7, 0x90, 0xfa, 0x07, 0x1f, 0xbb, 0xa0, ++ 0xe7, 0xbf, 0x5f, 0x10, 0x5a, 0x0f, 0xf4, 0xdd, 0x1e, 0x4c, 0xdf, 0x53, ++ 0x3a, 0xcf, 0x14, 0x8c, 0xf3, 0x4e, 0x39, 0x23, 0xac, 0xfc, 0xfd, 0xbe, ++ 0x87, 0x7e, 0xaf, 0x64, 0xaf, 0xf8, 0xfe, 0x79, 0xdf, 0xbf, 0xcd, 0xce, ++ 0xe7, 0xef, 0x45, 0x39, 0xbd, 0x61, 0xfc, 0x0b, 0xc8, 0x3f, 0xb7, 0xe6, ++ 0x8f, 0x26, 0xea, 0xef, 0x9a, 0xcd, 0xb2, 0x50, 0x1e, 0x6e, 0x55, 0xaa, ++ 0x7a, 0x69, 0xf8, 0xf7, 0x4f, 0xf4, 0xcc, 0x45, 0xf9, 0xbd, 0xf9, 0x51, ++ 0xa4, 0x77, 0xea, 0x45, 0x5c, 0x55, 0x57, 0x61, 0x21, 0x3b, 0x9f, 0x52, ++ 0x67, 0x24, 0xfd, 0x55, 0x24, 0x47, 0x58, 0x11, 0x1e, 0xfe, 0xfd, 0x93, ++ 0x12, 0x59, 0xe8, 0x29, 0x0f, 0xc9, 0x7f, 0xcf, 0xbd, 0xb1, 0x94, 0xc7, ++ 0xa3, 0x03, 0x20, 0x1c, 0x37, 0x8d, 0xee, 0x7d, 0x12, 0x9b, 0x38, 0x3c, ++ 0x98, 0x60, 0x20, 0xfd, 0x50, 0xa4, 0x29, 0xad, 0x7d, 0x11, 0xed, 0xbd, ++ 0x26, 0xf4, 0x3b, 0xf6, 0x17, 0x50, 0x3f, 0x60, 0x5e, 0xc7, 0xc6, 0xf3, ++ 0xa9, 0xf5, 0x7a, 0x0f, 0xff, 0x4e, 0x5c, 0xab, 0x14, 0x60, 0x9c, 0xdb, ++ 0x24, 0xd9, 0x77, 0xe2, 0x77, 0x8f, 0x4d, 0x92, 0xc8, 0x23, 0x56, 0x99, ++ 0xe9, 0xbe, 0x60, 0x00, 0xf3, 0x8b, 0x70, 0x9e, 0x6d, 0xb1, 0xee, 0x9d, ++ 0x2b, 0x61, 0x9d, 0x6d, 0xf7, 0x67, 0x93, 0x7f, 0x3c, 0xc0, 0xb8, 0x3e, ++ 0x75, 0x2d, 0xe1, 0xf7, 0x56, 0xdb, 0x62, 0x4b, 0xcb, 0x56, 0x63, 0xfb, ++ 0xd2, 0xdb, 0xa9, 0xfd, 0xe8, 0x5f, 0xd3, 0x9f, 0xce, 0x47, 0xff, 0xa9, ++ 0x2a, 0xc2, 0x8a, 0xfe, 0xd3, 0x36, 0x1b, 0xf7, 0xaf, 0xb7, 0x2d, 0xcc, ++ 0xa2, 0xf6, 0xd7, 0x24, 0x65, 0x1d, 0x9e, 0xdb, 0xf5, 0x04, 0xa3, 0x75, ++ 0xb6, 0x2d, 0xe4, 0xe7, 0xde, 0xf6, 0xf4, 0x04, 0xf1, 0xfd, 0x85, 0xdb, ++ 0x44, 0x79, 0xb2, 0x66, 0xfb, 0x58, 0xbc, 0x8f, 0xfa, 0x7b, 0x8b, 0xe3, ++ 0x7d, 0xa4, 0xd7, 0x38, 0x71, 0x1f, 0xb7, 0x2d, 0x0d, 0xea, 0xa1, 0x7c, ++ 0x56, 0x2a, 0x5d, 0xfa, 0x08, 0xce, 0x33, 0x8d, 0xef, 0xb7, 0xc6, 0xa6, ++ 0x10, 0xbd, 0x4e, 0x2d, 0xbd, 0xfd, 0xe9, 0x03, 0x0a, 0x99, 0x11, 0x1f, ++ 0xde, 0x0b, 0xd5, 0xcf, 0x8f, 0x0a, 0x89, 0x83, 0xff, 0x2f, 0xac, 0x3e, ++ 0x84, 0x3c, 0xe0, 0x46, 0x00, 0x00, 0x00, 0x00 ++}; ++ ++void bnx2x_init_e1_firmware(struct bnx2x *bp) ++{ ++ INIT_OPS(bp) = (struct raw_op *)init_ops_e1; ++ INIT_DATA(bp) = (u32 *)init_data_e1; ++ INIT_OPS_OFFSETS(bp) = (u16 *)init_ops_offsets_e1; ++ INIT_TSEM_INT_TABLE_DATA(bp) = tsem_int_table_data_e1; ++ INIT_TSEM_PRAM_DATA(bp) = tsem_pram_data_e1; ++ INIT_USEM_INT_TABLE_DATA(bp) = usem_int_table_data_e1; ++ INIT_USEM_PRAM_DATA(bp) = usem_pram_data_e1; ++ INIT_XSEM_INT_TABLE_DATA(bp) = xsem_int_table_data_e1; ++ INIT_XSEM_PRAM_DATA(bp) = xsem_pram_data_e1; ++ INIT_CSEM_INT_TABLE_DATA(bp) = csem_int_table_data_e1; ++ INIT_CSEM_PRAM_DATA(bp) = csem_pram_data_e1; ++} ++ +diff -r ddb96c0bbe13 drivers/net/bnx2x_init_values_e1h.c +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/bnx2x_init_values_e1h.c Tue Jun 16 13:15:30 2009 +0100 +@@ -0,0 +1,17781 @@ ++/* init_ops array contains the list of operations needed to initialize the chip. ++ * ++ * For each block in the chip there are three init stages: ++ * common - HW used by both ports, ++ * port1 and port2 - initialization for a specific Ethernet port. ++ * When a port is opened or closed, the management CPU tells the driver ++ * whether to init/disable common HW in addition to the port HW. ++ * This way the first port going up will first initializes the common HW, ++ * and the last port going down also resets the common HW ++ * ++ * For each init stage/block there is a list of actions needed in a format: ++ * {operation, register, data} ++ * where: ++ * OP_WR - write a value to the chip. ++ * OP_RD - read a register (usually a clear on read register). ++ * OP_SW - string write, write a section of consecutive addresses to the chip. ++ * OP_SI - copy a string using indirect writes. ++ * OP_ZR - clear a range of memory. ++ * OP_ZP - unzip and copy using DMAE. ++ * OP_WB - string copy using DMAE. ++ * ++ * The #defines mark the stages. ++ * ++ */ ++#include ++#include ++#include ++#include ++#include ++#include "bnx2x_compat.h" ++#include "bnx2x_init.h" ++#include "bnx2x.h" ++ ++ ++static const struct raw_op init_ops_e1h[] = { ++/* #define PRS_COMMON_START 0 */ ++ {OP_WR, PRS_REG_INC_VALUE, 0xf}, ++ {OP_WR, PRS_REG_EVENT_ID_1, 0x45}, ++ {OP_WR, PRS_REG_EVENT_ID_2, 0x84}, ++ {OP_WR, PRS_REG_EVENT_ID_3, 0x6}, ++ {OP_WR, PRS_REG_NO_MATCH_EVENT_ID, 0x4}, ++ {OP_WR, PRS_REG_CM_HDR_TYPE_0, 0x0}, ++ {OP_WR, PRS_REG_CM_HDR_TYPE_1, 0x12170000}, ++ {OP_WR, PRS_REG_CM_HDR_TYPE_2, 0x22170000}, ++ {OP_WR, PRS_REG_CM_HDR_TYPE_3, 0x32170000}, ++ {OP_ZR, PRS_REG_CM_HDR_TYPE_4, 0x5}, ++ {OP_WR, PRS_REG_CM_HDR_LOOPBACK_TYPE_1, 0x12150000}, ++ {OP_WR, PRS_REG_CM_HDR_LOOPBACK_TYPE_2, 0x22150000}, ++ {OP_WR, PRS_REG_CM_HDR_LOOPBACK_TYPE_3, 0x32150000}, ++ {OP_ZR, PRS_REG_CM_HDR_LOOPBACK_TYPE_4, 0x4}, ++ {OP_WR, PRS_REG_CM_NO_MATCH_HDR, 0x2100000}, ++ {OP_WR, PRS_REG_CM_HDR_FLUSH_NO_LOAD_TYPE_0, 0x100000}, ++ {OP_WR, PRS_REG_CM_HDR_FLUSH_NO_LOAD_TYPE_1, 0x10100000}, ++ {OP_WR, PRS_REG_CM_HDR_FLUSH_NO_LOAD_TYPE_2, 0x20100000}, ++ {OP_WR, PRS_REG_CM_HDR_FLUSH_NO_LOAD_TYPE_3, 0x30100000}, ++ {OP_WR, PRS_REG_CM_HDR_FLUSH_NO_LOAD_TYPE_4, 0x40100000}, ++ {OP_ZR, PRS_REG_CM_HDR_FLUSH_NO_LOAD_TYPE_5, 0x3}, ++ {OP_WR, PRS_REG_CM_HDR_FLUSH_LOAD_TYPE_0, 0x100000}, ++ {OP_WR, PRS_REG_CM_HDR_FLUSH_LOAD_TYPE_1, 0x12140000}, ++ {OP_WR, PRS_REG_CM_HDR_FLUSH_LOAD_TYPE_2, 0x22140000}, ++ {OP_WR, PRS_REG_CM_HDR_FLUSH_LOAD_TYPE_3, 0x32140000}, ++ {OP_WR, PRS_REG_CM_HDR_FLUSH_LOAD_TYPE_4, 0x42140000}, ++ {OP_ZR, PRS_REG_CM_HDR_FLUSH_LOAD_TYPE_5, 0x3}, ++ {OP_RD, PRS_REG_NUM_OF_PACKETS, 0x0}, ++ {OP_RD, PRS_REG_NUM_OF_CFC_FLUSH_MESSAGES, 0x0}, ++ {OP_RD, PRS_REG_NUM_OF_TRANSPARENT_FLUSH_MESSAGES, 0x0}, ++ {OP_RD, PRS_REG_NUM_OF_DEAD_CYCLES, 0x0}, ++ {OP_WR, PRS_REG_FCOE_TYPE, 0x8906}, ++ {OP_WR, PRS_REG_FLUSH_REGIONS_TYPE_0, 0xff}, ++ {OP_WR, PRS_REG_FLUSH_REGIONS_TYPE_1, 0xff}, ++ {OP_WR, PRS_REG_FLUSH_REGIONS_TYPE_2, 0xff}, ++ {OP_WR, PRS_REG_FLUSH_REGIONS_TYPE_3, 0xff}, ++ {OP_WR, PRS_REG_FLUSH_REGIONS_TYPE_4, 0xff}, ++ {OP_WR, PRS_REG_FLUSH_REGIONS_TYPE_5, 0xff}, ++ {OP_WR, PRS_REG_FLUSH_REGIONS_TYPE_6, 0xff}, ++ {OP_WR, PRS_REG_FLUSH_REGIONS_TYPE_7, 0xff}, ++ {OP_WR, PRS_REG_PURE_REGIONS, 0x3e}, ++ {OP_WR, PRS_REG_PACKET_REGIONS_TYPE_0, 0x0}, ++ {OP_WR, PRS_REG_PACKET_REGIONS_TYPE_1, 0x3f}, ++ {OP_WR, PRS_REG_PACKET_REGIONS_TYPE_2, 0x3f}, ++ {OP_WR, PRS_REG_PACKET_REGIONS_TYPE_3, 0x3f}, ++ {OP_WR, PRS_REG_PACKET_REGIONS_TYPE_4, 0x3f}, ++ {OP_WR, PRS_REG_PACKET_REGIONS_TYPE_5, 0x3f}, ++ {OP_WR, PRS_REG_PACKET_REGIONS_TYPE_6, 0x3f}, ++ {OP_WR, PRS_REG_PACKET_REGIONS_TYPE_7, 0x3f}, ++/* #define PRS_COMMON_END 1 */ ++/* #define SRCH_COMMON_START 22 */ ++ {OP_WR, SRC_REG_E1HMF_ENABLE, 0x1}, ++/* #define SRCH_COMMON_END 23 */ ++/* #define TSDM_COMMON_START 44 */ ++ {OP_WR, TSDM_REG_CFC_RSP_START_ADDR, 0x211}, ++ {OP_WR, TSDM_REG_CMP_COUNTER_START_ADDR, 0x200}, ++ {OP_WR, TSDM_REG_Q_COUNTER_START_ADDR, 0x204}, ++ {OP_WR, TSDM_REG_PCK_END_MSG_START_ADDR, 0x219}, ++ {OP_WR, TSDM_REG_CMP_COUNTER_MAX0, 0xffff}, ++ {OP_WR, TSDM_REG_CMP_COUNTER_MAX1, 0xffff}, ++ {OP_WR, TSDM_REG_CMP_COUNTER_MAX2, 0xffff}, ++ {OP_WR, TSDM_REG_CMP_COUNTER_MAX3, 0xffff}, ++ {OP_WR, TSDM_REG_AGG_INT_EVENT_0, 0x20}, ++ {OP_WR, TSDM_REG_AGG_INT_EVENT_1, 0x0}, ++ {OP_WR, TSDM_REG_AGG_INT_EVENT_2, 0x34}, ++ {OP_WR, TSDM_REG_AGG_INT_EVENT_3, 0x35}, ++ {OP_ZR, TSDM_REG_AGG_INT_EVENT_4, 0x1c}, ++ {OP_WR, TSDM_REG_AGG_INT_T_0, 0x1}, ++ {OP_ZR, TSDM_REG_AGG_INT_T_1, 0x5f}, ++ {OP_WR, TSDM_REG_ENABLE_IN1, 0x7ffffff}, ++ {OP_WR, TSDM_REG_ENABLE_IN2, 0x3f}, ++ {OP_WR, TSDM_REG_ENABLE_OUT1, 0x7ffffff}, ++ {OP_WR, TSDM_REG_ENABLE_OUT2, 0xf}, ++ {OP_RD, TSDM_REG_NUM_OF_Q0_CMD, 0x0}, ++ {OP_RD, TSDM_REG_NUM_OF_Q1_CMD, 0x0}, ++ {OP_RD, TSDM_REG_NUM_OF_Q3_CMD, 0x0}, ++ {OP_RD, TSDM_REG_NUM_OF_Q4_CMD, 0x0}, ++ {OP_RD, TSDM_REG_NUM_OF_Q5_CMD, 0x0}, ++ {OP_RD, TSDM_REG_NUM_OF_Q6_CMD, 0x0}, ++ {OP_RD, TSDM_REG_NUM_OF_Q7_CMD, 0x0}, ++ {OP_RD, TSDM_REG_NUM_OF_Q8_CMD, 0x0}, ++ {OP_RD, TSDM_REG_NUM_OF_Q9_CMD, 0x0}, ++ {OP_RD, TSDM_REG_NUM_OF_Q10_CMD, 0x0}, ++ {OP_RD, TSDM_REG_NUM_OF_Q11_CMD, 0x0}, ++ {OP_RD, TSDM_REG_NUM_OF_PKT_END_MSG, 0x0}, ++ {OP_RD, TSDM_REG_NUM_OF_PXP_ASYNC_REQ, 0x0}, ++ {OP_RD, TSDM_REG_NUM_OF_ACK_AFTER_PLACE, 0x0}, ++ {OP_WR_ASIC, TSDM_REG_TIMER_TICK, 0x3e8}, ++ {OP_WR_EMUL, TSDM_REG_TIMER_TICK, 0x1}, ++ {OP_WR_FPGA, TSDM_REG_TIMER_TICK, 0xa}, ++/* #define TSDM_COMMON_END 45 */ ++/* #define TCM_COMMON_START 66 */ ++ {OP_WR, TCM_REG_XX_MAX_LL_SZ, 0x20}, ++ {OP_WR, TCM_REG_XX_OVFL_EVNT_ID, 0x32}, ++ {OP_WR, TCM_REG_TQM_TCM_HDR_P, 0x2150020}, ++ {OP_WR, TCM_REG_TQM_TCM_HDR_S, 0x2150020}, ++ {OP_WR, TCM_REG_TM_TCM_HDR, 0x30}, ++ {OP_WR, TCM_REG_ERR_TCM_HDR, 0x8100000}, ++ {OP_WR, TCM_REG_ERR_EVNT_ID, 0x33}, ++ {OP_WR, TCM_REG_EXPR_EVNT_ID, 0x30}, ++ {OP_WR, TCM_REG_STOP_EVNT_ID, 0x31}, ++ {OP_WR, TCM_REG_STORM_WEIGHT, 0x2}, ++ {OP_WR, TCM_REG_PRS_WEIGHT, 0x5}, ++ {OP_WR, TCM_REG_PBF_WEIGHT, 0x6}, ++ {OP_WR, TCM_REG_USEM_WEIGHT, 0x2}, ++ {OP_WR, TCM_REG_CSEM_WEIGHT, 0x2}, ++ {OP_WR, TCM_REG_CP_WEIGHT, 0x0}, ++ {OP_WR, TCM_REG_TSDM_WEIGHT, 0x5}, ++ {OP_WR, TCM_REG_TQM_P_WEIGHT, 0x2}, ++ {OP_WR, TCM_REG_TQM_S_WEIGHT, 0x2}, ++ {OP_WR, TCM_REG_TM_WEIGHT, 0x2}, ++ {OP_WR, TCM_REG_TCM_TQM_USE_Q, 0x1}, ++ {OP_WR, TCM_REG_GR_ARB_TYPE, 0x1}, ++ {OP_WR, TCM_REG_GR_LD0_PR, 0x1}, ++ {OP_WR, TCM_REG_GR_LD1_PR, 0x2}, ++ {OP_WR, TCM_REG_CFC_INIT_CRD, 0x1}, ++ {OP_WR, TCM_REG_FIC0_INIT_CRD, 0x40}, ++ {OP_WR, TCM_REG_FIC1_INIT_CRD, 0x40}, ++ {OP_WR, TCM_REG_TQM_INIT_CRD, 0x20}, ++ {OP_WR, TCM_REG_XX_INIT_CRD, 0x13}, ++ {OP_WR, TCM_REG_XX_MSG_NUM, 0x20}, ++ {OP_ZR, TCM_REG_XX_TABLE, 0xa}, ++ {OP_SW, TCM_REG_XX_DESCR_TABLE, 0x200000}, ++ {OP_WR, TCM_REG_N_SM_CTX_LD_0, 0x7}, ++ {OP_WR, TCM_REG_N_SM_CTX_LD_1, 0x7}, ++ {OP_WR, TCM_REG_N_SM_CTX_LD_2, 0x8}, ++ {OP_WR, TCM_REG_N_SM_CTX_LD_3, 0x8}, ++ {OP_WR, TCM_REG_N_SM_CTX_LD_4, 0x1}, ++ {OP_ZR, TCM_REG_N_SM_CTX_LD_5, 0x3}, ++ {OP_WR, TCM_REG_TCM_REG0_SZ, 0x6}, ++ {OP_WR, TCM_REG_TCM_STORM0_IFEN, 0x1}, ++ {OP_WR, TCM_REG_TCM_STORM1_IFEN, 0x1}, ++ {OP_WR, TCM_REG_TCM_TQM_IFEN, 0x1}, ++ {OP_WR, TCM_REG_STORM_TCM_IFEN, 0x1}, ++ {OP_WR, TCM_REG_TQM_TCM_IFEN, 0x1}, ++ {OP_WR, TCM_REG_TSDM_IFEN, 0x1}, ++ {OP_WR, TCM_REG_TM_TCM_IFEN, 0x1}, ++ {OP_WR, TCM_REG_PRS_IFEN, 0x1}, ++ {OP_WR, TCM_REG_PBF_IFEN, 0x1}, ++ {OP_WR, TCM_REG_USEM_IFEN, 0x1}, ++ {OP_WR, TCM_REG_CSEM_IFEN, 0x1}, ++ {OP_WR, TCM_REG_CDU_AG_WR_IFEN, 0x1}, ++ {OP_WR, TCM_REG_CDU_AG_RD_IFEN, 0x1}, ++ {OP_WR, TCM_REG_CDU_SM_WR_IFEN, 0x1}, ++ {OP_WR, TCM_REG_CDU_SM_RD_IFEN, 0x1}, ++ {OP_WR, TCM_REG_TCM_CFC_IFEN, 0x1}, ++/* #define TCM_COMMON_END 67 */ ++/* #define TCM_FUNC0_START 72 */ ++ {OP_WR, TCM_REG_PHYS_QNUM0_0, 0xd}, ++ {OP_WR, TCM_REG_PHYS_QNUM1_0, 0x7}, ++ {OP_WR, TCM_REG_PHYS_QNUM2_0, 0x7}, ++ {OP_WR, TCM_REG_PHYS_QNUM3_0, 0x7}, ++/* #define TCM_FUNC0_END 73 */ ++/* #define TCM_FUNC1_START 74 */ ++ {OP_WR, TCM_REG_PHYS_QNUM0_1, 0x2d}, ++ {OP_WR, TCM_REG_PHYS_QNUM1_1, 0x27}, ++ {OP_WR, TCM_REG_PHYS_QNUM2_1, 0x27}, ++ {OP_WR, TCM_REG_PHYS_QNUM3_1, 0x27}, ++/* #define TCM_FUNC1_END 75 */ ++/* #define TCM_FUNC2_START 76 */ ++ {OP_WR, TCM_REG_PHYS_QNUM0_0, 0x1d}, ++ {OP_WR, TCM_REG_PHYS_QNUM1_0, 0x17}, ++ {OP_WR, TCM_REG_PHYS_QNUM2_0, 0x17}, ++ {OP_WR, TCM_REG_PHYS_QNUM3_0, 0x17}, ++/* #define TCM_FUNC2_END 77 */ ++/* #define TCM_FUNC3_START 78 */ ++ {OP_WR, TCM_REG_PHYS_QNUM0_1, 0x3d}, ++ {OP_WR, TCM_REG_PHYS_QNUM1_1, 0x37}, ++ {OP_WR, TCM_REG_PHYS_QNUM2_1, 0x37}, ++ {OP_WR, TCM_REG_PHYS_QNUM3_1, 0x37}, ++/* #define TCM_FUNC3_END 79 */ ++/* #define TCM_FUNC4_START 80 */ ++ {OP_WR, TCM_REG_PHYS_QNUM0_0, 0x4d}, ++ {OP_WR, TCM_REG_PHYS_QNUM1_0, 0x47}, ++ {OP_WR, TCM_REG_PHYS_QNUM2_0, 0x47}, ++ {OP_WR, TCM_REG_PHYS_QNUM3_0, 0x47}, ++/* #define TCM_FUNC4_END 81 */ ++/* #define TCM_FUNC5_START 82 */ ++ {OP_WR, TCM_REG_PHYS_QNUM0_1, 0x6d}, ++ {OP_WR, TCM_REG_PHYS_QNUM1_1, 0x67}, ++ {OP_WR, TCM_REG_PHYS_QNUM2_1, 0x67}, ++ {OP_WR, TCM_REG_PHYS_QNUM3_1, 0x67}, ++/* #define TCM_FUNC5_END 83 */ ++/* #define TCM_FUNC6_START 84 */ ++ {OP_WR, TCM_REG_PHYS_QNUM0_0, 0x5d}, ++ {OP_WR, TCM_REG_PHYS_QNUM1_0, 0x57}, ++ {OP_WR, TCM_REG_PHYS_QNUM2_0, 0x57}, ++ {OP_WR, TCM_REG_PHYS_QNUM3_0, 0x57}, ++/* #define TCM_FUNC6_END 85 */ ++/* #define TCM_FUNC7_START 86 */ ++ {OP_WR, TCM_REG_PHYS_QNUM0_1, 0x7d}, ++ {OP_WR, TCM_REG_PHYS_QNUM1_1, 0x77}, ++ {OP_WR, TCM_REG_PHYS_QNUM2_1, 0x77}, ++ {OP_WR, TCM_REG_PHYS_QNUM3_1, 0x77}, ++/* #define TCM_FUNC7_END 87 */ ++/* #define BRB1_COMMON_START 88 */ ++ {OP_SW, BRB1_REG_LL_RAM, 0x2000020}, ++ {OP_WR, BRB1_REG_SOFT_RESET, 0x1}, ++ {OP_RD, BRB1_REG_NUM_OF_FULL_CYCLES_4, 0x0}, ++ {OP_SW, BRB1_REG_FREE_LIST_PRS_CRDT, 0x30220}, ++ {OP_WR, BRB1_REG_SOFT_RESET, 0x0}, ++/* #define BRB1_COMMON_END 89 */ ++/* #define BRB1_PORT0_START 90 */ ++ {OP_RD, BRB1_REG_NUM_OF_PAUSE_CYCLES_0, 0x0}, ++ {OP_RD, BRB1_REG_NUM_OF_FULL_CYCLES_0, 0x0}, ++/* #define BRB1_PORT0_END 91 */ ++/* #define BRB1_PORT1_START 92 */ ++ {OP_RD, BRB1_REG_NUM_OF_PAUSE_CYCLES_1, 0x0}, ++ {OP_RD, BRB1_REG_NUM_OF_FULL_CYCLES_1, 0x0}, ++/* #define BRB1_PORT1_END 93 */ ++/* #define TSEM_COMMON_START 110 */ ++ {OP_ZP, TSEM_REG_INT_TABLE, 0xa90000}, ++ {OP_WR_64, TSEM_REG_INT_TABLE + 0x3c8, 0x70223}, ++ {OP_ZP, TSEM_REG_PRAM, 0x2c2e0000}, ++ {OP_ZP, TSEM_REG_PRAM + 0x8000, 0x38a10b0c}, ++ {OP_ZP, TSEM_REG_PRAM + 0x10000, 0x28ef1935}, ++ {OP_WR_64, TSEM_REG_PRAM + 0x16810, 0x52fe0225}, ++ {OP_RD, TSEM_REG_MSG_NUM_FIC0, 0x0}, ++ {OP_RD, TSEM_REG_MSG_NUM_FIC1, 0x0}, ++ {OP_RD, TSEM_REG_MSG_NUM_FOC0, 0x0}, ++ {OP_RD, TSEM_REG_MSG_NUM_FOC1, 0x0}, ++ {OP_RD, TSEM_REG_MSG_NUM_FOC2, 0x0}, ++ {OP_RD, TSEM_REG_MSG_NUM_FOC3, 0x0}, ++ {OP_WR, TSEM_REG_ARB_ELEMENT0, 0x1}, ++ {OP_WR, TSEM_REG_ARB_ELEMENT1, 0x2}, ++ {OP_WR, TSEM_REG_ARB_ELEMENT2, 0x3}, ++ {OP_WR, TSEM_REG_ARB_ELEMENT3, 0x0}, ++ {OP_WR, TSEM_REG_ARB_ELEMENT4, 0x4}, ++ {OP_WR, TSEM_REG_ARB_CYCLE_SIZE, 0x1}, ++ {OP_WR, TSEM_REG_TS_0_AS, 0x0}, ++ {OP_WR, TSEM_REG_TS_1_AS, 0x1}, ++ {OP_WR, TSEM_REG_TS_2_AS, 0x4}, ++ {OP_WR, TSEM_REG_TS_3_AS, 0x0}, ++ {OP_WR, TSEM_REG_TS_4_AS, 0x1}, ++ {OP_WR, TSEM_REG_TS_5_AS, 0x3}, ++ {OP_WR, TSEM_REG_TS_6_AS, 0x0}, ++ {OP_WR, TSEM_REG_TS_7_AS, 0x1}, ++ {OP_WR, TSEM_REG_TS_8_AS, 0x4}, ++ {OP_WR, TSEM_REG_TS_9_AS, 0x0}, ++ {OP_WR, TSEM_REG_TS_10_AS, 0x1}, ++ {OP_WR, TSEM_REG_TS_11_AS, 0x3}, ++ {OP_WR, TSEM_REG_TS_12_AS, 0x0}, ++ {OP_WR, TSEM_REG_TS_13_AS, 0x1}, ++ {OP_WR, TSEM_REG_TS_14_AS, 0x4}, ++ {OP_WR, TSEM_REG_TS_15_AS, 0x0}, ++ {OP_WR, TSEM_REG_TS_16_AS, 0x4}, ++ {OP_WR, TSEM_REG_TS_17_AS, 0x3}, ++ {OP_ZR, TSEM_REG_TS_18_AS, 0x2}, ++ {OP_WR, TSEM_REG_ENABLE_IN, 0x3fff}, ++ {OP_WR, TSEM_REG_ENABLE_OUT, 0x3ff}, ++ {OP_WR, TSEM_REG_FIC0_DISABLE, 0x0}, ++ {OP_WR, TSEM_REG_FIC1_DISABLE, 0x0}, ++ {OP_WR, TSEM_REG_PAS_DISABLE, 0x0}, ++ {OP_WR, TSEM_REG_THREADS_LIST, 0xff}, ++ {OP_ZR, TSEM_REG_PASSIVE_BUFFER, 0x400}, ++ {OP_WR, TSEM_REG_FAST_MEMORY + 0x18bc0, 0x1}, ++ {OP_WR, TSEM_REG_FAST_MEMORY + 0x18000, 0x34}, ++ {OP_WR, TSEM_REG_FAST_MEMORY + 0x18040, 0x18}, ++ {OP_WR, TSEM_REG_FAST_MEMORY + 0x18080, 0xc}, ++ {OP_WR, TSEM_REG_FAST_MEMORY + 0x180c0, 0x20}, ++ {OP_WR_ASIC, TSEM_REG_FAST_MEMORY + 0x18300, 0x7a120}, ++ {OP_WR_EMUL, TSEM_REG_FAST_MEMORY + 0x18300, 0x138}, ++ {OP_WR_FPGA, TSEM_REG_FAST_MEMORY + 0x18300, 0x1388}, ++ {OP_WR, TSEM_REG_FAST_MEMORY + 0x183c0, 0x1f4}, ++ {OP_WR, TSEM_REG_FAST_MEMORY + 0x11480, 0x1}, ++ {OP_WR_EMUL, TSEM_REG_FAST_MEMORY + 0x11480, 0x0}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x1000, 0x3b3}, ++ {OP_SW, TSEM_REG_FAST_MEMORY + 0x1000 + 0xecc, 0x10227}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0xa020, 0xc8}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0xa000, 0x2}, ++ {OP_WR, TSEM_REG_FAST_MEMORY + 0x1ed0, 0x0}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x1ed8, 0x6}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x36e8, 0x4}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x36e0, 0x2}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x5000, 0x2}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x5008, 0x4}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x5018, 0x4}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x5028, 0x4}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x5038, 0x4}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x5048, 0x4}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x5058, 0x4}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x5068, 0x4}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x5078, 0x2}, ++ {OP_SW, TSEM_REG_FAST_MEMORY + 0x4040, 0x20228}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x4000, 0x2}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x4008, 0x2}, ++ {OP_SW, TSEM_REG_FAST_MEMORY + 0x62c0, 0x20022a}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0xd100, 0x2}, ++/* #define TSEM_COMMON_END 111 */ ++/* #define TSEM_PORT0_START 112 */ ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x2000, 0x124}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0xb000, 0x28}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0xb140, 0xc}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x3300, 0x14}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x33a0, 0x68}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x8108, 0x2}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0xd1c8, 0x2}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0xd1d8, 0x20}, ++/* #define TSEM_PORT0_END 113 */ ++/* #define TSEM_PORT1_START 114 */ ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x2490, 0x124}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0xb0a0, 0x28}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0xb170, 0xc}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x3350, 0x14}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x3540, 0x68}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x8110, 0x2}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0xd1d0, 0x2}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0xd258, 0x20}, ++/* #define TSEM_PORT1_END 115 */ ++/* #define TSEM_FUNC0_START 116 */ ++ {OP_WR, TSEM_REG_FAST_MEMORY + 0x2920, 0x0}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x3000, 0x2}, ++ {OP_SW, TSEM_REG_FAST_MEMORY + 0x3000 + 0x8, 0x5024a}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x3000 + 0x1c, 0x9}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x3200, 0x8}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x5000, 0x2}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x5080, 0x12}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x4000, 0x2}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0xd0c0, 0x2}, ++/* #define TSEM_FUNC0_END 117 */ ++/* #define TSEM_FUNC1_START 118 */ ++ {OP_WR, TSEM_REG_FAST_MEMORY + 0x2924, 0x0}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x3040, 0x2}, ++ {OP_SW, TSEM_REG_FAST_MEMORY + 0x3040 + 0x8, 0x5024f}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x3040 + 0x1c, 0x9}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x3220, 0x8}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x5010, 0x2}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x50c8, 0x12}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x4008, 0x2}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0xd0c8, 0x2}, ++/* #define TSEM_FUNC1_END 119 */ ++/* #define TSEM_FUNC2_START 120 */ ++ {OP_WR, TSEM_REG_FAST_MEMORY + 0x2928, 0x0}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x3080, 0x2}, ++ {OP_SW, TSEM_REG_FAST_MEMORY + 0x3080 + 0x8, 0x50254}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x3080 + 0x1c, 0x9}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x3240, 0x8}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x5020, 0x2}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x5110, 0x12}, ++ {OP_SW, TSEM_REG_FAST_MEMORY + 0x4010, 0x20259}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0xd0d0, 0x2}, ++/* #define TSEM_FUNC2_END 121 */ ++/* #define TSEM_FUNC3_START 122 */ ++ {OP_WR, TSEM_REG_FAST_MEMORY + 0x292c, 0x0}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x30c0, 0x2}, ++ {OP_SW, TSEM_REG_FAST_MEMORY + 0x30c0 + 0x8, 0x5025b}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x30c0 + 0x1c, 0x9}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x3260, 0x8}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x5030, 0x2}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x5158, 0x12}, ++ {OP_SW, TSEM_REG_FAST_MEMORY + 0x4018, 0x20260}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0xd0d8, 0x2}, ++/* #define TSEM_FUNC3_END 123 */ ++/* #define TSEM_FUNC4_START 124 */ ++ {OP_WR, TSEM_REG_FAST_MEMORY + 0x2930, 0x0}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x3100, 0x2}, ++ {OP_SW, TSEM_REG_FAST_MEMORY + 0x3100 + 0x8, 0x50262}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x3100 + 0x1c, 0x9}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x3280, 0x8}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x5040, 0x2}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x51a0, 0x12}, ++ {OP_SW, TSEM_REG_FAST_MEMORY + 0x4020, 0x20267}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0xd0e0, 0x2}, ++/* #define TSEM_FUNC4_END 125 */ ++/* #define TSEM_FUNC5_START 126 */ ++ {OP_WR, TSEM_REG_FAST_MEMORY + 0x2934, 0x0}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x3140, 0x2}, ++ {OP_SW, TSEM_REG_FAST_MEMORY + 0x3140 + 0x8, 0x50269}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x3140 + 0x1c, 0x9}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x32a0, 0x8}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x5050, 0x2}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x51e8, 0x12}, ++ {OP_SW, TSEM_REG_FAST_MEMORY + 0x4028, 0x2026e}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0xd0e8, 0x2}, ++/* #define TSEM_FUNC5_END 127 */ ++/* #define TSEM_FUNC6_START 128 */ ++ {OP_WR, TSEM_REG_FAST_MEMORY + 0x2938, 0x0}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x3180, 0x2}, ++ {OP_SW, TSEM_REG_FAST_MEMORY + 0x3180 + 0x8, 0x50270}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x3180 + 0x1c, 0x9}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x32c0, 0x8}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x5060, 0x2}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x5230, 0x12}, ++ {OP_SW, TSEM_REG_FAST_MEMORY + 0x4030, 0x20275}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0xd0f0, 0x2}, ++/* #define TSEM_FUNC6_END 129 */ ++/* #define TSEM_FUNC7_START 130 */ ++ {OP_WR, TSEM_REG_FAST_MEMORY + 0x293c, 0x0}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x31c0, 0x2}, ++ {OP_SW, TSEM_REG_FAST_MEMORY + 0x31c0 + 0x8, 0x50277}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x31c0 + 0x1c, 0x9}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x32e0, 0x8}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x5070, 0x2}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0x5278, 0x12}, ++ {OP_SW, TSEM_REG_FAST_MEMORY + 0x4038, 0x2027c}, ++ {OP_ZR, TSEM_REG_FAST_MEMORY + 0xd0f8, 0x2}, ++/* #define TSEM_FUNC7_END 131 */ ++/* #define MISC_COMMON_START 220 */ ++ {OP_WR, MISC_REG_PLL_STORM_CTRL_1, 0x71d2911}, ++ {OP_WR, MISC_REG_PLL_STORM_CTRL_2, 0x0}, ++ {OP_WR, MISC_REG_PLL_STORM_CTRL_3, 0x9c0424}, ++ {OP_WR, MISC_REG_PLL_STORM_CTRL_4, 0x0}, ++ {OP_WR, MISC_REG_LCPLL_CTRL_1, 0x209}, ++/* #define MISC_COMMON_END 221 */ ++/* #define MISC_FUNC0_START 226 */ ++ {OP_WR, MISC_REG_NIG_WOL_P0, 0x0}, ++/* #define MISC_FUNC0_END 227 */ ++/* #define MISC_FUNC1_START 228 */ ++ {OP_WR, MISC_REG_NIG_WOL_P1, 0x0}, ++/* #define MISC_FUNC1_END 229 */ ++/* #define MISC_FUNC2_START 230 */ ++ {OP_WR, MISC_REG_NIG_WOL_P0, 0x0}, ++/* #define MISC_FUNC2_END 231 */ ++/* #define MISC_FUNC3_START 232 */ ++ {OP_WR, MISC_REG_NIG_WOL_P1, 0x0}, ++/* #define MISC_FUNC3_END 233 */ ++/* #define MISC_FUNC4_START 234 */ ++ {OP_WR, MISC_REG_NIG_WOL_P0, 0x0}, ++/* #define MISC_FUNC4_END 235 */ ++/* #define MISC_FUNC5_START 236 */ ++ {OP_WR, MISC_REG_NIG_WOL_P1, 0x0}, ++/* #define MISC_FUNC5_END 237 */ ++/* #define MISC_FUNC6_START 238 */ ++ {OP_WR, MISC_REG_NIG_WOL_P0, 0x0}, ++/* #define MISC_FUNC6_END 239 */ ++/* #define MISC_FUNC7_START 240 */ ++ {OP_WR, MISC_REG_NIG_WOL_P1, 0x0}, ++/* #define MISC_FUNC7_END 241 */ ++/* #define NIG_COMMON_START 264 */ ++ {OP_WR, NIG_REG_PBF_LB_IN_EN, 0x1}, ++ {OP_WR, NIG_REG_PRS_REQ_IN_EN, 0x1}, ++ {OP_WR, NIG_REG_EGRESS_DEBUG_IN_EN, 0x1}, ++ {OP_WR, NIG_REG_BRB_LB_OUT_EN, 0x1}, ++ {OP_WR, NIG_REG_PRS_EOP_OUT_EN, 0x1}, ++/* #define NIG_COMMON_END 265 */ ++/* #define NIG_PORT0_START 266 */ ++ {OP_WR, NIG_REG_LLH0_CM_HEADER, 0x300000}, ++ {OP_WR, NIG_REG_LLH0_EVENT_ID, 0x28}, ++ {OP_WR, NIG_REG_LLH0_ERROR_MASK, 0x0}, ++ {OP_WR, NIG_REG_LLH0_XCM_MASK, 0x4}, ++ {OP_WR, NIG_REG_LLH0_BRB1_NOT_MCP, 0x1}, ++ {OP_WR, NIG_REG_STATUS_INTERRUPT_PORT0, 0x0}, ++ {OP_WR, NIG_REG_LLFC_EGRESS_SRC_ENABLE_0, 0x7}, ++ {OP_WR, NIG_REG_LLH0_CLS_TYPE, 0x1}, ++ {OP_WR, NIG_REG_LLH0_XCM_INIT_CREDIT, 0x30}, ++ {OP_WR, NIG_REG_BRB0_PAUSE_IN_EN, 0x1}, ++ {OP_WR, NIG_REG_EGRESS_PBF0_IN_EN, 0x1}, ++ {OP_WR, NIG_REG_BRB0_OUT_EN, 0x1}, ++ {OP_WR, NIG_REG_XCM0_OUT_EN, 0x1}, ++/* #define NIG_PORT0_END 267 */ ++/* #define NIG_PORT1_START 268 */ ++ {OP_WR, NIG_REG_LLH1_CM_HEADER, 0x300000}, ++ {OP_WR, NIG_REG_LLH1_EVENT_ID, 0x28}, ++ {OP_WR, NIG_REG_LLH1_ERROR_MASK, 0x0}, ++ {OP_WR, NIG_REG_LLH1_XCM_MASK, 0x4}, ++ {OP_WR, NIG_REG_LLH1_BRB1_NOT_MCP, 0x1}, ++ {OP_WR, NIG_REG_STATUS_INTERRUPT_PORT1, 0x0}, ++ {OP_WR, NIG_REG_LLFC_EGRESS_SRC_ENABLE_1, 0x7}, ++ {OP_WR, NIG_REG_LLH1_CLS_TYPE, 0x1}, ++ {OP_WR, NIG_REG_LLH1_XCM_INIT_CREDIT, 0x30}, ++ {OP_WR, NIG_REG_BRB1_PAUSE_IN_EN, 0x1}, ++ {OP_WR, NIG_REG_EGRESS_PBF1_IN_EN, 0x1}, ++ {OP_WR, NIG_REG_BRB1_OUT_EN, 0x1}, ++ {OP_WR, NIG_REG_XCM1_OUT_EN, 0x1}, ++/* #define NIG_PORT1_END 269 */ ++/* #define UPB_COMMON_START 308 */ ++ {OP_WR, GRCBASE_UPB + PB_REG_CONTROL, 0x20}, ++/* #define UPB_COMMON_END 309 */ ++/* #define CSDM_COMMON_START 330 */ ++ {OP_WR, CSDM_REG_CFC_RSP_START_ADDR, 0x211}, ++ {OP_WR, CSDM_REG_CMP_COUNTER_START_ADDR, 0x200}, ++ {OP_WR, CSDM_REG_Q_COUNTER_START_ADDR, 0x204}, ++ {OP_WR, CSDM_REG_CMP_COUNTER_MAX0, 0xffff}, ++ {OP_WR, CSDM_REG_CMP_COUNTER_MAX1, 0xffff}, ++ {OP_WR, CSDM_REG_CMP_COUNTER_MAX2, 0xffff}, ++ {OP_WR, CSDM_REG_CMP_COUNTER_MAX3, 0xffff}, ++ {OP_ZR, CSDM_REG_AGG_INT_EVENT_0, 0x2}, ++ {OP_WR, CSDM_REG_AGG_INT_EVENT_2, 0x34}, ++ {OP_WR, CSDM_REG_AGG_INT_EVENT_3, 0x35}, ++ {OP_WR, CSDM_REG_AGG_INT_EVENT_4, 0x20}, ++ {OP_WR, CSDM_REG_AGG_INT_EVENT_5, 0x21}, ++ {OP_WR, CSDM_REG_AGG_INT_EVENT_6, 0x22}, ++ {OP_WR, CSDM_REG_AGG_INT_EVENT_7, 0x23}, ++ {OP_WR, CSDM_REG_AGG_INT_EVENT_8, 0x24}, ++ {OP_WR, CSDM_REG_AGG_INT_EVENT_9, 0x25}, ++ {OP_WR, CSDM_REG_AGG_INT_EVENT_10, 0x26}, ++ {OP_WR, CSDM_REG_AGG_INT_EVENT_11, 0x27}, ++ {OP_WR, CSDM_REG_AGG_INT_EVENT_12, 0x28}, ++ {OP_WR, CSDM_REG_AGG_INT_EVENT_13, 0x29}, ++ {OP_WR, CSDM_REG_AGG_INT_EVENT_14, 0x2a}, ++ {OP_WR, CSDM_REG_AGG_INT_EVENT_15, 0x2b}, ++ {OP_ZR, CSDM_REG_AGG_INT_EVENT_16, 0x56}, ++ {OP_WR, CSDM_REG_AGG_INT_MODE_6, 0x1}, ++ {OP_WR, CSDM_REG_AGG_INT_MODE_7, 0x1}, ++ {OP_WR, CSDM_REG_AGG_INT_MODE_8, 0x1}, ++ {OP_WR, CSDM_REG_AGG_INT_MODE_9, 0x1}, ++ {OP_WR, CSDM_REG_AGG_INT_MODE_10, 0x1}, ++ {OP_WR, CSDM_REG_AGG_INT_MODE_11, 0x1}, ++ {OP_WR, CSDM_REG_AGG_INT_MODE_12, 0x1}, ++ {OP_WR, CSDM_REG_AGG_INT_MODE_13, 0x1}, ++ {OP_WR, CSDM_REG_AGG_INT_MODE_14, 0x1}, ++ {OP_WR, CSDM_REG_AGG_INT_MODE_15, 0x1}, ++ {OP_ZR, CSDM_REG_AGG_INT_MODE_16, 0x10}, ++ {OP_WR, CSDM_REG_ENABLE_IN1, 0x7ffffff}, ++ {OP_WR, CSDM_REG_ENABLE_IN2, 0x3f}, ++ {OP_WR, CSDM_REG_ENABLE_OUT1, 0x7ffffff}, ++ {OP_WR, CSDM_REG_ENABLE_OUT2, 0xf}, ++ {OP_RD, CSDM_REG_NUM_OF_Q0_CMD, 0x0}, ++ {OP_RD, CSDM_REG_NUM_OF_Q1_CMD, 0x0}, ++ {OP_RD, CSDM_REG_NUM_OF_Q3_CMD, 0x0}, ++ {OP_RD, CSDM_REG_NUM_OF_Q4_CMD, 0x0}, ++ {OP_RD, CSDM_REG_NUM_OF_Q5_CMD, 0x0}, ++ {OP_RD, CSDM_REG_NUM_OF_Q6_CMD, 0x0}, ++ {OP_RD, CSDM_REG_NUM_OF_Q7_CMD, 0x0}, ++ {OP_RD, CSDM_REG_NUM_OF_Q8_CMD, 0x0}, ++ {OP_RD, CSDM_REG_NUM_OF_Q9_CMD, 0x0}, ++ {OP_RD, CSDM_REG_NUM_OF_Q10_CMD, 0x0}, ++ {OP_RD, CSDM_REG_NUM_OF_Q11_CMD, 0x0}, ++ {OP_RD, CSDM_REG_NUM_OF_PKT_END_MSG, 0x0}, ++ {OP_RD, CSDM_REG_NUM_OF_PXP_ASYNC_REQ, 0x0}, ++ {OP_RD, CSDM_REG_NUM_OF_ACK_AFTER_PLACE, 0x0}, ++ {OP_WR_ASIC, CSDM_REG_TIMER_TICK, 0x3e8}, ++ {OP_WR_EMUL, CSDM_REG_TIMER_TICK, 0x1}, ++ {OP_WR_FPGA, CSDM_REG_TIMER_TICK, 0xa}, ++/* #define CSDM_COMMON_END 331 */ ++/* #define USDM_COMMON_START 352 */ ++ {OP_WR, USDM_REG_CFC_RSP_START_ADDR, 0x411}, ++ {OP_WR, USDM_REG_CMP_COUNTER_START_ADDR, 0x400}, ++ {OP_WR, USDM_REG_Q_COUNTER_START_ADDR, 0x404}, ++ {OP_WR, USDM_REG_PCK_END_MSG_START_ADDR, 0x421}, ++ {OP_WR, USDM_REG_CMP_COUNTER_MAX0, 0xffff}, ++ {OP_WR, USDM_REG_CMP_COUNTER_MAX1, 0xffff}, ++ {OP_WR, USDM_REG_CMP_COUNTER_MAX2, 0xffff}, ++ {OP_WR, USDM_REG_CMP_COUNTER_MAX3, 0xffff}, ++ {OP_WR, USDM_REG_AGG_INT_EVENT_0, 0x46}, ++ {OP_WR, USDM_REG_AGG_INT_EVENT_1, 0x5}, ++ {OP_ZR, USDM_REG_AGG_INT_EVENT_2, 0x2}, ++ {OP_WR, USDM_REG_AGG_INT_EVENT_4, 0xa}, ++ {OP_WR, USDM_REG_AGG_INT_EVENT_5, 0xf0}, ++ {OP_ZR, USDM_REG_AGG_INT_EVENT_6, 0x1f}, ++ {OP_WR, USDM_REG_AGG_INT_T_5, 0x1}, ++ {OP_ZR, USDM_REG_AGG_INT_T_6, 0x3a}, ++ {OP_WR, USDM_REG_AGG_INT_MODE_0, 0x1}, ++ {OP_ZR, USDM_REG_AGG_INT_MODE_1, 0x3}, ++ {OP_WR, USDM_REG_AGG_INT_MODE_4, 0x1}, ++ {OP_WR, USDM_REG_AGG_INT_MODE_5, 0x1}, ++ {OP_ZR, USDM_REG_AGG_INT_MODE_6, 0x1a}, ++ {OP_WR, USDM_REG_ENABLE_IN1, 0x7ffffff}, ++ {OP_WR, USDM_REG_ENABLE_IN2, 0x3f}, ++ {OP_WR, USDM_REG_ENABLE_OUT1, 0x7ffffff}, ++ {OP_WR, USDM_REG_ENABLE_OUT2, 0xf}, ++ {OP_RD, USDM_REG_NUM_OF_Q0_CMD, 0x0}, ++ {OP_RD, USDM_REG_NUM_OF_Q1_CMD, 0x0}, ++ {OP_RD, USDM_REG_NUM_OF_Q2_CMD, 0x0}, ++ {OP_RD, USDM_REG_NUM_OF_Q3_CMD, 0x0}, ++ {OP_RD, USDM_REG_NUM_OF_Q4_CMD, 0x0}, ++ {OP_RD, USDM_REG_NUM_OF_Q5_CMD, 0x0}, ++ {OP_RD, USDM_REG_NUM_OF_Q6_CMD, 0x0}, ++ {OP_RD, USDM_REG_NUM_OF_Q7_CMD, 0x0}, ++ {OP_RD, USDM_REG_NUM_OF_Q8_CMD, 0x0}, ++ {OP_RD, USDM_REG_NUM_OF_Q9_CMD, 0x0}, ++ {OP_RD, USDM_REG_NUM_OF_Q10_CMD, 0x0}, ++ {OP_RD, USDM_REG_NUM_OF_Q11_CMD, 0x0}, ++ {OP_RD, USDM_REG_NUM_OF_PKT_END_MSG, 0x0}, ++ {OP_RD, USDM_REG_NUM_OF_PXP_ASYNC_REQ, 0x0}, ++ {OP_RD, USDM_REG_NUM_OF_ACK_AFTER_PLACE, 0x0}, ++ {OP_WR_ASIC, USDM_REG_TIMER_TICK, 0x3e8}, ++ {OP_WR_EMUL, USDM_REG_TIMER_TICK, 0x1}, ++ {OP_WR_FPGA, USDM_REG_TIMER_TICK, 0xa}, ++/* #define USDM_COMMON_END 353 */ ++/* #define CCM_COMMON_START 374 */ ++ {OP_WR, CCM_REG_XX_OVFL_EVNT_ID, 0x32}, ++ {OP_WR, CCM_REG_CQM_CCM_HDR_P, 0x2150020}, ++ {OP_WR, CCM_REG_CQM_CCM_HDR_S, 0x2150020}, ++ {OP_WR, CCM_REG_ERR_CCM_HDR, 0x8100000}, ++ {OP_WR, CCM_REG_ERR_EVNT_ID, 0x33}, ++ {OP_WR, CCM_REG_STORM_WEIGHT, 0x2}, ++ {OP_WR, CCM_REG_TSEM_WEIGHT, 0x0}, ++ {OP_WR, CCM_REG_XSEM_WEIGHT, 0x5}, ++ {OP_WR, CCM_REG_USEM_WEIGHT, 0x5}, ++ {OP_ZR, CCM_REG_PBF_WEIGHT, 0x2}, ++ {OP_WR, CCM_REG_CSDM_WEIGHT, 0x2}, ++ {OP_WR, CCM_REG_CQM_P_WEIGHT, 0x3}, ++ {OP_WR, CCM_REG_CQM_S_WEIGHT, 0x2}, ++ {OP_WR, CCM_REG_CCM_CQM_USE_Q, 0x1}, ++ {OP_WR, CCM_REG_CNT_AUX1_Q, 0x2}, ++ {OP_WR, CCM_REG_CNT_AUX2_Q, 0x2}, ++ {OP_WR, CCM_REG_INV_DONE_Q, 0x1}, ++ {OP_WR, CCM_REG_GR_ARB_TYPE, 0x1}, ++ {OP_WR, CCM_REG_GR_LD0_PR, 0x1}, ++ {OP_WR, CCM_REG_GR_LD1_PR, 0x2}, ++ {OP_WR, CCM_REG_CFC_INIT_CRD, 0x1}, ++ {OP_WR, CCM_REG_CQM_INIT_CRD, 0x20}, ++ {OP_WR, CCM_REG_FIC0_INIT_CRD, 0x40}, ++ {OP_WR, CCM_REG_FIC1_INIT_CRD, 0x40}, ++ {OP_WR, CCM_REG_XX_INIT_CRD, 0x3}, ++ {OP_WR, CCM_REG_XX_MSG_NUM, 0x18}, ++ {OP_ZR, CCM_REG_XX_TABLE, 0x12}, ++ {OP_SW, CCM_REG_XX_DESCR_TABLE, 0x24027e}, ++ {OP_WR, CCM_REG_N_SM_CTX_LD_0, 0x1}, ++ {OP_WR, CCM_REG_N_SM_CTX_LD_1, 0x2}, ++ {OP_WR, CCM_REG_N_SM_CTX_LD_2, 0x8}, ++ {OP_WR, CCM_REG_N_SM_CTX_LD_3, 0x8}, ++ {OP_ZR, CCM_REG_N_SM_CTX_LD_4, 0x4}, ++ {OP_WR, CCM_REG_CCM_REG0_SZ, 0x4}, ++ {OP_WR, CCM_REG_CCM_STORM0_IFEN, 0x1}, ++ {OP_WR, CCM_REG_CCM_STORM1_IFEN, 0x1}, ++ {OP_WR, CCM_REG_CCM_CQM_IFEN, 0x1}, ++ {OP_WR, CCM_REG_STORM_CCM_IFEN, 0x1}, ++ {OP_WR, CCM_REG_CQM_CCM_IFEN, 0x1}, ++ {OP_WR, CCM_REG_CSDM_IFEN, 0x1}, ++ {OP_WR, CCM_REG_TSEM_IFEN, 0x1}, ++ {OP_WR, CCM_REG_XSEM_IFEN, 0x1}, ++ {OP_WR, CCM_REG_USEM_IFEN, 0x1}, ++ {OP_WR, CCM_REG_PBF_IFEN, 0x1}, ++ {OP_WR, CCM_REG_CDU_AG_WR_IFEN, 0x1}, ++ {OP_WR, CCM_REG_CDU_AG_RD_IFEN, 0x1}, ++ {OP_WR, CCM_REG_CDU_SM_WR_IFEN, 0x1}, ++ {OP_WR, CCM_REG_CDU_SM_RD_IFEN, 0x1}, ++ {OP_WR, CCM_REG_CCM_CFC_IFEN, 0x1}, ++/* #define CCM_COMMON_END 375 */ ++/* #define CCM_FUNC0_START 380 */ ++ {OP_WR, CCM_REG_QOS_PHYS_QNUM0_0, 0x9}, ++ {OP_WR, CCM_REG_QOS_PHYS_QNUM1_0, 0xa}, ++ {OP_WR, CCM_REG_QOS_PHYS_QNUM2_0, 0x7}, ++ {OP_WR, CCM_REG_QOS_PHYS_QNUM3_0, 0x7}, ++ {OP_WR, CCM_REG_PHYS_QNUM1_0, 0xc}, ++ {OP_WR, CCM_REG_PHYS_QNUM2_0, 0xb}, ++ {OP_WR, CCM_REG_PHYS_QNUM3_0, 0x7}, ++/* #define CCM_FUNC0_END 381 */ ++/* #define CCM_FUNC1_START 382 */ ++ {OP_WR, CCM_REG_QOS_PHYS_QNUM0_1, 0x29}, ++ {OP_WR, CCM_REG_QOS_PHYS_QNUM1_1, 0x2a}, ++ {OP_WR, CCM_REG_QOS_PHYS_QNUM2_1, 0x27}, ++ {OP_WR, CCM_REG_QOS_PHYS_QNUM3_1, 0x27}, ++ {OP_WR, CCM_REG_PHYS_QNUM1_1, 0x2c}, ++ {OP_WR, CCM_REG_PHYS_QNUM2_1, 0x2b}, ++ {OP_WR, CCM_REG_PHYS_QNUM3_1, 0x27}, ++/* #define CCM_FUNC1_END 383 */ ++/* #define CCM_FUNC2_START 384 */ ++ {OP_WR, CCM_REG_QOS_PHYS_QNUM0_0, 0x19}, ++ {OP_WR, CCM_REG_QOS_PHYS_QNUM1_0, 0x1a}, ++ {OP_WR, CCM_REG_QOS_PHYS_QNUM2_0, 0x17}, ++ {OP_WR, CCM_REG_QOS_PHYS_QNUM3_0, 0x17}, ++ {OP_WR, CCM_REG_PHYS_QNUM1_0, 0x1c}, ++ {OP_WR, CCM_REG_PHYS_QNUM2_0, 0x1b}, ++ {OP_WR, CCM_REG_PHYS_QNUM3_0, 0x17}, ++/* #define CCM_FUNC2_END 385 */ ++/* #define CCM_FUNC3_START 386 */ ++ {OP_WR, CCM_REG_QOS_PHYS_QNUM0_1, 0x39}, ++ {OP_WR, CCM_REG_QOS_PHYS_QNUM1_1, 0x3a}, ++ {OP_WR, CCM_REG_QOS_PHYS_QNUM2_1, 0x37}, ++ {OP_WR, CCM_REG_QOS_PHYS_QNUM3_1, 0x37}, ++ {OP_WR, CCM_REG_PHYS_QNUM1_1, 0x3c}, ++ {OP_WR, CCM_REG_PHYS_QNUM2_1, 0x3b}, ++ {OP_WR, CCM_REG_PHYS_QNUM3_1, 0x37}, ++/* #define CCM_FUNC3_END 387 */ ++/* #define CCM_FUNC4_START 388 */ ++ {OP_WR, CCM_REG_QOS_PHYS_QNUM0_0, 0x49}, ++ {OP_WR, CCM_REG_QOS_PHYS_QNUM1_0, 0x4a}, ++ {OP_WR, CCM_REG_QOS_PHYS_QNUM2_0, 0x47}, ++ {OP_WR, CCM_REG_QOS_PHYS_QNUM3_0, 0x47}, ++ {OP_WR, CCM_REG_PHYS_QNUM1_0, 0x4c}, ++ {OP_WR, CCM_REG_PHYS_QNUM2_0, 0x4b}, ++ {OP_WR, CCM_REG_PHYS_QNUM3_0, 0x47}, ++/* #define CCM_FUNC4_END 389 */ ++/* #define CCM_FUNC5_START 390 */ ++ {OP_WR, CCM_REG_QOS_PHYS_QNUM0_1, 0x69}, ++ {OP_WR, CCM_REG_QOS_PHYS_QNUM1_1, 0x6a}, ++ {OP_WR, CCM_REG_QOS_PHYS_QNUM2_1, 0x67}, ++ {OP_WR, CCM_REG_QOS_PHYS_QNUM3_1, 0x67}, ++ {OP_WR, CCM_REG_PHYS_QNUM1_1, 0x6c}, ++ {OP_WR, CCM_REG_PHYS_QNUM2_1, 0x6b}, ++ {OP_WR, CCM_REG_PHYS_QNUM3_1, 0x67}, ++/* #define CCM_FUNC5_END 391 */ ++/* #define CCM_FUNC6_START 392 */ ++ {OP_WR, CCM_REG_QOS_PHYS_QNUM0_0, 0x59}, ++ {OP_WR, CCM_REG_QOS_PHYS_QNUM1_0, 0x5a}, ++ {OP_WR, CCM_REG_QOS_PHYS_QNUM2_0, 0x57}, ++ {OP_WR, CCM_REG_QOS_PHYS_QNUM3_0, 0x57}, ++ {OP_WR, CCM_REG_PHYS_QNUM1_0, 0x5c}, ++ {OP_WR, CCM_REG_PHYS_QNUM2_0, 0x5b}, ++ {OP_WR, CCM_REG_PHYS_QNUM3_0, 0x57}, ++/* #define CCM_FUNC6_END 393 */ ++/* #define CCM_FUNC7_START 394 */ ++ {OP_WR, CCM_REG_QOS_PHYS_QNUM0_1, 0x79}, ++ {OP_WR, CCM_REG_QOS_PHYS_QNUM1_1, 0x7a}, ++ {OP_WR, CCM_REG_QOS_PHYS_QNUM2_1, 0x77}, ++ {OP_WR, CCM_REG_QOS_PHYS_QNUM3_1, 0x77}, ++ {OP_WR, CCM_REG_PHYS_QNUM1_1, 0x7c}, ++ {OP_WR, CCM_REG_PHYS_QNUM2_1, 0x7b}, ++ {OP_WR, CCM_REG_PHYS_QNUM3_1, 0x77}, ++/* #define CCM_FUNC7_END 395 */ ++/* #define UCM_COMMON_START 396 */ ++ {OP_WR, UCM_REG_XX_OVFL_EVNT_ID, 0x32}, ++ {OP_WR, UCM_REG_UQM_UCM_HDR_P, 0x2150020}, ++ {OP_WR, UCM_REG_UQM_UCM_HDR_S, 0x2150020}, ++ {OP_WR, UCM_REG_TM_UCM_HDR, 0x30}, ++ {OP_WR, UCM_REG_ERR_UCM_HDR, 0x8100000}, ++ {OP_WR, UCM_REG_ERR_EVNT_ID, 0x33}, ++ {OP_WR, UCM_REG_EXPR_EVNT_ID, 0x30}, ++ {OP_WR, UCM_REG_STOP_EVNT_ID, 0x31}, ++ {OP_WR, UCM_REG_STORM_WEIGHT, 0x2}, ++ {OP_WR, UCM_REG_TSEM_WEIGHT, 0x4}, ++ {OP_WR, UCM_REG_CSEM_WEIGHT, 0x0}, ++ {OP_WR, UCM_REG_XSEM_WEIGHT, 0x2}, ++ {OP_WR, UCM_REG_DORQ_WEIGHT, 0x2}, ++ {OP_WR, UCM_REG_CP_WEIGHT, 0x0}, ++ {OP_WR, UCM_REG_USDM_WEIGHT, 0x2}, ++ {OP_WR, UCM_REG_UQM_P_WEIGHT, 0x7}, ++ {OP_WR, UCM_REG_UQM_S_WEIGHT, 0x2}, ++ {OP_WR, UCM_REG_TM_WEIGHT, 0x2}, ++ {OP_WR, UCM_REG_UCM_UQM_USE_Q, 0x1}, ++ {OP_WR, UCM_REG_INV_CFLG_Q, 0x1}, ++ {OP_WR, UCM_REG_GR_ARB_TYPE, 0x1}, ++ {OP_WR, UCM_REG_GR_LD0_PR, 0x1}, ++ {OP_WR, UCM_REG_GR_LD1_PR, 0x2}, ++ {OP_WR, UCM_REG_CFC_INIT_CRD, 0x1}, ++ {OP_WR, UCM_REG_FIC0_INIT_CRD, 0x40}, ++ {OP_WR, UCM_REG_FIC1_INIT_CRD, 0x40}, ++ {OP_WR, UCM_REG_TM_INIT_CRD, 0x4}, ++ {OP_WR, UCM_REG_UQM_INIT_CRD, 0x20}, ++ {OP_WR, UCM_REG_XX_INIT_CRD, 0xe}, ++ {OP_WR, UCM_REG_XX_MSG_NUM, 0x1b}, ++ {OP_ZR, UCM_REG_XX_TABLE, 0x12}, ++ {OP_SW, UCM_REG_XX_DESCR_TABLE, 0x1b02a2}, ++ {OP_WR, UCM_REG_N_SM_CTX_LD_0, 0xc}, ++ {OP_WR, UCM_REG_N_SM_CTX_LD_1, 0x7}, ++ {OP_WR, UCM_REG_N_SM_CTX_LD_2, 0xf}, ++ {OP_WR, UCM_REG_N_SM_CTX_LD_3, 0x10}, ++ {OP_WR, UCM_REG_N_SM_CTX_LD_4, 0xb}, ++ {OP_ZR, UCM_REG_N_SM_CTX_LD_5, 0x3}, ++ {OP_WR, UCM_REG_UCM_REG0_SZ, 0x3}, ++ {OP_WR, UCM_REG_UCM_STORM0_IFEN, 0x1}, ++ {OP_WR, UCM_REG_UCM_STORM1_IFEN, 0x1}, ++ {OP_WR, UCM_REG_UCM_UQM_IFEN, 0x1}, ++ {OP_WR, UCM_REG_STORM_UCM_IFEN, 0x1}, ++ {OP_WR, UCM_REG_UQM_UCM_IFEN, 0x1}, ++ {OP_WR, UCM_REG_USDM_IFEN, 0x1}, ++ {OP_WR, UCM_REG_TM_UCM_IFEN, 0x1}, ++ {OP_WR, UCM_REG_UCM_TM_IFEN, 0x1}, ++ {OP_WR, UCM_REG_TSEM_IFEN, 0x1}, ++ {OP_WR, UCM_REG_CSEM_IFEN, 0x1}, ++ {OP_WR, UCM_REG_XSEM_IFEN, 0x1}, ++ {OP_WR, UCM_REG_DORQ_IFEN, 0x1}, ++ {OP_WR, UCM_REG_CDU_AG_WR_IFEN, 0x1}, ++ {OP_WR, UCM_REG_CDU_AG_RD_IFEN, 0x1}, ++ {OP_WR, UCM_REG_CDU_SM_WR_IFEN, 0x1}, ++ {OP_WR, UCM_REG_CDU_SM_RD_IFEN, 0x1}, ++ {OP_WR, UCM_REG_UCM_CFC_IFEN, 0x1}, ++/* #define UCM_COMMON_END 397 */ ++/* #define UCM_FUNC0_START 402 */ ++ {OP_WR, UCM_REG_PHYS_QNUM0_0, 0xf}, ++ {OP_WR, UCM_REG_PHYS_QNUM1_0, 0xe}, ++ {OP_WR, UCM_REG_PHYS_QNUM2_0, 0x0}, ++ {OP_WR, UCM_REG_PHYS_QNUM3_0, 0x0}, ++/* #define UCM_FUNC0_END 403 */ ++/* #define UCM_FUNC1_START 404 */ ++ {OP_WR, UCM_REG_PHYS_QNUM0_1, 0x2f}, ++ {OP_WR, UCM_REG_PHYS_QNUM1_1, 0x2e}, ++ {OP_WR, UCM_REG_PHYS_QNUM2_1, 0x0}, ++ {OP_WR, UCM_REG_PHYS_QNUM3_1, 0x0}, ++/* #define UCM_FUNC1_END 405 */ ++/* #define UCM_FUNC2_START 406 */ ++ {OP_WR, UCM_REG_PHYS_QNUM0_0, 0x1f}, ++ {OP_WR, UCM_REG_PHYS_QNUM1_0, 0x1e}, ++ {OP_WR, UCM_REG_PHYS_QNUM2_0, 0x0}, ++ {OP_WR, UCM_REG_PHYS_QNUM3_0, 0x0}, ++/* #define UCM_FUNC2_END 407 */ ++/* #define UCM_FUNC3_START 408 */ ++ {OP_WR, UCM_REG_PHYS_QNUM0_1, 0x3f}, ++ {OP_WR, UCM_REG_PHYS_QNUM1_1, 0x3e}, ++ {OP_WR, UCM_REG_PHYS_QNUM2_1, 0x0}, ++ {OP_WR, UCM_REG_PHYS_QNUM3_1, 0x0}, ++/* #define UCM_FUNC3_END 409 */ ++/* #define UCM_FUNC4_START 410 */ ++ {OP_WR, UCM_REG_PHYS_QNUM0_0, 0x4f}, ++ {OP_WR, UCM_REG_PHYS_QNUM1_0, 0x4e}, ++ {OP_WR, UCM_REG_PHYS_QNUM2_0, 0x0}, ++ {OP_WR, UCM_REG_PHYS_QNUM3_0, 0x0}, ++/* #define UCM_FUNC4_END 411 */ ++/* #define UCM_FUNC5_START 412 */ ++ {OP_WR, UCM_REG_PHYS_QNUM0_1, 0x6f}, ++ {OP_WR, UCM_REG_PHYS_QNUM1_1, 0x6e}, ++ {OP_WR, UCM_REG_PHYS_QNUM2_1, 0x0}, ++ {OP_WR, UCM_REG_PHYS_QNUM3_1, 0x0}, ++/* #define UCM_FUNC5_END 413 */ ++/* #define UCM_FUNC6_START 414 */ ++ {OP_WR, UCM_REG_PHYS_QNUM0_0, 0x5f}, ++ {OP_WR, UCM_REG_PHYS_QNUM1_0, 0x5e}, ++ {OP_WR, UCM_REG_PHYS_QNUM2_0, 0x0}, ++ {OP_WR, UCM_REG_PHYS_QNUM3_0, 0x0}, ++/* #define UCM_FUNC6_END 415 */ ++/* #define UCM_FUNC7_START 416 */ ++ {OP_WR, UCM_REG_PHYS_QNUM0_1, 0x7f}, ++ {OP_WR, UCM_REG_PHYS_QNUM1_1, 0x7e}, ++ {OP_WR, UCM_REG_PHYS_QNUM2_1, 0x0}, ++ {OP_WR, UCM_REG_PHYS_QNUM3_1, 0x0}, ++/* #define UCM_FUNC7_END 417 */ ++/* #define USEM_COMMON_START 418 */ ++ {OP_ZP, USEM_REG_INT_TABLE, 0xe10000}, ++ {OP_WR_64, USEM_REG_INT_TABLE + 0x3d8, 0x502bd}, ++ {OP_ZP, USEM_REG_PRAM, 0x2ecb0000}, ++ {OP_ZP, USEM_REG_PRAM + 0x8000, 0x311a0bb3}, ++ {OP_ZP, USEM_REG_PRAM + 0x10000, 0x368b17fa}, ++ {OP_ZP, USEM_REG_PRAM + 0x18000, 0x39c6259d}, ++ {OP_ZP, USEM_REG_PRAM + 0x20000, 0x13d5340f}, ++ {OP_WR_64, USEM_REG_PRAM + 0x23070, 0x39f202bf}, ++ {OP_RD, USEM_REG_MSG_NUM_FIC0, 0x0}, ++ {OP_RD, USEM_REG_MSG_NUM_FIC1, 0x0}, ++ {OP_RD, USEM_REG_MSG_NUM_FOC0, 0x0}, ++ {OP_RD, USEM_REG_MSG_NUM_FOC1, 0x0}, ++ {OP_RD, USEM_REG_MSG_NUM_FOC2, 0x0}, ++ {OP_RD, USEM_REG_MSG_NUM_FOC3, 0x0}, ++ {OP_WR, USEM_REG_ARB_ELEMENT0, 0x1}, ++ {OP_WR, USEM_REG_ARB_ELEMENT1, 0x2}, ++ {OP_WR, USEM_REG_ARB_ELEMENT2, 0x3}, ++ {OP_WR, USEM_REG_ARB_ELEMENT3, 0x0}, ++ {OP_WR, USEM_REG_ARB_ELEMENT4, 0x4}, ++ {OP_WR, USEM_REG_ARB_CYCLE_SIZE, 0x1}, ++ {OP_WR, USEM_REG_TS_0_AS, 0x0}, ++ {OP_WR, USEM_REG_TS_1_AS, 0x1}, ++ {OP_WR, USEM_REG_TS_2_AS, 0x4}, ++ {OP_WR, USEM_REG_TS_3_AS, 0x0}, ++ {OP_WR, USEM_REG_TS_4_AS, 0x1}, ++ {OP_WR, USEM_REG_TS_5_AS, 0x3}, ++ {OP_WR, USEM_REG_TS_6_AS, 0x0}, ++ {OP_WR, USEM_REG_TS_7_AS, 0x1}, ++ {OP_WR, USEM_REG_TS_8_AS, 0x4}, ++ {OP_WR, USEM_REG_TS_9_AS, 0x0}, ++ {OP_WR, USEM_REG_TS_10_AS, 0x1}, ++ {OP_WR, USEM_REG_TS_11_AS, 0x3}, ++ {OP_WR, USEM_REG_TS_12_AS, 0x0}, ++ {OP_WR, USEM_REG_TS_13_AS, 0x1}, ++ {OP_WR, USEM_REG_TS_14_AS, 0x4}, ++ {OP_WR, USEM_REG_TS_15_AS, 0x0}, ++ {OP_WR, USEM_REG_TS_16_AS, 0x4}, ++ {OP_WR, USEM_REG_TS_17_AS, 0x3}, ++ {OP_ZR, USEM_REG_TS_18_AS, 0x2}, ++ {OP_WR, USEM_REG_ENABLE_IN, 0x3fff}, ++ {OP_WR, USEM_REG_ENABLE_OUT, 0x3ff}, ++ {OP_WR, USEM_REG_FIC0_DISABLE, 0x0}, ++ {OP_WR, USEM_REG_FIC1_DISABLE, 0x0}, ++ {OP_WR, USEM_REG_PAS_DISABLE, 0x0}, ++ {OP_WR, USEM_REG_THREADS_LIST, 0xffff}, ++ {OP_ZR, USEM_REG_PASSIVE_BUFFER, 0x800}, ++ {OP_WR, USEM_REG_FAST_MEMORY + 0x18bc0, 0x1}, ++ {OP_WR, USEM_REG_FAST_MEMORY + 0x18000, 0x1a}, ++ {OP_WR, USEM_REG_FAST_MEMORY + 0x18040, 0x4e}, ++ {OP_WR, USEM_REG_FAST_MEMORY + 0x18080, 0x10}, ++ {OP_WR, USEM_REG_FAST_MEMORY + 0x180c0, 0x20}, ++ {OP_WR_ASIC, USEM_REG_FAST_MEMORY + 0x18300, 0x7a120}, ++ {OP_WR_EMUL, USEM_REG_FAST_MEMORY + 0x18300, 0x138}, ++ {OP_WR_FPGA, USEM_REG_FAST_MEMORY + 0x18300, 0x1388}, ++ {OP_WR, USEM_REG_FAST_MEMORY + 0x183c0, 0x1f4}, ++ {OP_WR_ASIC, USEM_REG_FAST_MEMORY + 0x18380, 0x1dcd6500}, ++ {OP_WR_EMUL, USEM_REG_FAST_MEMORY + 0x18380, 0x4c4b4}, ++ {OP_WR_FPGA, USEM_REG_FAST_MEMORY + 0x18380, 0x4c4b40}, ++ {OP_WR_EMUL, USEM_REG_FAST_MEMORY + 0x11480, 0x0}, ++ {OP_WR, USEM_REG_FAST_MEMORY + 0x11480, 0x1}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x2000, 0x102}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x8020, 0xc8}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x8000, 0x2}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x3da8, 0x4}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x3d80, 0x9}, ++ {OP_SW, USEM_REG_FAST_MEMORY + 0x3d80 + 0x24, 0x102c1}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x3d00, 0x20}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x5000, 0x400}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x4000, 0x2}, ++ {OP_SW, USEM_REG_FAST_MEMORY + 0x4000 + 0x8, 0x102c2}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x4000 + 0xc, 0x3}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x40d8, 0x2}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x6b68, 0x2}, ++ {OP_SW, USEM_REG_FAST_MEMORY + 0x6b68 + 0x8, 0x202c3}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x6b10, 0x2}, ++ {OP_SW, USEM_REG_FAST_MEMORY + 0x74c0, 0x202c5}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0xda40, 0x2}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0xe000, 0x800}, ++ {OP_WR, USEM_REG_FAST_MEMORY + 0x10800, 0x1000000}, ++ {OP_SW, USEM_REG_FAST_MEMORY + 0x10c00, 0x1002c7}, ++ {OP_WR, USEM_REG_FAST_MEMORY + 0x10800, 0x0}, ++ {OP_SW, USEM_REG_FAST_MEMORY + 0x10c40, 0x1002d7}, ++/* #define USEM_COMMON_END 419 */ ++/* #define USEM_PORT0_START 420 */ ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x2450, 0xb4}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x2ad0, 0x2}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x1000, 0x1a0}, ++ {OP_WR, USEM_REG_FAST_MEMORY + 0x3db8, 0x0}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x5000, 0x20}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x5100, 0x20}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x5200, 0x20}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x5300, 0x20}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x5400, 0x20}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x5500, 0x20}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x5600, 0x20}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x5700, 0x20}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x5800, 0x20}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x5900, 0x20}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x5a00, 0x20}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x5b00, 0x20}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x5c00, 0x20}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x5d00, 0x20}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x5e00, 0x20}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x5f00, 0x20}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x6b78, 0x52}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x6e08, 0xc}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0xda88, 0x2}, ++/* #define USEM_PORT0_END 421 */ ++/* #define USEM_PORT1_START 422 */ ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x2720, 0xb4}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x2ad8, 0x2}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x1680, 0x1a0}, ++ {OP_WR, USEM_REG_FAST_MEMORY + 0x3dbc, 0x0}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x5080, 0x20}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x5180, 0x20}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x5280, 0x20}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x5380, 0x20}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x5480, 0x20}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x5580, 0x20}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x5680, 0x20}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x5780, 0x20}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x5880, 0x20}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x5980, 0x20}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x5a80, 0x20}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x5b80, 0x20}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x5c80, 0x20}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x5d80, 0x20}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x5e80, 0x20}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x5f80, 0x20}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x6cc0, 0x52}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x6e38, 0xc}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0xda90, 0x2}, ++/* #define USEM_PORT1_END 423 */ ++/* #define USEM_FUNC0_START 424 */ ++ {OP_WR, USEM_REG_FAST_MEMORY + 0x2a30, 0x0}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x4018, 0x2}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0xd000, 0x6}, ++/* #define USEM_FUNC0_END 425 */ ++/* #define USEM_FUNC1_START 426 */ ++ {OP_WR, USEM_REG_FAST_MEMORY + 0x2a34, 0x0}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x4028, 0x2}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0xd018, 0x6}, ++/* #define USEM_FUNC1_END 427 */ ++/* #define USEM_FUNC2_START 428 */ ++ {OP_WR, USEM_REG_FAST_MEMORY + 0x2a38, 0x0}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x4038, 0x2}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0xd030, 0x6}, ++/* #define USEM_FUNC2_END 429 */ ++/* #define USEM_FUNC3_START 430 */ ++ {OP_WR, USEM_REG_FAST_MEMORY + 0x2a3c, 0x0}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x4048, 0x2}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0xd048, 0x6}, ++/* #define USEM_FUNC3_END 431 */ ++/* #define USEM_FUNC4_START 432 */ ++ {OP_WR, USEM_REG_FAST_MEMORY + 0x2a40, 0x0}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x4058, 0x2}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0xd060, 0x6}, ++/* #define USEM_FUNC4_END 433 */ ++/* #define USEM_FUNC5_START 434 */ ++ {OP_WR, USEM_REG_FAST_MEMORY + 0x2a44, 0x0}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x4068, 0x2}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0xd078, 0x6}, ++/* #define USEM_FUNC5_END 435 */ ++/* #define USEM_FUNC6_START 436 */ ++ {OP_WR, USEM_REG_FAST_MEMORY + 0x2a48, 0x0}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x4078, 0x2}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0xd090, 0x6}, ++/* #define USEM_FUNC6_END 437 */ ++/* #define USEM_FUNC7_START 438 */ ++ {OP_WR, USEM_REG_FAST_MEMORY + 0x2a4c, 0x0}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0x4088, 0x2}, ++ {OP_ZR, USEM_REG_FAST_MEMORY + 0xd0a8, 0x6}, ++/* #define USEM_FUNC7_END 439 */ ++/* #define CSEM_COMMON_START 440 */ ++ {OP_ZP, CSEM_REG_INT_TABLE, 0x930000}, ++ {OP_WR_64, CSEM_REG_INT_TABLE + 0x380, 0x1002e7}, ++ {OP_ZP, CSEM_REG_PRAM, 0x2add0000}, ++ {OP_ZP, CSEM_REG_PRAM + 0x8000, 0x2e040ab8}, ++ {OP_WR_64, CSEM_REG_PRAM + 0xe4a0, 0x61d202e9}, ++ {OP_RD, CSEM_REG_MSG_NUM_FIC0, 0x0}, ++ {OP_RD, CSEM_REG_MSG_NUM_FIC1, 0x0}, ++ {OP_RD, CSEM_REG_MSG_NUM_FOC0, 0x0}, ++ {OP_RD, CSEM_REG_MSG_NUM_FOC1, 0x0}, ++ {OP_RD, CSEM_REG_MSG_NUM_FOC2, 0x0}, ++ {OP_RD, CSEM_REG_MSG_NUM_FOC3, 0x0}, ++ {OP_WR, CSEM_REG_ARB_ELEMENT0, 0x1}, ++ {OP_WR, CSEM_REG_ARB_ELEMENT1, 0x2}, ++ {OP_WR, CSEM_REG_ARB_ELEMENT2, 0x3}, ++ {OP_WR, CSEM_REG_ARB_ELEMENT3, 0x0}, ++ {OP_WR, CSEM_REG_ARB_ELEMENT4, 0x4}, ++ {OP_WR, CSEM_REG_ARB_CYCLE_SIZE, 0x1}, ++ {OP_WR, CSEM_REG_TS_0_AS, 0x0}, ++ {OP_WR, CSEM_REG_TS_1_AS, 0x1}, ++ {OP_WR, CSEM_REG_TS_2_AS, 0x4}, ++ {OP_WR, CSEM_REG_TS_3_AS, 0x0}, ++ {OP_WR, CSEM_REG_TS_4_AS, 0x1}, ++ {OP_WR, CSEM_REG_TS_5_AS, 0x3}, ++ {OP_WR, CSEM_REG_TS_6_AS, 0x0}, ++ {OP_WR, CSEM_REG_TS_7_AS, 0x1}, ++ {OP_WR, CSEM_REG_TS_8_AS, 0x4}, ++ {OP_WR, CSEM_REG_TS_9_AS, 0x0}, ++ {OP_WR, CSEM_REG_TS_10_AS, 0x1}, ++ {OP_WR, CSEM_REG_TS_11_AS, 0x3}, ++ {OP_WR, CSEM_REG_TS_12_AS, 0x0}, ++ {OP_WR, CSEM_REG_TS_13_AS, 0x1}, ++ {OP_WR, CSEM_REG_TS_14_AS, 0x4}, ++ {OP_WR, CSEM_REG_TS_15_AS, 0x0}, ++ {OP_WR, CSEM_REG_TS_16_AS, 0x4}, ++ {OP_WR, CSEM_REG_TS_17_AS, 0x3}, ++ {OP_ZR, CSEM_REG_TS_18_AS, 0x2}, ++ {OP_WR, CSEM_REG_ENABLE_IN, 0x3fff}, ++ {OP_WR, CSEM_REG_ENABLE_OUT, 0x3ff}, ++ {OP_WR, CSEM_REG_FIC0_DISABLE, 0x0}, ++ {OP_WR, CSEM_REG_FIC1_DISABLE, 0x0}, ++ {OP_WR, CSEM_REG_PAS_DISABLE, 0x0}, ++ {OP_WR, CSEM_REG_THREADS_LIST, 0xffff}, ++ {OP_ZR, CSEM_REG_PASSIVE_BUFFER, 0x800}, ++ {OP_WR, CSEM_REG_FAST_MEMORY + 0x18bc0, 0x1}, ++ {OP_WR, CSEM_REG_FAST_MEMORY + 0x18000, 0x10}, ++ {OP_WR, CSEM_REG_FAST_MEMORY + 0x18040, 0x12}, ++ {OP_WR, CSEM_REG_FAST_MEMORY + 0x18080, 0x30}, ++ {OP_WR, CSEM_REG_FAST_MEMORY + 0x180c0, 0xe}, ++ {OP_WR, CSEM_REG_FAST_MEMORY + 0x183c0, 0x1f4}, ++ {OP_WR, CSEM_REG_FAST_MEMORY + 0x11480, 0x1}, ++ {OP_WR_EMUL, CSEM_REG_FAST_MEMORY + 0x11480, 0x0}, ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x1000, 0x42}, ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x7020, 0xc8}, ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x7000, 0x2}, ++ {OP_WR, CSEM_REG_FAST_MEMORY + 0x11e8, 0x0}, ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x3000, 0xc0}, ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x4070, 0x80}, ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x5280, 0x4}, ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x6700, 0x100}, ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x9000, 0x400}, ++ {OP_SW, CSEM_REG_FAST_MEMORY + 0x6b08, 0x2002eb}, ++ {OP_WR, CSEM_REG_FAST_MEMORY + 0x10800, 0x13fffff}, ++ {OP_SW, CSEM_REG_FAST_MEMORY + 0x10c00, 0x10030b}, ++ {OP_WR, CSEM_REG_FAST_MEMORY + 0x10800, 0x0}, ++ {OP_SW, CSEM_REG_FAST_MEMORY + 0x10c40, 0x10031b}, ++/* #define CSEM_COMMON_END 441 */ ++/* #define CSEM_PORT0_START 442 */ ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x8100, 0xa0}, ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x8600, 0x40}, ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x8c00, 0x3c}, ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0xb000, 0x200}, ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x8800, 0x80}, ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x8de0, 0x3c}, ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x4040, 0x6}, ++/* #define CSEM_PORT0_END 443 */ ++/* #define CSEM_PORT1_START 444 */ ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x8380, 0xa0}, ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x8700, 0x40}, ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x8cf0, 0x3c}, ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0xb800, 0x200}, ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x8a00, 0x80}, ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x8ed0, 0x3c}, ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x4058, 0x6}, ++/* #define CSEM_PORT1_END 445 */ ++/* #define CSEM_FUNC0_START 446 */ ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x8000, 0x8}, ++ {OP_WR, CSEM_REG_FAST_MEMORY + 0x1148, 0x0}, ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x3300, 0x2}, ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x6040, 0x30}, ++/* #define CSEM_FUNC0_END 447 */ ++/* #define CSEM_FUNC1_START 448 */ ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x8020, 0x8}, ++ {OP_WR, CSEM_REG_FAST_MEMORY + 0x114c, 0x0}, ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x3308, 0x2}, ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x6100, 0x30}, ++/* #define CSEM_FUNC1_END 449 */ ++/* #define CSEM_FUNC2_START 450 */ ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x8040, 0x8}, ++ {OP_WR, CSEM_REG_FAST_MEMORY + 0x1150, 0x0}, ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x3310, 0x2}, ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x61c0, 0x30}, ++/* #define CSEM_FUNC2_END 451 */ ++/* #define CSEM_FUNC3_START 452 */ ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x8060, 0x8}, ++ {OP_WR, CSEM_REG_FAST_MEMORY + 0x1154, 0x0}, ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x3318, 0x2}, ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x6280, 0x30}, ++/* #define CSEM_FUNC3_END 453 */ ++/* #define CSEM_FUNC4_START 454 */ ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x8080, 0x8}, ++ {OP_WR, CSEM_REG_FAST_MEMORY + 0x1158, 0x0}, ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x3320, 0x2}, ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x6340, 0x30}, ++/* #define CSEM_FUNC4_END 455 */ ++/* #define CSEM_FUNC5_START 456 */ ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x80a0, 0x8}, ++ {OP_WR, CSEM_REG_FAST_MEMORY + 0x115c, 0x0}, ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x3328, 0x2}, ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x6400, 0x30}, ++/* #define CSEM_FUNC5_END 457 */ ++/* #define CSEM_FUNC6_START 458 */ ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x80c0, 0x8}, ++ {OP_WR, CSEM_REG_FAST_MEMORY + 0x1160, 0x0}, ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x3330, 0x2}, ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x64c0, 0x30}, ++/* #define CSEM_FUNC6_END 459 */ ++/* #define CSEM_FUNC7_START 460 */ ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x80e0, 0x8}, ++ {OP_WR, CSEM_REG_FAST_MEMORY + 0x1164, 0x0}, ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x3338, 0x2}, ++ {OP_ZR, CSEM_REG_FAST_MEMORY + 0x6580, 0x30}, ++/* #define CSEM_FUNC7_END 461 */ ++/* #define XPB_COMMON_START 462 */ ++ {OP_WR, GRCBASE_XPB + PB_REG_CONTROL, 0x28}, ++/* #define XPB_COMMON_END 463 */ ++/* #define DQ_COMMON_START 484 */ ++ {OP_WR, DORQ_REG_MODE_ACT, 0x2}, ++ {OP_WR, DORQ_REG_NORM_CID_OFST, 0x3}, ++ {OP_WR, DORQ_REG_OUTST_REQ, 0x4}, ++ {OP_WR, DORQ_REG_DPM_CID_ADDR, 0x8}, ++ {OP_WR, DORQ_REG_RSP_INIT_CRD, 0x2}, ++ {OP_WR, DORQ_REG_NORM_CMHEAD_TX, 0x90}, ++ {OP_WR, DORQ_REG_CMHEAD_RX, 0x90}, ++ {OP_WR, DORQ_REG_SHRT_CMHEAD, 0x800090}, ++ {OP_WR, DORQ_REG_ERR_CMHEAD, 0x8140000}, ++ {OP_WR, DORQ_REG_AGG_CMD0, 0x8a}, ++ {OP_WR, DORQ_REG_AGG_CMD1, 0x80}, ++ {OP_WR, DORQ_REG_AGG_CMD2, 0x81}, ++ {OP_WR, DORQ_REG_AGG_CMD3, 0x80}, ++ {OP_WR, DORQ_REG_SHRT_ACT_CNT, 0x6}, ++ {OP_WR, DORQ_REG_DQ_FIFO_FULL_TH, 0x7d0}, ++ {OP_WR, DORQ_REG_DQ_FIFO_AFULL_TH, 0x76c}, ++ {OP_WR, DORQ_REG_REGN, 0x7c1004}, ++ {OP_WR, DORQ_REG_IF_EN, 0xf}, ++/* #define DQ_COMMON_END 485 */ ++/* #define TIMERS_COMMON_START 506 */ ++ {OP_ZR, TM_REG_CLIN_PRIOR0_CLIENT, 0x2}, ++ {OP_WR, TM_REG_LIN_SETCLR_FIFO_ALFULL_THR, 0x1c}, ++ {OP_WR, TM_REG_CFC_AC_CRDCNT_VAL, 0x1}, ++ {OP_WR, TM_REG_CFC_CLD_CRDCNT_VAL, 0x1}, ++ {OP_WR, TM_REG_CLOUT_CRDCNT0_VAL, 0x1}, ++ {OP_WR, TM_REG_CLOUT_CRDCNT1_VAL, 0x1}, ++ {OP_WR, TM_REG_CLOUT_CRDCNT2_VAL, 0x1}, ++ {OP_WR, TM_REG_EXP_CRDCNT_VAL, 0x1}, ++ {OP_WR, TM_REG_PCIARB_CRDCNT_VAL, 0x2}, ++ {OP_WR_ASIC, TM_REG_TIMER_TICK_SIZE, 0x3d090}, ++ {OP_WR_EMUL, TM_REG_TIMER_TICK_SIZE, 0x9c}, ++ {OP_WR_FPGA, TM_REG_TIMER_TICK_SIZE, 0x9c4}, ++ {OP_WR, TM_REG_CL0_CONT_REGION, 0x8}, ++ {OP_WR, TM_REG_CL1_CONT_REGION, 0xc}, ++ {OP_WR, TM_REG_CL2_CONT_REGION, 0x10}, ++ {OP_WR, TM_REG_TM_CONTEXT_REGION, 0x20}, ++ {OP_WR, TM_REG_EN_TIMERS, 0x1}, ++ {OP_WR, TM_REG_EN_REAL_TIME_CNT, 0x1}, ++ {OP_WR, TM_REG_EN_CL0_INPUT, 0x1}, ++ {OP_WR, TM_REG_EN_CL1_INPUT, 0x1}, ++ {OP_WR, TM_REG_EN_CL2_INPUT, 0x1}, ++/* #define TIMERS_COMMON_END 507 */ ++/* #define TIMERS_PORT0_START 508 */ ++ {OP_WR, TM_REG_LIN0_LOGIC_ADDR, 0x0}, ++ {OP_WR, TM_REG_LIN0_PHY_ADDR_VALID, 0x0}, ++ {OP_ZR, TM_REG_LIN0_PHY_ADDR, 0x2}, ++/* #define TIMERS_PORT0_END 509 */ ++/* #define TIMERS_PORT1_START 510 */ ++ {OP_WR, TM_REG_LIN1_LOGIC_ADDR, 0x0}, ++ {OP_WR, TM_REG_LIN1_PHY_ADDR_VALID, 0x0}, ++ {OP_ZR, TM_REG_LIN1_PHY_ADDR, 0x2}, ++/* #define TIMERS_PORT1_END 511 */ ++/* #define XSDM_COMMON_START 528 */ ++ {OP_WR, XSDM_REG_CFC_RSP_START_ADDR, 0x424}, ++ {OP_WR, XSDM_REG_CMP_COUNTER_START_ADDR, 0x410}, ++ {OP_WR, XSDM_REG_Q_COUNTER_START_ADDR, 0x414}, ++ {OP_WR, XSDM_REG_CMP_COUNTER_MAX0, 0xffff}, ++ {OP_WR, XSDM_REG_CMP_COUNTER_MAX1, 0xffff}, ++ {OP_WR, XSDM_REG_CMP_COUNTER_MAX2, 0xffff}, ++ {OP_WR, XSDM_REG_CMP_COUNTER_MAX3, 0xffff}, ++ {OP_WR, XSDM_REG_AGG_INT_EVENT_0, 0x20}, ++ {OP_WR, XSDM_REG_AGG_INT_EVENT_1, 0x20}, ++ {OP_WR, XSDM_REG_AGG_INT_EVENT_2, 0x34}, ++ {OP_WR, XSDM_REG_AGG_INT_EVENT_3, 0x35}, ++ {OP_WR, XSDM_REG_AGG_INT_EVENT_4, 0x23}, ++ {OP_WR, XSDM_REG_AGG_INT_EVENT_5, 0x24}, ++ {OP_WR, XSDM_REG_AGG_INT_EVENT_6, 0x25}, ++ {OP_WR, XSDM_REG_AGG_INT_EVENT_7, 0x26}, ++ {OP_WR, XSDM_REG_AGG_INT_EVENT_8, 0x27}, ++ {OP_WR, XSDM_REG_AGG_INT_EVENT_9, 0x29}, ++ {OP_WR, XSDM_REG_AGG_INT_EVENT_10, 0x2a}, ++ {OP_WR, XSDM_REG_AGG_INT_EVENT_11, 0x2b}, ++ {OP_WR, XSDM_REG_AGG_INT_EVENT_12, 0x2c}, ++ {OP_WR, XSDM_REG_AGG_INT_EVENT_13, 0x2d}, ++ {OP_ZR, XSDM_REG_AGG_INT_EVENT_14, 0x52}, ++ {OP_WR, XSDM_REG_AGG_INT_MODE_0, 0x1}, ++ {OP_ZR, XSDM_REG_AGG_INT_MODE_1, 0x1f}, ++ {OP_WR, XSDM_REG_ENABLE_IN1, 0x7ffffff}, ++ {OP_WR, XSDM_REG_ENABLE_IN2, 0x3f}, ++ {OP_WR, XSDM_REG_ENABLE_OUT1, 0x7ffffff}, ++ {OP_WR, XSDM_REG_ENABLE_OUT2, 0xf}, ++ {OP_RD, XSDM_REG_NUM_OF_Q0_CMD, 0x0}, ++ {OP_RD, XSDM_REG_NUM_OF_Q1_CMD, 0x0}, ++ {OP_RD, XSDM_REG_NUM_OF_Q3_CMD, 0x0}, ++ {OP_RD, XSDM_REG_NUM_OF_Q4_CMD, 0x0}, ++ {OP_RD, XSDM_REG_NUM_OF_Q5_CMD, 0x0}, ++ {OP_RD, XSDM_REG_NUM_OF_Q6_CMD, 0x0}, ++ {OP_RD, XSDM_REG_NUM_OF_Q7_CMD, 0x0}, ++ {OP_RD, XSDM_REG_NUM_OF_Q8_CMD, 0x0}, ++ {OP_RD, XSDM_REG_NUM_OF_Q9_CMD, 0x0}, ++ {OP_RD, XSDM_REG_NUM_OF_Q10_CMD, 0x0}, ++ {OP_RD, XSDM_REG_NUM_OF_Q11_CMD, 0x0}, ++ {OP_RD, XSDM_REG_NUM_OF_PKT_END_MSG, 0x0}, ++ {OP_RD, XSDM_REG_NUM_OF_PXP_ASYNC_REQ, 0x0}, ++ {OP_RD, XSDM_REG_NUM_OF_ACK_AFTER_PLACE, 0x0}, ++ {OP_WR_ASIC, XSDM_REG_TIMER_TICK, 0x3e8}, ++ {OP_WR_EMUL, XSDM_REG_TIMER_TICK, 0x1}, ++ {OP_WR_FPGA, XSDM_REG_TIMER_TICK, 0xa}, ++/* #define XSDM_COMMON_END 529 */ ++/* #define QM_COMMON_START 550 */ ++ {OP_WR, QM_REG_ACTCTRINITVAL_0, 0x6}, ++ {OP_WR, QM_REG_ACTCTRINITVAL_1, 0x5}, ++ {OP_WR, QM_REG_ACTCTRINITVAL_2, 0xa}, ++ {OP_WR, QM_REG_ACTCTRINITVAL_3, 0x5}, ++ {OP_WR, QM_REG_PCIREQAT, 0x2}, ++ {OP_WR, QM_REG_CMINITCRD_0, 0x4}, ++ {OP_WR, QM_REG_CMINITCRD_1, 0x4}, ++ {OP_WR, QM_REG_CMINITCRD_2, 0x4}, ++ {OP_WR, QM_REG_CMINITCRD_3, 0x4}, ++ {OP_WR, QM_REG_CMINITCRD_4, 0x4}, ++ {OP_WR, QM_REG_CMINITCRD_5, 0x4}, ++ {OP_WR, QM_REG_CMINITCRD_6, 0x4}, ++ {OP_WR, QM_REG_CMINITCRD_7, 0x4}, ++ {OP_WR, QM_REG_OUTLDREQ, 0x4}, ++ {OP_WR, QM_REG_CTXREG_0, 0x7c}, ++ {OP_WR, QM_REG_CTXREG_1, 0x3d}, ++ {OP_WR, QM_REG_CTXREG_2, 0x3f}, ++ {OP_WR, QM_REG_CTXREG_3, 0x9c}, ++ {OP_WR, QM_REG_ENSEC, 0x7}, ++ {OP_ZR, QM_REG_QVOQIDX_0, 0x5}, ++ {OP_WR, QM_REG_WRRWEIGHTS_0, 0x1010101}, ++ {OP_WR, QM_REG_QVOQIDX_5, 0x0}, ++ {OP_WR, QM_REG_QVOQIDX_6, 0x4}, ++ {OP_WR, QM_REG_QVOQIDX_7, 0x4}, ++ {OP_WR, QM_REG_QVOQIDX_8, 0x2}, ++ {OP_WR, QM_REG_WRRWEIGHTS_1, 0x8012004}, ++ {OP_WR, QM_REG_QVOQIDX_9, 0x5}, ++ {OP_WR, QM_REG_QVOQIDX_10, 0x5}, ++ {OP_WR, QM_REG_QVOQIDX_11, 0x5}, ++ {OP_WR, QM_REG_QVOQIDX_12, 0x5}, ++ {OP_WR, QM_REG_WRRWEIGHTS_2, 0x20081001}, ++ {OP_WR, QM_REG_QVOQIDX_13, 0x8}, ++ {OP_WR, QM_REG_QVOQIDX_14, 0x6}, ++ {OP_WR, QM_REG_QVOQIDX_15, 0x7}, ++ {OP_WR, QM_REG_QVOQIDX_16, 0x0}, ++ {OP_WR, QM_REG_WRRWEIGHTS_3, 0x1010120}, ++ {OP_ZR, QM_REG_QVOQIDX_17, 0x4}, ++ {OP_WR, QM_REG_WRRWEIGHTS_4, 0x1010101}, ++ {OP_WR, QM_REG_QVOQIDX_21, 0x0}, ++ {OP_WR, QM_REG_QVOQIDX_22, 0x4}, ++ {OP_WR, QM_REG_QVOQIDX_23, 0x4}, ++ {OP_WR, QM_REG_QVOQIDX_24, 0x2}, ++ {OP_WR, QM_REG_WRRWEIGHTS_5, 0x8012004}, ++ {OP_WR, QM_REG_QVOQIDX_25, 0x5}, ++ {OP_WR, QM_REG_QVOQIDX_26, 0x5}, ++ {OP_WR, QM_REG_QVOQIDX_27, 0x5}, ++ {OP_WR, QM_REG_QVOQIDX_28, 0x5}, ++ {OP_WR, QM_REG_WRRWEIGHTS_6, 0x20081001}, ++ {OP_WR, QM_REG_QVOQIDX_29, 0x8}, ++ {OP_WR, QM_REG_QVOQIDX_30, 0x6}, ++ {OP_WR, QM_REG_QVOQIDX_31, 0x7}, ++ {OP_WR, QM_REG_QVOQIDX_32, 0x1}, ++ {OP_WR, QM_REG_WRRWEIGHTS_7, 0x1010120}, ++ {OP_WR, QM_REG_QVOQIDX_33, 0x1}, ++ {OP_WR, QM_REG_QVOQIDX_34, 0x1}, ++ {OP_WR, QM_REG_QVOQIDX_35, 0x1}, ++ {OP_WR, QM_REG_QVOQIDX_36, 0x1}, ++ {OP_WR, QM_REG_WRRWEIGHTS_8, 0x1010101}, ++ {OP_WR, QM_REG_QVOQIDX_37, 0x1}, ++ {OP_WR, QM_REG_QVOQIDX_38, 0x4}, ++ {OP_WR, QM_REG_QVOQIDX_39, 0x4}, ++ {OP_WR, QM_REG_QVOQIDX_40, 0x2}, ++ {OP_WR, QM_REG_WRRWEIGHTS_9, 0x8012004}, ++ {OP_WR, QM_REG_QVOQIDX_41, 0x5}, ++ {OP_WR, QM_REG_QVOQIDX_42, 0x5}, ++ {OP_WR, QM_REG_QVOQIDX_43, 0x5}, ++ {OP_WR, QM_REG_QVOQIDX_44, 0x5}, ++ {OP_WR, QM_REG_WRRWEIGHTS_10, 0x20081001}, ++ {OP_WR, QM_REG_QVOQIDX_45, 0x8}, ++ {OP_WR, QM_REG_QVOQIDX_46, 0x6}, ++ {OP_WR, QM_REG_QVOQIDX_47, 0x7}, ++ {OP_WR, QM_REG_QVOQIDX_48, 0x1}, ++ {OP_WR, QM_REG_WRRWEIGHTS_11, 0x1010120}, ++ {OP_WR, QM_REG_QVOQIDX_49, 0x1}, ++ {OP_WR, QM_REG_QVOQIDX_50, 0x1}, ++ {OP_WR, QM_REG_QVOQIDX_51, 0x1}, ++ {OP_WR, QM_REG_QVOQIDX_52, 0x1}, ++ {OP_WR, QM_REG_WRRWEIGHTS_12, 0x1010101}, ++ {OP_WR, QM_REG_QVOQIDX_53, 0x1}, ++ {OP_WR, QM_REG_QVOQIDX_54, 0x4}, ++ {OP_WR, QM_REG_QVOQIDX_55, 0x4}, ++ {OP_WR, QM_REG_QVOQIDX_56, 0x2}, ++ {OP_WR, QM_REG_WRRWEIGHTS_13, 0x8012004}, ++ {OP_WR, QM_REG_QVOQIDX_57, 0x5}, ++ {OP_WR, QM_REG_QVOQIDX_58, 0x5}, ++ {OP_WR, QM_REG_QVOQIDX_59, 0x5}, ++ {OP_WR, QM_REG_QVOQIDX_60, 0x5}, ++ {OP_WR, QM_REG_WRRWEIGHTS_14, 0x20081001}, ++ {OP_WR, QM_REG_QVOQIDX_61, 0x8}, ++ {OP_WR, QM_REG_QVOQIDX_62, 0x6}, ++ {OP_WR, QM_REG_QVOQIDX_63, 0x7}, ++ {OP_WR, QM_REG_QVOQIDX_64, 0x0}, ++ {OP_WR, QM_REG_WRRWEIGHTS_15, 0x1010120}, ++ {OP_ZR, QM_REG_QVOQIDX_65, 0x4}, ++ {OP_WR, QM_REG_WRRWEIGHTS_16, 0x1010101}, ++ {OP_WR, QM_REG_QVOQIDX_69, 0x0}, ++ {OP_WR, QM_REG_QVOQIDX_70, 0x4}, ++ {OP_WR, QM_REG_QVOQIDX_71, 0x4}, ++ {OP_WR, QM_REG_QVOQIDX_72, 0x2}, ++ {OP_WR, QM_REG_WRRWEIGHTS_17, 0x8012004}, ++ {OP_WR, QM_REG_QVOQIDX_73, 0x5}, ++ {OP_WR, QM_REG_QVOQIDX_74, 0x5}, ++ {OP_WR, QM_REG_QVOQIDX_75, 0x5}, ++ {OP_WR, QM_REG_QVOQIDX_76, 0x5}, ++ {OP_WR, QM_REG_WRRWEIGHTS_18, 0x20081001}, ++ {OP_WR, QM_REG_QVOQIDX_77, 0x8}, ++ {OP_WR, QM_REG_QVOQIDX_78, 0x6}, ++ {OP_WR, QM_REG_QVOQIDX_79, 0x7}, ++ {OP_WR, QM_REG_QVOQIDX_80, 0x0}, ++ {OP_WR, QM_REG_WRRWEIGHTS_19, 0x1010120}, ++ {OP_ZR, QM_REG_QVOQIDX_81, 0x4}, ++ {OP_WR, QM_REG_WRRWEIGHTS_20, 0x1010101}, ++ {OP_WR, QM_REG_QVOQIDX_85, 0x0}, ++ {OP_WR, QM_REG_QVOQIDX_86, 0x4}, ++ {OP_WR, QM_REG_QVOQIDX_87, 0x4}, ++ {OP_WR, QM_REG_QVOQIDX_88, 0x2}, ++ {OP_WR, QM_REG_WRRWEIGHTS_21, 0x8012004}, ++ {OP_WR, QM_REG_QVOQIDX_89, 0x5}, ++ {OP_WR, QM_REG_QVOQIDX_90, 0x5}, ++ {OP_WR, QM_REG_QVOQIDX_91, 0x5}, ++ {OP_WR, QM_REG_QVOQIDX_92, 0x5}, ++ {OP_WR, QM_REG_WRRWEIGHTS_22, 0x20081001}, ++ {OP_WR, QM_REG_QVOQIDX_93, 0x8}, ++ {OP_WR, QM_REG_QVOQIDX_94, 0x6}, ++ {OP_WR, QM_REG_QVOQIDX_95, 0x7}, ++ {OP_WR, QM_REG_QVOQIDX_96, 0x1}, ++ {OP_WR, QM_REG_WRRWEIGHTS_23, 0x1010120}, ++ {OP_WR, QM_REG_QVOQIDX_97, 0x1}, ++ {OP_WR, QM_REG_QVOQIDX_98, 0x1}, ++ {OP_WR, QM_REG_QVOQIDX_99, 0x1}, ++ {OP_WR, QM_REG_QVOQIDX_100, 0x1}, ++ {OP_WR, QM_REG_WRRWEIGHTS_24, 0x1010101}, ++ {OP_WR, QM_REG_QVOQIDX_101, 0x1}, ++ {OP_WR, QM_REG_QVOQIDX_102, 0x4}, ++ {OP_WR, QM_REG_QVOQIDX_103, 0x4}, ++ {OP_WR, QM_REG_QVOQIDX_104, 0x2}, ++ {OP_WR, QM_REG_WRRWEIGHTS_25, 0x8012004}, ++ {OP_WR, QM_REG_QVOQIDX_105, 0x5}, ++ {OP_WR, QM_REG_QVOQIDX_106, 0x5}, ++ {OP_WR, QM_REG_QVOQIDX_107, 0x5}, ++ {OP_WR, QM_REG_QVOQIDX_108, 0x5}, ++ {OP_WR, QM_REG_WRRWEIGHTS_26, 0x20081001}, ++ {OP_WR, QM_REG_QVOQIDX_109, 0x8}, ++ {OP_WR, QM_REG_QVOQIDX_110, 0x6}, ++ {OP_WR, QM_REG_QVOQIDX_111, 0x7}, ++ {OP_WR, QM_REG_QVOQIDX_112, 0x1}, ++ {OP_WR, QM_REG_WRRWEIGHTS_27, 0x1010120}, ++ {OP_WR, QM_REG_QVOQIDX_113, 0x1}, ++ {OP_WR, QM_REG_QVOQIDX_114, 0x1}, ++ {OP_WR, QM_REG_QVOQIDX_115, 0x1}, ++ {OP_WR, QM_REG_QVOQIDX_116, 0x1}, ++ {OP_WR, QM_REG_WRRWEIGHTS_28, 0x1010101}, ++ {OP_WR, QM_REG_QVOQIDX_117, 0x1}, ++ {OP_WR, QM_REG_QVOQIDX_118, 0x4}, ++ {OP_WR, QM_REG_QVOQIDX_119, 0x4}, ++ {OP_WR, QM_REG_QVOQIDX_120, 0x2}, ++ {OP_WR, QM_REG_WRRWEIGHTS_29, 0x8012004}, ++ {OP_WR, QM_REG_QVOQIDX_121, 0x5}, ++ {OP_WR, QM_REG_QVOQIDX_122, 0x5}, ++ {OP_WR, QM_REG_QVOQIDX_123, 0x5}, ++ {OP_WR, QM_REG_QVOQIDX_124, 0x5}, ++ {OP_WR, QM_REG_WRRWEIGHTS_30, 0x20081001}, ++ {OP_WR, QM_REG_QVOQIDX_125, 0x8}, ++ {OP_WR, QM_REG_QVOQIDX_126, 0x6}, ++ {OP_WR, QM_REG_QVOQIDX_127, 0x7}, ++ {OP_WR, QM_REG_WRRWEIGHTS_31, 0x1010120}, ++ {OP_WR, QM_REG_VOQQMASK_0_LSB, 0x3f003f}, ++ {OP_WR, QM_REG_VOQQMASK_0_MSB, 0x0}, ++ {OP_WR, QM_REG_VOQQMASK_0_LSB_EXT_A, 0x3f003f}, ++ {OP_WR, QM_REG_VOQQMASK_0_MSB_EXT_A, 0x0}, ++ {OP_WR, QM_REG_VOQQMASK_1_LSB, 0x0}, ++ {OP_WR, QM_REG_VOQQMASK_1_MSB, 0x3f003f}, ++ {OP_WR, QM_REG_VOQQMASK_1_LSB_EXT_A, 0x0}, ++ {OP_WR, QM_REG_VOQQMASK_1_MSB_EXT_A, 0x3f003f}, ++ {OP_WR, QM_REG_VOQQMASK_2_LSB, 0x1000100}, ++ {OP_WR, QM_REG_VOQQMASK_2_MSB, 0x1000100}, ++ {OP_WR, QM_REG_VOQQMASK_2_LSB_EXT_A, 0x1000100}, ++ {OP_WR, QM_REG_VOQQMASK_2_MSB_EXT_A, 0x1000100}, ++ {OP_ZR, QM_REG_VOQQMASK_3_LSB, 0x2}, ++ {OP_WR, QM_REG_VOQQMASK_3_LSB_EXT_A, 0x0}, ++ {OP_WR, QM_REG_VOQQMASK_3_MSB_EXT_A, 0x0}, ++ {OP_WR, QM_REG_VOQQMASK_4_LSB, 0xc000c0}, ++ {OP_WR, QM_REG_VOQQMASK_4_MSB, 0xc000c0}, ++ {OP_WR, QM_REG_VOQQMASK_4_LSB_EXT_A, 0xc000c0}, ++ {OP_WR, QM_REG_VOQQMASK_4_MSB_EXT_A, 0xc000c0}, ++ {OP_WR, QM_REG_VOQQMASK_5_LSB, 0x1e001e00}, ++ {OP_WR, QM_REG_VOQQMASK_5_MSB, 0x1e001e00}, ++ {OP_WR, QM_REG_VOQQMASK_5_LSB_EXT_A, 0x1e001e00}, ++ {OP_WR, QM_REG_VOQQMASK_5_MSB_EXT_A, 0x1e001e00}, ++ {OP_WR, QM_REG_VOQQMASK_6_LSB, 0x40004000}, ++ {OP_WR, QM_REG_VOQQMASK_6_MSB, 0x40004000}, ++ {OP_WR, QM_REG_VOQQMASK_6_LSB_EXT_A, 0x40004000}, ++ {OP_WR, QM_REG_VOQQMASK_6_MSB_EXT_A, 0x40004000}, ++ {OP_WR, QM_REG_VOQQMASK_7_LSB, 0x80008000}, ++ {OP_WR, QM_REG_VOQQMASK_7_MSB, 0x80008000}, ++ {OP_WR, QM_REG_VOQQMASK_7_LSB_EXT_A, 0x80008000}, ++ {OP_WR, QM_REG_VOQQMASK_7_MSB_EXT_A, 0x80008000}, ++ {OP_WR, QM_REG_VOQQMASK_8_LSB, 0x20002000}, ++ {OP_WR, QM_REG_VOQQMASK_8_MSB, 0x20002000}, ++ {OP_WR, QM_REG_VOQQMASK_8_LSB_EXT_A, 0x20002000}, ++ {OP_WR, QM_REG_VOQQMASK_8_MSB_EXT_A, 0x20002000}, ++ {OP_ZR, QM_REG_VOQQMASK_9_LSB, 0x2}, ++ {OP_WR, QM_REG_VOQQMASK_9_LSB_EXT_A, 0x0}, ++ {OP_WR, QM_REG_VOQQMASK_9_MSB_EXT_A, 0x0}, ++ {OP_WR, QM_REG_VOQQMASK_10_LSB, 0x0}, ++ {OP_WR, QM_REG_VOQQMASK_10_MSB, 0x0}, ++ {OP_WR, QM_REG_VOQQMASK_10_LSB_EXT_A, 0x0}, ++ {OP_WR, QM_REG_VOQQMASK_10_MSB_EXT_A, 0x0}, ++ {OP_WR, QM_REG_VOQQMASK_11_LSB, 0x0}, ++ {OP_WR, QM_REG_VOQQMASK_11_MSB, 0x0}, ++ {OP_WR, QM_REG_VOQQMASK_11_LSB_EXT_A, 0x0}, ++ {OP_WR, QM_REG_VOQQMASK_11_MSB_EXT_A, 0x0}, ++ {OP_WR, QM_REG_VOQPORT_0, 0x0}, ++ {OP_WR, QM_REG_VOQPORT_1, 0x1}, ++ {OP_ZR, QM_REG_VOQPORT_2, 0xa}, ++ {OP_WR, QM_REG_CMINTVOQMASK_0, 0xc08}, ++ {OP_WR, QM_REG_CMINTVOQMASK_1, 0x40}, ++ {OP_WR, QM_REG_CMINTVOQMASK_2, 0x100}, ++ {OP_WR, QM_REG_CMINTVOQMASK_3, 0x20}, ++ {OP_WR, QM_REG_CMINTVOQMASK_4, 0x17}, ++ {OP_WR, QM_REG_CMINTVOQMASK_5, 0x80}, ++ {OP_WR, QM_REG_CMINTVOQMASK_6, 0x200}, ++ {OP_WR, QM_REG_CMINTVOQMASK_7, 0x0}, ++ {OP_WR, QM_REG_HWAEMPTYMASK_LSB, 0x1ff01ff}, ++ {OP_WR, QM_REG_HWAEMPTYMASK_MSB, 0x1ff01ff}, ++ {OP_WR, QM_REG_HWAEMPTYMASK_LSB_EXT_A, 0x1ff01ff}, ++ {OP_WR, QM_REG_HWAEMPTYMASK_MSB_EXT_A, 0x1ff01ff}, ++ {OP_WR, QM_REG_ENBYPVOQMASK, 0x13}, ++ {OP_WR, QM_REG_VOQCREDITAFULLTHR, 0x13f}, ++ {OP_WR, QM_REG_VOQINITCREDIT_0, 0x140}, ++ {OP_WR, QM_REG_VOQINITCREDIT_1, 0x140}, ++ {OP_ZR, QM_REG_VOQINITCREDIT_2, 0x2}, ++ {OP_WR, QM_REG_VOQINITCREDIT_4, 0xc0}, ++ {OP_ZR, QM_REG_VOQINITCREDIT_5, 0x7}, ++ {OP_WR, QM_REG_TASKCRDCOST_0, 0x48}, ++ {OP_WR, QM_REG_TASKCRDCOST_1, 0x48}, ++ {OP_ZR, QM_REG_TASKCRDCOST_2, 0x2}, ++ {OP_WR, QM_REG_TASKCRDCOST_4, 0x48}, ++ {OP_ZR, QM_REG_TASKCRDCOST_5, 0x7}, ++ {OP_WR, QM_REG_BYTECRDINITVAL, 0x8000}, ++ {OP_WR, QM_REG_BYTECRDCOST, 0x25e4}, ++ {OP_WR, QM_REG_BYTECREDITAFULLTHR, 0x7fff}, ++ {OP_WR, QM_REG_ENBYTECRD_LSB, 0xf000f}, ++ {OP_WR, QM_REG_ENBYTECRD_MSB, 0xf000f}, ++ {OP_WR, QM_REG_ENBYTECRD_LSB_EXT_A, 0xf000f}, ++ {OP_WR, QM_REG_ENBYTECRD_MSB_EXT_A, 0xf000f}, ++ {OP_WR, QM_REG_BYTECRDPORT_LSB, 0x0}, ++ {OP_WR, QM_REG_BYTECRDPORT_MSB, 0xffffffff}, ++ {OP_WR, QM_REG_BYTECRDPORT_LSB_EXT_A, 0x0}, ++ {OP_WR, QM_REG_BYTECRDPORT_MSB_EXT_A, 0xffffffff}, ++ {OP_WR, QM_REG_PQ2PCIFUNC_0, 0x0}, ++ {OP_WR, QM_REG_PQ2PCIFUNC_1, 0x2}, ++ {OP_WR, QM_REG_PQ2PCIFUNC_2, 0x1}, ++ {OP_WR, QM_REG_PQ2PCIFUNC_3, 0x3}, ++ {OP_WR, QM_REG_PQ2PCIFUNC_4, 0x4}, ++ {OP_WR, QM_REG_PQ2PCIFUNC_5, 0x6}, ++ {OP_WR, QM_REG_PQ2PCIFUNC_6, 0x5}, ++ {OP_WR, QM_REG_PQ2PCIFUNC_7, 0x7}, ++ {OP_WR, QM_REG_CMINTEN, 0xff}, ++/* #define QM_COMMON_END 551 */ ++/* #define PBF_COMMON_START 572 */ ++ {OP_WR, PBF_REG_INIT, 0x1}, ++ {OP_WR, PBF_REG_INIT_P4, 0x1}, ++ {OP_WR, PBF_REG_MAC_LB_ENABLE, 0x1}, ++ {OP_WR, PBF_REG_IF_ENABLE_REG, 0x7fff}, ++ {OP_WR, PBF_REG_INIT_P4, 0x0}, ++ {OP_WR, PBF_REG_INIT, 0x0}, ++ {OP_WR, PBF_REG_DISABLE_NEW_TASK_PROC_P4, 0x0}, ++/* #define PBF_COMMON_END 573 */ ++/* #define PBF_PORT0_START 574 */ ++ {OP_WR, PBF_REG_INIT_P0, 0x1}, ++ {OP_WR, PBF_REG_MAC_IF0_ENABLE, 0x1}, ++ {OP_WR, PBF_REG_INIT_P0, 0x0}, ++ {OP_WR, PBF_REG_DISABLE_NEW_TASK_PROC_P0, 0x0}, ++/* #define PBF_PORT0_END 575 */ ++/* #define PBF_PORT1_START 576 */ ++ {OP_WR, PBF_REG_INIT_P1, 0x1}, ++ {OP_WR, PBF_REG_MAC_IF1_ENABLE, 0x1}, ++ {OP_WR, PBF_REG_INIT_P1, 0x0}, ++ {OP_WR, PBF_REG_DISABLE_NEW_TASK_PROC_P1, 0x0}, ++/* #define PBF_PORT1_END 577 */ ++/* #define XCM_COMMON_START 594 */ ++ {OP_WR, XCM_REG_XX_OVFL_EVNT_ID, 0x32}, ++ {OP_WR, XCM_REG_XQM_XCM_HDR_P, 0x3150020}, ++ {OP_WR, XCM_REG_XQM_XCM_HDR_S, 0x3150020}, ++ {OP_WR, XCM_REG_TM_XCM_HDR, 0x1000030}, ++ {OP_WR, XCM_REG_ERR_XCM_HDR, 0x8100000}, ++ {OP_WR, XCM_REG_ERR_EVNT_ID, 0x33}, ++ {OP_WR, XCM_REG_EXPR_EVNT_ID, 0x30}, ++ {OP_WR, XCM_REG_STOP_EVNT_ID, 0x31}, ++ {OP_WR, XCM_REG_STORM_WEIGHT, 0x3}, ++ {OP_WR, XCM_REG_TSEM_WEIGHT, 0x6}, ++ {OP_WR, XCM_REG_CSEM_WEIGHT, 0x3}, ++ {OP_WR, XCM_REG_USEM_WEIGHT, 0x3}, ++ {OP_WR, XCM_REG_DORQ_WEIGHT, 0x2}, ++ {OP_WR, XCM_REG_PBF_WEIGHT, 0x0}, ++ {OP_WR, XCM_REG_NIG0_WEIGHT, 0x2}, ++ {OP_WR, XCM_REG_CP_WEIGHT, 0x0}, ++ {OP_WR, XCM_REG_XSDM_WEIGHT, 0x6}, ++ {OP_WR, XCM_REG_XQM_P_WEIGHT, 0x4}, ++ {OP_WR, XCM_REG_XQM_S_WEIGHT, 0x2}, ++ {OP_WR, XCM_REG_TM_WEIGHT, 0x2}, ++ {OP_WR, XCM_REG_XCM_XQM_USE_Q, 0x1}, ++ {OP_WR, XCM_REG_XQM_BYP_ACT_UPD, 0x6}, ++ {OP_WR, XCM_REG_UNA_GT_NXT_Q, 0x0}, ++ {OP_WR, XCM_REG_AUX1_Q, 0x2}, ++ {OP_WR, XCM_REG_AUX_CNT_FLG_Q_19, 0x1}, ++ {OP_WR, XCM_REG_GR_ARB_TYPE, 0x1}, ++ {OP_WR, XCM_REG_GR_LD0_PR, 0x1}, ++ {OP_WR, XCM_REG_GR_LD1_PR, 0x2}, ++ {OP_WR, XCM_REG_CFC_INIT_CRD, 0x1}, ++ {OP_WR, XCM_REG_FIC0_INIT_CRD, 0x40}, ++ {OP_WR, XCM_REG_FIC1_INIT_CRD, 0x40}, ++ {OP_WR, XCM_REG_TM_INIT_CRD, 0x4}, ++ {OP_WR, XCM_REG_XQM_INIT_CRD, 0x20}, ++ {OP_WR, XCM_REG_XX_INIT_CRD, 0x2}, ++ {OP_WR, XCM_REG_XX_MSG_NUM, 0x20}, ++ {OP_ZR, XCM_REG_XX_TABLE, 0x12}, ++ {OP_SW, XCM_REG_XX_DESCR_TABLE, 0x1f032b}, ++ {OP_WR, XCM_REG_N_SM_CTX_LD_0, 0xf}, ++ {OP_WR, XCM_REG_N_SM_CTX_LD_1, 0x7}, ++ {OP_WR, XCM_REG_N_SM_CTX_LD_2, 0xb}, ++ {OP_WR, XCM_REG_N_SM_CTX_LD_3, 0xe}, ++ {OP_WR, XCM_REG_N_SM_CTX_LD_4, 0xe}, ++ {OP_ZR, XCM_REG_N_SM_CTX_LD_5, 0x3}, ++ {OP_WR, XCM_REG_XCM_REG0_SZ, 0x4}, ++ {OP_WR, XCM_REG_XCM_STORM0_IFEN, 0x1}, ++ {OP_WR, XCM_REG_XCM_STORM1_IFEN, 0x1}, ++ {OP_WR, XCM_REG_XCM_XQM_IFEN, 0x1}, ++ {OP_WR, XCM_REG_STORM_XCM_IFEN, 0x1}, ++ {OP_WR, XCM_REG_XQM_XCM_IFEN, 0x1}, ++ {OP_WR, XCM_REG_XSDM_IFEN, 0x1}, ++ {OP_WR, XCM_REG_TM_XCM_IFEN, 0x1}, ++ {OP_WR, XCM_REG_XCM_TM_IFEN, 0x1}, ++ {OP_WR, XCM_REG_TSEM_IFEN, 0x1}, ++ {OP_WR, XCM_REG_CSEM_IFEN, 0x1}, ++ {OP_WR, XCM_REG_USEM_IFEN, 0x1}, ++ {OP_WR, XCM_REG_DORQ_IFEN, 0x1}, ++ {OP_WR, XCM_REG_PBF_IFEN, 0x1}, ++ {OP_WR, XCM_REG_NIG0_IFEN, 0x1}, ++ {OP_WR, XCM_REG_NIG1_IFEN, 0x1}, ++ {OP_WR, XCM_REG_CDU_AG_WR_IFEN, 0x1}, ++ {OP_WR, XCM_REG_CDU_AG_RD_IFEN, 0x1}, ++ {OP_WR, XCM_REG_CDU_SM_WR_IFEN, 0x1}, ++ {OP_WR, XCM_REG_CDU_SM_RD_IFEN, 0x1}, ++ {OP_WR, XCM_REG_XCM_CFC_IFEN, 0x1}, ++/* #define XCM_COMMON_END 595 */ ++/* #define XCM_FUNC0_START 600 */ ++ {OP_WR, XCM_REG_GLB_DEL_ACK_TMR_VAL_0, 0xc8}, ++ {OP_WR, XCM_REG_GLB_DEL_ACK_MAX_CNT_0, 0x2}, ++ {OP_WR, XCM_REG_WU_DA_SET_TMR_CNT_FLG_CMD00, 0x0}, ++ {OP_WR, XCM_REG_WU_DA_SET_TMR_CNT_FLG_CMD10, 0x0}, ++ {OP_WR, XCM_REG_WU_DA_CNT_CMD00, 0x2}, ++ {OP_WR, XCM_REG_WU_DA_CNT_CMD10, 0x2}, ++ {OP_WR, XCM_REG_WU_DA_CNT_UPD_VAL00, 0xff}, ++ {OP_WR, XCM_REG_WU_DA_CNT_UPD_VAL10, 0xff}, ++ {OP_WR, XCM_REG_PHYS_QNUM3_0, 0x0}, ++/* #define XCM_FUNC0_END 601 */ ++/* #define XCM_FUNC1_START 602 */ ++ {OP_WR, XCM_REG_GLB_DEL_ACK_TMR_VAL_1, 0xc8}, ++ {OP_WR, XCM_REG_GLB_DEL_ACK_MAX_CNT_1, 0x2}, ++ {OP_WR, XCM_REG_WU_DA_SET_TMR_CNT_FLG_CMD01, 0x0}, ++ {OP_WR, XCM_REG_WU_DA_SET_TMR_CNT_FLG_CMD11, 0x0}, ++ {OP_WR, XCM_REG_WU_DA_CNT_CMD01, 0x2}, ++ {OP_WR, XCM_REG_WU_DA_CNT_CMD11, 0x2}, ++ {OP_WR, XCM_REG_WU_DA_CNT_UPD_VAL01, 0xff}, ++ {OP_WR, XCM_REG_WU_DA_CNT_UPD_VAL11, 0xff}, ++ {OP_WR, XCM_REG_PHYS_QNUM3_1, 0x0}, ++/* #define XCM_FUNC1_END 603 */ ++/* #define XCM_FUNC2_START 604 */ ++ {OP_WR, XCM_REG_GLB_DEL_ACK_TMR_VAL_0, 0xc8}, ++ {OP_WR, XCM_REG_GLB_DEL_ACK_MAX_CNT_0, 0x2}, ++ {OP_WR, XCM_REG_WU_DA_SET_TMR_CNT_FLG_CMD00, 0x0}, ++ {OP_WR, XCM_REG_WU_DA_SET_TMR_CNT_FLG_CMD10, 0x0}, ++ {OP_WR, XCM_REG_WU_DA_CNT_CMD00, 0x2}, ++ {OP_WR, XCM_REG_WU_DA_CNT_CMD10, 0x2}, ++ {OP_WR, XCM_REG_WU_DA_CNT_UPD_VAL00, 0xff}, ++ {OP_WR, XCM_REG_WU_DA_CNT_UPD_VAL10, 0xff}, ++ {OP_WR, XCM_REG_PHYS_QNUM3_0, 0x0}, ++/* #define XCM_FUNC2_END 605 */ ++/* #define XCM_FUNC3_START 606 */ ++ {OP_WR, XCM_REG_GLB_DEL_ACK_TMR_VAL_1, 0xc8}, ++ {OP_WR, XCM_REG_GLB_DEL_ACK_MAX_CNT_1, 0x2}, ++ {OP_WR, XCM_REG_WU_DA_SET_TMR_CNT_FLG_CMD01, 0x0}, ++ {OP_WR, XCM_REG_WU_DA_SET_TMR_CNT_FLG_CMD11, 0x0}, ++ {OP_WR, XCM_REG_WU_DA_CNT_CMD01, 0x2}, ++ {OP_WR, XCM_REG_WU_DA_CNT_CMD11, 0x2}, ++ {OP_WR, XCM_REG_WU_DA_CNT_UPD_VAL01, 0xff}, ++ {OP_WR, XCM_REG_WU_DA_CNT_UPD_VAL11, 0xff}, ++ {OP_WR, XCM_REG_PHYS_QNUM3_1, 0x0}, ++/* #define XCM_FUNC3_END 607 */ ++/* #define XCM_FUNC4_START 608 */ ++ {OP_WR, XCM_REG_GLB_DEL_ACK_TMR_VAL_0, 0xc8}, ++ {OP_WR, XCM_REG_GLB_DEL_ACK_MAX_CNT_0, 0x2}, ++ {OP_WR, XCM_REG_WU_DA_SET_TMR_CNT_FLG_CMD00, 0x0}, ++ {OP_WR, XCM_REG_WU_DA_SET_TMR_CNT_FLG_CMD10, 0x0}, ++ {OP_WR, XCM_REG_WU_DA_CNT_CMD00, 0x2}, ++ {OP_WR, XCM_REG_WU_DA_CNT_CMD10, 0x2}, ++ {OP_WR, XCM_REG_WU_DA_CNT_UPD_VAL00, 0xff}, ++ {OP_WR, XCM_REG_WU_DA_CNT_UPD_VAL10, 0xff}, ++ {OP_WR, XCM_REG_PHYS_QNUM3_0, 0x0}, ++/* #define XCM_FUNC4_END 609 */ ++/* #define XCM_FUNC5_START 610 */ ++ {OP_WR, XCM_REG_GLB_DEL_ACK_TMR_VAL_1, 0xc8}, ++ {OP_WR, XCM_REG_GLB_DEL_ACK_MAX_CNT_1, 0x2}, ++ {OP_WR, XCM_REG_WU_DA_SET_TMR_CNT_FLG_CMD01, 0x0}, ++ {OP_WR, XCM_REG_WU_DA_SET_TMR_CNT_FLG_CMD11, 0x0}, ++ {OP_WR, XCM_REG_WU_DA_CNT_CMD01, 0x2}, ++ {OP_WR, XCM_REG_WU_DA_CNT_CMD11, 0x2}, ++ {OP_WR, XCM_REG_WU_DA_CNT_UPD_VAL01, 0xff}, ++ {OP_WR, XCM_REG_WU_DA_CNT_UPD_VAL11, 0xff}, ++ {OP_WR, XCM_REG_PHYS_QNUM3_1, 0x0}, ++/* #define XCM_FUNC5_END 611 */ ++/* #define XCM_FUNC6_START 612 */ ++ {OP_WR, XCM_REG_GLB_DEL_ACK_TMR_VAL_0, 0xc8}, ++ {OP_WR, XCM_REG_GLB_DEL_ACK_MAX_CNT_0, 0x2}, ++ {OP_WR, XCM_REG_WU_DA_SET_TMR_CNT_FLG_CMD00, 0x0}, ++ {OP_WR, XCM_REG_WU_DA_SET_TMR_CNT_FLG_CMD10, 0x0}, ++ {OP_WR, XCM_REG_WU_DA_CNT_CMD00, 0x2}, ++ {OP_WR, XCM_REG_WU_DA_CNT_CMD10, 0x2}, ++ {OP_WR, XCM_REG_WU_DA_CNT_UPD_VAL00, 0xff}, ++ {OP_WR, XCM_REG_WU_DA_CNT_UPD_VAL10, 0xff}, ++ {OP_WR, XCM_REG_PHYS_QNUM3_0, 0x0}, ++/* #define XCM_FUNC6_END 613 */ ++/* #define XCM_FUNC7_START 614 */ ++ {OP_WR, XCM_REG_GLB_DEL_ACK_TMR_VAL_1, 0xc8}, ++ {OP_WR, XCM_REG_GLB_DEL_ACK_MAX_CNT_1, 0x2}, ++ {OP_WR, XCM_REG_WU_DA_SET_TMR_CNT_FLG_CMD01, 0x0}, ++ {OP_WR, XCM_REG_WU_DA_SET_TMR_CNT_FLG_CMD11, 0x0}, ++ {OP_WR, XCM_REG_WU_DA_CNT_CMD01, 0x2}, ++ {OP_WR, XCM_REG_WU_DA_CNT_CMD11, 0x2}, ++ {OP_WR, XCM_REG_WU_DA_CNT_UPD_VAL01, 0xff}, ++ {OP_WR, XCM_REG_WU_DA_CNT_UPD_VAL11, 0xff}, ++ {OP_WR, XCM_REG_PHYS_QNUM3_1, 0x0}, ++/* #define XCM_FUNC7_END 615 */ ++/* #define XSEM_COMMON_START 616 */ ++ {OP_ZP, XSEM_REG_INT_TABLE, 0xbf0000}, ++ {OP_WR_64, XSEM_REG_INT_TABLE + 0x3a8, 0xb034a}, ++ {OP_ZP, XSEM_REG_PRAM, 0x32fc0000}, ++ {OP_ZP, XSEM_REG_PRAM + 0x8000, 0x35750cc0}, ++ {OP_ZP, XSEM_REG_PRAM + 0x10000, 0x3adb1a1e}, ++ {OP_ZP, XSEM_REG_PRAM + 0x18000, 0x39c328d5}, ++ {OP_ZP, XSEM_REG_PRAM + 0x20000, 0x1c3d3746}, ++ {OP_WR_64, XSEM_REG_PRAM + 0x23710, 0x391e034c}, ++ {OP_RD, XSEM_REG_MSG_NUM_FIC0, 0x0}, ++ {OP_RD, XSEM_REG_MSG_NUM_FIC1, 0x0}, ++ {OP_RD, XSEM_REG_MSG_NUM_FOC0, 0x0}, ++ {OP_RD, XSEM_REG_MSG_NUM_FOC1, 0x0}, ++ {OP_RD, XSEM_REG_MSG_NUM_FOC2, 0x0}, ++ {OP_RD, XSEM_REG_MSG_NUM_FOC3, 0x0}, ++ {OP_WR, XSEM_REG_ARB_ELEMENT0, 0x1}, ++ {OP_WR, XSEM_REG_ARB_ELEMENT1, 0x2}, ++ {OP_WR, XSEM_REG_ARB_ELEMENT2, 0x3}, ++ {OP_WR, XSEM_REG_ARB_ELEMENT3, 0x0}, ++ {OP_WR, XSEM_REG_ARB_ELEMENT4, 0x4}, ++ {OP_WR, XSEM_REG_ARB_CYCLE_SIZE, 0x1}, ++ {OP_WR, XSEM_REG_TS_0_AS, 0x0}, ++ {OP_WR, XSEM_REG_TS_1_AS, 0x1}, ++ {OP_WR, XSEM_REG_TS_2_AS, 0x4}, ++ {OP_WR, XSEM_REG_TS_3_AS, 0x0}, ++ {OP_WR, XSEM_REG_TS_4_AS, 0x1}, ++ {OP_WR, XSEM_REG_TS_5_AS, 0x3}, ++ {OP_WR, XSEM_REG_TS_6_AS, 0x0}, ++ {OP_WR, XSEM_REG_TS_7_AS, 0x1}, ++ {OP_WR, XSEM_REG_TS_8_AS, 0x4}, ++ {OP_WR, XSEM_REG_TS_9_AS, 0x0}, ++ {OP_WR, XSEM_REG_TS_10_AS, 0x1}, ++ {OP_WR, XSEM_REG_TS_11_AS, 0x3}, ++ {OP_WR, XSEM_REG_TS_12_AS, 0x0}, ++ {OP_WR, XSEM_REG_TS_13_AS, 0x1}, ++ {OP_WR, XSEM_REG_TS_14_AS, 0x4}, ++ {OP_WR, XSEM_REG_TS_15_AS, 0x0}, ++ {OP_WR, XSEM_REG_TS_16_AS, 0x4}, ++ {OP_WR, XSEM_REG_TS_17_AS, 0x3}, ++ {OP_ZR, XSEM_REG_TS_18_AS, 0x2}, ++ {OP_WR, XSEM_REG_ENABLE_IN, 0x3fff}, ++ {OP_WR, XSEM_REG_ENABLE_OUT, 0x3ff}, ++ {OP_WR, XSEM_REG_FIC0_DISABLE, 0x0}, ++ {OP_WR, XSEM_REG_FIC1_DISABLE, 0x0}, ++ {OP_WR, XSEM_REG_PAS_DISABLE, 0x0}, ++ {OP_WR, XSEM_REG_THREADS_LIST, 0xffff}, ++ {OP_ZR, XSEM_REG_PASSIVE_BUFFER, 0x800}, ++ {OP_WR, XSEM_REG_FAST_MEMORY + 0x18bc0, 0x1}, ++ {OP_WR, XSEM_REG_FAST_MEMORY + 0x18000, 0x0}, ++ {OP_WR, XSEM_REG_FAST_MEMORY + 0x18040, 0x18}, ++ {OP_WR, XSEM_REG_FAST_MEMORY + 0x18080, 0xc}, ++ {OP_WR, XSEM_REG_FAST_MEMORY + 0x180c0, 0x66}, ++ {OP_WR_ASIC, XSEM_REG_FAST_MEMORY + 0x18300, 0x7a120}, ++ {OP_WR_EMUL, XSEM_REG_FAST_MEMORY + 0x18300, 0x138}, ++ {OP_WR_FPGA, XSEM_REG_FAST_MEMORY + 0x18300, 0x1388}, ++ {OP_WR, XSEM_REG_FAST_MEMORY + 0x183c0, 0x1f4}, ++ {OP_WR_ASIC, XSEM_REG_FAST_MEMORY + 0x18340, 0x1f4}, ++ {OP_WR_EMUL, XSEM_REG_FAST_MEMORY + 0x18340, 0x0}, ++ {OP_WR_FPGA, XSEM_REG_FAST_MEMORY + 0x18340, 0x5}, ++ {OP_WR_EMUL, XSEM_REG_FAST_MEMORY + 0x18380, 0x4c4b4}, ++ {OP_WR_ASIC, XSEM_REG_FAST_MEMORY + 0x18380, 0x1dcd6500}, ++ {OP_WR_EMUL, XSEM_REG_FAST_MEMORY + 0x11480, 0x0}, ++ {OP_WR_FPGA, XSEM_REG_FAST_MEMORY + 0x18380, 0x4c4b40}, ++ {OP_WR, XSEM_REG_FAST_MEMORY + 0x11480, 0x1}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x29c8, 0x4}, ++ {OP_SW, XSEM_REG_FAST_MEMORY + 0x29c8 + 0x10, 0x2034e}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x2080, 0x48}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x9020, 0xc8}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x9000, 0x2}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x21a8, 0x86}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x2000, 0x20}, ++ {OP_WR, XSEM_REG_FAST_MEMORY + 0x23c8, 0x0}, ++ {OP_SW, XSEM_REG_FAST_MEMORY + 0x23d0, 0x20350}, ++ {OP_SW, XSEM_REG_FAST_MEMORY + 0x2498, 0x40352}, ++ {OP_WR, XSEM_REG_FAST_MEMORY + 0x2c50, 0x0}, ++ {OP_WR, XSEM_REG_FAST_MEMORY + 0x2c10, 0x0}, ++ {OP_SW, XSEM_REG_FAST_MEMORY + 0x2c08, 0x20356}, ++ {OP_SW, XSEM_REG_FAST_MEMORY + 0x3000, 0x20358}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x3000 + 0x8, 0x100}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x4040, 0x10}, ++ {OP_SW, XSEM_REG_FAST_MEMORY + 0x4000, 0x10035a}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x6ac0, 0x2}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x6b00, 0x4}, ++ {OP_SW, XSEM_REG_FAST_MEMORY + 0x8408, 0x2036a}, ++ {OP_WR, XSEM_REG_FAST_MEMORY + 0x10800, 0x0}, ++ {OP_SW, XSEM_REG_FAST_MEMORY + 0x10c00, 0x10036c}, ++ {OP_WR, XSEM_REG_FAST_MEMORY + 0x10800, 0x1000000}, ++ {OP_SW, XSEM_REG_FAST_MEMORY + 0x10c40, 0x8037c}, ++ {OP_WR, XSEM_REG_FAST_MEMORY + 0x10800, 0x2000000}, ++ {OP_SW, XSEM_REG_FAST_MEMORY + 0x10c60, 0x80384}, ++/* #define XSEM_COMMON_END 617 */ ++/* #define XSEM_PORT0_START 618 */ ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0xc000, 0xd8}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x24a8, 0x14}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x2548, 0x24}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x2668, 0x24}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x2788, 0x24}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x28a8, 0x24}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0xa000, 0x28}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0xa140, 0xc}, ++ {OP_SW, XSEM_REG_FAST_MEMORY + 0x29e0, 0x2038c}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x5020, 0x2}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x5030, 0x2}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x5000, 0x2}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x5010, 0x2}, ++ {OP_WR, XSEM_REG_FAST_MEMORY + 0x5208, 0x1}, ++ {OP_SW, XSEM_REG_FAST_MEMORY + 0x6ac8, 0x2038e}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x6b10, 0x42}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x6d20, 0x4}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0xbcd0, 0x2}, ++/* #define XSEM_PORT0_END 619 */ ++/* #define XSEM_PORT1_START 620 */ ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0xc360, 0xd8}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x24f8, 0x14}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x25d8, 0x24}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x26f8, 0x24}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x2818, 0x24}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x2938, 0x24}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0xa0a0, 0x28}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0xa170, 0xc}, ++ {OP_SW, XSEM_REG_FAST_MEMORY + 0x29e8, 0x20390}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x5028, 0x2}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x5038, 0x2}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x5008, 0x2}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x5018, 0x2}, ++ {OP_WR, XSEM_REG_FAST_MEMORY + 0x520c, 0x1}, ++ {OP_SW, XSEM_REG_FAST_MEMORY + 0x6ad0, 0x20392}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x6c18, 0x42}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x6d30, 0x4}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0xbcd8, 0x2}, ++/* #define XSEM_PORT1_END 621 */ ++/* #define XSEM_FUNC0_START 622 */ ++ {OP_WR, XSEM_REG_FAST_MEMORY + 0xc6c0, 0x0}, ++ {OP_SW, XSEM_REG_FAST_MEMORY + 0x29f0, 0x100394}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x5048, 0xe}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0xb000, 0x6}, ++/* #define XSEM_FUNC0_END 623 */ ++/* #define XSEM_FUNC1_START 624 */ ++ {OP_WR, XSEM_REG_FAST_MEMORY + 0xc6c4, 0x0}, ++ {OP_SW, XSEM_REG_FAST_MEMORY + 0x2a30, 0x1003a4}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x5080, 0xe}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0xb018, 0x6}, ++/* #define XSEM_FUNC1_END 625 */ ++/* #define XSEM_FUNC2_START 626 */ ++ {OP_WR, XSEM_REG_FAST_MEMORY + 0xc6c8, 0x0}, ++ {OP_SW, XSEM_REG_FAST_MEMORY + 0x2a70, 0x1003b4}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x50b8, 0xe}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0xb030, 0x6}, ++/* #define XSEM_FUNC2_END 627 */ ++/* #define XSEM_FUNC3_START 628 */ ++ {OP_WR, XSEM_REG_FAST_MEMORY + 0xc6cc, 0x0}, ++ {OP_SW, XSEM_REG_FAST_MEMORY + 0x2ab0, 0x1003c4}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x50f0, 0xe}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0xb048, 0x6}, ++/* #define XSEM_FUNC3_END 629 */ ++/* #define XSEM_FUNC4_START 630 */ ++ {OP_WR, XSEM_REG_FAST_MEMORY + 0xc6d0, 0x0}, ++ {OP_SW, XSEM_REG_FAST_MEMORY + 0x2af0, 0x1003d4}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x5128, 0xe}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0xb060, 0x6}, ++/* #define XSEM_FUNC4_END 631 */ ++/* #define XSEM_FUNC5_START 632 */ ++ {OP_WR, XSEM_REG_FAST_MEMORY + 0xc6d4, 0x0}, ++ {OP_SW, XSEM_REG_FAST_MEMORY + 0x2b30, 0x1003e4}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x5160, 0xe}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0xb078, 0x6}, ++/* #define XSEM_FUNC5_END 633 */ ++/* #define XSEM_FUNC6_START 634 */ ++ {OP_WR, XSEM_REG_FAST_MEMORY + 0xc6d8, 0x0}, ++ {OP_SW, XSEM_REG_FAST_MEMORY + 0x2b70, 0x1003f4}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x5198, 0xe}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0xb090, 0x6}, ++/* #define XSEM_FUNC6_END 635 */ ++/* #define XSEM_FUNC7_START 636 */ ++ {OP_WR, XSEM_REG_FAST_MEMORY + 0xc6dc, 0x0}, ++ {OP_SW, XSEM_REG_FAST_MEMORY + 0x2bb0, 0x100404}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0x51d0, 0xe}, ++ {OP_ZR, XSEM_REG_FAST_MEMORY + 0xb0a8, 0x6}, ++/* #define XSEM_FUNC7_END 637 */ ++/* #define CDU_COMMON_START 638 */ ++ {OP_WR, CDU_REG_CDU_CONTROL0, 0x1}, ++ {OP_WR, CDU_REG_MF_MODE, 0x1}, ++ {OP_WR, CDU_REG_CDU_CHK_MASK0, 0x3d000}, ++ {OP_WR, CDU_REG_CDU_CHK_MASK1, 0x3d}, ++ {OP_WB, CDU_REG_L1TT, 0x2000414}, ++ {OP_WB, CDU_REG_MATT, 0x280614}, ++ {OP_ZR, CDU_REG_MATT + 0xa0, 0x18}, ++/* #define CDU_COMMON_END 639 */ ++/* #define DMAE_COMMON_START 660 */ ++ {OP_ZR, DMAE_REG_CMD_MEM, 0xe0}, ++ {OP_WR, DMAE_REG_CRC16C_INIT, 0x0}, ++ {OP_WR, DMAE_REG_CRC16T10_INIT, 0x1}, ++ {OP_WR, DMAE_REG_PXP_REQ_INIT_CRD, 0x2}, ++ {OP_WR, DMAE_REG_PCI_IFEN, 0x1}, ++ {OP_WR, DMAE_REG_GRC_IFEN, 0x1}, ++/* #define DMAE_COMMON_END 661 */ ++/* #define PXP_COMMON_START 682 */ ++ {OP_WB, PXP_REG_HST_INBOUND_INT + 0x400, 0x5063c}, ++ {OP_WB, PXP_REG_HST_INBOUND_INT, 0x50641}, ++ {OP_WB, PXP_REG_HST_INBOUND_INT + 0x20, 0x50646}, ++/* #define PXP_COMMON_END 683 */ ++/* #define CFC_COMMON_START 704 */ ++ {OP_ZR, CFC_REG_LINK_LIST, 0x100}, ++ {OP_WR, CFC_REG_CONTROL0, 0x10}, ++ {OP_WR, CFC_REG_DISABLE_ON_ERROR, 0x3fff}, ++ {OP_WR, CFC_REG_INTERFACES, 0x280000}, ++ {OP_WR, CFC_REG_LCREQ_WEIGHTS, 0x84924a}, ++ {OP_WR, CFC_REG_INTERFACES, 0x0}, ++/* #define CFC_COMMON_END 705 */ ++/* #define HC_FUNC0_START 732 */ ++ {OP_WR, HC_REG_CONFIG_0, 0x1080}, ++ {OP_WR, HC_REG_FUNC_NUM_P0, 0x0}, ++ {OP_WR, HC_REG_ATTN_NUM_P0, 0x10}, ++ {OP_WR, HC_REG_ATTN_IDX, 0x0}, ++ {OP_ZR, HC_REG_ATTN_BIT, 0x2}, ++ {OP_WR, HC_REG_VQID_0, 0x2b5}, ++ {OP_WR, HC_REG_PCI_CONFIG_0, 0x0}, ++ {OP_ZR, HC_REG_P0_PROD_CONS, 0x4a}, ++ {OP_WR, HC_REG_INT_MASK, 0x1ffff}, ++ {OP_ZR, HC_REG_PBA_COMMAND, 0x2}, ++ {OP_WR, HC_REG_CONFIG_0, 0x1a80}, ++ {OP_ZR, HC_REG_STATISTIC_COUNTERS, 0x24}, ++ {OP_ZR, HC_REG_STATISTIC_COUNTERS + 0x120, 0x4a}, ++ {OP_ZR, HC_REG_STATISTIC_COUNTERS + 0x370, 0x4a}, ++ {OP_ZR, HC_REG_STATISTIC_COUNTERS + 0x5c0, 0x4a}, ++/* #define HC_FUNC0_END 733 */ ++/* #define HC_FUNC1_START 734 */ ++ {OP_WR, HC_REG_CONFIG_1, 0x1080}, ++ {OP_WR, HC_REG_FUNC_NUM_P1, 0x1}, ++ {OP_WR, HC_REG_ATTN_NUM_P1, 0x10}, ++ {OP_WR, HC_REG_ATTN_IDX + 0x4, 0x0}, ++ {OP_ZR, HC_REG_ATTN_BIT + 0x8, 0x2}, ++ {OP_WR, HC_REG_VQID_1, 0x2b5}, ++ {OP_WR, HC_REG_PCI_CONFIG_1, 0x0}, ++ {OP_ZR, HC_REG_P1_PROD_CONS, 0x4a}, ++ {OP_WR, HC_REG_INT_MASK + 0x4, 0x1ffff}, ++ {OP_ZR, HC_REG_PBA_COMMAND + 0x8, 0x2}, ++ {OP_WR, HC_REG_CONFIG_1, 0x1a80}, ++ {OP_ZR, HC_REG_STATISTIC_COUNTERS + 0x90, 0x24}, ++ {OP_ZR, HC_REG_STATISTIC_COUNTERS + 0x248, 0x4a}, ++ {OP_ZR, HC_REG_STATISTIC_COUNTERS + 0x498, 0x4a}, ++ {OP_ZR, HC_REG_STATISTIC_COUNTERS + 0x6e8, 0x4a}, ++/* #define HC_FUNC1_END 735 */ ++/* #define HC_FUNC2_START 736 */ ++ {OP_WR, HC_REG_CONFIG_0, 0x1080}, ++ {OP_WR, HC_REG_FUNC_NUM_P0, 0x2}, ++ {OP_WR, HC_REG_ATTN_NUM_P0, 0x10}, ++ {OP_WR, HC_REG_ATTN_IDX, 0x0}, ++ {OP_ZR, HC_REG_ATTN_BIT, 0x2}, ++ {OP_WR, HC_REG_VQID_0, 0x2b5}, ++ {OP_WR, HC_REG_PCI_CONFIG_0, 0x0}, ++ {OP_ZR, HC_REG_P0_PROD_CONS, 0x4a}, ++ {OP_WR, HC_REG_INT_MASK, 0x1ffff}, ++ {OP_ZR, HC_REG_PBA_COMMAND, 0x2}, ++ {OP_WR, HC_REG_CONFIG_0, 0x1a80}, ++ {OP_ZR, HC_REG_STATISTIC_COUNTERS, 0x24}, ++ {OP_ZR, HC_REG_STATISTIC_COUNTERS + 0x120, 0x4a}, ++ {OP_ZR, HC_REG_STATISTIC_COUNTERS + 0x370, 0x4a}, ++ {OP_ZR, HC_REG_STATISTIC_COUNTERS + 0x5c0, 0x4a}, ++/* #define HC_FUNC2_END 737 */ ++/* #define HC_FUNC3_START 738 */ ++ {OP_WR, HC_REG_CONFIG_1, 0x1080}, ++ {OP_WR, HC_REG_FUNC_NUM_P1, 0x3}, ++ {OP_WR, HC_REG_ATTN_NUM_P1, 0x10}, ++ {OP_WR, HC_REG_ATTN_IDX + 0x4, 0x0}, ++ {OP_ZR, HC_REG_ATTN_BIT + 0x8, 0x2}, ++ {OP_WR, HC_REG_VQID_1, 0x2b5}, ++ {OP_WR, HC_REG_PCI_CONFIG_1, 0x0}, ++ {OP_ZR, HC_REG_P1_PROD_CONS, 0x4a}, ++ {OP_WR, HC_REG_INT_MASK + 0x4, 0x1ffff}, ++ {OP_ZR, HC_REG_PBA_COMMAND + 0x8, 0x2}, ++ {OP_WR, HC_REG_CONFIG_1, 0x1a80}, ++ {OP_ZR, HC_REG_STATISTIC_COUNTERS + 0x90, 0x24}, ++ {OP_ZR, HC_REG_STATISTIC_COUNTERS + 0x248, 0x4a}, ++ {OP_ZR, HC_REG_STATISTIC_COUNTERS + 0x498, 0x4a}, ++ {OP_ZR, HC_REG_STATISTIC_COUNTERS + 0x6e8, 0x4a}, ++/* #define HC_FUNC3_END 739 */ ++/* #define HC_FUNC4_START 740 */ ++ {OP_WR, HC_REG_CONFIG_0, 0x1080}, ++ {OP_WR, HC_REG_FUNC_NUM_P0, 0x4}, ++ {OP_WR, HC_REG_ATTN_NUM_P0, 0x10}, ++ {OP_WR, HC_REG_ATTN_IDX, 0x0}, ++ {OP_ZR, HC_REG_ATTN_BIT, 0x2}, ++ {OP_WR, HC_REG_VQID_0, 0x2b5}, ++ {OP_WR, HC_REG_PCI_CONFIG_0, 0x0}, ++ {OP_ZR, HC_REG_P0_PROD_CONS, 0x4a}, ++ {OP_WR, HC_REG_INT_MASK, 0x1ffff}, ++ {OP_ZR, HC_REG_PBA_COMMAND, 0x2}, ++ {OP_WR, HC_REG_CONFIG_0, 0x1a80}, ++ {OP_ZR, HC_REG_STATISTIC_COUNTERS, 0x24}, ++ {OP_ZR, HC_REG_STATISTIC_COUNTERS + 0x120, 0x4a}, ++ {OP_ZR, HC_REG_STATISTIC_COUNTERS + 0x370, 0x4a}, ++ {OP_ZR, HC_REG_STATISTIC_COUNTERS + 0x5c0, 0x4a}, ++/* #define HC_FUNC4_END 741 */ ++/* #define HC_FUNC5_START 742 */ ++ {OP_WR, HC_REG_CONFIG_1, 0x1080}, ++ {OP_WR, HC_REG_FUNC_NUM_P1, 0x5}, ++ {OP_WR, HC_REG_ATTN_NUM_P1, 0x10}, ++ {OP_WR, HC_REG_ATTN_IDX + 0x4, 0x0}, ++ {OP_ZR, HC_REG_ATTN_BIT + 0x8, 0x2}, ++ {OP_WR, HC_REG_VQID_1, 0x2b5}, ++ {OP_WR, HC_REG_PCI_CONFIG_1, 0x0}, ++ {OP_ZR, HC_REG_P1_PROD_CONS, 0x4a}, ++ {OP_WR, HC_REG_INT_MASK + 0x4, 0x1ffff}, ++ {OP_ZR, HC_REG_PBA_COMMAND + 0x8, 0x2}, ++ {OP_WR, HC_REG_CONFIG_1, 0x1a80}, ++ {OP_ZR, HC_REG_STATISTIC_COUNTERS + 0x90, 0x24}, ++ {OP_ZR, HC_REG_STATISTIC_COUNTERS + 0x248, 0x4a}, ++ {OP_ZR, HC_REG_STATISTIC_COUNTERS + 0x498, 0x4a}, ++ {OP_ZR, HC_REG_STATISTIC_COUNTERS + 0x6e8, 0x4a}, ++/* #define HC_FUNC5_END 743 */ ++/* #define HC_FUNC6_START 744 */ ++ {OP_WR, HC_REG_CONFIG_0, 0x1080}, ++ {OP_WR, HC_REG_FUNC_NUM_P0, 0x6}, ++ {OP_WR, HC_REG_ATTN_NUM_P0, 0x10}, ++ {OP_WR, HC_REG_ATTN_IDX, 0x0}, ++ {OP_ZR, HC_REG_ATTN_BIT, 0x2}, ++ {OP_WR, HC_REG_VQID_0, 0x2b5}, ++ {OP_WR, HC_REG_PCI_CONFIG_0, 0x0}, ++ {OP_ZR, HC_REG_P0_PROD_CONS, 0x4a}, ++ {OP_WR, HC_REG_INT_MASK, 0x1ffff}, ++ {OP_ZR, HC_REG_PBA_COMMAND, 0x2}, ++ {OP_WR, HC_REG_CONFIG_0, 0x1a80}, ++ {OP_ZR, HC_REG_STATISTIC_COUNTERS, 0x24}, ++ {OP_ZR, HC_REG_STATISTIC_COUNTERS + 0x120, 0x4a}, ++ {OP_ZR, HC_REG_STATISTIC_COUNTERS + 0x370, 0x4a}, ++ {OP_ZR, HC_REG_STATISTIC_COUNTERS + 0x5c0, 0x4a}, ++/* #define HC_FUNC6_END 745 */ ++/* #define HC_FUNC7_START 746 */ ++ {OP_WR, HC_REG_CONFIG_1, 0x1080}, ++ {OP_WR, HC_REG_FUNC_NUM_P1, 0x7}, ++ {OP_WR, HC_REG_ATTN_NUM_P1, 0x10}, ++ {OP_WR, HC_REG_ATTN_IDX + 0x4, 0x0}, ++ {OP_ZR, HC_REG_ATTN_BIT + 0x8, 0x2}, ++ {OP_WR, HC_REG_VQID_1, 0x2b5}, ++ {OP_WR, HC_REG_PCI_CONFIG_1, 0x0}, ++ {OP_ZR, HC_REG_P1_PROD_CONS, 0x4a}, ++ {OP_WR, HC_REG_INT_MASK + 0x4, 0x1ffff}, ++ {OP_ZR, HC_REG_PBA_COMMAND + 0x8, 0x2}, ++ {OP_WR, HC_REG_CONFIG_1, 0x1a80}, ++ {OP_ZR, HC_REG_STATISTIC_COUNTERS + 0x90, 0x24}, ++ {OP_ZR, HC_REG_STATISTIC_COUNTERS + 0x248, 0x4a}, ++ {OP_ZR, HC_REG_STATISTIC_COUNTERS + 0x498, 0x4a}, ++ {OP_ZR, HC_REG_STATISTIC_COUNTERS + 0x6e8, 0x4a}, ++/* #define HC_FUNC7_END 747 */ ++/* #define PXP2_COMMON_START 748 */ ++ {OP_WR, PXP2_REG_RQ_DRAM_ALIGN, 0x1}, ++ {OP_WR, PXP2_REG_PGL_CONTROL0, 0xe38340}, ++ {OP_WR, PXP2_REG_PGL_CONTROL1, 0x3c10}, ++ {OP_WR, PXP2_REG_RQ_ELT_DISABLE, 0x1}, ++ {OP_WR, PXP2_REG_WR_REV_MODE, 0x0}, ++ {OP_WR, PXP2_REG_PGL_INT_TSDM_0, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_TSDM_1, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_TSDM_2, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_TSDM_3, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_TSDM_4, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_TSDM_5, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_TSDM_6, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_TSDM_7, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_USDM_2, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_USDM_3, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_USDM_4, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_USDM_5, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_USDM_6, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_USDM_7, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_XSDM_1, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_XSDM_2, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_XSDM_3, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_XSDM_4, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_XSDM_5, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_XSDM_6, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_XSDM_7, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_CSDM_0, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_CSDM_1, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_CSDM_2, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_CSDM_3, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_CSDM_4, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_CSDM_5, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_CSDM_6, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_CSDM_7, 0xffffffff}, ++ {OP_WR, PXP2_REG_PGL_INT_XSDM_0, 0xff802000}, ++ {OP_WR, PXP2_REG_PGL_INT_USDM_0, 0xf0005000}, ++ {OP_WR, PXP2_REG_PGL_INT_USDM_1, 0xf0001000}, ++ {OP_WR, PXP2_REG_RD_MAX_BLKS_VQ6, 0x8}, ++ {OP_WR, PXP2_REG_RD_MAX_BLKS_VQ9, 0x8}, ++ {OP_WR, PXP2_REG_RD_MAX_BLKS_VQ10, 0x8}, ++ {OP_WR, PXP2_REG_RD_MAX_BLKS_VQ11, 0x2}, ++ {OP_WR, PXP2_REG_RD_MAX_BLKS_VQ17, 0x4}, ++ {OP_WR, PXP2_REG_RD_MAX_BLKS_VQ18, 0x5}, ++ {OP_WR, PXP2_REG_RD_MAX_BLKS_VQ19, 0x4}, ++ {OP_WR, PXP2_REG_RD_MAX_BLKS_VQ22, 0x0}, ++ {OP_WR, PXP2_REG_RD_START_INIT, 0x1}, ++ {OP_WR, PXP2_REG_WR_DMAE_TH, 0x3f}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_ADD0, 0x40}, ++ {OP_WR, PXP2_REG_PSWRQ_BW_ADD1, 0x1808}, ++ {OP_WR, PXP2_REG_PSWRQ_BW_ADD2, 0x803}, ++ {OP_WR, PXP2_REG_PSWRQ_BW_ADD3, 0x803}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_ADD4, 0x40}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_ADD5, 0x3}, ++ {OP_WR, PXP2_REG_PSWRQ_BW_ADD6, 0x803}, ++ {OP_WR, PXP2_REG_PSWRQ_BW_ADD7, 0x803}, ++ {OP_WR, PXP2_REG_PSWRQ_BW_ADD8, 0x803}, ++ {OP_WR, PXP2_REG_PSWRQ_BW_ADD9, 0x10003}, ++ {OP_WR, PXP2_REG_PSWRQ_BW_ADD10, 0x803}, ++ {OP_WR, PXP2_REG_PSWRQ_BW_ADD11, 0x803}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_ADD12, 0x3}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_ADD13, 0x3}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_ADD14, 0x3}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_ADD15, 0x3}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_ADD16, 0x3}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_ADD17, 0x3}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_ADD18, 0x3}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_ADD19, 0x3}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_ADD20, 0x3}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_ADD22, 0x3}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_ADD23, 0x3}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_ADD24, 0x3}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_ADD25, 0x3}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_ADD26, 0x3}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_ADD27, 0x3}, ++ {OP_WR, PXP2_REG_PSWRQ_BW_ADD28, 0x2403}, ++ {OP_WR, PXP2_REG_RQ_BW_WR_ADD29, 0x2f}, ++ {OP_WR, PXP2_REG_RQ_BW_WR_ADD30, 0x9}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_UBOUND0, 0x19}, ++ {OP_WR, PXP2_REG_PSWRQ_BW_UB1, 0x184}, ++ {OP_WR, PXP2_REG_PSWRQ_BW_UB2, 0x183}, ++ {OP_WR, PXP2_REG_PSWRQ_BW_UB3, 0x306}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_UBOUND4, 0x19}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_UBOUND5, 0x6}, ++ {OP_WR, PXP2_REG_PSWRQ_BW_UB6, 0x306}, ++ {OP_WR, PXP2_REG_PSWRQ_BW_UB7, 0x306}, ++ {OP_WR, PXP2_REG_PSWRQ_BW_UB8, 0x306}, ++ {OP_WR, PXP2_REG_PSWRQ_BW_UB9, 0xc86}, ++ {OP_WR, PXP2_REG_PSWRQ_BW_UB10, 0x306}, ++ {OP_WR, PXP2_REG_PSWRQ_BW_UB11, 0x306}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_UBOUND12, 0x6}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_UBOUND13, 0x6}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_UBOUND14, 0x6}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_UBOUND15, 0x6}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_UBOUND16, 0x6}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_UBOUND17, 0x6}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_UBOUND18, 0x6}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_UBOUND19, 0x6}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_UBOUND20, 0x6}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_UBOUND22, 0x6}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_UBOUND23, 0x6}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_UBOUND24, 0x6}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_UBOUND25, 0x6}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_UBOUND26, 0x6}, ++ {OP_WR, PXP2_REG_RQ_BW_RD_UBOUND27, 0x6}, ++ {OP_WR, PXP2_REG_PSWRQ_BW_UB28, 0x306}, ++ {OP_WR, PXP2_REG_RQ_BW_WR_UBOUND29, 0x13}, ++ {OP_WR, PXP2_REG_RQ_BW_WR_UBOUND30, 0x6}, ++ {OP_WR, PXP2_REG_PSWRQ_BW_L1, 0x1004}, ++ {OP_WR, PXP2_REG_PSWRQ_BW_L2, 0x1004}, ++ {OP_WR, PXP2_REG_PSWRQ_BW_RD, 0x106440}, ++ {OP_WR, PXP2_REG_PSWRQ_BW_WR, 0x106440}, ++ {OP_WR, PXP2_REG_RQ_ILT_MODE, 0x1}, ++ {OP_WR, PXP2_REG_RQ_RBC_DONE, 0x1}, ++/* #define PXP2_COMMON_END 749 */ ++/* #define MISC_AEU_COMMON_START 770 */ ++ {OP_ZR, MISC_REG_AEU_GENERAL_ATTN_0, 0x16}, ++ {OP_WR, MISC_REG_AEU_ENABLE1_NIG_0, 0x55540000}, ++ {OP_WR, MISC_REG_AEU_ENABLE2_NIG_0, 0x55555555}, ++ {OP_WR, MISC_REG_AEU_ENABLE3_NIG_0, 0x5555}, ++ {OP_WR, MISC_REG_AEU_ENABLE4_NIG_0, 0xf0000000}, ++ {OP_WR, MISC_REG_AEU_ENABLE1_PXP_0, 0x55540000}, ++ {OP_WR, MISC_REG_AEU_ENABLE2_PXP_0, 0x55555555}, ++ {OP_WR, MISC_REG_AEU_ENABLE3_PXP_0, 0x5555}, ++ {OP_WR, MISC_REG_AEU_ENABLE4_PXP_0, 0xf0000000}, ++ {OP_WR, MISC_REG_AEU_ENABLE1_NIG_1, 0x55540000}, ++ {OP_WR, MISC_REG_AEU_ENABLE2_NIG_1, 0x55555555}, ++ {OP_WR, MISC_REG_AEU_ENABLE3_NIG_1, 0x5555}, ++ {OP_WR, MISC_REG_AEU_ENABLE4_NIG_1, 0xf0000000}, ++ {OP_WR, MISC_REG_AEU_ENABLE1_PXP_1, 0x0}, ++ {OP_WR, MISC_REG_AEU_ENABLE2_PXP_1, 0x10000}, ++ {OP_WR, MISC_REG_AEU_ENABLE3_PXP_1, 0x5014}, ++ {OP_WR, MISC_REG_AEU_ENABLE4_PXP_1, 0x0}, ++ {OP_WR, MISC_REG_AEU_CLR_LATCH_SIGNAL, 0xc00}, ++ {OP_WR, MISC_REG_AEU_GENERAL_MASK, 0x3}, ++/* #define MISC_AEU_COMMON_END 771 */ ++/* #define MISC_AEU_PORT0_START 772 */ ++ {OP_WR, MISC_REG_AEU_ENABLE1_FUNC_0_OUT_0, 0xff5c0000}, ++ {OP_WR, MISC_REG_AEU_ENABLE2_FUNC_0_OUT_0, 0xfff55fff}, ++ {OP_WR, MISC_REG_AEU_ENABLE3_FUNC_0_OUT_0, 0xffff}, ++ {OP_WR, MISC_REG_AEU_ENABLE4_FUNC_0_OUT_0, 0xf00003e0}, ++ {OP_WR, MISC_REG_AEU_ENABLE1_FUNC_0_OUT_1, 0x0}, ++ {OP_WR, MISC_REG_AEU_ENABLE2_FUNC_0_OUT_1, 0xa000}, ++ {OP_ZR, MISC_REG_AEU_ENABLE3_FUNC_0_OUT_1, 0x5}, ++ {OP_WR, MISC_REG_AEU_ENABLE4_FUNC_0_OUT_2, 0xfe00000}, ++ {OP_ZR, MISC_REG_AEU_ENABLE1_FUNC_0_OUT_3, 0x7}, ++ {OP_WR, MISC_REG_AEU_ENABLE4_FUNC_0_OUT_4, 0x400}, ++ {OP_ZR, MISC_REG_AEU_ENABLE1_FUNC_0_OUT_5, 0x3}, ++ {OP_WR, MISC_REG_AEU_ENABLE4_FUNC_0_OUT_5, 0x1000}, ++ {OP_ZR, MISC_REG_AEU_ENABLE1_FUNC_0_OUT_6, 0x3}, ++ {OP_WR, MISC_REG_AEU_ENABLE4_FUNC_0_OUT_6, 0x4000}, ++ {OP_ZR, MISC_REG_AEU_ENABLE1_FUNC_0_OUT_7, 0x3}, ++ {OP_WR, MISC_REG_AEU_ENABLE4_FUNC_0_OUT_7, 0x10000}, ++ {OP_ZR, MISC_REG_AEU_INVERTER_1_FUNC_0, 0x4}, ++/* #define MISC_AEU_PORT0_END 773 */ ++/* #define MISC_AEU_PORT1_START 774 */ ++ {OP_WR, MISC_REG_AEU_ENABLE1_FUNC_1_OUT_0, 0xff5c0000}, ++ {OP_WR, MISC_REG_AEU_ENABLE2_FUNC_1_OUT_0, 0xfff55fff}, ++ {OP_WR, MISC_REG_AEU_ENABLE3_FUNC_1_OUT_0, 0xffff}, ++ {OP_WR, MISC_REG_AEU_ENABLE4_FUNC_1_OUT_0, 0xf00003e0}, ++ {OP_WR, MISC_REG_AEU_ENABLE1_FUNC_1_OUT_1, 0x0}, ++ {OP_WR, MISC_REG_AEU_ENABLE2_FUNC_1_OUT_1, 0xa000}, ++ {OP_ZR, MISC_REG_AEU_ENABLE3_FUNC_1_OUT_1, 0x5}, ++ {OP_WR, MISC_REG_AEU_ENABLE4_FUNC_1_OUT_2, 0xfe00000}, ++ {OP_ZR, MISC_REG_AEU_ENABLE1_FUNC_1_OUT_3, 0x7}, ++ {OP_WR, MISC_REG_AEU_ENABLE4_FUNC_1_OUT_4, 0x800}, ++ {OP_ZR, MISC_REG_AEU_ENABLE1_FUNC_1_OUT_5, 0x3}, ++ {OP_WR, MISC_REG_AEU_ENABLE4_FUNC_1_OUT_5, 0x2000}, ++ {OP_ZR, MISC_REG_AEU_ENABLE1_FUNC_1_OUT_6, 0x3}, ++ {OP_WR, MISC_REG_AEU_ENABLE4_FUNC_1_OUT_6, 0x8000}, ++ {OP_ZR, MISC_REG_AEU_ENABLE1_FUNC_1_OUT_7, 0x3}, ++ {OP_WR, MISC_REG_AEU_ENABLE4_FUNC_1_OUT_7, 0x20000}, ++ {OP_ZR, MISC_REG_AEU_INVERTER_1_FUNC_1, 0x4}, ++/* #define MISC_AEU_PORT1_END 775 */ ++ ++}; ++ ++static const u16 init_ops_offsets_e1h[] = { ++ 0x0000, 0x0031, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0031, 0x0032, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0032, ++ 0x0056, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0056, 0x008c, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x008c, 0x0090, 0x0090, 0x0094, 0x0094, 0x0098, 0x0098, 0x009c, 0x009c, ++ 0x00a0, 0x00a0, 0x00a4, 0x00a4, 0x00a8, 0x00a8, 0x00ac, 0x00ac, 0x00b1, ++ 0x00b1, 0x00b3, 0x00b3, 0x00b5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x00b5, 0x0102, 0x0102, 0x010a, 0x010a, 0x0112, 0x0112, ++ 0x011b, 0x011b, 0x0124, 0x0124, 0x012d, 0x012d, 0x0136, 0x0136, 0x013f, ++ 0x013f, 0x0148, 0x0148, 0x0151, 0x0151, 0x015a, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x015a, 0x015f, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x015f, 0x0160, 0x0160, 0x0161, 0x0161, 0x0162, 0x0162, 0x0163, ++ 0x0163, 0x0164, 0x0164, 0x0165, 0x0165, 0x0166, 0x0166, 0x0167, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0167, 0x016c, 0x016c, 0x0179, 0x0179, 0x0186, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0186, 0x0187, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0187, 0x01be, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x01be, 0x01e9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x01e9, 0x021a, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x021a, 0x0221, 0x0221, 0x0228, 0x0228, 0x022f, 0x022f, ++ 0x0236, 0x0236, 0x023d, 0x023d, 0x0244, 0x0244, 0x024b, 0x024b, 0x0252, ++ 0x0252, 0x028a, 0x0000, 0x0000, 0x0000, 0x0000, 0x028a, 0x028e, 0x028e, ++ 0x0292, 0x0292, 0x0296, 0x0296, 0x029a, 0x029a, 0x029e, 0x029e, 0x02a2, ++ 0x02a2, 0x02a6, 0x02a6, 0x02aa, 0x02aa, 0x02fc, 0x02fc, 0x0313, 0x0313, ++ 0x032a, 0x032a, 0x032d, 0x032d, 0x0330, 0x0330, 0x0333, 0x0333, 0x0336, ++ 0x0336, 0x0339, 0x0339, 0x033c, 0x033c, 0x033f, 0x033f, 0x0342, 0x0342, ++ 0x0383, 0x0383, 0x038a, 0x038a, 0x0391, 0x0391, 0x0395, 0x0395, 0x0399, ++ 0x0399, 0x039d, 0x039d, 0x03a1, 0x03a1, 0x03a5, 0x03a5, 0x03a9, 0x03a9, ++ 0x03ad, 0x03ad, 0x03b1, 0x03b1, 0x03b2, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03b2, 0x03c4, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x03c4, 0x03d9, 0x03d9, 0x03dc, 0x03dc, 0x03df, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03df, 0x040c, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x040c, 0x050f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x050f, 0x0516, 0x0516, 0x051a, ++ 0x051a, 0x051e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x051e, 0x055e, 0x0000, 0x0000, 0x0000, 0x0000, 0x055e, 0x0567, 0x0567, ++ 0x0570, 0x0570, 0x0579, 0x0579, 0x0582, 0x0582, 0x058b, 0x058b, 0x0594, ++ 0x0594, 0x059d, 0x059d, 0x05a6, 0x05a6, 0x05ff, 0x05ff, 0x0611, 0x0611, ++ 0x0623, 0x0623, 0x0627, 0x0627, 0x062b, 0x062b, 0x062f, 0x062f, 0x0633, ++ 0x0633, 0x0637, 0x0637, 0x063b, 0x063b, 0x063f, 0x063f, 0x0643, 0x0643, ++ 0x064a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x064a, 0x0650, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0650, 0x0653, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0653, 0x0659, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0659, 0x0668, 0x0668, 0x0677, 0x0677, 0x0686, ++ 0x0686, 0x0695, 0x0695, 0x06a4, 0x06a4, 0x06b3, 0x06b3, 0x06c2, 0x06c2, ++ 0x06d1, 0x06d1, 0x0742, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0742, 0x0755, 0x0755, 0x0766, ++ 0x0766, 0x0777, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 ++}; ++ ++static const u32 init_data_e1h[] = { ++ 0x00010000, 0x000204c0, 0x00030980, 0x00040e40, 0x00051300, 0x000617c0, ++ 0x00071c80, 0x00082140, 0x00092600, 0x000a2ac0, 0x000b2f80, 0x000c3440, ++ 0x000d3900, 0x000e3dc0, 0x000f4280, 0x00104740, 0x00114c00, 0x001250c0, ++ 0x00135580, 0x00145a40, 0x00155f00, 0x001663c0, 0x00176880, 0x00186d40, ++ 0x00197200, 0x001a76c0, 0x001b7b80, 0x001c8040, 0x001d8500, 0x001e89c0, ++ 0x001f8e80, 0x00209340, 0x00002000, 0x00004000, 0x00006000, 0x00008000, ++ 0x0000a000, 0x0000c000, 0x0000e000, 0x00010000, 0x00012000, 0x00014000, ++ 0x00016000, 0x00018000, 0x0001a000, 0x0001c000, 0x0001e000, 0x00020000, ++ 0x00022000, 0x00024000, 0x00026000, 0x00028000, 0x0002a000, 0x0002c000, ++ 0x0002e000, 0x00030000, 0x00032000, 0x00034000, 0x00036000, 0x00038000, ++ 0x0003a000, 0x0003c000, 0x0003e000, 0x00040000, 0x00042000, 0x00044000, ++ 0x00046000, 0x00048000, 0x0004a000, 0x0004c000, 0x0004e000, 0x00050000, ++ 0x00052000, 0x00054000, 0x00056000, 0x00058000, 0x0005a000, 0x0005c000, ++ 0x0005e000, 0x00060000, 0x00062000, 0x00064000, 0x00066000, 0x00068000, ++ 0x0006a000, 0x0006c000, 0x0006e000, 0x00070000, 0x00072000, 0x00074000, ++ 0x00076000, 0x00078000, 0x0007a000, 0x0007c000, 0x0007e000, 0x00080000, ++ 0x00082000, 0x00084000, 0x00086000, 0x00088000, 0x0008a000, 0x0008c000, ++ 0x0008e000, 0x00090000, 0x00092000, 0x00094000, 0x00096000, 0x00098000, ++ 0x0009a000, 0x0009c000, 0x0009e000, 0x000a0000, 0x000a2000, 0x000a4000, ++ 0x000a6000, 0x000a8000, 0x000aa000, 0x000ac000, 0x000ae000, 0x000b0000, ++ 0x000b2000, 0x000b4000, 0x000b6000, 0x000b8000, 0x000ba000, 0x000bc000, ++ 0x000be000, 0x000c0000, 0x000c2000, 0x000c4000, 0x000c6000, 0x000c8000, ++ 0x000ca000, 0x000cc000, 0x000ce000, 0x000d0000, 0x000d2000, 0x000d4000, ++ 0x000d6000, 0x000d8000, 0x000da000, 0x000dc000, 0x000de000, 0x000e0000, ++ 0x000e2000, 0x000e4000, 0x000e6000, 0x000e8000, 0x000ea000, 0x000ec000, ++ 0x000ee000, 0x000f0000, 0x000f2000, 0x000f4000, 0x000f6000, 0x000f8000, ++ 0x000fa000, 0x000fc000, 0x000fe000, 0x00100000, 0x00102000, 0x00104000, ++ 0x00106000, 0x00108000, 0x0010a000, 0x0010c000, 0x0010e000, 0x00110000, ++ 0x00112000, 0x00114000, 0x00116000, 0x00118000, 0x0011a000, 0x0011c000, ++ 0x0011e000, 0x00120000, 0x00122000, 0x00124000, 0x00126000, 0x00128000, ++ 0x0012a000, 0x0012c000, 0x0012e000, 0x00130000, 0x00132000, 0x00134000, ++ 0x00136000, 0x00138000, 0x0013a000, 0x0013c000, 0x0013e000, 0x00140000, ++ 0x00142000, 0x00144000, 0x00146000, 0x00148000, 0x0014a000, 0x0014c000, ++ 0x0014e000, 0x00150000, 0x00152000, 0x00154000, 0x00156000, 0x00158000, ++ 0x0015a000, 0x0015c000, 0x0015e000, 0x00160000, 0x00162000, 0x00164000, ++ 0x00166000, 0x00168000, 0x0016a000, 0x0016c000, 0x0016e000, 0x00170000, ++ 0x00172000, 0x00174000, 0x00176000, 0x00178000, 0x0017a000, 0x0017c000, ++ 0x0017e000, 0x00180000, 0x00182000, 0x00184000, 0x00186000, 0x00188000, ++ 0x0018a000, 0x0018c000, 0x0018e000, 0x00190000, 0x00192000, 0x00194000, ++ 0x00196000, 0x00198000, 0x0019a000, 0x0019c000, 0x0019e000, 0x001a0000, ++ 0x001a2000, 0x001a4000, 0x001a6000, 0x001a8000, 0x001aa000, 0x001ac000, ++ 0x001ae000, 0x001b0000, 0x001b2000, 0x001b4000, 0x001b6000, 0x001b8000, ++ 0x001ba000, 0x001bc000, 0x001be000, 0x001c0000, 0x001c2000, 0x001c4000, ++ 0x001c6000, 0x001c8000, 0x001ca000, 0x001cc000, 0x001ce000, 0x001d0000, ++ 0x001d2000, 0x001d4000, 0x001d6000, 0x001d8000, 0x001da000, 0x001dc000, ++ 0x001de000, 0x001e0000, 0x001e2000, 0x001e4000, 0x001e6000, 0x001e8000, ++ 0x001ea000, 0x001ec000, 0x001ee000, 0x001f0000, 0x001f2000, 0x001f4000, ++ 0x001f6000, 0x001f8000, 0x001fa000, 0x001fc000, 0x001fe000, 0x00200000, ++ 0x00202000, 0x00204000, 0x00206000, 0x00208000, 0x0020a000, 0x0020c000, ++ 0x0020e000, 0x00210000, 0x00212000, 0x00214000, 0x00216000, 0x00218000, ++ 0x0021a000, 0x0021c000, 0x0021e000, 0x00220000, 0x00222000, 0x00224000, ++ 0x00226000, 0x00228000, 0x0022a000, 0x0022c000, 0x0022e000, 0x00230000, ++ 0x00232000, 0x00234000, 0x00236000, 0x00238000, 0x0023a000, 0x0023c000, ++ 0x0023e000, 0x00240000, 0x00242000, 0x00244000, 0x00246000, 0x00248000, ++ 0x0024a000, 0x0024c000, 0x0024e000, 0x00250000, 0x00252000, 0x00254000, ++ 0x00256000, 0x00258000, 0x0025a000, 0x0025c000, 0x0025e000, 0x00260000, ++ 0x00262000, 0x00264000, 0x00266000, 0x00268000, 0x0026a000, 0x0026c000, ++ 0x0026e000, 0x00270000, 0x00272000, 0x00274000, 0x00276000, 0x00278000, ++ 0x0027a000, 0x0027c000, 0x0027e000, 0x00280000, 0x00282000, 0x00284000, ++ 0x00286000, 0x00288000, 0x0028a000, 0x0028c000, 0x0028e000, 0x00290000, ++ 0x00292000, 0x00294000, 0x00296000, 0x00298000, 0x0029a000, 0x0029c000, ++ 0x0029e000, 0x002a0000, 0x002a2000, 0x002a4000, 0x002a6000, 0x002a8000, ++ 0x002aa000, 0x002ac000, 0x002ae000, 0x002b0000, 0x002b2000, 0x002b4000, ++ 0x002b6000, 0x002b8000, 0x002ba000, 0x002bc000, 0x002be000, 0x002c0000, ++ 0x002c2000, 0x002c4000, 0x002c6000, 0x002c8000, 0x002ca000, 0x002cc000, ++ 0x002ce000, 0x002d0000, 0x002d2000, 0x002d4000, 0x002d6000, 0x002d8000, ++ 0x002da000, 0x002dc000, 0x002de000, 0x002e0000, 0x002e2000, 0x002e4000, ++ 0x002e6000, 0x002e8000, 0x002ea000, 0x002ec000, 0x002ee000, 0x002f0000, ++ 0x002f2000, 0x002f4000, 0x002f6000, 0x002f8000, 0x002fa000, 0x002fc000, ++ 0x002fe000, 0x00300000, 0x00302000, 0x00304000, 0x00306000, 0x00308000, ++ 0x0030a000, 0x0030c000, 0x0030e000, 0x00310000, 0x00312000, 0x00314000, ++ 0x00316000, 0x00318000, 0x0031a000, 0x0031c000, 0x0031e000, 0x00320000, ++ 0x00322000, 0x00324000, 0x00326000, 0x00328000, 0x0032a000, 0x0032c000, ++ 0x0032e000, 0x00330000, 0x00332000, 0x00334000, 0x00336000, 0x00338000, ++ 0x0033a000, 0x0033c000, 0x0033e000, 0x00340000, 0x00342000, 0x00344000, ++ 0x00346000, 0x00348000, 0x0034a000, 0x0034c000, 0x0034e000, 0x00350000, ++ 0x00352000, 0x00354000, 0x00356000, 0x00358000, 0x0035a000, 0x0035c000, ++ 0x0035e000, 0x00360000, 0x00362000, 0x00364000, 0x00366000, 0x00368000, ++ 0x0036a000, 0x0036c000, 0x0036e000, 0x00370000, 0x00372000, 0x00374000, ++ 0x00376000, 0x00378000, 0x0037a000, 0x0037c000, 0x0037e000, 0x00380000, ++ 0x00382000, 0x00384000, 0x00386000, 0x00388000, 0x0038a000, 0x0038c000, ++ 0x0038e000, 0x00390000, 0x00392000, 0x00394000, 0x00396000, 0x00398000, ++ 0x0039a000, 0x0039c000, 0x0039e000, 0x003a0000, 0x003a2000, 0x003a4000, ++ 0x003a6000, 0x003a8000, 0x003aa000, 0x003ac000, 0x003ae000, 0x003b0000, ++ 0x003b2000, 0x003b4000, 0x003b6000, 0x003b8000, 0x003ba000, 0x003bc000, ++ 0x003be000, 0x003c0000, 0x003c2000, 0x003c4000, 0x003c6000, 0x003c8000, ++ 0x003ca000, 0x003cc000, 0x003ce000, 0x003d0000, 0x003d2000, 0x003d4000, ++ 0x003d6000, 0x003d8000, 0x003da000, 0x003dc000, 0x003de000, 0x003e0000, ++ 0x003e2000, 0x003e4000, 0x003e6000, 0x003e8000, 0x003ea000, 0x003ec000, ++ 0x003ee000, 0x003f0000, 0x003f2000, 0x003f4000, 0x003f6000, 0x003f8000, ++ 0x003fa000, 0x003fc000, 0x003fe000, 0x003fe001, 0x00000000, 0x000001ff, ++ 0x00000200, 0x00007ff8, 0x00007ff8, 0x00000cdf, 0x00001500, 0x00000001, ++ 0x00000001, 0x00000001, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, ++ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, ++ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, ++ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, ++ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, ++ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, ++ 0xffffffff, 0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0xffffffff, ++ 0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0xffffffff, 0x00000000, ++ 0xffffffff, 0x00000003, 0x00bebc20, 0xffffffff, 0x00000000, 0xffffffff, ++ 0x00000000, 0xffffffff, 0x00000003, 0x00bebc20, 0xffffffff, 0x00000000, ++ 0xffffffff, 0x00000000, 0xffffffff, 0x00000003, 0x00bebc20, 0xffffffff, ++ 0x00000000, 0xffffffff, 0x00000000, 0xffffffff, 0x00000003, 0x00bebc20, ++ 0xffffffff, 0x00000000, 0xffffffff, 0x00000000, 0xffffffff, 0x00000003, ++ 0x00bebc20, 0xffffffff, 0x00000000, 0xffffffff, 0x00000000, 0xffffffff, ++ 0x00000003, 0x00bebc20, 0x00002000, 0x000040c0, 0x00006180, 0x00008240, ++ 0x0000a300, 0x0000c3c0, 0x0000e480, 0x00010540, 0x00012600, 0x000146c0, ++ 0x00016780, 0x00018840, 0x0001a900, 0x0001c9c0, 0x0001ea80, 0x00020b40, ++ 0x00022c00, 0x00024cc0, 0x00026d80, 0x00028e40, 0x0002af00, 0x0002cfc0, ++ 0x0002f080, 0x00031140, 0x00033200, 0x000352c0, 0x00037380, 0x00039440, ++ 0x0003b500, 0x0003d5c0, 0x0003f680, 0x00041740, 0x00043800, 0x000458c0, ++ 0x00047980, 0x00049a40, 0x00008000, 0x00010380, 0x00018700, 0x00020a80, ++ 0x00028e00, 0x00031180, 0x00039500, 0x00041880, 0x00049c00, 0x00051f80, ++ 0x0005a300, 0x00062680, 0x0006aa00, 0x00072d80, 0x0007b100, 0x00083480, ++ 0x0008b800, 0x00093b80, 0x0009bf00, 0x000a4280, 0x000ac600, 0x000b4980, ++ 0x000bcd00, 0x000c5080, 0x000cd400, 0x000d5780, 0x000ddb00, 0x00007ff8, ++ 0x00007ff8, 0x0000193c, 0x00001500, 0x00001900, 0x00000028, 0x00100000, ++ 0x00000000, 0x00000000, 0xffffffff, 0x40000000, 0x40000000, 0x40000000, ++ 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, ++ 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, ++ 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, ++ 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, ++ 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x00007ff8, ++ 0x00007ff8, 0x000005c7, 0x00001500, 0xffffffff, 0xffffffff, 0xffffffff, ++ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, ++ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, ++ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, ++ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, ++ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x40000000, ++ 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, ++ 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, ++ 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, ++ 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, ++ 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, ++ 0x40000000, 0x00001000, 0x00002080, 0x00003100, 0x00004180, 0x00005200, ++ 0x00006280, 0x00007300, 0x00008380, 0x00009400, 0x0000a480, 0x0000b500, ++ 0x0000c580, 0x0000d600, 0x0000e680, 0x0000f700, 0x00010780, 0x00011800, ++ 0x00012880, 0x00013900, 0x00014980, 0x00015a00, 0x00016a80, 0x00017b00, ++ 0x00018b80, 0x00019c00, 0x0001ac80, 0x0001bd00, 0x0001cd80, 0x0001de00, ++ 0x0001ee80, 0x0001ff00, 0x00007ff8, 0x00007ff8, 0x0000112e, 0x00003500, ++ 0x10000000, 0x000028ad, 0x00000000, 0x00010001, 0x00120005, 0xccccccc5, ++ 0xffffffff, 0xffffffff, 0x7058103c, 0x00000000, 0x00000000, 0x00000001, ++ 0xcccc0201, 0xcccccccc, 0xcccc0201, 0xcccccccc, 0xcccc0201, 0xcccccccc, ++ 0xcccc0201, 0xcccccccc, 0xcccc0201, 0xcccccccc, 0xcccc0201, 0xcccccccc, ++ 0xcccc0201, 0xcccccccc, 0xcccc0201, 0xcccccccc, 0x00000000, 0xffffffff, ++ 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, ++ 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, ++ 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, ++ 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, ++ 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, ++ 0x40000000, 0x40000000, 0x000e0232, 0x011600d6, 0x00100000, 0x00000000, ++ 0x00720236, 0x012300f3, 0x00100000, 0x00000000, 0x0000ffff, 0x00000000, ++ 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, ++ 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, ++ 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, ++ 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, ++ 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, ++ 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, ++ 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, ++ 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, ++ 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, ++ 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, ++ 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, ++ 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, ++ 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, ++ 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, ++ 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, ++ 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, ++ 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, ++ 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, ++ 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, ++ 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, ++ 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff, 0x00000000, ++ 0xfffffff3, 0x318fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, ++ 0x0000cf3c, 0xcdcdcdcd, 0xfffffff1, 0x30efffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cf300, 0xf3cf3cf3, 0x0001cf3c, 0xcdcdcdcd, 0xfffffff6, 0x305fffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0002cf3c, 0xcdcdcdcd, ++ 0xfffff406, 0x1cbfffff, 0x0c30c305, 0xc30c30c3, 0xcf300014, 0xf3cf3cf3, ++ 0x0004cf3c, 0xcdcdcdcd, 0xfffffff2, 0x304fffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cf300, 0xf3cf3cf3, 0x0008cf3c, 0xcdcdcdcd, 0xfffffffa, 0x302fffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0010cf3c, 0xcdcdcdcd, ++ 0xfffffff7, 0x31efffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, ++ 0x0020cf3c, 0xcdcdcdcd, 0xfffffff5, 0x302fffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cf300, 0xf3cf3cf3, 0x0040cf3c, 0xcdcdcdcd, 0xfffffff3, 0x310fffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0000cf3c, 0xcdcdcdcd, ++ 0xfffffff1, 0x310fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, ++ 0x0001cf3c, 0xcdcdcdcd, 0xfffffff6, 0x305fffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cf300, 0xf3cf3cf3, 0x0002cf3c, 0xcdcdcdcd, 0xfffff406, 0x1cbfffff, ++ 0x0c30c305, 0xc30c30c3, 0xcf300014, 0xf3cf3cf3, 0x0004cf3c, 0xcdcdcdcd, ++ 0xfffffff2, 0x304fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, ++ 0x0008cf3c, 0xcdcdcdcd, 0xfffffffa, 0x302fffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cf300, 0xf3cf3cf3, 0x0010cf3c, 0xcdcdcdcd, 0xfffffff7, 0x30efffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0020cf3c, 0xcdcdcdcd, ++ 0xfffffff5, 0x304fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, ++ 0x0040cf3c, 0xcdcdcdcd, 0xfffffff3, 0x31efffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cf300, 0xf3cf3cf3, 0x0000cf3c, 0xcdcdcdcd, 0xfffffff1, 0x310fffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0001cf3c, 0xcdcdcdcd, ++ 0xfffffff6, 0x305fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, ++ 0x0002cf3c, 0xcdcdcdcd, 0xfffff406, 0x1cbfffff, 0x0c30c305, 0xc30c30c3, ++ 0xcf300014, 0xf3cf3cf3, 0x0004cf3c, 0xcdcdcdcd, 0xfffffff2, 0x304fffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0008cf3c, 0xcdcdcdcd, ++ 0xfffffffa, 0x302fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, ++ 0x0010cf3c, 0xcdcdcdcd, 0xffffff97, 0x056fffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cc000, 0xf3cf3cf3, 0x0020cf3c, 0xcdcdcdcd, 0xfffffff5, 0x310fffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0040cf3c, 0xcdcdcdcd, ++ 0xfffffff3, 0x320fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, ++ 0x0000cf3c, 0xcdcdcdcd, 0xfffffff1, 0x310fffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cf300, 0xf3cf3cf3, 0x0001cf3c, 0xcdcdcdcd, 0xfffffff6, 0x305fffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0002cf3c, 0xcdcdcdcd, ++ 0xfffff406, 0x1cbfffff, 0x0c30c305, 0xc30c30c3, 0xcf300014, 0xf3cf3cf3, ++ 0x0004cf3c, 0xcdcdcdcd, 0xfffffff2, 0x304fffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cf300, 0xf3cf3cf3, 0x0008cf3c, 0xcdcdcdcd, 0xffffff8a, 0x042fffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cc000, 0xf3cf3cf3, 0x0010cf3c, 0xcdcdcdcd, ++ 0xffffff97, 0x05cfffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cc000, 0xf3cf3cf3, ++ 0x0020cf3c, 0xcdcdcdcd, 0xfffffff5, 0x310fffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cf300, 0xf3cf3cf3, 0x0040cf3c, 0xcdcdcdcd, 0xfffffff3, 0x316fffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0000cf3c, 0xcdcdcdcd, ++ 0xfffffff1, 0x302fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, ++ 0x0001cf3c, 0xcdcdcdcd, 0xfffffff6, 0x305fffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cf300, 0xf3cf3cf3, 0x0002cf3c, 0xcdcdcdcd, 0xfffffff6, 0x30bfffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cf314, 0xf3cf3cf3, 0x0004cf3c, 0xcdcdcdcd, ++ 0xfffffff2, 0x304fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, ++ 0x0008cf3c, 0xcdcdcdcd, 0xfffffffa, 0x302fffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cf300, 0xf3cf3cf3, 0x0010cf3c, 0xcdcdcdcd, 0xfffffff7, 0x31cfffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, 0x0020cf3c, 0xcdcdcdcd, ++ 0xfffffff0, 0x307fffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf300, 0xf3cf3cf3, ++ 0x0040cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cf3cc, 0xf3cf3cf3, 0x0000cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, 0x0001cf3c, 0xcdcdcdcd, ++ 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, ++ 0x0002cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cf3cc, 0xf3cf3cf3, 0x0004cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, 0x0008cf3c, 0xcdcdcdcd, ++ 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, ++ 0x0010cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cf3cc, 0xf3cf3cf3, 0x0020cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, 0x0040cf3c, 0xcdcdcdcd, ++ 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, ++ 0x0000cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cf3cc, 0xf3cf3cf3, 0x0001cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, 0x0002cf3c, 0xcdcdcdcd, ++ 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, ++ 0x0004cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cf3cc, 0xf3cf3cf3, 0x0008cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, 0x0010cf3c, 0xcdcdcdcd, ++ 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, ++ 0x0020cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cf3cc, 0xf3cf3cf3, 0x0040cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, 0x0000cf3c, 0xcdcdcdcd, ++ 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, ++ 0x0001cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cf3cc, 0xf3cf3cf3, 0x0002cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, 0x0004cf3c, 0xcdcdcdcd, ++ 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, ++ 0x0008cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, ++ 0xcf3cf3cc, 0xf3cf3cf3, 0x0010cf3c, 0xcdcdcdcd, 0xffffffff, 0x30cfffff, ++ 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, 0x0020cf3c, 0xcdcdcdcd, ++ 0xffffffff, 0x30cfffff, 0x0c30c30c, 0xc30c30c3, 0xcf3cf3cc, 0xf3cf3cf3, ++ 0x0040cf3c, 0xcdcdcdcd, 0x000c0000, 0x000700c0, 0x00028130, 0x000b8158, ++ 0x00020210, 0x00010230, 0x000f0240, 0x00010330, 0x00080000, 0x00080080, ++ 0x00028100, 0x000b8128, 0x000201e0, 0x00010200, 0x00070210, 0x00020280, ++ 0x000f0000, 0x000800f0, 0x00028170, 0x000b8198, 0x00020250, 0x00010270, ++ 0x000b8280, 0x00080338, 0x00100000, 0x00080100, 0x00028180, 0x000b81a8, ++ 0x00020260, 0x00018280, 0x000e8298, 0x00080380, 0x000b0000, 0x000100b0, ++ 0x000280c0, 0x000580e8, 0x00020140, 0x00010160, 0x000e0170, 0x00038250, ++ 0xcccccccc, 0xcccccccc, 0xcccccccc, 0xcccccccc, 0x00002000, 0xcccccccc, ++ 0xcccccccc, 0xcccccccc, 0xcccccccc, 0x00002000, 0xcccccccc, 0xcccccccc, ++ 0xcccccccc, 0xcccccccc, 0x04002000 ++}; ++ ++static const u8 tsem_int_table_data_e1h[] = { ++ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xfb, 0x51, ++ 0xcf, 0xc0, 0xf0, 0x03, 0x8a, 0x59, 0x05, 0x19, 0x18, 0xf4, 0x84, 0x11, ++ 0x7c, 0x7a, 0x60, 0x7e, 0x4e, 0xca, 0xf4, 0x3b, 0xf2, 0x32, 0x30, 0x38, ++ 0x03, 0xb1, 0x2b, 0x10, 0x37, 0x00, 0xf1, 0x61, 0x6e, 0x06, 0x86, 0x23, ++ 0xdc, 0xc4, 0xeb, 0x3f, 0x2b, 0x8f, 0x60, 0x07, 0xca, 0x32, 0x30, 0xd4, ++ 0x02, 0xf1, 0x7e, 0x69, 0x06, 0x06, 0x2b, 0x39, 0x84, 0xb8, 0xa1, 0x02, ++ 0x03, 0xc3, 0x12, 0x20, 0x3f, 0x0d, 0x2a, 0xf6, 0x1a, 0x48, 0x17, 0xca, ++ 0x53, 0xe6, 0xee, 0xc1, 0x82, 0x55, 0x54, 0x31, 0xc5, 0x14, 0x95, 0x11, ++ 0x6c, 0x55, 0x2c, 0xf2, 0xc8, 0x58, 0x0d, 0x4d, 0xbe, 0x41, 0x19, 0x95, ++ 0xaf, 0x4e, 0x40, 0xff, 0x40, 0xe3, 0x64, 0x1d, 0x54, 0xfe, 0x04, 0x2d, ++ 0x08, 0xfd, 0x5e, 0x1b, 0x42, 0xa7, 0xa0, 0xc9, 0x4f, 0x84, 0xca, 0xbb, ++ 0x42, 0xfd, 0x95, 0xaa, 0x83, 0xdd, 0x5c, 0x37, 0x22, 0xfd, 0x9d, 0xc6, ++ 0x82, 0xca, 0x4f, 0x40, 0xe3, 0xb7, 0x30, 0xa2, 0xf2, 0xcd, 0x38, 0xd0, ++ 0xdc, 0x0f, 0x55, 0x0f, 0x00, 0x00, 0x17, 0x4b, 0x67, 0xc8, 0x03, 0x00, ++ 0x00, 0x00, 0x00, 0x00 ++}; ++ ++static const u8 tsem_pram_data_e1h[] = { ++ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xed, 0x7d, ++ 0x0d, 0x78, 0x54, 0xd5, 0xb5, 0xe8, 0x3e, 0x3f, 0x73, 0xe6, 0xcc, 0xe4, ++ 0xcc, 0xe4, 0x24, 0x24, 0x61, 0xc2, 0xef, 0x24, 0x84, 0x10, 0x34, 0xe2, ++ 0x10, 0x22, 0x06, 0x4b, 0xeb, 0x09, 0x7f, 0x86, 0x4a, 0xbd, 0x03, 0x55, ++ 0x4c, 0xad, 0xe2, 0x80, 0x11, 0x03, 0x04, 0x12, 0xa9, 0xfa, 0xf0, 0x69, ++ 0xbf, 0x4c, 0x24, 0x81, 0x80, 0x08, 0x83, 0x5a, 0x1a, 0x0a, 0xea, 0xf0, ++ 0xa7, 0xb4, 0x17, 0xdb, 0xc8, 0x45, 0x4b, 0x2d, 0xc5, 0x41, 0x9f, 0x16, ++ 0x5b, 0xdf, 0xf7, 0x82, 0xcf, 0x5a, 0xbd, 0xda, 0xbe, 0x68, 0x29, 0xfe, ++ 0x14, 0x25, 0xe5, 0x5d, 0xad, 0x7d, 0xd7, 0xd6, 0xb7, 0xd7, 0xda, 0x7b, ++ 0x67, 0xce, 0x39, 0xcc, 0x90, 0xe0, 0x4f, 0xdb, 0xfb, 0xde, 0xa5, 0x9f, ++ 0xdd, 0xd9, 0xe7, 0xec, 0x9f, 0xb5, 0xd7, 0xdf, 0x5e, 0x6b, 0xed, 0xb5, ++ 0xcf, 0x78, 0x48, 0x3e, 0x29, 0x1a, 0x4d, 0xc8, 0x27, 0xf0, 0xef, 0x52, ++ 0x42, 0xfe, 0x97, 0x41, 0x08, 0x29, 0x4c, 0x97, 0x1e, 0x9d, 0xc4, 0x73, ++ 0x2e, 0x24, 0x24, 0xaf, 0xc0, 0x8a, 0xf7, 0x56, 0x12, 0x32, 0xb4, 0xc0, ++ 0x4a, 0x91, 0x6a, 0xfa, 0xdc, 0xd4, 0xc2, 0x5e, 0x29, 0xdd, 0x4f, 0x94, ++ 0x47, 0xf2, 0x66, 0x85, 0xa0, 0x5d, 0x7b, 0xa1, 0x15, 0x22, 0x74, 0x8c, ++ 0xf6, 0xbc, 0xf9, 0x24, 0x06, 0x63, 0xc5, 0x1a, 0x09, 0x29, 0x22, 0x44, ++ 0xd5, 0x09, 0xfe, 0x13, 0xed, 0x3d, 0xe6, 0x3c, 0x9d, 0x54, 0xe2, 0xa3, ++ 0xbf, 0x7e, 0x22, 0xde, 0x2b, 0x84, 0x74, 0x98, 0xa5, 0xb9, 0xd0, 0xcf, ++ 0x3d, 0x3e, 0x21, 0x49, 0x42, 0x2e, 0xb2, 0xd7, 0x65, 0x42, 0xc4, 0x98, ++ 0xb4, 0x9f, 0x4f, 0xc0, 0x5b, 0x46, 0x1f, 0x14, 0x10, 0xe2, 0xaf, 0x91, ++ 0x93, 0x97, 0x95, 0x50, 0xb8, 0xcb, 0x92, 0x29, 0xa8, 0x1b, 0x61, 0x06, ++ 0xf7, 0x91, 0x92, 0x97, 0xeb, 0xc6, 0xd0, 0x75, 0xac, 0xaf, 0x95, 0x23, ++ 0xde, 0x30, 0xf4, 0xbe, 0x99, 0x90, 0xc9, 0x84, 0xac, 0x84, 0xb1, 0x68, ++ 0x7d, 0xfd, 0xc4, 0x9e, 0xba, 0x31, 0x05, 0xf0, 0x5e, 0x8d, 0xc0, 0xdb, ++ 0x99, 0xca, 0xbe, 0x36, 0x8d, 0xb6, 0x37, 0xca, 0x08, 0xb6, 0x0f, 0x4e, ++ 0x8c, 0xa7, 0x34, 0xec, 0x67, 0x19, 0xc5, 0xb4, 0x5f, 0x1e, 0x03, 0x81, ++ 0xe4, 0x55, 0x2c, 0x9e, 0x43, 0x82, 0x84, 0x98, 0x33, 0xb4, 0x34, 0x5c, ++ 0xf8, 0xff, 0x16, 0xae, 0xdf, 0xe0, 0xed, 0xf4, 0x32, 0xe7, 0x7b, 0x83, ++ 0x6c, 0xf8, 0xa3, 0x32, 0x01, 0x6a, 0x7d, 0x24, 0x7a, 0x01, 0x1d, 0x7f, ++ 0xaa, 0xeb, 0x7d, 0xc5, 0xac, 0xb7, 0x60, 0x5c, 0x83, 0xd0, 0xe7, 0x15, ++ 0xfc, 0x39, 0x5d, 0xd7, 0xbd, 0xf0, 0x47, 0x31, 0x21, 0x5f, 0x22, 0x81, ++ 0x82, 0x13, 0x39, 0xf4, 0xef, 0x8b, 0xc9, 0xc5, 0x80, 0x07, 0x52, 0x97, ++ 0x4f, 0xc8, 0x94, 0x33, 0xf1, 0x97, 0xc6, 0x5b, 0x1c, 0xe9, 0x4b, 0x08, ++ 0xa3, 0x8b, 0x46, 0xfa, 0xff, 0x21, 0x1d, 0x74, 0x4e, 0x87, 0xcb, 0x66, ++ 0xf4, 0x76, 0x49, 0x74, 0xdd, 0xbe, 0x88, 0x4c, 0xbc, 0xf4, 0xd1, 0x2c, ++ 0xe5, 0x05, 0xbd, 0x14, 0xf0, 0x72, 0x54, 0x41, 0x3c, 0xac, 0xaf, 0x67, ++ 0x78, 0x5e, 0x3f, 0x43, 0x4e, 0xc6, 0x25, 0x5c, 0xe7, 0x9c, 0x62, 0xda, ++ 0x7f, 0x34, 0x61, 0x78, 0xcc, 0x1b, 0x5f, 0x2a, 0x91, 0x52, 0x42, 0x36, ++ 0xb5, 0xd2, 0xfa, 0xb8, 0x33, 0xf1, 0x9c, 0x5b, 0x96, 0xb0, 0x80, 0xfe, ++ 0xbe, 0x32, 0x22, 0x01, 0x5f, 0xe5, 0xd2, 0x67, 0x43, 0xe8, 0xba, 0x72, ++ 0xa7, 0xa6, 0x90, 0x6f, 0x46, 0xd7, 0x30, 0x7c, 0x92, 0x3b, 0x19, 0x3e, ++ 0xe2, 0xf4, 0x7f, 0x9f, 0x94, 0xa6, 0xf1, 0x99, 0x2b, 0xf0, 0x19, 0x71, ++ 0xe2, 0x2b, 0x97, 0xe3, 0x33, 0xaf, 0xce, 0x86, 0x2f, 0x78, 0x5e, 0x43, ++ 0xf1, 0x38, 0x01, 0xde, 0x3b, 0xf1, 0x98, 0x84, 0x3f, 0x28, 0xbe, 0x1a, ++ 0x04, 0x1e, 0x0b, 0xc9, 0x58, 0xc4, 0x63, 0x3c, 0x1f, 0xf1, 0x3b, 0x10, ++ 0x1e, 0x2f, 0xa3, 0x38, 0xc8, 0xa1, 0xf0, 0xfb, 0x5f, 0xf1, 0x26, 0xbd, ++ 0x25, 0x69, 0xbc, 0x0a, 0xbe, 0x10, 0x78, 0x35, 0x39, 0x5e, 0x37, 0xce, ++ 0xec, 0xd3, 0x81, 0x19, 0x36, 0x59, 0x8c, 0xcf, 0x09, 0x49, 0x49, 0x72, ++ 0x08, 0xc7, 0x93, 0xe4, 0x1a, 0x5c, 0x1f, 0x96, 0x9d, 0x80, 0x37, 0x2f, ++ 0xf6, 0xc7, 0xf7, 0x3a, 0x85, 0xd9, 0xe0, 0xf3, 0x84, 0xe9, 0x3c, 0xfe, ++ 0x8a, 0x04, 0xe2, 0x5f, 0xa7, 0xe8, 0x18, 0x22, 0x01, 0x9f, 0x1a, 0x92, ++ 0x0a, 0x7c, 0x0d, 0x7c, 0x9a, 0x61, 0xde, 0xf5, 0x7a, 0x52, 0x97, 0x68, ++ 0xfb, 0xcd, 0x53, 0x65, 0x02, 0xf4, 0x5a, 0x6f, 0xc9, 0x24, 0x4c, 0xeb, ++ 0xa7, 0x2b, 0xd4, 0xa4, 0x02, 0x70, 0xc7, 0xad, 0x9e, 0x90, 0x8d, 0x4f, ++ 0x0d, 0xc0, 0x3f, 0xc5, 0xd7, 0x3d, 0x1c, 0x3f, 0xda, 0x08, 0xd9, 0x81, ++ 0x4f, 0xb5, 0xc0, 0xef, 0xe2, 0x73, 0xe7, 0x3a, 0x36, 0xf7, 0xaf, 0xcf, ++ 0xe2, 0xeb, 0x62, 0xeb, 0x20, 0x3d, 0xc9, 0x4e, 0x80, 0xe3, 0xc3, 0x99, ++ 0x32, 0x59, 0x2f, 0x0d, 0x3c, 0xee, 0x40, 0x78, 0x12, 0xe3, 0x0e, 0x08, ++ 0x5f, 0xaf, 0xe9, 0x2b, 0x83, 0x79, 0x9f, 0x57, 0x22, 0xeb, 0x29, 0xaf, ++ 0xad, 0x0f, 0x27, 0x3b, 0x65, 0x8a, 0xaf, 0x4d, 0x33, 0x18, 0x3e, 0xce, ++ 0xa4, 0xef, 0x67, 0x9c, 0xaf, 0xaf, 0x4f, 0x2f, 0xab, 0xb6, 0xcd, 0x17, ++ 0xe9, 0xd3, 0xcd, 0xca, 0x2f, 0x60, 0x1e, 0x92, 0xe7, 0x5c, 0x57, 0x8d, ++ 0xe9, 0x33, 0x33, 0xea, 0xcf, 0x73, 0x9b, 0x87, 0x98, 0x0b, 0x47, 0x47, ++ 0x03, 0xd9, 0xe9, 0xf1, 0xb9, 0xc1, 0x1f, 0xa6, 0xf0, 0xdb, 0xf0, 0xa4, ++ 0x87, 0x4d, 0x09, 0xc6, 0xd7, 0xc7, 0xdf, 0xa5, 0x83, 0x8a, 0x27, 0x64, ++ 0xa7, 0x0e, 0x7a, 0xd1, 0x3d, 0xcf, 0x19, 0xf0, 0xba, 0xe6, 0x75, 0xcf, ++ 0xa3, 0x96, 0xb5, 0x58, 0x2a, 0xd6, 0x9c, 0x7a, 0x48, 0x33, 0x13, 0x84, ++ 0xcd, 0x63, 0xb1, 0x7d, 0x8a, 0xb0, 0xe7, 0x2a, 0xe8, 0x11, 0xaa, 0x7f, ++ 0xfc, 0x11, 0xa7, 0x1e, 0x71, 0xeb, 0x6f, 0x6d, 0x84, 0xb3, 0xae, 0xd6, ++ 0x30, 0x7d, 0xad, 0x12, 0xdb, 0xf3, 0x12, 0xd0, 0xee, 0x54, 0xbf, 0x9c, ++ 0x4f, 0xd2, 0x7a, 0xba, 0x7a, 0x70, 0xfa, 0x85, 0x58, 0x8d, 0x08, 0xaf, ++ 0x5b, 0x9f, 0x8c, 0xe1, 0x72, 0x3d, 0x7d, 0x5f, 0x6f, 0xbd, 0x4a, 0xe9, ++ 0x5f, 0xb6, 0x5d, 0xe8, 0xe9, 0x3b, 0x7f, 0x51, 0x41, 0xeb, 0x7b, 0x40, ++ 0x4f, 0xd3, 0xfa, 0x9e, 0x2e, 0x98, 0x8b, 0x96, 0xdd, 0x4e, 0x3d, 0x3d, ++ 0x81, 0x0f, 0x56, 0xf9, 0x9d, 0x17, 0x65, 0xd0, 0xd3, 0x3b, 0xb3, 0xe8, ++ 0xe9, 0xd2, 0x84, 0x35, 0x0d, 0xf4, 0x74, 0x59, 0x82, 0x6e, 0x04, 0x74, ++ 0x9c, 0xd2, 0x0d, 0x4c, 0x4f, 0x97, 0x76, 0xb6, 0xc8, 0x40, 0xa7, 0x09, ++ 0x5c, 0x4f, 0x90, 0x83, 0x0c, 0x4f, 0x3a, 0xfd, 0x9f, 0x5d, 0x4f, 0x97, ++ 0xf2, 0x79, 0xc6, 0x6c, 0x77, 0xe2, 0xa9, 0x94, 0xeb, 0xe9, 0xca, 0x03, ++ 0xae, 0xe7, 0x5c, 0x4f, 0x97, 0xba, 0xf4, 0xf4, 0x26, 0xf8, 0x83, 0xe2, ++ 0xab, 0x58, 0xe2, 0x78, 0x1c, 0x4b, 0xca, 0x11, 0x8f, 0x53, 0x07, 0xb9, ++ 0xdf, 0x71, 0x3c, 0xba, 0xf7, 0xbb, 0x52, 0x98, 0x7b, 0x0c, 0xc5, 0xe3, ++ 0xfd, 0x6c, 0xbf, 0xcb, 0x2b, 0x60, 0x78, 0xec, 0xe8, 0x94, 0x09, 0xe8, ++ 0x87, 0xd3, 0xdb, 0x65, 0xd4, 0x8f, 0xe3, 0x4a, 0xa2, 0x32, 0xb4, 0x13, ++ 0x7a, 0x92, 0x83, 0x46, 0x2a, 0xf8, 0xfa, 0x77, 0x71, 0x7d, 0x2d, 0xe0, ++ 0x1c, 0x33, 0xc3, 0xac, 0x05, 0x65, 0x5a, 0x46, 0xcc, 0x5a, 0xa0, 0x8f, ++ 0xb6, 0x81, 0x44, 0x52, 0x61, 0xd0, 0xd3, 0x4d, 0x71, 0x98, 0x67, 0x73, ++ 0x82, 0xe9, 0xe9, 0xb2, 0x04, 0x91, 0x63, 0x36, 0x3b, 0x48, 0xe3, 0xf0, ++ 0x6c, 0x0e, 0xe5, 0xcf, 0x06, 0xb9, 0x3e, 0x9d, 0x50, 0x23, 0xb0, 0xcc, ++ 0xdd, 0x24, 0x2c, 0xeb, 0x25, 0x69, 0xbc, 0xf6, 0xdb, 0x1d, 0x1c, 0x8f, ++ 0x5f, 0x83, 0x56, 0x0e, 0x79, 0x70, 0xd2, 0x31, 0x8f, 0xe3, 0xd5, 0x8d, ++ 0x9f, 0x71, 0x49, 0x27, 0x7f, 0x97, 0xdd, 0xef, 0xa2, 0xc7, 0x06, 0x67, ++ 0x3d, 0xcf, 0x45, 0x97, 0xcb, 0x25, 0x97, 0xfd, 0x31, 0x48, 0x7a, 0x78, ++ 0x55, 0x12, 0xf7, 0xe6, 0x43, 0x3d, 0x89, 0x76, 0x9d, 0x4e, 0xd7, 0x5a, ++ 0x48, 0xeb, 0xca, 0xbf, 0x3c, 0x63, 0x01, 0x5f, 0x1b, 0x5d, 0xec, 0x99, ++ 0xd6, 0x29, 0x27, 0x4b, 0x28, 0xdf, 0x06, 0xda, 0x59, 0xdd, 0xd3, 0xa9, ++ 0x26, 0x6b, 0x69, 0xfd, 0xba, 0x02, 0xc6, 0xd7, 0x63, 0xe3, 0x24, 0x09, ++ 0x76, 0x9d, 0x12, 0x8a, 0x12, 0xb0, 0x3f, 0xc7, 0x16, 0x50, 0xfd, 0x61, ++ 0xc3, 0xa7, 0x87, 0xe3, 0x53, 0xd0, 0x0d, 0xfe, 0x04, 0x7c, 0x8c, 0xe1, ++ 0xf6, 0x45, 0xee, 0xcc, 0x7c, 0x1f, 0xf0, 0xf7, 0xe6, 0x02, 0x8e, 0xef, ++ 0x19, 0x0c, 0xdf, 0x54, 0x01, 0xfa, 0x40, 0xff, 0x09, 0x7c, 0x7b, 0x38, ++ 0xbe, 0x8d, 0xea, 0x1e, 0x00, 0x8f, 0xcc, 0x0e, 0x3b, 0xf1, 0x3d, 0xe9, ++ 0xa8, 0x53, 0xdf, 0x5c, 0x5d, 0x3f, 0xc4, 0x51, 0xbf, 0x2a, 0x3a, 0xfc, ++ 0xac, 0xf4, 0xf1, 0x70, 0x3a, 0x7a, 0x38, 0x9d, 0x04, 0x1f, 0x9d, 0x81, ++ 0xff, 0xb8, 0xcb, 0x3e, 0xac, 0x76, 0xd6, 0x3d, 0x2e, 0xfa, 0xb4, 0x4a, ++ 0x2e, 0xbd, 0x33, 0x48, 0xfa, 0x68, 0x4f, 0x93, 0x0a, 0xe0, 0xdb, 0x71, ++ 0xb2, 0x3f, 0xb2, 0xb3, 0xe4, 0xcc, 0x76, 0x09, 0x49, 0x46, 0xba, 0xd1, ++ 0xc9, 0x93, 0xc7, 0xe9, 0xfc, 0x0b, 0xa9, 0x19, 0x97, 0x4b, 0xc7, 0x5f, ++ 0x4e, 0x7a, 0x47, 0x01, 0x82, 0x0e, 0x1a, 0x61, 0x1c, 0x67, 0x85, 0xdc, ++ 0x5b, 0x04, 0xf5, 0x53, 0xa4, 0x6f, 0xcb, 0xc8, 0x31, 0xe9, 0xf1, 0x47, ++ 0xa9, 0xe4, 0xa0, 0x44, 0x8d, 0x38, 0x89, 0xa2, 0x77, 0x15, 0x05, 0x69, ++ 0x98, 0x4e, 0x52, 0x39, 0x41, 0x04, 0x3b, 0xaa, 0x17, 0xe1, 0xd2, 0x11, ++ 0x2f, 0x12, 0xfd, 0xef, 0x5a, 0xe4, 0x13, 0x55, 0x06, 0x7c, 0x0d, 0x37, ++ 0xd9, 0x73, 0x12, 0xcf, 0x55, 0xa1, 0x1e, 0x22, 0xe2, 0x5f, 0x18, 0xe9, ++ 0xe4, 0xe5, 0x7f, 0x16, 0xaf, 0x7a, 0xee, 0xcf, 0x12, 0xc5, 0xa3, 0xc4, ++ 0x4b, 0x05, 0xe8, 0x38, 0x06, 0xf0, 0x13, 0x43, 0xbd, 0xa9, 0x93, 0x04, ++ 0xd6, 0xfd, 0xa4, 0x1b, 0x4b, 0x83, 0xf4, 0x60, 0x19, 0xa4, 0x9a, 0x1a, ++ 0x4a, 0x93, 0x98, 0x12, 0x94, 0xf9, 0x24, 0x82, 0x25, 0x39, 0x2f, 0xf9, ++ 0x58, 0x0a, 0xf5, 0xe7, 0x9d, 0x26, 0xf2, 0xbb, 0xef, 0x77, 0xe4, 0x93, ++ 0x9c, 0xf4, 0x7a, 0xee, 0x86, 0x3f, 0x29, 0x5e, 0x87, 0x91, 0xe8, 0xa3, ++ 0x12, 0xf8, 0x4f, 0x74, 0x3c, 0x5d, 0x49, 0xf3, 0xa1, 0x8f, 0xf3, 0x21, ++ 0xb5, 0xd3, 0x90, 0x6f, 0x75, 0x93, 0xf1, 0xad, 0x5e, 0x46, 0xf7, 0xd3, ++ 0x4a, 0x94, 0x7b, 0xf4, 0x5f, 0xdc, 0x78, 0x5e, 0xc7, 0xf5, 0xf2, 0xc6, ++ 0x56, 0x1d, 0xcb, 0x0d, 0xad, 0x26, 0x2e, 0x72, 0x68, 0x28, 0x19, 0x97, ++ 0x29, 0x7d, 0x7c, 0x73, 0x98, 0x1e, 0xc9, 0x0b, 0xf5, 0x76, 0x82, 0xdf, ++ 0xe2, 0x6f, 0x51, 0x23, 0x97, 0xd1, 0xba, 0xdf, 0xe8, 0x7b, 0xe5, 0x06, ++ 0xb0, 0xf7, 0x6e, 0xd5, 0x22, 0x77, 0xd1, 0xfa, 0x91, 0x99, 0xcf, 0x85, ++ 0xa0, 0xde, 0x79, 0xab, 0xc1, 0xec, 0xc3, 0x76, 0x66, 0xa7, 0xfa, 0x39, ++ 0xf6, 0x3a, 0xc7, 0xf6, 0xf5, 0xae, 0xa6, 0x70, 0x6d, 0xbc, 0x55, 0x8f, ++ 0xf0, 0x47, 0x0e, 0x7d, 0xb4, 0x71, 0x7c, 0xdf, 0xdb, 0xbb, 0x40, 0x6f, ++ 0xdd, 0xe2, 0x8f, 0x00, 0x7e, 0x37, 0x87, 0x9e, 0x0e, 0xaf, 0x06, 0x79, ++ 0x69, 0xd1, 0x50, 0x5e, 0xa8, 0xed, 0x89, 0xf4, 0xdb, 0x50, 0xf5, 0x8b, ++ 0x12, 0xb4, 0xd7, 0x3e, 0xa6, 0xf0, 0x53, 0xfa, 0xa0, 0x08, 0xd1, 0xfe, ++ 0xfa, 0x47, 0xb4, 0xd5, 0x24, 0xda, 0x6e, 0x44, 0x5f, 0x2b, 0xda, 0xf5, ++ 0x2d, 0x3d, 0xb5, 0x4a, 0x01, 0xbe, 0x8f, 0x07, 0xc2, 0xe9, 0xf5, 0x76, ++ 0x96, 0x0e, 0xc3, 0xfd, 0xbf, 0xf3, 0xe9, 0x75, 0x24, 0x4c, 0x5f, 0xe6, ++ 0x55, 0xc7, 0x2d, 0xc0, 0x97, 0xaf, 0x82, 0x9a, 0xb2, 0x94, 0x0f, 0x7d, ++ 0xd5, 0xa6, 0x14, 0x37, 0x40, 0x2a, 0x63, 0xaf, 0x49, 0x94, 0xff, 0xfc, ++ 0x33, 0x62, 0xc4, 0xa2, 0xf8, 0x0b, 0x84, 0xcc, 0x36, 0xe0, 0x15, 0x9d, ++ 0xd3, 0x8d, 0xa8, 0x89, 0x10, 0xc8, 0xaf, 0x1b, 0x9f, 0x9d, 0x23, 0xe3, ++ 0xa1, 0x45, 0x74, 0xde, 0xf8, 0x78, 0x2d, 0xb2, 0x07, 0xd9, 0xca, 0x94, ++ 0xe6, 0x67, 0x68, 0xd7, 0x8f, 0xff, 0x99, 0xb7, 0x5d, 0x63, 0x65, 0xb0, ++ 0xa7, 0x72, 0x65, 0x09, 0xf9, 0xff, 0xe9, 0xf1, 0x8b, 0xd1, 0xef, 0xf5, ++ 0x92, 0x58, 0x28, 0x07, 0x74, 0x52, 0x85, 0x46, 0xf6, 0x50, 0x38, 0xd7, ++ 0x8f, 0x5f, 0x3c, 0x3a, 0x96, 0xc1, 0xde, 0xb3, 0xc9, 0x19, 0xb7, 0x57, ++ 0x32, 0x97, 0xd9, 0xfa, 0x69, 0x0a, 0x69, 0xe9, 0xb6, 0xc1, 0x33, 0x56, ++ 0x96, 0x91, 0xff, 0x24, 0x59, 0x67, 0x72, 0x1b, 0xa2, 0x7c, 0x44, 0xe5, ++ 0x2a, 0xcf, 0x64, 0xfc, 0xa4, 0xcd, 0x20, 0x56, 0x32, 0x03, 0x1c, 0x97, ++ 0x72, 0xf8, 0x75, 0x35, 0x4e, 0x4c, 0xb4, 0xaf, 0x4d, 0x09, 0xec, 0xac, ++ 0x2f, 0x0a, 0x5f, 0xef, 0x48, 0x0c, 0xce, 0x75, 0x12, 0xa9, 0xef, 0xce, ++ 0xf0, 0x7e, 0x07, 0xc0, 0x53, 0x08, 0xf2, 0x71, 0x67, 0x0a, 0xf6, 0xc7, ++ 0xdc, 0x99, 0x8c, 0xaf, 0xe9, 0x7f, 0x56, 0x37, 0x85, 0x3f, 0x4f, 0x65, ++ 0xa5, 0x68, 0x5f, 0xc7, 0xe1, 0xdf, 0xcb, 0xfb, 0x9d, 0x83, 0x1e, 0x2a, ++ 0xba, 0x1f, 0xf8, 0xa3, 0x72, 0x70, 0xf6, 0x97, 0x17, 0xe6, 0xcd, 0x00, ++ 0xef, 0xc4, 0x4f, 0x31, 0xef, 0x26, 0x3a, 0xaf, 0x2c, 0x9b, 0xf8, 0x5c, ++ 0xe0, 0xdd, 0x4d, 0x4f, 0x51, 0x4a, 0xb2, 0x0f, 0xd7, 0xf7, 0xe1, 0xf8, ++ 0x2d, 0x21, 0xb0, 0x4f, 0xb3, 0xc1, 0x19, 0xbe, 0x05, 0x75, 0x3b, 0x09, ++ 0xb7, 0xd0, 0x72, 0x28, 0x2d, 0xe7, 0xf0, 0xd2, 0x64, 0xa5, 0x7b, 0xbe, ++ 0x73, 0x1d, 0xef, 0xcb, 0x32, 0x5b, 0x87, 0x7b, 0x5c, 0xb2, 0x9b, 0xd9, ++ 0x53, 0x7e, 0xbe, 0x7f, 0x1d, 0x99, 0xf2, 0xb2, 0xa5, 0x50, 0xba, 0x8d, ++ 0x8e, 0x13, 0x1e, 0x57, 0x71, 0xea, 0x8f, 0xd1, 0x15, 0x32, 0xfa, 0xab, ++ 0x9b, 0xf7, 0xd2, 0x0d, 0xbf, 0x04, 0xf4, 0x07, 0xab, 0x3f, 0xb4, 0x9b, ++ 0x24, 0x15, 0x8a, 0xca, 0xd3, 0x77, 0xde, 0x25, 0x03, 0x5c, 0x23, 0xa9, ++ 0x9d, 0x0f, 0xed, 0x87, 0x90, 0x98, 0x0c, 0x78, 0x2b, 0x21, 0x61, 0x09, ++ 0x4a, 0xa1, 0x07, 0xd7, 0x72, 0x3d, 0xf8, 0x01, 0x89, 0x5e, 0x23, 0x17, ++ 0x82, 0x9e, 0xee, 0x46, 0xbb, 0x68, 0x4e, 0xf5, 0xcd, 0xd3, 0x32, 0xc5, ++ 0x8d, 0x1a, 0xb8, 0x7c, 0x9c, 0xcb, 0x3e, 0xf5, 0x15, 0x5a, 0x2e, 0xd4, ++ 0xa3, 0x8b, 0x61, 0x7c, 0x23, 0x72, 0xcc, 0xa2, 0x3b, 0x39, 0xd1, 0x5e, ++ 0xc8, 0x2c, 0x57, 0x74, 0xbb, 0x0a, 0xcd, 0xb3, 0xc9, 0x03, 0x51, 0x04, ++ 0x5f, 0x30, 0x79, 0xea, 0xe0, 0xfc, 0x0e, 0x72, 0x33, 0x97, 0xd6, 0xe7, ++ 0x5f, 0x9b, 0x19, 0xce, 0xcd, 0x33, 0xb5, 0x61, 0xcc, 0x6e, 0x31, 0x8b, ++ 0xd1, 0xdf, 0x51, 0xcd, 0xe2, 0x79, 0x36, 0x79, 0xdc, 0xdc, 0x46, 0xe5, ++ 0x8a, 0xbe, 0x4f, 0xc2, 0x78, 0x36, 0x39, 0xf8, 0x2e, 0x5f, 0x5f, 0x1b, ++ 0x97, 0x87, 0x73, 0xe1, 0xc7, 0x3a, 0x5a, 0x9a, 0x11, 0xcb, 0x52, 0xe8, ++ 0xab, 0xba, 0x64, 0x62, 0x06, 0xd0, 0xed, 0x4a, 0x29, 0xb6, 0x46, 0xa6, ++ 0xe3, 0x54, 0xb5, 0x44, 0x9e, 0x51, 0x69, 0xdd, 0xd8, 0xdb, 0x63, 0xf9, ++ 0xd9, 0xf3, 0x75, 0xf0, 0x7c, 0x7e, 0x59, 0x4b, 0x07, 0xb0, 0x84, 0x61, ++ 0xf5, 0x10, 0xd0, 0xb7, 0x0f, 0xdd, 0xb9, 0xd2, 0x02, 0x3a, 0x9e, 0x1e, ++ 0x41, 0x97, 0x9e, 0xc1, 0x4e, 0x10, 0xa5, 0x6a, 0xc9, 0x0e, 0x3b, 0x45, ++ 0x1f, 0xe1, 0x77, 0xda, 0x43, 0x83, 0x94, 0xc7, 0xf3, 0x22, 0x89, 0x69, ++ 0x00, 0x6f, 0x45, 0xf8, 0x58, 0x6d, 0x7e, 0x18, 0xe8, 0x14, 0xdb, 0x0e, ++ 0x74, 0x1a, 0x71, 0x34, 0x72, 0x04, 0x96, 0x68, 0xd4, 0x1f, 0x4b, 0x15, ++ 0xda, 0xe8, 0x15, 0x36, 0x59, 0xd9, 0x04, 0x40, 0x53, 0xf8, 0xb5, 0x38, ++ 0xa5, 0x1b, 0xd2, 0x23, 0x1a, 0x02, 0x7a, 0x2c, 0x21, 0xd1, 0x5d, 0xd0, ++ 0x3f, 0x50, 0x1d, 0x65, 0xf1, 0xca, 0x41, 0xc2, 0x91, 0x8d, 0xff, 0xc3, ++ 0x21, 0xa6, 0xb7, 0xc2, 0x9c, 0xdf, 0x3b, 0x22, 0x94, 0xdf, 0xa5, 0xb4, ++ 0x3c, 0xf8, 0xb9, 0x3c, 0x74, 0xf0, 0xf7, 0xa7, 0xab, 0x09, 0xfa, 0x17, ++ 0x1d, 0x05, 0x55, 0x66, 0xa6, 0xfd, 0x42, 0xf0, 0xbb, 0xe0, 0x7f, 0xa1, ++ 0x0f, 0xdd, 0xed, 0x8e, 0x7c, 0x0a, 0x3e, 0x1f, 0x4f, 0xcb, 0x72, 0x62, ++ 0xa2, 0x5f, 0xf3, 0x01, 0x89, 0x3d, 0x0b, 0x78, 0xa0, 0xab, 0x47, 0xf9, ++ 0xd3, 0x42, 0xdd, 0xe8, 0xdf, 0x09, 0xb9, 0x9a, 0x13, 0x39, 0x36, 0x63, ++ 0x08, 0xc4, 0x51, 0xab, 0xc3, 0x55, 0x8a, 0x6d, 0xbf, 0x7e, 0x8f, 0xf3, ++ 0xdd, 0x42, 0xdd, 0xfa, 0x25, 0xf4, 0x9f, 0x7f, 0xed, 0xc2, 0x8e, 0x42, ++ 0x8a, 0x87, 0x71, 0x77, 0x92, 0x08, 0xa8, 0xd9, 0xab, 0xaf, 0x5d, 0x48, ++ 0xec, 0xfc, 0xfe, 0xeb, 0xfe, 0xf6, 0xd1, 0x17, 0x51, 0xbe, 0xee, 0xec, ++ 0x41, 0xb7, 0x74, 0xa0, 0x7e, 0x3d, 0x7c, 0x7d, 0x57, 0x4a, 0xd1, 0x57, ++ 0xed, 0x7c, 0x48, 0xc7, 0x79, 0x0d, 0xc7, 0x29, 0xeb, 0x89, 0xcb, 0x36, ++ 0xbd, 0x93, 0xc7, 0xf1, 0xac, 0xcc, 0xec, 0xe7, 0x4f, 0x13, 0x44, 0xb3, ++ 0xee, 0x96, 0x84, 0x0a, 0xf4, 0xa9, 0x9a, 0x13, 0x51, 0x24, 0xdb, 0x3a, ++ 0xae, 0xae, 0x77, 0xda, 0xf3, 0x94, 0xdf, 0xdf, 0x86, 0x71, 0xdd, 0x7c, ++ 0x3a, 0x9f, 0xb4, 0x78, 0xc8, 0x39, 0xec, 0x1f, 0xa3, 0xa4, 0x58, 0x1f, ++ 0xc0, 0x3b, 0xa7, 0xac, 0xa7, 0x1d, 0xe0, 0xd3, 0x42, 0x51, 0xf4, 0xf7, ++ 0x28, 0xdc, 0xa7, 0xe1, 0xf9, 0x17, 0x00, 0xf7, 0x27, 0x67, 0x83, 0xfb, ++ 0x6d, 0x88, 0x75, 0x80, 0xde, 0x8c, 0xd4, 0x5a, 0x43, 0xc2, 0x08, 0x9f, ++ 0xaa, 0x5c, 0x04, 0x7e, 0x54, 0xaa, 0xbd, 0x30, 0x0c, 0x78, 0x3f, 0xa6, ++ 0x02, 0xde, 0x29, 0x9e, 0x35, 0xc5, 0x86, 0xe7, 0xc1, 0xca, 0xf9, 0xbd, ++ 0x7c, 0xbf, 0x18, 0x48, 0xde, 0xdb, 0xe1, 0x0f, 0xb4, 0x97, 0x63, 0x05, ++ 0x0a, 0x6d, 0x3f, 0x44, 0x67, 0x72, 0x4a, 0x7a, 0x8f, 0x11, 0xe6, 0x77, ++ 0x39, 0xe3, 0x97, 0xc2, 0x6e, 0x0e, 0x86, 0x08, 0xc6, 0x59, 0xf3, 0xe6, ++ 0xf4, 0x12, 0xf0, 0xd7, 0x2e, 0x3c, 0xaa, 0xa0, 0xbd, 0x3b, 0x74, 0x0e, ++ 0x91, 0xc0, 0x0e, 0x13, 0x76, 0xed, 0x10, 0xd7, 0x79, 0xc3, 0x46, 0xb0, ++ 0x9b, 0xa9, 0xfc, 0xdc, 0xd3, 0x1a, 0x42, 0x21, 0xba, 0xd0, 0xe8, 0x3b, ++ 0x0a, 0xe7, 0x00, 0x1b, 0x8b, 0x65, 0x66, 0x1f, 0x4f, 0xf9, 0x70, 0x18, ++ 0xf4, 0xff, 0x51, 0x6d, 0x6f, 0x08, 0xfc, 0x41, 0xb3, 0xe6, 0xc3, 0xf5, ++ 0x37, 0x84, 0xc1, 0xde, 0x0e, 0x63, 0xfb, 0x75, 0xad, 0x11, 0xbe, 0xff, ++ 0xd4, 0x60, 0x99, 0x98, 0xf3, 0xe6, 0xde, 0x5d, 0x74, 0xfe, 0x8d, 0x21, ++ 0x3f, 0xda, 0xcb, 0x77, 0xb7, 0x56, 0x88, 0x78, 0x2d, 0xc2, 0x3d, 0x44, ++ 0xc4, 0x7b, 0xe7, 0x30, 0xfb, 0x5e, 0xc4, 0x85, 0x05, 0x5c, 0xb4, 0xbf, ++ 0xce, 0x83, 0xad, 0x8e, 0xf6, 0x24, 0x64, 0xc3, 0x5b, 0xa9, 0xad, 0x7f, ++ 0x98, 0xe9, 0x9b, 0x81, 0xfa, 0xe7, 0x54, 0x3b, 0xf1, 0xde, 0xdf, 0xdf, ++ 0x1a, 0x5c, 0x7f, 0x88, 0xf7, 0xdb, 0xfb, 0xd7, 0x5a, 0xbd, 0x47, 0x21, ++ 0x3e, 0x67, 0xf2, 0xb8, 0xbf, 0xd0, 0x7b, 0x41, 0xde, 0xc6, 0xac, 0x91, ++ 0xd1, 0x7f, 0x16, 0x78, 0xf6, 0x56, 0x38, 0xe3, 0x72, 0x09, 0x3e, 0x7f, ++ 0x36, 0x7e, 0x71, 0xcf, 0x47, 0xc2, 0x7e, 0xc7, 0xfa, 0x49, 0xbc, 0x11, ++ 0xe1, 0x5b, 0xc9, 0xe5, 0x22, 0xdb, 0x38, 0x1d, 0x5c, 0x3f, 0x8a, 0xba, ++ 0x87, 0x64, 0xb6, 0xdb, 0x96, 0x2b, 0x7c, 0x9f, 0xe4, 0xe7, 0x52, 0x26, ++ 0x9f, 0xeb, 0x47, 0x96, 0x13, 0x1f, 0x17, 0x0a, 0xfa, 0x1d, 0xe2, 0xf8, ++ 0x33, 0x99, 0xbc, 0x0b, 0xbf, 0x06, 0xe3, 0x01, 0x8a, 0x7d, 0x3e, 0xb6, ++ 0x0e, 0xac, 0x63, 0x9c, 0x26, 0xce, 0xf4, 0xb1, 0x0b, 0x7e, 0xd1, 0x5f, ++ 0xe3, 0xfd, 0xb3, 0xc1, 0xa1, 0xb9, 0xc7, 0x3b, 0x4e, 0xc7, 0x99, 0x6c, ++ 0x1b, 0xc7, 0x05, 0x67, 0x36, 0xf8, 0xdc, 0xe7, 0x64, 0xe4, 0x6d, 0xe7, ++ 0x38, 0xd9, 0xf5, 0x97, 0xab, 0xdf, 0xc9, 0xc1, 0xd1, 0xe1, 0x8c, 0x7e, ++ 0xc4, 0x26, 0xf7, 0x58, 0xcf, 0x77, 0xd5, 0x87, 0xb9, 0xda, 0x97, 0xba, ++ 0xde, 0x9f, 0xe7, 0x7a, 0x5f, 0xe5, 0xaa, 0x5f, 0xe2, 0x6a, 0x3f, 0xcd, ++ 0x55, 0xff, 0xaa, 0xab, 0xfd, 0x3c, 0x57, 0xfd, 0x1a, 0x57, 0xfb, 0x45, ++ 0xae, 0xf7, 0x4b, 0x5d, 0xef, 0x57, 0xba, 0xea, 0xff, 0xd5, 0xd9, 0xbe, ++ 0x72, 0xc9, 0xa7, 0xc3, 0xef, 0xff, 0x67, 0x78, 0x12, 0x72, 0x75, 0x26, ++ 0x5e, 0x92, 0x8e, 0x73, 0x5e, 0xb7, 0x5c, 0x95, 0x92, 0xd4, 0xa8, 0x14, ++ 0x2d, 0x77, 0xe6, 0xbd, 0xb0, 0x18, 0x5e, 0xf5, 0x2a, 0x92, 0x7a, 0x02, ++ 0xe6, 0x11, 0xf1, 0x2d, 0x92, 0x9a, 0x60, 0xf7, 0x63, 0x7f, 0x6f, 0xc4, ++ 0x7e, 0x07, 0xfb, 0xd8, 0xce, 0x8f, 0x2d, 0x7f, 0x94, 0xca, 0xd5, 0xee, ++ 0xc4, 0x8b, 0x41, 0xd8, 0xdf, 0xc4, 0xf3, 0x93, 0xd2, 0xeb, 0xc1, 0xf1, ++ 0x61, 0x6a, 0x1f, 0x6a, 0xa9, 0x15, 0x2c, 0x1e, 0x94, 0x40, 0xb9, 0xf1, ++ 0x13, 0xf5, 0xcd, 0xde, 0x0a, 0xa0, 0x92, 0x84, 0x71, 0x34, 0xdd, 0x68, ++ 0x40, 0x94, 0xeb, 0x65, 0xf4, 0xb9, 0x4d, 0x5f, 0x79, 0x49, 0x14, 0xe9, ++ 0xac, 0x8d, 0x70, 0x3e, 0x27, 0x09, 0x26, 0x87, 0x65, 0x10, 0xa0, 0xa2, ++ 0xe3, 0xc5, 0x37, 0x6b, 0x68, 0xef, 0xc5, 0x47, 0x92, 0xe4, 0x58, 0x90, ++ 0xe7, 0x02, 0x36, 0x3e, 0xb6, 0x2f, 0x4d, 0xc3, 0x3b, 0x49, 0x65, 0xfa, ++ 0x29, 0x14, 0x4d, 0xd4, 0x82, 0x0c, 0x0f, 0xab, 0xef, 0x3e, 0x02, 0xa5, ++ 0x1b, 0x4f, 0xa1, 0xe9, 0xf1, 0x89, 0xcf, 0x51, 0xbd, 0x4c, 0xee, 0x63, ++ 0x7e, 0xf9, 0xee, 0x99, 0x4e, 0xbf, 0xfa, 0x1a, 0x3e, 0xce, 0x02, 0xf5, ++ 0x9c, 0xfd, 0xd4, 0x97, 0x27, 0x29, 0xe9, 0xf1, 0x77, 0x7f, 0xdb, 0x88, ++ 0xb4, 0xd1, 0x26, 0xbb, 0x01, 0x08, 0x5a, 0x8f, 0x7f, 0x5b, 0x4f, 0x42, ++ 0x7c, 0x63, 0x14, 0xc4, 0xeb, 0xd8, 0x21, 0x02, 0xc6, 0xeb, 0x46, 0x12, ++ 0xfe, 0x8f, 0xc7, 0xe5, 0x46, 0xc0, 0xdf, 0xb4, 0xdf, 0x48, 0xe3, 0x28, ++ 0xc6, 0xdf, 0xc2, 0x8d, 0xe6, 0xd3, 0xa0, 0xf3, 0xbe, 0xae, 0x96, 0x23, ++ 0x5c, 0x0f, 0x49, 0x7d, 0xe3, 0x61, 0x3e, 0x39, 0xe7, 0xe4, 0x44, 0x76, ++ 0xbe, 0xf7, 0xd7, 0x4f, 0x30, 0x1e, 0xcf, 0xf1, 0x15, 0xba, 0x7b, 0x72, ++ 0x6f, 0x1c, 0xe2, 0x29, 0x9b, 0xb4, 0xc8, 0x58, 0xc4, 0x73, 0x04, 0xf1, ++ 0x4c, 0xfd, 0xf1, 0x76, 0x6f, 0x15, 0xb0, 0x09, 0xc3, 0xef, 0x6a, 0xd8, ++ 0x7d, 0xd9, 0x73, 0x35, 0x90, 0x0f, 0xe7, 0x2e, 0x9c, 0x1e, 0xa0, 0x7f, ++ 0x69, 0xe9, 0x03, 0x7e, 0x82, 0x7d, 0x91, 0xa4, 0xb0, 0x1e, 0x20, 0xbd, ++ 0x58, 0xcf, 0xe5, 0x76, 0x6e, 0x85, 0x5a, 0x82, 0xeb, 0xcf, 0xe3, 0x7e, ++ 0x26, 0x21, 0x11, 0x09, 0xec, 0x8f, 0xd0, 0xe5, 0x99, 0xfd, 0xf2, 0xa8, ++ 0x54, 0x5b, 0xa1, 0x5e, 0x94, 0x8e, 0x5b, 0x4a, 0x61, 0x16, 0x9f, 0x94, ++ 0x36, 0x3c, 0xf7, 0x67, 0x09, 0xe2, 0x5a, 0x15, 0x24, 0xcc, 0xec, 0x17, ++ 0x1e, 0x27, 0x5c, 0xa7, 0x48, 0x9f, 0x40, 0xfc, 0xd5, 0x1c, 0x9c, 0xbd, ++ 0x18, 0xfa, 0xa6, 0x93, 0xae, 0x44, 0x6d, 0x21, 0x73, 0x6d, 0xfe, 0xe5, ++ 0xb5, 0xaa, 0xf0, 0xf3, 0x18, 0xbe, 0xc6, 0x84, 0xd8, 0xfa, 0x43, 0x9b, ++ 0xb4, 0x16, 0xf0, 0x6b, 0x76, 0xcf, 0x76, 0xf2, 0x81, 0x68, 0xaf, 0x9e, ++ 0x3b, 0x1f, 0x6c, 0x99, 0x30, 0xe6, 0x8b, 0xe3, 0x83, 0x7c, 0x75, 0x4c, ++ 0x16, 0x3e, 0xb8, 0xd6, 0x84, 0x78, 0xb5, 0x14, 0xa7, 0x78, 0xcb, 0x19, ++ 0x3c, 0xde, 0x4c, 0xc5, 0xfa, 0xa6, 0x8a, 0xeb, 0x24, 0x38, 0xee, 0x0f, ++ 0x24, 0xeb, 0x3a, 0x7b, 0x5d, 0x25, 0xd6, 0xf5, 0x6a, 0x61, 0xba, 0xfe, ++ 0x6b, 0x25, 0xba, 0x08, 0xde, 0xc7, 0xa7, 0x91, 0x8a, 0x16, 0x23, 0x3d, ++ 0x0e, 0x7d, 0x7e, 0x23, 0xb4, 0xcb, 0xf0, 0xbc, 0x31, 0x53, 0xfb, 0x71, ++ 0x3c, 0x6e, 0x4b, 0xf7, 0x67, 0xdc, 0xc7, 0xcb, 0xb9, 0x0e, 0x18, 0xba, ++ 0xdd, 0x94, 0xc1, 0x9e, 0x2c, 0xe9, 0x5a, 0xe9, 0xb7, 0xe7, 0xb9, 0x94, ++ 0xf3, 0xfd, 0xfa, 0x91, 0xae, 0xfd, 0x3e, 0x58, 0xef, 0xb6, 0xa6, 0xb3, ++ 0xdb, 0x47, 0xf7, 0xb4, 0x22, 0xf3, 0x67, 0x6d, 0x17, 0x94, 0x7a, 0xa2, ++ 0x40, 0x0f, 0x72, 0x91, 0x4a, 0xf6, 0x64, 0x38, 0xc7, 0xfe, 0x29, 0xe7, ++ 0xef, 0xfe, 0xf6, 0x2e, 0xfb, 0x70, 0x46, 0x7b, 0xbc, 0x16, 0xfa, 0xe7, ++ 0xd7, 0xcb, 0x04, 0xe2, 0xd1, 0x74, 0x9f, 0x47, 0xfb, 0xae, 0x84, 0xfb, ++ 0xb5, 0x5b, 0xa6, 0xc6, 0x25, 0x8d, 0xca, 0xe1, 0x7d, 0x5b, 0x09, 0xda, ++ 0xc9, 0xf9, 0xed, 0x8b, 0x7c, 0xf6, 0xf5, 0x14, 0xf3, 0xf5, 0x6c, 0x99, ++ 0x53, 0xe4, 0x07, 0xbb, 0x65, 0x47, 0xc3, 0xa2, 0xaf, 0xa2, 0x9f, 0x40, ++ 0xed, 0x7f, 0x05, 0xfd, 0xde, 0xd8, 0x7a, 0x18, 0xbf, 0xb8, 0x8e, 0x9d, ++ 0xf7, 0xbb, 0xe1, 0xbb, 0x9b, 0xaf, 0x2f, 0xd1, 0xc0, 0xf0, 0xe4, 0x7e, ++ 0x9f, 0xa3, 0x91, 0x58, 0x26, 0x39, 0xfc, 0xa9, 0xca, 0xcf, 0x1f, 0x54, ++ 0xea, 0x3e, 0x16, 0xa5, 0xcf, 0x51, 0xee, 0x3e, 0x72, 0xfb, 0x2f, 0xc6, ++ 0xd3, 0xf9, 0xca, 0x6b, 0xe4, 0x88, 0x2f, 0x9c, 0x86, 0x73, 0x5c, 0xbf, ++ 0xdd, 0xd4, 0x8b, 0xf8, 0xca, 0xb9, 0x44, 0x35, 0xd7, 0x83, 0x1e, 0xee, ++ 0xd2, 0x1c, 0xf6, 0xe6, 0x8e, 0xed, 0xf7, 0x6e, 0x6d, 0x80, 0x73, 0x3f, ++ 0xfa, 0x1c, 0xd4, 0xc1, 0xc3, 0x5f, 0x6e, 0x19, 0x16, 0xa5, 0x70, 0x3d, ++ 0xf2, 0xb5, 0xc5, 0xcf, 0x2f, 0x01, 0xbe, 0xef, 0x90, 0x09, 0xe8, 0x23, ++ 0x01, 0x87, 0x51, 0xe9, 0xb4, 0x77, 0x9f, 0xee, 0x97, 0x33, 0xe7, 0xbc, ++ 0x74, 0xdc, 0x5a, 0xc4, 0x4b, 0xc3, 0xd9, 0xfd, 0xa7, 0x4f, 0x8b, 0x8f, ++ 0xad, 0x5c, 0xce, 0xb3, 0xf1, 0x89, 0x7b, 0x5f, 0x75, 0xf3, 0xc1, 0xb9, ++ 0xec, 0x0f, 0x57, 0x28, 0x9f, 0x7d, 0x7d, 0x07, 0x40, 0x0e, 0xe9, 0xb8, ++ 0x45, 0xdc, 0xef, 0x1b, 0x5a, 0x1f, 0x96, 0x7a, 0x8d, 0xb4, 0x1c, 0x09, ++ 0x3f, 0x45, 0xcc, 0x53, 0xc4, 0xf9, 0x2c, 0x7f, 0xce, 0xbd, 0x3e, 0xe0, ++ 0xb3, 0xad, 0xf5, 0x55, 0x28, 0x3f, 0xa7, 0xe7, 0x2c, 0x92, 0x40, 0x9f, ++ 0x6c, 0x86, 0x96, 0x19, 0xf4, 0x84, 0x98, 0x2f, 0x1b, 0x3c, 0x39, 0x9e, ++ 0x04, 0xe6, 0x4b, 0x6c, 0x6d, 0xb8, 0x57, 0xca, 0x84, 0xb7, 0xe2, 0x18, ++ 0x8b, 0x17, 0xb9, 0x9f, 0xd7, 0x7a, 0x18, 0x9d, 0x37, 0xa8, 0x09, 0x09, ++ 0xfa, 0x67, 0x6b, 0x37, 0xda, 0xc3, 0xf5, 0x35, 0x97, 0xab, 0x62, 0xbe, ++ 0xae, 0xd0, 0xd4, 0x54, 0x14, 0xf0, 0x55, 0x14, 0x51, 0xc9, 0x5d, 0x14, ++ 0x5f, 0xf7, 0xcd, 0x59, 0x54, 0x5b, 0x0e, 0x7c, 0x47, 0xe5, 0x10, 0xe2, ++ 0x2b, 0x33, 0xea, 0x08, 0xda, 0x0b, 0xc5, 0x16, 0x3b, 0x27, 0x32, 0x29, ++ 0xbe, 0x9e, 0xa4, 0xfb, 0xde, 0x96, 0x06, 0x12, 0x49, 0xd1, 0x76, 0x5b, ++ 0x2c, 0x0d, 0xcf, 0x61, 0xdc, 0x72, 0xe8, 0xe6, 0xc7, 0x2d, 0x0d, 0x67, ++ 0xd7, 0x2f, 0xc4, 0xb2, 0xb5, 0xa7, 0xfc, 0xef, 0xf1, 0x18, 0xec, 0x3c, ++ 0xb7, 0x8c, 0x94, 0x81, 0x3d, 0x75, 0xdf, 0x00, 0xfe, 0xdb, 0x60, 0xf1, ++ 0x1b, 0x6a, 0x90, 0x59, 0xbc, 0x74, 0x46, 0xd5, 0x00, 0xfa, 0xbc, 0xed, ++ 0x5c, 0xe3, 0x98, 0xf3, 0xbf, 0x0c, 0xfc, 0x38, 0x63, 0x90, 0x79, 0x00, ++ 0x2e, 0x7d, 0x41, 0x9e, 0xd9, 0x3a, 0xbb, 0xbc, 0x00, 0xe2, 0x21, 0x54, ++ 0x5f, 0x90, 0x4c, 0xf8, 0x71, 0xea, 0x87, 0x81, 0xf0, 0xe1, 0xc6, 0xff, ++ 0x85, 0x80, 0xcf, 0xf3, 0xbf, 0x38, 0x7c, 0xba, 0xdf, 0x17, 0x78, 0x78, ++ 0x1c, 0x70, 0x90, 0xf8, 0xd8, 0x50, 0x5f, 0xfa, 0x3f, 0x20, 0x65, 0x32, ++ 0x5b, 0x7b, 0xf7, 0x7a, 0x44, 0x3f, 0x91, 0x17, 0xf6, 0x15, 0xd2, 0xa7, ++ 0x80, 0xfc, 0x5b, 0xc0, 0xa1, 0x63, 0xc0, 0xab, 0x88, 0x60, 0x39, 0x83, ++ 0x44, 0xb1, 0x3c, 0xa6, 0xc6, 0xa2, 0x1e, 0xda, 0x7e, 0x16, 0x69, 0xc1, ++ 0x7a, 0x1d, 0x49, 0x60, 0xb9, 0x44, 0x35, 0x19, 0x9d, 0x79, 0x1e, 0x8c, ++ 0x38, 0xef, 0x56, 0xa7, 0x33, 0xbe, 0x1f, 0x77, 0x31, 0x49, 0xc2, 0xb9, ++ 0x33, 0x99, 0x3a, 0x8f, 0x1f, 0x06, 0xab, 0xd6, 0x09, 0x9d, 0x60, 0x28, ++ 0xf5, 0x93, 0x0c, 0x7e, 0x15, 0x21, 0x77, 0xe1, 0x78, 0xc3, 0x5d, 0xfb, ++ 0xb1, 0x88, 0x53, 0x0c, 0x6d, 0x4a, 0xcc, 0xa9, 0xa2, 0xe3, 0x0e, 0x9f, ++ 0xc3, 0xf2, 0x3e, 0x87, 0xd7, 0xec, 0x77, 0xec, 0x63, 0x41, 0x2e, 0x3f, ++ 0x62, 0xbc, 0x6d, 0x35, 0x83, 0xdb, 0x9f, 0x1f, 0x76, 0xed, 0xcf, 0x0f, ++ 0xab, 0xbd, 0x3a, 0xd0, 0xe7, 0xe1, 0x9a, 0xbb, 0xda, 0x60, 0xbb, 0x51, ++ 0xf3, 0xdf, 0x0e, 0x65, 0xea, 0x3f, 0xae, 0xcb, 0x89, 0xd7, 0x8d, 0x1f, ++ 0x77, 0xfb, 0xa2, 0x19, 0xe0, 0xd9, 0xd6, 0x70, 0xd0, 0x07, 0x79, 0x63, ++ 0xdb, 0x6a, 0x32, 0xe7, 0xc5, 0xba, 0xe1, 0xc8, 0xf6, 0x7e, 0x5c, 0x96, ++ 0x73, 0xa6, 0xaf, 0x78, 0xd9, 0x39, 0xd3, 0xb6, 0x3c, 0xfd, 0x1b, 0x2c, ++ 0x59, 0x67, 0x95, 0x23, 0x2f, 0x81, 0x28, 0x46, 0x89, 0x7d, 0xde, 0x6d, ++ 0x1f, 0x93, 0xbc, 0xe8, 0x59, 0xf5, 0x89, 0x53, 0x5e, 0x36, 0x79, 0x78, ++ 0x7e, 0x48, 0x80, 0x04, 0x80, 0xff, 0xb3, 0xe1, 0x43, 0x94, 0x5f, 0x34, ++ 0x1e, 0x1e, 0x99, 0xd6, 0xb2, 0x34, 0x9a, 0xa1, 0x7f, 0xb9, 0x97, 0xc9, ++ 0x4d, 0x47, 0x1e, 0x89, 0xc3, 0xb9, 0xf4, 0x23, 0xaf, 0xaa, 0x8c, 0xff, ++ 0xb8, 0x1e, 0x9e, 0xfc, 0x8d, 0x70, 0x12, 0xec, 0x85, 0x0e, 0x50, 0x12, ++ 0x54, 0xff, 0x3e, 0x52, 0xcb, 0xf8, 0x73, 0x72, 0x1e, 0x7f, 0xff, 0x40, ++ 0x18, 0xf3, 0xab, 0x86, 0x77, 0x91, 0xb8, 0x46, 0xf7, 0xb3, 0xe1, 0xaf, ++ 0x34, 0xdc, 0x97, 0x47, 0xdb, 0xdd, 0xd3, 0x40, 0x3d, 0x48, 0xdb, 0xf3, ++ 0x7b, 0xaa, 0x5f, 0xec, 0x84, 0x73, 0xe2, 0x27, 0x5e, 0x92, 0x31, 0xae, ++ 0x3b, 0xd9, 0xd7, 0xa3, 0x47, 0x28, 0x3c, 0x35, 0x7c, 0x1f, 0xdc, 0xd6, ++ 0xf0, 0x22, 0xe6, 0x27, 0xc7, 0xb7, 0xab, 0x91, 0xb1, 0xa8, 0xdf, 0x25, ++ 0x22, 0x4d, 0x46, 0x6f, 0x1e, 0xe9, 0x21, 0xe0, 0x7d, 0xca, 0xa3, 0x32, ++ 0xba, 0x55, 0xdf, 0xeb, 0x0b, 0xc3, 0xfe, 0x15, 0xee, 0xd5, 0x23, 0x14, ++ 0x3f, 0xb7, 0x4e, 0x79, 0x51, 0x0f, 0xd3, 0xf2, 0x9e, 0x11, 0x29, 0x1d, ++ 0xd6, 0xb9, 0xa1, 0xe6, 0x5e, 0xe4, 0xf3, 0xfd, 0x0d, 0xa5, 0x5f, 0x2f, ++ 0x47, 0xb4, 0x3a, 0xf3, 0x4e, 0x66, 0x29, 0x53, 0x7b, 0x2c, 0x3a, 0xdf, ++ 0x86, 0x06, 0x76, 0x6e, 0x97, 0xd7, 0x9b, 0xd2, 0xbd, 0x10, 0x67, 0xad, ++ 0x57, 0xc9, 0x65, 0x14, 0xbe, 0xa0, 0xc1, 0xd6, 0x7b, 0x4f, 0x07, 0x49, ++ 0xde, 0x25, 0x01, 0x1c, 0x8c, 0xbe, 0x12, 0x99, 0x8b, 0x7e, 0x71, 0xb1, ++ 0x2b, 0xaf, 0xab, 0xc8, 0x95, 0xf7, 0x66, 0x56, 0xcf, 0x7a, 0x07, 0xf2, ++ 0x59, 0x4c, 0x38, 0xe7, 0x87, 0x45, 0x28, 0x4d, 0xf7, 0x5d, 0x00, 0xfa, ++ 0xb6, 0x59, 0x66, 0xee, 0x96, 0x2b, 0x3f, 0xda, 0xa8, 0xb6, 0xde, 0x81, ++ 0xfc, 0x80, 0x59, 0xca, 0x21, 0x1f, 0xe4, 0x5f, 0x6d, 0x6d, 0x57, 0x4d, ++ 0xdc, 0xff, 0x5c, 0xe3, 0xba, 0xd7, 0x61, 0x92, 0xd8, 0x11, 0x4b, 0xc2, ++ 0x71, 0xe2, 0xe0, 0x07, 0x6e, 0xbd, 0x9f, 0xed, 0x93, 0xe6, 0x44, 0x23, ++ 0x12, 0x0f, 0x43, 0x57, 0x0e, 0xb7, 0x49, 0xe1, 0x1e, 0x42, 0xa7, 0x6c, ++ 0x77, 0xc2, 0x2d, 0xf0, 0xea, 0x9e, 0xc7, 0x9d, 0x77, 0xfd, 0x8e, 0xe0, ++ 0xe7, 0xe1, 0x64, 0x2c, 0xe8, 0x21, 0x11, 0x6f, 0x16, 0xf0, 0xbb, 0xf9, ++ 0xb6, 0xa0, 0x2a, 0x79, 0xe0, 0x45, 0x0a, 0xc7, 0xb6, 0x97, 0x0c, 0xdc, ++ 0xaf, 0xb7, 0xd5, 0xbc, 0xf8, 0xcd, 0x66, 0xd8, 0xe7, 0x2b, 0xbc, 0x98, ++ 0x37, 0xf1, 0xd5, 0x0f, 0xf7, 0x36, 0xfd, 0x88, 0x96, 0xbf, 0xfc, 0xe3, ++ 0xc1, 0x32, 0x28, 0x2f, 0x2f, 0xde, 0x5d, 0xdd, 0x4c, 0xdb, 0x05, 0x78, ++ 0xbe, 0x84, 0x88, 0xe7, 0x15, 0xc1, 0xc8, 0x68, 0xbf, 0x72, 0xbd, 0xc6, ++ 0xf9, 0x81, 0x54, 0xee, 0x68, 0xf7, 0x14, 0xe0, 0x23, 0xcc, 0xa3, 0xb8, ++ 0xe7, 0x69, 0x1f, 0xd2, 0xab, 0xb8, 0x5d, 0x4e, 0xfa, 0x80, 0x3e, 0x6a, ++ 0x8a, 0x00, 0x7f, 0x15, 0x5c, 0x92, 0x40, 0xbb, 0xe9, 0x9e, 0x6b, 0x7a, ++ 0x30, 0xe9, 0x22, 0x50, 0xdf, 0x2d, 0xc5, 0x6d, 0x72, 0x16, 0x10, 0xf6, ++ 0x43, 0x53, 0x4c, 0x82, 0xf3, 0xfb, 0xcb, 0xea, 0x13, 0xb3, 0x81, 0x0f, ++ 0x0d, 0x9e, 0x47, 0x68, 0x44, 0x12, 0x68, 0x1f, 0xcd, 0x54, 0x5e, 0xd0, ++ 0x31, 0xce, 0xce, 0xe9, 0x66, 0x72, 0x38, 0x84, 0xdc, 0xb9, 0xe9, 0x52, ++ 0xde, 0x90, 0xd2, 0x21, 0x2f, 0x65, 0x78, 0xbb, 0x1a, 0x01, 0x70, 0x87, ++ 0x37, 0xb5, 0xc8, 0x20, 0x2f, 0xe5, 0x35, 0x2c, 0x6f, 0xb9, 0xbc, 0xab, ++ 0x5b, 0xe2, 0x79, 0xc2, 0x98, 0x4f, 0x3f, 0x8e, 0x23, 0x71, 0x5c, 0xb4, ++ 0x91, 0xe5, 0x15, 0x6e, 0x67, 0xf8, 0x17, 0xf9, 0xdf, 0xc1, 0x26, 0x27, ++ 0xdd, 0x4c, 0x9e, 0xa7, 0x49, 0xfd, 0x0c, 0x19, 0xfc, 0xee, 0x92, 0x2e, ++ 0xd7, 0xfb, 0x68, 0x1d, 0xe6, 0x63, 0xba, 0xe9, 0x5a, 0xaa, 0xf1, 0xbc, ++ 0xa8, 0x72, 0x9e, 0x47, 0xc8, 0xf1, 0x30, 0x9c, 0xdb, 0xb3, 0x1b, 0x9a, ++ 0xf8, 0xf9, 0x9c, 0xa1, 0x27, 0xcf, 0x66, 0xcf, 0xee, 0xe7, 0xe7, 0x73, ++ 0x47, 0x61, 0xfd, 0xe3, 0xce, 0x7c, 0x3f, 0x29, 0x8b, 0xde, 0xbd, 0x02, ++ 0xf4, 0x2e, 0xd5, 0x37, 0x8a, 0x9c, 0xea, 0x44, 0xff, 0xed, 0x12, 0x19, ++ 0xfd, 0x37, 0x37, 0x1c, 0x1b, 0x9b, 0x98, 0xbe, 0xdb, 0xad, 0xc9, 0x0e, ++ 0xfb, 0xfd, 0xb3, 0xce, 0x7f, 0x1d, 0xd7, 0xfb, 0x8a, 0xdc, 0xdb, 0x09, ++ 0xeb, 0xfc, 0x5b, 0xcf, 0xdf, 0xd4, 0xbf, 0xfe, 0xbf, 0xcf, 0xfc, 0x77, ++ 0xfc, 0x9d, 0xe7, 0x5f, 0xff, 0x77, 0xc6, 0xff, 0xd6, 0xbf, 0xf3, 0xfa, ++ 0xf7, 0xfe, 0x8d, 0xd7, 0x5f, 0x57, 0x21, 0x39, 0xfc, 0xb3, 0x9d, 0x90, ++ 0x98, 0x42, 0xc7, 0xfb, 0xb1, 0x57, 0xc4, 0xd3, 0x9c, 0x7a, 0x5b, 0x91, ++ 0x33, 0xfb, 0xd9, 0x6f, 0x6a, 0xb2, 0x23, 0x9f, 0x58, 0xe4, 0x29, 0x4e, ++ 0xaf, 0xb7, 0x16, 0x6a, 0x78, 0x3e, 0x2e, 0x13, 0x7b, 0xfe, 0x8b, 0x18, ++ 0x6f, 0xa6, 0xf2, 0x7a, 0x27, 0xe8, 0xd3, 0xad, 0x5c, 0x9f, 0x52, 0x3d, ++ 0x4a, 0x20, 0x5f, 0x20, 0x77, 0x8a, 0xc8, 0x97, 0x61, 0xfa, 0xaf, 0x8e, ++ 0xeb, 0xbf, 0x3a, 0xae, 0xff, 0xf6, 0x67, 0xd1, 0xab, 0x55, 0x90, 0x2b, ++ 0x56, 0x80, 0x76, 0x05, 0xde, 0x07, 0x99, 0x44, 0x12, 0xe8, 0xc7, 0x04, ++ 0x8f, 0xaa, 0x98, 0x67, 0xbc, 0x9f, 0xd0, 0xed, 0x05, 0xf4, 0x5a, 0xd8, ++ 0x9b, 0x31, 0x2f, 0xbb, 0x88, 0xc3, 0xed, 0xd6, 0xa7, 0x45, 0x5c, 0x9f, ++ 0x56, 0xbd, 0xe0, 0x7a, 0xce, 0xf5, 0xa8, 0x7b, 0x7f, 0x2f, 0xe9, 0x8f, ++ 0x9b, 0x12, 0x8c, 0x9b, 0xfe, 0x77, 0x8d, 0xef, 0x8f, 0x2e, 0xbd, 0x2a, ++ 0xf0, 0xb0, 0xb5, 0x86, 0xd9, 0xc9, 0x05, 0xf3, 0x32, 0xdb, 0x81, 0x1b, ++ 0x5c, 0x74, 0x34, 0xaa, 0x5b, 0x30, 0xff, 0xc0, 0x4d, 0x8f, 0x37, 0x35, ++ 0xe6, 0x7f, 0x0b, 0x7a, 0x2c, 0xd4, 0xad, 0xd7, 0xb4, 0xc2, 0xec, 0xf4, ++ 0xee, 0xe5, 0xf4, 0xbe, 0x94, 0xd3, 0xfb, 0x57, 0x1a, 0xf3, 0x3f, 0x44, ++ 0xbe, 0x48, 0x36, 0x7a, 0xd7, 0x78, 0xd9, 0x3c, 0x17, 0x07, 0x8e, 0x87, ++ 0xda, 0x60, 0x35, 0xd1, 0x5a, 0xa4, 0x83, 0xc2, 0xe9, 0xa4, 0x90, 0x0d, ++ 0x3d, 0x18, 0xf7, 0x25, 0xb7, 0x12, 0xbb, 0x5f, 0xb9, 0xf1, 0x63, 0x6a, ++ 0x7f, 0x50, 0x7a, 0x6c, 0x33, 0x8c, 0xc8, 0x5d, 0xb4, 0x7e, 0x71, 0x01, ++ 0x91, 0x45, 0xd2, 0xfd, 0xc7, 0x93, 0xd3, 0xf9, 0xc4, 0x9e, 0x1e, 0x16, ++ 0x3f, 0x55, 0x0a, 0x34, 0x97, 0x9f, 0xe5, 0xb6, 0x7f, 0x75, 0xcc, 0x1b, ++ 0xdf, 0x66, 0xc9, 0xc9, 0x78, 0x09, 0xd8, 0x11, 0x3b, 0xb7, 0xad, 0x00, ++ 0x3b, 0xe2, 0x25, 0x7f, 0x04, 0xe2, 0x05, 0xdb, 0xf2, 0xba, 0x5e, 0x40, ++ 0x3f, 0x2e, 0x31, 0x49, 0x05, 0x38, 0x84, 0xbd, 0x48, 0x78, 0x5c, 0x16, ++ 0x4c, 0x09, 0x82, 0x76, 0x93, 0xfb, 0xdc, 0xc9, 0x69, 0xef, 0x6f, 0xfb, ++ 0xb8, 0x3b, 0x05, 0x76, 0x97, 0x59, 0x22, 0x61, 0xbc, 0xaf, 0x33, 0x7c, ++ 0x6f, 0x41, 0xc6, 0xfb, 0x78, 0x2e, 0x3b, 0xdf, 0xf0, 0x06, 0x1c, 0x71, ++ 0x03, 0x72, 0xd9, 0xe0, 0xec, 0xf5, 0xd5, 0x9c, 0xde, 0xd4, 0x4f, 0x2c, ++ 0xf4, 0xda, 0xe2, 0x94, 0xab, 0x03, 0xb3, 0x26, 0xb1, 0x73, 0xf3, 0x19, ++ 0x26, 0x9c, 0xef, 0x48, 0xd6, 0x2c, 0x19, 0xe2, 0xe8, 0xd9, 0xc6, 0x81, ++ 0x08, 0xef, 0x09, 0xdb, 0x79, 0xd3, 0x12, 0xd5, 0x1a, 0x09, 0xe3, 0x49, ++ 0xe0, 0x37, 0x56, 0xa4, 0xfd, 0x46, 0x42, 0x46, 0xb0, 0xb8, 0xbc, 0x58, ++ 0xff, 0x60, 0xef, 0x0f, 0x34, 0x2d, 0x61, 0xe7, 0xde, 0x1c, 0xaf, 0x05, ++ 0x97, 0x74, 0x7f, 0x2e, 0xfe, 0xa3, 0xf0, 0xf7, 0x45, 0x3b, 0x83, 0xda, ++ 0x6b, 0x99, 0xee, 0xef, 0xb8, 0xfd, 0xf0, 0x3a, 0x8f, 0x35, 0xc5, 0x7b, ++ 0xd1, 0xe0, 0xe1, 0x7f, 0x08, 0x18, 0x8e, 0xb6, 0x7f, 0xbe, 0x52, 0xa9, ++ 0xcb, 0x14, 0x37, 0xe8, 0xe5, 0xfa, 0x35, 0x70, 0xb4, 0x7b, 0xf6, 0x3c, ++ 0xba, 0xbe, 0xea, 0x17, 0x78, 0x5c, 0x9f, 0x9a, 0x6d, 0xf6, 0xf3, 0xb4, ++ 0x7b, 0x0a, 0xd4, 0x8c, 0xfd, 0x7f, 0xce, 0xe5, 0xe4, 0x57, 0x70, 0x39, ++ 0x12, 0xf5, 0x7a, 0x2a, 0x5e, 0x28, 0x61, 0x3e, 0x09, 0x81, 0x75, 0x09, ++ 0x79, 0x74, 0xcf, 0x3f, 0x91, 0xcf, 0x3b, 0xf1, 0x33, 0xce, 0xff, 0x12, ++ 0x97, 0xeb, 0x89, 0x5c, 0xae, 0x09, 0x89, 0xe0, 0x39, 0x4c, 0xb6, 0x79, ++ 0x6b, 0xb9, 0xde, 0x10, 0xe5, 0xa7, 0x9d, 0xb7, 0x97, 0xaf, 0xbb, 0x56, ++ 0x33, 0x79, 0xdc, 0xf7, 0xec, 0xf3, 0xce, 0xe5, 0xeb, 0x9c, 0xfb, 0x19, ++ 0xd7, 0x7b, 0x92, 0xcf, 0x3b, 0x77, 0x90, 0xeb, 0x5d, 0xc8, 0xe7, 0x5b, ++ 0xf8, 0x19, 0xe7, 0xfd, 0x88, 0xcf, 0xbb, 0x70, 0x90, 0xf3, 0xde, 0xcc, ++ 0xf1, 0x7b, 0xf3, 0x67, 0xc4, 0xb3, 0xaa, 0x4b, 0x7c, 0x9c, 0xc1, 0xe1, ++ 0xb9, 0x8d, 0xcf, 0xd7, 0xf6, 0x19, 0xe7, 0x35, 0xf9, 0xbc, 0x6d, 0x83, ++ 0x9c, 0x77, 0x33, 0xc7, 0xef, 0xe6, 0xcf, 0x88, 0xe7, 0x11, 0x7c, 0xde, ++ 0xcd, 0x2e, 0x3c, 0x67, 0x93, 0xdf, 0x9d, 0x9f, 0x71, 0xbe, 0x0a, 0x9d, ++ 0xc9, 0xcf, 0x6e, 0x2e, 0xbf, 0x6e, 0xbd, 0x26, 0xe6, 0x0f, 0x14, 0xcb, ++ 0x51, 0xe8, 0xbf, 0x2d, 0x44, 0xc7, 0xb1, 0xe9, 0xa9, 0xcb, 0xbd, 0x6c, ++ 0x7e, 0x51, 0x92, 0xd4, 0x27, 0xe8, 0xb7, 0x0e, 0xe7, 0xe7, 0xb9, 0x53, ++ 0x56, 0xdc, 0xb6, 0x28, 0x53, 0x5e, 0xb8, 0x68, 0xef, 0xde, 0x8f, 0xb3, ++ 0xcd, 0xf3, 0x4d, 0x1e, 0xa7, 0x11, 0xa5, 0x98, 0x27, 0xc8, 0xcf, 0x41, ++ 0xa7, 0x5c, 0x42, 0xe7, 0xc9, 0xb0, 0x3e, 0xd1, 0x7e, 0x22, 0x1c, 0x16, ++ 0x14, 0x66, 0x1f, 0x7f, 0x29, 0x87, 0x67, 0xe9, 0x39, 0xae, 0x43, 0xb4, ++ 0xaf, 0xd5, 0x98, 0x9e, 0xcd, 0x36, 0xfe, 0xed, 0x1c, 0x8e, 0xdb, 0x5d, ++ 0xf0, 0x0f, 0x34, 0xbe, 0x68, 0x3f, 0x77, 0x00, 0xf8, 0x3b, 0x39, 0x1c, ++ 0x9d, 0xe7, 0x08, 0xbf, 0x68, 0xbf, 0x70, 0x80, 0xf1, 0xbf, 0xcb, 0xe1, ++ 0xf8, 0xee, 0x39, 0xc2, 0x2f, 0xda, 0xdf, 0x3c, 0x00, 0x7e, 0x1e, 0xe6, ++ 0x70, 0x3c, 0x7c, 0x8e, 0xf0, 0x8b, 0xf6, 0x6d, 0x03, 0x8c, 0xff, 0x38, ++ 0x87, 0xe3, 0xf1, 0x73, 0x84, 0x5f, 0xb4, 0xdf, 0x3c, 0x00, 0x7e, 0x9e, ++ 0xe1, 0x70, 0x3c, 0x73, 0x8e, 0xf0, 0x8b, 0xf6, 0xbb, 0xfb, 0xe5, 0xdd, ++ 0x29, 0x7f, 0x86, 0xf8, 0xbe, 0x41, 0x84, 0x54, 0xc0, 0x3d, 0xef, 0x51, ++ 0xc4, 0x1f, 0xc1, 0xef, 0x1b, 0x44, 0x7a, 0x8f, 0xe0, 0xf7, 0x0d, 0x56, ++ 0x69, 0x61, 0xbc, 0x7f, 0xde, 0xed, 0xbe, 0x17, 0x65, 0xbb, 0x4f, 0x45, ++ 0x45, 0xfc, 0xc8, 0xed, 0xe5, 0x71, 0x68, 0xff, 0xe0, 0x12, 0x96, 0xa7, ++ 0xfc, 0xe0, 0x44, 0x82, 0x7e, 0xc4, 0x83, 0x85, 0x2c, 0x2f, 0xbf, 0x3f, ++ 0x9e, 0xc5, 0xed, 0xc1, 0x07, 0x27, 0xca, 0x18, 0x4f, 0x7a, 0x30, 0xe4, ++ 0xcc, 0x63, 0x36, 0xb8, 0x7f, 0xf6, 0x60, 0x84, 0xc7, 0x49, 0x46, 0xb0, ++ 0x3c, 0x66, 0xa3, 0x52, 0xdc, 0xa7, 0xa5, 0xd3, 0x15, 0x71, 0x13, 0x31, ++ 0x0c, 0xf9, 0x34, 0xec, 0x7e, 0x95, 0xb0, 0xf7, 0xc4, 0x3d, 0xab, 0xd5, ++ 0x2a, 0x9f, 0xdf, 0x22, 0xc9, 0x36, 0xda, 0xff, 0xc1, 0x4a, 0x56, 0xdf, ++ 0x36, 0x83, 0x24, 0xe5, 0x12, 0xdb, 0xfd, 0xab, 0x8a, 0x14, 0xde, 0x03, ++ 0x02, 0xc3, 0x16, 0xe2, 0xb0, 0xe9, 0xfb, 0x63, 0x16, 0x59, 0x55, 0x65, ++ 0xcb, 0xc3, 0x58, 0x95, 0xc2, 0x3c, 0x03, 0x95, 0xe7, 0x8b, 0x50, 0x84, ++ 0x10, 0x47, 0x3e, 0x86, 0xeb, 0xde, 0x96, 0x38, 0x37, 0xbc, 0x2a, 0x62, ++ 0xcd, 0x04, 0x35, 0x57, 0x52, 0xcd, 0xce, 0xf1, 0x4a, 0xa2, 0x4e, 0xff, ++ 0xa1, 0x09, 0x2e, 0x73, 0xd1, 0xf6, 0xbf, 0xe5, 0x7a, 0xd2, 0xac, 0xce, ++ 0x7c, 0xaf, 0x66, 0x9f, 0xce, 0xe2, 0xb2, 0x22, 0x5f, 0xf3, 0x4a, 0xbe, ++ 0x7e, 0x81, 0xb7, 0x2a, 0x4e, 0xcf, 0x8d, 0x73, 0xff, 0xd8, 0x33, 0x9d, ++ 0xae, 0xf3, 0xf9, 0xa9, 0x1e, 0xcc, 0x1f, 0x7d, 0xfe, 0x28, 0xc7, 0xe3, ++ 0x54, 0x25, 0xc9, 0xce, 0xcd, 0x89, 0x27, 0xd3, 0x7d, 0x9c, 0x6c, 0x71, ++ 0x36, 0xa3, 0xab, 0xe5, 0x69, 0x1f, 0xc5, 0xcf, 0x55, 0x2f, 0x90, 0x08, ++ 0x90, 0x31, 0xb0, 0xdd, 0xea, 0x08, 0x63, 0x5c, 0xed, 0x63, 0xe4, 0x3f, ++ 0x8c, 0xab, 0xd1, 0x79, 0xaf, 0xda, 0x9e, 0x50, 0x81, 0xff, 0x66, 0x77, ++ 0x85, 0xa7, 0x43, 0x3c, 0xf0, 0xca, 0x17, 0xc2, 0xab, 0xe1, 0xbb, 0x02, ++ 0xe3, 0xba, 0x48, 0xc4, 0x02, 0xf4, 0x7e, 0xfc, 0x2d, 0x1c, 0x27, 0xbf, ++ 0x9d, 0x44, 0x92, 0x8c, 0x54, 0x6d, 0x26, 0x8b, 0xf7, 0x39, 0xe3, 0x73, ++ 0xe2, 0xde, 0x2f, 0x8f, 0xcf, 0x41, 0x98, 0xda, 0xee, 0x5f, 0xce, 0xe6, ++ 0xeb, 0xae, 0x6a, 0x37, 0x3b, 0xe0, 0xc8, 0xae, 0x6a, 0x86, 0xd7, 0x61, ++ 0xbf, 0xce, 0xe6, 0x7e, 0xe6, 0x3f, 0x59, 0x5e, 0x87, 0x9f, 0x39, 0x9b, ++ 0xdf, 0x9f, 0x9e, 0xed, 0xf2, 0x33, 0xbb, 0x74, 0x67, 0xbc, 0xce, 0xe8, ++ 0x8a, 0xce, 0x84, 0x38, 0xb7, 0x72, 0xe5, 0x31, 0x4b, 0x07, 0xf8, 0xa3, ++ 0x92, 0x09, 0xd7, 0x52, 0xae, 0x8b, 0x6e, 0x56, 0xe1, 0x1c, 0x79, 0xf6, ++ 0xf6, 0x16, 0x76, 0xaf, 0x36, 0xcb, 0xb9, 0x56, 0xee, 0x03, 0xf3, 0x02, ++ 0x76, 0xfb, 0x5d, 0x9c, 0x63, 0xff, 0x6a, 0xfb, 0xd9, 0xed, 0x75, 0x11, ++ 0x67, 0x10, 0x71, 0x87, 0x97, 0xf9, 0x7d, 0xbc, 0x97, 0x78, 0x5e, 0x71, ++ 0x7f, 0x3e, 0x0a, 0xe7, 0x8f, 0xfc, 0x2b, 0x25, 0x07, 0x9f, 0x74, 0xe9, ++ 0x4c, 0x8f, 0x74, 0x01, 0x9f, 0x14, 0xfe, 0x27, 0x9f, 0x7c, 0xde, 0x7c, ++ 0xf2, 0x1b, 0xdd, 0x19, 0x7f, 0xe8, 0x82, 0x77, 0x54, 0x1e, 0xcb, 0x23, ++ 0x99, 0xcf, 0xe7, 0x1b, 0x75, 0xed, 0x3f, 0xe5, 0xf5, 0x0b, 0xa0, 0x43, ++ 0xd0, 0x97, 0x99, 0x0e, 0xa4, 0x29, 0xd7, 0x91, 0x47, 0x2c, 0xf2, 0xa9, ++ 0xdc, 0x78, 0x5b, 0xcb, 0xf1, 0x26, 0xea, 0x7a, 0x96, 0x7b, 0x2f, 0x23, ++ 0x7c, 0x7c, 0x9f, 0x75, 0xfb, 0xf5, 0xaf, 0xc7, 0x6a, 0x61, 0x5d, 0x22, ++ 0x4e, 0x43, 0xc8, 0x1d, 0xae, 0x73, 0xcd, 0xa9, 0x91, 0xb3, 0xc5, 0x25, ++ 0x14, 0x71, 0xee, 0x23, 0xbf, 0xae, 0xc0, 0x7a, 0x2a, 0x7c, 0x5c, 0xff, ++ 0xa8, 0x44, 0xc5, 0xf1, 0x5d, 0xeb, 0x40, 0xb9, 0x2f, 0x82, 0x7c, 0x43, ++ 0x0e, 0x83, 0x6b, 0xbc, 0x0e, 0xd0, 0x17, 0xde, 0xf4, 0xba, 0x3c, 0x65, ++ 0x51, 0x4b, 0xc2, 0xfb, 0xa2, 0x04, 0xcf, 0xf9, 0x20, 0x5f, 0x7d, 0x7f, ++ 0x25, 0xec, 0x8f, 0xa6, 0x63, 0xdd, 0x96, 0x8f, 0xed, 0x37, 0xeb, 0xf9, ++ 0x7d, 0xa1, 0xf5, 0x15, 0x6a, 0x32, 0x87, 0xe5, 0x55, 0x39, 0xbf, 0x5b, ++ 0x54, 0xb6, 0x53, 0xcf, 0x64, 0x57, 0x88, 0x12, 0xee, 0xa5, 0xda, 0xf3, ++ 0x3c, 0xdc, 0xf0, 0x6a, 0x65, 0xb1, 0xb8, 0x1d, 0x1e, 0x8d, 0xc3, 0xe3, ++ 0x1e, 0x67, 0x5e, 0x56, 0x78, 0x1a, 0x1d, 0xf1, 0xaf, 0x73, 0x85, 0xc7, ++ 0x3b, 0x9e, 0x90, 0x1e, 0xe0, 0x5b, 0x95, 0x72, 0x31, 0xf2, 0xef, 0xb7, ++ 0x1c, 0xe3, 0xc9, 0x15, 0x49, 0xd2, 0x9b, 0x29, 0x0e, 0xc5, 0xc7, 0x81, ++ 0xbb, 0x6a, 0xb8, 0x2e, 0x17, 0x5d, 0xb2, 0xcd, 0xaf, 0x8f, 0x70, 0xe6, ++ 0x3f, 0x69, 0x05, 0xce, 0xfb, 0x29, 0xaa, 0x91, 0xef, 0xca, 0x8f, 0x72, ++ 0xf1, 0x57, 0x7f, 0x5c, 0x68, 0x70, 0xf3, 0x89, 0xef, 0xf9, 0xac, 0xe1, ++ 0x7c, 0xd0, 0xce, 0xef, 0xa3, 0xb8, 0xfb, 0xfb, 0xd4, 0x04, 0x89, 0x64, ++ 0xc0, 0xbb, 0x2f, 0xec, 0xce, 0xc3, 0x48, 0x22, 0x1d, 0xbc, 0x21, 0xe7, ++ 0x77, 0x07, 0x3c, 0xa6, 0x0b, 0x6e, 0xd7, 0xf8, 0x1b, 0xe0, 0x59, 0x86, ++ 0xfc, 0x1b, 0xf7, 0xfd, 0xca, 0x75, 0x6a, 0x12, 0xed, 0xad, 0x38, 0x05, ++ 0x13, 0xf2, 0x3c, 0x3b, 0x38, 0x5f, 0xaa, 0x66, 0x12, 0xef, 0x65, 0x7d, ++ 0xc7, 0x27, 0x65, 0x5c, 0x3f, 0x89, 0x64, 0xde, 0x6f, 0xd5, 0xb2, 0xcc, ++ 0xf0, 0xbb, 0xef, 0x05, 0x69, 0x05, 0xf9, 0x4e, 0x3a, 0x64, 0xb9, 0x7f, ++ 0xbb, 0x4e, 0xc8, 0xbd, 0xb9, 0xdb, 0x02, 0x3e, 0x41, 0xd2, 0x84, 0xe1, ++ 0xff, 0xdc, 0x72, 0x7e, 0x28, 0x72, 0xb6, 0xfd, 0x3c, 0x47, 0xe8, 0x2d, ++ 0xe9, 0x37, 0xca, 0x27, 0x74, 0x49, 0x7b, 0x7c, 0xae, 0xef, 0x25, 0x0c, ++ 0x92, 0xbe, 0xea, 0x47, 0x43, 0xe0, 0xd2, 0x6a, 0xba, 0x4e, 0xf5, 0x2a, ++ 0xc4, 0x6b, 0xa9, 0x8c, 0x60, 0x1e, 0xaf, 0xbb, 0xfd, 0x31, 0x81, 0xbf, ++ 0xd7, 0x77, 0x22, 0xfc, 0x42, 0x4f, 0xe7, 0x6c, 0x17, 0xf9, 0xb4, 0x9f, ++ 0x6e, 0x1d, 0x90, 0x6b, 0xc0, 0xce, 0xc7, 0x9d, 0xfd, 0xb3, 0xca, 0x21, ++ 0xd7, 0x73, 0x0a, 0xe7, 0xeb, 0x67, 0x07, 0x58, 0x7f, 0x36, 0xfa, 0xfa, ++ 0xcb, 0xdc, 0xf9, 0x84, 0x83, 0xa3, 0xaf, 0x0f, 0xe4, 0x1e, 0xf6, 0x3d, ++ 0xd5, 0xe2, 0x87, 0xe8, 0x4e, 0xb9, 0xcf, 0x36, 0x1f, 0x31, 0xd9, 0x7a, ++ 0xcf, 0x55, 0xee, 0x3f, 0x2d, 0x9c, 0x43, 0xea, 0x62, 0x04, 0xf4, 0x99, ++ 0x16, 0x8a, 0x91, 0x18, 0xdd, 0xe7, 0x8b, 0x43, 0x09, 0x09, 0xe2, 0x0c, ++ 0x86, 0xd4, 0x17, 0x07, 0x7f, 0x8c, 0xca, 0x54, 0x18, 0xe8, 0xbc, 0x09, ++ 0x2e, 0xd5, 0x15, 0x3a, 0xdb, 0x4d, 0xa3, 0xfd, 0x3c, 0x25, 0x72, 0xdc, ++ 0x93, 0x0b, 0xf2, 0x17, 0x39, 0x02, 0xed, 0xe3, 0x21, 0xd2, 0x0d, 0xed, ++ 0x37, 0x14, 0xa8, 0x75, 0x3b, 0x2b, 0xd3, 0xed, 0x0c, 0x89, 0x44, 0x81, ++ 0xdf, 0x8d, 0x42, 0x35, 0x0a, 0xcf, 0xc5, 0x78, 0xb9, 0x53, 0x9d, 0xe3, ++ 0x51, 0x33, 0x41, 0xb1, 0xdf, 0xc3, 0x72, 0x7f, 0x6f, 0xc1, 0x33, 0x85, ++ 0xf9, 0xa7, 0x1a, 0xb5, 0x43, 0x77, 0x64, 0xd2, 0x27, 0x7e, 0x66, 0x87, ++ 0xe6, 0x3c, 0xe3, 0xc3, 0x7b, 0x7d, 0x81, 0xa8, 0x91, 0x04, 0x96, 0x2c, ++ 0xae, 0x4e, 0x62, 0x1e, 0x67, 0x71, 0x23, 0x89, 0x80, 0x3f, 0x57, 0xde, ++ 0xd5, 0x43, 0x62, 0x74, 0xd0, 0x75, 0x1c, 0x8e, 0xe2, 0xea, 0x04, 0xe6, ++ 0x07, 0x14, 0x6f, 0x4f, 0xe0, 0xb9, 0x7d, 0x81, 0x97, 0xb4, 0xc0, 0xbe, ++ 0x5c, 0xdc, 0x94, 0x90, 0x16, 0xda, 0xe6, 0xa9, 0xf0, 0x33, 0xfe, 0x9e, ++ 0x36, 0x4f, 0xc7, 0x7d, 0xe2, 0x5b, 0xb5, 0xec, 0xde, 0x5e, 0x4f, 0x68, ++ 0x51, 0xa2, 0x16, 0xe6, 0xab, 0x61, 0xe7, 0x5e, 0x81, 0x02, 0x95, 0x0c, ++ 0xa3, 0xf8, 0x08, 0xbc, 0xe2, 0x65, 0xfe, 0x67, 0x75, 0x2f, 0x7c, 0x4b, ++ 0x82, 0xe5, 0x8b, 0xd0, 0xf7, 0x6f, 0xb7, 0x92, 0xaa, 0x86, 0xb1, 0x84, ++ 0xbc, 0xdb, 0xaa, 0x63, 0x79, 0xb2, 0xd5, 0xc4, 0xd2, 0xfc, 0xf8, 0x7f, ++ 0x86, 0x20, 0xbf, 0xa5, 0xe3, 0xa2, 0xc9, 0x61, 0xc8, 0x47, 0xf8, 0x30, ++ 0xd0, 0x38, 0x1a, 0xf6, 0x8d, 0xf7, 0x5b, 0x43, 0xf8, 0xfe, 0x9e, 0x6f, ++ 0x47, 0xc2, 0x90, 0x47, 0xa4, 0x3c, 0xfd, 0x2a, 0x7e, 0x47, 0x22, 0xcd, ++ 0xef, 0x71, 0x85, 0xd4, 0x40, 0xfe, 0x6b, 0xaf, 0x05, 0xf4, 0xb3, 0xad, ++ 0x7f, 0xa7, 0xcf, 0x76, 0xce, 0xdf, 0xbf, 0x2e, 0xba, 0xde, 0x85, 0x74, ++ 0x9e, 0xbb, 0x25, 0xf9, 0x7a, 0x98, 0x0f, 0xea, 0x8b, 0x90, 0x4f, 0x75, ++ 0x45, 0x2b, 0xe2, 0xf8, 0x0e, 0x33, 0x3c, 0x83, 0x7d, 0xe9, 0xe9, 0x20, ++ 0xd1, 0xc7, 0x2a, 0xe1, 0x7b, 0x26, 0x49, 0xe9, 0xe6, 0x4a, 0xdb, 0x73, ++ 0x1f, 0xb5, 0xdb, 0x60, 0x7f, 0xbd, 0xc8, 0x44, 0xba, 0xa7, 0xf1, 0x99, ++ 0x6c, 0xe3, 0xf8, 0x9e, 0x08, 0xfe, 0x6e, 0xf1, 0x0b, 0x1c, 0xaf, 0xf3, ++ 0x6a, 0xce, 0x7a, 0x6e, 0xb2, 0xa1, 0x35, 0xd5, 0x33, 0x63, 0x6c, 0xba, ++ 0x6e, 0x64, 0xb9, 0xef, 0x36, 0xcf, 0x33, 0xed, 0x52, 0x3f, 0x9d, 0x67, ++ 0x26, 0x5c, 0x62, 0xa7, 0x7c, 0x3e, 0x7d, 0x5e, 0xc5, 0x50, 0xc0, 0xd7, ++ 0xfd, 0x1e, 0xe7, 0x3d, 0x72, 0x51, 0x2a, 0xe6, 0xa4, 0x48, 0x19, 0xb4, ++ 0x8d, 0x17, 0xcb, 0x28, 0x87, 0xfc, 0x7b, 0x2b, 0x2b, 0xc7, 0x87, 0x87, ++ 0xe6, 0xd9, 0xc6, 0x9f, 0xc9, 0xe1, 0x57, 0x9e, 0xfe, 0x09, 0xe2, 0x37, ++ 0xa7, 0x32, 0x21, 0xbe, 0xbb, 0x33, 0xa7, 0xd8, 0x96, 0xf7, 0x3f, 0x22, ++ 0xd6, 0xc8, 0xbe, 0xe3, 0xd7, 0xc2, 0xee, 0xc7, 0x88, 0x73, 0xc8, 0xd1, ++ 0xd7, 0xf6, 0xb6, 0xc1, 0x91, 0xc4, 0xe8, 0x55, 0xce, 0x7b, 0x33, 0xb3, ++ 0xf8, 0x3d, 0xcf, 0x92, 0x0e, 0x19, 0xf3, 0x5e, 0x4b, 0xa6, 0xa0, 0x0e, ++ 0x25, 0x25, 0x6d, 0x04, 0xf3, 0xab, 0x76, 0x29, 0x91, 0x2a, 0xe0, 0xef, ++ 0x07, 0xc8, 0x4b, 0x79, 0x96, 0x02, 0xbb, 0x32, 0x21, 0x23, 0xa9, 0xa8, ++ 0x96, 0xc4, 0x9d, 0xe3, 0xec, 0x5a, 0x3c, 0xe7, 0x39, 0x88, 0x03, 0x88, ++ 0x7b, 0xa3, 0xab, 0xdb, 0xd9, 0x78, 0xa3, 0xc2, 0x91, 0xa3, 0x61, 0x88, ++ 0x9f, 0x54, 0xca, 0x68, 0x2f, 0x8f, 0x26, 0x11, 0x1d, 0xc6, 0x1f, 0x6d, ++ 0xc8, 0x04, 0xee, 0x15, 0x8d, 0x21, 0xb6, 0x71, 0x68, 0x7d, 0x64, 0x8b, ++ 0x73, 0x5c, 0x37, 0xbc, 0x25, 0x01, 0x19, 0xbf, 0x5b, 0x20, 0xe0, 0x19, ++ 0x45, 0x0e, 0xe8, 0x56, 0x01, 0x8e, 0x4f, 0x92, 0xb4, 0xff, 0x08, 0xea, ++ 0xe6, 0x0d, 0xcf, 0x00, 0x9f, 0x7b, 0x9e, 0x31, 0xa2, 0xdd, 0x05, 0x55, ++ 0x55, 0x29, 0x92, 0x61, 0x5e, 0xd2, 0xd7, 0x06, 0xe7, 0x42, 0x67, 0xcc, ++ 0x3f, 0xc0, 0xb8, 0xad, 0xfe, 0xfe, 0xfc, 0xbb, 0x20, 0xe8, 0xf3, 0xed, ++ 0x12, 0x5b, 0x7f, 0xfc, 0x79, 0x25, 0xb2, 0x07, 0xe8, 0x7a, 0xf3, 0x5e, ++ 0x8c, 0xd7, 0x8c, 0x58, 0xd9, 0x85, 0xfb, 0x7a, 0x97, 0x9f, 0xd9, 0x77, ++ 0x6b, 0xa8, 0x3d, 0x60, 0x78, 0xc0, 0x4e, 0xa1, 0xe5, 0xd8, 0xec, 0x7c, ++ 0xa8, 0x98, 0x14, 0x71, 0xb9, 0xb8, 0x7f, 0x64, 0xe4, 0xbf, 0x47, 0xfc, ++ 0xb5, 0x9b, 0xfc, 0x10, 0x0f, 0xf3, 0x4f, 0xdb, 0x04, 0x7c, 0xe8, 0x57, ++ 0xc3, 0x57, 0x03, 0x3d, 0xfc, 0x47, 0x3d, 0x04, 0xce, 0x31, 0xfd, 0x56, ++ 0x02, 0xe5, 0x8f, 0x94, 0x31, 0x3b, 0xe3, 0xee, 0xca, 0xd2, 0x5c, 0x90, ++ 0x37, 0x7f, 0x8b, 0x96, 0xd1, 0x5f, 0x6b, 0xf7, 0x7b, 0x10, 0xbe, 0xed, ++ 0x7e, 0x49, 0x85, 0x7c, 0x50, 0xca, 0x5b, 0xb8, 0x2e, 0xb5, 0x29, 0xfc, ++ 0xdd, 0x59, 0xb4, 0xfa, 0xdf, 0x0a, 0xad, 0x87, 0x60, 0x9e, 0xf7, 0x0a, ++ 0x63, 0x58, 0x8a, 0xe7, 0xa1, 0x45, 0xf5, 0x61, 0xe0, 0xcf, 0xe9, 0x37, ++ 0x55, 0x62, 0xfc, 0xeb, 0x74, 0x97, 0x84, 0xf1, 0xaf, 0xb7, 0xa4, 0xa4, ++ 0x06, 0x29, 0xda, 0xcb, 0xae, 0x6c, 0x99, 0x70, 0x19, 0xc5, 0xc7, 0xdc, ++ 0xbc, 0xd8, 0xc3, 0xd0, 0xaf, 0xa9, 0xbe, 0xe7, 0x39, 0x76, 0x46, 0xdb, ++ 0x52, 0x0e, 0x7e, 0xdd, 0x1c, 0xc8, 0xf3, 0x2b, 0x84, 0xe9, 0xe2, 0xcc, ++ 0x1f, 0x1c, 0xf1, 0x66, 0x44, 0x85, 0xfb, 0x60, 0x23, 0xd4, 0x94, 0x27, ++ 0x08, 0xdf, 0xf3, 0x79, 0xfa, 0x15, 0x56, 0xc6, 0x6b, 0x81, 0xdf, 0x75, ++ 0xb8, 0x01, 0x43, 0xe9, 0x19, 0x2c, 0xb3, 0xde, 0x01, 0xbf, 0x29, 0xc0, ++ 0xef, 0x1f, 0x29, 0xa4, 0x2f, 0x2e, 0x81, 0x7f, 0x34, 0x95, 0x90, 0x37, ++ 0x6d, 0x74, 0x03, 0x9f, 0xce, 0x5e, 0x87, 0x33, 0x5d, 0x7b, 0x3d, 0x1b, ++ 0xfe, 0x07, 0x2a, 0x1b, 0x68, 0xdf, 0x37, 0xc7, 0xc2, 0x2e, 0x1f, 0xb1, ++ 0x24, 0xb4, 0x0b, 0x92, 0xec, 0x3b, 0x08, 0x66, 0x64, 0x02, 0xc0, 0xa9, ++ 0x84, 0x8e, 0x16, 0x95, 0xd9, 0xf6, 0x39, 0x2f, 0x5f, 0x9f, 0x77, 0xfa, ++ 0x22, 0xfe, 0xbd, 0x24, 0x8b, 0xfb, 0x37, 0x11, 0x62, 0xf7, 0x6f, 0xbd, ++ 0x7c, 0x5d, 0xa0, 0xc3, 0xdf, 0xb4, 0xf5, 0xf7, 0x84, 0x9c, 0x75, 0xc5, ++ 0xfc, 0x7c, 0xd7, 0x21, 0xec, 0x6e, 0xe9, 0xa9, 0xbf, 0x9c, 0x00, 0x3a, ++ 0xae, 0x7e, 0xdc, 0x83, 0x71, 0xcf, 0xe9, 0x8f, 0x7b, 0x52, 0x97, 0xd2, ++ 0xfa, 0xf2, 0x1d, 0x12, 0xee, 0x33, 0xf2, 0x61, 0xa6, 0xd7, 0xdf, 0xdf, ++ 0x2d, 0xa1, 0xdc, 0xa7, 0x02, 0x1a, 0xea, 0x81, 0xf7, 0x4c, 0x1d, 0xeb, ++ 0xcd, 0xde, 0x9e, 0x8d, 0x5f, 0xa2, 0xf5, 0xbe, 0xc7, 0x15, 0xb2, 0x13, ++ 0xd1, 0x52, 0x8f, 0xdf, 0x97, 0x3a, 0x21, 0xf6, 0xd3, 0x83, 0xac, 0xbe, ++ 0x98, 0x3b, 0x48, 0xcb, 0x77, 0x1c, 0x59, 0x00, 0xe3, 0x35, 0x1e, 0xf4, ++ 0x12, 0xd8, 0x27, 0x96, 0xff, 0xe4, 0xa6, 0x2b, 0xbe, 0x44, 0xeb, 0x37, ++ 0x51, 0x3e, 0x86, 0x26, 0xcb, 0xf7, 0xb4, 0x69, 0xc3, 0x68, 0x7d, 0x49, ++ 0x52, 0xea, 0x86, 0xfa, 0xa9, 0x69, 0x04, 0xf9, 0x2c, 0x9e, 0xaf, 0x25, ++ 0x21, 0xaf, 0xe5, 0x54, 0xb0, 0xa7, 0xe8, 0x2a, 0x03, 0xf7, 0x31, 0x12, ++ 0x1e, 0x07, 0xe7, 0xdb, 0x3d, 0x45, 0x57, 0x52, 0x7e, 0x5c, 0x9a, 0x7c, ++ 0x6c, 0x16, 0xf4, 0x5b, 0xba, 0x4f, 0x82, 0x48, 0x2a, 0x5d, 0xc7, 0x9e, ++ 0xe7, 0x8a, 0x29, 0x5c, 0xcb, 0xbf, 0x2f, 0xe1, 0xfe, 0xb8, 0x6c, 0x6f, ++ 0x0e, 0x09, 0xdb, 0xf0, 0x79, 0x82, 0x2e, 0xe5, 0x52, 0xfa, 0x7e, 0x25, ++ 0x5d, 0x27, 0xe8, 0xc3, 0x9b, 0x48, 0x62, 0x16, 0xd0, 0x6b, 0xf9, 0x9e, ++ 0xcd, 0x9a, 0x7d, 0x9f, 0x7b, 0xb7, 0xb5, 0x02, 0x53, 0x3f, 0x44, 0x7d, ++ 0xf9, 0xf7, 0xe9, 0x3c, 0xb4, 0xdf, 0x8a, 0x1f, 0x4a, 0x11, 0x58, 0xe2, ++ 0x0a, 0xc8, 0x77, 0x80, 0xfd, 0xf2, 0x27, 0xbe, 0xfa, 0x5d, 0x06, 0xac, ++ 0xaf, 0x4d, 0x2b, 0x0f, 0xc0, 0xba, 0xd6, 0x6a, 0xd0, 0xee, 0xa6, 0xe4, ++ 0xc2, 0x27, 0x7c, 0x61, 0x80, 0x6f, 0x87, 0x36, 0x8b, 0xbe, 0x5f, 0xba, ++ 0x7d, 0x87, 0xb6, 0xb8, 0x12, 0xf0, 0x46, 0xae, 0x87, 0x7d, 0x75, 0xd9, ++ 0xde, 0xf3, 0x49, 0xd8, 0x46, 0xd7, 0x13, 0x5d, 0x0a, 0xfa, 0x0b, 0x2b, ++ 0xf3, 0xf4, 0x9d, 0xf8, 0x3d, 0x51, 0xc3, 0x0a, 0xcd, 0xcb, 0x10, 0x0f, ++ 0x79, 0xb7, 0x95, 0x38, 0xe0, 0x5a, 0xca, 0xf5, 0x06, 0xf5, 0xfb, 0xb4, ++ 0xb9, 0xb6, 0xf6, 0x4f, 0xe4, 0xe4, 0x21, 0x9f, 0x2e, 0xdb, 0xab, 0x38, ++ 0xe6, 0x11, 0xf4, 0x8f, 0x1f, 0x23, 0xec, 0x1e, 0xda, 0xcf, 0x02, 0x78, ++ 0x0f, 0x4d, 0xd0, 0x4f, 0xec, 0x57, 0x82, 0x7e, 0x2b, 0xc5, 0x87, 0xf2, ++ 0xd4, 0xbe, 0xc9, 0x99, 0xe0, 0x81, 0xef, 0x6a, 0x01, 0x3c, 0x09, 0xea, ++ 0xdf, 0x40, 0x79, 0x6f, 0x6b, 0x08, 0xcb, 0xfb, 0x5b, 0xc3, 0x48, 0xa7, ++ 0x2d, 0x80, 0xc7, 0x71, 0x2c, 0x2f, 0x05, 0x9e, 0x53, 0xb9, 0xc5, 0xef, ++ 0xf9, 0x05, 0x2d, 0xf8, 0xd0, 0x14, 0xdc, 0x47, 0xb1, 0x6a, 0x21, 0xff, ++ 0x32, 0x3f, 0xca, 0xea, 0x45, 0xd7, 0xc6, 0xa4, 0xf0, 0x59, 0xec, 0x74, ++ 0x51, 0x6e, 0xf1, 0xc4, 0x16, 0x82, 0x91, 0x33, 0x35, 0xe7, 0x7b, 0x33, ++ 0x55, 0xea, 0x8f, 0x6d, 0xd1, 0x62, 0x37, 0x43, 0xc8, 0xda, 0x54, 0x77, ++ 0xce, 0x9c, 0x41, 0xf7, 0xbc, 0xa6, 0x9c, 0xe8, 0xe4, 0x1c, 0xdb, 0xb9, ++ 0xdf, 0x1a, 0xfe, 0x1d, 0x99, 0x0b, 0x73, 0xc2, 0xb8, 0xfe, 0x35, 0xc5, ++ 0x1a, 0xe2, 0x7b, 0xcb, 0x75, 0x93, 0x77, 0xf1, 0xf8, 0x13, 0xee, 0x93, ++ 0x5b, 0xae, 0x5b, 0xfc, 0x30, 0xc4, 0xc7, 0x69, 0xff, 0xaf, 0xe4, 0x80, ++ 0x7f, 0xc1, 0xcf, 0xff, 0xb2, 0xf5, 0x2f, 0x5a, 0x50, 0xe3, 0xe8, 0x5f, ++ 0xb4, 0xa0, 0x51, 0xf4, 0x9f, 0x85, 0xfd, 0xf5, 0xb3, 0xf7, 0xdf, 0xb2, ++ 0xe0, 0x12, 0xe7, 0xfc, 0x0b, 0x96, 0x8a, 0xfe, 0x57, 0x20, 0xfc, 0xc6, ++ 0xd9, 0xe1, 0x2f, 0xba, 0x7e, 0xaa, 0x73, 0xfe, 0xeb, 0x9b, 0xb0, 0x7f, ++ 0xb3, 0x97, 0xd1, 0xb7, 0x2f, 0x4f, 0xc7, 0x3c, 0xeb, 0x76, 0x5f, 0x24, ++ 0xe5, 0x01, 0x3a, 0xab, 0x04, 0xbf, 0x43, 0xad, 0xe6, 0x97, 0xef, 0x84, ++ 0x76, 0x62, 0xdf, 0xa1, 0x96, 0xa5, 0x05, 0x79, 0xdb, 0xc6, 0xbe, 0xbc, ++ 0xaa, 0xf5, 0xc4, 0xce, 0x47, 0xd3, 0x16, 0x00, 0x1c, 0x01, 0x2a, 0x5d, ++ 0x76, 0x3e, 0xca, 0xad, 0xf1, 0x3b, 0xe4, 0x2a, 0xcf, 0xca, 0x77, 0xd4, ++ 0x87, 0xd4, 0x0d, 0x73, 0xb4, 0x2f, 0x8c, 0x96, 0x3a, 0xde, 0x0f, 0xad, ++ 0x3f, 0xcf, 0xc5, 0x97, 0x06, 0xde, 0x5b, 0xc4, 0x3a, 0x00, 0x05, 0x86, ++ 0x39, 0x85, 0x53, 0x1b, 0xa6, 0xa1, 0x3e, 0xaa, 0x1d, 0xc6, 0xec, 0xe0, ++ 0xdb, 0x0e, 0xfb, 0xb0, 0x7e, 0xdb, 0x25, 0x6c, 0x7d, 0xb7, 0x0d, 0x33, ++ 0x50, 0x8e, 0x01, 0x66, 0xf0, 0xcb, 0x6f, 0xd3, 0x62, 0x17, 0xda, 0xbf, ++ 0x13, 0x4b, 0xd7, 0x25, 0xc1, 0x61, 0xce, 0x8d, 0x46, 0xec, 0x76, 0x58, ++ 0x47, 0xfa, 0x79, 0x58, 0x86, 0xe7, 0x7e, 0x9e, 0xef, 0xe4, 0xf7, 0x12, ++ 0xd4, 0x77, 0x6b, 0x4b, 0x26, 0xef, 0x8a, 0xdb, 0xf0, 0xd9, 0x39, 0x92, ++ 0xf2, 0x03, 0xad, 0xb7, 0xe7, 0x68, 0x0c, 0xef, 0x9c, 0x0e, 0x6b, 0x47, ++ 0x2e, 0x0e, 0xd9, 0xed, 0xf5, 0x35, 0x23, 0xb5, 0x7a, 0xf0, 0x37, 0xe0, ++ 0xf9, 0x0d, 0x06, 0xcc, 0x17, 0x5d, 0x03, 0xf3, 0x35, 0x6b, 0x7d, 0xe5, ++ 0x60, 0x77, 0xb8, 0xe7, 0xf1, 0x96, 0xd6, 0x38, 0xe6, 0xd1, 0x47, 0x35, ++ 0xe2, 0x3c, 0x9b, 0x73, 0x58, 0x3c, 0x55, 0xcc, 0xe3, 0x1d, 0xd5, 0xe8, ++ 0x9a, 0x47, 0xaf, 0xdf, 0xc9, 0x9f, 0xf3, 0x79, 0xee, 0x03, 0x3e, 0xcb, ++ 0x36, 0xcf, 0xda, 0xd2, 0x4b, 0x9c, 0xeb, 0x19, 0xb5, 0x14, 0xe7, 0x79, ++ 0xd0, 0x35, 0xcf, 0xda, 0x51, 0x4b, 0x5d, 0xf3, 0xf8, 0xd9, 0x7a, 0xe8, ++ 0x73, 0x3e, 0x4f, 0xf2, 0x6c, 0xf3, 0x78, 0xc7, 0x4c, 0x75, 0xae, 0x67, ++ 0x74, 0x13, 0xce, 0xf3, 0xcf, 0xee, 0xf5, 0x8c, 0x6e, 0x72, 0xcd, 0x63, ++ 0xe0, 0x3c, 0xf0, 0x1c, 0xe6, 0xa1, 0x86, 0x6f, 0x18, 0xbe, 0x8f, 0xa5, ++ 0x79, 0xfb, 0x16, 0x23, 0xfd, 0x9f, 0xf2, 0xa1, 0x9d, 0xa3, 0x79, 0x63, ++ 0x8f, 0xa0, 0x9d, 0xf3, 0x9a, 0x0f, 0xed, 0x1c, 0xda, 0xca, 0xc2, 0xef, ++ 0x68, 0x55, 0x30, 0xff, 0xf6, 0x96, 0x9c, 0x7c, 0xa4, 0xcf, 0x87, 0x7e, ++ 0x4a, 0x7f, 0xc3, 0x4e, 0xe7, 0x38, 0xcf, 0x3b, 0x88, 0xa3, 0x5f, 0x7c, ++ 0x23, 0x07, 0x91, 0x24, 0x29, 0x44, 0x54, 0xbf, 0xad, 0xe0, 0x3c, 0xd8, ++ 0xb0, 0x6f, 0xee, 0xa8, 0x36, 0x28, 0x0f, 0x4e, 0x0f, 0x2d, 0x04, 0x7f, ++ 0xf4, 0xfe, 0x00, 0xc6, 0xf1, 0xde, 0x3f, 0x38, 0x5d, 0xbb, 0x21, 0x83, ++ 0x3e, 0xba, 0x31, 0xe1, 0x39, 0xd1, 0x6b, 0xe3, 0xe7, 0x7e, 0xbd, 0xca, ++ 0xe3, 0xb1, 0xa1, 0x1c, 0x76, 0x0e, 0x29, 0xea, 0x27, 0x78, 0xfc, 0xe7, ++ 0x4d, 0x88, 0x13, 0xd1, 0xf2, 0x2d, 0x0f, 0x41, 0x7f, 0xe8, 0x38, 0x8f, ++ 0x17, 0xa5, 0xe1, 0x6d, 0xc3, 0x7e, 0x27, 0xf8, 0xb9, 0xde, 0x89, 0xed, ++ 0x6c, 0x9f, 0xfa, 0x70, 0xf3, 0x31, 0xf6, 0xdd, 0x9c, 0x38, 0x79, 0xa9, ++ 0x72, 0x32, 0x7c, 0x8f, 0x86, 0xfd, 0xbb, 0x31, 0x91, 0xe3, 0xf0, 0xc7, ++ 0x9b, 0x39, 0x3d, 0xfa, 0x7e, 0xe2, 0x4d, 0xee, 0x44, 0x7a, 0x58, 0xc3, ++ 0xf1, 0xbb, 0xbf, 0x5d, 0x43, 0x1c, 0xf1, 0xc2, 0xdf, 0x1c, 0xfe, 0xda, ++ 0x73, 0x2c, 0xef, 0x8e, 0x0c, 0x87, 0xef, 0xe5, 0x5d, 0xd3, 0xf9, 0xd8, ++ 0xb3, 0xd0, 0xec, 0x65, 0x69, 0xe1, 0xc8, 0x95, 0x74, 0xbd, 0xf5, 0x07, ++ 0x36, 0x7b, 0x86, 0xd3, 0xfa, 0xfb, 0x9e, 0xde, 0x05, 0x11, 0xc3, 0x36, ++ 0x4e, 0xbd, 0x07, 0xef, 0xdd, 0x0b, 0x3f, 0xe4, 0x1b, 0x31, 0x8f, 0xc3, ++ 0x7e, 0xfe, 0x66, 0xa3, 0xb3, 0x7e, 0x9d, 0xcb, 0x9e, 0x7e, 0x3d, 0xa7, ++ 0x54, 0x9c, 0xcf, 0xb2, 0x79, 0xc3, 0x49, 0x0f, 0xd0, 0x6b, 0x3e, 0x9c, ++ 0xb1, 0x52, 0x12, 0x5e, 0x07, 0x25, 0x26, 0xdf, 0x99, 0x48, 0xaf, 0x05, ++ 0x26, 0xeb, 0x2b, 0xe0, 0x69, 0xbe, 0xc3, 0x43, 0x52, 0xb8, 0xdf, 0xf5, ++ 0x16, 0x62, 0x9c, 0x33, 0x5e, 0x88, 0x71, 0x9a, 0x98, 0xd8, 0xb7, 0x5c, ++ 0xf0, 0x2d, 0xf0, 0xe8, 0x56, 0x94, 0xd2, 0x73, 0xc1, 0xed, 0x0a, 0xe2, ++ 0xd1, 0x0d, 0x6f, 0xef, 0xe1, 0x1c, 0x4b, 0xa6, 0x7e, 0x4e, 0x6f, 0xd7, ++ 0xff, 0xf6, 0xc0, 0xfd, 0x9d, 0x81, 0xe0, 0xbf, 0x7e, 0x95, 0xf3, 0x3d, ++ 0x89, 0x7b, 0x1c, 0xdf, 0x21, 0x10, 0x7c, 0x70, 0x75, 0x7d, 0xed, 0xae, ++ 0xe3, 0x36, 0xfe, 0xf8, 0x46, 0x6c, 0xf6, 0xae, 0xe3, 0x0e, 0x3c, 0xcd, ++ 0x75, 0xd4, 0xaf, 0x6b, 0xf9, 0x86, 0xa3, 0xfd, 0xf5, 0xab, 0x16, 0x3a, ++ 0xde, 0x2f, 0x8c, 0x2f, 0x71, 0xbc, 0xbf, 0xa1, 0xf3, 0x66, 0x47, 0xfd, ++ 0xc6, 0xc4, 0xed, 0x8e, 0xf6, 0x37, 0x75, 0xb5, 0x39, 0xde, 0x2f, 0x49, ++ 0xae, 0x73, 0xbc, 0x5f, 0xb6, 0x77, 0xb3, 0xa3, 0xbe, 0xbc, 0x7b, 0xab, ++ 0xa3, 0x7d, 0xf3, 0xc1, 0x1d, 0x8e, 0xf7, 0xf2, 0xe1, 0xf1, 0xff, 0x84, ++ 0x7e, 0xe0, 0xaf, 0x14, 0xbc, 0xe7, 0xfc, 0x81, 0x71, 0x62, 0x23, 0xd8, ++ 0x6f, 0x1f, 0x98, 0xec, 0x3b, 0xff, 0x6f, 0xf3, 0xf3, 0xbb, 0x77, 0xf9, ++ 0xf7, 0x7e, 0x56, 0x00, 0xef, 0x4d, 0x01, 0xf9, 0x99, 0xa4, 0x83, 0xdf, ++ 0xd0, 0xec, 0xa7, 0xf2, 0x4c, 0x6d, 0x89, 0x09, 0x46, 0xe1, 0x9a, 0xce, ++ 0xa9, 0xa0, 0x47, 0x08, 0x7e, 0x52, 0xa3, 0xca, 0x18, 0xbe, 0x26, 0x4e, ++ 0x9d, 0xdd, 0x29, 0xfc, 0x5e, 0xa2, 0xd2, 0xa5, 0x91, 0xd4, 0x10, 0x38, ++ 0x5e, 0x49, 0xc7, 0x61, 0xfb, 0x94, 0xf4, 0x7b, 0xb5, 0x97, 0xbe, 0x9f, ++ 0x94, 0xfd, 0xbd, 0xd2, 0xa5, 0x66, 0x7c, 0xaf, 0xf6, 0xaa, 0x19, 0xc7, ++ 0x3d, 0x25, 0xf5, 0x95, 0x83, 0xfd, 0x18, 0x7f, 0xd5, 0x9b, 0xf1, 0xfe, ++ 0x77, 0x5a, 0x2e, 0xc9, 0x70, 0xd8, 0x2f, 0xb2, 0xbd, 0x3f, 0x29, 0x93, ++ 0x46, 0xbb, 0xff, 0x36, 0xdf, 0x60, 0xf1, 0xa1, 0xe7, 0x72, 0xa6, 0xcd, ++ 0x37, 0xc0, 0x1f, 0xd2, 0x98, 0xbc, 0x37, 0xed, 0x2f, 0x9e, 0x06, 0x7e, ++ 0x43, 0x93, 0x96, 0x2a, 0xcf, 0x74, 0x6e, 0xd3, 0x3f, 0x5f, 0xb7, 0x84, ++ 0xdf, 0x09, 0x9c, 0x6f, 0x30, 0x79, 0x59, 0x92, 0x74, 0x7e, 0xff, 0x76, ++ 0xd9, 0xde, 0x31, 0x0e, 0xb9, 0x7f, 0xc5, 0x1f, 0xbb, 0xca, 0xa0, 0xed, ++ 0x4e, 0x1e, 0x51, 0xd8, 0xf7, 0xf2, 0x52, 0xcf, 0x8c, 0xfa, 0xfa, 0x05, ++ 0x30, 0xbf, 0x35, 0x1f, 0x9e, 0x93, 0x83, 0x85, 0xb8, 0x3f, 0xbe, 0xdc, ++ 0x6a, 0xed, 0x3a, 0x4e, 0xfd, 0x80, 0x57, 0x5a, 0xeb, 0xb0, 0xfc, 0xd7, ++ 0xd6, 0xe8, 0xae, 0xe3, 0xd4, 0x51, 0x7b, 0xbd, 0xb5, 0x1e, 0xeb, 0xbf, ++ 0x6d, 0x8d, 0x61, 0xd9, 0xdb, 0xda, 0x88, 0xe5, 0x9b, 0xad, 0x2d, 0xf8, ++ 0xfe, 0x78, 0xeb, 0x2a, 0xac, 0x9f, 0x68, 0x8d, 0x63, 0xf9, 0x76, 0x6b, ++ 0x27, 0x96, 0xef, 0xb6, 0x26, 0xf0, 0xfd, 0xc9, 0xd6, 0x2e, 0xac, 0xbf, ++ 0xdf, 0x9a, 0xc4, 0x52, 0xc8, 0x81, 0xb0, 0x77, 0x49, 0x94, 0xdb, 0x93, ++ 0xe2, 0xc0, 0x84, 0xb0, 0xfa, 0x69, 0xbe, 0x06, 0xa5, 0x48, 0xc4, 0x31, ++ 0x23, 0xf8, 0xfd, 0xa8, 0xd3, 0xc6, 0x87, 0xe5, 0x60, 0x47, 0x9f, 0x7e, ++ 0xc5, 0x8b, 0x79, 0xb7, 0xd9, 0xf0, 0xe4, 0xe6, 0xbb, 0xec, 0xf4, 0xb3, ++ 0x70, 0xbf, 0x5f, 0x9c, 0x74, 0xc6, 0x99, 0x45, 0xe9, 0xf3, 0x33, 0xfa, ++ 0xf8, 0x64, 0x52, 0x07, 0x39, 0x12, 0xeb, 0xc6, 0x6a, 0x18, 0x47, 0xf3, ++ 0x3f, 0x75, 0x3e, 0xda, 0xe3, 0xf4, 0xb9, 0x4a, 0xd8, 0xf7, 0x96, 0x23, ++ 0xf6, 0xef, 0x49, 0xf4, 0x8f, 0x0f, 0xc9, 0xc3, 0x43, 0x07, 0xa6, 0x93, ++ 0x68, 0x7f, 0xe2, 0x7b, 0xff, 0x3e, 0x79, 0x51, 0x25, 0xd0, 0xa7, 0x14, ++ 0xf1, 0xe4, 0x7f, 0x46, 0x69, 0x61, 0x74, 0xdb, 0x15, 0xf9, 0xfa, 0x05, ++ 0x03, 0xe3, 0x0f, 0x6d, 0xbe, 0xe2, 0x33, 0xf1, 0x28, 0x3d, 0xf5, 0x9b, ++ 0x51, 0x10, 0x9f, 0x7a, 0xaf, 0x50, 0xe0, 0xb3, 0x67, 0x14, 0x04, 0xb7, ++ 0x54, 0x23, 0xba, 0x15, 0xf8, 0xf0, 0xf4, 0x01, 0x2f, 0xae, 0xeb, 0xf4, ++ 0xa1, 0x1c, 0x96, 0x8f, 0x02, 0x41, 0xb5, 0x41, 0xe4, 0xbf, 0x2e, 0xdb, ++ 0xeb, 0x4b, 0xda, 0xf5, 0xc3, 0xf2, 0xee, 0xbc, 0xa4, 0x53, 0x5f, 0x14, ++ 0x27, 0xed, 0xfa, 0xe2, 0xf4, 0xd1, 0x5d, 0x41, 0x90, 0xfb, 0x95, 0x21, ++ 0x25, 0x79, 0x7c, 0x12, 0xf0, 0x87, 0xc5, 0xf9, 0x83, 0xf1, 0x9d, 0x18, ++ 0x7f, 0x79, 0x77, 0x49, 0xd2, 0x70, 0x8c, 0xe3, 0xac, 0x9f, 0x4e, 0x48, ++ 0x75, 0xdd, 0x18, 0x17, 0x0b, 0xe7, 0x5e, 0x99, 0xc1, 0xff, 0x10, 0xe5, ++ 0xca, 0x90, 0x86, 0xf3, 0xbc, 0xbb, 0x77, 0x0c, 0xe6, 0x1f, 0x50, 0x3f, ++ 0x31, 0x79, 0x9c, 0xc5, 0x3b, 0x93, 0x6c, 0xde, 0x50, 0xd2, 0xce, 0x97, ++ 0x4d, 0xab, 0x72, 0x92, 0xc7, 0x87, 0xa4, 0xe1, 0xcb, 0x36, 0xee, 0xe7, ++ 0x0d, 0x1f, 0x21, 0x07, 0xc8, 0xef, 0xf4, 0xec, 0xf7, 0x70, 0x07, 0x2a, ++ 0x89, 0xfa, 0x6f, 0x1a, 0x7e, 0xdf, 0xf2, 0x90, 0xe7, 0x43, 0xd8, 0x77, ++ 0xbc, 0xf4, 0xbf, 0x4f, 0x30, 0x5f, 0x48, 0xc5, 0xba, 0x18, 0xb7, 0xb9, ++ 0x5b, 0x89, 0x7b, 0xe1, 0x1e, 0x2f, 0xd9, 0xe7, 0x98, 0x8f, 0xf6, 0x0b, ++ 0x0b, 0x1f, 0xdd, 0xfe, 0xdd, 0x9c, 0x33, 0xe9, 0xee, 0xcc, 0x07, 0xff, ++ 0x2d, 0xf0, 0x12, 0xee, 0xdb, 0xec, 0x5e, 0x79, 0x0c, 0xee, 0x95, 0xd3, ++ 0xf1, 0x4e, 0xa9, 0x46, 0xa7, 0x74, 0x61, 0xfa, 0x5e, 0x79, 0x33, 0xe7, ++ 0xcb, 0xe5, 0x7a, 0xaf, 0x16, 0xa3, 0x8f, 0xde, 0x3b, 0x30, 0xe6, 0xac, ++ 0xf9, 0x20, 0xef, 0xb6, 0x1e, 0x35, 0xd5, 0xb1, 0x90, 0x47, 0x90, 0xc0, ++ 0x0f, 0x46, 0x34, 0x76, 0x8f, 0x9f, 0x01, 0xfa, 0xf1, 0xbd, 0x03, 0xab, ++ 0x8b, 0x20, 0x9e, 0xb6, 0x4c, 0x39, 0x7d, 0x5b, 0xa6, 0xfb, 0xb2, 0x1f, ++ 0x19, 0x2c, 0xce, 0x46, 0x92, 0x9e, 0xbe, 0x5e, 0xdb, 0x7a, 0x44, 0x7c, ++ 0x86, 0x10, 0x3a, 0xae, 0x9e, 0x86, 0x1f, 0x38, 0xfd, 0x84, 0xad, 0xee, ++ 0xd6, 0xd7, 0xa2, 0x94, 0x03, 0x2c, 0xee, 0xbe, 0x62, 0xdf, 0xb1, 0x59, ++ 0x5f, 0xa2, 0xf0, 0xaf, 0x38, 0xf8, 0x47, 0x0d, 0xe0, 0x38, 0x68, 0xc4, ++ 0xe4, 0x80, 0x6d, 0xfd, 0x12, 0xbf, 0x57, 0xbf, 0x74, 0xef, 0x1b, 0x1a, ++ 0xac, 0xef, 0x6d, 0x4f, 0xbc, 0xfc, 0x8e, 0xb3, 0xe8, 0xa9, 0x33, 0xe1, ++ 0x34, 0x42, 0x8e, 0xf3, 0xd0, 0x38, 0xe9, 0x01, 0x39, 0x5e, 0xc4, 0x7e, ++ 0x83, 0x01, 0xf8, 0xe9, 0xea, 0xd7, 0xa8, 0x68, 0xbe, 0xf3, 0x4b, 0x0f, ++ 0x81, 0xdf, 0x75, 0x10, 0xe7, 0x15, 0xe2, 0xde, 0x43, 0x03, 0x89, 0x06, ++ 0x01, 0x5f, 0x8b, 0x0e, 0x2c, 0xc3, 0xf8, 0xf0, 0x3b, 0x4f, 0x5c, 0xce, ++ 0xed, 0xb9, 0xc4, 0x64, 0xe0, 0x8f, 0xf7, 0x88, 0x5c, 0x07, 0xeb, 0x7b, ++ 0x8f, 0xbc, 0x18, 0x9c, 0x64, 0xc3, 0x5f, 0x59, 0x80, 0xf9, 0x31, 0xa4, ++ 0x93, 0xd9, 0x31, 0xe2, 0x5e, 0x20, 0xb5, 0x67, 0x1d, 0x76, 0xcd, 0x4d, ++ 0x5d, 0xce, 0xfa, 0x62, 0x32, 0xaf, 0x08, 0xf4, 0xc6, 0xe2, 0xfb, 0x3d, ++ 0xf0, 0x0d, 0x55, 0xb2, 0x84, 0xd8, 0xbe, 0xbf, 0x44, 0xd7, 0x5d, 0x10, ++ 0x60, 0xf6, 0xee, 0x4d, 0xa4, 0x65, 0x0d, 0xd8, 0x73, 0xaa, 0x97, 0xf9, ++ 0x07, 0x8b, 0x4c, 0xa2, 0x0e, 0xa7, 0xfa, 0x74, 0xf9, 0x8f, 0x1f, 0x98, ++ 0x0c, 0x76, 0xff, 0xf9, 0x01, 0x76, 0xee, 0x28, 0xe2, 0x18, 0x4b, 0xf2, ++ 0x99, 0xbd, 0xb7, 0xb4, 0x20, 0xa9, 0xc1, 0x79, 0xc2, 0xef, 0x0e, 0x4c, ++ 0x9a, 0xff, 0x25, 0xe0, 0x3e, 0x6f, 0x72, 0x0d, 0xec, 0xcb, 0x24, 0x37, ++ 0xf3, 0xf9, 0xdf, 0x0d, 0x9d, 0x4e, 0xf8, 0x06, 0x82, 0xdf, 0x0d, 0xaf, ++ 0xb8, 0xef, 0x7e, 0x46, 0x3c, 0x85, 0xc3, 0xa1, 0xec, 0x95, 0x32, 0xe6, ++ 0xa7, 0x4d, 0x09, 0x70, 0xbe, 0xe3, 0x7a, 0xe4, 0xae, 0x80, 0xd3, 0xce, ++ 0x5f, 0xeb, 0xaa, 0xcf, 0x09, 0xf0, 0x38, 0xab, 0x42, 0x14, 0xa0, 0xf3, ++ 0x7b, 0xa6, 0x1e, 0x97, 0x73, 0xf1, 0x3d, 0xde, 0xaf, 0x8d, 0xef, 0xf7, ++ 0x46, 0x56, 0x87, 0xe1, 0x7b, 0x5a, 0xd1, 0x28, 0xf0, 0x17, 0xb5, 0x0b, ++ 0x26, 0x10, 0x5b, 0xbb, 0xdf, 0x1b, 0x31, 0x7c, 0x7e, 0x52, 0x7a, 0x61, ++ 0x31, 0xde, 0x2f, 0x57, 0x53, 0x13, 0x30, 0x1f, 0x4f, 0x27, 0xaa, 0xfd, ++ 0xf7, 0x18, 0x14, 0x7f, 0x70, 0x02, 0xb9, 0x10, 0xe2, 0xa4, 0x2d, 0xe8, ++ 0xd4, 0xaf, 0xf6, 0x05, 0x77, 0x42, 0x7d, 0x4d, 0x80, 0xdd, 0x83, 0x6a, ++ 0x06, 0x39, 0x85, 0xfb, 0xd3, 0xc1, 0x59, 0x47, 0x21, 0xae, 0xaf, 0x93, ++ 0x44, 0xca, 0x2a, 0x81, 0xf3, 0x6f, 0x67, 0xfc, 0xdb, 0x17, 0x76, 0xd6, ++ 0x73, 0x40, 0x9e, 0x40, 0x9f, 0xc0, 0x03, 0xa0, 0x47, 0x84, 0x60, 0xbc, ++ 0x28, 0xa7, 0xc2, 0xd9, 0x2e, 0x10, 0x71, 0xd6, 0x97, 0xf6, 0xe3, 0x29, ++ 0xa5, 0xd8, 0xef, 0x7d, 0x04, 0x75, 0x23, 0x85, 0xbf, 0xd7, 0x54, 0xa3, ++ 0x9e, 0xb4, 0xdb, 0xcd, 0x2b, 0x74, 0x06, 0x3f, 0x81, 0xef, 0xa9, 0xd2, ++ 0xf6, 0xb7, 0x70, 0x7b, 0x7e, 0x05, 0x09, 0xc7, 0x31, 0x6f, 0x31, 0xc4, ++ 0xf8, 0xe0, 0x96, 0xd9, 0x2c, 0x6f, 0xe2, 0x96, 0x40, 0x18, 0xef, 0x25, ++ 0x4b, 0xaa, 0x85, 0xf7, 0x23, 0xd6, 0x42, 0x57, 0xdb, 0x3e, 0xd6, 0xfc, ++ 0x91, 0x44, 0x92, 0x36, 0xbd, 0xde, 0xac, 0xf6, 0x69, 0xc0, 0x97, 0xcd, ++ 0x1f, 0xa9, 0xf8, 0xfc, 0x41, 0x23, 0xf6, 0x6d, 0xc0, 0xab, 0x46, 0x2c, ++ 0xb4, 0x73, 0x75, 0x8a, 0x34, 0x38, 0xbf, 0x56, 0x8d, 0x3a, 0x87, 0xdd, ++ 0x4b, 0x46, 0xf0, 0xef, 0x02, 0xba, 0xf2, 0x17, 0x36, 0x04, 0x4c, 0x87, ++ 0xbf, 0x27, 0xf4, 0x82, 0x87, 0xeb, 0x45, 0xaa, 0x2f, 0xd6, 0x06, 0x0a, ++ 0x41, 0x0f, 0xf6, 0xcd, 0x62, 0xe7, 0xea, 0xbd, 0x1a, 0x3b, 0xdf, 0x61, ++ 0xed, 0xb4, 0x74, 0xbb, 0x0d, 0x00, 0x47, 0xb6, 0x76, 0xbe, 0x74, 0xbb, ++ 0xcd, 0x99, 0xda, 0x2d, 0xff, 0xf1, 0xa3, 0x4f, 0xc4, 0xa9, 0xbc, 0x2f, ++ 0xfd, 0xd1, 0x77, 0x82, 0x70, 0x98, 0xf6, 0x8e, 0x9a, 0x28, 0x82, 0xfc, ++ 0x87, 0xa6, 0x3d, 0x1d, 0x41, 0xe0, 0xe3, 0xb7, 0xd5, 0x78, 0x10, 0xd6, ++ 0xfd, 0x4e, 0x32, 0x73, 0xde, 0xfb, 0xcf, 0xb9, 0xbe, 0x83, 0x7c, 0x27, ++ 0xb8, 0x27, 0xbf, 0x82, 0xd3, 0xe9, 0xdd, 0x1f, 0xdc, 0x7d, 0x05, 0xe0, ++ 0xfd, 0xc3, 0x3d, 0x1e, 0xbc, 0x67, 0xdf, 0xbc, 0xd7, 0x9b, 0xf2, 0x52, ++ 0x22, 0xae, 0x38, 0xb0, 0x84, 0xf1, 0xd3, 0x5e, 0xef, 0x1b, 0xac, 0xbe, ++ 0x16, 0x7f, 0x77, 0xa1, 0xf9, 0xa0, 0x53, 0xde, 0x96, 0x3e, 0xf2, 0x9d, ++ 0xa2, 0x30, 0x1e, 0xee, 0xc5, 0x99, 0xdf, 0x48, 0x52, 0x68, 0x3f, 0xaf, ++ 0xd8, 0xfd, 0xfb, 0x59, 0x60, 0x8f, 0x34, 0x93, 0x3e, 0xd4, 0x13, 0xee, ++ 0x7e, 0x30, 0xff, 0x47, 0xf9, 0xb8, 0x7f, 0x2d, 0x84, 0xfb, 0xfe, 0xee, ++ 0xf7, 0x22, 0xdf, 0xaa, 0x99, 0xf3, 0x7d, 0xf3, 0x81, 0xbb, 0x31, 0xaf, ++ 0xaa, 0xf9, 0xc0, 0x6c, 0xcc, 0xa3, 0x6a, 0x76, 0xc9, 0x79, 0x23, 0xf7, ++ 0x43, 0x0e, 0x06, 0x9c, 0xbf, 0xb3, 0x21, 0xf0, 0x41, 0x92, 0xcc, 0x2e, ++ 0x5e, 0xfd, 0xfd, 0xef, 0x4e, 0x78, 0x83, 0xc2, 0x73, 0x72, 0xf7, 0x2f, ++ 0x83, 0x92, 0x23, 0x7e, 0xc4, 0xf4, 0xc4, 0xe9, 0xee, 0x1b, 0x1e, 0x7a, ++ 0x32, 0x9c, 0x5d, 0xbf, 0xbf, 0xcf, 0xfd, 0xfa, 0x74, 0xbf, 0x24, 0xf6, ++ 0x0b, 0x1f, 0x64, 0x76, 0x3c, 0x39, 0xc4, 0xca, 0x26, 0x4f, 0x2a, 0x08, ++ 0x7e, 0x53, 0xd3, 0x0e, 0x4f, 0x84, 0x6a, 0x10, 0xd2, 0xf4, 0xe8, 0xae, ++ 0x87, 0xbf, 0x07, 0xfc, 0xfd, 0xaa, 0x17, 0xe3, 0x0d, 0xcb, 0x1e, 0x7d, ++ 0xf6, 0xe5, 0x4b, 0x68, 0x7d, 0xd9, 0x63, 0x9e, 0x82, 0x39, 0x6c, 0x19, ++ 0x06, 0xe4, 0x01, 0x0b, 0xba, 0xc0, 0xdd, 0x76, 0xc8, 0xd7, 0x15, 0x74, ++ 0x58, 0xfa, 0x2f, 0xcf, 0x6a, 0xe1, 0x0b, 0xd8, 0xf3, 0x3b, 0xf3, 0xd3, ++ 0xf4, 0x58, 0xf6, 0xd8, 0x11, 0x8d, 0x5c, 0x70, 0x26, 0xfe, 0xa6, 0x77, ++ 0x1f, 0xd1, 0xf0, 0x3b, 0x41, 0x6e, 0xba, 0x74, 0xbf, 0x31, 0x0b, 0xec, ++ 0xee, 0xd5, 0xdf, 0xff, 0x93, 0x06, 0xf2, 0xf5, 0xce, 0x61, 0x89, 0x0c, ++ 0x2d, 0x39, 0xb3, 0x7f, 0xe3, 0x8e, 0x67, 0xd1, 0xae, 0x03, 0x3c, 0x21, ++ 0x1d, 0x39, 0x9d, 0xfa, 0xe9, 0x76, 0x06, 0xbd, 0x52, 0x57, 0x3c, 0x59, ++ 0x8d, 0xed, 0x4c, 0xd8, 0xc7, 0x06, 0xa2, 0xd7, 0xf7, 0x80, 0x67, 0x0a, ++ 0x91, 0xaf, 0x7f, 0xf8, 0x24, 0x9c, 0x17, 0xfc, 0xab, 0x37, 0x02, 0x78, ++ 0x68, 0xfc, 0xe1, 0xb7, 0x82, 0xb0, 0x9e, 0xb7, 0xd4, 0x16, 0xc6, 0xdf, ++ 0x0f, 0x74, 0x14, 0xc1, 0x39, 0x7a, 0xa3, 0x27, 0x5e, 0x64, 0x62, 0xc9, ++ 0x9e, 0x37, 0x3e, 0x78, 0x2b, 0xf2, 0xdd, 0x4d, 0xc7, 0x6e, 0x2d, 0x62, ++ 0x79, 0x50, 0x56, 0x31, 0xff, 0x5d, 0x80, 0x62, 0x8c, 0x03, 0x6e, 0xbf, ++ 0x0a, 0xd7, 0xb9, 0x98, 0xc4, 0x90, 0xff, 0x1a, 0x1f, 0x50, 0xa2, 0x70, ++ 0x4e, 0xf6, 0x81, 0x4a, 0xea, 0x1e, 0xcb, 0x20, 0x1f, 0x97, 0x06, 0x99, ++ 0x1e, 0x7b, 0x6b, 0xa7, 0x17, 0x3f, 0x7a, 0xf7, 0x16, 0x28, 0x5c, 0xf0, ++ 0x17, 0x5f, 0x54, 0x92, 0xec, 0xbe, 0x2d, 0xcb, 0x4b, 0xbc, 0x55, 0x9c, ++ 0x7b, 0xc0, 0x77, 0x1b, 0x69, 0xfd, 0x03, 0x9d, 0xd1, 0xab, 0x30, 0x28, ++ 0x8b, 0xef, 0x59, 0xe9, 0x0e, 0xbe, 0xdd, 0xbd, 0xb6, 0x07, 0xe8, 0xf4, ++ 0xee, 0x48, 0x6b, 0x28, 0xc4, 0x2b, 0x29, 0x1e, 0xe2, 0x1c, 0x6f, 0x12, ++ 0xe8, 0x21, 0xe5, 0xd8, 0xcc, 0xa1, 0x8c, 0x4e, 0x24, 0xac, 0x4e, 0xe6, ++ 0xfd, 0xa8, 0x9e, 0x9c, 0x0e, 0xcf, 0xa1, 0x7d, 0x8f, 0xc7, 0xf2, 0x4d, ++ 0x70, 0xf4, 0xe3, 0xfb, 0x1a, 0x9b, 0xff, 0x16, 0x3e, 0x3f, 0x85, 0xdb, ++ 0x0f, 0xf6, 0xd9, 0x5b, 0x45, 0xd4, 0xde, 0xc9, 0xb0, 0xbe, 0x65, 0x41, ++ 0x21, 0xff, 0xd4, 0xfe, 0xb0, 0xf1, 0x99, 0x4d, 0xce, 0x99, 0xdc, 0xef, ++ 0x5e, 0xc7, 0xe4, 0x5c, 0xc8, 0x7d, 0x72, 0x6e, 0x1d, 0xbc, 0xff, 0xb7, ++ 0x97, 0x98, 0x1c, 0x41, 0x3f, 0xd8, 0xe7, 0x29, 0x5c, 0xa9, 0xa1, 0xf8, ++ 0xfe, 0xc8, 0x95, 0x12, 0xea, 0x05, 0x2f, 0x49, 0x65, 0x92, 0xef, 0xdd, ++ 0x1e, 0x2e, 0xdf, 0xce, 0xf7, 0xd4, 0x2b, 0x47, 0xfb, 0x56, 0xf0, 0x09, ++ 0x85, 0x5f, 0x85, 0x7d, 0x2b, 0xcd, 0x2f, 0xec, 0x9c, 0x97, 0xd2, 0x01, ++ 0xed, 0xb7, 0xc5, 0xf7, 0xd3, 0xfe, 0x76, 0xfb, 0x1c, 0xe6, 0xc5, 0x76, ++ 0x5a, 0xfa, 0xb9, 0x6d, 0xbf, 0xbf, 0x89, 0xeb, 0x83, 0x4b, 0x82, 0xae, ++ 0xdf, 0xdd, 0xd9, 0x5e, 0x38, 0xa8, 0xef, 0xe4, 0x35, 0x79, 0x92, 0x0f, ++ 0x7f, 0x0f, 0xe4, 0x97, 0xca, 0x2b, 0xec, 0x3f, 0x4d, 0x8f, 0x7a, 0x30, ++ 0x4f, 0xe4, 0x0f, 0xfb, 0x9e, 0x79, 0xf9, 0x1a, 0xca, 0xe7, 0x7f, 0xe8, ++ 0x16, 0x72, 0xeb, 0xd4, 0xa7, 0x6e, 0xb9, 0x6d, 0xdc, 0x7f, 0x11, 0xc9, ++ 0x24, 0xb7, 0x7f, 0x30, 0x22, 0x24, 0xa3, 0xdc, 0xd2, 0xe7, 0x19, 0xe5, ++ 0xd6, 0xe8, 0x45, 0x7e, 0xfe, 0x5b, 0xe9, 0x53, 0x81, 0xbf, 0x45, 0x41, ++ 0x67, 0x9e, 0x93, 0xd0, 0x8f, 0xd9, 0xf0, 0xe8, 0xd6, 0x8f, 0x7f, 0x0d, ++ 0x84, 0xd9, 0xef, 0x22, 0xb8, 0xf4, 0x23, 0xfd, 0xf7, 0x12, 0x99, 0x7c, ++ 0x26, 0x1f, 0x0a, 0xfe, 0x13, 0x7c, 0xb7, 0xf4, 0x9f, 0x97, 0xe3, 0xef, ++ 0x83, 0xf4, 0xf3, 0xa7, 0xe0, 0xbf, 0x7e, 0xfe, 0x14, 0xfc, 0xe7, 0x5e, ++ 0xaf, 0x13, 0x7f, 0xee, 0xf7, 0xe7, 0x83, 0xa1, 0x22, 0xe2, 0xc5, 0xb4, ++ 0xf4, 0xdc, 0x45, 0xe2, 0x01, 0x88, 0xa7, 0xfe, 0x4c, 0xc1, 0x78, 0xea, ++ 0x29, 0x0a, 0xd3, 0x1a, 0x4a, 0xe7, 0x53, 0xfb, 0x4a, 0xf0, 0x1e, 0x71, ++ 0x87, 0x8f, 0xf9, 0xe7, 0xa7, 0xcc, 0xbe, 0x60, 0x7e, 0x25, 0x7e, 0xff, ++ 0x06, 0xeb, 0x7d, 0x85, 0xda, 0x1a, 0xd0, 0x17, 0xe2, 0x79, 0x9f, 0x8f, ++ 0xc5, 0xbf, 0x4f, 0x45, 0xfb, 0x82, 0xf6, 0x3c, 0x90, 0x37, 0x0e, 0x29, ++ 0x41, 0x38, 0xef, 0xea, 0x4d, 0x92, 0xba, 0x4c, 0xfe, 0x08, 0xd5, 0xc8, ++ 0x08, 0x47, 0x2f, 0xc9, 0xf6, 0x9e, 0xc5, 0x8b, 0x4f, 0x81, 0xfd, 0x07, ++ 0xf3, 0xf9, 0x47, 0x25, 0x81, 0x6e, 0x33, 0x15, 0x63, 0xd4, 0x2a, 0xf0, ++ 0xf3, 0x13, 0xec, 0xbe, 0x7c, 0x43, 0xdb, 0xd5, 0x41, 0xc8, 0x53, 0x38, ++ 0x75, 0x68, 0xcc, 0x26, 0xd0, 0x5f, 0x37, 0x3e, 0xaf, 0x10, 0xfe, 0xbb, ++ 0x85, 0x2a, 0xe4, 0x9b, 0xdc, 0xc0, 0xe9, 0xff, 0x36, 0x89, 0x6f, 0x99, ++ 0x4a, 0xd7, 0x79, 0xc3, 0x21, 0xe6, 0x57, 0x34, 0x6c, 0xc8, 0xcc, 0x2f, ++ 0x4b, 0x79, 0xfb, 0xc5, 0xc6, 0x2d, 0x1a, 0xe8, 0x25, 0xea, 0x17, 0xbc, ++ 0x69, 0x8f, 0x87, 0x2f, 0xe5, 0xbf, 0xc7, 0xd4, 0xb8, 0xdd, 0xf5, 0xfc, ++ 0xd0, 0xe5, 0xc8, 0x57, 0x4b, 0x5d, 0x7c, 0x15, 0xe3, 0x7e, 0xe3, 0xa3, ++ 0x82, 0xaf, 0x26, 0x92, 0x89, 0xdc, 0x6f, 0x93, 0xed, 0xf9, 0x6c, 0x33, ++ 0x95, 0xca, 0x4d, 0x60, 0x97, 0x9c, 0x3a, 0xca, 0xe2, 0x90, 0xa7, 0x0f, ++ 0x29, 0x48, 0x8f, 0xd3, 0xfb, 0x24, 0x96, 0xff, 0x04, 0xf1, 0xe0, 0x29, ++ 0xc0, 0x0f, 0x7d, 0x9a, 0x3d, 0x8f, 0xed, 0x24, 0xf0, 0x5f, 0x86, 0xef, ++ 0x1b, 0xf4, 0xbf, 0x7f, 0xfc, 0x37, 0x93, 0xef, 0xa0, 0x4d, 0x9a, 0x9e, ++ 0x78, 0x6d, 0xc2, 0x36, 0x5a, 0x9e, 0x7c, 0xe2, 0xd5, 0xf2, 0x9f, 0x42, ++ 0xfd, 0xc7, 0xbf, 0x1e, 0xf5, 0x1a, 0x39, 0xb3, 0xfd, 0xf4, 0xc3, 0x7f, ++ 0xc6, 0xf3, 0xec, 0x53, 0x87, 0xbd, 0x08, 0xc7, 0xa9, 0xc3, 0x3f, 0x1f, ++ 0x75, 0x07, 0xd4, 0x9f, 0xf4, 0xe2, 0x77, 0x6a, 0x4e, 0xdd, 0xe5, 0x65, ++ 0xf9, 0x9f, 0x87, 0x03, 0xc9, 0xb1, 0xf0, 0x7e, 0x24, 0xcb, 0x17, 0x5a, ++ 0xfd, 0xb3, 0x3f, 0x4d, 0x60, 0xdf, 0x7f, 0x69, 0x47, 0xba, 0xbd, 0x12, ++ 0x64, 0xfe, 0xd8, 0xe9, 0x43, 0xff, 0xfe, 0x5b, 0xc8, 0x1f, 0x3e, 0x7d, ++ 0xc8, 0x1b, 0x86, 0x75, 0x34, 0x1f, 0xce, 0xc1, 0xf3, 0xad, 0xe6, 0x27, ++ 0x7d, 0x18, 0xa7, 0x39, 0xf5, 0xb3, 0x3f, 0x4d, 0xb6, 0xe7, 0x33, 0x7d, ++ 0xd6, 0xf5, 0xac, 0xe0, 0xdf, 0x41, 0x3c, 0x15, 0x20, 0xf5, 0x90, 0xa7, ++ 0x7c, 0x2a, 0x8f, 0x9d, 0x1b, 0x34, 0xff, 0x74, 0xca, 0x2e, 0xb8, 0x47, ++ 0xb4, 0xfc, 0xc0, 0x11, 0x0d, 0xce, 0x63, 0xa6, 0x3f, 0xf5, 0x97, 0x09, ++ 0xa0, 0x77, 0x4e, 0xed, 0x67, 0xf6, 0xc4, 0xfb, 0x9e, 0xde, 0x07, 0xe1, ++ 0x9c, 0xf5, 0x77, 0xc1, 0xeb, 0xd7, 0x7a, 0x20, 0xbe, 0x0b, 0xfb, 0xf5, ++ 0x30, 0x42, 0x5a, 0x73, 0x93, 0x97, 0xc5, 0x8d, 0x4c, 0x78, 0x61, 0x78, ++ 0x38, 0x45, 0xf1, 0x00, 0xeb, 0xa2, 0x78, 0x69, 0x04, 0x7d, 0x99, 0x0d, ++ 0x1f, 0xff, 0xe7, 0x1f, 0x16, 0x1f, 0x7f, 0x5c, 0x00, 0xf3, 0x37, 0x1d, ++ 0xba, 0x18, 0xe5, 0x26, 0x8d, 0x17, 0xc9, 0x62, 0xcf, 0x03, 0x49, 0xb8, ++ 0xda, 0x44, 0xd7, 0xcf, 0x9e, 0x1f, 0xfe, 0xd3, 0x04, 0xb0, 0x8f, 0xfe, ++ 0xd0, 0xdd, 0x86, 0xfb, 0xfc, 0x40, 0xeb, 0x2e, 0xce, 0xfd, 0x7f, 0x6d, ++ 0xdd, 0x52, 0x6a, 0x30, 0xeb, 0xae, 0xf9, 0x87, 0x5d, 0x37, 0xe3, 0xff, ++ 0xc3, 0xc1, 0x30, 0xcb, 0xfb, 0x73, 0xc9, 0xc1, 0x99, 0x7c, 0xfe, 0xe3, ++ 0xdb, 0xb0, 0xfe, 0xc3, 0x40, 0x04, 0xe1, 0x1d, 0xa4, 0xfc, 0xd7, 0xff, ++ 0xc3, 0xae, 0xff, 0x53, 0xd2, 0x7d, 0x3f, 0xa5, 0x7b, 0x70, 0x60, 0xba, ++ 0xff, 0x97, 0x5c, 0x76, 0x2e, 0xfc, 0x8f, 0xb7, 0xee, 0x81, 0xe8, 0xfe, ++ 0x3c, 0xa7, 0x7b, 0xc0, 0x84, 0x3c, 0x84, 0x53, 0x3f, 0xfb, 0x0b, 0xc6, ++ 0xd7, 0xc5, 0xfa, 0x07, 0x5a, 0xf7, 0x96, 0xff, 0xa0, 0xeb, 0x16, 0xf6, ++ 0xd0, 0x7a, 0x39, 0x92, 0x28, 0x2d, 0x81, 0x3c, 0xec, 0x54, 0x4f, 0x58, ++ 0x82, 0xdf, 0xe1, 0x99, 0x97, 0x80, 0xb0, 0x94, 0xc2, 0xf3, 0xae, 0xdd, ++ 0x70, 0x3d, 0x97, 0xcb, 0xfc, 0x0b, 0x45, 0x62, 0x71, 0x1b, 0x32, 0x92, ++ 0xc5, 0x8f, 0x08, 0xf7, 0x37, 0xfa, 0x7f, 0x2f, 0xd6, 0x60, 0xf7, 0xab, ++ 0x54, 0x63, 0x0d, 0xfb, 0x1e, 0x99, 0x1a, 0xc1, 0xef, 0xea, 0xad, 0x3f, ++ 0x6f, 0x51, 0x04, 0x73, 0x3b, 0x48, 0xd5, 0x2b, 0x31, 0xa8, 0x8f, 0x98, ++ 0x8a, 0xbf, 0x73, 0xeb, 0xf6, 0xbb, 0xda, 0x25, 0x62, 0x49, 0xd4, 0xfe, ++ 0x53, 0xcf, 0xfb, 0xea, 0x51, 0xb0, 0xff, 0x3d, 0x15, 0x72, 0xca, 0x3b, ++ 0x01, 0xcb, 0x37, 0xa0, 0x5c, 0xcb, 0xe3, 0x5e, 0x1e, 0x53, 0x73, 0xf8, ++ 0x1b, 0x86, 0xcb, 0x4f, 0xf0, 0x85, 0x9d, 0xef, 0xbd, 0x7c, 0x3c, 0x9d, ++ 0x54, 0x25, 0xe0, 0xf7, 0xbb, 0x75, 0x43, 0x35, 0x93, 0x74, 0x7e, 0xa3, ++ 0x96, 0xfd, 0x7e, 0x34, 0xe4, 0x76, 0x26, 0x6c, 0xe7, 0x86, 0x5e, 0x62, ++ 0xeb, 0x4f, 0xc7, 0xdb, 0x09, 0xbf, 0xc9, 0x62, 0xb3, 0x27, 0xcf, 0x15, ++ 0x7f, 0x7f, 0xca, 0x65, 0xfe, 0xa7, 0x22, 0x55, 0xf5, 0x40, 0x5e, 0x2c, ++ 0x19, 0x2f, 0xb3, 0xef, 0x9a, 0x13, 0x76, 0xaf, 0x78, 0xfd, 0x88, 0x48, ++ 0x72, 0x3d, 0xfa, 0xa1, 0xcc, 0xbf, 0x4c, 0xe3, 0x73, 0x4d, 0x0f, 0xe0, ++ 0x51, 0x25, 0xd4, 0x3f, 0x64, 0xeb, 0x43, 0xbf, 0x92, 0x70, 0x7f, 0x52, ++ 0xe5, 0x43, 0xa8, 0x15, 0xb2, 0xe5, 0x73, 0xb6, 0xe3, 0xfe, 0xd2, 0x80, ++ 0xf4, 0x61, 0xf4, 0x18, 0xd5, 0xc4, 0xe9, 0xb3, 0xd2, 0x41, 0x0f, 0x81, ++ 0xff, 0x0c, 0x74, 0x71, 0xd0, 0x43, 0xe0, 0xf7, 0x5c, 0xe9, 0xe2, 0xa6, ++ 0x87, 0x1b, 0xef, 0xbf, 0xc8, 0x65, 0xf1, 0x39, 0x37, 0x9d, 0x1c, 0xf9, ++ 0x20, 0x85, 0xcc, 0x2f, 0x49, 0x51, 0x03, 0xf9, 0xe7, 0xfb, 0x76, 0x61, ++ 0x5c, 0xe4, 0xbd, 0x1f, 0xbc, 0x71, 0x05, 0xb4, 0x5f, 0xf6, 0x53, 0x85, ++ 0xc0, 0xef, 0xa2, 0xbd, 0xbf, 0x2f, 0x40, 0x52, 0x20, 0xbf, 0x6a, 0x52, ++ 0x03, 0x3f, 0x6b, 0xe9, 0x01, 0x05, 0xe3, 0xc2, 0xff, 0x17, 0x33, 0x38, ++ 0x63, 0x3b, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x8b, 0x08, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xed, 0x7d, 0x7b, 0x7c, 0x54, 0xd5, ++ 0xb5, 0xf0, 0x3e, 0x73, 0xce, 0x4c, 0x66, 0x92, 0x49, 0x32, 0x49, 0x66, ++ 0x26, 0x33, 0x79, 0x31, 0x49, 0x20, 0x82, 0x46, 0x98, 0x04, 0x08, 0xa8, ++ 0x28, 0x13, 0x02, 0x08, 0x42, 0xaf, 0x03, 0x8a, 0x60, 0x6f, 0xd4, 0x91, ++ 0x67, 0x30, 0x4f, 0x90, 0xb6, 0xb4, 0xd5, 0x1f, 0x03, 0x89, 0x31, 0x3c, ++ 0x6c, 0x83, 0x22, 0x0f, 0x4b, 0x75, 0x40, 0x54, 0x5a, 0xa9, 0x0d, 0x18, ++ 0x29, 0x28, 0xda, 0x41, 0x1e, 0x62, 0xad, 0x5f, 0xa3, 0xd2, 0x5b, 0x6c, ++ 0xb1, 0x37, 0xe2, 0x03, 0x15, 0x08, 0x29, 0xad, 0xfd, 0xe8, 0xbd, 0xf6, ++ 0x72, 0xd7, 0x5a, 0x7b, 0xef, 0xcc, 0x39, 0x93, 0x89, 0x68, 0x6f, 0x7f, ++ 0xf7, 0xfb, 0xe7, 0xcb, 0x3f, 0x27, 0xfb, 0x9c, 0x7d, 0xf6, 0x5e, 0x7b, ++ 0xbd, 0xd7, 0xda, 0xeb, 0xec, 0xb9, 0x74, 0x09, 0xfe, 0xc6, 0x33, 0x76, ++ 0x49, 0x5c, 0x19, 0x6b, 0x66, 0xcc, 0xc5, 0x58, 0xed, 0xcf, 0x53, 0x19, ++ 0x73, 0x32, 0x76, 0xcf, 0x9e, 0xa4, 0xc8, 0xf4, 0x42, 0xb8, 0xee, 0xfd, ++ 0x60, 0x38, 0xbb, 0x9a, 0xb1, 0x9e, 0x55, 0xbd, 0x47, 0x73, 0xe1, 0x7e, ++ 0xf8, 0xa7, 0x8a, 0xff, 0x29, 0xec, 0x1e, 0xee, 0x1e, 0x7e, 0x0b, 0xdc, ++ 0xbf, 0x47, 0x63, 0x77, 0x05, 0x4b, 0x63, 0xe3, 0xc8, 0x6b, 0xa6, 0xc3, ++ 0xc4, 0xd8, 0x68, 0xc6, 0xce, 0xee, 0x4f, 0x99, 0x13, 0xb1, 0x33, 0xa6, ++ 0xec, 0x3c, 0x78, 0x27, 0x8d, 0xdb, 0x31, 0xdb, 0x9c, 0xa4, 0xc4, 0xfa, ++ 0xd9, 0x1c, 0x66, 0x9a, 0x17, 0xfa, 0x05, 0xf0, 0x79, 0xf8, 0x27, 0x4a, ++ 0x64, 0x88, 0xd2, 0x7f, 0x3c, 0xc6, 0x56, 0xf2, 0xf1, 0x7e, 0xa2, 0x70, ++ 0xf8, 0xf6, 0x99, 0x23, 0x36, 0x84, 0x6f, 0xe7, 0x36, 0x4b, 0x08, 0xe0, ++ 0x68, 0xdc, 0xf9, 0x27, 0x4b, 0x00, 0xe0, 0xa8, 0xfa, 0xf9, 0xcf, 0xd2, ++ 0xba, 0x61, 0xbe, 0xc6, 0x7d, 0x2a, 0x8b, 0x0e, 0x65, 0xf4, 0x77, 0x89, ++ 0xe1, 0x73, 0x35, 0x9a, 0x34, 0x9c, 0xae, 0xef, 0xe3, 0x95, 0xb1, 0x80, ++ 0x5d, 0xa9, 0x60, 0xac, 0x01, 0xff, 0xf5, 0xc1, 0xb5, 0xb3, 0x7e, 0x3a, ++ 0x4b, 0x83, 0x6b, 0xc7, 0xda, 0x3f, 0xa9, 0x69, 0xf8, 0xbe, 0xf9, 0x54, ++ 0xb7, 0x35, 0xf6, 0x7e, 0xed, 0xcf, 0x5f, 0xde, 0x1b, 0x06, 0xd4, 0xd4, ++ 0x3e, 0xff, 0x4c, 0x9a, 0x0f, 0xae, 0x9f, 0x75, 0x3d, 0x95, 0xc6, 0x4a, ++ 0x69, 0xbc, 0xbb, 0x2d, 0xe9, 0x8c, 0x69, 0x76, 0xcd, 0xd0, 0x1f, 0xc7, ++ 0xbd, 0x98, 0xd9, 0x7f, 0x1c, 0x98, 0x97, 0x31, 0x37, 0xdc, 0xe7, 0xb7, ++ 0x58, 0x63, 0xc7, 0x6a, 0x3e, 0x5f, 0xe7, 0x37, 0x4e, 0x33, 0x84, 0x8f, ++ 0xc1, 0x38, 0x12, 0x6e, 0x58, 0xdf, 0x67, 0xf8, 0x8f, 0x97, 0xb1, 0xb1, ++ 0x8e, 0x54, 0xe7, 0xc7, 0x57, 0xc1, 0xff, 0x63, 0xd8, 0x98, 0x4b, 0x2a, ++ 0x5c, 0x77, 0x66, 0x31, 0x76, 0x4d, 0x7f, 0x3c, 0xc5, 0xf0, 0x15, 0xe6, ++ 0xf4, 0xfc, 0xd9, 0xe7, 0x8f, 0x87, 0x01, 0x3f, 0x67, 0xf7, 0x9c, 0x79, ++ 0x1c, 0xe1, 0xaf, 0xfb, 0xaf, 0x3f, 0x3f, 0xfe, 0x7d, 0xc0, 0x1f, 0x7b, ++ 0xc5, 0xe6, 0x78, 0x0a, 0xd6, 0xdd, 0xf8, 0xd3, 0xdf, 0xa6, 0x21, 0x7d, ++ 0xe5, 0x7b, 0x33, 0x1d, 0x0a, 0xbd, 0xd7, 0x93, 0xcf, 0xc2, 0x5e, 0xe8, ++ 0xd7, 0xf3, 0x6e, 0x52, 0x24, 0x0c, 0xb7, 0x7a, 0x5e, 0x3e, 0x5d, 0xe0, ++ 0x83, 0xf5, 0xf6, 0xec, 0xfe, 0x9b, 0xdb, 0x07, 0xfd, 0x97, 0xbd, 0x3c, ++ 0x29, 0x1b, 0xd7, 0xbf, 0xec, 0x85, 0xaa, 0x6c, 0x66, 0x1f, 0x18, 0x8e, ++ 0x9e, 0x15, 0x8c, 0x45, 0x92, 0xf4, 0x70, 0x45, 0x88, 0x8e, 0xbe, 0x7d, ++ 0x30, 0x68, 0x36, 0x34, 0x0f, 0x88, 0x6b, 0x1c, 0x3d, 0x0e, 0x75, 0x1e, ++ 0x2a, 0x40, 0x38, 0xcf, 0x9d, 0x48, 0xf2, 0x27, 0x21, 0x9e, 0xe0, 0xde, ++ 0xf2, 0x72, 0xa4, 0x0f, 0xd0, 0x69, 0x38, 0x6f, 0xdf, 0x07, 0xf8, 0x6d, ++ 0xd8, 0xf5, 0xe0, 0x9f, 0xd4, 0xe1, 0x89, 0xf0, 0x1c, 0xce, 0x35, 0x79, ++ 0x90, 0xae, 0x1f, 0x4c, 0x46, 0x38, 0x19, 0x8b, 0xe6, 0x32, 0x0f, 0xe2, ++ 0xb7, 0xb7, 0xd5, 0x61, 0xef, 0xdf, 0xbf, 0x8f, 0x5e, 0xc7, 0x81, 0x9e, ++ 0x23, 0xbe, 0x02, 0xdd, 0x76, 0xad, 0xe6, 0xf3, 0x76, 0x00, 0xdd, 0xd2, ++ 0xfa, 0xd3, 0xed, 0x1c, 0xfe, 0x03, 0xf4, 0x69, 0x44, 0xba, 0xa5, 0xc4, ++ 0xe8, 0xf6, 0x39, 0x0b, 0x3d, 0xe1, 0x2d, 0x86, 0x76, 0x67, 0x16, 0xd1, ++ 0x35, 0x11, 0xbe, 0xa2, 0x5f, 0x01, 0x5f, 0x35, 0x0a, 0x1f, 0xff, 0x7a, ++ 0x47, 0xe0, 0x7b, 0x0e, 0x94, 0x9f, 0x3d, 0x29, 0x7d, 0xf4, 0x9a, 0x8e, ++ 0xf4, 0xfa, 0xd9, 0xe7, 0x05, 0x0c, 0xe8, 0xfd, 0x89, 0xb9, 0xf7, 0x4e, ++ 0x36, 0x8a, 0xb1, 0xde, 0x97, 0x93, 0x1c, 0xdb, 0xe1, 0xfe, 0x3d, 0x2f, ++ 0xff, 0x8e, 0xe4, 0xa4, 0xe7, 0x85, 0xb7, 0x2c, 0x48, 0x47, 0xf8, 0xb3, ++ 0x2b, 0xb0, 0xae, 0x1e, 0xd6, 0xf7, 0xd7, 0x85, 0xeb, 0x6c, 0x50, 0xc4, ++ 0x3a, 0x77, 0xa4, 0x46, 0x93, 0xd2, 0x62, 0x78, 0x6f, 0x88, 0xcc, 0x98, ++ 0xe2, 0x4b, 0xa3, 0xfb, 0xef, 0xd3, 0xfd, 0x08, 0xe7, 0x5f, 0xc4, 0x5f, ++ 0x2e, 0xd2, 0x27, 0x72, 0xf0, 0x56, 0x25, 0x01, 0x3d, 0x3a, 0x1c, 0x45, ++ 0xb4, 0x0e, 0x16, 0x71, 0xd1, 0xba, 0xeb, 0x77, 0xfc, 0xc1, 0x82, 0x7c, ++ 0x23, 0xe9, 0x84, 0xf4, 0x51, 0xc6, 0x22, 0xbd, 0xde, 0x9f, 0x8c, 0xf7, ++ 0x25, 0x9d, 0xe4, 0xba, 0xe3, 0xc7, 0x73, 0x20, 0x1e, 0xc6, 0xe8, 0xe8, ++ 0xb6, 0x83, 0xcb, 0x61, 0x7f, 0xba, 0xf6, 0x5a, 0x58, 0x71, 0x22, 0x7a, ++ 0x01, 0xbc, 0xf8, 0x1e, 0xc2, 0x0b, 0xed, 0x9e, 0x6d, 0x49, 0x9a, 0x92, ++ 0xce, 0xef, 0xe7, 0xc1, 0x3a, 0x7a, 0xcc, 0x6c, 0x4e, 0x07, 0xc2, 0x11, ++ 0x51, 0x7e, 0x97, 0x88, 0xbe, 0x8c, 0xad, 0xa2, 0xf5, 0x3c, 0x1b, 0x2f, ++ 0x97, 0x62, 0x7d, 0x97, 0x93, 0xcb, 0xcb, 0xc1, 0xfd, 0x8f, 0xe2, 0xe5, ++ 0xc7, 0x0e, 0x07, 0x8d, 0x2f, 0xf1, 0x73, 0xf6, 0x8b, 0xc4, 0xfa, 0xf9, ++ 0x28, 0xca, 0x39, 0xc0, 0xbf, 0xcf, 0x1e, 0x3a, 0x82, 0xfc, 0xc3, 0x98, ++ 0x35, 0xf2, 0x21, 0x8c, 0x73, 0x17, 0x53, 0x58, 0x7a, 0x71, 0x0c, 0x6f, ++ 0x12, 0xde, 0xb3, 0x1a, 0x23, 0xbd, 0x7b, 0xf6, 0xa7, 0x6a, 0x24, 0x0c, ++ 0xeb, 0x6f, 0xed, 0x38, 0x44, 0x7a, 0x36, 0x5e, 0xbe, 0x61, 0x5d, 0x81, ++ 0x8e, 0x04, 0xf3, 0xfd, 0x4e, 0xcc, 0xd7, 0xb0, 0xef, 0xe0, 0x70, 0xd4, ++ 0x43, 0x67, 0x5f, 0xdd, 0x4f, 0xfc, 0xd7, 0xb0, 0xeb, 0x7d, 0x4b, 0x18, ++ 0xc6, 0x39, 0xba, 0xf3, 0x79, 0x4b, 0x77, 0x69, 0x8c, 0xdf, 0x51, 0x7f, ++ 0x47, 0x74, 0xfa, 0xfb, 0xec, 0x73, 0x07, 0x87, 0x93, 0xbe, 0xc5, 0xf1, ++ 0x13, 0xe8, 0x9b, 0x0f, 0xc5, 0xf8, 0x8d, 0x07, 0x8c, 0xe3, 0x37, 0xee, ++ 0xfa, 0x93, 0x61, 0xfc, 0xda, 0x70, 0x87, 0xc5, 0x61, 0xbf, 0xfc, 0x3c, ++ 0x9f, 0x69, 0x81, 0xd9, 0xb8, 0xde, 0xcf, 0xba, 0xcc, 0x0c, 0xf5, 0xdf, ++ 0x67, 0x1d, 0xea, 0x94, 0x48, 0x82, 0x79, 0x5f, 0x17, 0xf6, 0x4b, 0xe2, ++ 0xa9, 0xf5, 0x2d, 0x0b, 0xd9, 0xb1, 0x51, 0x6f, 0x27, 0x47, 0x92, 0x00, ++ 0x4f, 0xcb, 0xde, 0x9a, 0xf2, 0x87, 0x74, 0x27, 0x5e, 0x2d, 0x3e, 0x40, ++ 0x2d, 0xeb, 0x5c, 0xc9, 0xf9, 0xaa, 0xf3, 0xfe, 0x40, 0x2e, 0xd2, 0xa5, ++ 0xf3, 0xad, 0x6f, 0xaa, 0x68, 0x4f, 0xf6, 0x22, 0x1e, 0xaf, 0x88, 0x8d, ++ 0x5b, 0x71, 0xbc, 0xa9, 0x2a, 0x15, 0xe4, 0xb6, 0xe2, 0x64, 0x70, 0x14, ++ 0xb2, 0x55, 0xbc, 0x3e, 0x18, 0x73, 0xc2, 0x64, 0x80, 0x1b, 0xe6, 0xc9, ++ 0x46, 0xfd, 0xdc, 0x02, 0xe3, 0xf8, 0x60, 0x1c, 0xa6, 0xf9, 0x3d, 0x41, ++ 0x18, 0x57, 0x4d, 0x9b, 0x3c, 0x05, 0xe1, 0x51, 0x1d, 0x26, 0x87, 0x2d, ++ 0xa1, 0x5d, 0xe5, 0xe3, 0x99, 0xed, 0x41, 0x16, 0x02, 0xb8, 0xcc, 0x60, ++ 0xb7, 0x7d, 0x3a, 0x7e, 0xf2, 0xcc, 0x4c, 0x1b, 0xce, 0xd2, 0x71, 0x79, ++ 0x5e, 0x13, 0xea, 0x85, 0xa5, 0xc0, 0x5e, 0xa8, 0x9f, 0x3d, 0x16, 0x36, ++ 0x54, 0x03, 0xf8, 0x98, 0x29, 0xd9, 0xff, 0x14, 0x8c, 0xbb, 0x74, 0x58, ++ 0xa0, 0xec, 0x08, 0xb4, 0x97, 0x2e, 0xf0, 0xf8, 0xc3, 0xf0, 0xdc, 0x7b, ++ 0x0b, 0x7f, 0xef, 0x9c, 0xc3, 0x1e, 0x36, 0x8d, 0xc0, 0x76, 0x41, 0x04, ++ 0xe5, 0x28, 0xe5, 0xa2, 0xca, 0x7c, 0xa0, 0xfa, 0xce, 0x2a, 0xbf, 0x5e, ++ 0xc8, 0x40, 0x25, 0xa4, 0x08, 0xbe, 0xca, 0xed, 0x48, 0x21, 0x3b, 0x93, ++ 0xa2, 0xf9, 0x36, 0x55, 0x43, 0x3b, 0xa5, 0x46, 0xf3, 0x03, 0x46, 0xd9, ++ 0x47, 0xf6, 0x50, 0x7e, 0x86, 0x0b, 0xdf, 0xb3, 0xd0, 0x7b, 0xde, 0x0c, ++ 0x45, 0xfb, 0x18, 0xd7, 0x9d, 0xc6, 0xd2, 0x50, 0xde, 0xe4, 0xf8, 0xb2, ++ 0x9f, 0x1c, 0x97, 0x69, 0xd1, 0xe1, 0xb8, 0x7e, 0x66, 0x65, 0x1a, 0x03, ++ 0xbb, 0x92, 0xc7, 0x38, 0xdc, 0xaa, 0x58, 0x4f, 0x31, 0xeb, 0x52, 0x90, ++ 0xbf, 0x9b, 0x67, 0xa4, 0x6d, 0xc7, 0xf6, 0xd6, 0xd4, 0x1a, 0xb2, 0xff, ++ 0x05, 0xac, 0xf7, 0x60, 0x00, 0xe8, 0xf6, 0x64, 0xda, 0xe4, 0x63, 0xa8, ++ 0xc7, 0xe0, 0x5f, 0x13, 0xf6, 0xcb, 0x6f, 0x32, 0xda, 0xf7, 0x41, 0xcb, ++ 0x8d, 0xed, 0xc2, 0xb0, 0x16, 0x27, 0xbf, 0x3e, 0x53, 0x10, 0xf8, 0xaf, ++ 0xb8, 0xcd, 0x78, 0xdf, 0x59, 0x55, 0xb9, 0x64, 0x90, 0x1f, 0xe4, 0x6c, ++ 0x7d, 0xe7, 0x14, 0x0d, 0xf4, 0xb7, 0x73, 0x76, 0xe5, 0xee, 0x5c, 0xc0, ++ 0xe9, 0xb4, 0x35, 0x6f, 0xf3, 0xf6, 0x33, 0x95, 0x65, 0x5e, 0x68, 0x1f, ++ 0x5f, 0x5f, 0x37, 0x55, 0x03, 0x3d, 0xe2, 0xfc, 0x4d, 0x65, 0x59, 0x01, ++ 0xb4, 0xcf, 0x3f, 0xfc, 0x9d, 0xa9, 0xf4, 0xbc, 0x16, 0x90, 0x74, 0x2d, ++ 0xa8, 0xfe, 0xf5, 0x57, 0x4f, 0x0d, 0x97, 0xc6, 0xe4, 0xd6, 0x05, 0x60, ++ 0xa6, 0xab, 0x24, 0xcf, 0x37, 0x20, 0x1e, 0xce, 0x05, 0xcf, 0xb6, 0xe2, ++ 0xd3, 0xfa, 0x59, 0x7f, 0xb5, 0xc0, 0x23, 0xfc, 0x0b, 0x22, 0x1e, 0xf2, ++ 0xc7, 0x72, 0x3c, 0xe4, 0xd9, 0x4f, 0xee, 0x66, 0xd0, 0x7f, 0x90, 0xa9, ++ 0x7b, 0x25, 0xf2, 0xe5, 0x13, 0x2f, 0xff, 0xdf, 0x0c, 0xec, 0xe7, 0x63, ++ 0x0e, 0x5a, 0xaf, 0x83, 0xb5, 0x38, 0x3e, 0xb6, 0xe2, 0xe2, 0xd9, 0xd8, ++ 0x4b, 0x23, 0xbf, 0x4c, 0x9f, 0x69, 0xec, 0x63, 0xc9, 0x87, 0x6a, 0x4c, ++ 0x0e, 0x54, 0x77, 0xe8, 0xe6, 0x0c, 0xe0, 0xab, 0xd6, 0xb9, 0x43, 0x37, ++ 0x4d, 0x46, 0x5d, 0x5b, 0xe7, 0x27, 0xfe, 0x82, 0x99, 0x1d, 0x64, 0x0f, ++ 0x65, 0x7f, 0x87, 0x93, 0xe8, 0x33, 0x5f, 0xd0, 0x07, 0xe1, 0xb4, 0x02, ++ 0x9f, 0x2d, 0xe0, 0x5d, 0xd8, 0x22, 0x35, 0x6c, 0x61, 0x34, 0x6e, 0xbb, ++ 0x25, 0x48, 0xf6, 0x6a, 0xa2, 0x03, 0xe7, 0x53, 0xc2, 0x75, 0xea, 0xa5, ++ 0xab, 0xbe, 0x3e, 0x5c, 0xf3, 0x90, 0x7f, 0x90, 0x1e, 0xa9, 0x2c, 0x15, ++ 0xef, 0x6b, 0x75, 0x3e, 0x82, 0xef, 0xb0, 0x2b, 0xb0, 0x90, 0xf0, 0xe6, ++ 0x0a, 0xd1, 0x55, 0xde, 0xf7, 0xcc, 0x9d, 0xe3, 0x0b, 0x01, 0x9e, 0x6f, ++ 0xc8, 0x08, 0xd6, 0xe0, 0x7a, 0xbc, 0x0b, 0x2f, 0x16, 0xe0, 0x3a, 0xa6, ++ 0x67, 0x30, 0x1a, 0xaf, 0x6a, 0x91, 0x3d, 0x80, 0xf6, 0xf5, 0xc2, 0x01, ++ 0x50, 0x83, 0x09, 0xe4, 0x4b, 0x5e, 0xb7, 0xaf, 0x60, 0x7e, 0x6d, 0xc8, ++ 0xc0, 0xcf, 0x83, 0x99, 0xa1, 0x6f, 0xe3, 0xbc, 0x45, 0xbf, 0xf4, 0xed, ++ 0x39, 0x06, 0xe3, 0x8d, 0x98, 0x6f, 0xf1, 0xdb, 0x60, 0x8a, 0x11, 0xcb, ++ 0x47, 0xf9, 0xb5, 0x2c, 0xc6, 0x17, 0x84, 0xfe, 0x87, 0xa0, 0x9f, 0x07, ++ 0x69, 0x8a, 0xf2, 0xf7, 0x6d, 0x16, 0x41, 0xf9, 0x3b, 0x9f, 0xa4, 0x04, ++ 0x02, 0xd0, 0x3e, 0x7f, 0xaf, 0x83, 0xf4, 0x73, 0xde, 0xfc, 0xe9, 0xc7, ++ 0xd0, 0xae, 0x9d, 0x4f, 0x29, 0xec, 0x88, 0xe2, 0xfd, 0xef, 0xfb, 0x48, ++ 0x2e, 0xc1, 0x13, 0x50, 0x50, 0x2e, 0xf2, 0x0f, 0xa4, 0x47, 0x6d, 0x69, ++ 0xc4, 0xd7, 0x7f, 0x8d, 0xe3, 0xeb, 0xbf, 0x1a, 0xf9, 0xd8, 0x38, 0xef, ++ 0xf9, 0x4b, 0xbe, 0x7d, 0xdd, 0x34, 0x9e, 0x43, 0x8c, 0x07, 0x8e, 0x11, ++ 0x3c, 0xcf, 0x17, 0xf4, 0x3a, 0xaf, 0x72, 0xff, 0xfc, 0xfc, 0x0a, 0x1f, ++ 0xc1, 0x01, 0x6e, 0xe4, 0x41, 0xb4, 0xbb, 0x5f, 0x75, 0xbe, 0x47, 0x33, ++ 0x84, 0x3d, 0x15, 0xf4, 0xb9, 0xdf, 0x16, 0xd8, 0x88, 0x78, 0x01, 0xfc, ++ 0x6f, 0xd6, 0xe3, 0x7f, 0xeb, 0xc0, 0x74, 0x7c, 0x42, 0xd0, 0xf1, 0x89, ++ 0x44, 0x74, 0x5c, 0x68, 0x6d, 0x2a, 0x40, 0xfd, 0x70, 0x4f, 0xb0, 0x63, ++ 0x32, 0x68, 0x6e, 0x36, 0x23, 0x23, 0xb4, 0x03, 0xc7, 0x3d, 0xbd, 0xf0, ++ 0x68, 0xab, 0x19, 0xd6, 0x53, 0x5f, 0xdd, 0x54, 0x82, 0x4c, 0xdf, 0x9f, ++ 0xbe, 0x0a, 0xe9, 0x73, 0xf7, 0x81, 0xbb, 0x57, 0x9a, 0xa1, 0xdd, 0x88, ++ 0xf4, 0xf1, 0xf5, 0xa7, 0xe3, 0x88, 0xe5, 0x65, 0x44, 0x2f, 0x1d, 0x5d, ++ 0x3b, 0x10, 0x8e, 0x11, 0x07, 0xfe, 0x64, 0x42, 0xb8, 0x25, 0x3d, 0x37, ++ 0x29, 0xdc, 0x0e, 0xc4, 0xbf, 0xff, 0x52, 0x86, 0x22, 0xe6, 0xad, 0x5b, ++ 0x69, 0x06, 0x3c, 0x5e, 0xd8, 0x67, 0x21, 0xff, 0x37, 0xbe, 0xdf, 0x91, ++ 0x0c, 0x1f, 0xf5, 0x93, 0xed, 0xe1, 0xd6, 0x0a, 0xbf, 0x06, 0x72, 0x9a, ++ 0x6d, 0x62, 0xa1, 0x44, 0xe3, 0x1e, 0xe9, 0x37, 0xae, 0xd5, 0x9f, 0x94, ++ 0x00, 0xfe, 0xbe, 0xf1, 0x1c, 0x7c, 0x3c, 0xc0, 0xfb, 0x6b, 0x7a, 0xbc, ++ 0xbf, 0x21, 0xf5, 0x6f, 0x7f, 0xbc, 0xff, 0x1f, 0xec, 0x07, 0x78, 0xa7, ++ 0xeb, 0x57, 0xc0, 0xfb, 0x3b, 0x5f, 0x86, 0x77, 0xe9, 0x6f, 0xd7, 0x0a, ++ 0xbd, 0x50, 0xcb, 0xd6, 0x91, 0x9f, 0xf9, 0x51, 0x60, 0xa6, 0x7b, 0x30, ++ 0xcc, 0x3b, 0x59, 0xb5, 0x13, 0xff, 0x2f, 0x7e, 0x4a, 0x25, 0xb9, 0x83, ++ 0xfe, 0xd3, 0xbd, 0xee, 0x98, 0x1e, 0x59, 0x7c, 0x4d, 0xd3, 0x41, 0x5c, ++ 0xe7, 0xe2, 0x1f, 0x2b, 0xc4, 0xa7, 0xf3, 0x43, 0x5c, 0xbf, 0x9f, 0x59, ++ 0x38, 0xfd, 0x28, 0xea, 0xf5, 0x05, 0xed, 0x46, 0xbf, 0x69, 0xe1, 0x1c, ++ 0xd0, 0x33, 0x00, 0xdf, 0xa2, 0xcd, 0xc6, 0xfb, 0x8b, 0x23, 0x71, 0x71, ++ 0x20, 0xd3, 0xe9, 0x73, 0xe0, 0x87, 0x33, 0x31, 0x7e, 0x1d, 0xc4, 0xf5, ++ 0x8c, 0x87, 0xec, 0xa4, 0x2a, 0xe4, 0xa1, 0x6a, 0x51, 0x69, 0x3a, 0xfa, ++ 0x49, 0xaf, 0x98, 0x7d, 0xbf, 0x21, 0x3f, 0xfc, 0x75, 0x95, 0x6d, 0x4f, ++ 0x80, 0xf7, 0xfc, 0xcc, 0x42, 0xb2, 0xc3, 0x7d, 0xed, 0x26, 0x40, 0x86, ++ 0xce, 0xbe, 0xb3, 0xf9, 0x36, 0x13, 0xea, 0x49, 0x39, 0xee, 0xc4, 0x45, ++ 0xa5, 0xd9, 0xe8, 0xcf, 0x2c, 0x4d, 0xf5, 0x7d, 0x69, 0xfc, 0x35, 0x68, ++ 0xb9, 0xd1, 0x9e, 0x17, 0x86, 0x93, 0x99, 0x4f, 0x37, 0x6e, 0x71, 0x5b, ++ 0xa6, 0xa1, 0x3d, 0xa4, 0x3d, 0xc7, 0xd0, 0xff, 0x8a, 0xcd, 0x45, 0x86, ++ 0xe7, 0xc3, 0x22, 0x57, 0x1a, 0x9e, 0x5f, 0xb5, 0xb3, 0xdc, 0xd0, 0xbe, ++ 0xba, 0xe3, 0x5a, 0x43, 0xff, 0x11, 0xfb, 0x26, 0x18, 0xda, 0x65, 0xd1, ++ 0x9b, 0x0c, 0xfd, 0x47, 0x1e, 0x9b, 0x69, 0x68, 0x8f, 0xee, 0xfa, 0xa6, ++ 0xa1, 0xff, 0x98, 0x13, 0x73, 0x0d, 0xcf, 0xaf, 0xe9, 0xbe, 0xc7, 0xf0, ++ 0xfc, 0xba, 0x4f, 0x96, 0x1a, 0xda, 0xd7, 0xf7, 0x7e, 0xcf, 0xe8, 0xbf, ++ 0x98, 0x18, 0xe9, 0x45, 0x96, 0xac, 0x90, 0x9e, 0x3c, 0xbc, 0xe2, 0x93, ++ 0x8a, 0x0f, 0x91, 0x01, 0x47, 0x29, 0x13, 0x11, 0x9f, 0x55, 0x63, 0x79, ++ 0xdf, 0xc3, 0x4b, 0x2c, 0x26, 0x47, 0x1a, 0x5e, 0x4b, 0x4c, 0x0e, 0xe0, ++ 0x8f, 0x57, 0x17, 0x4c, 0x27, 0xfb, 0x7f, 0x78, 0x89, 0x3b, 0xe0, 0xa3, ++ 0x6b, 0x45, 0x00, 0xe3, 0x1e, 0xa6, 0x8e, 0x1b, 0x15, 0x4a, 0xe0, 0xdf, ++ 0x4e, 0x72, 0x7c, 0x5a, 0xf1, 0xa1, 0x6e, 0xde, 0x2a, 0xab, 0xd9, 0xa0, ++ 0xd7, 0x26, 0x39, 0x8c, 0xed, 0xf2, 0x4c, 0x11, 0x17, 0x0e, 0xe2, 0x7c, ++ 0x33, 0x26, 0xd3, 0x28, 0x57, 0x6a, 0xd3, 0xf4, 0xa8, 0x05, 0x9a, 0x39, ++ 0x8b, 0x07, 0x67, 0xe3, 0x7c, 0x20, 0x5f, 0xd7, 0x66, 0x72, 0xbd, 0x46, ++ 0xd7, 0xaf, 0x20, 0x5f, 0xe3, 0xb1, 0xdf, 0xe9, 0xb4, 0x68, 0x2b, 0xb6, ++ 0xa5, 0x7c, 0x31, 0x61, 0x5f, 0x2b, 0x05, 0x1f, 0xc1, 0x35, 0x60, 0x29, ++ 0x47, 0x86, 0x4a, 0x25, 0x3b, 0x1c, 0xc0, 0x9b, 0x3e, 0xba, 0x1f, 0xd6, ++ 0x20, 0x3e, 0x99, 0x60, 0xf5, 0xe7, 0x1d, 0xc1, 0xf5, 0x98, 0xfc, 0x4e, ++ 0x64, 0xbe, 0x89, 0x73, 0x82, 0x87, 0xcd, 0x9c, 0x03, 0xb9, 0x1d, 0x66, ++ 0x43, 0x4d, 0x5f, 0xc7, 0x0e, 0x4b, 0xf9, 0xf6, 0x98, 0x7c, 0x61, 0xb2, ++ 0x5f, 0x99, 0x8c, 0xf2, 0x49, 0x5b, 0x16, 0x94, 0xa4, 0x33, 0x1d, 0x5e, ++ 0xe7, 0x64, 0xf2, 0xfc, 0x11, 0xd8, 0x7d, 0x7e, 0x75, 0xec, 0x1c, 0xa9, ++ 0x49, 0xfc, 0x15, 0xe9, 0xef, 0x4f, 0x19, 0xad, 0x0d, 0x8d, 0xdd, 0x57, ++ 0x16, 0x4d, 0xcf, 0x46, 0x79, 0xf3, 0x0c, 0xa0, 0x07, 0x2d, 0x9e, 0xe2, ++ 0x61, 0x3b, 0x40, 0xff, 0x5a, 0xbc, 0x85, 0x74, 0x95, 0xf7, 0x5b, 0xe7, ++ 0x98, 0xa6, 0x44, 0x12, 0xd0, 0xb5, 0x36, 0x53, 0x11, 0x70, 0x70, 0x3f, ++ 0x6b, 0x58, 0xcc, 0xcf, 0xaa, 0x25, 0x7a, 0x78, 0xde, 0xde, 0x38, 0x04, ++ 0xf0, 0xd5, 0x50, 0xdd, 0x4b, 0x7e, 0x96, 0xc7, 0xd4, 0xbe, 0xe4, 0x28, ++ 0xae, 0xeb, 0x57, 0x2a, 0xcf, 0x93, 0x81, 0x27, 0x85, 0xfa, 0x60, 0x81, ++ 0xf0, 0x9b, 0x17, 0x4c, 0x7d, 0x78, 0xc9, 0x51, 0xd0, 0x4b, 0x0b, 0xde, ++ 0x1c, 0x42, 0x7a, 0x49, 0xce, 0xb3, 0x75, 0x45, 0x74, 0x98, 0xde, 0x3f, ++ 0xc8, 0x1b, 0x20, 0x8e, 0x7a, 0x3a, 0x93, 0xeb, 0xf1, 0xc7, 0x57, 0x04, ++ 0x86, 0xcd, 0x1f, 0x42, 0x70, 0x91, 0x5e, 0x90, 0x7e, 0x79, 0x41, 0xb8, ++ 0x7e, 0x32, 0xc6, 0x37, 0x83, 0x58, 0x13, 0xc5, 0x89, 0x1b, 0x4d, 0xac, ++ 0x26, 0xd1, 0x38, 0x0f, 0x8a, 0x71, 0xb2, 0x91, 0xe4, 0x08, 0xaf, 0xc3, ++ 0x4e, 0xf2, 0x71, 0x6e, 0xe1, 0xc9, 0x34, 0x0d, 0xd6, 0x91, 0x9c, 0x1a, ++ 0x7a, 0x10, 0xd7, 0x37, 0x77, 0x44, 0x57, 0x05, 0x8f, 0x03, 0x03, 0xfe, ++ 0x99, 0xe0, 0x7f, 0x15, 0x44, 0xef, 0xd8, 0x88, 0xfd, 0x0b, 0x3c, 0x1a, ++ 0x8b, 0x28, 0xfd, 0xe7, 0xcf, 0xae, 0x0e, 0xb5, 0x15, 0xc2, 0xfa, 0x5a, ++ 0x32, 0x4d, 0x7e, 0x3b, 0xb5, 0x7b, 0x15, 0xec, 0x9f, 0x74, 0x1f, 0x63, ++ 0x59, 0xd0, 0xbf, 0xe5, 0xbf, 0x54, 0x82, 0xa7, 0xe5, 0xd5, 0x6b, 0x18, ++ 0xc6, 0x67, 0x49, 0xf6, 0x26, 0x86, 0x7e, 0xac, 0x5c, 0xd7, 0xa1, 0xcc, ++ 0xc7, 0x08, 0x3f, 0x6a, 0x67, 0x0a, 0xd9, 0x3d, 0x86, 0x2e, 0x28, 0xe0, ++ 0xef, 0x5b, 0x82, 0xf6, 0x9f, 0x7b, 0xe6, 0x77, 0xa1, 0x7f, 0xf1, 0xf9, ++ 0x06, 0x33, 0xcd, 0xf7, 0x39, 0xac, 0xd1, 0x01, 0xe3, 0x7f, 0xde, 0xa9, ++ 0x46, 0xd0, 0x59, 0x3f, 0x9a, 0x99, 0x1c, 0x35, 0x41, 0x5b, 0x6d, 0x4b, ++ 0x25, 0x7b, 0x5d, 0x80, 0x3e, 0x27, 0xf4, 0x5f, 0xd8, 0x99, 0x1a, 0xf1, ++ 0x15, 0xc6, 0xf0, 0xa2, 0x6d, 0x1e, 0xc7, 0xa2, 0x60, 0xdf, 0x92, 0xf2, ++ 0xf8, 0xfa, 0x5b, 0x32, 0xed, 0x11, 0x7b, 0x21, 0xad, 0xfb, 0x87, 0x99, ++ 0xa3, 0x63, 0x70, 0xca, 0x75, 0xe7, 0x0f, 0x10, 0x77, 0xbe, 0x22, 0xe0, ++ 0x66, 0x81, 0xa1, 0x06, 0x3a, 0x7b, 0x21, 0x06, 0xeb, 0xc2, 0xb9, 0x35, ++ 0x70, 0xf6, 0x61, 0x1c, 0x75, 0x83, 0x99, 0xe2, 0xc2, 0x05, 0x19, 0x76, ++ 0x82, 0x33, 0xb2, 0x22, 0x3c, 0x6c, 0xbe, 0xb9, 0xff, 0xfa, 0x5a, 0x3d, ++ 0x33, 0x6f, 0xbe, 0x1d, 0xe0, 0x69, 0x3e, 0xae, 0x32, 0x15, 0xc6, 0xf1, ++ 0x75, 0xb7, 0x13, 0x3e, 0x16, 0x02, 0x3e, 0x22, 0xbe, 0xfe, 0xf8, 0x3e, ++ 0xe7, 0x2b, 0xfc, 0xab, 0x49, 0x25, 0xb8, 0x5f, 0x41, 0x7a, 0xa9, 0x9b, ++ 0x27, 0xd3, 0xba, 0x18, 0xfa, 0xf1, 0xf0, 0x5e, 0xfd, 0x13, 0x0a, 0x7b, ++ 0xac, 0x10, 0xf9, 0x32, 0x34, 0x85, 0xe8, 0x9c, 0x63, 0x62, 0x4f, 0x15, ++ 0x26, 0xf0, 0x0f, 0x50, 0xde, 0x5c, 0x88, 0x3f, 0x9e, 0x3f, 0xb0, 0x78, ++ 0x4a, 0xb8, 0x9c, 0x78, 0x06, 0x0f, 0xdb, 0x01, 0xe3, 0xfd, 0x2a, 0x73, ++ 0x40, 0x7f, 0xeb, 0xcd, 0x4c, 0x6e, 0xf7, 0xe9, 0x1a, 0xaf, 0x97, 0xc0, ++ 0xfe, 0x85, 0x11, 0x8e, 0x0b, 0x9b, 0x15, 0xa2, 0xe7, 0x69, 0x25, 0x62, ++ 0x31, 0x03, 0xca, 0x6a, 0x6f, 0x8d, 0x1a, 0xec, 0xbe, 0x1a, 0x50, 0xc9, ++ 0xdf, 0x88, 0x87, 0x0b, 0xf4, 0xd8, 0x89, 0x4c, 0x9d, 0x9f, 0xa3, 0xa6, ++ 0xdf, 0x37, 0x1c, 0xc7, 0x1d, 0xd8, 0x3f, 0xdb, 0x7d, 0xd0, 0x82, 0xfe, ++ 0x99, 0x83, 0x91, 0x7f, 0x26, 0xf5, 0xe7, 0x40, 0xfe, 0x19, 0xfa, 0x65, ++ 0xc8, 0x7f, 0xd2, 0x2f, 0xfb, 0x38, 0x4e, 0x0f, 0xc3, 0xfa, 0x3e, 0x15, ++ 0xeb, 0xfb, 0x34, 0xd1, 0xfa, 0x12, 0xe8, 0xdd, 0x1e, 0xd2, 0xbb, 0xdf, ++ 0x8c, 0x26, 0xf4, 0x6b, 0x5c, 0x96, 0xc4, 0x7a, 0x29, 0x37, 0x8b, 0xeb, ++ 0xbb, 0x46, 0x87, 0x85, 0x51, 0x1e, 0x6a, 0x80, 0xbc, 0xba, 0x2b, 0x4b, ++ 0xfa, 0x71, 0xdc, 0xaf, 0x18, 0x48, 0xcf, 0x5d, 0x2e, 0xde, 0x28, 0x5a, ++ 0x5b, 0x4a, 0xfa, 0xf6, 0x42, 0x97, 0x2f, 0x3d, 0x13, 0xae, 0xce, 0x0f, ++ 0x94, 0xa6, 0x44, 0xe3, 0xa8, 0xcb, 0x9f, 0x1d, 0x89, 0x74, 0x59, 0x6c, ++ 0xab, 0x4c, 0xca, 0x02, 0xf8, 0xec, 0x59, 0x46, 0xfc, 0x6c, 0x59, 0xdd, ++ 0xcf, 0x4e, 0xa5, 0x67, 0x71, 0x7c, 0xd1, 0xb5, 0x1f, 0xbe, 0xec, 0x80, ++ 0x2f, 0x93, 0x01, 0x5f, 0xce, 0xac, 0x2f, 0xf5, 0x03, 0xb9, 0xde, 0xcd, ++ 0xc1, 0xbc, 0x14, 0xcc, 0xd7, 0x23, 0xf0, 0x03, 0xfa, 0xf7, 0x22, 0xe9, ++ 0xdf, 0x5b, 0x7a, 0x6e, 0xc3, 0x58, 0xb1, 0xfe, 0x96, 0x2f, 0x44, 0x9c, ++ 0xcb, 0xfb, 0xbb, 0x85, 0x9e, 0x86, 0x38, 0xf8, 0x86, 0x8f, 0x7c, 0xd4, ++ 0xff, 0xcf, 0x48, 0xbf, 0x58, 0x3c, 0xdc, 0x5d, 0x81, 0x71, 0x50, 0xf3, ++ 0x0b, 0x57, 0xa4, 0xa3, 0x1f, 0x35, 0x71, 0xef, 0xed, 0x0e, 0xbc, 0x5e, ++ 0x70, 0x0e, 0x26, 0xbc, 0x9c, 0xdb, 0x9b, 0x14, 0xc0, 0x79, 0xce, 0x65, ++ 0x82, 0xfe, 0xb4, 0x63, 0x7b, 0xcc, 0x51, 0xcc, 0x13, 0x9c, 0x59, 0x71, ++ 0x2c, 0x53, 0x8f, 0xd7, 0x73, 0xcf, 0xbd, 0x55, 0x61, 0x86, 0x71, 0xce, ++ 0xed, 0x79, 0xab, 0x42, 0xc3, 0x7c, 0x83, 0xc8, 0xa7, 0xc8, 0xe7, 0xf5, ++ 0x97, 0xde, 0xa9, 0x08, 0xc2, 0xfb, 0xe1, 0x09, 0x6c, 0x68, 0x93, 0x5d, ++ 0x47, 0x5f, 0x2b, 0xd7, 0xef, 0x1b, 0x6c, 0x3c, 0x1f, 0xe1, 0x72, 0x5b, ++ 0x5a, 0xd9, 0x08, 0xf0, 0x6b, 0x5d, 0x19, 0xf4, 0xfe, 0xa3, 0x6e, 0xd3, ++ 0x0f, 0xf0, 0xbe, 0x6a, 0x7d, 0xa7, 0xe0, 0x43, 0x94, 0xe7, 0xb8, 0xfc, ++ 0xcb, 0x06, 0xb3, 0xaf, 0xd9, 0x0e, 0x7c, 0x0e, 0x31, 0x96, 0x1f, 0xf3, ++ 0xf8, 0x4b, 0x87, 0x05, 0xbc, 0x0b, 0x30, 0xff, 0x32, 0xc3, 0x43, 0x79, ++ 0x93, 0x66, 0x85, 0xeb, 0xbd, 0xf0, 0x02, 0x1e, 0x1f, 0x3a, 0x8b, 0xd8, ++ 0xd0, 0x42, 0x18, 0xcf, 0x6c, 0x52, 0x55, 0x7c, 0xaf, 0xd7, 0xcb, 0xfc, ++ 0xdb, 0xa1, 0x4b, 0xd2, 0xe1, 0xf6, 0x28, 0xaa, 0xa9, 0xe4, 0xae, 0x8e, ++ 0x00, 0x82, 0x3f, 0x2a, 0x39, 0x93, 0xf0, 0x7e, 0xdd, 0x59, 0x87, 0x82, ++ 0xfe, 0xbe, 0xcc, 0xd7, 0x68, 0x55, 0x7c, 0xbc, 0xde, 0x59, 0x96, 0xc8, ++ 0x76, 0x5d, 0x9e, 0xc6, 0x33, 0x47, 0x23, 0x3b, 0x96, 0xa2, 0x75, 0x30, ++ 0xd4, 0xab, 0xb3, 0x5c, 0xfc, 0x7d, 0x99, 0xaf, 0xa9, 0x9a, 0x39, 0x27, ++ 0x58, 0x89, 0x70, 0x3d, 0x60, 0xa2, 0x78, 0x03, 0x14, 0xa5, 0x82, 0xfa, ++ 0x2b, 0x57, 0xac, 0xa3, 0xd0, 0xbb, 0x67, 0xb5, 0xf4, 0x45, 0x34, 0x37, ++ 0xb2, 0x15, 0xc3, 0xe4, 0x0c, 0x5b, 0x0b, 0xfc, 0x3b, 0x18, 0xf0, 0x9c, ++ 0xe6, 0x33, 0x05, 0x30, 0x3f, 0x9a, 0x96, 0x17, 0x3d, 0x61, 0x06, 0x3f, ++ 0x2c, 0xb7, 0x85, 0xb1, 0x53, 0x3a, 0x7f, 0x2f, 0x05, 0x99, 0x0f, 0xd7, ++ 0xf3, 0xa6, 0x1a, 0xd9, 0x0e, 0xf2, 0x9f, 0xfa, 0xc5, 0x78, 0xeb, 0x1c, ++ 0xf0, 0x67, 0x52, 0x92, 0xb9, 0xfc, 0xa4, 0x05, 0x5b, 0x97, 0x60, 0xde, ++ 0x1a, 0xef, 0xff, 0x6b, 0x39, 0xd2, 0x85, 0xbf, 0x4f, 0xf4, 0x51, 0x31, ++ 0x8d, 0xc4, 0xc2, 0xe9, 0x00, 0x72, 0xea, 0x58, 0xe3, 0xb8, 0x92, 0x7e, ++ 0x9d, 0x2b, 0xac, 0xfe, 0xc1, 0xc0, 0xa8, 0x7b, 0x56, 0x38, 0xe8, 0xfa, ++ 0xf4, 0x0a, 0x0f, 0xc1, 0xf5, 0xf0, 0x0a, 0x1f, 0x5d, 0x7f, 0xb8, 0x62, ++ 0x28, 0xdd, 0x1f, 0x48, 0xce, 0x2e, 0x77, 0x7d, 0x68, 0x05, 0xcc, 0xab, ++ 0xe3, 0x27, 0xe7, 0x18, 0xc0, 0x0a, 0xac, 0xd7, 0xa9, 0x32, 0x92, 0xc7, ++ 0x87, 0x46, 0x57, 0xa4, 0xcf, 0x4d, 0xa0, 0x07, 0xe4, 0xf5, 0xb1, 0x15, ++ 0xc7, 0xdc, 0x13, 0x87, 0x08, 0x04, 0x02, 0x3d, 0x72, 0xea, 0x1c, 0xdb, ++ 0xd6, 0x14, 0x12, 0x9d, 0x51, 0x68, 0x60, 0x75, 0xaf, 0xad, 0x0e, 0x8c, ++ 0x63, 0xec, 0x01, 0x73, 0x60, 0x09, 0x03, 0xd6, 0x7a, 0x20, 0xeb, 0x8b, ++ 0x89, 0x98, 0x57, 0x5a, 0xab, 0x98, 0x28, 0x8f, 0xd4, 0x9a, 0x75, 0x70, ++ 0x75, 0x38, 0x0f, 0xaf, 0x3e, 0x4e, 0xb7, 0x43, 0xef, 0x32, 0xcc, 0x47, ++ 0x7a, 0x47, 0xb5, 0x2b, 0x28, 0xaf, 0xde, 0xba, 0x76, 0xe2, 0x83, 0x51, ++ 0x5d, 0x5d, 0x2c, 0x24, 0xee, 0x07, 0xa0, 0xed, 0x3d, 0xce, 0xef, 0x3f, ++ 0x60, 0xe3, 0x78, 0x5e, 0xc7, 0xd8, 0x14, 0x84, 0xd7, 0xae, 0xb0, 0x20, ++ 0x5e, 0x7b, 0x6c, 0xdc, 0x9e, 0x7c, 0x6c, 0xe3, 0x7a, 0xed, 0x53, 0x71, ++ 0x2d, 0xcc, 0x0a, 0x3d, 0x9c, 0x05, 0xf7, 0xff, 0xe2, 0x38, 0x51, 0xf2, ++ 0x00, 0x80, 0x67, 0x2b, 0xfd, 0x7d, 0x01, 0xee, 0x47, 0xa4, 0x1c, 0xfa, ++ 0x1b, 0xe5, 0x6b, 0xd5, 0xe1, 0x16, 0x2b, 0xca, 0x87, 0xf7, 0xc0, 0xfb, ++ 0xb4, 0x4f, 0xa1, 0x9a, 0xba, 0x2d, 0x0c, 0x4c, 0xe8, 0xf3, 0x8f, 0xbc, ++ 0x4b, 0xf9, 0x2f, 0xd5, 0x12, 0x2c, 0xe4, 0xed, 0x9f, 0xaf, 0xc1, 0x75, ++ 0xb8, 0xd2, 0x82, 0xdb, 0xd0, 0xc5, 0x62, 0xe1, 0x77, 0xa7, 0x1e, 0xf6, ++ 0x80, 0xdc, 0x20, 0x3f, 0x5c, 0x4b, 0xd8, 0x08, 0xa3, 0x1c, 0xaf, 0xb5, ++ 0x89, 0x76, 0xf8, 0xdf, 0x08, 0x0f, 0x6b, 0xcd, 0xbc, 0xfd, 0xfc, 0x23, ++ 0xbf, 0x5d, 0x1d, 0xa6, 0x76, 0x70, 0x31, 0xe2, 0x05, 0xdb, 0x2d, 0x88, ++ 0x97, 0x8c, 0x0e, 0x8f, 0x09, 0xda, 0xf6, 0x95, 0xef, 0xac, 0x3e, 0x76, ++ 0x3d, 0xb6, 0x65, 0xff, 0x77, 0xa8, 0xff, 0x73, 0x59, 0xdc, 0x3e, 0x32, ++ 0x7b, 0xd0, 0x8b, 0xfa, 0xa3, 0xaf, 0xed, 0x80, 0xf6, 0xd5, 0xba, 0xb6, ++ 0xc6, 0xdb, 0xcc, 0xca, 0xaf, 0x72, 0x7d, 0xf5, 0x87, 0xfe, 0x76, 0x34, ++ 0x17, 0xf8, 0xb5, 0xe1, 0x80, 0xd2, 0x81, 0xa0, 0x79, 0x0f, 0xac, 0x57, ++ 0x70, 0x9d, 0xde, 0x7d, 0xeb, 0x09, 0xdf, 0xf4, 0x07, 0xf2, 0x81, 0xcb, ++ 0xa0, 0x3c, 0xa6, 0x35, 0x4c, 0x79, 0xaf, 0xa7, 0x57, 0x1c, 0x73, 0xb4, ++ 0x00, 0x9d, 0xb5, 0xcc, 0x36, 0x37, 0xe2, 0xfd, 0x0a, 0x4f, 0x28, 0x10, ++ 0x48, 0xa0, 0xaf, 0x7f, 0xee, 0x92, 0xfe, 0x2a, 0xf4, 0xd7, 0xe7, 0xbf, ++ 0x22, 0xe6, 0xde, 0x6e, 0x9d, 0xff, 0xec, 0x65, 0x5c, 0x6e, 0x58, 0x0b, ++ 0xe8, 0x87, 0x04, 0xfe, 0x40, 0x91, 0xab, 0xf2, 0x3d, 0x27, 0xac, 0x63, ++ 0x83, 0x12, 0x5a, 0xa3, 0xa2, 0x9e, 0xf9, 0x99, 0xd9, 0x81, 0x7a, 0x84, ++ 0x75, 0x71, 0x3d, 0x74, 0x56, 0x8c, 0xc5, 0x22, 0x39, 0xe4, 0x8f, 0xd4, ++ 0xd9, 0x78, 0xd3, 0xbc, 0x2a, 0xb4, 0x66, 0x18, 0xea, 0x89, 0x3b, 0x34, ++ 0x3f, 0xc6, 0xb9, 0xb5, 0x85, 0xed, 0x95, 0x68, 0x8f, 0x6b, 0xf7, 0x17, ++ 0xfa, 0x57, 0xb2, 0x18, 0xbf, 0xd4, 0x66, 0x74, 0xb8, 0xcb, 0x91, 0x7f, ++ 0x32, 0x8c, 0xed, 0x66, 0x91, 0x17, 0xc9, 0xce, 0x68, 0xca, 0xc8, 0x28, ++ 0xc5, 0xfd, 0x82, 0xf5, 0x05, 0x98, 0xcf, 0x6f, 0x60, 0xed, 0x77, 0x7e, ++ 0x0f, 0xe1, 0xfd, 0xb5, 0xca, 0xd0, 0xaf, 0xfe, 0xf4, 0xe0, 0x35, 0xe9, ++ 0xd7, 0x41, 0xbb, 0x1e, 0xda, 0x68, 0xe7, 0xeb, 0x3b, 0xdf, 0xb2, 0x20, ++ 0x7f, 0x3e, 0xe8, 0xe4, 0xfa, 0xb3, 0xa1, 0x13, 0xf8, 0x07, 0xc6, 0x59, ++ 0x07, 0xf2, 0x15, 0x00, 0xc7, 0x63, 0x9b, 0xe6, 0x48, 0x46, 0xfd, 0xf4, ++ 0x74, 0xa0, 0xe9, 0x4a, 0x74, 0xc9, 0x7a, 0x1f, 0xf9, 0xcb, 0x54, 0x1b, ++ 0x38, 0x75, 0xcf, 0x14, 0x05, 0x1c, 0x44, 0x6f, 0xe7, 0xa5, 0xd5, 0x56, ++ 0x6c, 0x5b, 0x1c, 0xc3, 0x58, 0x19, 0xb6, 0x2d, 0x6b, 0x90, 0xdf, 0x6a, ++ 0xcb, 0x4c, 0x5c, 0x8e, 0x98, 0xe5, 0x57, 0x01, 0x4d, 0xec, 0x4f, 0x42, ++ 0xfb, 0xb7, 0x8f, 0x54, 0xdd, 0x14, 0xb6, 0xc7, 0xec, 0x8d, 0x57, 0xd8, ++ 0xa7, 0xc6, 0xad, 0xf6, 0xb0, 0x89, 0xdb, 0xa7, 0xf3, 0x68, 0xd7, 0x1a, ++ 0x36, 0x9b, 0xc2, 0xa8, 0xbf, 0x4c, 0xd6, 0x2e, 0x0b, 0xd2, 0xd7, 0x8e, ++ 0x7b, 0xaf, 0x44, 0x1f, 0x07, 0xe1, 0x6d, 0x99, 0xd4, 0xe7, 0x71, 0xfa, ++ 0x7a, 0xd9, 0xd4, 0xcc, 0x9b, 0xb0, 0xbd, 0xec, 0x81, 0x22, 0x47, 0xf8, ++ 0x4b, 0xf2, 0x8a, 0x35, 0x17, 0x53, 0x58, 0x44, 0xe7, 0xcf, 0x3c, 0xe8, ++ 0xe4, 0x72, 0x5c, 0xa3, 0x85, 0x69, 0x9f, 0xa3, 0xe6, 0x62, 0x1a, 0x3d, ++ 0xff, 0xe7, 0xcd, 0x67, 0x63, 0x91, 0x91, 0x5f, 0x36, 0x9f, 0x9d, 0x9e, ++ 0xcb, 0xf9, 0xea, 0x62, 0xf3, 0x11, 0x5d, 0x0f, 0x95, 0xff, 0x6a, 0xe3, ++ 0x60, 0xa0, 0xdb, 0xb2, 0xdd, 0x66, 0x53, 0x92, 0x8e, 0xef, 0x96, 0xed, ++ 0x16, 0xfb, 0xc9, 0xb6, 0x40, 0x36, 0x8e, 0xe3, 0xb2, 0x30, 0x81, 0x77, ++ 0xf0, 0xcf, 0x01, 0xbf, 0x5a, 0x61, 0x5f, 0x3b, 0xac, 0x81, 0x9c, 0x3f, ++ 0xd4, 0x27, 0xe7, 0xde, 0x35, 0x13, 0xc7, 0x21, 0xdd, 0x62, 0xcf, 0xd9, ++ 0x58, 0x83, 0x1e, 0x08, 0x60, 0x7c, 0xf8, 0x50, 0xb2, 0xd4, 0x03, 0x85, ++ 0x89, 0xfb, 0x27, 0xc7, 0xf5, 0x2f, 0x92, 0xed, 0x2b, 0xa9, 0x7f, 0x3c, ++ 0x3c, 0xae, 0xe4, 0x58, 0xdb, 0x0a, 0xfd, 0xb5, 0xbf, 0x27, 0xf5, 0xb5, ++ 0x11, 0xbe, 0xf5, 0xa6, 0xb8, 0xf1, 0x32, 0xe5, 0xfc, 0xe5, 0x6b, 0x26, ++ 0xe6, 0xc5, 0xf8, 0xea, 0xb7, 0x59, 0xd7, 0xfd, 0x2a, 0x3c, 0x18, 0x9e, ++ 0x67, 0xb4, 0x57, 0x62, 0x7d, 0x45, 0xef, 0x02, 0xe6, 0x43, 0xbb, 0x8c, ++ 0xfc, 0xea, 0xd7, 0xe9, 0xfd, 0xdf, 0x0a, 0xbf, 0xaf, 0xe6, 0x62, 0xb1, ++ 0x81, 0xde, 0x31, 0xbc, 0x97, 0x18, 0xee, 0x9f, 0x5e, 0xe1, 0x31, 0xec, ++ 0xcb, 0x2d, 0xaa, 0x5e, 0x46, 0xfb, 0x87, 0xbf, 0x15, 0x7a, 0xbe, 0x86, ++ 0x85, 0x29, 0x0e, 0xaa, 0xd9, 0x9a, 0xcb, 0x22, 0xba, 0xbc, 0xc4, 0xff, ++ 0x87, 0xe3, 0x1f, 0x85, 0xe3, 0xba, 0x01, 0xe0, 0xb8, 0xe1, 0x7f, 0x19, ++ 0x8e, 0x42, 0x83, 0x7c, 0xc6, 0xe0, 0x18, 0x6c, 0xb8, 0xff, 0x8f, 0xc2, ++ 0xb1, 0xfd, 0xb6, 0x92, 0x9b, 0x0a, 0xa1, 0xcb, 0xa3, 0x4a, 0xd8, 0x5a, ++ 0x84, 0x76, 0xe1, 0x7e, 0x13, 0xe5, 0x39, 0xd4, 0x8c, 0x89, 0xbe, 0x95, ++ 0xb8, 0x2f, 0x70, 0xbf, 0x46, 0x7e, 0x1e, 0xba, 0x24, 0x58, 0x9f, 0x51, ++ 0xa4, 0xb1, 0x63, 0x5a, 0x39, 0xca, 0x4f, 0x7b, 0x00, 0xe3, 0x72, 0xb6, ++ 0x8a, 0xe7, 0x7b, 0xe0, 0x7e, 0x9b, 0xb9, 0x9c, 0xec, 0x10, 0xf9, 0xc1, ++ 0xc5, 0x07, 0x92, 0xee, 0x46, 0x3f, 0xad, 0xa8, 0x26, 0xb0, 0x18, 0xaf, ++ 0x2c, 0xaf, 0x94, 0xf6, 0x1d, 0xe4, 0xbe, 0x1d, 0x13, 0x79, 0x2b, 0xb9, ++ 0xcf, 0x30, 0xc4, 0xc1, 0x2a, 0x35, 0x70, 0xde, 0x46, 0xb8, 0xee, 0x26, ++ 0x3b, 0x55, 0x14, 0xac, 0xae, 0x45, 0x67, 0x4e, 0x4d, 0x1d, 0x95, 0x8c, ++ 0xf6, 0xf1, 0x51, 0x53, 0x24, 0x8c, 0xf3, 0x85, 0x1f, 0xe6, 0xf3, 0xb9, ++ 0x4c, 0x91, 0x0e, 0x2b, 0xea, 0xde, 0xb4, 0xc1, 0x0e, 0xb4, 0x77, 0xae, ++ 0x34, 0xae, 0xff, 0xd8, 0x9a, 0x52, 0xb2, 0x7f, 0xdb, 0x4d, 0x45, 0x57, ++ 0x2e, 0x01, 0x38, 0x1e, 0x50, 0x2a, 0x93, 0x5f, 0x47, 0x3c, 0x67, 0x14, ++ 0x51, 0x9e, 0x16, 0xef, 0x2f, 0x85, 0xfb, 0xdb, 0x85, 0xdd, 0x52, 0x33, ++ 0xfc, 0x0e, 0xb4, 0x53, 0xdb, 0x85, 0xdd, 0x6a, 0x16, 0xfa, 0x5d, 0xde, ++ 0x4f, 0xc9, 0x0c, 0xde, 0x8d, 0xfe, 0xc4, 0x49, 0x67, 0xc3, 0x4d, 0xd6, ++ 0x6b, 0x50, 0x0f, 0xf9, 0xdb, 0xd0, 0x25, 0xf8, 0x83, 0xb3, 0x61, 0x8d, ++ 0xe7, 0x1a, 0xb4, 0x37, 0xbe, 0x22, 0x2b, 0xd8, 0x97, 0x3f, 0x6c, 0xa8, ++ 0x5f, 0x83, 0xf6, 0x66, 0xfb, 0x4a, 0x5f, 0x8e, 0x23, 0x23, 0xd6, 0x1e, ++ 0xf2, 0x77, 0xb0, 0xd6, 0xa4, 0x27, 0xea, 0xd7, 0xa0, 0xbf, 0xd2, 0x62, ++ 0x5f, 0x7a, 0x0f, 0xfa, 0x3b, 0xf0, 0xfc, 0x57, 0x56, 0x58, 0xe7, 0x33, ++ 0x99, 0x42, 0xef, 0x88, 0xe7, 0x45, 0x7d, 0x7a, 0x0a, 0xf4, 0x12, 0xe8, ++ 0x31, 0x75, 0x65, 0x5f, 0x3b, 0x8c, 0x7a, 0xa9, 0xa8, 0x4f, 0xef, 0xd4, ++ 0x93, 0xde, 0xd9, 0xf1, 0xb8, 0x4a, 0xed, 0x83, 0x30, 0x1f, 0xfa, 0x7d, ++ 0xb0, 0x8e, 0xb0, 0x8a, 0xeb, 0x1d, 0xa2, 0x91, 0x5f, 0x6f, 0x03, 0x58, ++ 0x92, 0xa1, 0x6d, 0x1b, 0x56, 0x44, 0xfb, 0x37, 0xb0, 0x6e, 0x96, 0x8c, ++ 0xfe, 0xf5, 0x30, 0xfe, 0x5c, 0xe6, 0xdd, 0x2d, 0x43, 0x4c, 0x94, 0x77, ++ 0xc7, 0xfe, 0x88, 0x47, 0x9b, 0x97, 0xf7, 0xb7, 0xcc, 0x60, 0x7e, 0xdc, ++ 0x6f, 0xb2, 0xa4, 0xda, 0x29, 0x0e, 0x91, 0x79, 0x7c, 0x55, 0xec, 0x1f, ++ 0x25, 0x8b, 0x3a, 0x0a, 0xc5, 0x31, 0x83, 0x5d, 0x82, 0xf7, 0xad, 0xeb, ++ 0xca, 0x97, 0x62, 0x3c, 0x66, 0x1d, 0x6c, 0xdc, 0x27, 0xb5, 0xc4, 0xd5, ++ 0x5b, 0xa8, 0xf1, 0xf5, 0x17, 0xf6, 0x28, 0xf9, 0x5f, 0xef, 0x39, 0x45, ++ 0xfe, 0x3d, 0x8b, 0x79, 0x2e, 0x15, 0xc7, 0xee, 0x33, 0xe6, 0x2f, 0xc7, ++ 0xab, 0xfb, 0xf6, 0x96, 0x4a, 0x84, 0x77, 0x69, 0x2a, 0x73, 0xa8, 0x98, ++ 0x07, 0x09, 0x45, 0x69, 0x1f, 0x32, 0xde, 0xae, 0x59, 0xc1, 0x8e, 0xfa, ++ 0x74, 0xf2, 0x61, 0xb5, 0xb3, 0x40, 0xa2, 0xfd, 0xfe, 0x17, 0x5d, 0xdc, ++ 0xaf, 0xb5, 0x5f, 0xd4, 0x28, 0xbe, 0xd9, 0xa0, 0x80, 0x7f, 0x83, 0x76, ++ 0x34, 0x95, 0xf3, 0x99, 0xf4, 0x8f, 0xcc, 0x0e, 0xc9, 0xb7, 0x46, 0xbb, ++ 0x2b, 0xfd, 0x25, 0x73, 0x06, 0x5f, 0xcb, 0xb2, 0xa9, 0x13, 0xb2, 0x31, ++ 0xfe, 0x56, 0xed, 0x01, 0x2b, 0xfa, 0x39, 0x07, 0x1d, 0xe5, 0x14, 0xd7, ++ 0xab, 0xcc, 0x7f, 0x73, 0xa5, 0xce, 0xdf, 0x69, 0x89, 0x4e, 0xa5, 0x7c, ++ 0x99, 0xe6, 0x08, 0x90, 0x1f, 0x9e, 0x8d, 0x71, 0x22, 0xe6, 0x7b, 0x1c, ++ 0x7e, 0xa6, 0xf7, 0x73, 0x5a, 0x57, 0x40, 0x60, 0x79, 0x05, 0x63, 0x4f, ++ 0x56, 0x94, 0x4c, 0x40, 0x79, 0x78, 0xcc, 0x16, 0xb5, 0x16, 0x23, 0x7d, ++ 0x1f, 0x35, 0x51, 0xbc, 0x77, 0xa8, 0xfc, 0x9e, 0xb0, 0x82, 0xf9, 0xb2, ++ 0xe5, 0x8c, 0xe4, 0xf4, 0xc9, 0x0a, 0xf7, 0x04, 0xcc, 0x77, 0x6f, 0xd3, ++ 0x82, 0xe9, 0x77, 0xa0, 0xbc, 0x1c, 0x87, 0xf9, 0x7c, 0x9c, 0x6e, 0x7c, ++ 0x9f, 0xb5, 0x59, 0xc1, 0xfc, 0xee, 0xe7, 0xd6, 0x60, 0x3a, 0xea, 0x83, ++ 0x87, 0x90, 0xef, 0x75, 0x78, 0x79, 0xd2, 0xc5, 0xfd, 0xfa, 0x0b, 0x4e, ++ 0xee, 0x77, 0x3e, 0x60, 0xe6, 0x72, 0xd1, 0x0a, 0xf0, 0x44, 0x01, 0x0e, ++ 0xed, 0xe2, 0x55, 0x94, 0x8f, 0x7a, 0xc0, 0xc5, 0xf5, 0x93, 0xa5, 0x7a, ++ 0x22, 0xe5, 0x6b, 0x2c, 0x80, 0x0f, 0xcc, 0xc7, 0x25, 0xb1, 0xa6, 0xb0, ++ 0x83, 0xd6, 0xcb, 0xf3, 0x6b, 0x49, 0x1e, 0x93, 0xa1, 0x6e, 0x4f, 0xbb, ++ 0x38, 0x9c, 0xde, 0xbf, 0xe0, 0x34, 0x19, 0xe2, 0xea, 0x36, 0x58, 0xa7, ++ 0x4f, 0xa7, 0xbf, 0x6c, 0x2c, 0x4c, 0xf9, 0x35, 0xc4, 0xf1, 0x53, 0x09, ++ 0xfc, 0x97, 0x83, 0x82, 0x6e, 0x56, 0xf0, 0x87, 0x7c, 0xe4, 0x9f, 0xc4, ++ 0xed, 0x43, 0xf7, 0xf7, 0x8f, 0xc8, 0x5f, 0x91, 0xf4, 0xe9, 0xf3, 0x53, ++ 0x14, 0xf0, 0x4f, 0xbe, 0x24, 0x1e, 0x6b, 0x84, 0x78, 0x59, 0xaf, 0xef, ++ 0x1b, 0xb5, 0x5e, 0xd2, 0xbf, 0x8d, 0x10, 0x0f, 0xe3, 0xfd, 0x1e, 0x87, ++ 0x95, 0xfc, 0x43, 0x59, 0x97, 0x60, 0x17, 0xfa, 0xac, 0xd5, 0x13, 0x6a, ++ 0xbf, 0x0e, 0xf9, 0x3c, 0x39, 0x6d, 0x38, 0xe6, 0x01, 0x34, 0xd6, 0x41, ++ 0x48, 0x59, 0x87, 0x75, 0x09, 0xa8, 0x0f, 0x3d, 0x5a, 0x6f, 0x1f, 0xff, ++ 0x83, 0xcc, 0x37, 0xdb, 0xd2, 0xb6, 0x63, 0xbf, 0x16, 0x51, 0xa7, 0x90, ++ 0xe2, 0x37, 0xca, 0x4f, 0x32, 0x6b, 0x8f, 0x06, 0x50, 0x3e, 0x87, 0xea, ++ 0xe4, 0x86, 0x21, 0xbe, 0xc3, 0x34, 0x6e, 0x92, 0xcf, 0x78, 0x9f, 0xb1, ++ 0x10, 0xc3, 0x38, 0x43, 0xf3, 0xc4, 0xd7, 0x31, 0x84, 0xfb, 0xea, 0x95, ++ 0xa8, 0xde, 0x4e, 0x63, 0x5b, 0x70, 0x5f, 0x59, 0xfa, 0xbd, 0xb9, 0xa2, ++ 0x5e, 0xe8, 0x5c, 0xca, 0x1f, 0x2b, 0x50, 0x8e, 0xc1, 0xef, 0x1d, 0x9d, ++ 0x45, 0x79, 0x9b, 0x5e, 0x8a, 0x5b, 0x64, 0xbe, 0xe6, 0xeb, 0xfa, 0xc9, ++ 0xd9, 0x38, 0x06, 0xc6, 0xa3, 0xcb, 0xff, 0x5c, 0xf1, 0x21, 0xca, 0xd9, ++ 0x8c, 0xc9, 0x85, 0x78, 0x3f, 0x45, 0xe3, 0x7c, 0x02, 0xae, 0xb8, 0x96, ++ 0x54, 0x8e, 0xe1, 0xd5, 0xe4, 0xc5, 0x19, 0xb0, 0xfe, 0x6f, 0x64, 0x71, ++ 0xfe, 0x73, 0xaa, 0xed, 0x54, 0xd7, 0xf1, 0xbc, 0xb0, 0x63, 0x7f, 0x71, ++ 0xcc, 0xf1, 0x52, 0x1c, 0x05, 0xf8, 0xa4, 0x7a, 0x98, 0x64, 0x7f, 0x37, ++ 0xc5, 0x8b, 0xc2, 0x4f, 0x53, 0xfb, 0xf4, 0xe3, 0xbb, 0xab, 0x03, 0x46, ++ 0xbf, 0x33, 0xac, 0xf7, 0xf3, 0x56, 0x3c, 0xfa, 0xee, 0xea, 0x96, 0x52, ++ 0x8a, 0x57, 0xa8, 0xfd, 0xfc, 0x23, 0x2f, 0xae, 0xc1, 0x78, 0xf0, 0x01, ++ 0x9b, 0x6c, 0xbf, 0x40, 0x6d, 0xb0, 0x73, 0x51, 0x8c, 0x97, 0xd8, 0xde, ++ 0x24, 0x1f, 0xf2, 0x21, 0xbc, 0x1f, 0x40, 0x79, 0x63, 0xb7, 0x95, 0x90, ++ 0x9f, 0xad, 0x16, 0xb1, 0x1c, 0xc4, 0xc7, 0xc4, 0x34, 0x2b, 0xe9, 0x4d, ++ 0x75, 0x6f, 0xd2, 0x76, 0xf4, 0x83, 0x21, 0x2e, 0x7e, 0x2e, 0x4b, 0x97, ++ 0xe7, 0x3c, 0x97, 0x7a, 0xa2, 0x00, 0xfd, 0xe1, 0x04, 0xe3, 0x85, 0x0d, ++ 0xe3, 0x15, 0x7c, 0xbd, 0xf1, 0x60, 0xfe, 0x4e, 0xac, 0x97, 0x91, 0xcf, ++ 0x27, 0xa6, 0x6d, 0x8e, 0xaa, 0xfc, 0x3d, 0x1f, 0xbe, 0xc7, 0xf2, 0xba, ++ 0xfe, 0x18, 0x86, 0xf1, 0x1f, 0x7d, 0x21, 0x89, 0xad, 0x01, 0x14, 0x3e, ++ 0x66, 0x36, 0xca, 0xbb, 0xbc, 0x6e, 0x14, 0x71, 0x26, 0xea, 0x1b, 0x7d, ++ 0xbd, 0xa2, 0xa5, 0x7a, 0x7e, 0x00, 0x99, 0x5a, 0xca, 0x75, 0x92, 0x27, ++ 0x99, 0x45, 0x75, 0xfc, 0x24, 0xe5, 0x5c, 0xbb, 0x38, 0x8c, 0x45, 0x75, ++ 0x72, 0x92, 0xed, 0x2a, 0x24, 0x7a, 0x69, 0x5a, 0x80, 0xf2, 0x48, 0xda, ++ 0xc5, 0x52, 0x7a, 0x7e, 0xc1, 0xc9, 0xf9, 0xa0, 0x75, 0x85, 0xe3, 0x32, ++ 0xf3, 0x64, 0x0e, 0x30, 0xcf, 0x48, 0xd2, 0x1f, 0x03, 0xcf, 0x53, 0x21, ++ 0xf4, 0x0b, 0x13, 0xf9, 0x46, 0x8d, 0xea, 0x5e, 0xa4, 0x5e, 0x18, 0x48, ++ 0xce, 0xe3, 0xf7, 0xb5, 0xe2, 0xf5, 0xa2, 0xbc, 0x4a, 0xbd, 0x98, 0x82, ++ 0x63, 0xc3, 0xf5, 0x05, 0x97, 0x31, 0x8f, 0x7e, 0xcf, 0xe6, 0x8e, 0xa3, ++ 0xc8, 0x42, 0x9f, 0xd9, 0x43, 0xfb, 0x5c, 0xa3, 0xb1, 0x7e, 0xe9, 0x64, ++ 0x1a, 0x9a, 0xf0, 0x3a, 0x53, 0x74, 0x38, 0xf2, 0xf1, 0x47, 0xfd, 0xef, ++ 0x37, 0xe0, 0xe2, 0xa2, 0xe8, 0x54, 0xc0, 0xfd, 0x92, 0x9d, 0x4b, 0x5e, ++ 0x45, 0x76, 0x3d, 0xec, 0x0a, 0x7d, 0x8a, 0x7e, 0xd0, 0x2b, 0x2e, 0x91, ++ 0x9f, 0xf5, 0x80, 0x3d, 0x54, 0xd1, 0xde, 0x81, 0xbd, 0x28, 0xe5, 0xf9, ++ 0x6b, 0x27, 0xe6, 0x63, 0x43, 0xbe, 0x4d, 0x93, 0x18, 0xca, 0xd3, 0x6d, ++ 0x94, 0x8f, 0x55, 0xdd, 0x41, 0x9f, 0x0b, 0xf1, 0x3b, 0xb3, 0x82, 0x72, ++ 0x0e, 0x12, 0xee, 0xb5, 0x2b, 0x78, 0x1d, 0x99, 0xd4, 0xb3, 0x76, 0x2d, ++ 0x44, 0xf8, 0xb2, 0x6a, 0x61, 0x7e, 0x75, 0x84, 0xc0, 0x86, 0x33, 0xf6, ++ 0xb1, 0xeb, 0xd2, 0x4d, 0x18, 0x9b, 0x69, 0x1a, 0x97, 0xa3, 0x5f, 0x3f, ++ 0x7a, 0x96, 0xfc, 0x0a, 0x9b, 0x16, 0x20, 0xbe, 0xb2, 0x39, 0x4c, 0x3e, ++ 0xf4, 0x0b, 0x6c, 0x10, 0x17, 0xa2, 0xde, 0x5d, 0xe9, 0x30, 0xf1, 0xfd, ++ 0x16, 0x8f, 0x95, 0xf2, 0xf5, 0xad, 0x0a, 0x44, 0x88, 0xa0, 0x37, 0x96, ++ 0x66, 0x14, 0x7d, 0xe9, 0x3e, 0xb6, 0xe5, 0xa2, 0x9b, 0xec, 0x2d, 0x40, ++ 0xe2, 0xd1, 0xeb, 0xed, 0x7f, 0xfe, 0x3c, 0x4e, 0x61, 0x1f, 0x8c, 0xf3, ++ 0x68, 0x0e, 0xee, 0x37, 0xb0, 0x43, 0xdc, 0x0e, 0x23, 0x12, 0x3e, 0xd0, ++ 0xe9, 0x63, 0xe9, 0x0f, 0xc4, 0xbf, 0x17, 0x3f, 0xbe, 0xc4, 0xa7, 0xc4, ++ 0xaf, 0x15, 0xf1, 0x5a, 0x4a, 0xf6, 0x30, 0xa1, 0xbf, 0xf1, 0x77, 0x61, ++ 0x37, 0xa5, 0xfe, 0xcc, 0x96, 0xfa, 0xd6, 0x75, 0xa2, 0x24, 0x0a, 0x77, ++ 0xeb, 0x95, 0xee, 0x34, 0xf4, 0x6b, 0x40, 0x8f, 0xfe, 0x1d, 0xf9, 0xa4, ++ 0xe1, 0xea, 0xde, 0x34, 0x93, 0x8f, 0xf4, 0xaf, 0x9b, 0xfb, 0x41, 0x61, ++ 0xf1, 0x3e, 0xb3, 0xeb, 0xf9, 0x5a, 0xe6, 0xa9, 0xe5, 0xba, 0x24, 0xfc, ++ 0x4b, 0x5f, 0x5f, 0x60, 0xd5, 0xef, 0x97, 0xc4, 0xc3, 0x1b, 0x6f, 0x67, ++ 0xed, 0xa5, 0xc6, 0xfa, 0x02, 0x9b, 0xcf, 0x58, 0x5f, 0x20, 0xeb, 0xf6, ++ 0x55, 0x2d, 0x48, 0x7c, 0x63, 0x1e, 0x17, 0xb0, 0xa2, 0x9c, 0xac, 0x74, ++ 0x94, 0x3b, 0xd0, 0xcf, 0x69, 0xd1, 0x7c, 0xbf, 0x0b, 0x50, 0x5d, 0x84, ++ 0x99, 0xfc, 0x6d, 0xf0, 0xdf, 0x0d, 0xf3, 0xcb, 0xeb, 0x43, 0x20, 0xff, ++ 0x08, 0xc7, 0x10, 0xb7, 0xc9, 0x50, 0xf7, 0x22, 0xaf, 0xa9, 0xb8, 0x0f, ++ 0x92, 0xe0, 0xbd, 0x49, 0x6e, 0x8e, 0xbf, 0x87, 0x0e, 0xde, 0x4e, 0x7a, ++ 0x58, 0xf3, 0xf3, 0x7d, 0xa1, 0x78, 0xfa, 0x31, 0xd6, 0x4e, 0xfc, 0x92, ++ 0x5a, 0xc2, 0x1c, 0x94, 0x3f, 0x15, 0xf0, 0xa6, 0x5d, 0x66, 0xdc, 0x81, ++ 0xf8, 0xe8, 0x07, 0x07, 0x6d, 0xe4, 0x27, 0x6b, 0x63, 0xad, 0x11, 0xac, ++ 0xbb, 0x8c, 0x9f, 0x4f, 0x35, 0x07, 0x03, 0x0a, 0xea, 0xdd, 0x32, 0x46, ++ 0x7e, 0xb2, 0x9a, 0xcf, 0xe7, 0x57, 0x87, 0x30, 0xaa, 0xd3, 0x4e, 0x1b, ++ 0x95, 0xc9, 0x86, 0xea, 0xf0, 0xd8, 0xea, 0x99, 0x49, 0xcf, 0x97, 0xba, ++ 0x1c, 0x0c, 0xe9, 0xad, 0xa6, 0x9a, 0x82, 0x89, 0xf8, 0x45, 0xe2, 0xc9, ++ 0xe3, 0x36, 0x19, 0xf6, 0xad, 0x3d, 0x92, 0x6f, 0xbc, 0xbf, 0xa7, 0xfd, ++ 0x15, 0x1d, 0xdf, 0x4c, 0x74, 0xbb, 0xfa, 0xf3, 0x8d, 0xc7, 0xcd, 0xf5, ++ 0x21, 0xc2, 0xa1, 0xa7, 0x6f, 0xab, 0xa7, 0x28, 0x3b, 0x11, 0x7d, 0x62, ++ 0x7a, 0x91, 0xf3, 0xd5, 0xe5, 0xf8, 0xa2, 0x62, 0x1c, 0xf0, 0x3b, 0xda, ++ 0x79, 0xb8, 0x6e, 0x83, 0x75, 0x74, 0x6a, 0x6c, 0xca, 0xee, 0x52, 0x84, ++ 0x8b, 0x51, 0x5d, 0x7b, 0xdd, 0x6c, 0x3b, 0x73, 0x80, 0x5d, 0xbb, 0xc3, ++ 0x53, 0x79, 0x9b, 0x1b, 0xc6, 0xab, 0xe8, 0x7a, 0x95, 0xd7, 0x8b, 0x77, ++ 0xba, 0x28, 0x68, 0xac, 0x13, 0xef, 0xc7, 0xcf, 0xff, 0xb6, 0x9b, 0xeb, ++ 0xdb, 0xb7, 0xdd, 0x5c, 0x3f, 0xa6, 0x9f, 0x08, 0x3c, 0x3b, 0x1e, 0xf0, ++ 0xdc, 0xd9, 0x95, 0xec, 0x53, 0xe0, 0x51, 0x67, 0x66, 0x62, 0x3d, 0xfd, ++ 0x03, 0xb7, 0x62, 0xac, 0x37, 0xd0, 0xba, 0x87, 0xa3, 0xff, 0x22, 0xfb, ++ 0x57, 0x54, 0x1b, 0xe7, 0x0b, 0x0b, 0xfa, 0xdf, 0x2f, 0xdf, 0x0b, 0xdf, ++ 0x9c, 0x89, 0xfe, 0xdc, 0x74, 0xc6, 0x65, 0xa3, 0xd8, 0xaf, 0xf0, 0xfa, ++ 0x86, 0x7d, 0x29, 0x91, 0x21, 0x68, 0x57, 0x59, 0x54, 0xbb, 0x05, 0xf0, ++ 0xba, 0x53, 0xc4, 0x8d, 0x3b, 0x21, 0x9e, 0x9c, 0x01, 0xe3, 0xba, 0x93, ++ 0x59, 0x08, 0xd7, 0xed, 0xca, 0x82, 0x76, 0x29, 0xbd, 0x1f, 0xd8, 0x6d, ++ 0x8f, 0x8d, 0xf7, 0x6b, 0x8e, 0x32, 0x36, 0xa9, 0x38, 0xb8, 0x03, 0xc7, ++ 0x9b, 0x94, 0xed, 0x2d, 0x6b, 0x2e, 0xe4, 0xef, 0xe3, 0x38, 0x47, 0x92, ++ 0x59, 0x8b, 0xb5, 0x3c, 0x86, 0xf7, 0x9b, 0x93, 0x80, 0xe5, 0x32, 0xf1, ++ 0x79, 0x38, 0x67, 0x49, 0x69, 0xec, 0xfe, 0x11, 0x50, 0xee, 0xd8, 0xcf, ++ 0xed, 0xee, 0x1e, 0xae, 0x80, 0xfc, 0xcf, 0x37, 0x05, 0xdc, 0x68, 0x47, ++ 0x3e, 0x7c, 0xeb, 0x7b, 0x54, 0x27, 0xba, 0x88, 0x05, 0x9e, 0xfc, 0x10, ++ 0xe8, 0x73, 0x35, 0xdc, 0xc4, 0xf8, 0xaa, 0xe2, 0x44, 0xd0, 0x82, 0x7a, ++ 0xe1, 0x53, 0x7c, 0x08, 0xf8, 0x7e, 0xdc, 0x1e, 0x5c, 0x8d, 0x7c, 0xb2, ++ 0xa0, 0x7d, 0xea, 0x93, 0xfa, 0x3a, 0x17, 0xb6, 0x83, 0x7f, 0x87, 0x22, ++ 0xf1, 0xd5, 0x9f, 0x1f, 0xb8, 0xfe, 0x01, 0x38, 0xc3, 0xd6, 0x4c, 0x03, ++ 0x9c, 0x6c, 0x2c, 0xc2, 0x6d, 0xe5, 0xef, 0xc5, 0xe3, 0x57, 0x5e, 0xef, ++ 0x12, 0x7c, 0x2c, 0xe9, 0x09, 0xe8, 0xb9, 0x2a, 0x55, 0xd0, 0x73, 0x0d, ++ 0xa0, 0x7e, 0x6e, 0x0a, 0xf7, 0x97, 0x3b, 0x2d, 0x9c, 0x4e, 0x7d, 0xfc, ++ 0xe3, 0xb2, 0xb4, 0xe2, 0x3e, 0xca, 0x59, 0x2b, 0x7f, 0xce, 0x02, 0x43, ++ 0xb9, 0x7f, 0x6f, 0xe5, 0xf4, 0x99, 0x9b, 0x52, 0x10, 0x41, 0xbf, 0xba, ++ 0x53, 0x0b, 0xa4, 0xa0, 0x7f, 0x3f, 0xb7, 0x6f, 0xbf, 0x3e, 0x40, 0xdf, ++ 0xf5, 0xd4, 0xd9, 0x02, 0xe9, 0xd7, 0x20, 0xfd, 0xde, 0xe2, 0xf1, 0xd7, ++ 0xe9, 0x4a, 0x7b, 0x9b, 0x02, 0xe3, 0x9c, 0x36, 0x07, 0xd2, 0x51, 0x6e, ++ 0x4f, 0xbf, 0xa5, 0x2a, 0x2b, 0xa9, 0xfe, 0x81, 0xd7, 0x47, 0xca, 0xba, ++ 0xb3, 0xd3, 0x66, 0xdf, 0xda, 0x2b, 0xe1, 0xf9, 0xbc, 0x1f, 0xa9, 0x81, ++ 0x95, 0xf4, 0xd8, 0x18, 0x57, 0x9c, 0x65, 0x81, 0x91, 0x6f, 0x62, 0x9c, ++ 0xb5, 0x4f, 0xa5, 0x7d, 0xbb, 0xc2, 0x87, 0xef, 0x56, 0xaf, 0x86, 0xfe, ++ 0xf3, 0x21, 0xe0, 0x40, 0xbd, 0x34, 0xb7, 0xca, 0x1e, 0x46, 0x7f, 0xae, ++ 0xf3, 0xf7, 0x4d, 0x7f, 0x44, 0xbb, 0x36, 0xef, 0xf1, 0x24, 0xdf, 0x2a, ++ 0x98, 0xe7, 0xf0, 0xe6, 0x91, 0x7f, 0xc5, 0xf6, 0xc7, 0xeb, 0x52, 0x7d, ++ 0x49, 0x94, 0xaf, 0x2d, 0x52, 0xbc, 0x98, 0x47, 0x5d, 0x5f, 0xe8, 0xa0, ++ 0xfd, 0xb7, 0xe5, 0x4c, 0xf8, 0xad, 0xf7, 0x4e, 0xab, 0x1a, 0xcc, 0xd8, ++ 0x4f, 0xf1, 0x5f, 0xb9, 0x0f, 0x02, 0x6b, 0xfe, 0x98, 0xc9, 0xe7, 0x4f, ++ 0xac, 0x9d, 0x08, 0xeb, 0xbc, 0xd2, 0xd5, 0x69, 0xb2, 0x03, 0x4c, 0x37, ++ 0x64, 0x3f, 0xb1, 0xd6, 0x0a, 0xf4, 0x7e, 0x60, 0x65, 0xd0, 0x83, 0x79, ++ 0x88, 0x73, 0x1b, 0xbf, 0xb5, 0x16, 0xf3, 0x10, 0x6e, 0x77, 0xa0, 0x6b, ++ 0xbc, 0x1f, 0xe0, 0xdb, 0xf4, 0x9d, 0x69, 0xd8, 0xee, 0x7c, 0x4c, 0x8c, ++ 0x17, 0x5e, 0xbe, 0x16, 0xf3, 0x0e, 0x2f, 0x99, 0x42, 0x85, 0x0a, 0x3c, ++ 0x9f, 0xb2, 0x69, 0xfd, 0x34, 0xaa, 0x53, 0x2e, 0x96, 0xe3, 0x3f, 0xb5, ++ 0x36, 0x00, 0xf6, 0x7f, 0xee, 0x13, 0x57, 0xfc, 0xf5, 0x04, 0x8c, 0xdf, ++ 0x90, 0xfd, 0x8b, 0x69, 0xe8, 0x1f, 0x00, 0x7d, 0x05, 0x3c, 0x07, 0x08, ++ 0xbe, 0x05, 0xe3, 0x64, 0xfb, 0x60, 0x4a, 0x15, 0xf8, 0x0e, 0xce, 0x14, ++ 0x66, 0xc8, 0xc7, 0x9a, 0x63, 0x79, 0x0d, 0xca, 0xf7, 0x76, 0x4a, 0x3f, ++ 0x9d, 0x1d, 0x99, 0x86, 0xf9, 0xd8, 0x79, 0x13, 0x9a, 0xaa, 0x34, 0x18, ++ 0x7f, 0x53, 0xf6, 0x1b, 0x6b, 0x4b, 0x87, 0x31, 0x36, 0xa6, 0xbd, 0xd2, ++ 0x11, 0x80, 0xf6, 0xd6, 0xec, 0x37, 0xa7, 0xa5, 0x00, 0x9f, 0x74, 0xb2, ++ 0x40, 0x2d, 0xe6, 0x4d, 0x22, 0xd9, 0xbf, 0x99, 0x66, 0xbd, 0x1e, 0xc6, ++ 0xcf, 0x32, 0x8e, 0xef, 0x54, 0x45, 0x5e, 0x3f, 0xfc, 0xce, 0x5a, 0x1c, ++ 0xaf, 0xa2, 0x3a, 0x50, 0x86, 0xfe, 0x4c, 0xa9, 0xe7, 0xc3, 0xb5, 0x56, ++ 0x78, 0xdf, 0x85, 0x75, 0xac, 0x30, 0xdf, 0x6d, 0x9b, 0x87, 0xad, 0x43, ++ 0xbf, 0x5e, 0xea, 0xd1, 0x7f, 0x11, 0x7a, 0x14, 0xf4, 0xe6, 0x19, 0x94, ++ 0x87, 0x7a, 0x6b, 0xf7, 0x51, 0x4c, 0xf5, 0x16, 0x2c, 0xef, 0xb5, 0xf0, ++ 0xfa, 0x66, 0xa1, 0x3f, 0xf2, 0x38, 0x5f, 0xf7, 0xb5, 0x87, 0x76, 0xf3, ++ 0x7a, 0x74, 0xd9, 0xf6, 0xf0, 0x76, 0xe7, 0xaa, 0xc4, 0xfa, 0xe8, 0x2f, ++ 0x1e, 0xce, 0xf7, 0x9d, 0xc9, 0x89, 0x9f, 0xe7, 0x66, 0x73, 0xfd, 0x23, ++ 0xe5, 0x26, 0xfd, 0x04, 0x0b, 0xec, 0x4a, 0x20, 0x3f, 0xa6, 0x6c, 0xfb, ++ 0xff, 0x48, 0xfe, 0xbc, 0xd9, 0xff, 0x8f, 0xf4, 0x5b, 0xc6, 0x65, 0xf4, ++ 0x5b, 0x86, 0xd4, 0x6f, 0x02, 0x9f, 0xa5, 0x46, 0x7d, 0x0d, 0xd3, 0x08, ++ 0xbd, 0x7f, 0x65, 0x11, 0xea, 0x89, 0x63, 0x6e, 0x9f, 0xc1, 0x5e, 0x57, ++ 0x74, 0xcd, 0x24, 0x7b, 0xf2, 0xae, 0x47, 0xe8, 0x15, 0x1f, 0x7f, 0xdf, ++ 0x55, 0xc5, 0xeb, 0x81, 0x7a, 0xf7, 0xa7, 0x50, 0xbe, 0x8b, 0x59, 0xbb, ++ 0x4a, 0x90, 0x4e, 0xf2, 0xbd, 0xd1, 0x02, 0xef, 0x55, 0x0f, 0x4e, 0xdf, ++ 0x84, 0xfd, 0xea, 0xba, 0xcc, 0x8c, 0xbe, 0xf3, 0xd8, 0x5d, 0xf9, 0xa5, ++ 0x7e, 0x65, 0x1d, 0xe6, 0x87, 0x75, 0x71, 0x48, 0x9d, 0x16, 0xa5, 0xbc, ++ 0x40, 0x1d, 0xe6, 0x87, 0x47, 0xe2, 0x78, 0xbf, 0xb6, 0xa0, 0x3f, 0x84, ++ 0xe3, 0xe0, 0x77, 0x1c, 0xb8, 0x0f, 0x82, 0xf9, 0x5d, 0x57, 0x73, 0x62, ++ 0xfa, 0x4b, 0xbf, 0xaa, 0xee, 0x62, 0x06, 0x0b, 0x8f, 0xec, 0x6f, 0x7f, ++ 0x63, 0xe3, 0x3b, 0xe9, 0xf9, 0xe5, 0xd6, 0x15, 0x1b, 0xcf, 0x98, 0xbf, ++ 0xe8, 0x3f, 0x9e, 0x45, 0xec, 0x27, 0xc5, 0xd9, 0x49, 0x4b, 0x62, 0x38, ++ 0xab, 0x25, 0x9f, 0x02, 0xbe, 0x4d, 0x3a, 0xfe, 0x5a, 0x20, 0xf8, 0x0d, ++ 0xb4, 0x27, 0xf9, 0x93, 0x3d, 0x7b, 0x87, 0x6d, 0x5f, 0x53, 0xa8, 0x9f, ++ 0x97, 0x7f, 0x5f, 0x05, 0xfa, 0xf9, 0xd9, 0xf1, 0xa8, 0x2f, 0x41, 0xdf, ++ 0xa3, 0xbf, 0x59, 0xa1, 0x05, 0xa6, 0x61, 0xff, 0x8a, 0xae, 0x4c, 0xda, ++ 0xa7, 0x92, 0xfc, 0x21, 0xf9, 0x42, 0xd2, 0xb5, 0x33, 0xb3, 0x89, 0xf2, ++ 0x7e, 0xbd, 0x5b, 0x14, 0xf2, 0xa7, 0xe2, 0xe1, 0x9a, 0x27, 0xe1, 0xda, ++ 0xac, 0x70, 0x3f, 0xa4, 0x3a, 0xa4, 0xde, 0xad, 0x83, 0x4f, 0xca, 0x03, ++ 0x8c, 0xdf, 0x29, 0xc6, 0x1f, 0x35, 0x96, 0xe4, 0xe7, 0xc7, 0xdc, 0x9f, ++ 0x06, 0xb9, 0xb9, 0x03, 0xe5, 0x17, 0xf7, 0xbd, 0x71, 0x1d, 0xfe, 0xee, ++ 0xe1, 0x33, 0xaf, 0xee, 0x0f, 0xff, 0xaf, 0x85, 0x1f, 0x05, 0x74, 0xe4, ++ 0xf8, 0x7f, 0xc1, 0x46, 0x75, 0x0a, 0xf1, 0xf6, 0x32, 0x86, 0xff, 0xdc, ++ 0xcb, 0xd0, 0xb3, 0x80, 0x9e, 0x4b, 0x7f, 0xa8, 0x6e, 0x40, 0xbb, 0x99, ++ 0x46, 0xef, 0x65, 0x9f, 0x88, 0xa6, 0xf9, 0xa0, 0x5f, 0x97, 0xe0, 0xff, ++ 0xce, 0x8e, 0x0f, 0xd2, 0xae, 0x43, 0xb9, 0xd8, 0xa7, 0x32, 0xc5, 0xc7, ++ 0xd7, 0x8d, 0x7a, 0xab, 0x42, 0xea, 0xe3, 0xf0, 0x88, 0x37, 0x26, 0x68, ++ 0xe4, 0x97, 0xc5, 0xec, 0x87, 0x8f, 0xfc, 0x33, 0xa9, 0x3f, 0xa3, 0x56, ++ 0x6b, 0xac, 0x7f, 0x70, 0xe3, 0x88, 0x69, 0x2d, 0xa8, 0xbf, 0x93, 0xb8, ++ 0xbc, 0x3a, 0x55, 0xb0, 0x36, 0xe5, 0x31, 0x38, 0x1e, 0xce, 0xe6, 0x7a, ++ 0x6c, 0x6c, 0x28, 0x71, 0x7c, 0xf3, 0x03, 0x77, 0x2a, 0x3d, 0x97, 0xf8, ++ 0xde, 0xb2, 0xbc, 0x8a, 0x7d, 0x00, 0xeb, 0x3b, 0x21, 0xec, 0xfd, 0xd8, ++ 0xee, 0xb0, 0x82, 0x74, 0x59, 0x20, 0xf0, 0xd8, 0xe7, 0xcf, 0x08, 0x7d, ++ 0x76, 0x73, 0x52, 0xf7, 0x73, 0xe2, 0xfb, 0x10, 0x03, 0x3f, 0xca, 0x36, ++ 0xf8, 0x3b, 0x0d, 0xa6, 0x62, 0xdd, 0x73, 0x3b, 0xd7, 0xbb, 0x72, 0x3e, ++ 0x80, 0xb7, 0x85, 0x61, 0xc9, 0x0a, 0x5c, 0x15, 0xb8, 0xde, 0xe6, 0x29, ++ 0x14, 0xe3, 0x70, 0xbe, 0x3c, 0xb5, 0x37, 0x7b, 0x1b, 0xea, 0x0f, 0x67, ++ 0x71, 0xa0, 0x0c, 0xf5, 0x8d, 0xe4, 0x2f, 0xb0, 0x27, 0x62, 0xbd, 0xa6, ++ 0xbb, 0x66, 0xda, 0x39, 0xff, 0xcf, 0x4c, 0x40, 0x87, 0xe7, 0x85, 0xfe, ++ 0x5c, 0xb0, 0x99, 0xaf, 0xbf, 0xf3, 0x3f, 0xaa, 0xa6, 0x21, 0x1f, 0x74, ++ 0xbe, 0x9d, 0x99, 0xb1, 0x4a, 0xc7, 0xef, 0xa7, 0x84, 0x1f, 0x29, 0xc7, ++ 0x95, 0xf2, 0x24, 0xdf, 0x93, 0xcf, 0xf7, 0x8b, 0xf1, 0x5e, 0xc9, 0x4e, ++ 0x23, 0x7c, 0x9c, 0x12, 0xf8, 0x43, 0x38, 0x12, 0xd5, 0x8b, 0xc9, 0xf7, ++ 0x70, 0xbd, 0xa4, 0xaf, 0xdb, 0xb8, 0xbe, 0x86, 0x75, 0x87, 0x91, 0x4e, ++ 0xb0, 0xee, 0xb0, 0x52, 0x8e, 0xeb, 0x56, 0x0c, 0x76, 0xa2, 0xcf, 0x3e, ++ 0x08, 0x7c, 0xd7, 0x5b, 0x00, 0xcf, 0x80, 0xc7, 0x9d, 0xe6, 0x70, 0x0e, ++ 0xd6, 0x31, 0xb9, 0x70, 0x3e, 0xfb, 0xe5, 0xe5, 0x17, 0xd6, 0x43, 0xcf, ++ 0x7b, 0xf7, 0xa7, 0x92, 0xde, 0x89, 0x1f, 0xff, 0x5c, 0x36, 0x8f, 0xe7, ++ 0xb6, 0x99, 0x78, 0x9d, 0xd5, 0x11, 0x13, 0xc8, 0x33, 0xca, 0x99, 0x9d, ++ 0xc3, 0xdb, 0xb3, 0xd7, 0x4b, 0xe3, 0x76, 0x0b, 0x3e, 0xba, 0xbc, 0x3e, ++ 0xfc, 0x6a, 0xf2, 0xb3, 0xcd, 0xc2, 0xeb, 0x62, 0x01, 0x7e, 0xaa, 0x4f, ++ 0xac, 0x7f, 0x31, 0x77, 0x9b, 0x11, 0xfe, 0x95, 0x02, 0xfe, 0x50, 0x33, ++ 0x7e, 0x87, 0xe7, 0xdc, 0xc4, 0xfc, 0xcd, 0x8c, 0xf0, 0x16, 0x45, 0x7c, ++ 0xdd, 0xeb, 0xf1, 0x71, 0xfd, 0x64, 0x09, 0x91, 0xff, 0xd6, 0xbb, 0x85, ++ 0x51, 0xfc, 0x3a, 0x04, 0xfc, 0x08, 0x1f, 0xb4, 0x1b, 0x83, 0xf6, 0x72, ++ 0xa5, 0x30, 0x26, 0xa7, 0x25, 0x1d, 0x0a, 0xd1, 0xb1, 0x62, 0x03, 0xd8, ++ 0x69, 0xc4, 0x9b, 0x55, 0xe2, 0xed, 0xf5, 0x5d, 0xfa, 0x79, 0x3f, 0xcf, ++ 0x4e, 0x35, 0x7c, 0x4f, 0x58, 0x27, 0xe8, 0x3f, 0x04, 0xec, 0xfb, 0xb3, ++ 0x00, 0xef, 0x10, 0x18, 0xe7, 0x39, 0x82, 0x9b, 0xc3, 0x75, 0x6a, 0x63, ++ 0xc7, 0x75, 0x98, 0xa7, 0xeb, 0xb3, 0xf7, 0x9e, 0x34, 0xc1, 0x0f, 0xf1, ++ 0x70, 0x46, 0x2d, 0xb9, 0x1c, 0x4e, 0xaa, 0xcb, 0x40, 0x7f, 0xc7, 0x37, ++ 0x2a, 0x06, 0x27, 0x8e, 0x8f, 0xf3, 0x30, 0x7b, 0x70, 0x15, 0x8e, 0xdb, ++ 0xf0, 0xce, 0x9e, 0x5c, 0xfd, 0xb8, 0xe9, 0x1e, 0xce, 0x6f, 0x4e, 0x75, ++ 0xee, 0x04, 0x1b, 0xea, 0xb1, 0xf5, 0xa0, 0x57, 0x49, 0x1d, 0x84, 0x0e, ++ 0xe1, 0x77, 0x16, 0xf3, 0x0f, 0x64, 0x38, 0xd6, 0x30, 0x8a, 0x1b, 0x4c, ++ 0x18, 0x1f, 0xca, 0x79, 0xe7, 0x8b, 0x7c, 0x2d, 0xc8, 0x65, 0xc5, 0x0c, ++ 0x58, 0x5a, 0x49, 0xdf, 0x3c, 0xa0, 0x3f, 0x75, 0xfa, 0xaf, 0xc8, 0x63, ++ 0xe7, 0xfd, 0xad, 0x55, 0x01, 0xaa, 0x77, 0xd3, 0xb8, 0x7d, 0x72, 0xb5, ++ 0x9f, 0xbe, 0x1f, 0xf7, 0x31, 0x06, 0xb2, 0xab, 0xff, 0x2c, 0x7e, 0x00, ++ 0x3a, 0xd2, 0xba, 0x7b, 0x77, 0xc3, 0xba, 0x7c, 0x31, 0xfc, 0x75, 0x76, ++ 0xdc, 0xbd, 0xca, 0x86, 0xfa, 0xf2, 0x04, 0xf3, 0xa3, 0xbe, 0x94, 0xeb, ++ 0x1a, 0x52, 0xdd, 0x9d, 0x86, 0x75, 0x3c, 0x8d, 0x42, 0x8f, 0x02, 0x5e, ++ 0x4c, 0xc8, 0x07, 0xce, 0x1f, 0xf9, 0x58, 0xb3, 0x4f, 0xa7, 0x9f, 0x05, ++ 0xfd, 0x86, 0x32, 0x2e, 0x6f, 0x32, 0x3e, 0x19, 0x8a, 0x1b, 0x2c, 0xd0, ++ 0xbe, 0xd6, 0x33, 0x5c, 0xea, 0x1b, 0xca, 0x17, 0x9c, 0x7a, 0xf1, 0xe5, ++ 0x67, 0xd7, 0x50, 0x5c, 0xc1, 0xe9, 0xd5, 0x58, 0xcd, 0xe9, 0x2b, 0xe5, ++ 0xf5, 0x0e, 0x4f, 0xe8, 0x5e, 0x0f, 0xca, 0xc1, 0xec, 0xfb, 0x68, 0x7f, ++ 0x07, 0xfa, 0x55, 0xa0, 0xbe, 0xab, 0xdb, 0xc0, 0xe7, 0x81, 0x7e, 0x1d, ++ 0x8c, 0xe4, 0xb6, 0xab, 0xa0, 0x1a, 0xf0, 0xf7, 0x2f, 0x9e, 0xd4, 0x84, ++ 0x74, 0x73, 0x06, 0x3b, 0x6c, 0xf4, 0xbe, 0xe0, 0xff, 0x73, 0xfb, 0xaf, ++ 0x8e, 0x20, 0x1f, 0xba, 0x6e, 0xed, 0xad, 0xc2, 0xfb, 0xc0, 0x0f, 0x04, ++ 0x4f, 0x67, 0x47, 0x6a, 0x04, 0xe3, 0x66, 0xf2, 0x97, 0xf1, 0xfd, 0x97, ++ 0x15, 0x6e, 0xbf, 0x58, 0x88, 0xf0, 0x32, 0xbf, 0xda, 0xe1, 0xd7, 0xf3, ++ 0x89, 0x84, 0xaf, 0x8f, 0xee, 0x0c, 0xe8, 0x7e, 0x75, 0xec, 0xfe, 0x90, ++ 0x6a, 0x3e, 0x6e, 0xe3, 0x3e, 0x18, 0x97, 0x8f, 0x43, 0xf2, 0x53, 0x77, ++ 0x17, 0xa3, 0x7c, 0xb3, 0xa4, 0x0f, 0x80, 0x1c, 0xc6, 0xfc, 0xbe, 0xd4, ++ 0x3b, 0x2e, 0xfc, 0x2c, 0x3e, 0x33, 0x86, 0x47, 0x89, 0x3f, 0xf9, 0x7e, ++ 0x03, 0xbe, 0xcf, 0x78, 0xde, 0x00, 0xe3, 0xbd, 0x46, 0xd6, 0x4d, 0xf9, ++ 0xd3, 0x3a, 0x35, 0x98, 0x87, 0xf1, 0x1a, 0xcb, 0x4e, 0xa2, 0xef, 0x54, ++ 0x21, 0x0e, 0x26, 0xfd, 0x73, 0xc4, 0xc6, 0x34, 0x1b, 0xbc, 0xff, 0x1a, ++ 0x5c, 0xd1, 0xbe, 0x4f, 0x52, 0x97, 0xd0, 0xf7, 0x42, 0x93, 0x8a, 0x15, ++ 0x92, 0x73, 0xd0, 0x10, 0x32, 0x6f, 0x16, 0x45, 0x3f, 0xf2, 0xe6, 0xf1, ++ 0x29, 0xa4, 0x1f, 0xd8, 0x17, 0xf7, 0x0e, 0xc6, 0xf5, 0xb8, 0x52, 0x38, ++ 0xdf, 0xc1, 0x38, 0x56, 0x31, 0x8e, 0x95, 0xfc, 0x54, 0xa1, 0x0f, 0x7f, ++ 0x53, 0x00, 0xfa, 0x50, 0x89, 0xe9, 0xf1, 0x23, 0x8a, 0x42, 0xe3, 0x1c, ++ 0xb9, 0xfe, 0xaa, 0xed, 0x54, 0x9b, 0x29, 0xd6, 0x89, 0xe3, 0xa1, 0xdf, ++ 0x70, 0x44, 0x99, 0x91, 0x47, 0xfe, 0xac, 0xc8, 0x6f, 0x00, 0xde, 0x86, ++ 0xeb, 0xfd, 0xb3, 0x18, 0xff, 0x86, 0x05, 0x5c, 0xdd, 0x05, 0xf8, 0x5c, ++ 0x1f, 0x27, 0x61, 0x5c, 0xd3, 0x17, 0x67, 0x85, 0xc7, 0xaf, 0xbb, 0x11, ++ 0xe2, 0xac, 0x31, 0x53, 0x3a, 0xa2, 0x26, 0x07, 0x4a, 0xc3, 0x84, 0xe9, ++ 0xdf, 0x81, 0x79, 0x27, 0x41, 0x9c, 0x65, 0x83, 0xf5, 0xdf, 0x8f, 0x7c, ++ 0x8c, 0xfa, 0xbe, 0x30, 0xac, 0xa6, 0x21, 0x5c, 0x43, 0x60, 0xdd, 0x70, ++ 0xeb, 0x68, 0x72, 0xa8, 0xb4, 0xc9, 0x1e, 0x9b, 0xc7, 0x2d, 0xf2, 0x5f, ++ 0x6e, 0x51, 0xb7, 0x8c, 0xfe, 0x3c, 0x5e, 0xcd, 0x5e, 0x6e, 0x57, 0xd6, ++ 0x7b, 0xb9, 0xdd, 0xe8, 0x16, 0x57, 0x70, 0x3b, 0x12, 0xe6, 0xcb, 0xfe, ++ 0x53, 0x3c, 0xff, 0x77, 0x3b, 0xd7, 0xe3, 0x6b, 0x2a, 0x13, 0xd7, 0x37, ++ 0x6f, 0xf1, 0x18, 0xf3, 0x9d, 0x37, 0x8b, 0xfd, 0x22, 0x88, 0xb7, 0xb6, ++ 0x20, 0xff, 0x40, 0xbc, 0x25, 0xea, 0x77, 0xf9, 0xfe, 0x12, 0xf8, 0xb5, ++ 0x84, 0xdf, 0xaa, 0x07, 0xab, 0x69, 0xdf, 0xf4, 0xf3, 0xae, 0x59, 0xe9, ++ 0xfc, 0xbc, 0x07, 0x2e, 0xff, 0x0b, 0x44, 0xfd, 0xec, 0x5d, 0xf7, 0xcf, ++ 0xfa, 0x21, 0xf2, 0xdd, 0x87, 0x58, 0x57, 0x0f, 0x74, 0xfc, 0x48, 0xec, ++ 0xef, 0x7d, 0xe8, 0x08, 0xa4, 0x61, 0x9d, 0x59, 0x7d, 0x72, 0xe2, 0x3a, ++ 0xea, 0x5f, 0x7a, 0xf8, 0x3a, 0xeb, 0x05, 0x1e, 0x4e, 0xaf, 0xe0, 0xe7, ++ 0x33, 0x2c, 0xc0, 0x7d, 0x4d, 0xf0, 0x83, 0x77, 0x7b, 0xb8, 0xfd, 0x5a, ++ 0xd4, 0x7e, 0xcb, 0x64, 0xa4, 0xfb, 0x22, 0x88, 0xe3, 0x71, 0x5f, 0x53, ++ 0xd6, 0x4f, 0x48, 0x3a, 0xd7, 0x6c, 0x55, 0x0d, 0xfb, 0x13, 0x0b, 0x70, ++ 0x5f, 0x33, 0xeb, 0x1f, 0x89, 0x23, 0xca, 0x06, 0x88, 0x23, 0x46, 0x19, ++ 0xe2, 0x08, 0x39, 0x6f, 0x7c, 0x3c, 0x71, 0x6a, 0x85, 0xc7, 0xb0, 0x8f, ++ 0x32, 0xb7, 0xbd, 0x58, 0x9c, 0x8f, 0xc1, 0xfb, 0xcf, 0x63, 0x7e, 0x82, ++ 0x7b, 0x5e, 0x5b, 0xae, 0x61, 0x1f, 0x96, 0xb5, 0xb9, 0xbe, 0xd2, 0xb9, ++ 0x06, 0x18, 0x3f, 0x84, 0x13, 0xc2, 0x67, 0x31, 0xdc, 0x3f, 0xb5, 0xc2, ++ 0x0a, 0x02, 0xae, 0x83, 0xe3, 0x93, 0xc1, 0x54, 0x7f, 0xb2, 0xc5, 0x13, ++ 0xfa, 0x9d, 0xc7, 0x00, 0x47, 0x0a, 0x0b, 0x1b, 0xf2, 0xc9, 0xe3, 0x1c, ++ 0xb4, 0xdf, 0x6f, 0xe3, 0x79, 0x6c, 0xa0, 0x7f, 0x58, 0xef, 0x57, 0xc7, ++ 0xc3, 0x75, 0xc6, 0xf3, 0x8f, 0xc6, 0x6b, 0xc5, 0x03, 0xe0, 0xb9, 0xe4, ++ 0x7f, 0x25, 0x5e, 0xab, 0x18, 0xc7, 0xf5, 0x1a, 0x6b, 0x57, 0xa8, 0x96, ++ 0x66, 0xcc, 0xc4, 0x38, 0xff, 0x59, 0xd8, 0xcb, 0x4b, 0x9e, 0x14, 0x43, ++ 0x1e, 0x60, 0x7e, 0xb5, 0xb1, 0x9f, 0xea, 0xe5, 0xf1, 0xbf, 0xea, 0x4d, ++ 0x31, 0xf8, 0xcd, 0x03, 0xe5, 0x01, 0xf4, 0x7e, 0xb3, 0x52, 0x8c, 0xfa, ++ 0x83, 0x8f, 0xd7, 0x20, 0xec, 0x56, 0xe1, 0x67, 0x6f, 0x53, 0x1d, 0xeb, ++ 0x78, 0x2f, 0xf7, 0x33, 0xc6, 0xe6, 0x04, 0x92, 0xbd, 0x70, 0x5d, 0x27, ++ 0xea, 0xd8, 0xd7, 0xd9, 0xf8, 0x77, 0xfe, 0xdb, 0xfe, 0x7e, 0xc8, 0x33, ++ 0x0f, 0xfd, 0x8d, 0x37, 0xcd, 0x54, 0x77, 0xc0, 0xf6, 0x71, 0xfe, 0xa9, ++ 0xfc, 0xf1, 0xb2, 0x66, 0x3c, 0x37, 0xc0, 0xde, 0xa1, 0x38, 0xf4, 0xdf, ++ 0xb5, 0x7e, 0x63, 0xb9, 0x12, 0x98, 0x0f, 0xf2, 0xe0, 0x16, 0x7a, 0xa2, ++ 0xce, 0xcf, 0xd7, 0x53, 0xe7, 0x8f, 0x5a, 0x06, 0xdb, 0xb1, 0xae, 0x99, ++ 0xc3, 0x91, 0xd7, 0x71, 0x50, 0xd1, 0x74, 0x7a, 0x23, 0xaf, 0x86, 0xf7, ++ 0xf3, 0x79, 0xcd, 0x86, 0xfa, 0x80, 0xc1, 0x5e, 0x7e, 0x2e, 0x43, 0x91, ++ 0x57, 0xe6, 0x0d, 0x23, 0x07, 0xa7, 0x3a, 0xb1, 0x7f, 0x40, 0x43, 0x3b, ++ 0x93, 0xd3, 0xa1, 0x90, 0x1d, 0xca, 0x69, 0x62, 0xf4, 0x3d, 0x4e, 0xce, ++ 0x28, 0xee, 0x9f, 0x7d, 0x63, 0xd4, 0x36, 0x65, 0x5e, 0x69, 0x6c, 0xbd, ++ 0x6d, 0xa6, 0x19, 0xa5, 0x0e, 0x78, 0xaf, 0xcd, 0x9d, 0xe2, 0x47, 0xbd, ++ 0xbd, 0x2a, 0x27, 0x74, 0xa5, 0x17, 0xe1, 0x3b, 0x19, 0x8d, 0x62, 0x3a, ++ 0x67, 0xcc, 0xc9, 0x2e, 0x0d, 0xe3, 0xa7, 0x0d, 0x39, 0x81, 0xab, 0x10, ++ 0x0f, 0x72, 0x9d, 0x3e, 0xd5, 0x91, 0x83, 0xf6, 0x27, 0xe5, 0x24, 0x87, ++ 0xaf, 0xbd, 0x2f, 0x2f, 0xc1, 0xf5, 0x36, 0x63, 0x6b, 0x05, 0x5c, 0xdb, ++ 0x79, 0x7c, 0xa8, 0xb2, 0x63, 0x8c, 0xfb, 0xbd, 0xb4, 0x8f, 0xeb, 0x5e, ++ 0x35, 0x94, 0xec, 0x87, 0x5c, 0x8f, 0x3b, 0x53, 0xe8, 0x5f, 0x37, 0x0b, ++ 0xed, 0x21, 0xff, 0x9b, 0xb5, 0x91, 0xfd, 0xb3, 0x72, 0x7b, 0xea, 0x5e, ++ 0x55, 0x42, 0x7e, 0xb2, 0xa4, 0x6b, 0x2c, 0x9f, 0x32, 0xac, 0x1c, 0xf3, ++ 0x29, 0xc5, 0xeb, 0xa2, 0xda, 0x5c, 0x78, 0xef, 0xc5, 0xad, 0xa6, 0x84, ++ 0xe7, 0x58, 0x4c, 0x15, 0x78, 0x87, 0x75, 0x4c, 0xd4, 0xaf, 0xe3, 0x72, ++ 0xf2, 0x2e, 0xfb, 0x99, 0x07, 0xc8, 0x53, 0x49, 0xbe, 0x4f, 0x99, 0x92, ++ 0x38, 0xfe, 0x83, 0x08, 0x90, 0x9e, 0x57, 0xfe, 0xd8, 0xf9, 0x4d, 0x92, ++ 0xcf, 0x16, 0x0b, 0xc3, 0xfc, 0xa6, 0xc4, 0xff, 0x86, 0x9c, 0xe0, 0x6c, ++ 0x84, 0x27, 0xa7, 0x63, 0x9b, 0x82, 0xb8, 0x39, 0x25, 0xea, 0x23, 0x4e, ++ 0x25, 0xf3, 0xfc, 0xed, 0xa9, 0x35, 0xcf, 0x2a, 0xe8, 0x87, 0xdd, 0xbb, ++ 0x98, 0x39, 0x54, 0x36, 0x30, 0xdc, 0x75, 0xcb, 0xd5, 0xc0, 0x7c, 0xbd, ++ 0x3c, 0xb7, 0x58, 0x88, 0x2e, 0x32, 0x0e, 0x88, 0xc1, 0xc3, 0xe3, 0x96, ++ 0x26, 0x2f, 0xd7, 0xeb, 0xaf, 0xe7, 0x04, 0x17, 0x21, 0xbd, 0x1b, 0xf6, ++ 0xad, 0xa7, 0xfc, 0xde, 0xe2, 0x1d, 0xef, 0x5b, 0xbe, 0x74, 0xff, 0xe3, ++ 0x2b, 0xe2, 0x4d, 0xa9, 0xe1, 0xf1, 0x4d, 0xdd, 0x1c, 0x2b, 0xd5, 0x51, ++ 0x55, 0xfe, 0x58, 0x23, 0xba, 0xd7, 0xb6, 0x58, 0x68, 0xbf, 0xb2, 0x6e, ++ 0xd7, 0x6e, 0xfa, 0x8e, 0x8d, 0xdd, 0xc7, 0xfc, 0x28, 0xff, 0x75, 0x1d, ++ 0xbb, 0x95, 0xf9, 0x30, 0x6f, 0xed, 0xae, 0xdd, 0xca, 0x02, 0x1d, 0x1e, ++ 0x73, 0xeb, 0x22, 0x54, 0x37, 0x7e, 0x45, 0xaa, 0xcc, 0x5f, 0x47, 0x2d, ++ 0xa8, 0xcf, 0xe3, 0xf9, 0x1b, 0xf3, 0xff, 0x68, 0xf7, 0x8f, 0xda, 0xb8, ++ 0xfc, 0x9f, 0xad, 0xb4, 0x87, 0x31, 0x9f, 0x7d, 0xd6, 0x1c, 0xaa, 0xc3, ++ 0x7e, 0x67, 0xbd, 0x29, 0x7e, 0xdc, 0x3f, 0x95, 0x78, 0x7f, 0x6d, 0xf7, ++ 0x8d, 0x74, 0x7e, 0x40, 0xea, 0x9e, 0xa4, 0x28, 0x5e, 0xdb, 0x4c, 0xdb, ++ 0x3d, 0x56, 0xe8, 0xd7, 0x76, 0xa5, 0xc5, 0x8f, 0xfc, 0xb4, 0x21, 0x27, ++ 0xb4, 0x0e, 0xe9, 0x92, 0xa9, 0x05, 0x3b, 0xf1, 0xfd, 0x0c, 0x67, 0xaa, ++ 0x1f, 0xf3, 0xe1, 0xbe, 0x24, 0x56, 0x4e, 0x76, 0xef, 0x2b, 0xe2, 0x61, ++ 0x4c, 0x1c, 0x5f, 0x8c, 0xb9, 0x8f, 0xcb, 0xcb, 0x2b, 0x42, 0xbf, 0xc0, ++ 0x1f, 0xd5, 0x71, 0x3d, 0xed, 0xe5, 0x71, 0x2e, 0x6e, 0x07, 0xa0, 0xbe, ++ 0x3a, 0x6a, 0xe6, 0xeb, 0xd8, 0xc3, 0x38, 0xbc, 0x66, 0x6f, 0xe0, 0x47, ++ 0xc4, 0xb7, 0xc7, 0x32, 0x69, 0xde, 0x9c, 0xba, 0xa8, 0x82, 0x75, 0x1f, ++ 0xf1, 0xf3, 0xc6, 0xf8, 0x2a, 0xb0, 0xcd, 0xeb, 0xfa, 0x3a, 0x70, 0x76, ++ 0x58, 0x50, 0xcf, 0xd7, 0x0a, 0x7d, 0x53, 0xf9, 0xe3, 0x1d, 0xca, 0x07, ++ 0x3a, 0xb8, 0x3b, 0xbc, 0x2a, 0xc1, 0x97, 0xb3, 0x6b, 0x9b, 0x82, 0xf9, ++ 0x16, 0x78, 0x4e, 0xfa, 0x06, 0xfa, 0x33, 0xac, 0xb3, 0xca, 0xd9, 0xc5, ++ 0xf3, 0x4c, 0xb5, 0xf0, 0x7c, 0x81, 0x4e, 0xbf, 0xc8, 0x75, 0x24, 0xd0, ++ 0x33, 0xbf, 0xc0, 0xf5, 0xd8, 0x4f, 0x76, 0x1d, 0xe6, 0x7a, 0x26, 0xca, ++ 0xf3, 0xcb, 0x02, 0xde, 0x78, 0x7a, 0x1e, 0xf2, 0xfa, 0x68, 0xfe, 0xc9, ++ 0x60, 0x66, 0xe9, 0xbe, 0x25, 0x3c, 0x14, 0xe3, 0xd0, 0xa3, 0x45, 0xc9, ++ 0x34, 0x9e, 0x94, 0xfb, 0x78, 0x39, 0x3d, 0xe4, 0xe5, 0xfe, 0x58, 0xce, ++ 0xd6, 0x1d, 0x8a, 0xc9, 0x4e, 0x79, 0x78, 0xf2, 0xcb, 0x24, 0x7c, 0xb2, ++ 0xdf, 0xd8, 0x9c, 0x09, 0xaf, 0x21, 0x3c, 0x63, 0xa6, 0x74, 0x11, 0x1e, ++ 0xea, 0xb7, 0x6a, 0xb4, 0x9e, 0x49, 0x96, 0xe0, 0xe0, 0x25, 0x3a, 0x79, ++ 0xf8, 0xad, 0x90, 0x9b, 0x57, 0x67, 0xff, 0x91, 0xce, 0xdb, 0xd9, 0xf0, ++ 0x8b, 0xb7, 0x88, 0x1f, 0xeb, 0xdb, 0x15, 0x1e, 0x0f, 0xb4, 0xbf, 0x65, ++ 0x99, 0x85, 0x76, 0x26, 0xfc, 0x13, 0x15, 0xf7, 0x4d, 0xa6, 0x71, 0xd3, ++ 0xce, 0x36, 0x8a, 0xf3, 0xa8, 0xa6, 0x75, 0x72, 0x3d, 0x5c, 0xdf, 0xb9, ++ 0x5b, 0x9b, 0x67, 0x8f, 0xf1, 0x69, 0xe1, 0x67, 0xaf, 0xd2, 0x39, 0x56, ++ 0xf5, 0x1d, 0x49, 0x0c, 0xf7, 0x53, 0x81, 0xff, 0xfe, 0x80, 0xf4, 0x8b, ++ 0xe7, 0x53, 0x89, 0x1f, 0xa9, 0x67, 0x07, 0xa2, 0x27, 0xe8, 0x23, 0xfe, ++ 0xfd, 0x43, 0xd8, 0x22, 0xf2, 0xd7, 0xa1, 0xc2, 0x99, 0xa9, 0x31, 0x3d, ++ 0x6d, 0x16, 0x78, 0x61, 0x76, 0x7e, 0xff, 0xa2, 0x58, 0x57, 0x8c, 0x7f, ++ 0x42, 0xe7, 0x70, 0xfe, 0x98, 0x9e, 0xb5, 0x91, 0x5c, 0x14, 0x7e, 0x56, ++ 0xfe, 0x2a, 0xd6, 0x99, 0xd6, 0xfb, 0x15, 0x3a, 0xbf, 0xc3, 0x59, 0xc5, ++ 0xf1, 0xa9, 0x87, 0x6b, 0x46, 0xc2, 0x7d, 0x32, 0xae, 0x27, 0x31, 0x4f, ++ 0xce, 0xf3, 0x2a, 0xdd, 0x05, 0x33, 0x75, 0xdf, 0x93, 0xf5, 0xe9, 0x7b, ++ 0xf1, 0xfe, 0x7f, 0x22, 0xbd, 0xb9, 0xdd, 0x88, 0xf2, 0xfb, 0xac, 0x08, ++ 0xed, 0xb7, 0x84, 0x3f, 0x9e, 0x7e, 0x57, 0xe4, 0x70, 0x3f, 0x36, 0x01, ++ 0x9f, 0x69, 0x39, 0x09, 0xec, 0x99, 0xb4, 0xf3, 0x85, 0x8f, 0xef, 0xd1, ++ 0xf0, 0x7b, 0x20, 0xc9, 0x3f, 0xd3, 0x90, 0xee, 0x3a, 0xfe, 0xc9, 0xca, ++ 0xb1, 0xd0, 0xb8, 0x59, 0x39, 0x1a, 0xc1, 0xb3, 0xb1, 0x92, 0xef, 0x5f, ++ 0x6d, 0x34, 0x73, 0x3b, 0xb6, 0x71, 0xa5, 0x95, 0xea, 0x42, 0x5f, 0xbb, ++ 0x9d, 0xd7, 0xa9, 0xa5, 0x7e, 0xd3, 0x12, 0xc5, 0xeb, 0x11, 0xd3, 0xdc, ++ 0x3a, 0x7c, 0x7e, 0x24, 0x87, 0xc3, 0xd1, 0x66, 0x5a, 0x45, 0xdf, 0xc7, ++ 0x81, 0x5c, 0x3a, 0x73, 0x46, 0x23, 0xff, 0xa4, 0x31, 0xae, 0x1f, 0xb9, ++ 0x3e, 0xdc, 0xf0, 0x3c, 0xd7, 0x67, 0x75, 0x61, 0x7b, 0x04, 0xcf, 0xab, ++ 0xa9, 0x0b, 0xdd, 0x3a, 0x9f, 0xea, 0x10, 0x9c, 0x36, 0x3f, 0xd6, 0xef, ++ 0xb2, 0xd0, 0x61, 0xcb, 0xac, 0xd4, 0xfe, 0x7c, 0xe5, 0xdb, 0x73, 0xd0, ++ 0x82, 0xf0, 0x4f, 0xeb, 0xe0, 0xf2, 0x27, 0xe9, 0x00, 0xfa, 0x94, 0xf8, ++ 0x4b, 0xca, 0x83, 0xc4, 0x6b, 0x0c, 0x9f, 0x11, 0x83, 0x3c, 0x49, 0x7a, ++ 0x98, 0xfb, 0xfc, 0x89, 0x50, 0x21, 0xf7, 0x97, 0x78, 0x9c, 0x52, 0xca, ++ 0x54, 0xda, 0x17, 0xaa, 0xb1, 0x06, 0x8e, 0xe2, 0x77, 0x8c, 0x35, 0x62, ++ 0x3f, 0x15, 0xef, 0x63, 0x9d, 0xab, 0xdc, 0x4f, 0x9d, 0x2b, 0xe8, 0xf2, ++ 0xb8, 0x3d, 0x38, 0x12, 0xd7, 0xd9, 0x6f, 0x3f, 0xf5, 0x2b, 0xfa, 0xd9, ++ 0xb5, 0xcb, 0xdf, 0xa0, 0xb8, 0xe6, 0x1e, 0xcf, 0xeb, 0x74, 0x95, 0x72, ++ 0x0b, 0xf1, 0xa0, 0x41, 0xbe, 0x27, 0x08, 0xba, 0x0f, 0xcb, 0xe1, 0xf6, ++ 0x7d, 0x6a, 0x0e, 0xe7, 0x9b, 0xda, 0x51, 0x1d, 0x24, 0x97, 0xb5, 0x1f, ++ 0x36, 0x91, 0x3c, 0xdb, 0xa7, 0x70, 0xbd, 0x66, 0x3f, 0x69, 0xd4, 0xc7, ++ 0x8c, 0x3d, 0x24, 0xd6, 0xbb, 0x8e, 0xde, 0x9b, 0x94, 0xd2, 0x31, 0x19, ++ 0xf7, 0x21, 0x27, 0x3d, 0xa1, 0x38, 0x30, 0x4e, 0x1e, 0x08, 0xce, 0x45, ++ 0xf8, 0x1d, 0x18, 0xc6, 0x4b, 0x5b, 0x0f, 0xa5, 0xdd, 0x8d, 0xf8, 0xfd, ++ 0x02, 0xbc, 0x75, 0xdd, 0x77, 0x42, 0xdf, 0xcc, 0x11, 0xe7, 0x43, 0xee, ++ 0x04, 0x84, 0x13, 0xbf, 0x37, 0x59, 0xbe, 0xcc, 0x1f, 0xbf, 0xdc, 0x78, ++ 0x2c, 0x7a, 0x5c, 0xa1, 0xf3, 0x42, 0x04, 0x2e, 0xcf, 0xee, 0xaa, 0xba, ++ 0xe6, 0x23, 0xdc, 0x37, 0xd8, 0x99, 0xee, 0xc7, 0xef, 0xf3, 0xcf, 0xec, ++ 0xba, 0xe5, 0xbb, 0x1f, 0x01, 0xdc, 0x67, 0x77, 0x8c, 0xf7, 0xa3, 0x9f, ++ 0xe0, 0x6c, 0x0e, 0x12, 0xff, 0xf4, 0xba, 0x6c, 0xfe, 0xed, 0x3c, 0x1f, ++ 0x3a, 0x05, 0xf3, 0x3d, 0x2b, 0x3b, 0x0e, 0xa5, 0xe1, 0x77, 0x45, 0x9f, ++ 0x3e, 0x3b, 0xa2, 0x1c, 0xf5, 0xf6, 0x12, 0x01, 0xe7, 0x67, 0xcf, 0xab, ++ 0xcb, 0x11, 0x2f, 0xab, 0x9e, 0xf9, 0xf9, 0x0d, 0xf8, 0xbc, 0x36, 0xa2, ++ 0x64, 0xa1, 0xff, 0x7a, 0x76, 0xe7, 0x13, 0xff, 0x95, 0x03, 0xe3, 0xd4, ++ 0xec, 0x68, 0xc4, 0x13, 0xc8, 0x58, 0xf3, 0xb3, 0xbf, 0xa4, 0xb8, 0xc0, ++ 0x14, 0xd9, 0xc6, 0xef, 0xef, 0x4c, 0x27, 0x3f, 0xf7, 0xd3, 0x27, 0xd7, ++ 0xdf, 0x80, 0xf8, 0x6e, 0xee, 0x68, 0xa6, 0xe7, 0x9f, 0x3d, 0xb9, 0x8d, ++ 0xda, 0xaf, 0x3e, 0xf3, 0xf3, 0x57, 0xfe, 0x03, 0xf3, 0x1f, 0xc1, 0x34, ++ 0xfa, 0x3e, 0xfa, 0xb3, 0xe7, 0x0f, 0x12, 0x5d, 0xea, 0x42, 0x1a, 0xd5, ++ 0xc5, 0x0f, 0xc4, 0xd7, 0x1b, 0x77, 0x1f, 0xe4, 0xfa, 0x12, 0xed, 0x3c, ++ 0xca, 0xc1, 0x1c, 0xae, 0xc7, 0x24, 0x5f, 0x4b, 0xfe, 0xfd, 0xf4, 0x99, ++ 0xbb, 0xae, 0xd1, 0xdb, 0x0d, 0x79, 0xbf, 0x4d, 0xe4, 0x41, 0xda, 0x92, ++ 0xb9, 0x1d, 0x39, 0x23, 0xe4, 0xb6, 0x76, 0x82, 0xbd, 0x0d, 0xaf, 0x67, ++ 0x7e, 0x66, 0xa3, 0x73, 0x3b, 0x1b, 0x2c, 0xdd, 0x25, 0x18, 0x1f, 0xd7, ++ 0x95, 0x72, 0xbe, 0x58, 0x91, 0xc3, 0xf5, 0x60, 0x5d, 0xc7, 0x12, 0x73, ++ 0x83, 0x9d, 0xde, 0xa7, 0x71, 0xfe, 0x0d, 0xe4, 0x1d, 0xaf, 0x57, 0x03, ++ 0x7f, 0x62, 0xfd, 0x19, 0xf4, 0xda, 0x71, 0x89, 0xea, 0xa8, 0x9e, 0xa3, ++ 0xfe, 0xd0, 0x6f, 0x2c, 0xe6, 0x49, 0x66, 0x57, 0xbf, 0xcf, 0xbf, 0x2b, ++ 0x2d, 0x6d, 0x32, 0xd7, 0x12, 0x9c, 0xcf, 0xf2, 0xe7, 0xb0, 0x6a, 0xfd, ++ 0xf3, 0x8a, 0x65, 0x89, 0xf7, 0x35, 0xb6, 0xe4, 0xd8, 0x0d, 0xf9, 0xd1, ++ 0x9c, 0xce, 0x19, 0x79, 0x3e, 0xd2, 0x03, 0x49, 0xfe, 0x21, 0x3a, 0xff, ++ 0x37, 0xa7, 0x26, 0xd4, 0x8c, 0x75, 0x02, 0x37, 0x2d, 0x0b, 0xf9, 0xf1, ++ 0x3b, 0xfa, 0x17, 0x3f, 0x79, 0x7b, 0x32, 0xe6, 0xd3, 0x9e, 0x19, 0xaa, ++ 0x8c, 0x24, 0xfa, 0xab, 0x0a, 0xb7, 0x73, 0x61, 0x3b, 0xcd, 0x53, 0x8f, ++ 0xfb, 0x0e, 0x10, 0x7f, 0x3c, 0x2b, 0xe4, 0xc4, 0xed, 0x60, 0xce, 0x6b, ++ 0x61, 0x3d, 0x93, 0x34, 0xe6, 0xb4, 0xe3, 0x95, 0xb1, 0xe3, 0x66, 0xd2, ++ 0x0b, 0x4f, 0xd1, 0xf8, 0xe0, 0xe7, 0x90, 0xff, 0xe6, 0xfb, 0xe5, 0xec, ++ 0xa7, 0xd0, 0xef, 0xd9, 0x68, 0x0e, 0x79, 0x47, 0xe3, 0x38, 0x6d, 0xc2, ++ 0x3e, 0xee, 0xe0, 0xf0, 0xc3, 0xfb, 0x0e, 0x7b, 0x39, 0x8d, 0xe7, 0xb8, ++ 0x96, 0xfb, 0xeb, 0x4b, 0xf1, 0xbd, 0xf3, 0x2b, 0xa7, 0x3b, 0xd1, 0xbf, ++ 0x87, 0x71, 0xbb, 0xcc, 0xba, 0x78, 0x0c, 0x38, 0xb2, 0x00, 0xed, 0x23, ++ 0x8e, 0x37, 0x0a, 0xf1, 0x34, 0x25, 0x3c, 0x87, 0xec, 0x94, 0xcf, 0x42, ++ 0xeb, 0x93, 0xe7, 0x81, 0xc2, 0xfa, 0x29, 0x7f, 0x2a, 0xe5, 0x33, 0x3e, ++ 0x4f, 0x83, 0xfa, 0x09, 0xf3, 0xad, 0xaf, 0xe7, 0x54, 0x1e, 0xce, 0x71, ++ 0xc5, 0xae, 0xee, 0x01, 0xf2, 0x1c, 0xd6, 0x5c, 0xfe, 0x7c, 0x4a, 0x6e, ++ 0x80, 0xae, 0x5f, 0xf5, 0x7c, 0xd1, 0x57, 0x67, 0xf7, 0x70, 0x3b, 0xff, ++ 0xd2, 0xfb, 0xc4, 0xb7, 0x0d, 0xc8, 0xb7, 0x38, 0x7f, 0xe8, 0x43, 0x83, ++ 0x9d, 0x97, 0xf5, 0x11, 0x1b, 0xf7, 0xbf, 0x4f, 0x7c, 0x3b, 0x7f, 0x1f, ++ 0xd7, 0xc7, 0x0d, 0xfb, 0x2a, 0x2d, 0x18, 0x6f, 0x9d, 0x59, 0x11, 0x60, ++ 0x1f, 0x80, 0xa3, 0xdb, 0x20, 0xf8, 0x6f, 0xa3, 0xd2, 0xbd, 0x90, 0xbe, ++ 0x4f, 0xdb, 0x6f, 0xa3, 0xef, 0x0e, 0x7b, 0x24, 0x7f, 0xb6, 0xbf, 0xff, ++ 0x31, 0xea, 0x9f, 0xa2, 0x7d, 0x5e, 0xaa, 0xe7, 0xe9, 0xd9, 0xcf, 0xf9, ++ 0xf4, 0x88, 0xc9, 0x44, 0x79, 0x80, 0x23, 0xdb, 0xaf, 0xda, 0xd6, 0xac, ++ 0xf4, 0xb7, 0xab, 0xe0, 0x6f, 0x93, 0x9c, 0x34, 0x34, 0x31, 0xe1, 0x6f, ++ 0x2f, 0x7b, 0x1b, 0xfd, 0xb3, 0xfa, 0x1a, 0x5e, 0x07, 0xdf, 0x10, 0xc7, ++ 0x47, 0x85, 0x8f, 0x9f, 0x6a, 0x45, 0x7e, 0xc9, 0x00, 0xef, 0x18, 0xeb, ++ 0x32, 0xc0, 0x9f, 0x99, 0x4c, 0xdf, 0x6d, 0xd6, 0xb1, 0xd1, 0x28, 0xa7, ++ 0x39, 0x13, 0x03, 0xfb, 0x73, 0x69, 0xff, 0x9b, 0xc7, 0xe7, 0x39, 0x35, ++ 0xa0, 0x4f, 0xa0, 0x7d, 0x93, 0x73, 0xb1, 0x1f, 0x4b, 0x07, 0x32, 0x26, ++ 0x82, 0x5f, 0x8c, 0xfc, 0xe7, 0xbc, 0xde, 0x8f, 0xf9, 0xa6, 0x8d, 0xf9, ++ 0x1d, 0xad, 0xe8, 0x3f, 0x87, 0x27, 0x31, 0x3a, 0x77, 0x75, 0xa3, 0xb9, ++ 0x7d, 0x02, 0xc6, 0xc1, 0x1b, 0x27, 0xf9, 0x1c, 0x80, 0x49, 0xc0, 0xdb, ++ 0x0e, 0xf2, 0xaf, 0xd9, 0x50, 0x8b, 0xb0, 0x67, 0xf3, 0xc9, 0x2f, 0x6f, ++ 0xf0, 0xfc, 0xab, 0x9f, 0xf2, 0xc1, 0xf1, 0xf2, 0xbf, 0x7f, 0x25, 0xf9, ++ 0x77, 0x0d, 0xbe, 0x64, 0x3f, 0x9e, 0x83, 0x3b, 0x6d, 0x9f, 0xb2, 0x94, ++ 0xfb, 0x33, 0x76, 0x86, 0xf0, 0x37, 0x00, 0x7e, 0xb1, 0x3d, 0x2d, 0x72, ++ 0x5d, 0x04, 0xe1, 0x39, 0x27, 0xf0, 0x27, 0xf1, 0xd8, 0x63, 0xee, 0xa2, ++ 0xf3, 0x78, 0x7b, 0x5e, 0x48, 0xa2, 0xf3, 0x0d, 0xa7, 0x4d, 0xe4, 0xfc, ++ 0x9a, 0x31, 0xb1, 0x83, 0xf4, 0xc7, 0x6b, 0xfb, 0x6f, 0x24, 0x7b, 0x2d, ++ 0xf9, 0x32, 0x75, 0x6f, 0x12, 0xd9, 0xed, 0x4c, 0xcd, 0xa1, 0xf8, 0x29, ++ 0x5f, 0x74, 0x4b, 0x12, 0xc2, 0x33, 0x4f, 0xc0, 0xd3, 0x2e, 0xea, 0x84, ++ 0x33, 0x84, 0x1d, 0x29, 0x5e, 0xc7, 0xfd, 0xb8, 0xcc, 0x5c, 0x2e, 0x4f, ++ 0x99, 0xb9, 0x26, 0x71, 0xb5, 0x18, 0xeb, 0xac, 0x1c, 0x61, 0xca, 0x3b, ++ 0x9c, 0x13, 0xf4, 0x27, 0x36, 0xd1, 0x9d, 0xfb, 0x54, 0x3f, 0x3f, 0x4a, ++ 0xf2, 0x54, 0xb7, 0x8b, 0x8f, 0xe7, 0x4c, 0x0a, 0x94, 0xdd, 0xab, 0xe3, ++ 0x5f, 0xe9, 0x5f, 0xc9, 0x7a, 0x03, 0xac, 0x1b, 0x98, 0x91, 0x80, 0xbf, ++ 0xc7, 0xe6, 0x72, 0x3b, 0x58, 0xf8, 0xf8, 0x52, 0xa2, 0xfb, 0xbc, 0x1a, ++ 0x71, 0x3e, 0xc4, 0x3a, 0xee, 0x57, 0x30, 0xe0, 0x0b, 0xc4, 0x1b, 0xd0, ++ 0x91, 0xf8, 0xe0, 0x26, 0xe7, 0x22, 0xa2, 0xdb, 0xbc, 0x75, 0xca, 0x37, ++ 0x89, 0x8e, 0xe1, 0x0a, 0xca, 0x1b, 0x4a, 0xff, 0x2c, 0x7e, 0xfc, 0x71, ++ 0x62, 0x7d, 0x3b, 0x6d, 0xc1, 0x51, 0x58, 0x67, 0xd8, 0xeb, 0x4a, 0xf5, ++ 0xe3, 0x7e, 0xd7, 0xce, 0x8c, 0x80, 0x89, 0xf2, 0xee, 0x65, 0x19, 0x94, ++ 0x07, 0x71, 0x65, 0x71, 0x7f, 0xd1, 0x25, 0xfc, 0xc5, 0x98, 0xdc, 0x07, ++ 0x47, 0x99, 0x60, 0x9e, 0x4f, 0xdc, 0xa9, 0x9c, 0xde, 0x91, 0xdf, 0x68, ++ 0x98, 0x17, 0x9e, 0x92, 0xeb, 0x4b, 0xe8, 0xe7, 0xf5, 0x8f, 0xf3, 0xf9, ++ 0x78, 0xd3, 0xdb, 0xc3, 0xc3, 0x31, 0xee, 0x91, 0xf5, 0x61, 0x12, 0x1f, ++ 0x91, 0x95, 0xc9, 0x73, 0xf4, 0xfa, 0x74, 0x82, 0xa0, 0x4b, 0x64, 0x18, ++ 0x9b, 0x83, 0x7a, 0x03, 0xe2, 0x09, 0x3b, 0xe5, 0xaf, 0x1d, 0x30, 0x0f, ++ 0xe6, 0x13, 0xb6, 0x5f, 0xf7, 0x24, 0xcf, 0x27, 0xf0, 0x73, 0xa1, 0xaf, ++ 0xca, 0xe5, 0xdf, 0x35, 0x4f, 0xca, 0x0a, 0x8e, 0xa2, 0xfd, 0xbf, 0xe2, ++ 0xe0, 0x32, 0x6e, 0x3f, 0xf9, 0x3a, 0xe3, 0xf1, 0xf1, 0xba, 0xb0, 0x9b, ++ 0xaf, 0xce, 0xbe, 0xb3, 0x0c, 0xe3, 0xd8, 0x86, 0x5b, 0xed, 0x7e, 0x94, ++ 0xbb, 0x0d, 0x2f, 0x29, 0x73, 0x89, 0xaf, 0xc3, 0x56, 0x3c, 0x3c, 0x08, ++ 0xf8, 0x9e, 0xcb, 0x21, 0x38, 0x4c, 0x54, 0x0f, 0xc5, 0x42, 0x1a, 0xd1, ++ 0xa3, 0xa1, 0x29, 0x18, 0x49, 0xcc, 0xf7, 0x33, 0x48, 0xce, 0x1a, 0xc0, ++ 0xef, 0xc3, 0x38, 0x60, 0x1a, 0xf2, 0xb9, 0x93, 0xf8, 0x3e, 0xc2, 0xf9, ++ 0x9e, 0xdb, 0x3f, 0x99, 0x6f, 0x40, 0x3d, 0xa9, 0xf7, 0xb7, 0xa5, 0x3e, ++ 0x90, 0x7a, 0x06, 0xed, 0x1b, 0xf2, 0xb3, 0x94, 0x8b, 0x86, 0x1b, 0xba, ++ 0x4b, 0x90, 0xbe, 0x5f, 0x55, 0xaf, 0xf4, 0x98, 0xb9, 0x9c, 0xf7, 0x00, ++ 0x1e, 0x50, 0x8e, 0xa4, 0xdc, 0xa4, 0xbe, 0xc8, 0xe5, 0x65, 0xcd, 0x4a, ++ 0x5f, 0x25, 0x3e, 0x5f, 0x03, 0x72, 0xaf, 0xa7, 0x77, 0x7c, 0x7c, 0x86, ++ 0x70, 0x62, 0xbc, 0x22, 0xf5, 0xfb, 0xaa, 0x9c, 0xe0, 0xb7, 0x73, 0x11, ++ 0x4e, 0x53, 0xb4, 0x95, 0xbe, 0x7d, 0x15, 0xfa, 0xb8, 0xe1, 0xc5, 0xd5, ++ 0x25, 0x89, 0xbe, 0x5f, 0x92, 0xfa, 0xd8, 0x2a, 0xce, 0xd3, 0xb4, 0x46, ++ 0x52, 0x22, 0xfa, 0x7d, 0x06, 0xdc, 0xb3, 0x4f, 0x2d, 0xa7, 0x6b, 0x18, ++ 0xed, 0x51, 0xca, 0xf2, 0xc4, 0xf9, 0x98, 0xd5, 0xb9, 0xd2, 0xbe, 0xf6, ++ 0xab, 0x77, 0x5a, 0x9d, 0xeb, 0xea, 0x5f, 0xef, 0xe4, 0x46, 0xdb, 0x85, ++ 0xf2, 0xb3, 0x3d, 0x85, 0xbe, 0xa3, 0x93, 0xf9, 0xa9, 0xf8, 0x71, 0xbf, ++ 0x2f, 0xf8, 0x4d, 0xd2, 0x45, 0xc6, 0x29, 0xb8, 0x5f, 0x80, 0xfd, 0x9f, ++ 0x12, 0xf2, 0xb3, 0x59, 0xc8, 0xe9, 0x73, 0xe2, 0xaa, 0x8b, 0x7f, 0x88, ++ 0xff, 0x7d, 0xa6, 0xd0, 0xfb, 0xb8, 0xdf, 0x3f, 0x90, 0x1d, 0x93, 0xef, ++ 0xfd, 0xb3, 0xf2, 0x65, 0x72, 0x1e, 0x69, 0x4f, 0xe3, 0xe9, 0x2f, 0xf7, ++ 0x3b, 0x70, 0x3d, 0x33, 0x4a, 0x07, 0xee, 0xd7, 0x7e, 0x50, 0xc4, 0x81, ++ 0x71, 0xfc, 0xf8, 0x82, 0xf0, 0xa7, 0xee, 0xcd, 0x65, 0x74, 0x6d, 0x37, ++ 0x47, 0x3f, 0x27, 0xb9, 0x5a, 0x92, 0xca, 0x68, 0x9f, 0x6d, 0x33, 0x0b, ++ 0x64, 0xe1, 0x7e, 0xd9, 0x2b, 0x57, 0x70, 0x79, 0x08, 0xf4, 0x96, 0xe0, ++ 0xf8, 0x57, 0xe6, 0x87, 0x32, 0xf2, 0x46, 0xc7, 0xf2, 0xc2, 0x78, 0x1f, ++ 0xe3, 0x93, 0x5a, 0x8d, 0x85, 0x71, 0x9f, 0xac, 0x76, 0xa7, 0x39, 0xa2, ++ 0xff, 0x8e, 0x67, 0x27, 0x7e, 0x48, 0x09, 0xfd, 0xcf, 0xa7, 0x5a, 0xc3, ++ 0x2a, 0xf0, 0xf9, 0xb8, 0xfc, 0xd0, 0x61, 0xa4, 0x67, 0x78, 0x02, 0xff, ++ 0x5e, 0x2f, 0xfc, 0x3d, 0x1b, 0xed, 0xff, 0x80, 0x23, 0x3d, 0x1a, 0xf5, ++ 0x4b, 0x23, 0xeb, 0x4e, 0x43, 0x3c, 0x37, 0xa8, 0x5d, 0x25, 0x98, 0xc7, ++ 0xdc, 0xe2, 0x0e, 0xbd, 0x8e, 0xfd, 0x4f, 0x99, 0xba, 0x0a, 0x78, 0xbd, ++ 0x05, 0xdf, 0x9f, 0x3a, 0x29, 0xf2, 0xbe, 0x27, 0x45, 0xde, 0xb7, 0xd3, ++ 0x12, 0xcd, 0xff, 0x8e, 0x33, 0x76, 0xce, 0xdd, 0x05, 0xc6, 0xeb, 0x75, ++ 0x2e, 0x74, 0x99, 0x32, 0x31, 0x0e, 0x7c, 0x6f, 0xdf, 0x3b, 0x3f, 0x7b, ++ 0x09, 0xde, 0xbe, 0xe3, 0xa5, 0x73, 0x77, 0x7c, 0x1f, 0xb1, 0xb5, 0x26, ++ 0xe5, 0xce, 0x1f, 0xc1, 0xb5, 0xda, 0xaa, 0x06, 0xf5, 0xe7, 0xff, 0x9c, ++ 0x4c, 0x4d, 0xac, 0x67, 0x4f, 0x09, 0x3e, 0xea, 0xab, 0xa7, 0x59, 0x99, ++ 0x94, 0x30, 0xef, 0xbf, 0x27, 0x8f, 0xf3, 0x41, 0x63, 0xdc, 0xfe, 0xef, ++ 0x9e, 0x3c, 0x1f, 0xbf, 0xdf, 0xf7, 0x5d, 0x16, 0xdf, 0xff, 0x7d, 0x6f, ++ 0x80, 0x73, 0xb2, 0x26, 0xe7, 0x71, 0xfa, 0x74, 0x8a, 0x3a, 0x9f, 0xf8, ++ 0xe7, 0xd3, 0xc4, 0x3c, 0x3b, 0xcd, 0xac, 0x64, 0x33, 0xc2, 0xb3, 0x2d, ++ 0x95, 0xf6, 0xd7, 0x99, 0xc6, 0xcf, 0x37, 0xab, 0x79, 0xa4, 0xd0, 0x8f, ++ 0xfb, 0x92, 0x9d, 0x45, 0xfc, 0xfc, 0xfc, 0xde, 0x47, 0x15, 0xb2, 0x03, ++ 0x27, 0xcd, 0x5c, 0xff, 0xc0, 0xdf, 0xad, 0xd6, 0x8a, 0x98, 0x1d, 0x45, ++ 0x37, 0x05, 0xfd, 0xc4, 0x1a, 0x47, 0x38, 0x6a, 0x02, 0xfd, 0x51, 0xb3, ++ 0x2c, 0x35, 0x8a, 0xe7, 0x67, 0xc2, 0x7d, 0x6d, 0x1c, 0xca, 0x5a, 0xd8, ++ 0x41, 0xf5, 0xa6, 0x73, 0x85, 0x7d, 0x9c, 0xd7, 0xf4, 0xda, 0xdf, 0x30, ++ 0xef, 0x51, 0xa3, 0x31, 0xeb, 0x38, 0x78, 0xef, 0xb4, 0x7d, 0x7e, 0x1a, ++ 0x9a, 0x87, 0x85, 0xdf, 0xba, 0x17, 0x8f, 0xc0, 0x61, 0xd9, 0xd5, 0xed, ++ 0xa2, 0x2e, 0x51, 0x9c, 0xd7, 0x16, 0x98, 0xae, 0x5e, 0x4a, 0xf9, 0x32, ++ 0xbf, 0xce, 0xf8, 0x5d, 0xcb, 0xde, 0xbc, 0xa0, 0x15, 0xf9, 0xac, 0x3a, ++ 0x9d, 0xe3, 0xbb, 0xfa, 0x5e, 0x7e, 0x4e, 0xaf, 0xec, 0xff, 0x92, 0x90, ++ 0xdb, 0x7e, 0xfc, 0x86, 0xbc, 0x0a, 0xf0, 0xfe, 0x51, 0xe1, 0xf6, 0x25, ++ 0x7e, 0x1e, 0x77, 0xfe, 0x84, 0xe7, 0x51, 0xbf, 0x2d, 0xf7, 0x04, 0xb3, ++ 0x68, 0xfc, 0x7b, 0xcf, 0x19, 0xf4, 0x5a, 0x8f, 0xd2, 0xfd, 0xf4, 0x8f, ++ 0x90, 0x2f, 0x97, 0xa4, 0x8a, 0x73, 0xd4, 0x58, 0x81, 0xbe, 0x5e, 0xca, ++ 0x9f, 0xc7, 0xed, 0x4b, 0x2d, 0xee, 0x37, 0x81, 0x6a, 0x3c, 0x5f, 0xd6, ++ 0x55, 0xb2, 0xbc, 0x10, 0xf9, 0xbf, 0xb7, 0xe0, 0x77, 0x98, 0x77, 0x3b, ++ 0x90, 0x44, 0x75, 0xb1, 0xb5, 0xb8, 0xef, 0xa4, 0xab, 0x67, 0x1b, 0x68, ++ 0xdf, 0x69, 0xe0, 0xfd, 0x26, 0x9f, 0x05, 0xf9, 0xbc, 0xe1, 0xa2, 0x42, ++ 0x7c, 0x32, 0xf7, 0xc0, 0x6b, 0x27, 0x50, 0xaf, 0x37, 0x68, 0xdd, 0xc4, ++ 0x3f, 0x73, 0xad, 0x76, 0xa2, 0x4f, 0xc3, 0x45, 0x8d, 0x9e, 0xb3, 0x36, ++ 0xf3, 0x59, 0xfd, 0x77, 0x7a, 0xed, 0x9e, 0xc0, 0x70, 0x5c, 0x5f, 0xf8, ++ 0xc1, 0x71, 0x19, 0xb4, 0x6f, 0x95, 0x0d, 0xf7, 0x09, 0xcf, 0x43, 0xe9, ++ 0x9c, 0x8f, 0xa5, 0xa2, 0x1e, 0xd9, 0x9d, 0x1f, 0x1a, 0x8d, 0xfd, 0x36, ++ 0xa5, 0xa4, 0xdd, 0x85, 0xf1, 0xe1, 0x05, 0x2b, 0x3f, 0x97, 0xa9, 0xd1, ++ 0xc2, 0xeb, 0x8e, 0x99, 0xf8, 0xfe, 0x59, 0xf2, 0x09, 0xcb, 0x4b, 0x35, ++ 0xf2, 0xc1, 0x81, 0xd7, 0xff, 0x86, 0x70, 0xcd, 0xb7, 0x86, 0xe8, 0x1c, ++ 0xcb, 0x05, 0x73, 0x9a, 0xe8, 0xdc, 0xdc, 0xea, 0xf4, 0xe8, 0x68, 0x47, ++ 0xa9, 0x9e, 0xfe, 0xe3, 0xbe, 0xd6, 0xb9, 0xb9, 0x5e, 0xa1, 0x37, 0xde, ++ 0xb3, 0xf0, 0xfa, 0x9c, 0xfe, 0xfc, 0xcf, 0xe9, 0xb0, 0x27, 0x8f, 0xeb, ++ 0xaf, 0xf7, 0x72, 0xb8, 0x1c, 0xbd, 0x57, 0xc0, 0x6a, 0xf6, 0xe0, 0xf5, ++ 0x4a, 0xb8, 0xc2, 0x7b, 0xef, 0x15, 0x89, 0x76, 0x39, 0x6f, 0xc7, 0x8f, ++ 0xd3, 0x28, 0xe4, 0xe8, 0xbd, 0xe1, 0xdc, 0x7e, 0x85, 0x97, 0xa6, 0x24, ++ 0x3c, 0x97, 0xe4, 0x6e, 0x21, 0x8f, 0x7b, 0xf3, 0x02, 0xb7, 0x23, 0xbe, ++ 0xe4, 0xfd, 0xa7, 0x05, 0x1c, 0xee, 0xfc, 0x40, 0x75, 0x9e, 0x8b, 0xf4, ++ 0x63, 0x48, 0xf0, 0x6d, 0x34, 0x03, 0xc6, 0xab, 0xfe, 0x25, 0xff, 0x1d, ++ 0x03, 0xd6, 0xd2, 0x4b, 0x75, 0x25, 0x7d, 0xeb, 0x2a, 0x11, 0xf0, 0xba, ++ 0x13, 0xc3, 0xd5, 0x12, 0x1b, 0x77, 0x11, 0x8e, 0x07, 0xfd, 0x02, 0xe4, ++ 0xc7, 0xbf, 0x62, 0xa3, 0xef, 0xef, 0xd8, 0x74, 0xd0, 0xd7, 0xa8, 0x9f, ++ 0x97, 0xe6, 0x33, 0xd4, 0xcf, 0x30, 0x6f, 0x63, 0x1e, 0x1f, 0x37, 0x9a, ++ 0x41, 0xfd, 0x92, 0x68, 0x1d, 0xac, 0x0d, 0xf4, 0x36, 0xf0, 0xef, 0xf9, ++ 0xd1, 0x3e, 0xa2, 0xcb, 0x9a, 0x4a, 0xe0, 0xd3, 0x51, 0xe2, 0x5c, 0x7e, ++ 0x5f, 0x8c, 0xaf, 0x24, 0x3f, 0xc5, 0xf3, 0xd1, 0x7d, 0x79, 0xca, 0x40, ++ 0xfb, 0xe2, 0xf7, 0xe1, 0x7c, 0xf1, 0xfb, 0xe2, 0x8c, 0x0d, 0x26, 0x7a, ++ 0x13, 0xbf, 0x7d, 0x8d, 0xef, 0xd8, 0x46, 0x64, 0x71, 0xbc, 0x80, 0xdc, ++ 0xb7, 0xe6, 0x91, 0xfd, 0x8d, 0x5e, 0xad, 0x97, 0x3b, 0x89, 0x67, 0xa9, ++ 0x2f, 0xdf, 0x4b, 0x36, 0xf2, 0x45, 0xaa, 0x80, 0xf3, 0x07, 0xa2, 0x5f, ++ 0x1f, 0x9e, 0xc5, 0x39, 0x5a, 0xce, 0x62, 0x6e, 0x07, 0x65, 0xbc, 0xf0, ++ 0xb8, 0xe8, 0x9f, 0x21, 0xe8, 0x2f, 0xaf, 0xd2, 0xae, 0xc5, 0xef, 0x0f, ++ 0x64, 0x88, 0x71, 0x33, 0xf2, 0xd2, 0x24, 0x5d, 0x1e, 0x13, 0xf4, 0xce, ++ 0x48, 0x48, 0xef, 0xad, 0x9c, 0xde, 0xd0, 0xef, 0x09, 0xec, 0x57, 0x9d, ++ 0xd4, 0x7b, 0x67, 0x16, 0xd8, 0xb3, 0xdb, 0xc0, 0x4f, 0xc2, 0x73, 0x2f, ++ 0xe1, 0x3d, 0x2f, 0xde, 0xef, 0x97, 0xb7, 0x98, 0xc8, 0xed, 0x70, 0xe3, ++ 0xd2, 0x54, 0x86, 0x7e, 0xc2, 0x4f, 0xf2, 0x44, 0xde, 0x6f, 0x54, 0x2f, ++ 0xdf, 0xbf, 0x1b, 0xda, 0x4b, 0xfa, 0x68, 0x2e, 0x03, 0xbd, 0xa3, 0x5c, ++ 0x9e, 0x7e, 0x98, 0x23, 0xf0, 0x82, 0x3e, 0x7c, 0x43, 0xd4, 0x0f, 0x29, ++ 0x58, 0xcf, 0x93, 0x49, 0x6a, 0xc0, 0x87, 0xe3, 0x01, 0xbe, 0x3b, 0xf3, ++ 0x5c, 0x31, 0x7c, 0xc7, 0xcf, 0x77, 0x12, 0x1f, 0x81, 0x5f, 0xf8, 0x4a, ++ 0x9e, 0xf8, 0xbe, 0xaf, 0x8c, 0x95, 0x21, 0xbd, 0xee, 0x7c, 0xeb, 0xcf, ++ 0xa9, 0x77, 0xf8, 0xf0, 0x1c, 0x74, 0xfe, 0x5d, 0xf1, 0x47, 0xf6, 0xd0, ++ 0xab, 0x38, 0xce, 0xd9, 0xef, 0xbe, 0x4e, 0x71, 0xc0, 0x49, 0x4b, 0xb4, ++ 0xa4, 0xdd, 0x9e, 0xe0, 0xb9, 0x25, 0xfa, 0xf8, 0x26, 0x25, 0xf6, 0xfc, ++ 0xae, 0x9f, 0xa8, 0x61, 0xfc, 0xdd, 0x8b, 0xce, 0xae, 0xb3, 0x8f, 0xce, ++ 0x06, 0xbe, 0x9c, 0xdb, 0xa5, 0xfa, 0x71, 0xca, 0xb9, 0xf7, 0x7d, 0xfe, ++ 0xe6, 0x18, 0xf4, 0xaf, 0xbb, 0xcc, 0xb4, 0x0f, 0x05, 0xfe, 0xc5, 0x3a, ++ 0x3c, 0x17, 0x94, 0x35, 0x71, 0x7f, 0xf4, 0xa4, 0xc9, 0x48, 0xff, 0x33, ++ 0xdf, 0x36, 0xd6, 0x75, 0x74, 0x0b, 0x79, 0x95, 0xdf, 0x3b, 0x4b, 0x7d, ++ 0x25, 0xfd, 0x86, 0xc5, 0xcc, 0xcf, 0xf5, 0x54, 0x32, 0x3f, 0x87, 0xfd, ++ 0xd4, 0x92, 0x45, 0xf4, 0xbd, 0xf3, 0x7c, 0x16, 0x3c, 0x8a, 0xe7, 0xb0, ++ 0x7f, 0xba, 0x74, 0x2a, 0xf9, 0xd3, 0x8b, 0x58, 0x88, 0x7e, 0x8f, 0x60, ++ 0x5e, 0x9b, 0xf1, 0x3c, 0xde, 0xf8, 0x73, 0x7c, 0xe3, 0xcf, 0xef, 0xc5, ++ 0x04, 0x3f, 0xe2, 0x2f, 0xfe, 0x1c, 0xdf, 0xbe, 0x7c, 0x7b, 0x55, 0x62, ++ 0x3f, 0x23, 0x35, 0x9f, 0xf3, 0xe1, 0x19, 0x8b, 0xa8, 0x2f, 0x18, 0xc0, ++ 0xcf, 0xb8, 0x28, 0xf8, 0x57, 0xd6, 0x17, 0x34, 0xca, 0xfa, 0x82, 0x97, ++ 0xbf, 0xbc, 0xbe, 0xa0, 0x31, 0xae, 0xbe, 0x20, 0xe6, 0x8f, 0xc8, 0xfa, ++ 0x82, 0x2f, 0x28, 0x4f, 0x68, 0xce, 0xf7, 0xd1, 0xf8, 0x38, 0x9e, 0xbe, ++ 0xce, 0xe0, 0xcc, 0x84, 0xc4, 0x70, 0x2b, 0xf9, 0xd2, 0xef, 0x49, 0x31, ++ 0x8c, 0x2f, 0xc7, 0x89, 0xcd, 0x93, 0x46, 0xcf, 0x1b, 0xf1, 0x3c, 0x9f, ++ 0x84, 0xdf, 0xab, 0xdb, 0xe9, 0xfe, 0x99, 0x85, 0x89, 0xe7, 0x49, 0xcf, ++ 0xe7, 0xeb, 0x6e, 0x8c, 0xab, 0x67, 0x88, 0xbd, 0xcf, 0xeb, 0x18, 0x64, ++ 0x9c, 0x2f, 0xf9, 0xa2, 0xf1, 0xa2, 0x97, 0xec, 0xb1, 0x6c, 0xf7, 0xfd, ++ 0x0e, 0x43, 0xdf, 0x7b, 0x79, 0xf4, 0x3c, 0xfe, 0xfb, 0x7c, 0x99, 0xa7, ++ 0x97, 0x72, 0xf0, 0x81, 0xc2, 0xac, 0x5e, 0xca, 0x9b, 0xad, 0x17, 0x7a, ++ 0xd1, 0x3f, 0x1c, 0xfd, 0xdf, 0x0f, 0xd0, 0xaf, 0x42, 0x39, 0xbc, 0xd1, ++ 0xf7, 0x4a, 0x37, 0x80, 0x38, 0xef, 0xfb, 0xd7, 0x94, 0x68, 0x45, 0x31, ++ 0x39, 0x89, 0x5f, 0x07, 0xf0, 0xd3, 0x67, 0xfa, 0xef, 0xe0, 0x87, 0xe4, ++ 0x8b, 0x73, 0x79, 0xfd, 0xcc, 0x4f, 0xdf, 0x49, 0x0a, 0x3e, 0xbf, 0xf3, ++ 0xbb, 0x93, 0xd2, 0x71, 0x9f, 0xf5, 0xdf, 0xef, 0xab, 0x32, 0x7c, 0xff, ++ 0xd6, 0xf7, 0x7d, 0xbc, 0x45, 0xfa, 0x73, 0x76, 0x83, 0x5d, 0x66, 0x71, ++ 0x76, 0x7b, 0xde, 0xbe, 0xd7, 0xc9, 0x5f, 0x9b, 0x6f, 0x0d, 0xd2, 0x77, ++ 0x78, 0x1f, 0xbd, 0xfc, 0x5d, 0xb2, 0xd7, 0x0b, 0x59, 0xd0, 0x8d, 0xfc, ++ 0x7d, 0xfe, 0xe5, 0x2b, 0x0a, 0x42, 0xff, 0x03, 0x7b, 0x2d, 0xe1, 0xb9, ++ 0x25, 0x7c, 0xb7, 0x99, 0xfb, 0xe9, 0x4e, 0xf2, 0x33, 0x66, 0x0a, 0x78, ++ 0x6e, 0x39, 0xc0, 0xfd, 0x45, 0x93, 0x35, 0x60, 0xa6, 0x79, 0x02, 0xcc, ++ 0xe7, 0x70, 0x53, 0x28, 0xce, 0xe1, 0x05, 0xa5, 0x89, 0xe7, 0xf0, 0x5d, ++ 0xdf, 0x07, 0x7f, 0x29, 0x9d, 0xdf, 0x31, 0x4e, 0xc0, 0xaf, 0xe0, 0xfb, ++ 0x80, 0xdf, 0xeb, 0xc5, 0x95, 0xcd, 0x0d, 0x79, 0x10, 0x6e, 0x79, 0xae, ++ 0x00, 0x70, 0x93, 0x07, 0xaf, 0xcd, 0xd7, 0xf8, 0x7d, 0x78, 0x1d, 0xaf, ++ 0x04, 0x35, 0xa6, 0xfb, 0xde, 0x74, 0x32, 0x6b, 0xca, 0xc3, 0xfe, 0x26, ++ 0x6b, 0xb7, 0x2a, 0xce, 0x3b, 0xa3, 0xf3, 0xe3, 0x93, 0x62, 0xf8, 0xa2, ++ 0x76, 0xaa, 0x68, 0xb7, 0xdc, 0x7a, 0xe1, 0xce, 0x05, 0x78, 0xdf, 0xce, ++ 0xcf, 0x27, 0xb6, 0x08, 0x38, 0x16, 0xe6, 0x8b, 0xef, 0xa8, 0xad, 0xcc, ++ 0x8a, 0xeb, 0x4e, 0xb2, 0x47, 0x3f, 0xa5, 0x7d, 0x40, 0x71, 0x0d, 0x4f, ++ 0xe0, 0xfe, 0x77, 0xb8, 0x88, 0xd7, 0xed, 0x26, 0xe3, 0x79, 0x0a, 0x30, ++ 0xaf, 0xdd, 0x7e, 0x2e, 0x8c, 0x8b, 0x75, 0x30, 0x07, 0x9d, 0x13, 0x60, ++ 0x73, 0x5c, 0x88, 0x62, 0x1c, 0xa2, 0xfb, 0x1d, 0x89, 0x7b, 0xf2, 0x5d, ++ 0xba, 0xdf, 0x91, 0x60, 0x51, 0x9e, 0x9f, 0x1a, 0xe8, 0x79, 0xdc, 0xef, ++ 0x4c, 0x64, 0x0a, 0xf8, 0x9a, 0x85, 0x7e, 0xf3, 0xe2, 0x79, 0x87, 0xc5, ++ 0x74, 0xae, 0x03, 0xe9, 0xb7, 0x87, 0x53, 0x17, 0xd2, 0x39, 0xe4, 0x2e, ++ 0xfb, 0x32, 0xda, 0x9f, 0xde, 0x92, 0x36, 0x85, 0xf6, 0x2f, 0xdd, 0x88, ++ 0x78, 0xac, 0x53, 0x9f, 0xa2, 0x3b, 0x97, 0x01, 0x9e, 0xbb, 0x82, 0xc6, ++ 0xf3, 0x18, 0xb2, 0xe7, 0x18, 0xdb, 0xde, 0x90, 0xb1, 0x6d, 0x65, 0x27, ++ 0xa9, 0x3e, 0x4a, 0x89, 0x06, 0x3d, 0x97, 0xb2, 0x62, 0xe7, 0x4e, 0x9a, ++ 0x85, 0xbe, 0xb8, 0x35, 0x99, 0xc3, 0x75, 0x6b, 0x32, 0x8f, 0xd7, 0x56, ++ 0xe7, 0x1b, 0xbf, 0x13, 0x0d, 0xca, 0xdf, 0x7f, 0xc9, 0xe4, 0xe7, 0x36, ++ 0xf4, 0xb8, 0xad, 0x56, 0xac, 0xb7, 0xc0, 0xf8, 0x3f, 0x9f, 0xc7, 0xff, ++ 0x7f, 0x04, 0x4a, 0x43, 0x5c, 0xc8, 0x7f, 0x1f, 0xa6, 0x6c, 0x7c, 0x60, ++ 0xc8, 0xa3, 0xa3, 0xf0, 0x77, 0x4f, 0x54, 0xff, 0x2a, 0xa0, 0x53, 0x6b, ++ 0xaa, 0x6f, 0xa5, 0x86, 0xfe, 0xdb, 0xed, 0xe2, 0x77, 0xc2, 0xb4, 0x0e, ++ 0xaa, 0x63, 0xd8, 0x76, 0x67, 0x06, 0xd5, 0x89, 0xb6, 0xda, 0x1c, 0x95, ++ 0x98, 0xf7, 0x0c, 0xe7, 0xf3, 0x7c, 0x4f, 0xa3, 0xa8, 0xf7, 0x07, 0x8a, ++ 0xd4, 0xee, 0x82, 0xf7, 0xb6, 0xcd, 0xcc, 0xa5, 0x7e, 0xce, 0xaa, 0x5e, ++ 0xca, 0x97, 0xf6, 0xae, 0x66, 0xe4, 0x1f, 0xf5, 0xe3, 0xd3, 0x2f, 0x80, ++ 0xff, 0x01, 0xdf, 0x4f, 0x62, 0x1b, 0xcf, 0x93, 0x98, 0xef, 0xef, 0xc2, ++ 0xef, 0x88, 0xbd, 0x01, 0x95, 0xea, 0x74, 0xe5, 0xf3, 0x1d, 0xf8, 0x1c, ++ 0xe0, 0x54, 0x04, 0x5f, 0xe0, 0xfd, 0xf1, 0x15, 0xb1, 0xdf, 0x71, 0x2a, ++ 0x3e, 0x50, 0x76, 0x08, 0xcf, 0xc3, 0x64, 0x21, 0xc5, 0xcf, 0xd3, 0x8f, ++ 0x3e, 0xe2, 0xf7, 0x59, 0xc2, 0x2f, 0x6f, 0x3c, 0x50, 0x79, 0xf3, 0x68, ++ 0x80, 0xab, 0xb8, 0x6b, 0x24, 0xb1, 0xf1, 0xe0, 0x03, 0x62, 0xbf, 0xc5, ++ 0x99, 0x24, 0xf6, 0x8d, 0xf9, 0xf9, 0xbd, 0xf1, 0xfd, 0x07, 0x63, 0x7f, ++ 0x68, 0xa7, 0x1c, 0xf3, 0xfd, 0x6b, 0x1d, 0x3e, 0x32, 0x41, 0x9c, 0x8d, ++ 0xef, 0x4d, 0x48, 0xa1, 0x75, 0x1f, 0x17, 0xf9, 0x26, 0x26, 0xf4, 0xc3, ++ 0x98, 0x38, 0xf9, 0xbb, 0x2e, 0x26, 0x0f, 0xf4, 0xbc, 0x4c, 0xb4, 0x1b, ++ 0x45, 0x7d, 0x1d, 0x9e, 0x61, 0x11, 0xa8, 0xe0, 0xe9, 0x0c, 0xea, 0xe7, ++ 0xe4, 0xf2, 0xe1, 0x67, 0xf2, 0x8f, 0xcb, 0xed, 0xb5, 0x2c, 0xf6, 0x87, ++ 0xe3, 0x54, 0xc5, 0xc6, 0x25, 0x3d, 0x35, 0x31, 0xf6, 0x38, 0x26, 0x87, ++ 0xb0, 0xc4, 0x72, 0xab, 0xbf, 0xb9, 0x0e, 0xfa, 0x1d, 0x99, 0xc1, 0xf7, ++ 0xd7, 0xc7, 0x68, 0xd1, 0x83, 0x28, 0xef, 0xd7, 0x89, 0x6b, 0x99, 0xb8, ++ 0xb2, 0xb9, 0xed, 0x84, 0xdf, 0x35, 0x2b, 0x03, 0x2a, 0xa3, 0x12, 0x88, ++ 0x90, 0xba, 0x1e, 0xda, 0x63, 0xad, 0x5d, 0x59, 0xc8, 0xdf, 0xe3, 0xac, ++ 0xdd, 0x2b, 0x5d, 0x30, 0xce, 0x35, 0x73, 0xee, 0xf6, 0x60, 0xbb, 0xa4, ++ 0xa0, 0x98, 0xf8, 0x0d, 0xfc, 0x2f, 0x3a, 0x77, 0x28, 0xc3, 0x6e, 0x8a, ++ 0xf0, 0xef, 0x28, 0xcb, 0xfc, 0x28, 0x47, 0xb3, 0xe7, 0xf0, 0x7c, 0xec, ++ 0xac, 0x39, 0x56, 0xaa, 0x3b, 0x9e, 0xa5, 0xf1, 0xf3, 0xa1, 0x98, 0x16, ++ 0x2a, 0xbc, 0x0d, 0x9e, 0xdf, 0x56, 0xcd, 0xf3, 0xc0, 0xd8, 0xae, 0xd6, ++ 0xe5, 0x59, 0xe4, 0xbe, 0xc7, 0x71, 0x88, 0x53, 0x76, 0x27, 0x88, 0x37, ++ 0x4b, 0x0a, 0xb8, 0x5d, 0x94, 0xef, 0x37, 0x8a, 0xfa, 0x1f, 0xf9, 0xbc, ++ 0x08, 0x0f, 0x8a, 0xc6, 0x3c, 0x59, 0xc1, 0xe4, 0x8f, 0xf2, 0xc9, 0x9e, ++ 0xf0, 0xfd, 0xdd, 0x33, 0x52, 0xcf, 0x0c, 0x65, 0x43, 0xe3, 0x7e, 0x6f, ++ 0xe6, 0x7c, 0x3e, 0xee, 0x5f, 0x56, 0xbe, 0x31, 0x90, 0x9e, 0x30, 0x3e, ++ 0x17, 0x7a, 0x62, 0x56, 0xe0, 0x11, 0x33, 0xf9, 0xe9, 0x42, 0x5f, 0x48, ++ 0xbd, 0x1c, 0x14, 0x75, 0x4d, 0x5d, 0xe2, 0x5c, 0x97, 0x77, 0x27, 0x70, ++ 0xbc, 0xbf, 0x5d, 0xb9, 0x98, 0xf4, 0xc5, 0xad, 0xac, 0x89, 0xf4, 0xf9, ++ 0x6d, 0x2c, 0x6c, 0x46, 0x7c, 0xf7, 0xe9, 0xff, 0x29, 0x3a, 0xbf, 0x06, ++ 0xe6, 0x99, 0x15, 0x34, 0xfa, 0x39, 0xb3, 0xe7, 0xc4, 0xfb, 0x3d, 0x9c, ++ 0x5f, 0xe5, 0xbc, 0xb7, 0x87, 0x8c, 0xcf, 0x67, 0x4a, 0xff, 0x75, 0x8a, ++ 0xd1, 0x7f, 0xad, 0xfe, 0xce, 0x17, 0x19, 0x64, 0x17, 0xb3, 0x9f, 0xae, ++ 0xbf, 0x34, 0x28, 0x56, 0xbf, 0xd4, 0x18, 0x57, 0xbf, 0xd4, 0x20, 0xea, ++ 0x97, 0x1a, 0xf7, 0x2d, 0x39, 0xe2, 0xd2, 0xd5, 0x2f, 0x35, 0x1e, 0xe0, ++ 0xf5, 0x4b, 0x0d, 0xfb, 0x2e, 0x57, 0xbf, 0xd4, 0x4b, 0xfb, 0x48, 0xc7, ++ 0xcd, 0x91, 0x83, 0xb8, 0xbf, 0x72, 0x7c, 0x31, 0x88, 0x04, 0xc0, 0x79, ++ 0x48, 0xd4, 0xbb, 0x1c, 0xc6, 0x7a, 0x97, 0xf2, 0x18, 0x5f, 0xa6, 0xce, ++ 0xe4, 0x79, 0x56, 0x60, 0x5f, 0xda, 0x2f, 0xc9, 0x73, 0xa4, 0xf8, 0xd1, ++ 0x5f, 0x6f, 0x33, 0x95, 0x53, 0x5e, 0xb6, 0x2d, 0x2d, 0xd5, 0xaf, 0xcf, ++ 0x83, 0xae, 0x59, 0x19, 0x9a, 0xa4, 0xcf, 0xc7, 0xca, 0x7a, 0xa5, 0xe3, ++ 0x03, 0xc4, 0xb7, 0xc3, 0x0b, 0xb8, 0xff, 0xba, 0x51, 0xe1, 0x79, 0xf1, ++ 0xf0, 0xed, 0x56, 0x8a, 0xe7, 0x5c, 0xc5, 0x41, 0xc3, 0x3e, 0x84, 0x4b, ++ 0x65, 0x27, 0x30, 0xbf, 0xf8, 0x11, 0xfa, 0x59, 0xa3, 0xa9, 0x3f, 0xe5, ++ 0x3d, 0x70, 0x1f, 0x6f, 0x24, 0x5c, 0x23, 0x0a, 0xaf, 0xb3, 0xef, 0x7b, ++ 0x1f, 0xbf, 0x3b, 0xc2, 0x7c, 0x64, 0x9c, 0x3e, 0x72, 0x65, 0xf9, 0x69, ++ 0x1f, 0xc0, 0x95, 0x7e, 0x35, 0xe5, 0xf3, 0xe7, 0x1c, 0x28, 0xdb, 0x41, ++ 0xfa, 0xc6, 0x6e, 0xf3, 0xe3, 0xef, 0x22, 0xca, 0xf1, 0xe7, 0x84, 0xb6, ++ 0x69, 0x58, 0x47, 0xd4, 0x78, 0x60, 0x9b, 0x36, 0xdf, 0x1e, 0xe3, 0xbb, ++ 0xca, 0x02, 0xc1, 0xaf, 0x29, 0x2c, 0x05, 0xf9, 0xb5, 0x2f, 0xbf, 0xb7, ++ 0x27, 0x89, 0xf2, 0x7b, 0x1f, 0xd9, 0x83, 0x93, 0x0a, 0xe0, 0xfd, 0x3a, ++ 0x4b, 0x74, 0x38, 0x33, 0xf2, 0x33, 0xdd, 0x1f, 0xc8, 0xae, 0x2d, 0x12, ++ 0xfc, 0x62, 0x9e, 0x10, 0xbc, 0x7d, 0x01, 0xc0, 0x73, 0xfe, 0x4d, 0x0b, ++ 0xcf, 0x73, 0xdd, 0xc7, 0x48, 0x5e, 0x9f, 0xdf, 0x9f, 0x41, 0xf9, 0x49, ++ 0x6d, 0x26, 0x23, 0xfb, 0xd2, 0x52, 0xc9, 0xf8, 0xef, 0xc0, 0x6c, 0xe3, ++ 0xdf, 0x0b, 0x9c, 0xce, 0xe0, 0xe7, 0x18, 0xb5, 0xcc, 0x60, 0x64, 0x07, ++ 0x7b, 0x32, 0x27, 0x13, 0xfd, 0x16, 0xb3, 0xc8, 0x51, 0x3c, 0xa7, 0xa8, ++ 0x66, 0xab, 0xd9, 0x70, 0x1e, 0xd1, 0x3d, 0x3b, 0x8c, 0xed, 0x3a, 0xd6, ++ 0x41, 0xf6, 0xa6, 0x6e, 0x57, 0x3f, 0x7e, 0x26, 0xbd, 0x25, 0xf5, 0x63, ++ 0x3d, 0xf3, 0xa9, 0x66, 0xdc, 0x07, 0xe8, 0x34, 0xbe, 0xcf, 0x06, 0x1b, ++ 0xf5, 0x63, 0x99, 0xb0, 0x07, 0x23, 0x67, 0x4d, 0x6c, 0xc6, 0x7a, 0x8d, ++ 0x91, 0xa6, 0xa0, 0x4a, 0xf6, 0xf7, 0x3e, 0x7f, 0xee, 0x4c, 0x8a, 0x9f, ++ 0xab, 0xb9, 0x1d, 0x65, 0x4f, 0xd3, 0xf9, 0x57, 0xe7, 0x53, 0x3f, 0x51, ++ 0xb9, 0x9c, 0x73, 0x7d, 0x3c, 0x3a, 0xa6, 0x35, 0x0d, 0x76, 0x69, 0xb4, ++ 0xf0, 0xaf, 0x6e, 0xd0, 0xf8, 0xef, 0x2a, 0x48, 0x7f, 0x69, 0xb4, 0xf8, ++ 0x9d, 0x85, 0xc3, 0xa6, 0x03, 0x2a, 0xfd, 0x76, 0x8f, 0x80, 0x67, 0x94, ++ 0x78, 0x4f, 0xfa, 0x69, 0x52, 0x5f, 0xf7, 0xd1, 0x73, 0x2c, 0xe8, 0x52, ++ 0xe0, 0xfb, 0x07, 0x25, 0x5d, 0x8b, 0x58, 0x11, 0xd2, 0x15, 0xc6, 0x27, ++ 0x79, 0x50, 0x30, 0xc0, 0xc9, 0xa4, 0xf1, 0xe9, 0xf7, 0x1a, 0xae, 0x13, ++ 0xf3, 0x01, 0xdd, 0xf9, 0xf9, 0x77, 0x26, 0x6b, 0x04, 0xf9, 0xa8, 0x55, ++ 0x69, 0x22, 0x3d, 0x6d, 0x65, 0x42, 0x5f, 0x2b, 0xa1, 0x66, 0x7c, 0xf9, ++ 0x17, 0xe1, 0x30, 0xe9, 0xed, 0x6b, 0x58, 0xd3, 0x2d, 0xf8, 0x7b, 0x9f, ++ 0xe3, 0xac, 0x5d, 0x29, 0xe4, 0x97, 0xda, 0x43, 0x6b, 0x0b, 0x5c, 0x31, ++ 0x3e, 0x69, 0x66, 0xd1, 0x82, 0xdd, 0x8a, 0x81, 0x5f, 0xe8, 0xf9, 0xd9, ++ 0x8c, 0x37, 0x12, 0xf2, 0x8b, 0xb4, 0x2b, 0xd1, 0x77, 0xb9, 0xbf, 0x31, ++ 0x8d, 0x81, 0x1f, 0x08, 0xf3, 0x06, 0x7e, 0xcf, 0xfd, 0xa0, 0xc3, 0x0a, ++ 0x8f, 0xf3, 0xc0, 0x1f, 0x3c, 0x8c, 0x71, 0xde, 0x1b, 0xa6, 0xa9, 0xc4, ++ 0x0f, 0x53, 0x61, 0x19, 0xd8, 0x6f, 0x92, 0xc3, 0x48, 0xe7, 0x1b, 0x3d, ++ 0xc6, 0xf6, 0x54, 0x5f, 0x3f, 0x3e, 0x50, 0xf5, 0xbf, 0x5f, 0x01, 0x12, ++ 0xa7, 0x21, 0x3c, 0xd3, 0x86, 0x1a, 0xfb, 0x05, 0xa4, 0x7e, 0x63, 0x46, ++ 0xfd, 0x56, 0xc8, 0xbe, 0xe0, 0x75, 0xe5, 0xab, 0x8f, 0x7e, 0x0b, 0xe3, ++ 0xff, 0x94, 0xe5, 0x6c, 0x28, 0xfa, 0x31, 0xe0, 0x39, 0xfa, 0x13, 0xfd, ++ 0x1e, 0xe9, 0x73, 0x05, 0x03, 0xee, 0x93, 0x3c, 0x57, 0x90, 0x60, 0x9f, ++ 0xe4, 0xbc, 0xc8, 0xf7, 0x5e, 0xcb, 0xba, 0x17, 0xee, 0x52, 0xfa, 0xf3, ++ 0x4d, 0xcf, 0x91, 0xe5, 0xaa, 0x47, 0xc7, 0x5f, 0x92, 0x9f, 0x5f, 0x14, ++ 0x75, 0x15, 0xca, 0x2f, 0xc5, 0x7e, 0xec, 0x28, 0x9e, 0xf7, 0x8b, 0xd9, ++ 0x79, 0xce, 0x37, 0x15, 0xa2, 0x75, 0x2d, 0xf2, 0x5d, 0x26, 0x7e, 0x7f, ++ 0x22, 0xf8, 0x45, 0xfc, 0xbe, 0xc8, 0xf5, 0xfb, 0x6c, 0x51, 0xfc, 0xfd, ++ 0x9c, 0x32, 0x31, 0xce, 0xb5, 0xc8, 0x3f, 0xe5, 0x31, 0xbb, 0x1e, 0x35, ++ 0xd9, 0x7d, 0x96, 0x22, 0xe4, 0x13, 0x7f, 0x9b, 0xaa, 0xf6, 0xf7, 0xe7, ++ 0xdd, 0x99, 0x3e, 0xe2, 0x97, 0x91, 0x26, 0x69, 0xe7, 0xfd, 0x59, 0x8c, ++ 0xec, 0x7c, 0x47, 0xb3, 0x86, 0xf0, 0xef, 0x1f, 0x93, 0x1b, 0xb2, 0x1b, ++ 0xf8, 0xe3, 0x1d, 0xae, 0x4f, 0x80, 0x3f, 0x28, 0x2f, 0xd5, 0xcf, 0x3e, ++ 0x1a, 0x9f, 0xc7, 0xf1, 0x8f, 0xa4, 0xe3, 0x31, 0xe1, 0x47, 0xdf, 0xc8, ++ 0x7c, 0x14, 0x47, 0x4c, 0x11, 0x7e, 0x74, 0xb4, 0x90, 0xf3, 0x4f, 0x95, ++ 0xfd, 0x56, 0x0d, 0xdf, 0x7f, 0xad, 0x88, 0xe7, 0x09, 0x26, 0xe2, 0x06, ++ 0x22, 0x7d, 0xef, 0x69, 0xb4, 0x8b, 0x55, 0x56, 0x23, 0x1f, 0xc4, 0xf3, ++ 0x17, 0xcc, 0x68, 0xd2, 0xcf, 0x1b, 0xcf, 0x6f, 0x03, 0xf1, 0xcd, 0x20, ++ 0xe4, 0x1b, 0x69, 0x17, 0xb3, 0x2e, 0xcf, 0x37, 0x9f, 0x0b, 0x3f, 0x23, ++ 0x01, 0xdf, 0x7c, 0x5e, 0x30, 0x7a, 0x60, 0xbe, 0x89, 0xe7, 0x17, 0xa9, ++ 0x57, 0x76, 0xdb, 0x1c, 0x55, 0x78, 0xa6, 0x70, 0x63, 0x8d, 0x42, 0xfa, ++ 0x78, 0xe4, 0x9b, 0x83, 0x9b, 0xb1, 0x7d, 0x45, 0x7d, 0x21, 0xd5, 0xbd, ++ 0xec, 0xce, 0xf0, 0x1f, 0xa2, 0xe7, 0x4d, 0xfc, 0xf9, 0xa8, 0xae, 0x80, ++ 0x8a, 0x75, 0x31, 0xc5, 0xcb, 0xc4, 0xf3, 0xc2, 0x60, 0x15, 0xb6, 0x1b, ++ 0x97, 0xf3, 0x7d, 0x89, 0xd1, 0xc7, 0x79, 0xdd, 0xcc, 0xe0, 0xfb, 0xf8, ++ 0xf3, 0xb2, 0x55, 0x4d, 0x87, 0xf0, 0xbb, 0xb8, 0xc6, 0x30, 0x7f, 0xff, ++ 0xc5, 0x4f, 0x5b, 0xe9, 0x7b, 0xa1, 0x48, 0xab, 0x78, 0xbf, 0xb2, 0xbd, ++ 0x0a, 0xdb, 0x8d, 0x6d, 0xfc, 0xfd, 0xd3, 0xb8, 0xbf, 0x34, 0x02, 0xeb, ++ 0xdd, 0x22, 0xcd, 0x78, 0x7f, 0xd8, 0xba, 0x42, 0x3f, 0x0f, 0x4b, 0xb9, ++ 0x5f, 0x3b, 0x5e, 0xf0, 0xe9, 0x6e, 0x65, 0xcf, 0x21, 0x7a, 0xaf, 0x9d, ++ 0xbf, 0xb7, 0xe8, 0xa8, 0x35, 0x99, 0x7e, 0x67, 0x50, 0xf8, 0xad, 0x37, ++ 0x88, 0x75, 0x8e, 0xdf, 0xca, 0xd7, 0xe9, 0xfc, 0xe0, 0x26, 0xfa, 0xdd, ++ 0xd1, 0x05, 0xbd, 0x61, 0xf2, 0x9f, 0x3e, 0x36, 0xd5, 0x55, 0x90, 0xde, ++ 0x19, 0x20, 0xfe, 0xac, 0x54, 0xda, 0xf3, 0xf0, 0x7a, 0x23, 0xea, 0x13, ++ 0x15, 0xe9, 0x07, 0x7c, 0x5d, 0xc4, 0xf7, 0x1f, 0xb7, 0xc3, 0x14, 0x65, ++ 0x83, 0x78, 0xfe, 0x42, 0xee, 0xdb, 0x61, 0x1d, 0x81, 0xbe, 0x6e, 0xa0, ++ 0x6c, 0x10, 0xb7, 0xfb, 0xb2, 0x9f, 0x3b, 0x93, 0x7f, 0xd7, 0xc5, 0x1e, ++ 0x4b, 0xa5, 0xbc, 0xaf, 0xdc, 0x57, 0x8c, 0x6e, 0x62, 0x0a, 0xca, 0x19, ++ 0xae, 0x51, 0xf8, 0x01, 0x09, 0xf7, 0x19, 0x6f, 0x2c, 0x6e, 0xa2, 0xfd, ++ 0xc5, 0x1b, 0x07, 0xc9, 0xfd, 0xc5, 0x6e, 0x0d, 0xcf, 0x75, 0x2f, 0xbb, ++ 0xf4, 0xe7, 0xc9, 0x89, 0xf2, 0x2b, 0x63, 0xc5, 0xbc, 0x9f, 0x88, 0xba, ++ 0x08, 0x79, 0xbf, 0x26, 0x52, 0x48, 0xbf, 0x23, 0xb6, 0x1b, 0x99, 0x84, ++ 0xbe, 0xc7, 0x7e, 0xf2, 0x37, 0xd4, 0x16, 0xe7, 0x94, 0x33, 0xf1, 0x1d, ++ 0xd8, 0xee, 0x42, 0xde, 0x9e, 0x3c, 0xe8, 0x89, 0x1f, 0xb6, 0xe5, 0x01, ++ 0x7e, 0x4d, 0x4d, 0x1a, 0x9e, 0xeb, 0xc6, 0x0a, 0x14, 0xfa, 0x0e, 0xee, ++ 0x5f, 0xba, 0x58, 0x34, 0x3d, 0xad, 0x3f, 0xfc, 0x37, 0x6a, 0x2c, 0x6a, ++ 0xe1, 0xdf, 0xb1, 0x11, 0xfc, 0x0b, 0x9b, 0x2d, 0xdb, 0xf9, 0xf7, 0x88, ++ 0x5c, 0x2f, 0xcd, 0x92, 0x6a, 0x67, 0xdc, 0x10, 0x92, 0xd3, 0x5b, 0x05, ++ 0x9d, 0x6e, 0x19, 0x24, 0xf2, 0x92, 0x23, 0xd9, 0x48, 0xd4, 0x37, 0xb3, ++ 0x04, 0xdd, 0x6e, 0xb3, 0x82, 0xdf, 0x4a, 0x7a, 0xad, 0xdd, 0x1c, 0x27, ++ 0xff, 0xb3, 0x07, 0xa1, 0xfd, 0xd8, 0x32, 0xa0, 0xff, 0x6c, 0x7c, 0x1e, ++ 0xa7, 0x1f, 0x6a, 0xc4, 0xbc, 0x0b, 0x85, 0xdf, 0xbc, 0x18, 0x7f, 0xaf, ++ 0x54, 0xc5, 0xf3, 0xe6, 0xb9, 0xff, 0xfc, 0xc9, 0x16, 0xee, 0x37, 0xdf, ++ 0xc3, 0x3a, 0x28, 0x8f, 0x78, 0xfe, 0x31, 0xee, 0x2f, 0xd6, 0xc3, 0xf2, ++ 0x90, 0x5f, 0xfa, 0xfd, 0xae, 0xd7, 0x4e, 0x63, 0xbb, 0xbe, 0x23, 0xfe, ++ 0x77, 0x64, 0xf9, 0xef, 0x10, 0xf6, 0xfb, 0x9d, 0xd6, 0x52, 0x9e, 0x9f, ++ 0x3d, 0xbf, 0xa5, 0xbe, 0x02, 0xf3, 0x73, 0x35, 0x9b, 0xdf, 0xa4, 0x3c, ++ 0x70, 0x8d, 0xd4, 0x17, 0x11, 0xa3, 0xbe, 0x00, 0x07, 0x83, 0xeb, 0x8b, ++ 0x4d, 0x57, 0x52, 0x5e, 0xc7, 0x64, 0xe5, 0xbf, 0xa3, 0x39, 0x12, 0xf4, ++ 0x05, 0xd6, 0x97, 0x8c, 0xc4, 0xba, 0x51, 0x18, 0x7f, 0xb8, 0x38, 0x87, ++ 0x67, 0x35, 0xbe, 0xc2, 0xcf, 0xdf, 0xf9, 0xee, 0x20, 0xb2, 0x37, 0x53, ++ 0xa8, 0xae, 0x94, 0xc6, 0x53, 0x69, 0x3f, 0xf7, 0xcd, 0x80, 0x2f, 0x46, ++ 0x1f, 0x69, 0x37, 0xe2, 0xf5, 0x45, 0x99, 0xcc, 0xd7, 0x0c, 0xce, 0xa4, ++ 0x7c, 0x96, 0xd4, 0x1f, 0x65, 0x8c, 0xdb, 0x8b, 0x78, 0xff, 0xe8, 0x11, ++ 0x49, 0x4f, 0x11, 0xf7, 0x48, 0x3f, 0xa3, 0x0c, 0xfd, 0x0c, 0xe0, 0x8f, ++ 0x2e, 0x93, 0x3d, 0x62, 0x32, 0xe9, 0xfd, 0x8a, 0x08, 0xc9, 0x21, 0xc4, ++ 0x8d, 0xd3, 0x6c, 0x45, 0xc8, 0x3a, 0xdc, 0x9f, 0x1a, 0x79, 0xfb, 0x28, ++ 0xab, 0xa0, 0x3f, 0x8b, 0xa3, 0xef, 0x26, 0xa2, 0xef, 0xc0, 0xf1, 0x93, ++ 0xf1, 0x79, 0x1c, 0xfd, 0x65, 0xfc, 0x52, 0x21, 0xe8, 0x7f, 0x3b, 0x0b, ++ 0x50, 0x5c, 0xb4, 0x57, 0xd0, 0xff, 0xed, 0x77, 0xf9, 0xef, 0xbd, 0xcd, ++ 0xb2, 0x2f, 0x23, 0xfe, 0x7b, 0xf7, 0xf7, 0xdc, 0xdf, 0x94, 0xf1, 0xd3, ++ 0xd7, 0x8f, 0x9b, 0x02, 0xea, 0x3f, 0x12, 0x37, 0xf5, 0xd1, 0xdb, 0x06, ++ 0x7e, 0x64, 0x0a, 0xfe, 0x1e, 0xc6, 0xd4, 0x21, 0x8f, 0xe2, 0x7e, 0x78, ++ 0xa7, 0x8d, 0xff, 0xae, 0xb5, 0xc2, 0xe9, 0xeb, 0xbe, 0xfd, 0x78, 0x81, ++ 0x3e, 0xaf, 0xf8, 0x36, 0xfe, 0x7e, 0x8b, 0xee, 0x77, 0x25, 0x9a, 0xa7, ++ 0x26, 0x59, 0x71, 0x1f, 0xb0, 0xd9, 0xcc, 0xe3, 0x8a, 0x99, 0xd3, 0xde, ++ 0xab, 0x98, 0xab, 0xd3, 0x1b, 0x85, 0x59, 0x95, 0x2f, 0x0d, 0x1a, 0x8d, ++ 0xf4, 0xe8, 0xfa, 0xf6, 0x1f, 0x30, 0xce, 0x78, 0x5d, 0x9c, 0xe3, 0x7a, ++ 0xc0, 0x45, 0xf4, 0xbe, 0xd0, 0xc5, 0xef, 0x5f, 0xd8, 0x7a, 0x95, 0x3f, ++ 0x0c, 0xb7, 0xcf, 0x98, 0xc5, 0x79, 0x46, 0x4a, 0xd3, 0x42, 0x2c, 0x81, ++ 0x92, 0x70, 0x2c, 0x14, 0xbf, 0xf7, 0xf2, 0x59, 0xca, 0x2b, 0xb4, 0x7f, ++ 0x3c, 0x23, 0x23, 0x74, 0x0c, 0xe9, 0x70, 0xcf, 0x1b, 0x7b, 0x29, 0x5f, ++ 0x59, 0xc7, 0xba, 0xf8, 0xef, 0x02, 0x8b, 0x71, 0x07, 0xce, 0x4b, 0x86, ++ 0x49, 0x7f, 0x59, 0x5e, 0xe5, 0xf6, 0xb0, 0x57, 0x49, 0xf6, 0xf3, 0xef, ++ 0x86, 0xc3, 0x25, 0xfa, 0xfd, 0xa4, 0x63, 0x3e, 0xae, 0x67, 0xc7, 0xe5, ++ 0x07, 0x8f, 0xe3, 0x3c, 0xd2, 0xde, 0xc5, 0xd7, 0x15, 0x9c, 0x5c, 0x72, ++ 0x23, 0x7d, 0xd7, 0xf9, 0x17, 0x16, 0x48, 0xc7, 0xfd, 0x4c, 0x45, 0xe3, ++ 0xbf, 0xdf, 0x1c, 0x3f, 0x2f, 0xd6, 0x11, 0xb4, 0xe8, 0xf2, 0xd9, 0x27, ++ 0x6d, 0x89, 0xbf, 0x33, 0x3d, 0x35, 0x88, 0xe7, 0x03, 0x8a, 0x10, 0x47, ++ 0x58, 0x07, 0x91, 0x1b, 0xf8, 0x00, 0xf1, 0xf7, 0x89, 0x88, 0x03, 0x3f, ++ 0x11, 0xfb, 0x5a, 0x9f, 0xa4, 0xf1, 0x7d, 0xae, 0x9e, 0xbe, 0xfe, 0xfc, ++ 0xaa, 0xf9, 0x84, 0x7e, 0x16, 0xfb, 0x60, 0x9f, 0x64, 0x1a, 0xe3, 0x47, ++ 0xd9, 0xcf, 0x22, 0xae, 0x1f, 0xae, 0xb0, 0x06, 0x5b, 0x74, 0xf4, 0xf4, ++ 0x6d, 0x4a, 0x6a, 0x8a, 0x50, 0x1d, 0x95, 0xa8, 0x1b, 0x59, 0xc6, 0x78, ++ 0xbc, 0xb4, 0x3f, 0xc3, 0x70, 0x0e, 0x41, 0x86, 0xaf, 0xb2, 0xc8, 0x87, ++ 0xfb, 0x14, 0xc5, 0x01, 0x0b, 0xfe, 0xbe, 0x77, 0xef, 0x7e, 0x6e, 0x87, ++ 0x71, 0xff, 0x19, 0xf7, 0x87, 0x23, 0x39, 0xa1, 0x2f, 0x10, 0xee, 0x06, ++ 0x1f, 0x0b, 0xe0, 0xfe, 0x2a, 0xf3, 0x75, 0x5b, 0x6e, 0xc1, 0x7d, 0x46, ++ 0xf1, 0x7d, 0xeb, 0x79, 0xc1, 0x2f, 0xe7, 0x6d, 0xfc, 0x2a, 0xe1, 0xfa, ++ 0x6f, 0x24, 0xf2, 0x02, 0x1c, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xd5, 0x7d, ++ 0x09, 0x78, 0x54, 0xd5, 0xd9, 0xf0, 0xb9, 0x73, 0x27, 0x33, 0x13, 0x32, ++ 0x13, 0x26, 0x1b, 0x84, 0x2d, 0x4e, 0x16, 0xb2, 0x90, 0x6d, 0xb2, 0x61, ++ 0xd8, 0x27, 0x09, 0x20, 0xb8, 0x60, 0xc2, 0x52, 0x51, 0xb6, 0x61, 0xdf, ++ 0xb2, 0x09, 0xd8, 0x8f, 0xb6, 0xf6, 0xcf, 0x60, 0x10, 0x90, 0x47, 0x5b, ++ 0xa8, 0xb6, 0xc5, 0xcf, 0xe5, 0x19, 0x10, 0xa8, 0x56, 0x2c, 0x11, 0x83, ++ 0x46, 0x0d, 0x1a, 0x94, 0x22, 0x58, 0x5b, 0x47, 0x04, 0x45, 0x4b, 0x75, ++ 0xa4, 0xca, 0x22, 0x21, 0x89, 0x60, 0x2d, 0xf6, 0xa3, 0xe5, 0x7f, 0xdf, ++ 0xf7, 0x9c, 0x93, 0x99, 0x7b, 0x33, 0x61, 0xfb, 0xd5, 0xe7, 0xff, 0xc8, ++ 0xf3, 0x70, 0x72, 0xee, 0x3d, 0xf7, 0x2c, 0xef, 0x79, 0xf7, 0xf3, 0xbe, ++ 0x27, 0x51, 0x8e, 0x8a, 0x24, 0x47, 0x1c, 0x63, 0xed, 0x77, 0xfb, 0x4d, ++ 0x4c, 0x65, 0x2c, 0x4a, 0xd6, 0x2b, 0xa0, 0x9e, 0x8c, 0xf5, 0xf2, 0x24, ++ 0x47, 0x11, 0xd4, 0xa7, 0xc8, 0xf7, 0xa2, 0xfe, 0x10, 0xaf, 0xc3, 0x3f, ++ 0x03, 0xeb, 0xc5, 0xd8, 0x1c, 0xfc, 0xcd, 0x01, 0xa5, 0xc5, 0xda, 0xa2, ++ 0xe6, 0xc0, 0xef, 0xeb, 0xc2, 0x5a, 0xfd, 0xe9, 0xf4, 0x9e, 0x5d, 0x4a, ++ 0x62, 0x4c, 0x51, 0x99, 0x87, 0x45, 0x43, 0x25, 0x9d, 0x39, 0xca, 0x6d, ++ 0xf8, 0x74, 0xb8, 0xfd, 0x44, 0x26, 0x14, 0xe1, 0xf0, 0x1e, 0xfa, 0xa9, ++ 0x31, 0x59, 0xd7, 0x29, 0xb9, 0xd4, 0xbc, 0xdc, 0x02, 0xfd, 0xcd, 0x10, ++ 0xfd, 0xb1, 0xfe, 0x36, 0x23, 0xf6, 0x3f, 0x9d, 0x77, 0xc5, 0x66, 0x34, ++ 0x1f, 0xfc, 0x56, 0x89, 0x64, 0x6c, 0xa6, 0x85, 0xad, 0xe9, 0x07, 0xef, ++ 0x67, 0x35, 0xf7, 0x36, 0xc1, 0x0c, 0xd8, 0xa2, 0x48, 0x4f, 0xaa, 0x3d, ++ 0x0b, 0x5b, 0x8c, 0xb6, 0x9f, 0x80, 0x71, 0x15, 0x4f, 0x84, 0x7a, 0x29, ++ 0x02, 0xfa, 0xc6, 0x7f, 0xa3, 0xba, 0x96, 0x8c, 0x19, 0xd9, 0x09, 0x39, ++ 0x3f, 0x5a, 0x87, 0x87, 0x31, 0x5c, 0xf7, 0x00, 0x1f, 0xad, 0x6b, 0x7d, ++ 0x49, 0x47, 0xc2, 0x7f, 0x17, 0x32, 0xd6, 0xb1, 0xc7, 0x6c, 0xdf, 0x02, ++ 0xe3, 0x54, 0x35, 0xbf, 0x75, 0x54, 0x81, 0x75, 0x55, 0xc9, 0xf5, 0x35, ++ 0x6a, 0xd7, 0x97, 0xeb, 0x50, 0xe8, 0x7b, 0xc6, 0x2c, 0xde, 0xcf, 0x2d, ++ 0x8c, 0xdd, 0xce, 0x14, 0xd6, 0x13, 0xfa, 0x69, 0xb2, 0xba, 0x73, 0x11, ++ 0x5e, 0x55, 0x16, 0x3f, 0xcd, 0x13, 0x7a, 0x34, 0x95, 0x67, 0xc3, 0x68, ++ 0x6b, 0x87, 0x47, 0xd1, 0xfa, 0x7b, 0xc3, 0xf7, 0x30, 0x9f, 0x17, 0xeb, ++ 0x5c, 0xec, 0xef, 0x61, 0x01, 0x78, 0x2e, 0xb3, 0xf3, 0xf5, 0x8f, 0x51, ++ 0x2b, 0xcb, 0x4c, 0xb1, 0x8c, 0x9d, 0x9b, 0xc7, 0xec, 0x66, 0x78, 0xb4, ++ 0xec, 0xe0, 0xdc, 0x7a, 0x0b, 0xd4, 0x97, 0x3d, 0xc0, 0xec, 0x7c, 0x74, ++ 0x97, 0x81, 0x0d, 0x86, 0xfe, 0x05, 0xbc, 0xba, 0x9b, 0x5f, 0x5c, 0xb9, ++ 0x81, 0x39, 0x2c, 0xa2, 0x8e, 0xc3, 0x4e, 0xed, 0xc1, 0x1c, 0xe9, 0x81, ++ 0x7a, 0x1f, 0x77, 0xb4, 0xa6, 0x0e, 0xfd, 0x32, 0x9c, 0xc7, 0x52, 0xd1, ++ 0x6f, 0xbf, 0x45, 0x7d, 0x35, 0xdf, 0x0f, 0xa8, 0x4d, 0xd2, 0xb4, 0xbf, ++ 0x61, 0xe5, 0x20, 0xcd, 0xfb, 0x44, 0x4f, 0xbe, 0xa6, 0x9e, 0xbc, 0x6e, ++ 0xa8, 0xa6, 0xfd, 0xc0, 0x0d, 0xa5, 0x9a, 0x7a, 0xda, 0xa6, 0x9b, 0x35, ++ 0xed, 0xf3, 0x58, 0x52, 0x4f, 0x06, 0xf0, 0xaf, 0x39, 0xa0, 0x32, 0x2f, ++ 0x80, 0x36, 0xc3, 0x3b, 0x51, 0xf3, 0x3e, 0xf3, 0xe9, 0xbb, 0x34, 0xdf, ++ 0x9f, 0x64, 0xb5, 0xbf, 0x19, 0x0e, 0xed, 0x1a, 0xc3, 0x23, 0x73, 0x18, ++ 0xe0, 0x51, 0x7d, 0x78, 0xe4, 0x16, 0x2c, 0x99, 0xc7, 0xe5, 0xcb, 0x02, ++ 0xf8, 0xcc, 0x13, 0xeb, 0xc8, 0x6e, 0x98, 0xa3, 0xe9, 0xe7, 0x4c, 0xe4, ++ 0xd8, 0x03, 0xb8, 0xaf, 0xf3, 0x7c, 0x0b, 0x6e, 0x65, 0x80, 0x57, 0xb9, ++ 0x4d, 0x4b, 0x34, 0xfd, 0x2e, 0x55, 0x2b, 0xf9, 0xbe, 0x6d, 0x08, 0x3b, ++ 0xee, 0x87, 0xef, 0x6a, 0xe1, 0x07, 0xe1, 0x99, 0xcf, 0x3a, 0xf6, 0xf7, ++ 0x83, 0xf9, 0x55, 0x7b, 0x15, 0x67, 0x0b, 0xbc, 0x5e, 0xb8, 0x89, 0xbf, ++ 0x97, 0xdf, 0x2d, 0x6e, 0xda, 0x4c, 0xdf, 0x2d, 0xf6, 0x6a, 0x9f, 0x2f, ++ 0x7d, 0x5a, 0x5b, 0xf7, 0x94, 0xb2, 0xf4, 0x5a, 0x2b, 0x63, 0xcb, 0x1d, ++ 0xb6, 0x58, 0xc2, 0x87, 0xbe, 0xac, 0xef, 0xa5, 0x20, 0xba, 0x0a, 0xe0, ++ 0x01, 0x34, 0x82, 0xf1, 0xce, 0x3d, 0xae, 0x7a, 0xcd, 0x89, 0x08, 0x9f, ++ 0xd4, 0xdf, 0x0e, 0x27, 0xf8, 0x84, 0x31, 0xaf, 0xa3, 0xeb, 0x7e, 0x9d, ++ 0x63, 0xcc, 0xd9, 0x82, 0xed, 0x77, 0xd8, 0x9c, 0x1e, 0xa8, 0x2f, 0x3c, ++ 0x38, 0x97, 0xe6, 0x63, 0x8e, 0xd7, 0xe2, 0x41, 0xb8, 0x43, 0x8b, 0x07, ++ 0x11, 0xe9, 0x5a, 0x3c, 0xb0, 0x39, 0xb5, 0xfb, 0xde, 0xb3, 0x58, 0xbb, ++ 0xef, 0x7a, 0xf8, 0x46, 0xb9, 0x06, 0x5d, 0x16, 0xbe, 0x31, 0xe3, 0xb4, ++ 0x78, 0x21, 0xe1, 0x5a, 0x0c, 0x3f, 0xdf, 0x25, 0x5c, 0x9f, 0xd0, 0xc1, ++ 0xb3, 0x60, 0x9f, 0xab, 0xde, 0x4a, 0x70, 0x62, 0x93, 0x2d, 0x83, 0x11, ++ 0x7e, 0x7c, 0xbe, 0x66, 0x56, 0xae, 0x22, 0x9f, 0x63, 0xb1, 0xc0, 0x67, ++ 0xe0, 0xb9, 0x93, 0x77, 0xc1, 0xce, 0xda, 0xad, 0x1e, 0x03, 0xe0, 0xcf, ++ 0x73, 0x0e, 0xc5, 0x78, 0xc2, 0x12, 0xe8, 0x27, 0xcf, 0xd8, 0xb2, 0x17, ++ 0xd7, 0xb3, 0x46, 0xf1, 0x30, 0xfc, 0x2e, 0x9c, 0x79, 0xe3, 0x91, 0x5f, ++ 0xd4, 0x17, 0xb7, 0x24, 0xb4, 0xc0, 0xbe, 0xe4, 0x5b, 0x6a, 0x71, 0xe7, ++ 0xd8, 0x17, 0xd6, 0xf2, 0xe7, 0x91, 0xee, 0x2b, 0x4d, 0x2d, 0x39, 0xf8, ++ 0x5e, 0xf6, 0xf7, 0x85, 0xd5, 0x4d, 0xcf, 0x5b, 0x95, 0x77, 0x16, 0x30, ++ 0x58, 0x2f, 0x33, 0xb6, 0xe4, 0x10, 0x3f, 0xb4, 0x30, 0x1a, 0x5f, 0xc2, ++ 0x71, 0x70, 0x0f, 0x8e, 0xc7, 0x4b, 0x59, 0x39, 0xf1, 0xe1, 0x17, 0x05, ++ 0x3e, 0x7f, 0xfe, 0xd1, 0x22, 0x82, 0xe3, 0x02, 0x56, 0xbb, 0xdf, 0x05, ++ 0xe3, 0x9d, 0xf9, 0x98, 0xc3, 0x77, 0x31, 0xf3, 0x50, 0xbb, 0xf9, 0x1b, ++ 0xb4, 0x70, 0xe8, 0x02, 0x3f, 0x1d, 0xdc, 0x00, 0x6d, 0x1c, 0x38, 0x6e, ++ 0x8d, 0x58, 0xf7, 0x12, 0xc6, 0xbc, 0x86, 0xe4, 0xae, 0xf0, 0x54, 0x9a, ++ 0x95, 0x16, 0x5b, 0x0e, 0x82, 0xa1, 0x59, 0xf2, 0x6d, 0xf7, 0xa5, 0x02, ++ 0x8e, 0x76, 0x08, 0xcf, 0xa1, 0xac, 0xf3, 0x1f, 0xf1, 0x6f, 0x09, 0x5f, ++ 0x68, 0xa0, 0x04, 0xf3, 0x27, 0x1c, 0xcf, 0xde, 0x2b, 0x30, 0x9e, 0x84, ++ 0xa7, 0xe4, 0x5b, 0x72, 0x1c, 0x33, 0xab, 0x55, 0xe3, 0x91, 0x0e, 0x74, ++ 0x7c, 0x8c, 0xa5, 0x6b, 0xf7, 0x09, 0x36, 0x8e, 0x61, 0x7d, 0xb0, 0xa8, ++ 0xbd, 0x02, 0x3c, 0xd4, 0x12, 0x2d, 0x06, 0xeb, 0x85, 0xfd, 0xe0, 0xe4, ++ 0x19, 0xbb, 0x51, 0x8c, 0xc3, 0xe6, 0xb8, 0xe3, 0x11, 0x4e, 0x16, 0xb6, ++ 0x81, 0xf6, 0x6f, 0xbd, 0xe2, 0x5c, 0xa7, 0xc2, 0x38, 0xea, 0x0d, 0x89, ++ 0xf5, 0x0c, 0xe0, 0x59, 0x60, 0x77, 0xa9, 0xb8, 0x5f, 0x45, 0xcc, 0x37, ++ 0x0d, 0x9f, 0x17, 0x5b, 0x1a, 0xea, 0x8d, 0xd0, 0xd5, 0x0d, 0xec, 0xa2, ++ 0xfd, 0x04, 0xc8, 0x13, 0xd6, 0x7b, 0x7b, 0xd5, 0xa5, 0x98, 0xc0, 0x3a, ++ 0x14, 0xb9, 0x2e, 0x8f, 0xc2, 0x8c, 0x50, 0x1f, 0x21, 0xea, 0x93, 0x3c, ++ 0x8a, 0xff, 0xb1, 0x44, 0x5c, 0xcf, 0x5b, 0xdf, 0xe2, 0xb8, 0x23, 0x44, ++ 0x39, 0x09, 0x4b, 0xd8, 0x3f, 0x58, 0xe6, 0xdf, 0xff, 0x0a, 0x1f, 0x0f, ++ 0x57, 0x1c, 0x03, 0x70, 0xbc, 0x89, 0xaf, 0xa4, 0xc5, 0x21, 0xde, 0xac, ++ 0x51, 0x6a, 0x99, 0x6e, 0x7e, 0x47, 0x5f, 0x85, 0x7e, 0x54, 0x43, 0x47, ++ 0x0c, 0xb6, 0x1b, 0xc3, 0xdc, 0x46, 0x2e, 0x77, 0xbd, 0x38, 0x49, 0xf6, ++ 0x96, 0xe2, 0xa7, 0x79, 0xff, 0x88, 0xb9, 0xee, 0xc7, 0x52, 0xca, 0xb7, ++ 0x6a, 0xd6, 0x30, 0x76, 0x1a, 0xd4, 0xab, 0x1b, 0x41, 0x6e, 0x45, 0x62, ++ 0x19, 0xde, 0xa2, 0x42, 0xc9, 0x9a, 0x74, 0xf0, 0x64, 0xc6, 0xe3, 0x58, ++ 0x37, 0xc0, 0x4a, 0x10, 0xbf, 0x97, 0x62, 0x5d, 0xee, 0x7b, 0x62, 0xe0, ++ 0x3d, 0xd5, 0xd5, 0xae, 0xf5, 0x55, 0xb0, 0x86, 0x3e, 0xd1, 0x57, 0x96, ++ 0xef, 0x1b, 0x13, 0xed, 0x34, 0x5f, 0x90, 0x7f, 0xa9, 0xfc, 0x3d, 0xe7, ++ 0x6f, 0x8b, 0x04, 0xbc, 0x16, 0x49, 0xb9, 0xe5, 0xd5, 0xce, 0xef, 0x18, ++ 0xfe, 0xd2, 0x87, 0xb1, 0x3f, 0x9a, 0x00, 0x26, 0xf9, 0x48, 0x47, 0x16, ++ 0x8f, 0xa1, 0x27, 0xa8, 0x05, 0x89, 0x40, 0x97, 0xd8, 0x2e, 0x87, 0xe5, ++ 0x60, 0xff, 0x40, 0x57, 0x8e, 0x44, 0xe8, 0xbf, 0x57, 0x34, 0xd0, 0xa1, ++ 0x12, 0x4c, 0x77, 0xbc, 0xbd, 0x7c, 0xdf, 0x85, 0xee, 0x74, 0xeb, 0x67, ++ 0xb5, 0xb0, 0xb9, 0x43, 0x00, 0xde, 0xb6, 0x42, 0x93, 0x1b, 0x58, 0xee, ++ 0xdc, 0xe0, 0xf5, 0x5e, 0x05, 0x3c, 0xa4, 0x1e, 0x31, 0x0f, 0xdb, 0x42, ++ 0xf9, 0x2f, 0x87, 0x83, 0xd6, 0x5d, 0xd5, 0xe3, 0xd8, 0x07, 0x2e, 0x7c, ++ 0x5d, 0xe8, 0x4b, 0x40, 0xf9, 0x2f, 0xf7, 0xa9, 0xc6, 0xc4, 0xdc, 0x0d, ++ 0xa8, 0xb7, 0x34, 0xc4, 0xd1, 0xb8, 0xf2, 0xf9, 0xe8, 0x44, 0x83, 0xd0, ++ 0x27, 0x00, 0x1f, 0xaf, 0x02, 0x4e, 0xdd, 0xef, 0x43, 0x0a, 0xe9, 0x43, ++ 0x72, 0x1f, 0xae, 0x56, 0x1f, 0xca, 0x45, 0x1c, 0x2f, 0x0a, 0xc0, 0xef, ++ 0xe6, 0xae, 0xf0, 0x9e, 0x90, 0x18, 0x17, 0x04, 0x4f, 0x06, 0xf0, 0xcc, ++ 0xd6, 0xc0, 0x5b, 0xfb, 0x5e, 0xc0, 0x5b, 0xc2, 0xe3, 0x6c, 0x91, 0x6f, ++ 0x3b, 0xee, 0x93, 0x6a, 0x3b, 0xdc, 0x0b, 0xe1, 0xbc, 0x32, 0xbe, 0x7c, ++ 0x12, 0xee, 0xcf, 0x80, 0xa3, 0xfe, 0x13, 0x8a, 0x21, 0x30, 0xaf, 0x31, ++ 0x6a, 0xeb, 0xf6, 0xc7, 0x50, 0x8e, 0x35, 0xa9, 0x4e, 0xa4, 0xe5, 0xea, ++ 0x11, 0x9c, 0xcf, 0x55, 0xbf, 0xac, 0x12, 0xe9, 0xb7, 0x35, 0x9b, 0xbd, ++ 0x0a, 0xf4, 0xb3, 0xa8, 0xe9, 0x4d, 0xd2, 0xcf, 0x5a, 0xeb, 0x80, 0x91, ++ 0x86, 0x75, 0x0f, 0xa7, 0xce, 0xf5, 0xea, 0xe0, 0xdd, 0x15, 0x1e, 0x7c, ++ 0x1f, 0xe5, 0x7a, 0x96, 0xea, 0xd6, 0x3f, 0xf3, 0xbd, 0xf3, 0xb6, 0x19, ++ 0x0e, 0x5a, 0x67, 0xcd, 0x15, 0xe0, 0x50, 0x13, 0x0a, 0x0e, 0x67, 0x7e, ++ 0xcc, 0x66, 0x95, 0x67, 0xe1, 0xfa, 0xb2, 0x7a, 0xfa, 0xb3, 0x02, 0xe3, ++ 0x66, 0xe1, 0xbe, 0x03, 0x1c, 0x7e, 0x1e, 0x59, 0x7e, 0x0f, 0xc2, 0xa3, ++ 0xf0, 0xfd, 0xfe, 0x91, 0x08, 0x9f, 0x31, 0x6a, 0xf3, 0xfe, 0xbe, 0x08, ++ 0x87, 0x15, 0x8a, 0xd3, 0x0c, 0xe3, 0x8e, 0x32, 0x33, 0x4f, 0x38, 0xec, ++ 0x73, 0x9f, 0x95, 0x65, 0xec, 0xef, 0xb0, 0x57, 0xc5, 0xfe, 0x5a, 0xa7, ++ 0x1d, 0xe0, 0x11, 0xdf, 0xdf, 0xea, 0x54, 0x01, 0x1e, 0x69, 0xf7, 0xa8, ++ 0xe5, 0x5e, 0xe8, 0xf7, 0x6f, 0x2b, 0x96, 0x47, 0xcf, 0x85, 0xf2, 0xcb, ++ 0x3a, 0x18, 0x7a, 0x20, 0x3c, 0x57, 0x0c, 0xe5, 0x84, 0x6f, 0x6c, 0xd7, ++ 0x27, 0x3f, 0x85, 0xfe, 0xd2, 0x6c, 0xd3, 0x9d, 0xeb, 0xa1, 0x36, 0xc3, ++ 0x0c, 0xf3, 0x81, 0x71, 0x12, 0x7f, 0x1c, 0xd1, 0x92, 0x0c, 0x7c, 0xe2, ++ 0x75, 0x13, 0xb3, 0x20, 0xbd, 0x85, 0x25, 0xd5, 0x1e, 0x1a, 0x0f, 0xfd, ++ 0x76, 0x44, 0xa9, 0x4e, 0xd4, 0x83, 0x63, 0x55, 0x36, 0x1a, 0xf1, 0x4b, ++ 0xc2, 0x39, 0x36, 0x82, 0xaf, 0x43, 0x3e, 0x2f, 0x79, 0x62, 0xab, 0xe2, ++ 0xb7, 0x06, 0x9e, 0x8f, 0xaa, 0xef, 0x28, 0x58, 0x06, 0x65, 0x45, 0x22, ++ 0xdf, 0x77, 0xb9, 0xce, 0x51, 0x65, 0x1d, 0x05, 0xa8, 0xf7, 0x48, 0x38, ++ 0xc7, 0x26, 0xf3, 0xf6, 0xcc, 0xd8, 0x91, 0x30, 0x31, 0x88, 0x3e, 0x72, ++ 0x05, 0x3c, 0x8e, 0xa1, 0x5e, 0x07, 0xf0, 0xac, 0x8e, 0x33, 0xad, 0x41, ++ 0x39, 0xd8, 0x66, 0xe1, 0x75, 0xe6, 0x4a, 0x27, 0xfd, 0x77, 0x85, 0x85, ++ 0xd3, 0xc7, 0xb1, 0xf0, 0x04, 0x2f, 0xca, 0xc7, 0x63, 0xb0, 0x56, 0x1f, ++ 0xf5, 0xd7, 0x62, 0x63, 0xd6, 0x20, 0xbe, 0x18, 0xee, 0xea, 0x79, 0x23, ++ 0xac, 0x9b, 0xbd, 0xa7, 0xb2, 0x6d, 0x50, 0x7c, 0x6d, 0x77, 0xf5, 0x8c, ++ 0x22, 0x78, 0xd8, 0x79, 0x3f, 0x42, 0xdf, 0x6a, 0x63, 0x6c, 0x1c, 0xc2, ++ 0x69, 0xc5, 0xf8, 0xd2, 0xde, 0xd1, 0x50, 0xc6, 0xd5, 0x73, 0xf8, 0xe8, ++ 0xf1, 0xa4, 0x31, 0x91, 0xeb, 0xfd, 0x95, 0x17, 0x80, 0xf0, 0x0a, 0x02, ++ 0xcf, 0x2b, 0x8d, 0x2d, 0x26, 0xbb, 0x15, 0x9f, 0x9b, 0x34, 0xcf, 0x8f, ++ 0x03, 0xdc, 0x3c, 0xe6, 0x40, 0x7d, 0xce, 0xa9, 0x94, 0xb1, 0x8c, 0xf8, ++ 0x8c, 0x73, 0x0d, 0xb6, 0x9f, 0xbb, 0x2e, 0x82, 0x79, 0x82, 0xf4, 0xab, ++ 0x46, 0x31, 0x8f, 0xee, 0xe0, 0x52, 0x1d, 0x65, 0x64, 0x46, 0x80, 0x47, ++ 0xb5, 0xc2, 0xca, 0x2f, 0xd7, 0xee, 0xd5, 0xff, 0xa8, 0x04, 0x5f, 0xfd, ++ 0xfc, 0xff, 0x2a, 0xf8, 0x4c, 0x5c, 0x59, 0xe8, 0xf5, 0x1d, 0x12, 0xeb, ++ 0x2b, 0x5b, 0x7b, 0xeb, 0x6f, 0x51, 0xff, 0xac, 0xf6, 0x85, 0x31, 0x33, ++ 0x3c, 0x5a, 0xf1, 0x72, 0x49, 0x6f, 0x16, 0xa2, 0xbf, 0x4e, 0x38, 0x5f, ++ 0x18, 0xc6, 0xbc, 0x31, 0x41, 0x75, 0xa3, 0x9f, 0xe0, 0x51, 0x7d, 0x61, ++ 0x24, 0x3d, 0x2f, 0x5b, 0xdb, 0x6a, 0x42, 0xbc, 0xc7, 0x7e, 0x1c, 0xf0, ++ 0x7c, 0x45, 0xb8, 0xab, 0xb7, 0xf3, 0x32, 0x70, 0xce, 0xc5, 0x79, 0xe0, ++ 0x7a, 0x2f, 0x44, 0x31, 0x4f, 0x4c, 0xf0, 0x73, 0x8e, 0x57, 0x81, 0xfe, ++ 0x63, 0xe9, 0xfd, 0xef, 0x11, 0x80, 0x80, 0xb7, 0x9e, 0x26, 0xd5, 0xbb, ++ 0x0d, 0x3e, 0xfd, 0xfd, 0x01, 0xc3, 0xb8, 0x2d, 0xa1, 0xe6, 0x2b, 0xd6, ++ 0x3f, 0x28, 0xce, 0x48, 0xf4, 0x92, 0xd9, 0xc2, 0x5c, 0x9b, 0x43, 0x8c, ++ 0x2f, 0xdb, 0xf5, 0x8a, 0x06, 0x7e, 0x6d, 0xe5, 0x70, 0xae, 0xc8, 0xee, ++ 0x3a, 0xbf, 0xc6, 0x52, 0xff, 0x4c, 0x9c, 0xff, 0x8d, 0xa3, 0x99, 0x2b, ++ 0xd4, 0x78, 0xe7, 0x44, 0x3b, 0x39, 0xef, 0xc6, 0x68, 0xff, 0x02, 0x81, ++ 0xf7, 0xa9, 0x15, 0xb6, 0xa0, 0xba, 0x5d, 0xbb, 0x8f, 0x3d, 0xc5, 0xf8, ++ 0x8d, 0x37, 0xfb, 0x13, 0xb0, 0xff, 0xb6, 0xf1, 0x6c, 0x6a, 0x43, 0x88, ++ 0xfe, 0xe5, 0x7e, 0xcf, 0x88, 0x77, 0x67, 0x22, 0xdf, 0xa9, 0xbc, 0x03, ++ 0x1a, 0x03, 0x7e, 0x0c, 0x36, 0xd6, 0x2a, 0xf6, 0x20, 0x7a, 0xeb, 0x6e, ++ 0xbf, 0x03, 0x70, 0x06, 0xbb, 0xab, 0xe0, 0x72, 0x70, 0x36, 0xd1, 0x7b, ++ 0xd9, 0xdf, 0xe9, 0x43, 0x82, 0x1e, 0x99, 0xcb, 0xaa, 0x00, 0x1d, 0xcd, ++ 0x16, 0xf2, 0x6a, 0xf6, 0xd6, 0xa5, 0xb7, 0x02, 0xcf, 0xec, 0xb4, 0x5f, ++ 0x4e, 0x6f, 0x02, 0xfb, 0x05, 0x86, 0x38, 0xcd, 0x6a, 0xdf, 0xb4, 0x61, ++ 0x7d, 0x83, 0x42, 0xf6, 0xc9, 0x1c, 0x37, 0xc8, 0x00, 0xe0, 0x37, 0x0b, ++ 0xb6, 0x15, 0xac, 0x41, 0xb1, 0x35, 0x3b, 0x9e, 0xb1, 0x91, 0xd1, 0xfc, ++ 0xf9, 0xbd, 0x58, 0xae, 0x0e, 0x0b, 0xc8, 0x59, 0xfa, 0xdf, 0xc5, 0x82, ++ 0xe5, 0xa2, 0x1c, 0x7f, 0xde, 0x83, 0x5a, 0xbd, 0x75, 0x11, 0x7b, 0xf0, ++ 0x2b, 0xd4, 0x7b, 0x4e, 0x1f, 0xe2, 0x7c, 0x01, 0xd4, 0x53, 0xb2, 0xbf, ++ 0x17, 0x3c, 0xa2, 0xed, 0x6f, 0xd1, 0xd6, 0x5b, 0x4e, 0xe2, 0x3c, 0x17, ++ 0xe9, 0xf4, 0x9f, 0x34, 0x54, 0xf0, 0x40, 0xff, 0x48, 0x4b, 0x12, 0xf6, ++ 0xc4, 0x60, 0x36, 0x18, 0xf9, 0xff, 0xb2, 0x6d, 0xe7, 0x4d, 0x91, 0x8e, ++ 0xee, 0xf1, 0xff, 0x4b, 0xa0, 0xf3, 0x94, 0x81, 0xc8, 0x27, 0xed, 0x54, ++ 0x0e, 0x4d, 0x72, 0xe5, 0x24, 0xa1, 0x7f, 0xe1, 0x3d, 0x3e, 0xcf, 0xf1, ++ 0x49, 0xee, 0xfc, 0x24, 0xf4, 0xa3, 0xbc, 0xc7, 0xe7, 0x75, 0xae, 0xf2, ++ 0x1c, 0x97, 0x0f, 0x8f, 0xc7, 0x92, 0x5c, 0x32, 0x23, 0x13, 0x87, 0x5f, ++ 0xcd, 0xd3, 0x2c, 0xde, 0x7a, 0x98, 0xc7, 0x5a, 0x60, 0x23, 0xe1, 0x00, ++ 0x1f, 0xb3, 0x99, 0xeb, 0x41, 0x52, 0xff, 0x53, 0xd5, 0xe5, 0x6a, 0x24, ++ 0xbc, 0x1f, 0xf2, 0xc5, 0x8a, 0x68, 0x37, 0xf2, 0xe1, 0x67, 0x6f, 0x1a, ++ 0x87, 0xfd, 0xc5, 0x3d, 0x1b, 0xe1, 0xc2, 0xf5, 0xac, 0x2f, 0x71, 0xe5, ++ 0xa1, 0xbf, 0x60, 0x7d, 0x85, 0xd5, 0x59, 0x0f, 0x5d, 0x5a, 0xe0, 0x7b, ++ 0x94, 0x1b, 0xde, 0xdf, 0x0f, 0x79, 0xa3, 0x2f, 0x6a, 0x07, 0x0d, 0x1b, ++ 0x4b, 0xfb, 0x21, 0xba, 0x35, 0xef, 0x6d, 0x41, 0x7f, 0xca, 0x3a, 0xc3, ++ 0x57, 0xfb, 0xfb, 0x41, 0xfb, 0x75, 0x23, 0x99, 0xb3, 0x9e, 0x05, 0xc6, ++ 0xa9, 0x69, 0xae, 0x78, 0x1e, 0xe7, 0x93, 0x30, 0x99, 0xcb, 0x97, 0xf5, ++ 0x89, 0xae, 0x3c, 0x7b, 0x50, 0xbf, 0x4c, 0xe8, 0x73, 0xd5, 0x02, 0x76, ++ 0xed, 0x7b, 0xd2, 0x7e, 0x39, 0x0c, 0xf6, 0xf7, 0xb1, 0x03, 0xa4, 0x4e, ++ 0xc3, 0xfa, 0xc0, 0x9e, 0x87, 0xf9, 0x0d, 0x62, 0x7c, 0x9f, 0xd9, 0x45, ++ 0x80, 0x13, 0xe0, 0x09, 0x8e, 0x1d, 0xac, 0xb7, 0xb6, 0x82, 0x9c, 0x62, ++ 0x69, 0x81, 0xfa, 0xa0, 0x06, 0xa5, 0x25, 0x0c, 0xd6, 0x53, 0xd5, 0xf8, ++ 0xbc, 0x01, 0xe5, 0x60, 0xe5, 0x7d, 0x2d, 0xbd, 0xa6, 0xa1, 0x3c, 0x7a, ++ 0xc6, 0xe8, 0xdc, 0x12, 0x34, 0xbf, 0xd8, 0xd7, 0xfb, 0x94, 0x3a, 0x22, ++ 0x03, 0x72, 0x68, 0x9a, 0x62, 0x27, 0x3d, 0x41, 0xea, 0xe5, 0x77, 0x32, ++ 0xf9, 0x2f, 0x8b, 0xf0, 0x66, 0xaa, 0xc0, 0x9b, 0x3b, 0x85, 0x3e, 0x3e, ++ 0x2d, 0x82, 0xc3, 0x77, 0x0e, 0x73, 0x26, 0xe0, 0x77, 0x77, 0x59, 0x58, ++ 0xa4, 0x01, 0x48, 0x69, 0x5a, 0x59, 0x43, 0x11, 0xc9, 0xa9, 0xa5, 0x61, ++ 0x51, 0x28, 0xff, 0x71, 0x2d, 0xa1, 0xf6, 0x5b, 0x96, 0xdd, 0xf9, 0x95, ++ 0xaa, 0xb7, 0xdb, 0x3c, 0x0a, 0xec, 0x7b, 0x9b, 0xd2, 0x91, 0x8a, 0x9d, ++ 0x7c, 0x89, 0xbe, 0x1e, 0xee, 0x5f, 0xf2, 0x6e, 0x49, 0xec, 0xda, 0x4f, ++ 0x5d, 0x92, 0xa0, 0xc3, 0x54, 0xa1, 0x1f, 0xa6, 0x30, 0x97, 0x0d, 0xd6, ++ 0x5d, 0xfd, 0x5a, 0xda, 0xe6, 0xf5, 0xf0, 0xca, 0xdc, 0x03, 0xf6, 0x31, ++ 0x9f, 0xf8, 0x91, 0xa5, 0x38, 0x9f, 0xf4, 0x63, 0x0b, 0xda, 0x3d, 0x8b, ++ 0x5f, 0x0d, 0x6f, 0x51, 0x22, 0x03, 0x70, 0x61, 0x76, 0x57, 0x9e, 0x01, ++ 0xbe, 0xab, 0x99, 0xd8, 0x3f, 0x7f, 0x3d, 0xea, 0xa4, 0x47, 0x81, 0xaf, ++ 0x00, 0x81, 0xb5, 0x85, 0xf9, 0x13, 0x88, 0x8e, 0x81, 0xdf, 0x28, 0x20, ++ 0xf3, 0x36, 0x25, 0x8d, 0xad, 0x30, 0x02, 0xde, 0x55, 0xf7, 0x05, 0xfd, ++ 0x0b, 0xea, 0xfb, 0xb7, 0x4c, 0xaa, 0x30, 0x02, 0xde, 0x57, 0x27, 0xf9, ++ 0x17, 0x18, 0xa0, 0xde, 0x96, 0x54, 0xc5, 0xeb, 0x83, 0xfc, 0x27, 0xb0, ++ 0x7e, 0x21, 0x69, 0x25, 0xaf, 0xe7, 0xfb, 0x17, 0xa8, 0x50, 0x8f, 0x49, ++ 0x5e, 0xc3, 0xeb, 0x68, 0x08, 0x02, 0x62, 0x39, 0x92, 0x1f, 0xaa, 0xf0, ++ 0x40, 0xff, 0x5f, 0x46, 0x09, 0xb9, 0xee, 0xf4, 0xcf, 0x44, 0xfc, 0xa9, ++ 0x7e, 0x25, 0xcd, 0xb0, 0x3e, 0x68, 0xbd, 0xd6, 0x64, 0xce, 0xaf, 0xbe, ++ 0x0c, 0xe7, 0xed, 0xbe, 0x4c, 0x64, 0xb3, 0x26, 0x22, 0xbc, 0xd3, 0xfd, ++ 0xa9, 0x38, 0x4f, 0xd9, 0xae, 0x23, 0x49, 0xea, 0xc3, 0x1b, 0xa8, 0xbd, ++ 0x5c, 0xa7, 0xfc, 0x8e, 0xc5, 0x87, 0xee, 0xff, 0x77, 0x49, 0xbc, 0xff, ++ 0xc5, 0x65, 0x42, 0x1f, 0x89, 0x60, 0xeb, 0x10, 0x6e, 0xb0, 0x4d, 0x9e, ++ 0x48, 0x80, 0xff, 0xbe, 0xe6, 0xb4, 0x2d, 0xd8, 0xfe, 0xc1, 0xa4, 0x68, ++ 0xde, 0xbf, 0x1d, 0xfa, 0x29, 0x0c, 0xf4, 0x23, 0xe1, 0x28, 0xfb, 0x93, ++ 0xe3, 0x2e, 0x41, 0x79, 0x8b, 0x7c, 0x38, 0x0c, 0xf8, 0x70, 0x10, 0x1f, ++ 0x6d, 0x4c, 0xe2, 0xf2, 0x12, 0xc6, 0x59, 0x4d, 0xe3, 0xa4, 0x00, 0xfc, ++ 0xb1, 0xbf, 0x89, 0xfd, 0xf3, 0x70, 0xdf, 0x60, 0xbf, 0x8c, 0x62, 0xbf, ++ 0x8c, 0xdc, 0x4e, 0xdd, 0x4c, 0xed, 0xb1, 0xdf, 0xa8, 0x1c, 0xe2, 0xfb, ++ 0x05, 0x46, 0x58, 0xc7, 0xbe, 0x8b, 0xd0, 0x3e, 0x31, 0x30, 0x6f, 0x3d, ++ 0x7e, 0xec, 0x15, 0xf8, 0xb1, 0xb8, 0x1e, 0x18, 0x21, 0xe9, 0x67, 0xc9, ++ 0x84, 0x47, 0xa3, 0x22, 0xb8, 0x5e, 0xc8, 0x0a, 0xb5, 0xeb, 0x88, 0x49, ++ 0xe6, 0xf0, 0xb3, 0x26, 0x47, 0xf1, 0x75, 0x76, 0xee, 0x47, 0x6f, 0x85, ++ 0xc6, 0xa9, 0x17, 0x70, 0xec, 0x0f, 0x70, 0xcf, 0xbe, 0xf6, 0x75, 0xbf, ++ 0x2f, 0xe6, 0xf3, 0x5d, 0xaf, 0x3b, 0x68, 0xbf, 0x5c, 0x2a, 0xbe, 0x6f, ++ 0xca, 0xd8, 0x12, 0xbc, 0x1e, 0xb0, 0x2c, 0x35, 0xfd, 0x7c, 0xb9, 0x4a, ++ 0xf7, 0x5d, 0x31, 0x10, 0x20, 0xae, 0x33, 0x3a, 0x99, 0xbe, 0x5b, 0x1b, ++ 0xce, 0x2c, 0xf4, 0x9c, 0x6d, 0xe9, 0xfc, 0x2e, 0x31, 0x87, 0xeb, 0xa3, ++ 0xa8, 0xa7, 0x56, 0x09, 0x7d, 0x9a, 0x79, 0x46, 0x92, 0x53, 0xa1, 0x52, ++ 0x70, 0x8d, 0xaa, 0x75, 0x3e, 0x93, 0x03, 0xdf, 0x37, 0x28, 0x2e, 0xaf, ++ 0x35, 0x78, 0x7d, 0xb7, 0x16, 0x8a, 0xf5, 0xd9, 0xc5, 0xfa, 0xec, 0x7c, ++ 0x7d, 0x5e, 0x0d, 0x9e, 0xb2, 0xc3, 0x1d, 0x09, 0x93, 0x6d, 0x5d, 0xf1, ++ 0xb7, 0x13, 0xee, 0x9d, 0xfd, 0x65, 0xe5, 0x8b, 0xfe, 0x34, 0x74, 0x1d, ++ 0xaa, 0x3f, 0xa4, 0x8f, 0xee, 0xf6, 0x23, 0x2c, 0xf9, 0x3b, 0xde, 0x0f, ++ 0x39, 0x4f, 0x1d, 0x3c, 0x3b, 0xe1, 0xac, 0x9b, 0x9f, 0x84, 0x27, 0xd2, ++ 0x33, 0x7d, 0x97, 0xa5, 0xc5, 0x47, 0x39, 0xcf, 0x0b, 0x82, 0x3e, 0xbb, ++ 0xd0, 0x75, 0xe2, 0x75, 0x8e, 0x57, 0xc2, 0xbf, 0xab, 0xfa, 0x09, 0xec, ++ 0x23, 0xea, 0x27, 0x0e, 0x2d, 0x3e, 0x57, 0x35, 0x26, 0x1a, 0xe6, 0x64, ++ 0x05, 0xbe, 0x6b, 0xc2, 0xbd, 0x2c, 0x0a, 0xf8, 0xe7, 0xd2, 0x93, 0x85, ++ 0x9d, 0xd7, 0x9f, 0xf5, 0x47, 0xfe, 0xed, 0x29, 0xe5, 0x7e, 0x54, 0xcf, ++ 0x2e, 0xb3, 0xb3, 0xde, 0x41, 0x7e, 0xbd, 0xac, 0xe4, 0xb8, 0x90, 0x7e, ++ 0x3d, 0x7a, 0xae, 0xb7, 0xf3, 0xda, 0xa3, 0x4c, 0x4c, 0x21, 0xbd, 0x48, ++ 0xeb, 0x67, 0x68, 0x8f, 0x73, 0xfa, 0x5c, 0xa8, 0x9f, 0x9e, 0x65, 0xce, ++ 0x6d, 0xd0, 0xef, 0x30, 0x9d, 0xde, 0xd1, 0x0e, 0xfb, 0xb9, 0xcb, 0x1a, ++ 0xf8, 0x2e, 0x20, 0x4f, 0xb4, 0xf5, 0x9f, 0x08, 0x3a, 0xe8, 0xea, 0x37, ++ 0xea, 0x48, 0xc0, 0xf9, 0x15, 0x9a, 0x4b, 0x5f, 0x70, 0x38, 0x19, 0x1b, ++ 0x9b, 0xfc, 0x14, 0xf1, 0xf7, 0xc2, 0x9e, 0xa5, 0xcb, 0x13, 0xa1, 0x7e, ++ 0x4b, 0xf2, 0x36, 0xe2, 0xd7, 0x85, 0xfd, 0x4a, 0xcf, 0xa3, 0x6b, 0xe6, ++ 0xb6, 0xe4, 0xed, 0xbc, 0x9e, 0x59, 0x7a, 0x3e, 0x09, 0xeb, 0x4f, 0x6d, ++ 0xe7, 0xed, 0x47, 0xb9, 0x5e, 0x40, 0xfe, 0xce, 0x3c, 0xdb, 0x2b, 0x46, ++ 0x0f, 0x09, 0xe8, 0x0f, 0x13, 0x92, 0x1d, 0x5c, 0xff, 0x28, 0x33, 0x30, ++ 0xc4, 0x23, 0xb3, 0x7a, 0xb7, 0x13, 0xe5, 0xa4, 0x84, 0x67, 0x77, 0x65, ++ 0xa1, 0xd9, 0x50, 0x1b, 0x4a, 0x6f, 0xbd, 0xa3, 0x93, 0x9e, 0xf9, 0x79, ++ 0x46, 0xb1, 0x90, 0xcf, 0xc5, 0xd2, 0x8e, 0xf7, 0x1b, 0x35, 0x76, 0x7c, ++ 0x7b, 0xa4, 0xc5, 0xa3, 0x02, 0x5c, 0xdb, 0x51, 0x9e, 0xc2, 0x7a, 0xe7, ++ 0x24, 0xbb, 0xa7, 0x23, 0xfc, 0x6b, 0x22, 0x5a, 0x67, 0xa2, 0x0a, 0x7c, ++ 0x5f, 0xc4, 0x27, 0x26, 0xd4, 0x87, 0x14, 0x17, 0xe8, 0x1b, 0xe8, 0x17, ++ 0x71, 0xd8, 0xd9, 0x74, 0x98, 0xa7, 0xd2, 0xba, 0xbe, 0x9c, 0xf4, 0xc0, ++ 0x25, 0x4e, 0x8b, 0x91, 0xe0, 0x29, 0xfc, 0x54, 0xb0, 0xf6, 0x4b, 0xd0, ++ 0xcf, 0xab, 0xaf, 0x3d, 0xf3, 0xb3, 0x7e, 0x7c, 0x98, 0x72, 0x9c, 0xc7, ++ 0x10, 0x41, 0xff, 0x35, 0xaf, 0x7d, 0xfb, 0xcd, 0x5f, 0x51, 0x8e, 0x7e, ++ 0x69, 0x75, 0xa2, 0x1b, 0x70, 0x48, 0xf3, 0xa3, 0xcb, 0x51, 0xbf, 0x1a, ++ 0xd2, 0xfc, 0xa7, 0x6f, 0xb9, 0xbc, 0xb5, 0xd2, 0x39, 0x95, 0x9c, 0xf7, ++ 0x10, 0xf4, 0x37, 0xc2, 0xf3, 0xe2, 0x26, 0x33, 0xcd, 0x7f, 0x48, 0x73, ++ 0xc6, 0x7c, 0x6c, 0x3f, 0xec, 0xfd, 0xe6, 0x64, 0xc4, 0x8f, 0x11, 0xc7, ++ 0x5a, 0xea, 0x91, 0x1d, 0xb4, 0xef, 0x79, 0xa9, 0x9f, 0x3b, 0xf8, 0xdc, ++ 0x8a, 0x9d, 0x54, 0x2e, 0x65, 0x5e, 0xbb, 0x7e, 0xd1, 0x09, 0x8f, 0x2f, ++ 0x4c, 0x0c, 0xf5, 0x4b, 0x80, 0xc7, 0xff, 0xe1, 0xf0, 0xb8, 0xb8, 0x00, ++ 0xfd, 0x8a, 0x6d, 0x71, 0x87, 0xd6, 0xf8, 0x49, 0x4f, 0xeb, 0xcf, 0xfd, ++ 0x98, 0xe2, 0x7b, 0xd0, 0xcb, 0xd3, 0x91, 0xce, 0xcf, 0xb1, 0x1e, 0x4e, ++ 0x3c, 0x57, 0x68, 0xb7, 0xf1, 0x7e, 0xf4, 0xfe, 0xcd, 0xa3, 0x15, 0xb0, ++ 0x3e, 0x78, 0x3e, 0xa2, 0x03, 0x66, 0x10, 0xa4, 0x37, 0x8f, 0xba, 0x60, ++ 0x01, 0x06, 0x12, 0xa8, 0x97, 0xb0, 0x28, 0x4d, 0xbd, 0xcc, 0xd2, 0x47, ++ 0xd3, 0x7e, 0x8c, 0x3d, 0x51, 0xf3, 0xfe, 0xa6, 0xf8, 0x0c, 0xcd, 0xfb, ++ 0xf1, 0x8e, 0x3c, 0x4d, 0xfd, 0x96, 0xf4, 0x21, 0x9a, 0xf6, 0xb7, 0x39, ++ 0x4b, 0x34, 0xf5, 0xdb, 0x8b, 0xc7, 0x6b, 0xda, 0x57, 0xb8, 0x2a, 0x34, ++ 0xf5, 0xbc, 0x96, 0x06, 0x4d, 0xfb, 0x82, 0x03, 0x4d, 0xda, 0xf7, 0x87, ++ 0x1d, 0xb4, 0x0f, 0x05, 0xc7, 0xca, 0xcb, 0x50, 0x9f, 0x77, 0xfa, 0xdc, ++ 0xf5, 0x58, 0xde, 0xd8, 0xba, 0xa1, 0xac, 0xa7, 0x83, 0x75, 0xf1, 0xeb, ++ 0x16, 0xfa, 0xbd, 0xf5, 0xf8, 0x7c, 0xd8, 0xc5, 0xda, 0xa2, 0x16, 0xd6, ++ 0xd5, 0xbf, 0xcb, 0x96, 0xb8, 0xe9, 0x3c, 0xc0, 0x8c, 0xfb, 0xa2, 0x06, ++ 0x9d, 0x0f, 0x94, 0xf8, 0x88, 0x1e, 0xdb, 0x0c, 0x4e, 0x47, 0xb0, 0x1f, ++ 0xf7, 0xd1, 0x5e, 0xee, 0x17, 0x70, 0x9f, 0xde, 0x52, 0x00, 0xec, 0x00, ++ 0xec, 0x91, 0x96, 0x8e, 0x18, 0xdc, 0xaf, 0x31, 0xb3, 0x1e, 0x52, 0x23, ++ 0x71, 0x5f, 0x3a, 0x18, 0xf9, 0xbd, 0x1a, 0x4d, 0xfe, 0x5f, 0x0c, 0x43, ++ 0x39, 0x3f, 0x43, 0x25, 0xbd, 0xb7, 0xd1, 0xc8, 0x48, 0x7f, 0x6c, 0x9c, ++ 0x9a, 0xed, 0x45, 0xdf, 0xdf, 0x51, 0xc5, 0xff, 0xe2, 0x5f, 0x91, 0x4f, ++ 0xcd, 0x88, 0x20, 0x7e, 0x32, 0x02, 0x34, 0x5c, 0x5a, 0x37, 0x9e, 0x81, ++ 0x2a, 0xb8, 0x4f, 0x6e, 0xcd, 0xba, 0x4b, 0xd8, 0x62, 0xdd, 0x3e, 0xdd, ++ 0xad, 0xa9, 0x8f, 0xb1, 0xff, 0x44, 0xd3, 0xfe, 0xa6, 0xf8, 0x55, 0x9a, ++ 0xf7, 0xe3, 0x1d, 0x0f, 0xe8, 0xf6, 0x69, 0xa3, 0xa6, 0x7e, 0x9b, 0xf3, ++ 0x51, 0xdd, 0x3e, 0x6d, 0xd6, 0xed, 0xd3, 0x33, 0x9a, 0xf7, 0x23, 0x3e, ++ 0xf7, 0xd7, 0x23, 0x19, 0x8d, 0x6a, 0xf5, 0xa8, 0x36, 0x98, 0xff, 0xd0, ++ 0xa3, 0x1b, 0xca, 0x70, 0x5f, 0x86, 0x1d, 0xf3, 0xcc, 0x40, 0x7a, 0x29, ++ 0x6c, 0x71, 0xd7, 0x13, 0x0b, 0xd9, 0x57, 0xfb, 0x26, 0x96, 0x2d, 0x60, ++ 0x57, 0xa1, 0x3f, 0xeb, 0x8d, 0xba, 0x78, 0x2a, 0xf7, 0xd5, 0x39, 0xc8, ++ 0x1f, 0xb5, 0xbf, 0x2e, 0x9d, 0xca, 0x03, 0x75, 0x4e, 0x7a, 0xfe, 0x76, ++ 0x5d, 0x31, 0x95, 0xef, 0xd4, 0xb9, 0xa8, 0xfc, 0x4b, 0xdd, 0x38, 0x2a, ++ 0x7d, 0x75, 0xe5, 0x54, 0x36, 0xd4, 0x35, 0x50, 0xfb, 0x5d, 0x75, 0x4d, ++ 0x54, 0x02, 0x04, 0x07, 0xa0, 0xbc, 0x88, 0x8d, 0x11, 0xf2, 0x07, 0xea, ++ 0x68, 0xe7, 0xb7, 0x19, 0xfc, 0xd5, 0x78, 0xe2, 0x7a, 0xfa, 0xa9, 0x6f, ++ 0x88, 0x4f, 0xb6, 0xf5, 0xf0, 0xb7, 0x61, 0xfd, 0x3e, 0xf6, 0x8f, 0x8a, ++ 0xd1, 0x50, 0x3f, 0x9c, 0xc2, 0x88, 0xbf, 0x59, 0xa1, 0x4f, 0xa4, 0xc7, ++ 0x73, 0x29, 0xae, 0xca, 0x14, 0xa8, 0x5f, 0x48, 0xe6, 0xcf, 0xdb, 0xc3, ++ 0xac, 0xeb, 0x50, 0x0e, 0x34, 0x18, 0x5c, 0x79, 0xa8, 0x5f, 0xff, 0xfb, ++ 0xa9, 0xff, 0x6c, 0x34, 0x0e, 0x60, 0xec, 0xfe, 0x55, 0xe5, 0xf1, 0xf6, ++ 0x28, 0x5e, 0xb7, 0x40, 0x9d, 0x36, 0x1b, 0x0d, 0x33, 0xcf, 0x7f, 0x36, ++ 0xba, 0x86, 0x33, 0xf6, 0x1c, 0x8a, 0x8c, 0xa1, 0x54, 0xaf, 0xc0, 0x7a, ++ 0x7b, 0x38, 0x7f, 0x7f, 0xe1, 0xa9, 0xff, 0x90, 0x7e, 0x2d, 0xcf, 0x9b, ++ 0x27, 0x07, 0xce, 0x9b, 0xff, 0x9d, 0x1c, 0xe2, 0xbc, 0xf9, 0xb9, 0x53, ++ 0x0e, 0x1b, 0xfa, 0x59, 0x0e, 0x5d, 0x4c, 0xb3, 0xe1, 0xba, 0x0e, 0x09, ++ 0xbf, 0x92, 0x8b, 0xe5, 0x85, 0xcd, 0x86, 0xb2, 0xc4, 0x98, 0x17, 0x86, ++ 0x72, 0xf1, 0xa8, 0x4e, 0x8f, 0x90, 0xe5, 0xa7, 0xd6, 0x12, 0x53, 0x4a, ++ 0x1c, 0xce, 0xdf, 0x39, 0x05, 0xf5, 0x08, 0xcf, 0xcd, 0x61, 0x6c, 0x1b, ++ 0xf0, 0x8b, 0x89, 0x0a, 0xb7, 0x47, 0x3b, 0xf5, 0xc0, 0x14, 0x2e, 0xcf, ++ 0xdb, 0x6f, 0x33, 0x93, 0xbd, 0x73, 0xd8, 0xe0, 0x9a, 0x8f, 0x78, 0x0e, ++ 0x7c, 0xfa, 0x49, 0x84, 0x57, 0x42, 0x4a, 0xcf, 0x89, 0x28, 0x57, 0xda, ++ 0x6d, 0x1d, 0x09, 0x08, 0x87, 0xfe, 0x29, 0x91, 0xbc, 0x1e, 0xd7, 0xf1, ++ 0xa4, 0xe2, 0x0c, 0xaa, 0x87, 0xf1, 0x75, 0xc6, 0xa5, 0xd8, 0x26, 0x76, ++ 0xb3, 0xce, 0xbe, 0x38, 0x1f, 0xfd, 0x3a, 0x6f, 0x48, 0x11, 0xe7, 0x0c, ++ 0x2d, 0xae, 0x01, 0x28, 0x7f, 0x65, 0xfd, 0x70, 0x85, 0xab, 0x0a, 0xe5, ++ 0xc4, 0xe1, 0x12, 0xd7, 0x40, 0x9c, 0xcf, 0xa1, 0x72, 0x33, 0xd1, 0x8f, ++ 0xa7, 0xdc, 0xe6, 0x1d, 0x88, 0x4c, 0xce, 0xe8, 0x2a, 0x9a, 0x12, 0xe4, ++ 0x6f, 0x79, 0x34, 0x25, 0x8c, 0xbe, 0x9b, 0x6c, 0xe2, 0x74, 0xc6, 0xee, ++ 0x52, 0xbd, 0xdb, 0x42, 0xd8, 0x69, 0x2f, 0xa5, 0x70, 0x7d, 0x9f, 0xf6, ++ 0x0d, 0xed, 0xb9, 0x3b, 0x23, 0x48, 0x0f, 0x3f, 0x6c, 0x60, 0x8b, 0x76, ++ 0x85, 0x80, 0xe3, 0xbb, 0x29, 0x5c, 0xce, 0x9d, 0xe9, 0x11, 0xda, 0xff, ++ 0xe2, 0x13, 0xf0, 0x2b, 0x9d, 0x64, 0xa3, 0xfe, 0xda, 0x57, 0x84, 0xd3, ++ 0x79, 0x6f, 0x7b, 0x79, 0x1a, 0xe9, 0x41, 0xed, 0xb5, 0x00, 0x25, 0xa0, ++ 0x8f, 0xf6, 0x53, 0xb5, 0x67, 0x77, 0xd3, 0x7b, 0xb3, 0x3c, 0x0a, 0xa3, ++ 0x73, 0xcd, 0x69, 0x82, 0x4f, 0x3d, 0xd7, 0xbc, 0xfc, 0x1f, 0x47, 0xa0, ++ 0xfd, 0x27, 0x2b, 0x22, 0x9c, 0xc4, 0xc3, 0xed, 0x83, 0x48, 0x3e, 0xdd, ++ 0x25, 0x1a, 0xcf, 0x88, 0xb1, 0x90, 0xde, 0x32, 0x63, 0xe2, 0x80, 0x52, ++ 0x94, 0x4b, 0xd3, 0xc4, 0xf9, 0xd8, 0x4c, 0x9b, 0xb1, 0x17, 0x1d, 0x93, ++ 0x19, 0xa3, 0x4c, 0x76, 0xe8, 0x67, 0x9e, 0x35, 0x6f, 0x0d, 0x8a, 0xff, ++ 0x05, 0xb1, 0x15, 0xa6, 0x28, 0xa8, 0x2f, 0xea, 0x7f, 0xf7, 0x1a, 0x2c, ++ 0x97, 0xa4, 0x6c, 0x34, 0x45, 0x43, 0x59, 0x99, 0xf5, 0xfc, 0x1a, 0x54, ++ 0x1f, 0xab, 0x80, 0xb4, 0x8a, 0xc8, 0x5e, 0xf2, 0xff, 0xb9, 0x0e, 0xe6, ++ 0x35, 0x6b, 0xa5, 0xea, 0xe0, 0xf6, 0x93, 0x90, 0x6b, 0xae, 0xa5, 0xd7, ++ 0x14, 0x8f, 0x21, 0xf1, 0x10, 0xe1, 0x88, 0x78, 0x0a, 0xf0, 0x25, 0xbb, ++ 0xf0, 0x3d, 0x01, 0x6f, 0xf9, 0xdd, 0x7b, 0x02, 0x9e, 0xb3, 0x52, 0xc4, ++ 0x39, 0x6d, 0x36, 0xcb, 0xbe, 0xa4, 0x3d, 0xf7, 0x99, 0x8b, 0x78, 0xd2, ++ 0x3a, 0xe3, 0xcf, 0xa9, 0xdd, 0xf8, 0xe7, 0xb5, 0xef, 0x85, 0xde, 0xf6, ++ 0x81, 0x89, 0x8f, 0xbb, 0xf4, 0xe9, 0x30, 0x6f, 0xb0, 0x3f, 0x49, 0x8e, ++ 0x7b, 0x48, 0xcc, 0xe3, 0xb0, 0x89, 0xb9, 0x14, 0xd4, 0xe3, 0xee, 0xb2, ++ 0x11, 0x7e, 0xe4, 0x4c, 0x3d, 0x7f, 0x5f, 0x11, 0xac, 0x3f, 0xa7, 0xd9, ++ 0x6e, 0xa0, 0x73, 0x7b, 0xc9, 0xc7, 0x7d, 0x8c, 0xfc, 0xf6, 0x45, 0x9f, ++ 0xbb, 0x89, 0xcf, 0xdd, 0xd8, 0xea, 0xdf, 0x7e, 0x84, 0x11, 0x9e, 0x37, ++ 0x21, 0x9d, 0x5c, 0x49, 0x4e, 0x4d, 0xf2, 0xac, 0x22, 0xf9, 0x30, 0xe4, ++ 0x6b, 0x90, 0x3f, 0xc8, 0x17, 0x2f, 0xba, 0x3f, 0x39, 0x42, 0x7c, 0x70, ++ 0x91, 0xe0, 0x83, 0xb5, 0xc4, 0xbf, 0xf6, 0xd5, 0xad, 0xa4, 0xfa, 0xfe, ++ 0x3a, 0x0f, 0x95, 0x07, 0xea, 0xd6, 0x09, 0x3e, 0xb8, 0x81, 0xde, 0xbf, ++ 0x53, 0xb7, 0x49, 0xf0, 0x41, 0xaf, 0xe0, 0x83, 0x4f, 0xd3, 0xf3, 0xe6, ++ 0xba, 0xa9, 0x54, 0xbe, 0x56, 0xe7, 0x16, 0x7c, 0x90, 0x9f, 0xab, 0x4e, ++ 0x14, 0xf8, 0xb4, 0x32, 0xde, 0xbd, 0x0e, 0xf9, 0x99, 0x3c, 0xbf, 0x9c, ++ 0x6c, 0x71, 0x87, 0x21, 0xbc, 0xfe, 0xf8, 0xa8, 0x99, 0xa9, 0x78, 0x2e, ++ 0xd1, 0x6c, 0x26, 0x3c, 0x05, 0x0a, 0x78, 0xf2, 0xb1, 0x58, 0x8c, 0x97, ++ 0x31, 0xdb, 0xd7, 0x3b, 0xba, 0xc6, 0xcd, 0xe8, 0xf9, 0x6d, 0xe7, 0xfe, ++ 0xeb, 0xce, 0x79, 0x37, 0xc4, 0xbb, 0x1e, 0xc1, 0xf1, 0x3a, 0xe3, 0x64, ++ 0x50, 0x3f, 0xbb, 0xa1, 0x7b, 0xfc, 0x39, 0xc4, 0x1c, 0x36, 0xe4, 0x27, ++ 0x3b, 0xb6, 0x4e, 0x24, 0xfe, 0x71, 0xc8, 0xe1, 0xb0, 0xa1, 0xde, 0xfa, ++ 0x5c, 0xca, 0xa4, 0x89, 0xc8, 0xaf, 0x0f, 0xb9, 0x1c, 0xb6, 0x30, 0xa8, ++ 0xff, 0x61, 0xeb, 0x24, 0xfe, 0xde, 0xed, 0xb0, 0x99, 0xa1, 0xbe, 0x33, ++ 0x65, 0x32, 0x7f, 0xef, 0x71, 0xd8, 0xc2, 0xa1, 0xde, 0xb0, 0x55, 0xd4, ++ 0xbd, 0x8c, 0x0e, 0xb5, 0x77, 0x6f, 0xbd, 0x93, 0xf8, 0x4f, 0x09, 0x53, ++ 0xf6, 0x21, 0x3d, 0x94, 0x59, 0x12, 0x47, 0x03, 0xbb, 0x06, 0xf9, 0x58, ++ 0xb2, 0x0f, 0xe9, 0xe0, 0xa6, 0xf8, 0xd9, 0xa3, 0x91, 0x0e, 0x52, 0x52, ++ 0x1c, 0x84, 0x0f, 0xe3, 0x1d, 0xab, 0xf6, 0x61, 0xfd, 0x96, 0xf4, 0xcd, ++ 0xc6, 0x18, 0x07, 0x7a, 0x43, 0xf3, 0x56, 0xe3, 0x77, 0xa5, 0xb1, 0x15, ++ 0x46, 0xfc, 0x6e, 0x74, 0xff, 0xbb, 0x57, 0xe3, 0x77, 0x63, 0x53, 0x36, ++ 0x1a, 0x83, 0xbf, 0x1b, 0x97, 0xf5, 0xfc, 0x6a, 0xac, 0xdf, 0xea, 0xdc, ++ 0x6c, 0x44, 0x7d, 0x30, 0x05, 0xf9, 0x56, 0x5c, 0xa0, 0x1f, 0x59, 0x97, ++ 0xef, 0x25, 0x7f, 0x45, 0x3b, 0x01, 0xf1, 0x34, 0xb7, 0xb9, 0x9c, 0xf8, ++ 0x78, 0x4e, 0x53, 0x39, 0xf1, 0x71, 0x09, 0x97, 0xd2, 0xc9, 0x15, 0xf7, ++ 0xa3, 0x9f, 0xae, 0xa6, 0x49, 0xb1, 0x2b, 0x38, 0x8f, 0xc9, 0x4a, 0xe7, ++ 0x61, 0xbd, 0x02, 0x3a, 0x44, 0xf5, 0x45, 0xa0, 0x16, 0xe0, 0xb3, 0xfb, ++ 0xb6, 0xce, 0x8b, 0x5e, 0x05, 0xdf, 0xd5, 0x60, 0x7d, 0x28, 0xd5, 0x7f, ++ 0xb5, 0x2a, 0x34, 0xdf, 0x3d, 0x98, 0x12, 0x42, 0xbe, 0x7c, 0x28, 0xe8, ++ 0x14, 0xe5, 0x66, 0x05, 0x7c, 0xf7, 0x21, 0xd0, 0xcf, 0x2e, 0xa8, 0x67, ++ 0xe0, 0xfa, 0xc8, 0x7f, 0x38, 0xdb, 0x36, 0x9b, 0xfa, 0x73, 0xdb, 0x50, ++ 0xbe, 0xe6, 0xa6, 0x70, 0x39, 0x59, 0x20, 0xe4, 0xe6, 0x5c, 0x51, 0x2e, ++ 0x12, 0xcf, 0x3f, 0xb5, 0xba, 0xde, 0x47, 0xba, 0xfc, 0x38, 0x45, 0xd8, ++ 0x63, 0x5d, 0xe9, 0xfa, 0x13, 0x41, 0xb7, 0x0b, 0xf8, 0x3c, 0xba, 0xd0, ++ 0xb5, 0xf6, 0xbd, 0xa0, 0x6b, 0xbf, 0x94, 0x0f, 0x85, 0x1d, 0x09, 0x58, ++ 0xaf, 0x62, 0x1b, 0xc8, 0x4f, 0x78, 0xa5, 0xf8, 0xae, 0xc5, 0xc1, 0xf6, ++ 0x5b, 0x22, 0xc6, 0x49, 0x34, 0x50, 0xfc, 0x85, 0x3e, 0x4e, 0xa2, 0x92, ++ 0xf9, 0x78, 0x7f, 0x0d, 0xba, 0x38, 0x0b, 0xe6, 0x37, 0xd1, 0x79, 0x6c, ++ 0x53, 0xd0, 0x73, 0xe2, 0x47, 0xc2, 0xfe, 0xe8, 0xc1, 0xf9, 0xde, 0x54, ++ 0x64, 0xd6, 0x80, 0x9f, 0xdf, 0x76, 0xcf, 0xcf, 0xfe, 0x8d, 0xf0, 0xbf, ++ 0xcc, 0xba, 0xb5, 0xef, 0xc5, 0xba, 0x17, 0x33, 0x2f, 0xc5, 0xb5, 0xe9, ++ 0xd7, 0xc1, 0xdc, 0x71, 0x44, 0x5b, 0x4b, 0xad, 0x87, 0x69, 0x3f, 0xbb, ++ 0xae, 0xc7, 0x1f, 0x7a, 0x3d, 0x5d, 0xd6, 0xc1, 0xed, 0x77, 0x19, 0xc7, ++ 0x22, 0xfd, 0xf2, 0xa0, 0x07, 0xd9, 0x06, 0x16, 0x21, 0x1f, 0xb4, 0x31, ++ 0xf4, 0xdf, 0x04, 0xf3, 0x89, 0x23, 0x97, 0xe1, 0x13, 0x7a, 0x7e, 0xf4, ++ 0x5d, 0xf1, 0xb9, 0xcb, 0xf0, 0x9b, 0xa4, 0x81, 0x21, 0xf8, 0x8d, 0x8c, ++ 0xcf, 0xd2, 0x97, 0x52, 0x9f, 0x83, 0xba, 0x07, 0xe3, 0xf3, 0x3c, 0xaf, ++ 0x85, 0x93, 0x9f, 0xfe, 0xa4, 0xc3, 0x9d, 0x8d, 0xfd, 0xb4, 0x97, 0x76, ++ 0x7c, 0x63, 0x40, 0xfb, 0x2c, 0xd6, 0x4f, 0x78, 0xe6, 0xe9, 0xe7, 0x76, ++ 0xe2, 0x73, 0xc5, 0xc4, 0xcf, 0xe9, 0xe1, 0x49, 0x2a, 0xee, 0xdb, 0x29, ++ 0x83, 0xe7, 0x0f, 0xa8, 0x17, 0x0d, 0xdf, 0xf6, 0x24, 0xf1, 0x9d, 0x36, ++ 0x14, 0x0e, 0x40, 0x8f, 0x85, 0x50, 0x47, 0xbe, 0xe3, 0xed, 0x5b, 0x3e, ++ 0x18, 0xbf, 0x63, 0xe9, 0x1c, 0x7f, 0xda, 0x15, 0x2e, 0x17, 0x25, 0xdd, ++ 0x83, 0x3e, 0x48, 0xe5, 0x88, 0x81, 0x5c, 0x1e, 0x75, 0x2d, 0x39, 0x5d, ++ 0xc9, 0xb8, 0xc6, 0xf6, 0xcd, 0xdf, 0x26, 0x90, 0x1f, 0xeb, 0x0a, 0xf8, ++ 0xde, 0x1d, 0x1c, 0xc6, 0xa8, 0xc3, 0xfd, 0x1e, 0xe4, 0xf7, 0xc5, 0x11, ++ 0xa4, 0xf2, 0xb4, 0x2a, 0xac, 0x45, 0x01, 0xfd, 0xaf, 0xb5, 0xa4, 0x17, ++ 0xe9, 0x11, 0xad, 0x03, 0x4c, 0x46, 0x2c, 0xbf, 0x6b, 0x3b, 0xb1, 0x75, ++ 0x40, 0x2a, 0xf5, 0xaf, 0xb7, 0x17, 0x5b, 0xfb, 0x14, 0x5b, 0xf8, 0xb8, ++ 0x63, 0xc7, 0x61, 0xd9, 0x64, 0x72, 0x6f, 0x9a, 0x8d, 0x76, 0xd2, 0x10, ++ 0x33, 0xd9, 0x49, 0xef, 0x8a, 0x78, 0xc0, 0x09, 0x11, 0x3c, 0x7e, 0xea, ++ 0x5d, 0x3c, 0x1f, 0x86, 0x76, 0x13, 0x8e, 0x5f, 0x8c, 0x45, 0xf9, 0xa5, ++ 0xb7, 0x37, 0x5b, 0x0f, 0x4e, 0x2f, 0x75, 0xe4, 0x74, 0xb5, 0x3b, 0x61, ++ 0x9d, 0xa3, 0x71, 0x9d, 0x95, 0x9f, 0x19, 0xee, 0xc7, 0x67, 0xd7, 0x6a, ++ 0x87, 0x56, 0xae, 0xfc, 0x86, 0x19, 0x63, 0x40, 0x6e, 0xaf, 0xbc, 0xc8, ++ 0x8c, 0x05, 0x57, 0x63, 0x97, 0x32, 0x15, 0xd9, 0x45, 0xfe, 0x51, 0xe7, ++ 0x9b, 0x58, 0x16, 0x7d, 0xee, 0x8b, 0xce, 0x71, 0xa0, 0xfd, 0x29, 0xf5, ++ 0x07, 0x61, 0x9f, 0x5e, 0x21, 0x0e, 0xa9, 0xb8, 0x83, 0xeb, 0x0b, 0xa3, ++ 0x2e, 0xb2, 0x74, 0x63, 0x21, 0xfa, 0x99, 0x7a, 0xd0, 0xf9, 0x8d, 0x52, ++ 0xfc, 0x27, 0x6e, 0xb7, 0x8a, 0x52, 0x9e, 0x8b, 0x0c, 0xe7, 0x53, 0x60, ++ 0x33, 0x0d, 0x56, 0xaf, 0x29, 0x49, 0x13, 0x87, 0x14, 0x6f, 0x84, 0x72, ++ 0xba, 0xea, 0x1f, 0x8c, 0xf5, 0x36, 0xe6, 0xa3, 0x73, 0x12, 0xbd, 0x3d, ++ 0xfb, 0x96, 0xf0, 0x43, 0x81, 0x5d, 0xfb, 0x0b, 0xc4, 0xdb, 0x35, 0x22, ++ 0x3e, 0x09, 0x76, 0x24, 0x06, 0xf1, 0x77, 0xcc, 0x4f, 0x3f, 0x9a, 0xf9, ++ 0x33, 0xe2, 0x03, 0xe1, 0xa4, 0x0f, 0x75, 0xda, 0xb5, 0xbb, 0x0d, 0x14, ++ 0x5f, 0xd0, 0x68, 0x74, 0xf5, 0x1c, 0x81, 0x76, 0xed, 0xca, 0x81, 0xce, ++ 0x55, 0x50, 0xff, 0xd4, 0x17, 0xf7, 0xeb, 0x57, 0xa1, 0xac, 0xb1, 0x7f, ++ 0x43, 0x70, 0x93, 0xf4, 0x5b, 0xb9, 0xf2, 0x3c, 0xc1, 0x53, 0xd6, 0x5b, ++ 0x85, 0xdf, 0x77, 0x43, 0x18, 0xc8, 0x1f, 0x28, 0x2b, 0xff, 0xa3, 0x92, ++ 0x1c, 0xaa, 0x64, 0x6c, 0x1d, 0xed, 0x1b, 0x7b, 0xc3, 0xb4, 0x2c, 0x48, ++ 0x2e, 0xb2, 0x86, 0xaf, 0x3a, 0xe1, 0x9f, 0x0b, 0x7c, 0xaf, 0x02, 0x01, ++ 0x48, 0x76, 0xd6, 0xc8, 0x49, 0x2e, 0x68, 0x57, 0x21, 0xec, 0x0f, 0xe6, ++ 0x79, 0x9d, 0xd7, 0x85, 0xdd, 0x05, 0x16, 0xc5, 0x24, 0x17, 0xf4, 0x5b, ++ 0x11, 0x27, 0xda, 0xb3, 0x87, 0xf9, 0xfb, 0x01, 0xf2, 0xfd, 0x23, 0xfc, ++ 0xfd, 0x40, 0xd9, 0xdf, 0xf9, 0x89, 0xf4, 0xbe, 0x8f, 0xac, 0x8b, 0xfe, ++ 0x32, 0x64, 0xfd, 0x4f, 0xbc, 0x9e, 0x28, 0xc7, 0x6b, 0xe5, 0xf5, 0x6c, ++ 0x59, 0x0f, 0xe7, 0xfd, 0xd9, 0x78, 0xfb, 0x97, 0x06, 0x36, 0x4c, 0xf2, ++ 0x64, 0x05, 0xf8, 0xfd, 0x9e, 0x81, 0x42, 0x3e, 0xe6, 0xb1, 0x3c, 0x11, ++ 0x97, 0xb3, 0x77, 0xe0, 0xe5, 0xe3, 0x51, 0xb4, 0xef, 0x85, 0x7c, 0x98, ++ 0xf5, 0x8c, 0xea, 0x31, 0xe5, 0xe2, 0xfe, 0x8c, 0x8f, 0xf8, 0x33, 0xd2, ++ 0x77, 0x83, 0x42, 0xb1, 0x73, 0x95, 0xf7, 0x86, 0x91, 0xbf, 0xfb, 0x4c, ++ 0x74, 0x43, 0xce, 0xf2, 0x20, 0x7b, 0x45, 0xc6, 0xaf, 0x94, 0x97, 0xd9, ++ 0x5c, 0xa8, 0xff, 0x55, 0xbd, 0x98, 0xb6, 0x45, 0x15, 0xf1, 0x3c, 0xa8, ++ 0x7f, 0xfc, 0xcb, 0xc1, 0xed, 0x98, 0x31, 0xaa, 0x95, 0xce, 0x27, 0xce, ++ 0x3d, 0xc8, 0xf9, 0x7e, 0x77, 0xfa, 0xdb, 0x82, 0x95, 0xaf, 0x6a, 0xf6, ++ 0xb3, 0xcb, 0x7b, 0x55, 0xe1, 0xf6, 0x38, 0x1e, 0xdc, 0xc1, 0x78, 0x67, ++ 0x1f, 0xea, 0xbd, 0x99, 0xec, 0x8b, 0x14, 0x1f, 0x9d, 0x9b, 0x7f, 0x2a, ++ 0xf8, 0x5d, 0x2f, 0xe0, 0xad, 0xc5, 0xd1, 0x81, 0x78, 0xb1, 0xd8, 0x64, ++ 0xe6, 0x42, 0x7b, 0x35, 0xf6, 0x25, 0xe0, 0xcf, 0xb8, 0xc7, 0x9f, 0xfb, ++ 0x88, 0x1f, 0x2f, 0x78, 0x89, 0xfb, 0x7f, 0xab, 0x1e, 0x7d, 0x93, 0xe4, ++ 0xde, 0x1c, 0xd5, 0x41, 0xfe, 0xdc, 0xb1, 0x59, 0xee, 0x2f, 0x10, 0x6f, ++ 0xdb, 0x6c, 0x3e, 0xf2, 0x2b, 0x2e, 0x58, 0xf9, 0x1a, 0xcd, 0xeb, 0x9b, ++ 0x0c, 0xa1, 0x37, 0xd8, 0x3b, 0xb2, 0x82, 0xe1, 0x79, 0xb6, 0x2b, 0xfc, ++ 0xbf, 0xba, 0x02, 0xfc, 0xbf, 0xfa, 0x21, 0xe1, 0xaf, 0xf7, 0x3b, 0x2f, ++ 0xb1, 0xee, 0xa3, 0xf5, 0x2e, 0xb9, 0xc6, 0xb8, 0xb6, 0x36, 0x1b, 0x3f, ++ 0x17, 0x75, 0x8a, 0x7d, 0x3a, 0x6e, 0x70, 0x0c, 0x16, 0xf0, 0x8a, 0x48, ++ 0x45, 0xff, 0xf9, 0x7c, 0x5f, 0x6a, 0x94, 0x8a, 0x41, 0xc7, 0xbe, 0x5e, ++ 0x3c, 0x5e, 0xe9, 0x9d, 0x22, 0xb4, 0x8b, 0xce, 0xd5, 0xda, 0x18, 0xee, ++ 0xfb, 0xf4, 0xe5, 0x7f, 0xcb, 0x71, 0x87, 0xf0, 0xfb, 0xea, 0xed, 0x81, ++ 0x19, 0x38, 0x66, 0x5c, 0x00, 0x5e, 0x7d, 0x52, 0x85, 0x1e, 0x14, 0x80, ++ 0xef, 0x00, 0x1c, 0xef, 0x32, 0xf0, 0xd5, 0xbe, 0xff, 0x9e, 0xe1, 0xdb, ++ 0xdb, 0xe8, 0x37, 0x39, 0xf1, 0x1c, 0xf5, 0x28, 0xa3, 0x7e, 0x06, 0xfb, ++ 0x8e, 0x9b, 0x82, 0xe3, 0x62, 0x46, 0xa4, 0x72, 0xbc, 0xec, 0xd9, 0xc4, ++ 0xcf, 0x8d, 0xf4, 0xf1, 0x5e, 0x23, 0x52, 0x6d, 0xdc, 0xef, 0x2d, 0xce, ++ 0x67, 0xaa, 0x26, 0xbe, 0x33, 0x1c, 0xcf, 0x67, 0x24, 0x3d, 0x8c, 0x8a, ++ 0x60, 0x0d, 0xe8, 0x6f, 0x07, 0xbc, 0x76, 0x0a, 0xbc, 0x76, 0x22, 0x5e, ++ 0x4b, 0xfc, 0x0d, 0x9c, 0xd3, 0xc0, 0x77, 0x21, 0xe8, 0x2b, 0x80, 0xbf, ++ 0x5a, 0xb8, 0x8e, 0x4e, 0xed, 0x82, 0xb7, 0xe3, 0xae, 0x00, 0xd7, 0x71, ++ 0x3f, 0x24, 0x5c, 0x1b, 0x41, 0x1f, 0xa6, 0x73, 0xcd, 0xdd, 0xe1, 0xe4, ++ 0x4f, 0xd1, 0xc3, 0x79, 0xa9, 0x80, 0xab, 0x84, 0xf7, 0xbd, 0x57, 0x80, ++ 0xf3, 0xbd, 0xdf, 0x13, 0x9c, 0xef, 0x4d, 0x75, 0x68, 0xfc, 0x11, 0x12, ++ 0xde, 0xdd, 0xc9, 0x27, 0xfd, 0xfe, 0xc8, 0x79, 0x87, 0xa0, 0xd3, 0xa2, ++ 0xeb, 0xa1, 0xd3, 0x4b, 0x69, 0xdc, 0x4e, 0x64, 0x46, 0x3f, 0xc5, 0x99, ++ 0xea, 0xf7, 0xbd, 0xbe, 0x2b, 0x3d, 0xad, 0xbd, 0xc2, 0xbe, 0xaf, 0xfd, ++ 0x21, 0xf7, 0x5d, 0x0f, 0x37, 0x7d, 0x59, 0x29, 0xce, 0x3b, 0xf5, 0xcf, ++ 0xb7, 0xa5, 0x76, 0xcb, 0xef, 0xbe, 0x13, 0x38, 0xfe, 0x6f, 0xf3, 0xa7, ++ 0xcf, 0xa8, 0xdd, 0xab, 0x79, 0x3f, 0x6b, 0xe5, 0x41, 0xcd, 0xfb, 0xd9, ++ 0x9e, 0xf7, 0x34, 0xf5, 0xe1, 0x7e, 0x5f, 0x19, 0xa2, 0xb9, 0xf4, 0x8f, ++ 0x8f, 0x3c, 0xd5, 0xf1, 0x26, 0xd6, 0xaf, 0xd7, 0xcf, 0xde, 0x9d, 0x7f, ++ 0x7d, 0xc2, 0x0b, 0x0b, 0x0d, 0x78, 0xfe, 0x56, 0xec, 0xe3, 0xfe, 0xfd, ++ 0x05, 0xe9, 0xee, 0x7f, 0xa5, 0x02, 0x9c, 0xdf, 0x35, 0x78, 0xeb, 0x6d, ++ 0x00, 0xd7, 0x1b, 0x8f, 0x35, 0xa8, 0x74, 0x1e, 0xe6, 0xcd, 0xa3, 0x73, ++ 0xc0, 0xe5, 0x62, 0x8e, 0xe7, 0x87, 0xff, 0xf3, 0x93, 0x9f, 0x01, 0xde, ++ 0x9c, 0x67, 0x66, 0xf2, 0x7f, 0xb6, 0xec, 0xcd, 0x30, 0x3a, 0xb2, 0xbb, ++ 0xe2, 0x41, 0xc9, 0x05, 0x95, 0xb9, 0x82, 0xf4, 0xc4, 0x12, 0x4b, 0x94, ++ 0x11, 0xf5, 0xa9, 0x12, 0xd0, 0x94, 0x43, 0xe1, 0xcd, 0x25, 0x81, 0x37, ++ 0x14, 0x0f, 0x04, 0xf4, 0x3e, 0xd5, 0xc2, 0xc2, 0x62, 0x81, 0xce, 0xa7, ++ 0x4e, 0x55, 0x28, 0xfe, 0x69, 0x2a, 0xe3, 0xf1, 0xd4, 0x50, 0xb6, 0xb8, ++ 0xe1, 0xfd, 0x04, 0x23, 0x6b, 0x31, 0x43, 0xbd, 0xc2, 0x6a, 0x6c, 0x31, ++ 0xd3, 0xb9, 0x1f, 0xcf, 0x77, 0x98, 0xc2, 0xa7, 0xc9, 0xcc, 0x46, 0xe6, ++ 0xc1, 0xf7, 0x2c, 0x36, 0x86, 0xec, 0xe0, 0xc9, 0xf8, 0x10, 0xe6, 0xab, ++ 0xba, 0x54, 0x8a, 0x67, 0x9b, 0x52, 0xcc, 0xcf, 0x0b, 0xef, 0xb2, 0x36, ++ 0x84, 0xa1, 0x3c, 0xbd, 0xf3, 0xc0, 0x7d, 0x67, 0x7f, 0x06, 0xef, 0xd9, ++ 0x6a, 0x4f, 0x11, 0x8f, 0xd7, 0x96, 0xf9, 0x6b, 0x1f, 0x1b, 0xae, 0xe5, ++ 0x1c, 0xf0, 0x52, 0x2a, 0xa7, 0xf3, 0x76, 0x45, 0x9c, 0x2b, 0x2b, 0x61, ++ 0x4e, 0x8c, 0x6f, 0xd5, 0x7f, 0xf7, 0x7e, 0x2a, 0xf7, 0x97, 0x4e, 0x50, ++ 0x57, 0xa9, 0x18, 0xff, 0xd2, 0xf1, 0x1e, 0x23, 0xbd, 0x5b, 0xd2, 0x1d, ++ 0xac, 0xef, 0x80, 0x39, 0x9f, 0xe7, 0x67, 0x0c, 0xc5, 0x75, 0xb2, 0xb0, ++ 0x96, 0xb4, 0x48, 0xd4, 0x9f, 0x37, 0x96, 0x61, 0xfb, 0xca, 0xc3, 0x0e, ++ 0x82, 0x4b, 0x4d, 0xf1, 0xaa, 0x1c, 0xdc, 0xc7, 0x9a, 0xd1, 0xca, 0x67, ++ 0xe6, 0x9c, 0x80, 0x7d, 0x53, 0xb3, 0xf2, 0x6b, 0xd2, 0xd3, 0xc7, 0xa8, ++ 0x3b, 0xea, 0xb1, 0xfd, 0xb9, 0xa3, 0xdc, 0x35, 0x7e, 0x63, 0xab, 0x47, ++ 0x45, 0x7b, 0x25, 0xe0, 0xbf, 0xf4, 0xcf, 0x44, 0xba, 0xbc, 0x92, 0x1d, ++ 0x24, 0xe7, 0x7d, 0xac, 0xae, 0x85, 0xf0, 0xe9, 0x93, 0xba, 0x03, 0x54, ++ 0xbe, 0x3b, 0xf2, 0x4f, 0x45, 0xa8, 0x67, 0xf8, 0xeb, 0x7c, 0x21, 0xfd, ++ 0x97, 0xd7, 0xeb, 0x2f, 0x90, 0x7e, 0x02, 0xe9, 0x37, 0x90, 0x7c, 0xe0, ++ 0xd3, 0x7b, 0xcb, 0x7a, 0x23, 0x5e, 0x66, 0xa4, 0x09, 0x3d, 0xd0, 0xa2, ++ 0xf4, 0x43, 0xbe, 0xc0, 0x8c, 0xbc, 0x94, 0xfc, 0x32, 0x37, 0xad, 0x8b, ++ 0x5c, 0x2d, 0x48, 0xbb, 0xbc, 0x3e, 0xa8, 0x7d, 0xff, 0x3d, 0xf3, 0xd7, ++ 0xab, 0xc5, 0xf3, 0xca, 0x78, 0x2e, 0x17, 0xf5, 0xf8, 0xad, 0xc7, 0x6b, ++ 0x89, 0xcf, 0xf0, 0x59, 0x91, 0x02, 0xe3, 0xde, 0x05, 0xfa, 0x1e, 0xca, ++ 0xd5, 0x69, 0xcc, 0x93, 0x5d, 0x09, 0x7c, 0x76, 0xea, 0xc2, 0x0d, 0x61, ++ 0xc3, 0x94, 0xeb, 0xc7, 0xeb, 0x25, 0xd6, 0xcf, 0x13, 0x58, 0x88, 0x3c, ++ 0x95, 0x6b, 0xe7, 0xe7, 0x0e, 0xda, 0x47, 0xb5, 0x4c, 0x25, 0xfb, 0x40, ++ 0xc6, 0x2b, 0xc8, 0x7d, 0x58, 0x90, 0xd6, 0x45, 0x2e, 0x2e, 0xb9, 0xc2, ++ 0xbe, 0x2d, 0xf9, 0x21, 0xf7, 0xad, 0xab, 0x5c, 0xfb, 0x7c, 0xe6, 0xf5, ++ 0xc9, 0x35, 0xa6, 0xc9, 0xeb, 0xb8, 0xbf, 0x2b, 0xbe, 0x3e, 0x90, 0x76, ++ 0x79, 0x7d, 0x40, 0xfb, 0xfe, 0x7b, 0x5e, 0x77, 0x50, 0xfe, 0xcc, 0x4c, ++ 0xd5, 0x10, 0xc8, 0x17, 0xc1, 0x78, 0x62, 0x8c, 0x6b, 0x6c, 0xf7, 0xf2, ++ 0x7c, 0xc8, 0x45, 0x89, 0x1b, 0x22, 0x29, 0x38, 0xb3, 0xb8, 0x23, 0x12, ++ 0xf5, 0xc6, 0xc5, 0x7b, 0x54, 0xc2, 0x43, 0x66, 0x74, 0x19, 0xfb, 0x00, ++ 0xbe, 0x2e, 0x14, 0xf8, 0xda, 0xca, 0x5a, 0x3e, 0x40, 0x7c, 0x5c, 0x38, ++ 0x7c, 0x21, 0xe5, 0xd1, 0x2d, 0x7a, 0x3c, 0x74, 0x5c, 0x71, 0xb5, 0x68, ++ 0xbf, 0xc4, 0xda, 0x68, 0xc2, 0x75, 0x2e, 0xd9, 0xaa, 0x6d, 0x57, 0x2d, ++ 0xe2, 0x8a, 0x2b, 0x77, 0x68, 0xfd, 0xa2, 0xd5, 0xc3, 0x6f, 0x3a, 0x89, ++ 0xfd, 0x56, 0xeb, 0xe2, 0x79, 0x76, 0xa6, 0x89, 0xf8, 0xe1, 0x7c, 0x96, ++ 0xcf, 0xe3, 0x2e, 0xb4, 0xfa, 0xa9, 0xbe, 0x6c, 0xab, 0x63, 0x1a, 0x7f, ++ 0x65, 0xdb, 0xc5, 0x3a, 0xf2, 0x07, 0xbc, 0xf4, 0xbb, 0xd6, 0x87, 0x3d, ++ 0xfd, 0x83, 0xec, 0xff, 0xae, 0x78, 0xbb, 0xf7, 0x0a, 0xfb, 0xb7, 0xf7, ++ 0x87, 0xdc, 0x3f, 0x3d, 0xde, 0xaa, 0xb6, 0xad, 0x94, 0x57, 0x75, 0xad, ++ 0x78, 0xfb, 0xd3, 0x41, 0xae, 0x0f, 0x70, 0xde, 0x92, 0x1f, 0x4f, 0x47, ++ 0xde, 0x04, 0xe3, 0x4e, 0x7f, 0xd5, 0xec, 0xf5, 0xe0, 0xf9, 0x68, 0x91, ++ 0x83, 0xfb, 0x37, 0x15, 0x6f, 0x3d, 0x9e, 0xb7, 0xb5, 0x7f, 0xcb, 0xc8, ++ 0x7f, 0x34, 0x47, 0xf8, 0x39, 0xbb, 0xcb, 0x4b, 0x97, 0xf1, 0x06, 0x43, ++ 0x0e, 0x7b, 0xeb, 0x79, 0xbc, 0x81, 0x4b, 0xc5, 0x3c, 0xd1, 0xc1, 0x07, ++ 0xca, 0xcb, 0xf0, 0xb8, 0xa2, 0xe0, 0x9d, 0x5a, 0xd2, 0x47, 0xba, 0x3d, ++ 0xb7, 0x92, 0xf9, 0x55, 0x22, 0x7e, 0xe8, 0x6a, 0xf9, 0x9a, 0xf4, 0xeb, ++ 0x0d, 0x3e, 0x55, 0x4b, 0x7a, 0x96, 0xd3, 0x67, 0x27, 0x7d, 0x68, 0xe8, ++ 0x85, 0x86, 0x37, 0x51, 0x3e, 0x7e, 0x57, 0xfe, 0x6e, 0x29, 0x0f, 0x73, ++ 0x63, 0x38, 0xdc, 0x0a, 0xfd, 0xe5, 0xa4, 0xe7, 0xb5, 0x85, 0xb5, 0x14, ++ 0x7d, 0x88, 0x7a, 0xc2, 0xcb, 0xe1, 0x21, 0xf5, 0x84, 0x1e, 0xe9, 0x5c, ++ 0x4f, 0x98, 0xe4, 0x99, 0x1d, 0xc6, 0xf3, 0x0d, 0xbb, 0x9c, 0x07, 0xf6, ++ 0x48, 0xc7, 0xf3, 0x40, 0xc1, 0xff, 0x0d, 0x16, 0x57, 0x18, 0xc2, 0x69, ++ 0x8c, 0xda, 0xfa, 0xeb, 0x3b, 0x10, 0x7f, 0x7c, 0x2a, 0xf9, 0xf7, 0x56, ++ 0xfc, 0xfc, 0xfd, 0x3f, 0x3c, 0xe6, 0xb8, 0xb2, 0xdd, 0x5f, 0x63, 0x3f, ++ 0x4f, 0x7a, 0x43, 0x77, 0xfa, 0x7f, 0x8d, 0x81, 0xe7, 0x5d, 0xe4, 0x97, ++ 0x39, 0x28, 0xce, 0x0f, 0xed, 0x29, 0xf4, 0xef, 0x49, 0x7f, 0x9f, 0xbe, ++ 0x7d, 0xf1, 0xa0, 0xd2, 0xfe, 0xe9, 0x71, 0xe4, 0xaf, 0xf6, 0xb9, 0x70, ++ 0x3e, 0x9b, 0xf8, 0x7c, 0xba, 0xdb, 0x9f, 0x9a, 0x95, 0x5f, 0x69, 0xfc, ++ 0x8b, 0xdd, 0x8d, 0x5f, 0xb3, 0xa7, 0xc8, 0x3e, 0x27, 0x88, 0x0e, 0x66, ++ 0xa4, 0x2b, 0x12, 0xcf, 0xed, 0x27, 0x2c, 0x81, 0xfd, 0xbd, 0x5a, 0x3c, ++ 0x18, 0xd1, 0x31, 0x55, 0xa3, 0xff, 0xfc, 0xff, 0x6e, 0x57, 0x4c, 0x50, ++ 0x41, 0xb5, 0x04, 0xf9, 0x99, 0xad, 0x78, 0xb9, 0xfe, 0xca, 0xb8, 0x1e, ++ 0x3b, 0x9d, 0xf9, 0xa8, 0x9c, 0xc9, 0x3a, 0xa8, 0x74, 0x33, 0x1e, 0x7f, ++ 0x3f, 0x87, 0x39, 0xa9, 0x9c, 0x27, 0xf2, 0x98, 0xdf, 0xce, 0x70, 0x57, ++ 0xa4, 0x53, 0x3c, 0x4c, 0x47, 0x2f, 0x8a, 0x9f, 0x7c, 0xf1, 0x7f, 0xb2, ++ 0x10, 0x6f, 0xce, 0x8e, 0x1c, 0xb6, 0x01, 0x63, 0xed, 0xbe, 0x2f, 0x3d, ++ 0xae, 0x3d, 0xcf, 0x41, 0xe3, 0xb7, 0xef, 0xfe, 0x9f, 0x04, 0x8c, 0x83, ++ 0xb9, 0x12, 0x5f, 0xd8, 0x10, 0xef, 0x9a, 0x97, 0x1e, 0xe2, 0x3c, 0xe8, ++ 0x2f, 0x25, 0x2a, 0x9d, 0xb7, 0xb0, 0x53, 0x8f, 0x91, 0x9c, 0xa8, 0x10, ++ 0xb7, 0x30, 0xb0, 0xd1, 0xfc, 0x1c, 0xed, 0x5f, 0x8e, 0x44, 0xa2, 0x9b, ++ 0x00, 0x5f, 0xec, 0xbd, 0x59, 0xf2, 0x45, 0x3c, 0x9f, 0xcd, 0xfe, 0xcc, ++ 0xc0, 0xe3, 0x49, 0x16, 0x2b, 0xde, 0x81, 0xd0, 0xb4, 0xc9, 0x6f, 0x20, ++ 0xd2, 0xca, 0x9e, 0x9f, 0xe8, 0x55, 0xb1, 0xde, 0xc8, 0xdf, 0x67, 0x57, ++ 0x45, 0x79, 0x15, 0xa8, 0x67, 0x0f, 0x09, 0xe7, 0xef, 0xef, 0x8e, 0xf2, ++ 0xa2, 0x1f, 0x7d, 0x06, 0xf3, 0x13, 0x3d, 0xce, 0x62, 0x8c, 0xf8, 0xdd, ++ 0x6c, 0xc6, 0xf9, 0xde, 0x5c, 0xe6, 0xe2, 0xf9, 0x0e, 0xac, 0x23, 0x09, ++ 0xf5, 0xb0, 0xf9, 0xcd, 0x16, 0x1e, 0xef, 0xcf, 0xfc, 0x29, 0xc8, 0xdf, ++ 0x73, 0xba, 0xb1, 0x7f, 0x5a, 0x04, 0x9d, 0xe7, 0x26, 0x71, 0x7e, 0x9e, ++ 0x5b, 0xaa, 0xf5, 0x53, 0xac, 0x49, 0xe7, 0x7c, 0xfc, 0x64, 0x46, 0xe9, ++ 0x67, 0x48, 0x4f, 0x67, 0xd2, 0x5d, 0x6b, 0xb1, 0xcc, 0x8d, 0xf6, 0xad, ++ 0x7f, 0xb8, 0x90, 0xfc, 0xf6, 0x0c, 0xed, 0x87, 0x93, 0x43, 0x7e, 0x42, ++ 0xe7, 0x8d, 0xf2, 0xbb, 0xc8, 0x41, 0xa5, 0x0f, 0x62, 0xbb, 0x9d, 0x0a, ++ 0x8f, 0x4f, 0xf7, 0xec, 0x31, 0x53, 0x7c, 0x04, 0x7c, 0xd1, 0xab, 0x3c, ++ 0x28, 0xae, 0xff, 0xed, 0x8c, 0xb2, 0x5f, 0x61, 0xbb, 0x47, 0x11, 0xf6, ++ 0x45, 0xdd, 0xc3, 0x15, 0xbe, 0xd3, 0xe4, 0xcd, 0x06, 0xe8, 0xc9, 0xc3, ++ 0xe7, 0x8f, 0x36, 0x17, 0xf9, 0xdf, 0xe1, 0x41, 0x31, 0x8d, 0x4b, 0xf5, ++ 0xdf, 0x3f, 0x3d, 0x61, 0xf2, 0x6a, 0x2b, 0xf9, 0xf8, 0x3d, 0xa8, 0xf7, ++ 0x46, 0x0e, 0x72, 0x3f, 0x85, 0xfb, 0x9a, 0x6b, 0x62, 0xcc, 0x8a, 0xf3, ++ 0x7f, 0xc2, 0xec, 0xdd, 0x42, 0xfa, 0x69, 0x6d, 0x02, 0xfa, 0x2b, 0x17, ++ 0x3e, 0x69, 0x36, 0xa0, 0xde, 0xf0, 0x11, 0x88, 0x5b, 0xcc, 0x43, 0xf9, ++ 0x6b, 0x9d, 0x85, 0xca, 0xbf, 0x81, 0x1d, 0x8c, 0xe5, 0xa7, 0x60, 0x07, ++ 0x63, 0xf9, 0x19, 0xd8, 0xc1, 0x58, 0xfe, 0x1d, 0xec, 0x60, 0x2c, 0xe7, ++ 0x5f, 0xc8, 0x03, 0x61, 0xc1, 0xd8, 0xd8, 0x0c, 0x57, 0x33, 0xc7, 0xef, ++ 0xd0, 0xf9, 0x59, 0xbb, 0x05, 0x3c, 0x3b, 0xc7, 0xdf, 0x63, 0xa2, 0xf1, ++ 0x4f, 0x66, 0xb8, 0x09, 0xbe, 0x9d, 0xfb, 0xfd, 0x32, 0xf3, 0xe2, 0xa1, ++ 0xce, 0xce, 0xa8, 0x8e, 0xbe, 0xd1, 0x97, 0xc1, 0xb7, 0xee, 0xf9, 0x8c, ++ 0x47, 0xd8, 0x83, 0xa1, 0xe3, 0xb9, 0x9e, 0x15, 0xf3, 0xc8, 0x69, 0x34, ++ 0x92, 0x7c, 0xcf, 0x69, 0xf2, 0x47, 0x2e, 0x08, 0x6a, 0xf7, 0x76, 0xba, ++ 0x89, 0xde, 0x67, 0xef, 0xfe, 0x9c, 0xf2, 0x4f, 0xdb, 0xec, 0x9d, 0xf0, ++ 0x75, 0x29, 0xb0, 0xe4, 0x09, 0x06, 0x5e, 0x7f, 0xfb, 0xe9, 0x79, 0x93, ++ 0x57, 0x67, 0xe1, 0xfc, 0x5d, 0x9f, 0xe1, 0xba, 0x81, 0xbe, 0xff, 0x82, ++ 0x65, 0x4e, 0xd3, 0xfb, 0xbf, 0xc2, 0xfc, 0x1f, 0xe8, 0x9f, 0xe2, 0x0e, ++ 0xda, 0x95, 0x8e, 0xdf, 0x90, 0x1d, 0xa0, 0x5b, 0x87, 0x1e, 0x0e, 0x72, ++ 0x5d, 0x3b, 0xa3, 0x7c, 0xeb, 0xf1, 0xfb, 0x9d, 0xbb, 0x93, 0x70, 0x25, ++ 0xc0, 0x6f, 0x18, 0xa7, 0x1b, 0xc4, 0x23, 0x25, 0xd4, 0x7a, 0x57, 0xd1, ++ 0x7c, 0x6f, 0x37, 0x77, 0x14, 0x62, 0x5e, 0xcb, 0xed, 0x97, 0xd4, 0x90, ++ 0x71, 0xc6, 0x27, 0x33, 0x4a, 0x08, 0xce, 0x3f, 0x97, 0xf8, 0x26, 0xe1, ++ 0x24, 0xf6, 0xeb, 0x7a, 0xe9, 0xba, 0xf3, 0xfc, 0x5b, 0xe0, 0x29, 0x93, ++ 0xf7, 0x77, 0x20, 0xef, 0x74, 0xa0, 0x1c, 0xba, 0x18, 0x89, 0xfa, 0x5e, ++ 0x85, 0x38, 0xdf, 0x6f, 0x6a, 0x4c, 0x79, 0x17, 0xd7, 0xe7, 0x39, 0xa0, ++ 0xb2, 0x81, 0x0e, 0xc2, 0x5f, 0x0d, 0xdd, 0xc5, 0x66, 0xf0, 0xfd, 0x91, ++ 0x65, 0xf6, 0x1e, 0x53, 0x39, 0xee, 0xd3, 0xce, 0x3d, 0x27, 0x52, 0xe6, ++ 0x59, 0x69, 0x5f, 0x52, 0xe6, 0x43, 0x7b, 0x63, 0xc6, 0x40, 0x8d, 0xff, ++ 0x31, 0x7b, 0xc8, 0xb7, 0xff, 0xfd, 0x70, 0x2c, 0xb5, 0xb7, 0xe3, 0x50, ++ 0x77, 0xb2, 0xcd, 0x63, 0x30, 0xfe, 0x64, 0x9a, 0x65, 0xef, 0x1f, 0x71, ++ 0x49, 0x33, 0xec, 0x9f, 0x8d, 0xc1, 0xf8, 0x93, 0x59, 0xf1, 0xca, 0x7e, ++ 0x2c, 0x67, 0x3b, 0x12, 0xc7, 0x62, 0xdc, 0x89, 0x8c, 0x8f, 0x9f, 0x9b, ++ 0x5e, 0xb2, 0x1f, 0x49, 0xe9, 0x56, 0x67, 0x05, 0xe9, 0x69, 0x25, 0xc8, ++ 0x5c, 0x82, 0xe4, 0x41, 0x99, 0x25, 0x02, 0x0f, 0x05, 0x3b, 0xeb, 0x63, ++ 0xec, 0x31, 0x9a, 0xfa, 0x4d, 0xf1, 0xfd, 0x34, 0xed, 0xc7, 0x3b, 0x92, ++ 0x35, 0xef, 0x6f, 0x49, 0xcf, 0xd4, 0xbc, 0x97, 0xe3, 0xde, 0xea, 0x2c, ++ 0xd0, 0xb4, 0xcb, 0x8d, 0xee, 0x48, 0x42, 0xfb, 0x0c, 0xd6, 0x41, 0xf4, ++ 0xc0, 0xb6, 0xa9, 0x14, 0xa7, 0x97, 0xbd, 0xfb, 0xf0, 0xcd, 0x99, 0x50, ++ 0x9f, 0xb0, 0x7d, 0x8a, 0x13, 0xd5, 0x92, 0x9d, 0xe2, 0xfd, 0x84, 0x5d, ++ 0x65, 0x5e, 0xdc, 0x8f, 0x76, 0x80, 0xa7, 0x09, 0x14, 0xa8, 0x53, 0xc5, ++ 0x0f, 0xfc, 0xe6, 0x61, 0xec, 0x4c, 0xa7, 0xff, 0x57, 0xee, 0x79, 0x6a, ++ 0xbf, 0xcb, 0x71, 0x0d, 0xfa, 0x7f, 0x37, 0x7a, 0xbf, 0xe4, 0xb3, 0x4b, ++ 0x9b, 0x2d, 0x45, 0xc8, 0x67, 0xaf, 0xd6, 0x0e, 0xd0, 0xef, 0x4f, 0x7e, ++ 0x86, 0xd6, 0x2e, 0xe8, 0x0e, 0x6f, 0x3a, 0xe9, 0x42, 0x71, 0x70, 0xbc, ++ 0x39, 0xa8, 0xb2, 0x6d, 0x21, 0xf0, 0x06, 0x23, 0x52, 0x39, 0x1e, 0xf2, ++ 0x72, 0xc2, 0x21, 0x9e, 0x3f, 0x76, 0xad, 0xfc, 0xec, 0x0b, 0xe4, 0x67, ++ 0x31, 0x01, 0xfa, 0xe8, 0x2c, 0x75, 0x7e, 0xb9, 0x5c, 0x93, 0xf3, 0xdd, ++ 0xe5, 0xe8, 0xa7, 0xff, 0xb3, 0xca, 0x28, 0x1f, 0x4f, 0xe4, 0xf5, 0x2d, ++ 0xc0, 0xdf, 0xd5, 0x00, 0xbe, 0xb3, 0x79, 0x9b, 0xef, 0xef, 0x13, 0x4b, ++ 0xcf, 0x3d, 0xa8, 0xe7, 0x62, 0x7e, 0xa9, 0x0b, 0xfa, 0x5f, 0x92, 0x21, ++ 0xf4, 0xa7, 0xca, 0xbd, 0xf7, 0xf7, 0x29, 0x0c, 0xbc, 0x67, 0x2b, 0x3e, ++ 0xd3, 0xb4, 0x67, 0xf7, 0x2a, 0x6b, 0x34, 0xf5, 0xd5, 0x89, 0xda, 0xfa, ++ 0x83, 0x25, 0x6b, 0x82, 0xbf, 0xef, 0x8e, 0x2f, 0x2e, 0xd8, 0x34, 0xdb, ++ 0xe4, 0xa6, 0xfc, 0x4f, 0xc5, 0xe5, 0x0d, 0xc1, 0x1f, 0xe4, 0x7c, 0xc6, ++ 0xbc, 0x11, 0x4e, 0x71, 0x7d, 0xb7, 0x61, 0xbc, 0x0a, 0x3c, 0xaa, 0x2e, ++ 0x7c, 0xcf, 0x88, 0xe7, 0xb0, 0xb7, 0x75, 0x23, 0x47, 0x25, 0xff, 0xb9, ++ 0x53, 0x65, 0xb5, 0xa1, 0xde, 0xdf, 0x93, 0xc1, 0xfd, 0xfc, 0xb7, 0xbe, ++ 0x11, 0x4e, 0x71, 0x30, 0xd7, 0xda, 0xef, 0x47, 0x00, 0x4b, 0x8a, 0x33, ++ 0x7c, 0x89, 0xcb, 0xd1, 0x8f, 0x7a, 0xfa, 0x8c, 0xc1, 0xfb, 0xee, 0x11, ++ 0xfd, 0x9f, 0x2d, 0xda, 0xf8, 0xf3, 0x6f, 0xf0, 0x7c, 0xf4, 0x65, 0x46, ++ 0x71, 0x9f, 0x67, 0xa3, 0x38, 0xff, 0xcf, 0x69, 0x3c, 0x69, 0x30, 0xa0, ++ 0x1c, 0xec, 0xc1, 0xf1, 0x25, 0xc7, 0xee, 0x37, 0xa0, 0x5c, 0x69, 0x5f, ++ 0x14, 0xe1, 0xc1, 0xb8, 0xfe, 0x9a, 0xc5, 0x36, 0x8a, 0x07, 0xcd, 0x4d, ++ 0xea, 0xf8, 0xc0, 0x02, 0x5b, 0xbf, 0xee, 0x99, 0x03, 0x8f, 0x58, 0x00, ++ 0xdf, 0x3e, 0xc6, 0x24, 0xc8, 0x20, 0xb9, 0xda, 0x8e, 0x46, 0x11, 0xd4, ++ 0x37, 0x66, 0x1c, 0x20, 0xb9, 0x7a, 0xcb, 0x1b, 0xe1, 0x2d, 0x86, 0xeb, ++ 0x58, 0xcf, 0x46, 0x3c, 0x97, 0x40, 0x39, 0x58, 0xca, 0xe9, 0x7c, 0x26, ++ 0xe2, 0x8d, 0x90, 0x2f, 0xe8, 0x63, 0xaf, 0xb9, 0x9f, 0x75, 0xca, 0x1b, ++ 0xe4, 0x0b, 0xb8, 0x7e, 0xac, 0x1f, 0x78, 0xe6, 0x4f, 0x87, 0x1f, 0x81, ++ 0x79, 0xd7, 0x1c, 0xe4, 0x74, 0x8e, 0x11, 0x76, 0x7a, 0xfb, 0x7e, 0x5a, ++ 0x90, 0x7d, 0xcf, 0x1e, 0xe7, 0x74, 0x69, 0x81, 0x1f, 0x1e, 0xa7, 0xa4, ++ 0xa3, 0xef, 0x7d, 0x1b, 0x4c, 0xd6, 0xcb, 0xd2, 0x79, 0x03, 0xc5, 0xdd, ++ 0x5c, 0x2d, 0x7d, 0xef, 0x40, 0x7a, 0x8e, 0xb8, 0x2c, 0x3d, 0x1f, 0xba, ++ 0x05, 0xf6, 0xa7, 0xe6, 0x65, 0x7e, 0x9f, 0xc5, 0xb9, 0xe6, 0x81, 0x94, ++ 0x17, 0xdb, 0x9d, 0x3c, 0xaf, 0xd9, 0xa4, 0x12, 0x1d, 0xca, 0x7a, 0x5b, ++ 0xb3, 0x3a, 0x0e, 0xf1, 0x56, 0x9f, 0x7f, 0x2e, 0xe1, 0xca, 0x5c, 0x4e, ++ 0xa2, 0x4f, 0x79, 0x6f, 0xd4, 0xb2, 0x11, 0xff, 0x9c, 0x88, 0x72, 0x73, ++ 0xd9, 0x1e, 0x23, 0x0f, 0x12, 0xe9, 0x6e, 0x9c, 0x75, 0x2a, 0x73, 0x04, ++ 0x8d, 0xb3, 0xf3, 0x35, 0xf3, 0x22, 0xca, 0x73, 0x13, 0xf3, 0x6f, 0x97, ++ 0xf2, 0x7a, 0xcf, 0x3f, 0xa2, 0x4b, 0xb2, 0x78, 0xb9, 0x2a, 0x84, 0xdc, ++ 0x03, 0x39, 0x1d, 0x16, 0x8b, 0x72, 0xba, 0x42, 0x21, 0xbb, 0xf2, 0xc8, ++ 0x9e, 0xde, 0xa5, 0x08, 0xa7, 0x23, 0x0a, 0x6b, 0x71, 0x50, 0xde, 0x16, ++ 0x8f, 0x53, 0x9e, 0xc4, 0xbb, 0xc3, 0xe7, 0x56, 0xba, 0xaf, 0x24, 0x3e, ++ 0x9d, 0xe2, 0x93, 0xa5, 0x7d, 0x29, 0xed, 0xca, 0x29, 0x7b, 0xa6, 0x0c, ++ 0x44, 0xbd, 0xf2, 0x83, 0xc6, 0x39, 0x47, 0x60, 0xe7, 0xd8, 0xa7, 0x19, ++ 0xc9, 0x84, 0xe7, 0x77, 0x30, 0x0f, 0xe9, 0xc1, 0x47, 0xa2, 0xca, 0x07, ++ 0xa0, 0x5f, 0x62, 0x82, 0x88, 0x0f, 0x38, 0x12, 0xd5, 0xd1, 0x8a, 0x7c, ++ 0xf9, 0xc8, 0x88, 0x08, 0x05, 0xcf, 0xfb, 0xa1, 0xff, 0xd5, 0xd8, 0xbf, ++ 0x5c, 0xd7, 0x91, 0xb0, 0xf2, 0x01, 0xfc, 0xde, 0x09, 0x19, 0x97, 0x3c, ++ 0xe8, 0xba, 0xee, 0x89, 0x1b, 0xa3, 0xde, 0x5b, 0x72, 0x0b, 0x9e, 0x6f, ++ 0x4f, 0x67, 0x76, 0xb4, 0x2b, 0x6f, 0x57, 0xb9, 0x9e, 0xcb, 0x5e, 0xe7, ++ 0xf4, 0x29, 0xf9, 0x5e, 0x8d, 0xe2, 0x8b, 0xc6, 0x79, 0xbe, 0x9d, 0x31, ++ 0xf1, 0xab, 0x0c, 0x3c, 0x2f, 0x5e, 0xf9, 0x0b, 0xe1, 0x57, 0x15, 0x70, ++ 0x33, 0xf2, 0x38, 0xc4, 0xab, 0xd5, 0x73, 0x3b, 0xed, 0xd9, 0xa7, 0x15, ++ 0x7e, 0x1f, 0x8a, 0x93, 0xeb, 0xff, 0xd5, 0xc3, 0xcf, 0xfc, 0xfa, 0x0e, ++ 0xcc, 0x93, 0x03, 0xbb, 0x5b, 0x81, 0xf9, 0xcc, 0x69, 0xda, 0x4b, 0xf7, ++ 0xfe, 0xe8, 0xed, 0xec, 0x4e, 0x7b, 0xe7, 0xff, 0xd1, 0x9f, 0xda, 0xd5, ++ 0x5e, 0x2a, 0x8f, 0x18, 0x54, 0x14, 0xf0, 0x93, 0xeb, 0xed, 0xa6, 0x4e, ++ 0x3d, 0x5d, 0xea, 0x7b, 0xdb, 0x78, 0x9c, 0xfc, 0x9b, 0x23, 0x7e, 0xdb, ++ 0xb6, 0x14, 0xea, 0x2b, 0xb6, 0x45, 0x10, 0x1c, 0x4f, 0x3f, 0x69, 0xf6, ++ 0x20, 0x1f, 0x3f, 0xbd, 0xc5, 0x4c, 0xf6, 0xcf, 0xe9, 0xe8, 0x8e, 0x63, ++ 0xcb, 0xb1, 0xbe, 0x2b, 0xdb, 0xe9, 0xa1, 0xd1, 0x9c, 0x9a, 0x7b, 0xd1, ++ 0x16, 0x1a, 0x1c, 0x1f, 0xa2, 0xfc, 0x61, 0x6f, 0x87, 0xd1, 0x7d, 0x1e, ++ 0x27, 0x9f, 0x30, 0xb7, 0xe0, 0xf9, 0xee, 0xe2, 0xa7, 0x32, 0xb6, 0xa0, ++ 0x3d, 0x75, 0x72, 0x80, 0xe3, 0xd9, 0x1d, 0xe8, 0x0f, 0x7c, 0x36, 0x8e, ++ 0xee, 0x19, 0x60, 0x6e, 0xfe, 0xfd, 0x6d, 0x82, 0x1e, 0x91, 0xbe, 0x1c, ++ 0xa0, 0x7a, 0xa8, 0xbf, 0xb3, 0x91, 0x1e, 0xb1, 0xf8, 0x85, 0x3e, 0xc4, ++ 0xc7, 0xe4, 0xfe, 0x9d, 0x7a, 0x22, 0x9c, 0xf2, 0xe8, 0x4f, 0x1f, 0x98, ++ 0xd4, 0x13, 0xfd, 0x65, 0xad, 0x86, 0xe7, 0x29, 0x8f, 0x87, 0xa9, 0x56, ++ 0x0f, 0xf2, 0xe3, 0xa5, 0x5b, 0xc2, 0x49, 0x0f, 0x5c, 0x69, 0x77, 0x67, ++ 0xe3, 0xfa, 0xcb, 0x7e, 0x77, 0xdb, 0x1d, 0x05, 0x38, 0xfe, 0xfb, 0x71, ++ 0x0c, 0xd7, 0xd3, 0xde, 0xfc, 0x02, 0xf9, 0x2b, 0x03, 0xfb, 0x1b, 0x5a, ++ 0xbe, 0x9f, 0x6b, 0x4e, 0xe6, 0x7c, 0xa0, 0x53, 0xde, 0xf2, 0xb8, 0xdb, ++ 0x59, 0x18, 0x77, 0x9b, 0x4c, 0x71, 0xb7, 0x05, 0x83, 0xe2, 0x30, 0x5e, ++ 0x55, 0xde, 0xbb, 0xc8, 0xe3, 0x6e, 0xf3, 0x55, 0xc5, 0x45, 0x79, 0x07, ++ 0x0f, 0x85, 0xce, 0x23, 0x1f, 0x3d, 0x48, 0x9c, 0xab, 0x4a, 0xff, 0x49, ++ 0x0c, 0xb3, 0xc4, 0x23, 0x1d, 0xba, 0x19, 0xad, 0xb7, 0xfd, 0xa1, 0xb4, ++ 0x2d, 0x68, 0xef, 0x4c, 0x1f, 0x24, 0xf2, 0x9f, 0x59, 0x87, 0xc8, 0x97, ++ 0x94, 0xf8, 0x76, 0xac, 0xfa, 0x55, 0xf2, 0x9f, 0x98, 0x79, 0xbc, 0x5f, ++ 0x78, 0xe8, 0x73, 0xec, 0xf2, 0x41, 0x3c, 0xaf, 0x78, 0x81, 0xe5, 0x6b, ++ 0x8d, 0xff, 0xa6, 0x7a, 0xe5, 0xb7, 0x1a, 0xbf, 0x4a, 0x75, 0x16, 0x23, ++ 0xb9, 0x9b, 0x5f, 0xef, 0x28, 0xb8, 0x1b, 0xca, 0xe5, 0x02, 0xce, 0x55, ++ 0x49, 0xe5, 0x93, 0x10, 0x7e, 0x4b, 0x1a, 0x36, 0xbe, 0xf8, 0x0e, 0xc1, ++ 0xe5, 0xf1, 0x1f, 0x7f, 0x8c, 0xe3, 0x1e, 0xb0, 0x92, 0xdf, 0x86, 0xbd, ++ 0xc3, 0xe1, 0xa7, 0xb7, 0x67, 0x16, 0x58, 0xbe, 0x12, 0xf4, 0xb4, 0x59, ++ 0xa3, 0x07, 0x9f, 0x78, 0xf4, 0x43, 0x8a, 0x37, 0x39, 0xb1, 0x3b, 0x33, ++ 0x07, 0xf7, 0x6d, 0x8e, 0xea, 0x3b, 0x81, 0xf7, 0x71, 0xb5, 0xd9, 0x7c, ++ 0x9f, 0xfc, 0x0c, 0xca, 0x5d, 0x07, 0x0e, 0xd1, 0xbe, 0xe8, 0xe7, 0xdb, ++ 0xe5, 0xdc, 0x5e, 0xe1, 0x7c, 0xa5, 0x12, 0xd7, 0x11, 0x83, 0xf1, 0x2e, ++ 0xe5, 0x8b, 0x07, 0xd1, 0xb9, 0x30, 0xa7, 0xf7, 0xe3, 0xeb, 0xb3, 0x09, ++ 0x7e, 0xd2, 0x9f, 0xdb, 0x7e, 0x3a, 0xb4, 0xbd, 0x25, 0xe7, 0x29, 0xfb, ++ 0x97, 0xf3, 0x93, 0xfd, 0xcb, 0x76, 0xff, 0x25, 0xf6, 0xeb, 0xac, 0xc9, ++ 0x97, 0x83, 0xf2, 0xb9, 0x7f, 0xba, 0x43, 0x93, 0x87, 0x7d, 0x36, 0xd2, ++ 0x97, 0x13, 0x65, 0xc5, 0xe7, 0xfc, 0x1c, 0xea, 0x6c, 0x34, 0xd4, 0x83, ++ 0xf0, 0xe6, 0xfb, 0x3a, 0xdf, 0xb9, 0x4b, 0xf8, 0x79, 0x8e, 0x1a, 0x56, ++ 0xdd, 0x63, 0x02, 0xfc, 0x6b, 0x6d, 0x78, 0x38, 0xcc, 0x1d, 0xcc, 0x47, ++ 0xaf, 0xf1, 0x5c, 0x47, 0xce, 0x57, 0xc6, 0x95, 0xca, 0x3c, 0xda, 0x4d, ++ 0x83, 0x84, 0x3f, 0x7b, 0x00, 0x1b, 0xd0, 0x4d, 0xfe, 0xed, 0xe3, 0x88, ++ 0x27, 0x95, 0x5d, 0xf3, 0x6f, 0xe9, 0x79, 0x77, 0xf9, 0xb7, 0x9d, 0xf9, ++ 0xb6, 0xff, 0xe0, 0xf9, 0xb6, 0x32, 0xbf, 0xb6, 0xb0, 0xcc, 0x50, 0x1b, ++ 0x9c, 0x67, 0x2b, 0xf9, 0x61, 0x61, 0x26, 0x3c, 0xcf, 0xc2, 0x73, 0x7f, ++ 0xad, 0x7c, 0x2f, 0xcc, 0xd5, 0xb6, 0xef, 0x8e, 0x3f, 0x0e, 0xce, 0xe4, ++ 0x7e, 0x95, 0xc2, 0x98, 0xd0, 0xf9, 0xae, 0x7f, 0x1e, 0xc4, 0xdf, 0xd7, ++ 0xb3, 0x16, 0x7e, 0xff, 0xa0, 0x90, 0x8b, 0xc3, 0x04, 0xdc, 0xe5, 0xbd, ++ 0x5f, 0x52, 0x4f, 0xa9, 0x16, 0x7c, 0x5b, 0xe6, 0x79, 0x0e, 0x6b, 0xe6, ++ 0x71, 0x9b, 0xc3, 0x44, 0xde, 0x0e, 0x70, 0x01, 0xca, 0x73, 0xed, 0x72, ++ 0xbf, 0x5b, 0x7c, 0x26, 0xc9, 0x55, 0x79, 0x3f, 0x9f, 0x02, 0x7d, 0x4d, ++ 0x8f, 0x0e, 0x95, 0x2f, 0xec, 0xa3, 0x79, 0x8c, 0x64, 0x1d, 0x54, 0xba, ++ 0x98, 0xdd, 0x88, 0x25, 0x80, 0x9f, 0xca, 0xd1, 0xac, 0x9c, 0xca, 0xb1, ++ 0xac, 0x96, 0xca, 0x71, 0x6c, 0x03, 0x95, 0x37, 0xb3, 0x06, 0x2a, 0x6f, ++ 0x65, 0x3e, 0x2a, 0xd9, 0xa0, 0x16, 0x11, 0xef, 0x79, 0x2f, 0xcf, 0x33, ++ 0x1d, 0xbf, 0xd0, 0x80, 0xf2, 0xb5, 0xf0, 0x8e, 0xd0, 0x7a, 0x71, 0xfb, ++ 0x15, 0xe1, 0xe0, 0xa1, 0xfb, 0x03, 0xaf, 0x15, 0x0e, 0x63, 0x19, 0xbf, ++ 0xe7, 0xaf, 0x0b, 0x3c, 0xfa, 0xa7, 0x13, 0x7e, 0xeb, 0xe1, 0xa1, 0xcf, ++ 0xd7, 0x1c, 0xc1, 0xfc, 0x74, 0x71, 0xc9, 0x28, 0x44, 0xdc, 0x64, 0xb4, ++ 0x83, 0x1d, 0x14, 0xdf, 0x5a, 0xc6, 0x5c, 0x54, 0x1f, 0x73, 0x95, 0x70, ++ 0x28, 0xf6, 0xbb, 0x8d, 0x3c, 0xbf, 0x57, 0x07, 0x8f, 0xb2, 0xd0, 0x78, ++ 0x71, 0x41, 0xc0, 0x63, 0x15, 0xca, 0xce, 0xa2, 0xc0, 0x3e, 0x65, 0x67, ++ 0x3a, 0xe8, 0xb9, 0xdc, 0x2f, 0x30, 0xc4, 0xe2, 0x91, 0xff, 0xeb, 0xf7, ++ 0x51, 0x3e, 0x2f, 0x8c, 0x28, 0x3d, 0xef, 0xb0, 0xe3, 0x7d, 0x30, 0xab, ++ 0xa6, 0x50, 0x1e, 0x77, 0x41, 0xe9, 0xf2, 0x64, 0xa8, 0xa7, 0x66, 0xfe, ++ 0x6a, 0x0a, 0xe5, 0x79, 0x0f, 0x2b, 0x7d, 0x01, 0xf3, 0xbc, 0xd3, 0x9f, ++ 0x7d, 0x98, 0xbf, 0xcf, 0x2d, 0x2d, 0x08, 0x73, 0xc2, 0xb8, 0xab, 0x1e, ++ 0x99, 0x82, 0xf9, 0x8c, 0x6e, 0x11, 0x37, 0xed, 0x16, 0xf1, 0xd2, 0xcc, ++ 0x9d, 0xa7, 0xb9, 0x1f, 0xcb, 0xbd, 0xea, 0x1e, 0xba, 0x6f, 0xcc, 0x3d, ++ 0xc0, 0xea, 0xc4, 0x75, 0xca, 0xbc, 0x70, 0x35, 0x99, 0x9f, 0xaf, 0xee, ++ 0xb1, 0xbb, 0x7b, 0x66, 0xc2, 0x7c, 0x13, 0xc6, 0xf9, 0xd6, 0x70, 0x48, ++ 0x97, 0xf6, 0x9e, 0x0a, 0x74, 0xdc, 0xea, 0x0b, 0x63, 0x18, 0xef, 0xbf, ++ 0xd6, 0xc4, 0xdb, 0xcb, 0xfb, 0x6c, 0xe4, 0xfa, 0xe4, 0x3d, 0x37, 0xbb, ++ 0x76, 0x65, 0x2e, 0x57, 0x92, 0xae, 0x3c, 0x0f, 0x18, 0x67, 0x00, 0x8e, ++ 0xe3, 0x5e, 0x35, 0x90, 0xf2, 0xe3, 0xdc, 0xbb, 0x15, 0xe7, 0xe5, 0xc6, ++ 0x0b, 0x4f, 0x72, 0x27, 0x65, 0xa2, 0xde, 0x85, 0x49, 0xf1, 0x40, 0x17, ++ 0xfd, 0x84, 0x1c, 0x6e, 0xdd, 0x95, 0x99, 0x89, 0xfb, 0x94, 0x9d, 0x29, ++ 0xe2, 0x7e, 0x62, 0x13, 0x0b, 0x10, 0x8e, 0xd3, 0x92, 0xca, 0xb3, 0xb1, ++ 0x7f, 0x99, 0x17, 0x9d, 0x2d, 0xf6, 0xa5, 0xbb, 0x72, 0x4a, 0xa6, 0x2b, ++ 0x13, 0xdb, 0xeb, 0x9f, 0xcb, 0xbc, 0xec, 0x91, 0x99, 0xee, 0x3c, 0x1c, ++ 0xbf, 0x26, 0xe2, 0x22, 0xe5, 0x9b, 0xb5, 0xe5, 0xbd, 0xbf, 0xc6, 0x9f, ++ 0xd8, 0x35, 0x4f, 0xbd, 0xde, 0xc5, 0xbc, 0x26, 0xe2, 0x2b, 0xda, 0xfc, ++ 0xf4, 0xf6, 0xf9, 0x26, 0xba, 0xcf, 0xa9, 0xb0, 0xdc, 0x5d, 0x8f, 0x21, ++ 0xca, 0x37, 0x4e, 0xef, 0x18, 0x8c, 0xfa, 0x31, 0xf4, 0x3b, 0x1c, 0xc7, ++ 0xad, 0x31, 0xf9, 0x13, 0xf2, 0x54, 0x8c, 0x42, 0xe6, 0xf9, 0xef, 0xfa, ++ 0x7c, 0xef, 0x3d, 0xaf, 0x1d, 0xd4, 0xe4, 0xb7, 0x4b, 0x3a, 0xeb, 0xcc, ++ 0x6f, 0x3f, 0xc7, 0xf3, 0xdb, 0x03, 0xf4, 0xf5, 0xe8, 0x72, 0x16, 0x94, ++ 0xdf, 0x2e, 0xe9, 0x46, 0xd2, 0xdd, 0x50, 0xcc, 0x6f, 0x8f, 0xc4, 0x7a, ++ 0xc6, 0x7c, 0x6c, 0x37, 0xe2, 0xfd, 0x63, 0x94, 0xdf, 0x3e, 0xea, 0x98, ++ 0x5f, 0xe4, 0xb7, 0x7f, 0xa8, 0xcd, 0x6f, 0x77, 0xfd, 0xf3, 0xba, 0xf2, ++ 0xdb, 0x4f, 0x8a, 0xfb, 0xde, 0x4e, 0x5a, 0xf8, 0x7d, 0x49, 0xf2, 0x3e, ++ 0xa9, 0x65, 0xbb, 0xf9, 0xf9, 0xef, 0x32, 0x85, 0xdf, 0x27, 0xb5, 0xec, ++ 0x39, 0x7e, 0x9f, 0x94, 0xb4, 0x0b, 0x17, 0x89, 0xf5, 0x55, 0x1d, 0xdc, ++ 0xb6, 0x06, 0xcf, 0xf9, 0x16, 0x3d, 0x3e, 0x97, 0xee, 0xa3, 0x62, 0xe2, ++ 0x1e, 0x54, 0x07, 0xfc, 0x04, 0xdb, 0x85, 0xf2, 0x5e, 0x52, 0x7d, 0x1e, ++ 0x4c, 0x0d, 0xda, 0x83, 0xa4, 0x37, 0xb7, 0x90, 0xde, 0xa5, 0xcf, 0x87, ++ 0xa9, 0x79, 0xbc, 0x8c, 0xec, 0xc1, 0x1a, 0x9d, 0x1e, 0x5d, 0x9d, 0x29, ++ 0xec, 0x41, 0x21, 0xcf, 0x98, 0xd0, 0xff, 0x16, 0x8a, 0x6f, 0x71, 0x1d, ++ 0x56, 0xb2, 0xcf, 0x4c, 0xa4, 0x77, 0x2e, 0x7b, 0x62, 0xb9, 0xd3, 0x8e, ++ 0x75, 0x41, 0x57, 0x6c, 0xc7, 0x0e, 0x3a, 0x77, 0x93, 0xed, 0xd9, 0xe3, ++ 0x31, 0x84, 0x0b, 0x92, 0xce, 0x16, 0xaf, 0x53, 0x48, 0x7f, 0x95, 0xf0, ++ 0xcb, 0xdd, 0x6e, 0x76, 0xd1, 0x3d, 0xc6, 0xdb, 0x7b, 0x93, 0xde, 0x0a, ++ 0xfa, 0xb6, 0xc8, 0x63, 0xf6, 0x72, 0x7b, 0x1b, 0x70, 0x05, 0xe3, 0xe1, ++ 0x77, 0x46, 0x75, 0x24, 0xa1, 0x9e, 0xbc, 0x73, 0x4f, 0xba, 0x13, 0x38, ++ 0x2c, 0x7b, 0xa5, 0xdb, 0xfb, 0xa7, 0x77, 0xe8, 0xee, 0x9f, 0x7e, 0x4a, ++ 0x73, 0xff, 0xf4, 0x39, 0xfc, 0x0f, 0xf5, 0xb4, 0x53, 0x06, 0x2f, 0xf6, ++ 0x33, 0x98, 0xa5, 0xff, 0x12, 0xef, 0x25, 0x2e, 0x3a, 0x65, 0x74, 0x7a, ++ 0x1d, 0x81, 0xfb, 0x98, 0xaf, 0x74, 0xef, 0xb0, 0x84, 0xbf, 0x59, 0xec, ++ 0xd7, 0xb5, 0xde, 0x43, 0xac, 0xbf, 0xef, 0x59, 0xe6, 0x3f, 0xe8, 0xef, ++ 0x23, 0x5e, 0x2b, 0xee, 0x23, 0x1e, 0xd1, 0xcd, 0x7d, 0xc4, 0x66, 0xb5, ++ 0x59, 0x25, 0xfd, 0xe1, 0x6b, 0xa3, 0xe6, 0x5e, 0xe2, 0x1b, 0xc5, 0x3a, ++ 0x8b, 0x1d, 0xcc, 0x8b, 0xf7, 0xfc, 0x0e, 0x6d, 0x35, 0x6a, 0xf6, 0xbf, ++ 0xd8, 0xbf, 0x81, 0xa1, 0x3e, 0x14, 0x7e, 0xd8, 0xa8, 0xf1, 0x23, 0x98, ++ 0x1d, 0xda, 0x7a, 0x83, 0xc4, 0x07, 0x71, 0xbf, 0x48, 0x57, 0x78, 0x5b, ++ 0x3b, 0xe1, 0x69, 0x26, 0x78, 0xa6, 0xd0, 0x3d, 0xcf, 0x45, 0xba, 0x7b, ++ 0x9e, 0x25, 0x9c, 0x3a, 0xef, 0x79, 0xee, 0x6f, 0x25, 0xbc, 0x1f, 0x7a, ++ 0xf0, 0x05, 0x15, 0xf9, 0xc1, 0xb5, 0xde, 0xf7, 0xfd, 0x43, 0xdf, 0xef, ++ 0x7d, 0xa5, 0xfb, 0xbc, 0xf5, 0xf7, 0x74, 0xeb, 0xef, 0xe5, 0xee, 0xee, ++ 0x9e, 0x6f, 0xb9, 0xef, 0x79, 0x2d, 0xcb, 0x34, 0xed, 0xf5, 0xfb, 0x5e, ++ 0x70, 0xe0, 0xa7, 0xda, 0x7b, 0xa8, 0xc5, 0x7e, 0x7b, 0xe0, 0xe7, 0xbb, ++ 0xdc, 0xef, 0xb6, 0x4c, 0xe1, 0xdf, 0x15, 0xfb, 0xfd, 0x35, 0x5e, 0x80, ++ 0x06, 0x74, 0xf8, 0x97, 0xc8, 0x53, 0x0f, 0x22, 0x59, 0x4e, 0x88, 0xe0, ++ 0x7c, 0xad, 0xd3, 0xae, 0x1f, 0x1e, 0x46, 0x76, 0xd6, 0xbb, 0x8e, 0x98, ++ 0x32, 0x1b, 0xd2, 0xbf, 0x90, 0x53, 0xe5, 0x42, 0x4e, 0x81, 0x15, 0xc7, ++ 0xeb, 0x02, 0x5f, 0x9c, 0x3e, 0x1e, 0x47, 0x90, 0x7f, 0x94, 0xdf, 0x5f, ++ 0x51, 0xe8, 0xe7, 0xf1, 0x04, 0x83, 0x4f, 0x85, 0xce, 0x0f, 0xba, 0xbd, ++ 0x58, 0xd1, 0x9c, 0xef, 0x76, 0xbd, 0xb7, 0x98, 0xe7, 0x19, 0x0f, 0xbb, ++ 0xc8, 0xe3, 0xf4, 0xf4, 0xe7, 0xfe, 0x32, 0x6f, 0xa8, 0xc2, 0x15, 0xae, ++ 0xbd, 0xbf, 0xa1, 0x9b, 0x3c, 0x22, 0xe9, 0xc7, 0x01, 0x3d, 0x9e, 0x99, ++ 0x50, 0x8f, 0x37, 0xf0, 0xfb, 0xec, 0x42, 0xdc, 0x73, 0xbc, 0x49, 0x4d, ++ 0x0e, 0xce, 0x23, 0x72, 0x93, 0x7f, 0x67, 0xb2, 0xc5, 0x97, 0x80, 0xf8, ++ 0x6c, 0x4b, 0x74, 0xc7, 0x67, 0x15, 0x05, 0xf2, 0x8d, 0x46, 0x61, 0x5e, ++ 0x91, 0x42, 0xf6, 0xa0, 0x10, 0x4a, 0x51, 0x3f, 0xc2, 0x38, 0xcf, 0x76, ++ 0x4c, 0xb2, 0xed, 0x8b, 0xf9, 0xa3, 0x91, 0x3f, 0xc2, 0x3c, 0x19, 0x98, ++ 0xbe, 0xdd, 0x3f, 0x98, 0x9b, 0xbb, 0xf8, 0x6f, 0x60, 0x96, 0x3b, 0x31, ++ 0x0b, 0xe4, 0xc9, 0x71, 0xc5, 0xbe, 0xa6, 0x00, 0xbe, 0xfd, 0xcb, 0xd0, ++ 0x33, 0x09, 0x28, 0x9f, 0xcc, 0x78, 0xae, 0x9d, 0x4f, 0xe7, 0xbe, 0xc9, ++ 0xf8, 0x5e, 0x7f, 0x3f, 0xbf, 0xdf, 0xe0, 0x20, 0xfd, 0xc2, 0xf3, 0x53, ++ 0x85, 0xec, 0x87, 0x33, 0xd8, 0xd9, 0x90, 0x20, 0x7a, 0x5d, 0x17, 0x26, ++ 0xf2, 0x1a, 0x75, 0x7f, 0xbf, 0x40, 0xd8, 0x53, 0xf2, 0xef, 0x17, 0x1c, ++ 0x87, 0x2e, 0x16, 0x01, 0xdf, 0x9e, 0xd1, 0xc4, 0xf3, 0xa8, 0x97, 0xc6, ++ 0xb7, 0x0a, 0x3b, 0x8c, 0xdf, 0xdf, 0x3a, 0xb7, 0xbf, 0x95, 0xee, 0x7f, ++ 0x62, 0xae, 0x02, 0x27, 0xb7, 0xc3, 0xa5, 0x7d, 0xd5, 0x4f, 0xbd, 0x16, ++ 0xb9, 0x79, 0xa5, 0xf8, 0xa2, 0xa5, 0xf1, 0xa7, 0x35, 0x76, 0x2e, 0xdb, ++ 0x11, 0x73, 0x55, 0xe7, 0x89, 0x81, 0x75, 0xf3, 0xfe, 0x8f, 0x3f, 0x10, ++ 0x41, 0xf2, 0xe6, 0xf8, 0x03, 0x03, 0xc8, 0xcf, 0x17, 0xe8, 0xbf, 0x8d, ++ 0xec, 0xfe, 0x19, 0xb5, 0xda, 0x38, 0xe3, 0x59, 0x2b, 0x3f, 0xd2, 0xe0, ++ 0xdf, 0x6c, 0xcf, 0x67, 0x9a, 0xf7, 0xfe, 0xd8, 0x8e, 0xb0, 0x7e, 0xb0, ++ 0x7e, 0xff, 0x8b, 0x7d, 0xc6, 0x4e, 0x03, 0xf8, 0x9d, 0xdd, 0x6d, 0x1e, ++ 0x8c, 0x74, 0x06, 0xfb, 0x36, 0x35, 0x2b, 0xc8, 0x0e, 0xf6, 0x3f, 0x94, ++ 0x36, 0x9a, 0xeb, 0x01, 0x57, 0x5a, 0xe7, 0x19, 0x9a, 0xc7, 0x31, 0x11, ++ 0x27, 0x2a, 0xd7, 0xf9, 0x49, 0xdd, 0x51, 0xaa, 0xfb, 0xeb, 0xfc, 0xba, ++ 0x78, 0x1e, 0x8f, 0xc6, 0x2e, 0x95, 0xa5, 0xe9, 0x0d, 0x46, 0xf7, 0xe4, ++ 0x74, 0x28, 0x3d, 0x9c, 0xa1, 0xfc, 0x2c, 0x9f, 0x66, 0x71, 0xbd, 0xfd, ++ 0x98, 0xc8, 0x83, 0x3c, 0x26, 0xf2, 0x20, 0x8f, 0x89, 0xbc, 0xc5, 0x63, ++ 0x22, 0x4f, 0xf1, 0x98, 0xc8, 0x53, 0x94, 0xf9, 0xa3, 0xc7, 0x14, 0xe6, ++ 0xc2, 0x78, 0x8a, 0xe9, 0x4a, 0xf9, 0x93, 0xb3, 0x15, 0xca, 0x1f, 0xbd, ++ 0x07, 0xf1, 0xaf, 0x66, 0x49, 0x47, 0x0e, 0xe6, 0xdb, 0xd5, 0xe4, 0xfa, ++ 0x67, 0x2a, 0x2a, 0xe5, 0x8f, 0xae, 0xc4, 0xf5, 0x87, 0xc8, 0x1f, 0xcd, ++ 0xc1, 0xbc, 0xf7, 0x5d, 0x59, 0x77, 0xfe, 0x08, 0xf5, 0xf8, 0x53, 0x3d, ++ 0x3c, 0x74, 0x2f, 0xc9, 0xef, 0x77, 0x4c, 0xe6, 0x75, 0x13, 0xa7, 0x8f, ++ 0x57, 0xb2, 0x46, 0x11, 0x3d, 0x78, 0xfb, 0xba, 0xef, 0xc3, 0x7e, 0xbe, ++ 0x50, 0xd4, 0x16, 0xc2, 0xe7, 0x97, 0x15, 0x3a, 0x4f, 0x65, 0x2e, 0xbf, ++ 0x69, 0xe2, 0x65, 0xf2, 0x4b, 0x1f, 0xc8, 0xe2, 0xe7, 0x0b, 0xeb, 0x75, ++ 0xe5, 0xd6, 0x2c, 0xce, 0xcf, 0x5e, 0x11, 0xe5, 0x18, 0xf5, 0xc1, 0x54, ++ 0xca, 0xfb, 0xd9, 0x64, 0xa6, 0xbc, 0x1f, 0x18, 0xc7, 0x65, 0x08, 0x3a, ++ 0xff, 0xd7, 0xe7, 0x67, 0xe5, 0xbf, 0x6e, 0x6e, 0x41, 0xbe, 0x21, 0xfd, ++ 0x30, 0x4f, 0x64, 0x25, 0xf2, 0x73, 0xcf, 0x64, 0xee, 0x5f, 0x89, 0xfd, ++ 0xa5, 0x99, 0xe7, 0x6d, 0xf9, 0x7d, 0x09, 0x98, 0xe7, 0x85, 0xf1, 0x3e, ++ 0x78, 0x6f, 0x06, 0x3b, 0xcc, 0x5c, 0x3c, 0x0f, 0x8c, 0xdf, 0xdf, 0x27, ++ 0xf7, 0xe1, 0x09, 0xb1, 0x0f, 0x74, 0x91, 0x7e, 0x61, 0x20, 0x4f, 0xac, ++ 0xea, 0xe0, 0xf1, 0x4f, 0x90, 0x8f, 0x8c, 0xcd, 0x72, 0x6f, 0xc6, 0xf5, ++ 0xcb, 0xfc, 0xa5, 0xaa, 0xc8, 0xbd, 0x14, 0x37, 0xf1, 0x42, 0x96, 0x83, ++ 0xbe, 0x83, 0xf9, 0xd2, 0xfa, 0x81, 0x1f, 0xac, 0x56, 0x08, 0xce, 0x5d, ++ 0xfc, 0x70, 0xcf, 0xe0, 0xfe, 0xe8, 0xf3, 0xdf, 0xbb, 0x5b, 0xff, 0xd9, ++ 0xf9, 0xbe, 0xdf, 0x64, 0x25, 0x06, 0xf2, 0xa7, 0x82, 0xf2, 0xa6, 0x5e, ++ 0xc0, 0x79, 0xc8, 0x75, 0xcb, 0x79, 0x04, 0xfa, 0xb9, 0x3c, 0x5e, 0x4b, ++ 0x7f, 0x52, 0xc0, 0xdf, 0xb5, 0x36, 0x15, 0xe9, 0x44, 0xde, 0x4f, 0x9b, ++ 0xaf, 0x2a, 0xb3, 0x26, 0x86, 0xf8, 0xfe, 0x03, 0xb1, 0x6f, 0x55, 0x49, ++ 0xe5, 0x7b, 0x71, 0x1d, 0x4b, 0x6a, 0xb9, 0xbf, 0xad, 0xd3, 0x1e, 0x57, ++ 0x36, 0xfc, 0xf8, 0x63, 0xdc, 0xaf, 0x83, 0x56, 0xe2, 0x73, 0xdd, 0x7d, ++ 0xaf, 0x5f, 0x67, 0xd5, 0x6b, 0x07, 0x09, 0x1e, 0xb0, 0xce, 0x99, 0xb8, ++ 0xbe, 0xa0, 0x75, 0xbe, 0x9b, 0x15, 0xe4, 0x17, 0x3c, 0xbb, 0xe7, 0xc3, ++ 0xdf, 0x20, 0xa8, 0xaf, 0x77, 0x7d, 0xd7, 0x9a, 0xc7, 0x6c, 0xee, 0xc1, ++ 0xef, 0x43, 0xec, 0xea, 0x8f, 0x86, 0x0d, 0x0d, 0xd2, 0xa3, 0xcc, 0xf2, ++ 0xfb, 0xfe, 0xda, 0x7b, 0xc6, 0xcc, 0xf8, 0xf7, 0x10, 0x60, 0xbc, 0x46, ++ 0x61, 0x7f, 0x34, 0x0a, 0xfb, 0xa3, 0x29, 0x4c, 0xfc, 0xbd, 0x1a, 0x9d, ++ 0x3d, 0xda, 0xe8, 0xe3, 0xf1, 0x3c, 0x8d, 0xf1, 0x26, 0x8a, 0xd7, 0x61, ++ 0xe2, 0xef, 0x2b, 0x48, 0xf9, 0xbb, 0xe2, 0x3d, 0x1e, 0xdf, 0xb3, 0x22, ++ 0x91, 0xd1, 0x7b, 0x9c, 0x1f, 0xd2, 0x81, 0xe2, 0xdf, 0x4f, 0xf2, 0xa0, ++ 0xf3, 0xbe, 0x28, 0x05, 0xe4, 0x1c, 0xe0, 0xc3, 0x19, 0xbb, 0xfb, 0x02, ++ 0xc2, 0x8f, 0xb9, 0x97, 0x93, 0x7c, 0x50, 0x6f, 0xb0, 0x3a, 0x11, 0x9f, ++ 0x77, 0xbd, 0x7d, 0xb3, 0xb0, 0xab, 0xb8, 0xbc, 0x29, 0x12, 0xf2, 0xa5, ++ 0x08, 0xfb, 0xc1, 0x75, 0x64, 0xf5, 0x24, 0xb9, 0x53, 0x28, 0xc6, 0x1d, ++ 0x6c, 0xa9, 0x25, 0xbd, 0x76, 0x08, 0xf3, 0x08, 0x3f, 0x8b, 0xf0, 0x47, ++ 0x3c, 0xb0, 0x5f, 0x63, 0x8f, 0xfd, 0x5f, 0x0d, 0xf6, 0x2d, 0x39, 0x10, ++ 0x68, 0x00, 0x00, 0x00 ++}; ++ ++static const u8 usem_int_table_data_e1h[] = { ++ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xfb, 0x51, ++ 0xcf, 0xc0, 0xf0, 0x03, 0x8a, 0xd7, 0x98, 0x33, 0x30, 0x38, 0x5a, 0x31, ++ 0x30, 0xe4, 0x59, 0x33, 0x30, 0x5c, 0x07, 0xe2, 0x30, 0x73, 0x84, 0xdc, ++ 0x4b, 0x71, 0x04, 0x9b, 0x9a, 0xf8, 0xa7, 0x3c, 0x65, 0xfa, 0x37, 0x48, ++ 0x32, 0x30, 0x6c, 0x02, 0xe2, 0x2d, 0x40, 0xbc, 0x4d, 0x92, 0x74, 0xfd, ++ 0xb7, 0xb4, 0x10, 0xec, 0xbd, 0xaa, 0x0c, 0x0c, 0xb7, 0x81, 0xfc, 0x6e, ++ 0x20, 0xfd, 0x5d, 0x9d, 0x81, 0x61, 0x17, 0x90, 0x7d, 0x07, 0x88, 0x2f, ++ 0x83, 0xf8, 0x40, 0xcc, 0xac, 0xc6, 0xc0, 0x20, 0x0e, 0xe4, 0xab, 0x00, ++ 0x69, 0x3f, 0x20, 0xd6, 0x07, 0xe2, 0xbb, 0x40, 0x7e, 0x9a, 0x1a, 0x6e, ++ 0xf3, 0xef, 0x69, 0xe1, 0xb7, 0x7f, 0x9b, 0x06, 0x2a, 0xff, 0x1d, 0x1a, ++ 0xff, 0x92, 0x3a, 0x7e, 0xfd, 0x99, 0x9a, 0xf8, 0xe5, 0xdf, 0x11, 0x90, ++ 0xc7, 0x86, 0x1f, 0xdb, 0x91, 0x1f, 0x1f, 0xea, 0xf6, 0xb4, 0x49, 0x27, ++ 0xb4, 0xc2, 0x07, 0xd0, 0xd2, 0xf5, 0x4e, 0x13, 0x06, 0x86, 0x0b, 0xa6, ++ 0x0c, 0x0c, 0x22, 0xd0, 0xb4, 0xbf, 0x17, 0x49, 0x5e, 0x0d, 0x28, 0xb6, ++ 0xcb, 0x04, 0xc2, 0x9e, 0xab, 0x07, 0x4c, 0x7b, 0x66, 0x40, 0x3e, 0x8e, ++ 0x7c, 0x31, 0x0f, 0x28, 0xbf, 0x11, 0x28, 0x6f, 0x64, 0x8e, 0xdf, 0x7e, ++ 0x05, 0x66, 0x54, 0xbe, 0x00, 0x2f, 0xa6, 0x9a, 0x6f, 0x4c, 0x08, 0xf6, ++ 0x04, 0x21, 0x54, 0xb9, 0xc3, 0xc2, 0x98, 0xea, 0xb9, 0x44, 0x19, 0x18, ++ 0x00, 0x65, 0x83, 0x84, 0x86, 0xd8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00 ++}; ++ ++static const u8 usem_pram_data_e1h[] = { ++ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xe5, 0x7d, ++ 0x0d, 0x78, 0x54, 0xd5, 0xb5, 0xf6, 0x3e, 0x73, 0xce, 0x9c, 0x99, 0x64, ++ 0x4e, 0x26, 0x93, 0x10, 0xc2, 0x60, 0x02, 0x4e, 0x7e, 0xd4, 0xa8, 0x09, ++ 0x8e, 0x21, 0x60, 0x4c, 0x26, 0xe4, 0x4c, 0x7e, 0x48, 0x48, 0x02, 0x06, ++ 0xb0, 0x34, 0xad, 0xb6, 0x4e, 0xd0, 0xa2, 0x6d, 0x41, 0xf1, 0xa7, 0xbd, ++ 0xde, 0x5e, 0xbe, 0x32, 0xfc, 0x34, 0x04, 0x8a, 0x0a, 0x2d, 0x5a, 0xb5, ++ 0xbd, 0xbd, 0x03, 0x55, 0x9e, 0xb6, 0xd7, 0xe7, 0x3e, 0xc1, 0x52, 0xcb, ++ 0xcd, 0x8f, 0x4c, 0x20, 0x20, 0x1a, 0x7e, 0x22, 0x5a, 0xbc, 0xfd, 0x68, ++ 0xbf, 0x1b, 0xb5, 0x57, 0x43, 0x1b, 0x74, 0x82, 0xc1, 0xd2, 0xef, 0xc1, ++ 0xf2, 0xed, 0xb5, 0xf6, 0xde, 0x99, 0x39, 0x27, 0x33, 0x09, 0xa8, 0xdf, ++ 0xbd, 0xdf, 0x0f, 0x3e, 0x3e, 0x27, 0xe7, 0x9c, 0x7d, 0xf6, 0x5e, 0x7b, ++ 0xed, 0xb5, 0xd6, 0x7e, 0xd7, 0xda, 0x6b, 0xef, 0xb1, 0x92, 0x74, 0xe2, ++ 0xba, 0x9a, 0x90, 0x4b, 0xf0, 0xaf, 0x92, 0x10, 0xdf, 0x74, 0x42, 0xc8, ++ 0xd4, 0xe8, 0x55, 0x3c, 0xaf, 0xb2, 0x93, 0xa0, 0xe3, 0x26, 0x42, 0xd2, ++ 0xec, 0x7b, 0xfa, 0x67, 0x65, 0x10, 0x32, 0x5f, 0x93, 0xbd, 0x75, 0x1e, ++ 0x42, 0xa6, 0xd9, 0x5b, 0xfb, 0x48, 0x09, 0x21, 0x15, 0xc4, 0xe6, 0xb1, ++ 0xe5, 0x10, 0xd2, 0x2b, 0xfd, 0xa6, 0x7f, 0x16, 0xbd, 0x3f, 0x9c, 0x62, ++ 0xf5, 0xda, 0x08, 0xfc, 0x7b, 0x90, 0x90, 0xb9, 0x84, 0x3c, 0x64, 0xa7, ++ 0x7f, 0xd2, 0xf2, 0x87, 0xcf, 0xd3, 0x2b, 0xfd, 0xfe, 0xf0, 0x5f, 0x2d, ++ 0x21, 0x22, 0x11, 0x52, 0x2b, 0x37, 0x11, 0x09, 0xbe, 0xb7, 0x4b, 0xbc, ++ 0xbc, 0xae, 0x2d, 0xcc, 0x24, 0xa4, 0x86, 0xb0, 0x7f, 0xf3, 0xce, 0x93, ++ 0x1a, 0x5a, 0x8c, 0xd4, 0xb8, 0xef, 0x6d, 0x22, 0xb3, 0x08, 0xa9, 0x76, ++ 0xd1, 0x52, 0x76, 0xf6, 0xee, 0x12, 0x2b, 0x4f, 0x08, 0x2d, 0x5f, 0x4e, ++ 0x58, 0xfd, 0xba, 0xdd, 0xf8, 0xbe, 0x9c, 0x6c, 0x1d, 0x91, 0x9d, 0x70, ++ 0x17, 0x91, 0x9b, 0x8b, 0x68, 0x7d, 0x17, 0x55, 0xe3, 0x7b, 0x77, 0xdd, ++ 0xfb, 0xc4, 0x09, 0xe5, 0x62, 0x9e, 0x43, 0x3f, 0xe0, 0x0f, 0xca, 0x83, ++ 0x6b, 0x49, 0x4a, 0xc6, 0x7b, 0x0e, 0xfa, 0xf7, 0x2d, 0xe4, 0x96, 0x4b, ++ 0x32, 0xbd, 0x2a, 0x53, 0x08, 0xb9, 0x35, 0xca, 0x17, 0xf3, 0x95, 0x90, ++ 0x20, 0xf2, 0xad, 0x93, 0x7f, 0xaf, 0x90, 0xe6, 0x59, 0x70, 0x4f, 0xc8, ++ 0x8b, 0xd8, 0x7e, 0xba, 0xe0, 0x63, 0xfd, 0x20, 0x71, 0xd3, 0x7e, 0x67, ++ 0x94, 0x12, 0x6f, 0x1d, 0xed, 0xe0, 0xb4, 0x7a, 0xbd, 0x17, 0xf8, 0x52, ++ 0x5e, 0xa3, 0x7a, 0x6c, 0xf4, 0xbe, 0xb7, 0x76, 0xee, 0xf4, 0x41, 0x8d, ++ 0x90, 0x1f, 0x9e, 0xed, 0xc8, 0x22, 0x85, 0xf4, 0xf3, 0xd0, 0x4a, 0xe4, ++ 0x63, 0x06, 0xe7, 0x63, 0xef, 0xd9, 0x97, 0x4e, 0xdf, 0x4f, 0xbf, 0xf7, ++ 0xd5, 0x13, 0xaf, 0x8d, 0xde, 0x77, 0x59, 0xbd, 0xd3, 0x9b, 0x0b, 0xc7, ++ 0xd3, 0xe3, 0xab, 0x4f, 0x4f, 0x22, 0xb4, 0x9e, 0xed, 0xcd, 0x07, 0x1c, ++ 0x58, 0x0f, 0x21, 0x7f, 0xbb, 0x94, 0xc9, 0xeb, 0xc9, 0x23, 0xa4, 0xbb, ++ 0x39, 0x37, 0x35, 0x10, 0xe7, 0x3b, 0x71, 0x7d, 0x62, 0xad, 0x8b, 0x10, ++ 0x5b, 0xf4, 0x7e, 0x9b, 0x4e, 0xea, 0x3b, 0xb4, 0xf1, 0xe5, 0x5e, 0x82, ++ 0xc1, 0x9c, 0x03, 0xd5, 0xdf, 0x89, 0x74, 0x96, 0x73, 0x5e, 0xfe, 0x50, ++ 0x22, 0x2d, 0x1d, 0xd8, 0x6e, 0x0b, 0x8e, 0x53, 0x17, 0xa7, 0xbf, 0x4f, ++ 0x3f, 0xe0, 0x18, 0x2c, 0x84, 0xf7, 0x61, 0x87, 0x85, 0xf6, 0x23, 0x38, ++ 0x62, 0x21, 0xcf, 0xd3, 0x2a, 0xba, 0x87, 0xab, 0x92, 0x81, 0xde, 0xf5, ++ 0xba, 0x25, 0x0c, 0xcf, 0xbb, 0x87, 0xd5, 0x10, 0xf0, 0x83, 0xb8, 0x3b, ++ 0xb2, 0x16, 0x17, 0x8d, 0xa7, 0xbf, 0x6b, 0x64, 0x79, 0x31, 0xf6, 0x2b, ++ 0xb0, 0xd2, 0xd0, 0xee, 0x0f, 0x86, 0x69, 0x7f, 0x35, 0xe8, 0xdf, 0x8b, ++ 0x8e, 0xf9, 0xb4, 0x9e, 0x73, 0xc3, 0x16, 0x97, 0x4c, 0xc7, 0x75, 0x3b, ++ 0x7f, 0xde, 0x15, 0xe8, 0x70, 0xb8, 0xe0, 0xbb, 0xa1, 0x74, 0x1c, 0xcf, ++ 0x27, 0xd6, 0xd2, 0xbf, 0xaf, 0x4b, 0xcc, 0x8f, 0x27, 0xe6, 0x7d, 0x23, ++ 0x37, 0xa0, 0x41, 0x39, 0xbb, 0x91, 0x1f, 0xc3, 0xe7, 0x8e, 0xe4, 0xd1, ++ 0x71, 0xeb, 0xde, 0xa1, 0x78, 0xa1, 0x5f, 0x93, 0xf1, 0xf3, 0x07, 0xbc, ++ 0x1d, 0x71, 0x9f, 0xee, 0x0d, 0x57, 0xbb, 0x68, 0xbd, 0xbe, 0x88, 0x57, ++ 0x02, 0x3d, 0x4a, 0x1f, 0x26, 0x64, 0x4a, 0x0e, 0xe8, 0x45, 0xf7, 0x41, ++ 0x27, 0x8c, 0x6f, 0x13, 0x41, 0xbd, 0xf0, 0x35, 0x57, 0x25, 0x5d, 0xc3, ++ 0xfa, 0xe1, 0x95, 0x3d, 0xf0, 0xfe, 0xa8, 0x0c, 0xf2, 0xe1, 0x73, 0x85, ++ 0xb1, 0x1f, 0x63, 0xf4, 0x00, 0x7d, 0xd7, 0x01, 0x9d, 0x6e, 0xbc, 0x3e, ++ 0xcd, 0xdb, 0x7b, 0x0a, 0xc6, 0x11, 0xfb, 0xb7, 0x3e, 0xe9, 0x5a, 0x4a, ++ 0xef, 0xb9, 0x52, 0x05, 0xeb, 0xd9, 0xa5, 0xaf, 0xf7, 0x2b, 0x58, 0xdf, ++ 0xc5, 0xb0, 0x0c, 0xf2, 0xb8, 0x92, 0xc9, 0x53, 0x86, 0x27, 0xb0, 0xce, ++ 0x0a, 0xfc, 0xbf, 0x87, 0x78, 0x83, 0x1e, 0xa8, 0x97, 0x60, 0xbf, 0x7f, ++ 0xca, 0xfb, 0xff, 0x13, 0x5e, 0x9f, 0x68, 0xa7, 0x7b, 0x38, 0xdd, 0xaf, ++ 0x00, 0x7d, 0x2d, 0xc4, 0x0b, 0x6a, 0x52, 0x2b, 0xaf, 0xe9, 0x85, 0xef, ++ 0x7d, 0xf7, 0x31, 0xfa, 0x67, 0x3e, 0xba, 0x5a, 0x02, 0xfe, 0x5d, 0xbd, ++ 0x66, 0x10, 0xaf, 0x21, 0x4e, 0xe7, 0x36, 0xf8, 0x9e, 0x16, 0xc8, 0x5e, ++ 0x1d, 0x91, 0x80, 0x6f, 0x33, 0x1e, 0x09, 0xe3, 0x75, 0xc7, 0xba, 0xdf, ++ 0xf7, 0x02, 0x7d, 0xa9, 0x1b, 0x49, 0x12, 0xd8, 0x82, 0xed, 0x35, 0x96, ++ 0x34, 0xf8, 0x6e, 0xfb, 0xfc, 0xab, 0x92, 0xe0, 0xbd, 0xb3, 0x99, 0x2a, ++ 0x3e, 0xb5, 0x07, 0x3e, 0xaf, 0xeb, 0xc1, 0x3e, 0xda, 0x9f, 0x1d, 0x35, ++ 0x0a, 0xd2, 0xb9, 0x63, 0x98, 0xf2, 0x9f, 0x96, 0x73, 0x06, 0x5d, 0x5e, ++ 0xd0, 0x6b, 0x67, 0xd0, 0xc3, 0xaf, 0x5e, 0x2f, 0x94, 0xdf, 0xcf, 0xf9, ++ 0xd1, 0xc5, 0xdb, 0xed, 0xe1, 0x74, 0x38, 0x83, 0x3a, 0x2f, 0xb7, 0xba, ++ 0x10, 0xca, 0x39, 0x83, 0x41, 0xbc, 0x86, 0x78, 0x3f, 0x89, 0x67, 0x15, ++ 0xca, 0xdd, 0x43, 0x5c, 0xee, 0xf6, 0x5b, 0x03, 0x37, 0x00, 0xdf, 0x33, ++ 0x86, 0x89, 0x9b, 0x50, 0x7d, 0xee, 0xfa, 0xa0, 0x61, 0x3a, 0xb4, 0x2b, ++ 0xea, 0x37, 0x97, 0xdf, 0xfd, 0xec, 0xff, 0x9c, 0x0d, 0xef, 0xa7, 0x0e, ++ 0x93, 0xb7, 0xad, 0xb3, 0xe0, 0x1a, 0x6e, 0x85, 0xf6, 0xae, 0x83, 0x7e, ++ 0x38, 0xe1, 0x7e, 0xa0, 0x55, 0x42, 0x3b, 0x15, 0x42, 0x3d, 0xd2, 0x2f, ++ 0x5a, 0x08, 0x29, 0x88, 0xda, 0xa9, 0x8c, 0x0b, 0xcd, 0x0b, 0x6e, 0xf3, ++ 0xc0, 0x5d, 0x2d, 0xea, 0x91, 0xb0, 0x03, 0xe5, 0xc3, 0xaa, 0x45, 0x4a, ++ 0x8d, 0xd5, 0xb3, 0x1a, 0xd4, 0x83, 0x1d, 0x5c, 0x0f, 0x6a, 0x86, 0xc3, ++ 0x28, 0x27, 0x54, 0xcf, 0x0e, 0x5a, 0x28, 0x9f, 0x82, 0x67, 0xa9, 0x9e, ++ 0x51, 0xf9, 0xea, 0x6a, 0xb6, 0xe0, 0x78, 0x3f, 0x17, 0x51, 0xd1, 0x0e, ++ 0x93, 0x82, 0x70, 0xd6, 0xe2, 0x94, 0xf1, 0x7a, 0xd4, 0x3d, 0xb2, 0xa2, ++ 0x18, 0xf8, 0x2d, 0xf4, 0x69, 0xbc, 0xfd, 0xf8, 0x7f, 0x43, 0xbf, 0x76, ++ 0xd0, 0x7e, 0x04, 0xe2, 0xd8, 0x35, 0xd1, 0x9e, 0xd0, 0x37, 0xf3, 0xfb, ++ 0x49, 0xf5, 0xcd, 0x15, 0x44, 0x7d, 0xeb, 0xa6, 0xfa, 0x16, 0x04, 0x7e, ++ 0x36, 0x5b, 0x92, 0xf2, 0x41, 0xff, 0xda, 0x2d, 0xa8, 0x27, 0xee, 0x9a, ++ 0x8e, 0x5e, 0xa6, 0x2f, 0x2b, 0x51, 0xdf, 0x32, 0xee, 0x61, 0xf4, 0x4c, ++ 0xbb, 0x33, 0x84, 0x7a, 0x30, 0x99, 0xde, 0xed, 0xf0, 0xb8, 0xfc, 0x0a, ++ 0xd4, 0xdf, 0xc2, 0xf4, 0xb4, 0x7b, 0xf8, 0x9d, 0x75, 0x36, 0x18, 0x8f, ++ 0x3b, 0x09, 0xb7, 0x13, 0x17, 0x7b, 0xe1, 0xde, 0xf7, 0x28, 0xd3, 0x6b, ++ 0xb3, 0x9e, 0x99, 0xf5, 0x30, 0xd5, 0x37, 0x80, 0xfa, 0x99, 0xb3, 0x31, ++ 0x42, 0xe0, 0xea, 0xd9, 0xd0, 0x84, 0x72, 0x4d, 0x5b, 0x49, 0x42, 0xfd, ++ 0x4b, 0xa0, 0x87, 0xdd, 0xa0, 0x87, 0x25, 0xff, 0xff, 0xe8, 0x61, 0x35, ++ 0xcc, 0xe3, 0x54, 0xef, 0xd2, 0xb4, 0x9b, 0xfb, 0x5c, 0xb4, 0xdf, 0x0b, ++ 0x22, 0x84, 0xe1, 0x21, 0x6d, 0x7b, 0x1f, 0xcc, 0xe3, 0xb5, 0xd9, 0x36, ++ 0x36, 0x8f, 0xcf, 0x78, 0xeb, 0x8e, 0x07, 0xe8, 0xfd, 0x11, 0xab, 0x03, ++ 0xf9, 0x7f, 0x64, 0x2a, 0x7d, 0x58, 0x02, 0xf7, 0x32, 0xea, 0x5d, 0x6f, ++ 0xce, 0xa6, 0xec, 0x87, 0xe8, 0xfb, 0x05, 0x19, 0x12, 0xbe, 0x27, 0xe4, ++ 0x3e, 0xd4, 0xef, 0x3a, 0x81, 0x97, 0xe0, 0x11, 0xd5, 0x1f, 0xff, 0xa0, ++ 0x44, 0xe6, 0xa6, 0x43, 0xb9, 0x77, 0xb7, 0x55, 0xd3, 0xef, 0x5f, 0x1d, ++ 0x22, 0x5e, 0x78, 0xf5, 0x6a, 0xb6, 0x8c, 0xf5, 0x1d, 0x1c, 0x26, 0x4c, ++ 0x8f, 0xb9, 0x7e, 0xd6, 0xf1, 0xfe, 0x1e, 0xe4, 0xef, 0xcf, 0x5d, 0x20, ++ 0x21, 0xd0, 0xcf, 0x4a, 0x80, 0x24, 0xf4, 0xf9, 0xc7, 0x67, 0x22, 0x33, ++ 0xed, 0xf4, 0xd5, 0x87, 0x96, 0x8b, 0x45, 0x24, 0x97, 0xce, 0xc7, 0x82, ++ 0x5f, 0x1c, 0x67, 0xd4, 0x72, 0xfd, 0x7f, 0x35, 0x43, 0xd6, 0xc1, 0x6e, ++ 0x1c, 0x5c, 0x93, 0x12, 0x22, 0x39, 0x58, 0x5f, 0x18, 0xe4, 0xed, 0xd5, ++ 0x47, 0x6d, 0x21, 0x99, 0xb6, 0x77, 0x2e, 0x3f, 0xef, 0x85, 0x30, 0x01, ++ 0xfc, 0x17, 0xb9, 0xf6, 0x21, 0xfa, 0xbe, 0xcf, 0xf5, 0x51, 0x4a, 0xac, ++ 0x7e, 0x0e, 0x71, 0xf9, 0xfd, 0x13, 0x97, 0xdf, 0x61, 0x8e, 0x27, 0xb6, ++ 0xdd, 0xd8, 0xbc, 0x58, 0xa2, 0xfc, 0x7d, 0x35, 0x3f, 0x0f, 0xf5, 0xeb, ++ 0x5c, 0xfe, 0x47, 0x33, 0x09, 0x65, 0xf5, 0x03, 0x79, 0x7f, 0x79, 0x0f, ++ 0xae, 0x84, 0x84, 0xad, 0x80, 0x97, 0xcc, 0xf5, 0x88, 0xef, 0x5f, 0x75, ++ 0x07, 0xbe, 0x2c, 0x51, 0x5c, 0x35, 0x14, 0x7a, 0xd7, 0x09, 0xe3, 0x79, ++ 0x76, 0xef, 0x47, 0xb3, 0xe0, 0x4a, 0xdc, 0x53, 0x10, 0x77, 0x4d, 0x86, ++ 0xcf, 0x7c, 0x02, 0x87, 0x45, 0x06, 0x36, 0x00, 0x0e, 0x21, 0x35, 0x54, ++ 0x4e, 0xe6, 0x46, 0xe5, 0x64, 0x5a, 0x64, 0xe0, 0x20, 0xf0, 0xcd, 0x37, ++ 0xca, 0xf0, 0x18, 0xa9, 0x5f, 0x85, 0xe3, 0x52, 0xe1, 0x62, 0x7c, 0xe9, ++ 0x3d, 0x7f, 0x2a, 0x0b, 0xbe, 0xeb, 0xe4, 0x7c, 0xeb, 0x19, 0x19, 0xc8, ++ 0x42, 0xfb, 0x58, 0x6f, 0xac, 0xa7, 0xc7, 0x3a, 0x78, 0x67, 0x33, 0xab, ++ 0x1f, 0xbf, 0xf7, 0xb9, 0xd8, 0xb8, 0x0a, 0x7a, 0x5e, 0xe6, 0xfd, 0x7a, ++ 0x5a, 0x92, 0x08, 0xc3, 0x89, 0x6c, 0xfc, 0x7c, 0xfc, 0xfb, 0x79, 0xca, ++ 0xc0, 0x94, 0x9b, 0x28, 0x1d, 0xf3, 0x8e, 0xc8, 0xde, 0x75, 0xf4, 0xd1, ++ 0xbc, 0xa1, 0xc1, 0x1a, 0x12, 0xc7, 0x0e, 0xed, 0x92, 0xd2, 0x50, 0x5e, ++ 0x2b, 0x2f, 0x18, 0xe5, 0xb5, 0xe7, 0xfc, 0x61, 0x19, 0xf8, 0x42, 0xe9, ++ 0x95, 0x81, 0xde, 0x8a, 0xc8, 0x80, 0xcc, 0xec, 0x38, 0x93, 0x33, 0x1f, ++ 0x97, 0xb3, 0x8a, 0xc8, 0x49, 0x83, 0x7d, 0x17, 0xed, 0xf7, 0x44, 0x4e, ++ 0x36, 0x42, 0xfb, 0xe7, 0x86, 0x98, 0xbd, 0x4a, 0xc4, 0x57, 0x21, 0x3f, ++ 0x07, 0xf8, 0x38, 0xbf, 0x2c, 0xf4, 0x95, 0x84, 0x1c, 0x37, 0x51, 0x79, ++ 0x39, 0x44, 0xe9, 0xdf, 0x32, 0xc1, 0xf7, 0xb5, 0x2e, 0xd9, 0x40, 0xb7, ++ 0xd0, 0xbf, 0x6a, 0xbb, 0xc3, 0x80, 0xd7, 0x2b, 0x2f, 0xa4, 0x9b, 0xf0, ++ 0xbf, 0x91, 0xde, 0x32, 0x25, 0x8c, 0xfc, 0x2a, 0x03, 0x7e, 0x79, 0x12, ++ 0xf3, 0x6b, 0x8d, 0x94, 0x8e, 0xf5, 0x97, 0x0f, 0x7d, 0x3a, 0x7e, 0x99, ++ 0xed, 0x8a, 0xa8, 0xb7, 0x07, 0xf8, 0x58, 0x38, 0x9e, 0x2e, 0x02, 0x42, ++ 0x2d, 0xe8, 0x96, 0xff, 0xcf, 0xe7, 0x6b, 0x37, 0xfc, 0xc1, 0xfc, 0x97, ++ 0xc3, 0xa0, 0xa7, 0x64, 0x70, 0x8f, 0xdc, 0x9c, 0x02, 0xf3, 0x89, 0x86, ++ 0xf6, 0xa4, 0xbc, 0x46, 0x62, 0xb8, 0x9c, 0xf7, 0xb3, 0x09, 0xbe, 0xa5, ++ 0x4d, 0xd5, 0x0b, 0xbd, 0xf2, 0x48, 0xe8, 0xe7, 0x35, 0xf8, 0xa4, 0x50, ++ 0x1d, 0xe0, 0x0d, 0xef, 0xcf, 0xd0, 0x4f, 0x3c, 0x57, 0x62, 0xf3, 0x80, ++ 0x1d, 0x9a, 0xe6, 0xd9, 0xae, 0x0c, 0xc6, 0xc8, 0x5b, 0x03, 0xff, 0x7e, ++ 0x8c, 0x8f, 0x6b, 0x75, 0xec, 0x67, 0xef, 0x9c, 0xb7, 0xb2, 0xa0, 0x5c, ++ 0xcf, 0x35, 0xeb, 0xb2, 0x61, 0x1c, 0x16, 0x78, 0xde, 0x72, 0x3c, 0x44, ++ 0xf9, 0x7f, 0x98, 0xeb, 0x4d, 0xe7, 0xda, 0x7a, 0x2c, 0x57, 0x7e, 0x81, ++ 0x3c, 0x76, 0x33, 0x8c, 0x4b, 0x3e, 0xd3, 0xb3, 0x79, 0xbc, 0x2f, 0x7d, ++ 0x9c, 0x6f, 0x07, 0xb8, 0xdd, 0xd8, 0xcf, 0xe7, 0xcd, 0x53, 0x6b, 0x03, ++ 0x78, 0x7d, 0x73, 0xed, 0x7d, 0x78, 0x3d, 0xb9, 0x76, 0x35, 0x5e, 0x5f, ++ 0xbd, 0xf0, 0xa2, 0x06, 0xe3, 0xd7, 0x5f, 0x90, 0x87, 0xf3, 0x57, 0xbd, ++ 0xd2, 0xa1, 0xc4, 0xf3, 0xab, 0xca, 0x86, 0x8d, 0x72, 0xf3, 0xb2, 0x87, ++ 0xe2, 0x1d, 0x5a, 0xbe, 0x71, 0x78, 0xf9, 0xd6, 0x9b, 0x69, 0xbf, 0x8f, ++ 0x5e, 0xb0, 0xa0, 0x7d, 0x3e, 0x5a, 0x90, 0x37, 0x21, 0x5e, 0x11, 0xf6, ++ 0x43, 0x94, 0x7b, 0xc5, 0xfd, 0xb3, 0x6a, 0xe0, 0x5b, 0xd3, 0x10, 0x25, ++ 0x37, 0x67, 0x7c, 0x79, 0xb3, 0xbc, 0x96, 0x13, 0xa9, 0x03, 0xf0, 0x5f, ++ 0xb9, 0xf7, 0x75, 0x85, 0x50, 0x7b, 0xb9, 0xb0, 0x64, 0xa7, 0x16, 0x8b, ++ 0x63, 0xba, 0xce, 0x66, 0x16, 0x41, 0xbd, 0x5d, 0xd2, 0x1f, 0x96, 0xce, ++ 0xf6, 0x24, 0xa6, 0xa3, 0xdc, 0x37, 0x80, 0xfd, 0x5c, 0x18, 0xfe, 0x9d, ++ 0xe2, 0x49, 0x49, 0x5c, 0xee, 0x98, 0x32, 0xd0, 0x34, 0x1b, 0xfd, 0x54, ++ 0xa6, 0x5f, 0xe5, 0xde, 0xb7, 0x6b, 0x74, 0xda, 0x5e, 0x5d, 0xe1, 0xce, ++ 0x26, 0x94, 0x8b, 0x51, 0xc5, 0x02, 0x72, 0xd1, 0x54, 0xb8, 0x87, 0x8f, ++ 0xaf, 0x0b, 0xc7, 0x63, 0xa1, 0x98, 0xcf, 0x4a, 0xe4, 0xfa, 0x10, 0xd0, ++ 0x33, 0x7c, 0x0e, 0xe9, 0xec, 0x2f, 0x94, 0xa7, 0x02, 0x7d, 0x5b, 0x2c, ++ 0x32, 0xca, 0xe5, 0x42, 0x8f, 0x0d, 0xf1, 0x6c, 0xc2, 0xf6, 0x47, 0x15, ++ 0x12, 0x06, 0xfd, 0x52, 0xc2, 0x38, 0x4e, 0x47, 0x69, 0x3d, 0x20, 0x17, ++ 0xc7, 0xa8, 0xdd, 0x63, 0xcf, 0x07, 0xd8, 0x3d, 0xad, 0x17, 0xde, 0xf7, ++ 0xe6, 0xd8, 0x34, 0x2f, 0xf0, 0xd3, 0x2d, 0xe2, 0x11, 0xf7, 0x19, 0xe4, ++ 0xa3, 0x29, 0x7f, 0xf6, 0x51, 0x2f, 0xa5, 0xbb, 0xdf, 0x2d, 0x23, 0xbe, ++ 0xec, 0xbf, 0x50, 0xa5, 0xa4, 0xd1, 0xfb, 0x63, 0x30, 0xbf, 0x7a, 0xa2, ++ 0xf2, 0x59, 0xce, 0xe5, 0xf3, 0x18, 0x8c, 0x3b, 0xc8, 0x71, 0x48, 0xc6, ++ 0xf9, 0x4f, 0xe0, 0x65, 0x51, 0x5f, 0xcf, 0x85, 0xdc, 0xc7, 0x4a, 0x68, ++ 0x7b, 0xc7, 0x42, 0xd6, 0xb8, 0xdf, 0x37, 0xd7, 0x18, 0xf5, 0xf1, 0x36, ++ 0xb7, 0xc3, 0x70, 0x5f, 0x93, 0x3d, 0xc5, 0x70, 0x7f, 0x6c, 0xb8, 0xf8, ++ 0xcd, 0x66, 0x68, 0x8f, 0xd2, 0x0f, 0x78, 0x8e, 0x04, 0x57, 0x1a, 0xe8, ++ 0xef, 0x01, 0x7b, 0x0f, 0xed, 0xb9, 0x24, 0x9c, 0xff, 0x0f, 0x5f, 0xac, ++ 0x19, 0x7e, 0x00, 0xca, 0x85, 0x8c, 0x74, 0x99, 0xe9, 0xe8, 0xbf, 0x90, ++ 0xfb, 0xe4, 0xed, 0xb4, 0xde, 0xa3, 0x7b, 0x65, 0x94, 0xd3, 0x1a, 0xb7, ++ 0x91, 0xae, 0xea, 0xf3, 0x6f, 0x1e, 0x85, 0x38, 0x4e, 0x23, 0xb5, 0x2f, ++ 0xc0, 0xb7, 0x97, 0x75, 0x45, 0x87, 0x7e, 0x1f, 0xdb, 0x9b, 0x12, 0x5a, ++ 0x47, 0xe5, 0xf2, 0xe5, 0xc2, 0xd7, 0x1d, 0x80, 0x1b, 0xe8, 0x3f, 0x6d, ++ 0x21, 0x6d, 0xa7, 0x9a, 0xb0, 0xf1, 0xad, 0xca, 0x30, 0xd6, 0x73, 0x74, ++ 0xf8, 0x9d, 0xef, 0x83, 0x9d, 0x3a, 0x67, 0x97, 0xd1, 0xce, 0x55, 0xfd, ++ 0xf5, 0xc0, 0x46, 0x80, 0x57, 0x27, 0x4a, 0x1e, 0xee, 0x03, 0x3e, 0x77, ++ 0x11, 0x09, 0xf9, 0x54, 0x71, 0x76, 0x97, 0x0c, 0xf5, 0x2d, 0x0b, 0x19, ++ 0xbf, 0xbf, 0xfd, 0x4e, 0x23, 0x7f, 0x56, 0xdd, 0x3e, 0xc5, 0x64, 0xff, ++ 0x8d, 0xf1, 0xa5, 0x6a, 0x0f, 0x8b, 0x13, 0xcd, 0xf3, 0x8e, 0x60, 0x7d, ++ 0x65, 0x10, 0xff, 0xa1, 0xf7, 0x55, 0x9a, 0x31, 0x2e, 0x34, 0x0f, 0x8c, ++ 0x41, 0x4c, 0xbd, 0x15, 0xa6, 0xb8, 0x50, 0x99, 0x87, 0xc5, 0x85, 0xca, ++ 0x20, 0x2e, 0x24, 0xca, 0xe5, 0x90, 0x71, 0x76, 0x9f, 0xde, 0x63, 0xfb, ++ 0xe6, 0x79, 0xdd, 0xac, 0xdf, 0x09, 0xf5, 0xdf, 0x42, 0xee, 0x83, 0x78, ++ 0x0a, 0x89, 0x2c, 0x99, 0x04, 0xb7, 0xac, 0xe7, 0xf1, 0x15, 0xa3, 0xbd, ++ 0x25, 0xca, 0x0e, 0x09, 0xe4, 0xa1, 0x8c, 0xb7, 0xdf, 0x69, 0xed, 0x70, ++ 0x00, 0x5d, 0xbe, 0x9b, 0x99, 0xfd, 0x22, 0x91, 0xf4, 0xb8, 0xf1, 0x2a, ++ 0xb3, 0x1d, 0x21, 0xe4, 0x61, 0x94, 0x2b, 0xc1, 0x47, 0xe2, 0x0a, 0x92, ++ 0x8c, 0xb9, 0xd0, 0x7f, 0x5e, 0xc6, 0x6c, 0xff, 0x38, 0x5f, 0xda, 0xe9, ++ 0x70, 0x5c, 0xc2, 0x79, 0x20, 0xc8, 0xf1, 0x8b, 0x27, 0xae, 0xbe, 0x9b, ++ 0xbf, 0xcf, 0xe6, 0xfa, 0x3e, 0x7f, 0x88, 0xda, 0xcd, 0x0c, 0x18, 0x2f, ++ 0xd9, 0x05, 0x76, 0xe3, 0xe8, 0x05, 0xa2, 0x81, 0x3e, 0x9e, 0xa0, 0xf2, ++ 0xce, 0x5a, 0x1e, 0xbc, 0x14, 0x2b, 0xb7, 0x8d, 0x43, 0x1d, 0x28, 0x97, ++ 0xb4, 0x3c, 0x8c, 0x20, 0x2d, 0xef, 0x45, 0xfd, 0x6d, 0x9e, 0xce, 0xf4, ++ 0xb7, 0x37, 0xa7, 0x4e, 0x49, 0x63, 0xf6, 0x33, 0xae, 0xbe, 0x9b, 0xf5, ++ 0x60, 0x88, 0x04, 0x9f, 0x2a, 0xa1, 0xe3, 0x7a, 0x34, 0x3f, 0xef, 0xc9, ++ 0xdb, 0xe9, 0x77, 0xfd, 0x7b, 0x85, 0x1d, 0xb0, 0xe8, 0xa8, 0x57, 0x7b, ++ 0x19, 0xee, 0x3d, 0x36, 0xfc, 0x10, 0xca, 0xeb, 0x39, 0x2a, 0xaf, 0xc0, ++ 0xf6, 0xf1, 0x7a, 0x7f, 0x52, 0x8b, 0x9d, 0xf7, 0xff, 0xb3, 0xf4, 0xdd, ++ 0xac, 0xe7, 0x63, 0xfa, 0x3f, 0x4e, 0xdf, 0x99, 0xdd, 0x3a, 0x3a, 0x6a, ++ 0xc1, 0xfe, 0x54, 0x9f, 0x57, 0xb0, 0x9e, 0xc6, 0x8b, 0x04, 0xe7, 0x71, ++ 0xb3, 0xfe, 0x1f, 0xe3, 0xfe, 0xdb, 0xcb, 0xfa, 0x9b, 0x9a, 0x17, 0xe6, ++ 0xc3, 0xc2, 0x77, 0xd1, 0x3f, 0x26, 0x9f, 0x5a, 0xdf, 0x99, 0x1f, 0xd2, ++ 0x35, 0x44, 0xb0, 0xfd, 0x8a, 0xb3, 0xef, 0xc8, 0xb4, 0xe7, 0x9f, 0x9b, ++ 0xbe, 0x0b, 0x3d, 0x17, 0x7a, 0x7b, 0xc5, 0xfa, 0xfe, 0x9f, 0xa4, 0xe7, ++ 0xe6, 0xe7, 0xdf, 0xb6, 0x70, 0xdc, 0x9f, 0x40, 0x4f, 0xa3, 0xfa, 0x1f, ++ 0xc4, 0x72, 0x1b, 0x52, 0x48, 0x01, 0xc4, 0xd9, 0x3a, 0xa5, 0x64, 0xef, ++ 0xfa, 0x1c, 0xd0, 0x77, 0x16, 0xf7, 0x31, 0x97, 0x9f, 0x22, 0x8b, 0x78, ++ 0xac, 0x3d, 0xf8, 0x47, 0xda, 0xaf, 0x56, 0x2a, 0x2c, 0xa9, 0x94, 0xd5, ++ 0xab, 0xc8, 0xe0, 0x4c, 0x90, 0x87, 0xa9, 0xd3, 0x3d, 0x58, 0xdf, 0xfd, ++ 0x96, 0xc1, 0x4c, 0xb8, 0xff, 0x90, 0x44, 0x32, 0x6f, 0x94, 0x01, 0x3f, ++ 0x93, 0x7d, 0x30, 0xff, 0x4a, 0x3a, 0x21, 0x8f, 0x52, 0x92, 0x24, 0x8f, ++ 0x8b, 0xdc, 0x59, 0x4c, 0xc8, 0x13, 0x72, 0xc0, 0x2e, 0xd3, 0xfa, 0xa4, ++ 0xa1, 0xf0, 0x5f, 0x25, 0xca, 0x67, 0xf2, 0x08, 0xf1, 0x00, 0x1e, 0xbc, ++ 0x4e, 0x0a, 0x38, 0xe0, 0xb9, 0x8d, 0xf2, 0x49, 0xa3, 0xe5, 0x89, 0x72, ++ 0x12, 0x71, 0x22, 0xf5, 0xdf, 0x90, 0x5f, 0x8b, 0xb8, 0xd2, 0x2d, 0xb2, ++ 0x6b, 0x61, 0x8c, 0xc3, 0x97, 0x5a, 0x87, 0x07, 0x05, 0xdf, 0x71, 0xfe, ++ 0xb8, 0xd3, 0xf5, 0xde, 0x8d, 0xb4, 0x5e, 0x12, 0x96, 0x2e, 0xdd, 0x18, ++ 0xed, 0xe7, 0x6e, 0x6b, 0x28, 0xcb, 0xab, 0x41, 0x3f, 0x43, 0x3f, 0xbe, ++ 0x1f, 0xe2, 0x56, 0xcf, 0xa8, 0xde, 0xe7, 0xe3, 0xf0, 0xdd, 0xf2, 0x29, ++ 0xfb, 0x09, 0xe6, 0x07, 0xf9, 0x69, 0x61, 0xfc, 0x0c, 0x5a, 0x92, 0xbd, ++ 0xcf, 0xc7, 0xc1, 0x5b, 0x0b, 0xae, 0xbc, 0xfe, 0x53, 0xc9, 0xf4, 0x5a, ++ 0x0e, 0x7c, 0xbc, 0x69, 0x3c, 0x1f, 0xa5, 0x61, 0xca, 0x3f, 0xe0, 0x83, ++ 0xf2, 0xb7, 0x4b, 0xe0, 0x27, 0x96, 0xbb, 0x99, 0x7c, 0xc9, 0x1f, 0xaa, ++ 0x3a, 0xc4, 0x69, 0x88, 0x6c, 0x0f, 0x5d, 0x13, 0x87, 0x8e, 0x55, 0x9c, ++ 0x8e, 0x27, 0x64, 0xfd, 0x16, 0x8a, 0x6c, 0x88, 0x5c, 0xdd, 0x81, 0xfc, ++ 0xe9, 0x82, 0xf1, 0xd7, 0x80, 0x7f, 0x19, 0xe4, 0xdb, 0x31, 0xf2, 0x35, ++ 0x5f, 0x56, 0x91, 0x2e, 0xb9, 0x91, 0xac, 0xc6, 0xf9, 0x85, 0x84, 0x2d, ++ 0x60, 0x47, 0x26, 0x1b, 0x0f, 0xab, 0x42, 0x14, 0x19, 0xc6, 0x71, 0xe0, ++ 0x12, 0xda, 0xdd, 0x36, 0x4e, 0x9f, 0x8d, 0x3e, 0xd7, 0x8a, 0x13, 0x8f, ++ 0x97, 0xdc, 0xe8, 0x8d, 0x84, 0xe9, 0x38, 0x91, 0x0f, 0xd9, 0x38, 0x75, ++ 0x2d, 0x30, 0xca, 0xe5, 0x1a, 0x4e, 0xff, 0xc3, 0x9c, 0x2e, 0x30, 0x4f, ++ 0x50, 0x7f, 0x19, 0xd4, 0x4f, 0xf9, 0x25, 0xff, 0x59, 0x5d, 0x1d, 0x6f, ++ 0x9e, 0xd8, 0x2a, 0xf8, 0xcf, 0xf9, 0x65, 0x2e, 0xdf, 0xf5, 0x25, 0xd6, ++ 0x7f, 0x51, 0x7e, 0x93, 0xcc, 0xf4, 0x29, 0x78, 0xe5, 0xe3, 0xb6, 0x6c, ++ 0x5a, 0x5e, 0xe2, 0x71, 0x13, 0xf2, 0x2e, 0x0d, 0x1f, 0x4e, 0x34, 0x7e, ++ 0xab, 0x43, 0x71, 0xf4, 0x7b, 0xae, 0x6c, 0xe1, 0xfd, 0x0d, 0x4a, 0x97, ++ 0xa3, 0x0f, 0xf3, 0xb9, 0x5c, 0xca, 0xd5, 0x74, 0xdc, 0xa0, 0x7f, 0xb5, ++ 0x46, 0x3e, 0x6e, 0xe0, 0xfd, 0xba, 0x93, 0xd7, 0x7b, 0x97, 0xa4, 0xff, ++ 0x3d, 0xc8, 0xc3, 0x75, 0x52, 0xf3, 0x3f, 0xc0, 0x95, 0xd4, 0x0c, 0xa0, ++ 0xfe, 0x81, 0x8c, 0x43, 0xb9, 0x1b, 0x89, 0xfe, 0xdf, 0xf8, 0xfb, 0xb5, ++ 0xa0, 0xa7, 0xa4, 0xde, 0xf8, 0x9e, 0x3e, 0x5f, 0x8f, 0xdf, 0xb5, 0x0c, ++ 0xe0, 0xfa, 0x94, 0x78, 0x7e, 0x50, 0xd2, 0x37, 0xca, 0xec, 0x7d, 0x1b, ++ 0x7e, 0xa7, 0x1b, 0xdf, 0x53, 0x39, 0x6c, 0x87, 0xe7, 0x54, 0x5e, 0x88, ++ 0x5c, 0x0c, 0xcf, 0x19, 0x3f, 0xa9, 0x9c, 0x10, 0x3b, 0xbd, 0x6f, 0xdb, ++ 0x79, 0xf7, 0x97, 0x81, 0xaf, 0xf4, 0xfb, 0xc7, 0xb1, 0x7e, 0x72, 0xd2, ++ 0xf0, 0xbd, 0x15, 0x0c, 0x44, 0x3a, 0xbb, 0x4a, 0xc5, 0xec, 0xfa, 0x2c, ++ 0xc8, 0x1d, 0xf7, 0x4f, 0x37, 0xb4, 0xe8, 0xc8, 0x57, 0x95, 0xac, 0xe6, ++ 0xfe, 0x33, 0x9b, 0xcf, 0xe6, 0xf1, 0xf9, 0xcc, 0xfe, 0x57, 0x36, 0x0f, ++ 0x9e, 0x73, 0xa9, 0x18, 0xd7, 0x52, 0x92, 0xf4, 0x50, 0x98, 0x5e, 0xd3, ++ 0x5d, 0x61, 0x1d, 0xe2, 0x81, 0x53, 0xc8, 0x40, 0x10, 0xfc, 0xb1, 0x65, ++ 0xb7, 0xcb, 0x06, 0x3b, 0xdf, 0x62, 0x9a, 0x5f, 0xbe, 0x7c, 0x8f, 0x71, ++ 0xfe, 0xbd, 0x73, 0x65, 0x96, 0xe1, 0xfe, 0xab, 0x8f, 0xe4, 0x19, 0xee, ++ 0x03, 0x6b, 0x6e, 0x34, 0xd4, 0xb7, 0x7c, 0xe3, 0x6c, 0xc3, 0xfd, 0x3d, ++ 0x5b, 0xcb, 0x0d, 0xf7, 0x2b, 0x76, 0x54, 0x1b, 0xbe, 0xbf, 0xef, 0x27, ++ 0x8d, 0x86, 0xf7, 0xdf, 0x78, 0x6e, 0xa9, 0xe1, 0x7e, 0xe5, 0x0b, 0x77, ++ 0xc4, 0x5d, 0xdf, 0x14, 0xf3, 0xdd, 0x66, 0xcb, 0xdb, 0x2b, 0x9b, 0x69, ++ 0xbf, 0x36, 0xc0, 0xab, 0x18, 0xbc, 0xa8, 0x44, 0xd7, 0x2f, 0x2d, 0x0c, ++ 0x8f, 0x19, 0xbf, 0xa3, 0xe2, 0xe7, 0x51, 0xe6, 0x42, 0x39, 0x82, 0xa1, ++ 0x08, 0xb3, 0x9c, 0x2a, 0xa6, 0xf5, 0xcf, 0xc1, 0x31, 0xfd, 0x79, 0xc8, ++ 0x30, 0xdf, 0x1e, 0x08, 0xe6, 0x64, 0x00, 0x54, 0xd0, 0x73, 0x14, 0x0d, ++ 0xf1, 0x7f, 0x50, 0x1f, 0xc8, 0xcf, 0x8c, 0xe2, 0x81, 0x6a, 0xcf, 0x8a, ++ 0xa6, 0x78, 0xf3, 0xaf, 0xa0, 0x47, 0xe1, 0xe5, 0xfc, 0x64, 0xb0, 0x1a, ++ 0xc6, 0x4d, 0x57, 0x8c, 0xe5, 0x14, 0xbe, 0x5e, 0xab, 0x79, 0x23, 0x18, ++ 0x87, 0x31, 0xaf, 0xd7, 0x2a, 0x9e, 0xf9, 0x38, 0xbf, 0x9b, 0xe9, 0x3d, ++ 0x2d, 0xa7, 0x64, 0x80, 0x5d, 0xa2, 0x75, 0x7b, 0x70, 0x9d, 0x56, 0xbb, ++ 0xbc, 0xf9, 0x74, 0xd2, 0xfe, 0x51, 0x4b, 0x78, 0x59, 0xfd, 0xe3, 0xed, ++ 0xf9, 0xa1, 0x9f, 0x79, 0x89, 0xfb, 0x35, 0xaf, 0x24, 0x22, 0x03, 0x79, ++ 0x97, 0xdb, 0xaf, 0x28, 0x9d, 0x46, 0xdc, 0x23, 0xd6, 0xc9, 0x17, 0xb2, ++ 0xa2, 0xa4, 0x2c, 0xe7, 0x39, 0xf4, 0xc7, 0x16, 0x02, 0x7d, 0x30, 0x3f, ++ 0x97, 0x30, 0xbc, 0x63, 0xa7, 0xff, 0xb1, 0x79, 0x96, 0xf1, 0xbf, 0x91, ++ 0x97, 0x6f, 0x7e, 0xc4, 0x65, 0x05, 0x7c, 0xdc, 0x5c, 0x63, 0xa4, 0xb3, ++ 0x91, 0xe3, 0x28, 0xaa, 0x87, 0x0a, 0xd8, 0x89, 0xb2, 0x02, 0xd3, 0x7b, ++ 0xa0, 0x73, 0x16, 0x94, 0x33, 0xe2, 0xa5, 0x3e, 0x2e, 0x8f, 0x9a, 0xc2, ++ 0xd7, 0xcb, 0xe7, 0x92, 0xb9, 0x38, 0x0e, 0x5c, 0x6f, 0x17, 0x0b, 0xbd, ++ 0xad, 0x65, 0x71, 0x0e, 0xe2, 0x8a, 0xbf, 0x8e, 0xde, 0x70, 0x81, 0x16, ++ 0x9a, 0x8d, 0xed, 0xa3, 0xfc, 0x89, 0xe7, 0xaf, 0x15, 0xe4, 0x25, 0xc3, ++ 0x77, 0x0b, 0xdb, 0x89, 0xc7, 0x46, 0xf1, 0xc9, 0xe6, 0x39, 0xeb, 0x5c, ++ 0x55, 0x80, 0xf3, 0x75, 0xab, 0xb7, 0x9e, 0x96, 0xae, 0xf6, 0xf2, 0x78, ++ 0x93, 0x2e, 0x23, 0x9e, 0xbd, 0xba, 0x80, 0xdd, 0x37, 0xd5, 0xb0, 0xf8, ++ 0x53, 0x43, 0x60, 0x00, 0xe3, 0x80, 0x4d, 0xf7, 0x84, 0xd6, 0xc1, 0xf5, ++ 0xaa, 0xfb, 0xc2, 0x0a, 0xd2, 0x61, 0xe2, 0xeb, 0xb3, 0x9e, 0x50, 0x1a, ++ 0x62, 0x03, 0xce, 0xdf, 0x2c, 0xce, 0xaf, 0x2c, 0xc1, 0x57, 0xce, 0x47, ++ 0x61, 0xc7, 0xaf, 0x5a, 0x69, 0x1c, 0xc7, 0xa6, 0x12, 0x23, 0xbf, 0x16, ++ 0x71, 0x7e, 0x9a, 0xf9, 0xbc, 0x88, 0xf3, 0x71, 0x91, 0x89, 0x8f, 0x3d, ++ 0xf0, 0x07, 0xe5, 0xcb, 0x9c, 0x04, 0x7c, 0x5c, 0xc8, 0xf1, 0xa8, 0x7d, ++ 0x0e, 0xf7, 0xef, 0x46, 0xd3, 0xe3, 0xfa, 0x8d, 0xcf, 0xf2, 0xf8, 0x98, ++ 0x90, 0x1f, 0xc5, 0x34, 0xaf, 0x09, 0xfb, 0x31, 0x36, 0xbf, 0x71, 0xf9, ++ 0x7d, 0x02, 0xec, 0x38, 0xe0, 0x3c, 0x17, 0xc7, 0x29, 0x7c, 0xde, 0x4b, ++ 0xa4, 0x47, 0xfe, 0xfc, 0xd6, 0x6d, 0x7e, 0x88, 0xb7, 0x66, 0x58, 0x0d, ++ 0xeb, 0x17, 0xf3, 0x79, 0x5f, 0xcb, 0xf2, 0xd9, 0x7a, 0x47, 0x59, 0x86, ++ 0x8c, 0xb8, 0xbf, 0xcc, 0xfd, 0x86, 0x21, 0xce, 0x5c, 0x36, 0x16, 0x1f, ++ 0xd5, 0xb5, 0xda, 0xb9, 0x51, 0xf9, 0xec, 0x19, 0x62, 0xfe, 0x47, 0x9b, ++ 0xfb, 0xa4, 0x0c, 0xe3, 0xd4, 0x98, 0xcf, 0x70, 0xfe, 0x46, 0xce, 0x1f, ++ 0x11, 0xff, 0xeb, 0xe2, 0xeb, 0x46, 0x66, 0xba, 0x0e, 0xcf, 0x0c, 0x66, ++ 0x03, 0x3e, 0x3a, 0x72, 0x3e, 0x98, 0xfd, 0x50, 0x09, 0xc4, 0x7f, 0x24, ++ 0x94, 0x93, 0xee, 0x9b, 0x1f, 0xcc, 0x66, 0xf9, 0x02, 0x3c, 0x9e, 0xcb, ++ 0xdb, 0x7b, 0x65, 0x24, 0x88, 0xfe, 0xdb, 0x91, 0xa1, 0x89, 0xd7, 0x17, ++ 0x05, 0xce, 0x37, 0xcb, 0x4d, 0x99, 0x37, 0x84, 0xeb, 0x8c, 0x65, 0x43, ++ 0x1d, 0x32, 0xf4, 0xb7, 0x3e, 0x42, 0xe7, 0x20, 0xda, 0xf5, 0xf9, 0xe1, ++ 0x5f, 0xc8, 0x9e, 0x22, 0x8c, 0x4b, 0x2b, 0x40, 0x4f, 0x93, 0x7b, 0xb9, ++ 0x82, 0xf1, 0x32, 0x77, 0xab, 0x02, 0xf1, 0xe5, 0x7a, 0xf7, 0xce, 0x6a, ++ 0xe0, 0x87, 0x8f, 0x84, 0x36, 0x38, 0x21, 0xae, 0xe6, 0x91, 0xbc, 0x61, ++ 0xe0, 0x63, 0x21, 0xd3, 0xdf, 0xfb, 0xe8, 0x7f, 0xb1, 0xfa, 0x2b, 0xe8, ++ 0xad, 0x1b, 0x0e, 0x28, 0xa0, 0xef, 0x75, 0x1e, 0xa3, 0x5f, 0xe3, 0xe3, ++ 0xf2, 0x56, 0xeb, 0x36, 0x3d, 0xcf, 0xaf, 0x43, 0x79, 0xf3, 0x99, 0xe4, ++ 0x6d, 0xbd, 0x90, 0xb3, 0x6b, 0xc8, 0x35, 0xb1, 0x72, 0x26, 0xe2, 0xd6, ++ 0xea, 0x48, 0x2e, 0xd7, 0xd7, 0xf8, 0x72, 0xd6, 0xcd, 0xf9, 0xf1, 0xef, ++ 0x3c, 0xce, 0xfa, 0x07, 0x1e, 0x9f, 0x3e, 0xcd, 0xd7, 0xf5, 0x7e, 0xb7, ++ 0xd6, 0x83, 0xd7, 0x57, 0xd6, 0x16, 0xe0, 0xf3, 0x43, 0x6b, 0xbd, 0x78, ++ 0xff, 0xd6, 0xda, 0x52, 0xbc, 0xff, 0x2d, 0xc4, 0x79, 0xe9, 0xfd, 0x1b, ++ 0x3c, 0x8e, 0xfb, 0xfa, 0xda, 0x66, 0xbc, 0x3f, 0xb1, 0xb6, 0x05, 0xef, ++ 0xfb, 0x79, 0x9c, 0x56, 0xc8, 0xf1, 0x26, 0xbe, 0x9e, 0x52, 0x2b, 0x77, ++ 0x63, 0x7c, 0xb1, 0xd1, 0x1b, 0xb0, 0xbb, 0x62, 0xe4, 0xa9, 0x91, 0xd3, ++ 0x8d, 0xa2, 0x0f, 0x38, 0xa4, 0x30, 0x7e, 0xfc, 0xd5, 0x36, 0x73, 0x9f, ++ 0x02, 0xf2, 0x75, 0x72, 0x4c, 0x4f, 0x08, 0xda, 0x8b, 0x25, 0x4d, 0x39, ++ 0xbb, 0xb6, 0x50, 0xbe, 0xd8, 0xbe, 0x4b, 0x02, 0x80, 0x2b, 0x6d, 0x07, ++ 0xfe, 0x55, 0xb9, 0x96, 0xca, 0x7f, 0x63, 0x7d, 0x8e, 0x75, 0x05, 0xb4, ++ 0x17, 0xec, 0x50, 0x66, 0x83, 0x3c, 0x86, 0xff, 0x55, 0xc9, 0x83, 0xe7, ++ 0x4d, 0x37, 0x5b, 0xef, 0x8e, 0xd3, 0xbe, 0x68, 0x27, 0x51, 0xfb, 0x66, ++ 0xfb, 0xb6, 0xb4, 0xde, 0xe8, 0x07, 0x97, 0x89, 0x38, 0xfa, 0x50, 0x20, ++ 0x08, 0xfd, 0x9c, 0x36, 0x14, 0x08, 0x03, 0x7d, 0x65, 0x6e, 0xd5, 0x13, ++ 0x2f, 0x2e, 0xdc, 0x3b, 0x7d, 0x85, 0x1b, 0xe4, 0xa9, 0xed, 0x4c, 0xc0, ++ 0x0d, 0xf2, 0xd4, 0x36, 0x7d, 0xb7, 0xcc, 0xfc, 0x75, 0x16, 0x0f, 0x57, ++ 0xb9, 0x9c, 0x8a, 0xf2, 0x65, 0xee, 0x5d, 0x06, 0x3d, 0x54, 0x39, 0xdd, ++ 0x9d, 0xf4, 0x39, 0xd0, 0xdb, 0x39, 0x89, 0x1e, 0x74, 0x71, 0xbe, 0x89, ++ 0x72, 0x3e, 0x25, 0x2c, 0xbb, 0xb4, 0xc4, 0xfd, 0xf3, 0x99, 0xe2, 0xe5, ++ 0x1b, 0xa5, 0xf8, 0x7e, 0x6b, 0xb2, 0x95, 0xe1, 0x5a, 0x27, 0x5f, 0x5f, ++ 0xa5, 0x36, 0x53, 0x01, 0x3d, 0x03, 0x11, 0x05, 0xfa, 0xa7, 0x51, 0xb1, ++ 0x01, 0xfd, 0xd2, 0x34, 0x16, 0xb7, 0x70, 0x78, 0x03, 0xdc, 0x2e, 0x1b, ++ 0xe7, 0xf1, 0xb4, 0xd2, 0xe6, 0x66, 0xb0, 0x4b, 0x5a, 0x06, 0xf1, 0xd6, ++ 0x81, 0x79, 0xd3, 0x06, 0xdd, 0x20, 0x37, 0x72, 0xe9, 0xfc, 0x33, 0x30, ++ 0xcf, 0x92, 0xc2, 0x18, 0xbb, 0x0d, 0x7e, 0x8f, 0xd9, 0xff, 0x8f, 0xbd, ++ 0x97, 0x71, 0xea, 0x0a, 0xa6, 0xa4, 0xc3, 0xd5, 0x5c, 0x8e, 0xf1, 0x57, ++ 0xe3, 0x22, 0xd4, 0x7e, 0x33, 0xa3, 0xef, 0x71, 0x1e, 0xe7, 0x10, 0xfc, ++ 0xd5, 0x38, 0x7f, 0xcb, 0x3c, 0x47, 0xfe, 0x0d, 0xec, 0xea, 0xe3, 0x5e, ++ 0x16, 0x8f, 0x79, 0x3c, 0x83, 0xad, 0xcb, 0x9e, 0x2b, 0x5d, 0x8e, 0xb8, ++ 0xac, 0x8c, 0xfb, 0x05, 0x36, 0xb2, 0x0d, 0xcb, 0x27, 0x93, 0x0e, 0xbc, ++ 0x6e, 0xe0, 0x7a, 0x76, 0xae, 0xf4, 0x24, 0x01, 0xbd, 0x97, 0x15, 0x8a, ++ 0x9b, 0x33, 0x80, 0x1e, 0x7b, 0x28, 0x48, 0xbf, 0x77, 0x9a, 0xec, 0xbb, ++ 0xa2, 0x19, 0xf9, 0x2d, 0x51, 0x9e, 0xdc, 0x09, 0xf8, 0x7a, 0x48, 0x31, ++ 0xf8, 0x1b, 0x52, 0x29, 0xb3, 0xf3, 0x76, 0xf0, 0xd7, 0xc1, 0x8f, 0xe1, ++ 0xf8, 0x25, 0xea, 0xe7, 0x05, 0xc8, 0x25, 0x60, 0xfe, 0x65, 0xe2, 0xa9, ++ 0x8d, 0x56, 0xa3, 0x3f, 0x26, 0xae, 0x43, 0x8a, 0x05, 0xe5, 0xc1, 0x65, ++ 0x35, 0xe5, 0xd3, 0xfd, 0x5f, 0xcf, 0xbf, 0xc3, 0x9f, 0x2b, 0xff, 0x84, ++ 0x9f, 0x38, 0x86, 0xf3, 0x0e, 0x7e, 0x9d, 0xc0, 0x7a, 0x8c, 0xc8, 0x27, ++ 0x14, 0xe5, 0x5f, 0x31, 0xc5, 0x9b, 0xd4, 0x6c, 0xb6, 0x0e, 0x63, 0xae, ++ 0xf7, 0x36, 0x2b, 0xe3, 0x7b, 0xa5, 0x95, 0xe3, 0x63, 0x81, 0x27, 0x7c, ++ 0xe6, 0x76, 0x92, 0x82, 0xc0, 0x4f, 0x95, 0xfa, 0x53, 0x49, 0xd2, 0xf8, ++ 0x7a, 0x12, 0xb5, 0x47, 0x86, 0x8a, 0x27, 0x89, 0x5b, 0xaf, 0xc3, 0xf6, ++ 0x4f, 0x28, 0x2e, 0xe6, 0x4f, 0xf0, 0x7c, 0x20, 0xea, 0x96, 0x4b, 0x06, ++ 0xff, 0xc4, 0xae, 0xbb, 0x63, 0xd7, 0xfb, 0xc7, 0xbe, 0x77, 0x5b, 0x0c, ++ 0x7a, 0x3a, 0x9e, 0x6e, 0xc6, 0x9f, 0xcf, 0x9b, 0xde, 0x85, 0xd4, 0x21, ++ 0x85, 0xeb, 0x22, 0x61, 0x87, 0x4b, 0x19, 0x9e, 0x5c, 0xec, 0xa1, 0x78, ++ 0x92, 0xfe, 0xb9, 0x58, 0x63, 0x72, 0x7a, 0xdc, 0x2f, 0x85, 0xd6, 0xa3, ++ 0x9c, 0xea, 0x06, 0x7f, 0xab, 0xbe, 0xb4, 0xee, 0x0c, 0xda, 0x25, 0xea, ++ 0x8f, 0xa8, 0x73, 0x39, 0x4e, 0xa7, 0xf4, 0xb7, 0x43, 0xbd, 0xb4, 0x9e, ++ 0xd7, 0xa7, 0x8b, 0xef, 0xc6, 0xec, 0x89, 0xe5, 0xd2, 0x4d, 0xe3, 0xeb, ++ 0x69, 0xae, 0x61, 0xb8, 0x87, 0x04, 0x7f, 0xb9, 0x20, 0x36, 0x7e, 0xd0, ++ 0x4c, 0xc5, 0xa5, 0xa0, 0x18, 0xea, 0x65, 0xdf, 0xd3, 0xa2, 0xbd, 0x97, ++ 0xe2, 0xd1, 0xc1, 0xed, 0x56, 0x73, 0xe9, 0x83, 0x8b, 0x34, 0x27, 0xdc, ++ 0xeb, 0xd2, 0xd3, 0x80, 0xf7, 0x0a, 0x63, 0xf0, 0x01, 0xf0, 0x35, 0xdf, ++ 0x66, 0xe4, 0xb3, 0xc9, 0xfe, 0xd5, 0x8c, 0xb3, 0x7b, 0x46, 0x7b, 0x3b, ++ 0x9f, 0xca, 0xef, 0x3e, 0xda, 0x4e, 0xbd, 0xbc, 0xba, 0x09, 0x42, 0xde, ++ 0x75, 0xdb, 0x97, 0xef, 0x7d, 0x15, 0xc9, 0x11, 0x7e, 0x88, 0x27, 0x6e, ++ 0xbd, 0x47, 0xe1, 0x8f, 0x5b, 0x01, 0xfd, 0x19, 0xf1, 0x0a, 0xf1, 0xb2, ++ 0x3c, 0x8e, 0xea, 0xa0, 0xa7, 0x09, 0xf9, 0x9e, 0x21, 0x91, 0x50, 0x0e, ++ 0xd0, 0x6f, 0xa4, 0x63, 0x7e, 0xb6, 0xc9, 0x0f, 0xcb, 0x30, 0xf7, 0x63, ++ 0x1b, 0x8e, 0xe3, 0x01, 0x85, 0xce, 0x23, 0x74, 0xbc, 0x0e, 0xd0, 0x71, ++ 0xdc, 0x86, 0xfe, 0x71, 0x7c, 0x7f, 0x4a, 0xf8, 0x79, 0x95, 0x39, 0xa3, ++ 0xe8, 0x4f, 0x09, 0x7f, 0x8f, 0x70, 0x7f, 0xcf, 0x45, 0xff, 0x8b, 0xc5, ++ 0x63, 0x15, 0xbc, 0xbc, 0xff, 0x11, 0x8f, 0x02, 0xf8, 0xd7, 0x6f, 0x37, ++ 0xc5, 0x99, 0xc7, 0xf2, 0x8f, 0x09, 0xfa, 0x53, 0x95, 0xc4, 0x48, 0x6f, ++ 0x05, 0xf7, 0xfb, 0x2a, 0x4c, 0x7e, 0x9f, 0xd0, 0xf7, 0x97, 0x84, 0xbd, ++ 0x14, 0x7e, 0x2d, 0xb7, 0x87, 0xb7, 0x09, 0x7f, 0xaa, 0x62, 0xe2, 0xf5, ++ 0xe5, 0x3e, 0x53, 0x3e, 0x5d, 0x0d, 0x25, 0xbc, 0xe3, 0x0a, 0xf4, 0x80, ++ 0x00, 0x55, 0xb0, 0xde, 0x44, 0xc6, 0xf8, 0x64, 0x90, 0xaf, 0xde, 0x9c, ++ 0x6b, 0x3b, 0xc2, 0x94, 0xaf, 0xb7, 0x79, 0x93, 0xd8, 0x7a, 0x0b, 0xa5, ++ 0x53, 0x11, 0xf6, 0x1c, 0xf9, 0xc4, 0x70, 0xf6, 0x22, 0x5e, 0xfe, 0x36, ++ 0x8f, 0x8a, 0xf2, 0xef, 0xd3, 0xd8, 0xfa, 0x45, 0xd3, 0x24, 0x71, 0x0b, ++ 0x5f, 0x29, 0x5b, 0x37, 0x38, 0x61, 0x97, 0xd8, 0x7c, 0x10, 0x24, 0x6f, ++ 0x92, 0x98, 0xfc, 0xf0, 0x6a, 0x0f, 0xb3, 0xd7, 0x9a, 0x49, 0x2e, 0xb2, ++ 0x3d, 0xcd, 0x35, 0xb0, 0x0e, 0xa4, 0x29, 0x92, 0x37, 0x44, 0xc6, 0xcb, ++ 0x6b, 0x0d, 0xf7, 0xe7, 0xe0, 0xfb, 0x35, 0x94, 0x15, 0x35, 0xf9, 0xd4, ++ 0x27, 0x2f, 0x8e, 0x97, 0x5f, 0x3e, 0x00, 0xa1, 0x55, 0x52, 0x41, 0x69, ++ 0x78, 0x36, 0x27, 0xf1, 0xf8, 0xea, 0xde, 0x48, 0x35, 0x0c, 0xcf, 0xe5, ++ 0x8e, 0x2f, 0x31, 0xe1, 0xec, 0x13, 0x91, 0x77, 0x30, 0xaf, 0xeb, 0x5c, ++ 0xa1, 0x84, 0xeb, 0x3e, 0xbd, 0x39, 0x1f, 0xa3, 0x7f, 0x20, 0xd6, 0x77, ++ 0xa2, 0xfc, 0x3b, 0x8c, 0xf9, 0x28, 0xbe, 0xd2, 0x8f, 0xd0, 0x5f, 0x19, ++ 0xcb, 0xdb, 0xe2, 0xf5, 0x2d, 0x12, 0xf5, 0x95, 0x1e, 0xc4, 0xf5, 0x9a, ++ 0xef, 0xb9, 0x0e, 0x62, 0x9e, 0xc8, 0x71, 0x58, 0xc7, 0xa5, 0xdf, 0x1f, ++ 0x57, 0x22, 0x1a, 0xf8, 0x21, 0x0b, 0x04, 0xbe, 0xa2, 0x1c, 0x0d, 0x0b, ++ 0x7e, 0xe6, 0x40, 0x9e, 0x04, 0xab, 0x2f, 0xcc, 0xfd, 0xaa, 0x13, 0xf6, ++ 0x37, 0x1c, 0x60, 0x37, 0x45, 0xde, 0x49, 0x8f, 0x4f, 0xae, 0x8f, 0x17, ++ 0xe7, 0xac, 0x94, 0x59, 0x9c, 0x59, 0x5c, 0x6f, 0x50, 0xd9, 0xbc, 0x33, ++ 0x57, 0x65, 0x78, 0x4e, 0xdc, 0x8b, 0xf1, 0x1d, 0x93, 0x27, 0xf9, 0x68, ++ 0x09, 0xf3, 0xc3, 0xbf, 0x63, 0x18, 0x77, 0x73, 0xfd, 0x50, 0xbe, 0x05, ++ 0xe3, 0x83, 0xe1, 0xc2, 0x89, 0xfc, 0xd1, 0x26, 0x13, 0x9f, 0x67, 0xaa, ++ 0x7c, 0xde, 0xe3, 0x78, 0xa3, 0x3b, 0x32, 0x31, 0xae, 0x15, 0xfd, 0x34, ++ 0xf3, 0xc1, 0xdc, 0x4f, 0xf3, 0x77, 0x4e, 0x95, 0xc5, 0xcb, 0xee, 0xb1, ++ 0xea, 0x37, 0xaa, 0x73, 0xa2, 0xed, 0x88, 0xf9, 0xce, 0x5c, 0x7e, 0xb1, ++ 0x3d, 0x7e, 0x5e, 0x8e, 0xbf, 0xd4, 0x18, 0x9f, 0x34, 0xe7, 0xe5, 0xdc, ++ 0x63, 0x0d, 0x94, 0xa9, 0x94, 0x9f, 0xd5, 0x8a, 0xb4, 0x31, 0xd5, 0x83, ++ 0x76, 0x0d, 0xf5, 0xe9, 0xc0, 0x45, 0x0d, 0x71, 0xcc, 0xb9, 0xc8, 0x81, ++ 0x8d, 0x30, 0xac, 0x87, 0x46, 0x59, 0x7c, 0xb4, 0x82, 0xc8, 0x21, 0x1b, ++ 0x9b, 0x17, 0x9a, 0x60, 0xdd, 0x4e, 0xe8, 0x8d, 0x90, 0x7f, 0x33, 0x1d, ++ 0x93, 0xb5, 0x5f, 0x31, 0x3a, 0x88, 0xfe, 0xb8, 0xff, 0x42, 0xa4, 0x06, ++ 0xe4, 0xef, 0x36, 0x5f, 0x2f, 0xda, 0xd5, 0x85, 0xd4, 0xae, 0x4e, 0x89, ++ 0x63, 0x57, 0xe7, 0xcb, 0xc3, 0x1b, 0xa7, 0x80, 0xfe, 0x7a, 0xd9, 0xfe, ++ 0x8e, 0x13, 0xbf, 0x1f, 0xa8, 0xc1, 0x7b, 0x4d, 0xc2, 0x7c, 0x58, 0xbd, ++ 0x22, 0x4f, 0x99, 0x02, 0x72, 0xe0, 0x8a, 0x1f, 0xaf, 0x9a, 0xc7, 0xe5, ++ 0x64, 0xfc, 0x7a, 0x9e, 0xb0, 0xab, 0x2e, 0x05, 0x70, 0x83, 0x39, 0xde, ++ 0x36, 0x8f, 0xeb, 0xdd, 0x3c, 0x93, 0x3c, 0x04, 0xd4, 0x31, 0x1c, 0x74, ++ 0xcb, 0xa5, 0xbc, 0xc9, 0xc7, 0x29, 0x91, 0x3c, 0x9c, 0x8b, 0x9c, 0x7b, ++ 0x38, 0x5e, 0x1c, 0x55, 0x5c, 0xab, 0x13, 0x8c, 0xef, 0xfd, 0xc4, 0xc4, ++ 0xdf, 0x6e, 0x63, 0xfc, 0xd9, 0x5c, 0x8f, 0x88, 0x07, 0x11, 0xb9, 0x3b, ++ 0x1b, 0xf4, 0x59, 0xf8, 0xbf, 0xe6, 0x72, 0xed, 0x2a, 0x5b, 0xf7, 0x38, ++ 0x54, 0x74, 0x2f, 0x89, 0xcd, 0xab, 0x12, 0xf6, 0x40, 0x2d, 0xed, 0xd0, ++ 0x20, 0x2e, 0xde, 0x5f, 0x3a, 0xf1, 0x7c, 0x61, 0xce, 0x1f, 0xf4, 0x13, ++ 0x63, 0x9e, 0x58, 0xb5, 0xdd, 0xb8, 0x1e, 0xfb, 0x94, 0xa2, 0x6f, 0x06, ++ 0x79, 0x8c, 0xe2, 0xa4, 0x56, 0xe6, 0xaf, 0x96, 0xb6, 0xa2, 0xbf, 0xba, ++ 0xa8, 0x90, 0xef, 0x0b, 0x2a, 0xba, 0x17, 0xfd, 0x53, 0xe1, 0x57, 0xb7, ++ 0xdd, 0xba, 0x07, 0xf3, 0xb9, 0x44, 0xbe, 0x96, 0xf0, 0x4f, 0xcd, 0x74, ++ 0xf7, 0x4f, 0x7f, 0x11, 0xf3, 0x79, 0x26, 0xa3, 0x5b, 0xf8, 0xf1, 0x47, ++ 0x6d, 0x32, 0x5b, 0x87, 0xa0, 0x7e, 0xbb, 0x07, 0xfd, 0x76, 0x8a, 0xfb, ++ 0xe2, 0x7c, 0xf7, 0x8a, 0x8d, 0xf1, 0xeb, 0x57, 0x8a, 0xbe, 0x13, 0xf4, ++ 0x75, 0xa3, 0x55, 0x77, 0xb7, 0xc2, 0x3a, 0x63, 0x91, 0xcd, 0xfb, 0x7c, ++ 0x9c, 0x71, 0x18, 0xb2, 0x31, 0xfd, 0xee, 0x4f, 0xb0, 0xde, 0xfa, 0x07, ++ 0x58, 0xf8, 0x98, 0x83, 0xfd, 0x40, 0x3e, 0x98, 0xe7, 0x1b, 0xe1, 0xc7, ++ 0x8a, 0x7d, 0x4a, 0xd3, 0xdc, 0x4c, 0x6f, 0x1b, 0xb9, 0x1f, 0x5b, 0x5e, ++ 0xd8, 0x8a, 0xfa, 0x98, 0xe6, 0xa6, 0x7e, 0x2b, 0xf0, 0xcd, 0xcb, 0xfc, ++ 0x56, 0x32, 0x6c, 0xf4, 0x53, 0x17, 0x69, 0x03, 0x59, 0x30, 0xfe, 0xe6, ++ 0xf9, 0x4e, 0x1e, 0xe5, 0x7e, 0xed, 0x65, 0xfa, 0xad, 0x9b, 0x92, 0x98, ++ 0x1c, 0x05, 0x5c, 0xc4, 0xee, 0xa6, 0xef, 0x93, 0x14, 0x0a, 0x4d, 0xe9, ++ 0xfc, 0xf7, 0xa4, 0x5c, 0x75, 0x10, 0xf8, 0xb1, 0x29, 0x8d, 0xa0, 0x3f, ++ 0x70, 0x3c, 0x4d, 0x0d, 0xed, 0x8a, 0x13, 0x6f, 0x78, 0x8b, 0xcb, 0x5b, ++ 0xad, 0xbc, 0xd2, 0x20, 0x6f, 0x15, 0x1c, 0x97, 0xa8, 0x35, 0x83, 0x1a, ++ 0xc4, 0x03, 0x8e, 0x8f, 0xb2, 0x38, 0x5e, 0xa2, 0x71, 0xdb, 0x62, 0xc2, ++ 0xe9, 0xb9, 0x05, 0xc4, 0x6f, 0x73, 0xc2, 0x35, 0xe2, 0x07, 0x7e, 0xd0, ++ 0x7b, 0xdd, 0x86, 0xd7, 0x08, 0xe6, 0x67, 0x7f, 0xbf, 0x68, 0x45, 0x6e, ++ 0xbc, 0xfa, 0x76, 0xb5, 0x2b, 0x71, 0xe7, 0xa5, 0x3f, 0xf3, 0x71, 0x5b, ++ 0x22, 0xf2, 0xb5, 0xeb, 0x59, 0x3c, 0xf2, 0xfe, 0x42, 0x15, 0xe3, 0xc2, ++ 0xd3, 0xea, 0xdf, 0x3e, 0x8c, 0x72, 0xda, 0xc4, 0xe5, 0x74, 0xa1, 0x0d, ++ 0xfb, 0xdd, 0x5f, 0xa4, 0xe0, 0xb8, 0xf4, 0xdf, 0x9a, 0xd3, 0x01, 0xeb, ++ 0x9a, 0xfd, 0x45, 0x76, 0xcc, 0x47, 0xe9, 0x2d, 0xfa, 0xcd, 0xef, 0x21, ++ 0x5f, 0xbb, 0xa2, 0x54, 0x32, 0xe4, 0x97, 0x08, 0xf9, 0xad, 0x00, 0x5c, ++ 0x0d, 0xf5, 0xdb, 0x59, 0xbc, 0xf3, 0x7e, 0x37, 0xb3, 0xc3, 0xfd, 0x1a, ++ 0xc7, 0x2f, 0x3c, 0x6f, 0x64, 0x15, 0x1f, 0xd3, 0xe3, 0x7b, 0xdf, 0x75, ++ 0xc6, 0xe6, 0x8d, 0x2c, 0x15, 0x72, 0xdf, 0xc4, 0xe3, 0xe4, 0x26, 0xfc, ++ 0x44, 0xcd, 0x48, 0xdc, 0x75, 0x1c, 0x91, 0x47, 0xfc, 0x41, 0x13, 0x8b, ++ 0x0b, 0xdf, 0x2f, 0xfa, 0xbb, 0x6f, 0xcf, 0x46, 0xd0, 0xbb, 0x46, 0x2e, ++ 0x37, 0xbd, 0xe7, 0x57, 0xb8, 0x51, 0x3f, 0xf7, 0xb1, 0xfc, 0xbc, 0xb6, ++ 0xa2, 0x56, 0x8c, 0x17, 0xf5, 0x4e, 0x3f, 0xa5, 0xc2, 0xfd, 0x2a, 0xf7, ++ 0x7b, 0x2a, 0xdc, 0x9b, 0x71, 0x85, 0x18, 0xd7, 0xfb, 0x4b, 0x7f, 0xc5, ++ 0xf2, 0x23, 0xf9, 0xb8, 0xae, 0x82, 0x78, 0x3c, 0x95, 0xf7, 0x97, 0x33, ++ 0x6f, 0xb4, 0x7a, 0xe8, 0xfd, 0x92, 0xf0, 0xad, 0x56, 0x88, 0x77, 0x8a, ++ 0xf8, 0xec, 0xb8, 0x75, 0x28, 0xbe, 0x9e, 0x52, 0xc7, 0xba, 0x4f, 0xea, ++ 0xdc, 0x0c, 0x5f, 0x1f, 0xce, 0x74, 0x90, 0xe4, 0x0c, 0xe0, 0x97, 0x1c, ++ 0x92, 0x80, 0x6f, 0xe1, 0x24, 0x92, 0x0c, 0xf9, 0x67, 0x6e, 0x6b, 0x28, ++ 0x89, 0xde, 0x37, 0x2a, 0x83, 0x33, 0x01, 0xb7, 0x38, 0x4c, 0x78, 0xf1, ++ 0x83, 0x5f, 0xef, 0xc9, 0x06, 0xfd, 0x3e, 0x34, 0xeb, 0x7d, 0x05, 0xda, ++ 0xbd, 0xba, 0xf4, 0xed, 0x36, 0xe8, 0xc7, 0x55, 0xa5, 0x7b, 0x30, 0xde, ++ 0x9f, 0xb5, 0x6f, 0x4f, 0x5f, 0x3a, 0xad, 0x67, 0x51, 0x01, 0xf1, 0xea, ++ 0x9e, 0xf1, 0xf4, 0xd4, 0xf2, 0xf9, 0xe9, 0xfe, 0x0c, 0x96, 0x2f, 0x74, ++ 0xbf, 0x37, 0x14, 0x84, 0x7d, 0x67, 0x67, 0x2f, 0xb2, 0xfd, 0x14, 0x55, ++ 0xbf, 0x7e, 0xa3, 0x1a, 0xa6, 0xb5, 0xf1, 0xeb, 0x32, 0x3a, 0x01, 0x1c, ++ 0x22, 0xd6, 0x75, 0x14, 0x37, 0x5f, 0x17, 0xe1, 0xeb, 0x13, 0xe4, 0xe2, ++ 0x25, 0x29, 0x76, 0xdc, 0x1a, 0x95, 0x80, 0x1d, 0xec, 0x6f, 0x5b, 0xe9, ++ 0x1b, 0x4e, 0xa0, 0x77, 0x09, 0xe7, 0x5b, 0xee, 0x5e, 0xb9, 0x15, 0xe4, ++ 0xbb, 0xe6, 0xd7, 0xb3, 0xbf, 0x02, 0x72, 0x42, 0x6e, 0xb5, 0xb9, 0xae, ++ 0xa1, 0x0d, 0x9e, 0x75, 0xfd, 0xd6, 0x79, 0xad, 0xc6, 0xde, 0xdf, 0xcb, ++ 0xea, 0x9d, 0x17, 0xa0, 0xe5, 0x1b, 0x0b, 0xf7, 0x64, 0xaf, 0x28, 0x1a, ++ 0x6f, 0x5f, 0xc6, 0xf4, 0xa7, 0xf0, 0x2f, 0x6b, 0x03, 0x94, 0x9e, 0xe3, ++ 0x0b, 0x7e, 0x93, 0x0d, 0xb8, 0xed, 0x0d, 0x6a, 0x77, 0x3d, 0xd0, 0x2e, ++ 0xb7, 0x5b, 0x66, 0x7f, 0xc9, 0x3c, 0xaf, 0x9a, 0xf3, 0x62, 0xcc, 0xfd, ++ 0xce, 0x54, 0x16, 0xd7, 0xdb, 0xe6, 0xc0, 0x78, 0xff, 0xd8, 0x9d, 0x13, ++ 0x23, 0x67, 0xd4, 0x0e, 0x2c, 0x07, 0xfa, 0x57, 0x3d, 0x6d, 0xc7, 0x3c, ++ 0xae, 0xb4, 0x7d, 0xaf, 0xab, 0x32, 0xd8, 0x37, 0x8a, 0xdf, 0xeb, 0xa4, ++ 0xa8, 0x1c, 0xad, 0xe2, 0x72, 0xd4, 0xa8, 0x31, 0xfb, 0xd7, 0x56, 0x44, ++ 0x42, 0xeb, 0x25, 0x90, 0xbf, 0xf7, 0x9a, 0xca, 0x41, 0xef, 0x5e, 0x65, ++ 0xf9, 0x86, 0xd3, 0xf6, 0xbd, 0xcd, 0xf2, 0x47, 0x4d, 0xf3, 0x43, 0x3f, ++ 0x9f, 0x37, 0xc4, 0x7c, 0xdc, 0x3f, 0xfd, 0x1d, 0xd4, 0x9f, 0x0f, 0xf6, ++ 0x72, 0x7d, 0x09, 0x5a, 0xa4, 0xd8, 0x78, 0x92, 0x56, 0x1a, 0xb9, 0x1d, ++ 0xc6, 0x45, 0xf0, 0xa7, 0xdb, 0x64, 0x6f, 0x7c, 0xf6, 0xf8, 0x71, 0x93, ++ 0xd3, 0x36, 0x86, 0x57, 0x2b, 0x34, 0xf6, 0x5e, 0xa3, 0xf6, 0x1b, 0xd6, ++ 0xb5, 0xcd, 0xef, 0xab, 0xb8, 0x3f, 0x55, 0x0d, 0xd7, 0x98, 0x79, 0xe1, ++ 0x61, 0x1b, 0xc3, 0xbd, 0xe2, 0x7a, 0x05, 0x79, 0x08, 0x4f, 0x7d, 0x97, ++ 0xea, 0x7f, 0xef, 0xd6, 0x03, 0xee, 0xbb, 0xd1, 0x4e, 0x69, 0x88, 0xdb, ++ 0x57, 0xed, 0xdb, 0x53, 0x00, 0x6b, 0x36, 0x99, 0x7b, 0xf7, 0xd4, 0x70, ++ 0x7b, 0x81, 0x7e, 0x99, 0xcc, 0xfb, 0x39, 0x8d, 0x78, 0xd0, 0x4e, 0x2d, ++ 0xd2, 0xec, 0x6c, 0xfd, 0xc0, 0x24, 0xe7, 0xd6, 0xd2, 0x9d, 0x61, 0x80, ++ 0xcf, 0x62, 0x9e, 0x06, 0x87, 0x5c, 0xc9, 0x8c, 0xda, 0x11, 0x39, 0x36, ++ 0x0e, 0x11, 0xc7, 0x0f, 0x23, 0x41, 0xfd, 0xcd, 0xfc, 0x98, 0xbc, 0x2f, ++ 0x3a, 0xbf, 0x13, 0xb0, 0x2b, 0xd5, 0x6e, 0x16, 0x7f, 0x35, 0xcb, 0x49, ++ 0x5a, 0x29, 0xb5, 0x3b, 0x38, 0x08, 0x94, 0x7b, 0x31, 0xeb, 0xbe, 0x66, ++ 0xb9, 0x6d, 0xd4, 0x02, 0x6e, 0x58, 0xcf, 0xa6, 0xfa, 0x73, 0x86, 0xad, ++ 0x7f, 0xd2, 0xf9, 0x0a, 0xe2, 0x13, 0x72, 0x93, 0x17, 0xc7, 0x93, 0xcb, ++ 0xa7, 0x85, 0xfe, 0x07, 0xf3, 0x9f, 0xc3, 0x6b, 0x94, 0x4f, 0x6b, 0x81, ++ 0x6a, 0xc0, 0x2b, 0x66, 0x3a, 0x7e, 0x6a, 0x33, 0xe2, 0x7f, 0x31, 0x3f, ++ 0xa7, 0xb9, 0x07, 0x91, 0xbe, 0x45, 0x5a, 0x47, 0x36, 0xb4, 0x3f, 0xcd, ++ 0x3d, 0x88, 0xfe, 0x16, 0xb5, 0xef, 0xd9, 0x70, 0x15, 0x72, 0x26, 0xec, ++ 0xf5, 0x98, 0xfc, 0x15, 0xdd, 0xd2, 0x00, 0xf6, 0x1d, 0xe4, 0x1a, 0x96, ++ 0xc8, 0x8f, 0x97, 0xce, 0x4e, 0x06, 0x3b, 0xd8, 0xe8, 0x66, 0x38, 0x85, ++ 0x98, 0xe2, 0xe9, 0xfd, 0xee, 0x89, 0xfd, 0x8d, 0x3e, 0x93, 0x3c, 0x1e, ++ 0x77, 0x31, 0xff, 0xaa, 0xb1, 0x94, 0x24, 0xbb, 0x52, 0x41, 0xdf, 0x59, ++ 0xdc, 0xa9, 0xff, 0xb1, 0xf4, 0x9d, 0x8e, 0x98, 0xb8, 0xdc, 0x3f, 0x59, ++ 0x03, 0x9d, 0xb6, 0x98, 0xf8, 0xba, 0xb3, 0xf0, 0x8b, 0x0d, 0x2e, 0x27, ++ 0xd8, 0x19, 0x96, 0xbf, 0x55, 0x46, 0xcd, 0x97, 0x35, 0x2f, 0x1a, 0xcf, ++ 0x14, 0x71, 0x53, 0xb1, 0xde, 0x27, 0xe2, 0xa4, 0xe3, 0xe2, 0x99, 0x85, ++ 0xbd, 0x98, 0xdf, 0x65, 0x15, 0x79, 0x17, 0x7c, 0xfd, 0x6f, 0x5c, 0xde, ++ 0x4f, 0x82, 0x75, 0x47, 0x71, 0x15, 0xf1, 0x4c, 0xdb, 0xfa, 0x0e, 0xc5, ++ 0xcb, 0xd7, 0x4b, 0x10, 0x8f, 0x35, 0xf1, 0x38, 0xdc, 0x68, 0xf1, 0x24, ++ 0xf1, 0x50, 0x16, 0x7f, 0xa0, 0xf8, 0xec, 0xb7, 0xb6, 0xa9, 0x93, 0xe3, ++ 0xb3, 0xdd, 0xdc, 0xcf, 0x1c, 0x02, 0xe3, 0x41, 0xaf, 0xf7, 0xd9, 0x5c, ++ 0x78, 0xd5, 0x20, 0x1f, 0x85, 0x92, 0xda, 0x9f, 0x14, 0x1f, 0xb7, 0xed, ++ 0xe7, 0x7e, 0xdb, 0x95, 0xe8, 0xe7, 0x11, 0x19, 0xbe, 0x63, 0xed, 0xfc, ++ 0xc9, 0x24, 0x5f, 0xe2, 0x79, 0x14, 0x0f, 0x33, 0x3d, 0x98, 0x56, 0xba, ++ 0xa7, 0x2f, 0x16, 0x0f, 0x57, 0xb4, 0x53, 0xde, 0xd0, 0x71, 0x52, 0xdb, ++ 0xc9, 0x4c, 0x92, 0x9a, 0x58, 0xee, 0x16, 0x8d, 0xd9, 0xbd, 0x5f, 0x19, ++ 0xe4, 0x6b, 0x0c, 0x1f, 0x4f, 0x82, 0x8b, 0x85, 0x7c, 0x9d, 0x97, 0xf5, ++ 0xbf, 0xd9, 0xa6, 0x26, 0x2e, 0xd7, 0xc8, 0xe9, 0x48, 0xf4, 0xbe, 0xad, ++ 0xc8, 0xd6, 0x02, 0xf9, 0x56, 0xb4, 0x1c, 0x99, 0x96, 0xca, 0xae, 0xd7, ++ 0xd1, 0x6b, 0xdf, 0xac, 0x3d, 0xd9, 0x16, 0xfa, 0xfc, 0x35, 0xc0, 0x5f, ++ 0x31, 0x74, 0xf4, 0x3f, 0xb3, 0x0f, 0xfb, 0xf1, 0x07, 0x95, 0xed, 0xb3, ++ 0xe9, 0x3f, 0xbf, 0x22, 0x17, 0xf0, 0xc1, 0x09, 0x45, 0x4f, 0xb5, 0x4f, ++ 0xbd, 0x7c, 0xf9, 0x31, 0xeb, 0x93, 0x7d, 0x8e, 0xee, 0x59, 0x47, 0xf5, ++ 0xaf, 0x27, 0xdb, 0x8e, 0xf3, 0x73, 0x8f, 0x9b, 0xe1, 0x90, 0xd7, 0xa1, ++ 0x64, 0x8c, 0x3c, 0x3d, 0xa4, 0x06, 0xae, 0xb6, 0xcf, 0x41, 0x08, 0xa2, ++ 0x93, 0x74, 0x6e, 0xe4, 0x84, 0x9c, 0x83, 0xd1, 0xac, 0xb9, 0xbc, 0x7d, ++ 0x62, 0x77, 0x39, 0x06, 0x1f, 0x69, 0x8e, 0x99, 0x1f, 0xb6, 0xc2, 0xab, ++ 0xe9, 0xb0, 0xce, 0xc7, 0xe4, 0x66, 0xb3, 0x3a, 0x88, 0xf9, 0x38, 0x77, ++ 0xd1, 0xda, 0x6d, 0xb4, 0x9d, 0x83, 0x9a, 0x9c, 0xb9, 0x9c, 0xde, 0x17, ++ 0xdb, 0x99, 0x3c, 0x1e, 0x0c, 0x5a, 0xe3, 0xe6, 0x3f, 0x17, 0xdb, 0x19, ++ 0x7e, 0x7e, 0x48, 0x6d, 0x2e, 0x06, 0x3a, 0x49, 0xc7, 0x6a, 0xd4, 0xb3, ++ 0x56, 0x49, 0x6e, 0x06, 0xfd, 0x27, 0xde, 0xcb, 0x8b, 0xcf, 0x6d, 0xe8, ++ 0x8c, 0x9f, 0x57, 0x5a, 0x1d, 0xad, 0x7f, 0x1e, 0xd6, 0xbf, 0x97, 0xd6, ++ 0x0f, 0xb8, 0xc1, 0xcb, 0xe3, 0xef, 0xc4, 0x95, 0x19, 0x37, 0xde, 0xce, ++ 0xfb, 0x1d, 0x26, 0xa4, 0x1e, 0xf4, 0xe5, 0xf1, 0x34, 0xa3, 0xbf, 0xe9, ++ 0xb3, 0xb3, 0x79, 0x6f, 0x5e, 0xb4, 0xfe, 0x86, 0xd8, 0xfa, 0x31, 0x3f, ++ 0x6b, 0x0e, 0x3e, 0x5f, 0x88, 0xe3, 0xfc, 0x02, 0x7b, 0x5e, 0x60, 0x67, ++ 0x7a, 0xe1, 0xcf, 0x63, 0x79, 0x6d, 0x82, 0x8f, 0xa2, 0xde, 0xdb, 0xa3, ++ 0xf5, 0xdd, 0x8e, 0xf5, 0xed, 0x63, 0xdf, 0xe5, 0xdb, 0xf9, 0xba, 0x01, ++ 0xa7, 0x5b, 0xe0, 0x7c, 0x73, 0xfe, 0x53, 0x6d, 0x12, 0x1b, 0x8f, 0xe8, ++ 0xbe, 0x3e, 0x82, 0x76, 0xb3, 0x8c, 0xe2, 0x70, 0x3c, 0x5f, 0x21, 0x12, ++ 0x3a, 0x08, 0xf7, 0x7e, 0xc2, 0xf7, 0x65, 0x4a, 0x0c, 0xa7, 0xf7, 0xa4, ++ 0xb0, 0x7d, 0x4c, 0x3d, 0xd6, 0x11, 0x3c, 0x67, 0xa1, 0xf7, 0x93, 0x8f, ++ 0x4f, 0xc3, 0x7e, 0x4d, 0x45, 0x31, 0xe2, 0x7b, 0x1b, 0x97, 0x1d, 0xe5, ++ 0xe2, 0x6e, 0x19, 0xca, 0x95, 0x65, 0x9f, 0x73, 0xc4, 0x9e, 0x3b, 0x50, ++ 0xc1, 0xdf, 0xf7, 0x8e, 0x1a, 0xd7, 0x55, 0x75, 0x8e, 0x77, 0xf6, 0x13, ++ 0x9e, 0xaf, 0xc1, 0xeb, 0xf3, 0x27, 0x88, 0x73, 0x09, 0x1c, 0xdf, 0xc9, ++ 0xcb, 0x47, 0xd7, 0x81, 0xd9, 0x3e, 0xc5, 0x69, 0x43, 0x6c, 0x5f, 0x62, ++ 0xa5, 0x8b, 0x9f, 0x13, 0x91, 0xf6, 0x6d, 0xf4, 0xab, 0x85, 0x9e, 0x6f, ++ 0xfa, 0x64, 0x35, 0xc3, 0xf3, 0x33, 0xf8, 0xfe, 0xb5, 0xec, 0xdd, 0x72, ++ 0x2c, 0x3d, 0x0a, 0xa7, 0xa7, 0x4c, 0x79, 0xf7, 0x9b, 0x7b, 0xa0, 0xff, ++ 0x11, 0xe2, 0xc2, 0x38, 0x6b, 0xf8, 0x77, 0x8e, 0x1c, 0xda, 0x6f, 0xfd, ++ 0x88, 0xec, 0x4d, 0x82, 0xd2, 0x26, 0x3f, 0xc3, 0xc7, 0x71, 0x6d, 0x05, ++ 0xc7, 0xad, 0x89, 0xf0, 0xfd, 0x61, 0x29, 0xf0, 0x5c, 0x98, 0xc5, 0x37, ++ 0x0d, 0x38, 0xff, 0x70, 0xe6, 0x3f, 0xcb, 0x80, 0x43, 0xcb, 0xc2, 0x6c, ++ 0x9d, 0xa9, 0x92, 0xe3, 0xfa, 0x4a, 0x25, 0x94, 0x05, 0xf3, 0x43, 0x5d, ++ 0x36, 0x8b, 0x47, 0x75, 0x9e, 0x1f, 0xc8, 0x42, 0x3c, 0xff, 0x71, 0x26, ++ 0xce, 0x17, 0x57, 0x2b, 0x3b, 0xb1, 0xdf, 0x57, 0x29, 0x23, 0x98, 0x27, ++ 0x31, 0xdf, 0x84, 0xff, 0xb3, 0x86, 0x08, 0xfa, 0x0d, 0x7e, 0xea, 0x37, ++ 0xe8, 0x71, 0x70, 0x4b, 0xad, 0x9c, 0x5d, 0x03, 0xfb, 0x73, 0xcb, 0x3c, ++ 0x6c, 0x7f, 0x6d, 0x99, 0x97, 0x95, 0xef, 0xa1, 0xed, 0x07, 0x69, 0xf9, ++ 0xaa, 0xf3, 0x3f, 0xe8, 0x03, 0xb8, 0x3e, 0x1e, 0xdf, 0x1b, 0x71, 0x4a, ++ 0x85, 0x67, 0xa4, 0x1a, 0xcd, 0x88, 0x09, 0xf7, 0x5f, 0x31, 0x9e, 0xce, ++ 0x66, 0x71, 0xa9, 0x4a, 0x93, 0x9f, 0x20, 0xe4, 0x81, 0xf2, 0x03, 0xf7, ++ 0xcd, 0x77, 0x2a, 0x0f, 0xdb, 0x81, 0x0f, 0xb9, 0xd9, 0x16, 0xe6, 0x1f, ++ 0xcc, 0xb0, 0xdc, 0x09, 0x7c, 0x23, 0x56, 0xe6, 0x1f, 0x6c, 0x72, 0x7d, ++ 0xcb, 0x8e, 0xfe, 0x01, 0x7d, 0x0f, 0xfe, 0x41, 0x25, 0xf7, 0x0f, 0x2a, ++ 0x2f, 0x46, 0xb2, 0xc0, 0x3f, 0x30, 0xf7, 0x47, 0xc8, 0x57, 0xee, 0xc5, ++ 0x8f, 0xd1, 0x3f, 0xe8, 0x1d, 0xf9, 0x18, 0xf9, 0x1c, 0xfe, 0x64, 0x77, ++ 0x16, 0xd8, 0x65, 0x91, 0x47, 0x2e, 0x70, 0xbd, 0x28, 0x9f, 0xa9, 0xf8, ++ 0x0f, 0x81, 0x1e, 0x57, 0x98, 0x70, 0xbe, 0x4d, 0xe0, 0xfc, 0xd1, 0xd5, ++ 0x04, 0x70, 0x7e, 0xa5, 0x62, 0xc4, 0xf9, 0x36, 0x2e, 0x67, 0x95, 0x1c, ++ 0xe7, 0x77, 0xc2, 0x7a, 0x17, 0xc8, 0xeb, 0x99, 0xcc, 0xa3, 0x39, 0xb4, ++ 0x1f, 0xfb, 0x05, 0xce, 0x1f, 0x75, 0x19, 0x70, 0x7e, 0x19, 0xe7, 0xc3, ++ 0x7e, 0xd0, 0xc7, 0x18, 0x9c, 0xbf, 0xff, 0x0c, 0xdb, 0x57, 0xd9, 0x93, ++ 0x9d, 0x6b, 0xc0, 0xf9, 0x63, 0x7e, 0xe4, 0xa7, 0xc4, 0xf9, 0xbe, 0x24, ++ 0x66, 0x77, 0x04, 0x8e, 0xaf, 0xe3, 0x78, 0x41, 0xbc, 0xff, 0x90, 0xdb, ++ 0x71, 0x33, 0xbe, 0x37, 0xbf, 0xbf, 0x52, 0x7c, 0x4f, 0x38, 0x7e, 0x8f, ++ 0xe2, 0x62, 0xa3, 0xdc, 0xf6, 0x6e, 0xcd, 0xc5, 0x75, 0x95, 0x32, 0x97, ++ 0x1d, 0xe5, 0xb6, 0x62, 0x28, 0x30, 0xfa, 0x20, 0x7d, 0x95, 0x39, 0xba, ++ 0xfa, 0x8f, 0xdb, 0x81, 0xdf, 0x6e, 0x87, 0x17, 0x3e, 0xb3, 0xf1, 0x71, ++ 0x99, 0x34, 0xff, 0xd3, 0x84, 0xf7, 0xa7, 0x91, 0xc8, 0xc1, 0x54, 0xd0, ++ 0x9b, 0x7c, 0x96, 0x6f, 0x94, 0x96, 0xed, 0x42, 0x3d, 0xa9, 0xa4, 0x7a, ++ 0x52, 0x17, 0x4f, 0x1f, 0xcc, 0xf8, 0x3f, 0x9b, 0x8d, 0x5b, 0xb5, 0xd2, ++ 0x2a, 0xf2, 0xe2, 0x26, 0xc4, 0xf9, 0x95, 0x9a, 0x0b, 0x71, 0xb6, 0xa2, ++ 0xd4, 0x5d, 0x16, 0xce, 0x37, 0xeb, 0x55, 0x7d, 0xbe, 0x6d, 0x42, 0xbf, ++ 0x34, 0x2b, 0xc9, 0x88, 0xc3, 0xfc, 0xc2, 0x6e, 0x2a, 0x0f, 0x06, 0xd1, ++ 0x6e, 0x2a, 0x0f, 0x86, 0x41, 0x7f, 0xfc, 0x17, 0x59, 0xfe, 0x4c, 0xef, ++ 0x27, 0xdf, 0x76, 0xc7, 0x9e, 0xe7, 0xb0, 0x89, 0xdb, 0x7f, 0x61, 0xcf, ++ 0x85, 0x3e, 0xee, 0xff, 0xe4, 0x63, 0x9e, 0x47, 0x63, 0x92, 0x6b, 0xe5, ++ 0x23, 0x47, 0xec, 0xbe, 0xe2, 0xfd, 0xd9, 0x0c, 0x87, 0xfc, 0x4c, 0x89, ++ 0xa0, 0xfe, 0xee, 0xbf, 0x58, 0x9c, 0x1c, 0x1b, 0xa7, 0x32, 0xe3, 0xfc, ++ 0xfd, 0x1c, 0xe7, 0x57, 0x72, 0x9c, 0x5f, 0x79, 0x91, 0xe9, 0xc9, 0xfe, ++ 0xf1, 0x38, 0xff, 0x96, 0xa4, 0x18, 0xdc, 0xe6, 0xbc, 0xb8, 0x0c, 0x71, ++ 0xfe, 0xe5, 0xe6, 0x13, 0x08, 0xff, 0xb5, 0xce, 0xe4, 0xbf, 0xbe, 0x6d, ++ 0x37, 0xfa, 0xaf, 0x89, 0xe4, 0xfa, 0x3f, 0xf8, 0x7c, 0x1e, 0xe5, 0xe7, ++ 0xc8, 0x06, 0xc4, 0xb3, 0xca, 0x08, 0x9b, 0x4f, 0x39, 0x3f, 0x15, 0x8e, ++ 0x67, 0x6d, 0x80, 0x23, 0x6f, 0xc2, 0x79, 0x14, 0xf7, 0xc7, 0x0b, 0x3d, ++ 0x1e, 0xc7, 0x57, 0xeb, 0x47, 0x86, 0x79, 0xd2, 0xcf, 0xf1, 0xdd, 0x7e, ++ 0xe5, 0xb2, 0xf1, 0x6c, 0x4b, 0xd2, 0x9c, 0xc4, 0xe5, 0x2a, 0x27, 0xc1, ++ 0xb3, 0x9b, 0x3e, 0x51, 0x5b, 0x90, 0xff, 0x1c, 0xcf, 0x56, 0x0a, 0x3c, ++ 0xfb, 0xb7, 0x48, 0x56, 0x2c, 0x9e, 0x25, 0x1a, 0xc3, 0x61, 0xfb, 0x9f, ++ 0xb9, 0x80, 0xfd, 0xd8, 0x9f, 0xc6, 0x70, 0xac, 0x19, 0x87, 0x25, 0xc6, ++ 0x1d, 0xec, 0xde, 0xaf, 0x49, 0x7c, 0x1d, 0xc6, 0x88, 0x27, 0x44, 0x3d, ++ 0x9d, 0x29, 0x24, 0x1b, 0xe3, 0x73, 0xd2, 0x5b, 0xc8, 0xb7, 0x1e, 0xeb, ++ 0x5f, 0xe2, 0xe2, 0x11, 0x81, 0x3f, 0xcc, 0xb8, 0x83, 0x98, 0xf0, 0xc6, ++ 0x58, 0xbd, 0x80, 0x53, 0x00, 0x0f, 0x8c, 0x9e, 0x73, 0xc0, 0x3e, 0xd8, ++ 0xce, 0x23, 0x32, 0xdf, 0x57, 0xf7, 0x59, 0x71, 0x48, 0x44, 0x8e, 0xc5, ++ 0x1d, 0xe2, 0xbb, 0x9e, 0x14, 0x1d, 0xfd, 0x79, 0x81, 0x4b, 0x36, 0x7d, ++ 0xf2, 0x1e, 0xe2, 0x8c, 0x4d, 0x23, 0x04, 0x4f, 0x4e, 0x10, 0xb8, 0x84, ++ 0xe2, 0x8d, 0x83, 0xe0, 0xcf, 0xe9, 0x74, 0xfe, 0x4e, 0xf2, 0x44, 0xe9, ++ 0x17, 0xf8, 0x44, 0xe0, 0x8d, 0xb1, 0x7e, 0x28, 0x2c, 0x6f, 0xb4, 0xc7, ++ 0xc5, 0xed, 0x7f, 0x82, 0x38, 0xe8, 0xe7, 0x8d, 0x4f, 0x04, 0x2e, 0x31, ++ 0xf3, 0x67, 0xbf, 0x95, 0xe1, 0x96, 0xce, 0xf3, 0xa7, 0x3e, 0x13, 0x5e, ++ 0x31, 0xe3, 0x13, 0x33, 0xbd, 0xf3, 0x77, 0x6e, 0xeb, 0x4b, 0xa5, 0xe5, ++ 0x16, 0xe4, 0x8f, 0xa0, 0x1d, 0xea, 0xf4, 0x0e, 0xe0, 0x3e, 0xf3, 0x9e, ++ 0xd1, 0xdc, 0x0c, 0xe0, 0xc3, 0xe4, 0xb8, 0xc5, 0x8f, 0xeb, 0xf0, 0x63, ++ 0x71, 0x4a, 0x8e, 0x3f, 0xae, 0x14, 0xb7, 0x24, 0xc2, 0x2b, 0x89, 0x70, ++ 0xc6, 0x7e, 0xc0, 0x31, 0x5a, 0x14, 0xc7, 0x98, 0xf1, 0x8b, 0x99, 0x9f, ++ 0xb9, 0xd9, 0xa4, 0x15, 0xe2, 0xfe, 0x02, 0xd7, 0x24, 0xd2, 0x5b, 0x28, ++ 0x77, 0xaf, 0x33, 0x8a, 0x77, 0x12, 0x95, 0xa3, 0x76, 0x1b, 0x71, 0x50, ++ 0xc2, 0x7a, 0x2e, 0x46, 0xae, 0x14, 0x07, 0xbd, 0x97, 0x34, 0x21, 0x0e, ++ 0x22, 0x84, 0xc9, 0x0d, 0xcb, 0x0f, 0x4a, 0x84, 0x4f, 0x36, 0x79, 0x5d, ++ 0x5a, 0x6c, 0xbe, 0xaa, 0x98, 0x4f, 0x7a, 0xb3, 0xcf, 0x9d, 0xc6, 0x7d, ++ 0xe5, 0x43, 0x2a, 0x9e, 0x8f, 0xd0, 0x7b, 0x86, 0xd9, 0xcf, 0x44, 0xf8, ++ 0xe8, 0x80, 0x49, 0xef, 0xf6, 0x83, 0xbd, 0xd0, 0xa2, 0xf3, 0x55, 0x42, ++ 0xbe, 0x0c, 0xb1, 0x73, 0x3e, 0x04, 0x8e, 0x4a, 0x54, 0xee, 0x72, 0xf1, ++ 0x93, 0x98, 0x47, 0x7c, 0x49, 0x6c, 0x9e, 0x48, 0xb4, 0x3e, 0x99, 0x95, ++ 0xcc, 0x70, 0xd6, 0xe6, 0x5c, 0xe6, 0x2f, 0x9b, 0xdf, 0x47, 0xf3, 0x4d, ++ 0x8c, 0x38, 0x8a, 0x64, 0x14, 0xa1, 0x3c, 0x3f, 0xc0, 0xf7, 0x5d, 0x26, ++ 0xc2, 0x55, 0x84, 0x44, 0x9c, 0x2c, 0x4e, 0x15, 0xc4, 0xe7, 0xcb, 0xb8, ++ 0xbf, 0x89, 0xb1, 0xc1, 0xb9, 0x3c, 0xdf, 0x80, 0x92, 0xda, 0x9c, 0x4f, ++ 0xf2, 0x61, 0x5e, 0x68, 0xb6, 0xb3, 0xf1, 0x3a, 0x3e, 0x47, 0x42, 0x3f, ++ 0x60, 0x31, 0x3c, 0xa7, 0xf2, 0xe4, 0xaf, 0x61, 0xeb, 0x43, 0x27, 0x8b, ++ 0x98, 0xbd, 0x3e, 0xee, 0xb7, 0xa1, 0xfd, 0x3e, 0xfa, 0x01, 0xcb, 0x47, ++ 0xec, 0x4d, 0x61, 0x71, 0xd6, 0xe3, 0x37, 0x27, 0x79, 0x77, 0x51, 0x12, ++ 0x3e, 0x80, 0x7a, 0xe9, 0x3c, 0x7c, 0x32, 0x69, 0xa0, 0x04, 0xe6, 0xfd, ++ 0x59, 0xa2, 0x9f, 0xe9, 0xac, 0x9f, 0x0b, 0x1d, 0xe1, 0x95, 0xb8, 0x3e, ++ 0x3e, 0xfb, 0x46, 0x4b, 0x30, 0x67, 0xbc, 0x7e, 0x6f, 0x4e, 0xe6, 0x74, ++ 0xa4, 0x6b, 0xb8, 0xce, 0xd6, 0xc8, 0xf1, 0x27, 0xac, 0x13, 0x66, 0x15, ++ 0x8f, 0xdf, 0x4f, 0xf0, 0x4c, 0x72, 0x0e, 0xf2, 0x09, 0xf2, 0xe4, 0xb3, ++ 0x68, 0xb9, 0x8d, 0x96, 0x81, 0xef, 0xe7, 0xd2, 0x47, 0x49, 0x16, 0xb6, ++ 0xae, 0x6a, 0xe6, 0xeb, 0x9f, 0x39, 0x3d, 0xc0, 0x18, 0x5b, 0x0c, 0x1f, ++ 0x9a, 0xf2, 0xed, 0x7a, 0x12, 0x95, 0xff, 0xa4, 0x1b, 0xd8, 0xfa, 0x54, ++ 0x4f, 0x8d, 0x0d, 0xf3, 0x71, 0x92, 0x60, 0x29, 0x9d, 0xd6, 0xbb, 0xa5, ++ 0x20, 0x37, 0x25, 0x9e, 0x1c, 0x89, 0x7e, 0x99, 0x9f, 0xff, 0x34, 0x99, ++ 0xf9, 0xdf, 0x27, 0x67, 0x44, 0x70, 0x1e, 0x3b, 0xc1, 0xf3, 0x7b, 0x57, ++ 0x29, 0x52, 0x90, 0x30, 0x07, 0x0b, 0xfb, 0xa9, 0x4c, 0xb9, 0x6a, 0xe7, ++ 0x16, 0x5a, 0xf4, 0xcb, 0xc9, 0xec, 0xbc, 0x9a, 0x13, 0xbf, 0x7e, 0x1d, ++ 0xe3, 0x44, 0xc7, 0xd2, 0x38, 0x1f, 0x74, 0x09, 0xf3, 0x18, 0x8e, 0x83, ++ 0x2d, 0x84, 0x78, 0x9f, 0x4b, 0x0b, 0xc1, 0xbe, 0x4c, 0xfa, 0xbd, 0x75, ++ 0xd9, 0x04, 0x79, 0x1f, 0x03, 0xfe, 0xba, 0x02, 0xb6, 0x5e, 0x46, 0x88, ++ 0x04, 0xeb, 0x68, 0xf0, 0x47, 0xee, 0x78, 0x7e, 0x2f, 0xad, 0x97, 0xb1, ++ 0xdf, 0x4b, 0x5d, 0x5b, 0x1f, 0x04, 0x7d, 0x3c, 0x59, 0xff, 0x86, 0x03, ++ 0xce, 0x9f, 0x5c, 0x34, 0x6a, 0x21, 0xa0, 0x77, 0x4b, 0x5d, 0x65, 0xf7, ++ 0xc2, 0xf3, 0xde, 0x14, 0x26, 0xc7, 0xc0, 0x67, 0xc0, 0x4d, 0x4b, 0x6b, ++ 0xbe, 0xf8, 0x4d, 0x78, 0xde, 0xd4, 0x64, 0x1c, 0x8f, 0x43, 0xc9, 0xb9, ++ 0xec, 0x1c, 0x19, 0x85, 0x8d, 0x07, 0x8c, 0x5f, 0x56, 0xf1, 0xf8, 0x76, ++ 0xe9, 0xec, 0x17, 0x50, 0x33, 0x63, 0xf8, 0xef, 0xfb, 0xcd, 0xdf, 0x49, ++ 0x31, 0xf3, 0x8a, 0xc8, 0x5b, 0xb1, 0x27, 0xc8, 0xe3, 0x4b, 0xd4, 0x6f, ++ 0x29, 0xd6, 0xfe, 0xca, 0xd1, 0xb8, 0xe3, 0xb4, 0xd2, 0x9d, 0xdb, 0x60, ++ 0x7f, 0x4c, 0x73, 0x09, 0x3b, 0xf7, 0xa2, 0xd1, 0x43, 0x82, 0xb0, 0xce, ++ 0xdb, 0xe8, 0x25, 0xe1, 0x1c, 0x2e, 0x5f, 0x98, 0x4f, 0xd3, 0x97, 0xcf, ++ 0xf6, 0x05, 0x71, 0xfd, 0x4a, 0x2b, 0xdd, 0xd9, 0x9e, 0x0b, 0x71, 0xca, ++ 0x51, 0x85, 0xad, 0x3f, 0x9b, 0xe6, 0x93, 0x72, 0x3a, 0x56, 0xd9, 0xe9, ++ 0x10, 0x37, 0x67, 0xe3, 0x73, 0x7c, 0x8e, 0x8c, 0x7e, 0x5d, 0x79, 0x29, ++ 0xc3, 0xf5, 0xe5, 0x1c, 0xd7, 0x37, 0xea, 0xad, 0xb8, 0xae, 0xd7, 0xf4, ++ 0x58, 0xdf, 0xd6, 0x5c, 0x78, 0x2f, 0x67, 0xd7, 0xfa, 0x3d, 0x7c, 0x7d, ++ 0x34, 0x86, 0x7f, 0x64, 0x1f, 0x8b, 0xc3, 0x2d, 0x36, 0xc9, 0x79, 0x8a, ++ 0x29, 0xce, 0x5f, 0xee, 0x35, 0xe5, 0x07, 0xf2, 0xbc, 0xbe, 0x9e, 0x82, ++ 0xe7, 0x5c, 0x20, 0x3f, 0x9b, 0xd3, 0xb9, 0xfc, 0x14, 0x4b, 0xa8, 0x47, ++ 0xaf, 0x4b, 0x9e, 0xc7, 0x72, 0x63, 0xe6, 0xa3, 0x86, 0x64, 0x91, 0x7f, ++ 0x44, 0x3c, 0xd6, 0x18, 0xf9, 0x18, 0x93, 0x07, 0x3e, 0xbe, 0x66, 0xbe, ++ 0x27, 0xe2, 0xa7, 0x99, 0x4f, 0x66, 0xb9, 0x30, 0xf3, 0xfb, 0x78, 0x8a, ++ 0x89, 0x5f, 0x09, 0xf8, 0x9f, 0x88, 0xdf, 0xe5, 0xa5, 0xfe, 0xff, 0x52, ++ 0xfe, 0x9e, 0xb5, 0xda, 0xac, 0x20, 0xb7, 0xbd, 0xd6, 0xf7, 0xb3, 0xb9, ++ 0x3f, 0x44, 0xe4, 0x18, 0x7b, 0x62, 0xe6, 0xdb, 0x59, 0xcd, 0x93, 0x02, ++ 0x76, 0xe2, 0xe4, 0x28, 0x9b, 0x6f, 0x8e, 0xcd, 0xf0, 0x7c, 0x05, 0xcf, ++ 0xc1, 0xa2, 0x7a, 0x8c, 0xe7, 0x78, 0x72, 0x7d, 0x88, 0x8e, 0x03, 0xd5, ++ 0x07, 0x67, 0xac, 0x3e, 0xbf, 0x35, 0x13, 0xf4, 0x99, 0xca, 0x99, 0x15, ++ 0xea, 0x69, 0xd2, 0x25, 0x3d, 0x09, 0xf4, 0x6f, 0xef, 0xa6, 0x07, 0xb1, ++ 0xdf, 0xa0, 0xa7, 0xce, 0xa8, 0x1e, 0x99, 0xf9, 0x3f, 0x4e, 0xff, 0xe8, ++ 0xff, 0x8a, 0xa0, 0x37, 0x6f, 0xbc, 0x1e, 0x99, 0xf3, 0xc6, 0x3e, 0xad, ++ 0xfe, 0x7d, 0x07, 0xec, 0x39, 0xc4, 0x0b, 0x92, 0x3d, 0xc8, 0x3f, 0x61, ++ 0x4f, 0x9b, 0x88, 0xeb, 0x2b, 0xb1, 0xfb, 0x58, 0xc5, 0x7a, 0x7a, 0x6f, ++ 0x4e, 0x5b, 0x33, 0xec, 0x3f, 0x6f, 0x1c, 0xb2, 0xe0, 0x79, 0x3f, 0x9d, ++ 0xa3, 0x2f, 0x2a, 0xcb, 0x61, 0x5f, 0x6b, 0xbd, 0x84, 0xd3, 0x9a, 0x46, ++ 0x06, 0x90, 0x5e, 0xad, 0x9d, 0xe5, 0x45, 0x5c, 0xfb, 0xec, 0xa3, 0x04, ++ 0xf2, 0xd6, 0x1f, 0x9b, 0x41, 0xbc, 0x60, 0xaf, 0xb4, 0x76, 0x96, 0x27, ++ 0x41, 0xdf, 0x63, 0x9e, 0x84, 0xc0, 0xf5, 0xe2, 0xfc, 0x46, 0xfa, 0x5e, ++ 0x67, 0x79, 0x21, 0xc6, 0x73, 0x96, 0x52, 0xbc, 0xc6, 0x3c, 0x9f, 0x25, ++ 0xc3, 0x55, 0xb8, 0xbe, 0xd0, 0xc7, 0xcf, 0x3d, 0x1a, 0xf3, 0x2f, 0x88, ++ 0x90, 0x4b, 0xe3, 0xfe, 0x96, 0x36, 0x78, 0x32, 0x3d, 0xba, 0x1f, 0xaa, ++ 0xfd, 0x7c, 0x08, 0xe3, 0x33, 0x9d, 0x09, 0xf6, 0xbb, 0x88, 0xab, 0xd9, ++ 0x5f, 0x30, 0x5f, 0x0f, 0x1d, 0xf8, 0xc5, 0x37, 0xf7, 0x40, 0x7e, 0x45, ++ 0xbe, 0xea, 0x02, 0x48, 0x51, 0x31, 0x1a, 0xb6, 0x43, 0x7d, 0xdf, 0x2f, ++ 0x3c, 0x50, 0x8f, 0xf9, 0x6c, 0xf5, 0x92, 0x0b, 0xd6, 0xdd, 0x0e, 0x7d, ++ 0xdc, 0xb1, 0x01, 0xce, 0x3b, 0x5a, 0x52, 0xf8, 0x4e, 0xdc, 0xfc, 0x9e, ++ 0xae, 0xb3, 0x4f, 0x79, 0xa1, 0x1f, 0x5d, 0xd6, 0x6d, 0xde, 0x74, 0xb0, ++ 0x0f, 0xeb, 0xd9, 0xbc, 0x95, 0x74, 0x5d, 0xe1, 0x8c, 0xe5, 0x13, 0xe0, ++ 0xa3, 0x40, 0xbd, 0xbf, 0x3e, 0x67, 0x56, 0xe2, 0x7c, 0x92, 0x95, 0x0e, ++ 0x1e, 0xf7, 0xef, 0xfd, 0xfa, 0xae, 0xcd, 0xb0, 0xbe, 0x3d, 0xac, 0x7a, ++ 0xc1, 0x7f, 0x69, 0xe0, 0x7e, 0x47, 0xa3, 0xb2, 0xad, 0x65, 0x39, 0x1d, ++ 0xcf, 0xbe, 0x05, 0x92, 0x77, 0x1d, 0x7d, 0xde, 0x77, 0xfd, 0xf6, 0xd5, ++ 0x07, 0x20, 0xce, 0x7a, 0x46, 0x05, 0x8e, 0x93, 0xfe, 0xf3, 0xbb, 0xb3, ++ 0xc1, 0xcf, 0x78, 0xed, 0x19, 0x3b, 0xfa, 0x9f, 0x87, 0x3e, 0xde, 0xfd, ++ 0x13, 0xcc, 0x27, 0x19, 0x56, 0xe7, 0x42, 0x7f, 0xc7, 0xe8, 0xbf, 0x46, ++ 0x63, 0xef, 0x3f, 0x78, 0xe9, 0x08, 0xd8, 0x99, 0x25, 0x05, 0x4b, 0x4a, ++ 0xa0, 0x9d, 0x24, 0x85, 0x6c, 0x03, 0x79, 0xba, 0x7a, 0xb4, 0xe3, 0x34, ++ 0x9c, 0x8b, 0xd0, 0x38, 0xa4, 0xce, 0x01, 0xfb, 0xb3, 0xa4, 0x7e, 0xa7, ++ 0xfd, 0x6b, 0xc0, 0xa7, 0xfa, 0x5f, 0xd9, 0xaf, 0x01, 0xff, 0x63, 0xd4, ++ 0x53, 0x0b, 0xe3, 0x99, 0x9d, 0x1c, 0xd0, 0x1d, 0x54, 0x1e, 0xb3, 0x0a, ++ 0x73, 0xbe, 0x97, 0x01, 0xed, 0x78, 0x89, 0x57, 0x47, 0xbe, 0x0e, 0x10, ++ 0xe0, 0xab, 0xc8, 0x43, 0x10, 0xb8, 0x5e, 0xf8, 0x93, 0x9d, 0x0b, 0x72, ++ 0x52, 0x48, 0x0c, 0x5f, 0x4f, 0x8e, 0xe6, 0xa6, 0x60, 0x3c, 0xb2, 0x9e, ++ 0xe7, 0x2b, 0x2c, 0x90, 0x9b, 0xc1, 0x3f, 0x3e, 0xe9, 0xba, 0x26, 0x05, ++ 0xe3, 0x90, 0xf5, 0x2c, 0x4f, 0xc1, 0xcc, 0xaf, 0x25, 0x80, 0xd3, 0x53, ++ 0x81, 0xbe, 0x9c, 0x19, 0x2b, 0xe2, 0xcc, 0xdf, 0xb9, 0xf5, 0x7f, 0x59, ++ 0x1b, 0x80, 0xb8, 0xef, 0xf5, 0xb6, 0x96, 0x78, 0xfc, 0x0e, 0x70, 0x7e, ++ 0x27, 0xfd, 0x79, 0xc5, 0x2e, 0xe8, 0x6f, 0xd2, 0x8f, 0xed, 0x2e, 0x80, ++ 0xd7, 0x49, 0x09, 0xf2, 0x30, 0xf3, 0x1c, 0x3c, 0x1e, 0xe7, 0xbe, 0xbc, ++ 0xf8, 0x88, 0xc0, 0x33, 0x94, 0xaf, 0x76, 0x6b, 0x4c, 0xdc, 0x8f, 0xe2, ++ 0xfd, 0xaf, 0x39, 0x62, 0xe2, 0x2e, 0x57, 0xda, 0xfe, 0x1d, 0x90, 0xb3, ++ 0x3d, 0x07, 0xe2, 0x14, 0x81, 0x07, 0xa0, 0x9e, 0x72, 0x1e, 0x1f, 0xa9, ++ 0xe0, 0xf1, 0x91, 0x44, 0x74, 0x95, 0x4d, 0x12, 0xb7, 0xa0, 0x72, 0x84, ++ 0x7c, 0x5a, 0x02, 0x71, 0x8b, 0x9b, 0xd8, 0xf5, 0x3a, 0x7a, 0xed, 0x6b, ++ 0xc8, 0x99, 0x61, 0x88, 0x5b, 0x10, 0xdd, 0x0d, 0x76, 0xf6, 0x24, 0xac, ++ 0xc3, 0x01, 0x1e, 0x53, 0x16, 0xaf, 0x75, 0xc0, 0x3a, 0xdc, 0x59, 0x16, ++ 0xbf, 0x48, 0x24, 0xbf, 0x4b, 0xf2, 0x77, 0xdf, 0x71, 0x20, 0xc6, 0xde, ++ 0xf5, 0x5b, 0xf5, 0x6c, 0xf0, 0x73, 0xfb, 0xae, 0x7f, 0x0b, 0xfd, 0xa4, ++ 0xff, 0x5d, 0xf2, 0x3b, 0x26, 0x67, 0xf5, 0xbf, 0x6a, 0x87, 0xf3, 0xb3, ++ 0xb6, 0x14, 0x2e, 0x99, 0x0a, 0xf6, 0x2f, 0x46, 0x8e, 0x9f, 0x01, 0xfa, ++ 0xaf, 0x54, 0x8e, 0xcd, 0xfc, 0xeb, 0x5c, 0x90, 0x97, 0x42, 0xb4, 0xa8, ++ 0x3c, 0x0b, 0x39, 0x1e, 0x2f, 0x97, 0x12, 0xfa, 0xa3, 0x42, 0xbe, 0x13, ++ 0x8d, 0x07, 0x94, 0x03, 0x7f, 0x54, 0xc8, 0x79, 0xa2, 0x72, 0x27, 0x17, ++ 0x5c, 0x17, 0x57, 0xfe, 0xa3, 0xf5, 0x8c, 0x4c, 0xa8, 0x07, 0x5f, 0x70, ++ 0x30, 0xfc, 0x12, 0x70, 0xb0, 0xf9, 0xa5, 0x82, 0xe8, 0x2e, 0xb0, 0xc3, ++ 0xf3, 0xb3, 0x4e, 0xa3, 0xdf, 0xfa, 0x0a, 0xb7, 0xc7, 0x63, 0x72, 0x92, ++ 0x32, 0x70, 0xc7, 0x03, 0xd4, 0xee, 0x04, 0x9f, 0xb7, 0xe3, 0x7a, 0x79, ++ 0xcf, 0x79, 0x15, 0xcf, 0x59, 0xef, 0x79, 0xee, 0xbe, 0x9f, 0xc1, 0xbc, ++ 0xd1, 0x37, 0x5a, 0xe5, 0x7a, 0x0f, 0xe7, 0x71, 0xbf, 0x6b, 0x29, 0xa5, ++ 0xeb, 0x7a, 0xf0, 0x1f, 0x0a, 0x71, 0x7c, 0xfa, 0x94, 0x98, 0x38, 0xe1, ++ 0x9f, 0x1c, 0xc2, 0x7f, 0x30, 0xe6, 0xf5, 0xfe, 0x8b, 0xeb, 0x8f, 0xe9, ++ 0x7e, 0x36, 0xcf, 0x6a, 0x7e, 0xca, 0xef, 0x9b, 0xf8, 0x3c, 0x71, 0x43, ++ 0xce, 0x73, 0xc9, 0x30, 0x9f, 0xdf, 0xc4, 0xf7, 0x4d, 0xcc, 0xea, 0x56, ++ 0xe3, 0xce, 0xcb, 0x1c, 0x42, 0x90, 0xc2, 0x8c, 0xd7, 0x2d, 0x00, 0xfd, ++ 0x0b, 0xf7, 0x1a, 0xcb, 0x69, 0x63, 0xfb, 0xd0, 0x3b, 0x2c, 0xb0, 0x0e, ++ 0x78, 0xc3, 0x0b, 0xa6, 0xf7, 0x7c, 0xff, 0xb4, 0x39, 0x0f, 0xf2, 0xf7, ++ 0x0e, 0xd3, 0x3e, 0x27, 0xd3, 0x7c, 0x6b, 0x3f, 0x3f, 0xb1, 0xdf, 0xfb, ++ 0x4b, 0x98, 0x9f, 0x28, 0x94, 0x78, 0x81, 0xe7, 0xf9, 0xfe, 0x0b, 0x3f, ++ 0x37, 0xb0, 0x83, 0x9f, 0x1b, 0xf8, 0x22, 0xec, 0x67, 0xa5, 0xd7, 0xbd, ++ 0xb0, 0x9f, 0x95, 0x3e, 0x7f, 0x09, 0xf6, 0xb3, 0xd2, 0xfb, 0x7d, 0x7c, ++ 0x3f, 0x2b, 0xc9, 0xbe, 0xbc, 0xf3, 0xe1, 0xc5, 0xb9, 0x4e, 0x2a, 0xe7, ++ 0x43, 0xfb, 0xf4, 0x90, 0x21, 0x1e, 0x2a, 0xf6, 0x79, 0x77, 0xc2, 0xb9, ++ 0x49, 0x80, 0x07, 0xdc, 0x2a, 0x3b, 0x6f, 0xce, 0x45, 0xd1, 0x16, 0xe4, ++ 0xa3, 0x70, 0xbc, 0x68, 0x71, 0xf8, 0xec, 0x2a, 0x1d, 0x57, 0xf5, 0x4f, ++ 0x04, 0xf3, 0x51, 0xbe, 0x75, 0x66, 0x00, 0xe5, 0x61, 0x2b, 0x9f, 0x67, ++ 0xcd, 0x38, 0x46, 0x9c, 0xeb, 0x68, 0xa6, 0x4b, 0x8d, 0xf2, 0x51, 0x81, ++ 0x38, 0x55, 0xcf, 0x8c, 0x40, 0x4b, 0x73, 0x21, 0x1f, 0x30, 0x90, 0x9b, ++ 0x39, 0xd3, 0x76, 0x6e, 0x89, 0xc1, 0xd3, 0x9a, 0xc6, 0xe4, 0xa2, 0x8d, ++ 0xfb, 0x6d, 0xc1, 0xf3, 0x24, 0xf4, 0xbc, 0x14, 0x2d, 0x7f, 0xec, 0x3c, ++ 0xd9, 0xbd, 0x85, 0xc5, 0xd9, 0x82, 0x32, 0xe0, 0x0e, 0xf8, 0x8b, 0x8a, ++ 0x70, 0xc3, 0x10, 0x41, 0x1c, 0xd7, 0x50, 0xb2, 0x09, 0xfd, 0x2f, 0xc0, ++ 0x81, 0x80, 0xcb, 0xf0, 0x9c, 0xb1, 0x5c, 0xd8, 0x97, 0xfa, 0x12, 0xe2, ++ 0xb9, 0x86, 0xd1, 0xb9, 0xf7, 0x32, 0xdc, 0xa2, 0x8f, 0xc3, 0x71, 0x63, ++ 0x7c, 0x93, 0x91, 0x4f, 0x0c, 0x9f, 0x97, 0xbc, 0x8e, 0xe7, 0x33, 0x37, ++ 0x0c, 0xc5, 0x97, 0xb7, 0x68, 0x1e, 0x53, 0x4b, 0x5f, 0x7e, 0xcc, 0xfe, ++ 0x83, 0xa6, 0xd1, 0x40, 0x13, 0xc7, 0x47, 0xae, 0xd8, 0xf3, 0x11, 0x54, ++ 0x93, 0x5c, 0x99, 0xeb, 0x49, 0x2b, 0x91, 0x70, 0x5c, 0x16, 0x16, 0xf0, ++ 0x78, 0x0f, 0x5f, 0xff, 0x10, 0xe3, 0xb9, 0x61, 0xf5, 0x00, 0xe6, 0x7b, ++ 0xf4, 0x97, 0xd8, 0x3c, 0x10, 0x5f, 0x30, 0xe3, 0x44, 0x33, 0xce, 0x57, ++ 0x4b, 0xd8, 0x7e, 0x31, 0xe5, 0x56, 0xb6, 0x6f, 0xb5, 0xe1, 0x3c, 0xc1, ++ 0xfc, 0x78, 0x14, 0x98, 0xcc, 0xe8, 0x39, 0x6c, 0x2a, 0xcf, 0xe7, 0xed, ++ 0x74, 0x05, 0xbc, 0x10, 0xc7, 0x6c, 0xf4, 0x9a, 0x70, 0x2f, 0x3f, 0x47, ++ 0xaa, 0xa2, 0xc0, 0x88, 0xe7, 0xcd, 0x78, 0x5f, 0x1d, 0x52, 0x4d, 0x78, ++ 0x3f, 0xc8, 0xe6, 0xc3, 0xf5, 0x6c, 0x3c, 0x8f, 0x7f, 0x40, 0xd0, 0x8f, ++ 0x7a, 0x7e, 0x07, 0x8b, 0x0f, 0x74, 0xb9, 0x3d, 0x4c, 0xfe, 0x48, 0x08, ++ 0xfd, 0x9e, 0x4a, 0xb7, 0xe5, 0xe6, 0x2d, 0x1e, 0x58, 0xa7, 0x62, 0xfb, ++ 0x30, 0xcb, 0x46, 0x09, 0xc6, 0x4b, 0xca, 0x86, 0x3c, 0xb8, 0xaf, 0xba, ++ 0x72, 0x98, 0x84, 0xaf, 0x9d, 0x85, 0xe7, 0x0d, 0xb7, 0xe3, 0x79, 0x42, ++ 0x26, 0xfe, 0x55, 0x42, 0xa8, 0x37, 0x1d, 0xea, 0xf1, 0xf4, 0x4d, 0x85, ++ 0x78, 0x9e, 0x42, 0x36, 0xc2, 0x39, 0x32, 0x99, 0xf6, 0x56, 0x1d, 0xf4, ++ 0x40, 0x75, 0xaf, 0xc6, 0x7d, 0x37, 0x90, 0xc7, 0x30, 0x85, 0xc9, 0x91, ++ 0x3d, 0x96, 0xbf, 0x6a, 0xf2, 0xd1, 0x0d, 0xa0, 0x02, 0x95, 0x3c, 0xae, ++ 0x26, 0x7e, 0x9f, 0x62, 0x9a, 0x7d, 0x0f, 0xca, 0x41, 0xcc, 0xf8, 0x4d, ++ 0xb8, 0x1e, 0xa6, 0x72, 0xb9, 0x13, 0xeb, 0x5b, 0x7e, 0x5e, 0xbf, 0x7f, ++ 0x98, 0xe5, 0xb5, 0x99, 0xe5, 0x20, 0xcd, 0x3e, 0x82, 0xf1, 0xf8, 0xaa, ++ 0x51, 0x0d, 0xcf, 0x7b, 0x36, 0x8f, 0xbb, 0x79, 0x5c, 0xab, 0xb4, 0xc8, ++ 0xbb, 0x4f, 0xc0, 0xfe, 0x8c, 0xf3, 0xc9, 0xde, 0xf5, 0x30, 0xce, 0x76, ++ 0x36, 0xce, 0x62, 0x1c, 0x55, 0xb9, 0x5b, 0x86, 0x7d, 0x1c, 0x44, 0x61, ++ 0xe3, 0x25, 0xd6, 0xbf, 0xcc, 0xf1, 0xd7, 0x72, 0xd3, 0xfe, 0x38, 0x33, ++ 0x5d, 0xe2, 0x5c, 0x84, 0x35, 0x9a, 0x69, 0xbf, 0x18, 0xc7, 0xf1, 0x55, ++ 0x9c, 0xba, 0xf6, 0xa4, 0x3d, 0x86, 0xf3, 0x69, 0xab, 0xb8, 0x9d, 0x19, ++ 0x9b, 0xb7, 0xed, 0x79, 0x7c, 0x1d, 0x8b, 0x9d, 0x67, 0xda, 0x35, 0x3c, ++ 0xf1, 0x3a, 0x56, 0x97, 0x8b, 0x9d, 0xef, 0x47, 0x5c, 0x4b, 0x26, 0xb1, ++ 0x7b, 0xeb, 0x99, 0xff, 0xcd, 0xcf, 0x11, 0x28, 0x2f, 0x25, 0xc9, 0x80, ++ 0x73, 0xca, 0x87, 0x09, 0x93, 0xaf, 0xc7, 0x2c, 0x21, 0x47, 0x4e, 0x6c, ++ 0xf9, 0x90, 0x61, 0xff, 0xb8, 0x73, 0x78, 0x59, 0x03, 0x9e, 0xc7, 0xe8, ++ 0x72, 0xd5, 0x40, 0x9c, 0xad, 0x9c, 0xb0, 0xf5, 0x4a, 0x7d, 0x88, 0xe0, ++ 0xfa, 0xa5, 0x4e, 0xf6, 0xc8, 0x81, 0x98, 0x7e, 0x89, 0x75, 0x10, 0x95, ++ 0xc7, 0xc5, 0x54, 0x89, 0xf5, 0x4b, 0xf0, 0xc9, 0x4c, 0xdf, 0x5d, 0xa3, ++ 0x46, 0x7f, 0xe8, 0x2b, 0x41, 0xe3, 0xbe, 0x87, 0x3b, 0x1e, 0x35, 0xee, ++ 0xd3, 0xf8, 0xd2, 0xea, 0x2c, 0xc3, 0xfb, 0xba, 0xfb, 0xf2, 0x0c, 0xef, ++ 0x6b, 0x3d, 0x37, 0x1a, 0xee, 0xbf, 0xe8, 0x36, 0x9e, 0x13, 0xf4, 0x85, ++ 0x80, 0xf1, 0x9c, 0xa0, 0xa5, 0x2d, 0xd5, 0x86, 0xf2, 0x8b, 0x9b, 0x8d, ++ 0xe7, 0x04, 0xdd, 0x56, 0x6f, 0x3c, 0x27, 0xa8, 0x51, 0xbf, 0xc3, 0xa4, ++ 0xbf, 0xba, 0x41, 0xbe, 0x7b, 0xa4, 0x81, 0x1f, 0x42, 0xff, 0x2d, 0x8e, ++ 0xdf, 0xe7, 0x4d, 0x14, 0x0f, 0xae, 0x98, 0x6c, 0xdd, 0x38, 0xc8, 0xce, ++ 0x0d, 0x42, 0x3f, 0x30, 0xce, 0x7e, 0x17, 0xf3, 0xbe, 0xb6, 0xf7, 0x35, ++ 0x81, 0x17, 0x8c, 0x7a, 0xd0, 0x17, 0xf4, 0xb3, 0x73, 0x75, 0x86, 0x3c, ++ 0x3b, 0xfc, 0xf4, 0xfe, 0x00, 0xf1, 0x2a, 0xe8, 0xe0, 0xf2, 0xf3, 0x83, ++ 0x6a, 0x09, 0x2b, 0x57, 0xeb, 0x66, 0xeb, 0x2d, 0x35, 0x19, 0xf1, 0xfd, ++ 0x79, 0x61, 0x07, 0xcd, 0xeb, 0x15, 0xe2, 0xfc, 0xbf, 0xf2, 0xe1, 0x01, ++ 0x94, 0x83, 0x0a, 0xd3, 0x79, 0x7f, 0x65, 0xee, 0xf9, 0x71, 0xcf, 0xf3, ++ 0x7c, 0x47, 0xe3, 0x78, 0x41, 0x9c, 0x7f, 0x91, 0xe0, 0x9c, 0x8b, 0x71, ++ 0xf3, 0xf7, 0xe5, 0xf6, 0x8f, 0xaf, 0x33, 0x4d, 0xda, 0x3f, 0xde, 0x6e, ++ 0x19, 0x19, 0x38, 0xe8, 0xcc, 0x49, 0xdc, 0xbf, 0xcb, 0xed, 0xd7, 0x58, ++ 0x1e, 0x17, 0x9c, 0x3b, 0x48, 0xf9, 0x31, 0x00, 0x8f, 0xa6, 0xb3, 0xf7, ++ 0x1a, 0xd5, 0xb7, 0x8d, 0x69, 0x05, 0x78, 0xce, 0x45, 0x86, 0xbd, 0x4a, ++ 0x4a, 0x99, 0x1a, 0x8d, 0x77, 0x12, 0x7d, 0xf6, 0x65, 0xe5, 0x9d, 0xf5, ++ 0xf2, 0x38, 0x3e, 0xd1, 0x97, 0x5e, 0xd6, 0xb9, 0xa5, 0x19, 0x76, 0x0f, ++ 0xd3, 0x7f, 0x9d, 0xe1, 0xa3, 0x8d, 0x92, 0x1e, 0x82, 0x73, 0xf2, 0xcc, ++ 0xeb, 0xa6, 0x2a, 0x9f, 0x4f, 0xa7, 0x45, 0xd8, 0x79, 0x17, 0x3e, 0x7e, ++ 0xde, 0x45, 0xd2, 0x46, 0xa2, 0x17, 0x52, 0x16, 0x05, 0xab, 0x08, 0xae, ++ 0xe3, 0x07, 0x73, 0xed, 0xa1, 0x0d, 0x12, 0xe4, 0x8d, 0xb3, 0xfd, 0xa4, ++ 0x6d, 0xd7, 0x5b, 0x70, 0xfe, 0x69, 0x1b, 0xd1, 0xb7, 0xc1, 0xef, 0x5a, ++ 0xb4, 0x5f, 0xaf, 0xe0, 0x7e, 0xc6, 0x5a, 0x59, 0xc3, 0xf2, 0x6a, 0x36, ++ 0x9b, 0x9f, 0x7c, 0x90, 0x63, 0x0f, 0xf9, 0x12, 0xaf, 0xe9, 0x2d, 0x86, ++ 0x73, 0x3a, 0xdc, 0xeb, 0x5d, 0xa0, 0x27, 0xea, 0x4f, 0xd8, 0xfb, 0x44, ++ 0xfd, 0xe9, 0x9e, 0xae, 0xb6, 0xc4, 0xf3, 0x17, 0x4a, 0x52, 0x98, 0xdc, ++ 0x9f, 0x50, 0x9a, 0x0b, 0x53, 0x50, 0x3e, 0x74, 0x37, 0x5b, 0x8f, 0x08, ++ 0xe1, 0xb9, 0x67, 0x22, 0xff, 0x36, 0x51, 0xde, 0x2d, 0x05, 0x8e, 0x2e, ++ 0xb4, 0xdb, 0x44, 0xe0, 0x03, 0x36, 0x7e, 0xdf, 0x83, 0xf5, 0x94, 0x38, ++ 0xfa, 0xeb, 0x4f, 0x61, 0x7e, 0xb1, 0xaf, 0x50, 0x0a, 0x59, 0x21, 0x8f, ++ 0xf4, 0x76, 0x12, 0xb2, 0x4e, 0xe0, 0x57, 0x76, 0xbb, 0x2d, 0x71, 0xe3, ++ 0x19, 0x37, 0xa4, 0x70, 0x7f, 0xf9, 0xe2, 0x25, 0x3c, 0xcf, 0x4e, 0x15, ++ 0xe7, 0xeb, 0x65, 0xb1, 0xf3, 0xf5, 0x7a, 0x4d, 0xe7, 0x56, 0xde, 0xc0, ++ 0xfb, 0x79, 0x20, 0xc5, 0x8e, 0xd7, 0xde, 0x9c, 0xdd, 0x6c, 0x9f, 0xaa, ++ 0xe9, 0x7c, 0xf4, 0x06, 0xcf, 0x0a, 0x12, 0x8b, 0x67, 0xc5, 0x39, 0x3f, ++ 0x6a, 0xe4, 0x1d, 0x8c, 0x33, 0x1d, 0x9f, 0xe4, 0x7c, 0x11, 0xb1, 0xfe, ++ 0xb4, 0x95, 0xef, 0x5f, 0xae, 0x3e, 0x6f, 0x69, 0x8e, 0x47, 0xff, 0x87, ++ 0x29, 0x0a, 0xd2, 0xf1, 0xbc, 0x66, 0x8d, 0xdb, 0xbf, 0x6f, 0x71, 0x7a, ++ 0xbb, 0x67, 0x7a, 0xf1, 0x5c, 0xd5, 0xb6, 0x27, 0x2d, 0x78, 0x8e, 0xbe, ++ 0xcf, 0xdd, 0x76, 0x15, 0xee, 0xef, 0x4e, 0xf9, 0x1a, 0x61, 0xf1, 0x2e, ++ 0x46, 0x7f, 0x03, 0xd7, 0x53, 0x9f, 0x3b, 0xb4, 0x81, 0xa4, 0xe0, 0x3a, ++ 0xf5, 0xd3, 0xf0, 0x3b, 0x21, 0x6a, 0xa9, 0x0d, 0x62, 0x79, 0xe4, 0xf8, ++ 0xf5, 0xad, 0x78, 0x2e, 0xec, 0x56, 0xc8, 0x9b, 0xcb, 0x89, 0xf6, 0x2f, ++ 0x45, 0xac, 0x5b, 0xef, 0x38, 0x50, 0x9f, 0x57, 0xc2, 0xce, 0x9f, 0x87, ++ 0x78, 0x4f, 0xdd, 0x10, 0xcb, 0x2b, 0x5f, 0x54, 0xba, 0x93, 0xe7, 0x91, ++ 0x0c, 0xe2, 0x7e, 0x45, 0xf3, 0xef, 0x94, 0x94, 0xd5, 0x07, 0x74, 0x98, ++ 0x97, 0x17, 0x35, 0x85, 0x37, 0x20, 0xfe, 0xf1, 0x7a, 0xfc, 0xf8, 0xbb, ++ 0x25, 0xc4, 0xbb, 0x0e, 0x7f, 0x47, 0x65, 0xdc, 0xbe, 0x4a, 0x0d, 0x71, ++ 0x57, 0xf7, 0x28, 0x93, 0xfb, 0xee, 0x9f, 0x7b, 0x7b, 0xf1, 0x77, 0x40, ++ 0xdc, 0x02, 0x37, 0xea, 0x4d, 0xb5, 0x99, 0xd1, 0xf3, 0xc1, 0x2a, 0x46, ++ 0x0e, 0x6c, 0x84, 0x25, 0x18, 0xf3, 0xf9, 0x60, 0xe6, 0xf3, 0x85, 0x84, ++ 0x5f, 0xa6, 0x9a, 0x70, 0xa5, 0xf0, 0xc7, 0x1a, 0x49, 0xe8, 0xa0, 0x22, ++ 0x8d, 0x8f, 0x33, 0x27, 0xf2, 0xc7, 0x1e, 0x4f, 0xe1, 0x78, 0xe4, 0x7a, ++ 0xea, 0x8f, 0xd1, 0xf1, 0xbf, 0xcb, 0xc6, 0xf2, 0x69, 0x7d, 0x6b, 0xa4, ++ 0x52, 0x70, 0x1a, 0x93, 0xd6, 0x48, 0xd3, 0xc1, 0x7e, 0xfd, 0x88, 0x8f, ++ 0xd3, 0x9b, 0x15, 0x01, 0x3c, 0xa7, 0xa5, 0x2d, 0xc1, 0x3e, 0xbb, 0x0b, ++ 0x63, 0xe5, 0xc2, 0xb8, 0x9f, 0xa9, 0x3b, 0x27, 0xe0, 0xf6, 0x4e, 0x50, ++ 0xfe, 0x86, 0x14, 0x99, 0xed, 0xcb, 0xbb, 0xc8, 0xce, 0xf7, 0x50, 0xed, ++ 0x2c, 0x8f, 0x6b, 0xec, 0xca, 0xf3, 0x5f, 0x84, 0x5c, 0xcf, 0x76, 0xda, ++ 0xb0, 0x7c, 0xa9, 0x93, 0xe9, 0x45, 0xe5, 0xa5, 0x17, 0xb2, 0x26, 0x9a, ++ 0x3f, 0xcb, 0x7c, 0x01, 0x02, 0xfd, 0xa1, 0xf6, 0x25, 0x6e, 0x7e, 0xd8, ++ 0x8b, 0x29, 0x6c, 0x3f, 0xa2, 0x1a, 0x66, 0xe7, 0x54, 0xa8, 0xed, 0xef, ++ 0xd4, 0xc4, 0xd3, 0x67, 0xa1, 0x87, 0x0f, 0xa9, 0xcd, 0x7b, 0xc1, 0x7e, ++ 0x6c, 0x94, 0x56, 0x87, 0x92, 0xd0, 0x0e, 0x5c, 0xfe, 0xf9, 0x95, 0x37, ++ 0xc9, 0x9f, 0xdd, 0xde, 0x5c, 0xd4, 0xf4, 0x83, 0x29, 0xb4, 0xff, 0xaf, ++ 0x59, 0x7f, 0xe4, 0x01, 0xfd, 0xd8, 0x10, 0x30, 0xfe, 0xbe, 0x94, 0xb8, ++ 0xbe, 0xa6, 0x05, 0xec, 0xc8, 0x7f, 0xf7, 0x01, 0x07, 0xf8, 0x9b, 0x1f, ++ 0x24, 0x07, 0x8e, 0x02, 0xdd, 0x10, 0xef, 0x86, 0x7d, 0x84, 0xdd, 0x91, ++ 0x17, 0xed, 0x68, 0x4f, 0x4d, 0x7c, 0x37, 0xd7, 0xb3, 0xda, 0xc9, 0xf8, ++ 0xae, 0x7a, 0xd8, 0x7b, 0xf2, 0x6f, 0xba, 0x67, 0x49, 0x4c, 0x9c, 0xa4, ++ 0xde, 0x29, 0xf1, 0xf9, 0x43, 0x3f, 0x05, 0x74, 0x15, 0x5b, 0xf5, 0xb7, ++ 0xa0, 0x9d, 0xcd, 0x55, 0xf1, 0xd7, 0x21, 0x33, 0x95, 0xaa, 0xd3, 0xf0, ++ 0xbe, 0x4a, 0x6b, 0xfe, 0x03, 0x5c, 0xbb, 0x23, 0xbb, 0x30, 0x7e, 0x9c, ++ 0x9c, 0xac, 0xff, 0x0f, 0xf8, 0xbe, 0x42, 0xd1, 0xff, 0x1d, 0x9e, 0xff, ++ 0x93, 0x55, 0x1f, 0x64, 0x76, 0xba, 0xc6, 0xf5, 0x5e, 0x41, 0x74, 0x5f, ++ 0x43, 0xa2, 0x71, 0x86, 0x85, 0x8b, 0xf7, 0x0a, 0x62, 0xf9, 0xf5, 0xd9, ++ 0xf8, 0x9c, 0x61, 0x6f, 0x1e, 0x61, 0xe3, 0xac, 0x07, 0xb4, 0x2b, 0x1c, ++ 0x67, 0x27, 0xbd, 0x7e, 0x09, 0xe6, 0x16, 0xfa, 0x7c, 0xb0, 0x22, 0xfe, ++ 0x7a, 0xfb, 0x8f, 0xb8, 0x3c, 0x51, 0x3d, 0xc3, 0x7c, 0x05, 0xb1, 0xef, ++ 0xc5, 0xe7, 0x26, 0x7a, 0xbc, 0xf9, 0x4b, 0x94, 0xa7, 0xe3, 0x2f, 0x3b, ++ 0x31, 0xaf, 0x3d, 0xd8, 0x0c, 0x79, 0x9d, 0xc7, 0xaf, 0xb2, 0x90, 0x5d, ++ 0x31, 0x76, 0x4e, 0x9c, 0x57, 0xd0, 0x16, 0x61, 0x7e, 0xe1, 0xb9, 0x47, ++ 0xa4, 0x5d, 0xcc, 0x2f, 0x24, 0x78, 0xff, 0xf3, 0xaf, 0xe7, 0xec, 0x82, ++ 0xf5, 0xdd, 0xdb, 0x67, 0x72, 0x3d, 0xe6, 0xfb, 0x2e, 0xee, 0x7e, 0xc4, ++ 0xb8, 0x1f, 0x5a, 0xb4, 0x3b, 0x37, 0x95, 0x8f, 0xff, 0x24, 0xfa, 0xd9, ++ 0xce, 0xcb, 0x6d, 0x48, 0x65, 0xfa, 0xf9, 0x83, 0x54, 0x16, 0x0f, 0xbb, ++ 0x6c, 0xfd, 0xcc, 0x60, 0xf5, 0x08, 0x3d, 0x55, 0x15, 0x76, 0xbd, 0xcb, ++ 0xc5, 0xe4, 0xeb, 0xdd, 0x54, 0x76, 0xb5, 0xa5, 0x49, 0x22, 0x7f, 0xfd, ++ 0x1a, 0xe0, 0x03, 0xd5, 0xc3, 0xc1, 0x94, 0x2b, 0x1b, 0x9f, 0xa7, 0x96, ++ 0xe6, 0x7d, 0x76, 0xf9, 0x10, 0xfa, 0xa0, 0x7a, 0x8d, 0xf9, 0x79, 0x5b, ++ 0xb8, 0xbe, 0x08, 0x7b, 0x45, 0xe9, 0x2c, 0x73, 0x32, 0x7b, 0x11, 0x48, ++ 0xbe, 0x32, 0x3a, 0x33, 0xcb, 0x3e, 0x07, 0x39, 0x16, 0xfb, 0x0f, 0x64, ++ 0x87, 0x64, 0x88, 0x87, 0x2f, 0x74, 0xf2, 0x78, 0x25, 0xd7, 0xdf, 0x13, ++ 0x8a, 0xbe, 0x08, 0xe8, 0xa4, 0xfa, 0x7b, 0x1b, 0xca, 0x57, 0x62, 0xfd, ++ 0x5d, 0xea, 0x64, 0xfa, 0xfb, 0x05, 0xa7, 0x51, 0x7f, 0x97, 0x39, 0x99, ++ 0xfe, 0x7e, 0xd1, 0xc9, 0xf4, 0xb7, 0xc5, 0xf9, 0x19, 0xf4, 0xf7, 0x7d, ++ 0xae, 0x3f, 0x7e, 0x1e, 0xc7, 0x27, 0x47, 0x8d, 0x76, 0x87, 0xe2, 0xe2, ++ 0x7b, 0xa0, 0xfe, 0x06, 0x45, 0xe2, 0xfb, 0xb9, 0xc9, 0x1f, 0xa5, 0x18, ++ 0xff, 0xa3, 0x61, 0x28, 0x40, 0x74, 0x36, 0x59, 0x3e, 0x17, 0x8b, 0x1b, ++ 0x28, 0x7e, 0xd5, 0x71, 0xff, 0xc6, 0x9b, 0xc6, 0xfa, 0x4e, 0xf1, 0xf1, ++ 0xa2, 0x76, 0xec, 0x01, 0xa8, 0xf7, 0x14, 0xb4, 0x4f, 0xfb, 0xb3, 0xe1, ++ 0xbf, 0x33, 0xfe, 0x01, 0x1f, 0x5f, 0x8c, 0xa3, 0x97, 0x82, 0x8f, 0xb2, ++ 0xad, 0xd5, 0x0d, 0xfb, 0x5f, 0x13, 0xcd, 0x73, 0x0b, 0x9d, 0x6c, 0x9e, ++ 0xf1, 0xdb, 0xd8, 0xfe, 0x0a, 0x72, 0x84, 0xb6, 0x5f, 0x64, 0xe8, 0xcf, ++ 0x77, 0x81, 0x7f, 0x63, 0xfd, 0x09, 0x52, 0xcf, 0x2e, 0x7e, 0x7f, 0x82, ++ 0x71, 0xfb, 0x33, 0x60, 0xac, 0x2f, 0xa6, 0x3f, 0x9b, 0xa1, 0x5e, 0xd1, ++ 0x9f, 0xca, 0x4b, 0x47, 0x27, 0xd4, 0x47, 0x9f, 0xd0, 0x47, 0x57, 0x58, ++ 0x86, 0x79, 0xdb, 0xa7, 0xc4, 0x9f, 0x17, 0xfa, 0x9d, 0x6c, 0xde, 0xfe, ++ 0xd0, 0xa1, 0x3f, 0x09, 0xf5, 0x9b, 0xe5, 0x4b, 0x5c, 0xff, 0x91, 0xeb, ++ 0x43, 0xa2, 0x7d, 0x30, 0x27, 0x94, 0xaa, 0x7f, 0x04, 0x7e, 0x97, 0x29, ++ 0xcc, 0x0e, 0x12, 0x2d, 0x3c, 0x28, 0xc7, 0xf4, 0xaf, 0xac, 0xa0, 0x55, ++ 0xf4, 0x3b, 0x60, 0x89, 0x8d, 0xb3, 0x0d, 0xc5, 0xb7, 0x93, 0xbf, 0x70, ++ 0x8e, 0xd9, 0x87, 0x5f, 0xa0, 0xfc, 0xed, 0x60, 0xfb, 0x76, 0xa8, 0x5c, ++ 0xff, 0x12, 0xee, 0xef, 0x9a, 0xe2, 0x5a, 0x86, 0xfb, 0xbc, 0x3e, 0x62, ++ 0x76, 0xf3, 0xd4, 0x27, 0x6b, 0xac, 0x69, 0xb4, 0x9d, 0x96, 0x8c, 0xed, ++ 0xdf, 0x83, 0xeb, 0x69, 0x67, 0x1a, 0xd2, 0xdb, 0x3a, 0x92, 0xeb, 0x84, ++ 0x61, 0x18, 0xac, 0x60, 0xfb, 0x1f, 0xdb, 0xa6, 0xb3, 0x73, 0xd3, 0xda, ++ 0x24, 0xe3, 0xf9, 0x69, 0xa7, 0x79, 0x7b, 0x37, 0x70, 0xfb, 0x74, 0x05, ++ 0xfa, 0x7d, 0x2a, 0x57, 0xfe, 0xf4, 0xfa, 0xf1, 0x59, 0xed, 0x02, 0xe5, ++ 0xcf, 0x31, 0x61, 0x3f, 0x93, 0xf2, 0xae, 0xcc, 0x2e, 0xcd, 0xf9, 0x1c, ++ 0xda, 0xbf, 0x7d, 0x26, 0x41, 0x7c, 0xdc, 0xb6, 0x53, 0xc5, 0x73, 0xb6, ++ 0x84, 0xde, 0xdc, 0x05, 0x63, 0xcb, 0xce, 0x3b, 0xd0, 0x21, 0x8f, 0xe2, ++ 0xab, 0xf4, 0xde, 0x42, 0xef, 0x47, 0xc0, 0xe9, 0x06, 0x7b, 0x95, 0x4d, ++ 0x88, 0xbb, 0x18, 0xcb, 0x05, 0x55, 0x3c, 0x0f, 0x41, 0xff, 0x0f, 0x66, ++ 0x8f, 0xf4, 0xf7, 0xe0, 0x4a, 0xed, 0xd0, 0xfb, 0xdc, 0x0e, 0x0d, 0xc1, ++ 0x95, 0xda, 0xa1, 0x33, 0x9f, 0xc5, 0x0e, 0x1d, 0x74, 0x32, 0x3b, 0xd4, ++ 0x4e, 0x65, 0x68, 0x00, 0xe4, 0x50, 0x09, 0xb1, 0xfc, 0x5e, 0xee, 0x4f, ++ 0x35, 0xf0, 0xbe, 0x96, 0x15, 0x1c, 0x34, 0xc4, 0xed, 0x84, 0x3f, 0xd5, ++ 0x3d, 0xb4, 0x4b, 0x0b, 0x42, 0xde, 0x60, 0x01, 0xdb, 0x8f, 0x9a, 0xa8, ++ 0xdd, 0x30, 0xf8, 0x1b, 0x90, 0xb8, 0x92, 0xe0, 0x77, 0xab, 0xc4, 0xd5, ++ 0xff, 0xe4, 0x72, 0x3b, 0x38, 0x01, 0x1b, 0x28, 0xae, 0x83, 0x38, 0xaa, ++ 0xf8, 0x1d, 0xbd, 0x6e, 0x68, 0x5f, 0x83, 0xf6, 0x2c, 0xf8, 0x3b, 0x3f, ++ 0xaf, 0x11, 0x19, 0xd7, 0xe1, 0xcd, 0xf5, 0xb5, 0xcd, 0xe0, 0xf3, 0x7e, ++ 0x0a, 0x97, 0xe7, 0xe9, 0x2b, 0xd0, 0xbf, 0x32, 0xff, 0x8e, 0x5e, 0xb5, ++ 0x3b, 0xb4, 0xb5, 0x98, 0xd6, 0xe3, 0x3b, 0x72, 0x37, 0xdb, 0x67, 0x75, ++ 0xf1, 0x6e, 0xb2, 0xac, 0x08, 0xf0, 0x49, 0x80, 0xc0, 0x79, 0x9b, 0x2a, ++ 0xbd, 0x42, 0xfe, 0xa6, 0xa0, 0x7b, 0x66, 0xea, 0xb5, 0x24, 0xf6, 0xf7, ++ 0x88, 0x55, 0x22, 0x29, 0xf3, 0x0b, 0xa3, 0x76, 0xa4, 0x3a, 0x42, 0xc2, ++ 0x95, 0x25, 0x88, 0x6f, 0x70, 0x3f, 0x17, 0xd4, 0xe3, 0xe1, 0xf5, 0x04, ++ 0x8a, 0x60, 0xbe, 0x4f, 0x53, 0x60, 0xbd, 0xef, 0xb5, 0x04, 0xbf, 0xc7, ++ 0xf4, 0xa4, 0x1c, 0xb8, 0x26, 0x35, 0xa6, 0x7e, 0x3f, 0x31, 0xe2, 0x15, ++ 0x3a, 0xfe, 0xd7, 0xa6, 0xce, 0xc1, 0xf1, 0xbf, 0x0e, 0xca, 0xd1, 0xf1, ++ 0x2f, 0x48, 0x65, 0xf3, 0xd0, 0xf5, 0xf0, 0xfc, 0x8c, 0x93, 0xd9, 0xbf, ++ 0x27, 0xe5, 0xe6, 0x42, 0x78, 0x1e, 0xc8, 0x60, 0x4b, 0xd0, 0xb4, 0x7c, ++ 0x11, 0x2f, 0x3f, 0x2b, 0xf5, 0x73, 0x90, 0x93, 0x0d, 0x84, 0xfd, 0xfe, ++ 0x2e, 0xc8, 0x6f, 0xec, 0x7a, 0xf5, 0x2e, 0x6e, 0x1f, 0x3a, 0xa7, 0x06, ++ 0x2a, 0xa0, 0x9d, 0x9a, 0x9f, 0x2f, 0xee, 0xbb, 0x8a, 0x7e, 0xb2, 0xb2, ++ 0xa3, 0x15, 0xcf, 0x39, 0xae, 0xbc, 0x3a, 0xf2, 0xd1, 0x09, 0xc8, 0xbf, ++ 0xcd, 0x52, 0x71, 0x3d, 0xb0, 0xed, 0x31, 0xe3, 0x3c, 0xf2, 0x1c, 0xff, ++ 0xbe, 0x2b, 0x55, 0xc4, 0xef, 0xae, 0x0c, 0x47, 0x50, 0xfb, 0xd7, 0x90, ++ 0x8a, 0xf4, 0x31, 0xfb, 0x17, 0x74, 0xb3, 0xdf, 0x19, 0x6d, 0x9d, 0x9e, ++ 0xfb, 0x38, 0x83, 0x8f, 0xd4, 0xc1, 0xcc, 0x8c, 0x9e, 0x5f, 0x5b, 0xe3, ++ 0x5a, 0x8c, 0xe7, 0x73, 0x7d, 0xe3, 0x85, 0x9c, 0x62, 0x38, 0xef, 0x4a, ++ 0xe5, 0xf6, 0x79, 0xbe, 0xbb, 0x57, 0x5d, 0x0e, 0xe3, 0x1a, 0x19, 0x8c, ++ 0x9b, 0x6f, 0xfa, 0x95, 0x31, 0x3b, 0x48, 0xad, 0xb7, 0x61, 0x9e, 0x8a, ++ 0x7f, 0xce, 0xcb, 0x03, 0xa9, 0x0c, 0xd7, 0x52, 0x3d, 0xfe, 0x2a, 0x1f, ++ 0xbf, 0xbb, 0x80, 0xce, 0x17, 0xa7, 0xea, 0x81, 0xd4, 0x39, 0xff, 0x75, ++ 0xf6, 0x51, 0xd8, 0xa1, 0x80, 0xc2, 0xec, 0x0d, 0xf5, 0x9b, 0x82, 0xe0, ++ 0x37, 0x2d, 0xbb, 0xb0, 0xfa, 0x10, 0x4c, 0x53, 0x2d, 0x64, 0x7b, 0x2d, ++ 0xac, 0x6f, 0x50, 0xb9, 0xfc, 0x3b, 0xa0, 0xf3, 0xcb, 0xf6, 0x3d, 0x87, ++ 0xd8, 0x4f, 0x0f, 0x06, 0xaf, 0x82, 0x76, 0xa9, 0x3c, 0x3e, 0x9a, 0xca, ++ 0xec, 0xd1, 0xdf, 0xa7, 0x32, 0x7b, 0xf4, 0x9d, 0x54, 0x66, 0x8f, 0xfe, ++ 0xe1, 0xb3, 0xc8, 0xd9, 0xbd, 0xa9, 0x64, 0x42, 0xfc, 0x29, 0x70, 0xb8, ++ 0xc0, 0xdf, 0xd4, 0xce, 0x6f, 0x49, 0x65, 0xf8, 0xd3, 0xe3, 0xfc, 0x7c, ++ 0xe6, 0x8d, 0x1d, 0xbc, 0xbe, 0x80, 0xf3, 0x0a, 0xe7, 0x8d, 0x2f, 0x7d, ++ 0x0e, 0xed, 0x53, 0xbc, 0xf1, 0x33, 0xd4, 0x57, 0xce, 0x87, 0x44, 0xf8, ++ 0xf6, 0x17, 0x5c, 0xae, 0x7e, 0x99, 0x2a, 0xe2, 0x7e, 0xfa, 0x2f, 0x81, ++ 0xff, 0x8b, 0xec, 0xfa, 0x3f, 0xa7, 0xc6, 0xe2, 0x8d, 0xc2, 0x23, 0x7f, ++ 0x84, 0x3c, 0xb9, 0x28, 0xde, 0xe8, 0x95, 0x39, 0xde, 0x50, 0x62, 0xe3, ++ 0xd9, 0x3e, 0x8a, 0xbf, 0x78, 0x5e, 0xdd, 0x3d, 0x96, 0xb9, 0x51, 0x3d, ++ 0x51, 0x23, 0xf1, 0x71, 0xc8, 0x82, 0xd4, 0x31, 0x1c, 0xd2, 0x89, 0xe3, ++ 0xbd, 0x95, 0xe1, 0x90, 0x05, 0x63, 0x74, 0x7b, 0x87, 0x42, 0xa0, 0x87, ++ 0x57, 0x71, 0x7d, 0xff, 0x1d, 0xb3, 0xc7, 0xad, 0xea, 0xe0, 0x3d, 0x78, ++ 0x0e, 0x6e, 0x3a, 0xa3, 0x5b, 0x4a, 0x67, 0xe3, 0x78, 0x98, 0xf7, 0xe3, ++ 0x6d, 0x29, 0x25, 0x6e, 0x7c, 0xf3, 0x48, 0xb4, 0xbd, 0x23, 0xd8, 0xde, ++ 0x1a, 0xd6, 0x9e, 0xec, 0xb8, 0x99, 0xfd, 0xee, 0x87, 0xb0, 0x2b, 0x56, ++ 0x09, 0xdb, 0x11, 0xf1, 0xe1, 0x05, 0xe9, 0xec, 0x3b, 0xd1, 0xce, 0x7c, ++ 0x7e, 0x15, 0x38, 0xd5, 0xdc, 0xce, 0x6f, 0xa3, 0xed, 0xfc, 0x16, 0xdb, ++ 0x79, 0x44, 0xec, 0x03, 0xd6, 0x4f, 0xc1, 0xbd, 0x2f, 0xca, 0xd7, 0x70, ++ 0x2c, 0x5f, 0xc1, 0xbe, 0x58, 0xe6, 0xc6, 0xf0, 0x93, 0xe3, 0xba, 0x44, ++ 0x38, 0x2e, 0x86, 0x7f, 0xef, 0xa0, 0x1d, 0x68, 0x67, 0xed, 0x8c, 0xf1, ++ 0x2f, 0x10, 0xdf, 0xce, 0x2e, 0x73, 0xc9, 0x42, 0x4e, 0x86, 0x52, 0x27, ++ 0x90, 0x8f, 0xb3, 0x5c, 0x3e, 0x3e, 0x88, 0xca, 0xc7, 0x07, 0x5c, 0x3e, ++ 0x3e, 0x4c, 0x45, 0x7c, 0xc2, 0xc6, 0xe1, 0xae, 0x29, 0xc6, 0xfd, 0xe5, ++ 0xa3, 0x5c, 0xaf, 0x36, 0x73, 0x3e, 0x89, 0xf1, 0x32, 0xd3, 0xdf, 0xc6, ++ 0xdf, 0x8f, 0xf1, 0xc3, 0x73, 0xe4, 0xb9, 0x58, 0x5c, 0xeb, 0x2b, 0x48, ++ 0x5b, 0xd6, 0x02, 0x71, 0xcb, 0x76, 0xd9, 0x6b, 0xf1, 0x8c, 0x97, 0x37, ++ 0xfa, 0x2f, 0x1f, 0xf0, 0xee, 0xff, 0x02, 0x7d, 0x28, 0x2e, 0x2b, 0x00, ++ 0x80, 0x00, 0x00, 0x00, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x0b, 0xe5, 0x7d, 0x0b, 0x60, 0x14, 0xd5, 0xb9, 0xf0, 0x99, 0x9d, ++ 0xd9, 0xd9, 0x4d, 0xb2, 0x9b, 0x4c, 0xde, 0x1b, 0x48, 0xc2, 0x26, 0x80, ++ 0x0d, 0x1a, 0x70, 0x09, 0x21, 0x06, 0x08, 0x3a, 0x79, 0xf2, 0x0a, 0x10, ++ 0x11, 0x10, 0x14, 0x61, 0x79, 0x85, 0xf0, 0x4a, 0x22, 0x62, 0xeb, 0xf3, ++ 0x67, 0x31, 0x21, 0x3c, 0xd5, 0xe8, 0x55, 0x6b, 0x5b, 0xb4, 0x0b, 0x82, ++ 0x62, 0x8b, 0x36, 0x60, 0xaa, 0x88, 0x01, 0x37, 0x20, 0x88, 0xef, 0xd0, ++ 0x2a, 0x68, 0xf5, 0xb6, 0x41, 0xac, 0xa0, 0x22, 0x59, 0x50, 0xeb, 0xda, ++ 0xda, 0xf2, 0x9f, 0xef, 0x3b, 0x67, 0xb2, 0x33, 0x9b, 0x5d, 0xc0, 0xda, ++ 0xf6, 0x7a, 0xff, 0x3f, 0xde, 0xde, 0xc3, 0x39, 0x73, 0x9e, 0xdf, 0xfb, ++ 0xfb, 0xce, 0x37, 0xb3, 0x45, 0x84, 0xfd, 0xc9, 0x27, 0xbd, 0x92, 0x3b, ++ 0x97, 0x90, 0xb1, 0x7e, 0xa2, 0x7a, 0x6d, 0x84, 0x9c, 0x83, 0xbf, 0xab, ++ 0x82, 0xa5, 0x55, 0x11, 0x08, 0x49, 0x26, 0x64, 0x99, 0x5c, 0x65, 0x55, ++ 0x86, 0xd2, 0x01, 0x65, 0xf5, 0xce, 0xaa, 0x81, 0x84, 0xb4, 0x97, 0x74, ++ 0x2e, 0xa9, 0x0a, 0xd3, 0xff, 0xb6, 0x04, 0xda, 0x9f, 0xf6, 0x9b, 0x9e, ++ 0xbe, 0xa9, 0x2c, 0xd9, 0x49, 0xfb, 0x7b, 0x68, 0x7b, 0x0a, 0x21, 0xc3, ++ 0x1d, 0xf4, 0xdf, 0x22, 0x21, 0xd7, 0xd5, 0xb4, 0x8b, 0x6e, 0xdd, 0xb8, ++ 0xe9, 0x9f, 0x7e, 0x3c, 0x4f, 0x0d, 0x33, 0xcf, 0x4f, 0x12, 0x4c, 0xb8, ++ 0x6e, 0xc3, 0x0c, 0xd7, 0x21, 0x67, 0x3e, 0x9d, 0xc6, 0x61, 0x72, 0x6d, ++ 0x25, 0x3d, 0xfb, 0x35, 0xc7, 0xcb, 0xb8, 0xde, 0xa8, 0x6c, 0xaf, 0x14, ++ 0x47, 0xfb, 0xbd, 0x79, 0x86, 0x28, 0x9b, 0x69, 0xbf, 0xeb, 0x26, 0x0b, ++ 0xaa, 0x97, 0x9e, 0xab, 0x82, 0x9f, 0xcb, 0x96, 0xc0, 0xce, 0x91, 0xa5, ++ 0x48, 0xd8, 0x5f, 0xe5, 0xfb, 0x1c, 0x25, 0x77, 0xce, 0x0b, 0x77, 0x8e, ++ 0x7c, 0xfe, 0x7c, 0xb4, 0x93, 0xa8, 0x2d, 0x74, 0x9e, 0xd1, 0x0a, 0x51, ++ 0x77, 0x86, 0xe9, 0x57, 0x08, 0xfb, 0x84, 0x79, 0xa2, 0xc3, 0xcf, 0x33, ++ 0x8d, 0xcf, 0x33, 0x86, 0xb0, 0x79, 0x42, 0x9f, 0xcf, 0xe0, 0xfb, 0x1a, ++ 0x55, 0x12, 0x7e, 0xfc, 0x08, 0x3e, 0xff, 0x34, 0xc7, 0x8e, 0xf2, 0x04, ++ 0x02, 0xfb, 0xd9, 0x64, 0x06, 0xf8, 0xe5, 0x99, 0xd5, 0x61, 0x0a, 0x1d, ++ 0xb7, 0x36, 0x02, 0x1e, 0x52, 0xa4, 0x92, 0x91, 0x80, 0xaf, 0x28, 0x0a, ++ 0x3a, 0x73, 0x1e, 0x21, 0x33, 0xe9, 0x58, 0x13, 0x9d, 0x60, 0x16, 0xe0, ++ 0x9c, 0x96, 0x0f, 0x8a, 0xee, 0x52, 0x78, 0xee, 0xa6, 0xe0, 0x70, 0xe4, ++ 0x01, 0x25, 0x78, 0x7a, 0x01, 0x5e, 0x4b, 0x6c, 0x6a, 0x19, 0xb4, 0x47, ++ 0x47, 0xab, 0xe5, 0x30, 0xff, 0x48, 0x49, 0xad, 0x80, 0xf2, 0x97, 0x66, ++ 0x75, 0x14, 0xe2, 0x9f, 0xf8, 0x08, 0x29, 0x20, 0x64, 0x02, 0xa7, 0x9f, ++ 0x09, 0x56, 0x9b, 0x4f, 0x8c, 0xa5, 0xff, 0x28, 0x34, 0x9f, 0xea, 0xb4, ++ 0xb2, 0xb6, 0x73, 0xd9, 0xf0, 0xff, 0x67, 0x28, 0x1f, 0x5f, 0x46, 0x88, ++ 0x40, 0x7c, 0xc2, 0xb9, 0xcb, 0xa0, 0xee, 0x15, 0x61, 0xfe, 0xe1, 0xce, ++ 0x43, 0xef, 0x0a, 0xb4, 0xff, 0x70, 0x6d, 0xdc, 0x49, 0x29, 0x64, 0x5c, ++ 0xba, 0xf2, 0x71, 0x0c, 0xaf, 0x8b, 0xb8, 0x2f, 0x84, 0xcf, 0x6e, 0xf3, ++ 0x4f, 0x9d, 0x36, 0x53, 0xcf, 0x73, 0x6a, 0xe5, 0x6e, 0x9b, 0xdb, 0x0a, ++ 0x70, 0x38, 0x1d, 0xed, 0x9e, 0x09, 0xfb, 0x6c, 0x70, 0x6c, 0xb6, 0x39, ++ 0x29, 0xbc, 0x5f, 0x75, 0xb7, 0x58, 0x5d, 0xb4, 0xfd, 0x64, 0x1c, 0x41, ++ 0x38, 0x76, 0xc5, 0xa8, 0x6e, 0x7c, 0xbe, 0x9b, 0xd4, 0xb4, 0xd0, 0x76, ++ 0x31, 0x46, 0xa8, 0x6f, 0xd1, 0xc1, 0x6f, 0xbe, 0xc2, 0xe0, 0x5d, 0xad, ++ 0x30, 0xbc, 0xbd, 0x25, 0xa9, 0xd5, 0x70, 0xfe, 0x09, 0x56, 0x75, 0x01, ++ 0x8c, 0x9b, 0x9c, 0x49, 0xf1, 0x44, 0xe7, 0x9d, 0x95, 0xd8, 0xb9, 0x5c, ++ 0x0f, 0xf7, 0x7a, 0x8e, 0xa7, 0x85, 0x9c, 0x6e, 0x67, 0xca, 0xac, 0x5f, ++ 0xe8, 0x3e, 0xab, 0xf9, 0xf3, 0x22, 0x49, 0xf0, 0xc4, 0xc0, 0x9e, 0x6c, ++ 0x87, 0x3e, 0x12, 0x81, 0x3f, 0x48, 0xf7, 0x5f, 0x3f, 0x13, 0xad, 0x8f, ++ 0x85, 0x7f, 0x51, 0xfe, 0x29, 0x3a, 0xa9, 0x4c, 0x9d, 0x96, 0x44, 0x71, ++ 0xb6, 0x46, 0x74, 0x99, 0x68, 0x5d, 0xce, 0x11, 0xc2, 0xf2, 0xe9, 0x9d, ++ 0x7c, 0xbf, 0x94, 0x4f, 0xef, 0x84, 0xfd, 0x12, 0x27, 0xe5, 0x53, 0x3b, ++ 0xa5, 0x0f, 0x39, 0x3c, 0x7d, 0x7c, 0xc5, 0xfb, 0x97, 0x47, 0xa0, 0xcb, ++ 0x3c, 0x7e, 0x9e, 0x32, 0x78, 0x1e, 0x66, 0xfc, 0xa5, 0x9c, 0xae, 0xcb, ++ 0x92, 0xda, 0x45, 0x42, 0xc7, 0x17, 0x71, 0x7e, 0x0b, 0xed, 0x37, 0x37, ++ 0x41, 0xc4, 0x7e, 0x0d, 0x2e, 0x32, 0x3a, 0xdc, 0x3c, 0x0f, 0x04, 0xe5, ++ 0xcb, 0x03, 0x48, 0x5f, 0x0a, 0xdb, 0x77, 0x9e, 0xb9, 0xea, 0x21, 0xa8, ++ 0xcf, 0x50, 0x0e, 0x97, 0xc7, 0xd3, 0xe6, 0xe2, 0xbb, 0x93, 0xa6, 0x92, ++ 0x24, 0x80, 0x87, 0x89, 0x58, 0xb2, 0x10, 0x4e, 0x56, 0x42, 0xe1, 0x24, ++ 0x71, 0x38, 0xd1, 0x6d, 0x12, 0xa8, 0x2f, 0xb3, 0xb2, 0xba, 0x14, 0xbd, ++ 0x84, 0xc4, 0xd1, 0x32, 0xd3, 0xe1, 0x5d, 0x3f, 0x08, 0xe0, 0xd7, 0x68, ++ 0x76, 0x39, 0x69, 0xfd, 0xc3, 0x93, 0x1f, 0x8a, 0x84, 0xd2, 0xd9, 0xd6, ++ 0x07, 0xce, 0x0a, 0x84, 0xca, 0x8b, 0xdd, 0x7e, 0x42, 0x12, 0xb3, 0x60, ++ 0x1e, 0x19, 0x66, 0x84, 0x3f, 0xd3, 0x39, 0xa1, 0xe7, 0x7c, 0xf4, 0x99, ++ 0x53, 0xd2, 0xd6, 0xa3, 0xa0, 0xb9, 0xf2, 0x24, 0x51, 0x2d, 0x94, 0x7e, ++ 0xaf, 0x2c, 0xf4, 0x4f, 0x22, 0xb1, 0x86, 0xf1, 0xe4, 0x1c, 0x9d, 0xcf, ++ 0xe6, 0xef, 0xf0, 0x08, 0x80, 0x3f, 0x2b, 0xf1, 0xc4, 0x5c, 0x8e, 0x64, ++ 0xfc, 0x76, 0xbf, 0x14, 0x9c, 0x15, 0xe7, 0x4b, 0xa5, 0xeb, 0xc2, 0x79, ++ 0xe4, 0x2f, 0x89, 0x17, 0xce, 0xa3, 0x3a, 0xdc, 0x95, 0x64, 0x10, 0x21, ++ 0xf1, 0xfe, 0xce, 0x5f, 0xd4, 0x61, 0xbb, 0xcd, 0x35, 0x0a, 0xcf, 0x45, ++ 0x6c, 0xc0, 0x6f, 0xc1, 0x73, 0x2e, 0x43, 0xfe, 0xd3, 0xf6, 0x25, 0xdb, ++ 0x3a, 0x1f, 0xbb, 0x97, 0xf6, 0x6f, 0xfb, 0x2a, 0xda, 0x75, 0x17, 0x9c, ++ 0xdb, 0x5f, 0xf1, 0x09, 0xdb, 0x0f, 0xf1, 0xd8, 0x81, 0xaf, 0xc5, 0x4a, ++ 0x17, 0xc8, 0x77, 0x42, 0x2c, 0xb8, 0x3f, 0x13, 0xfd, 0x0f, 0xf8, 0x6c, ++ 0x64, 0x80, 0xee, 0x37, 0x87, 0xef, 0x17, 0x16, 0xc9, 0xd7, 0xed, 0x9f, ++ 0xf4, 0x3c, 0xcf, 0x83, 0x62, 0xd5, 0x21, 0xc0, 0xc7, 0x2c, 0x2b, 0x51, ++ 0x63, 0xf3, 0x50, 0x3e, 0xbc, 0x02, 0xf5, 0xbe, 0x66, 0xda, 0x81, 0xc2, ++ 0xb1, 0x49, 0x11, 0xbc, 0x1e, 0xda, 0xaf, 0xe9, 0x81, 0x79, 0x6b, 0xb2, ++ 0x40, 0x5e, 0x6f, 0x90, 0x5c, 0xfd, 0x09, 0xd0, 0x39, 0xd9, 0x25, 0x50, ++ 0x3a, 0x1f, 0x41, 0xd7, 0xbd, 0x85, 0xca, 0x1d, 0xb9, 0x90, 0xd8, 0x14, ++ 0x5a, 0x97, 0x1d, 0xec, 0xfc, 0x4d, 0x77, 0x27, 0x6d, 0x8a, 0x11, 0xe0, ++ 0xb9, 0x44, 0x65, 0x21, 0x2d, 0xfd, 0xbe, 0x6f, 0x04, 0x0a, 0x87, 0x58, ++ 0x47, 0x75, 0xa5, 0x42, 0xcf, 0x21, 0xf3, 0xf1, 0x02, 0x05, 0x1c, 0x8c, ++ 0x17, 0x9c, 0x0a, 0x99, 0x91, 0x07, 0x74, 0xdb, 0x21, 0x12, 0x94, 0x0f, ++ 0x0e, 0x84, 0x87, 0xc6, 0x3f, 0xea, 0x8f, 0x88, 0xf0, 0xb1, 0x15, 0x55, ++ 0x0d, 0x01, 0xfa, 0x2a, 0x93, 0x88, 0xc7, 0x4a, 0xfb, 0x0b, 0x0e, 0x36, ++ 0xef, 0x95, 0xc4, 0x2f, 0x92, 0xbe, 0x80, 0x07, 0xaa, 0x08, 0x68, 0x59, ++ 0x42, 0x5c, 0x58, 0xde, 0x2b, 0xba, 0x3f, 0x06, 0xbe, 0xb1, 0xca, 0x14, ++ 0xaf, 0x74, 0xff, 0x56, 0x93, 0xd5, 0xbb, 0x52, 0x00, 0xfc, 0x55, 0xbd, ++ 0x3e, 0x1a, 0xe1, 0x5e, 0xa6, 0x7c, 0x9c, 0x13, 0x94, 0x67, 0x91, 0xe4, ++ 0x10, 0x40, 0xee, 0x63, 0x0d, 0xae, 0xe2, 0xf7, 0x97, 0x7b, 0xe5, 0xcb, ++ 0xc3, 0xf3, 0xd5, 0xdf, 0x82, 0x7c, 0xf3, 0x37, 0x26, 0x97, 0x99, 0x5e, ++ 0x9e, 0x9c, 0xcd, 0xe4, 0xce, 0x01, 0x7b, 0xe7, 0x0c, 0x3d, 0xdf, 0xaf, ++ 0x52, 0x98, 0xdc, 0x59, 0xc5, 0xc7, 0x11, 0x89, 0xf1, 0xd9, 0x32, 0x59, ++ 0x35, 0xc5, 0x9f, 0x87, 0xcf, 0xd7, 0xf2, 0x71, 0x97, 0x82, 0xf2, 0x01, ++ 0x7d, 0x4c, 0xc2, 0xf3, 0x71, 0x4b, 0x3c, 0x93, 0x07, 0x93, 0xef, 0xf2, ++ 0x36, 0xf5, 0xa2, 0xf0, 0x9b, 0x90, 0x20, 0xb8, 0x40, 0x0f, 0x97, 0x6f, ++ 0x9f, 0x2d, 0xf5, 0x76, 0x06, 0xfb, 0xa5, 0x72, 0x7d, 0xa7, 0xa4, 0xa8, ++ 0xf1, 0xf1, 0x30, 0xdf, 0x6e, 0xd7, 0x49, 0x6f, 0x12, 0x68, 0x1f, 0x19, ++ 0xf5, 0x7b, 0xd3, 0x7b, 0x64, 0x1a, 0xcc, 0x3f, 0x9b, 0xcb, 0xcf, 0x00, ++ 0x9f, 0xf7, 0x2f, 0xf1, 0x6c, 0x1f, 0xe9, 0xbc, 0x7e, 0x4c, 0xb0, 0x4f, ++ 0x0b, 0x07, 0x97, 0xcc, 0xf8, 0x6e, 0xb8, 0x64, 0xc2, 0xb9, 0x88, 0x9b, ++ 0xc1, 0x45, 0x8c, 0x19, 0xec, 0xf7, 0xd1, 0x75, 0x48, 0x6f, 0xbe, 0x8e, ++ 0x59, 0xc0, 0x75, 0xda, 0xb3, 0x99, 0x7c, 0xcc, 0xe6, 0xfb, 0xd2, 0xd6, ++ 0xe9, 0xc3, 0xe5, 0x1f, 0x95, 0xfb, 0x97, 0xc0, 0x3e, 0x27, 0x67, 0x7a, ++ 0xd3, 0xa1, 0xdf, 0xab, 0x66, 0xb6, 0xbf, 0xd0, 0x75, 0x07, 0x06, 0xd7, ++ 0x1d, 0x88, 0xeb, 0x2e, 0x61, 0xeb, 0x8e, 0x05, 0x39, 0x0f, 0xfc, 0xef, ++ 0x3c, 0xf4, 0x12, 0xc8, 0xf9, 0x22, 0x4e, 0xa7, 0x63, 0xfd, 0x6e, 0x02, ++ 0x76, 0x0f, 0xf0, 0xb0, 0xa9, 0x20, 0x28, 0xef, 0x65, 0xa7, 0x4f, 0xac, ++ 0xa7, 0xed, 0x45, 0x11, 0xe4, 0xfc, 0xf0, 0xe0, 0x3a, 0xc3, 0x71, 0x9d, ++ 0x7a, 0x86, 0xc7, 0x3d, 0x29, 0xea, 0x08, 0xd8, 0x27, 0xb5, 0x0b, 0x8a, ++ 0xa0, 0xbd, 0x3d, 0x5b, 0x41, 0x79, 0xf9, 0x66, 0x2f, 0x13, 0xd9, 0x4c, ++ 0xf9, 0x72, 0x76, 0x5a, 0xf6, 0x3d, 0x20, 0x36, 0xb5, 0x79, 0x76, 0xf2, ++ 0x73, 0xb6, 0x67, 0x35, 0x39, 0xe6, 0x50, 0x7c, 0xc9, 0x7e, 0xe2, 0xb2, ++ 0x20, 0x9d, 0xd7, 0xa0, 0xdc, 0x2b, 0xe2, 0xf2, 0xa5, 0x61, 0xb7, 0x9b, ++ 0xc0, 0x73, 0x4f, 0x2f, 0x2a, 0x33, 0x75, 0xe3, 0x65, 0xff, 0x1c, 0x2b, ++ 0xb1, 0xe1, 0x51, 0xfe, 0x71, 0x4e, 0xeb, 0x4f, 0xf9, 0xa8, 0xc9, 0x9f, ++ 0x1d, 0xe7, 0x0e, 0x83, 0x17, 0xad, 0x5c, 0xbf, 0x82, 0x89, 0x22, 0xe2, ++ 0x5c, 0x8a, 0xe3, 0x96, 0xf1, 0x71, 0xa1, 0xfd, 0x6c, 0x0f, 0xee, 0x8b, ++ 0x81, 0xf9, 0x37, 0x40, 0xff, 0x1f, 0x11, 0x32, 0x91, 0xeb, 0x1b, 0x7a, ++ 0x60, 0xdc, 0xdf, 0x58, 0xce, 0x3b, 0x0d, 0xfe, 0xcd, 0x31, 0x9d, 0xb4, ++ 0xdf, 0xee, 0x9c, 0xb9, 0x86, 0xfd, 0xe0, 0x73, 0xca, 0x47, 0x4d, 0x39, ++ 0x8f, 0xc5, 0x80, 0xbd, 0xd4, 0x96, 0x41, 0xf5, 0x00, 0xc8, 0xa9, 0x57, ++ 0x44, 0x94, 0x93, 0x4d, 0x76, 0x86, 0xc7, 0xa6, 0xb4, 0x6a, 0xa2, 0xb7, ++ 0x47, 0x4b, 0x1d, 0x3e, 0xf1, 0x63, 0x98, 0xe7, 0xdb, 0xb9, 0x64, 0x2a, ++ 0xc5, 0x5f, 0x91, 0xc3, 0x4d, 0x2e, 0xa1, 0xf0, 0x5d, 0xc7, 0xf7, 0x51, ++ 0xe4, 0xaa, 0xf6, 0x08, 0x49, 0xd8, 0xfe, 0x6c, 0x14, 0x9d, 0x67, 0x79, ++ 0xfc, 0x25, 0x08, 0x47, 0x39, 0xc7, 0x4d, 0x2a, 0x72, 0x01, 0x2e, 0x5e, ++ 0x52, 0x4d, 0xc7, 0xcb, 0x8a, 0x4f, 0x74, 0xd1, 0x7a, 0xa9, 0x9f, 0xf8, ++ 0xae, 0xca, 0x87, 0xfe, 0x54, 0xce, 0x0b, 0x6c, 0x3e, 0xa7, 0x5d, 0x3f, ++ 0x0f, 0x69, 0x81, 0x79, 0xe4, 0x5c, 0x46, 0x0f, 0xb2, 0xbf, 0x85, 0x00, ++ 0xfc, 0x76, 0x9f, 0x3c, 0x3f, 0x1c, 0x63, 0x72, 0x4c, 0x06, 0xf9, 0xad, ++ 0xf1, 0x25, 0xb5, 0xeb, 0x56, 0x00, 0x1d, 0x94, 0x29, 0x57, 0x97, 0xc5, ++ 0xd3, 0xf9, 0x17, 0x6d, 0xcf, 0xca, 0x13, 0xe9, 0xfc, 0x15, 0x8e, 0x76, ++ 0x79, 0x4e, 0x2e, 0xca, 0x6d, 0x0f, 0xd0, 0xc7, 0xce, 0x64, 0x75, 0x65, ++ 0xfc, 0xff, 0xa0, 0x3d, 0x37, 0x8d, 0x78, 0xcd, 0x80, 0xf7, 0x51, 0x99, ++ 0x4c, 0x0f, 0x4c, 0xa8, 0x15, 0xbc, 0x9b, 0x29, 0x7c, 0x9a, 0x42, 0xec, ++ 0x84, 0x9f, 0xc6, 0x33, 0x3e, 0x2c, 0x0c, 0xca, 0xbb, 0x9f, 0xe1, 0xbe, ++ 0x0b, 0x35, 0x3b, 0x41, 0xfd, 0x39, 0xd4, 0xcf, 0x63, 0x07, 0x3f, 0x0a, ++ 0xf0, 0x38, 0x8f, 0x1d, 0xbc, 0x05, 0x9e, 0x87, 0xb1, 0x83, 0xb7, 0x42, ++ 0x3b, 0x85, 0xd7, 0xe3, 0xf1, 0xcc, 0x0e, 0x7e, 0x02, 0xd6, 0xa1, 0x76, ++ 0xf0, 0xb6, 0xef, 0x03, 0xb7, 0x09, 0x0a, 0x93, 0xa3, 0xd4, 0x0e, 0xdd, ++ 0x01, 0xf3, 0xc6, 0x83, 0x71, 0x03, 0xf6, 0xd1, 0x1f, 0x98, 0x3d, 0x1a, ++ 0xba, 0xff, 0xdb, 0xf8, 0xf9, 0xd7, 0xd0, 0xb3, 0x76, 0x00, 0x5d, 0x4a, ++ 0x5e, 0x89, 0xd1, 0x39, 0xe3, 0xd3, 0xe1, 0x9c, 0x4f, 0xc7, 0x9e, 0xa4, ++ 0xfc, 0x92, 0xdb, 0x93, 0xfe, 0xdb, 0x28, 0xfd, 0x7b, 0x28, 0xfd, 0x9d, ++ 0xa5, 0x76, 0x93, 0x98, 0x15, 0x99, 0x9e, 0x7c, 0x17, 0xc9, 0x97, 0xc5, ++ 0x0f, 0x32, 0xbe, 0x6f, 0x70, 0xec, 0x43, 0xbe, 0x7b, 0x91, 0xf3, 0x45, ++ 0x1b, 0x5f, 0xbf, 0x2d, 0x47, 0xac, 0x04, 0x7c, 0xbe, 0x4a, 0x44, 0x45, ++ 0x14, 0x7a, 0xce, 0xd7, 0x94, 0xe1, 0x76, 0x80, 0x5c, 0x0f, 0xe5, 0x3f, ++ 0xf5, 0x5b, 0x23, 0x3d, 0x97, 0x3a, 0xbc, 0x1b, 0xf2, 0x80, 0x6f, 0x0e, ++ 0xcd, 0x75, 0xc1, 0xb6, 0x42, 0xf9, 0x51, 0xa6, 0x65, 0xf5, 0xc0, 0xe0, ++ 0xbe, 0x8f, 0x03, 0x1f, 0x0e, 0xd5, 0xc9, 0x27, 0x22, 0x48, 0xc8, 0x8f, ++ 0x17, 0xe0, 0x43, 0x98, 0xc7, 0x3d, 0x10, 0xec, 0x8c, 0x78, 0x49, 0xcd, ++ 0x05, 0x3e, 0x62, 0xeb, 0x7a, 0x0e, 0x89, 0xa8, 0x27, 0x22, 0xf1, 0x11, ++ 0xa5, 0x9b, 0x53, 0x80, 0xbf, 0x6e, 0xb8, 0x00, 0xb0, 0x75, 0xfb, 0xa7, ++ 0x74, 0xf3, 0x39, 0x3c, 0xa7, 0x7c, 0x76, 0xfa, 0xfb, 0xd0, 0xcb, 0x1a, ++ 0x4e, 0x1f, 0xd4, 0x0f, 0xf9, 0x1a, 0xe6, 0xeb, 0x1f, 0xcf, 0xe8, 0x67, ++ 0x76, 0x04, 0xff, 0xe2, 0x1f, 0xf1, 0xdd, 0x7e, 0xc0, 0x3f, 0xa0, 0x3f, ++ 0x99, 0xc1, 0xf4, 0x50, 0x66, 0xbc, 0x93, 0x8d, 0x23, 0x49, 0x32, 0xe8, ++ 0x17, 0x55, 0xcc, 0xc8, 0x04, 0xf9, 0x42, 0xe7, 0x35, 0x25, 0xd0, 0xf6, ++ 0xb7, 0xb8, 0x7f, 0x14, 0x69, 0xde, 0xa8, 0x84, 0x6e, 0xfe, 0x8b, 0x4a, ++ 0x80, 0xf3, 0xdc, 0xc2, 0xe6, 0x3d, 0x04, 0x46, 0xf6, 0xd0, 0x9e, 0xf3, ++ 0x8e, 0x4a, 0xa0, 0xf6, 0x47, 0x98, 0x79, 0xd2, 0xb8, 0x1c, 0xbf, 0x2e, ++ 0x82, 0xbf, 0x90, 0xc5, 0xfd, 0x12, 0x92, 0xdb, 0x6d, 0x9f, 0xa4, 0xc0, ++ 0x7a, 0x59, 0x9c, 0x6f, 0x76, 0x27, 0xab, 0x8e, 0x04, 0x1d, 0xdf, 0x14, ++ 0x71, 0xbb, 0xe5, 0x65, 0xc1, 0xa8, 0x97, 0x73, 0xba, 0xfd, 0x7d, 0xc6, ++ 0x3f, 0x49, 0x09, 0xac, 0x3f, 0x99, 0xd7, 0x3d, 0x6f, 0x56, 0x82, 0x0e, ++ 0x9e, 0x9a, 0x1d, 0x30, 0x9b, 0xcb, 0x07, 0x6d, 0x9e, 0xfe, 0x9c, 0xff, ++ 0x9c, 0x09, 0x0a, 0x1b, 0x5f, 0xc3, 0xc6, 0xc7, 0x43, 0x9d, 0x8e, 0xab, ++ 0xe0, 0xfe, 0x13, 0x85, 0x4b, 0x2e, 0xcc, 0x47, 0xac, 0xec, 0xf9, 0x85, ++ 0xfc, 0xa2, 0x7b, 0x14, 0x19, 0xc7, 0xcf, 0xe5, 0xfb, 0x12, 0xe2, 0x15, ++ 0x4d, 0xbf, 0x21, 0x5c, 0x47, 0x47, 0xf2, 0xbb, 0x82, 0x72, 0x70, 0x38, ++ 0xe2, 0xc1, 0xc5, 0xfa, 0x5f, 0xaa, 0x10, 0x0d, 0xef, 0x23, 0x71, 0x1f, ++ 0x95, 0x6c, 0x1f, 0x85, 0x0a, 0xc3, 0x7b, 0x68, 0xfc, 0x20, 0x12, 0x7e, ++ 0x34, 0xf8, 0x27, 0x6b, 0xe7, 0xcd, 0x61, 0xf3, 0x13, 0x4f, 0x37, 0xdc, ++ 0x46, 0xeb, 0xe9, 0x25, 0x12, 0xdc, 0xde, 0x8a, 0x63, 0xf6, 0xc5, 0x28, ++ 0x0e, 0x27, 0xd2, 0xc8, 0xe7, 0x09, 0x91, 0x07, 0x77, 0x4b, 0x1d, 0x56, ++ 0x25, 0xcc, 0x39, 0xaf, 0x8d, 0x77, 0x1a, 0xf8, 0xd9, 0xee, 0x32, 0xca, ++ 0x87, 0x48, 0xf1, 0x94, 0xbc, 0x20, 0x7c, 0x66, 0x22, 0x1c, 0xf2, 0xd9, ++ 0xbe, 0x23, 0xc5, 0x57, 0x0a, 0xf8, 0x79, 0x47, 0x70, 0xfb, 0x96, 0x8e, ++ 0x9b, 0x8f, 0x70, 0xb5, 0xb1, 0xfd, 0xde, 0xa3, 0x74, 0xb7, 0xd7, 0xe0, ++ 0x7c, 0xe9, 0x6c, 0xbe, 0xfa, 0x20, 0xbc, 0x17, 0x63, 0xbb, 0x83, 0xf5, ++ 0x8f, 0xe4, 0xf7, 0xd7, 0xf3, 0x7d, 0x55, 0x27, 0x74, 0x8f, 0x5b, 0x86, ++ 0xeb, 0x24, 0xb1, 0x71, 0xa1, 0xf1, 0x04, 0xad, 0x5c, 0xc2, 0xf7, 0xb7, ++ 0x30, 0x38, 0xee, 0x56, 0x5c, 0xaf, 0x1f, 0x1b, 0x97, 0x1c, 0xdc, 0xc7, ++ 0x1d, 0xd8, 0x3e, 0x9a, 0xb5, 0x7f, 0xdf, 0xf8, 0x5b, 0x32, 0xdf, 0xef, ++ 0x4f, 0x82, 0xeb, 0xae, 0xc1, 0xfd, 0xaa, 0xec, 0xfc, 0x81, 0xb8, 0x6e, ++ 0xb8, 0xac, 0xc7, 0xf6, 0x22, 0xb6, 0x6e, 0x24, 0xf9, 0x11, 0x88, 0x63, ++ 0xe7, 0x68, 0xe2, 0x70, 0xbe, 0x12, 0xfc, 0x62, 0x3a, 0x47, 0x7c, 0x80, ++ 0xe4, 0x48, 0x49, 0xe0, 0x35, 0x45, 0xbb, 0x46, 0xd1, 0x2e, 0xa9, 0x01, ++ 0xd5, 0x07, 0xfa, 0xa3, 0xe4, 0x4b, 0xd9, 0x09, 0x72, 0xba, 0x5c, 0xb4, ++ 0x79, 0x04, 0x2a, 0x8f, 0x25, 0xa7, 0x15, 0xfd, 0xe4, 0x28, 0x89, 0xa8, ++ 0xe0, 0xd7, 0xb6, 0x7f, 0xf5, 0x63, 0x47, 0x67, 0x2e, 0xd6, 0x7d, 0xa0, ++ 0xd7, 0x57, 0x47, 0x15, 0x5b, 0xc1, 0xef, 0x5c, 0x93, 0x25, 0xb9, 0x40, ++ 0x1f, 0x16, 0xdf, 0x27, 0x31, 0xff, 0xfa, 0x94, 0x09, 0xe5, 0x7d, 0x85, ++ 0xb8, 0x04, 0xe7, 0xd9, 0xa7, 0x68, 0x76, 0xee, 0x8d, 0x06, 0x3f, 0xda, ++ 0xa9, 0x38, 0x2b, 0xa3, 0x60, 0x1f, 0x56, 0x91, 0x38, 0x99, 0xff, 0x5f, ++ 0x39, 0x9e, 0x3e, 0xbf, 0x8a, 0xcb, 0xeb, 0x7d, 0xd6, 0x44, 0x13, 0xcc, ++ 0x37, 0x22, 0x83, 0xc5, 0x0b, 0xae, 0x72, 0x56, 0xa3, 0xbf, 0x4e, 0xbe, ++ 0x65, 0x7e, 0xb4, 0x4a, 0xff, 0x63, 0xf2, 0x5b, 0x45, 0xbd, 0x2c, 0xf3, ++ 0x71, 0x52, 0x7a, 0x3d, 0x11, 0xb0, 0x34, 0xfa, 0xdb, 0x32, 0xd9, 0x70, ++ 0x46, 0x1c, 0x84, 0x7a, 0x01, 0xed, 0xa8, 0x11, 0x7e, 0xa3, 0xff, 0x2d, ++ 0x3b, 0x2b, 0x4e, 0xc0, 0xfc, 0x32, 0xd1, 0x8d, 0xa3, 0xeb, 0x3e, 0x9f, ++ 0x60, 0x4f, 0x42, 0x7b, 0xaa, 0x1f, 0xe9, 0x7f, 0x8e, 0xf2, 0x8f, 0x25, ++ 0x47, 0x20, 0x16, 0xea, 0x5f, 0x94, 0x4b, 0xee, 0x3d, 0x80, 0x87, 0x31, ++ 0xce, 0x6a, 0xa5, 0x84, 0x9e, 0xc7, 0x92, 0xee, 0xb6, 0x82, 0x1c, 0xee, ++ 0x67, 0xf6, 0xf5, 0x86, 0x78, 0x42, 0x63, 0xba, 0xec, 0xf2, 0x00, 0x1b, ++ 0x3e, 0x50, 0x66, 0xcd, 0x02, 0x7f, 0xab, 0x99, 0xfa, 0xe7, 0x08, 0x07, ++ 0x35, 0xe1, 0xea, 0x81, 0x41, 0x3c, 0x59, 0x8a, 0x54, 0x02, 0x74, 0x48, ++ 0x71, 0x82, 0xfc, 0xd5, 0x5d, 0xda, 0x58, 0x99, 0x90, 0xc8, 0xf0, 0xf8, ++ 0x49, 0x82, 0x05, 0xcb, 0x12, 0x5e, 0xd7, 0x9e, 0x87, 0xe2, 0x7d, 0x48, ++ 0x62, 0x34, 0xe3, 0x7f, 0x62, 0xf5, 0x7c, 0x94, 0x03, 0x72, 0x42, 0x20, ++ 0x71, 0x94, 0x0e, 0x97, 0x92, 0xce, 0x4c, 0xa0, 0xc7, 0xe4, 0x34, 0x26, ++ 0x9f, 0x6a, 0x4d, 0x9d, 0x29, 0x50, 0xef, 0x22, 0xfe, 0x94, 0x24, 0x5a, ++ 0x36, 0x34, 0x4b, 0xa3, 0xc3, 0xf9, 0x3f, 0x1b, 0x79, 0xfc, 0x6c, 0xad, ++ 0x29, 0xbc, 0xbd, 0xf4, 0x4b, 0xf3, 0x98, 0x0f, 0x00, 0x0e, 0x12, 0xc4, ++ 0x0d, 0x2e, 0xc7, 0xb8, 0x80, 0xdb, 0xd2, 0x37, 0x18, 0x3f, 0xd0, 0xec, ++ 0x55, 0x2d, 0x8e, 0x10, 0xc9, 0x6e, 0xbd, 0x57, 0xac, 0xfa, 0x18, 0xe6, ++ 0x11, 0x14, 0xdf, 0x37, 0xd0, 0xbf, 0xa7, 0xfd, 0xeb, 0xc1, 0x7d, 0x48, ++ 0xe9, 0x4c, 0x4e, 0x6b, 0xa5, 0xb6, 0x8f, 0x99, 0x89, 0x8c, 0x7f, 0x1c, ++ 0x89, 0x56, 0x84, 0xcf, 0xde, 0x3b, 0x4a, 0xc9, 0x1c, 0x27, 0xe2, 0xe9, ++ 0x2c, 0xf0, 0x29, 0xc5, 0xd3, 0xa1, 0x2b, 0x00, 0x2a, 0x59, 0xf3, 0x14, ++ 0xc0, 0xd3, 0x2b, 0x59, 0x0f, 0xf5, 0x83, 0xb8, 0x94, 0x35, 0xeb, 0x81, ++ 0x24, 0xe0, 0xcf, 0xd1, 0x84, 0xd9, 0xa7, 0xe5, 0x74, 0x8c, 0x83, 0x96, ++ 0x0f, 0xd9, 0xdc, 0xdf, 0x24, 0xe8, 0xe4, 0xe1, 0x98, 0x7e, 0xb3, 0xd1, ++ 0x6e, 0x2a, 0xca, 0xac, 0x47, 0x7b, 0x6a, 0x75, 0x04, 0xbf, 0xf4, 0xc7, ++ 0x7c, 0x1f, 0x12, 0xa7, 0x93, 0x12, 0x9b, 0xdb, 0x94, 0x38, 0x14, 0xe2, ++ 0x5f, 0xcb, 0xac, 0x30, 0x5e, 0x52, 0xaa, 0xa2, 0xa1, 0xdc, 0x1b, 0x98, ++ 0x84, 0x25, 0xb5, 0x7b, 0xa5, 0x44, 0xda, 0x7f, 0x75, 0x3a, 0xab, 0x5f, ++ 0x08, 0x0f, 0xef, 0x72, 0xf9, 0x10, 0x69, 0xff, 0xa3, 0x40, 0x2f, 0x40, ++ 0xbc, 0x26, 0xbd, 0xfb, 0x1c, 0x09, 0x30, 0x3f, 0x7d, 0xee, 0x91, 0xf3, ++ 0x82, 0xe7, 0xd0, 0xed, 0x2f, 0x25, 0xdc, 0xfe, 0xcc, 0x89, 0x4c, 0x1f, ++ 0x69, 0xfb, 0x92, 0xfa, 0x71, 0xba, 0xcc, 0x31, 0xd2, 0xdd, 0x78, 0x4e, ++ 0x8f, 0x39, 0x89, 0x9a, 0xbf, 0x78, 0xd1, 0x74, 0x77, 0xe4, 0x62, 0xe8, ++ 0x2e, 0xf4, 0xbc, 0x63, 0xb2, 0x96, 0x8f, 0x1e, 0x40, 0x82, 0xfb, 0xd7, ++ 0xce, 0xab, 0x9d, 0x9f, 0x9e, 0xd7, 0x05, 0xe7, 0x2d, 0x97, 0xd8, 0xf9, ++ 0xb7, 0x2a, 0x6e, 0x15, 0xa6, 0xa0, 0x70, 0x1e, 0x0c, 0xed, 0x3d, 0xce, ++ 0x65, 0x0d, 0xaf, 0xf7, 0x33, 0x12, 0x4d, 0xdf, 0xf5, 0x3c, 0x0f, 0x25, ++ 0xf4, 0xbd, 0xf8, 0xf3, 0x7c, 0x87, 0x79, 0xa7, 0x26, 0x7e, 0x07, 0x38, ++ 0x1d, 0x18, 0xa9, 0x3a, 0x40, 0x9e, 0x34, 0x26, 0x53, 0xfa, 0xa4, 0x78, ++ 0x6a, 0x14, 0x58, 0xa9, 0xf5, 0x8f, 0xe6, 0x78, 0x6a, 0xe1, 0x74, 0xfa, ++ 0x5d, 0xe4, 0x44, 0xff, 0xef, 0x70, 0xbe, 0x62, 0x87, 0xf0, 0x12, 0xe8, ++ 0xc3, 0xab, 0xdc, 0xc7, 0x4a, 0x61, 0x99, 0xb2, 0xa2, 0xc1, 0xa0, 0x76, ++ 0x80, 0x1f, 0xe7, 0x01, 0xbd, 0x95, 0xe4, 0xde, 0x27, 0xcd, 0xa1, 0xf5, ++ 0xa6, 0x3b, 0xe6, 0xa2, 0xfc, 0x3c, 0x30, 0xb2, 0x1e, 0xf7, 0xbd, 0xda, ++ 0x6e, 0xdc, 0xaf, 0x56, 0x26, 0x70, 0x7c, 0x14, 0x65, 0xaa, 0xc8, 0x7f, ++ 0x8d, 0x9c, 0xff, 0xca, 0x09, 0xf3, 0x23, 0xb5, 0x7e, 0x6d, 0xfc, 0x5c, ++ 0xa1, 0xfc, 0x11, 0x3a, 0x5f, 0x28, 0x5f, 0x3f, 0x64, 0x53, 0x6f, 0x06, ++ 0xfa, 0x48, 0x48, 0x64, 0xfa, 0x32, 0xe8, 0xff, 0x75, 0x88, 0x7a, 0xff, ++ 0xaf, 0x84, 0xeb, 0xaf, 0x91, 0xd6, 0x9b, 0x0c, 0xf1, 0x8f, 0x91, 0xdc, ++ 0xff, 0x5b, 0xfd, 0x65, 0xb6, 0xcd, 0x43, 0x0f, 0x7a, 0x96, 0xea, 0xb5, ++ 0x7f, 0x89, 0xff, 0xf7, 0x0d, 0x7d, 0x02, 0x7e, 0x52, 0x7a, 0x89, 0x55, ++ 0xef, 0xff, 0x35, 0x5a, 0x4b, 0xb1, 0x7d, 0x75, 0x86, 0x3a, 0xfa, 0xf2, ++ 0x24, 0xd0, 0xc7, 0xa2, 0xeb, 0x2e, 0x82, 0xf0, 0x43, 0x7f, 0xd0, 0x23, ++ 0x88, 0xca, 0xd6, 0x30, 0xfe, 0xe0, 0xea, 0x0c, 0xd9, 0x77, 0x15, 0x7d, ++ 0x6e, 0x51, 0xc8, 0xe3, 0xb0, 0xbf, 0x52, 0xaa, 0x2f, 0x21, 0xfe, 0x62, ++ 0x51, 0x54, 0x72, 0xc9, 0xc0, 0x9e, 0x7e, 0xe1, 0x3e, 0x6b, 0x29, 0x81, ++ 0xb8, 0xc9, 0x59, 0x85, 0x3c, 0x0b, 0xfe, 0xd8, 0x85, 0xce, 0xf3, 0x78, ++ 0xa2, 0xd1, 0x2f, 0x94, 0xc0, 0x2f, 0xe4, 0xf3, 0xa3, 0x5f, 0xa8, 0xd4, ++ 0x93, 0x4e, 0x8c, 0xf7, 0x94, 0x12, 0xb0, 0x6b, 0xa0, 0xdd, 0x39, 0x10, ++ 0xe4, 0x8e, 0x4a, 0xdc, 0x76, 0xd0, 0x23, 0xd4, 0x2f, 0xd4, 0xc9, 0xa7, ++ 0xb3, 0xd6, 0x9b, 0x90, 0xdf, 0x43, 0xd7, 0xa3, 0x72, 0xeb, 0x69, 0xa0, ++ 0xa3, 0x46, 0x85, 0xf1, 0x71, 0xa8, 0x3f, 0x28, 0x72, 0x3e, 0xd7, 0xe4, ++ 0x6c, 0x28, 0x3d, 0x94, 0x3b, 0x18, 0xdd, 0x44, 0xd1, 0xad, 0x9b, 0x99, ++ 0xdc, 0x78, 0x2e, 0x31, 0xb9, 0x27, 0x5d, 0x7c, 0x77, 0xf9, 0x34, 0xaf, ++ 0x0c, 0x5c, 0x80, 0x6b, 0xc9, 0xca, 0x03, 0xe0, 0xaa, 0x4d, 0x09, 0xf8, ++ 0x25, 0x70, 0x79, 0x96, 0x27, 0x3a, 0xb1, 0x5f, 0x95, 0x6d, 0x47, 0x23, ++ 0x3c, 0xd7, 0xe6, 0x0f, 0xc5, 0x0f, 0x3d, 0xb9, 0x0a, 0xf1, 0x74, 0xb0, ++ 0x67, 0x58, 0xfc, 0x86, 0xda, 0x6b, 0xd4, 0x8e, 0x32, 0x53, 0x7b, 0x6d, ++ 0x9d, 0x10, 0x5c, 0x7f, 0x35, 0x87, 0x77, 0x24, 0x7c, 0xac, 0x06, 0x7d, ++ 0x1d, 0x86, 0x8f, 0xde, 0xee, 0x96, 0x6b, 0xa1, 0x71, 0xa2, 0x9b, 0x8c, ++ 0xf7, 0x2f, 0x8a, 0x87, 0x24, 0x15, 0xb0, 0xb8, 0x3e, 0x09, 0x03, 0x7f, ++ 0x91, 0xdb, 0x49, 0x6b, 0x28, 0xbf, 0xc0, 0xfd, 0xcd, 0x6a, 0xb3, 0xcb, ++ 0xa1, 0x00, 0x9d, 0x66, 0x14, 0xbd, 0xeb, 0x06, 0x7f, 0x3e, 0x43, 0xc6, ++ 0xfb, 0x08, 0x22, 0xd5, 0x3b, 0xae, 0xb6, 0xf7, 0x3c, 0xe7, 0x1a, 0x88, ++ 0x9f, 0x85, 0xd9, 0xdf, 0x17, 0x89, 0x09, 0x08, 0x57, 0x6b, 0xba, 0xc9, ++ 0x60, 0x9f, 0x11, 0x72, 0xa7, 0xc1, 0x7e, 0x8c, 0x74, 0x6e, 0xc2, 0xf7, ++ 0x65, 0xe6, 0xe7, 0x12, 0x00, 0x9e, 0x39, 0x7a, 0x78, 0x86, 0x9c, 0xbb, ++ 0x4c, 0xc1, 0x73, 0x83, 0x59, 0x0f, 0xf3, 0xc6, 0x9a, 0x5c, 0xc4, 0x47, ++ 0xf9, 0x22, 0x36, 0x93, 0xb8, 0x50, 0x60, 0xc5, 0x9a, 0x30, 0x0e, 0xab, ++ 0xf1, 0xb9, 0xc2, 0xf9, 0x5c, 0x93, 0x07, 0x36, 0x85, 0x8d, 0xab, 0x4c, ++ 0xea, 0xcb, 0xee, 0xf7, 0x44, 0x9b, 0x5f, 0xa4, 0xe7, 0x5f, 0x9f, 0x44, ++ 0xed, 0x69, 0x3a, 0x4f, 0x83, 0xba, 0x0f, 0xf5, 0xaa, 0x36, 0x3e, 0x8e, ++ 0x9f, 0xdf, 0x36, 0x92, 0xc5, 0x1b, 0x6d, 0x76, 0x9f, 0xa2, 0x84, 0x81, ++ 0xc3, 0xbd, 0x9c, 0xcf, 0x23, 0x9d, 0xb3, 0x59, 0x95, 0xe2, 0xcb, 0xe8, ++ 0xfe, 0xee, 0x55, 0x98, 0xfd, 0x2d, 0x8d, 0x34, 0x55, 0x79, 0x31, 0x1e, ++ 0xc5, 0xe2, 0xb5, 0x0a, 0x87, 0x9d, 0x58, 0x9c, 0x6f, 0x05, 0xbb, 0x7d, ++ 0x54, 0x52, 0x3c, 0x8b, 0x7b, 0xa9, 0x3b, 0x15, 0x7d, 0xdc, 0x4a, 0xe4, ++ 0xfb, 0x89, 0xb1, 0xd3, 0xfd, 0x9c, 0x47, 0x4e, 0xae, 0x0d, 0xd9, 0x4f, ++ 0x54, 0x4e, 0x67, 0x19, 0xec, 0x5f, 0xca, 0x52, 0x95, 0x78, 0xdd, 0xfe, ++ 0x4b, 0x92, 0x34, 0xbd, 0xd2, 0x81, 0xfc, 0x1d, 0x69, 0xbe, 0xbb, 0xb9, ++ 0x9c, 0x8f, 0xea, 0xe7, 0xc2, 0xf8, 0xad, 0xd5, 0xe6, 0xf2, 0xc1, 0xbd, ++ 0x56, 0x94, 0x5a, 0x5d, 0x00, 0x62, 0x31, 0x3a, 0xc7, 0x45, 0xe6, 0xea, ++ 0xda, 0xa3, 0xd5, 0x82, 0x21, 0x16, 0x1d, 0x1d, 0x36, 0x67, 0xc8, 0x61, ++ 0xef, 0x23, 0x6e, 0xe7, 0xeb, 0xdb, 0x25, 0xb5, 0x0a, 0xc6, 0xd9, 0x15, ++ 0x89, 0xc0, 0x3d, 0x99, 0x9d, 0xdb, 0xcb, 0x91, 0xe6, 0x8d, 0xb4, 0x8f, ++ 0x0b, 0xad, 0x37, 0x2d, 0x89, 0xe9, 0xd3, 0x1e, 0xeb, 0x39, 0xc3, 0xdb, ++ 0x15, 0x7d, 0x92, 0x18, 0xff, 0x49, 0x23, 0x77, 0x56, 0x81, 0x9c, 0x26, ++ 0x03, 0x25, 0xd2, 0x3f, 0x8c, 0x9e, 0x48, 0x48, 0x62, 0xf2, 0x25, 0x56, ++ 0xee, 0x74, 0x82, 0xbf, 0x4e, 0xe9, 0xd1, 0x1d, 0x6e, 0x3e, 0x92, 0x24, ++ 0x73, 0x7e, 0xfe, 0x37, 0xf1, 0x87, 0x66, 0x77, 0x17, 0xb7, 0x1e, 0xca, ++ 0xa6, 0xfb, 0x6d, 0xb0, 0x49, 0x2e, 0x01, 0xe4, 0x57, 0xe1, 0xc9, 0x0e, ++ 0xa7, 0x0e, 0x3e, 0x54, 0xaf, 0xcf, 0x4a, 0xd2, 0xc9, 0x7d, 0xd1, 0xe6, ++ 0x46, 0xf9, 0x26, 0x3a, 0xd9, 0xbd, 0xfb, 0x68, 0x0b, 0xf3, 0xb7, 0x0f, ++ 0x8c, 0x34, 0xde, 0x93, 0xcd, 0xe7, 0xf8, 0xfa, 0x80, 0xc3, 0x31, 0x92, ++ 0x5c, 0x28, 0xe2, 0xf0, 0xf8, 0x77, 0x9d, 0xf3, 0xbb, 0xe2, 0xaf, 0x24, ++ 0x89, 0xc9, 0x7d, 0x0d, 0x2e, 0xcd, 0x00, 0x17, 0x02, 0xfc, 0x75, 0x7f, ++ 0x63, 0x43, 0x18, 0x79, 0x49, 0xe1, 0xd3, 0x90, 0x94, 0xfc, 0xdd, 0xe1, ++ 0xb3, 0x96, 0xc3, 0xe5, 0xe9, 0x0b, 0xc0, 0x67, 0xd0, 0x7f, 0x18, 0x3e, ++ 0x17, 0xe2, 0xeb, 0x20, 0x9f, 0x79, 0xc9, 0xf1, 0x30, 0x70, 0x6c, 0xb0, ++ 0xcb, 0x69, 0x73, 0x0d, 0xfc, 0xdf, 0x8c, 0x76, 0x48, 0xb8, 0x7e, 0xd5, ++ 0xba, 0xf3, 0x46, 0xe2, 0x43, 0x8d, 0x3e, 0x20, 0x77, 0x03, 0xe1, 0xd0, ++ 0xac, 0x1a, 0xe2, 0x02, 0x72, 0x92, 0xa7, 0x83, 0xf9, 0x95, 0x37, 0x1b, ++ 0xf5, 0x9c, 0xb8, 0xc4, 0xc5, 0xe5, 0x33, 0xf9, 0x96, 0xc2, 0x2d, 0x9e, ++ 0xf7, 0x8f, 0xb7, 0x11, 0x5f, 0x4c, 0x6c, 0x70, 0x7e, 0xb9, 0xcc, 0x18, ++ 0x4f, 0x68, 0x4b, 0xe2, 0x71, 0x81, 0x28, 0x12, 0x05, 0xf0, 0x39, 0xeb, ++ 0x9a, 0x24, 0x40, 0x9e, 0x82, 0xc5, 0x34, 0x63, 0xb0, 0x92, 0x0d, 0x4b, ++ 0x34, 0x0b, 0xa0, 0x27, 0x52, 0x60, 0x9e, 0x41, 0x84, 0xdc, 0xc7, 0xe5, ++ 0x67, 0xa8, 0x1e, 0x4c, 0x56, 0x99, 0x9f, 0xdc, 0x9b, 0xd4, 0x0b, 0x4c, ++ 0xaf, 0xa4, 0xe3, 0xfe, 0x92, 0xf8, 0x3e, 0x42, 0xf5, 0x60, 0x1a, 0xf5, ++ 0x6b, 0x20, 0x1e, 0x03, 0x47, 0x04, 0x7f, 0xba, 0x37, 0xad, 0x5b, 0xc1, ++ 0x06, 0x21, 0x2a, 0xde, 0x83, 0x0b, 0x1e, 0x13, 0xfa, 0xcb, 0x0e, 0xe2, ++ 0x15, 0x60, 0xfe, 0x74, 0xd2, 0x89, 0x65, 0x1f, 0x48, 0x45, 0xa0, 0xf3, ++ 0x67, 0x91, 0x0e, 0xa1, 0x1f, 0xc5, 0xdf, 0x7d, 0xe5, 0xd5, 0x83, 0x41, ++ 0x7e, 0xbf, 0x13, 0x72, 0x8e, 0x0b, 0xd9, 0xa3, 0x5a, 0xa9, 0xd9, 0x1f, ++ 0x6b, 0xff, 0x43, 0xf0, 0xfe, 0xf4, 0x7f, 0x2f, 0xbc, 0x57, 0x96, 0xea, ++ 0xe0, 0x2d, 0x26, 0x7f, 0x3f, 0x78, 0xcf, 0xe7, 0x72, 0x27, 0x34, 0x9e, ++ 0x57, 0x04, 0xf1, 0xbc, 0x2c, 0x88, 0xe7, 0xf9, 0xf6, 0x03, 0x9f, 0xca, ++ 0xdf, 0x32, 0xfb, 0xa3, 0xfd, 0xef, 0x32, 0xc6, 0xf7, 0x1a, 0xb3, 0x58, ++ 0x3c, 0xaf, 0x5c, 0xac, 0x7c, 0x18, 0xef, 0x41, 0x9d, 0x32, 0xba, 0x1f, ++ 0x52, 0x4e, 0xe7, 0x7a, 0xc8, 0x73, 0xd2, 0xec, 0x4e, 0xd4, 0x79, 0x7d, ++ 0x83, 0x71, 0x3f, 0xeb, 0x99, 0xfb, 0x25, 0x88, 0xa3, 0x10, 0xe9, 0x24, ++ 0xc2, 0x09, 0xef, 0x86, 0x9c, 0x28, 0xcf, 0x32, 0x93, 0x51, 0xde, 0x30, ++ 0x3b, 0xe2, 0x2a, 0xbe, 0x7f, 0x39, 0x6b, 0x9e, 0x15, 0xee, 0xbd, 0x83, ++ 0xfe, 0x93, 0x4f, 0x64, 0xf6, 0x06, 0xb3, 0x97, 0x64, 0x4e, 0x07, 0x45, ++ 0x8e, 0x12, 0xf4, 0x5f, 0x1a, 0xbf, 0x3d, 0xbf, 0xdd, 0x71, 0xb1, 0x7e, ++ 0xd2, 0x5e, 0xe9, 0x00, 0xde, 0x5f, 0x6b, 0xfe, 0x51, 0x83, 0x7f, 0x0e, ++ 0xfa, 0x4b, 0xa1, 0xe3, 0x7c, 0x92, 0xef, 0x7d, 0x38, 0xbf, 0xcf, 0x2f, ++ 0x3b, 0x21, 0xdf, 0xa4, 0x8d, 0xdf, 0x8b, 0xb5, 0x9d, 0x39, 0x68, 0x88, ++ 0xd3, 0x86, 0xfa, 0x41, 0x9a, 0x5d, 0x75, 0x15, 0xdf, 0x7f, 0xa9, 0xdf, ++ 0x7d, 0xe8, 0x72, 0xb8, 0xdf, 0x52, 0xe6, 0x10, 0x16, 0xdf, 0x64, 0x70, ++ 0x90, 0xf9, 0x3a, 0x8d, 0x8e, 0xb3, 0x78, 0x0f, 0xfe, 0xe2, 0xb7, 0x26, ++ 0xf4, 0xb7, 0xce, 0x72, 0x7f, 0xab, 0x08, 0xfc, 0x2c, 0x3b, 0xf3, 0x77, ++ 0xaa, 0xed, 0x3d, 0xcf, 0x39, 0x21, 0x39, 0xbc, 0xff, 0x04, 0xe3, 0x20, ++ 0xaf, 0xae, 0x54, 0xf1, 0x89, 0x60, 0xcf, 0x69, 0xfe, 0x13, 0xb4, 0x3b, ++ 0xed, 0x3d, 0xfd, 0xa7, 0xd1, 0x16, 0xff, 0x6b, 0xb0, 0xbf, 0x09, 0xaf, ++ 0x89, 0x98, 0x17, 0x12, 0x09, 0xbe, 0xa1, 0x7e, 0x53, 0xa8, 0xfe, 0x99, ++ 0x9e, 0xcc, 0xf4, 0xce, 0x4d, 0xc9, 0xdc, 0xae, 0x0b, 0x81, 0xa7, 0x16, ++ 0xef, 0x0b, 0xbd, 0x97, 0x6e, 0xd2, 0xf8, 0x4f, 0xf2, 0x08, 0x7a, 0xfe, ++ 0x0f, 0x5d, 0x5f, 0xde, 0x37, 0x06, 0xf7, 0x4f, 0x14, 0x5d, 0x3c, 0x36, ++ 0x3b, 0x18, 0x4f, 0x14, 0x54, 0x0f, 0xb9, 0x25, 0x2f, 0x18, 0x3f, 0x0c, ++ 0x13, 0x37, 0x5c, 0x0a, 0x74, 0xa8, 0xc5, 0x0d, 0x35, 0x3d, 0xa6, 0xd1, ++ 0xb1, 0x85, 0xf6, 0xb5, 0xe2, 0x3d, 0x73, 0xf8, 0x78, 0x62, 0x5b, 0xd6, ++ 0xc1, 0xbe, 0xcc, 0x2f, 0x7c, 0x29, 0x11, 0xf8, 0xb3, 0x5c, 0x61, 0x71, ++ 0x23, 0x6d, 0x7f, 0xd4, 0x2f, 0xbc, 0x2d, 0x59, 0x87, 0x8f, 0x22, 0x3f, ++ 0xd3, 0xdb, 0x96, 0xff, 0x53, 0xdf, 0xb9, 0x92, 0xc2, 0x97, 0x24, 0x10, ++ 0x17, 0xf3, 0x0f, 0xea, 0x9d, 0x56, 0x5a, 0xaf, 0x50, 0x48, 0xe2, 0x3a, ++ 0xe4, 0x33, 0x1b, 0xe6, 0x69, 0x15, 0x25, 0x09, 0xc8, 0x77, 0x92, 0x2f, ++ 0x0a, 0xeb, 0x15, 0xa7, 0x5c, 0xde, 0x28, 0x5a, 0xb7, 0xec, 0x7b, 0x45, ++ 0x14, 0x93, 0x60, 0xbd, 0x39, 0x24, 0x4a, 0x08, 0xd2, 0x8f, 0x96, 0xd7, ++ 0xd1, 0xe8, 0xff, 0x70, 0x3d, 0xe0, 0xef, 0xec, 0x29, 0xc9, 0x75, 0x3e, ++ 0xbf, 0xbb, 0x02, 0x82, 0x68, 0x06, 0x3f, 0x29, 0x3a, 0x88, 0x4f, 0x94, ++ 0x6f, 0x09, 0x86, 0xfa, 0x43, 0x92, 0xfb, 0xa1, 0x64, 0xb4, 0x17, 0x7b, ++ 0x05, 0xc7, 0x89, 0x90, 0x0f, 0x96, 0x6d, 0xc8, 0x3f, 0x7b, 0x46, 0x52, ++ 0x7f, 0x0a, 0x70, 0x9d, 0x6a, 0x55, 0x1f, 0xc6, 0xfe, 0x3f, 0x3c, 0xbc, ++ 0x6f, 0x4f, 0xc6, 0x78, 0xf1, 0xc1, 0x7f, 0x0a, 0xef, 0xc1, 0x75, 0x98, ++ 0x3e, 0x00, 0x9b, 0x8d, 0xa4, 0xe9, 0xd6, 0xb3, 0xd1, 0xc6, 0x61, 0xb0, ++ 0x8e, 0x93, 0xdd, 0x17, 0x6a, 0x71, 0xe9, 0xe5, 0x04, 0xef, 0x63, 0xb6, ++ 0x01, 0xce, 0x20, 0xce, 0xf2, 0x39, 0xf1, 0x42, 0x9c, 0xe5, 0x05, 0xf3, ++ 0xcb, 0x22, 0xe8, 0xa3, 0x26, 0x3e, 0xcf, 0x70, 0xd2, 0xec, 0x94, 0xfb, ++ 0xb2, 0xfd, 0x42, 0xbf, 0x27, 0xb7, 0x3a, 0x36, 0x01, 0x5d, 0xfc, 0x2e, ++ 0x39, 0x0b, 0xd7, 0x7f, 0xc1, 0xe6, 0xde, 0x30, 0x98, 0xb6, 0x1f, 0xda, ++ 0x22, 0x0d, 0x86, 0xb8, 0x4d, 0x83, 0xf3, 0x19, 0x2b, 0xe4, 0xcf, 0xee, ++ 0xdb, 0xda, 0x94, 0xde, 0xa9, 0xe3, 0xbf, 0x43, 0x4f, 0xba, 0xfb, 0x84, ++ 0xf3, 0x0f, 0xb5, 0x92, 0xfe, 0xc5, 0x99, 0x0a, 0xf1, 0x5c, 0xb1, 0xac, ++ 0x54, 0x45, 0x93, 0x03, 0xdb, 0x45, 0xa8, 0xf7, 0xb0, 0xcf, 0xb6, 0xb4, ++ 0x2a, 0xb0, 0xce, 0x93, 0x5b, 0xad, 0xd3, 0xc2, 0xc5, 0x35, 0xc4, 0x14, ++ 0xc6, 0xef, 0xc3, 0xb7, 0x30, 0xbb, 0x76, 0x74, 0x8e, 0xc9, 0x05, 0xe2, ++ 0xad, 0x88, 0x78, 0xa4, 0x04, 0xb8, 0x8f, 0x71, 0x11, 0x97, 0x8f, 0x36, ++ 0xc4, 0x0c, 0xdc, 0xd9, 0x81, 0x36, 0x70, 0x96, 0x88, 0xf7, 0x1a, 0xb4, ++ 0xbe, 0x3f, 0x96, 0xd6, 0x63, 0x86, 0xaa, 0xe8, 0x1f, 0x0c, 0x18, 0xb8, ++ 0x13, 0xc7, 0x0f, 0xf8, 0xbc, 0xc4, 0xc5, 0xf2, 0x28, 0x3d, 0xb6, 0x3c, ++ 0x5a, 0x5f, 0x9f, 0x53, 0x32, 0x74, 0x1d, 0xad, 0xa7, 0x47, 0xbb, 0x3f, ++ 0x06, 0xfa, 0xa2, 0x7a, 0xa6, 0x59, 0x42, 0x7d, 0xda, 0x12, 0x03, 0x79, ++ 0x00, 0x31, 0x03, 0x27, 0x25, 0xaf, 0xa3, 0xb5, 0x18, 0x81, 0x54, 0x85, ++ 0xb3, 0x73, 0xff, 0x9a, 0xcc, 0xec, 0xef, 0x27, 0xcd, 0x1a, 0x5c, 0x25, ++ 0xcc, 0x83, 0xdc, 0xb7, 0x55, 0x46, 0xfe, 0x3a, 0x94, 0x26, 0xe2, 0xfd, ++ 0x13, 0x85, 0xdb, 0x12, 0xa8, 0xff, 0x25, 0x2d, 0x86, 0x50, 0x4a, 0x24, ++ 0x65, 0xaa, 0xa7, 0x0c, 0xe0, 0x58, 0x4e, 0x5a, 0x1a, 0xc0, 0x9f, 0x2a, ++ 0x73, 0x5e, 0xfd, 0x52, 0x2c, 0xf9, 0x27, 0xe0, 0x97, 0xbf, 0x53, 0x01, ++ 0xfe, 0x5f, 0x1f, 0xc1, 0x0e, 0xff, 0x1d, 0xdf, 0x1f, 0x0a, 0x11, 0x4a, ++ 0x3f, 0x07, 0xb7, 0x34, 0x5e, 0x47, 0xc2, 0xe4, 0x51, 0x6b, 0x74, 0xf8, ++ 0x5c, 0x8c, 0x2a, 0xa5, 0xd0, 0xfe, 0x6b, 0xf9, 0xbd, 0x2e, 0x71, 0x4c, ++ 0x42, 0xfa, 0x89, 0x8c, 0xef, 0xbb, 0x98, 0xbf, 0xd9, 0xe2, 0x6b, 0x88, ++ 0xa6, 0x70, 0x1c, 0xbe, 0xbd, 0xb9, 0x97, 0x7e, 0xfe, 0x23, 0x10, 0x74, ++ 0x4d, 0xee, 0x89, 0x6f, 0xc8, 0x7f, 0x26, 0x97, 0x43, 0xfe, 0xad, 0x1b, ++ 0xf3, 0x69, 0x1b, 0x4e, 0x9a, 0x10, 0x7e, 0xaf, 0xe6, 0x0a, 0x5e, 0x81, ++ 0xc2, 0xe7, 0x60, 0x8e, 0x48, 0x6d, 0x36, 0xba, 0xab, 0x7e, 0x56, 0x6f, ++ 0x7f, 0x5a, 0xdf, 0xc0, 0xe9, 0xb8, 0x72, 0xfb, 0xe1, 0xc6, 0x5e, 0xc0, ++ 0xc2, 0x29, 0x49, 0xb8, 0xee, 0xab, 0x39, 0x8f, 0x59, 0x59, 0x7e, 0xeb, ++ 0xc5, 0xc7, 0xaf, 0x87, 0x50, 0x3e, 0x58, 0x04, 0xf9, 0x53, 0x14, 0x1f, ++ 0xa3, 0x94, 0x68, 0xaf, 0x93, 0xe2, 0x6b, 0x31, 0x4c, 0x41, 0xeb, 0x23, ++ 0x15, 0xab, 0xd7, 0x47, 0xd7, 0x6b, 0xb7, 0x77, 0x94, 0xc6, 0xd1, 0x25, ++ 0x5e, 0x48, 0x16, 0x5c, 0x9b, 0x81, 0x5e, 0x72, 0x88, 0x02, 0xf2, 0x03, ++ 0x5d, 0x10, 0x13, 0x43, 0x94, 0x42, 0xeb, 0x20, 0x32, 0x90, 0x9e, 0x92, ++ 0x08, 0xe6, 0x73, 0xad, 0x2f, 0xc8, 0xdd, 0x0c, 0x71, 0xb1, 0x75, 0xe9, ++ 0xce, 0x16, 0xc8, 0x37, 0xdc, 0x33, 0xd0, 0x8a, 0xf9, 0x66, 0xa1, 0xf9, ++ 0xc4, 0x7b, 0x84, 0xfa, 0x97, 0xe2, 0x21, 0x2e, 0x15, 0x2f, 0xa0, 0xbc, ++ 0x3e, 0x98, 0xf3, 0x3b, 0xbc, 0xa7, 0x3b, 0x98, 0x6e, 0x21, 0x40, 0xaf, ++ 0x98, 0xf0, 0x4b, 0x9f, 0x37, 0x26, 0x30, 0x3e, 0x8d, 0xc9, 0x37, 0xda, ++ 0x9f, 0xe5, 0x29, 0x59, 0xdc, 0xcf, 0x26, 0x1e, 0x4b, 0x41, 0x70, 0x5f, ++ 0x31, 0xfd, 0xac, 0x6a, 0x14, 0x25, 0xa4, 0x97, 0xe3, 0xd9, 0xf8, 0x43, ++ 0xfd, 0x04, 0x2f, 0xd0, 0xdb, 0x21, 0x27, 0x97, 0x0f, 0xf4, 0xbc, 0x5b, ++ 0xc1, 0x20, 0x92, 0x9a, 0xa5, 0xa9, 0x03, 0x23, 0xe3, 0xf5, 0x95, 0xfe, ++ 0xa3, 0x9c, 0x9a, 0x5d, 0x2c, 0x68, 0xe7, 0x34, 0xf5, 0x3c, 0xc7, 0x0b, ++ 0x82, 0x77, 0x4d, 0x36, 0x9c, 0x63, 0x00, 0x3d, 0x07, 0xad, 0xdb, 0x73, ++ 0x04, 0x5c, 0xdf, 0xae, 0xac, 0xbb, 0x91, 0x60, 0x59, 0xb8, 0x00, 0xee, ++ 0x31, 0x43, 0xf7, 0xbf, 0x22, 0x85, 0xf9, 0x47, 0x32, 0x25, 0xbb, 0x1c, ++ 0x90, 0x6f, 0x2d, 0x6b, 0xc6, 0xe8, 0xf3, 0x63, 0xe4, 0xc2, 0x1b, 0x27, ++ 0xd8, 0x62, 0x31, 0x8f, 0x09, 0xed, 0xca, 0xd4, 0x1c, 0x01, 0xcf, 0x33, ++ 0xe6, 0x24, 0xbb, 0xcf, 0xed, 0x91, 0x9f, 0xad, 0x10, 0xb7, 0x6c, 0xc0, ++ 0x0f, 0xb5, 0x3a, 0x52, 0x82, 0xf3, 0xc5, 0x7c, 0xf9, 0xec, 0x4f, 0x20, ++ 0xff, 0x77, 0x5c, 0xa1, 0xe0, 0x8b, 0x82, 0xfd, 0xf0, 0xfc, 0x66, 0xfa, ++ 0x7f, 0xed, 0xa0, 0x5f, 0xe4, 0x7e, 0xb3, 0x59, 0xfe, 0x75, 0xce, 0x26, ++ 0x3c, 0xcf, 0xd8, 0x42, 0xb3, 0x0b, 0xee, 0x72, 0xc6, 0xda, 0xbc, 0xcd, ++ 0x25, 0xb4, 0xfe, 0xca, 0x27, 0x12, 0xc6, 0xb3, 0xc7, 0xf5, 0x1b, 0x85, ++ 0xf9, 0xd5, 0xa1, 0xeb, 0xaf, 0x53, 0x88, 0x6f, 0x34, 0x85, 0xef, 0x2b, ++ 0xb9, 0x12, 0xc2, 0x3b, 0xea, 0x92, 0xc7, 0x70, 0x9e, 0x37, 0x73, 0x4d, ++ 0x28, 0x6f, 0xc6, 0x41, 0x3e, 0x36, 0xe4, 0x2f, 0xeb, 0xf3, 0xaa, 0x51, ++ 0x1f, 0x1a, 0xf3, 0xb9, 0xc7, 0x89, 0x1f, 0xa8, 0xc5, 0xd0, 0xec, 0x62, ++ 0xfc, 0x4a, 0x24, 0x4f, 0x2f, 0x90, 0xef, 0x13, 0x1c, 0x46, 0xf8, 0xd9, ++ 0x4f, 0x1a, 0xef, 0x8b, 0x2b, 0xf3, 0x2d, 0x86, 0xfa, 0xb8, 0x5c, 0x39, ++ 0x44, 0x0f, 0x7b, 0x10, 0xde, 0x2f, 0x67, 0x30, 0xba, 0x78, 0x79, 0x80, ++ 0xe0, 0xdd, 0x9c, 0x15, 0xa4, 0xb3, 0xb1, 0x27, 0x13, 0xbc, 0x40, 0x67, ++ 0xf0, 0x27, 0x16, 0x18, 0xe0, 0x68, 0x38, 0x67, 0x8c, 0x5f, 0x56, 0x01, ++ 0x7e, 0x87, 0x06, 0x3c, 0xf1, 0x5f, 0x70, 0x4f, 0x12, 0xe3, 0x5c, 0x7d, ++ 0x23, 0xde, 0x83, 0x73, 0xf8, 0x6b, 0x74, 0x12, 0xc3, 0xf1, 0x6e, 0x4f, ++ 0x7f, 0xee, 0x27, 0xa0, 0xa7, 0x34, 0xf8, 0x87, 0xd2, 0xc1, 0xc5, 0xe3, ++ 0xff, 0xea, 0xaa, 0x62, 0xc0, 0x7f, 0xbe, 0x76, 0x7f, 0x1f, 0x82, 0xff, ++ 0x10, 0x7c, 0x63, 0x0c, 0x52, 0x3b, 0x47, 0xdf, 0x9e, 0x78, 0xc7, 0xf5, ++ 0xb3, 0x7a, 0xe2, 0x5b, 0xa3, 0x83, 0x1e, 0xe7, 0xbe, 0xbb, 0x75, 0x4d, ++ 0x36, 0xc5, 0xeb, 0xab, 0x76, 0xfa, 0x00, 0xf0, 0xbc, 0x49, 0xf6, 0xde, ++ 0x25, 0x04, 0xf1, 0x74, 0x41, 0xbc, 0xf6, 0x2b, 0x46, 0xba, 0x59, 0xa7, ++ 0x34, 0xdb, 0x40, 0xee, 0x47, 0x5d, 0x72, 0xdc, 0x06, 0xfe, 0x81, 0x46, ++ 0x17, 0x44, 0x6c, 0xcb, 0xd7, 0xdb, 0xfb, 0xff, 0x2a, 0x7c, 0x97, 0x6c, ++ 0x10, 0x98, 0x33, 0xe9, 0x12, 0xbc, 0x10, 0xd7, 0x7b, 0x0b, 0x1e, 0x0d, ++ 0x0b, 0xae, 0xf3, 0x52, 0x4a, 0x77, 0xbe, 0xcc, 0x4b, 0x20, 0xf7, 0x49, ++ 0x15, 0xcb, 0xe3, 0x68, 0x50, 0xf3, 0xd8, 0x7b, 0x57, 0xf9, 0x4c, 0x9f, ++ 0x86, 0xca, 0x87, 0x3f, 0xa4, 0xb0, 0xf7, 0x3a, 0xda, 0xcd, 0x2f, 0xa7, ++ 0x9f, 0x2f, 0x4f, 0xb5, 0xd2, 0xe6, 0x26, 0x70, 0x3f, 0xd6, 0x00, 0xf9, ++ 0x76, 0xf4, 0x7c, 0xf2, 0x86, 0xd9, 0xf0, 0x46, 0x03, 0x91, 0x27, 0xcf, ++ 0x46, 0x79, 0x49, 0x36, 0x08, 0x2c, 0x0f, 0xa1, 0xe8, 0xf7, 0x28, 0xdf, ++ 0xe7, 0x39, 0xbc, 0xab, 0x84, 0x30, 0xeb, 0xa1, 0x25, 0x83, 0xfb, 0x74, ++ 0x32, 0xbb, 0xbf, 0x28, 0x11, 0xfb, 0x93, 0x69, 0x5a, 0x5e, 0x52, 0xd5, ++ 0x07, 0xb8, 0xff, 0xc9, 0xac, 0x7e, 0xb1, 0xfb, 0x7a, 0xe3, 0x5f, 0xb4, ++ 0xaf, 0xa3, 0x94, 0x56, 0x88, 0xce, 0xff, 0x9c, 0xc8, 0xe3, 0xf2, 0x9a, ++ 0xdd, 0x3d, 0xc1, 0xc6, 0xf2, 0x0e, 0x27, 0x14, 0x89, 0x88, 0x8f, 0x37, ++ 0xb7, 0x08, 0x5e, 0xcc, 0x8f, 0xa4, 0xfd, 0x3c, 0x94, 0x4e, 0x16, 0x71, ++ 0xb2, 0x9d, 0xc8, 0xed, 0xc0, 0xb3, 0x85, 0xcf, 0x34, 0x0d, 0x76, 0x82, ++ 0x3d, 0xa8, 0x1a, 0xec, 0x4e, 0xa1, 0xa8, 0x1d, 0xed, 0xbe, 0xb8, 0x42, ++ 0xa3, 0x3f, 0x18, 0xaf, 0x46, 0x1b, 0xf0, 0x9f, 0x38, 0x3a, 0xc1, 0x50, ++ 0x4f, 0xae, 0xea, 0x65, 0xe8, 0x9f, 0x3a, 0x2d, 0xdb, 0x18, 0x57, 0x70, ++ 0x5f, 0x6a, 0x78, 0xde, 0xbb, 0x26, 0xcf, 0x50, 0xcf, 0xa8, 0x1f, 0x6e, ++ 0xe8, 0xdf, 0xe7, 0x96, 0x12, 0x43, 0x3d, 0xcb, 0x33, 0xd6, 0xd0, 0xbf, ++ 0xef, 0x9a, 0x49, 0x86, 0x7a, 0xff, 0xe6, 0xeb, 0x0c, 0xfd, 0x7f, 0xf4, ++ 0xf0, 0x1c, 0xc3, 0xf3, 0x01, 0xde, 0x45, 0x86, 0xe7, 0x97, 0x6d, 0x5b, ++ 0x66, 0xa8, 0x0f, 0x6c, 0xb9, 0xcd, 0xd0, 0xff, 0xf2, 0x5d, 0x77, 0x19, ++ 0x9e, 0x0f, 0xf6, 0xad, 0x33, 0x3c, 0x1f, 0x72, 0xe8, 0x7e, 0x43, 0x7d, ++ 0x68, 0xc7, 0xcf, 0x0d, 0xfd, 0xaf, 0x78, 0x77, 0xb3, 0xe1, 0xf9, 0xb0, ++ 0xce, 0x5f, 0x19, 0x9e, 0x8f, 0x38, 0xb9, 0xd3, 0x50, 0x1f, 0xe9, 0xdf, ++ 0x6d, 0xe8, 0x7f, 0x55, 0x60, 0x9f, 0xa1, 0x5e, 0x4c, 0x5e, 0x33, 0xf4, ++ 0x2f, 0xb5, 0xfe, 0xde, 0x50, 0x2f, 0x57, 0xde, 0x37, 0xf4, 0x1f, 0xe5, ++ 0x38, 0x6e, 0x78, 0x3e, 0xc6, 0xf9, 0x99, 0xe1, 0xb9, 0x46, 0x07, 0xe3, ++ 0x72, 0xbe, 0x30, 0xb4, 0x8f, 0x77, 0xfd, 0x2d, 0xe4, 0x3d, 0x9d, 0x2a, ++ 0x16, 0xe7, 0x80, 0x78, 0x40, 0x5f, 0x78, 0xd4, 0x8c, 0x65, 0x34, 0x69, ++ 0x61, 0xf7, 0x3a, 0xa4, 0x03, 0xcb, 0x85, 0x05, 0xee, 0xe2, 0x54, 0xe0, ++ 0x8f, 0x47, 0x3d, 0x4d, 0x90, 0x90, 0xd4, 0xe0, 0xf1, 0xff, 0x11, 0xae, ++ 0xa6, 0xdf, 0x2c, 0xec, 0x1b, 0xc7, 0xec, 0x27, 0x95, 0xe8, 0xe5, 0xa7, ++ 0x96, 0x9f, 0x4a, 0xfd, 0x16, 0x4f, 0x14, 0x25, 0x85, 0xd8, 0x00, 0xa5, ++ 0xdb, 0x21, 0x94, 0xee, 0x02, 0x02, 0x96, 0x4a, 0x80, 0x4a, 0xd6, 0x44, ++ 0x88, 0xf7, 0x44, 0x61, 0x99, 0x10, 0x48, 0xc4, 0xf6, 0xc4, 0x40, 0x3c, ++ 0x96, 0x49, 0x81, 0xde, 0xd8, 0x9e, 0x1c, 0x48, 0xc3, 0x32, 0x25, 0xd0, ++ 0x17, 0xcb, 0xd4, 0x40, 0x16, 0x96, 0x8e, 0xc0, 0x65, 0x58, 0xa6, 0x05, ++ 0x06, 0x60, 0xd9, 0x2b, 0x30, 0x04, 0xc7, 0xf5, 0x0e, 0x0c, 0xc6, 0x32, ++ 0x3d, 0x30, 0x02, 0xdb, 0x33, 0x02, 0xc3, 0xb0, 0xcc, 0x0c, 0x94, 0x62, ++ 0x7b, 0x9f, 0x40, 0x31, 0x96, 0xce, 0xc0, 0x38, 0x2c, 0xb3, 0x02, 0x63, ++ 0xb0, 0xcc, 0x0e, 0x5c, 0x83, 0xfd, 0xfa, 0x06, 0xae, 0xc6, 0xb2, 0x5f, ++ 0xe0, 0x7a, 0x6c, 0xef, 0x1f, 0x98, 0x8e, 0xe5, 0x25, 0x81, 0xb9, 0x58, ++ 0xfe, 0x28, 0x30, 0x1b, 0xcb, 0x9c, 0xc0, 0x62, 0x2c, 0x07, 0x04, 0x16, ++ 0x62, 0x79, 0x69, 0xe0, 0x26, 0x1c, 0x77, 0x59, 0xe0, 0x46, 0x2c, 0x73, ++ 0x03, 0xb7, 0x63, 0xfb, 0xc0, 0xc0, 0xad, 0x58, 0x0e, 0x0a, 0x34, 0x60, ++ 0x79, 0x79, 0x60, 0x25, 0x96, 0xae, 0xc0, 0x7a, 0xec, 0x37, 0x38, 0xb0, ++ 0x16, 0xcb, 0xbc, 0xc0, 0x7f, 0x61, 0xfb, 0x90, 0xc0, 0x7d, 0x58, 0xe6, ++ 0x07, 0x7e, 0x81, 0xed, 0x43, 0x03, 0x3f, 0xc3, 0xb2, 0x20, 0xf0, 0x18, ++ 0x96, 0x57, 0x04, 0x36, 0x61, 0x59, 0x18, 0xf8, 0x35, 0x96, 0xc3, 0x02, ++ 0x4f, 0x62, 0x39, 0x3c, 0xf0, 0x0c, 0x8e, 0x1b, 0x11, 0xd8, 0x81, 0x65, ++ 0x51, 0xe0, 0x05, 0x6c, 0x1f, 0x19, 0x78, 0x1e, 0xcb, 0x2b, 0x03, 0xfb, ++ 0xb1, 0xfd, 0xaa, 0x40, 0x3b, 0x96, 0x6a, 0xe0, 0x35, 0x6c, 0x2f, 0x0e, ++ 0xbc, 0x82, 0x65, 0x49, 0xe0, 0xf7, 0xd8, 0x5e, 0x1a, 0x38, 0x8c, 0x65, ++ 0x59, 0xe0, 0x7d, 0x6c, 0x2f, 0x0f, 0xbc, 0x87, 0x65, 0x45, 0xe0, 0x38, ++ 0x96, 0xa3, 0x02, 0xc7, 0xb0, 0x1c, 0x1d, 0xf8, 0x0c, 0xcb, 0x31, 0x81, ++ 0x4f, 0xb0, 0x1c, 0x1b, 0xf8, 0x02, 0xc7, 0x8d, 0x0b, 0x9c, 0xc1, 0xb2, ++ 0x32, 0xf0, 0x37, 0x6c, 0x1f, 0x1f, 0xf8, 0x06, 0xcb, 0x6e, 0x79, 0x17, ++ 0x31, 0x5f, 0xd9, 0x6d, 0x42, 0x7f, 0x96, 0xfb, 0xa9, 0x91, 0xfd, 0x05, ++ 0x0f, 0xca, 0x49, 0x33, 0x7f, 0x2f, 0x0e, 0x72, 0xab, 0x31, 0xff, 0xbf, ++ 0x5e, 0xf0, 0x62, 0xbc, 0x30, 0xa9, 0xf3, 0x25, 0xa8, 0x9b, 0x0b, 0x2d, ++ 0x18, 0x2f, 0xbc, 0x81, 0xf8, 0xf1, 0x3d, 0x81, 0xff, 0x26, 0x9d, 0x76, ++ 0x90, 0xa7, 0xed, 0xc3, 0x4e, 0xa4, 0x43, 0xbc, 0xe9, 0xcd, 0x64, 0x5f, ++ 0x86, 0x3e, 0xdf, 0xc1, 0xcc, 0xe3, 0x00, 0xe5, 0xe2, 0x29, 0x09, 0xfc, ++ 0xd5, 0x09, 0x49, 0xfb, 0x92, 0x41, 0x9f, 0xde, 0x40, 0x9b, 0x21, 0xcf, ++ 0x88, 0xa8, 0xe7, 0x30, 0x0f, 0x72, 0x02, 0xcf, 0x83, 0xbc, 0x41, 0xa2, ++ 0x0e, 0x16, 0xdd, 0xea, 0x61, 0x98, 0x61, 0x18, 0xf6, 0xf3, 0x59, 0x68, ++ 0x7d, 0x46, 0x25, 0x51, 0xf3, 0x68, 0xff, 0xa6, 0x61, 0x16, 0x8c, 0xeb, ++ 0x37, 0xe5, 0x51, 0x3f, 0x88, 0x96, 0x77, 0x67, 0xb1, 0x7c, 0xd9, 0x1d, ++ 0xa9, 0x4c, 0x5f, 0xfe, 0x8a, 0x97, 0xbb, 0x52, 0x99, 0x1d, 0xeb, 0x29, ++ 0x60, 0xf7, 0xfb, 0x33, 0x6e, 0xec, 0xcf, 0xf8, 0xa9, 0x2c, 0xf1, 0x02, ++ 0x7e, 0x13, 0x83, 0xc3, 0xdf, 0x07, 0xf2, 0x3c, 0x5b, 0x9b, 0x3f, 0x13, ++ 0xf3, 0x63, 0x2f, 0x72, 0xdc, 0x67, 0x29, 0x7c, 0x1c, 0xef, 0xdf, 0x9c, ++ 0x5a, 0xd5, 0x96, 0x0a, 0xfb, 0x28, 0x21, 0x39, 0xf5, 0xb6, 0x60, 0x3f, ++ 0xda, 0xfe, 0x62, 0x84, 0xf6, 0x7d, 0xe1, 0xda, 0xf7, 0x99, 0x18, 0x3e, ++ 0x3c, 0x47, 0x44, 0xee, 0x27, 0x54, 0xc5, 0x4d, 0x3a, 0x8f, 0x9f, 0xf0, ++ 0xe6, 0x8a, 0x8e, 0x4b, 0x5f, 0xea, 0x1f, 0xac, 0xbf, 0x15, 0xc1, 0x0f, ++ 0x25, 0x64, 0x25, 0xee, 0x37, 0x76, 0xdf, 0x27, 0x95, 0xd7, 0x52, 0x7d, ++ 0x38, 0xb1, 0x50, 0x74, 0x51, 0xc9, 0x41, 0x3e, 0x58, 0xb1, 0x6b, 0xe4, ++ 0x47, 0xfd, 0xd9, 0xba, 0x90, 0x9f, 0xe9, 0x29, 0x11, 0x31, 0x7e, 0x31, ++ 0xa3, 0xe8, 0xf0, 0x81, 0x44, 0x5a, 0x9f, 0xb1, 0x3c, 0x1e, 0xf3, 0xee, ++ 0xbb, 0xf7, 0x55, 0x62, 0xc6, 0xe7, 0x13, 0x1c, 0x47, 0x2e, 0x7d, 0x89, ++ 0x1e, 0xfd, 0x86, 0xfa, 0xe7, 0x47, 0x7e, 0x64, 0x88, 0x8b, 0xba, 0xd1, ++ 0xee, 0xba, 0x89, 0xd3, 0x28, 0x51, 0xcd, 0x7f, 0xed, 0xd4, 0x9e, 0x23, ++ 0xbd, 0xb2, 0xb8, 0xef, 0x4d, 0xb0, 0xb8, 0x13, 0xe4, 0x9f, 0x19, 0xe7, ++ 0xed, 0x50, 0xcd, 0xde, 0xf3, 0xe5, 0xc7, 0x10, 0xd5, 0x42, 0x54, 0x03, ++ 0xdd, 0x33, 0x78, 0xad, 0x87, 0xfd, 0x83, 0xef, 0x4f, 0xac, 0x26, 0x58, ++ 0x37, 0x96, 0xf7, 0xa1, 0x70, 0x45, 0xbd, 0xef, 0x89, 0x95, 0xbd, 0x0d, ++ 0x02, 0x38, 0xef, 0xce, 0x38, 0xa0, 0xbb, 0x98, 0x5c, 0x3f, 0x39, 0x5f, ++ 0x7c, 0x19, 0xe0, 0x29, 0x61, 0xa2, 0x42, 0xa7, 0x0d, 0xec, 0x98, 0x48, ++ 0xf0, 0x4c, 0x70, 0x30, 0xfa, 0x8b, 0x2b, 0x52, 0x1d, 0x1e, 0x8a, 0x9f, ++ 0xc6, 0xbf, 0x8b, 0x78, 0xcf, 0xb5, 0x3f, 0xbe, 0x40, 0x01, 0xfa, 0xbf, ++ 0xc7, 0xd6, 0x2f, 0x15, 0xf8, 0x23, 0xd9, 0xc1, 0xe2, 0x27, 0x8d, 0xed, ++ 0xef, 0x61, 0x7c, 0x2b, 0x2e, 0xdf, 0x4f, 0x3c, 0x36, 0x76, 0x7f, 0xee, ++ 0xb4, 0x40, 0x1c, 0xdf, 0x8a, 0xe5, 0xaa, 0x15, 0x2e, 0x2c, 0x1b, 0x57, ++ 0x14, 0x62, 0xb9, 0x2e, 0xfd, 0x7e, 0x2b, 0xc4, 0x4b, 0xc4, 0x64, 0x09, ++ 0x32, 0x81, 0x49, 0x54, 0xc6, 0x3c, 0x8c, 0x07, 0x69, 0xeb, 0x9b, 0xe3, ++ 0xe7, 0x58, 0x8b, 0x5d, 0x94, 0x6c, 0x1d, 0x72, 0x25, 0x84, 0x90, 0x44, ++ 0x88, 0x33, 0x0c, 0x87, 0xf7, 0x36, 0xe5, 0xca, 0x95, 0xfd, 0x08, 0xf9, ++ 0x26, 0x95, 0xe5, 0x7d, 0xbf, 0xe9, 0xf8, 0xc8, 0x06, 0xfc, 0xf0, 0x4d, ++ 0xaa, 0x13, 0xeb, 0xa2, 0x89, 0xdd, 0x1b, 0xc7, 0xe4, 0xfb, 0x54, 0xc8, ++ 0x4b, 0x88, 0x71, 0x29, 0x25, 0x92, 0x33, 0xd8, 0x8e, 0x7f, 0x49, 0xd8, ++ 0xbe, 0x19, 0xfc, 0x91, 0x37, 0x49, 0xe7, 0x86, 0x6b, 0x00, 0x8e, 0x2a, ++ 0x7b, 0x1f, 0xa3, 0x81, 0xbf, 0x6f, 0xda, 0x50, 0xdc, 0x9f, 0xc3, 0x55, ++ 0x1b, 0x17, 0x82, 0xf7, 0x10, 0x3c, 0x8b, 0xb2, 0x0b, 0xef, 0xad, 0xc5, ++ 0x68, 0xda, 0x3f, 0x37, 0x32, 0x5e, 0x07, 0x38, 0xe2, 0x71, 0x9f, 0x40, ++ 0x5f, 0x12, 0xa5, 0x2f, 0x3f, 0xdf, 0x37, 0x51, 0x63, 0x4c, 0x30, 0x9f, ++ 0x86, 0xdf, 0xb3, 0x92, 0x1f, 0xf3, 0xa9, 0x1a, 0x84, 0xf0, 0x79, 0x97, ++ 0x43, 0x38, 0x7e, 0x1a, 0x15, 0x55, 0x39, 0xdf, 0x3d, 0x0a, 0x51, 0xa4, ++ 0xbf, 0xea, 0xe5, 0xa9, 0x2d, 0x77, 0x57, 0x08, 0x3d, 0xdb, 0x50, 0xbe, ++ 0x62, 0x1d, 0xf2, 0xb9, 0xb8, 0xbc, 0xda, 0x9f, 0xaa, 0x0e, 0x73, 0xd0, ++ 0xf9, 0xc7, 0x5c, 0xc9, 0xf3, 0xeb, 0xd3, 0x13, 0x50, 0x0e, 0xd0, 0xf6, ++ 0x01, 0xc3, 0x21, 0x9f, 0xce, 0x44, 0x15, 0x3a, 0xc0, 0x2d, 0x41, 0x46, ++ 0x7e, 0xa1, 0x40, 0x88, 0x83, 0x3c, 0x5f, 0x62, 0x75, 0xc6, 0x4d, 0x3a, ++ 0x4f, 0x1e, 0xc4, 0xda, 0x15, 0x0e, 0x55, 0x32, 0xc3, 0xfd, 0x80, 0x33, ++ 0x0e, 0xe0, 0xb5, 0x96, 0x9f, 0x0f, 0xde, 0x50, 0xd6, 0xcb, 0x81, 0x7f, ++ 0x57, 0xbf, 0xa0, 0xbc, 0xf0, 0x22, 0xdd, 0x86, 0xf6, 0x6f, 0xd1, 0xe4, ++ 0x40, 0x82, 0x15, 0xe5, 0x93, 0xc8, 0xe1, 0xa1, 0x8d, 0x5b, 0xe8, 0x60, ++ 0xf2, 0xd8, 0x94, 0x5d, 0x35, 0xd3, 0x31, 0x94, 0x8d, 0x03, 0x3e, 0xa2, ++ 0x75, 0x37, 0xc0, 0x8b, 0x58, 0x69, 0x7d, 0x20, 0xd6, 0xe7, 0xe0, 0x73, ++ 0xa5, 0xbb, 0x3e, 0x0f, 0xeb, 0x0e, 0xd6, 0x1f, 0x13, 0x69, 0x2e, 0x42, ++ 0x0e, 0xd3, 0x71, 0x8b, 0x71, 0x9c, 0xd4, 0x3d, 0xcf, 0x52, 0xac, 0xdb, ++ 0xba, 0xd7, 0xad, 0xc3, 0x75, 0x93, 0xba, 0xeb, 0x37, 0x62, 0x3d, 0x9d, ++ 0xf5, 0xbf, 0xd8, 0x75, 0xb4, 0xb2, 0xfb, 0xfc, 0xbf, 0x63, 0x72, 0xf2, ++ 0x4b, 0x49, 0x8d, 0x4b, 0xa0, 0xf4, 0x3c, 0xf6, 0x96, 0xb9, 0x55, 0xa0, ++ 0x0a, 0xc6, 0xdf, 0xb2, 0xb0, 0xaa, 0x8c, 0xea, 0xef, 0x3f, 0xae, 0x78, ++ 0x57, 0x05, 0xb9, 0xf4, 0x01, 0x95, 0x27, 0x8d, 0xb4, 0x1c, 0x3b, 0x60, ++ 0x7f, 0x22, 0xf8, 0x39, 0xe3, 0x87, 0xee, 0x8f, 0x71, 0xea, 0xe8, 0xf5, ++ 0x06, 0x1e, 0xd7, 0x6c, 0xbb, 0xc5, 0x3c, 0x1a, 0xf4, 0x5d, 0xd1, 0xad, ++ 0x62, 0xd5, 0x16, 0x84, 0xf7, 0x4a, 0xc3, 0xbd, 0xcf, 0x1a, 0x87, 0x99, ++ 0xc7, 0x9b, 0xd8, 0x3e, 0x66, 0x48, 0x84, 0xdc, 0x91, 0x00, 0xf2, 0xf7, ++ 0xf0, 0xa5, 0x8d, 0x06, 0xbf, 0x93, 0xf3, 0xa1, 0xc2, 0xda, 0xba, 0xf7, ++ 0x7b, 0x9b, 0x80, 0xfb, 0xfd, 0xa0, 0x9e, 0xc9, 0xdb, 0x0f, 0x96, 0x0b, ++ 0x28, 0x6f, 0xbb, 0xf9, 0x34, 0x9e, 0x70, 0x3f, 0xde, 0x97, 0x0c, 0x70, ++ 0x9a, 0xb9, 0x5c, 0x27, 0xb7, 0x49, 0x18, 0xb8, 0xd4, 0x5b, 0x88, 0xdb, ++ 0x20, 0xd7, 0x23, 0xc1, 0x87, 0x90, 0xbf, 0xd2, 0xfa, 0x97, 0xb6, 0x7e, ++ 0x18, 0x97, 0xa5, 0x96, 0x9a, 0xb5, 0x2a, 0x8c, 0x3e, 0xd3, 0xe0, 0x14, ++ 0x09, 0x0f, 0x37, 0x44, 0x88, 0xff, 0x6a, 0x70, 0xd2, 0xe0, 0xad, 0xb5, ++ 0xff, 0xe9, 0x8e, 0x21, 0x0a, 0xb3, 0xab, 0xbd, 0x06, 0x38, 0xce, 0xba, ++ 0x73, 0x28, 0xc6, 0x2b, 0x6f, 0xe0, 0xf1, 0x7a, 0x12, 0x6f, 0xe5, 0xfc, ++ 0xc9, 0xfa, 0xcd, 0xa0, 0xeb, 0xec, 0xcc, 0x45, 0x7a, 0x72, 0x02, 0xbd, ++ 0x43, 0x3d, 0x6c, 0x9e, 0x0d, 0x5f, 0x77, 0x06, 0xfd, 0xd7, 0x1d, 0x79, ++ 0x17, 0x85, 0x07, 0xcc, 0x97, 0xff, 0xa0, 0xfe, 0x80, 0xdd, 0xad, 0xbb, ++ 0xff, 0x0c, 0x85, 0x7b, 0x44, 0x3a, 0x8c, 0x00, 0xef, 0x3a, 0x0b, 0xc1, ++ 0xf7, 0x2a, 0xfc, 0x5b, 0xed, 0x2c, 0x9e, 0x94, 0x34, 0x0d, 0xe7, 0xad, ++ 0xe1, 0xeb, 0x92, 0xa4, 0x19, 0xb8, 0x8f, 0x1a, 0xbe, 0xce, 0x4b, 0x7b, ++ 0x63, 0x7c, 0x26, 0xb8, 0x87, 0xda, 0x6a, 0xdf, 0x0c, 0xfe, 0x70, 0x57, ++ 0x89, 0x27, 0x65, 0x22, 0xe0, 0x6b, 0xb3, 0x19, 0xf3, 0xda, 0xee, 0xda, ++ 0xbb, 0xfe, 0xc8, 0x2f, 0xe0, 0x3e, 0x78, 0x93, 0x19, 0xef, 0x4e, 0x16, ++ 0x7e, 0xf1, 0x40, 0x01, 0xdc, 0xcb, 0x76, 0x71, 0x3d, 0x46, 0x15, 0x41, ++ 0x3b, 0x7c, 0x47, 0xc1, 0x4d, 0xb4, 0x3f, 0x55, 0x80, 0xf9, 0x17, 0x10, ++ 0x36, 0x7f, 0x97, 0x76, 0x0f, 0xb2, 0x35, 0x0e, 0xe1, 0x7a, 0xb2, 0x6c, ++ 0x4b, 0xd3, 0x08, 0x5a, 0x76, 0xee, 0x59, 0x5a, 0x09, 0xf1, 0x97, 0x13, ++ 0x7b, 0xc7, 0x1f, 0x04, 0xff, 0x79, 0x61, 0x34, 0x91, 0xd2, 0xc0, 0xde, ++ 0xab, 0xdf, 0x21, 0x23, 0x3c, 0x3c, 0xe6, 0x8f, 0x8c, 0x76, 0x82, 0x14, ++ 0xac, 0x8b, 0x3d, 0xeb, 0x0b, 0xa0, 0xae, 0x8b, 0x23, 0x2d, 0xf4, 0x9a, ++ 0x83, 0x75, 0xfa, 0xbf, 0xc5, 0xdb, 0x8c, 0x75, 0x3d, 0xbc, 0x4c, 0x7a, ++ 0x78, 0x39, 0xcb, 0x8c, 0xf0, 0x72, 0x96, 0x1b, 0xe0, 0x25, 0xbc, 0x68, ++ 0xf7, 0x89, 0x3a, 0x78, 0x95, 0x9d, 0x79, 0x29, 0x11, 0xf4, 0xfb, 0x51, ++ 0x87, 0x13, 0xe7, 0xab, 0x39, 0xd3, 0x98, 0x02, 0xf0, 0xa9, 0xd9, 0xb3, ++ 0x16, 0xcb, 0xc5, 0xdb, 0xa2, 0x3c, 0x1f, 0xe9, 0xd6, 0x5d, 0xda, 0x12, ++ 0x6f, 0xa8, 0xd7, 0xed, 0x4a, 0xf3, 0xe8, 0xf5, 0xcb, 0xd9, 0x43, 0x8f, ++ 0xc5, 0xc2, 0xf9, 0x97, 0x39, 0x44, 0xcf, 0x47, 0x54, 0x7e, 0x9c, 0x5a, ++ 0xa1, 0x36, 0x00, 0x1d, 0x9f, 0x5e, 0x31, 0xba, 0x41, 0x4f, 0xcf, 0x4b, ++ 0x5b, 0xb2, 0x3c, 0x36, 0xc3, 0x3c, 0xc6, 0xfa, 0xd9, 0x66, 0x01, 0xed, ++ 0x14, 0xd0, 0x33, 0x93, 0xcf, 0x63, 0x2f, 0x2e, 0x73, 0xc8, 0xb8, 0xce, ++ 0xa7, 0xdb, 0x98, 0xdf, 0xf9, 0xe9, 0x0a, 0xab, 0x07, 0xd6, 0x39, 0xb5, ++ 0x42, 0xf1, 0xb0, 0x75, 0x1d, 0x1e, 0x66, 0x4f, 0x31, 0x78, 0x2d, 0xb9, ++ 0x25, 0xc6, 0xf3, 0xd1, 0x90, 0xe0, 0xfe, 0x22, 0xcd, 0xfb, 0xaf, 0xde, ++ 0x1f, 0x21, 0xad, 0xe4, 0xb8, 0x95, 0xe0, 0xbb, 0x3b, 0xe7, 0xce, 0xa3, ++ 0xbf, 0x23, 0xf2, 0x8b, 0xf4, 0xa5, 0x8c, 0xf2, 0xbd, 0xcd, 0xfc, 0x17, ++ 0xa0, 0x1b, 0x2b, 0xfd, 0xdf, 0x39, 0x8c, 0xa7, 0x4a, 0x58, 0xd7, 0xe6, ++ 0xad, 0x6b, 0x11, 0x3d, 0x90, 0x57, 0x4c, 0xc8, 0x76, 0xc3, 0x7a, 0x74, ++ 0x9c, 0xf3, 0x63, 0x9d, 0x5d, 0x10, 0x59, 0x3f, 0x18, 0xbf, 0x37, 0x31, ++ 0x02, 0x62, 0x62, 0x28, 0xa7, 0xd9, 0x7d, 0x88, 0x1b, 0xee, 0x43, 0xe8, ++ 0x7c, 0x5d, 0x92, 0x6d, 0x0d, 0xc4, 0x13, 0xb4, 0xfb, 0x90, 0x3a, 0x58, ++ 0x88, 0xf6, 0x5d, 0x6a, 0xed, 0x94, 0xdd, 0xb4, 0xe9, 0xf3, 0xd6, 0xbe, ++ 0xe7, 0x7d, 0xdf, 0x9c, 0xe2, 0x29, 0x0b, 0xf4, 0x73, 0x8d, 0xb5, 0x59, ++ 0x06, 0xa5, 0x5b, 0xd3, 0x32, 0xa0, 0x0c, 0xf8, 0xe9, 0xf3, 0xd6, 0x86, ++ 0x14, 0xb0, 0x67, 0x17, 0x8b, 0x67, 0x7f, 0x1c, 0xee, 0xbd, 0xaf, 0x29, ++ 0x69, 0x9c, 0x6f, 0xbd, 0x66, 0xbf, 0xd1, 0x6f, 0xf4, 0x6a, 0xfb, 0xcc, ++ 0x92, 0x0c, 0x7c, 0x46, 0x6c, 0xdd, 0xe7, 0xa6, 0xf5, 0x53, 0x11, 0xde, ++ 0xf3, 0x99, 0xc5, 0xe7, 0xad, 0xdd, 0x7e, 0xb8, 0x62, 0x04, 0xdd, 0x7f, ++ 0xed, 0xae, 0x33, 0x32, 0xec, 0x23, 0x39, 0xcd, 0x3d, 0x2b, 0x2d, 0x39, ++ 0x78, 0x7e, 0x81, 0xdf, 0x07, 0x2d, 0xda, 0x76, 0x0c, 0xf9, 0xfc, 0xa4, ++ 0xd9, 0x73, 0xc9, 0xed, 0xe7, 0xb3, 0xf3, 0x7b, 0xec, 0xd3, 0xe6, 0x30, ++ 0xe4, 0x1f, 0x7a, 0x48, 0x07, 0xf0, 0xe7, 0x9c, 0x42, 0xa2, 0x31, 0xec, ++ 0xb5, 0xef, 0x53, 0x79, 0xf3, 0xc9, 0x6b, 0x66, 0x02, 0xf7, 0x88, 0xe4, ++ 0x5b, 0xda, 0x8b, 0x3e, 0xcf, 0xe4, 0x4f, 0xe7, 0x91, 0xaa, 0x58, 0x80, ++ 0xd7, 0x9c, 0xd6, 0xc5, 0x28, 0x7f, 0x3e, 0x79, 0x76, 0xdc, 0x41, 0x96, ++ 0x87, 0xd4, 0x5c, 0x00, 0xf4, 0xf1, 0x39, 0x31, 0xe1, 0xfb, 0xee, 0x9f, ++ 0x93, 0xdf, 0xc5, 0x0e, 0xd1, 0xc1, 0x6f, 0x5d, 0x9a, 0x96, 0x47, 0xc9, ++ 0xbe, 0x73, 0xa3, 0xe5, 0xb9, 0xd0, 0x0d, 0xa6, 0x61, 0x9e, 0x7a, 0x4d, ++ 0x53, 0x07, 0xbc, 0x3f, 0x66, 0x21, 0x92, 0x87, 0xcb, 0x25, 0x81, 0x7d, ++ 0xb7, 0xc6, 0x2b, 0xa0, 0xfd, 0x52, 0xc3, 0xda, 0x3d, 0xc4, 0xba, 0x12, ++ 0xcf, 0xb1, 0x86, 0xc9, 0x23, 0x0f, 0xfd, 0x0f, 0xea, 0xf3, 0x9b, 0x8d, ++ 0xf2, 0x69, 0xc1, 0xc3, 0xc6, 0x7a, 0x35, 0x99, 0x94, 0x02, 0x79, 0xde, ++ 0xd5, 0x0f, 0x98, 0x21, 0x93, 0x88, 0x2c, 0xd4, 0xcb, 0x3f, 0x0a, 0xbf, ++ 0x1b, 0xd3, 0x98, 0xff, 0xb9, 0x80, 0xd4, 0x37, 0x81, 0x5d, 0xf7, 0x88, ++ 0xcc, 0xf2, 0xbb, 0xe7, 0x28, 0x44, 0xea, 0x4d, 0xf5, 0xd1, 0xd2, 0xe7, ++ 0x1e, 0x29, 0x98, 0x4d, 0xeb, 0xf7, 0xa5, 0x31, 0x7b, 0xec, 0x53, 0xee, ++ 0x6f, 0xc0, 0x7b, 0x8c, 0x69, 0xf4, 0xf9, 0xa2, 0x5b, 0xbc, 0xb2, 0x9a, ++ 0xdb, 0xf3, 0x7c, 0xc7, 0x5b, 0x87, 0x4c, 0x1d, 0x41, 0x70, 0x3e, 0xe6, ++ 0x3f, 0x2d, 0xd2, 0xec, 0x57, 0xe2, 0x84, 0x78, 0x7e, 0x6f, 0xf8, 0x57, ++ 0x76, 0xe4, 0xf3, 0xf7, 0x6e, 0x15, 0xf1, 0xfe, 0xa9, 0x37, 0xb4, 0xeb, ++ 0xe4, 0xf3, 0xdc, 0x35, 0xc6, 0xf3, 0x5d, 0xe8, 0xfc, 0xa1, 0xe7, 0x25, ++ 0xe4, 0x7e, 0x3c, 0xc7, 0xa2, 0x6d, 0x57, 0xa3, 0xff, 0xa6, 0x9d, 0x47, ++ 0xc3, 0x97, 0x76, 0x1e, 0xf3, 0xb6, 0xf0, 0xef, 0xfb, 0x6e, 0x4b, 0x13, ++ 0x0c, 0x76, 0xdc, 0x2e, 0x0e, 0x3f, 0xcd, 0xff, 0xde, 0x13, 0x52, 0xdf, ++ 0x97, 0xc6, 0xec, 0x7a, 0xad, 0xfe, 0x72, 0x48, 0x5d, 0xa3, 0x6f, 0x33, ++ 0xe7, 0x6f, 0x4a, 0xf7, 0x7b, 0x80, 0xee, 0x97, 0x5a, 0xfd, 0x15, 0x8c, ++ 0x4e, 0x3a, 0x65, 0xfd, 0xbd, 0xa8, 0x1c, 0xec, 0xb7, 0x2f, 0x6d, 0x68, ++ 0xe4, 0x7e, 0x16, 0xce, 0x2f, 0xb4, 0xdf, 0xcb, 0xe7, 0xeb, 0x17, 0x15, ++ 0x9c, 0xef, 0xf5, 0x70, 0xeb, 0x2e, 0x7d, 0xee, 0xa9, 0x67, 0xc1, 0x2f, ++ 0x5d, 0xf4, 0x9b, 0x07, 0x63, 0xe1, 0x52, 0xe8, 0x13, 0xa9, 0x39, 0x05, ++ 0xde, 0xb7, 0x58, 0xb2, 0x75, 0x55, 0x2c, 0xc0, 0xe9, 0xa4, 0xe4, 0x89, ++ 0x05, 0xba, 0xf9, 0xc4, 0x2b, 0x8e, 0x0e, 0x07, 0x2f, 0x53, 0x2f, 0x0d, ++ 0x5e, 0xaa, 0x4d, 0xa0, 0x78, 0xaf, 0xd5, 0xe8, 0xbf, 0x68, 0xe5, 0x04, ++ 0xd0, 0xef, 0x7f, 0xd9, 0x6a, 0x56, 0xc0, 0x3f, 0xac, 0xdb, 0x66, 0xf1, ++ 0xc1, 0x77, 0x98, 0x6a, 0x5b, 0x17, 0xe2, 0xbd, 0x0d, 0xad, 0x1f, 0x63, ++ 0xf5, 0xd5, 0xf8, 0x7e, 0x65, 0xdd, 0x2e, 0xf3, 0x87, 0x7a, 0xbc, 0x2e, ++ 0x7a, 0xe2, 0xc1, 0x14, 0xcc, 0xf3, 0x20, 0x9e, 0xde, 0xec, 0x5e, 0xdd, ++ 0xd7, 0x1b, 0x3e, 0x21, 0x54, 0xbb, 0xe5, 0xcf, 0x15, 0xe0, 0x2f, 0xd7, ++ 0x11, 0x3f, 0xd2, 0x73, 0xe8, 0x38, 0x58, 0x3f, 0x90, 0x80, 0xf2, 0x7a, ++ 0xb6, 0x1c, 0xd7, 0xf3, 0xb9, 0x16, 0x3f, 0xad, 0x63, 0x4d, 0xa4, 0xae, ++ 0x75, 0xfd, 0x19, 0x88, 0x9f, 0xd6, 0xb5, 0x8e, 0x39, 0x01, 0x7c, 0x5f, ++ 0x47, 0xa4, 0x0f, 0xf5, 0xf4, 0x54, 0x03, 0x34, 0x4d, 0xfd, 0x96, 0x2f, ++ 0xd2, 0x78, 0xfe, 0xdd, 0x15, 0xe4, 0x0a, 0x90, 0x2f, 0x1a, 0x3c, 0x88, ++ 0x37, 0x19, 0xe5, 0x73, 0xc3, 0x93, 0x3f, 0x1d, 0x74, 0x8c, 0xee, 0xe7, ++ 0xd4, 0x96, 0xd7, 0x62, 0x05, 0xbd, 0xdf, 0xca, 0xef, 0xdd, 0xcf, 0xb6, ++ 0xcc, 0xfd, 0x53, 0xe2, 0x79, 0xf4, 0xc3, 0x69, 0x4a, 0xa7, 0xfa, 0xf7, ++ 0x32, 0x34, 0xb9, 0xeb, 0xdc, 0x45, 0x37, 0x90, 0x4a, 0xab, 0x6d, 0xac, ++ 0x5c, 0x62, 0xf6, 0xc5, 0x8e, 0xa0, 0x70, 0x5d, 0xb2, 0xc9, 0x8c, 0xef, ++ 0x89, 0x2e, 0x79, 0xea, 0xb1, 0xc7, 0x7f, 0x0e, 0xf9, 0x44, 0xef, 0x59, ++ 0xf0, 0x1e, 0x64, 0xf1, 0x53, 0x07, 0x8e, 0x0c, 0xa7, 0xf5, 0xc5, 0x3b, ++ 0xcc, 0x49, 0x95, 0xec, 0x18, 0x36, 0xb8, 0x17, 0xd6, 0xf0, 0x52, 0x47, ++ 0xff, 0x07, 0xf7, 0x14, 0x1a, 0x1e, 0x16, 0x3d, 0x73, 0x40, 0x86, 0xf7, ++ 0x68, 0xa0, 0x1d, 0xfc, 0x04, 0x0d, 0x1f, 0x8b, 0x77, 0xb4, 0xcb, 0x64, ++ 0x60, 0x4f, 0xf8, 0x95, 0xb6, 0xb4, 0xcb, 0x9d, 0xb6, 0x30, 0x78, 0x69, ++ 0x39, 0x56, 0x81, 0xef, 0x1b, 0x3d, 0xf9, 0xb5, 0x0c, 0x78, 0xff, 0x64, ++ 0xaf, 0x40, 0x52, 0xb3, 0x7a, 0x8e, 0xaf, 0xd9, 0x74, 0x00, 0xed, 0x18, ++ 0x80, 0x13, 0xe2, 0x91, 0xe3, 0xa9, 0x1b, 0x6f, 0x3d, 0xf0, 0xe5, 0x9b, ++ 0xb0, 0x3b, 0x1f, 0xfb, 0x29, 0x20, 0xb7, 0x2f, 0x84, 0xaf, 0x77, 0xb8, ++ 0x5e, 0xa5, 0x74, 0xfd, 0xf4, 0x6e, 0xba, 0x8f, 0x9a, 0x3f, 0x58, 0x5c, ++ 0x00, 0x87, 0x9a, 0xa7, 0x6f, 0x8a, 0x85, 0xf3, 0x9c, 0x90, 0xea, 0x19, ++ 0x7d, 0x3f, 0xb2, 0x2a, 0x05, 0xf2, 0xdd, 0x6a, 0xcc, 0x9e, 0x14, 0x05, ++ 0x4b, 0xd6, 0x5e, 0xf3, 0xe8, 0xcd, 0x48, 0x77, 0x0b, 0x0e, 0xdf, 0x9c, ++ 0xc2, 0xf2, 0x0f, 0xd5, 0x34, 0x9e, 0xe7, 0x91, 0x06, 0xe7, 0x9c, 0xbf, ++ 0x71, 0x0a, 0x9e, 0xb3, 0x9a, 0xb8, 0x91, 0xfe, 0x6a, 0x1e, 0x11, 0xab, ++ 0x20, 0x1f, 0xe6, 0x2b, 0x89, 0x8c, 0xde, 0x11, 0x86, 0x3f, 0x6e, 0xe3, ++ 0xfc, 0x71, 0x62, 0x33, 0x45, 0x2e, 0x3d, 0xe7, 0x09, 0x90, 0x97, 0x3a, ++ 0xbf, 0x47, 0x7b, 0xbf, 0xf9, 0xe6, 0xee, 0x78, 0x08, 0xbb, 0x8f, 0xfc, ++ 0x8a, 0xdf, 0x47, 0x56, 0xf5, 0x32, 0x19, 0xf4, 0x4b, 0x37, 0xdd, 0x6e, ++ 0x59, 0x8d, 0x72, 0xf5, 0xd3, 0x0c, 0x35, 0x15, 0xee, 0x29, 0x29, 0x1c, ++ 0x34, 0x39, 0x8a, 0xf2, 0x55, 0x3c, 0x5c, 0x9e, 0xca, 0xf0, 0xc4, 0xe4, ++ 0x31, 0x8e, 0xa3, 0xf4, 0x57, 0x0a, 0xed, 0xd0, 0xbf, 0xc3, 0x8c, 0xf7, ++ 0xc3, 0xba, 0x71, 0x5c, 0x7e, 0xb2, 0xf5, 0x97, 0xf3, 0xf5, 0xe9, 0xbe, ++ 0xa3, 0xc1, 0x1e, 0x39, 0x91, 0x12, 0xfe, 0xbd, 0xa0, 0xc7, 0x7b, 0x09, ++ 0xda, 0xfe, 0x3a, 0x88, 0x8e, 0xce, 0x74, 0x7c, 0xce, 0xf8, 0x7e, 0xcb, ++ 0x5a, 0xc6, 0xe7, 0x1a, 0xdf, 0x7b, 0xaf, 0x1e, 0x0d, 0xcf, 0xbf, 0x7c, ++ 0x9b, 0xf1, 0x11, 0x8c, 0x03, 0x7d, 0x44, 0xf7, 0xe5, 0x4b, 0xc5, 0xe7, ++ 0xed, 0x93, 0x05, 0x94, 0x0b, 0x16, 0xe2, 0x0b, 0xc7, 0xdf, 0x5b, 0xcc, ++ 0x9c, 0xbf, 0x8d, 0xcf, 0xa9, 0xc5, 0x8e, 0xf6, 0x9c, 0x46, 0x27, 0x74, ++ 0xff, 0x12, 0x7c, 0x97, 0x2c, 0x48, 0x2f, 0x74, 0x9d, 0x04, 0xc4, 0x03, ++ 0xda, 0x2b, 0xd5, 0x0f, 0xd0, 0xf1, 0x3a, 0x3b, 0xbb, 0x0e, 0xd6, 0xc5, ++ 0x7e, 0x72, 0xb0, 0x3d, 0x2b, 0xc8, 0xc7, 0x0b, 0xb8, 0x3c, 0xb8, 0xb9, ++ 0x17, 0x95, 0x07, 0x97, 0x05, 0xe5, 0x01, 0xd9, 0x98, 0x7c, 0x51, 0xf1, ++ 0x81, 0x25, 0x66, 0xef, 0xe3, 0x3f, 0x07, 0xfe, 0xa5, 0xfc, 0xea, 0x71, ++ 0x02, 0xff, 0x9a, 0xf1, 0xfd, 0x9b, 0xcf, 0xb6, 0xef, 0x3f, 0x72, 0x1d, ++ 0xa5, 0xf3, 0xcf, 0x5a, 0x34, 0xbe, 0x35, 0xca, 0xd3, 0x50, 0xbe, 0xad, ++ 0xd9, 0x79, 0x33, 0xc6, 0x09, 0x43, 0xf9, 0xf6, 0xb3, 0xf4, 0x7a, 0x12, ++ 0x96, 0x6f, 0xd3, 0xf9, 0xfb, 0x73, 0xa1, 0x7c, 0x9b, 0xde, 0xf9, 0x1f, ++ 0x95, 0xa7, 0x1a, 0xfc, 0x1e, 0x09, 0x81, 0x1f, 0x95, 0x8f, 0xbf, 0xdc, ++ 0xed, 0x8c, 0x0c, 0xc7, 0x50, 0xf9, 0x38, 0xac, 0x97, 0x33, 0xac, 0x7c, ++ 0xa4, 0x7f, 0x6f, 0x93, 0x82, 0x9e, 0x74, 0xa8, 0xd1, 0x9f, 0x46, 0x77, ++ 0x8b, 0x7e, 0xbd, 0xb4, 0x0f, 0xc8, 0xa1, 0x6e, 0xfa, 0xd4, 0xe8, 0xaf, ++ 0x9b, 0x3e, 0x35, 0xfa, 0x0b, 0x3d, 0xaf, 0x11, 0x7e, 0xa1, 0xcf, 0xab, ++ 0x21, 0xe9, 0x49, 0x67, 0x3f, 0x98, 0xef, 0x22, 0x1e, 0x3b, 0xc5, 0xb7, ++ 0x7f, 0x8f, 0x88, 0xdf, 0x4d, 0xea, 0x72, 0xfa, 0x63, 0x21, 0x0e, 0xb4, ++ 0x2a, 0x8a, 0xcc, 0x02, 0x3b, 0xbc, 0x4b, 0xe1, 0xf5, 0x78, 0x56, 0xf7, ++ 0x27, 0xcb, 0x4d, 0x20, 0x27, 0xb4, 0x76, 0x7f, 0x14, 0x8b, 0xab, 0x75, ++ 0x55, 0xf9, 0x63, 0xe3, 0x75, 0xf6, 0xf5, 0xb1, 0x36, 0x31, 0x16, 0xe2, ++ 0xbc, 0x9d, 0xde, 0xf0, 0xdf, 0x79, 0xc3, 0xcc, 0x44, 0xba, 0x7e, 0x67, ++ 0x84, 0xef, 0xc0, 0x69, 0x71, 0x89, 0xae, 0xe8, 0xd8, 0x41, 0xb8, 0x5e, ++ 0x74, 0xa6, 0x17, 0xf0, 0x55, 0x2e, 0xda, 0x32, 0x6f, 0x81, 0xfc, 0xd1, ++ 0x66, 0x11, 0xbf, 0xe7, 0x33, 0x6f, 0xe5, 0xb5, 0xb1, 0x90, 0x27, 0xd2, ++ 0xd5, 0xd6, 0x77, 0xe2, 0x34, 0xda, 0x3e, 0xff, 0x15, 0xfe, 0x39, 0x3f, ++ 0x8f, 0x2a, 0xa5, 0x51, 0x38, 0xcf, 0xe5, 0x78, 0x3f, 0x49, 0x3c, 0x0f, ++ 0x15, 0xd1, 0xf3, 0xcd, 0x6d, 0x63, 0xf6, 0xf3, 0xbc, 0x0d, 0xe1, 0xe9, ++ 0x44, 0xbb, 0x3f, 0xaf, 0xb6, 0x2d, 0x97, 0x41, 0x1e, 0x51, 0xbb, 0xf5, ++ 0x43, 0x7d, 0xfc, 0x68, 0x11, 0xff, 0xde, 0x42, 0xcd, 0xc6, 0x90, 0xf6, ++ 0xb6, 0x71, 0x48, 0x4f, 0x8b, 0x42, 0xe8, 0xc9, 0xcd, 0xfd, 0xa3, 0x13, ++ 0xbd, 0xb8, 0x7e, 0x1e, 0x4c, 0x06, 0x73, 0xff, 0xc4, 0xa4, 0xcf, 0x0b, ++ 0x29, 0x17, 0x73, 0x27, 0xc2, 0x3b, 0x1e, 0x5d, 0x87, 0x44, 0xcc, 0xbb, ++ 0x3e, 0xdb, 0x26, 0x92, 0x26, 0x38, 0xe7, 0x76, 0xc1, 0x4b, 0x80, 0xbf, ++ 0x3d, 0xc9, 0x48, 0x97, 0xb5, 0x54, 0x7e, 0xe8, 0xe3, 0xc0, 0xa7, 0x80, ++ 0xee, 0xce, 0xf3, 0x3e, 0xdd, 0xa9, 0xdf, 0xfe, 0x77, 0xc1, 0xed, 0xb4, ++ 0xcb, 0x92, 0x67, 0xdf, 0x1f, 0xf4, 0x0b, 0x5a, 0x9e, 0x7a, 0xf6, 0xbd, ++ 0x4b, 0x5e, 0x80, 0xfa, 0x73, 0x47, 0x33, 0xdf, 0x27, 0x3d, 0xfb, 0x97, ++ 0xee, 0xfd, 0x66, 0x26, 0xc8, 0xff, 0xae, 0xbd, 0x16, 0x82, 0x71, 0x95, ++ 0xbd, 0x2f, 0x67, 0xde, 0x0e, 0xf5, 0xdd, 0x16, 0xcc, 0x3f, 0xea, 0xba, ++ 0xcb, 0xc2, 0xe2, 0xc1, 0x7b, 0xed, 0x98, 0x4f, 0xd7, 0x95, 0xc1, 0xde, ++ 0x8b, 0x69, 0xd8, 0xf3, 0xf5, 0x20, 0xcc, 0xdf, 0x26, 0x8d, 0x88, 0xb7, ++ 0x84, 0xde, 0xcc, 0xef, 0x38, 0xdb, 0xf6, 0xb7, 0x3f, 0xe2, 0x7b, 0xb6, ++ 0x6d, 0xf4, 0x54, 0xa0, 0x6f, 0xf7, 0xc6, 0xa0, 0x3d, 0x5e, 0xb7, 0x3b, ++ 0xca, 0x0b, 0x4e, 0x6a, 0xd7, 0x9e, 0xaf, 0x0b, 0xf4, 0xf7, 0x18, 0xdf, ++ 0xf7, 0x3c, 0xb5, 0x32, 0x8b, 0xe3, 0x77, 0xd9, 0xc9, 0x34, 0x88, 0x7f, ++ 0x75, 0xc5, 0xb3, 0x3c, 0x9b, 0xba, 0x17, 0x86, 0x3d, 0xb6, 0x92, 0xae, ++ 0xbf, 0xb4, 0xb5, 0x5d, 0x86, 0xf7, 0x77, 0x4a, 0x5f, 0xfc, 0xfb, 0x20, ++ 0x90, 0x37, 0x5d, 0x3b, 0x99, 0x1d, 0x71, 0xda, 0xdc, 0xf9, 0x28, 0x71, ++ 0x11, 0x92, 0xd1, 0xfb, 0x8e, 0xbb, 0xcd, 0x14, 0x5f, 0xa7, 0xc1, 0xb6, ++ 0xa3, 0xbc, 0xf2, 0x7c, 0xef, 0x3d, 0xe3, 0xe1, 0x9e, 0xa3, 0x27, 0x5c, ++ 0x18, 0x1c, 0xba, 0x28, 0x1c, 0xe0, 0x5c, 0x14, 0x2e, 0x35, 0x20, 0x27, ++ 0x23, 0xc1, 0x23, 0xbf, 0x37, 0xfb, 0x4e, 0xcf, 0x0f, 0x0f, 0x1e, 0x67, ++ 0x66, 0xc2, 0xfa, 0x4b, 0xda, 0xae, 0xc0, 0x7b, 0x88, 0x20, 0x5c, 0x04, ++ 0x95, 0xb5, 0xdb, 0xbd, 0x56, 0x01, 0xcf, 0xcf, 0xda, 0xf7, 0x7e, 0x3d, ++ 0x08, 0xe4, 0xf1, 0x67, 0x2d, 0x2b, 0x51, 0xbf, 0x5f, 0xe8, 0xdc, 0xd7, ++ 0xfc, 0x60, 0xe9, 0xe0, 0x9f, 0x3d, 0xb7, 0xe0, 0xbb, 0x98, 0x73, 0x2f, ++ 0xfb, 0xc1, 0x9e, 0x9b, 0xd1, 0x7f, 0x00, 0xf4, 0x53, 0x72, 0x4f, 0x3e, ++ 0xe8, 0x49, 0xe7, 0xcf, 0xfd, 0x18, 0xeb, 0x4f, 0xdb, 0x5d, 0xb8, 0xdf, ++ 0x8b, 0xe4, 0xff, 0xfb, 0xff, 0x5f, 0xa3, 0xf7, 0x9d, 0x02, 0xe6, 0xb1, ++ 0x5c, 0x08, 0xef, 0x3b, 0xfe, 0xd7, 0xe2, 0xfd, 0x15, 0x8e, 0x77, 0xbb, ++ 0x02, 0xf9, 0x12, 0x5d, 0x7b, 0xfe, 0x9e, 0x49, 0x74, 0xe7, 0xbf, 0xd0, ++ 0xb9, 0x3b, 0x7e, 0xb0, 0xf8, 0x3e, 0xff, 0xb9, 0x35, 0x3b, 0xa8, 0xc3, ++ 0x54, 0xaf, 0xe4, 0xd3, 0xfd, 0xbd, 0x47, 0x9a, 0xa7, 0x64, 0xd1, 0xf2, ++ 0x2d, 0xf5, 0x8b, 0x24, 0x70, 0x5b, 0x2d, 0x91, 0xee, 0x6b, 0xd2, 0x99, ++ 0x5f, 0x61, 0x11, 0x58, 0xfe, 0x37, 0x99, 0x22, 0x68, 0xf1, 0xa5, 0x0e, ++ 0x43, 0xfe, 0x53, 0x7a, 0x0d, 0xda, 0x1b, 0x13, 0xd4, 0xbb, 0xd9, 0x77, ++ 0x9a, 0xa4, 0xfa, 0x0e, 0xc8, 0x3f, 0xed, 0x28, 0x99, 0xeb, 0x5a, 0x87, ++ 0x3d, 0xf2, 0xf0, 0xbb, 0x02, 0x1d, 0x93, 0x47, 0xf2, 0xba, 0xd1, 0xdf, ++ 0x7a, 0x53, 0x20, 0xaa, 0x40, 0xed, 0xdb, 0x09, 0x25, 0xe3, 0x0e, 0x81, ++ 0xbd, 0x37, 0x51, 0x15, 0xd1, 0x1e, 0xa4, 0x25, 0xda, 0x81, 0xef, 0x64, ++ 0x56, 0xb0, 0xf6, 0x42, 0xa3, 0x9f, 0x31, 0x3d, 0xc4, 0x3f, 0xb8, 0x76, ++ 0x9a, 0xf1, 0xf9, 0x14, 0x3e, 0xdf, 0x54, 0xb2, 0x4c, 0xc9, 0xa7, 0xf0, ++ 0x9a, 0x9a, 0x2e, 0x29, 0x5e, 0x0a, 0xa2, 0xe9, 0xc5, 0xf5, 0x66, 0x38, ++ 0xcf, 0xf4, 0x1b, 0x04, 0xd2, 0xac, 0x8b, 0x6f, 0x4e, 0x09, 0x99, 0xef, ++ 0x03, 0x08, 0xa0, 0xe9, 0xec, 0xc8, 0xef, 0x0a, 0xbf, 0xbc, 0x74, 0xe6, ++ 0x77, 0x5a, 0x84, 0x65, 0x08, 0x0f, 0x52, 0x2c, 0xf2, 0xf7, 0x8d, 0x2e, ++ 0x00, 0x3f, 0xc2, 0xe0, 0xdd, 0x31, 0x79, 0x30, 0xcb, 0x33, 0x96, 0x5c, ++ 0x0c, 0x7e, 0x53, 0x97, 0xba, 0x30, 0x6e, 0xca, 0xfd, 0x50, 0x33, 0x1f, ++ 0x6f, 0xb6, 0xad, 0xe9, 0x00, 0xbe, 0x35, 0x13, 0xa3, 0xff, 0xa9, 0xf9, ++ 0x91, 0x91, 0xe0, 0x4c, 0xb8, 0x5f, 0x8a, 0xf3, 0x64, 0x07, 0xe1, 0x6e, ++ 0x56, 0x45, 0xf4, 0x4b, 0x75, 0xf3, 0x21, 0x3c, 0x34, 0x7c, 0x7c, 0x57, ++ 0x3c, 0x68, 0xf8, 0xfb, 0xbe, 0xf8, 0x90, 0xd2, 0x89, 0xe1, 0x5e, 0x55, ++ 0x2b, 0x17, 0x5a, 0x67, 0x2f, 0x86, 0x7b, 0x08, 0x2b, 0xe4, 0xbd, 0xd3, ++ 0x79, 0x27, 0x6e, 0x60, 0xef, 0x91, 0x58, 0x73, 0x05, 0x84, 0x63, 0x55, ++ 0xa1, 0x19, 0xdf, 0xe3, 0xfa, 0xb3, 0xa9, 0xaa, 0x00, 0x0c, 0xe7, 0xca, ++ 0x21, 0x57, 0xd4, 0xde, 0xc6, 0xa6, 0x75, 0x01, 0x7c, 0x16, 0x72, 0x38, ++ 0x56, 0x93, 0x7a, 0xb4, 0x3b, 0xc9, 0xb7, 0xe7, 0xce, 0x15, 0x15, 0xe0, ++ 0xad, 0x1f, 0xda, 0xad, 0x0b, 0x55, 0x42, 0xc6, 0x53, 0xbf, 0xa4, 0xba, ++ 0x48, 0xf0, 0x45, 0xd3, 0xf3, 0x2f, 0x90, 0x88, 0x27, 0x2e, 0x0f, 0xe2, ++ 0xa0, 0x02, 0xf9, 0x50, 0x1f, 0x07, 0xf5, 0x1a, 0xeb, 0xf0, 0x77, 0x65, ++ 0x4a, 0x70, 0x9e, 0x0b, 0xf5, 0x8f, 0x24, 0x1f, 0xfe, 0xd5, 0xe5, 0x9f, ++ 0xa8, 0x3c, 0xfa, 0x90, 0x22, 0xfd, 0x18, 0x94, 0x98, 0x3f, 0x43, 0x24, ++ 0xbd, 0xff, 0x38, 0xab, 0x8d, 0xc1, 0xb1, 0x6e, 0x89, 0xe0, 0xcd, 0x46, ++ 0x3a, 0xf2, 0x99, 0xf5, 0xf7, 0xc0, 0x4f, 0x70, 0xba, 0xfe, 0xd3, 0x1d, ++ 0x43, 0x50, 0xce, 0x15, 0xdf, 0x3b, 0x30, 0x8e, 0xf9, 0xb5, 0xf9, 0x98, ++ 0xd7, 0x53, 0xc7, 0xed, 0xfd, 0xb3, 0x1e, 0x67, 0x1c, 0xc4, 0x73, 0xce, ++ 0xb6, 0xf5, 0x8d, 0x83, 0x78, 0xcd, 0xd9, 0x43, 0xa5, 0xb1, 0xe1, 0xf2, ++ 0x79, 0x0e, 0x73, 0xbf, 0xf2, 0xf7, 0x2b, 0xac, 0x58, 0x76, 0x95, 0x09, ++ 0xcd, 0x62, 0x1c, 0xbe, 0x7f, 0x32, 0x01, 0xf5, 0x70, 0x59, 0x14, 0x01, ++ 0xb9, 0x13, 0x3a, 0x6e, 0x75, 0xba, 0x16, 0x97, 0xa9, 0x97, 0x31, 0x8e, ++ 0x4f, 0x58, 0x3e, 0x7e, 0x35, 0x3f, 0xc7, 0x02, 0x3a, 0x34, 0x2e, 0x41, ++ 0x87, 0xb7, 0x0d, 0xe3, 0x3f, 0x91, 0x06, 0xf5, 0xc4, 0x03, 0xfc, 0x7d, ++ 0xa8, 0xbb, 0x57, 0xf9, 0xbe, 0xf0, 0x05, 0x3f, 0x16, 0xe0, 0x7a, 0x38, ++ 0xaa, 0xb3, 0x22, 0xdc, 0x77, 0x0a, 0x7f, 0xc6, 0xe5, 0x6a, 0xe5, 0xbe, ++ 0x6f, 0x64, 0x88, 0x1f, 0x4c, 0x6a, 0xcb, 0xc2, 0xef, 0x4c, 0x4e, 0x2a, ++ 0x33, 0xbe, 0x0f, 0x78, 0x5f, 0x3a, 0xf7, 0xcf, 0x87, 0x90, 0x21, 0xb0, ++ 0xaf, 0xca, 0x7d, 0x63, 0x62, 0x87, 0x01, 0x5e, 0x0e, 0x89, 0xae, 0x28, ++ 0x0a, 0xdf, 0xba, 0xb6, 0x33, 0xb2, 0x3b, 0xcc, 0xfd, 0x5c, 0x28, 0x3c, ++ 0x61, 0x7e, 0x88, 0x23, 0x1f, 0x37, 0xbb, 0xaa, 0x01, 0x9e, 0xc7, 0xef, ++ 0x8e, 0xc2, 0xef, 0x00, 0xbc, 0xc1, 0xef, 0x8b, 0x72, 0xf9, 0xf7, 0x21, ++ 0xe1, 0x13, 0x42, 0x10, 0x3f, 0xdb, 0x9c, 0xce, 0xee, 0x21, 0xbe, 0x4e, ++ 0x67, 0x71, 0xf4, 0x6b, 0x2a, 0x8b, 0xcd, 0xc9, 0x74, 0xdd, 0xdc, 0x56, ++ 0x65, 0x30, 0xe4, 0x97, 0xf5, 0xe2, 0xfd, 0xbf, 0x4e, 0x77, 0xe2, 0xf3, ++ 0xde, 0x7c, 0x9c, 0xd6, 0xaf, 0xd7, 0x12, 0xd6, 0xef, 0x98, 0xac, 0xd4, ++ 0x86, 0x3b, 0x7f, 0x46, 0x26, 0xa3, 0x9f, 0x05, 0xc4, 0xf5, 0xe3, 0x42, ++ 0xe1, 0x87, 0x87, 0xb7, 0xe2, 0x7b, 0xed, 0x3e, 0x78, 0x3f, 0xee, 0x6c, ++ 0x99, 0xc0, 0xdf, 0x9f, 0x09, 0xa5, 0x6b, 0x82, 0xfc, 0x71, 0x76, 0xb4, ++ 0xe0, 0x05, 0xfd, 0x0b, 0x7e, 0x2c, 0xd6, 0x2b, 0x05, 0xd4, 0xff, 0x6f, ++ 0x68, 0x79, 0x15, 0x93, 0x98, 0xbe, 0xd4, 0xe8, 0x3e, 0x14, 0xce, 0x6f, ++ 0x71, 0xfa, 0xd5, 0xd6, 0xef, 0xe2, 0x70, 0x7f, 0x9b, 0xd3, 0x87, 0x06, ++ 0x67, 0x0d, 0xbe, 0xa1, 0xfb, 0xd5, 0xfa, 0x53, 0x79, 0x75, 0x95, 0x3e, ++ 0xde, 0x32, 0x71, 0xd7, 0xe0, 0xa7, 0xc1, 0x3e, 0xa9, 0x6d, 0x13, 0x14, ++ 0x13, 0x9d, 0xaa, 0x56, 0xea, 0x94, 0x81, 0x0f, 0xeb, 0x76, 0xdd, 0x67, ++ 0x86, 0xfb, 0x85, 0xe9, 0xfc, 0x77, 0x5a, 0x88, 0x54, 0x35, 0x48, 0x7f, ++ 0xbf, 0xfb, 0x75, 0xba, 0x84, 0xf3, 0xed, 0xcf, 0x1b, 0x81, 0xf6, 0xe3, ++ 0x17, 0x1b, 0x98, 0x7d, 0xac, 0xce, 0x3b, 0x13, 0x0b, 0x76, 0xd0, 0x1b, ++ 0x26, 0xd7, 0x5b, 0x23, 0x80, 0x1f, 0xdf, 0x14, 0x0d, 0xdf, 0x37, 0x0f, ++ 0x2d, 0xdf, 0x5f, 0xa1, 0x2c, 0x2a, 0x33, 0xeb, 0xe7, 0xcd, 0x62, 0x7e, ++ 0xd2, 0x92, 0x62, 0x33, 0x84, 0x87, 0xae, 0x5f, 0xd2, 0x6e, 0x4e, 0xd5, ++ 0xd1, 0xd3, 0xd7, 0x90, 0x8f, 0x35, 0x34, 0xd8, 0xde, 0x6b, 0x89, 0x13, ++ 0xf3, 0x18, 0xe9, 0x7a, 0xb8, 0x0f, 0xcf, 0x3d, 0x16, 0x02, 0xf9, 0x4b, ++ 0xb9, 0x2d, 0x1d, 0x25, 0x31, 0xf4, 0xf9, 0xf5, 0xf5, 0xf1, 0x8c, 0x0e, ++ 0x6b, 0x5a, 0xda, 0x65, 0xac, 0xb3, 0xef, 0x0d, 0x6b, 0xeb, 0x69, 0xeb, ++ 0x84, 0xf2, 0xd3, 0xe4, 0xca, 0x18, 0x43, 0x7d, 0x6e, 0x69, 0x67, 0x3a, ++ 0xc0, 0xa5, 0xd2, 0xe2, 0x5b, 0xee, 0x0a, 0x43, 0xa7, 0xf7, 0x67, 0x74, ++ 0xc7, 0x55, 0xbf, 0x9b, 0x9e, 0x50, 0x29, 0xdd, 0x0e, 0xfa, 0xff, 0x41, ++ 0x4f, 0x9c, 0xa9, 0x08, 0xf7, 0x3d, 0xd4, 0xd9, 0x1c, 0x6e, 0x3a, 0xfd, ++ 0x90, 0x1a, 0x4e, 0x3f, 0x2c, 0x5b, 0xe9, 0x4c, 0x05, 0xf8, 0x2f, 0xdb, ++ 0xd3, 0x37, 0x15, 0x98, 0x63, 0xd9, 0x2b, 0xe5, 0x29, 0xe1, 0xf4, 0xc3, ++ 0x3b, 0x2b, 0xd8, 0xfd, 0xe1, 0x51, 0x9e, 0x7f, 0xd9, 0x35, 0x99, 0xea, ++ 0x87, 0xcb, 0x75, 0xfa, 0x61, 0x72, 0x14, 0xd2, 0x47, 0xe8, 0xb8, 0x71, ++ 0x19, 0xda, 0x77, 0x55, 0x2e, 0xa0, 0x1f, 0x34, 0x7c, 0xfd, 0x87, 0xe5, ++ 0xcc, 0x3b, 0xa0, 0x1f, 0xc2, 0xf0, 0xf5, 0xcc, 0x0c, 0xa3, 0x7e, 0x98, ++ 0xda, 0x36, 0x1b, 0xf5, 0xc3, 0xd4, 0xc9, 0x22, 0x71, 0xea, 0xe2, 0x71, ++ 0x53, 0x32, 0x2e, 0xa4, 0x1f, 0x8a, 0x53, 0xa6, 0x63, 0xdd, 0xec, 0x8a, ++ 0x09, 0x43, 0x37, 0xef, 0x70, 0xbf, 0x04, 0xe0, 0x0a, 0x25, 0xac, 0x03, ++ 0x7a, 0xe2, 0xee, 0x0c, 0x26, 0xf7, 0x43, 0xf5, 0x45, 0x24, 0x79, 0x9e, ++ 0x7d, 0xb1, 0xf2, 0xfc, 0x7f, 0x08, 0xce, 0x9a, 0x3c, 0x5f, 0x36, 0x85, ++ 0xbd, 0xcf, 0xdf, 0x93, 0x0e, 0x09, 0xca, 0xeb, 0x65, 0xd3, 0x05, 0xfc, ++ 0x1d, 0x93, 0x65, 0x7b, 0x98, 0x3c, 0x5f, 0x76, 0x03, 0x8f, 0x4b, 0x86, ++ 0xc8, 0xd7, 0x2a, 0x90, 0xaf, 0xf9, 0x7a, 0xf9, 0xca, 0xc6, 0xd7, 0xba, ++ 0x99, 0x3e, 0xa8, 0xdb, 0x95, 0xf5, 0xd3, 0x19, 0xf4, 0xf9, 0x75, 0xcd, ++ 0x66, 0x97, 0x95, 0xf6, 0xbf, 0x2e, 0x28, 0x6f, 0x0b, 0xf4, 0xf2, 0xf6, ++ 0xee, 0x0c, 0x49, 0x83, 0x73, 0xa6, 0x12, 0x06, 0xbf, 0xd3, 0x66, 0xc4, ++ 0x10, 0xa7, 0x51, 0x5e, 0xf5, 0x03, 0x39, 0x75, 0x7c, 0xf0, 0xcb, 0xb9, ++ 0xcf, 0x00, 0xdd, 0xbf, 0xc1, 0xde, 0x37, 0xfb, 0x33, 0xd7, 0xe3, 0xaf, ++ 0x0f, 0x7e, 0x39, 0x1f, 0xe2, 0xe9, 0x1f, 0xf1, 0x79, 0x5b, 0x33, 0x18, ++ 0x5e, 0x4e, 0xaf, 0x20, 0x8b, 0xca, 0x28, 0x1c, 0x4a, 0xe7, 0x31, 0x7b, ++ 0x78, 0xe9, 0x76, 0x11, 0xe1, 0x50, 0xdb, 0xca, 0xec, 0xbc, 0xda, 0x6d, ++ 0x02, 0xbe, 0xd7, 0x5b, 0x91, 0xf7, 0x0d, 0xde, 0x1b, 0x2e, 0xde, 0xc3, ++ 0xee, 0x0d, 0xe1, 0xbb, 0xbe, 0xc5, 0x3a, 0x3c, 0x2e, 0x7e, 0xa3, 0xb3, ++ 0xa9, 0x37, 0x3c, 0xdf, 0x24, 0xe0, 0xbd, 0x67, 0xb5, 0x6b, 0x31, 0x7b, ++ 0xff, 0xef, 0x61, 0x16, 0x27, 0xb6, 0xd2, 0xff, 0x20, 0x5f, 0x62, 0x6d, ++ 0x74, 0xec, 0x66, 0x82, 0x79, 0x3a, 0x2a, 0xc6, 0x9b, 0x97, 0x72, 0xb8, ++ 0x55, 0x5a, 0xfc, 0x07, 0x61, 0x7c, 0xe5, 0x13, 0x82, 0x6b, 0x13, 0xca, ++ 0x35, 0x63, 0x7c, 0x7a, 0x69, 0xbf, 0xb1, 0x9f, 0x80, 0x7f, 0xb0, 0x78, ++ 0x5b, 0x48, 0xbb, 0x6b, 0x2d, 0xde, 0x67, 0x2c, 0x85, 0xb8, 0xb3, 0xce, ++ 0x1f, 0xf9, 0x3d, 0xe7, 0x93, 0xf9, 0xa2, 0x2f, 0xf7, 0x19, 0xc8, 0x0f, ++ 0x7c, 0x4b, 0x0c, 0xfb, 0xbb, 0x67, 0x5a, 0xbf, 0x6e, 0x38, 0xd4, 0x7c, ++ 0x4f, 0x38, 0x1c, 0xa6, 0x70, 0xc8, 0xff, 0xe7, 0xe1, 0x50, 0xd7, 0x76, ++ 0x1f, 0xe6, 0xdf, 0x7c, 0xdf, 0xf3, 0xbf, 0x93, 0xc1, 0xe3, 0xed, 0x79, ++ 0x24, 0x1f, 0xf8, 0xe5, 0xcf, 0x26, 0x15, 0xf9, 0xdf, 0xf3, 0xaa, 0x88, ++ 0xef, 0x17, 0xcf, 0xbb, 0xaf, 0x7f, 0xaa, 0x3e, 0x4f, 0xe9, 0x38, 0x87, ++ 0xc3, 0x1b, 0x26, 0x77, 0x53, 0x1a, 0xf4, 0xab, 0x65, 0xef, 0x21, 0x2f, ++ 0xd8, 0xb8, 0xe3, 0x00, 0xbc, 0x22, 0x3e, 0xa3, 0x85, 0x0c, 0x86, 0xb0, ++ 0xfd, 0x82, 0x87, 0x8d, 0x7a, 0xb2, 0x5b, 0x2f, 0xb7, 0x3a, 0x51, 0xef, ++ 0xce, 0xa8, 0xdf, 0x21, 0xc0, 0x77, 0xfd, 0xe7, 0x8b, 0x04, 0x7f, 0x0f, ++ 0x6c, 0x6e, 0x9e, 0xc5, 0x0d, 0xf7, 0xaf, 0x87, 0xa3, 0xfc, 0x28, 0xcf, ++ 0x34, 0x3a, 0xb4, 0x67, 0xb2, 0xdf, 0x8f, 0x8b, 0xc9, 0x64, 0xeb, 0x1e, ++ 0xef, 0xe5, 0x2f, 0x43, 0xbf, 0x62, 0x97, 0xa0, 0x20, 0x9f, 0xc0, 0x77, ++ 0x35, 0xa0, 0x4e, 0xf1, 0x00, 0xdf, 0xd5, 0xd8, 0x3f, 0xec, 0xeb, 0x0a, ++ 0x0e, 0x77, 0x8c, 0xcf, 0xd4, 0xed, 0x62, 0x78, 0xaa, 0xa3, 0x78, 0x01, ++ 0x3e, 0xab, 0xa0, 0xf6, 0x2e, 0xe8, 0x91, 0xeb, 0xa9, 0xde, 0xc1, 0xfb, ++ 0xb2, 0xb6, 0x76, 0x33, 0xf4, 0xaf, 0xa1, 0xfd, 0x12, 0x51, 0xee, 0xb8, ++ 0xd0, 0xdf, 0xd5, 0xf4, 0x13, 0xdc, 0xdf, 0x15, 0xa7, 0xe8, 0xf0, 0xb6, ++ 0xe7, 0x18, 0xa3, 0xdf, 0xad, 0x82, 0x8b, 0x84, 0xc1, 0x5b, 0x0e, 0xfd, ++ 0xef, 0x7c, 0x78, 0x8b, 0x84, 0x2f, 0xcd, 0x7e, 0xb8, 0x58, 0xbc, 0x69, ++ 0xf0, 0xb0, 0x67, 0x1a, 0xf1, 0x77, 0x38, 0xaa, 0xa3, 0x72, 0x08, 0xde, ++ 0x53, 0xb1, 0xdf, 0x03, 0x22, 0x6d, 0xf1, 0x78, 0xaf, 0xf2, 0x51, 0x73, ++ 0x5f, 0xc4, 0x63, 0x6f, 0x2e, 0x67, 0x43, 0xe9, 0x1b, 0xec, 0x7d, 0xa7, ++ 0x2e, 0xbe, 0x74, 0x35, 0x6c, 0x1c, 0x3f, 0x60, 0x1f, 0x85, 0x79, 0x72, ++ 0xb8, 0x6e, 0x36, 0xb3, 0x87, 0xf4, 0xf2, 0x25, 0xd4, 0x8f, 0xae, 0x23, ++ 0x1d, 0x68, 0xd7, 0x24, 0xa7, 0xb9, 0x7f, 0x9d, 0xae, 0xcb, 0x8b, 0x9b, ++ 0xca, 0xf3, 0x57, 0xba, 0xef, 0x75, 0x83, 0xfd, 0xe6, 0x67, 0x9c, 0xa7, ++ 0x1f, 0x71, 0x94, 0xe0, 0xfd, 0x8f, 0x96, 0x57, 0x0b, 0xbf, 0x20, 0x85, ++ 0xf9, 0x60, 0xbc, 0xbe, 0x3f, 0xa3, 0xe0, 0xe8, 0x0c, 0x7a, 0xde, 0x2f, ++ 0xd6, 0x88, 0xf8, 0x9e, 0xf2, 0xb5, 0x26, 0xe7, 0x91, 0x22, 0xe0, 0xe3, ++ 0x75, 0x66, 0x02, 0x74, 0xf9, 0xc5, 0xeb, 0x66, 0x95, 0xd9, 0xa1, 0x31, ++ 0x28, 0x87, 0x67, 0xbf, 0x71, 0xdc, 0x0c, 0xa1, 0x91, 0xd9, 0x90, 0x5f, ++ 0x40, 0xfb, 0xcd, 0xbe, 0x93, 0xc9, 0xdb, 0xe3, 0x30, 0x19, 0x6d, 0xfb, ++ 0x03, 0xd5, 0x63, 0x2a, 0x7c, 0xbf, 0x84, 0xb4, 0x0c, 0x85, 0xfc, 0xfd, ++ 0xc9, 0xae, 0xf6, 0x72, 0xc8, 0xdf, 0x9e, 0x92, 0x7f, 0x78, 0x15, 0xdc, ++ 0xd3, 0x5d, 0x53, 0xaa, 0x1c, 0x39, 0x02, 0xf0, 0x5d, 0x2b, 0x12, 0x80, ++ 0xef, 0x87, 0x6b, 0x4a, 0xd1, 0x5f, 0xb9, 0xe9, 0x46, 0x01, 0xe9, 0xfa, ++ 0xdd, 0x15, 0xf8, 0x9b, 0x58, 0x64, 0xca, 0xe4, 0xac, 0x23, 0x47, 0xe8, ++ 0xba, 0x37, 0xac, 0x49, 0xc6, 0x7b, 0xb6, 0x19, 0xea, 0x81, 0x72, 0xa0, ++ 0xb7, 0xb9, 0x13, 0xed, 0x36, 0xb8, 0xa7, 0x1b, 0x97, 0x23, 0x06, 0xf3, ++ 0x7b, 0x09, 0xbc, 0x0f, 0xd5, 0xb1, 0x0a, 0xe4, 0xf7, 0x8c, 0xfa, 0x1b, ++ 0xa7, 0xc0, 0x7e, 0x6b, 0xa8, 0x5e, 0x80, 0xb8, 0x6b, 0x4d, 0xdb, 0xe1, ++ 0xf2, 0x54, 0xa8, 0x6f, 0x14, 0xf0, 0xf7, 0xd4, 0xea, 0x3c, 0x6e, 0x19, ++ 0x5e, 0x85, 0xea, 0x78, 0xf8, 0x8c, 0x0c, 0xf1, 0x8f, 0x6a, 0xda, 0x0f, ++ 0xd0, 0x53, 0xb7, 0x91, 0xf5, 0xab, 0xdb, 0x22, 0xe0, 0x7b, 0x3e, 0xd5, ++ 0x54, 0x3e, 0xc0, 0xf9, 0xaa, 0xb7, 0x08, 0x04, 0x5e, 0x28, 0xe9, 0xa0, ++ 0xf6, 0x9f, 0x95, 0xcd, 0xeb, 0x85, 0x0f, 0x34, 0x75, 0x6c, 0xa4, 0xe3, ++ 0x69, 0x7d, 0x01, 0x8c, 0x87, 0x79, 0xb7, 0xc4, 0xe3, 0xef, 0xde, 0xd5, ++ 0xbd, 0xce, 0xde, 0x13, 0xaa, 0x2e, 0x5c, 0x79, 0x10, 0xe4, 0x53, 0x35, ++ 0x1d, 0x47, 0x1f, 0x93, 0x8e, 0x2d, 0x37, 0xe2, 0x7c, 0x0b, 0x37, 0x0a, ++ 0x04, 0x52, 0x83, 0x6b, 0x0a, 0xb3, 0xee, 0x29, 0x84, 0xf9, 0x5e, 0x37, ++ 0xe3, 0xf7, 0x41, 0x8e, 0xb6, 0xff, 0x4c, 0x86, 0x7d, 0xcf, 0xa4, 0xeb, ++ 0xa5, 0xd1, 0xf9, 0xe7, 0x8a, 0x9d, 0xe5, 0x98, 0x6f, 0x7d, 0xbb, 0xa0, ++ 0xe0, 0x7b, 0x4d, 0x65, 0xb7, 0x21, 0x1f, 0x74, 0x71, 0x3e, 0x20, 0x49, ++ 0xb7, 0xb2, 0xfb, 0x66, 0x81, 0xd7, 0xb9, 0x5d, 0xa8, 0xe9, 0xc7, 0xc7, ++ 0x32, 0xb3, 0x91, 0xbe, 0xab, 0x6f, 0x59, 0xd9, 0x04, 0xe7, 0xea, 0xf4, ++ 0x24, 0x67, 0x81, 0x4b, 0x54, 0xb7, 0xeb, 0x8c, 0x0c, 0x76, 0xde, 0x47, ++ 0x2b, 0xe0, 0x03, 0x34, 0x14, 0x6f, 0x3c, 0x0f, 0x6e, 0xbf, 0xe7, 0xb8, ++ 0xdc, 0xa9, 0x93, 0x53, 0xbe, 0xcc, 0xbe, 0x48, 0x8f, 0xf3, 0x76, 0x15, ++ 0x23, 0x9f, 0xcf, 0x27, 0x55, 0x78, 0x2f, 0xee, 0x5e, 0xc9, 0xf4, 0xf2, ++ 0xb1, 0x55, 0x51, 0x5e, 0x01, 0xec, 0x11, 0xb3, 0x82, 0x7a, 0x73, 0xff, ++ 0xaa, 0x1f, 0x3d, 0x04, 0xe7, 0x3f, 0xfd, 0x94, 0x19, 0xef, 0x4b, 0x4f, ++ 0x67, 0x74, 0x62, 0x7c, 0xf6, 0xc4, 0x46, 0x33, 0x7e, 0x3f, 0xa4, 0x61, ++ 0xa3, 0x88, 0x72, 0xe4, 0xc4, 0x76, 0x16, 0x17, 0x12, 0x1f, 0x99, 0x52, ++ 0x91, 0x06, 0xf0, 0xa3, 0x72, 0x00, 0xe8, 0x6e, 0xff, 0xc6, 0x52, 0x19, ++ 0xe4, 0xe1, 0x09, 0xaf, 0x80, 0xe3, 0x4b, 0x1f, 0xb9, 0x39, 0x85, 0xc5, ++ 0x7d, 0x8d, 0xf2, 0xa3, 0xda, 0xb9, 0x08, 0xe5, 0xc5, 0x23, 0x51, 0x4c, ++ 0x3e, 0x2c, 0x78, 0x38, 0xfc, 0xfd, 0x6a, 0x44, 0x79, 0xb1, 0xbc, 0x82, ++ 0xc9, 0xf7, 0x10, 0x79, 0xb0, 0x34, 0xbd, 0x09, 0xe3, 0x7e, 0xa1, 0x72, ++ 0xa2, 0x8e, 0xd8, 0x34, 0xf9, 0x90, 0x07, 0xf5, 0x0e, 0x5f, 0x1a, 0xd2, ++ 0x6f, 0xed, 0xeb, 0x66, 0x02, 0xf6, 0x5d, 0xad, 0xa4, 0xcc, 0x7c, 0x18, ++ 0xe8, 0x66, 0x46, 0x14, 0xdc, 0x24, 0x53, 0xbe, 0xf0, 0x1d, 0x00, 0xf9, ++ 0xf6, 0x85, 0x57, 0x70, 0x7a, 0xe8, 0xf3, 0xeb, 0x67, 0x3d, 0x3f, 0x14, ++ 0xe0, 0xf7, 0x31, 0xc0, 0x1b, 0xf8, 0x62, 0x43, 0x22, 0xde, 0xaf, 0x56, ++ 0x7b, 0x67, 0x23, 0x5c, 0xb5, 0x7c, 0xc4, 0x05, 0x0f, 0x1b, 0xe9, 0x59, ++ 0xcb, 0x7b, 0x9a, 0xee, 0x16, 0x83, 0xef, 0xfb, 0xd0, 0xff, 0x5d, 0x5f, ++ 0x13, 0x43, 0x54, 0x5d, 0xbf, 0xa3, 0x77, 0x52, 0xba, 0xa4, 0xeb, 0xcd, ++ 0xda, 0x25, 0x78, 0xe1, 0x3b, 0x48, 0x47, 0xef, 0x3c, 0x76, 0xf0, 0xe6, ++ 0x7c, 0xac, 0x2b, 0x40, 0x87, 0xb5, 0xb7, 0x70, 0xbd, 0xba, 0xc1, 0x8e, ++ 0x74, 0x7b, 0xf4, 0xd6, 0x33, 0xab, 0x80, 0x2e, 0x67, 0xde, 0x21, 0xe0, ++ 0xfe, 0x89, 0xc7, 0xdd, 0x04, 0x7a, 0xa5, 0xf6, 0x61, 0xc1, 0x09, 0x71, ++ 0xcd, 0x05, 0x77, 0xb0, 0xf1, 0x0b, 0xe8, 0x78, 0xa0, 0x97, 0xa3, 0x3f, ++ 0x63, 0xf4, 0x43, 0xe9, 0xd8, 0x09, 0x74, 0x5e, 0xbb, 0xf1, 0xbe, 0x83, ++ 0xd8, 0x7f, 0x8b, 0xe0, 0x84, 0xf9, 0x8f, 0x6e, 0x9a, 0x8d, 0x7a, 0xb8, ++ 0xc6, 0x23, 0x12, 0x7c, 0xbe, 0xe5, 0x18, 0xda, 0xcb, 0x54, 0x1f, 0x60, ++ 0xde, 0xd0, 0x7e, 0x8f, 0x98, 0x02, 0x74, 0x5e, 0xdb, 0x68, 0x51, 0x00, ++ 0xaf, 0x1a, 0xbd, 0x68, 0xf4, 0x77, 0x8c, 0x7f, 0x87, 0x9a, 0x58, 0x5d, ++ 0x83, 0xae, 0xa1, 0xe3, 0x6e, 0xcc, 0x74, 0x86, 0xa5, 0x3b, 0x71, 0x5a, ++ 0x16, 0xd2, 0x57, 0xdd, 0x76, 0x33, 0xd2, 0x4b, 0x9d, 0x87, 0xd1, 0xd3, ++ 0xb1, 0xa7, 0x44, 0xa4, 0xc3, 0xfd, 0xab, 0xae, 0xad, 0x00, 0xfa, 0x39, ++ 0xbd, 0x55, 0x88, 0x40, 0x7f, 0x94, 0xbe, 0xf2, 0x83, 0xf4, 0x25, 0x3e, ++ 0x62, 0xc6, 0xf1, 0x0b, 0x9e, 0x64, 0xf1, 0x85, 0xfd, 0x1b, 0x19, 0x5d, ++ 0x9f, 0x68, 0x65, 0xf6, 0x69, 0xe9, 0x23, 0xfd, 0xd1, 0xaf, 0x59, 0xf0, ++ 0x86, 0x99, 0xb0, 0xf8, 0x03, 0xb1, 0xe9, 0xed, 0x8f, 0x0b, 0xd1, 0x61, ++ 0x28, 0xdd, 0xf5, 0xd0, 0x4b, 0x9c, 0x0e, 0x23, 0xd1, 0x9d, 0xdb, 0xdc, ++ 0x32, 0x15, 0xf2, 0x0f, 0x66, 0x3f, 0x4d, 0xf7, 0xef, 0x0c, 0xc2, 0xab, ++ 0xb4, 0xe9, 0x56, 0x8c, 0x03, 0x94, 0x36, 0x4d, 0xc7, 0xf3, 0x6a, 0xfc, ++ 0x53, 0x2d, 0xb1, 0xbc, 0x8d, 0x79, 0xcd, 0x2b, 0x59, 0x3e, 0xa3, 0xc4, ++ 0xf2, 0x7b, 0xbe, 0xf3, 0xbe, 0x42, 0xf6, 0x71, 0x5f, 0x50, 0x3f, 0xe6, ++ 0x81, 0x7e, 0x84, 0xfc, 0x13, 0x1f, 0xdd, 0xc7, 0xcb, 0xdb, 0x1f, 0x43, ++ 0x3b, 0xe0, 0xf3, 0x5f, 0x1d, 0xc3, 0xfc, 0xc6, 0xc5, 0x2f, 0x50, 0xfc, ++ 0xd3, 0xfe, 0xa7, 0xb7, 0xdb, 0x89, 0x0f, 0xed, 0x6c, 0x2f, 0xca, 0x99, ++ 0x45, 0xad, 0x22, 0xe6, 0x97, 0x12, 0xc9, 0x57, 0x70, 0x8d, 0xee, 0x7d, ++ 0x0d, 0x2d, 0x2f, 0x63, 0xf1, 0x6f, 0xec, 0x08, 0xf7, 0x45, 0x3b, 0x2d, ++ 0xde, 0x4a, 0x3a, 0x7e, 0xd1, 0xb3, 0xc7, 0x07, 0xe1, 0x3d, 0xf9, 0x5d, ++ 0xcc, 0x4e, 0xf5, 0xfc, 0x8a, 0x7d, 0x6f, 0x86, 0x78, 0x3a, 0x07, 0x5d, ++ 0x03, 0xf9, 0x99, 0x12, 0xcb, 0x0f, 0x09, 0xd5, 0xbf, 0xd1, 0x7d, 0x58, ++ 0x1c, 0xe7, 0xd4, 0xf3, 0x31, 0xf8, 0x5d, 0x26, 0x61, 0x5b, 0x3b, 0xde, ++ 0x33, 0x2d, 0x6a, 0xb9, 0xd6, 0x6c, 0xd1, 0xc5, 0x2d, 0x85, 0x3e, 0x66, ++ 0xad, 0x1f, 0xde, 0xdf, 0x78, 0x28, 0xfe, 0xe1, 0x7e, 0x11, 0xf6, 0xa7, ++ 0xff, 0x5d, 0x09, 0x2d, 0x2f, 0xe4, 0xd4, 0x93, 0x8c, 0x7f, 0x16, 0xed, ++ 0x32, 0xa3, 0x7d, 0xb4, 0x68, 0xdb, 0x26, 0x8c, 0xf7, 0xd5, 0x6d, 0x3b, ++ 0x83, 0xf9, 0xb3, 0xa5, 0xbf, 0x79, 0x2a, 0x16, 0xe0, 0x50, 0xb7, 0x4b, ++ 0x34, 0xe6, 0x4f, 0x6d, 0x13, 0x7d, 0x16, 0xcc, 0xf3, 0x12, 0x8f, 0x59, ++ 0xd8, 0xf7, 0x39, 0x0c, 0x79, 0x4c, 0xb5, 0xad, 0xec, 0xfd, 0x8e, 0xda, ++ 0x16, 0x9e, 0x27, 0x14, 0x92, 0x3f, 0xb3, 0xf8, 0x37, 0x7b, 0x9e, 0xf5, ++ 0x50, 0xd0, 0x2c, 0x7e, 0xe6, 0x89, 0x58, 0xe0, 0xa7, 0x4f, 0x3b, 0xb6, ++ 0xc6, 0x02, 0x3c, 0xe9, 0x7c, 0x98, 0x7f, 0x34, 0xb1, 0x30, 0x42, 0x7e, ++ 0xd2, 0x85, 0xf2, 0x92, 0x5a, 0xd6, 0xf2, 0xbc, 0xa4, 0xf1, 0xf8, 0x7b, ++ 0x1d, 0xa1, 0x79, 0x49, 0x9f, 0xc2, 0x3f, 0xa8, 0x1e, 0x77, 0xf5, 0x31, ++ 0xe6, 0x79, 0x92, 0x6d, 0x4c, 0x6e, 0x51, 0xec, 0x17, 0x84, 0x7b, 0x1f, ++ 0x49, 0xb3, 0x5f, 0x16, 0x3f, 0xf5, 0xd5, 0xa3, 0x90, 0x47, 0x7b, 0x6a, ++ 0xe7, 0x67, 0x8f, 0xc2, 0xfe, 0x97, 0xfc, 0xe3, 0x8b, 0x47, 0x21, 0xaf, ++ 0x83, 0xec, 0x8d, 0x52, 0xc0, 0x9e, 0xa8, 0xfb, 0xd5, 0x3b, 0x98, 0x7f, ++ 0xa8, 0x8d, 0x1b, 0xdb, 0x87, 0xfb, 0x47, 0x4f, 0x3e, 0x81, 0xf9, 0x9b, ++ 0xa7, 0xdf, 0xb3, 0xa0, 0x5d, 0x78, 0x7a, 0xcf, 0x89, 0x4c, 0xb0, 0x17, ++ 0x4e, 0xef, 0xf8, 0x26, 0x05, 0xf2, 0x32, 0x97, 0xef, 0x29, 0xc7, 0xf8, ++ 0xc4, 0xf2, 0xdf, 0x96, 0xe2, 0x7b, 0xa2, 0x91, 0xfc, 0x4d, 0xa0, 0x4f, ++ 0xef, 0x45, 0xe4, 0x8f, 0x86, 0xe2, 0x63, 0x7f, 0xab, 0xe8, 0xb3, 0xd1, ++ 0x7d, 0x7e, 0xfe, 0xae, 0x05, 0xf9, 0xbf, 0x3b, 0xcf, 0xac, 0x65, 0x29, ++ 0xcb, 0xdf, 0x73, 0xf2, 0xfc, 0xb2, 0xed, 0xe1, 0xf3, 0x74, 0xb5, 0x7c, ++ 0xa8, 0xda, 0xd6, 0x6b, 0x26, 0x8e, 0x04, 0x79, 0xd7, 0xca, 0xf4, 0x7a, ++ 0x77, 0x7e, 0xd4, 0x85, 0xf2, 0xca, 0xde, 0xa6, 0x78, 0xbd, 0xfc, 0x22, ++ 0xf0, 0xb7, 0x9d, 0xe7, 0x0f, 0xb6, 0x8c, 0x0f, 0x9b, 0x57, 0xf6, 0x39, ++ 0xfc, 0x83, 0xe2, 0xa9, 0xa6, 0x8f, 0x31, 0xaf, 0xec, 0xab, 0xd6, 0xf9, ++ 0xbf, 0xfc, 0x39, 0x3c, 0x6b, 0x0d, 0xff, 0xbe, 0xb6, 0xc6, 0xd7, 0x17, ++ 0x82, 0x9b, 0x96, 0x07, 0x3c, 0xb4, 0x8f, 0x7a, 0x53, 0x1f, 0xe0, 0x8f, ++ 0x9d, 0xbf, 0xc6, 0x3c, 0x3e, 0xc0, 0x5b, 0xa5, 0x13, 0xf4, 0xff, 0x57, ++ 0x99, 0x10, 0xdf, 0x3c, 0x69, 0xf6, 0x63, 0xdc, 0xd0, 0xbf, 0xc7, 0xa2, ++ 0x40, 0xbe, 0xd7, 0xa2, 0x3d, 0x47, 0x91, 0x5f, 0x4e, 0xff, 0xf6, 0x30, ++ 0xe6, 0xd9, 0x12, 0x9e, 0x8f, 0x7b, 0x9a, 0x74, 0xff, 0xb1, 0xbc, 0x49, ++ 0x1e, 0xbb, 0xa8, 0xdb, 0x62, 0x67, 0xf9, 0x68, 0x1c, 0xfe, 0x90, 0xaf, ++ 0xe6, 0x8c, 0xc5, 0x76, 0x9e, 0x97, 0xc6, 0xe8, 0x58, 0xcb, 0x57, 0x8b, ++ 0x94, 0xa7, 0xf6, 0x64, 0x9f, 0x6c, 0x66, 0x5f, 0xf3, 0xfc, 0xe4, 0xa5, ++ 0xce, 0x0e, 0x59, 0xb1, 0x05, 0xf1, 0x05, 0xf8, 0x11, 0x0a, 0x01, 0x5f, ++ 0xc7, 0x0c, 0xf9, 0x7f, 0xda, 0xb9, 0x43, 0xe7, 0x53, 0x00, 0x0e, 0x57, ++ 0xe8, 0xf3, 0x2f, 0x23, 0xe5, 0x03, 0x72, 0x3b, 0xbd, 0x07, 0xbe, 0x98, ++ 0x5c, 0x3e, 0xbd, 0x89, 0xe7, 0x63, 0x76, 0xe7, 0x59, 0x12, 0x92, 0x9e, ++ 0x07, 0xf9, 0x41, 0x4c, 0x1f, 0xd6, 0x79, 0x85, 0xa3, 0xe1, 0xf0, 0xab, ++ 0xe5, 0x5f, 0x6e, 0x09, 0xc1, 0xaf, 0x76, 0xbe, 0x48, 0x7c, 0xa1, 0xf1, ++ 0xe7, 0x85, 0xf7, 0xfd, 0xcf, 0xc1, 0xe5, 0xa1, 0x3e, 0xec, 0x7d, 0x00, ++ 0x0d, 0x3e, 0xa7, 0xbe, 0x0d, 0x2f, 0xa7, 0x5f, 0xe4, 0xfc, 0x4e, 0xfd, ++ 0x96, 0xbd, 0x7d, 0x74, 0xef, 0xbd, 0xcc, 0xe2, 0x7e, 0x8b, 0x96, 0x77, ++ 0xa6, 0xed, 0xb7, 0xa9, 0x85, 0xe9, 0xe5, 0x53, 0xdb, 0x98, 0xdd, 0x18, ++ 0xca, 0xdf, 0xb5, 0x11, 0x7e, 0x57, 0xeb, 0x0d, 0xbe, 0x4e, 0xed, 0xae, ++ 0xf6, 0x41, 0x20, 0x87, 0x4e, 0xed, 0x7b, 0x9e, 0xd3, 0x9d, 0x97, 0xbf, ++ 0x87, 0x73, 0x4c, 0xf6, 0x70, 0xb9, 0xed, 0xd5, 0xcb, 0xed, 0x08, 0xbf, ++ 0x63, 0x76, 0xb4, 0x0f, 0xf3, 0x17, 0xa9, 0xbf, 0x1b, 0x76, 0xbe, 0xba, ++ 0xed, 0x67, 0xc2, 0xce, 0xf7, 0xa9, 0xa4, 0x5e, 0x0b, 0xfb, 0xff, 0xb4, ++ 0x83, 0xd9, 0x21, 0x9f, 0xb6, 0x88, 0x61, 0x7f, 0x0f, 0xa1, 0xbd, 0x8f, ++ 0xf1, 0x7d, 0xd5, 0x26, 0xbb, 0x8c, 0x7e, 0x97, 0x18, 0x1b, 0x8d, 0xf2, ++ 0x68, 0xb9, 0xbd, 0xf0, 0x5d, 0xf8, 0xbe, 0xdb, 0x72, 0xbb, 0x8c, 0xf9, ++ 0x0e, 0x0d, 0x2b, 0x79, 0x7e, 0xc4, 0x9d, 0x2e, 0xfc, 0x3d, 0x8f, 0x06, ++ 0xfb, 0x58, 0xfc, 0x1d, 0x88, 0x55, 0x00, 0x1f, 0x9d, 0x1f, 0x6a, 0x56, ++ 0xdc, 0xf8, 0xfb, 0x13, 0x66, 0x47, 0x55, 0x3e, 0xf8, 0x57, 0xa1, 0xef, ++ 0x77, 0xca, 0x49, 0x26, 0xe2, 0xd5, 0xe3, 0x5f, 0xf2, 0xa4, 0xe3, 0xf7, ++ 0xbb, 0xb2, 0xbf, 0x96, 0x40, 0xef, 0x74, 0xac, 0x30, 0xbe, 0x37, 0xd2, ++ 0x21, 0x29, 0x07, 0x12, 0xe9, 0x7c, 0x1d, 0x65, 0x82, 0x0b, 0xec, 0xdd, ++ 0x9e, 0x74, 0x66, 0x9c, 0xff, 0x6a, 0x55, 0x34, 0xc4, 0xcf, 0x20, 0x56, ++ 0x0d, 0xe7, 0x3a, 0xeb, 0x62, 0xdf, 0x45, 0xb3, 0x9b, 0x7c, 0x0a, 0xed, ++ 0x42, 0xec, 0x51, 0x1d, 0x0e, 0x74, 0xf4, 0x9c, 0xec, 0x77, 0xab, 0xe1, ++ 0xe7, 0xba, 0xe0, 0x3e, 0x7c, 0xdd, 0x0a, 0x6b, 0x3f, 0x78, 0x8f, 0xeb, ++ 0xff, 0x02, 0x2f, 0xb6, 0xd5, 0x84, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, ++ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xb5, 0x7d, ++ 0x09, 0x7c, 0x54, 0xd5, 0xb9, 0xf8, 0xb9, 0x73, 0xef, 0x4c, 0x26, 0xcb, ++ 0x24, 0x93, 0x65, 0x60, 0x20, 0x2c, 0x37, 0xfb, 0x1e, 0x26, 0x10, 0x12, ++ 0xd0, 0x58, 0x26, 0x1b, 0x06, 0x09, 0x38, 0x22, 0x55, 0xd4, 0x80, 0x37, ++ 0x6c, 0x61, 0x0b, 0x89, 0x68, 0x6d, 0x6c, 0xfd, 0x97, 0x61, 0x31, 0x45, ++ 0xe5, 0xb5, 0xa1, 0x2e, 0x50, 0xa5, 0xcf, 0x01, 0xc1, 0xc7, 0xa3, 0xf8, ++ 0x1a, 0x16, 0x6b, 0xac, 0x51, 0x07, 0x08, 0x14, 0x2d, 0xda, 0xd0, 0xe2, ++ 0x93, 0xfa, 0x57, 0x1b, 0x94, 0x2a, 0x28, 0x98, 0x11, 0x94, 0xf2, 0x5a, ++ 0x2c, 0xff, 0xf3, 0x7d, 0xe7, 0x9c, 0xcc, 0xdc, 0x9b, 0x09, 0x84, 0xbe, ++ 0xfe, 0xa3, 0xfe, 0xae, 0xe7, 0xde, 0xb3, 0x7e, 0xfb, 0xf7, 0x9d, 0xef, ++ 0x9c, 0x89, 0x25, 0x2e, 0x89, 0xc8, 0x84, 0xd8, 0x5c, 0x8a, 0xb7, 0x27, ++ 0x9b, 0xe0, 0xdf, 0x15, 0xfa, 0x5f, 0x1c, 0xa1, 0x65, 0x2b, 0x2f, 0xa7, ++ 0xe0, 0xe3, 0x78, 0x7a, 0x09, 0x21, 0x31, 0xec, 0x15, 0xfd, 0x6e, 0xdf, ++ 0x6f, 0x92, 0x08, 0x89, 0xca, 0x26, 0xd9, 0x4a, 0x31, 0x21, 0x76, 0x12, ++ 0xe5, 0x92, 0x69, 0xf9, 0x89, 0x58, 0xf7, 0x61, 0x29, 0x96, 0x90, 0xf5, ++ 0x36, 0xad, 0x96, 0xd0, 0xe7, 0x15, 0xf8, 0x9b, 0xd4, 0xff, 0x49, 0x5c, ++ 0xca, 0x29, 0x18, 0xcf, 0x4a, 0xff, 0xb9, 0x92, 0x4a, 0xfb, 0x9b, 0x40, ++ 0xcb, 0xd6, 0xe0, 0xf8, 0xf1, 0x6e, 0x7d, 0x39, 0x91, 0x84, 0x94, 0x71, ++ 0x3e, 0x6e, 0x42, 0x86, 0xc0, 0x7b, 0xfa, 0xa7, 0x12, 0x32, 0x59, 0xa6, ++ 0x33, 0xa3, 0xf3, 0x88, 0xaf, 0x36, 0xf9, 0x22, 0x24, 0xfc, 0x5e, 0x9b, ++ 0x31, 0x24, 0x38, 0xdf, 0x78, 0x07, 0x71, 0xf9, 0xe1, 0xfb, 0xb4, 0x18, ++ 0x97, 0x97, 0xd6, 0x8f, 0x89, 0x61, 0xf3, 0x13, 0xf3, 0xa5, 0xf3, 0xf9, ++ 0x18, 0xe6, 0xa3, 0xd2, 0x7f, 0x70, 0x3e, 0xf9, 0x3d, 0x5e, 0x13, 0xc1, ++ 0x79, 0x7d, 0x1c, 0x3a, 0x0f, 0xfa, 0x27, 0x79, 0x6c, 0x38, 0xbf, 0x8f, ++ 0x0d, 0xf3, 0xfb, 0x38, 0x74, 0x7e, 0x05, 0xaa, 0x2d, 0xe9, 0xd3, 0x68, ++ 0x5a, 0x50, 0x88, 0x72, 0x85, 0xc2, 0x37, 0xc6, 0xda, 0x4d, 0x38, 0x9c, ++ 0xcf, 0x87, 0xc2, 0x99, 0x10, 0x2f, 0x51, 0x4a, 0x00, 0x9e, 0x02, 0xae, ++ 0xf4, 0x3b, 0xed, 0x27, 0x45, 0x7a, 0x52, 0xb9, 0x22, 0x01, 0x5c, 0xed, ++ 0x12, 0x49, 0xc3, 0xf1, 0x0c, 0xed, 0x46, 0xd8, 0xb1, 0x7f, 0x28, 0xd3, ++ 0x7e, 0xc7, 0xc0, 0x9a, 0x27, 0x12, 0x52, 0xe6, 0x94, 0xdc, 0xa7, 0xc6, ++ 0xd1, 0xff, 0xef, 0x4c, 0x22, 0x64, 0x18, 0x21, 0xa9, 0x2d, 0x95, 0xe4, ++ 0x13, 0x5a, 0x96, 0xda, 0x08, 0xc2, 0x27, 0x7d, 0x3d, 0xf1, 0x45, 0xd0, ++ 0xf9, 0xa5, 0x07, 0x4c, 0x58, 0x26, 0x6b, 0xa3, 0x7c, 0x19, 0xb4, 0x6d, ++ 0x84, 0x95, 0x78, 0x23, 0xc7, 0xd2, 0x7a, 0x0a, 0xf1, 0x9a, 0xc7, 0x42, ++ 0xaf, 0x3e, 0x42, 0xc6, 0x23, 0x70, 0x57, 0x9b, 0x68, 0x57, 0xca, 0x3a, ++ 0x42, 0x1e, 0xa3, 0xed, 0x3a, 0x03, 0x15, 0xa6, 0x05, 0x14, 0xa8, 0xed, ++ 0xf0, 0x89, 0xf6, 0x3f, 0x51, 0x75, 0x4f, 0x51, 0x69, 0xbd, 0xd6, 0xdb, ++ 0x34, 0xa7, 0xa9, 0x08, 0x96, 0x93, 0xd7, 0xd6, 0x55, 0x46, 0x08, 0x1d, ++ 0x2e, 0x47, 0x72, 0x11, 0x62, 0x5a, 0x95, 0xdb, 0x7d, 0x64, 0x24, 0x21, ++ 0x49, 0x50, 0xff, 0x06, 0xf8, 0x9e, 0xdb, 0xed, 0x8e, 0xc1, 0xef, 0xac, ++ 0x4c, 0x88, 0x9f, 0xd0, 0x75, 0xb5, 0x45, 0xf5, 0x95, 0xdd, 0x56, 0x27, ++ 0x2d, 0xa7, 0xb2, 0xf2, 0x9d, 0xbe, 0xdc, 0xb6, 0x75, 0xb4, 0xbf, 0x0f, ++ 0xd2, 0x3d, 0x77, 0xaa, 0x0e, 0xfa, 0xce, 0x6a, 0xcf, 0x05, 0xf8, 0x13, ++ 0x7f, 0x02, 0xae, 0x77, 0x40, 0xfa, 0xa2, 0x70, 0x25, 0x8e, 0xe0, 0x3c, ++ 0xb3, 0xb7, 0xf9, 0x2b, 0xa3, 0xe8, 0x24, 0x6e, 0x09, 0x50, 0x80, 0x52, ++ 0xfc, 0x67, 0xd0, 0x3e, 0xba, 0xf3, 0x01, 0x3f, 0xdd, 0x16, 0x20, 0x92, ++ 0xed, 0x31, 0xa2, 0xec, 0xb7, 0x10, 0xfa, 0xf4, 0xec, 0x3b, 0x66, 0xe9, ++ 0xa1, 0xcf, 0xc6, 0xf6, 0x63, 0xf8, 0xdd, 0x04, 0x65, 0xfa, 0x1c, 0x9d, ++ 0xe8, 0xaf, 0x4c, 0xa6, 0xeb, 0x7c, 0x50, 0xbd, 0xd1, 0xe3, 0xcc, 0xa1, ++ 0xfd, 0xed, 0xab, 0x77, 0x9a, 0xec, 0x84, 0xac, 0x54, 0x6f, 0xec, 0x56, ++ 0x1c, 0xa1, 0x70, 0x98, 0xa4, 0x83, 0x83, 0xb2, 0xfa, 0x26, 0x03, 0x1c, ++ 0x6e, 0xba, 0x2e, 0x38, 0xac, 0xf4, 0xdd, 0x84, 0x70, 0x18, 0xec, 0xba, ++ 0xcf, 0xa9, 0x9e, 0x1f, 0x01, 0x5e, 0xa6, 0x96, 0x9b, 0x88, 0x44, 0x07, ++ 0x2d, 0x3d, 0x11, 0xe3, 0x93, 0x18, 0x1f, 0x47, 0x7a, 0x0a, 0x82, 0xfd, ++ 0x6c, 0x31, 0x91, 0x45, 0xed, 0x31, 0xe1, 0xfa, 0x59, 0xc5, 0xf0, 0xcf, ++ 0xeb, 0x09, 0x3a, 0x1a, 0x88, 0x4e, 0xd2, 0x88, 0x3d, 0x17, 0xe8, 0xd4, ++ 0x48, 0x2f, 0x74, 0x7d, 0x35, 0xed, 0x14, 0x8e, 0x53, 0xb5, 0x7a, 0x4f, ++ 0x55, 0x62, 0x90, 0x4e, 0x89, 0x5d, 0x1b, 0x37, 0xa3, 0x00, 0xe6, 0x39, ++ 0xf7, 0x49, 0x98, 0xa7, 0x18, 0x77, 0x6a, 0xf9, 0x0a, 0x39, 0x95, 0xce, ++ 0xe7, 0x49, 0x8a, 0x23, 0xe8, 0xd7, 0xd1, 0xe2, 0x8d, 0xcc, 0xa4, 0x74, ++ 0xea, 0x70, 0x9b, 0x5c, 0xc0, 0xe7, 0xe7, 0x54, 0xed, 0xe7, 0x50, 0x3f, ++ 0x76, 0x56, 0xc0, 0x6f, 0xa6, 0x55, 0x4a, 0x89, 0x76, 0xbf, 0x94, 0x16, ++ 0xec, 0x5f, 0xd0, 0x7d, 0xeb, 0x6b, 0x32, 0xd2, 0x77, 0x6b, 0xbd, 0xc9, ++ 0xb7, 0x1a, 0xe5, 0x41, 0x8f, 0x04, 0xeb, 0x0e, 0xe2, 0xbd, 0xc7, 0x80, ++ 0xf7, 0x00, 0xc3, 0x7b, 0xc7, 0x49, 0xc4, 0xfb, 0xf2, 0xce, 0x93, 0x0c, ++ 0xef, 0x1d, 0xab, 0x2a, 0xa2, 0x8a, 0xa1, 0x2c, 0xd9, 0x23, 0x54, 0x58, ++ 0x4f, 0xa0, 0x08, 0xf0, 0xf9, 0x2b, 0xdf, 0x9d, 0x1e, 0x85, 0xe2, 0x73, ++ 0x74, 0x74, 0xa0, 0x15, 0xe8, 0xc1, 0x4c, 0xbe, 0xeb, 0xa9, 0xcd, 0x41, ++ 0xb8, 0xbf, 0x08, 0x74, 0xda, 0x0f, 0xee, 0x7c, 0x5e, 0x02, 0xfe, 0x03, ++ 0xe1, 0xad, 0xed, 0x48, 0xea, 0xe3, 0xf9, 0xb4, 0xaa, 0xf7, 0xa8, 0xc9, ++ 0x95, 0xa1, 0x06, 0xe1, 0x25, 0xea, 0x1d, 0x57, 0x2d, 0x58, 0x6f, 0x63, ++ 0xaa, 0xf6, 0x1b, 0x18, 0xa7, 0x69, 0x42, 0xcf, 0x61, 0xba, 0x52, 0xb2, ++ 0xe7, 0xc8, 0x1f, 0x62, 0x35, 0x3a, 0xdf, 0xd8, 0xa3, 0x33, 0xf6, 0x43, ++ 0xfb, 0xd8, 0x99, 0x14, 0x13, 0x6a, 0x70, 0xdc, 0xb6, 0xa3, 0xab, 0x2b, ++ 0x80, 0xfe, 0xdb, 0x80, 0xfe, 0x51, 0xce, 0x04, 0xbc, 0xf6, 0x98, 0xab, ++ 0xc1, 0x83, 0xf1, 0x45, 0x1f, 0x3c, 0xf6, 0x9d, 0x44, 0xf8, 0x98, 0xa0, ++ 0x4c, 0xdf, 0xef, 0xb4, 0x30, 0xba, 0x29, 0xeb, 0x90, 0xdc, 0x3e, 0xe0, ++ 0x8b, 0x68, 0x72, 0xaf, 0x87, 0x3e, 0xdf, 0x56, 0x4d, 0x38, 0xbf, 0x93, ++ 0xaa, 0xcc, 0x9f, 0x12, 0xc3, 0xe3, 0xd1, 0x03, 0xb2, 0x4a, 0xdb, 0x97, ++ 0xad, 0x35, 0x61, 0x7d, 0x07, 0x3c, 0xf3, 0x43, 0xd7, 0xbf, 0x16, 0xeb, ++ 0x9d, 0x54, 0x15, 0x2e, 0x77, 0x18, 0x3c, 0x04, 0x5e, 0x05, 0x1d, 0x51, ++ 0xc2, 0x89, 0xbe, 0x8d, 0xce, 0x79, 0x78, 0x96, 0xf6, 0x3e, 0xac, 0x3f, ++ 0x48, 0x37, 0x09, 0xd1, 0xa9, 0xf4, 0x7b, 0x69, 0xd7, 0xdc, 0xfb, 0x49, ++ 0x6a, 0xb0, 0xdd, 0x4f, 0x56, 0x12, 0xcf, 0x7c, 0x73, 0xb0, 0x1e, 0xa5, ++ 0x9f, 0x97, 0x75, 0xf4, 0x56, 0x60, 0x8e, 0x04, 0xb8, 0xf5, 0xd1, 0x0f, ++ 0xa5, 0x4b, 0x90, 0x2f, 0x46, 0xfc, 0xd0, 0x76, 0xa7, 0x19, 0x3f, 0x25, ++ 0x44, 0xab, 0xb4, 0xfe, 0xee, 0xae, 0x15, 0xb2, 0x96, 0x3f, 0x78, 0xbc, ++ 0x96, 0x44, 0x90, 0x66, 0x98, 0x7f, 0x49, 0x34, 0x69, 0xde, 0x43, 0xdb, ++ 0x97, 0xc4, 0xd1, 0x27, 0x94, 0x13, 0x79, 0x79, 0x28, 0x2f, 0x27, 0xf3, ++ 0xe7, 0x68, 0xfe, 0x3e, 0x8f, 0x95, 0xd3, 0x3e, 0x70, 0x99, 0x24, 0x5a, ++ 0xde, 0x02, 0x70, 0x07, 0x3c, 0xa4, 0x98, 0x18, 0x9c, 0x14, 0x7b, 0x2e, ++ 0xf0, 0x91, 0x29, 0x85, 0xc1, 0xb9, 0xcc, 0x19, 0x8d, 0xf2, 0x5f, 0xf0, ++ 0xab, 0x42, 0xc1, 0x19, 0x97, 0x00, 0x6a, 0x88, 0x78, 0xe1, 0x99, 0x1a, ++ 0x48, 0x35, 0x01, 0x1e, 0x05, 0xff, 0x2a, 0x01, 0x93, 0xdf, 0x46, 0xf5, ++ 0x5f, 0xaa, 0xa2, 0x9a, 0x5c, 0xf4, 0xfd, 0x5b, 0x2b, 0x35, 0x4f, 0x55, ++ 0xc6, 0xc0, 0xf2, 0xe5, 0x96, 0x1c, 0xd9, 0xe3, 0x0b, 0x23, 0x2f, 0xe2, ++ 0x52, 0x18, 0xde, 0xa9, 0x80, 0xf6, 0x9e, 0xca, 0x06, 0xed, 0x2c, 0x91, ++ 0x38, 0x20, 0x81, 0x61, 0x5a, 0x5c, 0x0a, 0x9d, 0x57, 0xa3, 0xb5, 0xe7, ++ 0x27, 0x33, 0xe8, 0xd7, 0xe5, 0x39, 0x17, 0x2c, 0x80, 0x9f, 0xd5, 0xd1, ++ 0xcb, 0x6f, 0xd4, 0xf2, 0x07, 0x1e, 0xc7, 0x38, 0x8f, 0xb7, 0x2e, 0xff, ++ 0x36, 0x1a, 0xe8, 0xab, 0xf3, 0x52, 0x44, 0x4d, 0x38, 0x79, 0x55, 0x03, ++ 0xeb, 0xa7, 0xe3, 0x1f, 0x59, 0x39, 0x0b, 0xdb, 0x3d, 0x1a, 0x15, 0x5b, ++ 0xc8, 0x95, 0x2a, 0xda, 0x2d, 0xdf, 0x41, 0xd1, 0x44, 0x9f, 0xe9, 0x4b, ++ 0x6a, 0x49, 0x21, 0xe0, 0xc3, 0xab, 0x24, 0x80, 0xfe, 0x8b, 0x96, 0x5c, ++ 0xdb, 0x09, 0xe2, 0x85, 0xe9, 0xc3, 0xa1, 0x29, 0xbe, 0xed, 0x29, 0x80, ++ 0x1f, 0x5f, 0x2d, 0x96, 0xf3, 0xd2, 0xc8, 0x76, 0x09, 0xf0, 0xa4, 0xad, ++ 0xb1, 0x41, 0x59, 0x4e, 0xc1, 0xfa, 0x14, 0x72, 0xc2, 0x3e, 0x92, 0xae, ++ 0x44, 0x60, 0xdf, 0xaa, 0x42, 0xed, 0x0d, 0x44, 0x79, 0x2a, 0xe0, 0xb3, ++ 0xf9, 0xa0, 0x0d, 0x84, 0x7d, 0x04, 0xad, 0xaf, 0xc2, 0x7b, 0xbd, 0x3d, ++ 0x45, 0xe7, 0xb7, 0x95, 0x8c, 0x01, 0x7c, 0xb7, 0x55, 0x25, 0x40, 0xbd, ++ 0x38, 0xde, 0xef, 0x25, 0x66, 0xe7, 0x08, 0xbb, 0xa8, 0x3a, 0xfd, 0x96, ++ 0x33, 0x12, 0xcc, 0x77, 0xb4, 0x57, 0x01, 0xb9, 0x4a, 0xd2, 0x52, 0x70, ++ 0x3e, 0xe5, 0xc4, 0xac, 0xb3, 0x8f, 0x4a, 0xb2, 0x28, 0xc8, 0x61, 0x7e, ++ 0x59, 0xb9, 0x3e, 0xf8, 0x5e, 0x69, 0x35, 0x7c, 0xe7, 0x74, 0x54, 0xdd, ++ 0xcf, 0x8e, 0x6a, 0x73, 0xcd, 0xa0, 0xf4, 0x3e, 0x35, 0x9b, 0xd2, 0x3f, ++ 0x7f, 0x7f, 0x81, 0xfe, 0x37, 0x3a, 0x82, 0xdc, 0x7b, 0x5b, 0x7e, 0x50, ++ 0xbe, 0x4f, 0x51, 0xef, 0xf2, 0x54, 0xe9, 0xec, 0x8f, 0x36, 0x17, 0xf0, ++ 0xe1, 0xef, 0xbe, 0x95, 0x91, 0xef, 0x8d, 0xf8, 0xd8, 0xca, 0xe9, 0xf1, ++ 0xc8, 0x4a, 0x8f, 0xa7, 0x8a, 0xf2, 0xdf, 0xaf, 0x22, 0x29, 0x3e, 0xe8, ++ 0x7a, 0x2b, 0x54, 0x69, 0xad, 0x4d, 0xbd, 0x36, 0xfc, 0x8c, 0x78, 0x33, ++ 0xc2, 0xef, 0x3b, 0x9d, 0x0b, 0xd1, 0x7e, 0x33, 0xc2, 0xab, 0xfc, 0x03, ++ 0x57, 0x55, 0x82, 0xda, 0x1f, 0x3e, 0x46, 0x78, 0x08, 0xf8, 0xd3, 0xf5, ++ 0xad, 0x07, 0xb8, 0x55, 0x67, 0xcb, 0xa8, 0xaf, 0x04, 0xbc, 0xfb, 0xc3, ++ 0x89, 0xd1, 0xc3, 0xef, 0x72, 0x68, 0x3d, 0x89, 0xd1, 0x0f, 0xc3, 0x87, ++ 0x44, 0x90, 0x5e, 0x04, 0xfd, 0xc4, 0xa5, 0x21, 0xfc, 0x4b, 0x80, 0xf6, ++ 0xe0, 0x7b, 0x74, 0x0a, 0x96, 0x8d, 0xf0, 0x35, 0xc2, 0x93, 0xca, 0x01, ++ 0x37, 0xd6, 0xe7, 0xf8, 0x3b, 0x0c, 0x70, 0xcb, 0x80, 0xaf, 0xee, 0xda, ++ 0xea, 0x21, 0x41, 0x38, 0x50, 0xba, 0xea, 0x8a, 0x0f, 0xa1, 0x2b, 0x01, ++ 0x87, 0x7e, 0x72, 0x23, 0x8b, 0x97, 0x39, 0xde, 0x85, 0xbd, 0x5c, 0xcd, ++ 0xfb, 0xa1, 0xf6, 0x32, 0xda, 0xc3, 0x95, 0x0e, 0x9b, 0x0b, 0xc0, 0x5f, ++ 0xd9, 0xc8, 0xe6, 0x5b, 0x99, 0x11, 0xb3, 0xd5, 0x9b, 0x82, 0xf8, 0xda, ++ 0x8a, 0xfc, 0xe3, 0xa7, 0x18, 0x29, 0xc1, 0x7f, 0xd9, 0xdf, 0x25, 0x66, ++ 0xe7, 0x52, 0xbb, 0x94, 0xd1, 0x67, 0xe7, 0xe4, 0x33, 0x60, 0x3f, 0x8f, ++ 0x8e, 0xd0, 0xd6, 0x02, 0x7f, 0x04, 0xa4, 0x78, 0xb2, 0x95, 0x20, 0xfc, ++ 0x3f, 0x36, 0xc0, 0x5f, 0x57, 0xae, 0x36, 0xd8, 0xcb, 0x46, 0x78, 0xfc, ++ 0x0a, 0xfe, 0x67, 0x62, 0x7f, 0xb8, 0x09, 0xba, 0xfb, 0x79, 0x0a, 0xb5, ++ 0xaf, 0xf3, 0x68, 0x71, 0x38, 0x19, 0x01, 0xf6, 0x6f, 0xe1, 0x2b, 0xc5, ++ 0x71, 0x20, 0xc7, 0x49, 0x67, 0x02, 0xca, 0x63, 0x23, 0x3d, 0x96, 0x9e, ++ 0xf0, 0xf4, 0xf5, 0xc3, 0xe9, 0x17, 0xe9, 0x53, 0x22, 0x5a, 0xdf, 0x7b, ++ 0x3b, 0xb5, 0x23, 0x3a, 0xb2, 0x1f, 0x79, 0x02, 0xcc, 0x9a, 0x1b, 0xad, ++ 0x6d, 0x32, 0xd0, 0xe1, 0x8d, 0xc4, 0xbd, 0xe6, 0x94, 0x15, 0xd6, 0x2f, ++ 0xe3, 0x3c, 0xc5, 0xbc, 0xfe, 0xee, 0xf4, 0xec, 0x4c, 0xa1, 0xf2, 0x66, ++ 0x62, 0x4f, 0xcd, 0x9a, 0x53, 0xa1, 0x7c, 0xc1, 0xc7, 0x17, 0xf0, 0xbe, ++ 0x89, 0xc3, 0xfb, 0x26, 0xe2, 0xdd, 0x2f, 0xc7, 0xc2, 0x53, 0xf9, 0xba, ++ 0xcf, 0x8e, 0x0f, 0xe9, 0x6f, 0x6f, 0x0a, 0xf7, 0x17, 0x92, 0x49, 0x32, ++ 0xac, 0xc7, 0x9e, 0xa2, 0x32, 0xf9, 0xce, 0xfb, 0x13, 0xeb, 0x1b, 0x9d, ++ 0x46, 0xfc, 0x12, 0xc2, 0xd9, 0xea, 0xdb, 0x2a, 0xc1, 0xfc, 0x89, 0xd7, ++ 0x92, 0x10, 0x1c, 0xcf, 0xcc, 0xd1, 0x94, 0x91, 0x31, 0xe3, 0xb5, 0x14, ++ 0x94, 0xc7, 0xcd, 0x04, 0xed, 0x65, 0x6a, 0x5e, 0x02, 0x12, 0xcb, 0xf8, ++ 0xf7, 0x32, 0x6b, 0x8c, 0x1f, 0xe6, 0x43, 0x02, 0xca, 0xd9, 0x3e, 0x3c, ++ 0x20, 0xdf, 0xd5, 0xd9, 0x01, 0xae, 0x14, 0x2e, 0xe4, 0x4a, 0x74, 0x70, ++ 0x7e, 0xbf, 0x4b, 0x91, 0x94, 0x4f, 0xb3, 0x83, 0xf3, 0x3b, 0xb7, 0xc3, ++ 0xea, 0x95, 0x81, 0x9f, 0x87, 0x69, 0xbf, 0x87, 0x71, 0xce, 0x4a, 0x47, ++ 0x0b, 0x91, 0x6f, 0x15, 0x7f, 0x26, 0xe8, 0x41, 0xe3, 0xf7, 0x0b, 0x1d, ++ 0x5d, 0xcb, 0xe1, 0x3b, 0xad, 0xb7, 0x10, 0xeb, 0xf1, 0x75, 0x2d, 0x05, ++ 0xa7, 0x91, 0xd2, 0x5d, 0xe0, 0xb5, 0x08, 0xdf, 0xd6, 0x94, 0xab, 0xd8, ++ 0xa1, 0x56, 0xaa, 0xc2, 0x42, 0xe4, 0x41, 0x59, 0x14, 0x93, 0x27, 0xd5, ++ 0x24, 0x20, 0x83, 0xdd, 0xd9, 0x19, 0xc9, 0xf8, 0xf9, 0xf5, 0xaf, 0x16, ++ 0x21, 0x3f, 0xb8, 0x89, 0x7d, 0x6d, 0x1e, 0xed, 0xef, 0xd0, 0xf9, 0xc9, ++ 0x47, 0x80, 0x9f, 0x2b, 0xa9, 0x78, 0x81, 0x7a, 0x93, 0x2e, 0xe9, 0xfd, ++ 0xb6, 0x6b, 0xd1, 0x69, 0x15, 0x09, 0xcc, 0x81, 0x76, 0xd5, 0x76, 0xb3, ++ 0xc1, 0x0f, 0xf4, 0xa2, 0xbe, 0x59, 0xcb, 0xe5, 0x9a, 0xb0, 0xd3, 0x4c, ++ 0xa9, 0xda, 0xb9, 0x14, 0x7c, 0x3f, 0xca, 0x07, 0x7a, 0xa6, 0xf3, 0xab, ++ 0xc9, 0x2a, 0xe0, 0x6d, 0x6b, 0xf6, 0xf8, 0x5b, 0x6e, 0xa7, 0x55, 0x52, ++ 0x73, 0xc6, 0xcd, 0x00, 0xf7, 0xcc, 0x64, 0xed, 0x36, 0x83, 0xfe, 0x9b, ++ 0xcd, 0xe9, 0x6b, 0x02, 0xd0, 0x97, 0x84, 0x56, 0x90, 0xa0, 0xaf, 0x8b, ++ 0xd0, 0x4f, 0xda, 0x3a, 0x03, 0x7d, 0xd9, 0x13, 0x74, 0x7e, 0xdd, 0x2d, ++ 0xc4, 0x8f, 0xeb, 0x2f, 0xcb, 0x36, 0xff, 0x4d, 0x37, 0x3f, 0x6e, 0x97, ++ 0x18, 0xed, 0xf5, 0xa0, 0x9d, 0xde, 0x16, 0xd6, 0xbf, 0x23, 0x5d, 0x0a, ++ 0xc9, 0xa6, 0x70, 0x9e, 0xc3, 0xe1, 0xbc, 0x36, 0xde, 0xe2, 0x05, 0xb9, ++ 0xa6, 0xdc, 0x27, 0xf9, 0x48, 0x0a, 0xcc, 0x97, 0x8c, 0x5a, 0x45, 0xe7, ++ 0x39, 0xbb, 0xd9, 0xac, 0xf3, 0x47, 0xe7, 0xc4, 0x2b, 0x88, 0xc7, 0x39, ++ 0xab, 0x22, 0x7d, 0x84, 0xf9, 0xdf, 0xce, 0x7a, 0x5a, 0xd6, 0xe8, 0xfb, ++ 0xc7, 0xa0, 0x98, 0xed, 0x76, 0x86, 0xda, 0x55, 0xa4, 0x25, 0xa4, 0x3d, ++ 0xd0, 0x43, 0x8c, 0x8a, 0xf4, 0x3b, 0xc7, 0xce, 0xde, 0x7d, 0x44, 0xfb, ++ 0x18, 0x96, 0x00, 0xfd, 0x9e, 0x72, 0xa0, 0x13, 0xef, 0x35, 0x9f, 0x0f, ++ 0xa5, 0x53, 0xe3, 0xf8, 0x03, 0xf6, 0x6b, 0x68, 0xb7, 0x56, 0x22, 0xb3, ++ 0xc0, 0x7e, 0x5a, 0x6b, 0x76, 0x3b, 0x5d, 0x21, 0xf6, 0xc7, 0xa8, 0x54, ++ 0x66, 0xbf, 0x9c, 0xb7, 0x57, 0x6d, 0x32, 0xa5, 0x0e, 0x6c, 0x97, 0x68, ++ 0xd6, 0x64, 0xb7, 0x92, 0x18, 0x2c, 0xf7, 0xc4, 0x5b, 0x67, 0xf9, 0xc2, ++ 0xd8, 0x31, 0xa2, 0x3f, 0x41, 0x27, 0x65, 0x1a, 0xf3, 0xcb, 0x07, 0xea, ++ 0x37, 0x3d, 0x50, 0x85, 0x76, 0x99, 0xe9, 0x49, 0xbf, 0x0c, 0xf6, 0x76, ++ 0x7a, 0x80, 0xa0, 0x7d, 0x5c, 0x16, 0x70, 0x9b, 0xe6, 0xe9, 0xec, 0x74, ++ 0xe6, 0x9f, 0xf6, 0xb3, 0xd3, 0xdb, 0xf7, 0xa3, 0x9d, 0xbe, 0x6c, 0xdf, ++ 0x7e, 0x66, 0xa7, 0xb7, 0xaf, 0x42, 0x7b, 0x7f, 0x19, 0xb5, 0xf7, 0x41, ++ 0xbe, 0x53, 0xbb, 0x11, 0x64, 0x25, 0x9b, 0x50, 0x3e, 0xda, 0xef, 0x7d, ++ 0x7e, 0x26, 0xe5, 0x2d, 0x52, 0xd6, 0x2e, 0xf5, 0xf9, 0xa1, 0x0a, 0x45, ++ 0x45, 0x5a, 0x1b, 0xab, 0x7f, 0xf7, 0xd6, 0xec, 0xf8, 0x47, 0xd3, 0xc1, ++ 0x4f, 0xd4, 0x9c, 0x66, 0xea, 0xf7, 0xdc, 0x9d, 0x5a, 0xb0, 0xc1, 0x4a, ++ 0xfd, 0x9e, 0xd6, 0x14, 0x12, 0x49, 0xa8, 0xdf, 0x33, 0x2b, 0xb5, 0xe0, ++ 0xb6, 0xf5, 0x13, 0x28, 0x35, 0x25, 0xb8, 0x25, 0x12, 0x8f, 0xe5, 0x0d, ++ 0x31, 0x13, 0x07, 0xef, 0xd7, 0xde, 0x9d, 0x9a, 0xbf, 0x01, 0xfc, 0xda, ++ 0x81, 0xfc, 0xcb, 0xea, 0x54, 0xf5, 0xaa, 0xfe, 0xe5, 0x07, 0xe9, 0x9e, ++ 0xbb, 0x53, 0x43, 0xe2, 0x02, 0x54, 0x3e, 0x86, 0xb5, 0x47, 0x32, 0x32, ++ 0x2a, 0xe6, 0x40, 0x3d, 0x21, 0x37, 0xca, 0xa2, 0x18, 0x7f, 0x3e, 0x6a, ++ 0xf2, 0xa7, 0xfd, 0x14, 0xfc, 0xad, 0xb7, 0x64, 0x02, 0xfa, 0xf4, 0x96, ++ 0x96, 0x79, 0xe8, 0x07, 0x4c, 0x6b, 0x59, 0xec, 0xa9, 0xa2, 0xf3, 0xe9, ++ 0x3d, 0x70, 0x39, 0x93, 0x98, 0x40, 0x5e, 0x32, 0xbc, 0x37, 0xa6, 0x32, ++ 0xbb, 0xa6, 0x29, 0x9a, 0xd9, 0x97, 0x4d, 0xd1, 0xb4, 0x1f, 0x2a, 0x6f, ++ 0xde, 0x74, 0x6a, 0x8d, 0xd0, 0x7f, 0x77, 0xf6, 0xf3, 0xeb, 0xc7, 0x52, ++ 0x7e, 0xa9, 0xeb, 0x90, 0x5d, 0xe0, 0x2f, 0x46, 0x66, 0x5d, 0x1e, 0x05, ++ 0xfc, 0x3f, 0x6d, 0xfc, 0xf3, 0x4f, 0x8e, 0xa5, 0xe3, 0x7c, 0x18, 0x50, ++ 0x30, 0xfe, 0xd0, 0x69, 0xa3, 0x74, 0x48, 0xdf, 0x7f, 0x48, 0x24, 0xb4, ++ 0x67, 0xcb, 0x8e, 0x45, 0x78, 0xf6, 0x51, 0xbc, 0x7c, 0xdf, 0x59, 0xde, ++ 0x96, 0x1a, 0xe2, 0x9f, 0x7c, 0xdf, 0x59, 0x85, 0x65, 0x52, 0x4b, 0x1d, ++ 0x2b, 0xca, 0x1f, 0x2b, 0xac, 0x8c, 0x2f, 0x3f, 0x24, 0xfb, 0xd3, 0x7e, ++ 0x4a, 0xc7, 0xf1, 0x36, 0x4b, 0x68, 0x07, 0x9c, 0x6f, 0x4e, 0x89, 0x03, ++ 0x3a, 0xe8, 0x34, 0xd3, 0xf5, 0x87, 0xd0, 0xe3, 0xea, 0x54, 0x05, 0xe9, ++ 0x6f, 0x35, 0xa7, 0xc7, 0xba, 0x4b, 0x32, 0x06, 0xcd, 0x3a, 0xcd, 0xfe, ++ 0xe4, 0x66, 0x5a, 0xbf, 0x4e, 0xf1, 0x9b, 0xc1, 0x0f, 0xac, 0xbb, 0x64, ++ 0xc1, 0xf7, 0x30, 0x0f, 0x98, 0x4f, 0x67, 0xa4, 0xbe, 0x9f, 0xc7, 0x79, ++ 0x3f, 0x8f, 0xf7, 0xf5, 0x43, 0xe1, 0x30, 0x0e, 0xea, 0x19, 0xfb, 0x51, ++ 0xd8, 0x7b, 0x89, 0xad, 0xcf, 0x88, 0x87, 0xd3, 0x29, 0x95, 0x3f, 0x85, ++ 0xf5, 0x7c, 0xdf, 0xe9, 0x6e, 0x43, 0xbc, 0x51, 0xf9, 0x05, 0xfa, 0xa2, ++ 0xac, 0xb8, 0xeb, 0x04, 0xd8, 0x11, 0xd7, 0xd6, 0x4b, 0x6e, 0x09, 0xf4, ++ 0x52, 0xd3, 0x65, 0xc9, 0x3f, 0x9a, 0xc2, 0xf3, 0xec, 0x3e, 0x33, 0xfa, ++ 0xf7, 0x67, 0xc1, 0x3f, 0xa4, 0xe3, 0x9d, 0xdb, 0x77, 0x70, 0xc8, 0x5c, ++ 0xfa, 0x6c, 0xdc, 0xfd, 0xc7, 0x58, 0xf0, 0x07, 0xb7, 0x70, 0x7c, 0x9d, ++ 0x53, 0xba, 0x63, 0x61, 0x7e, 0xcb, 0x5e, 0xa2, 0xfe, 0x0b, 0xda, 0x43, ++ 0xfe, 0x21, 0xf7, 0x60, 0xfb, 0x79, 0x25, 0x8f, 0xb1, 0x61, 0xac, 0xa1, ++ 0xfa, 0x7a, 0xec, 0xb7, 0x07, 0x93, 0x3d, 0x2c, 0x78, 0xa8, 0x42, 0x7c, ++ 0x4e, 0xd8, 0xa5, 0x37, 0x59, 0xbd, 0x3e, 0x98, 0x5f, 0xe7, 0x2a, 0x19, ++ 0xe5, 0x08, 0xd5, 0xe7, 0x22, 0x6e, 0x2a, 0x81, 0xfc, 0x9e, 0xb4, 0x4f, ++ 0x76, 0x47, 0xc6, 0xf6, 0xb7, 0x57, 0x5f, 0x4e, 0x35, 0x0b, 0x79, 0x6b, ++ 0x02, 0x3d, 0xf6, 0x80, 0x9d, 0x8d, 0x33, 0x90, 0x3c, 0x28, 0xbb, 0x94, ++ 0x48, 0x7c, 0x21, 0xf2, 0xa2, 0x4c, 0xf1, 0xcb, 0x30, 0xff, 0xb2, 0x4b, ++ 0x43, 0xf0, 0xfd, 0xb9, 0x23, 0xa9, 0x4f, 0xd4, 0x02, 0xdd, 0x12, 0xb3, ++ 0x0b, 0xcd, 0x44, 0x85, 0x74, 0xa1, 0xbd, 0x2c, 0x11, 0xf1, 0xd7, 0x95, ++ 0x4e, 0xd7, 0xf3, 0x3a, 0x2f, 0xbc, 0xb1, 0xef, 0xc2, 0xed, 0x37, 0x22, ++ 0x33, 0x52, 0xbd, 0x48, 0xeb, 0x7c, 0xc7, 0xaf, 0x25, 0xa1, 0xfd, 0x0c, ++ 0x21, 0xd2, 0x92, 0xa0, 0x5d, 0x38, 0xe9, 0x92, 0x3e, 0xee, 0x6a, 0xb4, ++ 0xa3, 0x85, 0x9e, 0xad, 0xe8, 0x2c, 0x5a, 0x9b, 0x4c, 0x00, 0xee, 0xea, ++ 0xed, 0x37, 0x02, 0x1d, 0x1e, 0x51, 0x90, 0x7f, 0x8c, 0x76, 0x76, 0x75, ++ 0x60, 0xf2, 0x00, 0xf6, 0xf4, 0x06, 0xa4, 0xa3, 0x3d, 0xfb, 0xd2, 0xa2, ++ 0x21, 0x2e, 0xb0, 0x91, 0xf3, 0x79, 0xd3, 0xbe, 0x0b, 0x93, 0x41, 0x3e, ++ 0x2d, 0x27, 0xfe, 0x3b, 0x6e, 0x4c, 0x82, 0xb8, 0x83, 0x6c, 0xf7, 0x93, ++ 0xab, 0xc5, 0xbb, 0xd6, 0xfe, 0x6e, 0x12, 0x1d, 0xff, 0x8d, 0x80, 0xa2, ++ 0x82, 0x3c, 0x78, 0x23, 0xd0, 0x65, 0x2d, 0xc4, 0xb2, 0x09, 0xe3, 0x1c, ++ 0x65, 0x6f, 0x97, 0xe5, 0x01, 0xff, 0x76, 0x06, 0x94, 0x1a, 0xf0, 0x5b, ++ 0xcb, 0xbe, 0xea, 0x8a, 0x9e, 0x97, 0x1f, 0xb4, 0x6b, 0x3a, 0x2f, 0x9b, ++ 0xf0, 0xfd, 0x1b, 0x97, 0x0f, 0xe0, 0x7b, 0xd1, 0x6f, 0x67, 0x20, 0x21, ++ 0x0f, 0xf4, 0xf3, 0x6e, 0x13, 0xf3, 0xb7, 0xbb, 0x0e, 0xff, 0x2d, 0x1a, ++ 0xe4, 0xeb, 0x1b, 0x97, 0xcf, 0x27, 0xa2, 0xdf, 0x2f, 0xec, 0x92, 0xfe, ++ 0x76, 0x35, 0xfa, 0x01, 0x95, 0x36, 0xb9, 0x2f, 0x0e, 0x1d, 0x6a, 0xbf, ++ 0x13, 0xb9, 0xec, 0xb8, 0x15, 0xfc, 0x8d, 0x38, 0x33, 0x91, 0x11, 0x0f, ++ 0xcc, 0x1f, 0xed, 0x67, 0x97, 0x7c, 0x40, 0xd6, 0xda, 0x48, 0x7f, 0xfb, ++ 0x44, 0xc0, 0x1f, 0xc8, 0x12, 0xf8, 0xa6, 0x9f, 0x5d, 0x1d, 0x84, 0xb7, ++ 0xce, 0xbe, 0xbe, 0x92, 0xca, 0xed, 0xe5, 0x91, 0x64, 0xec, 0x15, 0xb0, ++ 0x73, 0x2f, 0x27, 0x2e, 0x05, 0x7d, 0xdd, 0xdb, 0x19, 0x6d, 0x5f, 0x8d, ++ 0xf1, 0x29, 0x66, 0x57, 0xf4, 0x76, 0x7d, 0xfe, 0xb3, 0xa9, 0xf0, 0xfe, ++ 0xa8, 0x8c, 0xf1, 0xb6, 0xde, 0xcb, 0x32, 0xf2, 0xd5, 0x81, 0xd7, 0x97, ++ 0x8e, 0xee, 0x89, 0x09, 0x85, 0x7b, 0x2b, 0xe2, 0xef, 0xe2, 0xb0, 0xaf, ++ 0xbe, 0x7c, 0x95, 0xd6, 0xbf, 0x78, 0x28, 0x0a, 0xe3, 0xea, 0x44, 0x71, ++ 0xe5, 0x85, 0x8b, 0x9f, 0x04, 0xe3, 0xc9, 0xfe, 0xe1, 0x26, 0x27, 0x3c, ++ 0xbd, 0xc3, 0x4d, 0x13, 0x90, 0xed, 0x30, 0x5e, 0xf0, 0x9d, 0x60, 0xbc, ++ 0xc0, 0x91, 0x86, 0xf1, 0x82, 0xc0, 0x64, 0x50, 0x57, 0x99, 0x9b, 0x4f, ++ 0x5a, 0x20, 0xde, 0xb2, 0x31, 0xd5, 0x33, 0x34, 0x0d, 0xdb, 0xb7, 0x47, ++ 0xc3, 0xba, 0x17, 0x45, 0x31, 0xf9, 0xe4, 0x25, 0x15, 0xc9, 0xd4, 0x78, ++ 0x22, 0x2f, 0x1d, 0x31, 0x55, 0x00, 0xbd, 0x14, 0xaf, 0x52, 0x11, 0xef, ++ 0x3b, 0xcd, 0xd4, 0xc4, 0x02, 0xfe, 0xd8, 0xce, 0xfc, 0xfb, 0x9d, 0x54, ++ 0xde, 0x82, 0x5f, 0xb4, 0xb8, 0xbd, 0xcd, 0x92, 0x12, 0x82, 0xe7, 0xc5, ++ 0x14, 0x41, 0xb0, 0xbe, 0xd3, 0x66, 0xef, 0xa8, 0x84, 0x90, 0xf7, 0x3b, ++ 0xd2, 0x58, 0x3c, 0xe1, 0xf4, 0xa1, 0x25, 0xcf, 0x01, 0x9c, 0xbc, 0x7f, ++ 0x8a, 0x20, 0x19, 0x61, 0xec, 0xd3, 0x87, 0xd2, 0x98, 0x3c, 0xdc, 0x6b, ++ 0xf1, 0x4e, 0xdd, 0x05, 0xf5, 0x3e, 0x36, 0x11, 0x18, 0xaf, 0xeb, 0xf0, ++ 0x6f, 0x0e, 0x0f, 0xa7, 0x78, 0x5e, 0x7c, 0x42, 0x2d, 0x02, 0x3d, 0x30, ++ 0x2b, 0x4d, 0xc5, 0x7a, 0x1d, 0x47, 0x77, 0xb6, 0x0e, 0xa7, 0xf5, 0x3a, ++ 0x3e, 0x00, 0xed, 0x49, 0x4d, 0xf2, 0x6d, 0xf5, 0xb2, 0x89, 0x8e, 0xfb, ++ 0x2a, 0x51, 0x59, 0xdc, 0xef, 0xb8, 0x09, 0xe7, 0xdb, 0x17, 0x27, 0x25, ++ 0xee, 0x44, 0x58, 0xef, 0x1d, 0x69, 0x4c, 0x8e, 0xbd, 0x7a, 0x84, 0xd1, ++ 0xab, 0x18, 0xff, 0xd5, 0x28, 0xa6, 0xef, 0x26, 0xa7, 0x31, 0xf9, 0x52, ++ 0x96, 0xc6, 0xe2, 0x6e, 0x7b, 0x8e, 0x54, 0x24, 0xce, 0x45, 0xbe, 0xd2, ++ 0x26, 0x01, 0xdc, 0x9a, 0x4e, 0xf5, 0xb4, 0xc6, 0xaa, 0xc1, 0x38, 0xa1, ++ 0xb0, 0x0f, 0x27, 0x1e, 0xdf, 0x33, 0xb5, 0x80, 0xfe, 0xef, 0xc4, 0xb3, ++ 0x26, 0x3b, 0xa0, 0x4f, 0x3d, 0xbe, 0x55, 0x86, 0xf5, 0xaa, 0xa7, 0x09, ++ 0x89, 0x97, 0xfa, 0xc7, 0xb1, 0x68, 0x7f, 0x53, 0xd2, 0x1c, 0xc1, 0xfe, ++ 0x5e, 0x3d, 0xcb, 0xfa, 0xa3, 0xf3, 0x38, 0x00, 0x7c, 0x17, 0x58, 0x45, ++ 0xec, 0x5b, 0x91, 0xea, 0x3c, 0x8f, 0xe7, 0xd3, 0xf2, 0xab, 0xdd, 0x4a, ++ 0xc2, 0x63, 0x2a, 0xe2, 0x03, 0xf5, 0x81, 0xc0, 0x83, 0x58, 0x8f, 0x98, ++ 0x87, 0xda, 0x4e, 0xdc, 0x5b, 0x62, 0x90, 0x45, 0xdc, 0x7b, 0xae, 0x16, ++ 0x8f, 0xa6, 0x7e, 0x27, 0xf0, 0xdb, 0x38, 0x2e, 0x3f, 0xdf, 0x4d, 0x75, ++ 0xdf, 0x95, 0xc6, 0xec, 0xac, 0x51, 0x40, 0x77, 0xa7, 0x0f, 0x45, 0xa1, ++ 0x3d, 0xb6, 0x97, 0xc7, 0xb5, 0x89, 0xb3, 0x7e, 0x34, 0xc0, 0x4f, 0xe0, ++ 0xe9, 0x7b, 0xfc, 0x69, 0x9c, 0xcf, 0x40, 0xe3, 0x37, 0x73, 0x3a, 0x10, ++ 0xcf, 0x9d, 0x66, 0xd5, 0x8b, 0xf4, 0xf0, 0x12, 0xd3, 0xbb, 0x3b, 0x6d, ++ 0x7e, 0x6b, 0x1a, 0xc8, 0xbf, 0x57, 0xd2, 0xb0, 0xac, 0x7a, 0xbd, 0xd1, ++ 0x85, 0xf4, 0x7b, 0x53, 0x47, 0x86, 0x4b, 0x56, 0x91, 0x9e, 0x9b, 0x19, ++ 0xdd, 0x32, 0x3a, 0xbf, 0x89, 0xd3, 0xb9, 0xda, 0x1e, 0xb0, 0xa4, 0x84, ++ 0xe0, 0x61, 0x60, 0xf9, 0xc6, 0xe0, 0xde, 0x47, 0x3f, 0x4a, 0x3b, 0xd2, ++ 0x55, 0xc7, 0x09, 0x82, 0xfc, 0xb6, 0x64, 0xc7, 0x7d, 0x2c, 0x0e, 0x49, ++ 0xfc, 0xc9, 0x8c, 0x9f, 0xbc, 0xc9, 0xc0, 0x5f, 0xc0, 0x17, 0x8c, 0xcf, ++ 0xfc, 0xc3, 0x24, 0xf6, 0x8c, 0x05, 0x3e, 0x99, 0xd8, 0xb9, 0x65, 0x4d, ++ 0x32, 0x6d, 0xd7, 0x00, 0x74, 0x9f, 0x1f, 0x84, 0x83, 0x0a, 0x7c, 0x01, ++ 0x7c, 0x26, 0xd6, 0x69, 0x63, 0x76, 0xf2, 0xcf, 0x78, 0x59, 0x7c, 0x6f, ++ 0x4b, 0x63, 0x71, 0xc7, 0x6a, 0x39, 0x3f, 0xae, 0xe7, 0x2a, 0xf1, 0xbb, ++ 0x37, 0x56, 0x3a, 0x89, 0x12, 0x12, 0xbf, 0xfb, 0x19, 0x9f, 0xff, 0x62, ++ 0xb2, 0x01, 0xed, 0xd3, 0xc5, 0x97, 0xdb, 0xd0, 0x6e, 0x55, 0x9b, 0xd9, ++ 0x73, 0xf1, 0x03, 0xec, 0x99, 0xb9, 0xb9, 0xde, 0x02, 0xfa, 0x60, 0xf1, ++ 0x26, 0xc9, 0x1d, 0xce, 0xae, 0xb6, 0x73, 0xfc, 0x9d, 0xe3, 0x7c, 0x40, ++ 0x4c, 0x51, 0xc3, 0x89, 0x33, 0xf8, 0xdd, 0xc1, 0xf9, 0xe0, 0xcc, 0xbe, ++ 0x27, 0x0e, 0xc2, 0x3a, 0x29, 0xbd, 0x3e, 0x07, 0xf0, 0xbf, 0xa1, 0x63, ++ 0xc3, 0xd3, 0x00, 0x26, 0x41, 0xff, 0x67, 0xb6, 0x99, 0xb1, 0xbd, 0x90, ++ 0x23, 0xa2, 0xfd, 0x36, 0xde, 0xff, 0x4b, 0xc7, 0x19, 0xff, 0x4c, 0xdc, ++ 0x66, 0xae, 0xb8, 0x9b, 0xc2, 0x7b, 0xa2, 0x97, 0xd8, 0x21, 0x9e, 0xfe, ++ 0xea, 0xb6, 0xed, 0x32, 0xc8, 0xf7, 0x57, 0x81, 0x3f, 0x52, 0x98, 0xdc, ++ 0x00, 0xbd, 0x7c, 0xfa, 0xd0, 0x63, 0xd1, 0x3f, 0x00, 0x3a, 0x38, 0x69, ++ 0x22, 0x10, 0xb7, 0xdf, 0x6b, 0x21, 0x8b, 0x76, 0x87, 0xe0, 0xb7, 0x6b, ++ 0xcb, 0xcb, 0x3a, 0x79, 0xb0, 0x64, 0xc7, 0xaa, 0xa9, 0xd0, 0x4f, 0x69, ++ 0x4f, 0x82, 0x04, 0x7a, 0x40, 0xc8, 0x01, 0x81, 0xef, 0xbd, 0x16, 0xd7, ++ 0x14, 0x94, 0x27, 0xd3, 0x0d, 0xf2, 0xa4, 0x8a, 0xb5, 0x3f, 0x06, 0xf0, ++ 0xa4, 0xeb, 0x7a, 0x82, 0xcb, 0x93, 0x27, 0x6a, 0xa8, 0x3c, 0xa1, 0xaf, ++ 0xe2, 0xb7, 0xc5, 0x4b, 0xd0, 0xcf, 0x5e, 0x1e, 0x27, 0x36, 0xc2, 0xaf, ++ 0x8b, 0xe3, 0x53, 0xd0, 0xe3, 0x8d, 0x41, 0xb9, 0xdb, 0xc5, 0xe4, 0x6e, ++ 0x4f, 0x2c, 0x74, 0xbd, 0x7c, 0xda, 0x79, 0x8c, 0xd3, 0xf6, 0x8d, 0xc3, ++ 0xe9, 0xee, 0x89, 0x2a, 0x41, 0x77, 0x29, 0x12, 0xc0, 0x91, 0xda, 0xf9, ++ 0xa6, 0x74, 0x58, 0x37, 0x85, 0x0f, 0xd0, 0x3f, 0xb5, 0xf3, 0xef, 0x9d, ++ 0x91, 0x8f, 0x5c, 0x7a, 0x44, 0xc1, 0xfd, 0x21, 0xbe, 0xdf, 0x44, 0x56, ++ 0x0b, 0xfb, 0x47, 0xc7, 0xbf, 0x42, 0xce, 0xbd, 0x9b, 0xaa, 0x1d, 0x87, ++ 0xf1, 0x4b, 0xaa, 0x9a, 0xd7, 0x80, 0xff, 0x91, 0x58, 0xeb, 0x45, 0xba, ++ 0x3e, 0x23, 0x69, 0xa3, 0x13, 0xa8, 0xbe, 0x3a, 0x03, 0x7c, 0x1d, 0x46, ++ 0x2e, 0xbc, 0xca, 0xe5, 0xc8, 0x45, 0xb3, 0x36, 0xda, 0x1e, 0xe6, 0x7b, ++ 0x90, 0x8f, 0xc8, 0x70, 0xe0, 0x83, 0x45, 0x44, 0x33, 0xc1, 0x3a, 0xc8, ++ 0x66, 0xc9, 0x0e, 0x70, 0x15, 0xdf, 0xd5, 0xcd, 0x8c, 0xde, 0x3e, 0xe7, ++ 0xf0, 0x11, 0xef, 0x3f, 0x37, 0xc0, 0x6b, 0x12, 0xc0, 0x2b, 0x0d, 0xe1, ++ 0xf5, 0x39, 0xd7, 0x53, 0x16, 0x2b, 0x9d, 0x6f, 0xa6, 0x8f, 0xe9, 0x29, ++ 0x22, 0x55, 0x20, 0x3d, 0x12, 0xd3, 0x2d, 0xc3, 0x81, 0xdf, 0xce, 0x98, ++ 0x09, 0xd2, 0xcf, 0x19, 0x2a, 0x17, 0x01, 0x6e, 0x8b, 0xa3, 0xf4, 0xfe, ++ 0x89, 0x58, 0xd7, 0x37, 0x9c, 0xaf, 0x2e, 0xc6, 0xb3, 0x75, 0xec, 0xe5, ++ 0xe3, 0xfe, 0x09, 0x7c, 0x9e, 0xf1, 0x58, 0x0f, 0xed, 0x0a, 0x6f, 0xb9, ++ 0x09, 0xf7, 0x6b, 0x81, 0x3e, 0x90, 0xde, 0xa6, 0x27, 0xa0, 0xdd, 0x45, ++ 0x1d, 0x26, 0x05, 0xf9, 0xbc, 0x6f, 0x3f, 0xc2, 0x2f, 0x4b, 0x4c, 0x1e, ++ 0xc8, 0x30, 0x0f, 0x3b, 0xf8, 0x75, 0x18, 0x27, 0xda, 0x82, 0xfd, 0x2e, ++ 0xdd, 0xb5, 0x05, 0xe9, 0x26, 0xbe, 0xc6, 0x5e, 0x04, 0xfb, 0x47, 0x4f, ++ 0x28, 0xae, 0xc8, 0xf8, 0x90, 0x78, 0x6f, 0xd7, 0xf6, 0x8d, 0xe8, 0x4f, ++ 0x02, 0x3d, 0x01, 0x5f, 0x0e, 0x44, 0x8f, 0x8b, 0x80, 0x1e, 0x49, 0x18, ++ 0x3a, 0xf4, 0x51, 0x3a, 0xa4, 0xed, 0x12, 0x6a, 0x9a, 0x11, 0x8f, 0x14, ++ 0xbf, 0xf6, 0x74, 0xda, 0x6f, 0x7c, 0x95, 0x26, 0x03, 0xdd, 0x18, 0xf1, ++ 0x2b, 0xf6, 0x19, 0x05, 0x3c, 0xf6, 0x1a, 0xf6, 0x25, 0x67, 0xa6, 0x33, ++ 0xf8, 0xa4, 0xa4, 0x33, 0xfe, 0x54, 0xb9, 0xfc, 0x1a, 0x58, 0x4f, 0xe8, ++ 0xe5, 0x2d, 0xc5, 0x97, 0x9a, 0xee, 0xd0, 0xd3, 0x37, 0xe0, 0x4d, 0xf0, ++ 0x5b, 0x4c, 0x3a, 0x93, 0x4f, 0x03, 0xd1, 0xf9, 0x43, 0xe9, 0x76, 0xec, ++ 0xb7, 0xf5, 0xc3, 0x79, 0x4e, 0x90, 0x17, 0x62, 0x3f, 0x4a, 0xec, 0x2f, ++ 0x8b, 0xf1, 0xc7, 0xa6, 0x33, 0x7a, 0x1c, 0x68, 0x3f, 0xe9, 0x9c, 0xaa, ++ 0x15, 0xa5, 0x1b, 0xf6, 0x3b, 0xd5, 0xfc, 0x20, 0x9f, 0x54, 0x73, 0xfb, ++ 0x71, 0xc5, 0xf6, 0x08, 0xdc, 0xa7, 0xdf, 0x0d, 0x5f, 0x00, 0xee, 0x5d, ++ 0x51, 0xb8, 0x2f, 0xd1, 0x27, 0x07, 0x15, 0xe2, 0x06, 0x7c, 0x96, 0xa7, ++ 0xa7, 0xe0, 0x78, 0x02, 0xbf, 0x6a, 0x8b, 0x85, 0xa4, 0xd3, 0x71, 0x2f, ++ 0xa6, 0xd4, 0x77, 0xc5, 0xd0, 0x4f, 0x37, 0x77, 0x7b, 0x6b, 0x0b, 0xe8, ++ 0x3a, 0x76, 0x5b, 0xbc, 0x33, 0xa7, 0xa1, 0xdd, 0xed, 0x9a, 0x02, 0xfd, ++ 0x4f, 0xa9, 0x35, 0xd9, 0x21, 0x8e, 0x1d, 0xef, 0xb6, 0x4b, 0x10, 0x07, ++ 0x41, 0x12, 0x07, 0xbe, 0x38, 0xca, 0xc6, 0x21, 0xaa, 0x4b, 0x37, 0xef, ++ 0xa9, 0x1c, 0xee, 0x02, 0x4f, 0x02, 0x0e, 0x03, 0xe9, 0xab, 0x81, 0xf0, ++ 0xf3, 0x10, 0x87, 0x8f, 0x83, 0x7f, 0x37, 0xf2, 0x75, 0x06, 0xff, 0x6e, ++ 0x4e, 0x67, 0xf4, 0x7f, 0x6d, 0xbe, 0xf6, 0xca, 0x40, 0xf7, 0xb1, 0x44, ++ 0x5b, 0x2d, 0xc3, 0xfc, 0xcb, 0x98, 0x1c, 0xea, 0xe3, 0xeb, 0x32, 0x82, ++ 0xfb, 0x8d, 0x0b, 0xd2, 0xf5, 0x7c, 0x2d, 0xca, 0x61, 0xf8, 0x7a, 0x41, ++ 0x7a, 0x28, 0x5f, 0x4f, 0xe8, 0xd1, 0xf3, 0x35, 0xb5, 0x70, 0xb9, 0x3e, ++ 0x45, 0xfe, 0x72, 0x6c, 0x33, 0xbb, 0x99, 0x3f, 0xc9, 0xf8, 0xec, 0x62, ++ 0x24, 0x9b, 0xef, 0x8a, 0x74, 0xa6, 0x87, 0x1c, 0xa0, 0x3f, 0x28, 0xfe, ++ 0x1c, 0x5e, 0xb6, 0xef, 0x3a, 0x95, 0xd3, 0x19, 0xa5, 0xa0, 0x39, 0x00, ++ 0xef, 0xb6, 0x6d, 0x11, 0xb8, 0x9f, 0x20, 0xf8, 0x3e, 0x76, 0x26, 0xa9, ++ 0x30, 0xc3, 0xfe, 0x2d, 0xe8, 0x1b, 0xa8, 0x35, 0x53, 0x3b, 0x71, 0x13, ++ 0xec, 0xdb, 0x3a, 0x2d, 0x2a, 0xec, 0x23, 0x9f, 0x31, 0x07, 0x10, 0x4f, ++ 0x67, 0xa8, 0xa3, 0xda, 0x86, 0xf8, 0xf4, 0x60, 0x3e, 0xca, 0x99, 0x43, ++ 0x37, 0x30, 0x79, 0x30, 0xad, 0x4f, 0xff, 0xb8, 0x4d, 0x50, 0x7e, 0x7f, ++ 0x04, 0xee, 0x27, 0x54, 0xcb, 0x9d, 0x48, 0xd7, 0x2b, 0xaa, 0x09, 0xea, ++ 0x8f, 0xae, 0xed, 0xa5, 0x48, 0x07, 0x8b, 0x6a, 0x53, 0x25, 0xa0, 0xb3, ++ 0x25, 0x3b, 0xe2, 0x25, 0xf8, 0x9e, 0x50, 0x65, 0x37, 0xc9, 0x21, 0x72, ++ 0xb1, 0xb4, 0x45, 0x46, 0x7a, 0xa2, 0x74, 0xbb, 0x2e, 0x3d, 0x04, 0x7e, ++ 0xa5, 0xde, 0x66, 0x19, 0xe0, 0x32, 0x3a, 0x51, 0x73, 0x9a, 0xe3, 0xa9, ++ 0x9e, 0xdd, 0x36, 0x75, 0x46, 0x68, 0x5c, 0xe8, 0x49, 0x5a, 0x5e, 0xef, ++ 0x0c, 0xc6, 0x85, 0x68, 0xf9, 0x67, 0x31, 0xc3, 0x06, 0x1f, 0x17, 0xda, ++ 0x98, 0x7e, 0xcb, 0xcf, 0xd6, 0x8d, 0xa0, 0x4a, 0x24, 0xcd, 0xfd, 0x14, ++ 0x8c, 0x7b, 0x4e, 0xf5, 0x6c, 0x04, 0xbc, 0x94, 0x24, 0x37, 0x63, 0xbc, ++ 0x73, 0xb0, 0x79, 0x10, 0x4d, 0x3c, 0xae, 0xf4, 0xc1, 0x23, 0x6f, 0x6d, ++ 0xaf, 0xa7, 0xeb, 0xae, 0x7b, 0x34, 0xf0, 0x08, 0x7c, 0xbd, 0x17, 0xe2, ++ 0xae, 0xd9, 0x90, 0x3f, 0xc0, 0xe2, 0xae, 0x4d, 0x9d, 0xc7, 0x30, 0x1e, ++ 0xdb, 0xc9, 0xf9, 0xf9, 0xef, 0x4e, 0xcf, 0x0b, 0x30, 0xee, 0xec, 0xe6, ++ 0x29, 0xfa, 0xf8, 0x6b, 0x60, 0x70, 0xe3, 0x26, 0x71, 0xbe, 0x25, 0x1f, ++ 0x10, 0x84, 0x7f, 0x92, 0xa7, 0x59, 0x86, 0xb8, 0x84, 0x90, 0x0b, 0xfb, ++ 0xd2, 0x13, 0x84, 0xff, 0x28, 0xc1, 0xfe, 0x9b, 0xe0, 0x07, 0x90, 0x2b, ++ 0x60, 0x7f, 0x8a, 0x3c, 0x08, 0x88, 0x87, 0xd9, 0x12, 0x82, 0x72, 0x19, ++ 0xca, 0x71, 0x21, 0x7a, 0x75, 0x7d, 0x2d, 0xb5, 0x83, 0xc2, 0xf0, 0xd9, ++ 0xc1, 0xf4, 0x98, 0xb0, 0x72, 0x90, 0x74, 0xfe, 0xfd, 0xd7, 0x3f, 0xa0, ++ 0xfe, 0x7e, 0x13, 0x7c, 0x62, 0x72, 0xf1, 0x60, 0x7a, 0x88, 0xde, 0x7f, ++ 0xa2, 0xf6, 0xe3, 0x21, 0x1a, 0x8b, 0x7b, 0x60, 0xbc, 0xe9, 0x7e, 0xee, ++ 0x43, 0x3e, 0xb7, 0xda, 0xf5, 0xfb, 0x2c, 0x90, 0x43, 0xef, 0xc8, 0x28, ++ 0xff, 0x8b, 0x22, 0x2c, 0x5e, 0x09, 0xf6, 0x87, 0xdc, 0x44, 0xb5, 0x0f, ++ 0xe1, 0xfd, 0x01, 0x9b, 0x74, 0x4a, 0x7e, 0x1b, 0xf5, 0x3f, 0x9b, 0xfe, ++ 0x26, 0x11, 0x37, 0xc4, 0xcf, 0xfe, 0x26, 0xe3, 0xf3, 0xb9, 0x1f, 0x79, ++ 0x6a, 0x52, 0xc0, 0x9f, 0xef, 0x30, 0xb9, 0xa8, 0x25, 0x00, 0xf9, 0x14, ++ 0x48, 0xc7, 0xae, 0xd1, 0xc4, 0x67, 0xa5, 0xf4, 0xd7, 0xce, 0xf7, 0x6b, ++ 0xcb, 0x0f, 0xc6, 0xb8, 0xcd, 0xf4, 0x7d, 0xaf, 0x64, 0x45, 0xf9, 0xd7, ++ 0xbb, 0x3f, 0xca, 0x0b, 0x7c, 0xdd, 0x6b, 0x33, 0x61, 0x5c, 0xb9, 0xeb, ++ 0xb5, 0x08, 0x84, 0xeb, 0x85, 0xf4, 0x28, 0xee, 0x5f, 0xfb, 0x74, 0x7e, ++ 0xb8, 0xd8, 0xff, 0x88, 0x8c, 0xe8, 0xf9, 0x43, 0x19, 0x6d, 0xbf, 0x35, ++ 0x92, 0xf5, 0xbb, 0x35, 0x92, 0xc5, 0xe9, 0xb6, 0x3e, 0x9a, 0x19, 0x07, ++ 0xf6, 0xe7, 0x40, 0xfb, 0xe3, 0x65, 0x2d, 0x69, 0x18, 0xe7, 0x13, 0xf1, ++ 0xc7, 0xd4, 0x80, 0x6a, 0x62, 0x49, 0x64, 0x6c, 0x1c, 0x25, 0x40, 0x70, ++ 0x7d, 0x62, 0xbf, 0x7c, 0x13, 0xe4, 0x6b, 0x14, 0x0f, 0x9c, 0xaf, 0xf1, ++ 0xd7, 0xf4, 0xbe, 0x7c, 0x8d, 0x00, 0xd0, 0x53, 0xd3, 0xac, 0x9e, 0xc3, ++ 0x30, 0x47, 0xa3, 0x1f, 0x36, 0xe4, 0xe8, 0xc7, 0xfb, 0xa1, 0x9f, 0x21, ++ 0x2d, 0x2c, 0x4c, 0xb0, 0xe9, 0xe8, 0x0a, 0x09, 0xd6, 0xb9, 0xa9, 0x2e, ++ 0xbc, 0x1f, 0x26, 0xe8, 0x68, 0x13, 0x8f, 0x7b, 0x85, 0xe4, 0x45, 0x7c, ++ 0xab, 0xd3, 0x2f, 0xf5, 0x09, 0xd1, 0xa9, 0x21, 0xf2, 0x53, 0xb4, 0x7b, ++ 0x9a, 0xe7, 0x45, 0x94, 0x76, 0xcd, 0xdd, 0x0b, 0x76, 0x1e, 0xe5, 0xef, ++ 0x73, 0xa1, 0xfc, 0x3d, 0xb5, 0xe0, 0x91, 0xc8, 0x70, 0xfb, 0xf3, 0x9e, ++ 0x96, 0x1f, 0x62, 0x5c, 0x74, 0x20, 0xfa, 0xf7, 0x98, 0x88, 0x16, 0x2e, ++ 0xee, 0x37, 0x3a, 0x83, 0xcb, 0x5b, 0x25, 0x30, 0x1c, 0xed, 0xc1, 0x37, ++ 0x2e, 0x46, 0xa9, 0x61, 0xf2, 0x25, 0x3c, 0xaf, 0x99, 0x1c, 0x00, 0x17, ++ 0x11, 0x9f, 0xe9, 0x3f, 0xfe, 0x8f, 0x70, 0xfc, 0x61, 0x19, 0x7d, 0xfb, ++ 0x7f, 0xc3, 0x07, 0xb3, 0xff, 0x67, 0x9c, 0x77, 0xb7, 0x99, 0x8c, 0x0c, ++ 0xa7, 0x57, 0x04, 0x9e, 0x8d, 0xe3, 0x85, 0x69, 0x3f, 0xdb, 0x15, 0xd2, ++ 0xde, 0x63, 0x21, 0xda, 0xee, 0x98, 0xfe, 0xed, 0x84, 0xdd, 0xeb, 0x91, ++ 0xf8, 0xfe, 0xee, 0x87, 0x04, 0xf5, 0xab, 0xa0, 0x13, 0x0a, 0xf7, 0x71, ++ 0x19, 0xf4, 0x7b, 0xe1, 0xdb, 0xf3, 0xc6, 0x45, 0x41, 0xc2, 0xa1, 0xb5, ++ 0x59, 0x06, 0x79, 0x70, 0xa1, 0xa3, 0x2b, 0x19, 0xe2, 0x56, 0x03, 0xf9, ++ 0x87, 0x62, 0x3e, 0xf4, 0x2f, 0x23, 0x5c, 0xbc, 0x85, 0x8e, 0xe7, 0x09, ++ 0x87, 0x87, 0x69, 0x19, 0x4c, 0xbf, 0x7a, 0xcc, 0xcc, 0x0e, 0x95, 0xca, ++ 0x0f, 0xdd, 0x03, 0xf3, 0xf2, 0x7c, 0x65, 0x91, 0x22, 0x42, 0xe8, 0x6c, ++ 0x22, 0xaf, 0x67, 0xdc, 0xc7, 0xec, 0xfc, 0xea, 0xbf, 0xc7, 0xa1, 0x9c, ++ 0x34, 0xfb, 0x93, 0xc3, 0xc1, 0xcf, 0xb8, 0xbf, 0x39, 0x11, 0x82, 0x93, ++ 0x4c, 0xdf, 0xb1, 0x71, 0x39, 0x5c, 0x5a, 0xcb, 0x49, 0x45, 0x44, 0x12, ++ 0xc6, 0x0b, 0xc8, 0x56, 0x15, 0xfc, 0x40, 0x26, 0x2f, 0xd5, 0x16, 0x82, ++ 0x7c, 0x3e, 0x46, 0x72, 0xe3, 0xba, 0xeb, 0x20, 0xe8, 0xe2, 0x00, 0x3a, ++ 0xef, 0xc6, 0x3c, 0xc8, 0x0b, 0x47, 0x65, 0xac, 0x57, 0x78, 0x9f, 0xea, ++ 0x03, 0xbf, 0x89, 0xea, 0x85, 0xbb, 0x01, 0x7e, 0xa5, 0x44, 0xdb, 0x6b, ++ 0x4a, 0x0b, 0xc2, 0x4b, 0xd0, 0x43, 0xeb, 0x8b, 0xd4, 0x4e, 0xd1, 0xc5, ++ 0xad, 0x18, 0xff, 0x08, 0xff, 0x75, 0x24, 0x8f, 0xff, 0x50, 0x55, 0xe3, ++ 0x0e, 0xc5, 0xdf, 0xd0, 0x59, 0x94, 0x54, 0x43, 0xe4, 0xfe, 0x30, 0xcd, ++ 0x4a, 0x94, 0x90, 0x38, 0x5b, 0xf2, 0x22, 0xbb, 0xae, 0x3c, 0xb2, 0xd9, ++ 0xa9, 0xab, 0xef, 0xf4, 0xfa, 0x25, 0xe0, 0x2b, 0x67, 0x8b, 0xaa, 0x7b, ++ 0x1f, 0x94, 0x57, 0x6c, 0xbd, 0x23, 0xbd, 0x64, 0x0b, 0xe8, 0xff, 0x4d, ++ 0xa4, 0x07, 0xd7, 0x37, 0x8a, 0xcf, 0x67, 0x8c, 0xa4, 0x21, 0x7d, 0x5c, ++ 0x38, 0xfa, 0x49, 0x02, 0xc4, 0x25, 0x7f, 0xc0, 0xf9, 0x87, 0xae, 0xb7, ++ 0x05, 0xd7, 0xdb, 0xa2, 0x5d, 0x08, 0xa5, 0x0f, 0xb1, 0xde, 0x6b, 0xad, ++ 0xeb, 0x83, 0x95, 0x74, 0x3e, 0x94, 0xef, 0x3f, 0x02, 0xff, 0x9c, 0x3e, ++ 0x67, 0x3f, 0x70, 0x52, 0x1a, 0x8a, 0x70, 0xb7, 0x83, 0x3a, 0xa0, 0x7a, ++ 0x91, 0xb5, 0x1b, 0xf9, 0xf0, 0x31, 0xf4, 0x23, 0x47, 0x36, 0x77, 0xa3, ++ 0x1d, 0x3f, 0xa7, 0x65, 0xbf, 0x04, 0xfa, 0x8b, 0xca, 0x0d, 0x6c, 0xb7, ++ 0x69, 0xa5, 0x15, 0x9f, 0xcf, 0xac, 0xb4, 0xa3, 0x9f, 0x2f, 0xf0, 0x3b, ++ 0x82, 0xd6, 0x83, 0x3c, 0x25, 0x6f, 0x05, 0xc9, 0x86, 0x7d, 0x81, 0x81, ++ 0xf4, 0xd3, 0xc6, 0x8c, 0x41, 0xeb, 0xa7, 0x8d, 0x19, 0x61, 0xf4, 0x93, ++ 0xc9, 0x1a, 0x78, 0x13, 0xf6, 0xc1, 0x1b, 0x3b, 0x65, 0x15, 0xe8, 0x60, ++ 0xcd, 0xc3, 0x09, 0x98, 0xff, 0xf2, 0x5c, 0xbb, 0x84, 0xfb, 0x2e, 0x07, ++ 0x3b, 0x59, 0xfe, 0xdf, 0x73, 0xad, 0x51, 0xa8, 0x47, 0xc4, 0xb8, 0x5f, ++ 0xbe, 0x14, 0x87, 0xfb, 0x3f, 0x5f, 0xf2, 0x7d, 0x40, 0xd2, 0x15, 0x8f, ++ 0xf4, 0xdd, 0x14, 0xcf, 0x71, 0xb2, 0x36, 0x1e, 0xf7, 0xc9, 0x7b, 0xf9, ++ 0x3e, 0x64, 0x47, 0xba, 0xf6, 0x1f, 0x19, 0x21, 0xf2, 0xe0, 0xb9, 0xce, ++ 0x6f, 0x22, 0x41, 0x7f, 0xe4, 0x89, 0x3c, 0x5b, 0x83, 0xde, 0x01, 0x41, ++ 0x2c, 0xd1, 0xf6, 0xe0, 0x13, 0x01, 0x1d, 0xb7, 0xa6, 0x14, 0xad, 0x93, ++ 0x61, 0x5d, 0x77, 0x68, 0xe3, 0x22, 0x65, 0xe4, 0xf7, 0xdd, 0x8c, 0x5e, ++ 0x99, 0x7e, 0xfa, 0xe5, 0xae, 0x0a, 0x93, 0x16, 0x82, 0x9f, 0x0b, 0x1d, ++ 0x5f, 0xcf, 0x39, 0xa0, 0xf6, 0xdf, 0x5f, 0x12, 0xfb, 0x50, 0x62, 0x7f, ++ 0xea, 0x4d, 0xa7, 0xf6, 0x6a, 0x46, 0x88, 0xbc, 0x36, 0xee, 0x3b, 0x19, ++ 0xf7, 0x4b, 0xe4, 0x58, 0x2b, 0xe6, 0x69, 0xbb, 0xe4, 0x28, 0x97, 0xac, ++ 0xd7, 0xb7, 0x48, 0x87, 0x6b, 0x32, 0x98, 0x3e, 0x5d, 0xb3, 0x3f, 0x0a, ++ 0xe1, 0xb8, 0x26, 0x23, 0x06, 0xf7, 0x7b, 0xe9, 0x7c, 0x8f, 0xc0, 0x38, ++ 0x5d, 0x36, 0x0b, 0x19, 0x46, 0xdf, 0x5f, 0x38, 0x11, 0x83, 0xf5, 0xc4, ++ 0xfc, 0xe9, 0x7c, 0x0b, 0x8f, 0x86, 0x99, 0x6f, 0x93, 0x29, 0x30, 0xe7, ++ 0x80, 0xa4, 0x9b, 0xef, 0xb1, 0xab, 0xcf, 0x57, 0x9f, 0xcf, 0x2c, 0xe6, ++ 0xd7, 0x87, 0x1f, 0x1e, 0x2f, 0x90, 0x6d, 0x0a, 0xae, 0xa3, 0x97, 0x44, ++ 0xb9, 0x00, 0xaf, 0xed, 0x16, 0xd7, 0x09, 0x0d, 0xf4, 0xef, 0x3b, 0x51, ++ 0x2c, 0x7f, 0x8a, 0xe3, 0x6f, 0x39, 0xe7, 0xcd, 0x5e, 0x8a, 0x2f, 0x89, ++ 0xe2, 0xab, 0xb7, 0xe3, 0x42, 0x24, 0xd0, 0xf1, 0xc1, 0x74, 0xed, 0x24, ++ 0xcc, 0x43, 0x1e, 0x19, 0x88, 0x05, 0xff, 0xe5, 0x60, 0xe7, 0x85, 0x1c, ++ 0xe0, 0x97, 0x81, 0xf6, 0x0d, 0x95, 0x8c, 0x8a, 0xbf, 0x00, 0xbe, 0x20, ++ 0xff, 0x0f, 0xf1, 0x66, 0xd7, 0x2e, 0xec, 0x22, 0x8c, 0x2f, 0xb5, 0xab, ++ 0xb4, 0xcb, 0xc8, 0xa8, 0x38, 0x0b, 0xf5, 0xaf, 0x03, 0x3e, 0xdf, 0x5c, ++ 0x0f, 0x7c, 0x9a, 0x94, 0x98, 0x75, 0xa1, 0xf6, 0x97, 0xc4, 0xe5, 0xb3, ++ 0x91, 0x1e, 0xa5, 0xce, 0xfd, 0xff, 0x03, 0xfb, 0x01, 0x94, 0x1f, 0x31, ++ 0x1f, 0xd5, 0x3b, 0x8a, 0xf8, 0xd6, 0x50, 0xb8, 0xb5, 0x16, 0x70, 0xba, ++ 0x9c, 0x49, 0x54, 0x16, 0x9f, 0xd1, 0xd3, 0x4b, 0x47, 0xba, 0xc7, 0x9c, ++ 0xe9, 0x08, 0xf2, 0xf1, 0x55, 0xe0, 0x13, 0x09, 0xf5, 0x7e, 0x99, 0xee, ++ 0x89, 0x86, 0x27, 0xcc, 0x23, 0x79, 0x2c, 0xca, 0x29, 0x1b, 0x94, 0xa9, ++ 0x5e, 0xdb, 0x6b, 0x49, 0x0d, 0xda, 0x5b, 0xa3, 0xd3, 0x98, 0xdc, 0x0b, ++ 0xc4, 0x13, 0xcc, 0x5f, 0x31, 0xee, 0xf7, 0x66, 0x64, 0xcc, 0x48, 0xca, ++ 0xa4, 0x70, 0x4b, 0xcd, 0x56, 0x4d, 0xf6, 0xfc, 0xeb, 0xe2, 0x87, 0x91, ++ 0x99, 0x57, 0x85, 0x9f, 0x1f, 0xe9, 0xa2, 0x91, 0xc3, 0xa9, 0x11, 0xf6, ++ 0x19, 0x29, 0x5c, 0xc8, 0x3e, 0xf3, 0x59, 0x5d, 0xbe, 0x80, 0x01, 0x0e, ++ 0x07, 0xd3, 0x3d, 0x59, 0x0c, 0x0e, 0x41, 0x3a, 0x5b, 0xa3, 0x5e, 0x15, ++ 0x1e, 0x79, 0x0c, 0x1e, 0x5a, 0x21, 0xac, 0xc3, 0x66, 0xa6, 0xf4, 0x02, ++ 0x40, 0x99, 0x50, 0xef, 0xc4, 0xbc, 0x18, 0xd5, 0x7d, 0x37, 0xec, 0x7f, ++ 0xee, 0x5c, 0xc5, 0xe0, 0xd0, 0xfb, 0x22, 0x83, 0xc3, 0xee, 0x2e, 0x13, ++ 0xd2, 0xf5, 0x16, 0x92, 0x8b, 0xfc, 0x99, 0x6b, 0x3a, 0x3f, 0x07, 0xfa, ++ 0xa7, 0xf2, 0x67, 0x02, 0xf4, 0x53, 0xdc, 0xdd, 0x66, 0x82, 0x7c, 0xc2, ++ 0x0c, 0x9f, 0x6a, 0x82, 0xb8, 0x72, 0x4e, 0x77, 0xbb, 0xc9, 0x74, 0x75, ++ 0xba, 0x2d, 0xcb, 0x44, 0x7d, 0xa1, 0x4d, 0xca, 0x64, 0xf6, 0xc5, 0xfd, ++ 0x80, 0x87, 0xbc, 0x5d, 0x2c, 0x1e, 0x73, 0x15, 0xba, 0xad, 0xcc, 0x1c, ++ 0x7f, 0x5d, 0x70, 0xaf, 0xcd, 0x1c, 0x3f, 0x78, 0x39, 0x44, 0xe9, 0xca, ++ 0x13, 0x4a, 0x57, 0x83, 0xcd, 0x4b, 0xa2, 0xf4, 0x41, 0x92, 0x13, 0xfa, ++ 0xf7, 0x47, 0x48, 0x0f, 0xc6, 0xfd, 0xf7, 0xbf, 0x12, 0x81, 0xf2, 0x7e, ++ 0xf9, 0x1e, 0x09, 0xe5, 0xd3, 0xf2, 0xd7, 0x3f, 0x9b, 0x03, 0xf0, 0x5d, ++ 0xfe, 0x9b, 0x08, 0x24, 0xca, 0xaa, 0xdf, 0x44, 0xe2, 0xf7, 0xf3, 0xfb, ++ 0xd8, 0xf7, 0x2f, 0xcb, 0xc3, 0xef, 0x4f, 0xdf, 0x95, 0x99, 0x80, 0x7a, ++ 0xb6, 0xb1, 0xfd, 0x3e, 0x4f, 0xa8, 0x7e, 0x17, 0x76, 0xc3, 0x4f, 0xdd, ++ 0xe7, 0xed, 0xe9, 0x72, 0x70, 0x9f, 0x2f, 0x71, 0x1a, 0x3b, 0x6f, 0xb2, ++ 0x26, 0x52, 0xe4, 0x9b, 0xb2, 0xfd, 0xbe, 0x58, 0x4e, 0x67, 0x89, 0x23, ++ 0x3d, 0x6e, 0xd0, 0x53, 0x89, 0xd5, 0x2c, 0x9e, 0x14, 0x1b, 0xb3, 0x10, ++ 0xf7, 0xfb, 0xfa, 0x9f, 0x2b, 0x61, 0x7c, 0xeb, 0xe0, 0xed, 0xec, 0x76, ++ 0x15, 0xed, 0x07, 0xe3, 0x39, 0x13, 0x39, 0x8a, 0xe5, 0xe5, 0x39, 0xc8, ++ 0xfa, 0xaf, 0x00, 0x4e, 0x89, 0x35, 0xfa, 0xef, 0x8e, 0x98, 0x1a, 0xcc, ++ 0xc7, 0x73, 0x18, 0xf6, 0xff, 0x04, 0xbc, 0xbd, 0x99, 0xdc, 0x6e, 0xb6, ++ 0x10, 0x27, 0xca, 0x59, 0xc3, 0x3e, 0xbf, 0x78, 0xfe, 0x25, 0x93, 0xdb, ++ 0xeb, 0x6b, 0xe3, 0x4d, 0xa1, 0xf2, 0x04, 0xf4, 0x00, 0xc0, 0x75, 0x85, ++ 0xcd, 0x8a, 0xeb, 0x5e, 0xe1, 0x20, 0x89, 0xb5, 0x10, 0x57, 0xb0, 0x29, ++ 0x2e, 0x1c, 0xcb, 0xd0, 0x8f, 0x78, 0xc6, 0xbb, 0x4d, 0x44, 0x0d, 0x3d, ++ 0x2f, 0x53, 0x13, 0x45, 0xd4, 0x10, 0xbb, 0xc8, 0xe1, 0x49, 0xd0, 0x95, ++ 0x87, 0xce, 0x1a, 0xae, 0xab, 0x3f, 0x4c, 0x4b, 0xd5, 0x7d, 0x4f, 0x5e, ++ 0x94, 0xab, 0xfb, 0x3e, 0xb2, 0x79, 0xac, 0xae, 0x3c, 0xba, 0xe5, 0x06, ++ 0x5d, 0xfd, 0x14, 0x0a, 0x80, 0xd0, 0x72, 0xda, 0xba, 0x5b, 0x74, 0xf5, ++ 0x33, 0xda, 0x66, 0xe8, 0xca, 0x59, 0x9b, 0xee, 0xd6, 0xd5, 0xcf, 0xf1, ++ 0xcd, 0xd5, 0x7d, 0xcf, 0xdb, 0xb1, 0x44, 0xf7, 0xbd, 0xa0, 0x7d, 0x85, ++ 0xae, 0x3c, 0xa6, 0xe3, 0x07, 0xba, 0xfa, 0xf2, 0x00, 0xf6, 0xb8, 0x80, ++ 0xb3, 0x2c, 0xec, 0x71, 0x5b, 0xb1, 0x06, 0x74, 0x25, 0xdb, 0xac, 0x52, ++ 0xa8, 0xdd, 0xf2, 0x22, 0xaf, 0x57, 0x1e, 0x6b, 0x45, 0xf8, 0x3f, 0xc2, ++ 0xf5, 0xf5, 0x23, 0x36, 0x0b, 0xea, 0xeb, 0x47, 0xb8, 0xbe, 0xee, 0x72, ++ 0x94, 0x5c, 0x75, 0x5f, 0xe6, 0x9f, 0xf5, 0xdf, 0xde, 0x16, 0xf4, 0xc0, ++ 0xed, 0xb5, 0x0a, 0x1e, 0x2f, 0xfb, 0xf2, 0x80, 0xc5, 0x04, 0xf4, 0xb8, ++ 0xfc, 0x20, 0xa5, 0x8b, 0x31, 0x68, 0xaf, 0xbd, 0x9d, 0xc9, 0xec, 0xb5, ++ 0xe9, 0xf5, 0xb8, 0xfa, 0x80, 0x05, 0xe4, 0x5e, 0xf7, 0x00, 0xf9, 0x20, ++ 0xef, 0x65, 0x72, 0x3f, 0x43, 0xa1, 0x7e, 0x4c, 0x18, 0x7f, 0xf0, 0x93, ++ 0x4c, 0x55, 0x17, 0xb7, 0x13, 0xfe, 0x03, 0x95, 0x6b, 0xef, 0x73, 0xfd, ++ 0xc2, 0xfc, 0x26, 0xd2, 0x2c, 0x83, 0x1c, 0x10, 0x72, 0xa9, 0x29, 0x9a, ++ 0xa0, 0x9d, 0xd7, 0x14, 0x6d, 0xc7, 0x3c, 0x9f, 0xde, 0xd8, 0x4b, 0x99, ++ 0xc0, 0x4f, 0x54, 0x5e, 0x7d, 0x0c, 0xed, 0xba, 0xb3, 0x9f, 0x68, 0x3e, ++ 0x00, 0x72, 0xaa, 0x33, 0x02, 0xe5, 0xd4, 0x5b, 0xd9, 0x9f, 0xa0, 0x3f, ++ 0x7e, 0x4b, 0xcb, 0x42, 0x6c, 0xff, 0x62, 0xa6, 0x9d, 0xe1, 0xc5, 0xe2, ++ 0x52, 0xed, 0x28, 0xa7, 0xf4, 0xfa, 0xf7, 0xa8, 0xb9, 0xbb, 0x16, 0xf0, ++ 0x70, 0x74, 0xbc, 0x4c, 0x56, 0x81, 0x1d, 0xe4, 0x2a, 0x1d, 0x4a, 0xae, ++ 0x02, 0xf7, 0x77, 0xc0, 0xdf, 0xa6, 0x76, 0xf2, 0xb6, 0x2c, 0x82, 0xfd, ++ 0x5e, 0xcb, 0x5f, 0x3d, 0xba, 0x72, 0x11, 0xe6, 0x4d, 0x0f, 0xd4, 0xdf, ++ 0xd1, 0xa2, 0x48, 0x8c, 0x9b, 0xd6, 0x02, 0x5d, 0x85, 0x8c, 0x1b, 0x9d, ++ 0xc5, 0xe0, 0x99, 0xc1, 0x9f, 0xd4, 0x10, 0x45, 0xbf, 0xf3, 0xdc, 0xaf, ++ 0x6d, 0x3e, 0x2f, 0xf8, 0x4b, 0x63, 0xdf, 0x8d, 0x25, 0x36, 0xc8, 0x93, ++ 0xf9, 0xe3, 0x38, 0x2f, 0xe8, 0x23, 0xd2, 0x7d, 0x3f, 0xec, 0xdf, 0x7b, ++ 0xbf, 0x8e, 0xc1, 0xb8, 0x4e, 0x6d, 0xd1, 0xbb, 0xe3, 0x56, 0x61, 0xbe, ++ 0xa8, 0x9b, 0xf9, 0x7d, 0x13, 0xd8, 0x9a, 0x6f, 0x7a, 0xf9, 0xed, 0x58, ++ 0xf0, 0xd7, 0x6b, 0x77, 0x1f, 0x4c, 0xf2, 0x86, 0xe0, 0xd1, 0xe8, 0xef, ++ 0x65, 0xf0, 0xf5, 0x11, 0xa5, 0x27, 0x13, 0xf3, 0x4e, 0x5f, 0x3d, 0x33, ++ 0x44, 0xa5, 0xcf, 0xda, 0x57, 0x0e, 0x25, 0xb1, 0xb8, 0x92, 0x3e, 0xff, ++ 0xc5, 0xe8, 0xe7, 0xd7, 0xb6, 0x2c, 0xd7, 0xd1, 0x67, 0xe3, 0xa5, 0x48, ++ 0x5d, 0x1e, 0x4c, 0xa3, 0xd2, 0x6d, 0x01, 0x7c, 0x34, 0x5e, 0x8a, 0xc1, ++ 0xf7, 0xbd, 0x99, 0xfa, 0x38, 0xc0, 0x80, 0xf0, 0x1a, 0x24, 0x3c, 0x8d, ++ 0xef, 0x05, 0x3c, 0x8f, 0x16, 0x9d, 0x19, 0x05, 0x71, 0xfa, 0x2f, 0x23, ++ 0xc3, 0xd3, 0xf1, 0x6d, 0xbc, 0x9e, 0x28, 0x1b, 0xcf, 0x2f, 0x0c, 0x94, ++ 0x27, 0x3f, 0x81, 0xb7, 0xbb, 0xe0, 0x9a, 0x38, 0x14, 0xe2, 0x4c, 0xb5, ++ 0x16, 0x7f, 0xfa, 0x60, 0xe2, 0x12, 0x02, 0x4e, 0x6f, 0x5d, 0x6e, 0xc0, ++ 0x73, 0x11, 0xbf, 0x1e, 0xe0, 0x5c, 0x44, 0x51, 0x16, 0xdb, 0x37, 0xf9, ++ 0x75, 0xf6, 0x02, 0xcc, 0x6b, 0x9e, 0x68, 0x6d, 0xae, 0x04, 0xfd, 0x3d, ++ 0x91, 0xc7, 0x3f, 0xc3, 0xe4, 0x35, 0x57, 0x67, 0x81, 0x9d, 0x7b, 0xe2, ++ 0x5f, 0x93, 0xd7, 0x3c, 0x3d, 0x8b, 0xe3, 0x87, 0xe7, 0x0d, 0x0f, 0xcf, ++ 0x52, 0xc3, 0xe6, 0x35, 0x5f, 0xeb, 0xdc, 0xc9, 0x54, 0x0b, 0x95, 0x4b, ++ 0x61, 0xf8, 0x2b, 0xb7, 0x0f, 0x7e, 0x7f, 0x9a, 0x39, 0x8e, 0xd2, 0xf1, ++ 0xfd, 0xbf, 0x30, 0xdb, 0x61, 0x5e, 0x0d, 0xa0, 0xf3, 0x20, 0xde, 0xb2, ++ 0xc5, 0x8c, 0xf1, 0xd7, 0xb7, 0x2f, 0x47, 0x10, 0x88, 0x87, 0x7f, 0xb6, ++ 0xd9, 0xfc, 0x3c, 0xe4, 0xbb, 0x2c, 0xfa, 0xc5, 0xc1, 0x11, 0x4f, 0x40, ++ 0xfc, 0xbb, 0x28, 0x02, 0xf3, 0xf1, 0x1a, 0xb6, 0x98, 0x59, 0xbc, 0xb6, ++ 0x28, 0xd2, 0x07, 0x21, 0x87, 0x45, 0x5b, 0xbe, 0x37, 0x04, 0xf2, 0x2e, ++ 0xbf, 0xa0, 0x7c, 0xbb, 0x8c, 0xce, 0xab, 0xe1, 0x17, 0x0e, 0xcc, 0x07, ++ 0x7a, 0xbb, 0xeb, 0xb1, 0x21, 0x80, 0xa7, 0x33, 0x9c, 0x9f, 0x17, 0x7d, ++ 0xfb, 0xe3, 0x3b, 0x00, 0xfe, 0xbb, 0x2d, 0xf6, 0xbc, 0x22, 0xfa, 0x5c, ++ 0xb6, 0x4b, 0xd2, 0xe5, 0x99, 0x2f, 0xd9, 0x16, 0xa9, 0x2b, 0x8b, 0x7c, ++ 0x22, 0x81, 0x3f, 0x22, 0x05, 0xf3, 0xcf, 0x55, 0x2a, 0x4f, 0x5b, 0xb2, ++ 0xf4, 0xe7, 0x68, 0xc6, 0x05, 0xf7, 0x25, 0x5a, 0xb2, 0xb8, 0x5c, 0xbd, ++ 0x9d, 0xce, 0x77, 0xf9, 0xf8, 0x0b, 0x16, 0xc0, 0xe3, 0xc1, 0xc3, 0x51, ++ 0x38, 0xef, 0x37, 0x62, 0x64, 0xf4, 0x73, 0xfd, 0x45, 0x7f, 0xfd, 0xdd, ++ 0x18, 0x5a, 0xae, 0xfc, 0x56, 0xc1, 0xbc, 0x7e, 0x63, 0x7e, 0x12, 0x21, ++ 0x88, 0x74, 0xb2, 0x90, 0xe7, 0x11, 0x56, 0xbe, 0xa2, 0xf4, 0x9d, 0x03, ++ 0x80, 0xb2, 0x7f, 0x65, 0x33, 0xf2, 0x09, 0x6d, 0x17, 0x53, 0x1d, 0x92, ++ 0x6f, 0x5d, 0xf9, 0x73, 0xe6, 0x4f, 0x57, 0x46, 0xb2, 0x3c, 0xe0, 0x01, ++ 0xf3, 0x96, 0x0c, 0xf9, 0x4a, 0xe2, 0x9c, 0x45, 0xbf, 0x3c, 0xa5, 0xe0, ++ 0x39, 0x0b, 0x9d, 0x9d, 0x22, 0xe8, 0xe6, 0xa9, 0x2c, 0x3d, 0x5f, 0x1f, ++ 0x3c, 0xcc, 0xf2, 0x92, 0x16, 0x1e, 0xe5, 0x76, 0xe5, 0x35, 0xe4, 0xe6, ++ 0x3b, 0xb0, 0x8e, 0x0c, 0xc0, 0xd7, 0x5b, 0x75, 0xb0, 0x6f, 0xf9, 0x36, ++ 0x87, 0xc6, 0xdb, 0x97, 0x3f, 0x5b, 0x3b, 0x8c, 0x96, 0x3f, 0x9b, 0x20, ++ 0x41, 0x64, 0x8e, 0x7c, 0x76, 0x39, 0x3c, 0xdf, 0x7c, 0x26, 0xf4, 0x12, ++ 0x9c, 0x0f, 0xc8, 0x0e, 0xe2, 0x67, 0x9a, 0x6b, 0x71, 0x5f, 0x19, 0xd8, ++ 0xf2, 0xd6, 0x09, 0xf7, 0xe9, 0xce, 0x2d, 0x0c, 0x5e, 0xde, 0x5c, 0x5d, ++ 0x9e, 0xdc, 0x95, 0x65, 0xc1, 0xf1, 0x8d, 0xf2, 0xdd, 0x48, 0xf7, 0xff, ++ 0xbf, 0xe4, 0x7b, 0x6d, 0xd1, 0xa1, 0x51, 0x5e, 0x1b, 0x3e, 0x5f, 0x80, ++ 0xe7, 0xd9, 0xdd, 0x4c, 0x3e, 0x1a, 0xf9, 0xdc, 0x28, 0xcf, 0x73, 0x0d, ++ 0x72, 0x30, 0x28, 0xc7, 0x65, 0x9d, 0x1c, 0xcf, 0xe5, 0x72, 0x20, 0x28, ++ 0xcf, 0x2d, 0xf8, 0x9d, 0x9a, 0x69, 0xb8, 0x1e, 0x6f, 0x89, 0xe2, 0x5b, ++ 0x23, 0xa1, 0xff, 0xf3, 0x1e, 0xd0, 0x7d, 0x7e, 0x8c, 0x9a, 0x58, 0x4e, ++ 0x9b, 0xac, 0xb5, 0xa7, 0x46, 0x6b, 0x57, 0xf7, 0x47, 0xff, 0x2f, 0xd4, ++ 0xef, 0x4a, 0xd1, 0x3e, 0xca, 0xa2, 0x7c, 0x34, 0xfa, 0x97, 0xb9, 0x55, ++ 0x60, 0x8c, 0xe7, 0xed, 0x6a, 0x33, 0x01, 0xff, 0xf6, 0x0e, 0x60, 0x87, ++ 0x14, 0xa4, 0x1a, 0xf2, 0x82, 0x78, 0x7c, 0x48, 0x7c, 0x3f, 0x9b, 0x55, ++ 0x5e, 0x00, 0xf9, 0xaa, 0x7b, 0x54, 0xf6, 0x14, 0xfc, 0x59, 0x4c, 0x99, ++ 0x90, 0xef, 0x2f, 0x9f, 0xcd, 0x62, 0xfb, 0xcb, 0x3f, 0x01, 0xbb, 0x67, ++ 0xf9, 0x7f, 0x5e, 0x44, 0xfe, 0xdc, 0x12, 0xa5, 0x39, 0x15, 0x58, 0xcf, ++ 0x70, 0x8b, 0x2b, 0x74, 0xff, 0x56, 0x3c, 0x2f, 0x72, 0x7e, 0x1f, 0xf8, ++ 0x7c, 0xad, 0x3e, 0xdf, 0xf9, 0x74, 0x3a, 0x61, 0x78, 0xcf, 0xce, 0xd6, ++ 0xed, 0xcf, 0x80, 0x7f, 0x8f, 0xf9, 0x01, 0x07, 0xa2, 0x10, 0x6e, 0xcf, ++ 0x3a, 0xdd, 0x97, 0x01, 0x0e, 0xed, 0x4e, 0xf7, 0xb7, 0x30, 0xaf, 0x32, ++ 0xa7, 0xfb, 0x1f, 0x59, 0x21, 0x78, 0x59, 0xcb, 0xd7, 0xa9, 0x98, 0xf4, ++ 0x71, 0x6b, 0xf1, 0x2c, 0xcd, 0x16, 0xf4, 0xef, 0x41, 0x3d, 0xbe, 0xa0, ++ 0x22, 0xbc, 0xfc, 0x4d, 0xcd, 0x66, 0x79, 0xc1, 0xe5, 0x4f, 0xdf, 0x35, ++ 0x0a, 0xec, 0xce, 0xbf, 0xec, 0xbf, 0x7b, 0x14, 0xc8, 0xc7, 0xae, 0xa7, ++ 0x4a, 0xaf, 0x6a, 0x87, 0x6e, 0xe0, 0xfc, 0xf9, 0x6f, 0x5c, 0xee, 0xc7, ++ 0xf3, 0xb8, 0xe3, 0x4f, 0x81, 0x6f, 0x68, 0x39, 0x01, 0xe2, 0x96, 0xb4, ++ 0xfd, 0x02, 0x8b, 0x27, 0x33, 0x3e, 0xa4, 0x1f, 0x73, 0x76, 0x3c, 0xdb, ++ 0xef, 0x2e, 0xff, 0x83, 0x27, 0x8d, 0xc2, 0xe5, 0xd4, 0x7a, 0x19, 0xe5, ++ 0xf7, 0xa9, 0x18, 0x16, 0x67, 0xfc, 0x24, 0x46, 0xa9, 0xd9, 0xc6, 0xdb, ++ 0x25, 0xe9, 0xda, 0xb1, 0x79, 0xca, 0x40, 0xf7, 0x94, 0x8f, 0x95, 0x18, ++ 0x45, 0x77, 0x5e, 0xa2, 0x14, 0x68, 0xda, 0x31, 0xf0, 0x3a, 0x4b, 0xb3, ++ 0x99, 0x1e, 0xb5, 0x10, 0x97, 0x15, 0xda, 0x5b, 0x0e, 0xdc, 0x62, 0x05, ++ 0xfc, 0xca, 0x92, 0xdb, 0xce, 0xf2, 0xd2, 0x19, 0x3d, 0x4c, 0xa4, 0x23, ++ 0x00, 0x3d, 0xfc, 0x98, 0xcb, 0xb1, 0xbf, 0x3b, 0xb5, 0xa2, 0x6c, 0x6c, ++ 0xc7, 0xf4, 0xed, 0x44, 0xae, 0x6f, 0x95, 0x18, 0x83, 0x7e, 0x1d, 0x11, ++ 0x5e, 0x9e, 0x89, 0xe7, 0x4b, 0x4e, 0x77, 0x09, 0xf4, 0x73, 0xa7, 0xd3, ++ 0x5d, 0x9a, 0xed, 0x80, 0xb8, 0x17, 0xc9, 0x03, 0xbe, 0x69, 0x8f, 0x0a, ++ 0x9f, 0xe7, 0x73, 0x13, 0xc7, 0xdf, 0xdf, 0x85, 0x3d, 0x46, 0x62, 0xd0, ++ 0x6f, 0xc6, 0xf1, 0x64, 0xdc, 0x57, 0x75, 0x67, 0x63, 0x5c, 0xcb, 0x53, ++ 0x01, 0xfd, 0xc1, 0xbe, 0xaa, 0x59, 0x02, 0x3e, 0xb0, 0xf3, 0xfa, 0x6e, ++ 0x89, 0xc5, 0x2b, 0x3c, 0x37, 0xc3, 0x77, 0xe2, 0x74, 0x4b, 0xd3, 0x28, ++ 0xbc, 0x4b, 0xfe, 0x4c, 0xf0, 0x3c, 0xc7, 0xde, 0x23, 0x15, 0x12, 0xec, ++ 0xff, 0x26, 0x75, 0x57, 0x49, 0x20, 0xc7, 0x92, 0x38, 0xfe, 0x8c, 0xf3, ++ 0xe8, 0xe1, 0x70, 0xdb, 0xc3, 0xf3, 0x25, 0xfa, 0xf3, 0x1d, 0xf3, 0x2b, ++ 0x66, 0x70, 0xf8, 0xef, 0x51, 0x3d, 0xc8, 0x5f, 0xad, 0x29, 0x9a, 0x13, ++ 0xfc, 0x55, 0xc8, 0xcb, 0x03, 0xbc, 0x1a, 0xf3, 0x2c, 0x7e, 0x99, 0xcd, ++ 0xf6, 0xd5, 0xb6, 0x44, 0xf5, 0xe0, 0xfe, 0xa0, 0xf7, 0x6e, 0x82, 0xf9, ++ 0x77, 0x43, 0xcb, 0xbc, 0x12, 0xe4, 0x0f, 0x25, 0xd7, 0xb6, 0x95, 0x53, ++ 0x8c, 0x93, 0xf9, 0xd9, 0xcc, 0x9f, 0x4f, 0xa8, 0xd1, 0x9c, 0xe0, 0x87, ++ 0x0f, 0x77, 0x5a, 0xf0, 0x9e, 0x8a, 0xc1, 0xf2, 0x5b, 0x7e, 0xbb, 0x1b, ++ 0xe3, 0x25, 0xc5, 0x1a, 0x3b, 0xaf, 0xbc, 0xa9, 0xdb, 0x1b, 0x99, 0x49, ++ 0xe7, 0x35, 0xa4, 0x5b, 0x2b, 0xb7, 0xd0, 0x67, 0x7a, 0xce, 0x10, 0x5c, ++ 0xdf, 0x50, 0xd2, 0xbc, 0x8a, 0xf9, 0x09, 0xaa, 0x2e, 0xbf, 0xa9, 0x58, ++ 0xab, 0xc0, 0x7d, 0x72, 0x31, 0xef, 0x92, 0xf9, 0xcd, 0x6b, 0x2c, 0x2a, ++ 0xe6, 0xc3, 0xac, 0xc8, 0x0e, 0xf1, 0x6b, 0x92, 0x97, 0x79, 0xc3, 0xe6, ++ 0x3b, 0x19, 0xf7, 0xb9, 0xd7, 0x08, 0xbe, 0xe4, 0xf9, 0x08, 0xc5, 0x3c, ++ 0xff, 0xa0, 0x78, 0xdb, 0x53, 0x98, 0x4f, 0x50, 0xbc, 0xed, 0x66, 0x45, ++ 0x0a, 0x91, 0x33, 0x9b, 0xb2, 0xcd, 0xb8, 0xfe, 0x33, 0x87, 0x96, 0x8c, ++ 0x86, 0xf5, 0x0f, 0x94, 0xc7, 0xda, 0x96, 0xcd, 0xf0, 0xf0, 0xfd, 0x6c, ++ 0x26, 0x5f, 0x06, 0xca, 0x1f, 0x5b, 0xdf, 0x27, 0x17, 0xfa, 0xe5, 0x8f, ++ 0xad, 0xcf, 0x76, 0x84, 0xe4, 0xd7, 0x34, 0x9e, 0x47, 0xf9, 0xd7, 0x98, ++ 0xcd, 0xe4, 0xfc, 0xb3, 0x90, 0x57, 0x43, 0xe1, 0xfa, 0xec, 0x7c, 0x91, ++ 0x57, 0xb3, 0x45, 0x82, 0xf5, 0xee, 0xb5, 0xb4, 0x4f, 0xd9, 0x05, 0xf3, ++ 0x5a, 0x6e, 0xc2, 0x3c, 0xa6, 0xbe, 0xbc, 0xa2, 0xf9, 0x2c, 0xcf, 0xad, ++ 0xaf, 0x3d, 0xe4, 0x17, 0xd1, 0xf7, 0xcf, 0x2e, 0x62, 0xf9, 0x45, 0xc3, ++ 0x7c, 0x1b, 0x70, 0x5f, 0xe2, 0x62, 0x24, 0xcb, 0xa3, 0xb8, 0xb8, 0x3d, ++ 0x82, 0xc0, 0xb9, 0xa4, 0x67, 0xb7, 0x6d, 0x1c, 0x02, 0xe7, 0x10, 0x9f, ++ 0xd5, 0x4c, 0x68, 0x07, 0x1a, 0xe7, 0x0f, 0x07, 0x82, 0x78, 0x5e, 0xa4, ++ 0x19, 0xf2, 0x25, 0x01, 0x8f, 0x20, 0xaf, 0x04, 0xfe, 0xfa, 0xf2, 0x8f, ++ 0x78, 0xfe, 0x5e, 0xd7, 0xf6, 0x97, 0x71, 0xde, 0x62, 0x3e, 0x94, 0x50, ++ 0x2c, 0x00, 0xf7, 0xf4, 0x1c, 0x36, 0xaf, 0x25, 0x3b, 0x76, 0x4f, 0x01, ++ 0xe2, 0x1f, 0xbe, 0x2c, 0x41, 0x82, 0xb8, 0x9d, 0x98, 0xd7, 0xb5, 0xe4, ++ 0xfe, 0x4b, 0x9c, 0x2f, 0x06, 0x4b, 0x87, 0x2f, 0xe4, 0x30, 0xfe, 0x08, ++ 0xa3, 0x1f, 0x5f, 0xcd, 0xbe, 0x3e, 0xfd, 0xf8, 0x06, 0xe0, 0x89, 0xea, ++ 0xc7, 0x03, 0xd0, 0xee, 0xba, 0xf5, 0x23, 0xd7, 0x8b, 0x42, 0x4f, 0x8a, ++ 0xef, 0xdd, 0x9c, 0x2e, 0x66, 0x66, 0x0f, 0xa8, 0x1f, 0xbb, 0xb3, 0xc3, ++ 0xe8, 0x47, 0x15, 0xf2, 0x9e, 0x31, 0xef, 0xc8, 0xe4, 0xda, 0x1e, 0x06, ++ 0x5f, 0x33, 0x78, 0xbf, 0x37, 0xba, 0xb5, 0x4a, 0xe0, 0xe7, 0xa2, 0x34, ++ 0xed, 0x4f, 0xd0, 0xcf, 0xc4, 0x09, 0xbe, 0x83, 0x10, 0x07, 0x2d, 0xad, ++ 0xf1, 0x1e, 0x04, 0x7e, 0x2f, 0x96, 0xf8, 0x79, 0xeb, 0x29, 0x4c, 0x0e, ++ 0x24, 0xf6, 0x90, 0xfd, 0x10, 0x83, 0x8b, 0x3f, 0xd1, 0xe3, 0x86, 0x3c, ++ 0xe5, 0xaa, 0x6c, 0x96, 0x6f, 0x71, 0xc3, 0x69, 0x37, 0xee, 0xb3, 0xc7, ++ 0x79, 0x88, 0x04, 0xed, 0xc5, 0x3d, 0x06, 0x6d, 0x09, 0xec, 0xbc, 0xb3, ++ 0x71, 0xfc, 0x49, 0x9c, 0x2f, 0x4c, 0x4f, 0x06, 0x30, 0x1f, 0x2e, 0xa9, ++ 0x33, 0x7c, 0x5e, 0x6a, 0x41, 0x2a, 0xb3, 0xd7, 0xa8, 0xbc, 0x3c, 0x0b, ++ 0x70, 0x2d, 0x19, 0x4d, 0xe5, 0x69, 0x4a, 0x7f, 0x79, 0x1a, 0x06, 0x7f, ++ 0x17, 0xa0, 0x7e, 0xce, 0x2e, 0xff, 0x01, 0xa8, 0x35, 0x36, 0x3e, 0x3d, ++ 0x1a, 0xcc, 0xaa, 0xab, 0xe0, 0xef, 0xaf, 0x0c, 0x7f, 0xee, 0x4b, 0xf0, ++ 0x14, 0xf8, 0xca, 0xbd, 0x22, 0xeb, 0xe2, 0x78, 0x02, 0x5f, 0x57, 0xf8, ++ 0xfc, 0x6f, 0xcd, 0x70, 0xff, 0x03, 0xc6, 0x39, 0xcc, 0xf9, 0x7b, 0x20, ++ 0x3c, 0xc6, 0xe6, 0x50, 0xfc, 0x8d, 0x07, 0xfa, 0x66, 0x78, 0x14, 0x79, ++ 0xc0, 0x3b, 0x0d, 0x76, 0x6a, 0x45, 0x0e, 0xc3, 0xcb, 0xe4, 0x1c, 0x7d, ++ 0x5c, 0x28, 0x04, 0xdf, 0xb1, 0x39, 0xe3, 0xfb, 0xe3, 0x5b, 0xc8, 0xf1, ++ 0xbd, 0x47, 0xf6, 0xc8, 0x80, 0xb7, 0x92, 0xaa, 0xb6, 0x35, 0x80, 0x07, ++ 0x8a, 0xd7, 0xa4, 0x1c, 0xda, 0xcf, 0x0d, 0x65, 0xfa, 0xfc, 0x4f, 0x23, ++ 0x5e, 0x85, 0x3c, 0x34, 0xe2, 0xd7, 0x88, 0x57, 0x91, 0x07, 0x48, 0xf1, ++ 0x31, 0x3a, 0x27, 0x8c, 0xfe, 0x12, 0xfd, 0x18, 0xf5, 0x58, 0x88, 0x9c, ++ 0xe0, 0xfb, 0xce, 0x6a, 0x5f, 0x7e, 0x07, 0xd8, 0xcf, 0x22, 0x4f, 0x5c, ++ 0xac, 0x43, 0xf0, 0xcf, 0x24, 0x0e, 0x8f, 0x1b, 0x35, 0xad, 0xd2, 0xc2, ++ 0xe8, 0xb4, 0x10, 0xc6, 0x9d, 0x38, 0xcb, 0x77, 0xd0, 0x0c, 0x74, 0xba, ++ 0xc8, 0x7b, 0xd0, 0x12, 0x4a, 0xa7, 0x8b, 0x09, 0xdb, 0xaf, 0xe2, 0xf3, ++ 0x48, 0xee, 0xf1, 0xe2, 0x7a, 0x86, 0x9d, 0xd0, 0xca, 0xe1, 0x79, 0xc3, ++ 0x69, 0x3f, 0xde, 0xe3, 0x31, 0xb4, 0x99, 0xae, 0x87, 0x04, 0xd7, 0x33, ++ 0xb2, 0xfb, 0x38, 0xe6, 0x63, 0xc2, 0xbe, 0x2c, 0xc4, 0x9b, 0xf6, 0x1e, ++ 0x39, 0x80, 0xf3, 0x1e, 0xd1, 0xdd, 0xc5, 0x9e, 0x3c, 0x8f, 0xc8, 0xa8, ++ 0x6f, 0x83, 0xf9, 0xb7, 0xac, 0x9f, 0x17, 0xb8, 0xfc, 0x6a, 0x3d, 0xc7, ++ 0xf2, 0xf8, 0x5a, 0xcb, 0x99, 0xbe, 0xbd, 0x37, 0xc3, 0x5d, 0x99, 0x83, ++ 0x7c, 0xec, 0xae, 0x82, 0xf9, 0xaf, 0xc8, 0x70, 0x57, 0x43, 0xb9, 0x20, ++ 0x95, 0xd1, 0x4d, 0x6c, 0x8e, 0xfb, 0x66, 0x28, 0x8f, 0x1c, 0x40, 0xdf, ++ 0xdf, 0x9a, 0xd3, 0xb7, 0x4f, 0x3d, 0x1d, 0xea, 0x25, 0x3d, 0x40, 0xbc, ++ 0xe2, 0x1e, 0x14, 0x88, 0xc3, 0x27, 0x41, 0x24, 0x10, 0xb6, 0xf0, 0x9b, ++ 0xbd, 0x92, 0x85, 0xc2, 0x35, 0xc9, 0x4d, 0xd0, 0xef, 0x1c, 0x9d, 0xa8, ++ 0xad, 0x82, 0xbc, 0xb7, 0xc0, 0x44, 0xe2, 0x82, 0x7c, 0x80, 0xb8, 0x3a, ++ 0x7b, 0x39, 0xc0, 0x2b, 0x61, 0x91, 0x6b, 0x3f, 0xc0, 0xb3, 0xf5, 0x1c, ++ 0xbf, 0xcf, 0xe5, 0x3e, 0x82, 0xe7, 0xbd, 0xfa, 0xf2, 0xab, 0xb4, 0x54, ++ 0xcc, 0xa7, 0x00, 0xfe, 0x0d, 0xe5, 0x97, 0x7a, 0x3e, 0x8f, 0xfa, 0x1c, ++ 0xc6, 0x07, 0xd4, 0xde, 0x99, 0x93, 0xc3, 0xe6, 0xa5, 0xc1, 0xbc, 0x84, ++ 0xbd, 0x23, 0xf8, 0x72, 0x20, 0xfb, 0x25, 0x84, 0xaf, 0x1b, 0xa0, 0xfd, ++ 0x75, 0xf0, 0xf5, 0xf2, 0x9c, 0xeb, 0xe3, 0xeb, 0x15, 0x39, 0x8c, 0xaf, ++ 0xef, 0x87, 0x76, 0xd7, 0xe2, 0xeb, 0x1f, 0xe4, 0xf4, 0xf1, 0xf5, 0x43, ++ 0xd0, 0xee, 0x5a, 0x7c, 0xfd, 0x28, 0xe7, 0xeb, 0x17, 0xae, 0xc1, 0xd7, ++ 0x3b, 0x78, 0xbf, 0xff, 0xc5, 0xeb, 0x87, 0xe1, 0xeb, 0x47, 0xc3, 0xf1, ++ 0xb5, 0xca, 0xe9, 0x4e, 0xf0, 0xc5, 0x9e, 0x23, 0x63, 0xa3, 0x21, 0x5f, ++ 0x60, 0x1b, 0xef, 0x2f, 0x44, 0x7e, 0x6f, 0x80, 0xf6, 0xd7, 0x92, 0xdf, ++ 0xff, 0x04, 0x9f, 0x6f, 0x86, 0x7e, 0xaf, 0x65, 0xa7, 0x8a, 0x7e, 0x05, ++ 0xbe, 0xaf, 0xc5, 0x27, 0xb1, 0xb9, 0x1e, 0x84, 0x83, 0xb0, 0x47, 0x4f, ++ 0xa7, 0x33, 0xbc, 0x0b, 0xbe, 0xa7, 0xfc, 0xf2, 0x9f, 0x00, 0x7f, 0xca, ++ 0x2f, 0x3b, 0x39, 0xbf, 0xfc, 0x92, 0xf1, 0x8b, 0x8a, 0xf5, 0x8c, 0xfc, ++ 0xd5, 0xa7, 0xef, 0xba, 0x4d, 0xfc, 0x1e, 0x11, 0x7b, 0x74, 0x68, 0xdc, ++ 0xfb, 0xcd, 0x9c, 0x7e, 0xfa, 0xee, 0xe5, 0x9c, 0x30, 0xfa, 0x6e, 0x24, ++ 0xe1, 0xf0, 0xaa, 0x61, 0x72, 0x64, 0x04, 0xf1, 0xca, 0xb1, 0xd0, 0x6f, ++ 0xad, 0x1d, 0xcb, 0xf6, 0xb3, 0x76, 0x74, 0xf3, 0x63, 0x4f, 0x05, 0xbc, ++ 0x00, 0xb7, 0xf7, 0x72, 0x98, 0xbd, 0x51, 0x3c, 0x40, 0x3c, 0xe1, 0x77, ++ 0x9c, 0x4f, 0x92, 0xba, 0x2b, 0x50, 0xbe, 0x50, 0x78, 0x1e, 0xca, 0x09, ++ 0xd1, 0x63, 0x49, 0xc4, 0x3e, 0x15, 0xfc, 0x9c, 0xcf, 0x73, 0xd8, 0xba, ++ 0xc6, 0x4d, 0x70, 0x1f, 0x04, 0xb9, 0x64, 0x77, 0x7b, 0x30, 0x9f, 0xdb, ++ 0x91, 0xcb, 0xe0, 0x22, 0xe0, 0x44, 0xdb, 0xbf, 0x13, 0x4e, 0xee, 0xee, ++ 0x03, 0x7c, 0xe4, 0xf7, 0xf7, 0x1b, 0x8c, 0x78, 0x38, 0xc8, 0xe7, 0xfb, ++ 0x39, 0xa7, 0x1f, 0x63, 0xff, 0x42, 0xfe, 0x40, 0xff, 0x05, 0xd8, 0xbf, ++ 0x6a, 0x82, 0xfe, 0x45, 0xfb, 0x3f, 0x07, 0xe5, 0xd0, 0x47, 0xb0, 0x8e, ++ 0xd2, 0x07, 0x9a, 0x65, 0x58, 0x57, 0x12, 0x71, 0x47, 0x83, 0xfc, 0x11, ++ 0x72, 0x92, 0x8c, 0xa0, 0xed, 0x8b, 0xfb, 0xb7, 0xff, 0x34, 0xd8, 0xfe, ++ 0x53, 0x58, 0x47, 0x69, 0x33, 0x6d, 0x9f, 0x1f, 0x6c, 0x3f, 0x92, 0xf8, ++ 0x31, 0x5f, 0x27, 0x61, 0x11, 0x95, 0x53, 0x04, 0xec, 0x77, 0x17, 0xda, ++ 0xb3, 0xeb, 0x55, 0xcf, 0xb9, 0x1c, 0x9c, 0x27, 0x61, 0xf2, 0xaa, 0xdc, ++ 0x84, 0xf2, 0x20, 0x2b, 0xdd, 0x8d, 0x7c, 0x17, 0x4e, 0xff, 0x43, 0xfd, ++ 0xeb, 0xd1, 0xff, 0xb0, 0x1e, 0xd0, 0xff, 0x83, 0x91, 0x13, 0x57, 0x38, ++ 0x3d, 0x81, 0xfe, 0x87, 0x71, 0x3e, 0xce, 0xba, 0x86, 0xfe, 0xcf, 0x65, ++ 0xeb, 0x8e, 0xcb, 0xbd, 0xba, 0x9c, 0x88, 0xcf, 0x65, 0xfd, 0x3a, 0x72, ++ 0x07, 0xd6, 0xff, 0xb9, 0x61, 0xe4, 0xc4, 0x1e, 0xd5, 0x8d, 0xfc, 0x14, ++ 0x86, 0x8f, 0x12, 0x72, 0x1d, 0x10, 0x67, 0x71, 0x27, 0x42, 0x3b, 0xca, ++ 0x47, 0x49, 0x50, 0x16, 0x7a, 0x87, 0xb6, 0x1b, 0x02, 0xef, 0xd7, 0xab, ++ 0x0c, 0x8e, 0xeb, 0x6b, 0x4d, 0xd9, 0x68, 0x5f, 0x93, 0x28, 0x57, 0x38, ++ 0x7f, 0x26, 0x2d, 0x37, 0x66, 0xb0, 0xf9, 0x45, 0x69, 0x7c, 0x9e, 0xd7, ++ 0x95, 0xff, 0xfa, 0xdc, 0x8f, 0x7a, 0x2c, 0x00, 0x6f, 0x91, 0xa7, 0x22, ++ 0xc6, 0x35, 0xe6, 0xbd, 0x0a, 0x3c, 0x2e, 0xef, 0x94, 0xc6, 0x41, 0x5c, ++ 0xae, 0xfc, 0xe0, 0x65, 0x8c, 0x93, 0xf4, 0xee, 0xff, 0x1b, 0xc6, 0x49, ++ 0x94, 0x8c, 0xb9, 0xe3, 0x60, 0xfc, 0xae, 0xd7, 0x58, 0xbc, 0x44, 0xe4, ++ 0x95, 0x88, 0xf1, 0x57, 0x70, 0x3f, 0xb2, 0x5a, 0xce, 0x6f, 0x87, 0x38, ++ 0xed, 0xf9, 0x1d, 0x16, 0x8c, 0x7f, 0xca, 0x44, 0xdd, 0x58, 0x46, 0xe7, ++ 0xd3, 0x74, 0xc4, 0x4c, 0x7c, 0x28, 0x07, 0xd9, 0xf9, 0x65, 0xb1, 0x4f, ++ 0x6b, 0xde, 0xd1, 0xda, 0x0d, 0x71, 0x79, 0x33, 0x09, 0xb9, 0x67, 0x07, ++ 0xf5, 0x9d, 0x1a, 0x07, 0x74, 0x69, 0x3e, 0xc2, 0xee, 0xbb, 0x21, 0x49, ++ 0xec, 0x7b, 0x33, 0xb1, 0xae, 0x62, 0xf7, 0x30, 0xea, 0xf7, 0x69, 0xe3, ++ 0xdd, 0xfa, 0x7d, 0xda, 0xc4, 0x1a, 0xfd, 0x3e, 0xad, 0x88, 0x23, 0x2e, ++ 0x25, 0x6c, 0x9e, 0x0e, 0x8f, 0x7e, 0xdf, 0x76, 0xe8, 0x2c, 0xfd, 0xbe, ++ 0xed, 0x30, 0x4d, 0xbf, 0x6f, 0x9b, 0xbc, 0x68, 0xac, 0x61, 0x1f, 0x57, ++ 0xbf, 0x6f, 0x3b, 0xba, 0xa5, 0xc2, 0xb0, 0x8f, 0xab, 0xdf, 0xb7, 0x4d, ++ 0x5b, 0x37, 0xc3, 0xb0, 0x8f, 0xab, 0xdf, 0xb7, 0xfd, 0x8c, 0x34, 0x3f, ++ 0x5d, 0x46, 0xd7, 0x9d, 0x2b, 0xee, 0xfb, 0xf1, 0xba, 0xbb, 0xe1, 0x5c, ++ 0xf4, 0x7c, 0x3e, 0xdf, 0xac, 0x4d, 0xfa, 0x7d, 0xdd, 0x2f, 0x76, 0xd6, ++ 0xe0, 0x7d, 0x21, 0xf3, 0x79, 0x7c, 0x3b, 0xc7, 0xa7, 0xdf, 0xe7, 0x5d, ++ 0x2a, 0x2f, 0x43, 0x3a, 0x26, 0x6d, 0xec, 0x9c, 0x73, 0x33, 0xfd, 0x07, ++ 0xe0, 0xa6, 0x90, 0xc0, 0xe1, 0x64, 0xc8, 0x3f, 0xf0, 0x49, 0x2e, 0x3f, ++ 0xfd, 0xdc, 0xb0, 0x49, 0x7f, 0x0e, 0x7a, 0x71, 0xc7, 0x16, 0x6c, 0xb7, ++ 0xd8, 0xa7, 0x7f, 0xbf, 0x74, 0x87, 0xbe, 0xfc, 0x40, 0x2e, 0xbf, 0x07, ++ 0x86, 0xc7, 0xbd, 0xfb, 0xd3, 0x41, 0x0c, 0xcb, 0x63, 0xd8, 0xcc, 0xe2, ++ 0xfd, 0xb2, 0x37, 0xcb, 0x40, 0x07, 0x7a, 0x7c, 0xfc, 0x6f, 0xe9, 0x42, ++ 0xe5, 0x74, 0x11, 0xe1, 0xd4, 0xd3, 0x45, 0xa4, 0xaa, 0xa7, 0x8b, 0x86, ++ 0x37, 0xf7, 0x96, 0xc0, 0xba, 0x8d, 0xf0, 0x8d, 0xce, 0xd6, 0xd3, 0x8b, ++ 0x11, 0xbe, 0x36, 0x97, 0x9e, 0x5e, 0x04, 0x5c, 0xa9, 0x9e, 0xe4, 0xf9, ++ 0x38, 0x6e, 0x5c, 0xef, 0xc2, 0x0e, 0x89, 0x3c, 0x23, 0xf5, 0x87, 0xeb, ++ 0xa2, 0xce, 0x0d, 0xad, 0x70, 0x0e, 0xdd, 0x08, 0x57, 0x42, 0x7c, 0xb8, ++ 0xef, 0x6c, 0x84, 0xaf, 0xcf, 0x00, 0xdf, 0x73, 0xaa, 0xf6, 0x3c, 0xf0, ++ 0xdf, 0x85, 0x8e, 0x07, 0xf0, 0xbe, 0x1f, 0xa2, 0x69, 0xe3, 0xa0, 0xdd, ++ 0x55, 0xf2, 0x63, 0xfe, 0x83, 0xd5, 0x1f, 0x74, 0x7e, 0x4c, 0x3b, 0xd4, ++ 0x0f, 0xfa, 0xc9, 0xfa, 0xfc, 0x98, 0x5e, 0xc8, 0xe3, 0x1a, 0x43, 0x06, ++ 0x91, 0xc7, 0x75, 0xf0, 0x7f, 0x20, 0xaf, 0x23, 0x82, 0xce, 0xd0, 0x0c, ++ 0xf1, 0xc6, 0x09, 0x2e, 0x6b, 0xf8, 0xbc, 0x2d, 0xed, 0xf5, 0x5c, 0xd4, ++ 0x33, 0x6e, 0x82, 0xf1, 0x9e, 0x3f, 0x10, 0xd7, 0x1a, 0x5a, 0x6b, 0x8d, ++ 0xad, 0x24, 0xef, 0x1a, 0x71, 0x81, 0x03, 0xb9, 0x68, 0x47, 0x69, 0x78, ++ 0x9f, 0x46, 0x69, 0x37, 0xcb, 0x73, 0x23, 0x4a, 0xb7, 0x1d, 0xe2, 0xbf, ++ 0xe1, 0xee, 0x6f, 0x34, 0x9c, 0x6b, 0x3a, 0x0a, 0xed, 0xff, 0xd9, 0xfb, ++ 0xf1, 0x84, 0xdd, 0x48, 0xed, 0xf4, 0x3f, 0xe6, 0x32, 0xbd, 0xfb, 0x2e, ++ 0x3c, 0xfb, 0xec, 0x74, 0x6e, 0xb7, 0x09, 0x7b, 0x7b, 0xa0, 0x7e, 0xfa, ++ 0xf2, 0x5c, 0x06, 0x78, 0x4a, 0x07, 0x64, 0xcc, 0xb3, 0x0a, 0x48, 0x51, ++ 0xae, 0x70, 0xf7, 0x0d, 0x9d, 0xce, 0x95, 0xc2, 0xea, 0x0d, 0xaa, 0x27, ++ 0x4e, 0xe7, 0x3a, 0x42, 0xe2, 0x5b, 0xdf, 0xbb, 0x70, 0x18, 0xf4, 0x07, ++ 0x85, 0xf7, 0x17, 0xf0, 0xde, 0x66, 0xa3, 0xfa, 0x5b, 0x1a, 0x94, 0xfe, ++ 0xee, 0x05, 0x38, 0x6d, 0x8c, 0x8e, 0x45, 0xba, 0x0e, 0xbc, 0x29, 0xfb, ++ 0xb2, 0x68, 0x83, 0xf3, 0x56, 0x35, 0x0e, 0xce, 0x9f, 0x1b, 0xef, 0x27, ++ 0x11, 0x79, 0x4f, 0xcd, 0x70, 0xff, 0x08, 0xd5, 0x27, 0x65, 0xe7, 0xb3, ++ 0xe3, 0xae, 0x96, 0x67, 0x50, 0x66, 0xb8, 0x9f, 0xc6, 0x78, 0x8f, 0x47, ++ 0xeb, 0x58, 0x9e, 0x67, 0x92, 0xc7, 0xd6, 0xf9, 0x6b, 0x7e, 0x8f, 0xa0, ++ 0x33, 0x4f, 0xd2, 0x9d, 0x97, 0x11, 0xf1, 0xa8, 0xa6, 0x75, 0x2c, 0xfe, ++ 0x0a, 0xf7, 0x0e, 0x76, 0x86, 0xf4, 0xe3, 0xcc, 0x63, 0x87, 0x56, 0x6e, ++ 0x56, 0xcb, 0x9d, 0x79, 0x0e, 0x88, 0x77, 0xb1, 0x78, 0x61, 0x6b, 0x8a, ++ 0x84, 0x76, 0x42, 0xab, 0x24, 0xa1, 0xdd, 0xb0, 0x39, 0xbd, 0xc2, 0x99, ++ 0x47, 0xfb, 0x3f, 0x94, 0x5b, 0x3e, 0x14, 0xea, 0xd9, 0xf9, 0xb8, 0x4e, ++ 0x88, 0x45, 0x8f, 0xc7, 0xf3, 0x3e, 0x38, 0x1f, 0xd5, 0x70, 0x5e, 0xec, ++ 0x18, 0xaf, 0x7f, 0x2c, 0xb7, 0x02, 0x9f, 0xce, 0x3c, 0xe1, 0x6f, 0xd9, ++ 0x73, 0x01, 0xff, 0x13, 0x55, 0x37, 0xf6, 0x6b, 0x91, 0xc3, 0xef, 0xab, ++ 0x8f, 0xcc, 0x63, 0xf6, 0x4f, 0x35, 0xf0, 0xb4, 0x23, 0xc8, 0x4f, 0xd7, ++ 0x73, 0x4f, 0x83, 0x25, 0xa9, 0xff, 0x3d, 0x0d, 0xc6, 0xfb, 0xcf, 0xdc, ++ 0xd9, 0xf6, 0x2e, 0x50, 0x07, 0xc6, 0x7d, 0xcf, 0x17, 0xaf, 0x75, 0x4f, ++ 0xc3, 0xbe, 0xf0, 0xf7, 0x34, 0x00, 0xdc, 0xa3, 0x13, 0x82, 0xfc, 0x50, ++ 0x92, 0xa7, 0xbf, 0xe7, 0xac, 0x23, 0xaa, 0x07, 0xf7, 0x41, 0x03, 0x6f, ++ 0xcb, 0xae, 0xad, 0xa4, 0xff, 0xba, 0x6f, 0xe6, 0x78, 0x5c, 0xcf, 0xcf, ++ 0x85, 0x38, 0x78, 0xfe, 0xf7, 0x28, 0xbe, 0x9f, 0xd2, 0xbf, 0x3e, 0x83, ++ 0xd3, 0x96, 0x01, 0xe2, 0xbd, 0x13, 0xd5, 0xf2, 0x6a, 0x80, 0xf3, 0x07, ++ 0xe9, 0x9e, 0x9b, 0x01, 0x0f, 0xe2, 0x9e, 0x9d, 0x0e, 0x8b, 0xb6, 0x06, ++ 0xfc, 0x8f, 0xc0, 0x4b, 0x04, 0xe7, 0x91, 0xed, 0x23, 0x07, 0xa0, 0x5c, ++ 0xe0, 0x55, 0x31, 0x8f, 0xbc, 0x35, 0xc5, 0x1b, 0x8d, 0xf7, 0x01, 0x14, ++ 0x99, 0xd0, 0x9f, 0x57, 0x37, 0xb5, 0x1d, 0x8c, 0x4c, 0xc2, 0x73, 0xb6, ++ 0x09, 0x92, 0x1a, 0x94, 0x27, 0x66, 0x85, 0x78, 0x6d, 0x94, 0xce, 0x16, ++ 0xc2, 0x65, 0x5d, 0x60, 0xdf, 0xf5, 0xcc, 0x3d, 0x60, 0xa3, 0xdf, 0x1d, ++ 0x9b, 0x6f, 0x93, 0xe0, 0xfe, 0x96, 0x36, 0xd2, 0x56, 0x19, 0x0b, 0x76, ++ 0xd7, 0x66, 0x12, 0x36, 0x3e, 0x58, 0xcf, 0xe9, 0x69, 0x6a, 0xf9, 0x01, ++ 0x8c, 0xb3, 0x3b, 0x02, 0xec, 0xbc, 0x5f, 0xff, 0x7a, 0x26, 0xe1, 0x27, ++ 0x6a, 0xb0, 0x8e, 0xd2, 0x80, 0x36, 0x4e, 0x4a, 0x0d, 0xca, 0x25, 0x14, ++ 0xb9, 0xe0, 0x3f, 0x75, 0x99, 0x7c, 0xe1, 0xe2, 0xb5, 0x59, 0xe9, 0x95, ++ 0x0b, 0xa1, 0x5d, 0x81, 0x8f, 0x84, 0x8d, 0xff, 0x55, 0xf3, 0x7b, 0x66, ++ 0xea, 0x54, 0xcf, 0x32, 0xac, 0xb7, 0xcf, 0x8f, 0x7e, 0x51, 0x83, 0x90, ++ 0xef, 0xf3, 0x4d, 0x04, 0xee, 0x37, 0xbc, 0x9d, 0xcb, 0xf3, 0xdb, 0x37, ++ 0xb3, 0xbc, 0x5c, 0x72, 0xf9, 0xca, 0x15, 0xb9, 0x24, 0x78, 0x7e, 0x8a, ++ 0xf6, 0x4f, 0x40, 0x3e, 0x35, 0xcc, 0xb4, 0xe1, 0xbd, 0xb1, 0x0d, 0x9d, ++ 0x29, 0x78, 0xff, 0x16, 0xf1, 0x48, 0x78, 0xcf, 0x4b, 0x53, 0xe7, 0x31, ++ 0x0f, 0x94, 0x1b, 0x8a, 0x8b, 0xed, 0x10, 0x6f, 0x76, 0xbf, 0x4f, 0x24, ++ 0xb8, 0x97, 0x0d, 0xcf, 0xec, 0xa1, 0x1c, 0x54, 0xc8, 0xa7, 0x42, 0xdf, ++ 0xa2, 0xfd, 0x90, 0x84, 0xfb, 0xfd, 0x33, 0x38, 0x5d, 0x8b, 0xfb, 0x94, ++ 0xa8, 0x1e, 0x59, 0x1f, 0x4d, 0xe1, 0xde, 0xb0, 0x79, 0xd5, 0x01, 0xc8, ++ 0xeb, 0x7e, 0xf7, 0x79, 0xda, 0x07, 0xfd, 0x74, 0x42, 0xd6, 0x4e, 0xfc, ++ 0x90, 0xf6, 0xfb, 0x5d, 0xaa, 0xc4, 0x5a, 0xc6, 0xc2, 0x53, 0x21, 0x75, ++ 0x18, 0x8f, 0x76, 0x62, 0x3f, 0x33, 0x79, 0x3f, 0xde, 0xbf, 0xd1, 0x71, ++ 0xad, 0xc1, 0x71, 0xbf, 0xdb, 0xf9, 0x26, 0xae, 0xe7, 0x84, 0x99, 0x78, ++ 0xad, 0x94, 0x7e, 0xcd, 0x15, 0x6c, 0x68, 0xf3, 0x0f, 0xe2, 0x30, 0xdf, ++ 0x58, 0xe4, 0xaf, 0xdc, 0x61, 0x6d, 0xab, 0x06, 0x3d, 0xdb, 0x6b, 0x09, ++ 0x14, 0xc2, 0xf9, 0xa9, 0xde, 0xd7, 0xde, 0x1b, 0x09, 0xfb, 0xd4, 0x1f, ++ 0xfe, 0x9f, 0x0b, 0x36, 0xb0, 0x8f, 0xff, 0xac, 0x04, 0x6c, 0xf0, 0xfe, ++ 0xf4, 0xc3, 0x7f, 0xb4, 0xc1, 0xfd, 0xc8, 0x1f, 0x3e, 0x2c, 0xe3, 0xbe, ++ 0xde, 0x1c, 0xae, 0x77, 0x04, 0xbc, 0x9f, 0xe7, 0x74, 0x7e, 0x31, 0xcf, ++ 0xf3, 0x0c, 0xd0, 0xe7, 0xbd, 0x2b, 0xbf, 0x2d, 0x09, 0xcd, 0xa3, 0x27, ++ 0x2d, 0x0e, 0xe4, 0x9f, 0xc5, 0x3e, 0x19, 0x53, 0x1e, 0x04, 0xdf, 0x2d, ++ 0xdd, 0x11, 0x0d, 0x16, 0x51, 0x5f, 0xb9, 0xb1, 0x3d, 0x51, 0x57, 0x16, ++ 0x7a, 0xa4, 0x11, 0xee, 0x6b, 0x0d, 0x43, 0x47, 0x27, 0x38, 0xbf, 0x2c, ++ 0xde, 0xb5, 0xc5, 0x02, 0xf7, 0x0b, 0x5c, 0xcc, 0xd3, 0x76, 0xc1, 0xf8, ++ 0xa7, 0x15, 0x46, 0x3f, 0xa7, 0xf7, 0xd9, 0x7c, 0x70, 0x7f, 0xa2, 0x98, ++ 0xcf, 0xdc, 0x5d, 0x45, 0x16, 0xb0, 0x4f, 0xfe, 0xdc, 0x19, 0x41, 0xfc, ++ 0xa0, 0x0f, 0x95, 0x6e, 0x33, 0x3b, 0x4f, 0xe6, 0xae, 0x95, 0x28, 0x3d, ++ 0x68, 0x1c, 0xef, 0xc6, 0x79, 0x1e, 0x7e, 0x3d, 0x1a, 0xfb, 0x5b, 0xf0, ++ 0x14, 0x93, 0x4f, 0xf5, 0x74, 0xac, 0x16, 0x0a, 0x57, 0xad, 0x73, 0x31, ++ 0xca, 0x21, 0xe3, 0x3a, 0x16, 0x7c, 0xa8, 0x4e, 0x86, 0x73, 0x1c, 0x0b, ++ 0x1e, 0x95, 0x08, 0xec, 0xaf, 0x40, 0xfd, 0x87, 0x29, 0xde, 0xb4, 0x96, ++ 0x1f, 0x63, 0x9e, 0xa8, 0x71, 0x9d, 0xf5, 0x5e, 0xe3, 0x7d, 0x76, 0x6e, ++ 0x94, 0x8f, 0x0d, 0x1c, 0xbf, 0xf3, 0xd6, 0xe9, 0xbf, 0x37, 0x74, 0x3e, ++ 0x8e, 0xfd, 0xcc, 0x27, 0xea, 0x7a, 0xb0, 0xa7, 0x17, 0xb4, 0x19, 0xbf, ++ 0x4f, 0xf9, 0x0c, 0xec, 0x9f, 0x06, 0x83, 0x3c, 0x7b, 0x27, 0x8f, 0xdb, ++ 0x5b, 0x25, 0xa4, 0x14, 0xee, 0x9d, 0x39, 0x60, 0x4d, 0x8b, 0xbb, 0xda, ++ 0xbd, 0xaf, 0x67, 0x57, 0xda, 0x91, 0x38, 0x3f, 0x5f, 0x69, 0xc5, 0xe7, ++ 0xe9, 0x95, 0x04, 0x9f, 0xcf, 0xe4, 0xa9, 0x08, 0xf7, 0x65, 0x9d, 0xc7, ++ 0x1e, 0x04, 0xfa, 0x59, 0xde, 0xb1, 0xdb, 0x02, 0xfd, 0x1c, 0xf4, 0x8d, ++ 0x4f, 0x82, 0xe3, 0xa3, 0x53, 0x3b, 0xa7, 0x28, 0x60, 0x77, 0x4d, 0xe5, ++ 0xfb, 0xac, 0xb3, 0xf9, 0xb9, 0x4e, 0x74, 0xaa, 0xd9, 0x79, 0xce, 0x1e, ++ 0xc0, 0x53, 0x55, 0x8c, 0xe1, 0x3c, 0x27, 0x5f, 0x77, 0x1d, 0xc7, 0x03, ++ 0xb1, 0x26, 0x22, 0x9d, 0xd5, 0xc1, 0x7a, 0x0b, 0xe1, 0xbd, 0xf2, 0x75, ++ 0xe8, 0x7a, 0xce, 0x1f, 0x49, 0x8b, 0xc1, 0x7d, 0x3a, 0xb1, 0xae, 0x52, ++ 0xba, 0x2e, 0x79, 0xf0, 0xeb, 0x12, 0xeb, 0x11, 0xeb, 0x13, 0xdf, 0x1b, ++ 0x65, 0x76, 0x3f, 0xb0, 0xb1, 0x9d, 0xa0, 0xf3, 0x67, 0x38, 0xdd, 0xcd, ++ 0xdf, 0x76, 0x5b, 0xeb, 0x70, 0x0a, 0x8a, 0x35, 0xaf, 0x7d, 0x36, 0xaa, ++ 0x87, 0xf9, 0xa9, 0x68, 0xdf, 0x57, 0x72, 0xbc, 0x55, 0x5a, 0x1f, 0x47, ++ 0xfb, 0xbe, 0x92, 0xe8, 0xef, 0xa5, 0xa2, 0x7f, 0xc7, 0x81, 0x7f, 0x05, ++ 0xbd, 0x35, 0x10, 0x97, 0x02, 0xcc, 0x6b, 0xa4, 0x2b, 0x81, 0x67, 0x12, ++ 0x63, 0xf6, 0xf2, 0xfb, 0xf9, 0xd1, 0xfe, 0xef, 0xa3, 0xa7, 0xce, 0x7f, ++ 0x43, 0xb8, 0x08, 0x7c, 0x53, 0x7e, 0x71, 0xf2, 0xfd, 0x34, 0x27, 0xec, ++ 0xa7, 0x51, 0xba, 0xd2, 0xd9, 0xdb, 0x94, 0x8e, 0x74, 0xe5, 0x05, 0x6d, ++ 0xfa, 0xf2, 0x97, 0xe6, 0x9e, 0x51, 0xc0, 0xef, 0x0d, 0x86, 0xfb, 0xa1, ++ 0xbe, 0x34, 0xe4, 0x5f, 0x88, 0xe7, 0xa5, 0xbc, 0x54, 0x06, 0x07, 0xd5, ++ 0x3d, 0x19, 0xce, 0x07, 0x2c, 0x20, 0x9e, 0x56, 0xb6, 0xef, 0xca, 0xce, ++ 0x1f, 0x9d, 0x56, 0xda, 0x0e, 0xff, 0x10, 0xf8, 0x70, 0x1b, 0xe3, 0x83, ++ 0x3f, 0x73, 0xfc, 0xb7, 0xe4, 0x7b, 0x46, 0xe7, 0x83, 0xfe, 0x52, 0xdc, ++ 0x85, 0x20, 0xef, 0x2b, 0x56, 0x0f, 0x93, 0x93, 0x68, 0xbd, 0xfa, 0xf5, ++ 0x92, 0x1d, 0xf8, 0x6b, 0xde, 0xda, 0xa2, 0xc9, 0xc0, 0x97, 0x63, 0x89, ++ 0x1b, 0xfb, 0x9b, 0x9d, 0x18, 0xde, 0x7e, 0xab, 0xc8, 0x67, 0x7a, 0x64, ++ 0x6e, 0xb3, 0x99, 0x58, 0xa8, 0xdd, 0x3f, 0x97, 0x8e, 0x01, 0x72, 0x6e, ++ 0xee, 0x3e, 0x19, 0xf9, 0x1e, 0xf2, 0xa6, 0xa6, 0x0d, 0x81, 0x7b, 0x26, ++ 0x18, 0x3e, 0x1a, 0x1f, 0xdd, 0x6d, 0x19, 0x46, 0x9f, 0x8b, 0x9a, 0x1b, ++ 0x98, 0xfd, 0xe0, 0x63, 0x7c, 0x23, 0xee, 0xab, 0x15, 0xf4, 0x27, 0xe4, ++ 0xff, 0x92, 0xf5, 0xfb, 0xf1, 0xde, 0x0d, 0xea, 0xb7, 0xe8, 0xf8, 0xab, ++ 0x09, 0xf2, 0xbd, 0x0b, 0x81, 0x8f, 0x0d, 0xef, 0x9b, 0x6f, 0x46, 0x3c, ++ 0x34, 0x11, 0xf6, 0xfb, 0x05, 0x02, 0x7e, 0x37, 0xe5, 0x73, 0xbb, 0xc1, ++ 0x45, 0x5c, 0x40, 0x9f, 0xda, 0x83, 0x36, 0x2b, 0x9c, 0x17, 0xb9, 0xd6, ++ 0xba, 0x49, 0xff, 0xb8, 0x03, 0xc6, 0x25, 0xce, 0x1f, 0xc9, 0x40, 0xbb, ++ 0xf3, 0xbc, 0xaa, 0x0e, 0x85, 0x7a, 0x1a, 0x1d, 0xb3, 0x1b, 0xec, 0x48, ++ 0x45, 0x2b, 0x85, 0xf7, 0x14, 0x5e, 0xa8, 0xa7, 0x02, 0xab, 0xa2, 0xf1, ++ 0x1e, 0xcf, 0x93, 0x97, 0x64, 0xa2, 0x42, 0x7e, 0x9b, 0x5d, 0x2b, 0x05, ++ 0x3b, 0xaa, 0xe7, 0xfd, 0x91, 0x78, 0xce, 0x5d, 0xd0, 0xab, 0x58, 0x6f, ++ 0x93, 0x75, 0x3d, 0xd2, 0x6b, 0x13, 0xd1, 0xfb, 0xa3, 0xf5, 0xd4, 0xf1, ++ 0x81, 0xfd, 0xcf, 0xfa, 0xed, 0x89, 0x98, 0xd7, 0x44, 0xfb, 0x2f, 0xec, ++ 0x00, 0x7b, 0x63, 0xbb, 0x19, 0xed, 0x09, 0x2f, 0x59, 0xe1, 0x84, 0xf3, ++ 0xf6, 0x9e, 0x47, 0xcc, 0x28, 0x27, 0xe7, 0x76, 0xc4, 0xa3, 0x3f, 0x3c, ++ 0x77, 0x2d, 0xdb, 0x27, 0x98, 0xbb, 0x2b, 0x1e, 0xcf, 0x07, 0x52, 0x7f, ++ 0x14, 0xef, 0x11, 0x16, 0xf8, 0x38, 0xb9, 0xb6, 0xd2, 0x32, 0x0c, 0xf1, ++ 0x95, 0x82, 0xf7, 0xf3, 0x90, 0x0e, 0x3d, 0x9d, 0x0b, 0x3c, 0xf5, 0xf7, ++ 0x27, 0x0d, 0x78, 0x5a, 0xb7, 0xff, 0xb0, 0x53, 0xed, 0xef, 0x5f, 0x86, ++ 0xe0, 0xe9, 0xd4, 0x00, 0x78, 0x3a, 0x15, 0x8a, 0xa7, 0x15, 0xf9, 0x5c, ++ 0x8e, 0x70, 0x3c, 0x91, 0x87, 0xb9, 0xfc, 0xb9, 0xef, 0x50, 0x06, 0xdc, ++ 0x5f, 0x75, 0xbe, 0x39, 0x12, 0xcf, 0x83, 0x18, 0xe9, 0x50, 0xe8, 0x29, ++ 0x32, 0xff, 0x06, 0xcc, 0xbf, 0x12, 0x71, 0xaa, 0x9a, 0xe1, 0x0c, 0x2f, ++ 0x44, 0x71, 0x61, 0x9e, 0xe2, 0x85, 0xf5, 0xe3, 0x11, 0x6f, 0x46, 0x7c, ++ 0xd5, 0xfc, 0x63, 0x1e, 0xe2, 0x85, 0xbc, 0x6f, 0xc3, 0xfb, 0x8b, 0x67, ++ 0xa7, 0xb1, 0x7b, 0x5b, 0xee, 0x95, 0x18, 0xbf, 0xcc, 0x5e, 0x33, 0xa5, ++ 0x06, 0xf4, 0xf9, 0xe3, 0xf9, 0xcc, 0xae, 0xf9, 0x3d, 0x95, 0x5b, 0xee, ++ 0x2c, 0x6a, 0x8f, 0x53, 0xb9, 0xe5, 0xa6, 0x72, 0xeb, 0x8f, 0x54, 0x9e, ++ 0x41, 0xf9, 0xdd, 0x95, 0x4e, 0x2c, 0xbf, 0xb7, 0x52, 0xc5, 0xe7, 0x9f, ++ 0x56, 0x66, 0xe3, 0xf3, 0x14, 0xdf, 0x57, 0x15, 0x7c, 0x44, 0x09, 0xc1, ++ 0x02, 0x76, 0xe3, 0x86, 0x7c, 0x26, 0xc7, 0x36, 0xe4, 0x8b, 0xb8, 0xe1, ++ 0x03, 0x4e, 0x30, 0x2d, 0x6a, 0xfe, 0xf1, 0xc7, 0xf1, 0xf0, 0x3b, 0x0a, ++ 0x0e, 0xef, 0x94, 0x3b, 0xaa, 0x47, 0x12, 0x72, 0xab, 0x5b, 0xaf, 0x0f, ++ 0x67, 0xcd, 0xd4, 0xeb, 0xbb, 0x1e, 0xb3, 0x7d, 0xb2, 0x13, 0xfc, 0xdb, ++ 0x47, 0xd9, 0x3d, 0x4c, 0x73, 0x3d, 0x37, 0xea, 0xea, 0x13, 0x45, 0xb5, ++ 0xc0, 0x79, 0x68, 0x92, 0x3d, 0x2e, 0xf8, 0x1e, 0xf9, 0x4d, 0xb5, 0xc0, ++ 0x7d, 0xe9, 0x77, 0xd5, 0x26, 0xea, 0xea, 0xdf, 0xb1, 0x2e, 0x59, 0x57, ++ 0xfe, 0xcf, 0x7c, 0x15, 0xd7, 0x7d, 0x5b, 0x4d, 0x9a, 0xee, 0xfd, 0xdd, ++ 0x75, 0x79, 0xba, 0x72, 0x3d, 0xdc, 0x9b, 0x08, 0x74, 0xae, 0x4e, 0x40, ++ 0xbe, 0x79, 0x80, 0xe7, 0x55, 0x52, 0x07, 0x9d, 0xe1, 0x85, 0x9f, 0x23, ++ 0xfc, 0xba, 0xb9, 0x74, 0xe8, 0xf7, 0xe9, 0x7c, 0xbf, 0x3e, 0x6a, 0xc6, ++ 0xef, 0x46, 0x7c, 0x08, 0xbc, 0xce, 0xdf, 0x24, 0x13, 0x8d, 0xf6, 0x37, ++ 0x6f, 0x13, 0x95, 0x5f, 0x74, 0x8a, 0xa7, 0xda, 0x28, 0x9e, 0x68, 0xbb, ++ 0x2f, 0x4e, 0xd8, 0xd0, 0x0f, 0x69, 0xdd, 0x35, 0xee, 0x9d, 0x09, 0xb4, ++ 0x7c, 0x72, 0x97, 0x19, 0xe3, 0x07, 0x27, 0xd7, 0x26, 0xfe, 0x04, 0xec, ++ 0xa7, 0x93, 0xbb, 0x1c, 0xb1, 0x84, 0x3e, 0xb5, 0x56, 0x99, 0xdb, 0x19, ++ 0x76, 0xbc, 0x4f, 0x49, 0xf4, 0x5b, 0xb9, 0x76, 0x15, 0x9e, 0x87, 0xa9, ++ 0xf7, 0x45, 0xb8, 0xd0, 0x9e, 0xe8, 0xf2, 0xfe, 0xbb, 0x28, 0xab, 0xe0, ++ 0xb7, 0xc2, 0x24, 0x81, 0x6f, 0x8e, 0xcb, 0x3e, 0xbf, 0x84, 0xf8, 0x63, ++ 0xf1, 0x83, 0x9d, 0x11, 0x68, 0x0f, 0x9f, 0xa6, 0x76, 0x1d, 0x5c, 0x3d, ++ 0x7b, 0x5a, 0x22, 0x6b, 0xe1, 0x09, 0x07, 0xe6, 0xe3, 0xe8, 0xf7, 0x6f, ++ 0xba, 0x1d, 0x3e, 0xe0, 0xeb, 0x9a, 0x7f, 0xc8, 0x6e, 0x27, 0xd0, 0xd3, ++ 0xce, 0x48, 0x76, 0x7f, 0x08, 0x38, 0xc3, 0xf4, 0xfb, 0xe7, 0xc7, 0x32, ++ 0xb6, 0x3e, 0x86, 0xf4, 0xa5, 0xb6, 0xfb, 0x91, 0x7f, 0x23, 0xd0, 0x5f, ++ 0x98, 0xd7, 0xc3, 0xd6, 0x47, 0xa4, 0xb1, 0xc9, 0x80, 0xff, 0xd3, 0xf1, ++ 0xc4, 0x1d, 0x4f, 0x27, 0xd1, 0xb8, 0xe2, 0xbd, 0x8f, 0x14, 0x8a, 0xa7, ++ 0xc5, 0x99, 0xdd, 0x85, 0x7e, 0xda, 0xae, 0x2e, 0xc5, 0xef, 0xb8, 0x93, ++ 0xb6, 0x3b, 0xbb, 0xcd, 0xcc, 0xee, 0x97, 0xa3, 0xfd, 0xda, 0x69, 0xb9, ++ 0xf1, 0x97, 0x11, 0x5b, 0x98, 0x3c, 0x71, 0x0f, 0xbd, 0xad, 0x20, 0x14, ++ 0x9e, 0xbe, 0x42, 0x58, 0x77, 0xd6, 0x70, 0xcf, 0x87, 0xf9, 0xb0, 0x7f, ++ 0xb0, 0xd0, 0x57, 0x88, 0x72, 0xed, 0x61, 0x07, 0xf2, 0x95, 0x11, 0xee, ++ 0xa7, 0x2c, 0x1a, 0xc2, 0xd7, 0x0b, 0x7c, 0x20, 0x05, 0xe5, 0x64, 0x90, ++ 0xcf, 0xd8, 0x7e, 0x10, 0x15, 0x6e, 0xc3, 0x40, 0xde, 0xcc, 0x33, 0xbb, ++ 0x86, 0x80, 0xbe, 0x3a, 0xb5, 0xde, 0x8c, 0x76, 0x29, 0xd5, 0x27, 0xb1, ++ 0xb7, 0x61, 0x1c, 0x66, 0x0f, 0xd2, 0xf1, 0x29, 0x45, 0x9d, 0x0c, 0xeb, ++ 0x3e, 0xb5, 0x2e, 0x85, 0x80, 0xdc, 0x12, 0xe3, 0xce, 0x5d, 0x2f, 0xf3, ++ 0x7b, 0x42, 0x28, 0x5d, 0x42, 0xfd, 0x0d, 0xb2, 0x46, 0x6d, 0x07, 0x22, ++ 0xf4, 0x96, 0x77, 0x9d, 0xa4, 0x91, 0xa1, 0xfd, 0xe9, 0xe6, 0xfe, 0xfb, ++ 0x4a, 0x31, 0x2f, 0xdc, 0x68, 0xff, 0x8a, 0xe7, 0x97, 0x94, 0x57, 0xb5, ++ 0x10, 0x3b, 0x62, 0xc9, 0x6b, 0xec, 0x7e, 0x7e, 0x52, 0xdc, 0xa3, 0xcc, ++ 0x2c, 0x08, 0x5d, 0x07, 0xfb, 0x7d, 0x05, 0xa2, 0x4d, 0xd0, 0xe5, 0x6b, ++ 0x2e, 0x4b, 0xfd, 0xed, 0x47, 0x31, 0x26, 0xb4, 0x6b, 0xe2, 0x20, 0x9e, ++ 0x7e, 0xe6, 0xb8, 0x8c, 0x74, 0x76, 0x26, 0xb5, 0xad, 0xc4, 0x49, 0x49, ++ 0xff, 0xac, 0xe9, 0x40, 0xc9, 0xf7, 0x69, 0xf9, 0x8b, 0x69, 0xde, 0x4f, ++ 0x15, 0x5a, 0xbe, 0x6f, 0xb4, 0x16, 0x55, 0x40, 0x97, 0xb4, 0xd4, 0xb4, ++ 0x7e, 0x14, 0xf8, 0x4f, 0xbd, 0x9d, 0x9f, 0xfc, 0x04, 0xee, 0xdd, 0xfb, ++ 0xfc, 0x45, 0x33, 0x1c, 0x87, 0x27, 0x4b, 0x76, 0x2e, 0x1e, 0x8d, 0x71, ++ 0x1f, 0x6e, 0x7f, 0xf7, 0x97, 0x5b, 0xe2, 0xfe, 0x3f, 0xf7, 0x30, 0xb8, ++ 0x3f, 0x65, 0xa9, 0xda, 0x8e, 0x7a, 0x5c, 0x85, 0x43, 0x72, 0xb8, 0x7e, ++ 0x1f, 0xce, 0x53, 0xe8, 0x75, 0xfb, 0x93, 0x12, 0xd8, 0x58, 0xe4, 0x93, ++ 0xf1, 0xb6, 0xc7, 0xc0, 0x9f, 0x9e, 0x67, 0x38, 0x9f, 0xf2, 0x89, 0x99, ++ 0xd9, 0x09, 0x23, 0x0a, 0x98, 0x9c, 0x12, 0xfa, 0xfe, 0x1e, 0x5e, 0x9e, ++ 0x67, 0x62, 0x74, 0x4d, 0x5e, 0x97, 0x30, 0x0f, 0x9c, 0xf0, 0x7b, 0xe5, ++ 0x85, 0x3e, 0x10, 0xf2, 0x5a, 0xc8, 0xfd, 0xfc, 0x02, 0x66, 0x5f, 0x08, ++ 0x79, 0x0d, 0x99, 0x76, 0x20, 0xb7, 0x16, 0xc2, 0xed, 0x2d, 0x74, 0x9d, ++ 0xcb, 0x76, 0x44, 0xf8, 0x7c, 0x29, 0xd8, 0xd6, 0x0e, 0x70, 0x5c, 0xcc, ++ 0xd0, 0x44, 0x16, 0x17, 0xa8, 0xd8, 0x6e, 0x89, 0xe5, 0xc5, 0xa7, 0x81, ++ 0x97, 0x1a, 0x48, 0x37, 0xce, 0xff, 0x73, 0xb3, 0x6f, 0x61, 0x77, 0x0a, ++ 0xb4, 0xdf, 0xb2, 0x36, 0x01, 0xdb, 0x9b, 0x5d, 0x18, 0xa7, 0xe5, 0xfa, ++ 0x05, 0xae, 0xb5, 0x06, 0xb9, 0xd4, 0xc0, 0xf9, 0xaf, 0xb1, 0x4d, 0xf2, ++ 0xf9, 0x91, 0x7f, 0x98, 0x9e, 0x5c, 0xc0, 0xfb, 0x27, 0xa0, 0x67, 0x42, ++ 0xe4, 0x58, 0x3f, 0xfd, 0x62, 0xd0, 0x2b, 0x0b, 0xb8, 0x5e, 0x5d, 0x40, ++ 0x0c, 0x71, 0xde, 0x36, 0xbd, 0xbe, 0xf3, 0x44, 0xdb, 0x70, 0x5d, 0x4b, ++ 0xe8, 0xb8, 0xa0, 0x3f, 0x83, 0xf3, 0xa2, 0xf6, 0x33, 0x85, 0xdd, 0x42, ++ 0xcd, 0x77, 0x78, 0x3a, 0xce, 0x5b, 0x72, 0xf9, 0xc2, 0xcc, 0xa3, 0x81, ++ 0x04, 0xfc, 0x90, 0x7f, 0xd7, 0xb8, 0x8b, 0xc5, 0xbd, 0x8d, 0xf3, 0x32, ++ 0xae, 0x63, 0xb0, 0xf3, 0x5c, 0xe8, 0xba, 0xad, 0x2a, 0xbe, 0x38, 0x64, ++ 0x5c, 0xc3, 0xbc, 0x05, 0xbc, 0x31, 0x50, 0x1c, 0x82, 0x07, 0x01, 0xf7, ++ 0x85, 0x5e, 0x06, 0xcf, 0x85, 0x9d, 0x12, 0xe2, 0xeb, 0x2f, 0xdc, 0x5e, ++ 0xa3, 0x7f, 0x18, 0x9f, 0x36, 0xe2, 0xbf, 0x81, 0x78, 0xa6, 0x43, 0x9e, ++ 0x42, 0xc3, 0x93, 0x54, 0x7e, 0xa6, 0x04, 0xe9, 0x41, 0xd0, 0xc1, 0xe2, ++ 0xdd, 0x3e, 0x0b, 0xd8, 0xcb, 0x5f, 0x90, 0xb6, 0xd8, 0x18, 0xca, 0x07, ++ 0xcb, 0x36, 0xed, 0xbe, 0x63, 0xa2, 0x0a, 0xfe, 0xf3, 0x31, 0xf4, 0x43, ++ 0xea, 0x12, 0xfc, 0x19, 0xa6, 0x78, 0x42, 0x12, 0xbd, 0x2f, 0x3d, 0x5d, ++ 0x73, 0xd3, 0xb5, 0xe3, 0xfc, 0xff, 0x2a, 0x38, 0xc1, 0x2a, 0xe0, 0x7e, ++ 0x5a, 0x6c, 0x47, 0xe1, 0xb2, 0x60, 0x9b, 0xec, 0x8e, 0x2c, 0xd4, 0xd5, ++ 0xe3, 0x79, 0xda, 0x5e, 0x84, 0xd7, 0x22, 0xaf, 0xd7, 0x02, 0x71, 0xd0, ++ 0x45, 0x3c, 0xae, 0x78, 0xad, 0x79, 0x36, 0x29, 0xec, 0x3c, 0xef, 0xb5, ++ 0xe7, 0xcb, 0xe0, 0xf8, 0xaf, 0x9e, 0xf7, 0xd3, 0x05, 0x7a, 0x3b, 0x36, ++ 0x68, 0x1f, 0x65, 0x84, 0xf5, 0xb7, 0xfa, 0xec, 0xa2, 0x6b, 0xe8, 0xe3, ++ 0x0f, 0xcc, 0xfe, 0x91, 0xa0, 0x8f, 0x03, 0x23, 0x15, 0xd4, 0x47, 0x5f, ++ 0x2b, 0xae, 0xf7, 0xca, 0x93, 0x40, 0x3f, 0x67, 0xa0, 0xdf, 0x30, 0x90, ++ 0xbc, 0x5d, 0xc8, 0xf5, 0xf2, 0x02, 0xd0, 0xd3, 0xf4, 0xf9, 0xe9, 0xa6, ++ 0xbd, 0x78, 0x6e, 0xec, 0x2f, 0x4f, 0xee, 0xc5, 0x7d, 0x43, 0xcb, 0x8b, ++ 0x0b, 0x62, 0xc1, 0x5e, 0xfe, 0x74, 0xd3, 0xbc, 0x9f, 0x40, 0xde, 0xfc, ++ 0xa7, 0xbb, 0xe6, 0xa1, 0x5e, 0x6e, 0x78, 0x46, 0xe8, 0x65, 0xcd, 0x12, ++ 0xaa, 0xef, 0x2b, 0x37, 0xd5, 0x3f, 0xf7, 0x7f, 0x80, 0x4e, 0x77, 0x44, ++ 0xe2, 0x09, 0x85, 0x85, 0x5d, 0x1a, 0xb7, 0xc7, 0xa9, 0xfc, 0x03, 0xb9, ++ 0xb8, 0x89, 0xc9, 0x3f, 0xf2, 0x24, 0x93, 0x8f, 0x0d, 0xb1, 0xec, 0xde, ++ 0x6f, 0xaa, 0xbf, 0xb2, 0xa0, 0xde, 0x83, 0x0b, 0xb5, 0x2c, 0xa0, 0xf7, ++ 0x90, 0xf7, 0xa8, 0xd7, 0x1e, 0x9c, 0xa7, 0x95, 0x62, 0x7b, 0x62, 0xf7, ++ 0xb3, 0x7b, 0x21, 0xed, 0x7e, 0xd0, 0x5f, 0x42, 0xbf, 0x0a, 0xbd, 0x7b, ++ 0x74, 0x98, 0xd6, 0x55, 0x00, 0x7a, 0x41, 0x3e, 0xfa, 0xee, 0x43, 0x74, ++ 0xfd, 0xe7, 0xf6, 0xc8, 0x18, 0xd3, 0x69, 0x94, 0xb7, 0x8c, 0x82, 0xdf, ++ 0x43, 0x18, 0x48, 0x8e, 0xff, 0xf3, 0xf0, 0x36, 0xf5, 0xc1, 0x3b, 0x65, ++ 0x10, 0xf0, 0x9e, 0x0b, 0xf0, 0x46, 0x7b, 0x88, 0xc1, 0xfb, 0xe3, 0x75, ++ 0x0c, 0xce, 0x9f, 0xac, 0x67, 0x70, 0x6f, 0xdd, 0x95, 0x16, 0x0b, 0x7e, ++ 0xf0, 0xc7, 0xeb, 0xd2, 0xd0, 0x0e, 0xfa, 0x78, 0x57, 0x06, 0xc2, 0x7b, ++ 0xfe, 0x63, 0x14, 0xde, 0x68, 0x07, 0xab, 0x7a, 0x3b, 0x68, 0x1d, 0x85, ++ 0x37, 0xd8, 0xff, 0x00, 0x6f, 0x3a, 0xee, 0xdc, 0x2e, 0x95, 0xc3, 0xdb, ++ 0xc5, 0xe0, 0xbd, 0x8e, 0xeb, 0xa1, 0xf5, 0xec, 0x39, 0xbf, 0x1f, 0x5c, ++ 0xbd, 0x98, 0x6f, 0xfa, 0xe0, 0xf3, 0x11, 0x2e, 0xd0, 0xef, 0xa7, 0x23, ++ 0xfd, 0x0e, 0xf0, 0x53, 0x4e, 0xef, 0x96, 0x09, 0xec, 0xe7, 0xf7, 0xd9, ++ 0x49, 0xdc, 0x9e, 0x11, 0x70, 0xfe, 0x86, 0xb4, 0xfd, 0x3b, 0xd8, 0x55, ++ 0xfd, 0xec, 0x9b, 0x0d, 0x11, 0xc4, 0x4e, 0xfb, 0x5b, 0xfc, 0x92, 0x0d, ++ 0xcf, 0xd5, 0x7c, 0x2e, 0x95, 0x0f, 0x05, 0x04, 0x9c, 0x6d, 0xfb, 0x6d, ++ 0x2c, 0x8c, 0x17, 0x1c, 0xbf, 0xcf, 0xae, 0xb9, 0x54, 0x10, 0x6a, 0xd7, ++ 0x0c, 0x12, 0x3f, 0xcb, 0x89, 0x07, 0xf3, 0xde, 0x97, 0x77, 0xfe, 0xf6, ++ 0x04, 0xd8, 0xf5, 0x70, 0xbd, 0x0a, 0xf8, 0xfd, 0xcb, 0xc5, 0x39, 0xf8, ++ 0x0e, 0xfd, 0x39, 0x78, 0x49, 0x05, 0x99, 0x06, 0x21, 0x0a, 0x97, 0xd5, ++ 0x0a, 0x74, 0x30, 0xc2, 0x78, 0x4f, 0x80, 0x86, 0xbf, 0x0f, 0x71, 0x31, ++ 0xe3, 0xab, 0x39, 0x2b, 0x90, 0x9f, 0x03, 0x99, 0xa1, 0xfb, 0x41, 0x4d, ++ 0x51, 0x7e, 0x33, 0xc4, 0xa3, 0x02, 0xbb, 0x25, 0xc4, 0x77, 0xe3, 0x03, ++ 0xe5, 0xb1, 0xe5, 0x04, 0xf6, 0xb3, 0x9a, 0x71, 0x1e, 0x8e, 0x42, 0xa6, ++ 0x9f, 0x25, 0xb7, 0x1b, 0xe3, 0x8c, 0x11, 0x94, 0x6e, 0xa2, 0xe8, 0x78, ++ 0xce, 0x42, 0x15, 0xe7, 0x2b, 0xa9, 0x76, 0x16, 0x77, 0xdc, 0x4c, 0xc7, ++ 0xb5, 0x05, 0xe7, 0x6b, 0x7c, 0x3f, 0x1d, 0x04, 0x11, 0xe8, 0xf7, 0x18, ++ 0x13, 0xea, 0x77, 0xe3, 0xfa, 0x27, 0xf3, 0x71, 0x1a, 0x65, 0x13, 0xfa, ++ 0x21, 0xcb, 0x2c, 0xcc, 0x1f, 0x11, 0x79, 0x13, 0x19, 0xfc, 0x7b, 0x46, ++ 0x21, 0xf3, 0xeb, 0xf3, 0x0a, 0xd9, 0x3e, 0x43, 0x6f, 0x24, 0x41, 0xfd, ++ 0xd1, 0xbb, 0x21, 0xda, 0xb7, 0x0a, 0xd7, 0x57, 0x85, 0xf1, 0x4f, 0x85, ++ 0x30, 0xfa, 0x56, 0x04, 0xdc, 0xec, 0xca, 0x97, 0xba, 0x7b, 0xca, 0x79, ++ 0x7c, 0x01, 0x7e, 0xbf, 0x00, 0x8c, 0xea, 0xf9, 0x11, 0x3c, 0xfe, 0x4b, ++ 0x55, 0x2d, 0xb4, 0xbf, 0x87, 0xb7, 0xbf, 0xa7, 0xed, 0x6d, 0xdc, 0xcf, ++ 0xa3, 0x9e, 0xcc, 0x2f, 0x40, 0xff, 0xce, 0x6e, 0x89, 0x70, 0x81, 0x3d, ++ 0xeb, 0x85, 0xfb, 0xad, 0x28, 0xdd, 0xfd, 0x38, 0x8a, 0xed, 0xbf, 0x90, ++ 0xa4, 0x38, 0x05, 0xf8, 0xea, 0x6e, 0x2e, 0x67, 0xef, 0x69, 0x7b, 0xdc, ++ 0x03, 0xfa, 0x68, 0x76, 0x5b, 0xb4, 0x1b, 0x9e, 0x74, 0x1c, 0x2f, 0xe1, ++ 0xf1, 0xd6, 0x62, 0xd8, 0xbf, 0x1d, 0x6e, 0xc1, 0x78, 0x6b, 0x9d, 0xb5, ++ 0xe7, 0x45, 0x30, 0xaf, 0xef, 0x75, 0x7e, 0xf2, 0x3d, 0x2b, 0x5d, 0xda, ++ 0x2a, 0x13, 0xb3, 0x5f, 0x56, 0x25, 0x10, 0xcc, 0x3b, 0x19, 0x43, 0xcd, ++ 0x78, 0x88, 0xdf, 0xd2, 0x4f, 0xfb, 0xae, 0x24, 0x5e, 0x8d, 0x7e, 0xf4, ++ 0xf1, 0xe4, 0x65, 0x10, 0xd7, 0x65, 0xf7, 0xb5, 0x79, 0x51, 0x9e, 0xc8, ++ 0x26, 0x5d, 0x79, 0x19, 0xff, 0x5d, 0x81, 0xba, 0xc2, 0xcc, 0x3b, 0x9f, ++ 0x1c, 0x41, 0xc8, 0x1f, 0x88, 0x5a, 0x00, 0xf8, 0x5e, 0x06, 0xb0, 0x01, ++ 0x7a, 0xa8, 0x8f, 0xc3, 0xf8, 0xc0, 0xad, 0x10, 0x5f, 0x4e, 0x80, 0xa7, ++ 0x82, 0x74, 0x36, 0x43, 0x21, 0x5e, 0x13, 0x7b, 0xae, 0x8b, 0xc1, 0x73, ++ 0xfe, 0x2c, 0xde, 0x3c, 0x9d, 0xaf, 0xfb, 0xbb, 0x13, 0x88, 0x3f, 0x8e, ++ 0xae, 0xd7, 0xff, 0xa6, 0x3e, 0xde, 0x7d, 0xa7, 0xdf, 0xe4, 0xcf, 0xa2, ++ 0x78, 0xb8, 0x55, 0xf1, 0xef, 0x07, 0xba, 0x36, 0x59, 0x55, 0x33, 0xf8, ++ 0x07, 0x9e, 0x1a, 0x69, 0x2c, 0xf8, 0xcd, 0xcb, 0x56, 0x0f, 0x6e, 0xbe, ++ 0x4d, 0x85, 0x45, 0x38, 0xdf, 0x65, 0x26, 0x13, 0x9b, 0xe7, 0x43, 0x12, ++ 0xde, 0xcb, 0x70, 0x0f, 0x65, 0x72, 0xa0, 0xcf, 0x39, 0x0a, 0xe9, 0x92, ++ 0xc7, 0x32, 0xfc, 0x01, 0xfd, 0x35, 0x25, 0xb0, 0x7b, 0x80, 0x03, 0xf7, ++ 0x31, 0xfa, 0x16, 0x71, 0x76, 0x81, 0xa7, 0x22, 0xda, 0x7d, 0x28, 0x7c, ++ 0xef, 0xe1, 0xf3, 0xa3, 0xfd, 0xac, 0x8b, 0x85, 0xf6, 0x96, 0xf0, 0xf1, ++ 0xa5, 0x1f, 0x16, 0x0a, 0xbf, 0x98, 0xd9, 0x9d, 0x4b, 0x39, 0xbf, 0x2e, ++ 0x15, 0xf4, 0xb6, 0x4b, 0xcf, 0xa7, 0xcf, 0x02, 0xbf, 0x00, 0x1f, 0x81, ++ 0x9d, 0x4b, 0xe1, 0x76, 0x0f, 0x7f, 0x0e, 0x44, 0xef, 0x9b, 0x38, 0xbd, ++ 0x6f, 0xe2, 0xf4, 0xde, 0xca, 0xcb, 0x83, 0x1d, 0xaf, 0x31, 0x82, 0xf8, ++ 0x43, 0x7f, 0xaf, 0x45, 0x8c, 0x7b, 0x2b, 0x7f, 0x3e, 0x5d, 0x98, 0x8a, ++ 0xfd, 0x89, 0x79, 0x08, 0x7a, 0x26, 0x3c, 0x3e, 0x65, 0xa2, 0x92, 0x03, ++ 0xe8, 0xe8, 0x54, 0xdb, 0x1a, 0xb4, 0x9b, 0x16, 0x19, 0xe2, 0xc5, 0x24, ++ 0x34, 0x8e, 0x25, 0x87, 0x2b, 0xf7, 0xc9, 0x1f, 0xd3, 0x15, 0x78, 0x5a, ++ 0x02, 0xf3, 0x61, 0x3e, 0xd2, 0x77, 0x22, 0x5d, 0x40, 0xd7, 0xf7, 0x58, ++ 0xda, 0x33, 0xd8, 0xbd, 0x12, 0xfa, 0x7a, 0x62, 0xff, 0xb7, 0x0e, 0x6e, ++ 0xee, 0xc2, 0xf3, 0x3a, 0x44, 0xf7, 0x7b, 0x0a, 0xd5, 0x72, 0x0c, 0xe6, ++ 0x13, 0xd5, 0x49, 0xec, 0x5e, 0x99, 0xde, 0x72, 0x9b, 0xd7, 0x44, 0xed, ++ 0xc5, 0x0f, 0xf8, 0xbd, 0x0e, 0xe7, 0x9b, 0xd9, 0xf9, 0xd0, 0xba, 0x87, ++ 0xf8, 0xef, 0xa0, 0xc4, 0x3d, 0x38, 0x1d, 0xec, 0xc3, 0xba, 0x58, 0x8b, ++ 0x02, 0xcf, 0x0f, 0xf8, 0xfd, 0x72, 0xf7, 0x92, 0x6e, 0x5b, 0x4a, 0x4a, ++ 0xd0, 0x3e, 0x69, 0x2d, 0x97, 0xf9, 0xef, 0x6e, 0xcc, 0xbd, 0xd3, 0x9d, ++ 0x0f, 0xf7, 0x44, 0x10, 0x51, 0xde, 0xe8, 0x1e, 0x81, 0x51, 0x25, 0x5e, ++ 0x6e, 0x78, 0x0f, 0xf6, 0x3b, 0x66, 0x5e, 0xa6, 0x74, 0x80, 0xe5, 0x45, ++ 0x77, 0xba, 0xa9, 0xdc, 0xe8, 0x3d, 0xc4, 0xbf, 0x7b, 0x69, 0x19, 0xf0, ++ 0xf8, 0x88, 0xa0, 0xe7, 0x46, 0xec, 0xaf, 0xf7, 0x29, 0xf1, 0xfd, 0x3e, ++ 0x56, 0x7e, 0x54, 0x7c, 0x7f, 0x90, 0x95, 0xff, 0x4d, 0xf4, 0xcf, 0xcb, ++ 0x1b, 0x0c, 0xdf, 0x57, 0x19, 0xbe, 0xff, 0x9c, 0x95, 0xdf, 0x2c, 0x7c, ++ 0xf0, 0x4e, 0x2f, 0xd8, 0xb5, 0x7c, 0x1f, 0xa7, 0xee, 0x06, 0x09, 0xe5, ++ 0x8a, 0x95, 0xd3, 0x5b, 0xdd, 0x6a, 0x3f, 0xc2, 0xb9, 0xce, 0x74, 0x80, ++ 0x3d, 0x2b, 0x88, 0x1f, 0xce, 0xd7, 0x5e, 0xab, 0xde, 0x37, 0x85, 0x1e, ++ 0x6b, 0xa1, 0x03, 0xee, 0x37, 0x38, 0x65, 0x03, 0xfd, 0xfd, 0xad, 0xcb, ++ 0x8d, 0xe5, 0xf3, 0xf9, 0xda, 0xf1, 0x42, 0x5a, 0x7f, 0xc9, 0x6d, 0x92, ++ 0xd7, 0x02, 0xf2, 0xf2, 0xb8, 0x2f, 0x93, 0xcb, 0xf7, 0xb0, 0x79, 0xb9, ++ 0x56, 0x4e, 0xbf, 0x17, 0xc6, 0xd0, 0xfe, 0xc6, 0x07, 0xe1, 0x4d, 0xfb, ++ 0xf9, 0xf0, 0x9f, 0xe9, 0x67, 0x75, 0xff, 0x7e, 0x3e, 0x85, 0x79, 0x5d, ++ 0x6f, 0x3f, 0xd3, 0x5d, 0x6c, 0x7d, 0x21, 0xfd, 0xf4, 0xfe, 0x33, 0xfd, ++ 0xec, 0x75, 0xe9, 0xe7, 0x23, 0xec, 0xa3, 0xa9, 0x63, 0xdd, 0x51, 0x63, ++ 0x40, 0x3e, 0x54, 0xdd, 0xa8, 0x8b, 0xfb, 0x2d, 0xfd, 0x91, 0x2b, 0x0e, ++ 0xec, 0x2b, 0xf2, 0x0e, 0xfb, 0x1d, 0x93, 0xa5, 0xab, 0xdb, 0x47, 0x8d, ++ 0xa3, 0xfd, 0x2f, 0xfd, 0xaf, 0x57, 0x46, 0x2d, 0x0c, 0xf1, 0xc7, 0x97, ++ 0x5f, 0x92, 0x89, 0x1b, 0xee, 0x47, 0xb8, 0x24, 0xe1, 0xf3, 0x8b, 0xfd, ++ 0x7f, 0xb2, 0xc0, 0xf9, 0xfc, 0xe5, 0xfb, 0xf6, 0x5b, 0x26, 0xe7, 0xc3, ++ 0xef, 0x2f, 0xec, 0xb7, 0x54, 0x86, 0xcc, 0x6b, 0x99, 0xc8, 0xb3, 0x24, ++ 0x3d, 0xca, 0x8c, 0x10, 0xfd, 0x1e, 0x37, 0xc6, 0xc4, 0xe5, 0x06, 0xfb, ++ 0x1d, 0x87, 0xa5, 0xff, 0x75, 0x46, 0x01, 0x7c, 0x2e, 0x35, 0xb5, 0x7f, ++ 0xfa, 0x0c, 0xc4, 0x81, 0x6e, 0x90, 0xc2, 0xee, 0xd7, 0xfe, 0x95, 0xaf, ++ 0xef, 0xa3, 0x01, 0xce, 0x83, 0x39, 0xc6, 0x30, 0xf9, 0x57, 0x56, 0xec, ++ 0x4e, 0x82, 0x75, 0x5e, 0x04, 0x19, 0x44, 0xeb, 0x57, 0xae, 0x09, 0xbf, ++ 0xcf, 0x3f, 0x67, 0x0c, 0x8b, 0x27, 0xd6, 0xf1, 0x7b, 0x95, 0xe7, 0x95, ++ 0xd8, 0xac, 0x2a, 0x85, 0xf3, 0xf8, 0xe3, 0x6c, 0x7f, 0x7a, 0xe1, 0xe6, ++ 0x94, 0xb1, 0x10, 0xe7, 0x75, 0x14, 0x54, 0x8c, 0x1a, 0x03, 0xf3, 0x1d, ++ 0x30, 0x5e, 0x1a, 0x60, 0xf1, 0xd2, 0x4e, 0x16, 0x2f, 0xad, 0x4b, 0xe8, ++ 0x7e, 0x00, 0xee, 0x31, 0xbd, 0xeb, 0x57, 0x4f, 0x6d, 0x84, 0x7b, 0x4d, ++ 0xa7, 0x6e, 0x14, 0x7c, 0x42, 0xf0, 0xf7, 0x72, 0x6a, 0x22, 0x04, 0xdf, ++ 0xed, 0xba, 0xb3, 0xaa, 0x0c, 0xe3, 0x5f, 0x58, 0x2e, 0x1b, 0xf3, 0xc2, ++ 0x46, 0xe0, 0x9b, 0x23, 0xfc, 0x5e, 0xf1, 0xd9, 0xa5, 0x05, 0x51, 0x20, ++ 0x1f, 0x7a, 0x52, 0xa2, 0x4d, 0x76, 0x2a, 0x47, 0x46, 0xe4, 0xd7, 0xdf, ++ 0x05, 0xf3, 0x98, 0x5d, 0x7a, 0xd3, 0x64, 0x78, 0x5f, 0x1e, 0x61, 0xcb, ++ 0xac, 0x67, 0x71, 0x77, 0xa4, 0x8b, 0x11, 0xf9, 0x9e, 0x62, 0xf8, 0x0e, ++ 0xf5, 0x21, 0xde, 0xa1, 0x59, 0x58, 0xfc, 0x4b, 0x7b, 0x4b, 0xc6, 0xf8, ++ 0x97, 0x56, 0x18, 0xad, 0x85, 0xdb, 0x7f, 0x1e, 0xcb, 0xe1, 0x70, 0xd7, ++ 0x18, 0x76, 0x4f, 0xf1, 0x11, 0x13, 0x9d, 0xe7, 0xd8, 0xe0, 0x3c, 0xc4, ++ 0xf8, 0xd4, 0x60, 0x79, 0xa0, 0x9b, 0xf6, 0x77, 0x6a, 0xf5, 0xb0, 0x22, ++ 0xb8, 0x97, 0xbf, 0x25, 0xbf, 0x7c, 0x16, 0xd2, 0x13, 0x1f, 0xbf, 0x25, ++ 0x5f, 0xab, 0x86, 0xb2, 0x18, 0x9f, 0x2e, 0xb7, 0x10, 0xde, 0x0f, 0x76, ++ 0x1e, 0x15, 0x9c, 0x2e, 0x66, 0x8d, 0x61, 0x78, 0xf3, 0x94, 0x51, 0x7a, ++ 0x0b, 0xf1, 0x1b, 0x67, 0x54, 0x45, 0xeb, 0xca, 0x33, 0x6b, 0x13, 0x89, ++ 0x3b, 0x34, 0x0e, 0x3b, 0x33, 0x59, 0x57, 0x9e, 0x55, 0x97, 0xa6, 0xab, ++ 0x7f, 0xf7, 0xfc, 0x3c, 0xdd, 0xf7, 0x69, 0x11, 0xdd, 0xc5, 0xcd, 0xd7, ++ 0x61, 0x07, 0x37, 0xd9, 0x6c, 0x51, 0x60, 0x8f, 0x7d, 0xd8, 0xf9, 0xcd, ++ 0x7f, 0xdf, 0x03, 0xf6, 0xdd, 0x36, 0xd9, 0x25, 0xd1, 0xf5, 0x2c, 0x7e, ++ 0x6d, 0xfb, 0x7f, 0xc3, 0xef, 0xa3, 0x9c, 0x87, 0x1f, 0x5c, 0x60, 0xe7, ++ 0xaf, 0x30, 0x1e, 0xf6, 0xf9, 0x11, 0xf6, 0x7b, 0x7f, 0xd4, 0xae, 0x53, ++ 0x42, 0xf7, 0x75, 0xce, 0x91, 0x6e, 0xcc, 0x2b, 0x0c, 0xd9, 0x2f, 0x08, ++ 0xbb, 0x9f, 0x2a, 0xf6, 0x0b, 0x96, 0xda, 0xbb, 0x30, 0xff, 0xef, 0x7f, ++ 0xbb, 0xaf, 0xd3, 0x32, 0x86, 0xef, 0x17, 0x8c, 0x25, 0x63, 0x41, 0x1f, ++ 0x9e, 0x6f, 0x7e, 0x17, 0xe3, 0x70, 0xcb, 0x63, 0xd8, 0xba, 0xce, 0xbd, ++ 0xc2, 0xef, 0x21, 0x07, 0x3d, 0x42, 0xe9, 0xfc, 0x66, 0x68, 0x08, 0xf7, ++ 0x85, 0x5d, 0x5a, 0x85, 0xbf, 0xef, 0x53, 0xc9, 0x7f, 0xbf, 0x75, 0xd8, ++ 0x18, 0x95, 0xf9, 0x05, 0x23, 0xee, 0x53, 0xe0, 0xdc, 0x77, 0x13, 0x7d, ++ 0x82, 0xfc, 0x9f, 0x4c, 0xe5, 0x54, 0x1c, 0xa5, 0x93, 0xee, 0xfd, 0xa4, ++ 0x60, 0x1f, 0xe4, 0x5d, 0xa4, 0xd8, 0x30, 0x9f, 0xbc, 0xf1, 0xd2, 0xed, ++ 0x18, 0xe7, 0x3e, 0x12, 0xe5, 0xcd, 0xbf, 0x8f, 0xd6, 0x5b, 0xba, 0x6e, ++ 0x0a, 0x96, 0x97, 0x5f, 0x8a, 0xc6, 0x7e, 0x7f, 0x2f, 0x77, 0x4f, 0xc6, ++ 0xbc, 0xe6, 0x97, 0xd9, 0xef, 0x21, 0x4e, 0x4b, 0x9e, 0xbd, 0x1a, 0xe6, ++ 0x0f, 0xf5, 0xef, 0xa7, 0xe3, 0x4d, 0xfb, 0xd5, 0xcd, 0x35, 0x00, 0xa7, ++ 0xe5, 0xfb, 0xd8, 0xf9, 0xa9, 0x69, 0xf2, 0x1f, 0x8a, 0xa1, 0x9f, 0x65, ++ 0x6d, 0x53, 0xb0, 0xfd, 0x34, 0x99, 0x1c, 0x91, 0xa8, 0xbd, 0x10, 0x77, ++ 0xe9, 0x1e, 0xec, 0x77, 0x1a, 0xe8, 0x7a, 0x5a, 0x96, 0x4b, 0x6c, 0x8f, ++ 0x81, 0xfe, 0x95, 0x2d, 0xfe, 0xcc, 0x67, 0x41, 0xae, 0x58, 0x6c, 0x28, ++ 0x57, 0x9a, 0x2e, 0x45, 0x62, 0xbb, 0xa9, 0x95, 0x4c, 0x4f, 0xfb, 0xc6, ++ 0x30, 0x3b, 0xc6, 0xdc, 0xc3, 0xe6, 0x55, 0x7d, 0xe9, 0x36, 0xfc, 0x2e, ++ 0xf0, 0xff, 0xc2, 0x98, 0x54, 0xdd, 0x3d, 0x32, 0x66, 0xc7, 0x36, 0x05, ++ 0xce, 0x27, 0x98, 0x7b, 0x24, 0xac, 0x7f, 0xcb, 0xa5, 0x3c, 0x7c, 0x8a, ++ 0x75, 0xbe, 0x95, 0xfd, 0x3c, 0xde, 0x57, 0x62, 0x76, 0x7c, 0x3d, 0x19, ++ 0xf2, 0x3a, 0xdf, 0x4a, 0x92, 0xec, 0x68, 0x7e, 0x18, 0xe4, 0xee, 0x85, ++ 0xe6, 0xd2, 0x38, 0x12, 0x46, 0x2e, 0xf5, 0x8d, 0x73, 0x89, 0xe5, 0x01, ++ 0x47, 0x5c, 0x62, 0x79, 0xc1, 0x2f, 0x14, 0xb9, 0x3b, 0x81, 0xbf, 0xa7, ++ 0x3f, 0xdc, 0xa3, 0xc0, 0xfe, 0x0e, 0x89, 0xb1, 0xda, 0x01, 0x5e, 0xd3, ++ 0x27, 0x14, 0xa9, 0x0b, 0x43, 0xf8, 0x49, 0x3e, 0x70, 0x97, 0x05, 0xf0, ++ 0x62, 0x7e, 0xf2, 0x98, 0x05, 0xf4, 0x7e, 0x04, 0x7d, 0x56, 0x86, 0x7c, ++ 0x6f, 0x14, 0xf9, 0xeb, 0x06, 0xb9, 0x7c, 0x80, 0xcb, 0x01, 0x71, 0x7e, ++ 0x41, 0xe8, 0x19, 0xa2, 0x76, 0xe8, 0x7e, 0x5f, 0x4d, 0xf0, 0xcb, 0xaf, ++ 0x38, 0xbf, 0x8a, 0xf6, 0xdd, 0x40, 0xeb, 0x80, 0xc7, 0x97, 0x22, 0xd0, ++ 0x9f, 0x7a, 0xa3, 0x48, 0x7b, 0x17, 0xe6, 0xdb, 0x5d, 0xce, 0x7e, 0x27, ++ 0x83, 0x28, 0xdd, 0xa3, 0x60, 0x5f, 0xe5, 0x5f, 0x35, 0x7f, 0x8a, 0x67, ++ 0xab, 0x84, 0xf6, 0x7e, 0x0f, 0xe6, 0xc5, 0x4f, 0x9f, 0xa0, 0x9a, 0x60, ++ 0xbf, 0xe0, 0xfd, 0xbe, 0x75, 0x30, 0xbe, 0xbd, 0xd6, 0x3a, 0x7e, 0xcb, ++ 0xeb, 0xff, 0x5e, 0x26, 0x2d, 0xd0, 0xef, 0xef, 0x27, 0x4d, 0xea, 0x76, ++ 0xd3, 0xfe, 0xf6, 0xff, 0x70, 0xdc, 0x38, 0x90, 0xff, 0x62, 0xdc, 0x2f, ++ 0xc6, 0xb0, 0x73, 0xc3, 0xc4, 0x1e, 0xb8, 0x0c, 0xfe, 0x5d, 0xd3, 0xeb, ++ 0xd1, 0x2a, 0xf0, 0xf7, 0x34, 0x70, 0x96, 0x8a, 0x83, 0x76, 0x2d, 0x7d, ++ 0x8f, 0xf7, 0xe5, 0x35, 0xbd, 0x1e, 0xb1, 0x55, 0xa2, 0xdf, 0x9b, 0x62, ++ 0xa9, 0x7f, 0x4b, 0xc7, 0xaf, 0x7c, 0x23, 0xd2, 0x0f, 0x74, 0xbc, 0xff, ++ 0x8d, 0x48, 0x05, 0x7f, 0xa7, 0xa8, 0x58, 0xfb, 0x02, 0xe4, 0x65, 0xe5, ++ 0x1b, 0x59, 0x55, 0xe0, 0xcf, 0xb9, 0x3b, 0x23, 0x14, 0x82, 0x76, 0x8e, ++ 0xfb, 0x2c, 0xca, 0xd5, 0x01, 0xe6, 0x7b, 0x2d, 0x39, 0x65, 0xa4, 0x33, ++ 0xc1, 0x97, 0xda, 0x3a, 0xc6, 0x2f, 0xf5, 0x9c, 0x4e, 0xe7, 0x72, 0xfe, ++ 0xd3, 0x38, 0x1f, 0x5d, 0x68, 0x1e, 0x8a, 0x7c, 0x78, 0xe1, 0x61, 0x3a, ++ 0x69, 0xd8, 0x0f, 0x7d, 0x58, 0x2a, 0xd8, 0x07, 0x76, 0x81, 0x6a, 0xc3, ++ 0xfb, 0x89, 0x05, 0x5f, 0x4e, 0x03, 0x3f, 0x88, 0xbe, 0xff, 0x7f, 0x46, ++ 0xe4, 0x8e, 0x2c, 0x00, 0x80, 0x00, 0x00, 0x00, 0x1f, 0x8b, 0x08, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xc5, 0x7d, 0x0b, 0x78, 0x54, 0xd5, ++ 0xb5, 0xf0, 0x3e, 0x73, 0xce, 0xbc, 0x92, 0x99, 0xc9, 0xe4, 0x49, 0x42, ++ 0x1e, 0x9c, 0x40, 0x08, 0x41, 0x02, 0x4c, 0x26, 0x21, 0x84, 0x10, 0x60, ++ 0x12, 0x02, 0xa2, 0x02, 0x0e, 0x50, 0x15, 0x30, 0xc8, 0x80, 0x08, 0x11, ++ 0x09, 0x09, 0x51, 0x5b, 0xac, 0xf6, 0xcf, 0x84, 0x24, 0x10, 0x45, 0x2d, ++ 0x56, 0xdb, 0x06, 0x8b, 0x74, 0xc0, 0x47, 0x51, 0x69, 0x6f, 0x40, 0x6c, ++ 0xd3, 0x16, 0x61, 0x78, 0x68, 0x63, 0xf5, 0xd3, 0x68, 0xef, 0x6d, 0xf1, ++ 0xd6, 0xda, 0xf8, 0xb8, 0x88, 0x8a, 0x35, 0x82, 0xf5, 0xa3, 0xb7, 0x28, ++ 0xff, 0x5a, 0x6b, 0xef, 0x9d, 0x99, 0x33, 0x49, 0x10, 0xed, 0xbd, 0xff, ++ 0x1f, 0xe5, 0x3b, 0x59, 0x67, 0xef, 0xb3, 0x1f, 0x6b, 0xad, 0xbd, 0x5e, ++ 0x7b, 0xed, 0x9d, 0x79, 0xe3, 0x12, 0x43, 0x2d, 0x0a, 0x63, 0xeb, 0xce, ++ 0x25, 0x32, 0x96, 0xcc, 0xd8, 0x3c, 0x95, 0x75, 0x2b, 0x49, 0x8c, 0xd5, ++ 0x9d, 0xcb, 0x65, 0xac, 0x98, 0xb1, 0xf5, 0xe7, 0x92, 0xe9, 0x7d, 0xfd, ++ 0x39, 0x3b, 0x3d, 0x57, 0x9e, 0x1b, 0x47, 0xef, 0xad, 0xe7, 0x54, 0xe6, ++ 0x03, 0x78, 0xd5, 0x39, 0x85, 0xf9, 0x00, 0xbe, 0x6a, 0xa6, 0x33, 0x68, ++ 0x4a, 0x60, 0xec, 0x42, 0x51, 0x20, 0xd3, 0x93, 0x0a, 0xed, 0xb4, 0x5c, ++ 0x3e, 0x87, 0xb9, 0x18, 0x0b, 0x6c, 0xca, 0x28, 0x09, 0x38, 0x18, 0x9b, ++ 0x7f, 0x57, 0xaf, 0x66, 0x4b, 0x61, 0x8c, 0x39, 0x2c, 0xee, 0xc7, 0xa1, ++ 0xbf, 0xf9, 0x65, 0x45, 0xe9, 0xab, 0xe1, 0xfd, 0x05, 0xfc, 0x99, 0xc1, ++ 0x58, 0xcb, 0x91, 0x25, 0x4c, 0x77, 0x42, 0xbb, 0x29, 0x7e, 0x8b, 0x0f, ++ 0xde, 0xaf, 0x82, 0xe7, 0xcc, 0xa8, 0xf2, 0x9b, 0x18, 0xf3, 0x75, 0x02, ++ 0xcc, 0x98, 0x7b, 0x76, 0x5a, 0x09, 0x7c, 0xdf, 0x9a, 0x6b, 0xba, 0x87, ++ 0x45, 0xca, 0x75, 0x8f, 0x89, 0xb1, 0x49, 0x58, 0xde, 0x4c, 0xcf, 0xf9, ++ 0xb2, 0xbe, 0xde, 0xc5, 0x58, 0x1a, 0x63, 0x37, 0xb8, 0x19, 0xff, 0xd9, ++ 0x08, 0x83, 0xcb, 0x60, 0xcc, 0x29, 0xea, 0xaf, 0x74, 0x84, 0x47, 0x9b, ++ 0xa0, 0x3d, 0x73, 0x83, 0xdd, 0xb3, 0x09, 0xc6, 0x75, 0x26, 0x45, 0x9f, ++ 0xcd, 0x00, 0x6e, 0xbc, 0x1b, 0x00, 0x40, 0x41, 0xa3, 0xd9, 0x3f, 0xd3, ++ 0x09, 0xe3, 0x6e, 0xdc, 0xae, 0x78, 0x82, 0xf0, 0xf9, 0x8d, 0xa5, 0x4e, ++ 0x1b, 0x83, 0x79, 0x96, 0x9e, 0x68, 0xb0, 0x04, 0x0a, 0x23, 0xfd, 0x2f, ++ 0x39, 0x37, 0x81, 0xe9, 0x80, 0x87, 0x45, 0xe7, 0xf2, 0xe8, 0x99, 0x3a, ++ 0x3e, 0x30, 0x01, 0xf1, 0xb0, 0xe2, 0xdc, 0xb5, 0x84, 0xaf, 0x95, 0x50, ++ 0x8e, 0x4f, 0xa6, 0x97, 0x99, 0x70, 0x3c, 0xb7, 0xd9, 0xf0, 0x77, 0x1c, ++ 0x10, 0xc0, 0xa5, 0x8c, 0xdd, 0x2a, 0xc6, 0xf7, 0x59, 0xc3, 0xe4, 0x61, ++ 0xdf, 0x81, 0xfe, 0x3f, 0x7b, 0xd9, 0x4c, 0xe5, 0x93, 0x7c, 0xc1, 0x1b, ++ 0x70, 0x3c, 0xe6, 0x90, 0xd5, 0xb3, 0x0b, 0xc6, 0x73, 0xca, 0x1e, 0x50, ++ 0x19, 0x8c, 0xe7, 0x54, 0x36, 0x73, 0x3f, 0x08, 0x43, 0x3c, 0x65, 0x66, ++ 0x41, 0x37, 0xd0, 0xeb, 0xc6, 0x0e, 0x95, 0x05, 0xa1, 0xfd, 0x55, 0xf0, ++ 0x0c, 0xc0, 0xf3, 0x54, 0x22, 0xf3, 0x25, 0x7a, 0x11, 0x9f, 0x30, 0xcf, ++ 0x02, 0xde, 0xf6, 0x05, 0xf8, 0xf7, 0x77, 0x6d, 0x5b, 0x0e, 0x1b, 0x05, ++ 0xf4, 0x6d, 0xfc, 0xd3, 0x5b, 0xda, 0x48, 0xc6, 0x6e, 0xce, 0xef, 0x99, ++ 0x10, 0x86, 0x76, 0x6b, 0x2a, 0xc3, 0xa9, 0xd7, 0x41, 0xbb, 0xa7, 0x1f, ++ 0x33, 0x7b, 0x82, 0xd0, 0xef, 0xba, 0x23, 0xaf, 0x97, 0x9a, 0xa0, 0xfc, ++ 0xc3, 0x5c, 0xdf, 0x30, 0xa6, 0x32, 0x36, 0x66, 0x78, 0x60, 0x0e, 0xce, ++ 0x67, 0xed, 0xc2, 0xd0, 0x2f, 0xcc, 0x00, 0xdf, 0x72, 0xdf, 0x33, 0xae, ++ 0x29, 0x7a, 0x04, 0x9f, 0x9d, 0x5a, 0x78, 0xb4, 0x06, 0xdf, 0x77, 0x02, ++ 0x1e, 0x83, 0x30, 0xae, 0xce, 0x7b, 0xd5, 0x39, 0x21, 0xa2, 0x17, 0x8b, ++ 0x5f, 0x30, 0x1e, 0x1f, 0x80, 0x3d, 0xa8, 0x3a, 0x7b, 0x81, 0x12, 0x4c, ++ 0x00, 0xfc, 0xb1, 0xea, 0xa9, 0x7c, 0xde, 0x36, 0x3e, 0xb6, 0xb5, 0xe7, ++ 0x46, 0x11, 0x7e, 0xce, 0x36, 0x58, 0xc7, 0x1f, 0x80, 0x76, 0xce, 0xea, ++ 0x4e, 0x0f, 0xbe, 0xaf, 0x3b, 0xb7, 0x88, 0xde, 0xdf, 0xd2, 0x7e, 0x05, ++ 0x3d, 0xcd, 0xbd, 0x57, 0x08, 0xbe, 0x8c, 0xe7, 0xfc, 0x9a, 0xb9, 0x6c, ++ 0x13, 0xf2, 0x59, 0x9d, 0x06, 0x95, 0xe1, 0xbb, 0x3a, 0x47, 0x42, 0x28, ++ 0x08, 0xf3, 0x99, 0xf7, 0x6f, 0xc0, 0x7f, 0x80, 0xf2, 0xf5, 0x07, 0x16, ++ 0xf8, 0x2b, 0x91, 0xef, 0x0a, 0x14, 0xcf, 0x68, 0x78, 0xac, 0xdb, 0x76, ++ 0x85, 0xe0, 0xf3, 0xdd, 0xf7, 0x97, 0x03, 0x5e, 0xe7, 0x7d, 0x92, 0xe2, ++ 0x69, 0x81, 0xf7, 0xbf, 0x6a, 0x4a, 0x07, 0x64, 0x45, 0xf8, 0x7f, 0xd6, ++ 0xb9, 0x05, 0x54, 0x2f, 0xe1, 0xdc, 0xf5, 0xd4, 0x9f, 0xe4, 0x7f, 0xab, ++ 0xe0, 0x77, 0x33, 0xf2, 0x7f, 0x14, 0xdf, 0xc3, 0x77, 0x8c, 0xc1, 0x77, ++ 0x81, 0xa2, 0xc0, 0x9d, 0x88, 0xa7, 0xaa, 0xa7, 0xff, 0xf9, 0xcc, 0x7f, ++ 0xc2, 0xab, 0x2b, 0xb5, 0x70, 0xfe, 0x4f, 0x52, 0xf0, 0xe9, 0x24, 0xfe, ++ 0x89, 0xac, 0x03, 0x9b, 0xfb, 0xf1, 0x5c, 0x5a, 0x07, 0xfa, 0xea, 0x28, ++ 0x3e, 0x52, 0x8f, 0x2e, 0xb1, 0xe8, 0x80, 0x2f, 0xf3, 0x43, 0x6f, 0xd3, ++ 0x3a, 0xb0, 0xc2, 0x73, 0x66, 0x54, 0xf9, 0x7a, 0xe4, 0xeb, 0x42, 0xc4, ++ 0x4c, 0xaf, 0xb6, 0xd0, 0x19, 0x79, 0x1f, 0xfc, 0x9a, 0xfc, 0xbf, 0x5e, ++ 0xd4, 0x9f, 0x63, 0x65, 0xcb, 0xfd, 0xd8, 0x9e, 0xd6, 0x93, 0x13, 0xdd, ++ 0xde, 0xe1, 0xa2, 0xaa, 0x07, 0x3d, 0x50, 0xde, 0xe1, 0x51, 0x78, 0x7b, ++ 0xff, 0x43, 0xe3, 0x06, 0x3c, 0xd9, 0x10, 0xbf, 0x30, 0x7e, 0x1f, 0xd2, ++ 0x6b, 0x7e, 0x99, 0x6e, 0xba, 0x27, 0x17, 0xfb, 0x91, 0xe3, 0xe7, 0x7c, ++ 0xf2, 0x55, 0xe3, 0x6f, 0x13, 0xf5, 0x5f, 0x55, 0xd9, 0x46, 0x6c, 0xf7, ++ 0xd5, 0x19, 0x33, 0x7a, 0x7c, 0xd0, 0xde, 0x91, 0x3b, 0x8b, 0x8b, 0x55, ++ 0x3d, 0xd2, 0xef, 0xd3, 0x1e, 0x0b, 0xb5, 0x37, 0x0f, 0x68, 0x87, 0xeb, ++ 0xa8, 0xef, 0x39, 0x6b, 0x68, 0x77, 0x2e, 0x8a, 0x11, 0xc6, 0x14, 0xa8, ++ 0xff, 0xc9, 0x73, 0x63, 0x43, 0xf7, 0xc0, 0x14, 0xdf, 0x62, 0x7d, 0xe7, ++ 0x71, 0x3c, 0xc1, 0x83, 0xf1, 0x3a, 0xce, 0xaf, 0xfe, 0x50, 0x3c, 0xd5, ++ 0xaf, 0x8f, 0x4b, 0x08, 0x29, 0x50, 0x5e, 0xef, 0xea, 0xcb, 0xf7, 0xc3, ++ 0x78, 0x66, 0x1e, 0xb6, 0x87, 0x91, 0xaf, 0x8e, 0x1c, 0xb6, 0x6b, 0x0c, ++ 0xfa, 0xad, 0x28, 0xb9, 0xf1, 0x69, 0xc4, 0xd3, 0xcc, 0xc3, 0x63, 0xaa, ++ 0x15, 0xe0, 0x43, 0xdf, 0x41, 0xab, 0xc6, 0xa0, 0xde, 0xdf, 0x27, 0xf8, ++ 0xf6, 0x22, 0x1f, 0x0c, 0x35, 0x7e, 0x39, 0xbe, 0xd8, 0xa7, 0x9c, 0xbf, ++ 0xe4, 0x2b, 0xb9, 0x5e, 0xe4, 0xfa, 0x90, 0xeb, 0x21, 0x76, 0xfd, 0xc8, ++ 0xf5, 0x70, 0xd5, 0x56, 0x4f, 0xc2, 0x77, 0x90, 0x4e, 0x80, 0x98, 0xc7, ++ 0x71, 0xfd, 0x68, 0xc1, 0xbd, 0x38, 0x8f, 0x3a, 0x3d, 0xbe, 0x08, 0xd7, ++ 0xa5, 0x5c, 0x47, 0xeb, 0x0f, 0x28, 0xb4, 0xce, 0x40, 0xe8, 0x7a, 0x46, ++ 0xeb, 0x91, 0x75, 0x24, 0xd7, 0x4d, 0x64, 0x9d, 0x98, 0x08, 0x0f, 0xf3, ++ 0x84, 0x9e, 0x18, 0x6a, 0x9d, 0xd4, 0x89, 0x75, 0x71, 0x93, 0x58, 0x17, ++ 0x72, 0x3d, 0x1c, 0x53, 0x3b, 0x1f, 0x2c, 0x87, 0xef, 0x66, 0x16, 0x05, ++ 0xfe, 0x82, 0x78, 0x92, 0xeb, 0x62, 0xdd, 0xfe, 0x58, 0xbd, 0x30, 0x24, ++ 0x5f, 0x31, 0xe4, 0xab, 0x9b, 0x52, 0x1a, 0x18, 0xf2, 0x55, 0x1d, 0x3c, ++ 0xa3, 0xf9, 0xca, 0x3a, 0xc4, 0x7a, 0x78, 0x07, 0xf9, 0x23, 0xf5, 0xd2, ++ 0xd7, 0x43, 0xcf, 0x25, 0xf2, 0xd3, 0xdf, 0x91, 0x9f, 0x26, 0xfd, 0xaf, ++ 0xf2, 0xd3, 0xdf, 0x91, 0x6f, 0x06, 0xe1, 0xa7, 0xcf, 0xff, 0x15, 0x7e, ++ 0x8a, 0xe5, 0x97, 0xb3, 0x0d, 0x7f, 0x2a, 0xd1, 0x61, 0x3c, 0x67, 0x4b, ++ 0x40, 0xce, 0xe6, 0x46, 0xf8, 0xed, 0xaa, 0x97, 0xd8, 0xf8, 0x03, 0xf0, ++ 0x9e, 0x8d, 0x72, 0x7a, 0x90, 0x7f, 0xba, 0xe3, 0xf8, 0x3c, 0xbb, 0x2d, ++ 0xd9, 0xa1, 0x16, 0xac, 0x77, 0x81, 0x35, 0x20, 0x1e, 0xa5, 0xfe, 0xbf, ++ 0x09, 0xe9, 0x9e, 0x1c, 0xe1, 0x53, 0xaf, 0x37, 0x30, 0xbc, 0x68, 0x52, ++ 0x84, 0xfe, 0xdd, 0x71, 0xc1, 0xc2, 0x0d, 0x85, 0x97, 0x4e, 0x67, 0x6b, ++ 0x4a, 0x8f, 0xc5, 0x57, 0x88, 0xf4, 0xee, 0x31, 0xe8, 0xff, 0xba, 0x21, ++ 0xe8, 0x3c, 0xa2, 0xe8, 0xeb, 0xd1, 0xd9, 0x29, 0xea, 0x7f, 0x15, 0x9d, ++ 0x3d, 0x45, 0x5c, 0x6e, 0x30, 0x37, 0xd0, 0xb1, 0x84, 0xe8, 0xa7, 0x23, ++ 0x5d, 0x63, 0xe9, 0x8e, 0x74, 0x45, 0xba, 0xd7, 0x1f, 0xb2, 0xee, 0xbe, ++ 0x18, 0x5d, 0xd7, 0x97, 0x04, 0xa6, 0x16, 0x0d, 0x22, 0x27, 0x98, 0x8f, ++ 0xdb, 0x03, 0x11, 0xba, 0x58, 0x17, 0x21, 0xdf, 0x9c, 0x0d, 0x83, 0x42, ++ 0x53, 0x86, 0xa6, 0xab, 0xb9, 0x83, 0xe3, 0x5d, 0xc2, 0x6d, 0x61, 0x4d, ++ 0xea, 0xdb, 0x64, 0xd4, 0xb7, 0xc0, 0x2f, 0x15, 0xd8, 0xdf, 0x37, 0xe5, ++ 0x97, 0x79, 0x33, 0xe1, 0xd7, 0xe1, 0x08, 0x3e, 0xb5, 0xd8, 0x97, 0x05, ++ 0x74, 0xff, 0xbe, 0x80, 0xd9, 0x2f, 0x16, 0x23, 0x7d, 0xae, 0x2d, 0x93, ++ 0xe5, 0x4f, 0x77, 0xf8, 0xf2, 0x50, 0xee, 0xc0, 0xef, 0xe5, 0xd4, 0x83, ++ 0x8f, 0xd9, 0x08, 0xbf, 0x1c, 0x0e, 0xee, 0x3d, 0x51, 0x0d, 0xf5, 0xaf, ++ 0x7a, 0xb0, 0xbf, 0x3c, 0x88, 0xe5, 0xb3, 0x2a, 0x12, 0x44, 0x7b, 0xcc, ++ 0xa7, 0xb0, 0x48, 0xfd, 0xeb, 0xf7, 0x3d, 0x79, 0xe2, 0x5e, 0x9a, 0xc7, ++ 0x36, 0xae, 0x0f, 0x02, 0xbd, 0x9a, 0x7f, 0x7c, 0x14, 0x5c, 0x02, 0xb0, ++ 0x33, 0x0a, 0x2e, 0x8b, 0x81, 0x77, 0xf0, 0xfa, 0x2e, 0xad, 0x97, 0xb9, ++ 0xa9, 0x9d, 0x10, 0x5f, 0xaf, 0xd0, 0xbe, 0xe2, 0xe5, 0xfc, 0xe3, 0x8f, ++ 0xb2, 0x47, 0x80, 0x92, 0xb3, 0x13, 0xd1, 0x9e, 0x3c, 0xa0, 0xb8, 0xef, ++ 0x01, 0xfa, 0x2f, 0xad, 0xf8, 0xc4, 0x82, 0xf4, 0x8a, 0xcc, 0xff, 0x00, ++ 0xcd, 0x7f, 0xfd, 0x41, 0x45, 0xc0, 0x5d, 0x27, 0x70, 0xbe, 0x4b, 0x0f, ++ 0x70, 0xb8, 0x79, 0xdf, 0xc1, 0x8e, 0xa0, 0x26, 0xda, 0x03, 0x3c, 0xaf, ++ 0x13, 0x68, 0x36, 0x77, 0x2a, 0x3e, 0x15, 0xda, 0x5d, 0x57, 0xa6, 0x84, ++ 0x46, 0xe6, 0x0e, 0xc4, 0x73, 0x73, 0x91, 0x51, 0xdf, 0xe1, 0x8f, 0x66, ++ 0xfc, 0x9e, 0x59, 0x52, 0xbe, 0xde, 0xf7, 0xb8, 0xbe, 0xe9, 0xfb, 0x91, ++ 0xf4, 0x7d, 0xd8, 0xfa, 0x35, 0xfa, 0xbf, 0xae, 0x82, 0xf9, 0x42, 0x8e, ++ 0x81, 0xf5, 0x1e, 0x90, 0xeb, 0xeb, 0x3c, 0xc0, 0xb2, 0x7d, 0xc0, 0xe5, ++ 0x22, 0x98, 0x5f, 0xa8, 0x70, 0x60, 0xfd, 0xed, 0xa2, 0xdd, 0x1e, 0x93, ++ 0x49, 0xe0, 0xeb, 0xb5, 0x0e, 0xc4, 0x5f, 0x8f, 0x45, 0xe2, 0xb3, 0xa7, ++ 0xc3, 0x57, 0x01, 0xf4, 0x67, 0x1c, 0x7e, 0x74, 0x5f, 0xcf, 0xe2, 0x60, ++ 0x21, 0x1f, 0xbe, 0x2f, 0x66, 0xfe, 0x17, 0x1b, 0x7f, 0x5b, 0xff, 0xba, ++ 0x8f, 0xcc, 0x5f, 0x37, 0x7e, 0x1f, 0xbe, 0x18, 0xfe, 0xb6, 0x0e, 0xc0, ++ 0x9f, 0xe0, 0x9f, 0x5a, 0x23, 0x3f, 0x25, 0x68, 0xfe, 0xe3, 0x67, 0xa1, ++ 0x9d, 0x84, 0x14, 0xc5, 0x8d, 0x76, 0xf1, 0x7a, 0xbf, 0xfd, 0x5e, 0xb4, ++ 0xff, 0x23, 0xfc, 0xf1, 0x67, 0xe2, 0x8f, 0x1e, 0x3b, 0xeb, 0xe7, 0x67, ++ 0x23, 0xff, 0xbf, 0xb9, 0x18, 0xf9, 0x7f, 0x3d, 0x93, 0xf5, 0xdf, 0xea, ++ 0xc0, 0xf5, 0xe3, 0x37, 0xf5, 0xd7, 0xe7, 0xeb, 0x41, 0xf2, 0x17, 0x7c, ++ 0x5f, 0x00, 0xfc, 0x84, 0x26, 0x32, 0x7e, 0xff, 0xdc, 0xbe, 0xbf, 0x74, ++ 0x04, 0x1d, 0x44, 0x1f, 0x2a, 0x27, 0x38, 0xef, 0x22, 0xeb, 0xa1, 0x33, ++ 0x06, 0xae, 0x88, 0x59, 0x3f, 0x82, 0xff, 0x69, 0xfd, 0xa2, 0x9c, 0x07, ++ 0xfc, 0x8c, 0x1e, 0x44, 0xce, 0xbc, 0x29, 0xf0, 0xfb, 0xb1, 0xc2, 0x16, ++ 0xa3, 0x9c, 0xec, 0xa9, 0xe2, 0x76, 0x62, 0xcf, 0x48, 0xfe, 0x3c, 0x5f, ++ 0xc4, 0xed, 0xc2, 0xf7, 0x04, 0x1e, 0x4f, 0x8b, 0xfa, 0x3d, 0x71, 0x51, ++ 0x78, 0xc8, 0x8a, 0xd0, 0x19, 0x7e, 0xc2, 0xe8, 0x87, 0x44, 0xcd, 0x9b, ++ 0xf0, 0xb4, 0x24, 0x45, 0xce, 0xfb, 0xcb, 0xc5, 0x73, 0x61, 0xde, 0x3d, ++ 0x49, 0xbc, 0xfc, 0xf3, 0xa2, 0xff, 0xee, 0x08, 0x66, 0x45, 0xe0, 0xd8, ++ 0xf6, 0xce, 0x15, 0x7d, 0x49, 0x7c, 0x13, 0x69, 0xff, 0xfc, 0x09, 0xc4, ++ 0xeb, 0x12, 0x81, 0xb7, 0xf3, 0x45, 0x5f, 0x9c, 0x10, 0x7c, 0xa5, 0xe0, ++ 0xba, 0xac, 0x23, 0x06, 0x01, 0xbe, 0x38, 0xa0, 0x04, 0x55, 0xf4, 0x13, ++ 0x90, 0x2f, 0x06, 0x99, 0xf7, 0xf1, 0x81, 0x7c, 0x15, 0x8c, 0xf9, 0xde, ++ 0x67, 0xbe, 0xc8, 0xf7, 0xbf, 0x1f, 0xb8, 0x2e, 0x7d, 0x31, 0xdf, 0x33, ++ 0x73, 0xc9, 0xd7, 0xf9, 0x5e, 0xd0, 0x6d, 0x6e, 0x0c, 0x5d, 0xe7, 0xc4, ++ 0xd0, 0xb5, 0x3a, 0x06, 0xae, 0x91, 0x70, 0xc8, 0x20, 0xff, 0xa4, 0x5c, ++ 0x5c, 0xd9, 0xf5, 0x40, 0x5b, 0x1a, 0xcc, 0xe3, 0x96, 0x3d, 0x0a, 0xaa, ++ 0x99, 0x28, 0x7e, 0x76, 0x2c, 0xc1, 0xf5, 0x79, 0x8b, 0x5b, 0xf2, 0xaf, ++ 0xf3, 0x0d, 0xb4, 0xbb, 0x22, 0xfc, 0xec, 0x22, 0x78, 0x61, 0xa7, 0x94, ++ 0x87, 0x09, 0xdb, 0x51, 0x1e, 0x2e, 0x40, 0x79, 0x58, 0x1e, 0x81, 0x17, ++ 0xa1, 0xbc, 0x20, 0xd8, 0xbd, 0xc4, 0x37, 0x31, 0x5a, 0x5f, 0x24, 0x52, ++ 0xf9, 0x75, 0xed, 0xb2, 0x7e, 0x12, 0xc1, 0x4b, 0x5b, 0x65, 0x7b, 0xc9, ++ 0xdb, 0x7d, 0x5a, 0x84, 0x8e, 0x2c, 0x98, 0xb2, 0x04, 0xfb, 0x5b, 0x52, ++ 0x22, 0xf4, 0x45, 0x30, 0xf5, 0x0d, 0xac, 0xbf, 0xf6, 0x20, 0xff, 0x7e, ++ 0xe2, 0xfe, 0xb4, 0x37, 0x2e, 0xba, 0x1e, 0xb6, 0xc5, 0xe0, 0x65, 0x47, ++ 0x0c, 0x1c, 0x8c, 0xa9, 0xff, 0xd0, 0x57, 0xe8, 0x97, 0xd6, 0x98, 0xef, ++ 0xef, 0x8a, 0x29, 0xbf, 0x37, 0x06, 0xee, 0x88, 0x81, 0xdb, 0x8d, 0xdf, ++ 0xaf, 0x58, 0xa5, 0xd0, 0x3a, 0x5c, 0x01, 0xfc, 0x80, 0x84, 0xf8, 0xaa, ++ 0x75, 0x39, 0xc3, 0xdb, 0x6f, 0xa7, 0xf6, 0xeb, 0x53, 0xc5, 0x41, 0x76, ++ 0x9b, 0x61, 0x5d, 0x5d, 0xd5, 0xc2, 0xe1, 0x2b, 0xf6, 0x8f, 0x5a, 0xd2, ++ 0xee, 0x88, 0x82, 0xbd, 0xa3, 0x97, 0x04, 0x1d, 0x91, 0x75, 0x61, 0x66, ++ 0xfc, 0xc7, 0x9a, 0xc2, 0x68, 0x5d, 0x98, 0x87, 0x90, 0x97, 0x93, 0xbd, ++ 0xb1, 0xeb, 0x42, 0xcc, 0xa7, 0x20, 0x56, 0xdf, 0xf2, 0xf2, 0xbf, 0xe2, ++ 0xaf, 0x19, 0x68, 0x07, 0x33, 0x83, 0x5d, 0x70, 0x4c, 0x35, 0xc2, 0x47, ++ 0x54, 0x39, 0xee, 0xe2, 0x37, 0x6e, 0x2b, 0xc4, 0x97, 0x12, 0xf6, 0x2e, ++ 0xc1, 0xf8, 0xca, 0x55, 0x3f, 0x36, 0xce, 0x0b, 0xfc, 0x55, 0x01, 0x7b, ++ 0x96, 0x54, 0x57, 0x44, 0xd9, 0x25, 0xc1, 0x89, 0x4b, 0x70, 0xfd, 0xcb, ++ 0x79, 0xca, 0xfa, 0xb3, 0xbf, 0xb8, 0xa0, 0x62, 0x7f, 0xcb, 0xbd, 0x13, ++ 0x97, 0x3c, 0x06, 0xe5, 0x35, 0x55, 0xe1, 0xd1, 0x0d, 0x30, 0xce, 0x9a, ++ 0x24, 0xfe, 0x04, 0xbd, 0xa6, 0xa2, 0xde, 0xac, 0x17, 0xf1, 0x98, 0xd9, ++ 0xcf, 0xa9, 0x7e, 0xd4, 0x6b, 0x35, 0x71, 0xe1, 0xd1, 0x8d, 0x85, 0x51, ++ 0xf3, 0x64, 0x9d, 0xf9, 0x38, 0xcf, 0x23, 0x77, 0xaa, 0x44, 0x9f, 0x60, ++ 0x0b, 0xd0, 0x07, 0xf0, 0xb4, 0x92, 0x81, 0x43, 0x00, 0xae, 0xd9, 0x91, ++ 0x84, 0x84, 0x8d, 0x4f, 0x40, 0xfd, 0x63, 0x77, 0xaa, 0x1b, 0x51, 0x8f, ++ 0xbe, 0xb5, 0x31, 0x39, 0x0d, 0xfd, 0x9b, 0x83, 0x5e, 0xee, 0x2f, 0x1c, ++ 0x4b, 0x18, 0x91, 0x76, 0x13, 0xc0, 0x47, 0xe2, 0x97, 0x5b, 0x74, 0xa8, ++ 0x77, 0x64, 0xcb, 0x2c, 0x7a, 0x1e, 0x55, 0x7d, 0x9b, 0xfb, 0x60, 0xad, ++ 0x7d, 0x6f, 0xff, 0xf4, 0x25, 0x8e, 0xb1, 0x58, 0x9e, 0x40, 0xf8, 0xb9, ++ 0xc3, 0x5b, 0xbe, 0xa4, 0x19, 0xf8, 0xfa, 0x2e, 0xaf, 0x4e, 0xf8, 0x0c, ++ 0x24, 0xb9, 0xd3, 0xba, 0xd0, 0x7e, 0xbe, 0xc7, 0xcc, 0x1e, 0xd7, 0x69, ++ 0xfe, 0x3b, 0x89, 0x6f, 0xee, 0xb3, 0x16, 0xa1, 0xff, 0xbc, 0xa2, 0x79, ++ 0x5c, 0x1a, 0xda, 0x93, 0x2b, 0x7f, 0xb8, 0x60, 0x76, 0x06, 0xd4, 0x5b, ++ 0xd9, 0x66, 0xf6, 0x28, 0x54, 0x8f, 0x4d, 0xc0, 0x71, 0x07, 0xee, 0x99, ++ 0x65, 0xc1, 0xf2, 0x55, 0xad, 0xe2, 0x19, 0xbc, 0x9c, 0x9e, 0x87, 0xbf, ++ 0x7c, 0xb4, 0xc5, 0x05, 0xf5, 0xfb, 0x1e, 0x51, 0x3c, 0xbb, 0xa1, 0xfe, ++ 0xb4, 0xcf, 0x3a, 0x5f, 0x9a, 0x00, 0xf0, 0x9a, 0xf6, 0x51, 0x1e, 0x24, ++ 0xcd, 0xa1, 0x73, 0x26, 0xe6, 0x86, 0x7e, 0xde, 0xe9, 0x18, 0x13, 0x52, ++ 0x81, 0x1f, 0xdf, 0xb5, 0x37, 0xbc, 0x30, 0x9f, 0xd7, 0x67, 0x58, 0x7f, ++ 0xcd, 0x79, 0xfd, 0x95, 0xf9, 0x25, 0x58, 0x5f, 0x75, 0x6f, 0x82, 0xfa, ++ 0x27, 0xe1, 0x3d, 0xda, 0xc3, 0x27, 0xef, 0x56, 0x77, 0x2b, 0x38, 0x2e, ++ 0x97, 0x33, 0x4e, 0x81, 0x29, 0x9d, 0xfc, 0x42, 0x7f, 0x05, 0xed, 0x5a, ++ 0x28, 0x77, 0x6f, 0x82, 0xf7, 0x27, 0xdb, 0x6e, 0x4e, 0x43, 0x3b, 0xeb, ++ 0xa4, 0xa2, 0xbb, 0x14, 0x98, 0xff, 0xf6, 0xfd, 0x73, 0x97, 0xa4, 0x03, ++ 0xbf, 0xac, 0xe9, 0xb0, 0x0a, 0x7a, 0xce, 0xcd, 0x58, 0x01, 0xf3, 0x5f, ++ 0x61, 0xea, 0xe7, 0x17, 0xd2, 0x1f, 0xab, 0x13, 0x39, 0xbc, 0xdd, 0x3b, ++ 0x77, 0xc9, 0xe3, 0x30, 0xfe, 0x93, 0xdb, 0xc7, 0xb8, 0x10, 0xcf, 0x89, ++ 0xc5, 0xbe, 0x87, 0xbd, 0x80, 0xe7, 0xb7, 0x8a, 0x7d, 0x3f, 0xf1, 0xa6, ++ 0xe2, 0x38, 0xb9, 0x9e, 0x3a, 0xfc, 0xa5, 0xba, 0x1c, 0xed, 0xf1, 0xdf, ++ 0x9e, 0x5e, 0x99, 0x86, 0xfc, 0xf4, 0xb8, 0x58, 0x3f, 0x87, 0xce, 0xad, ++ 0x4c, 0x5b, 0x19, 0x65, 0xef, 0xac, 0xfe, 0x58, 0x23, 0xba, 0x1f, 0xb6, ++ 0xe8, 0xb7, 0xe1, 0x38, 0x0f, 0xc7, 0x65, 0x2b, 0xe8, 0x2f, 0x03, 0xdd, ++ 0x93, 0x17, 0xc0, 0xfa, 0x5d, 0x25, 0xfc, 0x0f, 0xe0, 0xdf, 0x8d, 0xcf, ++ 0x0c, 0x62, 0xf7, 0x04, 0xbd, 0x2a, 0xb5, 0x7b, 0x64, 0x6b, 0x6a, 0x85, ++ 0x6e, 0xe0, 0xe3, 0xeb, 0xdf, 0x40, 0xbe, 0x24, 0xbf, 0x01, 0xe0, 0x5f, ++ 0xee, 0xbf, 0x6e, 0x3b, 0xea, 0xb5, 0xf7, 0xac, 0x1b, 0xd9, 0xbb, 0xb8, ++ 0xf8, 0xee, 0x82, 0x82, 0x29, 0xf0, 0x3c, 0x66, 0xa7, 0xf8, 0x95, 0x79, ++ 0xaf, 0x3d, 0x64, 0xcf, 0xc5, 0xf8, 0xa7, 0x6f, 0x36, 0xca, 0x3d, 0x96, ++ 0xde, 0x99, 0xbf, 0xd0, 0x19, 0xb5, 0xee, 0x44, 0xfd, 0xbf, 0x04, 0x9d, ++ 0x54, 0xff, 0x2f, 0x50, 0x1f, 0xfd, 0xb7, 0xbf, 0x04, 0xff, 0xec, 0x64, ++ 0x8e, 0x81, 0x76, 0xfc, 0x1a, 0x97, 0x33, 0x88, 0xc6, 0xc4, 0xfb, 0x4e, ++ 0xa7, 0x86, 0x74, 0x78, 0x4b, 0x6b, 0x3a, 0x79, 0x07, 0x7c, 0xb7, 0xfa, ++ 0x11, 0x33, 0xc9, 0xfd, 0xd5, 0x8f, 0xa4, 0xde, 0xd5, 0x87, 0xf2, 0x06, ++ 0xf8, 0x05, 0xe3, 0x63, 0xb1, 0xf3, 0x52, 0x8b, 0xcd, 0x34, 0xaf, 0x21, ++ 0xd7, 0x61, 0xb0, 0xd6, 0xb8, 0x0e, 0x59, 0x2d, 0xc9, 0xeb, 0xa1, 0xd6, ++ 0x61, 0xcf, 0xfe, 0x35, 0x17, 0x5d, 0x87, 0x6b, 0x84, 0x9f, 0x32, 0xfb, ++ 0x11, 0xb3, 0x1f, 0xd7, 0xd1, 0x9a, 0x49, 0x4e, 0x8d, 0x81, 0xfe, 0xa8, ++ 0x7a, 0xe4, 0xf9, 0xc7, 0x91, 0xdf, 0xd7, 0x6c, 0xb0, 0x7b, 0xad, 0x30, ++ 0xf0, 0x35, 0x8f, 0x58, 0x89, 0x5e, 0xbd, 0x4e, 0x67, 0xd0, 0x0d, 0xe5, ++ 0x01, 0x97, 0x53, 0x4b, 0x84, 0xe7, 0x5b, 0x82, 0xbe, 0xac, 0x98, 0xaf, ++ 0x9b, 0x99, 0x2a, 0xd3, 0x6c, 0x5e, 0x7a, 0xb6, 0x62, 0x9c, 0xf4, 0x0c, ++ 0x8c, 0x27, 0x19, 0xe0, 0x0f, 0x36, 0x3e, 0xf8, 0xa3, 0xc9, 0x50, 0xed, ++ 0x43, 0x16, 0xba, 0x76, 0x32, 0xe0, 0xef, 0x0c, 0x12, 0x0c, 0xf0, 0x72, ++ 0xe6, 0x80, 0x4a, 0xf1, 0x43, 0xa6, 0xf9, 0xb4, 0x79, 0x20, 0x1f, 0x6b, ++ 0x19, 0x97, 0x0b, 0x75, 0x2f, 0x3e, 0x63, 0xa9, 0xc4, 0xd9, 0x35, 0xac, ++ 0x99, 0x8b, 0x7e, 0xdd, 0xcd, 0x21, 0xf3, 0x3b, 0xbd, 0xc2, 0x67, 0xbb, ++ 0x20, 0xa6, 0x89, 0xf2, 0xb4, 0x9e, 0xbf, 0x02, 0xbd, 0x6a, 0x2c, 0xaf, ++ 0x67, 0xf7, 0x7e, 0xaa, 0x4e, 0x20, 0x36, 0xb6, 0xe0, 0x7a, 0xac, 0xeb, ++ 0x8c, 0x29, 0x6f, 0xb8, 0xfc, 0x7d, 0x8c, 0xbf, 0xd4, 0x33, 0xed, 0x9d, ++ 0x5e, 0x19, 0xaf, 0x85, 0x71, 0x7c, 0xee, 0x75, 0xa6, 0x9c, 0x8c, 0x47, ++ 0x71, 0xc8, 0xbc, 0x80, 0x21, 0x76, 0xa6, 0xc1, 0x9c, 0xcf, 0x60, 0x8a, ++ 0x6b, 0x1c, 0xb0, 0xae, 0x60, 0xbe, 0x33, 0x77, 0x28, 0x34, 0xee, 0x35, ++ 0x1b, 0xd5, 0x90, 0x15, 0xea, 0xcf, 0x4c, 0xe6, 0x71, 0xdf, 0xf7, 0x9a, ++ 0x80, 0xfe, 0x63, 0x68, 0xde, 0x41, 0x37, 0xc0, 0x6b, 0x1e, 0xe2, 0x7a, ++ 0x66, 0x0d, 0x53, 0x42, 0x36, 0xf8, 0xf5, 0xf2, 0x1d, 0x1b, 0x34, 0x5c, ++ 0x0f, 0xeb, 0x85, 0x7c, 0x59, 0xa1, 0x30, 0x3f, 0xf2, 0xf7, 0xbb, 0x76, ++ 0x4f, 0x0e, 0xfa, 0xeb, 0xab, 0x1f, 0xb1, 0x13, 0x7e, 0xd7, 0xec, 0xbc, ++ 0xf9, 0x8f, 0xdb, 0xe1, 0xbb, 0xde, 0xe6, 0x79, 0x29, 0xd1, 0xfe, 0xb1, ++ 0x43, 0xf0, 0x05, 0xb4, 0xcf, 0x6c, 0x49, 0x91, 0x76, 0xde, 0x6f, 0xfe, ++ 0x5e, 0x0e, 0xf2, 0xff, 0xcc, 0x9f, 0x82, 0x9f, 0x0b, 0xf3, 0x5d, 0x93, ++ 0xc8, 0x7e, 0xb1, 0x24, 0x17, 0xe9, 0x95, 0x91, 0xa3, 0x3b, 0x22, 0xf5, ++ 0xd6, 0x6c, 0xba, 0x33, 0x9f, 0xd7, 0x03, 0x3f, 0x19, 0xe6, 0xbd, 0xe2, ++ 0x6e, 0x95, 0xe6, 0xc1, 0x9e, 0xb5, 0x92, 0xde, 0x83, 0xb5, 0x9e, 0x4e, ++ 0x72, 0x59, 0xe0, 0x73, 0x55, 0xeb, 0x8b, 0x16, 0x4b, 0x21, 0xca, 0xe9, ++ 0x7b, 0x7b, 0x54, 0xa8, 0xff, 0x0e, 0xc0, 0xaa, 0x83, 0xf0, 0x15, 0x14, ++ 0x78, 0xb4, 0x20, 0xbe, 0x96, 0xe3, 0xb7, 0x19, 0xfc, 0x9b, 0xf4, 0x52, ++ 0x61, 0x77, 0xeb, 0x24, 0x47, 0x02, 0x38, 0xbf, 0x1a, 0x93, 0xb2, 0x7c, ++ 0x21, 0xc9, 0xf5, 0x3e, 0x0b, 0xae, 0xeb, 0xf2, 0x62, 0x85, 0xc6, 0x33, ++ 0xb1, 0x98, 0xdb, 0xb3, 0x2b, 0x72, 0x3c, 0x37, 0x50, 0x1c, 0xf9, 0x7e, ++ 0xab, 0x07, 0xe5, 0x14, 0xfe, 0xa8, 0x72, 0x1c, 0xe0, 0x57, 0xd5, 0x99, ++ 0x7a, 0x56, 0x63, 0x3c, 0x97, 0xfd, 0xd2, 0x4a, 0xf1, 0x91, 0xfa, 0x56, ++ 0xbb, 0xcf, 0xee, 0x22, 0xbf, 0xc3, 0xb7, 0x1f, 0xc7, 0xa7, 0x31, 0xcd, ++ 0x02, 0xf8, 0x58, 0xa7, 0x73, 0x79, 0x51, 0x2e, 0xf8, 0xb0, 0x5e, 0x5f, ++ 0x70, 0x39, 0xf2, 0x0d, 0x94, 0x9f, 0xd0, 0x70, 0x7f, 0xc5, 0xc9, 0xe5, ++ 0x62, 0x5d, 0x22, 0xe0, 0x9d, 0xeb, 0x63, 0x9f, 0x09, 0xfa, 0xf9, 0x04, ++ 0x7f, 0x1b, 0xc5, 0xdb, 0xcd, 0x98, 0x10, 0xd5, 0xbf, 0x22, 0xde, 0x43, ++ 0x3b, 0xba, 0x2b, 0xd2, 0x6e, 0xb7, 0x89, 0xb5, 0x63, 0x9c, 0x05, 0xeb, ++ 0x8f, 0x9d, 0x80, 0x78, 0x4c, 0xbe, 0x76, 0x31, 0x8e, 0xef, 0xe7, 0x2a, ++ 0xad, 0x67, 0x98, 0xfc, 0xfd, 0x65, 0x68, 0xe7, 0xfd, 0x5c, 0x2d, 0x46, ++ 0xff, 0x76, 0xc5, 0xdd, 0xc7, 0x66, 0x77, 0x20, 0xbc, 0xaf, 0xc8, 0x8d, ++ 0x4d, 0xae, 0xf8, 0xc5, 0x1f, 0x48, 0x6f, 0xdc, 0x22, 0xe8, 0xdf, 0x8b, ++ 0xf6, 0x3e, 0xea, 0x11, 0x80, 0xf7, 0xc1, 0x73, 0x51, 0x31, 0xd7, 0xfb, ++ 0x01, 0x95, 0xc7, 0x7d, 0x16, 0x09, 0x7c, 0x49, 0x3e, 0x90, 0xe5, 0x75, ++ 0x77, 0x9b, 0x79, 0xfc, 0xbd, 0xcd, 0x4a, 0x76, 0x4c, 0x5d, 0xf3, 0x9f, ++ 0xa8, 0xdd, 0x3a, 0x67, 0x4f, 0x1a, 0xca, 0xdf, 0xba, 0x67, 0xcd, 0xa5, ++ 0x28, 0xa7, 0xaf, 0x15, 0xe3, 0x5e, 0xd9, 0x9c, 0x5d, 0x71, 0x02, 0xf8, ++ 0x6a, 0xa5, 0x39, 0xc1, 0xad, 0xc0, 0xab, 0x75, 0xc1, 0x79, 0x16, 0x84, ++ 0xd7, 0x6d, 0x53, 0x08, 0x8e, 0x7c, 0x97, 0x9a, 0x83, 0x7c, 0xfa, 0x51, ++ 0xeb, 0xaf, 0x5c, 0xc8, 0x3f, 0xef, 0xda, 0xc3, 0xa3, 0x51, 0x1f, 0xf5, ++ 0x6d, 0xb0, 0x7b, 0x76, 0xe3, 0x04, 0x44, 0xdc, 0xed, 0xa3, 0xd6, 0xd1, ++ 0xbb, 0x31, 0x3e, 0xb3, 0xca, 0xdd, 0xe3, 0x54, 0xa0, 0x7c, 0xd5, 0x6d, ++ 0xa3, 0x92, 0x50, 0x7e, 0xbf, 0xe5, 0x0e, 0x5b, 0xb0, 0xfc, 0xad, 0xce, ++ 0x5c, 0x13, 0xc2, 0x3e, 0xb7, 0xbb, 0x02, 0x61, 0x9f, 0x36, 0x91, 0xe0, ++ 0x8f, 0x40, 0x94, 0x75, 0x0a, 0xff, 0x13, 0xf9, 0x6d, 0xbd, 0xc2, 0xe9, ++ 0xbc, 0x6e, 0xef, 0x31, 0xcb, 0x48, 0xe8, 0xef, 0x4e, 0x31, 0xdf, 0x8f, ++ 0x7f, 0xfe, 0x87, 0x7c, 0xd4, 0x57, 0x75, 0x39, 0x3d, 0xf9, 0xa8, 0x57, ++ 0x80, 0x0f, 0xf2, 0x33, 0x11, 0xcf, 0x4f, 0x29, 0xa4, 0x8f, 0xd7, 0xef, ++ 0x55, 0x7d, 0xf6, 0x09, 0x11, 0x3e, 0x58, 0x8f, 0x7c, 0x00, 0xeb, 0x6e, ++ 0xad, 0xe0, 0x83, 0xf5, 0x07, 0x7e, 0xf5, 0x1d, 0x5c, 0x0f, 0xeb, 0x91, ++ 0xfe, 0xde, 0x81, 0x7c, 0x04, 0x7c, 0x7a, 0x9c, 0xde, 0xef, 0xdf, 0x35, ++ 0x9b, 0xf1, 0xef, 0x8f, 0x23, 0x9f, 0x48, 0x3d, 0x06, 0x70, 0xab, 0x19, ++ 0xe3, 0x69, 0x16, 0x01, 0x43, 0x3f, 0x08, 0xdf, 0x85, 0xf8, 0x9c, 0x44, ++ 0xe5, 0xd5, 0xbc, 0x3c, 0x58, 0x48, 0xf2, 0x94, 0xf5, 0x5a, 0xd0, 0xee, ++ 0xac, 0xef, 0x32, 0x07, 0x7b, 0xa3, 0xf6, 0x7f, 0x86, 0xa2, 0xf3, 0x76, ++ 0x41, 0xc7, 0x95, 0xcd, 0x56, 0x92, 0xbb, 0xdb, 0xc5, 0xbc, 0x7b, 0xef, ++ 0x7e, 0xd6, 0x85, 0x74, 0xfc, 0xf8, 0xe7, 0xc7, 0x5e, 0xc0, 0xfd, 0x92, ++ 0xba, 0xfd, 0xa0, 0xad, 0xf5, 0x41, 0xd6, 0x85, 0xc0, 0x4b, 0x3d, 0xe2, ++ 0xc1, 0x45, 0xf3, 0x20, 0xfb, 0xa2, 0x1e, 0xe7, 0xed, 0x8a, 0xe0, 0xa1, ++ 0x9f, 0xff, 0xc5, 0x7a, 0xac, 0x67, 0x7c, 0x9e, 0x72, 0xde, 0xf5, 0x9a, ++ 0xc0, 0x83, 0x2c, 0x17, 0xdf, 0x3f, 0x2c, 0xf8, 0x66, 0x1d, 0x13, 0x78, ++ 0x3b, 0x30, 0x86, 0xaf, 0x3f, 0xb1, 0xde, 0x70, 0x3d, 0xa3, 0x5c, 0x95, ++ 0xf3, 0x0b, 0x24, 0xf1, 0xef, 0x25, 0x9f, 0x1e, 0x2e, 0xe6, 0x7a, 0x61, ++ 0x8f, 0x78, 0xae, 0x03, 0xbe, 0xf0, 0x14, 0x12, 0xff, 0xf8, 0x2c, 0x52, ++ 0x4e, 0x40, 0xd1, 0xc7, 0xfb, 0x76, 0x51, 0xfc, 0x47, 0xd2, 0x4b, 0x8e, ++ 0xfb, 0xb5, 0x88, 0x3e, 0xf1, 0x25, 0x26, 0x45, 0xe8, 0xd8, 0x6b, 0x62, ++ 0xb5, 0x9d, 0x83, 0xc4, 0x4d, 0xba, 0x04, 0xfe, 0xde, 0x6e, 0x1b, 0x96, ++ 0xd3, 0x05, 0x78, 0xfb, 0x08, 0xfc, 0x2c, 0xb4, 0xa7, 0x90, 0x5f, 0xb5, ++ 0xa8, 0xfe, 0x24, 0xdf, 0xc8, 0xfe, 0x66, 0x3e, 0xbd, 0xe0, 0x4a, 0x9c, ++ 0x2f, 0xb4, 0x1f, 0xc6, 0xf6, 0x65, 0xbf, 0x6f, 0x05, 0xe3, 0x35, 0x6c, ++ 0xe7, 0x2d, 0xc6, 0xd7, 0x07, 0xf2, 0x27, 0xca, 0x4f, 0xb9, 0x2e, 0x67, ++ 0xb6, 0x2c, 0xbb, 0xb2, 0xc8, 0x85, 0xf5, 0x3e, 0x76, 0x8e, 0x42, 0x3b, ++ 0x46, 0xc8, 0xb3, 0xd7, 0x8a, 0xdd, 0xf4, 0xbd, 0x0f, 0xed, 0x05, 0xf8, ++ 0xde, 0xd7, 0xa5, 0x50, 0xfc, 0xf9, 0x6d, 0xe1, 0xd7, 0xbf, 0xdd, 0xf6, ++ 0x2b, 0xd7, 0xca, 0x28, 0x3c, 0xbd, 0x2a, 0xc6, 0x2d, 0xf9, 0x0c, 0x7f, ++ 0x30, 0x2e, 0x25, 0xc7, 0xdb, 0x9d, 0xc4, 0xe3, 0xb9, 0xb1, 0xe3, 0x96, ++ 0x72, 0x48, 0x8e, 0x7b, 0xe6, 0x96, 0xeb, 0xae, 0xc4, 0xf7, 0x72, 0xfc, ++ 0x92, 0x5f, 0x25, 0x7f, 0x4a, 0x3c, 0x4a, 0x3e, 0x65, 0x77, 0xa5, 0x92, ++ 0x5d, 0x13, 0xcb, 0xaf, 0xc4, 0x6b, 0x52, 0xaf, 0xaa, 0x06, 0x79, 0x4f, ++ 0xfa, 0xf1, 0xf2, 0xac, 0x4f, 0x2d, 0x01, 0xc7, 0xc0, 0xf7, 0xb1, 0xb0, ++ 0xb4, 0x87, 0xde, 0xc5, 0x38, 0x0d, 0xca, 0x8f, 0x27, 0xd5, 0x10, 0xc9, ++ 0x8f, 0xd6, 0xf4, 0xe3, 0x79, 0x51, 0x7a, 0x1e, 0x7e, 0x1c, 0xd1, 0x7a, ++ 0xa7, 0x79, 0xc3, 0xe5, 0xee, 0x4a, 0xdc, 0x7f, 0xdd, 0xab, 0x78, 0xd0, ++ 0xe4, 0x89, 0xd2, 0x2f, 0xf7, 0x6a, 0x51, 0xfa, 0x45, 0xda, 0x05, 0x25, ++ 0x25, 0x23, 0x09, 0xef, 0xf5, 0x29, 0xbe, 0x0f, 0x90, 0x8e, 0xeb, 0x4e, ++ 0xf5, 0xcc, 0x76, 0xe9, 0x11, 0x3b, 0x74, 0xda, 0x67, 0x61, 0x35, 0x01, ++ 0xe3, 0x52, 0x07, 0x72, 0xbd, 0xd1, 0xfa, 0x74, 0xdd, 0xe9, 0xe3, 0xc4, ++ 0xff, 0x75, 0xac, 0x67, 0x33, 0xfa, 0x51, 0x2b, 0xee, 0xfe, 0xc3, 0xbc, ++ 0xc9, 0xc8, 0xe7, 0x4f, 0x9a, 0x69, 0x7f, 0x66, 0x45, 0xdb, 0x2c, 0x0b, ++ 0xda, 0xf5, 0x37, 0x3f, 0x7e, 0x63, 0x29, 0xf2, 0xd1, 0x3b, 0xed, 0xa3, ++ 0x48, 0xae, 0x7f, 0xf0, 0xd8, 0xa4, 0x62, 0xe2, 0x2b, 0xe6, 0x4e, 0xbb, ++ 0x16, 0xf8, 0x7f, 0xd5, 0x63, 0x0f, 0x5e, 0xbb, 0x14, 0xde, 0xaf, 0xea, ++ 0x52, 0x3d, 0x24, 0xdf, 0xa1, 0x1d, 0x5c, 0xb7, 0x2b, 0x6e, 0x2f, 0x66, ++ 0xc8, 0x37, 0xef, 0xda, 0x7b, 0xe7, 0x95, 0xa3, 0xfd, 0x7e, 0x87, 0xea, ++ 0x46, 0xfb, 0x7d, 0xea, 0xe3, 0x93, 0xee, 0xc2, 0xfa, 0x53, 0x9d, 0x23, ++ 0x12, 0x71, 0x1e, 0xbe, 0xc7, 0x92, 0x09, 0xf6, 0x69, 0x09, 0xa4, 0x1f, ++ 0xa4, 0xdd, 0xfb, 0x96, 0x90, 0x93, 0x2d, 0x66, 0xce, 0x17, 0x39, 0x25, ++ 0x7c, 0x1d, 0xa5, 0x96, 0x70, 0xb9, 0x91, 0x5a, 0xc2, 0xf9, 0x66, 0x66, ++ 0x4b, 0x4b, 0x3e, 0xee, 0xa7, 0xf7, 0xed, 0x02, 0xf9, 0x8c, 0xfb, 0xca, ++ 0x16, 0xbd, 0x33, 0x8c, 0xfd, 0x3d, 0x37, 0x8c, 0xfc, 0x8b, 0x7a, 0x70, ++ 0x87, 0xd2, 0x81, 0xee, 0xa7, 0x14, 0x6e, 0x97, 0xd5, 0x5a, 0x98, 0x2d, ++ 0xc3, 0x4b, 0xef, 0x6d, 0x19, 0xf0, 0xfe, 0x45, 0x73, 0xcf, 0xed, 0xa8, ++ 0x47, 0x5e, 0xbc, 0xdd, 0x59, 0xd4, 0x8c, 0x03, 0x50, 0xcf, 0x97, 0xae, ++ 0xe4, 0xf6, 0x34, 0xdf, 0x3f, 0x4c, 0xe6, 0xfd, 0x4b, 0xbc, 0xc9, 0x71, ++ 0x64, 0x97, 0x70, 0x7e, 0x8f, 0x6d, 0x4f, 0x7e, 0xdf, 0x8d, 0x7e, 0x04, ++ 0xca, 0x53, 0x31, 0xfe, 0x0f, 0x5a, 0x9f, 0xbc, 0x16, 0xf5, 0xe0, 0x07, ++ 0x7b, 0x46, 0x27, 0xe1, 0xbc, 0xdf, 0x7f, 0xce, 0xde, 0x8e, 0xf6, 0xd4, ++ 0xfb, 0x66, 0x2e, 0x17, 0x65, 0xfb, 0x60, 0xe7, 0xbd, 0x17, 0x6d, 0xa7, ++ 0x81, 0x5d, 0x67, 0x80, 0xc1, 0x8e, 0x33, 0xc0, 0xc0, 0xbf, 0xef, 0x19, ++ 0xed, 0xc2, 0x4d, 0x34, 0xae, 0x89, 0x25, 0x60, 0xc7, 0x8d, 0x63, 0xfd, ++ 0x76, 0x9c, 0xe4, 0xf7, 0x9a, 0x0d, 0xa3, 0x13, 0xa2, 0xf3, 0x08, 0x62, ++ 0xed, 0x77, 0x96, 0x17, 0xbb, 0x6f, 0x33, 0x39, 0x81, 0x0d, 0x22, 0x6f, ++ 0xe4, 0xf3, 0x74, 0x13, 0x20, 0x0a, 0x18, 0xf5, 0x2c, 0xee, 0x11, 0x42, ++ 0xbf, 0xd5, 0xf1, 0x5f, 0x3c, 0xd3, 0x83, 0xf6, 0xfe, 0x36, 0xab, 0xdb, ++ 0x0a, 0xf3, 0x7c, 0x0f, 0xf9, 0x1f, 0xf7, 0xa5, 0x9e, 0x55, 0x43, 0xb8, ++ 0x0f, 0x83, 0xb6, 0x39, 0xae, 0x87, 0xf7, 0xf6, 0x15, 0x85, 0xd0, 0x8f, ++ 0x5c, 0xfd, 0x66, 0x60, 0x36, 0xb6, 0x7f, 0xfc, 0x81, 0x2d, 0x94, 0x67, ++ 0x70, 0x13, 0xd8, 0x97, 0xc3, 0x94, 0x28, 0xbb, 0xf9, 0xa1, 0x07, 0xae, ++ 0x45, 0xf6, 0x3f, 0xe3, 0x09, 0x6c, 0xce, 0x80, 0xef, 0xce, 0xec, 0xe1, ++ 0x79, 0x11, 0x50, 0xec, 0x88, 0xb1, 0x97, 0x5f, 0xc8, 0xd0, 0xff, 0x75, ++ 0x7b, 0xf9, 0x52, 0xed, 0x64, 0x19, 0x6f, 0xa8, 0x29, 0x11, 0xf6, 0xb2, ++ 0x87, 0x79, 0x10, 0xcf, 0x12, 0xbf, 0xd2, 0x6f, 0x3a, 0x0c, 0x7c, 0x50, ++ 0xe6, 0x8d, 0xe0, 0xeb, 0x6f, 0x4d, 0xb5, 0x64, 0x27, 0x9f, 0x6e, 0x0a, ++ 0xd0, 0xf3, 0x13, 0xe5, 0xed, 0xfb, 0xa7, 0x22, 0xff, 0x3a, 0x13, 0x3c, ++ 0xbb, 0xe1, 0xb3, 0xdf, 0x76, 0x3d, 0xa8, 0x66, 0x22, 0x9d, 0x0f, 0x14, ++ 0x9d, 0x47, 0xbf, 0xb7, 0xdc, 0x91, 0xe0, 0xc6, 0x75, 0xfb, 0xb7, 0xa6, ++ 0x8d, 0xb4, 0xf9, 0x78, 0xba, 0xa9, 0x81, 0x9e, 0x92, 0xce, 0x32, 0xde, ++ 0x36, 0xed, 0xc0, 0x11, 0xfa, 0xee, 0x6f, 0x5d, 0xc5, 0x07, 0xa7, 0xc2, ++ 0x77, 0x87, 0x1c, 0x09, 0x5c, 0xfe, 0x0f, 0xd8, 0xef, 0xe1, 0xf4, 0x8c, ++ 0xcd, 0x03, 0xb9, 0x75, 0xc3, 0xe4, 0x61, 0xf8, 0x5e, 0xce, 0xeb, 0xc3, ++ 0x3b, 0x38, 0x5d, 0xe5, 0xb8, 0x3f, 0xdc, 0x73, 0xa3, 0x0b, 0xe7, 0x75, ++ 0xe4, 0x27, 0xc9, 0x07, 0xa7, 0x20, 0x3d, 0xe3, 0x13, 0xdc, 0x68, 0xef, ++ 0xad, 0x11, 0xf9, 0x1f, 0x27, 0x3b, 0xb8, 0x3d, 0x7d, 0xca, 0x96, 0xf0, ++ 0xc4, 0x5c, 0xcc, 0x1b, 0xd9, 0xb1, 0x28, 0x8d, 0x81, 0x9c, 0xbd, 0xe9, ++ 0xc8, 0xb7, 0xae, 0xc5, 0xf7, 0xab, 0x9f, 0x53, 0xdc, 0xe8, 0x07, 0x78, ++ 0x9e, 0x5b, 0xe0, 0x42, 0xff, 0xf4, 0xbf, 0xb4, 0x5e, 0x97, 0x1b, 0x9f, ++ 0xf0, 0x5d, 0x18, 0xc7, 0xa3, 0x85, 0x54, 0x94, 0x47, 0xe5, 0x73, 0x18, ++ 0xed, 0x47, 0x95, 0x87, 0x35, 0xa6, 0xe7, 0xd2, 0x56, 0x2f, 0xf1, 0xcb, ++ 0x94, 0xd3, 0x5a, 0x08, 0xf3, 0x46, 0x3e, 0xc2, 0x7d, 0x2a, 0x8c, 0x87, ++ 0x9c, 0x8f, 0xa3, 0x78, 0x08, 0x13, 0xfb, 0x4f, 0x37, 0xfd, 0x9a, 0xc7, ++ 0x51, 0xfa, 0xfd, 0x5b, 0xe1, 0xdf, 0x4d, 0x15, 0xf3, 0xee, 0x2a, 0x49, ++ 0x92, 0xfb, 0x0a, 0xf4, 0x7e, 0x66, 0x19, 0x7f, 0xff, 0xfe, 0x8e, 0x67, ++ 0xe6, 0x63, 0x7b, 0x1f, 0x3c, 0x66, 0x76, 0xe3, 0xb8, 0xff, 0xf6, 0x98, ++ 0x99, 0xda, 0x5f, 0x0b, 0x7e, 0x99, 0x09, 0xc6, 0x7b, 0x6a, 0x0f, 0xf7, ++ 0x77, 0xd6, 0x76, 0x2a, 0xe4, 0x27, 0x7f, 0xb0, 0x07, 0xf4, 0x35, 0xcc, ++ 0xab, 0x6e, 0x83, 0xd9, 0x67, 0x49, 0x18, 0xc8, 0x87, 0x33, 0xa1, 0xbc, ++ 0xd7, 0x11, 0xe1, 0xc3, 0xb5, 0xbe, 0x10, 0xf1, 0x37, 0x13, 0xfc, 0x68, ++ 0x83, 0xff, 0x2e, 0x8c, 0x1c, 0xc8, 0x8f, 0x89, 0xac, 0x73, 0x33, 0xe2, ++ 0xe3, 0x5f, 0xe5, 0xcb, 0x5f, 0xc4, 0xac, 0xfb, 0x7e, 0x7e, 0x1c, 0x8a, ++ 0x0f, 0x04, 0xbe, 0x70, 0x1d, 0x23, 0x3f, 0x4a, 0x7a, 0xaf, 0xed, 0xe0, ++ 0xfb, 0xea, 0x49, 0x9d, 0x45, 0x95, 0xc8, 0x57, 0x92, 0xfe, 0x52, 0x4e, ++ 0x04, 0xab, 0x58, 0x01, 0xea, 0xd5, 0x16, 0x0b, 0x2b, 0xc0, 0x3c, 0x9c, ++ 0xa0, 0x29, 0xce, 0x83, 0xeb, 0x7b, 0x81, 0x43, 0x37, 0x2b, 0x80, 0x87, ++ 0x45, 0x29, 0xbd, 0xd5, 0x28, 0x4e, 0x33, 0x27, 0x71, 0x39, 0xad, 0xce, ++ 0x34, 0xf9, 0x4c, 0xa8, 0x5f, 0x5a, 0xac, 0x24, 0x07, 0x62, 0xe5, 0xc8, ++ 0xef, 0x84, 0x5c, 0x9f, 0x8f, 0x3c, 0x0d, 0xff, 0xde, 0x2d, 0xe1, 0x76, ++ 0x84, 0x99, 0x35, 0x90, 0x1f, 0x22, 0x9f, 0xa0, 0x77, 0xb2, 0x51, 0x7f, ++ 0x2f, 0x88, 0x4f, 0xfa, 0xbb, 0x0e, 0x55, 0xfe, 0xfd, 0x40, 0xed, 0x52, ++ 0x0d, 0xc6, 0xbf, 0x60, 0x6a, 0xd2, 0xed, 0xa3, 0x3c, 0x8c, 0xbd, 0x79, ++ 0x60, 0xfd, 0x52, 0x0d, 0xf8, 0x77, 0x41, 0x71, 0xd2, 0xb3, 0x23, 0x01, ++ 0x7e, 0xab, 0xa4, 0x8e, 0xc3, 0x13, 0x93, 0x26, 0x99, 0x01, 0x6e, 0x6e, ++ 0xae, 0x5f, 0x5a, 0x0d, 0xf5, 0xff, 0x59, 0xe2, 0x7b, 0xbd, 0x24, 0xaa, ++ 0x1f, 0xd9, 0x2e, 0xbc, 0xff, 0x8f, 0x12, 0x80, 0x37, 0x8d, 0x0b, 0x9c, ++ 0xc0, 0x67, 0xbd, 0xc5, 0x41, 0x72, 0xfa, 0x13, 0xa5, 0x6f, 0xc2, 0xc6, ++ 0xdc, 0x48, 0xfd, 0xd7, 0x14, 0xf6, 0xd6, 0x6f, 0x95, 0x08, 0xdc, 0x6b, ++ 0x66, 0x39, 0x68, 0xdf, 0xbd, 0x5b, 0x22, 0xc7, 0x3f, 0xf8, 0x33, 0x6f, ++ 0x92, 0xef, 0xed, 0x92, 0x41, 0xde, 0xaf, 0x64, 0xac, 0x0d, 0xe3, 0x2a, ++ 0x2b, 0x83, 0xbf, 0x3b, 0xa1, 0x70, 0x3f, 0xcc, 0x6f, 0x03, 0x7a, 0x5d, ++ 0x2d, 0xf8, 0x6a, 0xa5, 0xcd, 0x11, 0x26, 0x7f, 0xbe, 0xdd, 0x7c, 0xba, ++ 0x9f, 0xde, 0xc8, 0x47, 0x9e, 0x04, 0x0d, 0xe9, 0x3a, 0x5f, 0xf0, 0xd1, ++ 0xd5, 0x5a, 0xf8, 0x08, 0x7e, 0x3f, 0x96, 0xb5, 0xba, 0x4f, 0xda, 0xc8, ++ 0x84, 0xda, 0x71, 0x21, 0x79, 0x68, 0xf9, 0x0d, 0x0b, 0x8f, 0x9d, 0x94, ++ 0xed, 0x01, 0xbf, 0x7c, 0x62, 0x86, 0xf9, 0x02, 0x5f, 0x2b, 0xc0, 0x9e, ++ 0x1b, 0x61, 0xc9, 0x28, 0x80, 0xe4, 0x1a, 0x90, 0x5f, 0xca, 0xc1, 0xdf, ++ 0xfd, 0x03, 0xdb, 0x6d, 0x09, 0xb2, 0x5e, 0x3b, 0xd1, 0xa1, 0xc6, 0x8d, ++ 0x7c, 0xa6, 0xb0, 0x80, 0xe9, 0x02, 0x3c, 0xeb, 0xe2, 0x5d, 0x13, 0x30, ++ 0x6e, 0x52, 0x17, 0x9f, 0x13, 0x42, 0xbe, 0x6f, 0x7c, 0xf6, 0xe3, 0xe3, ++ 0xc8, 0x5e, 0x37, 0x4b, 0xfb, 0x25, 0x50, 0x46, 0xfc, 0x7e, 0x9b, 0x9b, ++ 0xcf, 0x87, 0x05, 0xca, 0x89, 0x1f, 0x6f, 0x17, 0xfc, 0xf8, 0x7e, 0x13, ++ 0x6b, 0xc8, 0x83, 0xa5, 0x77, 0x75, 0x4f, 0x8f, 0x4b, 0x87, 0x41, 0x9f, ++ 0x9e, 0x1f, 0xce, 0xc7, 0xf5, 0xfe, 0x69, 0x4e, 0x20, 0x6e, 0x12, 0xfa, ++ 0xf9, 0x3b, 0x5a, 0xb2, 0x1a, 0x81, 0x7f, 0x3e, 0xde, 0x6f, 0xf5, 0xcc, ++ 0x85, 0xfa, 0xa7, 0x42, 0xcf, 0x50, 0x1c, 0x6e, 0x9d, 0xb0, 0x47, 0xd9, ++ 0x63, 0xa9, 0x62, 0xdd, 0xab, 0xe1, 0x19, 0x50, 0xaf, 0x3b, 0x77, 0xec, ++ 0x6e, 0xd4, 0x2f, 0x29, 0x93, 0x38, 0x5f, 0x9d, 0xce, 0x0d, 0xe7, 0xdc, ++ 0x89, 0x72, 0x23, 0x97, 0xfb, 0x3f, 0x50, 0x8f, 0xf2, 0xdc, 0xe6, 0x6c, ++ 0xba, 0x3c, 0x15, 0xeb, 0x9d, 0xde, 0xb7, 0x25, 0xef, 0x26, 0xa0, 0x9f, ++ 0x55, 0x63, 0x41, 0x67, 0x12, 0x3d, 0x99, 0x0b, 0xe6, 0x7d, 0x05, 0xb4, ++ 0x5d, 0x06, 0xb0, 0x19, 0x60, 0x95, 0xf6, 0x73, 0x43, 0x44, 0x2f, 0xac, ++ 0xe7, 0x42, 0x7d, 0xaf, 0xdf, 0x98, 0xce, 0xe3, 0xed, 0xcc, 0x8f, 0x72, ++ 0x45, 0xd2, 0x4b, 0xd2, 0x61, 0x00, 0x7d, 0x60, 0x08, 0x68, 0xaf, 0x9a, ++ 0x6c, 0xcc, 0x8c, 0xe3, 0x1f, 0xcb, 0x76, 0xb8, 0x51, 0x7f, 0x48, 0x3a, ++ 0xbd, 0x6f, 0x03, 0x3c, 0x62, 0xfc, 0xcc, 0x06, 0x78, 0x84, 0xf5, 0x3d, ++ 0x0b, 0x83, 0x0e, 0x25, 0x88, 0x4f, 0x1e, 0x6f, 0x69, 0x54, 0x7a, 0x5b, ++ 0x93, 0x11, 0xfe, 0xb9, 0x42, 0x79, 0x73, 0x03, 0xf5, 0xe0, 0xe3, 0x16, ++ 0x44, 0x79, 0xed, 0x8e, 0x1b, 0x49, 0xfe, 0x48, 0xb9, 0xa3, 0xc3, 0x7f, ++ 0x83, 0xc9, 0x9d, 0xaf, 0x1d, 0x37, 0xda, 0x31, 0x73, 0x50, 0xb9, 0x33, ++ 0x6d, 0x92, 0xd0, 0x83, 0x45, 0xac, 0xe8, 0x02, 0x37, 0x10, 0x89, 0xbe, ++ 0x6b, 0xc4, 0xb7, 0xb3, 0xd4, 0x1a, 0x5d, 0xc3, 0x71, 0xa7, 0xda, 0x3c, ++ 0x18, 0x4f, 0x6b, 0x7c, 0x64, 0x14, 0xe9, 0x1b, 0xd6, 0xfa, 0x07, 0x16, ++ 0x5d, 0x8f, 0xed, 0x48, 0x26, 0x7e, 0xd9, 0x9c, 0xab, 0x12, 0xde, 0x6f, ++ 0xee, 0x52, 0x28, 0xbf, 0x71, 0x5e, 0x57, 0x26, 0xd3, 0xa1, 0x68, 0x6e, ++ 0x57, 0x32, 0x3d, 0x5d, 0xe7, 0x32, 0xe8, 0xfd, 0x07, 0x4f, 0xbc, 0x54, ++ 0xc2, 0xe5, 0x12, 0xa7, 0xcb, 0xbc, 0x9f, 0x0d, 0xab, 0xa2, 0xbc, 0xa2, ++ 0x9f, 0x8d, 0xa1, 0xa7, 0x1c, 0x47, 0xa3, 0xe0, 0xbb, 0x59, 0x6a, 0x61, ++ 0x67, 0x18, 0xed, 0x08, 0x07, 0x8c, 0x03, 0xe0, 0xc6, 0x17, 0xb9, 0xde, ++ 0x6a, 0xbc, 0x46, 0xa5, 0xb8, 0x26, 0x43, 0x11, 0x9d, 0x86, 0xc4, 0xe4, ++ 0x3f, 0x7e, 0x47, 0x3b, 0xc5, 0x7f, 0xfc, 0xac, 0xdf, 0xbe, 0x57, 0x2e, ++ 0x50, 0x9c, 0x56, 0x4f, 0x40, 0xba, 0xf8, 0xbb, 0x55, 0x86, 0xfc, 0x03, ++ 0xde, 0x46, 0x90, 0xe3, 0xd9, 0xd6, 0x8c, 0x78, 0xb6, 0xa6, 0x9b, 0x98, ++ 0x3e, 0x88, 0xfd, 0x61, 0x15, 0x74, 0xb2, 0xeb, 0x71, 0x4c, 0x8f, 0xf2, ++ 0x3b, 0xb4, 0xe0, 0xd8, 0xef, 0x57, 0x60, 0x3c, 0xf6, 0x5b, 0x66, 0x4f, ++ 0x08, 0xca, 0x5b, 0xec, 0xae, 0xdd, 0xb8, 0x9e, 0x58, 0xd0, 0xd7, 0x83, ++ 0xfe, 0xc2, 0x62, 0xf1, 0x5d, 0x8f, 0x9d, 0xf3, 0x47, 0x7c, 0x41, 0x92, ++ 0xe1, 0xfb, 0x2d, 0xae, 0xd9, 0xdd, 0xc8, 0x6f, 0x8b, 0x7d, 0x5c, 0xef, ++ 0x38, 0x3d, 0xc3, 0x0d, 0xfd, 0x5b, 0xd5, 0x75, 0x66, 0x64, 0x32, 0x16, ++ 0xe0, 0xf6, 0xa2, 0xe4, 0x07, 0xe2, 0x4b, 0xe8, 0xf7, 0x6a, 0xbf, 0x42, ++ 0xfa, 0xf5, 0x9a, 0xc5, 0x50, 0x1e, 0xd5, 0xae, 0xb9, 0xe2, 0x53, 0x92, ++ 0xe3, 0xe6, 0x0a, 0xa3, 0x9d, 0x69, 0xf5, 0x1b, 0xeb, 0x7d, 0x6f, 0x92, ++ 0xd0, 0x3b, 0x63, 0xd9, 0xd8, 0x68, 0xfa, 0x47, 0xf0, 0xee, 0xf0, 0xa1, ++ 0x9d, 0x7e, 0xc6, 0xe7, 0x24, 0x3e, 0x06, 0xed, 0xfe, 0xe3, 0x0a, 0x80, ++ 0xaf, 0xed, 0x36, 0x33, 0x9c, 0xaf, 0x35, 0x8e, 0xcf, 0xeb, 0x0c, 0x62, ++ 0x0a, 0xe3, 0xa2, 0x3e, 0x35, 0x84, 0xf1, 0x92, 0x2d, 0x88, 0x07, 0x78, ++ 0x9f, 0x50, 0x66, 0xc4, 0x67, 0xa2, 0xcf, 0x88, 0xbf, 0xe4, 0x39, 0x46, ++ 0x7c, 0xa4, 0xfa, 0x8d, 0xf3, 0x1f, 0xb6, 0x78, 0xa4, 0xa1, 0x3c, 0x23, ++ 0x70, 0x99, 0xa1, 0x3c, 0xb3, 0xd6, 0x6b, 0x80, 0xb3, 0x1b, 0xca, 0x0d, ++ 0xf5, 0x47, 0x6c, 0xac, 0x32, 0xc0, 0xb9, 0xc1, 0x2b, 0x0d, 0xf5, 0x47, ++ 0xb5, 0x2f, 0x34, 0xc0, 0xa3, 0xb7, 0x2d, 0x35, 0xd4, 0x1f, 0xd3, 0xb1, ++ 0xd2, 0x50, 0x3e, 0x36, 0xb4, 0xd6, 0x50, 0x3e, 0x6e, 0x4f, 0xa3, 0x01, ++ 0x1e, 0xdf, 0xf9, 0x5d, 0x43, 0xfd, 0x89, 0x5d, 0x9b, 0x0c, 0xe5, 0x45, ++ 0xe1, 0x7b, 0x0c, 0xe5, 0xc5, 0xdd, 0x3f, 0x30, 0xc0, 0x93, 0x7a, 0x1e, ++ 0x36, 0xd4, 0x9f, 0x7c, 0x62, 0xb7, 0xa1, 0x7c, 0x4a, 0xef, 0x53, 0x86, ++ 0xf2, 0xa9, 0xa7, 0xf6, 0x1b, 0xe0, 0x69, 0x7d, 0xbf, 0x31, 0xd4, 0x9f, ++ 0x71, 0xee, 0xa8, 0x01, 0xae, 0x64, 0x2f, 0x19, 0xea, 0xcf, 0xb4, 0xfd, ++ 0xc1, 0x00, 0xcf, 0x72, 0xff, 0xd9, 0x50, 0xff, 0xf2, 0xf4, 0x77, 0x0d, ++ 0xe5, 0x57, 0xe8, 0x1f, 0x19, 0xca, 0xaf, 0x2a, 0x38, 0x6b, 0xe4, 0xd7, ++ 0x38, 0x2e, 0xff, 0xe6, 0x79, 0xfe, 0x69, 0xf8, 0x4e, 0xc9, 0x0a, 0xbc, ++ 0x3c, 0x09, 0x6d, 0x04, 0xf5, 0xb4, 0x86, 0x7c, 0xdb, 0xb2, 0x4c, 0x61, ++ 0xc9, 0x18, 0x4f, 0xef, 0x5e, 0x64, 0x43, 0x39, 0xf0, 0x8a, 0x94, 0x43, ++ 0x82, 0x0f, 0x9f, 0x47, 0xfd, 0x8c, 0xf5, 0xf3, 0x58, 0x0e, 0xca, 0xb3, ++ 0x59, 0x6a, 0x45, 0x18, 0xd7, 0xed, 0x99, 0x2e, 0x85, 0xd6, 0x7f, 0xac, ++ 0xbe, 0xd3, 0x3e, 0xf2, 0xfb, 0x30, 0x9e, 0xc7, 0x7e, 0xa5, 0x78, 0x30, ++ 0xce, 0x96, 0x00, 0x6a, 0x4b, 0x8b, 0xea, 0x3f, 0xd1, 0x67, 0x03, 0x47, ++ 0x32, 0x02, 0x27, 0xcf, 0x71, 0x1b, 0xe0, 0x54, 0x7f, 0xba, 0xa1, 0xfe, ++ 0xb0, 0xc5, 0xba, 0xa1, 0x3c, 0x23, 0x50, 0x60, 0x28, 0xcf, 0xac, 0xf5, ++ 0x18, 0xe0, 0xec, 0x86, 0x32, 0x43, 0xfd, 0x11, 0x1b, 0x7d, 0x06, 0x38, ++ 0x37, 0x38, 0xc7, 0x50, 0x7f, 0x54, 0xbb, 0xdf, 0x00, 0x8f, 0xde, 0xb6, ++ 0xd8, 0x50, 0x7f, 0x4c, 0x47, 0xc0, 0x50, 0x3e, 0x36, 0x54, 0x6b, 0x28, ++ 0x1f, 0xb7, 0xa7, 0xc1, 0x00, 0x8f, 0xef, 0xdc, 0x68, 0xa8, 0x3f, 0xb1, ++ 0x2b, 0x68, 0x28, 0x2f, 0x0a, 0xb7, 0x1b, 0xca, 0x8b, 0xbb, 0xb7, 0x19, ++ 0xe0, 0x49, 0x3d, 0x1d, 0x86, 0xfa, 0x93, 0x4f, 0x84, 0x0c, 0xe5, 0x53, ++ 0x7a, 0xf7, 0x18, 0xca, 0xa7, 0x9e, 0xea, 0x34, 0xc0, 0xd3, 0xfa, 0xba, ++ 0x0c, 0xf5, 0x67, 0x9c, 0x0b, 0x1b, 0xe0, 0x4a, 0xf6, 0xa2, 0xa1, 0xfe, ++ 0x4c, 0xdb, 0x6b, 0x06, 0x78, 0x96, 0xfb, 0x0d, 0x43, 0xfd, 0xcb, 0xd3, ++ 0xdf, 0x36, 0x94, 0x5f, 0xa1, 0x7f, 0x60, 0x28, 0x97, 0xf6, 0xcd, 0x55, ++ 0x05, 0x9f, 0x1a, 0xdf, 0x0b, 0x7b, 0x67, 0x9e, 0xe7, 0x1f, 0x86, 0xef, ++ 0x83, 0x55, 0x3e, 0x86, 0xfc, 0x11, 0xdc, 0xaf, 0x78, 0x5a, 0x74, 0xc6, ++ 0x0a, 0x4b, 0x47, 0x92, 0x7d, 0x01, 0x72, 0xbd, 0xd7, 0xae, 0xa2, 0x7d, ++ 0xe4, 0xa7, 0xb8, 0x51, 0x12, 0x26, 0x08, 0x02, 0x5f, 0x26, 0x80, 0x10, ++ 0x43, 0xbe, 0x42, 0x57, 0xa1, 0x86, 0xe2, 0x4f, 0x29, 0x14, 0xf7, 0x25, ++ 0xd5, 0xa4, 0x63, 0xbe, 0x0f, 0xd8, 0x09, 0x00, 0x24, 0x99, 0x72, 0x73, ++ 0xd1, 0x9e, 0x8e, 0x8f, 0xd8, 0x6d, 0x59, 0x17, 0x8a, 0x2f, 0xdd, 0x6e, ++ 0x2b, 0x2f, 0x65, 0xc4, 0xe7, 0x37, 0x97, 0x06, 0x26, 0x96, 0xa6, 0xa2, ++ 0xbf, 0xb2, 0x6f, 0x36, 0xda, 0xed, 0x37, 0xb3, 0xe0, 0x66, 0x1c, 0x07, ++ 0xe8, 0xbd, 0x84, 0x5e, 0x5c, 0x1f, 0x76, 0x63, 0x3c, 0x43, 0x3e, 0xaf, ++ 0xb0, 0x01, 0x5e, 0xa2, 0xfa, 0x7b, 0xd1, 0xbe, 0x2d, 0xcb, 0x7b, 0x11, ++ 0xbf, 0xff, 0x0a, 0xdb, 0x69, 0xaa, 0xdf, 0xdf, 0xae, 0x88, 0x73, 0x28, ++ 0x30, 0xbf, 0xc6, 0xa8, 0xf6, 0xef, 0x07, 0xbf, 0x42, 0x03, 0xbb, 0x6e, ++ 0x5b, 0x13, 0xac, 0x1b, 0x70, 0x18, 0x7f, 0xd0, 0xe4, 0x26, 0xf8, 0xa1, ++ 0xa6, 0x74, 0x82, 0x7f, 0xd4, 0xa4, 0xd3, 0xb3, 0xa3, 0xa9, 0x80, 0x9e, ++ 0x0f, 0x37, 0x79, 0xa8, 0x7c, 0x47, 0x53, 0x19, 0xc1, 0x3b, 0x9b, 0x7c, ++ 0x04, 0x87, 0x9a, 0xe6, 0xd0, 0x73, 0x77, 0x93, 0x9f, 0xde, 0x3f, 0xd6, ++ 0xb4, 0x98, 0xe0, 0x27, 0xc0, 0x8f, 0xc6, 0xe7, 0x1e, 0xf0, 0xab, 0xf1, ++ 0xf9, 0x14, 0xf8, 0xc7, 0x58, 0xbe, 0x17, 0xfc, 0x65, 0x84, 0x7f, 0xd1, ++ 0x14, 0xa4, 0x67, 0x67, 0x53, 0x3b, 0xbd, 0xdf, 0xdf, 0xb4, 0x8d, 0xe0, ++ 0x03, 0x4d, 0x1d, 0x04, 0xff, 0xb2, 0x29, 0x44, 0xcf, 0xae, 0xa6, 0x3d, ++ 0xf4, 0xfc, 0x4d, 0x53, 0x27, 0x95, 0x1f, 0x6c, 0xea, 0x22, 0xf8, 0x50, ++ 0x53, 0x98, 0xe0, 0x70, 0x53, 0x37, 0xc1, 0x47, 0x9b, 0x7a, 0x08, 0x3e, ++ 0xde, 0x74, 0x82, 0xe0, 0x17, 0x9a, 0x7a, 0xe9, 0xd9, 0xdd, 0x74, 0x8a, ++ 0x9e, 0xbf, 0x6f, 0xea, 0xa3, 0xf2, 0x97, 0x9b, 0xce, 0x11, 0xfc, 0xa1, ++ 0x88, 0xd7, 0xae, 0x29, 0xe5, 0xf1, 0x22, 0x89, 0x17, 0x09, 0x33, 0x56, ++ 0x4d, 0xfc, 0x20, 0xed, 0xc3, 0xf9, 0x68, 0xe7, 0x23, 0x73, 0x94, 0x99, ++ 0xff, 0x66, 0xb0, 0xf3, 0x63, 0xec, 0xed, 0x58, 0x7a, 0xc8, 0x7e, 0xcc, ++ 0x55, 0x18, 0x13, 0x84, 0xe7, 0xf0, 0xfc, 0xdd, 0x2d, 0x51, 0x7e, 0xd6, ++ 0xad, 0xa2, 0xbf, 0x2d, 0x71, 0x2c, 0x68, 0x07, 0x7e, 0x6f, 0x36, 0x71, ++ 0xbf, 0xb6, 0x39, 0x89, 0x51, 0x9e, 0x35, 0x13, 0xf6, 0xeb, 0x1a, 0xc1, ++ 0x97, 0x2c, 0x85, 0xdb, 0xad, 0xab, 0xc5, 0xb8, 0xd6, 0x88, 0xf5, 0x30, ++ 0x09, 0xf9, 0xb3, 0x80, 0xf8, 0xf3, 0xe5, 0xaf, 0xe3, 0x57, 0x48, 0xbf, ++ 0xf1, 0x4c, 0x61, 0xa0, 0x85, 0xf8, 0x33, 0xdb, 0x14, 0x24, 0xff, 0xd9, ++ 0x11, 0xca, 0x47, 0xfb, 0x39, 0x75, 0x7c, 0x60, 0x73, 0xe9, 0x24, 0xdc, ++ 0x6f, 0xbc, 0xe9, 0x05, 0xea, 0xcf, 0xed, 0xa1, 0x7d, 0xc7, 0x79, 0xd6, ++ 0x70, 0xea, 0x75, 0x18, 0x1f, 0x79, 0x51, 0xa5, 0x78, 0xde, 0x50, 0xfd, ++ 0xd5, 0x8b, 0xfc, 0xf1, 0x21, 0xcb, 0x0f, 0x7d, 0x90, 0x85, 0xf6, 0xf6, ++ 0x9c, 0x2f, 0xd5, 0x00, 0xe2, 0xe9, 0x15, 0xb3, 0x73, 0x31, 0xc6, 0x0b, ++ 0xb6, 0x97, 0x72, 0xff, 0x74, 0x7b, 0xa9, 0xc9, 0xf0, 0xfc, 0xc9, 0xf8, ++ 0x40, 0x07, 0x8e, 0xe7, 0x73, 0x67, 0xc3, 0x0d, 0x26, 0x18, 0xff, 0xe7, ++ 0xd3, 0x37, 0x3c, 0x71, 0x6b, 0x6e, 0xc4, 0x9f, 0xbe, 0x1a, 0x5d, 0x52, ++ 0xf0, 0x83, 0x16, 0x30, 0xdd, 0x4c, 0xf9, 0x89, 0xcc, 0xf7, 0x7c, 0x2e, ++ 0x34, 0x75, 0x0d, 0x18, 0x58, 0x08, 0x5f, 0xc7, 0x82, 0xf4, 0xcc, 0x2a, ++ 0x0c, 0xec, 0xc2, 0xf9, 0x2e, 0x01, 0x43, 0x1c, 0xe1, 0x40, 0xb9, 0x35, ++ 0x67, 0xb0, 0x79, 0xc5, 0x8e, 0x6b, 0xaf, 0x18, 0xd7, 0x5e, 0x31, 0x1e, ++ 0xf9, 0x7c, 0x71, 0x7c, 0xe0, 0x69, 0x6c, 0xef, 0x73, 0xa7, 0x8f, 0xc6, ++ 0xf5, 0xca, 0x94, 0xcb, 0xf3, 0x71, 0x5e, 0x72, 0x5c, 0x71, 0x13, 0x74, ++ 0x71, 0x9e, 0xa1, 0x6f, 0x27, 0x8e, 0xef, 0xf3, 0xe7, 0x3e, 0x3d, 0xa9, ++ 0x8c, 0x8a, 0xe0, 0x5f, 0xfa, 0xed, 0x9b, 0x2b, 0x45, 0x5e, 0xc9, 0x06, ++ 0x85, 0xc7, 0xe5, 0xa4, 0xbd, 0x26, 0xf2, 0x52, 0xa4, 0xdf, 0x51, 0x73, ++ 0xbb, 0x12, 0x42, 0x7b, 0x7d, 0x19, 0xf8, 0x3b, 0xb8, 0xbf, 0xf4, 0xa6, ++ 0xb0, 0x3f, 0xdf, 0xb4, 0x73, 0xfd, 0x7c, 0xa6, 0xc1, 0x5c, 0x80, 0x76, ++ 0x7d, 0x8d, 0x12, 0xe7, 0xc1, 0x7d, 0xb8, 0x33, 0x0d, 0xff, 0xe5, 0x40, ++ 0x77, 0x1a, 0xea, 0x33, 0xdc, 0x27, 0x69, 0xc1, 0x9c, 0x03, 0x28, 0x6f, ++ 0xb9, 0x43, 0xa1, 0x7c, 0xee, 0x1a, 0x68, 0xc7, 0x04, 0xed, 0xd4, 0x60, ++ 0x20, 0x10, 0xbf, 0xbb, 0x4b, 0x21, 0xfe, 0xfb, 0x62, 0x7c, 0x2e, 0x8d, ++ 0xaf, 0x06, 0xcc, 0x3f, 0xf2, 0xb3, 0x52, 0xfa, 0x72, 0x70, 0xbf, 0x14, ++ 0xf8, 0xe5, 0x45, 0xa4, 0xc3, 0xda, 0x29, 0x6a, 0xd0, 0x02, 0xf6, 0xf0, ++ 0x2b, 0xa6, 0x50, 0xbe, 0x42, 0xfb, 0xd2, 0x37, 0x59, 0x14, 0x18, 0xe7, ++ 0x9a, 0x14, 0xe0, 0x93, 0x91, 0x43, 0xf3, 0xc3, 0x7a, 0x71, 0xfe, 0x40, ++ 0xbe, 0x07, 0x3e, 0xfb, 0x03, 0xb6, 0xf7, 0xb7, 0x5f, 0x4f, 0x2e, 0xa0, ++ 0x38, 0xfe, 0xa1, 0x29, 0x3a, 0xe2, 0xad, 0xc5, 0xc4, 0xcf, 0x23, 0x05, ++ 0x7f, 0xaf, 0x7a, 0x78, 0xbe, 0x0b, 0x17, 0xd5, 0xea, 0xd4, 0xf1, 0x14, ++ 0xa7, 0x64, 0x9a, 0xc7, 0x83, 0x71, 0xa6, 0x79, 0xe2, 0xfc, 0xca, 0x11, ++ 0x95, 0x6d, 0xdc, 0x37, 0x88, 0x1c, 0xfd, 0xbb, 0xa0, 0xdb, 0x2b, 0xe9, ++ 0xe6, 0x39, 0x21, 0x6a, 0xd7, 0xb8, 0x5f, 0xf3, 0xb1, 0xa0, 0xe3, 0xc7, ++ 0xa2, 0xde, 0xbc, 0xa3, 0x2f, 0x66, 0xe3, 0xf9, 0xab, 0xf5, 0xdd, 0x66, ++ 0xb2, 0x47, 0x58, 0x49, 0x6f, 0xa1, 0xdf, 0x39, 0xc8, 0x7c, 0x36, 0x6e, ++ 0xfd, 0x76, 0x5e, 0x14, 0x7f, 0xd7, 0x77, 0xbd, 0xcd, 0xf3, 0x35, 0x58, ++ 0x6f, 0x61, 0x74, 0x7e, 0xba, 0x6b, 0x32, 0x6f, 0x57, 0xf2, 0x93, 0x6a, ++ 0x71, 0x06, 0x76, 0x39, 0xa2, 0xc7, 0xd7, 0xcf, 0xdf, 0x9f, 0x11, 0x7f, ++ 0x27, 0x02, 0x7f, 0x8f, 0x22, 0xfe, 0x3e, 0x89, 0xf6, 0xf6, 0x7c, 0xab, ++ 0x9e, 0x70, 0x1d, 0x3c, 0x7b, 0x01, 0x45, 0x61, 0x78, 0x06, 0x7e, 0xea, ++ 0xa6, 0x7c, 0x23, 0x99, 0x77, 0xb4, 0x8a, 0xf9, 0xe9, 0xb9, 0x06, 0xd8, ++ 0x01, 0xf9, 0xd9, 0x1f, 0x7c, 0xc0, 0x82, 0xf8, 0x5f, 0xcb, 0x3a, 0xe9, ++ 0xfd, 0xfa, 0xb2, 0x1b, 0x73, 0x10, 0xae, 0x67, 0x7d, 0xd5, 0xe9, 0xe8, ++ 0x4f, 0xb4, 0x37, 0x3f, 0x9f, 0x0e, 0xa3, 0x5c, 0xb4, 0xed, 0x81, 0x59, ++ 0x18, 0x9f, 0x5d, 0x18, 0x5a, 0xf1, 0x3c, 0x3e, 0x17, 0x3c, 0xa6, 0x9c, ++ 0x44, 0xff, 0x15, 0xd6, 0x87, 0x79, 0x32, 0xc6, 0x4f, 0x94, 0x86, 0xb6, ++ 0xe1, 0xd0, 0xdf, 0xd2, 0xbd, 0x95, 0x6d, 0x99, 0xf0, 0x7e, 0xbe, 0xca, ++ 0xe9, 0xc1, 0x5e, 0xe2, 0xf4, 0x00, 0xbe, 0xf1, 0xa9, 0x49, 0x03, 0xe7, ++ 0x09, 0xeb, 0xc1, 0x39, 0x99, 0xe6, 0xe1, 0xa3, 0x79, 0xa8, 0xae, 0x39, ++ 0x86, 0xf5, 0x50, 0xb3, 0x89, 0xf9, 0x94, 0x94, 0x48, 0xfe, 0x7c, 0xff, ++ 0xfa, 0x28, 0xbb, 0xe5, 0xaf, 0x99, 0xe8, 0x0f, 0x69, 0x7d, 0xb4, 0xff, ++ 0x5e, 0x7f, 0xc8, 0x9a, 0x84, 0x74, 0x5e, 0xcb, 0xb8, 0xfe, 0x8e, 0xc4, ++ 0x3f, 0xa4, 0xde, 0x66, 0xc4, 0xe7, 0xb7, 0xb0, 0x38, 0x0f, 0xd6, 0xfb, ++ 0x50, 0xf0, 0xf5, 0x87, 0xd9, 0x8c, 0xf8, 0xfa, 0x43, 0x05, 0x1c, 0x3c, ++ 0x6f, 0xc4, 0x9e, 0x64, 0x39, 0x81, 0x74, 0xef, 0xa8, 0x88, 0xfe, 0xfd, ++ 0xd0, 0x14, 0x2a, 0x75, 0x8d, 0x22, 0xfd, 0x9c, 0x87, 0xf3, 0x7d, 0x21, ++ 0x7d, 0x91, 0x8e, 0x71, 0xb3, 0x5b, 0x52, 0x6c, 0x1e, 0x15, 0xcb, 0x13, ++ 0x43, 0x39, 0x7c, 0x1f, 0xb5, 0x5f, 0xce, 0xb3, 0x0b, 0xf1, 0x91, 0xb8, ++ 0xd7, 0xfd, 0x66, 0x1e, 0x87, 0x8a, 0x1d, 0x97, 0x52, 0xf6, 0xc2, 0x3f, ++ 0xd0, 0x7e, 0xb0, 0x5a, 0x58, 0x10, 0xf7, 0x37, 0x60, 0x7d, 0xb3, 0x52, ++ 0x5c, 0xd7, 0xc3, 0x2d, 0xb4, 0xae, 0x5a, 0x10, 0xb5, 0x18, 0x3f, 0xab, ++ 0xf2, 0xeb, 0x83, 0xb5, 0xdf, 0x2a, 0xda, 0xed, 0xfe, 0x82, 0xfb, 0xc1, ++ 0x41, 0x98, 0x0f, 0x9e, 0x97, 0x1c, 0xd0, 0x8f, 0x5b, 0xf4, 0x13, 0xc7, ++ 0xfb, 0x91, 0x7a, 0x04, 0xfb, 0x23, 0x39, 0x92, 0xc6, 0x0c, 0xfd, 0xcd, ++ 0xc2, 0x24, 0x17, 0xa0, 0xcb, 0x2b, 0x4e, 0x1f, 0x8d, 0xbf, 0xd9, 0x94, ++ 0x48, 0x72, 0xe7, 0xe3, 0x11, 0x81, 0x6a, 0xa4, 0x97, 0x8c, 0xff, 0x48, ++ 0xff, 0xb0, 0x3b, 0xf7, 0xfd, 0x3c, 0xf2, 0xe3, 0xcf, 0xb7, 0x64, 0xa1, ++ 0x9d, 0x0e, 0xfc, 0xcb, 0xf3, 0x12, 0xa7, 0x73, 0xf9, 0xf4, 0x8a, 0x59, ++ 0x0f, 0x22, 0xfc, 0x4a, 0x65, 0x2e, 0xc5, 0xff, 0xa5, 0xdc, 0xbd, 0xba, ++ 0x8c, 0xc7, 0xcb, 0xae, 0x96, 0xf1, 0xb1, 0x8a, 0x98, 0xf8, 0x58, 0x4c, ++ 0x5c, 0x86, 0x55, 0x0c, 0x1e, 0x2f, 0x63, 0xcc, 0x63, 0xc6, 0x7e, 0xc7, ++ 0xb2, 0x37, 0x25, 0x7e, 0x28, 0x1e, 0x73, 0xb4, 0x42, 0x23, 0xba, 0x07, ++ 0x81, 0xee, 0x18, 0x6f, 0x3e, 0x2a, 0xfc, 0xd4, 0xca, 0x78, 0xee, 0x9f, ++ 0x77, 0x4e, 0x4e, 0x26, 0x7e, 0x4a, 0xba, 0x22, 0x6f, 0xd0, 0x7d, 0x15, ++ 0xf9, 0xbc, 0x47, 0xc4, 0x57, 0xef, 0x05, 0x3b, 0x88, 0x45, 0xc5, 0xd5, ++ 0xef, 0x29, 0x69, 0xb4, 0x61, 0x9e, 0xc1, 0x96, 0x42, 0x85, 0xf6, 0xbb, ++ 0xee, 0xab, 0x8a, 0xab, 0x8d, 0xce, 0x73, 0xdf, 0x3b, 0xcd, 0xcc, 0xf7, ++ 0x53, 0xa7, 0x57, 0xee, 0x44, 0xbc, 0x15, 0x3a, 0x42, 0x55, 0xa4, 0xae, ++ 0x7d, 0x9a, 0x8e, 0xf3, 0x50, 0xc4, 0xbc, 0xc6, 0xb9, 0x01, 0xef, 0x26, ++ 0x6c, 0xda, 0x2f, 0xe2, 0xa4, 0x1e, 0x1b, 0x8f, 0x4b, 0x55, 0x93, 0xbe, ++ 0x96, 0xf4, 0xbe, 0x54, 0x7d, 0xfd, 0x94, 0x16, 0xda, 0x14, 0x87, 0xf3, ++ 0x4e, 0x61, 0xb4, 0xfe, 0x9c, 0x1d, 0x76, 0x92, 0xa3, 0x6a, 0xa7, 0x2f, ++ 0x8c, 0x29, 0xd7, 0x5f, 0x4e, 0x5b, 0x78, 0x27, 0xd1, 0x51, 0xf3, 0x17, ++ 0x60, 0x3f, 0x47, 0x4a, 0xe3, 0x98, 0x03, 0xea, 0x7f, 0x7e, 0xc4, 0x42, ++ 0xfe, 0xfd, 0x21, 0xd3, 0xca, 0x9f, 0x62, 0x3e, 0x7c, 0xdf, 0x1b, 0x56, ++ 0x86, 0xfb, 0x9e, 0x9d, 0xce, 0x4c, 0x0d, 0xf5, 0x45, 0xe7, 0x17, 0x97, ++ 0x55, 0xd3, 0xd3, 0x39, 0x75, 0x36, 0xe3, 0x71, 0xce, 0x78, 0x13, 0x08, ++ 0x88, 0x22, 0x37, 0x7b, 0xf4, 0xdf, 0x90, 0x58, 0xe2, 0xdc, 0x59, 0xa7, ++ 0xc2, 0xba, 0x19, 0xc5, 0xdb, 0x7c, 0xf1, 0x26, 0xf0, 0xc1, 0x3a, 0x4d, ++ 0xec, 0xec, 0x0c, 0x18, 0xd7, 0x7e, 0x87, 0xf7, 0xc1, 0x89, 0xc4, 0x72, ++ 0x7e, 0x15, 0xe7, 0xd9, 0x55, 0x11, 0xb8, 0x1f, 0xd7, 0x53, 0x29, 0x6b, ++ 0x20, 0xf8, 0x3e, 0x8b, 0xbf, 0x76, 0x17, 0xf4, 0x7b, 0x5f, 0x92, 0x8d, ++ 0xf8, 0xc4, 0x5f, 0xe1, 0x7f, 0x80, 0x8f, 0x93, 0xb5, 0xcd, 0x85, 0xf1, ++ 0x4d, 0x9f, 0xa9, 0x30, 0x3c, 0xc7, 0xdb, 0x66, 0x01, 0xb9, 0x5c, 0x88, ++ 0x71, 0x92, 0x38, 0xbe, 0x27, 0xc5, 0xb8, 0x7d, 0xef, 0x3f, 0x97, 0x4f, ++ 0xfd, 0xef, 0x98, 0xcc, 0xf7, 0xf9, 0x5a, 0xd3, 0x7d, 0x3d, 0x78, 0x60, ++ 0x64, 0x48, 0xbc, 0xb9, 0xb5, 0xbe, 0xfe, 0xb8, 0x08, 0xf1, 0x5b, 0x16, ++ 0xc5, 0xf3, 0x24, 0x1e, 0xa3, 0xe9, 0xe5, 0x2e, 0x35, 0xd0, 0x2b, 0x60, ++ 0x8e, 0xa6, 0x57, 0x19, 0xd0, 0x6b, 0x7c, 0x34, 0xbd, 0x7c, 0xca, 0xd7, ++ 0xa1, 0xd7, 0xed, 0x98, 0x5c, 0x36, 0x69, 0x20, 0x7f, 0x06, 0xab, 0xf4, ++ 0x07, 0xaa, 0x4b, 0xb8, 0x5e, 0xc3, 0x14, 0xb9, 0x4a, 0x6b, 0x76, 0x21, ++ 0xda, 0xeb, 0x47, 0xe2, 0x32, 0x0b, 0xa3, 0xf7, 0xf5, 0x24, 0x5f, 0x4a, ++ 0x3e, 0x1d, 0x84, 0x3f, 0x37, 0x1c, 0x43, 0xf9, 0x90, 0xa5, 0xb9, 0x31, ++ 0x7e, 0x6a, 0x9d, 0x17, 0x47, 0xfb, 0x2d, 0x92, 0x5f, 0x25, 0x9f, 0xfe, ++ 0x75, 0x4a, 0x3f, 0xbf, 0x7a, 0xcb, 0xe1, 0xb9, 0xcc, 0xe1, 0x9f, 0x85, ++ 0x32, 0x24, 0x96, 0x5f, 0x31, 0x1e, 0x16, 0xcd, 0x97, 0x35, 0x43, 0xf2, ++ 0x2f, 0x73, 0x47, 0xaf, 0xd7, 0xf9, 0x60, 0x3f, 0x24, 0x24, 0xa1, 0xdd, ++ 0x73, 0xea, 0xb1, 0xce, 0x28, 0xbe, 0xac, 0x69, 0xf8, 0x54, 0xe3, 0xf2, ++ 0xe3, 0xc2, 0x8c, 0xb8, 0xd2, 0x48, 0xfc, 0x6e, 0x7e, 0x85, 0xc2, 0xde, ++ 0x89, 0xa6, 0x2f, 0xfc, 0x7b, 0xa7, 0x40, 0xcc, 0x8f, 0xec, 0x1e, 0x8d, ++ 0xfc, 0x2d, 0x89, 0xc7, 0x4b, 0xc5, 0xb7, 0xf9, 0x5b, 0xcd, 0x05, 0x68, ++ 0xc7, 0x6d, 0xc6, 0xf3, 0x89, 0x80, 0xaf, 0x76, 0xc5, 0xe3, 0x1b, 0x86, ++ 0x71, 0xad, 0x86, 0xb7, 0x6f, 0xc5, 0xf7, 0x6d, 0xe2, 0x7c, 0x70, 0xb0, ++ 0xd0, 0xc2, 0xed, 0x2b, 0xb1, 0x4e, 0x64, 0x7b, 0x5f, 0x4e, 0xab, 0x7a, ++ 0x07, 0xf9, 0xd6, 0x39, 0xf9, 0x74, 0xfc, 0x6a, 0xa8, 0xf7, 0x79, 0x9a, ++ 0x49, 0x47, 0xe4, 0xb4, 0xe9, 0x2b, 0xff, 0x8d, 0xd6, 0xdd, 0x89, 0x78, ++ 0x86, 0xdf, 0xb9, 0x92, 0x7b, 0x6a, 0x1f, 0xa5, 0x75, 0x34, 0x86, 0xe1, ++ 0xfe, 0xe0, 0xe7, 0x37, 0x07, 0x46, 0xe0, 0x7e, 0xfd, 0xdd, 0x40, 0xa7, ++ 0x77, 0x28, 0x99, 0x3a, 0x34, 0xcc, 0x44, 0x7b, 0x59, 0xbd, 0xc3, 0x70, ++ 0x1d, 0x01, 0x72, 0xd3, 0xf9, 0x33, 0x90, 0xce, 0xdf, 0x33, 0x51, 0x1e, ++ 0x22, 0xf8, 0x3b, 0x53, 0x46, 0x0a, 0xbf, 0xc3, 0x27, 0xea, 0xf7, 0x52, ++ 0xfd, 0xbb, 0x2d, 0xdb, 0x6c, 0x71, 0xd8, 0x4f, 0xae, 0xcd, 0xbd, 0x3b, ++ 0x8a, 0xdf, 0x67, 0x88, 0xf8, 0x3a, 0x1e, 0x23, 0xe7, 0xfb, 0x67, 0x2d, ++ 0x3a, 0xda, 0x65, 0x7a, 0x19, 0xd7, 0xbf, 0x0f, 0x36, 0xed, 0x99, 0xf6, ++ 0xde, 0x68, 0x1c, 0x4f, 0xe7, 0xb4, 0xf7, 0x60, 0x3c, 0xc9, 0x73, 0x43, ++ 0x2c, 0x00, 0x7c, 0x1c, 0x57, 0x10, 0xd4, 0x31, 0x05, 0xc4, 0xf6, 0xe5, ++ 0x4c, 0x05, 0xcf, 0x2f, 0xb0, 0xcb, 0x58, 0x27, 0xf2, 0x0d, 0xbe, 0x6f, ++ 0x1e, 0x1f, 0x69, 0xdf, 0x5c, 0xc6, 0xd7, 0x99, 0x0d, 0xed, 0x15, 0xa0, ++ 0x9f, 0x6d, 0x53, 0x50, 0x4f, 0x8a, 0x92, 0x7f, 0x36, 0x93, 0x12, 0x18, ++ 0x2c, 0xdf, 0xe5, 0x8e, 0x29, 0x1a, 0xff, 0x6e, 0x13, 0xa3, 0x72, 0xdb, ++ 0xd1, 0xed, 0x74, 0x9e, 0x3f, 0x39, 0xcf, 0xa3, 0x60, 0xde, 0xb3, 0x6d, ++ 0xd3, 0x36, 0x86, 0xfb, 0x31, 0xf6, 0x30, 0x7f, 0x9f, 0x92, 0xe7, 0x53, ++ 0x56, 0x45, 0xb5, 0x9b, 0x32, 0x17, 0xc6, 0x1d, 0xc5, 0x17, 0xf3, 0xf1, ++ 0x24, 0x01, 0xc8, 0x1b, 0xdb, 0x6e, 0x60, 0xcc, 0x12, 0xa4, 0x43, 0x1c, ++ 0xc5, 0x1f, 0x63, 0xfb, 0x9d, 0x9f, 0x5a, 0xd5, 0xad, 0xb9, 0x86, 0xe6, ++ 0x93, 0x58, 0x7e, 0x63, 0x82, 0xdf, 0x24, 0xdf, 0xc8, 0x79, 0xd2, 0xc9, ++ 0x94, 0xa8, 0x73, 0xf9, 0xd5, 0x23, 0xb9, 0x3d, 0xdc, 0xb6, 0xd1, 0xb2, ++ 0x0b, 0xed, 0xed, 0xf2, 0xb2, 0x44, 0xc2, 0xef, 0x67, 0x29, 0x55, 0x09, ++ 0xec, 0x22, 0x7a, 0x65, 0x27, 0xf0, 0x41, 0xd0, 0x8a, 0xfe, 0xb1, 0x8d, ++ 0x9e, 0xbb, 0xc1, 0xbf, 0x0e, 0x8e, 0x41, 0xff, 0x38, 0x9d, 0xe0, 0x27, ++ 0xc0, 0xbf, 0xc6, 0xe7, 0x1e, 0xf0, 0xaf, 0xf1, 0xf9, 0x14, 0xf8, 0xd7, ++ 0x58, 0xbe, 0x17, 0xfc, 0x6b, 0x84, 0x7f, 0x01, 0xfe, 0x35, 0xc2, 0x9d, ++ 0xe0, 0x5f, 0x23, 0xbc, 0x1f, 0xfc, 0x6b, 0x84, 0x0f, 0x80, 0x7f, 0x8d, ++ 0xf0, 0x2f, 0xc1, 0xbf, 0xc6, 0x67, 0x17, 0xf8, 0xd7, 0xf8, 0xfc, 0x0d, ++ 0xf8, 0xd7, 0x58, 0x7e, 0x10, 0xfc, 0x6b, 0x84, 0x67, 0x58, 0x81, 0x3f, ++ 0x70, 0x3e, 0x05, 0xc1, 0xf4, 0x85, 0x40, 0xd7, 0xf6, 0x3b, 0x2c, 0x3e, ++ 0xcc, 0x17, 0xdc, 0x20, 0xe8, 0x7a, 0xcc, 0x37, 0x32, 0xd9, 0x03, 0xf4, ++ 0xb7, 0x17, 0x98, 0x28, 0xf6, 0x6d, 0x7f, 0xf9, 0x07, 0x0c, 0xe7, 0x63, ++ 0x4f, 0x37, 0xd1, 0xf9, 0xaf, 0xcd, 0xe9, 0x3f, 0x60, 0x37, 0xa2, 0xdf, ++ 0x5a, 0xea, 0x24, 0xbb, 0xa9, 0xed, 0xe7, 0xdc, 0x1e, 0xb1, 0x6b, 0x0f, ++ 0x32, 0x94, 0x3b, 0x3b, 0x95, 0x60, 0x2d, 0xf3, 0x30, 0xb6, 0xb8, 0x6c, ++ 0x6c, 0x0d, 0xee, 0xf3, 0xe5, 0xa5, 0x6f, 0xa8, 0x4a, 0x02, 0xf8, 0x86, ++ 0xb2, 0x89, 0x3b, 0x6c, 0xb0, 0x3e, 0xf2, 0xf5, 0x05, 0x8b, 0x9b, 0xa3, ++ 0x60, 0xdd, 0xe9, 0x5d, 0xbb, 0xcf, 0x1d, 0x81, 0x47, 0x14, 0xee, 0xd2, ++ 0xc0, 0x33, 0x61, 0x37, 0x76, 0x15, 0xed, 0xc0, 0xa3, 0x3f, 0x38, 0x0e, ++ 0xcc, 0x13, 0xae, 0x2b, 0x2b, 0xa9, 0x69, 0x06, 0x16, 0x0a, 0x8f, 0x64, ++ 0x64, 0x57, 0xf4, 0xe5, 0x5a, 0x28, 0x3f, 0x67, 0x15, 0xd2, 0x6b, 0x34, ++ 0x8e, 0x9f, 0xc7, 0x0d, 0xaf, 0x62, 0x2d, 0xe9, 0xb8, 0x6f, 0x39, 0x42, ++ 0x07, 0xef, 0x47, 0xa1, 0xfa, 0x61, 0x96, 0x72, 0xe9, 0xf5, 0x37, 0x94, ++ 0xe9, 0xf4, 0x3e, 0xf6, 0xbb, 0x8b, 0xd5, 0x33, 0x95, 0x5c, 0x52, 0x3d, ++ 0xa6, 0x5e, 0xa4, 0x3d, 0x2c, 0x57, 0x2e, 0xd2, 0x8e, 0x4d, 0x59, 0x64, ++ 0xeb, 0x81, 0xb1, 0x6f, 0x35, 0x0b, 0x39, 0x95, 0xea, 0x20, 0x39, 0xd5, ++ 0x8e, 0x71, 0x1c, 0xc0, 0x7b, 0xbb, 0x9d, 0x3f, 0xbb, 0xa7, 0xf0, 0xb8, ++ 0xc1, 0xae, 0x29, 0x55, 0xde, 0x29, 0xf0, 0xf4, 0x4e, 0xe1, 0x74, 0x6d, ++ 0xb7, 0x07, 0xdd, 0x55, 0xd8, 0xff, 0x78, 0x13, 0xe5, 0x2d, 0xb0, 0x8d, ++ 0xb9, 0x7f, 0x18, 0x09, 0xfd, 0x7d, 0xfb, 0xf7, 0x1a, 0xc3, 0xbc, 0x4f, ++ 0xc9, 0x9f, 0xed, 0x82, 0x0f, 0x46, 0x8f, 0x70, 0xd2, 0xf9, 0x7b, 0x76, ++ 0xa7, 0x8d, 0xf6, 0xed, 0x2f, 0x1f, 0xf1, 0xf3, 0xd6, 0x24, 0x80, 0x47, ++ 0x3f, 0xea, 0xf1, 0x60, 0x7e, 0xc3, 0x56, 0xe6, 0x89, 0x43, 0x3e, 0x09, ++ 0xde, 0x6b, 0xa2, 0xfc, 0xc6, 0xa7, 0x4b, 0x46, 0x25, 0x2d, 0x80, 0xea, ++ 0xe3, 0x26, 0x3d, 0x9b, 0x84, 0x72, 0xfd, 0xa4, 0x90, 0x37, 0x21, 0x91, ++ 0x17, 0xd4, 0xdc, 0xb6, 0x7a, 0x04, 0xea, 0xb1, 0xcf, 0x5f, 0xe3, 0xf2, ++ 0xf0, 0xc7, 0x42, 0x3e, 0xed, 0x32, 0xf7, 0x34, 0x10, 0x3d, 0x27, 0x39, ++ 0xc8, 0xee, 0x60, 0x6c, 0x1b, 0xd9, 0x17, 0xcd, 0xe9, 0x40, 0x6c, 0xd0, ++ 0x91, 0xa6, 0x0c, 0xfe, 0xb4, 0x98, 0xdd, 0x4b, 0xb1, 0x9e, 0x05, 0x0c, ++ 0x01, 0xcc, 0xbf, 0xb6, 0x7c, 0x31, 0xd9, 0x86, 0x7e, 0x5d, 0xcb, 0x39, ++ 0xeb, 0x1c, 0x9e, 0x1f, 0xdb, 0x43, 0x76, 0x87, 0xc5, 0x1e, 0x70, 0x27, ++ 0xc2, 0xfb, 0x6d, 0x41, 0x13, 0xc9, 0x85, 0x16, 0xdd, 0x41, 0xf9, 0x6c, ++ 0x5b, 0x1d, 0xde, 0x6e, 0x3c, 0xcf, 0x1c, 0x74, 0x9b, 0x28, 0xef, 0x75, ++ 0x6b, 0xa1, 0x89, 0xf0, 0xd8, 0xea, 0xb8, 0x36, 0x84, 0xf6, 0xbc, 0xa6, ++ 0x34, 0xd7, 0xa2, 0x1e, 0x0b, 0xb9, 0xf7, 0xdb, 0x72, 0xe1, 0x7d, 0xa8, ++ 0xd0, 0x44, 0x79, 0x8c, 0x21, 0xdf, 0xc2, 0x39, 0x08, 0x07, 0x03, 0x1a, ++ 0xe5, 0x59, 0xd1, 0x0f, 0x96, 0x07, 0x92, 0xe8, 0x1c, 0xf7, 0x56, 0xd6, ++ 0xf7, 0xd2, 0x44, 0x2c, 0xaf, 0xe1, 0x76, 0x57, 0x5b, 0xda, 0x7f, 0x1f, ++ 0x8d, 0xc7, 0x38, 0xf7, 0x35, 0x6e, 0x0f, 0xdf, 0x56, 0x61, 0x3a, 0xe6, ++ 0x81, 0x51, 0x4a, 0x98, 0x09, 0xfd, 0xeb, 0xde, 0x4d, 0xf1, 0x38, 0x8e, ++ 0x25, 0x4c, 0xf8, 0xad, 0x41, 0xf2, 0x53, 0x5d, 0x56, 0x4e, 0xbf, 0xef, ++ 0x1f, 0xb9, 0xc2, 0x3d, 0x92, 0xec, 0x8a, 0xa8, 0xfd, 0x2b, 0x2b, 0xc6, ++ 0xe4, 0x3c, 0x36, 0x0f, 0x94, 0x4f, 0x70, 0x78, 0xe7, 0xa0, 0x1f, 0xa9, ++ 0x39, 0xbd, 0x36, 0xcc, 0xef, 0x6b, 0x75, 0x7b, 0x6d, 0x2b, 0x68, 0xfe, ++ 0x3c, 0x2f, 0x8d, 0xf2, 0x2f, 0xa0, 0xdd, 0x16, 0xb7, 0x89, 0xfc, 0x59, ++ 0x2c, 0xbf, 0xb1, 0x90, 0xd4, 0xe1, 0xf1, 0xbc, 0x52, 0x91, 0x72, 0xaf, ++ 0xe3, 0xbc, 0x7f, 0x70, 0x04, 0xf1, 0xa1, 0xdd, 0xc4, 0x58, 0xae, 0x8e, ++ 0xe3, 0xd3, 0x82, 0xd1, 0xfb, 0x83, 0xb6, 0x51, 0x15, 0xdd, 0x3a, 0xcc, ++ 0xa3, 0x7d, 0x75, 0x12, 0xcd, 0x43, 0x53, 0x3c, 0x04, 0xb3, 0x9b, 0x34, ++ 0x1a, 0xf7, 0x70, 0x3d, 0x8e, 0xce, 0x2f, 0x3f, 0x68, 0x99, 0xd7, 0x8d, ++ 0xf6, 0xe1, 0x70, 0xdb, 0x2d, 0xb4, 0x8f, 0x95, 0x51, 0xab, 0x19, 0xf6, ++ 0x99, 0x86, 0x05, 0x8c, 0x70, 0xea, 0x62, 0x23, 0x9c, 0xcc, 0xb4, 0xc8, ++ 0x3e, 0x15, 0xf4, 0xfb, 0xae, 0xe0, 0x9b, 0x58, 0xbc, 0xc5, 0xe2, 0x23, ++ 0xc3, 0xdd, 0xfa, 0x1a, 0x8e, 0x3f, 0x23, 0x40, 0x87, 0x6b, 0x07, 0x8c, ++ 0x7f, 0xbb, 0xfb, 0xa1, 0xc4, 0x4a, 0x86, 0xe3, 0x74, 0xd0, 0x38, 0xd3, ++ 0x1c, 0x2b, 0x2b, 0xd1, 0x7e, 0x4a, 0x65, 0xfe, 0x66, 0xe4, 0xbf, 0x7f, ++ 0x75, 0x9c, 0x13, 0xdc, 0x0b, 0x6d, 0xb9, 0xd0, 0xff, 0x84, 0x14, 0x13, ++ 0x99, 0x47, 0x13, 0x59, 0xdf, 0x26, 0x6c, 0x77, 0xab, 0xe0, 0xf7, 0xf6, ++ 0x5c, 0x4e, 0xcf, 0xc8, 0xba, 0x52, 0x39, 0xbf, 0x4f, 0xa9, 0xca, 0x9c, ++ 0x92, 0x8a, 0xfb, 0x04, 0x26, 0x70, 0xcc, 0x22, 0xed, 0xe7, 0x06, 0xc1, ++ 0x41, 0x33, 0xec, 0x13, 0x24, 0x19, 0xe0, 0xd1, 0xdb, 0x86, 0x1b, 0xea, ++ 0x8f, 0xe9, 0x18, 0x69, 0x28, 0x1f, 0x1b, 0xba, 0xcc, 0x50, 0x3e, 0x6e, ++ 0x8f, 0xd7, 0x00, 0x8f, 0xef, 0x2c, 0x37, 0xd4, 0x9f, 0xd8, 0x55, 0x65, ++ 0x80, 0x8b, 0xc2, 0x57, 0x1a, 0xea, 0x17, 0x77, 0x2f, 0x34, 0xc0, 0x93, ++ 0x7a, 0x96, 0x1a, 0xea, 0x4f, 0x3e, 0xb1, 0xd2, 0x50, 0x3e, 0xa5, 0x77, ++ 0xad, 0xa1, 0x7c, 0xea, 0xa9, 0x46, 0x03, 0x3c, 0xad, 0xef, 0xbb, 0x86, ++ 0xfa, 0xd2, 0x9e, 0x8f, 0xd5, 0x8f, 0xa9, 0x53, 0xbe, 0x99, 0x1d, 0x6f, ++ 0x4d, 0x1f, 0x6e, 0xb8, 0xc7, 0x26, 0xd6, 0x4f, 0x88, 0xb5, 0xf3, 0x6d, ++ 0x5f, 0xb6, 0xe8, 0x9b, 0x90, 0x9f, 0x5d, 0x16, 0xe2, 0x67, 0x0d, 0xf5, ++ 0x39, 0xee, 0x2b, 0xdf, 0xc1, 0xfd, 0x21, 0xdb, 0x74, 0x8f, 0x8e, 0xf2, ++ 0x25, 0x5e, 0xc8, 0xd3, 0x57, 0xa6, 0xfb, 0x46, 0x22, 0xdd, 0x2a, 0x5d, ++ 0x36, 0xd2, 0x0b, 0x9a, 0x83, 0xd7, 0xd3, 0x1c, 0xb3, 0xc9, 0x5e, 0xc9, ++ 0xe9, 0xb0, 0xd0, 0xfd, 0x3a, 0x9a, 0x9b, 0xf5, 0x97, 0xc7, 0xa3, 0x7c, ++ 0x6e, 0x0a, 0x4e, 0xcb, 0x1b, 0x1d, 0x19, 0xb7, 0xdd, 0xbd, 0x8d, 0xee, ++ 0xa9, 0xa8, 0x74, 0xcd, 0x61, 0x98, 0x77, 0x24, 0xbf, 0xd7, 0xdc, 0x3e, ++ 0x16, 0x70, 0x62, 0x7f, 0x3a, 0xb7, 0x93, 0xdc, 0x41, 0xaa, 0x67, 0xd7, ++ 0xe1, 0xfb, 0xa8, 0x79, 0x1c, 0x32, 0x99, 0x98, 0x03, 0xe5, 0x38, 0xf8, ++ 0x6d, 0x18, 0x1f, 0x19, 0xca, 0x4f, 0x93, 0xfe, 0x99, 0xf4, 0xcb, 0x86, ++ 0xf2, 0xc7, 0xa4, 0x1f, 0x96, 0x63, 0x62, 0x71, 0xf8, 0xdc, 0xa5, 0xf4, ++ 0xde, 0x8a, 0x7e, 0x7a, 0x61, 0xc3, 0x6b, 0x55, 0xc3, 0x18, 0xf9, 0x6b, ++ 0xd5, 0xa8, 0x47, 0xee, 0xc3, 0xf3, 0xd9, 0xe8, 0xa7, 0x4d, 0xe0, 0x76, ++ 0x56, 0x5b, 0xda, 0x95, 0x3a, 0xc6, 0x6d, 0xda, 0x73, 0x3b, 0xbb, 0x47, ++ 0xe2, 0x78, 0x52, 0x4d, 0x14, 0x17, 0x05, 0xbb, 0xd9, 0xb3, 0x30, 0xca, ++ 0x5e, 0x5c, 0x2f, 0xe8, 0xa9, 0x8d, 0x6c, 0xef, 0x45, 0xfd, 0xd7, 0x98, ++ 0x68, 0xd3, 0xd1, 0x5e, 0xd2, 0x6c, 0xbb, 0xa6, 0xbd, 0x07, 0xf8, 0xda, ++ 0x69, 0xee, 0x7d, 0x12, 0xe3, 0x10, 0xad, 0x8a, 0x7b, 0x5d, 0x27, 0xca, ++ 0xc5, 0x3b, 0x1c, 0x94, 0xef, 0xf1, 0xa0, 0xc0, 0x9b, 0xee, 0x34, 0x15, ++ 0x6f, 0x82, 0x76, 0x3b, 0x9b, 0x7d, 0x1a, 0x9e, 0xc3, 0xef, 0xbc, 0x9b, ++ 0x79, 0x5a, 0x71, 0x7d, 0xa4, 0x54, 0x6e, 0x4a, 0x84, 0xf7, 0xa3, 0xb3, ++ 0x56, 0x98, 0x30, 0xdc, 0x33, 0x26, 0xaf, 0x79, 0x13, 0x3e, 0x03, 0xc2, ++ 0x5e, 0x1e, 0x5b, 0xb8, 0xcb, 0x94, 0x0c, 0xe5, 0xe3, 0x4a, 0x2a, 0x17, ++ 0x63, 0x7c, 0x4b, 0x75, 0x43, 0x7f, 0x17, 0x89, 0x37, 0xab, 0xae, 0x0e, ++ 0x86, 0xf3, 0x61, 0x79, 0xda, 0x49, 0xe4, 0x2b, 0xb4, 0xee, 0x2f, 0xc0, ++ 0xd0, 0x2b, 0x93, 0x6c, 0xb4, 0xff, 0x68, 0x47, 0x7a, 0x2b, 0xf4, 0x24, ++ 0x3c, 0xd8, 0xcf, 0x39, 0x42, 0x76, 0x84, 0xf3, 0x38, 0x5e, 0xec, 0x3e, ++ 0x25, 0x14, 0xaf, 0x70, 0xbb, 0x15, 0xf3, 0xe5, 0x2a, 0x93, 0x3a, 0x88, ++ 0xbe, 0xd2, 0x9e, 0x45, 0x3b, 0x17, 0xdb, 0xf7, 0x57, 0x04, 0xd6, 0x23, ++ 0x1f, 0xa5, 0xcc, 0x35, 0xd2, 0x55, 0xb3, 0x3d, 0x46, 0xf8, 0xd8, 0x6a, ++ 0xe2, 0xeb, 0xa2, 0x3d, 0x51, 0x7f, 0x19, 0xf5, 0x73, 0x7b, 0x6e, 0x5e, ++ 0x12, 0xee, 0x5b, 0xf5, 0xcb, 0x11, 0x21, 0x57, 0xee, 0x10, 0xfa, 0x53, ++ 0xbe, 0x97, 0x72, 0xe5, 0x23, 0xf4, 0x1d, 0x52, 0x23, 0xf6, 0x0d, 0xf0, ++ 0x79, 0x07, 0xc6, 0xd9, 0xec, 0xda, 0x36, 0x3a, 0x7f, 0x69, 0xbf, 0x6b, ++ 0x1b, 0x43, 0xbe, 0xb6, 0xe3, 0x69, 0x75, 0xb2, 0xf7, 0x83, 0xba, 0x9f, ++ 0xf4, 0x87, 0xdf, 0x90, 0x6f, 0x56, 0x3d, 0x72, 0xb1, 0x0d, 0xf5, 0xf5, ++ 0xd9, 0x14, 0x2f, 0xd9, 0xb3, 0xf6, 0x8d, 0xbf, 0xa4, 0xf1, 0xc5, 0xe2, ++ 0xcd, 0xde, 0xcb, 0xf3, 0xce, 0x86, 0xc2, 0xab, 0x2b, 0xff, 0x61, 0xd2, ++ 0xef, 0x20, 0x80, 0x75, 0x3c, 0xb7, 0x73, 0x34, 0xcd, 0x51, 0x1b, 0x1d, ++ 0xdf, 0x94, 0xcf, 0x64, 0x21, 0xf7, 0xcd, 0x32, 0x3f, 0x08, 0x3c, 0x09, ++ 0xd4, 0x67, 0x67, 0x65, 0xfe, 0x91, 0x2f, 0x9e, 0x8f, 0x2f, 0x91, 0xc3, ++ 0xc7, 0xf2, 0x97, 0xd2, 0xf8, 0x6e, 0x4d, 0xf5, 0x0e, 0xbb, 0x98, 0xbd, ++ 0x6d, 0x07, 0x7f, 0x33, 0x10, 0x45, 0xf7, 0xbb, 0x35, 0xbf, 0x0d, 0xf1, ++ 0xd0, 0x76, 0x7e, 0xc1, 0x1c, 0x9a, 0xb7, 0x46, 0x8b, 0x81, 0x6d, 0xfd, ++ 0xa2, 0x70, 0x17, 0xc5, 0x8d, 0x85, 0xbf, 0x94, 0x2c, 0xf0, 0xab, 0x23, ++ 0x3e, 0x01, 0x8f, 0x39, 0x16, 0x7e, 0x5e, 0xc0, 0x93, 0x32, 0x97, 0xee, ++ 0x2d, 0x93, 0x71, 0x8f, 0xe7, 0xa7, 0x24, 0x51, 0xb9, 0x27, 0xc8, 0x54, ++ 0x1e, 0xaf, 0xeb, 0xcf, 0x4f, 0x37, 0x5d, 0x98, 0x48, 0x63, 0xd5, 0x2d, ++ 0x52, 0xef, 0x92, 0x29, 0xcb, 0xf5, 0x14, 0xfc, 0x7f, 0x04, 0xf3, 0x52, ++ 0x46, 0xb5, 0x6b, 0xc6, 0x7c, 0x76, 0xa1, 0xc7, 0xa5, 0x9e, 0x1e, 0xbd, ++ 0xcd, 0x58, 0x3e, 0xa6, 0xc3, 0x08, 0x8f, 0x0d, 0x0d, 0xf8, 0xfe, 0xdf, ++ 0x51, 0xcf, 0x5f, 0xc3, 0x7f, 0x07, 0x3d, 0x60, 0x2c, 0x7f, 0x58, 0xe8, ++ 0xeb, 0x6b, 0x50, 0x5f, 0xe3, 0xbe, 0xd5, 0xb7, 0x78, 0x5e, 0x88, 0x0d, ++ 0x46, 0x74, 0x81, 0xeb, 0xd9, 0x88, 0xde, 0x03, 0x39, 0x90, 0xdd, 0x19, ++ 0xae, 0x44, 0xb1, 0x99, 0x75, 0x9b, 0x66, 0xc8, 0x27, 0x19, 0x1e, 0xa3, ++ 0x0f, 0xfd, 0x15, 0x3a, 0xe1, 0xcb, 0xdf, 0xad, 0x99, 0x51, 0xcf, 0xca, ++ 0xb8, 0x4c, 0xac, 0x1c, 0x56, 0xee, 0x3c, 0xbd, 0x01, 0xd7, 0x4b, 0x65, ++ 0x7c, 0xbc, 0x8e, 0xf2, 0x13, 0xe3, 0x18, 0x01, 0x2b, 0xf7, 0xcb, 0x03, ++ 0xe0, 0xa7, 0xdc, 0xa7, 0x79, 0xfe, 0x54, 0x83, 0x7e, 0x55, 0xb7, 0x4a, ++ 0xf9, 0x52, 0x92, 0x4e, 0xb1, 0x74, 0x9d, 0x5a, 0x2e, 0xed, 0x5c, 0xff, ++ 0x1f, 0xa7, 0x90, 0x7f, 0xdc, 0x5b, 0x8c, 0xfe, 0x3a, 0xf6, 0x17, 0x88, ++ 0xea, 0x4f, 0xc6, 0x57, 0x0e, 0x4d, 0x0f, 0xbc, 0x89, 0xf5, 0x64, 0x9c, ++ 0xe5, 0xcc, 0x1c, 0xed, 0x79, 0x45, 0x8f, 0xc4, 0x51, 0x64, 0x5c, 0xc0, ++ 0x3b, 0x85, 0xaf, 0x9f, 0xad, 0x9e, 0xd7, 0x1b, 0x8e, 0xc1, 0x38, 0x8e, ++ 0x9d, 0xb0, 0x52, 0x0c, 0x64, 0x96, 0xfa, 0x72, 0x77, 0x13, 0xe6, 0x43, ++ 0x65, 0x6b, 0x24, 0xbf, 0xdc, 0x93, 0xd7, 0xfd, 0x14, 0xfd, 0xef, 0xaa, ++ 0x3f, 0x43, 0x39, 0xcc, 0xe3, 0x98, 0xae, 0x0f, 0x23, 0xbb, 0xbc, 0xdb, ++ 0x4c, 0x71, 0x80, 0x2a, 0xc1, 0xc7, 0x55, 0xc2, 0xdf, 0x92, 0xf1, 0x96, ++ 0xcf, 0x84, 0x3e, 0xe9, 0x9b, 0x22, 0xed, 0x9c, 0x60, 0x1c, 0xf7, 0xeb, ++ 0xc3, 0x71, 0x68, 0xbf, 0x8e, 0xdb, 0x03, 0xb2, 0xd7, 0x48, 0xcf, 0x78, ++ 0x5e, 0xce, 0xe3, 0x6a, 0xe3, 0x3b, 0x63, 0xcb, 0x7d, 0x94, 0xa7, 0x74, ++ 0x99, 0xe0, 0x17, 0xcc, 0x2f, 0xab, 0x4c, 0xc3, 0xb4, 0x2e, 0x0e, 0x77, ++ 0x32, 0x25, 0xd9, 0x0d, 0x74, 0x9c, 0xb8, 0xb8, 0xf7, 0x28, 0xba, 0x0e, ++ 0x85, 0x2f, 0x3e, 0x1f, 0x87, 0x7c, 0xb8, 0xcf, 0xce, 0xed, 0xb5, 0xa7, ++ 0x04, 0x3f, 0xa4, 0x31, 0xc5, 0x83, 0x79, 0xf8, 0x69, 0x7b, 0x1c, 0x9e, ++ 0x10, 0xd4, 0x73, 0xaa, 0x6c, 0x5f, 0x0f, 0xcc, 0xc3, 0x73, 0x5c, 0x33, ++ 0xe4, 0x93, 0x4d, 0x38, 0x68, 0x84, 0x0b, 0x59, 0x14, 0x9c, 0x8b, 0xe3, ++ 0x30, 0xc2, 0xf7, 0xea, 0x0d, 0xb8, 0xc5, 0xcc, 0xee, 0xad, 0x01, 0x9b, ++ 0x1c, 0xa6, 0xec, 0x28, 0x17, 0x79, 0x47, 0xf9, 0x2c, 0x1f, 0xf9, 0x6b, ++ 0x96, 0xea, 0x28, 0x42, 0xff, 0xa9, 0xb1, 0xd2, 0xc1, 0x10, 0xaf, 0xd6, ++ 0xb7, 0xc7, 0xfc, 0xb8, 0x07, 0xe5, 0xc5, 0x6b, 0xfc, 0x7e, 0x2a, 0x77, ++ 0xbc, 0xfe, 0x40, 0x35, 0x7c, 0xef, 0x7e, 0x29, 0xd9, 0xd3, 0xac, 0x47, ++ 0xe8, 0xff, 0x14, 0xf8, 0xd1, 0xa8, 0x1f, 0x7e, 0x74, 0xc1, 0xc3, 0x5a, ++ 0xcd, 0x51, 0x71, 0x2d, 0xa0, 0x67, 0x1e, 0xed, 0x23, 0xbb, 0xa9, 0xbc, ++ 0x13, 0xe8, 0x8a, 0xf0, 0x7e, 0xf0, 0xab, 0xf3, 0x68, 0x1f, 0xb9, 0x80, ++ 0xde, 0xff, 0x12, 0xfc, 0x6a, 0x84, 0xbb, 0xc0, 0xaf, 0xc6, 0xe7, 0x6f, ++ 0xc0, 0xaf, 0xc6, 0xf7, 0x07, 0xc1, 0xaf, 0x46, 0xd8, 0x37, 0xbd, 0x72, ++ 0x2c, 0xc6, 0xc3, 0xde, 0x84, 0x7a, 0xc8, 0x17, 0x71, 0x45, 0x07, 0x6c, ++ 0xa3, 0x30, 0x9e, 0xed, 0x50, 0xe9, 0x7c, 0x4d, 0x2c, 0x3f, 0x6e, 0x69, ++ 0x78, 0xd7, 0x71, 0x1d, 0xc8, 0xaa, 0xa9, 0x1d, 0xd9, 0x73, 0x53, 0x91, ++ 0x1f, 0x6e, 0x53, 0xe9, 0x1c, 0xf2, 0xd8, 0xdf, 0x64, 0xcf, 0x45, 0xbf, ++ 0x35, 0x3a, 0xae, 0x16, 0x1d, 0x57, 0x8c, 0xc4, 0xd5, 0x7a, 0x15, 0x19, ++ 0x57, 0xb3, 0x02, 0x7d, 0x5e, 0x98, 0xac, 0xf3, 0xbc, 0x45, 0x19, 0x5f, ++ 0x0b, 0xf0, 0xf8, 0xda, 0x57, 0xb7, 0xe3, 0x93, 0xed, 0x50, 0xbc, 0x72, ++ 0x40, 0x3b, 0xfd, 0x71, 0x4b, 0x5b, 0xf0, 0xbd, 0x02, 0x3c, 0x9a, 0xa5, ++ 0xb0, 0x04, 0x78, 0xff, 0xf1, 0x1d, 0xff, 0xf9, 0x04, 0xea, 0x99, 0xd4, ++ 0x8c, 0xc0, 0x54, 0x9c, 0x77, 0xdd, 0xa4, 0x77, 0x2c, 0xdc, 0xee, 0xe6, ++ 0xe7, 0xa6, 0xb2, 0xc4, 0x3a, 0xda, 0x61, 0xe7, 0x79, 0xa3, 0x59, 0x22, ++ 0xdf, 0x27, 0x36, 0x5e, 0x39, 0x7d, 0xe6, 0xdb, 0xb7, 0xa6, 0x02, 0xca, ++ 0xe6, 0x97, 0x8f, 0x59, 0x86, 0xfe, 0xff, 0xf4, 0x5b, 0xde, 0x2e, 0xce, ++ 0x01, 0xf8, 0x87, 0xe5, 0x3f, 0x58, 0x86, 0x79, 0xbd, 0xd3, 0x7f, 0xf6, ++ 0xf6, 0x33, 0x99, 0x80, 0xa7, 0x7f, 0xfe, 0x66, 0x11, 0x2f, 0x7f, 0xf0, ++ 0xed, 0xb3, 0x59, 0x1e, 0xcc, 0xbb, 0xf8, 0xde, 0x32, 0xcc, 0xf3, 0x75, ++ 0x25, 0x73, 0xfd, 0xb6, 0x43, 0x9c, 0x3f, 0x92, 0xf8, 0xbd, 0x5e, 0xac, ++ 0xf7, 0xfa, 0x8d, 0x8f, 0x92, 0x1e, 0x07, 0x3b, 0x83, 0x21, 0x3e, 0x5a, ++ 0xd2, 0xfc, 0xa4, 0x5f, 0x3f, 0x49, 0xe9, 0x73, 0xad, 0x80, 0xfa, 0xf5, ++ 0xa9, 0x7d, 0x69, 0x2b, 0x2f, 0xa2, 0x0f, 0xea, 0x37, 0x3e, 0x41, 0xdf, ++ 0xef, 0x50, 0x3c, 0xa7, 0x42, 0x38, 0xee, 0x29, 0x36, 0x9e, 0x5f, 0x2a, ++ 0xf4, 0xcd, 0x19, 0xc1, 0xbb, 0x52, 0xdf, 0x34, 0xda, 0x39, 0x28, 0xc7, ++ 0xc3, 0x58, 0x3a, 0xbd, 0x7f, 0x50, 0xc4, 0x81, 0x98, 0x2f, 0x93, 0xbe, ++ 0x4b, 0xb6, 0x73, 0xf8, 0x98, 0xab, 0x9c, 0xf4, 0xd2, 0xfd, 0x55, 0xfa, ++ 0xab, 0x3a, 0xdf, 0x9f, 0x24, 0xff, 0xf8, 0x98, 0xeb, 0xb2, 0xef, 0x63, ++ 0xfe, 0x5c, 0xcb, 0x1c, 0x8d, 0xf6, 0x0d, 0x1f, 0x74, 0x78, 0xed, 0xa8, ++ 0xb7, 0x36, 0x8b, 0x79, 0x41, 0xfb, 0x41, 0xca, 0x53, 0x99, 0x65, 0xa3, ++ 0xfd, 0x1c, 0x96, 0xb2, 0x98, 0xd6, 0x75, 0x92, 0xec, 0x27, 0xa5, 0x86, ++ 0xf2, 0x0e, 0x92, 0xc4, 0x78, 0x8e, 0x97, 0xc7, 0x85, 0x31, 0x3e, 0xd0, ++ 0x52, 0x6d, 0xdb, 0x8d, 0x72, 0xf4, 0x07, 0x8e, 0x91, 0xd4, 0x5e, 0x4b, ++ 0x99, 0x25, 0x88, 0x71, 0x19, 0x09, 0x6f, 0x2a, 0x87, 0xf1, 0x00, 0x3e, ++ 0x13, 0x5d, 0x49, 0xb9, 0xd4, 0x9f, 0x90, 0x73, 0x32, 0x6e, 0xcc, 0x70, ++ 0xf7, 0x0c, 0xda, 0xad, 0x12, 0xd3, 0xae, 0x92, 0xf9, 0x0c, 0x36, 0xf3, ++ 0xe9, 0x68, 0xfb, 0xda, 0xc1, 0x7a, 0x88, 0x7f, 0x3c, 0x26, 0x5d, 0x45, ++ 0xfb, 0x30, 0x79, 0xaa, 0x4e, 0xf2, 0xab, 0x98, 0x79, 0x16, 0xe3, 0x7b, ++ 0x8b, 0xd2, 0x10, 0x44, 0x66, 0xc4, 0x79, 0x98, 0xa2, 0xe7, 0xa1, 0x57, ++ 0x1b, 0xe7, 0xa1, 0xcf, 0x32, 0xcc, 0x43, 0x69, 0xb4, 0x85, 0xd1, 0x2e, ++ 0x6c, 0x99, 0x05, 0xf3, 0x80, 0xfa, 0xc7, 0x9d, 0xa5, 0x34, 0xde, 0x58, ++ 0xba, 0xc9, 0xf9, 0x7c, 0xb7, 0x9c, 0xf3, 0x73, 0xec, 0x3c, 0x99, 0xd8, ++ 0x37, 0x92, 0xe7, 0x04, 0xaa, 0xdc, 0x15, 0x07, 0x70, 0x5c, 0xb3, 0x4c, ++ 0xbe, 0x56, 0x1c, 0xd7, 0xf3, 0xff, 0xa8, 0x49, 0xc1, 0x0b, 0x23, 0x67, ++ 0xb3, 0x06, 0x0d, 0xdf, 0x8f, 0x8a, 0xe4, 0xed, 0xb4, 0x7e, 0x9d, 0xbc, ++ 0x88, 0xe9, 0xef, 0x2a, 0x7c, 0x9f, 0xeb, 0x16, 0x0b, 0xcd, 0x6f, 0xe7, ++ 0x34, 0x8e, 0x87, 0x87, 0x2d, 0xa1, 0x5c, 0x3a, 0xc0, 0xa1, 0x85, 0x32, ++ 0x70, 0x7f, 0x77, 0x28, 0x3e, 0xee, 0x2a, 0xe7, 0x72, 0x3f, 0xc2, 0xc7, ++ 0x3e, 0x86, 0xeb, 0xab, 0x25, 0xc9, 0xc7, 0xf9, 0xd8, 0xdd, 0xe7, 0x6a, ++ 0x46, 0x3e, 0x4e, 0xec, 0x4b, 0xdb, 0x44, 0xf3, 0x0a, 0x0f, 0x4a, 0x9f, ++ 0x58, 0x7e, 0x8e, 0xa5, 0xd7, 0x31, 0xbc, 0x13, 0x81, 0xf4, 0x62, 0x50, ++ 0x45, 0xfc, 0x7f, 0x15, 0x7d, 0x25, 0x5d, 0x63, 0xf7, 0xbd, 0x24, 0xbf, ++ 0x24, 0x4f, 0x75, 0x4b, 0x7a, 0xa7, 0xd3, 0x3c, 0xc3, 0x39, 0x86, 0xfd, ++ 0x40, 0x68, 0x41, 0x1f, 0x6c, 0x1f, 0x7c, 0x33, 0xb4, 0xa7, 0x47, 0xed, ++ 0x9f, 0x59, 0xd2, 0xfd, 0x64, 0x67, 0x9b, 0x53, 0x3c, 0x05, 0x18, 0x6f, ++ 0x6e, 0xf9, 0x52, 0x1d, 0xf4, 0x7c, 0xe4, 0x59, 0x81, 0xa7, 0x66, 0x57, ++ 0x1c, 0xd9, 0xdf, 0x2d, 0x2e, 0x6e, 0x7f, 0x1f, 0x71, 0x5d, 0x69, 0xf0, ++ 0x9b, 0xaa, 0xc1, 0x8f, 0xc2, 0xfd, 0x62, 0x35, 0x99, 0x75, 0xe2, 0xba, ++ 0x52, 0x13, 0x96, 0x52, 0x1c, 0x4d, 0x1d, 0x86, 0x96, 0x17, 0xb1, 0x85, ++ 0xd1, 0xae, 0x4d, 0x98, 0xcb, 0xed, 0x5a, 0xb7, 0xf7, 0xa2, 0xe7, 0xa4, ++ 0xb4, 0x5e, 0xd5, 0x70, 0x7f, 0xda, 0x00, 0xbb, 0x36, 0xe9, 0x4a, 0x6e, ++ 0xd7, 0xba, 0x2c, 0x64, 0xd7, 0xee, 0x70, 0x5a, 0x16, 0xef, 0x1a, 0x44, ++ 0xee, 0xbc, 0x54, 0xce, 0xfd, 0x9f, 0x23, 0x38, 0x8f, 0x41, 0xfc, 0x46, ++ 0xf0, 0x17, 0x29, 0x9e, 0x29, 0xfd, 0x45, 0x8b, 0x3b, 0x40, 0x7e, 0x9f, ++ 0x9c, 0xe7, 0x4b, 0x82, 0xdf, 0x65, 0x7d, 0xab, 0xbb, 0x81, 0x61, 0x7c, ++ 0x4d, 0xb5, 0x78, 0x74, 0xb4, 0x63, 0x55, 0x71, 0x8e, 0x15, 0xf3, 0x97, ++ 0x0b, 0xa2, 0xec, 0x02, 0xd9, 0xff, 0x0b, 0xe5, 0xfc, 0x1c, 0xfe, 0x33, ++ 0xd3, 0x39, 0xfd, 0x64, 0x1e, 0xfb, 0xf4, 0x57, 0x95, 0x86, 0xc1, 0xf0, ++ 0xae, 0x4d, 0x95, 0x76, 0xc9, 0xe0, 0x7c, 0xf7, 0x2f, 0xf0, 0x0d, 0xc9, ++ 0x09, 0xaf, 0xc3, 0xe2, 0x43, 0xbb, 0xc3, 0xeb, 0x48, 0xa7, 0x7c, 0xef, ++ 0xa1, 0xbe, 0xc3, 0xad, 0xea, 0x53, 0x49, 0x11, 0x39, 0xe3, 0xf9, 0xb2, ++ 0x54, 0x25, 0x7d, 0xa4, 0x79, 0x28, 0x7f, 0xbf, 0xd3, 0xdc, 0xfb, 0xcc, ++ 0xab, 0xe8, 0x0f, 0x3e, 0xef, 0x20, 0xbd, 0x23, 0xed, 0x71, 0x30, 0x56, ++ 0x29, 0xff, 0x18, 0xfc, 0x5e, 0x9f, 0x07, 0x1a, 0xd9, 0xf7, 0x4f, 0x58, ++ 0x89, 0xa6, 0x88, 0xbf, 0x0b, 0xfe, 0x57, 0xf6, 0xd4, 0xa8, 0xfd, 0xc7, ++ 0xa3, 0x8d, 0x27, 0x69, 0xff, 0x27, 0xd6, 0x4e, 0x8d, 0x8d, 0x27, 0xf4, ++ 0xaf, 0x73, 0xd7, 0x13, 0xb9, 0x7c, 0x1c, 0xa1, 0x0c, 0x5c, 0xb7, 0x4a, ++ 0x63, 0xd9, 0x30, 0xe4, 0xa7, 0xd8, 0x75, 0x2e, 0x9f, 0xd9, 0xe9, 0xc5, ++ 0x97, 0xad, 0x82, 0x71, 0x65, 0x67, 0x14, 0xd1, 0x53, 0xbe, 0x7f, 0x84, ++ 0xa9, 0x73, 0x06, 0xbb, 0x1f, 0xad, 0xa4, 0x1f, 0xff, 0x5c, 0x3f, 0x8f, ++ 0x85, 0xce, 0x12, 0x54, 0xd2, 0xcb, 0x25, 0x53, 0x81, 0x8e, 0x1f, 0xdf, ++ 0xf6, 0x7a, 0x9a, 0x47, 0xc7, 0x73, 0xb4, 0x9f, 0x92, 0x7e, 0x3e, 0xd3, ++ 0x50, 0x96, 0xb0, 0x05, 0xf9, 0xbc, 0x20, 0x89, 0xe4, 0x6a, 0x96, 0x38, ++ 0x1f, 0x26, 0xc7, 0x93, 0x75, 0xf3, 0x91, 0xc4, 0x24, 0x07, 0xe6, 0xe9, ++ 0xf5, 0x8d, 0xc5, 0xfc, 0xb6, 0x50, 0x93, 0xff, 0xb2, 0x6a, 0x33, 0xf9, ++ 0x17, 0xbe, 0xc1, 0xc6, 0x1b, 0x98, 0xca, 0xf5, 0x11, 0x0b, 0x8f, 0x60, ++ 0xd1, 0xf7, 0xff, 0xe8, 0x29, 0x3d, 0x57, 0x8c, 0x01, 0x7c, 0xeb, 0x0e, ++ 0x93, 0x47, 0xa7, 0x75, 0xe5, 0x26, 0xbd, 0x27, 0xd7, 0x7f, 0xa5, 0x96, ++ 0x58, 0xed, 0x06, 0xfe, 0xce, 0x6e, 0x62, 0x1e, 0x87, 0x8e, 0x57, 0x23, ++ 0xbb, 0x29, 0x1e, 0x96, 0x7d, 0x41, 0x25, 0x3e, 0xcb, 0x3e, 0xc6, 0xef, ++ 0x6f, 0x1e, 0x91, 0xd2, 0xa7, 0xe0, 0xbd, 0x5b, 0xfd, 0xfd, 0x88, 0x3c, ++ 0x26, 0xb9, 0xaf, 0xf2, 0x59, 0x43, 0x35, 0xad, 0xcb, 0xec, 0x61, 0x8c, ++ 0xf5, 0x50, 0xdc, 0xd2, 0x4f, 0xfb, 0x0f, 0x9f, 0xa5, 0x84, 0x17, 0xe0, ++ 0xba, 0xfe, 0xec, 0x21, 0x3e, 0xa2, 0xec, 0x47, 0x8d, 0xe5, 0xa0, 0x6b, ++ 0x29, 0x5e, 0xbd, 0xfa, 0xb6, 0xb8, 0x90, 0x0e, 0x4d, 0x8f, 0xb8, 0x0b, ++ 0xc6, 0x87, 0xe3, 0xf9, 0xa9, 0xc2, 0xb2, 0x72, 0x71, 0x1c, 0xc7, 0x72, ++ 0xb7, 0x60, 0xbc, 0xe7, 0x57, 0xf1, 0x14, 0xef, 0x51, 0x3b, 0xf2, 0x28, ++ 0x5e, 0xb3, 0x26, 0x23, 0x30, 0x07, 0xf9, 0xe1, 0xe3, 0x90, 0xfe, 0x6d, ++ 0xd3, 0x28, 0x31, 0x59, 0xa8, 0x57, 0xf7, 0x9d, 0x38, 0xba, 0x2f, 0x60, ++ 0x87, 0xd2, 0x73, 0x05, 0xe5, 0x4b, 0xdc, 0x6e, 0x62, 0x8f, 0x0f, 0x12, ++ 0x8f, 0x5a, 0x33, 0x95, 0xfb, 0x89, 0xb5, 0x82, 0xcf, 0xb3, 0xd3, 0x4b, ++ 0x39, 0xbd, 0xd3, 0x4b, 0x2e, 0x5b, 0x95, 0x7c, 0xe9, 0xeb, 0xe8, 0x87, ++ 0x42, 0x5e, 0x6f, 0x4d, 0x08, 0xd1, 0xfe, 0x9c, 0xcc, 0xfb, 0xba, 0xd7, ++ 0x3c, 0x38, 0x5f, 0xbd, 0x3e, 0xd5, 0x24, 0xe8, 0x94, 0x63, 0xc8, 0x03, ++ 0xb3, 0xa1, 0xf7, 0x03, 0xfc, 0xa2, 0x2a, 0xc2, 0xde, 0xdb, 0xf3, 0xd4, ++ 0x53, 0x4f, 0xa5, 0x31, 0x7e, 0x84, 0x70, 0x24, 0xdf, 0x87, 0x8c, 0xde, ++ 0x2f, 0x8e, 0xcb, 0x0b, 0x51, 0x61, 0x9c, 0xc7, 0x47, 0x72, 0x47, 0x71, ++ 0xfb, 0xb8, 0x7c, 0x75, 0x37, 0xa4, 0x07, 0x81, 0xbf, 0xb7, 0x7c, 0xa1, ++ 0x0e, 0xda, 0xff, 0xa3, 0x82, 0x7e, 0xcd, 0xd9, 0xdf, 0x4e, 0xc7, 0xfa, ++ 0xd5, 0xba, 0x87, 0x9e, 0x47, 0xb2, 0x4b, 0x4f, 0xac, 0x00, 0xfc, 0x39, ++ 0x1c, 0x16, 0x66, 0x8d, 0x92, 0xbf, 0x92, 0x4f, 0x62, 0xf5, 0x7b, 0xa3, ++ 0x73, 0xe4, 0x45, 0xfd, 0x77, 0x0b, 0xc8, 0x61, 0xfd, 0x22, 0xf1, 0x05, ++ 0x8b, 0xc8, 0xef, 0xda, 0x7c, 0x74, 0x8a, 0x0d, 0xef, 0x07, 0xdd, 0xec, ++ 0xf0, 0xf6, 0xa0, 0xdd, 0xb5, 0xd9, 0x91, 0xe2, 0xa5, 0xf8, 0xbb, 0x03, ++ 0xe4, 0x45, 0x54, 0x3c, 0xca, 0xe1, 0x78, 0x81, 0xf8, 0xd0, 0xe1, 0xe1, ++ 0x71, 0x3a, 0x07, 0xca, 0x5d, 0x8c, 0x47, 0xe1, 0xfc, 0x0b, 0x71, 0xfc, ++ 0x2f, 0xd0, 0xfc, 0x65, 0xbd, 0x26, 0x21, 0x7f, 0x1c, 0x9e, 0x30, 0xed, ++ 0x93, 0xda, 0x3d, 0xdb, 0xa8, 0x9e, 0x4d, 0xf3, 0xd3, 0xf9, 0x38, 0x5b, ++ 0x0a, 0xa3, 0xbc, 0x05, 0x9b, 0x9b, 0xdf, 0x2b, 0x1a, 0x97, 0x67, 0x62, ++ 0xb6, 0x41, 0xe4, 0xf0, 0xc6, 0xa9, 0xdc, 0xff, 0xdb, 0x5c, 0xe8, 0xed, ++ 0xa9, 0xa2, 0xf1, 0x69, 0x78, 0x6c, 0x8a, 0x6d, 0x4e, 0xf7, 0xa6, 0x93, ++ 0x1e, 0x44, 0x3c, 0xc3, 0xf7, 0xc7, 0x9c, 0xa5, 0x09, 0xd1, 0xf8, 0x79, ++ 0x56, 0xc8, 0x83, 0x96, 0x23, 0x7c, 0x7e, 0xfe, 0x8d, 0x19, 0xee, 0xea, ++ 0x62, 0xf4, 0x67, 0xfd, 0x7b, 0x51, 0x1e, 0x6c, 0x76, 0xac, 0xb4, 0xe1, ++ 0x7d, 0x5d, 0xaa, 0xb3, 0xe4, 0xa2, 0xed, 0x1c, 0x12, 0xf4, 0x8a, 0xb4, ++ 0xb3, 0x3d, 0xad, 0x3a, 0x99, 0xda, 0x79, 0x16, 0xf9, 0x5f, 0x75, 0x7a, ++ 0xdd, 0xd8, 0x8e, 0x59, 0xdc, 0x8f, 0x3a, 0x40, 0x8f, 0x89, 0x71, 0x7c, ++ 0xd3, 0x38, 0x1a, 0x60, 0x90, 0xf2, 0x74, 0x08, 0x2f, 0x44, 0x98, 0xb0, ++ 0x81, 0x2e, 0xb1, 0x4f, 0x07, 0xc6, 0xc3, 0x92, 0x07, 0xfb, 0x8e, 0xcb, ++ 0xc5, 0x5c, 0xe1, 0xb7, 0x80, 0x5c, 0xfc, 0x13, 0x8e, 0xbf, 0xae, 0xf0, ++ 0x9d, 0x17, 0xf8, 0x1a, 0xe3, 0xfe, 0x4a, 0xd2, 0x15, 0x3c, 0x0f, 0xe8, ++ 0x0c, 0x70, 0x36, 0xde, 0x4b, 0x15, 0x9b, 0x67, 0x11, 0x6b, 0xbf, 0x48, ++ 0xbd, 0x23, 0xf5, 0x10, 0xb4, 0xa3, 0x62, 0x3b, 0x0f, 0xa3, 0xfd, 0x32, ++ 0x26, 0xb2, 0x8e, 0x64, 0x1c, 0x27, 0xb3, 0xd6, 0xcf, 0xd7, 0x4b, 0x8a, ++ 0x9f, 0xf8, 0x05, 0xec, 0x19, 0x1d, 0xd7, 0x8b, 0x2a, 0xf2, 0xf8, 0x06, ++ 0xe8, 0x81, 0x0a, 0x8e, 0x3f, 0xc5, 0x55, 0xa6, 0xa3, 0xbe, 0xa8, 0x3e, ++ 0xdf, 0x9b, 0x89, 0xdf, 0x1d, 0x72, 0x9e, 0xca, 0xe4, 0xf6, 0xab, 0x71, ++ 0x7f, 0xf9, 0xf8, 0x3f, 0x9e, 0xb0, 0x63, 0xf9, 0x67, 0xb5, 0x55, 0x17, ++ 0xb5, 0x53, 0xe4, 0x7e, 0xf2, 0x50, 0xfb, 0xc8, 0xae, 0xef, 0x7e, 0xb8, ++ 0x21, 0xda, 0x4e, 0x19, 0x6a, 0x5f, 0xf9, 0xab, 0xf6, 0x93, 0x8f, 0xba, ++ 0x2c, 0x14, 0xb7, 0xdb, 0xa9, 0x18, 0xcf, 0xbf, 0x0f, 0xab, 0xe0, 0xf2, ++ 0x2f, 0x49, 0xcc, 0x6f, 0xd7, 0x94, 0x80, 0xbd, 0x22, 0x15, 0xeb, 0xf9, ++ 0x3d, 0xfc, 0x40, 0x33, 0x8f, 0xcb, 0xbc, 0x32, 0x3d, 0xe0, 0xa8, 0xc0, ++ 0x38, 0x5a, 0xbb, 0x85, 0x05, 0x91, 0xef, 0xfe, 0x51, 0x9a, 0x1e, 0x88, ++ 0x6a, 0xe7, 0x52, 0xf1, 0x2c, 0xe3, 0xef, 0xc3, 0x85, 0x1d, 0x35, 0xdc, ++ 0xf1, 0x84, 0x82, 0xeb, 0x74, 0x78, 0x6d, 0x48, 0xc1, 0xf8, 0x79, 0x66, ++ 0x6d, 0xa7, 0xe2, 0xbb, 0x48, 0xbd, 0xff, 0x12, 0xeb, 0x59, 0xd6, 0x37, ++ 0x8b, 0xf6, 0x67, 0x68, 0x7d, 0x2a, 0xea, 0xab, 0x19, 0x6e, 0xae, 0x17, ++ 0x33, 0xcf, 0x69, 0xac, 0x20, 0x4a, 0xee, 0xf4, 0x4e, 0xe5, 0x76, 0x94, ++ 0x59, 0xd8, 0xed, 0xae, 0xa3, 0x4f, 0xda, 0xb1, 0xbd, 0xa3, 0x26, 0x7f, ++ 0x7b, 0x3e, 0xea, 0x07, 0x97, 0x49, 0x7f, 0x3c, 0x6a, 0xbd, 0x9b, 0x6f, ++ 0xf6, 0xda, 0xaa, 0xa2, 0xe6, 0xd7, 0x82, 0xfb, 0x42, 0x83, 0xd0, 0xd1, ++ 0x57, 0x21, 0xf5, 0x60, 0x98, 0xf4, 0xb7, 0xd4, 0xb7, 0x66, 0xa9, 0x27, ++ 0x52, 0x34, 0x83, 0x9e, 0xa8, 0x8f, 0xe7, 0x7c, 0x2c, 0xed, 0x9d, 0xfa, ++ 0x72, 0xee, 0x07, 0xd5, 0xc7, 0x73, 0x7f, 0xfc, 0xc5, 0xf4, 0xc0, 0x14, ++ 0xc4, 0xf3, 0x27, 0xe5, 0x1f, 0xce, 0x1f, 0xa5, 0xe3, 0x39, 0xd8, 0xb0, ++ 0x39, 0x25, 0xf7, 0xab, 0xf7, 0x47, 0xfa, 0xed, 0x1b, 0x53, 0x68, 0x85, ++ 0xf4, 0x63, 0x90, 0xff, 0x3b, 0xcd, 0x7a, 0x57, 0x2f, 0xd9, 0x59, 0x2e, ++ 0x3a, 0x3f, 0x21, 0xed, 0xaa, 0xa2, 0x9f, 0x29, 0xa3, 0xb0, 0x9e, 0x47, ++ 0xf1, 0x91, 0xfd, 0x37, 0x09, 0x6f, 0x1a, 0x51, 0x71, 0xab, 0x96, 0xdb, ++ 0x83, 0x60, 0x67, 0x5d, 0x59, 0x91, 0xca, 0xaf, 0xe4, 0x8f, 0xe6, 0x03, ++ 0x16, 0x73, 0xaf, 0xe0, 0x50, 0xf3, 0xf4, 0xe2, 0x7d, 0xa6, 0xa9, 0x18, ++ 0x0f, 0xec, 0xa1, 0x78, 0xed, 0x7d, 0xe7, 0x95, 0x41, 0xcf, 0x41, 0xdc, ++ 0x57, 0x21, 0xed, 0xa5, 0xfe, 0xfd, 0x41, 0x43, 0xdc, 0x35, 0x53, 0xe8, ++ 0xbd, 0x4c, 0x51, 0xae, 0x63, 0xdc, 0x35, 0x17, 0xf7, 0xbb, 0x8c, 0x71, ++ 0xd1, 0xe2, 0x6e, 0x23, 0x3c, 0xa9, 0xc7, 0x08, 0x4f, 0x3e, 0x11, 0x13, ++ 0x67, 0x0d, 0xfa, 0xfe, 0x03, 0xcf, 0xf9, 0x61, 0x3e, 0x01, 0x36, 0xba, ++ 0x03, 0xd6, 0x1f, 0xca, 0x8f, 0x55, 0x62, 0x1f, 0x34, 0x2b, 0x18, 0xaa, ++ 0xc4, 0xf3, 0xe1, 0xd9, 0xac, 0x93, 0xf6, 0x1b, 0x33, 0x6b, 0x93, 0x0c, ++ 0xf8, 0x9e, 0xae, 0x8a, 0x3c, 0x0c, 0xbc, 0xde, 0x58, 0x8e, 0x13, 0x7e, ++ 0x32, 0xb5, 0x79, 0x1f, 0xe0, 0xf7, 0x9b, 0xfa, 0xe7, 0x15, 0x64, 0x86, ++ 0xbc, 0xfe, 0xea, 0x55, 0xdf, 0xc6, 0xab, 0x30, 0xd9, 0x36, 0x7e, 0xbe, ++ 0xcf, 0x06, 0x9d, 0x23, 0xbe, 0xd6, 0x5c, 0xb1, 0x70, 0x16, 0xd2, 0x7b, ++ 0x40, 0xfc, 0xb6, 0xc1, 0x18, 0xb7, 0xcd, 0x8c, 0x2e, 0x07, 0x3c, 0xac, ++ 0xde, 0x61, 0x3c, 0x27, 0xe8, 0xf7, 0x15, 0x91, 0x7f, 0xb0, 0xe8, 0x5b, ++ 0xc6, 0xf3, 0x82, 0x32, 0x1f, 0x1d, 0xe7, 0x9b, 0xe9, 0x1d, 0xd8, 0xff, ++ 0x57, 0xf7, 0x0b, 0xff, 0x92, 0x06, 0xf6, 0x2f, 0xdb, 0x7d, 0x18, 0xe4, ++ 0x12, 0xc9, 0x5d, 0x71, 0x8f, 0x70, 0x36, 0x16, 0x61, 0x3b, 0x5a, 0x58, ++ 0xc1, 0x7d, 0xef, 0xe1, 0x0d, 0x8c, 0xee, 0x13, 0xce, 0xbc, 0x8d, 0xf9, ++ 0x06, 0xdb, 0x3f, 0x38, 0x20, 0xf0, 0x15, 0x8b, 0x67, 0x16, 0x9c, 0x41, ++ 0xf8, 0x9b, 0x29, 0xde, 0x0d, 0x77, 0xf0, 0x3c, 0xd5, 0xe1, 0xb7, 0x99, ++ 0xc8, 0x4e, 0x1c, 0x0e, 0xf2, 0x82, 0xfe, 0xce, 0xc0, 0x3a, 0xf0, 0x35, ++ 0x00, 0xce, 0x5c, 0xa7, 0x93, 0x9d, 0x79, 0x75, 0xad, 0x89, 0xa1, 0xde, ++ 0x60, 0xe7, 0x9b, 0x0c, 0xdf, 0xc3, 0x70, 0x29, 0xbe, 0x2a, 0xe9, 0xfe, ++ 0xb0, 0x83, 0xe7, 0xe1, 0x66, 0xd7, 0xb1, 0x90, 0x09, 0xe7, 0xd3, 0x70, ++ 0x19, 0xad, 0x33, 0x1a, 0xd7, 0xc8, 0x08, 0x3f, 0x00, 0xbe, 0x0c, 0xf7, ++ 0x09, 0x5c, 0x5d, 0x66, 0x3c, 0xa7, 0x9b, 0x1d, 0x73, 0x3e, 0x57, 0xf2, ++ 0x41, 0x66, 0xcc, 0xfb, 0x6b, 0x2a, 0xdc, 0x86, 0x75, 0x01, 0xfa, 0xef, ++ 0x40, 0x05, 0xc9, 0x0f, 0xae, 0x17, 0x47, 0xa3, 0x5e, 0x84, 0x21, 0x7d, ++ 0x3c, 0xe5, 0xc4, 0x13, 0x98, 0x6f, 0x37, 0x7d, 0x13, 0xe3, 0xf7, 0xd9, ++ 0x24, 0xc6, 0xf1, 0xfb, 0x6c, 0x22, 0xfb, 0x13, 0xea, 0x05, 0xe0, 0xd7, ++ 0xa3, 0xb6, 0x99, 0x05, 0x68, 0xc7, 0x6c, 0x75, 0xc7, 0x99, 0x30, 0x0f, ++ 0xe2, 0x50, 0x62, 0xef, 0x4f, 0x58, 0x22, 0xf8, 0x8d, 0x15, 0x2c, 0x58, ++ 0x9d, 0x85, 0xf7, 0x1c, 0xf6, 0x8d, 0x53, 0x00, 0x7e, 0xbd, 0xa2, 0x7e, ++ 0x67, 0xfb, 0x34, 0x28, 0xb7, 0xf7, 0x3d, 0x8d, 0xc1, 0x65, 0x87, 0xe3, ++ 0xdb, 0x37, 0xcc, 0xc9, 0x8e, 0xc0, 0x2e, 0xd7, 0x3d, 0x04, 0xb3, 0x32, ++ 0xa6, 0xe3, 0x7d, 0x40, 0x98, 0x73, 0x8a, 0xeb, 0x2e, 0xce, 0x7d, 0xe5, ++ 0x1e, 0xbc, 0xe7, 0x3a, 0xae, 0xd0, 0x41, 0xc1, 0xca, 0x38, 0x66, 0xbc, ++ 0x77, 0xa7, 0xb5, 0x5c, 0xbf, 0x17, 0xf3, 0x48, 0x5a, 0x47, 0x9b, 0xc4, ++ 0xf9, 0xe8, 0xa8, 0x72, 0x98, 0xc7, 0x8c, 0x69, 0x6e, 0x99, 0xff, 0x46, ++ 0xf9, 0x78, 0x6c, 0x0e, 0xcf, 0x0b, 0x88, 0x6e, 0x1f, 0xf3, 0xb2, 0x87, ++ 0x6c, 0xff, 0x4a, 0x68, 0xbf, 0xe4, 0x6b, 0xb4, 0x6f, 0xe3, 0xe3, 0x4f, ++ 0xc3, 0x57, 0xa0, 0x7f, 0xd2, 0x70, 0xfc, 0x18, 0x17, 0xc7, 0xf6, 0x91, ++ 0xbe, 0x18, 0x44, 0x8a, 0xee, 0x5f, 0xb4, 0xa7, 0xb1, 0xe0, 0x2e, 0xdc, ++ 0xcf, 0x81, 0xfe, 0x1c, 0x0a, 0xef, 0xcf, 0x8d, 0x79, 0x2a, 0x69, 0xcc, ++ 0x98, 0x97, 0xd0, 0xdf, 0x9f, 0x1b, 0xfa, 0x1b, 0xff, 0xff, 0x60, 0x3e, ++ 0x8b, 0x07, 0xd2, 0xc3, 0x7c, 0x31, 0x7a, 0x2c, 0xfd, 0x7a, 0xf4, 0x68, ++ 0x35, 0xf9, 0x68, 0xbc, 0xc1, 0x09, 0x0e, 0xf2, 0x8f, 0xf0, 0xfe, 0x2a, ++ 0xbc, 0xa7, 0xce, 0x2e, 0xfa, 0xb3, 0x8b, 0xfb, 0xba, 0x10, 0xaf, 0xad, ++ 0xa5, 0x11, 0xbc, 0x82, 0x7d, 0x48, 0xed, 0x42, 0xf5, 0xe6, 0x0b, 0x02, ++ 0xcf, 0x98, 0x77, 0x98, 0xe6, 0xb6, 0x10, 0x9e, 0x87, 0xc2, 0xdb, 0x51, ++ 0x37, 0xcf, 0x93, 0xba, 0xdb, 0x1d, 0x17, 0x6a, 0xce, 0xfd, 0xff, 0x40, ++ 0xaf, 0x74, 0x4e, 0xaf, 0xe8, 0xfe, 0xd0, 0xce, 0xbc, 0xe4, 0xfe, 0x96, ++ 0x42, 0x7f, 0x29, 0x97, 0xde, 0x1f, 0xe2, 0x17, 0xd7, 0x4f, 0x3f, 0x7e, ++ 0x81, 0x26, 0x9b, 0xd2, 0x2e, 0x1d, 0xbf, 0x30, 0xaa, 0xe0, 0xa5, 0xe0, ++ 0xf7, 0x28, 0xb4, 0x6b, 0x8a, 0xc2, 0x6b, 0x24, 0x1f, 0x69, 0xbb, 0x1b, ++ 0xfd, 0x05, 0xbb, 0xd9, 0x6f, 0xc3, 0xfc, 0xcc, 0xb9, 0xd3, 0x12, 0x69, ++ 0x7c, 0x85, 0x29, 0x0b, 0x6d, 0x94, 0x9f, 0x90, 0xba, 0x90, 0xf2, 0x8d, ++ 0xdb, 0x0a, 0x1d, 0xf4, 0xf7, 0x05, 0xda, 0xf2, 0xbe, 0x65, 0x33, 0x47, ++ 0xe9, 0xe9, 0xb6, 0xc2, 0x1a, 0x2a, 0x87, 0xfa, 0x94, 0x47, 0x55, 0x18, ++ 0x8e, 0xc3, 0xf0, 0x05, 0x1b, 0xcf, 0x7a, 0x28, 0x3e, 0x70, 0x77, 0x45, ++ 0x75, 0x3a, 0xfa, 0x8b, 0xc1, 0x06, 0x9e, 0x97, 0x25, 0xf3, 0x94, 0xa4, ++ 0x3e, 0x64, 0x62, 0x3f, 0x94, 0xe6, 0x05, 0x1f, 0x26, 0x4c, 0x3b, 0xd0, ++ 0x77, 0x14, 0xea, 0xdf, 0xdd, 0x50, 0x42, 0x79, 0x68, 0x09, 0x89, 0xff, ++ 0x4d, 0xf9, 0x57, 0x5b, 0x6b, 0x3d, 0x1e, 0x2c, 0xff, 0x89, 0x9d, 0xef, ++ 0x6b, 0xfe, 0x48, 0xec, 0x6b, 0x21, 0xa3, 0x52, 0x7c, 0x6d, 0x42, 0xf9, ++ 0xa3, 0xb8, 0xbf, 0xeb, 0x1d, 0xdd, 0xa8, 0xd0, 0x7e, 0xe6, 0xba, 0x8b, ++ 0xef, 0x67, 0x7a, 0x3f, 0xed, 0xa9, 0xc2, 0x3c, 0x2e, 0xb6, 0x82, 0xe7, ++ 0x69, 0xa5, 0xd7, 0x68, 0x31, 0xfa, 0xd0, 0xb8, 0x6e, 0xb7, 0x22, 0x5e, ++ 0x79, 0x3e, 0x55, 0x48, 0xe1, 0xf8, 0x35, 0xb4, 0xb7, 0x69, 0x5a, 0x2a, ++ 0xe1, 0xed, 0xee, 0xbc, 0xdd, 0x0c, 0xff, 0xde, 0xd0, 0x33, 0xd0, 0x96, ++ 0x6a, 0x5c, 0x5f, 0x26, 0xcc, 0x6b, 0x8a, 0x5d, 0x8f, 0x9a, 0xc5, 0x47, ++ 0xf7, 0x8b, 0xb1, 0x46, 0x13, 0x8d, 0x23, 0x13, 0x53, 0x05, 0x40, 0xc5, ++ 0x79, 0xc7, 0xcf, 0x4d, 0x5f, 0x01, 0xef, 0xb3, 0x6e, 0xd2, 0xe8, 0x1e, ++ 0xdf, 0x61, 0x85, 0x77, 0x51, 0x7e, 0x13, 0x58, 0xff, 0x64, 0x6f, 0x14, ++ 0x16, 0xbe, 0x5c, 0x85, 0xf0, 0x80, 0x79, 0xae, 0x32, 0xce, 0x23, 0x76, ++ 0x5e, 0xb1, 0xe3, 0x96, 0xf7, 0x1b, 0x4b, 0x7a, 0x79, 0x3f, 0xf5, 0xc4, ++ 0xa3, 0xdf, 0xe5, 0x1d, 0xbd, 0x90, 0xf2, 0xcf, 0xe8, 0x47, 0xae, 0x77, ++ 0x35, 0x66, 0x3e, 0x60, 0x27, 0xdb, 0x53, 0x4c, 0x74, 0x0f, 0x5c, 0x5c, ++ 0x5e, 0xd4, 0xbc, 0x98, 0xa1, 0x9e, 0xf0, 0xeb, 0xfe, 0x67, 0xe1, 0x06, ++ 0xd0, 0x55, 0xb4, 0x8e, 0x62, 0xf7, 0xc9, 0xfe, 0x0f, 0x3f, 0x2f, 0x64, ++ 0x65, 0x1e, 0x9b, 0x85, 0xbe, 0x93, 0xe7, 0x6b, 0xf8, 0xfe, 0xdb, 0x70, ++ 0x5c, 0x3b, 0x48, 0xf7, 0x1c, 0xc6, 0xf3, 0xc0, 0x63, 0xbf, 0x2f, 0xe5, ++ 0xdf, 0xb3, 0x74, 0xbe, 0x1f, 0x67, 0x8d, 0x63, 0x36, 0x3c, 0x5f, 0xa3, ++ 0xac, 0x8d, 0xa3, 0xb8, 0xa6, 0xd5, 0x0a, 0x30, 0x9e, 0xbf, 0x11, 0xf7, ++ 0x8c, 0x3d, 0x2c, 0xe2, 0x70, 0xcd, 0x0a, 0xd3, 0x32, 0xbc, 0xd1, 0xfd, ++ 0x85, 0x29, 0x8f, 0x5e, 0xb5, 0x5d, 0x95, 0x87, 0xfe, 0xc4, 0x51, 0xdb, ++ 0x22, 0x37, 0x9d, 0x6b, 0x13, 0xfe, 0x95, 0x39, 0xd1, 0x4f, 0x79, 0x8c, ++ 0xac, 0x20, 0xc9, 0xe0, 0xa7, 0x1e, 0x15, 0xe7, 0xd3, 0x1a, 0x6f, 0xce, ++ 0x1d, 0x86, 0x71, 0xbd, 0x04, 0x28, 0xeb, 0x41, 0x7f, 0x5b, 0xf3, 0xd8, ++ 0x90, 0xde, 0x32, 0x9e, 0xe2, 0x1a, 0xd5, 0x7b, 0x3d, 0xea, 0xf1, 0xdf, ++ 0x3e, 0xf7, 0xc9, 0x0d, 0x36, 0xd4, 0xdb, 0xe8, 0x1c, 0x97, 0x33, 0xd6, ++ 0x3d, 0xed, 0xc3, 0x9d, 0x78, 0xbf, 0xb0, 0x5c, 0x9f, 0xd6, 0x73, 0xfc, ++ 0x9e, 0x8e, 0x7e, 0x58, 0x6b, 0xa0, 0x3c, 0x11, 0xeb, 0xb9, 0x1c, 0xc3, ++ 0xfb, 0xb0, 0xf0, 0xcf, 0xfa, 0xfd, 0x96, 0x14, 0xad, 0x9a, 0xee, 0x9f, ++ 0x12, 0x7e, 0x43, 0x25, 0x73, 0xb7, 0xe2, 0x77, 0x95, 0x80, 0x1c, 0xc3, ++ 0xbd, 0x00, 0xe2, 0xde, 0x8f, 0x81, 0xed, 0x67, 0x19, 0xde, 0x87, 0xc1, ++ 0xef, 0x8e, 0xde, 0x27, 0x18, 0xba, 0xfd, 0x78, 0xc3, 0xfd, 0x02, 0x56, ++ 0xf0, 0x83, 0x06, 0x6f, 0x3f, 0x3f, 0xa6, 0x7d, 0xf7, 0xa0, 0xed, 0x47, ++ 0xda, 0x4d, 0x36, 0xb4, 0xdb, 0xa6, 0x71, 0xb9, 0x11, 0x4c, 0x89, 0x0b, ++ 0x0d, 0x16, 0xf7, 0xfb, 0x72, 0x5a, 0xd5, 0x7b, 0xb8, 0xa4, 0x87, 0xca, ++ 0x63, 0xfb, 0x62, 0x9a, 0xc8, 0xbf, 0xb7, 0x81, 0x44, 0xc3, 0x7d, 0x29, ++ 0xc1, 0x3f, 0x5b, 0xd2, 0x1b, 0x28, 0xaf, 0x4d, 0x8d, 0xe3, 0xfb, 0xa8, ++ 0x66, 0x10, 0x23, 0xc8, 0x4f, 0xc7, 0x9c, 0xb5, 0x3c, 0x1f, 0x23, 0xcb, ++ 0x98, 0xd7, 0x26, 0xef, 0x15, 0x69, 0xc3, 0xfb, 0x42, 0xa0, 0xbc, 0xca, ++ 0x61, 0xb4, 0xd7, 0x2b, 0x59, 0xdf, 0xb1, 0x89, 0x0a, 0xfa, 0xaf, 0x46, ++ 0x7b, 0x7d, 0x3a, 0x4a, 0x52, 0xdc, 0xaf, 0x62, 0xb1, 0x76, 0x7c, 0x03, ++ 0xed, 0x9b, 0x9a, 0xb3, 0x8c, 0x72, 0xa1, 0x43, 0xac, 0x17, 0x93, 0xb3, ++ 0xa4, 0x87, 0xf2, 0xe0, 0x52, 0x1d, 0x94, 0xe7, 0x30, 0x54, 0xdc, 0xe1, ++ 0xcd, 0x26, 0x46, 0xf9, 0x59, 0xe6, 0x78, 0x7f, 0x03, 0xea, 0xbc, 0xb4, ++ 0xe9, 0xda, 0x88, 0xb6, 0x32, 0x80, 0x13, 0x38, 0x9f, 0xe5, 0x4d, 0xcf, ++ 0x58, 0x8e, 0x71, 0xde, 0x37, 0x05, 0x3f, 0xb7, 0x81, 0x1c, 0xa0, 0xf3, ++ 0xa3, 0x8d, 0xc3, 0x76, 0xa9, 0x51, 0xed, 0xd6, 0x58, 0xc2, 0xa3, 0x51, ++ 0xaf, 0xd4, 0x98, 0xf8, 0xb9, 0x00, 0xfa, 0x81, 0xfe, 0xdf, 0x4c, 0x1d, ++ 0x4e, 0xf1, 0xd7, 0xd8, 0x7e, 0xe5, 0xbd, 0x31, 0x12, 0x5e, 0xd6, 0xa0, ++ 0x4c, 0xcb, 0x8b, 0x9a, 0xdf, 0x9b, 0x62, 0x7d, 0xf4, 0xf7, 0x77, 0x6b, ++ 0xe6, 0x2e, 0xb4, 0x6b, 0xfb, 0xfb, 0xb3, 0x86, 0x27, 0x51, 0x7f, 0xfd, ++ 0x79, 0x46, 0xa2, 0xbf, 0xb4, 0x6f, 0xd6, 0xdf, 0x5f, 0xc4, 0xfa, 0x96, ++ 0xfd, 0x2d, 0xfb, 0xb6, 0x71, 0x7e, 0xcb, 0x2c, 0x3d, 0x34, 0xbf, 0x65, ++ 0xe2, 0xbe, 0x52, 0xd9, 0xdf, 0x5f, 0x70, 0x7e, 0xb9, 0xdf, 0xa0, 0x3f, ++ 0x91, 0x1f, 0xd6, 0xdf, 0xdf, 0x77, 0x8c, 0xf3, 0x5b, 0x66, 0xed, 0xa1, ++ 0xf9, 0x2d, 0xeb, 0xf7, 0x2f, 0x45, 0x7f, 0x69, 0xdf, 0xac, 0x3f, 0x99, ++ 0xff, 0x60, 0xb5, 0x36, 0xd4, 0x22, 0x3f, 0x0d, 0x95, 0x07, 0x21, 0xf3, ++ 0x1f, 0x26, 0x77, 0x64, 0x1a, 0xf2, 0x1f, 0x58, 0x30, 0x73, 0x6e, 0x65, ++ 0x1e, 0x63, 0x0f, 0x28, 0x9c, 0x2f, 0x56, 0x1d, 0x1a, 0xfd, 0x53, 0xe4, ++ 0x8b, 0xb3, 0x73, 0x1b, 0x3d, 0x64, 0xa7, 0x08, 0x7f, 0x8f, 0xce, 0x0b, ++ 0xa9, 0x74, 0x5e, 0x88, 0xf4, 0xe8, 0xd5, 0x59, 0xdc, 0x0e, 0x91, 0xed, ++ 0xef, 0x69, 0x2a, 0x63, 0xbe, 0x31, 0x3c, 0x4e, 0x84, 0xcf, 0x82, 0x0a, ++ 0x85, 0xce, 0x23, 0x8c, 0x2d, 0x53, 0x7c, 0xb8, 0xef, 0xb6, 0x03, 0xe4, ++ 0x07, 0xde, 0x7f, 0xb7, 0x13, 0xd6, 0x39, 0x96, 0x87, 0x9a, 0xd2, 0xe9, ++ 0xb9, 0xbb, 0x49, 0xa7, 0xe7, 0x63, 0xe0, 0x5f, 0xfa, 0x28, 0x2e, 0xe6, ++ 0x21, 0xf8, 0x87, 0xd3, 0x79, 0xdc, 0xe5, 0x81, 0x0c, 0xf7, 0x92, 0x55, ++ 0x68, 0x7f, 0x54, 0xc6, 0xf1, 0x7c, 0xec, 0x8a, 0xa9, 0x60, 0xd9, 0x46, ++ 0xfc, 0x37, 0x58, 0x2f, 0x47, 0xed, 0x98, 0xf7, 0x78, 0x2d, 0x2b, 0xc2, ++ 0x73, 0x68, 0xf9, 0x1d, 0x1c, 0x9f, 0x29, 0xd5, 0x69, 0x74, 0xdf, 0x7d, ++ 0x5c, 0xd1, 0xf1, 0x9e, 0x26, 0x80, 0xb7, 0x94, 0xa9, 0x3a, 0xe6, 0x99, ++ 0x6f, 0xd1, 0x07, 0x8f, 0xf3, 0x6c, 0x9b, 0xce, 0xe3, 0xbf, 0x5b, 0x44, ++ 0x1e, 0x65, 0x10, 0xcf, 0x49, 0x92, 0x52, 0x01, 0x7f, 0x12, 0xe6, 0xbf, ++ 0x5c, 0x90, 0x8a, 0xa9, 0x73, 0xe9, 0xfc, 0xcd, 0xd5, 0xdf, 0x49, 0x24, ++ 0xfb, 0xa6, 0xe6, 0x5b, 0xbd, 0x4e, 0x37, 0x8c, 0xe3, 0x06, 0xa5, 0xe8, ++ 0x3f, 0xf2, 0x00, 0x1f, 0x7f, 0x15, 0xf6, 0xcd, 0xf2, 0x9c, 0x2b, 0x49, ++ 0x1e, 0xc4, 0xfa, 0xa7, 0x29, 0xa8, 0xa9, 0x4a, 0x30, 0xbf, 0x50, 0x0d, ++ 0x85, 0xe0, 0xd7, 0x45, 0xce, 0x45, 0xe4, 0xdf, 0x2e, 0xba, 0x86, 0xb1, ++ 0x24, 0xf8, 0xfe, 0x6a, 0xfc, 0x0e, 0xf4, 0xd4, 0xab, 0xc2, 0x3e, 0x7a, ++ 0xa5, 0xd7, 0xca, 0xd0, 0xff, 0x0b, 0x56, 0xf3, 0xfd, 0xec, 0x1b, 0xee, ++ 0x32, 0xfa, 0xa5, 0x0f, 0xd8, 0xc3, 0x6e, 0xb4, 0x0b, 0x1f, 0x28, 0x4a, ++ 0x61, 0x48, 0x8f, 0x9a, 0xdb, 0x8c, 0xe5, 0x5b, 0x2c, 0x7c, 0xbd, 0x2d, ++ 0x8a, 0xf1, 0x53, 0xaf, 0x8e, 0xc9, 0x03, 0x92, 0xf7, 0x1f, 0x6e, 0xc1, ++ 0x5f, 0xa7, 0x00, 0x3e, 0xa7, 0x8b, 0x7b, 0x5f, 0x44, 0x1e, 0xd0, 0x55, ++ 0xd3, 0x75, 0xae, 0xaf, 0xb3, 0x92, 0x28, 0xe9, 0x5b, 0x9e, 0xcf, 0xb4, ++ 0x5a, 0xd9, 0xa0, 0xfb, 0x94, 0xb2, 0xbd, 0xbd, 0x28, 0xb7, 0x50, 0xce, ++ 0xa6, 0xf8, 0x08, 0x0f, 0x32, 0x6f, 0x8e, 0xa9, 0x7b, 0x8b, 0xf0, 0x7b, ++ 0xd9, 0x9f, 0xfc, 0xee, 0x61, 0x65, 0x6f, 0xc6, 0xc5, 0xe2, 0xa9, 0x60, ++ 0x07, 0x9e, 0xec, 0x2d, 0xe0, 0xfa, 0x1e, 0xed, 0xf5, 0xdd, 0xd3, 0x8d, ++ 0xf9, 0x4a, 0x67, 0xe7, 0x8e, 0xfc, 0x7e, 0x35, 0x1b, 0x8c, 0x6f, 0xfb, ++ 0x34, 0x8c, 0x53, 0xc8, 0xf1, 0xff, 0x6f, 0xf1, 0x6b, 0xcd, 0x74, 0x3e, ++ 0xdf, 0x57, 0x67, 0x7e, 0x56, 0xc2, 0xcf, 0xdd, 0x65, 0xb1, 0xe8, 0xf3, ++ 0x76, 0x32, 0x1f, 0x6c, 0x51, 0x3f, 0xac, 0xd1, 0x7d, 0xc2, 0x32, 0x1f, ++ 0x90, 0xa5, 0xf7, 0x15, 0x22, 0xbd, 0xff, 0x7d, 0x5a, 0xbc, 0xe7, 0x1e, ++ 0xe2, 0x3f, 0x61, 0x8f, 0x84, 0xdf, 0x30, 0x5d, 0x88, 0xff, 0xfa, 0xed, ++ 0xf5, 0x8f, 0x23, 0xdd, 0x97, 0x6d, 0x38, 0xbf, 0x2a, 0xda, 0x1b, 0x0a, ++ 0xcf, 0x43, 0xdd, 0x37, 0x41, 0x3f, 0x51, 0xf9, 0x92, 0x2d, 0xcd, 0x9e, ++ 0x74, 0x3a, 0x5f, 0x97, 0xca, 0xf7, 0xdf, 0x86, 0xa7, 0x54, 0x7d, 0x80, ++ 0xe7, 0xb9, 0xb0, 0xfc, 0x1d, 0x03, 0x7f, 0x19, 0xcf, 0x6d, 0xb5, 0x1c, ++ 0x79, 0x52, 0x41, 0xbf, 0xe5, 0x27, 0x78, 0xde, 0xcd, 0x1c, 0xe9, 0x17, ++ 0xe3, 0xc3, 0x6d, 0x0e, 0x6c, 0x37, 0xc4, 0xe3, 0x4a, 0xe1, 0x27, 0x29, ++ 0x2e, 0x9c, 0x55, 0x1b, 0x56, 0x5a, 0x0b, 0x23, 0xe7, 0x83, 0x62, 0xe5, ++ 0x62, 0xd6, 0x3a, 0xe3, 0xf9, 0xb3, 0xd8, 0x7b, 0x14, 0xe7, 0x39, 0x7a, ++ 0x35, 0x45, 0xc7, 0x7d, 0x80, 0x3e, 0x3a, 0xd7, 0x98, 0x33, 0x43, 0xec, ++ 0xdb, 0x20, 0x8e, 0xb1, 0x5e, 0x2a, 0xb7, 0x27, 0xd5, 0x4c, 0x13, 0xcf, ++ 0x1f, 0x19, 0xa1, 0x73, 0xfb, 0x32, 0xaf, 0x2f, 0x27, 0x7a, 0x1f, 0x44, ++ 0x9d, 0xc1, 0xed, 0x86, 0x79, 0xf1, 0xaf, 0xdf, 0xa6, 0x83, 0xe8, 0xfd, ++ 0xc7, 0xa1, 0xbb, 0x96, 0x63, 0x9e, 0xd4, 0xbc, 0x84, 0xd7, 0x6f, 0xcb, ++ 0x05, 0xf8, 0xfc, 0xa1, 0xef, 0x2d, 0xc7, 0x3c, 0xaa, 0x79, 0x99, 0xaf, ++ 0x7f, 0x96, 0x0b, 0xf2, 0xf6, 0xcb, 0x43, 0xff, 0x87, 0x97, 0x8f, 0x7b, ++ 0xfd, 0xb3, 0x91, 0x68, 0x23, 0x1e, 0x6e, 0xe2, 0xe5, 0x53, 0x19, 0x21, ++ 0xc9, 0x74, 0x38, 0xb8, 0x9c, 0xf6, 0x87, 0x66, 0xc8, 0x7b, 0x13, 0x7b, ++ 0xe8, 0xbc, 0x76, 0x2a, 0x1e, 0xac, 0x98, 0xf4, 0xcd, 0x9f, 0xaa, 0xd5, ++ 0x34, 0xe8, 0xba, 0x74, 0xcc, 0x90, 0x71, 0x4b, 0x46, 0xe7, 0xb3, 0xfd, ++ 0x07, 0x7f, 0x77, 0x02, 0xe5, 0x94, 0x5f, 0xc6, 0x79, 0x7d, 0xc6, 0x7d, ++ 0x4f, 0x26, 0xee, 0x4d, 0xbc, 0x4a, 0xb2, 0x57, 0x8a, 0x8b, 0xec, 0xa5, ++ 0x2b, 0xf1, 0x77, 0xc0, 0xe7, 0x55, 0xe2, 0xbe, 0x1d, 0x93, 0x2d, 0x4c, ++ 0x78, 0x1d, 0x13, 0xb9, 0xcf, 0xe4, 0xa1, 0xaf, 0x73, 0xdf, 0x4e, 0xe4, ++ 0x7c, 0x3c, 0xbf, 0x3f, 0xa8, 0x65, 0x23, 0x0b, 0x18, 0xef, 0x45, 0xf4, ++ 0x09, 0xfe, 0xe7, 0x79, 0x44, 0x72, 0x3c, 0xb2, 0xff, 0x01, 0xe3, 0xc2, ++ 0x7b, 0x01, 0x93, 0xa2, 0xc7, 0xb5, 0x83, 0xda, 0x91, 0xe3, 0xfa, 0xa4, ++ 0xc8, 0x1a, 0x54, 0x26, 0x46, 0xf6, 0x71, 0xe5, 0xb8, 0x3e, 0x51, 0xfa, ++ 0x76, 0x62, 0xd0, 0xa3, 0xee, 0xd8, 0x2f, 0x57, 0x20, 0xdd, 0x3e, 0x71, ++ 0xf6, 0xe5, 0xe0, 0xdf, 0x37, 0x39, 0x3e, 0xe3, 0x1d, 0xa2, 0xe3, 0x27, ++ 0xa9, 0x7d, 0x3b, 0x15, 0x4f, 0x14, 0x6c, 0xe6, 0x74, 0xf4, 0x1e, 0xde, ++ 0x4e, 0xf6, 0x54, 0x45, 0x86, 0xcf, 0x3b, 0x23, 0x15, 0xef, 0x0f, 0xe0, ++ 0xf7, 0x16, 0xb4, 0x0b, 0x3b, 0x72, 0x6b, 0x6a, 0x20, 0x88, 0x7e, 0x3d, ++ 0xf0, 0x1b, 0xe5, 0x71, 0x06, 0xb3, 0xf9, 0xb9, 0x86, 0xea, 0x12, 0xe3, ++ 0xdf, 0x61, 0xab, 0x10, 0xfc, 0xf5, 0x9b, 0x19, 0x7c, 0xff, 0x78, 0x96, ++ 0x75, 0x5b, 0xc3, 0x6b, 0x25, 0x78, 0x8f, 0xba, 0xc2, 0x9a, 0xa1, 0x7e, ++ 0xfd, 0xf9, 0xb3, 0x16, 0xf4, 0xfb, 0xe7, 0x1d, 0xe4, 0x7f, 0xa7, 0x75, ++ 0xfd, 0x81, 0xb7, 0x2d, 0xf4, 0x77, 0x19, 0x10, 0x86, 0x76, 0xd6, 0xef, ++ 0xb0, 0x0c, 0xfa, 0x77, 0xe0, 0x0e, 0xcf, 0x50, 0x25, 0xdd, 0x0d, 0xfe, ++ 0xca, 0xf3, 0xd9, 0xf9, 0x6d, 0x29, 0x30, 0x9e, 0xf5, 0xab, 0xf8, 0xfd, ++ 0xd8, 0x8d, 0xbf, 0x4e, 0x9c, 0x85, 0x70, 0xe3, 0x0a, 0x9c, 0x25, 0xfe, ++ 0x3d, 0xbd, 0x7d, 0xb3, 0xf0, 0xb3, 0x65, 0xfe, 0x23, 0x6d, 0xf8, 0x5c, ++ 0xce, 0x7a, 0x9f, 0xc7, 0x73, 0x7f, 0x4b, 0x02, 0x46, 0x3f, 0xe2, 0xfa, ++ 0x5a, 0xa3, 0xdd, 0xbf, 0xac, 0xc1, 0x68, 0xaf, 0x2f, 0xdf, 0x06, 0xd4, ++ 0x01, 0xbd, 0xb6, 0x7c, 0x63, 0x66, 0xcc, 0x3d, 0x7e, 0xfc, 0x7e, 0xc0, ++ 0x25, 0x82, 0x9e, 0x4b, 0xd2, 0xef, 0xed, 0xc1, 0x7b, 0x07, 0x96, 0xb0, ++ 0x98, 0xfb, 0x01, 0x83, 0x3c, 0x8e, 0x74, 0x3d, 0x9f, 0x01, 0x3c, 0x8d, ++ 0xf1, 0x91, 0x79, 0xf8, 0xf7, 0xa4, 0x70, 0x1e, 0xeb, 0x54, 0x8a, 0xf3, ++ 0x3e, 0x9f, 0xbd, 0x59, 0xc3, 0xf3, 0x70, 0xf5, 0x0d, 0xfc, 0x5e, 0xb2, ++ 0x59, 0x5d, 0x9f, 0x5a, 0xa8, 0x1c, 0xea, 0xe1, 0x7e, 0x53, 0xda, 0x70, ++ 0x7e, 0x0f, 0x9e, 0x94, 0x9f, 0x52, 0xbf, 0x5f, 0xff, 0xdc, 0x2e, 0x33, ++ 0xc6, 0x0b, 0x62, 0xef, 0x09, 0x5c, 0xbe, 0x78, 0x0e, 0xdd, 0x07, 0xbe, ++ 0x58, 0x5f, 0xcb, 0xf5, 0xfb, 0x88, 0x3f, 0xce, 0x4a, 0x82, 0xf7, 0xb1, ++ 0xf7, 0xff, 0xd5, 0x74, 0x71, 0xfd, 0x5e, 0xb3, 0x51, 0x09, 0xe1, 0x7d, ++ 0xbb, 0xd7, 0xd7, 0x1a, 0xfd, 0x81, 0x65, 0xac, 0xa7, 0x0d, 0xfd, 0x99, ++ 0x65, 0x0d, 0xc6, 0xf7, 0xcb, 0x37, 0x1a, 0xe1, 0xef, 0xcd, 0x10, 0x7a, ++ 0x6d, 0x1c, 0x1b, 0x87, 0xeb, 0x63, 0xd3, 0x0c, 0x45, 0xa3, 0x73, 0xd5, ++ 0x02, 0x3e, 0x9d, 0xfd, 0xc7, 0x57, 0xc2, 0xd0, 0x7f, 0x55, 0x86, 0xbf, ++ 0x6d, 0x06, 0xf0, 0xc9, 0x3a, 0x4b, 0x78, 0x02, 0xea, 0xb9, 0xaa, 0x8c, ++ 0x00, 0xc1, 0xb2, 0x1c, 0xde, 0xaf, 0xe7, 0x7a, 0x88, 0xeb, 0x7f, 0x13, ++ 0xac, 0x24, 0x92, 0xbf, 0x66, 0x1e, 0xb7, 0x08, 0xd6, 0xf1, 0x7b, 0xd9, ++ 0xae, 0x1f, 0x60, 0x0f, 0x44, 0xd9, 0x0b, 0xea, 0x40, 0xb8, 0x4b, 0xca, ++ 0x4f, 0xbb, 0xff, 0x36, 0xf2, 0xc3, 0x9e, 0x53, 0xe8, 0xef, 0x82, 0x57, ++ 0x6b, 0x3e, 0x2d, 0x29, 0xca, 0x4f, 0x8e, 0xe5, 0xc3, 0x5f, 0x0b, 0xbe, ++ 0x7e, 0x85, 0xf5, 0x16, 0xe2, 0xb8, 0xf2, 0x91, 0xe9, 0x80, 0x2e, 0xf9, ++ 0x8b, 0xf8, 0xdf, 0x7d, 0xce, 0x3f, 0xbc, 0x82, 0xf2, 0x2c, 0xf3, 0x8b, ++ 0x15, 0x8f, 0x89, 0xd6, 0xb1, 0x89, 0x6d, 0xc4, 0xfb, 0xc4, 0x40, 0x5e, ++ 0xa0, 0x5c, 0x40, 0xfb, 0x13, 0xef, 0xc9, 0xc8, 0x57, 0x3b, 0x17, 0x93, ++ 0x9c, 0x9e, 0x68, 0x71, 0xf3, 0xfb, 0x76, 0xd2, 0x59, 0xf4, 0xfa, 0xf7, ++ 0x3d, 0xc9, 0x14, 0xc4, 0x17, 0x0e, 0x1d, 0xfb, 0xbd, 0x2a, 0xab, 0x9b, ++ 0xee, 0xdb, 0x98, 0xdf, 0x71, 0xef, 0xa7, 0x28, 0xe7, 0xf2, 0x46, 0xf9, ++ 0xbc, 0x0f, 0xc0, 0xf8, 0xb6, 0x8a, 0xfb, 0xb4, 0xb7, 0xfe, 0x5a, 0x21, ++ 0x7b, 0x76, 0x7d, 0xe1, 0x0b, 0x24, 0x0f, 0x87, 0x01, 0x5b, 0x60, 0xbf, ++ 0xeb, 0xd3, 0x85, 0x5c, 0xec, 0x32, 0xde, 0x83, 0x31, 0x0c, 0xe5, 0x14, ++ 0x1e, 0x68, 0x99, 0x5b, 0x48, 0xfd, 0x66, 0xc8, 0xfd, 0x07, 0x99, 0xe7, ++ 0x1b, 0xae, 0xa2, 0x7b, 0xa5, 0x86, 0x89, 0x7e, 0x7f, 0x3f, 0x4b, 0xa7, ++ 0x79, 0xa7, 0xad, 0xed, 0x54, 0x70, 0xde, 0xd9, 0x2c, 0xd8, 0x8c, 0x71, ++ 0xa8, 0x3d, 0x28, 0x0b, 0x53, 0x23, 0x4f, 0xb9, 0x4f, 0x70, 0x4d, 0x64, ++ 0xff, 0xbc, 0x02, 0xe9, 0x59, 0x97, 0xde, 0x4b, 0xf7, 0xc2, 0xc8, 0xfd, ++ 0xf3, 0x41, 0xea, 0xcd, 0x46, 0xb9, 0x33, 0xa0, 0x9e, 0x8f, 0x19, 0xf2, ++ 0x80, 0x66, 0xa9, 0xe7, 0x5d, 0xb8, 0xbf, 0xdd, 0xf8, 0xdc, 0xa8, 0x8b, ++ 0xe6, 0x75, 0xa8, 0x36, 0xe3, 0xfd, 0x90, 0x66, 0xb7, 0xf1, 0x7e, 0xc8, ++ 0xab, 0x0a, 0x8c, 0xeb, 0x7b, 0x9e, 0xc7, 0xb8, 0xae, 0xaf, 0x2e, 0x1b, ++ 0x65, 0x28, 0x5f, 0xe0, 0x1b, 0x67, 0x28, 0x5f, 0x34, 0xa7, 0xd8, 0x00, ++ 0x5f, 0xe3, 0x9f, 0x6a, 0xa8, 0x7f, 0xdd, 0xe2, 0x99, 0xc6, 0x38, 0x42, ++ 0xba, 0xf1, 0x7e, 0x48, 0xbb, 0x6e, 0xbc, 0x1f, 0x32, 0xbe, 0xc0, 0x78, ++ 0x3f, 0xa4, 0xd3, 0x63, 0xbc, 0x1f, 0x92, 0xa5, 0x74, 0x52, 0x5e, 0x9a, ++ 0xc5, 0x16, 0xec, 0x0d, 0xe8, 0x78, 0xbf, 0x00, 0xbf, 0x87, 0x56, 0xca, ++ 0xe9, 0x71, 0x2e, 0x1b, 0x5d, 0x2a, 0x17, 0x57, 0x6c, 0x77, 0xe0, 0xb3, ++ 0xbd, 0xc8, 0x1a, 0x46, 0xba, 0xb5, 0x0f, 0xe7, 0xfb, 0xb9, 0xd6, 0x17, ++ 0x6f, 0x4f, 0x0f, 0x23, 0xd6, 0x13, 0xf6, 0xda, 0x2a, 0xe1, 0xf9, 0xb4, ++ 0x12, 0xaa, 0xc2, 0xfd, 0x28, 0x9b, 0xf0, 0x1b, 0x2f, 0xbb, 0x8b, 0x19, ++ 0xe4, 0xf8, 0x95, 0x33, 0xb9, 0x1c, 0x97, 0x4f, 0xe6, 0x0b, 0xc4, 0x57, ++ 0x62, 0x5c, 0x76, 0x8f, 0x9e, 0xc9, 0xf3, 0xb6, 0x7b, 0x2e, 0xbb, 0x58, ++ 0x7e, 0xc5, 0xa5, 0x3e, 0xff, 0x2f, 0xc2, 0x78, 0x4b, 0x6b, 0x00, 0x80, ++ 0x00, 0x00, 0x00, 0x00, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x0b, 0xed, 0x5a, 0x7d, 0x50, 0x54, 0x57, 0x96, 0x3f, 0xb7, 0xfb, ++ 0x75, 0xd3, 0x0d, 0x88, 0x0d, 0x28, 0x1f, 0x41, 0xf4, 0xa1, 0xa0, 0x26, ++ 0x20, 0x69, 0x41, 0x8c, 0x4e, 0x66, 0x36, 0xaf, 0xbb, 0x81, 0x69, 0x3f, ++ 0x32, 0x69, 0xfc, 0x98, 0x60, 0x10, 0xd3, 0xec, 0xe8, 0x16, 0x13, 0x81, ++ 0x26, 0xd1, 0x4c, 0x91, 0xaa, 0xdd, 0xa2, 0x55, 0x86, 0x34, 0x66, 0xfe, ++ 0x48, 0xac, 0x4c, 0xc6, 0xa4, 0x52, 0xb5, 0xad, 0x15, 0x33, 0x99, 0xa9, ++ 0x71, 0x17, 0x13, 0x56, 0xdb, 0x4d, 0xeb, 0x36, 0x2a, 0xae, 0xc9, 0x9a, ++ 0xb1, 0xdd, 0x31, 0x19, 0x4d, 0x2a, 0x29, 0x74, 0xdd, 0x4c, 0xac, 0x8c, ++ 0x0a, 0x31, 0xe3, 0x98, 0x5d, 0x77, 0xdd, 0x73, 0xee, 0x7d, 0x8f, 0xee, ++ 0xd7, 0x3c, 0x12, 0xb2, 0x35, 0x95, 0xaa, 0x9d, 0x5a, 0x28, 0xea, 0x72, ++ 0xdf, 0xbb, 0x9f, 0xe7, 0xfb, 0xfc, 0xce, 0xb3, 0xa5, 0x03, 0xc0, 0x22, ++ 0xfc, 0x3b, 0x68, 0x0b, 0xef, 0x2b, 0x01, 0xb8, 0x97, 0xe1, 0xff, 0x4b, ++ 0x01, 0xee, 0xd0, 0xcf, 0x03, 0x00, 0xa7, 0xeb, 0x5c, 0x16, 0xa5, 0x06, ++ 0xa0, 0xe2, 0xaf, 0x95, 0x65, 0x30, 0x0d, 0xdf, 0x45, 0xc0, 0x51, 0x86, ++ 0xe3, 0xf6, 0x5a, 0x41, 0xa1, 0x7e, 0xf0, 0xa0, 0x95, 0xcf, 0xab, 0x88, ++ 0x0c, 0x9b, 0x94, 0xcc, 0xc4, 0xbc, 0xe7, 0x14, 0x5c, 0x68, 0x3a, 0xc0, ++ 0x4f, 0x7d, 0xee, 0x65, 0xb4, 0x7e, 0x47, 0x94, 0x39, 0x00, 0xc7, 0x75, ++ 0xec, 0xbe, 0x64, 0x95, 0x2b, 0xa8, 0x3f, 0x98, 0xa5, 0x60, 0x5b, 0xe9, ++ 0xbb, 0x64, 0x85, 0xcc, 0xe4, 0xe7, 0x17, 0xad, 0xf4, 0xbc, 0x43, 0x1a, ++ 0x49, 0x77, 0x60, 0xfb, 0xf7, 0xfd, 0x66, 0x6f, 0xb8, 0x22, 0xb1, 0xae, ++ 0xd6, 0xba, 0x14, 0x2b, 0x5f, 0xff, 0x64, 0x31, 0xb6, 0x78, 0x8e, 0xe6, ++ 0x27, 0xcd, 0xe1, 0x34, 0x3a, 0x3b, 0x28, 0x2b, 0x5d, 0x8b, 0x01, 0x1a, ++ 0xe9, 0x5f, 0x19, 0x9f, 0x1f, 0x18, 0x89, 0x99, 0x71, 0xff, 0xe6, 0x76, ++ 0xe6, 0x0c, 0xe2, 0xa3, 0x46, 0xf9, 0xb1, 0x95, 0x90, 0x85, 0xff, 0xf8, ++ 0x2d, 0x97, 0x86, 0x6d, 0x00, 0x36, 0xfc, 0xbd, 0x33, 0x1b, 0xcf, 0x59, ++ 0x98, 0xb5, 0x17, 0xee, 0xe5, 0xf3, 0x01, 0xf2, 0x00, 0x1e, 0x05, 0xf1, ++ 0xf3, 0xc8, 0x92, 0x98, 0x05, 0x4c, 0x00, 0x4d, 0xad, 0x62, 0x3c, 0xfd, ++ 0xdc, 0xc1, 0xbf, 0x47, 0xd7, 0xd4, 0x5f, 0x61, 0x95, 0xb8, 0x6e, 0x67, ++ 0xca, 0xf3, 0x19, 0xbd, 0xa3, 0xe6, 0x2c, 0x9a, 0x2f, 0x5d, 0x1a, 0x9e, ++ 0xaf, 0x3e, 0x27, 0xba, 0x2a, 0x53, 0xa6, 0x7d, 0x5c, 0x8e, 0x9d, 0x72, ++ 0xa8, 0xb8, 0x33, 0x07, 0xe0, 0xbc, 0xcf, 0x64, 0x78, 0xaf, 0x87, 0x3c, ++ 0x12, 0xbf, 0xd7, 0x79, 0xbf, 0x87, 0xd3, 0xfb, 0xa7, 0x48, 0x37, 0x33, ++ 0x23, 0x3a, 0xa6, 0xd2, 0x49, 0xd0, 0xef, 0xab, 0xe8, 0xb3, 0x1f, 0xcf, ++ 0x9e, 0xcc, 0xa7, 0xd4, 0x71, 0x6b, 0x3c, 0x82, 0x4f, 0xfb, 0x19, 0x34, ++ 0xf6, 0x67, 0x8e, 0x7f, 0xff, 0x33, 0x95, 0x8f, 0x7b, 0x59, 0xbc, 0x0a, ++ 0xcc, 0x00, 0x01, 0x1f, 0x0a, 0xcc, 0x54, 0xa4, 0x87, 0xad, 0x65, 0xf3, ++ 0xe5, 0x6a, 0xa2, 0xff, 0xcd, 0x5e, 0x46, 0xf4, 0xff, 0x07, 0x06, 0x69, ++ 0xb8, 0xfe, 0x07, 0x83, 0x6f, 0xe5, 0xc9, 0x53, 0x00, 0xac, 0x07, 0x86, ++ 0xf2, 0x86, 0x71, 0xbd, 0x40, 0xff, 0x50, 0x1e, 0x2c, 0x00, 0x68, 0xb3, ++ 0xc8, 0xdb, 0xa4, 0x69, 0x5c, 0x0e, 0x9c, 0xdb, 0x90, 0x2f, 0x1d, 0x91, ++ 0x18, 0x3f, 0x7f, 0x7b, 0x7f, 0xf5, 0x20, 0x3d, 0x6f, 0x8f, 0x30, 0xa7, ++ 0x1d, 0x8f, 0x1a, 0x18, 0x18, 0xad, 0xe7, 0xf7, 0x84, 0xe1, 0x5e, 0x47, ++ 0x26, 0xed, 0x6b, 0x7c, 0xae, 0x66, 0xc5, 0xc4, 0xcf, 0xd5, 0xaa, 0xc8, ++ 0xbc, 0x0d, 0xf8, 0x71, 0xcf, 0x69, 0x34, 0x3f, 0x2d, 0x1c, 0x66, 0xc4, ++ 0xf7, 0x61, 0x2b, 0x97, 0x8b, 0xc3, 0x0c, 0x9e, 0xc5, 0xfe, 0xde, 0x3e, ++ 0x5b, 0x63, 0xd8, 0x60, 0x9d, 0x75, 0x44, 0x6f, 0x94, 0xef, 0x13, 0x7d, ++ 0x56, 0x90, 0x50, 0x4e, 0xda, 0x70, 0x3e, 0xdd, 0xe3, 0x64, 0xf1, 0x49, ++ 0xab, 0x8d, 0xe4, 0xe6, 0x00, 0xde, 0x8b, 0xd1, 0x3d, 0xce, 0xae, 0xcd, ++ 0xa0, 0xf5, 0xb7, 0x5a, 0x40, 0x66, 0x89, 0xf3, 0x5d, 0x2d, 0x8e, 0x7f, ++ 0x44, 0xf7, 0xbf, 0xb0, 0xd1, 0x02, 0x41, 0x7c, 0xbe, 0x63, 0xa3, 0x99, ++ 0xd3, 0xfb, 0xc2, 0x56, 0x33, 0x5f, 0xc7, 0xbc, 0xe9, 0xdf, 0x7b, 0x8b, ++ 0xb0, 0xbf, 0x0e, 0xe5, 0x2f, 0x0d, 0x8f, 0x7a, 0x7c, 0xe3, 0x8d, 0x93, ++ 0x45, 0xb8, 0xee, 0x85, 0x56, 0xec, 0xe3, 0x7d, 0x3d, 0x9b, 0x2c, 0x5c, ++ 0xff, 0xd6, 0x3d, 0xce, 0xf8, 0xf8, 0x54, 0xf9, 0xd5, 0xe4, 0xf5, 0x25, ++ 0x55, 0x3e, 0xd7, 0xf9, 0xf5, 0xf2, 0x96, 0x2a, 0xaf, 0xe3, 0xe4, 0xb4, ++ 0xf5, 0xeb, 0xc9, 0x69, 0x0f, 0xc9, 0x69, 0x06, 0x97, 0xd3, 0xca, 0x3b, ++ 0x66, 0xce, 0xf7, 0xba, 0x7c, 0x92, 0x9f, 0xa7, 0xc0, 0xb9, 0x8f, 0xf4, ++ 0xe7, 0xf6, 0x71, 0x4b, 0x3e, 0x9e, 0x77, 0x76, 0xaf, 0xc3, 0xb9, 0x1d, ++ 0xfb, 0x0b, 0xcc, 0xe1, 0x1f, 0xe7, 0x91, 0x5d, 0x38, 0x2e, 0xde, 0x2f, ++ 0x6c, 0xdb, 0xc3, 0x48, 0x5f, 0xf0, 0xf0, 0x8f, 0xd0, 0xbd, 0x8a, 0x42, ++ 0x56, 0xd8, 0xc9, 0x48, 0x8e, 0x04, 0xbf, 0x7e, 0xa6, 0xf2, 0x4b, 0x86, ++ 0x11, 0x96, 0x41, 0xfa, 0x2a, 0xc5, 0x67, 0xfb, 0x50, 0x3e, 0x70, 0x6b, ++ 0x85, 0xf8, 0xfc, 0xba, 0x05, 0x1a, 0x0f, 0x54, 0xd0, 0x73, 0x61, 0x5f, ++ 0x16, 0x1c, 0x2a, 0xd8, 0xb3, 0x33, 0x49, 0x6e, 0xeb, 0x55, 0x79, 0xb4, ++ 0x99, 0xc0, 0xdf, 0x8f, 0xe3, 0xca, 0xad, 0xe0, 0x3f, 0x90, 0x49, 0xe3, ++ 0xfb, 0xef, 0x6a, 0xc0, 0x75, 0xf6, 0xe3, 0x7c, 0x7a, 0x3e, 0x53, 0x5d, ++ 0xaf, 0x6c, 0xce, 0x48, 0x7d, 0x03, 0xb6, 0x87, 0x68, 0x7f, 0xe4, 0xf3, ++ 0x1e, 0xf5, 0x1c, 0x5a, 0xff, 0x07, 0x24, 0xff, 0xd8, 0xc2, 0xcb, 0x26, ++ 0x06, 0x48, 0xf7, 0x07, 0x6d, 0x82, 0xee, 0xcb, 0xbb, 0x62, 0xeb, 0xe9, ++ 0x1e, 0x8b, 0x66, 0xf8, 0x7f, 0x4e, 0xf6, 0x6f, 0xe5, 0xcc, 0xf7, 0xda, ++ 0x00, 0xed, 0x44, 0x68, 0xf6, 0xdb, 0x15, 0x7e, 0x3a, 0x1f, 0x38, 0x4d, ++ 0x44, 0xf7, 0x80, 0x4a, 0xf7, 0xe3, 0x4b, 0x7f, 0xf7, 0xf2, 0x16, 0xbc, ++ 0xaf, 0xfd, 0xee, 0x74, 0xce, 0xd7, 0x86, 0x63, 0x2f, 0xc6, 0x89, 0xcf, ++ 0x1d, 0xa5, 0x12, 0x10, 0xdf, 0xed, 0x65, 0x8b, 0xf2, 0xfd, 0x06, 0xf2, ++ 0xa7, 0xb5, 0x81, 0x5b, 0x25, 0xe0, 0xcf, 0x4d, 0xf4, 0x3b, 0xa2, 0xa3, ++ 0xf5, 0x8a, 0x81, 0x5e, 0x6f, 0x50, 0xf5, 0x75, 0x81, 0x55, 0xdc, 0x1f, ++ 0xa2, 0x48, 0xa4, 0x42, 0x6e, 0x8f, 0xa5, 0x25, 0x55, 0x89, 0x71, 0xda, ++ 0xfd, 0x01, 0xb6, 0xf3, 0xfb, 0xd9, 0xcb, 0x5e, 0xe1, 0x7c, 0xda, 0xf2, ++ 0x38, 0x2c, 0x34, 0xf3, 0x13, 0x3f, 0xc7, 0xd7, 0x69, 0x6a, 0x3b, 0xcb, ++ 0x5a, 0x70, 0x9d, 0x87, 0x2d, 0x8a, 0x25, 0x13, 0xe9, 0xfc, 0xde, 0xd4, ++ 0xc6, 0xcd, 0x97, 0xcb, 0x00, 0xde, 0xee, 0x46, 0x13, 0x89, 0x17, 0x39, ++ 0xdd, 0x6d, 0x03, 0xff, 0x3c, 0x80, 0x5f, 0x77, 0x3b, 0x78, 0x3f, 0xde, ++ 0x5d, 0xc0, 0xfb, 0xff, 0xda, 0x2d, 0xf3, 0x76, 0xde, 0x4c, 0xdf, 0xdb, ++ 0x0a, 0xae, 0xb3, 0xf6, 0x44, 0x67, 0x19, 0xd1, 0xeb, 0x78, 0xf1, 0x0b, ++ 0x3e, 0x37, 0xee, 0x73, 0xfd, 0xb4, 0x85, 0xd3, 0x01, 0xc0, 0xcd, 0xe9, ++ 0xb4, 0x45, 0x95, 0xbd, 0x1b, 0x51, 0x33, 0xd8, 0xf0, 0xfd, 0x8d, 0x01, ++ 0x16, 0x06, 0x96, 0x38, 0xff, 0x86, 0x5b, 0x45, 0xe0, 0x47, 0x7b, 0xf2, ++ 0x3e, 0xed, 0x87, 0x13, 0xdb, 0xbb, 0x7e, 0xc3, 0xed, 0x9c, 0xb3, 0x75, ++ 0xb4, 0x5e, 0xce, 0x24, 0xb9, 0xba, 0xd8, 0x4b, 0xfd, 0x40, 0xd7, 0x1f, ++ 0xea, 0x01, 0xdb, 0x8f, 0xd0, 0x4f, 0x90, 0x7c, 0x05, 0x22, 0x0c, 0x0a, ++ 0x70, 0x9d, 0xf5, 0xb7, 0x72, 0xf9, 0xfc, 0xf6, 0xc8, 0x59, 0xab, 0x4c, ++ 0x72, 0x60, 0x1a, 0xa9, 0x27, 0xfa, 0x07, 0x8f, 0x32, 0x20, 0xb9, 0x0c, ++ 0x74, 0x8e, 0x72, 0xfb, 0xf9, 0x32, 0xde, 0x4b, 0xc1, 0x73, 0xa7, 0xbb, ++ 0xb2, 0x39, 0x5d, 0x02, 0xd1, 0x85, 0x26, 0xc1, 0xcf, 0x45, 0x26, 0xe2, ++ 0xff, 0x13, 0x2a, 0xff, 0x07, 0xef, 0xf9, 0x8f, 0x2c, 0xb2, 0x5f, 0xb6, ++ 0x2e, 0xf9, 0xcc, 0xfd, 0xc4, 0xc7, 0x53, 0x66, 0xce, 0xc7, 0x9d, 0xee, ++ 0x91, 0x2c, 0x87, 0x01, 0x5f, 0xce, 0xe3, 0xba, 0x90, 0x26, 0xce, 0x4f, ++ 0x6d, 0xea, 0xfb, 0x46, 0x6b, 0xb0, 0xcc, 0x89, 0xf3, 0x1a, 0x55, 0xb9, ++ 0x4d, 0x7d, 0x6f, 0x75, 0x09, 0xb9, 0x44, 0x0a, 0x5b, 0x7c, 0x53, 0x04, ++ 0xad, 0x18, 0xd2, 0x6d, 0xbd, 0x2a, 0x5f, 0xcd, 0x78, 0x95, 0xa9, 0x39, ++ 0xd8, 0x8f, 0xb0, 0x58, 0x3a, 0xea, 0x6d, 0x73, 0xd4, 0x73, 0x45, 0xa2, ++ 0xb6, 0x93, 0xc1, 0x25, 0x9d, 0x3d, 0x00, 0xb8, 0xa4, 0xe9, 0xb3, 0x79, ++ 0x62, 0x79, 0x9b, 0x6c, 0xdb, 0x41, 0xeb, 0x95, 0x25, 0xd9, 0x4b, 0x3f, ++ 0x2e, 0x3a, 0x3f, 0xb1, 0x5f, 0x53, 0x6b, 0x06, 0x39, 0xd1, 0xa4, 0xfd, ++ 0x83, 0xfc, 0x1e, 0x69, 0xc5, 0xa5, 0xf9, 0x7e, 0x83, 0x7b, 0x8e, 0xc9, ++ 0xfb, 0x70, 0x11, 0xc8, 0xc8, 0xaf, 0x8e, 0x10, 0x03, 0x19, 0xe5, 0xbe, ++ 0xfd, 0x56, 0x39, 0x6f, 0xaf, 0x1d, 0x7e, 0x5a, 0x26, 0x3d, 0xb1, 0xa5, ++ 0x8f, 0xbc, 0x40, 0x7e, 0x01, 0xe6, 0x9a, 0x1c, 0xfb, 0x90, 0xbf, 0xed, ++ 0x41, 0x50, 0x92, 0xfd, 0xdc, 0xa8, 0x5b, 0xe8, 0xed, 0xa8, 0x5b, 0xe8, ++ 0xf1, 0x4c, 0x17, 0x93, 0x3e, 0xb6, 0x71, 0xbb, 0x55, 0x4e, 0xf7, 0x76, ++ 0x17, 0xfa, 0x4b, 0x5c, 0x78, 0x8e, 0xdf, 0x17, 0xbf, 0x97, 0x75, 0x0c, ++ 0x1f, 0xb7, 0x59, 0x63, 0x95, 0x60, 0xfc, 0xbc, 0x03, 0xd0, 0x1f, 0xdb, ++ 0x48, 0x9f, 0x70, 0xdf, 0x72, 0xe4, 0xcf, 0xeb, 0x06, 0xe7, 0xbe, 0xe9, ++ 0x76, 0xcf, 0xa5, 0x79, 0x33, 0xe1, 0x59, 0x2e, 0xdf, 0x80, 0xf2, 0x4d, ++ 0x72, 0x95, 0x7a, 0xcf, 0x85, 0x2e, 0x71, 0x2e, 0x4d, 0x9f, 0xd7, 0x1d, ++ 0xbb, 0x62, 0x1d, 0x26, 0xb9, 0x8d, 0x18, 0xeb, 0x33, 0xf3, 0xb8, 0x16, ++ 0xd2, 0xba, 0x7d, 0x00, 0x5e, 0x23, 0x3f, 0xf7, 0x47, 0xf5, 0x9e, 0xed, ++ 0xbb, 0x19, 0xa7, 0x57, 0x60, 0x77, 0x2e, 0xa7, 0xd3, 0x55, 0xd8, 0xed, ++ 0x73, 0xa3, 0x5c, 0x5e, 0xc5, 0x73, 0xec, 0x45, 0xb9, 0xbc, 0xee, 0xf3, ++ 0x65, 0x64, 0xe3, 0xfc, 0xeb, 0x7e, 0x5f, 0x46, 0x4e, 0x66, 0x42, 0xff, ++ 0x3b, 0x76, 0x67, 0xf0, 0x79, 0x7d, 0xa5, 0xab, 0x72, 0x5b, 0xb0, 0x5f, ++ 0x4f, 0x72, 0x8f, 0xfb, 0x5d, 0x8b, 0x78, 0x6c, 0x44, 0xe7, 0x0d, 0xbb, ++ 0x85, 0xde, 0x69, 0xfb, 0x7d, 0x14, 0x5b, 0x97, 0x4b, 0xfa, 0x53, 0x63, ++ 0x19, 0xb1, 0x3a, 0xf1, 0xfd, 0x8c, 0xe8, 0xc5, 0x2c, 0x8a, 0xeb, 0x6a, ++ 0x0e, 0xaf, 0xce, 0x25, 0xfd, 0x9b, 0xe8, 0x9c, 0x8b, 0xdd, 0xc2, 0x2e, ++ 0xb5, 0x77, 0x6d, 0xd9, 0x7c, 0x39, 0x57, 0xc8, 0x83, 0x19, 0xf5, 0x69, ++ 0xb3, 0xea, 0xc7, 0x02, 0xdb, 0x63, 0x56, 0xa2, 0xff, 0xe6, 0x2e, 0xe0, ++ 0xf2, 0x3b, 0x78, 0xf0, 0x83, 0x0e, 0xd2, 0xdf, 0x6b, 0xd1, 0x0c, 0x07, ++ 0xf9, 0xbd, 0xab, 0x47, 0x32, 0x82, 0x64, 0xef, 0xaf, 0x1f, 0x4d, 0x0b, ++ 0xa3, 0x25, 0x86, 0x36, 0x92, 0x77, 0xb4, 0x67, 0x57, 0x2d, 0xc3, 0xdf, ++ 0xe3, 0xf1, 0xe3, 0x61, 0xb3, 0x23, 0x88, 0xe3, 0x02, 0x47, 0x3f, 0x7d, ++ 0x81, 0xf4, 0x31, 0x70, 0x10, 0xb5, 0x11, 0xd7, 0xdd, 0x1c, 0x7d, 0x7a, ++ 0x94, 0xfc, 0x5b, 0x5b, 0x74, 0xd9, 0x15, 0x89, 0xda, 0x5f, 0x7d, 0xb3, ++ 0xfa, 0xd0, 0xde, 0xf5, 0x23, 0x7e, 0x5f, 0xad, 0xff, 0x69, 0xb7, 0x4d, ++ 0x26, 0xfb, 0x79, 0x4d, 0x12, 0x76, 0x62, 0x73, 0xe4, 0x0d, 0x1e, 0xcf, ++ 0x6e, 0xbe, 0x7d, 0xa3, 0xd2, 0x57, 0x41, 0xf7, 0xfc, 0xcf, 0xc5, 0x64, ++ 0xcf, 0x02, 0xff, 0x74, 0x63, 0x31, 0xd9, 0xb1, 0xc0, 0x9b, 0x37, 0x16, ++ 0xd3, 0xfb, 0xc0, 0xa1, 0x8c, 0x4e, 0xa3, 0xf8, 0xa4, 0xd5, 0x63, 0xe6, ++ 0xfc, 0xd7, 0xfc, 0x63, 0xc9, 0x39, 0x49, 0x49, 0x1e, 0x97, 0xad, 0xfa, ++ 0xaf, 0x92, 0x9e, 0x67, 0xbd, 0xb3, 0x91, 0x7e, 0x35, 0x67, 0xd7, 0x38, ++ 0xcd, 0x72, 0xe2, 0x7d, 0x4d, 0x99, 0xc9, 0x47, 0xe3, 0x6b, 0xde, 0xad, ++ 0xcd, 0xdd, 0x94, 0x34, 0xaf, 0x27, 0x2e, 0x79, 0xe9, 0xf9, 0xa2, 0xb3, ++ 0xb5, 0x19, 0x1b, 0x93, 0xe4, 0xd2, 0xea, 0xb1, 0xa8, 0x76, 0x08, 0xb5, ++ 0x1a, 0xed, 0xcf, 0x3a, 0x95, 0x86, 0xeb, 0x0a, 0x7e, 0x12, 0x37, 0x57, ++ 0x52, 0x5f, 0x0a, 0xaa, 0x71, 0x04, 0xbb, 0xc3, 0xe3, 0x6d, 0x90, 0x25, ++ 0xe4, 0x73, 0x13, 0xfd, 0x87, 0xaa, 0xd8, 0x17, 0x97, 0x78, 0x3c, 0x13, ++ 0x6c, 0x35, 0x87, 0xcb, 0xf0, 0x7d, 0x53, 0xdc, 0xa4, 0xd8, 0x2b, 0xe9, ++ 0x3d, 0xce, 0x4b, 0x8a, 0x33, 0x00, 0x7c, 0x2b, 0x16, 0x10, 0xbf, 0x7f, ++ 0x38, 0xdd, 0xb9, 0x53, 0xe6, 0xfe, 0x1e, 0xba, 0xa9, 0xff, 0x54, 0x59, ++ 0x98, 0xfc, 0x3d, 0x04, 0x6d, 0x43, 0xa5, 0x49, 0x71, 0xd0, 0xba, 0xb8, ++ 0x29, 0x96, 0x86, 0x72, 0xd3, 0x18, 0x4d, 0x8b, 0x51, 0x3c, 0xb4, 0x2e, ++ 0x2e, 0x5d, 0xe4, 0x7d, 0x35, 0x3e, 0xfa, 0xc8, 0xf1, 0xfa, 0x8f, 0x67, ++ 0x03, 0x8f, 0x8f, 0x2e, 0x27, 0xc7, 0x39, 0x18, 0x0f, 0x5d, 0xd6, 0xc7, ++ 0x4b, 0x30, 0x85, 0xce, 0xab, 0xc5, 0x4b, 0xef, 0x51, 0x5c, 0x85, 0xf1, ++ 0x6c, 0xf3, 0xd6, 0x98, 0x85, 0xfc, 0x15, 0xc6, 0x49, 0xba, 0xf1, 0x8f, ++ 0x36, 0x7e, 0xf7, 0x0a, 0xa3, 0x38, 0xa9, 0x4b, 0xff, 0xbc, 0x24, 0x2e, ++ 0x99, 0x1e, 0xc4, 0x7b, 0x96, 0xa0, 0xb9, 0x23, 0x32, 0xf4, 0xc5, 0x9f, ++ 0xb7, 0x91, 0x7e, 0x68, 0x71, 0x26, 0xf1, 0x6b, 0xc0, 0x40, 0xdf, 0x2b, ++ 0x55, 0x3d, 0xd1, 0xf4, 0xa8, 0x27, 0x6e, 0xe2, 0x7c, 0xe8, 0x89, 0xbb, ++ 0x6d, 0xa5, 0xd8, 0xce, 0x53, 0xdf, 0x0f, 0x38, 0x4c, 0x10, 0xc4, 0xf5, ++ 0x7b, 0xa2, 0xab, 0xf7, 0x31, 0x8a, 0xcb, 0x6e, 0x3f, 0x9c, 0x41, 0xf4, ++ 0xea, 0x39, 0xb7, 0x0a, 0xb6, 0x93, 0xbe, 0x3b, 0xdc, 0xb6, 0x32, 0x9a, ++ 0x77, 0xfb, 0xbb, 0xb6, 0xb5, 0x15, 0x09, 0xf9, 0x18, 0x67, 0x3f, 0x5c, ++ 0xaa, 0x7d, 0x1c, 0x8b, 0x07, 0x8c, 0xfd, 0xdc, 0x27, 0x2e, 0x35, 0xae, ++ 0xfa, 0x86, 0xfc, 0xdd, 0xe5, 0x3f, 0x17, 0x7f, 0xa7, 0xf8, 0x3f, 0x25, ++ 0xfb, 0x5d, 0xf1, 0x9a, 0xdc, 0x44, 0xf1, 0x21, 0xde, 0xe7, 0x1e, 0x8a, ++ 0x67, 0x53, 0xfd, 0x84, 0x66, 0x7f, 0xb5, 0x75, 0x8b, 0x54, 0x3e, 0x8f, ++ 0xb7, 0xbf, 0x57, 0x78, 0xfc, 0x82, 0xf9, 0x2f, 0xb7, 0xbf, 0x45, 0x6e, ++ 0x99, 0x8f, 0x9b, 0x11, 0x6d, 0xc8, 0xe5, 0x79, 0xf1, 0xb9, 0x35, 0xb9, ++ 0x72, 0xe6, 0xf8, 0xf5, 0xe7, 0x48, 0x4e, 0x53, 0x4e, 0xc5, 0xf8, 0xf5, ++ 0xb5, 0x78, 0x2d, 0x10, 0x54, 0x86, 0x6c, 0x94, 0xc7, 0x28, 0x66, 0xae, ++ 0x9f, 0x81, 0x35, 0x2c, 0xcc, 0xa8, 0xef, 0x63, 0x3c, 0xce, 0x0e, 0xac, ++ 0xb7, 0x84, 0xe9, 0xbd, 0x76, 0x9e, 0xf8, 0x1a, 0xc6, 0xc7, 0xad, 0x75, ++ 0xb2, 0xb0, 0x9d, 0x25, 0xe2, 0x3f, 0x2d, 0x3e, 0x1c, 0x7b, 0xbf, 0x08, ++ 0xdf, 0x97, 0x24, 0xe2, 0x45, 0x2d, 0x2e, 0x8c, 0xfb, 0x18, 0xcf, 0x83, ++ 0xd6, 0x28, 0x16, 0xfe, 0x7e, 0xde, 0x4c, 0x7f, 0x8e, 0xbb, 0x86, 0xee, ++ 0x67, 0xe7, 0xcf, 0x6b, 0x96, 0x8a, 0x75, 0xd1, 0x0e, 0x0c, 0x51, 0x7e, ++ 0xf4, 0xf0, 0xf7, 0x19, 0x70, 0x3b, 0xa0, 0xc6, 0x8b, 0x9a, 0x7c, 0xa6, ++ 0xc6, 0x93, 0x9f, 0x45, 0xe7, 0x4c, 0x85, 0x2f, 0x89, 0x2b, 0x5e, 0x56, ++ 0xe5, 0x52, 0xd3, 0xaf, 0x99, 0x29, 0x7a, 0xa1, 0xf9, 0xa9, 0x7a, 0xd5, ++ 0x4f, 0x77, 0x90, 0x9f, 0xae, 0x26, 0x3f, 0xfd, 0x85, 0x95, 0xf4, 0x60, ++ 0xa2, 0xb8, 0x1b, 0xfd, 0xf4, 0x5c, 0x37, 0x9f, 0x07, 0x7c, 0xfe, 0xa2, ++ 0x77, 0x25, 0x9f, 0x51, 0xde, 0x7d, 0x58, 0x5d, 0x77, 0xb1, 0xc6, 0xb7, ++ 0xf8, 0x09, 0x17, 0x9d, 0xb7, 0x18, 0xe2, 0xdb, 0x28, 0x5f, 0x9c, 0xc8, ++ 0x7f, 0xe6, 0x79, 0x4c, 0x3a, 0xbb, 0x90, 0xfa, 0xbe, 0x7e, 0x92, 0x7a, ++ 0xdc, 0xa2, 0xc6, 0x0b, 0xdf, 0x94, 0x1e, 0x37, 0xab, 0xf1, 0xd7, 0xff, ++ 0x75, 0x3d, 0x1e, 0x8b, 0xff, 0xac, 0xc6, 0xf7, 0xbc, 0xe9, 0x76, 0xfd, ++ 0x15, 0xc9, 0x6f, 0xba, 0xb9, 0x33, 0xee, 0x22, 0xbd, 0xfb, 0x17, 0xd4, ++ 0x3b, 0x79, 0xfc, 0xb8, 0x22, 0x2d, 0x9f, 0x94, 0x40, 0xc7, 0x9f, 0xa1, ++ 0x62, 0xab, 0x89, 0xf2, 0x9e, 0x40, 0xab, 0xc0, 0x01, 0x42, 0xd9, 0xf2, ++ 0x19, 0x9e, 0x9f, 0xbc, 0x65, 0x06, 0x5a, 0x67, 0xf3, 0xad, 0x42, 0x1e, ++ 0xa7, 0x3d, 0x76, 0x2b, 0x9b, 0xb7, 0xa1, 0x42, 0x10, 0x7e, 0xf4, 0xc9, ++ 0x12, 0x8e, 0xdb, 0x3c, 0xf6, 0xda, 0x59, 0x8b, 0x82, 0xf3, 0x9b, 0xb6, ++ 0xb2, 0x85, 0x84, 0x07, 0x35, 0xb5, 0xea, 0xef, 0x13, 0x9a, 0xae, 0x70, ++ 0x9c, 0x2d, 0x78, 0x84, 0xf1, 0x78, 0x39, 0x54, 0xd8, 0x7f, 0x92, 0xf4, ++ 0x2a, 0xb8, 0x6f, 0x8e, 0x4c, 0xeb, 0x37, 0xd3, 0x65, 0x09, 0x0f, 0x69, ++ 0xcd, 0x0e, 0xef, 0x20, 0xfc, 0x82, 0x70, 0x9c, 0x7b, 0xe9, 0x79, 0x7a, ++ 0x82, 0x0e, 0xb8, 0x4f, 0xbb, 0xfa, 0xfc, 0x7e, 0x15, 0xdf, 0x81, 0x94, ++ 0x38, 0xe0, 0xcd, 0xc1, 0x0b, 0x1c, 0xef, 0x09, 0x0c, 0x30, 0x20, 0xfd, ++ 0xb5, 0x46, 0xd1, 0x7e, 0x90, 0x3d, 0x39, 0x25, 0xf0, 0x8e, 0x8e, 0xa8, ++ 0xb0, 0x0b, 0x9f, 0x74, 0xd9, 0xb9, 0x3d, 0xf9, 0x44, 0x12, 0xf7, 0x08, ++ 0x74, 0xb1, 0xf0, 0x36, 0x96, 0x88, 0x23, 0xae, 0x44, 0x9f, 0xcb, 0x23, ++ 0x3d, 0x1b, 0x17, 0x4f, 0x28, 0x18, 0x4f, 0xe4, 0x25, 0xe2, 0x89, 0xf6, ++ 0x57, 0xde, 0xe5, 0xf6, 0x30, 0x35, 0x7e, 0xc8, 0x19, 0x10, 0xfb, 0x04, ++ 0xda, 0xcc, 0x61, 0xc2, 0x63, 0x86, 0x8a, 0x17, 0x33, 0xea, 0xb7, 0x63, ++ 0x3e, 0x98, 0x4f, 0x71, 0xa2, 0x2c, 0x3f, 0x54, 0x24, 0xce, 0x05, 0x61, ++ 0x6e, 0x57, 0x14, 0x1d, 0x4e, 0xb2, 0xf7, 0x2e, 0xe1, 0xf7, 0x3f, 0x3b, ++ 0xf5, 0x6f, 0x3c, 0x8f, 0x6c, 0x3a, 0xcc, 0x20, 0x97, 0xc7, 0x1d, 0x4a, ++ 0xbc, 0x34, 0x2f, 0x11, 0x77, 0x3c, 0x1a, 0x5a, 0xce, 0xfd, 0xbf, 0x16, ++ 0x67, 0x3c, 0x3a, 0xeb, 0xe4, 0x50, 0x11, 0xad, 0xa7, 0xc6, 0x19, 0x0e, ++ 0xfc, 0x25, 0xfc, 0x30, 0x35, 0xce, 0xe8, 0x88, 0x9c, 0xb5, 0x50, 0x5e, ++ 0x30, 0x2e, 0x9e, 0x48, 0x89, 0x23, 0x5e, 0x77, 0xeb, 0x71, 0xc1, 0x59, ++ 0x92, 0xc0, 0x59, 0x67, 0x45, 0x99, 0x83, 0xf0, 0xa4, 0x59, 0x2a, 0x3d, ++ 0xef, 0xeb, 0x4b, 0xe7, 0x71, 0x71, 0xfd, 0x87, 0x1b, 0x73, 0x49, 0xcf, ++ 0x35, 0xfe, 0x5c, 0x6b, 0x10, 0xfc, 0xba, 0x76, 0xe1, 0x73, 0x17, 0xcd, ++ 0x5b, 0xfc, 0xa1, 0xe4, 0x20, 0x7b, 0xfb, 0xe6, 0x85, 0xad, 0xbf, 0x29, ++ 0x12, 0x7d, 0xd9, 0x26, 0xd3, 0xbc, 0xad, 0x19, 0x94, 0x87, 0x5c, 0xfb, ++ 0xf0, 0x89, 0x0c, 0xa2, 0xe7, 0x9b, 0xd8, 0x02, 0xea, 0xeb, 0xa1, 0xf3, ++ 0x92, 0x21, 0x7e, 0x28, 0xab, 0xf6, 0x08, 0xfd, 0xdb, 0x3f, 0xbb, 0x39, ++ 0xfe, 0x2b, 0x17, 0x71, 0x5c, 0x47, 0x42, 0xff, 0x36, 0x25, 0x81, 0xbf, ++ 0xa4, 0xce, 0x7b, 0xc0, 0x23, 0xec, 0x41, 0x08, 0xd3, 0x0c, 0x8e, 0x3b, ++ 0x1e, 0x06, 0x2e, 0xbf, 0xa1, 0x42, 0xff, 0x72, 0xde, 0x7f, 0x71, 0x36, ++ 0xec, 0xe3, 0xb8, 0x8f, 0x90, 0xd7, 0x37, 0xa2, 0xd9, 0x0e, 0x8a, 0xf7, ++ 0xca, 0xf1, 0xb2, 0x5d, 0x68, 0x27, 0xfe, 0x2e, 0x1d, 0x7a, 0xec, 0x55, ++ 0x24, 0xcf, 0xfe, 0xb7, 0xb9, 0x7e, 0xbc, 0x68, 0xe2, 0xf2, 0x8b, 0xf3, ++ 0x83, 0x8c, 0xfa, 0x07, 0x64, 0xee, 0xef, 0x88, 0x64, 0xeb, 0x71, 0x7c, ++ 0xa5, 0x15, 0xcf, 0x52, 0x05, 0x62, 0x33, 0xd4, 0xb7, 0x7b, 0x54, 0xbe, ++ 0x15, 0x62, 0x1e, 0x4a, 0xf9, 0x20, 0x9e, 0x66, 0xcd, 0x1d, 0xa4, 0x53, ++ 0xf9, 0x8c, 0x53, 0x5f, 0x10, 0x1f, 0x2b, 0xd3, 0x41, 0xa2, 0xf5, 0x9f, ++ 0xb1, 0xf8, 0x77, 0xde, 0x8d, 0x53, 0x9e, 0x19, 0x94, 0x9c, 0xdb, 0x68, ++ 0x8e, 0xe4, 0xcc, 0x6d, 0xc0, 0x7b, 0x3d, 0x63, 0x17, 0x4b, 0x3d, 0x73, ++ 0x18, 0xe5, 0x15, 0xcf, 0x85, 0xd2, 0xcd, 0xcf, 0xd5, 0x51, 0x71, 0xf2, ++ 0x3c, 0xcd, 0x67, 0xb2, 0x03, 0xd6, 0xe3, 0xfc, 0x8e, 0x82, 0xcc, 0x18, ++ 0xe1, 0x67, 0x10, 0xb1, 0xfc, 0x7e, 0x4c, 0x2e, 0x51, 0x0e, 0x18, 0xed, ++ 0x53, 0x29, 0xe4, 0xed, 0xe3, 0xf9, 0x14, 0x1b, 0x2a, 0xec, 0x0e, 0x9a, ++ 0x9a, 0xb7, 0xeb, 0x64, 0x61, 0x17, 0xbe, 0xef, 0x03, 0xca, 0x83, 0x76, ++ 0x2c, 0xe9, 0x04, 0xca, 0x3b, 0x4f, 0xd6, 0x81, 0x1a, 0x07, 0xd9, 0x82, ++ 0x97, 0x71, 0xfc, 0x5a, 0x9c, 0x31, 0x15, 0x9f, 0x4f, 0x2f, 0xf4, 0x17, ++ 0x52, 0x5c, 0xd1, 0x5e, 0x30, 0x6c, 0x15, 0x71, 0xc5, 0x88, 0x95, 0xe2, ++ 0x8a, 0xb9, 0x2e, 0x6d, 0xbc, 0xc0, 0xed, 0x4c, 0x38, 0x9e, 0xec, 0xe5, ++ 0xce, 0xf9, 0xaf, 0x73, 0x79, 0x6b, 0xa2, 0xe7, 0x49, 0xfa, 0x0c, 0xc9, ++ 0xf8, 0x9e, 0x79, 0x7c, 0xbf, 0xc5, 0x3d, 0xd1, 0xfe, 0xb2, 0xc8, 0xe7, ++ 0x52, 0xf6, 0x5f, 0x94, 0xfd, 0x59, 0x1e, 0xcf, 0x5f, 0xfe, 0xeb, 0x8f, ++ 0x59, 0xdc, 0x9f, 0x45, 0x6f, 0x70, 0xbf, 0x73, 0x7d, 0x24, 0x0d, 0xe2, ++ 0x1c, 0xb7, 0x1b, 0x16, 0x38, 0x75, 0xd4, 0xc2, 0xf3, 0xf5, 0xeb, 0x98, ++ 0x07, 0x4d, 0x4f, 0xf2, 0x67, 0x3b, 0x5c, 0x82, 0x0e, 0xc7, 0xa2, 0x1e, ++ 0x2e, 0x8f, 0x03, 0xf1, 0xda, 0x0c, 0x1a, 0xff, 0x4b, 0x97, 0xd8, 0xaf, ++ 0xef, 0xdc, 0x9a, 0xd5, 0x0f, 0x92, 0x9c, 0xc4, 0x25, 0x67, 0x19, 0x3f, ++ 0xa5, 0xc8, 0x6b, 0x06, 0xe2, 0x52, 0x8d, 0x88, 0x0f, 0xc6, 0xd1, 0xa9, ++ 0xca, 0x6d, 0x70, 0x4e, 0x5b, 0xba, 0xb0, 0xe7, 0xa9, 0xf2, 0x79, 0xc9, ++ 0x2d, 0xe4, 0xfa, 0x12, 0xdd, 0x1b, 0xcf, 0xe1, 0xb9, 0x20, 0xf2, 0x95, ++ 0xc0, 0x56, 0x51, 0x3f, 0x70, 0xa8, 0xfa, 0x16, 0xe8, 0x64, 0xdc, 0xae, ++ 0x9c, 0x2c, 0xce, 0x63, 0x1a, 0x8e, 0x9c, 0x6f, 0x54, 0x5f, 0x38, 0x3c, ++ 0xc2, 0xed, 0x6c, 0xf3, 0x0f, 0x99, 0x33, 0x28, 0x4f, 0x5c, 0x5f, 0xd8, ++ 0xa5, 0xe6, 0x19, 0xa9, 0x76, 0xa8, 0x23, 0x72, 0x40, 0xf0, 0x2d, 0x15, ++ 0xb7, 0xf5, 0xd6, 0x73, 0xbb, 0x33, 0x59, 0xdc, 0x16, 0x28, 0x1b, 0x5e, ++ 0x9c, 0xb0, 0xd3, 0xdf, 0xf1, 0xa8, 0x76, 0x65, 0x81, 0xc0, 0x71, 0x4f, ++ 0xb8, 0x1d, 0xfc, 0xbe, 0x39, 0x9d, 0x0b, 0x5d, 0xf9, 0x90, 0xb8, 0xbf, ++ 0x01, 0x3d, 0xf7, 0x7b, 0x6a, 0xc6, 0xd3, 0xd3, 0x60, 0x5c, 0xb4, 0xd6, ++ 0x80, 0xee, 0x06, 0xe3, 0xfe, 0xf0, 0xc0, 0xe4, 0xd6, 0xab, 0x56, 0x26, ++ 0xb7, 0x9e, 0x6b, 0x92, 0xe3, 0x5a, 0x94, 0xc9, 0xed, 0x7b, 0x68, 0x92, ++ 0xeb, 0xed, 0x99, 0xe4, 0x7a, 0x4f, 0x1a, 0xe9, 0x2d, 0xb2, 0x5d, 0xc4, ++ 0x03, 0x0e, 0x21, 0x37, 0x75, 0xe6, 0xdb, 0x59, 0x24, 0xff, 0x4f, 0x1c, ++ 0x99, 0x93, 0xff, 0x65, 0xf1, 0xac, 0x19, 0x0d, 0xad, 0x9c, 0xc4, 0x7f, ++ 0x8b, 0x23, 0x1d, 0xe4, 0x24, 0xbf, 0xbf, 0x62, 0x7e, 0xae, 0xae, 0xff, ++ 0xa0, 0xb3, 0x48, 0x37, 0xfe, 0xa1, 0x25, 0x73, 0x74, 0xef, 0x1b, 0x94, ++ 0x72, 0xdd, 0xfb, 0xd5, 0xde, 0x6a, 0x5d, 0x7f, 0xad, 0xef, 0x7e, 0xdd, ++ 0xf8, 0x87, 0x1b, 0x3d, 0xba, 0x7e, 0x5a, 0xc1, 0x72, 0xdd, 0x78, 0xbb, ++ 0xbc, 0x4a, 0xd7, 0xcf, 0x98, 0xff, 0x88, 0x6e, 0x7c, 0x08, 0x75, 0x66, ++ 0x09, 0xda, 0xcf, 0x34, 0x6b, 0x66, 0x88, 0xa1, 0xfc, 0x4f, 0x71, 0xfe, ++ 0xa5, 0x6e, 0x7c, 0x7a, 0xb5, 0x3d, 0x93, 0xf4, 0x22, 0xb4, 0x30, 0x2d, ++ 0x46, 0xf2, 0x9e, 0xf6, 0xd6, 0xa6, 0x20, 0xbd, 0x7b, 0x9a, 0xfd, 0x64, ++ 0x24, 0x46, 0xd4, 0xcd, 0x3a, 0xd8, 0xc8, 0x50, 0x65, 0xa5, 0xec, 0x57, ++ 0x6c, 0xa4, 0x27, 0x2b, 0x97, 0x8a, 0xba, 0x40, 0x5f, 0xad, 0x2d, 0xbc, ++ 0x87, 0xe2, 0x9c, 0xbb, 0xb2, 0x2a, 0x69, 0xbe, 0x46, 0xaf, 0x7d, 0x75, ++ 0x22, 0xfe, 0x72, 0x54, 0x8c, 0x06, 0x73, 0x91, 0xce, 0x33, 0x95, 0x78, ++ 0x6d, 0x2e, 0xea, 0xf3, 0xf5, 0xa5, 0xc0, 0xf3, 0x87, 0xeb, 0x76, 0x51, ++ 0x1f, 0x00, 0xc9, 0x51, 0xd8, 0xc0, 0xf9, 0xe7, 0x28, 0x5c, 0x85, 0x76, ++ 0x3f, 0x64, 0x37, 0xae, 0x33, 0x35, 0xd6, 0xa9, 0x79, 0xf1, 0x04, 0xf6, ++ 0xe4, 0x74, 0x9d, 0xeb, 0x17, 0xa4, 0x2f, 0x0e, 0x8a, 0xcb, 0x0d, 0xf8, ++ 0xa8, 0xa8, 0x78, 0xbd, 0x23, 0x02, 0x1c, 0xb7, 0x01, 0x49, 0x2e, 0x5c, ++ 0xc5, 0xf7, 0x95, 0x0b, 0xc9, 0xdf, 0x4c, 0x3d, 0x21, 0x9e, 0x67, 0xc5, ++ 0x40, 0xd9, 0xc3, 0xcf, 0x25, 0x97, 0xac, 0xe2, 0x71, 0xb4, 0x5c, 0x42, ++ 0xe7, 0xdb, 0xa5, 0xd6, 0xbf, 0x72, 0x96, 0xcf, 0x2d, 0x21, 0xbc, 0x2e, ++ 0x07, 0xfd, 0x2e, 0xd5, 0x47, 0x9e, 0xa3, 0x3a, 0x09, 0xcf, 0x03, 0x1c, ++ 0x7c, 0x9c, 0xb6, 0x9f, 0xb3, 0x56, 0xec, 0xb7, 0xcb, 0x02, 0x8c, 0xea, ++ 0x59, 0xc1, 0xbb, 0x19, 0x8f, 0x53, 0xc1, 0x31, 0x55, 0x57, 0xdf, 0x38, ++ 0x6d, 0x89, 0x5d, 0x6e, 0x61, 0xbc, 0xbe, 0x71, 0x82, 0xce, 0xff, 0x8e, ++ 0x29, 0x56, 0xb1, 0xb7, 0x44, 0xf0, 0x85, 0xe8, 0x5b, 0x31, 0xe0, 0xe0, ++ 0x75, 0x97, 0x5f, 0x2f, 0xfd, 0xf9, 0x7c, 0x3f, 0xdf, 0x47, 0xd4, 0x3b, ++ 0xb6, 0x38, 0xc4, 0x90, 0xe3, 0x94, 0x6f, 0xe0, 0x39, 0xb6, 0x1c, 0xa9, ++ 0xe6, 0xf2, 0xdb, 0x74, 0x6c, 0xe9, 0x6f, 0xd7, 0x53, 0x5c, 0x58, 0x2a, ++ 0x71, 0x3a, 0x8f, 0x8b, 0xc7, 0xd5, 0x3c, 0xeb, 0xbc, 0x9a, 0x27, 0x6a, ++ 0x79, 0xd6, 0x30, 0xe5, 0x8b, 0x49, 0x79, 0xc7, 0x79, 0x8f, 0x69, 0x22, ++ 0xbb, 0x74, 0xde, 0x63, 0xa0, 0x57, 0xbb, 0x98, 0xc8, 0x83, 0x83, 0xef, ++ 0x88, 0x3c, 0xb8, 0xda, 0xea, 0x9c, 0xd3, 0x99, 0xc4, 0xa7, 0xcb, 0x6a, ++ 0x3c, 0xde, 0x12, 0x13, 0x78, 0xac, 0x96, 0xdf, 0x56, 0x2a, 0x61, 0x53, ++ 0x1e, 0xd2, 0xa1, 0xfa, 0x29, 0x73, 0x2c, 0x0d, 0xfd, 0x75, 0x75, 0xef, ++ 0x02, 0x2b, 0xd9, 0xed, 0xea, 0xde, 0xe2, 0x74, 0x8e, 0x2f, 0x6d, 0x3c, ++ 0x60, 0xd2, 0xe8, 0x6d, 0xc4, 0xf7, 0x6b, 0xea, 0x39, 0xfb, 0x4e, 0x8d, ++ 0xf0, 0xfa, 0xc4, 0x1b, 0x29, 0x75, 0x4a, 0x67, 0xad, 0x95, 0xbf, 0xff, ++ 0x5b, 0x55, 0x1e, 0x9d, 0xb5, 0xc0, 0xdb, 0x2d, 0x65, 0xd2, 0x0e, 0x72, ++ 0xc3, 0x53, 0xbf, 0xed, 0x30, 0x1b, 0xe1, 0xe3, 0xcd, 0x18, 0xff, 0xd3, ++ 0xf9, 0x5a, 0x42, 0xe2, 0xbc, 0x5a, 0x3d, 0xa4, 0x39, 0x26, 0x7b, 0x68, ++ 0x9f, 0x8b, 0x43, 0x23, 0xbd, 0xd4, 0x56, 0xb5, 0x96, 0x78, 0x38, 0x7e, ++ 0xd8, 0x36, 0xda, 0x4b, 0xfe, 0x33, 0x70, 0xfb, 0xc6, 0xc9, 0x07, 0x38, ++ 0x1e, 0x60, 0x95, 0x29, 0xbe, 0x4a, 0x5d, 0xf7, 0x50, 0x9d, 0x99, 0xcb, ++ 0xc5, 0x1b, 0x14, 0x90, 0x10, 0xbd, 0x96, 0x49, 0x61, 0x1a, 0x57, 0xbd, ++ 0x4c, 0xe2, 0xfc, 0xce, 0x69, 0xb6, 0xf3, 0x7c, 0x3c, 0xc7, 0x02, 0xe6, ++ 0x4c, 0xea, 0x37, 0x08, 0x7f, 0x56, 0xe5, 0x9d, 0xe6, 0xa1, 0x3e, 0xac, ++ 0xc9, 0xe6, 0xfe, 0xb8, 0xea, 0x94, 0x9c, 0xbd, 0xa9, 0x22, 0x91, 0xef, ++ 0xe7, 0x2c, 0xdb, 0x3a, 0x9d, 0xe8, 0xf4, 0x55, 0x75, 0x22, 0x0d, 0x37, ++ 0x98, 0x37, 0x53, 0x99, 0x4a, 0x7e, 0xe3, 0xeb, 0xd6, 0x89, 0xda, 0x4f, ++ 0x9f, 0xb3, 0xd2, 0xbd, 0x37, 0x0c, 0xeb, 0xeb, 0x44, 0x5a, 0xdd, 0x67, ++ 0xa2, 0x3a, 0x91, 0x56, 0xa7, 0x0d, 0x78, 0x3f, 0xd7, 0xd5, 0x95, 0x03, ++ 0xd2, 0x48, 0x3d, 0xe1, 0x2b, 0xd5, 0x47, 0x2e, 0xf2, 0x3a, 0x71, 0x20, ++ 0xc2, 0x1c, 0x05, 0x25, 0x89, 0xfa, 0x51, 0x60, 0x60, 0xd4, 0xca, 0xe9, ++ 0xab, 0xd6, 0x8d, 0x70, 0xbc, 0x95, 0xe6, 0x0d, 0x74, 0x8b, 0xfa, 0xd1, ++ 0x41, 0xdc, 0x9f, 0xda, 0x08, 0xde, 0x57, 0xc1, 0x73, 0xfc, 0x23, 0xde, ++ 0x97, 0xda, 0x28, 0xde, 0x97, 0x9e, 0x1f, 0xed, 0x9e, 0xcf, 0xdb, 0x58, ++ 0xb7, 0x93, 0xb7, 0xc7, 0xba, 0x97, 0xf0, 0xb6, 0x1a, 0xc5, 0xa6, 0x30, ++ 0x87, 0xea, 0x4e, 0xa3, 0xbc, 0xee, 0x54, 0x53, 0xab, 0xaf, 0x5b, 0x68, ++ 0x75, 0x09, 0x77, 0xa1, 0x6f, 0x49, 0x6d, 0x8d, 0xae, 0x6e, 0xc1, 0xfb, ++ 0xa9, 0x75, 0x0b, 0x73, 0xba, 0xc8, 0x47, 0x03, 0xa7, 0x2c, 0xce, 0xbd, ++ 0xf8, 0x3c, 0x70, 0xda, 0xc6, 0xed, 0xac, 0x2b, 0xda, 0x32, 0x8b, 0xe2, ++ 0xb2, 0x9b, 0x67, 0xfd, 0xb3, 0x1c, 0xbc, 0x0e, 0x90, 0xcb, 0xf3, 0xca, ++ 0x31, 0xf9, 0x55, 0x9c, 0xf6, 0x6c, 0xca, 0x07, 0x7c, 0x4e, 0x3b, 0xd5, ++ 0x0b, 0xaa, 0x07, 0xaf, 0x58, 0x65, 0x6e, 0x77, 0x62, 0x45, 0x50, 0x40, ++ 0xf8, 0x53, 0xdc, 0x4a, 0x79, 0x3f, 0xd1, 0x41, 0xe1, 0xf1, 0x9c, 0xcb, ++ 0x4e, 0x74, 0xfd, 0x4a, 0x7c, 0x3f, 0xf2, 0xff, 0xf8, 0xfe, 0xd7, 0xc1, ++ 0xf7, 0xa3, 0x75, 0x02, 0xdf, 0xd7, 0xec, 0x47, 0x95, 0xcf, 0xa4, 0xec, ++ 0xa1, 0xf6, 0x94, 0x62, 0xdf, 0x94, 0x64, 0x1f, 0xfa, 0x7c, 0x02, 0x27, ++ 0xee, 0x2b, 0x9d, 0xcd, 0xf5, 0xef, 0x79, 0xdf, 0xec, 0xec, 0x8d, 0xc9, ++ 0x78, 0xbe, 0x57, 0xe4, 0x71, 0x39, 0xcb, 0x4a, 0xed, 0xc9, 0xcf, 0x59, ++ 0xbd, 0x45, 0xc4, 0x7d, 0x0c, 0x7c, 0x46, 0x76, 0xac, 0xb7, 0x76, 0x42, ++ 0x7b, 0xdb, 0x6b, 0x1c, 0xdf, 0x19, 0xd7, 0x05, 0xfa, 0xbc, 0xc2, 0x8e, ++ 0x68, 0xb8, 0xff, 0xf8, 0x3a, 0x81, 0xf3, 0xad, 0xd2, 0x24, 0xbc, 0xff, ++ 0xda, 0x3b, 0x28, 0xa7, 0x98, 0xb7, 0x0e, 0x1e, 0x4e, 0xe3, 0xfe, 0xfc, ++ 0xe6, 0x91, 0xb4, 0xbd, 0x14, 0x7f, 0x57, 0x79, 0x37, 0xce, 0x9a, 0x82, ++ 0xfd, 0xaa, 0xf3, 0x69, 0x50, 0x22, 0xfc, 0x91, 0xae, 0xbe, 0xd0, 0xe4, ++ 0x35, 0x29, 0xf6, 0x2c, 0xa3, 0x7a, 0x82, 0x52, 0x64, 0x42, 0xb9, 0x1d, ++ 0x57, 0x37, 0xf0, 0x9a, 0xb8, 0x7d, 0x1f, 0xab, 0x1b, 0x78, 0xa5, 0x8b, ++ 0xbc, 0xaf, 0xc6, 0xe9, 0x1b, 0x46, 0x7f, 0x37, 0xa5, 0x84, 0x11, 0xfd, ++ 0xc3, 0x21, 0xca, 0x33, 0xde, 0x68, 0x67, 0xce, 0x41, 0x18, 0x5f, 0x47, ++ 0xc0, 0x85, 0x8b, 0x60, 0x09, 0xde, 0xc2, 0x7b, 0x8e, 0xd7, 0x95, 0x9d, ++ 0x9d, 0xcc, 0x29, 0xcb, 0x5f, 0x5d, 0x5f, 0xc8, 0x53, 0x71, 0x86, 0x8e, ++ 0x48, 0xb6, 0x99, 0xe4, 0xbc, 0xf9, 0x04, 0x40, 0x2e, 0x33, 0xaa, 0x33, ++ 0x78, 0x79, 0xbc, 0x5f, 0x05, 0xcf, 0x86, 0x6a, 0xe9, 0x7b, 0xac, 0x52, ++ 0x93, 0x83, 0xfc, 0x59, 0x2a, 0x5e, 0x40, 0x72, 0x42, 0xfe, 0x3f, 0x15, ++ 0x27, 0x8c, 0xaa, 0x7c, 0x8c, 0xd6, 0x0a, 0x7f, 0x53, 0xe7, 0x11, 0xfe, ++ 0xa6, 0x4a, 0x8d, 0x4b, 0xb4, 0x79, 0xa9, 0xfc, 0xcf, 0x56, 0xfd, 0xd3, ++ 0x44, 0xb8, 0x23, 0x53, 0xe3, 0x9f, 0x1e, 0x6f, 0x55, 0x1f, 0xf1, 0x2f, ++ 0xb8, 0xd2, 0x04, 0xe4, 0x07, 0x7a, 0xbc, 0x6e, 0x5b, 0x69, 0xd2, 0x7a, ++ 0x67, 0x6a, 0xc5, 0x77, 0x4b, 0xbb, 0xa8, 0x6e, 0x31, 0x2d, 0xb9, 0x6e, ++ 0x21, 0xea, 0x13, 0xa9, 0xf5, 0x0a, 0xcd, 0x4e, 0x55, 0x0f, 0x7e, 0x51, ++ 0x4f, 0xfc, 0x7f, 0x3e, 0x2a, 0xf0, 0xa4, 0x40, 0x81, 0xc0, 0x37, 0xab, ++ 0x8f, 0xba, 0x4e, 0x91, 0xde, 0x27, 0xce, 0x29, 0xee, 0xf7, 0x3c, 0xf2, ++ 0x38, 0xce, 0xe3, 0x28, 0x67, 0x36, 0x88, 0x7b, 0x81, 0x4d, 0xe0, 0x5e, ++ 0x1c, 0x67, 0xa8, 0x5a, 0xf9, 0xf9, 0xb1, 0x0c, 0xa2, 0x9f, 0x0f, 0xfd, ++ 0x15, 0xd9, 0xa5, 0xd3, 0xa5, 0x3b, 0x32, 0xc9, 0x9e, 0xac, 0x94, 0x6a, ++ 0x98, 0xcc, 0xf1, 0xee, 0x31, 0xfc, 0x9b, 0xf0, 0xa9, 0xd5, 0x67, 0x5a, ++ 0x97, 0x03, 0xf9, 0xff, 0xb5, 0x0b, 0xcf, 0x12, 0xdd, 0xd7, 0xae, 0xb7, ++ 0xf0, 0xef, 0x90, 0x34, 0x7f, 0xb5, 0xfa, 0x4c, 0x63, 0xbd, 0x78, 0xbf, ++ 0x67, 0x7b, 0x3a, 0xbd, 0x9f, 0xcf, 0x9c, 0x76, 0x99, 0x9e, 0x7b, 0xdd, ++ 0xf4, 0x7c, 0xc5, 0xaf, 0x62, 0x84, 0xf4, 0xc1, 0x83, 0x74, 0x7b, 0xd4, ++ 0x9b, 0xf8, 0xe9, 0xcb, 0x12, 0xe9, 0xcb, 0xbc, 0x99, 0xfe, 0xeb, 0xa4, ++ 0x3f, 0xd5, 0x0d, 0x2a, 0x0e, 0xbe, 0x5e, 0xf8, 0xd7, 0xb5, 0xd1, 0x06, ++ 0x0b, 0x64, 0x8e, 0xf7, 0x77, 0xc7, 0x8b, 0x6f, 0xf2, 0x3c, 0xfa, 0x46, ++ 0xb4, 0x9a, 0xe3, 0xdb, 0xb9, 0x54, 0x7f, 0xad, 0x48, 0xf8, 0x8b, 0xea, ++ 0x23, 0xe8, 0x87, 0xa6, 0xfc, 0xe9, 0xfc, 0x50, 0x76, 0x9d, 0xc8, 0x07, ++ 0xef, 0x45, 0x3f, 0x44, 0xe7, 0xc9, 0x69, 0x10, 0x75, 0xc2, 0x54, 0xfe, ++ 0x9f, 0x51, 0xe3, 0xc9, 0x89, 0xfc, 0xca, 0x44, 0x76, 0x94, 0xfc, 0x88, ++ 0x69, 0x89, 0xd0, 0x1b, 0x56, 0x90, 0xf0, 0xbf, 0x32, 0xe5, 0xd7, 0xf7, ++ 0x25, 0xfc, 0xb0, 0x23, 0x82, 0xfd, 0xfc, 0x2f, 0xc1, 0xbd, 0x55, 0xb9, ++ 0xce, 0x9e, 0x20, 0x0e, 0x73, 0xab, 0xf2, 0x3b, 0xe1, 0xf7, 0x1b, 0x91, ++ 0x6f, 0x06, 0x07, 0xff, 0x8b, 0xba, 0x3f, 0x8f, 0x7a, 0x96, 0x96, 0xe7, ++ 0x68, 0x78, 0xb8, 0x96, 0x17, 0xbd, 0xa8, 0xd2, 0x59, 0x6b, 0x5f, 0x52, ++ 0xdb, 0x54, 0xbc, 0x4c, 0xc3, 0xc9, 0xf2, 0x15, 0x80, 0xae, 0x2f, 0xc1, ++ 0xc9, 0xf2, 0x09, 0x47, 0xcb, 0x21, 0xb3, 0x5d, 0xc1, 0x71, 0xbb, 0x42, ++ 0xf5, 0x0c, 0x63, 0xb8, 0x59, 0x2c, 0xc7, 0x74, 0xa7, 0x1c, 0xc7, 0xa9, ++ 0xb8, 0x9d, 0x86, 0x9f, 0xe5, 0x6d, 0xe8, 0x67, 0x14, 0x67, 0x14, 0x43, ++ 0x70, 0x1b, 0xd9, 0x97, 0x21, 0x2b, 0xb8, 0x0e, 0x4c, 0xa3, 0xef, 0xf6, ++ 0x18, 0x6c, 0x23, 0xfd, 0x0e, 0x37, 0xf0, 0x38, 0x67, 0xe8, 0xa5, 0xf7, ++ 0x7b, 0x7f, 0x41, 0xdf, 0x1b, 0x0e, 0x30, 0x07, 0xb9, 0x9f, 0xf6, 0xfe, ++ 0xb3, 0xdc, 0x4f, 0xb7, 0x63, 0x5c, 0xc3, 0xe3, 0xa1, 0xe8, 0xa7, 0x02, ++ 0xa7, 0xea, 0x17, 0xdf, 0x9b, 0xb6, 0x47, 0x98, 0x62, 0x84, 0x83, 0x0e, ++ 0xaa, 0xfe, 0xb9, 0x56, 0x01, 0x6e, 0x37, 0xda, 0xd5, 0xef, 0xfa, 0xea, ++ 0x07, 0x84, 0x5e, 0x27, 0x70, 0xa2, 0x1f, 0x49, 0xc9, 0x38, 0x51, 0x40, ++ 0x8e, 0x4f, 0xd7, 0xbe, 0x17, 0x0c, 0x0b, 0xff, 0x64, 0xf8, 0x5d, 0x5f, ++ 0x07, 0x8c, 0xf0, 0xef, 0x01, 0x3b, 0x5a, 0x99, 0x33, 0x86, 0xcf, 0x53, ++ 0x71, 0xa3, 0x54, 0xbc, 0xe8, 0x59, 0xf5, 0x3b, 0xc0, 0x09, 0x71, 0x23, ++ 0xe5, 0xeb, 0x7d, 0xef, 0xb7, 0xbd, 0x6e, 0xec, 0x7b, 0x3f, 0x8e, 0x3f, ++ 0xef, 0xf3, 0x08, 0xbb, 0xd0, 0xe8, 0x67, 0x8c, 0xd6, 0xb7, 0x99, 0x7c, ++ 0x6d, 0xfc, 0xbb, 0xdf, 0xa3, 0xcc, 0x61, 0xf4, 0xfd, 0xe8, 0x6e, 0x55, ++ 0xee, 0x57, 0xa8, 0xf8, 0xed, 0xab, 0x56, 0x21, 0x0f, 0xaf, 0x7e, 0x8b, ++ 0x85, 0x29, 0x9e, 0x5b, 0x01, 0x02, 0xa7, 0x7d, 0xf5, 0x68, 0x0b, 0xc7, ++ 0x6f, 0x5f, 0xad, 0x62, 0x4e, 0x13, 0xdd, 0x53, 0xc5, 0x6b, 0x97, 0xab, ++ 0xf4, 0xb8, 0x3b, 0x81, 0xd7, 0x3e, 0x4f, 0x78, 0xed, 0xf7, 0xd0, 0x9d, ++ 0x10, 0x4e, 0xbb, 0x42, 0xe5, 0x3f, 0x40, 0x98, 0x9f, 0xab, 0x61, 0x77, ++ 0x7a, 0x8c, 0xe2, 0x8d, 0x67, 0x2c, 0xfd, 0x05, 0xa4, 0x8f, 0xda, 0xf7, ++ 0x46, 0x5e, 0x15, 0x47, 0x4d, 0x4f, 0x83, 0x4e, 0x23, 0xfd, 0xec, 0xa9, ++ 0x73, 0x79, 0xeb, 0x6a, 0x68, 0xdc, 0x84, 0xf1, 0xce, 0x2b, 0x75, 0x06, ++ 0xf8, 0xce, 0x55, 0x8f, 0x58, 0xf7, 0x97, 0x75, 0x18, 0xa7, 0xcf, 0x07, ++ 0xa3, 0x38, 0x7d, 0x7f, 0xdd, 0x74, 0x5d, 0x9c, 0xce, 0xfb, 0xa9, 0x71, ++ 0xfa, 0x9f, 0x0a, 0xaf, 0xf5, 0xd0, 0x3d, 0x8d, 0xcf, 0xff, 0xdf, 0x93, ++ 0xc4, 0xed, 0x1e, 0xaf, 0x9d, 0xdc, 0xb8, 0x4d, 0x75, 0x06, 0xf1, 0xdf, ++ 0x0e, 0x15, 0x3f, 0x49, 0xa5, 0x6f, 0x66, 0xbd, 0x66, 0x87, 0x67, 0x38, ++ 0xb8, 0x3c, 0x8d, 0x9d, 0x1f, 0x44, 0x3d, 0x57, 0xc5, 0xbd, 0x86, 0x54, ++ 0x3f, 0x17, 0x62, 0xf2, 0x6f, 0xef, 0xe7, 0xf5, 0x2f, 0x0b, 0xaf, 0x7f, ++ 0x69, 0x76, 0x26, 0x34, 0x45, 0xac, 0xff, 0x81, 0x6a, 0x5f, 0xb4, 0xf6, ++ 0xa6, 0xda, 0x86, 0x2c, 0xc6, 0x38, 0x0d, 0xab, 0x17, 0x7e, 0xea, 0xdb, ++ 0x85, 0xca, 0xfb, 0xc4, 0xc7, 0xf2, 0xd7, 0xf4, 0xb8, 0xd9, 0x82, 0x7e, ++ 0x3d, 0x6e, 0x76, 0x6f, 0x24, 0x47, 0xd7, 0x5f, 0x18, 0xbb, 0x4b, 0x37, ++ 0xbe, 0xfa, 0xd4, 0x6c, 0xdd, 0xfb, 0x9a, 0xf8, 0x3d, 0xba, 0xf7, 0xf7, ++ 0x9d, 0xaf, 0xd2, 0xf5, 0x97, 0x0e, 0x7f, 0x4b, 0x37, 0xfe, 0xfe, 0x4f, ++ 0xdc, 0xba, 0xfe, 0x77, 0x46, 0xf4, 0xb8, 0xd9, 0x03, 0xb7, 0xf4, 0xb8, ++ 0x99, 0x26, 0xdf, 0x2e, 0x94, 0x88, 0xe4, 0x79, 0x1e, 0xdb, 0x0f, 0x74, ++ 0xe3, 0x8a, 0x5a, 0xf5, 0xf7, 0x2a, 0xee, 0xd4, 0xdf, 0x6b, 0x56, 0x97, ++ 0xfe, 0x5e, 0xda, 0xba, 0x25, 0x41, 0xfd, 0xfd, 0xe6, 0x84, 0xf4, 0xf7, ++ 0xcb, 0x21, 0x5c, 0xbf, 0xe2, 0x7f, 0x8f, 0xeb, 0xff, 0x4d, 0xad, 0xcc, ++ 0xe9, 0x7f, 0x2c, 0x3a, 0xc7, 0x4e, 0xf3, 0x76, 0x79, 0x4b, 0xed, 0x14, ++ 0xc7, 0x4c, 0x2f, 0x14, 0xf2, 0xaa, 0x8d, 0xfb, 0x1f, 0xac, 0x27, 0xe8, ++ 0xd9, 0x70, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00 ++}; ++ ++static const u8 csem_int_table_data_e1h[] = { ++ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xe3, 0x14, ++ 0x60, 0x60, 0xf8, 0x51, 0x0f, 0xc1, 0xd3, 0xf9, 0x19, 0x18, 0x36, 0xf3, ++ 0x23, 0xf8, 0xf4, 0xc0, 0xc7, 0x98, 0x19, 0x18, 0x8e, 0x83, 0x30, 0x23, ++ 0x03, 0xc3, 0x3e, 0x20, 0xde, 0x0a, 0xc4, 0x6b, 0x80, 0xf8, 0x3d, 0x03, ++ 0x03, 0xc3, 0x52, 0x20, 0x3d, 0x07, 0x88, 0x27, 0x03, 0x71, 0x17, 0x10, ++ 0xbf, 0x04, 0x8a, 0xd5, 0xb1, 0x62, 0x37, 0x87, 0x85, 0x8d, 0x81, 0x81, ++ 0x0d, 0x88, 0x4f, 0x02, 0xcd, 0x3a, 0xc5, 0x4c, 0xbc, 0xfd, 0x8a, 0x7c, ++ 0x08, 0xf6, 0x21, 0x5e, 0x06, 0x86, 0xb5, 0x40, 0x7c, 0x94, 0x97, 0xbe, ++ 0x61, 0x30, 0xd8, 0xf0, 0x0c, 0x41, 0xfa, 0xd9, 0xf5, 0x0c, 0x6a, 0xd7, ++ 0x6e, 0xd1, 0x81, 0xf7, 0x37, 0x08, 0xb3, 0x8a, 0x33, 0x30, 0x30, 0x4a, ++ 0x20, 0xf8, 0xfd, 0x12, 0xa8, 0xf2, 0x6c, 0xe2, 0x08, 0x76, 0x96, 0x0c, ++ 0x65, 0x76, 0x95, 0x01, 0xf5, 0x03, 0x00, 0x29, 0x51, 0x28, 0x15, 0x80, ++ 0x03, 0x00, 0x00, 0x00 ++}; ++ ++static const u8 csem_pram_data_e1h[] = { ++ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xed, 0x7d, ++ 0x09, 0x78, 0x54, 0x45, 0xb6, 0x70, 0xdd, 0xee, 0x7b, 0x7b, 0x49, 0xba, ++ 0x3b, 0x9d, 0x90, 0x95, 0x25, 0x74, 0x80, 0x20, 0x2a, 0x4b, 0xcb, 0x12, ++ 0x01, 0x11, 0x3b, 0x21, 0x89, 0x01, 0x03, 0x06, 0x44, 0x09, 0x28, 0xd2, ++ 0x6c, 0x21, 0x84, 0x24, 0x9d, 0x01, 0x66, 0x1e, 0x3e, 0xfd, 0xff, 0x6e, ++ 0x08, 0x42, 0xc4, 0xd1, 0x89, 0x8a, 0x1a, 0xfc, 0x19, 0x5f, 0x83, 0xe0, ++ 0x04, 0x07, 0x9d, 0xe0, 0xa0, 0x13, 0x9d, 0xc0, 0x34, 0x8b, 0x88, 0x33, ++ 0xe8, 0x04, 0xc7, 0x05, 0x97, 0x79, 0x5f, 0x40, 0x1e, 0x20, 0x42, 0x12, ++ 0xa3, 0x38, 0xe8, 0xf3, 0xc9, 0xab, 0x73, 0xaa, 0x6e, 0xba, 0xeb, 0x76, ++ 0x37, 0x69, 0xb7, 0xff, 0xf9, 0x7f, 0xff, 0x84, 0x0f, 0x8a, 0xba, 0x55, ++ 0xf7, 0xd4, 0xa9, 0xb3, 0xd5, 0xa9, 0x53, 0x75, 0x4f, 0x14, 0x92, 0x44, ++ 0x92, 0x6e, 0x20, 0xe4, 0x12, 0xfc, 0xd0, 0xf2, 0x55, 0x85, 0x10, 0x92, ++ 0x12, 0x2c, 0x3b, 0xa4, 0xce, 0xe1, 0xf2, 0xc0, 0x60, 0xfb, 0x5a, 0xaf, ++ 0x8b, 0xb8, 0x8c, 0x84, 0x3c, 0xe0, 0x35, 0x61, 0xb9, 0xde, 0x9b, 0x4e, ++ 0x5c, 0x57, 0xd0, 0xe7, 0xa3, 0x75, 0x45, 0x7e, 0x0b, 0x21, 0xf7, 0x7b, ++ 0xed, 0xf8, 0xfc, 0x71, 0x6f, 0x09, 0x96, 0x8f, 0x7a, 0x4b, 0xb1, 0x7c, ++ 0xc4, 0xeb, 0xc6, 0x7e, 0x0f, 0x79, 0xcb, 0xb1, 0xfc, 0x95, 0xb7, 0x06, ++ 0xcb, 0x7b, 0xbd, 0x45, 0xd8, 0x5e, 0xe7, 0x5d, 0x85, 0xf5, 0x1b, 0x95, ++ 0x05, 0x69, 0x30, 0x2e, 0x21, 0x2e, 0x53, 0x56, 0x32, 0x21, 0x9e, 0x97, ++ 0x07, 0x8e, 0xdc, 0x40, 0x6b, 0xeb, 0x33, 0xc7, 0x27, 0xc8, 0xa3, 0x69, ++ 0xfd, 0xaf, 0x7a, 0xa2, 0xcf, 0xa2, 0xef, 0x8d, 0x96, 0x8b, 0xfc, 0x43, ++ 0x69, 0x83, 0x5c, 0x52, 0x94, 0x35, 0x3a, 0xd8, 0x4f, 0xc5, 0xf3, 0x46, ++ 0x25, 0xaf, 0x2f, 0xc0, 0x79, 0x7c, 0xac, 0x8e, 0xf5, 0x33, 0xd5, 0xbc, ++ 0x96, 0x1d, 0xb9, 0x5f, 0x16, 0x19, 0x43, 0xf1, 0x1c, 0x2b, 0x23, 0xfe, ++ 0xc4, 0x52, 0x32, 0x39, 0x3b, 0x39, 0x62, 0xbf, 0xc1, 0x00, 0xef, 0x91, ++ 0xa1, 0x6c, 0x9e, 0xc4, 0xee, 0x7c, 0x6d, 0x50, 0x64, 0x78, 0x57, 0x03, ++ 0xbc, 0x87, 0x86, 0x72, 0xfc, 0x92, 0xed, 0x93, 0x07, 0x45, 0x86, 0xe7, ++ 0x84, 0x7e, 0xbf, 0x72, 0x72, 0x78, 0xe9, 0x9d, 0x87, 0x07, 0x46, 0xee, ++ 0x37, 0x06, 0xfa, 0xd5, 0x39, 0x39, 0xbc, 0xbe, 0x3e, 0xd3, 0x80, 0xc8, ++ 0xe3, 0x8e, 0x87, 0x7e, 0x31, 0xf0, 0x89, 0xe2, 0x44, 0x88, 0xaf, 0xc5, ++ 0xe8, 0xcf, 0xce, 0xfa, 0xfe, 0xfc, 0x22, 0x2e, 0xfa, 0x97, 0xe2, 0xd3, ++ 0xb1, 0xd7, 0xbc, 0x75, 0x83, 0x84, 0xfc, 0x9b, 0x06, 0x74, 0x5a, 0x6b, ++ 0x5f, 0x7e, 0x66, 0x0b, 0x1d, 0xa7, 0xbd, 0x65, 0x98, 0x53, 0xef, 0x20, ++ 0xe4, 0x33, 0x97, 0x33, 0xc1, 0x6e, 0x89, 0x89, 0x6f, 0xb7, 0xc0, 0x3c, ++ 0x62, 0xe0, 0x5b, 0x29, 0x8c, 0x13, 0x03, 0xdf, 0xe6, 0xc6, 0xc8, 0xb7, ++ 0x05, 0xd0, 0x2f, 0x06, 0xbe, 0x2d, 0x81, 0x7e, 0x31, 0xf0, 0xad, 0x32, ++ 0x46, 0xbe, 0xfd, 0xec, 0x27, 0xc2, 0xb7, 0x7b, 0x01, 0x8f, 0xef, 0xc1, ++ 0xb7, 0x0d, 0x31, 0xea, 0xdb, 0xaf, 0x62, 0xe4, 0xdb, 0xc6, 0x18, 0xf9, ++ 0xb6, 0x29, 0x46, 0x7d, 0x7b, 0x32, 0x46, 0xbe, 0x3d, 0x15, 0xca, 0x37, ++ 0xf5, 0xb9, 0x5a, 0xee, 0x20, 0x12, 0xda, 0xc5, 0x1b, 0x95, 0x92, 0x1d, ++ 0xd0, 0xcf, 0x93, 0xd9, 0x66, 0x1b, 0x90, 0xf5, 0x93, 0xe0, 0xdf, 0x9e, ++ 0xef, 0xa9, 0x77, 0xfb, 0x63, 0xe4, 0xdf, 0xab, 0x31, 0xf2, 0xef, 0x08, ++ 0xd0, 0x27, 0x06, 0xfe, 0x1d, 0x8d, 0x91, 0x7f, 0xef, 0xc4, 0xc8, 0xbf, ++ 0x0f, 0x62, 0xd4, 0xbb, 0x36, 0x5c, 0x67, 0x2c, 0xf2, 0x57, 0x6d, 0x43, ++ 0x08, 0xfe, 0x5c, 0x1a, 0x00, 0xff, 0x5a, 0xec, 0xa7, 0xae, 0xe6, 0x75, ++ 0x3d, 0xe0, 0x9d, 0x44, 0x48, 0x46, 0xb8, 0x1c, 0xa8, 0x25, 0xe5, 0x28, ++ 0xca, 0x83, 0x4c, 0xdc, 0xed, 0x6c, 0xdd, 0x2a, 0xf8, 0xe6, 0x52, 0x0e, ++ 0x21, 0x2b, 0x4c, 0xf4, 0xbf, 0xf4, 0x7d, 0x5f, 0x1e, 0x09, 0xe8, 0xe9, ++ 0xf8, 0x3e, 0x1b, 0xf1, 0xd7, 0x4a, 0x42, 0xff, 0xcf, 0x01, 0x4f, 0x42, ++ 0xf2, 0xbf, 0xb9, 0x94, 0x2a, 0xf4, 0xf7, 0xe9, 0x22, 0xf6, 0x27, 0x3a, ++ 0x68, 0x7f, 0x18, 0xe4, 0x8a, 0xf2, 0x7f, 0xb3, 0x77, 0x08, 0x96, 0xf5, ++ 0x5c, 0x8e, 0x36, 0x17, 0xe9, 0x50, 0x1e, 0x7c, 0xc9, 0x06, 0x94, 0xaf, ++ 0x27, 0xbc, 0x4e, 0x6c, 0x6f, 0xf0, 0x8e, 0xc5, 0xf2, 0x31, 0x2e, 0x97, ++ 0x1b, 0xb9, 0x1c, 0x3d, 0x00, 0x72, 0x77, 0x05, 0xc8, 0x61, 0x29, 0x97, ++ 0x2b, 0x26, 0x77, 0x84, 0x94, 0x38, 0xca, 0x29, 0x5d, 0x3b, 0xf6, 0xc4, ++ 0x93, 0x0d, 0x0e, 0x94, 0x2b, 0xb3, 0x04, 0x78, 0xca, 0x4c, 0xde, 0xee, ++ 0xdd, 0x73, 0xe5, 0xd6, 0x0d, 0x14, 0xfe, 0xe6, 0x1a, 0xdd, 0x95, 0xdb, ++ 0x42, 0xe4, 0xec, 0x89, 0x22, 0x55, 0xbe, 0xa8, 0x64, 0x26, 0x07, 0xfb, ++ 0x3d, 0x51, 0x7e, 0xc2, 0xb6, 0x60, 0x28, 0xd2, 0xdb, 0x06, 0x70, 0x1a, ++ 0x8a, 0x75, 0x6a, 0x3f, 0x5f, 0x68, 0xbf, 0x06, 0x77, 0x77, 0xbf, 0x5e, ++ 0xd0, 0xef, 0xb1, 0x62, 0x2e, 0x5f, 0x32, 0x09, 0x84, 0x8e, 0xfb, 0x58, ++ 0x69, 0x77, 0xbf, 0x74, 0x89, 0xd2, 0xe5, 0x5e, 0x89, 0x94, 0x36, 0x59, ++ 0xc2, 0xf9, 0x32, 0x45, 0x62, 0x7a, 0x4a, 0x15, 0x05, 0xf9, 0x21, 0x73, ++ 0xfa, 0xee, 0xcf, 0x3b, 0x4b, 0xda, 0xe8, 0xfb, 0x36, 0xfb, 0xc8, 0x34, ++ 0x42, 0xcb, 0x27, 0x41, 0x3f, 0x51, 0xff, 0x1c, 0x58, 0xaa, 0xef, 0xd7, ++ 0x53, 0x3a, 0xbb, 0x29, 0x3d, 0x32, 0x8d, 0xa4, 0xa6, 0x09, 0xf0, 0x25, ++ 0xad, 0x92, 0x42, 0xf1, 0x95, 0xc7, 0x3a, 0x12, 0x41, 0x8e, 0x1e, 0x1a, ++ 0xe7, 0x22, 0x92, 0x95, 0x90, 0xfe, 0xd0, 0x4e, 0xc7, 0xef, 0x33, 0xba, ++ 0x8d, 0x64, 0xd1, 0x32, 0x71, 0x7c, 0x1b, 0x91, 0x86, 0x41, 0x3f, 0xda, ++ 0x4e, 0xeb, 0x29, 0xbc, 0x3d, 0x63, 0x28, 0x6d, 0xa7, 0x70, 0x1e, 0x82, ++ 0x76, 0x6b, 0xb0, 0x3d, 0x95, 0xb7, 0xa7, 0x39, 0xf8, 0xfb, 0xd7, 0xb1, ++ 0xf6, 0x87, 0xbd, 0x04, 0xc7, 0x57, 0xfb, 0xdd, 0x47, 0xf9, 0xec, 0xa6, ++ 0xf8, 0xad, 0xa3, 0xf8, 0xe2, 0xf3, 0x62, 0xe2, 0x02, 0x3a, 0xca, 0x94, ++ 0x9d, 0xfe, 0x90, 0xf9, 0xcf, 0x96, 0xf4, 0x38, 0xef, 0x4a, 0x5e, 0xaa, ++ 0xf8, 0xdf, 0x97, 0x7d, 0x2a, 0x63, 0xfe, 0xd0, 0x20, 0xbe, 0xe6, 0xc1, ++ 0x17, 0x33, 0xe6, 0x87, 0xe0, 0x77, 0xdf, 0xe0, 0x39, 0x58, 0x57, 0xf1, ++ 0x31, 0x5f, 0x51, 0x89, 0xf5, 0xfe, 0xab, 0x7a, 0x53, 0x4f, 0x8c, 0xeb, ++ 0x03, 0x09, 0xa7, 0x73, 0xea, 0xcc, 0x01, 0x42, 0xbb, 0x43, 0x76, 0xa2, ++ 0x9f, 0xe6, 0x38, 0xa2, 0x27, 0x3e, 0xca, 0x2f, 0x07, 0x15, 0xcf, 0x48, ++ 0xfc, 0xf9, 0x82, 0x8a, 0xf3, 0x0f, 0xaa, 0x7f, 0x2e, 0x46, 0x0f, 0x6d, ++ 0xfb, 0xdd, 0x1a, 0x3a, 0xac, 0xcb, 0x10, 0xe9, 0x60, 0xe8, 0x2d, 0xd2, ++ 0x61, 0x5d, 0x6f, 0x91, 0x0e, 0x86, 0x3e, 0x97, 0xa7, 0xc3, 0x14, 0xc9, ++ 0x81, 0xf0, 0xa3, 0xd1, 0x43, 0x1d, 0x77, 0xc3, 0x95, 0xe2, 0xb8, 0x71, ++ 0x57, 0x89, 0xe3, 0x6e, 0xb8, 0x4a, 0x1c, 0x37, 0xee, 0xea, 0x1f, 0x66, ++ 0xdc, 0xf5, 0xfd, 0xc4, 0x71, 0x8d, 0x99, 0xe2, 0xb8, 0xeb, 0x33, 0xc5, ++ 0x71, 0x8d, 0xfd, 0xbf, 0xdf, 0xb8, 0x44, 0x76, 0xd2, 0x87, 0xcc, 0x5c, ++ 0x10, 0x07, 0xfc, 0x33, 0x4f, 0xb0, 0x6f, 0x17, 0x88, 0xfb, 0x61, 0xd0, ++ 0x6f, 0xb0, 0x73, 0xfa, 0xe4, 0xa0, 0x9d, 0x93, 0xed, 0x25, 0xc4, 0x6d, ++ 0x09, 0xf2, 0x93, 0xc8, 0xf4, 0xe5, 0x9c, 0x50, 0x38, 0x77, 0x0a, 0x76, ++ 0x95, 0xc2, 0xf9, 0x3f, 0x1c, 0x8e, 0xeb, 0xf2, 0x70, 0xec, 0x1a, 0x38, ++ 0x73, 0xb5, 0x70, 0xb6, 0x71, 0x38, 0x24, 0xd4, 0x4e, 0x87, 0xc1, 0x21, ++ 0x77, 0x68, 0xe7, 0xf1, 0x5b, 0xfe, 0x5e, 0x40, 0x17, 0x32, 0x3e, 0x5d, ++ 0x5f, 0x49, 0x89, 0x35, 0xf4, 0x3d, 0xa7, 0x66, 0xfc, 0xdb, 0xb5, 0xe3, ++ 0xef, 0x06, 0x3b, 0x06, 0xf3, 0xd0, 0x5d, 0x76, 0x7c, 0x87, 0x86, 0xae, ++ 0x73, 0xb4, 0xf8, 0xec, 0xe1, 0x70, 0x88, 0xee, 0x72, 0xf4, 0x20, 0x76, ++ 0x0d, 0x9c, 0xd9, 0x5a, 0x38, 0x87, 0x38, 0x9c, 0x80, 0x74, 0x59, 0x38, ++ 0xa5, 0xda, 0x79, 0xbc, 0xae, 0xf2, 0x55, 0x12, 0xd6, 0x2f, 0x4a, 0x8f, ++ 0x61, 0xc1, 0xf7, 0x3a, 0xf2, 0x3a, 0x4f, 0xa1, 0x1f, 0xf4, 0xa2, 0xe2, ++ 0xd8, 0x4e, 0xdb, 0xa5, 0x3f, 0x59, 0x03, 0x37, 0xd0, 0xfe, 0x47, 0xb6, ++ 0x48, 0x7e, 0x23, 0xad, 0x07, 0xf6, 0xc6, 0xe3, 0xfa, 0x71, 0x7e, 0xdb, ++ 0x74, 0xac, 0xef, 0xbb, 0xc6, 0x88, 0xeb, 0xc4, 0x79, 0xe7, 0x64, 0xbf, ++ 0x91, 0xda, 0x93, 0x49, 0x2f, 0xbc, 0x6d, 0x03, 0xfb, 0x52, 0xf5, 0x82, ++ 0x5e, 0x86, 0xba, 0x6e, 0xef, 0xc7, 0xb6, 0x36, 0x8a, 0x97, 0xc7, 0xd8, ++ 0xfa, 0xe0, 0x75, 0xf4, 0x79, 0xe7, 0x0b, 0x7a, 0xb2, 0x15, 0xa5, 0xb1, ++ 0x50, 0x07, 0x74, 0x3f, 0xc5, 0x65, 0x93, 0xac, 0x62, 0xf5, 0x32, 0x33, ++ 0xab, 0x56, 0x6d, 0xd9, 0x77, 0x27, 0xc0, 0x2d, 0x6f, 0x36, 0x12, 0x33, ++ 0x85, 0x53, 0xf5, 0xd2, 0x92, 0x69, 0xd7, 0xd1, 0xfa, 0x92, 0xc3, 0x0a, ++ 0x81, 0x2e, 0x55, 0xdb, 0x57, 0x1b, 0x7a, 0xd3, 0xfa, 0x52, 0xbf, 0xd4, ++ 0x04, 0xf5, 0x8e, 0x3c, 0x52, 0x0e, 0xfa, 0xb4, 0x66, 0xef, 0x7f, 0xb6, ++ 0xc3, 0x7a, 0x74, 0x7e, 0xb7, 0x92, 0x0d, 0xe3, 0x9f, 0xa5, 0xeb, 0x84, ++ 0x83, 0xda, 0xe3, 0x23, 0xd6, 0xd6, 0xd4, 0x99, 0x14, 0x8f, 0x0a, 0xff, ++ 0xae, 0x42, 0x78, 0xaf, 0x62, 0xa7, 0xe4, 0xa4, 0x16, 0x8e, 0xe2, 0xbb, ++ 0xfd, 0x50, 0x06, 0xe0, 0xbb, 0x43, 0x72, 0x1a, 0x29, 0xbd, 0x97, 0x35, ++ 0xc6, 0x13, 0x87, 0x6a, 0xef, 0xe8, 0xdf, 0x53, 0xbb, 0xf5, 0x38, 0xff, ++ 0xe5, 0x74, 0xfe, 0x84, 0xc2, 0x5b, 0x42, 0xea, 0x0b, 0x81, 0x9e, 0x55, ++ 0x40, 0x1c, 0x18, 0xdf, 0x69, 0xf4, 0x9b, 0xa5, 0xa0, 0xbe, 0x9d, 0xf5, ++ 0x1e, 0xc6, 0xf1, 0xd4, 0x7a, 0xd5, 0x0e, 0x3a, 0x1e, 0x7d, 0xbf, 0xfa, ++ 0x39, 0xc9, 0x09, 0x53, 0xad, 0xd6, 0x11, 0x37, 0xe0, 0xd9, 0xfe, 0x92, ++ 0xb9, 0xf4, 0x29, 0x0b, 0xcc, 0x73, 0xb5, 0x61, 0xb0, 0x15, 0xe6, 0xb7, ++ 0xde, 0x00, 0xfd, 0x96, 0xf8, 0xe7, 0xbf, 0x68, 0x76, 0x00, 0x9e, 0x5b, ++ 0x0c, 0x85, 0x80, 0xef, 0xe6, 0x2d, 0x86, 0xb2, 0xa1, 0x40, 0x3f, 0x32, ++ 0xaf, 0x64, 0x28, 0xe0, 0xf7, 0x17, 0x11, 0xbf, 0x06, 0xbd, 0x0b, 0xe6, ++ 0xbb, 0xfc, 0x1a, 0xe3, 0x56, 0x3d, 0xf0, 0xd3, 0x12, 0x18, 0x34, 0xc3, ++ 0x1a, 0x6e, 0x67, 0xcf, 0xd2, 0xf5, 0xca, 0x11, 0xb2, 0x7e, 0x56, 0x10, ++ 0x66, 0xf7, 0x89, 0xec, 0x37, 0x4c, 0x1f, 0x16, 0x7c, 0xfe, 0x92, 0x3e, ++ 0x11, 0xe5, 0x60, 0x59, 0xa3, 0x9e, 0x38, 0x42, 0xed, 0x06, 0x97, 0x0f, ++ 0xdf, 0x51, 0xc2, 0xfc, 0x98, 0x3d, 0x56, 0xff, 0xf6, 0xac, 0x20, 0x1f, ++ 0x97, 0xdb, 0xb9, 0xbc, 0x72, 0x3e, 0x2e, 0x4f, 0xe4, 0x7c, 0x95, 0x3b, ++ 0x73, 0x66, 0x0c, 0x0b, 0xc7, 0xe7, 0x41, 0xe0, 0x8b, 0x91, 0xf9, 0x47, ++ 0x50, 0x3e, 0x4c, 0xd7, 0x4d, 0x07, 0xfa, 0x3f, 0x0e, 0xa4, 0xdf, 0x63, ++ 0xd4, 0x7f, 0x72, 0xa0, 0x7f, 0xe4, 0xc4, 0xe7, 0x4f, 0x50, 0x3f, 0x09, ++ 0xca, 0xcd, 0xd4, 0x4f, 0x82, 0xf2, 0x49, 0xea, 0x27, 0x41, 0xe9, 0xa7, ++ 0x7e, 0x12, 0xf4, 0xdb, 0x4a, 0xfd, 0x24, 0x28, 0xb7, 0x51, 0x3f, 0x09, ++ 0x9e, 0x3f, 0x4d, 0xfd, 0x73, 0x28, 0x1b, 0xa9, 0x7f, 0x0e, 0xcf, 0x9f, ++ 0xa1, 0x7e, 0x39, 0x94, 0x3b, 0xbd, 0x3e, 0x7c, 0xfe, 0x9c, 0xb7, 0x0e, ++ 0xcb, 0x26, 0x6f, 0x3d, 0x96, 0xcf, 0x7b, 0x1b, 0xb0, 0xdc, 0xed, 0xf5, ++ 0x63, 0xbf, 0x17, 0xbd, 0x8d, 0x58, 0x36, 0x7b, 0x9b, 0xf0, 0xf9, 0xcb, ++ 0xde, 0x66, 0x2c, 0x5b, 0xbc, 0x01, 0x2c, 0xf7, 0x02, 0x9f, 0x69, 0x19, ++ 0xf0, 0xb6, 0x62, 0xb9, 0xdf, 0x7b, 0x0c, 0xcb, 0x83, 0xde, 0x36, 0x7c, ++ 0xef, 0x90, 0xf7, 0x0c, 0x96, 0xbf, 0xe4, 0x74, 0xb7, 0x4d, 0x20, 0xb9, ++ 0x32, 0x95, 0x17, 0x9b, 0x8b, 0xd8, 0x81, 0x4d, 0x49, 0xc5, 0xae, 0x5c, ++ 0xf0, 0x57, 0x92, 0x4a, 0x58, 0x3d, 0xf5, 0x0e, 0x5f, 0xae, 0x81, 0xd6, ++ 0x53, 0xdd, 0xb4, 0x4e, 0xe9, 0xd8, 0xbb, 0x32, 0x90, 0x6b, 0xa4, 0xf5, ++ 0xde, 0x35, 0xac, 0x3d, 0xf3, 0x1e, 0x92, 0x67, 0xa2, 0xf5, 0x4c, 0x1f, ++ 0x6b, 0x1f, 0xf0, 0x4b, 0x57, 0x9e, 0x99, 0xd6, 0x07, 0xd4, 0xb3, 0xf6, ++ 0xc1, 0x9b, 0x7d, 0x79, 0x71, 0xb4, 0x3e, 0xd8, 0xcf, 0xda, 0xaf, 0xda, ++ 0x19, 0xc8, 0x8b, 0xa7, 0xf5, 0xab, 0x9a, 0x58, 0xfb, 0xf0, 0x16, 0x32, ++ 0xc9, 0x42, 0xeb, 0xc3, 0x03, 0xac, 0x3e, 0xf2, 0x88, 0x6b, 0x92, 0x95, ++ 0xd6, 0x47, 0xb6, 0xb2, 0x7a, 0xce, 0x87, 0xbe, 0x49, 0x36, 0x5a, 0xcf, ++ 0x69, 0x63, 0xef, 0x8f, 0x3f, 0x17, 0x98, 0x94, 0x40, 0xeb, 0xe3, 0x3b, ++ 0x59, 0xfb, 0xc4, 0xaf, 0x49, 0xbe, 0x9d, 0xd6, 0x27, 0x12, 0x09, 0xeb, ++ 0x79, 0x96, 0xdc, 0xfc, 0x44, 0x5a, 0xcf, 0xb3, 0xb3, 0x7a, 0x61, 0xdf, ++ 0xf9, 0xb2, 0x23, 0xc2, 0xfa, 0xbe, 0x57, 0x69, 0x5b, 0x08, 0x26, 0xed, ++ 0xe7, 0xba, 0x9c, 0x5c, 0x99, 0xfa, 0x09, 0x7b, 0x0d, 0x6d, 0x2b, 0xc0, ++ 0xe4, 0xae, 0xd7, 0xdd, 0x90, 0x2b, 0x8f, 0xa3, 0xf4, 0x53, 0xc8, 0x22, ++ 0x68, 0xdf, 0xa4, 0x2b, 0x62, 0x75, 0x03, 0x59, 0x09, 0xed, 0xbf, 0xd5, ++ 0x4d, 0xc7, 0xfa, 0x7e, 0xc5, 0x81, 0xed, 0x7b, 0x74, 0x73, 0x58, 0xdd, ++ 0xe0, 0xc0, 0xf6, 0xbf, 0xea, 0x16, 0x62, 0xfd, 0xa0, 0xe2, 0xc2, 0xf6, ++ 0xe3, 0xba, 0x4a, 0x56, 0x37, 0xb8, 0xb0, 0xfd, 0x33, 0xdd, 0xcf, 0x71, ++ 0xbc, 0x43, 0x8a, 0x1b, 0xdb, 0x15, 0xfd, 0xff, 0x66, 0x75, 0x83, 0x1b, ++ 0xdb, 0x1f, 0x96, 0xd7, 0xe7, 0xe6, 0xd3, 0xfe, 0x95, 0x7a, 0xb7, 0x47, ++ 0x47, 0xe5, 0xba, 0x56, 0x72, 0x97, 0x93, 0x81, 0x20, 0xaf, 0x4d, 0xe9, ++ 0x60, 0x0f, 0xd7, 0x71, 0xbf, 0x75, 0x96, 0xce, 0x81, 0x72, 0xbf, 0x2e, ++ 0xc3, 0x80, 0x7a, 0xb6, 0xf7, 0xbf, 0x72, 0x9e, 0x42, 0x3d, 0x83, 0x9f, ++ 0x64, 0xa8, 0x97, 0x3d, 0x0d, 0x7e, 0x2f, 0x85, 0xb3, 0x0a, 0xe1, 0x28, ++ 0x14, 0x8e, 0xbe, 0x67, 0x38, 0x13, 0xbf, 0x19, 0x2b, 0xc0, 0x99, 0xf8, ++ 0x4d, 0xb9, 0x0a, 0x67, 0x35, 0xc2, 0x31, 0xc7, 0x06, 0x67, 0xef, 0x37, ++ 0xe3, 0x45, 0x7c, 0xbe, 0xa9, 0x50, 0xe1, 0x6c, 0xd0, 0x51, 0x7b, 0x5f, ++ 0x6b, 0x8d, 0x6d, 0x5e, 0x13, 0x2f, 0x4d, 0x10, 0xf1, 0xb9, 0x54, 0xa9, ++ 0xc2, 0x79, 0x04, 0xf1, 0x49, 0x8c, 0x0d, 0x9f, 0x80, 0x72, 0xad, 0x00, ++ 0x27, 0xa0, 0x2c, 0x51, 0xe1, 0x6c, 0x46, 0x38, 0x29, 0xb1, 0xe1, 0xe3, ++ 0x32, 0x8c, 0x13, 0xe0, 0xb8, 0x0c, 0x4b, 0x55, 0x38, 0xdb, 0x11, 0x4e, ++ 0x46, 0x6c, 0x70, 0x02, 0x86, 0xeb, 0x44, 0x7c, 0x0c, 0xcb, 0x54, 0x38, ++ 0xcf, 0x21, 0x7d, 0xfa, 0xc5, 0x36, 0x2f, 0x97, 0xf1, 0x7a, 0x11, 0x1f, ++ 0x63, 0x95, 0x0a, 0xe7, 0x0f, 0x88, 0x4f, 0x56, 0x6c, 0x70, 0xf6, 0x5b, ++ 0x45, 0xfa, 0xec, 0xb7, 0x76, 0xd3, 0x27, 0x80, 0x70, 0xb2, 0x63, 0x9b, ++ 0x57, 0x9e, 0x4d, 0xa4, 0x4f, 0x9e, 0xad, 0x9b, 0x3e, 0xaf, 0x21, 0x9c, ++ 0x2b, 0x63, 0x83, 0xb3, 0xdf, 0x26, 0xd2, 0x67, 0xbf, 0xad, 0x9b, 0x3e, ++ 0x6f, 0x22, 0x9c, 0x61, 0xb1, 0xcd, 0x2b, 0x2f, 0x41, 0xa4, 0x4f, 0x5e, ++ 0x42, 0x37, 0x7d, 0x3e, 0x40, 0x38, 0xd7, 0xc4, 0x86, 0xcf, 0xc1, 0x14, ++ 0x91, 0x3e, 0x07, 0x53, 0xba, 0xe9, 0x73, 0x12, 0xe1, 0x8c, 0x89, 0x0d, ++ 0x9f, 0xfc, 0x54, 0x91, 0x3e, 0xf9, 0xa9, 0xdd, 0xf4, 0x39, 0x8f, 0x70, ++ 0xc6, 0xc5, 0x06, 0xe7, 0x60, 0xaa, 0x48, 0x9f, 0x83, 0xa9, 0xdd, 0xf4, ++ 0xf9, 0x02, 0xe1, 0x5c, 0x1f, 0xdb, 0xbc, 0xf2, 0xd3, 0x44, 0xfa, 0xe4, ++ 0xa7, 0x75, 0xd3, 0xe7, 0x12, 0xc2, 0xc9, 0x75, 0x37, 0x22, 0x3e, 0x84, ++ 0xc2, 0xb1, 0x46, 0x87, 0x73, 0xa8, 0x9f, 0x48, 0x9f, 0x43, 0xfd, 0xba, ++ 0xe9, 0x63, 0xd2, 0x03, 0x9c, 0x02, 0x0a, 0x67, 0x60, 0xcf, 0x70, 0x0a, ++ 0x33, 0x45, 0xfa, 0x14, 0x66, 0x76, 0xd3, 0x27, 0x51, 0x0f, 0x7a, 0x31, ++ 0x39, 0x36, 0x38, 0x87, 0x32, 0x45, 0xfa, 0x1c, 0xca, 0xec, 0xa6, 0x4f, ++ 0x6f, 0xc4, 0x67, 0x6a, 0x6c, 0xf3, 0x2a, 0xec, 0x2f, 0xd2, 0xa7, 0xb0, ++ 0x3f, 0xa3, 0x8f, 0xc7, 0xd8, 0x39, 0xc9, 0x0e, 0x7e, 0x63, 0x22, 0x71, ++ 0x6e, 0xa5, 0xaf, 0x4c, 0x4a, 0xfe, 0xd9, 0x41, 0x58, 0x77, 0x14, 0x0b, ++ 0x71, 0x02, 0xd8, 0x23, 0x52, 0x60, 0x1b, 0xc0, 0xa7, 0x6b, 0x2b, 0xfa, ++ 0xa5, 0xb2, 0x53, 0xf5, 0x83, 0x9c, 0x04, 0xfc, 0xdc, 0x62, 0x9b, 0xc3, ++ 0x09, 0xf1, 0x00, 0xbd, 0xea, 0xef, 0x90, 0x56, 0xdc, 0x8f, 0x58, 0x76, ++ 0x26, 0x0a, 0xf1, 0xa6, 0x97, 0xf4, 0x79, 0xc3, 0x01, 0x5f, 0x2b, 0xf5, ++ 0x0a, 0x43, 0xfd, 0x9e, 0x84, 0xb1, 0x71, 0x82, 0xbf, 0x95, 0xe8, 0x4a, ++ 0x12, 0xea, 0xbd, 0x8a, 0x7a, 0x0b, 0xfd, 0x53, 0x4a, 0x06, 0x08, 0xed, ++ 0x69, 0xa5, 0x57, 0x09, 0xed, 0x19, 0xee, 0x91, 0x42, 0xbd, 0x4f, 0xf9, ++ 0x78, 0xa1, 0x7f, 0xbf, 0x9a, 0x3c, 0xa1, 0xde, 0x7f, 0xd5, 0x14, 0xa1, ++ 0x7f, 0x96, 0x6f, 0x86, 0x50, 0x1f, 0x58, 0x37, 0x47, 0xe8, 0x9f, 0x5d, ++ 0xbf, 0x40, 0x68, 0xbf, 0xa2, 0xa1, 0x42, 0x68, 0xbf, 0xd2, 0xbf, 0x5c, ++ 0xa8, 0x5f, 0xdd, 0xf8, 0xaf, 0x42, 0xff, 0x61, 0x4d, 0x6b, 0x84, 0xf6, ++ 0x11, 0xcd, 0x1b, 0x84, 0xf6, 0x6b, 0x02, 0x0f, 0x0b, 0xf5, 0x51, 0x87, ++ 0x9f, 0x10, 0xfa, 0x8f, 0x69, 0xdd, 0x2a, 0xb4, 0x5f, 0x7b, 0xec, 0x19, ++ 0xa1, 0x7d, 0x5c, 0xdb, 0xf3, 0x42, 0xfd, 0xba, 0x33, 0x2f, 0x0b, 0xfd, ++ 0xaf, 0xef, 0xdc, 0x2f, 0xd4, 0x6f, 0xb8, 0xf8, 0x67, 0xa1, 0x7f, 0x2e, ++ 0xf9, 0x9b, 0x50, 0x9f, 0x64, 0xfa, 0x40, 0xe8, 0x5f, 0x60, 0xff, 0x48, ++ 0x68, 0xbf, 0x31, 0xfd, 0x13, 0x8d, 0x1f, 0x2b, 0xc6, 0x2f, 0x6a, 0x73, ++ 0x09, 0xf3, 0x67, 0x33, 0x0c, 0xe8, 0xcf, 0x06, 0xac, 0x06, 0xac, 0x1b, ++ 0xf6, 0x9a, 0xd9, 0xfe, 0x06, 0xea, 0xc9, 0x10, 0x87, 0x28, 0xc6, 0xba, ++ 0x61, 0xff, 0x42, 0x47, 0x32, 0xc4, 0x03, 0x00, 0x00, 0xf5, 0x27, 0x72, ++ 0x7b, 0x97, 0x5f, 0x01, 0xf1, 0xaa, 0x5f, 0x8c, 0x77, 0x5f, 0x01, 0x71, ++ 0xdc, 0x5f, 0x18, 0xdc, 0x23, 0xec, 0x11, 0xfc, 0xa0, 0x76, 0xd9, 0x7d, ++ 0x8f, 0x1e, 0xe3, 0x89, 0xad, 0x12, 0x49, 0x87, 0xd2, 0xa1, 0x83, 0x32, ++ 0x4e, 0xcf, 0xe3, 0x09, 0x46, 0x26, 0xbf, 0xeb, 0xb3, 0x72, 0x9e, 0xf2, ++ 0x85, 0xe8, 0x41, 0x5d, 0x3f, 0xea, 0x5f, 0xd0, 0xfa, 0x7a, 0x3d, 0xc5, ++ 0x63, 0x4c, 0x50, 0x7f, 0xd6, 0xf7, 0x2b, 0x4b, 0x9f, 0x1f, 0x32, 0xce, ++ 0xba, 0x7e, 0x86, 0xd2, 0xad, 0x43, 0xd9, 0xf3, 0x85, 0x16, 0x18, 0xaf, ++ 0xe4, 0x3e, 0x18, 0xcf, 0x63, 0xe8, 0x1c, 0x0c, 0x78, 0x69, 0xc7, 0x31, ++ 0x0e, 0x18, 0x2b, 0x8c, 0x63, 0xca, 0x2c, 0xc7, 0x71, 0x36, 0xc2, 0x38, ++ 0x29, 0xc1, 0x71, 0x8c, 0x99, 0xe5, 0x9a, 0x71, 0x4c, 0xa5, 0x5b, 0xf9, ++ 0x73, 0x3e, 0xce, 0x63, 0xa0, 0x37, 0xd1, 0xc6, 0x59, 0x3f, 0x60, 0xbc, ++ 0x38, 0x9f, 0xcc, 0x0a, 0x1c, 0x67, 0x8b, 0x66, 0x9c, 0xf5, 0x99, 0x15, ++ 0x9a, 0x71, 0xe2, 0xd8, 0x7c, 0xe8, 0x73, 0x3e, 0xce, 0x53, 0x97, 0x1b, ++ 0xc7, 0x38, 0x70, 0x82, 0x38, 0x9f, 0xfe, 0x95, 0x38, 0xce, 0x73, 0xda, ++ 0xf9, 0xf4, 0xaf, 0xd4, 0x8c, 0x63, 0xc1, 0x71, 0xe0, 0x39, 0x8c, 0x43, ++ 0xfa, 0xd2, 0x5d, 0x4c, 0x1a, 0xe5, 0xb3, 0xb1, 0xb3, 0x0c, 0xe5, 0xe0, ++ 0x4f, 0x66, 0x8c, 0x93, 0x19, 0xfa, 0x54, 0xfc, 0x06, 0xea, 0xe4, 0x03, ++ 0x33, 0xc9, 0x86, 0x71, 0x1c, 0x74, 0x5c, 0xda, 0x8f, 0x0c, 0x49, 0xa2, ++ 0x42, 0x4d, 0xc8, 0xbf, 0xe8, 0x93, 0x90, 0x3f, 0x5f, 0xc4, 0x51, 0xfe, ++ 0x87, 0xc4, 0xd3, 0x82, 0xfb, 0x71, 0x1f, 0xee, 0xeb, 0x17, 0x73, 0x14, ++ 0x89, 0x9f, 0x62, 0x44, 0xf7, 0x49, 0xd5, 0x5c, 0x36, 0x17, 0xed, 0x9c, ++ 0x9e, 0xb9, 0xc2, 0x41, 0xcb, 0xe6, 0x03, 0x83, 0x1e, 0x81, 0x71, 0x36, ++ 0x5a, 0x9d, 0xd9, 0xb4, 0xde, 0xde, 0x3c, 0xc9, 0xb0, 0x30, 0x82, 0x3c, ++ 0x2d, 0xae, 0x57, 0x4e, 0xb5, 0x85, 0xc8, 0x79, 0xf7, 0xfe, 0x2c, 0x8f, ++ 0x0c, 0xa9, 0xa1, 0xe3, 0xaf, 0x88, 0xb3, 0x23, 0x3e, 0x6a, 0x5d, 0x2d, ++ 0x93, 0x74, 0xe2, 0xf3, 0x13, 0x74, 0xdf, 0x45, 0xe8, 0xfe, 0xe4, 0x43, ++ 0xba, 0x4f, 0x21, 0x74, 0xbf, 0xf2, 0x91, 0xc2, 0xf6, 0x99, 0xff, 0x4e, ++ 0xf7, 0x67, 0x50, 0x6f, 0xa3, 0xfb, 0x33, 0x68, 0x27, 0x64, 0x35, 0xbe, ++ 0x77, 0x82, 0xc7, 0x99, 0x4f, 0xfc, 0x52, 0xf2, 0x03, 0xbd, 0xbf, 0xb8, ++ 0xeb, 0x67, 0x0a, 0xae, 0x13, 0x3e, 0xf2, 0x56, 0x7a, 0x2a, 0x44, 0x13, ++ 0xd8, 0xcf, 0xbc, 0x55, 0xf1, 0x94, 0x09, 0x41, 0xfc, 0xe6, 0xfb, 0x7a, ++ 0x09, 0x75, 0x6a, 0x8e, 0xfb, 0xe8, 0xd2, 0x71, 0x5f, 0x8b, 0xf1, 0x83, ++ 0xce, 0x97, 0x8c, 0xfe, 0xad, 0x40, 0xd7, 0xba, 0x3e, 0x94, 0xa6, 0xbc, ++ 0xdf, 0x00, 0x42, 0xde, 0xdd, 0x3b, 0xf5, 0x90, 0x64, 0xc3, 0x6a, 0x1f, ++ 0xdd, 0x58, 0x42, 0x66, 0xd6, 0x4c, 0x2f, 0x48, 0x43, 0x2d, 0x92, 0xfa, ++ 0x2d, 0xa7, 0x78, 0xce, 0xd8, 0x7d, 0x8d, 0x42, 0xdf, 0x20, 0xed, 0x4a, ++ 0xdb, 0x9d, 0x4e, 0x4b, 0x10, 0x2e, 0x71, 0x29, 0x27, 0x80, 0x3e, 0x26, ++ 0xfa, 0x07, 0xe0, 0xdc, 0x52, 0x44, 0xeb, 0x21, 0xe3, 0xdf, 0x5a, 0x22, ++ 0xd6, 0x67, 0x11, 0x39, 0x58, 0xa7, 0xfc, 0x3e, 0xa9, 0x1f, 0x40, 0x58, ++ 0xfc, 0x9f, 0x8f, 0xeb, 0x70, 0x29, 0xc0, 0xd7, 0x12, 0x3a, 0xc7, 0x0c, ++ 0xca, 0xea, 0x59, 0x50, 0x8e, 0x84, 0x66, 0x16, 0xaf, 0x29, 0xb5, 0xb3, ++ 0x77, 0x55, 0x7c, 0x3c, 0x0b, 0x15, 0x12, 0xc0, 0xfd, 0xb5, 0x2f, 0x05, ++ 0xe2, 0xd8, 0xc4, 0x97, 0x8c, 0xfd, 0xe6, 0xa8, 0xfb, 0x64, 0x0d, 0x7e, ++ 0xa5, 0x8a, 0xc9, 0x55, 0x42, 0xe9, 0x5a, 0x3a, 0x5f, 0x8f, 0x74, 0xd5, ++ 0xe2, 0xfb, 0xfe, 0xde, 0x78, 0x97, 0x6e, 0x38, 0x2d, 0xeb, 0x1e, 0x51, ++ 0x20, 0x34, 0xdb, 0x13, 0xfe, 0xb3, 0xdd, 0x62, 0x3b, 0x29, 0x67, 0xe3, ++ 0xa9, 0x74, 0x55, 0xe5, 0xe5, 0x14, 0xe7, 0xef, 0x09, 0xe0, 0x3f, 0x2d, ++ 0x4f, 0x03, 0xff, 0x29, 0xde, 0x27, 0x39, 0xff, 0x83, 0x72, 0xcc, 0xf8, ++ 0xef, 0x31, 0xba, 0xa7, 0x01, 0xff, 0x3b, 0x37, 0xe9, 0x09, 0xf2, 0x8b, ++ 0xf3, 0xfd, 0x36, 0xce, 0xf7, 0xc5, 0xf5, 0x22, 0xdf, 0x6f, 0x83, 0xf3, ++ 0x38, 0xda, 0xff, 0xb6, 0x95, 0x59, 0x2c, 0xde, 0xd4, 0xd0, 0x4b, 0xe0, ++ 0x2f, 0x9d, 0xb8, 0x48, 0x87, 0xfa, 0x87, 0x0a, 0xa8, 0x59, 0x0d, 0xc3, ++ 0xff, 0xef, 0x5c, 0x0e, 0xe6, 0xd4, 0xed, 0x7a, 0x05, 0xd8, 0x7b, 0x7b, ++ 0xb9, 0x66, 0x7e, 0x9c, 0x0f, 0x77, 0x72, 0x3e, 0xcc, 0xd5, 0xd0, 0xe3, ++ 0x36, 0xce, 0xb7, 0xb9, 0x9c, 0x6f, 0x4b, 0x88, 0xef, 0xde, 0x0c, 0x8c, ++ 0x5f, 0xf8, 0x15, 0x88, 0xeb, 0xcd, 0x2e, 0x97, 0x08, 0xd8, 0x0b, 0xcf, ++ 0xdd, 0x2a, 0xdf, 0xda, 0x04, 0xbe, 0xb9, 0x55, 0xbe, 0x69, 0xf0, 0xbd, ++ 0x93, 0xf3, 0xed, 0xce, 0xbb, 0x18, 0xdf, 0xb4, 0x78, 0xb7, 0x71, 0xbe, ++ 0xb5, 0x35, 0x7c, 0xa6, 0x90, 0x01, 0xe1, 0x78, 0x6b, 0xf1, 0x9c, 0xb7, ++ 0x4a, 0x33, 0x2f, 0x9f, 0x96, 0x6f, 0xf5, 0x5c, 0x2e, 0xed, 0x06, 0xf0, ++ 0xa7, 0xa6, 0xbb, 0x72, 0x57, 0x9c, 0x0c, 0xe9, 0x7f, 0x4b, 0xd1, 0xe4, ++ 0x15, 0x27, 0x43, 0xec, 0xc2, 0xad, 0x25, 0xd3, 0x85, 0xfa, 0xac, 0xd2, ++ 0xd9, 0x42, 0xff, 0xd9, 0xee, 0xf9, 0x42, 0xfb, 0xed, 0xe5, 0x4b, 0x85, ++ 0xf6, 0xb9, 0x35, 0x3f, 0x13, 0xea, 0xf3, 0x56, 0xdd, 0x25, 0xf4, 0x9f, ++ 0xef, 0x5b, 0x2d, 0xb4, 0x2f, 0xac, 0xbb, 0x4f, 0x68, 0x5f, 0x5c, 0xff, ++ 0x90, 0x50, 0x5f, 0xd2, 0xb0, 0x49, 0xe8, 0xbf, 0xd4, 0xbf, 0x45, 0x68, ++ 0x5f, 0xd6, 0xb8, 0x43, 0x68, 0xaf, 0x6a, 0xda, 0x25, 0xd4, 0x3d, 0xcd, ++ 0x2f, 0x09, 0xfd, 0x75, 0x7b, 0xaf, 0xbc, 0x19, 0xe4, 0xeb, 0xc8, 0xdb, ++ 0x7a, 0x02, 0xf1, 0xbe, 0x0b, 0xce, 0xd3, 0x18, 0x67, 0xbc, 0xe0, 0x54, ++ 0x9c, 0xd0, 0xe7, 0xa4, 0xd7, 0x81, 0x72, 0x7c, 0xca, 0x3b, 0x04, 0xcb, ++ 0x33, 0x5e, 0x27, 0xca, 0xf9, 0x59, 0xef, 0x58, 0x2c, 0xab, 0x41, 0x26, ++ 0xc7, 0x81, 0x9d, 0x3d, 0x60, 0x81, 0xf8, 0xa9, 0x27, 0x8e, 0xda, 0xfd, ++ 0x44, 0xba, 0x8e, 0xcb, 0xe3, 0xd6, 0xd4, 0x4d, 0x80, 0xf5, 0x86, 0xb6, ++ 0x8f, 0x27, 0xe4, 0x5f, 0xe5, 0x1b, 0xd6, 0xf8, 0xfa, 0x52, 0x2d, 0x80, ++ 0xb8, 0x37, 0xa5, 0x7f, 0x71, 0x83, 0x81, 0x04, 0x46, 0x11, 0x2a, 0xdd, ++ 0xbd, 0xbb, 0xe5, 0xb9, 0x53, 0x1f, 0xd2, 0xde, 0xd6, 0x43, 0x7b, 0x83, ++ 0x4c, 0x02, 0xbd, 0xc2, 0xdb, 0x8b, 0xdb, 0x22, 0x3f, 0xef, 0x90, 0x3a, ++ 0x07, 0x67, 0x40, 0x5c, 0xf6, 0x3d, 0x23, 0xd9, 0x1e, 0x12, 0x6f, 0x0c, ++ 0x3f, 0x6f, 0x21, 0x7d, 0xc0, 0xaf, 0x88, 0xd6, 0x7e, 0x4e, 0x47, 0xca, ++ 0x43, 0xcf, 0x7b, 0xb6, 0xca, 0xec, 0x9c, 0xe7, 0x88, 0x3e, 0x6f, 0xab, ++ 0x4c, 0xf1, 0xaa, 0x34, 0x30, 0xfd, 0xaf, 0x7c, 0x3e, 0x23, 0x8f, 0xd8, ++ 0xa0, 0x1e, 0x18, 0x5c, 0x63, 0xb9, 0xcc, 0x78, 0x4d, 0x14, 0x99, 0x34, ++ 0xe0, 0xf3, 0x40, 0x41, 0xef, 0x97, 0x34, 0x5c, 0x1d, 0xd4, 0x73, 0x02, ++ 0xe3, 0x30, 0x7b, 0xba, 0xd4, 0x3f, 0x4a, 0x78, 0xbe, 0xac, 0xf1, 0x3a, ++ 0xe1, 0xbd, 0x37, 0x24, 0xf7, 0x16, 0xc0, 0xe3, 0xdc, 0x3e, 0x3d, 0xae, ++ 0xd7, 0x24, 0x70, 0x20, 0xf3, 0x96, 0x61, 0x80, 0x9f, 0x6b, 0xab, 0x0c, ++ 0xeb, 0x68, 0x73, 0x0a, 0xfa, 0x5d, 0xad, 0x5e, 0xd7, 0x8a, 0x93, 0x0a, ++ 0x21, 0x6f, 0x7a, 0x8b, 0xb0, 0x7c, 0xcb, 0x5b, 0x82, 0xe5, 0x3b, 0xde, ++ 0x52, 0x2c, 0x8f, 0x79, 0xdd, 0x58, 0xbe, 0xef, 0x2d, 0xc7, 0xf2, 0x43, ++ 0x6f, 0x0d, 0x96, 0xff, 0xee, 0x5d, 0x85, 0x65, 0x9b, 0xd7, 0x87, 0xe5, ++ 0x09, 0x6f, 0x1d, 0x96, 0x27, 0xbd, 0xf5, 0x58, 0x9e, 0xf2, 0x36, 0x60, ++ 0x79, 0xc6, 0xeb, 0xc7, 0xf2, 0xac, 0xb7, 0x11, 0xcb, 0x73, 0xde, 0x26, ++ 0x2c, 0xdb, 0xbd, 0xcd, 0x58, 0xaa, 0xf6, 0xb3, 0x27, 0xf9, 0x3b, 0xc3, ++ 0xd7, 0xd7, 0xb3, 0x20, 0x87, 0xc6, 0x70, 0x39, 0x3b, 0xb8, 0x76, 0xde, ++ 0x9a, 0xba, 0xbe, 0x41, 0x39, 0x3b, 0x2c, 0x97, 0xa1, 0x9c, 0xa9, 0xf4, ++ 0x2d, 0x6e, 0x30, 0x72, 0x79, 0x48, 0x15, 0xe4, 0xe1, 0xaf, 0xb0, 0x0e, ++ 0xa7, 0x80, 0xbc, 0xf4, 0xd0, 0xde, 0xa0, 0x70, 0x39, 0x8c, 0xf6, 0x7e, ++ 0xe4, 0x76, 0x90, 0xb7, 0xde, 0x3f, 0x82, 0xbc, 0x11, 0xb2, 0x06, 0xe5, ++ 0xc0, 0x02, 0x72, 0xf7, 0x3d, 0xe4, 0x8d, 0xc0, 0x29, 0x42, 0x0a, 0xc8, ++ 0x53, 0x1f, 0x8d, 0x3c, 0x89, 0x72, 0xa8, 0xca, 0x91, 0xaa, 0xe7, 0x6f, ++ 0x48, 0x25, 0xe7, 0x40, 0xbe, 0x54, 0xb9, 0xb2, 0xc8, 0xcc, 0x1f, 0x52, ++ 0xe5, 0xea, 0x7e, 0xf0, 0x13, 0x23, 0xf8, 0x5b, 0xbd, 0x15, 0x89, 0xaf, ++ 0x7f, 0xcc, 0x3f, 0x22, 0x81, 0x5c, 0x1d, 0x90, 0x6c, 0x39, 0x3f, 0xaf, ++ 0x20, 0x3e, 0x17, 0xd6, 0xbb, 0xf8, 0xd8, 0xb5, 0x14, 0x5c, 0x2b, 0xf4, ++ 0x93, 0xfd, 0x43, 0x60, 0x1d, 0xe9, 0x1a, 0xf2, 0xd5, 0x60, 0x88, 0xef, ++ 0x77, 0x1d, 0xa3, 0x42, 0x90, 0x15, 0x7d, 0x7e, 0x5a, 0x79, 0x89, 0x4e, ++ 0x77, 0x17, 0xee, 0x1f, 0xca, 0xfc, 0x94, 0xf9, 0xbd, 0xc2, 0xdb, 0xcd, ++ 0x71, 0x8c, 0xae, 0x66, 0x1d, 0x29, 0x22, 0x23, 0xe1, 0x7c, 0x39, 0xe7, ++ 0x98, 0x9b, 0xf2, 0x33, 0xee, 0x4f, 0x57, 0x8f, 0x84, 0x7d, 0x33, 0x7d, ++ 0x2e, 0x93, 0x24, 0x80, 0xe3, 0x77, 0x4e, 0x8f, 0x70, 0x5e, 0x40, 0x06, ++ 0x11, 0xa4, 0x73, 0x4f, 0xf4, 0x55, 0xfb, 0x9f, 0x7a, 0xe2, 0x3f, 0x73, ++ 0xe0, 0xdc, 0xdf, 0x02, 0x7a, 0x4e, 0xe7, 0x1e, 0x77, 0x40, 0x5f, 0xc3, ++ 0xf4, 0xf7, 0x29, 0xe7, 0x2d, 0x21, 0xe7, 0x4b, 0x1e, 0xa3, 0x33, 0x1d, ++ 0xe2, 0xe0, 0x9d, 0xd9, 0x06, 0x3b, 0xf3, 0x1f, 0x26, 0x89, 0x74, 0x24, ++ 0x93, 0xf0, 0xfc, 0x40, 0xa5, 0xe3, 0x81, 0xec, 0x2f, 0x06, 0xc3, 0xf9, ++ 0xcc, 0x7d, 0x54, 0x0e, 0x41, 0xbf, 0xba, 0x06, 0x0d, 0x4e, 0x20, 0x97, ++ 0x91, 0x8f, 0x9e, 0xec, 0x7d, 0x4f, 0xf4, 0x5c, 0x00, 0xf3, 0x8d, 0x89, ++ 0x9e, 0x06, 0x02, 0xe7, 0x5c, 0x94, 0x9e, 0x5b, 0xe1, 0xbe, 0x63, 0xac, ++ 0xf4, 0xec, 0xc9, 0x4e, 0xf6, 0x64, 0x1f, 0x4f, 0x6c, 0x60, 0x74, 0x3e, ++ 0xc2, 0xfd, 0xd3, 0x68, 0x74, 0x56, 0xcf, 0xc3, 0xb4, 0x78, 0xdc, 0xa2, ++ 0xc8, 0x9c, 0x0f, 0x5c, 0x8e, 0xc9, 0x1d, 0x1a, 0xfa, 0x97, 0x0a, 0xf4, ++ 0xef, 0x6b, 0x75, 0x60, 0xff, 0x83, 0x7b, 0x3f, 0xc8, 0x84, 0x73, 0xbc, ++ 0xae, 0xdd, 0x57, 0x24, 0x90, 0xa1, 0xa1, 0xef, 0x17, 0xb0, 0xf3, 0x9e, ++ 0xee, 0xf7, 0xf3, 0x05, 0x3d, 0x90, 0xfe, 0xf4, 0xf7, 0x4c, 0xd8, 0x1f, ++ 0x1f, 0x7c, 0xe1, 0x5d, 0x2c, 0xd7, 0x12, 0xa6, 0x87, 0x1b, 0x2d, 0x25, ++ 0x73, 0x95, 0x31, 0x41, 0x78, 0xb1, 0xde, 0x23, 0x88, 0x36, 0x2f, 0x8f, ++ 0x22, 0x89, 0xf3, 0xea, 0x41, 0x3f, 0x3b, 0x52, 0x55, 0xfd, 0x6c, 0xcd, ++ 0x04, 0x79, 0xda, 0xcd, 0xed, 0x40, 0xd8, 0xfc, 0x7a, 0x90, 0x4f, 0x75, ++ 0x7e, 0x07, 0x60, 0x7e, 0x14, 0xce, 0x54, 0x90, 0x69, 0x3a, 0x8f, 0x7c, ++ 0xb9, 0xe4, 0x2e, 0x61, 0x7e, 0xa3, 0x53, 0x70, 0xde, 0x3d, 0xcd, 0xcf, ++ 0x93, 0x60, 0x20, 0xd2, 0x08, 0x8a, 0x9f, 0xd5, 0x60, 0x20, 0x09, 0x54, ++ 0x1e, 0x15, 0xf7, 0x5a, 0x05, 0xf7, 0x75, 0xce, 0x36, 0x1f, 0xc4, 0x29, ++ 0xf6, 0xc6, 0x3b, 0x6b, 0x29, 0x4b, 0x3c, 0xb6, 0xb3, 0x6f, 0x04, 0x1c, ++ 0xf0, 0x9e, 0x18, 0xcf, 0x58, 0xd6, 0x68, 0xae, 0x11, 0xfd, 0xa7, 0xc4, ++ 0x1a, 0xd1, 0x7f, 0xca, 0xa8, 0x09, 0xf5, 0x9f, 0xba, 0x0e, 0x3f, 0x65, ++ 0x73, 0x53, 0xfc, 0x96, 0xa7, 0xeb, 0x6b, 0x4e, 0xf6, 0x82, 0x75, 0xce, ++ 0xc5, 0xd7, 0x39, 0xb6, 0xae, 0xaa, 0xf8, 0x55, 0x35, 0x65, 0xd5, 0x58, ++ 0x04, 0x38, 0x62, 0xbd, 0xab, 0x5e, 0x2a, 0x62, 0xf7, 0x70, 0x1c, 0x09, ++ 0x33, 0x23, 0x9c, 0xf7, 0xa9, 0xe5, 0xf2, 0x74, 0x03, 0x8e, 0x73, 0xb6, ++ 0x71, 0x60, 0x02, 0x8c, 0x7b, 0xd6, 0x6b, 0xaa, 0x61, 0xeb, 0xab, 0xbd, ++ 0x86, 0x8d, 0x9b, 0x5e, 0x13, 0xba, 0xbe, 0x56, 0xae, 0x8a, 0xaf, 0x39, ++ 0x39, 0x2a, 0x88, 0x5f, 0x34, 0xb8, 0x3f, 0x34, 0x7e, 0x54, 0x22, 0xc8, ++ 0x47, 0x26, 0x58, 0x17, 0x69, 0xdb, 0xc0, 0xe8, 0xfd, 0xa3, 0xf2, 0x53, ++ 0xfe, 0xdc, 0x80, 0xe7, 0xea, 0x2d, 0xca, 0x17, 0xe0, 0xbf, 0x9b, 0x87, ++ 0xa8, 0xfe, 0xbb, 0x8c, 0x75, 0x15, 0xae, 0xa7, 0x49, 0xef, 0x33, 0x8e, ++ 0x80, 0xe7, 0x3b, 0x85, 0xf1, 0xe8, 0x7b, 0x0e, 0xf5, 0x6c, 0x1c, 0xde, ++ 0x8b, 0x2e, 0x37, 0x32, 0x39, 0xa5, 0xf2, 0x53, 0x0f, 0xe7, 0x5d, 0x84, ++ 0xef, 0x0f, 0x4c, 0xc8, 0x67, 0x37, 0x85, 0x98, 0x40, 0xe1, 0x75, 0xc8, ++ 0x96, 0x3a, 0x90, 0x2b, 0xbf, 0xc2, 0xf4, 0xd9, 0xc3, 0xe5, 0xb4, 0xca, ++ 0xd4, 0x66, 0x70, 0x3b, 0x90, 0xdc, 0xad, 0x20, 0xd7, 0x0b, 0xc6, 0xaa, ++ 0x72, 0xee, 0x98, 0xf5, 0x01, 0xb5, 0xd3, 0x1f, 0xff, 0x45, 0xc1, 0x7b, ++ 0x66, 0xe4, 0x6b, 0x0a, 0x3d, 0x27, 0x78, 0xd5, 0x61, 0x11, 0x29, 0xb1, ++ 0x41, 0x50, 0x75, 0xc1, 0xee, 0x65, 0xc5, 0xb0, 0x6e, 0x7f, 0xfc, 0xe2, ++ 0x4d, 0x7c, 0x9f, 0x5e, 0x9f, 0x03, 0xf3, 0x3e, 0x4f, 0x74, 0x45, 0x60, ++ 0x97, 0xce, 0x93, 0x37, 0x6d, 0xa3, 0x42, 0xf4, 0xf5, 0xb4, 0xc2, 0xe2, ++ 0x58, 0xa4, 0x8e, 0xed, 0x73, 0x7c, 0xf4, 0x0f, 0xcc, 0x6f, 0x71, 0xbd, ++ 0xb8, 0xef, 0x59, 0xd2, 0x20, 0xd6, 0xcb, 0xc8, 0x8c, 0x54, 0xb0, 0xb7, ++ 0x65, 0x1b, 0x15, 0xe2, 0xa7, 0xb8, 0x2f, 0x85, 0x7d, 0x93, 0x3a, 0x6f, ++ 0x6a, 0x7f, 0xdf, 0x55, 0xec, 0x88, 0xdc, 0x12, 0x52, 0xb3, 0x0e, 0xf6, ++ 0xe9, 0x8f, 0x29, 0x2c, 0xde, 0xb3, 0xc0, 0x4e, 0xe4, 0x3e, 0xd4, 0x5e, ++ 0x57, 0xfd, 0xe1, 0xd7, 0x39, 0x10, 0xf7, 0x69, 0x57, 0x98, 0xbf, 0xab, ++ 0x9e, 0x87, 0x2f, 0x4d, 0x62, 0xfb, 0xc1, 0x8a, 0x99, 0x7e, 0x83, 0x8b, ++ 0xf6, 0xff, 0x68, 0xf7, 0xa8, 0xdb, 0xa8, 0xc5, 0xa5, 0xef, 0xfb, 0xd7, ++ 0xa1, 0xff, 0x33, 0x9d, 0x38, 0xb7, 0x93, 0x70, 0xba, 0x2f, 0xac, 0x13, ++ 0xf1, 0xeb, 0x09, 0x7f, 0x2d, 0xbe, 0xaa, 0x1f, 0x14, 0x76, 0x2e, 0xcf, ++ 0xf1, 0x48, 0x6e, 0x94, 0x22, 0xde, 0x97, 0xfa, 0x9a, 0xdb, 0x39, 0x55, ++ 0x3f, 0x92, 0x0c, 0x76, 0x21, 0xee, 0x93, 0xa6, 0xa9, 0xab, 0x72, 0xa0, ++ 0x70, 0x39, 0xf0, 0x2b, 0x6e, 0xab, 0x21, 0x85, 0xf1, 0x1d, 0xf8, 0x28, ++ 0xc9, 0x9d, 0x06, 0x77, 0x48, 0x3f, 0x43, 0xb0, 0x5f, 0x92, 0x61, 0x4c, ++ 0xf4, 0x7e, 0x46, 0xe8, 0xa7, 0xc7, 0x7e, 0x69, 0xac, 0x5f, 0x67, 0x21, ++ 0xee, 0x8f, 0x09, 0x95, 0xa7, 0xa1, 0xc1, 0x7e, 0xe6, 0x20, 0xbc, 0xbe, ++ 0x6c, 0x5c, 0xb1, 0x5f, 0xd5, 0x1f, 0x9e, 0x7d, 0xd1, 0x47, 0xe5, 0xa5, ++ 0xe2, 0x77, 0x8f, 0xda, 0x08, 0x5d, 0x37, 0x3f, 0x96, 0xeb, 0x53, 0x9d, ++ 0xf4, 0x79, 0xe5, 0xf6, 0x7b, 0x6d, 0x2e, 0x5a, 0x9e, 0x91, 0x7d, 0x36, ++ 0xe0, 0xe7, 0xc7, 0x7e, 0x7d, 0xc4, 0xfb, 0xbe, 0xb7, 0x18, 0x54, 0x7a, ++ 0xb8, 0x2c, 0x12, 0xc4, 0xd3, 0xb8, 0x7c, 0x92, 0x3a, 0x1f, 0xc6, 0x29, ++ 0xbe, 0xd8, 0xae, 0xd8, 0xf1, 0x1c, 0xa1, 0xd1, 0x18, 0x30, 0x52, 0xf9, ++ 0xac, 0xde, 0xbd, 0xb4, 0x98, 0x0c, 0xc7, 0xfa, 0x71, 0x56, 0x5f, 0xff, ++ 0xa9, 0x1e, 0xea, 0xcd, 0x22, 0xbf, 0x2a, 0x7e, 0xf3, 0x68, 0xaa, 0x83, ++ 0xdd, 0x13, 0x62, 0xf1, 0x24, 0x12, 0x40, 0x3f, 0xb7, 0x7a, 0xdb, 0x7f, ++ 0x14, 0xc2, 0x7a, 0xe1, 0x21, 0x9d, 0x28, 0x67, 0xda, 0xf7, 0x60, 0xfc, ++ 0x8b, 0x49, 0xa8, 0xd7, 0xf3, 0x0d, 0x09, 0xe1, 0xed, 0x78, 0x31, 0x38, ++ 0x15, 0xde, 0x67, 0x3f, 0x9e, 0xdd, 0xf7, 0x7f, 0xaa, 0xb7, 0x41, 0x39, ++ 0xf9, 0x34, 0xe8, 0x91, 0x47, 0x23, 0x27, 0xe5, 0xdc, 0x6f, 0x05, 0x7a, ++ 0xc1, 0x7e, 0x3f, 0xdf, 0x60, 0x4d, 0x46, 0x7b, 0x7f, 0x2d, 0xb9, 0x16, ++ 0xf4, 0x5d, 0xa5, 0x0b, 0xf1, 0x33, 0xff, 0xb5, 0x76, 0xc7, 0xe3, 0xc3, ++ 0x8f, 0x53, 0xbc, 0xce, 0x6d, 0xfb, 0x8b, 0x4d, 0x1a, 0x1a, 0x6a, 0x27, ++ 0x98, 0xbc, 0x75, 0x35, 0x2d, 0xfc, 0x37, 0x93, 0x2e, 0xba, 0x3d, 0x69, ++ 0xa7, 0xf2, 0x18, 0xea, 0x27, 0x51, 0xc0, 0xf8, 0x9e, 0xa3, 0x99, 0xfb, ++ 0xdd, 0x2d, 0xac, 0xac, 0x54, 0x02, 0x36, 0xb8, 0x8f, 0x53, 0xb9, 0x45, ++ 0x71, 0x52, 0x49, 0x24, 0x95, 0xcf, 0xea, 0x09, 0xdc, 0x4f, 0x20, 0xef, ++ 0x19, 0xfd, 0x10, 0x1f, 0x5d, 0xf6, 0xec, 0x2b, 0xef, 0x8c, 0xa7, 0xf4, ++ 0x5f, 0xb6, 0x4b, 0x49, 0x2e, 0x66, 0xd3, 0xb1, 0x48, 0xa9, 0x41, 0xfe, ++ 0x78, 0xe8, 0xdf, 0x55, 0x23, 0x83, 0xfc, 0xa8, 0xf8, 0xfd, 0x2b, 0x06, ++ 0xc7, 0x30, 0xf6, 0xfc, 0x9e, 0xa4, 0x20, 0x5f, 0x96, 0xed, 0xda, 0x67, ++ 0x20, 0xc3, 0xc2, 0xe9, 0x38, 0xa9, 0x69, 0x9f, 0xa1, 0xcd, 0x12, 0x81, ++ 0x3f, 0x4d, 0xc7, 0x0b, 0x61, 0xbd, 0xad, 0xdd, 0xf1, 0x0f, 0x03, 0xc4, ++ 0x15, 0x3f, 0xde, 0x2b, 0x91, 0xb4, 0xac, 0xf0, 0xf7, 0xcb, 0xb7, 0xbc, ++ 0x82, 0xeb, 0x1e, 0xd0, 0x09, 0xf9, 0xc9, 0xf9, 0xd5, 0xcd, 0xbf, 0x30, ++ 0xbe, 0x05, 0xa6, 0xbd, 0x3c, 0x1a, 0xfb, 0xd9, 0xc1, 0x1e, 0xf6, 0xc4, ++ 0xb7, 0x6c, 0xd8, 0xcf, 0xa5, 0xa0, 0x7c, 0x3f, 0xf7, 0x32, 0xdc, 0x63, ++ 0x7a, 0xdf, 0xe8, 0x04, 0x3a, 0x94, 0x3f, 0xb7, 0xc2, 0x06, 0xf3, 0x39, ++ 0x2d, 0xd7, 0x30, 0x39, 0xff, 0xf5, 0xbd, 0xa9, 0xa0, 0xef, 0xe5, 0x8a, ++ 0x2f, 0xd5, 0x8e, 0x25, 0x7b, 0x5e, 0xfe, 0xe4, 0xcf, 0x51, 0xfe, 0x96, ++ 0x1c, 0xfd, 0x79, 0x2a, 0xfa, 0x0f, 0xc4, 0x95, 0xa1, 0x43, 0xdb, 0xec, ++ 0xcb, 0x80, 0x79, 0x2e, 0xde, 0x7c, 0x2b, 0xce, 0xb3, 0x8c, 0xb8, 0x51, ++ 0x0e, 0xcb, 0x7f, 0xad, 0x2f, 0x81, 0x7b, 0xa6, 0x17, 0x64, 0x52, 0xb4, ++ 0x2b, 0x82, 0x9e, 0xfc, 0xc5, 0xc0, 0xf6, 0x2f, 0xa7, 0xb7, 0x52, 0xe6, ++ 0xd2, 0x79, 0x9e, 0x06, 0xfc, 0xc0, 0xbe, 0xbd, 0xa9, 0xf7, 0x6f, 0xc7, ++ 0xb8, 0xf9, 0xcf, 0xf0, 0x1e, 0xdc, 0xcf, 0xf9, 0x9c, 0xe9, 0x4a, 0x88, ++ 0xf5, 0x0b, 0x26, 0xc6, 0xaf, 0x2d, 0x06, 0x9d, 0x1a, 0x0f, 0x35, 0x09, ++ 0xf2, 0xbb, 0x6d, 0x7d, 0x2b, 0xf0, 0xe9, 0x6c, 0x3f, 0x57, 0x1a, 0x9c, ++ 0x7b, 0x50, 0x3a, 0xf8, 0x38, 0xdd, 0xa4, 0x4b, 0x14, 0xae, 0xfe, 0x68, ++ 0x41, 0x1a, 0xe3, 0x13, 0x71, 0xc8, 0x39, 0xfc, 0x3d, 0x6a, 0xef, 0x27, ++ 0xc1, 0x73, 0xe8, 0xdf, 0xaa, 0xb8, 0xcc, 0xc3, 0x85, 0xf7, 0xb8, 0x7d, ++ 0x64, 0xe3, 0xaf, 0xe4, 0xe3, 0x53, 0xbc, 0xe3, 0x60, 0xfd, 0x3a, 0x9d, ++ 0x1a, 0xd9, 0xff, 0xfb, 0x07, 0x9f, 0x1f, 0xfd, 0x69, 0x25, 0x21, 0x72, ++ 0x16, 0xa2, 0xef, 0x4c, 0xff, 0xb7, 0xdd, 0xc7, 0xf4, 0x5d, 0xd5, 0x7f, ++ 0xff, 0xf4, 0x22, 0x68, 0xff, 0xfc, 0x2d, 0xa6, 0x47, 0xf0, 0x1e, 0xac, ++ 0x17, 0x14, 0xaf, 0x40, 0x1a, 0xb6, 0xef, 0x9b, 0x29, 0xa1, 0x7d, 0xa0, ++ 0xfb, 0xec, 0x48, 0x7a, 0xbe, 0x4d, 0xe1, 0x7a, 0x2e, 0xb6, 0xd3, 0x1d, ++ 0x0e, 0xae, 0xff, 0xaa, 0x9c, 0x50, 0xfc, 0x65, 0x29, 0x21, 0x54, 0x5e, ++ 0xe8, 0x38, 0x49, 0xc8, 0x07, 0xdc, 0x1f, 0x97, 0x6d, 0xa4, 0xef, 0x87, ++ 0xf8, 0x65, 0x1e, 0x18, 0x17, 0xfb, 0x19, 0x82, 0xcf, 0x43, 0xd6, 0x8d, ++ 0x25, 0xdc, 0x2e, 0x1c, 0xd2, 0xd8, 0x03, 0xb2, 0x39, 0x25, 0x26, 0x3f, ++ 0xba, 0x52, 0xf1, 0x3f, 0xfd, 0x04, 0xe8, 0xef, 0x7b, 0x46, 0xa7, 0xcf, ++ 0x01, 0xfa, 0xab, 0x94, 0xc0, 0xfc, 0x3f, 0xd9, 0x79, 0xe0, 0x9d, 0x39, ++ 0x54, 0xce, 0x3f, 0x69, 0x52, 0xf5, 0x56, 0xb4, 0xab, 0x5a, 0xbd, 0x2d, ++ 0x7f, 0x7e, 0x0c, 0x89, 0xa4, 0xb7, 0x9f, 0x58, 0xe8, 0xbe, 0x2b, 0x92, ++ 0xde, 0xd2, 0xe7, 0x11, 0xf5, 0xd6, 0xd2, 0x86, 0xf2, 0xfc, 0x7f, 0xcb, ++ 0xae, 0xaa, 0xf4, 0x6b, 0xd7, 0xd0, 0x0f, 0xec, 0xe3, 0xcb, 0x8e, 0xe8, ++ 0x74, 0xd4, 0xda, 0xc7, 0x0d, 0x06, 0x47, 0x44, 0xfb, 0x48, 0x7f, 0xde, ++ 0x22, 0x39, 0xe1, 0x72, 0xa8, 0xca, 0x9f, 0x2a, 0x77, 0x15, 0xbf, 0xad, ++ 0xea, 0x0f, 0x76, 0xa8, 0x5b, 0x3e, 0x55, 0xf9, 0xeb, 0x96, 0x4f, 0x55, ++ 0xfe, 0xb4, 0xf3, 0x15, 0xe9, 0xa7, 0x6d, 0xff, 0x03, 0xe8, 0x37, 0xc5, ++ 0xeb, 0x76, 0xd3, 0xa6, 0x69, 0xe0, 0x3f, 0x9b, 0x3a, 0x09, 0xc6, 0xe1, ++ 0x73, 0x67, 0xea, 0xf1, 0x9e, 0xa6, 0xe9, 0x73, 0xc2, 0xee, 0x69, 0xdc, ++ 0x11, 0x8f, 0xf5, 0x59, 0xfa, 0xb6, 0xdf, 0x83, 0x4f, 0xf8, 0x41, 0xd5, ++ 0xac, 0x61, 0xb0, 0xce, 0xdf, 0x4e, 0x7c, 0x0a, 0x3b, 0xb7, 0xaf, 0x57, ++ 0xd0, 0x8f, 0xfd, 0xfa, 0xd2, 0xa5, 0x09, 0x74, 0x3e, 0x73, 0x38, 0x7d, ++ 0x6f, 0xa7, 0xe4, 0x9e, 0x4a, 0xf9, 0x51, 0x2a, 0x4b, 0x81, 0x38, 0x8a, ++ 0xe7, 0x6c, 0x99, 0xf8, 0x12, 0x92, 0x20, 0x9e, 0x2c, 0x91, 0x13, 0x21, ++ 0x78, 0xdc, 0x5e, 0x2e, 0xd6, 0xe1, 0x67, 0x62, 0x6a, 0x10, 0x4e, 0x4f, ++ 0xfd, 0xbf, 0xad, 0xdf, 0xfd, 0x5d, 0xcb, 0xa3, 0x94, 0xaf, 0x27, 0xb2, ++ 0x09, 0xf9, 0x1b, 0x94, 0xb8, 0xff, 0xa0, 0x8e, 0x75, 0x88, 0x3c, 0x4d, ++ 0x6f, 0x61, 0xe7, 0x18, 0x9e, 0xd1, 0x92, 0x7f, 0x00, 0xea, 0x61, 0x9b, ++ 0x5c, 0x12, 0xb2, 0x8f, 0xf0, 0x18, 0x99, 0xfd, 0x39, 0x9a, 0x7f, 0xcb, ++ 0x18, 0xa0, 0x5f, 0xee, 0xac, 0x61, 0x09, 0x4c, 0xce, 0x07, 0xe3, 0x7e, ++ 0xd1, 0xc3, 0xed, 0x58, 0x97, 0xcf, 0x91, 0x00, 0xf6, 0xbd, 0xab, 0x65, ++ 0x20, 0xee, 0x0b, 0xbb, 0x0e, 0x2f, 0xb4, 0xba, 0x23, 0xd8, 0xb3, 0x03, ++ 0x5c, 0xce, 0x5e, 0xe1, 0xe7, 0x30, 0x1d, 0x16, 0xa9, 0x5e, 0x4f, 0xe5, ++ 0xbe, 0x83, 0x74, 0xa2, 0x5f, 0xe3, 0xb3, 0x98, 0x23, 0xc6, 0xe5, 0xe6, ++ 0x18, 0x55, 0x3b, 0xcd, 0xf9, 0x46, 0x7f, 0xf4, 0x74, 0xfc, 0x52, 0x2e, ++ 0x87, 0xb3, 0xe9, 0xab, 0x09, 0x23, 0x43, 0xf8, 0x36, 0x73, 0xea, 0xc7, ++ 0xb2, 0x2d, 0x9c, 0x0f, 0xf0, 0x73, 0x22, 0x64, 0x5f, 0xf1, 0x7d, 0xe9, ++ 0x0b, 0x72, 0x0d, 0xf4, 0x3d, 0x60, 0x6e, 0x2b, 0x2c, 0x89, 0x10, 0xbf, ++ 0xa9, 0xe4, 0xf4, 0x9b, 0xb8, 0xff, 0x4b, 0x03, 0xac, 0x7b, 0xf9, 0x2d, ++ 0xb9, 0x32, 0xd0, 0x31, 0xdf, 0xa2, 0x17, 0xe2, 0x21, 0x8b, 0x8c, 0x5c, ++ 0x5f, 0x87, 0x92, 0xa1, 0x80, 0xd7, 0xc4, 0xfd, 0x4b, 0x1f, 0x18, 0x43, ++ 0xe5, 0xd8, 0x73, 0x58, 0xef, 0x34, 0xd3, 0xf9, 0x79, 0x5a, 0x3e, 0x35, ++ 0xb8, 0x23, 0xec, 0xef, 0xb4, 0xf4, 0x04, 0xf8, 0xe0, 0x5f, 0x6e, 0x35, ++ 0x32, 0x7f, 0xf9, 0x6d, 0xa5, 0x64, 0x31, 0xd0, 0xf5, 0xed, 0x5b, 0xd9, ++ 0x79, 0xef, 0xdf, 0x0c, 0xce, 0xaa, 0x48, 0x78, 0xa6, 0x9b, 0x99, 0xbf, ++ 0x39, 0x9b, 0x94, 0x5c, 0x18, 0x2d, 0xfd, 0xf4, 0xe8, 0x9b, 0x3b, 0xcb, ++ 0x1a, 0xc8, 0xa3, 0xf4, 0xe8, 0xb2, 0xb0, 0xfb, 0xda, 0xe1, 0xf2, 0xc7, ++ 0xf4, 0xbe, 0xcb, 0x2e, 0xf9, 0x57, 0x4b, 0x20, 0x87, 0x7a, 0x56, 0x4f, ++ 0x66, 0xf7, 0x9b, 0x0b, 0x89, 0xfb, 0x81, 0x09, 0x12, 0xea, 0xfb, 0x0d, ++ 0xa1, 0xf6, 0x2b, 0xb7, 0x79, 0xfa, 0xb3, 0x70, 0x9f, 0xa6, 0xba, 0x45, ++ 0xb2, 0xeb, 0x68, 0x7b, 0xb5, 0xdc, 0x66, 0x00, 0x39, 0xf6, 0x34, 0xef, ++ 0x92, 0xc1, 0x6f, 0xbf, 0xc9, 0x41, 0x5c, 0xb8, 0xbf, 0x96, 0x6b, 0x86, ++ 0xcd, 0x0c, 0x89, 0x7f, 0xd1, 0x65, 0x0f, 0xe9, 0x75, 0xe0, 0xab, 0x39, ++ 0x73, 0x81, 0xbe, 0x9f, 0xcd, 0x34, 0x12, 0xc0, 0xcb, 0x35, 0xf4, 0x53, ++ 0x1b, 0xac, 0xff, 0x9f, 0xb5, 0x8c, 0x42, 0x3d, 0x88, 0x36, 0xaf, 0xd7, ++ 0xbd, 0x64, 0x5a, 0xbe, 0x02, 0x70, 0x98, 0x3d, 0xd3, 0xca, 0x43, 0x61, ++ 0x72, 0xbc, 0x50, 0xbf, 0x75, 0x12, 0xe9, 0x0b, 0xe7, 0xc0, 0x13, 0x8d, ++ 0x6d, 0x2b, 0x9c, 0x11, 0xf8, 0x97, 0x6f, 0x62, 0x72, 0x16, 0xb3, 0x7d, ++ 0x33, 0xfd, 0x7f, 0x66, 0xdf, 0x26, 0x50, 0xfb, 0xc6, 0xe4, 0x5a, 0x09, ++ 0xb5, 0x6f, 0x16, 0x53, 0x98, 0x7d, 0x4b, 0x8b, 0x64, 0xdf, 0x96, 0xaf, ++ 0x76, 0xa4, 0x81, 0x5c, 0x2c, 0xdf, 0x33, 0x10, 0xbf, 0xdf, 0x5a, 0xfe, ++ 0xda, 0xe2, 0x94, 0x48, 0xf6, 0xed, 0x55, 0xbe, 0xef, 0x7d, 0x8d, 0xdf, ++ 0x03, 0xef, 0xe8, 0x4b, 0xed, 0xdb, 0x88, 0x10, 0xfb, 0xd6, 0x97, 0xda, ++ 0xb7, 0x08, 0x71, 0xf2, 0x2f, 0x62, 0xb5, 0x6f, 0xa6, 0xff, 0x19, 0xfd, ++ 0x7b, 0x15, 0xec, 0x5b, 0x84, 0xf9, 0x9a, 0x4d, 0xa2, 0x7d, 0x2b, 0x6a, ++ 0x59, 0x8d, 0xf6, 0xad, 0xa8, 0xaf, 0x5e, 0xb8, 0xaf, 0x44, 0x4c, 0xd4, ++ 0xbe, 0xc5, 0x5f, 0xce, 0xbe, 0xcd, 0x7f, 0xf4, 0x56, 0xac, 0x2b, 0xce, ++ 0xf8, 0x08, 0xf2, 0x03, 0x74, 0x05, 0xfb, 0xf6, 0x1a, 0xb7, 0x73, 0x30, ++ 0x0e, 0xd8, 0xb9, 0x1b, 0x4c, 0x2c, 0xbe, 0x19, 0xab, 0x9d, 0xeb, 0x17, ++ 0xab, 0x9d, 0xfb, 0x1f, 0xa2, 0xb3, 0x6a, 0xe7, 0x96, 0xf7, 0x93, 0xd0, ++ 0x7f, 0x09, 0x97, 0x43, 0x66, 0xe7, 0x96, 0x67, 0x31, 0x3b, 0xb7, 0x7c, ++ 0x0f, 0xb3, 0x73, 0xcb, 0xb3, 0x99, 0x9d, 0xd3, 0xda, 0xb7, 0xbc, 0x30, ++ 0xfb, 0xc6, 0xde, 0xaf, 0x1e, 0x42, 0xdf, 0xc7, 0xfd, 0x63, 0xd6, 0xe3, ++ 0x77, 0xc0, 0x7d, 0xc2, 0x52, 0xc5, 0x69, 0xa2, 0xfd, 0x8b, 0x1d, 0xea, ++ 0xf7, 0x13, 0x35, 0x63, 0x42, 0xed, 0xdd, 0x0d, 0x26, 0x19, 0xe9, 0x1c, ++ 0x66, 0xef, 0x9c, 0x9f, 0xe2, 0x77, 0x30, 0x3d, 0xd9, 0xbb, 0xbf, 0x82, ++ 0xbd, 0xcb, 0x46, 0x3b, 0x36, 0x08, 0xf4, 0x48, 0x2b, 0x1f, 0x53, 0x06, ++ 0xc5, 0x0b, 0xf7, 0xd9, 0xde, 0xfe, 0xf2, 0xd4, 0x6f, 0x7f, 0x07, 0xfa, ++ 0xf2, 0xba, 0x1e, 0xef, 0x0b, 0xbd, 0xab, 0x63, 0xfb, 0xa3, 0xbd, 0x5f, ++ 0x9e, 0x1a, 0x05, 0x7a, 0xf7, 0x90, 0x89, 0xd9, 0xdf, 0x25, 0x26, 0xc6, ++ 0xcf, 0x76, 0xaf, 0x0f, 0xed, 0xe9, 0xa4, 0xa1, 0x4c, 0xdf, 0xab, 0xee, ++ 0x61, 0xf4, 0xab, 0xde, 0x2d, 0xb1, 0xf9, 0xae, 0xd4, 0xfb, 0x1d, 0xb0, ++ 0x0e, 0x7c, 0x75, 0x11, 0xf7, 0xcf, 0x73, 0xf7, 0xb0, 0xfd, 0xf3, 0x2c, ++ 0x63, 0x6b, 0x4a, 0x3c, 0xdc, 0x4b, 0xfa, 0x17, 0x85, 0xb0, 0xef, 0x3e, ++ 0x48, 0xf1, 0xfc, 0x10, 0x79, 0x28, 0xbd, 0x58, 0x81, 0x71, 0xc0, 0xe7, ++ 0xe3, 0x6c, 0x5b, 0x61, 0x7f, 0x59, 0x2a, 0x13, 0x13, 0xf8, 0xb1, 0xf3, ++ 0x0e, 0x4f, 0xf9, 0x18, 0xfc, 0xd7, 0x79, 0x17, 0xeb, 0xd0, 0xef, 0x9d, ++ 0x07, 0xcf, 0xe1, 0x9c, 0x84, 0xdf, 0x93, 0x50, 0xef, 0x51, 0xcc, 0x69, ++ 0xde, 0xf5, 0x4a, 0x1f, 0x12, 0x7e, 0x3f, 0x62, 0xa2, 0x91, 0xf1, 0x61, ++ 0xe2, 0x0a, 0xc9, 0xbf, 0x25, 0x0b, 0xee, 0x23, 0x88, 0xed, 0xf3, 0x34, ++ 0x7e, 0xfd, 0x3a, 0x3e, 0x4f, 0xea, 0xcf, 0x22, 0x5d, 0xc8, 0x5f, 0xf5, ++ 0x11, 0xe3, 0x77, 0xeb, 0xb4, 0xf4, 0x70, 0xb2, 0xf9, 0x57, 0xad, 0xd4, ++ 0x8b, 0xf4, 0xa8, 0x91, 0x22, 0xd2, 0x83, 0x72, 0xb4, 0x78, 0x7e, 0x6a, ++ 0x70, 0xfe, 0x73, 0x5f, 0x68, 0x5b, 0xd7, 0x07, 0xda, 0x97, 0x4a, 0xb8, ++ 0x9f, 0x52, 0xe9, 0xa1, 0x9d, 0xa7, 0x4a, 0x1f, 0x75, 0xbf, 0x32, 0x8f, ++ 0xeb, 0x88, 0xa7, 0x65, 0x97, 0x02, 0xfc, 0xd2, 0xce, 0x5f, 0xa5, 0x5f, ++ 0xd8, 0xbc, 0x55, 0x7a, 0x6a, 0xe6, 0x5f, 0xa7, 0xda, 0x8f, 0xab, 0xc9, ++ 0x30, 0xd0, 0xb7, 0x77, 0x75, 0xee, 0x07, 0xc6, 0x80, 0x7c, 0xfc, 0x99, ++ 0xd2, 0x81, 0xe2, 0x75, 0xdb, 0xec, 0xec, 0xb4, 0x50, 0x7b, 0xfc, 0x20, ++ 0xb7, 0x4b, 0x53, 0xdd, 0xc7, 0xf3, 0x53, 0x1d, 0x40, 0x37, 0xf6, 0x5d, ++ 0xe2, 0x9c, 0xf2, 0x5d, 0xaf, 0xa4, 0xd2, 0xf9, 0xdc, 0xec, 0xca, 0x1a, ++ 0x09, 0xdf, 0x0f, 0xdf, 0xfa, 0x95, 0xc1, 0x0d, 0xf1, 0x85, 0x03, 0xe6, ++ 0x4e, 0xb4, 0x6f, 0xaa, 0x7c, 0x7d, 0xc2, 0xe5, 0x3d, 0xc0, 0xe1, 0xbc, ++ 0xdd, 0xdb, 0x9e, 0x8f, 0xeb, 0x48, 0xb3, 0x64, 0x47, 0xbd, 0x09, 0x68, ++ 0xec, 0x17, 0xbf, 0x3f, 0xe6, 0xb9, 0x87, 0xe9, 0xd5, 0x01, 0xe9, 0x1f, ++ 0xeb, 0xfa, 0x8c, 0x46, 0xba, 0xc2, 0x32, 0x40, 0x0a, 0xd5, 0x75, 0x08, ++ 0xf8, 0x40, 0xff, 0x3b, 0xb5, 0x85, 0xf1, 0xc1, 0x03, 0x7c, 0xa0, 0xff, ++ 0x9d, 0x46, 0x3a, 0x0f, 0x01, 0x9d, 0xab, 0x93, 0x25, 0x67, 0x00, 0xfa, ++ 0x37, 0xef, 0xba, 0x17, 0xe4, 0xe6, 0x55, 0x33, 0x7d, 0x0e, 0xfa, 0x5b, ++ 0x2e, 0x39, 0xd9, 0xf7, 0x65, 0xc4, 0x92, 0x91, 0x7a, 0x59, 0xf9, 0x94, ++ 0x23, 0xc9, 0x27, 0x06, 0x27, 0x72, 0x82, 0xeb, 0xe2, 0x3c, 0xe8, 0x97, ++ 0x14, 0xee, 0x77, 0x4c, 0x34, 0xb6, 0xbe, 0x0d, 0x78, 0x4c, 0xa4, 0xfa, ++ 0xb0, 0x85, 0x84, 0xfb, 0x21, 0x2a, 0xdf, 0x87, 0xd0, 0x3f, 0x97, 0x22, ++ 0xdd, 0xfb, 0xe9, 0x41, 0x8e, 0x3f, 0xe6, 0xf2, 0xf9, 0x2a, 0xd0, 0xdb, ++ 0x02, 0x74, 0xed, 0x34, 0x80, 0x3f, 0xe3, 0x09, 0xb0, 0xf5, 0x43, 0x6d, ++ 0xf7, 0xc8, 0x8e, 0x7c, 0xa4, 0x8f, 0x4a, 0xef, 0x66, 0xba, 0x3e, 0x8c, ++ 0x66, 0xf4, 0xd6, 0x45, 0xa0, 0xe7, 0xcd, 0x6a, 0x9d, 0xd3, 0xd3, 0xd3, ++ 0x22, 0x29, 0xf0, 0xfe, 0x64, 0xba, 0x7f, 0xed, 0x25, 0xc1, 0xe9, 0xd6, ++ 0x97, 0x87, 0x54, 0x39, 0x86, 0xef, 0xe1, 0xb4, 0xf4, 0x80, 0x78, 0x40, ++ 0x46, 0x88, 0xde, 0x83, 0x7d, 0x0a, 0x3d, 0x9f, 0xac, 0x6e, 0x3e, 0x8a, ++ 0x74, 0x99, 0xb2, 0x92, 0xba, 0x57, 0x21, 0x74, 0x07, 0xbb, 0x75, 0x39, ++ 0xfa, 0x44, 0xd3, 0x8b, 0xea, 0xe6, 0x1f, 0x46, 0x2f, 0x3e, 0xd1, 0xe8, ++ 0xc5, 0x5e, 0x73, 0xe7, 0x5f, 0x46, 0x40, 0xfc, 0x6b, 0x8f, 0x84, 0xf6, ++ 0x81, 0xb4, 0x24, 0x0a, 0xfb, 0xfd, 0x78, 0x33, 0xf3, 0x33, 0x0e, 0x98, ++ 0xdd, 0x28, 0xbf, 0x9d, 0xaf, 0x29, 0x78, 0xff, 0x5c, 0x6b, 0x47, 0xbe, ++ 0xe6, 0x72, 0x0f, 0xfb, 0x8b, 0xd0, 0xef, 0xfe, 0x26, 0xc1, 0x44, 0xc0, ++ 0xce, 0xd9, 0xcd, 0xe4, 0x23, 0x15, 0x8f, 0x01, 0x4c, 0x8e, 0x42, 0xed, ++ 0xf7, 0xab, 0x66, 0x37, 0xf2, 0x2b, 0x1a, 0xfc, 0x38, 0xbe, 0x0e, 0x47, ++ 0xf3, 0x9f, 0xd4, 0xfa, 0x8d, 0x30, 0x1e, 0xdc, 0x47, 0x74, 0x88, 0xe3, ++ 0x85, 0xf9, 0x17, 0x3c, 0xfe, 0xd3, 0xd3, 0xbc, 0xd2, 0xf8, 0xb8, 0xdf, ++ 0x75, 0x5e, 0xdd, 0xe7, 0x99, 0xa4, 0xd5, 0x40, 0x58, 0xfc, 0x7f, 0x85, ++ 0x31, 0xe4, 0x5c, 0xea, 0x36, 0x7e, 0x2e, 0xd0, 0x1d, 0x27, 0x0b, 0xf6, ++ 0xb3, 0x9b, 0x2e, 0xd3, 0x0f, 0xe2, 0x2f, 0x01, 0x3a, 0xef, 0x57, 0x77, ++ 0x3e, 0x85, 0xf1, 0xdf, 0xf3, 0xcf, 0x1c, 0x9f, 0x06, 0xf2, 0xbb, 0xec, ++ 0x8f, 0x7a, 0x62, 0xa2, 0x7c, 0x6e, 0xdf, 0x69, 0x25, 0x01, 0x76, 0xef, ++ 0xc2, 0x00, 0xeb, 0x6c, 0xc5, 0x6e, 0x7d, 0xc4, 0x73, 0x14, 0x42, 0x6a, ++ 0xd9, 0x77, 0x8e, 0xbf, 0xb3, 0xa2, 0x7d, 0xa9, 0x78, 0xde, 0xe8, 0x2f, ++ 0xa6, 0xef, 0x57, 0xbc, 0xf8, 0xd1, 0x70, 0x88, 0x5b, 0xb5, 0xaf, 0x61, ++ 0x76, 0xc6, 0xf7, 0x0c, 0x97, 0x0f, 0x5f, 0xdb, 0x70, 0x38, 0x5f, 0xaf, ++ 0x90, 0xd9, 0xb9, 0xb0, 0x16, 0xde, 0x75, 0x5c, 0x5e, 0xce, 0xbd, 0x14, ++ 0x5f, 0x0a, 0x76, 0x52, 0x6a, 0x64, 0xdf, 0xaf, 0x56, 0x34, 0xcd, 0x52, ++ 0x8c, 0x21, 0xfb, 0xf4, 0x91, 0x66, 0x05, 0xc7, 0xa5, 0xfd, 0xf0, 0xde, ++ 0xb2, 0x6f, 0x87, 0x84, 0xf1, 0xf2, 0x70, 0xfc, 0x56, 0x33, 0x78, 0x3b, ++ 0x98, 0xfd, 0xab, 0x68, 0x56, 0xfc, 0xf0, 0x1d, 0x6c, 0x45, 0xe3, 0x16, ++ 0xdc, 0xdf, 0x7a, 0x1a, 0x3f, 0x35, 0x80, 0x5f, 0x37, 0xe9, 0x77, 0xcf, ++ 0xb2, 0xef, 0x6b, 0x9b, 0xf5, 0x62, 0xfc, 0xb0, 0x51, 0x1f, 0x30, 0x62, ++ 0x9c, 0x53, 0x7f, 0xdc, 0x38, 0x9c, 0xe9, 0xad, 0x24, 0xc4, 0xa3, 0xaa, ++ 0x50, 0x2f, 0xab, 0x9b, 0x78, 0x9c, 0x4c, 0x13, 0x3f, 0x5a, 0xf6, 0xbb, ++ 0x3d, 0x2f, 0xfa, 0x28, 0x69, 0x96, 0xfd, 0xfe, 0x37, 0x36, 0xb0, 0x37, ++ 0x67, 0x5b, 0xb7, 0xdb, 0x30, 0x3e, 0xd7, 0xc8, 0xe2, 0x6f, 0xb2, 0x45, ++ 0x8e, 0x1c, 0x9f, 0xeb, 0x29, 0x2e, 0xd7, 0x74, 0x1f, 0x8f, 0xcb, 0x4d, ++ 0x3d, 0x4d, 0x86, 0x87, 0xc7, 0xe5, 0xce, 0xc2, 0x7f, 0xa8, 0x1e, 0xce, ++ 0x37, 0x73, 0x7d, 0x55, 0xe3, 0x9a, 0x8d, 0xbd, 0x62, 0x3a, 0x3f, 0x5f, ++ 0xf6, 0xec, 0x85, 0x27, 0xe1, 0x3c, 0xe9, 0xdc, 0xf3, 0x9f, 0x3c, 0x09, ++ 0xf8, 0x57, 0x7e, 0xf3, 0xd9, 0x93, 0x77, 0xc3, 0xb9, 0xc4, 0x5e, 0xb3, ++ 0x1d, 0xd6, 0x3f, 0xcf, 0x33, 0x6f, 0x63, 0xfc, 0x5d, 0x7d, 0xef, 0x6e, ++ 0x2e, 0xe7, 0xed, 0x3b, 0x7e, 0xf3, 0xf4, 0x13, 0x54, 0x0f, 0xdb, 0xdf, ++ 0x33, 0xe2, 0xbd, 0xad, 0xf6, 0x3d, 0xa7, 0x33, 0xe1, 0x7b, 0xc6, 0xf6, ++ 0x5d, 0x5f, 0xa6, 0x42, 0x7c, 0x73, 0xe5, 0x9e, 0x02, 0xdc, 0xcf, 0xac, ++ 0x7c, 0x61, 0x52, 0xda, 0xe5, 0xee, 0x9f, 0x80, 0x7c, 0xfa, 0x63, 0x38, ++ 0x3f, 0xd1, 0xf2, 0xe3, 0xc0, 0x6e, 0x3d, 0x81, 0xef, 0x39, 0xcf, 0x1f, ++ 0x33, 0xa2, 0xff, 0xd1, 0x1d, 0x67, 0x6d, 0xaa, 0x62, 0xf1, 0x6b, 0x07, ++ 0x8f, 0xaf, 0xee, 0x8c, 0x7c, 0x5e, 0xa5, 0xc6, 0x03, 0xab, 0x77, 0xdf, ++ 0x72, 0xf3, 0xf5, 0xb0, 0x0e, 0xee, 0x56, 0x9c, 0x0e, 0x7c, 0xce, 0xe3, ++ 0x83, 0x3d, 0xc5, 0x55, 0xdf, 0xa2, 0x7c, 0x1d, 0x11, 0x03, 0xff, 0x76, ++ 0xf2, 0xf8, 0x79, 0xd3, 0xd4, 0x88, 0x71, 0xd5, 0xf3, 0xf0, 0x1f, 0xca, ++ 0xa7, 0x4d, 0x66, 0x31, 0xae, 0x7a, 0x61, 0xf7, 0xe2, 0x7f, 0x7b, 0x02, ++ 0xda, 0x76, 0xf7, 0x8a, 0x1a, 0x57, 0x0d, 0xc4, 0x40, 0x37, 0xf5, 0x3c, ++ 0xac, 0xcc, 0xec, 0xda, 0x66, 0x06, 0xfd, 0x78, 0xfe, 0xb7, 0x18, 0xc7, ++ 0x06, 0xbe, 0x51, 0x9f, 0x9c, 0xb4, 0x3f, 0x7b, 0x21, 0x13, 0xe2, 0x11, ++ 0x67, 0x94, 0xce, 0x3b, 0xf1, 0x9e, 0xf2, 0x1e, 0x23, 0xde, 0x33, 0xaa, ++ 0xd8, 0xf3, 0x2e, 0xea, 0x4b, 0xfb, 0x0b, 0x47, 0xf1, 0x9c, 0x89, 0xf0, ++ 0xf3, 0xa8, 0x76, 0xd2, 0xfd, 0xc3, 0xce, 0x0d, 0xf8, 0x5e, 0xc7, 0xb3, ++ 0xcd, 0xca, 0xe2, 0xb1, 0x9c, 0xfe, 0x10, 0xaf, 0x75, 0xd8, 0xf0, 0x39, ++ 0x8f, 0xcb, 0x32, 0x39, 0x56, 0xe3, 0xb5, 0xd1, 0xe2, 0xb4, 0xef, 0x9b, ++ 0xd9, 0x7d, 0x28, 0xf5, 0x7c, 0xae, 0x6a, 0xdb, 0x07, 0x06, 0xa2, 0x89, ++ 0x7f, 0x4b, 0x63, 0x81, 0x5f, 0xc7, 0x85, 0x73, 0x45, 0x75, 0xde, 0x5a, ++ 0x78, 0x76, 0xa0, 0xc3, 0xb5, 0xa1, 0xe7, 0x0f, 0xd1, 0xe2, 0xe1, 0xdc, ++ 0xae, 0x86, 0xf1, 0x8b, 0x9d, 0x3b, 0xb4, 0x6f, 0xe1, 0xe7, 0x11, 0xdd, ++ 0xe7, 0x0c, 0x84, 0xf4, 0x1d, 0x09, 0xe7, 0xe3, 0xec, 0xdc, 0xdc, 0xe3, ++ 0x97, 0xde, 0x8d, 0xc4, 0x5f, 0xf5, 0xfc, 0xe1, 0x6d, 0xad, 0x7e, 0xfa, ++ 0x63, 0x3b, 0x77, 0xe8, 0x19, 0xef, 0xef, 0x46, 0x97, 0x57, 0xcd, 0x6c, ++ 0x7f, 0xab, 0xd2, 0xe7, 0xdc, 0xd7, 0x91, 0xed, 0x74, 0x27, 0xd7, 0x77, ++ 0xba, 0xce, 0x74, 0x98, 0xf1, 0xdc, 0x98, 0xad, 0x33, 0xf3, 0xf8, 0x3a, ++ 0x53, 0x4d, 0xe9, 0xc6, 0xbe, 0x7b, 0x63, 0xf8, 0x9e, 0xe3, 0xfb, 0xc0, ++ 0x73, 0xcf, 0xe8, 0xfd, 0xb0, 0x5f, 0x5e, 0xd7, 0x74, 0x00, 0xed, 0xad, ++ 0x56, 0xcf, 0xab, 0x09, 0x8b, 0x7f, 0x69, 0xc7, 0x93, 0xe2, 0x98, 0x7f, ++ 0x50, 0xdd, 0xbc, 0x6f, 0x38, 0xd8, 0xa3, 0x73, 0xfb, 0x5f, 0x42, 0xf9, ++ 0xab, 0xde, 0x79, 0xdc, 0xe0, 0xa3, 0x70, 0x0e, 0x35, 0xfe, 0xde, 0xd0, ++ 0x36, 0x34, 0x28, 0xef, 0x60, 0xc7, 0xfd, 0x21, 0x76, 0xfc, 0xdc, 0x73, ++ 0xfb, 0x86, 0xb3, 0x73, 0x91, 0xc8, 0x79, 0x5a, 0x6c, 0x1c, 0xbe, 0xa7, ++ 0x45, 0x84, 0xef, 0xd9, 0xf9, 0xa9, 0x00, 0x7f, 0x99, 0xaf, 0xc9, 0x60, ++ 0xb7, 0xf4, 0x3c, 0xce, 0x59, 0xd9, 0x35, 0x0b, 0xe6, 0x7b, 0xb6, 0x55, ++ 0x21, 0x70, 0x9f, 0xfd, 0x6c, 0x93, 0xbe, 0xc8, 0x1f, 0x61, 0xdc, 0xcf, ++ 0x60, 0x1d, 0x1b, 0x13, 0xa4, 0xd3, 0x3a, 0x2b, 0xfb, 0x8e, 0x4f, 0x9f, ++ 0x64, 0x40, 0x3f, 0x73, 0xa5, 0x75, 0xec, 0x31, 0xf8, 0x7e, 0x7c, 0xa5, ++ 0xd5, 0xe0, 0x80, 0xfd, 0x76, 0xed, 0x6a, 0x76, 0xaf, 0xb2, 0xf6, 0x7f, ++ 0x39, 0xd3, 0x81, 0x2f, 0xb5, 0x89, 0xb7, 0xe1, 0xb9, 0x51, 0xbd, 0x86, ++ 0x8e, 0xf6, 0x64, 0x7b, 0x2e, 0xec, 0xc3, 0xed, 0xf9, 0x25, 0xa3, 0x41, ++ 0xac, 0xb4, 0xf6, 0x20, 0xd1, 0xa5, 0x13, 0xf0, 0x5e, 0x69, 0x2d, 0x4a, ++ 0x73, 0x58, 0x20, 0xaf, 0x17, 0xf3, 0x53, 0x88, 0xec, 0xc4, 0xef, 0x0c, ++ 0xf5, 0xb6, 0xc2, 0x22, 0x98, 0x87, 0xde, 0xae, 0xb3, 0x9b, 0x23, 0xae, ++ 0xaf, 0x0c, 0x9e, 0x62, 0x61, 0x79, 0x33, 0x14, 0xbb, 0xf8, 0xdd, 0xdf, ++ 0x77, 0xc8, 0x83, 0x41, 0x20, 0x1f, 0xc7, 0xb7, 0xce, 0x83, 0xd1, 0xa9, ++ 0xc9, 0x83, 0x51, 0x7e, 0xe3, 0xff, 0x6b, 0x79, 0x30, 0x7c, 0x30, 0xce, ++ 0x4f, 0x20, 0x0f, 0x46, 0x00, 0xe3, 0x3b, 0x6a, 0x1e, 0x8c, 0xe4, 0x1f, ++ 0x39, 0x0f, 0x06, 0xc4, 0x97, 0x46, 0x87, 0xe4, 0xc1, 0xe8, 0xd4, 0xe4, ++ 0xc1, 0xe0, 0x7c, 0xfc, 0x67, 0x1e, 0x8c, 0x7f, 0xe6, 0xc1, 0x80, 0x52, ++ 0xcd, 0x83, 0xf1, 0xce, 0x86, 0xb2, 0x02, 0xc8, 0x53, 0xa1, 0xe6, 0xc1, ++ 0x38, 0xb3, 0xc1, 0x53, 0x00, 0x79, 0x29, 0xd4, 0x3c, 0x18, 0x5f, 0x6d, ++ 0x58, 0xc5, 0xea, 0x3c, 0x0f, 0x86, 0xe5, 0xfe, 0xd5, 0x05, 0xa1, 0x79, ++ 0x30, 0x32, 0xef, 0xdf, 0x80, 0xed, 0x6a, 0x1e, 0x0c, 0xe7, 0xfd, 0x8f, ++ 0x14, 0x84, 0xe6, 0xc1, 0xc8, 0xbb, 0x7f, 0x73, 0x41, 0x68, 0x1e, 0x8c, ++ 0x99, 0xf7, 0x6f, 0x2f, 0x08, 0xcd, 0x83, 0x51, 0x76, 0xff, 0x73, 0x05, ++ 0x42, 0x1e, 0x8c, 0xb5, 0x7f, 0x28, 0x80, 0x3c, 0x18, 0xaf, 0xc7, 0xbb, ++ 0x5b, 0xe3, 0x52, 0xa2, 0xe7, 0xc1, 0x68, 0x8e, 0x73, 0xc4, 0x94, 0x07, ++ 0x83, 0xc2, 0x79, 0x0f, 0xe1, 0x44, 0xc9, 0x83, 0xa1, 0x85, 0x13, 0x2d, ++ 0x0f, 0x06, 0x85, 0x73, 0x22, 0x6e, 0x4c, 0xf4, 0x3c, 0x18, 0x61, 0xf8, ++ 0x44, 0xc9, 0x83, 0x41, 0xe1, 0x7c, 0x82, 0x70, 0xa2, 0xe4, 0xc1, 0x08, ++ 0xc3, 0x27, 0x4a, 0x1e, 0x0c, 0x0a, 0xe7, 0x73, 0x9c, 0x57, 0x94, 0x3c, ++ 0x18, 0x5a, 0x38, 0xd1, 0xf2, 0x60, 0x50, 0x38, 0xff, 0x85, 0x70, 0xa2, ++ 0xe4, 0xc1, 0xd0, 0xc2, 0x89, 0x96, 0x07, 0x83, 0xc2, 0x31, 0xc4, 0xa7, ++ 0x44, 0xcf, 0x83, 0x11, 0x86, 0x4f, 0x94, 0x3c, 0x18, 0x14, 0x4e, 0x02, ++ 0xc2, 0x89, 0x92, 0x07, 0x23, 0x0c, 0x9f, 0x28, 0x79, 0x30, 0x28, 0x9c, ++ 0x74, 0x84, 0x13, 0x25, 0x0f, 0x86, 0x16, 0x4e, 0xb4, 0x3c, 0x18, 0x14, ++ 0x4e, 0x16, 0xc2, 0x89, 0x92, 0x07, 0x43, 0x0b, 0x27, 0x5a, 0x1e, 0x0c, ++ 0x0a, 0xe7, 0xaa, 0xf8, 0x31, 0xd1, 0xf3, 0x60, 0x84, 0xe1, 0x13, 0x25, ++ 0x0f, 0x06, 0x85, 0x33, 0x0a, 0xf1, 0x89, 0x92, 0x07, 0x23, 0x0c, 0x9f, ++ 0x28, 0x79, 0x30, 0x28, 0x9c, 0x09, 0x08, 0x27, 0x4a, 0x1e, 0x0c, 0x2d, ++ 0x9c, 0x68, 0x79, 0x30, 0x28, 0x9c, 0x02, 0x9c, 0x57, 0x94, 0x3c, 0x18, ++ 0x5a, 0x38, 0xd1, 0xf2, 0x60, 0x50, 0x38, 0xd3, 0x10, 0x9f, 0x28, 0x79, ++ 0x30, 0xc2, 0xf0, 0x89, 0x92, 0x07, 0x83, 0xc2, 0x99, 0x85, 0xf8, 0x44, ++ 0xc9, 0x83, 0x11, 0x86, 0x4f, 0x94, 0x3c, 0x18, 0x14, 0x8e, 0x1b, 0xf1, ++ 0x89, 0x92, 0x07, 0x43, 0x0b, 0x27, 0x5a, 0x1e, 0x0c, 0x0a, 0x67, 0x29, ++ 0xc2, 0x89, 0x92, 0x07, 0x43, 0x0b, 0x27, 0x5a, 0x1e, 0x0c, 0x0a, 0x67, ++ 0x39, 0xc2, 0x89, 0x92, 0x07, 0x23, 0x0c, 0x9f, 0x28, 0x79, 0x30, 0x28, ++ 0x9c, 0xbb, 0x11, 0x4e, 0x94, 0x3c, 0x18, 0x61, 0xf8, 0x7c, 0xd7, 0x3c, ++ 0x18, 0xe6, 0xc0, 0x20, 0x69, 0x20, 0xe6, 0xc1, 0xc0, 0x7c, 0x9c, 0xdd, ++ 0x79, 0x30, 0x92, 0xbf, 0x75, 0x1e, 0x8c, 0x5f, 0x01, 0xbe, 0xff, 0xcc, ++ 0x83, 0xf1, 0xcf, 0x3c, 0x18, 0x3f, 0x46, 0x1e, 0x8c, 0x5b, 0xad, 0xee, ++ 0xbf, 0xc7, 0xe3, 0xbe, 0xf1, 0xbb, 0xe5, 0xc1, 0x38, 0x13, 0xaf, 0xc9, ++ 0x1b, 0xd1, 0x43, 0x1e, 0x8c, 0x5b, 0xad, 0x25, 0x67, 0x41, 0x9e, 0xbf, ++ 0x6d, 0x1e, 0x8c, 0x0b, 0xf1, 0xdf, 0x2e, 0x0f, 0x06, 0x1d, 0xe7, 0x1f, ++ 0x97, 0x1b, 0x27, 0x5a, 0x1e, 0x0c, 0x9d, 0xe5, 0xdb, 0xe5, 0xc1, 0xa0, ++ 0xe3, 0xc8, 0x96, 0x31, 0x97, 0x99, 0x4f, 0x94, 0x3c, 0x18, 0x09, 0x16, ++ 0x31, 0x7f, 0xc8, 0x8f, 0x95, 0x07, 0xe3, 0x58, 0x7c, 0x12, 0xce, 0x27, ++ 0x5a, 0x1e, 0x8c, 0x9f, 0x5c, 0xbe, 0x09, 0xba, 0xcd, 0x82, 0x7d, 0xda, ++ 0x74, 0x14, 0x45, 0xf2, 0x93, 0xc9, 0x3f, 0x31, 0xda, 0xc2, 0xe3, 0x86, ++ 0x3f, 0x54, 0xfe, 0x09, 0x98, 0x74, 0xce, 0x4f, 0x29, 0xff, 0x84, 0x9a, ++ 0xc7, 0xa0, 0x49, 0x81, 0xf5, 0xf0, 0x7d, 0xce, 0xf7, 0x77, 0xb8, 0x5c, ++ 0x7c, 0xc0, 0xf3, 0x50, 0x1c, 0x8b, 0x9a, 0x87, 0xc2, 0x3f, 0x15, 0xe3, ++ 0xbb, 0x4b, 0xc5, 0x3c, 0x14, 0x53, 0x38, 0x1f, 0x67, 0xbb, 0x45, 0x79, ++ 0x98, 0x42, 0xd8, 0x39, 0xca, 0x94, 0xfc, 0x2c, 0x7f, 0x2d, 0xec, 0xd7, ++ 0xcb, 0x35, 0x79, 0x28, 0x86, 0x88, 0xe7, 0xf4, 0xc5, 0xee, 0xa3, 0xf9, ++ 0x14, 0x1c, 0x99, 0xea, 0x14, 0xe7, 0x71, 0x94, 0xcb, 0xc3, 0xb4, 0xd2, ++ 0x4f, 0x0f, 0x02, 0x7b, 0x6e, 0x1e, 0x1b, 0x39, 0x0f, 0xc5, 0x0c, 0xce, ++ 0x8f, 0xe9, 0x1a, 0xba, 0x4c, 0xe1, 0x7c, 0x9b, 0xce, 0xcb, 0xdb, 0xe1, ++ 0xd3, 0x1c, 0x2a, 0xcf, 0xc5, 0xe5, 0x47, 0x65, 0xa0, 0xeb, 0x34, 0x47, ++ 0x9b, 0x8c, 0x71, 0xfa, 0x9b, 0x54, 0xfe, 0x39, 0x04, 0xfe, 0xcd, 0xe4, ++ 0x70, 0xb5, 0xf8, 0xce, 0xe0, 0xfc, 0x9b, 0x31, 0x99, 0xf1, 0x4f, 0x8b, ++ 0xf7, 0x5b, 0xc0, 0x3f, 0x8a, 0xf7, 0x5b, 0xe5, 0xa3, 0x90, 0x7f, 0x5a, ++ 0xbc, 0xb5, 0x78, 0x6a, 0xf9, 0x4f, 0x42, 0xf9, 0x1d, 0x92, 0x3f, 0x24, ++ 0x97, 0x88, 0xf9, 0x27, 0x26, 0x99, 0xc4, 0xfc, 0x13, 0x05, 0x76, 0x31, ++ 0xff, 0xc4, 0x8d, 0xe9, 0x62, 0xfe, 0x89, 0xc9, 0x0e, 0x31, 0xff, 0xc4, ++ 0x4d, 0x43, 0xc4, 0xfc, 0x13, 0x53, 0x9d, 0x62, 0xfe, 0x89, 0x9b, 0xc7, ++ 0x8a, 0xf9, 0x27, 0xa6, 0xbb, 0x56, 0x6b, 0xf2, 0x5f, 0xdc, 0xa7, 0xc9, ++ 0x7f, 0xf1, 0x90, 0x26, 0xff, 0xc5, 0x26, 0x4d, 0xfe, 0x8b, 0x2d, 0x9a, ++ 0xfc, 0x17, 0x3b, 0x34, 0xf9, 0x2f, 0x76, 0x69, 0xf2, 0x5f, 0xbc, 0xa4, ++ 0xc9, 0x7f, 0xb1, 0x4f, 0xa8, 0x2f, 0xac, 0x7b, 0x4d, 0xe8, 0xbf, 0xb8, ++ 0xfe, 0xa8, 0x50, 0x5f, 0xd2, 0xf0, 0x9e, 0xd0, 0x7f, 0xa9, 0xff, 0xb8, ++ 0xd0, 0xbe, 0xac, 0xf1, 0x63, 0xa1, 0xbd, 0xaa, 0xe9, 0x53, 0xa1, 0xee, ++ 0x69, 0xfe, 0x52, 0xe8, 0xdf, 0x53, 0xfe, 0x81, 0xb7, 0xf8, 0xf7, 0xd0, ++ 0xef, 0xf0, 0xef, 0xa1, 0x8f, 0xf1, 0xef, 0xa1, 0xdf, 0xef, 0x21, 0xff, ++ 0xc5, 0x3b, 0x96, 0xa5, 0xeb, 0x42, 0xf3, 0x5f, 0xbc, 0x6f, 0xf1, 0xac, ++ 0x83, 0xbc, 0x04, 0xc7, 0x2d, 0x0e, 0x9e, 0x57, 0x20, 0x72, 0x7e, 0x8b, ++ 0xee, 0xf6, 0x28, 0xf9, 0x2f, 0x82, 0xef, 0x7f, 0xfb, 0xfc, 0x17, 0x29, ++ 0xc9, 0x3f, 0x7c, 0x3e, 0x02, 0x9d, 0x95, 0x7d, 0x0f, 0xd8, 0xdb, 0x92, ++ 0xa7, 0xb3, 0xa6, 0x7c, 0xf7, 0x7c, 0x04, 0xb7, 0x96, 0x88, 0xdf, 0x75, ++ 0xcf, 0x2a, 0x15, 0xbf, 0xeb, 0xd6, 0x59, 0xd9, 0xf7, 0xda, 0xb3, 0xdd, ++ 0xe2, 0xf7, 0xdd, 0xb7, 0x97, 0x8b, 0xdf, 0x77, 0x8f, 0x88, 0x73, 0x4b, ++ 0x80, 0x87, 0x36, 0xff, 0x45, 0x6f, 0x8b, 0x4b, 0x67, 0x05, 0x7b, 0xc9, ++ 0xf3, 0x14, 0x04, 0xe0, 0x3b, 0xdd, 0x6c, 0x88, 0xb7, 0x15, 0x61, 0x79, ++ 0x10, 0xf2, 0x5f, 0x64, 0x43, 0xbc, 0xad, 0x14, 0xcb, 0xc3, 0x90, 0xff, ++ 0x82, 0x96, 0x7f, 0x86, 0xfc, 0x17, 0xb4, 0x3c, 0x02, 0xf9, 0x2f, 0x68, ++ 0xf9, 0x06, 0xe4, 0xbf, 0xc8, 0x86, 0xfc, 0x19, 0x3e, 0x9e, 0x3f, 0xa3, ++ 0x8e, 0xe7, 0xcf, 0xa8, 0xe7, 0xf9, 0x33, 0x1a, 0x78, 0xfe, 0x0c, 0x3f, ++ 0xcf, 0x9f, 0xd1, 0xc8, 0xf3, 0x67, 0x34, 0xf1, 0xfc, 0x19, 0xcd, 0x3c, ++ 0x7f, 0x46, 0x00, 0xe1, 0x9c, 0xf0, 0x1e, 0xc6, 0xf2, 0xa4, 0xb7, 0x15, ++ 0xcb, 0x53, 0xde, 0x63, 0x58, 0x9e, 0xf1, 0xb6, 0x61, 0x79, 0xd6, 0x7b, ++ 0x06, 0xcb, 0x73, 0xde, 0x4e, 0x2c, 0xdb, 0xbd, 0x17, 0xb1, 0x8c, 0x35, ++ 0x7f, 0x86, 0x2a, 0x97, 0x1f, 0x82, 0xdf, 0x70, 0x05, 0x8c, 0xcf, 0xe4, ++ 0x59, 0x95, 0xd3, 0xab, 0x1f, 0x78, 0x64, 0x5d, 0x68, 0xfe, 0x8c, 0x11, ++ 0x0f, 0x6c, 0x42, 0x39, 0x8d, 0x96, 0x37, 0x23, 0x07, 0xbe, 0xe9, 0x4b, ++ 0x89, 0x9e, 0x37, 0xa3, 0xbb, 0x3d, 0x4a, 0xde, 0x8c, 0xe0, 0xfb, 0xd1, ++ 0xf3, 0x66, 0xa4, 0x8d, 0xfe, 0xf1, 0xf2, 0x66, 0xcc, 0xb5, 0xfc, 0x30, ++ 0x79, 0x33, 0xe6, 0xd6, 0x88, 0x79, 0x1d, 0xe6, 0xad, 0xba, 0x7c, 0xde, ++ 0x8c, 0x11, 0x71, 0x25, 0xb7, 0xa0, 0xfc, 0x71, 0x79, 0x9c, 0x6b, 0x89, ++ 0x2d, 0x6f, 0x86, 0xcf, 0x2a, 0xf1, 0xef, 0xf2, 0x29, 0x5d, 0xc0, 0xef, ++ 0xa2, 0x74, 0xc1, 0xf5, 0xba, 0x87, 0xbc, 0x03, 0x07, 0xad, 0x4f, 0x0f, ++ 0x81, 0xfd, 0x44, 0xd7, 0x90, 0xab, 0x2e, 0x9b, 0xef, 0x41, 0x2b, 0x17, ++ 0xd1, 0xe9, 0xcd, 0xf2, 0x3b, 0xcc, 0xf9, 0x91, 0xf3, 0x65, 0xf4, 0x44, ++ 0x57, 0xb5, 0xff, 0xfb, 0x15, 0x2c, 0x8f, 0xc3, 0x5c, 0xcb, 0xb7, 0xcc, ++ 0x97, 0xd1, 0x43, 0xbe, 0x85, 0x83, 0xd9, 0x5f, 0xa0, 0x9d, 0x8c, 0x35, ++ 0x5f, 0x46, 0x4f, 0xeb, 0x43, 0x4f, 0xf4, 0x9c, 0xf1, 0x23, 0xe7, 0xcb, ++ 0xe8, 0xc9, 0xae, 0xf6, 0x64, 0x4f, 0xdf, 0x9c, 0xc2, 0xe8, 0xdc, 0xbb, ++ 0x07, 0x3a, 0xab, 0xdf, 0x4b, 0x57, 0x9a, 0x5a, 0x0f, 0xe1, 0xcb, 0x76, ++ 0x17, 0xaa, 0xb6, 0xcc, 0xbf, 0x87, 0xcf, 0x9d, 0x69, 0xc7, 0xf8, 0x4c, ++ 0xc7, 0x4e, 0x7e, 0x2f, 0xce, 0x45, 0x1c, 0xf6, 0x54, 0xf6, 0xbd, 0x3e, ++ 0xf8, 0x9b, 0x1d, 0xcf, 0x27, 0x0c, 0x27, 0xf8, 0x1d, 0xbf, 0x9d, 0xb8, ++ 0x28, 0x7f, 0xe2, 0xf9, 0x73, 0x69, 0xe7, 0xbe, 0x7d, 0x70, 0x2f, 0x60, ++ 0xad, 0x8d, 0xb8, 0x12, 0x93, 0xc0, 0xd9, 0x23, 0x0e, 0xfd, 0x40, 0xd8, ++ 0x87, 0x5d, 0x63, 0x82, 0x78, 0x4d, 0xd5, 0xee, 0x4f, 0xdf, 0xf8, 0x23, ++ 0x85, 0x6b, 0x6e, 0xd1, 0xe3, 0x7d, 0xb9, 0x0e, 0x8a, 0x43, 0x2b, 0xfa, ++ 0x7d, 0xae, 0x44, 0xe0, 0x5b, 0x3c, 0xf9, 0x25, 0xee, 0xd3, 0xe1, 0x8c, ++ 0xee, 0x52, 0xaf, 0xd0, 0xef, 0xba, 0x35, 0xbf, 0x87, 0x03, 0xba, 0xa4, ++ 0x06, 0xcf, 0x9f, 0x0a, 0xf4, 0x16, 0xdc, 0x37, 0x75, 0x6d, 0x66, 0xf7, ++ 0x59, 0xf5, 0xe4, 0xaa, 0xc7, 0x27, 0x24, 0xe3, 0xbd, 0x71, 0xe2, 0x77, ++ 0x20, 0xff, 0xd0, 0x4f, 0x5d, 0xc6, 0xf1, 0xec, 0x22, 0xc4, 0x19, 0x80, ++ 0xfe, 0x3b, 0xad, 0x78, 0x7f, 0x75, 0xc9, 0x6b, 0x0b, 0x0d, 0x30, 0x28, ++ 0x9c, 0xb7, 0x86, 0xc6, 0x0d, 0x7a, 0x15, 0x89, 0x71, 0xa0, 0x06, 0xb3, ++ 0x6d, 0x38, 0xdc, 0xdb, 0x4b, 0x57, 0xef, 0xef, 0xf9, 0x5c, 0xad, 0xe0, ++ 0x87, 0x2f, 0xe2, 0x70, 0x53, 0x4a, 0xc4, 0x38, 0xd1, 0x27, 0x0b, 0x8a, ++ 0x0e, 0x83, 0xff, 0xbc, 0xc8, 0x5d, 0x86, 0xf7, 0x2a, 0xd2, 0x4a, 0xc5, ++ 0xb8, 0x11, 0xe1, 0xdf, 0xd1, 0xc3, 0xb6, 0x0c, 0xfc, 0x4c, 0x99, 0xf0, ++ 0x7b, 0x9d, 0x7e, 0x76, 0xdf, 0x33, 0xec, 0xbb, 0xfa, 0xe6, 0x2d, 0x88, ++ 0xe7, 0x52, 0xbf, 0xe6, 0xfe, 0x52, 0xa3, 0x58, 0x57, 0xe9, 0x76, 0xce, ++ 0xca, 0xef, 0xa5, 0x58, 0x88, 0x25, 0x26, 0xba, 0xb5, 0x0d, 0x7e, 0x7c, ++ 0xc2, 0xe8, 0x6f, 0x4f, 0x37, 0x63, 0xba, 0x48, 0x37, 0xb3, 0x43, 0xa4, ++ 0x5b, 0xfc, 0x10, 0x91, 0x2e, 0x5a, 0xba, 0x59, 0x9d, 0x22, 0x5d, 0xb4, ++ 0x74, 0x4b, 0x18, 0x2b, 0xc6, 0xd7, 0x54, 0xba, 0xa9, 0xf7, 0x29, 0x7f, ++ 0x28, 0xba, 0x25, 0xd9, 0xf8, 0x3d, 0x8f, 0x20, 0xbd, 0x4a, 0x4c, 0xa9, ++ 0x68, 0xf2, 0x11, 0xcf, 0x0c, 0x39, 0x80, 0xf2, 0xad, 0xd5, 0x87, 0x3e, ++ 0x96, 0x00, 0xfc, 0x86, 0x1f, 0xd2, 0x2f, 0xd9, 0xbf, 0x1a, 0xdf, 0x72, ++ 0x5a, 0x65, 0xb0, 0x5b, 0xe9, 0x0c, 0x34, 0x91, 0x16, 0xb1, 0xf7, 0xe2, ++ 0x41, 0x1f, 0x20, 0x7f, 0x2f, 0x71, 0xa2, 0x3e, 0xa8, 0xbf, 0x8f, 0x22, ++ 0x9e, 0x7c, 0xc8, 0xe5, 0xfe, 0x23, 0x72, 0x89, 0x96, 0x2b, 0xa6, 0x1f, ++ 0x3c, 0xbe, 0x80, 0xb6, 0x6e, 0x06, 0x79, 0x1b, 0xc1, 0x7e, 0x8f, 0x06, ++ 0xc6, 0xab, 0x92, 0x08, 0xee, 0xe7, 0x14, 0xe2, 0xb4, 0xc3, 0x3e, 0xaa, ++ 0xc9, 0x6b, 0x72, 0x2e, 0x52, 0xe0, 0x5c, 0x93, 0x38, 0x17, 0x65, 0xc3, ++ 0x79, 0xa6, 0x1d, 0xcb, 0x07, 0xf9, 0xf7, 0xce, 0x1d, 0x43, 0x09, 0xee, ++ 0xfb, 0x9b, 0x02, 0x9f, 0xa7, 0xc2, 0xbd, 0x81, 0x07, 0x47, 0x76, 0x4e, ++ 0x83, 0xf8, 0x83, 0x67, 0x31, 0x29, 0x81, 0xf5, 0x6b, 0x56, 0x02, 0x5b, ++ 0x5f, 0x97, 0xf1, 0xd2, 0x96, 0xc0, 0xe2, 0x33, 0x1b, 0x4a, 0x74, 0xc4, ++ 0x35, 0x1a, 0x7e, 0x9f, 0x92, 0xde, 0x2f, 0xd1, 0xf1, 0xda, 0xed, 0xae, ++ 0xd7, 0x6e, 0x00, 0x7f, 0xb4, 0x85, 0xdd, 0x0f, 0x20, 0xf6, 0xce, 0x37, ++ 0x6e, 0xc7, 0xf6, 0x51, 0xf8, 0x7d, 0x78, 0x86, 0xae, 0xfe, 0x1a, 0xc0, ++ 0x87, 0xf6, 0xc7, 0xef, 0x8a, 0x3b, 0x5a, 0x3e, 0xb2, 0x2d, 0x0c, 0xb1, ++ 0xc3, 0xed, 0xcd, 0x8f, 0x5c, 0x09, 0xf7, 0x5a, 0x37, 0xe9, 0x22, 0x7f, ++ 0xcf, 0x5c, 0x60, 0xe3, 0xbf, 0x7f, 0x87, 0xdf, 0x4f, 0x19, 0x11, 0xcc, ++ 0xb7, 0x50, 0x60, 0x1b, 0x83, 0x79, 0x19, 0x1e, 0x1c, 0x40, 0xc7, 0xa9, ++ 0x9e, 0xde, 0x85, 0x7c, 0x54, 0xe5, 0xf2, 0x3a, 0x4e, 0xff, 0x83, 0x65, ++ 0x53, 0x10, 0xbf, 0x17, 0x5a, 0x24, 0x07, 0xc4, 0xeb, 0x0a, 0xf5, 0x77, ++ 0xdc, 0x34, 0x8c, 0xe2, 0x37, 0xee, 0x6d, 0x99, 0xdf, 0xeb, 0x65, 0xf7, ++ 0xd7, 0x47, 0xf3, 0xfe, 0xb5, 0x66, 0xaa, 0xbf, 0x68, 0xbf, 0xea, 0xff, ++ 0x06, 0xbf, 0x67, 0xe5, 0xa5, 0x93, 0x32, 0xe6, 0x43, 0x1c, 0x5d, 0x53, ++ 0x86, 0xf7, 0x04, 0xff, 0x68, 0x2b, 0x3c, 0x0c, 0xfc, 0xca, 0x71, 0x35, ++ 0x8d, 0x02, 0x79, 0xca, 0x6f, 0x49, 0xc4, 0x73, 0x5c, 0xcf, 0x87, 0xc4, ++ 0x89, 0x9f, 0x66, 0xb5, 0x8a, 0xf7, 0x01, 0x73, 0xf8, 0xbd, 0xed, 0x9c, ++ 0x36, 0xe2, 0x07, 0xa1, 0xb8, 0xf6, 0x98, 0xd8, 0x3e, 0xae, 0x4d, 0xac, ++ 0x5f, 0xa7, 0xd9, 0x7f, 0xce, 0xb7, 0x71, 0x3d, 0xb5, 0x91, 0x54, 0x90, ++ 0xbb, 0x8d, 0x5f, 0xeb, 0x25, 0x58, 0x3f, 0x3a, 0x3a, 0x89, 0x73, 0x0d, ++ 0xc5, 0xb7, 0x63, 0x51, 0x6f, 0x1c, 0xbf, 0xe3, 0x73, 0x82, 0x7e, 0x62, ++ 0xc7, 0xd7, 0xfa, 0xa2, 0x48, 0xf7, 0x63, 0x96, 0xdb, 0x18, 0xff, 0x36, ++ 0x19, 0x08, 0xda, 0xef, 0x4d, 0x65, 0x16, 0xbc, 0x77, 0xbe, 0xbf, 0xac, ++ 0xa2, 0x3f, 0xf8, 0x17, 0x5f, 0xdc, 0xe5, 0xee, 0x1f, 0x29, 0x4e, 0x19, ++ 0xe2, 0xa7, 0x25, 0xb0, 0xef, 0xee, 0x5d, 0x09, 0x64, 0x2c, 0xc8, 0xe1, ++ 0x5a, 0x89, 0xd1, 0xbb, 0x3e, 0xa3, 0x24, 0xc2, 0xba, 0xa5, 0xca, 0x9d, ++ 0x2a, 0x87, 0xaa, 0xfc, 0x65, 0x94, 0xc5, 0xb9, 0x23, 0xdd, 0x43, 0xfd, ++ 0xcc, 0x26, 0xa1, 0x9c, 0xe5, 0x95, 0x0d, 0x91, 0x0c, 0x20, 0x3f, 0x7b, ++ 0x25, 0x0c, 0x7f, 0xb5, 0xaf, 0xa1, 0x78, 0x5d, 0x66, 0xdd, 0xf6, 0x91, ++ 0x35, 0x7d, 0x00, 0x1f, 0x4f, 0xf3, 0x67, 0x78, 0x9f, 0xcc, 0xd4, 0x22, ++ 0xb9, 0x22, 0xdd, 0xd3, 0x79, 0xd8, 0x66, 0x63, 0xf7, 0x1b, 0xd7, 0xf8, ++ 0x56, 0xc3, 0xbd, 0x91, 0x5f, 0x50, 0x25, 0x02, 0x3b, 0x95, 0x61, 0xa8, ++ 0xcf, 0x8a, 0x04, 0xdf, 0x47, 0x36, 0xa2, 0x5f, 0x7a, 0x97, 0xcd, 0xc1, ++ 0xde, 0x33, 0xf1, 0x3c, 0x48, 0x72, 0x7d, 0x06, 0xdc, 0xa7, 0x68, 0x6f, ++ 0x9e, 0x34, 0x79, 0x1d, 0xc5, 0xf3, 0x09, 0xaa, 0x0f, 0xb0, 0x5e, 0x6d, ++ 0x52, 0x9c, 0x88, 0xb7, 0xaf, 0x8a, 0x10, 0xbc, 0x27, 0xcb, 0xe3, 0x75, ++ 0x7d, 0xa7, 0x91, 0x2d, 0x1b, 0x42, 0xfc, 0xdf, 0xcd, 0xb6, 0xdc, 0x46, ++ 0x1b, 0x85, 0xd7, 0x68, 0x63, 0xdf, 0x5b, 0xf6, 0x72, 0x3b, 0x25, 0xc0, ++ 0xdb, 0xf9, 0x5f, 0xff, 0xb0, 0x01, 0xfc, 0x8e, 0x8b, 0x46, 0xe4, 0x5f, ++ 0x6f, 0xee, 0x6f, 0xaa, 0xef, 0x1d, 0xe0, 0xf4, 0x19, 0x97, 0xe0, 0xda, ++ 0x0a, 0xef, 0x13, 0xf8, 0xe5, 0x67, 0xd4, 0xf8, 0x38, 0xdd, 0x36, 0xe7, ++ 0xa2, 0x51, 0x10, 0x97, 0xa7, 0xf4, 0x0e, 0xb1, 0x83, 0x41, 0xbe, 0xf9, ++ 0x58, 0x7e, 0x14, 0x37, 0xc1, 0xf3, 0x8f, 0x24, 0x8b, 0x0e, 0xe5, 0x90, ++ 0xb8, 0x5c, 0x0e, 0xbb, 0x70, 0x9f, 0xdd, 0x87, 0x7a, 0xa3, 0xea, 0x01, ++ 0x09, 0x48, 0x04, 0xf2, 0x14, 0xa8, 0xf6, 0x4d, 0x6a, 0x91, 0x02, 0x56, ++ 0x2a, 0xf7, 0xa3, 0x4d, 0x96, 0x00, 0xdc, 0xa3, 0x4b, 0x2a, 0xa7, 0xf3, ++ 0x4e, 0x86, 0xbc, 0x26, 0x26, 0x06, 0xaf, 0x55, 0x3e, 0x27, 0xc6, 0xb5, ++ 0xa8, 0x3c, 0xe6, 0x80, 0x73, 0x4f, 0xf0, 0xea, 0x3c, 0x04, 0x52, 0x01, ++ 0xbe, 0x6a, 0xf7, 0x54, 0x7b, 0xb9, 0x36, 0x91, 0xd9, 0xa3, 0xb5, 0x0f, ++ 0xc9, 0x98, 0x17, 0x75, 0xb3, 0xdc, 0x66, 0x86, 0x78, 0x6a, 0x96, 0xcb, ++ 0x91, 0x07, 0x29, 0x22, 0x93, 0x64, 0x07, 0xde, 0xab, 0xe9, 0x57, 0x4e, ++ 0x9c, 0x14, 0x43, 0x12, 0x3f, 0xf0, 0xd7, 0x89, 0xdd, 0x7e, 0x00, 0x55, ++ 0xf2, 0x6b, 0xbe, 0xd1, 0xcf, 0x8b, 0xf4, 0xdd, 0xd6, 0x45, 0x1b, 0xf3, ++ 0xb7, 0xc7, 0x25, 0xb8, 0xff, 0x0c, 0xf4, 0x1a, 0x7e, 0xb8, 0x73, 0x3f, ++ 0xb8, 0x0b, 0x4e, 0x33, 0xe9, 0xc5, 0xee, 0x7f, 0x71, 0x3b, 0xc1, 0xfd, ++ 0x9a, 0x42, 0xbe, 0xde, 0x8d, 0xfb, 0x0f, 0x1d, 0xfb, 0x5e, 0x34, 0x70, ++ 0x03, 0x09, 0xfd, 0x8e, 0x4a, 0x6b, 0x27, 0x36, 0x99, 0xd9, 0x3a, 0x3f, ++ 0xee, 0x7a, 0xb6, 0xee, 0x8d, 0x3b, 0x6f, 0xc1, 0x75, 0xaf, 0xdb, 0x4e, ++ 0x94, 0x15, 0xe2, 0x3a, 0x35, 0xb2, 0x65, 0xd4, 0x01, 0xb8, 0x67, 0x31, ++ 0xf2, 0x43, 0xa6, 0x9f, 0x84, 0xdb, 0x07, 0x3b, 0xfd, 0x03, 0x74, 0xca, ++ 0x39, 0xec, 0xd3, 0x03, 0x7d, 0xbe, 0xad, 0x5d, 0xd0, 0xf2, 0x9b, 0x04, ++ 0x4c, 0xdd, 0xf5, 0xa1, 0x3a, 0x38, 0x87, 0xa1, 0xfa, 0x16, 0xf2, 0xfe, ++ 0x59, 0x8d, 0x1d, 0x59, 0x31, 0x7d, 0x50, 0x2d, 0x86, 0x97, 0xb9, 0x1c, ++ 0xf5, 0xbf, 0xc7, 0xa9, 0x77, 0x87, 0xd0, 0x51, 0xfb, 0x7e, 0x77, 0x9c, ++ 0x52, 0x32, 0x75, 0x3f, 0x77, 0x0c, 0x04, 0x3b, 0x72, 0x44, 0x0f, 0xf7, ++ 0x42, 0x3a, 0x72, 0xe9, 0xfc, 0xe8, 0xfc, 0x37, 0x72, 0x7d, 0x49, 0xfc, ++ 0xdc, 0x3f, 0x19, 0xe6, 0xb5, 0xb1, 0xe5, 0x46, 0x33, 0xc8, 0xf7, 0xda, ++ 0x40, 0x9e, 0xbd, 0x98, 0xbe, 0x93, 0x68, 0x2a, 0x41, 0xe6, 0x25, 0x12, ++ 0x17, 0xc6, 0x73, 0x46, 0x52, 0x8f, 0x0c, 0xf2, 0x63, 0xd4, 0xa2, 0x50, ++ 0x50, 0x7f, 0x50, 0x29, 0x21, 0x09, 0x29, 0x70, 0x0f, 0xad, 0x48, 0x88, ++ 0xf7, 0x10, 0x4b, 0x12, 0xcf, 0xff, 0x12, 0x40, 0xbe, 0x74, 0xcb, 0x29, ++ 0x95, 0xe3, 0xd0, 0x7b, 0xb9, 0xaa, 0x7c, 0x6a, 0xe5, 0x51, 0x95, 0xdf, ++ 0x5a, 0x38, 0x68, 0x81, 0xf3, 0x41, 0x88, 0x98, 0xd3, 0x52, 0x2f, 0x35, ++ 0xe1, 0x61, 0xa0, 0x91, 0x6c, 0xb6, 0xc3, 0xfa, 0xae, 0xfa, 0x97, 0xb5, ++ 0xdc, 0x9f, 0xab, 0x35, 0x67, 0xfa, 0xf1, 0xfb, 0x25, 0x5f, 0x06, 0xfa, ++ 0x47, 0x2b, 0xb9, 0x7f, 0x54, 0x6b, 0x29, 0x34, 0xa1, 0x39, 0xd8, 0x97, ++ 0x8c, 0xeb, 0xfa, 0x4a, 0x88, 0x9f, 0x50, 0x3a, 0xac, 0x4c, 0x61, 0x76, ++ 0x5e, 0x9d, 0x8f, 0x56, 0x2e, 0x3d, 0x17, 0xf5, 0xc4, 0x1f, 0xb2, 0x4f, ++ 0xf0, 0xc8, 0x9d, 0x78, 0x1f, 0xd1, 0x73, 0xd1, 0x80, 0xcf, 0xd7, 0x29, ++ 0xee, 0x01, 0x30, 0x7f, 0x95, 0x3e, 0xd7, 0x70, 0xfa, 0x68, 0xe9, 0x21, ++ 0x25, 0xf0, 0x7d, 0x27, 0xa7, 0x4b, 0xcf, 0xf8, 0xe6, 0xd8, 0xe1, 0x5e, ++ 0x70, 0xa2, 0xc9, 0x45, 0xd6, 0x23, 0xbe, 0x79, 0x78, 0x8f, 0xbb, 0x29, ++ 0x30, 0xd2, 0x04, 0xeb, 0xef, 0xbd, 0x1a, 0x7c, 0x63, 0xc0, 0xf3, 0xda, ++ 0x84, 0x31, 0xe1, 0x78, 0xca, 0x96, 0x28, 0x78, 0x26, 0x33, 0x3c, 0xaf, ++ 0x23, 0xee, 0x3f, 0xb6, 0x51, 0xf9, 0xcd, 0x59, 0x51, 0x57, 0x1b, 0x8f, ++ 0x7a, 0x45, 0xde, 0x4a, 0xcf, 0x09, 0xd7, 0x2b, 0xad, 0x1e, 0xa9, 0x7a, ++ 0xa3, 0xc6, 0x79, 0xaf, 0xad, 0xac, 0x3f, 0x80, 0xd7, 0x6e, 0x7b, 0xd0, ++ 0x1b, 0x4f, 0x3c, 0xa3, 0x8b, 0x53, 0x29, 0xc1, 0xfb, 0x55, 0xce, 0x3d, ++ 0xf1, 0x68, 0x47, 0xb4, 0xfa, 0xf4, 0x39, 0x9f, 0xbf, 0x27, 0x9e, 0xd1, ++ 0x6f, 0x81, 0xe2, 0x9e, 0x01, 0xf3, 0xf3, 0xe8, 0x3a, 0x33, 0x41, 0x4e, ++ 0x86, 0x3b, 0x48, 0xaf, 0x62, 0x8a, 0xe4, 0xf0, 0x66, 0x3d, 0xea, 0x39, ++ 0x69, 0x8d, 0xed, 0x1e, 0xbe, 0xea, 0x5f, 0xa9, 0x7e, 0x95, 0xb6, 0x9f, ++ 0xea, 0x57, 0xa9, 0xf6, 0x58, 0xbd, 0x07, 0xbf, 0x36, 0xc1, 0x3d, 0x1f, ++ 0xe4, 0x40, 0x6a, 0xa6, 0x72, 0x4b, 0xf1, 0xa9, 0xb5, 0xb3, 0xfd, 0xd2, ++ 0x66, 0x9b, 0x7b, 0x11, 0xe0, 0x15, 0x4f, 0x71, 0x8f, 0x83, 0x7d, 0xe3, ++ 0x90, 0x40, 0x16, 0xfb, 0xfe, 0x57, 0xd4, 0x8b, 0x68, 0x7a, 0x10, 0xaf, ++ 0x91, 0xf3, 0xa6, 0x80, 0x8c, 0xeb, 0x82, 0x8f, 0xae, 0x0b, 0xd9, 0x52, ++ 0x38, 0x1e, 0xea, 0xf8, 0x83, 0x12, 0x12, 0x19, 0x1f, 0xa9, 0x96, 0xc3, ++ 0x7a, 0xdf, 0x37, 0x87, 0xb0, 0xc1, 0xaa, 0x09, 0xe6, 0xcd, 0xe9, 0x3b, ++ 0x9c, 0xb8, 0x61, 0xdd, 0xea, 0x3b, 0x92, 0xdd, 0x67, 0x5c, 0x93, 0xc0, ++ 0xec, 0x6f, 0x6d, 0x02, 0x5b, 0xb7, 0xd4, 0x72, 0xb3, 0xad, 0xe4, 0x6e, ++ 0xd4, 0x6f, 0x99, 0xf8, 0x8c, 0x23, 0xbf, 0x3b, 0xde, 0x80, 0x2a, 0xdc, ++ 0x37, 0x5f, 0x9b, 0xe0, 0xba, 0x0b, 0xe8, 0x61, 0x2a, 0x72, 0xe1, 0x3c, ++ 0xfa, 0xd8, 0x89, 0x13, 0xfc, 0xd2, 0x3e, 0x72, 0x93, 0x04, 0xdf, 0x8d, ++ 0x26, 0x55, 0x3a, 0x24, 0x76, 0xcf, 0x9c, 0x04, 0xbf, 0xdf, 0xa2, 0xf0, ++ 0xfa, 0x14, 0x3b, 0x72, 0x41, 0x5f, 0xfb, 0xc0, 0xfe, 0x1a, 0xfa, 0xb7, ++ 0x44, 0xce, 0x33, 0xf6, 0x68, 0x82, 0x7a, 0xbf, 0x97, 0xf9, 0x9f, 0x4e, ++ 0xd2, 0x9d, 0xc7, 0xeb, 0xd1, 0x04, 0xe6, 0x7f, 0x1e, 0x82, 0xd4, 0x27, ++ 0xbd, 0x8a, 0xd5, 0xbc, 0x60, 0xea, 0x79, 0x8e, 0x53, 0x02, 0x3a, 0xb5, ++ 0x5b, 0x6f, 0x43, 0xa4, 0xdb, 0x2f, 0x48, 0xcc, 0x4f, 0x4f, 0x64, 0xf4, ++ 0xd2, 0xee, 0x13, 0x80, 0xf0, 0xa1, 0xbf, 0x7f, 0xef, 0x5e, 0x03, 0x91, ++ 0xcd, 0x49, 0x24, 0xf8, 0x7b, 0x56, 0x75, 0x26, 0xf4, 0xef, 0xe3, 0x89, ++ 0xb3, 0x09, 0xec, 0xd5, 0xae, 0x84, 0x01, 0xfc, 0x1c, 0xd3, 0x59, 0x07, ++ 0xf5, 0x5f, 0xc9, 0x9d, 0xa6, 0xc4, 0xa1, 0x41, 0x79, 0x57, 0xe5, 0xf8, ++ 0xc1, 0x09, 0x33, 0x9c, 0x90, 0x8a, 0xd4, 0x76, 0x7d, 0xd7, 0x70, 0xd8, ++ 0x53, 0x51, 0xb9, 0xde, 0x09, 0xf4, 0x6f, 0x9f, 0xd0, 0x35, 0x18, 0x73, ++ 0x50, 0x92, 0xce, 0x4c, 0x26, 0x3f, 0x2e, 0xbd, 0x90, 0x2f, 0x48, 0xe5, ++ 0x43, 0xb3, 0x22, 0xf0, 0xc1, 0x0c, 0xfb, 0xf0, 0x50, 0x3b, 0x69, 0x35, ++ 0x0c, 0x01, 0x7f, 0xb4, 0x5d, 0x8a, 0x73, 0xc2, 0x3d, 0x8b, 0xf6, 0xa5, ++ 0x12, 0xc3, 0x57, 0x32, 0xf1, 0x7c, 0x4a, 0xb2, 0x30, 0xcf, 0xf4, 0x78, ++ 0xe6, 0x5f, 0x77, 0x70, 0x7b, 0xf5, 0x4e, 0x42, 0x16, 0xca, 0x89, 0x6a, ++ 0x8f, 0xe9, 0xfc, 0xea, 0xa0, 0xd4, 0xce, 0xc3, 0x63, 0xc4, 0x3b, 0x1d, ++ 0xa4, 0x73, 0x4f, 0xbc, 0x7f, 0x2b, 0x9c, 0x5b, 0x69, 0xf2, 0x4f, 0x6a, ++ 0xf3, 0x53, 0x4e, 0x5a, 0x68, 0xc1, 0xfb, 0x1f, 0x1b, 0xf7, 0x98, 0x71, ++ 0xff, 0xda, 0x55, 0xc2, 0xce, 0xf1, 0xbb, 0x5a, 0x8c, 0x68, 0x9f, 0xa3, ++ 0xe9, 0x6d, 0x5a, 0x9b, 0x39, 0x62, 0x1c, 0x47, 0x2d, 0x29, 0xfd, 0xde, ++ 0x02, 0xfa, 0xa5, 0x29, 0x35, 0x89, 0x60, 0x0f, 0xd3, 0xe6, 0x9e, 0xb4, ++ 0x01, 0xdf, 0xb5, 0x74, 0xe9, 0x90, 0x7c, 0xd7, 0x1c, 0x82, 0x7d, 0xd1, ++ 0xeb, 0x4a, 0xc4, 0xef, 0x6e, 0xd5, 0x32, 0x3d, 0xfd, 0xa6, 0xc4, 0x45, ++ 0xb4, 0x7f, 0x7a, 0xc6, 0x64, 0x2c, 0xd5, 0xe7, 0x0d, 0x16, 0x39, 0xe2, ++ 0x7d, 0xf3, 0xd3, 0x5c, 0xaf, 0x54, 0x79, 0xbc, 0x92, 0x8e, 0xc8, 0xf7, ++ 0x43, 0xa7, 0x41, 0x1e, 0xcf, 0xbb, 0xdf, 0x7c, 0xc7, 0x45, 0x82, 0xf7, ++ 0xf7, 0x1b, 0xe2, 0x18, 0x1d, 0x1b, 0xe2, 0x18, 0x1d, 0xbb, 0xdc, 0xe3, ++ 0x13, 0x9e, 0x06, 0x79, 0xf3, 0x65, 0xa0, 0x3e, 0x2c, 0x56, 0xcf, 0x41, ++ 0xf9, 0xfe, 0x5f, 0xcd, 0x33, 0xa5, 0x8e, 0xb7, 0xd1, 0x6b, 0x4a, 0x94, ++ 0xa9, 0x0a, 0x34, 0x2c, 0x98, 0x62, 0x86, 0x75, 0x22, 0x85, 0xb8, 0x26, ++ 0xcf, 0x06, 0x65, 0xdd, 0xa8, 0x10, 0xf8, 0x8e, 0xe8, 0x31, 0xef, 0x8e, ++ 0xc4, 0x7c, 0x8c, 0x63, 0x9b, 0xc4, 0x7b, 0xbe, 0x76, 0x76, 0x6f, 0xf8, ++ 0xf3, 0x8d, 0x05, 0xf8, 0x9d, 0x77, 0x2a, 0x59, 0x63, 0x1e, 0x4c, 0xe9, ++ 0x51, 0x56, 0xa2, 0x73, 0x42, 0xfc, 0xe0, 0xfc, 0x82, 0xf7, 0x6d, 0x3a, ++ 0x2a, 0x4f, 0x0b, 0xfa, 0xb4, 0xe6, 0x80, 0xfc, 0xbe, 0xae, 0xb8, 0x89, ++ 0x7d, 0x0c, 0x86, 0xba, 0x70, 0x7f, 0xb2, 0xa4, 0xd4, 0xe0, 0x0f, 0x50, ++ 0xbe, 0x25, 0x37, 0x50, 0x43, 0x41, 0xe9, 0xf2, 0xdf, 0x45, 0xdb, 0xcb, ++ 0xb7, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x8b, 0x08, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xb5, 0x7d, 0x0b, 0x78, 0x54, 0xd5, ++ 0xb5, 0xf0, 0x3e, 0x73, 0xce, 0x3c, 0x92, 0x99, 0x24, 0x33, 0x79, 0x4e, ++ 0x1e, 0xc0, 0x09, 0xe1, 0x9d, 0x10, 0x87, 0x24, 0xbc, 0x1f, 0x4e, 0x9e, ++ 0x44, 0x88, 0x30, 0xbc, 0x04, 0x85, 0xea, 0x80, 0x28, 0xcf, 0x24, 0x88, ++ 0xd6, 0xdf, 0xb6, 0xde, 0xcb, 0xc4, 0x44, 0xf4, 0xa2, 0xb7, 0x45, 0xe9, ++ 0xaf, 0xf4, 0xd6, 0xdb, 0x7f, 0xb0, 0xa2, 0xa8, 0x20, 0x01, 0x82, 0x06, ++ 0x9a, 0xa4, 0x13, 0x40, 0xe4, 0x11, 0x34, 0x08, 0xa8, 0xa8, 0xad, 0x51, ++ 0x29, 0x62, 0x0b, 0xc9, 0x08, 0xea, 0xc5, 0xd6, 0x7b, 0xfd, 0xd7, 0x5a, ++ 0x7b, 0x9f, 0xcc, 0xcc, 0x49, 0x22, 0xd8, 0xde, 0x4e, 0x3e, 0xbf, 0xed, ++ 0x3e, 0x8f, 0xbd, 0xd7, 0x5e, 0xef, 0xb5, 0xf6, 0xda, 0x87, 0x2e, 0xc9, ++ 0x77, 0x13, 0x4b, 0x64, 0xcc, 0xb7, 0xd8, 0xc0, 0xb6, 0x4a, 0x8c, 0x7d, ++ 0x87, 0xbf, 0x1b, 0x43, 0xad, 0xd9, 0x6e, 0x60, 0x2c, 0x89, 0xb1, 0x96, ++ 0x38, 0x3b, 0xb5, 0x4e, 0xe7, 0x0c, 0xc7, 0xd2, 0x84, 0xf0, 0x7e, 0x85, ++ 0x63, 0x69, 0x3e, 0x63, 0xd5, 0xd6, 0xd8, 0x5c, 0x16, 0x87, 0x6d, 0x7f, ++ 0x3f, 0x8b, 0x85, 0xf1, 0x8a, 0x58, 0xea, 0xd2, 0x02, 0x68, 0x5b, 0xac, ++ 0xae, 0x5a, 0x95, 0xb1, 0x25, 0x46, 0xaf, 0xdd, 0x0e, 0xcf, 0x77, 0x4e, ++ 0xba, 0x3c, 0xa4, 0x8e, 0xe1, 0x2f, 0xd8, 0xdf, 0x33, 0x92, 0xb1, 0x2e, ++ 0x23, 0x6b, 0x94, 0xe2, 0xb0, 0x1f, 0x60, 0x6c, 0x0c, 0x43, 0x50, 0xf8, ++ 0xcf, 0xed, 0x56, 0xed, 0xd0, 0x97, 0xf0, 0xff, 0xe1, 0xfd, 0x44, 0x8b, ++ 0x2d, 0x20, 0xc3, 0xb8, 0xcc, 0xa3, 0x5c, 0xec, 0xb0, 0xf0, 0x47, 0xbe, ++ 0x1b, 0x28, 0x1e, 0x4d, 0x66, 0xcc, 0x28, 0x5e, 0x93, 0x9a, 0xde, 0xf8, ++ 0x46, 0xca, 0x65, 0x2c, 0x76, 0x72, 0x11, 0x63, 0x70, 0xdf, 0xca, 0x5c, ++ 0x8f, 0xb2, 0x2c, 0xb8, 0x31, 0x8c, 0xa9, 0x9e, 0x18, 0xc6, 0xa2, 0xd8, ++ 0x33, 0xf6, 0xf3, 0xd9, 0x8c, 0x19, 0xf0, 0x7d, 0x58, 0x47, 0x57, 0xf3, ++ 0xbb, 0xfd, 0x7c, 0x00, 0xc7, 0x1f, 0xfe, 0xe5, 0x4a, 0x0c, 0x83, 0xfb, ++ 0x1f, 0x29, 0xc1, 0x18, 0x57, 0x0e, 0x63, 0x17, 0x1e, 0x3c, 0x15, 0xe3, ++ 0xb6, 0xc1, 0xf5, 0x07, 0xe5, 0x72, 0x3f, 0xf4, 0x6f, 0x47, 0x40, 0xc6, ++ 0x87, 0xf0, 0x92, 0x6f, 0x87, 0x0b, 0xa3, 0x19, 0x7b, 0xc4, 0xee, 0x19, ++ 0x81, 0xeb, 0xba, 0x63, 0xdd, 0x7f, 0x8f, 0xf1, 0xda, 0x42, 0xf7, 0xd9, ++ 0x03, 0x70, 0x31, 0x95, 0xb1, 0x15, 0x7e, 0x19, 0xe7, 0xe6, 0xf0, 0xc2, ++ 0x7f, 0xab, 0xb6, 0x59, 0x19, 0xb3, 0x84, 0xfa, 0x95, 0xf5, 0x09, 0x11, ++ 0x7d, 0xc0, 0x18, 0xe1, 0xb5, 0xd2, 0xcc, 0xd6, 0xd4, 0xdb, 0x7a, 0xd2, ++ 0x63, 0x05, 0xd2, 0x03, 0xe6, 0x5d, 0xb1, 0x7d, 0x8b, 0x29, 0x5d, 0xc5, ++ 0xf9, 0xbd, 0x93, 0xec, 0xd0, 0xbf, 0xa0, 0xc0, 0xab, 0x80, 0xef, 0x0b, ++ 0x0d, 0x31, 0x7e, 0x5f, 0x66, 0x08, 0x9e, 0x25, 0xdb, 0x47, 0x99, 0xd2, ++ 0xe1, 0xd6, 0x47, 0x4d, 0x66, 0x16, 0x80, 0x75, 0x30, 0xa5, 0xdd, 0xc8, ++ 0x6c, 0x84, 0xb5, 0x0a, 0x09, 0xf0, 0xe6, 0x15, 0x78, 0xd3, 0xc3, 0x79, ++ 0xb8, 0xc5, 0x4a, 0xe3, 0xdd, 0xf5, 0x7f, 0x65, 0xbf, 0x19, 0x96, 0xba, ++ 0x18, 0xe6, 0x7a, 0x20, 0x1e, 0x9e, 0x6f, 0x5a, 0x51, 0xc1, 0x72, 0x7b, ++ 0xae, 0xe3, 0xae, 0x3f, 0xa8, 0x65, 0x29, 0x40, 0xbc, 0xbb, 0xfe, 0x4d, ++ 0x62, 0x3e, 0x95, 0x3f, 0xff, 0x60, 0x1e, 0x3c, 0xff, 0xc0, 0x23, 0x5f, ++ 0x20, 0xdd, 0xf4, 0xeb, 0x5c, 0xec, 0x33, 0x7e, 0xd2, 0x11, 0xb1, 0x6e, ++ 0x37, 0x63, 0x00, 0xcf, 0x32, 0x41, 0xef, 0x3b, 0x1f, 0x8d, 0xbc, 0xbf, ++ 0xac, 0xe9, 0x31, 0x1a, 0x67, 0x29, 0xf3, 0x9a, 0x90, 0x9e, 0x77, 0x6d, ++ 0xd4, 0xdf, 0xbf, 0xe9, 0x33, 0xe4, 0xbb, 0x65, 0x4c, 0x09, 0x5d, 0x07, ++ 0x3c, 0x5c, 0x3e, 0x92, 0x65, 0x45, 0x3c, 0xdc, 0x61, 0x8f, 0x49, 0x3c, ++ 0x0f, 0x20, 0x03, 0x8f, 0x8d, 0xfd, 0x0e, 0xde, 0xdf, 0x7d, 0x64, 0x60, ++ 0x9c, 0x37, 0xa7, 0x27, 0x7e, 0xb5, 0xf6, 0xe2, 0x3a, 0xe0, 0x6f, 0x33, ++ 0x63, 0x7f, 0x5e, 0x67, 0xa1, 0xf6, 0xc2, 0x3a, 0x46, 0xed, 0x08, 0xbb, ++ 0x4a, 0xf4, 0x59, 0xdd, 0x74, 0xf2, 0x7e, 0xe4, 0xaf, 0xaa, 0xc6, 0x5d, ++ 0x26, 0x1c, 0xa7, 0xc5, 0xff, 0xa7, 0x84, 0x09, 0xf0, 0x48, 0x61, 0xd3, ++ 0x37, 0x32, 0x32, 0x57, 0x21, 0x73, 0xdf, 0x7b, 0x0e, 0xf0, 0xf9, 0x23, ++ 0x26, 0xb3, 0xef, 0x00, 0x7f, 0xbb, 0x19, 0xe7, 0x9f, 0xf5, 0x46, 0xcf, ++ 0x3d, 0x48, 0xaf, 0x1b, 0xaf, 0x96, 0xd3, 0x7d, 0xfd, 0xfa, 0x17, 0x69, ++ 0xfc, 0x7f, 0x24, 0x9e, 0xf8, 0x67, 0x11, 0xae, 0x3b, 0x17, 0xaf, 0x2b, ++ 0x5f, 0xf6, 0xb6, 0xae, 0x9f, 0xe2, 0xba, 0x80, 0x9f, 0xd9, 0x58, 0x58, ++ 0x97, 0x7c, 0xfd, 0xeb, 0xd2, 0xd6, 0xa3, 0xad, 0x4f, 0xbb, 0x5f, 0x29, ++ 0x03, 0xdf, 0xf5, 0xf2, 0xbe, 0xc6, 0xef, 0x23, 0x84, 0x3e, 0x58, 0xfa, ++ 0xdc, 0xac, 0xf5, 0x69, 0x80, 0x8a, 0xda, 0xe6, 0xcf, 0xfa, 0x77, 0x10, ++ 0x3f, 0xb1, 0xd3, 0x28, 0xbf, 0x1a, 0x3f, 0x2d, 0x13, 0x74, 0xd2, 0xf3, ++ 0x8d, 0x46, 0xc7, 0x6e, 0xfe, 0x68, 0xfa, 0x77, 0x5a, 0x9f, 0x46, 0x3f, ++ 0xe0, 0x7f, 0xa7, 0xc1, 0x89, 0x6d, 0xc0, 0x69, 0x18, 0xd7, 0x93, 0x4f, ++ 0xf4, 0x7c, 0xa1, 0xe7, 0x83, 0x4e, 0x63, 0x47, 0x7f, 0x94, 0x5f, 0x3d, ++ 0x1f, 0x74, 0x4a, 0x6c, 0x41, 0x6f, 0xeb, 0xfa, 0x37, 0xfb, 0x40, 0x5a, ++ 0xd7, 0x52, 0xd5, 0x5d, 0x66, 0x87, 0xfb, 0x77, 0x31, 0xcf, 0x7a, 0x3b, ++ 0xad, 0x67, 0x23, 0x5d, 0xbf, 0xa0, 0x6c, 0x3c, 0xfc, 0x33, 0x94, 0xab, ++ 0xe7, 0x38, 0x5f, 0x77, 0xeb, 0x39, 0x33, 0x97, 0x37, 0x76, 0xdc, 0xe8, ++ 0x47, 0xbd, 0xb9, 0x36, 0x46, 0x4d, 0x71, 0xd8, 0x04, 0xfd, 0x80, 0xce, ++ 0x9d, 0xbb, 0xcc, 0x3e, 0x7c, 0x4e, 0x9b, 0xe7, 0xfc, 0x3a, 0xb7, 0x7b, ++ 0x90, 0x11, 0xf1, 0x5e, 0x4e, 0xed, 0x9f, 0xd7, 0x79, 0xdc, 0x83, 0x06, ++ 0x87, 0xee, 0xdf, 0xfd, 0xab, 0x2b, 0xb1, 0x2a, 0xbc, 0xdf, 0x35, 0x8c, ++ 0x95, 0xa3, 0xdc, 0x77, 0xc6, 0x44, 0xc2, 0xbb, 0xcf, 0x2e, 0x13, 0x3c, ++ 0xfb, 0x90, 0x0e, 0xc8, 0x7f, 0x4a, 0xfb, 0xff, 0x7c, 0x80, 0x3a, 0xe9, ++ 0xb9, 0xf6, 0x31, 0xa8, 0x47, 0xcf, 0x7f, 0xfb, 0x5f, 0xb1, 0x1e, 0x78, ++ 0xbe, 0xeb, 0x5b, 0x73, 0x79, 0x6f, 0xeb, 0x3c, 0x2d, 0xe8, 0x07, 0xea, ++ 0xe5, 0xb4, 0x13, 0xf8, 0xec, 0x76, 0x21, 0x67, 0xb7, 0x37, 0x55, 0x12, ++ 0x5d, 0x96, 0x3c, 0x33, 0xcb, 0x84, 0xfc, 0xcc, 0x1e, 0xe0, 0xf8, 0xb4, ++ 0xc0, 0x1f, 0xea, 0xd7, 0xb6, 0xa8, 0xd8, 0x67, 0x71, 0x1d, 0x8b, 0x1b, ++ 0x24, 0xd2, 0x23, 0x7a, 0x7a, 0xdc, 0xe5, 0x9a, 0xfa, 0x39, 0xea, 0xdb, ++ 0x3b, 0xfd, 0x85, 0xf4, 0x7e, 0x0f, 0xfa, 0xb0, 0xc7, 0x89, 0xbe, 0x77, ++ 0x21, 0x3d, 0x86, 0x85, 0xe8, 0x31, 0xd6, 0xa1, 0x72, 0x78, 0x54, 0xf8, ++ 0x03, 0xbe, 0xb9, 0x43, 0xf0, 0xcd, 0x79, 0x65, 0x8d, 0xc9, 0x00, 0x7a, ++ 0xe4, 0xfc, 0x33, 0x80, 0x6f, 0x00, 0x79, 0x95, 0xc2, 0xdc, 0xbd, 0xe9, ++ 0xc1, 0xfe, 0x0e, 0xce, 0x87, 0x7d, 0xad, 0x47, 0xbf, 0x8e, 0xbe, 0xe0, ++ 0x5f, 0xf6, 0x5c, 0xcd, 0xfa, 0x34, 0x86, 0xeb, 0x1f, 0x65, 0x4a, 0xeb, ++ 0x45, 0xef, 0x68, 0xeb, 0xbf, 0x8b, 0xb9, 0x62, 0x49, 0xef, 0x88, 0xf5, ++ 0xb2, 0x8e, 0x1b, 0x49, 0x5e, 0xab, 0x2d, 0x7c, 0x5e, 0x6d, 0x9d, 0x2b, ++ 0x9a, 0xee, 0x9c, 0x81, 0x7c, 0x51, 0xb5, 0x19, 0xe8, 0x95, 0xd9, 0x73, ++ 0xdd, 0xa8, 0x77, 0x17, 0xf7, 0x02, 0x6f, 0x99, 0x7c, 0xd1, 0x68, 0x81, ++ 0xf7, 0xba, 0x1e, 0x90, 0x5c, 0xa8, 0x6f, 0xfb, 0xa2, 0x83, 0xa6, 0x27, ++ 0xee, 0x12, 0xf8, 0x5a, 0xb9, 0x6d, 0xf1, 0x0c, 0x34, 0x9a, 0x8b, 0x61, ++ 0x3e, 0x39, 0x13, 0xf5, 0xd1, 0x17, 0x6f, 0xc6, 0x24, 0xa2, 0x5c, 0x41, ++ 0x5f, 0xfa, 0x1e, 0x7a, 0x35, 0xc9, 0x1f, 0x9b, 0x71, 0x1d, 0x8c, 0xe3, ++ 0x7b, 0x09, 0xe0, 0x7b, 0x83, 0x74, 0xfd, 0xf4, 0x5b, 0xb6, 0xb9, 0xd0, ++ 0x3d, 0x28, 0xec, 0xb9, 0x15, 0xfe, 0x9b, 0xdc, 0x83, 0xc2, 0xf5, 0x99, ++ 0x8e, 0xae, 0x6c, 0xdb, 0xac, 0xd0, 0xf3, 0x64, 0xb7, 0xdd, 0x26, 0xb4, ++ 0xc7, 0xf1, 0x0e, 0xa1, 0xbf, 0x84, 0x5e, 0xee, 0x5b, 0xbe, 0x60, 0xe1, ++ 0x00, 0xe7, 0xda, 0x1d, 0x0e, 0xb2, 0x6f, 0x6c, 0x8d, 0x83, 0xf4, 0x63, ++ 0x75, 0xd3, 0x16, 0x53, 0xb8, 0xdd, 0xd5, 0xe4, 0x4b, 0x93, 0xb7, 0xb1, ++ 0x0e, 0x3b, 0xf1, 0x59, 0x55, 0xe3, 0x13, 0xf4, 0x1c, 0xe8, 0x5f, 0xd5, ++ 0x01, 0xfd, 0x4a, 0x4b, 0xc7, 0xcf, 0x6f, 0x55, 0xc3, 0xf0, 0x39, 0x4e, ++ 0xd0, 0x51, 0xae, 0x30, 0xa1, 0xfe, 0xee, 0x4b, 0x7f, 0x82, 0xbe, 0xf9, ++ 0xb2, 0x23, 0x6c, 0x9d, 0x23, 0x1c, 0xc2, 0xae, 0x08, 0xfd, 0x7b, 0x2d, ++ 0xfd, 0xa0, 0xc1, 0xad, 0x1f, 0x57, 0xd3, 0x07, 0x1a, 0xdc, 0x1a, 0xdf, ++ 0x6b, 0xeb, 0xd1, 0xf3, 0x7d, 0x5f, 0xf0, 0xe9, 0xe9, 0xc2, 0x98, 0x9f, ++ 0xfb, 0x0b, 0x3a, 0xfa, 0xac, 0x42, 0x7a, 0x84, 0xf5, 0x11, 0x5e, 0x05, ++ 0xf0, 0xdb, 0xd6, 0x6c, 0xf5, 0x3f, 0x04, 0xf0, 0xb6, 0x49, 0x1c, 0x7e, ++ 0x5f, 0x73, 0x14, 0xc1, 0xdf, 0xe9, 0x2c, 0x76, 0x9f, 0x03, 0x3f, 0xaf, ++ 0x2a, 0x75, 0x21, 0xb5, 0x27, 0xf0, 0xc5, 0x54, 0xf4, 0xeb, 0x3c, 0xd3, ++ 0x10, 0x9f, 0x9a, 0x3f, 0xc7, 0x0a, 0x12, 0x22, 0xfc, 0x24, 0x7d, 0xab, ++ 0xf9, 0x37, 0x79, 0xc2, 0x9f, 0xda, 0x1b, 0xe5, 0xce, 0x07, 0x13, 0x09, ++ 0x3f, 0x4f, 0x02, 0xf2, 0xc3, 0x94, 0x9a, 0x8e, 0x39, 0x16, 0x20, 0xd9, ++ 0xad, 0x8e, 0xed, 0xe5, 0x0a, 0x8c, 0x3f, 0xe5, 0x89, 0x8e, 0x39, 0x51, ++ 0xd0, 0x5f, 0xe8, 0xd8, 0xc1, 0xfb, 0x5b, 0x3b, 0x4e, 0x59, 0x5c, 0x8c, ++ 0xd5, 0xb0, 0x57, 0xca, 0x4b, 0xa0, 0x7f, 0x3b, 0xa0, 0x13, 0xc7, 0xbb, ++ 0x56, 0x5b, 0x60, 0xf6, 0x2c, 0x44, 0xf9, 0x5d, 0x0d, 0x7e, 0x92, 0x05, ++ 0xec, 0xd1, 0xea, 0xd3, 0x43, 0x0e, 0xa1, 0xdc, 0xad, 0x6e, 0xaf, 0x28, ++ 0x97, 0xc0, 0xee, 0xac, 0x06, 0x83, 0x23, 0x81, 0x3d, 0xaa, 0x74, 0xc7, ++ 0x06, 0xac, 0xb9, 0xd4, 0x67, 0x13, 0xe0, 0xb9, 0xe7, 0xed, 0xde, 0x65, ++ 0xc4, 0x2f, 0x57, 0xeb, 0xc8, 0x6e, 0xad, 0x3e, 0xad, 0x70, 0xb9, 0x39, ++ 0x92, 0x48, 0xeb, 0x57, 0x00, 0xf6, 0x28, 0x78, 0xaf, 0x2e, 0x1a, 0xfc, ++ 0x55, 0xc0, 0x57, 0x5d, 0xbc, 0xc5, 0x55, 0x9b, 0x49, 0xd7, 0x7d, 0x51, ++ 0xf1, 0xd8, 0x77, 0xab, 0x6a, 0xd8, 0x75, 0x8d, 0x1e, 0xf8, 0x1e, 0xc2, ++ 0x51, 0x67, 0x60, 0x6e, 0x07, 0xb4, 0xad, 0x47, 0x87, 0xc4, 0x75, 0x7c, ++ 0x8f, 0xdd, 0x6e, 0x5d, 0xc7, 0x2a, 0x14, 0xe0, 0x83, 0x83, 0xeb, 0x2c, ++ 0xd4, 0xea, 0xef, 0x17, 0x9a, 0xec, 0x83, 0xd0, 0xee, 0x15, 0x1a, 0x98, ++ 0xb7, 0x37, 0x7d, 0xf9, 0xa4, 0x83, 0xfb, 0x8d, 0xc0, 0xe4, 0xe9, 0x48, ++ 0xe7, 0xaa, 0x23, 0x26, 0x92, 0x77, 0xfc, 0xa1, 0x1f, 0x58, 0x29, 0xf4, ++ 0x51, 0x15, 0x10, 0x28, 0x0e, 0xe0, 0xa9, 0x3c, 0xcd, 0x02, 0xd1, 0xb1, ++ 0xf8, 0x5c, 0xd9, 0xe7, 0x0a, 0xb6, 0x0d, 0x12, 0xfb, 0x24, 0xc2, 0x5f, ++ 0x61, 0xa1, 0xbe, 0xdc, 0x37, 0xdc, 0xd7, 0xdb, 0x56, 0xe1, 0x78, 0x83, ++ 0xc3, 0xf9, 0x84, 0xe3, 0xa9, 0x48, 0x91, 0x2a, 0x94, 0xb0, 0x79, 0x4b, ++ 0x6c, 0x51, 0x11, 0x7d, 0x39, 0xc5, 0x30, 0x0c, 0xd7, 0xc3, 0xe4, 0x68, ++ 0xd7, 0x56, 0xc0, 0xaf, 0x9c, 0x6e, 0x58, 0xb3, 0x1b, 0xd6, 0x2f, 0x0f, ++ 0x80, 0x16, 0xf0, 0xa1, 0xd8, 0x5d, 0xf2, 0x62, 0x68, 0x37, 0x16, 0x4f, ++ 0x91, 0x97, 0x40, 0x5b, 0x6b, 0xe4, 0x76, 0xb5, 0xd6, 0xc0, 0x96, 0x87, ++ 0xe3, 0xe9, 0x05, 0x81, 0x1f, 0xad, 0xfd, 0xc0, 0xe1, 0xd9, 0x8a, 0x74, ++ 0xbf, 0xf4, 0x56, 0xfb, 0x18, 0x2b, 0xe9, 0xab, 0x0c, 0x3b, 0xc9, 0xb9, ++ 0x58, 0x6f, 0xad, 0xe4, 0x0a, 0x50, 0xdc, 0xd4, 0xca, 0x5c, 0x5b, 0xe1, ++ 0x5a, 0x9d, 0xec, 0x61, 0x9c, 0x8f, 0xeb, 0x19, 0xf2, 0xf1, 0x1b, 0x62, ++ 0x1c, 0x97, 0xd9, 0xb0, 0x47, 0x05, 0x7e, 0x6d, 0x74, 0x7c, 0x40, 0xfc, ++ 0xeb, 0x8a, 0x33, 0xdc, 0x9b, 0x09, 0xfd, 0xc0, 0x13, 0x1f, 0xf1, 0x7e, ++ 0xba, 0xe1, 0x4a, 0x26, 0xf0, 0xf7, 0x81, 0x27, 0x3a, 0xca, 0x15, 0x90, ++ 0x07, 0x57, 0xb6, 0xe1, 0xca, 0x40, 0xe8, 0x1f, 0x7a, 0xe2, 0x63, 0x7e, ++ 0x7f, 0x22, 0x0c, 0x09, 0x06, 0xea, 0xf0, 0x13, 0x9f, 0x94, 0xfb, 0x6c, ++ 0x38, 0x2e, 0xd7, 0x67, 0x6c, 0xbb, 0x3b, 0x1b, 0xe7, 0x51, 0x0c, 0x12, ++ 0xc9, 0xa9, 0x72, 0xc0, 0xe4, 0xaf, 0x85, 0xff, 0xad, 0x8b, 0xe5, 0xfc, ++ 0x54, 0x07, 0x3c, 0x82, 0xfc, 0xf7, 0x86, 0xb0, 0xb3, 0xeb, 0x6b, 0x8a, ++ 0x5e, 0xb6, 0x02, 0xff, 0x2b, 0x45, 0x6e, 0x75, 0x0d, 0x8c, 0xe3, 0xc7, ++ 0x80, 0x69, 0xf4, 0xdf, 0xdf, 0x6a, 0x78, 0x94, 0xad, 0x06, 0x8a, 0x53, ++ 0xb0, 0x45, 0x7c, 0xbf, 0x29, 0xd6, 0xad, 0xd1, 0x81, 0x35, 0xb8, 0xb3, ++ 0x67, 0xa1, 0x5e, 0xa8, 0x77, 0x67, 0xcf, 0x8e, 0x41, 0xbc, 0x7a, 0x4f, ++ 0x22, 0x5e, 0xf3, 0xdb, 0xda, 0xa7, 0xa0, 0x3e, 0x6e, 0x78, 0xfb, 0xfd, ++ 0x31, 0xe8, 0xaf, 0x22, 0xbd, 0x70, 0x9c, 0xfc, 0x36, 0x88, 0xdd, 0x60, ++ 0x3d, 0x97, 0x5e, 0xeb, 0xb7, 0x45, 0x0e, 0x8b, 0x47, 0x3f, 0x70, 0x14, ++ 0xbe, 0xe3, 0x00, 0x39, 0x96, 0xdc, 0xdc, 0x9f, 0x94, 0x54, 0x3b, 0x5b, ++ 0x04, 0x72, 0x57, 0xeb, 0x66, 0xaa, 0x09, 0xd6, 0x95, 0xa2, 0x8b, 0xeb, ++ 0x1a, 0x18, 0xd7, 0x2f, 0xcf, 0xdb, 0x3d, 0x7f, 0xc4, 0xf7, 0x58, 0x46, ++ 0x80, 0xec, 0x4d, 0xa1, 0xc3, 0xfb, 0x31, 0xce, 0xaf, 0x8f, 0x57, 0x59, ++ 0x7b, 0x7c, 0xaf, 0x7a, 0x59, 0xaf, 0xb7, 0x4c, 0xb9, 0x0f, 0xc8, 0xe8, ++ 0xe7, 0xc4, 0xa7, 0x37, 0xbe, 0xb7, 0x04, 0xf5, 0xfb, 0xef, 0xcd, 0xae, ++ 0xc1, 0x2a, 0xc2, 0xe5, 0x66, 0x0f, 0x00, 0x3c, 0x3b, 0x0d, 0x4c, 0x61, ++ 0xf1, 0xc4, 0x26, 0xc3, 0x94, 0x02, 0x8c, 0x3f, 0xa3, 0x5d, 0x1b, 0x50, ++ 0xee, 0x5d, 0xcc, 0xe9, 0x03, 0x39, 0xc3, 0x30, 0x8d, 0x80, 0x84, 0x5f, ++ 0xe2, 0x98, 0xb0, 0xb8, 0x55, 0xac, 0x07, 0xde, 0x2f, 0x61, 0xd0, 0x8e, ++ 0x45, 0xf8, 0x6e, 0xa0, 0xf5, 0xc9, 0xc8, 0x57, 0xa3, 0x98, 0x47, 0x46, ++ 0xfd, 0x35, 0x86, 0xf9, 0xad, 0xd8, 0x76, 0x35, 0xbf, 0xe6, 0x44, 0xbc, ++ 0x3d, 0x19, 0xc5, 0xee, 0x40, 0xbf, 0xcf, 0xb2, 0x8d, 0xb9, 0xfd, 0x61, ++ 0xfa, 0x63, 0x40, 0x3c, 0xf7, 0xf7, 0x26, 0x25, 0x18, 0x09, 0xee, 0x68, ++ 0x63, 0xfd, 0x6c, 0xe4, 0xd7, 0xe8, 0x2f, 0x98, 0x1d, 0xfd, 0xaa, 0xae, ++ 0xff, 0x34, 0x29, 0x38, 0x3e, 0x08, 0xc8, 0x74, 0xbc, 0xee, 0x3a, 0x6c, ++ 0x60, 0x08, 0xe7, 0x0b, 0x46, 0xbf, 0x3d, 0x0e, 0xfa, 0xc1, 0xe1, 0x8a, ++ 0xfa, 0x2c, 0x0b, 0x8d, 0xd7, 0x25, 0xe8, 0xad, 0x8d, 0xfb, 0xa4, 0x49, ++ 0x1d, 0xee, 0x40, 0x7d, 0x93, 0xc0, 0xfb, 0x2f, 0x14, 0x72, 0xfb, 0x1c, ++ 0xfc, 0xdc, 0xe4, 0x7f, 0x36, 0x13, 0xf1, 0x63, 0x59, 0xe3, 0x0f, 0x93, ++ 0x2f, 0x67, 0x3c, 0xf7, 0x5b, 0xbd, 0x49, 0x45, 0xf1, 0xf1, 0xd0, 0xd6, ++ 0x37, 0x47, 0x33, 0x9c, 0x7f, 0x6c, 0x4b, 0xb4, 0x01, 0xe9, 0xf0, 0xf2, ++ 0xf6, 0xbc, 0x28, 0xe4, 0x87, 0x9d, 0x88, 0x1b, 0x58, 0x7f, 0xbc, 0xd9, ++ 0x7e, 0x0f, 0x8e, 0x17, 0x7f, 0x05, 0xe0, 0xcd, 0xa4, 0xeb, 0x6e, 0xc2, ++ 0xab, 0xa2, 0x8e, 0x8a, 0x03, 0xbc, 0x4e, 0x98, 0x66, 0x53, 0x37, 0x00, ++ 0xde, 0x5f, 0x88, 0xaa, 0x9f, 0x86, 0xfc, 0x1f, 0xdc, 0x61, 0x60, 0xcf, ++ 0xc2, 0x14, 0x3b, 0x4d, 0xae, 0x59, 0xd8, 0xdf, 0x79, 0x59, 0xb5, 0xa3, ++ 0xbe, 0x7d, 0x21, 0xb3, 0x3e, 0x9a, 0xd6, 0xb3, 0xc3, 0x40, 0xeb, 0xd9, ++ 0x19, 0x1d, 0x1c, 0xb1, 0x16, 0xe0, 0xde, 0x30, 0x4c, 0x29, 0x47, 0xf8, ++ 0x14, 0x2b, 0x53, 0x50, 0x0f, 0x2b, 0x86, 0x22, 0xf5, 0x1e, 0xb8, 0x3e, ++ 0x34, 0x9e, 0xdb, 0x57, 0x4d, 0x2f, 0x2f, 0x88, 0xe7, 0xf2, 0xf3, 0xa4, ++ 0x04, 0xf3, 0xe7, 0xe1, 0x73, 0x85, 0x24, 0x3f, 0xa5, 0xb2, 0x8d, 0xe4, ++ 0xae, 0x2b, 0xc8, 0xfc, 0x66, 0x98, 0x27, 0x69, 0x6e, 0xbb, 0x8c, 0xf4, ++ 0x88, 0x9e, 0x05, 0xac, 0x84, 0x7c, 0xaf, 0x04, 0x64, 0x06, 0xfd, 0x49, ++ 0x1e, 0x46, 0x49, 0x8d, 0x49, 0x36, 0xa3, 0x5f, 0x25, 0x7d, 0xeb, 0xb6, ++ 0x2d, 0x06, 0xba, 0x4f, 0x11, 0xfa, 0x76, 0xca, 0x87, 0xab, 0x2b, 0x78, ++ 0xdc, 0xe3, 0x3a, 0x3d, 0x11, 0xc6, 0x3b, 0x68, 0x33, 0x32, 0x5c, 0xd7, ++ 0x64, 0xd6, 0x21, 0xa3, 0x3f, 0x38, 0xf9, 0x2a, 0x73, 0x05, 0x90, 0x7f, ++ 0xae, 0xf2, 0x78, 0xc6, 0x0e, 0x7f, 0xe8, 0x3f, 0x3d, 0xaf, 0xf3, 0x07, ++ 0x4b, 0xc5, 0x78, 0xee, 0xa0, 0xbd, 0x04, 0x2f, 0x17, 0xb2, 0x48, 0x3f, ++ 0xae, 0x74, 0x73, 0xd9, 0xe7, 0x12, 0xcd, 0xa3, 0x2a, 0x68, 0xa7, 0x8b, ++ 0x2d, 0xba, 0xfb, 0xe8, 0xe7, 0xc5, 0x62, 0x1b, 0x19, 0x37, 0x95, 0xc5, ++ 0x0b, 0xff, 0xa6, 0x3f, 0xeb, 0xff, 0x1d, 0xe9, 0x37, 0xe0, 0x5e, 0x98, ++ 0xef, 0x3e, 0x3b, 0x9f, 0xaf, 0x54, 0xce, 0xf9, 0x15, 0xae, 0xaf, 0xab, ++ 0xdc, 0xe4, 0x42, 0x3c, 0xec, 0xb2, 0xb9, 0xdf, 0x9d, 0x88, 0x7a, 0xb1, ++ 0xdd, 0xc8, 0xb6, 0xb2, 0xbe, 0xe5, 0xe9, 0x79, 0x88, 0x3f, 0xfd, 0xe0, ++ 0x73, 0x0c, 0xbb, 0x6a, 0x65, 0xfe, 0x7c, 0xe2, 0x47, 0x1b, 0xae, 0x67, ++ 0xc4, 0xe6, 0x8d, 0xbe, 0x28, 0x58, 0xf7, 0x88, 0x41, 0x7c, 0x7c, 0xe4, ++ 0x3b, 0xd4, 0x23, 0x43, 0xff, 0x33, 0x31, 0x01, 0xf5, 0xf8, 0x55, 0xa1, ++ 0x5f, 0xb4, 0x56, 0xe3, 0x33, 0xe4, 0x27, 0x7b, 0x1c, 0xe7, 0x27, 0xfb, ++ 0x0d, 0x21, 0x39, 0xbc, 0x33, 0x3e, 0x93, 0x9e, 0xd3, 0xe4, 0x0a, 0xf9, ++ 0x0c, 0xc7, 0xd9, 0x6f, 0xf4, 0x2f, 0xf4, 0xf4, 0x62, 0x27, 0x81, 0x3f, ++ 0xef, 0x44, 0xfe, 0xdc, 0x65, 0x63, 0x14, 0x47, 0x3d, 0x96, 0x6a, 0x59, ++ 0x80, 0x72, 0xa5, 0xcd, 0xf3, 0xbc, 0xe0, 0x63, 0x7d, 0xbb, 0xbe, 0x66, ++ 0x6d, 0xab, 0x11, 0xd7, 0xfd, 0x15, 0xd8, 0x03, 0x80, 0xbb, 0x24, 0xed, ++ 0xaa, 0x29, 0xdc, 0x9e, 0xef, 0x49, 0xe2, 0x7c, 0x55, 0x2a, 0x7f, 0x4b, ++ 0xfe, 0x76, 0x67, 0x93, 0xc4, 0xd0, 0xcf, 0x4f, 0x6e, 0xe2, 0xfa, 0x3b, ++ 0x9c, 0x3f, 0x52, 0x7b, 0xe7, 0x8f, 0x5f, 0x22, 0x5e, 0xaf, 0xc5, 0x1f, ++ 0x5a, 0xbc, 0xb0, 0xfb, 0x87, 0xf2, 0xc7, 0x91, 0xbf, 0x8f, 0x3f, 0x36, ++ 0x5c, 0x93, 0x3f, 0xbe, 0x8d, 0x45, 0x3c, 0xdc, 0xd7, 0x5c, 0x9c, 0xc2, ++ 0xbe, 0xc7, 0xbf, 0x69, 0x14, 0xfc, 0xd0, 0xd7, 0xfd, 0xf1, 0x56, 0xae, ++ 0xe7, 0xf4, 0xd7, 0x5f, 0x11, 0x78, 0xdd, 0x67, 0xda, 0x38, 0x3d, 0x17, ++ 0xf5, 0xc0, 0xcd, 0x06, 0x17, 0xca, 0x39, 0x50, 0x3f, 0x7d, 0x36, 0xac, ++ 0x63, 0x5f, 0x34, 0x7f, 0x8f, 0x29, 0x6b, 0xb2, 0xb0, 0xbf, 0x4b, 0xe1, ++ 0x7a, 0x65, 0x57, 0x93, 0x99, 0xf4, 0xca, 0x2e, 0x9b, 0xd7, 0x4b, 0x76, ++ 0xdc, 0x69, 0x61, 0xe8, 0x3f, 0x30, 0xc5, 0xdb, 0xf1, 0x33, 0xd4, 0x87, ++ 0x69, 0x16, 0x75, 0x43, 0x18, 0xff, 0x2e, 0x8d, 0xe7, 0xfc, 0x56, 0x6f, ++ 0x0c, 0x8c, 0xff, 0x0c, 0xfd, 0xe2, 0xa3, 0x9c, 0xce, 0xe3, 0x6e, 0xce, ++ 0x93, 0x4d, 0xf0, 0x5c, 0xea, 0x52, 0x2e, 0xe7, 0x05, 0x17, 0x4c, 0x5b, ++ 0x30, 0x0e, 0x2b, 0x4d, 0x28, 0xdc, 0x81, 0x7c, 0x74, 0x02, 0x75, 0x16, ++ 0xb4, 0xd5, 0xe7, 0xe0, 0x29, 0x40, 0x7c, 0xd5, 0x39, 0x13, 0xe9, 0xbb, ++ 0xd7, 0x5a, 0x4e, 0x96, 0x61, 0x7e, 0x11, 0xfc, 0x1e, 0x37, 0xf2, 0xd9, ++ 0xd8, 0xfd, 0x27, 0xcb, 0x8a, 0x72, 0xf0, 0x79, 0xae, 0x4f, 0xf7, 0x8a, ++ 0x56, 0xeb, 0x8f, 0xc7, 0x35, 0xc5, 0xb3, 0xee, 0x78, 0xd7, 0x23, 0xec, ++ 0xc6, 0x78, 0xc6, 0xf5, 0x92, 0x07, 0xf9, 0x24, 0x37, 0xd4, 0x67, 0x6e, ++ 0x23, 0xc5, 0x6b, 0x1a, 0x3f, 0xd4, 0x47, 0x03, 0x3f, 0x80, 0x5c, 0xcc, ++ 0x67, 0xaa, 0x31, 0x16, 0x86, 0x9c, 0x73, 0xce, 0xf3, 0x30, 0x98, 0x43, ++ 0x36, 0xa7, 0x3c, 0x92, 0xce, 0xf3, 0x03, 0xd3, 0x28, 0x3e, 0x9c, 0x7b, ++ 0xba, 0xfd, 0x55, 0xd0, 0xcc, 0x6c, 0x9e, 0x47, 0x77, 0x5f, 0xf0, 0xc1, ++ 0x7c, 0x1d, 0x1f, 0x80, 0x9d, 0x3d, 0x1e, 0x8f, 0xfe, 0xd2, 0xf1, 0x80, ++ 0xc9, 0x80, 0xf3, 0x99, 0xd6, 0x64, 0x73, 0x7f, 0x68, 0x4d, 0x16, 0xf2, ++ 0x93, 0x26, 0x4f, 0xf4, 0x03, 0x3c, 0xd5, 0xff, 0x61, 0xd8, 0xb3, 0x1b, ++ 0xc2, 0xec, 0x7b, 0x6c, 0x02, 0x97, 0xa3, 0xc7, 0x5d, 0x0a, 0xdd, 0xf7, ++ 0x75, 0x98, 0xfc, 0x83, 0xe1, 0xd2, 0xbf, 0x33, 0xfe, 0x5e, 0xbd, 0xb0, ++ 0x3f, 0x9f, 0xa3, 0x3c, 0x63, 0xfc, 0x70, 0xdf, 0x2b, 0x0b, 0xd1, 0x8e, ++ 0xe6, 0x2f, 0x77, 0x1f, 0x44, 0xfc, 0x4f, 0x4f, 0x92, 0xe9, 0xfa, 0x2f, ++ 0x58, 0xc0, 0x92, 0x85, 0xf4, 0x71, 0x29, 0xe4, 0x97, 0xd5, 0x1b, 0xd5, ++ 0xe2, 0xcf, 0xa4, 0xd0, 0x73, 0x4c, 0xf1, 0x0c, 0xb3, 0xc1, 0xfd, 0xfd, ++ 0x49, 0xd1, 0xf9, 0x38, 0x7f, 0x69, 0x82, 0xf7, 0x22, 0xd2, 0x89, 0x29, ++ 0xc1, 0x23, 0xf8, 0xde, 0xd8, 0x09, 0x79, 0xf9, 0x28, 0x5f, 0xb6, 0x51, ++ 0x75, 0x09, 0x68, 0x8f, 0x34, 0xb8, 0x01, 0xae, 0xf2, 0xad, 0xb6, 0x10, ++ 0x1c, 0x1a, 0x5c, 0x67, 0x05, 0x5f, 0x94, 0x26, 0x2c, 0xbe, 0x88, 0xeb, ++ 0xc7, 0xf7, 0x50, 0xbf, 0x34, 0x7e, 0x7c, 0xde, 0x82, 0xef, 0x6b, 0x74, ++ 0xaf, 0x6f, 0xfe, 0x82, 0xd3, 0x3b, 0x8c, 0xfe, 0x48, 0xef, 0x10, 0xfd, ++ 0xa5, 0x3b, 0xb0, 0xaf, 0xe1, 0xe1, 0x2b, 0xa1, 0x57, 0xb4, 0xfe, 0x3f, ++ 0x4a, 0x7f, 0x2d, 0x7f, 0x70, 0x4d, 0xfa, 0x63, 0x7e, 0x20, 0xf6, 0xef, ++ 0xa2, 0xbf, 0x35, 0x21, 0x29, 0x44, 0x7f, 0xf0, 0xb3, 0xe2, 0xb1, 0xaf, ++ 0xf7, 0xb3, 0xea, 0x4d, 0xe0, 0x77, 0xe7, 0xf4, 0xbc, 0x5e, 0xe8, 0x28, ++ 0xa4, 0xe7, 0x5d, 0x26, 0x58, 0x21, 0xfa, 0x55, 0x2d, 0x10, 0x77, 0xa2, ++ 0x3c, 0x7a, 0x1d, 0xb4, 0x2f, 0xb0, 0xc7, 0xce, 0xe7, 0xea, 0xfa, 0xc3, ++ 0xf9, 0xfe, 0xe0, 0x22, 0xb2, 0xc1, 0x09, 0xf1, 0x84, 0xf7, 0x6a, 0x53, ++ 0x70, 0x08, 0xfa, 0x21, 0xa3, 0x02, 0x12, 0xf9, 0x85, 0xa3, 0x40, 0xf0, ++ 0x17, 0x91, 0xff, 0x95, 0x41, 0x7a, 0xcf, 0x25, 0xf0, 0xc4, 0xce, 0x4b, ++ 0xd2, 0xf9, 0x61, 0xdc, 0x45, 0xff, 0x2e, 0x1d, 0xfd, 0xc3, 0x40, 0x02, ++ 0xfa, 0x51, 0xa3, 0xcc, 0x15, 0x01, 0xe4, 0xf7, 0xdd, 0xd6, 0x29, 0xe9, ++ 0xe8, 0xd7, 0xe5, 0x59, 0x27, 0x65, 0x21, 0x5f, 0xbd, 0x3a, 0xec, 0xbe, ++ 0xe3, 0x68, 0x82, 0x5e, 0x4d, 0x5b, 0xbe, 0xe7, 0x39, 0x35, 0xe4, 0xff, ++ 0x68, 0xfa, 0xed, 0xa0, 0x18, 0x56, 0x9b, 0xbf, 0x20, 0x81, 0xeb, 0xa1, ++ 0x1b, 0x41, 0xdd, 0xa2, 0x1f, 0x88, 0x2e, 0x63, 0x38, 0x1c, 0x9a, 0x3e, ++ 0x47, 0xf2, 0x20, 0x1c, 0x52, 0x60, 0xbe, 0xe1, 0x3b, 0x2b, 0xe9, 0xe5, ++ 0xa6, 0x0e, 0xa0, 0xc7, 0x8d, 0x08, 0x07, 0xe0, 0xa1, 0x55, 0x62, 0x0d, ++ 0xa8, 0xcf, 0x0b, 0x0d, 0xee, 0xc4, 0x62, 0xf4, 0xd3, 0x92, 0x02, 0x0a, ++ 0xf7, 0xf7, 0xbe, 0xe9, 0x8f, 0xf9, 0xc1, 0x8a, 0xa6, 0x37, 0xde, 0x43, ++ 0x78, 0x2b, 0x70, 0x3f, 0x04, 0xe3, 0x50, 0x97, 0xf1, 0x62, 0x77, 0x3e, ++ 0x62, 0x60, 0x4f, 0x3f, 0x58, 0xf3, 0x57, 0xb4, 0xb8, 0x40, 0xf3, 0x67, ++ 0xb4, 0xf8, 0x13, 0xfd, 0x1e, 0xbc, 0x3f, 0x40, 0x5c, 0xb7, 0x9b, 0x01, ++ 0x40, 0xb4, 0x47, 0x01, 0x8b, 0xbf, 0x06, 0xe6, 0x7f, 0xf2, 0xb2, 0x3a, ++ 0xdc, 0x2d, 0xe4, 0x56, 0x81, 0x75, 0x54, 0x88, 0x75, 0xcc, 0x64, 0xed, ++ 0x04, 0x17, 0xfb, 0xf6, 0xbb, 0xef, 0x26, 0x01, 0x7d, 0x66, 0x08, 0x7c, ++ 0x54, 0x1c, 0x81, 0xb8, 0x31, 0x17, 0xef, 0x33, 0x76, 0x33, 0xe0, 0xe1, ++ 0x66, 0x85, 0xc7, 0x93, 0x37, 0xbb, 0x20, 0x7e, 0x0c, 0xe3, 0xa3, 0x99, ++ 0xe3, 0x22, 0xfb, 0xf8, 0x9b, 0x92, 0x1c, 0x1a, 0xe7, 0x5a, 0xcf, 0xeb, ++ 0xed, 0xc0, 0x44, 0xdd, 0xfe, 0xcc, 0x3f, 0xda, 0x1e, 0x01, 0x7b, 0xf4, ++ 0x09, 0xb8, 0xce, 0xc7, 0xd6, 0xf1, 0xb8, 0x74, 0xc2, 0x40, 0xd9, 0xa7, ++ 0xa0, 0xe1, 0x1c, 0x97, 0x69, 0x40, 0x7e, 0xac, 0x16, 0xf6, 0x0d, 0xc2, ++ 0xe8, 0x5e, 0xed, 0xd2, 0x4b, 0xc2, 0x2f, 0x9e, 0x60, 0xe8, 0xc8, 0x75, ++ 0x01, 0x7e, 0x5b, 0xf7, 0xff, 0x8d, 0xec, 0xe0, 0x81, 0xfd, 0x7f, 0x7b, ++ 0x07, 0xfd, 0xbc, 0xf1, 0x9f, 0x2b, 0xcc, 0x0c, 0xef, 0x4f, 0xf8, 0xbc, ++ 0x20, 0x0e, 0xf5, 0x04, 0x1b, 0xa7, 0x12, 0x5f, 0x69, 0xe3, 0x56, 0xff, ++ 0xa9, 0xc1, 0xca, 0xf8, 0x75, 0xe2, 0xff, 0x2a, 0xb1, 0xf6, 0xc3, 0x00, ++ 0x8f, 0x7b, 0x28, 0xc2, 0x67, 0xa1, 0xf6, 0x77, 0x17, 0x9f, 0xdc, 0x84, ++ 0xe3, 0x7d, 0x79, 0x4e, 0xe1, 0xbc, 0x2d, 0xe6, 0x2f, 0x33, 0x79, 0x07, ++ 0x61, 0x1e, 0xbb, 0xcc, 0xc4, 0xf3, 0x01, 0x87, 0x25, 0xee, 0xff, 0x68, ++ 0xf7, 0x0f, 0x1b, 0x01, 0x6e, 0xb8, 0xbe, 0x29, 0x41, 0xcb, 0x0b, 0xb4, ++ 0x93, 0xdd, 0xc7, 0x9f, 0x39, 0x8c, 0xce, 0x37, 0x63, 0x3e, 0x20, 0x2f, ++ 0x44, 0xd7, 0x9b, 0x2f, 0x94, 0x7f, 0xae, 0xe4, 0xf6, 0xa4, 0x0f, 0xfe, ++ 0xfe, 0x37, 0xf2, 0x01, 0x5a, 0x1e, 0x60, 0xab, 0xc0, 0x1f, 0x3b, 0x78, ++ 0xd6, 0xa4, 0x02, 0x5c, 0x53, 0x1b, 0xee, 0x51, 0xd0, 0xbf, 0x9e, 0xea, ++ 0x94, 0x99, 0x3b, 0x6c, 0xde, 0x9b, 0x54, 0x2b, 0x73, 0x87, 0xe5, 0x03, ++ 0x9e, 0x49, 0xd0, 0xf9, 0x23, 0x07, 0x5f, 0xdc, 0x34, 0x03, 0xec, 0x49, ++ 0x75, 0x9b, 0xec, 0x8a, 0x42, 0x79, 0x6d, 0xda, 0x75, 0x3c, 0x17, 0xfb, ++ 0xed, 0xb2, 0xcb, 0xda, 0x0b, 0x1f, 0xe9, 0xf1, 0x3b, 0xb5, 0xe9, 0x1e, ++ 0x05, 0xf9, 0xdf, 0x98, 0xa8, 0x92, 0x7c, 0x5f, 0x6b, 0xfe, 0x09, 0x23, ++ 0x80, 0x4f, 0x6e, 0x40, 0xba, 0x33, 0xf2, 0xeb, 0x3a, 0xc7, 0x48, 0x24, ++ 0x47, 0x7a, 0xfa, 0x1e, 0xd8, 0xff, 0xeb, 0x84, 0x8e, 0x9c, 0xbe, 0xf1, ++ 0xdd, 0x17, 0xfd, 0xf5, 0x74, 0xf8, 0xdd, 0xc5, 0x22, 0xda, 0xef, 0xb9, ++ 0x16, 0x3d, 0xf4, 0x7c, 0xdb, 0x02, 0xeb, 0xf4, 0xc1, 0xfa, 0x02, 0xb0, ++ 0x4e, 0x1f, 0xf8, 0x5d, 0x07, 0xd6, 0xd9, 0xa9, 0x7f, 0x68, 0x9d, 0x93, ++ 0xfa, 0x1a, 0xbf, 0x56, 0x37, 0xff, 0x36, 0x01, 0xfd, 0x36, 0x8d, 0x4f, ++ 0x4b, 0x13, 0x38, 0xdf, 0x8c, 0xdf, 0xb7, 0x29, 0x81, 0xd9, 0x42, 0xf4, ++ 0xd2, 0xf0, 0xf5, 0xa1, 0xb0, 0x57, 0x7b, 0xa3, 0x34, 0x7f, 0xc3, 0x35, ++ 0x6f, 0x06, 0x5c, 0x3a, 0x05, 0x76, 0x87, 0x18, 0xd4, 0xc7, 0xda, 0x9d, ++ 0x63, 0x42, 0xf6, 0x6b, 0xfe, 0xe9, 0x32, 0xf2, 0x37, 0x34, 0xfb, 0x35, ++ 0x5f, 0x5e, 0x54, 0x4a, 0x6a, 0x53, 0xd8, 0x2f, 0x4c, 0x23, 0xa3, 0x5e, ++ 0xd3, 0xdb, 0xa9, 0xb9, 0xea, 0x62, 0x23, 0xeb, 0xcd, 0x3e, 0x2d, 0x88, ++ 0xec, 0x97, 0xb7, 0x6d, 0x54, 0x62, 0xa8, 0x67, 0x20, 0x3a, 0x49, 0x92, ++ 0xc0, 0x87, 0xf0, 0xb3, 0x35, 0x38, 0xce, 0x30, 0x0f, 0xc1, 0xa9, 0xa7, ++ 0xa7, 0x06, 0x97, 0x1e, 0x1e, 0x6d, 0x7d, 0x9a, 0x7f, 0x3d, 0x5f, 0xd0, ++ 0x6f, 0xce, 0xa0, 0x4c, 0x23, 0xc2, 0xdf, 0xc3, 0xae, 0x8a, 0x75, 0xe2, ++ 0x40, 0x98, 0x87, 0xb8, 0x5e, 0xbb, 0xfa, 0xb5, 0x8e, 0x9f, 0xaf, 0x5c, ++ 0x28, 0x79, 0x2b, 0xb7, 0x17, 0xbe, 0xed, 0x8b, 0x7f, 0xf5, 0xf7, 0x35, ++ 0x7d, 0x50, 0x86, 0x13, 0xe4, 0x51, 0xeb, 0x43, 0xbf, 0xc2, 0x98, 0x98, ++ 0x4c, 0x74, 0x2b, 0xbb, 0x6a, 0x62, 0x6e, 0xb0, 0x1b, 0x2c, 0x23, 0x8a, ++ 0x7d, 0x1a, 0x66, 0x57, 0x58, 0xc5, 0x50, 0xe2, 0x9f, 0x7b, 0x85, 0x1d, ++ 0xee, 0x8b, 0x7f, 0xaa, 0xae, 0xca, 0xcc, 0x9b, 0x1f, 0xe2, 0x23, 0x63, ++ 0xe3, 0x13, 0x56, 0xe4, 0xa3, 0x7d, 0xca, 0x46, 0x2b, 0xe6, 0x27, 0x27, ++ 0xdb, 0x66, 0xd5, 0xc6, 0x01, 0x9e, 0x4a, 0xfe, 0x54, 0x34, 0x17, 0xfd, ++ 0xbc, 0xea, 0x0e, 0x03, 0xc3, 0x14, 0x56, 0x69, 0xd3, 0x17, 0x07, 0x31, ++ 0xae, 0xaf, 0x7e, 0x8f, 0xb9, 0x50, 0x2f, 0x16, 0x35, 0xb5, 0x16, 0x23, ++ 0xdf, 0x1d, 0x52, 0xda, 0x65, 0x8a, 0xb3, 0xbf, 0x64, 0xec, 0x89, 0x30, ++ 0x7f, 0xb1, 0xb1, 0xa9, 0xd6, 0x8a, 0xfe, 0x54, 0x63, 0xa2, 0x4c, 0x71, ++ 0xfc, 0x61, 0x07, 0xe7, 0x4b, 0xed, 0xfe, 0x96, 0x44, 0xae, 0x3f, 0x1a, ++ 0xcf, 0x5d, 0x9e, 0xe1, 0xee, 0xe5, 0xfe, 0x19, 0x71, 0xbf, 0xe4, 0xe3, ++ 0x3c, 0xe2, 0xa3, 0xb2, 0x47, 0x41, 0xae, 0x31, 0x0e, 0x4d, 0x8a, 0xa1, ++ 0xbc, 0x44, 0x89, 0x64, 0x9f, 0x53, 0x81, 0x7e, 0xc8, 0x4d, 0x46, 0xf2, ++ 0xf3, 0x21, 0x8e, 0xf9, 0x23, 0xee, 0x03, 0x5e, 0x6a, 0x34, 0xef, 0xc2, ++ 0xd4, 0x7e, 0x69, 0xe3, 0x23, 0xf7, 0xd8, 0x81, 0x10, 0xf5, 0xff, 0xfd, ++ 0x69, 0x8d, 0x19, 0xf3, 0x0b, 0xb3, 0x24, 0xd7, 0xb3, 0xf0, 0x5c, 0x99, ++ 0x1a, 0x6c, 0xc5, 0x7e, 0xd9, 0xdc, 0x4c, 0xaa, 0x7b, 0x18, 0xfb, 0x3f, ++ 0x32, 0xf9, 0xb3, 0xc1, 0x5b, 0x25, 0xca, 0x8b, 0x94, 0x01, 0xbb, 0x60, ++ 0xbf, 0x6c, 0x51, 0xa6, 0x1f, 0xf3, 0x13, 0xfb, 0x25, 0xde, 0xf7, 0x35, ++ 0xf3, 0x7d, 0x02, 0x66, 0xf7, 0x25, 0xcc, 0x80, 0x79, 0xde, 0xae, 0x48, ++ 0x18, 0xb5, 0x81, 0x78, 0x4a, 0xeb, 0x0f, 0xce, 0xdb, 0xc0, 0x04, 0x23, ++ 0x87, 0xc5, 0x57, 0xf7, 0xed, 0x95, 0x49, 0xcf, 0xdc, 0x57, 0x2a, 0xf9, ++ 0x71, 0xbf, 0xa9, 0xd4, 0x9e, 0xce, 0x7c, 0x61, 0x7c, 0x55, 0xf6, 0xa8, ++ 0x89, 0xd6, 0x35, 0xbb, 0x29, 0xa5, 0x08, 0xf9, 0x78, 0x4e, 0xb9, 0xcc, ++ 0xfc, 0x61, 0xfc, 0x1d, 0x10, 0x7e, 0xe1, 0x3c, 0x0f, 0xc4, 0xe1, 0x61, ++ 0xef, 0x1d, 0x8e, 0xe2, 0x70, 0x05, 0x17, 0x03, 0xdc, 0x52, 0x48, 0x6e, ++ 0xa7, 0x09, 0x3e, 0x9f, 0xc5, 0xb8, 0x9f, 0x38, 0x7f, 0x41, 0x42, 0xc4, ++ 0x7b, 0xf0, 0xc6, 0x2d, 0x68, 0x8f, 0x6e, 0x6d, 0x82, 0x38, 0x15, 0x7a, ++ 0xd3, 0x44, 0xfc, 0x7a, 0xab, 0x37, 0x3d, 0x62, 0x5e, 0x0f, 0xe3, 0x7e, ++ 0xcd, 0x09, 0x16, 0x2c, 0x89, 0x83, 0xf1, 0xfb, 0x25, 0x0d, 0x24, 0xfe, ++ 0x9b, 0x11, 0xb4, 0x8f, 0x0e, 0xa8, 0xa8, 0x77, 0xce, 0x24, 0xa2, 0x5e, ++ 0x63, 0xc3, 0xb8, 0x9c, 0x68, 0x72, 0x57, 0x2a, 0xaf, 0xae, 0x23, 0x7e, ++ 0x70, 0xf2, 0x7d, 0xb2, 0x79, 0x12, 0x48, 0x93, 0x8c, 0xfa, 0x2f, 0x52, ++ 0x9e, 0x66, 0x8e, 0x8b, 0xec, 0xcf, 0x72, 0xf7, 0xa8, 0x37, 0x88, 0x90, ++ 0x7f, 0xbd, 0x5e, 0xd7, 0xe4, 0x7e, 0x5e, 0xb3, 0x4c, 0xfb, 0x72, 0xf3, ++ 0x0a, 0x25, 0x17, 0xeb, 0x45, 0x3f, 0xe8, 0xfd, 0xec, 0xb1, 0xd1, 0x7d, ++ 0xe8, 0x85, 0x6f, 0xd5, 0x87, 0xe3, 0x7a, 0xd3, 0x0b, 0x1f, 0x96, 0xff, ++ 0x5d, 0x7a, 0xe1, 0x35, 0x08, 0x2b, 0xc6, 0x81, 0xfc, 0xfe, 0x34, 0x51, ++ 0xe8, 0x87, 0x7e, 0xac, 0x1f, 0xea, 0x87, 0x52, 0x79, 0xfb, 0x26, 0xe4, ++ 0x97, 0x2e, 0xb0, 0x77, 0xe6, 0x5e, 0xf8, 0x45, 0xb3, 0x17, 0x5a, 0x3c, ++ 0x5e, 0x06, 0xf2, 0x4a, 0xf2, 0x7e, 0x91, 0xef, 0x67, 0x94, 0x5e, 0x4d, ++ 0x65, 0xbe, 0xfc, 0x50, 0x3c, 0xde, 0xad, 0x2f, 0xc0, 0x9f, 0x70, 0xf5, ++ 0xe2, 0xe7, 0x3c, 0x9d, 0x98, 0x45, 0x72, 0xd4, 0xad, 0x5f, 0x34, 0xfd, ++ 0x11, 0xe6, 0x4f, 0x18, 0xc7, 0xfc, 0xe3, 0xfe, 0x44, 0x29, 0xf8, 0x91, ++ 0xa6, 0x3c, 0x84, 0x2f, 0x83, 0xe0, 0x2b, 0x63, 0x3c, 0x1f, 0x58, 0x86, ++ 0x85, 0x43, 0x98, 0x97, 0x73, 0x7e, 0x41, 0xf9, 0x96, 0x6a, 0x88, 0xf3, ++ 0x29, 0xde, 0x67, 0xbf, 0x25, 0xb8, 0x50, 0xcf, 0x49, 0xf1, 0x21, 0x39, ++ 0xd0, 0xfb, 0x19, 0x5a, 0x5e, 0xd7, 0x2a, 0xf2, 0x08, 0x7a, 0xbe, 0xe8, ++ 0xce, 0xf3, 0xcd, 0x35, 0x52, 0x1d, 0x8c, 0xc6, 0x17, 0x65, 0x76, 0x2e, ++ 0x1f, 0x65, 0x73, 0x65, 0xca, 0xbb, 0xeb, 0xf9, 0x44, 0x9b, 0x4f, 0xcf, ++ 0x1f, 0x01, 0x5d, 0x5e, 0xe6, 0x9a, 0xfc, 0x21, 0xe4, 0xec, 0x87, 0xf2, ++ 0x47, 0x73, 0xa2, 0xd8, 0x57, 0x1d, 0xc4, 0x06, 0x5d, 0x0f, 0x5f, 0x68, ++ 0xfc, 0xa0, 0xf1, 0x87, 0xde, 0x8e, 0x1c, 0xd3, 0xe5, 0x67, 0xfa, 0xb2, ++ 0x23, 0x6f, 0xa2, 0x1d, 0x19, 0xdd, 0xb7, 0x1d, 0x79, 0x7d, 0x98, 0x91, ++ 0xf4, 0xb5, 0xde, 0x7e, 0x68, 0xf6, 0xe2, 0x77, 0x49, 0x5c, 0x2f, 0x67, ++ 0x24, 0xf2, 0x7d, 0x8e, 0x69, 0xc3, 0xe7, 0xd9, 0xd0, 0xef, 0xb0, 0x26, ++ 0xf1, 0x3a, 0x0d, 0xcd, 0x0e, 0x75, 0xe7, 0x97, 0x36, 0x73, 0x7e, 0x78, ++ 0xbd, 0x63, 0x89, 0x22, 0xa1, 0x3d, 0x41, 0xbd, 0x90, 0x19, 0x86, 0x7f, ++ 0x91, 0x6f, 0xd5, 0xf8, 0xaf, 0xea, 0x51, 0x89, 0xf2, 0x8d, 0x15, 0x42, ++ 0x2f, 0x75, 0x36, 0xf3, 0xfc, 0x5b, 0x75, 0x89, 0xec, 0xb7, 0xc0, 0xff, ++ 0x16, 0x37, 0x3d, 0xb1, 0x89, 0xf7, 0x8d, 0x94, 0x9f, 0x2b, 0x54, 0x5a, ++ 0x15, 0x0b, 0x8c, 0x3b, 0xd3, 0x25, 0xb9, 0x30, 0xaf, 0xe3, 0x16, 0xf9, ++ 0xba, 0x19, 0x6e, 0x89, 0xe7, 0xeb, 0x5c, 0x91, 0xfb, 0xf4, 0x2d, 0x3a, ++ 0xfa, 0xce, 0x11, 0x7c, 0x34, 0x93, 0x05, 0xeb, 0xd0, 0x1f, 0xd7, 0xeb, ++ 0xa5, 0x39, 0x57, 0xb9, 0x5f, 0xa0, 0xd7, 0x4f, 0x73, 0xc4, 0xbe, 0xfb, ++ 0x1c, 0xdd, 0xbe, 0xfb, 0x55, 0x4d, 0xde, 0x07, 0xb0, 0x01, 0xff, 0x4c, ++ 0x7f, 0xc0, 0x9c, 0xf4, 0xfd, 0xfe, 0x80, 0xf6, 0xbe, 0x46, 0x47, 0x8d, ++ 0x7e, 0x2a, 0xee, 0xc5, 0xa1, 0x1c, 0x1d, 0xfc, 0xc6, 0xa4, 0xc6, 0x70, ++ 0xff, 0x19, 0xe9, 0x37, 0xf5, 0xaa, 0x42, 0xe3, 0xd8, 0x93, 0x04, 0x5f, ++ 0x0a, 0x7f, 0xe6, 0xcb, 0x8b, 0x79, 0xbf, 0xa0, 0x98, 0x4f, 0x3c, 0x5f, ++ 0xdd, 0xf4, 0x85, 0xc9, 0x3b, 0xb2, 0x6f, 0xf8, 0xaf, 0xe5, 0xb7, 0xc6, ++ 0xa2, 0x9f, 0x3e, 0x3a, 0xe4, 0xb7, 0x6b, 0xf3, 0x4e, 0x53, 0x18, 0x4b, ++ 0x47, 0xc7, 0x4c, 0x67, 0x4f, 0x66, 0x89, 0xeb, 0x3f, 0xd4, 0x7e, 0x0c, ++ 0xd7, 0xad, 0x43, 0xa3, 0x83, 0xa6, 0x47, 0x7b, 0xe0, 0x59, 0xe8, 0xd9, ++ 0xbe, 0xe8, 0x74, 0x2d, 0x3d, 0xab, 0xe9, 0xb3, 0x7f, 0xb6, 0x9e, 0xd5, ++ 0xc6, 0xd7, 0xec, 0x80, 0x36, 0xaf, 0x5e, 0xff, 0xf6, 0x15, 0xb7, 0x69, ++ 0xfa, 0x74, 0xfd, 0x16, 0x03, 0xe5, 0x4b, 0x26, 0x8b, 0xf8, 0x78, 0xb2, ++ 0xc8, 0xc3, 0xce, 0x4f, 0xe2, 0xf1, 0xc1, 0xad, 0x49, 0x3c, 0xee, 0xec, ++ 0xfa, 0xca, 0x62, 0x40, 0x7b, 0xb9, 0xb3, 0x85, 0xfb, 0x27, 0x2e, 0xb3, ++ 0xfd, 0x38, 0xfa, 0x05, 0xa1, 0x7c, 0x1f, 0xa7, 0xe7, 0xc3, 0x31, 0xcc, ++ 0x87, 0xfb, 0xec, 0x4c, 0x69, 0xb7, 0xd0, 0xbe, 0x67, 0x11, 0x90, 0x12, ++ 0xf7, 0x3d, 0xd3, 0xf8, 0xbe, 0xe7, 0x76, 0x25, 0xe0, 0x21, 0x3d, 0xed, ++ 0x52, 0x58, 0x0d, 0xc8, 0xc9, 0x39, 0x7c, 0x0f, 0xe6, 0x79, 0xf8, 0x80, ++ 0x6f, 0x21, 0xea, 0xe9, 0x87, 0x3f, 0x19, 0x62, 0xa0, 0xfd, 0x77, 0x25, ++ 0xd0, 0x8e, 0xfe, 0xc9, 0xd8, 0x3c, 0x85, 0xf6, 0x8f, 0x1c, 0x66, 0x95, ++ 0xf2, 0xc1, 0x9d, 0xcd, 0x66, 0x3b, 0xbe, 0xd7, 0xb5, 0xef, 0xff, 0xb4, ++ 0x1a, 0x71, 0x9c, 0xaf, 0x98, 0x0b, 0x43, 0xb8, 0x43, 0xcd, 0xe6, 0xee, ++ 0xfd, 0x1b, 0xd4, 0x07, 0xa5, 0x72, 0x9b, 0x8c, 0xf9, 0xfb, 0xae, 0x20, ++ 0xc8, 0x08, 0x3c, 0x3f, 0x69, 0x41, 0xa0, 0x18, 0xe3, 0xa0, 0xc9, 0xac, ++ 0xbd, 0x16, 0xe5, 0x7b, 0x02, 0xd2, 0xb1, 0x17, 0xfa, 0xfd, 0x2a, 0x49, ++ 0x8b, 0xb3, 0x7b, 0xcf, 0xef, 0x17, 0x37, 0x73, 0x3f, 0xae, 0x38, 0x46, ++ 0x26, 0x3f, 0x6e, 0x8a, 0xaf, 0xbd, 0x18, 0xf7, 0xad, 0xa6, 0x28, 0x92, ++ 0xab, 0x16, 0x9f, 0xd5, 0xe5, 0xf7, 0x5f, 0xd1, 0xc5, 0x1f, 0xa1, 0xfc, ++ 0xbe, 0xaa, 0xf0, 0xfa, 0x43, 0x5d, 0xfe, 0xbe, 0x91, 0xeb, 0x99, 0xeb, ++ 0xcd, 0xeb, 0x4f, 0x40, 0xdd, 0x06, 0x7c, 0xbc, 0x5e, 0xe3, 0x73, 0xa1, ++ 0x6f, 0x58, 0x1f, 0xf9, 0xfd, 0x9d, 0x26, 0xbe, 0xef, 0x13, 0x3c, 0x69, ++ 0x64, 0xe8, 0x07, 0xb3, 0x0b, 0x89, 0xbd, 0xe6, 0x63, 0xae, 0x95, 0xe7, ++ 0xdf, 0xd7, 0x12, 0xed, 0x56, 0x63, 0x71, 0x9f, 0x8e, 0xfb, 0xeb, 0xfb, ++ 0x5a, 0xd2, 0xdc, 0x6a, 0x6e, 0xdf, 0xcf, 0xe7, 0x76, 0x04, 0x8b, 0xd0, ++ 0x3c, 0xee, 0xdc, 0x3e, 0x5b, 0xa1, 0xfa, 0x35, 0x91, 0x1f, 0xed, 0xb1, ++ 0x7f, 0xd2, 0xc7, 0xfe, 0x88, 0xbb, 0xd1, 0x7e, 0x08, 0xd5, 0x69, 0x5f, ++ 0xfb, 0x21, 0xc5, 0x5f, 0xaa, 0x94, 0xf6, 0xb9, 0x5e, 0xbc, 0x69, 0x75, ++ 0x0b, 0x4c, 0xd4, 0x3f, 0xdd, 0xc8, 0xb4, 0x9f, 0x9b, 0xe4, 0x74, 0xe7, ++ 0xf9, 0x68, 0x37, 0xf2, 0xf9, 0xce, 0xf3, 0x69, 0x6e, 0x84, 0xeb, 0x79, ++ 0xc1, 0xa7, 0x1a, 0xdf, 0xef, 0x3b, 0x77, 0x39, 0x9a, 0xf6, 0x41, 0x4d, ++ 0x6e, 0x15, 0xf7, 0x8f, 0x83, 0x0e, 0x8b, 0xeb, 0x59, 0xe2, 0x5b, 0xce, ++ 0xef, 0xf5, 0xa9, 0x43, 0xfc, 0xb8, 0x4f, 0xfb, 0x1b, 0x21, 0x17, 0x3b, ++ 0xa3, 0x83, 0xc7, 0xb2, 0x13, 0xc3, 0xf7, 0x3d, 0xf8, 0x3e, 0x47, 0xcb, ++ 0xba, 0x47, 0x67, 0x9f, 0x33, 0xd2, 0x7e, 0xb9, 0x84, 0xf9, 0x48, 0x6d, ++ 0x7f, 0xd9, 0x07, 0x72, 0x43, 0x75, 0x3d, 0xf1, 0x8c, 0xe2, 0x0f, 0x23, ++ 0xab, 0x67, 0x38, 0x6f, 0xad, 0x9b, 0xfd, 0x1a, 0xdb, 0x29, 0x93, 0xd4, ++ 0x38, 0xc4, 0xfb, 0xe5, 0x44, 0x6d, 0x1f, 0x53, 0x8d, 0xa3, 0x3c, 0xc4, ++ 0xb7, 0x57, 0xa8, 0xce, 0x50, 0x8f, 0xff, 0xdd, 0xeb, 0x98, 0x07, 0xeb, ++ 0x51, 0x1a, 0xd6, 0x59, 0x3c, 0x0a, 0xc8, 0xff, 0xab, 0xeb, 0xec, 0xd4, ++ 0x6f, 0x5c, 0xe7, 0xa4, 0x76, 0xff, 0x3a, 0x95, 0xda, 0x87, 0x8e, 0xc7, ++ 0x3e, 0x80, 0x76, 0xbf, 0xda, 0x6d, 0xf2, 0x28, 0x61, 0xfa, 0xe3, 0x9d, ++ 0x64, 0xee, 0x77, 0xe5, 0x65, 0x7f, 0x52, 0x4c, 0xc5, 0xdf, 0x7f, 0x63, ++ 0x54, 0x87, 0x3e, 0xe5, 0xc1, 0x0e, 0x19, 0xf5, 0xc5, 0x8d, 0x57, 0x61, ++ 0x1d, 0x11, 0x75, 0x27, 0xca, 0x65, 0xc4, 0x37, 0xe5, 0x37, 0xb3, 0x42, ++ 0xfd, 0x4c, 0x69, 0x71, 0x0c, 0xf6, 0x6f, 0xbc, 0x0a, 0xfd, 0xb0, 0xe7, ++ 0xaf, 0x24, 0x39, 0xb8, 0x3d, 0xaa, 0x53, 0xea, 0x46, 0x27, 0x93, 0xb4, ++ 0x10, 0x5f, 0xfc, 0x2d, 0xc9, 0xdd, 0x91, 0x04, 0xd7, 0xef, 0x71, 0x78, ++ 0x3e, 0xc1, 0x76, 0xb7, 0x34, 0xff, 0xe0, 0x25, 0x46, 0xfd, 0x73, 0xbc, ++ 0x7f, 0xab, 0x7c, 0x09, 0x9e, 0xcb, 0x0f, 0x14, 0x52, 0x5e, 0x39, 0x1f, ++ 0xf3, 0xca, 0x79, 0x34, 0xec, 0x42, 0xc4, 0xdf, 0xe8, 0x56, 0x13, 0xed, ++ 0x97, 0x6b, 0xf9, 0xdd, 0x3c, 0x4d, 0xfe, 0xbe, 0x8e, 0xcc, 0x33, 0xe7, ++ 0x8b, 0xbc, 0xee, 0xab, 0xac, 0x83, 0xf2, 0xcd, 0x05, 0x16, 0x08, 0xb4, ++ 0x0c, 0x08, 0x17, 0xa7, 0x9f, 0x5b, 0x9a, 0xe7, 0x94, 0x30, 0x1f, 0x98, ++ 0x64, 0x72, 0x61, 0xbd, 0xc3, 0xe8, 0x2c, 0x4f, 0x3e, 0xe6, 0x63, 0x5b, ++ 0x93, 0x18, 0xc5, 0x47, 0xad, 0xad, 0xc9, 0x19, 0x6a, 0x0e, 0x72, 0x0f, ++ 0xcf, 0xfb, 0xba, 0xb5, 0xbc, 0x2f, 0xfb, 0xfe, 0xbc, 0xef, 0x91, 0x8f, ++ 0x62, 0x7d, 0xa4, 0xb7, 0xae, 0x9a, 0x68, 0x7f, 0xfa, 0xc8, 0xa9, 0x58, ++ 0x57, 0x80, 0xf6, 0x0b, 0x2d, 0xe4, 0xff, 0x69, 0xf5, 0xc8, 0x2d, 0xd1, ++ 0xbc, 0xce, 0x80, 0x65, 0x2c, 0xa0, 0x3c, 0xd3, 0x8d, 0xa2, 0x9e, 0xd1, ++ 0x62, 0xf6, 0x9a, 0x93, 0x49, 0x5f, 0x05, 0x0e, 0x9e, 0x80, 0xf7, 0x7e, ++ 0x7f, 0x99, 0xf1, 0x7d, 0xc7, 0xf6, 0x0f, 0x69, 0x5f, 0xbb, 0xd8, 0x30, ++ 0x3c, 0x05, 0xeb, 0x7e, 0x0f, 0x4a, 0x43, 0xe3, 0xb0, 0x7d, 0xea, 0xa3, ++ 0xd8, 0x1c, 0x6a, 0x4f, 0xc5, 0x5e, 0x44, 0xfc, 0xb4, 0x18, 0xac, 0x2a, ++ 0xce, 0x7b, 0x66, 0x9d, 0x5a, 0x82, 0x75, 0x6d, 0x27, 0xd6, 0xb1, 0x12, ++ 0xac, 0x63, 0x7b, 0x6b, 0x9d, 0x85, 0xda, 0x93, 0xeb, 0xec, 0xd4, 0x9e, ++ 0x5a, 0xe7, 0xa4, 0xf6, 0x75, 0xb8, 0x8e, 0xfc, 0x73, 0x1c, 0x9e, 0x47, ++ 0x7e, 0x71, 0xbf, 0x65, 0xa3, 0x7d, 0x92, 0x29, 0x6f, 0xd9, 0x14, 0x6c, ++ 0xf3, 0x16, 0xc6, 0x50, 0xbb, 0xfb, 0xb6, 0x18, 0x13, 0xc2, 0xdb, 0x12, ++ 0xcb, 0xb6, 0x6b, 0xf3, 0x60, 0xbd, 0x5a, 0x20, 0x3a, 0xd0, 0x80, 0xc9, ++ 0xfe, 0xd6, 0xa7, 0xbc, 0x8f, 0x59, 0xfa, 0x81, 0xdd, 0x33, 0x7b, 0x47, ++ 0x4a, 0xa3, 0x18, 0x6b, 0x7b, 0xca, 0x3b, 0x5d, 0x99, 0x0c, 0xe3, 0x4e, ++ 0xed, 0xff, 0x93, 0xaf, 0xe0, 0xfe, 0x9b, 0xc9, 0xcb, 0x1e, 0xb3, 0x00, ++ 0x5c, 0x73, 0x4f, 0xd9, 0x1a, 0xda, 0xa0, 0xff, 0x76, 0xf2, 0xf2, 0xc7, ++ 0x6c, 0xa8, 0x6f, 0x8f, 0x47, 0x83, 0xd2, 0xc3, 0xf5, 0xae, 0x38, 0xee, ++ 0x1e, 0x04, 0x74, 0x43, 0xa5, 0x90, 0xc6, 0x05, 0x97, 0x8d, 0x83, 0x7e, ++ 0x82, 0xd6, 0x5f, 0x31, 0xbd, 0x64, 0x12, 0x63, 0xb7, 0x14, 0x77, 0x64, ++ 0x33, 0x60, 0xad, 0xec, 0xe4, 0x95, 0xd3, 0x2d, 0x80, 0xc7, 0x5b, 0xac, ++ 0xde, 0x1f, 0x63, 0xdf, 0xe4, 0x4b, 0x9a, 0x5e, 0xd2, 0x0f, 0xfb, 0xcc, ++ 0x87, 0xf5, 0x60, 0x41, 0xc9, 0x48, 0x71, 0x3f, 0xcb, 0x90, 0x12, 0xb1, ++ 0xfe, 0x65, 0xa6, 0xc3, 0xfb, 0x46, 0x72, 0x58, 0xfd, 0x9e, 0x5b, 0xfa, ++ 0x13, 0xed, 0x33, 0x8d, 0x71, 0x4b, 0xcc, 0x41, 0x87, 0x1f, 0x8c, 0xb4, ++ 0xef, 0xc5, 0xec, 0x1f, 0x27, 0x84, 0xcb, 0xdb, 0x4c, 0x47, 0xe9, 0x1b, ++ 0x48, 0x8f, 0x89, 0xc9, 0xbc, 0x0e, 0x78, 0xf4, 0x24, 0xc9, 0x1d, 0x5e, ++ 0x5f, 0xa1, 0x7f, 0x6e, 0xf4, 0x39, 0xb5, 0x04, 0xe9, 0x34, 0xe6, 0x42, ++ 0x59, 0x1d, 0xb6, 0x33, 0xcb, 0x1d, 0xd4, 0xf7, 0x2c, 0x18, 0x5b, 0x87, ++ 0xf2, 0x5c, 0x62, 0xeb, 0xeb, 0xfd, 0x62, 0x7a, 0xbf, 0x3c, 0x99, 0xd7, ++ 0x8d, 0x14, 0x29, 0x52, 0x44, 0x5d, 0x89, 0xfe, 0xb9, 0x7c, 0x60, 0x26, ++ 0xf4, 0x8f, 0x83, 0x47, 0xa3, 0x29, 0x4f, 0x30, 0xfa, 0xb4, 0xb7, 0x16, ++ 0xeb, 0x4f, 0x4b, 0x9d, 0x99, 0x79, 0xb2, 0xa6, 0xfa, 0xa8, 0xef, 0xd8, ++ 0x82, 0xfb, 0x6d, 0xa3, 0x2b, 0xce, 0x94, 0x24, 0xa0, 0xfc, 0xd8, 0x24, ++ 0x17, 0x9a, 0x89, 0x31, 0xac, 0xa3, 0x2e, 0x01, 0xee, 0x17, 0xda, 0xb1, ++ 0xa0, 0x0a, 0xd7, 0xf5, 0x44, 0x31, 0xd6, 0xff, 0x8c, 0x56, 0x25, 0x17, ++ 0xa2, 0xad, 0xd0, 0xdd, 0xda, 0x80, 0xef, 0x17, 0xba, 0x62, 0x5c, 0x85, ++ 0xe8, 0x8f, 0x9f, 0x56, 0x4b, 0xd0, 0xf4, 0x9c, 0x52, 0x46, 0x9d, 0x28, ++ 0x80, 0xe7, 0xa6, 0x0e, 0x92, 0x5d, 0x16, 0x18, 0xe8, 0x54, 0xe0, 0xa6, ++ 0x89, 0x97, 0xa0, 0x5f, 0x38, 0x2c, 0x8e, 0xf2, 0xbc, 0x85, 0xca, 0x9a, ++ 0x2b, 0x27, 0xa8, 0x1f, 0xe3, 0xaa, 0x51, 0x71, 0x1d, 0x5b, 0x7e, 0x5d, ++ 0x45, 0xe3, 0x98, 0xc9, 0xae, 0xef, 0x9e, 0x51, 0xfc, 0x2f, 0xc8, 0x3f, ++ 0x45, 0x9e, 0x38, 0xca, 0x09, 0x02, 0x3e, 0x4a, 0xc2, 0xeb, 0xca, 0x60, ++ 0xdd, 0x04, 0x77, 0xa1, 0x5d, 0xf6, 0x47, 0x49, 0xc8, 0xdf, 0xff, 0x5a, ++ 0x62, 0x87, 0xfe, 0xee, 0xfe, 0x12, 0x96, 0xcb, 0xc3, 0x7c, 0xc3, 0xff, ++ 0x42, 0xf7, 0x8f, 0x44, 0xab, 0x51, 0x00, 0xe8, 0x6e, 0x93, 0xbd, 0x04, ++ 0xc7, 0xdb, 0x6d, 0x92, 0xec, 0x0f, 0x51, 0xdf, 0x53, 0x8c, 0xcf, 0xfb, ++ 0x86, 0x18, 0x55, 0xcc, 0x1f, 0x95, 0x25, 0x46, 0x45, 0x8c, 0x3f, 0xb5, ++ 0x44, 0x1a, 0x7f, 0x0e, 0xe1, 0xcf, 0x89, 0x1b, 0x85, 0xd7, 0xca, 0x33, ++ 0x1c, 0x11, 0xf7, 0xdb, 0x6e, 0xb3, 0x92, 0x9d, 0xa8, 0x78, 0x2b, 0x87, ++ 0xfc, 0xa2, 0xb6, 0xdb, 0xd2, 0xc9, 0x5e, 0x54, 0xbc, 0x35, 0xa9, 0x08, ++ 0xdb, 0x36, 0x03, 0xf7, 0xd3, 0x2b, 0xde, 0xaa, 0x28, 0xa7, 0xfb, 0x06, ++ 0x1e, 0x07, 0x57, 0x2c, 0xfc, 0x91, 0x5b, 0xf4, 0x29, 0xee, 0xad, 0x58, ++ 0x58, 0x49, 0xfd, 0x56, 0x29, 0xe5, 0x27, 0x38, 0xdf, 0x95, 0x9c, 0xb8, ++ 0x3c, 0xcc, 0xaf, 0x4d, 0x1b, 0x94, 0x5a, 0xa2, 0x44, 0xf8, 0x81, 0x03, ++ 0x49, 0xfe, 0xf3, 0x44, 0x7e, 0xaf, 0xd0, 0x30, 0x7c, 0xd3, 0x24, 0x80, ++ 0xff, 0xde, 0xa3, 0x7c, 0x9f, 0xa2, 0x22, 0x27, 0x33, 0xe2, 0xf9, 0x19, ++ 0x05, 0x52, 0x49, 0x78, 0xfd, 0xa8, 0x67, 0x52, 0x54, 0x44, 0x7f, 0x76, ++ 0x89, 0xa3, 0x24, 0xbc, 0x0e, 0x75, 0x6e, 0x45, 0x6a, 0x44, 0xff, 0x96, ++ 0xb9, 0x99, 0x11, 0xfd, 0x92, 0xa3, 0x05, 0x64, 0xbf, 0x41, 0x0f, 0x54, ++ 0x94, 0x80, 0x1e, 0x38, 0x0a, 0xed, 0x52, 0x60, 0xc1, 0x02, 0x51, 0x07, ++ 0xa5, 0xe5, 0x9f, 0x0a, 0x05, 0x4b, 0x15, 0xb6, 0x8b, 0xbc, 0xac, 0xc2, ++ 0xe3, 0xeb, 0x61, 0xf0, 0x87, 0x7a, 0xb0, 0xc4, 0x16, 0x69, 0xa7, 0x77, ++ 0x47, 0x73, 0x3b, 0x5f, 0xce, 0xd6, 0xd0, 0x06, 0x49, 0xf9, 0x11, 0xbe, ++ 0xbf, 0x5d, 0x96, 0x68, 0xfc, 0x24, 0xdc, 0x4e, 0x94, 0xcb, 0x15, 0x36, ++ 0x5e, 0x97, 0x15, 0x89, 0x87, 0xbc, 0xa3, 0x46, 0xb2, 0x97, 0x79, 0x31, ++ 0x92, 0x1f, 0xe3, 0xfa, 0x92, 0xa3, 0x4b, 0xeb, 0xd0, 0xf4, 0x96, 0x67, ++ 0x44, 0xbe, 0xaf, 0xf9, 0x61, 0xe5, 0x02, 0x3e, 0x6d, 0x5e, 0xe6, 0x73, ++ 0xb7, 0xa3, 0x3f, 0xa2, 0xc1, 0xad, 0xcd, 0xaf, 0xc1, 0x5f, 0x2e, 0x2f, ++ 0x2a, 0xa1, 0x7c, 0xf7, 0x35, 0xd6, 0xa1, 0x87, 0x97, 0xc1, 0x7a, 0x50, ++ 0x3f, 0xe8, 0xe1, 0x68, 0x4a, 0x16, 0xfe, 0x1a, 0xf8, 0x1f, 0xe4, 0xaf, ++ 0x89, 0x73, 0x24, 0xf0, 0x4b, 0xec, 0xcd, 0x7e, 0x6b, 0xfe, 0x7a, 0x05, ++ 0xe8, 0x2b, 0x47, 0xb8, 0xbe, 0xb2, 0x49, 0x89, 0x58, 0xb7, 0xd7, 0x97, ++ 0xbe, 0xd2, 0xc6, 0xed, 0xcb, 0x2f, 0xd3, 0xc6, 0x9d, 0xe9, 0xf0, 0xd0, ++ 0xfb, 0xee, 0x1d, 0x9f, 0x9e, 0x9a, 0x20, 0x87, 0xf5, 0x33, 0x3f, 0x4e, ++ 0x88, 0x0f, 0xef, 0xbf, 0xf8, 0xe9, 0xa6, 0x88, 0xfb, 0x49, 0x1f, 0xcf, ++ 0x71, 0x84, 0xf7, 0xb7, 0x7e, 0x3a, 0x07, 0xef, 0x4f, 0x51, 0xd4, 0x5a, ++ 0x1b, 0xf0, 0xe5, 0x31, 0x26, 0xb9, 0x7c, 0xc8, 0x07, 0x6d, 0xaa, 0x12, ++ 0x03, 0xf4, 0x28, 0x3e, 0xed, 0xae, 0xc3, 0xb6, 0xf4, 0x43, 0x2f, 0x96, ++ 0xab, 0xb2, 0xa9, 0xe7, 0x7c, 0x75, 0xd8, 0x4e, 0xbc, 0xe8, 0x6f, 0x33, ++ 0xc3, 0xba, 0x6e, 0x1a, 0x26, 0xab, 0x18, 0xbf, 0x6b, 0x7e, 0x88, 0x1e, ++ 0xde, 0xbf, 0x26, 0xf3, 0xbc, 0xc3, 0xb1, 0xab, 0xaa, 0x15, 0xf7, 0x59, ++ 0x77, 0xfb, 0x54, 0x2b, 0xfa, 0xf3, 0xbb, 0x1f, 0x54, 0xad, 0xe8, 0x87, ++ 0xec, 0x76, 0xf3, 0x73, 0x19, 0xee, 0x2c, 0x03, 0x9d, 0x8f, 0x71, 0x67, ++ 0xf3, 0x7a, 0xc5, 0xbf, 0x24, 0xf3, 0xba, 0x83, 0x4e, 0xf1, 0xbe, 0xd6, ++ 0xfa, 0x8d, 0xde, 0x4e, 0x84, 0x1b, 0xeb, 0xcc, 0xd1, 0x37, 0xa8, 0xfa, ++ 0x26, 0x48, 0x75, 0xe5, 0xc7, 0xd0, 0xbf, 0xca, 0xe9, 0xe9, 0x5f, 0x1d, ++ 0x53, 0xfc, 0x36, 0x9c, 0xef, 0xd8, 0x83, 0x7e, 0x5b, 0xf8, 0x7e, 0xe2, ++ 0xf5, 0xfa, 0x57, 0x7f, 0x04, 0x1e, 0x43, 0x38, 0x0a, 0x99, 0xe4, 0x09, ++ 0xd7, 0x23, 0xc5, 0x96, 0x28, 0x4f, 0xb8, 0xdc, 0x96, 0xda, 0x1d, 0x11, ++ 0xfd, 0x93, 0xc2, 0x0f, 0x99, 0xea, 0x4c, 0x8d, 0x78, 0xef, 0x26, 0x35, ++ 0x33, 0xe2, 0x39, 0xf0, 0x1b, 0x87, 0xa1, 0x5f, 0x52, 0x6b, 0x62, 0x54, ++ 0x6f, 0xeb, 0x33, 0xf0, 0x7a, 0x5b, 0x3d, 0x1e, 0x57, 0xa4, 0xf0, 0xf8, ++ 0xce, 0x65, 0xb3, 0xa3, 0x3b, 0x83, 0xfb, 0x66, 0x72, 0x6f, 0xe7, 0x91, ++ 0x5c, 0xc5, 0x86, 0x5e, 0xcf, 0xb7, 0xa5, 0xa4, 0x70, 0x7f, 0xf0, 0x3f, ++ 0x52, 0x18, 0xc1, 0x35, 0x2b, 0x85, 0xc3, 0xa7, 0xaf, 0xaf, 0xd5, 0xf7, ++ 0x6b, 0xf1, 0x7c, 0x0f, 0xe2, 0x93, 0xb9, 0x9c, 0xc8, 0xe7, 0x2e, 0xab, ++ 0xe1, 0x0a, 0xb8, 0xbc, 0xac, 0xe0, 0xe9, 0x27, 0xa6, 0x53, 0x5d, 0x6d, ++ 0xbe, 0xe1, 0xde, 0x2c, 0xe8, 0x57, 0x3c, 0xbd, 0x75, 0x3a, 0xaf, 0xab, ++ 0x35, 0xec, 0xc1, 0x3a, 0xdb, 0x19, 0x4f, 0x3f, 0xcf, 0xef, 0xdf, 0x60, ++ 0xc8, 0x37, 0x82, 0x3f, 0xb0, 0xcd, 0xf7, 0xc2, 0x74, 0xac, 0x2b, 0xaf, ++ 0x8a, 0xe2, 0xf5, 0x09, 0x55, 0x51, 0xa2, 0x3e, 0xb4, 0x6e, 0x74, 0x44, ++ 0xdc, 0xa3, 0x18, 0x3e, 0x7e, 0x6a, 0x21, 0xc6, 0x9f, 0xfb, 0x8d, 0x0c, ++ 0xf3, 0xfc, 0x8f, 0x99, 0xc0, 0x0e, 0xe6, 0x85, 0xf6, 0xd9, 0xad, 0x66, ++ 0x1e, 0xaf, 0x5a, 0x4d, 0xbc, 0x0e, 0x7c, 0x7d, 0xe6, 0xa9, 0xf5, 0xa8, ++ 0x3f, 0x3e, 0x8b, 0xf2, 0xe6, 0xa5, 0x50, 0x9e, 0xb1, 0x48, 0x45, 0x3c, ++ 0x5e, 0xb4, 0x5b, 0xa8, 0x3e, 0xf4, 0xbe, 0x7d, 0xa5, 0x29, 0xc8, 0x07, ++ 0xb3, 0x52, 0x78, 0xde, 0x2b, 0x7b, 0xcf, 0x44, 0x27, 0x9d, 0x2f, 0xfb, ++ 0xe7, 0xc1, 0x51, 0xfc, 0x7d, 0x70, 0x60, 0xfd, 0x30, 0x8e, 0x73, 0x71, ++ 0x77, 0x36, 0xf9, 0xe5, 0xd9, 0x03, 0x18, 0x9d, 0x27, 0xd1, 0xe8, 0x01, ++ 0xe1, 0x33, 0x5d, 0x8f, 0x82, 0xf0, 0x81, 0xce, 0x63, 0x30, 0xb7, 0x13, ++ 0xf3, 0x6f, 0xb5, 0x0e, 0x13, 0x8d, 0x33, 0x2b, 0x85, 0xf3, 0xe3, 0xf5, ++ 0xb6, 0x3d, 0xea, 0x89, 0xe3, 0x0c, 0x6b, 0x76, 0x41, 0xbb, 0x20, 0x85, ++ 0xc7, 0xcd, 0xb7, 0xe2, 0xbc, 0x04, 0x6f, 0xb0, 0xff, 0x2c, 0xdc, 0xd0, ++ 0xb3, 0x07, 0xfb, 0xcf, 0x1e, 0xc9, 0xfb, 0x48, 0x6f, 0x59, 0xce, 0x0b, ++ 0xa2, 0x7f, 0x1b, 0xfc, 0x51, 0x0c, 0xed, 0xc3, 0xbc, 0x1f, 0xcd, 0xf1, ++ 0xc6, 0x32, 0x82, 0xb4, 0x6f, 0xf3, 0xee, 0xa2, 0x6c, 0xd7, 0x06, 0xba, ++ 0xce, 0xf1, 0xb8, 0xc0, 0x3f, 0xb0, 0xb6, 0x43, 0xc5, 0xfa, 0x0f, 0x7f, ++ 0x3f, 0xac, 0xb7, 0x18, 0xe8, 0xf4, 0x2e, 0x45, 0x7c, 0xdc, 0x66, 0xf6, ++ 0x0f, 0x26, 0xbe, 0xb2, 0xad, 0x89, 0xc1, 0x79, 0xae, 0xb7, 0xde, 0xb8, ++ 0xef, 0xf9, 0x21, 0xe0, 0x04, 0x7b, 0x32, 0x7f, 0x3c, 0xa7, 0x97, 0x36, ++ 0x3f, 0xe0, 0xd8, 0x82, 0x74, 0x7c, 0x57, 0x9c, 0x3b, 0xd1, 0xe0, 0x01, ++ 0x38, 0x7e, 0x8c, 0x70, 0x68, 0x70, 0x75, 0xc3, 0xa3, 0xab, 0x3f, 0xef, ++ 0x14, 0x7e, 0x7b, 0x27, 0x8e, 0x97, 0x1b, 0xca, 0x53, 0x57, 0xff, 0xc9, ++ 0x40, 0x79, 0x8a, 0x6a, 0x09, 0xf4, 0x24, 0xf4, 0xf7, 0x7c, 0xc8, 0x5c, ++ 0x3e, 0x95, 0xe8, 0x43, 0x79, 0x50, 0xdc, 0xd2, 0xc2, 0xf9, 0xc6, 0x9f, ++ 0x58, 0x52, 0x6c, 0x83, 0xb6, 0xa0, 0x71, 0x15, 0x8f, 0x8f, 0xdb, 0x95, ++ 0x88, 0xbc, 0x98, 0x66, 0xcf, 0x26, 0x8a, 0xe7, 0xc7, 0xbe, 0xa7, 0x44, ++ 0xd8, 0xa3, 0x89, 0x22, 0xfe, 0x1d, 0xaf, 0xcb, 0x4f, 0x4e, 0x6c, 0x9c, ++ 0x4e, 0xe7, 0xf8, 0x26, 0xea, 0xe2, 0xe2, 0x5f, 0xa4, 0x88, 0xbc, 0x65, ++ 0x1a, 0x4b, 0x0b, 0xcf, 0x23, 0xac, 0x15, 0xf1, 0xc6, 0xe5, 0xb6, 0x81, ++ 0x71, 0xe8, 0x9f, 0x2a, 0x10, 0xe7, 0xca, 0x80, 0x6f, 0x93, 0x2a, 0xb3, ++ 0x71, 0xf1, 0x21, 0xbd, 0xd0, 0xb0, 0x8e, 0x45, 0x9c, 0x53, 0xd4, 0xf8, ++ 0x70, 0xe4, 0x69, 0xfb, 0x9d, 0x38, 0xdf, 0xc8, 0xd3, 0xec, 0x0e, 0xf2, ++ 0x07, 0xb4, 0x71, 0xbb, 0xf3, 0x13, 0x1c, 0x2f, 0x97, 0xdf, 0xe3, 0x78, ++ 0x19, 0xd5, 0x31, 0xec, 0xe9, 0x49, 0xd0, 0x37, 0x1e, 0x31, 0x32, 0xbf, ++ 0x1a, 0x5a, 0xe7, 0x04, 0x0e, 0x2a, 0x83, 0x30, 0x87, 0xe2, 0xa4, 0xcb, ++ 0x17, 0x6c, 0x64, 0x5f, 0xc6, 0x1c, 0x9d, 0x43, 0xf5, 0xde, 0x66, 0xa7, ++ 0x81, 0xa9, 0x61, 0xeb, 0x8f, 0x52, 0xa3, 0x99, 0x1a, 0xa6, 0x2f, 0xad, ++ 0xc3, 0xe2, 0x23, 0xfa, 0xb2, 0xa0, 0x4f, 0x5d, 0x54, 0xa4, 0x1f, 0x90, ++ 0x2f, 0xe6, 0x89, 0x71, 0xa5, 0x45, 0x8c, 0xb7, 0x3f, 0xbe, 0xec, 0x08, ++ 0xfa, 0x05, 0xf9, 0xb6, 0xe5, 0xe4, 0x17, 0xc4, 0x8d, 0x1b, 0x18, 0x31, ++ 0x1e, 0x6b, 0x53, 0x22, 0xfc, 0x83, 0x3c, 0xe6, 0x71, 0x63, 0xdc, 0xe8, ++ 0x02, 0xfa, 0xe2, 0x7e, 0xd9, 0x98, 0xd3, 0x4a, 0x84, 0x1f, 0x30, 0x2e, ++ 0xb0, 0x91, 0xce, 0xa1, 0x8e, 0xfb, 0x30, 0xf2, 0xfa, 0x84, 0x73, 0x91, ++ 0xfd, 0x03, 0x7d, 0xd1, 0xa5, 0x2f, 0xfc, 0xb1, 0xdc, 0xa7, 0xd1, 0x2f, ++ 0xfc, 0xa1, 0xf8, 0x73, 0xb8, 0x23, 0xf1, 0x97, 0x50, 0x1e, 0x89, 0xbf, ++ 0x24, 0x4f, 0x24, 0xfe, 0x52, 0x16, 0x44, 0xe2, 0x27, 0xd5, 0x1b, 0x89, ++ 0x8f, 0xf4, 0xe5, 0x23, 0x22, 0xee, 0xf7, 0x5b, 0x93, 0x17, 0xd1, 0x1f, ++ 0xf0, 0xc0, 0x84, 0x88, 0xe7, 0x33, 0xc1, 0x80, 0x85, 0xf7, 0xb3, 0x1e, ++ 0x9d, 0x16, 0xf1, 0xfc, 0xe0, 0x8d, 0xb3, 0x23, 0xfa, 0x43, 0x37, 0xdf, ++ 0x16, 0xf1, 0xfc, 0x70, 0xff, 0x92, 0x88, 0xfb, 0xd9, 0xdb, 0x56, 0xfe, ++ 0x20, 0x7a, 0x8f, 0xac, 0x5f, 0x1b, 0xf1, 0xbc, 0x9e, 0xde, 0x37, 0x34, ++ 0xfe, 0x34, 0x62, 0x7c, 0x8d, 0xde, 0x3e, 0xf8, 0xfb, 0xdf, 0xa4, 0x37, ++ 0x73, 0x0a, 0xff, 0x50, 0xd0, 0x3b, 0x51, 0xd8, 0x59, 0x87, 0x9b, 0xd7, ++ 0xad, 0x75, 0x19, 0x6d, 0x8f, 0xe2, 0x79, 0x7c, 0x3c, 0x36, 0x82, 0xfa, ++ 0xce, 0x81, 0xe7, 0xe9, 0x63, 0xd1, 0xfe, 0xab, 0x54, 0x97, 0xe7, 0x9b, ++ 0xc6, 0x68, 0x5f, 0xfb, 0x97, 0xb2, 0x47, 0x42, 0xbd, 0x94, 0x0e, 0xa8, ++ 0x35, 0x64, 0x51, 0xbd, 0x3c, 0xd5, 0xf5, 0xfd, 0xdc, 0x60, 0x88, 0xd8, ++ 0x67, 0xb7, 0x3b, 0xb9, 0x3f, 0x64, 0x77, 0x72, 0x3d, 0xfe, 0x6b, 0x13, ++ 0x3f, 0x2f, 0x95, 0x0e, 0xfe, 0x26, 0xd9, 0x29, 0x03, 0x0b, 0xc5, 0xd9, ++ 0x16, 0xac, 0x77, 0x64, 0x82, 0x99, 0xac, 0x8f, 0x63, 0x9c, 0x0d, 0xe3, ++ 0x51, 0xbf, 0xbf, 0xd3, 0x5a, 0xe1, 0xcb, 0x08, 0xe9, 0x55, 0x4d, 0x8f, ++ 0xde, 0x66, 0x56, 0x6b, 0x3b, 0x40, 0xbf, 0x8c, 0x92, 0xb9, 0x9e, 0x04, ++ 0xfd, 0xd9, 0xcf, 0x09, 0xf3, 0xbc, 0x2f, 0x3d, 0x68, 0xe4, 0xfe, 0x87, ++ 0xcf, 0x88, 0xfe, 0x47, 0xba, 0x85, 0xf9, 0x62, 0xf3, 0xc8, 0xce, 0x50, ++ 0x1e, 0xda, 0xc1, 0x12, 0x25, 0x3c, 0x07, 0x10, 0x17, 0xd2, 0xe3, 0xea, ++ 0x77, 0x40, 0xac, 0x83, 0x2b, 0xb3, 0xe9, 0x1c, 0xd6, 0x9b, 0x08, 0x02, ++ 0xfa, 0xcd, 0xaa, 0x8b, 0xf6, 0x9b, 0x6e, 0xd5, 0xf4, 0xd4, 0xf2, 0xe1, ++ 0xa4, 0xa7, 0x2e, 0xdb, 0x22, 0xfd, 0xb7, 0xcb, 0x4b, 0xb3, 0xe8, 0xfa, ++ 0xd9, 0xdb, 0xcd, 0x54, 0x3f, 0x70, 0x56, 0xd4, 0x39, 0x6a, 0x78, 0xd0, ++ 0x9f, 0xb7, 0xd6, 0xce, 0x61, 0x6b, 0xf7, 0x97, 0x6f, 0xd9, 0x14, 0x83, ++ 0x7e, 0xe7, 0x59, 0x71, 0xfe, 0x57, 0xbb, 0x3e, 0x59, 0xe0, 0x6f, 0xb2, ++ 0x53, 0x16, 0xf6, 0xcf, 0xb2, 0x06, 0xf3, 0x61, 0x8b, 0xc0, 0x88, 0xc7, ++ 0x01, 0xde, 0x2b, 0x8f, 0x74, 0xc4, 0xde, 0xc6, 0xc8, 0xdf, 0x9c, 0x84, ++ 0xeb, 0xae, 0xda, 0x72, 0xe5, 0xf6, 0x57, 0xa1, 0x5f, 0x6d, 0x08, 0x26, ++ 0x73, 0xbb, 0xe1, 0xa3, 0xf7, 0xe6, 0xbf, 0xcb, 0xcf, 0x75, 0xcf, 0xff, ++ 0x5b, 0xe4, 0x77, 0x05, 0x2a, 0x9c, 0x3c, 0xce, 0xaf, 0x10, 0xe3, 0xdf, ++ 0x02, 0x8d, 0x1d, 0xf0, 0x74, 0x0b, 0xd0, 0xc1, 0x81, 0xed, 0x1b, 0x93, ++ 0xca, 0x90, 0x3f, 0xe1, 0x3a, 0x9d, 0x8f, 0x9b, 0x79, 0x84, 0x19, 0x51, ++ 0x9e, 0x67, 0x79, 0x33, 0xa9, 0x6e, 0xe2, 0x14, 0x73, 0x9d, 0xd9, 0x0b, ++ 0x20, 0xce, 0x77, 0xaa, 0x04, 0xe7, 0x5c, 0xe6, 0x31, 0x62, 0xde, 0xea, ++ 0x9d, 0xdb, 0x2b, 0x63, 0xf0, 0xb9, 0xee, 0xf1, 0xb4, 0x71, 0x80, 0x61, ++ 0xd0, 0x2f, 0x79, 0xd7, 0xe1, 0x33, 0x26, 0x63, 0xde, 0x60, 0x32, 0xaf, ++ 0x9b, 0x80, 0xf9, 0x2c, 0x78, 0xdd, 0xb3, 0x28, 0xfd, 0x61, 0xb4, 0x4b, ++ 0xda, 0x7c, 0xef, 0x30, 0xef, 0xa5, 0x33, 0x40, 0xdf, 0xd9, 0xcc, 0x45, ++ 0xe3, 0x6a, 0xe3, 0x33, 0x4c, 0xcf, 0x87, 0xe9, 0xa9, 0xdd, 0xcb, 0x57, ++ 0x7d, 0x94, 0x00, 0xf3, 0xad, 0x3d, 0x6a, 0xa0, 0x7c, 0xc4, 0xda, 0x66, ++ 0x33, 0xc5, 0x6b, 0x5d, 0x2b, 0xff, 0x6b, 0xc7, 0x53, 0x70, 0xff, 0x8e, ++ 0xf4, 0x8e, 0x7e, 0x68, 0xb7, 0xdf, 0x5f, 0xf9, 0xb7, 0x21, 0xc8, 0x0f, ++ 0xb7, 0x6e, 0x96, 0x99, 0x0a, 0xf4, 0x56, 0xed, 0xde, 0x3b, 0x9d, 0x61, ++ 0xfb, 0x2a, 0x67, 0x97, 0x5e, 0x89, 0xc1, 0xfb, 0x60, 0x77, 0xb7, 0x3e, ++ 0x85, 0xc6, 0xf2, 0x65, 0x33, 0xd5, 0x11, 0xbf, 0xbf, 0xf2, 0xe5, 0x21, ++ 0xe1, 0x7e, 0x6c, 0xa5, 0xb3, 0x70, 0x39, 0xbe, 0xc7, 0xc6, 0x5d, 0xdf, ++ 0x79, 0xc7, 0xe2, 0x97, 0x86, 0xa7, 0x50, 0xbd, 0x97, 0xe0, 0xa7, 0x15, ++ 0x82, 0x9f, 0xd6, 0xbe, 0x38, 0x94, 0xfc, 0xad, 0xb5, 0x31, 0xdd, 0xfc, ++ 0xc4, 0xfb, 0x5b, 0x79, 0xdd, 0x88, 0xb6, 0x8e, 0x33, 0x82, 0x1f, 0x57, ++ 0xbe, 0xf4, 0x4d, 0xc4, 0x77, 0x26, 0x76, 0x03, 0x1f, 0xa9, 0x66, 0xbe, ++ 0x2f, 0xa6, 0x0e, 0x05, 0x7b, 0xdf, 0x76, 0x39, 0x97, 0xbe, 0xfb, 0x60, ++ 0xf4, 0xfe, 0xab, 0x13, 0xe6, 0x6d, 0xb9, 0xfa, 0x49, 0x2c, 0xf6, 0xf7, ++ 0xbc, 0xf9, 0x57, 0x82, 0x9f, 0xcd, 0xbd, 0x3e, 0x78, 0x51, 0x16, 0x7d, ++ 0x63, 0x42, 0xfb, 0xd3, 0xda, 0x79, 0xcf, 0x05, 0x4d, 0x09, 0xf9, 0x48, ++ 0x77, 0x90, 0xb3, 0x0d, 0x38, 0xfe, 0x6d, 0xbf, 0x7b, 0xf1, 0xd2, 0x07, ++ 0x88, 0x9f, 0xe6, 0x97, 0xb7, 0xfe, 0x0c, 0x9f, 0xb9, 0xce, 0xf3, 0x9f, ++ 0xbb, 0xb4, 0xbc, 0xa3, 0xb0, 0x37, 0x2e, 0x81, 0x0f, 0xb0, 0x37, 0x14, ++ 0x5f, 0x74, 0xb1, 0x68, 0x7e, 0x9e, 0x44, 0xf8, 0x37, 0x0a, 0xee, 0xc8, ++ 0x67, 0xd1, 0xf7, 0x3c, 0x54, 0xe2, 0x6b, 0x37, 0x3b, 0x8e, 0xfb, 0x38, ++ 0xb5, 0xad, 0x06, 0xaa, 0x33, 0x89, 0xc5, 0x4d, 0xa0, 0xb0, 0x7c, 0x5d, ++ 0xac, 0x6c, 0xd0, 0x8c, 0x92, 0xdb, 0xe2, 0x04, 0x7d, 0x2d, 0xf4, 0xcc, ++ 0xff, 0x73, 0xde, 0x56, 0x51, 0x47, 0xf5, 0x01, 0x91, 0xfe, 0x50, 0xc1, ++ 0xa1, 0x95, 0x11, 0x7e, 0x90, 0x07, 0xfe, 0x7a, 0xf5, 0x83, 0x9e, 0xf1, ++ 0xd6, 0x62, 0x7e, 0x49, 0xef, 0x0f, 0x8d, 0x0f, 0x18, 0x16, 0x9b, 0xe2, ++ 0xbe, 0xc7, 0x2f, 0x3a, 0x34, 0xad, 0x57, 0xbf, 0x08, 0x02, 0x6a, 0xb7, ++ 0x34, 0x46, 0x6c, 0x0d, 0xc1, 0xaf, 0x41, 0xa7, 0x9f, 0xf7, 0x0b, 0xb9, ++ 0xaa, 0xc7, 0xb1, 0x30, 0xff, 0x1f, 0x88, 0xe6, 0xe7, 0x9f, 0xc1, 0x74, ++ 0xa0, 0xdf, 0xfb, 0xd3, 0x54, 0xae, 0xbf, 0x6d, 0xa0, 0x1b, 0xe9, 0x7c, ++ 0x9a, 0xd4, 0x39, 0xcc, 0xe2, 0x00, 0xba, 0x3b, 0x17, 0x3d, 0xfe, 0x28, ++ 0x5c, 0xb3, 0x0c, 0xe2, 0xeb, 0xc6, 0x7e, 0x2d, 0x9d, 0xa9, 0xc9, 0x27, ++ 0xfe, 0xeb, 0xf6, 0xbb, 0x0e, 0x8d, 0x20, 0xbd, 0xc5, 0xbe, 0x85, 0xd9, ++ 0x10, 0x1f, 0x22, 0xef, 0xa1, 0xa7, 0x5b, 0x01, 0x9e, 0x67, 0xcf, 0x0f, ++ 0x93, 0x3b, 0xf1, 0x7e, 0xe0, 0xf0, 0x5f, 0x63, 0x31, 0xef, 0xbb, 0x23, ++ 0x5e, 0x7d, 0x0b, 0xe9, 0x11, 0x3c, 0x2a, 0xd3, 0xfe, 0x4f, 0x94, 0xd2, ++ 0x61, 0x72, 0xf4, 0x12, 0xdf, 0xbd, 0x8a, 0x7a, 0x10, 0xf8, 0x54, 0x4e, ++ 0xe5, 0xf6, 0xc0, 0xd2, 0xc8, 0xf3, 0x8b, 0x16, 0xd5, 0xcd, 0x30, 0x7e, ++ 0x88, 0xb2, 0xdb, 0x47, 0x85, 0x9f, 0xfb, 0x6b, 0x74, 0xf2, 0x78, 0xb2, ++ 0xf2, 0xf0, 0xfb, 0xfd, 0x4d, 0x40, 0x8f, 0x4b, 0x86, 0xb6, 0xd8, 0x1c, ++ 0x18, 0x7f, 0xf5, 0xde, 0xdd, 0xb1, 0xe8, 0xfe, 0x67, 0x98, 0xbc, 0x1f, ++ 0x20, 0x1f, 0xae, 0x3a, 0xfb, 0xf6, 0x18, 0x3b, 0xe5, 0x6f, 0xb6, 0xf4, ++ 0xc7, 0x78, 0xb0, 0x3e, 0xc0, 0xbf, 0x83, 0x31, 0x52, 0x61, 0x3e, 0x25, ++ 0xaf, 0x27, 0x1c, 0xd5, 0x9b, 0x61, 0x31, 0x09, 0x78, 0x4e, 0x3f, 0x81, ++ 0xda, 0x91, 0x4d, 0xf9, 0xcb, 0x90, 0xcf, 0xaa, 0x03, 0x7c, 0x9d, 0x38, ++ 0x36, 0x16, 0xf2, 0x0d, 0x6f, 0x94, 0xa8, 0xdf, 0xd9, 0x58, 0x1b, 0x8f, ++ 0xe3, 0x55, 0xff, 0xbe, 0x39, 0x0d, 0xe5, 0xe9, 0xe5, 0x24, 0x1e, 0x6f, ++ 0xbe, 0x74, 0x35, 0x9b, 0xbf, 0xaf, 0x30, 0x05, 0x9f, 0x0f, 0x3a, 0x1d, ++ 0x82, 0x98, 0x7e, 0x03, 0xc6, 0x27, 0x2f, 0x8b, 0xb8, 0xa6, 0xf3, 0xaa, ++ 0x4c, 0xcf, 0x69, 0xf3, 0x8f, 0x6c, 0x2c, 0x94, 0xed, 0xc0, 0x0f, 0x39, ++ 0x81, 0x8d, 0x07, 0x28, 0x8e, 0x6a, 0x32, 0xab, 0x48, 0xd7, 0xa8, 0xe7, ++ 0x18, 0xc7, 0x43, 0x53, 0x14, 0xc9, 0x7d, 0x75, 0xcb, 0x54, 0x86, 0x76, ++ 0xbf, 0xcb, 0xc1, 0x5c, 0x12, 0xdc, 0xdf, 0x11, 0x1d, 0xfc, 0x23, 0x9d, ++ 0x77, 0x6b, 0x36, 0xab, 0x98, 0x6f, 0x8d, 0xb2, 0x6f, 0x64, 0xf1, 0x30, ++ 0xfe, 0x0e, 0xb1, 0xcf, 0x3a, 0x1c, 0x38, 0x0a, 0xcf, 0x4b, 0x69, 0xd7, ++ 0xb5, 0xf9, 0xa2, 0x9a, 0x9e, 0xc6, 0x98, 0x03, 0xf9, 0x81, 0xf2, 0xbe, ++ 0x51, 0xca, 0x46, 0x36, 0xd9, 0x16, 0x8e, 0xe7, 0x18, 0xc2, 0xb3, 0x23, ++ 0x95, 0xf3, 0xd1, 0x8e, 0xe8, 0x80, 0x01, 0xf3, 0x2c, 0xc1, 0xc1, 0x8c, ++ 0x3d, 0x4b, 0x70, 0x85, 0xe0, 0x64, 0x34, 0xaf, 0x06, 0xe7, 0x70, 0x3f, ++ 0x9e, 0x27, 0xdc, 0x61, 0x0a, 0x9e, 0xc7, 0x73, 0x33, 0x00, 0x97, 0x1d, ++ 0xe9, 0x3f, 0x9c, 0x71, 0x38, 0x59, 0xd3, 0x50, 0x15, 0xf3, 0x04, 0x51, ++ 0x76, 0x37, 0xad, 0x23, 0xca, 0xae, 0xba, 0x7c, 0x52, 0x4f, 0xb8, 0xaa, ++ 0x73, 0x99, 0x1f, 0xed, 0xfa, 0xcf, 0x1f, 0x62, 0xdd, 0x72, 0x8b, 0x72, ++ 0x5c, 0x1d, 0x1d, 0xea, 0x5b, 0x40, 0x06, 0x76, 0x0c, 0x64, 0x42, 0xce, ++ 0x7f, 0xfe, 0x78, 0x49, 0x46, 0x78, 0x1f, 0x14, 0xcb, 0xb8, 0xd0, 0xfb, ++ 0x43, 0x7e, 0xb5, 0xf1, 0xf1, 0xba, 0x49, 0x14, 0x4f, 0xf8, 0x64, 0x8c, ++ 0x7f, 0xa1, 0x8d, 0x89, 0xc7, 0x75, 0xaa, 0xb4, 0x3e, 0x05, 0x53, 0x4c, ++ 0x79, 0x1c, 0x0f, 0xb8, 0xdf, 0x6e, 0xb5, 0xf0, 0xfb, 0xdd, 0xcf, 0x03, ++ 0x7f, 0xdb, 0xb0, 0x6f, 0xe3, 0xcf, 0xb9, 0xe2, 0xec, 0xd6, 0x69, 0x12, ++ 0xc9, 0x09, 0xaf, 0xc7, 0x15, 0xfa, 0xe0, 0x3e, 0x29, 0x70, 0xfe, 0x46, ++ 0x20, 0xed, 0x57, 0x81, 0x03, 0xb9, 0x2a, 0xc0, 0xb2, 0xfa, 0x8d, 0xfd, ++ 0xc4, 0xa7, 0xab, 0x0c, 0x4d, 0x4f, 0x8d, 0x84, 0xfb, 0x77, 0x47, 0x79, ++ 0x5d, 0xa9, 0x30, 0xdf, 0x6b, 0x1f, 0x1a, 0xe8, 0x5c, 0xeb, 0x9f, 0x5f, ++ 0x8c, 0xf2, 0x57, 0x00, 0x3e, 0x86, 0xed, 0xdb, 0x92, 0xec, 0xee, 0x45, ++ 0x3e, 0xf4, 0xe3, 0x3f, 0xf2, 0xde, 0x43, 0x4f, 0xa6, 0x23, 0xfd, 0xf7, ++ 0x49, 0x2a, 0xe6, 0x61, 0xbb, 0x8c, 0x41, 0xfa, 0xbe, 0x49, 0x55, 0xd3, ++ 0x67, 0x26, 0xaa, 0x6f, 0x68, 0xfc, 0x98, 0xea, 0x9e, 0xde, 0x4c, 0xf5, ++ 0x4e, 0xc2, 0x79, 0xc6, 0x35, 0xd6, 0xd0, 0x7e, 0xf4, 0x78, 0xb6, 0x91, ++ 0xf6, 0xa3, 0xb3, 0xc5, 0x79, 0xf0, 0x7a, 0x27, 0xd7, 0x1f, 0x97, 0x4f, ++ 0x0f, 0x79, 0xb6, 0x26, 0x0c, 0xff, 0x4b, 0x52, 0xb9, 0x7c, 0xb1, 0xa0, ++ 0x77, 0x00, 0xca, 0x4d, 0x93, 0x90, 0xcf, 0x16, 0xf4, 0x53, 0xa0, 0xdd, ++ 0x2b, 0xfc, 0xa5, 0xbd, 0xad, 0xb7, 0x66, 0xa9, 0x61, 0xf9, 0xc3, 0x1a, ++ 0x76, 0x20, 0x1d, 0xf1, 0xfd, 0x10, 0x3b, 0x44, 0xad, 0x76, 0xbd, 0xcb, ++ 0xcf, 0xcf, 0x55, 0x66, 0xbf, 0x63, 0xb9, 0xc3, 0x1d, 0xc6, 0x7f, 0x8b, ++ 0x84, 0xbc, 0x2f, 0x4a, 0x15, 0x79, 0xb2, 0x54, 0xef, 0x6c, 0x84, 0x77, ++ 0x55, 0xeb, 0x27, 0xa6, 0x58, 0x15, 0xcf, 0xc9, 0xd4, 0xf7, 0x47, 0xbb, ++ 0x52, 0x0f, 0xfe, 0x94, 0xbd, 0x17, 0xbc, 0x74, 0xcb, 0xad, 0x4e, 0x8e, ++ 0xaa, 0x95, 0xa0, 0x09, 0x9f, 0xaf, 0xbe, 0xc0, 0xcf, 0xbf, 0x02, 0x9d, ++ 0xeb, 0xf0, 0xbc, 0xc1, 0xcb, 0xef, 0x34, 0x8e, 0x58, 0x0c, 0xd7, 0xf7, ++ 0x02, 0xae, 0xb1, 0xae, 0xd4, 0x77, 0xd6, 0x4c, 0xf5, 0x95, 0x7b, 0x8d, ++ 0x9e, 0x74, 0x7c, 0xbe, 0xe6, 0xcc, 0xd7, 0xb9, 0xa8, 0xb7, 0x4a, 0x10, ++ 0x08, 0x80, 0xe7, 0xeb, 0xe6, 0x55, 0x03, 0x10, 0x6f, 0xc0, 0xf7, 0x45, ++ 0xd1, 0x28, 0x5f, 0xbb, 0x18, 0xe9, 0x31, 0x4d, 0x3e, 0x73, 0x50, 0x3e, ++ 0xe1, 0xfd, 0x1c, 0xe4, 0xfb, 0x02, 0xec, 0x0f, 0x27, 0x3d, 0xbc, 0xc3, ++ 0xd4, 0xce, 0xcf, 0x9f, 0xee, 0xe5, 0xe7, 0x4f, 0x81, 0xef, 0x49, 0x0e, ++ 0x80, 0xef, 0xed, 0xe8, 0x37, 0xe4, 0xd8, 0x41, 0x0e, 0xe8, 0xfd, 0xa1, ++ 0x24, 0xdf, 0x3b, 0xda, 0x0d, 0x74, 0x4e, 0xd6, 0x07, 0x7a, 0x7c, 0x30, ++ 0xf5, 0x8b, 0xe6, 0x60, 0x7f, 0x47, 0x7b, 0x89, 0x9d, 0xe4, 0x1b, 0xf3, ++ 0xfa, 0x79, 0x28, 0xa7, 0x81, 0x03, 0x34, 0x4e, 0x3d, 0xc4, 0x26, 0x48, ++ 0x3a, 0x89, 0x79, 0xc2, 0xfd, 0xc9, 0x46, 0x67, 0x2c, 0xd1, 0x4d, 0xd3, ++ 0x8f, 0x87, 0x9d, 0x4c, 0xd8, 0x09, 0x35, 0x0e, 0xcf, 0x1b, 0x58, 0x65, ++ 0x39, 0x42, 0x2e, 0xc2, 0xec, 0x21, 0xef, 0x0b, 0x7b, 0x79, 0xe2, 0x57, ++ 0x81, 0xc7, 0x7f, 0x89, 0xb6, 0xc3, 0x2d, 0xec, 0x82, 0xf0, 0xa7, 0x98, ++ 0x37, 0x9f, 0xf4, 0xfc, 0xbd, 0xc2, 0x56, 0xad, 0x7d, 0x7d, 0xc2, 0xcc, ++ 0xed, 0xb0, 0xce, 0xb5, 0x27, 0xe4, 0xee, 0xfa, 0x71, 0xf4, 0x5f, 0x03, ++ 0x82, 0x4f, 0x0e, 0x08, 0x7f, 0x16, 0xed, 0x84, 0x9a, 0xc0, 0xeb, 0x71, ++ 0xf0, 0xfa, 0xe8, 0xcd, 0xbc, 0xae, 0x76, 0x8c, 0x7b, 0x4d, 0x31, 0x9e, ++ 0x7d, 0x1e, 0x57, 0xbe, 0xf1, 0x20, 0xb6, 0x13, 0x3c, 0xf5, 0xc5, 0x78, ++ 0xf6, 0x79, 0xd2, 0x82, 0xf6, 0x83, 0xfc, 0x0c, 0x34, 0x3f, 0xcf, 0xde, ++ 0x70, 0xe0, 0xa6, 0x6c, 0xdc, 0xf7, 0xee, 0x3a, 0x6b, 0x66, 0xb8, 0xef, ++ 0xd2, 0xf0, 0xd7, 0xe0, 0x1f, 0x5f, 0x02, 0x3c, 0xdc, 0xdf, 0x02, 0xf8, ++ 0xef, 0xc5, 0x2e, 0xc1, 0x72, 0x88, 0xff, 0xc0, 0x62, 0xa7, 0x33, 0x67, ++ 0xcf, 0xfb, 0x5d, 0x92, 0xa6, 0x3f, 0x4e, 0x55, 0x20, 0x3f, 0x76, 0x36, ++ 0xc8, 0xa1, 0x3e, 0x00, 0x52, 0x05, 0x0c, 0x8e, 0xfd, 0xdf, 0xa6, 0x9e, ++ 0x7c, 0xdc, 0x07, 0xfd, 0xac, 0x34, 0xf7, 0xf3, 0xa9, 0xe8, 0x6f, 0xa7, ++ 0x7b, 0xa9, 0xed, 0x3a, 0xf9, 0xd7, 0x64, 0xb4, 0x05, 0x7b, 0x4f, 0x73, ++ 0x3f, 0xaa, 0xc1, 0xe4, 0xce, 0x46, 0xfe, 0x69, 0x18, 0x18, 0xf9, 0xfd, ++ 0x00, 0xad, 0x7d, 0x32, 0xd5, 0x48, 0x74, 0x28, 0xe8, 0xe3, 0xfb, 0x5d, ++ 0x47, 0x52, 0x79, 0x7e, 0x73, 0x88, 0x8f, 0x3d, 0x86, 0x7c, 0x54, 0xd5, ++ 0x20, 0xdb, 0xfd, 0x40, 0xf7, 0x4b, 0x0d, 0xb2, 0xdb, 0x04, 0xfe, 0xd0, ++ 0x79, 0xb7, 0x37, 0x19, 0xcf, 0xe6, 0x5c, 0x60, 0xbe, 0x5b, 0x26, 0xa2, ++ 0x9d, 0x17, 0x71, 0xa4, 0xf6, 0xbd, 0x97, 0xbb, 0xd0, 0x4f, 0x01, 0x3b, ++ 0x75, 0xf7, 0x2f, 0x7b, 0xdf, 0x7f, 0x58, 0xcd, 0xb4, 0xdf, 0x1a, 0x03, ++ 0xf2, 0xd5, 0xb2, 0x26, 0x89, 0xfd, 0x07, 0xe0, 0x60, 0xf9, 0x33, 0x91, ++ 0xcf, 0xaf, 0xd6, 0xbe, 0x57, 0xd3, 0xb8, 0xe5, 0x30, 0x7e, 0x47, 0x6c, ++ 0xe5, 0x73, 0xba, 0xfb, 0xe8, 0xaf, 0xd0, 0x77, 0x30, 0x22, 0xfd, 0x98, ++ 0x23, 0xa9, 0xc2, 0x3f, 0xc9, 0x62, 0x59, 0xe8, 0x9f, 0x00, 0x1f, 0x91, ++ 0x7e, 0x30, 0x2a, 0xec, 0x88, 0x19, 0xf8, 0x76, 0x45, 0xba, 0x77, 0x1f, ++ 0xda, 0xe3, 0x97, 0xc5, 0xf7, 0x15, 0x40, 0x8f, 0x92, 0x3c, 0xee, 0x73, ++ 0x0a, 0xbb, 0x22, 0xea, 0x0f, 0x82, 0x3b, 0x78, 0x5d, 0xf1, 0xf0, 0x6d, ++ 0x7e, 0xd9, 0x00, 0xef, 0x4f, 0x50, 0xfc, 0x32, 0xda, 0x2b, 0x06, 0x2d, ++ 0xee, 0x3b, 0x8c, 0x73, 0x7b, 0xcb, 0xe8, 0x3b, 0x4c, 0x3e, 0xf7, 0x69, ++ 0xdc, 0xf7, 0x59, 0x2e, 0xf4, 0xe1, 0x72, 0xcd, 0x4f, 0xf3, 0xf3, 0xfd, ++ 0x11, 0x30, 0xbb, 0x11, 0x7e, 0x5a, 0xb5, 0x58, 0xfd, 0x78, 0xe6, 0xaf, ++ 0x8d, 0xc5, 0xf5, 0x6f, 0x93, 0x28, 0x5e, 0x5e, 0xb5, 0x2d, 0x72, 0x3f, ++ 0xa5, 0x5a, 0xac, 0x7f, 0xf5, 0xe6, 0x93, 0x87, 0xd1, 0xe4, 0x55, 0xd6, ++ 0xeb, 0xee, 0x8b, 0xf5, 0x57, 0xeb, 0xd6, 0xaf, 0xed, 0x9b, 0x7f, 0x9e, ++ 0x1a, 0x59, 0xff, 0x75, 0xbd, 0xfb, 0x21, 0x7f, 0x31, 0x72, 0xbf, 0xe1, ++ 0x6d, 0x31, 0x8e, 0x76, 0xdf, 0x94, 0xc6, 0xf5, 0x63, 0x15, 0x2c, 0x03, ++ 0xe9, 0xb6, 0xda, 0x2f, 0xfb, 0xfd, 0xdc, 0xcf, 0xb3, 0xe1, 0xf7, 0x82, ++ 0xee, 0x14, 0xeb, 0xba, 0x53, 0xd0, 0x9f, 0xd6, 0x09, 0xcf, 0x55, 0x6e, ++ 0x93, 0xfc, 0x01, 0xe4, 0xf1, 0xc7, 0x23, 0xeb, 0x4c, 0xef, 0xaa, 0x5f, ++ 0x5c, 0x86, 0x74, 0xd5, 0xf3, 0xc9, 0x4a, 0xb1, 0xee, 0xe5, 0xdb, 0x8d, ++ 0xe4, 0xaf, 0xe2, 0xf7, 0x7f, 0x50, 0xee, 0xf4, 0xfc, 0xb1, 0x52, 0xac, ++ 0x7f, 0xa5, 0x6e, 0xfd, 0x55, 0x5e, 0x49, 0x07, 0x1f, 0xf7, 0xa3, 0x7b, ++ 0xc2, 0x57, 0x7f, 0x0b, 0xd2, 0xb9, 0x72, 0xbb, 0x91, 0xf5, 0x06, 0x9f, ++ 0x46, 0xaf, 0x95, 0x1a, 0x5f, 0xf7, 0x01, 0xaf, 0x06, 0xa7, 0x06, 0xf7, ++ 0x0f, 0x85, 0xb7, 0x7f, 0x9a, 0xc8, 0x6f, 0x8d, 0x60, 0x23, 0x88, 0x4e, ++ 0xe5, 0x09, 0xd7, 0x45, 0x27, 0xbd, 0x9f, 0xbb, 0xeb, 0xf0, 0x08, 0xfa, ++ 0xde, 0xda, 0xe5, 0x23, 0x03, 0x29, 0xde, 0xd7, 0xf8, 0x40, 0xff, 0x7e, ++ 0x99, 0xf0, 0x93, 0xa7, 0x6e, 0xe6, 0x7e, 0xe3, 0xa5, 0xc6, 0x62, 0xeb, ++ 0x48, 0x8c, 0x67, 0xda, 0x0c, 0x2e, 0x49, 0xa5, 0xf8, 0x2c, 0x76, 0x24, ++ 0xe0, 0x25, 0xbf, 0x59, 0x66, 0x15, 0xd0, 0xef, 0x6a, 0xca, 0xda, 0x84, ++ 0xdf, 0x1f, 0xcc, 0x3b, 0x51, 0x30, 0x07, 0xe3, 0xff, 0xfc, 0x13, 0x06, ++ 0x3a, 0x7f, 0xb7, 0xe7, 0x48, 0x01, 0xed, 0x3b, 0xe7, 0x1f, 0x1d, 0x94, ++ 0x90, 0x45, 0x79, 0x6e, 0x17, 0x7d, 0x1f, 0x07, 0xc6, 0x21, 0xfb, 0xda, ++ 0xd5, 0x96, 0xb7, 0x09, 0xcf, 0x27, 0x74, 0xb5, 0x95, 0x14, 0xe0, 0xb8, ++ 0x12, 0x3c, 0x87, 0x7e, 0x40, 0x9e, 0xb0, 0x13, 0x35, 0x6d, 0x79, 0xd6, ++ 0xf0, 0xf3, 0xe7, 0x63, 0xd2, 0x78, 0x7c, 0xbf, 0xde, 0xf9, 0xe9, 0xcf, ++ 0xd1, 0x4f, 0x9f, 0xba, 0xcb, 0x48, 0xe7, 0x2c, 0xa6, 0x1a, 0x83, 0x6f, ++ 0x62, 0xdd, 0xd6, 0x9e, 0x23, 0x0a, 0xed, 0x93, 0xaf, 0x3e, 0xb1, 0xe4, ++ 0xa1, 0x28, 0xa4, 0xef, 0x8b, 0x12, 0xed, 0x93, 0x1f, 0x6e, 0x5f, 0x9b, ++ 0xb8, 0x10, 0xf9, 0xac, 0xc9, 0x68, 0xc7, 0x7d, 0xef, 0xae, 0xa6, 0x1f, ++ 0x1f, 0xc0, 0xfb, 0xbe, 0xed, 0x12, 0x7d, 0xf7, 0xa2, 0xba, 0xb9, 0x34, ++ 0x7b, 0x07, 0xf4, 0xf3, 0xb6, 0xe4, 0xbb, 0xc2, 0xcf, 0x9f, 0xe5, 0x39, ++ 0x54, 0x82, 0x8f, 0xa5, 0x5a, 0x29, 0x7e, 0x9e, 0xda, 0xcf, 0x48, 0x76, ++ 0xf3, 0x62, 0x9a, 0xf5, 0xb7, 0xe8, 0xff, 0xac, 0x74, 0x6f, 0x21, 0xf9, ++ 0xbe, 0xb8, 0x7f, 0x8f, 0x89, 0xea, 0xf6, 0x76, 0x48, 0x0c, 0x4d, 0xd9, ++ 0x61, 0xe7, 0xc1, 0x57, 0x10, 0x1f, 0x17, 0x5f, 0x3d, 0x69, 0x42, 0x27, ++ 0xbc, 0xb8, 0xe1, 0xa4, 0xa9, 0xe3, 0x7b, 0xfc, 0x81, 0x4b, 0x7e, 0x99, ++ 0x05, 0x28, 0x6e, 0xde, 0x68, 0xc2, 0x38, 0xa6, 0x72, 0x8b, 0xd6, 0xef, ++ 0x30, 0x21, 0x9d, 0x3c, 0xc2, 0x3f, 0xaa, 0x7a, 0xee, 0x63, 0xea, 0xaf, ++ 0x44, 0x7f, 0x1e, 0xe6, 0x5b, 0xf9, 0x8c, 0x4c, 0xf5, 0xbb, 0x07, 0x9b, ++ 0x5f, 0x33, 0x21, 0x3f, 0x57, 0x6d, 0x97, 0x58, 0x4a, 0x66, 0xd8, 0xfd, ++ 0xcd, 0x52, 0xc4, 0xf7, 0x1a, 0x96, 0x30, 0xce, 0x07, 0x4b, 0x84, 0xfe, ++ 0x59, 0xc5, 0xfc, 0xeb, 0xd3, 0xe0, 0xb9, 0x55, 0x1b, 0x79, 0xdd, 0x02, ++ 0x7b, 0x34, 0xb2, 0x0e, 0x58, 0xe3, 0xef, 0x15, 0x82, 0xbf, 0x57, 0x6d, ++ 0x9f, 0x45, 0xdf, 0x9f, 0xea, 0xf1, 0xdd, 0x42, 0x8c, 0x1b, 0x6f, 0xc0, ++ 0xe7, 0x38, 0x7f, 0x2f, 0xdb, 0x1c, 0x79, 0x7f, 0x85, 0xe0, 0xeb, 0x15, ++ 0x3a, 0xbe, 0xfe, 0x49, 0x9a, 0xd0, 0x3f, 0xc3, 0xd9, 0x70, 0xe4, 0xeb, ++ 0xaf, 0x0b, 0xd5, 0xb8, 0x1c, 0xb8, 0xfe, 0xf5, 0xc9, 0x95, 0x03, 0x7a, ++ 0x3b, 0x67, 0xdf, 0x26, 0xec, 0xb5, 0x66, 0x2f, 0x2f, 0x07, 0x0c, 0x64, ++ 0x6f, 0xf4, 0xcf, 0x75, 0x36, 0x5e, 0x21, 0x38, 0xab, 0xdb, 0x2e, 0x9b, ++ 0xd0, 0x3f, 0x2d, 0x6b, 0xfa, 0x82, 0xf0, 0x5f, 0xd1, 0xd4, 0x4a, 0xf5, ++ 0x23, 0x37, 0x33, 0xef, 0x6a, 0xc4, 0xd7, 0xcd, 0x4d, 0x56, 0x3b, 0xca, ++ 0x75, 0x45, 0x07, 0xd7, 0x43, 0xd3, 0x9a, 0xcc, 0x7e, 0xbf, 0x84, 0xf7, ++ 0xeb, 0xa9, 0xce, 0xb9, 0xab, 0x85, 0xd7, 0x4d, 0xfa, 0xf6, 0x4b, 0xe4, ++ 0xe7, 0x68, 0x7a, 0x4c, 0xfb, 0xbe, 0xe3, 0x32, 0x81, 0xc7, 0x65, 0xa0, ++ 0xc0, 0xd3, 0xf3, 0xd0, 0xdf, 0xe5, 0x71, 0x73, 0x95, 0x88, 0x93, 0x57, ++ 0x0c, 0xdb, 0x72, 0x18, 0xf7, 0xd9, 0xab, 0xc4, 0xfd, 0xd5, 0x47, 0x0f, ++ 0xc6, 0xa2, 0x7f, 0x38, 0x8d, 0x7d, 0x71, 0x3b, 0xd2, 0x07, 0xe6, 0x63, ++ 0x38, 0x1f, 0x7b, 0x26, 0x12, 0xef, 0xd3, 0x85, 0x5e, 0x9c, 0xbe, 0x9d, ++ 0xeb, 0x45, 0xbd, 0x5d, 0xeb, 0x4a, 0xcd, 0x9e, 0x49, 0x79, 0x4c, 0x88, ++ 0x53, 0x11, 0xae, 0xd5, 0xdb, 0x23, 0xf1, 0x5d, 0xa5, 0x8b, 0xcf, 0x1f, ++ 0x4b, 0xe3, 0xf9, 0xb1, 0x17, 0x74, 0xf8, 0xae, 0x08, 0x32, 0x6b, 0x0e, ++ 0xc2, 0xa1, 0xca, 0x2e, 0x3f, 0x3d, 0xdd, 0xae, 0xe0, 0xbc, 0x47, 0x72, ++ 0xc1, 0xde, 0xa2, 0x9d, 0x54, 0xb3, 0xbe, 0xf7, 0x3b, 0x8c, 0x6f, 0x0a, ++ 0x3f, 0x5b, 0xeb, 0xcf, 0x14, 0xe7, 0xc0, 0xeb, 0xed, 0x1b, 0x6d, 0xe1, ++ 0x71, 0x73, 0x54, 0x3a, 0xf7, 0x17, 0x56, 0x8e, 0x97, 0x7d, 0x48, 0xaf, ++ 0xee, 0x78, 0x63, 0xd0, 0xc1, 0x5c, 0xd5, 0x10, 0x8a, 0x37, 0x20, 0xce, ++ 0x68, 0x4e, 0x4b, 0xe2, 0x71, 0x07, 0x16, 0x94, 0xbc, 0x91, 0x21, 0xb3, ++ 0xc4, 0xc4, 0x50, 0xbc, 0xf1, 0x88, 0x73, 0x53, 0x45, 0x1e, 0xf4, 0xab, ++ 0xb7, 0x73, 0xb9, 0xef, 0x1c, 0x07, 0xe3, 0xe1, 0xf9, 0x6b, 0x85, 0x91, ++ 0x3f, 0x5a, 0xbd, 0xdd, 0x4c, 0xe7, 0x14, 0xab, 0x81, 0xfe, 0x14, 0x57, ++ 0x34, 0xf1, 0xf3, 0x14, 0x9e, 0x26, 0xa9, 0x14, 0xe9, 0x0e, 0xfe, 0xfa, ++ 0xd1, 0x34, 0xdc, 0x8f, 0xc5, 0x94, 0x2a, 0xac, 0x7b, 0x56, 0x23, 0xe7, ++ 0xfb, 0x59, 0x25, 0x5f, 0x10, 0xbf, 0x1c, 0x1d, 0xc4, 0xd7, 0x7b, 0x59, ++ 0x51, 0x53, 0x7a, 0xf3, 0xdf, 0x35, 0xbf, 0x1d, 0xcf, 0x87, 0xa9, 0x61, ++ 0xfe, 0x7b, 0x15, 0xc8, 0x29, 0x3e, 0x5f, 0xd5, 0xc4, 0xeb, 0x91, 0x1a, ++ 0x0e, 0x7c, 0xd3, 0x3f, 0x13, 0xf5, 0x5c, 0xf3, 0x7f, 0xf5, 0x5f, 0x0c, ++ 0xed, 0xd7, 0xc2, 0x2e, 0x6a, 0x7e, 0x61, 0x10, 0xfc, 0xc2, 0x81, 0xdc, ++ 0x2f, 0xa2, 0xef, 0x4d, 0xde, 0x2d, 0xe4, 0x6b, 0x99, 0x9d, 0xef, 0xd3, ++ 0xdd, 0x2d, 0xec, 0x0f, 0x93, 0xea, 0x88, 0xcf, 0xab, 0x8c, 0xf5, 0x87, ++ 0xe2, 0xd1, 0xcf, 0xda, 0xc1, 0xeb, 0x05, 0xd8, 0x3e, 0xfc, 0x28, 0x1c, ++ 0xe8, 0xc7, 0xb7, 0x5f, 0xaa, 0x8b, 0x87, 0x75, 0x77, 0xbe, 0x24, 0x51, ++ 0x3d, 0x1c, 0xbe, 0x8f, 0xdf, 0xa3, 0xec, 0x5c, 0x52, 0xff, 0x09, 0xfa, ++ 0xdd, 0x5f, 0xef, 0xb0, 0x90, 0xbf, 0x79, 0x37, 0xf8, 0x2d, 0x53, 0xf2, ++ 0x7a, 0xca, 0xa5, 0x26, 0xdf, 0xda, 0x77, 0xb3, 0x6a, 0xd8, 0x43, 0xe4, ++ 0x7f, 0x3e, 0xc4, 0xea, 0xa8, 0xad, 0x14, 0xfc, 0xdc, 0xd9, 0x58, 0x4b, ++ 0xdf, 0x07, 0xd5, 0xfc, 0x15, 0x7a, 0x7f, 0x60, 0x4f, 0x7f, 0xa4, 0x52, ++ 0xf0, 0x7d, 0xa5, 0x8e, 0xff, 0xa2, 0xd2, 0x23, 0xf9, 0xae, 0xe6, 0xed, ++ 0x68, 0xf2, 0x1b, 0xbb, 0x8e, 0xca, 0x76, 0xdc, 0x8f, 0x01, 0x7c, 0xfd, ++ 0x26, 0x2d, 0x1c, 0x2f, 0xc2, 0x0f, 0x69, 0x38, 0x10, 0x45, 0x74, 0xed, ++ 0x3a, 0x69, 0x23, 0x3b, 0xf2, 0x67, 0xc1, 0x6f, 0x17, 0x45, 0xfe, 0xb9, ++ 0x66, 0x9c, 0x4c, 0x78, 0x30, 0x8c, 0xe7, 0x6d, 0x76, 0xcb, 0x6b, 0x03, ++ 0x91, 0x8e, 0x88, 0x77, 0xac, 0xbf, 0x7f, 0xb9, 0xe5, 0xb5, 0x11, 0xfc, ++ 0xdc, 0xb7, 0x9f, 0xf0, 0xbf, 0x6a, 0x9b, 0x1c, 0xf1, 0x7d, 0xd8, 0xca, ++ 0xfa, 0xc8, 0xef, 0xbf, 0xd6, 0xbc, 0x7d, 0x1b, 0x7d, 0x47, 0xa8, 0x7a, ++ 0x7f, 0x37, 0x5c, 0x43, 0x4c, 0x89, 0x21, 0xb8, 0xfa, 0x92, 0x03, 0x49, ++ 0xe2, 0x71, 0xa4, 0x41, 0x8a, 0x8c, 0x23, 0xab, 0xf7, 0xc9, 0x9e, 0xf0, ++ 0xba, 0x33, 0x58, 0xcf, 0x1d, 0xa8, 0x8f, 0xd2, 0x85, 0x3c, 0x30, 0x25, ++ 0x98, 0x8c, 0xf9, 0xaf, 0x01, 0xe8, 0x34, 0x00, 0x7c, 0x35, 0x4d, 0x9c, ++ 0xae, 0x86, 0x66, 0xde, 0xc2, 0xfc, 0xb7, 0xf0, 0x3c, 0x89, 0x91, 0xe6, ++ 0xef, 0x71, 0xbf, 0xc8, 0xb7, 0x1a, 0xef, 0x7f, 0x9d, 0x69, 0xe5, 0xfb, ++ 0xd7, 0x57, 0x7d, 0x15, 0xd8, 0xbf, 0x7f, 0xa0, 0x4c, 0x75, 0x9d, 0xf7, ++ 0xbf, 0xbd, 0x72, 0x68, 0xb8, 0x1e, 0x65, 0x08, 0x27, 0xd0, 0xb5, 0xda, ++ 0x18, 0x4c, 0xa6, 0x78, 0xf3, 0xa4, 0x81, 0xe0, 0xab, 0x3e, 0x79, 0x39, ++ 0x79, 0x90, 0x0d, 0xf5, 0xd2, 0x96, 0x12, 0xfc, 0x7e, 0xe8, 0x74, 0xa1, ++ 0xff, 0x0e, 0x0f, 0xb4, 0x2e, 0x47, 0x7e, 0xf6, 0xe1, 0xbc, 0x29, 0xa1, ++ 0x71, 0x5e, 0x4e, 0xe3, 0xf5, 0x7b, 0x0c, 0xd7, 0xeb, 0x44, 0x6f, 0xe3, ++ 0x97, 0x7c, 0x5c, 0xb1, 0xde, 0x87, 0xd8, 0x6c, 0x11, 0x57, 0x73, 0x7e, ++ 0xca, 0x49, 0xe3, 0xeb, 0x85, 0x78, 0x64, 0x5c, 0x7a, 0x2f, 0xf1, 0xc8, ++ 0xf5, 0xfa, 0x9d, 0x60, 0x1f, 0x4e, 0x2d, 0x94, 0xb0, 0x9e, 0x49, 0xf1, ++ 0x61, 0x3c, 0xbc, 0xe7, 0x3d, 0xae, 0x17, 0x6a, 0x9a, 0x97, 0x7d, 0x84, ++ 0xfc, 0x5e, 0xfd, 0xbe, 0x99, 0xea, 0xbc, 0xee, 0x6f, 0x59, 0x36, 0x94, ++ 0xea, 0x7d, 0xbd, 0xde, 0x1b, 0xd0, 0xdf, 0xf8, 0xba, 0x65, 0xc5, 0x0d, ++ 0x94, 0x1f, 0x94, 0x1e, 0x22, 0xb8, 0x7c, 0x08, 0x9f, 0x13, 0xfd, 0x9a, ++ 0x33, 0xc9, 0x58, 0x97, 0x5a, 0xd9, 0x7c, 0x26, 0x99, 0xec, 0xee, 0xde, ++ 0xd1, 0x9b, 0x7c, 0x31, 0xe8, 0xbf, 0xe4, 0x4d, 0xc7, 0xeb, 0xe0, 0x4f, ++ 0x10, 0xff, 0x81, 0x5f, 0x43, 0xfc, 0xb7, 0xa7, 0xad, 0x40, 0xf3, 0x63, ++ 0xac, 0x38, 0x6e, 0xe5, 0x51, 0xc5, 0x83, 0xf8, 0xa9, 0x3c, 0x5a, 0x70, ++ 0xbc, 0x02, 0xfd, 0x8b, 0x13, 0x45, 0x05, 0xa8, 0xce, 0xa5, 0x13, 0x05, ++ 0xe4, 0xc7, 0xe4, 0xa3, 0x1f, 0x63, 0x0b, 0xf9, 0x35, 0xdd, 0x7a, 0x32, ++ 0x9d, 0xfb, 0x31, 0x5d, 0xad, 0x51, 0x94, 0x5f, 0x90, 0xd8, 0x40, 0xce, ++ 0x3f, 0x6c, 0x50, 0x04, 0xff, 0xac, 0x6e, 0x78, 0x9d, 0xec, 0xfd, 0xea, ++ 0x46, 0x39, 0xa2, 0x7e, 0x51, 0x7b, 0xef, 0xce, 0x74, 0x85, 0xc6, 0x59, ++ 0xa6, 0xf1, 0x4f, 0xbd, 0xe4, 0x26, 0xfe, 0xd8, 0xc5, 0xdb, 0xd5, 0x8d, ++ 0x7b, 0x68, 0x7d, 0xab, 0x8c, 0xf5, 0x44, 0xef, 0x9a, 0xed, 0x46, 0x7e, ++ 0x7f, 0x07, 0x6f, 0xb5, 0xef, 0xc3, 0xfa, 0x58, 0xbc, 0x0f, 0xf1, 0x71, ++ 0x1c, 0x2f, 0x01, 0x1d, 0xa6, 0x99, 0xfc, 0x19, 0x98, 0x9f, 0x3e, 0x96, ++ 0xc9, 0xfd, 0x7c, 0x3d, 0x3d, 0x3e, 0x4f, 0xe7, 0xf9, 0x8f, 0x63, 0x67, ++ 0xbd, 0x03, 0x90, 0x5f, 0x8e, 0x15, 0x7a, 0x87, 0xda, 0x7b, 0xb1, 0x13, ++ 0x3e, 0x56, 0xc4, 0xe3, 0x5a, 0x49, 0xe0, 0xbb, 0x81, 0x9f, 0x9b, 0xd2, ++ 0x3f, 0xf7, 0x59, 0xba, 0x24, 0xbe, 0x13, 0x12, 0x79, 0xbe, 0x55, 0x6b, ++ 0x4f, 0xa5, 0x73, 0xfd, 0x39, 0xcd, 0xd4, 0xfb, 0x77, 0x01, 0x7f, 0x93, ++ 0xae, 0x9d, 0x4b, 0x60, 0x8f, 0x19, 0x0a, 0x30, 0x2a, 0x36, 0xda, 0x37, ++ 0x08, 0xbf, 0x3e, 0x35, 0xec, 0xbb, 0x0e, 0x73, 0x6e, 0x36, 0x92, 0xbf, ++ 0x70, 0x8a, 0xd9, 0x5f, 0xc7, 0x7a, 0xc7, 0x19, 0x9a, 0x9e, 0x1d, 0xc7, ++ 0xed, 0xab, 0x3e, 0x5f, 0x3e, 0x4f, 0xbc, 0xe7, 0xd9, 0xac, 0xf2, 0xfd, ++ 0x22, 0xdd, 0xf9, 0x99, 0x79, 0xda, 0xf9, 0x26, 0xdd, 0x79, 0xb7, 0x79, ++ 0xc2, 0xdf, 0x99, 0xa7, 0xf3, 0x77, 0x9e, 0x4e, 0x17, 0x7e, 0xfc, 0x10, ++ 0x36, 0x04, 0xf5, 0x60, 0xbd, 0x38, 0x7f, 0xb7, 0x76, 0x78, 0x94, 0x3f, ++ 0x3c, 0x9f, 0xa5, 0x6f, 0x0f, 0x8b, 0x7d, 0x11, 0x3c, 0x3f, 0x84, 0x6d, ++ 0xcd, 0xf0, 0x77, 0x29, 0xef, 0x73, 0xac, 0xf5, 0xec, 0x2b, 0x54, 0xef, ++ 0x76, 0x36, 0x8a, 0x0d, 0xe4, 0x79, 0x3d, 0xca, 0x7f, 0x57, 0xf6, 0x91, ++ 0xff, 0xae, 0xe9, 0x96, 0xcb, 0xb9, 0x11, 0x7c, 0xa6, 0xd1, 0xe5, 0x92, ++ 0xf8, 0x1e, 0x8c, 0x9e, 0x2e, 0xbb, 0x35, 0x7d, 0x25, 0xf6, 0xed, 0xa2, ++ 0xc5, 0xbe, 0x9d, 0xdf, 0xe8, 0xdd, 0x8d, 0xf2, 0x5c, 0x69, 0xb9, 0x68, ++ 0xe2, 0x75, 0x87, 0x41, 0x13, 0xea, 0xb3, 0x9a, 0xe1, 0xdc, 0x6f, 0xba, ++ 0x54, 0x2a, 0xd1, 0x7e, 0x3b, 0xc0, 0xd9, 0xdf, 0x1c, 0xa6, 0xdf, 0x2f, ++ 0xa5, 0xf2, 0xf8, 0xeb, 0xfe, 0x5b, 0x24, 0xca, 0xbb, 0xb6, 0xe2, 0xf3, ++ 0x18, 0x67, 0xd5, 0x4b, 0x54, 0xe7, 0x5d, 0x19, 0x68, 0x37, 0x21, 0x3f, ++ 0x0d, 0x69, 0x58, 0xfc, 0x30, 0xc9, 0xad, 0x8f, 0x9d, 0x66, 0x61, 0xdf, ++ 0xd5, 0x98, 0x69, 0xe1, 0x76, 0xb2, 0x9b, 0x7e, 0xda, 0xba, 0xbb, 0xed, ++ 0x58, 0xbc, 0x8f, 0xeb, 0xe3, 0x44, 0x6a, 0xf1, 0x79, 0xb4, 0x8b, 0x33, ++ 0x84, 0x1d, 0xd4, 0x9f, 0x8b, 0x1a, 0xca, 0xda, 0xcb, 0xd2, 0x01, 0x9e, ++ 0xf9, 0x6e, 0xc9, 0x85, 0xf5, 0x00, 0x7d, 0xd1, 0x79, 0xf6, 0x82, 0x51, ++ 0xaf, 0x23, 0x1a, 0xae, 0x97, 0xde, 0x9d, 0xe9, 0xde, 0x77, 0xd2, 0x51, ++ 0xce, 0xdb, 0x2f, 0xdf, 0x82, 0x79, 0xd4, 0x63, 0xc3, 0x3f, 0xeb, 0x8f, ++ 0x76, 0xb4, 0xaa, 0x0f, 0x3e, 0xfe, 0x58, 0xe0, 0x59, 0xff, 0x5d, 0x19, ++ 0xd7, 0x50, 0xb5, 0x16, 0xbf, 0xaf, 0x52, 0xeb, 0xf4, 0x76, 0x90, 0xfe, ++ 0x34, 0x7c, 0x1b, 0x3b, 0x82, 0xe1, 0x38, 0x1d, 0xbf, 0x59, 0x2b, 0x21, ++ 0x9d, 0x18, 0xf1, 0x7f, 0x5f, 0xf2, 0xf3, 0x99, 0x18, 0xf7, 0xb3, 0x74, ++ 0xfe, 0xbd, 0x7b, 0xc0, 0x3d, 0xed, 0xbb, 0xac, 0x4a, 0xe7, 0x75, 0x5a, ++ 0xc7, 0x8c, 0xfe, 0x0c, 0xca, 0x53, 0xe4, 0x5c, 0xdf, 0xbe, 0x57, 0xcd, ++ 0xbe, 0x37, 0x72, 0x51, 0x9f, 0x75, 0xb6, 0x1e, 0xcd, 0x35, 0x85, 0xd1, ++ 0xf5, 0xe2, 0x5a, 0xd0, 0x03, 0x68, 0x57, 0x9a, 0x0f, 0x26, 0xab, 0xb6, ++ 0x70, 0xbe, 0x33, 0x10, 0xbf, 0x49, 0x92, 0xc6, 0x7f, 0x8a, 0xb0, 0x97, ++ 0x91, 0x7c, 0x78, 0x11, 0xf9, 0x30, 0x07, 0xdb, 0x33, 0xb1, 0x83, 0x50, ++ 0x1f, 0xef, 0x3a, 0x15, 0x3b, 0x18, 0xc7, 0xdb, 0xcb, 0xdb, 0x6e, 0x7e, ++ 0x6d, 0xe2, 0xdf, 0xb3, 0x87, 0xf8, 0x68, 0xc8, 0xbc, 0x98, 0x70, 0xf8, ++ 0x1e, 0x26, 0xf8, 0x2e, 0xd5, 0xf3, 0x71, 0x18, 0xeb, 0x18, 0x32, 0x67, ++ 0x64, 0xf8, 0xfd, 0xda, 0xbe, 0xf8, 0xd8, 0x9a, 0x41, 0x7c, 0xdc, 0x11, ++ 0xc1, 0xc7, 0xda, 0x7a, 0xeb, 0xf1, 0x7b, 0x3e, 0x18, 0x07, 0xb4, 0x98, ++ 0xe9, 0x7b, 0x3e, 0x98, 0xbf, 0x76, 0x84, 0xc9, 0xc9, 0xd0, 0x0c, 0xae, ++ 0x7f, 0xc6, 0x8a, 0xef, 0xf7, 0x8c, 0x67, 0x3e, 0xfa, 0xce, 0xe1, 0x58, ++ 0xf1, 0x1d, 0x9f, 0xf1, 0x0a, 0x0b, 0x28, 0xf1, 0xb8, 0x6f, 0x16, 0x90, ++ 0xf9, 0xbe, 0x2f, 0x3f, 0x6f, 0x31, 0x46, 0xf0, 0xf3, 0x58, 0x25, 0xd0, ++ 0x8a, 0x75, 0x14, 0xe3, 0xc5, 0x3e, 0xcf, 0x04, 0xd6, 0x4e, 0xcf, 0x4d, ++ 0x61, 0x41, 0x6a, 0xdd, 0xcc, 0x4e, 0xe7, 0x28, 0x8a, 0x98, 0x8b, 0xda, ++ 0x71, 0x96, 0xc0, 0x74, 0x74, 0xa7, 0x72, 0xea, 0xeb, 0xa9, 0x2e, 0x31, ++ 0x90, 0xac, 0x38, 0xce, 0x5b, 0xc4, 0x79, 0x8d, 0x5e, 0xe8, 0x16, 0x5a, ++ 0xbf, 0x42, 0xdf, 0xed, 0x21, 0xfe, 0x94, 0xf1, 0xbc, 0x4e, 0xef, 0xdf, ++ 0x7d, 0x99, 0x9d, 0xc1, 0xe5, 0x9e, 0x3e, 0x2e, 0x82, 0xf4, 0xbd, 0xc4, ++ 0x28, 0xcf, 0x85, 0xdf, 0x6b, 0xc3, 0x49, 0x26, 0x2a, 0xac, 0x1c, 0xeb, ++ 0x9b, 0x26, 0x2b, 0xcc, 0x12, 0x0d, 0xf0, 0xee, 0x3a, 0x64, 0x20, 0x79, ++ 0x6e, 0xe9, 0x50, 0xfd, 0x58, 0x9f, 0xea, 0x4a, 0x10, 0xef, 0x7d, 0xce, ++ 0xa8, 0x0e, 0x77, 0xac, 0x9b, 0xcb, 0x2b, 0x9a, 0x1c, 0xac, 0xc7, 0xd0, ++ 0xd6, 0xab, 0xc7, 0xc3, 0x04, 0x18, 0x0f, 0xf3, 0x6c, 0x63, 0x15, 0x88, ++ 0x44, 0x09, 0x8f, 0x01, 0x9a, 0xef, 0x46, 0xc6, 0xcf, 0x91, 0x14, 0x32, ++ 0x95, 0xea, 0x9f, 0x4b, 0x33, 0x32, 0x85, 0xbe, 0x0f, 0x52, 0x1c, 0x55, ++ 0x0c, 0x71, 0x14, 0xea, 0x7b, 0x83, 0xc5, 0x47, 0xf8, 0x98, 0x9e, 0xa1, ++ 0xd2, 0x7d, 0xdc, 0x2f, 0x89, 0x85, 0x71, 0x26, 0x6c, 0x94, 0xd8, 0x7b, ++ 0xb8, 0xff, 0x91, 0xc5, 0xd7, 0xab, 0x8d, 0x3f, 0x01, 0x18, 0x01, 0xcf, ++ 0x17, 0x4e, 0xcf, 0xe0, 0xf6, 0x0c, 0x53, 0xaa, 0xef, 0xc5, 0xf3, 0x7d, ++ 0x94, 0x58, 0x2a, 0x68, 0x2e, 0xb1, 0xf3, 0xef, 0x1c, 0x25, 0xd3, 0x77, ++ 0x8e, 0xae, 0x17, 0xaf, 0x5d, 0xc9, 0xfc, 0x7b, 0x97, 0xb1, 0x77, 0x06, ++ 0x3b, 0x7f, 0x56, 0x10, 0xda, 0x4f, 0x72, 0xe1, 0x77, 0x8f, 0x62, 0x43, ++ 0xdf, 0xd9, 0x74, 0x69, 0xff, 0x1e, 0x44, 0x20, 0xf2, 0xdf, 0x83, 0xb8, ++ 0x23, 0x63, 0xc9, 0x8f, 0x90, 0x1f, 0xb5, 0x7a, 0x3d, 0xe6, 0xe5, 0xff, ++ 0xee, 0x83, 0xbe, 0x5e, 0x2f, 0xac, 0x3e, 0x8f, 0x5d, 0x08, 0x3b, 0x87, ++ 0xad, 0xd5, 0x95, 0x6c, 0xf3, 0xcf, 0x56, 0xf1, 0x9c, 0xdf, 0x82, 0x44, ++ 0x0b, 0x9d, 0xfb, 0xcd, 0xb3, 0xf4, 0xcf, 0x47, 0x3b, 0x36, 0xd0, 0xe9, ++ 0xa5, 0xf1, 0xdf, 0x97, 0xb6, 0x0f, 0xa6, 0xc1, 0x14, 0xff, 0x68, 0x4f, ++ 0x4c, 0x88, 0xdf, 0xad, 0xcc, 0x3d, 0x0e, 0xf1, 0x1d, 0xaa, 0x1b, 0xe4, ++ 0xdf, 0x81, 0xea, 0x3e, 0x77, 0x95, 0xcc, 0xe8, 0xbc, 0xa2, 0xd5, 0xcc, ++ 0xeb, 0x2b, 0x1f, 0x03, 0xf9, 0xc0, 0xef, 0x30, 0x81, 0x74, 0xa9, 0x58, ++ 0x47, 0xc3, 0x1e, 0x2c, 0xa6, 0x7a, 0xcc, 0xf5, 0x0e, 0x8b, 0x0b, 0xcf, ++ 0x4b, 0x98, 0x11, 0x6e, 0x6b, 0x08, 0xee, 0x5a, 0x8b, 0xf8, 0x2e, 0xa8, ++ 0x85, 0xef, 0x8b, 0xeb, 0xeb, 0x41, 0x6b, 0x6d, 0x06, 0xfa, 0xee, 0x68, ++ 0x2d, 0x8b, 0xa6, 0x73, 0xe8, 0x49, 0xd1, 0xde, 0x75, 0x19, 0x00, 0xd7, ++ 0x7d, 0x31, 0x45, 0x74, 0xbe, 0x3b, 0x7b, 0xe7, 0x24, 0x27, 0xfa, 0x8d, ++ 0xe1, 0xeb, 0x9f, 0xa4, 0xad, 0xdf, 0xd0, 0xb3, 0x3e, 0x12, 0xd6, 0xfb, ++ 0x48, 0x46, 0x2f, 0xf5, 0x88, 0xda, 0x3a, 0xb5, 0x7f, 0xb7, 0xc3, 0x2e, ++ 0xf0, 0xa7, 0xad, 0xdb, 0xae, 0x9d, 0x53, 0x72, 0x2b, 0x11, 0xe7, 0x94, ++ 0x34, 0x7c, 0x3c, 0x16, 0xcd, 0xd7, 0x6d, 0xc4, 0x9d, 0xff, 0x2c, 0x7a, ++ 0x57, 0x45, 0xbd, 0xa1, 0x5f, 0xef, 0xff, 0x07, 0x97, 0x81, 0x9c, 0x58, ++ 0xa0, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ++}; ++ ++static const u8 xsem_int_table_data_e1h[] = { ++ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xd3, 0xd1, ++ 0x66, 0x60, 0xf8, 0x51, 0x8f, 0xc0, 0x8e, 0x9a, 0x0c, 0x0c, 0x5d, 0xd2, ++ 0xa8, 0x62, 0xb4, 0xc4, 0x1d, 0x12, 0x0c, 0x0c, 0x97, 0x80, 0xf8, 0x0b, ++ 0x10, 0x67, 0x02, 0xed, 0xf5, 0x92, 0x64, 0x60, 0xf0, 0x06, 0xe2, 0x6d, ++ 0x40, 0xbc, 0x1d, 0x88, 0xc5, 0xa5, 0x18, 0x18, 0x02, 0x80, 0x38, 0x10, ++ 0x88, 0xfb, 0x80, 0xfc, 0x7e, 0x20, 0x4e, 0x07, 0xe2, 0x24, 0xa8, 0x1b, ++ 0xb3, 0x05, 0x19, 0x18, 0x72, 0x81, 0x38, 0x1f, 0x88, 0x0b, 0x81, 0x58, ++ 0x48, 0x80, 0x81, 0x41, 0x58, 0x80, 0x78, 0xfb, 0x4b, 0x14, 0x19, 0x18, ++ 0x5e, 0xa8, 0x22, 0xf8, 0xea, 0x6a, 0x0c, 0x0c, 0x09, 0x1a, 0xf4, 0xf3, ++ 0xff, 0x60, 0xc3, 0x76, 0xb6, 0xf4, 0xb5, 0xef, 0x38, 0xd0, 0xbe, 0xe5, ++ 0x6e, 0x08, 0xbe, 0x04, 0x90, 0xbd, 0xc2, 0x0d, 0x55, 0xcd, 0x4a, 0x37, ++ 0xfc, 0x66, 0xac, 0x42, 0x93, 0x5f, 0x8d, 0xc6, 0x5f, 0x83, 0x47, 0x7f, ++ 0x9c, 0x0d, 0x2a, 0x7f, 0xb1, 0x29, 0x9a, 0x59, 0xe6, 0x0c, 0x0c, 0xf7, ++ 0x90, 0xd4, 0x2c, 0x31, 0xc5, 0xef, 0x16, 0x74, 0xcc, 0x07, 0xf4, 0x1f, ++ 0x3f, 0x9e, 0x30, 0x5d, 0xc2, 0x88, 0xca, 0x9f, 0xc8, 0x84, 0xca, 0xe7, ++ 0x87, 0xf2, 0x01, 0x6f, 0x54, 0x8f, 0xba, 0xa8, 0x03, 0x00, 0x00, 0x00 ++}; ++ ++static const u8 xsem_pram_data_e1h[] = { ++ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xed, 0x7d, ++ 0x0d, 0x78, 0x54, 0xd5, 0x99, 0xf0, 0xb9, 0x3f, 0x73, 0x67, 0x26, 0x99, ++ 0x99, 0xdc, 0x24, 0x43, 0x32, 0x60, 0x12, 0x6e, 0x7e, 0xd0, 0xa0, 0x01, ++ 0x87, 0x98, 0x60, 0xb0, 0x58, 0x6e, 0x20, 0xe1, 0x47, 0xa3, 0x0e, 0x08, ++ 0x2c, 0x74, 0x81, 0x4c, 0x50, 0x10, 0x2d, 0xda, 0x88, 0xd5, 0xc6, 0xdd, ++ 0x50, 0x06, 0x09, 0xbf, 0x09, 0x21, 0xe1, 0x4f, 0x70, 0xd1, 0x1d, 0x10, ++ 0x5d, 0xea, 0x63, 0xfb, 0xc5, 0x56, 0xbb, 0xea, 0x76, 0xed, 0x04, 0xad, ++ 0x8d, 0x56, 0x6b, 0xd0, 0xae, 0x0f, 0xed, 0xee, 0xc2, 0x40, 0x2b, 0x7e, ++ 0x75, 0xed, 0x36, 0xb2, 0xdb, 0x2e, 0xdd, 0x76, 0xeb, 0xf7, 0xbe, 0xef, ++ 0x39, 0x97, 0x99, 0x7b, 0x33, 0x01, 0xfc, 0xd9, 0x6f, 0x77, 0xbf, 0xe7, ++ 0x8b, 0x8f, 0xcf, 0xe1, 0xdc, 0x7b, 0x7e, 0xde, 0xf3, 0x9e, 0xf7, 0xff, ++ 0xbc, 0xe7, 0x8e, 0x8b, 0xe5, 0xb1, 0xe0, 0x34, 0xc6, 0x3e, 0xc6, 0x3f, ++ 0x28, 0x27, 0xe6, 0x32, 0xc6, 0x6a, 0x53, 0x65, 0x8b, 0x87, 0xc5, 0xb2, ++ 0x73, 0x18, 0xcb, 0xed, 0x90, 0x18, 0xab, 0x61, 0x6c, 0x65, 0xbb, 0x12, ++ 0x9f, 0x05, 0xff, 0x2c, 0xec, 0x68, 0x79, 0x15, 0xeb, 0xcb, 0xdb, 0xdc, ++ 0x86, 0xbb, 0x94, 0xb1, 0xfe, 0x07, 0xdd, 0xfe, 0x1a, 0xa8, 0x9f, 0xd9, ++ 0xae, 0x84, 0xdd, 0xd0, 0xb5, 0x51, 0xf1, 0x51, 0x7d, 0x59, 0x97, 0x2b, ++ 0xec, 0x36, 0xe0, 0xf9, 0xd6, 0x8f, 0x5e, 0xc9, 0xc7, 0xf7, 0x1b, 0xa5, ++ 0x30, 0x83, 0x3a, 0x63, 0xf7, 0x32, 0x36, 0x99, 0xb1, 0x35, 0x1e, 0xf8, ++ 0x27, 0xd4, 0x97, 0x55, 0x24, 0x3b, 0xf0, 0xfd, 0x89, 0x2d, 0x52, 0x38, ++ 0x86, 0xaf, 0x99, 0xe9, 0x9b, 0x04, 0xef, 0x6f, 0x67, 0xfc, 0x7d, 0xf3, ++ 0x83, 0x8a, 0xc6, 0x64, 0xa8, 0xef, 0xbb, 0xa3, 0x89, 0x4d, 0x64, 0xec, ++ 0xb6, 0x1e, 0x98, 0xc5, 0x43, 0x0d, 0xd9, 0xc7, 0xbc, 0x3d, 0x63, 0x05, ++ 0x8c, 0x45, 0xf8, 0x23, 0xd6, 0xb2, 0x05, 0xde, 0x57, 0xa6, 0xde, 0x47, ++ 0x58, 0xd7, 0x47, 0x0a, 0xf4, 0x6b, 0x8e, 0x39, 0x9e, 0xef, 0x9b, 0xf5, ++ 0x3e, 0x0b, 0xe0, 0x7b, 0x2d, 0xf5, 0x1c, 0xd6, 0x73, 0x0c, 0xff, 0x31, ++ 0x85, 0xb1, 0xcb, 0x99, 0x3f, 0x78, 0x26, 0x1b, 0xfe, 0x1d, 0x66, 0xe1, ++ 0x8f, 0x15, 0x28, 0x1b, 0xf2, 0x19, 0x1b, 0x9d, 0xc2, 0x97, 0xb3, 0x64, ++ 0x0c, 0xa0, 0x1f, 0xc5, 0xd8, 0x5c, 0xc6, 0x5c, 0xac, 0x1c, 0xc6, 0xa9, ++ 0xbd, 0xc2, 0xc5, 0xca, 0x60, 0x7d, 0x16, 0x1e, 0xdb, 0x38, 0x1e, 0x97, ++ 0x35, 0x49, 0x84, 0xc7, 0x65, 0x3e, 0x46, 0xf5, 0x13, 0x73, 0xa5, 0xf8, ++ 0x43, 0xa5, 0xd4, 0x8f, 0x4d, 0xaf, 0x86, 0x12, 0x9e, 0x17, 0xe4, 0x41, ++ 0x19, 0x64, 0x66, 0x21, 0x94, 0x11, 0x0f, 0x4b, 0x64, 0x03, 0xfc, 0x73, ++ 0xdb, 0xae, 0x78, 0x0f, 0xd7, 0xbf, 0x01, 0xa7, 0x1a, 0x4d, 0xed, 0x13, ++ 0x01, 0x78, 0xbf, 0x80, 0x45, 0x5d, 0x0c, 0xe0, 0xfb, 0x13, 0x16, 0xa3, ++ 0x72, 0x31, 0x8b, 0x53, 0xf9, 0xa7, 0x2c, 0x41, 0x70, 0x2c, 0x65, 0x43, ++ 0x25, 0x2a, 0xd4, 0xef, 0x51, 0x12, 0x9b, 0x18, 0xcc, 0x13, 0x0e, 0x45, ++ 0xa7, 0xe3, 0xfe, 0xfe, 0xb6, 0xfe, 0xd8, 0x09, 0x09, 0xde, 0x3f, 0x50, ++ 0x2d, 0xd5, 0x4e, 0x81, 0x92, 0xf9, 0xf2, 0x68, 0xdd, 0x17, 0x5b, 0x9f, ++ 0x35, 0xbf, 0xca, 0x22, 0x37, 0xe0, 0x38, 0x8c, 0xc9, 0xae, 0x88, 0x9f, ++ 0xb1, 0xf1, 0xd6, 0x3a, 0x0f, 0xb3, 0x58, 0x45, 0x90, 0x31, 0xbd, 0xc7, ++ 0xc7, 0xe9, 0xe5, 0x30, 0xeb, 0x67, 0x50, 0x1f, 0xdf, 0x20, 0xe8, 0xa5, ++ 0xf1, 0x7d, 0x39, 0x04, 0xeb, 0xee, 0x79, 0x81, 0x85, 0xb1, 0x1e, 0x82, ++ 0xcd, 0x9c, 0x02, 0xf5, 0x50, 0x57, 0x56, 0x7c, 0x03, 0xd4, 0x7b, 0x9e, ++ 0x88, 0xd5, 0x23, 0x5e, 0x8e, 0xb5, 0x00, 0xe6, 0xa1, 0xff, 0xb1, 0x46, ++ 0xb7, 0x14, 0xad, 0x82, 0xd2, 0xa5, 0xbb, 0x22, 0x50, 0x86, 0x54, 0xc6, ++ 0x14, 0xc0, 0x53, 0x7d, 0xc3, 0x7a, 0x49, 0x81, 0x76, 0x73, 0xa3, 0x7c, ++ 0x9c, 0xf1, 0xa6, 0x26, 0xb3, 0xab, 0xa1, 0x7e, 0x38, 0x26, 0xa9, 0xe2, ++ 0x39, 0xf6, 0xd7, 0xf5, 0x98, 0xa4, 0x43, 0x7d, 0x3c, 0xd4, 0x1f, 0x92, ++ 0xf0, 0xbd, 0xee, 0x62, 0x30, 0x4e, 0x43, 0x43, 0xae, 0x2b, 0x59, 0x85, ++ 0xf8, 0xee, 0x19, 0xa3, 0x43, 0x59, 0x71, 0x58, 0x4b, 0xc8, 0x80, 0xdf, ++ 0x7a, 0x53, 0xa7, 0xe7, 0x8c, 0x2d, 0x22, 0xba, 0x1a, 0x2f, 0x68, 0x6d, ++ 0xae, 0xc9, 0xfb, 0xcd, 0x3d, 0x9c, 0xe7, 0x67, 0xf4, 0x9e, 0xfd, 0xf1, ++ 0x63, 0xeb, 0x3d, 0xe0, 0xf7, 0xb2, 0x22, 0xbe, 0x6f, 0xc7, 0x0e, 0x97, ++ 0xe5, 0x20, 0xbc, 0x2c, 0x6a, 0xef, 0x5f, 0xa4, 0xb2, 0x98, 0x27, 0x2f, ++ 0x85, 0xe7, 0x9d, 0xeb, 0xe0, 0x85, 0x3b, 0x85, 0xdf, 0x5d, 0x87, 0xcb, ++ 0xb6, 0x22, 0xde, 0x8e, 0xf5, 0xa9, 0x61, 0x41, 0xca, 0xb6, 0xf1, 0x61, ++ 0xdc, 0xde, 0x06, 0x78, 0x7f, 0xb6, 0x4a, 0x0e, 0x2b, 0x06, 0xf2, 0x59, ++ 0x11, 0x87, 0xbf, 0x42, 0xf7, 0xeb, 0xbe, 0xd4, 0x38, 0x3b, 0xd7, 0x41, ++ 0xfb, 0x2b, 0x52, 0x70, 0x34, 0x2a, 0x53, 0xfb, 0x09, 0x1f, 0x26, 0x23, ++ 0x7e, 0x9c, 0x5b, 0x03, 0xed, 0xab, 0x52, 0xed, 0x9f, 0xc4, 0xf6, 0x00, ++ 0xc7, 0x1e, 0x84, 0x87, 0xfa, 0xad, 0x39, 0xea, 0xc5, 0x79, 0x22, 0x8c, ++ 0xe6, 0x19, 0x89, 0x1e, 0x5e, 0x5c, 0xa7, 0x53, 0xbf, 0x41, 0xb1, 0x8e, ++ 0xeb, 0xfe, 0x77, 0x98, 0xf6, 0x69, 0x6e, 0x43, 0x8b, 0xc4, 0xe7, 0x15, ++ 0xf0, 0x35, 0xd8, 0xe1, 0xb3, 0x4a, 0x0b, 0xbe, 0x91, 0xc6, 0x3f, 0x26, ++ 0xe0, 0xb2, 0xc6, 0xb7, 0xe6, 0x7b, 0x72, 0x5d, 0x88, 0xca, 0x46, 0xa5, ++ 0xea, 0xd1, 0xaf, 0xe2, 0xba, 0x8e, 0x68, 0x7c, 0x5d, 0xf3, 0x8d, 0x27, ++ 0x76, 0x23, 0xfe, 0x8e, 0x78, 0xc2, 0x31, 0xa8, 0x3f, 0x75, 0xc3, 0xdf, ++ 0x8c, 0xf9, 0x2a, 0x0c, 0x71, 0xd5, 0xf4, 0x17, 0xae, 0x7c, 0x96, 0xe1, ++ 0x7c, 0xcb, 0x1f, 0xb9, 0x13, 0xd7, 0xf5, 0x7c, 0x16, 0xad, 0xeb, 0xe9, ++ 0x0f, 0xcf, 0xbe, 0x7e, 0x33, 0x1b, 0x3e, 0xef, 0xdb, 0x02, 0x0f, 0x3f, ++ 0x39, 0x3f, 0x7f, 0x88, 0xea, 0xd6, 0xfc, 0x73, 0x4d, 0x69, 0x8c, 0x04, ++ 0x74, 0x56, 0x69, 0x4a, 0x09, 0x17, 0xd0, 0xcb, 0xb1, 0xfa, 0x2f, 0x3f, ++ 0xf2, 0x55, 0x03, 0xeb, 0xfd, 0x26, 0xca, 0x93, 0x4a, 0xf3, 0x98, 0x29, ++ 0x41, 0x39, 0x11, 0x86, 0xa1, 0xfd, 0x66, 0xea, 0x1f, 0x3f, 0x06, 0x79, ++ 0x56, 0x09, 0xdd, 0x91, 0x1f, 0x27, 0x35, 0x48, 0x2d, 0xd8, 0xee, 0xc9, ++ 0x9b, 0x1f, 0xfe, 0xd2, 0xfd, 0xf0, 0xe8, 0x27, 0x2e, 0x0e, 0xf7, 0x55, ++ 0x7f, 0xc1, 0xe1, 0xbe, 0xe2, 0xc6, 0xb5, 0x4f, 0x21, 0xbc, 0x57, 0xdc, ++ 0xbc, 0xf6, 0x67, 0xcf, 0x42, 0xfd, 0x2a, 0x14, 0x82, 0xc0, 0x77, 0x97, ++ 0xdf, 0xb2, 0x7f, 0xcd, 0xdf, 0xc1, 0x3f, 0xbf, 0xb1, 0xf0, 0x2f, 0x96, ++ 0xef, 0x61, 0x24, 0x17, 0x62, 0xd9, 0x00, 0x47, 0xae, 0x29, 0x31, 0xdc, ++ 0xdf, 0x65, 0xdf, 0x73, 0xdb, 0xe4, 0xca, 0xb1, 0x17, 0xfc, 0x24, 0x57, ++ 0x0a, 0xcd, 0xd2, 0x18, 0xf2, 0xdf, 0xb2, 0x3e, 0x89, 0xe4, 0x73, 0x7f, ++ 0xa3, 0x9b, 0x05, 0xf1, 0xfd, 0x4f, 0xdd, 0x71, 0x37, 0xf2, 0xd7, 0x83, ++ 0x92, 0x49, 0xed, 0x9f, 0x73, 0xc7, 0x51, 0x3e, 0x1c, 0x73, 0x31, 0x86, ++ 0xf2, 0x78, 0xd9, 0x71, 0x6f, 0x1c, 0xf9, 0x85, 0xad, 0x5a, 0x46, 0xf2, ++ 0x3a, 0x62, 0xc9, 0x6b, 0x33, 0x7f, 0xe9, 0x57, 0x61, 0xbc, 0x13, 0x0d, ++ 0x96, 0x3c, 0xe7, 0x74, 0x4a, 0xef, 0x61, 0x7d, 0x27, 0xcc, 0x9f, 0x6f, ++ 0xbf, 0x16, 0xfa, 0x9f, 0x35, 0x5d, 0x61, 0x14, 0x9b, 0x96, 0xbc, 0x70, ++ 0xe2, 0xf9, 0x84, 0xc0, 0x6f, 0xa4, 0xbe, 0x9c, 0xe8, 0x60, 0x99, 0x9a, ++ 0x74, 0x85, 0x33, 0xd0, 0x43, 0x73, 0x9b, 0x62, 0x93, 0xdb, 0xf5, 0x0d, ++ 0xa7, 0x88, 0xae, 0x96, 0x41, 0xc9, 0xd2, 0xf8, 0x74, 0xae, 0xe0, 0xb3, ++ 0x65, 0x0d, 0x3f, 0x17, 0xfc, 0xa9, 0x93, 0x5c, 0x72, 0xc2, 0xf3, 0x66, ++ 0x6d, 0x61, 0x71, 0x26, 0xba, 0x3b, 0x2d, 0xe0, 0x49, 0x0a, 0x7a, 0x3b, ++ 0x81, 0xfb, 0x7d, 0x05, 0xc2, 0x07, 0xbd, 0x90, 0x6e, 0xba, 0x94, 0xb8, ++ 0x92, 0x26, 0xa7, 0xe1, 0xcf, 0x15, 0x99, 0x40, 0xf5, 0x18, 0xb2, 0xf4, ++ 0x6d, 0x5b, 0xec, 0x70, 0x5a, 0x72, 0xbb, 0x25, 0x96, 0x6d, 0xd3, 0x57, ++ 0x20, 0x7f, 0xff, 0x05, 0xe5, 0x66, 0x73, 0x5b, 0xbe, 0xed, 0xf9, 0xdc, ++ 0x1c, 0x56, 0x3b, 0xf5, 0xd3, 0xc9, 0xe1, 0xdf, 0x93, 0x1c, 0x4e, 0x4a, ++ 0x04, 0x0f, 0xe8, 0x5f, 0xda, 0xff, 0x48, 0x5c, 0x8a, 0xa3, 0x5c, 0xb4, ++ 0xf6, 0xe7, 0x2e, 0xb1, 0x3f, 0x91, 0x0a, 0x46, 0xeb, 0xf9, 0xe5, 0x01, ++ 0x29, 0x1e, 0x83, 0xfd, 0xfd, 0xe5, 0x11, 0xb1, 0xbe, 0x7d, 0x52, 0x5c, ++ 0x91, 0x88, 0x5e, 0xcd, 0x33, 0x1e, 0x1c, 0x17, 0xe6, 0x2c, 0x4f, 0xed, ++ 0xff, 0x9d, 0x62, 0xff, 0x53, 0xfb, 0xc7, 0xf1, 0x63, 0xe1, 0x2b, 0xa5, ++ 0xe7, 0x72, 0x37, 0x25, 0x01, 0x84, 0x16, 0x5f, 0xa4, 0x04, 0xe5, 0xb5, ++ 0xc5, 0x3f, 0x16, 0x7e, 0xfb, 0xf7, 0xfc, 0xb0, 0x04, 0xf7, 0xaf, 0xb0, ++ 0xad, 0xb4, 0xbb, 0x0e, 0xe1, 0x3c, 0xa0, 0x10, 0xff, 0x7e, 0x58, 0x7f, ++ 0xaa, 0x18, 0xf7, 0xed, 0x84, 0x0b, 0xf0, 0x0a, 0xfd, 0x23, 0x87, 0x1f, ++ 0x0f, 0x30, 0x5f, 0x0a, 0xfe, 0x16, 0x21, 0x07, 0x3f, 0xe8, 0x00, 0x7a, ++ 0x81, 0xe7, 0x12, 0xc2, 0x59, 0x99, 0x06, 0xa7, 0x80, 0xdb, 0x85, 0x75, ++ 0x68, 0x77, 0x67, 0x83, 0xd4, 0x87, 0x7c, 0xfa, 0x0b, 0x31, 0xaf, 0xd5, ++ 0xef, 0x87, 0x5b, 0x66, 0xcc, 0x44, 0xfc, 0xdc, 0xd5, 0x23, 0x31, 0xc4, ++ 0xcf, 0x9d, 0x47, 0x7a, 0x97, 0xfd, 0x19, 0xac, 0x7f, 0x75, 0x3c, 0x3b, ++ 0x8c, 0x53, 0xfc, 0xb2, 0xb1, 0x38, 0x70, 0x19, 0xc0, 0xb3, 0xa2, 0xc7, ++ 0xbe, 0x9f, 0xa7, 0xb7, 0xdc, 0x1a, 0x40, 0xba, 0xf9, 0xb0, 0x2f, 0xbf, ++ 0x00, 0xc7, 0xb9, 0x73, 0x6a, 0x42, 0x43, 0x38, 0x57, 0x27, 0x5e, 0xd3, ++ 0x0c, 0xa0, 0xb3, 0x59, 0x66, 0xaf, 0x96, 0xcc, 0x40, 0x57, 0x1f, 0xf6, ++ 0x6d, 0x08, 0x60, 0xfb, 0x0f, 0xd5, 0x9e, 0x9b, 0xaf, 0xc3, 0x79, 0xf6, ++ 0x29, 0xe1, 0xf5, 0x30, 0xfe, 0xea, 0x23, 0xa5, 0x33, 0x4d, 0x4e, 0xa7, ++ 0x44, 0xbf, 0xab, 0x05, 0x7e, 0x4f, 0xa9, 0x3d, 0x33, 0xc7, 0x00, 0x7c, ++ 0x2d, 0xdf, 0x28, 0x27, 0x79, 0xf0, 0x5e, 0x9f, 0x32, 0x3b, 0x9e, 0x41, ++ 0x7e, 0x7e, 0x5d, 0x52, 0x88, 0x0e, 0x56, 0xb7, 0xb9, 0x65, 0x5c, 0xe7, ++ 0x48, 0xf4, 0xf2, 0x61, 0x87, 0x8b, 0x25, 0x70, 0x1e, 0x35, 0x41, 0xf8, ++ 0x1c, 0xa9, 0xdd, 0x07, 0x7d, 0x2d, 0xf4, 0xbe, 0xff, 0xc1, 0xc2, 0x9b, ++ 0xd0, 0x7e, 0xbb, 0xb3, 0xdd, 0x45, 0xf2, 0xe2, 0xce, 0x36, 0x37, 0xd1, ++ 0xd3, 0xea, 0x06, 0x29, 0xce, 0xa4, 0x14, 0xbf, 0xad, 0x10, 0xf0, 0xae, ++ 0xde, 0xad, 0xd0, 0xfb, 0x53, 0xa6, 0x44, 0xf2, 0xc3, 0xda, 0xaf, 0x3b, ++ 0x05, 0xbd, 0x9d, 0x3a, 0x7c, 0xcd, 0xab, 0xa8, 0xef, 0xcf, 0x82, 0xfc, ++ 0x41, 0xb9, 0x3b, 0x63, 0xe3, 0x0f, 0xb4, 0xcb, 0x00, 0x0f, 0x2b, 0xb6, ++ 0x70, 0x79, 0x74, 0x6a, 0x77, 0xee, 0xd2, 0xfb, 0x50, 0x8e, 0x08, 0x7d, ++ 0x79, 0x97, 0x18, 0xf7, 0x8e, 0xb8, 0x62, 0xe3, 0x8f, 0x95, 0xed, 0xd9, ++ 0xb6, 0xfd, 0x88, 0x76, 0xe5, 0xdb, 0xea, 0x67, 0x8e, 0xe4, 0xdf, 0x5c, ++ 0x87, 0x74, 0xdd, 0xa5, 0x90, 0xfe, 0xbc, 0x6d, 0xe3, 0xe3, 0x5a, 0x88, ++ 0xe4, 0x93, 0xdd, 0xde, 0x44, 0x0e, 0x9b, 0x54, 0x90, 0xb2, 0x2f, 0x4f, ++ 0xb2, 0xa1, 0x05, 0xd7, 0x49, 0x29, 0x7a, 0xb2, 0xe8, 0xe7, 0xf6, 0x36, ++ 0xb0, 0x37, 0x03, 0xc3, 0xed, 0xcd, 0x96, 0x23, 0x12, 0xd9, 0xa3, 0x97, ++ 0x6c, 0x67, 0xb6, 0x81, 0x9d, 0x39, 0x71, 0xb8, 0x9d, 0x69, 0xc9, 0x91, ++ 0x08, 0xda, 0x67, 0xe5, 0x29, 0x39, 0x62, 0xc9, 0x8d, 0x7b, 0x94, 0xe8, ++ 0xd8, 0x20, 0xc0, 0xf1, 0x2b, 0x57, 0xf4, 0x8a, 0xfc, 0x72, 0x92, 0x1b, ++ 0x0f, 0x4a, 0xb5, 0x48, 0x27, 0xfa, 0x6f, 0xd0, 0xae, 0x64, 0x31, 0xa5, ++ 0x16, 0xe5, 0xdb, 0xa5, 0xca, 0x0b, 0x5a, 0xac, 0xc5, 0x47, 0xf0, 0xf7, ++ 0x5e, 0x07, 0xd0, 0x55, 0x06, 0x7a, 0x9d, 0x81, 0x74, 0x05, 0xf3, 0xcc, ++ 0xec, 0xe9, 0xcf, 0x48, 0xcf, 0x33, 0x24, 0x83, 0xc6, 0x4b, 0xd1, 0xcd, ++ 0x6d, 0x01, 0xe2, 0x5b, 0x1c, 0x14, 0xe0, 0x68, 0xf6, 0x98, 0x5d, 0x08, ++ 0xe7, 0x65, 0x30, 0xb1, 0xb7, 0x9a, 0x4a, 0xa6, 0xe4, 0xf1, 0x52, 0x85, ++ 0xfa, 0x66, 0x84, 0x19, 0xe8, 0xe1, 0xf4, 0x5a, 0x29, 0x7e, 0xa8, 0x94, ++ 0xb7, 0xf3, 0xa1, 0x3c, 0x05, 0xb8, 0xae, 0x83, 0xe7, 0xcd, 0x5d, 0x57, ++ 0xc6, 0xb7, 0x49, 0x68, 0x17, 0xc2, 0x1f, 0xea, 0xcf, 0x36, 0x6e, 0x77, ++ 0x43, 0x3b, 0xd3, 0x9f, 0x47, 0xcf, 0x4d, 0x09, 0xca, 0xa2, 0xf6, 0xd2, ++ 0x57, 0x70, 0x7f, 0x2e, 0x03, 0x01, 0xa0, 0x55, 0xf3, 0xf6, 0x38, 0x0f, ++ 0xd8, 0x59, 0x84, 0x12, 0x68, 0x9f, 0x70, 0x57, 0x53, 0xd7, 0x58, 0x00, ++ 0xca, 0x62, 0xe8, 0x27, 0xf3, 0xfe, 0xf4, 0x1e, 0xdb, 0x05, 0x48, 0x8e, ++ 0xc7, 0x69, 0xbd, 0x38, 0x3e, 0x8e, 0x53, 0xa1, 0xc4, 0xd7, 0xa0, 0x9c, ++ 0xb1, 0xe8, 0x78, 0x99, 0x90, 0x3b, 0x20, 0x57, 0x2b, 0x55, 0xa0, 0xaf, ++ 0x66, 0x96, 0x15, 0x46, 0xbd, 0xd9, 0xdc, 0x56, 0x7e, 0x41, 0xfb, 0xe5, ++ 0xa6, 0xb0, 0x5d, 0x7e, 0xdc, 0x52, 0x67, 0xd7, 0x03, 0x73, 0x4d, 0xbb, ++ 0xfc, 0xbf, 0x75, 0xf6, 0x65, 0xb6, 0xf6, 0x0b, 0x22, 0xe5, 0xb6, 0xf7, ++ 0x7f, 0xb2, 0xe8, 0x2a, 0xdb, 0xfb, 0xc5, 0xd1, 0x6b, 0x6c, 0xf5, 0x3f, ++ 0x5d, 0xf5, 0x05, 0x5b, 0xfb, 0xa5, 0xad, 0x33, 0xec, 0x7e, 0xd2, 0x4f, ++ 0x72, 0x69, 0x3d, 0x6b, 0x04, 0x5f, 0x8e, 0x04, 0xf7, 0x1b, 0x42, 0x5e, ++ 0xfe, 0xd8, 0x61, 0x9f, 0x5a, 0x65, 0xd3, 0x8d, 0x89, 0x9a, 0x77, 0x60, ++ 0x9f, 0xd8, 0x3a, 0x77, 0xf8, 0x09, 0x28, 0x4e, 0xce, 0x61, 0x8b, 0xfa, ++ 0xd2, 0xe4, 0x8a, 0x4f, 0x96, 0x08, 0x9f, 0xbf, 0x06, 0x36, 0xe1, 0xfe, ++ 0xc1, 0x1f, 0x3f, 0x26, 0x3c, 0x86, 0xf8, 0xbc, 0x4d, 0x7f, 0xee, 0x6e, ++ 0xcd, 0x44, 0x77, 0x9a, 0xe8, 0x87, 0xe6, 0x12, 0xda, 0x4b, 0xce, 0xf6, ++ 0x27, 0x17, 0xc3, 0x3c, 0x69, 0xfd, 0xfe, 0x4d, 0x92, 0x88, 0x0e, 0xcf, ++ 0xf7, 0x63, 0x9e, 0x9e, 0x5f, 0x00, 0xc8, 0x2d, 0xc0, 0xc9, 0x39, 0x80, ++ 0xfa, 0xbb, 0x59, 0xb2, 0x04, 0xf7, 0xcd, 0x9d, 0x6b, 0xd0, 0xfb, 0x7b, ++ 0xe4, 0x64, 0x01, 0xd6, 0x7f, 0xcd, 0x86, 0xf6, 0xe6, 0xe3, 0xfe, 0xfa, ++ 0x92, 0xc5, 0xc8, 0x3f, 0xcd, 0x2a, 0x7b, 0x5e, 0xca, 0xc1, 0x7e, 0x61, ++ 0x8f, 0x1b, 0xe6, 0x03, 0x6b, 0x88, 0xb5, 0x01, 0x7d, 0xb4, 0xb4, 0xfd, ++ 0xf0, 0x38, 0xda, 0x71, 0x92, 0x11, 0x64, 0x4b, 0xb0, 0xee, 0xf1, 0x25, ++ 0x90, 0xbf, 0x59, 0x87, 0xeb, 0xc3, 0xa4, 0x85, 0x77, 0xe0, 0xc3, 0xde, ++ 0x50, 0xf4, 0x43, 0x09, 0xe0, 0x90, 0xda, 0xfb, 0x7f, 0x27, 0xe1, 0xfb, ++ 0xef, 0x31, 0x03, 0xf5, 0x30, 0x4b, 0x16, 0xe5, 0xa2, 0xff, 0x88, 0x53, ++ 0xa5, 0xf3, 0x61, 0xd3, 0x0c, 0xd6, 0x8a, 0xf8, 0x3a, 0xd9, 0x68, 0xc7, ++ 0x9b, 0x57, 0xac, 0xe3, 0x67, 0x92, 0x4c, 0xed, 0x9e, 0x67, 0xe6, 0x6f, ++ 0x90, 0x8f, 0x4e, 0x49, 0x3a, 0x5f, 0x9f, 0x80, 0x77, 0x9b, 0x64, 0x9e, ++ 0xc3, 0xf9, 0x2c, 0xb8, 0x4f, 0xe4, 0xea, 0x1a, 0xfb, 0x74, 0x70, 0x2b, ++ 0x72, 0x2d, 0xc2, 0xfd, 0x43, 0x82, 0x7b, 0x43, 0x2b, 0x4b, 0x66, 0x2b, ++ 0x23, 0xc3, 0x7d, 0x15, 0x33, 0xdd, 0xf2, 0xa8, 0xe1, 0xf0, 0x9c, 0x63, ++ 0x66, 0x56, 0xa6, 0xe7, 0xb3, 0x80, 0x5d, 0x33, 0x3d, 0xbf, 0xd2, 0xcd, ++ 0x2a, 0xd1, 0x5e, 0x3d, 0x29, 0x65, 0x85, 0xd7, 0x97, 0x62, 0x39, 0xf4, ++ 0x8f, 0x5f, 0x03, 0xbe, 0x8a, 0x7d, 0xc3, 0x17, 0x7e, 0xc2, 0x18, 0x4e, ++ 0x17, 0x53, 0xe5, 0x5c, 0x9a, 0xbf, 0x59, 0xd8, 0xbb, 0x85, 0xed, 0x52, ++ 0x22, 0x1b, 0xed, 0x53, 0xe6, 0x21, 0xfb, 0x95, 0xf5, 0x3c, 0x6c, 0x7a, ++ 0x50, 0xae, 0x09, 0x11, 0xd7, 0xd2, 0x26, 0x9d, 0xc2, 0xf5, 0xb3, 0x8e, ++ 0x46, 0x33, 0xe9, 0x49, 0xad, 0x97, 0x19, 0x12, 0x4b, 0x6f, 0x77, 0x7e, ++ 0xdf, 0xdb, 0xdc, 0xd4, 0xde, 0x92, 0x37, 0x96, 0xdc, 0xb2, 0xf0, 0x69, ++ 0xc9, 0x15, 0x4b, 0x7e, 0x59, 0x78, 0x75, 0x8e, 0x3f, 0x92, 0x9c, 0xc1, ++ 0xf1, 0xd4, 0x3c, 0x84, 0x3f, 0x3a, 0x49, 0x4e, 0xa7, 0x13, 0x1d, 0xf0, ++ 0x31, 0x01, 0xe1, 0x31, 0xab, 0x71, 0xff, 0xac, 0x7d, 0x03, 0x37, 0x32, ++ 0xe6, 0xa9, 0x1e, 0x79, 0xdf, 0x2c, 0x39, 0x05, 0xed, 0x18, 0xfa, 0xff, ++ 0x23, 0xed, 0x17, 0xe0, 0x89, 0xec, 0x3a, 0x57, 0x98, 0x11, 0x9e, 0x4e, ++ 0x04, 0x87, 0x96, 0x3e, 0x0d, 0xeb, 0x1e, 0x68, 0xe3, 0xfa, 0xfa, 0x44, ++ 0x11, 0x23, 0xfb, 0xf0, 0x6c, 0xdb, 0x35, 0x03, 0x39, 0x88, 0x1f, 0x8f, ++ 0xa7, 0x02, 0xf1, 0x53, 0xc8, 0xa7, 0x62, 0x85, 0xc1, 0xa1, 0x75, 0x28, ++ 0x5f, 0x7d, 0x6a, 0xa2, 0x1f, 0xe1, 0x2a, 0x14, 0xfa, 0xcb, 0xcb, 0xb8, ++ 0xfe, 0x2a, 0x64, 0xc6, 0x8e, 0x6b, 0xd1, 0xbf, 0x6f, 0x3f, 0xb5, 0x04, ++ 0xdb, 0x59, 0xfb, 0x93, 0x2b, 0xf6, 0xa7, 0x19, 0xf6, 0x07, 0xfd, 0x91, ++ 0x66, 0xdf, 0x50, 0x31, 0xda, 0x49, 0x6e, 0xd4, 0x6b, 0xd0, 0xce, 0x0d, ++ 0x72, 0x17, 0xe5, 0x72, 0x61, 0xfb, 0xfb, 0xff, 0x81, 0x7a, 0xb1, 0xd0, ++ 0xa1, 0x17, 0x11, 0x12, 0x96, 0x0e, 0x47, 0x56, 0xd5, 0x8e, 0x6b, 0x8d, ++ 0xf4, 0xf1, 0x3f, 0xda, 0x88, 0xf6, 0xa5, 0x35, 0x2e, 0x75, 0x48, 0xdf, ++ 0xff, 0xa0, 0x76, 0x0a, 0xf1, 0x5b, 0xd8, 0xbe, 0xf9, 0x5e, 0x25, 0x60, ++ 0x1b, 0x5f, 0xfa, 0x18, 0xf1, 0x20, 0xe4, 0x36, 0x9a, 0x5d, 0xe7, 0xe7, ++ 0x29, 0x45, 0x7b, 0x55, 0x4e, 0xb8, 0x03, 0x29, 0xba, 0x70, 0xc2, 0x65, ++ 0xf5, 0x1b, 0x89, 0x4e, 0x58, 0xfa, 0x3c, 0xe5, 0xb6, 0x3a, 0xd9, 0x13, ++ 0xce, 0xba, 0x3b, 0xac, 0xd9, 0xe4, 0xf3, 0x89, 0x3f, 0x94, 0xe7, 0xb4, ++ 0xfa, 0x2e, 0x40, 0x6f, 0xce, 0xf1, 0x9c, 0xf4, 0xed, 0xe4, 0x03, 0x81, ++ 0x87, 0x4f, 0x41, 0xa7, 0x9b, 0x38, 0x9d, 0x72, 0xb9, 0x60, 0xf1, 0xed, ++ 0x7f, 0x16, 0x9d, 0x46, 0xad, 0x7d, 0x8d, 0xe5, 0xde, 0x75, 0x04, 0xf5, ++ 0x6b, 0x97, 0x16, 0x9e, 0x65, 0xa0, 0x9d, 0x30, 0xf4, 0x03, 0x6e, 0x27, ++ 0xb8, 0x8d, 0x43, 0x48, 0x67, 0x31, 0x29, 0xab, 0x12, 0xde, 0x47, 0x3b, ++ 0x54, 0xb2, 0x1b, 0x2d, 0xbb, 0xa2, 0x7f, 0xed, 0x5f, 0x6d, 0x29, 0x83, ++ 0xe7, 0x27, 0x6b, 0x65, 0xf2, 0x23, 0x4e, 0xae, 0xe7, 0x74, 0xbf, 0xe7, ++ 0x41, 0x6e, 0x8f, 0x5a, 0x7a, 0x3b, 0x2a, 0xf4, 0x36, 0xda, 0x05, 0x88, ++ 0x57, 0xb0, 0x1b, 0x06, 0xdc, 0xbc, 0xf4, 0xe0, 0x38, 0xfe, 0xf5, 0xb7, ++ 0x96, 0x4a, 0x00, 0xb7, 0xc7, 0x18, 0xea, 0x77, 0x63, 0xfb, 0x36, 0x83, ++ 0xec, 0xd5, 0x9c, 0xba, 0xb8, 0xde, 0x08, 0x65, 0xbc, 0xe2, 0x90, 0x67, ++ 0x9c, 0x91, 0x92, 0x4b, 0xc9, 0x58, 0x7e, 0xde, 0x72, 0xd8, 0xaf, 0x6f, ++ 0xe5, 0x1a, 0xcb, 0x22, 0x64, 0x5f, 0x47, 0x47, 0xcf, 0xf5, 0xa7, 0xde, ++ 0xff, 0x48, 0xe6, 0xfa, 0x69, 0x5a, 0x09, 0xcb, 0x9b, 0x0d, 0xe3, 0x25, ++ 0xb7, 0xca, 0xe1, 0x87, 0xa0, 0x7f, 0xd2, 0x65, 0xd7, 0x63, 0x56, 0xb9, ++ 0x46, 0xe1, 0xfa, 0x32, 0xe9, 0x65, 0x25, 0xe8, 0x07, 0x8f, 0xd4, 0x6e, ++ 0x48, 0xb1, 0xf4, 0xaa, 0xae, 0xd1, 0xbe, 0xcc, 0x1f, 0x38, 0x8e, 0xfb, ++ 0x34, 0xd2, 0x3e, 0xc0, 0x0e, 0xe8, 0x14, 0xc7, 0x3c, 0x4f, 0x87, 0x1c, ++ 0xef, 0x30, 0x0f, 0x8d, 0x9f, 0xf4, 0xdb, 0xf5, 0xd0, 0x29, 0xa1, 0x87, ++ 0x2c, 0xf8, 0x3f, 0x81, 0x5e, 0x5d, 0x58, 0x0c, 0xf4, 0xb1, 0x57, 0xca, ++ 0x0c, 0xf7, 0x47, 0x62, 0xbc, 0xe8, 0xf3, 0x00, 0x00, 0xec, 0x77, 0x54, ++ 0x65, 0x66, 0xa6, 0x76, 0xce, 0x75, 0xff, 0x83, 0xe8, 0x97, 0x90, 0x55, ++ 0x9a, 0x6f, 0x47, 0xc5, 0xce, 0xd9, 0xb8, 0xdf, 0xb1, 0x98, 0x12, 0x4e, ++ 0xdf, 0x0f, 0xab, 0xfc, 0x73, 0x85, 0xeb, 0xcf, 0x9c, 0xb9, 0x0d, 0xb9, ++ 0x8d, 0xd0, 0x8e, 0xad, 0xcf, 0xdc, 0x2e, 0x4f, 0xb4, 0x7b, 0xfc, 0xfe, ++ 0xac, 0x45, 0xe8, 0x5f, 0x01, 0xea, 0x54, 0x8c, 0xd7, 0x84, 0x62, 0xfa, ++ 0xbc, 0xd9, 0x18, 0x8f, 0x9c, 0x9a, 0x37, 0x09, 0x7d, 0xec, 0x1f, 0xa1, ++ 0xfe, 0x81, 0x79, 0x77, 0x47, 0xce, 0xea, 0x2d, 0xbe, 0x4f, 0x84, 0x8f, ++ 0x82, 0x90, 0x32, 0x32, 0x3e, 0xde, 0x92, 0x65, 0xbe, 0x8f, 0x0e, 0xbe, ++ 0xdd, 0x03, 0xee, 0x1a, 0xca, 0xcf, 0xa4, 0xe4, 0xa1, 0xf8, 0x4b, 0x4b, ++ 0xcc, 0x9d, 0x91, 0x8f, 0x2d, 0x39, 0xe5, 0x94, 0x47, 0x4e, 0x3d, 0x27, ++ 0x99, 0x26, 0x6b, 0xab, 0x1e, 0x2e, 0x57, 0xac, 0x71, 0x3f, 0xa9, 0x3e, ++ 0x03, 0xf9, 0x90, 0xa5, 0x8c, 0x4a, 0xd9, 0xed, 0xe7, 0xf5, 0xd9, 0xa5, ++ 0xd2, 0xe3, 0x08, 0x72, 0xa0, 0x44, 0x66, 0xd1, 0xbe, 0x0c, 0xfe, 0xe9, ++ 0xb5, 0x0a, 0xc7, 0x53, 0x7f, 0x8c, 0xc7, 0x29, 0x54, 0x53, 0x26, 0xbd, ++ 0x35, 0x53, 0x69, 0x62, 0x12, 0xe0, 0x69, 0x43, 0x90, 0x91, 0x3c, 0xc8, ++ 0xc3, 0xbd, 0x46, 0xbe, 0x6d, 0x60, 0x71, 0x40, 0x01, 0xcb, 0x67, 0xe1, ++ 0x01, 0x1f, 0xca, 0x93, 0xa0, 0xcc, 0x12, 0xe4, 0xb7, 0x3a, 0xfd, 0x40, ++ 0xb3, 0x09, 0xfd, 0xc0, 0x20, 0x07, 0x8d, 0xe9, 0xa3, 0xca, 0xfa, 0x0b, ++ 0xe1, 0x79, 0x70, 0xfe, 0x4a, 0x3a, 0x67, 0x60, 0x11, 0x2e, 0x6f, 0x75, ++ 0xf8, 0x8f, 0xf3, 0x91, 0x49, 0xfa, 0xc2, 0x2d, 0xf0, 0x1a, 0x8d, 0x4d, ++ 0xa2, 0x38, 0x67, 0x5e, 0x93, 0x5d, 0x8e, 0xbb, 0xd1, 0x0f, 0x04, 0xf9, ++ 0xa8, 0x37, 0x38, 0x9e, 0xcf, 0x9f, 0x49, 0xe7, 0x0d, 0x6e, 0x96, 0xf6, ++ 0x1c, 0xd6, 0x71, 0x8d, 0xe2, 0x0f, 0x9e, 0x01, 0xd3, 0x9e, 0x55, 0xb3, ++ 0x1a, 0xe4, 0xcf, 0xea, 0xfd, 0xd7, 0xec, 0x5a, 0x0c, 0xe3, 0xd7, 0x3c, ++ 0x7a, 0xeb, 0x3b, 0x58, 0x4e, 0x3e, 0x78, 0x5f, 0xfe, 0x97, 0xa0, 0xac, ++ 0x7b, 0x62, 0xd7, 0xad, 0x58, 0x96, 0xbc, 0x1e, 0x1d, 0x9b, 0x29, 0x9e, ++ 0x6a, 0x95, 0xc0, 0x29, 0x4c, 0xae, 0x03, 0xf8, 0x7c, 0xcc, 0x70, 0xe7, ++ 0x8c, 0xdc, 0xce, 0x58, 0xaf, 0x44, 0xd0, 0xae, 0x86, 0x7d, 0xec, 0x40, ++ 0x7a, 0x48, 0xc6, 0xca, 0xb3, 0x90, 0xbe, 0x57, 0x29, 0x9c, 0xff, 0xfb, ++ 0x17, 0x68, 0x01, 0x8c, 0xcf, 0xa8, 0x5b, 0xb8, 0x5c, 0x55, 0xe7, 0x03, ++ 0xf2, 0x88, 0xfe, 0xb9, 0x9f, 0xde, 0x9c, 0xf2, 0xa7, 0xc9, 0xaf, 0x50, ++ 0x85, 0x9f, 0xa4, 0xb4, 0x2b, 0x14, 0x47, 0x48, 0xea, 0x65, 0x14, 0x6f, ++ 0x39, 0xb4, 0x45, 0xd6, 0xb0, 0x04, 0x39, 0x1b, 0xc3, 0x79, 0xac, 0xf9, ++ 0x7b, 0x45, 0x9c, 0xba, 0x53, 0xc4, 0x5b, 0x9d, 0xf0, 0xf5, 0x96, 0x0c, ++ 0x15, 0xa3, 0x1c, 0x3c, 0xb9, 0xfe, 0x23, 0xb2, 0x0f, 0x15, 0x3d, 0x2b, ++ 0x3c, 0x1b, 0xe6, 0xeb, 0xf2, 0xb3, 0x12, 0x82, 0x43, 0xc4, 0x0b, 0x9a, ++ 0xc5, 0xfe, 0x25, 0xd7, 0xd6, 0x7b, 0xd2, 0xe3, 0x45, 0x8a, 0xf0, 0x73, ++ 0x3a, 0x8e, 0xce, 0x19, 0x30, 0x90, 0x0e, 0x06, 0x94, 0xb0, 0xd7, 0x20, ++ 0xbe, 0xd1, 0x70, 0xdc, 0xe8, 0x96, 0xe9, 0x0c, 0xe3, 0x2f, 0xb3, 0xf4, ++ 0x30, 0x43, 0x7b, 0xa2, 0x53, 0xf8, 0x3d, 0x8a, 0xcf, 0x64, 0xb8, 0xaf, ++ 0xd9, 0x3a, 0x9b, 0x89, 0x7e, 0x2d, 0xbc, 0xd2, 0x42, 0xd8, 0xbf, 0x8a, ++ 0x85, 0x13, 0xd8, 0xbf, 0xbd, 0x1f, 0x71, 0x0b, 0xeb, 0x35, 0xef, 0x44, ++ 0x3e, 0xf8, 0xfe, 0xf5, 0xdc, 0x0e, 0x39, 0x59, 0x6a, 0x97, 0xdb, 0x40, ++ 0x42, 0x5d, 0xb0, 0xa7, 0x6c, 0x56, 0xd1, 0x7a, 0x15, 0x69, 0xb3, 0x29, ++ 0x38, 0xe9, 0x1a, 0xa4, 0xf9, 0xdf, 0x29, 0x05, 0x42, 0xae, 0x72, 0x7a, ++ 0x7d, 0xb3, 0x76, 0xca, 0xe3, 0xdb, 0x80, 0x0e, 0x9e, 0x77, 0x9b, 0xf7, ++ 0x29, 0xa3, 0x3e, 0x01, 0x1f, 0x39, 0xe4, 0xfa, 0xf7, 0x81, 0x4d, 0x70, ++ 0xdf, 0x1e, 0x93, 0xec, 0xf2, 0xdc, 0x2a, 0x0f, 0x3a, 0xf9, 0xa8, 0x4d, ++ 0x22, 0xbb, 0x50, 0x35, 0xf9, 0x3a, 0x67, 0x2a, 0x1f, 0x36, 0xa2, 0x9e, ++ 0xdc, 0x08, 0x76, 0x63, 0xa1, 0x31, 0x9c, 0x5f, 0x36, 0xbe, 0xc1, 0xc8, ++ 0x6e, 0xdc, 0x08, 0xfc, 0x17, 0x2b, 0xcd, 0xc4, 0x3f, 0xd5, 0x12, 0xca, ++ 0x88, 0x4b, 0xe5, 0x9f, 0xbc, 0xf6, 0x5c, 0x09, 0xe3, 0x18, 0x9f, 0x95, ++ 0x7f, 0xfe, 0x42, 0x11, 0xe7, 0x74, 0x82, 0x7f, 0x80, 0xce, 0x12, 0x68, ++ 0xc7, 0x3c, 0x26, 0x19, 0x9d, 0x53, 0x60, 0x7d, 0xdf, 0xd9, 0xd7, 0xf8, ++ 0xa3, 0x29, 0xf0, 0xfa, 0xb9, 0x03, 0x2b, 0xb2, 0xaf, 0x83, 0xf2, 0xaf, ++ 0xe3, 0x1b, 0x6f, 0xbc, 0x0e, 0xe6, 0xbf, 0xf3, 0x89, 0x3d, 0xd9, 0xb8, ++ 0xcf, 0x8f, 0xbd, 0x06, 0xfc, 0x74, 0x01, 0x3f, 0xde, 0xe2, 0xa7, 0x66, ++ 0xb4, 0x61, 0x2f, 0x10, 0x67, 0x33, 0xd6, 0xda, 0xf9, 0xc9, 0x58, 0x5f, ++ 0x41, 0xfc, 0xf4, 0xb6, 0xc2, 0xf5, 0x57, 0xff, 0x82, 0xdf, 0xbe, 0x79, ++ 0xed, 0xff, 0xe7, 0xa7, 0x0b, 0xf1, 0xd3, 0x3b, 0x0a, 0xd0, 0xe7, 0xb4, ++ 0x3f, 0x9e, 0x2b, 0x8e, 0x5e, 0x40, 0xbe, 0x35, 0x17, 0x31, 0x0d, 0xed, ++ 0x2d, 0x68, 0x63, 0x22, 0x9d, 0x47, 0x83, 0xf6, 0xd2, 0xa7, 0x66, 0x11, ++ 0xbe, 0xd7, 0xb9, 0xb8, 0x1c, 0xf3, 0xbb, 0xbc, 0xdc, 0xee, 0x08, 0xf1, ++ 0xf7, 0xce, 0xf1, 0xfe, 0x46, 0xfd, 0xe4, 0xf1, 0x83, 0x05, 0xe5, 0x9f, ++ 0x9d, 0x4f, 0xd7, 0xf9, 0xcc, 0x8f, 0x3e, 0x0f, 0x7e, 0x07, 0xb9, 0x43, ++ 0xf2, 0xe6, 0xe4, 0x38, 0x3b, 0xdf, 0x77, 0xba, 0x38, 0xdd, 0xfd, 0xd2, ++ 0xf5, 0x89, 0xd7, 0xf7, 0xee, 0x17, 0x3e, 0x87, 0xf5, 0x81, 0x5d, 0x4f, ++ 0xf6, 0xdd, 0x0d, 0x2a, 0x33, 0xd0, 0x0f, 0x98, 0xf8, 0xa2, 0x87, 0x84, ++ 0xc5, 0x6b, 0xe3, 0x36, 0x1e, 0x41, 0x96, 0x98, 0x06, 0xcf, 0x43, 0x79, ++ 0xfc, 0xbd, 0x3b, 0x8f, 0xe4, 0x65, 0x1c, 0xed, 0x98, 0x21, 0xa5, 0x92, ++ 0xfa, 0x9b, 0x8c, 0xdb, 0xf1, 0x4d, 0x35, 0x9b, 0x8f, 0xf0, 0x73, 0x89, ++ 0xc1, 0x8a, 0x45, 0xe0, 0x2f, 0xcf, 0x81, 0x7f, 0xa1, 0x3d, 0x72, 0x83, ++ 0x8f, 0xfb, 0x15, 0x30, 0x0e, 0x0b, 0xc1, 0xf8, 0xab, 0xbd, 0xd1, 0x62, ++ 0x75, 0x14, 0x8d, 0x47, 0xfe, 0xe5, 0x6b, 0x2f, 0xec, 0x0b, 0xa2, 0x7c, ++ 0x79, 0xc3, 0x63, 0x96, 0xe0, 0x73, 0x96, 0x54, 0x73, 0xf1, 0x7c, 0xc0, ++ 0xb2, 0x3b, 0x46, 0xe6, 0x77, 0x95, 0x9d, 0x49, 0xf3, 0xb3, 0x9e, 0xd1, ++ 0x18, 0xc1, 0x71, 0xfa, 0x72, 0x8d, 0xe2, 0x95, 0x28, 0xc6, 0x02, 0x50, ++ 0xdf, 0x5a, 0x7a, 0x39, 0xc5, 0x29, 0x59, 0x38, 0x76, 0x5c, 0xc2, 0xfa, ++ 0x28, 0x9d, 0xa1, 0x1c, 0x57, 0x82, 0x91, 0xc5, 0x64, 0x87, 0xb4, 0xb9, ++ 0x8d, 0x59, 0x50, 0xdf, 0x0a, 0x06, 0x54, 0x2c, 0x48, 0x74, 0x4b, 0x72, ++ 0x53, 0x69, 0xef, 0x0d, 0x05, 0x50, 0x0e, 0x80, 0x5d, 0x82, 0xef, 0xd5, ++ 0xd8, 0x5c, 0x8f, 0x86, 0xfe, 0xcb, 0x28, 0x19, 0x83, 0xd0, 0xcc, 0xdd, ++ 0xf6, 0x11, 0xf9, 0xdd, 0x27, 0x8b, 0xb9, 0xbc, 0xed, 0x98, 0xc2, 0xe8, ++ 0x9c, 0x66, 0xe0, 0xc1, 0x7f, 0x5b, 0x2a, 0xa3, 0xbd, 0xd3, 0xee, 0xa6, ++ 0x73, 0x0b, 0xb0, 0x1b, 0x89, 0x5f, 0xa3, 0x42, 0x6e, 0x24, 0x83, 0xd3, ++ 0x43, 0x2d, 0xe8, 0x67, 0x14, 0x69, 0x61, 0x09, 0xea, 0x9b, 0x62, 0x3f, ++ 0x3f, 0xfe, 0x35, 0x2e, 0x4f, 0x4c, 0xcf, 0xe4, 0xf4, 0xf8, 0x08, 0x8f, ++ 0x77, 0xb4, 0x84, 0xb8, 0xbf, 0xeb, 0xb4, 0xfb, 0x36, 0x7f, 0xfd, 0x8a, ++ 0xb7, 0x0c, 0x1c, 0xef, 0x07, 0xaf, 0x77, 0x5d, 0x09, 0xe5, 0x1b, 0x4f, ++ 0xfd, 0xec, 0x8d, 0x2b, 0xe1, 0xdd, 0x9b, 0xdf, 0x7a, 0xbd, 0x06, 0xe3, ++ 0xde, 0xee, 0x3a, 0xcd, 0x16, 0x77, 0x74, 0x33, 0xe3, 0x2d, 0xb4, 0xb7, ++ 0xc0, 0x67, 0x4a, 0x68, 0x28, 0x9f, 0x63, 0xa7, 0x96, 0xe0, 0x66, 0xa6, ++ 0xfc, 0x3a, 0x29, 0x86, 0xf8, 0x89, 0xd6, 0xf8, 0xe3, 0xb8, 0x5e, 0xe4, ++ 0x6d, 0xc4, 0x4f, 0x72, 0x8a, 0xc2, 0xcf, 0x17, 0xe1, 0x2f, 0x04, 0xf0, ++ 0x05, 0x04, 0x7c, 0xdd, 0xc1, 0xd3, 0x55, 0x34, 0x4f, 0xec, 0xfd, 0xff, ++ 0xc8, 0x24, 0xef, 0xe9, 0x6f, 0xb2, 0xd0, 0x23, 0xd0, 0x6e, 0x73, 0xde, ++ 0x03, 0x71, 0x94, 0x23, 0xa9, 0xf9, 0x26, 0x91, 0x7c, 0x8a, 0x82, 0x7c, ++ 0x42, 0x3f, 0x32, 0xea, 0xeb, 0x59, 0xb2, 0x86, 0xe6, 0xf3, 0x87, 0x1f, ++ 0xc2, 0x3e, 0x7f, 0x80, 0x5d, 0x9d, 0x9c, 0x3a, 0x2f, 0x3c, 0xb4, 0x65, ++ 0x5e, 0x0b, 0xe2, 0x79, 0xee, 0x02, 0x8f, 0x8e, 0x74, 0xe6, 0x8e, 0x6d, ++ 0xbe, 0x17, 0xe9, 0xdc, 0xb9, 0xce, 0xb3, 0xbe, 0x87, 0x2e, 0xc7, 0xd0, ++ 0x9c, 0x6d, 0x7e, 0xe0, 0x13, 0x77, 0x85, 0x66, 0x7a, 0xc9, 0xfe, 0x65, ++ 0x87, 0x69, 0x3f, 0x44, 0x13, 0x0b, 0x6e, 0x1d, 0x14, 0x08, 0xc6, 0x1d, ++ 0xa0, 0xff, 0xb2, 0x15, 0x2c, 0x43, 0x7f, 0x03, 0xfa, 0xe3, 0x3a, 0x41, ++ 0x9e, 0xa1, 0xbd, 0x6d, 0xf5, 0x03, 0x32, 0x36, 0x71, 0xbd, 0x67, 0x7d, ++ 0xd3, 0x2f, 0xa7, 0x78, 0xbf, 0x88, 0x57, 0x58, 0xfd, 0x6e, 0x89, 0x49, ++ 0x74, 0x4e, 0x70, 0x4b, 0x39, 0xb0, 0x41, 0xf9, 0x70, 0x3c, 0x6d, 0xf0, ++ 0xc9, 0x3f, 0xfe, 0x1a, 0x9e, 0xbb, 0xc4, 0x14, 0x5d, 0xe1, 0x74, 0x10, ++ 0xaa, 0x48, 0xc3, 0x1b, 0xfe, 0xd9, 0xe3, 0x66, 0x9c, 0x2e, 0xae, 0xd8, ++ 0x67, 0xd7, 0xbb, 0x30, 0xff, 0xc2, 0x52, 0x7c, 0x1f, 0x53, 0x88, 0x5e, ++ 0x9c, 0xfc, 0x32, 0x3e, 0x6e, 0x6f, 0xbf, 0xc1, 0x77, 0xe1, 0x73, 0xfd, ++ 0xe1, 0xfb, 0xc9, 0xf1, 0x3c, 0x51, 0xf0, 0x9b, 0xd5, 0xdf, 0x82, 0x8f, ++ 0xe0, 0x95, 0x32, 0xc5, 0xd7, 0xed, 0xe7, 0x32, 0xb7, 0xd4, 0xd9, 0xeb, ++ 0x73, 0x87, 0xe1, 0xe3, 0xc2, 0x70, 0x4d, 0x57, 0xed, 0xe7, 0x36, 0x0d, ++ 0x3e, 0xfb, 0x78, 0x33, 0x83, 0xf6, 0xf7, 0xb3, 0x8b, 0xec, 0xf5, 0x0d, ++ 0x18, 0xbf, 0xf9, 0x24, 0xeb, 0x76, 0xf0, 0xdd, 0x33, 0x63, 0xcc, 0xef, ++ 0xa8, 0x9f, 0xc1, 0xaf, 0xb7, 0xe4, 0xee, 0xfb, 0x9e, 0xc8, 0xdf, 0xd2, ++ 0x38, 0x6a, 0x98, 0xe1, 0x38, 0xfd, 0x0b, 0xf6, 0xce, 0x9f, 0x07, 0x74, ++ 0x50, 0xa8, 0x73, 0xbb, 0xa3, 0x70, 0xfe, 0xc2, 0x86, 0xdc, 0x1a, 0x94, ++ 0x53, 0x4c, 0xe4, 0x99, 0x64, 0xb6, 0x3f, 0x0a, 0x85, 0xbe, 0x57, 0xda, ++ 0x5f, 0x56, 0x72, 0xd0, 0x1f, 0x35, 0x79, 0xfb, 0xe4, 0x92, 0xb7, 0x67, ++ 0xe4, 0xe0, 0x79, 0x71, 0x1d, 0xa3, 0xf3, 0xf4, 0xa8, 0x7a, 0x5f, 0x2c, ++ 0xc7, 0x48, 0xd9, 0x23, 0xfd, 0x6a, 0x79, 0x16, 0xe2, 0xf9, 0xf3, 0xb7, ++ 0x47, 0xee, 0xf5, 0xa6, 0xe7, 0xdd, 0xa4, 0xec, 0x91, 0x07, 0x5f, 0x33, ++ 0x6a, 0x32, 0xd8, 0x23, 0xea, 0x7d, 0x92, 0x09, 0xe3, 0xcc, 0x5a, 0x02, ++ 0xf6, 0x48, 0x55, 0xba, 0x3d, 0xd2, 0x2a, 0xa1, 0x0c, 0xca, 0x5e, 0x02, ++ 0xf6, 0x08, 0xd9, 0x1d, 0xd1, 0xf7, 0x10, 0x5f, 0x23, 0xd9, 0x25, 0x3f, ++ 0xb2, 0xec, 0x7b, 0x7f, 0x66, 0xbb, 0xfa, 0xf7, 0x2a, 0xd7, 0xb3, 0xa0, ++ 0x67, 0xfe, 0xe9, 0xb3, 0xe8, 0x99, 0x71, 0x5e, 0xf3, 0x5f, 0xd4, 0xcf, ++ 0xc1, 0x1e, 0x98, 0x56, 0x62, 0xac, 0x8c, 0x64, 0xa0, 0xc3, 0x0f, 0x54, ++ 0x1e, 0xef, 0xb0, 0xf4, 0x67, 0x63, 0x30, 0xa1, 0xe0, 0xd9, 0x39, 0xe8, ++ 0x4d, 0xd5, 0x05, 0xcf, 0xaf, 0xaf, 0x4b, 0xbe, 0x8c, 0xe2, 0xb8, 0x43, ++ 0xdf, 0x19, 0xc4, 0x75, 0xc3, 0x7a, 0x5c, 0xae, 0xda, 0x4f, 0xbf, 0x9e, ++ 0xb3, 0x2a, 0x87, 0x67, 0xa2, 0xca, 0xf3, 0x60, 0x46, 0xea, 0xf7, 0xad, ++ 0x11, 0xfc, 0x15, 0xaf, 0xe6, 0x15, 0x76, 0x8b, 0x7d, 0xbf, 0xfb, 0x17, ++ 0xbc, 0xab, 0xcb, 0xe8, 0xbf, 0x80, 0x1f, 0x83, 0xfe, 0x4b, 0xd2, 0x57, ++ 0xb6, 0x0d, 0xe3, 0x82, 0x67, 0x63, 0x2a, 0xc5, 0xeb, 0xd4, 0xf9, 0x2b, ++ 0x77, 0xcf, 0x45, 0x7a, 0x02, 0x3b, 0x9b, 0xd3, 0xf3, 0x85, 0xed, 0xeb, ++ 0xeb, 0x87, 0x64, 0x1b, 0x1f, 0x4f, 0x3b, 0x97, 0x65, 0xe3, 0xfb, 0x7a, ++ 0x66, 0x3f, 0xa7, 0x9b, 0xe1, 0xb1, 0x9f, 0xd3, 0x35, 0xea, 0xf6, 0x73, ++ 0xba, 0x59, 0x21, 0xfb, 0x39, 0xdd, 0x1c, 0xc3, 0x7e, 0x4e, 0x77, 0x63, ++ 0xa5, 0xfd, 0x9c, 0xce, 0x69, 0xdf, 0xcf, 0x1c, 0xed, 0xfa, 0xef, 0x69, ++ 0xdf, 0x87, 0x1a, 0x19, 0xf1, 0xd3, 0x45, 0xec, 0x7b, 0xe0, 0xa7, 0x5b, ++ 0x90, 0x9e, 0x46, 0xe2, 0xa7, 0x1b, 0xf2, 0x8d, 0x07, 0x22, 0x19, 0xf6, ++ 0xbb, 0x5a, 0xe3, 0x76, 0xea, 0x6a, 0x6f, 0x64, 0x01, 0xd2, 0xdd, 0x34, ++ 0x83, 0xdb, 0x75, 0xd1, 0xd8, 0x7a, 0xca, 0x07, 0xcc, 0x8b, 0x82, 0xbc, ++ 0x29, 0xa5, 0xb8, 0x21, 0xc5, 0xbd, 0xac, 0xb8, 0x96, 0x15, 0xf7, 0xb2, ++ 0xf2, 0x02, 0xad, 0x78, 0x96, 0x33, 0x7e, 0x65, 0xc5, 0xbd, 0xac, 0x38, ++ 0x96, 0x14, 0xe3, 0x71, 0xab, 0x66, 0x4f, 0x74, 0x05, 0xc2, 0xdb, 0xdc, ++ 0x7e, 0x4a, 0x46, 0x39, 0xa2, 0x3f, 0x0f, 0xf3, 0x20, 0x23, 0x58, 0xe7, ++ 0x78, 0xc3, 0xe2, 0x73, 0x5c, 0x1e, 0xb4, 0xb4, 0x67, 0x8e, 0xcb, 0x39, ++ 0xe3, 0x6f, 0x23, 0xb6, 0xfb, 0x94, 0x7c, 0xf5, 0x39, 0xe8, 0x87, 0xf5, ++ 0xb8, 0x5e, 0x4b, 0x3f, 0x00, 0x9f, 0x3f, 0xf4, 0x59, 0xf8, 0x1c, 0xe4, ++ 0xd6, 0x36, 0x1c, 0xef, 0x5f, 0x90, 0xdf, 0x47, 0x91, 0x3c, 0xe9, 0xa6, ++ 0xfd, 0xab, 0x00, 0x5c, 0xa3, 0x9d, 0x0e, 0xfb, 0xa0, 0x61, 0x9c, 0x7e, ++ 0xc1, 0x99, 0xfd, 0x18, 0x8f, 0x53, 0x8f, 0xbb, 0x89, 0x6f, 0x2f, 0xd5, ++ 0xff, 0xc5, 0x44, 0x07, 0x19, 0x36, 0x2d, 0x0a, 0x3e, 0x38, 0xc6, 0xb3, ++ 0xa2, 0xb1, 0x52, 0xd2, 0x2f, 0x16, 0xdf, 0x58, 0x7c, 0xe2, 0xf4, 0x8f, ++ 0x87, 0xf1, 0xc7, 0x7f, 0x35, 0xff, 0x5c, 0xa2, 0x7f, 0x0c, 0xfc, 0xf3, ++ 0xd7, 0xae, 0x0b, 0xe8, 0x23, 0xe0, 0x8f, 0x17, 0x10, 0xdf, 0xd3, 0x2a, ++ 0x39, 0x7e, 0x9d, 0xfc, 0x60, 0xd1, 0x3f, 0x90, 0x44, 0x42, 0xaa, 0xc6, ++ 0xfd, 0x8e, 0x26, 0xb0, 0xbd, 0x45, 0xef, 0xec, 0xa5, 0xb0, 0x89, 0x70, ++ 0x4e, 0x14, 0x7e, 0xcd, 0xc9, 0xd1, 0x1a, 0xf9, 0x17, 0x27, 0x5f, 0xf8, ++ 0x77, 0x7e, 0x0e, 0xfb, 0x82, 0x27, 0x3c, 0x4e, 0xac, 0x11, 0xdf, 0x4f, ++ 0xec, 0x2e, 0x88, 0x6f, 0x2b, 0x4d, 0xf1, 0x99, 0xc5, 0x4f, 0xed, 0x9e, ++ 0xe8, 0x8f, 0x5c, 0x69, 0x79, 0x20, 0x56, 0xbe, 0xe3, 0x61, 0x8f, 0xf9, ++ 0x06, 0x3e, 0x0f, 0xa9, 0x7d, 0x09, 0xf4, 0x57, 0x42, 0xb3, 0x59, 0x78, ++ 0x83, 0x41, 0x7c, 0x76, 0x8c, 0x3f, 0xe7, 0x7c, 0xea, 0x0b, 0x33, 0x8a, ++ 0x9f, 0x7e, 0x66, 0xbf, 0x6c, 0xaf, 0x2b, 0x8e, 0xe7, 0x43, 0x2d, 0xd2, ++ 0xd0, 0x52, 0x46, 0x7e, 0x2b, 0xd3, 0x90, 0x6f, 0x55, 0x21, 0x4f, 0x5e, ++ 0xca, 0x8a, 0x9e, 0x42, 0x7c, 0x36, 0x4f, 0x8f, 0x94, 0x70, 0x7a, 0x1a, ++ 0x1a, 0xe7, 0x03, 0xb8, 0x7e, 0xde, 0xa1, 0x90, 0xbf, 0xf6, 0x59, 0xf9, ++ 0xa9, 0x79, 0x24, 0xfc, 0x9f, 0xc7, 0x47, 0x74, 0xc8, 0x55, 0x3b, 0x3c, ++ 0x3f, 0x20, 0x5d, 0x6e, 0xa1, 0x7c, 0x0b, 0x85, 0xb4, 0xf8, 0x06, 0x29, ++ 0x83, 0xbc, 0x12, 0xf8, 0x8a, 0xb3, 0xf0, 0x18, 0x5c, 0x1f, 0xec, 0xe7, ++ 0xbf, 0x23, 0x1e, 0xf3, 0xaa, 0x98, 0x44, 0xcb, 0x11, 0x7c, 0xdc, 0xec, ++ 0x31, 0x7f, 0xef, 0xfa, 0x6c, 0xf6, 0x87, 0xa2, 0xd5, 0xa6, 0xf8, 0x18, ++ 0xf0, 0xe6, 0xd1, 0x50, 0x2e, 0x56, 0x03, 0xde, 0xca, 0x87, 0xe3, 0xed, ++ 0x94, 0x8b, 0xaf, 0xdf, 0x49, 0x7f, 0x21, 0x35, 0x29, 0x23, 0xfd, 0x87, ++ 0x40, 0x8e, 0x6e, 0x90, 0xd2, 0xce, 0x49, 0x05, 0x5e, 0xac, 0xf5, 0x8c, ++ 0x24, 0x9f, 0x2d, 0x3a, 0x4d, 0x3b, 0x6f, 0x08, 0x69, 0xe9, 0xeb, 0xfd, ++ 0x7f, 0x54, 0x2e, 0x5b, 0xf2, 0xf2, 0x4a, 0x4f, 0x74, 0x32, 0xee, 0x83, ++ 0xdb, 0x8c, 0x08, 0xf9, 0x67, 0xd2, 0xfe, 0x3a, 0xe5, 0xcc, 0x70, 0x3b, ++ 0x48, 0xa6, 0x73, 0xc6, 0xb3, 0x60, 0xf7, 0x60, 0xb7, 0x4b, 0x95, 0xaf, ++ 0xd3, 0xce, 0x79, 0xf1, 0xb0, 0x84, 0x4d, 0x3d, 0xa7, 0x50, 0x79, 0xfd, ++ 0x39, 0x3a, 0x3c, 0x61, 0x5f, 0x3c, 0x97, 0x4d, 0xa5, 0x79, 0x2e, 0x9f, ++ 0xca, 0xfa, 0x73, 0xb9, 0x54, 0x4e, 0x3f, 0x77, 0x19, 0x95, 0x33, 0xce, ++ 0x8d, 0xa6, 0xb2, 0xe1, 0x1c, 0x00, 0x03, 0x26, 0x4e, 0xe3, 0xb9, 0x52, ++ 0x2a, 0x67, 0x9e, 0xbb, 0x8a, 0xca, 0x59, 0xe7, 0xc6, 0x53, 0x39, 0xfb, ++ 0xdc, 0x35, 0xd4, 0x6e, 0xce, 0xb9, 0x49, 0x54, 0xde, 0x70, 0xee, 0x0b, ++ 0x54, 0xde, 0x78, 0x6e, 0x0a, 0x95, 0x4e, 0xfb, 0xc7, 0x58, 0xaf, 0x92, ++ 0xfc, 0xb6, 0xe4, 0x97, 0x25, 0xdf, 0x9d, 0xf2, 0xdb, 0x92, 0x7f, 0xff, ++ 0xd7, 0xe4, 0x77, 0xac, 0xe1, 0x92, 0xec, 0x1f, 0xd0, 0x7f, 0x5f, 0xd1, ++ 0x2e, 0x20, 0xbf, 0x47, 0x92, 0x17, 0xc0, 0xd7, 0xf7, 0x6b, 0xe9, 0x72, ++ 0x22, 0xa5, 0x9f, 0x1f, 0xd0, 0x3e, 0x03, 0x5f, 0x1f, 0x17, 0x7c, 0x0a, ++ 0xfc, 0xfb, 0x1e, 0xc6, 0x61, 0x3c, 0xe0, 0xc5, 0x51, 0x9c, 0x2a, 0xcc, ++ 0xe3, 0x54, 0x01, 0x43, 0x33, 0x30, 0x4f, 0x63, 0x1f, 0x36, 0x81, 0x2d, ++ 0xf5, 0x97, 0x46, 0x4e, 0x61, 0xdc, 0xa0, 0x79, 0x81, 0x47, 0x8f, 0x01, ++ 0xdc, 0x03, 0xa5, 0x1a, 0xc9, 0xa7, 0x6d, 0x41, 0x8d, 0xce, 0xdd, 0x36, ++ 0x4b, 0xfa, 0x68, 0x2e, 0x0f, 0x92, 0x09, 0xa4, 0xbf, 0x9d, 0x21, 0x8d, ++ 0xc6, 0xdb, 0xf6, 0x07, 0xc5, 0x8b, 0xf9, 0x0b, 0x2f, 0x8f, 0x2a, 0x08, ++ 0xe0, 0x3c, 0xdd, 0x7e, 0x59, 0xc7, 0xf6, 0xdf, 0xca, 0x4d, 0xee, 0xbb, ++ 0x0d, 0xcf, 0xf1, 0xa7, 0xb0, 0xf0, 0x21, 0x18, 0x6f, 0xc5, 0x9e, 0x3d, ++ 0x9e, 0x74, 0x3f, 0x7c, 0x3f, 0x1a, 0x07, 0x00, 0x5f, 0x20, 0xf6, 0x0c, ++ 0x63, 0xc0, 0xd7, 0x1b, 0x47, 0xfd, 0x76, 0x29, 0xce, 0xe7, 0x9b, 0xca, ++ 0x28, 0x1e, 0x03, 0xa5, 0x99, 0x29, 0x5f, 0xec, 0x9b, 0x6e, 0x71, 0x3e, ++ 0xad, 0x0e, 0x85, 0x10, 0x4f, 0x5b, 0x7d, 0x32, 0xe9, 0x83, 0x6e, 0xdd, ++ 0x23, 0xf2, 0x50, 0x93, 0x03, 0x2d, 0xe8, 0xe7, 0xd6, 0xc9, 0x6c, 0x1b, ++ 0xcc, 0xbb, 0x61, 0xf4, 0xbb, 0x5b, 0x10, 0x6c, 0x75, 0x5c, 0xd9, 0x8e, ++ 0x32, 0xa8, 0xef, 0xac, 0x2b, 0xf3, 0xe2, 0x26, 0x3d, 0xf3, 0xea, 0x07, ++ 0x21, 0xb2, 0x27, 0xe0, 0x1d, 0x82, 0x02, 0x65, 0x42, 0x94, 0x66, 0x0e, ++ 0xec, 0x4f, 0xa7, 0x37, 0x6c, 0x5c, 0xe8, 0xbc, 0x4d, 0x31, 0x86, 0xd6, ++ 0x21, 0xb1, 0x62, 0x7f, 0x77, 0xf5, 0xc8, 0xed, 0x36, 0xf9, 0x07, 0x42, ++ 0x48, 0x1f, 0x1d, 0x93, 0x26, 0x57, 0xde, 0x06, 0xf3, 0xf7, 0x4e, 0x2a, ++ 0x18, 0x8d, 0xf3, 0x6f, 0xaf, 0x39, 0x6a, 0xc3, 0x87, 0xa2, 0xdb, 0xe3, ++ 0x29, 0x0a, 0x06, 0x1c, 0xd1, 0x0f, 0xaf, 0x4b, 0x52, 0x5c, 0x6d, 0x83, ++ 0x6c, 0xec, 0x28, 0x83, 0xf5, 0x05, 0x44, 0xbe, 0x35, 0x80, 0x59, 0x19, ++ 0x49, 0xcb, 0x3b, 0xb0, 0xe0, 0x50, 0xc2, 0xb0, 0x0e, 0x0e, 0x57, 0x42, ++ 0xe1, 0xeb, 0x61, 0x05, 0xf0, 0x3c, 0xb7, 0x2e, 0x11, 0x4b, 0xf2, 0xf5, ++ 0x9a, 0x18, 0x77, 0xf5, 0xf9, 0x92, 0x21, 0xf4, 0x17, 0x95, 0xba, 0x33, ++ 0x14, 0x6f, 0xeb, 0xf4, 0x27, 0x17, 0x51, 0xdd, 0x01, 0x87, 0x35, 0xfe, ++ 0x6f, 0x34, 0x2b, 0x2f, 0x80, 0xf3, 0x8d, 0x4f, 0xf0, 0x4d, 0xf3, 0xa4, ++ 0x6f, 0x2f, 0xa2, 0x3c, 0xf2, 0x2a, 0x8d, 0xf6, 0xad, 0xdb, 0x35, 0xb4, ++ 0x00, 0xeb, 0xb1, 0xb5, 0x2e, 0xf6, 0x44, 0x86, 0xf8, 0xcd, 0x06, 0xc1, ++ 0xcf, 0xdb, 0x2a, 0x2f, 0x1c, 0x97, 0x51, 0x7d, 0x76, 0x38, 0xba, 0xbd, ++ 0x76, 0x7f, 0xd1, 0x82, 0xe7, 0x7d, 0x51, 0x3a, 0xe1, 0x68, 0x76, 0x0d, ++ 0x8d, 0xca, 0xb4, 0x7f, 0x9f, 0x76, 0xfe, 0x8b, 0xad, 0xfb, 0xf3, 0x9e, ++ 0xaf, 0x73, 0x84, 0xfc, 0x81, 0x2b, 0xdd, 0xf6, 0x7d, 0x08, 0x08, 0x79, ++ 0xde, 0x3c, 0xe5, 0xdb, 0x21, 0x3c, 0x17, 0xb7, 0xe0, 0xe9, 0x94, 0x60, ++ 0x1f, 0x6a, 0x3e, 0xff, 0x7d, 0x68, 0x9e, 0xc2, 0xe5, 0xf5, 0xe7, 0xbd, ++ 0xde, 0xff, 0x69, 0xe3, 0xfe, 0x4e, 0xe3, 0x71, 0x15, 0xe0, 0xd3, 0xd9, ++ 0xe5, 0x18, 0x67, 0x1c, 0x33, 0x39, 0x84, 0xf1, 0x5a, 0x9f, 0x15, 0x8f, ++ 0x0e, 0xc7, 0x29, 0x3f, 0x29, 0x80, 0xf1, 0x68, 0xea, 0x65, 0x90, 0x1e, ++ 0x52, 0x75, 0x3e, 0x86, 0xa2, 0xb2, 0x04, 0xf2, 0xa1, 0x9c, 0xfd, 0x61, ++ 0x02, 0xf7, 0x49, 0xa9, 0xd6, 0x0c, 0x85, 0xe4, 0x6c, 0xe6, 0x7d, 0x57, ++ 0xc2, 0x9b, 0x28, 0xaf, 0xcd, 0xc9, 0x9f, 0x16, 0xdc, 0xf4, 0x37, 0x59, ++ 0x98, 0x0e, 0x74, 0x7e, 0xe8, 0xb5, 0xe2, 0xd3, 0x86, 0x3a, 0x99, 0xdf, ++ 0x97, 0xc0, 0xf8, 0xaf, 0xc2, 0xac, 0xf3, 0x59, 0x1e, 0x9f, 0xb6, 0xfa, ++ 0xab, 0x15, 0x32, 0xc5, 0xa3, 0x29, 0x90, 0x9d, 0x36, 0x8e, 0x0a, 0x7a, ++ 0x18, 0xcf, 0x71, 0x14, 0x8c, 0x53, 0xe7, 0x0d, 0x9f, 0xff, 0xbb, 0x29, ++ 0x7a, 0xb4, 0xcf, 0x5f, 0xc4, 0xe3, 0xe3, 0x8a, 0xca, 0xfd, 0xc0, 0xf7, ++ 0x24, 0x8e, 0x8f, 0xd8, 0x6b, 0x0a, 0xe5, 0x7b, 0x76, 0xbd, 0xc0, 0xe5, ++ 0x1b, 0x3b, 0xce, 0x48, 0x7e, 0x77, 0xd5, 0x1a, 0x74, 0xae, 0xb2, 0x03, ++ 0xfe, 0x47, 0xff, 0x21, 0x56, 0xeb, 0x8b, 0x23, 0xdd, 0x2a, 0x8e, 0x7c, ++ 0xbc, 0xb3, 0x95, 0xd3, 0x43, 0x28, 0x47, 0xad, 0xb8, 0x38, 0xcd, 0xc7, ++ 0xcf, 0x07, 0x28, 0xce, 0x8d, 0x79, 0x8a, 0x14, 0x37, 0x37, 0x58, 0x05, ++ 0xbe, 0xef, 0x16, 0xa0, 0x59, 0xe3, 0xa8, 0x56, 0x5c, 0xbe, 0x72, 0xcd, ++ 0x24, 0x6c, 0xe7, 0x37, 0x98, 0xe7, 0x79, 0x58, 0x9f, 0xbf, 0x8e, 0x25, ++ 0x2e, 0x03, 0x78, 0x83, 0xee, 0xd6, 0xad, 0x57, 0x96, 0x66, 0x88, 0x87, ++ 0x57, 0xae, 0xf9, 0xc6, 0x53, 0x30, 0xef, 0xee, 0xa7, 0xa7, 0xff, 0xf2, ++ 0x29, 0xa8, 0xef, 0x92, 0xc3, 0xaf, 0xd5, 0x41, 0xbb, 0xfc, 0x3f, 0xad, ++ 0x23, 0xbc, 0x3a, 0xe3, 0xe1, 0xdb, 0x2a, 0x65, 0x53, 0x47, 0xf9, 0xe0, ++ 0xf3, 0x1d, 0xc2, 0x7d, 0x05, 0x1b, 0x9a, 0xe8, 0xe2, 0xf6, 0x1e, 0x29, ++ 0x86, 0xcf, 0xb3, 0x7d, 0xbe, 0x83, 0x7c, 0xbf, 0x5b, 0x43, 0x0a, 0xe2, ++ 0x05, 0xf4, 0x24, 0xe2, 0xc5, 0xeb, 0xcc, 0x8b, 0x4c, 0xc7, 0x77, 0x19, ++ 0xc2, 0xb1, 0x73, 0x60, 0x1e, 0xfc, 0xdb, 0xbb, 0x75, 0xde, 0x32, 0x9c, ++ 0x17, 0xe1, 0xc6, 0xfc, 0xca, 0x15, 0xbd, 0xf5, 0x1a, 0xea, 0x99, 0xe0, ++ 0x12, 0xfb, 0xf9, 0x85, 0xbf, 0xc9, 0x5e, 0xf7, 0x56, 0xd9, 0xe1, 0xdc, ++ 0x2a, 0xf6, 0xef, 0x62, 0xf4, 0xef, 0xcc, 0x43, 0xec, 0x31, 0xe7, 0x2d, ++ 0x42, 0xba, 0x3d, 0x1b, 0xd4, 0x18, 0xca, 0x9b, 0x8d, 0x6b, 0xaf, 0xbd, ++ 0x99, 0xe4, 0xfe, 0x76, 0x85, 0x8d, 0x2b, 0xcd, 0x40, 0xbf, 0x8e, 0x75, ++ 0x75, 0x6a, 0x2e, 0xd2, 0xff, 0xdd, 0x46, 0xfd, 0xde, 0x0a, 0xd4, 0x1b, ++ 0x0d, 0x1a, 0xe5, 0xf5, 0x74, 0xc7, 0xbd, 0x71, 0x4c, 0xf1, 0xde, 0x5e, ++ 0x97, 0x3a, 0x37, 0xb1, 0xd9, 0xef, 0x86, 0xc6, 0xcf, 0xb1, 0x6a, 0xe4, ++ 0x84, 0x3b, 0x93, 0x1d, 0x2f, 0xce, 0xc7, 0x02, 0xe2, 0x19, 0x73, 0x9c, ++ 0x83, 0x75, 0xcf, 0x96, 0xc9, 0xae, 0xe9, 0xee, 0xe1, 0xf3, 0x58, 0xe3, ++ 0x75, 0xd7, 0xbd, 0xed, 0x41, 0x39, 0x31, 0xd2, 0xb8, 0xcf, 0x8c, 0x31, ++ 0x8f, 0xb8, 0xd1, 0x9e, 0x8a, 0xe6, 0x5d, 0xd2, 0xbd, 0x8b, 0xfb, 0x37, ++ 0xba, 0x38, 0x5d, 0x4f, 0xd1, 0xe2, 0x52, 0x29, 0xda, 0xa3, 0xfa, 0xc2, ++ 0x45, 0x50, 0xdf, 0x3c, 0x4e, 0x26, 0x7b, 0x88, 0x09, 0xff, 0xaf, 0xfb, ++ 0x7a, 0x7e, 0x9e, 0xf8, 0x88, 0x66, 0xd8, 0xee, 0x57, 0x6c, 0x9a, 0xb2, ++ 0x92, 0xec, 0x86, 0x5b, 0xdc, 0xba, 0xe0, 0x2f, 0xb0, 0x0b, 0x27, 0xa4, ++ 0xee, 0x5b, 0x1c, 0xf0, 0x9a, 0x2f, 0xba, 0xe1, 0xb9, 0xfa, 0x3c, 0x8c, ++ 0x04, 0xf6, 0xc0, 0x7b, 0xb9, 0xe1, 0x9b, 0x91, 0x2e, 0x1a, 0x83, 0x1f, ++ 0x91, 0x1d, 0x75, 0x7b, 0x91, 0xac, 0x23, 0x7d, 0xad, 0xd8, 0xd3, 0x48, ++ 0xeb, 0xda, 0xac, 0xcb, 0x2c, 0x81, 0x76, 0xaf, 0xda, 0x4a, 0x46, 0x6a, ++ 0x13, 0x6b, 0x35, 0xf1, 0x3c, 0x00, 0x13, 0x35, 0x91, 0xee, 0xe6, 0xc0, ++ 0x1b, 0x99, 0xee, 0x45, 0x24, 0x0f, 0x75, 0x02, 0x9c, 0x73, 0xc6, 0x15, ++ 0x4e, 0xda, 0x06, 0x35, 0x77, 0x51, 0x2b, 0xe5, 0xb1, 0x34, 0x1a, 0x12, ++ 0xf9, 0x61, 0x37, 0x00, 0x66, 0x50, 0x1e, 0xb4, 0x14, 0x47, 0x54, 0xa9, ++ 0x0a, 0xfb, 0xcd, 0x7f, 0x17, 0xed, 0xbe, 0x39, 0xc1, 0x52, 0x19, 0xfd, ++ 0xfd, 0x1b, 0x54, 0xd6, 0xa0, 0xa5, 0xd9, 0xe7, 0x60, 0x17, 0x1f, 0x73, ++ 0xa7, 0xad, 0xeb, 0xe4, 0xb8, 0x3d, 0x41, 0xb9, 0x0a, 0xe7, 0x87, 0x79, ++ 0x70, 0xfe, 0x45, 0x1e, 0xba, 0x4f, 0xe0, 0x46, 0xfb, 0xf8, 0xea, 0x94, ++ 0x7d, 0x3c, 0x11, 0x11, 0x99, 0x66, 0x27, 0xff, 0x0a, 0x8d, 0x4a, 0x8c, ++ 0x67, 0x14, 0x25, 0x7e, 0x47, 0x79, 0xde, 0xdf, 0x4b, 0xca, 0x38, 0x2f, ++ 0x7b, 0x91, 0x55, 0x6f, 0x93, 0x3e, 0xb9, 0x5f, 0x0d, 0xfe, 0xe5, 0x2f, ++ 0x70, 0x3f, 0xe3, 0xcc, 0xe8, 0xc7, 0x54, 0xc3, 0xcf, 0x1a, 0x97, 0xf8, ++ 0xba, 0x26, 0xf6, 0x49, 0xdc, 0x5b, 0x39, 0xec, 0x89, 0xfc, 0x1a, 0xc7, ++ 0xb7, 0xe2, 0x01, 0x13, 0x35, 0x7e, 0xbf, 0x79, 0x73, 0x0b, 0x0b, 0xc7, ++ 0xd2, 0xe2, 0x2a, 0x9b, 0x5f, 0xf8, 0xb3, 0xe3, 0x68, 0xaf, 0x5a, 0xf1, ++ 0x97, 0xf3, 0x79, 0x77, 0x02, 0x4e, 0x0b, 0xee, 0x4d, 0x12, 0xcb, 0x22, ++ 0x3d, 0xef, 0x89, 0xfe, 0xde, 0x9d, 0xee, 0x17, 0xb3, 0x64, 0xd9, 0xdc, ++ 0x09, 0x9f, 0x1f, 0xdc, 0x19, 0xf2, 0xe5, 0x7c, 0xb5, 0xc0, 0x4f, 0x63, ++ 0x05, 0xff, 0xe4, 0xd5, 0x56, 0x78, 0x51, 0x6e, 0x8e, 0xc5, 0x7c, 0x1f, ++ 0xdc, 0x87, 0x76, 0x2e, 0x4f, 0x4c, 0xf8, 0x2f, 0x3d, 0xdf, 0x47, 0x11, ++ 0xcc, 0x17, 0x0c, 0xb7, 0xf6, 0xcb, 0xc6, 0x70, 0xb9, 0xa4, 0x88, 0x7b, ++ 0x53, 0x40, 0xd7, 0x12, 0xda, 0xb1, 0xce, 0x7c, 0x20, 0x05, 0xf3, 0x7e, ++ 0x26, 0x0e, 0x97, 0x1b, 0x07, 0x04, 0xfd, 0x5f, 0xe6, 0x11, 0xf9, 0x3f, ++ 0x93, 0xd9, 0x64, 0xee, 0x87, 0xdb, 0xcf, 0xaf, 0xfc, 0x4b, 0xb9, 0xde, ++ 0x67, 0xad, 0x79, 0x19, 0xef, 0xa1, 0x7e, 0x4f, 0xe8, 0xfd, 0x97, 0x84, ++ 0x5f, 0x99, 0x10, 0xf7, 0x1a, 0x8f, 0x8a, 0x7b, 0x8b, 0xaf, 0xac, 0x33, ++ 0xc8, 0xcf, 0x7b, 0x75, 0x5d, 0x25, 0x95, 0x03, 0xeb, 0xc2, 0xf4, 0xfc, ++ 0xf5, 0x75, 0x75, 0x54, 0xa6, 0xee, 0x57, 0xf1, 0x79, 0xf3, 0x85, 0x1d, ++ 0xa6, 0x62, 0x50, 0x0d, 0xcf, 0xf9, 0x7d, 0x2c, 0x6e, 0x00, 0xbc, 0xfe, ++ 0x51, 0x6b, 0x06, 0x4a, 0x91, 0xcf, 0xeb, 0xf8, 0xfd, 0xee, 0xee, 0xa6, ++ 0xd3, 0x5b, 0xca, 0xc9, 0x6e, 0xe4, 0xe7, 0x16, 0x9b, 0x8b, 0xaa, 0x13, ++ 0x85, 0xe8, 0xbf, 0x00, 0xac, 0xf9, 0x50, 0x77, 0xf9, 0xfa, 0x3c, 0xfc, ++ 0x9e, 0x97, 0x39, 0x58, 0x59, 0xc0, 0xd5, 0x1c, 0xe2, 0xfd, 0xbf, 0xfa, ++ 0xbc, 0xc2, 0x49, 0x17, 0xba, 0xb5, 0xff, 0x8e, 0xfd, 0xf6, 0xb1, 0x56, ++ 0x86, 0xf2, 0x2e, 0x60, 0xda, 0xf7, 0x3b, 0x3b, 0xec, 0xf4, 0x6f, 0xf8, ++ 0xfe, 0xbb, 0x8a, 0x2e, 0x6d, 0xdf, 0x7b, 0xf1, 0x1f, 0xb0, 0x8f, 0x5f, ++ 0xb2, 0xf6, 0xfd, 0x5a, 0x76, 0x2d, 0xff, 0x3e, 0xc3, 0xa5, 0xc9, 0x63, ++ 0xe4, 0xa3, 0x4a, 0x21, 0x07, 0xc6, 0x00, 0x3f, 0x1d, 0x00, 0x7f, 0xde, ++ 0xad, 0xf0, 0x7c, 0xf5, 0x7c, 0x9e, 0xe7, 0x6a, 0x86, 0x38, 0xbf, 0x99, ++ 0x2a, 0xaf, 0xc7, 0xc6, 0x8b, 0xf6, 0x2e, 0x4e, 0x42, 0x6c, 0x20, 0x8f, ++ 0xe7, 0xb5, 0x17, 0xf3, 0xf3, 0x04, 0xea, 0x87, 0x79, 0xe5, 0xf8, 0x1e, ++ 0xc3, 0x92, 0x2f, 0xf2, 0xf8, 0x16, 0xcb, 0x11, 0xf9, 0xef, 0x63, 0xc5, ++ 0x38, 0xab, 0xc5, 0xb8, 0x13, 0xab, 0xe9, 0xde, 0x2e, 0x3f, 0xff, 0x67, ++ 0x7d, 0x3a, 0x96, 0x3e, 0x96, 0xa4, 0x7a, 0x2e, 0xf0, 0x01, 0x96, 0x41, ++ 0xd6, 0x2a, 0x21, 0x32, 0xc7, 0xb0, 0x41, 0xf2, 0xb7, 0x8b, 0xa5, 0x21, ++ 0xaa, 0x1b, 0x92, 0x9e, 0x85, 0xf5, 0x32, 0x29, 0x5c, 0xc6, 0xfd, 0xf0, ++ 0x38, 0xe9, 0xcf, 0x72, 0xc5, 0xfc, 0x76, 0x05, 0x21, 0x3f, 0x22, 0xf3, ++ 0x78, 0x51, 0x72, 0x31, 0xd9, 0x93, 0xa0, 0x97, 0x51, 0x2e, 0xc6, 0xd5, ++ 0xc8, 0x22, 0x94, 0x2f, 0x1b, 0xda, 0xb4, 0x30, 0x60, 0xe2, 0x7c, 0x9e, ++ 0x1c, 0xde, 0x9f, 0xc3, 0x72, 0x43, 0x5f, 0xcd, 0x00, 0x9e, 0x7f, 0xc4, ++ 0x62, 0x32, 0xc9, 0x1f, 0xe5, 0x79, 0x96, 0xa5, 0x5f, 0x4d, 0xf6, 0x1e, ++ 0xe9, 0xaf, 0x0d, 0xeb, 0xf3, 0x0e, 0x66, 0x53, 0xbe, 0x46, 0x92, 0xf2, ++ 0xdc, 0xf7, 0x7b, 0x4a, 0x6d, 0x7a, 0x6a, 0xa2, 0x6f, 0xe1, 0x0d, 0x3a, ++ 0xec, 0xd7, 0x46, 0x91, 0x4f, 0xe7, 0x82, 0xfe, 0x2c, 0x43, 0xfe, 0xa9, ++ 0x95, 0x4f, 0x07, 0xe3, 0x96, 0x64, 0x7a, 0x6f, 0x95, 0x1b, 0xfd, 0xda, ++ 0xa2, 0x4c, 0x7e, 0xff, 0x23, 0x1e, 0x49, 0xc4, 0x33, 0x92, 0xa3, 0x29, ++ 0x0e, 0x28, 0xf6, 0x35, 0x3e, 0x55, 0xce, 0x78, 0x9f, 0x71, 0x9f, 0x87, ++ 0xdb, 0x35, 0x8f, 0x95, 0x66, 0xb6, 0xa7, 0x19, 0x7b, 0x88, 0xc6, 0xdb, ++ 0xef, 0xd1, 0x1d, 0xe3, 0x26, 0x5b, 0xe8, 0xfe, 0x8c, 0xce, 0xe3, 0x1b, ++ 0x59, 0x2e, 0x93, 0xf2, 0x6b, 0x36, 0xb6, 0xf1, 0x7b, 0xfa, 0x16, 0xfe, ++ 0x46, 0x83, 0x5d, 0x8b, 0xf6, 0xf0, 0xc6, 0xbe, 0xf9, 0xb3, 0x91, 0xbf, ++ 0x63, 0x95, 0x2a, 0xe5, 0x9b, 0xc3, 0xfa, 0x7d, 0x88, 0x3f, 0x97, 0xc8, ++ 0x4b, 0xde, 0x38, 0x3e, 0x78, 0x30, 0x9b, 0xc7, 0x25, 0x4a, 0x51, 0x4e, ++ 0xf7, 0x23, 0xfe, 0x6a, 0xd3, 0xf0, 0x17, 0x5c, 0xd9, 0x84, 0xf8, 0xeb, ++ 0x78, 0x8d, 0xe7, 0xf7, 0x82, 0x3e, 0xf7, 0xb1, 0x0c, 0xf9, 0x86, 0x16, ++ 0xfe, 0x5c, 0x3e, 0xf6, 0xc5, 0x4c, 0xef, 0xad, 0xb2, 0x63, 0x94, 0xb6, ++ 0x28, 0xd3, 0xbd, 0xe1, 0xa3, 0x1e, 0xcb, 0x4e, 0x4f, 0x96, 0x72, 0x3a, ++ 0xe1, 0xf8, 0xcb, 0xba, 0x5e, 0x8d, 0x64, 0x6a, 0x9f, 0x10, 0xf8, 0x2e, ++ 0x29, 0x63, 0xd1, 0x0b, 0xe1, 0xaf, 0xdf, 0xa3, 0xdb, 0xc6, 0xb5, 0xce, ++ 0x7d, 0x95, 0x11, 0xe2, 0x5d, 0x92, 0x2f, 0x41, 0x71, 0xae, 0x89, 0x1a, ++ 0xb7, 0x33, 0x36, 0x2c, 0xe6, 0x78, 0xdd, 0xf0, 0xc2, 0x75, 0xc7, 0xa3, ++ 0x69, 0xe7, 0x10, 0xbf, 0xc0, 0x21, 0xa7, 0xa4, 0xe2, 0xc1, 0x56, 0xdc, ++ 0xd8, 0xd2, 0x9b, 0xed, 0x9e, 0xe8, 0x3f, 0x7a, 0x46, 0xa5, 0xf4, 0x25, ++ 0xfb, 0x1e, 0x23, 0xb9, 0xcb, 0x5e, 0xf4, 0x1c, 0xc4, 0x7d, 0xcb, 0x70, ++ 0x0e, 0x71, 0xda, 0x53, 0x9b, 0xe1, 0x1c, 0xa2, 0xe7, 0xd2, 0xbe, 0xef, ++ 0x32, 0x56, 0xf0, 0xed, 0xa1, 0x2d, 0x47, 0xe7, 0xe1, 0x3c, 0x7f, 0x59, ++ 0xc7, 0xc8, 0xbe, 0x0a, 0x3c, 0xcb, 0xe7, 0xcd, 0xd5, 0x59, 0x5c, 0x2e, ++ 0xc5, 0xef, 0x14, 0x98, 0x12, 0xc6, 0x59, 0xae, 0x8b, 0xe8, 0xf5, 0x68, ++ 0xbf, 0xb9, 0xda, 0x99, 0x89, 0xf9, 0x33, 0x63, 0x45, 0xdc, 0xa6, 0xb0, ++ 0xbd, 0x4f, 0x41, 0xba, 0x08, 0xc2, 0x5e, 0x16, 0x4a, 0x78, 0xaf, 0x29, ++ 0x19, 0xc3, 0xef, 0x99, 0x8c, 0xdd, 0xcd, 0xc8, 0x4f, 0x54, 0x0b, 0x67, ++ 0xae, 0x5a, 0x6f, 0x08, 0x51, 0x9a, 0x96, 0x1f, 0xa5, 0xb0, 0xa1, 0x7e, ++ 0x5a, 0x5f, 0xbb, 0x66, 0x3c, 0x51, 0x4a, 0x60, 0xfd, 0x04, 0xf5, 0xc3, ++ 0x18, 0xf1, 0x3e, 0xd0, 0x3e, 0xf3, 0x97, 0x28, 0x37, 0xc7, 0x44, 0xa2, ++ 0x94, 0x87, 0x0b, 0xfd, 0x62, 0x7e, 0xb4, 0x2f, 0x04, 0x1e, 0x0b, 0xbc, ++ 0x9c, 0x6f, 0x97, 0x37, 0x84, 0x25, 0x09, 0xda, 0x07, 0x83, 0x49, 0x8a, ++ 0x4f, 0x3a, 0xe5, 0xfa, 0x18, 0xc0, 0xcf, 0x65, 0x69, 0xf6, 0x5b, 0x40, ++ 0xd4, 0xd9, 0x2a, 0x2e, 0xa7, 0x65, 0xf8, 0x0f, 0xf5, 0x7c, 0x7e, 0xc4, ++ 0x2e, 0xb7, 0xc7, 0x39, 0xee, 0x45, 0x07, 0x1c, 0x79, 0x2f, 0xb9, 0x5e, ++ 0x91, 0xef, 0x6e, 0xc9, 0xed, 0x22, 0xbe, 0xa9, 0x13, 0xd4, 0x41, 0x39, ++ 0x93, 0x5f, 0x9e, 0xd2, 0xaf, 0x0e, 0xf8, 0x50, 0x86, 0x55, 0xa7, 0xfa, ++ 0x07, 0xac, 0xfa, 0x67, 0x84, 0x0f, 0x08, 0x81, 0xe8, 0xd9, 0x82, 0x07, ++ 0xaf, 0x52, 0xa2, 0xdc, 0xdd, 0xe3, 0xd2, 0xbf, 0xfc, 0x34, 0xea, 0xe7, ++ 0x7a, 0x8d, 0xe7, 0x91, 0x89, 0xfb, 0x72, 0xd9, 0x02, 0xef, 0x3e, 0x74, ++ 0x98, 0xa1, 0xdd, 0xc0, 0x94, 0x57, 0x4d, 0xdc, 0xd7, 0x1d, 0x61, 0xfe, ++ 0x5d, 0x9a, 0xb3, 0x53, 0xe7, 0x91, 0x1f, 0x9a, 0x5d, 0x67, 0xdd, 0xa7, ++ 0xe3, 0xf7, 0x95, 0xa1, 0x8c, 0x61, 0x9c, 0x2e, 0x5b, 0xcc, 0x6f, 0xdd, ++ 0xab, 0xcb, 0x66, 0xc6, 0x5b, 0xe5, 0x40, 0x0f, 0xd9, 0x66, 0x92, 0xee, ++ 0xd5, 0xe9, 0xd6, 0x77, 0x15, 0x4c, 0x96, 0xc0, 0x3c, 0x1c, 0xdd, 0x27, ++ 0x53, 0x1e, 0x9d, 0xee, 0x8b, 0x90, 0x7c, 0xea, 0x59, 0xe0, 0xd1, 0xf1, ++ 0x3b, 0x1f, 0x9a, 0xb8, 0xa7, 0xe7, 0x12, 0xf7, 0xc7, 0xb3, 0xcd, 0x33, ++ 0x74, 0xbf, 0x2e, 0x7b, 0xd8, 0xfa, 0xf8, 0xfd, 0x3a, 0x0b, 0xee, 0xec, ++ 0xac, 0xaa, 0xb7, 0xca, 0x0d, 0xdb, 0x3c, 0xeb, 0x31, 0xbe, 0x0d, 0x6b, ++ 0x1f, 0x9d, 0xf1, 0x7e, 0x5d, 0x1d, 0xf7, 0x93, 0xb2, 0x4d, 0x1e, 0x87, ++ 0x48, 0x1b, 0x9f, 0xee, 0xd7, 0xed, 0x98, 0x5a, 0x66, 0xbb, 0x5f, 0x47, ++ 0xf3, 0xa0, 0x1f, 0x27, 0xe8, 0xcf, 0xba, 0x67, 0xe7, 0x84, 0xeb, 0x7c, ++ 0xbf, 0x9a, 0xcc, 0x76, 0xda, 0x84, 0xb0, 0xdd, 0x8e, 0xb8, 0xd8, 0xfd, ++ 0x3a, 0x57, 0xc8, 0xde, 0x7e, 0xc7, 0x45, 0xf2, 0xb3, 0x3e, 0xf1, 0xfd, ++ 0x3a, 0x81, 0x87, 0x61, 0xed, 0x1c, 0xf6, 0xa0, 0xcb, 0xb2, 0x43, 0x47, ++ 0xc9, 0x0c, 0xf7, 0xef, 0x6c, 0x83, 0x4c, 0xdf, 0x11, 0xc9, 0xfd, 0x28, ++ 0x19, 0x99, 0x21, 0x51, 0x5c, 0x82, 0xf4, 0xbd, 0x65, 0xe7, 0xe5, 0xf1, ++ 0xa1, 0xfe, 0xdb, 0xd9, 0x79, 0x79, 0x56, 0x5e, 0xbf, 0xc3, 0xce, 0xb3, ++ 0xec, 0xb7, 0xdc, 0xd9, 0x76, 0x7c, 0x3b, 0xed, 0x3e, 0x77, 0x55, 0x84, ++ 0xfa, 0x5c, 0xaa, 0x9d, 0xb7, 0x0b, 0xff, 0x01, 0xf4, 0xf2, 0xb0, 0xd7, ++ 0x61, 0xe7, 0x35, 0x65, 0xa6, 0x0f, 0xa7, 0xbc, 0xc8, 0x67, 0x83, 0xbb, ++ 0xaf, 0x86, 0x71, 0x8e, 0xd6, 0xfe, 0x50, 0xc1, 0x7c, 0xb5, 0x5d, 0xb9, ++ 0xfc, 0xfb, 0x47, 0x6c, 0x98, 0x7f, 0xf0, 0xf6, 0x0c, 0xda, 0x17, 0x1f, ++ 0xff, 0xde, 0xd1, 0xae, 0x29, 0xfd, 0x2a, 0x7e, 0xff, 0xe6, 0xb7, 0x4b, ++ 0x19, 0xd9, 0x49, 0x56, 0x1c, 0xc1, 0x2d, 0x60, 0xde, 0x55, 0x24, 0xaf, ++ 0xa7, 0xb0, 0x7b, 0xd7, 0xc3, 0x84, 0x9f, 0xa0, 0xc0, 0x43, 0x13, 0x7e, ++ 0x80, 0xac, 0x86, 0x70, 0x15, 0x1f, 0x47, 0x7c, 0x66, 0x7a, 0x31, 0x6f, ++ 0x21, 0xbf, 0x89, 0x51, 0xa3, 0xc2, 0x8a, 0x30, 0xed, 0x3b, 0x7e, 0x96, ++ 0x40, 0xa6, 0x4b, 0x5b, 0x31, 0x15, 0xf5, 0x78, 0x3d, 0x62, 0x25, 0x0d, ++ 0x4f, 0x33, 0x3c, 0xf6, 0xef, 0x04, 0x34, 0xea, 0xf9, 0x8e, 0x7d, 0xb4, ++ 0xef, 0xf3, 0xf9, 0x73, 0xf0, 0x87, 0xf8, 0xf7, 0x14, 0xe6, 0x18, 0xf6, ++ 0x7d, 0xb7, 0xfc, 0x24, 0x34, 0x67, 0x71, 0xbe, 0x1b, 0x2b, 0xed, 0x74, ++ 0x70, 0x52, 0x8a, 0x0c, 0x2a, 0xd0, 0xe5, 0x99, 0xac, 0x52, 0x61, 0xff, ++ 0x0c, 0xea, 0xa8, 0x2f, 0xbb, 0xd7, 0xba, 0xc8, 0x6e, 0x7c, 0x78, 0x49, ++ 0xd9, 0xd6, 0xab, 0xd1, 0x5f, 0x0d, 0xca, 0x3a, 0x3f, 0x8e, 0x1c, 0x1a, ++ 0x87, 0xf6, 0x51, 0xf3, 0x51, 0xd3, 0x8b, 0x76, 0xde, 0xf6, 0xc8, 0x74, ++ 0xef, 0x38, 0x78, 0xff, 0x70, 0x87, 0x12, 0x46, 0xf3, 0xf0, 0xe9, 0x25, ++ 0x6b, 0x5e, 0xc3, 0x7a, 0x6c, 0xb7, 0x8b, 0xec, 0xa0, 0xa7, 0xfb, 0xe6, ++ 0x15, 0xac, 0x48, 0xe3, 0xbb, 0xcd, 0xbb, 0x17, 0x2c, 0x5c, 0x8c, 0xef, ++ 0x3b, 0x5c, 0xa4, 0xdf, 0x57, 0xec, 0xb9, 0x7f, 0xa0, 0x34, 0x88, 0xfd, ++ 0x5d, 0xb5, 0xe9, 0xdf, 0x9b, 0x6a, 0xd9, 0x78, 0xbf, 0x8e, 0x7e, 0xdb, ++ 0x9b, 0xb5, 0xde, 0x8c, 0x76, 0xcc, 0xb5, 0x59, 0xdc, 0x2e, 0xd9, 0xa8, ++ 0x25, 0x29, 0xfe, 0xb4, 0x71, 0x9e, 0xc6, 0xd0, 0xe5, 0xda, 0x58, 0x52, ++ 0x3f, 0x7a, 0x05, 0xda, 0x0f, 0xd7, 0x69, 0x19, 0xef, 0x93, 0xdf, 0x93, ++ 0xe5, 0xe6, 0xf7, 0xf9, 0x5c, 0xad, 0x12, 0xca, 0xf7, 0xc2, 0x68, 0xe6, ++ 0x7b, 0x01, 0x56, 0xbb, 0xb1, 0x35, 0xbf, 0xa1, 0x73, 0x8c, 0xe0, 0x6c, ++ 0x99, 0xa1, 0x1f, 0xe7, 0xba, 0x71, 0x9e, 0x8c, 0xf5, 0x87, 0x61, 0x5f, ++ 0x75, 0x29, 0x45, 0x4f, 0x79, 0x82, 0x9e, 0x36, 0x16, 0x7d, 0x75, 0x6b, ++ 0x05, 0xae, 0x6f, 0x20, 0xf3, 0xbd, 0x43, 0xab, 0x5c, 0x9b, 0x35, 0x8e, ++ 0xd3, 0x69, 0xc4, 0xce, 0xe7, 0xae, 0xc2, 0xa6, 0xd1, 0xb8, 0x6e, 0x97, ++ 0x3b, 0x32, 0x50, 0x8f, 0xc4, 0x55, 0x28, 0xeb, 0x18, 0x17, 0x71, 0xb9, ++ 0x5b, 0x23, 0xb7, 0xa2, 0x3d, 0x7a, 0xad, 0x0b, 0x29, 0x9c, 0x6d, 0xee, ++ 0xf8, 0x41, 0xc3, 0x22, 0xdc, 0x97, 0xb0, 0xa4, 0x4b, 0x30, 0x4f, 0x50, ++ 0x8d, 0xac, 0x22, 0x3a, 0x0b, 0x66, 0x31, 0xd4, 0x07, 0x0d, 0x4b, 0x22, ++ 0xad, 0x88, 0x97, 0x42, 0xd0, 0x7f, 0x18, 0xda, 0x2b, 0x2c, 0xfa, 0x05, ++ 0x9d, 0x53, 0x14, 0xd6, 0x69, 0xcc, 0x0b, 0x75, 0xcf, 0x92, 0x9e, 0x84, ++ 0x0b, 0xde, 0x7b, 0x2a, 0xa2, 0xd7, 0x20, 0xde, 0x5f, 0x5e, 0xcb, 0xbf, ++ 0xf3, 0x52, 0x18, 0xf4, 0xd1, 0xbd, 0xa0, 0xc2, 0x08, 0x3f, 0x87, 0x2b, ++ 0x6c, 0x77, 0x33, 0x34, 0x19, 0x36, 0x82, 0x0b, 0xec, 0x22, 0xff, 0x40, ++ 0xa2, 0x38, 0x91, 0x93, 0x8f, 0xac, 0x75, 0x35, 0x2f, 0xe5, 0x72, 0x7c, ++ 0xf7, 0xda, 0xdf, 0x8c, 0xca, 0xf4, 0xbd, 0x99, 0x8a, 0xac, 0x32, 0xc2, ++ 0xab, 0xd7, 0xb0, 0xaf, 0xdb, 0x83, 0x7a, 0x17, 0xc6, 0x99, 0x6a, 0x0e, ++ 0x2e, 0x21, 0x7c, 0xd7, 0xb8, 0x59, 0x9c, 0xf8, 0xd7, 0x4d, 0xf4, 0xbd, ++ 0xab, 0xd6, 0x45, 0x70, 0xed, 0x9a, 0x72, 0xea, 0xcb, 0x08, 0xd7, 0x6f, ++ 0x7f, 0x97, 0x45, 0xfb, 0x7d, 0x3d, 0x33, 0x25, 0x84, 0x2b, 0x7f, 0x88, ++ 0x9f, 0xb3, 0x5a, 0xf3, 0xe4, 0x37, 0x0d, 0x2a, 0x3c, 0x1e, 0xce, 0xf9, ++ 0xd0, 0xc9, 0x77, 0x16, 0x3f, 0x38, 0xe1, 0xdb, 0x39, 0x7b, 0x1e, 0x9d, ++ 0xc7, 0x6d, 0x66, 0x83, 0xf3, 0x11, 0xdf, 0xb1, 0x73, 0x32, 0xd1, 0xd1, ++ 0xe6, 0xa2, 0x35, 0xde, 0xf4, 0xb8, 0x68, 0xab, 0xa0, 0x3f, 0xd8, 0x07, ++ 0x92, 0x2f, 0x31, 0x9d, 0xd1, 0x7e, 0x2b, 0xff, 0xca, 0xd6, 0x63, 0x3e, ++ 0xec, 0xc6, 0x2f, 0x46, 0x2a, 0x91, 0x3f, 0xde, 0xf1, 0xf2, 0x7b, 0xab, ++ 0xf7, 0x2f, 0xd5, 0x68, 0x1d, 0x0f, 0xcf, 0xd5, 0x28, 0xde, 0xf8, 0xb0, ++ 0xbf, 0x95, 0xe8, 0xfe, 0xf4, 0x46, 0x57, 0xf8, 0x10, 0x82, 0xa3, 0xea, ++ 0x0b, 0x71, 0x3f, 0x77, 0x17, 0x57, 0x84, 0x31, 0xde, 0xf6, 0x77, 0x78, ++ 0xf8, 0x9c, 0xe6, 0x1f, 0xec, 0x1e, 0xf5, 0xa5, 0x4a, 0xc4, 0xe7, 0x17, ++ 0x7f, 0x9f, 0xc5, 0xc7, 0x99, 0xa2, 0x5a, 0xe3, 0xfc, 0x94, 0xe8, 0xbd, ++ 0xd6, 0x4b, 0x70, 0xce, 0x50, 0xda, 0x7f, 0xba, 0x02, 0xed, 0xd0, 0x25, ++ 0xf2, 0x64, 0xca, 0x9d, 0x5e, 0xb5, 0x84, 0xe4, 0x97, 0x4b, 0xc8, 0xf1, ++ 0x57, 0x96, 0xe4, 0xd5, 0xa3, 0x9f, 0x12, 0xb8, 0x69, 0x39, 0xe3, 0xf2, ++ 0x90, 0xc7, 0x29, 0x02, 0x6b, 0xab, 0xf9, 0x7d, 0x06, 0x87, 0xdc, 0x4f, ++ 0xd4, 0xa9, 0xbb, 0x67, 0xd0, 0x2e, 0xf1, 0xf8, 0x4f, 0xbd, 0x90, 0x77, ++ 0x63, 0x6f, 0x9a, 0x5e, 0x8f, 0xeb, 0xac, 0x17, 0x7a, 0xc1, 0x54, 0x33, ++ 0x7f, 0x97, 0x31, 0x57, 0xb4, 0x2f, 0x1c, 0x8a, 0xa0, 0x49, 0x36, 0x2c, ++ 0xfe, 0x93, 0x2b, 0xf4, 0xc7, 0xd8, 0xdd, 0x8e, 0xe7, 0x42, 0x2f, 0xe4, ++ 0x0e, 0x8b, 0x83, 0x0f, 0x56, 0xdc, 0x0a, 0xf2, 0xe7, 0x4b, 0x59, 0xc2, ++ 0x8e, 0x1c, 0x21, 0xee, 0xb3, 0x6b, 0xc9, 0x3c, 0xe2, 0x87, 0xb3, 0xc0, ++ 0x0f, 0x14, 0x97, 0x2e, 0x39, 0x45, 0xf4, 0x1f, 0x03, 0x39, 0x81, 0x76, ++ 0xf3, 0x9b, 0x52, 0x32, 0xb4, 0x22, 0xed, 0x3c, 0xcc, 0xfa, 0xce, 0xdc, ++ 0x8f, 0x45, 0x3c, 0x28, 0x62, 0x96, 0x52, 0x9e, 0xf0, 0xdb, 0x22, 0x1e, ++ 0xf4, 0x13, 0xf1, 0xdd, 0xb9, 0x77, 0x45, 0x3c, 0xe8, 0xb8, 0x88, 0x07, ++ 0xfd, 0x4c, 0xc4, 0x83, 0xfe, 0x01, 0xe3, 0x41, 0xf8, 0xfd, 0x30, 0xef, ++ 0x95, 0xb4, 0x6f, 0xe3, 0xea, 0x3e, 0xea, 0xc7, 0x38, 0xce, 0xce, 0x9a, ++ 0x05, 0x1e, 0x03, 0xc6, 0x99, 0xaa, 0x0f, 0xbe, 0x8c, 0x40, 0x7e, 0xd1, ++ 0x1c, 0xf4, 0x89, 0xfc, 0x7b, 0x82, 0x37, 0x68, 0xe9, 0xa1, 0xb9, 0x17, ++ 0x8e, 0x53, 0x25, 0x10, 0x2e, 0x37, 0xc6, 0xa5, 0x38, 0x9c, 0xaf, 0x88, ++ 0xef, 0xd1, 0xbd, 0x2a, 0xe0, 0x1a, 0x10, 0x70, 0xbd, 0x2e, 0xe0, 0xb2, ++ 0xf4, 0x20, 0xca, 0x0d, 0xa4, 0x33, 0x36, 0x56, 0xd5, 0x33, 0xc9, 0xc3, ++ 0xa0, 0xda, 0x2a, 0xe1, 0x79, 0x2f, 0xca, 0x8b, 0xfe, 0x20, 0xc9, 0x0b, ++ 0x9e, 0x27, 0x1e, 0x5c, 0x23, 0x19, 0x13, 0x86, 0xcb, 0x09, 0x18, 0x6f, ++ 0x74, 0xba, 0x9d, 0x6e, 0xd1, 0xdf, 0xe9, 0x51, 0x3e, 0xa2, 0x63, 0xe7, ++ 0xf8, 0x8f, 0x65, 0xf1, 0x7b, 0x87, 0x2f, 0xaf, 0x9d, 0xb5, 0x9f, 0x05, ++ 0xd3, 0xe4, 0x51, 0x64, 0xe1, 0x2a, 0xa4, 0xbb, 0x7c, 0xd8, 0x1f, 0x94, ++ 0x47, 0xd1, 0x26, 0x2e, 0xc7, 0xa3, 0x78, 0xef, 0x22, 0x4d, 0xae, 0x5a, ++ 0xf1, 0x34, 0xd8, 0x91, 0x30, 0xe9, 0x9d, 0x9b, 0x38, 0x9e, 0x46, 0x92, ++ 0x2f, 0x17, 0x93, 0x2b, 0x85, 0x0e, 0xb9, 0xb2, 0x1b, 0xe5, 0x0a, 0xd4, ++ 0x77, 0xa3, 0x5c, 0x09, 0xa6, 0xcb, 0x95, 0xd6, 0x7e, 0x5c, 0x77, 0x10, ++ 0xe5, 0x0a, 0x4b, 0xe9, 0xa1, 0x60, 0xe4, 0x93, 0xc9, 0x95, 0x9f, 0x7a, ++ 0xcb, 0x6c, 0x71, 0x12, 0x4b, 0xbe, 0x5c, 0x0b, 0x6c, 0x4c, 0x76, 0x62, ++ 0x18, 0xf4, 0xa9, 0xff, 0xd3, 0xeb, 0xd3, 0x77, 0x84, 0x9c, 0xb8, 0x98, ++ 0x5e, 0xb5, 0xf2, 0x3f, 0x02, 0x26, 0x23, 0xbd, 0xbe, 0x07, 0xf3, 0x42, ++ 0xd0, 0x9f, 0x19, 0xcf, 0xe8, 0x1e, 0x8e, 0x62, 0x0e, 0x52, 0x3e, 0x51, ++ 0x6e, 0xbb, 0x8b, 0x61, 0x3e, 0xc8, 0x56, 0xec, 0x32, 0x1a, 0xfd, 0x99, ++ 0x85, 0x94, 0x0f, 0xb2, 0x63, 0xbe, 0x47, 0x47, 0xba, 0x78, 0x44, 0x4a, ++ 0x84, 0x10, 0x9f, 0xfb, 0xa4, 0x1e, 0x2f, 0xdf, 0x17, 0xbd, 0x1f, 0xed, ++ 0x85, 0x6d, 0x13, 0x78, 0x9c, 0x64, 0xc7, 0x1f, 0xee, 0xf3, 0xa2, 0x9d, ++ 0xfd, 0xf2, 0x9d, 0x05, 0x01, 0x3c, 0xc7, 0xe9, 0xcd, 0xb5, 0xf2, 0x40, ++ 0xf4, 0xc5, 0xb7, 0x43, 0xfd, 0x74, 0x23, 0x23, 0x3a, 0x59, 0xb1, 0x67, ++ 0x85, 0x2d, 0xef, 0xe1, 0x67, 0x59, 0x79, 0x84, 0x8f, 0xdc, 0x18, 0xc8, ++ 0x1f, 0xc0, 0xc7, 0x23, 0x77, 0x72, 0xfd, 0xa3, 0x1b, 0x3c, 0x0f, 0x04, ++ 0xca, 0x8c, 0x79, 0x20, 0x6e, 0x9f, 0x88, 0x07, 0xa9, 0xb1, 0x10, 0xd2, ++ 0xc7, 0x36, 0x29, 0xea, 0xa1, 0x38, 0x4c, 0xa3, 0x4c, 0x7a, 0xaa, 0x37, ++ 0xcc, 0xf3, 0x57, 0x7a, 0xc1, 0x2f, 0xc7, 0xf3, 0xc1, 0xde, 0x86, 0x9d, ++ 0x73, 0x50, 0x3f, 0x6f, 0xb8, 0x5d, 0x66, 0x94, 0x2f, 0x5e, 0xd9, 0x73, ++ 0x1f, 0xca, 0x99, 0x8e, 0x09, 0x0b, 0x0d, 0xe4, 0x4b, 0xd7, 0xe8, 0xb2, ++ 0xb7, 0xd0, 0x1c, 0xdf, 0xe0, 0x93, 0xbd, 0xe9, 0x79, 0xa4, 0x78, 0x9c, ++ 0xa0, 0x55, 0xf3, 0x73, 0x43, 0x51, 0x9a, 0x39, 0x00, 0xf2, 0x66, 0xaf, ++ 0x69, 0x5c, 0xe8, 0xfe, 0xa8, 0x2a, 0xfc, 0x3e, 0xec, 0xef, 0xbe, 0x40, ++ 0x1e, 0x7c, 0x67, 0x6e, 0x68, 0x34, 0xc6, 0x09, 0x7a, 0x1b, 0x17, 0x86, ++ 0x70, 0xde, 0xde, 0x51, 0x91, 0x50, 0x1e, 0xe5, 0xa7, 0x8c, 0x21, 0x7b, ++ 0x60, 0xe3, 0xa8, 0x4d, 0x8b, 0x31, 0xfe, 0xd4, 0xb1, 0x5c, 0x63, 0xe9, ++ 0x76, 0xd2, 0xb0, 0xf9, 0x82, 0x76, 0xfb, 0xda, 0x8a, 0x33, 0xaa, 0x0d, ++ 0x3c, 0x7f, 0xa4, 0x43, 0xe6, 0xfe, 0x65, 0xae, 0x38, 0x9f, 0x06, 0xbe, ++ 0xaa, 0x44, 0xbc, 0xa5, 0xaf, 0x13, 0xe1, 0x54, 0x4d, 0x9e, 0x3f, 0x82, ++ 0xeb, 0x55, 0xf8, 0x7a, 0xe9, 0xfb, 0xa6, 0xb9, 0x0d, 0xe0, 0x1f, 0x56, ++ 0xf1, 0xf5, 0xa3, 0xff, 0xaa, 0xfb, 0xf4, 0xd1, 0x28, 0x3f, 0xd4, 0x06, ++ 0x9e, 0x3f, 0xb2, 0xd9, 0xaf, 0x2f, 0x46, 0xbf, 0xd1, 0x09, 0x87, 0x35, ++ 0xfe, 0xf5, 0xd9, 0x92, 0xcd, 0x3f, 0xd2, 0xad, 0xbc, 0x85, 0xfa, 0x35, ++ 0xfc, 0x1c, 0xb1, 0x88, 0xe7, 0x2d, 0xf4, 0xba, 0x2e, 0x9c, 0xb7, 0xd0, ++ 0x21, 0xe4, 0xa1, 0xe5, 0x37, 0x8e, 0x84, 0x0f, 0x97, 0xe3, 0x9c, 0xba, ++ 0xd7, 0x6b, 0x8f, 0x03, 0x5a, 0xf0, 0x5c, 0x2d, 0x4a, 0x27, 0x1c, 0x23, ++ 0xe5, 0x0b, 0x7c, 0xda, 0xf9, 0x2f, 0xb6, 0xee, 0xcf, 0x7b, 0xbe, 0x91, ++ 0xf2, 0x08, 0xd6, 0x64, 0x4b, 0xb6, 0xfb, 0x15, 0xb9, 0x56, 0x3e, 0x4b, ++ 0xe3, 0x9a, 0x10, 0xca, 0x09, 0x0b, 0x9e, 0xcd, 0x17, 0xc9, 0x1f, 0xf9, ++ 0xb4, 0x70, 0x35, 0x37, 0xf2, 0xf6, 0x9f, 0xf7, 0x7a, 0xff, 0xa7, 0x8d, ++ 0x5b, 0x9f, 0xcd, 0xf5, 0x23, 0xf0, 0xe9, 0x00, 0xde, 0xa3, 0xec, 0x98, ++ 0x38, 0x33, 0x84, 0x72, 0x28, 0x15, 0x8f, 0x19, 0x1a, 0x28, 0x47, 0x7b, ++ 0x4e, 0xdc, 0x67, 0xb4, 0xf2, 0x47, 0x5c, 0x3a, 0xff, 0xa7, 0xaa, 0xf2, ++ 0xef, 0xdc, 0xc9, 0xd9, 0x45, 0xf4, 0x9d, 0x65, 0x75, 0x3a, 0xcf, 0x1f, ++ 0xa1, 0xbf, 0x0c, 0x79, 0x20, 0x9b, 0x18, 0x9b, 0x8d, 0xfe, 0x8e, 0x2a, ++ 0xe2, 0x37, 0x4e, 0x3e, 0xbd, 0x18, 0xfc, 0xce, 0xbc, 0x91, 0x5b, 0x7d, ++ 0xc2, 0x6f, 0x8c, 0x3a, 0xe6, 0x13, 0x79, 0x22, 0xcc, 0x91, 0x77, 0xa2, ++ 0x86, 0x78, 0x7e, 0x89, 0x95, 0x4f, 0xd2, 0x25, 0xc1, 0xfa, 0x82, 0xa9, ++ 0x7c, 0x90, 0x11, 0xe7, 0x75, 0xe0, 0x6d, 0xbc, 0x90, 0xfb, 0xef, 0x39, ++ 0xfa, 0x0f, 0x5b, 0x77, 0x98, 0xdf, 0xaf, 0xb4, 0xf2, 0x4f, 0x86, 0xe5, ++ 0x91, 0x4c, 0x95, 0xf7, 0xe3, 0x16, 0x0c, 0xcb, 0x23, 0x11, 0xf9, 0x28, ++ 0x3d, 0xb9, 0x46, 0x9c, 0xe7, 0x89, 0xf3, 0xbc, 0x12, 0x54, 0x9b, 0x18, ++ 0xcf, 0x1b, 0x96, 0x47, 0x32, 0x75, 0x7a, 0x08, 0xbf, 0x29, 0x39, 0xad, ++ 0x44, 0xf4, 0xbb, 0x89, 0xd1, 0xf7, 0x77, 0x7b, 0xbc, 0xbc, 0xde, 0x3b, ++ 0x87, 0xc5, 0xf1, 0x7b, 0x67, 0xbd, 0x58, 0x47, 0x7e, 0xaa, 0x65, 0x94, ++ 0xd7, 0x32, 0x2c, 0xbf, 0x64, 0xea, 0x1a, 0xc2, 0x93, 0xc6, 0x22, 0xcb, ++ 0xf8, 0xf9, 0x0e, 0x3f, 0xef, 0xb7, 0xf0, 0xe0, 0xcc, 0x2f, 0xb9, 0x28, ++ 0xbd, 0x5d, 0x24, 0x8f, 0x24, 0xe8, 0xb3, 0xbe, 0x47, 0x11, 0xa1, 0x79, ++ 0x7a, 0xfc, 0xe1, 0x1f, 0xd7, 0x11, 0x7c, 0x32, 0x9d, 0xc7, 0x17, 0x7c, ++ 0xe9, 0x78, 0x38, 0x7d, 0xfc, 0xcb, 0x7c, 0x5c, 0x4e, 0xf6, 0x88, 0x3c, ++ 0xbc, 0x9e, 0x5c, 0x7b, 0x3e, 0xde, 0xfd, 0x62, 0x5f, 0x2a, 0x44, 0x3b, ++ 0xe7, 0xfe, 0xea, 0x45, 0x9c, 0xae, 0xbb, 0xea, 0x75, 0x8a, 0xbb, 0xbb, ++ 0x1b, 0x78, 0xbc, 0x72, 0xd8, 0x77, 0x20, 0x6a, 0xec, 0xfe, 0x80, 0x33, ++ 0x9e, 0x77, 0x52, 0xc8, 0xeb, 0x8b, 0xad, 0xdf, 0x19, 0xd7, 0xdb, 0x36, ++ 0xc2, 0x7d, 0xb3, 0x05, 0x3e, 0x9e, 0xc7, 0xf5, 0xf0, 0x92, 0x43, 0x94, ++ 0x17, 0x7b, 0x76, 0x15, 0xe8, 0x59, 0xc0, 0xd7, 0x23, 0x98, 0xcf, 0x52, ++ 0x73, 0xe9, 0xf9, 0x2c, 0x6f, 0x64, 0xf1, 0x7c, 0x96, 0x5e, 0xa3, 0x7e, ++ 0xe1, 0xe5, 0xa8, 0xc7, 0xa2, 0x1a, 0x43, 0x79, 0xda, 0x8b, 0xf9, 0x2c, ++ 0xf0, 0x7e, 0x43, 0xc3, 0x08, 0xf9, 0x2c, 0x22, 0x9e, 0x68, 0xc5, 0x47, ++ 0x47, 0xca, 0x67, 0xc9, 0x3d, 0x7f, 0x1e, 0x6f, 0xcf, 0x67, 0xe9, 0xbd, ++ 0x9d, 0xe7, 0xb3, 0xf4, 0xf6, 0xf0, 0x79, 0xac, 0xf1, 0x7a, 0x1b, 0xaa, ++ 0xc9, 0xce, 0x1a, 0x69, 0xdc, 0x67, 0xc6, 0x98, 0xb2, 0x0f, 0xf7, 0xbf, ++ 0xe2, 0xd2, 0xce, 0x4f, 0xa7, 0x95, 0x44, 0xfe, 0x04, 0xf3, 0x57, 0x7a, ++ 0x4a, 0x35, 0xfd, 0x21, 0x03, 0xe9, 0x85, 0xd3, 0x73, 0x57, 0xa3, 0x46, ++ 0xf4, 0xdd, 0xe5, 0xe2, 0x7e, 0x6c, 0x6c, 0x34, 0xf7, 0x9b, 0x99, 0x1a, ++ 0x0f, 0x2d, 0x84, 0x36, 0x5b, 0xfc, 0x89, 0x45, 0x14, 0x4f, 0x16, 0x79, ++ 0x19, 0xbd, 0xe2, 0xfe, 0xfc, 0xdf, 0x67, 0x19, 0x36, 0xfb, 0xb8, 0xb3, ++ 0xf1, 0xbb, 0x21, 0xb4, 0xeb, 0x81, 0x0e, 0x5f, 0xd1, 0x39, 0x9f, 0xd0, ++ 0x38, 0xf9, 0x6a, 0xe9, 0x7a, 0xb0, 0x01, 0x99, 0x5b, 0x6f, 0x31, 0xd1, ++ 0xa7, 0x1c, 0xc8, 0xe6, 0x71, 0x04, 0x57, 0xe8, 0xd8, 0x40, 0x5d, 0x1a, ++ 0x9d, 0x6e, 0x11, 0xfa, 0x0e, 0xf1, 0x23, 0x03, 0x7e, 0x72, 0xa5, 0xf3, ++ 0xf8, 0x8a, 0xca, 0x05, 0x14, 0xdd, 0xa7, 0xbf, 0x35, 0x82, 0x3e, 0xdf, ++ 0xcc, 0xe6, 0xf3, 0x5b, 0x74, 0xc8, 0xd4, 0x49, 0x61, 0x7e, 0xfe, 0xc7, ++ 0x2a, 0x50, 0x8e, 0x58, 0xfe, 0xeb, 0xb0, 0x76, 0x1e, 0xde, 0x6e, 0x98, ++ 0xfc, 0x71, 0xc8, 0x91, 0x1e, 0xcc, 0x6f, 0xc3, 0x8a, 0x25, 0x4f, 0x6e, ++ 0xb2, 0xe4, 0x89, 0x9d, 0x2e, 0x2d, 0xf9, 0xc1, 0x1c, 0x72, 0xe6, 0xbc, ++ 0x3c, 0x99, 0xc3, 0xed, 0xf4, 0xf3, 0xf2, 0x04, 0xe4, 0x07, 0x7e, 0xea, ++ 0xcc, 0x29, 0x87, 0x7a, 0xbd, 0x5c, 0x5f, 0x58, 0xf0, 0xb8, 0x51, 0x30, ++ 0x83, 0x1c, 0x79, 0xcf, 0x15, 0xb6, 0xc5, 0x69, 0x9c, 0x72, 0xe7, 0x62, ++ 0x7c, 0xf4, 0x79, 0xcb, 0x9d, 0x97, 0xb3, 0xf3, 0x85, 0xfd, 0xc1, 0xe5, ++ 0x4e, 0x10, 0x69, 0x03, 0xf9, 0x26, 0xdb, 0x3a, 0x47, 0xe4, 0xf7, 0x1e, ++ 0xce, 0x4e, 0x7d, 0x88, 0xe4, 0xa1, 0x47, 0xe5, 0xeb, 0xf6, 0x44, 0x18, ++ 0xfd, 0x4e, 0x00, 0xd6, 0x51, 0x9e, 0x7b, 0xf0, 0x1c, 0x25, 0xa3, 0x5c, ++ 0xaf, 0x96, 0x28, 0xde, 0x20, 0xce, 0x45, 0xf2, 0xc5, 0xf7, 0x07, 0x1f, ++ 0x71, 0x85, 0x29, 0x3f, 0xed, 0x11, 0xe0, 0x67, 0xf4, 0xf3, 0x26, 0x18, ++ 0x4e, 0xfb, 0xec, 0xc2, 0xe7, 0x0a, 0xce, 0xf3, 0xa4, 0x47, 0xd6, 0x7e, ++ 0x8d, 0xfb, 0x67, 0x80, 0x6f, 0xf4, 0xbb, 0x2e, 0x55, 0x0e, 0x59, 0x72, ++ 0xe2, 0xc3, 0x6c, 0xbe, 0xee, 0xf3, 0xf4, 0x65, 0x72, 0x38, 0x2d, 0xfa, ++ 0x4a, 0xa3, 0x67, 0xfa, 0xbe, 0x80, 0x45, 0xbf, 0xd6, 0xb8, 0x16, 0x1d, ++ 0x33, 0x64, 0xd0, 0x82, 0x0b, 0xd0, 0xab, 0xa0, 0x6b, 0x0c, 0x47, 0x53, ++ 0x9c, 0x3a, 0x26, 0xc5, 0x31, 0x0e, 0x62, 0xe5, 0x91, 0x59, 0xe3, 0xbd, ++ 0xe9, 0xe3, 0xf6, 0xc8, 0x48, 0xf7, 0xab, 0xac, 0x76, 0xdf, 0xb1, 0xfc, ++ 0xae, 0xf3, 0xf1, 0x60, 0x3d, 0xa0, 0x53, 0x3e, 0x59, 0x0f, 0xdd, 0x37, ++ 0x67, 0x5d, 0x9c, 0xfe, 0xe6, 0xb0, 0xdd, 0xea, 0x9a, 0x2a, 0xca, 0x27, ++ 0x50, 0x19, 0xe5, 0x13, 0x44, 0x4a, 0xd0, 0x9f, 0x39, 0xec, 0xb3, 0xfb, ++ 0xc5, 0x56, 0x3e, 0xd8, 0xb4, 0x92, 0x70, 0x08, 0xe5, 0xc4, 0x06, 0x61, ++ 0xa7, 0x5b, 0x79, 0x64, 0x56, 0x5e, 0xda, 0x61, 0x5f, 0xae, 0x75, 0xce, ++ 0x6c, 0xcb, 0x4f, 0xdb, 0x30, 0xc2, 0xfd, 0xec, 0xb7, 0xce, 0xe3, 0xe7, ++ 0xd2, 0xbf, 0x7f, 0x82, 0xdf, 0x6d, 0x5b, 0xed, 0x35, 0x9f, 0x40, 0xb9, ++ 0x08, 0xf8, 0x32, 0xc5, 0xf7, 0x9c, 0x28, 0x0f, 0xcd, 0x1a, 0xf7, 0xbb, ++ 0x02, 0x4f, 0x6f, 0x78, 0xcc, 0xa7, 0x7c, 0x9f, 0xe1, 0xfe, 0xe4, 0x4b, ++ 0x59, 0xf6, 0xbc, 0xab, 0x4e, 0x9f, 0xe1, 0x88, 0x0b, 0x70, 0xbc, 0x4e, ++ 0xd4, 0x63, 0xf5, 0x74, 0x1f, 0x2f, 0xca, 0xef, 0x55, 0x39, 0xcf, 0xd5, ++ 0x47, 0xba, 0xff, 0xea, 0xbc, 0xb7, 0x77, 0xfe, 0xfe, 0xab, 0x38, 0x7f, ++ 0x6f, 0xf6, 0x44, 0x5f, 0x21, 0xf8, 0x5f, 0xe2, 0xf9, 0x6f, 0x7a, 0x38, ++ 0x7a, 0xb0, 0x93, 0x7d, 0x7e, 0xeb, 0x39, 0xe0, 0x35, 0x7f, 0x8c, 0xe3, ++ 0x77, 0x0a, 0xfe, 0x9e, 0x16, 0xe4, 0xf7, 0x76, 0xde, 0xf7, 0x44, 0xdf, ++ 0xc1, 0xe7, 0x37, 0x30, 0xee, 0x57, 0x5b, 0x76, 0xce, 0x61, 0x6c, 0x07, ++ 0xfd, 0xfd, 0xaf, 0x80, 0xd4, 0x06, 0x7a, 0xd9, 0x54, 0xcb, 0xe9, 0xb5, ++ 0xa8, 0x92, 0xd1, 0xf7, 0xc7, 0xa7, 0xb7, 0xf2, 0xfa, 0x8e, 0xa5, 0xfc, ++ 0xbb, 0xa6, 0xfd, 0x6f, 0xf0, 0x7b, 0x1f, 0xdb, 0xa2, 0xfc, 0x7b, 0xa6, ++ 0xd0, 0xaf, 0x4f, 0x06, 0xbc, 0xec, 0x18, 0xcf, 0xf5, 0xe1, 0xfe, 0x2a, ++ 0xde, 0x6f, 0x3f, 0xde, 0x6f, 0x42, 0x3e, 0xad, 0xe0, 0x76, 0x57, 0x1e, ++ 0x46, 0xef, 0x15, 0x14, 0xd7, 0x51, 0x2a, 0xa7, 0xd7, 0xf4, 0x78, 0x27, ++ 0xc0, 0xfb, 0x03, 0x4b, 0x65, 0x8a, 0x8b, 0xee, 0x11, 0x7c, 0x11, 0x60, ++ 0x26, 0xc5, 0x39, 0xb6, 0x55, 0xf2, 0x79, 0x76, 0x55, 0xc8, 0x4f, 0x8a, ++ 0xef, 0xd1, 0x2c, 0xba, 0x0d, 0xea, 0x9d, 0xb3, 0x57, 0x4e, 0xc6, 0xfb, ++ 0x25, 0xdb, 0x45, 0x3c, 0x65, 0xdf, 0xe2, 0x95, 0x4f, 0x62, 0x5e, 0xdf, ++ 0x07, 0x81, 0x72, 0x41, 0x77, 0x09, 0xba, 0xf7, 0xda, 0x73, 0xfc, 0x0e, ++ 0x8a, 0x8f, 0x3c, 0xbc, 0x24, 0x4f, 0x5a, 0x09, 0x6b, 0xdc, 0x77, 0x30, ++ 0x73, 0x7e, 0x4b, 0x95, 0x5f, 0x15, 0xfd, 0x62, 0x6e, 0x11, 0x4f, 0x12, ++ 0x65, 0x42, 0xc3, 0x72, 0xab, 0x29, 0xf2, 0x56, 0x5b, 0x99, 0xf8, 0x1e, ++ 0x7b, 0x4c, 0xc3, 0xf8, 0xd3, 0xb3, 0x83, 0x3c, 0x6f, 0xb5, 0x7b, 0xf5, ++ 0xb3, 0xc7, 0x66, 0xa2, 0x3e, 0xae, 0x94, 0x29, 0xcf, 0xac, 0x6b, 0xf0, ++ 0xa8, 0xf7, 0x0a, 0x5c, 0x77, 0x1d, 0xcf, 0xeb, 0x29, 0x52, 0x13, 0x52, ++ 0xba, 0xff, 0xe2, 0xf5, 0xbb, 0xb8, 0x9d, 0x56, 0x73, 0xd4, 0x63, 0x54, ++ 0x0d, 0x6f, 0xff, 0xec, 0xe0, 0x51, 0xa2, 0xbb, 0xed, 0x80, 0x77, 0x25, ++ 0xcd, 0xff, 0x93, 0x05, 0x9c, 0xdd, 0xe8, 0x4f, 0x40, 0xbf, 0xbd, 0xae, ++ 0x9e, 0x81, 0x99, 0xd0, 0x6e, 0xef, 0xb8, 0x3c, 0x29, 0x66, 0xa4, 0xda, ++ 0x8d, 0xf6, 0x73, 0xfe, 0xeb, 0x5e, 0x22, 0x8b, 0xef, 0xd0, 0x33, 0xfa, ++ 0x8e, 0x43, 0xa7, 0x79, 0xda, 0x83, 0x72, 0xb3, 0x13, 0xcf, 0x3f, 0xa0, ++ 0x7d, 0x77, 0x8d, 0x95, 0x97, 0xda, 0x43, 0xf7, 0xb2, 0xf6, 0xce, 0x99, ++ 0x3c, 0x07, 0xf3, 0xc4, 0xb7, 0xdd, 0xc4, 0x83, 0xa5, 0x5d, 0xe1, 0x43, ++ 0xe4, 0x27, 0xf7, 0xcc, 0xe6, 0x76, 0xd9, 0x5e, 0x09, 0xda, 0xc1, 0xbe, ++ 0xec, 0x6b, 0xd1, 0x6e, 0xa4, 0x7b, 0x4c, 0xad, 0x3c, 0x4e, 0x04, 0x65, ++ 0xc6, 0x38, 0x51, 0x2f, 0x26, 0x02, 0x23, 0x5e, 0xc5, 0xb9, 0x1d, 0xa5, ++ 0xbe, 0xc0, 0xbc, 0x9d, 0x0d, 0x7d, 0x03, 0x38, 0x4f, 0x51, 0x1d, 0xff, ++ 0xbe, 0x45, 0x51, 0x4d, 0xe6, 0xfe, 0x2f, 0x06, 0xdc, 0xd4, 0x7f, 0x9f, ++ 0x2b, 0x46, 0xf1, 0xcf, 0x91, 0xf6, 0xef, 0x5f, 0x7d, 0x1c, 0x9f, 0x9d, ++ 0x55, 0xfc, 0xbc, 0x80, 0xb1, 0x38, 0xc5, 0xa5, 0x76, 0x0b, 0xbf, 0x8b, ++ 0xa9, 0x51, 0x23, 0xfd, 0x3b, 0xa1, 0x2d, 0x01, 0x8e, 0x9f, 0x9d, 0x2e, ++ 0x66, 0x62, 0xbc, 0xcc, 0x57, 0xa7, 0x91, 0x5e, 0x97, 0xc3, 0x06, 0xd9, ++ 0xa1, 0x7e, 0xb0, 0x1f, 0x31, 0x1e, 0xb7, 0x4d, 0x8a, 0x2d, 0xc6, 0xfc, ++ 0x90, 0xd8, 0x24, 0x8d, 0x3d, 0x41, 0x18, 0x31, 0xbd, 0xe3, 0x30, 0x7e, ++ 0x37, 0x21, 0x2f, 0x8c, 0xf4, 0xb7, 0x49, 0x4a, 0x84, 0xf0, 0xbb, 0xca, ++ 0xb1, 0x71, 0x3c, 0xbe, 0x7d, 0x34, 0xb2, 0x93, 0xee, 0x5d, 0x1d, 0x00, ++ 0x3b, 0x9a, 0xc2, 0xc1, 0x2c, 0x41, 0x7a, 0xaa, 0x3b, 0x9a, 0x47, 0xf7, ++ 0xa1, 0x8e, 0x46, 0xaa, 0x07, 0xa9, 0xbf, 0xaf, 0x42, 0x77, 0x5b, 0x1a, ++ 0x05, 0xf3, 0xe6, 0xe9, 0x43, 0x91, 0x8c, 0x4d, 0xba, 0x62, 0xd3, 0x56, ++ 0xb4, 0x6b, 0x3a, 0xa7, 0xc8, 0x3a, 0xe6, 0x6d, 0x76, 0x4a, 0xf5, 0x51, ++ 0x1c, 0x2f, 0x96, 0xeb, 0xa1, 0x38, 0xb2, 0x6b, 0xca, 0x3c, 0xda, 0x3f, ++ 0xd7, 0xa8, 0x3c, 0x29, 0x5d, 0x1f, 0xdd, 0xec, 0xe7, 0x7a, 0xe1, 0xc4, ++ 0x84, 0xc8, 0xcd, 0x7e, 0x58, 0x57, 0x68, 0xca, 0xe9, 0x5c, 0x8c, 0x5b, ++ 0x6e, 0xaf, 0x7d, 0x75, 0x1f, 0xee, 0xdf, 0xa3, 0x0f, 0x78, 0x88, 0x8e, ++ 0x1e, 0xad, 0x1d, 0xbc, 0x17, 0xe7, 0xd9, 0x7f, 0xee, 0x9a, 0xe3, 0x51, ++ 0xe2, 0x4b, 0x7e, 0x5e, 0xf7, 0x58, 0xed, 0x99, 0x52, 0xb4, 0x7b, 0x76, ++ 0x35, 0x9d, 0xce, 0x45, 0xfc, 0x15, 0x63, 0x7c, 0x0e, 0xf4, 0x61, 0x71, ++ 0x05, 0x8f, 0xa3, 0xa1, 0x06, 0x24, 0xfb, 0x4c, 0xed, 0x61, 0xb7, 0x02, ++ 0x1e, 0x8b, 0xdb, 0x34, 0x66, 0xa4, 0xe9, 0x63, 0x2f, 0xe3, 0xe7, 0x79, ++ 0xf8, 0xe7, 0x9b, 0x4c, 0x72, 0x8f, 0xfe, 0x9e, 0x1d, 0x3c, 0xed, 0x69, ++ 0xc1, 0xf1, 0x96, 0xb0, 0xc4, 0xe5, 0x01, 0x7a, 0xee, 0xc1, 0x78, 0x96, ++ 0x25, 0x67, 0x8a, 0xeb, 0x58, 0xa2, 0x00, 0xe4, 0xe1, 0xfe, 0x15, 0xef, ++ 0xc6, 0x30, 0x4f, 0xee, 0xd1, 0x89, 0x05, 0x74, 0x8f, 0xb2, 0x48, 0xbc, ++ 0x27, 0xc9, 0x09, 0xe3, 0x95, 0x88, 0xf1, 0xfa, 0xdf, 0x7c, 0x75, 0x3d, ++ 0xb6, 0x7b, 0xac, 0xba, 0xc0, 0x40, 0x79, 0x51, 0x3c, 0x30, 0x34, 0x0f, ++ 0x95, 0x44, 0x71, 0xd5, 0x19, 0x8a, 0xb3, 0x85, 0xac, 0xfb, 0x1f, 0x51, ++ 0x63, 0xff, 0xed, 0x44, 0x9f, 0x32, 0x7d, 0xa7, 0xb2, 0x38, 0xfc, 0xee, ++ 0x9f, 0xe3, 0x3a, 0x02, 0xbe, 0x3e, 0xd2, 0x73, 0xd0, 0x9e, 0xe2, 0x66, ++ 0xce, 0x75, 0xfc, 0x61, 0x82, 0x79, 0x3f, 0xe2, 0xef, 0x9b, 0x52, 0xeb, ++ 0x6b, 0xe3, 0x82, 0x29, 0x7f, 0x8c, 0xfe, 0x90, 0x1f, 0xbf, 0xca, 0xef, ++ 0x65, 0x17, 0x67, 0xfd, 0xc3, 0x5c, 0x25, 0x2d, 0xdf, 0xb6, 0x44, 0xc4, ++ 0x05, 0x36, 0x49, 0x83, 0xb3, 0xc9, 0x2e, 0x7d, 0x90, 0xdb, 0xe1, 0x63, ++ 0x59, 0x9c, 0xe4, 0x5c, 0x71, 0x55, 0xec, 0x5e, 0x9e, 0x6f, 0x1b, 0xa5, ++ 0x7c, 0x5b, 0xe7, 0xbc, 0xdb, 0xfd, 0xe7, 0xf5, 0xab, 0x44, 0xf7, 0xa8, ++ 0xf3, 0x9b, 0xc4, 0xbd, 0x12, 0xfe, 0x3b, 0x36, 0x25, 0xe2, 0x77, 0x6c, ++ 0x9c, 0x74, 0x1f, 0x0a, 0xe5, 0x57, 0x75, 0x5c, 0x93, 0xaa, 0xef, 0x8b, ++ 0x9e, 0x26, 0xfa, 0x7f, 0x46, 0x33, 0xee, 0xc9, 0xf4, 0xbd, 0x87, 0x7d, ++ 0x42, 0x2e, 0x6c, 0x12, 0xfe, 0x98, 0x35, 0xfe, 0xd8, 0x5c, 0x3e, 0xbe, ++ 0x55, 0x7f, 0x4c, 0xe7, 0xf4, 0xf8, 0xcc, 0x2b, 0x79, 0x37, 0x56, 0xc1, ++ 0x7a, 0xfe, 0xb2, 0xad, 0x6c, 0x12, 0xc6, 0x3f, 0x77, 0x8c, 0xe0, 0xc7, ++ 0xad, 0x0c, 0x70, 0xfa, 0xcb, 0x1e, 0x00, 0x0b, 0x07, 0xf4, 0x40, 0xff, ++ 0xeb, 0xaf, 0x7b, 0x31, 0x9f, 0xe5, 0x19, 0x99, 0xad, 0x42, 0x39, 0x55, ++ 0x5f, 0x95, 0xf0, 0x24, 0xab, 0x04, 0x1e, 0x61, 0x7c, 0xf2, 0xc5, 0x60, ++ 0xfc, 0x03, 0xe1, 0x6f, 0x7b, 0x50, 0x2e, 0x7d, 0x25, 0x50, 0x49, 0x70, ++ 0xad, 0x98, 0xca, 0xe3, 0x06, 0x9d, 0x55, 0x0f, 0xd1, 0x39, 0x50, 0x48, ++ 0xe7, 0x7a, 0x07, 0xf9, 0x13, 0xe5, 0xbb, 0x2f, 0x14, 0x93, 0x30, 0xee, ++ 0xbd, 0xbc, 0x86, 0xe9, 0x87, 0x44, 0xbc, 0x25, 0x06, 0xf8, 0xa7, 0xbb, ++ 0xf3, 0x32, 0x4b, 0xe5, 0xf5, 0x6f, 0xcf, 0x25, 0x3f, 0x07, 0x78, 0x85, ++ 0xdf, 0xab, 0xc1, 0xdc, 0xa4, 0xc9, 0xe2, 0xf7, 0x27, 0xca, 0xf1, 0x9c, ++ 0x68, 0xd3, 0xbd, 0x22, 0x7f, 0x56, 0x46, 0x7c, 0x77, 0x8a, 0x79, 0x80, ++ 0x6f, 0x69, 0x9e, 0x03, 0x45, 0x62, 0x9c, 0xfb, 0xb9, 0xfd, 0x8f, 0xfe, ++ 0x05, 0xf6, 0x2f, 0x17, 0xf3, 0x94, 0xd7, 0x7d, 0xf7, 0x6b, 0xa8, 0xc7, ++ 0x8b, 0x74, 0x4e, 0x17, 0x29, 0xf8, 0xfa, 0x3c, 0x04, 0x5f, 0xab, 0xcc, ++ 0x08, 0x3e, 0x35, 0xf1, 0x1a, 0xfa, 0xa1, 0xdb, 0x27, 0x15, 0x18, 0x48, ++ 0x37, 0x07, 0x42, 0xe1, 0x77, 0x9a, 0xa0, 0xbe, 0x7c, 0x91, 0x4a, 0xf1, ++ 0xf8, 0xf2, 0x1a, 0x0e, 0xc7, 0x81, 0x56, 0x99, 0x7e, 0x0f, 0xc8, 0x5f, ++ 0xa7, 0x1d, 0xa4, 0xfb, 0x63, 0x26, 0xe8, 0x8b, 0x34, 0x7c, 0x19, 0x62, ++ 0xde, 0xa2, 0x9a, 0x84, 0x84, 0xe7, 0x5a, 0x46, 0x2b, 0x5f, 0x17, 0xb4, ++ 0xf3, 0xa2, 0x5c, 0x34, 0xc2, 0x00, 0x0f, 0xd4, 0x0d, 0xb1, 0xae, 0xf3, ++ 0xf0, 0x4f, 0xd2, 0x08, 0xfe, 0x22, 0xcf, 0x20, 0xe6, 0x16, 0x9d, 0xc7, ++ 0xc3, 0x4a, 0x1c, 0x0f, 0xe8, 0x77, 0x65, 0x1d, 0xef, 0xe7, 0x0f, 0xf5, ++ 0x6d, 0x41, 0x39, 0xb6, 0xbc, 0x8e, 0xc3, 0x0d, 0xfa, 0x9d, 0xe0, 0x29, ++ 0x0a, 0x6b, 0x07, 0x51, 0xdf, 0x17, 0x85, 0xf8, 0x78, 0xcb, 0x01, 0x3f, ++ 0x87, 0xa4, 0x14, 0x5c, 0xd9, 0x16, 0x5c, 0x75, 0x32, 0xe5, 0x5f, 0x15, ++ 0xd5, 0x68, 0x07, 0xd1, 0x0f, 0xce, 0x16, 0xf0, 0xad, 0x0c, 0x73, 0x78, ++ 0xfa, 0xdf, 0x38, 0x3d, 0x20, 0xf1, 0xf1, 0x0c, 0x1c, 0x2f, 0x5b, 0xc0, ++ 0x9b, 0x2d, 0xd6, 0x4f, 0x09, 0xbb, 0x05, 0x42, 0x3f, 0xc0, 0x78, 0x4f, ++ 0xbb, 0x12, 0xf5, 0x78, 0x2f, 0xe7, 0xf4, 0x14, 0x66, 0x1c, 0xe2, 0xb3, ++ 0x51, 0x3c, 0xcb, 0x7a, 0xbf, 0xab, 0x15, 0xf0, 0x00, 0xf8, 0xf1, 0x8b, ++ 0x79, 0xd8, 0x6e, 0x37, 0xf1, 0x13, 0x2c, 0x31, 0xf6, 0xb1, 0xcc, 0x7f, ++ 0x3f, 0xc4, 0x48, 0x8b, 0x5b, 0x54, 0xec, 0xd6, 0x6c, 0x75, 0xbf, 0xd8, ++ 0x3f, 0xd6, 0xc5, 0x9f, 0x93, 0x1f, 0x47, 0x2a, 0x91, 0xd7, 0x65, 0xe1, ++ 0xd7, 0xad, 0xac, 0xb2, 0xf7, 0x63, 0x35, 0x69, 0xf5, 0x32, 0xbc, 0x5f, ++ 0xc6, 0xe9, 0x7d, 0xfd, 0xf5, 0xfc, 0xbc, 0xe3, 0xc0, 0x04, 0x6e, 0x1f, ++ 0xa1, 0xdf, 0x71, 0x9e, 0xbf, 0x91, 0xce, 0xa7, 0x18, 0x8f, 0x77, 0x05, ++ 0xf1, 0xbd, 0x46, 0xfa, 0xae, 0xa4, 0xdd, 0x3e, 0x6e, 0x71, 0x6b, 0xc1, ++ 0x74, 0x94, 0x0f, 0xc5, 0x03, 0x8f, 0xcc, 0x93, 0x61, 0x3d, 0x45, 0x5f, ++ 0x65, 0xb2, 0x92, 0x43, 0xf4, 0x2c, 0x9d, 0x97, 0x7f, 0x30, 0xdf, 0xb7, ++ 0xd7, 0x24, 0xe8, 0xfe, 0x6c, 0xf6, 0x40, 0x24, 0x0f, 0xe5, 0x5d, 0x49, ++ 0x6b, 0xde, 0x74, 0xfc, 0xfe, 0x5b, 0xf6, 0x40, 0x94, 0xea, 0xd9, 0x03, ++ 0xad, 0x26, 0xcf, 0x3f, 0x03, 0x17, 0x26, 0x0f, 0xf3, 0xf5, 0xd2, 0xe6, ++ 0x29, 0x45, 0x39, 0xcd, 0xf3, 0xe9, 0x58, 0xab, 0xd6, 0x87, 0x72, 0xad, ++ 0x36, 0x1d, 0x4e, 0x78, 0x5f, 0xf2, 0x4a, 0xcf, 0x5c, 0xec, 0xbf, 0xf9, ++ 0xde, 0x57, 0x47, 0x23, 0xff, 0x16, 0x38, 0xfa, 0x7b, 0x72, 0xb8, 0xff, ++ 0x50, 0xfc, 0x0a, 0xb4, 0x0a, 0xe0, 0xfc, 0x67, 0xd6, 0x62, 0x7b, 0x2b, ++ 0xbe, 0x93, 0x8d, 0x10, 0xe7, 0x51, 0xf9, 0x0a, 0x96, 0xc5, 0x3e, 0x90, ++ 0xc7, 0x50, 0x96, 0x88, 0xfc, 0x3b, 0x4b, 0x5e, 0x74, 0x4e, 0x78, 0x77, ++ 0x52, 0xd4, 0x27, 0xe8, 0x87, 0xf2, 0xf1, 0x58, 0x22, 0xdd, 0xce, 0x77, ++ 0x96, 0xd0, 0x7e, 0xbc, 0x68, 0x1f, 0x93, 0x2e, 0xd8, 0xee, 0x0c, 0xb5, ++ 0x1b, 0x29, 0xde, 0x34, 0x10, 0xe0, 0xf1, 0xa6, 0x80, 0xb0, 0x57, 0x7b, ++ 0x98, 0xb1, 0x9f, 0xf4, 0x7b, 0x0d, 0xcf, 0xf7, 0xf0, 0xe1, 0x73, 0xd0, ++ 0x1f, 0x7d, 0x35, 0x47, 0xa7, 0xd3, 0x7e, 0xf6, 0xb1, 0x30, 0xd2, 0x73, ++ 0x71, 0xdb, 0x1f, 0xdd, 0xe9, 0xf2, 0xfa, 0xd6, 0x40, 0xa9, 0xb8, 0x07, ++ 0x9d, 0x20, 0xba, 0xd7, 0x4a, 0xb2, 0xe8, 0x7c, 0x0f, 0xf8, 0x98, 0xbe, ++ 0x6f, 0x7a, 0x40, 0x6d, 0xa5, 0x73, 0xd6, 0xbe, 0x22, 0x7e, 0xae, 0x79, ++ 0x74, 0xce, 0xab, 0x12, 0xe2, 0xb3, 0xe8, 0x79, 0x9e, 0xa7, 0x6d, 0xd9, ++ 0xcb, 0xd3, 0x6b, 0x12, 0x21, 0x7c, 0xde, 0xf5, 0x5a, 0xf4, 0x0a, 0xe2, ++ 0xcf, 0x11, 0xec, 0x4f, 0xcb, 0xde, 0x74, 0xae, 0xe7, 0xb2, 0xfa, 0x87, ++ 0x48, 0x1e, 0x8c, 0x8d, 0x32, 0x2f, 0x9e, 0xaf, 0xf9, 0x57, 0xab, 0x94, ++ 0xc7, 0x5a, 0x12, 0x05, 0xb8, 0xaa, 0x50, 0x2e, 0x00, 0x49, 0x17, 0x02, ++ 0xfc, 0x35, 0xb1, 0xf5, 0x48, 0x37, 0x46, 0x94, 0xd7, 0x8d, 0xd5, 0xa2, ++ 0x5c, 0x05, 0xe5, 0xb5, 0x60, 0xdf, 0xae, 0x1b, 0x28, 0xff, 0x85, 0x2b, ++ 0x35, 0xee, 0xd6, 0x0a, 0xb0, 0x6b, 0xd1, 0x7e, 0x1a, 0xdc, 0xed, 0xb9, ++ 0x09, 0xed, 0x95, 0x56, 0xb0, 0x46, 0x0c, 0xb4, 0x17, 0x4f, 0x7b, 0xf0, ++ 0x7b, 0x2a, 0xdd, 0xad, 0xd3, 0xf3, 0x11, 0xcf, 0xcf, 0x46, 0x2c, 0xfb, ++ 0x32, 0x21, 0xe1, 0xf8, 0x45, 0x3f, 0x31, 0xc9, 0x5e, 0xac, 0xd5, 0x35, ++ 0x1d, 0xe3, 0x30, 0x13, 0xdc, 0x89, 0xd1, 0xe9, 0xe7, 0x74, 0x07, 0xe6, ++ 0xbc, 0x5b, 0x4d, 0xdf, 0x13, 0x9b, 0x7f, 0x69, 0xf9, 0x64, 0x23, 0xe9, ++ 0x13, 0x84, 0x45, 0x4e, 0xd3, 0x23, 0xfd, 0x55, 0x47, 0x49, 0xbf, 0x3c, ++ 0xe9, 0x1f, 0x4f, 0x7a, 0xc8, 0xd2, 0x2b, 0x96, 0x1e, 0xa1, 0x11, 0x41, ++ 0xbe, 0xdc, 0x26, 0xf8, 0xa8, 0xcb, 0x48, 0x78, 0x24, 0x92, 0x57, 0xc0, ++ 0xbb, 0x00, 0xe7, 0x6d, 0x28, 0x47, 0x80, 0x8e, 0xfd, 0x45, 0x5c, 0x9e, ++ 0x83, 0x1c, 0xe6, 0x72, 0xce, 0xd2, 0x27, 0xf7, 0x72, 0xbd, 0x6f, 0xc9, ++ 0xcf, 0x0a, 0x31, 0xce, 0x6d, 0x28, 0x6f, 0xa1, 0x5f, 0x77, 0xed, 0x93, ++ 0xb9, 0x37, 0xa1, 0x5c, 0x11, 0x72, 0xd6, 0x1f, 0x32, 0x66, 0xe2, 0xf9, ++ 0x5c, 0x85, 0x90, 0xaf, 0x4c, 0x8d, 0x49, 0x38, 0xdf, 0x81, 0x29, 0xfc, ++ 0x7b, 0x95, 0x01, 0x87, 0x3c, 0xad, 0x68, 0xe5, 0xe3, 0x74, 0x85, 0x18, ++ 0xd1, 0x13, 0xe8, 0xa1, 0x83, 0x48, 0x37, 0x07, 0x8a, 0x12, 0x74, 0x4f, ++ 0xfc, 0x40, 0xeb, 0x51, 0x29, 0xfd, 0x9e, 0xa9, 0xa5, 0xef, 0x02, 0xad, ++ 0x49, 0x86, 0xfb, 0x3f, 0xae, 0x8e, 0xcb, 0xc1, 0x71, 0x42, 0xae, 0x7e, ++ 0xc7, 0x6f, 0x70, 0xfa, 0xf4, 0x70, 0xb9, 0x7a, 0x5e, 0xef, 0x09, 0x79, ++ 0xbb, 0xd5, 0x3c, 0xca, 0xc4, 0x77, 0x61, 0x33, 0xe6, 0x61, 0xfd, 0xbd, ++ 0xd0, 0xe7, 0x3d, 0x15, 0x87, 0xc8, 0x2f, 0xd8, 0x76, 0xfb, 0x69, 0xc2, ++ 0xa7, 0x15, 0x0f, 0x0d, 0x89, 0x78, 0x68, 0x77, 0xd5, 0xdb, 0xf4, 0x7e, ++ 0x7b, 0x94, 0xdf, 0x03, 0xd8, 0x65, 0x4e, 0x9f, 0x43, 0xf0, 0x47, 0x96, ++ 0x6b, 0x94, 0x7f, 0x5a, 0x73, 0x74, 0x4e, 0x19, 0xfa, 0x1b, 0x4d, 0xcb, ++ 0x35, 0xb4, 0xeb, 0x4e, 0x05, 0x0a, 0xac, 0xf3, 0x2f, 0xef, 0x42, 0xb4, ++ 0x27, 0x5b, 0x57, 0x91, 0xfd, 0xeb, 0x13, 0xfb, 0xf8, 0x70, 0x98, 0x09, ++ 0xbf, 0x53, 0x23, 0x3f, 0xeb, 0xfe, 0xa5, 0xdf, 0x1e, 0xc0, 0xfe, 0x21, ++ 0xf0, 0x8b, 0x24, 0x03, 0x1b, 0xf5, 0x79, 0xdc, 0x48, 0xe7, 0xf8, 0x3d, ++ 0x05, 0xc4, 0x77, 0x74, 0x90, 0x3a, 0xfb, 0x6a, 0x0c, 0xfa, 0x0e, 0x84, ++ 0x73, 0x1d, 0x7f, 0x1d, 0xe0, 0xdf, 0xa5, 0xf5, 0x47, 0x93, 0x03, 0xe3, ++ 0x68, 0x5f, 0x65, 0xba, 0xd2, 0xe3, 0xab, 0x61, 0xe4, 0x77, 0x2e, 0x07, ++ 0xbf, 0x0e, 0x87, 0xdd, 0xad, 0x86, 0xbd, 0x13, 0xe0, 0xfd, 0xee, 0x26, ++ 0x59, 0x5f, 0xcf, 0x52, 0xfd, 0xff, 0x57, 0x80, 0xe7, 0xa3, 0x4d, 0xf4, ++ 0xf3, 0x7b, 0x0a, 0x3b, 0x17, 0x9f, 0xd9, 0x82, 0x71, 0xbe, 0x9d, 0x4b, ++ 0xc5, 0x77, 0xce, 0x1c, 0xf0, 0xdf, 0xdf, 0xd8, 0xe7, 0x51, 0x68, 0x1e, ++ 0x8c, 0x09, 0x50, 0x1e, 0x73, 0xc6, 0xef, 0xed, 0x57, 0xf9, 0xb3, 0xf8, ++ 0xf7, 0x17, 0x6a, 0xfa, 0x06, 0xd0, 0x9e, 0x0f, 0x54, 0x71, 0xb8, 0x5e, ++ 0x0a, 0x18, 0x1c, 0xef, 0x83, 0x1c, 0x8f, 0x3d, 0x11, 0x99, 0xf8, 0x68, ++ 0xd7, 0x60, 0xb5, 0x17, 0xf5, 0x9d, 0xd3, 0x6e, 0x7c, 0x34, 0xfb, 0xc4, ++ 0x24, 0x9e, 0xd7, 0x62, 0xd7, 0x37, 0x17, 0xab, 0x17, 0x3b, 0xe4, 0xfe, ++ 0x04, 0x77, 0xdf, 0x0d, 0x24, 0xef, 0xbe, 0x29, 0x93, 0xbc, 0x62, 0x8c, ++ 0xcb, 0x3b, 0x89, 0xc9, 0x06, 0xfe, 0xae, 0x46, 0x4b, 0x80, 0xd3, 0x53, ++ 0x95, 0x90, 0xd7, 0x1d, 0xae, 0xc4, 0x7e, 0xcc, 0x2b, 0xe8, 0x78, 0xce, ++ 0xc7, 0xd6, 0x1b, 0x29, 0xba, 0x28, 0x12, 0x63, 0x76, 0xb6, 0xca, 0x19, ++ 0x7f, 0x3f, 0xed, 0x50, 0x40, 0xe1, 0xfb, 0x3f, 0x7c, 0xdf, 0xb9, 0xfd, ++ 0x20, 0xf6, 0xfd, 0x29, 0x81, 0x87, 0x8b, 0xed, 0x3f, 0x86, 0x59, 0xd0, ++ 0x9e, 0xee, 0x8b, 0x6f, 0x1a, 0x73, 0x17, 0xca, 0xf1, 0x56, 0xee, 0x3f, ++ 0xf7, 0x25, 0xde, 0xa6, 0xbc, 0xa3, 0xa2, 0xd9, 0x0b, 0xc9, 0xef, 0x39, ++ 0x72, 0xf0, 0x72, 0xf2, 0x07, 0x8a, 0xaa, 0x4c, 0xdb, 0xef, 0x6b, 0x66, ++ 0x8f, 0xe0, 0xb7, 0x56, 0xe4, 0x78, 0x2e, 0x18, 0x0f, 0x18, 0x49, 0x1e, ++ 0xef, 0x5b, 0xdd, 0x41, 0x7e, 0xf6, 0xbe, 0xc1, 0xcc, 0xf7, 0x62, 0x0a, ++ 0x72, 0x78, 0x5e, 0x5a, 0x1f, 0xc8, 0x4b, 0xfc, 0xbe, 0xc9, 0x48, 0xf3, ++ 0xeb, 0x39, 0x9c, 0xff, 0xfe, 0x29, 0x20, 0xe8, 0x6e, 0xce, 0xbb, 0xf4, ++ 0xbd, 0x8c, 0x34, 0x3d, 0xfb, 0x8a, 0xd0, 0xb3, 0xa4, 0x6f, 0x8b, 0x55, ++ 0x16, 0x53, 0xd2, 0xf2, 0x1c, 0x26, 0x08, 0xfc, 0x39, 0xf5, 0x27, 0x53, ++ 0xe3, 0x9e, 0xcb, 0x6b, 0x88, 0xce, 0x09, 0x7f, 0xfb, 0xc4, 0xf9, 0xc5, ++ 0xc3, 0xa6, 0x4c, 0x78, 0xb7, 0xe8, 0x1c, 0xcf, 0x0f, 0x10, 0xaf, 0xb0, ++ 0x0e, 0x53, 0xd0, 0x21, 0x9d, 0x6f, 0xf4, 0xb0, 0xb8, 0x07, 0xf9, 0x26, ++ 0xd6, 0xc4, 0xf3, 0x3c, 0x9c, 0x70, 0x4f, 0xf0, 0xcb, 0x97, 0xb4, 0xbe, ++ 0x60, 0x0e, 0xf7, 0x43, 0xce, 0xcf, 0x27, 0xfc, 0xf5, 0x89, 0x7e, 0x0e, ++ 0xf7, 0xce, 0xda, 0x07, 0xe8, 0x9e, 0x23, 0xcc, 0x17, 0x42, 0xfa, 0x90, ++ 0xbe, 0xff, 0x1f, 0x67, 0xe8, 0x3e, 0xd4, 0x73, 0x2e, 0xfa, 0x3d, 0xdb, ++ 0x19, 0xcf, 0xb9, 0x12, 0x18, 0xd3, 0xba, 0xfb, 0x20, 0xff, 0xbd, 0x45, ++ 0xf9, 0x25, 0x2f, 0xc1, 0xf9, 0xcf, 0x87, 0xf9, 0xf7, 0xd5, 0x13, 0x7e, ++ 0x6e, 0x8f, 0xfd, 0x4a, 0xe7, 0xbf, 0x57, 0xf4, 0x15, 0xf7, 0x60, 0xf7, ++ 0x17, 0xa0, 0x3e, 0xf4, 0x9c, 0xc2, 0xc8, 0x9e, 0x8c, 0x83, 0xe2, 0x02, ++ 0x7a, 0x3d, 0x23, 0xe8, 0x95, 0x3d, 0xcf, 0xeb, 0x2b, 0xbd, 0xbc, 0x7a, ++ 0xf7, 0xc1, 0xfe, 0x65, 0x38, 0xde, 0xaa, 0xe7, 0x79, 0x1e, 0xe6, 0xdd, ++ 0x2f, 0xdc, 0x71, 0xf3, 0x17, 0xa0, 0x7e, 0xc7, 0x80, 0x8b, 0xee, 0x0c, ++ 0xdc, 0xfd, 0xc4, 0x7a, 0x6d, 0x0c, 0xd4, 0xef, 0x8c, 0x4b, 0x7d, 0x58, ++ 0xff, 0xf5, 0x74, 0x46, 0xbf, 0xf7, 0x19, 0xcb, 0xd3, 0x28, 0xce, 0xf5, ++ 0xeb, 0xc0, 0x60, 0xc1, 0x02, 0xc0, 0xf7, 0x07, 0xeb, 0x3c, 0xcc, 0xb8, ++ 0x02, 0xe3, 0xa4, 0x83, 0x05, 0xf3, 0x01, 0x0f, 0x77, 0xc5, 0x9f, 0x99, ++ 0x89, 0xfd, 0xee, 0x7a, 0x5a, 0x0a, 0x23, 0xdb, 0xce, 0x78, 0xee, 0x89, ++ 0x57, 0x47, 0x03, 0x5c, 0x77, 0x7f, 0x43, 0xa2, 0xfc, 0xaf, 0x2f, 0x1f, ++ 0xc9, 0xb6, 0xd9, 0x85, 0x67, 0x60, 0x29, 0xd3, 0xe0, 0xfd, 0x9a, 0x83, ++ 0xfc, 0x77, 0x23, 0xef, 0x60, 0x3d, 0x33, 0x11, 0x1f, 0x77, 0x3f, 0xd1, ++ 0x4b, 0xbf, 0x7f, 0x68, 0xe1, 0xf3, 0x83, 0x75, 0x95, 0xcc, 0x48, 0xfb, ++ 0xdd, 0xb0, 0xbb, 0xbf, 0xf1, 0x0c, 0xfd, 0x9e, 0xe1, 0x3d, 0xdf, 0x92, ++ 0xe8, 0xf7, 0x15, 0xef, 0x91, 0xf9, 0x3d, 0xa2, 0x7f, 0x7e, 0xc1, 0xbb, ++ 0xe8, 0x71, 0x1f, 0xae, 0x6f, 0xbd, 0x76, 0xb9, 0x1f, 0xd7, 0xb5, 0x59, ++ 0xc3, 0x76, 0x77, 0xc4, 0x5b, 0xbe, 0x8b, 0x29, 0x4d, 0x77, 0xc5, 0x0f, ++ 0x6a, 0x33, 0xe1, 0xfd, 0x5d, 0x07, 0x0e, 0x6a, 0x2b, 0xd1, 0x2f, 0x73, ++ 0xb3, 0x66, 0xd4, 0x3f, 0x5f, 0x3e, 0x72, 0x95, 0x4d, 0xee, 0x9c, 0xd9, ++ 0xa7, 0x90, 0x7f, 0xb0, 0x26, 0xd7, 0x43, 0xf7, 0xeb, 0x99, 0xcf, 0x0c, ++ 0xcd, 0x9b, 0x30, 0x7c, 0x9f, 0x3f, 0x58, 0xc7, 0x6c, 0x70, 0xdd, 0x65, ++ 0xc5, 0x09, 0xd4, 0xb8, 0x36, 0x37, 0xad, 0xbd, 0x4b, 0xe7, 0xfe, 0xef, ++ 0x97, 0x8f, 0x28, 0xb6, 0x79, 0x2c, 0x3b, 0x20, 0x76, 0x8c, 0xeb, 0x85, ++ 0xd8, 0xdf, 0xfa, 0x29, 0x7e, 0x6e, 0xed, 0xdf, 0x1a, 0xe1, 0x77, 0x5b, ++ 0xfb, 0xb7, 0xc6, 0x0a, 0xc4, 0xab, 0x43, 0x93, 0x33, 0xc1, 0xd3, 0x8d, ++ 0xfb, 0x01, 0xf0, 0xf4, 0xac, 0xd3, 0xa9, 0xdc, 0xb9, 0x2e, 0x44, 0xe5, ++ 0xee, 0x75, 0x06, 0xed, 0xd3, 0x5e, 0xc4, 0x23, 0x94, 0x5d, 0x02, 0xee, ++ 0xc0, 0x54, 0x56, 0x8f, 0xdf, 0xe7, 0x0f, 0x98, 0x3c, 0xed, 0x38, 0xaf, ++ 0xc9, 0xac, 0xc7, 0xbb, 0x65, 0x79, 0x11, 0x5e, 0x2f, 0x58, 0x12, 0x25, ++ 0x3f, 0x64, 0x24, 0x3b, 0xc6, 0x2a, 0xf7, 0xba, 0xa2, 0x2d, 0xe8, 0x43, ++ 0x76, 0xee, 0xe8, 0x9f, 0xa5, 0x82, 0xdd, 0xb3, 0x57, 0x8b, 0xde, 0x8b, ++ 0x91, 0x2f, 0xbd, 0xe3, 0xb5, 0x59, 0x0d, 0x50, 0xff, 0x9b, 0x9c, 0xc8, ++ 0xc6, 0x1c, 0x92, 0x37, 0x61, 0x03, 0xf9, 0xce, 0xf2, 0xcf, 0xbf, 0x9e, ++ 0xc3, 0xe5, 0xee, 0xa6, 0xd1, 0x1a, 0xe1, 0x7b, 0xef, 0xd2, 0xc9, 0x8f, ++ 0x2b, 0x96, 0xff, 0x85, 0x71, 0xbf, 0xa5, 0x2b, 0x9f, 0x44, 0x7b, 0x02, ++ 0xfa, 0x6f, 0xcf, 0x21, 0xbe, 0x0d, 0xd3, 0x77, 0xba, 0x46, 0xea, 0x5f, ++ 0xb0, 0xac, 0xce, 0xd6, 0xbf, 0x60, 0xd9, 0x2a, 0xab, 0xff, 0x1e, 0xea, ++ 0xef, 0xb9, 0x70, 0xff, 0xbd, 0xcb, 0xae, 0xb3, 0xcf, 0xbf, 0xec, 0x2e, ++ 0xab, 0xff, 0xa3, 0x04, 0xbf, 0xef, 0xc2, 0xf0, 0x17, 0x34, 0x4f, 0xb5, ++ 0xcf, 0xdf, 0xbc, 0x9a, 0xfa, 0x7f, 0xc5, 0xcd, 0xf7, 0x77, 0x28, 0xd7, ++ 0x43, 0xf9, 0xf4, 0x1d, 0xde, 0x70, 0xc2, 0x45, 0xfe, 0x33, 0xa3, 0xef, ++ 0x73, 0xa8, 0x79, 0x97, 0x1f, 0xa2, 0xef, 0x27, 0x9d, 0x8f, 0x33, 0x0d, ++ 0x9a, 0xa8, 0x67, 0x7d, 0x4f, 0xe7, 0x56, 0xa3, 0x1c, 0x4b, 0xd1, 0xd1, ++ 0xf4, 0x6f, 0xe2, 0x3a, 0xfc, 0xc0, 0x5d, 0xe9, 0x74, 0x94, 0x53, 0x97, ++ 0x65, 0xe3, 0xab, 0x5c, 0x33, 0xcf, 0x56, 0xcf, 0x9f, 0x3d, 0xc6, 0xd6, ++ 0x7e, 0x54, 0xa4, 0xcc, 0xf6, 0xbe, 0x70, 0xd1, 0x95, 0x0e, 0xba, 0xf4, ++ 0xe9, 0x94, 0x07, 0xcb, 0xb8, 0x3e, 0x35, 0x31, 0xce, 0x09, 0x70, 0x6a, ++ 0x63, 0xf8, 0xf7, 0x9a, 0xea, 0xc7, 0x78, 0x68, 0x7d, 0x0f, 0xbc, 0xe4, ++ 0xa5, 0xfa, 0x03, 0xd7, 0xf1, 0xf5, 0x3d, 0x30, 0xc6, 0x47, 0x7c, 0x4c, ++ 0xba, 0x0b, 0xf6, 0xfd, 0x01, 0x2d, 0x7a, 0x75, 0xba, 0x7d, 0x0c, 0xeb, ++ 0x92, 0x30, 0xe4, 0xf5, 0xac, 0x1e, 0x1d, 0xc8, 0xa9, 0x4d, 0x7f, 0x6e, ++ 0xc8, 0xf8, 0x3c, 0x4b, 0xe1, 0xbf, 0x63, 0x97, 0xe5, 0xe6, 0xfa, 0x72, ++ 0x73, 0xe9, 0xe4, 0xc7, 0x63, 0x69, 0xf8, 0xdc, 0x52, 0x0c, 0xf4, 0x00, ++ 0xf5, 0x77, 0x72, 0x34, 0x5b, 0x9c, 0x67, 0x73, 0xf1, 0xca, 0x50, 0x4b, ++ 0xda, 0x3c, 0x9b, 0x8a, 0xb5, 0x45, 0x87, 0xaa, 0xf8, 0xf3, 0xdb, 0xd0, ++ 0x8e, 0xd7, 0x23, 0x7f, 0x87, 0xf3, 0x7d, 0x45, 0x1b, 0xba, 0x1c, 0xed, ++ 0x57, 0xe7, 0x3c, 0xee, 0xb2, 0x3a, 0xdb, 0x3c, 0x9e, 0x92, 0x55, 0x34, ++ 0x4f, 0xd2, 0x31, 0x8f, 0xbb, 0x64, 0x95, 0x63, 0x1e, 0xcf, 0xa2, 0x43, ++ 0xe2, 0xb9, 0x98, 0xe7, 0x34, 0xd2, 0xc9, 0x48, 0xf3, 0x6c, 0x2e, 0xbb, ++ 0xce, 0xbe, 0x9e, 0x92, 0xbb, 0x68, 0x9e, 0x5f, 0xe1, 0x3c, 0xb5, 0x69, ++ 0xeb, 0x29, 0xb9, 0xcb, 0x31, 0x4f, 0x16, 0x5f, 0x0f, 0x3c, 0x17, 0xf3, ++ 0xfc, 0xfa, 0x82, 0xeb, 0x29, 0x9f, 0x6a, 0x5f, 0xcf, 0xd8, 0xd5, 0x34, ++ 0xcf, 0xbf, 0x3b, 0xe6, 0x71, 0x8f, 0x5d, 0xed, 0x98, 0xc7, 0x47, 0xf3, ++ 0xe0, 0x73, 0x9c, 0x87, 0x15, 0x71, 0x3f, 0x4a, 0x73, 0x0f, 0xad, 0xa4, ++ 0xfd, 0xff, 0xbe, 0x97, 0x61, 0x1c, 0x48, 0x73, 0x47, 0xff, 0x8a, 0x2e, ++ 0xa9, 0xfc, 0xbd, 0x97, 0xe2, 0xc2, 0xd0, 0xca, 0xc4, 0x76, 0xff, 0x07, ++ 0x92, 0x4b, 0xc1, 0x3d, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xe5, 0x7d, ++ 0x09, 0x7c, 0x54, 0x45, 0x9a, 0x78, 0xbd, 0x7e, 0xef, 0xf5, 0x91, 0x74, ++ 0x77, 0x3a, 0xf7, 0x41, 0x08, 0x2f, 0xa0, 0x1c, 0x1a, 0x62, 0x07, 0x42, ++ 0x06, 0x10, 0xdd, 0xe6, 0x5c, 0x54, 0xc0, 0xe0, 0x09, 0x1e, 0xd0, 0xe1, ++ 0xc8, 0x9d, 0x74, 0x44, 0x9c, 0xc5, 0x11, 0x37, 0x0d, 0x51, 0x44, 0x44, ++ 0x6d, 0x14, 0x25, 0x68, 0x70, 0x1a, 0x0c, 0x0e, 0xb8, 0xa0, 0x81, 0x09, ++ 0x10, 0x20, 0x60, 0x03, 0xea, 0xe0, 0x8c, 0x47, 0xd8, 0x65, 0x54, 0xc6, ++ 0x19, 0x6c, 0x0e, 0x01, 0x21, 0x26, 0x0d, 0x5e, 0xb8, 0x73, 0xf8, 0xaf, ++ 0xef, 0xab, 0x7a, 0xe9, 0xf7, 0x3a, 0x1d, 0x60, 0x76, 0xe6, 0xff, 0xdf, ++ 0xd9, 0xfd, 0xc7, 0xdf, 0x4c, 0x51, 0xaf, 0xea, 0xd5, 0xab, 0xfa, 0xee, ++ 0xef, 0xab, 0xaf, 0xaa, 0xc9, 0xc0, 0x04, 0x42, 0x46, 0x10, 0x72, 0x20, ++ 0x8e, 0x96, 0xc3, 0x08, 0xf9, 0x2e, 0xc6, 0x7d, 0x9d, 0xc3, 0x4a, 0xc8, ++ 0x8f, 0xf0, 0xf7, 0x4f, 0x84, 0xfe, 0x79, 0x09, 0x49, 0xe6, 0x65, 0x0a, ++ 0x21, 0x73, 0x09, 0xff, 0xf3, 0x2f, 0x11, 0x48, 0x01, 0x21, 0xd5, 0x66, ++ 0x56, 0x9d, 0xb3, 0x69, 0x6a, 0xd6, 0x22, 0x28, 0x5b, 0xc6, 0xa6, 0x15, ++ 0xe5, 0xd3, 0x7f, 0xac, 0xb4, 0x39, 0xaf, 0x56, 0x08, 0xe9, 0x68, 0x19, ++ 0x6b, 0x9c, 0x9d, 0x13, 0x1e, 0x4f, 0x2d, 0xe7, 0xfa, 0xe4, 0x53, 0xc1, ++ 0x81, 0xec, 0xdd, 0x1f, 0x49, 0xf8, 0x3b, 0xde, 0x31, 0x64, 0x60, 0x0d, ++ 0xfd, 0x7e, 0x49, 0x9c, 0x03, 0xe7, 0xa3, 0xd6, 0x4f, 0xd5, 0xd2, 0xba, ++ 0x89, 0x90, 0xe3, 0xb5, 0x04, 0xcb, 0xd3, 0x32, 0x99, 0x59, 0x48, 0x9f, ++ 0x9f, 0xac, 0xa5, 0x13, 0x18, 0xa0, 0x9d, 0xef, 0x22, 0x7c, 0xef, 0x94, ++ 0x44, 0xff, 0x99, 0x44, 0xcb, 0x06, 0xc1, 0xef, 0x15, 0xe8, 0xba, 0x56, ++ 0x1c, 0x92, 0x49, 0x3f, 0xfc, 0xcc, 0xe1, 0x81, 0x74, 0x1d, 0x77, 0xf1, ++ 0x65, 0xcc, 0xf5, 0xc5, 0x12, 0x62, 0x0e, 0xcf, 0xc3, 0x63, 0x22, 0x2e, ++ 0x78, 0x2f, 0xb4, 0xd3, 0xe4, 0x5f, 0x27, 0xc0, 0x53, 0x57, 0x2f, 0x43, ++ 0x1a, 0x2d, 0xea, 0x13, 0x09, 0x51, 0xe7, 0xdb, 0x97, 0x90, 0x3f, 0xec, ++ 0x9d, 0xfc, 0xae, 0x60, 0xc7, 0x6a, 0x2f, 0xc3, 0x70, 0x42, 0xee, 0x59, ++ 0xba, 0xe5, 0x1d, 0xe8, 0xf6, 0xb1, 0x50, 0xd4, 0x7b, 0x1e, 0x5d, 0xef, ++ 0xb4, 0xe6, 0x15, 0x72, 0x2f, 0x5a, 0xef, 0x90, 0x83, 0x33, 0x9c, 0x56, ++ 0xcd, 0x38, 0xd3, 0xe4, 0xe3, 0xb0, 0x6e, 0x33, 0xfd, 0x0f, 0xc6, 0x99, ++ 0xee, 0xa6, 0x75, 0xcd, 0xf7, 0xef, 0x2d, 0xd5, 0xd7, 0xef, 0x27, 0x52, ++ 0xb8, 0x9e, 0x4d, 0xc8, 0xb5, 0x8e, 0xbe, 0x1c, 0x1f, 0xfc, 0xbb, 0x8a, ++ 0x5f, 0x06, 0x7c, 0xdd, 0x45, 0xd7, 0x94, 0x4e, 0x51, 0x78, 0x3f, 0x94, ++ 0x43, 0xa0, 0xd9, 0x81, 0xf8, 0x9a, 0xe1, 0x60, 0xef, 0xaa, 0xf3, 0xf1, ++ 0x3c, 0x22, 0x93, 0x00, 0xcc, 0x47, 0x0a, 0x26, 0x93, 0x1c, 0x68, 0x49, ++ 0xc6, 0x7e, 0x6e, 0xe8, 0xa7, 0x74, 0x9f, 0xdf, 0x0c, 0xd9, 0xec, 0x2a, ++ 0xa4, 0xf8, 0x9c, 0xf1, 0xb0, 0x88, 0x70, 0x8c, 0x9c, 0x6f, 0x70, 0x6f, ++ 0xac, 0xcb, 0x90, 0x4b, 0xcb, 0xfa, 0xaf, 0x65, 0xd2, 0xf7, 0xf2, 0xf3, ++ 0x9f, 0xb9, 0x40, 0xdf, 0x4e, 0xbc, 0xec, 0x7b, 0x2a, 0x5c, 0x55, 0x3a, ++ 0xb8, 0x7b, 0xda, 0xe8, 0xe7, 0x4f, 0x6a, 0xe8, 0x63, 0xba, 0xfb, 0xa6, ++ 0xe7, 0x4f, 0xea, 0xe0, 0x34, 0x55, 0x57, 0xbf, 0xbf, 0x66, 0xba, 0xae, ++ 0xff, 0xcc, 0x05, 0x45, 0xba, 0xf6, 0x22, 0x6f, 0x99, 0xae, 0x7d, 0xf6, ++ 0xd2, 0x07, 0x74, 0xf5, 0xb9, 0xbe, 0x87, 0x75, 0xfd, 0x4b, 0xea, 0x17, ++ 0xe9, 0xda, 0xcb, 0xfc, 0x4f, 0xea, 0xda, 0x2b, 0x36, 0xac, 0xd0, 0xd5, ++ 0xab, 0x9a, 0x56, 0xeb, 0xfa, 0x7b, 0x5a, 0xd6, 0xea, 0xda, 0x0d, 0x7b, ++ 0x07, 0xdd, 0x4a, 0x28, 0x1c, 0xeb, 0x7e, 0x2b, 0x12, 0x13, 0x85, 0xe3, ++ 0xb7, 0xd6, 0x53, 0xcf, 0x5c, 0x9f, 0x04, 0xa5, 0xe4, 0x04, 0xb8, 0x9f, ++ 0xa9, 0x4d, 0x43, 0xba, 0x3e, 0x5b, 0xab, 0x60, 0x59, 0x0d, 0xb4, 0x37, ++ 0x02, 0xf8, 0x67, 0xa8, 0xd9, 0x4d, 0xf1, 0xe4, 0x89, 0x09, 0x15, 0x93, ++ 0x78, 0x42, 0x1e, 0xf5, 0x8d, 0x5a, 0xba, 0x74, 0x14, 0xad, 0x1b, 0x69, ++ 0xfb, 0x48, 0x4a, 0xed, 0xbe, 0x31, 0x4b, 0xbd, 0x99, 0x84, 0x2c, 0x75, ++ 0x28, 0x48, 0xf7, 0x62, 0xbd, 0x91, 0x04, 0x28, 0xa9, 0x0a, 0x24, 0xa1, ++ 0x8b, 0xae, 0x43, 0xa2, 0xa6, 0x3d, 0x78, 0x99, 0xf6, 0x7a, 0x89, 0x04, ++ 0x86, 0x76, 0x6f, 0x17, 0x83, 0xd1, 0x9f, 0x77, 0x0a, 0xa1, 0xfe, 0x19, ++ 0x74, 0x1d, 0xde, 0x23, 0x26, 0xb2, 0x5e, 0xe8, 0xce, 0xe7, 0x61, 0xbe, ++ 0x24, 0xbd, 0x48, 0x5a, 0xcf, 0xed, 0xed, 0x06, 0x52, 0xda, 0xa4, 0x91, ++ 0x3b, 0xeb, 0x1d, 0x06, 0x9c, 0x4f, 0xb2, 0x63, 0xcc, 0x7a, 0x07, 0xa5, ++ 0x87, 0x4a, 0x23, 0xe3, 0xf7, 0xca, 0xad, 0xe9, 0x63, 0x88, 0x1d, 0xea, ++ 0x81, 0xfe, 0x35, 0xd6, 0x4b, 0x7c, 0xaf, 0x89, 0x4e, 0x26, 0x15, 0xc6, ++ 0x61, 0xfc, 0x52, 0xe6, 0xef, 0x15, 0xe6, 0x5f, 0xc4, 0x5f, 0x3f, 0x1d, ++ 0xdf, 0x0f, 0x88, 0x73, 0x37, 0x3a, 0xe8, 0xf7, 0xda, 0xf7, 0x89, 0xd3, ++ 0x60, 0x1e, 0x24, 0x70, 0x20, 0xeb, 0xf6, 0xc1, 0xf0, 0x7d, 0xd7, 0x7a, ++ 0x78, 0x4e, 0x5a, 0xe8, 0x20, 0xe9, 0x94, 0xbf, 0x6b, 0x5d, 0xcf, 0x9f, ++ 0xbc, 0x9a, 0x90, 0x4f, 0x6b, 0x27, 0x62, 0xf9, 0xbb, 0xda, 0xc2, 0xe7, ++ 0x4f, 0xca, 0x84, 0xfc, 0xbe, 0x76, 0x1a, 0xd6, 0x8f, 0xd6, 0xba, 0xb1, ++ 0x0c, 0xd6, 0x96, 0x62, 0x79, 0xbc, 0xb6, 0x06, 0xdb, 0x4f, 0xd6, 0x2e, ++ 0xc0, 0xfa, 0xa9, 0x5a, 0x2f, 0x96, 0x67, 0x6a, 0x97, 0x62, 0x79, 0xb6, ++ 0xd6, 0x87, 0xed, 0xed, 0xb5, 0xf5, 0x58, 0xef, 0xa8, 0xf5, 0x63, 0xa9, ++ 0xf2, 0x01, 0x95, 0x47, 0x33, 0x0b, 0x81, 0x4f, 0x0b, 0x0b, 0x0d, 0xc0, ++ 0xa7, 0xf3, 0x2c, 0x84, 0xff, 0xb1, 0xfa, 0x05, 0xbe, 0x06, 0x91, 0xfe, ++ 0xbb, 0x0d, 0xf9, 0xda, 0x99, 0x06, 0x7c, 0x7d, 0xc1, 0xfa, 0x5d, 0xff, ++ 0x0c, 0x4a, 0x6f, 0x17, 0x3e, 0xa5, 0xc4, 0x94, 0xdd, 0x33, 0x9c, 0x22, ++ 0xe9, 0xae, 0x67, 0xfc, 0xb9, 0x0c, 0x80, 0xbf, 0x62, 0x3f, 0x25, 0x9e, ++ 0xc4, 0xee, 0xed, 0x96, 0x18, 0x86, 0x1f, 0x8b, 0x81, 0x4c, 0x24, 0x54, ++ 0xfe, 0x3c, 0x79, 0xb5, 0x91, 0x48, 0xf4, 0xfb, 0x31, 0x6f, 0x5d, 0xbb, ++ 0x4e, 0xcc, 0xc6, 0xe7, 0x12, 0x90, 0x0e, 0x55, 0x1c, 0xce, 0xa9, 0xb6, ++ 0x28, 0xe3, 0x5f, 0x45, 0x10, 0x5f, 0x97, 0xc3, 0x93, 0xda, 0xff, 0xd4, ++ 0x4b, 0x7f, 0x2c, 0x98, 0x95, 0x03, 0xf8, 0xe9, 0x8b, 0x74, 0x12, 0x73, ++ 0x40, 0xac, 0x61, 0x78, 0x7b, 0xd5, 0x09, 0x78, 0xbb, 0x1c, 0xfc, 0x24, ++ 0xce, 0x5f, 0x91, 0x70, 0x14, 0xde, 0xfa, 0x43, 0x56, 0x90, 0xf6, 0xff, ++ 0x2a, 0x59, 0x85, 0x67, 0x5b, 0x16, 0xa1, 0xe5, 0xed, 0x8e, 0xc2, 0x33, ++ 0x40, 0x07, 0x17, 0x9a, 0x4d, 0xb8, 0xae, 0x0b, 0xad, 0xb1, 0x7e, 0x02, ++ 0x63, 0x38, 0x92, 0x90, 0x2e, 0x7a, 0x86, 0x1b, 0x9b, 0x47, 0xc5, 0x06, ++ 0x8b, 0x4f, 0x2b, 0x1f, 0xaa, 0x9a, 0xe2, 0x7d, 0x7a, 0x79, 0x91, 0xee, ++ 0xd3, 0xca, 0x8b, 0x0b, 0x07, 0x5f, 0xb5, 0x03, 0xdf, 0xcf, 0x4b, 0x13, ++ 0x7d, 0x27, 0x87, 0x02, 0x7d, 0xb8, 0x38, 0x7d, 0x30, 0xba, 0x53, 0xc7, ++ 0xaf, 0x6a, 0xca, 0xf6, 0x59, 0x75, 0xe3, 0xe8, 0xeb, 0x17, 0x7c, 0xc2, ++ 0xc4, 0x26, 0x94, 0xf3, 0x4a, 0xdc, 0x1d, 0x83, 0x7b, 0x9e, 0xe7, 0xbc, ++ 0x34, 0x23, 0x7e, 0xe7, 0xec, 0x86, 0x7e, 0x71, 0xf0, 0xdd, 0xb3, 0xb5, ++ 0x66, 0x1f, 0x7c, 0xa7, 0xbd, 0xd6, 0xe1, 0x63, 0xdf, 0x4d, 0xf3, 0x69, ++ 0xe9, 0xb2, 0x72, 0x41, 0xac, 0xef, 0x64, 0x62, 0x78, 0x7e, 0x3d, 0x8d, ++ 0xfb, 0xf7, 0x9e, 0x1f, 0x21, 0xcd, 0xe4, 0x84, 0x99, 0x20, 0xe8, 0x7f, ++ 0xec, 0xd7, 0x73, 0xff, 0x1e, 0xf1, 0x21, 0x7d, 0x63, 0x2c, 0x04, 0xfa, ++ 0x68, 0x95, 0xbf, 0x03, 0xbd, 0x13, 0x33, 0x50, 0xd5, 0x3b, 0x12, 0xd6, ++ 0xd5, 0x71, 0x3d, 0x4d, 0xa2, 0xd7, 0x74, 0x1d, 0x3c, 0xdf, 0xa4, 0xfb, ++ 0x1e, 0x7d, 0x4f, 0x39, 0xa5, 0xe2, 0xa9, 0xef, 0xa5, 0xf0, 0x2e, 0x91, ++ 0x53, 0xea, 0x3a, 0xa9, 0x9c, 0x1c, 0x4c, 0x65, 0x37, 0xd0, 0x29, 0x25, ++ 0x66, 0xc4, 0xb3, 0x9b, 0x8e, 0x18, 0x47, 0xc7, 0xeb, 0x94, 0xac, 0x4b, ++ 0x05, 0xfa, 0x1d, 0x53, 0xbc, 0x82, 0xed, 0x1e, 0xf8, 0x10, 0xa5, 0xa7, ++ 0x2a, 0x73, 0xd0, 0xe8, 0x56, 0x10, 0xdc, 0x6d, 0x60, 0x67, 0xcd, 0x1a, ++ 0xae, 0xf2, 0xbd, 0x72, 0xf7, 0x67, 0x94, 0xe4, 0xbe, 0xfc, 0x8d, 0x4c, ++ 0x96, 0x41, 0xfb, 0x9f, 0xe8, 0xe8, 0xb4, 0x5d, 0xe6, 0xad, 0x73, 0x48, ++ 0xa1, 0x9d, 0xd0, 0xef, 0xcd, 0x6a, 0xae, 0x98, 0x04, 0x72, 0xf2, 0xcb, ++ 0xed, 0xb7, 0x70, 0x3b, 0xc5, 0x57, 0x00, 0xeb, 0xfe, 0x8a, 0x18, 0x26, ++ 0x02, 0x9f, 0x7c, 0x45, 0xfe, 0xdd, 0x3e, 0x54, 0x63, 0x97, 0x4d, 0x89, ++ 0x37, 0xb2, 0xf9, 0x2d, 0x65, 0xfa, 0xd9, 0x4b, 0xff, 0x83, 0xf5, 0x51, ++ 0x3b, 0x4d, 0xa7, 0xaf, 0x4b, 0xea, 0xf5, 0xf5, 0x62, 0x72, 0x5b, 0x0a, ++ 0xf0, 0x43, 0xf1, 0x4a, 0x99, 0xf8, 0xe9, 0xdc, 0xcb, 0x40, 0xdf, 0xab, ++ 0xeb, 0xa6, 0x7c, 0x7f, 0x63, 0x3c, 0xb3, 0xe3, 0x4a, 0x48, 0xcd, 0x12, ++ 0xb0, 0x53, 0x96, 0xc9, 0x64, 0x1a, 0xe0, 0x7b, 0x96, 0x83, 0x48, 0xbd, ++ 0xa8, 0x9c, 0xa8, 0xda, 0xb1, 0xa6, 0xa0, 0x88, 0xd6, 0xef, 0x8c, 0x37, ++ 0x20, 0x5d, 0x9d, 0xa5, 0xf6, 0x9d, 0x42, 0xe5, 0x50, 0x59, 0x02, 0xb3, ++ 0x63, 0xca, 0x93, 0xfc, 0x46, 0x17, 0x6d, 0x3f, 0xd1, 0x3c, 0xf4, 0xae, ++ 0xeb, 0x09, 0xbc, 0xef, 0x5f, 0x02, 0x72, 0xcd, 0x6b, 0x23, 0xce, 0xf5, ++ 0xa4, 0x3b, 0xdc, 0x67, 0x2f, 0xd5, 0xcf, 0xef, 0x72, 0xf3, 0x8f, 0x9c, ++ 0x2f, 0x21, 0x8b, 0x71, 0xbe, 0xea, 0x3c, 0xd4, 0x71, 0xd5, 0x79, 0x88, ++ 0x1b, 0x04, 0x97, 0x3f, 0x8a, 0x3d, 0x3b, 0x3b, 0x5e, 0x08, 0xdb, 0xc9, ++ 0xb4, 0x7c, 0x30, 0x5e, 0x6f, 0xbf, 0x2e, 0x80, 0xba, 0xc6, 0xbe, 0x7d, ++ 0x34, 0xa2, 0xbe, 0x38, 0xa2, 0xae, 0xd2, 0x89, 0xcc, 0xe9, 0xc4, 0x14, ++ 0xef, 0x5e, 0x10, 0x9f, 0x0c, 0x74, 0x11, 0x9a, 0x80, 0x76, 0x1a, 0xa1, ++ 0xf4, 0x91, 0x13, 0xee, 0x67, 0x0c, 0xf7, 0x7b, 0xf4, 0x52, 0xfd, 0x4c, ++ 0xd0, 0x4f, 0xc4, 0x7e, 0x8b, 0x2f, 0xd5, 0xcf, 0x12, 0x1e, 0xef, 0x89, ++ 0x68, 0xfd, 0xaa, 0x76, 0x6c, 0xde, 0xee, 0xa5, 0xf4, 0x54, 0xfe, 0xe6, ++ 0x0b, 0x76, 0x42, 0xe5, 0xf9, 0x97, 0x92, 0x2f, 0xc5, 0x49, 0x9f, 0x57, ++ 0xae, 0x7f, 0xdc, 0x0e, 0x70, 0x3a, 0x23, 0x79, 0xed, 0x80, 0xef, 0x2f, ++ 0xfd, 0xe2, 0xc4, 0x68, 0xf0, 0xda, 0xdb, 0x05, 0x2f, 0x97, 0x55, 0x00, ++ 0x3f, 0x02, 0x49, 0x9b, 0xc2, 0xfd, 0xf5, 0xa7, 0xa6, 0x80, 0x9d, 0xf4, ++ 0xdd, 0x7a, 0xd9, 0x21, 0xd2, 0x2e, 0x9e, 0x0d, 0xa6, 0x80, 0x89, 0xd2, ++ 0x6f, 0x75, 0x73, 0xd9, 0x24, 0x92, 0x8b, 0xf5, 0x63, 0xac, 0xfe, 0xc4, ++ 0x79, 0x11, 0xea, 0x2d, 0x7a, 0x7c, 0x96, 0xff, 0xe2, 0x85, 0x14, 0xc5, ++ 0x86, 0x78, 0x60, 0xf6, 0x36, 0x09, 0xa0, 0xdd, 0x51, 0xdd, 0xf8, 0xc5, ++ 0x04, 0x90, 0xe3, 0x1e, 0x12, 0x42, 0x3a, 0x8c, 0x7c, 0x0f, 0xbe, 0x7f, ++ 0x31, 0x01, 0xf9, 0xbe, 0xc8, 0x18, 0xd7, 0xbd, 0x9d, 0xce, 0x13, 0xed, ++ 0x64, 0x0f, 0xe7, 0x33, 0x4f, 0xf3, 0x53, 0xe7, 0x45, 0x3b, 0x94, 0x37, ++ 0x9d, 0x06, 0x3e, 0xf3, 0x44, 0xd0, 0x51, 0x69, 0x97, 0x7e, 0x09, 0x1a, ++ 0x0b, 0xe9, 0x7c, 0xde, 0x8c, 0xb7, 0x25, 0x9d, 0xba, 0x96, 0x56, 0x7f, ++ 0x42, 0x7e, 0x02, 0xf2, 0x40, 0x85, 0x0b, 0xf1, 0x33, 0xbb, 0xa2, 0x6e, ++ 0xe3, 0xaa, 0xdc, 0x63, 0x74, 0x5e, 0xed, 0x8d, 0xbf, 0xb1, 0x0b, 0x39, ++ 0x5a, 0x39, 0xc2, 0xe8, 0xf1, 0x42, 0xd3, 0xec, 0x9f, 0xef, 0x52, 0x7a, ++ 0x96, 0x37, 0x1d, 0xdc, 0x2f, 0x0a, 0xbf, 0xe7, 0xc7, 0xf7, 0x94, 0x16, ++ 0x66, 0x07, 0x91, 0x56, 0x56, 0x56, 0xca, 0x01, 0x3b, 0xd8, 0x9d, 0x95, ++ 0x6b, 0x65, 0x27, 0xa5, 0x54, 0x52, 0xb9, 0xf9, 0xd5, 0xd7, 0x5e, 0x02, ++ 0x7f, 0xed, 0x88, 0x09, 0xfd, 0xb5, 0x8a, 0xcd, 0xef, 0x7c, 0x3c, 0x92, ++ 0xd6, 0x2b, 0xb6, 0xc8, 0x49, 0x93, 0xd8, 0x72, 0xac, 0x42, 0x4a, 0x18, ++ 0x3f, 0x1e, 0xfa, 0xbf, 0x05, 0x43, 0xc2, 0xf8, 0x28, 0xff, 0xe5, 0x3b, ++ 0x46, 0x65, 0x30, 0x7b, 0xbe, 0x30, 0x21, 0x8c, 0x97, 0x8a, 0x2d, 0xfb, ++ 0x8c, 0x64, 0x70, 0x77, 0x38, 0x8e, 0x6d, 0xda, 0x67, 0x0c, 0x5a, 0xa3, ++ 0xe0, 0xa7, 0xe9, 0xd8, 0x04, 0xb0, 0x5b, 0xea, 0x36, 0x7e, 0x6f, 0x04, ++ 0xff, 0xeb, 0xcb, 0xbd, 0x02, 0x49, 0xcd, 0xee, 0xfe, 0x7e, 0xe9, 0xda, ++ 0x77, 0x50, 0x2f, 0x02, 0x9c, 0x10, 0x9f, 0x1c, 0x5f, 0x5d, 0xf8, 0xeb, ++ 0x86, 0xb7, 0xc0, 0x94, 0x5d, 0xf9, 0xd8, 0xcf, 0x01, 0xf2, 0xf2, 0x72, ++ 0x78, 0xf3, 0x71, 0x39, 0x5d, 0xb5, 0xc3, 0x46, 0xe2, 0xe9, 0x3c, 0x4a, ++ 0x7f, 0x67, 0xf2, 0x4f, 0x02, 0x7c, 0xbe, 0xf1, 0xa0, 0x1d, 0xd6, 0x73, ++ 0x5a, 0xaa, 0x61, 0x74, 0xbe, 0xe6, 0xf1, 0x14, 0x17, 0xfd, 0x7e, 0xa9, ++ 0xec, 0x4d, 0x71, 0x60, 0xc9, 0x9e, 0x97, 0xbe, 0xf2, 0x10, 0xd2, 0x5f, ++ 0x89, 0x50, 0x93, 0xe2, 0x40, 0x7e, 0x72, 0xa5, 0x1b, 0x50, 0x76, 0x7b, ++ 0xd3, 0x61, 0x9d, 0x73, 0x1b, 0xee, 0xc4, 0x75, 0x16, 0x13, 0x37, 0xd2, ++ 0x61, 0xe9, 0x1a, 0xb1, 0xd0, 0x4f, 0xcb, 0x6f, 0x25, 0x32, 0x71, 0x4b, ++ 0x14, 0x3e, 0x29, 0x48, 0x60, 0x7c, 0x72, 0x7a, 0x1d, 0x45, 0x2e, 0x5d, ++ 0xe7, 0x69, 0xb0, 0xfb, 0xc1, 0xde, 0xfe, 0x77, 0xd1, 0xbf, 0x1e, 0xfd, ++ 0xd3, 0x07, 0x08, 0xc8, 0xff, 0x87, 0xf8, 0x9a, 0xa9, 0xa6, 0xc4, 0xfa, ++ 0xb7, 0x66, 0x86, 0x2f, 0x6b, 0x82, 0x41, 0xf5, 0x17, 0xcd, 0x3a, 0xfa, ++ 0x6d, 0x7c, 0xa2, 0x0d, 0xf0, 0x74, 0xb6, 0xb7, 0x2b, 0x15, 0xe6, 0x49, ++ 0xe1, 0xe0, 0xe5, 0x70, 0x13, 0x7e, 0xa4, 0xe3, 0x8a, 0x87, 0xc6, 0xa7, ++ 0x32, 0x3c, 0x11, 0x45, 0x2a, 0xe0, 0xef, 0x51, 0x7d, 0x30, 0x16, 0x9e, ++ 0x43, 0xff, 0x36, 0xd9, 0x65, 0xc9, 0xd5, 0xbd, 0xc7, 0xe5, 0x27, 0xfb, ++ 0xfe, 0x7c, 0xfe, 0x7d, 0x3a, 0xef, 0x18, 0xd0, 0x6f, 0xa7, 0x53, 0xa8, ++ 0x7d, 0x1f, 0x65, 0x7d, 0xb3, 0x60, 0x7d, 0xa8, 0x17, 0xa9, 0x9e, 0xd3, ++ 0xd0, 0x99, 0x86, 0xdf, 0x19, 0xff, 0x37, 0x3e, 0xc9, 0xf8, 0x5d, 0xe5, ++ 0x7f, 0xff, 0xd4, 0x89, 0xd0, 0xfe, 0xcd, 0x61, 0xc6, 0x47, 0xf0, 0x1e, ++ 0xe8, 0x13, 0x3a, 0xaf, 0x40, 0x2a, 0xb6, 0xef, 0xbb, 0x43, 0x40, 0xf9, ++ 0x60, 0x22, 0x81, 0x68, 0x7c, 0xde, 0x28, 0x73, 0x3e, 0xd7, 0xb7, 0x7b, ++ 0x28, 0xbf, 0x42, 0x9c, 0x40, 0xa5, 0x13, 0x3a, 0x7f, 0x49, 0x88, 0xd3, ++ 0xd2, 0x0b, 0xfd, 0x4e, 0x02, 0xe2, 0x01, 0xfd, 0x95, 0xe2, 0x95, 0xf4, ++ 0x7d, 0xad, 0x7d, 0x03, 0xdf, 0xc5, 0x7e, 0xc6, 0xf0, 0x73, 0x8d, 0x5e, ++ 0x29, 0xe1, 0x72, 0x21, 0x2f, 0x81, 0xca, 0x83, 0xd8, 0xb0, 0x3c, 0x20, ++ 0x0d, 0xc9, 0x57, 0x64, 0x47, 0x56, 0xca, 0xc4, 0x0b, 0x26, 0x67, 0xe5, ++ 0x11, 0x13, 0xfa, 0xe3, 0x95, 0x9b, 0xe5, 0x42, 0x58, 0xff, 0xb9, 0x4d, ++ 0x07, 0x3e, 0xbe, 0x87, 0xd2, 0xf9, 0xb9, 0x26, 0x95, 0x6f, 0xf5, 0x72, ++ 0x35, 0x92, 0x6f, 0x4b, 0xb7, 0xae, 0x17, 0x80, 0x4e, 0x23, 0xf9, 0xf6, ++ 0x5c, 0x29, 0xd5, 0xe2, 0xd1, 0xf8, 0x96, 0x3e, 0x8f, 0xca, 0xb7, 0xa5, ++ 0xc1, 0xff, 0xa7, 0x72, 0x55, 0x85, 0xdf, 0xf4, 0x04, 0xbd, 0x3c, 0xa5, ++ 0xf2, 0xb1, 0x0f, 0x98, 0x10, 0x3d, 0xc1, 0x31, 0x52, 0x3e, 0x7e, 0x0b, ++ 0xf6, 0x56, 0x72, 0x77, 0xf9, 0x48, 0xff, 0x0e, 0x93, 0x82, 0xee, 0x74, ++ 0xa8, 0xd2, 0x9f, 0x4a, 0x77, 0xd4, 0x82, 0xeb, 0x03, 0x72, 0xbd, 0x8b, ++ 0x3e, 0x55, 0xfa, 0xeb, 0xa2, 0x4f, 0x95, 0xfe, 0x22, 0xd7, 0xab, 0x87, ++ 0x5f, 0x64, 0x7b, 0x5f, 0xf0, 0x91, 0x28, 0x9d, 0x14, 0xee, 0xa4, 0x16, ++ 0x1d, 0xc5, 0x67, 0x65, 0xab, 0xe0, 0x37, 0x21, 0x9f, 0x7b, 0xdf, 0xed, ++ 0x95, 0x8f, 0x70, 0x72, 0xa1, 0x7a, 0x23, 0xbe, 0x77, 0x7b, 0x25, 0x69, ++ 0xeb, 0xfe, 0x88, 0x7a, 0x53, 0x44, 0x7f, 0x57, 0x44, 0xbd, 0x30, 0xa2, ++ 0xbf, 0x3b, 0xa2, 0x5e, 0xa3, 0xeb, 0x5f, 0xd9, 0x72, 0xc0, 0x48, 0x10, ++ 0xff, 0x01, 0x5d, 0x3f, 0xd3, 0x82, 0x97, 0xc9, 0x89, 0x28, 0xfe, 0xa0, ++ 0xaa, 0x7f, 0x3c, 0xcd, 0xe7, 0x8d, 0x5e, 0xa0, 0x8b, 0xcc, 0x90, 0x11, ++ 0xe4, 0x9e, 0xbc, 0x98, 0x9a, 0x6e, 0x10, 0x5f, 0xdb, 0x23, 0x62, 0x7c, ++ 0xad, 0x53, 0x09, 0xd9, 0x13, 0xe8, 0xf3, 0xc7, 0x2d, 0xcc, 0x4f, 0xeb, ++ 0x74, 0xf0, 0x7a, 0x3c, 0xab, 0x87, 0x92, 0x8d, 0x4b, 0x40, 0xee, 0xa9, ++ 0xcf, 0x43, 0x16, 0x82, 0xfe, 0x79, 0x67, 0x61, 0xc8, 0x1e, 0xaf, 0xf1, ++ 0xff, 0x8f, 0xb5, 0x8a, 0x76, 0x85, 0xb6, 0x07, 0xfd, 0x64, 0xa2, 0x36, ++ 0x8e, 0x10, 0x9e, 0x4f, 0x1d, 0xe2, 0x3b, 0x48, 0x7a, 0x6a, 0x67, 0x71, ++ 0xc3, 0xce, 0x18, 0x7b, 0x2e, 0x7e, 0x2f, 0x26, 0xcb, 0x0f, 0xf4, 0x37, ++ 0x5e, 0xb4, 0x66, 0x2d, 0x00, 0x7f, 0xcf, 0x27, 0x3a, 0x29, 0xf9, 0x90, ++ 0x39, 0x8b, 0xee, 0xb6, 0x13, 0x4a, 0x67, 0x9d, 0xad, 0xfd, 0x6e, 0x9d, ++ 0x46, 0x9f, 0xcf, 0x7d, 0x4f, 0x04, 0x73, 0x9b, 0xa2, 0xc7, 0x25, 0xa5, ++ 0x53, 0xba, 0x99, 0xcd, 0xe9, 0xf8, 0x0c, 0xf1, 0xbe, 0x38, 0x8a, 0xae, ++ 0x6f, 0x76, 0x2b, 0xb3, 0xc3, 0xe7, 0x2c, 0x8f, 0x4e, 0xf7, 0xe5, 0xbc, ++ 0x7f, 0xb1, 0x75, 0xbe, 0x11, 0xe4, 0x2b, 0xb5, 0xa3, 0x8f, 0x6b, 0xe3, ++ 0xa2, 0xe5, 0x64, 0x39, 0xd2, 0x5d, 0x69, 0x43, 0xc4, 0xf3, 0xd6, 0x5b, ++ 0x90, 0x3f, 0xca, 0x23, 0xf8, 0xc3, 0xcd, 0xfd, 0x87, 0x3d, 0x2a, 0x7f, ++ 0xe4, 0x91, 0x3c, 0x94, 0x2f, 0x84, 0x30, 0xff, 0x97, 0xcb, 0xe5, 0xf1, ++ 0x62, 0xce, 0xad, 0xd3, 0x28, 0x1e, 0x3a, 0x0f, 0x8a, 0xc4, 0xa4, 0x80, ++ 0x3f, 0x2b, 0x92, 0x25, 0xb0, 0xce, 0x4d, 0x82, 0x1f, 0xe2, 0x05, 0xc4, ++ 0x9b, 0x8c, 0x7c, 0x56, 0x4d, 0x42, 0x28, 0x0f, 0x55, 0x38, 0xb5, 0x03, ++ 0x1f, 0x0d, 0xe8, 0x59, 0x4e, 0xb5, 0x6f, 0xfb, 0x43, 0xc1, 0x23, 0x40, ++ 0x2f, 0xdb, 0x3f, 0xcb, 0x7d, 0x99, 0x96, 0xed, 0xdb, 0x8f, 0xf4, 0xdf, ++ 0x0d, 0xf5, 0x1d, 0x9f, 0x64, 0x7d, 0x46, 0xba, 0xf7, 0x1f, 0xbb, 0xf7, ++ 0x87, 0x19, 0xa0, 0xcf, 0x3a, 0xf7, 0x9a, 0x30, 0x2e, 0xd6, 0xb9, 0xf7, ++ 0x57, 0x59, 0x8f, 0x40, 0x7d, 0x97, 0x09, 0xe3, 0x62, 0x9d, 0x8b, 0x4d, ++ 0x2e, 0xe0, 0x03, 0xef, 0x5e, 0x9b, 0xff, 0x6a, 0x68, 0xef, 0xcd, 0xfc, ++ 0x87, 0xba, 0x3d, 0xdf, 0xe7, 0x06, 0x51, 0xbf, 0x3e, 0x86, 0x78, 0x3b, ++ 0x93, 0xc0, 0xfc, 0x97, 0x0b, 0xad, 0x7f, 0x3c, 0x2a, 0x24, 0x41, 0x49, ++ 0x57, 0x05, 0xf6, 0xc3, 0xde, 0x58, 0xe4, 0x23, 0xcf, 0x2e, 0x0b, 0xfa, ++ 0xeb, 0x9d, 0x7b, 0xbe, 0x2f, 0x70, 0x5b, 0xff, 0x7e, 0xeb, 0xa9, 0x36, ++ 0x12, 0x37, 0xd2, 0xa3, 0x8d, 0x4c, 0xdb, 0x0a, 0xf4, 0x1b, 0xcf, 0xe2, ++ 0xc7, 0x9e, 0xdd, 0x23, 0x5e, 0x5d, 0x44, 0xbf, 0x5f, 0xd5, 0xbc, 0xcf, ++ 0x38, 0x9b, 0xb6, 0x8f, 0x7d, 0xeb, 0xcf, 0xb9, 0x20, 0x3f, 0x3b, 0xb7, ++ 0x32, 0xbb, 0xa8, 0x43, 0x0e, 0xbe, 0x42, 0x9c, 0x84, 0x7c, 0x9d, 0x50, ++ 0xf2, 0xa4, 0x0c, 0x71, 0x3e, 0x60, 0xa6, 0x0c, 0x42, 0x9e, 0x4d, 0xdc, ++ 0x70, 0x93, 0x37, 0x27, 0x1a, 0x5c, 0x18, 0x1c, 0x3a, 0x29, 0x1c, 0x60, ++ 0x5d, 0x14, 0x2e, 0xa5, 0x20, 0xf7, 0x7b, 0x82, 0x47, 0x4c, 0xa2, 0x11, ++ 0xe9, 0xfd, 0x1f, 0x0f, 0x1e, 0xe7, 0x67, 0x30, 0xb9, 0xf6, 0x13, 0x02, ++ 0x71, 0xa1, 0x30, 0x5c, 0x04, 0x17, 0x7b, 0x6e, 0xf3, 0x9b, 0x05, 0x5c, ++ 0x3f, 0x7b, 0xbe, 0xf7, 0xfb, 0x5c, 0x90, 0x3b, 0xe7, 0x9a, 0x16, 0xa1, ++ 0xbd, 0x72, 0xb9, 0x75, 0x0f, 0x4a, 0xfc, 0x47, 0xa5, 0x83, 0xff, 0xea, ++ 0xba, 0x85, 0xc0, 0x95, 0xac, 0x7b, 0xe2, 0x3f, 0x2c, 0xbe, 0x19, 0xfd, ++ 0x7f, 0x98, 0xa0, 0xe0, 0x3c, 0x23, 0xf9, 0xa0, 0x3b, 0x9d, 0xef, 0xf8, ++ 0x29, 0xd6, 0xdf, 0xb0, 0x39, 0x71, 0xbe, 0x57, 0xc8, 0xff, 0xa5, 0xff, ++ 0xdb, 0xf0, 0xbe, 0x95, 0xe2, 0xdd, 0x7e, 0x79, 0xbc, 0x3f, 0xf1, 0x3f, ++ 0x16, 0xef, 0xef, 0x71, 0xbc, 0xdb, 0x1c, 0x26, 0x90, 0x67, 0x7b, 0xfe, ++ 0x8c, 0x71, 0x56, 0x75, 0xfd, 0x97, 0x5b, 0xf7, 0x6b, 0xff, 0x43, 0xd7, ++ 0xad, 0xda, 0xf1, 0xbf, 0x32, 0x28, 0x87, 0xf3, 0x68, 0xff, 0xf7, 0x88, ++ 0xef, 0x70, 0x7f, 0x3a, 0xcf, 0x86, 0xcc, 0x03, 0x87, 0xf2, 0x68, 0xeb, ++ 0x18, 0x81, 0x14, 0x46, 0xb3, 0x4f, 0x3e, 0x4e, 0x64, 0x7e, 0xe0, 0x18, ++ 0xc1, 0x80, 0xfe, 0x1f, 0x89, 0x17, 0xb8, 0xff, 0xc7, 0xfc, 0xa6, 0x5e, ++ 0xdc, 0x8e, 0xe8, 0x35, 0xbf, 0x18, 0xed, 0x8d, 0x5e, 0x99, 0x4f, 0xa3, ++ 0xdd, 0x40, 0x24, 0x65, 0x25, 0xec, 0xdf, 0xfd, 0x2a, 0x6b, 0xb6, 0x73, ++ 0x19, 0xf6, 0x18, 0xf2, 0xa9, 0x1b, 0xea, 0x8e, 0x1b, 0x78, 0x5d, 0xef, ++ 0x3f, 0xbe, 0x2c, 0x10, 0x97, 0x40, 0x6d, 0xd0, 0x5e, 0x59, 0xb7, 0x1c, ++ 0x04, 0xfb, 0x35, 0x33, 0x53, 0x44, 0xfb, 0x96, 0x96, 0x68, 0xd7, 0xbe, ++ 0x6d, 0x9f, 0xc8, 0x9e, 0x57, 0x1a, 0x75, 0x7e, 0xd3, 0x4d, 0x44, 0x53, ++ 0xa7, 0xeb, 0x9a, 0x90, 0xa4, 0xf7, 0x8b, 0xc6, 0xf1, 0xf1, 0xc6, 0x93, ++ 0xbe, 0x87, 0xf3, 0xe8, 0xfc, 0xc7, 0x9b, 0x65, 0x87, 0x9f, 0x82, 0xe8, ++ 0xa6, 0xd1, 0x6e, 0x09, 0xd6, 0x73, 0x53, 0xba, 0x40, 0x7c, 0x9a, 0xfd, ++ 0xa3, 0x71, 0x11, 0xfe, 0xd3, 0x56, 0x6a, 0x63, 0x6a, 0xe3, 0x6b, 0x7f, ++ 0x2d, 0xfc, 0xcc, 0x49, 0xcc, 0xcf, 0x1c, 0x23, 0xf4, 0x5d, 0x59, 0x08, ++ 0xf0, 0xeb, 0x2d, 0x62, 0xfc, 0xf0, 0xb2, 0xf0, 0x03, 0x63, 0x0f, 0xe1, ++ 0x95, 0xe7, 0x5f, 0x06, 0x76, 0x91, 0xe4, 0x64, 0xf0, 0x4b, 0xa8, 0x72, ++ 0x62, 0xfc, 0x95, 0xfb, 0xd5, 0xb0, 0xdd, 0x0c, 0xf6, 0x8a, 0x64, 0x5d, ++ 0xd2, 0x06, 0x7c, 0x2b, 0x11, 0xea, 0x17, 0xb3, 0xf9, 0xa3, 0x3f, 0xad, ++ 0xfa, 0xc5, 0x3d, 0xc1, 0x99, 0x70, 0x3f, 0x5b, 0xe2, 0x9f, 0x54, 0xe1, ++ 0x2e, 0x65, 0x8a, 0x2e, 0x8b, 0x7e, 0x3c, 0x84, 0x87, 0x8a, 0x8f, 0xbf, ++ 0x16, 0x0f, 0x2a, 0xfe, 0xfe, 0x56, 0x7c, 0xfc, 0x0e, 0xf0, 0x31, 0x2c, ++ 0x8c, 0x8f, 0xcc, 0x6f, 0x1c, 0x12, 0xf0, 0xe7, 0x58, 0xee, 0x0f, 0x8c, ++ 0xfb, 0xa6, 0x4d, 0xc4, 0x7a, 0xa6, 0x53, 0xc2, 0xfd, 0x17, 0xee, 0x0f, ++ 0x8c, 0xb6, 0xc6, 0x4b, 0xe0, 0x0f, 0xdc, 0x20, 0x1d, 0x12, 0x81, 0x2f, ++ 0x4b, 0xcc, 0x3b, 0xcb, 0x61, 0x1f, 0xc1, 0xec, 0x14, 0x90, 0xae, 0x07, ++ 0xb4, 0x1b, 0xd0, 0xdf, 0x31, 0xe7, 0x0b, 0x08, 0xf7, 0x81, 0xf5, 0x12, ++ 0xd6, 0x0f, 0x19, 0x1c, 0xc3, 0xc0, 0xd0, 0x9e, 0x72, 0xfd, 0x8e, 0x73, ++ 0x0f, 0x13, 0x88, 0x27, 0xbb, 0x8c, 0xcc, 0xf0, 0x2e, 0x64, 0xf1, 0xfc, ++ 0x3f, 0xfd, 0xf8, 0xe3, 0xa8, 0x02, 0x88, 0xab, 0xb0, 0xbf, 0x12, 0xfa, ++ 0xbf, 0xc9, 0xd4, 0x1f, 0x9b, 0xd3, 0x40, 0x02, 0x31, 0x14, 0x4e, 0x73, ++ 0x25, 0xe2, 0x85, 0x14, 0x87, 0xb9, 0x74, 0x51, 0xc7, 0x75, 0xf1, 0x60, ++ 0x7d, 0x1d, 0xfe, 0x6e, 0x4c, 0x09, 0x8f, 0x73, 0xb9, 0xfe, 0x3d, 0xc9, ++ 0x91, 0xbf, 0x77, 0xb9, 0x83, 0xca, 0xad, 0xe3, 0x57, 0x13, 0xb2, 0x13, ++ 0x4a, 0x16, 0xec, 0x97, 0xb4, 0x7e, 0xf3, 0x4f, 0x5a, 0x19, 0xbc, 0x3c, ++ 0xef, 0x13, 0x7f, 0x5f, 0x8c, 0x37, 0xb8, 0xc4, 0x42, 0xcd, 0x3e, 0xdb, ++ 0xbf, 0x24, 0x31, 0xf9, 0xb1, 0xe3, 0xf7, 0x5b, 0x87, 0x42, 0xfc, 0x6c, ++ 0x74, 0x67, 0x4e, 0x1c, 0x93, 0xa7, 0xf9, 0x06, 0xa0, 0x4b, 0x0f, 0xf7, ++ 0x0b, 0x2e, 0x10, 0x25, 0x0e, 0xf2, 0x15, 0x2e, 0xb4, 0xf6, 0x8b, 0xc3, ++ 0x7d, 0xc4, 0x83, 0xa2, 0xcd, 0x1d, 0x25, 0x6e, 0xb3, 0x91, 0xfb, 0xd3, ++ 0xff, 0x56, 0x8b, 0x41, 0x65, 0xd2, 0xd9, 0x48, 0x7c, 0x22, 0xf8, 0x4d, ++ 0x24, 0x84, 0xf1, 0x5b, 0x6f, 0xa3, 0x39, 0xea, 0x7e, 0xf0, 0xac, 0x24, ++ 0x03, 0xa7, 0x1b, 0x8e, 0x37, 0xfa, 0x27, 0x16, 0xc0, 0xbe, 0x05, 0xfb, ++ 0xfe, 0x5c, 0xfa, 0x6a, 0x9c, 0x16, 0x6f, 0xed, 0x93, 0xbe, 0x94, 0x72, ++ 0xbb, 0xe3, 0x01, 0xfe, 0x8e, 0x6b, 0xf6, 0x57, 0xfe, 0x56, 0xf8, 0x82, ++ 0xff, 0x0e, 0xf0, 0xdd, 0x68, 0x09, 0x4e, 0x28, 0x8c, 0x22, 0x3f, 0xe6, ++ 0x73, 0xf8, 0x4d, 0xd9, 0xff, 0x03, 0xc6, 0x3b, 0xaf, 0x69, 0x5d, 0x6b, ++ 0x00, 0xfa, 0xbd, 0xa6, 0xd1, 0xa0, 0xdb, 0x9f, 0xac, 0x4c, 0xe2, 0x7e, ++ 0xd7, 0x10, 0x32, 0x04, 0xe6, 0x35, 0x65, 0xbf, 0xc5, 0x96, 0x0f, 0x78, ++ 0x39, 0x28, 0x3a, 0x2d, 0x74, 0x7d, 0x9e, 0xd6, 0xf3, 0x46, 0x77, 0x94, ++ 0x7d, 0xae, 0x48, 0x78, 0xc2, 0xf8, 0x10, 0x47, 0x7f, 0x3d, 0x89, 0xed, ++ 0x0b, 0xec, 0x96, 0x9b, 0x66, 0x03, 0x5c, 0x77, 0x7f, 0x65, 0x26, 0x5e, ++ 0x8a, 0xdf, 0x9d, 0x46, 0x5f, 0x45, 0xb4, 0x79, 0x26, 0xa5, 0x30, 0x39, ++ 0x37, 0x97, 0x34, 0x3d, 0x98, 0x9b, 0xfd, 0x8f, 0x07, 0xdf, 0xd1, 0x9d, ++ 0xd6, 0xc0, 0x18, 0xf0, 0x33, 0x1b, 0x09, 0x8f, 0x6b, 0x44, 0xd2, 0x1f, ++ 0x41, 0x3a, 0xbe, 0xb0, 0x81, 0xf8, 0x41, 0x9f, 0x82, 0x5f, 0x0a, 0x72, ++ 0xe1, 0xc2, 0x26, 0x82, 0xfa, 0x9c, 0x82, 0xe4, 0x69, 0xf0, 0xab, 0x29, ++ 0xbf, 0xff, 0x93, 0x36, 0x4e, 0x33, 0xa0, 0x65, 0xcb, 0xbf, 0x81, 0x1d, ++ 0x50, 0xdd, 0x2a, 0x38, 0x0c, 0xb4, 0xbd, 0x5a, 0x0a, 0x1a, 0x21, 0x1e, ++ 0xeb, 0x69, 0x89, 0x17, 0x41, 0xef, 0xe6, 0x29, 0xc4, 0x85, 0xfb, 0xc3, ++ 0x92, 0x63, 0xf0, 0x1d, 0x1a, 0xbe, 0x78, 0x3d, 0x49, 0x42, 0xf8, 0x1e, ++ 0x18, 0xb9, 0xfb, 0x5e, 0xf8, 0xee, 0xd7, 0xed, 0x46, 0x02, 0xf6, 0x88, ++ 0xeb, 0xed, 0x90, 0x1d, 0xf4, 0xf6, 0xd7, 0xad, 0x43, 0x91, 0x0f, 0x7a, ++ 0x5a, 0xd7, 0x2f, 0x6b, 0x49, 0xf9, 0x38, 0x19, 0xc6, 0x61, 0xf2, 0x30, ++ 0x92, 0x1e, 0x72, 0x36, 0xc5, 0xe8, 0xea, 0xd7, 0x8b, 0xee, 0x0c, 0xe0, ++ 0xaf, 0x29, 0xa6, 0xe0, 0x7c, 0x67, 0x14, 0xfc, 0x4d, 0x4a, 0x66, 0x74, ++ 0x76, 0xc5, 0xf2, 0xcd, 0xff, 0xff, 0x99, 0x7c, 0x3b, 0xac, 0xca, 0x37, ++ 0xb7, 0x58, 0xa8, 0xe1, 0xa3, 0xa4, 0x64, 0x46, 0xf7, 0x1a, 0xf9, 0x96, ++ 0x1a, 0x4d, 0xbe, 0xcd, 0x13, 0x94, 0x54, 0x80, 0xfb, 0xbc, 0x3d, 0xfd, ++ 0x52, 0x01, 0xaf, 0xf3, 0xde, 0x93, 0x93, 0xa3, 0xc9, 0xb7, 0xcd, 0xb5, ++ 0x6c, 0xff, 0xef, 0x4d, 0xca, 0x8f, 0x50, 0x76, 0x36, 0x53, 0xf9, 0x76, ++ 0x9d, 0x46, 0xbe, 0x35, 0x53, 0xf9, 0x96, 0xdd, 0xfd, 0xbd, 0xbf, 0x5c, ++ 0xa9, 0x7c, 0xf3, 0xff, 0xf7, 0xf0, 0xdf, 0x66, 0x90, 0x6f, 0x51, 0xd6, ++ 0x1b, 0xcf, 0xe1, 0xa7, 0xca, 0xb7, 0xdc, 0xd6, 0x63, 0x28, 0xdf, 0x72, ++ 0x9b, 0x0d, 0x44, 0xd1, 0xd8, 0x0f, 0xe6, 0xe4, 0xcb, 0xc9, 0x37, 0x21, ++ 0xf9, 0x0e, 0xb0, 0x87, 0x0f, 0xca, 0xce, 0xd8, 0x28, 0xf4, 0xb3, 0x99, ++ 0xdb, 0xdf, 0x6f, 0xf2, 0xbc, 0x3d, 0xf8, 0x0e, 0xc8, 0xb9, 0x7f, 0x4e, ++ 0x66, 0xfb, 0xa5, 0x57, 0x2a, 0xe7, 0xd2, 0x53, 0x18, 0x9f, 0x5c, 0x56, ++ 0xce, 0xfd, 0x37, 0xc1, 0x59, 0x95, 0x73, 0xf3, 0xb6, 0x51, 0x39, 0x97, ++ 0x1d, 0x8d, 0x0e, 0x99, 0x9c, 0x9b, 0xb7, 0x93, 0xca, 0x39, 0x01, 0xe8, ++ 0x91, 0xc9, 0xb9, 0x79, 0x7b, 0x08, 0x8b, 0xbf, 0x45, 0xc8, 0xb7, 0x81, ++ 0xdd, 0xe4, 0x1b, 0xc1, 0xfe, 0xd5, 0x01, 0xf6, 0xbe, 0xa7, 0x25, 0x7b, ++ 0xd5, 0x7d, 0x74, 0xbc, 0x21, 0x2e, 0xd9, 0x69, 0xa6, 0xfd, 0x87, 0x84, ++ 0xe5, 0xdd, 0x30, 0xad, 0xbc, 0xfb, 0xe7, 0x64, 0x09, 0xe1, 0xdc, 0x4d, ++ 0xde, 0x1d, 0xbc, 0x32, 0x79, 0xb7, 0x8d, 0xcb, 0x3b, 0x2a, 0xc7, 0xfa, ++ 0x82, 0x7c, 0x8d, 0xa4, 0x0f, 0x67, 0x6b, 0x8c, 0xae, 0xbe, 0x7b, 0xc4, ++ 0xe9, 0x4d, 0xbf, 0x04, 0x7e, 0xf9, 0x40, 0xc4, 0xfd, 0xc5, 0x43, 0x06, ++ 0xb6, 0x0f, 0xf4, 0xe1, 0x88, 0xd3, 0xf9, 0x40, 0x5f, 0xab, 0xf9, 0x7c, ++ 0x3c, 0x9c, 0xfe, 0x3a, 0x6a, 0xbd, 0x38, 0xfe, 0xd8, 0xb7, 0xd9, 0xfa, ++ 0xaa, 0x36, 0xb1, 0xf8, 0x77, 0x75, 0x33, 0xb3, 0x0f, 0xab, 0x1b, 0x45, ++ 0xbf, 0x42, 0xff, 0x39, 0x61, 0xe4, 0x0f, 0x46, 0x98, 0x7f, 0xd9, 0x1e, ++ 0x81, 0xa4, 0xd2, 0xfa, 0x54, 0x93, 0xef, 0x45, 0x2b, 0xc8, 0xe0, 0x5f, ++ 0xc8, 0x84, 0xfb, 0x45, 0x93, 0xf2, 0x34, 0xf4, 0x30, 0x67, 0x78, 0x05, ++ 0xc6, 0xf1, 0xeb, 0x2c, 0xf6, 0x75, 0x84, 0xf2, 0xf1, 0x1c, 0x89, 0x98, ++ 0x21, 0x5e, 0x5f, 0x61, 0x9d, 0xf0, 0x25, 0xd8, 0xc1, 0x15, 0xc3, 0x59, ++ 0x7c, 0xbf, 0x82, 0x3f, 0x27, 0x3c, 0x6f, 0x40, 0xcd, 0x83, 0x2c, 0x6e, ++ 0x79, 0xe0, 0xdd, 0x5e, 0xa4, 0x7b, 0xfe, 0xc0, 0x14, 0x13, 0xc3, 0xe3, ++ 0x94, 0x57, 0x05, 0xff, 0xda, 0x6c, 0xc8, 0x5f, 0xd2, 0xb7, 0x57, 0x44, ++ 0xe4, 0x3f, 0x3e, 0xc3, 0xd7, 0x39, 0x55, 0x0c, 0x22, 0x5c, 0xc8, 0x47, ++ 0x62, 0xd4, 0x3c, 0x86, 0x67, 0x22, 0xe1, 0x71, 0x90, 0xc3, 0x83, 0xae, ++ 0x5f, 0x07, 0x0f, 0xbf, 0x10, 0x15, 0x1e, 0x14, 0xa3, 0x93, 0xf2, 0x52, ++ 0xc2, 0xeb, 0x2f, 0xfb, 0x20, 0xb8, 0x04, 0xe2, 0xf9, 0x65, 0xab, 0x05, ++ 0xdc, 0xf7, 0x55, 0xe1, 0x11, 0xb9, 0x4e, 0x15, 0x3e, 0x6a, 0x7c, 0xba, ++ 0x82, 0xbf, 0xef, 0x69, 0x7d, 0x00, 0xf7, 0xfd, 0x23, 0xd7, 0xaf, 0xc2, ++ 0xaf, 0xdb, 0xba, 0x55, 0x78, 0x46, 0xac, 0xdf, 0x97, 0xcc, 0xf7, 0xbd, ++ 0xf2, 0xc8, 0x50, 0xc8, 0xa7, 0xa1, 0xf4, 0x80, 0xf2, 0xc3, 0xfb, 0x6b, ++ 0x0a, 0x07, 0xfa, 0x9d, 0xc2, 0xd1, 0x57, 0xa7, 0x6a, 0xe5, 0xf1, 0x8b, ++ 0x1c, 0x0e, 0x43, 0x7d, 0xa3, 0xc7, 0xa6, 0x13, 0x80, 0x1b, 0xa9, 0x01, ++ 0xfa, 0x29, 0xae, 0x7f, 0xe0, 0xdd, 0x74, 0xba, 0xfe, 0x61, 0x9f, 0x2a, ++ 0x43, 0x40, 0x4d, 0x5e, 0x3f, 0xd2, 0xe4, 0x86, 0x7d, 0xd4, 0x8d, 0x96, ++ 0x10, 0xca, 0x37, 0x95, 0xbe, 0x4e, 0xab, 0xf4, 0xce, 0xc7, 0xd9, 0x9d, ++ 0x51, 0x33, 0x06, 0xfd, 0xf5, 0x16, 0xc1, 0x01, 0xf6, 0x85, 0x27, 0x60, ++ 0x41, 0x38, 0x7a, 0x28, 0x9d, 0x59, 0x68, 0x97, 0x03, 0xab, 0xbf, 0x9b, ++ 0xc0, 0xe1, 0xe8, 0x30, 0x21, 0x5f, 0x71, 0xbd, 0x43, 0xe1, 0x6e, 0x00, ++ 0x7f, 0x4a, 0xd5, 0x43, 0x14, 0xee, 0xc0, 0x37, 0x43, 0x5b, 0xcf, 0xe3, ++ 0x7e, 0x6e, 0x3e, 0x09, 0xe1, 0x7e, 0x49, 0x75, 0xbd, 0xe0, 0x0c, 0xd0, ++ 0x75, 0x54, 0xb7, 0x30, 0x78, 0xa9, 0xf2, 0x96, 0xfe, 0x59, 0xb5, 0xf8, ++ 0x88, 0x42, 0x8f, 0x52, 0x34, 0x7a, 0x24, 0x10, 0x24, 0x2e, 0x08, 0xeb, ++ 0xc1, 0x0a, 0xde, 0x6f, 0x8a, 0xc9, 0xf7, 0x31, 0xec, 0xc3, 0x4c, 0xa1, ++ 0xf4, 0xbe, 0x96, 0x84, 0xf1, 0x38, 0x90, 0xfe, 0x07, 0x78, 0x8c, 0xc4, ++ 0x93, 0x0a, 0xcf, 0xcb, 0xd1, 0xe7, 0x17, 0xdc, 0xfe, 0xd8, 0x0c, 0x70, ++ 0xb4, 0x02, 0xbc, 0x42, 0xcc, 0x8e, 0x0a, 0x50, 0xbd, 0x60, 0x0b, 0xb7, ++ 0x7b, 0x24, 0xaf, 0x0e, 0x8e, 0x63, 0x5f, 0xba, 0xc8, 0xe8, 0x6b, 0x8f, ++ 0xa0, 0xc0, 0x7e, 0x42, 0x17, 0x9c, 0x80, 0x5e, 0x69, 0xfb, 0xb0, 0x56, ++ 0x46, 0xaf, 0x00, 0x37, 0x05, 0xe0, 0xde, 0x5a, 0x24, 0x42, 0xbd, 0x98, ++ 0xc2, 0x37, 0x31, 0xbb, 0xfb, 0x3a, 0x61, 0xff, 0x52, 0xcb, 0xbf, 0x65, ++ 0x7b, 0x8e, 0xb1, 0xf1, 0xd7, 0x08, 0x4e, 0x12, 0x85, 0x7e, 0xd5, 0x75, ++ 0xf7, 0x44, 0xbf, 0x7f, 0x2b, 0xdd, 0x9e, 0x8e, 0xa0, 0xdb, 0x0f, 0x2d, ++ 0xa1, 0xf7, 0x87, 0x02, 0xdd, 0xee, 0x11, 0x58, 0x1c, 0xa1, 0x35, 0x5e, ++ 0xb7, 0xef, 0x68, 0x4a, 0x61, 0xfb, 0xee, 0x1b, 0x2d, 0x94, 0xbe, 0x61, ++ 0xbf, 0xeb, 0x3d, 0xd9, 0xb9, 0x4e, 0xe9, 0xce, 0xe7, 0x17, 0x39, 0x3c, ++ 0xc1, 0xfe, 0x57, 0x34, 0x71, 0xa9, 0x41, 0xb0, 0x00, 0xd8, 0x0b, 0xdc, ++ 0x60, 0xc6, 0xfc, 0x33, 0x9c, 0x47, 0x5f, 0x66, 0x5f, 0x6a, 0xe5, 0xeb, ++ 0x66, 0x0b, 0x49, 0xbe, 0x23, 0xbf, 0xe7, 0xf1, 0x8d, 0xdc, 0x1f, 0xe8, ++ 0xc9, 0xbe, 0x51, 0xeb, 0x83, 0xe1, 0x7b, 0x20, 0xf7, 0x5a, 0xe8, 0xf7, ++ 0x06, 0x86, 0xbf, 0x17, 0x29, 0xdf, 0x55, 0x7f, 0xff, 0x72, 0xeb, 0x4a, ++ 0x4c, 0xf9, 0xdb, 0xd6, 0xd5, 0x95, 0xbf, 0x49, 0xda, 0x70, 0xff, 0xc9, ++ 0x14, 0xef, 0x7e, 0x24, 0x09, 0xe3, 0x3f, 0x2c, 0x3f, 0xe9, 0x2e, 0x9e, ++ 0x9f, 0x44, 0x67, 0x80, 0x76, 0x96, 0xa6, 0x5f, 0x5a, 0xf2, 0xb0, 0x9e, ++ 0xfb, 0x91, 0x34, 0x33, 0xea, 0xe1, 0x07, 0x79, 0x5e, 0xfc, 0x78, 0xd1, ++ 0x4a, 0xbc, 0x74, 0x1d, 0x5f, 0xbb, 0x64, 0xa4, 0x53, 0xaa, 0xa5, 0x7f, ++ 0x3b, 0x0a, 0xe4, 0xf2, 0x18, 0xaa, 0x47, 0x68, 0xf1, 0xf5, 0xfb, 0xc3, ++ 0x3e, 0xb9, 0x0f, 0xdb, 0x45, 0xdc, 0x8f, 0xba, 0xf5, 0x83, 0xc4, 0x2a, ++ 0xd8, 0xa7, 0xbb, 0x15, 0x84, 0x11, 0x7d, 0x7e, 0x6b, 0x9e, 0x80, 0xfa, ++ 0xf7, 0x10, 0x0c, 0x36, 0x02, 0xec, 0x58, 0x33, 0x71, 0x99, 0x38, 0x09, ++ 0xd3, 0xf6, 0xe1, 0x3f, 0x89, 0xf7, 0x2f, 0xa3, 0xed, 0x79, 0x8d, 0xbe, ++ 0xb1, 0x0a, 0xe5, 0xa7, 0x21, 0x1b, 0xfc, 0x75, 0x50, 0x3a, 0xc7, 0x86, ++ 0x92, 0x3e, 0x04, 0xf8, 0x8d, 0x16, 0x09, 0xc0, 0xaf, 0xcd, 0x95, 0x38, ++ 0x16, 0xf4, 0xd7, 0x83, 0x5f, 0x90, 0x3c, 0x51, 0x41, 0x3d, 0x8b, 0xe3, ++ 0x0c, 0x39, 0x48, 0x92, 0xa1, 0xdf, 0x48, 0x57, 0x32, 0xba, 0x03, 0x23, ++ 0x9a, 0x57, 0x8e, 0x85, 0xf8, 0xe8, 0xd4, 0x03, 0x56, 0x2b, 0xd0, 0xf9, ++ 0xc0, 0x06, 0x03, 0x71, 0x6b, 0xe8, 0x77, 0x24, 0xf1, 0xd7, 0xc1, 0x3e, ++ 0xfc, 0x88, 0x93, 0xae, 0xdb, 0x81, 0xff, 0x4a, 0xa9, 0xbd, 0x00, 0x71, ++ 0xe7, 0xd2, 0xd6, 0xb5, 0x75, 0x76, 0xa8, 0x37, 0x08, 0x4e, 0x85, 0x8e, ++ 0xef, 0xf1, 0xba, 0x27, 0xd8, 0xe9, 0xbc, 0x36, 0xd7, 0x9f, 0x9f, 0x70, ++ 0x2d, 0xf0, 0x21, 0xed, 0x07, 0xc3, 0x78, 0x1a, 0x58, 0x3f, 0x4f, 0xa3, ++ 0xe0, 0x84, 0x54, 0xd9, 0xe2, 0xd6, 0x15, 0x98, 0x8f, 0x53, 0xdc, 0x28, ++ 0x10, 0x07, 0xf4, 0xf7, 0x0b, 0xc4, 0xcc, 0xc6, 0xf5, 0x9b, 0xe9, 0xb8, ++ 0x9b, 0x1b, 0xe8, 0xfb, 0xb4, 0x5e, 0x02, 0xef, 0xc3, 0xb8, 0x8d, 0xe7, ++ 0x0f, 0xdf, 0x0e, 0x7c, 0xfe, 0xbe, 0xc8, 0xde, 0xdf, 0xc4, 0xf6, 0xad, ++ 0x8b, 0xe9, 0x7b, 0x0a, 0xd0, 0x6b, 0xe3, 0x03, 0x38, 0x5e, 0x59, 0x83, ++ 0x40, 0xd2, 0xe8, 0x78, 0xa5, 0x9b, 0x98, 0xfc, 0x2f, 0x7d, 0x5f, 0x76, ++ 0x42, 0x7b, 0xf3, 0xbe, 0xd5, 0xa8, 0xc7, 0x26, 0xd1, 0xef, 0xa5, 0x67, ++ 0x83, 0xbc, 0x0f, 0x8c, 0x83, 0x3a, 0x19, 0x2a, 0x38, 0xc0, 0xde, 0x26, ++ 0x99, 0xf7, 0x20, 0x5f, 0x77, 0x72, 0xbe, 0x26, 0xed, 0xd3, 0x98, 0xdc, ++ 0x10, 0x78, 0x9d, 0xfb, 0x0d, 0xaa, 0xdd, 0xb4, 0x3f, 0x85, 0xe5, 0x07, ++ 0x17, 0x3b, 0x17, 0x19, 0x13, 0xe9, 0x38, 0x1f, 0x0e, 0x4f, 0xce, 0x86, ++ 0x34, 0x01, 0x4f, 0xcb, 0x79, 0xdc, 0x8f, 0x3e, 0x49, 0xe1, 0xec, 0xa6, ++ 0x70, 0x3e, 0xc4, 0xf3, 0x39, 0x0e, 0x0c, 0x3f, 0x61, 0x0c, 0x6a, 0xf4, ++ 0xcf, 0xe7, 0x29, 0xfd, 0x90, 0x0e, 0xe7, 0xb4, 0x8c, 0xc6, 0x3c, 0x87, ++ 0xb9, 0xa4, 0x10, 0xf3, 0x1c, 0xa6, 0x8c, 0x60, 0xf6, 0xda, 0x47, 0x37, ++ 0x58, 0xfc, 0x02, 0x9d, 0xd7, 0x47, 0x72, 0x28, 0x13, 0x9e, 0x1f, 0xb8, ++ 0xc1, 0x84, 0xf6, 0x6f, 0xc7, 0x66, 0x19, 0xf7, 0x8b, 0x3b, 0x7a, 0x07, ++ 0x31, 0x3e, 0x7d, 0xba, 0x41, 0x26, 0x90, 0xaf, 0x51, 0xd7, 0x20, 0xa2, ++ 0x5c, 0x3c, 0xbd, 0x89, 0xe9, 0x71, 0x71, 0xcd, 0x9d, 0x13, 0xd2, 0x01, ++ 0x7e, 0xeb, 0x05, 0x27, 0xc8, 0xcd, 0x03, 0x0d, 0x63, 0x8d, 0xa0, 0xd7, ++ 0x4e, 0xfb, 0x05, 0x7c, 0x7f, 0xec, 0x9a, 0x87, 0x52, 0x98, 0x1f, 0xc3, ++ 0xe4, 0xa1, 0xea, 0xb7, 0x15, 0x3b, 0xca, 0x74, 0xfa, 0x23, 0x52, 0xbe, ++ 0xa9, 0xf2, 0xaf, 0x8a, 0xc3, 0x21, 0x52, 0xce, 0x55, 0xa9, 0x7a, 0x26, ++ 0x42, 0xce, 0x55, 0xc1, 0x7e, 0xb3, 0x1d, 0x4a, 0xfd, 0x73, 0x0f, 0xb1, ++ 0x32, 0xf9, 0x07, 0x76, 0x3f, 0xe0, 0x3d, 0xf0, 0x03, 0xd2, 0x6f, 0xf5, ++ 0xfb, 0x32, 0x01, 0xbb, 0x5f, 0x38, 0xd1, 0x3e, 0x01, 0xf3, 0xb6, 0x40, ++ 0x6f, 0xd2, 0xf6, 0x11, 0xad, 0x82, 0x0b, 0xf6, 0xf9, 0x4b, 0x3f, 0x35, ++ 0xf9, 0xd1, 0x5e, 0xf5, 0x17, 0xcd, 0xfc, 0x19, 0xc8, 0xef, 0x23, 0x26, ++ 0x22, 0x28, 0x90, 0x07, 0x4f, 0xe1, 0x4e, 0xe5, 0xc2, 0x70, 0x53, 0xe8, ++ 0xf7, 0xcf, 0xd3, 0xe7, 0x5f, 0x1e, 0x32, 0x43, 0x86, 0x0c, 0xa5, 0x93, ++ 0x22, 0x84, 0xb3, 0x9a, 0x2f, 0x9a, 0xbf, 0x9e, 0xe5, 0xb7, 0xe4, 0x1f, ++ 0x5a, 0x99, 0x52, 0x0c, 0x70, 0x18, 0x97, 0x88, 0x72, 0xb6, 0xa4, 0x5e, ++ 0x24, 0x6e, 0x8d, 0xbc, 0xf8, 0x52, 0x70, 0xdd, 0x7e, 0x0f, 0x93, 0xc7, ++ 0x8e, 0xf5, 0x1a, 0x79, 0x94, 0x6f, 0xf4, 0x15, 0x83, 0xfe, 0x72, 0xa4, ++ 0x32, 0x39, 0xa8, 0xac, 0x97, 0x21, 0x67, 0x84, 0x6c, 0xe3, 0xf2, 0x89, ++ 0xda, 0xd3, 0x2e, 0xb0, 0x1b, 0xca, 0x76, 0xae, 0x48, 0x31, 0xd2, 0x7e, ++ 0x4b, 0x78, 0x3e, 0x48, 0xd9, 0x9e, 0x15, 0x29, 0x54, 0x34, 0x90, 0x3a, ++ 0xd0, 0x5b, 0xb4, 0x7f, 0x99, 0x91, 0x8d, 0x5f, 0xb6, 0x57, 0x70, 0xac, ++ 0xd5, 0x8c, 0xaf, 0xbe, 0xaf, 0x8e, 0xa7, 0x8e, 0x63, 0xdc, 0xa9, 0x1f, ++ 0xa7, 0xdf, 0x1e, 0x5e, 0xbf, 0xc2, 0x71, 0xd4, 0x79, 0xa8, 0xdf, 0xef, ++ 0xc9, 0x1e, 0x1f, 0xfe, 0x1f, 0x17, 0x57, 0x0a, 0x74, 0xbc, 0xe1, 0x1f, ++ 0x89, 0x98, 0xa4, 0x3c, 0xfc, 0xc4, 0xa4, 0x7e, 0xda, 0xfd, 0x0e, 0xb5, ++ 0x54, 0xe3, 0xaf, 0x05, 0x87, 0x0d, 0xc4, 0xa5, 0x81, 0xdb, 0xf0, 0xdf, ++ 0xc7, 0x10, 0x97, 0x86, 0x2e, 0x9a, 0x87, 0x51, 0xfe, 0xa6, 0x78, 0x9b, ++ 0xdc, 0xc2, 0xec, 0xa1, 0xe6, 0x61, 0xc7, 0x8c, 0x55, 0xf9, 0x58, 0x77, ++ 0x00, 0x3f, 0x57, 0xf3, 0x38, 0x6d, 0xf5, 0x38, 0xb6, 0x6f, 0xd5, 0x9c, ++ 0x77, 0xe8, 0x31, 0xe0, 0xef, 0x49, 0xf9, 0x02, 0xd2, 0x01, 0xf1, 0xba, ++ 0x8d, 0x89, 0x49, 0x68, 0x07, 0x29, 0x10, 0x1f, 0x2f, 0xc9, 0x67, 0xef, ++ 0x97, 0xd0, 0xf7, 0x81, 0xef, 0x9a, 0x57, 0x33, 0x3e, 0xa4, 0xf2, 0x40, ++ 0x01, 0x79, 0x51, 0xdd, 0xb0, 0x62, 0x02, 0xf6, 0x6f, 0x14, 0x14, 0x18, ++ 0xbf, 0x79, 0x6d, 0x11, 0xea, 0xf9, 0xd2, 0xe1, 0x22, 0xc1, 0xf6, 0xc6, ++ 0x63, 0x68, 0x77, 0x94, 0xb6, 0x1c, 0x4b, 0x02, 0x7e, 0xa5, 0xfc, 0xb9, ++ 0x12, 0xf4, 0x6e, 0xf5, 0x28, 0x93, 0x03, 0xf8, 0x43, 0xe5, 0x3b, 0x95, ++ 0x8f, 0x3f, 0x92, 0x59, 0x7e, 0x08, 0x31, 0x3b, 0x06, 0xc3, 0x39, 0x80, ++ 0x92, 0x14, 0x25, 0x2a, 0xff, 0x8a, 0xef, 0x13, 0xe6, 0xa7, 0x6e, 0x92, ++ 0x91, 0xef, 0x3c, 0xc3, 0x19, 0x5f, 0x7e, 0xb4, 0x59, 0x44, 0x7e, 0x3e, ++ 0x70, 0xc3, 0xdd, 0x13, 0x80, 0x0f, 0x3b, 0xd6, 0x0b, 0x3d, 0xf0, 0x31, ++ 0xe5, 0xd3, 0xfc, 0x30, 0x9f, 0x8a, 0x6b, 0x58, 0xbe, 0x4e, 0xc9, 0x46, ++ 0xe6, 0xaf, 0x1c, 0x68, 0x60, 0xf2, 0xe1, 0x74, 0x33, 0xb3, 0x13, 0xc7, ++ 0xae, 0x91, 0x27, 0x43, 0xbd, 0xe4, 0x03, 0x99, 0xb0, 0xb8, 0x17, 0xb3, ++ 0x07, 0xaf, 0x94, 0x9f, 0xbb, 0xd9, 0x29, 0x1b, 0xa2, 0xf3, 0x73, 0x4f, ++ 0xfc, 0x3b, 0x45, 0x6e, 0xfa, 0xf8, 0x41, 0x3a, 0xbf, 0x5b, 0xdf, 0xa0, ++ 0xf3, 0x57, 0xc2, 0xf0, 0x1a, 0x7b, 0xe3, 0xc3, 0x76, 0x8c, 0xd3, 0xdf, ++ 0x38, 0x1d, 0xd7, 0xab, 0xca, 0xa1, 0x62, 0x89, 0xe5, 0x33, 0xcd, 0xf1, ++ 0x2d, 0x62, 0xf9, 0xbe, 0x12, 0xcb, 0x7b, 0xfb, 0xab, 0xe7, 0x15, 0x31, ++ 0x8f, 0x27, 0x52, 0x6c, 0x61, 0x39, 0x22, 0x02, 0xbd, 0xc7, 0xb3, 0x3c, ++ 0xe9, 0x46, 0x19, 0xe9, 0x3d, 0x92, 0x1f, 0xff, 0x56, 0x3e, 0xfa, 0x7b, ++ 0xf1, 0xf5, 0x36, 0x4e, 0x47, 0xea, 0x7c, 0xc4, 0x3d, 0xec, 0x7d, 0xc8, ++ 0x2b, 0x0b, 0x50, 0x38, 0xfe, 0x6a, 0xd3, 0xab, 0x98, 0xd7, 0xfa, 0xd5, ++ 0xeb, 0xc7, 0xa6, 0x00, 0x9e, 0x2b, 0x76, 0x53, 0xfa, 0xa5, 0xeb, 0xed, ++ 0xd8, 0x64, 0x23, 0x01, 0x90, 0x5b, 0x92, 0x1f, 0xf5, 0x4d, 0x79, 0xb3, ++ 0x88, 0xf9, 0xe3, 0x44, 0x0a, 0x14, 0xdc, 0x6e, 0xd3, 0xf2, 0x27, 0xcb, ++ 0x4f, 0xaa, 0x78, 0xd3, 0x86, 0x74, 0x53, 0xbe, 0x95, 0xe5, 0x9d, 0x96, ++ 0x6f, 0x3f, 0x91, 0x8b, 0xf9, 0x22, 0x8b, 0x43, 0x98, 0x77, 0xe5, 0x7d, ++ 0x9d, 0xdb, 0x9b, 0xde, 0x60, 0x2e, 0xd0, 0x77, 0xb9, 0xc4, 0xf2, 0xa4, ++ 0x22, 0xf9, 0x7d, 0x74, 0x2a, 0xb3, 0x3f, 0xdb, 0x77, 0xc6, 0x4e, 0x83, ++ 0x75, 0x08, 0x1b, 0xf6, 0xe1, 0x7e, 0x6b, 0x79, 0xd3, 0xdd, 0x32, 0xd0, ++ 0x5f, 0x97, 0xfc, 0x48, 0x95, 0xd5, 0x7e, 0xb8, 0x8f, 0xe9, 0xa5, 0xf4, ++ 0x0b, 0xfb, 0xec, 0x30, 0xbf, 0xa9, 0x83, 0xb5, 0xf3, 0x5b, 0x84, 0x78, ++ 0x6a, 0xdf, 0xc8, 0xf8, 0xbf, 0xbc, 0x45, 0xf6, 0x5b, 0x60, 0x7e, 0x1b, ++ 0xd6, 0x62, 0x3c, 0xdb, 0xb3, 0xe1, 0x3c, 0xe6, 0xc7, 0x8f, 0x7d, 0x73, ++ 0x33, 0xc6, 0x11, 0x3c, 0x2d, 0xa2, 0x3e, 0x2f, 0x72, 0x83, 0x18, 0x30, ++ 0x61, 0xfe, 0xa6, 0x78, 0xcc, 0x84, 0x7e, 0x8d, 0x3e, 0x3f, 0xb1, 0xba, ++ 0xb9, 0x0a, 0xf7, 0xdd, 0xaa, 0x9b, 0x78, 0xfe, 0x5f, 0x44, 0x5e, 0x5c, ++ 0xc5, 0x9b, 0x7b, 0xb6, 0x7b, 0x29, 0x68, 0x2a, 0x7e, 0xf9, 0x0b, 0x3b, ++ 0xc8, 0x83, 0xb3, 0x6d, 0xeb, 0xed, 0x00, 0x4f, 0x3a, 0x1e, 0xe6, 0x15, ++ 0xde, 0xf8, 0x8d, 0xa4, 0xcb, 0x8f, 0xea, 0x39, 0x1f, 0xd8, 0xa5, 0xcf, ++ 0x37, 0x6c, 0x7a, 0x92, 0xe7, 0x1b, 0x4e, 0x3e, 0x4d, 0x72, 0xbb, 0xe7, ++ 0x1b, 0x9e, 0x85, 0x7f, 0x80, 0xbe, 0x49, 0x8d, 0xc8, 0xd7, 0xdc, 0x90, ++ 0xc8, 0xf3, 0xbb, 0x03, 0x05, 0x85, 0x51, 0xe2, 0xf9, 0x5d, 0xe7, 0x7e, ++ 0x36, 0x7f, 0xfb, 0x0a, 0xe4, 0xc9, 0xb7, 0x6f, 0x3d, 0xf7, 0x0a, 0xcc, ++ 0xbf, 0xf2, 0x2f, 0x5f, 0xbf, 0x02, 0xf9, 0x4d, 0x64, 0xaf, 0x05, 0xf5, ++ 0x94, 0xe7, 0xf5, 0xdf, 0x62, 0x5e, 0xb1, 0xfa, 0xde, 0xa2, 0x54, 0x46, ++ 0x6f, 0x1d, 0x1b, 0x7f, 0x81, 0x79, 0xd9, 0x1d, 0x47, 0x4c, 0xe8, 0xef, ++ 0x74, 0xec, 0x39, 0x9d, 0x05, 0xf9, 0x6d, 0x1d, 0x5b, 0x7e, 0x48, 0x81, ++ 0xf8, 0xdc, 0xfc, 0x3d, 0xe3, 0x31, 0x7e, 0x39, 0x7f, 0xdb, 0xd8, 0x54, ++ 0x12, 0x45, 0xde, 0xab, 0x25, 0xd0, 0xa7, 0xff, 0x0a, 0xf2, 0xc2, 0x23, ++ 0xf1, 0x71, 0xa0, 0xf9, 0x00, 0xe6, 0x61, 0x7d, 0xf5, 0xa9, 0x09, 0xe5, ++ 0x5b, 0x57, 0xfe, 0x68, 0x53, 0x15, 0xcb, 0xcb, 0x55, 0x78, 0xde, 0xe8, ++ 0xa6, 0xe8, 0x79, 0xf8, 0x6a, 0x9e, 0x63, 0x75, 0xf3, 0xed, 0xb7, 0xde, ++ 0x00, 0xf2, 0xba, 0x99, 0xd9, 0x77, 0x5d, 0x79, 0x8f, 0x97, 0xcb, 0x17, ++ 0x3d, 0x4c, 0xf1, 0x7a, 0xdd, 0x15, 0xe0, 0x6f, 0x13, 0xcf, 0x0b, 0x6e, ++ 0x9a, 0x1c, 0x35, 0x5f, 0xf4, 0x2b, 0xf8, 0x07, 0xc5, 0xd3, 0xcf, 0x53, ++ 0xf5, 0xf9, 0xa2, 0xdf, 0x36, 0xcf, 0xfd, 0xf9, 0x4b, 0xd0, 0xd6, 0x9c, ++ 0xd8, 0x63, 0xbe, 0x68, 0xe0, 0x0a, 0xe0, 0xa6, 0xe6, 0xf9, 0x57, 0xa6, ++ 0xba, 0x5e, 0x4f, 0x05, 0x3e, 0xda, 0x1a, 0xeb, 0x4d, 0x63, 0x78, 0xf3, ++ 0x4f, 0x12, 0xc0, 0x0e, 0xfc, 0x36, 0x0b, 0xce, 0x47, 0x9c, 0x91, 0x43, ++ 0x98, 0x07, 0x12, 0xda, 0x63, 0x72, 0x40, 0xde, 0x63, 0xf9, 0x9e, 0x4f, ++ 0x90, 0x5f, 0x3a, 0xb6, 0x1d, 0xc2, 0x78, 0x2b, 0xe1, 0x79, 0xf6, 0x1d, ++ 0xa4, 0xeb, 0x8f, 0xe5, 0x43, 0x0b, 0x7c, 0x9d, 0x8d, 0x36, 0x96, 0x67, ++ 0xca, 0xe1, 0x0f, 0x79, 0xa8, 0x8a, 0x1d, 0x9f, 0xf3, 0x7c, 0x53, 0x46, ++ 0xc7, 0x6a, 0x1e, 0x6a, 0x4f, 0xf9, 0xa7, 0xc1, 0x54, 0x7e, 0x7e, 0x98, ++ 0x9f, 0x3b, 0xa8, 0xa2, 0x7e, 0x13, 0xcb, 0x53, 0x0f, 0xe7, 0xa5, 0x0a, ++ 0xc3, 0x01, 0x5f, 0xc7, 0x74, 0x79, 0xbd, 0xea, 0xba, 0x23, 0xc7, 0x73, ++ 0x70, 0x39, 0x1a, 0xce, 0xab, 0x8e, 0x9e, 0xe7, 0xab, 0xe6, 0x11, 0x76, ++ 0xc7, 0x17, 0xd3, 0x2b, 0x6a, 0xde, 0x74, 0xc7, 0x5a, 0x9e, 0x6f, 0x4d, ++ 0x9f, 0x67, 0x0e, 0x81, 0x3c, 0x39, 0xa6, 0xcf, 0x3d, 0x7e, 0xe1, 0x93, ++ 0x68, 0xf8, 0x55, 0xf3, 0xaa, 0x3f, 0x8b, 0xc0, 0xaf, 0xba, 0xbe, 0x9e, ++ 0xf8, 0x42, 0xe5, 0xcf, 0xcb, 0xcd, 0xfb, 0xbf, 0x0a, 0x97, 0x0f, 0x52, ++ 0x59, 0x3c, 0x5b, 0x85, 0x4f, 0xfb, 0x9f, 0xa2, 0xcb, 0xe9, 0xef, 0x38, ++ 0xbf, 0x53, 0xbf, 0xf5, 0xdb, 0x54, 0x8d, 0x7f, 0x3b, 0x93, 0xfb, 0xad, ++ 0x2a, 0xdc, 0xd4, 0xf9, 0x2e, 0x69, 0x62, 0x76, 0x45, 0xfb, 0x06, 0xe6, ++ 0x3f, 0x44, 0xf2, 0x37, 0x5d, 0x8f, 0x2b, 0x5a, 0x9e, 0xbd, 0x94, 0xc6, ++ 0xec, 0xdf, 0xea, 0x96, 0x7d, 0xb9, 0x20, 0x87, 0xda, 0xf7, 0xef, 0xe4, ++ 0x74, 0xc7, 0xe8, 0xba, 0x7a, 0xd3, 0x31, 0x96, 0xa7, 0x4b, 0xe5, 0xb6, ++ 0x5f, 0x2b, 0xb7, 0x09, 0x8b, 0x23, 0x47, 0x8e, 0x67, 0xe7, 0xe3, 0x79, ++ 0x5a, 0xa3, 0x8f, 0xe7, 0xd9, 0x74, 0x3e, 0xea, 0x78, 0x67, 0x25, 0xd7, ++ 0xdd, 0x30, 0xff, 0xb3, 0x6d, 0xcc, 0x8e, 0x3a, 0xdb, 0x24, 0x4e, 0xf4, ++ 0x47, 0x19, 0xff, 0x22, 0xd7, 0x4b, 0x5d, 0xeb, 0xb6, 0x19, 0x31, 0x5f, ++ 0x4a, 0xb4, 0xc7, 0xa0, 0x3d, 0x35, 0xdf, 0x36, 0xfc, 0xd3, 0xb8, 0x24, ++ 0x28, 0x8d, 0x98, 0xf7, 0x53, 0xb7, 0x88, 0xe7, 0x09, 0x3d, 0xea, 0x4c, ++ 0x03, 0x38, 0xd7, 0xd9, 0x6e, 0x26, 0x30, 0x9f, 0xc7, 0x01, 0x3e, 0x9a, ++ 0xf8, 0x83, 0xec, 0x70, 0x13, 0xb0, 0xe3, 0xe4, 0xb4, 0xc2, 0x7c, 0x51, ++ 0x09, 0xcf, 0x57, 0x6d, 0x37, 0x26, 0x19, 0x88, 0x5f, 0x8b, 0x7f, 0x29, ++ 0x90, 0x09, 0xf2, 0xfd, 0x68, 0xde, 0x69, 0x19, 0xc6, 0xfb, 0x3c, 0x22, ++ 0x6e, 0xf2, 0xb9, 0x44, 0x96, 0xa4, 0xd2, 0x79, 0x7d, 0xee, 0x15, 0x9c, ++ 0x8b, 0x94, 0x9e, 0xed, 0x6e, 0xb5, 0xee, 0x5e, 0x28, 0xea, 0xe2, 0x1c, ++ 0xd5, 0xa6, 0xd0, 0x51, 0xb0, 0xdf, 0xc9, 0x5b, 0x16, 0x8c, 0x5b, 0x8b, ++ 0x7b, 0x2d, 0x5e, 0x8c, 0x9b, 0xbd, 0x62, 0xc1, 0x75, 0x1e, 0xd8, 0xf6, ++ 0xfd, 0x6b, 0x00, 0xaf, 0x8e, 0x9f, 0x9b, 0x08, 0xdb, 0x47, 0xa0, 0x84, ++ 0x41, 0xe5, 0x42, 0x09, 0x8f, 0x5f, 0x9c, 0xde, 0xf6, 0xfd, 0x2b, 0x7f, ++ 0x04, 0x3b, 0x13, 0x5e, 0xa6, 0xdf, 0x2f, 0x79, 0x85, 0xf6, 0x07, 0xfb, ++ 0x7a, 0x53, 0x2c, 0xfa, 0x03, 0x9d, 0x5b, 0xe3, 0x72, 0xd1, 0x9e, 0x7c, ++ 0xeb, 0x91, 0x29, 0x20, 0x37, 0x4a, 0x40, 0x87, 0x81, 0x9d, 0xf7, 0x66, ++ 0xaa, 0xbf, 0x8e, 0x8e, 0x77, 0x2a, 0x99, 0xd5, 0x4f, 0x6d, 0xee, 0x8d, ++ 0xe7, 0x09, 0x2a, 0xb6, 0xda, 0x30, 0xdf, 0xf0, 0xc0, 0xb6, 0x1d, 0xd5, ++ 0x20, 0xff, 0x3b, 0xde, 0x8c, 0x85, 0xed, 0x68, 0xf2, 0x95, 0x1c, 0xfc, ++ 0x0b, 0xd4, 0x3d, 0xbb, 0xe3, 0xc8, 0x5a, 0x05, 0xed, 0x40, 0x45, 0xab, ++ 0x6f, 0xcb, 0x88, 0xa4, 0x68, 0xed, 0xbc, 0x0a, 0xa8, 0xeb, 0xf2, 0x5f, ++ 0x08, 0xfa, 0xe9, 0x18, 0x8f, 0xa3, 0xf4, 0x5c, 0xd1, 0x12, 0x87, 0xe7, ++ 0x47, 0x34, 0xfd, 0x38, 0x3f, 0x7b, 0x33, 0xd8, 0x79, 0x99, 0x40, 0x06, ++ 0xf0, 0x1d, 0xb5, 0x27, 0x75, 0xdf, 0x51, 0xdb, 0xef, 0x48, 0xeb, 0xcb, ++ 0xcf, 0xf7, 0x86, 0x7e, 0xca, 0xee, 0x57, 0x60, 0xfd, 0x3d, 0xc6, 0x50, ++ 0x31, 0xab, 0xfb, 0x32, 0x18, 0xdf, 0xb6, 0x61, 0xff, 0x22, 0x95, 0x5e, ++ 0x79, 0x7b, 0xf7, 0x71, 0x59, 0xff, 0x99, 0x69, 0x7d, 0x75, 0xfd, 0xd4, ++ 0xf7, 0xab, 0x4d, 0xa4, 0x26, 0x1a, 0x1f, 0x54, 0xa6, 0x09, 0xfc, 0x7c, ++ 0xef, 0x9f, 0x07, 0x44, 0xbb, 0xcf, 0x22, 0xca, 0xfc, 0xf1, 0xf9, 0x43, ++ 0x02, 0xf1, 0x1a, 0xc0, 0x0e, 0xd8, 0x62, 0xf1, 0x43, 0x5c, 0xa3, 0xd2, ++ 0x18, 0xe8, 0x0f, 0xf9, 0xed, 0xdb, 0x8d, 0x6c, 0x7f, 0xa4, 0xd2, 0x1e, ++ 0xe8, 0x0f, 0xf9, 0xed, 0xbb, 0xb9, 0xfc, 0xab, 0x8c, 0xa1, 0x75, 0xfa, ++ 0x3c, 0x83, 0xcf, 0x03, 0xfa, 0x43, 0x9d, 0x98, 0x83, 0x6f, 0x00, 0xbe, ++ 0xab, 0x76, 0x58, 0x08, 0xe4, 0x27, 0x55, 0xbd, 0x65, 0x73, 0x01, 0x9e, ++ 0xab, 0xb6, 0x7f, 0x7f, 0xea, 0xe5, 0x7c, 0xc8, 0x67, 0x8b, 0xc5, 0xb8, ++ 0x55, 0xd5, 0x5b, 0xff, 0x82, 0xf8, 0xaf, 0x32, 0x05, 0x66, 0x00, 0xfd, ++ 0x87, 0xb6, 0x98, 0xc8, 0x3a, 0xda, 0xbf, 0x7d, 0xcb, 0x7b, 0x59, 0x60, ++ 0x47, 0xb4, 0xcb, 0x81, 0xac, 0x84, 0x4b, 0xec, 0xfb, 0x54, 0x35, 0x99, ++ 0x74, 0xfb, 0xd8, 0xea, 0x3a, 0xce, 0xd6, 0xfa, 0xaf, 0x82, 0xf3, 0xeb, ++ 0xea, 0xb9, 0xc5, 0xf2, 0x1e, 0xe4, 0xc5, 0x9e, 0x34, 0x66, 0x8f, 0xae, ++ 0x48, 0x73, 0x3d, 0x9b, 0x86, 0x7c, 0x6d, 0x75, 0xa0, 0xbc, 0x86, 0xf1, ++ 0x44, 0x18, 0xa7, 0xa5, 0x9f, 0xf6, 0x5c, 0x73, 0xb9, 0x12, 0x5d, 0x8e, ++ 0x35, 0xa4, 0xc9, 0xba, 0x73, 0xb4, 0x62, 0xf8, 0x9c, 0x62, 0x03, 0x8c, ++ 0xfb, 0x15, 0x09, 0x2e, 0xc9, 0xa0, 0x28, 0xa9, 0x12, 0x42, 0xb8, 0x7f, ++ 0x5e, 0xbe, 0xe1, 0xfc, 0x60, 0xf0, 0x87, 0x3f, 0xff, 0xd7, 0x6b, 0x71, ++ 0x5f, 0xeb, 0x73, 0x63, 0x68, 0x30, 0xc8, 0xed, 0xcf, 0xb3, 0x42, 0x83, ++ 0xb5, 0xf2, 0xf8, 0x4c, 0xad, 0x59, 0x91, 0x64, 0x8c, 0x4b, 0x60, 0xd9, ++ 0xb9, 0xf6, 0x7c, 0x71, 0x06, 0x81, 0xfc, 0x41, 0xcb, 0xb4, 0x68, 0xf2, ++ 0x69, 0x73, 0x5a, 0x2c, 0xce, 0xa3, 0x7c, 0x61, 0x6c, 0xd4, 0xf3, 0xa0, ++ 0xbb, 0x38, 0xbd, 0xad, 0x01, 0x1a, 0x4c, 0x66, 0xdf, 0x85, 0x38, 0x84, ++ 0xfa, 0xdd, 0xcf, 0x8d, 0x7e, 0x23, 0xcc, 0x23, 0x27, 0x5d, 0xc1, 0xf6, ++ 0xf2, 0x4c, 0xbf, 0x11, 0x9e, 0x57, 0x6c, 0xd8, 0xd9, 0x4f, 0x77, 0xef, ++ 0x84, 0xe4, 0xc3, 0x7e, 0x94, 0xbf, 0x10, 0x1e, 0x65, 0x64, 0xa5, 0x31, ++ 0xdf, 0xda, 0x5d, 0xae, 0x94, 0x2d, 0xb0, 0x2a, 0x12, 0x9e, 0x8f, 0x96, ++ 0xfe, 0xb3, 0x8b, 0xde, 0xc4, 0x30, 0x9e, 0x30, 0xc8, 0x09, 0x79, 0x6a, ++ 0x1c, 0x87, 0x54, 0x33, 0x61, 0x1c, 0x54, 0x3d, 0x0f, 0x20, 0xc9, 0x85, ++ 0x66, 0x80, 0x97, 0x91, 0x14, 0x3a, 0x24, 0x11, 0x50, 0xed, 0x43, 0x3e, ++ 0x8d, 0x21, 0x4d, 0x58, 0x5a, 0xa9, 0x39, 0xc2, 0xf4, 0x50, 0x0d, 0x81, ++ 0xbc, 0xa2, 0x33, 0x7c, 0xff, 0xd6, 0x24, 0x29, 0xcf, 0x82, 0xfc, 0x30, ++ 0x1d, 0x14, 0x51, 0x9e, 0x5f, 0x0e, 0x6e, 0xbf, 0x4a, 0xb3, 0xe3, 0xbc, ++ 0x4d, 0x52, 0x0d, 0x71, 0xa2, 0xdd, 0x31, 0xc9, 0x01, 0x76, 0xb5, 0xe0, ++ 0x75, 0x93, 0x1f, 0x29, 0x3d, 0xd4, 0xd5, 0x6e, 0xe8, 0x77, 0x92, 0xed, ++ 0xff, 0xbb, 0x20, 0x1f, 0xce, 0x4e, 0xd8, 0xfc, 0xec, 0x8e, 0x77, 0x7f, ++ 0x00, 0xfb, 0x80, 0xd2, 0x19, 0xfa, 0xd9, 0xde, 0x1b, 0x89, 0xbf, 0x8e, ++ 0x7e, 0x4f, 0x32, 0xb2, 0x3a, 0x19, 0x43, 0xfc, 0xd1, 0xf6, 0xe3, 0xdb, ++ 0x39, 0x1e, 0x88, 0x77, 0x1f, 0xca, 0x1f, 0x2b, 0x09, 0xff, 0x85, 0x68, ++ 0x3d, 0x16, 0x25, 0x14, 0xfd, 0x6e, 0xdc, 0x5f, 0x86, 0x83, 0x9f, 0x6b, ++ 0x75, 0x90, 0x00, 0xd8, 0x4d, 0xb1, 0x56, 0x12, 0x88, 0xa5, 0xa5, 0x35, ++ 0x47, 0x3a, 0xab, 0xe5, 0x5f, 0x3b, 0x61, 0xf5, 0xbe, 0x94, 0x9c, 0x41, ++ 0xae, 0x39, 0x46, 0xe9, 0xdb, 0x23, 0xe9, 0x9a, 0x38, 0xa5, 0x6f, 0xba, ++ 0xe4, 0xa2, 0x88, 0xef, 0x7f, 0x13, 0xf1, 0xfe, 0x37, 0x97, 0x7a, 0x5f, ++ 0x85, 0x87, 0xc7, 0xdc, 0x2f, 0x9b, 0x9d, 0x7f, 0x67, 0x70, 0x89, 0xe1, ++ 0x6b, 0xf0, 0x8e, 0x71, 0x5e, 0x0c, 0x02, 0x3c, 0x72, 0xed, 0xce, 0x3a, ++ 0xc0, 0xa3, 0x31, 0x74, 0xf4, 0x11, 0x80, 0x47, 0xae, 0x95, 0xf9, 0x89, ++ 0x49, 0xf5, 0x44, 0xeb, 0xc7, 0xf5, 0x4b, 0x67, 0xf2, 0xea, 0x31, 0x81, ++ 0xe9, 0x4b, 0xfa, 0x57, 0x68, 0xd5, 0x8c, 0x47, 0x1c, 0x66, 0x8c, 0x9f, ++ 0x3e, 0xc9, 0xe1, 0xde, 0xd5, 0x5f, 0x8d, 0xab, 0x74, 0xeb, 0x6f, 0x91, ++ 0x00, 0xae, 0xdd, 0xfa, 0x5b, 0x7a, 0xea, 0x1f, 0x13, 0xbd, 0xbf, 0xad, ++ 0xa7, 0xf9, 0xc4, 0x46, 0x9f, 0x4f, 0x7c, 0x0f, 0xe3, 0x7b, 0xa3, 0xf7, ++ 0xaf, 0x7e, 0xeb, 0x93, 0x0f, 0x03, 0x0a, 0x3c, 0x64, 0x72, 0x43, 0x22, ++ 0x06, 0xf5, 0x1c, 0x74, 0xbf, 0x74, 0xf0, 0xb7, 0xe2, 0x8e, 0xa6, 0x14, ++ 0x31, 0xaa, 0x60, 0xfb, 0x04, 0x11, 0x78, 0x8b, 0x01, 0xfa, 0xa3, 0xf4, ++ 0x10, 0x73, 0x95, 0xe6, 0x39, 0xfc, 0x5f, 0x8e, 0x06, 0x7f, 0x7d, 0xa3, ++ 0xe0, 0x9f, 0x04, 0x90, 0xee, 0x8a, 0xf8, 0x7c, 0x68, 0xdd, 0x9a, 0x4e, ++ 0xe7, 0x77, 0x0f, 0x9f, 0xee, 0xb8, 0x46, 0xb6, 0x8f, 0x79, 0xdf, 0x7c, ++ 0x16, 0x47, 0xba, 0x67, 0x21, 0x3b, 0x2f, 0x74, 0xec, 0x5f, 0xd9, 0xb9, ++ 0xfd, 0xfb, 0xea, 0x99, 0xbf, 0x7d, 0xdf, 0x02, 0xb6, 0x6f, 0x46, 0x4a, ++ 0xd9, 0x39, 0x20, 0x07, 0xfd, 0x0f, 0xbe, 0x77, 0x3f, 0x0c, 0x42, 0xf1, ++ 0x7d, 0xbf, 0x4f, 0xf0, 0x07, 0xb2, 0xe1, 0x1e, 0x9c, 0x08, 0xfb, 0xb5, ++ 0xeb, 0xbe, 0x9d, 0x87, 0x24, 0xe8, 0x5f, 0x14, 0x11, 0x8f, 0x51, 0xe9, ++ 0x49, 0x3d, 0xb7, 0x34, 0x9b, 0xdb, 0xd7, 0xd9, 0x9c, 0x3e, 0xe7, 0x92, ++ 0x90, 0x0d, 0xf8, 0x3e, 0xf2, 0x1c, 0x7d, 0x73, 0x1a, 0xcb, 0x4b, 0xa3, ++ 0xee, 0x98, 0x0b, 0xd6, 0x77, 0x2f, 0x5f, 0x9f, 0xaa, 0x07, 0xbc, 0x2b, ++ 0xc8, 0x40, 0xb8, 0x17, 0x40, 0x34, 0xc4, 0x38, 0x61, 0x7f, 0x44, 0xe4, ++ 0xe7, 0x56, 0x89, 0xdd, 0xc8, 0xf2, 0x96, 0xef, 0x48, 0xd0, 0xc9, 0x9f, ++ 0x0b, 0x03, 0x95, 0x38, 0xd0, 0x77, 0xe4, 0x6d, 0xfe, 0x9c, 0xdf, 0x47, ++ 0x34, 0xef, 0x26, 0x25, 0x55, 0x7b, 0xce, 0x4b, 0xba, 0x18, 0x8b, 0xf7, ++ 0x8f, 0xd4, 0xc9, 0xce, 0x34, 0x90, 0x8b, 0xf2, 0xc5, 0x5b, 0x88, 0x42, ++ 0xf9, 0xc2, 0x78, 0xb1, 0x1f, 0x51, 0x34, 0xe7, 0xd0, 0xa8, 0x7d, 0x87, ++ 0xcc, 0x2e, 0x3b, 0x08, 0xc6, 0x71, 0x24, 0x47, 0x21, 0x29, 0x01, 0xbb, ++ 0x30, 0x9e, 0xd3, 0x59, 0xd2, 0xcd, 0x5d, 0x76, 0xd8, 0x47, 0x14, 0x2e, ++ 0xf3, 0x56, 0x28, 0x78, 0x0e, 0xf6, 0xee, 0x74, 0xa6, 0x5f, 0x96, 0x65, ++ 0x14, 0xce, 0x05, 0xba, 0x10, 0xed, 0xc3, 0x9d, 0x6e, 0x6b, 0x77, 0xbc, ++ 0x7a, 0xb7, 0xb1, 0xf5, 0xd5, 0xc1, 0xfa, 0xb2, 0xbb, 0xcf, 0xbb, 0xce, ++ 0xe8, 0x74, 0xa2, 0x1d, 0x7a, 0x33, 0xb5, 0x20, 0x30, 0xde, 0xe3, 0x34, ++ 0xc3, 0x7c, 0x44, 0x93, 0xf2, 0x89, 0x02, 0xfc, 0xf9, 0x1b, 0x99, 0x80, ++ 0xff, 0xdf, 0x1d, 0x0e, 0x0c, 0x9f, 0x17, 0x92, 0x12, 0xfc, 0x90, 0xff, ++ 0x32, 0xc7, 0xbe, 0xec, 0x28, 0xd0, 0xed, 0xf2, 0x5a, 0x07, 0xee, 0xa3, ++ 0x2d, 0xad, 0x1d, 0x88, 0xe5, 0xb2, 0xda, 0x34, 0xb4, 0x43, 0x97, 0xd4, ++ 0x3a, 0xb1, 0x54, 0xe1, 0x62, 0x76, 0xfa, 0x5c, 0x22, 0x85, 0xb3, 0xf9, ++ 0x2a, 0x36, 0x9e, 0xd9, 0xe1, 0x66, 0x76, 0x06, 0xd5, 0x43, 0x90, 0x7f, ++ 0x21, 0x39, 0x6a, 0x02, 0x50, 0x37, 0x67, 0xd6, 0x10, 0xb0, 0x7f, 0x2d, ++ 0x5d, 0xf0, 0xf1, 0x21, 0x7c, 0x8c, 0x5d, 0x75, 0x37, 0xd6, 0x4d, 0x50, ++ 0xa7, 0xa5, 0x5c, 0x3f, 0x09, 0xe1, 0x4b, 0xdf, 0x27, 0x25, 0x10, 0x47, ++ 0xcd, 0x70, 0x2f, 0x07, 0xf8, 0x58, 0x94, 0x6b, 0x88, 0xa2, 0xa1, 0x0b, ++ 0x53, 0xda, 0x10, 0x5d, 0xbd, 0x1b, 0xdc, 0x54, 0xfa, 0xd8, 0xcc, 0xe0, ++ 0xf7, 0xb4, 0xc0, 0xe8, 0x23, 0x12, 0x7e, 0x4f, 0xcb, 0x6d, 0x0a, 0xec, ++ 0x3f, 0x3f, 0x7d, 0x53, 0xd7, 0xbd, 0x36, 0x08, 0x3f, 0x6a, 0xee, 0x33, ++ 0xf8, 0xfd, 0x9a, 0xed, 0xcf, 0xf5, 0x08, 0x3f, 0x47, 0x02, 0xda, 0xb3, ++ 0x73, 0x0a, 0x96, 0xcc, 0xa8, 0xa3, 0x8f, 0x9e, 0xe2, 0xfb, 0x90, 0x4f, ++ 0xd4, 0x0e, 0x47, 0x78, 0x3d, 0x09, 0x79, 0x5d, 0x03, 0xc0, 0x3f, 0x70, ++ 0x61, 0x29, 0x02, 0xfc, 0x28, 0x1d, 0x99, 0x72, 0xbc, 0x44, 0xa4, 0xef, ++ 0x9b, 0x14, 0x36, 0x67, 0x93, 0xb5, 0xd0, 0x65, 0xc8, 0x67, 0xb4, 0x0b, ++ 0xf0, 0x13, 0xad, 0x0c, 0x9e, 0xa6, 0xb4, 0x1a, 0xdc, 0x8f, 0x33, 0x5b, ++ 0x19, 0xbc, 0x44, 0xab, 0x17, 0xe1, 0x22, 0x5b, 0x19, 0xbc, 0x44, 0x2b, ++ 0xa3, 0x37, 0x23, 0xaf, 0x4b, 0x00, 0xbf, 0xa1, 0xf8, 0x3e, 0x3e, 0xa7, ++ 0xf0, 0x6b, 0x4e, 0x1f, 0x06, 0x78, 0x18, 0xa9, 0x83, 0x97, 0x31, 0x69, ++ 0xcc, 0x95, 0xc1, 0x6f, 0x35, 0x85, 0x1f, 0x9d, 0x47, 0x12, 0xe7, 0xaf, ++ 0x48, 0x38, 0x24, 0xc1, 0x39, 0x85, 0x9c, 0x30, 0x5f, 0xf5, 0x64, 0xd7, ++ 0xbd, 0x40, 0xd7, 0x0f, 0x7a, 0x7c, 0x15, 0x85, 0x0f, 0x94, 0xc9, 0x3d, ++ 0xf8, 0x8f, 0xc9, 0x19, 0x4c, 0x8e, 0x26, 0x19, 0x6a, 0xf6, 0xc9, 0x00, ++ 0x8f, 0x04, 0xc2, 0xf5, 0x8b, 0x97, 0x64, 0x16, 0x10, 0x96, 0xaa, 0x08, ++ 0x7f, 0x69, 0x5e, 0xa2, 0x40, 0x5d, 0x60, 0xf3, 0x20, 0x8d, 0x7a, 0xbc, ++ 0x8a, 0x0e, 0x29, 0xe2, 0xde, 0x37, 0x65, 0x15, 0xd0, 0xc1, 0xca, 0xf7, ++ 0x64, 0x03, 0xec, 0x93, 0x8a, 0x0b, 0x6e, 0xd1, 0x9d, 0x27, 0x15, 0xa7, ++ 0xb9, 0xe2, 0x15, 0x84, 0xa7, 0x5b, 0x00, 0xfd, 0xfc, 0x54, 0xad, 0x82, ++ 0xf8, 0x5b, 0x01, 0x78, 0x1c, 0x00, 0xfa, 0x91, 0xf9, 0x63, 0x8f, 0x73, ++ 0x7c, 0x3e, 0x01, 0x7c, 0x82, 0xf8, 0x65, 0xfc, 0xf1, 0x34, 0xe7, 0x97, ++ 0x67, 0x39, 0x9f, 0xd4, 0x39, 0xd9, 0xf9, 0x89, 0xe5, 0x13, 0x59, 0x5e, ++ 0x56, 0x52, 0x9e, 0x81, 0xdf, 0x87, 0x16, 0x20, 0xda, 0xbc, 0xa7, 0x78, ++ 0x67, 0x13, 0x31, 0xd2, 0x79, 0xa1, 0x8d, 0xad, 0x60, 0x19, 0x40, 0x3b, ++ 0xe3, 0x53, 0x93, 0xff, 0x6a, 0xfa, 0x5e, 0x6c, 0x0e, 0x71, 0x01, 0x9d, ++ 0xc4, 0x7f, 0xfa, 0xb0, 0x1f, 0xd7, 0x4a, 0x0a, 0xd3, 0xc1, 0x2e, 0x8a, ++ 0xe7, 0xf6, 0x2f, 0x19, 0xa5, 0xc4, 0x4f, 0xc7, 0x83, 0xb4, 0x01, 0x89, ++ 0xf9, 0x21, 0x54, 0x14, 0xa2, 0x5f, 0xd3, 0x66, 0x88, 0x76, 0x0f, 0x56, ++ 0x9d, 0x73, 0xbf, 0x19, 0xe2, 0xa6, 0x3d, 0xcd, 0x67, 0xdf, 0xd4, 0xed, ++ 0x48, 0x97, 0xc5, 0xd7, 0x61, 0x7a, 0x30, 0x49, 0x74, 0x17, 0x4e, 0x9f, ++ 0x4b, 0xeb, 0xd6, 0xfa, 0x58, 0x8c, 0x0f, 0xc6, 0x3a, 0xdd, 0x05, 0x8f, ++ 0x03, 0x9f, 0xd7, 0xdb, 0x90, 0x4e, 0xad, 0x74, 0xfe, 0x25, 0x1a, 0xbc, ++ 0xc7, 0xf6, 0x80, 0xd7, 0x97, 0x32, 0x6e, 0x32, 0x64, 0x50, 0x3a, 0x14, ++ 0xc1, 0x68, 0xa3, 0xf8, 0x7d, 0xae, 0xbe, 0x9f, 0x05, 0xe0, 0xfc, 0x82, ++ 0x5c, 0x98, 0x0e, 0xf2, 0xf5, 0x05, 0xae, 0x67, 0x29, 0x0e, 0x14, 0xed, ++ 0x3e, 0x54, 0x3b, 0x97, 0x93, 0xf6, 0xfc, 0x6b, 0x74, 0xfe, 0xec, 0x4a, ++ 0xd9, 0x85, 0xef, 0x39, 0x46, 0xe9, 0xe5, 0xc0, 0x4a, 0x2e, 0x77, 0x13, ++ 0xc6, 0xe9, 0xe9, 0x5d, 0x95, 0xbb, 0x1f, 0x77, 0xc9, 0x5d, 0x77, 0x32, ++ 0xcc, 0x27, 0xe5, 0xe2, 0x38, 0xe4, 0xc7, 0xa4, 0xdb, 0xa2, 0xcb, 0xdf, ++ 0x3a, 0xd9, 0xe8, 0x85, 0x7b, 0x05, 0xea, 0x06, 0x33, 0x7e, 0xf7, 0x16, ++ 0x19, 0xd1, 0xfe, 0x8b, 0x22, 0x0f, 0x30, 0xae, 0x7d, 0xc1, 0xdd, 0x7f, ++ 0x1d, 0xc8, 0x53, 0x95, 0xbe, 0x16, 0x13, 0x26, 0x7f, 0xbc, 0x24, 0xc6, ++ 0x89, 0xfa, 0x88, 0xdf, 0xa3, 0xa3, 0xda, 0xc7, 0x4b, 0xe1, 0xbe, 0x41, ++ 0x2e, 0x67, 0xa1, 0x14, 0xaf, 0x32, 0x22, 0xdd, 0xa4, 0xdc, 0x67, 0xc0, ++ 0xfc, 0xbc, 0xe5, 0xfc, 0xbe, 0xac, 0x67, 0x28, 0x7d, 0x41, 0xe9, 0xa3, ++ 0xf4, 0x05, 0xe5, 0x0d, 0x19, 0x6c, 0x3f, 0x63, 0xb1, 0x79, 0x08, 0xde, ++ 0xdb, 0x56, 0x67, 0x35, 0xa0, 0xbc, 0x90, 0x8e, 0x98, 0xfc, 0x56, 0xb0, ++ 0x57, 0xf7, 0x8d, 0x70, 0x40, 0x1c, 0x41, 0x92, 0x9d, 0x6d, 0x2e, 0x88, ++ 0x07, 0xda, 0xa4, 0xa6, 0x75, 0x04, 0xfa, 0xe5, 0x9b, 0xe1, 0x3e, 0x09, ++ 0x21, 0x3e, 0xdf, 0x01, 0x74, 0xf0, 0x9d, 0x6d, 0x4e, 0x9f, 0x4b, 0xe5, ++ 0xe1, 0x51, 0x74, 0x0a, 0x40, 0x47, 0x8e, 0xa4, 0x42, 0x72, 0x3c, 0x07, ++ 0x77, 0x0f, 0xf0, 0x5c, 0xb3, 0xec, 0xb8, 0x8d, 0x40, 0x5c, 0x71, 0x55, ++ 0x52, 0x8d, 0x05, 0xe0, 0x96, 0x93, 0xc1, 0xfc, 0xae, 0xfa, 0xa2, 0x02, ++ 0x84, 0x23, 0x85, 0xef, 0x98, 0x8c, 0xe4, 0xf0, 0x38, 0xa9, 0xd3, 0x6e, ++ 0xee, 0xba, 0x6f, 0x0b, 0x86, 0x5d, 0xd5, 0xc3, 0xf9, 0xe8, 0x29, 0x19, ++ 0xdc, 0x8e, 0xce, 0xf4, 0x92, 0xab, 0x34, 0xfc, 0x5e, 0x2f, 0x70, 0x3b, ++ 0x4c, 0xf1, 0x92, 0x81, 0x1a, 0xbe, 0x5f, 0x7c, 0xf5, 0x04, 0x02, 0xfb, ++ 0x4a, 0xdd, 0xf9, 0xbd, 0x07, 0x79, 0xb6, 0x9e, 0xc9, 0xb3, 0xc7, 0x84, ++ 0xe8, 0xf2, 0x4c, 0xb5, 0x3f, 0x55, 0x79, 0x26, 0x47, 0xc8, 0x09, 0xb5, ++ 0x5c, 0xd2, 0x67, 0xa2, 0xee, 0x7c, 0x97, 0x31, 0xc9, 0x09, 0xb4, 0x0b, ++ 0xa5, 0xd7, 0x40, 0x51, 0x24, 0x79, 0xaf, 0x7b, 0xfa, 0xde, 0x78, 0x84, ++ 0xc3, 0x6c, 0x80, 0x03, 0x49, 0xbb, 0xb9, 0xcb, 0xaf, 0xfd, 0xa7, 0xbe, ++ 0x60, 0x57, 0x16, 0x44, 0xa5, 0xb7, 0x48, 0x39, 0x36, 0xa7, 0x4b, 0xaf, ++ 0xbb, 0x52, 0x00, 0x4f, 0x67, 0x64, 0x25, 0x75, 0x3a, 0xd0, 0xd3, 0x7b, ++ 0x3d, 0xe9, 0x75, 0x57, 0x31, 0xd2, 0xa1, 0xaf, 0x97, 0x02, 0x7a, 0x69, ++ 0xdf, 0x73, 0xb7, 0x60, 0x5c, 0xe7, 0xe4, 0x73, 0x36, 0x05, 0xe4, 0x50, ++ 0xc9, 0xc5, 0x27, 0x51, 0x3f, 0x14, 0x5f, 0x1c, 0x81, 0x65, 0x69, 0xfd, ++ 0x4d, 0xa8, 0xcf, 0x85, 0xe7, 0x27, 0x17, 0x00, 0x3d, 0x9c, 0x6e, 0x18, ++ 0x9f, 0x7b, 0x04, 0xe2, 0x3c, 0x3e, 0x1b, 0xea, 0xed, 0xd3, 0xf5, 0x63, ++ 0xfb, 0xe3, 0x7e, 0xa4, 0x2f, 0x56, 0x81, 0xfc, 0x8e, 0xd3, 0xf5, 0xb4, ++ 0x3d, 0x3f, 0xdc, 0x0e, 0xf9, 0xe2, 0xa2, 0x26, 0x5f, 0x80, 0x40, 0xf4, ++ 0x5d, 0x73, 0xfe, 0x9b, 0xe4, 0x2b, 0x68, 0x97, 0xaa, 0xf7, 0x9e, 0x51, ++ 0xbf, 0xce, 0x3e, 0x12, 0xe2, 0x42, 0x6b, 0x44, 0x3c, 0xd7, 0x54, 0xfc, ++ 0xbc, 0xcd, 0x05, 0xf6, 0x67, 0x4f, 0xf4, 0x57, 0xdc, 0x10, 0x3d, 0x1e, ++ 0x00, 0xba, 0x16, 0xe2, 0xae, 0xf4, 0x83, 0x03, 0xc1, 0x8e, 0xde, 0x67, ++ 0x1f, 0x19, 0x0a, 0xd0, 0x71, 0xe7, 0xac, 0x63, 0xfb, 0x08, 0x75, 0x46, ++ 0xd7, 0xa9, 0x00, 0xd8, 0x4d, 0xcf, 0x59, 0x70, 0x1f, 0xb2, 0x2e, 0x21, ++ 0xfa, 0xbd, 0x20, 0x73, 0x33, 0xc6, 0x2f, 0x07, 0x39, 0x30, 0x37, 0xc3, ++ 0xf5, 0x02, 0xe2, 0xc9, 0xca, 0xee, 0x29, 0xed, 0x99, 0x1f, 0xd8, 0xf7, ++ 0x4f, 0xc1, 0x26, 0x33, 0xec, 0x63, 0xbd, 0xc4, 0xef, 0x47, 0x91, 0xdc, ++ 0xf6, 0xa9, 0xba, 0x7d, 0x36, 0xb6, 0x8f, 0x75, 0x8a, 0xc7, 0x59, 0x88, ++ 0xb9, 0x87, 0xf6, 0x18, 0xde, 0xae, 0xf4, 0xd0, 0x6e, 0x67, 0xf9, 0x22, ++ 0xc4, 0x11, 0xbd, 0x5d, 0xf5, 0x33, 0x62, 0xc3, 0x7e, 0x46, 0x13, 0xac, ++ 0xa3, 0xaa, 0xfe, 0xdc, 0x92, 0x23, 0x08, 0x2f, 0xee, 0x67, 0xf0, 0x79, ++ 0x9f, 0x91, 0xd9, 0xbc, 0xcf, 0xbc, 0x66, 0xf2, 0x2f, 0x8e, 0x42, 0xff, ++ 0x67, 0x78, 0x7e, 0x4a, 0x99, 0xc0, 0xe0, 0xab, 0xf2, 0xc1, 0x99, 0x2e, ++ 0xfb, 0xc8, 0x8d, 0xf7, 0xe1, 0x44, 0xd2, 0xa9, 0xb0, 0x6e, 0xd0, 0xaa, ++ 0x11, 0x74, 0xdc, 0xaf, 0x0f, 0xca, 0xa8, 0x37, 0x2a, 0x29, 0x7d, 0x21, ++ 0x5d, 0xad, 0x1b, 0x81, 0xf9, 0xf1, 0xc2, 0x73, 0x23, 0x9e, 0x85, 0xbc, ++ 0xe1, 0x6f, 0xde, 0x17, 0xb1, 0xbd, 0xfc, 0xa2, 0x05, 0xdb, 0xdb, 0x1f, ++ 0x75, 0xae, 0x82, 0xbc, 0xa7, 0xd0, 0x07, 0x32, 0x01, 0xf9, 0xf4, 0xcd, ++ 0xc1, 0xf1, 0x71, 0x2c, 0x4e, 0xa4, 0x8f, 0x63, 0xdf, 0xdf, 0x8b, 0xc9, ++ 0x85, 0xe3, 0x5c, 0x3e, 0x14, 0x5f, 0x7c, 0x0a, 0xe9, 0xb7, 0x8b, 0x4e, ++ 0x7c, 0x73, 0x8d, 0xc0, 0x7f, 0xc5, 0x17, 0x9f, 0x61, 0xf4, 0xbd, 0x41, ++ 0xc0, 0x7b, 0x2b, 0x89, 0xb7, 0xf2, 0x83, 0xd1, 0x57, 0x71, 0xfa, 0x1c, ++ 0x09, 0xef, 0x97, 0x4d, 0x5e, 0x0c, 0xf0, 0x1e, 0xe5, 0xc3, 0x7d, 0x92, ++ 0x92, 0xf5, 0x26, 0x27, 0xd8, 0x03, 0x91, 0x78, 0x3e, 0x9e, 0xa1, 0xe8, ++ 0xe2, 0x1e, 0x25, 0xc1, 0xe5, 0x38, 0x2e, 0xa1, 0xf6, 0x57, 0x92, 0x66, ++ 0x3f, 0xfd, 0x0c, 0xcf, 0x33, 0x2e, 0xb9, 0xc8, 0xee, 0x2b, 0x24, 0x0e, ++ 0x2f, 0x49, 0x03, 0x7e, 0xe0, 0xf2, 0x29, 0x4c, 0xc7, 0xfa, 0x7b, 0x68, ++ 0xdb, 0x2d, 0xd1, 0xe3, 0xf4, 0x17, 0xb8, 0xfd, 0x53, 0x7c, 0xf1, 0x7a, ++ 0x9d, 0x9f, 0x11, 0x5e, 0xdf, 0x8d, 0xf8, 0xbc, 0x98, 0xeb, 0xff, 0x92, ++ 0xe0, 0x08, 0xac, 0x87, 0xd7, 0xb3, 0x6a, 0x44, 0xb4, 0xf5, 0x84, 0xd7, ++ 0x31, 0x0a, 0xfb, 0xb7, 0xc7, 0x47, 0xff, 0x7e, 0x3a, 0x87, 0xf3, 0xa9, ++ 0xda, 0x52, 0xe2, 0xa2, 0xf2, 0xad, 0xd4, 0xc8, 0xfa, 0x15, 0xfb, 0x1e, ++ 0x32, 0x82, 0xdc, 0x29, 0x6e, 0x88, 0x4f, 0x10, 0x34, 0xeb, 0x2a, 0xa9, ++ 0xaf, 0xd0, 0xe5, 0x79, 0x94, 0x34, 0x14, 0x19, 0x67, 0x69, 0xc6, 0x0d, ++ 0xe3, 0x61, 0xc9, 0x07, 0xa3, 0xa5, 0x30, 0x1e, 0xd2, 0x5f, 0x5e, 0x34, ++ 0x79, 0xb1, 0x15, 0xec, 0x82, 0x42, 0xb9, 0x17, 0xf0, 0xd3, 0xba, 0xb2, ++ 0x82, 0x9f, 0x29, 0x30, 0x1e, 0x93, 0x4f, 0x5f, 0xca, 0xbe, 0x2c, 0x90, ++ 0xd7, 0xa7, 0xeb, 0x1f, 0xb4, 0x47, 0x3b, 0x37, 0x91, 0xde, 0x2b, 0x02, ++ 0x3f, 0xf5, 0x1c, 0x3f, 0xd4, 0xae, 0xce, 0xd7, 0xe0, 0x47, 0xc5, 0x4b, ++ 0xe4, 0xfb, 0xa7, 0xd6, 0x96, 0x14, 0xfc, 0x0c, 0xe2, 0xd1, 0xab, 0xd9, ++ 0x2d, 0x24, 0x3d, 0xcb, 0x9f, 0x08, 0xbc, 0x65, 0x47, 0x87, 0xdb, 0x90, ++ 0x2e, 0xb8, 0x0d, 0xc4, 0x7c, 0xa3, 0xcb, 0xc3, 0xed, 0x5a, 0x5d, 0x5e, ++ 0x51, 0x37, 0xb8, 0x71, 0xfc, 0xaa, 0x70, 0x51, 0x9f, 0x53, 0x3b, 0xea, ++ 0xda, 0x5e, 0xc3, 0xe0, 0x7b, 0x84, 0x9d, 0xdf, 0xa9, 0x67, 0xf8, 0xbf, ++ 0x1c, 0xbc, 0xc2, 0xdf, 0xe5, 0xf8, 0x1f, 0x1d, 0x7d, 0x1d, 0xd3, 0xba, ++ 0xd6, 0xb1, 0x80, 0x78, 0x29, 0xa3, 0xce, 0xb9, 0xec, 0x3a, 0x1e, 0x21, ++ 0x5e, 0xf3, 0x25, 0xd6, 0xa1, 0xe2, 0x9f, 0xbc, 0xa6, 0xc3, 0xff, 0xb4, ++ 0x97, 0xd7, 0x22, 0x1f, 0xaa, 0xf8, 0x9e, 0xb3, 0x7f, 0x35, 0xd2, 0xef, ++ 0x1c, 0xca, 0x8f, 0xb0, 0xdf, 0x7f, 0xda, 0xf7, 0x90, 0x3d, 0x5a, 0x7e, ++ 0xd1, 0xb4, 0x9e, 0xf0, 0x7e, 0x95, 0x97, 0xe4, 0x14, 0xfc, 0xdf, 0xc3, ++ 0xfb, 0x97, 0xb2, 0x37, 0x0b, 0xf2, 0xca, 0xbc, 0x2b, 0x2c, 0xe8, 0x8f, ++ 0x9c, 0x59, 0xf7, 0x54, 0x96, 0x16, 0xce, 0x73, 0x33, 0x46, 0xdf, 0x0f, ++ 0x78, 0x21, 0x8d, 0xc9, 0x57, 0xa4, 0x3f, 0xbc, 0x63, 0x9c, 0x07, 0xc1, ++ 0xbf, 0xf4, 0x3e, 0x27, 0x63, 0x3c, 0x6d, 0x4b, 0x86, 0xbb, 0x04, 0xde, ++ 0x2f, 0xe5, 0x7e, 0xf8, 0x63, 0xf1, 0x13, 0xfa, 0x47, 0xb3, 0x0f, 0x1e, ++ 0xaf, 0x3d, 0x38, 0x08, 0xe2, 0x74, 0x75, 0xb5, 0x6d, 0x58, 0xca, 0xdc, ++ 0xbe, 0x24, 0x60, 0x5f, 0x66, 0xa3, 0xbd, 0xe4, 0x8a, 0x76, 0xbf, 0xd7, ++ 0xd2, 0x5e, 0x4c, 0xae, 0x3c, 0x5e, 0xdb, 0xc6, 0xe2, 0x9e, 0x66, 0x2f, ++ 0x71, 0x68, 0xcf, 0x13, 0x13, 0x66, 0x3f, 0xfd, 0x27, 0x61, 0xf1, 0x1a, ++ 0xf5, 0x3d, 0xa3, 0xec, 0x76, 0x40, 0xfc, 0xd4, 0xc8, 0xcf, 0x3b, 0xcb, ++ 0x92, 0x7b, 0x69, 0x76, 0x3e, 0xc4, 0x3d, 0x92, 0xf2, 0xbc, 0x1a, 0xf8, ++ 0x2d, 0xe9, 0xc5, 0xce, 0x23, 0x2d, 0x4f, 0xdb, 0xef, 0x80, 0x73, 0xc5, ++ 0x26, 0x3a, 0x3e, 0xc4, 0x73, 0xcc, 0x99, 0xd2, 0x05, 0xfd, 0x3e, 0x27, ++ 0xab, 0xe7, 0x09, 0x47, 0x44, 0xc8, 0x6f, 0x96, 0x93, 0x9a, 0x08, 0xc6, ++ 0x43, 0x73, 0xe8, 0x73, 0x0d, 0xbc, 0x8d, 0x49, 0x6d, 0xba, 0xf8, 0x74, ++ 0x24, 0x1c, 0x24, 0xb3, 0x1d, 0xf7, 0x9b, 0x24, 0xc2, 0xec, 0x39, 0x75, ++ 0xfd, 0xf4, 0x09, 0xea, 0xa5, 0x27, 0xb8, 0x5e, 0x5a, 0xc9, 0xe3, 0x9a, ++ 0x2f, 0xd6, 0x36, 0x61, 0xdc, 0x7f, 0x71, 0xac, 0x1d, 0xf5, 0xdf, 0x92, ++ 0x3e, 0x06, 0xe6, 0x4f, 0x99, 0x25, 0xbc, 0xaf, 0xc6, 0x14, 0xcf, 0xfa, ++ 0x1b, 0xe3, 0xd8, 0xbc, 0x2d, 0x10, 0xf7, 0x16, 0x41, 0xaf, 0x06, 0xb0, ++ 0x6e, 0x83, 0x1b, 0x7d, 0x44, 0xbc, 0x1a, 0x4d, 0x80, 0x7a, 0x3c, 0x51, ++ 0x04, 0xa8, 0x27, 0x92, 0xc0, 0x12, 0xbc, 0x27, 0x65, 0x74, 0xf0, 0xa7, ++ 0xf0, 0xdc, 0x99, 0xe6, 0xf6, 0x03, 0x1e, 0xbf, 0x4b, 0x6f, 0x3b, 0x2a, ++ 0x40, 0x1c, 0xbb, 0xd0, 0x3d, 0x00, 0xf4, 0x6f, 0xbd, 0xe8, 0xcd, 0x53, ++ 0x68, 0xff, 0x9f, 0x8b, 0xa1, 0x3c, 0xe8, 0x97, 0x45, 0x9b, 0x3e, 0x4d, ++ 0x60, 0x65, 0x1f, 0xc8, 0x87, 0x76, 0x6b, 0xf6, 0xb5, 0xd8, 0x3d, 0xa1, ++ 0x8a, 0x36, 0x2e, 0x18, 0x59, 0xef, 0xb3, 0x40, 0x8a, 0xd8, 0xef, 0xf9, ++ 0xd3, 0x00, 0x6d, 0xfb, 0x8a, 0x34, 0xd7, 0x9b, 0x30, 0x8f, 0x3a, 0x0b, ++ 0xbb, 0x67, 0x28, 0xe9, 0x84, 0x80, 0xfb, 0x39, 0x75, 0x16, 0x76, 0xdf, ++ 0x50, 0x9d, 0xed, 0xae, 0x38, 0xd0, 0xe3, 0xbf, 0xee, 0xc5, 0xec, 0x76, ++ 0xa4, 0x03, 0xa0, 0xa3, 0x83, 0xcc, 0x9e, 0xb9, 0x20, 0x29, 0x71, 0x09, ++ 0x2c, 0x4e, 0xaa, 0xbc, 0xad, 0x8b, 0xf3, 0x9b, 0x95, 0xb7, 0x35, 0xdf, ++ 0x91, 0xb8, 0xbf, 0xd7, 0x48, 0xe9, 0x52, 0xd2, 0xec, 0xab, 0x5c, 0x25, ++ 0xb9, 0x0c, 0x40, 0x37, 0x57, 0xfb, 0xe8, 0x73, 0xed, 0x3c, 0xa3, 0xc4, ++ 0xe3, 0x12, 0xac, 0x78, 0x2d, 0x6f, 0xd4, 0xfd, 0x1c, 0x75, 0x7e, 0x90, ++ 0xb7, 0x0f, 0x70, 0x14, 0x2f, 0x4e, 0x40, 0x7f, 0x2d, 0x92, 0x1e, 0x76, ++ 0x77, 0xc5, 0x99, 0xbd, 0x22, 0xe0, 0x73, 0xba, 0x7a, 0x7f, 0xb1, 0xf4, ++ 0x18, 0xab, 0xc7, 0x13, 0xf5, 0x0f, 0xfd, 0xaf, 0x23, 0x5d, 0xf6, 0xe8, ++ 0x63, 0xac, 0xce, 0xf7, 0x39, 0x3d, 0xb3, 0xd8, 0x3e, 0x66, 0x5d, 0x51, ++ 0x1c, 0xe6, 0xc7, 0xa9, 0xf3, 0x98, 0xde, 0xfa, 0x44, 0x1b, 0xd8, 0xa9, ++ 0xd3, 0x5b, 0xd3, 0x67, 0xc3, 0xfe, 0xd6, 0x74, 0x6b, 0xff, 0x2f, 0xa0, ++ 0xdc, 0x2d, 0x87, 0xf6, 0xc7, 0x82, 0x1d, 0xf8, 0x90, 0x80, 0xe7, 0x4a, ++ 0xee, 0xf9, 0xed, 0xdb, 0x72, 0x2c, 0x2d, 0xb7, 0x1d, 0x5e, 0x87, 0xe7, ++ 0x99, 0xbf, 0xe0, 0xf2, 0x74, 0x06, 0x09, 0xe1, 0xbd, 0xf0, 0x6e, 0xe2, ++ 0xe0, 0xfb, 0xec, 0x7e, 0x7c, 0x3e, 0x8b, 0x38, 0x79, 0xbd, 0x49, 0x06, ++ 0xbf, 0xfe, 0xbe, 0x80, 0xff, 0xce, 0xc9, 0xb4, 0x76, 0xff, 0xdb, 0xfe, ++ 0xc9, 0x60, 0xb6, 0xcd, 0x38, 0x18, 0x7a, 0x07, 0xc4, 0x80, 0xbb, 0xc9, ++ 0x31, 0x01, 0xf7, 0x10, 0xd4, 0xf7, 0x5a, 0x9c, 0xef, 0xb2, 0x3a, 0x7b, ++ 0xaf, 0x6b, 0xfd, 0x92, 0x19, 0xd7, 0x13, 0x5e, 0xaf, 0x19, 0xd7, 0xaf, ++ 0xae, 0x8f, 0xce, 0x14, 0xe1, 0xdf, 0x05, 0x1f, 0x7e, 0x5f, 0x93, 0x0a, ++ 0x0f, 0x71, 0x16, 0x5d, 0x37, 0xa5, 0x97, 0xe9, 0x71, 0x77, 0xdd, 0x4c, ++ 0x2e, 0x61, 0x97, 0x4f, 0xb7, 0x0e, 0xfc, 0x82, 0x6d, 0x9a, 0xb0, 0xf9, ++ 0x44, 0xc2, 0xe7, 0x1b, 0x68, 0xa2, 0xf6, 0x63, 0x7b, 0x2f, 0x17, 0xc9, ++ 0xa4, 0xf8, 0xfb, 0xac, 0x97, 0x4b, 0x80, 0xb2, 0xd2, 0x1c, 0xca, 0x92, ++ 0xfa, 0x22, 0x9f, 0xc8, 0x50, 0xaf, 0x16, 0xdd, 0x7d, 0x20, 0xf5, 0xf9, ++ 0xab, 0xde, 0xee, 0x01, 0xc9, 0x00, 0x87, 0xb6, 0xc4, 0x2b, 0x92, 0x9f, ++ 0x47, 0x2d, 0x8c, 0xff, 0x8f, 0x02, 0x3d, 0x43, 0x9e, 0xd7, 0xc5, 0x24, ++ 0x5c, 0x97, 0x7a, 0x0f, 0xfd, 0x81, 0x87, 0x4f, 0xdb, 0xc0, 0xee, 0x5c, ++ 0xb2, 0xed, 0x13, 0xbc, 0x67, 0xb9, 0x4a, 0x0c, 0x3e, 0x7d, 0x37, 0xc6, ++ 0x43, 0x45, 0xf4, 0x9b, 0x2e, 0x34, 0x0f, 0xb8, 0xe4, 0xf9, 0xb3, 0xa3, ++ 0x10, 0xa7, 0xa2, 0xfa, 0xaf, 0x77, 0xa6, 0x7a, 0xce, 0x92, 0xad, 0x73, ++ 0xa6, 0xc4, 0xf8, 0x64, 0x66, 0x73, 0x2c, 0xe6, 0xe3, 0xcf, 0x5c, 0x20, ++ 0xea, 0xee, 0x91, 0x9e, 0xb9, 0x80, 0xe5, 0xf3, 0x11, 0xa9, 0x2d, 0xf7, ++ 0x0e, 0x9d, 0xbd, 0xfe, 0x58, 0x8f, 0xe3, 0x40, 0xbc, 0x20, 0x72, 0x9c, ++ 0xd9, 0x0b, 0xc6, 0x92, 0x13, 0x43, 0x61, 0x9f, 0xd6, 0x31, 0x1a, 0xe3, ++ 0x07, 0xaf, 0x30, 0xfa, 0x9a, 0x3d, 0xce, 0x25, 0x42, 0xbe, 0xf3, 0xc8, ++ 0xa5, 0x02, 0xee, 0xb7, 0x8e, 0x38, 0xa9, 0xb4, 0x04, 0x69, 0x7d, 0xb6, ++ 0x3f, 0xde, 0x09, 0xec, 0x39, 0xfb, 0xe1, 0xff, 0xe8, 0x07, 0xf7, 0x1c, ++ 0x54, 0xb7, 0xb1, 0x78, 0x60, 0xaa, 0xf8, 0x40, 0xde, 0xa3, 0x10, 0x67, ++ 0xd9, 0xcf, 0xf4, 0x38, 0xd4, 0x1f, 0x00, 0x3a, 0xb1, 0xba, 0x14, 0xab, ++ 0x66, 0xbf, 0xa0, 0x5d, 0xae, 0xc9, 0x83, 0xfb, 0xfe, 0xbc, 0xf7, 0x5b, ++ 0x5d, 0xc0, 0xff, 0x45, 0x77, 0xb8, 0x8e, 0xe0, 0x7d, 0xbe, 0x3c, 0x5e, ++ 0xa1, 0xea, 0xd5, 0x1d, 0xf5, 0x45, 0x98, 0x27, 0x5b, 0x74, 0x9f, 0x32, ++ 0x1c, 0xf0, 0x5f, 0xd4, 0x64, 0x71, 0x61, 0x69, 0x26, 0x52, 0x0c, 0x95, ++ 0x63, 0x45, 0x12, 0x31, 0x43, 0x99, 0x6a, 0x24, 0x92, 0x05, 0xca, 0x18, ++ 0x62, 0x86, 0xb2, 0x60, 0x31, 0xbb, 0xb7, 0xbb, 0xb8, 0x7e, 0x2a, 0xda, ++ 0x07, 0xf6, 0xe1, 0x85, 0x46, 0xb8, 0x8f, 0xb7, 0xa8, 0xf5, 0x17, 0xdf, ++ 0xc2, 0xfb, 0x25, 0x52, 0x60, 0x1f, 0xbb, 0x9f, 0x82, 0xc1, 0xa7, 0xa8, ++ 0xf5, 0xbd, 0x1f, 0x00, 0xaf, 0x73, 0x5d, 0x85, 0x98, 0xcf, 0x78, 0xed, ++ 0x06, 0xa3, 0xce, 0x0f, 0x1c, 0xdc, 0xa4, 0xaf, 0x5f, 0xd7, 0xa2, 0xaf, ++ 0xe7, 0x05, 0xf4, 0xf5, 0xa1, 0x07, 0xf5, 0xf5, 0xf5, 0x99, 0x04, 0xe9, ++ 0x68, 0x96, 0xf9, 0xf6, 0x1c, 0x80, 0xd7, 0xfe, 0x3d, 0x26, 0xaa, 0x8b, ++ 0x20, 0xff, 0xcf, 0x84, 0xf9, 0x2e, 0xc7, 0x05, 0x86, 0x1f, 0xef, 0x46, ++ 0x0b, 0xca, 0xc3, 0xb1, 0x15, 0xad, 0x05, 0xe0, 0x07, 0x9f, 0x7b, 0xc3, ++ 0x66, 0x00, 0x3f, 0x7a, 0xf7, 0x9f, 0x7f, 0x89, 0xfb, 0xe1, 0xa1, 0xcd, ++ 0xb1, 0x04, 0xf2, 0xac, 0xf6, 0xfd, 0x2e, 0x86, 0xc4, 0x40, 0xbe, 0xe2, ++ 0x9b, 0x96, 0x75, 0xd0, 0x5e, 0x41, 0x71, 0x07, 0xf1, 0xcb, 0x8a, 0x37, ++ 0x2d, 0x6b, 0xc1, 0x0f, 0xdf, 0x7e, 0x8d, 0xea, 0xc7, 0xfb, 0x73, 0x61, ++ 0x3d, 0xdb, 0xff, 0xc2, 0xf2, 0x6b, 0x42, 0x1b, 0x4d, 0x7e, 0xd8, 0x1f, ++ 0x3f, 0xb7, 0xf3, 0x17, 0x6f, 0xc0, 0x7e, 0xda, 0xb9, 0x8d, 0xbd, 0xd0, ++ 0xbe, 0x3a, 0x2e, 0x78, 0x0d, 0x31, 0xf0, 0xfd, 0x2f, 0x59, 0xfc, 0x33, ++ 0xc8, 0xef, 0x8b, 0x0b, 0xf2, 0xfb, 0xe2, 0x2a, 0x36, 0xe8, 0xfd, 0xe2, ++ 0x79, 0x99, 0x4c, 0xce, 0x04, 0x17, 0x5f, 0x1f, 0x17, 0xcd, 0x6e, 0x52, ++ 0xcb, 0x81, 0x69, 0x89, 0x39, 0xe3, 0xe8, 0xdc, 0x3a, 0x9f, 0x34, 0xcd, ++ 0x84, 0x38, 0xd0, 0x80, 0x7a, 0x3d, 0x5c, 0xd4, 0x7e, 0x83, 0xfc, 0xfa, ++ 0xe7, 0x8f, 0xf0, 0xf1, 0x47, 0x12, 0x63, 0x98, 0x4e, 0xb3, 0x21, 0x4f, ++ 0xc0, 0x5f, 0x67, 0x07, 0xfd, 0xfb, 0x6a, 0xf4, 0x7b, 0x92, 0x17, 0x73, ++ 0xfe, 0x79, 0xfd, 0xf5, 0xae, 0xf7, 0x44, 0x7e, 0x4f, 0x1c, 0x51, 0x34, ++ 0xe7, 0xa6, 0xc2, 0xf2, 0x9b, 0xcc, 0xef, 0x05, 0xf9, 0x1b, 0x00, 0xff, ++ 0xbe, 0xe1, 0xe7, 0x15, 0x44, 0x33, 0x1f, 0x8d, 0x7d, 0x32, 0x91, 0x8f, ++ 0xff, 0xb5, 0x99, 0xe5, 0x33, 0x27, 0xf1, 0xfb, 0xfb, 0xcf, 0xd6, 0x1e, ++ 0x44, 0xbd, 0xdf, 0x65, 0xf7, 0xd5, 0xba, 0x5c, 0xe3, 0x34, 0xf5, 0xe2, ++ 0xfa, 0x7d, 0x29, 0x45, 0xe0, 0x3f, 0x35, 0xec, 0x4b, 0x99, 0xa5, 0x81, ++ 0x57, 0xe5, 0xc6, 0x03, 0x29, 0xf7, 0x62, 0xde, 0x93, 0x04, 0x11, 0x5c, ++ 0x52, 0x39, 0xfd, 0xb5, 0x67, 0x20, 0x5e, 0x51, 0xb9, 0x51, 0x6c, 0x82, ++ 0x79, 0x42, 0x3b, 0xc0, 0xad, 0xbd, 0xe9, 0x1d, 0x3b, 0xf4, 0xa3, 0xf6, ++ 0xf0, 0x10, 0x88, 0x83, 0x84, 0xed, 0xd1, 0xf1, 0xae, 0x71, 0x1a, 0x3e, ++ 0xfe, 0x6b, 0xe9, 0x56, 0xe5, 0xb7, 0x4a, 0x6e, 0xbf, 0xec, 0x18, 0xde, ++ 0x36, 0x01, 0xf2, 0xd4, 0x2b, 0xea, 0x05, 0x27, 0x74, 0xab, 0x68, 0xba, ++ 0xf3, 0xf6, 0xc9, 0x00, 0xef, 0x06, 0x76, 0xce, 0xb5, 0x40, 0x22, 0x85, ++ 0x22, 0xe5, 0xaf, 0xca, 0x2d, 0x77, 0xde, 0x32, 0x18, 0xf2, 0x66, 0xd6, ++ 0x0c, 0x73, 0xc2, 0x7c, 0xe8, 0x10, 0x77, 0xc0, 0xf3, 0x8a, 0x4d, 0xe7, ++ 0xf1, 0x3c, 0xc3, 0xb2, 0x88, 0xdf, 0x3d, 0x50, 0xcb, 0x1d, 0x1c, 0xaf, ++ 0xcb, 0xee, 0xb2, 0x96, 0x82, 0xdc, 0xa2, 0xe3, 0xbd, 0x6d, 0x18, 0x82, ++ 0xef, 0x1f, 0x34, 0x50, 0xfb, 0xe4, 0xcc, 0x18, 0xef, 0x87, 0xf7, 0xd2, ++ 0x2e, 0xe7, 0x48, 0xd3, 0xc7, 0x93, 0x21, 0x7e, 0x54, 0xaf, 0xa7, 0x3b, ++ 0x4a, 0xc7, 0x02, 0xd8, 0x5f, 0xa1, 0xf5, 0x82, 0x73, 0x1d, 0x3e, 0x5d, ++ 0x5c, 0x70, 0x1b, 0x98, 0xd6, 0xae, 0x45, 0x98, 0xd7, 0x4b, 0xdb, 0x67, ++ 0x46, 0x3b, 0x57, 0x5d, 0xe6, 0xd7, 0x8f, 0x13, 0x89, 0xdf, 0xff, 0xc8, ++ 0x14, 0xd4, 0xfb, 0x64, 0x07, 0x6a, 0xe9, 0x24, 0xb2, 0x5f, 0xe2, 0x24, ++ 0x2f, 0xe6, 0x8d, 0x57, 0x2e, 0xa0, 0x72, 0x4f, 0x13, 0x0f, 0xa8, 0x3c, ++ 0xe9, 0xc3, 0x7b, 0x24, 0x23, 0xbf, 0x43, 0xb4, 0xf4, 0xcb, 0xec, 0x06, ++ 0xa2, 0x80, 0xdc, 0xdb, 0xcc, 0xf2, 0x63, 0xe8, 0x9f, 0x60, 0x2e, 0xe0, ++ 0xf9, 0xb8, 0xfd, 0x58, 0x1d, 0xef, 0x4f, 0x04, 0x7a, 0xa4, 0x04, 0x51, ++ 0x71, 0x0d, 0x19, 0xa7, 0x00, 0x5c, 0x6f, 0x23, 0x13, 0xa1, 0x1c, 0x09, ++ 0xf2, 0x03, 0xee, 0xcd, 0x1f, 0xde, 0x94, 0x0b, 0xfd, 0x77, 0x09, 0xc1, ++ 0xd7, 0x5e, 0xc6, 0xf1, 0x6c, 0x28, 0xaf, 0xdb, 0x1d, 0x01, 0xbc, 0x4f, ++ 0x32, 0x83, 0x9f, 0x27, 0x6d, 0x57, 0x58, 0xbd, 0x93, 0xc7, 0x33, 0xd5, ++ 0xf6, 0xf2, 0x56, 0x0b, 0xe6, 0xd3, 0x9c, 0xfb, 0xca, 0x88, 0xf2, 0x74, ++ 0x51, 0xd3, 0x01, 0xcc, 0x97, 0x6f, 0x7f, 0xc3, 0x62, 0x30, 0x50, 0xbe, ++ 0x3f, 0xb7, 0x25, 0x71, 0x0c, 0xe4, 0x5d, 0xb6, 0x37, 0xb1, 0xfb, 0x88, ++ 0xcf, 0x36, 0x25, 0x8e, 0x31, 0x5e, 0x42, 0x3f, 0x47, 0xca, 0x07, 0x55, ++ 0x6f, 0x1e, 0x83, 0x7f, 0x52, 0xfd, 0x7a, 0x31, 0xd3, 0xf5, 0x75, 0x26, ++ 0xe8, 0xa3, 0xc7, 0x58, 0x5e, 0x6a, 0x6a, 0x62, 0x4d, 0x5e, 0xb4, 0xdf, ++ 0xb9, 0x50, 0xdf, 0x4b, 0x32, 0xd6, 0xe4, 0x81, 0xbf, 0x12, 0xba, 0xdf, ++ 0xea, 0x5c, 0x87, 0x70, 0xf2, 0x66, 0x4b, 0x18, 0xef, 0x4e, 0x73, 0x42, ++ 0x3e, 0x50, 0x91, 0xc0, 0xc6, 0x35, 0xf5, 0x29, 0x24, 0xbd, 0xe9, 0xb8, ++ 0x36, 0xda, 0x17, 0xe2, 0xce, 0x09, 0x07, 0x45, 0xfc, 0x5d, 0x86, 0x13, ++ 0xa2, 0xf3, 0xa7, 0x8e, 0x7e, 0x78, 0x6f, 0x3c, 0xda, 0x3b, 0x73, 0xf2, ++ 0xdd, 0x78, 0x0f, 0x25, 0x79, 0x8c, 0xe5, 0x4f, 0xce, 0x96, 0x48, 0x40, ++ 0xa2, 0xf4, 0x36, 0x1b, 0xf4, 0x4e, 0x2e, 0xd6, 0x51, 0xfe, 0xce, 0x6e, ++ 0x10, 0x30, 0x7f, 0x6c, 0xce, 0x72, 0xfd, 0x7a, 0xe0, 0x3e, 0x5c, 0xad, ++ 0xbe, 0x2c, 0x23, 0x7e, 0x76, 0x8f, 0x85, 0x36, 0x5e, 0xd8, 0x17, 0xf2, ++ 0x5a, 0xa8, 0x5e, 0x81, 0xfb, 0x2b, 0xcd, 0x2c, 0xcf, 0xa2, 0xbc, 0x51, ++ 0xff, 0x5e, 0x05, 0x09, 0xe0, 0x7c, 0x2a, 0x37, 0xfd, 0x68, 0x8a, 0x06, ++ 0xaf, 0x6f, 0x89, 0xba, 0x2e, 0x57, 0x3a, 0xac, 0x4b, 0xb8, 0xcd, 0x8c, ++ 0xf3, 0x7a, 0xf0, 0x85, 0x38, 0xb6, 0xaf, 0x63, 0x24, 0x2e, 0xd0, 0x9b, ++ 0xa1, 0x17, 0x6c, 0x28, 0xc7, 0x2b, 0x88, 0x1b, 0xc7, 0xbb, 0x87, 0xeb, ++ 0x6f, 0xcf, 0xc3, 0x45, 0xae, 0x39, 0x20, 0x6f, 0x17, 0xcc, 0x76, 0xcd, ++ 0x49, 0x84, 0x73, 0xb5, 0x4c, 0xcf, 0xa1, 0x6b, 0x87, 0x7c, 0xcc, 0xee, ++ 0xd7, 0xaa, 0x18, 0x47, 0x02, 0xbd, 0xd9, 0xfd, 0x1a, 0x04, 0xf4, 0x67, ++ 0x45, 0xab, 0x10, 0x18, 0x0c, 0x75, 0x33, 0xf1, 0xda, 0x87, 0xb0, 0xe7, ++ 0x70, 0xcf, 0x00, 0xac, 0x5b, 0x7b, 0x8e, 0xa6, 0x94, 0xf8, 0xf0, 0x7b, ++ 0xa5, 0x0d, 0xfa, 0xe7, 0xe4, 0x30, 0xc3, 0x6b, 0x25, 0x3f, 0xaf, 0x48, ++ 0x1a, 0x35, 0xed, 0x7d, 0xc1, 0x0e, 0x63, 0xf0, 0xa8, 0xdc, 0x64, 0xd2, ++ 0xc5, 0x6f, 0x46, 0x6e, 0x12, 0xbc, 0x36, 0x3c, 0xd7, 0xea, 0xaf, 0x4b, ++ 0xa1, 0xf3, 0xab, 0x3e, 0x43, 0x65, 0x03, 0x81, 0x7c, 0xd4, 0x1f, 0x4d, ++ 0xba, 0xf1, 0x21, 0x6f, 0x67, 0x18, 0xea, 0x77, 0x62, 0xa1, 0x78, 0x7b, ++ 0xa1, 0x4b, 0x7e, 0xfb, 0x07, 0x45, 0xcb, 0xe7, 0x3f, 0xca, 0xe1, 0xf8, ++ 0xc2, 0x9d, 0xc5, 0xe9, 0xc0, 0xaf, 0xcf, 0x82, 0x7d, 0x9a, 0xc1, 0x01, ++ 0x3d, 0x1c, 0xe5, 0x13, 0x8f, 0x13, 0x90, 0x80, 0x99, 0x7e, 0x27, 0x66, ++ 0x68, 0x57, 0x1d, 0xdb, 0x0b, 0x16, 0xb3, 0xfa, 0x2d, 0xbd, 0xd7, 0x4f, ++ 0xa9, 0xa7, 0xba, 0xfb, 0x45, 0xd9, 0x8d, 0xfb, 0x3f, 0xb3, 0xc5, 0xc2, ++ 0x77, 0xe1, 0xdc, 0x57, 0x63, 0x1f, 0xf7, 0xad, 0xbd, 0x29, 0xbe, 0x66, ++ 0x1b, 0x5c, 0x59, 0x12, 0xf2, 0xad, 0xab, 0x3f, 0xc6, 0x3d, 0x17, 0x30, ++ 0x38, 0xac, 0x1a, 0x52, 0x33, 0xa8, 0x26, 0x8a, 0xbd, 0xa7, 0xe2, 0xf9, ++ 0x45, 0xa1, 0x29, 0x00, 0xfb, 0xaf, 0xde, 0x9d, 0xcc, 0xce, 0xb2, 0xe5, ++ 0x87, 0x64, 0xad, 0x1e, 0x2d, 0xeb, 0xcd, 0xe4, 0x51, 0xdc, 0xfe, 0x20, ++ 0x9e, 0x8f, 0x08, 0x6d, 0x13, 0xf0, 0x3c, 0xe5, 0x6a, 0xe1, 0x18, 0x9e, ++ 0x3b, 0x5c, 0x7d, 0x93, 0x42, 0xc0, 0x8f, 0x4f, 0xa3, 0x78, 0x02, 0xb9, ++ 0xbb, 0x5a, 0x20, 0x8f, 0xc1, 0xbd, 0x5b, 0xf9, 0xcd, 0x53, 0x1f, 0x78, ++ 0x07, 0xf0, 0x9c, 0x1f, 0xe3, 0x84, 0x9f, 0xb5, 0xa8, 0x6a, 0x1e, 0x2d, ++ 0x56, 0x59, 0x71, 0xfd, 0xcc, 0x1e, 0x8b, 0xad, 0x59, 0x0b, 0xfb, 0x36, ++ 0xa9, 0x33, 0x07, 0x0e, 0x01, 0x3a, 0xa7, 0xeb, 0x9e, 0x79, 0x1b, 0x7d, ++ 0x5e, 0xdd, 0x5b, 0x41, 0xb8, 0xa5, 0x5b, 0x19, 0xde, 0xd3, 0x16, 0x7b, ++ 0xb3, 0xe1, 0xf7, 0x9e, 0xe2, 0xf6, 0x17, 0x3e, 0xf0, 0x0e, 0xf0, 0xe1, ++ 0xe0, 0x18, 0x3c, 0x0f, 0x9b, 0x4a, 0x61, 0x65, 0x4b, 0xc0, 0x72, 0x29, ++ 0xd8, 0x59, 0x69, 0x64, 0x91, 0x00, 0xfd, 0x5e, 0xb0, 0xb3, 0xf1, 0x93, ++ 0x0d, 0xe2, 0xcc, 0xa9, 0x50, 0x1f, 0xc2, 0xea, 0x09, 0x0b, 0x05, 0xd7, ++ 0x3a, 0x24, 0xbe, 0x15, 0xb8, 0x9e, 0x54, 0x13, 0x99, 0x08, 0xf3, 0x84, ++ 0xe7, 0x60, 0x2f, 0x9a, 0x21, 0x7e, 0x80, 0xed, 0x7e, 0x86, 0xdf, 0xb1, ++ 0x35, 0x79, 0x30, 0x5e, 0x6a, 0x3f, 0x56, 0x26, 0x19, 0x03, 0x99, 0x30, ++ 0xce, 0xfb, 0x5d, 0xf8, 0x76, 0xa3, 0xff, 0x30, 0x9f, 0xeb, 0xab, 0xf9, ++ 0x5b, 0x46, 0xa7, 0x82, 0x3f, 0xf7, 0x7e, 0x3b, 0x75, 0xac, 0xa9, 0xdc, ++ 0x7a, 0x3f, 0x4d, 0xb5, 0x7b, 0x02, 0x56, 0xfc, 0x1d, 0xa8, 0xab, 0x06, ++ 0xb2, 0xfe, 0xdc, 0xff, 0x9b, 0x9f, 0xc7, 0xce, 0x15, 0x24, 0x65, 0xe9, ++ 0xfb, 0x75, 0xca, 0xae, 0xb8, 0xa1, 0x20, 0x47, 0x0f, 0x31, 0x7b, 0xfd, ++ 0x1b, 0xab, 0x0b, 0xe3, 0xd0, 0xd7, 0x1b, 0xa3, 0xc7, 0xad, 0xea, 0x7b, ++ 0x33, 0x3d, 0xe6, 0xb9, 0x28, 0x10, 0xbf, 0x46, 0x0f, 0x78, 0xa6, 0x7d, ++ 0x87, 0xf6, 0xa3, 0xe7, 0xa2, 0xa4, 0x7b, 0xde, 0x5e, 0x6b, 0xd6, 0xe5, ++ 0x33, 0x57, 0x96, 0xee, 0xc7, 0xf3, 0xf5, 0x55, 0xa4, 0x0d, 0xf3, 0xad, ++ 0xab, 0x9a, 0x62, 0x75, 0xf9, 0xb9, 0xd7, 0xc7, 0x44, 0xff, 0xae, 0x4a, ++ 0xdf, 0x9e, 0x8b, 0x22, 0xf1, 0x46, 0xfd, 0xae, 0x51, 0xff, 0xfc, 0x62, ++ 0x22, 0xf1, 0x26, 0x46, 0xeb, 0x97, 0xa2, 0x7f, 0x4e, 0xd7, 0xa1, 0xab, ++ 0xb7, 0x7c, 0xdf, 0xb5, 0x0e, 0x78, 0x4e, 0x86, 0x07, 0xed, 0xe0, 0xf7, ++ 0x4d, 0xe2, 0xf6, 0x6b, 0xa7, 0xdf, 0xe0, 0x95, 0xaf, 0x0b, 0xe3, 0xa5, ++ 0xc3, 0x11, 0xd4, 0xe9, 0x9d, 0x0e, 0x85, 0xd5, 0x3b, 0xf9, 0xbe, 0x9b, ++ 0xda, 0xae, 0x8e, 0xdf, 0x31, 0xcd, 0xc8, 0xcf, 0x0f, 0xb1, 0xfb, 0x93, ++ 0x01, 0x3e, 0xde, 0x01, 0x84, 0xbc, 0xd4, 0x7a, 0x1e, 0xe3, 0xce, 0x95, ++ 0xad, 0xfb, 0x26, 0xb0, 0xdf, 0xf1, 0x62, 0x74, 0xa1, 0x85, 0x93, 0x57, ++ 0x23, 0x3f, 0x52, 0xea, 0xda, 0x02, 0x06, 0xca, 0xdb, 0x1f, 0xad, 0x39, ++ 0xf5, 0x4c, 0xce, 0x20, 0x4a, 0x62, 0xfb, 0x39, 0x1f, 0x7b, 0xcf, 0x3c, ++ 0xe3, 0x1a, 0x45, 0xdb, 0x45, 0x83, 0x8e, 0xaf, 0x63, 0xf3, 0xbb, 0xf8, ++ 0x1c, 0xc5, 0xcb, 0x0b, 0x06, 0x91, 0xc9, 0x05, 0xef, 0x97, 0xcf, 0x8c, ++ 0x1b, 0xa5, 0xa9, 0xf3, 0xfe, 0x5d, 0xef, 0x7b, 0xcf, 0x4e, 0x81, 0xf6, ++ 0xfc, 0x1c, 0xf6, 0xfe, 0x91, 0x35, 0xe7, 0x3e, 0x5c, 0x2c, 0x85, 0xe5, ++ 0x12, 0x5d, 0x47, 0x56, 0xa1, 0x4d, 0x53, 0x37, 0x47, 0xd4, 0xad, 0xb4, ++ 0x3e, 0x58, 0x53, 0x77, 0x44, 0xb4, 0x27, 0x45, 0xb4, 0xa7, 0x45, 0xd4, ++ 0x33, 0x59, 0xff, 0x76, 0x5b, 0x20, 0x4b, 0x74, 0x12, 0x72, 0x72, 0x4d, ++ 0xe7, 0x14, 0x09, 0xfc, 0xdd, 0xf4, 0xc0, 0x0c, 0xb8, 0x39, 0x60, 0xb9, ++ 0x78, 0x61, 0xca, 0x38, 0x2a, 0xef, 0xaa, 0xf2, 0xdb, 0x30, 0x4f, 0xa6, ++ 0xba, 0x55, 0x70, 0xe2, 0xf6, 0xbd, 0x9a, 0x07, 0xef, 0x64, 0xf9, 0x1c, ++ 0x56, 0x67, 0x10, 0x7f, 0xb7, 0x2e, 0x36, 0xbf, 0xed, 0x5d, 0x90, 0x03, ++ 0x95, 0x2d, 0x82, 0x43, 0xa0, 0xf4, 0x6e, 0x6d, 0xda, 0x82, 0xf9, 0x33, ++ 0x95, 0xf0, 0x9e, 0xa2, 0x79, 0xaf, 0x89, 0xf9, 0x97, 0x95, 0x4d, 0xc7, ++ 0xf0, 0xbd, 0x1e, 0xc7, 0x1f, 0x68, 0x40, 0x7e, 0x5e, 0x36, 0xf0, 0x38, ++ 0xf6, 0x53, 0xf7, 0x89, 0xee, 0x26, 0x5d, 0xbf, 0xcb, 0xf1, 0x2d, 0xc8, ++ 0xcb, 0xaa, 0xa6, 0xd3, 0x4c, 0x0f, 0x47, 0xec, 0x13, 0x75, 0xa4, 0xbb, ++ 0x0e, 0xa0, 0x3c, 0x8c, 0x38, 0xe7, 0xea, 0x81, 0x71, 0xad, 0x61, 0xba, ++ 0x57, 0xfb, 0x7f, 0x36, 0xb8, 0xf5, 0xb7, 0x30, 0x4c, 0xec, 0xfc, 0xf3, ++ 0x8b, 0x24, 0xda, 0xff, 0x0f, 0x55, 0xa7, 0x87, 0x81, 0xbd, 0xf4, 0x19, ++ 0x97, 0xfb, 0x2f, 0x0a, 0xfe, 0x41, 0xa0, 0x9f, 0x5f, 0x22, 0xee, 0x41, ++ 0xa0, 0x8f, 0xee, 0xaf, 0xba, 0x7a, 0x9f, 0x81, 0xf6, 0x3b, 0x2a, 0x07, ++ 0xd7, 0xc0, 0x95, 0x0c, 0xfd, 0x5e, 0x31, 0xdd, 0x0a, 0xf0, 0x3b, 0x6a, ++ 0x0b, 0xf6, 0x16, 0xa8, 0x2c, 0xb9, 0x3a, 0x2b, 0x81, 0xd5, 0x93, 0x83, ++ 0x78, 0x13, 0xc3, 0x23, 0x59, 0x89, 0xac, 0xde, 0x3b, 0xd8, 0x1b, 0xf6, ++ 0x57, 0x07, 0xbd, 0x72, 0x03, 0xab, 0x5f, 0x1d, 0x5c, 0x03, 0xf5, 0xa9, ++ 0x59, 0x83, 0x6e, 0x95, 0xe8, 0x77, 0x8e, 0x0e, 0x0e, 0xf6, 0x16, 0x1d, ++ 0xe0, 0x3a, 0x5c, 0x73, 0x2b, 0xc0, 0x7f, 0xbd, 0x23, 0x3a, 0xdf, 0x66, ++ 0x64, 0x31, 0x79, 0xa1, 0xce, 0xef, 0xce, 0x3c, 0x57, 0x72, 0x16, 0xd8, ++ 0x9b, 0x95, 0x4c, 0x5f, 0xc0, 0x31, 0x4b, 0x33, 0x95, 0x8b, 0x33, 0xca, ++ 0xcf, 0x6e, 0x5e, 0x4f, 0xe1, 0x30, 0xe3, 0x67, 0xb1, 0x28, 0xaf, 0xd6, ++ 0xb7, 0xdf, 0x7e, 0x73, 0x21, 0xae, 0xdf, 0x5b, 0x08, 0xf9, 0x6c, 0xec, ++ 0x2a, 0x77, 0xae, 0xcf, 0x50, 0x2e, 0x4b, 0x68, 0x07, 0xa4, 0x83, 0x0e, ++ 0x4b, 0x08, 0xe3, 0xc3, 0x96, 0xd5, 0xa6, 0xa0, 0xbc, 0xbf, 0xa6, 0x66, ++ 0x0b, 0xe8, 0xfd, 0xd4, 0x19, 0x39, 0x28, 0xef, 0xcf, 0x67, 0xba, 0x16, ++ 0x66, 0x0d, 0x0b, 0x97, 0x17, 0xfb, 0xb1, 0x72, 0x61, 0x16, 0x3b, 0xd7, ++ 0x91, 0x2a, 0x1a, 0x30, 0xaf, 0x20, 0xf5, 0x11, 0x1b, 0xda, 0x41, 0xcf, ++ 0xf2, 0x7d, 0x23, 0xca, 0x37, 0x88, 0x5f, 0x2b, 0xc7, 0xc7, 0x75, 0x7c, ++ 0x3d, 0xd7, 0x65, 0x31, 0x7f, 0x28, 0xb5, 0xf7, 0x78, 0x1c, 0xe7, 0x1e, ++ 0x6e, 0x9f, 0xae, 0x7c, 0xd2, 0xbf, 0xd1, 0x42, 0xe1, 0xff, 0x3b, 0x20, ++ 0x92, 0x24, 0x8c, 0x63, 0xa3, 0xbd, 0x7b, 0xef, 0x5a, 0x2a, 0x37, 0xe2, ++ 0x20, 0x6f, 0xc2, 0x95, 0x0e, 0xf2, 0xe0, 0x5e, 0x88, 0xf3, 0xe6, 0x84, ++ 0xeb, 0xaa, 0xfd, 0xbe, 0x32, 0x8f, 0xd6, 0xad, 0x61, 0x7f, 0x6c, 0xe5, ++ 0x54, 0x57, 0xba, 0x36, 0xdf, 0x67, 0xe5, 0x5a, 0xd6, 0xae, 0xca, 0x9b, ++ 0x95, 0xd9, 0xec, 0x7d, 0x55, 0xef, 0xa4, 0xd6, 0x31, 0xf8, 0xa4, 0x3e, ++ 0x3b, 0x68, 0x1d, 0xac, 0x23, 0x56, 0x22, 0x78, 0xce, 0x62, 0xee, 0xb4, ++ 0xfe, 0xeb, 0x16, 0xa1, 0xfe, 0xbe, 0x0d, 0xe7, 0x4b, 0x5c, 0xae, 0x74, ++ 0xf0, 0xb3, 0x4f, 0x96, 0xf5, 0x35, 0x80, 0x5d, 0xa9, 0xe2, 0xe7, 0xa1, ++ 0x3c, 0xd7, 0x4d, 0xb8, 0x1e, 0x91, 0xe5, 0xa5, 0xab, 0x78, 0x52, 0xbf, ++ 0xbf, 0x90, 0xaf, 0x7b, 0xb6, 0x48, 0xf5, 0x3f, 0x5d, 0xe7, 0xc2, 0x3e, ++ 0xee, 0x85, 0x59, 0xcc, 0x1e, 0xc8, 0x65, 0x49, 0x04, 0xcc, 0x1e, 0x58, ++ 0x08, 0x01, 0xd7, 0xe4, 0x30, 0x7c, 0x89, 0x14, 0x1c, 0x06, 0xcf, 0xff, ++ 0x17, 0xc1, 0xa9, 0xfa, 0xef, 0x01, 0xa7, 0x28, 0xf2, 0xe2, 0x11, 0xe8, ++ 0x57, 0xb5, 0x80, 0xca, 0x0b, 0x83, 0x46, 0x5e, 0x70, 0xf8, 0xbd, 0x28, ++ 0x04, 0xe4, 0xd4, 0x7c, 0xcd, 0x3d, 0x25, 0xf4, 0x39, 0xf8, 0x81, 0x77, ++ 0xf4, 0x76, 0x2f, 0xce, 0xd2, 0xe4, 0x81, 0xcc, 0x78, 0xa4, 0x0a, 0xed, ++ 0x3f, 0x75, 0x5e, 0xb1, 0xff, 0xb2, 0x63, 0xe2, 0xdd, 0xa4, 0x3b, 0x9f, ++ 0x45, 0xda, 0x67, 0x47, 0x7f, 0x67, 0x5e, 0x8e, 0xf1, 0x3e, 0x63, 0x13, ++ 0xca, 0xc5, 0xa3, 0x37, 0x13, 0xe7, 0x22, 0x90, 0x1f, 0x7c, 0xff, 0x55, ++ 0xb5, 0x2f, 0x0b, 0x7e, 0x56, 0xf1, 0x3e, 0xf8, 0x51, 0x9d, 0x59, 0x22, ++ 0xbe, 0x67, 0x51, 0xf1, 0x2a, 0x14, 0x6e, 0x29, 0xa6, 0x70, 0x7a, 0x92, ++ 0xaa, 0x55, 0x38, 0x77, 0xee, 0x9d, 0xca, 0xf2, 0x78, 0x54, 0xbd, 0xb9, ++ 0x92, 0xdf, 0xaf, 0xbb, 0xf2, 0xe1, 0x6b, 0x31, 0x9f, 0xaf, 0x93, 0x04, ++ 0xf1, 0xf7, 0xd7, 0xbc, 0xc3, 0x09, 0xca, 0xbf, 0xae, 0xf6, 0xe9, 0xfd, ++ 0xb1, 0x9d, 0xe2, 0xdb, 0x6b, 0x01, 0x7e, 0x2f, 0x8b, 0xc1, 0xdf, 0x17, ++ 0x58, 0x99, 0x47, 0xf0, 0x3c, 0xcd, 0xca, 0xe9, 0xd7, 0x60, 0xfb, 0x6e, ++ 0x35, 0x7e, 0x34, 0xdd, 0x8c, 0xdf, 0x59, 0x39, 0x95, 0xd1, 0xd3, 0xca, ++ 0x32, 0x96, 0x6f, 0x09, 0x7a, 0x04, 0xe0, 0xd6, 0x13, 0x3d, 0xa4, 0xd4, ++ 0xb1, 0x38, 0x06, 0x91, 0x5c, 0xb9, 0xda, 0x7d, 0xff, 0x5f, 0x67, 0xb1, ++ 0x78, 0x78, 0x6c, 0x7e, 0x70, 0xdb, 0x27, 0x60, 0x57, 0x2e, 0xb7, 0xa0, ++ 0x5d, 0x09, 0xba, 0x13, 0xf7, 0x41, 0x7c, 0xa9, 0xf8, 0x3d, 0x8a, 0xd7, ++ 0xad, 0x48, 0x27, 0xaa, 0x1f, 0xf5, 0x7c, 0x3a, 0xbb, 0x57, 0x96, 0x38, ++ 0xd1, 0x3f, 0x7f, 0xc2, 0xe6, 0x2a, 0x42, 0x79, 0xf5, 0x68, 0xac, 0x02, ++ 0xf3, 0x6f, 0xb0, 0x90, 0xa5, 0xe6, 0x21, 0xe0, 0x8e, 0x90, 0xc7, 0x50, ++ 0xee, 0xf1, 0xf9, 0x10, 0xdf, 0x2a, 0xcc, 0xe7, 0x98, 0xc9, 0xed, 0xb5, ++ 0xcf, 0x4b, 0x2f, 0xd8, 0xc0, 0x1e, 0xd8, 0xc7, 0xe5, 0x0d, 0x10, 0x0c, ++ 0xf8, 0xcb, 0xb3, 0x08, 0x6b, 0x9f, 0xb5, 0x30, 0xf6, 0x18, 0xf8, 0x37, ++ 0xb3, 0x16, 0xb2, 0x7b, 0x65, 0xc9, 0xd2, 0xf1, 0x2e, 0xfd, 0xbe, 0x06, ++ 0x9d, 0x6b, 0x0a, 0xc4, 0xc1, 0xf9, 0x5f, 0x7d, 0xc8, 0x06, 0x70, 0x70, ++ 0xc3, 0x7b, 0x76, 0x18, 0xff, 0x3f, 0x6d, 0x70, 0x6f, 0x89, 0x7b, 0x21, ++ 0x3b, 0xc7, 0x4b, 0xbc, 0xf4, 0x7d, 0x4d, 0xde, 0xf3, 0x61, 0xe0, 0x5f, ++ 0x88, 0xa7, 0x8b, 0x6c, 0xfe, 0xa4, 0x36, 0x56, 0x89, 0x76, 0xff, 0xe7, ++ 0xe1, 0x2c, 0x1e, 0x3f, 0xf0, 0xad, 0x72, 0x69, 0xbf, 0xa7, 0x7e, 0x27, ++ 0x72, 0x5c, 0xea, 0xdf, 0xfd, 0x16, 0xe0, 0x45, 0xe1, 0x1e, 0x80, 0xf3, ++ 0x5e, 0xa1, 0x47, 0x45, 0xfe, 0xbb, 0xac, 0xfa, 0xf9, 0x26, 0x19, 0x43, ++ 0x4f, 0x5b, 0x68, 0xfb, 0x8c, 0x5a, 0x31, 0x7e, 0x31, 0x85, 0xa7, 0x7b, ++ 0x81, 0x0d, 0xd7, 0xab, 0xce, 0x77, 0x66, 0x6a, 0xe8, 0x06, 0xf6, 0xfb, ++ 0xaf, 0xfa, 0xf1, 0x4f, 0xc5, 0x56, 0x17, 0x40, 0xdc, 0x5b, 0xf5, 0x47, ++ 0xc8, 0x42, 0xbd, 0x3f, 0x06, 0x71, 0x89, 0xae, 0xba, 0x88, 0xf9, 0xd0, ++ 0xe8, 0xd7, 0x74, 0x7b, 0xce, 0xfd, 0xd9, 0x48, 0x3f, 0x90, 0x90, 0xbf, ++ 0x98, 0xb4, 0xfd, 0xba, 0xce, 0x63, 0x28, 0x42, 0xc4, 0xfc, 0x39, 0x5d, ++ 0x29, 0x82, 0x04, 0x78, 0x73, 0xf3, 0x3c, 0x05, 0xa3, 0x31, 0x34, 0x03, ++ 0xef, 0x8f, 0x8a, 0x98, 0xb7, 0x0a, 0x4f, 0xb1, 0x8f, 0x81, 0xc3, 0x9d, ++ 0xd1, 0x45, 0x24, 0xbc, 0xc5, 0x3e, 0x9c, 0x1e, 0x22, 0xe0, 0x9d, 0x64, ++ 0x0c, 0xf6, 0x86, 0x71, 0xdd, 0x0b, 0x4c, 0x08, 0xa7, 0xc8, 0xf1, 0x55, ++ 0xfd, 0xb8, 0xca, 0x42, 0xbc, 0xe0, 0x47, 0xd6, 0x0b, 0x02, 0xd2, 0x6b, ++ 0xfd, 0xc3, 0xb1, 0xa8, 0xef, 0x88, 0x99, 0xe1, 0xd9, 0x53, 0x1e, 0xa3, ++ 0x00, 0xfd, 0xbe, 0x64, 0x0c, 0x61, 0x3e, 0x93, 0x77, 0x17, 0xfb, 0x1d, ++ 0xd0, 0x4e, 0x4b, 0x68, 0x3b, 0xca, 0xad, 0xab, 0x58, 0xbc, 0xa1, 0xf3, ++ 0x43, 0x71, 0x2d, 0xf4, 0xeb, 0x48, 0x66, 0x74, 0xdf, 0xb1, 0x53, 0xe6, ++ 0xfc, 0x46, 0xd8, 0x7d, 0x12, 0x1f, 0x8a, 0xeb, 0xb0, 0x5d, 0x60, 0xe3, ++ 0x76, 0x2c, 0x8a, 0xc5, 0x3c, 0x29, 0x38, 0x07, 0x6a, 0x84, 0xf3, 0x99, ++ 0xde, 0x3f, 0xd6, 0x42, 0xfc, 0x45, 0xf5, 0xf3, 0x4f, 0x6c, 0x67, 0xf7, ++ 0x2a, 0xc0, 0xef, 0xf7, 0x68, 0xfd, 0x64, 0x38, 0x3f, 0x5b, 0x3a, 0x24, ++ 0x2c, 0x3f, 0xf0, 0x9e, 0x18, 0xe0, 0xf7, 0x96, 0x58, 0x1e, 0x47, 0x72, ++ 0x97, 0xe1, 0xf7, 0xee, 0x8d, 0x21, 0x90, 0x8f, 0x51, 0x6d, 0x10, 0x30, ++ 0xbf, 0xb7, 0xba, 0xfc, 0x1a, 0x3c, 0x4f, 0x42, 0xf8, 0x7d, 0xce, 0x95, ++ 0x7c, 0x6a, 0xd5, 0x06, 0xea, 0x2f, 0x0e, 0x09, 0xcb, 0x81, 0x6a, 0xc3, ++ 0xf1, 0xfe, 0xe0, 0x6f, 0x55, 0x9a, 0x97, 0xe3, 0x3d, 0xcf, 0xb4, 0xfd, ++ 0x6d, 0xf0, 0xd3, 0xe0, 0xe7, 0x76, 0xbb, 0x7e, 0xcf, 0x23, 0xbb, 0x3b, ++ 0x1e, 0xaa, 0x97, 0x9f, 0xfb, 0x33, 0x9e, 0x6f, 0x6f, 0xd6, 0xd3, 0x47, ++ 0x65, 0x98, 0x8e, 0xf0, 0x9c, 0x5c, 0xb9, 0x96, 0xae, 0xb2, 0xc3, 0xf4, ++ 0x82, 0xf6, 0x38, 0xc8, 0x91, 0x71, 0x04, 0xcf, 0xe7, 0xdb, 0x78, 0x3d, ++ 0x76, 0x62, 0x9b, 0x1f, 0xe2, 0x38, 0x1e, 0x1e, 0xd7, 0x48, 0xde, 0xcf, ++ 0xee, 0xaf, 0xb5, 0xe5, 0x37, 0x11, 0x88, 0x9f, 0x7a, 0xce, 0x30, 0x7b, ++ 0x64, 0x64, 0xeb, 0xda, 0x03, 0xe0, 0x1f, 0xc7, 0x4f, 0x6c, 0x03, 0x8f, ++ 0x8c, 0xf6, 0x67, 0x71, 0xb9, 0xc8, 0x73, 0x44, 0x23, 0x5a, 0x57, 0x88, ++ 0xe0, 0xf7, 0xa9, 0x76, 0x8c, 0xc6, 0xef, 0x1c, 0x74, 0xdb, 0x60, 0x6d, ++ 0xc9, 0xce, 0xdd, 0x82, 0x1f, 0x0b, 0xdf, 0x0b, 0xc2, 0x23, 0xe0, 0x1f, ++ 0x89, 0xe9, 0xbf, 0x17, 0xb9, 0xfe, 0xa3, 0x7a, 0x12, 0xe5, 0xf5, 0x5c, ++ 0xdf, 0x00, 0xd4, 0x93, 0xa0, 0xc7, 0x40, 0xce, 0xa9, 0x7e, 0x30, 0xc8, ++ 0x3d, 0x90, 0x33, 0x8d, 0x7d, 0xc6, 0x4c, 0xef, 0x43, 0xd7, 0x79, 0x9d, ++ 0x32, 0xe6, 0x8e, 0x3e, 0x6c, 0x3f, 0x66, 0x10, 0xda, 0xfd, 0xde, 0x2b, ++ 0xdb, 0x77, 0x52, 0xfb, 0x81, 0x3f, 0x7c, 0xe9, 0x78, 0x19, 0x83, 0x5b, ++ 0x68, 0x75, 0x1c, 0x93, 0x23, 0xf0, 0x43, 0xa0, 0x10, 0x2f, 0xfe, 0x8d, ++ 0xbc, 0x76, 0x19, 0xce, 0x4f, 0x62, 0xf7, 0x32, 0xae, 0xc9, 0x46, 0xb9, ++ 0xac, 0xc6, 0x71, 0x2a, 0x79, 0x1c, 0xab, 0x98, 0xc7, 0x7d, 0x8a, 0x79, ++ 0xdc, 0x07, 0xe2, 0xae, 0xda, 0xfc, 0x57, 0x88, 0x6b, 0x6a, 0xeb, 0x95, ++ 0x5c, 0x2e, 0x54, 0xc1, 0xef, 0x4a, 0xe1, 0xbd, 0x01, 0xa6, 0x70, 0xfe, ++ 0x2b, 0xc4, 0x7b, 0xc6, 0x91, 0x80, 0x0d, 0xda, 0x21, 0xee, 0x63, 0x67, ++ 0xe7, 0xec, 0xb4, 0xef, 0x7b, 0x88, 0x7f, 0xac, 0x84, 0x74, 0xfe, 0xa3, ++ 0x49, 0x77, 0x3f, 0xd6, 0x4a, 0xb6, 0xde, 0x99, 0x1c, 0xef, 0xab, 0x2d, ++ 0x2c, 0xde, 0x33, 0x72, 0xe1, 0x5a, 0x91, 0x05, 0xb1, 0xd8, 0x7a, 0xe3, ++ 0x86, 0xb8, 0xb2, 0x1f, 0xcf, 0x0f, 0xdf, 0xd3, 0xf5, 0x05, 0xc7, 0x93, ++ 0x0a, 0x17, 0x53, 0x9f, 0x31, 0x33, 0x00, 0xde, 0x31, 0x22, 0xbb, 0xe7, ++ 0x3c, 0xf4, 0x38, 0xfb, 0xdd, 0xeb, 0x93, 0x54, 0x7f, 0x6f, 0xe1, 0xf1, ++ 0x90, 0xdb, 0xac, 0x78, 0xce, 0xd8, 0x75, 0x15, 0xe4, 0x27, 0x48, 0x8e, ++ 0xac, 0xdb, 0xa2, 0xfc, 0x7e, 0xeb, 0xb2, 0x5d, 0x16, 0xbc, 0xaf, 0xff, ++ 0x69, 0x2e, 0x8f, 0xd4, 0xe7, 0x63, 0xfb, 0xb0, 0xbc, 0x5e, 0x8c, 0x13, ++ 0x01, 0xdc, 0x17, 0xc5, 0xa2, 0x1d, 0x4e, 0xc1, 0x9c, 0x0b, 0x74, 0x54, ++ 0xd0, 0x57, 0xd5, 0xa7, 0x24, 0x17, 0xe2, 0x53, 0xc7, 0x78, 0x9e, 0x67, ++ 0xf5, 0x5d, 0x56, 0x37, 0x8c, 0x17, 0xe4, 0xf1, 0xf1, 0x97, 0xb8, 0x1c, ++ 0x7b, 0xa9, 0x0f, 0xbb, 0xf7, 0x5f, 0xad, 0x77, 0xf9, 0x7d, 0x9c, 0x5e, ++ 0xd4, 0xfd, 0x2c, 0x88, 0xd7, 0x68, 0xe3, 0xdb, 0x6b, 0xfb, 0xa8, 0x71, ++ 0x6b, 0x16, 0x5f, 0x51, 0xf5, 0xef, 0x8b, 0x65, 0x31, 0x6b, 0xd9, 0xbd, ++ 0xee, 0x2a, 0xdd, 0x1a, 0xf0, 0x1c, 0x65, 0x6c, 0x4e, 0xa1, 0x11, 0xe2, ++ 0x4c, 0xbb, 0xb8, 0x1c, 0x29, 0xe2, 0xfe, 0xfc, 0x2e, 0xd8, 0xa8, 0x05, ++ 0x79, 0xd2, 0xc4, 0xe3, 0xd2, 0x92, 0x63, 0x06, 0xfc, 0x3e, 0xd0, 0xae, ++ 0x33, 0x39, 0x98, 0x37, 0x99, 0x64, 0x64, 0xf2, 0x65, 0xd7, 0x3d, 0x31, ++ 0x04, 0xf2, 0xf8, 0x0e, 0x9e, 0x7d, 0xfd, 0xa9, 0x0f, 0x69, 0xfb, 0x85, ++ 0x33, 0x46, 0xbc, 0x17, 0x6f, 0x0e, 0x8f, 0xc7, 0xee, 0x82, 0xfb, 0xdf, ++ 0x41, 0x5e, 0x6e, 0x33, 0x61, 0x9c, 0xb1, 0xd2, 0xc8, 0xec, 0xc9, 0xca, ++ 0xbd, 0x83, 0x99, 0x1d, 0x63, 0x74, 0xaf, 0x86, 0xfc, 0x6e, 0xef, 0x56, ++ 0x19, 0xe3, 0x5e, 0x95, 0x76, 0xff, 0xc6, 0xd7, 0xb0, 0x3d, 0xdd, 0x49, ++ 0x31, 0x0b, 0xe7, 0x42, 0x99, 0x1d, 0xbc, 0x33, 0x96, 0xbd, 0x1f, 0xe3, ++ 0xff, 0xb7, 0x37, 0xc0, 0x2f, 0xdd, 0x9b, 0xea, 0xf4, 0xd2, 0xfe, 0x0b, ++ 0xd2, 0xdc, 0x6f, 0x01, 0x5e, 0x33, 0x4c, 0x4a, 0x1c, 0x51, 0xf7, 0x57, ++ 0x85, 0xf0, 0xb9, 0xd1, 0xe3, 0x7e, 0x66, 0x37, 0x1f, 0x07, 0xc1, 0x03, ++ 0xdf, 0x69, 0xb5, 0xf1, 0xdf, 0x13, 0x70, 0xa5, 0xcf, 0xa5, 0xe3, 0x9c, ++ 0x78, 0x32, 0x15, 0xd7, 0x43, 0xe5, 0x2d, 0xda, 0x57, 0x27, 0x9e, 0x31, ++ 0xe1, 0xfe, 0xd9, 0x8b, 0x5d, 0xdf, 0x65, 0xf1, 0xd1, 0xe3, 0x72, 0x21, ++ 0xde, 0x1b, 0x73, 0x7c, 0x5b, 0x9e, 0x93, 0x7a, 0x9e, 0xa4, 0xb3, 0xd0, ++ 0x18, 0x80, 0xf8, 0xb7, 0xe7, 0x59, 0x66, 0xef, 0xcd, 0x36, 0x28, 0xaf, ++ 0x00, 0x7c, 0xc8, 0xde, 0x58, 0xa7, 0xce, 0x5f, 0x7d, 0xa6, 0x84, 0xdd, ++ 0x23, 0x51, 0xbe, 0x70, 0xca, 0xa5, 0xf6, 0xb3, 0x41, 0xbe, 0x6b, 0xe3, ++ 0xbf, 0x1d, 0x24, 0x94, 0x85, 0xfe, 0x6a, 0x69, 0xdf, 0x26, 0xc8, 0x2b, ++ 0xed, 0x68, 0x1d, 0xe4, 0x64, 0xdb, 0x56, 0x69, 0xb8, 0x39, 0x52, 0xcd, ++ 0xf7, 0x99, 0x4f, 0xca, 0x0c, 0xbe, 0xa1, 0x3d, 0x32, 0xd2, 0xf3, 0x95, ++ 0x8e, 0x0f, 0x74, 0xd1, 0xf5, 0x7b, 0x77, 0x22, 0xc1, 0xdf, 0x71, 0xd3, ++ 0xee, 0xab, 0x45, 0xee, 0x53, 0x74, 0xaf, 0x33, 0x3c, 0x7a, 0x76, 0xa5, ++ 0x72, 0xbb, 0x4e, 0xdf, 0x7e, 0x7b, 0xa6, 0xfb, 0x3c, 0xc8, 0xb9, 0xea, ++ 0xe7, 0xbe, 0x3f, 0xba, 0x40, 0x81, 0xef, 0x85, 0x50, 0x1e, 0x12, 0x1f, ++ 0x8b, 0xb7, 0x9f, 0x94, 0x5d, 0x33, 0x80, 0x6e, 0xe3, 0xc7, 0x05, 0x74, ++ 0xf9, 0x5a, 0x16, 0x85, 0xfb, 0x07, 0x26, 0x6e, 0xff, 0x91, 0x80, 0x51, ++ 0xcb, 0x87, 0x6a, 0x7b, 0xc1, 0x18, 0x12, 0x75, 0x5f, 0xc7, 0xac, 0x30, ++ 0xfa, 0xb7, 0xf1, 0xfd, 0x67, 0xf5, 0xf9, 0xff, 0x01, 0x6b, 0x50, 0xa8, ++ 0xea, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x8b, 0x08, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xc5, 0x7d, 0x0b, 0x78, 0x54, 0xd5, ++ 0xb5, 0xf0, 0x3e, 0x73, 0xce, 0xbc, 0x92, 0x99, 0x64, 0x26, 0x99, 0x24, ++ 0x93, 0x17, 0x39, 0x79, 0x07, 0x92, 0xc0, 0x10, 0x43, 0x44, 0x8b, 0x72, ++ 0x12, 0x02, 0x06, 0x8c, 0x38, 0x3c, 0x54, 0xac, 0x16, 0x87, 0x37, 0x28, ++ 0x79, 0x08, 0xda, 0x1b, 0x5b, 0x6c, 0x06, 0x92, 0x42, 0x40, 0xac, 0xa1, ++ 0x44, 0x5e, 0x02, 0x4e, 0x10, 0x94, 0xb6, 0xda, 0x06, 0x8b, 0x88, 0x35, ++ 0xf2, 0x0f, 0x88, 0x14, 0x7b, 0xb5, 0x37, 0x3e, 0xda, 0x8b, 0xf6, 0x5e, ++ 0xff, 0xa8, 0x94, 0xfa, 0x02, 0x22, 0x5a, 0x2e, 0xb7, 0x57, 0xeb, 0xbf, ++ 0xd6, 0xda, 0xfb, 0x24, 0x73, 0x86, 0x44, 0xb0, 0xed, 0xed, 0x1f, 0x3e, ++ 0xd8, 0xec, 0xb3, 0x5f, 0x6b, 0xaf, 0xbd, 0x5e, 0x7b, 0xed, 0xb5, 0x77, ++ 0xbe, 0xfa, 0x0a, 0x7e, 0xc6, 0x33, 0x66, 0x53, 0x4d, 0x8c, 0x25, 0x31, ++ 0xf8, 0x99, 0x61, 0x65, 0xc9, 0x8c, 0x5d, 0xcd, 0xf8, 0x4f, 0xd6, 0x07, ++ 0x4c, 0x0b, 0x39, 0x18, 0xb3, 0xab, 0x2a, 0x63, 0x63, 0xe0, 0xfb, 0x07, ++ 0x61, 0xcb, 0x3c, 0xc8, 0x67, 0xad, 0x08, 0x5b, 0x16, 0x8a, 0x34, 0x00, ++ 0xe9, 0x49, 0x33, 0x0b, 0xdb, 0xca, 0x21, 0xdd, 0xea, 0x0c, 0xed, 0xca, ++ 0xc6, 0x96, 0x1a, 0xc3, 0x7e, 0x16, 0x8e, 0x85, 0xff, 0x42, 0xd3, 0x85, ++ 0x32, 0x6b, 0xb5, 0x95, 0xe1, 0x77, 0xf5, 0x60, 0xaf, 0x87, 0xb1, 0x53, ++ 0xcf, 0xb8, 0x7d, 0xeb, 0xe0, 0x3b, 0xfb, 0xe2, 0x2b, 0x99, 0x55, 0x30, ++ 0x36, 0x87, 0x89, 0x7a, 0x56, 0xd6, 0x66, 0x4b, 0x60, 0xec, 0xd9, 0x56, ++ 0x29, 0x6c, 0x83, 0x7a, 0x73, 0xb6, 0x58, 0x77, 0xd9, 0xa1, 0xbf, 0x8a, ++ 0x55, 0x9a, 0xec, 0x84, 0x7c, 0xdf, 0x0e, 0xc9, 0xb7, 0x0b, 0xea, 0xcd, ++ 0x69, 0xad, 0x2c, 0xd8, 0x0a, 0xf9, 0x3b, 0xf7, 0x97, 0xfa, 0x64, 0x68, ++ 0x1a, 0x87, 0xe3, 0x60, 0x3e, 0xe4, 0x0e, 0xc9, 0x50, 0xff, 0xea, 0xa6, ++ 0x09, 0xec, 0xfd, 0x2b, 0x18, 0x9b, 0x67, 0x0d, 0x59, 0x14, 0xf8, 0xce, ++ 0x7e, 0x26, 0xb1, 0x3d, 0x8c, 0xfa, 0x6f, 0xc5, 0xfe, 0x97, 0x42, 0xa3, ++ 0x54, 0x80, 0xe7, 0x2b, 0x31, 0x7f, 0x3d, 0x5d, 0xb4, 0xc5, 0x0a, 0xc8, ++ 0xe0, 0x73, 0xff, 0x0a, 0xff, 0x09, 0x45, 0xe4, 0x73, 0xa0, 0xdf, 0xae, ++ 0x4e, 0x99, 0xc1, 0x7c, 0xd9, 0x5e, 0xf8, 0x5e, 0x34, 0xf0, 0x7d, 0xa9, ++ 0x12, 0x3e, 0x2c, 0xc5, 0x31, 0x56, 0xd7, 0x15, 0xd5, 0x9e, 0xfd, 0xd5, ++ 0xda, 0x5f, 0x0f, 0x01, 0x65, 0x41, 0xc2, 0xb3, 0xc7, 0xc2, 0xee, 0xf0, ++ 0x3b, 0x68, 0xd2, 0x29, 0xd3, 0x4a, 0x19, 0xfb, 0x23, 0xfe, 0x37, 0x95, ++ 0x31, 0x6b, 0x96, 0xbf, 0x5c, 0x1d, 0x83, 0x99, 0xbc, 0x94, 0xe9, 0x4e, ++ 0x98, 0x77, 0x15, 0x9f, 0x57, 0xdf, 0x3e, 0x89, 0xf0, 0x5a, 0xc7, 0x1a, ++ 0x2d, 0x0c, 0xfb, 0xe9, 0x48, 0x64, 0xec, 0xaa, 0x88, 0x71, 0x6d, 0x2c, ++ 0x1c, 0x0b, 0xe9, 0x29, 0x39, 0x48, 0xe5, 0x0b, 0xad, 0x1b, 0x28, 0x9d, ++ 0xac, 0x66, 0xd3, 0xba, 0xdd, 0xc9, 0x7a, 0x2d, 0x2c, 0x17, 0xfb, 0xed, ++ 0xb3, 0xf8, 0x61, 0x3c, 0x67, 0x0f, 0xac, 0x6b, 0xc9, 0xc5, 0xf3, 0x9f, ++ 0x7c, 0x09, 0x3a, 0x98, 0x82, 0x74, 0x00, 0xe5, 0x4b, 0x3f, 0x60, 0xe1, ++ 0x6b, 0x60, 0xbc, 0xa5, 0x2b, 0x58, 0xb8, 0x6e, 0x24, 0x4f, 0x9d, 0x90, ++ 0x2e, 0x54, 0x58, 0x30, 0x0e, 0xf0, 0xba, 0x10, 0x70, 0x10, 0x2f, 0xd2, ++ 0x98, 0x32, 0x8e, 0x57, 0xb5, 0x68, 0x00, 0x2f, 0x4b, 0x42, 0xc6, 0x3c, ++ 0xe2, 0x53, 0x8d, 0xc0, 0x33, 0xe2, 0x31, 0xb2, 0xbc, 0xe1, 0xe0, 0x57, ++ 0xd6, 0xc8, 0x7c, 0x8a, 0x05, 0x68, 0x32, 0x61, 0x60, 0x9d, 0x61, 0xa1, ++ 0x68, 0x9e, 0x29, 0x13, 0x1a, 0x47, 0x37, 0x02, 0x9c, 0x57, 0xaf, 0x08, ++ 0xc9, 0x0c, 0xe6, 0x97, 0x92, 0xa9, 0x55, 0xe7, 0x01, 0xbc, 0xb1, 0xe5, ++ 0x7c, 0xbe, 0x0d, 0x27, 0x6c, 0x36, 0x75, 0x14, 0xe6, 0xfd, 0x2c, 0x07, ++ 0xea, 0x7d, 0x9a, 0x51, 0xf9, 0x8b, 0x7c, 0x28, 0x6f, 0x50, 0x98, 0xd6, ++ 0x05, 0xe5, 0xb1, 0x80, 0x97, 0x4e, 0xf8, 0xbe, 0xc3, 0xce, 0x82, 0xd8, ++ 0xff, 0xf6, 0x7c, 0x4e, 0xf7, 0x5e, 0x0b, 0xa7, 0x5f, 0xb3, 0xe2, 0x67, ++ 0xa3, 0x1d, 0xb8, 0x2e, 0x3d, 0x61, 0x13, 0xae, 0x4b, 0x12, 0x73, 0x21, ++ 0x3d, 0xea, 0xf8, 0xdc, 0xe1, 0x84, 0x76, 0x65, 0xd8, 0x4e, 0xa2, 0x76, ++ 0xfd, 0xed, 0x6d, 0xac, 0x35, 0x26, 0xa2, 0x7d, 0xd5, 0xaf, 0xec, 0x8c, ++ 0x01, 0xbf, 0x9c, 0x7f, 0xce, 0x19, 0xb2, 0x42, 0x55, 0xa6, 0x04, 0xb2, ++ 0xdc, 0xd0, 0x5f, 0xf2, 0x1f, 0xac, 0x6c, 0x1d, 0xe4, 0xcf, 0xfc, 0xca, ++ 0xb9, 0x18, 0xfb, 0x3b, 0x63, 0x66, 0xb3, 0xba, 0xa0, 0xbe, 0x47, 0x66, ++ 0x8d, 0x5d, 0x44, 0x2f, 0xab, 0x09, 0xff, 0xdf, 0xc7, 0x75, 0x4d, 0x42, ++ 0x6a, 0xaa, 0x4a, 0x67, 0x48, 0xfb, 0xd2, 0x94, 0x74, 0xe6, 0xc5, 0xf2, ++ 0x55, 0x34, 0x5e, 0x9d, 0x1b, 0xe8, 0x6b, 0x90, 0xf5, 0xed, 0x2f, 0xcf, ++ 0xee, 0xb9, 0x99, 0xd3, 0x95, 0x55, 0xdd, 0x05, 0xe3, 0x9d, 0x77, 0xf7, ++ 0x7e, 0x17, 0xf3, 0x00, 0x0f, 0x0b, 0x42, 0x7e, 0xb9, 0x58, 0xe7, 0x86, ++ 0xfd, 0x13, 0x46, 0x7f, 0x1f, 0xbe, 0x37, 0xf8, 0x1d, 0x3e, 0x8e, 0xfd, ++ 0xc0, 0x68, 0xa4, 0x57, 0xab, 0x7c, 0xcf, 0xcd, 0x36, 0xa0, 0xaf, 0x49, ++ 0xf2, 0x8a, 0xbe, 0xfb, 0x60, 0x1e, 0x75, 0x99, 0x0e, 0x97, 0x15, 0x9a, ++ 0x54, 0x67, 0xfd, 0xc7, 0xef, 0x6f, 0x85, 0xfc, 0x87, 0xfb, 0xcd, 0xcc, ++ 0x8a, 0xeb, 0xbc, 0x67, 0xc2, 0x2c, 0x96, 0x73, 0x31, 0x1c, 0x7a, 0xba, ++ 0x24, 0x64, 0x7e, 0xaf, 0x37, 0x82, 0x5f, 0xee, 0xda, 0x6b, 0xcc, 0xd7, ++ 0x75, 0x19, 0xf3, 0x0d, 0x4c, 0x79, 0xaf, 0x57, 0xa7, 0x03, 0x40, 0xc1, ++ 0x36, 0xd5, 0xe9, 0x39, 0x15, 0x4b, 0xb2, 0xc3, 0xf7, 0x15, 0xd0, 0xb7, ++ 0xd5, 0xda, 0xf8, 0x41, 0x27, 0xc0, 0x6b, 0x7d, 0xde, 0xea, 0x5b, 0x89, ++ 0xf5, 0xd5, 0xc0, 0xa3, 0xc8, 0x4f, 0xf5, 0xa6, 0xbe, 0x63, 0x88, 0x67, ++ 0x6b, 0xd6, 0x27, 0x23, 0x03, 0x80, 0x97, 0xaa, 0xac, 0x2f, 0x8e, 0xa5, ++ 0x23, 0xfe, 0xef, 0x67, 0x3e, 0x84, 0xfb, 0xbc, 0xbd, 0x72, 0x0e, 0xad, ++ 0xc7, 0x56, 0xbb, 0x1a, 0x8c, 0x90, 0x5f, 0x0d, 0x82, 0xfe, 0x3b, 0x86, ++ 0xd5, 0x52, 0x79, 0xc7, 0x36, 0xab, 0x2a, 0xf1, 0xf2, 0xda, 0x31, 0x20, ++ 0xb7, 0x16, 0x13, 0x0b, 0x53, 0x15, 0x9b, 0x09, 0xf0, 0xdf, 0xb0, 0x65, ++ 0xf2, 0x87, 0xd2, 0x48, 0x2a, 0xb7, 0xe1, 0x7a, 0x74, 0x00, 0x9d, 0x52, ++ 0xbb, 0xa7, 0xa5, 0xd0, 0x4a, 0x68, 0xb7, 0x78, 0xcb, 0xa2, 0x5a, 0x06, ++ 0xe5, 0xa7, 0x59, 0xc8, 0x62, 0x03, 0x78, 0x4e, 0xe9, 0x78, 0x96, 0xbb, ++ 0x27, 0xd9, 0xe0, 0xbf, 0x1d, 0x09, 0x35, 0xc3, 0x51, 0xbe, 0x28, 0x5f, ++ 0x2a, 0x7e, 0x5c, 0xff, 0x35, 0xd8, 0xd5, 0x55, 0x03, 0xf8, 0xea, 0xee, ++ 0xe7, 0x4f, 0x5b, 0xfb, 0x49, 0xc0, 0xcb, 0xf5, 0x4c, 0x62, 0xf1, 0x38, ++ 0x6f, 0x77, 0xa0, 0x5b, 0x4d, 0x42, 0x39, 0xd0, 0x6b, 0xa9, 0x84, 0x7e, ++ 0xc6, 0x7f, 0xf9, 0x39, 0xc9, 0xe5, 0x45, 0x4d, 0x2f, 0xe6, 0x9e, 0xbc, ++ 0x02, 0xe5, 0x8d, 0x36, 0x87, 0xd6, 0x1b, 0xe6, 0x87, 0x72, 0x64, 0xd1, ++ 0x7d, 0x87, 0xe9, 0xbb, 0x34, 0xdd, 0x46, 0xf0, 0x9d, 0xca, 0x74, 0x84, ++ 0xac, 0xf0, 0xfd, 0xc5, 0xad, 0x56, 0x9e, 0x77, 0x5b, 0x28, 0x7f, 0x6a, ++ 0x87, 0x44, 0xf9, 0x45, 0x5d, 0x52, 0xc8, 0x96, 0x8d, 0xf5, 0x2f, 0x24, ++ 0x56, 0xa2, 0xfc, 0xde, 0x61, 0x76, 0x59, 0xd9, 0xc5, 0x78, 0x8a, 0xc6, ++ 0xcb, 0x9f, 0xb6, 0xff, 0x7b, 0x1c, 0x03, 0x90, 0xff, 0xc4, 0x58, 0x0d, ++ 0xf2, 0x17, 0x73, 0x35, 0xc6, 0xf9, 0x9d, 0x58, 0xd6, 0x18, 0x37, 0xbd, ++ 0x14, 0xf1, 0x75, 0xdd, 0x87, 0x28, 0xbf, 0x16, 0xed, 0x90, 0x7d, 0x61, ++ 0x94, 0xd3, 0x2f, 0x38, 0x7d, 0xf9, 0x0c, 0xf3, 0x13, 0x87, 0x2f, 0x70, ++ 0x60, 0xfb, 0xcf, 0x12, 0x2b, 0x11, 0x7f, 0x3b, 0x27, 0xba, 0x64, 0xfa, ++ 0x2e, 0xfb, 0x51, 0x0e, 0x31, 0x45, 0xeb, 0x19, 0x0f, 0xdf, 0x95, 0x9d, ++ 0x57, 0xaa, 0xc8, 0x2f, 0x47, 0x77, 0x70, 0xb8, 0x17, 0xb9, 0x6d, 0x8f, ++ 0xe3, 0x3a, 0x8f, 0xff, 0x52, 0x26, 0xfa, 0x57, 0x4c, 0x2c, 0xb0, 0xcf, ++ 0x81, 0xeb, 0xa0, 0x0d, 0x47, 0xbe, 0x53, 0xb7, 0xef, 0x99, 0x84, 0xf8, ++ 0xfd, 0xd3, 0xb4, 0x34, 0x13, 0xd5, 0x7f, 0x4a, 0x62, 0x2e, 0xc4, 0x87, ++ 0xbb, 0x29, 0x19, 0xbf, 0x2f, 0x92, 0x14, 0x3f, 0xf2, 0xd9, 0xe2, 0x2d, ++ 0x4b, 0x6a, 0x59, 0xdc, 0x00, 0xde, 0xd7, 0xa8, 0x32, 0xe1, 0xbd, 0x32, ++ 0x6b, 0x45, 0x72, 0xaf, 0x83, 0xe8, 0xfe, 0x66, 0xd4, 0x77, 0x75, 0x3b, ++ 0x80, 0xce, 0x71, 0xfc, 0xe9, 0x6f, 0xff, 0xfe, 0x56, 0xcf, 0x00, 0xdd, ++ 0x4b, 0xd3, 0xb7, 0x4c, 0xbd, 0x1a, 0xfb, 0x7f, 0xc2, 0x4c, 0xf4, 0xa5, ++ 0xf7, 0xd3, 0xb0, 0xfd, 0x06, 0x41, 0x1f, 0x8c, 0x85, 0x01, 0x4f, 0x8b, ++ 0x04, 0x9e, 0xac, 0x59, 0x2b, 0x0a, 0x70, 0xfc, 0x4b, 0xf1, 0xc3, 0xa2, ++ 0x55, 0x8d, 0x05, 0x2e, 0xc7, 0xa5, 0xf9, 0xa2, 0x9f, 0xdf, 0xb7, 0x03, ++ 0x7f, 0x14, 0x83, 0x16, 0x52, 0x25, 0xf6, 0x15, 0xac, 0x03, 0xcb, 0x48, ++ 0x20, 0x3d, 0x33, 0x14, 0x3f, 0xea, 0xfa, 0xc9, 0x51, 0x64, 0x22, 0x79, ++ 0x6f, 0xf3, 0x31, 0x6d, 0x0f, 0xa4, 0x29, 0x56, 0xa6, 0x49, 0x20, 0xbf, ++ 0x72, 0xb3, 0x15, 0x92, 0x1f, 0xb9, 0xd9, 0x16, 0xaa, 0xa7, 0xfc, 0xf7, ++ 0xb2, 0xbd, 0xaf, 0x02, 0xfc, 0xbf, 0x54, 0x03, 0x8e, 0x6c, 0xf8, 0x9e, ++ 0xc5, 0xb4, 0xd1, 0xa8, 0x67, 0xd4, 0x3e, 0x57, 0x55, 0x3c, 0xf4, 0xe6, ++ 0x40, 0x02, 0x29, 0x47, 0x38, 0xac, 0xa1, 0x3d, 0x24, 0xe7, 0x20, 0x0f, ++ 0x78, 0xda, 0x94, 0xc4, 0x1e, 0x5f, 0x17, 0x01, 0x67, 0x96, 0xe8, 0x0f, ++ 0xf8, 0x35, 0x09, 0xfb, 0x39, 0xf3, 0xd6, 0x17, 0xc7, 0x10, 0x8f, 0xf5, ++ 0xc3, 0x3e, 0x19, 0x89, 0x7a, 0xbb, 0xe1, 0xc2, 0xe7, 0x16, 0x15, 0xd6, ++ 0xd3, 0xd1, 0x2d, 0x91, 0x9c, 0x75, 0xf8, 0xfc, 0x0c, 0xe9, 0xa3, 0xa1, ++ 0x7b, 0x1a, 0x9b, 0x5f, 0x32, 0x20, 0x1f, 0x1b, 0x7c, 0x5c, 0x7e, 0x47, ++ 0xcf, 0xeb, 0xce, 0x6c, 0x33, 0xc1, 0xdd, 0xe0, 0xe9, 0xa3, 0x7e, 0xa6, ++ 0xe4, 0x70, 0xb9, 0xdc, 0xe1, 0xe6, 0xfc, 0xb9, 0xad, 0x29, 0x26, 0x84, ++ 0x72, 0x6f, 0x9b, 0x27, 0x64, 0x47, 0xa0, 0x63, 0xcb, 0x83, 0x0c, 0xe5, ++ 0xfb, 0xd4, 0x72, 0xd9, 0x87, 0x60, 0xeb, 0x76, 0x8a, 0xdf, 0xc6, 0xd7, ++ 0xcb, 0xa6, 0xbd, 0xc8, 0x64, 0xa4, 0x57, 0x9f, 0xec, 0x43, 0x11, 0xdf, ++ 0xa3, 0xbd, 0xdf, 0x9a, 0x08, 0xf9, 0x57, 0xcb, 0x27, 0xfa, 0x64, 0xc8, ++ 0x3b, 0xb4, 0xc7, 0xda, 0x72, 0x70, 0xde, 0x3e, 0xb3, 0x28, 0xcf, 0x0d, ++ 0xe2, 0xbc, 0x5f, 0x19, 0x57, 0x49, 0xf6, 0xca, 0x54, 0x4d, 0xa6, 0x71, ++ 0xd9, 0xe2, 0xb8, 0x10, 0xaa, 0x8a, 0x1e, 0xed, 0x0d, 0xcf, 0x7c, 0x18, ++ 0xf7, 0x46, 0xa6, 0x6d, 0x3c, 0x09, 0xeb, 0x58, 0x03, 0xca, 0x1b, 0xd7, ++ 0xb1, 0x07, 0xc7, 0x86, 0xf5, 0x3a, 0xed, 0x0a, 0x5c, 0x95, 0x9d, 0x34, ++ 0x30, 0x9f, 0x1b, 0x7c, 0x93, 0x37, 0x9e, 0x8c, 0xb4, 0x33, 0x34, 0x6e, ++ 0x0f, 0xc0, 0x27, 0xae, 0xc7, 0xca, 0x07, 0xc7, 0xc3, 0x28, 0xb5, 0x72, ++ 0x3c, 0xe2, 0x77, 0xfc, 0xb5, 0x7c, 0x1d, 0x3e, 0x7a, 0xca, 0x1a, 0x5a, ++ 0x05, 0xe3, 0x7f, 0x64, 0x07, 0x3d, 0x13, 0xa1, 0x2f, 0x3e, 0x72, 0x72, ++ 0xbd, 0x33, 0x2d, 0x9b, 0xeb, 0x31, 0xc6, 0xba, 0x86, 0xa1, 0xdc, 0xef, ++ 0xcf, 0x2b, 0xc3, 0x4d, 0xc8, 0xf7, 0xf7, 0xb8, 0x38, 0x3e, 0x3c, 0x96, ++ 0xae, 0x61, 0xc8, 0x6f, 0x1f, 0x4b, 0xc6, 0x7e, 0xee, 0x6c, 0x93, 0x59, ++ 0x08, 0xe4, 0xcc, 0x92, 0x36, 0x89, 0x85, 0x00, 0xc4, 0x8f, 0x7e, 0xf2, ++ 0xec, 0x30, 0x94, 0xbf, 0x1f, 0xee, 0x79, 0x76, 0xd8, 0xdc, 0x08, 0xf8, ++ 0xa2, 0xdb, 0xe9, 0xe9, 0x6d, 0xfa, 0x78, 0xed, 0x9b, 0x35, 0x1b, 0x8c, ++ 0x37, 0x97, 0xe9, 0xe3, 0x85, 0x33, 0x70, 0xbc, 0xb9, 0x3e, 0xeb, 0xbb, ++ 0x28, 0x3f, 0x58, 0xdb, 0x44, 0xad, 0x37, 0xc2, 0x7e, 0x20, 0x09, 0x19, ++ 0x51, 0x9f, 0x6d, 0xd1, 0x48, 0x7e, 0x9f, 0x05, 0x6e, 0x44, 0xba, 0xd3, ++ 0xdb, 0x9d, 0x5d, 0x1c, 0xa3, 0xa1, 0x9d, 0x79, 0x96, 0xd9, 0x42, 0x12, ++ 0x0c, 0x35, 0xb7, 0x5b, 0x0e, 0x5b, 0xb1, 0x3f, 0x4d, 0xcb, 0xf3, 0xc0, ++ 0x7a, 0xd7, 0xeb, 0xed, 0xa3, 0xfa, 0x7f, 0x38, 0x87, 0xcb, 0x6d, 0xe9, ++ 0xa0, 0x14, 0x76, 0x42, 0xfd, 0xd8, 0x92, 0x3e, 0x92, 0xb7, 0x4b, 0x6c, ++ 0xfe, 0x63, 0xe9, 0x50, 0xb4, 0x04, 0xd7, 0x11, 0xea, 0x4f, 0xc6, 0x75, ++ 0x94, 0x90, 0x5e, 0x35, 0x0b, 0xce, 0x5b, 0x91, 0xb8, 0x3c, 0x3f, 0xed, ++ 0xf2, 0x2f, 0xc3, 0xf5, 0x5c, 0xd0, 0x6e, 0x5c, 0xc7, 0x61, 0xd9, 0x2e, ++ 0x2e, 0xdf, 0x5d, 0x1e, 0x5a, 0x77, 0x4b, 0xbd, 0x43, 0x41, 0x7d, 0x91, ++ 0xdc, 0xc2, 0xb8, 0x1d, 0x78, 0xaf, 0x29, 0x84, 0xfa, 0xda, 0x13, 0x13, ++ 0x37, 0x92, 0x81, 0x1d, 0x63, 0x49, 0xf3, 0x3a, 0x50, 0x4e, 0x8d, 0x2f, ++ 0x88, 0x69, 0x35, 0xc5, 0xe3, 0xf7, 0x61, 0x21, 0xac, 0x9f, 0x99, 0x56, ++ 0x44, 0xed, 0x82, 0x55, 0x9c, 0xbe, 0x83, 0xc9, 0x2c, 0xd4, 0x22, 0x61, ++ 0x97, 0x8d, 0x12, 0xd9, 0x81, 0xae, 0x5e, 0xa6, 0xc0, 0xf7, 0x8c, 0xb1, ++ 0xcc, 0xb5, 0x0e, 0xc5, 0x6e, 0x36, 0xb7, 0x13, 0xbd, 0xcc, 0xb7, 0x45, ++ 0x26, 0x3b, 0xb1, 0x4b, 0x42, 0x3b, 0x51, 0xc7, 0x83, 0x2e, 0xdf, 0x91, ++ 0x6e, 0x50, 0xee, 0x7d, 0x24, 0xd9, 0x88, 0x6e, 0xa4, 0x6e, 0x89, 0xec, ++ 0x3e, 0xd9, 0xd4, 0x35, 0x1b, 0xfb, 0x1d, 0x8a, 0x8e, 0xb6, 0xe1, 0x3a, ++ 0x26, 0x0d, 0xd0, 0x51, 0x7f, 0xfe, 0x9f, 0x44, 0x47, 0xbb, 0x87, 0xa4, ++ 0xa3, 0x80, 0x4a, 0x74, 0xe4, 0xb5, 0x0d, 0x4e, 0x47, 0x20, 0x37, 0xbf, ++ 0x51, 0x7d, 0x16, 0xf4, 0x2b, 0x80, 0xaf, 0x14, 0x81, 0xaf, 0x87, 0x84, ++ 0x7c, 0xe9, 0xbb, 0xd7, 0x46, 0xeb, 0x06, 0x3f, 0x12, 0xce, 0xb7, 0x56, ++ 0xf4, 0x57, 0x6b, 0x73, 0x84, 0xe5, 0x91, 0x24, 0x27, 0x3e, 0xe9, 0x97, ++ 0xdf, 0xd0, 0xcf, 0x76, 0xb0, 0x3f, 0x71, 0x9f, 0x92, 0x8a, 0xf6, 0x33, ++ 0xa4, 0xe9, 0x2d, 0x73, 0x54, 0x6e, 0xbf, 0xf7, 0xf4, 0x4a, 0xd0, 0x5f, ++ 0xec, 0x95, 0x36, 0xd2, 0x7b, 0x0f, 0x98, 0x7a, 0xb2, 0xd1, 0xce, 0x4f, ++ 0x19, 0xd1, 0xb8, 0x0f, 0xe9, 0x23, 0x65, 0x76, 0x49, 0x59, 0x0b, 0xd9, ++ 0x27, 0x19, 0x6e, 0x94, 0xfb, 0x28, 0x6b, 0x70, 0xfe, 0xf5, 0x4d, 0x13, ++ 0xfc, 0xdc, 0x0e, 0x80, 0x7e, 0x91, 0x8e, 0xa6, 0x59, 0x68, 0x3f, 0x51, ++ 0x7f, 0x5f, 0xa5, 0x9f, 0xdb, 0x01, 0x35, 0xc4, 0x1f, 0x0d, 0xeb, 0xed, ++ 0x2a, 0xea, 0xb3, 0x09, 0xdd, 0xd9, 0x2b, 0x91, 0x3e, 0x1a, 0x56, 0x80, ++ 0x7d, 0x84, 0xf2, 0xf7, 0x60, 0xe7, 0xd6, 0x85, 0x90, 0xaf, 0x9f, 0xe9, ++ 0xf0, 0xa1, 0x9d, 0x62, 0xb7, 0xcd, 0x28, 0xc1, 0x76, 0xac, 0xcd, 0xc8, ++ 0x67, 0x6b, 0xa5, 0x2e, 0xb2, 0x8b, 0x83, 0x93, 0x99, 0x0f, 0xe5, 0xf6, ++ 0xd9, 0x90, 0x29, 0x68, 0x1e, 0x85, 0x72, 0xb6, 0x77, 0xe7, 0xf7, 0x51, ++ 0x8f, 0x2f, 0x29, 0xf1, 0x05, 0x55, 0xe4, 0x37, 0x41, 0x97, 0x79, 0x8c, ++ 0xf4, 0x42, 0x87, 0x5b, 0x4b, 0x4d, 0x00, 0xbc, 0x1e, 0xf8, 0xab, 0x4c, ++ 0xfb, 0xa2, 0x8e, 0xd1, 0x90, 0x87, 0xf4, 0x79, 0xb1, 0x9e, 0x1d, 0xd3, ++ 0xb4, 0x54, 0x37, 0xe4, 0xe7, 0xae, 0xb7, 0x13, 0xde, 0x3b, 0x3a, 0x79, ++ 0xf9, 0x59, 0x27, 0x20, 0x08, 0xfa, 0x4f, 0x93, 0x79, 0x7f, 0x2c, 0xde, ++ 0xc6, 0xf5, 0xcc, 0xc5, 0xf2, 0xc0, 0x86, 0x78, 0x4f, 0x1e, 0xcb, 0xf4, ++ 0x9f, 0x2d, 0x98, 0x4f, 0xd3, 0xf3, 0xed, 0x9b, 0xc9, 0x8e, 0xd1, 0xf9, ++ 0xbd, 0x23, 0x9b, 0xc3, 0xe3, 0x2c, 0xf1, 0x67, 0xa3, 0xe5, 0xfb, 0x9d, ++ 0xd0, 0x15, 0x3d, 0x31, 0x40, 0x3f, 0xc9, 0xb2, 0x49, 0xdf, 0x14, 0x05, ++ 0xd1, 0xee, 0x8e, 0xc5, 0x31, 0x79, 0x5e, 0xc3, 0xe1, 0x1e, 0x36, 0x01, ++ 0x20, 0x69, 0x58, 0xfa, 0x3f, 0x1b, 0xaa, 0x33, 0x22, 0xf2, 0xa2, 0x7e, ++ 0x7f, 0xfb, 0xe0, 0xda, 0xe9, 0x58, 0x6e, 0x43, 0xab, 0x5a, 0x94, 0x23, ++ 0xd8, 0xa0, 0x77, 0xf5, 0xbc, 0x66, 0x07, 0x38, 0xd6, 0x38, 0x07, 0xca, ++ 0x15, 0xb0, 0x27, 0x6d, 0x07, 0x25, 0xd1, 0x7e, 0xec, 0xf4, 0x89, 0x79, ++ 0x30, 0x7f, 0x49, 0x1f, 0xdf, 0xbc, 0x41, 0x03, 0x7c, 0x3c, 0x64, 0x67, ++ 0x86, 0xf1, 0x22, 0xe1, 0x53, 0xa2, 0xfa, 0x37, 0x43, 0xff, 0x0e, 0x55, ++ 0xaf, 0x3f, 0xd2, 0x3f, 0x11, 0x2a, 0x3c, 0x5c, 0x26, 0xf2, 0xc1, 0x95, ++ 0xed, 0xda, 0x38, 0xe8, 0xcf, 0x6c, 0xec, 0x8f, 0x50, 0x2a, 0xda, 0x63, ++ 0x46, 0x1f, 0xef, 0xf8, 0xee, 0x97, 0x37, 0xac, 0x1f, 0x37, 0xa0, 0xff, ++ 0xc1, 0x1e, 0x88, 0xcb, 0x49, 0x1a, 0xb0, 0x03, 0xd6, 0xbc, 0x5d, 0xdb, ++ 0x3e, 0x0a, 0xc6, 0x8a, 0x75, 0x7d, 0x66, 0x41, 0xfd, 0xaa, 0xeb, 0xf3, ++ 0x06, 0x8f, 0x44, 0x76, 0x46, 0x34, 0xbf, 0x7a, 0x73, 0xb8, 0x7c, 0x00, ++ 0xbb, 0xd6, 0x9b, 0x13, 0x61, 0xef, 0xd6, 0xa2, 0xbd, 0x2b, 0x93, 0x9d, ++ 0x3b, 0x09, 0x59, 0xab, 0x61, 0x85, 0x9f, 0xa1, 0x7d, 0x09, 0x76, 0x43, ++ 0x46, 0x0e, 0xd9, 0x0d, 0x9f, 0x9c, 0x3a, 0x0c, 0xdf, 0x3b, 0xa6, 0x7f, ++ 0x44, 0x76, 0x7e, 0xc3, 0x05, 0x85, 0xec, 0x8f, 0x06, 0xb0, 0x3f, 0xd0, ++ 0x6e, 0xb7, 0x75, 0x73, 0x7b, 0x96, 0x1d, 0x34, 0x93, 0xde, 0xd5, 0xd7, ++ 0xfd, 0x4e, 0x21, 0x7f, 0x3a, 0xdc, 0xa0, 0xf7, 0x91, 0x4e, 0x5f, 0x90, ++ 0xc6, 0x20, 0x9d, 0x32, 0xd6, 0x38, 0xec, 0x26, 0x58, 0x83, 0x60, 0x8e, ++ 0x56, 0x80, 0x70, 0xe8, 0xfb, 0xb1, 0x68, 0x78, 0xc7, 0xe7, 0x70, 0xbb, ++ 0xbc, 0xa1, 0xa8, 0x6a, 0x6b, 0x01, 0xf6, 0xbf, 0x5b, 0x62, 0xa8, 0xf7, ++ 0xd7, 0x15, 0xbd, 0x97, 0x8c, 0xf6, 0x49, 0x43, 0xf7, 0xbb, 0xc9, 0x0b, ++ 0x22, 0xda, 0x2d, 0x39, 0xf8, 0x30, 0xe1, 0x61, 0xc9, 0x5e, 0xf3, 0xa0, ++ 0xf3, 0x1f, 0x9f, 0x23, 0x93, 0xbc, 0xaa, 0x7f, 0xee, 0x19, 0x0d, 0xf9, ++ 0xfd, 0xa3, 0x90, 0x44, 0xbc, 0xbc, 0x58, 0x09, 0xad, 0x45, 0xbb, 0x72, ++ 0xf1, 0x62, 0x13, 0x5a, 0x6a, 0xac, 0x3c, 0x34, 0xe7, 0x56, 0xe4, 0x7b, ++ 0x36, 0xcb, 0xc2, 0xf2, 0x61, 0x7e, 0xf9, 0xc2, 0xae, 0x69, 0xd8, 0x3b, ++ 0x23, 0x78, 0x35, 0xee, 0xdb, 0xe0, 0xaf, 0x04, 0x9f, 0xb6, 0xf9, 0x17, ++ 0x12, 0x7f, 0x6f, 0x9b, 0x65, 0x73, 0xb0, 0x6c, 0x84, 0x73, 0xee, 0xdd, ++ 0x84, 0x07, 0x57, 0x8c, 0x86, 0x78, 0x58, 0x57, 0x54, 0x95, 0x8a, 0xe3, ++ 0xd4, 0x4f, 0x9b, 0xe4, 0x42, 0xff, 0x49, 0x03, 0xd8, 0x59, 0x58, 0x5e, ++ 0x7f, 0xdf, 0xb7, 0xc9, 0x9f, 0xa2, 0xc3, 0xb5, 0xee, 0xa0, 0xb9, 0x06, ++ 0xed, 0xaf, 0x0a, 0xb0, 0xb7, 0x7e, 0x09, 0x70, 0x67, 0x26, 0x4c, 0xa9, ++ 0xf1, 0x01, 0x3f, 0xa6, 0xcb, 0xfb, 0x46, 0x2f, 0x87, 0xfc, 0xa6, 0x21, ++ 0xe4, 0xef, 0xef, 0x73, 0xf9, 0x7a, 0xb6, 0x4a, 0xfe, 0xe0, 0x8d, 0xc8, ++ 0xf7, 0xcf, 0x49, 0x6c, 0x8f, 0x1a, 0x61, 0xff, 0x1d, 0xe4, 0x76, 0xdd, ++ 0x2d, 0x39, 0xdc, 0x0e, 0xd4, 0xbf, 0xdf, 0x92, 0xc3, 0xed, 0xcd, 0x71, ++ 0xc1, 0x9e, 0x09, 0x48, 0x7b, 0x87, 0x94, 0xde, 0x58, 0xb4, 0x7f, 0x1b, ++ 0x98, 0xf6, 0x29, 0xee, 0x3b, 0x99, 0xdf, 0xa1, 0xee, 0xa1, 0x75, 0xe2, ++ 0x72, 0xc7, 0xd3, 0xac, 0x92, 0x5f, 0xc9, 0xe6, 0xe9, 0x7d, 0x60, 0x14, ++ 0x96, 0x8f, 0x53, 0x68, 0x3f, 0xc1, 0x94, 0xde, 0x8d, 0x38, 0xee, 0x99, ++ 0xb5, 0x1e, 0xdf, 0x3a, 0x26, 0xe8, 0x17, 0xf3, 0xf7, 0x95, 0x84, 0x50, ++ 0x8e, 0xbe, 0x94, 0x13, 0x98, 0x8f, 0xeb, 0x5b, 0x21, 0xec, 0xc8, 0x33, ++ 0xcf, 0x5d, 0x37, 0x7a, 0x6e, 0xc9, 0x80, 0x9d, 0xb4, 0xb6, 0xd3, 0x1e, ++ 0x5a, 0x05, 0x78, 0x58, 0xeb, 0x54, 0x7f, 0x5c, 0x83, 0xf2, 0xed, 0xbf, ++ 0x15, 0x92, 0x6f, 0xcc, 0xd6, 0xd7, 0x33, 0x01, 0xd7, 0xe3, 0x2f, 0x09, ++ 0xd4, 0xef, 0x5a, 0x7b, 0x68, 0x2d, 0xae, 0x7f, 0x70, 0x83, 0x99, 0xca, ++ 0xf7, 0xa5, 0x05, 0x1a, 0xb0, 0xdf, 0x0f, 0xa6, 0xd5, 0x14, 0xe0, 0x3e, ++ 0x98, 0x39, 0x82, 0x05, 0xd3, 0x80, 0x9e, 0xcc, 0x9e, 0x76, 0x86, 0xf6, ++ 0x02, 0x6c, 0x1f, 0xc8, 0xcf, 0x60, 0xf3, 0xf8, 0x99, 0x0a, 0xf9, 0x09, ++ 0xc1, 0x39, 0x8a, 0x84, 0x72, 0x3e, 0xca, 0xfe, 0x98, 0x80, 0x7e, 0x1e, ++ 0xda, 0x37, 0xc0, 0xe0, 0xf0, 0xbd, 0x4a, 0x88, 0xad, 0x7c, 0xa0, 0x82, ++ 0x53, 0x36, 0x62, 0x81, 0xd6, 0xaf, 0x12, 0x07, 0xec, 0x91, 0xe3, 0x5f, ++ 0xcc, 0x54, 0xf0, 0xa3, 0x6e, 0xa7, 0x98, 0x6c, 0x81, 0x25, 0xd8, 0xb4, ++ 0x7a, 0x56, 0x0c, 0x93, 0x91, 0xee, 0x57, 0xf7, 0x1d, 0x33, 0xc1, 0x7c, ++ 0x62, 0x3d, 0x3d, 0x64, 0xc7, 0xd6, 0x75, 0x49, 0x34, 0x4e, 0x5d, 0xd1, ++ 0xd3, 0x16, 0xf4, 0x9b, 0xdc, 0xd5, 0xc5, 0xf9, 0xb2, 0x41, 0xec, 0x03, ++ 0x00, 0x7f, 0xc3, 0xd0, 0x1e, 0x68, 0xcb, 0x89, 0x15, 0x7a, 0xbc, 0x95, ++ 0xd3, 0x19, 0xeb, 0xa1, 0x7d, 0x34, 0x7b, 0x92, 0xaf, 0x27, 0x63, 0x50, ++ 0xcf, 0x19, 0xb9, 0x9f, 0x58, 0x49, 0xf5, 0xf4, 0xfe, 0x2c, 0xab, 0xb8, ++ 0xdf, 0xab, 0x4e, 0xf8, 0x63, 0x40, 0x83, 0x51, 0xf9, 0xc6, 0x1c, 0xdd, ++ 0x3e, 0x58, 0x25, 0xec, 0xcd, 0x76, 0x61, 0x67, 0xf2, 0x71, 0x37, 0x49, ++ 0x3d, 0x9a, 0x8c, 0x78, 0x1d, 0x2d, 0xf9, 0x22, 0xe9, 0x46, 0x4f, 0x7f, ++ 0x2a, 0xda, 0xc7, 0x1f, 0xe9, 0x9b, 0x84, 0xfc, 0xdb, 0x07, 0xf4, 0x85, ++ 0x7e, 0x99, 0xad, 0xd2, 0xb4, 0xbb, 0x5f, 0x82, 0xf9, 0x6d, 0x1d, 0x33, ++ 0xc2, 0x87, 0x26, 0x94, 0x17, 0xc8, 0x49, 0x2e, 0xc3, 0xef, 0x40, 0x8a, ++ 0x80, 0xf7, 0xf2, 0x83, 0x9f, 0x4e, 0x42, 0xba, 0x01, 0x83, 0x9b, 0xf8, ++ 0xb5, 0xfe, 0x60, 0xa5, 0x5c, 0xe7, 0x20, 0xbd, 0x4d, 0xfb, 0xc7, 0x94, ++ 0xd8, 0xc6, 0x4e, 0x2c, 0x4f, 0xb9, 0xa3, 0x88, 0xf4, 0x6a, 0xcc, 0x15, ++ 0xec, 0x8e, 0xe9, 0xf0, 0xfd, 0x17, 0x02, 0xaf, 0xa9, 0x0e, 0xee, 0xe7, ++ 0xf2, 0xae, 0x0a, 0x66, 0x2f, 0x2b, 0xc1, 0xf1, 0xfd, 0x77, 0xbf, 0x84, ++ 0xe3, 0x97, 0xc6, 0x90, 0x9f, 0x32, 0x05, 0xd6, 0xc6, 0x99, 0x40, 0x69, ++ 0x1b, 0xfa, 0x85, 0xbc, 0x6c, 0xa5, 0x84, 0xf5, 0x1e, 0x8e, 0xe3, 0xfd, ++ 0x27, 0x99, 0xe4, 0x3b, 0xa6, 0x95, 0x90, 0xdc, 0xa5, 0x7c, 0x82, 0x4f, ++ 0xd2, 0x76, 0x41, 0xfa, 0x5c, 0x8e, 0x9b, 0xfa, 0x87, 0x7d, 0x57, 0x0d, ++ 0xc2, 0x89, 0xdf, 0x69, 0x3f, 0x06, 0x94, 0x81, 0xfb, 0x59, 0xf4, 0x73, ++ 0x61, 0x3f, 0x29, 0xb9, 0x3c, 0x3d, 0x93, 0x1a, 0x56, 0x50, 0x40, 0x6c, ++ 0x63, 0xbd, 0x3b, 0xf7, 0x20, 0x7d, 0x1e, 0xb4, 0xba, 0x10, 0x4f, 0xb5, ++ 0x07, 0x7f, 0x7d, 0x02, 0xf5, 0x65, 0xad, 0x8d, 0x75, 0xc9, 0x68, 0xaf, ++ 0x44, 0xd9, 0x19, 0xf7, 0x65, 0xce, 0x38, 0x82, 0x72, 0xf3, 0xec, 0xe9, ++ 0x53, 0x3b, 0x7f, 0x08, 0xdf, 0x1e, 0xbe, 0xe9, 0x80, 0x2f, 0x40, 0xeb, ++ 0x62, 0xb4, 0x1f, 0xa2, 0xf7, 0x0b, 0xbb, 0xb0, 0x4a, 0xea, 0xd0, 0xf6, ++ 0xde, 0x89, 0xfe, 0xf5, 0xe4, 0xf6, 0x5e, 0x7f, 0xfe, 0x1f, 0x6e, 0xef, ++ 0x71, 0xbb, 0x3e, 0xb8, 0x27, 0x56, 0xdd, 0x13, 0x21, 0xcf, 0x1b, 0xc4, ++ 0x3e, 0xed, 0xec, 0xe2, 0x73, 0x71, 0xa8, 0x67, 0x4e, 0xf6, 0xc3, 0x03, ++ 0x7a, 0xba, 0x62, 0xc0, 0x5e, 0x99, 0xbb, 0x3b, 0xf6, 0x5d, 0xe4, 0xab, ++ 0x7e, 0xbb, 0x3f, 0xca, 0x6e, 0x38, 0xfe, 0x78, 0x6c, 0x10, 0xd7, 0xff, ++ 0x5c, 0x97, 0x9d, 0xfc, 0x74, 0x0a, 0xda, 0x3d, 0x00, 0xcf, 0x69, 0x67, ++ 0xdf, 0x77, 0x11, 0x39, 0x1e, 0x8b, 0x5f, 0x93, 0x70, 0xff, 0xb0, 0xcf, ++ 0xec, 0x5b, 0x05, 0xfd, 0x35, 0xdc, 0xf9, 0xd1, 0xcf, 0x4d, 0xc0, 0x77, ++ 0x4a, 0x27, 0xd8, 0x3d, 0xf1, 0x68, 0xef, 0xab, 0xf1, 0x24, 0x67, 0x5f, ++ 0x96, 0xd9, 0x1e, 0xb4, 0xcb, 0x14, 0xcd, 0x85, 0x7e, 0x0f, 0x1d, 0x7e, ++ 0xc5, 0x3d, 0xc9, 0xab, 0x95, 0xa0, 0x5c, 0xe4, 0xf3, 0x5f, 0x6a, 0x09, ++ 0x17, 0x90, 0x1d, 0x64, 0x61, 0x8b, 0x29, 0x1f, 0x17, 0x2e, 0x40, 0xbb, ++ 0xe7, 0x79, 0xa1, 0x77, 0x96, 0xc6, 0x40, 0x1e, 0xbe, 0x37, 0x79, 0x03, ++ 0x7f, 0xc1, 0x75, 0x4b, 0xb3, 0x72, 0x79, 0x85, 0xed, 0xf0, 0x7b, 0xa7, ++ 0xb0, 0xb7, 0x3a, 0x01, 0x25, 0x2e, 0xc4, 0xcb, 0x09, 0xd8, 0x77, 0x67, ++ 0x0b, 0xfd, 0x8d, 0xfb, 0x9f, 0x07, 0x33, 0x43, 0xeb, 0xc8, 0x8f, 0x63, ++ 0xa3, 0xf5, 0x7c, 0xff, 0x90, 0x75, 0x17, 0xfa, 0x79, 0xde, 0x2f, 0x32, ++ 0x85, 0x2d, 0xdc, 0x2f, 0x41, 0x7e, 0x2c, 0xb5, 0x4d, 0x61, 0xa9, 0x50, ++ 0x5f, 0x3d, 0x61, 0x0f, 0xa9, 0xdc, 0xdf, 0x65, 0x33, 0x81, 0xfe, 0x9f, ++ 0xf7, 0xd0, 0x5d, 0xaf, 0xe0, 0xbe, 0x62, 0xde, 0x21, 0xee, 0xc7, 0x9a, ++ 0x77, 0xe7, 0x8a, 0xa9, 0xb8, 0xff, 0x78, 0x7f, 0xfa, 0x24, 0x0b, 0xca, ++ 0x9b, 0x05, 0x2c, 0x40, 0x7e, 0xe7, 0x45, 0x8c, 0xfb, 0xa1, 0x97, 0xb0, ++ 0x10, 0xf7, 0x57, 0x33, 0x97, 0x09, 0xc7, 0xbb, 0x0b, 0xc4, 0xc6, 0x36, ++ 0x14, 0x35, 0x41, 0xc0, 0xfe, 0x95, 0xf0, 0x59, 0x32, 0x49, 0x68, 0x57, ++ 0xa8, 0xad, 0x90, 0x27, 0xa3, 0x59, 0x6b, 0xaf, 0x81, 0x71, 0xe7, 0xb6, ++ 0x9a, 0x68, 0x5f, 0x32, 0xaf, 0xcd, 0xe8, 0x4f, 0x3f, 0xbf, 0xee, 0xee, ++ 0x1a, 0xd4, 0xe3, 0x6b, 0x5a, 0x4d, 0xdc, 0x7e, 0x6c, 0x93, 0x48, 0x8f, ++ 0xcf, 0x63, 0x9a, 0x17, 0xed, 0x0e, 0x1d, 0xaf, 0x45, 0xb9, 0x89, 0x24, ++ 0x3f, 0x82, 0xad, 0x26, 0x0d, 0xc7, 0xd1, 0x72, 0x2d, 0x94, 0x87, 0x25, ++ 0x0a, 0xd1, 0xfc, 0x44, 0xda, 0x6a, 0x16, 0x7e, 0x78, 0x01, 0xc7, 0x4a, ++ 0x66, 0x0a, 0x63, 0x6a, 0x92, 0x78, 0xba, 0xc6, 0xa5, 0xd4, 0x0c, 0xa6, ++ 0x9f, 0xf5, 0xfe, 0x5a, 0xcd, 0x8d, 0x36, 0xf4, 0x87, 0xf5, 0x65, 0x9a, ++ 0xc8, 0x0f, 0x7c, 0xde, 0xa2, 0xcd, 0x22, 0x3f, 0x6a, 0x42, 0x01, 0x43, ++ 0x3f, 0x62, 0xab, 0xb3, 0xb1, 0xad, 0x86, 0x97, 0x13, 0xcf, 0x9c, 0xb7, ++ 0xf7, 0xf9, 0xa9, 0xfc, 0x1a, 0x85, 0x1b, 0x7c, 0x4c, 0x4d, 0x40, 0x79, ++ 0x39, 0x2c, 0xd7, 0x44, 0xfd, 0x45, 0xcf, 0x77, 0x41, 0xbb, 0x31, 0x1f, ++ 0x7d, 0x3e, 0xb1, 0x24, 0x64, 0xcc, 0xcf, 0x63, 0x81, 0xc2, 0xd4, 0x5c, ++ 0xf4, 0x1b, 0x19, 0xbf, 0x0f, 0xcb, 0x55, 0xa9, 0xff, 0xf3, 0xeb, 0xb2, ++ 0xc5, 0x39, 0x80, 0x8f, 0xce, 0x01, 0x5a, 0xcd, 0xea, 0xeb, 0xd9, 0x28, ++ 0xaf, 0xd6, 0x2a, 0x24, 0x2f, 0x57, 0x66, 0x70, 0x7c, 0x99, 0x32, 0x79, ++ 0x9a, 0xe3, 0xae, 0x9e, 0x45, 0xf4, 0xeb, 0x06, 0xfb, 0x82, 0xe0, 0xe5, ++ 0xf0, 0xe7, 0x5c, 0xe3, 0x91, 0x50, 0x6f, 0xb6, 0xba, 0x39, 0x5d, 0xfe, ++ 0xbd, 0x70, 0x47, 0xc3, 0x5b, 0x93, 0x5b, 0xc0, 0xf1, 0x8b, 0x46, 0x1e, ++ 0x8c, 0xd7, 0xba, 0x56, 0x0a, 0x71, 0x7c, 0x71, 0xb8, 0x2f, 0xd7, 0x7f, ++ 0xb1, 0x24, 0xd7, 0xe8, 0xbf, 0xe8, 0xcf, 0xff, 0xe3, 0xf7, 0x9d, 0x9c, ++ 0x1e, 0xd7, 0xca, 0x82, 0xdf, 0x5c, 0x24, 0x87, 0xe6, 0xba, 0xf8, 0x9c, ++ 0xde, 0x97, 0x7c, 0x8f, 0x87, 0xf1, 0xbb, 0x03, 0xec, 0x03, 0x80, 0x7b, ++ 0xde, 0x5a, 0xb9, 0x0c, 0xed, 0x94, 0x09, 0x33, 0x1c, 0x34, 0x8f, 0xfa, ++ 0x43, 0x76, 0xf2, 0xb7, 0xd6, 0xad, 0xe8, 0x1d, 0x86, 0x7c, 0x54, 0x5f, ++ 0xd5, 0x5b, 0xd0, 0x38, 0x08, 0x5e, 0x11, 0x5a, 0x45, 0x97, 0x5f, 0x50, ++ 0x6f, 0xae, 0x07, 0xf6, 0x09, 0xc8, 0xb7, 0x6d, 0xc6, 0x73, 0x2a, 0xd0, ++ 0xb4, 0x2c, 0xf2, 0xdc, 0x69, 0x46, 0x86, 0xf6, 0x83, 0xdc, 0x24, 0xdc, ++ 0x8f, 0xbc, 0xbf, 0xef, 0xd7, 0xb8, 0xde, 0xfb, 0xec, 0xa4, 0x9f, 0xe0, ++ 0x7f, 0x87, 0xad, 0x28, 0xbf, 0x9e, 0xcb, 0x26, 0xbb, 0xa9, 0x20, 0x23, ++ 0xb0, 0x3a, 0x17, 0xf5, 0x7a, 0x4c, 0x78, 0xe7, 0x13, 0xd9, 0x68, 0xa7, ++ 0x70, 0x3b, 0xa9, 0xae, 0xdb, 0xda, 0x89, 0x76, 0xe0, 0xdc, 0xd6, 0x88, ++ 0x73, 0x2f, 0xfc, 0x67, 0xbd, 0xf1, 0x1c, 0x8c, 0xb5, 0x25, 0x90, 0x7f, ++ 0x83, 0x75, 0x18, 0xbf, 0x2f, 0xde, 0x1e, 0xd5, 0xee, 0xa2, 0x73, 0x31, ++ 0xae, 0xef, 0x37, 0x59, 0x02, 0xc3, 0xd1, 0xbe, 0x1b, 0x7f, 0xad, 0x96, ++ 0x8a, 0x72, 0xf5, 0xf4, 0x12, 0x13, 0xc3, 0xf5, 0x9d, 0x27, 0xfb, 0x16, ++ 0xa2, 0x1c, 0x39, 0x6d, 0x37, 0xda, 0xdf, 0xa7, 0x9d, 0x7c, 0xbd, 0xf6, ++ 0xf4, 0xaf, 0xb3, 0xaf, 0x00, 0xd7, 0x79, 0xcf, 0x90, 0xeb, 0xec, 0x2b, ++ 0xc0, 0x75, 0x9e, 0x67, 0x62, 0x81, 0xc8, 0x7e, 0xea, 0x70, 0x9d, 0x61, ++ 0x7d, 0x97, 0x8a, 0x75, 0x3e, 0xfd, 0xcc, 0x95, 0x05, 0xb8, 0xce, 0x9f, ++ 0xec, 0xbb, 0xb2, 0x00, 0xd7, 0x79, 0x93, 0xb9, 0x5d, 0x43, 0xbe, 0xd9, ++ 0x9d, 0x15, 0xf8, 0x09, 0xe2, 0xf1, 0xe4, 0x44, 0x3f, 0xd9, 0x4f, 0x20, ++ 0x09, 0x0a, 0xbe, 0x09, 0x3d, 0x3e, 0x1f, 0x45, 0x8f, 0xcf, 0xff, 0xef, ++ 0xd1, 0x23, 0xb5, 0x1b, 0x4a, 0x1f, 0xfe, 0x3a, 0x77, 0x70, 0x7d, 0xe8, ++ 0xb1, 0xa8, 0x19, 0x28, 0x0f, 0xe7, 0xda, 0xac, 0x5f, 0xab, 0x17, 0xf1, ++ 0x67, 0x50, 0xff, 0x9a, 0xcd, 0x4a, 0x7e, 0x89, 0x43, 0x5f, 0x7c, 0xf6, ++ 0xa3, 0xc7, 0xd1, 0x0e, 0xe9, 0x96, 0xc9, 0x0e, 0xd1, 0xfb, 0x3b, 0xa4, ++ 0x04, 0x72, 0xd1, 0xaf, 0x70, 0xe8, 0x84, 0xd7, 0x17, 0x94, 0x86, 0xee, ++ 0x7f, 0x99, 0xb0, 0xaf, 0xbc, 0x36, 0x16, 0x44, 0xff, 0x87, 0x6e, 0xf7, ++ 0xeb, 0xf6, 0x63, 0xb4, 0x3c, 0xfe, 0x83, 0xc0, 0xe3, 0xc7, 0xb9, 0xda, ++ 0x54, 0xd4, 0x8b, 0xba, 0xbf, 0x76, 0xb1, 0xe8, 0xd3, 0x16, 0xfa, 0x8c, ++ 0xdb, 0xa9, 0xbb, 0x25, 0xf2, 0xc7, 0xda, 0xd4, 0x2e, 0x0d, 0xed, 0xde, ++ 0xfa, 0x17, 0xe6, 0xb8, 0xd0, 0x5f, 0xfb, 0x41, 0x88, 0xfb, 0x67, 0xeb, ++ 0x9f, 0x19, 0x4d, 0xfe, 0xdb, 0x25, 0xa1, 0x17, 0xc3, 0xe9, 0x68, 0x17, ++ 0x76, 0x4b, 0x2e, 0xdc, 0x3f, 0x2c, 0xd9, 0xfd, 0x6e, 0x1c, 0x9e, 0x77, ++ 0xc3, 0x7e, 0xf4, 0xa3, 0xdc, 0x88, 0xfd, 0xe8, 0x44, 0xb1, 0x1f, 0xfd, ++ 0x20, 0xf4, 0x7e, 0x1c, 0x9e, 0x8b, 0xc3, 0xf8, 0x53, 0xd0, 0xde, 0x8f, ++ 0xf5, 0xf4, 0x59, 0x90, 0x7e, 0xeb, 0x61, 0x9f, 0x06, 0x55, 0x58, 0xbd, ++ 0xd2, 0x77, 0x0c, 0xfb, 0xab, 0xf7, 0x30, 0x5f, 0x10, 0x45, 0xc5, 0x41, ++ 0xe3, 0xbe, 0x4d, 0x3f, 0xbf, 0xdc, 0xe6, 0xb7, 0x90, 0xbc, 0xdb, 0xd6, ++ 0x2d, 0x85, 0x70, 0x9f, 0x96, 0x6c, 0x09, 0x64, 0x67, 0xa0, 0x7e, 0x62, ++ 0x19, 0x2e, 0x3a, 0xe7, 0x12, 0xfc, 0x72, 0x21, 0x57, 0x4b, 0xc1, 0x73, ++ 0xcd, 0x81, 0x73, 0x63, 0xed, 0x2f, 0xc8, 0xb7, 0x1e, 0x3c, 0x6f, 0x82, ++ 0xf6, 0xbd, 0x5b, 0xe3, 0x89, 0x0e, 0x7b, 0xcd, 0x4c, 0x23, 0x3b, 0x60, ++ 0xab, 0x53, 0xc8, 0x25, 0x85, 0xe4, 0xd4, 0x9f, 0xb7, 0xbb, 0x69, 0xdf, ++ 0x43, 0x3f, 0x50, 0xff, 0xcf, 0xa1, 0x6c, 0xca, 0xeb, 0xfa, 0x7a, 0xa1, ++ 0xc2, 0xc2, 0x0a, 0xe0, 0x7d, 0xe1, 0x4c, 0xed, 0x2d, 0x5c, 0x37, 0x94, ++ 0xdf, 0xe1, 0x28, 0xf9, 0x1d, 0x99, 0xef, 0x3f, 0x8f, 0x66, 0x3d, 0x5c, ++ 0xbf, 0x80, 0x3c, 0x0f, 0x0f, 0x76, 0x3e, 0x2e, 0xce, 0xa9, 0xf1, 0x7c, ++ 0x37, 0xb2, 0x7d, 0x3d, 0xeb, 0xa3, 0x76, 0x78, 0xce, 0x6b, 0xe8, 0x57, ++ 0xdf, 0x07, 0xb0, 0xc6, 0xd1, 0x2a, 0xc0, 0x7d, 0xd7, 0xed, 0x0e, 0x1f, ++ 0xda, 0x2f, 0x0d, 0x40, 0xd7, 0x4d, 0x65, 0x03, 0x74, 0xb8, 0x54, 0x4c, ++ 0x45, 0xa7, 0xc3, 0x7a, 0xe1, 0xe7, 0x6d, 0x58, 0xfc, 0x1e, 0xed, 0x07, ++ 0x1a, 0x0e, 0x4a, 0x2e, 0xf4, 0xef, 0x2e, 0xf5, 0x71, 0x3a, 0x5c, 0x0a, ++ 0xfb, 0x24, 0xeb, 0xc8, 0x8b, 0xf9, 0x96, 0x75, 0x01, 0x1d, 0x46, 0xc0, ++ 0x3d, 0x14, 0x1f, 0x97, 0xe7, 0x19, 0xf9, 0xb8, 0x3f, 0xff, 0x4f, 0xf2, ++ 0x67, 0x8e, 0xcf, 0x33, 0xf2, 0xaf, 0x3e, 0x7f, 0xdd, 0x2f, 0xde, 0x3f, ++ 0xcf, 0x6e, 0x89, 0xf3, 0x57, 0xd4, 0xbc, 0xa2, 0xf7, 0x97, 0xd1, 0xfe, ++ 0x6c, 0x7d, 0x7f, 0x78, 0xb9, 0x72, 0xed, 0xe6, 0x7e, 0x78, 0x38, 0x3e, ++ 0xfa, 0xf3, 0xff, 0x64, 0xb9, 0x36, 0xb7, 0x7f, 0x5d, 0xa2, 0xe5, 0x9a, ++ 0xf1, 0xbc, 0xe0, 0x1b, 0xcb, 0xb5, 0xe8, 0x73, 0x83, 0x3c, 0xee, 0x07, ++ 0xc7, 0x73, 0x03, 0x3c, 0xd7, 0xfd, 0x7b, 0xcf, 0x0d, 0x3e, 0x54, 0xdb, ++ 0x93, 0x4d, 0xa4, 0x07, 0x35, 0xc3, 0x79, 0x2a, 0xda, 0xe9, 0x38, 0x4e, ++ 0xdb, 0x0e, 0x99, 0xec, 0x83, 0x49, 0x32, 0x3f, 0x87, 0xae, 0x73, 0x5a, ++ 0xc9, 0x4f, 0x1b, 0x7d, 0xde, 0xda, 0xa0, 0x4e, 0x12, 0xe7, 0x8b, 0x3d, ++ 0xbf, 0xbf, 0x0a, 0xf5, 0xe7, 0x7e, 0x33, 0x43, 0xbd, 0xbe, 0xd8, 0xb1, ++ 0x88, 0xce, 0x33, 0x1b, 0xe4, 0x27, 0x2d, 0x2e, 0x75, 0x90, 0x73, 0x46, ++ 0xe5, 0x30, 0xd9, 0xef, 0xdf, 0xf4, 0xfc, 0x7d, 0x5d, 0x5e, 0xff, 0xf9, ++ 0x7b, 0x36, 0x9e, 0xbf, 0x57, 0x54, 0x19, 0xe5, 0xf3, 0x8b, 0x8e, 0xcf, ++ 0x12, 0x03, 0x11, 0xeb, 0x5c, 0x55, 0x02, 0x86, 0xff, 0x20, 0xf4, 0x6c, ++ 0x53, 0x82, 0x2c, 0x21, 0xe2, 0xfb, 0x96, 0x3c, 0x6e, 0x0f, 0xbf, 0x28, ++ 0xe2, 0x64, 0xbc, 0x16, 0xd6, 0x86, 0xf1, 0x17, 0x0f, 0x39, 0x63, 0x35, ++ 0xdc, 0x77, 0x78, 0x4d, 0x3c, 0x8e, 0x27, 0x98, 0xe3, 0xdf, 0x86, 0x72, ++ 0xd0, 0xa6, 0x72, 0x3c, 0x3e, 0xfa, 0xdc, 0x2d, 0xcc, 0x04, 0xf3, 0x7b, ++ 0xd4, 0xdc, 0x45, 0xf2, 0x22, 0x58, 0xe7, 0xf0, 0xa1, 0xdc, 0xd3, 0xfd, ++ 0x2c, 0x7a, 0xff, 0x31, 0x62, 0x3f, 0x78, 0xb9, 0xf4, 0xfd, 0x74, 0x14, ++ 0x7d, 0x3f, 0xfd, 0xbf, 0x4c, 0xdf, 0xd1, 0xf8, 0xe9, 0xd6, 0xe9, 0xfa, ++ 0x9b, 0x9e, 0x83, 0x6d, 0x01, 0xdc, 0x18, 0xf8, 0x80, 0xd1, 0x79, 0xd7, ++ 0x2b, 0x78, 0x7e, 0x93, 0x7d, 0x31, 0xbd, 0x0e, 0xd5, 0xcf, 0x50, 0x74, ++ 0xfb, 0x6f, 0x79, 0xfe, 0xdf, 0xe4, 0x11, 0xbf, 0x69, 0x23, 0xe9, 0x5c, ++ 0xff, 0x32, 0xe5, 0x4a, 0x6c, 0x79, 0xdf, 0xfb, 0xe8, 0xcf, 0x61, 0xfb, ++ 0xad, 0x2a, 0xee, 0x2b, 0xd0, 0xaf, 0x41, 0xfa, 0x70, 0x7d, 0x2a, 0xd7, ++ 0x53, 0x8a, 0xaf, 0x02, 0xf1, 0x0c, 0xf6, 0x5c, 0x05, 0xc6, 0x41, 0xbd, ++ 0x83, 0xff, 0xbd, 0x6a, 0x68, 0xfb, 0xef, 0x8f, 0xfd, 0x7c, 0xcf, 0xed, ++ 0xbf, 0x3f, 0x0e, 0x29, 0x8f, 0xff, 0x36, 0xfb, 0x6f, 0x45, 0x96, 0xff, ++ 0x4f, 0x38, 0xcf, 0x93, 0x95, 0x5a, 0x01, 0xea, 0xc7, 0x35, 0x4e, 0x80, ++ 0x1f, 0xf7, 0x75, 0x3f, 0xe1, 0xf1, 0x33, 0xdb, 0xed, 0x9c, 0x3e, 0xb7, ++ 0x4b, 0x9c, 0x2e, 0x59, 0x53, 0xa2, 0xee, 0x1f, 0xa1, 0x79, 0x05, 0x9f, ++ 0xe2, 0xe7, 0xdf, 0xd1, 0x74, 0xf5, 0x65, 0x94, 0x1e, 0xf9, 0xf2, 0x7f, ++ 0x59, 0x8f, 0x0c, 0x25, 0x37, 0xed, 0xf9, 0xff, 0x24, 0xb9, 0xb9, 0xf8, ++ 0x2f, 0x71, 0xe8, 0xe7, 0x1c, 0xba, 0x9f, 0x20, 0xd1, 0x4b, 0x45, 0x55, ++ 0x0f, 0xe1, 0xad, 0xef, 0x05, 0x89, 0xed, 0x8a, 0xf0, 0x3f, 0x37, 0xf4, ++ 0xf0, 0x38, 0xb4, 0xb4, 0x7c, 0xc9, 0xe0, 0x27, 0xfe, 0x2f, 0x61, 0xcf, ++ 0xce, 0xcb, 0xd7, 0xd2, 0x31, 0x9e, 0xeb, 0x93, 0xb7, 0x6c, 0x36, 0x16, ++ 0x0f, 0x7a, 0x19, 0x69, 0x0c, 0xed, 0x2e, 0xbf, 0x83, 0xfc, 0xff, 0xf5, ++ 0x5d, 0x3c, 0x4e, 0xa4, 0x7e, 0x05, 0xa3, 0xf3, 0xde, 0x7a, 0xf4, 0x6f, ++ 0x96, 0xa0, 0xdf, 0x6f, 0x1a, 0x43, 0xfb, 0xee, 0x97, 0x6a, 0x20, 0x3f, ++ 0x7f, 0x0c, 0x9e, 0x57, 0x38, 0x82, 0x72, 0x3c, 0xfa, 0xc5, 0xa7, 0x33, ++ 0xb4, 0xeb, 0xce, 0xbc, 0xc5, 0xf3, 0x0d, 0x6a, 0x60, 0x38, 0xc5, 0x8b, ++ 0xad, 0xe8, 0x35, 0x9c, 0x33, 0x54, 0x7c, 0xf5, 0xd9, 0x6a, 0xf4, 0x5b, ++ 0x00, 0xbc, 0xe4, 0x07, 0xf0, 0xa0, 0x5f, 0x26, 0x62, 0x9d, 0x6e, 0xca, ++ 0xe7, 0xf2, 0x4c, 0x4f, 0xa7, 0x47, 0xc1, 0x8f, 0x7e, 0x7a, 0xa2, 0xff, ++ 0x2e, 0x39, 0x84, 0xf6, 0x60, 0xac, 0xda, 0x43, 0x7e, 0xff, 0xfa, 0xfd, ++ 0xdc, 0x48, 0xab, 0x90, 0x35, 0xf2, 0xcf, 0xb3, 0xbb, 0x12, 0x18, 0xd2, ++ 0x51, 0xfd, 0xfe, 0xca, 0xd1, 0x2f, 0x51, 0x7d, 0xfb, 0x68, 0xb4, 0x67, ++ 0x2b, 0xfe, 0x50, 0xeb, 0x42, 0x3f, 0xc4, 0x27, 0xd7, 0x78, 0x28, 0xbe, ++ 0x60, 0x98, 0xdc, 0xbb, 0x04, 0xed, 0xa9, 0x97, 0x72, 0x02, 0x1a, 0xce, ++ 0xc7, 0x59, 0x1e, 0x9a, 0x8c, 0xf6, 0x68, 0x16, 0xd8, 0xa3, 0x68, 0xdf, ++ 0x7e, 0xb2, 0x6f, 0xf2, 0x68, 0x84, 0x5b, 0x97, 0x7f, 0x9b, 0xd0, 0xbf, ++ 0x0d, 0xfd, 0x6e, 0x72, 0x1a, 0xfd, 0xd7, 0xcc, 0xa6, 0x65, 0xff, 0x10, ++ 0xfd, 0xdb, 0xbb, 0x52, 0x68, 0x7f, 0xb8, 0x2f, 0x2d, 0x30, 0x05, 0xe7, ++ 0xbf, 0xc9, 0xce, 0xe1, 0x0d, 0x6e, 0xb0, 0x73, 0x7e, 0x15, 0x7e, 0xed, ++ 0x68, 0xfe, 0xd7, 0xf9, 0x3e, 0x45, 0x36, 0xd1, 0x38, 0x29, 0xb7, 0xd9, ++ 0xe8, 0x1c, 0x5a, 0x97, 0x0b, 0x9b, 0xcc, 0x2c, 0x60, 0xcb, 0x1d, 0x90, ++ 0x27, 0x3e, 0x11, 0x2f, 0x07, 0xf8, 0xe0, 0xf1, 0x7a, 0xdd, 0xd3, 0x78, ++ 0x9c, 0x87, 0xc8, 0x3b, 0x3c, 0xc6, 0xb8, 0xc5, 0x8f, 0x73, 0x27, 0xfa, ++ 0x10, 0x1e, 0x5f, 0x3e, 0x3f, 0x27, 0x58, 0x60, 0xeb, 0x93, 0xd0, 0xcf, ++ 0xbe, 0x40, 0x9c, 0xbf, 0x5f, 0x27, 0xe2, 0x28, 0xf4, 0x38, 0xaa, 0xd3, ++ 0x2e, 0xff, 0x1c, 0xac, 0xcf, 0x56, 0xd4, 0x0c, 0x9c, 0xbb, 0xe7, 0x60, ++ 0x7b, 0x17, 0xa7, 0x7f, 0x11, 0x1f, 0x13, 0x7b, 0x81, 0xdb, 0xc9, 0x39, ++ 0x2e, 0x0b, 0xd1, 0x8d, 0xb3, 0x8d, 0xf1, 0x73, 0x23, 0xa0, 0x1b, 0x5c, ++ 0x9f, 0x71, 0x7d, 0x3d, 0x13, 0xe2, 0x61, 0x3e, 0x79, 0x1d, 0xe1, 0x71, ++ 0x88, 0xcf, 0x43, 0x17, 0x4c, 0x84, 0x0f, 0x65, 0xda, 0x2b, 0x74, 0x5e, ++ 0x12, 0x8f, 0xcb, 0x06, 0xfd, 0xe4, 0xae, 0xef, 0x5d, 0x5b, 0x88, 0xfe, ++ 0x12, 0xd7, 0x9b, 0xd7, 0xe0, 0xba, 0xa8, 0xed, 0xae, 0x2a, 0x44, 0xdd, ++ 0x2f, 0x55, 0xff, 0xdd, 0x04, 0x87, 0xd2, 0x58, 0x84, 0xfb, 0xc7, 0xaa, ++ 0xdf, 0x99, 0x79, 0x3c, 0xe0, 0x0b, 0xb1, 0xa4, 0xe7, 0x3b, 0x86, 0x2d, ++ 0xa5, 0x78, 0xc0, 0x33, 0x6f, 0x03, 0xbd, 0x66, 0x5f, 0xac, 0x0f, 0xf4, ++ 0x34, 0xc8, 0x56, 0x51, 0xfc, 0x5f, 0xce, 0xc1, 0x37, 0xc8, 0x6f, 0xef, ++ 0xdc, 0x2f, 0x0d, 0x1a, 0xd7, 0xb9, 0x3e, 0xdf, 0xc1, 0xcf, 0x93, 0x82, ++ 0x3d, 0x14, 0x67, 0xc6, 0xc6, 0x79, 0x08, 0x1f, 0xca, 0x0b, 0x7f, 0x08, ++ 0xa2, 0x7d, 0xa1, 0xac, 0x55, 0xc8, 0x53, 0xd1, 0x6a, 0xd6, 0x4c, 0x76, ++ 0x5c, 0xd7, 0x95, 0x8c, 0xfc, 0xec, 0xf9, 0x1d, 0x2e, 0x13, 0xae, 0x4b, ++ 0x96, 0x88, 0x2b, 0x39, 0x7b, 0xe8, 0x7f, 0x46, 0x06, 0x68, 0x3f, 0xa2, ++ 0xfb, 0xe9, 0x43, 0x94, 0x2a, 0xe6, 0xde, 0xd5, 0xb8, 0xbf, 0x52, 0x56, ++ 0xf6, 0x5e, 0x0b, 0x1c, 0xcc, 0xea, 0xf6, 0xbb, 0x4d, 0xf5, 0xe8, 0xd7, ++ 0x34, 0xf7, 0xd5, 0x93, 0x5f, 0xe4, 0x85, 0x58, 0xf2, 0x7f, 0x66, 0x1d, ++ 0xcc, 0x5d, 0xf5, 0x2d, 0xc8, 0x67, 0xb5, 0xb9, 0x98, 0x84, 0xf2, 0xe7, ++ 0x57, 0x77, 0x65, 0x21, 0x5d, 0x07, 0x61, 0x9e, 0xf9, 0x83, 0xcc, 0xf3, ++ 0xde, 0x7c, 0x1e, 0xb7, 0xa3, 0xbc, 0x10, 0x6b, 0x42, 0xbd, 0xa5, 0x6c, ++ 0x60, 0x14, 0x87, 0xa8, 0xb8, 0x93, 0xab, 0x08, 0xee, 0x87, 0x21, 0x0f, ++ 0xfd, 0x34, 0x08, 0xba, 0xd1, 0xcf, 0x1f, 0x01, 0x5c, 0x2f, 0xea, 0xa3, ++ 0x79, 0xf9, 0x81, 0x4e, 0xc4, 0x73, 0xac, 0x90, 0x03, 0xac, 0x29, 0x86, ++ 0xfc, 0x85, 0x4e, 0x85, 0xfb, 0x35, 0x9c, 0x4d, 0x6f, 0x3f, 0xb5, 0x12, ++ 0xf2, 0x3b, 0x85, 0xbf, 0xf5, 0xc8, 0xa1, 0xe2, 0xe9, 0xe4, 0x9f, 0x5b, ++ 0xab, 0x48, 0xb8, 0x0e, 0xe7, 0xdd, 0x73, 0xb2, 0x5c, 0xf0, 0xfd, 0x49, ++ 0xc1, 0xb7, 0x4e, 0xa5, 0x87, 0xb9, 0x1c, 0x91, 0xf8, 0x3f, 0x42, 0x71, ++ 0x97, 0x39, 0x2f, 0xf0, 0xb8, 0x34, 0xc5, 0xcc, 0xe9, 0x44, 0x59, 0xeb, ++ 0xe9, 0x44, 0xff, 0xdf, 0xa7, 0x19, 0x01, 0x8a, 0x2f, 0xbd, 0xa6, 0x35, ++ 0x2c, 0xd3, 0xf9, 0x95, 0xeb, 0xe4, 0xc6, 0x1a, 0x35, 0x62, 0xff, 0xb2, ++ 0x85, 0xeb, 0x91, 0xfa, 0xbd, 0x7c, 0xdf, 0x1c, 0xbd, 0x5f, 0xb9, 0x94, ++ 0xfe, 0x78, 0xa9, 0x5f, 0x6e, 0x73, 0xfd, 0xd1, 0x9f, 0xff, 0x27, 0xd9, ++ 0x25, 0x3d, 0xf9, 0x7f, 0xe7, 0x3e, 0x84, 0x19, 0xf7, 0x6f, 0xd1, 0xf6, ++ 0x49, 0xf4, 0x7e, 0xed, 0x22, 0xfb, 0x3a, 0xaa, 0xbf, 0xa1, 0xec, 0x14, ++ 0x3d, 0x8e, 0xa3, 0x6a, 0x60, 0x1c, 0xa2, 0x87, 0x17, 0x9d, 0xba, 0x1d, ++ 0x14, 0x34, 0xc4, 0xb9, 0x54, 0x39, 0xf8, 0xb8, 0xcc, 0x66, 0xec, 0xff, ++ 0xa7, 0x22, 0x3e, 0x47, 0x8f, 0x7b, 0x49, 0x6e, 0x51, 0x57, 0x62, 0x7c, ++ 0x79, 0xdf, 0xfd, 0x8c, 0xfc, 0x69, 0x7a, 0x5c, 0x8e, 0x1e, 0x87, 0x13, ++ 0xac, 0xe2, 0xfb, 0x84, 0xa0, 0x09, 0xe4, 0x5e, 0x36, 0x9e, 0xff, 0xb4, ++ 0x53, 0xfc, 0x4d, 0x3a, 0x0b, 0x4b, 0x12, 0xd9, 0xfb, 0xbd, 0x0c, 0xdb, ++ 0xa7, 0x60, 0x1c, 0x0e, 0xb4, 0xff, 0xcf, 0xfc, 0x1c, 0xea, 0x7f, 0x07, ++ 0xf3, 0xb5, 0xc9, 0x24, 0x17, 0x55, 0x09, 0xe1, 0xb7, 0x63, 0xfc, 0x46, ++ 0x22, 0xc2, 0x1d, 0xda, 0xba, 0x10, 0xc7, 0xbb, 0xc9, 0x41, 0xe3, 0xd9, ++ 0x31, 0x7e, 0x23, 0x91, 0xf6, 0x09, 0xc4, 0xc7, 0x69, 0x7e, 0x1e, 0xb7, ++ 0x39, 0x61, 0x31, 0x8f, 0xf7, 0x4c, 0x03, 0xfd, 0x8b, 0xf9, 0xb4, 0x3c, ++ 0x4e, 0x97, 0xf6, 0x59, 0x16, 0x8a, 0xe3, 0xd4, 0xe3, 0x32, 0xf4, 0xf8, ++ 0x0d, 0x1d, 0x2f, 0x55, 0x02, 0xdf, 0x69, 0x85, 0x0b, 0xb3, 0x71, 0x3f, ++ 0xa0, 0xc7, 0x79, 0x6c, 0x8a, 0x09, 0xfd, 0xc4, 0x2e, 0x63, 0x7c, 0x87, ++ 0x90, 0xfb, 0x4b, 0x4c, 0x24, 0xf7, 0xf5, 0xf8, 0xb9, 0x8e, 0x7c, 0x35, ++ 0x84, 0xf4, 0x7e, 0x16, 0xe3, 0x3c, 0x1d, 0x97, 0x1f, 0xcf, 0x11, 0x8d, ++ 0x5f, 0x3d, 0xae, 0x63, 0x5c, 0x66, 0x20, 0xb9, 0x60, 0x0c, 0xc5, 0x75, ++ 0x90, 0x1e, 0xd5, 0xe3, 0x31, 0x74, 0x7a, 0x89, 0x58, 0xc7, 0xa0, 0x1d, ++ 0xc6, 0xdf, 0xf6, 0x02, 0xb7, 0xdf, 0xab, 0x16, 0x5b, 0x08, 0xfe, 0xb3, ++ 0x4b, 0xa6, 0x90, 0xff, 0xf0, 0xec, 0x12, 0x13, 0x43, 0x3e, 0xaa, 0xea, ++ 0xb6, 0x72, 0xfa, 0x8b, 0x1a, 0x6f, 0xdb, 0x2c, 0x0b, 0x0b, 0x63, 0xbf, ++ 0x4a, 0xc8, 0x8e, 0xf2, 0x53, 0xa7, 0x83, 0x4b, 0xd9, 0xaf, 0xb0, 0xae, ++ 0x45, 0xe8, 0x9f, 0x3d, 0xd2, 0xbc, 0x37, 0xf7, 0x24, 0xf0, 0xfc, 0xd1, ++ 0xe6, 0x2e, 0x4a, 0xcf, 0xda, 0xa5, 0x2e, 0x79, 0x14, 0xa6, 0x7d, 0xb3, ++ 0x51, 0x52, 0x15, 0x17, 0x66, 0xce, 0x50, 0x52, 0x31, 0x4e, 0xa5, 0x6f, ++ 0x98, 0x04, 0xa4, 0x33, 0xaa, 0x28, 0x77, 0xa6, 0x02, 0x72, 0xf7, 0x6c, ++ 0x52, 0xdf, 0x3b, 0x98, 0xbf, 0xee, 0x89, 0xeb, 0x67, 0x52, 0x79, 0x7e, ++ 0xdf, 0x4e, 0x09, 0xe3, 0x4c, 0x9e, 0xf8, 0xbf, 0x33, 0xa8, 0x1c, 0x69, ++ 0x32, 0x0d, 0x58, 0xb9, 0xe0, 0xcd, 0x19, 0x41, 0x92, 0xb7, 0xdc, 0xdf, ++ 0x34, 0x41, 0xf8, 0x9b, 0xac, 0xee, 0xc0, 0xd5, 0x88, 0x9f, 0x3a, 0xd6, ++ 0xbb, 0xba, 0x87, 0xfc, 0x3a, 0x3c, 0xae, 0x1f, 0xe3, 0xfe, 0x70, 0x3d, ++ 0xbc, 0x0e, 0x0b, 0xd9, 0x37, 0x5e, 0x11, 0x6f, 0xc9, 0xaa, 0x45, 0xfc, ++ 0x25, 0x9e, 0xbc, 0x40, 0xbe, 0x25, 0x75, 0x34, 0x9d, 0x57, 0x3b, 0x98, ++ 0xba, 0xbf, 0x07, 0xcb, 0x33, 0xac, 0x5c, 0xdf, 0x33, 0x4e, 0xcf, 0x2d, ++ 0xf9, 0xdc, 0x1f, 0x4c, 0x2a, 0x12, 0x65, 0x67, 0x86, 0xee, 0x3f, 0xea, ++ 0x0d, 0xa2, 0xbc, 0x6a, 0xc9, 0x76, 0x53, 0xfb, 0x7e, 0xb9, 0xba, 0xdf, ++ 0x1a, 0xe2, 0x7e, 0x2c, 0x3e, 0xfe, 0x6b, 0xcf, 0x94, 0xd2, 0x39, 0x93, ++ 0x1e, 0x47, 0xca, 0x98, 0x2b, 0x73, 0x66, 0x29, 0xc5, 0x9b, 0x18, 0xf2, ++ 0x0f, 0xd9, 0xf9, 0xb9, 0x27, 0x53, 0x5c, 0x99, 0x68, 0x3f, 0xb4, 0x98, ++ 0x85, 0x9d, 0x2a, 0xf2, 0x31, 0x19, 0x81, 0x5b, 0x0a, 0x22, 0xec, 0xa4, ++ 0xd7, 0x26, 0xfe, 0x4b, 0x09, 0xf2, 0xc3, 0xe9, 0x03, 0xdf, 0xcf, 0x43, ++ 0x39, 0x75, 0x9d, 0x05, 0xec, 0xf8, 0x41, 0xe4, 0x92, 0xb7, 0x88, 0xcb, ++ 0xa5, 0xb3, 0x66, 0x47, 0x9b, 0x04, 0x76, 0xdb, 0x2b, 0xe9, 0x81, 0x00, ++ 0xf6, 0x73, 0x22, 0x76, 0xf6, 0x24, 0x37, 0xcc, 0x6b, 0x56, 0x62, 0xa5, ++ 0xc5, 0x8d, 0xf0, 0x06, 0x7f, 0x22, 0xa3, 0x9c, 0x4c, 0x12, 0xeb, 0xed, ++ 0x9e, 0xc9, 0xe1, 0x73, 0x57, 0xfb, 0xa5, 0x05, 0xd0, 0x6f, 0x8b, 0x1d, ++ 0xf8, 0x19, 0xda, 0x27, 0x05, 0x14, 0x8d, 0xe2, 0xef, 0x03, 0x33, 0xa5, ++ 0x9b, 0x00, 0xee, 0x16, 0x89, 0xcb, 0x5f, 0x68, 0x14, 0x4f, 0xfb, 0x94, ++ 0x22, 0x35, 0x1e, 0xcf, 0xf5, 0x96, 0x36, 0xbd, 0x41, 0x71, 0xd5, 0xb2, ++ 0x90, 0x03, 0xb2, 0x90, 0x03, 0xaf, 0x37, 0xf7, 0xe6, 0x29, 0xf9, 0xa0, ++ 0x72, 0xbb, 0x36, 0xc8, 0x68, 0x6f, 0xbf, 0x21, 0xce, 0x97, 0xdf, 0xc8, ++ 0x66, 0x77, 0x4c, 0x1b, 0xc4, 0x9f, 0xb9, 0xb1, 0x80, 0xcb, 0xf1, 0xe9, ++ 0xb2, 0x5a, 0x8a, 0x74, 0xe4, 0x31, 0x7f, 0xeb, 0x8d, 0x5a, 0xa0, 0x13, ++ 0xd9, 0xe2, 0x0b, 0xd1, 0xfa, 0x65, 0x3a, 0x55, 0xa4, 0xf7, 0xc3, 0xce, ++ 0x0a, 0x6f, 0x2f, 0xf4, 0x23, 0x65, 0xdd, 0x5f, 0x8e, 0x71, 0xc9, 0x2d, ++ 0x99, 0xf7, 0x97, 0x63, 0x5c, 0x89, 0x9c, 0xe0, 0xf3, 0xfa, 0x23, 0xf2, ++ 0x1b, 0x0b, 0x54, 0xea, 0xaf, 0x1a, 0xeb, 0x21, 0xde, 0x62, 0x1b, 0xcb, ++ 0x51, 0x8f, 0xfd, 0xc3, 0xfa, 0x8b, 0x87, 0xfe, 0x4a, 0xfe, 0xf6, 0xfe, ++ 0xfa, 0xfb, 0xb1, 0x72, 0xb8, 0x96, 0xda, 0xfa, 0x86, 0x29, 0x68, 0x97, ++ 0x79, 0x03, 0x9b, 0x91, 0xce, 0xcf, 0xcf, 0x79, 0x97, 0xce, 0x5b, 0xbf, ++ 0x9b, 0xf6, 0xda, 0x3b, 0x18, 0x1f, 0xf1, 0x9a, 0xb9, 0x7d, 0x42, 0x1c, ++ 0xca, 0xa1, 0x6c, 0x49, 0xd0, 0x2d, 0xb7, 0xd7, 0x8e, 0x15, 0xea, 0x7e, ++ 0x4d, 0x1e, 0xd7, 0x7e, 0xac, 0x98, 0xfb, 0x35, 0x41, 0x0e, 0xf1, 0xf8, ++ 0xc9, 0x52, 0x7e, 0x8f, 0xa6, 0x76, 0x26, 0x23, 0x7e, 0xae, 0x15, 0x71, ++ 0x15, 0x93, 0x5c, 0xfc, 0x5e, 0xd2, 0xa4, 0xf2, 0x6c, 0x5f, 0x0b, 0x4c, ++ 0x6d, 0x2a, 0xeb, 0x53, 0x50, 0x4e, 0x4f, 0x3a, 0xe1, 0x8f, 0xc3, 0xf5, ++ 0x63, 0x33, 0x03, 0xe5, 0xfe, 0xd2, 0xa1, 0xed, 0x30, 0xe6, 0x35, 0xab, ++ 0x91, 0x72, 0x65, 0xb2, 0x1a, 0x91, 0x87, 0xbf, 0xd7, 0x17, 0x19, 0xf3, ++ 0x37, 0xf8, 0x8c, 0xf9, 0x1b, 0xc7, 0x7e, 0x59, 0x18, 0x99, 0xdf, 0xe0, ++ 0xd5, 0xf6, 0x23, 0xbd, 0x3e, 0x2f, 0xf1, 0x38, 0xcd, 0xe0, 0x55, 0xcc, ++ 0x45, 0xf3, 0xf4, 0x48, 0x41, 0xb4, 0x97, 0x8a, 0x9f, 0x4d, 0xeb, 0x14, ++ 0xfe, 0x5b, 0x8a, 0x27, 0xfc, 0xa9, 0xd8, 0xcf, 0x3d, 0x3b, 0x96, 0x51, ++ 0x79, 0xf2, 0x5e, 0xdb, 0x2e, 0xbc, 0x5f, 0xa0, 0xfb, 0xc1, 0x65, 0x51, ++ 0x5e, 0xec, 0x65, 0xb6, 0xac, 0x04, 0xc2, 0x07, 0xe9, 0xd9, 0x3e, 0x49, ++ 0xc4, 0x25, 0x7a, 0xe8, 0xac, 0x87, 0x1d, 0xb8, 0xdb, 0xc5, 0xf1, 0x07, ++ 0x75, 0x2d, 0xd0, 0xcf, 0x81, 0x39, 0x2a, 0xf1, 0x71, 0xb2, 0xc3, 0xc4, ++ 0xae, 0x45, 0x5e, 0x2f, 0xb7, 0x91, 0xfd, 0xa4, 0xf3, 0x45, 0x8b, 0x1d, ++ 0xe8, 0x1b, 0xf0, 0x58, 0x91, 0x6e, 0x8b, 0x41, 0x7a, 0x6f, 0x31, 0xfb, ++ 0xb6, 0x60, 0x5f, 0x72, 0x8c, 0x55, 0x45, 0xbd, 0x5a, 0x19, 0x67, 0xa3, ++ 0xbe, 0xe5, 0x1f, 0x28, 0xa4, 0x97, 0x56, 0xda, 0xad, 0x14, 0xda, 0x7a, ++ 0xe4, 0xc1, 0x18, 0xca, 0x57, 0x28, 0xcc, 0x8f, 0xf1, 0x18, 0x00, 0xe2, ++ 0x4c, 0x4c, 0x5f, 0x33, 0xfb, 0x42, 0x8d, 0x38, 0x5f, 0xa8, 0x87, 0xf3, ++ 0x6d, 0x71, 0x33, 0x92, 0x57, 0x72, 0x85, 0x85, 0xf4, 0x34, 0xf4, 0x4b, ++ 0xeb, 0x7a, 0x64, 0x83, 0x29, 0xc4, 0x68, 0xfe, 0x95, 0x0a, 0xc5, 0x5b, ++ 0x0a, 0x98, 0x75, 0xbe, 0x83, 0x91, 0xe8, 0xfb, 0x66, 0xc1, 0xd7, 0xb2, ++ 0x89, 0x85, 0x49, 0x8e, 0xa5, 0xd9, 0x48, 0x8e, 0x1d, 0x85, 0xfe, 0xb1, ++ 0xdf, 0x23, 0x2f, 0xcb, 0x9d, 0xe4, 0x47, 0x2b, 0x52, 0x6f, 0xc7, 0xf2, ++ 0x73, 0xb6, 0x42, 0xba, 0x7f, 0xd3, 0xd0, 0x7f, 0xaf, 0x48, 0x31, 0x21, ++ 0x70, 0x45, 0xc2, 0x8e, 0x72, 0x77, 0xf3, 0xfb, 0x5f, 0x3a, 0x3f, 0xeb, ++ 0xf2, 0x25, 0x9a, 0x9f, 0x41, 0x0a, 0xe6, 0x79, 0x92, 0x19, 0x07, 0x51, ++ 0xc5, 0x7f, 0x60, 0x1a, 0xc9, 0xa8, 0xf7, 0x19, 0xd9, 0xf3, 0xfa, 0xf9, ++ 0x60, 0xa6, 0x4d, 0x2f, 0x57, 0x34, 0x1c, 0x27, 0xb5, 0xbf, 0x3e, 0xbf, ++ 0x7f, 0x95, 0x2c, 0xf2, 0xde, 0xc2, 0x6c, 0xe2, 0x37, 0xa8, 0x12, 0x36, ++ 0x95, 0xa1, 0xfd, 0xf1, 0xeb, 0xff, 0x46, 0xba, 0xd5, 0xe5, 0xc3, 0x4e, ++ 0xeb, 0xfd, 0x6f, 0xd4, 0x5e, 0x35, 0x18, 0xfe, 0x8b, 0xee, 0xa5, 0xfc, ++ 0x14, 0xa7, 0x8b, 0xe3, 0xbf, 0x30, 0x03, 0xf9, 0x50, 0x8e, 0x29, 0xcc, ++ 0x40, 0x7d, 0xd7, 0xe2, 0xf6, 0xa9, 0xfe, 0x88, 0x7c, 0x11, 0xb0, 0xd1, ++ 0xac, 0x04, 0xc4, 0x0f, 0xd4, 0x83, 0xfc, 0x8c, 0x9a, 0x77, 0xf3, 0x94, ++ 0x08, 0xff, 0x9f, 0xb7, 0x50, 0x25, 0x61, 0x09, 0xf5, 0xb4, 0x44, 0x80, ++ 0xe3, 0x88, 0x5d, 0xcd, 0x40, 0x7e, 0x1d, 0x64, 0xdc, 0x3a, 0x3e, 0x6e, ++ 0xec, 0x3f, 0x76, 0x5c, 0x2f, 0x8c, 0x0b, 0xf5, 0x8e, 0x38, 0x61, 0x5c, ++ 0xa8, 0xb7, 0xdb, 0x6e, 0x0d, 0x9b, 0xe2, 0x06, 0x1b, 0x7f, 0xac, 0x8a, ++ 0xe3, 0x5d, 0x6a, 0x5c, 0x40, 0x27, 0x21, 0x75, 0x8a, 0xc0, 0x33, 0xd0, ++ 0x45, 0x10, 0xfd, 0x52, 0x47, 0x9c, 0x26, 0xa2, 0xcf, 0x29, 0x22, 0x3e, ++ 0xf7, 0x48, 0x12, 0x1f, 0x8f, 0x15, 0x19, 0xe3, 0x67, 0xf2, 0x62, 0x60, ++ 0x7c, 0xf2, 0xb7, 0x1a, 0xe3, 0x65, 0xae, 0x93, 0xb6, 0xb7, 0xa2, 0x5e, ++ 0xde, 0x6c, 0x8f, 0xdb, 0x85, 0xf4, 0xf8, 0x6b, 0x41, 0x27, 0xc7, 0x62, ++ 0x7f, 0x90, 0x87, 0x76, 0xd5, 0xaf, 0x67, 0x17, 0x1c, 0x45, 0xb9, 0x32, ++ 0x29, 0x7e, 0x65, 0x2b, 0x12, 0xc9, 0x14, 0xd6, 0x45, 0xf2, 0x46, 0x97, ++ 0x7b, 0xe7, 0x53, 0xdf, 0xad, 0xc0, 0x3c, 0xc8, 0xbf, 0x2b, 0x0b, 0x61, ++ 0xde, 0xdf, 0xcd, 0x79, 0x6d, 0x36, 0x76, 0x7e, 0xd4, 0xbd, 0x39, 0x0f, ++ 0xf5, 0x1f, 0xc8, 0x87, 0xb1, 0x85, 0x49, 0x17, 0xc3, 0xaf, 0xd3, 0xa3, ++ 0x0e, 0x37, 0xd2, 0x21, 0xf2, 0x41, 0x3f, 0x1d, 0x46, 0xc1, 0xaf, 0xd3, ++ 0x11, 0x9b, 0xda, 0x45, 0x01, 0x86, 0x3b, 0xc0, 0x2e, 0xc5, 0x54, 0xb7, ++ 0x53, 0x19, 0x6b, 0xe4, 0x71, 0xe0, 0x6a, 0xe6, 0xc0, 0xfc, 0x80, 0x88, ++ 0x27, 0xd9, 0x1a, 0xf9, 0x3c, 0x56, 0x06, 0x09, 0xee, 0xeb, 0xdc, 0x1b, ++ 0x29, 0xde, 0xac, 0x78, 0x78, 0xe0, 0x06, 0x84, 0x6b, 0xd6, 0xa8, 0x4f, ++ 0x87, 0x29, 0x58, 0xd9, 0x3b, 0xa7, 0x10, 0xf7, 0x61, 0x00, 0xef, 0xd4, ++ 0xc2, 0x31, 0xff, 0xff, 0xe0, 0x8d, 0xb6, 0xcb, 0x2f, 0x15, 0x0f, 0xad, ++ 0xc3, 0x15, 0xcd, 0xc7, 0xfa, 0xf8, 0xd2, 0xf4, 0xbd, 0x14, 0x0f, 0xdd, ++ 0x30, 0xd3, 0x41, 0xf1, 0xd1, 0x13, 0x44, 0x5c, 0x69, 0xc3, 0x62, 0x13, ++ 0xc5, 0x09, 0xc1, 0xfe, 0x8d, 0xec, 0xfe, 0x7a, 0x66, 0x0b, 0xa1, 0x1c, ++ 0xbe, 0x5a, 0xd8, 0xd1, 0x7a, 0x9c, 0xfe, 0xaf, 0x24, 0xee, 0xff, 0x0c, ++ 0x3e, 0x63, 0x55, 0xf7, 0x44, 0xd8, 0xe3, 0x17, 0xc7, 0x49, 0xab, 0x14, ++ 0x87, 0x1d, 0x5c, 0xc1, 0xe3, 0xa9, 0xfb, 0xed, 0xed, 0x3a, 0x6e, 0x6f, ++ 0xf7, 0xeb, 0x35, 0x71, 0x2f, 0xa0, 0x63, 0x34, 0x97, 0xe5, 0x1d, 0x77, ++ 0xab, 0x14, 0x2f, 0xf1, 0xbc, 0xc4, 0xeb, 0x07, 0xe7, 0x30, 0x6e, 0xaf, ++ 0x4f, 0x13, 0xe5, 0x0b, 0x5c, 0x22, 0x9e, 0x02, 0xe6, 0x92, 0x3c, 0x10, ++ 0xaf, 0xde, 0xd1, 0xc9, 0x88, 0xfe, 0x3b, 0x9c, 0x39, 0x54, 0x9e, 0x26, ++ 0x73, 0xfd, 0xc3, 0xbe, 0xc5, 0xf5, 0x4f, 0x47, 0x36, 0xb7, 0x27, 0x3b, ++ 0x6e, 0x2d, 0xa0, 0x72, 0xd8, 0x17, 0x0c, 0x47, 0xbc, 0xcf, 0x93, 0xc1, ++ 0x7e, 0xe6, 0xe7, 0xf3, 0x7c, 0x7f, 0x90, 0xcf, 0xc7, 0x8b, 0xf6, 0xd3, ++ 0x6e, 0x2c, 0x34, 0xfa, 0xbd, 0xf4, 0x7c, 0xb4, 0x5f, 0x76, 0x77, 0x56, ++ 0x60, 0x13, 0xd2, 0xcb, 0x82, 0x12, 0x6d, 0x98, 0x04, 0x74, 0x35, 0xcf, ++ 0xc2, 0xfd, 0xae, 0x40, 0x77, 0xdb, 0xf1, 0x4e, 0x4c, 0x0d, 0x6b, 0xdc, ++ 0xad, 0xe4, 0xe2, 0xfd, 0x8a, 0xc6, 0x37, 0x4d, 0xb9, 0x44, 0x77, 0xdb, ++ 0x89, 0xee, 0x8a, 0x81, 0xee, 0x72, 0x0d, 0x74, 0xb7, 0x83, 0xf3, 0x49, ++ 0x90, 0x84, 0xa9, 0x4e, 0x77, 0xfd, 0xf4, 0x56, 0x14, 0x1d, 0x0f, 0x17, ++ 0x78, 0x1c, 0xeb, 0x77, 0xb8, 0xbb, 0xfe, 0x50, 0x8f, 0xfb, 0x8a, 0x6e, ++ 0x2b, 0xad, 0x83, 0x1e, 0xd7, 0x18, 0xcd, 0xe7, 0x11, 0xf0, 0x9c, 0x34, ++ 0x73, 0x78, 0x3c, 0xb2, 0x4c, 0xf0, 0xfc, 0x1c, 0xe1, 0x8f, 0x86, 0xe7, ++ 0x72, 0xe8, 0x3f, 0x92, 0xde, 0x52, 0x18, 0xa7, 0xf3, 0xa1, 0xf8, 0x20, ++ 0x45, 0x61, 0x41, 0x67, 0xd9, 0x00, 0x1f, 0x6c, 0xf0, 0x06, 0x5e, 0x40, ++ 0xf8, 0xfb, 0xf9, 0x61, 0x35, 0xdf, 0x47, 0x5e, 0x04, 0xb7, 0xec, 0x20, ++ 0xba, 0xb8, 0xf9, 0x56, 0x99, 0xd3, 0x6b, 0x2c, 0xd7, 0xe7, 0x78, 0x9e, ++ 0x94, 0x0a, 0xe3, 0x4f, 0x13, 0xe3, 0xdf, 0xbc, 0xd6, 0x5f, 0xed, 0xc6, ++ 0x7a, 0xd3, 0x24, 0xc2, 0xc3, 0xb4, 0xee, 0x3a, 0x8a, 0xfb, 0x62, 0xd5, ++ 0xfc, 0x5c, 0xc8, 0x07, 0x7f, 0x10, 0x9e, 0x16, 0x21, 0xe7, 0xf4, 0xf3, ++ 0xab, 0x59, 0xa2, 0xfd, 0x0c, 0xd7, 0x34, 0x33, 0xfa, 0xe3, 0x66, 0xd6, ++ 0x1a, 0xcf, 0x91, 0x66, 0x39, 0xf8, 0x39, 0xd5, 0xcd, 0x33, 0xcd, 0xef, ++ 0x45, 0xda, 0x3d, 0xb3, 0xd8, 0xfa, 0x4f, 0x31, 0x4e, 0x71, 0x16, 0x9e, ++ 0x33, 0xe9, 0xf5, 0x81, 0x8e, 0xfe, 0xbd, 0x90, 0xdf, 0x63, 0x83, 0x3e, ++ 0x0b, 0xf1, 0x9c, 0xe9, 0xa8, 0xf0, 0xb3, 0x9c, 0x05, 0xba, 0x46, 0xba, ++ 0x7f, 0x29, 0x69, 0xd1, 0xf6, 0xbb, 0x81, 0xee, 0x0a, 0x1f, 0x29, 0x29, ++ 0x43, 0x7f, 0xdc, 0xc4, 0xe4, 0x25, 0xbb, 0x37, 0x40, 0xfe, 0x89, 0x6d, ++ 0x23, 0x28, 0xff, 0x52, 0xf2, 0x6d, 0xf7, 0xbc, 0x86, 0xe5, 0x3b, 0x0b, ++ 0x28, 0x5f, 0x6d, 0x92, 0x88, 0x4e, 0xcf, 0xd6, 0xf1, 0xf6, 0x45, 0x15, ++ 0xb7, 0x4e, 0xc9, 0x8e, 0x43, 0xf9, 0x2f, 0xfa, 0x45, 0x7e, 0xc2, 0xfd, ++ 0x7a, 0x4c, 0xa0, 0x63, 0x1a, 0xd4, 0xf3, 0x8e, 0xcc, 0x29, 0xc3, 0xf8, ++ 0xd1, 0x6a, 0xe1, 0x37, 0x38, 0x7b, 0x37, 0xa3, 0xf2, 0xeb, 0x47, 0x39, ++ 0x79, 0x48, 0xee, 0x22, 0x95, 0xfc, 0x7e, 0xd5, 0x31, 0xa2, 0xfc, 0x3b, ++ 0xbc, 0xdf, 0x57, 0x46, 0xff, 0x7b, 0x19, 0xc6, 0x11, 0x57, 0xe7, 0xf4, ++ 0xcd, 0x46, 0xfa, 0x7e, 0xa5, 0xec, 0xf9, 0x11, 0x98, 0x3f, 0x2a, 0x7d, ++ 0x3a, 0x7b, 0xb0, 0x38, 0x86, 0xe2, 0x22, 0x29, 0x3c, 0x1c, 0xf0, 0x52, ++ 0x9d, 0xc0, 0xeb, 0xd7, 0x96, 0xfd, 0x24, 0x0d, 0xfd, 0x30, 0xd5, 0x55, ++ 0x3c, 0x5f, 0xec, 0xab, 0x5c, 0x9b, 0x8b, 0xe5, 0xa6, 0x73, 0xb3, 0x07, ++ 0xbb, 0xdf, 0x6b, 0x2d, 0x12, 0xfe, 0x1f, 0xfd, 0xbe, 0x9a, 0xe0, 0xeb, ++ 0x67, 0xb5, 0x77, 0xe9, 0x7e, 0x9a, 0xdf, 0x26, 0xf9, 0x70, 0x8a, 0xfe, ++ 0xb1, 0xef, 0x92, 0xdf, 0x81, 0x39, 0x24, 0x17, 0xba, 0xce, 0xfc, 0x5a, ++ 0xb6, 0x82, 0x7e, 0xee, 0x09, 0x1a, 0x8f, 0x33, 0xad, 0xb2, 0xad, 0x4c, ++ 0x45, 0xf9, 0x35, 0x35, 0x60, 0x29, 0xc7, 0x78, 0x61, 0x97, 0x6d, 0xf4, ++ 0x51, 0x8c, 0x23, 0x88, 0x1f, 0x5b, 0x39, 0x06, 0xd7, 0x75, 0x82, 0x8d, ++ 0xd1, 0xba, 0x02, 0x9d, 0xc7, 0x16, 0x21, 0x9d, 0x5f, 0xf9, 0xe9, 0xb0, ++ 0x38, 0x24, 0x2e, 0x87, 0x91, 0xce, 0x75, 0x3a, 0x9a, 0xa6, 0xd3, 0x77, ++ 0xb5, 0x91, 0x8e, 0x81, 0x3f, 0xdd, 0xd8, 0xfe, 0x52, 0xf2, 0x76, 0x28, ++ 0x3a, 0x86, 0xf1, 0xd3, 0x8b, 0x90, 0xef, 0xbf, 0x65, 0xd4, 0x37, 0xfd, ++ 0xfd, 0x45, 0xf1, 0x5b, 0x74, 0xff, 0x43, 0xc9, 0x01, 0xfc, 0x89, 0x94, ++ 0x8b, 0x03, 0x70, 0x74, 0x11, 0x5f, 0x65, 0x60, 0xf4, 0x5e, 0x2e, 0xf2, ++ 0x5d, 0xbb, 0xce, 0x77, 0x25, 0x38, 0x0f, 0x8b, 0xa9, 0x87, 0xee, 0xe9, ++ 0x64, 0x49, 0xbe, 0x11, 0x74, 0x61, 0x75, 0xac, 0xcf, 0x46, 0xfa, 0x28, ++ 0x0a, 0x6e, 0x1d, 0xbe, 0x4c, 0x90, 0x6d, 0xac, 0xec, 0x62, 0xb8, 0xf0, ++ 0x47, 0xd1, 0xed, 0x45, 0xfe, 0xe3, 0x41, 0xbf, 0x44, 0x86, 0x28, 0x87, ++ 0x76, 0x1a, 0x4b, 0x18, 0x80, 0x0b, 0xc6, 0x1f, 0x87, 0x78, 0x60, 0xab, ++ 0x39, 0x3c, 0x3b, 0xa4, 0x46, 0x2e, 0x37, 0xc4, 0xfe, 0x40, 0xf7, 0x67, ++ 0xd4, 0xeb, 0xf3, 0x3d, 0x68, 0x9c, 0x6f, 0x45, 0x0c, 0xbf, 0xb7, 0xee, ++ 0x45, 0xbf, 0x13, 0xb6, 0xf3, 0x8c, 0x1e, 0xf1, 0x75, 0x70, 0x37, 0x08, ++ 0x7d, 0x3a, 0xd3, 0xe6, 0x7f, 0xd0, 0x0a, 0x73, 0xb8, 0xc9, 0x3d, 0x8f, ++ 0xe8, 0xe1, 0x16, 0xd0, 0x68, 0x6e, 0x98, 0xff, 0x5f, 0xd3, 0x03, 0x53, ++ 0x11, 0x9e, 0x16, 0x29, 0xf8, 0x42, 0x6f, 0x36, 0xf9, 0xe3, 0x29, 0xbe, ++ 0x03, 0xd6, 0xfb, 0xc6, 0xa2, 0x08, 0xbb, 0x45, 0x87, 0x2b, 0x1a, 0x1f, ++ 0xf5, 0x43, 0xc8, 0xc3, 0x68, 0xb8, 0xa3, 0xf1, 0x30, 0xb0, 0x3e, 0x3d, ++ 0xa9, 0x98, 0xea, 0xf7, 0xdd, 0xfa, 0xe7, 0x15, 0x35, 0x9f, 0x68, 0xbb, ++ 0xc0, 0x63, 0x31, 0xfa, 0xf3, 0x12, 0x84, 0xdf, 0x2d, 0x61, 0xc0, 0xcf, ++ 0x56, 0x84, 0xe5, 0xb5, 0x2c, 0xc6, 0x47, 0x7e, 0x36, 0x9f, 0x44, 0xfb, ++ 0xa8, 0x5a, 0xd0, 0xf3, 0x28, 0x47, 0x6b, 0x6b, 0x18, 0xf9, 0x47, 0x12, ++ 0x1c, 0x26, 0xf2, 0xb3, 0xe9, 0xfa, 0x7e, 0x28, 0xfa, 0x1e, 0x7f, 0x2d, ++ 0x97, 0x37, 0xb5, 0x4b, 0x99, 0xb8, 0x4f, 0xc7, 0xe7, 0x11, 0x4d, 0x5f, ++ 0x29, 0xac, 0xf7, 0x5e, 0x4c, 0x6b, 0x6d, 0xea, 0xd6, 0xf9, 0xc8, 0xb7, ++ 0x8b, 0x1d, 0x86, 0x38, 0xf8, 0x5a, 0x07, 0xf7, 0xcf, 0xaf, 0xd6, 0xf9, ++ 0x9f, 0xf5, 0x8e, 0x41, 0xbf, 0x44, 0x7f, 0xfe, 0x22, 0x7f, 0x70, 0xef, ++ 0x18, 0x94, 0x1f, 0xb3, 0x65, 0xe3, 0x39, 0x55, 0xed, 0x05, 0xee, 0x0f, ++ 0x4e, 0xb8, 0x20, 0x51, 0x5a, 0xeb, 0x7b, 0x77, 0x0c, 0xfa, 0x59, 0x12, ++ 0x6a, 0x7a, 0xc7, 0xa0, 0x1c, 0x6a, 0x1b, 0xa6, 0xad, 0xc1, 0xf5, 0x7b, ++ 0xc7, 0xc4, 0xfd, 0xe5, 0x17, 0xf9, 0x2d, 0x8a, 0x4c, 0xba, 0x3f, 0xf8, ++ 0xb2, 0xe8, 0x2e, 0x7a, 0x3d, 0xf4, 0xf3, 0xbf, 0x98, 0x0c, 0xff, 0xc3, ++ 0x38, 0xce, 0x69, 0xa9, 0xa7, 0x02, 0x0b, 0x1f, 0xce, 0x11, 0xf7, 0x22, ++ 0x59, 0x20, 0x1b, 0xe9, 0xd2, 0xed, 0xca, 0xae, 0x44, 0x3f, 0x0e, 0xc8, ++ 0xb9, 0xaf, 0xbe, 0xc2, 0xcd, 0x23, 0x16, 0x01, 0xbe, 0xc6, 0x64, 0x05, ++ 0x76, 0x20, 0x1f, 0xde, 0xc2, 0xfc, 0x13, 0xf1, 0xae, 0x65, 0x42, 0x4d, ++ 0xc0, 0xcc, 0xcf, 0x2b, 0x18, 0xcd, 0x7f, 0x99, 0x98, 0xff, 0x44, 0xa1, ++ 0xff, 0xce, 0x6d, 0xe7, 0x71, 0x15, 0xd5, 0x5a, 0xd1, 0x66, 0x3c, 0x12, ++ 0x69, 0x38, 0x6e, 0x66, 0x21, 0xe2, 0x3f, 0x8d, 0xf4, 0xd8, 0x5d, 0x02, ++ 0xfe, 0x73, 0xa0, 0xea, 0xc2, 0x58, 0xff, 0x49, 0x27, 0xe9, 0xc1, 0x45, ++ 0x2f, 0xcf, 0xa3, 0x78, 0x89, 0xc2, 0x2d, 0xa6, 0x81, 0x77, 0x2b, 0xe0, ++ 0xef, 0xf0, 0x50, 0x8c, 0xe1, 0xdd, 0x8a, 0xe2, 0xbd, 0x09, 0x86, 0x7c, ++ 0x69, 0x57, 0x9a, 0xa1, 0xfe, 0xa8, 0x83, 0x39, 0x86, 0xf2, 0xd1, 0xe1, ++ 0x11, 0x86, 0xf2, 0x2b, 0x8e, 0x97, 0x19, 0xf2, 0x63, 0x7a, 0xae, 0x36, ++ 0xd4, 0xbf, 0xf2, 0x44, 0x95, 0x21, 0x7f, 0x55, 0xef, 0x14, 0x43, 0xfd, ++ 0x6f, 0x7d, 0x30, 0xdd, 0x90, 0xbf, 0xa6, 0xef, 0xdb, 0x86, 0xfa, 0xef, ++ 0xf7, 0xef, 0xe3, 0x85, 0xfe, 0x0e, 0x6a, 0x3d, 0x45, 0x30, 0xef, 0xf9, ++ 0x3a, 0x7d, 0x5e, 0x98, 0x6b, 0x68, 0xff, 0x71, 0xdc, 0xa4, 0xe3, 0x48, ++ 0x9f, 0xf3, 0xd7, 0xf3, 0xf8, 0xef, 0x4a, 0xc0, 0x90, 0xe1, 0x1d, 0x8f, ++ 0x76, 0xae, 0xe7, 0x1b, 0xe1, 0x0f, 0xae, 0xef, 0x44, 0xd6, 0x47, 0x71, ++ 0x77, 0xf5, 0x21, 0xc9, 0x17, 0x66, 0x18, 0x47, 0x66, 0xb4, 0x03, 0x96, ++ 0x1c, 0xec, 0x24, 0x3c, 0x5e, 0xea, 0xde, 0x7b, 0xa1, 0x67, 0x8e, 0x09, ++ 0x4d, 0xdf, 0x13, 0x45, 0xc2, 0x0e, 0xb8, 0x92, 0x5d, 0xc9, 0xe3, 0x46, ++ 0xbf, 0x7e, 0x5d, 0x0b, 0x58, 0xde, 0xdf, 0xb4, 0xae, 0x56, 0xaf, 0x71, ++ 0x5d, 0xed, 0xaa, 0x71, 0x5d, 0x63, 0x8b, 0x8c, 0xeb, 0xea, 0xf4, 0x19, ++ 0xd7, 0x35, 0x7e, 0xac, 0x71, 0x5d, 0xdd, 0x9a, 0x71, 0x5d, 0x13, 0x6b, ++ 0x8c, 0xeb, 0x9a, 0xe4, 0x37, 0xae, 0x6b, 0xca, 0x2c, 0xe3, 0xba, 0xa6, ++ 0x06, 0x8c, 0xeb, 0x9a, 0xbe, 0xd8, 0xb8, 0xae, 0x99, 0x8d, 0xc6, 0x75, ++ 0xcd, 0x6a, 0x32, 0xae, 0x5b, 0x76, 0xf0, 0x4e, 0x43, 0xf9, 0x50, 0xeb, ++ 0xad, 0xcb, 0xc3, 0xdc, 0xb6, 0x65, 0x86, 0xfa, 0xfd, 0xeb, 0xee, 0x5f, ++ 0x4c, 0x71, 0x44, 0xf9, 0xed, 0xdf, 0x33, 0xf4, 0xaf, 0xaf, 0x7b, 0x10, ++ 0xfe, 0xe0, 0xba, 0x17, 0x32, 0x11, 0xef, 0xf8, 0x77, 0xae, 0x7b, 0xf2, ++ 0x70, 0xe3, 0x7a, 0x83, 0xfe, 0x48, 0x19, 0x9e, 0x44, 0x7a, 0x3f, 0x0d, ++ 0xd3, 0x59, 0x85, 0xc2, 0xbe, 0xf6, 0x0f, 0xae, 0xf7, 0x75, 0xf9, 0x13, ++ 0xa9, 0x67, 0x23, 0xf7, 0x97, 0x43, 0xc9, 0xa5, 0x8b, 0xf4, 0x8a, 0xd8, ++ 0x6f, 0x0e, 0xa9, 0x57, 0xa2, 0xf6, 0x9b, 0x6f, 0x31, 0xd0, 0x7b, 0x34, ++ 0xc8, 0x7a, 0xf2, 0x1f, 0xdd, 0x2a, 0xe8, 0xf3, 0x48, 0x0c, 0xc7, 0xfb, ++ 0x67, 0x58, 0x74, 0x15, 0xd4, 0x83, 0x3a, 0x63, 0x01, 0xae, 0xb7, 0x10, ++ 0x6e, 0x18, 0xe7, 0xad, 0x98, 0x62, 0xf2, 0x0b, 0x7c, 0x9b, 0x75, 0x99, ++ 0xb1, 0xff, 0xdb, 0x59, 0x0f, 0xa5, 0xb3, 0x59, 0x1f, 0xa5, 0x01, 0xe6, ++ 0x22, 0x3d, 0x3a, 0x97, 0xf9, 0x28, 0x9d, 0xcf, 0xfc, 0x16, 0xe1, 0x27, ++ 0x18, 0x87, 0xf8, 0x58, 0x6a, 0xeb, 0xad, 0x40, 0x3d, 0x7c, 0x7e, 0xce, ++ 0x6b, 0xef, 0xd0, 0xf9, 0xd2, 0x2b, 0x89, 0x97, 0xf5, 0xde, 0xc3, 0x7b, ++ 0x78, 0x8e, 0x91, 0xcf, 0xd8, 0x29, 0x21, 0x0f, 0x4e, 0xe2, 0x79, 0x06, ++ 0xe4, 0xcf, 0xd8, 0x85, 0x3f, 0x4d, 0x63, 0xaa, 0x27, 0x02, 0x6f, 0xa7, ++ 0x84, 0xdf, 0x6f, 0xee, 0x04, 0x89, 0xf4, 0x21, 0x93, 0x63, 0x28, 0xce, ++ 0x6a, 0xee, 0x2d, 0x12, 0xe9, 0x93, 0xb9, 0xff, 0xc5, 0xd3, 0x99, 0xc3, ++ 0xf9, 0xfe, 0x2e, 0x3a, 0x6d, 0x69, 0xd2, 0xf1, 0xc7, 0xf7, 0x29, 0xed, ++ 0xc3, 0x55, 0xd2, 0x53, 0x19, 0xac, 0x4b, 0xe8, 0x3d, 0x16, 0x70, 0xe4, ++ 0x52, 0x3f, 0xfc, 0xfc, 0xe1, 0x31, 0x0b, 0xed, 0x27, 0xbd, 0x36, 0x0e, ++ 0xdf, 0x53, 0x12, 0x53, 0xc6, 0x26, 0xd0, 0xb5, 0x33, 0x5a, 0x57, 0xaf, ++ 0x8d, 0xc3, 0xf3, 0x94, 0x99, 0xd9, 0x10, 0x9f, 0x3f, 0x63, 0x01, 0x15, ++ 0x17, 0xe3, 0x01, 0x05, 0x44, 0x14, 0xbf, 0xef, 0x30, 0x02, 0xe9, 0x63, ++ 0xee, 0x7f, 0xbd, 0x96, 0x83, 0xfe, 0xb2, 0x98, 0x98, 0xae, 0x99, 0xd5, ++ 0x57, 0xe1, 0xf9, 0x48, 0x70, 0x25, 0xf9, 0xab, 0xbf, 0xc3, 0x8c, 0xfe, ++ 0xea, 0xdb, 0x1b, 0x25, 0xf2, 0x57, 0x7f, 0x07, 0xe0, 0x84, 0xd4, 0xeb, ++ 0xf2, 0x79, 0x51, 0x5f, 0xea, 0xf9, 0xfb, 0x05, 0xbc, 0xd5, 0x58, 0x0f, ++ 0xbe, 0xa7, 0x78, 0x1b, 0x25, 0xf4, 0x0f, 0xfd, 0xc3, 0xfa, 0xdb, 0xff, ++ 0x3d, 0x5e, 0xef, 0x6f, 0xec, 0xaf, 0xbf, 0x1f, 0xc6, 0xe1, 0xc2, 0x1f, ++ 0x5c, 0x3f, 0xdd, 0xff, 0x58, 0x64, 0xe2, 0xf1, 0x0a, 0x7d, 0x77, 0xf3, ++ 0x7d, 0xca, 0xee, 0xef, 0x30, 0xee, 0x47, 0x6b, 0x0a, 0x56, 0x06, 0xf1, ++ 0x7c, 0x52, 0x86, 0x0d, 0x25, 0xc6, 0x33, 0x99, 0xf9, 0x3d, 0xf4, 0xf6, ++ 0xe1, 0xd9, 0xfc, 0xbe, 0x1b, 0xeb, 0xa1, 0x7d, 0x3e, 0x3b, 0xa6, 0xdb, ++ 0x97, 0x01, 0x92, 0xbf, 0x25, 0xe2, 0x9e, 0xc3, 0x19, 0x71, 0xbe, 0xb7, ++ 0xb0, 0xd3, 0xc6, 0x30, 0x5e, 0xa6, 0x64, 0xdf, 0xe1, 0x04, 0x3c, 0xcf, ++ 0x5b, 0x08, 0x34, 0xd8, 0x83, 0x7a, 0x58, 0x09, 0xd0, 0x3b, 0x2b, 0x25, ++ 0x5b, 0x5f, 0x4a, 0xe0, 0xfe, 0x37, 0xb3, 0x1b, 0xef, 0x2f, 0xea, 0xfa, ++ 0x7f, 0x68, 0x3a, 0x55, 0xd8, 0xa9, 0x88, 0xfb, 0x02, 0x40, 0x77, 0x8d, ++ 0x83, 0xd9, 0x1f, 0xfb, 0x46, 0xf0, 0x73, 0xfa, 0x96, 0xe6, 0x9e, 0xe1, ++ 0x78, 0x1e, 0xa7, 0xc3, 0xf3, 0xc3, 0xe6, 0xe3, 0x94, 0x97, 0x15, 0x1f, ++ 0xc5, 0x19, 0xe2, 0x3b, 0x4c, 0xee, 0x88, 0xf6, 0x16, 0x0f, 0x94, 0x47, ++ 0xc8, 0x3b, 0xc5, 0x01, 0xed, 0x23, 0xe4, 0x90, 0xd9, 0xe1, 0xa7, 0xc7, ++ 0x4c, 0x56, 0x37, 0xf7, 0xd0, 0x39, 0x9f, 0x59, 0xbc, 0x17, 0xb5, 0x26, ++ 0x63, 0x99, 0x2b, 0x10, 0xb1, 0x8f, 0xfb, 0xc5, 0x70, 0x3e, 0x3e, 0xb3, ++ 0x05, 0x99, 0x2b, 0x99, 0x09, 0x13, 0x1c, 0x53, 0xe5, 0x14, 0xca, 0xb5, ++ 0xbf, 0x30, 0xbe, 0x9f, 0xb5, 0x7a, 0xa1, 0x9f, 0x48, 0xf9, 0x79, 0x21, ++ 0x89, 0x45, 0xfa, 0xe9, 0xdb, 0x9a, 0x4f, 0x10, 0xbc, 0xab, 0xa5, 0x40, ++ 0x00, 0x3b, 0xb1, 0xe6, 0xb1, 0xb0, 0x1d, 0xd6, 0xc7, 0xaa, 0xe0, 0x9d, ++ 0x5b, 0xf8, 0xbe, 0xf5, 0xba, 0xe3, 0x18, 0x4f, 0x65, 0x71, 0x2e, 0xf3, ++ 0x85, 0xd5, 0xa1, 0xf1, 0x66, 0xf5, 0x2a, 0xe7, 0x23, 0xe5, 0x69, 0x78, ++ 0xb8, 0x88, 0xd7, 0x14, 0xf2, 0xf4, 0xc7, 0xcd, 0x7d, 0xc5, 0x38, 0x4e, ++ 0x4b, 0x73, 0xaf, 0x8e, 0x2f, 0x86, 0xe7, 0xa6, 0xc1, 0x54, 0x7e, 0x8f, ++ 0xbe, 0xa5, 0xf9, 0x43, 0xfa, 0x6e, 0xaa, 0x51, 0x89, 0xde, 0x5e, 0xdc, ++ 0x5a, 0x78, 0x58, 0x85, 0xf2, 0x77, 0xe0, 0x2f, 0xbe, 0x6b, 0x63, 0xf5, ++ 0x70, 0xb8, 0xd8, 0x05, 0x0f, 0xe9, 0xd5, 0xd9, 0x82, 0x0e, 0xd0, 0x27, ++ 0x96, 0x09, 0xf4, 0xf3, 0x4e, 0x93, 0x99, 0xe8, 0x6c, 0x79, 0xa6, 0x83, ++ 0xfc, 0xf5, 0xcb, 0x5f, 0xcd, 0x3f, 0xac, 0x01, 0x3f, 0x5b, 0x60, 0xba, ++ 0xf2, 0x37, 0x80, 0x7b, 0x60, 0x1c, 0x8e, 0x27, 0x8b, 0x90, 0xa7, 0x40, ++ 0x4f, 0x7e, 0x94, 0x0f, 0x96, 0x34, 0x85, 0xfc, 0xf6, 0x09, 0xae, 0xe9, ++ 0xb4, 0x4e, 0x7f, 0x6b, 0x7f, 0x3a, 0x7e, 0x2d, 0x76, 0x46, 0xef, 0x11, ++ 0x59, 0x32, 0x1d, 0x64, 0x17, 0x5c, 0x2e, 0x9c, 0x9f, 0x44, 0xe9, 0x2b, ++ 0xc0, 0x0b, 0xc9, 0xff, 0xe5, 0x02, 0x2f, 0xfa, 0xfb, 0x4a, 0xef, 0xdc, ++ 0xc3, 0x68, 0xbf, 0xb0, 0xfc, 0x3e, 0xee, 0xbf, 0x5b, 0x5e, 0xc7, 0x28, ++ 0xde, 0x9f, 0x35, 0xc1, 0x4f, 0xc5, 0x00, 0xdd, 0xe8, 0x7a, 0x26, 0x09, ++ 0x5f, 0x82, 0x81, 0x8f, 0xed, 0xcd, 0xc0, 0x71, 0xd0, 0xc5, 0x8f, 0x9a, ++ 0x6d, 0x2c, 0x50, 0x08, 0x76, 0x08, 0xc6, 0xc7, 0xe7, 0x0e, 0xac, 0x63, ++ 0xbb, 0xa6, 0xb8, 0xf1, 0xa8, 0x7f, 0x43, 0xb5, 0x67, 0x1a, 0xa6, 0x3f, ++ 0x1a, 0x7b, 0xb2, 0x1d, 0xc5, 0xdf, 0x43, 0xe3, 0x3e, 0xef, 0xc1, 0x14, ++ 0x7d, 0xf5, 0x38, 0xbe, 0xab, 0x91, 0x85, 0xd0, 0x3e, 0xa6, 0x33, 0x78, ++ 0x18, 0xdf, 0xbd, 0x18, 0xf2, 0x30, 0x7e, 0x9c, 0x28, 0x8f, 0x0b, 0xf0, ++ 0x7c, 0xbc, 0x28, 0x8f, 0x9f, 0xc5, 0xf3, 0x99, 0xda, 0xd3, 0x52, 0x35, ++ 0x02, 0x16, 0x75, 0xae, 0x94, 0xe9, 0x48, 0x98, 0x9c, 0x87, 0x72, 0x7a, ++ 0x3e, 0xe3, 0xf7, 0xad, 0xc5, 0x7b, 0x0b, 0x3b, 0x84, 0xbe, 0x48, 0x77, ++ 0x24, 0x4c, 0xab, 0xc6, 0xf2, 0xdb, 0x79, 0x88, 0x97, 0x5e, 0xfe, 0x88, ++ 0x28, 0x4f, 0x75, 0xbc, 0xd7, 0x96, 0x8b, 0x7a, 0x64, 0xa6, 0xb1, 0xfd, ++ 0x56, 0x81, 0x87, 0x14, 0xc7, 0x7b, 0xed, 0x13, 0xe8, 0xfc, 0xc9, 0x58, ++ 0xae, 0x9f, 0xef, 0x24, 0x39, 0xce, 0x1d, 0xa7, 0xf6, 0x25, 0xc6, 0xf2, ++ 0x87, 0x45, 0x7b, 0xa7, 0xe3, 0x5c, 0xcf, 0x04, 0x2c, 0xcf, 0x33, 0x8e, ++ 0xff, 0xa0, 0x28, 0x8f, 0x75, 0x70, 0x79, 0xc8, 0xfc, 0x8c, 0xbf, 0x0b, ++ 0x20, 0xca, 0x1f, 0x10, 0xe5, 0x76, 0x2c, 0xc7, 0xf1, 0x7d, 0xbc, 0x5c, ++ 0xd6, 0xdf, 0xbf, 0x10, 0xf5, 0xd6, 0x0a, 0x38, 0x30, 0xb6, 0x8d, 0xfc, ++ 0x9f, 0xc3, 0xb9, 0xff, 0x73, 0x67, 0xb3, 0xad, 0x84, 0xd6, 0xa5, 0xf9, ++ 0x02, 0xad, 0xcf, 0x8f, 0x9a, 0x19, 0xe5, 0xaf, 0x1b, 0x91, 0xc0, 0xef, ++ 0x65, 0xd7, 0x70, 0x7c, 0x27, 0x78, 0x38, 0x3d, 0xb8, 0x9a, 0xd8, 0xa0, ++ 0xef, 0x01, 0x5c, 0x27, 0xe4, 0x5a, 0x9c, 0xda, 0xab, 0x69, 0x83, 0xc8, ++ 0x3d, 0xbd, 0x3c, 0xc1, 0xc5, 0xdf, 0x3b, 0x90, 0xbd, 0x16, 0xa2, 0x27, ++ 0xab, 0x43, 0xc8, 0x0d, 0xc1, 0x8f, 0xfd, 0x72, 0x43, 0x6a, 0xf4, 0x71, ++ 0x22, 0xe3, 0xfe, 0xf2, 0x4b, 0xd1, 0x35, 0x30, 0xda, 0x79, 0xb4, 0x8f, ++ 0x86, 0xc1, 0x0f, 0xd2, 0x75, 0xc6, 0x3d, 0x26, 0x16, 0x88, 0x90, 0x97, ++ 0x69, 0x4b, 0x63, 0x58, 0x20, 0xf2, 0xbc, 0x66, 0x7e, 0x82, 0x21, 0x9f, ++ 0x7c, 0x7b, 0x9a, 0xa1, 0xbe, 0x67, 0x66, 0x8e, 0xa1, 0xdc, 0x51, 0x3e, ++ 0xc2, 0x50, 0xce, 0x66, 0x26, 0x10, 0xdf, 0x2c, 0x13, 0xf4, 0x15, 0x53, ++ 0x52, 0x66, 0x28, 0xd7, 0xdf, 0x61, 0x60, 0xbb, 0x45, 0x3d, 0xc1, 0xbf, ++ 0xe6, 0xbc, 0xab, 0x0d, 0xf5, 0xce, 0x15, 0xa9, 0xf1, 0x48, 0xe3, 0xa7, ++ 0x26, 0x83, 0xfe, 0xa1, 0xb8, 0x02, 0x9f, 0x0d, 0xe5, 0xc3, 0x32, 0x67, ++ 0x4e, 0x0a, 0xea, 0x9f, 0x9f, 0x35, 0x8f, 0x25, 0xe4, 0x3c, 0x05, 0x7c, ++ 0x05, 0x46, 0x2b, 0x7b, 0xd2, 0xcd, 0xe3, 0xcd, 0x9f, 0xc4, 0x73, 0x3c, ++ 0x28, 0xff, 0x69, 0xb3, 0x46, 0xdf, 0xf7, 0x40, 0xb9, 0x0a, 0xe9, 0x63, ++ 0xc0, 0x77, 0x2a, 0xd4, 0xef, 0x6c, 0x76, 0x51, 0xfe, 0xd1, 0x66, 0x2f, ++ 0xa5, 0x3b, 0x9a, 0x55, 0x4a, 0x1f, 0x69, 0x2e, 0xa2, 0xf2, 0xad, 0xcd, ++ 0x3e, 0xca, 0x6f, 0x86, 0xfe, 0x31, 0x7d, 0x18, 0xfa, 0xc1, 0xef, 0x1b, ++ 0x9b, 0x6b, 0x28, 0xbf, 0xa1, 0xd9, 0x4f, 0xf9, 0x87, 0x9a, 0x67, 0x51, ++ 0xfe, 0xc1, 0xe6, 0x00, 0xa5, 0x0f, 0x34, 0x2f, 0xa6, 0xef, 0x6b, 0x9b, ++ 0x1b, 0x29, 0xbf, 0xa6, 0xb9, 0x89, 0xd2, 0x1f, 0x36, 0x07, 0x29, 0x6d, ++ 0x69, 0x6e, 0xa3, 0xf2, 0xfb, 0xc5, 0x7a, 0x3f, 0x29, 0xee, 0xaf, 0x3e, ++ 0x59, 0xc9, 0xef, 0xa5, 0x47, 0xaf, 0xe3, 0xaa, 0x11, 0xba, 0x3f, 0x80, ++ 0xc7, 0x8f, 0x38, 0x07, 0xe2, 0x47, 0x56, 0x8d, 0xc0, 0xf8, 0x91, 0xae, ++ 0x5e, 0xb2, 0xc3, 0xf5, 0xf8, 0x11, 0x9c, 0x37, 0xf5, 0x67, 0xe7, 0xf3, ++ 0x8f, 0xee, 0x6f, 0xf3, 0x08, 0x6e, 0xbf, 0x8d, 0x60, 0x3d, 0x2b, 0x63, ++ 0x39, 0x3f, 0xd3, 0x39, 0x6d, 0xfe, 0x41, 0xdf, 0xaa, 0x58, 0xa0, 0xfb, ++ 0xf4, 0x46, 0xbe, 0x0e, 0xd9, 0x07, 0xfb, 0xa8, 0x3c, 0x75, 0x31, 0x5f, ++ 0x8b, 0xcd, 0x23, 0x84, 0x5f, 0xc0, 0x13, 0x64, 0x19, 0x15, 0x74, 0x5a, ++ 0x4f, 0xf5, 0xce, 0x48, 0x3d, 0x55, 0xb1, 0xfc, 0x7c, 0x9b, 0xfc, 0x19, ++ 0xcc, 0x0b, 0xf3, 0xac, 0x10, 0xef, 0x24, 0x11, 0xd9, 0x85, 0x4c, 0x08, ++ 0x97, 0x32, 0x96, 0xeb, 0x4f, 0x7d, 0x5d, 0xfb, 0xe7, 0xed, 0xe6, 0x70, ++ 0xe2, 0xfc, 0x07, 0x83, 0x77, 0x97, 0x80, 0x57, 0x2e, 0xef, 0xe2, 0xef, ++ 0x9f, 0xd4, 0xb4, 0x87, 0x91, 0xec, 0x63, 0xb4, 0x46, 0x7a, 0xff, 0xc4, ++ 0x36, 0xcb, 0x1f, 0x56, 0x20, 0xf5, 0xf8, 0x03, 0xf4, 0x1e, 0xc3, 0x88, ++ 0x0b, 0x93, 0x60, 0x73, 0x06, 0xf2, 0xe6, 0xc2, 0xb5, 0x4c, 0x85, 0x34, ++ 0x63, 0xa9, 0x71, 0xdf, 0x96, 0x36, 0xbf, 0xcc, 0xb0, 0x2f, 0x92, 0x2f, ++ 0xfc, 0x88, 0xa9, 0x20, 0x07, 0x1c, 0x25, 0xc6, 0xfd, 0x55, 0x4c, 0xde, ++ 0x32, 0x43, 0x3b, 0x5b, 0xc6, 0xf7, 0x0c, 0xe5, 0x16, 0xcf, 0x2a, 0x43, ++ 0xf9, 0xdc, 0xbb, 0xb2, 0x57, 0x7b, 0x11, 0x9f, 0xe9, 0xfc, 0x9c, 0xc7, ++ 0xba, 0x7e, 0x25, 0x4b, 0x05, 0xb8, 0x16, 0x74, 0x6c, 0x20, 0xb8, 0x7a, ++ 0xc4, 0x3c, 0xce, 0x48, 0x2a, 0xdd, 0xe3, 0x0e, 0xee, 0xd3, 0xe3, 0x1e, ++ 0xf8, 0xfe, 0xe2, 0x09, 0xa1, 0x5f, 0x98, 0x6d, 0x3d, 0xd9, 0x63, 0x85, ++ 0x6e, 0x9e, 0x2d, 0x88, 0x0f, 0x9a, 0x50, 0x3f, 0x7c, 0xf2, 0xcb, 0x78, ++ 0x92, 0x4b, 0x8f, 0x3f, 0x6a, 0x0a, 0xa1, 0x3f, 0x17, 0xc4, 0x93, 0x09, ++ 0xf9, 0xbf, 0x18, 0xcc, 0x3e, 0x2c, 0x2f, 0x65, 0xbd, 0x94, 0xc7, 0x90, ++ 0x15, 0xcc, 0x8f, 0x66, 0xaa, 0x8c, 0xf9, 0x2b, 0x58, 0x1f, 0xed, 0xaf, ++ 0x60, 0x7f, 0x71, 0x1c, 0xe9, 0xa5, 0x5e, 0x0e, 0x3c, 0x6a, 0x87, 0xfc, ++ 0xe9, 0xcc, 0xc0, 0x13, 0x3c, 0x7e, 0x2d, 0x4c, 0xfa, 0xb3, 0x40, 0xac, ++ 0x67, 0x81, 0xbe, 0x9f, 0xda, 0xa2, 0x44, 0xfb, 0x79, 0x7f, 0x3b, 0x82, ++ 0xe8, 0xd0, 0x78, 0x8f, 0xad, 0x55, 0xec, 0x2f, 0x5a, 0xed, 0xdc, 0xff, ++ 0xb6, 0xd2, 0x5d, 0x91, 0x82, 0x76, 0xeb, 0x99, 0x21, 0xe2, 0x0d, 0x9d, ++ 0xde, 0x17, 0x8f, 0xcd, 0x07, 0x7c, 0x3b, 0x53, 0x0f, 0x53, 0xaa, 0x7f, ++ 0x7f, 0x50, 0x35, 0x0d, 0x7a, 0x4f, 0xfb, 0xbd, 0x28, 0xfa, 0x1f, 0x0e, ++ 0xc4, 0x2e, 0xe8, 0xff, 0x3d, 0x84, 0xe7, 0x74, 0xf9, 0xeb, 0xc9, 0xe8, ++ 0x86, 0xaa, 0xcf, 0xeb, 0x23, 0x3e, 0x38, 0x23, 0x69, 0xde, 0x39, 0x88, ++ 0xdf, 0x97, 0x65, 0x4e, 0x8f, 0xb0, 0xe3, 0xc2, 0xf9, 0x29, 0x02, 0xbf, ++ 0xca, 0xbe, 0x4a, 0xef, 0x1c, 0xc0, 0xa3, 0xf2, 0x6a, 0xae, 0x2f, 0xc8, ++ 0x06, 0xc6, 0x79, 0xbc, 0xf9, 0x44, 0x2e, 0xc6, 0x03, 0xe8, 0xf9, 0x02, ++ 0x11, 0x2f, 0xbb, 0xb7, 0x39, 0x35, 0xaf, 0x3a, 0xe2, 0x7b, 0x5c, 0x31, ++ 0x87, 0xa7, 0x88, 0xf5, 0xd4, 0xa0, 0xbe, 0x2a, 0x2a, 0x31, 0xf9, 0x42, ++ 0xd8, 0xb1, 0xe6, 0x32, 0xf8, 0x31, 0xec, 0x79, 0xed, 0x1a, 0xbe, 0x3b, ++ 0xa0, 0x94, 0x31, 0x1f, 0x8a, 0xb9, 0xe1, 0xac, 0x7d, 0x15, 0xea, 0x6e, ++ 0xe5, 0xaf, 0x32, 0xc5, 0x3b, 0x29, 0x47, 0xae, 0x62, 0x2a, 0xec, 0x67, ++ 0x1c, 0x8e, 0x30, 0x0b, 0x96, 0x0c, 0xf4, 0xcb, 0x84, 0x3f, 0xe4, 0x1e, ++ 0x21, 0x37, 0x3f, 0x77, 0x55, 0xc7, 0xd3, 0x7b, 0x92, 0x69, 0xfd, 0xf2, ++ 0x0f, 0x75, 0x24, 0xfb, 0xdc, 0xa1, 0xf5, 0x20, 0x1d, 0x7d, 0xde, 0x61, ++ 0xe6, 0xf3, 0x3a, 0x62, 0x2c, 0x2f, 0x72, 0xf0, 0x38, 0xae, 0x85, 0x45, ++ 0x96, 0x90, 0x2a, 0xe1, 0xfb, 0x65, 0xed, 0xf4, 0x5e, 0xa2, 0xb2, 0x53, ++ 0x62, 0x19, 0xd9, 0x08, 0xc7, 0x04, 0xc2, 0x03, 0x3b, 0x10, 0x4b, 0x74, ++ 0x18, 0xbb, 0x65, 0x24, 0x0b, 0x02, 0xbf, 0x94, 0xbb, 0x03, 0xe7, 0x09, ++ 0xaf, 0x61, 0xf5, 0x80, 0x29, 0x57, 0xd0, 0x24, 0xd4, 0xab, 0x2b, 0xb6, ++ 0xec, 0x42, 0xfb, 0xac, 0x10, 0xf1, 0xe2, 0x40, 0xbc, 0xdc, 0x9a, 0x57, ++ 0x8d, 0x43, 0xe7, 0x15, 0x11, 0x7e, 0x17, 0x88, 0x79, 0xe7, 0x8a, 0x79, ++ 0xb4, 0x66, 0x46, 0xc1, 0xc3, 0x7c, 0x1a, 0xbe, 0x2b, 0xba, 0xb0, 0x43, ++ 0xf7, 0xe3, 0x18, 0xe7, 0xf9, 0x60, 0x79, 0xd5, 0x8d, 0xf8, 0xfe, 0x62, ++ 0x4b, 0x8f, 0xcc, 0xd5, 0x5a, 0x14, 0x3e, 0xd7, 0x99, 0x7b, 0x46, 0xce, ++ 0x81, 0xae, 0x4f, 0xf7, 0x02, 0x5c, 0x32, 0xc1, 0x99, 0x5b, 0x0c, 0xe3, ++ 0xc8, 0x5b, 0x2a, 0x58, 0x90, 0xf4, 0x38, 0x9f, 0x5f, 0xdd, 0xa3, 0x12, ++ 0xdb, 0x96, 0x4d, 0x72, 0xa9, 0x86, 0xf4, 0xf8, 0x18, 0x13, 0x8b, 0x3c, ++ 0xc7, 0xd4, 0xd3, 0x11, 0xc5, 0x5c, 0xfe, 0x1e, 0x18, 0xc1, 0xfd, 0x92, ++ 0x4e, 0xef, 0x31, 0xa2, 0xc7, 0x81, 0xfc, 0xd1, 0x63, 0xf3, 0x01, 0x1f, ++ 0x3f, 0x33, 0xb1, 0x22, 0x3a, 0xbf, 0x35, 0xf1, 0xfd, 0xb1, 0x1e, 0x37, ++ 0x23, 0xa3, 0x1f, 0x00, 0xd2, 0xa6, 0x62, 0xdd, 0x5f, 0xda, 0xca, 0xa6, ++ 0xa0, 0xde, 0x76, 0x9b, 0x28, 0x0e, 0x54, 0xee, 0x8c, 0xa1, 0xfb, 0xa9, ++ 0xb2, 0x5b, 0xa1, 0xf8, 0xf3, 0x56, 0x47, 0xb5, 0xeb, 0x4e, 0xec, 0xc7, ++ 0xa5, 0xd0, 0x79, 0xcd, 0x24, 0x79, 0x5c, 0x0f, 0xda, 0xd1, 0x56, 0xb7, ++ 0xe9, 0x0a, 0xb4, 0xc3, 0x8f, 0xee, 0xfa, 0x5e, 0x0f, 0xc6, 0xef, 0xc8, ++ 0x99, 0x0a, 0x43, 0xbf, 0x57, 0xab, 0x4b, 0xe1, 0x76, 0x48, 0x86, 0x89, ++ 0xe2, 0xf2, 0x14, 0x77, 0xb5, 0x0d, 0xcf, 0x77, 0x0a, 0x1c, 0x27, 0x2b, ++ 0x11, 0x9f, 0x87, 0x3b, 0xbf, 0x4b, 0xef, 0x31, 0xc8, 0xf7, 0x8a, 0xd8, ++ 0x19, 0xe1, 0x17, 0x33, 0x8b, 0x25, 0x6b, 0x65, 0x8d, 0xd4, 0x7f, 0x30, ++ 0x43, 0x11, 0xef, 0xba, 0x68, 0xb5, 0xa3, 0x93, 0xc5, 0xd1, 0x84, 0x8a, ++ 0xfb, 0xa1, 0x9a, 0x0f, 0x71, 0xbf, 0x7d, 0xd4, 0x75, 0xce, 0x8e, 0xfb, ++ 0x02, 0xd5, 0xb1, 0x90, 0xfc, 0x81, 0x77, 0x15, 0xf3, 0x7d, 0xa2, 0x19, ++ 0xcf, 0xf1, 0x20, 0xff, 0xe8, 0x8a, 0x73, 0x6e, 0x94, 0x5f, 0x2f, 0x77, ++ 0xae, 0x4e, 0xc8, 0x46, 0x7b, 0x3a, 0xa4, 0x90, 0x2d, 0x52, 0xf4, 0x65, ++ 0x4b, 0x1a, 0xbd, 0x3b, 0xd0, 0x69, 0xa1, 0x77, 0x11, 0x74, 0xbc, 0x66, ++ 0x05, 0x15, 0xc3, 0x79, 0x60, 0x66, 0x93, 0x31, 0x6f, 0x8d, 0x3a, 0x17, ++ 0x34, 0x47, 0xdd, 0x47, 0x0b, 0xe0, 0xf8, 0xc4, 0x07, 0xb3, 0x58, 0x38, ++ 0x62, 0x3e, 0x66, 0x2f, 0xdf, 0xbf, 0x31, 0x8f, 0x83, 0xf6, 0x3f, 0x77, ++ 0x01, 0x9d, 0x91, 0xff, 0x59, 0xe4, 0xe7, 0x8a, 0xfc, 0x5e, 0x73, 0x30, ++ 0xcd, 0x07, 0xf8, 0x39, 0xd2, 0xb9, 0x30, 0x0b, 0xe7, 0x75, 0xfe, 0xb9, ++ 0x00, 0xc5, 0x7f, 0x0f, 0x65, 0xff, 0x8f, 0x2e, 0x56, 0xc5, 0x78, 0x41, ++ 0xbb, 0x89, 0xde, 0xdf, 0x0d, 0xdb, 0x31, 0x1e, 0x7c, 0x77, 0x33, 0xf3, ++ 0xa1, 0x9d, 0x67, 0x0b, 0x29, 0x14, 0x8f, 0xbf, 0x47, 0xc8, 0xb3, 0x3c, ++ 0x07, 0xa7, 0xff, 0x1b, 0x4a, 0x38, 0x9d, 0x47, 0xa7, 0x79, 0xed, 0x9c, ++ 0xef, 0x94, 0x27, 0x63, 0x42, 0xb1, 0xb8, 0x6e, 0xae, 0xae, 0xb2, 0x20, ++ 0xf0, 0x79, 0xf1, 0x8b, 0x93, 0x99, 0x0a, 0x7a, 0x30, 0xcf, 0xa5, 0x99, ++ 0xd0, 0x1f, 0x9f, 0xd7, 0x64, 0xf1, 0xa1, 0xfd, 0x39, 0xe9, 0x17, 0x0e, ++ 0xa2, 0x93, 0x73, 0x0e, 0x1e, 0x4f, 0xa5, 0x34, 0x3d, 0xa0, 0xe2, 0xf7, ++ 0x96, 0x5d, 0x15, 0x45, 0x91, 0xf7, 0xec, 0x42, 0xcd, 0x2e, 0x1f, 0xca, ++ 0xa7, 0x5d, 0xcd, 0x36, 0x1f, 0xc6, 0xa8, 0x87, 0x86, 0x90, 0xaf, 0xb9, ++ 0x6e, 0x13, 0xc5, 0xb1, 0xab, 0x26, 0x1e, 0x57, 0xb9, 0x41, 0xf0, 0xe3, ++ 0x86, 0xe2, 0x58, 0x4a, 0xdb, 0x8b, 0xb9, 0x1e, 0x7a, 0x4c, 0x09, 0x4e, ++ 0x47, 0x38, 0x1f, 0x83, 0xf5, 0xc4, 0xf8, 0xf9, 0xc3, 0xeb, 0xb9, 0x7d, ++ 0xbc, 0x6c, 0xa5, 0x8d, 0xe0, 0x58, 0xf6, 0x72, 0x2e, 0xd9, 0x57, 0x43, ++ 0xe1, 0xed, 0xf1, 0x66, 0xaf, 0x2f, 0x0f, 0xe1, 0x59, 0x6f, 0x4a, 0x43, ++ 0x7f, 0x55, 0xe5, 0xda, 0xbc, 0x75, 0xf8, 0x4e, 0xc6, 0x32, 0x27, 0x7f, ++ 0x47, 0x58, 0x8e, 0x1f, 0x41, 0x7e, 0x5b, 0xf6, 0xaf, 0x66, 0x86, 0xf6, ++ 0x7c, 0x4b, 0xdc, 0xd5, 0xbe, 0x79, 0x11, 0xf2, 0x5d, 0x8e, 0x1f, 0x57, ++ 0x84, 0x74, 0x25, 0xcb, 0xc1, 0x34, 0xf4, 0xe7, 0x3c, 0xfe, 0xb3, 0xd3, ++ 0x37, 0x61, 0xdc, 0x2c, 0xac, 0xdf, 0x36, 0xcc, 0xff, 0xbc, 0xf8, 0x77, ++ 0x37, 0x61, 0x5c, 0xed, 0x5e, 0x67, 0x30, 0x0d, 0xe3, 0x6c, 0x0f, 0x14, ++ 0xbf, 0xc5, 0xf3, 0x49, 0xc1, 0x6d, 0x18, 0x67, 0x7b, 0xa8, 0xf8, 0x3f, ++ 0x79, 0x3e, 0x33, 0x98, 0x66, 0xf2, 0x61, 0x9c, 0xe0, 0xbb, 0x3c, 0x9f, ++ 0x1f, 0xdc, 0x86, 0xf9, 0xdf, 0x16, 0xff, 0x91, 0xe7, 0xf1, 0x0c, 0x0c, ++ 0x64, 0xe7, 0xef, 0x8b, 0x3f, 0xbc, 0x09, 0xe5, 0x6c, 0x8b, 0xc5, 0xb7, ++ 0x18, 0x05, 0xf2, 0xcf, 0x01, 0xfe, 0x12, 0x60, 0xb1, 0x2e, 0x91, 0x9e, ++ 0x10, 0x78, 0xd1, 0xcb, 0x9f, 0xc6, 0xef, 0xb0, 0x01, 0xdb, 0x2f, 0xd2, ++ 0xe8, 0xf2, 0x03, 0xa2, 0xdd, 0xc1, 0x21, 0xca, 0x7f, 0x25, 0xca, 0xbb, ++ 0x87, 0xe8, 0xff, 0x90, 0x68, 0x17, 0x1e, 0xa2, 0xfd, 0x11, 0xd1, 0xee, ++ 0xe8, 0x10, 0xed, 0x8f, 0x89, 0x76, 0xc7, 0x87, 0x28, 0xff, 0x8d, 0x28, ++ 0x7f, 0x65, 0x88, 0xfe, 0x7f, 0x2b, 0xda, 0xf5, 0x0c, 0xd1, 0xfe, 0x75, ++ 0xd1, 0xee, 0xcd, 0x21, 0xda, 0xff, 0x5e, 0x6f, 0x37, 0x44, 0xf9, 0xdb, ++ 0xa2, 0xfc, 0x3f, 0xa2, 0xfa, 0x7f, 0x47, 0xd4, 0xef, 0x15, 0xdf, 0x73, ++ 0x9c, 0xeb, 0xdf, 0x46, 0xff, 0x7d, 0x0e, 0xc8, 0x11, 0x94, 0x4b, 0x45, ++ 0xce, 0xf5, 0x09, 0xc8, 0xe7, 0xbb, 0xda, 0xca, 0x89, 0xfe, 0x5b, 0x2a, ++ 0xf8, 0x39, 0x95, 0x4e, 0xef, 0x39, 0x12, 0xa3, 0xf7, 0x7d, 0x27, 0x63, ++ 0xe3, 0x24, 0x4c, 0xb9, 0xfc, 0x3d, 0x27, 0xe8, 0x1c, 0xe8, 0xf0, 0x21, ++ 0xa4, 0xbb, 0x65, 0xaf, 0xca, 0x14, 0xd7, 0xd3, 0x62, 0xf2, 0x7d, 0x10, ++ 0x42, 0x39, 0xba, 0xce, 0x44, 0xf6, 0xc0, 0xb2, 0x97, 0xf9, 0x7e, 0x7d, ++ 0xd9, 0x5a, 0x25, 0x14, 0x79, 0x2f, 0x47, 0x6f, 0xaf, 0xc3, 0xbf, 0x1a, ++ 0xe1, 0x03, 0xc2, 0x6d, 0xc5, 0x14, 0xf8, 0xed, 0xa3, 0x62, 0x1e, 0xd7, ++ 0x6f, 0xf5, 0x7a, 0x7d, 0xb5, 0x11, 0xf2, 0xcc, 0xec, 0x32, 0xe6, 0x41, ++ 0x5e, 0x30, 0x94, 0xbb, 0x20, 0xbf, 0x29, 0x7e, 0xbb, 0x68, 0x6d, 0x55, ++ 0x5b, 0x11, 0xe4, 0xd3, 0x13, 0x4c, 0x64, 0x81, 0x28, 0x75, 0xb6, 0x30, ++ 0xbe, 0xd7, 0xa1, 0x38, 0x85, 0x5e, 0x70, 0x95, 0xb7, 0x17, 0x21, 0x7c, ++ 0x0e, 0x85, 0xde, 0x29, 0xd0, 0xe5, 0x3c, 0x73, 0x78, 0x0d, 0x7e, 0x8d, ++ 0x56, 0x87, 0x42, 0xef, 0xb6, 0xc9, 0x4e, 0x5e, 0x3e, 0xe9, 0x17, 0xe3, ++ 0x5c, 0x68, 0x67, 0xb5, 0xb2, 0x40, 0x8f, 0x86, 0xed, 0xbd, 0x0a, 0xd9, ++ 0xf1, 0x87, 0xdb, 0xca, 0x5c, 0x28, 0xf7, 0x2c, 0xce, 0xf9, 0x2e, 0xe4, ++ 0xdf, 0xd7, 0x4a, 0x39, 0xde, 0xab, 0xeb, 0x8b, 0x62, 0x50, 0x5e, 0xcb, ++ 0x0f, 0x9a, 0x48, 0x7e, 0x1f, 0x75, 0x71, 0x7e, 0xdf, 0xe9, 0xe5, 0xf1, ++ 0x4e, 0xa0, 0x57, 0xe8, 0x9e, 0x13, 0xc8, 0x6b, 0x1f, 0xea, 0x88, 0x42, ++ 0x16, 0x5e, 0x89, 0x72, 0x73, 0xef, 0x8f, 0x0e, 0xcc, 0xe1, 0x7e, 0x3e, ++ 0xe6, 0x1c, 0x5d, 0x41, 0xf7, 0x88, 0xf4, 0xf3, 0x6d, 0x49, 0x89, 0xd8, ++ 0x07, 0x5c, 0x5d, 0xc2, 0xf1, 0x93, 0x25, 0xf4, 0x88, 0x82, 0xfa, 0x05, ++ 0xd2, 0xc7, 0xca, 0xc5, 0xfd, 0x97, 0x20, 0xf7, 0x47, 0x65, 0x29, 0xcc, ++ 0x9b, 0x1e, 0x71, 0x8f, 0xf7, 0xea, 0x12, 0x99, 0xbf, 0x43, 0xac, 0x20, ++ 0x8e, 0xa0, 0x2f, 0xb9, 0x96, 0xde, 0xaf, 0x1a, 0xb6, 0x42, 0x31, 0x9c, ++ 0x23, 0x64, 0xdc, 0x63, 0xcc, 0x5b, 0xa2, 0xf4, 0x86, 0x12, 0xa5, 0x57, ++ 0x72, 0xdb, 0x40, 0x4e, 0x1a, 0xce, 0x4f, 0x5c, 0x86, 0xfc, 0xf0, 0x12, ++ 0xe1, 0xe7, 0xf1, 0x31, 0x1f, 0xda, 0xb1, 0x93, 0x7e, 0xb1, 0x9e, 0xe4, ++ 0xe1, 0x39, 0xd4, 0x6f, 0xd2, 0xd0, 0x72, 0xaf, 0x5f, 0xfe, 0x0a, 0x79, ++ 0xfc, 0x18, 0x22, 0x00, 0xe5, 0x68, 0x90, 0xdf, 0x23, 0x3f, 0xbc, 0xbe, ++ 0xec, 0x37, 0xb8, 0xde, 0xcb, 0xd6, 0x9a, 0xe8, 0xdd, 0xe8, 0xcb, 0x95, ++ 0xa3, 0xe7, 0x10, 0x16, 0xc0, 0x43, 0x7e, 0x40, 0x22, 0xbd, 0x00, 0x13, ++ 0x4a, 0xc3, 0x7d, 0xd3, 0xa5, 0xf0, 0x90, 0x6f, 0xf6, 0x27, 0xd0, 0xbb, ++ 0x1a, 0x97, 0xc0, 0x47, 0xfe, 0xc3, 0xe5, 0x09, 0x28, 0x6f, 0xf3, 0x03, ++ 0x0a, 0xf5, 0x7f, 0x91, 0xde, 0xb8, 0x04, 0xbe, 0x9e, 0x92, 0x7c, 0x27, ++ 0x02, 0xb8, 0x8e, 0xee, 0x18, 0x61, 0x57, 0x03, 0x01, 0xa0, 0xdf, 0x2e, ++ 0x21, 0xa6, 0x13, 0xe3, 0x8b, 0x2d, 0xc2, 0x9f, 0xa2, 0xc7, 0x0b, 0x2b, ++ 0x29, 0x0a, 0x7f, 0x17, 0x5f, 0xdc, 0x57, 0x95, 0x05, 0x1d, 0xff, 0x90, ++ 0x69, 0x6a, 0x42, 0x2e, 0xbe, 0x0b, 0xd4, 0x48, 0xfe, 0xfd, 0xe5, 0xfb, ++ 0xee, 0xf1, 0xa2, 0xdd, 0xbe, 0xc6, 0x14, 0x70, 0x61, 0xfe, 0x78, 0xc2, ++ 0x94, 0x3e, 0x1c, 0x67, 0x19, 0x6c, 0xfa, 0x11, 0x7f, 0x7b, 0xb1, 0x0f, ++ 0x7a, 0xff, 0xf2, 0xe5, 0x9b, 0xd1, 0x6f, 0xd2, 0x15, 0xb2, 0xe8, 0xef, ++ 0x57, 0x86, 0xf1, 0x9f, 0x7d, 0x18, 0x07, 0xa4, 0xbf, 0x8f, 0xe9, 0x25, ++ 0x7b, 0x4d, 0xe4, 0xaf, 0xba, 0xb9, 0x1a, 0xe6, 0xdb, 0xa5, 0xb8, 0x8a, ++ 0xd1, 0x04, 0xfd, 0x41, 0xc9, 0xb8, 0x4d, 0xe6, 0x6b, 0xa0, 0xbe, 0x85, ++ 0xf5, 0xd7, 0xc7, 0x7b, 0x77, 0x3f, 0x3b, 0x6a, 0x12, 0xfd, 0x55, 0x6d, ++ 0xaa, 0x06, 0xb9, 0xb4, 0x2f, 0x86, 0x19, 0xde, 0x07, 0xdd, 0x87, 0x7e, ++ 0x76, 0xca, 0x4f, 0xdc, 0x84, 0xef, 0x7d, 0xc2, 0x78, 0xd7, 0xcb, 0xb0, ++ 0x37, 0x6b, 0x7f, 0xf2, 0xfa, 0x4d, 0x8e, 0xab, 0x06, 0xe0, 0xf9, 0xf1, ++ 0x53, 0xd3, 0x36, 0xad, 0x24, 0x66, 0xe0, 0xfb, 0x14, 0x37, 0xe3, 0xef, ++ 0xba, 0x9f, 0x56, 0x7b, 0xe3, 0x90, 0x7d, 0x60, 0xbf, 0xd2, 0x54, 0x82, ++ 0xfb, 0xf5, 0xce, 0x93, 0xc9, 0x91, 0xfb, 0x75, 0xbd, 0x7e, 0xbc, 0xa8, ++ 0x5f, 0xdf, 0xdd, 0x57, 0xff, 0xa4, 0x4a, 0xf5, 0x7f, 0x40, 0xf5, 0x0f, ++ 0xf6, 0xc5, 0x95, 0x10, 0xbe, 0xfb, 0x2a, 0x22, 0xeb, 0xc7, 0x09, 0x3f, ++ 0x40, 0x44, 0xfd, 0xd6, 0xaf, 0xab, 0x5f, 0xa4, 0xc3, 0xf3, 0xe4, 0xeb, ++ 0x37, 0x97, 0xf0, 0xfa, 0xeb, 0x4a, 0x70, 0x3f, 0xaa, 0xf6, 0x26, 0x53, ++ 0x6c, 0x4d, 0x14, 0x3c, 0x89, 0x17, 0xf7, 0xdf, 0xfe, 0x75, 0xfd, 0x8f, ++ 0x10, 0xf5, 0x4f, 0x87, 0x5f, 0xa7, 0xfa, 0x67, 0x58, 0x6f, 0x72, 0x69, ++ 0x36, 0xb5, 0xdb, 0x8c, 0xe3, 0x9c, 0x7d, 0xe5, 0xf5, 0x0a, 0x31, 0xef, ++ 0x64, 0x3c, 0xc7, 0x79, 0xd3, 0xa1, 0x6d, 0xc1, 0xef, 0x75, 0xa5, 0x4c, ++ 0xdc, 0xc3, 0x6f, 0x54, 0xf1, 0x7b, 0x97, 0xad, 0xdd, 0x85, 0xf6, 0x9b, ++ 0xdd, 0xdc, 0xee, 0x47, 0x39, 0x9c, 0x87, 0xef, 0x7c, 0x8d, 0x1d, 0x48, ++ 0x1f, 0x41, 0xe5, 0x31, 0xe6, 0xe2, 0xef, 0xd1, 0xf4, 0xdc, 0x65, 0x63, ++ 0x89, 0xb5, 0x48, 0xaf, 0x4d, 0x26, 0xda, 0xdf, 0x1c, 0xec, 0x35, 0x3d, ++ 0x80, 0x74, 0xb9, 0x33, 0x63, 0x9c, 0x0b, 0xf7, 0xcf, 0xfb, 0x2c, 0x3d, ++ 0x65, 0x25, 0x68, 0xbf, 0x3e, 0xe3, 0x20, 0xfb, 0xd5, 0x94, 0xf5, 0x89, ++ 0x1d, 0xfd, 0xe6, 0xd6, 0x42, 0xce, 0xff, 0x76, 0x77, 0xa3, 0xaf, 0x04, ++ 0xf2, 0xf6, 0xcc, 0x12, 0x7a, 0xa7, 0x53, 0xbe, 0x6f, 0x59, 0x17, 0xbd, ++ 0x17, 0x7e, 0x3f, 0x7f, 0x47, 0x4b, 0xf9, 0x81, 0x25, 0xb0, 0x1b, 0xe9, ++ 0x2b, 0xbc, 0xac, 0x68, 0x41, 0x04, 0x7f, 0xff, 0xb8, 0xd4, 0x4c, 0xf3, ++ 0x59, 0xfb, 0x92, 0x63, 0x3d, 0xee, 0x0f, 0xd6, 0x9a, 0x7d, 0xed, 0x85, ++ 0x68, 0x87, 0x3b, 0x15, 0x8a, 0xbf, 0x54, 0x7e, 0x70, 0x60, 0x0a, 0xd9, ++ 0x87, 0x3f, 0x37, 0x31, 0x92, 0xff, 0x30, 0xcf, 0x2a, 0xe8, 0xb7, 0x75, ++ 0x8e, 0x42, 0xbf, 0xef, 0xe0, 0x9d, 0xd2, 0xb9, 0x87, 0x4a, 0x28, 0xde, ++ 0xc3, 0xef, 0xaf, 0x82, 0x7a, 0xc3, 0x92, 0x14, 0x09, 0xef, 0xe9, 0xfc, ++ 0x50, 0xf1, 0xdb, 0xf0, 0xbc, 0xc3, 0x2a, 0xec, 0xba, 0x9d, 0x3e, 0x7e, ++ 0x4f, 0x4b, 0x1f, 0xf7, 0xa4, 0xb0, 0x3f, 0x4f, 0x96, 0xf0, 0xf7, 0x37, ++ 0x77, 0x66, 0x9c, 0x7f, 0x6b, 0x11, 0xf4, 0xfb, 0x48, 0x9e, 0x85, 0xee, ++ 0x57, 0x3a, 0x96, 0x9a, 0xc2, 0x96, 0x38, 0xbc, 0x6f, 0xb6, 0xeb, 0x83, ++ 0x45, 0xb8, 0x9e, 0xb1, 0xbd, 0x6b, 0xf1, 0xbe, 0x71, 0x4c, 0x9a, 0xe2, ++ 0xc2, 0xf9, 0x3d, 0x52, 0x0b, 0x65, 0x74, 0x2e, 0xd7, 0x45, 0xdf, 0x83, ++ 0x75, 0x26, 0xda, 0x37, 0x24, 0x2e, 0x35, 0x69, 0xe8, 0x7f, 0x8c, 0xc9, ++ 0xb3, 0x18, 0xfc, 0x1d, 0x0e, 0x18, 0x27, 0xd2, 0x1f, 0xf2, 0x45, 0x69, ++ 0xe0, 0x77, 0x08, 0xf7, 0x15, 0xaf, 0x2a, 0xd7, 0x23, 0x9e, 0xbd, 0x77, ++ 0x9b, 0xe8, 0x1d, 0xd2, 0x07, 0xbd, 0x6f, 0xda, 0x4c, 0x00, 0x67, 0x5c, ++ 0xb9, 0xb1, 0xbd, 0x6b, 0x9c, 0xb1, 0x7d, 0x42, 0xb5, 0xb1, 0xdc, 0x53, ++ 0x6b, 0x2c, 0x4f, 0x9e, 0x69, 0x2c, 0xf7, 0xde, 0x6e, 0x89, 0xf2, 0xeb, ++ 0x18, 0xf3, 0xb3, 0x75, 0xba, 0x02, 0x99, 0xe0, 0x00, 0x3d, 0x15, 0xc3, ++ 0x8b, 0x58, 0x8c, 0xe3, 0x7c, 0x33, 0xee, 0x7b, 0xd6, 0xbc, 0x14, 0xc3, ++ 0x68, 0x7d, 0x56, 0x6c, 0x6a, 0x2f, 0x44, 0xfe, 0x8c, 0xed, 0x23, 0x7c, ++ 0xc5, 0x8c, 0x88, 0x21, 0xbf, 0xc0, 0x9a, 0x54, 0x0b, 0xc9, 0xf5, 0x35, ++ 0xa5, 0xdc, 0xaf, 0x7f, 0x24, 0xd3, 0x72, 0x3d, 0xe5, 0x61, 0x5e, 0x48, ++ 0x1f, 0x3b, 0x33, 0x8e, 0xd1, 0x7e, 0xe4, 0x22, 0xbc, 0x38, 0x3e, 0xf8, ++ 0x12, 0xfb, 0x77, 0xb0, 0x88, 0xef, 0xd9, 0x88, 0x1f, 0xed, 0x7c, 0x09, ++ 0xdf, 0xdf, 0x33, 0x6f, 0x05, 0xfa, 0xf1, 0x18, 0xc9, 0xc3, 0xa7, 0x24, ++ 0xcd, 0x77, 0x18, 0xf1, 0xfd, 0x1a, 0xf7, 0x57, 0xec, 0x6c, 0xe2, 0x7e, ++ 0xec, 0x07, 0x67, 0xf2, 0x78, 0x44, 0x9a, 0x41, 0x05, 0xf2, 0x3b, 0xaf, ++ 0x1f, 0x67, 0x5b, 0xdf, 0x83, 0xfb, 0xb2, 0x38, 0x47, 0xdb, 0xdd, 0x18, ++ 0x67, 0x19, 0x8d, 0xd7, 0x64, 0x71, 0xde, 0xb0, 0x13, 0x6f, 0xd9, 0x22, ++ 0xdd, 0x05, 0xf8, 0xfb, 0xcc, 0xab, 0xf5, 0xfb, 0x4e, 0xf8, 0xbd, 0x82, ++ 0x6e, 0x2f, 0xd0, 0xfb, 0x63, 0x55, 0x23, 0xf9, 0x3b, 0x78, 0x71, 0xa5, ++ 0x9c, 0x7e, 0xe2, 0xbd, 0x89, 0x25, 0xad, 0x11, 0xf7, 0x26, 0x92, 0x85, ++ 0xdf, 0xe4, 0xa1, 0x71, 0x73, 0xed, 0xa8, 0x3f, 0xf6, 0x89, 0xf7, 0x3c, ++ 0xfa, 0xfb, 0x53, 0x69, 0x50, 0x1e, 0x7a, 0x0a, 0xfc, 0x9f, 0x5a, 0xaa, ++ 0xfb, 0x31, 0x78, 0xfb, 0x4d, 0xfa, 0x39, 0x8f, 0xc8, 0x27, 0xb9, 0x79, ++ 0x7e, 0xdf, 0xd1, 0x84, 0xeb, 0x91, 0xbf, 0x36, 0xcd, 0x4c, 0x28, 0xc3, ++ 0xfd, 0xfe, 0x1a, 0x61, 0xdf, 0xc5, 0x67, 0x58, 0xb4, 0xe1, 0x30, 0xaf, ++ 0x8d, 0xc7, 0x2d, 0x41, 0x69, 0x14, 0xe4, 0x15, 0x76, 0xd4, 0x0c, 0x76, ++ 0xc1, 0xbe, 0x04, 0x3e, 0xae, 0xe5, 0xe5, 0x98, 0x20, 0xde, 0xcf, 0xdb, ++ 0xe8, 0x2d, 0xa7, 0xfb, 0x7e, 0x57, 0x0b, 0xfb, 0xe6, 0xe9, 0x4a, 0xdf, ++ 0x1b, 0xc8, 0xef, 0x7d, 0xc0, 0x47, 0x18, 0xf7, 0xb5, 0xd1, 0xe3, 0xb3, ++ 0x97, 0x89, 0x73, 0xd3, 0x20, 0xc0, 0x87, 0xa6, 0x05, 0xee, 0x53, 0x0e, ++ 0xd7, 0x96, 0xd1, 0x7e, 0x77, 0xa3, 0xe6, 0xb3, 0xa3, 0xde, 0xdc, 0x98, ++ 0xe1, 0xb3, 0x63, 0xbc, 0xb4, 0x3d, 0x55, 0x71, 0x61, 0x3c, 0x68, 0x82, ++ 0x57, 0xa1, 0xf7, 0xd8, 0x36, 0xda, 0x02, 0x2e, 0xb4, 0x7f, 0x12, 0x40, ++ 0x91, 0x5a, 0xf0, 0x3c, 0x29, 0xb3, 0x7d, 0x32, 0xdd, 0x73, 0x03, 0x5c, ++ 0x9b, 0x2a, 0xf8, 0x51, 0x03, 0x13, 0x71, 0x86, 0x18, 0xe7, 0x97, 0x28, ++ 0xf0, 0xb9, 0xd3, 0x3b, 0xdf, 0x85, 0xef, 0x23, 0x78, 0xf2, 0xf6, 0xff, ++ 0x0b, 0xfa, 0xe9, 0x13, 0xb1, 0xbf, 0x38, 0xde, 0x0e, 0xf1, 0xe4, 0x16, ++ 0x78, 0xaa, 0x2a, 0x55, 0x79, 0xdc, 0xb4, 0xe8, 0x3f, 0x71, 0xfe, 0xd3, ++ 0x54, 0x1f, 0x7f, 0x5a, 0x2b, 0x22, 0xfa, 0x13, 0xeb, 0x68, 0x99, 0xcc, ++ 0x42, 0xb8, 0x4f, 0xd3, 0xc7, 0xd7, 0xfb, 0xe9, 0xef, 0x9f, 0x69, 0x74, ++ 0x0e, 0xb0, 0xfa, 0x37, 0x1c, 0x6f, 0x2b, 0x33, 0xf9, 0x3b, 0x54, 0x96, ++ 0xbb, 0x18, 0xed, 0xe7, 0x9e, 0xae, 0x0c, 0xec, 0x45, 0x3a, 0xeb, 0x4b, ++ 0x8d, 0x21, 0x79, 0x97, 0xe6, 0x4d, 0xab, 0x42, 0x3a, 0x4a, 0x3b, 0xbe, ++ 0x6d, 0x3a, 0xde, 0x7f, 0x58, 0xfd, 0x9b, 0x18, 0x3e, 0xce, 0x02, 0x4e, ++ 0xef, 0x69, 0x0a, 0xb3, 0x5d, 0x8b, 0xf3, 0x4e, 0x0a, 0xb8, 0x10, 0x8f, ++ 0xd1, 0xfc, 0x9a, 0x7a, 0xb4, 0x7d, 0x1a, 0x12, 0xa5, 0xbe, 0x2e, 0xd1, ++ 0xfc, 0x9b, 0xaa, 0xb0, 0x36, 0x39, 0xe1, 0x62, 0x3e, 0x4e, 0xf5, 0x7a, ++ 0xaa, 0x0a, 0x46, 0x0e, 0xc2, 0xcf, 0x51, 0xfc, 0x92, 0x7a, 0xbc, 0xef, ++ 0x5e, 0xec, 0x3f, 0x9a, 0xaf, 0x77, 0xc4, 0xbe, 0x33, 0x9a, 0xeb, 0x91, ++ 0x88, 0xef, 0xf2, 0xa5, 0xf3, 0xad, 0x52, 0xef, 0x5a, 0x92, 0xc3, 0xa9, ++ 0x0a, 0xf1, 0x59, 0x66, 0xd4, 0x78, 0xf8, 0x9e, 0x1d, 0xe6, 0x25, 0x66, ++ 0x52, 0x31, 0x3e, 0xf9, 0xc7, 0xa5, 0x6e, 0xe1, 0xd7, 0x01, 0xbd, 0x54, ++ 0x8a, 0x74, 0xef, 0x9a, 0xe0, 0xe0, 0xe7, 0xed, 0x44, 0x5f, 0x55, 0xcf, ++ 0xae, 0xff, 0xf6, 0xbf, 0x42, 0xfe, 0x3c, 0xfe, 0xde, 0x1c, 0xa8, 0x95, ++ 0x7e, 0xbc, 0xbd, 0x87, 0xf4, 0xe2, 0xc1, 0x40, 0x21, 0xd6, 0xdf, 0xae, ++ 0x04, 0x1e, 0x45, 0x7f, 0xfa, 0xf6, 0x13, 0x29, 0xf4, 0x4e, 0xa4, 0x35, ++ 0x96, 0xbf, 0xf3, 0x69, 0x89, 0x7a, 0xb7, 0x44, 0xd7, 0x17, 0x3f, 0x2e, ++ 0x35, 0x0d, 0xfa, 0xbe, 0xe5, 0x37, 0x4d, 0xbb, 0x32, 0x32, 0x8a, 0x5d, ++ 0x3e, 0xec, 0xef, 0xe5, 0xdf, 0xdb, 0x92, 0xfe, 0xf1, 0xf6, 0x4f, 0xc6, ++ 0xd1, 0xae, 0x95, 0x0e, 0xe0, 0xe9, 0x6d, 0x25, 0x37, 0x6c, 0xc2, 0xf8, ++ 0x48, 0xfb, 0xab, 0xbc, 0x7c, 0x2b, 0xe4, 0x83, 0x79, 0x88, 0x97, 0xa5, ++ 0xe4, 0x77, 0x39, 0x32, 0xec, 0x4e, 0x9a, 0x7f, 0xcb, 0x5b, 0x56, 0xf2, ++ 0x67, 0x95, 0xca, 0xbe, 0x2d, 0x98, 0x67, 0x7f, 0xb0, 0x93, 0x3f, 0x6e, ++ 0xef, 0x33, 0xe3, 0x66, 0x21, 0x9f, 0xb4, 0x38, 0x2b, 0x54, 0xb4, 0xf7, ++ 0x1f, 0x13, 0x7c, 0xdc, 0x29, 0xe4, 0x47, 0xf4, 0xbc, 0x64, 0x8b, 0x2f, ++ 0x80, 0xf6, 0x40, 0xf4, 0xf7, 0x47, 0x04, 0xde, 0x40, 0xb0, 0x9d, 0xe8, ++ 0x84, 0xf5, 0x2d, 0x7d, 0xcc, 0x42, 0xef, 0x25, 0xf5, 0xc7, 0x47, 0x74, ++ 0xda, 0xf9, 0xef, 0x33, 0x13, 0x76, 0xe8, 0x7c, 0x21, 0xcf, 0xe6, 0x1f, ++ 0x58, 0x37, 0xec, 0x30, 0xc3, 0xf7, 0x30, 0xa6, 0xfd, 0xb2, 0x14, 0xc6, ++ 0x9d, 0xef, 0xac, 0x4e, 0x46, 0x78, 0xd2, 0x2f, 0x48, 0x2c, 0x00, 0xf2, ++ 0x6f, 0xbb, 0x38, 0x9f, 0x4d, 0xf7, 0x3c, 0x2d, 0xa1, 0x9c, 0xc9, 0xf0, ++ 0x1c, 0xad, 0x44, 0x79, 0x9f, 0xc9, 0x7a, 0x56, 0xa2, 0xdc, 0xc8, 0x6c, ++ 0x34, 0x9e, 0x97, 0xa5, 0x5f, 0x50, 0xa8, 0xdd, 0xbe, 0x34, 0x8d, 0xfa, ++ 0xc3, 0x1f, 0xbc, 0xe7, 0x6c, 0x61, 0x82, 0xa7, 0x13, 0x02, 0x6c, 0x25, ++ 0xca, 0xf9, 0x34, 0x7e, 0xde, 0x62, 0x71, 0xc5, 0xf0, 0xfb, 0xe9, 0xde, ++ 0x6a, 0xc3, 0x7d, 0x66, 0xfd, 0x1d, 0xd9, 0xb0, 0xc0, 0x87, 0x05, 0x6c, ++ 0x4a, 0x73, 0x19, 0xa4, 0x0e, 0x85, 0xdf, 0x9f, 0x8f, 0xaa, 0xff, 0x92, ++ 0xa8, 0x27, 0xa3, 0xdf, 0x1e, 0x9d, 0xff, 0xae, 0x63, 0x27, 0xa8, 0x5f, ++ 0x87, 0xf2, 0x49, 0xe4, 0xbb, 0x2c, 0xb8, 0x2f, 0x25, 0xa1, 0xb5, 0x94, ++ 0x9f, 0x7f, 0x02, 0x9e, 0x82, 0xb8, 0x0f, 0x65, 0xf1, 0x09, 0xfc, 0xbc, ++ 0x54, 0xd3, 0xd4, 0xc8, 0xb8, 0xd6, 0x74, 0x90, 0xbb, 0xd6, 0x32, 0x8c, ++ 0x3f, 0x09, 0x52, 0x9c, 0x48, 0xaa, 0xb8, 0x9f, 0xa0, 0xc7, 0xf5, 0x00, ++ 0x06, 0xdc, 0xe8, 0x77, 0xd3, 0xe3, 0x3e, 0x76, 0x31, 0xa3, 0x3d, 0xa2, ++ 0xa7, 0xfa, 0xfe, 0x3c, 0xaf, 0x49, 0xa6, 0x7d, 0x47, 0xf1, 0x8b, 0x76, ++ 0xbe, 0x3f, 0x68, 0x63, 0x21, 0xbb, 0x84, 0xfe, 0x30, 0x46, 0x72, 0x27, ++ 0x6f, 0x3d, 0x3f, 0x9f, 0xd6, 0xfd, 0x62, 0x93, 0x91, 0x99, 0x92, 0x10, ++ 0x14, 0x97, 0x89, 0xc7, 0xff, 0x74, 0x51, 0x3c, 0xb3, 0x6e, 0x57, 0xc1, ++ 0xfa, 0x92, 0xdc, 0x59, 0x1b, 0xf5, 0xde, 0x93, 0xfe, 0x5e, 0x75, 0x5f, ++ 0x29, 0x1f, 0x77, 0x7b, 0xb3, 0x8b, 0xd6, 0x51, 0x2f, 0xcf, 0x08, 0x44, ++ 0xaf, 0xa3, 0xf1, 0x9c, 0x53, 0xaf, 0x97, 0x7e, 0x21, 0x9d, 0x05, 0x12, ++ 0x23, 0xfb, 0x0d, 0x51, 0xbf, 0xe9, 0x4d, 0xfb, 0x89, 0x1e, 0xd2, 0x2f, ++ 0x0c, 0xa3, 0xf2, 0xed, 0xcd, 0xea, 0x25, 0xfa, 0xcf, 0x19, 0xa2, 0xff, ++ 0x54, 0xa2, 0x97, 0xa1, 0xfb, 0xcf, 0xa0, 0xf2, 0x1d, 0xe1, 0x37, 0xdd, ++ 0x53, 0x01, 0x15, 0x8f, 0xf4, 0xed, 0x77, 0xfb, 0x55, 0x94, 0x2b, 0xe1, ++ 0xc9, 0xbe, 0x41, 0xf0, 0x9c, 0x7e, 0x8f, 0x51, 0x4e, 0x8e, 0x3a, 0x68, ++ 0x94, 0xbb, 0x3a, 0x5e, 0xb6, 0x2b, 0x9a, 0x67, 0x1a, 0xe0, 0x7b, 0xfb, ++ 0x3d, 0x26, 0x5f, 0x27, 0xc3, 0xf8, 0x53, 0x63, 0xbd, 0x9a, 0xec, 0xdf, ++ 0xb9, 0xf9, 0xfb, 0xd1, 0x7a, 0xfd, 0xb0, 0x67, 0x06, 0xd6, 0x5f, 0xca, ++ 0xeb, 0x7f, 0xeb, 0x03, 0x63, 0x7d, 0x7f, 0xe5, 0x33, 0xd1, 0xf5, 0x09, ++ 0xbe, 0xf1, 0x17, 0x8c, 0xf5, 0xa2, 0xd7, 0x27, 0x1a, 0x5e, 0x80, 0x2b, ++ 0xe9, 0xa6, 0x08, 0xb8, 0x26, 0xd8, 0x8c, 0xbf, 0x3f, 0x6e, 0xd6, 0x9c, ++ 0x8b, 0xe0, 0x4a, 0xba, 0x25, 0x02, 0xae, 0xeb, 0xbc, 0xc6, 0xfa, 0x81, ++ 0x95, 0x83, 0xc3, 0x75, 0x7d, 0x91, 0xf5, 0x6b, 0xe1, 0xd2, 0xeb, 0xdd, ++ 0x38, 0xf6, 0xf2, 0xea, 0x45, 0xcf, 0x63, 0x46, 0x8d, 0x75, 0x08, 0xbc, ++ 0xf3, 0xfa, 0xb7, 0xcc, 0xba, 0xbc, 0x7e, 0x6f, 0x5b, 0xfc, 0xf5, 0xf5, ++ 0xee, 0x68, 0x8a, 0x1e, 0x27, 0xa8, 0xc7, 0x6d, 0x1b, 0xec, 0x91, 0xc4, ++ 0x26, 0x6e, 0xbf, 0xbb, 0x58, 0x1f, 0xc5, 0x99, 0xe8, 0x76, 0x47, 0x02, ++ 0x73, 0x89, 0xf8, 0x2f, 0x6e, 0x37, 0xbc, 0x81, 0xff, 0x4d, 0x65, 0xec, ++ 0xbe, 0x91, 0xfe, 0xda, 0x91, 0x63, 0x10, 0xff, 0xda, 0xed, 0x0f, 0xab, ++ 0x78, 0x4f, 0x85, 0xeb, 0x2b, 0x56, 0xcb, 0xdf, 0x87, 0x84, 0x7d, 0x49, ++ 0x69, 0xe4, 0xfb, 0xd7, 0x03, 0x70, 0xad, 0x22, 0xb8, 0x9e, 0xc7, 0x78, ++ 0x27, 0xd2, 0xb3, 0x36, 0x1f, 0xda, 0x9d, 0xc5, 0xe9, 0xcc, 0x96, 0x8a, ++ 0xc6, 0x97, 0x37, 0x94, 0x83, 0xef, 0x80, 0xdd, 0x36, 0x52, 0x97, 0xd7, ++ 0x3c, 0xbe, 0x7c, 0x84, 0xc0, 0xdd, 0x53, 0x69, 0x5d, 0xcb, 0xdc, 0xc4, ++ 0xe7, 0xa1, 0x04, 0x84, 0xe7, 0x9b, 0x8e, 0xbb, 0x68, 0xa4, 0x36, 0x77, ++ 0x64, 0xd2, 0x40, 0xfd, 0xa1, 0xfc, 0x2d, 0x3a, 0x9e, 0x2c, 0x96, 0x2e, ++ 0xfa, 0xfd, 0x09, 0x7d, 0x75, 0x0e, 0x1f, 0xea, 0x87, 0x37, 0xb1, 0x08, ++ 0xda, 0x3d, 0x76, 0xb3, 0x35, 0x8c, 0x76, 0xb5, 0x1e, 0x87, 0x7a, 0x22, ++ 0x76, 0xf6, 0xb1, 0x24, 0x95, 0xde, 0x1f, 0x68, 0xc4, 0xfe, 0x67, 0xdd, ++ 0x32, 0x79, 0x35, 0xe6, 0xa5, 0x23, 0x89, 0xea, 0x32, 0x07, 0xde, 0x5f, ++ 0xea, 0xd5, 0xef, 0x79, 0xde, 0x83, 0x78, 0x5b, 0x6a, 0x0b, 0x64, 0x25, ++ 0x9b, 0xe8, 0x7c, 0xb5, 0x10, 0xf7, 0xc3, 0xcc, 0x9f, 0x28, 0x2e, 0x05, ++ 0xfb, 0x4b, 0x07, 0x8b, 0xd3, 0xd0, 0xe1, 0xa9, 0x96, 0x38, 0xfe, 0x63, ++ 0x32, 0x02, 0xf7, 0xe3, 0x38, 0xd5, 0xa6, 0x9e, 0x9d, 0x7e, 0xfc, 0xa6, ++ 0xf4, 0xf0, 0x7d, 0xb6, 0x2b, 0x89, 0xbf, 0x7f, 0x84, 0xef, 0xdc, 0x0c, ++ 0xc2, 0xff, 0x3a, 0x1e, 0xaa, 0x44, 0x3f, 0x87, 0xcd, 0xbe, 0x2f, 0xfa, ++ 0x60, 0x7e, 0x87, 0x37, 0xc4, 0xd3, 0x7d, 0xf8, 0xf9, 0x89, 0xb7, 0xcc, ++ 0xc6, 0xb7, 0x51, 0x16, 0x98, 0xfc, 0xc9, 0x78, 0x80, 0x1e, 0x01, 0xf7, ++ 0x03, 0x04, 0xb7, 0x63, 0x4e, 0x56, 0x2a, 0xc2, 0x6d, 0x16, 0x70, 0xdb, ++ 0x92, 0x04, 0xde, 0xb5, 0xbc, 0xaf, 0x83, 0xbb, 0x3f, 0x5e, 0xe6, 0x7e, ++ 0x49, 0x7f, 0xa7, 0x9c, 0xf2, 0xcf, 0x06, 0xdd, 0x74, 0xef, 0xdc, 0x6a, ++ 0xfa, 0xec, 0xcd, 0x19, 0x1e, 0x92, 0xc7, 0x3e, 0xb4, 0x3b, 0xb7, 0x83, ++ 0x7d, 0x81, 0xef, 0xac, 0xfd, 0x9b, 0xc0, 0xf7, 0x0e, 0x3c, 0x63, 0x49, ++ 0xa0, 0xef, 0xf4, 0xfe, 0x9a, 0x57, 0xdc, 0xbf, 0xf2, 0x6e, 0x32, 0xd1, ++ 0x7b, 0x2b, 0xfe, 0xaa, 0xe7, 0x68, 0x9d, 0x1e, 0xab, 0x77, 0xf8, 0x70, ++ 0xdf, 0x3e, 0x87, 0xa9, 0xf4, 0xbe, 0xe9, 0x3c, 0x71, 0x1f, 0xe5, 0x8f, ++ 0x95, 0xff, 0xf3, 0x42, 0x2f, 0xcc, 0xef, 0x27, 0x23, 0x03, 0xbb, 0x11, ++ 0x6f, 0x77, 0x24, 0x9a, 0x86, 0xbd, 0x49, 0x70, 0x04, 0x8a, 0xe9, 0x3d, ++ 0xab, 0x71, 0x97, 0x17, 0x3f, 0xab, 0x9f, 0xc3, 0x4f, 0x17, 0xf6, 0xc1, ++ 0x02, 0x81, 0xc7, 0x19, 0x4c, 0xa3, 0xb8, 0xdd, 0x9b, 0x58, 0xc0, 0x8c, ++ 0xe3, 0xbe, 0x7e, 0xc6, 0xa2, 0xa1, 0x5d, 0xfa, 0xba, 0x88, 0x47, 0xbe, ++ 0x85, 0x05, 0xe9, 0xfb, 0xad, 0x2c, 0x44, 0xe9, 0x6d, 0x2c, 0x4c, 0xf5, ++ 0xbf, 0x83, 0x2f, 0xb7, 0x42, 0xfe, 0xb5, 0xd8, 0x91, 0x99, 0x4d, 0x00, ++ 0xdf, 0xb4, 0xcd, 0x85, 0xf9, 0xc8, 0x8f, 0x11, 0x78, 0xff, 0x15, 0xc2, ++ 0x0b, 0xf4, 0x72, 0x87, 0x87, 0xd3, 0xcb, 0x9f, 0x52, 0x10, 0xef, 0x1d, ++ 0x49, 0x97, 0x45, 0xbf, 0xd3, 0x24, 0x8e, 0xbf, 0xfb, 0x46, 0x06, 0x5e, ++ 0xc4, 0x7e, 0x26, 0xd8, 0x54, 0x8f, 0x0f, 0x61, 0x72, 0x4d, 0xc8, 0x40, ++ 0x3f, 0x4a, 0x3f, 0xff, 0x54, 0x27, 0x71, 0xfa, 0x53, 0x5c, 0xf9, 0x5f, ++ 0xc7, 0x3f, 0x3d, 0xe7, 0xf4, 0x7b, 0xf7, 0x9a, 0x23, 0xb5, 0x02, 0xdf, ++ 0xdd, 0xe2, 0x3f, 0xd7, 0x69, 0x77, 0x51, 0xbc, 0x38, 0xc6, 0xe5, 0x7b, ++ 0x60, 0x1d, 0x7a, 0x54, 0x7e, 0xdf, 0x10, 0xc4, 0x86, 0x33, 0x08, 0xeb, ++ 0x54, 0x53, 0x29, 0x53, 0xdc, 0xde, 0x9a, 0x4f, 0xc5, 0x3d, 0x69, 0x74, ++ 0x62, 0x40, 0xbd, 0x5f, 0x8f, 0x96, 0xe9, 0x9d, 0x30, 0xfd, 0x5c, 0x72, ++ 0xaa, 0xe8, 0x6f, 0x6a, 0x06, 0xbf, 0x37, 0x58, 0x5b, 0x39, 0xa3, 0x35, ++ 0x1e, 0xf0, 0x32, 0xe9, 0x8b, 0xde, 0xf2, 0x30, 0xa4, 0x35, 0x19, 0xc6, ++ 0x7b, 0x84, 0x93, 0x3d, 0x9d, 0xf4, 0x74, 0xf8, 0x94, 0x3c, 0xe3, 0xf7, ++ 0xeb, 0x59, 0x3b, 0x1d, 0x10, 0xd7, 0x96, 0x18, 0xe3, 0xcc, 0xa7, 0x46, ++ 0xf9, 0x3f, 0x0f, 0xe3, 0xd8, 0x40, 0x57, 0xa7, 0x46, 0x8a, 0x78, 0xc9, ++ 0x11, 0x6c, 0x44, 0xe4, 0x7d, 0x83, 0x1b, 0x45, 0xdb, 0x73, 0xb5, 0x9f, ++ 0x59, 0xce, 0xc2, 0xf8, 0x69, 0xa3, 0x02, 0xa7, 0x91, 0x0f, 0x96, 0xdd, ++ 0xf0, 0xc7, 0xd9, 0xb4, 0xaf, 0x53, 0xd8, 0xab, 0x57, 0xc0, 0xfc, 0xea, ++ 0x7f, 0x2b, 0x93, 0x3d, 0xf9, 0x5e, 0x33, 0xcc, 0xa4, 0x10, 0xe3, 0xaa, ++ 0x6d, 0x4c, 0x03, 0x83, 0xff, 0x14, 0xd8, 0x15, 0x98, 0xff, 0xa0, 0xd9, ++ 0x4b, 0xe9, 0x47, 0x60, 0x07, 0x60, 0xfa, 0x49, 0x73, 0x11, 0x95, 0x9f, ++ 0x69, 0xf6, 0x51, 0xbe, 0x6a, 0x94, 0xff, 0x3c, 0xae, 0xcf, 0xdc, 0xb6, ++ 0x4f, 0x15, 0xd4, 0x47, 0x6b, 0xf4, 0x78, 0x6c, 0x01, 0x87, 0x1e, 0x57, ++ 0xb8, 0x46, 0xc4, 0x4f, 0x2c, 0x77, 0x2e, 0x3b, 0x81, 0xf1, 0x0b, 0xcb, ++ 0x29, 0xe0, 0x9d, 0x01, 0xb3, 0xb7, 0x4f, 0x42, 0xf0, 0xef, 0x3c, 0xd8, ++ 0x75, 0x0c, 0x53, 0xf8, 0x2e, 0xe3, 0x3e, 0x64, 0xf9, 0x06, 0x89, 0xfc, ++ 0x3a, 0x0b, 0x8e, 0x06, 0x56, 0xe3, 0x32, 0x2f, 0x7a, 0xa5, 0x77, 0x2a, ++ 0x8a, 0x89, 0x31, 0xbf, 0x3b, 0x99, 0x8c, 0xfb, 0xf4, 0x3a, 0xb4, 0x63, ++ 0x81, 0xf4, 0x97, 0x27, 0x68, 0xe6, 0x51, 0x30, 0xbe, 0xd6, 0xfd, 0xee, ++ 0xb1, 0x44, 0xa8, 0xff, 0xa7, 0xe6, 0xb1, 0x04, 0xdf, 0x87, 0xcd, 0x1a, ++ 0xc1, 0xf7, 0x71, 0x73, 0x0d, 0xa5, 0xb7, 0x8d, 0xf2, 0xc7, 0x8e, 0x1a, ++ 0x83, 0xab, 0xf5, 0x29, 0xbd, 0xb7, 0x74, 0xc3, 0x93, 0xef, 0x2a, 0xf8, ++ 0x7b, 0xd0, 0x26, 0x6a, 0x12, 0xf9, 0xef, 0xaf, 0xd5, 0x58, 0x28, 0x04, ++ 0x78, 0xdd, 0x62, 0xe6, 0xf2, 0x7d, 0x0b, 0xc8, 0x77, 0xe4, 0xcf, 0xca, ++ 0xd2, 0xe9, 0x3b, 0xee, 0xc1, 0xf1, 0x47, 0x06, 0x92, 0x70, 0x9c, 0x9b, ++ 0x12, 0xe6, 0x4d, 0x4c, 0x84, 0xef, 0x53, 0xc7, 0xce, 0x51, 0xb0, 0xde, ++ 0x2d, 0x5f, 0x80, 0x0e, 0xca, 0x1e, 0xa0, 0xc3, 0x4b, 0xd1, 0xf5, 0xe9, ++ 0x43, 0x12, 0xe1, 0xe7, 0xf4, 0x21, 0x37, 0xe1, 0x43, 0xc7, 0x53, 0x9d, ++ 0x58, 0xaf, 0xd3, 0x07, 0x8a, 0x6f, 0xc4, 0xf7, 0xc7, 0x0e, 0x1d, 0x97, ++ 0x29, 0xfe, 0xf4, 0xdc, 0x05, 0x13, 0xc1, 0x77, 0xee, 0x44, 0x0c, 0xc5, ++ 0xa7, 0x46, 0xb7, 0x5f, 0xf6, 0x4c, 0x6e, 0x0a, 0xda, 0x63, 0x1f, 0xc3, ++ 0xfa, 0xe1, 0xc1, 0xc7, 0xb2, 0x67, 0x8a, 0xc9, 0x1f, 0xff, 0xf1, 0x53, ++ 0xff, 0xa2, 0x46, 0xc6, 0xfd, 0x7e, 0x9c, 0xd0, 0x75, 0xfe, 0x6d, 0x94, ++ 0x53, 0xff, 0xc9, 0xe5, 0x14, 0xd8, 0x9b, 0xa7, 0xb6, 0xa1, 0x1c, 0xcb, ++ 0x48, 0xa3, 0x77, 0x74, 0xfa, 0xe3, 0xd5, 0x58, 0x63, 0x2c, 0xea, 0xb1, ++ 0x7a, 0x8b, 0xe0, 0x2f, 0x90, 0x33, 0x98, 0xff, 0x38, 0x86, 0xef, 0x83, ++ 0x2b, 0x7e, 0x9e, 0x5e, 0x85, 0xfc, 0x82, 0xe3, 0x61, 0xbc, 0x97, 0x55, ++ 0xfc, 0xbe, 0x09, 0xe8, 0xef, 0x9d, 0xef, 0x41, 0x7f, 0x07, 0xb6, 0x79, ++ 0xe9, 0xdd, 0x9d, 0x4f, 0xf6, 0x6d, 0xce, 0xc1, 0xf1, 0xf7, 0x76, 0x2d, ++ 0x78, 0x7b, 0x1b, 0xf4, 0x7f, 0x3a, 0xc4, 0x7f, 0xdf, 0xc4, 0x69, 0xd6, ++ 0x75, 0xe6, 0x57, 0x28, 0x4f, 0x77, 0x3b, 0xc8, 0x6f, 0xb9, 0x46, 0x02, ++ 0xb8, 0x50, 0x9f, 0xee, 0x49, 0xa3, 0x7c, 0x91, 0xa4, 0xc4, 0x34, 0x91, ++ 0x33, 0x23, 0xc4, 0xe3, 0x50, 0x24, 0x55, 0xc1, 0x77, 0xc8, 0x96, 0x3e, ++ 0xbd, 0x35, 0x0d, 0xe9, 0x0b, 0xef, 0x8b, 0x63, 0x5c, 0xfd, 0xf3, 0x1b, ++ 0x62, 0x49, 0x4e, 0x3d, 0x6f, 0xf6, 0xbd, 0xd3, 0x84, 0xfd, 0xed, 0xe0, ++ 0xfd, 0x3d, 0xf1, 0xa3, 0xfb, 0xde, 0x3b, 0x88, 0xe9, 0x83, 0x75, 0x65, ++ 0xf7, 0x41, 0x3a, 0x63, 0x14, 0x8f, 0x63, 0x9c, 0xff, 0xe3, 0x25, 0x23, ++ 0xb0, 0x3d, 0xe8, 0x6b, 0xfa, 0xbd, 0xca, 0x3f, 0x7b, 0x56, 0x0a, 0xa3, ++ 0x1f, 0xa4, 0xb4, 0xe3, 0xf0, 0x2a, 0x8c, 0x63, 0x1a, 0xb5, 0xfd, 0x5d, ++ 0x53, 0x1a, 0xa4, 0xa3, 0x77, 0x4b, 0x2d, 0x98, 0x16, 0x67, 0x4e, 0x39, ++ 0x8e, 0xfe, 0x83, 0x5b, 0x47, 0xa9, 0x04, 0xc7, 0x15, 0x4f, 0x66, 0xcb, ++ 0x18, 0x9b, 0x3e, 0x22, 0x2d, 0xf4, 0xf6, 0x78, 0x1e, 0x37, 0x62, 0xd0, ++ 0xef, 0x25, 0x1d, 0x9f, 0x56, 0xe1, 0x36, 0x53, 0xd7, 0xf3, 0x23, 0xa4, ++ 0xae, 0x8f, 0x3a, 0x71, 0x5f, 0x3c, 0xec, 0x44, 0x19, 0xbf, 0xdf, 0xc5, ++ 0xdf, 0x89, 0x7e, 0xa6, 0x7b, 0xc6, 0x1b, 0xb7, 0x31, 0x9c, 0x07, 0x58, ++ 0x10, 0x08, 0xf7, 0x1c, 0x0b, 0xc5, 0x5d, 0xb0, 0x50, 0xb0, 0x13, 0xd7, ++ 0xf9, 0x74, 0xa0, 0xc8, 0x47, 0xef, 0x9b, 0xf8, 0x83, 0x5b, 0x91, 0xbe, ++ 0x4e, 0x07, 0x92, 0xe9, 0x3d, 0xe9, 0x03, 0xa6, 0x60, 0x1c, 0xfe, 0xbe, ++ 0xa4, 0xe0, 0x3b, 0xfc, 0xf7, 0xfa, 0x3c, 0xbb, 0xfb, 0xb5, 0x38, 0x8c, ++ 0xa7, 0x88, 0xdf, 0x6f, 0x66, 0xf8, 0xfb, 0xa7, 0xeb, 0x46, 0xf7, 0x4d, ++ 0xa2, 0xf8, 0x90, 0x4c, 0x95, 0xf6, 0xe3, 0x99, 0x3b, 0xaf, 0xab, 0x41, ++ 0xfc, 0xd4, 0xef, 0x7f, 0xa6, 0x93, 0xfa, 0x59, 0x6a, 0xf3, 0xa1, 0x3f, ++ 0x76, 0xf1, 0x33, 0x9f, 0xd1, 0xbd, 0x17, 0x36, 0x99, 0xc7, 0xa1, 0x9e, ++ 0xde, 0xcf, 0xf3, 0x0f, 0x54, 0x6b, 0xf4, 0xae, 0xf8, 0xe2, 0xce, 0x3f, ++ 0xf3, 0x7c, 0x8f, 0x9f, 0xf2, 0x7e, 0x39, 0x98, 0x4d, 0xf7, 0x27, 0xe6, ++ 0x71, 0x7b, 0x67, 0xb3, 0xd0, 0x67, 0xac, 0x77, 0x24, 0x8b, 0x7c, 0x97, ++ 0x48, 0x5f, 0xaf, 0x07, 0xa0, 0x18, 0xcb, 0xb7, 0x64, 0x07, 0x53, 0xf1, ++ 0xfd, 0x29, 0x5d, 0x0f, 0x82, 0xfe, 0x5a, 0x81, 0xfc, 0x87, 0x6e, 0x47, ++ 0x6a, 0xef, 0x9a, 0xc1, 0xef, 0xab, 0x5f, 0xa6, 0xfe, 0xb2, 0x08, 0x7d, ++ 0xa4, 0xf7, 0xb7, 0xd9, 0xc2, 0xdf, 0xcb, 0x45, 0x31, 0x82, 0xbf, 0x7f, ++ 0x66, 0xbb, 0x85, 0xeb, 0xdd, 0x3d, 0x20, 0x6f, 0x90, 0x5e, 0x74, 0xbd, ++ 0x0b, 0xe3, 0xae, 0xc7, 0x71, 0x2d, 0xe2, 0xbe, 0x4c, 0x3a, 0x28, 0xd9, ++ 0xd1, 0x30, 0x9f, 0xf4, 0xcd, 0x56, 0x2e, 0xbf, 0x2f, 0x73, 0xfc, 0xe8, ++ 0x7b, 0xa5, 0xba, 0x1d, 0x32, 0x2b, 0xb1, 0x85, 0xee, 0x8f, 0x7e, 0x92, ++ 0x1e, 0xd8, 0x82, 0xf2, 0x41, 0xbf, 0x47, 0xca, 0x14, 0x1f, 0xbd, 0xef, ++ 0xf7, 0x87, 0x74, 0x6d, 0xeb, 0xa8, 0x31, 0xfc, 0xdd, 0x0c, 0x9c, 0x03, ++ 0xe8, 0xc5, 0x1d, 0x98, 0xaf, 0x97, 0xc1, 0x8e, 0xca, 0x8d, 0xb0, 0xa3, ++ 0x6c, 0x97, 0xa7, 0x17, 0xff, 0x9a, 0xae, 0x3d, 0x86, 0xe3, 0x5c, 0x6e, ++ 0xfd, 0x68, 0x39, 0x3c, 0x4e, 0xc0, 0xbf, 0xdc, 0x69, 0x22, 0x3c, 0x2c, ++ 0x7f, 0xd8, 0x4a, 0xfe, 0xb0, 0x71, 0xe2, 0x7e, 0xe9, 0xb8, 0x73, 0x27, ++ 0x62, 0x51, 0x9e, 0x2c, 0xff, 0x73, 0x19, 0xc9, 0x95, 0x16, 0xc6, 0x06, ++ 0xc5, 0xcf, 0x0b, 0xcd, 0x3c, 0xce, 0xfb, 0xff, 0xa0, 0x1f, 0x01, 0xd2, ++ 0x6b, 0x3e, 0xef, 0x95, 0x69, 0x3f, 0x72, 0xd4, 0xb4, 0xf4, 0x18, 0xe8, ++ 0x57, 0x02, 0x81, 0xfc, 0x87, 0x7d, 0x2d, 0xf1, 0xe5, 0x94, 0xd7, 0x70, ++ 0xb9, 0xaf, 0xfd, 0xdc, 0x34, 0xe8, 0x7e, 0x51, 0x4f, 0x61, 0xbd, 0x8e, ++ 0x90, 0x9c, 0xfe, 0xc2, 0xe8, 0x7f, 0x18, 0xff, 0x85, 0x8b, 0x7e, 0x3f, ++ 0x25, 0x73, 0x24, 0x5c, 0xd6, 0xbc, 0x07, 0xde, 0xd9, 0x31, 0xce, 0x5f, ++ 0x7f, 0xef, 0x0a, 0xe6, 0xd7, 0x8b, 0xfa, 0x7d, 0xf9, 0xa7, 0x26, 0xa2, ++ 0xdf, 0xe5, 0x9f, 0x96, 0x91, 0xdc, 0xec, 0xbe, 0xcc, 0xf9, 0xda, 0x3d, ++ 0xda, 0x9b, 0x08, 0x67, 0xf4, 0x7c, 0x00, 0xfe, 0xb7, 0x07, 0x83, 0xbf, ++ 0x9f, 0xde, 0xfb, 0x2e, 0x0f, 0xfe, 0x7b, 0x25, 0x46, 0xbf, 0xd7, 0x07, ++ 0xd4, 0x15, 0xf9, 0xb7, 0xbb, 0xc5, 0x7b, 0x02, 0xdd, 0x4b, 0x4a, 0xe8, ++ 0x5d, 0x8b, 0x03, 0xf8, 0x2e, 0x08, 0xca, 0xcd, 0xe9, 0xfc, 0xde, 0x51, ++ 0x37, 0xf6, 0x0d, 0xf5, 0xbb, 0x93, 0x5c, 0xf4, 0xee, 0xc6, 0xf3, 0x66, ++ 0x9e, 0x0f, 0xde, 0x2a, 0xda, 0x8b, 0x77, 0x1a, 0xbb, 0x6f, 0x4d, 0xe3, ++ 0xef, 0x66, 0x58, 0x1b, 0xff, 0xb5, 0x14, 0xfb, 0x6f, 0xe1, 0xf1, 0x71, ++ 0xdd, 0xe6, 0x10, 0xfd, 0x3e, 0xd8, 0xee, 0xfb, 0x13, 0xe9, 0x3e, 0x81, ++ 0x1e, 0x3f, 0x7e, 0x42, 0xc8, 0xed, 0x16, 0x29, 0x7c, 0x1b, 0xbd, 0x07, ++ 0xf2, 0xa9, 0x85, 0xf1, 0x77, 0xf5, 0xc2, 0xe9, 0x0d, 0xe5, 0xf8, 0x0e, ++ 0xc8, 0x08, 0xaa, 0x7f, 0x42, 0xfc, 0xfe, 0xe4, 0xcb, 0x7d, 0x57, 0xef, ++ 0xdb, 0x62, 0x7d, 0x3a, 0x3a, 0x43, 0x7b, 0x36, 0x79, 0xf0, 0x7b, 0x11, ++ 0xf5, 0x13, 0xfd, 0x9e, 0xde, 0xff, 0x03, 0xfe, 0x22, 0x86, 0x1a, 0x00, ++ 0x80, 0x00, 0x00, 0x00, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x0b, 0xed, 0x7d, 0x0b, 0x74, 0x94, 0xd5, 0xb5, 0xf0, 0xf9, 0xe6, ++ 0x9b, 0x99, 0xcc, 0x24, 0x93, 0x64, 0x12, 0x20, 0x0f, 0x42, 0xc2, 0x24, ++ 0x84, 0x10, 0x20, 0xe0, 0xe4, 0xc9, 0x2b, 0x09, 0x03, 0x24, 0x14, 0x15, ++ 0x6d, 0x00, 0x41, 0x1e, 0x21, 0x4e, 0x1e, 0x40, 0xc8, 0x8b, 0x80, 0x7a, ++ 0x9b, 0x2a, 0x6d, 0x06, 0x13, 0x10, 0x2d, 0xd6, 0x70, 0x8d, 0x88, 0x16, ++ 0x75, 0x40, 0xa0, 0xa0, 0xd1, 0x3b, 0x28, 0x28, 0x68, 0xb4, 0x03, 0x28, ++ 0xd2, 0xfa, 0xca, 0xd5, 0x6a, 0x6d, 0xb5, 0x98, 0x00, 0x22, 0xf2, 0x4a, ++ 0x0c, 0xea, 0xc5, 0x5e, 0xff, 0xdb, 0x7f, 0xef, 0x7d, 0xce, 0xc9, 0xcc, ++ 0x37, 0x24, 0x6a, 0x7b, 0xaf, 0x6b, 0xfd, 0x77, 0xad, 0x3f, 0x5d, 0xf5, ++ 0x70, 0xbe, 0xf3, 0xde, 0x7b, 0x9f, 0x7d, 0xf6, 0xd9, 0x8f, 0x33, 0x7f, ++ 0x31, 0xb0, 0x85, 0x9e, 0x34, 0xc6, 0xfe, 0xcc, 0xe0, 0x2f, 0x96, 0xb1, ++ 0x47, 0x0d, 0xcc, 0x65, 0x8e, 0x64, 0x6c, 0x94, 0xbd, 0x6c, 0x90, 0x3d, ++ 0x9b, 0x31, 0xe7, 0x8d, 0x21, 0x7a, 0x16, 0x8e, 0x85, 0x8e, 0x58, 0x25, ++ 0x8b, 0xb1, 0x47, 0x2a, 0x46, 0xb2, 0x7b, 0x15, 0xc8, 0xb6, 0x3c, 0xc4, ++ 0x58, 0x14, 0x63, 0x0b, 0x4d, 0x8c, 0xfe, 0x16, 0x07, 0x87, 0x8d, 0x67, ++ 0xd7, 0xd0, 0x3f, 0x1d, 0xa6, 0x1c, 0xc6, 0xe6, 0xf3, 0xcf, 0x6c, 0xd1, ++ 0xb2, 0x5d, 0x66, 0xa7, 0x05, 0xf2, 0x95, 0xe6, 0x2e, 0x65, 0x3c, 0x63, ++ 0x1f, 0x56, 0xde, 0x15, 0x6a, 0x83, 0xf1, 0xe6, 0x3b, 0x55, 0x6f, 0x50, ++ 0x18, 0x54, 0xb8, 0xa9, 0xd0, 0xd1, 0x99, 0xca, 0xeb, 0xfe, 0x3d, 0x09, ++ 0xc7, 0x75, 0xd0, 0xb8, 0xac, 0x62, 0x10, 0x63, 0x93, 0x20, 0xd5, 0x7b, ++ 0xcb, 0x19, 0x8c, 0xfb, 0x4a, 0x8f, 0x89, 0xdd, 0x9b, 0x08, 0x75, 0xf0, ++ 0x6f, 0xaa, 0x2f, 0x65, 0xcc, 0xc5, 0xd8, 0x10, 0xc6, 0xce, 0x9a, 0xf9, ++ 0xf8, 0xb5, 0x9e, 0x69, 0x0f, 0x9c, 0x96, 0xfd, 0xc1, 0xff, 0x2b, 0x8d, ++ 0x96, 0x8d, 0x4a, 0x38, 0x96, 0x27, 0xb8, 0x19, 0x8c, 0xbf, 0x6f, 0xa8, ++ 0x33, 0xc9, 0x0e, 0xf5, 0x57, 0x1d, 0xbc, 0xf6, 0x81, 0xd3, 0x26, 0x5f, ++ 0xbd, 0x8a, 0x65, 0x85, 0x29, 0x4c, 0xe7, 0x1b, 0x37, 0x70, 0x9c, 0xc0, ++ 0xf1, 0x9a, 0xdc, 0x3a, 0x97, 0x01, 0xc6, 0x1b, 0x6e, 0x9a, 0x97, 0x76, ++ 0x1a, 0x9a, 0x34, 0x41, 0x81, 0x0e, 0xe6, 0xe9, 0xf2, 0x98, 0xdd, 0xbb, ++ 0x12, 0x71, 0xde, 0x3d, 0x7f, 0x5e, 0x01, 0xf9, 0xa6, 0x85, 0x63, 0xec, ++ 0xf7, 0x42, 0x76, 0xd6, 0x5c, 0x93, 0x43, 0x19, 0xcc, 0x58, 0xef, 0xfe, ++ 0x20, 0x77, 0x90, 0x82, 0xdf, 0x83, 0x1d, 0xb8, 0xae, 0xa6, 0x97, 0x43, ++ 0xdd, 0x3a, 0xc8, 0xdf, 0xa2, 0x70, 0xf8, 0x37, 0x29, 0x8c, 0xbe, 0xbb, ++ 0xf6, 0x19, 0xdc, 0xbb, 0xe0, 0x5b, 0x8d, 0xd1, 0xbd, 0x77, 0x37, 0xb4, ++ 0xab, 0x79, 0x65, 0xb4, 0x1d, 0x46, 0x66, 0xcf, 0x1b, 0xe1, 0x3f, 0x58, ++ 0xfe, 0x62, 0x08, 0x2f, 0x0f, 0x73, 0x24, 0xae, 0xcf, 0xc2, 0xf2, 0x68, ++ 0xbb, 0xcb, 0xc6, 0xd8, 0x4b, 0x06, 0x5b, 0x38, 0x95, 0xff, 0x5e, 0x65, ++ 0x54, 0x1e, 0xec, 0x4d, 0x89, 0x00, 0x78, 0x37, 0xc4, 0x38, 0x1d, 0xb8, ++ 0xee, 0xa1, 0x41, 0xac, 0xde, 0x63, 0xc1, 0x7e, 0xf9, 0xf7, 0x13, 0xb8, ++ 0x0e, 0x80, 0xcf, 0x09, 0xe8, 0x16, 0xf1, 0xeb, 0xaa, 0x0f, 0xa5, 0x7e, ++ 0x99, 0xc8, 0x3b, 0xef, 0x1c, 0xe4, 0xbe, 0x97, 0xd6, 0xe3, 0x88, 0x5d, ++ 0x86, 0xf9, 0x5b, 0xc7, 0xd2, 0x7a, 0x9c, 0x38, 0x0f, 0x98, 0x17, 0xab, ++ 0x53, 0x68, 0xbd, 0x27, 0xac, 0xee, 0x7b, 0x52, 0xa0, 0xfc, 0x44, 0xfb, ++ 0x10, 0x9a, 0xc7, 0x60, 0x41, 0x0f, 0x27, 0x8a, 0xbe, 0x7e, 0x6b, 0x02, ++ 0xd4, 0x3b, 0x71, 0x50, 0xb5, 0x63, 0x9f, 0x1f, 0x37, 0xa8, 0x5e, 0x63, ++ 0x18, 0x96, 0x73, 0x7c, 0x28, 0x73, 0x4d, 0x29, 0x5b, 0xa1, 0xdd, 0xa9, ++ 0x17, 0x43, 0xed, 0x41, 0x50, 0x5e, 0x7c, 0x7f, 0xf5, 0x9b, 0xf8, 0xbd, ++ 0xf8, 0xae, 0xda, 0xd9, 0x94, 0x56, 0xad, 0xbd, 0x91, 0x41, 0xfd, 0xce, ++ 0xbb, 0x3e, 0x4a, 0x70, 0xa6, 0x5d, 0x8d, 0x8f, 0xe2, 0x1a, 0x68, 0xe5, ++ 0x87, 0xc7, 0x1a, 0xbb, 0x63, 0x09, 0xd2, 0xcf, 0x46, 0xbb, 0xb3, 0x84, ++ 0xf0, 0x9c, 0xd6, 0xb9, 0x9c, 0x01, 0x5d, 0x5d, 0x32, 0x76, 0x3c, 0xc6, ++ 0x54, 0xc6, 0xde, 0x1b, 0xe6, 0x2c, 0xc5, 0xef, 0xdd, 0x87, 0x3e, 0xdb, ++ 0x8d, 0xdf, 0x01, 0x4f, 0x29, 0x45, 0xe3, 0x60, 0x19, 0x7a, 0xa0, 0x13, ++ 0xa4, 0xdf, 0xce, 0xf1, 0x44, 0xd7, 0xab, 0x04, 0xfd, 0x5a, 0xd3, 0x9d, ++ 0x2b, 0xb0, 0x3e, 0xc0, 0xb1, 0x84, 0x8d, 0x60, 0x2c, 0x24, 0xad, 0xc3, ++ 0x88, 0xf3, 0x60, 0x6b, 0x87, 0xfc, 0x20, 0x3a, 0x39, 0xd7, 0xbe, 0xeb, ++ 0x79, 0x05, 0xc6, 0xa9, 0x0e, 0x6e, 0xaf, 0xa3, 0x54, 0x75, 0x8f, 0xc7, ++ 0x7e, 0xce, 0x2b, 0xde, 0x30, 0x65, 0x04, 0xc1, 0xd1, 0x89, 0xfb, 0xef, ++ 0x82, 0xd5, 0x1b, 0x86, 0xf8, 0x70, 0xea, 0x20, 0x0f, 0xf8, 0xa9, 0xde, ++ 0xa3, 0x5d, 0x17, 0xfe, 0xe9, 0x61, 0x5e, 0xd5, 0xf8, 0x0f, 0x68, 0x57, ++ 0xed, 0x51, 0x1d, 0x66, 0xdc, 0x3f, 0xcc, 0x6d, 0xc4, 0xf9, 0x57, 0x33, ++ 0xa3, 0xaf, 0x7e, 0x22, 0xdf, 0x87, 0x48, 0x07, 0xd0, 0xcf, 0x0e, 0xda, ++ 0xaf, 0x96, 0x8f, 0x4b, 0xee, 0x04, 0x3c, 0x54, 0xed, 0x1d, 0x9d, 0x71, ++ 0x2f, 0xe0, 0xa7, 0x3a, 0xe2, 0xe0, 0xaf, 0xa7, 0x50, 0x3d, 0x68, 0x27, ++ 0xf7, 0x8b, 0x7a, 0x75, 0x5e, 0xae, 0xe7, 0xea, 0xf9, 0xf0, 0xf5, 0x5d, ++ 0x10, 0xfb, 0xe0, 0x02, 0x7c, 0x31, 0x20, 0xfd, 0xb4, 0x05, 0x71, 0xfa, ++ 0x67, 0x9c, 0x3e, 0x2e, 0xed, 0x8d, 0x15, 0xf4, 0xc3, 0xe9, 0xf6, 0xd2, ++ 0xde, 0x51, 0x6e, 0x9c, 0x4f, 0x94, 0xd8, 0x37, 0x97, 0x14, 0x97, 0x2e, ++ 0x18, 0xdb, 0xfd, 0x82, 0xd9, 0x77, 0xc1, 0xbc, 0x98, 0xdd, 0x93, 0x33, ++ 0x67, 0x1c, 0xce, 0xde, 0x93, 0x33, 0x37, 0x94, 0xb1, 0x2d, 0x0a, 0xe7, ++ 0x4f, 0xd5, 0x83, 0x3c, 0x39, 0x91, 0x90, 0x0e, 0x55, 0x81, 0x7e, 0x11, ++ 0xfe, 0x26, 0xcf, 0xf8, 0x39, 0x50, 0xce, 0x52, 0x3d, 0xe3, 0xe7, 0x42, ++ 0xfd, 0x97, 0x44, 0x3d, 0x56, 0xe4, 0x49, 0xa1, 0xef, 0x6e, 0x4f, 0x0a, ++ 0xb6, 0x7f, 0x5e, 0xc7, 0x2a, 0x11, 0x9e, 0x72, 0x3e, 0x55, 0x4f, 0xc5, ++ 0x6d, 0x27, 0x78, 0x98, 0xf8, 0x7e, 0xad, 0x7a, 0x6a, 0x2c, 0xc1, 0x47, ++ 0x8e, 0xd3, 0x84, 0x7c, 0x24, 0x1c, 0x53, 0xa0, 0xcf, 0xb0, 0xab, 0xd7, ++ 0xdd, 0x66, 0x57, 0xf8, 0xfe, 0x0f, 0xcd, 0x89, 0x46, 0xbe, 0x36, 0x10, ++ 0xfe, 0x53, 0x63, 0x06, 0xa5, 0x21, 0x2b, 0xb9, 0xb4, 0xc8, 0x78, 0x8b, ++ 0x03, 0xfa, 0x1d, 0xb5, 0xd5, 0xa8, 0xe9, 0x47, 0xd6, 0x1b, 0xed, 0xd6, ++ 0x7e, 0x3f, 0x80, 0xfd, 0x03, 0xfd, 0x0e, 0x0f, 0xc0, 0xe7, 0x50, 0xb5, ++ 0xe7, 0x70, 0x10, 0xcc, 0x97, 0x3d, 0x01, 0x70, 0x62, 0x57, 0x8f, 0xd7, ++ 0x2e, 0xda, 0x3d, 0xf9, 0x64, 0x1f, 0xfe, 0x54, 0x8e, 0x4f, 0xc6, 0x6c, ++ 0x92, 0x6e, 0x6c, 0x04, 0x27, 0x8e, 0xa7, 0x3f, 0x1b, 0x25, 0x9e, 0x6e, ++ 0x8b, 0x03, 0x7e, 0x5d, 0x8d, 0x30, 0x49, 0xf2, 0xc1, 0xeb, 0xf9, 0x74, ++ 0x67, 0x5c, 0x24, 0xa4, 0x97, 0x30, 0x0f, 0xf3, 0x7f, 0x3e, 0x02, 0xf2, ++ 0x90, 0xd6, 0x09, 0xf8, 0xcb, 0xbc, 0x84, 0x7b, 0x20, 0xfd, 0xdd, 0xf5, ++ 0xe7, 0xe5, 0x71, 0x9d, 0xd0, 0xfe, 0x73, 0xbb, 0x8e, 0xe6, 0x15, 0x08, ++ 0xd7, 0x75, 0x00, 0x3f, 0x2c, 0x6f, 0x32, 0xb0, 0x5b, 0x8a, 0xa0, 0xfd, ++ 0xb9, 0xc6, 0xe3, 0x23, 0x4e, 0x1b, 0x7c, 0xeb, 0x39, 0xd3, 0xe8, 0x70, ++ 0xc0, 0x51, 0xd3, 0x97, 0x5f, 0xbe, 0x35, 0xdd, 0x84, 0xfb, 0x6e, 0xc5, ++ 0xb6, 0x74, 0x53, 0x99, 0x1f, 0xdc, 0x9b, 0xf6, 0x64, 0x1e, 0xb7, 0x01, ++ 0x5e, 0x2f, 0xec, 0xd1, 0xe3, 0x48, 0xac, 0x49, 0xef, 0xfe, 0xf5, 0xe4, ++ 0xc1, 0xf8, 0x5d, 0xf5, 0xb8, 0x18, 0x95, 0x9b, 0x1c, 0x50, 0xff, 0x82, ++ 0xe5, 0xc8, 0xdb, 0x58, 0x6f, 0xf9, 0xb6, 0x88, 0x0c, 0xd5, 0xe6, 0x6b, ++ 0xbf, 0x62, 0x6b, 0xa1, 0xa3, 0xc2, 0x0f, 0xfe, 0x63, 0xf7, 0x68, 0xf1, ++ 0x31, 0xce, 0xa3, 0xcd, 0x5f, 0x73, 0x50, 0x9b, 0xbf, 0x8c, 0x5c, 0x2d, ++ 0xfb, 0x1f, 0x6f, 0x97, 0xee, 0xd5, 0xe6, 0x33, 0x8f, 0x6b, 0xf3, 0x9f, ++ 0xfd, 0xf1, 0xb6, 0x05, 0xb8, 0x0d, 0x5e, 0x98, 0xc8, 0xf7, 0xcd, 0x59, ++ 0x77, 0xa8, 0xdb, 0x04, 0x70, 0xad, 0xfc, 0x68, 0xe6, 0x71, 0x3c, 0x47, ++ 0xcf, 0x3e, 0xff, 0x42, 0x18, 0xe2, 0xab, 0xfa, 0xaf, 0x15, 0xc7, 0xe2, ++ 0x18, 0xae, 0x43, 0x4b, 0xa7, 0x80, 0x47, 0x45, 0x0f, 0xeb, 0x75, 0xed, ++ 0x56, 0x88, 0x5e, 0x56, 0xba, 0x03, 0xf7, 0xaf, 0xe0, 0x1b, 0x57, 0xed, ++ 0xeb, 0x75, 0xb4, 0x1e, 0xdc, 0x59, 0xfe, 0x74, 0x13, 0x88, 0xdf, 0xf3, ++ 0xcc, 0xb3, 0xc0, 0x01, 0xf4, 0x55, 0xd3, 0xf0, 0xde, 0x88, 0xd3, 0x99, ++ 0x30, 0xaf, 0xd9, 0x40, 0xc8, 0x30, 0x9f, 0x49, 0x9e, 0xcd, 0x46, 0x66, ++ 0xb9, 0x7a, 0xbc, 0x81, 0xf8, 0x07, 0xb3, 0x38, 0x6c, 0x0c, 0xe8, 0xaf, ++ 0x74, 0x22, 0x2f, 0x9b, 0xdc, 0x30, 0x83, 0x9d, 0x82, 0xfe, 0xd8, 0xa6, ++ 0x7f, 0x9f, 0x89, 0xfb, 0xb5, 0xf4, 0x57, 0x0a, 0xc9, 0x1b, 0xa5, 0xcf, ++ 0x8d, 0x7a, 0x15, 0xe9, 0xa6, 0x6b, 0xdf, 0xa2, 0xeb, 0x28, 0x5d, 0x30, ++ 0x8b, 0xe0, 0x50, 0xce, 0x1c, 0x46, 0xe4, 0x87, 0x2b, 0xda, 0x15, 0x6f, ++ 0x28, 0xe4, 0xad, 0x13, 0x6d, 0x07, 0x3b, 0xa1, 0xdd, 0x32, 0xb7, 0x62, ++ 0xc7, 0x79, 0x97, 0x35, 0x07, 0xf9, 0xf8, 0x19, 0xfc, 0xbf, 0x62, 0x53, ++ 0xc0, 0x3c, 0x5a, 0xfd, 0xca, 0x61, 0xfe, 0x2b, 0x0e, 0x1e, 0xfe, 0x46, ++ 0x81, 0xfe, 0x2b, 0xb7, 0x69, 0xdb, 0xad, 0x04, 0x78, 0xe1, 0xf9, 0x51, ++ 0xb5, 0xf3, 0xef, 0x41, 0xfe, 0xdf, 0x41, 0x10, 0x22, 0x78, 0x4d, 0x6e, ++ 0xdf, 0xae, 0xe2, 0xba, 0x97, 0x89, 0xf9, 0xcb, 0xf3, 0x8f, 0xb9, 0xf2, ++ 0x19, 0xae, 0x6f, 0x32, 0x6f, 0xc2, 0x4e, 0xe3, 0x7f, 0xe0, 0xdc, 0x08, ++ 0x1a, 0xee, 0xcc, 0x48, 0xcf, 0xf6, 0x9d, 0x83, 0x93, 0x5b, 0x79, 0x7b, ++ 0x60, 0x7c, 0xa5, 0xb8, 0xee, 0x5a, 0x8b, 0xd1, 0x86, 0xeb, 0xae, 0x35, ++ 0x31, 0x6f, 0x08, 0xcc, 0xe7, 0x78, 0xa8, 0xd1, 0x61, 0x85, 0xef, 0x97, ++ 0xb7, 0x86, 0x92, 0xfc, 0xb0, 0x3c, 0x88, 0xb9, 0x4c, 0x19, 0x94, 0x32, ++ 0x73, 0x06, 0xb6, 0xb3, 0x87, 0x63, 0xbb, 0x33, 0xef, 0xa8, 0x24, 0x27, ++ 0xd5, 0x02, 0xef, 0xa1, 0x7e, 0x1e, 0x57, 0xdc, 0x4d, 0xd8, 0x8f, 0xaa, ++ 0xf0, 0xfc, 0x13, 0x3c, 0xbf, 0x92, 0x79, 0x69, 0x3d, 0x48, 0x37, 0x0e, ++ 0xff, 0x75, 0xba, 0xb5, 0x79, 0xd6, 0x32, 0x88, 0xe4, 0x92, 0x1a, 0xbd, ++ 0xf7, 0x30, 0xc2, 0xa5, 0x8a, 0x75, 0x12, 0xbc, 0x19, 0xe0, 0xd3, 0x21, ++ 0xe1, 0x08, 0x70, 0xab, 0x81, 0x75, 0x7e, 0x18, 0x89, 0xf2, 0x97, 0xb6, ++ 0xfd, 0x2a, 0xe6, 0xa1, 0xfa, 0xab, 0x0e, 0xfe, 0x3d, 0xc8, 0xff, 0x3b, ++ 0xc8, 0x99, 0xcc, 0x04, 0xf5, 0xb7, 0x05, 0x43, 0x4a, 0xf3, 0x77, 0x13, ++ 0x1c, 0x55, 0x23, 0x73, 0xe8, 0x60, 0x9e, 0xea, 0x2f, 0x83, 0xdd, 0x2e, ++ 0x92, 0x43, 0x8a, 0x82, 0x91, 0x4e, 0x0d, 0x78, 0x5e, 0x00, 0x5c, 0x5b, ++ 0xef, 0x71, 0xa4, 0xe0, 0xbc, 0xd7, 0x2b, 0x8e, 0x14, 0x2b, 0xf2, 0xb1, ++ 0xcd, 0x66, 0x3b, 0xf2, 0xb1, 0xc5, 0xdb, 0xf9, 0x39, 0xd4, 0x1a, 0x01, ++ 0xf2, 0x2b, 0xb4, 0x6f, 0x5d, 0x39, 0x86, 0xda, 0x2f, 0x46, 0x79, 0x0a, ++ 0xe5, 0x94, 0x45, 0x9c, 0xdf, 0xb5, 0x46, 0x78, 0xbc, 0xc8, 0xf7, 0x5b, ++ 0x1f, 0x4c, 0xe4, 0xf2, 0xd4, 0x7f, 0xa9, 0x04, 0x97, 0x9e, 0xfb, 0xcc, ++ 0xee, 0x1d, 0x50, 0xbf, 0x35, 0x9d, 0xcb, 0x3d, 0xad, 0x9b, 0x47, 0x51, ++ 0x7b, 0xe4, 0x97, 0x24, 0x4f, 0xdd, 0x17, 0xca, 0xdb, 0xcf, 0xe1, 0x70, ++ 0x6d, 0x1d, 0x62, 0x75, 0xbb, 0x20, 0xff, 0x17, 0x9c, 0x22, 0xc0, 0xa7, ++ 0x75, 0xbb, 0x23, 0xc5, 0x44, 0xed, 0x40, 0x4e, 0x4b, 0xf4, 0x9d, 0x53, ++ 0x52, 0x9e, 0xde, 0x39, 0xdc, 0x59, 0x8f, 0xf8, 0x96, 0xeb, 0x6d, 0x4d, ++ 0x74, 0xc4, 0x22, 0xff, 0x64, 0x95, 0x3f, 0x4c, 0xde, 0xdc, 0x25, 0xce, ++ 0xcf, 0x9e, 0xcd, 0x30, 0x4f, 0xe8, 0xff, 0xb4, 0x52, 0x74, 0x4c, 0xe7, ++ 0x27, 0x0f, 0xaf, 0x4b, 0xe7, 0xfc, 0x3f, 0x67, 0xba, 0x63, 0xb7, 0xa8, ++ 0x67, 0xc7, 0x7a, 0x15, 0xba, 0x39, 0xf7, 0x4e, 0x85, 0xf9, 0x56, 0x6c, ++ 0xd1, 0xd9, 0x9a, 0x12, 0x7d, 0x70, 0x67, 0x0e, 0x47, 0x0a, 0xc2, 0xf9, ++ 0xf4, 0x66, 0x73, 0x06, 0xd2, 0x59, 0xce, 0x74, 0xe0, 0xc3, 0x40, 0x7f, ++ 0x27, 0xd2, 0x39, 0x3f, 0x0f, 0xc9, 0x62, 0x0e, 0x37, 0xa4, 0xf7, 0xa6, ++ 0xf3, 0xf3, 0xee, 0xde, 0x74, 0x9d, 0x26, 0x8d, 0x09, 0x06, 0xfa, 0x83, ++ 0x7e, 0x4e, 0x17, 0x7a, 0x0d, 0x88, 0xdf, 0xd0, 0xac, 0x22, 0x23, 0x9e, ++ 0x87, 0x70, 0x86, 0x13, 0x3f, 0x0f, 0x5c, 0xc7, 0x16, 0x31, 0xbf, 0x0a, ++ 0x63, 0xd1, 0x1f, 0xf2, 0xfa, 0x99, 0x4f, 0x1f, 0x1d, 0x14, 0x70, 0xb9, ++ 0xe5, 0xf4, 0x6a, 0x65, 0x07, 0x9f, 0x17, 0xc7, 0x73, 0xce, 0xbf, 0x9a, ++ 0xed, 0x4d, 0xb4, 0x6e, 0x3e, 0x3f, 0x09, 0x77, 0xa0, 0x9b, 0x6c, 0x3a, ++ 0xef, 0x05, 0xdf, 0x8a, 0xe8, 0xa3, 0x13, 0xf7, 0x5e, 0x33, 0xa0, 0x76, ++ 0xb3, 0x94, 0xa7, 0x11, 0xff, 0x8a, 0x86, 0x4e, 0x08, 0x9e, 0xad, 0xf7, ++ 0x8d, 0x23, 0x3c, 0x2e, 0x16, 0x78, 0x66, 0xf7, 0x99, 0x05, 0x9d, 0x30, ++ 0xf6, 0x37, 0x2c, 0x2f, 0xb4, 0x51, 0x39, 0xd0, 0x09, 0xc1, 0xa7, 0x35, ++ 0x1d, 0xf0, 0x66, 0xf1, 0x9d, 0x7b, 0xad, 0x73, 0x1c, 0xb1, 0x11, 0x7e, ++ 0xe7, 0x11, 0xd0, 0x01, 0x95, 0x03, 0xbe, 0x9f, 0x41, 0x7c, 0x4b, 0x3a, ++ 0x08, 0xc4, 0x37, 0xd3, 0xbb, 0xb3, 0x8b, 0x42, 0x07, 0xc6, 0x77, 0xd9, ++ 0xc4, 0x88, 0x1c, 0x05, 0x40, 0x1d, 0xa7, 0x67, 0xae, 0x20, 0x80, 0x0b, ++ 0x9e, 0x79, 0x04, 0x97, 0x7b, 0xf4, 0xee, 0xbb, 0x60, 0x3e, 0xc3, 0xf4, ++ 0x1c, 0xfe, 0xf1, 0x7a, 0x4e, 0x5f, 0xc0, 0x9d, 0x5d, 0xc1, 0x19, 0x54, ++ 0xdf, 0x61, 0x84, 0x7c, 0xe9, 0x03, 0x2b, 0x98, 0x03, 0xea, 0x97, 0xc6, ++ 0x31, 0xbb, 0xc2, 0xeb, 0xb3, 0x70, 0xac, 0x0f, 0xdd, 0xa8, 0x90, 0xe2, ++ 0x99, 0x81, 0xed, 0x4a, 0xc3, 0x79, 0xbf, 0xa5, 0xd1, 0xcc, 0x7d, 0x97, ++ 0x90, 0xfb, 0x91, 0x5f, 0x25, 0x63, 0x9a, 0x44, 0xfd, 0x3a, 0x74, 0x91, ++ 0xbc, 0x7d, 0x58, 0x06, 0xb5, 0x77, 0xe9, 0x78, 0x7b, 0x87, 0x1e, 0xd2, ++ 0xe1, 0x23, 0xf8, 0x7e, 0xe9, 0x59, 0x1f, 0x44, 0xfb, 0xa7, 0xf4, 0xee, ++ 0xf8, 0x14, 0xa4, 0x83, 0xd9, 0xd3, 0xb5, 0x74, 0x90, 0x98, 0xc1, 0xe5, ++ 0x00, 0x99, 0xde, 0x97, 0x61, 0x13, 0xe7, 0x8c, 0x3d, 0x06, 0xf7, 0x77, ++ 0x59, 0xf3, 0x68, 0x3a, 0x37, 0x9a, 0xcc, 0x45, 0xb5, 0x07, 0x10, 0x5f, ++ 0x4f, 0x87, 0x90, 0x3c, 0x58, 0xba, 0x61, 0xe9, 0x0d, 0xd9, 0x38, 0xbf, ++ 0x67, 0x06, 0xa1, 0x84, 0xc3, 0xce, 0xdd, 0xb8, 0x2f, 0x07, 0xe9, 0xad, ++ 0xac, 0x79, 0xd1, 0xed, 0xef, 0xe3, 0x7d, 0x64, 0x8f, 0x99, 0xbe, 0x3f, ++ 0x99, 0xe1, 0xfc, 0x38, 0x1d, 0xe5, 0x6d, 0xc5, 0x56, 0x72, 0x00, 0x3e, ++ 0x94, 0xcd, 0x3f, 0x6a, 0x8c, 0x81, 0xf6, 0x4e, 0xcf, 0x9c, 0x8b, 0x2f, ++ 0x42, 0x7a, 0xa3, 0x6b, 0xdf, 0xdb, 0x28, 0x17, 0xdc, 0x78, 0x93, 0x4a, ++ 0xf5, 0x6f, 0x64, 0x9e, 0xaf, 0xff, 0x82, 0x7c, 0xa1, 0x99, 0x8f, 0x73, ++ 0x83, 0xeb, 0x0b, 0x7d, 0x0c, 0xf4, 0x77, 0x43, 0xae, 0xc2, 0xb0, 0xbc, ++ 0xcb, 0x6c, 0x4d, 0x58, 0x0d, 0xf3, 0x2f, 0x15, 0xf8, 0x3b, 0x2b, 0xe8, ++ 0xb7, 0xc9, 0xcc, 0x16, 0x3e, 0x6b, 0xc1, 0x79, 0xc5, 0xa7, 0x24, 0xc1, ++ 0xf7, 0x1b, 0x50, 0x52, 0xed, 0x47, 0x0e, 0x4c, 0xc9, 0x10, 0x72, 0xe2, ++ 0x34, 0x65, 0x1b, 0xca, 0x3d, 0xc3, 0x67, 0xf0, 0xfd, 0x25, 0xeb, 0x63, ++ 0x3f, 0xd8, 0x6f, 0x5a, 0x06, 0xdf, 0x4f, 0x97, 0xd3, 0x39, 0x5c, 0x64, ++ 0x1e, 0xe0, 0x4a, 0xf5, 0x2b, 0x36, 0x06, 0x75, 0x8d, 0x08, 0xc3, 0xd4, ++ 0xe0, 0x1d, 0x05, 0xe9, 0xbc, 0xac, 0xe9, 0xff, 0x81, 0xeb, 0x9c, 0x9d, ++ 0xc4, 0x66, 0xe2, 0xbd, 0xa9, 0xe7, 0xe7, 0x2a, 0xdb, 0x41, 0xf3, 0xed, ++ 0x29, 0xa5, 0x7d, 0x1f, 0x9a, 0x62, 0xc3, 0x7d, 0xef, 0x64, 0xcc, 0x4b, ++ 0x7c, 0xcf, 0x3d, 0x9a, 0xe8, 0xbe, 0x6b, 0x5a, 0x4f, 0xd7, 0xdd, 0x90, ++ 0xef, 0xda, 0x3e, 0xca, 0xde, 0x44, 0x7c, 0x9d, 0xdf, 0xdf, 0x97, 0x59, ++ 0x19, 0x9d, 0xef, 0x5d, 0xd3, 0x38, 0x5f, 0x93, 0xfc, 0xe5, 0x84, 0xb5, ++ 0x33, 0x94, 0xe8, 0x55, 0xdc, 0xe7, 0xcb, 0x05, 0x69, 0x7c, 0xda, 0x30, ++ 0x63, 0xcb, 0x04, 0xa8, 0x5f, 0x6e, 0x31, 0x76, 0xe1, 0x79, 0xb0, 0xec, ++ 0xc1, 0x79, 0x61, 0x36, 0x98, 0x67, 0x79, 0x2b, 0xdc, 0xe7, 0xe1, 0x1c, ++ 0x63, 0x9b, 0xb4, 0xf7, 0x79, 0xb8, 0x6f, 0x47, 0x64, 0x64, 0x5f, 0x7d, ++ 0x2f, 0x0f, 0xbc, 0x7f, 0x23, 0xcd, 0x20, 0x1d, 0x55, 0x6c, 0x52, 0x88, ++ 0x0e, 0x87, 0x37, 0xd9, 0x8d, 0xb1, 0xc4, 0xc7, 0x14, 0x2b, 0xae, 0xaf, ++ 0xc2, 0xe2, 0x4d, 0xc6, 0xf3, 0xaf, 0xc2, 0x6e, 0xb6, 0x63, 0xf9, 0x85, ++ 0x46, 0xc7, 0x03, 0xa7, 0x41, 0x3e, 0xbc, 0xd4, 0x38, 0x8b, 0x52, 0xf6, ++ 0x2d, 0xc0, 0x1d, 0xe6, 0x39, 0x06, 0x91, 0x07, 0xfb, 0x7e, 0x64, 0xa6, ++ 0x33, 0x01, 0xc7, 0x2d, 0x6d, 0x29, 0xa5, 0xfb, 0x64, 0x48, 0x9a, 0x93, ++ 0xf8, 0xd3, 0x52, 0xa4, 0x3b, 0x84, 0x1f, 0x80, 0x59, 0x41, 0x7e, 0xa3, ++ 0xef, 0x8c, 0xc5, 0x7d, 0xf8, 0x4e, 0x3a, 0xa7, 0xc7, 0xd9, 0x91, 0xd6, ++ 0x14, 0x0b, 0xd1, 0xb3, 0x99, 0x21, 0x1c, 0xba, 0x0c, 0xd6, 0x14, 0x9c, ++ 0x57, 0xd7, 0x7a, 0xb3, 0x0e, 0xcf, 0xcd, 0xd9, 0x77, 0x71, 0xba, 0x86, ++ 0x7d, 0x66, 0xd2, 0x43, 0xfb, 0x7b, 0xf4, 0x2c, 0x18, 0xf7, 0xfb, 0x85, ++ 0x74, 0xde, 0x6f, 0xf1, 0x3a, 0x7d, 0xd1, 0x76, 0xc8, 0x0f, 0x33, 0x31, ++ 0x7d, 0x68, 0x24, 0xd2, 0x55, 0x3a, 0xd1, 0xf5, 0x83, 0x59, 0xce, 0xcb, ++ 0xc8, 0x0f, 0xce, 0xfe, 0x82, 0x4d, 0x44, 0xb9, 0xa0, 0x7c, 0xd3, 0x66, ++ 0x9a, 0x8f, 0xa4, 0x0b, 0xa6, 0xef, 0x28, 0x18, 0x84, 0x72, 0xde, 0xae, ++ 0xc4, 0x0c, 0xbc, 0x5f, 0x4b, 0x3a, 0x7a, 0x30, 0x6b, 0x7a, 0x36, 0xae, ++ 0xa3, 0x8f, 0x1e, 0x6e, 0x52, 0x88, 0x0e, 0x20, 0x3d, 0x3c, 0x82, 0xe8, ++ 0x61, 0xee, 0xe4, 0x0c, 0x5c, 0xcf, 0x74, 0x6f, 0xf2, 0x1a, 0x98, 0x57, ++ 0xa1, 0x5a, 0xc3, 0x1c, 0xa8, 0x67, 0x88, 0x61, 0xf6, 0x20, 0x98, 0x7f, ++ 0x2f, 0xeb, 0x21, 0x79, 0xa2, 0x17, 0xe4, 0x09, 0x3c, 0xcf, 0x24, 0x3f, ++ 0x91, 0x7c, 0x03, 0xe8, 0xc0, 0x61, 0x8a, 0xf2, 0xe1, 0x77, 0x77, 0x23, ++ 0x4c, 0x05, 0x78, 0xf2, 0x9e, 0x46, 0x13, 0xa5, 0x4f, 0x36, 0x5a, 0x99, ++ 0x1e, 0xe0, 0xdb, 0xd6, 0x18, 0x43, 0xf9, 0x67, 0x1a, 0x6d, 0x94, 0x7a, ++ 0x1a, 0x53, 0xe9, 0xfb, 0xb3, 0x8d, 0x76, 0xca, 0xef, 0x6f, 0x9c, 0x48, ++ 0xf9, 0xe7, 0x1b, 0x1d, 0x94, 0x3f, 0xd8, 0x38, 0x8b, 0xd2, 0x17, 0x1b, ++ 0x8b, 0xe8, 0xbb, 0xe4, 0x4b, 0x00, 0x17, 0xe2, 0x43, 0x92, 0xaf, 0x48, ++ 0x7e, 0x24, 0xe9, 0x49, 0xf2, 0xa5, 0x40, 0x3a, 0x2a, 0x01, 0xf0, 0xe6, ++ 0x67, 0x50, 0x7b, 0xe2, 0x7b, 0x92, 0xdf, 0xe1, 0x3a, 0x74, 0x19, 0x3e, ++ 0x7e, 0x24, 0xf1, 0x9b, 0xa4, 0x14, 0xb9, 0x62, 0x12, 0x91, 0x8f, 0x75, ++ 0x2e, 0x42, 0x7e, 0x51, 0xa8, 0x5e, 0x78, 0xfa, 0x05, 0x80, 0x6f, 0x6f, ++ 0xa5, 0xc5, 0x1e, 0x64, 0x43, 0xb8, 0x70, 0xbe, 0xd7, 0x6b, 0x31, 0xd1, ++ 0x39, 0x9f, 0x60, 0x64, 0x07, 0xf1, 0xfe, 0xdf, 0xb4, 0xda, 0xd1, 0x75, ++ 0xb7, 0xdf, 0xb9, 0xba, 0xa4, 0x52, 0x61, 0x7a, 0x3f, 0xba, 0x5d, 0x5a, ++ 0x6f, 0x66, 0x7a, 0x3f, 0xba, 0xbd, 0xa5, 0x21, 0x42, 0x93, 0x2f, 0x6e, ++ 0x78, 0xef, 0xb5, 0x68, 0xe8, 0xff, 0xdb, 0x78, 0x67, 0x1d, 0xe2, 0xed, ++ 0xc4, 0x2f, 0xcf, 0x3c, 0xfa, 0x27, 0xf8, 0xfe, 0xf8, 0x2f, 0xcf, 0x8d, ++ 0x44, 0x7c, 0xc3, 0x3c, 0x76, 0x3d, 0x84, 0xe3, 0xae, 0x0d, 0xee, 0x9b, ++ 0x47, 0x24, 0xe6, 0x9b, 0x0d, 0x74, 0xce, 0x0c, 0x0f, 0xe6, 0xf7, 0xa4, ++ 0xe1, 0xc1, 0xfc, 0x9e, 0x84, 0x7f, 0x88, 0x9f, 0x32, 0xc6, 0xf7, 0xe9, ++ 0xe3, 0xbf, 0xfc, 0x1b, 0xed, 0xf3, 0xae, 0x86, 0x20, 0x9b, 0x8a, 0xf2, ++ 0x07, 0xe2, 0x0b, 0xe0, 0xfb, 0xb1, 0xc0, 0x57, 0x59, 0x43, 0x10, 0xc1, ++ 0xb1, 0x74, 0xfd, 0xa9, 0xa7, 0x5f, 0xc0, 0xfd, 0xbe, 0xd6, 0x48, 0xfc, ++ 0xae, 0xac, 0x59, 0xec, 0xcf, 0x8d, 0x00, 0x57, 0x3f, 0xb9, 0xed, 0x64, ++ 0x2c, 0x23, 0xf9, 0x4c, 0x71, 0x30, 0xd6, 0x00, 0xf0, 0x3b, 0xf9, 0x0b, ++ 0xa3, 0x17, 0xce, 0x7e, 0x76, 0x52, 0x31, 0xb9, 0x15, 0x68, 0xa8, 0xc0, ++ 0xa5, 0xa9, 0x18, 0xbe, 0x3b, 0x37, 0xbe, 0xfe, 0x21, 0xca, 0xdb, 0x4a, ++ 0xc3, 0x71, 0x92, 0x8f, 0x9d, 0x26, 0x8b, 0x57, 0xc5, 0xf9, 0xb9, 0x0c, ++ 0x17, 0xfc, 0xfb, 0x53, 0x1a, 0x8e, 0x51, 0x3d, 0xd6, 0x39, 0x2c, 0xe2, ++ 0x4c, 0x08, 0x6d, 0x45, 0x86, 0x70, 0x0c, 0xc9, 0x72, 0x18, 0x91, 0x4f, ++ 0x20, 0x6d, 0x23, 0xfe, 0xca, 0x52, 0x8f, 0x30, 0xdc, 0xdf, 0xac, 0x45, ++ 0xb1, 0x8e, 0x84, 0x75, 0x55, 0x88, 0xef, 0x15, 0x1b, 0x15, 0x92, 0x3b, ++ 0x24, 0xfc, 0x1f, 0xca, 0x50, 0x69, 0x5f, 0xbe, 0x9b, 0xae, 0xa7, 0xd4, ++ 0x8e, 0x7b, 0x76, 0x08, 0x31, 0x30, 0x3a, 0xa7, 0x24, 0xdd, 0x02, 0xdf, ++ 0x70, 0xb8, 0x71, 0x7f, 0xb4, 0xa4, 0x1b, 0x97, 0xfb, 0xf1, 0xe3, 0x32, ++ 0xf1, 0xbd, 0x3c, 0x55, 0x47, 0xa9, 0xfc, 0xfe, 0x2e, 0x6c, 0x4b, 0xec, ++ 0xc7, 0x8e, 0x9b, 0x07, 0xfa, 0xbd, 0x37, 0x35, 0xc9, 0xb8, 0x8c, 0xf8, ++ 0x9d, 0xcd, 0x88, 0xfc, 0x40, 0xd6, 0x2f, 0x4b, 0xcd, 0xd8, 0x90, 0x94, ++ 0x85, 0xfd, 0x4c, 0x1b, 0xcc, 0xfc, 0xf6, 0xe5, 0x13, 0x19, 0x7a, 0x31, ++ 0x2f, 0x2b, 0x3f, 0xc7, 0x4c, 0x70, 0x8e, 0x41, 0xbb, 0x9a, 0x01, 0xce, ++ 0x03, 0x29, 0x9f, 0x9c, 0xc5, 0x7f, 0x4e, 0xa2, 0xf9, 0xd3, 0xfd, 0xab, ++ 0xea, 0x99, 0xa7, 0x9e, 0x79, 0x11, 0xf5, 0x12, 0x1f, 0x05, 0x11, 0x9e, ++ 0xaa, 0xae, 0x11, 0xfa, 0x8d, 0x34, 0x77, 0xce, 0x3c, 0x92, 0x6b, 0x1c, ++ 0x16, 0x05, 0xd6, 0x59, 0x27, 0xf0, 0x5f, 0xf0, 0xd4, 0x5f, 0xc3, 0x3a, ++ 0xa1, 0x7c, 0xd5, 0x7e, 0xae, 0x3f, 0x85, 0xb4, 0x0b, 0xd3, 0xba, 0xb5, ++ 0x95, 0xa4, 0x2f, 0xab, 0x83, 0xfb, 0x68, 0x7e, 0x24, 0xf2, 0x57, 0xc3, ++ 0xc9, 0x4e, 0x3f, 0xba, 0x7c, 0xf5, 0x99, 0x8f, 0xc2, 0x3a, 0xe9, 0x7e, ++ 0xe1, 0x8a, 0xd3, 0xc5, 0x60, 0xea, 0x8d, 0x63, 0x90, 0xd6, 0xed, 0x3f, ++ 0x35, 0x93, 0x61, 0x7f, 0xac, 0x67, 0x83, 0xd5, 0x72, 0x75, 0xbb, 0x55, ++ 0xca, 0xb7, 0x74, 0xcf, 0x94, 0xeb, 0x28, 0x7c, 0xf9, 0xab, 0x28, 0x1a, ++ 0x5f, 0xb9, 0x12, 0x45, 0xf5, 0x5f, 0x5e, 0x1f, 0xd5, 0x9f, 0x1e, 0x64, ++ 0x15, 0xd3, 0x9f, 0xec, 0xdb, 0xbf, 0xa4, 0x67, 0x70, 0x68, 0xf4, 0x6a, ++ 0xab, 0xd8, 0xa6, 0x2f, 0x54, 0x98, 0xef, 0xaa, 0xb5, 0xb3, 0x3e, 0x43, ++ 0x3a, 0x0f, 0xac, 0xff, 0x7e, 0x46, 0xe8, 0xe0, 0x33, 0x63, 0x21, 0x33, ++ 0x81, 0x4d, 0x20, 0x3d, 0x86, 0x9e, 0xe9, 0x10, 0xdf, 0x6b, 0x4c, 0x1c, ++ 0x0e, 0xbd, 0xee, 0x91, 0xe1, 0xec, 0x3b, 0xf4, 0x2f, 0xab, 0xb6, 0x42, ++ 0x23, 0x10, 0xb5, 0x7a, 0xf5, 0xb6, 0x70, 0x3b, 0xcc, 0xb7, 0x9b, 0xb1, ++ 0x59, 0xfd, 0xe1, 0x65, 0x68, 0x26, 0x3f, 0xd7, 0x2f, 0xc2, 0x3e, 0x62, ++ 0x70, 0x97, 0xea, 0x6e, 0x53, 0xe9, 0xbe, 0xd0, 0xdd, 0x16, 0x4a, 0xf4, ++ 0x5f, 0xd7, 0xf6, 0xc0, 0xb1, 0x29, 0x90, 0xaf, 0xdb, 0xa9, 0xe0, 0xb0, ++ 0xac, 0x96, 0x75, 0x10, 0x9c, 0xea, 0xf6, 0xab, 0xcc, 0xe4, 0x7f, 0x9e, ++ 0xa1, 0x7e, 0x67, 0xd0, 0xc0, 0xf3, 0xac, 0x7e, 0x2a, 0xb4, 0x1e, 0xe9, ++ 0x69, 0xa5, 0x47, 0x71, 0xec, 0x82, 0xf9, 0xf4, 0x9a, 0x6c, 0xe1, 0x43, ++ 0xfc, 0xe6, 0xf3, 0x1f, 0x48, 0x4f, 0x40, 0x8a, 0xd5, 0x41, 0x9e, 0x1c, ++ 0x82, 0xab, 0x98, 0xff, 0x45, 0x21, 0x27, 0xc9, 0x7a, 0x2b, 0xdb, 0x1f, ++ 0x30, 0x22, 0xbe, 0xa0, 0xde, 0x25, 0x92, 0x5f, 0xfe, 0x2d, 0x84, 0x91, ++ 0xde, 0x8c, 0xf5, 0xbc, 0x8d, 0xf3, 0x3c, 0xbf, 0x2d, 0xd3, 0x8e, 0xfa, ++ 0xbd, 0x95, 0x9e, 0x7d, 0x75, 0x74, 0xfe, 0xb7, 0x85, 0x58, 0x47, 0xc2, ++ 0x3a, 0xce, 0x09, 0x3d, 0xbf, 0xec, 0x47, 0xcd, 0xe4, 0xe3, 0xa9, 0x99, ++ 0x5c, 0xde, 0x38, 0x2f, 0xf4, 0xb9, 0xe7, 0x9f, 0x51, 0x89, 0x0f, 0xe1, ++ 0x3c, 0x71, 0x1f, 0x9e, 0x43, 0x39, 0xd7, 0x6f, 0x9e, 0x66, 0xd1, 0xce, ++ 0x9c, 0xc9, 0xe5, 0x1b, 0x0f, 0xee, 0xc7, 0x6c, 0x5f, 0xfd, 0x95, 0x9e, ++ 0xae, 0xb0, 0x64, 0xa8, 0xff, 0xd9, 0xc1, 0xf7, 0x28, 0x1d, 0x94, 0xc9, ++ 0xf7, 0xc9, 0x4a, 0x4b, 0xc7, 0x78, 0x3c, 0x37, 0x3f, 0xdb, 0x1f, 0x32, ++ 0xcb, 0x4d, 0xe9, 0x6f, 0x66, 0xbe, 0x04, 0xe3, 0x5d, 0xf4, 0x4c, 0x1b, ++ 0xac, 0xf8, 0xed, 0x2b, 0x5b, 0xa6, 0x81, 0xfa, 0xbd, 0xb8, 0x4d, 0x9d, ++ 0x85, 0xf0, 0x62, 0xee, 0x41, 0x42, 0xce, 0xf7, 0xd0, 0x7a, 0xce, 0xb7, ++ 0xc5, 0x29, 0x74, 0xbf, 0x45, 0x78, 0x83, 0x9c, 0x7f, 0x7e, 0xff, 0x73, ++ 0x61, 0x3a, 0xda, 0xb7, 0x2e, 0xde, 0x4e, 0xe0, 0x51, 0x67, 0xe2, 0x7a, ++ 0xda, 0xa0, 0x08, 0x9b, 0x90, 0x33, 0x4d, 0x2d, 0x28, 0x6f, 0x2c, 0x06, ++ 0xe9, 0x2e, 0x1c, 0xf8, 0x5d, 0xed, 0xfe, 0x2f, 0xe8, 0xfc, 0x0d, 0xfc, ++ 0x2e, 0xeb, 0xd3, 0x7e, 0x8b, 0xc5, 0xfb, 0x77, 0x0f, 0xe9, 0x35, 0xe0, ++ 0x4f, 0x87, 0xf4, 0x5b, 0x6b, 0xe5, 0x38, 0x2f, 0x54, 0xd3, 0xa2, 0x71, ++ 0x1f, 0x94, 0x5c, 0x63, 0xbb, 0x79, 0x09, 0xf2, 0xb1, 0x37, 0x0c, 0x1c, ++ 0x0f, 0xc3, 0x6c, 0x0f, 0xe1, 0xbd, 0xaa, 0xe4, 0x9d, 0x41, 0xa4, 0xb7, ++ 0x58, 0x63, 0xb0, 0x45, 0x63, 0xfe, 0xcb, 0x37, 0xe1, 0x22, 0x08, 0xf3, ++ 0x2e, 0xc9, 0x14, 0xfb, 0x3b, 0xa6, 0x33, 0x1b, 0xf5, 0x9c, 0x5d, 0x89, ++ 0xfc, 0x5c, 0xaf, 0xd9, 0x08, 0x17, 0x15, 0x58, 0xcf, 0x50, 0xc0, 0xbb, ++ 0x0b, 0x96, 0x5c, 0xe3, 0x56, 0x99, 0x13, 0xf2, 0xaa, 0xb8, 0xcf, 0xcc, ++ 0xcc, 0x4c, 0xa2, 0xf5, 0x3d, 0x52, 0xa9, 0x73, 0x18, 0xc9, 0xce, 0xe2, ++ 0x4d, 0x41, 0xbd, 0xe7, 0x09, 0x23, 0x73, 0xa9, 0x28, 0x2f, 0x3f, 0x6b, ++ 0xe6, 0xf6, 0x80, 0x24, 0xae, 0xd7, 0x7f, 0x04, 0xe9, 0x1d, 0xd2, 0x9a, ++ 0x48, 0x6f, 0xca, 0x20, 0x94, 0x4f, 0x04, 0x1e, 0x6b, 0xe6, 0x42, 0xb9, ++ 0x1f, 0x3e, 0x6b, 0x76, 0x78, 0x53, 0x48, 0x7e, 0x31, 0x72, 0x3d, 0x1f, ++ 0x96, 0x5b, 0x31, 0xcd, 0xe0, 0xf5, 0x9a, 0x04, 0xdd, 0x60, 0x3f, 0xd8, ++ 0x6f, 0x57, 0xa2, 0xf5, 0x12, 0xc9, 0x99, 0x07, 0x42, 0x19, 0xca, 0xfb, ++ 0xba, 0x17, 0x42, 0xb9, 0x5e, 0xe1, 0xb7, 0xe6, 0x1d, 0x41, 0x7e, 0xe7, ++ 0xe6, 0x02, 0x41, 0x57, 0x20, 0x33, 0xb9, 0x70, 0xfd, 0xae, 0x5d, 0x7c, ++ 0x7e, 0x38, 0x2f, 0x94, 0x9f, 0x57, 0x1a, 0x5b, 0x52, 0x50, 0xbe, 0x94, ++ 0xe3, 0xae, 0x0c, 0x6b, 0xa1, 0xf1, 0x2e, 0x88, 0xf1, 0x56, 0x06, 0xb7, ++ 0x70, 0xfb, 0x84, 0x91, 0xeb, 0x23, 0xb1, 0x3e, 0x8d, 0x6f, 0x60, 0x64, ++ 0x47, 0xe9, 0xd9, 0x1b, 0x44, 0x72, 0xea, 0xb9, 0xd8, 0x8e, 0xe7, 0x71, ++ 0xfc, 0x73, 0x7b, 0x47, 0x33, 0x3c, 0xc7, 0xbb, 0x12, 0xdd, 0xcb, 0x0f, ++ 0x52, 0x39, 0xc8, 0x6f, 0x80, 0x8f, 0xaa, 0x27, 0x83, 0xbc, 0x38, 0xdf, ++ 0xcf, 0xf7, 0x86, 0xba, 0x19, 0xd4, 0xff, 0xdc, 0xc0, 0xe5, 0xa1, 0xcf, ++ 0x43, 0xa3, 0x48, 0x1e, 0x3a, 0x1e, 0xba, 0xa5, 0x84, 0xec, 0x32, 0x3b, ++ 0x83, 0x14, 0xd4, 0xab, 0x7c, 0xae, 0x30, 0x63, 0x0c, 0x96, 0xef, 0xe2, ++ 0x76, 0x8c, 0xaa, 0xc6, 0x06, 0xb2, 0x3f, 0x54, 0xc1, 0x76, 0x67, 0x19, ++ 0x94, 0xce, 0x62, 0x91, 0x58, 0x3e, 0x9a, 0xf4, 0x2d, 0x9f, 0xff, 0x1e, ++ 0xf6, 0xa9, 0x42, 0xdf, 0x37, 0xe2, 0x77, 0x27, 0x6b, 0x29, 0xb9, 0x03, ++ 0xf7, 0xdd, 0x9e, 0x10, 0xd2, 0xbb, 0x9d, 0x7b, 0xf2, 0x3f, 0x47, 0xf7, ++ 0x67, 0xb7, 0xa8, 0xda, 0xa9, 0xd5, 0x2f, 0x49, 0x3a, 0x90, 0xe5, 0x3f, ++ 0x13, 0xfb, 0xeb, 0x67, 0x02, 0x8e, 0x77, 0x66, 0x5a, 0x29, 0xad, 0x0d, ++ 0xf1, 0x6c, 0x49, 0xa2, 0x75, 0xf2, 0xfd, 0x0a, 0x78, 0xa0, 0x7b, 0x17, ++ 0xec, 0x8f, 0x28, 0xd4, 0x77, 0x9f, 0xf0, 0x1c, 0x8a, 0x52, 0x2c, 0x08, ++ 0x67, 0x6f, 0xca, 0x6f, 0x10, 0xee, 0x7b, 0xf8, 0xfd, 0xe6, 0x5c, 0x9b, ++ 0x81, 0xec, 0x2e, 0x55, 0x2f, 0x84, 0x3a, 0x48, 0x8f, 0x73, 0xf7, 0x04, ++ 0x1d, 0x9e, 0x17, 0x55, 0x2a, 0x97, 0x83, 0xab, 0x74, 0x00, 0x3e, 0x48, ++ 0x95, 0x5f, 0xee, 0x49, 0x41, 0x39, 0xbb, 0x69, 0xaf, 0x39, 0x03, 0xe1, ++ 0x01, 0xf0, 0xa6, 0x7b, 0x64, 0xcf, 0x2e, 0x55, 0x8c, 0xc3, 0xc7, 0xfd, ++ 0x7c, 0x77, 0x3c, 0xd7, 0xeb, 0x7b, 0x45, 0xfe, 0xf9, 0x71, 0xa4, 0xd7, ++ 0x9f, 0x1d, 0xc9, 0x6e, 0x99, 0x4b, 0x72, 0xce, 0xb6, 0xf1, 0x08, 0xd7, ++ 0xcb, 0x3b, 0x43, 0x74, 0x48, 0x17, 0x30, 0x8e, 0x43, 0x01, 0xf8, 0x54, ++ 0xdd, 0x71, 0x27, 0x87, 0x67, 0xf8, 0x72, 0x92, 0xcb, 0x61, 0xff, 0x11, ++ 0xbf, 0xac, 0x11, 0xfc, 0xb2, 0xf6, 0xee, 0x29, 0xe1, 0x53, 0x70, 0x3f, ++ 0xbd, 0xa3, 0x32, 0x94, 0x0b, 0x2e, 0xeb, 0xed, 0xd1, 0xc8, 0x0f, 0x03, ++ 0xe1, 0xf5, 0x07, 0xc1, 0x87, 0xaa, 0x9f, 0x7f, 0xd4, 0x88, 0x76, 0xbb, ++ 0x1a, 0xd8, 0x37, 0x4e, 0xd8, 0x37, 0xd5, 0xc2, 0x3e, 0x56, 0xfd, 0xa4, ++ 0x42, 0x72, 0x5d, 0xf5, 0x86, 0x29, 0x0f, 0x11, 0x1f, 0x7c, 0xdb, 0xc0, ++ 0x46, 0xc2, 0x3c, 0x2e, 0x78, 0x1e, 0x08, 0xf3, 0xc7, 0xc7, 0x7e, 0xd1, ++ 0x8f, 0xaf, 0xbd, 0x9d, 0xea, 0x57, 0x43, 0x7d, 0xde, 0xfe, 0x8d, 0x30, ++ 0x9a, 0xcf, 0x6e, 0x83, 0x1d, 0xe7, 0x13, 0x88, 0xc7, 0x1f, 0xdc, 0xfe, ++ 0x49, 0xf5, 0x07, 0xb5, 0xef, 0xa3, 0x0f, 0x0f, 0x9c, 0xeb, 0xe3, 0xaf, ++ 0x5e, 0xf7, 0x65, 0xd6, 0xf1, 0x2f, 0x1f, 0x21, 0x3f, 0x69, 0x33, 0x93, ++ 0xfe, 0x0a, 0xf0, 0x9e, 0x80, 0x72, 0xc7, 0x79, 0x83, 0x67, 0x39, 0xae, ++ 0xfb, 0xfc, 0xd3, 0x66, 0xe2, 0x33, 0xe7, 0x23, 0xf8, 0x7e, 0xff, 0x0c, ++ 0xf8, 0xa1, 0x6b, 0x14, 0xce, 0xe3, 0xfa, 0xfb, 0x49, 0xbf, 0xf1, 0xee, ++ 0x3c, 0x86, 0xe7, 0xc1, 0x0a, 0xb7, 0xb6, 0x5f, 0x39, 0xee, 0x21, 0xc1, ++ 0x7f, 0x6b, 0x07, 0xd9, 0xc3, 0x51, 0x4f, 0x56, 0x0b, 0x78, 0xc0, 0xfe, ++ 0x00, 0x2f, 0x3f, 0xa5, 0xf6, 0xef, 0x18, 0xa8, 0x7d, 0xe0, 0x3a, 0xb6, ++ 0x8a, 0x76, 0x7d, 0xfb, 0xf3, 0xe9, 0x10, 0xa2, 0x97, 0xf3, 0x43, 0x39, ++ 0x3e, 0xce, 0x3f, 0x33, 0x8a, 0xce, 0x95, 0xae, 0x08, 0x4e, 0xe7, 0x30, ++ 0xdf, 0x04, 0xbc, 0xaf, 0x9c, 0x8f, 0xe0, 0x29, 0x43, 0x61, 0x04, 0xe8, ++ 0xa0, 0x4a, 0xdc, 0x47, 0xcf, 0x4f, 0xf3, 0xd0, 0xfd, 0xfb, 0xbc, 0xb2, ++ 0x8f, 0xd2, 0x2e, 0x03, 0x6f, 0x57, 0xd5, 0x20, 0xec, 0xc6, 0x40, 0x77, ++ 0x31, 0x48, 0x37, 0x48, 0x93, 0x68, 0x0f, 0x33, 0x6d, 0xea, 0x40, 0x79, ++ 0x02, 0xf5, 0xd5, 0x39, 0x19, 0x94, 0x7a, 0x83, 0x22, 0xaf, 0xd6, 0x3b, ++ 0x23, 0x7d, 0xe2, 0x39, 0x14, 0x91, 0xc5, 0xcf, 0x7d, 0x86, 0xe3, 0x45, ++ 0x09, 0xfb, 0x07, 0xc9, 0x29, 0x1e, 0x23, 0xf2, 0x65, 0xa7, 0x90, 0xe3, ++ 0x6a, 0xda, 0xae, 0xb6, 0xc3, 0x21, 0x7e, 0x6b, 0xda, 0x14, 0xb2, 0x23, ++ 0xf5, 0x88, 0x7d, 0x8a, 0xb3, 0x1e, 0x2c, 0xf5, 0xe5, 0x40, 0x8f, 0xd5, ++ 0x2e, 0xc5, 0x61, 0xc6, 0xf9, 0x34, 0xaf, 0x5e, 0x49, 0x76, 0xa4, 0xfa, ++ 0xcd, 0x4b, 0x90, 0xde, 0xe5, 0x3a, 0xaa, 0xf5, 0x6c, 0x16, 0xde, 0x87, ++ 0xba, 0x14, 0x95, 0xe6, 0xd3, 0x65, 0x86, 0x7d, 0x83, 0x70, 0xf0, 0x1f, ++ 0xcf, 0x4f, 0xee, 0xfa, 0x4f, 0x21, 0xa7, 0xe0, 0x9f, 0x35, 0x8a, 0xe4, ++ 0x4c, 0x12, 0xae, 0xff, 0x9e, 0x69, 0xe3, 0xf4, 0x03, 0xd9, 0x16, 0xe8, ++ 0xaf, 0xa6, 0x59, 0xd9, 0x44, 0xe3, 0x24, 0xca, 0x7b, 0x25, 0x5f, 0x9f, ++ 0x84, 0x13, 0x80, 0xc5, 0x88, 0xfa, 0x32, 0xb8, 0xef, 0xf3, 0xf2, 0x01, ++ 0xd6, 0x2f, 0xe7, 0x19, 0xb8, 0x7e, 0x39, 0x9f, 0x41, 0x59, 0x9c, 0x2f, ++ 0x75, 0x25, 0xda, 0xee, 0xcf, 0x45, 0x7c, 0xbf, 0xa5, 0xda, 0xf1, 0x9e, ++ 0x7e, 0xf9, 0xdb, 0xcc, 0xf0, 0xc8, 0xef, 0x90, 0xcb, 0xf0, 0xe6, 0xd6, ++ 0xa7, 0x37, 0x86, 0xf9, 0xdb, 0x90, 0xa6, 0x60, 0x5d, 0xa7, 0x32, 0xb9, ++ 0x1c, 0x5d, 0x8d, 0x7a, 0x69, 0x98, 0x67, 0xca, 0x36, 0xad, 0x3d, 0x24, ++ 0x75, 0xa7, 0x36, 0x3f, 0xa6, 0x4d, 0x9b, 0x4f, 0xdb, 0xaf, 0xcd, 0x8f, ++ 0x6f, 0xd7, 0xe6, 0xed, 0xaf, 0x6a, 0xf3, 0x26, 0x31, 0xae, 0x84, 0x13, ++ 0xde, 0x7b, 0x6d, 0xa3, 0xf8, 0xbd, 0x17, 0x53, 0xbc, 0xf7, 0xda, 0x82, ++ 0xf8, 0xbd, 0x17, 0xf3, 0x78, 0xef, 0xc5, 0x14, 0xef, 0xbd, 0xf8, 0x1d, ++ 0xef, 0xbd, 0x98, 0xc7, 0x7b, 0x2f, 0xe6, 0xf1, 0xde, 0x8b, 0x79, 0xbc, ++ 0xf7, 0x62, 0x8a, 0xf7, 0x5e, 0xfc, 0x3e, 0x47, 0xc0, 0xa9, 0x46, 0xe8, ++ 0x1d, 0x11, 0x0f, 0x68, 0x97, 0x61, 0x87, 0xcc, 0xd2, 0xce, 0x4e, 0xfb, ++ 0xa5, 0x7b, 0x51, 0x14, 0xf1, 0x4f, 0x69, 0x27, 0xed, 0x5e, 0x99, 0x46, ++ 0xf9, 0x3e, 0xbd, 0xce, 0x1c, 0x13, 0xe9, 0x75, 0x48, 0x77, 0x03, 0x72, ++ 0xc9, 0xbc, 0x61, 0xce, 0x29, 0x59, 0x43, 0xd0, 0x7e, 0xda, 0xb1, 0x21, ++ 0x16, 0xf1, 0xa6, 0xef, 0x24, 0x7d, 0xee, 0xaa, 0x17, 0xb9, 0x3e, 0xb7, ++ 0x26, 0xc3, 0x6c, 0x41, 0x3d, 0x43, 0xe7, 0xfa, 0xcf, 0x36, 0xa0, 0xf8, ++ 0x94, 0x32, 0xcc, 0xe9, 0xc8, 0x82, 0xf5, 0x76, 0x1b, 0x7a, 0x76, 0x13, ++ 0x1d, 0xe8, 0xbd, 0xc4, 0x37, 0x3a, 0xd7, 0xd9, 0xde, 0x99, 0xca, 0xf1, ++ 0x47, 0xfa, 0x0e, 0x66, 0x89, 0xa4, 0xfb, 0x49, 0x29, 0x9e, 0x77, 0x91, ++ 0x03, 0xe3, 0x31, 0xd0, 0xae, 0xc2, 0x36, 0x69, 0xed, 0x28, 0x81, 0x76, ++ 0x95, 0x40, 0x7b, 0x4a, 0x20, 0x1d, 0x48, 0x3b, 0xca, 0xe3, 0x86, 0x9e, ++ 0x58, 0xe4, 0xf7, 0xa7, 0xf6, 0x9a, 0x36, 0xe1, 0xfc, 0x4f, 0x09, 0x3d, ++ 0x19, 0x5b, 0x68, 0x22, 0xf9, 0x4b, 0xca, 0xd5, 0x85, 0xaa, 0x85, 0xe0, ++ 0xb4, 0xe6, 0x3e, 0x65, 0x07, 0x9e, 0x53, 0xa5, 0x59, 0x91, 0xd4, 0xbe, ++ 0xf7, 0x38, 0xc8, 0xdb, 0xfd, 0x9c, 0xb7, 0x32, 0x2d, 0xbf, 0x92, 0x49, ++ 0x72, 0x75, 0x5f, 0x7e, 0x93, 0xa2, 0x23, 0x3b, 0x8d, 0xd3, 0x41, 0xe7, ++ 0xd0, 0xad, 0x62, 0x4e, 0x09, 0x4a, 0x4f, 0xd7, 0xdd, 0x48, 0x23, 0xa1, ++ 0x3a, 0x3a, 0xc7, 0x2f, 0x5b, 0x74, 0x74, 0x2f, 0xb8, 0xfc, 0x47, 0x95, ++ 0xe4, 0x88, 0x51, 0x5b, 0x75, 0x9a, 0xf5, 0x8c, 0x76, 0x07, 0x6b, 0xe8, ++ 0x6b, 0xec, 0x9e, 0xc8, 0x00, 0x7b, 0xe0, 0x50, 0x4d, 0xfd, 0x6b, 0x0e, ++ 0x26, 0x05, 0xd8, 0x03, 0xc7, 0x68, 0xed, 0x54, 0x37, 0xad, 0x3b, 0x8c, ++ 0xf7, 0xeb, 0x79, 0x9b, 0x32, 0x35, 0xf5, 0x2a, 0x8a, 0xa6, 0x04, 0xc0, ++ 0x51, 0xcc, 0x5b, 0xc8, 0xa5, 0x4d, 0x6b, 0xb7, 0x26, 0x20, 0xff, 0xb9, ++ 0x35, 0xb4, 0x97, 0xe6, 0x7f, 0xeb, 0x01, 0x33, 0xf9, 0x5d, 0x54, 0xc0, ++ 0xf9, 0xe2, 0x80, 0x75, 0x57, 0x62, 0x06, 0xf8, 0x63, 0xa5, 0xc9, 0x71, ++ 0x23, 0xc2, 0xaf, 0xd2, 0x63, 0x88, 0x40, 0xbd, 0x56, 0xb9, 0x38, 0x7f, ++ 0x58, 0x83, 0xf6, 0x3c, 0xae, 0xd4, 0x33, 0x97, 0x35, 0xd2, 0x47, 0x77, ++ 0x95, 0x56, 0xe6, 0x88, 0x80, 0xf6, 0x17, 0xd3, 0x5b, 0x76, 0xeb, 0x00, ++ 0x6f, 0x17, 0x75, 0xdb, 0xb6, 0xe4, 0xda, 0xd0, 0xbe, 0xb4, 0x3d, 0xc1, ++ 0x0a, 0x74, 0x75, 0x9b, 0xe2, 0x89, 0x9a, 0x04, 0xfd, 0x9d, 0x8a, 0x70, ++ 0xde, 0x8f, 0xf4, 0x99, 0x60, 0xf0, 0xfe, 0xba, 0x18, 0xf9, 0xe5, 0xbe, ++ 0x11, 0x6c, 0x1d, 0xd4, 0x3b, 0xb5, 0xe9, 0xb9, 0x30, 0x92, 0xbb, 0x05, ++ 0x9d, 0x25, 0x18, 0xac, 0xc1, 0x88, 0xef, 0xed, 0x2d, 0x2a, 0xdd, 0x0b, ++ 0x50, 0x3f, 0x85, 0xfa, 0x20, 0x49, 0x0f, 0xdb, 0x5b, 0x06, 0x05, 0x27, ++ 0x5b, 0x7c, 0xeb, 0xf4, 0xe1, 0xff, 0x5b, 0x5a, 0x1f, 0xe0, 0x85, 0xfc, ++ 0x46, 0x7a, 0x2d, 0x47, 0x86, 0xdd, 0x8a, 0x72, 0x9c, 0x87, 0xaf, 0xb7, ++ 0x72, 0x9a, 0xe2, 0x22, 0x39, 0x59, 0xac, 0x67, 0x8d, 0x38, 0x57, 0x58, ++ 0x33, 0xef, 0xe7, 0x36, 0x91, 0x3f, 0x2d, 0xee, 0x0b, 0x72, 0x7d, 0x17, ++ 0x46, 0x1f, 0x1e, 0x6f, 0x43, 0xbb, 0x66, 0xe3, 0xc1, 0x04, 0x15, 0xf9, ++ 0xb8, 0xae, 0x6d, 0x77, 0x2c, 0xca, 0x17, 0xd1, 0xce, 0x27, 0x71, 0x3d, ++ 0x95, 0xdb, 0x47, 0xfe, 0x29, 0x17, 0xc6, 0xad, 0x7a, 0x5f, 0x65, 0x68, ++ 0x47, 0xfe, 0xb4, 0x75, 0x46, 0xd8, 0x24, 0x94, 0x3f, 0x9f, 0x36, 0xd8, ++ 0x67, 0x43, 0xfe, 0xee, 0x96, 0x27, 0x8c, 0x78, 0x2f, 0xa8, 0xd2, 0xbb, ++ 0x8d, 0x78, 0xef, 0xac, 0xdc, 0xbb, 0xdd, 0x88, 0xf6, 0xff, 0x9f, 0xec, ++ 0xd9, 0x4e, 0xdf, 0x97, 0xef, 0x29, 0xa5, 0xfb, 0xf6, 0x0a, 0x56, 0x4f, ++ 0xf7, 0xc8, 0xb3, 0x06, 0x7e, 0x4e, 0x4b, 0x78, 0x54, 0x4e, 0x57, 0xb6, ++ 0x59, 0x61, 0xde, 0x91, 0xd9, 0x9c, 0x6f, 0x54, 0x06, 0x73, 0x7f, 0x90, ++ 0x42, 0x35, 0xf7, 0xb5, 0xc1, 0xb8, 0xde, 0x3d, 0x4a, 0x3a, 0xae, 0xf7, ++ 0xa6, 0xa2, 0x7d, 0xc6, 0x52, 0xf8, 0xfe, 0xaa, 0xe0, 0x2f, 0x81, 0xfb, ++ 0xa3, 0xf7, 0xcd, 0x79, 0x85, 0x43, 0x50, 0xaf, 0xe4, 0xe1, 0x76, 0xd0, ++ 0x81, 0xf6, 0xc3, 0x7c, 0xef, 0x68, 0xda, 0x0f, 0xf3, 0xae, 0x24, 0x52, ++ 0x7a, 0xd3, 0x95, 0xb1, 0x74, 0xaf, 0x7a, 0x9f, 0x15, 0x8d, 0x23, 0x3e, ++ 0x91, 0x16, 0x70, 0x9f, 0x7d, 0x53, 0xe5, 0x7a, 0xb3, 0x76, 0xbe, 0x0f, ++ 0x2a, 0x8d, 0xde, 0xc1, 0xf3, 0x70, 0x9f, 0xbc, 0x62, 0xa0, 0x7d, 0x52, ++ 0x0b, 0xfc, 0x6b, 0x62, 0x06, 0xde, 0x93, 0x19, 0x9b, 0x0c, 0x69, 0x51, ++ 0xae, 0xaa, 0xa1, 0xd7, 0x55, 0x05, 0x21, 0x1a, 0x7a, 0x5e, 0xc8, 0xfc, ++ 0xf6, 0x09, 0xf4, 0xb7, 0x80, 0x0d, 0xd5, 0xe4, 0x6f, 0x9a, 0x3d, 0x42, ++ 0x53, 0xff, 0xe6, 0x9b, 0xc6, 0x06, 0xd0, 0x7f, 0x86, 0xaf, 0x9c, 0xf8, ++ 0xc8, 0x64, 0x8d, 0xff, 0x4a, 0xed, 0x5a, 0x97, 0x4d, 0x21, 0x3d, 0xda, ++ 0x74, 0xed, 0x77, 0x48, 0xd7, 0x12, 0x9d, 0x5d, 0xa7, 0x69, 0x5f, 0xcb, ++ 0xe6, 0xfa, 0xea, 0xe1, 0x3d, 0x78, 0xe7, 0xbf, 0x13, 0x9c, 0x19, 0xeb, ++ 0x30, 0xe2, 0x7d, 0xab, 0x52, 0xc7, 0xfd, 0x75, 0x16, 0x3a, 0xbb, 0xc4, ++ 0xf7, 0x4e, 0xfa, 0x0e, 0x0b, 0xd1, 0xec, 0xc3, 0xe1, 0x23, 0xec, 0x7f, ++ 0xe2, 0xe7, 0xa2, 0x81, 0xf4, 0xf3, 0x52, 0x3f, 0xbd, 0x10, 0xff, 0x3d, ++ 0xa2, 0xbf, 0x73, 0x11, 0x10, 0x2d, 0xc6, 0x0d, 0x57, 0xb9, 0x7e, 0xc1, ++ 0xa9, 0x95, 0x3b, 0x3a, 0xe8, 0xfe, 0xc9, 0x38, 0x1e, 0x6a, 0x85, 0xbe, ++ 0xa7, 0x36, 0x95, 0xeb, 0x7b, 0x6a, 0x5d, 0x1d, 0xc6, 0x7a, 0x0b, 0xc1, ++ 0x5f, 0x1f, 0x07, 0x20, 0xa9, 0x6b, 0x51, 0x48, 0x9f, 0x07, 0xf5, 0x4d, ++ 0x71, 0x91, 0x3c, 0xbf, 0x16, 0xbf, 0xef, 0x37, 0xf8, 0xf4, 0x2c, 0x8c, ++ 0xf7, 0x77, 0x05, 0xcb, 0x8f, 0xab, 0xa5, 0xb8, 0x5f, 0x02, 0xcb, 0xeb, ++ 0x60, 0xdd, 0x28, 0x67, 0xd4, 0xa1, 0xbe, 0x86, 0xf4, 0x4c, 0xb3, 0x3e, ++ 0x23, 0x3d, 0x93, 0x1c, 0x47, 0xf4, 0x2f, 0xe9, 0x74, 0xc5, 0x56, 0xad, ++ 0xfe, 0xa8, 0x0e, 0xf5, 0x3a, 0x7e, 0xf8, 0xbc, 0x39, 0xdb, 0x46, 0xfb, ++ 0xba, 0x6a, 0xcf, 0xbe, 0x63, 0x43, 0x01, 0x3e, 0xf3, 0x8a, 0x22, 0xd2, ++ 0x71, 0x1f, 0xd5, 0x78, 0xe6, 0x18, 0x4a, 0xd3, 0xae, 0xa6, 0x37, 0xc9, ++ 0xe7, 0x2f, 0x57, 0xea, 0xc8, 0xee, 0xdd, 0xfb, 0xe6, 0x51, 0xa2, 0xb7, ++ 0xde, 0x4a, 0x3d, 0xd1, 0xf5, 0xf7, 0xc1, 0xa5, 0xce, 0xc1, 0xf5, 0x9a, ++ 0x81, 0x74, 0xb8, 0x1c, 0xd6, 0x65, 0x82, 0xf1, 0x97, 0xef, 0x57, 0xec, ++ 0x6e, 0x85, 0xd7, 0x43, 0xf8, 0x0c, 0x45, 0xfa, 0x0c, 0x80, 0x4f, 0x5c, ++ 0x3f, 0x70, 0x93, 0xf0, 0xea, 0x83, 0x5f, 0x40, 0xf9, 0x0a, 0xfc, 0x47, ++ 0x16, 0xfa, 0x13, 0x28, 0x6e, 0x6f, 0x62, 0x7f, 0x70, 0x09, 0x80, 0xa7, ++ 0x1c, 0x27, 0x00, 0x5e, 0x6c, 0xa2, 0x16, 0x1e, 0xcb, 0x9d, 0xb6, 0x77, ++ 0x90, 0xff, 0x2c, 0x3f, 0xae, 0x32, 0xf7, 0x0f, 0x58, 0xff, 0x0a, 0x5c, ++ 0x27, 0xce, 0x03, 0xd6, 0x89, 0xf3, 0x98, 0x7b, 0x85, 0xeb, 0x4d, 0xa4, ++ 0x3d, 0x61, 0xc1, 0x15, 0x3d, 0xe5, 0xfb, 0xe8, 0xa6, 0x08, 0xe0, 0x95, ++ 0x81, 0xfb, 0x4e, 0xbb, 0x4f, 0xfb, 0xe8, 0xa8, 0x88, 0xef, 0x9b, 0xf9, ++ 0x57, 0xa2, 0xa8, 0xdd, 0x8f, 0x45, 0x4f, 0xdf, 0x47, 0x47, 0x72, 0xfe, ++ 0x92, 0x6f, 0xfb, 0xf6, 0xd1, 0x5d, 0x44, 0x5f, 0x4b, 0xb3, 0x43, 0x07, ++ 0xa3, 0xfe, 0x19, 0xfe, 0x9d, 0x4d, 0x7c, 0x41, 0xf0, 0xd7, 0x81, 0xe5, ++ 0x52, 0x17, 0xe7, 0xa3, 0x4e, 0xed, 0x39, 0x33, 0xfc, 0x97, 0x13, 0xc9, ++ 0xef, 0xa8, 0xd7, 0x92, 0x44, 0x72, 0x45, 0xdf, 0x39, 0x64, 0xd5, 0x96, ++ 0xaf, 0x09, 0x4d, 0x8a, 0xc6, 0x72, 0xa7, 0xd0, 0xdb, 0x49, 0x7e, 0xec, ++ 0x14, 0xf5, 0xe4, 0x38, 0xa5, 0x50, 0x6e, 0x1b, 0x84, 0x74, 0x3d, 0x2c, ++ 0x0a, 0xf5, 0xb1, 0x1b, 0x9a, 0x47, 0x24, 0x74, 0xfa, 0xc9, 0x2b, 0xce, ++ 0xf5, 0x86, 0x28, 0xd4, 0x17, 0x26, 0xac, 0x1b, 0x44, 0x69, 0xa9, 0xd9, ++ 0x1a, 0x85, 0xe7, 0x48, 0xe9, 0x3a, 0xb5, 0x08, 0xcf, 0xc7, 0x93, 0xf7, ++ 0x44, 0x47, 0x4d, 0x44, 0xfd, 0xfc, 0x7a, 0xc3, 0xe0, 0xd9, 0xd0, 0xf5, ++ 0xc9, 0x9f, 0x67, 0x25, 0xb0, 0x71, 0x98, 0x2f, 0xa4, 0xf4, 0xd4, 0xe6, ++ 0xa0, 0x85, 0xfe, 0x7a, 0x6e, 0x99, 0x6e, 0xc8, 0xe6, 0xf6, 0xc5, 0xda, ++ 0x5f, 0x7e, 0x48, 0xe7, 0xda, 0x45, 0xdd, 0x9b, 0x61, 0x0b, 0x71, 0xdf, ++ 0xad, 0x3f, 0x10, 0x86, 0xae, 0x37, 0xd5, 0xeb, 0xdf, 0xcb, 0xb1, 0x82, ++ 0x48, 0x72, 0x77, 0x84, 0x73, 0x7d, 0x36, 0xd9, 0x51, 0xb7, 0xef, 0xb6, ++ 0x22, 0xdc, 0xac, 0xdb, 0xc7, 0xa3, 0x9e, 0xfa, 0xc1, 0x6c, 0x82, 0x65, ++ 0x9f, 0xfc, 0x50, 0xb5, 0xbe, 0x30, 0x1a, 0xf5, 0x62, 0x35, 0xff, 0x75, ++ 0xf4, 0x31, 0x3c, 0xf7, 0x9d, 0xeb, 0x0c, 0x51, 0x28, 0x7f, 0x7e, 0xfe, ++ 0x47, 0x38, 0x17, 0x15, 0x3a, 0xd7, 0x48, 0x6e, 0x38, 0x6b, 0x66, 0x74, ++ 0x5f, 0x3a, 0xbb, 0x2b, 0xc4, 0x8d, 0xf6, 0xfb, 0xb3, 0x0a, 0x73, 0xa0, ++ 0x7d, 0x67, 0xa5, 0x7a, 0x78, 0xbc, 0x55, 0x73, 0xce, 0xb6, 0x2f, 0xc0, ++ 0x79, 0xec, 0x89, 0x76, 0x3e, 0xc8, 0xc7, 0x77, 0xef, 0x8e, 0xc1, 0xf1, ++ 0xed, 0x2e, 0xf2, 0xcf, 0x74, 0xae, 0x1b, 0x19, 0xde, 0x9f, 0x1e, 0x45, ++ 0xa6, 0xab, 0xb6, 0x72, 0xb9, 0x6e, 0xb7, 0xd4, 0xe3, 0x0a, 0x7d, 0x2f, ++ 0xca, 0xf3, 0x98, 0x47, 0x79, 0x9e, 0x8d, 0xe2, 0xf2, 0x3c, 0xe6, 0x51, ++ 0x9e, 0xc7, 0x14, 0xe5, 0x79, 0xfc, 0xfe, 0x5c, 0x3a, 0xd7, 0xaf, 0x0c, ++ 0x6f, 0xea, 0x49, 0xc7, 0xfb, 0xa8, 0x6b, 0x3a, 0x4b, 0xad, 0xa7, 0x73, ++ 0xd7, 0x92, 0x8a, 0xf2, 0xfa, 0xad, 0x4a, 0xb0, 0x1d, 0xf9, 0xcf, 0xad, ++ 0x8a, 0x3d, 0x1a, 0xf5, 0x63, 0xec, 0x8f, 0x11, 0xfc, 0xbc, 0x0d, 0xc0, ++ 0xaf, 0x4c, 0xf3, 0x7a, 0x40, 0xe6, 0xf2, 0xa3, 0xfb, 0xa9, 0x57, 0x4c, ++ 0xcc, 0xdf, 0xcf, 0x6c, 0x1a, 0x8b, 0xd0, 0xe4, 0x67, 0x98, 0x62, 0x35, ++ 0xf5, 0x0b, 0xad, 0x89, 0x9a, 0xf2, 0x9f, 0xc4, 0x8c, 0xd6, 0x94, 0x5f, ++ 0x6b, 0x4b, 0xd7, 0xe4, 0xaf, 0x4f, 0x9d, 0xa4, 0xa9, 0x7f, 0x83, 0x7d, ++ 0x9a, 0x26, 0xff, 0xd3, 0x89, 0xd7, 0x6a, 0xea, 0xcf, 0x71, 0xcc, 0xd1, ++ 0xe4, 0xe7, 0xcd, 0x5a, 0xa4, 0xa9, 0x3f, 0xbf, 0xa8, 0x54, 0x53, 0x7e, ++ 0xf3, 0xc2, 0x95, 0x9a, 0xf2, 0x45, 0xce, 0xd5, 0x9a, 0xfc, 0x92, 0xca, ++ 0x9f, 0x6b, 0xea, 0x2f, 0xad, 0x5f, 0xa7, 0x29, 0x77, 0x30, 0xab, 0x1e, ++ 0xcf, 0xbd, 0x76, 0xbc, 0x67, 0x01, 0xdc, 0x5f, 0xc1, 0x7b, 0x16, 0xa4, ++ 0xb7, 0xbe, 0x35, 0xd2, 0xe2, 0x8f, 0xd7, 0xdc, 0x19, 0xba, 0xfa, 0xfe, ++ 0xf4, 0xf4, 0x1f, 0x0b, 0xfa, 0x1d, 0x3d, 0xc1, 0xf1, 0x27, 0xa4, 0x8f, ++ 0x78, 0x1d, 0xa7, 0x43, 0x48, 0x1d, 0x28, 0x42, 0x9c, 0x13, 0xe7, 0x4a, ++ 0x1c, 0xf3, 0x2a, 0xfc, 0x9e, 0xdb, 0x11, 0x8b, 0x74, 0x13, 0x58, 0x2f, ++ 0xb0, 0x3c, 0x37, 0xe4, 0xc8, 0x65, 0x1b, 0xe0, 0xf0, 0xa6, 0xe7, 0xcd, ++ 0x4b, 0xf4, 0xc0, 0x1f, 0x72, 0x27, 0x1c, 0xc9, 0x1c, 0x01, 0xf9, 0x6d, ++ 0x39, 0x45, 0x3c, 0x3f, 0xe5, 0xc8, 0x73, 0x49, 0x90, 0xdf, 0xf9, 0xfc, ++ 0x7d, 0x3c, 0x7f, 0xcd, 0x91, 0xcb, 0x58, 0x3e, 0x6c, 0xc2, 0x7c, 0x9e, ++ 0x9f, 0xc7, 0x48, 0xe4, 0xf0, 0xe4, 0x7c, 0xb5, 0xd8, 0x05, 0xf3, 0xce, ++ 0x9d, 0x9a, 0xb4, 0xc9, 0xce, 0xf5, 0x24, 0xfd, 0xfa, 0x69, 0xca, 0x14, ++ 0xe1, 0x80, 0xfe, 0x8d, 0x08, 0x07, 0x4c, 0xbd, 0x40, 0x9f, 0x98, 0x1e, ++ 0x01, 0xfa, 0xc4, 0xf4, 0x55, 0xa0, 0xcf, 0x0a, 0x03, 0x63, 0xc7, 0x80, ++ 0x3e, 0x31, 0x3d, 0x0e, 0xf7, 0x4d, 0xfc, 0xfe, 0x07, 0xb8, 0x6f, 0x62, ++ 0xfa, 0x26, 0xdc, 0x37, 0x31, 0x7d, 0x1b, 0xee, 0x9b, 0x98, 0x76, 0xc0, ++ 0x7d, 0x13, 0xd3, 0x77, 0x1b, 0x17, 0x52, 0xfa, 0xc7, 0x46, 0x27, 0xb5, ++ 0xfb, 0xa0, 0xb1, 0x92, 0xd2, 0x0f, 0x1b, 0xeb, 0xe9, 0xfb, 0x5f, 0x1a, ++ 0x1b, 0x28, 0xfd, 0xb8, 0xd1, 0x45, 0xdf, 0x8d, 0x39, 0x52, 0x7f, 0xe1, ++ 0x25, 0xfd, 0x8b, 0xb4, 0x33, 0xd5, 0xa1, 0x7d, 0x0f, 0xf5, 0x73, 0x07, ++ 0x0d, 0x17, 0xfc, 0xed, 0xb0, 0xd2, 0x4e, 0x28, 0xed, 0x82, 0x4d, 0xf5, ++ 0xac, 0x33, 0x04, 0xf7, 0x69, 0xa7, 0x3e, 0xe2, 0x8c, 0xc9, 0x67, 0xef, ++ 0x1b, 0x98, 0xcf, 0xea, 0xd9, 0x19, 0x3f, 0x39, 0x6c, 0x73, 0x8c, 0x23, ++ 0x22, 0x87, 0xf4, 0x1a, 0xc3, 0xac, 0xc4, 0xaf, 0xc5, 0xf7, 0xe9, 0xca, ++ 0xbc, 0x78, 0x34, 0xfd, 0x5d, 0x3b, 0xde, 0x19, 0x9d, 0x03, 0xf3, 0x9b, ++ 0x9f, 0x51, 0xbe, 0x3e, 0x1c, 0xf8, 0xc7, 0xd4, 0x6f, 0xeb, 0x0d, 0x48, ++ 0x2f, 0xef, 0x0b, 0x3f, 0xd5, 0xc0, 0xfe, 0xcf, 0x09, 0x3a, 0xd1, 0x4d, ++ 0x70, 0x0c, 0xc3, 0x7e, 0xf3, 0x4d, 0xdc, 0x0f, 0x2f, 0xdf, 0xc4, 0xfd, ++ 0xec, 0xf2, 0xf5, 0x9d, 0x4d, 0xc8, 0x8f, 0x9a, 0xbe, 0x62, 0x36, 0xf4, ++ 0xa3, 0x39, 0x1c, 0x6a, 0x24, 0xfe, 0xd4, 0x74, 0x8f, 0xde, 0x8d, 0x7a, ++ 0x4a, 0xe5, 0x4b, 0x46, 0xf9, 0xbc, 0xc1, 0x8c, 0xf2, 0x4d, 0x5f, 0x75, ++ 0x90, 0x5f, 0x5e, 0xbe, 0xd5, 0x1e, 0x43, 0xe7, 0x8d, 0xc8, 0xf7, 0xd9, ++ 0xcf, 0xf1, 0xcf, 0xcf, 0x5f, 0x46, 0xda, 0xb3, 0xa5, 0x9f, 0x4c, 0xc1, ++ 0x97, 0x9d, 0x33, 0x50, 0x0e, 0xc8, 0xb3, 0x18, 0x6d, 0x41, 0x01, 0xf6, ++ 0x77, 0xb4, 0x5b, 0x1f, 0x0e, 0xfd, 0x40, 0xce, 0x87, 0xe1, 0x78, 0xd2, ++ 0x4e, 0xbe, 0xf3, 0x2b, 0xe6, 0xd5, 0x8d, 0xf7, 0xd9, 0xc3, 0xf3, 0x4d, ++ 0x1d, 0x89, 0xa8, 0x27, 0xc8, 0xbb, 0xcd, 0x64, 0xf7, 0xf7, 0xff, 0x91, ++ 0x76, 0x6f, 0xe5, 0xcb, 0x0e, 0x15, 0xcf, 0x13, 0xe9, 0xe7, 0x23, 0xc7, ++ 0x91, 0xf3, 0x0d, 0xd5, 0x43, 0x7f, 0x19, 0x3e, 0x3f, 0x9e, 0x7c, 0xab, ++ 0x27, 0x1d, 0xfd, 0x1a, 0x9a, 0x6a, 0x2d, 0xd4, 0x5f, 0x34, 0x7c, 0x37, ++ 0x66, 0x50, 0x3d, 0x87, 0x4a, 0xed, 0x3c, 0xe9, 0xa8, 0x07, 0xce, 0xab, ++ 0xb1, 0xd8, 0x51, 0xbf, 0x2d, 0xed, 0xed, 0xd1, 0x62, 0xdd, 0x50, 0x8f, ++ 0xd6, 0x59, 0xf0, 0xa5, 0x93, 0xfc, 0x0d, 0xf2, 0x84, 0xbf, 0x01, 0xf6, ++ 0x63, 0xe2, 0xe5, 0x2e, 0xec, 0x27, 0x6f, 0xb0, 0x37, 0x56, 0x8f, 0xeb, ++ 0xaf, 0x37, 0xda, 0x51, 0x1f, 0xfa, 0xa8, 0x02, 0xed, 0x33, 0x7c, 0xf6, ++ 0x7f, 0xac, 0x1f, 0xe2, 0xb7, 0x7f, 0x71, 0x9e, 0xd8, 0x6f, 0xf2, 0xd7, ++ 0x30, 0x5f, 0x94, 0xdb, 0x1d, 0x0e, 0x82, 0xef, 0x3c, 0x79, 0x7f, 0xb3, ++ 0x89, 0xbc, 0x38, 0x9f, 0x99, 0x69, 0x3a, 0xe9, 0xaf, 0x54, 0x91, 0xff, ++ 0xdd, 0x78, 0xe7, 0x52, 0xc4, 0x7b, 0x51, 0x90, 0xf5, 0xaf, 0x21, 0xb4, ++ 0xcf, 0x47, 0xc4, 0xa3, 0x9e, 0x63, 0x8e, 0x90, 0xdb, 0xbf, 0x83, 0x5e, ++ 0xca, 0xfe, 0x67, 0xe8, 0xc5, 0xc1, 0xf1, 0x3d, 0x8c, 0x91, 0x3e, 0x2d, ++ 0x90, 0x6e, 0x24, 0x5e, 0x24, 0x9e, 0x07, 0xa2, 0x23, 0x89, 0x77, 0x3f, ++ 0x7f, 0x2d, 0xc2, 0x73, 0x9f, 0xff, 0x95, 0xe8, 0x27, 0x90, 0xbe, 0x06, ++ 0xa2, 0x2b, 0x49, 0x4f, 0xf9, 0x26, 0x8e, 0x77, 0xc4, 0x2b, 0xfa, 0xd1, ++ 0x48, 0x3a, 0x52, 0xbe, 0xf4, 0x6c, 0xa7, 0x75, 0xd4, 0x98, 0xe8, 0x9c, ++ 0x93, 0x74, 0x14, 0x48, 0x07, 0x57, 0xd3, 0x11, 0xa7, 0xcb, 0xa6, 0xdb, ++ 0x4d, 0xd4, 0xdf, 0xd5, 0x74, 0xe4, 0xc3, 0x3f, 0xc2, 0xe3, 0x9f, 0xa7, ++ 0xa3, 0x0e, 0x15, 0xcf, 0xdd, 0x7f, 0x94, 0x7e, 0x6e, 0xe9, 0x61, 0x33, ++ 0xc3, 0xa1, 0xa8, 0xe1, 0x1a, 0xe7, 0xb9, 0x6c, 0xf4, 0x07, 0xba, 0x62, ++ 0x3b, 0x86, 0xf9, 0x72, 0x36, 0x6d, 0x26, 0x92, 0x94, 0x2c, 0x5f, 0x37, ++ 0x40, 0x79, 0x20, 0x7d, 0xc9, 0xfa, 0x7b, 0xb0, 0xfe, 0x90, 0xab, 0xeb, ++ 0x3b, 0xbf, 0xec, 0x31, 0x84, 0xfb, 0xd1, 0x65, 0x9e, 0x38, 0x03, 0x5f, ++ 0x1f, 0xa0, 0xfe, 0x1b, 0xc2, 0x2f, 0xfe, 0x0d, 0xb3, 0xf4, 0xf7, 0x70, ++ 0x58, 0xd2, 0x81, 0x0e, 0x66, 0x08, 0x3e, 0x7c, 0x6b, 0x21, 0xa7, 0xaf, ++ 0x59, 0x89, 0x2a, 0xd9, 0x33, 0x66, 0xa4, 0xad, 0x20, 0xf9, 0x9e, 0x59, ++ 0xb8, 0x7c, 0x6c, 0x83, 0xff, 0x91, 0xbe, 0x4d, 0xd8, 0xd7, 0xaf, 0x13, ++ 0xed, 0x66, 0x7e, 0x5b, 0xd4, 0x8c, 0xe3, 0xcc, 0x1c, 0xac, 0x95, 0xbf, ++ 0xaf, 0x13, 0x72, 0xf7, 0xac, 0x00, 0x7b, 0xfb, 0x75, 0x69, 0x3f, 0x21, ++ 0x39, 0xfc, 0xba, 0x00, 0x39, 0xfb, 0x58, 0x8e, 0xb0, 0xc3, 0x27, 0xb2, ++ 0x44, 0x7e, 0xbf, 0xde, 0x44, 0xf2, 0x6f, 0x81, 0xd8, 0x8f, 0x71, 0x02, ++ 0xdf, 0x23, 0x6c, 0x2a, 0xcb, 0x05, 0xb8, 0x17, 0x32, 0xa7, 0x1e, 0x0f, ++ 0x81, 0x57, 0x2f, 0x19, 0x1d, 0xd8, 0xdf, 0x4f, 0x98, 0x8b, 0xf2, 0xd7, ++ 0x32, 0x37, 0xa5, 0xd7, 0x33, 0x2f, 0xc9, 0x01, 0x37, 0xc0, 0x81, 0x81, ++ 0xf9, 0x9f, 0x32, 0x46, 0xfe, 0xa3, 0x47, 0x43, 0x6e, 0x2c, 0x5e, 0x05, ++ 0xfd, 0xcd, 0xc8, 0x9c, 0x91, 0x8c, 0xdf, 0x6b, 0x4c, 0x3d, 0x09, 0x46, ++ 0x1d, 0x7a, 0x07, 0x3a, 0xff, 0x84, 0xfb, 0xb2, 0x4e, 0x75, 0x7e, 0x82, ++ 0x72, 0xe6, 0xc5, 0x78, 0xe7, 0x28, 0xbc, 0x1f, 0x1f, 0x29, 0xb0, 0x91, ++ 0x1c, 0x76, 0xc4, 0x34, 0x82, 0xe4, 0x42, 0xdc, 0x4f, 0x06, 0x3f, 0x7d, ++ 0xe5, 0xef, 0xe1, 0x1c, 0x4d, 0x86, 0x73, 0xee, 0x28, 0x9c, 0xb3, 0x98, ++ 0xbe, 0x06, 0xe7, 0x6c, 0x32, 0x9c, 0x77, 0xaf, 0xc3, 0x39, 0x8b, 0xf9, ++ 0xeb, 0x52, 0xd7, 0x31, 0x6c, 0x37, 0xd3, 0xa6, 0xf5, 0xef, 0x91, 0xed, ++ 0xaf, 0xb7, 0xce, 0x60, 0xfa, 0x41, 0x03, 0x9f, 0x63, 0xd7, 0x8f, 0x3f, ++ 0x34, 0x0c, 0xf5, 0x58, 0x6f, 0x44, 0x8c, 0x2a, 0x40, 0xbc, 0xbd, 0x11, ++ 0x31, 0xa1, 0x00, 0xd7, 0xfb, 0x46, 0x44, 0xb4, 0x8e, 0xa7, 0x41, 0x46, ++ 0x4a, 0xc7, 0xbd, 0x90, 0xdc, 0x9f, 0xdc, 0x2a, 0xe9, 0xd5, 0x37, 0xde, ++ 0x4c, 0x1a, 0x2f, 0x10, 0xbe, 0x12, 0x9e, 0x81, 0x70, 0x94, 0xf0, 0xfd, ++ 0x27, 0xe0, 0xa9, 0x4c, 0xe8, 0x07, 0x9e, 0xe7, 0xf0, 0x0c, 0x1e, 0x82, ++ 0x7e, 0x09, 0xef, 0x85, 0xc5, 0x24, 0xa1, 0x9d, 0x51, 0xc4, 0xd3, 0x85, ++ 0x70, 0x3e, 0x58, 0xfb, 0xc2, 0xb8, 0x68, 0x5c, 0x47, 0x8d, 0x89, 0xc3, ++ 0x25, 0xaf, 0x61, 0x0a, 0xa5, 0xf9, 0x0d, 0x93, 0x98, 0x3e, 0x93, 0xec, ++ 0x4c, 0x2e, 0x84, 0xef, 0xe7, 0xb8, 0x04, 0x54, 0x38, 0x07, 0xe8, 0xd9, ++ 0x98, 0x7e, 0x3a, 0xe5, 0x6f, 0x17, 0xb4, 0x95, 0x1a, 0xed, 0x1c, 0x84, ++ 0xf3, 0xb8, 0x90, 0xe1, 0x4d, 0x01, 0x89, 0x8c, 0x7d, 0xb6, 0xad, 0x29, ++ 0x0c, 0xfd, 0x33, 0x2f, 0x3e, 0xa3, 0xda, 0xf1, 0x5e, 0x53, 0xa3, 0xda, ++ 0x36, 0xd9, 0x51, 0x4f, 0xfe, 0x86, 0xca, 0xe3, 0x82, 0xbe, 0x3d, 0x9a, ++ 0x80, 0xf6, 0x4d, 0xb6, 0xb3, 0x7f, 0x7f, 0xe9, 0x1a, 0x93, 0x84, 0x9f, ++ 0x8b, 0xd6, 0xb1, 0xf9, 0x1a, 0x07, 0xed, 0x67, 0x86, 0xd6, 0xd9, 0x28, ++ 0x9f, 0x5c, 0x33, 0x2c, 0x88, 0xfb, 0x19, 0x93, 0x79, 0x21, 0x63, 0x60, ++ 0x39, 0x27, 0x27, 0x98, 0xf3, 0x99, 0x61, 0x41, 0x9c, 0x3f, 0x4a, 0x7c, ++ 0x41, 0x3b, 0x7e, 0xee, 0x42, 0x3f, 0x39, 0xc0, 0xd7, 0xe2, 0xee, 0x0f, ++ 0xa6, 0x7b, 0x4d, 0xf6, 0x70, 0xc7, 0x18, 0x5c, 0x0f, 0x2b, 0x60, 0x9a, ++ 0x7b, 0x81, 0xd4, 0x5f, 0xf4, 0x0e, 0x56, 0xe9, 0x7c, 0xc8, 0x67, 0x29, ++ 0x0f, 0xe1, 0xfd, 0xbd, 0xe0, 0xb8, 0x81, 0xee, 0xef, 0xbd, 0x05, 0x8c, ++ 0x97, 0xc7, 0x70, 0x7b, 0x65, 0xef, 0xf1, 0xcb, 0x2a, 0xee, 0xf7, 0xc2, ++ 0x50, 0x85, 0x0d, 0x4a, 0xf4, 0xc5, 0xcd, 0x04, 0xc5, 0xe8, 0x98, 0xcd, ++ 0x4f, 0x9e, 0x36, 0xdb, 0x82, 0x99, 0xcd, 0x8f, 0x6e, 0x43, 0x52, 0x23, ++ 0x35, 0xf9, 0x50, 0xfb, 0x50, 0x4d, 0xfd, 0xf0, 0x89, 0x49, 0x9a, 0xf2, ++ 0x08, 0xc7, 0x18, 0x4d, 0xf9, 0xa0, 0x59, 0x19, 0x9a, 0xfc, 0x90, 0xa2, ++ 0xc9, 0x9a, 0xfa, 0xd1, 0x0b, 0xa7, 0x6b, 0xf2, 0xb1, 0xce, 0xeb, 0x34, ++ 0xf5, 0xe3, 0x2a, 0xe7, 0x6a, 0xf2, 0x92, 0x1f, 0xc5, 0xf1, 0x4f, 0x2c, ++ 0xbe, 0x7e, 0xb1, 0xa6, 0xfd, 0xf0, 0x86, 0x32, 0x4d, 0xfd, 0x44, 0x57, ++ 0x95, 0xa6, 0x5c, 0x0d, 0x0e, 0xdb, 0x41, 0x71, 0xa7, 0x2e, 0x47, 0x47, ++ 0x6a, 0x14, 0xf2, 0x2b, 0xfe, 0x37, 0x62, 0xe3, 0x1a, 0x4d, 0xbd, 0xdf, ++ 0x84, 0xf1, 0x38, 0x90, 0x59, 0x96, 0xe5, 0xb3, 0x71, 0x1f, 0x8e, 0x6c, ++ 0xb9, 0x43, 0x3b, 0x2f, 0xf5, 0x4d, 0x85, 0xe2, 0x3a, 0x6d, 0x9c, 0x0f, ++ 0xba, 0xe0, 0x7f, 0x88, 0xdf, 0xc2, 0x18, 0x2d, 0x5f, 0x9c, 0x61, 0xd5, ++ 0xea, 0x1b, 0xe2, 0xea, 0xf5, 0x9a, 0xfc, 0x8a, 0x09, 0x82, 0x0f, 0x8e, ++ 0x67, 0xe3, 0x89, 0x0f, 0x7e, 0x1f, 0x9e, 0x9d, 0x63, 0x34, 0x78, 0x0e, ++ 0x84, 0x07, 0xe0, 0xdd, 0xee, 0xc5, 0xfa, 0x70, 0xae, 0xba, 0x20, 0x5f, ++ 0xf8, 0xfb, 0x72, 0x3d, 0x9e, 0xfb, 0x68, 0x57, 0xf0, 0x9f, 0x3f, 0xda, ++ 0x15, 0xfc, 0xd7, 0x8b, 0x76, 0x05, 0xff, 0x3c, 0xda, 0x15, 0xfc, 0xeb, ++ 0xa3, 0x5d, 0xc1, 0xbf, 0x1c, 0xed, 0x0a, 0xfe, 0xe5, 0x99, 0xc7, 0xb5, ++ 0x78, 0xce, 0xee, 0xd0, 0xe2, 0x79, 0xc2, 0x87, 0x5a, 0x3c, 0x4b, 0xfa, ++ 0x1b, 0x08, 0x1f, 0x93, 0x3a, 0xb5, 0x74, 0x10, 0x88, 0x8f, 0x29, 0x67, ++ 0x03, 0xe8, 0x42, 0xe0, 0x61, 0x21, 0xfc, 0xaf, 0x3f, 0x3c, 0xd0, 0x15, ++ 0x01, 0xe8, 0x7f, 0x46, 0x3d, 0x23, 0xbd, 0xd9, 0xf7, 0xe1, 0xe5, 0x91, ++ 0x09, 0x42, 0xcf, 0x23, 0xf0, 0x02, 0x78, 0xa0, 0xb8, 0xbe, 0xde, 0x61, ++ 0xa1, 0x84, 0x87, 0x47, 0xc5, 0xfc, 0xf3, 0xbd, 0x63, 0x29, 0x2e, 0xb6, ++ 0x10, 0xf5, 0x66, 0x89, 0xbe, 0xf5, 0x3c, 0x2a, 0xce, 0xdd, 0x7f, 0x1b, ++ 0xe4, 0xdc, 0x85, 0xfb, 0xf7, 0x75, 0x5b, 0x46, 0x0c, 0xf2, 0xa3, 0xa9, ++ 0x8c, 0xdb, 0x35, 0x67, 0xd6, 0xe8, 0xec, 0x5e, 0xe8, 0xfe, 0xb7, 0x01, ++ 0xf8, 0x1f, 0x3b, 0xda, 0xf9, 0x24, 0xd6, 0x5f, 0x38, 0xe8, 0x72, 0x82, ++ 0x11, 0xe9, 0xa1, 0xc7, 0x39, 0x0a, 0xef, 0x93, 0x7f, 0x12, 0x7a, 0x92, ++ 0x40, 0x3f, 0x4e, 0x17, 0x88, 0x03, 0x14, 0x87, 0x70, 0x87, 0x4a, 0xf1, ++ 0x37, 0x27, 0x74, 0x2d, 0x0a, 0xf2, 0xe5, 0x97, 0xe3, 0x9d, 0xcf, 0x61, ++ 0x3f, 0xb7, 0xa4, 0xd5, 0x13, 0x9d, 0xc6, 0xb0, 0xa2, 0x7d, 0xcb, 0x61, ++ 0x7e, 0x25, 0xbf, 0x0b, 0x22, 0x3b, 0x4e, 0xc9, 0x70, 0x1e, 0xaf, 0xcb, ++ 0xd2, 0x3a, 0x29, 0xce, 0x41, 0xf2, 0xbb, 0x92, 0x38, 0xee, 0x47, 0xf4, ++ 0xd2, 0x04, 0x61, 0x17, 0xb6, 0x73, 0x7f, 0xa2, 0x57, 0x26, 0x70, 0x79, ++ 0x36, 0xd4, 0x6e, 0x25, 0xbf, 0xe3, 0xd2, 0x34, 0x1e, 0xc7, 0x01, 0xd7, ++ 0xae, 0x84, 0x92, 0x71, 0x08, 0x9f, 0x37, 0xcd, 0xa3, 0x10, 0x3e, 0xad, ++ 0xdc, 0x6e, 0xd2, 0x89, 0xf1, 0xc2, 0x83, 0x7d, 0xf1, 0xc2, 0x28, 0x6f, ++ 0xa2, 0x7c, 0x17, 0x2f, 0xe4, 0xab, 0xa6, 0x3f, 0x9b, 0x4c, 0xb8, 0x8e, ++ 0x51, 0x5b, 0x99, 0xe6, 0x9c, 0x1c, 0xed, 0x36, 0x69, 0xfc, 0x5e, 0xc7, ++ 0xee, 0xb1, 0x6a, 0xf2, 0xe3, 0x3c, 0x31, 0x9a, 0xfa, 0xd7, 0x1c, 0xb4, ++ 0x69, 0xca, 0xd3, 0xbd, 0xa9, 0x9a, 0xf2, 0xcc, 0xe3, 0x76, 0x4d, 0x3e, ++ 0xbb, 0x63, 0xa2, 0xa6, 0xfe, 0x84, 0x0f, 0x1d, 0x9a, 0xfc, 0xa4, 0xce, ++ 0x59, 0x9a, 0xfa, 0x53, 0xce, 0x16, 0x69, 0xf2, 0x71, 0xac, 0xe7, 0x61, ++ 0x84, 0xef, 0x70, 0x85, 0xdf, 0xf7, 0xbf, 0x9e, 0xc0, 0xfd, 0xa7, 0x60, ++ 0xaf, 0x92, 0x1d, 0xaf, 0xe4, 0xee, 0x08, 0x1e, 0x07, 0x2a, 0xf4, 0x00, ++ 0x52, 0x9e, 0x96, 0xfe, 0xd0, 0x4e, 0x41, 0xdf, 0x81, 0x72, 0xfa, 0x70, ++ 0x23, 0x97, 0x53, 0x9b, 0x62, 0x19, 0xbf, 0x87, 0x99, 0xc4, 0x7d, 0x8b, ++ 0x69, 0xe5, 0x75, 0xa7, 0xf0, 0x67, 0x96, 0x72, 0x2a, 0x73, 0x69, 0xfd, ++ 0x99, 0xa5, 0x1f, 0x73, 0x9f, 0x5c, 0x2f, 0xe4, 0x76, 0x29, 0x1f, 0xfb, ++ 0xf9, 0x31, 0x3b, 0xfc, 0xfd, 0x98, 0x4b, 0x44, 0xfc, 0x76, 0xe0, 0xf9, ++ 0xa7, 0x9b, 0x28, 0xec, 0x40, 0x01, 0xf3, 0x1f, 0x6e, 0xe4, 0xeb, 0x6d, ++ 0xfa, 0xb9, 0x91, 0xe2, 0x46, 0xe4, 0xbc, 0x02, 0xe7, 0xb3, 0x34, 0x83, ++ 0xd3, 0xed, 0x2e, 0x53, 0xff, 0xf1, 0x3b, 0xd6, 0x89, 0x5c, 0x4f, 0x30, ++ 0x26, 0xbd, 0xc8, 0x34, 0x11, 0xea, 0x3d, 0x66, 0xb0, 0xbb, 0x49, 0x8f, ++ 0x72, 0xd5, 0x78, 0xf6, 0x4e, 0x17, 0xde, 0x2b, 0x7f, 0x61, 0xb4, 0xdf, ++ 0x65, 0xfb, 0xfe, 0xf1, 0x4a, 0xae, 0xe1, 0xeb, 0x29, 0xd6, 0xe9, 0x6e, ++ 0x99, 0x93, 0x46, 0xfe, 0x62, 0x0b, 0x9f, 0xf5, 0x1b, 0xdf, 0x26, 0xc6, ++ 0xd5, 0x4f, 0x16, 0x74, 0x1e, 0x30, 0x5e, 0x49, 0x38, 0xf7, 0xe7, 0x62, ++ 0xe1, 0x46, 0x1b, 0xd2, 0xef, 0xc0, 0xe3, 0x71, 0x78, 0xc6, 0x18, 0x59, ++ 0x33, 0xc5, 0x19, 0x09, 0xbf, 0xff, 0xa5, 0x9b, 0x3c, 0xf7, 0x8d, 0x82, ++ 0xa2, 0x62, 0x63, 0x8b, 0x81, 0x94, 0x17, 0xcc, 0x6d, 0x40, 0x7a, 0x98, ++ 0x3d, 0x1d, 0xe4, 0xa9, 0x74, 0xd4, 0x0b, 0xee, 0x7b, 0xc4, 0x02, 0xf2, ++ 0xc6, 0x63, 0x0d, 0x7a, 0xd2, 0xf3, 0x8c, 0x9a, 0x18, 0x55, 0x0c, 0x92, ++ 0x58, 0x5f, 0x1c, 0xc7, 0x70, 0xb8, 0x6f, 0x20, 0x7d, 0xa0, 0xcc, 0x82, ++ 0xf7, 0x94, 0xad, 0x93, 0x54, 0x1a, 0x67, 0x16, 0x2a, 0x33, 0x87, 0x90, ++ 0x9d, 0xb2, 0xcf, 0xff, 0x9e, 0xec, 0x17, 0x8c, 0x89, 0x73, 0x82, 0x91, ++ 0x3f, 0x4c, 0x3f, 0xf4, 0x46, 0x74, 0x28, 0xd7, 0xf1, 0x63, 0xf9, 0xe3, ++ 0x4b, 0xba, 0x0d, 0x84, 0x93, 0xbc, 0x5f, 0x32, 0xe1, 0xef, 0x98, 0x2c, ++ 0xe6, 0x25, 0xe1, 0x27, 0xf7, 0x83, 0x84, 0x9f, 0x8c, 0x87, 0xb0, 0xad, ++ 0x36, 0x14, 0xed, 0xb0, 0x50, 0x5c, 0xc5, 0x2c, 0xf4, 0x23, 0x93, 0xf8, ++ 0x6b, 0x9b, 0xc4, 0xe9, 0xf2, 0x8e, 0x89, 0x1c, 0xdf, 0x58, 0x0f, 0xf9, ++ 0xd1, 0x40, 0xf5, 0x0a, 0xd5, 0xb4, 0x70, 0xd4, 0x87, 0xf7, 0x32, 0x5b, ++ 0xb8, 0xf5, 0x3b, 0xf4, 0xbd, 0x3f, 0x62, 0x9c, 0x02, 0xc1, 0x7f, 0xa0, ++ 0xf8, 0xaa, 0x81, 0xf8, 0xc3, 0x55, 0x7c, 0x61, 0x80, 0x78, 0xab, 0x81, ++ 0xe8, 0x93, 0xfe, 0xfe, 0x81, 0xb8, 0x2b, 0x3f, 0xfe, 0xc0, 0xfd, 0x7a, ++ 0x04, 0x3e, 0xdc, 0xc9, 0x3a, 0xb2, 0xa3, 0xdf, 0x1d, 0xaa, 0xdd, 0xc7, ++ 0xbf, 0x15, 0xfc, 0xe1, 0xc6, 0x89, 0x62, 0x1f, 0xb9, 0xe0, 0x9e, 0xa9, ++ 0xe5, 0x13, 0x0c, 0xf5, 0xf7, 0x4d, 0xeb, 0x55, 0xc1, 0x27, 0xf8, 0xf9, ++ 0x8d, 0x72, 0x0d, 0x7e, 0x5f, 0xb6, 0xde, 0x40, 0xe7, 0x29, 0x63, 0x45, ++ 0x5b, 0x30, 0x8e, 0xe8, 0xd3, 0x56, 0x03, 0xf9, 0xb7, 0xe6, 0x3b, 0x6c, ++ 0x33, 0xed, 0xdc, 0x3e, 0x4f, 0xf2, 0x0d, 0xd9, 0xbd, 0x60, 0x6a, 0xa5, ++ 0x2e, 0xed, 0xb9, 0x0d, 0x72, 0xc4, 0x0e, 0xbc, 0x4f, 0x4c, 0x65, 0xf6, ++ 0x0d, 0x68, 0xcf, 0x28, 0xdf, 0xa8, 0x2d, 0x5f, 0x61, 0x99, 0xf9, 0x39, ++ 0xca, 0x0d, 0xcb, 0x02, 0xee, 0xa5, 0x2b, 0xc4, 0x7d, 0x75, 0x45, 0xc0, ++ 0xbd, 0xf4, 0xe1, 0x89, 0xe2, 0xdc, 0xb7, 0x33, 0x3b, 0xc9, 0x63, 0xc2, ++ 0xce, 0x5f, 0x29, 0xea, 0xf4, 0xd1, 0x91, 0x7b, 0x44, 0xb8, 0xd0, 0xbb, ++ 0xd0, 0xfe, 0x84, 0x94, 0xfc, 0xc2, 0xfa, 0xf8, 0x0b, 0xda, 0x6b, 0x32, ++ 0x7d, 0x79, 0x80, 0x5f, 0x70, 0x2a, 0x9e, 0xd3, 0xcd, 0xfa, 0x7e, 0xfd, ++ 0xf5, 0xfa, 0xe0, 0x37, 0x80, 0x3f, 0xc2, 0x05, 0xf4, 0x47, 0xb0, 0xe1, ++ 0x7e, 0xef, 0xa5, 0x78, 0xab, 0xde, 0xfd, 0x66, 0x6e, 0xa7, 0x94, 0xf6, ++ 0x20, 0x51, 0xff, 0x82, 0xeb, 0x32, 0x95, 0x63, 0x7d, 0xec, 0xed, 0x62, ++ 0x7a, 0xc7, 0x78, 0x94, 0x77, 0xfa, 0xec, 0x47, 0x01, 0x76, 0xa8, 0x5e, ++ 0x8b, 0x2e, 0x6c, 0x22, 0xf6, 0xd7, 0x66, 0xa0, 0xfe, 0xa4, 0xbf, 0x45, ++ 0xd5, 0xdf, 0xdc, 0xe3, 0xad, 0x7e, 0xf6, 0x64, 0x67, 0xa7, 0xaa, 0xf1, ++ 0x6f, 0x09, 0x4c, 0x9d, 0xeb, 0x0e, 0x90, 0xff, 0xc5, 0xdd, 0x11, 0xce, ++ 0x23, 0xc8, 0xc7, 0xcf, 0xeb, 0xed, 0x26, 0xc4, 0xdf, 0x3d, 0x96, 0x23, ++ 0x51, 0x18, 0x27, 0x3f, 0x5b, 0xe8, 0x6d, 0x02, 0xe7, 0xdb, 0x27, 0xdf, ++ 0xe6, 0x2a, 0xdc, 0x0e, 0xeb, 0xe2, 0x71, 0xb3, 0xbd, 0xb3, 0x14, 0xf2, ++ 0x03, 0x00, 0x3e, 0xc8, 0x70, 0xdf, 0x48, 0xbf, 0x81, 0x39, 0xcc, 0x3b, ++ 0x18, 0x53, 0x69, 0x8f, 0x71, 0x6e, 0x9c, 0x44, 0x70, 0x96, 0xf6, 0x98, ++ 0x52, 0xef, 0x24, 0x9a, 0xe7, 0xfc, 0xa6, 0x15, 0x86, 0x60, 0xa8, 0xd2, ++ 0xf9, 0xf0, 0xda, 0xc2, 0x60, 0x9b, 0xcf, 0x4e, 0xd3, 0x19, 0xcf, 0xfd, ++ 0x7e, 0x06, 0xb2, 0xd7, 0xcc, 0xbb, 0x92, 0x4e, 0xfd, 0xdd, 0x74, 0x65, ++ 0x0a, 0xf5, 0xd3, 0x35, 0x31, 0x91, 0xdb, 0x6f, 0x9a, 0xef, 0x5b, 0x8d, ++ 0x74, 0x34, 0x66, 0x0f, 0x33, 0xe0, 0x3a, 0x3b, 0x03, 0xfc, 0xde, 0x65, ++ 0x3a, 0x67, 0x12, 0x97, 0x93, 0xea, 0x26, 0x49, 0x3e, 0x2d, 0xfc, 0x89, ++ 0xd6, 0x29, 0x44, 0xe7, 0x6b, 0x14, 0x26, 0xfd, 0x8b, 0x88, 0x4f, 0xcb, ++ 0xfc, 0xe5, 0x16, 0x91, 0x2f, 0xe4, 0xf9, 0x5b, 0xd7, 0xf3, 0x7c, 0xa7, ++ 0x81, 0xbf, 0x33, 0xb3, 0x5b, 0xe8, 0x1b, 0x70, 0x9d, 0x98, 0xe2, 0x7a, ++ 0xf0, 0x5e, 0xdc, 0x26, 0xf4, 0x11, 0xb8, 0x0e, 0x4c, 0x71, 0x1d, 0xf8, ++ 0x1d, 0xf9, 0x12, 0xe6, 0x91, 0x2f, 0x61, 0x1e, 0xf9, 0x12, 0xe6, 0x91, ++ 0x2f, 0x61, 0x8a, 0x7c, 0x09, 0xbf, 0x97, 0xb1, 0xa2, 0x84, 0x74, 0x95, ++ 0xdb, 0x95, 0x0a, 0xfc, 0xf6, 0x0d, 0xda, 0x95, 0x0a, 0xfc, 0xe4, 0x1e, ++ 0xb4, 0x2b, 0xf9, 0xe7, 0xd1, 0xae, 0xe4, 0x5f, 0x1f, 0xed, 0x4a, 0xfe, ++ 0xe5, 0x68, 0x57, 0xf2, 0x2f, 0x47, 0xbb, 0x92, 0x7f, 0x1e, 0xed, 0x4a, ++ 0xfe, 0xf5, 0xd1, 0xae, 0xe4, 0x9f, 0x67, 0x13, 0xaf, 0xf5, 0xe5, 0x91, ++ 0x8f, 0x39, 0xe6, 0x68, 0xf2, 0xf3, 0x40, 0xce, 0x2f, 0xf0, 0xdb, 0xb7, ++ 0x68, 0x57, 0xf2, 0xef, 0x1f, 0xed, 0x4a, 0x9a, 0xfe, 0x9c, 0xab, 0x35, ++ 0xed, 0x97, 0xb0, 0x06, 0x4d, 0x7b, 0xb4, 0x2b, 0xf9, 0xd7, 0xbf, 0xa5, ++ 0x41, 0xd1, 0xd8, 0x9d, 0x6e, 0x11, 0xef, 0x01, 0x94, 0x6f, 0x1d, 0x44, ++ 0xf4, 0xb1, 0x77, 0x7c, 0x51, 0xc2, 0x24, 0xc0, 0xf3, 0x27, 0x21, 0xff, ++ 0x75, 0xbb, 0x01, 0xef, 0x1b, 0x6a, 0xfb, 0x4a, 0xa4, 0xdb, 0x35, 0xb5, ++ 0xc1, 0x76, 0x8e, 0xe7, 0x96, 0x59, 0x1c, 0xef, 0x3a, 0xc6, 0xf1, 0xdc, ++ 0xb3, 0x88, 0xf0, 0xbc, 0xd6, 0xc8, 0xf3, 0x85, 0xdc, 0xff, 0xb8, 0x3f, ++ 0xfb, 0x4d, 0x81, 0x81, 0xdb, 0x6f, 0x30, 0x45, 0xfb, 0x0d, 0xa6, 0x68, ++ 0xbf, 0xc1, 0x14, 0xed, 0x37, 0x05, 0x23, 0xb9, 0xfd, 0x06, 0x53, 0xb4, ++ 0xdf, 0xe0, 0x77, 0xb4, 0xdf, 0x60, 0x8a, 0xf6, 0x1b, 0x4c, 0xd1, 0x7e, ++ 0x83, 0x29, 0xda, 0x6f, 0x30, 0x45, 0xfb, 0x0d, 0xa6, 0x68, 0xbf, 0xc1, ++ 0x76, 0x68, 0xbf, 0xc1, 0x14, 0xed, 0x37, 0xf8, 0x1d, 0xed, 0x37, 0x98, ++ 0xa2, 0xfd, 0x06, 0xbf, 0x9f, 0x40, 0x3b, 0x92, 0xdf, 0xbb, 0x19, 0x28, ++ 0xa7, 0x27, 0x6b, 0xee, 0x8f, 0x40, 0x87, 0x9a, 0xfb, 0xa3, 0x55, 0x93, ++ 0x47, 0x39, 0xdd, 0xbf, 0x3e, 0xca, 0xe9, 0xfe, 0xe5, 0x28, 0xa7, 0xfb, ++ 0x97, 0xa3, 0x9c, 0xee, 0x9f, 0x47, 0x39, 0xdd, 0xbf, 0x3e, 0xca, 0xe9, ++ 0xfe, 0xf9, 0xb2, 0x89, 0x36, 0xda, 0x5f, 0x28, 0xaf, 0xfb, 0xb7, 0x43, ++ 0x79, 0xdd, 0x3f, 0x3f, 0xae, 0xc5, 0xf5, 0x1a, 0xea, 0x8e, 0x6e, 0xd8, ++ 0x76, 0xe9, 0x55, 0x4c, 0x3b, 0x43, 0x95, 0xc7, 0x14, 0x60, 0x05, 0xb7, ++ 0x1c, 0x7a, 0xaa, 0x58, 0x1f, 0x0b, 0x79, 0xb3, 0x92, 0x10, 0x01, 0x9c, ++ 0xd2, 0xa0, 0xec, 0x2b, 0x2e, 0x80, 0xbc, 0x53, 0xf8, 0xf1, 0x8d, 0x67, ++ 0x3d, 0x3a, 0xc4, 0x37, 0xd9, 0xd9, 0x01, 0x6f, 0x4e, 0x2f, 0x23, 0xbf, ++ 0xe3, 0x71, 0xdf, 0xc4, 0x52, 0xb9, 0xb4, 0xeb, 0xd2, 0x1f, 0xe0, 0x3d, ++ 0x7d, 0x3f, 0x23, 0xb9, 0xff, 0x39, 0x11, 0xaf, 0x29, 0xdb, 0xdb, 0x99, ++ 0x55, 0xc5, 0x54, 0xd6, 0xf7, 0xe5, 0xfb, 0xaf, 0x17, 0x38, 0xbe, 0xac, ++ 0x47, 0xfc, 0xd2, 0x6f, 0x1e, 0x70, 0x31, 0x4c, 0x47, 0x3f, 0x93, 0xf4, ++ 0xb5, 0x96, 0x0c, 0xf4, 0x97, 0xdf, 0xad, 0x53, 0xb8, 0xbf, 0xe9, 0x5d, ++ 0xdc, 0xdf, 0x37, 0x90, 0xae, 0x1e, 0x10, 0x72, 0xd0, 0x6e, 0xdd, 0xbe, ++ 0x23, 0xc1, 0xe8, 0x3f, 0x54, 0xaa, 0xd8, 0x31, 0x8e, 0x21, 0x45, 0xcf, ++ 0x8e, 0x1b, 0x32, 0x10, 0x4e, 0xf5, 0x19, 0x28, 0x1f, 0xdc, 0x39, 0x29, ++ 0x42, 0x9c, 0x43, 0xf5, 0x93, 0xd1, 0xff, 0x48, 0xce, 0x5b, 0xea, 0x01, ++ 0x81, 0x4f, 0x50, 0xfc, 0x5a, 0x6e, 0x0f, 0x33, 0x56, 0xc0, 0x38, 0x79, ++ 0x5f, 0x32, 0xe3, 0x32, 0xe4, 0xef, 0x46, 0x2e, 0x17, 0x60, 0x3b, 0xbc, ++ 0x2f, 0x8e, 0x75, 0x29, 0x8e, 0x1d, 0x7e, 0xf4, 0xbd, 0x7e, 0x12, 0x3f, ++ 0xdf, 0x9c, 0xae, 0xd5, 0x93, 0x2b, 0xe0, 0xfb, 0xd8, 0xb6, 0xfa, 0xc9, ++ 0x18, 0x17, 0x37, 0x3b, 0x98, 0xb7, 0xfb, 0xed, 0xe3, 0x61, 0x04, 0xc7, ++ 0x1b, 0x9b, 0x95, 0x1d, 0x18, 0x7f, 0x98, 0xdb, 0xc6, 0x1c, 0x18, 0xef, ++ 0xfa, 0x6b, 0x31, 0xef, 0xb1, 0x6d, 0x56, 0x63, 0x05, 0x8d, 0x6b, 0xa5, ++ 0x78, 0x3a, 0xd9, 0x6f, 0xe9, 0xb6, 0x04, 0x8a, 0xff, 0x2b, 0x65, 0x9d, ++ 0x05, 0x18, 0x5f, 0xc1, 0xb2, 0x14, 0x86, 0xf6, 0x51, 0x09, 0x37, 0x58, ++ 0xdf, 0xab, 0xb8, 0xbe, 0x14, 0xd8, 0x2a, 0x06, 0x92, 0x3f, 0x79, 0x5c, ++ 0x4e, 0xb0, 0x88, 0xcb, 0x91, 0xf1, 0x38, 0x41, 0x11, 0x45, 0x73, 0x27, ++ 0x0e, 0xf1, 0xc5, 0xe5, 0xe4, 0x65, 0x45, 0x14, 0xa2, 0x5f, 0x1c, 0x6b, ++ 0x67, 0x76, 0x0c, 0x03, 0xbe, 0x21, 0xab, 0x74, 0xfd, 0x10, 0xe8, 0xdf, ++ 0xe9, 0x76, 0xd8, 0xd1, 0xaf, 0x28, 0xef, 0xcb, 0xfa, 0xd7, 0x28, 0xbf, ++ 0xb3, 0x88, 0xf2, 0x44, 0x06, 0x39, 0x34, 0x0e, 0x9d, 0x6b, 0xa3, 0x5c, ++ 0x0a, 0xbd, 0xaf, 0x71, 0xa3, 0x6b, 0xbb, 0x6e, 0xb0, 0x0d, 0xe3, 0x75, ++ 0xd7, 0x19, 0xa2, 0xb0, 0x7e, 0x1b, 0xb3, 0xa3, 0xb8, 0x03, 0x47, 0x0d, ++ 0xc5, 0x9d, 0xca, 0xf9, 0xa5, 0xb1, 0x0e, 0x9d, 0x59, 0x41, 0xbc, 0xb3, ++ 0xa3, 0x83, 0xfc, 0xe8, 0x08, 0x38, 0xc0, 0x4d, 0x88, 0xf7, 0x74, 0xbb, ++ 0x81, 0xde, 0xdf, 0x98, 0xa3, 0xb7, 0x1a, 0x90, 0x6f, 0x04, 0x9e, 0xe3, ++ 0x57, 0xfb, 0x2d, 0x06, 0xc8, 0x09, 0x01, 0xfe, 0x25, 0x4d, 0x6b, 0x3f, ++ 0x4c, 0x50, 0x93, 0xd0, 0xbf, 0x44, 0x67, 0xf7, 0x22, 0xdf, 0x3a, 0x10, ++ 0x42, 0xf2, 0x82, 0x94, 0x77, 0x4a, 0x85, 0xbf, 0xd9, 0xe5, 0xe6, 0xd7, ++ 0x86, 0xdc, 0x0c, 0xe5, 0xa5, 0xfb, 0xb8, 0x7c, 0xe0, 0xdc, 0xaa, 0x10, ++ 0xff, 0x93, 0xfe, 0x26, 0xb5, 0x23, 0xdc, 0x09, 0x3a, 0x94, 0x17, 0x86, ++ 0x6e, 0x1f, 0x1f, 0xa9, 0xf2, 0xf3, 0x7f, 0x12, 0xc6, 0x7d, 0xb9, 0x9e, ++ 0x5b, 0x80, 0x5b, 0xb4, 0x74, 0xfd, 0x6b, 0x14, 0x17, 0x51, 0xba, 0x3e, ++ 0x3b, 0x9c, 0xc7, 0x45, 0x71, 0x3b, 0x44, 0x85, 0x80, 0x53, 0x85, 0xf0, ++ 0x2b, 0x62, 0x69, 0xd6, 0x28, 0x94, 0x33, 0x4f, 0x02, 0xdf, 0x71, 0x8c, ++ 0x22, 0xbf, 0xc4, 0x70, 0x8a, 0x2b, 0x6c, 0xe1, 0xf2, 0x9c, 0xd4, 0xeb, ++ 0x48, 0x79, 0x50, 0xbe, 0x1f, 0x53, 0xfa, 0x56, 0xe6, 0x31, 0xc4, 0x7b, ++ 0xe9, 0xa3, 0xe2, 0x5d, 0x96, 0x8d, 0xa5, 0x14, 0x7f, 0x15, 0xe8, 0xe7, ++ 0x53, 0x2d, 0xe4, 0xbd, 0x95, 0xcd, 0x06, 0xf2, 0x1f, 0x5a, 0x19, 0x20, ++ 0x0f, 0x56, 0x0b, 0x7f, 0xa1, 0xea, 0x00, 0x79, 0xf0, 0xa3, 0x49, 0x42, ++ 0x3f, 0x23, 0xe5, 0x41, 0x71, 0x7f, 0x91, 0xfe, 0xbc, 0xa5, 0x6f, 0x1d, ++ 0x9d, 0x4f, 0xf2, 0x4a, 0xbd, 0x81, 0xec, 0x72, 0xc5, 0xeb, 0xb8, 0xfc, ++ 0xc2, 0xf6, 0x31, 0x37, 0xc6, 0x33, 0x14, 0xaf, 0x9b, 0xa1, 0xc3, 0x77, ++ 0x43, 0x8a, 0x0f, 0x38, 0xec, 0x4a, 0x3f, 0x74, 0xf2, 0x8e, 0x90, 0x63, ++ 0x66, 0x77, 0x9a, 0x09, 0xae, 0x73, 0xaf, 0xc4, 0x51, 0xba, 0xe0, 0x4a, ++ 0x2c, 0xa5, 0x37, 0x5f, 0xe1, 0x7e, 0x94, 0x18, 0xfb, 0x82, 0x74, 0xd0, ++ 0x79, 0x88, 0x91, 0x1c, 0xfd, 0x9e, 0x90, 0x5b, 0xe6, 0xa3, 0x5f, 0x25, ++ 0xc6, 0x23, 0xba, 0x82, 0x84, 0xff, 0x24, 0x23, 0xb9, 0x29, 0x9d, 0x59, ++ 0x0b, 0x91, 0x7f, 0x8c, 0x71, 0x28, 0x47, 0x51, 0xec, 0x9b, 0x6d, 0x70, ++ 0xae, 0x47, 0xbf, 0xcd, 0xd9, 0xdb, 0x19, 0xc5, 0x1f, 0xdd, 0x80, 0xf2, ++ 0x0d, 0xf4, 0xbf, 0x10, 0xe5, 0x1d, 0xd4, 0xbb, 0x67, 0x25, 0x16, 0x52, ++ 0x1c, 0xc6, 0x2c, 0x85, 0xe2, 0x59, 0x6e, 0xc8, 0x5a, 0x2d, 0xe8, 0x1b, ++ 0xe8, 0x9d, 0x21, 0xbd, 0xbb, 0x04, 0xfd, 0x16, 0x51, 0xbe, 0xef, 0x5c, ++ 0x10, 0x74, 0xee, 0x74, 0x75, 0xe9, 0x11, 0xee, 0x37, 0xb8, 0x14, 0x23, ++ 0xbe, 0xc3, 0xe7, 0x14, 0xf7, 0x58, 0x49, 0xc7, 0x81, 0xf4, 0x5e, 0x12, ++ 0x22, 0xf4, 0x4f, 0x16, 0xae, 0x5f, 0xea, 0xd3, 0x3f, 0xe1, 0x64, 0xf1, ++ 0x51, 0x1b, 0x97, 0x71, 0x29, 0xfa, 0xb7, 0x96, 0xa0, 0x6e, 0x70, 0x28, ++ 0xe3, 0x88, 0x07, 0x98, 0x87, 0xa6, 0xf1, 0xf2, 0x21, 0x2f, 0x1a, 0x97, ++ 0x36, 0xa3, 0x4f, 0xfb, 0x7f, 0x53, 0x2f, 0x51, 0xac, 0xd3, 0xf1, 0x78, ++ 0x27, 0x90, 0xb7, 0x90, 0xaf, 0x2e, 0xbd, 0x2d, 0xdd, 0x58, 0xe6, 0xc7, ++ 0x5f, 0x4e, 0x4e, 0x99, 0x9e, 0x35, 0x65, 0x88, 0x0f, 0xef, 0x65, 0x01, ++ 0x71, 0x7a, 0x6b, 0xee, 0x19, 0x19, 0xfd, 0x5d, 0xf1, 0xa2, 0xe5, 0x00, ++ 0x67, 0xdc, 0x27, 0x25, 0xe1, 0x9d, 0xb7, 0x03, 0x85, 0xb2, 0xec, 0xc9, ++ 0xcc, 0x51, 0x00, 0x77, 0xd6, 0x45, 0x8c, 0xc9, 0xc7, 0x7b, 0xbc, 0xe8, ++ 0x17, 0xb8, 0x58, 0xe4, 0xcb, 0x5e, 0xbc, 0xe6, 0xaf, 0x1b, 0xd3, 0x08, ++ 0x3e, 0x94, 0x4f, 0x9f, 0x3c, 0x64, 0xa9, 0x8b, 0xf6, 0x0d, 0xe7, 0x5b, ++ 0x4b, 0x90, 0x6f, 0xa9, 0xc8, 0xaf, 0x9c, 0xd7, 0x4c, 0x46, 0xbf, 0x2b, ++ 0x53, 0xe7, 0x4c, 0xc4, 0x47, 0x48, 0x5a, 0x8f, 0x78, 0x87, 0x40, 0x9c, ++ 0x4b, 0x01, 0x7a, 0x88, 0xb2, 0xc9, 0x36, 0xbe, 0xde, 0x00, 0x7d, 0x44, ++ 0x79, 0x1a, 0xe7, 0xe7, 0x4c, 0x6f, 0x4b, 0x58, 0x42, 0x71, 0xc1, 0x36, ++ 0xd2, 0xe7, 0xf5, 0xad, 0xdf, 0xa0, 0x8d, 0xd3, 0x94, 0xe9, 0xe2, 0xc9, ++ 0xe2, 0x3c, 0x69, 0xfc, 0x71, 0xe2, 0x1b, 0xae, 0x8c, 0x70, 0x5e, 0x8f, ++ 0xeb, 0xdb, 0xa2, 0xe3, 0x71, 0xf3, 0x43, 0xd5, 0x16, 0x26, 0xf4, 0x42, ++ 0xb4, 0xff, 0x25, 0xff, 0x60, 0xe2, 0x1d, 0x09, 0x1f, 0xfe, 0x41, 0x4e, ++ 0x23, 0x3b, 0xba, 0x62, 0xf5, 0xc7, 0xbf, 0x73, 0xa3, 0xc2, 0xe3, 0xd4, ++ 0x07, 0xd0, 0xdf, 0xb0, 0xd4, 0x9e, 0x87, 0x77, 0xa1, 0xfe, 0xae, 0xd1, ++ 0xc8, 0x30, 0xce, 0xf5, 0xf1, 0x14, 0x4e, 0x47, 0x8f, 0xdf, 0x61, 0x24, ++ 0x39, 0xbc, 0xd8, 0xd8, 0xf1, 0x1a, 0xbe, 0x93, 0x25, 0xe1, 0xf8, 0x51, ++ 0xc3, 0xbf, 0x1a, 0x48, 0xff, 0xcf, 0xbc, 0x23, 0xf1, 0xfd, 0xaf, 0xc5, ++ 0xf5, 0x66, 0x3b, 0xf2, 0xe7, 0x93, 0x53, 0x8a, 0x4a, 0x71, 0xde, 0x21, ++ 0x69, 0x76, 0xc2, 0x47, 0xd6, 0x14, 0x4e, 0x67, 0x1f, 0xc5, 0x17, 0x55, ++ 0x4c, 0xc6, 0xf3, 0x65, 0xd3, 0xe1, 0xc7, 0x30, 0x6e, 0x7f, 0x55, 0x7b, ++ 0x22, 0xc5, 0x91, 0x96, 0x1e, 0x4c, 0xdf, 0x80, 0xef, 0x89, 0x9c, 0x9c, ++ 0xe2, 0x5c, 0x89, 0xe5, 0xa5, 0x16, 0xab, 0x11, 0xcf, 0xf1, 0xba, 0xe6, ++ 0x08, 0x3a, 0xd7, 0x4a, 0xa2, 0x45, 0x5c, 0x27, 0xeb, 0x21, 0x3b, 0x95, ++ 0x84, 0xff, 0xba, 0xc9, 0x5c, 0x7f, 0x35, 0x21, 0x97, 0x51, 0xda, 0x2d, ++ 0xee, 0x23, 0xc8, 0x30, 0xe7, 0x68, 0xea, 0xf5, 0xaf, 0xbf, 0x93, 0x7a, ++ 0xc1, 0x40, 0xfd, 0x42, 0xe0, 0x3b, 0x0e, 0x03, 0xed, 0x1f, 0xa9, 0x47, ++ 0x40, 0xbd, 0x81, 0xd1, 0x4f, 0xaf, 0x28, 0xf5, 0x12, 0x86, 0xd4, 0x93, ++ 0x8b, 0xf0, 0x1c, 0x2d, 0x36, 0x6a, 0xe3, 0x0f, 0x65, 0xfa, 0xac, 0x98, ++ 0xbf, 0xbc, 0x0f, 0x2e, 0xeb, 0x3b, 0xc7, 0xd2, 0x66, 0x46, 0xa3, 0xdc, ++ 0xbc, 0x59, 0xb1, 0xe2, 0x39, 0x56, 0x61, 0xb1, 0xdd, 0x3c, 0x09, 0xf2, ++ 0x15, 0xc7, 0x0d, 0xe8, 0x81, 0xc9, 0x66, 0x47, 0xda, 0xf8, 0xfb, 0x1d, ++ 0xf7, 0xf0, 0xf7, 0x3b, 0xca, 0x60, 0xbf, 0x22, 0xbf, 0x29, 0x16, 0xfe, ++ 0x58, 0x15, 0x5b, 0x27, 0xd1, 0x7e, 0xab, 0x70, 0x43, 0x9a, 0x39, 0xf0, ++ 0xbe, 0x5c, 0xb2, 0xf9, 0x68, 0xfc, 0x21, 0xa4, 0x1f, 0xaf, 0x83, 0xe2, ++ 0xf2, 0x2b, 0xac, 0x0e, 0x63, 0xa4, 0xdf, 0xbe, 0x2f, 0x6f, 0x51, 0x34, ++ 0x71, 0xfd, 0x32, 0xbf, 0x63, 0x32, 0xd7, 0xc3, 0x15, 0x83, 0x98, 0x8e, ++ 0xf0, 0x5b, 0x7a, 0x5b, 0xa2, 0x11, 0xdf, 0xd0, 0x29, 0x06, 0xf1, 0x02, ++ 0xfd, 0xfb, 0x9e, 0x9d, 0xcc, 0xe1, 0x20, 0xdb, 0x41, 0x3d, 0xf2, 0x6b, ++ 0x98, 0x9d, 0xc4, 0x8e, 0xf1, 0xf7, 0x93, 0x60, 0xde, 0x89, 0x7c, 0xbc, ++ 0x0c, 0xbf, 0xfe, 0xcb, 0x5a, 0xb4, 0xef, 0x13, 0x40, 0x7d, 0x92, 0x8b, ++ 0xda, 0x26, 0x87, 0x52, 0x7f, 0xa5, 0x56, 0x58, 0x77, 0x22, 0xa6, 0x56, ++ 0x9a, 0x27, 0xc0, 0x81, 0xe0, 0xd4, 0x73, 0x1f, 0xf4, 0x67, 0xa3, 0x71, ++ 0x08, 0x1f, 0xe5, 0x5e, 0xb7, 0x01, 0xef, 0xdd, 0xc5, 0xe8, 0x4f, 0x01, ++ 0xf9, 0xc5, 0x56, 0xb7, 0x01, 0xc7, 0x29, 0x6b, 0xe6, 0xef, 0x85, 0x38, ++ 0x37, 0xf1, 0x71, 0x9c, 0x1b, 0x23, 0x8c, 0xe3, 0x50, 0x6e, 0xd2, 0x5b, ++ 0x8d, 0xf1, 0x08, 0x3f, 0xbc, 0x2c, 0x0f, 0xa6, 0xf9, 0x11, 0x1f, 0xac, ++ 0x00, 0xb8, 0x60, 0xbc, 0x95, 0x8c, 0xbb, 0x0c, 0x84, 0x4f, 0xa9, 0x98, ++ 0x6f, 0x45, 0x4b, 0x84, 0x56, 0x1e, 0x6b, 0xd9, 0x6c, 0x40, 0x7c, 0x2c, ++ 0x1a, 0xe0, 0xbd, 0x82, 0x13, 0x02, 0xef, 0x65, 0xcd, 0xd3, 0x28, 0xde, ++ 0xbc, 0x42, 0xef, 0xa0, 0x78, 0x06, 0xa7, 0x80, 0xef, 0xa7, 0xab, 0xcd, ++ 0xf7, 0xa2, 0x5d, 0x60, 0x51, 0xeb, 0x43, 0x86, 0x44, 0xc8, 0xbf, 0x3d, ++ 0x99, 0xdf, 0xa7, 0x4f, 0x08, 0xb8, 0xce, 0x4e, 0xf2, 0x8e, 0xa4, 0x77, ++ 0x81, 0x56, 0x9b, 0xed, 0x38, 0xcf, 0x45, 0xd6, 0x16, 0x5a, 0x5f, 0x1f, ++ 0x7c, 0x1f, 0x04, 0x78, 0x28, 0xf8, 0xfe, 0x4c, 0x11, 0xc1, 0x17, 0xe8, ++ 0xc2, 0x85, 0xfe, 0x79, 0x15, 0xad, 0x5a, 0x7c, 0xfa, 0xe6, 0xc3, 0xe1, ++ 0x5b, 0xd1, 0x5a, 0x4a, 0xfb, 0x6d, 0xb9, 0xde, 0x69, 0xb4, 0xfa, 0xcf, ++ 0x63, 0xeb, 0xe1, 0x91, 0xe8, 0x87, 0xb2, 0x08, 0xf6, 0x37, 0xbe, 0x77, ++ 0xc4, 0xac, 0x4e, 0x8a, 0x6f, 0x3a, 0xf3, 0xe0, 0xcd, 0x09, 0xb4, 0x4e, ++ 0x98, 0x27, 0xf9, 0x41, 0xd9, 0x6d, 0x33, 0xf1, 0x9d, 0x1f, 0xa0, 0x13, ++ 0xa2, 0x63, 0x49, 0x2f, 0x32, 0x2e, 0x5b, 0x8e, 0xf7, 0xf5, 0x64, 0x1e, ++ 0x97, 0xf9, 0xf5, 0xf7, 0xee, 0x4b, 0x07, 0xc9, 0x35, 0x4d, 0x80, 0x5f, ++ 0xd4, 0x77, 0x0f, 0xb4, 0x2f, 0x8d, 0x18, 0xd8, 0x05, 0xe3, 0x1a, 0x2b, ++ 0xf8, 0xfb, 0x6b, 0x81, 0xfb, 0x54, 0xee, 0x4f, 0xb9, 0x2f, 0xe5, 0x3e, ++ 0x95, 0xfb, 0xf7, 0x31, 0x43, 0x91, 0x37, 0x46, 0xf1, 0xf1, 0x19, 0x38, ++ 0x6f, 0xeb, 0x9f, 0xed, 0x07, 0x4e, 0x59, 0x53, 0xf8, 0x7c, 0x17, 0x0b, ++ 0xbc, 0x02, 0x5c, 0x5f, 0xf5, 0x8f, 0xe3, 0x8a, 0x9f, 0xc2, 0xe5, 0xfb, ++ 0xe2, 0x24, 0xed, 0x7e, 0xc7, 0xfe, 0xe8, 0xdd, 0xaf, 0x29, 0x1c, 0xef, ++ 0xc5, 0xd3, 0xbd, 0x23, 0x31, 0xee, 0x52, 0xd6, 0x97, 0xe3, 0x16, 0x47, ++ 0xf2, 0x76, 0x48, 0xf7, 0x48, 0x6f, 0x21, 0x62, 0x3c, 0xac, 0xbf, 0x86, ++ 0xea, 0x73, 0x3a, 0x90, 0xfc, 0xa2, 0xbc, 0x8f, 0x5f, 0xb4, 0xad, 0x8f, ++ 0x42, 0x7e, 0xb1, 0x4f, 0x21, 0xb9, 0x77, 0xcd, 0x7d, 0x47, 0xe3, 0x7f, ++ 0x86, 0xf2, 0xec, 0xd3, 0x5c, 0x9e, 0x3d, 0x5f, 0xb3, 0xab, 0x2e, 0x16, ++ 0xe5, 0x46, 0xbd, 0x3b, 0xc1, 0xff, 0x5d, 0xac, 0x0a, 0x2f, 0xe7, 0x0f, ++ 0xcb, 0x40, 0xfe, 0x41, 0x7e, 0xb1, 0x5c, 0x9c, 0xd3, 0x4f, 0x66, 0x38, ++ 0x87, 0x4e, 0xf1, 0xdb, 0xbf, 0x15, 0x0f, 0x3c, 0x9d, 0xe2, 0xe4, 0xfc, ++ 0xc5, 0x8b, 0xfc, 0xe5, 0xe3, 0xa7, 0x5f, 0x7a, 0x7f, 0xb2, 0xcd, 0x77, ++ 0x7e, 0xca, 0xf9, 0x97, 0x6d, 0xfc, 0x77, 0x43, 0xa9, 0xc5, 0x1f, 0x5e, ++ 0x7c, 0xbd, 0xf7, 0xa6, 0xf6, 0x52, 0x9c, 0x5d, 0xb9, 0xc5, 0x68, 0x43, ++ 0xff, 0xe5, 0xf2, 0xe6, 0x52, 0xe2, 0xb7, 0x2c, 0x06, 0xee, 0x15, 0x8a, ++ 0x0f, 0xdf, 0x81, 0x74, 0x50, 0xda, 0xac, 0xd0, 0xfb, 0x62, 0xe5, 0x0d, ++ 0x39, 0x6e, 0xf5, 0x7f, 0x90, 0x2f, 0x97, 0x6f, 0x9a, 0x43, 0x6f, 0x22, ++ 0x49, 0x3c, 0xc9, 0xf7, 0x4e, 0xe4, 0x79, 0x2a, 0xe7, 0x9f, 0x27, 0xe6, ++ 0xbf, 0x58, 0xd0, 0xb1, 0x63, 0x0a, 0xef, 0x67, 0x71, 0x65, 0xa2, 0x71, ++ 0x39, 0xed, 0xfb, 0x44, 0x63, 0x39, 0xd2, 0xbf, 0x28, 0x5f, 0x54, 0xa1, ++ 0xfd, 0xde, 0x87, 0xa7, 0x3e, 0x3b, 0x76, 0xda, 0x06, 0xdc, 0x1f, 0x18, ++ 0x37, 0x44, 0xf7, 0x93, 0x4d, 0x06, 0xae, 0xe7, 0x6b, 0x0b, 0x25, 0x79, ++ 0xf5, 0xfc, 0x9a, 0x17, 0xde, 0x5e, 0x00, 0xf5, 0xce, 0x6d, 0xd9, 0x9e, ++ 0x40, 0xf1, 0xa7, 0x62, 0x1e, 0x2b, 0x84, 0x3e, 0x6f, 0x99, 0xd0, 0xcb, ++ 0x2d, 0x17, 0x72, 0x2b, 0xe0, 0xe9, 0xa7, 0xfe, 0x78, 0x5a, 0xf1, 0x38, ++ 0xc7, 0x53, 0xf9, 0x33, 0x6f, 0xfd, 0x15, 0xdf, 0xe5, 0x2a, 0x4e, 0x12, ++ 0xfc, 0xec, 0x3e, 0x1e, 0xcf, 0x5f, 0xe6, 0xd9, 0x47, 0x78, 0x5b, 0xb4, ++ 0x71, 0xb3, 0x21, 0x11, 0xea, 0xdd, 0x32, 0x25, 0x51, 0xc3, 0xa7, 0xcb, ++ 0xeb, 0xe1, 0xa2, 0x0b, 0xf0, 0x5c, 0xbc, 0x71, 0xbb, 0x01, 0xf9, 0xc0, ++ 0x2d, 0x53, 0xf8, 0x39, 0x1f, 0x48, 0xef, 0xc5, 0xc2, 0xdf, 0x57, 0xc2, ++ 0x15, 0xcf, 0x1d, 0xc5, 0xcf, 0x6e, 0x21, 0xeb, 0x23, 0xff, 0xdb, 0x07, ++ 0xe3, 0xdc, 0xb6, 0xda, 0x1c, 0x86, 0xfa, 0x69, 0x39, 0xce, 0x46, 0x41, ++ 0xc7, 0xe5, 0xf5, 0x11, 0x91, 0x38, 0x5e, 0x79, 0x7d, 0xe9, 0xaf, 0xf1, ++ 0xde, 0x21, 0xf9, 0x7d, 0xe0, 0xbe, 0x3b, 0x65, 0xe6, 0xfb, 0xa1, 0x0c, ++ 0xfa, 0xc3, 0x7d, 0x79, 0x6a, 0x9a, 0x9d, 0xe2, 0x9a, 0xd1, 0xae, 0xd5, ++ 0xdf, 0xb9, 0xda, 0x28, 0xf0, 0xf6, 0x1b, 0x03, 0x7f, 0xbf, 0x31, 0x2e, ++ 0xc4, 0xb3, 0x17, 0xe1, 0x10, 0xb7, 0x2a, 0xd8, 0x8e, 0xfc, 0x21, 0x39, ++ 0xb9, 0x93, 0xec, 0xc6, 0x48, 0xcf, 0x38, 0x6f, 0xa3, 0x8e, 0xbf, 0xf7, ++ 0x98, 0x5c, 0xd3, 0xf9, 0x05, 0xce, 0x23, 0x99, 0x71, 0xff, 0x14, 0x4c, ++ 0xf1, 0x9d, 0x29, 0xb4, 0x1b, 0x44, 0x41, 0x7e, 0x87, 0x8e, 0xc7, 0x5f, ++ 0x25, 0xa9, 0x3c, 0xdd, 0x25, 0xe0, 0x03, 0xe5, 0x5e, 0x2c, 0x67, 0x83, ++ 0x3b, 0xe9, 0xdd, 0xb9, 0xbe, 0x77, 0x93, 0x02, 0xe8, 0xd5, 0xc8, 0x76, ++ 0x6e, 0xc4, 0xf7, 0x6e, 0x8c, 0x83, 0x99, 0xbd, 0xc9, 0xe6, 0xa3, 0x4f, ++ 0xd9, 0x8f, 0xa4, 0x4f, 0x49, 0xbf, 0x03, 0xad, 0xef, 0xd1, 0x1f, 0xb8, ++ 0xbe, 0x53, 0x89, 0x42, 0x1f, 0x91, 0x6a, 0x4f, 0xc0, 0x38, 0x95, 0x92, ++ 0xfb, 0x47, 0xd9, 0x51, 0x3f, 0xf3, 0x7d, 0xeb, 0x34, 0x8a, 0xf7, 0x07, ++ 0xfb, 0xd6, 0x0b, 0xc4, 0x3a, 0x31, 0xb2, 0x9f, 0xf5, 0x26, 0xf3, 0x7b, ++ 0xcb, 0xc0, 0xeb, 0x6d, 0x2d, 0x8c, 0xea, 0x67, 0xbd, 0x81, 0xeb, 0x94, ++ 0xfb, 0x44, 0xfa, 0xb4, 0xf7, 0xd9, 0x17, 0x5a, 0xb8, 0x7d, 0xe1, 0x94, ++ 0x02, 0xe7, 0x17, 0xb4, 0x3b, 0xb5, 0xda, 0x4c, 0xfe, 0x5f, 0x72, 0x5d, ++ 0x52, 0xff, 0xfd, 0x43, 0xe3, 0x10, 0x0e, 0x4f, 0x89, 0x14, 0x7a, 0x9d, ++ 0xce, 0x50, 0x94, 0x23, 0x8b, 0x83, 0xc5, 0xfe, 0xf7, 0xf2, 0x3c, 0x7e, ++ 0x9f, 0xe3, 0xf7, 0x5d, 0x9e, 0xfb, 0xf2, 0xbd, 0x36, 0xc9, 0x9f, 0x4f, ++ 0xd7, 0x8b, 0x73, 0x91, 0x75, 0xde, 0x87, 0xfb, 0x99, 0x35, 0x8c, 0xa0, ++ 0xf7, 0x49, 0x4e, 0xb4, 0x9c, 0x0a, 0xc5, 0xf7, 0x52, 0x4e, 0x4d, 0xe3, ++ 0xf3, 0x93, 0xed, 0x6e, 0x33, 0xf0, 0x38, 0x63, 0x16, 0x6a, 0xb4, 0xe1, ++ 0xfb, 0x87, 0x70, 0xbf, 0x3a, 0xd1, 0x80, 0x76, 0x9f, 0xe6, 0x68, 0xba, ++ 0x47, 0x2e, 0x6d, 0x18, 0x41, 0x7c, 0x61, 0xa9, 0x2b, 0x82, 0xeb, 0x1f, ++ 0x84, 0x7c, 0xbf, 0x5c, 0xf0, 0xc1, 0x90, 0xdb, 0x4a, 0x37, 0xe0, 0x3b, ++ 0xdf, 0xcb, 0xb6, 0x26, 0x5a, 0x15, 0x18, 0x67, 0x99, 0xc5, 0x7e, 0x66, ++ 0x2b, 0xb5, 0x1f, 0x6b, 0x47, 0x79, 0x30, 0xa4, 0x75, 0x8e, 0x31, 0x89, ++ 0xe4, 0x5e, 0x7e, 0x0f, 0x90, 0x76, 0xa2, 0xdb, 0x14, 0x56, 0x44, 0x71, ++ 0x63, 0xc8, 0x27, 0x71, 0x7f, 0xe9, 0x0e, 0x27, 0xe3, 0xb9, 0xb3, 0x62, ++ 0x2b, 0xbf, 0x07, 0xcc, 0xd6, 0xb1, 0x8d, 0x68, 0x27, 0x1c, 0xde, 0x54, ++ 0x34, 0x33, 0x16, 0xf9, 0xc4, 0xc3, 0x0a, 0xc5, 0x99, 0xb3, 0x6d, 0xda, ++ 0x77, 0xac, 0x46, 0x66, 0x16, 0x7d, 0x4c, 0xf7, 0xbf, 0x80, 0x77, 0xe0, ++ 0x6e, 0x33, 0x78, 0x1c, 0xd1, 0xc8, 0xc7, 0x41, 0xde, 0x40, 0x7d, 0xd3, ++ 0x32, 0x4b, 0x11, 0xc9, 0xed, 0x4b, 0x04, 0x9f, 0x3c, 0xd1, 0xda, 0x45, ++ 0xef, 0xd1, 0x4b, 0xb8, 0x5e, 0x15, 0xff, 0x63, 0xe4, 0x71, 0xc0, 0x3d, ++ 0xa1, 0x3a, 0xd2, 0xc3, 0xfd, 0xd0, 0x38, 0xa0, 0x0a, 0x61, 0x57, 0x92, ++ 0x74, 0x23, 0xed, 0x52, 0x8f, 0xe0, 0x7f, 0x26, 0x21, 0x9c, 0x54, 0x3a, ++ 0xd7, 0x0a, 0xd5, 0x62, 0x7a, 0x4f, 0x69, 0x43, 0xeb, 0x0c, 0x4a, 0x2b, ++ 0x36, 0x17, 0x6e, 0x71, 0x8d, 0xc3, 0xf8, 0xe3, 0xa2, 0xa8, 0xc9, 0x34, ++ 0x6f, 0x03, 0xe9, 0xc9, 0x2a, 0x6a, 0x67, 0xf0, 0x78, 0xdd, 0x1d, 0x41, ++ 0x11, 0x78, 0xbf, 0x49, 0x30, 0xb8, 0x12, 0xfc, 0xe5, 0xd2, 0x8a, 0xed, ++ 0x77, 0x53, 0xfc, 0xcf, 0xd9, 0xed, 0x66, 0x8a, 0xff, 0x29, 0xb0, 0xce, ++ 0x29, 0x88, 0x18, 0x4c, 0xef, 0x1d, 0x53, 0x7c, 0x9d, 0xac, 0x67, 0xc9, ++ 0xe5, 0xfb, 0xb2, 0xaa, 0x76, 0x86, 0x26, 0x7e, 0x67, 0x19, 0xf4, 0x89, ++ 0xef, 0x6c, 0x7e, 0xe5, 0x09, 0x21, 0x3f, 0x34, 0x19, 0x97, 0x53, 0x13, ++ 0xed, 0x0c, 0xca, 0x1d, 0xc2, 0xe3, 0x73, 0x26, 0xd9, 0x78, 0x5c, 0x4e, ++ 0x2c, 0xd5, 0xb7, 0xf5, 0xab, 0x17, 0x97, 0xe9, 0x99, 0x46, 0x1e, 0xe7, ++ 0xe1, 0x17, 0x6f, 0x74, 0xe3, 0x22, 0x68, 0x5f, 0x53, 0xfb, 0x5c, 0x18, ++ 0xf6, 0x53, 0xfd, 0xe0, 0x7b, 0x39, 0x56, 0x1d, 0xe9, 0xa1, 0x06, 0x61, ++ 0xff, 0x7d, 0xf1, 0x46, 0x5b, 0x79, 0xbc, 0xd1, 0x60, 0xbc, 0x2f, 0x65, ++ 0x23, 0x7d, 0x17, 0x2d, 0x58, 0x84, 0xf0, 0xff, 0xbd, 0x4a, 0xf0, 0x1f, ++ 0x68, 0xbc, 0xca, 0x83, 0x8a, 0xc6, 0x8e, 0xb7, 0xd4, 0x1d, 0x4e, 0x72, ++ 0xab, 0xd3, 0xcb, 0x8c, 0x68, 0x47, 0x76, 0x5a, 0x19, 0xc9, 0xc5, 0x67, ++ 0x55, 0xd6, 0x80, 0x72, 0x80, 0x94, 0x5f, 0xe4, 0xf7, 0x51, 0x02, 0x2e, ++ 0x67, 0xc3, 0x5b, 0x12, 0x90, 0x3e, 0x56, 0xee, 0x7e, 0x28, 0x01, 0xcf, ++ 0x97, 0xcf, 0x43, 0x79, 0xbe, 0x78, 0xf7, 0xcd, 0x7f, 0x40, 0x7e, 0xe5, ++ 0xdc, 0x19, 0xc4, 0xe5, 0x73, 0x3d, 0x23, 0x79, 0xb8, 0xdc, 0xc5, 0xe5, ++ 0x6b, 0x56, 0x19, 0x29, 0xdf, 0x23, 0x35, 0x97, 0x00, 0x1d, 0xa5, 0xe7, ++ 0x86, 0xf0, 0x77, 0x8f, 0xb6, 0x6a, 0xe3, 0xcd, 0xe5, 0x3b, 0xb7, 0x9f, ++ 0xeb, 0xf9, 0xfb, 0x3c, 0x18, 0x6f, 0x84, 0xf4, 0xfe, 0x91, 0xde, 0xbb, ++ 0x0c, 0xf1, 0xfb, 0x11, 0xc8, 0xaf, 0x78, 0x8f, 0xb5, 0xe4, 0x72, 0xfa, ++ 0xfc, 0xa8, 0x45, 0x9d, 0x49, 0x7e, 0x43, 0xb0, 0x51, 0x50, 0x0e, 0xf9, ++ 0xa8, 0xe5, 0xb9, 0x50, 0x8c, 0x87, 0x96, 0xf2, 0x5a, 0xa1, 0xfa, 0xb1, ++ 0x03, 0xdf, 0xff, 0x59, 0x73, 0x80, 0xc7, 0x05, 0xe3, 0xfb, 0xf4, 0xf4, ++ 0x56, 0xa8, 0xd0, 0x83, 0xd4, 0x09, 0x3d, 0xc8, 0x9a, 0x43, 0x86, 0x99, ++ 0x71, 0x83, 0x49, 0xfe, 0xa2, 0x2f, 0x35, 0x7a, 0xaf, 0xb1, 0x3f, 0xfc, ++ 0x55, 0x09, 0xf9, 0xaa, 0x2f, 0xbf, 0x7f, 0x1f, 0xdd, 0xdb, 0x6a, 0xda, ++ 0xb8, 0xfc, 0x50, 0xe3, 0xe9, 0x22, 0xf9, 0x41, 0xca, 0x23, 0x32, 0xee, ++ 0xb0, 0xba, 0xad, 0x8b, 0xe4, 0x09, 0xd9, 0xae, 0x6e, 0x3f, 0x87, 0x4b, ++ 0xed, 0x7e, 0xfe, 0xbd, 0x34, 0x55, 0x27, 0xf5, 0x28, 0x0e, 0x25, 0x19, ++ 0xef, 0xd3, 0x0a, 0xe5, 0xeb, 0x5e, 0x1c, 0x53, 0xb2, 0x4e, 0x93, 0x1f, ++ 0x4d, 0xf9, 0xba, 0xc9, 0xe2, 0x5d, 0x35, 0x7d, 0x0f, 0xc9, 0x83, 0xf7, ++ 0xa6, 0xbe, 0x4b, 0xf7, 0xf0, 0xda, 0x66, 0xd1, 0x2f, 0xe4, 0x0d, 0x7e, ++ 0xe3, 0x2d, 0x40, 0x22, 0x1a, 0xc2, 0xbf, 0x8f, 0xc0, 0x7b, 0xb9, 0xb8, ++ 0xff, 0xcb, 0xf2, 0xda, 0xfd, 0x11, 0xd4, 0xde, 0x5b, 0x1b, 0xbc, 0x11, ++ 0xcf, 0x79, 0x47, 0x9d, 0x45, 0x8f, 0x69, 0x53, 0xad, 0x85, 0xce, 0xfd, ++ 0x6d, 0xf5, 0xba, 0x54, 0xf4, 0x53, 0x77, 0x28, 0xc1, 0x76, 0x94, 0xe3, ++ 0xda, 0x85, 0xff, 0xd6, 0x90, 0xea, 0x0f, 0xcc, 0xa8, 0x3f, 0x88, 0x65, ++ 0x3d, 0x47, 0xf1, 0xbd, 0xdd, 0x97, 0xe3, 0x9d, 0x2b, 0x73, 0xa1, 0xdf, ++ 0x68, 0x7c, 0xdd, 0x45, 0xf5, 0xc5, 0x13, 0x75, 0xbf, 0xfc, 0x59, 0x26, ++ 0xf6, 0x9f, 0x3f, 0xbc, 0xf3, 0x32, 0xbe, 0xa9, 0x61, 0x50, 0x72, 0x4a, ++ 0x0a, 0x60, 0x9f, 0xaf, 0xce, 0x15, 0x7a, 0x9e, 0xb4, 0xce, 0x4c, 0xa4, ++ 0xeb, 0x21, 0x47, 0x38, 0x7f, 0x7e, 0xd4, 0xc0, 0x36, 0xd2, 0xbb, 0xcd, ++ 0xfa, 0x22, 0x86, 0xfa, 0x7b, 0xaf, 0xb0, 0x2f, 0xba, 0xbe, 0xd1, 0xd1, ++ 0xfb, 0xb3, 0xed, 0x8a, 0xf7, 0x09, 0x7f, 0xf9, 0x6a, 0xb7, 0xa0, 0xcf, ++ 0xa2, 0x20, 0x6e, 0x67, 0x6c, 0x19, 0xef, 0xbc, 0x03, 0x97, 0xfc, 0x53, ++ 0xc5, 0x30, 0x2e, 0x9d, 0xfc, 0x1b, 0xd5, 0x91, 0xd8, 0x7f, 0xb7, 0xb0, ++ 0x43, 0x4a, 0x39, 0x75, 0xba, 0xe0, 0xcf, 0xf1, 0xe2, 0x7e, 0x65, 0x1c, ++ 0x1a, 0x63, 0x41, 0x3a, 0x96, 0x7e, 0x7d, 0x8a, 0xc3, 0x41, 0xf1, 0x9e, ++ 0x77, 0xa5, 0x1d, 0x29, 0xc7, 0xf3, 0xf9, 0x57, 0x3d, 0x26, 0x8a, 0x17, ++ 0x98, 0xde, 0x13, 0x4c, 0x72, 0x6b, 0xfc, 0xd0, 0x59, 0x74, 0x9e, 0xc9, ++ 0x77, 0xdb, 0x15, 0x9b, 0x9e, 0x15, 0x43, 0xfd, 0x23, 0x69, 0x3a, 0x2f, ++ 0xc6, 0xc5, 0xfd, 0x8a, 0x99, 0xb8, 0x5f, 0x80, 0x29, 0x40, 0xbe, 0xd5, ++ 0x99, 0xc9, 0x3f, 0x59, 0x69, 0x7f, 0xfd, 0x1b, 0xe4, 0xeb, 0x71, 0xea, ++ 0x17, 0x47, 0xc3, 0xd1, 0x5f, 0xf6, 0x67, 0x0a, 0xbd, 0x3f, 0x5a, 0xd2, ++ 0x7b, 0xe6, 0xd1, 0x77, 0x18, 0xde, 0x87, 0xdd, 0xe9, 0x08, 0xbf, 0x6f, ++ 0xe3, 0x9d, 0xad, 0xb8, 0x9e, 0x13, 0xbd, 0xb3, 0xba, 0x9c, 0x80, 0xba, ++ 0x5f, 0x59, 0x3d, 0x26, 0x3b, 0x3f, 0x2f, 0x98, 0xff, 0x3a, 0xda, 0x7f, ++ 0xfe, 0x4d, 0x58, 0xa4, 0xce, 0x37, 0xbf, 0xee, 0x9e, 0x33, 0xf4, 0xae, ++ 0x63, 0x77, 0x8f, 0x89, 0xf4, 0xb6, 0xd3, 0xdb, 0xc5, 0x3b, 0x87, 0x01, ++ 0xf3, 0xe9, 0x8e, 0xb1, 0x91, 0x9f, 0x34, 0xd4, 0x23, 0x79, 0xb3, 0xdb, ++ 0xa2, 0xa3, 0xf7, 0xdd, 0xa6, 0xb7, 0x1f, 0xa5, 0xf7, 0x0a, 0xa7, 0xcb, ++ 0xf7, 0x0c, 0x4d, 0xda, 0xf7, 0x0c, 0x99, 0x2d, 0x3e, 0x02, 0xf5, 0xca, ++ 0xa4, 0x4b, 0x05, 0xe1, 0x20, 0xaa, 0x89, 0xe3, 0x2f, 0x3f, 0x5c, 0x7b, ++ 0x5f, 0x3c, 0x94, 0xcb, 0xe5, 0xc5, 0x43, 0xb9, 0x4a, 0xbf, 0xef, 0xdd, ++ 0xcb, 0xb8, 0x15, 0x79, 0xae, 0xbc, 0x62, 0xd9, 0xbd, 0x94, 0xeb, 0xa5, ++ 0xf8, 0x3e, 0x5d, 0x25, 0xed, 0xfc, 0x57, 0x92, 0x48, 0x9e, 0xe8, 0x6d, ++ 0x1f, 0xf1, 0x9d, 0xef, 0x58, 0xbc, 0x87, 0x72, 0x05, 0xc8, 0x0b, 0x9f, ++ 0x5c, 0xe3, 0x38, 0x9c, 0x9b, 0xed, 0x3b, 0x57, 0xe7, 0x0b, 0x38, 0xc9, ++ 0xf3, 0x59, 0xc6, 0x2d, 0xcc, 0x17, 0xf0, 0x9a, 0x6f, 0xd1, 0x71, 0xf8, ++ 0x04, 0xfc, 0xee, 0x8a, 0xa4, 0x9b, 0x40, 0xba, 0xf0, 0xe1, 0x9d, 0xc7, ++ 0x7b, 0x49, 0x7c, 0xb2, 0x3b, 0x3a, 0x5e, 0xc3, 0x78, 0x2c, 0xc0, 0xe3, ++ 0xb8, 0xfb, 0x19, 0xe1, 0xef, 0x4d, 0x9c, 0xc7, 0x89, 0x6f, 0xde, 0x5c, ++ 0x8f, 0xcf, 0x2e, 0x0c, 0x55, 0x1d, 0x5d, 0xce, 0xc4, 0x1f, 0x05, 0x7f, ++ 0xf4, 0x7e, 0xf7, 0x0f, 0xc6, 0x5f, 0x47, 0x20, 0xfe, 0xbc, 0xe6, 0x51, ++ 0x28, 0x47, 0x3c, 0xa8, 0x23, 0x39, 0x42, 0xfa, 0x3b, 0x3a, 0xc5, 0x7b, ++ 0xed, 0xd2, 0xef, 0x91, 0xa5, 0x32, 0xe2, 0x07, 0x25, 0x6a, 0x30, 0xe9, ++ 0x0b, 0x9d, 0xe2, 0x9d, 0x76, 0xe0, 0x03, 0xaf, 0x21, 0x1f, 0x90, 0xfb, ++ 0x7f, 0xf8, 0xac, 0xce, 0x71, 0x78, 0x8e, 0x9e, 0x80, 0x2b, 0x3a, 0xce, ++ 0xaf, 0x53, 0xe7, 0xa1, 0xef, 0x96, 0x3c, 0xee, 0x6f, 0x38, 0x8c, 0x75, ++ 0xc4, 0x0a, 0xff, 0x9c, 0x6c, 0x94, 0xdf, 0x54, 0xdf, 0xfb, 0xd4, 0x44, ++ 0xf7, 0x4d, 0x8a, 0xfb, 0xe1, 0xe5, 0xe8, 0x7f, 0x39, 0xdf, 0x42, 0x7e, ++ 0xee, 0xdd, 0xee, 0x80, 0xf7, 0xa9, 0xc5, 0x3b, 0xe6, 0xdd, 0x4c, 0xf0, ++ 0x87, 0x85, 0xf2, 0x1d, 0x73, 0xd8, 0xcf, 0xd0, 0xae, 0x75, 0x11, 0x2f, ++ 0xef, 0x7b, 0xc7, 0x7c, 0x24, 0xa3, 0x7b, 0x54, 0x6b, 0x3a, 0x4b, 0x41, ++ 0xf9, 0xab, 0x75, 0x4e, 0x2a, 0xff, 0x5d, 0x18, 0xc9, 0x5f, 0x02, 0xdf, ++ 0x31, 0x5f, 0x19, 0x49, 0x7a, 0xd3, 0x47, 0x1e, 0x71, 0x8f, 0xc6, 0xf3, ++ 0x40, 0xbe, 0x5f, 0x9d, 0x1b, 0xef, 0x34, 0xe6, 0x0d, 0xb9, 0xfa, 0xfd, ++ 0xea, 0x2d, 0x4a, 0xd1, 0x22, 0xfc, 0x1d, 0x18, 0xd7, 0x38, 0x3e, 0xdf, ++ 0xce, 0x45, 0xc1, 0xcf, 0xec, 0xe6, 0xe0, 0xf6, 0xa2, 0xbe, 0xe7, 0x44, ++ 0x43, 0x28, 0xbd, 0xdb, 0xdd, 0x77, 0x0e, 0x0b, 0x3d, 0xf7, 0x70, 0x57, ++ 0xd7, 0xc3, 0x08, 0x27, 0x19, 0x57, 0xfb, 0x89, 0xa0, 0x37, 0x09, 0x7f, ++ 0x19, 0x57, 0x38, 0x38, 0x00, 0x0f, 0x92, 0xee, 0xfa, 0x7e, 0x2f, 0x66, ++ 0x2d, 0xa7, 0xbf, 0x3e, 0x7f, 0xda, 0x3a, 0x46, 0xfa, 0x94, 0x61, 0x30, ++ 0x95, 0x10, 0xf2, 0x8f, 0xb4, 0xdb, 0x10, 0xae, 0x1b, 0x13, 0x9c, 0x09, ++ 0x38, 0xff, 0xa6, 0xd5, 0x00, 0x67, 0xd2, 0xa3, 0x73, 0x3f, 0xcf, 0x13, ++ 0xe2, 0xf7, 0x2c, 0x02, 0xf7, 0xd3, 0xe8, 0x3c, 0x9d, 0xb4, 0x13, 0x53, ++ 0xbc, 0x40, 0x89, 0x38, 0xd7, 0x4a, 0x64, 0x7c, 0x40, 0x83, 0x36, 0x3e, ++ 0x20, 0xf0, 0x7d, 0xd3, 0xe0, 0x61, 0x45, 0x63, 0xf3, 0x80, 0xfe, 0x2f, ++ 0x2a, 0xef, 0xe5, 0xe0, 0xc7, 0x37, 0xff, 0x8f, 0xda, 0xaf, 0xdf, 0x49, ++ 0x56, 0x1e, 0xe7, 0xe3, 0xc9, 0x31, 0xce, 0xcc, 0x3c, 0xd2, 0xff, 0x4f, ++ 0xd7, 0xc8, 0x91, 0x6f, 0xa6, 0x7f, 0x16, 0x4f, 0xbf, 0x2f, 0xf3, 0xed, ++ 0xd1, 0x61, 0x78, 0xee, 0xdd, 0x14, 0x5f, 0x94, 0x83, 0xfd, 0x9a, 0x93, ++ 0xb9, 0xdd, 0xe0, 0x93, 0xd8, 0x4e, 0x8a, 0xef, 0xf8, 0x64, 0xd1, 0xdf, ++ 0xe2, 0x49, 0xef, 0xbc, 0x96, 0xbf, 0xcb, 0xfa, 0x43, 0xe7, 0x79, 0x75, ++ 0x3c, 0x33, 0xa7, 0x83, 0x5b, 0x97, 0x71, 0x7f, 0xc4, 0x38, 0x56, 0x4f, ++ 0xf4, 0x1b, 0xe3, 0x8b, 0x93, 0x35, 0xe3, 0x3c, 0xfe, 0xb7, 0xc5, 0x33, ++ 0xfb, 0xe2, 0x8d, 0xf7, 0xd0, 0xef, 0x8a, 0xbc, 0xd2, 0xe8, 0x19, 0x71, ++ 0x7a, 0xe4, 0xd5, 0xf8, 0xc8, 0x0d, 0x3a, 0xf2, 0x9c, 0x0d, 0x6e, 0x34, ++ 0xb5, 0x79, 0x07, 0x4a, 0xd0, 0xcf, 0x20, 0x37, 0xfc, 0xc8, 0xad, 0x89, ++ 0x90, 0xbf, 0x3d, 0xef, 0x45, 0x9e, 0x8f, 0x3b, 0x72, 0x39, 0x11, 0x70, ++ 0xf3, 0xb3, 0xbc, 0x97, 0x78, 0x7e, 0xec, 0x91, 0xcb, 0x18, 0x0f, 0xfc, ++ 0xf3, 0xbc, 0x76, 0x9e, 0x47, 0xbb, 0xc1, 0x50, 0xc6, 0xee, 0xcc, 0x7b, ++ 0xb9, 0xc4, 0x85, 0xf7, 0x96, 0xf1, 0xce, 0xb5, 0x88, 0xd7, 0x05, 0x57, ++ 0xea, 0x5f, 0xc3, 0x63, 0xf8, 0xfd, 0x75, 0x73, 0x97, 0x25, 0x52, 0x3c, ++ 0xeb, 0x9c, 0xf8, 0x54, 0x1e, 0xcf, 0xba, 0x1a, 0xf1, 0x39, 0x3f, 0xaa, ++ 0x6c, 0x7d, 0xb8, 0xe2, 0x8b, 0x67, 0x7d, 0x38, 0x8f, 0xb7, 0xeb, 0xfe, ++ 0x82, 0xd3, 0x7f, 0xf7, 0x17, 0x9c, 0xde, 0x83, 0x90, 0x0f, 0x0c, 0xf9, ++ 0xe7, 0x53, 0x19, 0xd7, 0x2b, 0xf9, 0xef, 0x40, 0x7c, 0x52, 0xee, 0xbf, ++ 0x1f, 0x2b, 0x2e, 0x59, 0xee, 0x63, 0xb6, 0xdb, 0xbe, 0xd1, 0x80, 0xc4, ++ 0xe8, 0xfa, 0xa7, 0xe3, 0x85, 0x1f, 0xca, 0xa3, 0xf3, 0x4e, 0x1b, 0x2f, ++ 0xdc, 0x6d, 0xe8, 0x79, 0x8c, 0xec, 0x49, 0x5f, 0x30, 0x1b, 0xc6, 0x21, ++ 0x1e, 0x0e, 0xfd, 0xc0, 0x86, 0xe7, 0x44, 0x53, 0x36, 0x8f, 0x67, 0x54, ++ 0x7a, 0x3a, 0x6c, 0xe8, 0x87, 0x91, 0x9b, 0xc5, 0xf3, 0x4d, 0x5f, 0x74, ++ 0xd8, 0x90, 0xbf, 0x63, 0x1e, 0xf5, 0x5a, 0xdd, 0x11, 0x3c, 0xce, 0x51, ++ 0xc6, 0xc3, 0x36, 0x7d, 0xe1, 0x8d, 0xc5, 0x7d, 0x92, 0x8b, 0x71, 0x8b, ++ 0x50, 0xbf, 0xa0, 0xa7, 0xa7, 0x04, 0xf9, 0x4d, 0x2e, 0xfa, 0xf1, 0x26, ++ 0x62, 0xff, 0xc7, 0x8e, 0x8a, 0xf1, 0x18, 0xf6, 0xb7, 0xf3, 0x0b, 0x1e, ++ 0x6f, 0xd8, 0x6d, 0xee, 0xb0, 0x59, 0xc5, 0x38, 0xd8, 0x0f, 0x8c, 0x9b, ++ 0x88, 0x7c, 0x31, 0xf7, 0x36, 0x13, 0xf9, 0x1b, 0x35, 0x7d, 0x51, 0xbf, ++ 0x9a, 0xfa, 0x29, 0xb6, 0xf4, 0x8d, 0xab, 0x04, 0x8c, 0x6b, 0xfa, 0xee, ++ 0x71, 0x67, 0x28, 0x7e, 0xe3, 0x26, 0xf7, 0xf2, 0xb8, 0x4e, 0x1c, 0xd7, ++ 0xa6, 0x19, 0xd7, 0x4b, 0xf1, 0xc0, 0xd0, 0x1f, 0xc5, 0x9d, 0x76, 0x47, ++ 0xd8, 0x63, 0xf0, 0xbe, 0x2f, 0xf3, 0x05, 0x58, 0x0e, 0xf9, 0x87, 0xc4, ++ 0xef, 0x53, 0xe4, 0xda, 0xbc, 0x2a, 0xf2, 0x7f, 0x19, 0x1f, 0x15, 0x6d, ++ 0x14, 0xef, 0x70, 0x8b, 0xfb, 0x0a, 0xd4, 0xa3, 0x78, 0xcc, 0x9d, 0xbd, ++ 0x7c, 0x9d, 0x97, 0x1a, 0xbd, 0x55, 0xb8, 0x9f, 0x0a, 0x04, 0xbf, 0x2e, ++ 0x30, 0xf2, 0xf3, 0x92, 0xe9, 0x82, 0xed, 0xe8, 0x87, 0x5d, 0xa8, 0x7e, ++ 0x7b, 0x2c, 0x0e, 0xef, 0x25, 0x87, 0xf8, 0xbd, 0xa4, 0x20, 0xa8, 0x68, ++ 0x1b, 0xee, 0xc7, 0x3a, 0x3d, 0xe7, 0x37, 0x6c, 0xb0, 0xfc, 0x9d, 0xb4, ++ 0x8e, 0x95, 0xbf, 0x85, 0x7a, 0xef, 0x46, 0xc5, 0xd1, 0xef, 0x8a, 0x0d, ++ 0x8b, 0x79, 0x9e, 0x25, 0xe3, 0xbd, 0x78, 0xd5, 0xac, 0x34, 0x3c, 0x2f, ++ 0x40, 0xde, 0xfe, 0x10, 0xf7, 0xc5, 0xbb, 0xac, 0x45, 0xe1, 0xbf, 0xbf, ++ 0xc5, 0xdb, 0xcf, 0x9b, 0x15, 0x42, 0xfe, 0x27, 0xdd, 0x2f, 0x8f, 0xca, ++ 0xc6, 0xfd, 0x33, 0x37, 0xc8, 0x76, 0x80, 0xc1, 0xbe, 0xfd, 0xe4, 0xe5, ++ 0xee, 0x12, 0x8c, 0xcb, 0x9f, 0x1b, 0x6e, 0xcb, 0xc6, 0x9b, 0xce, 0x27, ++ 0x79, 0xbd, 0xb4, 0x4f, 0xe7, 0x46, 0xdb, 0x0e, 0xa0, 0x5d, 0xd7, 0xe4, ++ 0xea, 0x26, 0xb9, 0x5c, 0xda, 0x69, 0x6f, 0xf6, 0xd9, 0x69, 0x4f, 0x23, ++ 0x5d, 0xd5, 0xce, 0xba, 0x68, 0xe4, 0x72, 0x59, 0x0f, 0xbd, 0xcf, 0x7c, ++ 0x36, 0x8f, 0xdf, 0x43, 0x40, 0x6e, 0x27, 0xb9, 0xa3, 0xe7, 0x5a, 0xf1, ++ 0xde, 0x66, 0x9a, 0x2d, 0x1b, 0xcb, 0x13, 0x0c, 0x3d, 0x61, 0x08, 0xb7, ++ 0xee, 0x6f, 0xf5, 0xfc, 0xbd, 0x5a, 0xd6, 0x13, 0x76, 0x93, 0x9f, 0x5d, ++ 0xf6, 0xb1, 0x76, 0xfe, 0x8e, 0x6d, 0x20, 0x5d, 0x3f, 0x99, 0xcf, 0xe5, ++ 0xc4, 0x55, 0xc9, 0x16, 0x7a, 0xe7, 0xac, 0x2e, 0xc6, 0x64, 0xa2, 0xb4, ++ 0xfd, 0x8b, 0x99, 0xf4, 0x3b, 0x30, 0xfa, 0xa2, 0x64, 0xbc, 0x17, 0x38, ++ 0x8c, 0xfd, 0xeb, 0x1b, 0xb7, 0xe5, 0x73, 0x79, 0x33, 0x71, 0x83, 0xd1, ++ 0x67, 0x77, 0x87, 0xf3, 0xc3, 0x11, 0xcc, 0x64, 0xde, 0xc5, 0x26, 0x32, ++ 0xb6, 0xfd, 0x5f, 0x82, 0xfb, 0xee, 0x5d, 0x78, 0xc4, 0x18, 0x47, 0xca, ++ 0x7b, 0x58, 0xf8, 0xe3, 0x05, 0xc9, 0x9a, 0xfa, 0x0e, 0xac, 0xef, 0x2b, ++ 0xe7, 0xcf, 0xb3, 0xc9, 0xf6, 0xb1, 0xf9, 0xea, 0xe3, 0xcd, 0xc9, 0x62, ++ 0x3c, 0xc4, 0xf3, 0x72, 0xee, 0x37, 0x11, 0x78, 0x5e, 0x2c, 0x99, 0x1a, ++ 0xa9, 0xf1, 0xb7, 0x7a, 0x74, 0xb0, 0x99, 0xfc, 0xad, 0x92, 0x55, 0xa1, ++ 0xc7, 0x83, 0xba, 0x56, 0xd2, 0x07, 0x72, 0xbb, 0x6d, 0xdc, 0xef, 0xcc, ++ 0x14, 0x3f, 0xb7, 0xd3, 0xcc, 0xe9, 0x30, 0x59, 0x27, 0x7e, 0x2f, 0x45, ++ 0x27, 0xe2, 0x7c, 0x85, 0x9e, 0x4f, 0xde, 0x5f, 0x1a, 0xa6, 0x3a, 0xc7, ++ 0x4c, 0x1d, 0x42, 0xfd, 0x78, 0xa9, 0x1f, 0x75, 0x5f, 0x3a, 0xca, 0x13, ++ 0xb1, 0xcc, 0x43, 0xe3, 0x4b, 0xb9, 0x4c, 0xd6, 0x03, 0xf9, 0xcb, 0x4c, ++ 0x4c, 0x46, 0xfc, 0xce, 0x5b, 0xae, 0xaa, 0xeb, 0x17, 0x9e, 0x87, 0xf3, ++ 0xa7, 0xe5, 0xe5, 0x67, 0x23, 0x5d, 0xbb, 0xd8, 0xa7, 0x7e, 0xe7, 0xc4, ++ 0xa5, 0x90, 0xb0, 0x06, 0x7f, 0xfc, 0xd5, 0xa9, 0x5a, 0x7d, 0xe7, 0xe1, ++ 0xfc, 0xe9, 0xd4, 0x4e, 0xb6, 0xaf, 0x6d, 0x98, 0xc1, 0x3e, 0xa5, 0x38, ++ 0x44, 0x2f, 0xd1, 0x4f, 0x6d, 0xb2, 0x8e, 0xee, 0xab, 0x75, 0x2a, 0x7b, ++ 0x95, 0x7e, 0x6f, 0x80, 0x75, 0x90, 0x1d, 0x53, 0xb6, 0xfb, 0x00, 0xf8, ++ 0xe4, 0xa7, 0xf4, 0x5e, 0x83, 0x83, 0xd2, 0x0f, 0x81, 0x5f, 0x7e, 0x4a, ++ 0x7e, 0x7e, 0x0b, 0x29, 0xfd, 0xb8, 0xd1, 0x49, 0xdf, 0x4f, 0x34, 0x56, ++ 0x52, 0xda, 0xd9, 0x58, 0x4f, 0xdf, 0x4f, 0x36, 0x36, 0x50, 0xba, 0x60, ++ 0x49, 0x68, 0x16, 0xd2, 0xff, 0xaa, 0x83, 0xeb, 0xd8, 0xa7, 0x7e, 0xe7, ++ 0x63, 0xad, 0xc7, 0xe0, 0xf4, 0xf7, 0xab, 0xf9, 0x60, 0x5a, 0xff, 0x74, ++ 0x54, 0x2e, 0xe8, 0xe8, 0x83, 0xc4, 0xfe, 0xcb, 0xd7, 0xe6, 0x73, 0xb9, ++ 0xe8, 0x83, 0x7c, 0x8e, 0xcf, 0xee, 0x65, 0x5c, 0xbe, 0x04, 0xba, 0x6c, ++ 0xb6, 0x46, 0x0e, 0x2c, 0x2f, 0x74, 0x87, 0x72, 0x7f, 0x84, 0x97, 0xa6, ++ 0x73, 0x79, 0xa7, 0x3b, 0x96, 0xe7, 0x97, 0xe6, 0x1b, 0x68, 0x3c, 0x87, ++ 0x8e, 0x6d, 0xc5, 0xf6, 0x2f, 0x4d, 0x37, 0xf2, 0xf1, 0x93, 0x74, 0xf4, ++ 0x9e, 0x83, 0x23, 0x92, 0xf7, 0xfb, 0x41, 0x8a, 0x8e, 0xe4, 0xb4, 0xeb, ++ 0x66, 0x4e, 0x5b, 0x82, 0x70, 0x72, 0x44, 0xc1, 0xf7, 0x0c, 0x5f, 0xfe, ++ 0x83, 0x31, 0xbc, 0xdc, 0x31, 0x94, 0x7f, 0x97, 0xf3, 0x95, 0xe5, 0x63, ++ 0xa6, 0xf6, 0xe9, 0x0f, 0x52, 0xf8, 0xbd, 0x98, 0xdb, 0xdd, 0x81, 0xde, ++ 0xa9, 0xff, 0x3e, 0xfc, 0x16, 0xf0, 0xf9, 0x05, 0xd6, 0x97, 0x7e, 0xf4, ++ 0x81, 0xf0, 0x78, 0x45, 0xec, 0x5b, 0xda, 0x17, 0x28, 0xb7, 0xe3, 0x3e, ++ 0x48, 0xf4, 0xdb, 0x17, 0x75, 0x36, 0xda, 0x17, 0x92, 0x0e, 0x25, 0xfd, ++ 0x2d, 0x99, 0xca, 0xe1, 0x9c, 0x1c, 0x24, 0xe8, 0x1c, 0xce, 0x2e, 0x82, ++ 0x1f, 0x9e, 0x61, 0x78, 0x2f, 0x8e, 0x36, 0x93, 0x1c, 0xeb, 0x40, 0xbb, ++ 0x05, 0xac, 0x67, 0xa7, 0x88, 0x73, 0xbf, 0x6a, 0x3f, 0x08, 0x3b, 0x80, ++ 0xdc, 0x0f, 0x72, 0x1f, 0x48, 0x7a, 0x8f, 0x83, 0x7d, 0xc6, 0xed, 0x1c, ++ 0x7c, 0x1d, 0x79, 0x6a, 0xff, 0xfa, 0xf9, 0x66, 0xb1, 0x8e, 0x8e, 0xa8, ++ 0xd0, 0xdb, 0x09, 0xaf, 0xed, 0x06, 0x2b, 0x9e, 0x37, 0x79, 0x2a, 0xb7, ++ 0x37, 0x74, 0xb7, 0xcf, 0xcf, 0x42, 0x7f, 0xf0, 0xc2, 0xbb, 0x2d, 0xf5, ++ 0xfd, 0xf1, 0xaf, 0x97, 0xfe, 0xbb, 0x70, 0x90, 0xfc, 0x60, 0x00, 0x38, ++ 0x5c, 0xb5, 0x7e, 0xa3, 0xd0, 0xd7, 0xff, 0x83, 0xeb, 0x27, 0xfe, 0x86, ++ 0x7c, 0x7b, 0x19, 0xf7, 0xc7, 0x0c, 0xa4, 0xd7, 0xbd, 0xf9, 0x92, 0x5f, ++ 0x71, 0xba, 0x3d, 0x9c, 0xef, 0x78, 0x02, 0xe9, 0xa7, 0x5b, 0x31, 0xeb, ++ 0xf1, 0x7e, 0xd2, 0x6d, 0xee, 0xdf, 0x7f, 0xfc, 0xa5, 0xe9, 0x7c, 0x5f, ++ 0x48, 0xfa, 0x59, 0x32, 0x95, 0xcb, 0x5b, 0x71, 0xb8, 0xce, 0x11, 0x57, ++ 0xf3, 0x3b, 0xb9, 0x9e, 0xbe, 0x75, 0xae, 0x60, 0xc4, 0xf7, 0x92, 0x45, ++ 0x9c, 0x71, 0x20, 0x7e, 0xe5, 0xba, 0xfc, 0xf8, 0xde, 0xa1, 0x7c, 0x3f, ++ 0xbd, 0x13, 0x63, 0x20, 0xaf, 0x40, 0x3f, 0xc3, 0x6a, 0x2c, 0x74, 0x3f, ++ 0x95, 0xf4, 0x7b, 0x69, 0xc8, 0x37, 0xcb, 0xf1, 0xfc, 0x2a, 0xcc, 0xb7, ++ 0x71, 0xfb, 0x8b, 0x4e, 0x15, 0xef, 0xc0, 0xf2, 0xf3, 0xa4, 0xef, 0xbb, ++ 0xa2, 0x52, 0xbc, 0x95, 0xdf, 0x39, 0xc3, 0x50, 0x6e, 0xe9, 0x79, 0x99, ++ 0xdb, 0xe1, 0xbc, 0x70, 0x4f, 0x42, 0x3b, 0x16, 0xea, 0x9e, 0xfd, 0xe3, ++ 0xad, 0x2f, 0x0b, 0x7e, 0xd1, 0xbb, 0x30, 0x5b, 0x87, 0xfa, 0x81, 0x4b, ++ 0x5f, 0x5b, 0x5c, 0x78, 0x6e, 0x5d, 0x1a, 0xda, 0x73, 0x02, 0xe5, 0x92, ++ 0x4b, 0x5b, 0xf9, 0x3b, 0xe7, 0xd0, 0xe3, 0x6c, 0x05, 0xfd, 0x45, 0x30, ++ 0xee, 0xc7, 0x86, 0xbf, 0xd7, 0xc2, 0xed, 0x1f, 0xea, 0xc3, 0x5f, 0x9d, ++ 0x40, 0x79, 0x68, 0xf9, 0xc3, 0x2a, 0xc9, 0x2f, 0x97, 0xf0, 0xba, 0x0c, ++ 0xed, 0x56, 0x3d, 0xc8, 0x7f, 0xdf, 0x4e, 0xfa, 0x0d, 0xd6, 0x88, 0x76, ++ 0x4d, 0x5b, 0x2f, 0x2f, 0xa0, 0xdf, 0x35, 0x03, 0xfa, 0x44, 0xf9, 0xe7, ++ 0x53, 0x73, 0x5d, 0x12, 0xca, 0xc5, 0x33, 0x1e, 0x7e, 0xf0, 0x38, 0xbe, ++ 0xbb, 0xbe, 0xfc, 0x80, 0x82, 0x6a, 0x66, 0x76, 0x14, 0xf5, 0xed, 0x90, ++ 0x3f, 0xb3, 0x47, 0xe5, 0xbf, 0xaf, 0x2a, 0xe2, 0x4d, 0x66, 0x0a, 0xbf, ++ 0xfe, 0xaa, 0x5d, 0xdc, 0xaf, 0xbf, 0x06, 0xe3, 0x4c, 0x50, 0x7e, 0xd9, ++ 0xbf, 0x7d, 0x0b, 0xfe, 0xee, 0x64, 0xed, 0x1e, 0x03, 0x33, 0xc3, 0xf7, ++ 0x99, 0xf8, 0x3e, 0x1a, 0x8c, 0xb3, 0xc2, 0x13, 0x0a, 0x17, 0x48, 0xe8, ++ 0xb7, 0x55, 0x1b, 0x97, 0xfa, 0x13, 0xe6, 0xda, 0x80, 0x7a, 0xe4, 0xca, ++ 0x6d, 0xda, 0xef, 0x55, 0x3b, 0xb5, 0xf9, 0x9a, 0x00, 0x7f, 0xc5, 0x4b, ++ 0xf9, 0x22, 0x4e, 0x65, 0x34, 0x4b, 0x27, 0xbf, 0xc4, 0x56, 0xae, 0x27, ++ 0x96, 0x7c, 0xfb, 0x6a, 0x79, 0xd7, 0x45, 0xf8, 0x71, 0xac, 0x91, 0x7e, ++ 0xba, 0x5f, 0xd2, 0xbb, 0xde, 0xea, 0xcb, 0x5f, 0x25, 0x9c, 0xb4, 0xf0, ++ 0xfc, 0x1c, 0x91, 0xef, 0x82, 0xfc, 0xc5, 0xaf, 0x38, 0xfc, 0x25, 0xdc, ++ 0xea, 0x04, 0xcf, 0xbf, 0x18, 0xcb, 0xb2, 0x3c, 0xb0, 0xbe, 0xba, 0x97, ++ 0xcd, 0x56, 0xbc, 0xff, 0xd7, 0x1d, 0xe2, 0xfa, 0x81, 0x4b, 0x9e, 0x70, ++ 0x82, 0xf3, 0xaa, 0xe0, 0x4e, 0xb2, 0x27, 0xb0, 0x17, 0x55, 0x2b, 0xca, ++ 0x61, 0xf7, 0x1c, 0x54, 0x49, 0x9f, 0x50, 0xdb, 0x6e, 0x7e, 0x02, 0x7f, ++ 0x8f, 0xb6, 0xee, 0x80, 0x42, 0xef, 0xd4, 0xd6, 0x1e, 0x0c, 0x72, 0x73, ++ 0xf8, 0x7c, 0xb1, 0x1c, 0xcb, 0x57, 0x1c, 0x34, 0x5b, 0x6d, 0x58, 0xfe, ++ 0x62, 0x10, 0x43, 0xbd, 0xf3, 0x25, 0xc0, 0x1b, 0xfa, 0xc3, 0x5e, 0x8a, ++ 0xef, 0x24, 0xfc, 0x23, 0x5e, 0x51, 0x1f, 0x01, 0x7f, 0xb3, 0xf1, 0x77, ++ 0x2b, 0x24, 0xfe, 0xd5, 0x87, 0xb9, 0x1d, 0x79, 0xf9, 0x5e, 0x81, 0x9f, ++ 0xad, 0xb7, 0xea, 0x09, 0xaf, 0x6e, 0x85, 0x45, 0x27, 0x5e, 0x8d, 0x27, ++ 0x89, 0xe7, 0xd7, 0x75, 0x4f, 0xf5, 0xe1, 0x09, 0xdb, 0xcd, 0x78, 0xf8, ++ 0xfd, 0x63, 0x02, 0xef, 0x0c, 0xe3, 0x6c, 0x8e, 0x6e, 0x2d, 0xa7, 0xdf, ++ 0xc3, 0x90, 0xf8, 0x36, 0xbe, 0xfc, 0x69, 0x02, 0xca, 0xbd, 0x12, 0xcf, ++ 0x2a, 0xe0, 0xf9, 0x4e, 0xd9, 0xde, 0x26, 0xde, 0xc1, 0xfb, 0x0e, 0x3c, ++ 0x57, 0x22, 0x9e, 0x2d, 0xff, 0x38, 0x9e, 0x5f, 0xc7, 0xf3, 0x31, 0x9b, ++ 0xe4, 0xde, 0x33, 0xbf, 0x41, 0xb9, 0x37, 0xd4, 0x48, 0xf6, 0x73, 0xa9, ++ 0xcf, 0x90, 0xfa, 0x8b, 0x21, 0xd5, 0x1f, 0xbc, 0x36, 0x18, 0x06, 0x1e, ++ 0x19, 0xf3, 0x1c, 0xc9, 0xb9, 0x25, 0x91, 0xe7, 0x6b, 0x57, 0x33, 0xd2, ++ 0x9f, 0x65, 0x21, 0xff, 0x3a, 0x71, 0xed, 0x5b, 0xf8, 0x73, 0xbe, 0xec, ++ 0xdd, 0xeb, 0x9e, 0x4a, 0x47, 0xfa, 0x68, 0x32, 0x74, 0xd2, 0xef, 0xc5, ++ 0xb8, 0x22, 0xf8, 0x7b, 0xf2, 0xdd, 0x89, 0x73, 0xb6, 0xbd, 0x00, 0xe3, ++ 0x15, 0x44, 0x7e, 0x93, 0xb0, 0x0f, 0xf7, 0xcd, 0x2b, 0x41, 0x64, 0x36, ++ 0x71, 0x08, 0xbe, 0x8a, 0x7f, 0x26, 0xff, 0xf7, 0x00, 0xdb, 0xcd, 0xa4, ++ 0x67, 0xab, 0x6d, 0x0f, 0xe2, 0x7a, 0xb5, 0xfd, 0x5a, 0xbb, 0x59, 0x77, ++ 0x2c, 0xff, 0x7d, 0xbe, 0x42, 0x63, 0x4f, 0xc9, 0x6a, 0x94, 0xcb, 0xa1, ++ 0x3f, 0x1c, 0x47, 0xde, 0x07, 0xab, 0xdb, 0xc5, 0xef, 0xbe, 0x88, 0xfb, ++ 0x5b, 0xb5, 0xd4, 0x33, 0xb4, 0x05, 0xbc, 0x0b, 0x65, 0x7d, 0x8b, 0xea, ++ 0x2d, 0x9a, 0x9a, 0x44, 0xf3, 0x18, 0x11, 0x9d, 0x67, 0x43, 0x3e, 0xd4, ++ 0xb4, 0x88, 0x39, 0x83, 0x47, 0x7c, 0x17, 0xbf, 0xe7, 0xfa, 0x9b, 0xbe, ++ 0xdf, 0xc9, 0x1b, 0x48, 0x0e, 0x1c, 0x80, 0xef, 0x4b, 0xf9, 0x8f, 0xb9, ++ 0xb4, 0x7a, 0x0e, 0xc9, 0x7f, 0x56, 0x88, 0xdf, 0x95, 0xec, 0xdb, 0x1f, ++ 0x22, 0x5f, 0xb9, 0xce, 0x15, 0x66, 0x52, 0x89, 0xee, 0x28, 0x5e, 0xbc, ++ 0xe6, 0x51, 0xfe, 0xbb, 0x8a, 0x9f, 0x21, 0xdd, 0x85, 0xf9, 0xe8, 0xa9, ++ 0x4e, 0xc4, 0xa5, 0xbd, 0xf6, 0x2f, 0x7f, 0xd0, 0xe3, 0xef, 0x33, 0x75, ++ 0xef, 0xe4, 0x7e, 0x11, 0xc0, 0x21, 0xb7, 0xa0, 0x7f, 0xfe, 0x05, 0x0f, ++ 0x8f, 0x83, 0xab, 0xca, 0xea, 0xca, 0xf1, 0xda, 0xf0, 0xf7, 0x39, 0x38, ++ 0x1f, 0x5a, 0xd9, 0xa6, 0xb8, 0x6d, 0x89, 0xfd, 0xd0, 0x11, 0x73, 0x6f, ++ 0xe0, 0xef, 0xd9, 0x07, 0xd0, 0x53, 0xdb, 0x77, 0xbf, 0x77, 0xf8, 0xb3, ++ 0xa9, 0xc2, 0xbf, 0x79, 0x34, 0x1b, 0xf7, 0x77, 0x80, 0xe7, 0xf6, 0x42, ++ 0x26, 0xf0, 0xed, 0xea, 0x37, 0x6e, 0xb2, 0xef, 0xfc, 0x0a, 0xf8, 0xfd, ++ 0x8e, 0xff, 0x6d, 0x71, 0xdc, 0xbd, 0x69, 0xb0, 0x9e, 0xef, 0xb0, 0x33, ++ 0xfe, 0x24, 0x46, 0xfb, 0x7e, 0xcb, 0xb5, 0x36, 0xed, 0xef, 0x33, 0x5d, ++ 0x9f, 0xaa, 0xfd, 0x7d, 0xa6, 0x5e, 0x8b, 0x80, 0x8f, 0x90, 0x07, 0xa5, ++ 0x9c, 0xba, 0x6b, 0x2a, 0x3f, 0xc7, 0x03, 0x53, 0x09, 0xdf, 0x1b, 0xec, ++ 0xda, 0x71, 0xe4, 0xbd, 0xf8, 0xa7, 0x13, 0xb5, 0xe3, 0xcd, 0x71, 0x68, ++ 0xc7, 0xfb, 0xa1, 0x78, 0xf9, 0xb1, 0xe2, 0x59, 0xbf, 0x0f, 0x7e, 0xc7, ++ 0xc4, 0xb8, 0xc7, 0xc5, 0xb8, 0x7f, 0x10, 0xe3, 0xfe, 0xb3, 0x70, 0x92, ++ 0xe9, 0x40, 0xe3, 0xfd, 0xff, 0xf4, 0xff, 0xad, 0xf4, 0xff, 0x02, 0x2a, ++ 0x42, 0xf6, 0x72, 0x00, 0x80, 0x00, 0x00, 0x00, 0x1f, 0x8b, 0x08, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xb5, 0x5b, 0x0b, 0x7c, 0x94, 0xd5, ++ 0x95, 0xbf, 0xdf, 0x7c, 0xf3, 0xcc, 0x73, 0x08, 0x21, 0x09, 0x04, 0xc2, ++ 0x24, 0x24, 0x21, 0x60, 0x88, 0x03, 0x24, 0x54, 0x2b, 0x96, 0x49, 0x32, ++ 0x89, 0x01, 0xac, 0x0d, 0xb8, 0x5a, 0x50, 0x84, 0x01, 0x52, 0xc8, 0x3b, ++ 0x80, 0xb5, 0x62, 0xab, 0xbf, 0x0c, 0x82, 0x08, 0x88, 0x2d, 0xd4, 0x68, ++ 0x51, 0x11, 0x27, 0xc1, 0xf0, 0xd0, 0xb0, 0x9d, 0x08, 0xc1, 0x44, 0x43, ++ 0x1d, 0x14, 0xb2, 0x88, 0xd6, 0x8d, 0x74, 0x8b, 0xfd, 0xfd, 0x56, 0xdc, ++ 0xf8, 0x28, 0xf2, 0x32, 0x13, 0xa3, 0x74, 0xf5, 0x57, 0x2d, 0x7b, 0xfe, ++ 0xe7, 0x7e, 0x1f, 0x99, 0x0c, 0xa1, 0xda, 0xee, 0x6e, 0xf2, 0xd3, 0x93, ++ 0x73, 0x5f, 0xdf, 0xb9, 0xe7, 0x7d, 0xcf, 0xbd, 0xd4, 0x94, 0xe4, 0x19, ++ 0xbe, 0x9c, 0x22, 0x44, 0x7e, 0xdc, 0x59, 0x73, 0x4f, 0x94, 0x10, 0xae, ++ 0x55, 0x3d, 0xc5, 0xc9, 0xb9, 0x42, 0xf4, 0xbd, 0xa1, 0x8a, 0x26, 0x87, ++ 0x10, 0xc2, 0xe3, 0x3b, 0x56, 0x1f, 0x2f, 0x44, 0x6d, 0xc7, 0x70, 0xb1, ++ 0x29, 0x95, 0xf0, 0xd2, 0xbe, 0x37, 0x0d, 0xc0, 0xdb, 0xc6, 0xd9, 0x37, ++ 0x51, 0xff, 0xc6, 0xf6, 0x3f, 0xbc, 0x8d, 0xfe, 0xde, 0x03, 0xaa, 0xc3, ++ 0x42, 0xfd, 0xaf, 0xb5, 0x7f, 0x14, 0x83, 0x75, 0x2e, 0x7c, 0x19, 0x29, ++ 0xc4, 0x70, 0xcc, 0xfb, 0x28, 0x46, 0x10, 0x5e, 0xfd, 0x95, 0xc2, 0xf8, ++ 0x26, 0xea, 0x77, 0x10, 0x3e, 0xb3, 0x55, 0x15, 0x81, 0x6c, 0x5a, 0xcf, ++ 0xe8, 0x37, 0xa3, 0xff, 0x42, 0xba, 0x8e, 0xfb, 0xcc, 0x82, 0x60, 0x69, ++ 0x4b, 0xab, 0xb9, 0x87, 0x60, 0xd5, 0x9e, 0x56, 0xee, 0x7f, 0xc3, 0x6f, ++ 0x1a, 0xdc, 0xbf, 0xa7, 0x71, 0x50, 0xbf, 0x1d, 0xe3, 0x09, 0x56, 0x19, ++ 0x7d, 0x31, 0x76, 0x82, 0xe7, 0xda, 0xf5, 0xf5, 0x02, 0x3c, 0xbe, 0x3a, ++ 0x5d, 0x71, 0xf9, 0xd0, 0xbe, 0xe7, 0x0f, 0x09, 0xcb, 0x30, 0xae, 0xe5, ++ 0x9d, 0x84, 0xa5, 0x04, 0x2f, 0xe1, 0x67, 0xc6, 0x95, 0xf0, 0xd3, 0x83, ++ 0x2f, 0x64, 0x7b, 0x68, 0x5e, 0x4d, 0x07, 0xad, 0x13, 0x35, 0xb0, 0x4e, ++ 0x4d, 0x87, 0x49, 0xc3, 0x25, 0xdd, 0xd5, 0xe9, 0xad, 0xc5, 0x71, 0xc4, ++ 0x2f, 0xd1, 0xa2, 0x88, 0x0c, 0x02, 0x17, 0xc4, 0x16, 0xb1, 0x9a, 0xf8, ++ 0x59, 0xd5, 0xde, 0x5c, 0x2d, 0xa8, 0xbd, 0x2a, 0xeb, 0x4e, 0x93, 0x20, ++ 0xbe, 0x04, 0xfd, 0x6a, 0x09, 0xbe, 0x4f, 0x3f, 0x06, 0x91, 0x40, 0xf3, ++ 0xec, 0xf4, 0x17, 0xf1, 0xef, 0x82, 0xff, 0xf3, 0x98, 0xa5, 0xb4, 0xee, ++ 0xab, 0xfe, 0xa3, 0xb7, 0xb8, 0x08, 0x06, 0x3b, 0x5f, 0x8f, 0xc1, 0x77, ++ 0x83, 0x07, 0x68, 0x7c, 0xf6, 0x00, 0x3d, 0xd3, 0x5d, 0xc4, 0xbf, 0x3c, ++ 0x40, 0xb3, 0x10, 0x23, 0x68, 0xde, 0x81, 0xd7, 0x63, 0x1c, 0xd4, 0xbf, ++ 0xd1, 0xff, 0xba, 0xe4, 0xb7, 0x31, 0xc0, 0xfb, 0x7e, 0x4d, 0xc3, 0x83, ++ 0x04, 0x99, 0xcf, 0xed, 0x2a, 0xef, 0xbb, 0xe2, 0x4b, 0x95, 0xf9, 0xaf, ++ 0xaf, 0x77, 0x93, 0x4b, 0xe5, 0x75, 0x66, 0xb6, 0x67, 0x44, 0x63, 0x5f, ++ 0x27, 0xfc, 0xf2, 0x7b, 0x73, 0x5c, 0x0e, 0xd9, 0x9e, 0xbe, 0xb8, 0x0c, ++ 0xf4, 0x1f, 0x4f, 0x9a, 0x9f, 0xa7, 0xa6, 0x32, 0xdd, 0x2e, 0xe0, 0xc1, ++ 0x89, 0xb3, 0x9b, 0x37, 0x11, 0x29, 0x55, 0x7e, 0x5a, 0x37, 0xfb, 0x4a, ++ 0xbe, 0x2d, 0xd5, 0xd6, 0xed, 0x32, 0x89, 0x79, 0x7e, 0xc8, 0x2d, 0x7d, ++ 0x7f, 0xd7, 0x28, 0xd2, 0x8f, 0xe3, 0x25, 0xc3, 0x27, 0x53, 0xcf, 0xe5, ++ 0x71, 0x77, 0xba, 0x0c, 0x3c, 0xae, 0xd8, 0xec, 0x49, 0x5f, 0x41, 0xe3, ++ 0x4e, 0x44, 0x39, 0xa2, 0xed, 0xb4, 0xde, 0x83, 0x25, 0xe3, 0xa2, 0x21, ++ 0xd7, 0xd7, 0x00, 0xd1, 0x5e, 0xb2, 0xd3, 0xec, 0x21, 0x58, 0x79, 0x40, ++ 0x7e, 0xef, 0x84, 0xbd, 0x3b, 0x06, 0xfa, 0x76, 0xe2, 0xc0, 0x54, 0xd5, ++ 0xab, 0x0c, 0xac, 0x77, 0x9b, 0xf6, 0x5d, 0x21, 0xbc, 0x0c, 0x07, 0xe4, ++ 0xe6, 0x65, 0x39, 0x95, 0xfb, 0x1a, 0xa3, 0xb0, 0xce, 0x80, 0xfc, 0x64, ++ 0xfb, 0x1c, 0x97, 0x9d, 0xc7, 0x1f, 0xf7, 0xbd, 0x73, 0xfb, 0x9d, 0xb4, ++ 0xbf, 0x13, 0x59, 0x91, 0x4e, 0xc8, 0xa5, 0xcb, 0x2c, 0xca, 0xfd, 0xac, ++ 0x27, 0xf4, 0x11, 0x7c, 0xaf, 0x33, 0xb9, 0x11, 0x7c, 0xd0, 0xbf, 0x37, ++ 0x07, 0xf2, 0xa0, 0x79, 0xc1, 0x2c, 0x03, 0xcb, 0xb5, 0xb7, 0xdd, 0xa4, ++ 0x8d, 0xbb, 0xb3, 0x59, 0x0c, 0x1a, 0x67, 0x62, 0xb9, 0x5d, 0x78, 0x6e, ++ 0x30, 0x3d, 0x76, 0xdf, 0x07, 0xbf, 0xbc, 0x93, 0xc6, 0x57, 0x3f, 0xa3, ++ 0x0a, 0x0b, 0x35, 0x57, 0x9b, 0x56, 0x24, 0x60, 0xff, 0x9f, 0x6c, 0x1f, ++ 0x4c, 0x5f, 0xb9, 0xc6, 0xe7, 0x6a, 0x53, 0x20, 0x21, 0x21, 0x44, 0x5f, ++ 0xab, 0x3b, 0x2e, 0xdb, 0x4b, 0x14, 0xeb, 0x77, 0x87, 0x6e, 0x1f, 0x0e, ++ 0x96, 0xa7, 0x2e, 0xc7, 0x13, 0x59, 0xaa, 0xa4, 0x2b, 0xc9, 0xe2, 0x13, ++ 0x44, 0x72, 0x75, 0x6b, 0x33, 0xeb, 0x35, 0x99, 0x9b, 0xd7, 0x36, 0x85, ++ 0xa1, 0xb0, 0x13, 0x4c, 0x8e, 0xec, 0x4e, 0x55, 0x68, 0xff, 0xc9, 0xf7, ++ 0x5a, 0x9d, 0x6b, 0x89, 0xfe, 0xe7, 0x14, 0xad, 0xdf, 0x40, 0x30, 0x8e, ++ 0x70, 0x83, 0xc4, 0xcd, 0x04, 0xad, 0x04, 0x9f, 0x31, 0xc9, 0x76, 0x98, ++ 0x2d, 0xe6, 0x8f, 0x21, 0x71, 0x2a, 0x84, 0x9b, 0x4a, 0xc6, 0xe5, 0x19, ++ 0xd2, 0x68, 0x1d, 0xb5, 0x75, 0x32, 0xe4, 0xda, 0x32, 0xc3, 0xf5, 0xa8, ++ 0x8b, 0xf6, 0xbf, 0x7a, 0x46, 0xe9, 0xc4, 0x19, 0xa0, 0x47, 0xf4, 0x2d, ++ 0x13, 0xf4, 0xcd, 0x9a, 0x8b, 0x51, 0x5e, 0x11, 0x2b, 0x44, 0x91, 0xfa, ++ 0xde, 0x13, 0xf8, 0x6e, 0xff, 0x01, 0x93, 0x80, 0xff, 0xa8, 0xb1, 0x76, ++ 0x54, 0x7e, 0x4c, 0x7a, 0xda, 0xef, 0x24, 0x43, 0x21, 0xba, 0xfb, 0xb7, ++ 0x9b, 0x7c, 0x5e, 0xd6, 0x3f, 0x57, 0x94, 0x32, 0x4d, 0x88, 0x65, 0xd7, ++ 0x49, 0xbb, 0xf9, 0xc4, 0xe1, 0x99, 0xa6, 0x8e, 0xa3, 0xf1, 0x6b, 0x0c, ++ 0xbc, 0xbf, 0xea, 0x16, 0xd5, 0x67, 0xa3, 0x71, 0xbd, 0xf5, 0xc4, 0x02, ++ 0x62, 0xf9, 0xa7, 0xad, 0xa9, 0x3f, 0x82, 0xbe, 0x56, 0x1f, 0x53, 0xed, ++ 0x56, 0xda, 0x77, 0xa1, 0x3f, 0xf5, 0x57, 0xd3, 0x81, 0xb7, 0x98, 0x9c, ++ 0x16, 0x9a, 0x5f, 0xeb, 0xa7, 0x46, 0xc2, 0x6b, 0xf7, 0x28, 0x3e, 0x87, ++ 0x5c, 0x5f, 0xc0, 0x2e, 0x6b, 0xae, 0x63, 0x5d, 0x17, 0xa7, 0x6d, 0xb5, ++ 0x69, 0x22, 0x87, 0xe0, 0x9a, 0x3e, 0x33, 0xc6, 0x9d, 0x3e, 0xa4, 0x88, ++ 0xc7, 0x68, 0xdc, 0x23, 0x11, 0x31, 0x4d, 0xa0, 0xbb, 0x26, 0x7b, 0xd6, ++ 0x59, 0x25, 0x86, 0xa0, 0xba, 0x79, 0x7d, 0x32, 0xad, 0xb7, 0x7c, 0x9b, ++ 0xe9, 0xc3, 0x1e, 0xab, 0x9c, 0x7b, 0x89, 0xfe, 0xab, 0xeb, 0xdc, 0xca, ++ 0x7a, 0x5b, 0xe1, 0x1b, 0xdc, 0x5e, 0xb5, 0x67, 0x30, 0x5e, 0x23, 0x8c, ++ 0x03, 0x38, 0xad, 0xdf, 0x8c, 0x3f, 0xae, 0x17, 0xa2, 0xcd, 0x15, 0x1d, ++ 0x7f, 0xfa, 0x1a, 0xfa, 0x7b, 0x82, 0x98, 0x70, 0x49, 0x05, 0x9f, 0xa6, ++ 0x27, 0xc2, 0x1e, 0x8e, 0x43, 0xae, 0xc4, 0x4f, 0xd1, 0x40, 0xcc, 0x1e, ++ 0x29, 0xc4, 0xdd, 0x93, 0x9c, 0x89, 0xb0, 0xfb, 0x8d, 0x46, 0xc7, 0x2c, ++ 0xf0, 0x21, 0xd8, 0x69, 0xb2, 0x83, 0x5f, 0x75, 0x87, 0xf6, 0x57, 0x80, ++ 0x6e, 0x5f, 0x75, 0x84, 0xd3, 0x40, 0x5b, 0xad, 0x5d, 0xfd, 0x0a, 0xf3, ++ 0x35, 0xf8, 0x05, 0xf1, 0xfd, 0x5a, 0x82, 0x49, 0x82, 0xf7, 0x1f, 0x14, ++ 0x92, 0xbf, 0xc1, 0x76, 0xa9, 0xe7, 0x75, 0x26, 0xc5, 0x67, 0xc5, 0x7c, ++ 0xe2, 0x21, 0xaf, 0x67, 0x55, 0x7c, 0x6b, 0xa8, 0x2b, 0xe8, 0xed, 0x8f, ++ 0x61, 0xff, 0x24, 0x44, 0x09, 0xec, 0x62, 0xd5, 0xfc, 0x3c, 0x03, 0xfc, ++ 0x1c, 0xcc, 0x58, 0x10, 0x29, 0xbf, 0xd2, 0xed, 0x41, 0xb1, 0x19, 0x95, ++ 0x58, 0x40, 0x69, 0xff, 0x3f, 0x30, 0xf6, 0xa8, 0xc3, 0x42, 0xfc, 0xc4, ++ 0x7f, 0xb9, 0xd2, 0x98, 0x7e, 0xb7, 0x59, 0x78, 0xfc, 0xd4, 0x7e, 0x77, ++ 0xb4, 0x33, 0x16, 0x7a, 0x3f, 0xd6, 0x1a, 0x93, 0x03, 0xba, 0xc6, 0x5a, ++ 0x53, 0x7c, 0xe0, 0xfb, 0x58, 0x63, 0xdf, 0x1a, 0x7c, 0xff, 0x91, 0x51, ++ 0x8a, 0xe3, 0x41, 0x5a, 0xfa, 0x70, 0xce, 0xcb, 0x93, 0x15, 0xe0, 0xb5, ++ 0x51, 0x4e, 0xe8, 0x89, 0x92, 0xb4, 0xd8, 0x08, 0x7e, 0x3c, 0x32, 0x6a, ++ 0xb1, 0x11, 0xfa, 0x3e, 0xd6, 0xee, 0xcf, 0x2a, 0xcd, 0x1e, 0xc0, 0xdd, ++ 0xe8, 0x87, 0x3d, 0x08, 0x1f, 0x7f, 0xaf, 0x38, 0xca, 0x63, 0xc4, 0x77, ++ 0x9e, 0x1b, 0xa9, 0x04, 0x0c, 0xb4, 0x7e, 0xd0, 0x46, 0xf4, 0xc1, 0x4e, ++ 0x8c, 0x76, 0x13, 0xe8, 0x0b, 0x9a, 0x24, 0x2e, 0xc4, 0x9a, 0x41, 0xf4, ++ 0x91, 0x47, 0x62, 0xfc, 0xff, 0x9d, 0x3e, 0x3b, 0xd1, 0x17, 0x35, 0x40, ++ 0x1f, 0xc9, 0x3b, 0x16, 0xf3, 0x3f, 0xcf, 0x25, 0xfe, 0x10, 0x4c, 0x99, ++ 0x23, 0x44, 0x37, 0xfb, 0x85, 0x15, 0xec, 0x17, 0x74, 0x7e, 0x5e, 0x20, ++ 0x7d, 0x77, 0x93, 0xac, 0x32, 0x14, 0xa9, 0x37, 0xd5, 0xdb, 0x0f, 0x17, ++ 0xa3, 0xbf, 0x46, 0x74, 0xaf, 0xc7, 0xbc, 0xe2, 0x18, 0xb9, 0x8f, 0x62, ++ 0xec, 0x07, 0x78, 0x84, 0x84, 0x6a, 0xbe, 0x94, 0x57, 0xbe, 0x06, 0xef, ++ 0xc9, 0x97, 0xf1, 0x45, 0xf7, 0x9f, 0x1d, 0xf9, 0x2e, 0x63, 0x3e, 0xc1, ++ 0x6d, 0xf9, 0xa5, 0x66, 0xc0, 0x22, 0x35, 0x3b, 0xb1, 0x67, 0x08, 0x7f, ++ 0xbf, 0x4a, 0xb1, 0xb2, 0x9e, 0x7c, 0x4e, 0xf6, 0x07, 0x7f, 0x7c, 0xd7, ++ 0x0a, 0xc5, 0x9e, 0x9e, 0x35, 0xa0, 0xdf, 0xba, 0x5d, 0xd5, 0xc9, 0xa6, ++ 0xcb, 0xf6, 0x53, 0xf5, 0xfb, 0x9d, 0x66, 0x91, 0x86, 0xcf, 0xb9, 0xba, ++ 0xb3, 0xa8, 0xbf, 0x5c, 0x48, 0xbb, 0x5e, 0xb4, 0xda, 0x66, 0x4f, 0x0f, ++ 0xb5, 0x23, 0xd8, 0x19, 0xf1, 0xa3, 0xdc, 0x5e, 0x71, 0xb3, 0x20, 0x7b, ++ 0xf3, 0xac, 0x4e, 0xb0, 0xa7, 0x4f, 0xa5, 0x76, 0xf5, 0x82, 0x59, 0x40, ++ 0xf7, 0x34, 0xfb, 0x8a, 0xa7, 0xdf, 0x4b, 0x69, 0x43, 0xd8, 0x97, 0x3f, ++ 0xcc, 0x2e, 0xdb, 0x07, 0xe3, 0x01, 0x9b, 0xd4, 0xf3, 0x40, 0xb4, 0xe2, ++ 0x5b, 0x4b, 0xf4, 0xa7, 0xe7, 0x0f, 0xb6, 0xbb, 0x14, 0xcd, 0x0e, 0x1a, ++ 0x3d, 0x0a, 0xef, 0xaf, 0xf1, 0x6b, 0x23, 0xe3, 0xde, 0x05, 0x8a, 0x0f, ++ 0x3c, 0xbf, 0x8d, 0x1a, 0x57, 0xc7, 0x69, 0x9b, 0xc3, 0xb8, 0xf2, 0x7c, ++ 0x1f, 0xe2, 0xe3, 0x6d, 0x84, 0x2e, 0x40, 0x7b, 0x43, 0x3c, 0xdb, 0x29, ++ 0x77, 0x92, 0xff, 0xfa, 0x17, 0x6d, 0x9f, 0xb7, 0x19, 0x03, 0x87, 0xe1, ++ 0x3f, 0x8e, 0x9a, 0xfc, 0xa9, 0x76, 0xea, 0x3a, 0x5a, 0x63, 0x75, 0x62, ++ 0xfd, 0xf9, 0x82, 0x12, 0x1d, 0xf2, 0x6b, 0x0b, 0x44, 0x37, 0xc3, 0x93, ++ 0x91, 0xb5, 0x6d, 0x01, 0x5e, 0xdc, 0x3b, 0x06, 0xfa, 0xf5, 0xae, 0xc7, ++ 0xe2, 0x44, 0x1e, 0xd6, 0xb8, 0xae, 0x29, 0x1a, 0x7e, 0x3c, 0x47, 0xac, ++ 0xb3, 0x9f, 0xce, 0x42, 0x52, 0x21, 0xf6, 0x5c, 0x9a, 0x7a, 0xf5, 0x7c, ++ 0x86, 0x14, 0x47, 0x9c, 0xd6, 0xe5, 0x82, 0x40, 0x4c, 0x79, 0x0a, 0xe4, ++ 0xad, 0xcb, 0x75, 0x5b, 0xbe, 0xab, 0x20, 0x3f, 0xef, 0xea, 0xf3, 0xab, ++ 0xfe, 0xd8, 0x76, 0xcb, 0xf7, 0xe0, 0xbf, 0xee, 0x69, 0x36, 0x27, 0x4a, ++ 0x35, 0xe9, 0xce, 0x9a, 0x36, 0x20, 0x37, 0x5d, 0xae, 0x75, 0xc2, 0xcb, ++ 0x74, 0xeb, 0xf2, 0xba, 0x2c, 0x3f, 0xa2, 0x7d, 0x34, 0xf8, 0xa1, 0x5e, ++ 0x98, 0xc3, 0x7e, 0xe6, 0x59, 0x55, 0x70, 0x5e, 0xa1, 0xc9, 0xcf, 0x4a, ++ 0xbf, 0x43, 0xc9, 0x4f, 0xe7, 0xef, 0x0c, 0x4d, 0x0e, 0xcb, 0x3b, 0xa4, ++ 0x3f, 0x0a, 0x97, 0xab, 0xce, 0xef, 0x1f, 0xd3, 0x82, 0xf8, 0x3e, 0xc5, ++ 0xd1, 0xed, 0x2c, 0x0f, 0x61, 0x61, 0xff, 0x17, 0x2e, 0xf7, 0x6f, 0x93, ++ 0x0b, 0x65, 0x98, 0x0b, 0xd0, 0x55, 0x18, 0x6f, 0x11, 0x90, 0x67, 0xb2, ++ 0x41, 0xfa, 0xc7, 0xe4, 0x65, 0xa4, 0x27, 0x44, 0xf7, 0x9d, 0xc2, 0x73, ++ 0xa8, 0x87, 0xe0, 0xed, 0x91, 0x6f, 0x99, 0x58, 0x0f, 0x35, 0xf9, 0xdc, ++ 0x05, 0xf9, 0xd0, 0xd0, 0x77, 0x85, 0xef, 0x87, 0x59, 0xa9, 0xff, 0x77, ++ 0xf2, 0xe9, 0xc8, 0x2f, 0xbd, 0x37, 0xd4, 0x0e, 0xc3, 0xed, 0xee, 0x6a, ++ 0x76, 0x56, 0xed, 0x70, 0xfe, 0xbb, 0x1e, 0xf7, 0xc8, 0xd3, 0x90, 0x7d, ++ 0x85, 0xd9, 0x67, 0x98, 0xfd, 0xe9, 0xf2, 0xf2, 0xac, 0x8e, 0x61, 0x3b, ++ 0xbb, 0x2c, 0x47, 0xb5, 0x45, 0xda, 0xab, 0x26, 0xaf, 0x28, 0xfa, 0x1d, ++ 0xd2, 0xde, 0xf0, 0x07, 0x7d, 0xaf, 0xa6, 0x5d, 0xf1, 0x05, 0x52, 0xbf, ++ 0x83, 0xfd, 0x29, 0x44, 0x38, 0xc9, 0xed, 0xb1, 0x30, 0xbb, 0xd3, 0xe5, ++ 0x73, 0x35, 0xbf, 0xa3, 0xfb, 0xa9, 0x53, 0x22, 0x70, 0xd4, 0x4e, 0xfb, ++ 0x3f, 0x99, 0x26, 0xf3, 0x00, 0xef, 0xcf, 0x2c, 0xbe, 0x66, 0xe0, 0x99, ++ 0x86, 0x72, 0xf8, 0xbd, 0x93, 0x13, 0x25, 0xdc, 0xaf, 0xf9, 0xb7, 0x70, ++ 0x78, 0x8a, 0xf2, 0x1c, 0x85, 0xe2, 0xd8, 0xa6, 0xac, 0x13, 0x23, 0x10, ++ 0xaf, 0x4f, 0x9a, 0xf5, 0x75, 0x6c, 0xbe, 0x66, 0xa2, 0xff, 0xd4, 0x9a, ++ 0xee, 0x31, 0x2b, 0x69, 0xfe, 0xa9, 0x7c, 0x09, 0x4f, 0x22, 0x2f, 0x0c, ++ 0xc1, 0x5d, 0x11, 0x62, 0x11, 0xfc, 0xfa, 0xa9, 0x91, 0x16, 0x2f, 0xf8, ++ 0x74, 0x4a, 0x99, 0x50, 0x80, 0xf8, 0x70, 0x4a, 0xb9, 0xf7, 0x16, 0x89, ++ 0x27, 0x9a, 0x1d, 0xc0, 0xe7, 0x27, 0x16, 0xd8, 0x09, 0x3f, 0x69, 0x92, ++ 0xe3, 0xf5, 0xb8, 0xa2, 0xfb, 0xff, 0x53, 0xf3, 0xbf, 0xe7, 0xe6, 0x71, ++ 0x8a, 0x38, 0x02, 0x7e, 0x38, 0x14, 0x51, 0xca, 0xdf, 0x51, 0x94, 0xb8, ++ 0x12, 0xa2, 0xe7, 0xd4, 0x3d, 0x19, 0x53, 0xd6, 0x8a, 0x81, 0xfd, 0x37, ++ 0xe5, 0x1b, 0x78, 0x9e, 0x4f, 0xf3, 0xdf, 0x44, 0x07, 0xf3, 0xbd, 0xef, ++ 0x3e, 0xc5, 0xd7, 0x44, 0x4d, 0x8b, 0x10, 0x52, 0x88, 0xfe, 0xd4, 0x82, ++ 0xdf, 0x94, 0xa4, 0x51, 0xfb, 0xfb, 0x3f, 0x1f, 0x37, 0x19, 0xf2, 0x75, ++ 0xad, 0x1a, 0xfc, 0x7d, 0xc4, 0xeb, 0xd4, 0x6b, 0x81, 0x6f, 0xe5, 0x75, ++ 0x7e, 0xf0, 0x65, 0x9f, 0x69, 0x71, 0x48, 0x5c, 0xba, 0x1c, 0x27, 0xdd, ++ 0x9f, 0xc9, 0xf6, 0xb2, 0x3c, 0x03, 0xec, 0xa5, 0x5c, 0x93, 0xa1, 0x2b, ++ 0x6e, 0x42, 0x2c, 0xe4, 0xd3, 0xef, 0x1b, 0x17, 0x8b, 0xb8, 0xa3, 0xc7, ++ 0xa1, 0xfe, 0x63, 0xfb, 0xa3, 0x3c, 0x21, 0x72, 0x3b, 0x4b, 0x71, 0x4a, ++ 0x8c, 0x0f, 0xc1, 0x27, 0x3c, 0x9a, 0x12, 0x1a, 0xc7, 0x0e, 0xef, 0x7a, ++ 0x24, 0x13, 0xeb, 0x94, 0x9b, 0xbd, 0x39, 0x4e, 0x6a, 0x3f, 0xd3, 0xf8, ++ 0x74, 0x0a, 0xf2, 0x8d, 0xf2, 0x5d, 0x0f, 0x67, 0x72, 0x1e, 0xbc, 0x6b, ++ 0x63, 0x26, 0xce, 0x33, 0xe5, 0x4d, 0x8f, 0x64, 0xba, 0x18, 0x8f, 0xf4, ++ 0xf0, 0x79, 0xca, 0x28, 0xf7, 0x7d, 0x7e, 0xdf, 0xf5, 0x3b, 0x37, 0x85, ++ 0xe4, 0xdd, 0x55, 0x85, 0x2a, 0xd3, 0xbf, 0xc0, 0x7a, 0xb8, 0x08, 0xf1, ++ 0x76, 0xd6, 0x35, 0x9f, 0x3e, 0x64, 0xa7, 0x71, 0x19, 0x3f, 0x57, 0xec, ++ 0x50, 0xaf, 0xbb, 0x44, 0xf7, 0x43, 0x88, 0x8f, 0x0b, 0x91, 0x1f, 0xe3, ++ 0xfc, 0xd6, 0x60, 0x65, 0x7f, 0x4e, 0xeb, 0xb9, 0x20, 0xff, 0xe6, 0x09, ++ 0x3f, 0x7c, 0x0e, 0x76, 0x7c, 0x3c, 0xeb, 0x23, 0x53, 0x19, 0x8d, 0xfb, ++ 0x2a, 0xdf, 0xc8, 0xfc, 0x59, 0x28, 0x7c, 0x9b, 0x13, 0xa9, 0x5f, 0x6c, ++ 0x50, 0xec, 0xcd, 0x22, 0x74, 0xfc, 0x98, 0x46, 0x8c, 0x5f, 0xbc, 0x4e, ++ 0x31, 0x27, 0xc1, 0x0f, 0xac, 0x18, 0x36, 0x59, 0x75, 0x60, 0xde, 0x30, ++ 0xa6, 0x63, 0xc9, 0x86, 0xc9, 0x5d, 0x68, 0x5f, 0x78, 0xbf, 0x6c, 0x9f, ++ 0x65, 0xf1, 0x1d, 0x38, 0x81, 0x75, 0x7e, 0x63, 0x76, 0x36, 0x3b, 0xd8, ++ 0xdf, 0xa4, 0x95, 0x4e, 0x1a, 0xa0, 0xff, 0xab, 0x7c, 0x33, 0xcf, 0x5b, ++ 0xb4, 0x59, 0xe1, 0xfc, 0x5f, 0xff, 0x4e, 0xc6, 0x13, 0x09, 0x8d, 0xa1, ++ 0xfb, 0xfc, 0x4a, 0x93, 0xbf, 0xf8, 0xda, 0xa2, 0x40, 0x2e, 0x3f, 0xd2, ++ 0xe4, 0x72, 0xf3, 0xfd, 0xef, 0x1c, 0x49, 0xa2, 0x75, 0xed, 0xf1, 0x9e, ++ 0x4b, 0xf0, 0x1b, 0x6f, 0x3f, 0x7e, 0x3a, 0x3d, 0x40, 0xed, 0xee, 0xb8, ++ 0xb3, 0xd9, 0xd0, 0xf3, 0x0c, 0xb3, 0xe7, 0xa9, 0x0a, 0xec, 0xbb, 0xc9, ++ 0xe2, 0xc4, 0x3e, 0x72, 0x73, 0x92, 0xd5, 0x44, 0x1a, 0x3f, 0xe5, 0xa7, ++ 0xf9, 0x8f, 0x01, 0x2e, 0xba, 0x7f, 0xf1, 0x53, 0x15, 0xf0, 0xb7, 0xdb, ++ 0xac, 0x7c, 0x6e, 0xd3, 0xe9, 0x5b, 0xa5, 0x38, 0x0d, 0xf0, 0xc7, 0xaf, ++ 0x37, 0xfe, 0x78, 0x09, 0xf8, 0x76, 0xe6, 0x71, 0x2b, 0xe7, 0xed, 0xab, ++ 0x1a, 0xc7, 0x27, 0x8a, 0x21, 0xec, 0x54, 0x87, 0xbb, 0x49, 0xfe, 0x0e, ++ 0x3a, 0xe8, 0xec, 0xad, 0xb7, 0x32, 0x7c, 0xa1, 0xde, 0x2e, 0x1c, 0xa4, ++ 0x0f, 0xfb, 0xea, 0x93, 0x18, 0xff, 0x6d, 0xbd, 0x83, 0xa1, 0x98, 0x27, ++ 0xf5, 0x6b, 0x95, 0x76, 0x3e, 0xbe, 0xda, 0x7a, 0x53, 0xbf, 0x8c, 0x14, ++ 0x0e, 0xca, 0x67, 0x73, 0x37, 0xd8, 0x84, 0x83, 0xfc, 0x54, 0x4a, 0x82, ++ 0x6b, 0x54, 0x01, 0xed, 0x33, 0x63, 0x62, 0x4d, 0xd3, 0x46, 0x6d, 0x5f, ++ 0x19, 0x34, 0x7f, 0xb2, 0x37, 0xb5, 0x10, 0x7c, 0xc8, 0xdd, 0xb8, 0xb2, ++ 0x0b, 0x29, 0xaf, 0xb9, 0x40, 0x9e, 0xc7, 0xde, 0x3c, 0xb1, 0x21, 0x05, ++ 0x4e, 0x79, 0xf9, 0xfd, 0x1f, 0xec, 0xa8, 0xa0, 0xfe, 0x39, 0x05, 0xa5, ++ 0xe3, 0x0a, 0xa8, 0xdd, 0xba, 0xfd, 0x33, 0xae, 0x2b, 0xbc, 0xde, 0xf1, ++ 0xf0, 0x42, 0xf0, 0xbb, 0xbc, 0xc9, 0x22, 0xf7, 0xa7, 0xed, 0xfb, 0xcc, ++ 0xe3, 0x99, 0x89, 0x4f, 0xd1, 0xfa, 0xde, 0x37, 0x4c, 0x7c, 0xde, 0xaf, ++ 0xdb, 0xfe, 0xc1, 0x8e, 0x8d, 0x04, 0x97, 0x6e, 0x5e, 0x69, 0x0e, 0xd5, ++ 0xf7, 0xef, 0xba, 0xdf, 0x54, 0x8d, 0x9e, 0x6f, 0xb3, 0xab, 0xab, 0xf1, ++ 0xe1, 0x1f, 0xb7, 0xab, 0x47, 0x52, 0xd8, 0x7e, 0x9a, 0xc8, 0xae, 0xb2, ++ 0xff, 0x79, 0xbb, 0xaa, 0xbb, 0x7f, 0x0d, 0xf3, 0xef, 0xde, 0x82, 0xd2, ++ 0x59, 0xe0, 0xfb, 0x19, 0x93, 0x37, 0x05, 0xf6, 0x74, 0x66, 0xc2, 0x8d, ++ 0xac, 0xe7, 0xde, 0x43, 0x0a, 0xf3, 0x5f, 0xf7, 0xe3, 0xfa, 0xfc, 0x12, ++ 0x6d, 0xbf, 0x55, 0x06, 0xff, 0xe6, 0xe9, 0xa9, 0x03, 0x7e, 0xfc, 0xa2, ++ 0xc8, 0x65, 0xfe, 0x1e, 0xee, 0xf8, 0x24, 0x13, 0x79, 0xef, 0xc5, 0xf6, ++ 0xf9, 0x7f, 0x77, 0xdf, 0x07, 0x69, 0xdf, 0x01, 0xda, 0x77, 0x3b, 0xf1, ++ 0x37, 0x30, 0xfe, 0xca, 0xfe, 0x69, 0x66, 0xcf, 0x38, 0x27, 0xed, 0x6f, ++ 0x9a, 0x41, 0xe6, 0xbb, 0x57, 0xe4, 0xad, 0x05, 0x06, 0xad, 0x5e, 0xd0, ++ 0x6d, 0x2e, 0x8d, 0x96, 0x3c, 0x57, 0x50, 0x97, 0xd1, 0xe2, 0x27, 0xc5, ++ 0x31, 0x6f, 0x2c, 0xd1, 0x53, 0xdd, 0xa9, 0x04, 0x22, 0x72, 0x10, 0xcf, ++ 0x6e, 0x3a, 0x6b, 0xc4, 0x79, 0x8f, 0xce, 0x8d, 0x1f, 0x86, 0xe6, 0x11, ++ 0xf4, 0xf3, 0x61, 0x48, 0xdc, 0xbe, 0x1a, 0xbd, 0xdf, 0x06, 0x6b, 0xb1, ++ 0x4e, 0xc6, 0x80, 0xdf, 0xfd, 0xde, 0x9f, 0x0c, 0x22, 0x10, 0x12, 0xa7, ++ 0xaf, 0xef, 0x89, 0x10, 0x81, 0x90, 0xef, 0x5e, 0x3e, 0x9f, 0x50, 0x9b, ++ 0x99, 0xe4, 0xd4, 0xdb, 0x31, 0x92, 0xfd, 0x02, 0xe4, 0x66, 0x44, 0x3d, ++ 0xae, 0x63, 0x42, 0x13, 0xf0, 0xb3, 0x66, 0x29, 0xc7, 0xde, 0x83, 0x94, ++ 0x37, 0xc9, 0x3a, 0x8e, 0x50, 0xa7, 0x0d, 0xec, 0xf3, 0x6c, 0xc7, 0xf9, ++ 0x1c, 0xf8, 0xd9, 0xf0, 0xfd, 0xd6, 0xbe, 0x7c, 0x9e, 0xf5, 0xa3, 0xba, ++ 0xfd, 0xe1, 0xcf, 0x14, 0xde, 0xff, 0xcc, 0xb3, 0xc6, 0x9c, 0x6f, 0xdf, ++ 0xff, 0xe1, 0x5d, 0xe7, 0x73, 0x20, 0xbf, 0xb3, 0xa6, 0x9e, 0x69, 0x38, ++ 0x6f, 0xf5, 0x9a, 0x7b, 0x72, 0x20, 0x87, 0xda, 0x57, 0xa4, 0x3f, 0xff, ++ 0x47, 0xf9, 0xa0, 0xb7, 0x57, 0x6c, 0xa0, 0x8d, 0x90, 0x9d, 0xd7, 0x2a, ++ 0x56, 0xd6, 0x93, 0x22, 0xf5, 0x02, 0xd7, 0x0d, 0x7a, 0x8f, 0xc9, 0xba, ++ 0x41, 0x6d, 0xc7, 0x4e, 0xf6, 0xa7, 0xfd, 0x9d, 0xb2, 0x7e, 0x53, 0x67, ++ 0xe8, 0x2e, 0x4e, 0x44, 0xbd, 0x63, 0xc5, 0x07, 0x5d, 0xf0, 0x67, 0xfd, ++ 0x49, 0xf2, 0x1c, 0x45, 0xeb, 0xbb, 0xc0, 0xb7, 0xe9, 0xe3, 0xb4, 0x38, ++ 0x68, 0xec, 0x4b, 0x99, 0x43, 0x7e, 0xed, 0xc5, 0xcb, 0xfa, 0x20, 0xcf, ++ 0x7f, 0x67, 0x60, 0xbf, 0xe3, 0xb1, 0x8e, 0xbf, 0x1a, 0x7e, 0x40, 0xe4, ++ 0x44, 0x0a, 0xe4, 0x15, 0xe7, 0x60, 0xcf, 0xd4, 0xbe, 0x70, 0x75, 0xea, ++ 0x7a, 0xe8, 0xf9, 0x19, 0xdf, 0x88, 0x29, 0xf0, 0x8f, 0x6f, 0xe6, 0xfc, ++ 0xb5, 0x96, 0xeb, 0x7d, 0xaf, 0x46, 0xda, 0x55, 0xce, 0x7b, 0xa8, 0x35, ++ 0x44, 0x7e, 0x97, 0xf7, 0xe1, 0x53, 0x85, 0x6b, 0x50, 0x3d, 0x20, 0x52, ++ 0xb8, 0x42, 0xc6, 0xd5, 0x99, 0x1d, 0x3f, 0xe2, 0xfc, 0xf8, 0xb8, 0x2a, ++ 0x90, 0xd7, 0xd5, 0x4d, 0x94, 0xf6, 0x24, 0x5e, 0x96, 0xf6, 0x54, 0xb3, ++ 0xee, 0xb0, 0x39, 0x29, 0x64, 0xbd, 0x1d, 0xb0, 0x27, 0xa6, 0x5b, 0xe6, ++ 0x8b, 0xb3, 0x5e, 0xfd, 0x2b, 0xdb, 0xe5, 0x7d, 0x33, 0x5c, 0x9d, 0xb0, ++ 0xcb, 0x48, 0xf8, 0x42, 0xac, 0x97, 0x14, 0xeb, 0x53, 0x14, 0x6d, 0x1c, ++ 0xc9, 0xbf, 0x56, 0xa3, 0x21, 0xaa, 0x53, 0x3b, 0xf7, 0x97, 0xa8, 0xdc, ++ 0x5f, 0xd7, 0xae, 0x8a, 0x91, 0x98, 0x93, 0x14, 0xed, 0xcb, 0xa0, 0x7d, ++ 0x94, 0x88, 0x2d, 0x46, 0xe4, 0xd3, 0xb3, 0x84, 0x7f, 0x3a, 0xea, 0x36, ++ 0xc2, 0xd8, 0xf3, 0xcb, 0x1b, 0xa8, 0x7f, 0xf6, 0xab, 0xea, 0xd4, 0x4d, ++ 0x82, 0xcf, 0x4f, 0x8b, 0x4a, 0xf9, 0x5c, 0xe9, 0x49, 0x5f, 0x85, 0xfc, ++ 0xc8, 0xa0, 0x68, 0x7c, 0xf5, 0xe7, 0xce, 0x09, 0x8d, 0x67, 0x05, 0x32, ++ 0x4e, 0x4d, 0x57, 0x15, 0x8e, 0x63, 0x7d, 0x23, 0x23, 0x39, 0x4f, 0x99, ++ 0x39, 0xaf, 0x66, 0x01, 0xe8, 0xd5, 0xc7, 0xe5, 0x0c, 0x93, 0xe3, 0x68, ++ 0x1d, 0xce, 0xb3, 0x84, 0xaf, 0x2f, 0x67, 0x0e, 0xec, 0x33, 0xd0, 0x97, ++ 0x33, 0x37, 0x7a, 0x60, 0xdc, 0xed, 0xaf, 0x46, 0xae, 0xe0, 0xb8, 0x28, ++ 0xfc, 0xb9, 0xb7, 0x87, 0x7c, 0x27, 0xa2, 0x50, 0xd6, 0x47, 0x3f, 0xa7, ++ 0x38, 0x02, 0x3d, 0xa9, 0xbb, 0x28, 0xeb, 0x1d, 0x45, 0xea, 0xd7, 0x4f, ++ 0x20, 0x3f, 0x5f, 0x75, 0x88, 0xf4, 0x05, 0xf9, 0xa1, 0x21, 0xf5, 0x5d, ++ 0x03, 0xfc, 0x38, 0xf1, 0x19, 0x72, 0x3d, 0x4f, 0x72, 0x75, 0x21, 0xfe, ++ 0x78, 0x84, 0xcb, 0x05, 0xfb, 0x99, 0x34, 0xc2, 0x07, 0xfb, 0xa9, 0xdb, ++ 0xa7, 0x08, 0x23, 0xea, 0x44, 0x1d, 0x96, 0x26, 0xd4, 0x91, 0x6a, 0x4d, ++ 0x3d, 0x09, 0xd0, 0xe7, 0x8d, 0xed, 0x7f, 0x34, 0x43, 0x9f, 0xeb, 0xda, ++ 0xde, 0x31, 0x3b, 0x26, 0x61, 0xbe, 0xac, 0x3b, 0x91, 0x41, 0xb2, 0x1f, ++ 0xaf, 0xd3, 0xe2, 0x57, 0x4d, 0xfb, 0xf8, 0x77, 0x51, 0xe7, 0xab, 0x39, ++ 0x26, 0xa3, 0x68, 0x8d, 0xf1, 0x1d, 0x3e, 0xbf, 0x57, 0x1d, 0x68, 0xe5, ++ 0x73, 0x7a, 0xb5, 0x08, 0xf0, 0x39, 0xbd, 0xba, 0x65, 0xb0, 0xbe, 0xf4, ++ 0x27, 0x39, 0xb8, 0x2e, 0x12, 0x6e, 0x1f, 0x11, 0x85, 0x8e, 0x41, 0x76, ++ 0x31, 0x73, 0x9b, 0xb4, 0x8b, 0xdb, 0x55, 0xb1, 0x02, 0x7e, 0x4e, 0x68, ++ 0x75, 0xda, 0x99, 0x49, 0x89, 0x9c, 0x8f, 0x0c, 0xcc, 0x93, 0xf9, 0xae, ++ 0x4b, 0x3d, 0xff, 0x10, 0xf2, 0x97, 0x60, 0x9a, 0xe2, 0x54, 0x68, 0xa9, ++ 0x60, 0x84, 0x77, 0x1d, 0xf2, 0x22, 0x6f, 0xa6, 0xcc, 0x67, 0x82, 0xbf, ++ 0x7b, 0x21, 0x77, 0x19, 0xfb, 0x15, 0x5f, 0xee, 0xad, 0xb4, 0xaf, 0xa0, ++ 0x96, 0xef, 0xce, 0xdc, 0xb0, 0xd5, 0xa8, 0x86, 0xd0, 0x33, 0xb3, 0x53, ++ 0xd6, 0x25, 0x83, 0x11, 0xa2, 0xfc, 0x20, 0xcb, 0xdb, 0x33, 0x1a, 0x72, ++ 0x10, 0xae, 0xd2, 0xa8, 0xc2, 0x3c, 0xb6, 0xab, 0x1c, 0xf8, 0xd5, 0xa0, ++ 0x41, 0xd6, 0x51, 0xc3, 0xf7, 0x51, 0xaf, 0xd5, 0x8b, 0x8e, 0xa3, 0x9e, ++ 0x94, 0x3d, 0x40, 0xf7, 0xec, 0xe4, 0x64, 0xe9, 0xc7, 0x84, 0x8f, 0xf5, ++ 0xa7, 0xcb, 0x20, 0xbf, 0xef, 0x32, 0x50, 0xff, 0x94, 0x81, 0xf9, 0x4b, ++ 0x0a, 0xe5, 0xfc, 0x81, 0xf3, 0x90, 0xac, 0x83, 0x5d, 0xcd, 0xaf, 0xec, ++ 0x22, 0xf9, 0x94, 0x91, 0x7c, 0xf6, 0x90, 0x9c, 0x01, 0x9f, 0xa7, 0x78, ++ 0x5c, 0x46, 0x7e, 0xa6, 0x85, 0xe2, 0x31, 0xf0, 0x7f, 0xa5, 0x78, 0x0c, ++ 0xe8, 0xaf, 0xcf, 0xe2, 0xf6, 0x17, 0xeb, 0x9d, 0x8c, 0x1f, 0xa8, 0xbf, ++ 0x8e, 0xf1, 0x83, 0xf5, 0x2e, 0xc6, 0xdb, 0xeb, 0x4b, 0x18, 0xbe, 0x5c, ++ 0x5f, 0xca, 0xed, 0xc7, 0x41, 0xea, 0xf7, 0xf1, 0xbf, 0xa7, 0x1b, 0xa1, ++ 0x0f, 0x5d, 0xb0, 0xb1, 0x51, 0x03, 0xf8, 0xc9, 0xb8, 0x30, 0x7c, 0xd4, ++ 0xe0, 0xf1, 0x27, 0xe3, 0x94, 0xc1, 0xf8, 0x28, 0x85, 0xc7, 0xe7, 0x16, ++ 0x3e, 0xdd, 0xe8, 0xcd, 0x46, 0xdd, 0xd4, 0xae, 0xd9, 0xb7, 0x23, 0x1a, ++ 0xf9, 0xd7, 0x19, 0x9b, 0xac, 0x43, 0x9d, 0xb1, 0xc9, 0x3a, 0x54, 0xeb, ++ 0x28, 0xcf, 0x0d, 0x85, 0xd4, 0x5f, 0x36, 0x73, 0xed, 0x2e, 0x79, 0x0e, ++ 0x75, 0x65, 0x62, 0x9c, 0x3b, 0x6e, 0x3e, 0x9f, 0x5f, 0xfb, 0xe9, 0xfc, ++ 0x0a, 0x7f, 0xb4, 0xb2, 0xd0, 0x53, 0x00, 0xb9, 0x1c, 0x3b, 0x56, 0x98, ++ 0xbe, 0x95, 0xfd, 0xa4, 0x8d, 0xeb, 0xa0, 0x27, 0xef, 0xb8, 0x26, 0x96, ++ 0xeb, 0x80, 0x6f, 0xd0, 0x79, 0x9c, 0x3e, 0x9d, 0x9f, 0x35, 0x75, 0x5d, ++ 0x2e, 0xe1, 0xf9, 0x51, 0x0a, 0xeb, 0x2f, 0xf9, 0x8b, 0x6b, 0x4b, 0xf5, ++ 0x73, 0x25, 0xad, 0x53, 0xd8, 0x29, 0xef, 0x51, 0x8a, 0xd4, 0xea, 0x32, ++ 0xac, 0xbf, 0x6a, 0xa4, 0x6d, 0x2a, 0xfc, 0xef, 0xe7, 0x2e, 0xcf, 0xcd, ++ 0xa0, 0x43, 0xe7, 0x77, 0xf1, 0xa8, 0xe5, 0xe9, 0xc8, 0x87, 0xba, 0x4c, ++ 0x8e, 0x77, 0x51, 0xc7, 0xf5, 0xfe, 0xde, 0x24, 0x70, 0x9e, 0xd2, 0xeb, ++ 0x7d, 0xfa, 0xb8, 0x0e, 0x57, 0xfe, 0x1d, 0x98, 0x37, 0x33, 0x6b, 0xdc, ++ 0xba, 0x29, 0xf0, 0x3b, 0x64, 0x64, 0xf0, 0x73, 0x2e, 0xb3, 0x68, 0x01, ++ 0x5d, 0x2e, 0x43, 0xa4, 0xb2, 0x96, 0xfd, 0x96, 0xc3, 0x08, 0x3f, 0x70, ++ 0x87, 0xa6, 0xc7, 0x05, 0x0e, 0x99, 0x17, 0x07, 0xcc, 0x0e, 0x63, 0x1c, ++ 0xea, 0x37, 0x11, 0xf9, 0xf1, 0x5e, 0x9a, 0xd7, 0xa5, 0xc9, 0xf9, 0x98, ++ 0x26, 0xe7, 0xe3, 0x9a, 0x9c, 0xdf, 0x42, 0x9d, 0x8c, 0xe0, 0xdb, 0xd4, ++ 0x0e, 0xd8, 0x4d, 0xed, 0x80, 0x13, 0xc1, 0x5f, 0xa9, 0xaf, 0xcc, 0xb7, ++ 0x27, 0x0a, 0x4a, 0xcb, 0x58, 0x7f, 0x45, 0x5f, 0x0a, 0x70, 0xbd, 0x2e, ++ 0x38, 0x0b, 0xf6, 0x25, 0xfd, 0x4d, 0x0a, 0xf4, 0x7a, 0xb3, 0xa6, 0xbf, ++ 0x49, 0x9a, 0xbf, 0xe9, 0xca, 0x2f, 0xad, 0x92, 0xf3, 0xfc, 0xbc, 0x4e, ++ 0x95, 0x56, 0x6f, 0x3b, 0xaf, 0xdd, 0x83, 0xe8, 0xfb, 0xd5, 0xe7, 0x0d, ++ 0xcc, 0x17, 0x0c, 0xe7, 0x5e, 0x2b, 0xbc, 0x56, 0xf8, 0xf9, 0x97, 0xe4, ++ 0xb9, 0x53, 0x8c, 0xa6, 0x7c, 0x84, 0xf0, 0xb9, 0x2f, 0x25, 0xb2, 0x1f, ++ 0x52, 0xad, 0xb7, 0x66, 0x7f, 0x4c, 0x76, 0x3e, 0x77, 0xaa, 0x3c, 0x07, ++ 0x88, 0xfd, 0x16, 0x39, 0x2e, 0xc9, 0x91, 0x07, 0x3b, 0x59, 0xab, 0xd5, ++ 0x5b, 0x7b, 0x7d, 0x06, 0xaf, 0x09, 0xf5, 0xe9, 0xb8, 0xee, 0xcc, 0x38, ++ 0xc4, 0x5f, 0xcd, 0xbe, 0x74, 0xfc, 0xe0, 0xdf, 0x54, 0xf6, 0xd7, 0x35, ++ 0x53, 0x08, 0x27, 0xf8, 0x8a, 0x22, 0xf7, 0x57, 0x33, 0xb7, 0x3b, 0x73, ++ 0x18, 0xe6, 0x2b, 0x36, 0x03, 0xd7, 0xb7, 0x9b, 0x64, 0xff, 0x09, 0xcd, ++ 0xfe, 0x6a, 0xd2, 0xb4, 0xf5, 0xb4, 0xfd, 0x08, 0xab, 0x3f, 0x05, 0xf2, ++ 0x08, 0x1e, 0x7a, 0x29, 0x65, 0x09, 0xe1, 0x9b, 0xa2, 0x02, 0xcb, 0xa4, ++ 0xdf, 0x0f, 0x64, 0xb2, 0xbf, 0x16, 0x81, 0xcc, 0xb9, 0xf0, 0x8b, 0x8a, ++ 0xff, 0x7d, 0xe1, 0xa4, 0xbc, 0xd2, 0x3d, 0x75, 0x89, 0x71, 0x24, 0xf8, ++ 0xe1, 0xdf, 0x01, 0xbc, 0xda, 0x9d, 0xb7, 0xc4, 0x78, 0x3d, 0xfa, 0x5b, ++ 0xdf, 0xb7, 0x87, 0xf6, 0x8f, 0xf0, 0xa7, 0x28, 0x76, 0xe0, 0xb9, 0xb2, ++ 0x7f, 0x44, 0xeb, 0x8e, 0x61, 0xce, 0x10, 0xdc, 0xf4, 0xe2, 0xfb, 0xe8, ++ 0x37, 0x1b, 0xf2, 0x96, 0xb8, 0x09, 0x9f, 0x6d, 0xf1, 0x1d, 0xab, 0x87, ++ 0xde, 0xfc, 0x56, 0xea, 0x97, 0x6d, 0x5f, 0xdb, 0x69, 0xf0, 0xad, 0xaa, ++ 0x43, 0xe6, 0xed, 0x05, 0xfb, 0xda, 0x2e, 0xbc, 0x88, 0xb8, 0xdc, 0x16, ++ 0xed, 0x84, 0x7b, 0xdf, 0x5b, 0x98, 0xca, 0xfc, 0x5e, 0xdb, 0xb1, 0x7b, ++ 0x33, 0xf4, 0xad, 0xb7, 0x55, 0xde, 0x07, 0x6c, 0x6a, 0xf9, 0xe3, 0x8e, ++ 0x5f, 0xf0, 0x38, 0x0b, 0xae, 0x49, 0x68, 0x5d, 0x7f, 0xae, 0xa0, 0xef, ++ 0xac, 0x3c, 0xf2, 0x1f, 0x8b, 0x41, 0xd7, 0xec, 0x48, 0xff, 0x17, 0xc0, ++ 0x1f, 0x3c, 0x32, 0x83, 0xe9, 0x9c, 0x3d, 0x5c, 0xda, 0xf5, 0xc3, 0x47, ++ 0x0a, 0x96, 0xc0, 0x4e, 0x7b, 0xdb, 0xf6, 0xfd, 0x0c, 0xf6, 0x37, 0x3b, ++ 0x96, 0x12, 0x5a, 0xd0, 0xf3, 0x82, 0x8d, 0xeb, 0x10, 0x95, 0xfb, 0x27, ++ 0xb8, 0x61, 0xa7, 0xbd, 0xd1, 0xdd, 0x0b, 0xb1, 0x7e, 0xed, 0xf3, 0x16, ++ 0x27, 0xf4, 0xb4, 0x72, 0x7f, 0x62, 0x01, 0xea, 0x03, 0x07, 0x0b, 0x65, ++ 0x3d, 0xbc, 0x62, 0xe2, 0x96, 0x14, 0xc4, 0x59, 0xc3, 0xcb, 0x7b, 0x77, ++ 0xfd, 0x02, 0xf7, 0xab, 0xcf, 0xdb, 0xf8, 0x5e, 0xa8, 0x2e, 0x4e, 0xe6, ++ 0x79, 0x95, 0x6a, 0xe3, 0xb4, 0x95, 0x2c, 0xbf, 0x9d, 0xbb, 0x9e, 0x06, ++ 0xdd, 0x7b, 0x6d, 0x7c, 0x3f, 0x5b, 0x81, 0x5a, 0x15, 0xe1, 0x15, 0xbb, ++ 0x32, 0xb8, 0x8e, 0xff, 0xca, 0x37, 0x1f, 0x2d, 0x84, 0x1c, 0x8a, 0xd4, ++ 0xed, 0xbb, 0xd0, 0xfe, 0xc5, 0x73, 0x36, 0x03, 0xf8, 0x70, 0xc2, 0xec, ++ 0x8a, 0xbd, 0x11, 0x76, 0x78, 0xc2, 0xc4, 0xe7, 0xcd, 0x0a, 0x0d, 0xaf, ++ 0x38, 0x39, 0x5c, 0xd2, 0x13, 0xd9, 0x53, 0xcc, 0xf2, 0x8b, 0xdf, 0x92, ++ 0x82, 0x38, 0x5b, 0x39, 0xfc, 0xbe, 0x5b, 0x40, 0xf7, 0x6c, 0x75, 0xcb, ++ 0x0e, 0x9c, 0x77, 0xc4, 0x6e, 0x0b, 0xdf, 0x4d, 0x9c, 0xdd, 0x4b, 0x7c, ++ 0xa3, 0x79, 0x67, 0x9b, 0x4d, 0x53, 0x20, 0xe5, 0xde, 0xbd, 0xd1, 0x46, ++ 0xe8, 0xcb, 0x79, 0x65, 0xcb, 0xc2, 0xa7, 0xb0, 0x7e, 0xb3, 0x1c, 0x77, ++ 0xde, 0xb6, 0x85, 0xf9, 0xe9, 0x6d, 0x1e, 0x2f, 0xf0, 0x3d, 0x1a, 0x27, ++ 0xe0, 0xb7, 0xce, 0x2b, 0x5b, 0x07, 0xb5, 0x9f, 0x6d, 0xde, 0x9d, 0x83, ++ 0xf3, 0xe8, 0xb9, 0xe7, 0x67, 0xf3, 0xb9, 0x54, 0xd7, 0x5f, 0xdd, 0x5e, ++ 0x2a, 0x9f, 0xb3, 0x0c, 0x8a, 0x8b, 0xec, 0x09, 0xc8, 0x1f, 0x55, 0x6a, ++ 0x7f, 0x0b, 0xbb, 0x57, 0x44, 0x51, 0xbc, 0xad, 0xd0, 0xd0, 0x73, 0x07, ++ 0x9f, 0xec, 0x7d, 0x4a, 0x0c, 0xcc, 0x3f, 0xd7, 0x62, 0x0a, 0x98, 0x89, ++ 0x47, 0x15, 0x16, 0xb1, 0xce, 0x1a, 0x37, 0x60, 0x0f, 0x95, 0xc9, 0x37, ++ 0x95, 0x60, 0x7f, 0x95, 0x86, 0xc6, 0x4c, 0xe4, 0x2d, 0x15, 0x53, 0x7b, ++ 0x16, 0xc2, 0x2e, 0xce, 0xda, 0x84, 0x35, 0x89, 0xc6, 0xbd, 0xa9, 0xc5, ++ 0xad, 0xca, 0x03, 0x6b, 0xe6, 0x20, 0xff, 0xbd, 0x1a, 0x3d, 0x97, 0x34, ++ 0x7f, 0x74, 0x31, 0x49, 0xc6, 0xaf, 0x8b, 0xed, 0x36, 0x5f, 0xe8, 0xbd, ++ 0x64, 0x38, 0x7c, 0xaf, 0x5e, 0xd8, 0xdf, 0xca, 0x18, 0xc0, 0xef, 0x5a, ++ 0x61, 0xe1, 0x1c, 0x5e, 0x5f, 0xef, 0x4d, 0xb3, 0xbf, 0x1a, 0xe7, 0xb4, ++ 0xda, 0x38, 0xe9, 0x3f, 0xde, 0xa7, 0xf1, 0x2d, 0xe4, 0xc7, 0xbe, 0xd1, ++ 0xe2, 0xdd, 0xa2, 0xd5, 0x83, 0xc7, 0xf7, 0x17, 0xc6, 0xf1, 0xf7, 0x6b, ++ 0xcd, 0x3d, 0x99, 0x88, 0x7f, 0xfa, 0xfa, 0xc1, 0x42, 0x2d, 0x6e, 0x18, ++ 0x7b, 0x32, 0xe1, 0xaf, 0xc2, 0xe7, 0xcd, 0x46, 0x3a, 0x02, 0x3f, 0xf2, ++ 0x82, 0xc2, 0x7e, 0xa4, 0xf2, 0x80, 0xf2, 0x81, 0x4a, 0x7c, 0xaa, 0xb4, ++ 0x7a, 0x7d, 0x2a, 0xf8, 0x22, 0xcc, 0xfa, 0x3e, 0x8d, 0x97, 0x14, 0x39, ++ 0x2f, 0x69, 0x9a, 0xc6, 0x77, 0x9a, 0xbb, 0xc1, 0x9d, 0xca, 0xdf, 0xad, ++ 0x6c, 0xb1, 0xb9, 0x6c, 0x34, 0xaf, 0x2a, 0xa2, 0x27, 0x06, 0x79, 0x51, ++ 0x75, 0x74, 0x4f, 0x0c, 0xf2, 0x9d, 0xde, 0x97, 0x55, 0xd1, 0xa4, 0x89, ++ 0x2b, 0x3e, 0x41, 0x93, 0x4f, 0x9a, 0x26, 0xb2, 0x90, 0x7a, 0x63, 0x85, ++ 0xdf, 0xe4, 0xb2, 0xe5, 0x0c, 0x21, 0x67, 0xe4, 0x4f, 0x34, 0x6e, 0x39, ++ 0xfe, 0xa6, 0xef, 0x3f, 0xe3, 0x4e, 0xe3, 0xfd, 0x94, 0xb7, 0x47, 0xf2, ++ 0xf7, 0x84, 0xbd, 0x67, 0x1a, 0xf4, 0xb4, 0x7c, 0xfb, 0xe0, 0x79, 0xd8, ++ 0x97, 0x3d, 0xc4, 0xfe, 0x7a, 0xdb, 0x77, 0x26, 0x84, 0x9e, 0xcb, 0xd3, ++ 0x34, 0xba, 0x83, 0xca, 0x07, 0x6c, 0x27, 0xc1, 0x6f, 0x3e, 0x4c, 0x81, ++ 0xdc, 0x2b, 0x0d, 0x62, 0x1d, 0xee, 0x2f, 0xcf, 0xd1, 0x1c, 0xdc, 0x6b, ++ 0x12, 0x2e, 0xac, 0x12, 0xe7, 0x7b, 0xcf, 0xca, 0xbf, 0x44, 0x45, 0x40, ++ 0x5f, 0xce, 0x5d, 0xac, 0x66, 0xbb, 0xed, 0x55, 0x7a, 0xd8, 0xaf, 0xbd, ++ 0xed, 0x9e, 0xc3, 0x7e, 0xa9, 0xd7, 0xd4, 0xc3, 0x7e, 0xed, 0xf5, 0x23, ++ 0xb7, 0xb3, 0x7f, 0xe8, 0x1d, 0xd6, 0xb3, 0x10, 0x7e, 0xea, 0x6d, 0xf7, ++ 0x72, 0xd9, 0x3f, 0xb2, 0x67, 0xa1, 0x83, 0xfa, 0xf7, 0xe9, 0xf8, 0x18, ++ 0xc1, 0x71, 0xff, 0xbd, 0x23, 0x35, 0xec, 0x3f, 0x66, 0xab, 0xf2, 0x5d, ++ 0x85, 0xd8, 0x69, 0xb2, 0xcb, 0x7a, 0xd0, 0x86, 0x93, 0xf5, 0x7c, 0xbe, ++ 0x30, 0x39, 0x42, 0xcf, 0xdf, 0xa7, 0xdc, 0x5a, 0xbd, 0x67, 0x40, 0x3e, ++ 0x7c, 0xee, 0xd2, 0xed, 0xa6, 0x57, 0x38, 0xf6, 0x1d, 0x80, 0x1d, 0x96, ++ 0x47, 0x71, 0x5d, 0x87, 0xf2, 0xa8, 0x96, 0x17, 0x91, 0xef, 0xcd, 0x4f, ++ 0x70, 0xe2, 0xbd, 0x46, 0x39, 0xe6, 0x49, 0x3d, 0x30, 0x87, 0xde, 0x37, ++ 0xc6, 0xc7, 0x7d, 0xb5, 0x0c, 0xf2, 0xb9, 0x75, 0xb4, 0xa7, 0xd8, 0x9d, ++ 0x87, 0xfb, 0xcd, 0x1e, 0x3e, 0x47, 0x90, 0x56, 0x73, 0xbc, 0xa9, 0xfd, ++ 0x9d, 0x85, 0xcf, 0x93, 0x41, 0x53, 0xdf, 0x2e, 0xf8, 0xa9, 0xcc, 0xd1, ++ 0x9e, 0x59, 0x6e, 0xa2, 0xa3, 0xda, 0xdc, 0xbd, 0x3e, 0x97, 0x48, 0xba, ++ 0x60, 0xea, 0xe9, 0x42, 0x89, 0x7c, 0x96, 0x2a, 0xfd, 0x91, 0xd8, 0x2d, ++ 0xf5, 0xaa, 0x37, 0x7b, 0xa7, 0xbc, 0xa7, 0xd1, 0xee, 0x2b, 0xef, 0xd0, ++ 0xf8, 0x2f, 0xe8, 0x10, 0xd3, 0x08, 0xbd, 0x50, 0xa4, 0x7c, 0x5f, 0x6f, ++ 0xdf, 0xff, 0x16, 0xfc, 0x4a, 0x6f, 0xf7, 0x38, 0xf6, 0xc7, 0xe1, 0x76, ++ 0x73, 0xb6, 0xfd, 0xb1, 0x18, 0xf8, 0x87, 0x3f, 0x51, 0x1c, 0xf7, 0x86, ++ 0x9c, 0xf7, 0xff, 0xb4, 0x78, 0x37, 0xdf, 0xb3, 0xce, 0xc3, 0x7b, 0x10, ++ 0x82, 0x4b, 0xd6, 0x0d, 0xd6, 0x87, 0xfe, 0xaf, 0x6f, 0xe5, 0x73, 0x9f, ++ 0xd8, 0x1c, 0xd2, 0x0e, 0x3d, 0x6c, 0x18, 0x8c, 0x87, 0xeb, 0x11, 0xf4, ++ 0x31, 0x30, 0xc8, 0xef, 0x78, 0x99, 0xef, 0xdb, 0x34, 0xbb, 0xaa, 0x2a, ++ 0xe8, 0xae, 0x05, 0x1f, 0x2e, 0xe3, 0x73, 0x09, 0x57, 0x43, 0xf0, 0xd7, ++ 0xc2, 0xf0, 0xb0, 0xf1, 0xa2, 0x54, 0xe6, 0x09, 0xdb, 0x10, 0xff, 0x89, ++ 0x1f, 0xd5, 0x63, 0x02, 0x27, 0xf9, 0x9c, 0xbe, 0xcf, 0x24, 0xe0, 0xc7, ++ 0xd7, 0x52, 0xfc, 0x62, 0xbc, 0x2d, 0xd2, 0x87, 0xf3, 0x8a, 0x61, 0x1f, ++ 0xc5, 0xa7, 0x78, 0x19, 0x9f, 0x10, 0x17, 0xaa, 0x62, 0xba, 0xb9, 0x3e, ++ 0xd5, 0xdb, 0x66, 0xe1, 0xfb, 0xde, 0x07, 0x3b, 0x3e, 0x49, 0xc1, 0xfe, ++ 0x49, 0x0f, 0xb9, 0x0e, 0x53, 0xd5, 0xf1, 0x52, 0x02, 0xce, 0xef, 0x7b, ++ 0xb5, 0xf3, 0x02, 0xc5, 0xc1, 0x04, 0x7e, 0x1f, 0xd3, 0xd6, 0x91, 0x80, ++ 0x73, 0x87, 0xde, 0x5e, 0x6d, 0xf0, 0x67, 0x82, 0x2e, 0xca, 0x88, 0x38, ++ 0x5f, 0xd7, 0xdb, 0x6b, 0xd4, 0x40, 0x26, 0xe8, 0xaf, 0x52, 0xba, 0x73, ++ 0xd0, 0xbf, 0xb7, 0xd0, 0xae, 0x8d, 0x27, 0x5c, 0x05, 0x2e, 0x78, 0x1f, ++ 0xd5, 0x8a, 0xb4, 0x77, 0xd1, 0xa1, 0xb2, 0x3f, 0x0f, 0x97, 0xdb, 0x93, ++ 0x9a, 0xbe, 0x92, 0x5f, 0xc8, 0xe1, 0xf7, 0x1d, 0x2f, 0xcb, 0xfa, 0x80, ++ 0xee, 0x07, 0x2a, 0x34, 0x7f, 0xf2, 0x1a, 0xda, 0xb3, 0xa5, 0xdd, 0xdb, ++ 0xf5, 0x7b, 0x25, 0x9a, 0x5a, 0x01, 0x7b, 0x1f, 0xc2, 0x3f, 0x24, 0xb9, ++ 0xf5, 0xbc, 0x78, 0x05, 0xd7, 0x6f, 0x1e, 0x77, 0x3b, 0x24, 0xae, 0xcd, ++ 0xe7, 0x75, 0x65, 0x7d, 0x89, 0xfb, 0x6b, 0x5f, 0x39, 0x9f, 0x93, 0x96, ++ 0x8d, 0x79, 0xda, 0xb8, 0x50, 0x3f, 0x34, 0x6e, 0xc0, 0xaf, 0xc0, 0xfe, ++ 0x93, 0xd8, 0xfe, 0x1f, 0x34, 0x25, 0xd0, 0xbe, 0x2a, 0x77, 0x28, 0xce, ++ 0xb5, 0xf0, 0x53, 0x0b, 0xd6, 0x14, 0xd3, 0x70, 0xb1, 0xdc, 0xb8, 0xb2, ++ 0x98, 0xeb, 0x66, 0xc2, 0xcb, 0xe7, 0xb6, 0x70, 0xba, 0xc2, 0xf5, 0x68, ++ 0xb2, 0x5b, 0xf2, 0xa9, 0xd2, 0x30, 0xac, 0x28, 0x3e, 0x64, 0xbd, 0x73, ++ 0xe4, 0xd3, 0x93, 0xa6, 0xb0, 0x9f, 0x09, 0xc0, 0xef, 0xfc, 0x24, 0xfe, ++ 0xd1, 0x62, 0xd4, 0x29, 0x7e, 0xbc, 0x40, 0xbe, 0x1b, 0xb8, 0x1c, 0x6f, ++ 0x42, 0xed, 0x1c, 0xfb, 0xd9, 0x2e, 0xfd, 0x38, 0xcc, 0xe6, 0x92, 0xe1, ++ 0x4a, 0x3d, 0x5e, 0xbe, 0xa2, 0x71, 0x7d, 0xe2, 0x10, 0x74, 0x84, 0xd3, ++ 0x59, 0xe1, 0x69, 0x2c, 0x4e, 0x70, 0x5c, 0xd9, 0xae, 0xd3, 0x7b, 0xce, ++ 0xa6, 0xd3, 0x57, 0x60, 0x1a, 0x11, 0xca, 0x87, 0x79, 0x6b, 0x8a, 0x47, ++ 0x10, 0x5c, 0x6e, 0xfd, 0x67, 0xf9, 0x20, 0xf7, 0x7b, 0xae, 0xc3, 0x12, ++ 0x40, 0x5c, 0xad, 0x58, 0xb0, 0x72, 0x7d, 0xec, 0x10, 0x7a, 0x73, 0x45, ++ 0x3c, 0xd8, 0x1e, 0x12, 0xbf, 0xd2, 0x20, 0x5f, 0x1f, 0xdf, 0x6f, 0x5c, ++ 0x8d, 0xfe, 0x70, 0x58, 0xad, 0x04, 0x4e, 0xa2, 0x5e, 0x24, 0xc8, 0xae, ++ 0x9a, 0xd9, 0xbe, 0xc8, 0x5e, 0x42, 0xe2, 0xc2, 0xf5, 0xee, 0xb0, 0xba, ++ 0x43, 0xf9, 0xe2, 0xb1, 0xc8, 0xab, 0x85, 0x67, 0xf1, 0x58, 0xc4, 0x19, ++ 0xb2, 0xab, 0x85, 0xce, 0x21, 0xce, 0x97, 0xe4, 0x20, 0x47, 0x19, 0xf8, ++ 0xcd, 0x88, 0x97, 0x61, 0x38, 0x3d, 0x7f, 0x76, 0xcb, 0x77, 0x49, 0xd7, ++ 0xbb, 0xa5, 0x9d, 0xdf, 0x37, 0xc3, 0x15, 0x84, 0xdf, 0xbc, 0x51, 0x35, ++ 0x70, 0x1e, 0x1e, 0xbe, 0xde, 0x97, 0x6e, 0x99, 0x4f, 0x74, 0x27, 0x44, ++ 0xdf, 0xa3, 0xbf, 0xe7, 0x80, 0xb0, 0x6f, 0x54, 0x25, 0xdf, 0x92, 0x0d, ++ 0xfd, 0x6f, 0xc3, 0xde, 0x92, 0x13, 0xa2, 0x1d, 0xb8, 0x0f, 0x2a, 0x2a, ++ 0x8c, 0x94, 0xe3, 0x0e, 0xd9, 0xec, 0xa8, 0xdf, 0x04, 0x0f, 0x7d, 0xc5, ++ 0xf5, 0xdd, 0xe0, 0x43, 0x51, 0xf3, 0xe4, 0xbd, 0x41, 0x94, 0x18, 0x49, ++ 0xfd, 0x5d, 0x49, 0x93, 0x9a, 0x42, 0xe3, 0xc8, 0xaf, 0x8b, 0xe4, 0x7e, ++ 0x23, 0x73, 0x65, 0xde, 0x52, 0x97, 0x65, 0xfa, 0xfb, 0xf5, 0xa1, 0xec, ++ 0xe8, 0xcb, 0xf5, 0x21, 0xce, 0x1b, 0xb2, 0x23, 0xf9, 0xbe, 0xa4, 0xb7, ++ 0xfd, 0x73, 0x8e, 0x5b, 0xc1, 0xce, 0x3c, 0x3b, 0xee, 0x35, 0x7a, 0xbb, ++ 0xe9, 0x74, 0x48, 0xf6, 0x54, 0xf7, 0xcd, 0x7f, 0x27, 0x20, 0xbe, 0xf6, ++ 0x76, 0xfe, 0x99, 0xdf, 0xa1, 0xf5, 0x7e, 0xfd, 0x09, 0xbf, 0x4f, 0xdb, ++ 0xa8, 0xbd, 0x0f, 0x7c, 0xad, 0x5d, 0x7b, 0xdf, 0xd5, 0xed, 0x88, 0x46, ++ 0x7b, 0xb0, 0xe4, 0xa3, 0x62, 0x8c, 0xdb, 0xa4, 0xc1, 0x81, 0x3a, 0x81, ++ 0xac, 0x17, 0xeb, 0x50, 0x3f, 0xff, 0xea, 0xf5, 0x80, 0x90, 0x73, 0xf0, ++ 0xe8, 0xa2, 0xa1, 0xcf, 0xc1, 0x71, 0x9e, 0xa8, 0xd0, 0x3a, 0x81, 0x23, ++ 0x71, 0xa8, 0xba, 0x4a, 0x68, 0x9d, 0x20, 0x3d, 0x43, 0xd6, 0x09, 0x00, ++ 0x51, 0x27, 0x48, 0x37, 0xc9, 0x3a, 0x01, 0x70, 0xd4, 0x09, 0x00, 0x51, ++ 0x27, 0x40, 0x3b, 0xea, 0x04, 0xc0, 0x51, 0x27, 0x00, 0x8e, 0x3a, 0x01, ++ 0x70, 0xd4, 0x09, 0x00, 0x51, 0x27, 0x40, 0xfb, 0x17, 0xf3, 0xe4, 0x7b, ++ 0x99, 0x20, 0x29, 0xb1, 0xac, 0x5f, 0x46, 0xb1, 0x7f, 0xbf, 0xbb, 0x59, ++ 0xf5, 0x21, 0x3f, 0xbf, 0xfb, 0x90, 0xbc, 0x87, 0xba, 0xbb, 0x51, 0xe1, ++ 0x77, 0x5a, 0x17, 0xe8, 0xfb, 0x88, 0x73, 0x57, 0xbc, 0xd7, 0x39, 0xa0, ++ 0xbd, 0xd7, 0xf1, 0x6f, 0xe5, 0x7b, 0xbd, 0xba, 0x36, 0xd5, 0x09, 0x51, ++ 0xd5, 0x99, 0xfa, 0x8e, 0xa2, 0xae, 0x53, 0xd7, 0xaa, 0x38, 0xd7, 0xc0, ++ 0xbf, 0xd4, 0xcf, 0xe3, 0xef, 0x6f, 0xec, 0xcc, 0x7b, 0x77, 0x01, 0xda, ++ 0x9b, 0x4d, 0x4e, 0x83, 0x03, 0x72, 0xba, 0x98, 0x80, 0x7a, 0x55, 0x65, ++ 0x67, 0x33, 0xd7, 0x9f, 0xdc, 0x89, 0x87, 0xcc, 0x2c, 0xdf, 0x16, 0x45, ++ 0xa0, 0x5e, 0x7a, 0xbb, 0x45, 0x9e, 0x73, 0x6b, 0x54, 0x6a, 0x9d, 0xc2, ++ 0xf7, 0xa1, 0x9c, 0x07, 0xd7, 0x58, 0xba, 0xf9, 0xfc, 0x51, 0xb5, 0x47, ++ 0xb1, 0x97, 0x85, 0xde, 0xe7, 0x5e, 0xf7, 0x19, 0xfb, 0x81, 0xb5, 0xb6, ++ 0x98, 0x26, 0xd0, 0x59, 0xe3, 0xb7, 0xd9, 0xcb, 0x86, 0x78, 0xff, 0xc1, ++ 0xf7, 0xc2, 0x0e, 0x71, 0xf9, 0xbe, 0x79, 0x99, 0x1c, 0x22, 0x6a, 0xa2, ++ 0x8a, 0xf9, 0xbe, 0x79, 0x19, 0xee, 0x99, 0x09, 0x0a, 0xf5, 0x6b, 0x23, ++ 0xdf, 0x1f, 0xd3, 0xc1, 0x74, 0x38, 0xf4, 0x11, 0xef, 0xaa, 0xb2, 0xe0, ++ 0xd6, 0xed, 0xd2, 0xee, 0xc3, 0xde, 0x53, 0x55, 0x76, 0xb6, 0xae, 0x4f, ++ 0x16, 0x57, 0xde, 0x43, 0xa3, 0x32, 0x00, 0xf9, 0x87, 0xdf, 0x3f, 0x7b, ++ 0x8a, 0xa2, 0xe3, 0x4f, 0x47, 0xc2, 0x51, 0x88, 0xc9, 0xc8, 0x9b, 0x4a, ++ 0x1e, 0x2f, 0xdb, 0xd7, 0x46, 0xdf, 0xeb, 0xdf, 0x62, 0xe1, 0xbc, 0x63, ++ 0x65, 0xa1, 0x67, 0x39, 0xf4, 0xe8, 0xa8, 0xc9, 0xc5, 0x75, 0x92, 0xa3, ++ 0x87, 0x6c, 0x7c, 0x3e, 0xfa, 0x78, 0xeb, 0xf8, 0x41, 0x75, 0x92, 0xcf, ++ 0x5d, 0x9e, 0xea, 0x22, 0xbe, 0x9f, 0x1f, 0xcd, 0x75, 0x8b, 0x55, 0x26, ++ 0x85, 0xe3, 0x72, 0x61, 0xc9, 0xb8, 0x44, 0x7e, 0x37, 0x70, 0xcc, 0xc4, ++ 0xf1, 0xa7, 0xc3, 0x55, 0x5a, 0x8b, 0x71, 0xab, 0x26, 0x39, 0xb8, 0x3e, ++ 0x55, 0x64, 0x11, 0xf7, 0xf0, 0x3a, 0xda, 0x3b, 0x2d, 0x82, 0x6c, 0x4f, ++ 0x45, 0x6b, 0x15, 0x9f, 0x81, 0xf0, 0xc5, 0xc2, 0x69, 0x86, 0xfd, 0x2c, ++ 0x22, 0xb6, 0xb1, 0xbe, 0x98, 0xa2, 0x36, 0xe0, 0x3d, 0xd5, 0x22, 0x21, ++ 0xdf, 0x37, 0xe8, 0x7a, 0xb3, 0x6a, 0xab, 0xc2, 0x79, 0x01, 0x17, 0x0a, ++ 0x12, 0x70, 0x2f, 0x29, 0xf9, 0xbb, 0xa8, 0xf3, 0xdf, 0xbe, 0xc2, 0xfb, ++ 0x85, 0xa5, 0x16, 0x99, 0xbf, 0x26, 0x1b, 0xe4, 0x7d, 0x76, 0xf2, 0x26, ++ 0xf9, 0xbe, 0xe5, 0x27, 0xc2, 0x63, 0x46, 0xbc, 0x5d, 0x4e, 0x71, 0x11, ++ 0x90, 0xe2, 0xe4, 0xef, 0x7a, 0xa8, 0xdd, 0x13, 0x39, 0x3a, 0x45, 0xe6, ++ 0xe7, 0x8e, 0x44, 0xac, 0xbf, 0xf8, 0xb8, 0x89, 0xdf, 0xfb, 0x16, 0x25, ++ 0xfe, 0x30, 0xd3, 0xc3, 0xf1, 0xda, 0xcd, 0xef, 0x18, 0x94, 0xc0, 0x9d, ++ 0xea, 0xa5, 0x6b, 0xae, 0x6e, 0x3f, 0xe1, 0xef, 0x18, 0x8e, 0x9a, 0xa4, ++ 0x7f, 0x21, 0x3e, 0xf2, 0xb9, 0xa8, 0x0b, 0x7a, 0xc9, 0xf5, 0x19, 0x0f, ++ 0xc3, 0xe3, 0xf5, 0xe5, 0x0c, 0x27, 0xce, 0x90, 0x7e, 0xfa, 0xf2, 0xbb, ++ 0x44, 0x92, 0x91, 0x1d, 0xf4, 0x47, 0xf6, 0xbd, 0x8f, 0xf3, 0x62, 0x72, ++ 0x62, 0xb4, 0x13, 0xfe, 0x4e, 0xb7, 0xfb, 0x2b, 0xde, 0x27, 0x46, 0x48, ++ 0xa8, 0xbf, 0x4f, 0x1c, 0x43, 0x50, 0x84, 0xbc, 0x4f, 0xdc, 0xec, 0x72, ++ 0xf0, 0xfa, 0xc9, 0x86, 0x13, 0x53, 0x1d, 0xe0, 0xc7, 0x5f, 0xa2, 0x9c, ++ 0xe0, 0x87, 0xfe, 0x4e, 0xf1, 0xbe, 0x19, 0xa5, 0x3b, 0x21, 0x27, 0x57, ++ 0x8c, 0xf0, 0xe2, 0xbb, 0xb8, 0x47, 0xd9, 0x42, 0x7c, 0x2d, 0xc6, 0x46, ++ 0x14, 0xd4, 0xb9, 0xfd, 0x2e, 0x15, 0x75, 0xeb, 0x43, 0x8a, 0x9d, 0xdf, ++ 0x45, 0x5f, 0xe1, 0x27, 0xb7, 0x3e, 0x84, 0x77, 0x3c, 0x75, 0xe9, 0x8a, ++ 0x5d, 0x71, 0xa0, 0x1e, 0xbe, 0xa5, 0x28, 0x81, 0xe8, 0x2e, 0x4e, 0x4b, ++ 0x65, 0xba, 0xeb, 0xda, 0x65, 0xbd, 0x94, 0x39, 0x94, 0x80, 0x7a, 0xba, ++ 0x66, 0x0f, 0x2e, 0x4f, 0x5b, 0xd1, 0x88, 0x81, 0xf6, 0xd9, 0x9a, 0x5d, ++ 0xf4, 0xd2, 0x78, 0xa9, 0x27, 0x37, 0xf8, 0xa0, 0x6f, 0xdf, 0xa1, 0x8e, ++ 0xfa, 0x1c, 0xc6, 0x7b, 0x85, 0xcd, 0xd9, 0xac, 0x9d, 0xd7, 0x20, 0xf7, ++ 0xd9, 0xd7, 0x8c, 0xe1, 0x7a, 0xaa, 0xae, 0x37, 0xfd, 0x2d, 0x89, 0x4d, ++ 0xd0, 0x9b, 0x37, 0x8a, 0x64, 0x9c, 0x59, 0xb0, 0xe0, 0x1d, 0x13, 0xf2, ++ 0x80, 0xae, 0x7c, 0xcf, 0x11, 0xec, 0x7f, 0x61, 0xd9, 0x67, 0x0f, 0x25, ++ 0xf0, 0xfe, 0x86, 0xae, 0x63, 0x91, 0x1f, 0xe5, 0x7b, 0xc9, 0xf0, 0x3a, ++ 0x96, 0xee, 0x97, 0x77, 0x69, 0x75, 0x70, 0xf8, 0x4f, 0xa3, 0x56, 0x67, ++ 0x35, 0x6a, 0x75, 0x56, 0xa3, 0x56, 0x67, 0x35, 0x6a, 0x75, 0x56, 0xa3, ++ 0x56, 0x67, 0x35, 0x6a, 0x75, 0x56, 0xa3, 0x56, 0x67, 0x35, 0x6a, 0x75, ++ 0x56, 0xa3, 0x56, 0x67, 0x35, 0x72, 0xfd, 0x6e, 0x05, 0xc3, 0xb7, 0xeb, ++ 0x57, 0x33, 0xec, 0xae, 0xf7, 0x72, 0x7f, 0x88, 0xff, 0x7f, 0xef, 0x2a, ++ 0xfe, 0x3f, 0xbc, 0x0e, 0xfa, 0x11, 0xc6, 0x85, 0xd7, 0x41, 0x85, 0xd5, ++ 0x11, 0xcb, 0x71, 0x94, 0xec, 0x5b, 0xd6, 0x9f, 0xc3, 0xea, 0x9e, 0x25, ++ 0xc3, 0x97, 0x6c, 0x20, 0xfe, 0x15, 0x36, 0x98, 0x9d, 0x68, 0xd2, 0xeb, ++ 0xa0, 0x78, 0xbf, 0x7c, 0x77, 0x14, 0xfb, 0x83, 0x0b, 0x45, 0x43, 0xd6, ++ 0x3f, 0x75, 0xbe, 0x45, 0x71, 0xbd, 0xb4, 0x5f, 0xd8, 0xa6, 0x80, 0xff, ++ 0x05, 0x59, 0xe3, 0x8c, 0x06, 0xea, 0xff, 0x8b, 0x26, 0x07, 0xbd, 0xfe, ++ 0x08, 0xfb, 0xc0, 0xfe, 0x60, 0x1f, 0x80, 0xb0, 0x0f, 0x63, 0xc6, 0x80, ++ 0x7d, 0x3c, 0x63, 0x26, 0x13, 0xce, 0x95, 0xf1, 0xde, 0xcb, 0xf1, 0xde, ++ 0xc6, 0x72, 0x5d, 0xbf, 0x86, 0xfc, 0x07, 0xe1, 0x4b, 0x85, 0x7d, 0x90, ++ 0xff, 0xb8, 0x10, 0xe6, 0x3f, 0xe8, 0xe0, 0x71, 0x07, 0xe8, 0x58, 0xd6, ++ 0x29, 0xdf, 0x35, 0xe9, 0xef, 0x37, 0x0b, 0x08, 0x7c, 0x39, 0x65, 0x08, ++ 0x7f, 0xe2, 0x97, 0xfe, 0x64, 0x4c, 0x84, 0x7f, 0x2f, 0xbe, 0x33, 0xa6, ++ 0x36, 0x82, 0xdf, 0x07, 0x1f, 0xd5, 0xde, 0x63, 0x1d, 0xdd, 0x28, 0xdf, ++ 0xc5, 0x95, 0x89, 0x52, 0xfe, 0xee, 0x10, 0x7e, 0x25, 0x06, 0xf2, 0x58, ++ 0x3a, 0xbc, 0xef, 0xfd, 0xa7, 0x69, 0xfc, 0xd2, 0x47, 0xa2, 0x38, 0x6f, ++ 0x59, 0x3f, 0x72, 0xd9, 0xb4, 0xff, 0x8d, 0x5f, 0xf9, 0xac, 0x48, 0x30, ++ 0xdf, 0x7e, 0x53, 0x1f, 0xa8, 0xfc, 0x98, 0x68, 0x71, 0x47, 0x48, 0xfd, ++ 0x73, 0x9b, 0x45, 0x16, 0xee, 0x6b, 0x84, 0x21, 0x82, 0xed, 0xa0, 0x48, ++ 0xdd, 0xac, 0xe0, 0x7e, 0x74, 0xd5, 0x5d, 0x62, 0x32, 0xe4, 0xec, 0xb6, ++ 0x94, 0x6e, 0x07, 0x9d, 0x89, 0xda, 0xfd, 0xb6, 0x88, 0xd7, 0xea, 0xad, ++ 0xc6, 0xee, 0x8a, 0xdd, 0x84, 0x9f, 0x48, 0x48, 0x76, 0xe2, 0x5e, 0x6b, ++ 0x74, 0xd2, 0x41, 0x81, 0xf7, 0x4f, 0x45, 0x75, 0x25, 0xd9, 0xf0, 0x8b, ++ 0x87, 0xc6, 0x78, 0x26, 0x14, 0xe7, 0xe1, 0xfd, 0xf2, 0x16, 0x05, 0xf3, ++ 0x23, 0xb3, 0xe5, 0xfe, 0x6f, 0x2d, 0x89, 0x6c, 0x82, 0x5e, 0x05, 0x0f, ++ 0x8d, 0xcf, 0x83, 0xbc, 0xe7, 0x5a, 0x1c, 0x6d, 0xa8, 0x03, 0x38, 0x8b, ++ 0x93, 0x96, 0xe2, 0x9c, 0x3f, 0x37, 0xd6, 0x91, 0x87, 0x3a, 0x80, 0xb3, ++ 0x6b, 0x94, 0xc4, 0x13, 0x1d, 0x6d, 0x8a, 0x13, 0xa9, 0x6c, 0xd2, 0x52, ++ 0x37, 0xbf, 0x3f, 0xb3, 0x6e, 0xf9, 0xd8, 0x8a, 0x77, 0x6b, 0x8a, 0x88, ++ 0xa5, 0x7d, 0x59, 0x86, 0x79, 0xf2, 0xf0, 0x9d, 0x9a, 0x92, 0x4f, 0xe5, ++ 0xb9, 0x59, 0xf4, 0x71, 0x1c, 0xbb, 0xbe, 0x58, 0x9e, 0xbf, 0x46, 0xbc, ++ 0x26, 0x02, 0xb8, 0xb7, 0xea, 0x9b, 0x19, 0xcd, 0xf7, 0x67, 0x22, 0xdb, ++ 0x91, 0x87, 0x7e, 0xca, 0x2b, 0xbf, 0x5f, 0x4c, 0xfa, 0x71, 0xf8, 0x07, ++ 0xae, 0x1b, 0x00, 0x93, 0x35, 0x3a, 0x13, 0x71, 0x8b, 0xa8, 0x42, 0xaa, ++ 0xdd, 0x36, 0xc0, 0xe3, 0xda, 0x7d, 0x5e, 0x97, 0xc1, 0xb3, 0x00, 0xb0, ++ 0x38, 0xc6, 0x6b, 0xe4, 0x76, 0x83, 0x2f, 0x17, 0xf0, 0x4d, 0x83, 0xff, ++ 0xa7, 0x68, 0x27, 0x7d, 0x2e, 0xc6, 0x3a, 0xc5, 0x8f, 0x4d, 0x9e, 0x98, ++ 0x45, 0x78, 0xb2, 0xc5, 0xcf, 0x7e, 0xb2, 0xc3, 0xe5, 0xba, 0x09, 0xf4, ++ 0xb5, 0xcc, 0x70, 0x95, 0x00, 0x86, 0xd7, 0xcf, 0x21, 0x5b, 0x9c, 0xf3, ++ 0x89, 0x9e, 0x9b, 0xd1, 0x1f, 0xfe, 0x0e, 0x4b, 0x97, 0xe7, 0xd2, 0x62, ++ 0xa9, 0xf7, 0x65, 0xc5, 0xd2, 0x7f, 0x4c, 0x5f, 0x2b, 0xef, 0x63, 0xc3, ++ 0xe5, 0x5e, 0x56, 0x6c, 0xd0, 0xfc, 0xdb, 0xdf, 0xa7, 0x9b, 0xe8, 0x5d, ++ 0x80, 0xef, 0xe9, 0xf4, 0x8b, 0x2d, 0x8b, 0x73, 0x41, 0x0f, 0xd1, 0x7b, ++ 0x17, 0xf6, 0x41, 0xf4, 0x2e, 0x04, 0x14, 0x51, 0x71, 0x5c, 0xef, 0xb8, ++ 0xba, 0x9e, 0x79, 0xf9, 0x7b, 0x65, 0xc5, 0x52, 0xbf, 0xc8, 0x9f, 0x55, ++ 0x7d, 0x2c, 0xfd, 0x19, 0xc3, 0x4c, 0xa3, 0x6f, 0x18, 0xf2, 0xc7, 0x51, ++ 0x0f, 0xf8, 0x86, 0x81, 0xde, 0x51, 0x8d, 0x7d, 0x36, 0xfc, 0x3b, 0x8c, ++ 0x67, 0xbd, 0x7d, 0x36, 0xc4, 0xf7, 0x67, 0xef, 0xef, 0xb3, 0xa1, 0xfd, ++ 0x59, 0x97, 0x7c, 0x27, 0x1d, 0xbe, 0x7e, 0x63, 0xb1, 0x7c, 0x3f, 0x91, ++ 0x39, 0xbd, 0x8f, 0xe7, 0x8f, 0xa5, 0x6f, 0x75, 0x73, 0x9e, 0xde, 0x37, ++ 0x0c, 0x79, 0x54, 0x66, 0xf9, 0xc7, 0xeb, 0xe5, 0xbd, 0x4b, 0x16, 0xc7, ++ 0x97, 0xb1, 0x5a, 0x7c, 0x19, 0xfb, 0x40, 0x5a, 0x7b, 0x0f, 0xe9, 0xdb, ++ 0xd8, 0x27, 0x63, 0xf9, 0x7e, 0x5b, 0xb8, 0xe3, 0xb9, 0xbf, 0xd2, 0x2a, ++ 0xed, 0xb4, 0xf2, 0x81, 0xb2, 0x83, 0x6d, 0x04, 0xc7, 0x6f, 0x23, 0x7a, ++ 0x43, 0xf2, 0xaf, 0x09, 0x3e, 0xa2, 0x7b, 0x50, 0x5e, 0x64, 0xec, 0x97, ++ 0xef, 0x2d, 0x09, 0x07, 0x9f, 0xf6, 0x98, 0x18, 0x87, 0xce, 0x22, 0xbf, ++ 0xaa, 0x11, 0xf2, 0xbd, 0xe5, 0x28, 0xcd, 0x6f, 0x20, 0x6f, 0x5b, 0x40, ++ 0x7e, 0xa1, 0xa6, 0xfc, 0xc8, 0x57, 0xfc, 0x0e, 0x00, 0xf3, 0xb1, 0x3e, ++ 0xee, 0x6c, 0xa1, 0x7f, 0xed, 0x26, 0x89, 0x53, 0xb8, 0xc6, 0x79, 0x74, ++ 0xf9, 0xbc, 0x35, 0x5d, 0x7c, 0x3e, 0xdc, 0x76, 0xb9, 0x5d, 0x3b, 0x6f, ++ 0xb6, 0xae, 0xc7, 0xf9, 0x99, 0xf2, 0xb7, 0x41, 0xed, 0x95, 0x65, 0x87, ++ 0xbb, 0x10, 0x6f, 0xaa, 0xf6, 0x0c, 0x6e, 0xaf, 0x59, 0xf1, 0x19, 0x9f, ++ 0x63, 0x29, 0x7f, 0x1b, 0xd4, 0x7e, 0xd7, 0x4f, 0x3f, 0xe0, 0x77, 0x36, ++ 0x75, 0xed, 0x83, 0xdb, 0x49, 0xbe, 0x4f, 0x41, 0xfe, 0xba, 0x7c, 0x8f, ++ 0x9a, 0xfc, 0x13, 0x70, 0xde, 0x3b, 0x5a, 0x13, 0xe1, 0x94, 0xff, 0x7e, ++ 0xc0, 0xbf, 0x12, 0xf6, 0xde, 0x54, 0x1d, 0xc5, 0xef, 0x67, 0x77, 0xfe, ++ 0xba, 0x80, 0xf5, 0x46, 0x97, 0x37, 0xcd, 0x6f, 0xfa, 0x6e, 0xfa, 0xb1, ++ 0x96, 0xc7, 0x7b, 0x0b, 0x44, 0x16, 0xec, 0xe1, 0xdb, 0x60, 0x2f, 0xfc, ++ 0x53, 0xc6, 0x20, 0xff, 0xe4, 0xe5, 0x3a, 0xdf, 0xac, 0x68, 0xf6, 0x3b, ++ 0x75, 0xda, 0xf9, 0xaa, 0xb6, 0xcc, 0xce, 0x71, 0x3e, 0xb9, 0xd6, 0xca, ++ 0xfe, 0xab, 0x48, 0x8d, 0x70, 0x02, 0xaf, 0x35, 0x4a, 0x3f, 0x23, 0x4a, ++ 0x54, 0xcd, 0x4f, 0xf9, 0xd9, 0xfe, 0x4f, 0xdc, 0x32, 0x8c, 0xeb, 0x79, ++ 0xbc, 0x01, 0xe0, 0x71, 0x93, 0xf8, 0xdd, 0x71, 0xc2, 0x5a, 0x89, 0xf7, ++ 0x8d, 0xb0, 0xb0, 0x7f, 0x28, 0x32, 0x94, 0x56, 0xef, 0x26, 0x78, 0xc4, ++ 0xb0, 0x82, 0xfd, 0x40, 0x12, 0x5e, 0x5c, 0x92, 0xdc, 0x9f, 0x81, 0x7f, ++ 0x50, 0x61, 0xbf, 0xb2, 0xae, 0x5a, 0x67, 0xf6, 0x2b, 0xf2, 0x7e, 0xdf, ++ 0x91, 0x87, 0xf3, 0xae, 0x7e, 0xdf, 0xd4, 0xb0, 0xd1, 0xd7, 0x7a, 0x00, ++ 0xe7, 0x65, 0xc5, 0xf7, 0xe4, 0x32, 0xd4, 0x15, 0x6f, 0x8b, 0xe2, 0xfb, ++ 0x83, 0x20, 0xea, 0x8d, 0xb4, 0x9f, 0x86, 0x61, 0xd2, 0x8f, 0x36, 0xcc, ++ 0xcf, 0xe4, 0x38, 0x10, 0x14, 0xa5, 0x0b, 0x56, 0x22, 0x0f, 0x99, 0x17, ++ 0xc1, 0xf5, 0xc7, 0x86, 0x61, 0x8e, 0x47, 0x71, 0x9f, 0xd8, 0x50, 0x31, ++ 0x91, 0xf3, 0xe8, 0x83, 0x7f, 0x93, 0x71, 0xb7, 0x6f, 0x8e, 0xd5, 0x89, ++ 0x3c, 0xaa, 0x61, 0xb2, 0x63, 0x0d, 0xde, 0xab, 0x34, 0x3c, 0xe0, 0xe0, ++ 0xfe, 0x57, 0x14, 0xb9, 0x9e, 0xf7, 0x51, 0xc9, 0x9f, 0x86, 0x39, 0x72, ++ 0xff, 0x0d, 0x15, 0x71, 0x7c, 0xee, 0xd1, 0xe5, 0xd0, 0xd0, 0xe8, 0x1a, ++ 0x89, 0xfb, 0xa9, 0xe9, 0x63, 0x3c, 0xff, 0x09, 0xb9, 0x8d, 0xd2, 0xee, ++ 0xe7, 0x1a, 0x52, 0xa9, 0x9d, 0xe0, 0x13, 0x4a, 0xe9, 0xfc, 0x9f, 0x60, ++ 0x9d, 0x49, 0x92, 0xde, 0x89, 0x33, 0x1c, 0x6c, 0x77, 0x47, 0xe7, 0x4f, ++ 0x7c, 0x74, 0x97, 0x83, 0xc3, 0x49, 0x00, 0xf7, 0x44, 0x75, 0xb3, 0xa2, ++ 0x07, 0x9d, 0x8b, 0xff, 0x07, 0xee, 0xab, 0x0f, 0xaf, 0x10, 0x37, 0x00, ++ 0x00, 0x00, 0x00, 0x00 ++}; ++ ++void bnx2x_init_e1h_firmware(struct bnx2x *bp) ++{ ++ INIT_OPS(bp) = (struct raw_op *)init_ops_e1h; ++ INIT_DATA(bp) = (u32 *)init_data_e1h; ++ INIT_OPS_OFFSETS(bp) = (u16 *)init_ops_offsets_e1h; ++ INIT_TSEM_INT_TABLE_DATA(bp) = tsem_int_table_data_e1h; ++ INIT_TSEM_PRAM_DATA(bp) = tsem_pram_data_e1h; ++ INIT_USEM_INT_TABLE_DATA(bp) = usem_int_table_data_e1h; ++ INIT_USEM_PRAM_DATA(bp) = usem_pram_data_e1h; ++ INIT_XSEM_INT_TABLE_DATA(bp) = xsem_int_table_data_e1h; ++ INIT_XSEM_PRAM_DATA(bp) = xsem_pram_data_e1h; ++ INIT_CSEM_INT_TABLE_DATA(bp) = csem_int_table_data_e1h; ++ INIT_CSEM_PRAM_DATA(bp) = csem_pram_data_e1h; ++} ++ +diff -r ddb96c0bbe13 drivers/net/bnx2x_link.c +--- a/drivers/net/bnx2x_link.c Tue Jun 16 11:03:28 2009 +0100 ++++ b/drivers/net/bnx2x_link.c Tue Jun 16 13:15:30 2009 +0100 +@@ -20,28 +20,48 @@ + #include + #include + #include ++#ifdef __LINUX_MUTEX_H /* BNX2X_UPSTREAM */ + #include +- +-#include "bnx2x_reg.h" +-#include "bnx2x_fw_defs.h" +-#include "bnx2x_hsi.h" +-#include "bnx2x_link.h" ++#endif ++#include ++ + #include "bnx2x.h" + ++ ++#define E2_PHASE0 1 ++#define CHIP_IS_E2_NOT_PHASE0(_chip_id) (CHIP_IS_E2(bp) && \ ++ !(E2_PHASE0)) + /********************************************************/ +-#define SUPPORT_CL73 0 /* Currently no */ +-#define ETH_HLEN 14 ++#define ETH_HLEN 14 + #define ETH_OVREHEAD (ETH_HLEN + 8)/* 8 for CRC + VLAN*/ +-#define ETH_MIN_PACKET_SIZE 60 +-#define ETH_MAX_PACKET_SIZE 1500 ++#define ETH_MIN_PACKET_SIZE 60 ++#define ETH_MAX_PACKET_SIZE 1500 + #define ETH_MAX_JUMBO_PACKET_SIZE 9600 +-#define MDIO_ACCESS_TIMEOUT 1000 ++#define MDIO_ACCESS_TIMEOUT 1000 + #define BMAC_CONTROL_RX_ENABLE 2 + ++struct bnx2x_image_header { ++ u32 magic; ++ #define FILE_MAGIC 0x669955aa ++ u32 version; ++ #define FORMAT_VERSION_2 0x2 ++ u32 type; ++ #define IMAGE_HDR_TYPE_BCM8073 0x33373038 ++ #define IMAGE_HDR_TYPE_BCM8726 0x36323738 ++ #define IMAGE_HDR_TYPE_BCM8727 0x37323738 ++ #define IMAGE_HDR_TYPE_BCM8481 0x31383438 ++ #define IMAGE_HDR_TYPE_SFX7101 0x68706673 ++ u32 image_info; ++ u32 byte_cnt; ++}; + /***********************************************************/ +-/* Shortcut definitions */ ++/* Shortcut definitions */ + /***********************************************************/ + ++#define NIG_LATCH_BC_ENABLE_MI_INT 0 ++ ++#define NIG_STATUS_EMAC0_MI_INT \ ++ NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_EMAC0_MISC_MI_INT + #define NIG_STATUS_XGXS0_LINK10G \ + NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_XGXS0_LINK10G + #define NIG_STATUS_XGXS0_LINK_STATUS \ +@@ -79,11 +99,11 @@ + #define AUTONEG_CL37 SHARED_HW_CFG_AN_ENABLE_CL37 + #define AUTONEG_CL73 SHARED_HW_CFG_AN_ENABLE_CL73 + #define AUTONEG_BAM SHARED_HW_CFG_AN_ENABLE_BAM +-#define AUTONEG_PARALLEL \ ++#define AUTONEG_PARALLEL \ + SHARED_HW_CFG_AN_ENABLE_PARALLEL_DETECTION + #define AUTONEG_SGMII_FIBER_AUTODET \ + SHARED_HW_CFG_AN_EN_SGMII_FIBER_AUTO_DETECT +-#define AUTONEG_REMOTE_PHY SHARED_HW_CFG_AN_ENABLE_REMOTE_PHY ++#define AUTONEG_REMOTE_PHY SHARED_HW_CFG_AN_ENABLE_REMOTE_PHY + + #define GP_STATUS_PAUSE_RSOLUTION_TXSIDE \ + MDIO_GP_STATUS_TOP_AN_STATUS1_PAUSE_RSOLUTION_TXSIDE +@@ -91,10 +111,10 @@ + MDIO_GP_STATUS_TOP_AN_STATUS1_PAUSE_RSOLUTION_RXSIDE + #define GP_STATUS_SPEED_MASK \ + MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_MASK +-#define GP_STATUS_10M MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_10M +-#define GP_STATUS_100M MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_100M ++#define GP_STATUS_10M MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_10M ++#define GP_STATUS_100M MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_100M + #define GP_STATUS_1G MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_1G +-#define GP_STATUS_2_5G MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_2_5G ++#define GP_STATUS_2_5G MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_2_5G + #define GP_STATUS_5G MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_5G + #define GP_STATUS_6G MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_6G + #define GP_STATUS_10G_HIG \ +@@ -104,17 +124,17 @@ + #define GP_STATUS_12G_HIG \ + MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_12G_HIG + #define GP_STATUS_12_5G MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_12_5G +-#define GP_STATUS_13G MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_13G +-#define GP_STATUS_15G MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_15G +-#define GP_STATUS_16G MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_16G ++#define GP_STATUS_13G MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_13G ++#define GP_STATUS_15G MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_15G ++#define GP_STATUS_16G MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_16G + #define GP_STATUS_1G_KX MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_1G_KX + #define GP_STATUS_10G_KX4 \ + MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_10G_KX4 + +-#define LINK_10THD LINK_STATUS_SPEED_AND_DUPLEX_10THD +-#define LINK_10TFD LINK_STATUS_SPEED_AND_DUPLEX_10TFD ++#define LINK_10THD LINK_STATUS_SPEED_AND_DUPLEX_10THD ++#define LINK_10TFD LINK_STATUS_SPEED_AND_DUPLEX_10TFD + #define LINK_100TXHD LINK_STATUS_SPEED_AND_DUPLEX_100TXHD +-#define LINK_100T4 LINK_STATUS_SPEED_AND_DUPLEX_100T4 ++#define LINK_100T4 LINK_STATUS_SPEED_AND_DUPLEX_100T4 + #define LINK_100TXFD LINK_STATUS_SPEED_AND_DUPLEX_100TXFD + #define LINK_1000THD LINK_STATUS_SPEED_AND_DUPLEX_1000THD + #define LINK_1000TFD LINK_STATUS_SPEED_AND_DUPLEX_1000TFD +@@ -122,25 +142,78 @@ + #define LINK_2500THD LINK_STATUS_SPEED_AND_DUPLEX_2500THD + #define LINK_2500TFD LINK_STATUS_SPEED_AND_DUPLEX_2500TFD + #define LINK_2500XFD LINK_STATUS_SPEED_AND_DUPLEX_2500XFD +-#define LINK_10GTFD LINK_STATUS_SPEED_AND_DUPLEX_10GTFD +-#define LINK_10GXFD LINK_STATUS_SPEED_AND_DUPLEX_10GXFD +-#define LINK_12GTFD LINK_STATUS_SPEED_AND_DUPLEX_12GTFD +-#define LINK_12GXFD LINK_STATUS_SPEED_AND_DUPLEX_12GXFD +-#define LINK_12_5GTFD LINK_STATUS_SPEED_AND_DUPLEX_12_5GTFD +-#define LINK_12_5GXFD LINK_STATUS_SPEED_AND_DUPLEX_12_5GXFD +-#define LINK_13GTFD LINK_STATUS_SPEED_AND_DUPLEX_13GTFD +-#define LINK_13GXFD LINK_STATUS_SPEED_AND_DUPLEX_13GXFD +-#define LINK_15GTFD LINK_STATUS_SPEED_AND_DUPLEX_15GTFD +-#define LINK_15GXFD LINK_STATUS_SPEED_AND_DUPLEX_15GXFD +-#define LINK_16GTFD LINK_STATUS_SPEED_AND_DUPLEX_16GTFD +-#define LINK_16GXFD LINK_STATUS_SPEED_AND_DUPLEX_16GXFD +- +-#define PHY_XGXS_FLAG 0x1 +-#define PHY_SGMII_FLAG 0x2 +-#define PHY_SERDES_FLAG 0x4 +- ++#define LINK_10GTFD LINK_STATUS_SPEED_AND_DUPLEX_10GTFD ++#define LINK_10GXFD LINK_STATUS_SPEED_AND_DUPLEX_10GXFD ++#define LINK_12GTFD LINK_STATUS_SPEED_AND_DUPLEX_12GTFD ++#define LINK_12GXFD LINK_STATUS_SPEED_AND_DUPLEX_12GXFD ++#define LINK_12_5GTFD LINK_STATUS_SPEED_AND_DUPLEX_12_5GTFD ++#define LINK_12_5GXFD LINK_STATUS_SPEED_AND_DUPLEX_12_5GXFD ++#define LINK_13GTFD LINK_STATUS_SPEED_AND_DUPLEX_13GTFD ++#define LINK_13GXFD LINK_STATUS_SPEED_AND_DUPLEX_13GXFD ++#define LINK_15GTFD LINK_STATUS_SPEED_AND_DUPLEX_15GTFD ++#define LINK_15GXFD LINK_STATUS_SPEED_AND_DUPLEX_15GXFD ++#define LINK_16GTFD LINK_STATUS_SPEED_AND_DUPLEX_16GTFD ++#define LINK_16GXFD LINK_STATUS_SPEED_AND_DUPLEX_16GXFD ++ ++#define PHY_XGXS_FLAG 0x1 ++#define PHY_SGMII_FLAG 0x2 ++#define PHY_SERDES_FLAG 0x4 ++ ++/* */ ++#define SFP_EEPROM_CON_TYPE_ADDR 0x2 ++ #define SFP_EEPROM_CON_TYPE_VAL_LC 0x7 ++ #define SFP_EEPROM_CON_TYPE_VAL_COPPER 0x21 ++ ++#define SFP_EEPROM_FC_TX_TECH_ADDR 0x8 ++ #define SFP_EEPROM_FC_TX_TECH_BITMASK_COPPER_PASSIVE 0x4 ++ #define SFP_EEPROM_FC_TX_TECH_BITMASK_COPPER_ACTIVE 0x8 ++ ++#define SFP_EEPROM_OPTIONS_ADDR 0x40 ++ #define SFP_EEPROM_OPTIONS_LINEAR_RX_OUT_MASK 0x1 ++#define SFP_EEPROM_OPTIONS_SIZE 2 ++ ++#define SFP_MODULE_TYPE_UNKNOWN 0x0 ++#define SFP_MODULE_TYPE_LC 0x1 ++#define SFP_MODULE_TYPE_ACTIVE_COPPER_CABLE 0x2 ++#define SFP_MODULE_TYPE_PASSIVE_COPPER_CABLE 0x3 ++ ++#define SFP_LIMITING_MODE_VALUE 0x0044 + /**********************************************************/ +-/* INTERFACE */ ++/* 8073 Download definitions */ ++/**********************************************************/ ++/* spi Parameters.*/ ++#define SPI_CTRL_1_L 0xC000 ++#define SPI_CTRL_1_H 0xC002 ++#define SPI_CTRL_2_L 0xC400 ++#define SPI_CTRL_2_H 0xC402 ++#define SPI_TXFIFO 0xD000 ++#define SPI_RXFIFO 0xD400 ++ ++/* Input Command Messages.*/ ++#define WR_CPU_CTRL_REGS 0x11 /* Write CPU/SPI Control Regs, followed ++ by Count And CPU/SPI Controller Reg add/data pairs.*/ ++#define RD_CPU_CTRL_REGS 0xEE /* Read CPU/SPI Control Regs, followed ++by Count and CPU/SPI Controller Register Add.*/ ++#define WR_CPU_CTRL_FIFO 0x66 /* Write CPU/SPI Control Regs ++Continously, followed by Count and CPU/SPI Controller Reg addr and data's.*/ ++/* Output Command Messages.*/ ++#define DONE 0x4321 ++ ++/* SPI Controller Commands (known As messages).*/ ++#define MSGTYPE_HWR 0x40 ++#define MSGTYPE_HRD 0x80 ++#define WRSR_OPCODE 0x01 ++#define WR_OPCODE 0x02 ++#define RD_OPCODE 0x03 ++#define WRDI_OPCODE 0x04 ++#define RDSR_OPCODE 0x05 ++#define WREN_OPCODE 0x06 ++#define WR_BLOCK_SIZE 0x40 /* Maximum 64 Bytes Writes.*/ ++ ++#define BUF_SIZE_BCM 0x4000 /* Code Size is 16k bytes.*/ ++#define UPGRADE_TIMEOUT_BCM 1000 ++/**********************************************************/ ++/* INTERFACE */ + /**********************************************************/ + #define CL45_WR_OVER_CL22(_bp, _port, _phy_addr, _bank, _addr, _val) \ + bnx2x_cl45_write(_bp, _port, 0, _phy_addr, \ +@@ -154,13 +227,36 @@ + (_bank + (_addr & 0xf)), \ + _val) + +-static void bnx2x_set_phy_mdio(struct link_params *params) +-{ +- struct bnx2x *bp = params->bp; +- REG_WR(bp, NIG_REG_XGXS0_CTRL_MD_ST + +- params->port*0x18, 0); +- REG_WR(bp, NIG_REG_XGXS0_CTRL_MD_DEVAD + params->port*0x18, +- DEFAULT_PHY_DEV_ADDR); ++static void bnx2x_set_serdes_access(struct link_params *params) ++{ ++ struct bnx2x *bp = params->bp; ++ u32 emac_base = (params->port) ? GRCBASE_EMAC1 : GRCBASE_EMAC0; ++ ++ /* Set Clause 22 */ ++ REG_WR(bp, NIG_REG_SERDES0_CTRL_MD_ST + params->port*0x10, 1); ++ REG_WR(bp, emac_base + EMAC_REG_EMAC_MDIO_COMM, 0x245f8000); ++ udelay(500); ++ REG_WR(bp, emac_base + EMAC_REG_EMAC_MDIO_COMM, 0x245d000f); ++ udelay(500); ++ /* Set Clause 45 */ ++ REG_WR(bp, NIG_REG_SERDES0_CTRL_MD_ST + params->port*0x10, 0); ++} ++static void bnx2x_set_phy_mdio(struct link_params *params, u8 phy_flags) ++{ ++ struct bnx2x *bp = params->bp; ++ ++ if (phy_flags & PHY_XGXS_FLAG) { ++ REG_WR(bp, NIG_REG_XGXS0_CTRL_MD_ST + ++ params->port*0x18, 0); ++ REG_WR(bp, NIG_REG_XGXS0_CTRL_MD_DEVAD + params->port*0x18, ++ DEFAULT_PHY_DEV_ADDR); ++ } else { ++ bnx2x_set_serdes_access(params); ++ ++ REG_WR(bp, NIG_REG_SERDES0_CTRL_MD_DEVAD + ++ params->port*0x10, ++ DEFAULT_PHY_DEV_ADDR); ++ } + } + + static u32 bnx2x_bits_en(struct bnx2x *bp, u32 reg, u32 bits) +@@ -247,7 +343,6 @@ + } + /* for fpga */ + else +- + if (CHIP_REV_IS_FPGA(bp)) { + /* Use lane 1 (of lanes 0-3) */ + DP(NETIF_MSG_LINK, "bnx2x_emac_enable: Setting FPGA\n"); +@@ -277,8 +372,10 @@ + port*4, 0); + } + +- /* enable emac */ +- REG_WR(bp, NIG_REG_NIG_EMAC0_EN + port*4, 1); ++ bnx2x_bits_en(bp, emac_base + EMAC_REG_EMAC_RX_MODE, ++ EMAC_RX_MODE_RESET); ++ bnx2x_bits_en(bp, emac_base + EMAC_REG_EMAC_TX_MODE, ++ EMAC_TX_MODE_RESET); + + if (CHIP_REV_IS_SLOW(bp)) { + /* config GMII mode */ +@@ -289,7 +386,7 @@ + /* pause enable/disable */ + bnx2x_bits_dis(bp, emac_base + EMAC_REG_EMAC_RX_MODE, + EMAC_RX_MODE_FLOW_EN); +- if (vars->flow_ctrl & FLOW_CTRL_RX) ++ if (vars->flow_ctrl & BNX2X_FLOW_CTRL_RX) + bnx2x_bits_en(bp, emac_base + + EMAC_REG_EMAC_RX_MODE, + EMAC_RX_MODE_FLOW_EN); +@@ -297,7 +394,7 @@ + bnx2x_bits_dis(bp, emac_base + EMAC_REG_EMAC_TX_MODE, + (EMAC_TX_MODE_EXT_PAUSE_EN | + EMAC_TX_MODE_FLOW_EN)); +- if (vars->flow_ctrl & FLOW_CTRL_TX) ++ if (vars->flow_ctrl & BNX2X_FLOW_CTRL_TX) + bnx2x_bits_en(bp, emac_base + + EMAC_REG_EMAC_TX_MODE, + (EMAC_TX_MODE_EXT_PAUSE_EN | +@@ -336,7 +433,7 @@ + /* enable the NIG in/out to the emac */ + REG_WR(bp, NIG_REG_EMAC0_IN_EN + port*4, 0x1); + val = 0; +- if (vars->flow_ctrl & FLOW_CTRL_TX) ++ if (vars->flow_ctrl & BNX2X_FLOW_CTRL_TX) + val = 1; + + REG_WR(bp, NIG_REG_EMAC0_PAUSE_OUT_EN + port*4, val); +@@ -357,8 +454,7 @@ + } + + +- +-static u8 bnx2x_bmac_enable(struct link_params *params, struct link_vars *vars, ++static u8 bnx2x_bmac1_enable(struct link_params *params, struct link_vars *vars, + u8 is_lb) + { + struct bnx2x *bp = params->bp; +@@ -368,17 +464,7 @@ + u32 wb_data[2]; + u32 val; + +- DP(NETIF_MSG_LINK, "Enabling BigMAC\n"); +- /* reset and unreset the BigMac */ +- REG_WR(bp, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_2_CLEAR, +- (MISC_REGISTERS_RESET_REG_2_RST_BMAC0 << port)); +- msleep(1); +- +- REG_WR(bp, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_2_SET, +- (MISC_REGISTERS_RESET_REG_2_RST_BMAC0 << port)); +- +- /* enable access for bmac registers */ +- REG_WR(bp, NIG_REG_BMAC0_REGS_OUT_EN + port*4, 0x1); ++ DP(NETIF_MSG_LINK, "Enabling BigMAC1\n"); + + /* XGXS control */ + wb_data[0] = 0x3c; +@@ -399,7 +485,7 @@ + + /* tx control */ + val = 0xc0; +- if (vars->flow_ctrl & FLOW_CTRL_TX) ++ if (vars->flow_ctrl & BNX2X_FLOW_CTRL_TX) + val |= 0x800000; + wb_data[0] = val; + wb_data[1] = 0; +@@ -417,7 +503,6 @@ + REG_WR_DMAE(bp, bmac_addr + BIGMAC_REGISTER_BMAC_CONTROL, + wb_data, 2); + +- + /* set rx mtu */ + wb_data[0] = ETH_MAX_JUMBO_PACKET_SIZE + ETH_OVREHEAD; + wb_data[1] = 0; +@@ -426,7 +511,7 @@ + + /* rx control set to don't strip crc */ + val = 0x14; +- if (vars->flow_ctrl & FLOW_CTRL_RX) ++ if (vars->flow_ctrl & BNX2X_FLOW_CTRL_RX) + val |= 0x20; + wb_data[0] = val; + wb_data[1] = 0; +@@ -459,11 +544,143 @@ + wb_data, 2); + } + ++ ++ return 0; ++} ++ ++static u8 bnx2x_bmac2_enable(struct link_params *params, struct link_vars *vars, ++ u8 is_lb) ++{ ++ struct bnx2x *bp = params->bp; ++ u8 port = params->port; ++ u32 bmac_addr = port ? NIG_REG_INGRESS_BMAC1_MEM : ++ NIG_REG_INGRESS_BMAC0_MEM; ++ u32 wb_data[2]; ++ u32 val; ++ ++ DP(NETIF_MSG_LINK, "Enabling BigMAC2\n"); ++ ++ wb_data[0] = 0; ++ wb_data[1] = 0; ++ REG_WR_DMAE(bp, bmac_addr + BIGMAC2_REGISTER_BMAC_CONTROL, ++ wb_data, 2); ++ udelay(30); ++ ++ /* XGXS control: Reset phy HW, MDIO registers, PHY PLL and BMAC */ ++ wb_data[0] = 0x3c; ++ wb_data[1] = 0; ++ REG_WR_DMAE(bp, bmac_addr + ++ BIGMAC2_REGISTER_BMAC_XGXS_CONTROL, ++ wb_data, 2); ++ ++ udelay(30); ++ ++ /* tx MAC SA */ ++ wb_data[0] = ((params->mac_addr[2] << 24) | ++ (params->mac_addr[3] << 16) | ++ (params->mac_addr[4] << 8) | ++ params->mac_addr[5]); ++ wb_data[1] = ((params->mac_addr[0] << 8) | ++ params->mac_addr[1]); ++ REG_WR_DMAE(bp, bmac_addr + BIGMAC2_REGISTER_TX_SOURCE_ADDR, ++ wb_data, 2); ++ ++ udelay(30); ++ ++ /* Tx control */ ++ val = 0xc0; ++ if (vars->flow_ctrl & BNX2X_FLOW_CTRL_TX) ++ val |= 0x800000; ++ wb_data[0] = val; ++ wb_data[1] = 0; ++ REG_WR_DMAE(bp, bmac_addr + BIGMAC2_REGISTER_TX_CONTROL, ++ wb_data, 2); ++ ++ /* Configure SAFC */ ++ wb_data[0] = 0x1000200; ++ wb_data[1] = 0; ++ REG_WR_DMAE(bp, bmac_addr + BIGMAC2_REGISTER_RX_LLFC_MSG_FLDS, ++ wb_data, 2); ++ udelay(30); ++ ++ /* set rx mtu */ ++ wb_data[0] = ETH_MAX_JUMBO_PACKET_SIZE + ETH_OVREHEAD; ++ wb_data[1] = 0; ++ REG_WR_DMAE(bp, bmac_addr + BIGMAC2_REGISTER_RX_MAX_SIZE, ++ wb_data, 2); ++ udelay(30); ++ ++ /* set tx mtu */ ++ wb_data[0] = ETH_MAX_JUMBO_PACKET_SIZE + ETH_OVREHEAD; ++ wb_data[1] = 0; ++ REG_WR_DMAE(bp, bmac_addr + BIGMAC2_REGISTER_TX_MAX_SIZE, ++ wb_data, 2); ++ udelay(30); ++ ++ /* Set rx control: Strip CRC and enable BigMAC to relay ++ control packets to the system as well*/ ++ val = 0x54; ++ if (vars->flow_ctrl & BNX2X_FLOW_CTRL_RX) ++ val |= 0x20; ++ wb_data[0] = val; ++ wb_data[1] = 0; ++ REG_WR_DMAE(bp, bmac_addr + BIGMAC2_REGISTER_RX_CONTROL, ++ wb_data, 2); ++ udelay(30); ++ ++ if (params->feature_config_flags & FEATURE_CONFIG_PFC_ENABLED) { ++ wb_data[0] = 0xb; /* Enable RFC RX & TX and set 8 COS */ ++ wb_data[1] = 0; ++ REG_WR_DMAE(bp, bmac_addr + BIGMAC2_REGISTER_PFC_CONTROL, ++ wb_data, 2); ++ } ++ ++ /* mac control */ ++ val = 0x3; /* Enable RX and TX */ ++ if (is_lb) { ++ val |= 0x4; /* Local loopback */ ++ DP(NETIF_MSG_LINK, "enable bmac loopback\n"); ++ } ++ /* When PFC enabled, Pass pause frames towards the NIG. */ ++ if (params->feature_config_flags & FEATURE_CONFIG_PFC_ENABLED) ++ val |= (1<<6); ++ ++ wb_data[0] = val; ++ wb_data[1] = 0; ++ REG_WR_DMAE(bp, bmac_addr + BIGMAC2_REGISTER_BMAC_CONTROL, ++ wb_data, 2); ++ ++ return 0; ++} ++ ++static u8 bnx2x_bmac_enable(struct link_params *params, struct link_vars *vars, ++ u8 is_lb) ++{ ++ u8 rc, port = params->port; ++ struct bnx2x *bp = params->bp; ++ u32 val; ++ /* reset and unreset the BigMac */ ++ REG_WR(bp, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_2_CLEAR, ++ (MISC_REGISTERS_RESET_REG_2_RST_BMAC0 << port)); ++ msleep(1); ++ ++ REG_WR(bp, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_2_SET, ++ (MISC_REGISTERS_RESET_REG_2_RST_BMAC0 << port)); ++ ++ /* enable access for bmac registers */ ++ REG_WR(bp, NIG_REG_BMAC0_REGS_OUT_EN + port*4, 0x1); ++ ++ /* Enable BMAC according to BMAC type*/ ++ if (CHIP_IS_E2_NOT_PHASE0(params->chip_id)) ++ rc = bnx2x_bmac2_enable(params, vars, is_lb); ++ else ++ rc = bnx2x_bmac1_enable(params, vars, is_lb); ++ + REG_WR(bp, NIG_REG_XGXS_SERDES0_MODE_SEL + port*4, 0x1); + REG_WR(bp, NIG_REG_XGXS_LANE_SEL_P0 + port*4, 0x0); + REG_WR(bp, NIG_REG_EGRESS_EMAC0_PORT + port*4, 0x0); + val = 0; +- if (vars->flow_ctrl & FLOW_CTRL_TX) ++ if (vars->flow_ctrl & BNX2X_FLOW_CTRL_TX) + val = 1; + REG_WR(bp, NIG_REG_BMAC0_PAUSE_OUT_EN + port*4, val); + REG_WR(bp, NIG_REG_EGRESS_EMAC0_OUT_EN + port*4, 0x0); +@@ -473,7 +690,7 @@ + REG_WR(bp, NIG_REG_BMAC0_OUT_EN + port*4, 0x1); + + vars->mac_type = MAC_TYPE_BMAC; +- return 0; ++ return rc; + } + + static void bnx2x_phy_deassert(struct link_params *params, u8 phy_flags) +@@ -498,11 +715,11 @@ + udelay(500); + REG_WR(bp, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_3_SET, + val); +- bnx2x_set_phy_mdio(params); ++ bnx2x_set_phy_mdio(params, phy_flags); + } + + void bnx2x_link_status_update(struct link_params *params, +- struct link_vars *vars) ++ struct link_vars *vars) + { + struct bnx2x *bp = params->bp; + u8 link_10g; +@@ -583,14 +800,14 @@ + } + + if (vars->link_status & LINK_STATUS_TX_FLOW_CONTROL_ENABLED) +- vars->flow_ctrl |= FLOW_CTRL_TX; +- else +- vars->flow_ctrl &= ~FLOW_CTRL_TX; ++ vars->flow_ctrl |= BNX2X_FLOW_CTRL_TX; ++ else ++ vars->flow_ctrl &= ~BNX2X_FLOW_CTRL_TX; + + if (vars->link_status & LINK_STATUS_RX_FLOW_CONTROL_ENABLED) +- vars->flow_ctrl |= FLOW_CTRL_RX; +- else +- vars->flow_ctrl &= ~FLOW_CTRL_RX; ++ vars->flow_ctrl |= BNX2X_FLOW_CTRL_RX; ++ else ++ vars->flow_ctrl &= ~BNX2X_FLOW_CTRL_RX; + + if (vars->phy_flags & PHY_XGXS_FLAG) { + if (vars->line_speed && +@@ -621,7 +838,7 @@ + + vars->line_speed = 0; + vars->duplex = DUPLEX_FULL; +- vars->flow_ctrl = FLOW_CTRL_NONE; ++ vars->flow_ctrl = BNX2X_FLOW_CTRL_NONE; + + /* indicate no mac active */ + vars->mac_type = MAC_TYPE_NONE; +@@ -636,31 +853,45 @@ + static void bnx2x_update_mng(struct link_params *params, u32 link_status) + { + struct bnx2x *bp = params->bp; ++ + REG_WR(bp, params->shmem_base + + offsetof(struct shmem_region, + port_mb[params->port].link_status), + link_status); + } + +-static void bnx2x_bmac_rx_disable(struct bnx2x *bp, u8 port) ++static void bnx2x_bmac_rx_disable(struct bnx2x *bp, u32 chip_id, u8 port) + { + u32 bmac_addr = port ? NIG_REG_INGRESS_BMAC1_MEM : +- NIG_REG_INGRESS_BMAC0_MEM; ++ NIG_REG_INGRESS_BMAC0_MEM; + u32 wb_data[2]; +- u32 nig_bmac_enable = REG_RD(bp, NIG_REG_BMAC0_REGS_OUT_EN + port*4); ++ u32 nig_bmac_enable = REG_RD(bp, NIG_REG_BMAC0_REGS_OUT_EN + ++ port*4); + + /* Only if the bmac is out of reset */ + if (REG_RD(bp, MISC_REG_RESET_REG_2) & + (MISC_REGISTERS_RESET_REG_2_RST_BMAC0 << port) && + nig_bmac_enable) { + +- /* Clear Rx Enable bit in BMAC_CONTROL register */ +- REG_RD_DMAE(bp, bmac_addr + BIGMAC_REGISTER_BMAC_CONTROL, +- wb_data, 2); +- wb_data[0] &= ~BMAC_CONTROL_RX_ENABLE; +- REG_WR_DMAE(bp, bmac_addr + BIGMAC_REGISTER_BMAC_CONTROL, +- wb_data, 2); +- ++ if (CHIP_IS_E2_NOT_PHASE0(chip_id)) { ++ /* Clear Rx Enable bit in BMAC_CONTROL register */ ++ REG_RD_DMAE(bp, bmac_addr + ++ BIGMAC2_REGISTER_BMAC_CONTROL, ++ wb_data, 2); ++ wb_data[0] &= ~BMAC_CONTROL_RX_ENABLE; ++ REG_WR_DMAE(bp, bmac_addr + ++ BIGMAC2_REGISTER_BMAC_CONTROL, ++ wb_data, 2); ++ } else { ++ /* Clear Rx Enable bit in BMAC_CONTROL register */ ++ REG_RD_DMAE(bp, bmac_addr + ++ BIGMAC_REGISTER_BMAC_CONTROL, ++ wb_data, 2); ++ wb_data[0] &= ~BMAC_CONTROL_RX_ENABLE; ++ REG_WR_DMAE(bp, bmac_addr + ++ BIGMAC_REGISTER_BMAC_CONTROL, ++ wb_data, 2); ++ } + msleep(1); + } + } +@@ -694,7 +925,7 @@ + return -EINVAL; + } + +- if (flow_ctrl & FLOW_CTRL_RX || ++ if (flow_ctrl & BNX2X_FLOW_CTRL_RX || + line_speed == SPEED_10 || + line_speed == SPEED_100 || + line_speed == SPEED_1000 || +@@ -732,7 +963,6 @@ + DP(NETIF_MSG_LINK, "Invalid line_speed 0x%x\n", + line_speed); + return -EINVAL; +- break; + } + } + REG_WR(bp, PBF_REG_P0_INIT_CRD + port*4, init_crd); +@@ -749,12 +979,19 @@ + return 0; + } + +-static u32 bnx2x_get_emac_base(u32 ext_phy_type, u8 port) ++static u32 bnx2x_get_emac_base(struct bnx2x *bp, u32 ext_phy_type, u8 port) + { + u32 emac_base; ++ + switch (ext_phy_type) { + case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8072: +- emac_base = GRCBASE_EMAC0; ++ case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8726: ++ case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8727: ++ /* All MDC/MDIO is directed through single EMAC */ ++ if (REG_RD(bp, NIG_REG_PORT_SWAP)) ++ emac_base = GRCBASE_EMAC0; ++ else ++ emac_base = GRCBASE_EMAC1; + break; + case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073: + emac_base = (port) ? GRCBASE_EMAC0 : GRCBASE_EMAC1; +@@ -772,11 +1009,12 @@ + { + u32 tmp, saved_mode; + u8 i, rc = 0; +- u32 mdio_ctrl = bnx2x_get_emac_base(ext_phy_type, port); ++ u32 mdio_ctrl = bnx2x_get_emac_base(bp, ext_phy_type, port); + + /* set clause 45 mode, slow down the MDIO clock to 2.5MHz + * (a value of 49==0x31) and make sure that the AUTO poll is off + */ ++ + saved_mode = REG_RD(bp, mdio_ctrl + EMAC_REG_EMAC_MDIO_MODE); + tmp = saved_mode & ~(EMAC_MDIO_MODE_AUTO_POLL | + EMAC_MDIO_MODE_CLOCK_CNT); +@@ -841,15 +1079,16 @@ + u16 i; + u8 rc = 0; + +- u32 mdio_ctrl = bnx2x_get_emac_base(ext_phy_type, port); ++ u32 mdio_ctrl = bnx2x_get_emac_base(bp, ext_phy_type, port); + /* set clause 45 mode, slow down the MDIO clock to 2.5MHz + * (a value of 49==0x31) and make sure that the AUTO poll is off + */ ++ + saved_mode = REG_RD(bp, mdio_ctrl + EMAC_REG_EMAC_MDIO_MODE); + val = saved_mode & ((EMAC_MDIO_MODE_AUTO_POLL | + EMAC_MDIO_MODE_CLOCK_CNT)); + val |= (EMAC_MDIO_MODE_CLAUSE_45 | +- (49 << EMAC_MDIO_MODE_CLOCK_CNT_BITSHIFT)); ++ (49L << EMAC_MDIO_MODE_CLOCK_CNT_BITSHIFT)); + REG_WR(bp, mdio_ctrl + EMAC_REG_EMAC_MDIO_MODE, val); + REG_RD(bp, mdio_ctrl + EMAC_REG_EMAC_MDIO_MODE); + udelay(40); +@@ -907,7 +1146,7 @@ + } + + static void bnx2x_set_aer_mmd(struct link_params *params, +- struct link_vars *vars) ++ struct link_vars *vars) + { + struct bnx2x *bp = params->bp; + u32 ser_lane; +@@ -966,6 +1205,8 @@ + MDIO_COMBO_IEEE0_MII_CONTROL, + (mii_control | + MDIO_COMBO_IEEO_MII_CONTROL_RESET)); ++ if (params->switch_cfg == SWITCH_CFG_1G) ++ bnx2x_set_serdes_access(params); + + /* wait for the reset to self clear */ + for (i = 0; i < MDIO_ACCESS_TIMEOUT; i++) { +@@ -1037,7 +1278,7 @@ + } + + static void bnx2x_set_parallel_detection(struct link_params *params, +- u8 phy_flags) ++ u8 phy_flags) + { + struct bnx2x *bp = params->bp; + u16 control2; +@@ -1094,7 +1335,8 @@ + } + + static void bnx2x_set_autoneg(struct link_params *params, +- struct link_vars *vars) ++ struct link_vars *vars, ++ u8 enable_cl73) + { + struct bnx2x *bp = params->bp; + u16 reg_val; +@@ -1156,18 +1398,27 @@ + MDIO_BAM_NEXT_PAGE_MP5_NEXT_PAGE_CTRL, + reg_val); + +- /* Enable Clause 73 Aneg */ +- if ((vars->line_speed == SPEED_AUTO_NEG) && +- (SUPPORT_CL73)) { +- /* Enable BAM Station Manager */ +- +- CL45_WR_OVER_CL22(bp, params->port, ++ if (enable_cl73) { ++ ++ /* Enable BAM Station Manager*/ ++ CL45_RD_OVER_CL22(bp, params->port, + params->phy_addr, + MDIO_REG_BANK_CL73_USERB0, +- MDIO_CL73_USERB0_CL73_BAM_CTRL1, +- (MDIO_CL73_USERB0_CL73_BAM_CTRL1_BAM_EN | ++ 0x10, ++ ®_val); ++ CL45_WR_OVER_CL22(bp, params->port, ++ params->phy_addr, ++ MDIO_REG_BANK_CL73_USERB0, ++ 0x10, ++ reg_val | 0x2); ++ ++ CL45_WR_OVER_CL22(bp, params->port, ++ params->phy_addr, ++ MDIO_REG_BANK_CL73_USERB0, ++ MDIO_CL73_USERB0_CL73_BAM_CTRL1, ++ MDIO_CL73_USERB0_CL73_BAM_CTRL1_BAM_EN | + MDIO_CL73_USERB0_CL73_BAM_CTRL1_BAM_STATION_MNGR_EN | +- MDIO_CL73_USERB0_CL73_BAM_CTRL1_BAM_NP_AFTER_BP_EN)); ++ MDIO_CL73_USERB0_CL73_BAM_CTRL1_BAM_NP_AFTER_BP_EN); + + /* Merge CL73 and CL37 aneg resolution */ + CL45_RD_OVER_CL22(bp, params->port, +@@ -1176,42 +1427,26 @@ + MDIO_CL73_USERB0_CL73_BAM_CTRL3, + ®_val); + +- CL45_WR_OVER_CL22(bp, params->port, +- params->phy_addr, +- MDIO_REG_BANK_CL73_USERB0, +- MDIO_CL73_USERB0_CL73_BAM_CTRL3, +- (reg_val | +- MDIO_CL73_USERB0_CL73_BAM_CTRL3_USE_CL73_HCD_MR)); + + /* Set the CL73 AN speed */ +- + CL45_RD_OVER_CL22(bp, params->port, + params->phy_addr, + MDIO_REG_BANK_CL73_IEEEB1, +- MDIO_CL73_IEEEB1_AN_ADV2, ®_val); +- /* In the SerDes we support only the 1G. +- In the XGXS we support the 10G KX4 +- but we currently do not support the KR */ +- if (vars->phy_flags & PHY_XGXS_FLAG) { +- DP(NETIF_MSG_LINK, "XGXS\n"); +- /* 10G KX4 */ +- reg_val |= MDIO_CL73_IEEEB1_AN_ADV2_ADVR_10G_KX4; +- } else { +- DP(NETIF_MSG_LINK, "SerDes\n"); +- /* 1000M KX */ +- reg_val |= MDIO_CL73_IEEEB1_AN_ADV2_ADVR_1000M_KX; +- } +- CL45_WR_OVER_CL22(bp, params->port, +- params->phy_addr, +- MDIO_REG_BANK_CL73_IEEEB1, +- MDIO_CL73_IEEEB1_AN_ADV2, reg_val); ++ MDIO_CL73_IEEEB1_AN_ADV2, ++ ®_val); ++ ++ CL45_WR_OVER_CL22(bp, params->port, ++ params->phy_addr, ++ MDIO_REG_BANK_CL73_IEEEB1, ++ MDIO_CL73_IEEEB1_AN_ADV2, ++ reg_val | MDIO_CL73_IEEEB1_AN_ADV2_ADVR_10G_KX4); + + /* CL73 Autoneg Enabled */ + reg_val = MDIO_CL73_IEEEB0_CL73_AN_CONTROL_AN_EN; +- } else { +- /* CL73 Autoneg Disabled */ ++ ++ } else /* CL73 Autoneg Disabled */ + reg_val = 0; +- } ++ + CL45_WR_OVER_CL22(bp, params->port, + params->phy_addr, + MDIO_REG_BANK_CL73_IEEEB0, +@@ -1296,15 +1531,15 @@ + MDIO_OVER_1G_UP3, 0); + } + +-static void bnx2x_calc_ieee_aneg_adv(struct link_params *params, u32 *ieee_fc) ++static void bnx2x_calc_ieee_aneg_adv(struct link_params *params, u16 *ieee_fc) + { + *ieee_fc = MDIO_COMBO_IEEE0_AUTO_NEG_ADV_FULL_DUPLEX; + /* resolve pause mode and advertisement + * Please refer to Table 28B-3 of the 802.3ab-1999 spec */ + + switch (params->req_flow_ctrl) { +- case FLOW_CTRL_AUTO: +- if (params->req_fc_auto_adv == FLOW_CTRL_BOTH) { ++ case BNX2X_FLOW_CTRL_AUTO: ++ if (params->req_fc_auto_adv == BNX2X_FLOW_CTRL_BOTH) { + *ieee_fc |= + MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_BOTH; + } else { +@@ -1312,17 +1547,17 @@ + MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_ASYMMETRIC; + } + break; +- case FLOW_CTRL_TX: ++ case BNX2X_FLOW_CTRL_TX: + *ieee_fc |= + MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_ASYMMETRIC; + break; + +- case FLOW_CTRL_RX: +- case FLOW_CTRL_BOTH: ++ case BNX2X_FLOW_CTRL_RX: ++ case BNX2X_FLOW_CTRL_BOTH: + *ieee_fc |= MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_BOTH; + break; + +- case FLOW_CTRL_NONE: ++ case BNX2X_FLOW_CTRL_NONE: + default: + *ieee_fc |= MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_NONE; + break; +@@ -1330,7 +1565,7 @@ + } + + static void bnx2x_set_ieee_aneg_advertisment(struct link_params *params, +- u32 ieee_fc) ++ u16 ieee_fc) + { + struct bnx2x *bp = params->bp; + /* for AN, we are always publishing full duplex */ +@@ -1338,33 +1573,32 @@ + CL45_WR_OVER_CL22(bp, params->port, + params->phy_addr, + MDIO_REG_BANK_COMBO_IEEE0, +- MDIO_COMBO_IEEE0_AUTO_NEG_ADV, (u16)ieee_fc); +-} +- +-static void bnx2x_restart_autoneg(struct link_params *params) +-{ +- struct bnx2x *bp = params->bp; ++ MDIO_COMBO_IEEE0_AUTO_NEG_ADV, ieee_fc); ++} ++ ++static void bnx2x_restart_autoneg(struct link_params *params, u8 enable_cl73) ++{ ++ struct bnx2x *bp = params->bp; ++ u16 mii_control; ++ + DP(NETIF_MSG_LINK, "bnx2x_restart_autoneg\n"); +- if (SUPPORT_CL73) { +- /* enable and restart clause 73 aneg */ +- u16 an_ctrl; +- ++ /* Enable and restart BAM/CL37 aneg */ ++ ++ if (enable_cl73) { + CL45_RD_OVER_CL22(bp, params->port, + params->phy_addr, + MDIO_REG_BANK_CL73_IEEEB0, + MDIO_CL73_IEEEB0_CL73_AN_CONTROL, +- &an_ctrl); +- CL45_WR_OVER_CL22(bp, params->port, +- params->phy_addr, ++ &mii_control); ++ ++ CL45_WR_OVER_CL22(bp, params->port, ++ params->phy_addr, + MDIO_REG_BANK_CL73_IEEEB0, + MDIO_CL73_IEEEB0_CL73_AN_CONTROL, +- (an_ctrl | ++ (mii_control | + MDIO_CL73_IEEEB0_CL73_AN_CONTROL_AN_EN | + MDIO_CL73_IEEEB0_CL73_AN_CONTROL_RESTART_AN)); +- +- } else { +- /* Enable and restart BAM/CL37 aneg */ +- u16 mii_control; ++ } else { + + CL45_RD_OVER_CL22(bp, params->port, + params->phy_addr, +@@ -1379,8 +1613,8 @@ + MDIO_REG_BANK_COMBO_IEEE0, + MDIO_COMBO_IEEE0_MII_CONTROL, + (mii_control | +- MDIO_COMBO_IEEO_MII_CONTROL_AN_EN | +- MDIO_COMBO_IEEO_MII_CONTROL_RESTART_AN)); ++ MDIO_COMBO_IEEO_MII_CONTROL_AN_EN | ++ MDIO_COMBO_IEEO_MII_CONTROL_RESTART_AN)); + } + } + +@@ -1453,7 +1687,7 @@ + + } else { /* AN mode */ + /* enable and restart AN */ +- bnx2x_restart_autoneg(params); ++ bnx2x_restart_autoneg(params, 0); + } + } + +@@ -1466,18 +1700,18 @@ + { /* LD LP */ + switch (pause_result) { /* ASYM P ASYM P */ + case 0xb: /* 1 0 1 1 */ +- vars->flow_ctrl = FLOW_CTRL_TX; ++ vars->flow_ctrl = BNX2X_FLOW_CTRL_TX; + break; + + case 0xe: /* 1 1 1 0 */ +- vars->flow_ctrl = FLOW_CTRL_RX; ++ vars->flow_ctrl = BNX2X_FLOW_CTRL_RX; + break; + + case 0x5: /* 0 1 0 1 */ + case 0x7: /* 0 1 1 1 */ + case 0xd: /* 1 1 0 1 */ + case 0xf: /* 1 1 1 1 */ +- vars->flow_ctrl = FLOW_CTRL_BOTH; ++ vars->flow_ctrl = BNX2X_FLOW_CTRL_BOTH; + break; + + default: +@@ -1490,17 +1724,14 @@ + { + struct bnx2x *bp = params->bp; + u8 ext_phy_addr; +- u16 ld_pause; /* local */ +- u16 lp_pause; /* link partner */ ++ u16 ld_pause; /* local */ ++ u16 lp_pause; /* link partner */ + u16 an_complete; /* AN complete */ + u16 pause_result; + u8 ret = 0; + u32 ext_phy_type; + u8 port = params->port; +- ext_phy_addr = ((params->ext_phy_config & +- PORT_HW_CFG_XGXS_EXT_PHY_ADDR_MASK) >> +- PORT_HW_CFG_XGXS_EXT_PHY_ADDR_SHIFT); +- ++ ext_phy_addr = XGXS_EXT_PHY_ADDR(params->ext_phy_config); + ext_phy_type = XGXS_EXT_PHY_TYPE(params->ext_phy_config); + /* read twice */ + +@@ -1534,7 +1765,7 @@ + DP(NETIF_MSG_LINK, "Ext PHY pause result 0x%x \n", + pause_result); + bnx2x_pause_resolve(vars, pause_result); +- if (vars->flow_ctrl == FLOW_CTRL_NONE && ++ if (vars->flow_ctrl == BNX2X_FLOW_CTRL_NONE && + ext_phy_type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073) { + bnx2x_cl45_read(bp, port, + ext_phy_type, +@@ -1570,10 +1801,10 @@ + u16 lp_pause; /* link partner */ + u16 pause_result; + +- vars->flow_ctrl = FLOW_CTRL_NONE; ++ vars->flow_ctrl = BNX2X_FLOW_CTRL_NONE; + + /* resolve from gp_status in case of AN complete and not sgmii */ +- if ((params->req_flow_ctrl == FLOW_CTRL_AUTO) && ++ if ((params->req_flow_ctrl == BNX2X_FLOW_CTRL_AUTO) && + (gp_status & MDIO_AN_CL73_OR_37_COMPLETE) && + (!(vars->phy_flags & PHY_SGMII_FLAG)) && + (XGXS_EXT_PHY_TYPE(params->ext_phy_config) == +@@ -1594,11 +1825,11 @@ + MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_MASK)>>7; + DP(NETIF_MSG_LINK, "pause_result 0x%x\n", pause_result); + bnx2x_pause_resolve(vars, pause_result); +- } else if ((params->req_flow_ctrl == FLOW_CTRL_AUTO) && ++ } else if ((params->req_flow_ctrl == BNX2X_FLOW_CTRL_AUTO) && + (bnx2x_ext_phy_resove_fc(params, vars))) { + return; + } else { +- if (params->req_flow_ctrl == FLOW_CTRL_AUTO) ++ if (params->req_flow_ctrl == BNX2X_FLOW_CTRL_AUTO) + vars->flow_ctrl = params->req_fc_auto_adv; + else + vars->flow_ctrl = params->req_flow_ctrl; +@@ -1608,8 +1839,8 @@ + + + static u8 bnx2x_link_settings_status(struct link_params *params, +- struct link_vars *vars, +- u32 gp_status) ++ struct link_vars *vars, ++ u32 gp_status) + { + struct bnx2x *bp = params->bp; + u16 new_line_speed; +@@ -1670,7 +1901,7 @@ + "link speed unsupported gp_status 0x%x\n", + gp_status); + return -EINVAL; +- break; ++ + case GP_STATUS_10G_KX4: + case GP_STATUS_10G_HIG: + case GP_STATUS_10G_CX4: +@@ -1707,8 +1938,7 @@ + DP(NETIF_MSG_LINK, + "link speed unsupported gp_status 0x%x\n", + gp_status); +- return -EINVAL; +- break; ++ return -EINVAL; + } + + /* Upon link speed change set the NIG into drain mode. +@@ -1726,7 +1956,9 @@ + ((XGXS_EXT_PHY_TYPE(params->ext_phy_config) == + PORT_HW_CFG_XGXS_EXT_PHY_TYPE_DIRECT) || + (XGXS_EXT_PHY_TYPE(params->ext_phy_config) == +- PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8705))) { ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8705) || ++ (XGXS_EXT_PHY_TYPE(params->ext_phy_config) == ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8726))) { + vars->autoneg = AUTO_NEG_ENABLED; + + if (gp_status & MDIO_AN_CL73_OR_37_COMPLETE) { +@@ -1740,11 +1972,11 @@ + LINK_STATUS_PARALLEL_DETECTION_USED; + + } +- if (vars->flow_ctrl & FLOW_CTRL_TX) ++ if (vars->flow_ctrl & BNX2X_FLOW_CTRL_TX) + vars->link_status |= + LINK_STATUS_TX_FLOW_CONTROL_ENABLED; + +- if (vars->flow_ctrl & FLOW_CTRL_RX) ++ if (vars->flow_ctrl & BNX2X_FLOW_CTRL_RX) + vars->link_status |= + LINK_STATUS_RX_FLOW_CONTROL_ENABLED; + +@@ -1754,7 +1986,7 @@ + vars->phy_link_up = 0; + + vars->duplex = DUPLEX_FULL; +- vars->flow_ctrl = FLOW_CTRL_NONE; ++ vars->flow_ctrl = BNX2X_FLOW_CTRL_NONE; + vars->autoneg = AUTO_NEG_DISABLED; + vars->mac_type = MAC_TYPE_NONE; + } +@@ -1770,38 +2002,44 @@ + return rc; + } + +-static void bnx2x_set_sgmii_tx_driver(struct link_params *params) ++static void bnx2x_set_gmii_tx_driver(struct link_params *params) + { + struct bnx2x *bp = params->bp; + u16 lp_up2; + u16 tx_driver; ++ u16 bank; + + /* read precomp */ +- + CL45_RD_OVER_CL22(bp, params->port, + params->phy_addr, + MDIO_REG_BANK_OVER_1G, + MDIO_OVER_1G_LP_UP2, &lp_up2); +- +- CL45_RD_OVER_CL22(bp, params->port, +- params->phy_addr, +- MDIO_REG_BANK_TX0, +- MDIO_TX0_TX_DRIVER, &tx_driver); + + /* bits [10:7] at lp_up2, positioned at [15:12] */ + lp_up2 = (((lp_up2 & MDIO_OVER_1G_LP_UP2_PREEMPHASIS_MASK) >> + MDIO_OVER_1G_LP_UP2_PREEMPHASIS_SHIFT) << + MDIO_TX0_TX_DRIVER_PREEMPHASIS_SHIFT); + +- if ((lp_up2 != 0) && +- (lp_up2 != (tx_driver & MDIO_TX0_TX_DRIVER_PREEMPHASIS_MASK))) { ++ if (lp_up2 == 0) ++ return; ++ ++ for (bank = MDIO_REG_BANK_TX0; bank <= MDIO_REG_BANK_TX3; ++ bank += (MDIO_REG_BANK_TX1 - MDIO_REG_BANK_TX0)) { ++ CL45_RD_OVER_CL22(bp, params->port, ++ params->phy_addr, ++ bank, ++ MDIO_TX0_TX_DRIVER, &tx_driver); ++ + /* replace tx_driver bits [15:12] */ +- tx_driver &= ~MDIO_TX0_TX_DRIVER_PREEMPHASIS_MASK; +- tx_driver |= lp_up2; +- CL45_WR_OVER_CL22(bp, params->port, +- params->phy_addr, +- MDIO_REG_BANK_TX0, +- MDIO_TX0_TX_DRIVER, tx_driver); ++ if (lp_up2 != ++ (tx_driver & MDIO_TX0_TX_DRIVER_PREEMPHASIS_MASK)) { ++ tx_driver &= ~MDIO_TX0_TX_DRIVER_PREEMPHASIS_MASK; ++ tx_driver |= lp_up2; ++ CL45_WR_OVER_CL22(bp, params->port, ++ params->phy_addr, ++ bank, ++ MDIO_TX0_TX_DRIVER, tx_driver); ++ } + } + } + +@@ -1855,23 +2093,22 @@ + /*****************************************************************************/ + /* External Phy section */ + /*****************************************************************************/ +-static void bnx2x_hw_reset(struct bnx2x *bp, u8 port) ++void bnx2x_ext_phy_hw_reset(struct bnx2x *bp, u8 port) + { + bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_1, +- MISC_REGISTERS_GPIO_OUTPUT_LOW, port); ++ MISC_REGISTERS_GPIO_OUTPUT_LOW, port); + msleep(1); + bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_1, +- MISC_REGISTERS_GPIO_OUTPUT_HIGH, port); ++ MISC_REGISTERS_GPIO_OUTPUT_HIGH, port); + } + + static void bnx2x_ext_phy_reset(struct link_params *params, +- struct link_vars *vars) +-{ +- struct bnx2x *bp = params->bp; +- u32 ext_phy_type; +- u8 ext_phy_addr = ((params->ext_phy_config & +- PORT_HW_CFG_XGXS_EXT_PHY_ADDR_MASK) >> +- PORT_HW_CFG_XGXS_EXT_PHY_ADDR_SHIFT); ++ struct link_vars *vars) ++{ ++ struct bnx2x *bp = params->bp; ++ u32 ext_phy_type; ++ u8 ext_phy_addr = XGXS_EXT_PHY_ADDR(params->ext_phy_config); ++ + DP(NETIF_MSG_LINK, "Port %x: bnx2x_ext_phy_reset\n", params->port); + ext_phy_type = XGXS_EXT_PHY_TYPE(params->ext_phy_config); + /* The PHY reset is controled by GPIO 1 +@@ -1890,11 +2127,11 @@ + + /* Restore normal power mode*/ + bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_2, +- MISC_REGISTERS_GPIO_OUTPUT_HIGH, ++ MISC_REGISTERS_GPIO_OUTPUT_HIGH, + params->port); + + /* HW reset */ +- bnx2x_hw_reset(bp, params->port); ++ bnx2x_ext_phy_hw_reset(bp, params->port); + + bnx2x_cl45_write(bp, params->port, + ext_phy_type, +@@ -1902,14 +2139,38 @@ + MDIO_PMA_DEVAD, + MDIO_PMA_REG_CTRL, 0xa040); + break; ++ ++ case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8727: ++ break; ++ ++ case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8726: ++ ++ /* Restore normal power mode*/ ++ bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_2, ++ MISC_REGISTERS_GPIO_OUTPUT_HIGH, ++ params->port); ++ ++ bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_1, ++ MISC_REGISTERS_GPIO_OUTPUT_HIGH, ++ params->port); ++ ++ bnx2x_cl45_write(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_CTRL, ++ 1<<15); ++ break; ++ + case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8072: ++ DP(NETIF_MSG_LINK, "XGXS 8072\n"); ++ + /* Unset Low Power Mode and SW reset */ + /* Restore normal power mode*/ + bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_2, + MISC_REGISTERS_GPIO_OUTPUT_HIGH, + params->port); + +- DP(NETIF_MSG_LINK, "XGXS 8072\n"); + bnx2x_cl45_write(bp, params->port, + ext_phy_type, + ext_phy_addr, +@@ -1917,23 +2178,18 @@ + MDIO_PMA_REG_CTRL, + 1<<15); + break; ++ + case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073: +- { +- u16 emac_base; +- emac_base = (params->port) ? GRCBASE_EMAC0 : +- GRCBASE_EMAC1; ++ DP(NETIF_MSG_LINK, "XGXS 8073\n"); + + /* Restore normal power mode*/ + bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_2, +- MISC_REGISTERS_GPIO_OUTPUT_HIGH, ++ MISC_REGISTERS_GPIO_OUTPUT_HIGH, + params->port); + + bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_1, +- MISC_REGISTERS_GPIO_OUTPUT_HIGH, +- params->port); +- +- DP(NETIF_MSG_LINK, "XGXS 8073\n"); +- } ++ MISC_REGISTERS_GPIO_OUTPUT_HIGH, ++ params->port); + break; + + case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_SFX7101: +@@ -1941,21 +2197,36 @@ + + /* Restore normal power mode*/ + bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_2, +- MISC_REGISTERS_GPIO_OUTPUT_HIGH, ++ MISC_REGISTERS_GPIO_OUTPUT_HIGH, + params->port); + + /* HW reset */ +- bnx2x_hw_reset(bp, params->port); +- +- break; +- ++ bnx2x_ext_phy_hw_reset(bp, params->port); ++ break; ++ ++ case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481: ++ /* Restore normal power mode*/ ++ bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_2, ++ MISC_REGISTERS_GPIO_OUTPUT_HIGH, ++ params->port); ++ ++ /* HW reset */ ++ bnx2x_ext_phy_hw_reset(bp, params->port); ++ ++ bnx2x_cl45_write(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_CTRL, ++ 1<<15); ++ break; + case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_FAILURE: + DP(NETIF_MSG_LINK, "XGXS PHY Failure detected\n"); + break; + + default: + DP(NETIF_MSG_LINK, "BAD XGXS ext_phy_config 0x%x\n", +- params->ext_phy_config); ++ params->ext_phy_config); + break; + } + +@@ -1968,27 +2239,153 @@ + + case PORT_HW_CFG_SERDES_EXT_PHY_TYPE_BCM5482: + DP(NETIF_MSG_LINK, "SerDes 5482\n"); +- bnx2x_hw_reset(bp, params->port); +- break; +- +- default: +- DP(NETIF_MSG_LINK, +- "BAD SerDes ext_phy_config 0x%x\n", ++ bnx2x_ext_phy_hw_reset(bp, params->port); ++ break; ++ ++ default: ++ DP(NETIF_MSG_LINK, "BAD SerDes ext_phy_config 0x%x\n", + params->ext_phy_config); + break; + } + } + } + ++static void bnx2x_save_spirom_version(struct bnx2x *bp, u8 port, ++ u32 shmem_base, u32 spirom_ver) ++{ ++ DP(NETIF_MSG_LINK, "FW version 0x%x:0x%x\n", ++ (u16)(spirom_ver>>16), (u16)spirom_ver); ++ REG_WR(bp, shmem_base + ++ offsetof(struct shmem_region, ++ port_mb[port].ext_phy_fw_version), ++ spirom_ver); ++} ++ ++static void bnx2x_save_bcm_spirom_ver(struct bnx2x *bp, u8 port, ++ u32 ext_phy_type, u8 ext_phy_addr, ++ u32 shmem_base) ++{ ++ u16 fw_ver1, fw_ver2; ++ ++ bnx2x_cl45_read(bp, port, ext_phy_type, ext_phy_addr, MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_ROM_VER1, &fw_ver1); ++ bnx2x_cl45_read(bp, port, ext_phy_type, ext_phy_addr, MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_ROM_VER2, &fw_ver2); ++ bnx2x_save_spirom_version(bp, port, shmem_base, ++ (u32)(fw_ver1<<16 | fw_ver2)); ++} ++ ++ ++static void bnx2x_save_8481_spirom_version(struct bnx2x *bp, u8 port, ++ u8 ext_phy_addr, u32 shmem_base) ++{ ++ u16 val, fw_ver1, fw_ver2, cnt; ++ /* For the 32 bits registers in 8481, access via MDIO2ARM interface.*/ ++ /* (1) set register 0xc200_0014(SPI_BRIDGE_CTRL_2) to 0x03000000 */ ++ bnx2x_cl45_write(bp, port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481, ++ ext_phy_addr, MDIO_PMA_DEVAD, ++ 0xA819, 0x0014); ++ bnx2x_cl45_write(bp, port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ 0xA81A, ++ 0xc200); ++ bnx2x_cl45_write(bp, port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ 0xA81B, ++ 0x0000); ++ bnx2x_cl45_write(bp, port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ 0xA81C, ++ 0x0300); ++ bnx2x_cl45_write(bp, port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ 0xA817, ++ 0x0009); ++ ++ for (cnt = 0; cnt < 100; cnt++) { ++ bnx2x_cl45_read(bp, port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ 0xA818, ++ &val); ++ if (val & 1) ++ break; ++ udelay(5); ++ } ++ if (cnt == 100) { ++ DP(NETIF_MSG_LINK, "Unable to read 8481 phy fw version(1)\n"); ++ bnx2x_save_spirom_version(bp, port, ++ shmem_base, 0); ++ return; ++ } ++ ++ ++ /* 2) read register 0xc200_0000 (SPI_FW_STATUS) */ ++ bnx2x_cl45_write(bp, port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481, ++ ext_phy_addr, MDIO_PMA_DEVAD, ++ 0xA819, 0x0000); ++ bnx2x_cl45_write(bp, port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481, ++ ext_phy_addr, MDIO_PMA_DEVAD, ++ 0xA81A, 0xc200); ++ bnx2x_cl45_write(bp, port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481, ++ ext_phy_addr, MDIO_PMA_DEVAD, ++ 0xA817, 0x000A); ++ for (cnt = 0; cnt < 100; cnt++) { ++ bnx2x_cl45_read(bp, port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ 0xA818, ++ &val); ++ if (val & 1) ++ break; ++ udelay(5); ++ } ++ if (cnt == 100) { ++ DP(NETIF_MSG_LINK, "Unable to read 8481 phy fw version(2)\n"); ++ bnx2x_save_spirom_version(bp, port, ++ shmem_base, 0); ++ return; ++ } ++ ++ /* lower 16 bits of the register SPI_FW_STATUS */ ++ bnx2x_cl45_read(bp, port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ 0xA81B, ++ &fw_ver1); ++ /* upper 16 bits of register SPI_FW_STATUS */ ++ bnx2x_cl45_read(bp, port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ 0xA81C, ++ &fw_ver2); ++ ++ bnx2x_save_spirom_version(bp, port, ++ shmem_base, (fw_ver2<<16) | fw_ver1); ++} ++ + static void bnx2x_bcm8072_external_rom_boot(struct link_params *params) + { + struct bnx2x *bp = params->bp; + u8 port = params->port; +- u8 ext_phy_addr = ((params->ext_phy_config & +- PORT_HW_CFG_XGXS_EXT_PHY_ADDR_MASK) >> +- PORT_HW_CFG_XGXS_EXT_PHY_ADDR_SHIFT); +- u32 ext_phy_type = XGXS_EXT_PHY_TYPE(params->ext_phy_config); +- u16 fw_ver1, fw_ver2; ++ u8 ext_phy_addr = XGXS_EXT_PHY_ADDR(params->ext_phy_config); ++ u32 ext_phy_type = XGXS_EXT_PHY_TYPE(params->ext_phy_config); + + /* Need to wait 200ms after reset */ + msleep(200); +@@ -1996,42 +2393,38 @@ + * Set ser_boot_ctl bit in the MISC_CTRL1 register + */ + bnx2x_cl45_write(bp, port, ext_phy_type, ext_phy_addr, +- MDIO_PMA_DEVAD, +- MDIO_PMA_REG_MISC_CTRL1, 0x0001); ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_MISC_CTRL1, 0x0001); + + /* Reset internal microprocessor */ + bnx2x_cl45_write(bp, port, ext_phy_type, ext_phy_addr, +- MDIO_PMA_DEVAD, +- MDIO_PMA_REG_GEN_CTRL, +- MDIO_PMA_REG_GEN_CTRL_ROM_RESET_INTERNAL_MP); ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_GEN_CTRL, ++ MDIO_PMA_REG_GEN_CTRL_ROM_RESET_INTERNAL_MP); + /* set micro reset = 0 */ + bnx2x_cl45_write(bp, port, ext_phy_type, ext_phy_addr, +- MDIO_PMA_DEVAD, +- MDIO_PMA_REG_GEN_CTRL, +- MDIO_PMA_REG_GEN_CTRL_ROM_MICRO_RESET); ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_GEN_CTRL, ++ MDIO_PMA_REG_GEN_CTRL_ROM_MICRO_RESET); + /* Reset internal microprocessor */ + bnx2x_cl45_write(bp, port, ext_phy_type, ext_phy_addr, +- MDIO_PMA_DEVAD, +- MDIO_PMA_REG_GEN_CTRL, +- MDIO_PMA_REG_GEN_CTRL_ROM_RESET_INTERNAL_MP); ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_GEN_CTRL, ++ MDIO_PMA_REG_GEN_CTRL_ROM_RESET_INTERNAL_MP); + /* wait for 100ms for code download via SPI port */ + msleep(100); + + /* Clear ser_boot_ctl bit */ + bnx2x_cl45_write(bp, port, ext_phy_type, ext_phy_addr, +- MDIO_PMA_DEVAD, +- MDIO_PMA_REG_MISC_CTRL1, 0x0000); ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_MISC_CTRL1, 0x0000); + /* Wait 100ms */ + msleep(100); + +- /* Print the PHY FW version */ +- bnx2x_cl45_read(bp, port, ext_phy_type, ext_phy_addr, +- MDIO_PMA_DEVAD, +- MDIO_PMA_REG_ROM_VER1, &fw_ver1); +- bnx2x_cl45_read(bp, port, ext_phy_type, ext_phy_addr, +- MDIO_PMA_DEVAD, +- MDIO_PMA_REG_ROM_VER2, &fw_ver2); +- DP(NETIF_MSG_LINK, "8072 FW version 0x%x:0x%x\n", fw_ver1, fw_ver2); ++ bnx2x_save_bcm_spirom_ver(bp, port, ++ ext_phy_type, ++ ext_phy_addr, ++ params->shmem_base); + } + + static u8 bnx2x_8073_is_snr_needed(struct link_params *params) +@@ -2039,9 +2432,7 @@ + /* This is only required for 8073A1, version 102 only */ + + struct bnx2x *bp = params->bp; +- u8 ext_phy_addr = ((params->ext_phy_config & +- PORT_HW_CFG_XGXS_EXT_PHY_ADDR_MASK) >> +- PORT_HW_CFG_XGXS_EXT_PHY_ADDR_SHIFT); ++ u8 ext_phy_addr = XGXS_EXT_PHY_ADDR(params->ext_phy_config); + u16 val; + + /* Read 8073 HW revision*/ +@@ -2049,7 +2440,7 @@ + PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073, + ext_phy_addr, + MDIO_PMA_DEVAD, +- 0xc801, &val); ++ MDIO_PMA_REG_8073_CHIP_REV, &val); + + if (val != 1) { + /* No need to workaround in 8073 A1 */ +@@ -2072,16 +2463,14 @@ + static u8 bnx2x_bcm8073_xaui_wa(struct link_params *params) + { + struct bnx2x *bp = params->bp; +- u8 ext_phy_addr = ((params->ext_phy_config & +- PORT_HW_CFG_XGXS_EXT_PHY_ADDR_MASK) >> +- PORT_HW_CFG_XGXS_EXT_PHY_ADDR_SHIFT); ++ u8 ext_phy_addr = XGXS_EXT_PHY_ADDR(params->ext_phy_config); + u16 val, cnt, cnt1 ; + + bnx2x_cl45_read(bp, params->port, + PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073, + ext_phy_addr, + MDIO_PMA_DEVAD, +- 0xc801, &val); ++ MDIO_PMA_REG_8073_CHIP_REV, &val); + + if (val > 0) { + /* No need to workaround in 8073 A1 */ +@@ -2097,7 +2486,8 @@ + PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073, + ext_phy_addr, + MDIO_PMA_DEVAD, +- 0xc820, &val); ++ MDIO_PMA_REG_8073_SPEED_LINK_STATUS, ++ &val); + /* If bit [14] = 0 or bit [13] = 0, continue on with + system initialization (XAUI work-around not required, + as these bits indicate 2.5G or 1G link up). */ +@@ -2115,7 +2505,7 @@ + PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073, + ext_phy_addr, + MDIO_PMA_DEVAD, +- 0xc841, &val); ++ MDIO_PMA_REG_8073_XAUI_WA, &val); + if (val & (1<<15)) { + DP(NETIF_MSG_LINK, + "XAUI workaround has completed\n"); +@@ -2129,17 +2519,17 @@ + } + DP(NETIF_MSG_LINK, "Warning: XAUI work-around timeout !!!\n"); + return -EINVAL; +- +-} +- +-static void bnx2x_bcm8073_external_rom_boot(struct bnx2x *bp, u8 port, +- u8 ext_phy_addr) +-{ +- u16 fw_ver1, fw_ver2; ++} ++ ++static void bnx2x_bcm8073_bcm8727_external_rom_boot(struct bnx2x *bp, u8 port, ++ u8 ext_phy_addr, ++ u32 ext_phy_type, ++ u32 shmem_base) ++{ + /* Boot port from external ROM */ + /* EDC grst */ + bnx2x_cl45_write(bp, port, +- PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073, ++ ext_phy_type, + ext_phy_addr, + MDIO_PMA_DEVAD, + MDIO_PMA_REG_GEN_CTRL, +@@ -2147,21 +2537,21 @@ + + /* ucode reboot and rst */ + bnx2x_cl45_write(bp, port, +- PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073, ++ ext_phy_type, + ext_phy_addr, + MDIO_PMA_DEVAD, + MDIO_PMA_REG_GEN_CTRL, + 0x008c); + + bnx2x_cl45_write(bp, port, +- PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073, ++ ext_phy_type, + ext_phy_addr, + MDIO_PMA_DEVAD, + MDIO_PMA_REG_MISC_CTRL1, 0x0001); + + /* Reset internal microprocessor */ + bnx2x_cl45_write(bp, port, +- PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073, ++ ext_phy_type, + ext_phy_addr, + MDIO_PMA_DEVAD, + MDIO_PMA_REG_GEN_CTRL, +@@ -2169,7 +2559,7 @@ + + /* Release srst bit */ + bnx2x_cl45_write(bp, port, +- PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073, ++ ext_phy_type, + ext_phy_addr, + MDIO_PMA_DEVAD, + MDIO_PMA_REG_GEN_CTRL, +@@ -2180,31 +2570,701 @@ + + /* Clear ser_boot_ctl bit */ + bnx2x_cl45_write(bp, port, +- PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073, ++ ext_phy_type, + ext_phy_addr, + MDIO_PMA_DEVAD, + MDIO_PMA_REG_MISC_CTRL1, 0x0000); + +- bnx2x_cl45_read(bp, port, PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073, +- ext_phy_addr, +- MDIO_PMA_DEVAD, +- MDIO_PMA_REG_ROM_VER1, &fw_ver1); +- bnx2x_cl45_read(bp, port, +- PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073, +- ext_phy_addr, +- MDIO_PMA_DEVAD, +- MDIO_PMA_REG_ROM_VER2, &fw_ver2); +- DP(NETIF_MSG_LINK, "8073 FW version 0x%x:0x%x\n", fw_ver1, fw_ver2); +- ++ bnx2x_save_bcm_spirom_ver(bp, port, ++ ext_phy_type, ++ ext_phy_addr, ++ shmem_base); ++} ++ ++static void bnx2x_bcm8073_external_rom_boot(struct bnx2x *bp, u8 port, ++ u8 ext_phy_addr, ++ u32 shmem_base) ++{ ++ bnx2x_bcm8073_bcm8727_external_rom_boot(bp, port, ext_phy_addr, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073, ++ shmem_base); ++} ++ ++static void bnx2x_bcm8727_external_rom_boot(struct bnx2x *bp, u8 port, ++ u8 ext_phy_addr, ++ u32 shmem_base) ++{ ++ bnx2x_bcm8073_bcm8727_external_rom_boot(bp, port, ext_phy_addr, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8727, ++ shmem_base); ++ ++} ++ ++static void bnx2x_bcm8726_external_rom_boot(struct link_params *params) ++{ ++ struct bnx2x *bp = params->bp; ++ u8 port = params->port; ++ u8 ext_phy_addr = XGXS_EXT_PHY_ADDR(params->ext_phy_config); ++ u32 ext_phy_type = XGXS_EXT_PHY_TYPE(params->ext_phy_config); ++ ++ /* Need to wait 100ms after reset */ ++ msleep(100); ++ ++ /* Set serial boot control for external load */ ++ bnx2x_cl45_write(bp, port, ext_phy_type, ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_MISC_CTRL1, 0x0001); ++ ++ /* Micro controller re-boot */ ++ bnx2x_cl45_write(bp, port, ext_phy_type, ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_GEN_CTRL, ++ MDIO_PMA_REG_GEN_CTRL_ROM_RESET_INTERNAL_MP); ++ ++ /* Set soft reset */ ++ bnx2x_cl45_write(bp, port, ext_phy_type, ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_GEN_CTRL, ++ MDIO_PMA_REG_GEN_CTRL_ROM_MICRO_RESET); ++ ++ /* Set PLL register value to be same like in P13 ver */ ++ bnx2x_cl45_write(bp, port, ext_phy_type, ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_PLL_CTRL, ++ 0x73A0); ++ ++ /* Clear soft reset. ++ Will automatically reset micro-controller re-boot */ ++ bnx2x_cl45_write(bp, port, ext_phy_type, ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_GEN_CTRL, ++ MDIO_PMA_REG_GEN_CTRL_ROM_RESET_INTERNAL_MP); ++ ++ /* wait for 150ms for microcode load */ ++ msleep(150); ++ ++ /* Disable serial boot control, tristates pins SS_N, SCK, MOSI, MISO */ ++ bnx2x_cl45_write(bp, port, ext_phy_type, ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_MISC_CTRL1, 0x0000); ++ ++ msleep(200); ++ bnx2x_save_bcm_spirom_ver(bp, port, ++ ext_phy_type, ++ ext_phy_addr, ++ params->shmem_base); ++} ++ ++static void bnx2x_sfp_set_transmitter(struct bnx2x *bp, u8 port, ++ u32 ext_phy_type, u8 ext_phy_addr, ++ u8 tx_en) ++{ ++ u16 val; ++ ++ DP(NETIF_MSG_LINK, "Setting transmitter tx_en=%x for port %x\n", ++ tx_en, port); ++ /* Disable/Enable transmitter ( TX laser of the SFP+ module.)*/ ++ bnx2x_cl45_read(bp, port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_PHY_IDENTIFIER, ++ &val); ++ ++ if (tx_en) ++ val &= ~(1<<15); ++ else ++ val |= (1<<15); ++ ++ bnx2x_cl45_write(bp, port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_PHY_IDENTIFIER, ++ val); ++} ++ ++static u8 bnx2x_8726_read_sfp_module_eeprom(struct link_params *params, ++ u16 addr, u8 byte_cnt, u8 *o_buf) ++{ ++ struct bnx2x *bp = params->bp; ++ u16 val, i; ++ u8 port = params->port; ++ u8 ext_phy_addr = XGXS_EXT_PHY_ADDR(params->ext_phy_config); ++ u32 ext_phy_type = XGXS_EXT_PHY_TYPE(params->ext_phy_config); ++ ++ if (byte_cnt > 16) { ++ DP(NETIF_MSG_LINK, "Reading from eeprom is" ++ " is limited to 0xf\n"); ++ return -EINVAL; ++ } ++ /* Set the read command byte count */ ++ bnx2x_cl45_write(bp, port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_SFP_TWO_WIRE_BYTE_CNT, ++ (byte_cnt | 0xa000)); ++ ++ /* Set the read command address */ ++ bnx2x_cl45_write(bp, port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_SFP_TWO_WIRE_MEM_ADDR, ++ addr); ++ ++ /* Activate read command */ ++ bnx2x_cl45_write(bp, port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_SFP_TWO_WIRE_CTRL, ++ 0x2c0f); ++ ++ /* Wait up to 500us for command complete status */ ++ for (i = 0; i < 100; i++) { ++ bnx2x_cl45_read(bp, port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_SFP_TWO_WIRE_CTRL, &val); ++ if ((val & MDIO_PMA_REG_SFP_TWO_WIRE_CTRL_STATUS_MASK) == ++ MDIO_PMA_REG_SFP_TWO_WIRE_STATUS_COMPLETE) ++ break; ++ udelay(5); ++ } ++ ++ if ((val & MDIO_PMA_REG_SFP_TWO_WIRE_CTRL_STATUS_MASK) != ++ MDIO_PMA_REG_SFP_TWO_WIRE_STATUS_COMPLETE) { ++ DP(NETIF_MSG_LINK, ++ "Got bad status 0x%x when reading from SFP+ EEPROM\n", ++ (val & MDIO_PMA_REG_SFP_TWO_WIRE_CTRL_STATUS_MASK)); ++ return -EINVAL; ++ } ++ ++ /* Read the buffer */ ++ for (i = 0; i < byte_cnt; i++) { ++ bnx2x_cl45_read(bp, port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_8726_TWO_WIRE_DATA_BUF + i, &val); ++ o_buf[i] = (u8)(val & MDIO_PMA_REG_8726_TWO_WIRE_DATA_MASK); ++ } ++ ++ for (i = 0; i < 100; i++) { ++ bnx2x_cl45_read(bp, port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_SFP_TWO_WIRE_CTRL, &val); ++ if ((val & MDIO_PMA_REG_SFP_TWO_WIRE_CTRL_STATUS_MASK) == ++ MDIO_PMA_REG_SFP_TWO_WIRE_STATUS_IDLE) ++ return 0;; ++ msleep(1); ++ } ++ return -EINVAL; ++} ++ ++static u8 bnx2x_8727_read_sfp_module_eeprom(struct link_params *params, ++ u16 addr, u8 byte_cnt, u8 *o_buf) ++{ ++ struct bnx2x *bp = params->bp; ++ u16 val, i; ++ u8 port = params->port; ++ u8 ext_phy_addr = XGXS_EXT_PHY_ADDR(params->ext_phy_config); ++ u32 ext_phy_type = XGXS_EXT_PHY_TYPE(params->ext_phy_config); ++ ++ if (byte_cnt > 16) { ++ DP(NETIF_MSG_LINK, "Reading from eeprom is" ++ " is limited to 0xf\n"); ++ return -EINVAL; ++ } ++ ++ /* Need to read from 1.8000 to clear it */ ++ bnx2x_cl45_read(bp, port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8727, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_SFP_TWO_WIRE_CTRL, ++ &val); ++ ++ /* Set the read command byte count */ ++ bnx2x_cl45_write(bp, port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_SFP_TWO_WIRE_BYTE_CNT, ++ ((byte_cnt < 2) ? 2 : byte_cnt)); ++ ++ /* Set the read command address */ ++ bnx2x_cl45_write(bp, port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_SFP_TWO_WIRE_MEM_ADDR, ++ addr); ++ /* Set the destination address */ ++ bnx2x_cl45_write(bp, port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ 0x8004, ++ MDIO_PMA_REG_8727_TWO_WIRE_DATA_BUF); ++ ++ /* Activate read command */ ++ bnx2x_cl45_write(bp, port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_SFP_TWO_WIRE_CTRL, ++ 0x8002); ++ /* Wait appropriate time for two-wire command to finish before ++ polling the status register */ ++ msleep(1); ++ ++ /* Wait up to 500us for command complete status */ ++ for (i = 0; i < 100; i++) { ++ bnx2x_cl45_read(bp, port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_SFP_TWO_WIRE_CTRL, &val); ++ if ((val & MDIO_PMA_REG_SFP_TWO_WIRE_CTRL_STATUS_MASK) == ++ MDIO_PMA_REG_SFP_TWO_WIRE_STATUS_COMPLETE) ++ break; ++ udelay(5); ++ } ++ ++ if ((val & MDIO_PMA_REG_SFP_TWO_WIRE_CTRL_STATUS_MASK) != ++ MDIO_PMA_REG_SFP_TWO_WIRE_STATUS_COMPLETE) { ++ DP(NETIF_MSG_LINK, ++ "Got bad status 0x%x when reading from SFP+ EEPROM\n", ++ (val & MDIO_PMA_REG_SFP_TWO_WIRE_CTRL_STATUS_MASK)); ++ return -EINVAL; ++ } ++ ++ /* Read the buffer */ ++ for (i = 0; i < byte_cnt; i++) { ++ bnx2x_cl45_read(bp, port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_8727_TWO_WIRE_DATA_BUF + i, &val); ++ o_buf[i] = (u8)(val & MDIO_PMA_REG_8727_TWO_WIRE_DATA_MASK); ++ } ++ ++ for (i = 0; i < 100; i++) { ++ bnx2x_cl45_read(bp, port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_SFP_TWO_WIRE_CTRL, &val); ++ if ((val & MDIO_PMA_REG_SFP_TWO_WIRE_CTRL_STATUS_MASK) == ++ MDIO_PMA_REG_SFP_TWO_WIRE_STATUS_IDLE) ++ return 0;; ++ msleep(1); ++ } ++ ++ return -EINVAL; ++} ++ ++u8 bnx2x_read_sfp_module_eeprom(struct link_params *params, u16 addr, ++ u8 byte_cnt, u8 *o_buf) ++{ ++ u32 ext_phy_type = XGXS_EXT_PHY_TYPE(params->ext_phy_config); ++ ++ if (ext_phy_type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8726) ++ return bnx2x_8726_read_sfp_module_eeprom(params, addr, ++ byte_cnt, o_buf); ++ else if (ext_phy_type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8727) ++ return bnx2x_8727_read_sfp_module_eeprom(params, addr, ++ byte_cnt, o_buf); ++ return -EINVAL; ++} ++ ++static u8 bnx2x_get_sfp_module_type(struct link_params *params, ++ u8 *module_type) ++{ ++ struct bnx2x *bp = params->bp; ++ u8 val; ++ *module_type = SFP_MODULE_TYPE_UNKNOWN; ++ ++ /* First check for copper cable */ ++ if (bnx2x_read_sfp_module_eeprom(params, ++ SFP_EEPROM_CON_TYPE_ADDR, ++ 1, ++ &val) != 0) { ++ DP(NETIF_MSG_LINK, "Failed to read from SFP+ module EEPROM\n"); ++ return -EINVAL; ++ } ++ ++ switch (val) { ++ case SFP_EEPROM_CON_TYPE_VAL_COPPER: ++ { ++ u8 copper_module_type; ++ ++ /* Check if its active cable( includes SFP+ module) ++ of passive cable*/ ++ if (bnx2x_read_sfp_module_eeprom(params, ++ SFP_EEPROM_FC_TX_TECH_ADDR, ++ 1, ++ &copper_module_type) != ++ 0) { ++ DP(NETIF_MSG_LINK, ++ "Failed to read copper-cable-type" ++ " from SFP+ EEPROM\n"); ++ return -EINVAL; ++ } ++ ++ if (copper_module_type & ++ SFP_EEPROM_FC_TX_TECH_BITMASK_COPPER_ACTIVE) { ++ DP(NETIF_MSG_LINK, "Active Copper cable detected\n"); ++ *module_type = SFP_MODULE_TYPE_ACTIVE_COPPER_CABLE; ++ } else if (copper_module_type & ++ SFP_EEPROM_FC_TX_TECH_BITMASK_COPPER_PASSIVE) { ++ DP(NETIF_MSG_LINK, "Passive Copper" ++ " cable detected\n"); ++ *module_type = ++ SFP_MODULE_TYPE_PASSIVE_COPPER_CABLE; ++ } else { ++ DP(NETIF_MSG_LINK, "Unknown copper-cable-" ++ "type 0x%x !!!\n", copper_module_type); ++ return -EINVAL; ++ } ++ break; ++ } ++ case SFP_EEPROM_CON_TYPE_VAL_LC: ++ DP(NETIF_MSG_LINK, "Optic module detected\n"); ++ *module_type = SFP_MODULE_TYPE_LC; ++ break; ++ ++ default: ++ DP(NETIF_MSG_LINK, "Unable to determine module type 0x%x !!!\n", ++ val); ++ return -EINVAL; ++ } ++ return 0; ++} ++ ++/* This function read the relevant field from the module ( SFP+ ), ++ and verify it is compliant with this board */ ++static u8 bnx2x_verify_sfp_module(struct link_params *params, ++ u8 module_type) ++{ ++ struct bnx2x *bp = params->bp; ++ u32 val; ++ u32 fw_resp; ++ char vendor_name[SFP_EEPROM_VENDOR_NAME_SIZE+1]; ++ char vendor_pn[SFP_EEPROM_PART_NO_SIZE+1]; ++ ++ val = REG_RD(bp, params->shmem_base + ++ offsetof(struct shmem_region, dev_info. ++ port_feature_config[params->port].config)); ++ if ((val & PORT_FEAT_CFG_OPT_MDL_ENFRCMNT_MASK) == ++ PORT_FEAT_CFG_OPT_MDL_ENFRCMNT_NO_ENFORCEMENT) { ++ DP(NETIF_MSG_LINK, "NOT enforcing module verification\n"); ++ return 0; ++ } ++ ++ /* Ask the FW to validate the module */ ++ if (!(params->feature_config_flags & ++ FEATURE_CONFIG_BC_SUPPORTS_OPT_MDL_VRFY)) { ++ DP(NETIF_MSG_LINK, "FW does not support OPT MDL " ++ "verification\n"); ++ return -EINVAL; ++ } ++ ++ fw_resp = bnx2x_fw_command(bp, DRV_MSG_CODE_VRFY_OPT_MDL); ++ if (fw_resp == FW_MSG_CODE_VRFY_OPT_MDL_SUCCESS) { ++ DP(NETIF_MSG_LINK, "Approved module\n"); ++ return 0; ++ } ++ ++ /* format the warning message */ ++ if (bnx2x_read_sfp_module_eeprom(params, ++ SFP_EEPROM_VENDOR_NAME_ADDR, ++ SFP_EEPROM_VENDOR_NAME_SIZE, ++ vendor_name)) ++ vendor_name[0] = '\0'; ++ else ++ vendor_name[SFP_EEPROM_VENDOR_NAME_SIZE] = '\0'; ++ if (bnx2x_read_sfp_module_eeprom(params, ++ SFP_EEPROM_PART_NO_ADDR, ++ SFP_EEPROM_PART_NO_SIZE, ++ vendor_pn)) ++ vendor_pn[0] = '\0'; ++ else ++ vendor_pn[SFP_EEPROM_PART_NO_SIZE] = '\0'; ++ ++ printk(KERN_INFO PFX "Warning: " ++ "Unqualified SFP+ module " ++ "detected on %s, Port %d from %s part number %s\n" ++ , bp->dev->name, params->port, ++ vendor_name, vendor_pn); ++ return -EINVAL; ++} ++ ++static u8 bnx2x_bcm8726_set_limiting_mode(struct link_params *params, ++ u8 module_type) ++{ ++ struct bnx2x *bp = params->bp; ++ u8 port = params->port; ++ u8 options[SFP_EEPROM_OPTIONS_SIZE]; ++ u8 limiting_mode; ++ u8 ext_phy_addr = XGXS_EXT_PHY_ADDR(params->ext_phy_config); ++ u16 cur_limiting_mode; ++ ++ if (bnx2x_read_sfp_module_eeprom(params, ++ SFP_EEPROM_OPTIONS_ADDR, ++ SFP_EEPROM_OPTIONS_SIZE, ++ options) != 0) { ++ DP(NETIF_MSG_LINK, "Failed to read Option field from" ++ " module EEPROM\n"); ++ return -EINVAL; ++ } ++ limiting_mode = !(options[0] & ++ SFP_EEPROM_OPTIONS_LINEAR_RX_OUT_MASK); ++ ++ bnx2x_cl45_read(bp, port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8726, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_ROM_VER2, ++ &cur_limiting_mode); ++ DP(NETIF_MSG_LINK, "Current Limiting mode is 0x%x\n", ++ cur_limiting_mode); ++ ++ if (limiting_mode && ++ (module_type != SFP_MODULE_TYPE_PASSIVE_COPPER_CABLE)) { ++ DP(NETIF_MSG_LINK, ++ "Module options = 0x%x.Setting LIMITING MODE\n", ++ options[0]); ++ bnx2x_cl45_write(bp, port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8726, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_ROM_VER2, ++ SFP_LIMITING_MODE_VALUE); ++ } else { /* LRM mode ( default )*/ ++ ++ DP(NETIF_MSG_LINK, "Module options = 0x%x.Setting LRM MODE\n", ++ options[0]); ++ ++ /* Changing to LRM mode takes quite few seconds. ++ So do it only if current mode is limiting ++ ( default is LRM )*/ ++ if (cur_limiting_mode != SFP_LIMITING_MODE_VALUE) ++ return 0; ++ ++ bnx2x_cl45_write(bp, port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8726, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_LRM_MODE, ++ 0); ++ bnx2x_cl45_write(bp, port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8726, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_ROM_VER2, ++ 0x128); ++ bnx2x_cl45_write(bp, port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8726, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_MISC_CTRL0, ++ 0x4008); ++ bnx2x_cl45_write(bp, port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8726, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_LRM_MODE, ++ 0xaaaa); ++ } ++ return 0; ++} ++ ++static u8 bnx2x_wait_for_sfp_module_initialized(struct link_params *params) ++{ ++ u8 val; ++ struct bnx2x *bp = params->bp; ++ u16 timeout; ++ /* Initialization time after hot-plug may take up to 300ms for some ++ phys type ( e.g. JDSU ) */ ++ for (timeout = 0; timeout < 60; timeout++) { ++ if (bnx2x_read_sfp_module_eeprom(params, 1, 1, &val) ++ == 0) { ++ DP(NETIF_MSG_LINK, "SFP+ module initialization " ++ "took %d ms\n", timeout * 5); ++ return 0; ++ } ++ msleep(5); ++ } ++ return -EINVAL; ++} ++ ++static void bnx2x_8727_power_module(struct bnx2x *bp, ++ struct link_params *params, ++ u8 ext_phy_addr, u8 is_power_up) { ++ /* Make sure GPIOs are not using for LED mode */ ++ u16 val; ++ u8 port = params->port; ++ /* ++ * In the GPIO register, bit 4 is use to detemine if the GPIOs are ++ * operating as INPUT or as OUTPUT. Bit 1 is for input, and 0 for ++ * output ++ * Bits 0-1 determine the gpios value for OUTPUT in case bit 4 val is 0 ++ * Bits 8-9 determine the gpios value for INPUT in case bit 4 val is 1 ++ * where the 1st bit is the over-current(only input), and 2nd bit is ++ * for power( only output ) ++ */ ++ ++ /* ++ * In case of NOC feature is disabled and power is up, set GPIO control ++ * as input to enable listening of over-current indication ++ */ ++ ++ if (!(params->feature_config_flags & ++ FEATURE_CONFIG_BCM8727_NOC) && is_power_up) ++ val = (1<<4); ++ else ++ /* ++ * Set GPIO control to OUTPUT, and set the power bit ++ * to according to the is_power_up ++ */ ++ val = ((!(is_power_up)) << 1); ++ ++ bnx2x_cl45_write(bp, port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8727, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_8727_GPIO_CTRL, ++ val); ++} ++ ++static u8 bnx2x_sfp_module_detection(struct link_params *params) ++{ ++ struct bnx2x *bp = params->bp; ++ u8 module_type; ++ u8 rc = 0; ++ u8 ext_phy_addr = XGXS_EXT_PHY_ADDR(params->ext_phy_config); ++ u32 ext_phy_type = XGXS_EXT_PHY_TYPE(params->ext_phy_config); ++ u32 val = REG_RD(bp, params->shmem_base + ++ offsetof(struct shmem_region, dev_info. ++ port_feature_config[params->port].config)); ++ ++ DP(NETIF_MSG_LINK, "SFP+ module plugged in/out detected on port %d\n", ++ params->port); ++ ++ if (bnx2x_get_sfp_module_type(params, &module_type) != 0) { ++ DP(NETIF_MSG_LINK, "Failed to get valid module type\n"); ++ return -EINVAL; ++ } else if (bnx2x_verify_sfp_module(params, module_type) != ++ 0) { ++ /* check SFP+ module compatibility */ ++ DP(NETIF_MSG_LINK, "Module verification failed!!\n"); ++ rc = -EINVAL; ++ /* Turn on fault module-detected led */ ++ bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_0, ++ MISC_REGISTERS_GPIO_HIGH, ++ params->port); ++ if ((ext_phy_type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8727) && ++ ((val & PORT_FEAT_CFG_OPT_MDL_ENFRCMNT_MASK) == ++ PORT_FEAT_CFG_OPT_MDL_ENFRCMNT_POWER_DOWN)) { ++ /* Shutdown SFP+ module */ ++ DP(NETIF_MSG_LINK, "Shutdown SFP+ module!!\n"); ++ bnx2x_8727_power_module(bp, params, ++ ext_phy_addr, 0); ++ return rc; ++ } ++ } else { ++ /* Turn off fault module-detected led */ ++ DP(NETIF_MSG_LINK, "Turn off fault module-detected led\n"); ++ bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_0, ++ MISC_REGISTERS_GPIO_LOW, ++ params->port); ++ } ++ ++ /* power up the SFP module */ ++ if (ext_phy_type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8727) ++ bnx2x_8727_power_module(bp, params, ext_phy_addr, 1); ++ ++ /* Check and set limiting mode / LRM mode on 8726. ++ On 8727 it is done automatically */ ++ if (ext_phy_type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8726) ++ bnx2x_bcm8726_set_limiting_mode(params, module_type); ++ ++ /* ++ * Enable transmit for this module if the module is approved, or ++ * if unapproved modules should also enable the Tx laser ++ */ ++ if (rc == 0 || ++ (val & PORT_FEAT_CFG_OPT_MDL_ENFRCMNT_MASK) != ++ PORT_FEAT_CFG_OPT_MDL_ENFRCMNT_DISABLE_TX_LASER) ++ bnx2x_sfp_set_transmitter(bp, params->port, ++ ext_phy_type, ext_phy_addr, 1); ++ else ++ bnx2x_sfp_set_transmitter(bp, params->port, ++ ext_phy_type, ext_phy_addr, 0); ++ ++ return rc; ++} ++ ++void bnx2x_handle_module_detect_int(struct link_params *params) ++{ ++ struct bnx2x *bp = params->bp; ++ u32 gpio_val; ++ u8 port = params->port; ++ ++ /* Set valid module led off */ ++ bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_0, ++ MISC_REGISTERS_GPIO_HIGH, ++ params->port); ++ ++ /* Get current gpio val refelecting module plugged in / out*/ ++ gpio_val = bnx2x_get_gpio(bp, MISC_REGISTERS_GPIO_3, port); ++ ++ /* Call the handling function in case module is detected */ ++ if (gpio_val == 0) { ++ ++ bnx2x_set_gpio_int(bp, MISC_REGISTERS_GPIO_3, ++ MISC_REGISTERS_GPIO_INT_OUTPUT_CLR, ++ port); ++ ++ if (bnx2x_wait_for_sfp_module_initialized(params) == ++ 0) ++ bnx2x_sfp_module_detection(params); ++ else ++ DP(NETIF_MSG_LINK, "SFP+ module is not initialized\n"); ++ } else { ++ u8 ext_phy_addr = XGXS_EXT_PHY_ADDR(params->ext_phy_config); ++ ++ u32 ext_phy_type = ++ XGXS_EXT_PHY_TYPE(params->ext_phy_config); ++ u32 val = REG_RD(bp, params->shmem_base + ++ offsetof(struct shmem_region, dev_info. ++ port_feature_config[params->port]. ++ config)); ++ ++ bnx2x_set_gpio_int(bp, MISC_REGISTERS_GPIO_3, ++ MISC_REGISTERS_GPIO_INT_OUTPUT_SET, ++ port); ++ /* Module was plugged out. */ ++ /* Disable transmit for this module */ ++ if ((val & PORT_FEAT_CFG_OPT_MDL_ENFRCMNT_MASK) == ++ PORT_FEAT_CFG_OPT_MDL_ENFRCMNT_DISABLE_TX_LASER) ++ bnx2x_sfp_set_transmitter(bp, params->port, ++ ext_phy_type, ext_phy_addr, 0); ++ } + } + + static void bnx2x_bcm807x_force_10G(struct link_params *params) + { + struct bnx2x *bp = params->bp; + u8 port = params->port; +- u8 ext_phy_addr = ((params->ext_phy_config & +- PORT_HW_CFG_XGXS_EXT_PHY_ADDR_MASK) >> +- PORT_HW_CFG_XGXS_EXT_PHY_ADDR_SHIFT); ++ u8 ext_phy_addr = XGXS_EXT_PHY_ADDR(params->ext_phy_config); + u32 ext_phy_type = XGXS_EXT_PHY_TYPE(params->ext_phy_config); + + /* Force KR or KX */ +@@ -2225,21 +3285,20 @@ + MDIO_AN_REG_CTRL, + 0x0000); + } ++ + static void bnx2x_bcm8073_set_xaui_low_power_mode(struct link_params *params) + { + struct bnx2x *bp = params->bp; + u8 port = params->port; + u16 val; +- u8 ext_phy_addr = ((params->ext_phy_config & +- PORT_HW_CFG_XGXS_EXT_PHY_ADDR_MASK) >> +- PORT_HW_CFG_XGXS_EXT_PHY_ADDR_SHIFT); ++ u8 ext_phy_addr = XGXS_EXT_PHY_ADDR(params->ext_phy_config); + u32 ext_phy_type = XGXS_EXT_PHY_TYPE(params->ext_phy_config); + + bnx2x_cl45_read(bp, params->port, + PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073, + ext_phy_addr, + MDIO_PMA_DEVAD, +- 0xc801, &val); ++ MDIO_PMA_REG_8073_CHIP_REV, &val); + + if (val == 0) { + /* Mustn't set low power mode in 8073 A0 */ +@@ -2284,22 +3343,19 @@ + + /* Enable PLL sequencer (use read-modify-write to set bit 13) */ + bnx2x_cl45_read(bp, port, ext_phy_type, ext_phy_addr, +- MDIO_XS_DEVAD, +- MDIO_XS_PLL_SEQUENCER, &val); ++ MDIO_XS_DEVAD, ++ MDIO_XS_PLL_SEQUENCER, &val); + val |= (1<<13); + bnx2x_cl45_write(bp, port, ext_phy_type, ext_phy_addr, + MDIO_XS_DEVAD, MDIO_XS_PLL_SEQUENCER, val); + } + + static void bnx2x_8073_set_pause_cl37(struct link_params *params, +- struct link_vars *vars) +-{ +- ++ struct link_vars *vars) ++{ + struct bnx2x *bp = params->bp; + u16 cl37_val; +- u8 ext_phy_addr = ((params->ext_phy_config & +- PORT_HW_CFG_XGXS_EXT_PHY_ADDR_MASK) >> +- PORT_HW_CFG_XGXS_EXT_PHY_ADDR_SHIFT); ++ u8 ext_phy_addr = XGXS_EXT_PHY_ADDR(params->ext_phy_config); + u32 ext_phy_type = XGXS_EXT_PHY_TYPE(params->ext_phy_config); + + bnx2x_cl45_read(bp, params->port, +@@ -2342,9 +3398,7 @@ + { + struct bnx2x *bp = params->bp; + u16 val; +- u8 ext_phy_addr = ((params->ext_phy_config & +- PORT_HW_CFG_XGXS_EXT_PHY_ADDR_MASK) >> +- PORT_HW_CFG_XGXS_EXT_PHY_ADDR_SHIFT); ++ u8 ext_phy_addr = XGXS_EXT_PHY_ADDR(params->ext_phy_config); + u32 ext_phy_type = XGXS_EXT_PHY_TYPE(params->ext_phy_config); + + /* read modify write pause advertizing */ +@@ -2377,38 +3431,49 @@ + MDIO_AN_DEVAD, + MDIO_AN_REG_ADV_PAUSE, val); + } +- ++static void bnx2x_set_preemphasis(struct link_params *params) ++{ ++ u16 bank, i = 0; ++ struct bnx2x *bp = params->bp; ++ ++ for (bank = MDIO_REG_BANK_RX0, i = 0; bank <= MDIO_REG_BANK_RX3; ++ bank += (MDIO_REG_BANK_RX1-MDIO_REG_BANK_RX0), i++) { ++ CL45_WR_OVER_CL22(bp, params->port, ++ params->phy_addr, ++ bank, ++ MDIO_RX0_RX_EQ_BOOST, ++ params->xgxs_config_rx[i]); ++ } ++ ++ for (bank = MDIO_REG_BANK_TX0, i = 0; bank <= MDIO_REG_BANK_TX3; ++ bank += (MDIO_REG_BANK_TX1 - MDIO_REG_BANK_TX0), i++) { ++ CL45_WR_OVER_CL22(bp, params->port, ++ params->phy_addr, ++ bank, ++ MDIO_TX0_TX_DRIVER, ++ params->xgxs_config_tx[i]); ++ } ++} + + static void bnx2x_init_internal_phy(struct link_params *params, +- struct link_vars *vars) +-{ +- struct bnx2x *bp = params->bp; +- u8 port = params->port; ++ struct link_vars *vars, ++ u8 enable_cl73) ++{ ++ struct bnx2x *bp = params->bp; ++ + if (!(vars->phy_flags & PHY_SGMII_FLAG)) { +- u16 bank, rx_eq; +- +- rx_eq = ((params->serdes_config & +- PORT_HW_CFG_SERDES_RX_DRV_EQUALIZER_MASK) >> +- PORT_HW_CFG_SERDES_RX_DRV_EQUALIZER_SHIFT); +- +- DP(NETIF_MSG_LINK, "setting rx eq to 0x%x\n", rx_eq); +- for (bank = MDIO_REG_BANK_RX0; bank <= MDIO_REG_BANK_RX_ALL; +- bank += (MDIO_REG_BANK_RX1-MDIO_REG_BANK_RX0)) { +- CL45_WR_OVER_CL22(bp, port, +- params->phy_addr, +- bank , +- MDIO_RX0_RX_EQ_BOOST, +- ((rx_eq & +- MDIO_RX0_RX_EQ_BOOST_EQUALIZER_CTRL_MASK) | +- MDIO_RX0_RX_EQ_BOOST_OFFSET_CTRL)); +- } ++ if ((XGXS_EXT_PHY_TYPE(params->ext_phy_config) == ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_DIRECT) && ++ (params->feature_config_flags & ++ FEATURE_CONFIG_OVERRIDE_PREEMPHASIS_ENABLED)) ++ bnx2x_set_preemphasis(params); + + /* forced speed requested? */ + if (vars->line_speed != SPEED_AUTO_NEG) { + DP(NETIF_MSG_LINK, "not SGMII, no AN\n"); + + /* disable autoneg */ +- bnx2x_set_autoneg(params, vars); ++ bnx2x_set_autoneg(params, vars, 0); + + /* program speed and duplex */ + bnx2x_program_serdes(params, vars); +@@ -2424,10 +3489,10 @@ + vars->ieee_fc); + + /* enable autoneg */ +- bnx2x_set_autoneg(params, vars); ++ bnx2x_set_autoneg(params, vars, enable_cl73); + + /* enable and restart AN */ +- bnx2x_restart_autoneg(params); ++ bnx2x_restart_autoneg(params, enable_cl73); + } + + } else { /* SGMII mode */ +@@ -2446,10 +3511,9 @@ + u16 ctrl = 0; + u16 val = 0; + u8 rc = 0; ++ + if (vars->phy_flags & PHY_XGXS_FLAG) { +- ext_phy_addr = ((params->ext_phy_config & +- PORT_HW_CFG_XGXS_EXT_PHY_ADDR_MASK) >> +- PORT_HW_CFG_XGXS_EXT_PHY_ADDR_SHIFT); ++ ext_phy_addr = XGXS_EXT_PHY_ADDR(params->ext_phy_config); + + ext_phy_type = XGXS_EXT_PHY_TYPE(params->ext_phy_config); + /* Make sure that the soft reset is off (expect for the 8072: +@@ -2506,12 +3570,53 @@ + ext_phy_addr, + MDIO_WIS_DEVAD, + MDIO_WIS_REG_LASI_CNTL, 0x1); ++ ++ /* BCM8705 doesn't have microcode, hence the 0 */ ++ bnx2x_save_spirom_version(bp, params->port, ++ params->shmem_base, 0); + break; + + case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8706: +- DP(NETIF_MSG_LINK, "XGXS 8706\n"); +- +- msleep(10); ++ /* Wait until fw is loaded */ ++ for (cnt = 0; cnt < 100; cnt++) { ++ bnx2x_cl45_read(bp, params->port, ext_phy_type, ++ ext_phy_addr, MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_ROM_VER1, &val); ++ if (val) ++ break; ++ msleep(10); ++ } ++ DP(NETIF_MSG_LINK, "XGXS 8706 is initialized " ++ "after %d ms\n", cnt); ++ if ((params->feature_config_flags & ++ FEATURE_CONFIG_OVERRIDE_PREEMPHASIS_ENABLED)) { ++ u8 i; ++ u16 reg; ++ for (i = 0; i < 4; i++) { ++ reg = MDIO_XS_8706_REG_BANK_RX0 + ++ i*(MDIO_XS_8706_REG_BANK_RX1 - ++ MDIO_XS_8706_REG_BANK_RX0); ++ bnx2x_cl45_read(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_XS_DEVAD, ++ reg, &val); ++ /* Clear first 3 bits of the control */ ++ val &= ~0x7; ++ /* Set control bits according to ++ configuation */ ++ val |= (params->xgxs_config_rx[i] & ++ 0x7); ++ DP(NETIF_MSG_LINK, "Setting RX" ++ "Equalizer to BCM8706 reg 0x%x" ++ " <-- val 0x%x\n", reg, val); ++ bnx2x_cl45_write(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_XS_DEVAD, ++ reg, val); ++ } ++ } + /* Force speed */ + /* First enable LASI */ + bnx2x_cl45_write(bp, params->port, +@@ -2534,7 +3639,7 @@ + ext_phy_addr, + MDIO_PMA_DEVAD, + MDIO_PMA_REG_DIGITAL_CTRL, +- 0x400); ++ 0x400); + } else { + /* Force 1Gbps using autoneg with 1G + advertisment */ +@@ -2578,9 +3683,98 @@ + 0x1200); + + } +- +- break; +- ++ bnx2x_save_bcm_spirom_ver(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ params->shmem_base); ++ break; ++ case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8726: ++ DP(NETIF_MSG_LINK, "Initializing BCM8726\n"); ++ bnx2x_bcm8726_external_rom_boot(params); ++ ++ /* Need to call module detected on initialization since ++ the module detection triggered by actual module ++ insertion might occur before driver is loaded, and when ++ driver is loaded, it reset all registers, including the ++ transmitter */ ++ bnx2x_sfp_module_detection(params); ++ ++ /* Set Flow control */ ++ bnx2x_ext_phy_set_pause(params, vars); ++ if (params->req_line_speed == SPEED_1000) { ++ DP(NETIF_MSG_LINK, "Setting 1G force\n"); ++ bnx2x_cl45_write(bp, params->port, ext_phy_type, ++ ext_phy_addr, MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_CTRL, 0x40); ++ bnx2x_cl45_write(bp, params->port, ext_phy_type, ++ ext_phy_addr, MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_10G_CTRL2, 0xD); ++ bnx2x_cl45_write(bp, params->port, ext_phy_type, ++ ext_phy_addr, MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_LASI_CTRL, 0x5); ++ bnx2x_cl45_write(bp, params->port, ext_phy_type, ++ ext_phy_addr, MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_RX_ALARM_CTRL, ++ 0x400); ++ } else if ((params->req_line_speed == ++ SPEED_AUTO_NEG) && ++ ((params->speed_cap_mask & ++ PORT_HW_CFG_SPEED_CAPABILITY_D0_1G))) { ++ DP(NETIF_MSG_LINK, "Setting 1G clause37 \n"); ++ bnx2x_cl45_write(bp, params->port, ext_phy_type, ++ ext_phy_addr, MDIO_AN_DEVAD, ++ MDIO_AN_REG_ADV, 0x20); ++ bnx2x_cl45_write(bp, params->port, ext_phy_type, ++ ext_phy_addr, MDIO_AN_DEVAD, ++ MDIO_AN_REG_CL37_CL73, 0x040c); ++ bnx2x_cl45_write(bp, params->port, ext_phy_type, ++ ext_phy_addr, MDIO_AN_DEVAD, ++ MDIO_AN_REG_CL37_FC_LD, 0x0020); ++ bnx2x_cl45_write(bp, params->port, ext_phy_type, ++ ext_phy_addr, MDIO_AN_DEVAD, ++ MDIO_AN_REG_CL37_AN, 0x1000); ++ bnx2x_cl45_write(bp, params->port, ext_phy_type, ++ ext_phy_addr, MDIO_AN_DEVAD, ++ MDIO_AN_REG_CTRL, 0x1200); ++ ++ /* Enable RX-ALARM control to receive ++ interrupt for 1G speed change */ ++ bnx2x_cl45_write(bp, params->port, ext_phy_type, ++ ext_phy_addr, MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_LASI_CTRL, 0x4); ++ bnx2x_cl45_write(bp, params->port, ext_phy_type, ++ ext_phy_addr, MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_RX_ALARM_CTRL, ++ 0x400); ++ ++ } else { /* Default 10G. Set only LASI control */ ++ bnx2x_cl45_write(bp, params->port, ext_phy_type, ++ ext_phy_addr, MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_LASI_CTRL, 1); ++ } ++ ++ /* Set TX PreEmphasis if needed */ ++ if ((params->feature_config_flags & ++ FEATURE_CONFIG_OVERRIDE_PREEMPHASIS_ENABLED)) { ++ DP(NETIF_MSG_LINK, "Setting TX_CTRL1 0x%x," ++ "TX_CTRL2 0x%x\n", ++ params->xgxs_config_tx[0], ++ params->xgxs_config_tx[1]); ++ bnx2x_cl45_write(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_8726_TX_CTRL1, ++ params->xgxs_config_tx[0]); ++ ++ bnx2x_cl45_write(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_8726_TX_CTRL2, ++ params->xgxs_config_tx[1]); ++ } ++ break; + case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8072: + case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073: + { +@@ -2598,11 +3792,11 @@ + + /* enable LASI */ + bnx2x_cl45_write(bp, params->port, +- ext_phy_type, +- ext_phy_addr, +- MDIO_PMA_DEVAD, +- MDIO_PMA_REG_RX_ALARM_CTRL, +- rx_alarm_ctrl_val); ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_RX_ALARM_CTRL, ++ rx_alarm_ctrl_val); + + bnx2x_cl45_write(bp, params->port, + ext_phy_type, +@@ -2614,20 +3808,18 @@ + bnx2x_8073_set_pause_cl37(params, vars); + + if (ext_phy_type == +- PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8072){ ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8072) + bnx2x_bcm8072_external_rom_boot(params); +- } else { +- ++ else + /* In case of 8073 with long xaui lines, + don't set the 8073 xaui low power*/ + bnx2x_bcm8073_set_xaui_low_power_mode(params); +- } +- +- bnx2x_cl45_read(bp, params->port, +- ext_phy_type, +- ext_phy_addr, +- MDIO_PMA_DEVAD, +- 0xca13, ++ ++ bnx2x_cl45_read(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_M8051_MSGOUT_REG, + &tmp1); + + bnx2x_cl45_read(bp, params->port, +@@ -2686,15 +3878,13 @@ + ext_phy_addr, + MDIO_AN_DEVAD, + MDIO_AN_REG_ADV, val); +- + if (ext_phy_type == + PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073) { +- +- bnx2x_cl45_read(bp, params->port, +- ext_phy_type, +- ext_phy_addr, +- MDIO_AN_DEVAD, +- 0x8329, &tmp1); ++ bnx2x_cl45_read(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_AN_DEVAD, ++ MDIO_AN_REG_8073_2_5G, &tmp1); + + if (((params->speed_cap_mask & + PORT_HW_CFG_SPEED_CAPABILITY_D0_2_5G) && +@@ -2708,7 +3898,7 @@ + PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073, + ext_phy_addr, + MDIO_PMA_DEVAD, +- 0xc801, &phy_ver); ++ MDIO_PMA_REG_8073_CHIP_REV, &phy_ver); + DP(NETIF_MSG_LINK, "Add 2.5G\n"); + if (phy_ver > 0) + tmp1 |= 1; +@@ -2723,7 +3913,7 @@ + ext_phy_type, + ext_phy_addr, + MDIO_AN_DEVAD, +- 0x8329, tmp1); ++ MDIO_AN_REG_8073_2_5G, tmp1); + } + + /* Add support for CL37 (passive mode) II */ +@@ -2797,7 +3987,186 @@ + ((val & (1<<7)) > 0)); + break; + } ++ ++ case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8727: ++ { ++ u16 tmp1; ++ u16 rx_alarm_ctrl_val; ++ u16 lasi_ctrl_val; ++ ++ /* Enable PMD link, MOD_ABS_FLT, and 1G link alarm */ ++ ++ u16 mod_abs; ++ rx_alarm_ctrl_val = (1<<2) | (1<<5) ; ++ lasi_ctrl_val = 0x0004; ++ ++ DP(NETIF_MSG_LINK, "Initializing BCM8727\n"); ++ /* enable LASI */ ++ bnx2x_cl45_write(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_RX_ALARM_CTRL, ++ rx_alarm_ctrl_val); ++ ++ bnx2x_cl45_write(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_LASI_CTRL, ++ lasi_ctrl_val); ++ ++ /* Initially configure MOD_ABS to interrupt when ++ module is presence */ ++ bnx2x_cl45_read(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_PHY_IDENTIFIER, &mod_abs); ++ mod_abs &= ~(1<<8); ++ bnx2x_cl45_write(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_PHY_IDENTIFIER, mod_abs); ++ ++ /* Make MOD_ABS give interrupt on change */ ++ bnx2x_cl45_read(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_8727_PCS_OPT_CTRL, ++ &val); ++ val |= (1<<12); ++ bnx2x_cl45_write(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_8727_PCS_OPT_CTRL, ++ val); ++ ++ /* Set 8727 GPIOs to input to allow reading from the ++ 8727 GPIO0 status which reflect SFP+ module ++ over-current */ ++ ++ bnx2x_cl45_read(bp, params->port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8727, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_8727_PCS_OPT_CTRL, ++ &val); ++ val &= 0xff8f; /* Reset bits 4-6 */ ++ bnx2x_cl45_write(bp, params->port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8727, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_8727_PCS_OPT_CTRL, ++ val); ++ ++ bnx2x_8727_power_module(bp, params, ext_phy_addr, 1); ++ bnx2x_bcm8073_set_xaui_low_power_mode(params); ++ ++ bnx2x_cl45_read(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_M8051_MSGOUT_REG, ++ &tmp1); ++ ++ bnx2x_cl45_read(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_RX_ALARM, &tmp1); ++ ++ /* Set option 1G speed */ ++ if (params->req_line_speed == SPEED_1000) { ++ ++ DP(NETIF_MSG_LINK, "Setting 1G force\n"); ++ bnx2x_cl45_write(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_CTRL, 0x40); ++ bnx2x_cl45_write(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_10G_CTRL2, 0xD); ++ bnx2x_cl45_read(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_10G_CTRL2, &tmp1); ++ DP(NETIF_MSG_LINK, "1.7 = 0x%x \n", tmp1); ++ ++ } else if ((params->req_line_speed == ++ SPEED_AUTO_NEG) && ++ ((params->speed_cap_mask & ++ PORT_HW_CFG_SPEED_CAPABILITY_D0_1G))) { ++ ++ DP(NETIF_MSG_LINK, "Setting 1G clause37 \n"); ++ bnx2x_cl45_write(bp, params->port, ext_phy_type, ++ ext_phy_addr, MDIO_AN_DEVAD, ++ MDIO_PMA_REG_8727_MISC_CTRL, 0); ++ bnx2x_cl45_write(bp, params->port, ext_phy_type, ++ ext_phy_addr, MDIO_AN_DEVAD, ++ MDIO_AN_REG_CL37_AN, 0x1300); ++ } else { ++ /* Since the 8727 has only single reset pin, ++ need to set the 10G registers although it is ++ default */ ++ bnx2x_cl45_write(bp, params->port, ext_phy_type, ++ ext_phy_addr, MDIO_AN_DEVAD, ++ MDIO_AN_REG_CTRL, 0x0020); ++ bnx2x_cl45_write(bp, params->port, ext_phy_type, ++ ext_phy_addr, MDIO_AN_DEVAD, ++ 0x7, 0x0100); ++ bnx2x_cl45_write(bp, params->port, ext_phy_type, ++ ext_phy_addr, MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_CTRL, 0x2040); ++ bnx2x_cl45_write(bp, params->port, ext_phy_type, ++ ext_phy_addr, MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_10G_CTRL2, 0x0008); ++ } ++ ++ /* Set 2-wire transfer rate to 400Khz since 100Khz ++ is not operational */ ++ bnx2x_cl45_write(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_8727_TWO_WIRE_SLAVE_ADDR, ++ 0xa101); ++ ++ /* Set TX PreEmphasis if needed */ ++ if ((params->feature_config_flags & ++ FEATURE_CONFIG_OVERRIDE_PREEMPHASIS_ENABLED)) { ++ DP(NETIF_MSG_LINK, "Setting TX_CTRL1 0x%x," ++ "TX_CTRL2 0x%x\n", ++ params->xgxs_config_tx[0], ++ params->xgxs_config_tx[1]); ++ bnx2x_cl45_write(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_8727_TX_CTRL1, ++ params->xgxs_config_tx[0]); ++ ++ bnx2x_cl45_write(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_8727_TX_CTRL2, ++ params->xgxs_config_tx[1]); ++ } ++ ++ break; ++ } ++ + case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_SFX7101: ++ { ++ u16 fw_ver1, fw_ver2; + DP(NETIF_MSG_LINK, + "Setting the SFX7101 LASI indication\n"); + +@@ -2827,6 +4196,248 @@ + ext_phy_addr, + MDIO_AN_DEVAD, + MDIO_AN_REG_CTRL, val); ++ ++ /* Save spirom version */ ++ bnx2x_cl45_read(bp, params->port, ext_phy_type, ++ ext_phy_addr, MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_7101_VER1, &fw_ver1); ++ ++ bnx2x_cl45_read(bp, params->port, ext_phy_type, ++ ext_phy_addr, MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_7101_VER2, &fw_ver2); ++ ++ bnx2x_save_spirom_version(params->bp, params->port, ++ params->shmem_base, ++ (u32)(fw_ver1<<16 | fw_ver2)); ++ break; ++ } ++ case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481: ++ DP(NETIF_MSG_LINK, ++ "Setting the BCM8481 LASI control\n"); ++ /* This phy uses the NIG latch mechanism since link ++ indication arrives through its LED4 and not via ++ its LASI signal, so we get steady signal ++ instead of clear on read */ ++ bnx2x_bits_en(bp, NIG_REG_LATCH_BC_0 + params->port*4, ++ 1 << NIG_LATCH_BC_ENABLE_MI_INT); ++ ++ /* Enable LED4 when link speed is 10/100/1000 */ ++ /* Bit 15 enables write to the shadow reg */ ++ /* Bits 10..14 sets the shadow reg to LED selector 2 */ ++ /* Bits 4..7 Set the LED2 selector itself to LED4 */ ++ bnx2x_cl45_write(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_AN_DEVAD, ++ MDIO_AN_REG_8481_LEGACY_SHADOW, ++ (1<<15) | (0xe << 10) | (0xc << 4)); ++ /* Enable continous signal to go active on link */ ++ bnx2x_cl45_read(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_8481_LINK_SIGNAL, &val); ++ val &= ~(1<<11); ++ val |= (2<<9); ++ bnx2x_cl45_write(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_8481_LINK_SIGNAL, val); ++ /* Unmask LED4 for 10G link */ ++ bnx2x_cl45_read(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_8481_SIGNAL_MASK, &val); ++ val |= (1<<7); ++ bnx2x_cl45_write(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_8481_SIGNAL_MASK, val); ++ ++ if (params->req_line_speed == SPEED_AUTO_NEG) { ++ ++ u16 autoneg_val, an_1000_val, an_10_100_val; ++ /* set 1000 speed advertisement */ ++ bnx2x_cl45_read(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_AN_DEVAD, ++ MDIO_AN_REG_8481_1000T_CTRL, ++ &an_1000_val); ++ ++ if (params->speed_cap_mask & ++ PORT_HW_CFG_SPEED_CAPABILITY_D0_1G) { ++ an_1000_val |= (1<<8); ++ if (params->req_duplex == DUPLEX_FULL) ++ an_1000_val |= (1<<9); ++ DP(NETIF_MSG_LINK, "Advertising 1G\n"); ++ } else ++ an_1000_val &= ~((1<<8) | (1<<9)); ++ ++ bnx2x_cl45_write(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_AN_DEVAD, ++ MDIO_AN_REG_8481_1000T_CTRL, ++ an_1000_val); ++ ++ /* set 100 speed advertisement */ ++ bnx2x_cl45_read(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_AN_DEVAD, ++ MDIO_AN_REG_8481_LEGACY_AN_ADV, ++ &an_10_100_val); ++ ++ if (params->speed_cap_mask & ++ (PORT_HW_CFG_SPEED_CAPABILITY_D0_100M_FULL | ++ PORT_HW_CFG_SPEED_CAPABILITY_D0_100M_HALF)) { ++ an_10_100_val |= (1<<7); ++ if (params->req_duplex == DUPLEX_FULL) ++ an_10_100_val |= (1<<8); ++ DP(NETIF_MSG_LINK, ++ "Advertising 100M\n"); ++ } else ++ an_10_100_val &= ~((1<<7) | (1<<8)); ++ ++ /* set 10 speed advertisement */ ++ if (params->speed_cap_mask & ++ (PORT_HW_CFG_SPEED_CAPABILITY_D0_10M_FULL | ++ PORT_HW_CFG_SPEED_CAPABILITY_D0_10M_HALF)) { ++ an_10_100_val |= (1<<5); ++ if (params->req_duplex == DUPLEX_FULL) ++ an_10_100_val |= (1<<6); ++ DP(NETIF_MSG_LINK, "Advertising 10M\n"); ++ } ++ else ++ an_10_100_val &= ~((1<<5) | (1<<6)); ++ ++ bnx2x_cl45_write(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_AN_DEVAD, ++ MDIO_AN_REG_8481_LEGACY_AN_ADV, ++ an_10_100_val); ++ ++ bnx2x_cl45_read(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_AN_DEVAD, ++ MDIO_AN_REG_8481_LEGACY_MII_CTRL, ++ &autoneg_val); ++ ++ /* Disable forced speed */ ++ autoneg_val &= ~(1<<6|1<<13); ++ ++ /* Enable autoneg and restart autoneg ++ for legacy speeds */ ++ autoneg_val |= (1<<9|1<<12); ++ ++ if (params->req_duplex == DUPLEX_FULL) ++ autoneg_val |= (1<<8); ++ else ++ autoneg_val &= ~(1<<8); ++ ++ bnx2x_cl45_write(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_AN_DEVAD, ++ MDIO_AN_REG_8481_LEGACY_MII_CTRL, ++ autoneg_val); ++ ++ if (params->speed_cap_mask & ++ PORT_HW_CFG_SPEED_CAPABILITY_D0_10G) { ++ DP(NETIF_MSG_LINK, "Advertising 10G\n"); ++ /* Restart autoneg for 10G*/ ++ bnx2x_cl45_read(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_AN_DEVAD, ++ MDIO_AN_REG_CTRL, &val); ++ val |= 0x200; ++ bnx2x_cl45_write(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_AN_DEVAD, ++ MDIO_AN_REG_CTRL, val); ++ } ++ } else { ++ /* Force speed */ ++ u16 autoneg_ctrl, pma_ctrl; ++ bnx2x_cl45_read(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_AN_DEVAD, ++ MDIO_AN_REG_8481_LEGACY_MII_CTRL, ++ &autoneg_ctrl); ++ ++ /* Disable autoneg */ ++ autoneg_ctrl &= ~(1<<12); ++ ++ /* Set 1000 force */ ++ switch (params->req_line_speed) { ++ case SPEED_10000: ++ DP(NETIF_MSG_LINK, ++ "Unable to set 10G force !\n"); ++ break; ++ case SPEED_1000: ++ bnx2x_cl45_read(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_CTRL, ++ &pma_ctrl); ++ autoneg_ctrl &= ~(1<<13); ++ autoneg_ctrl |= (1<<6); ++ pma_ctrl &= ~(1<<13); ++ pma_ctrl |= (1<<6); ++ DP(NETIF_MSG_LINK, ++ "Setting 1000M force\n"); ++ bnx2x_cl45_write(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_CTRL, ++ pma_ctrl); ++ break; ++ case SPEED_100: ++ autoneg_ctrl |= (1<<13); ++ autoneg_ctrl &= ~(1<<6); ++ DP(NETIF_MSG_LINK, ++ "Setting 100M force\n"); ++ break; ++ case SPEED_10: ++ autoneg_ctrl &= ~(1<<13); ++ autoneg_ctrl &= ~(1<<6); ++ DP(NETIF_MSG_LINK, ++ "Setting 10M force\n"); ++ break; ++ } ++ ++ /* Duplex mode */ ++ if (params->req_duplex == DUPLEX_FULL) { ++ autoneg_ctrl |= (1<<8); ++ DP(NETIF_MSG_LINK, ++ "Setting full duplex\n"); ++ } else ++ autoneg_ctrl &= ~(1<<8); ++ ++ /* Update autoneg ctrl and pma ctrl */ ++ bnx2x_cl45_write(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_AN_DEVAD, ++ MDIO_AN_REG_8481_LEGACY_MII_CTRL, ++ autoneg_ctrl); ++ } ++ ++ /* Save spirom version */ ++ bnx2x_save_8481_spirom_version(bp, params->port, ++ ext_phy_addr, ++ params->shmem_base); + break; + case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_FAILURE: + DP(NETIF_MSG_LINK, +@@ -2860,6 +4471,90 @@ + } + } + return rc; ++} ++ ++static void bnx2x_8727_handle_mod_abs(struct link_params *params) ++{ ++ struct bnx2x *bp = params->bp; ++ u16 mod_abs, rx_alarm_status; ++ u8 ext_phy_addr = XGXS_EXT_PHY_ADDR(params->ext_phy_config); ++ u32 val = REG_RD(bp, params->shmem_base + ++ offsetof(struct shmem_region, dev_info. ++ port_feature_config[params->port]. ++ config)); ++ bnx2x_cl45_read(bp, params->port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8727, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_PHY_IDENTIFIER, &mod_abs); ++ if (mod_abs & (1<<8)) { ++ ++ /* Module is absent */ ++ DP(NETIF_MSG_LINK, "MOD_ABS indication " ++ "show module is absent\n"); ++ ++ /* Set mod_abs to detect next module ++ presence event */ ++ mod_abs &= ~(1<<8); ++ bnx2x_cl45_write(bp, params->port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8727, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_PHY_IDENTIFIER, mod_abs); ++ ++ /* Clear RX alarm since it stays up as long as ++ the mod_abs wasn't changed */ ++ bnx2x_cl45_read(bp, params->port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8727, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_RX_ALARM, &rx_alarm_status); ++ ++ } else { ++ /* Module is present */ ++ DP(NETIF_MSG_LINK, "MOD_ABS indication " ++ "show module is present\n"); ++ /* First thing, disable transmitter, ++ and if the module is ok, the ++ module_detection will enable it*/ ++ ++ /* Set mod_abs to detect next module ++ absent event */ ++ mod_abs |= (1<<8); ++ bnx2x_cl45_write(bp, params->port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8727, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_PHY_IDENTIFIER, mod_abs); ++ ++ /* Clear RX alarm since it stays up as long as ++ the mod_abs wasn't changed. This is need to be done ++ before calling the module detection, otherwise it will clear ++ the link update alarm */ ++ bnx2x_cl45_read(bp, params->port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8727, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_RX_ALARM, &rx_alarm_status); ++ ++ ++ if ((val & PORT_FEAT_CFG_OPT_MDL_ENFRCMNT_MASK) == ++ PORT_FEAT_CFG_OPT_MDL_ENFRCMNT_DISABLE_TX_LASER) ++ bnx2x_sfp_set_transmitter(bp, params->port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8727, ++ ext_phy_addr, 0); ++ ++ if (bnx2x_wait_for_sfp_module_initialized(params) ++ == 0) ++ bnx2x_sfp_module_detection(params); ++ else ++ DP(NETIF_MSG_LINK, "SFP+ module is not initialized\n"); ++ } ++ ++ DP(NETIF_MSG_LINK, "8727 RX_ALARM_STATUS 0x%x\n", ++ rx_alarm_status); ++ /* No need to check link status in case of ++ module plugged in/out */ + } + + +@@ -2873,11 +4568,9 @@ + u16 rx_sd, pcs_status; + u8 ext_phy_link_up = 0; + u8 port = params->port; ++ + if (vars->phy_flags & PHY_XGXS_FLAG) { +- ext_phy_addr = ((params->ext_phy_config & +- PORT_HW_CFG_XGXS_EXT_PHY_ADDR_MASK) >> +- PORT_HW_CFG_XGXS_EXT_PHY_ADDR_SHIFT); +- ++ ext_phy_addr = XGXS_EXT_PHY_ADDR(params->ext_phy_config); + ext_phy_type = XGXS_EXT_PHY_TYPE(params->ext_phy_config); + switch (ext_phy_type) { + case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_DIRECT: +@@ -2903,45 +4596,61 @@ + ext_phy_addr, + MDIO_PMA_DEVAD, + MDIO_PMA_REG_RX_SD, &rx_sd); +- DP(NETIF_MSG_LINK, "8705 rx_sd 0x%x\n", rx_sd); +- ext_phy_link_up = (rx_sd & 0x1); ++ ++ bnx2x_cl45_read(bp, params->port, ext_phy_type, ++ ext_phy_addr, ++ 1, ++ 0xc809, &val1); ++ bnx2x_cl45_read(bp, params->port, ext_phy_type, ++ ext_phy_addr, ++ 1, ++ 0xc809, &val1); ++ ++ DP(NETIF_MSG_LINK, "8705 1.c809 val=0x%x\n", val1); ++ ext_phy_link_up = ((rx_sd & 0x1) && (val1 & (1<<9)) ++ && ((val1 & (1<<8)) == 0)); + if (ext_phy_link_up) + vars->line_speed = SPEED_10000; + break; + + case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8706: +- DP(NETIF_MSG_LINK, "XGXS 8706\n"); +- bnx2x_cl45_read(bp, params->port, ext_phy_type, +- ext_phy_addr, +- MDIO_PMA_DEVAD, +- MDIO_PMA_REG_LASI_STATUS, &val1); +- DP(NETIF_MSG_LINK, "8706 LASI status 0x%x\n", val1); +- +- bnx2x_cl45_read(bp, params->port, ext_phy_type, +- ext_phy_addr, +- MDIO_PMA_DEVAD, +- MDIO_PMA_REG_LASI_STATUS, &val1); +- DP(NETIF_MSG_LINK, "8706 LASI status 0x%x\n", val1); +- +- bnx2x_cl45_read(bp, params->port, ext_phy_type, +- ext_phy_addr, +- MDIO_PMA_DEVAD, +- MDIO_PMA_REG_RX_SD, &rx_sd); +- bnx2x_cl45_read(bp, params->port, ext_phy_type, +- ext_phy_addr, +- MDIO_PCS_DEVAD, +- MDIO_PCS_REG_STATUS, &pcs_status); +- +- bnx2x_cl45_read(bp, params->port, ext_phy_type, +- ext_phy_addr, +- MDIO_AN_DEVAD, +- MDIO_AN_REG_LINK_STATUS, &val2); +- bnx2x_cl45_read(bp, params->port, ext_phy_type, +- ext_phy_addr, +- MDIO_AN_DEVAD, +- MDIO_AN_REG_LINK_STATUS, &val2); +- +- DP(NETIF_MSG_LINK, "8706 rx_sd 0x%x" ++ case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8726: ++ DP(NETIF_MSG_LINK, "XGXS 8706/8726\n"); ++ /* Clear RX Alarm*/ ++ bnx2x_cl45_read(bp, params->port, ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, MDIO_PMA_REG_RX_ALARM, ++ &val2); ++ /* clear LASI indication*/ ++ bnx2x_cl45_read(bp, params->port, ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, MDIO_PMA_REG_LASI_STATUS, ++ &val1); ++ bnx2x_cl45_read(bp, params->port, ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, MDIO_PMA_REG_LASI_STATUS, ++ &val2); ++ DP(NETIF_MSG_LINK, "8706/8726 LASI status 0x%x-->" ++ "0x%x\n", val1, val2); ++ ++ bnx2x_cl45_read(bp, params->port, ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, MDIO_PMA_REG_RX_SD, ++ &rx_sd); ++ bnx2x_cl45_read(bp, params->port, ext_phy_type, ++ ext_phy_addr, ++ MDIO_PCS_DEVAD, MDIO_PCS_REG_STATUS, ++ &pcs_status); ++ bnx2x_cl45_read(bp, params->port, ext_phy_type, ++ ext_phy_addr, ++ MDIO_AN_DEVAD, MDIO_AN_REG_LINK_STATUS, ++ &val2); ++ bnx2x_cl45_read(bp, params->port, ext_phy_type, ++ ext_phy_addr, ++ MDIO_AN_DEVAD, MDIO_AN_REG_LINK_STATUS, ++ &val2); ++ ++ DP(NETIF_MSG_LINK, "8706/8726 rx_sd 0x%x" + " pcs_status 0x%x 1Gbps link_status 0x%x\n", + rx_sd, pcs_status, val2); + /* link is up if both bit 0 of pmd_rx_sd and +@@ -2951,40 +4660,203 @@ + ext_phy_link_up = ((rx_sd & pcs_status & 0x1) || + (val2 & (1<<1))); + if (ext_phy_link_up) { ++ if (ext_phy_type == ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8726) { ++ /* If transmitter is disabled, ++ ignore false link up indication */ ++ bnx2x_cl45_read(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_PHY_IDENTIFIER, ++ &val1); ++ if (val1 & (1<<15)) { ++ DP(NETIF_MSG_LINK, "Tx is " ++ "disabled\n"); ++ ext_phy_link_up = 0; ++ break; ++ } ++ } + if (val2 & (1<<1)) + vars->line_speed = SPEED_1000; + else + vars->line_speed = SPEED_10000; + } +- +- /* clear LASI indication*/ +- bnx2x_cl45_read(bp, params->port, ext_phy_type, +- ext_phy_addr, +- MDIO_PMA_DEVAD, +- MDIO_PMA_REG_RX_ALARM, &val2); +- break; ++ break; ++ ++ case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8727: ++ { ++ u16 link_status = 0; ++ u16 rx_alarm_status; ++ /* Check the LASI */ ++ bnx2x_cl45_read(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_RX_ALARM, &rx_alarm_status); ++ ++ DP(NETIF_MSG_LINK, "8727 RX_ALARM_STATUS 0x%x\n", ++ rx_alarm_status); ++ ++ bnx2x_cl45_read(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_LASI_STATUS, &val1); ++ ++ DP(NETIF_MSG_LINK, ++ "8727 LASI status 0x%x\n", ++ val1); ++ ++ /* Clear MSG-OUT */ ++ bnx2x_cl45_read(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_M8051_MSGOUT_REG, ++ &val1); ++ ++ /* ++ * If a module is present and there is need to check ++ * for over current ++ */ ++ if (!(params->feature_config_flags & ++ FEATURE_CONFIG_BCM8727_NOC) && ++ !(rx_alarm_status & (1<<5))) { ++ /* Check over-current using 8727 GPIO0 input*/ ++ bnx2x_cl45_read(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_8727_GPIO_CTRL, ++ &val1); ++ ++ if ((val1 & (1<<8)) == 0) { ++ DP(NETIF_MSG_LINK, "8727 Power fault has" ++ " been detected on port %d\n", ++ params->port); ++ printk(KERN_ERR PFX "Error: Power" ++ " fault on %s Port %d has" ++ " been detected and the" ++ " power to that SFP+ module" ++ " has been removed to prevent" ++ " failure of the card. Please" ++ " remove the SFP+ module and" ++ " restart the system to clear" ++ " this error.\n" ++ , bp->dev->name, params->port); ++ /* ++ * Disable all RX_ALARMs except for ++ * mod_abs ++ */ ++ bnx2x_cl45_write(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_RX_ALARM_CTRL, ++ (1<<5)); ++ ++ bnx2x_cl45_read(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_PHY_IDENTIFIER, ++ &val1); ++ /* Wait for module_absent_event */ ++ val1 |= (1<<8); ++ bnx2x_cl45_write(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_PHY_IDENTIFIER, ++ val1); ++ /* Clear RX alarm */ ++ bnx2x_cl45_read(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_RX_ALARM, ++ &rx_alarm_status); ++ break; ++ } ++ } /* Over current check */ ++ ++ /* When module absent bit is set, check module */ ++ if (rx_alarm_status & (1<<5)) { ++ bnx2x_8727_handle_mod_abs(params); ++ /* Enable all mod_abs and link detection bits */ ++ bnx2x_cl45_write(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_RX_ALARM_CTRL, ++ ((1<<5) | (1<<2))); ++ } ++ ++ /* If transmitter is disabled, ++ ignore false link up indication */ ++ bnx2x_cl45_read(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_PHY_IDENTIFIER, ++ &val1); ++ if (val1 & (1<<15)) { ++ DP(NETIF_MSG_LINK, "Tx is disabled\n"); ++ ext_phy_link_up = 0; ++ break; ++ } ++ ++ bnx2x_cl45_read(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_8073_SPEED_LINK_STATUS, ++ &link_status); ++ ++ /* Bits 0..2 --> speed detected, ++ bits 13..15--> link is down */ ++ if ((link_status & (1<<2)) && ++ (!(link_status & (1<<15)))) { ++ ext_phy_link_up = 1; ++ vars->line_speed = SPEED_10000; ++ } else if ((link_status & (1<<0)) && ++ (!(link_status & (1<<13)))) { ++ ext_phy_link_up = 1; ++ vars->line_speed = SPEED_1000; ++ DP(NETIF_MSG_LINK, ++ "port %x: External link" ++ " up in 1G\n", params->port); ++ } else { ++ ext_phy_link_up = 0; ++ DP(NETIF_MSG_LINK, ++ "port %x: External link" ++ " is down\n", params->port); ++ } ++ break; ++ } + + case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8072: + case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073: + { + u16 link_status = 0; + u16 an1000_status = 0; ++ + if (ext_phy_type == + PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8072) { + bnx2x_cl45_read(bp, params->port, +- ext_phy_type, +- ext_phy_addr, +- MDIO_PCS_DEVAD, +- MDIO_PCS_REG_LASI_STATUS, &val1); +- bnx2x_cl45_read(bp, params->port, +- ext_phy_type, +- ext_phy_addr, +- MDIO_PCS_DEVAD, +- MDIO_PCS_REG_LASI_STATUS, &val2); +- DP(NETIF_MSG_LINK, +- "870x LASI status 0x%x->0x%x\n", +- val1, val2); +- ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PCS_DEVAD, ++ MDIO_PCS_REG_LASI_STATUS, &val1); ++ bnx2x_cl45_read(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PCS_DEVAD, ++ MDIO_PCS_REG_LASI_STATUS, &val2); ++ DP(NETIF_MSG_LINK, ++ "870x LASI status 0x%x->0x%x\n", ++ val1, val2); + } else { + /* In 8073, port1 is directed through emac0 and + * port0 is directed through emac1 +@@ -3012,13 +4884,13 @@ + MDIO_PCS_DEVAD, + MDIO_PCS_REG_STATUS, &val1); + DP(NETIF_MSG_LINK, "807x PCS status 0x%x->0x%x\n", +- val2, val1); ++ val2, val1); + /* Clear MSG-OUT */ + bnx2x_cl45_read(bp, params->port, + ext_phy_type, + ext_phy_addr, + MDIO_PMA_DEVAD, +- 0xca13, ++ MDIO_PMA_REG_M8051_MSGOUT_REG, + &val1); + + /* Check the LASI */ +@@ -3063,17 +4935,17 @@ + } + } + bnx2x_cl45_read(bp, params->port, +- ext_phy_type, +- ext_phy_addr, +- MDIO_AN_DEVAD, +- 0x8304, +- &an1000_status); +- bnx2x_cl45_read(bp, params->port, +- ext_phy_type, +- ext_phy_addr, +- MDIO_AN_DEVAD, +- 0x8304, +- &an1000_status); ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_AN_DEVAD, ++ MDIO_AN_REG_LINK_STATUS, ++ &an1000_status); ++ bnx2x_cl45_read(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_AN_DEVAD, ++ MDIO_AN_REG_LINK_STATUS, ++ &an1000_status); + + /* Check the link status on 1.1.2 */ + bnx2x_cl45_read(bp, params->port, +@@ -3090,7 +4962,7 @@ + "an_link_status=0x%x\n", + val2, val1, an1000_status); + +- ext_phy_link_up = (((val1 & 4) == 4) || ++ ext_phy_link_up = (((val1 & 4) == 4) || + (an1000_status & (1<<1))); + if (ext_phy_link_up && + bnx2x_8073_is_snr_needed(params)) { +@@ -3110,19 +4982,17 @@ + /* Change CDR Bandwidth in EDC + register */ + bnx2x_cl45_write(bp, port, ext_phy_type, +- ext_phy_addr, +- MDIO_PMA_DEVAD, +- MDIO_PMA_REG_CDR_BANDWIDTH, +- 0x0333); +- +- +- } +- bnx2x_cl45_read(bp, params->port, +- ext_phy_type, +- ext_phy_addr, +- MDIO_PMA_DEVAD, +- 0xc820, +- &link_status); ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_CDR_BANDWIDTH, ++ 0x0333); ++ } ++ bnx2x_cl45_read(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_8073_SPEED_LINK_STATUS, ++ &link_status); + + /* Bits 0..2 --> speed detected, + bits 13..15--> link is down */ +@@ -3156,17 +5026,17 @@ + } else { + /* See if 1G link is up for the 8072 */ + bnx2x_cl45_read(bp, params->port, +- ext_phy_type, +- ext_phy_addr, +- MDIO_AN_DEVAD, +- 0x8304, +- &an1000_status); +- bnx2x_cl45_read(bp, params->port, +- ext_phy_type, +- ext_phy_addr, +- MDIO_AN_DEVAD, +- 0x8304, +- &an1000_status); ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_AN_DEVAD, ++ MDIO_AN_REG_LINK_STATUS, ++ &an1000_status); ++ bnx2x_cl45_read(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_AN_DEVAD, ++ MDIO_AN_REG_LINK_STATUS, ++ &an1000_status); + if (an1000_status & (1<<1)) { + ext_phy_link_up = 1; + vars->line_speed = SPEED_1000; +@@ -3226,7 +5096,74 @@ + (val2 & (1<<14))); + } + break; +- ++ case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481: ++ /* Clear LASI interrupt. (Obsolete) */ ++ ++ DP(NETIF_MSG_LINK, "8481 LASI status reg = 0x%x\n", ++ val1); ++ ++ /* Check 10G-BaseT link status */ ++ /* Check PMD signal ok */ ++ bnx2x_cl45_read(bp, params->port, ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_8481_PMD_SIGNAL, ++ &val2); ++ ++ /* Check link 10G */ ++ if (val2 & (1<<11)) { ++ vars->line_speed = SPEED_10000; ++ ext_phy_link_up = 1; ++ } else { /* Check Legacy speed link */ ++ u16 legacy_status, legacy_speed; ++ ++ /* Enable expansion register 0x42 ++ (Operation mode status) */ ++ bnx2x_cl45_write(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_AN_DEVAD, ++ MDIO_AN_REG_8481_EXPANSION_REG_ACCESS, ++ 0xf42); ++ ++ /* Get legacy speed operation status */ ++ bnx2x_cl45_read(bp, params->port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_AN_DEVAD, ++ MDIO_AN_REG_8481_EXPANSION_REG_RD_RW, ++ &legacy_status); ++ ++ DP(NETIF_MSG_LINK, "Legacy speed status" ++ " = 0x%x\n", legacy_status); ++ ext_phy_link_up = ((legacy_status & (1<<11)) ++ == (1<<11)); ++ if (ext_phy_link_up) { ++ legacy_speed = (legacy_status & (3<<9)); ++ if (legacy_speed == (0<<9)) ++ vars->line_speed = SPEED_10; ++ else if (legacy_speed == (1<<9)) ++ vars->line_speed = ++ SPEED_100; ++ else if (legacy_speed == (2<<9)) ++ vars->line_speed = ++ SPEED_1000; ++ else /* Should not happen */ ++ vars->line_speed = 0; ++ ++ if (legacy_status & (1<<8)) ++ vars->duplex = DUPLEX_FULL; ++ else ++ vars->duplex = DUPLEX_HALF; ++ ++ DP(NETIF_MSG_LINK, "Link is up " ++ "in %dMbps, is_duplex_full" ++ "= %d\n", ++ vars->line_speed, ++ (vars->duplex == DUPLEX_FULL)); ++ } ++ } ++ break; + default: + DP(NETIF_MSG_LINK, "BAD XGXS ext_phy_config 0x%x\n", + params->ext_phy_config); +@@ -3265,6 +5202,7 @@ + u32 ext_phy_type; + u32 mask; + struct bnx2x *bp = params->bp; ++ + /* setting the status to report on link up + for either XGXS or SerDes */ + +@@ -3294,27 +5232,62 @@ + } + } + bnx2x_bits_en(bp, +- NIG_REG_MASK_INTERRUPT_PORT0 + port*4, +- mask); +- DP(NETIF_MSG_LINK, "port %x, is_xgxs=%x, int_status 0x%x\n", port, ++ NIG_REG_MASK_INTERRUPT_PORT0 + port*4, ++ mask); ++ ++ DP(NETIF_MSG_LINK, "port %x, is_xgxs %x, int_status 0x%x\n", port, + (params->switch_cfg == SWITCH_CFG_10G), + REG_RD(bp, NIG_REG_STATUS_INTERRUPT_PORT0 + port*4)); +- + DP(NETIF_MSG_LINK, " int_mask 0x%x, MI_INT %x, SERDES_LINK %x\n", + REG_RD(bp, NIG_REG_MASK_INTERRUPT_PORT0 + port*4), + REG_RD(bp, NIG_REG_EMAC0_STATUS_MISC_MI_INT + port*0x18), + REG_RD(bp, NIG_REG_SERDES0_STATUS_LINK_STATUS+port*0x3c)); + DP(NETIF_MSG_LINK, " 10G %x, XGXS_LINK %x\n", +- REG_RD(bp, NIG_REG_XGXS0_STATUS_LINK10G + port*0x68), +- REG_RD(bp, NIG_REG_XGXS0_STATUS_LINK_STATUS + port*0x68)); +-} +- +- ++ REG_RD(bp, NIG_REG_XGXS0_STATUS_LINK10G + port*0x68), ++ REG_RD(bp, NIG_REG_XGXS0_STATUS_LINK_STATUS + port*0x68)); ++} ++ ++static void bnx2x_8481_rearm_latch_signal(struct bnx2x *bp, u8 port, ++ u8 is_mi_int) ++{ ++ u32 latch_status = 0, is_mi_int_status; ++ /* Disable the MI INT ( external phy int ) ++ * by writing 1 to the status register. Link down indication ++ * is high-active-signal, so in this case we need to write the ++ * status to clear the XOR ++ */ ++ /* Read Latched signals */ ++ latch_status = REG_RD(bp, ++ NIG_REG_LATCH_STATUS_0 + port*8); ++ is_mi_int_status = REG_RD(bp, ++ NIG_REG_STATUS_INTERRUPT_PORT0 + port*4); ++ DP(NETIF_MSG_LINK, "original_signal = 0x%x, nig_status = 0x%x," ++ "latch_status = 0x%x\n", ++ is_mi_int, is_mi_int_status, latch_status); ++ /* Handle only those with latched-signal=up.*/ ++ if (latch_status & 1) { ++ /* For all latched-signal=up,Write original_signal to status */ ++ if (is_mi_int) ++ bnx2x_bits_en(bp, ++ NIG_REG_STATUS_INTERRUPT_PORT0 ++ + port*4, ++ NIG_STATUS_EMAC0_MI_INT); ++ else ++ bnx2x_bits_dis(bp, ++ NIG_REG_STATUS_INTERRUPT_PORT0 ++ + port*4, ++ NIG_STATUS_EMAC0_MI_INT); ++ /* For all latched-signal=up : Re-Arm Latch signals */ ++ REG_WR(bp, NIG_REG_LATCH_STATUS_0 + port*8, ++ (latch_status & 0xfffe) | (latch_status & 1)); ++ } ++} + /* + * link management + */ + static void bnx2x_link_int_ack(struct link_params *params, +- struct link_vars *vars, u8 is_10g) ++ struct link_vars *vars, u8 is_10g, ++ u8 is_mi_int) + { + struct bnx2x *bp = params->bp; + u8 port = params->port; +@@ -3325,6 +5298,10 @@ + (NIG_STATUS_XGXS0_LINK10G | + NIG_STATUS_XGXS0_LINK_STATUS | + NIG_STATUS_SERDES0_LINK_STATUS)); ++ if (XGXS_EXT_PHY_TYPE(params->ext_phy_config) ++ == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481) { ++ bnx2x_8481_rearm_latch_signal(bp, port, is_mi_int); ++ } + if (vars->phy_link_up) { + if (is_10g) { + /* Disable the 10G link interrupt +@@ -3332,8 +5309,8 @@ + */ + DP(NETIF_MSG_LINK, "10G XGXS phy link up\n"); + bnx2x_bits_en(bp, +- NIG_REG_STATUS_INTERRUPT_PORT0 + port*4, +- NIG_STATUS_XGXS0_LINK10G); ++ NIG_REG_STATUS_INTERRUPT_PORT0 + port*4, ++ NIG_STATUS_XGXS0_LINK10G); + + } else if (params->switch_cfg == SWITCH_CFG_10G) { + /* Disable the link interrupt +@@ -3344,11 +5321,12 @@ + PORT_HW_CFG_LANE_SWAP_CFG_MASTER_MASK) >> + PORT_HW_CFG_LANE_SWAP_CFG_MASTER_SHIFT); + +- DP(NETIF_MSG_LINK, "1G XGXS phy link up\n"); ++ DP(NETIF_MSG_LINK, "%d speed XGXS phy link up\n", ++ vars->line_speed); + bnx2x_bits_en(bp, +- NIG_REG_STATUS_INTERRUPT_PORT0 + port*4, +- ((1 << ser_lane) << +- NIG_STATUS_XGXS0_LINK_STATUS_SIZE)); ++ NIG_REG_STATUS_INTERRUPT_PORT0 + port*4, ++ ((1 << ser_lane) << ++ NIG_STATUS_XGXS0_LINK_STATUS_SIZE)); + + } else { /* SerDes */ + DP(NETIF_MSG_LINK, "SerDes phy link up\n"); +@@ -3356,8 +5334,8 @@ + * by writing 1 to the status register + */ + bnx2x_bits_en(bp, +- NIG_REG_STATUS_INTERRUPT_PORT0 + port*4, +- NIG_STATUS_SERDES0_LINK_STATUS); ++ NIG_REG_STATUS_INTERRUPT_PORT0 + port*4, ++ NIG_STATUS_SERDES0_LINK_STATUS); + } + + } else { /* link_down */ +@@ -3394,12 +5372,12 @@ + return 0; + } + +- + static void bnx2x_turn_on_ef(struct bnx2x *bp, u8 port, u8 ext_phy_addr, + u32 ext_phy_type) + { + u32 cnt = 0; + u16 ctrl = 0; ++ + /* Enable EMAC0 in to enable MDIO */ + REG_WR(bp, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_2_SET, + (MISC_REGISTERS_RESET_REG_2_RST_EMAC0_HARD_CORE << port)); +@@ -3426,7 +5404,7 @@ + ext_phy_addr, + MDIO_PMA_DEVAD, + MDIO_PMA_REG_CTRL, +- &ctrl); ++ &ctrl); + if (!(ctrl & (1<<15))) { + DP(NETIF_MSG_LINK, "Reset completed\n\n"); + break; +@@ -3452,91 +5430,44 @@ + { + struct bnx2x *bp = params->bp; + u32 ext_phy_type = 0; +- u16 val = 0; +- u8 ext_phy_addr = 0 ; +- u8 status = 0 ; +- u32 ver_num; ++ u32 spirom_ver = 0; ++ u8 status = 0; + + if (version == NULL || params == NULL) + return -EINVAL; ++ ++ spirom_ver = REG_RD(bp, params->shmem_base + ++ offsetof(struct shmem_region, ++ port_mb[params->port].ext_phy_fw_version)); + + /* reset the returned value to zero */ + ext_phy_type = XGXS_EXT_PHY_TYPE(params->ext_phy_config); +- ext_phy_addr = ((params->ext_phy_config & +- PORT_HW_CFG_XGXS_EXT_PHY_ADDR_MASK) >> +- PORT_HW_CFG_XGXS_EXT_PHY_ADDR_SHIFT); +- + switch (ext_phy_type) { + case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_SFX7101: + + if (len < 5) + return -EINVAL; + +- /* Take ext phy out of reset */ +- if (!driver_loaded) +- bnx2x_turn_on_ef(bp, params->port, ext_phy_addr, +- ext_phy_type); +- +- /* wait for 1ms */ +- msleep(1); +- +- bnx2x_cl45_read(bp, params->port, +- ext_phy_type, +- ext_phy_addr, +- MDIO_PMA_DEVAD, +- MDIO_PMA_REG_7101_VER1, &val); +- version[2] = (val & 0xFF); +- version[3] = ((val & 0xFF00)>>8); +- +- bnx2x_cl45_read(bp, params->port, +- ext_phy_type, +- ext_phy_addr, +- MDIO_PMA_DEVAD, MDIO_PMA_REG_7101_VER2, +- &val); +- version[0] = (val & 0xFF); +- version[1] = ((val & 0xFF00)>>8); ++ version[0] = (spirom_ver & 0xFF); ++ version[1] = (spirom_ver & 0xFF00) >> 8; ++ version[2] = (spirom_ver & 0xFF0000) >> 16; ++ version[3] = (spirom_ver & 0xFF000000) >> 24; + version[4] = '\0'; + +- if (!driver_loaded) +- bnx2x_turn_off_sf(bp, params->port); + break; + case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8072: + case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073: +- { +- /* Take ext phy out of reset */ +- if (!driver_loaded) +- bnx2x_turn_on_ef(bp, params->port, ext_phy_addr, +- ext_phy_type); +- +- bnx2x_cl45_read(bp, params->port, ext_phy_type, +- ext_phy_addr, +- MDIO_PMA_DEVAD, +- MDIO_PMA_REG_ROM_VER1, &val); +- ver_num = val<<16; +- bnx2x_cl45_read(bp, params->port, ext_phy_type, +- ext_phy_addr, +- MDIO_PMA_DEVAD, +- MDIO_PMA_REG_ROM_VER2, &val); +- ver_num |= val; +- status = bnx2x_format_ver(ver_num, version, len); +- break; +- } ++ case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8727: + case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8705: + case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8706: +- +- bnx2x_cl45_read(bp, params->port, ext_phy_type, +- ext_phy_addr, +- MDIO_PMA_DEVAD, +- MDIO_PMA_REG_ROM_VER1, &val); +- ver_num = val<<16; +- bnx2x_cl45_read(bp, params->port, ext_phy_type, +- ext_phy_addr, +- MDIO_PMA_DEVAD, +- MDIO_PMA_REG_ROM_VER2, &val); +- ver_num |= val; +- status = bnx2x_format_ver(ver_num, version, len); +- break; +- ++ case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8726: ++ status = bnx2x_format_ver(spirom_ver, version, len); ++ break; ++ case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481: ++ spirom_ver = ((spirom_ver & 0xF80) >> 7) << 16 | ++ (spirom_ver & 0x7F); ++ status = bnx2x_format_ver(spirom_ver, version, len); ++ break; + case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_DIRECT: + break; + +@@ -3620,10 +5551,8 @@ + + if (params->switch_cfg == SWITCH_CFG_10G) { + ext_phy_type = XGXS_EXT_PHY_TYPE(params->ext_phy_config); ++ ext_phy_addr = XGXS_EXT_PHY_ADDR(params->ext_phy_config); + /* CL37 Autoneg Enabled */ +- ext_phy_addr = ((params->ext_phy_config & +- PORT_HW_CFG_XGXS_EXT_PHY_ADDR_MASK) >> +- PORT_HW_CFG_XGXS_EXT_PHY_ADDR_SHIFT); + switch (ext_phy_type) { + case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_DIRECT: + case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_NOT_CONN: +@@ -3635,6 +5564,14 @@ + break; + case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8706: + DP(NETIF_MSG_LINK, "ext_phy_loopback: 8706\n"); ++ break; ++ case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8726: ++ DP(NETIF_MSG_LINK, "PMA/PMD ext_phy_loopback: 8726\n"); ++ bnx2x_cl45_write(bp, params->port, ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_CTRL, ++ 0x0001); + break; + case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_SFX7101: + /* SFX7101_XGXS_TEST1 */ +@@ -3782,6 +5719,7 @@ + u8 rc = 0; + u32 tmp; + u32 emac_base = port ? GRCBASE_EMAC1 : GRCBASE_EMAC0; ++ + DP(NETIF_MSG_LINK, "bnx2x_set_led: port %x, mode %d\n", port, mode); + DP(NETIF_MSG_LINK, "speed 0x%x, hw_led_mode 0x%x\n", + speed, hw_led_mode); +@@ -3808,7 +5746,7 @@ + EMAC_WR(bp, EMAC_REG_EMAC_LED, + (tmp & (~EMAC_LED_OVERRIDE))); + +- if (!CHIP_IS_E1H(bp) && ++ if (CHIP_IS_E1(bp) && + ((speed == SPEED_2500) || + (speed == SPEED_1000) || + (speed == SPEED_100) || +@@ -3860,6 +5798,7 @@ + u8 rc = 0; + u8 non_ext_phy; + u32 ext_phy_type = XGXS_EXT_PHY_TYPE(params->ext_phy_config); ++ + /* Activate the external PHY */ + bnx2x_ext_phy_reset(params, vars); + +@@ -3906,14 +5845,15 @@ + + /* init ext phy and enable link state int */ + non_ext_phy = ((ext_phy_type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_DIRECT) || +- (params->loopback_mode == LOOPBACK_XGXS_10) || +- (params->loopback_mode == LOOPBACK_EXT_PHY)); ++ (params->loopback_mode == LOOPBACK_XGXS_10)); + + if (non_ext_phy || +- (ext_phy_type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8705)) { ++ (ext_phy_type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8705) || ++ (ext_phy_type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8726) || ++ (params->loopback_mode == LOOPBACK_EXT_PHY)) { + if (params->req_line_speed == SPEED_AUTO_NEG) + bnx2x_set_parallel_detection(params, vars->phy_flags); +- bnx2x_init_internal_phy(params, vars); ++ bnx2x_init_internal_phy(params, vars, 0); + } + + if (!non_ext_phy) +@@ -3932,24 +5872,23 @@ + u8 bnx2x_phy_init(struct link_params *params, struct link_vars *vars) + { + struct bnx2x *bp = params->bp; +- +- u32 val; +- DP(NETIF_MSG_LINK, "Phy Initialization started \n"); +- DP(NETIF_MSG_LINK, "req_speed = %d, req_flowctrl=%d\n", +- params->req_line_speed, params->req_flow_ctrl); ++ u32 val; ++ ++ DP(NETIF_MSG_LINK, "Phy Initialization started\n"); ++ DP(NETIF_MSG_LINK, "req_speed %d, req_flowctrl %d\n", ++ params->req_line_speed, params->req_flow_ctrl); + vars->link_status = 0; + vars->phy_link_up = 0; + vars->link_up = 0; + vars->line_speed = 0; + vars->duplex = DUPLEX_FULL; +- vars->flow_ctrl = FLOW_CTRL_NONE; ++ vars->flow_ctrl = BNX2X_FLOW_CTRL_NONE; + vars->mac_type = MAC_TYPE_NONE; + + if (params->switch_cfg == SWITCH_CFG_1G) + vars->phy_flags = PHY_SERDES_FLAG; + else + vars->phy_flags = PHY_XGXS_FLAG; +- + + /* disable attentions */ + bnx2x_bits_dis(bp, NIG_REG_MASK_INTERRUPT_PORT0 + params->port*4, +@@ -3961,25 +5900,28 @@ + bnx2x_emac_init(params, vars); + + if (CHIP_REV_IS_FPGA(bp)) { ++ + vars->link_up = 1; + vars->line_speed = SPEED_10000; + vars->duplex = DUPLEX_FULL; +- vars->flow_ctrl = FLOW_CTRL_NONE; ++ vars->flow_ctrl = BNX2X_FLOW_CTRL_NONE; + vars->link_status = (LINK_STATUS_LINK_UP | LINK_10GTFD); + /* enable on E1.5 FPGA */ +- if (CHIP_IS_E1H(bp)) { ++ if (!CHIP_IS_E1(bp)) { + vars->flow_ctrl |= +- (FLOW_CTRL_TX | FLOW_CTRL_RX); ++ (BNX2X_FLOW_CTRL_TX | ++ BNX2X_FLOW_CTRL_RX); + vars->link_status |= + (LINK_STATUS_TX_FLOW_CONTROL_ENABLED | + LINK_STATUS_RX_FLOW_CONTROL_ENABLED); + } + + bnx2x_emac_enable(params, vars, 0); +- bnx2x_pbf_update(params, vars->flow_ctrl, vars->line_speed); ++ if (!(CHIP_IS_E2_NOT_PHASE0(params->chip_id))) ++ bnx2x_pbf_update(params, vars->flow_ctrl, ++ vars->line_speed); + /* disable drain */ +- REG_WR(bp, NIG_REG_EGRESS_DRAIN0_MODE +- + params->port*4, 0); ++ REG_WR(bp, NIG_REG_EGRESS_DRAIN0_MODE + params->port*4, 0); + + /* update shared memory */ + bnx2x_update_mng(params, vars->link_status); +@@ -3992,12 +5934,14 @@ + vars->link_up = 1; + vars->line_speed = SPEED_10000; + vars->duplex = DUPLEX_FULL; +- vars->flow_ctrl = FLOW_CTRL_NONE; ++ vars->flow_ctrl = BNX2X_FLOW_CTRL_NONE; + vars->link_status = (LINK_STATUS_LINK_UP | LINK_10GTFD); + + bnx2x_bmac_enable(params, vars, 0); + +- bnx2x_pbf_update(params, vars->flow_ctrl, vars->line_speed); ++ if (!(CHIP_IS_E2_NOT_PHASE0(params->chip_id))) ++ bnx2x_pbf_update(params, vars->flow_ctrl, ++ vars->line_speed); + /* Disable drain */ + REG_WR(bp, NIG_REG_EGRESS_DRAIN0_MODE + + params->port*4, 0); +@@ -4009,10 +5953,11 @@ + + } else + if (params->loopback_mode == LOOPBACK_BMAC) { ++ + vars->link_up = 1; + vars->line_speed = SPEED_10000; + vars->duplex = DUPLEX_FULL; +- vars->flow_ctrl = FLOW_CTRL_NONE; ++ vars->flow_ctrl = BNX2X_FLOW_CTRL_NONE; + vars->mac_type = MAC_TYPE_BMAC; + + vars->phy_flags = PHY_XGXS_FLAG; +@@ -4022,12 +5967,14 @@ + bnx2x_bmac_enable(params, vars, 1); + + REG_WR(bp, NIG_REG_EGRESS_DRAIN0_MODE + +- params->port*4, 0); ++ params->port*4, 0); ++ + } else if (params->loopback_mode == LOOPBACK_EMAC) { ++ + vars->link_up = 1; + vars->line_speed = SPEED_1000; + vars->duplex = DUPLEX_FULL; +- vars->flow_ctrl = FLOW_CTRL_NONE; ++ vars->flow_ctrl = BNX2X_FLOW_CTRL_NONE; + vars->mac_type = MAC_TYPE_EMAC; + + vars->phy_flags = PHY_XGXS_FLAG; +@@ -4038,13 +5985,15 @@ + bnx2x_emac_program(params, vars->line_speed, + vars->duplex); + REG_WR(bp, NIG_REG_EGRESS_DRAIN0_MODE + +- params->port*4, 0); ++ params->port*4, 0); ++ + } else if ((params->loopback_mode == LOOPBACK_XGXS_10) || +- (params->loopback_mode == LOOPBACK_EXT_PHY)) { ++ (params->loopback_mode == LOOPBACK_EXT_PHY)) { ++ + vars->link_up = 1; + vars->line_speed = SPEED_10000; + vars->duplex = DUPLEX_FULL; +- vars->flow_ctrl = FLOW_CTRL_NONE; ++ vars->flow_ctrl = BNX2X_FLOW_CTRL_NONE; + + vars->phy_flags = PHY_XGXS_FLAG; + +@@ -4069,10 +6018,14 @@ + } + REG_WR(bp, NIG_REG_EGRESS_DRAIN0_MODE + + params->port*4, 0); ++ ++ bnx2x_set_led(bp, params->port, LED_MODE_OPER, ++ vars->line_speed, params->hw_led_mode, ++ params->chip_id); ++ + } else + /* No loopback */ + { +- + bnx2x_phy_deassert(params, vars->phy_flags); + switch (params->switch_cfg) { + case SWITCH_CFG_1G: +@@ -4080,8 +6033,7 @@ + if ((params->ext_phy_config & + PORT_HW_CFG_SERDES_EXT_PHY_TYPE_MASK) == + PORT_HW_CFG_SERDES_EXT_PHY_TYPE_BCM5482) { +- vars->phy_flags |= +- PHY_SGMII_FLAG; ++ vars->phy_flags |= PHY_SGMII_FLAG; + } + + val = REG_RD(bp, +@@ -4102,8 +6054,8 @@ + default: + DP(NETIF_MSG_LINK, "Invalid switch_cfg\n"); + return -EINVAL; +- break; +- } ++ } ++ DP(NETIF_MSG_LINK, "Phy address = 0x%x\n", params->phy_addr); + + bnx2x_link_initialize(params, vars); + msleep(30); +@@ -4112,17 +6064,32 @@ + return 0; + } + +-u8 bnx2x_link_reset(struct link_params *params, struct link_vars *vars) +-{ +- ++static void bnx2x_8726_reset_phy(struct bnx2x *bp, u8 port, u8 ext_phy_addr) ++{ ++ DP(NETIF_MSG_LINK, "bnx2x_8726_reset_phy port %d\n", port); ++ ++ /* Set serial boot control for external load */ ++ bnx2x_cl45_write(bp, port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8726, ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_GEN_CTRL, 0x0001); ++} ++ ++u8 bnx2x_link_reset(struct link_params *params, struct link_vars *vars, ++ u8 reset_ext_phy) ++{ + struct bnx2x *bp = params->bp; + u32 ext_phy_config = params->ext_phy_config; + u16 hw_led_mode = params->hw_led_mode; + u32 chip_id = params->chip_id; + u8 port = params->port; + u32 ext_phy_type = XGXS_EXT_PHY_TYPE(ext_phy_config); ++ u32 val = REG_RD(bp, params->shmem_base + ++ offsetof(struct shmem_region, dev_info. ++ port_feature_config[params->port]. ++ config)); ++ + /* disable attentions */ +- + vars->link_status = 0; + bnx2x_update_mng(params, vars->link_status); + bnx2x_bits_dis(bp, NIG_REG_MASK_INTERRUPT_PORT0 + port*4, +@@ -4139,7 +6106,7 @@ + REG_WR(bp, NIG_REG_EGRESS_EMAC0_OUT_EN + port*4, 0); + + /* Stop BigMac rx */ +- bnx2x_bmac_rx_disable(bp, port); ++ bnx2x_bmac_rx_disable(bp, params->chip_id, port); + + /* disable emac */ + REG_WR(bp, NIG_REG_NIG_EMAC0_EN + port*4, 0); +@@ -4150,28 +6117,50 @@ + */ + /* clear link led */ + bnx2x_set_led(bp, port, LED_MODE_OFF, 0, hw_led_mode, chip_id); +- if (ext_phy_type != PORT_HW_CFG_XGXS_EXT_PHY_TYPE_DIRECT) { +- if ((ext_phy_type != PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8072) && +- (ext_phy_type != PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073)) { ++ if (reset_ext_phy) { ++ switch (ext_phy_type) { ++ case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_DIRECT: ++ case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8072: ++ break; ++ ++ case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8727: ++ { ++ ++ /* Disable Transmitter */ ++ u8 ext_phy_addr = ++ XGXS_EXT_PHY_ADDR(params->ext_phy_config); ++ if ((val & PORT_FEAT_CFG_OPT_MDL_ENFRCMNT_MASK) == ++ PORT_FEAT_CFG_OPT_MDL_ENFRCMNT_DISABLE_TX_LASER) ++ bnx2x_sfp_set_transmitter(bp, port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8727, ++ ext_phy_addr, 0); ++ break; ++ } ++ case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073: ++ DP(NETIF_MSG_LINK, "Setting 8073 port %d into " ++ "low power mode\n", ++ port); ++ bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_2, ++ MISC_REGISTERS_GPIO_OUTPUT_LOW, ++ port); ++ break; ++ case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8726: ++ { ++ u8 ext_phy_addr = ++ XGXS_EXT_PHY_ADDR(params->ext_phy_config); ++ /* Set soft reset */ ++ bnx2x_8726_reset_phy(bp, params->port, ext_phy_addr); ++ break; ++ } ++ default: + /* HW reset */ +- + bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_1, + MISC_REGISTERS_GPIO_OUTPUT_LOW, + port); +- + bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_2, + MISC_REGISTERS_GPIO_OUTPUT_LOW, + port); +- + DP(NETIF_MSG_LINK, "reset external PHY\n"); +- } else if (ext_phy_type == +- PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073) { +- DP(NETIF_MSG_LINK, "Setting 8073 port %d into " +- "low power mode\n", +- port); +- bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_2, +- MISC_REGISTERS_GPIO_OUTPUT_LOW, +- port); + } + } + /* reset the SerDes/XGXS */ +@@ -4196,6 +6185,7 @@ + { + struct bnx2x *bp = params->bp; + u8 port = params->port; ++ + DP(NETIF_MSG_LINK, "Port %x: Link is down\n", port); + bnx2x_set_led(bp, port, LED_MODE_OFF, + 0, params->hw_led_mode, +@@ -4218,7 +6208,7 @@ + msleep(10); + + /* reset BigMac */ +- bnx2x_bmac_rx_disable(bp, params->port); ++ bnx2x_bmac_rx_disable(bp, params->chip_id, params->port); + REG_WR(bp, GRCBASE_MISC + + MISC_REGISTERS_RESET_REG_2_CLEAR, + (MISC_REGISTERS_RESET_REG_2_RST_BMAC0 << port)); +@@ -4232,6 +6222,7 @@ + struct bnx2x *bp = params->bp; + u8 port = params->port; + u8 rc = 0; ++ + vars->link_status |= LINK_STATUS_LINK_UP; + if (link_10g) { + bnx2x_bmac_enable(params, vars, 0); +@@ -4248,13 +6239,14 @@ + if (gp_status & MDIO_AN_CL73_OR_37_COMPLETE) { + if (!(vars->phy_flags & + PHY_SGMII_FLAG)) +- bnx2x_set_sgmii_tx_driver(params); ++ bnx2x_set_gmii_tx_driver(params); + } + } + + /* PBF - link up */ +- rc |= bnx2x_pbf_update(params, vars->flow_ctrl, +- vars->line_speed); ++ if (!(CHIP_IS_E2_NOT_PHASE0(params->chip_id))) ++ rc |= bnx2x_pbf_update(params, vars->flow_ctrl, ++ vars->line_speed); + + /* disable drain */ + REG_WR(bp, NIG_REG_EGRESS_DRAIN0_MODE + port*4, 0); +@@ -4285,20 +6277,23 @@ + u8 link_10g; + u8 ext_phy_link_up, rc = 0; + u32 ext_phy_type; ++ u8 is_mi_int = 0; + + DP(NETIF_MSG_LINK, "port %x, XGXS?%x, int_status 0x%x\n", +- port, +- (vars->phy_flags & PHY_XGXS_FLAG), +- REG_RD(bp, NIG_REG_STATUS_INTERRUPT_PORT0 + port*4)); +- ++ port, (vars->phy_flags & PHY_XGXS_FLAG), ++ REG_RD(bp, NIG_REG_STATUS_INTERRUPT_PORT0 + port*4)); ++ ++ is_mi_int = (u8)(REG_RD(bp, NIG_REG_EMAC0_STATUS_MISC_MI_INT + ++ port*0x18) > 0); + DP(NETIF_MSG_LINK, "int_mask 0x%x MI_INT %x, SERDES_LINK %x\n", +- REG_RD(bp, NIG_REG_MASK_INTERRUPT_PORT0 + port*4), +- REG_RD(bp, NIG_REG_EMAC0_STATUS_MISC_MI_INT + port*0x18), +- REG_RD(bp, NIG_REG_SERDES0_STATUS_LINK_STATUS + port*0x3c)); ++ REG_RD(bp, NIG_REG_MASK_INTERRUPT_PORT0 + port*4), ++ is_mi_int, ++ REG_RD(bp, ++ NIG_REG_SERDES0_STATUS_LINK_STATUS + port*0x3c)); + + DP(NETIF_MSG_LINK, " 10G %x, XGXS_LINK %x\n", +- REG_RD(bp, NIG_REG_XGXS0_STATUS_LINK10G + port*0x68), +- REG_RD(bp, NIG_REG_XGXS0_STATUS_LINK_STATUS + port*0x68)); ++ REG_RD(bp, NIG_REG_XGXS0_STATUS_LINK10G + port*0x68), ++ REG_RD(bp, NIG_REG_XGXS0_STATUS_LINK_STATUS + port*0x68)); + + /* disable emac */ + REG_WR(bp, NIG_REG_NIG_EMAC0_EN + port*4, 0); +@@ -4326,7 +6321,7 @@ + (vars->line_speed == SPEED_15000) || + (vars->line_speed == SPEED_16000)); + +- bnx2x_link_int_ack(params, vars, link_10g); ++ bnx2x_link_int_ack(params, vars, link_10g, is_mi_int); + + /* In case external phy link is up, and internal link is down + ( not initialized yet probably after link initialization, it needs +@@ -4337,8 +6332,14 @@ + + if ((ext_phy_type != PORT_HW_CFG_SERDES_EXT_PHY_TYPE_DIRECT) && + (ext_phy_type != PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8705) && +- (ext_phy_link_up && !vars->phy_link_up)) +- bnx2x_init_internal_phy(params, vars); ++ (ext_phy_type != PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8726) && ++ (ext_phy_link_up && !vars->phy_link_up)) { ++ if (vars->line_speed < SPEED_1000) ++ vars->phy_flags |= PHY_SGMII_FLAG; ++ else ++ vars->phy_flags &= ~PHY_SGMII_FLAG; ++ bnx2x_init_internal_phy(params, vars, 0); ++ } + + /* link is up only if both local phy and external phy are up */ + vars->link_up = (ext_phy_link_up && vars->phy_link_up); +@@ -4371,10 +6372,7 @@ + NIG_MASK_SERDES0_LINK_STATUS | + NIG_MASK_MI_INT)); + +- ext_phy_addr[port] = +- ((ext_phy_config & +- PORT_HW_CFG_XGXS_EXT_PHY_ADDR_MASK) >> +- PORT_HW_CFG_XGXS_EXT_PHY_ADDR_SHIFT); ++ ext_phy_addr[port] = XGXS_EXT_PHY_ADDR(ext_phy_config); + + /* Need to take the phy out of low power mode in order + to write to access its registers */ +@@ -4398,7 +6396,7 @@ + u16 fw_ver1; + + bnx2x_bcm8073_external_rom_boot(bp, port, +- ext_phy_addr[port]); ++ ext_phy_addr[port], shmem_base); + + bnx2x_cl45_read(bp, port, PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073, + ext_phy_addr[port], +@@ -4434,7 +6432,7 @@ + + /* PART3 - complete TX_POWER_DOWN process, and set GPIO2 back to low */ + for (port = PORT_MAX - 1; port >= PORT_0; port--) { +- /* Phase2 of POWER_DOWN_RESET*/ ++ /* Phase2 of POWER_DOWN_RESET */ + /* Release bit 10 (Release Tx power down) */ + bnx2x_cl45_read(bp, port, + PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073, +@@ -4457,7 +6455,7 @@ + MDIO_PMA_REG_EDC_FFE_MAIN, &val); + bnx2x_cl45_write(bp, port, + PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073, +- ext_phy_addr[port], ++ ext_phy_addr[port], + MDIO_PMA_DEVAD, + MDIO_PMA_REG_EDC_FFE_MAIN, (val | (1<<12))); + +@@ -4469,12 +6467,115 @@ + + } + ++static u8 bnx2x_8727_common_init_phy(struct bnx2x *bp, u32 shmem_base) ++{ ++ u8 ext_phy_addr[PORT_MAX]; ++ s8 port; ++ u32 swap_val, swap_override; ++ DP(NETIF_MSG_LINK, "Executing BCM8727 common init\n"); ++ swap_val = REG_RD(bp, NIG_REG_PORT_SWAP); ++ swap_override = REG_RD(bp, NIG_REG_STRAP_OVERRIDE); ++ ++ bnx2x_ext_phy_hw_reset(bp, 1 ^ (swap_val && swap_override)); ++ msleep(5); ++ ++ /* PART1 - Reset both phys */ ++ for (port = PORT_MAX - 1; port >= PORT_0; port--) { ++ /* Extract the ext phy address for the port */ ++ u32 ext_phy_config = REG_RD(bp, shmem_base + ++ offsetof(struct shmem_region, ++ dev_info.port_hw_config[port].external_phy_config)); ++ ++ /* disable attentions */ ++ bnx2x_bits_dis(bp, NIG_REG_MASK_INTERRUPT_PORT0 + port*4, ++ (NIG_MASK_XGXS0_LINK_STATUS | ++ NIG_MASK_XGXS0_LINK10G | ++ NIG_MASK_SERDES0_LINK_STATUS | ++ NIG_MASK_MI_INT)); ++ ++ ext_phy_addr[port] = XGXS_EXT_PHY_ADDR(ext_phy_config); ++ ++ /* Reset the phy */ ++ bnx2x_cl45_write(bp, port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8727, ++ ext_phy_addr[port], ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_CTRL, ++ 1<<15); ++ } ++ ++ /* Add delay of 150ms after reset */ ++ msleep(150); ++ ++ /* PART2 - Download firmware to both phys */ ++ for (port = PORT_MAX - 1; port >= PORT_0; port--) { ++ u16 fw_ver1; ++ ++ bnx2x_bcm8727_external_rom_boot(bp, port, ++ ext_phy_addr[port], shmem_base); ++ ++ bnx2x_cl45_read(bp, port, PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8727, ++ ext_phy_addr[port], ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_ROM_VER1, &fw_ver1); ++ if (fw_ver1 == 0 || fw_ver1 == 0x4321) { ++ DP(NETIF_MSG_LINK, ++ "bnx2x_8073_common_init_phy port %x:" ++ "Download failed. fw version = 0x%x\n", ++ port, fw_ver1); ++ return -EINVAL; ++ } ++ ++ } ++ ++ ++ ++ return 0; ++} ++ ++ ++static u8 bnx2x_8726_common_init_phy(struct bnx2x *bp, u32 shmem_base) ++{ ++ u8 ext_phy_addr; ++ u32 val; ++ s8 port; ++ ++ /* Use port1 because of the static port-swap */ ++ /* Enable the module detection interrupt */ ++ val = REG_RD(bp, MISC_REG_GPIO_EVENT_EN); ++ val |= ((1<type, header->image_info, ++ header->byte_cnt); ++ ++ if ((header->magic != FILE_MAGIC) || ++ (header->version != FORMAT_VERSION_2) || ++ (header->type != image_hdr_type)) { ++ DP(NETIF_MSG_LINK, "Invalid image header: Magic = 0x%x," ++ " version = 0x%x, phy_type = 0x%x\n", ++ header->magic, header->version, header->type); ++ return -EINVAL; ++ } ++ return 0; ++} ++ ++void bnx2x_sfx7101_sp_sw_reset(struct bnx2x *bp, u8 port, u8 phy_addr) + { + u16 val, cnt; + +@@ -4530,6 +6678,7 @@ + break; + } + } ++ + #define RESERVED_SIZE 256 + /* max application is 160K bytes - data at end of RAM */ + #define MAX_APP_SIZE (160*1024 - RESERVED_SIZE) +@@ -4543,6 +6692,571 @@ + ext_phy_addr, \ + MDIO_PCS_DEVAD, \ + MDIO_PCS_REG_7101_SPI_CTRL_ADDR, 1) ++ ++/************************************************************************/ ++/* Function: bnx2x_bcm_flash_download */ ++/* Description : Load SPI EEPROM through BCM8073. */ ++/* */ ++/************************************************************************/ ++ ++#define WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wrdata, rddata) \ ++ {if (write_message_bcm(bp, port, ext_phy_addr, \ ++ ext_phy_type, wrdata, rddata) != 0) \ ++ return -EINVAL; } ++ ++static u8 write_message_bcm(struct bnx2x *bp, u8 port, ++ u8 ext_phy_addr, u32 ext_phy_type, ++ u16 wrdata, u16 *rddata) ++{ ++ u16 tmp_data = 0; ++ u16 i = 0; ++ bnx2x_cl45_read(bp, port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_M8051_MSGOUT_REG, &tmp_data); ++ ++ /* Write SPI Control Register Write Command.*/ ++ bnx2x_cl45_write(bp, port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_M8051_MSGIN_REG, wrdata); ++ ++ /* Wait For LASI To be asserted when M8051 writes Next Parameter To ++ MSG_OUT Register TBD wait (xlasi_ch1 === 1'b0); ++ Above wait can also be done by polling 9005, bit 2 As bellow. */ ++ ++ for (i = 0; i < UPGRADE_TIMEOUT_BCM; i++) { ++ bnx2x_cl45_read(bp, port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_LASI_STATUS, &tmp_data); ++ if ((tmp_data & (1<<2)) != 0) {/* bit 2 is Rx Alarm for LASI.*/ ++ break; ++ } ++ msleep(6); ++ } ++ ++ if (i == UPGRADE_TIMEOUT_BCM) { ++ DP(NETIF_MSG_LINK, "Failed to get LASI indication. Aborting\n"); ++ return -EINVAL; ++ } ++ ++ /* Read Message out register. 1.CA13 */ ++ bnx2x_cl45_read(bp, port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_M8051_MSGOUT_REG, &tmp_data); ++ *rddata = tmp_data; ++ ++ /* Clear LASI Message Out Status. 1.9003*/ ++ bnx2x_cl45_read(bp, port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_RX_ALARM, &tmp_data); ++ return 0; ++} ++ ++ ++static u8 bnx2x_phy_bcm_rom_wait(struct bnx2x *bp, u8 port, ++ u8 ext_phy_addr, u32 ext_phy_type) ++{ ++ /* Wait For WRSR Command To be written.*/ ++ u8 spi_ready = 0, count; ++ ++ u16 rd_data = 0, wr_data = 0 ; ++ u16 retry_count = 0; ++ while ((rd_data & 0x0100) == 0 && (++retry_count < 1000)) { ++ /* Write SPI Control Register Read Command.*/ ++ count = 1; ++ wr_data = ((RD_CPU_CTRL_REGS * 0x0100) | count); ++ count = 2; ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, &rd_data); ++ ++ /* Write SPI Control -1 Register Address.*/ ++ wr_data = SPI_CTRL_1_L; ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, &rd_data); ++ } ++ if (retry_count == 1000) { ++ DP(NETIF_MSG_LINK, ++ "Failed writing SPI Write SPI Control Register\n"); ++ return -EINVAL; ++ } ++ DP(NETIF_MSG_LINK, "SPI Controller Wrote WRSR Command.\n" ++ " Checking SPI Status Now "); ++ spi_ready = 1; ++ retry_count = 0; ++ while (spi_ready == 1 && (++retry_count < 1000)) { ++ /* Set-up SPI Controller To Receive SPI EEPROM Status.*/ ++ /* Write SPI Control Register Write Command.*/ ++ count = 1; ++ wr_data = ((WR_CPU_CTRL_REGS * 0x0100) | count); ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, &rd_data); ++ ++ /* Write SPI Control -2 Register Address.*/ ++ wr_data = SPI_CTRL_2_H; ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, &rd_data); ++ ++ /* Write SPI Control -2 Register Word-2.*/ ++ wr_data = 0x0100; ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, &rd_data); ++ ++ /* Fill-up SPI Transmit Fifo To check SPI Status.*/ ++ /* Write SPI Control Register Write Command.*/ ++ count = 2; ++ wr_data = ((WR_CPU_CTRL_FIFO*0x0100) | count); ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, &rd_data); ++ ++ /* Write Tx Fifo Register Address.*/ ++ wr_data = SPI_TXFIFO; ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, &rd_data); ++ ++ /* Write SPI Tx Fifo Control Word-1.*/ ++ wr_data = ((1 * 0x0100) | MSGTYPE_HRD); ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, &rd_data); ++ ++ /* Write SPI Tx Fifo Control Word-2.*/ ++ wr_data = RDSR_OPCODE; ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, &rd_data); ++ ++ /* Write SPI Control Register Write Command.*/ ++ count = 2; ++ wr_data = ((WR_CPU_CTRL_FIFO * 0x0100) | count); ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, &rd_data); ++ ++ /* Write SPI Control -1 Register Address.*/ ++ wr_data = SPI_CTRL_1_L; ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, &rd_data); ++ ++ /* Write SPI Control -1 Register Word-1.*/ ++ wr_data = 0x0101; ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, &rd_data); ++ ++ /* Write SPI Control -1 Register Word-2.*/ ++ wr_data = 0x0100; ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, &rd_data); ++ ++ /* Write SPI Control Register Write Command.*/ ++ count = 1; ++ wr_data = ((WR_CPU_CTRL_REGS * 0x0100) | count); ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, &rd_data); ++ ++ /* Write SPI Control -1 Register Address.*/ ++ wr_data = SPI_CTRL_1_H; ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, &rd_data); ++ ++ /* Write SPI Control -1 Register Word-2.*/ ++ wr_data = 0x0103; ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, &rd_data); ++ ++ DP(NETIF_MSG_LINK, "**Wait for Status Register to be written "); ++ ++ /* Wait For 64 bytes To be written.*/ ++ rd_data = 0x0000; ++ while ((rd_data & 0x0100) == 0) { ++ /* Write SPI Control Register Read Command.*/ ++ count = 1; ++ wr_data = ((RD_CPU_CTRL_REGS * 0x0100) | count); ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, ++ wr_data, &rd_data); ++ ++ /* Write SPI Control -1 Register Address.*/ ++ wr_data = SPI_CTRL_1_L; ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, ++ wr_data, &rd_data); ++ } ++ DP(NETIF_MSG_LINK, "**Write SPI CTRl Read command "); ++ ++ /* Write SPI Control Register Read Command.*/ ++ count = 1; /* Read from SPI Controller register C000.*/ ++ wr_data = ((RD_CPU_CTRL_REGS * 0x0100) | count); ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, &rd_data); ++ ++ /* Write SPI Control -1 Register Address.*/ ++ wr_data = SPI_RXFIFO; ++ if (ext_phy_type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073 || ++ ext_phy_type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8727) { ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, ++ wr_data, &rd_data); ++ } else { ++ bnx2x_cl45_write(bp, port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_M8051_MSGIN_REG, wr_data); ++ ++ bnx2x_cl45_read(bp, port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_M8051_MSGOUT_REG, &rd_data); ++ ++ bnx2x_cl45_read(bp, port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_RX_ALARM, &wr_data); ++ } ++ ++ if ((rd_data & 0x1) == 0) ++ spi_ready = 0; ++ } /* spi_ready */ ++ if (retry_count == 1000) ++ return -EINVAL; ++ ++ return 0; ++} ++ ++ ++static u8 bnx2x_phy_bcm_rom_write_enable(struct bnx2x *bp, u8 port, ++ u8 ext_phy_addr, u32 ext_phy_type, ++ u8 enable) ++{ ++ u8 count = 0, wrsr_data; ++ u16 rd_data = 0, wr_data = 0; ++ ++ /* De-assert SPI EEPROM Block Protection.*/ ++ DP(NETIF_MSG_LINK, "*** De-assert SPI Block Protect\n"); ++ ++ /* Write SPI Control Register Write Command.*/ ++ count = 2; ++ wr_data = ((WR_CPU_CTRL_FIFO * 0x0100) | count); ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, &rd_data); ++ DP(NETIF_MSG_LINK, "First write succeeded\n"); ++ /* Write SPI Control -2 Register Address.*/ ++ wr_data = SPI_CTRL_2_L; ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, &rd_data); ++ ++ /* Write SPI Control -2 Register Word-1.*/ ++ wr_data = 0x8200; ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, &rd_data); ++ ++ /* Write SPI Control -2 Register Word-2.*/ ++ wr_data = 0x0100; ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, &rd_data); ++ ++ /* Fill-up SPI Transmit Fifo With SPI EEPROM Messages.*/ ++ /* Write SPI Control Register Write Command.*/ ++ count = 4; ++ wr_data = ((WR_CPU_CTRL_FIFO * 0x0100) | count); ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, &rd_data); ++ ++ /* Write Tx Fifo Register Address.*/ ++ wr_data = SPI_TXFIFO; ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, &rd_data); ++ ++ /* Write SPI Tx Fifo Control Word-1.*/ ++ wr_data = ((1 * 0x0100) | MSGTYPE_HWR); ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, &rd_data); ++ ++ /* Write SPI Tx Fifo Control Word-2.*/ ++ wr_data = ((MSGTYPE_HWR * 0x0100) | WREN_OPCODE); ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, &rd_data); ++ ++ /* Write SPI Tx Fifo Control Word-3.*/ ++ wr_data = ((WRSR_OPCODE * 0x0100) | 0x02); ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, &rd_data); ++ ++ /* Write SPI Tx Fifo Control Word-4.*/ ++ ++ wrsr_data = enable ? 0x2 : 0xc; ++ wr_data = ((wrsr_data * 0x0100) | wrsr_data); ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, &rd_data); ++ ++ /* Write SPI Control Register Write Command.*/ ++ wr_data = ((WR_CPU_CTRL_FIFO * 0x0100) | count); ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, &rd_data); ++ ++ /* Write SPI Control -1 Register Address.*/ ++ wr_data = SPI_CTRL_1_L; ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, &rd_data); ++ ++ /* Write SPI Control -1 Register Word-1.*/ ++ wr_data = 0x0101; ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, &rd_data); ++ ++ /* Write SPI Control -1 Register Word-2.*/ ++ wr_data = 0x0003; ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, &rd_data); ++ ++ return bnx2x_phy_bcm_rom_wait(bp, port, ext_phy_addr, ext_phy_type); ++ ++} ++ ++/* Programs an image to DSP's flash via the SPI port*/ ++static u8 bnx2x_bcm_flash_download(struct bnx2x *bp, u8 port, ++ u8 ext_phy_addr, u32 ext_phy_type, ++ char *code_ptr, u32 size) { ++ u16 tmp, rd_data, wr_data = 4; ++ u8 count, rc = 0; ++ u32 i, data_index; ++ u16 misc_ctrl; ++ ++ DP(NETIF_MSG_LINK, "bnx2x_bcm_flash_download: size=0x%x\n", size); ++ ++ bnx2x_cl45_write(bp, port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_AN_DEVAD, ++ MDIO_AN_REG_CTRL, 0); ++ ++ /* Enable the LASI For Message out */ ++ bnx2x_cl45_read(bp, port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_MISC_CTRL1, &misc_ctrl); ++ ++ bnx2x_cl45_write(bp, port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_MISC_CTRL1, (misc_ctrl | (1<<0))); ++ ++ /* Read LASI Status registers To clear initial Failure status. */ ++ bnx2x_cl45_read(bp, port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_RX_ALARM, &tmp); ++ ++ bnx2x_cl45_read(bp, port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_TX_ALARM, &tmp); ++ bnx2x_cl45_read(bp, port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_LASI_STATUS, &tmp); ++ ++ /* Enable the LASI For Message out */ ++ ++ switch (ext_phy_type) { ++ case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073: ++ case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8727: ++ wr_data = 0x0004; ++ break; ++ case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8726: ++ wr_data = 0x0400; ++ break; ++ } ++ bnx2x_cl45_write(bp, port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_RX_ALARM_CTRL, wr_data); ++ ++ bnx2x_cl45_write(bp, port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_LASI_CTRL, 0x4); ++ ++ ++ /* Read Any Residual Message out register.1.CA13*/ ++ bnx2x_cl45_read(bp, port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_M8051_MSGOUT_REG, &rd_data); ++ ++ /* Clear LASI Message Out Status. 1.9003 */ ++ bnx2x_cl45_read(bp, port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_RX_ALARM, &rd_data); ++ ++ if (bnx2x_phy_bcm_rom_write_enable(bp, port, ext_phy_addr, ++ ext_phy_type, 1) != 0) ++ return -EINVAL; ++ ++ for (data_index = 0; data_index < BUF_SIZE_BCM; ++ data_index += WR_BLOCK_SIZE) { ++ /* Setup SPI Controller ++ Write SPI Control Register Write Command. */ ++ ++ count = 2;/* Write to C400, C401, C402, C403 Registers.*/ ++ wr_data = ((WR_CPU_CTRL_FIFO * 0x0100) | count); ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, &rd_data); ++ ++ /* Write SPI Control -2 Register Address.*/ ++ wr_data = SPI_CTRL_2_L; ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, &rd_data); ++ ++ /* Write SPI Control -2 Register Word-1 */ ++ /* C400 = 0 for 0 Fill Byte. C401 = 02 for SPI Clcok to ++ be divide by 2 and little endian fifo.*/ ++ wr_data = 0x8200; ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, &rd_data); ++ ++ /* Write SPI Control -2 Register Word-2.*/ ++ /* C402 = 0, clear all status. C403 = 1, ++ to enable Done Status.*/ ++ wr_data = 0x0100; ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, &rd_data); ++ ++ /* Fill-up SPI Transmit Fifo.*/ ++ /* Write SPI Control Register Write Command. */ ++ /* Write To Transmit Fifo D000-onwards.*/ ++ count = 4 + (WR_BLOCK_SIZE/2); ++ wr_data = ((WR_CPU_CTRL_FIFO*0x0100) | count); ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, &rd_data); ++ ++ /* Write Tx Fifo Register Address.*/ ++ wr_data = SPI_TXFIFO; ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, &rd_data); ++ ++ /* Write SPI Tx Fifo Control Word-1.*/ ++ /* {8'h1, MSGTYPE_HWR}; ++ ( 1byte to transmit for WREN opcode).*/ ++ wr_data = ((1*0x0100) | MSGTYPE_HWR); ++ /* D001 = Write Message And Higher byte of Transfer Size */ ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, &rd_data); ++ /* Write SPI Tx Fifo Control Word-2.*/ ++ /* D002 = WREN Opcode For transmit.*/ ++ wr_data = ((MSGTYPE_HWR * 0x0100) | WREN_OPCODE); ++ /* D003 = Total byte To be transmited ++ (64 + 3 For command, And address).*/ ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, &rd_data); ++ ++ /* Write SPI Tx Fifo Control Word-3.*/ ++ /* D004 = Second Message is also WRITE Message.*/ ++ wr_data = ((WR_OPCODE * 0x0100) | ++ (0x3 + WR_BLOCK_SIZE)); ++ /* D005 = Write Opcode.*/ ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, &rd_data); ++ ++ /* Write SPI Tx Fifo Control Word-4. */ ++ /* D006 = SPI EEPROM Dest Addr (higher byte sent out first).*/ ++ /* D007 = SPI EEPROM Dest Addr (lower byte sent out later).*/ ++ wr_data = (((data_index & 0x00FF)*0x0100) | ++ ((data_index & 0xFF00)/0x0100)); ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, &rd_data); ++ ++ for (i = 0; i < WR_BLOCK_SIZE; i += 2) { ++ /* Write SPI Tx Fifo Data Word-4.*/ ++ /* D008 = Low Byte. D009 = High Byte.*/ ++ wr_data = (u16)((code_ptr[i+data_index+1]*0x0100) | ++ (code_ptr[i+data_index] & 0x00FF)); ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, ++ &rd_data); ++ } ++ ++ DP(NETIF_MSG_LINK, " 64bytes filled in SPIfifo 0x%x\n", ++ data_index); ++ ++ /* Let the user know something's going on every 1024 bytes.*/ ++ if ((data_index % 1024) == 0) ++ DP(NETIF_MSG_LINK, "Download %d%%\n", data_index/size); ++ ++ /* Set-up SPI Controller To Transmit.*/ ++ /* Write SPI Control Register Write Command.*/ ++ /* Write to SPI Control Register C000 onwards.*/ ++ count = 2; ++ /* {CLC_WR_CPU_CTRL_FIFO, count};*/ ++ wr_data = ((WR_CPU_CTRL_FIFO*0x0100) | count); ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, &rd_data); ++ ++ /* Write SPI Control -1 Register Address.*/ ++ wr_data = SPI_CTRL_1_L; ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, &rd_data); ++ ++ /* Write SPI Control -1 Register Word-1.*/ ++ /* C000 = 1 to clear CMD Done Status. C001 = 1 to clear CMD Done ++ INT Status.*/ ++ wr_data = 0x0501; ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, &rd_data); ++ ++ /* Write SPI Control -1 Register Word-2.*/ ++ /* C002 = 3, Start Immidiate Command. C003 = 0, No Prepend byte ++ for Write.*/ ++ wr_data = 0x0003; ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, &rd_data); ++ ++ if (bnx2x_phy_bcm_rom_wait(bp, port, ext_phy_addr, ext_phy_type) ++ != 0) ++ return -EINVAL; ++ } ++ DP(NETIF_MSG_LINK, "*** SPI_READ and WRITE COMPLETE 0x%x\n", ++ data_index); ++ ++ if (bnx2x_phy_bcm_rom_write_enable(bp, port, ext_phy_addr, ++ ext_phy_type, 0) != 0) ++ return -EINVAL; ++ ++ /* Disable SPI EEPROM.*/ ++ /* Write SPI Control Register Write Command.*/ ++ count = 2; /* Write to C400, C401, C402, C403 Registers.*/ ++ wr_data = ((WR_CPU_CTRL_FIFO*0x0100) | count); ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, &rd_data); ++ ++ /* Write SPI Control -2 Register Address.*/ ++ wr_data = SPI_CTRL_2_L; ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, &rd_data); ++ ++ /* Write SPI Control -2 Register Word-1.*/ ++ wr_data = 0x8200; /* C400 = 0 for 0 Fill Byte. C401 = 02 for ++ SPI Clcok to be divide by 2 and little endian fifo.*/ ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, &rd_data); ++ ++ /* Write SPI Control -2 Register Word-2.*/ ++ wr_data = 0x0100; /* C402 = 0, clear all status. C403 = 1, to ++ enable Done Status.*/ ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, &rd_data); ++ ++ /* Fill-up SPI Transmit Fifo With SPI EEPROM Messages.*/ ++ /* Write SPI Control Register Write Command.*/ ++ count = 2; /* Write to Transmit Fifo D000-onwards.*/ ++ wr_data = ((WR_CPU_CTRL_FIFO*0x0100) | count); ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, &rd_data); ++ ++ /*Write Tx Fifo Register Address.*/ ++ wr_data = SPI_TXFIFO; /* D000.*/ ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, &rd_data); ++ ++ /* Write SPI Tx Fifo Control Word-1.*/ ++ wr_data = ((0x1*0x0100) | MSGTYPE_HWR); /* D000 = Only 1 ++ byte Message ( 1byte to transmit for WRDI opcode).*/ ++ ++ /* D001 = Write Message And Higher byte of Transfer Size.*/ ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, &rd_data); ++ ++ /* Write SPI Tx Fifo Control Word-2.*/ ++ wr_data = WRDI_OPCODE; /* D002 = WRDI Opcode for transmit.*/ ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, &rd_data); ++ ++ /*Write SPI Control Register Write Command.*/ ++ count = 2; /* Write to SPI Control Register C000 onwards.*/ ++ wr_data = ((WR_CPU_CTRL_FIFO*0x0100) | count); ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, &rd_data); ++ /* Write SPI Control -1 Register Address.*/ ++ wr_data = SPI_CTRL_1_L; ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, &rd_data); ++ ++ /* Write SPI Control -1 Register Word-1.*/ ++ wr_data = 0x0101; /* C000 = 1 to clear CMD Done Status. ++ C001 = 1 to clear CMD Done INT Status.*/ ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, &rd_data); ++ ++ /* Write SPI Control -1 Register Word-2.*/ ++ wr_data = 0x0003; /* C002 = 3, Start Immidiate Command. ++ C003 = 0, No Prepend byte for Write.*/ ++ WRITE_MESSAGE_BCM(bp, port, ext_phy_addr, wr_data, &rd_data); ++ bnx2x_cl45_write(bp, port, ++ ext_phy_type, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, ++ MDIO_PMA_REG_MISC_CTRL1, (misc_ctrl & ~(1<<0))); ++ DP(NETIF_MSG_LINK, "Download %d%%\n", data_index/size); ++ return rc; ++} + + /* Programs an image to DSP's flash via the SPI port*/ + static u8 bnx2x_sfx7101_flash_download(struct bnx2x *bp, u8 port, +@@ -4630,7 +7344,7 @@ + ext_phy_addr, + MDIO_PCS_DEVAD, + MDIO_PCS_REG_7101_SPI_FIFO_ADDR, +- MDIO_PCS_REG_7101_SPI_FIFO_ADDR_WRITE_ENABLE_CMD); ++ MDIO_PCS_REG_7101_SPI_FIFO_ADDR_WRITE_ENABLE_CMD); + + bnx2x_cl45_write(bp, port, + PORT_HW_CFG_XGXS_EXT_PHY_TYPE_SFX7101, +@@ -4645,7 +7359,7 @@ + ext_phy_addr, + MDIO_PCS_DEVAD, + MDIO_PCS_REG_7101_SPI_FIFO_ADDR, +- MDIO_PCS_REG_7101_SPI_FIFO_ADDR_BULK_ERASE_CMD); ++ MDIO_PCS_REG_7101_SPI_FIFO_ADDR_BULK_ERASE_CMD); + + bnx2x_cl45_write(bp, port, + PORT_HW_CFG_XGXS_EXT_PHY_TYPE_SFX7101, +@@ -4664,7 +7378,7 @@ + data_index = 0; + for (trans_cnt = 0; trans_cnt < num_trans; trans_cnt++) { + bnx2x_cl45_write(bp, port, +- PORT_HW_CFG_XGXS_EXT_PHY_TYPE_SFX7101, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_SFX7101, + ext_phy_addr, + MDIO_PCS_DEVAD, + MDIO_PCS_REG_7101_SPI_FIFO_ADDR, +@@ -4679,10 +7393,10 @@ + SPI_START_TRANSFER(bp, port, ext_phy_addr); + + bnx2x_cl45_write(bp, port, +- PORT_HW_CFG_XGXS_EXT_PHY_TYPE_SFX7101, +- ext_phy_addr, +- MDIO_PCS_DEVAD, +- MDIO_PCS_REG_7101_SPI_FIFO_ADDR, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_SFX7101, ++ ext_phy_addr, ++ MDIO_PCS_DEVAD, ++ MDIO_PCS_REG_7101_SPI_FIFO_ADDR, + MDIO_PCS_REG_7101_SPI_FIFO_ADDR_PAGE_PROGRAM_CMD); + + /* Bits 23-16 of address */ +@@ -4713,9 +7427,9 @@ + bnx2x_cl45_write(bp, port, + PORT_HW_CFG_XGXS_EXT_PHY_TYPE_SFX7101, + ext_phy_addr, +- MDIO_PCS_DEVAD, +- MDIO_PCS_REG_7101_SPI_FIFO_ADDR, +- data[data_index++]); ++ MDIO_PCS_DEVAD, ++ MDIO_PCS_REG_7101_SPI_FIFO_ADDR, ++ data[data_index++]); + byte_cnt++; + } + +@@ -4788,11 +7502,11 @@ + while (byte_cnt < last_trans_size && data_index < size) { + /* Bits 7-0 of address */ + bnx2x_cl45_write(bp, port, +- PORT_HW_CFG_XGXS_EXT_PHY_TYPE_SFX7101, +- ext_phy_addr, +- MDIO_PCS_DEVAD, +- MDIO_PCS_REG_7101_SPI_FIFO_ADDR, +- data[data_index++]); ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_SFX7101, ++ ext_phy_addr, ++ MDIO_PCS_DEVAD, ++ MDIO_PCS_REG_7101_SPI_FIFO_ADDR, ++ data[data_index++]); + byte_cnt++; + } + +@@ -4816,7 +7530,7 @@ + for (cnt = 0; cnt < 100; cnt++) + msleep(5); + +- bnx2x_hw_reset(bp, port); ++ bnx2x_ext_phy_hw_reset(bp, port); + + for (cnt = 0; cnt < 100; cnt++) + msleep(5); +@@ -4863,26 +7577,218 @@ + return 0; + } + ++ ++ ++u8 bnx2x_bcm8481_flash_download(struct bnx2x *bp, u8 port, ++ u8 ext_phy_addr, ++ char data[], u32 size) ++{ ++ u32 data_index; ++ u16 val, cnt; ++ ++ /* Disable interrupts */ ++ bnx2x_bits_dis(bp, NIG_REG_MASK_INTERRUPT_PORT0 + port*4, ++ (NIG_MASK_XGXS0_LINK_STATUS | ++ NIG_MASK_XGXS0_LINK10G | ++ NIG_MASK_SERDES0_LINK_STATUS | ++ NIG_MASK_MI_INT)); ++ ++ /* Step 1: Halt system */ ++ DP(NETIF_MSG_LINK, "Step 1: Halt system\n"); ++ bnx2x_cl45_write(bp, port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481, ++ ext_phy_addr, ++ 0x1e, 0x4186, 0x8000); ++ ++ bnx2x_cl45_write(bp, port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481, ++ ext_phy_addr, ++ 0x1e, 0x4181, 0x017c); ++ ++ bnx2x_cl45_write(bp, port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481, ++ ext_phy_addr, ++ 0x1e, 0x4181, 0x0040); ++ bnx2x_cl45_write(bp, port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, 0xA819, 0x0000); ++ bnx2x_cl45_write(bp, port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, 0xA81A, 0xc300); ++ bnx2x_cl45_write(bp, port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, 0xA81B, 0x001e); ++ bnx2x_cl45_write(bp, port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, 0xA81C, 0x0000); ++ bnx2x_cl45_write(bp, port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, 0xA817, 0x0009); ++ bnx2x_cl45_write(bp, port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, 0xA819, 0x0000); ++ bnx2x_cl45_write(bp, port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, 0xA81A, 0xffff); ++ bnx2x_cl45_write(bp, port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, 0xA81B, 0xfffe); ++ bnx2x_cl45_write(bp, port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, 0xA81C, 0xeaff); ++ bnx2x_cl45_write(bp, port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, 0xA817, 0x0009); ++ bnx2x_cl45_write(bp, port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481, ++ ext_phy_addr, ++ 0x1e, 0x4181, 0x0000); ++ ++ /* Step 2: Download code into memory*/ ++ DP(NETIF_MSG_LINK, "Step 2: Download code into memory\n"); ++ ++ bnx2x_cl45_write(bp, port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, 0xA817, 0x0039); ++ bnx2x_cl45_write(bp, port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, 0xA81A, 0x0000); ++ bnx2x_cl45_write(bp, port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, 0xA819, 0x0000); ++ ++ for (data_index = 0; data_index < size; data_index += 4) { ++ /* File is in Little Endian */ ++ /* Write upper 16-bits(x)*/ ++ val = data[data_index+2] | (data[data_index+3] << 8); ++ bnx2x_cl45_write(bp, port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, 0xA81C, val); ++ /* Write lower 16-bits(x)*/ ++ val = data[data_index+0] | (data[data_index+1] << 8); ++ bnx2x_cl45_write(bp, port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, 0xA81B, val); ++ /* Wait for complete status for upto 5 ms*/ ++ for (cnt = 0; cnt < 1000; cnt++) { ++ bnx2x_cl45_read(bp, port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, 0xA818, &val); ++ if (val & 0x1) ++ break; ++ /* Wait 50 microSec*/ ++ udelay(50); ++ } ++ if (cnt == 1000) { ++ DP(NETIF_MSG_LINK, "Failed to download image\n"); ++ return -EINVAL; ++ } ++ if ((data_index % 1024) == 0) ++ DP(NETIF_MSG_LINK, "Download %d%%\n", data_index/size); ++ } ++ bnx2x_cl45_write(bp, port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, 0xA817, 0x0000); ++ ++ bnx2x_cl45_write(bp, port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, 0xA819, 0x0000); ++ bnx2x_cl45_write(bp, port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, 0xA81A, 0xc300); ++ bnx2x_cl45_write(bp, port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, 0xA81B, 0x000c); ++ bnx2x_cl45_write(bp, port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, 0xA81C, 0x0000); ++ bnx2x_cl45_write(bp, port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481, ++ ext_phy_addr, ++ MDIO_PMA_DEVAD, 0xA817, 0x0009); ++ bnx2x_cl45_write(bp, port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481, ++ ext_phy_addr, ++ 0x1e, 0x4181, 0x0040); ++ bnx2x_cl45_write(bp, port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481, ++ ext_phy_addr, ++ 0x1e, 0x4181, 0x0000); ++ DP(NETIF_MSG_LINK, "Step 3: Waiting for the Programming" ++ "phase to be completed (5 seconds).\n"); ++ for (cnt = 0; cnt < 1000; cnt++) ++ msleep(5); ++ /* Step 3: Restart system */ ++ bnx2x_cl45_write(bp, port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481, ++ ext_phy_addr, ++ 0x1e, 0x4181, 0x017c); ++ bnx2x_cl45_write(bp, port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481, ++ ext_phy_addr, ++ 0x1e, 0x4181, 0x0040); ++ bnx2x_cl45_write(bp, port, ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481, ++ ext_phy_addr, ++ 0x1e, 0x4181, 0x0000); ++ DP(NETIF_MSG_LINK, "Download %d%%\n", data_index/size); ++ return 0; ++} + u8 bnx2x_flash_download(struct bnx2x *bp, u8 port, u32 ext_phy_config, + u8 driver_loaded, char data[], u32 size) + { + u8 rc = 0; + u32 ext_phy_type; + u8 ext_phy_addr; +- ext_phy_addr = ((ext_phy_config & +- PORT_HW_CFG_XGXS_EXT_PHY_ADDR_MASK) >> +- PORT_HW_CFG_XGXS_EXT_PHY_ADDR_SHIFT); +- ++ ext_phy_addr = XGXS_EXT_PHY_ADDR(ext_phy_config); + ext_phy_type = XGXS_EXT_PHY_TYPE(ext_phy_config); ++ ++ /* Verify image header */ ++ if (bnx2x_verify_image_header(bp, ++ (struct bnx2x_image_header *)data, ++ ext_phy_type) != 0) ++ return -EINVAL; ++ data += sizeof(struct bnx2x_image_header); ++ size -= sizeof(struct bnx2x_image_header); + + switch (ext_phy_type) { + case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8072: +- case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073: + case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8705: + case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8706: + DP(NETIF_MSG_LINK, + "Flash download not supported for this ext phy\n"); + rc = -EINVAL; ++ break; ++ case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8726: ++ case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8727: ++ case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073: ++ if (!driver_loaded) ++ bnx2x_turn_on_ef(bp, port, ext_phy_addr, ext_phy_type); ++ ++ rc = bnx2x_bcm_flash_download(bp, port, ext_phy_addr, ++ ext_phy_type, ++ data, size); + break; + case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_SFX7101: + /* Take ext phy out of reset */ +@@ -4893,6 +7799,10 @@ + if (!driver_loaded) + bnx2x_turn_off_sf(bp, port); + break; ++ case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481: ++ rc = bnx2x_bcm8481_flash_download(bp, port, ext_phy_addr, ++ data, size); ++ break; + case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_DIRECT: + case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_FAILURE: + case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_NOT_CONN: +diff -r ddb96c0bbe13 drivers/net/bnx2x_link.h +--- a/drivers/net/bnx2x_link.h Tue Jun 16 11:03:28 2009 +0100 ++++ b/drivers/net/bnx2x_link.h Tue Jun 16 13:15:30 2009 +0100 +@@ -1,4 +1,4 @@ +-/* Copyright 2008 Broadcom Corporation ++/* Copyright 2008-2009 Broadcom Corporation + * + * Unless you and Broadcom execute a separate written software license + * agreement governing use of this software, this software is licensed to you +@@ -22,24 +22,30 @@ + /***********************************************************/ + /* Defines */ + /***********************************************************/ +-#define DEFAULT_PHY_DEV_ADDR 3 ++#define DEFAULT_PHY_DEV_ADDR 3 + + + +-#define FLOW_CTRL_AUTO PORT_FEATURE_FLOW_CONTROL_AUTO +-#define FLOW_CTRL_TX PORT_FEATURE_FLOW_CONTROL_TX +-#define FLOW_CTRL_RX PORT_FEATURE_FLOW_CONTROL_RX +-#define FLOW_CTRL_BOTH PORT_FEATURE_FLOW_CONTROL_BOTH +-#define FLOW_CTRL_NONE PORT_FEATURE_FLOW_CONTROL_NONE ++#define BNX2X_FLOW_CTRL_AUTO PORT_FEATURE_FLOW_CONTROL_AUTO ++#define BNX2X_FLOW_CTRL_TX PORT_FEATURE_FLOW_CONTROL_TX ++#define BNX2X_FLOW_CTRL_RX PORT_FEATURE_FLOW_CONTROL_RX ++#define BNX2X_FLOW_CTRL_BOTH PORT_FEATURE_FLOW_CONTROL_BOTH ++#define BNX2X_FLOW_CTRL_NONE PORT_FEATURE_FLOW_CONTROL_NONE + +-#define SPEED_AUTO_NEG 0 +-#define SPEED_12000 12000 +-#define SPEED_12500 12500 +-#define SPEED_13000 13000 +-#define SPEED_15000 15000 +-#define SPEED_16000 16000 ++#define SPEED_AUTO_NEG 0 ++#define SPEED_12000 12000 ++#define SPEED_12500 12500 ++#define SPEED_13000 13000 ++#define SPEED_15000 15000 ++#define SPEED_16000 16000 + +- ++#define SFP_EEPROM_VENDOR_NAME_ADDR 0x14 ++#define SFP_EEPROM_VENDOR_NAME_SIZE 16 ++#define SFP_EEPROM_VENDOR_OUI_ADDR 0x25 ++#define SFP_EEPROM_VENDOR_OUI_SIZE 3 ++#define SFP_EEPROM_PART_NO_ADDR 0x28 ++#define SFP_EEPROM_PART_NO_SIZE 16 ++#define PWR_FLT_ERR_MSG_LEN 250 + /***********************************************************/ + /* Structs */ + /***********************************************************/ +@@ -50,12 +56,12 @@ + + /* Default / User Configuration */ + u8 loopback_mode; +-#define LOOPBACK_NONE 0 +-#define LOOPBACK_EMAC 1 +-#define LOOPBACK_BMAC 2 +-#define LOOPBACK_XGXS_10 3 +-#define LOOPBACK_EXT_PHY 4 +-#define LOOPBACK_EXT 5 ++#define LOOPBACK_NONE 0 ++#define LOOPBACK_EMAC 1 ++#define LOOPBACK_BMAC 2 ++#define LOOPBACK_XGXS_10 3 ++#define LOOPBACK_EXT_PHY 4 ++#define LOOPBACK_EXT 5 + + u16 req_duplex; + u16 req_flow_ctrl; +@@ -66,8 +72,6 @@ + /* Device parameters */ + u8 mac_addr[6]; + +- +- + /* shmem parameters */ + u32 shmem_base; + u32 speed_cap_mask; +@@ -77,42 +81,60 @@ + #define SWITCH_CFG_AUTO_DETECT PORT_FEATURE_CON_SWITCH_AUTO_DETECT + + u16 hw_led_mode; /* part of the hw_config read from the shmem */ +- u32 serdes_config; ++ ++ /* phy_addr populated by the CLC */ ++ u8 phy_addr; ++ /*u8 reserved1;*/ ++ + u32 lane_config; + u32 ext_phy_config; +-#define XGXS_EXT_PHY_TYPE(ext_phy_config) (ext_phy_config & \ +- PORT_HW_CFG_XGXS_EXT_PHY_TYPE_MASK) +-#define SERDES_EXT_PHY_TYPE(ext_phy_config) (ext_phy_config & \ +- PORT_HW_CFG_SERDES_EXT_PHY_TYPE_MASK) ++#define XGXS_EXT_PHY_TYPE(ext_phy_config) \ ++ ((ext_phy_config) & PORT_HW_CFG_XGXS_EXT_PHY_TYPE_MASK) ++#define XGXS_EXT_PHY_ADDR(ext_phy_config) \ ++ (((ext_phy_config) & PORT_HW_CFG_XGXS_EXT_PHY_ADDR_MASK) >> \ ++ PORT_HW_CFG_XGXS_EXT_PHY_ADDR_SHIFT) ++#define SERDES_EXT_PHY_TYPE(ext_phy_config) \ ++ ((ext_phy_config) & PORT_HW_CFG_SERDES_EXT_PHY_TYPE_MASK) ++ + /* Phy register parameter */ + u32 chip_id; + +- /* phy_addr populated by the CLC */ +- u8 phy_addr; ++ u16 xgxs_config_rx[4]; /* preemphasis values for the rx side */ ++ u16 xgxs_config_tx[4]; /* preemphasis values for the tx side */ ++ ++ u32 feature_config_flags; ++#define FEATURE_CONFIG_OVERRIDE_PREEMPHASIS_ENABLED (1<<0) ++#define FEATURE_CONFIG_PFC_ENABLED (1<<1) ++#define FEATURE_CONFIG_BC_SUPPORTS_OPT_MDL_VRFY (1<<2) ++#define FEATURE_CONFIG_BCM8727_NOC (1<<3) ++ + /* Device pointer passed to all callback functions */ + struct bnx2x *bp; + }; + + /* Output parameters */ + struct link_vars { ++ u8 phy_flags; ++ ++ u8 mac_type; ++#define MAC_TYPE_NONE 0 ++#define MAC_TYPE_EMAC 1 ++#define MAC_TYPE_BMAC 2 ++ + u8 phy_link_up; /* internal phy link indication */ + u8 link_up; ++ ++ u16 line_speed; + u16 duplex; ++ + u16 flow_ctrl; +- u32 ieee_fc; +- u8 mac_type; ++ u16 ieee_fc; + +-#define MAC_TYPE_NONE 0 +-#define MAC_TYPE_EMAC 1 +-#define MAC_TYPE_BMAC 2 +- u16 line_speed; + u32 autoneg; + #define AUTO_NEG_DISABLED 0x0 + #define AUTO_NEG_ENABLED 0x1 + #define AUTO_NEG_COMPLETE 0x2 +-#define AUTO_NEG_PARALLEL_DETECTION_USED 0x3 +- +- u8 phy_flags; ++#define AUTO_NEG_PARALLEL_DETECTION_USED 0x3 + + /* The same definitions as the shmem parameter */ + u32 link_status; +@@ -125,8 +147,11 @@ + /* Initialize the phy */ + u8 bnx2x_phy_init(struct link_params *input, struct link_vars *output); + +-/* Reset the link. Should be called when driver or interface goes down */ +-u8 bnx2x_link_reset(struct link_params *params, struct link_vars *vars); ++/* Reset the link. Should be called when driver or interface goes down ++ Before calling phy firmware upgrade, the reset_ext_phy should be set ++ to 0 */ ++u8 bnx2x_link_reset(struct link_params *params, struct link_vars *vars, ++ u8 reset_ext_phy); + + /* bnx2x_link_update should be called upon link interrupt */ + u8 bnx2x_link_update(struct link_params *input, struct link_vars *output); +@@ -163,6 +188,10 @@ + + u8 bnx2x_flash_download(struct bnx2x *bp, u8 port, u32 ext_phy_config, + u8 driver_loaded, char data[], u32 size); ++/* bnx2x_handle_module_detect_int should be called upon module detection ++ interrupt */ ++void bnx2x_handle_module_detect_int(struct link_params *params); ++ + /* Get the actual link status. In case it returns 0, link is up, + otherwise link is down*/ + u8 bnx2x_test_link(struct link_params *input, struct link_vars *vars); +@@ -170,4 +199,12 @@ + /* One-time initialization for external phy after power up */ + u8 bnx2x_common_init_phy(struct bnx2x *bp, u32 shmem_base); + ++/* Reset the external PHY using GPIO */ ++void bnx2x_ext_phy_hw_reset(struct bnx2x *bp, u8 port); ++ ++void bnx2x_sfx7101_sp_sw_reset(struct bnx2x *bp, u8 port, u8 phy_addr); ++ ++u8 bnx2x_read_sfp_module_eeprom(struct link_params *params, u16 addr, ++ u8 byte_cnt, u8 *o_buf); ++ + #endif /* BNX2X_LINK_H */ +diff -r ddb96c0bbe13 drivers/net/bnx2x_main.c +--- a/drivers/net/bnx2x_main.c Tue Jun 16 11:03:28 2009 +0100 ++++ b/drivers/net/bnx2x_main.c Tue Jun 16 13:15:30 2009 +0100 +@@ -10,15 +10,20 @@ + * Written by: Eliezer Tamir + * Based on code from Michael Chan's bnx2 driver + * UDP CSUM errata workaround by Arik Gendelman +- * Slowpath rework by Vladislav Zolotarov ++ * Slowpath and fastpath rework by Vladislav Zolotarov + * Statistics and Link management by Yitchak Gertner + * + */ + ++#include + #include ++#if (LINUX_VERSION_CODE >= 0x020600) /* BNX2X_UPSTREAM */ + #include ++#endif + #include ++#if (LINUX_VERSION_CODE >= 0x020600) /* BNX2X_UPSTREAM */ + #include /* for dev_info() */ ++#endif + #include + #include + #include +@@ -30,7 +35,9 @@ + #include + #include + #include ++#if (LINUX_VERSION_CODE >= 0x020600) /* BNX2X_UPSTREAM */ + #include ++#endif + #include + #include + #include +@@ -40,26 +47,55 @@ + #include + #include + #include ++#if (LINUX_VERSION_CODE < 0x020600) /* ! BNX2X_UPSTREAM */ ++#include ++#endif + #include + #include ++#if (LINUX_VERSION_CODE > 0x020607) /* BNX2X_UPSTREAM */ + #include ++#endif ++#if (LINUX_VERSION_CODE >= 0x020600) /* BNX2X_UPSTREAM */ + #include ++#endif + #include ++#if (LINUX_VERSION_CODE >= 0x02061b) && !defined(BNX2X_DRIVER_DISK) && !defined(__VMKLNX__) /* BNX2X_UPSTREAM */ + #include ++#endif + #include + #include ++#if (LINUX_VERSION_CODE >= 0x020618) /* BNX2X_UPSTREAM */ + #include +- +-#include "bnx2x_reg.h" +-#include "bnx2x_fw_defs.h" +-#include "bnx2x_hsi.h" +-#include "bnx2x_link.h" ++#else ++#include ++#endif ++ ++#if (LINUX_VERSION_CODE < 0x020600) /* ! BNX2X_UPSTREAM */ ++#define __NO_TPA__ 1 ++#endif ++ + #include "bnx2x.h" + #include "bnx2x_init.h" +- +-#define DRV_MODULE_VERSION "1.45.26" +-#define DRV_MODULE_RELDATE "2009/01/26" ++#include "bnx2x_init_ops.h" ++#ifndef BNX2X_UPSTREAM /* ! BNX2X_UPSTREAM */ ++#include "bnx2x_self_test.h" ++#endif ++#include "bnx2x_dump.h" ++ ++#define DRV_MODULE_VERSION "1.50.8" ++#define DRV_MODULE_RELDATE "$DateTime: 2009/06/08 06:50:19 $" + #define BNX2X_BC_VER 0x040200 ++ ++#if defined(BNX2X_UPSTREAM) && !defined(BNX2X_USE_INIT_VALUES) /* BNX2X_UPSTREAM */ ++#include ++#include "bnx2x_fw_file_hdr.h" ++/* FW files */ ++#define FW_FILE_PREFIX_E1 "bnx2x-e1-" ++#define FW_FILE_PREFIX_E1H "bnx2x-e1h-" ++#else ++void bnx2x_init_e1_firmware(struct bnx2x *bp); ++void bnx2x_init_e1h_firmware(struct bnx2x *bp); ++#endif + + /* Time in jiffies before concluding the transmitter is hung */ + #define TX_TIMEOUT (5*HZ) +@@ -72,27 +108,93 @@ + MODULE_DESCRIPTION("Broadcom NetXtreme II BCM57710/57711/57711E Driver"); + MODULE_LICENSE("GPL"); + MODULE_VERSION(DRV_MODULE_VERSION); +- ++#ifndef BNX2X_UPSTREAM /* ! BNX2X_UPSTREAM */ ++#if (LINUX_VERSION_CODE >= 0x020600) /* ! BNX2X_UPSTREAM */ ++MODULE_INFO(cvs_version, "$Revision: #4 $"); ++#endif ++#endif ++ ++#ifdef BNX2X_NEW_NAPI /* BNX2X_UPSTREAM */ ++static int multi_mode = 1; ++module_param(multi_mode, int, 0); ++#ifdef BNX2X_SAFC ++MODULE_PARM_DESC(multi_mode, " Multi queue mode " ++ "(0 Disable; 1 Enable (default);" ++ " 2 VLAN PRI; 3 E1HOV PRI; 4 IP DSCP)"); ++ ++static int pri_map; ++module_param(pri_map, int, 0); ++MODULE_PARM_DESC(pri_map, " Priority to HW queue mapping"); ++ ++static int qs_per_cos; ++module_param(qs_per_cos, int, 0); ++MODULE_PARM_DESC(qs_per_cos, " Number of queues per HW queue"); ++ ++static int cos_min_rate; ++module_param(cos_min_rate, int, 0); ++MODULE_PARM_DESC(cos_min_rate, " Weight for RR between HW queues"); ++#else /* BNX2X_UPSTREAM */ ++MODULE_PARM_DESC(multi_mode, " Multi queue mode " ++ "(0 Disable; 1 Enable (default))"); ++#endif /* not BNX2X_SAFC */ ++#else /* not BNX2X_NEW_NAPI */ ++static int multi_mode; ++#endif ++ ++#ifdef BNX2X_NEW_NAPI /* BNX2X_UPSTREAM */ ++static int num_rx_queues; ++module_param(num_rx_queues, int, 0); ++MODULE_PARM_DESC(num_rx_queues, " Number of Rx queues for multi_mode=1" ++ " (default is half number of CPUs)"); ++#endif ++ ++#ifdef BNX2X_MULTI_QUEUE /* BNX2X_UPSTREAM */ ++static int num_tx_queues; ++module_param(num_tx_queues, int, 0); ++MODULE_PARM_DESC(num_tx_queues, " Number of Tx queues for multi_mode=1" ++ " (default is half number of CPUs)"); ++#endif ++ ++#if defined(__NO_TPA__) ++static int disable_tpa = 1; ++#else /* BNX2X_UPSTREAM */ + static int disable_tpa; +-static int use_inta; ++module_param(disable_tpa, int, 0); ++MODULE_PARM_DESC(disable_tpa, " Disable the TPA (LRO) feature"); ++#endif ++ ++static int int_mode; ++#if (LINUX_VERSION_CODE >= 0x020600) /* BNX2X_UPSTREAM */ ++module_param(int_mode, int, 0); ++MODULE_PARM_DESC(int_mode, " Force interrupt mode (1 INT#x; 2 MSI)"); ++#endif ++ ++static int dropless_fc; ++#if (LINUX_VERSION_CODE >= 0x020600) /* BNX2X_UPSTREAM */ ++module_param(dropless_fc, int, 0); ++MODULE_PARM_DESC(dropless_fc, " Pause on exhausted host ring"); ++#endif ++ + static int poll; ++#if (LINUX_VERSION_CODE >= 0x020600) /* BNX2X_UPSTREAM */ ++module_param(poll, int, 0); ++MODULE_PARM_DESC(poll, " Use polling (for debug)"); ++#endif ++ ++static int mrrs = -1; ++#if (LINUX_VERSION_CODE >= 0x020600) /* BNX2X_UPSTREAM */ ++module_param(mrrs, int, 0); ++MODULE_PARM_DESC(mrrs, " Force Max Read Req Size (0..3) (for debug)"); ++#endif ++ + static int debug; ++#if (LINUX_VERSION_CODE >= 0x020600) /* BNX2X_UPSTREAM */ ++module_param(debug, int, 0); ++MODULE_PARM_DESC(debug, " Default debug msglevel"); ++#endif ++ + static int load_count[3]; /* 0-common, 1-port0, 2-port1 */ +-static int use_multi; +- +-module_param(disable_tpa, int, 0); +-module_param(use_inta, int, 0); +-module_param(poll, int, 0); +-module_param(debug, int, 0); +-MODULE_PARM_DESC(disable_tpa, "disable the TPA (LRO) feature"); +-MODULE_PARM_DESC(use_inta, "use INT#A instead of MSI-X"); +-MODULE_PARM_DESC(poll, "use polling (for debug)"); +-MODULE_PARM_DESC(debug, "default debug msglevel"); +- +-#ifdef BNX2X_MULTI +-module_param(use_multi, int, 0); +-MODULE_PARM_DESC(use_multi, "use per-CPU queues"); +-#endif ++ + static struct workqueue_struct *bnx2x_wq; + + enum bnx2x_board_type { +@@ -110,6 +212,17 @@ + { "Broadcom NetXtreme II BCM57711E XGb" } + }; + ++#ifndef BNX2X_UPSTREAM /* ! BNX2X_UPSTREAM */ ++#ifndef PCI_DEVICE_ID_NX2_57710 ++#define PCI_DEVICE_ID_NX2_57710 0x164e ++#endif ++#ifndef PCI_DEVICE_ID_NX2_57711 ++#define PCI_DEVICE_ID_NX2_57711 0x164f ++#endif ++#ifndef PCI_DEVICE_ID_NX2_57711E ++#define PCI_DEVICE_ID_NX2_57711E 0x1650 ++#endif ++#endif + + static const struct pci_device_id bnx2x_pci_tbl[] = { + { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57710, +@@ -123,6 +236,10 @@ + + MODULE_DEVICE_TABLE(pci, bnx2x_pci_tbl); + ++#if defined(__VMKLNX__) && defined(__VMKNETDDI_QUEUEOPS__) /* ! BNX2X_UPSTREAM */ ++static int bnx2x_netqueue_ops(vmknetddi_queueops_op_t op, void *args); ++#endif ++ + /**************************************************************************** + * General service functions + ****************************************************************************/ +@@ -130,7 +247,7 @@ + /* used only at init + * locking is done by mcp + */ +-static void bnx2x_reg_wr_ind(struct bnx2x *bp, u32 addr, u32 val) ++void bnx2x_reg_wr_ind(struct bnx2x *bp, u32 addr, u32 val) + { + pci_write_config_dword(bp->pdev, PCICFG_GRC_ADDRESS, addr); + pci_write_config_dword(bp->pdev, PCICFG_GRC_DATA, val); +@@ -177,7 +294,7 @@ + void bnx2x_write_dmae(struct bnx2x *bp, dma_addr_t dma_addr, u32 dst_addr, + u32 len32) + { +- struct dmae_command *dmae = &bp->init_dmae; ++ struct dmae_command dmae; + u32 *wb_comp = bnx2x_sp(bp, wb_comp); + int cnt = 200; + +@@ -190,43 +307,43 @@ + return; + } + +- mutex_lock(&bp->dmae_mutex); +- +- memset(dmae, 0, sizeof(struct dmae_command)); +- +- dmae->opcode = (DMAE_CMD_SRC_PCI | DMAE_CMD_DST_GRC | +- DMAE_CMD_C_DST_PCI | DMAE_CMD_C_ENABLE | +- DMAE_CMD_SRC_RESET | DMAE_CMD_DST_RESET | ++ memset(&dmae, 0, sizeof(struct dmae_command)); ++ ++ dmae.opcode = (DMAE_CMD_SRC_PCI | DMAE_CMD_DST_GRC | ++ DMAE_CMD_C_DST_PCI | DMAE_CMD_C_ENABLE | ++ DMAE_CMD_SRC_RESET | DMAE_CMD_DST_RESET | + #ifdef __BIG_ENDIAN +- DMAE_CMD_ENDIANITY_B_DW_SWAP | +-#else +- DMAE_CMD_ENDIANITY_DW_SWAP | +-#endif +- (BP_PORT(bp) ? DMAE_CMD_PORT_1 : DMAE_CMD_PORT_0) | +- (BP_E1HVN(bp) << DMAE_CMD_E1HVN_SHIFT)); +- dmae->src_addr_lo = U64_LO(dma_addr); +- dmae->src_addr_hi = U64_HI(dma_addr); +- dmae->dst_addr_lo = dst_addr >> 2; +- dmae->dst_addr_hi = 0; +- dmae->len = len32; +- dmae->comp_addr_lo = U64_LO(bnx2x_sp_mapping(bp, wb_comp)); +- dmae->comp_addr_hi = U64_HI(bnx2x_sp_mapping(bp, wb_comp)); +- dmae->comp_val = DMAE_COMP_VAL; +- +- DP(BNX2X_MSG_OFF, "dmae: opcode 0x%08x\n" ++ DMAE_CMD_ENDIANITY_B_DW_SWAP | ++#else ++ DMAE_CMD_ENDIANITY_DW_SWAP | ++#endif ++ (BP_PORT(bp) ? DMAE_CMD_PORT_1 : DMAE_CMD_PORT_0) | ++ (BP_E1HVN(bp) << DMAE_CMD_E1HVN_SHIFT)); ++ dmae.src_addr_lo = U64_LO(dma_addr); ++ dmae.src_addr_hi = U64_HI(dma_addr); ++ dmae.dst_addr_lo = dst_addr >> 2; ++ dmae.dst_addr_hi = 0; ++ dmae.len = len32; ++ dmae.comp_addr_lo = U64_LO(bnx2x_sp_mapping(bp, wb_comp)); ++ dmae.comp_addr_hi = U64_HI(bnx2x_sp_mapping(bp, wb_comp)); ++ dmae.comp_val = DMAE_COMP_VAL; ++ ++ DP(BNX2X_MSG_OFF, "DMAE: opcode 0x%08x\n" + DP_LEVEL "src_addr [%x:%08x] len [%d *4] " + "dst_addr [%x:%08x (%08x)]\n" + DP_LEVEL "comp_addr [%x:%08x] comp_val 0x%08x\n", +- dmae->opcode, dmae->src_addr_hi, dmae->src_addr_lo, +- dmae->len, dmae->dst_addr_hi, dmae->dst_addr_lo, dst_addr, +- dmae->comp_addr_hi, dmae->comp_addr_lo, dmae->comp_val); ++ dmae.opcode, dmae.src_addr_hi, dmae.src_addr_lo, ++ dmae.len, dmae.dst_addr_hi, dmae.dst_addr_lo, dst_addr, ++ dmae.comp_addr_hi, dmae.comp_addr_lo, dmae.comp_val); + DP(BNX2X_MSG_OFF, "data [0x%08x 0x%08x 0x%08x 0x%08x]\n", + bp->slowpath->wb_data[0], bp->slowpath->wb_data[1], + bp->slowpath->wb_data[2], bp->slowpath->wb_data[3]); + ++ mutex_lock(&bp->dmae_mutex); ++ + *wb_comp = 0; + +- bnx2x_post_dmae(bp, dmae, INIT_DMAE_C(bp)); ++ bnx2x_post_dmae(bp, &dmae, INIT_DMAE_C(bp)); + + udelay(5); + +@@ -234,7 +351,7 @@ + DP(BNX2X_MSG_OFF, "wb_comp 0x%08x\n", *wb_comp); + + if (!cnt) { +- BNX2X_ERR("dmae timeout!\n"); ++ BNX2X_ERR("DMAE timeout!\n"); + break; + } + cnt--; +@@ -250,7 +367,7 @@ + + void bnx2x_read_dmae(struct bnx2x *bp, u32 src_addr, u32 len32) + { +- struct dmae_command *dmae = &bp->init_dmae; ++ struct dmae_command dmae; + u32 *wb_comp = bnx2x_sp(bp, wb_comp); + int cnt = 200; + +@@ -265,48 +382,48 @@ + return; + } + +- mutex_lock(&bp->dmae_mutex); +- +- memset(bnx2x_sp(bp, wb_data[0]), 0, sizeof(u32) * 4); +- memset(dmae, 0, sizeof(struct dmae_command)); +- +- dmae->opcode = (DMAE_CMD_SRC_GRC | DMAE_CMD_DST_PCI | +- DMAE_CMD_C_DST_PCI | DMAE_CMD_C_ENABLE | +- DMAE_CMD_SRC_RESET | DMAE_CMD_DST_RESET | ++ memset(&dmae, 0, sizeof(struct dmae_command)); ++ ++ dmae.opcode = (DMAE_CMD_SRC_GRC | DMAE_CMD_DST_PCI | ++ DMAE_CMD_C_DST_PCI | DMAE_CMD_C_ENABLE | ++ DMAE_CMD_SRC_RESET | DMAE_CMD_DST_RESET | + #ifdef __BIG_ENDIAN +- DMAE_CMD_ENDIANITY_B_DW_SWAP | +-#else +- DMAE_CMD_ENDIANITY_DW_SWAP | +-#endif +- (BP_PORT(bp) ? DMAE_CMD_PORT_1 : DMAE_CMD_PORT_0) | +- (BP_E1HVN(bp) << DMAE_CMD_E1HVN_SHIFT)); +- dmae->src_addr_lo = src_addr >> 2; +- dmae->src_addr_hi = 0; +- dmae->dst_addr_lo = U64_LO(bnx2x_sp_mapping(bp, wb_data)); +- dmae->dst_addr_hi = U64_HI(bnx2x_sp_mapping(bp, wb_data)); +- dmae->len = len32; +- dmae->comp_addr_lo = U64_LO(bnx2x_sp_mapping(bp, wb_comp)); +- dmae->comp_addr_hi = U64_HI(bnx2x_sp_mapping(bp, wb_comp)); +- dmae->comp_val = DMAE_COMP_VAL; +- +- DP(BNX2X_MSG_OFF, "dmae: opcode 0x%08x\n" ++ DMAE_CMD_ENDIANITY_B_DW_SWAP | ++#else ++ DMAE_CMD_ENDIANITY_DW_SWAP | ++#endif ++ (BP_PORT(bp) ? DMAE_CMD_PORT_1 : DMAE_CMD_PORT_0) | ++ (BP_E1HVN(bp) << DMAE_CMD_E1HVN_SHIFT)); ++ dmae.src_addr_lo = src_addr >> 2; ++ dmae.src_addr_hi = 0; ++ dmae.dst_addr_lo = U64_LO(bnx2x_sp_mapping(bp, wb_data)); ++ dmae.dst_addr_hi = U64_HI(bnx2x_sp_mapping(bp, wb_data)); ++ dmae.len = len32; ++ dmae.comp_addr_lo = U64_LO(bnx2x_sp_mapping(bp, wb_comp)); ++ dmae.comp_addr_hi = U64_HI(bnx2x_sp_mapping(bp, wb_comp)); ++ dmae.comp_val = DMAE_COMP_VAL; ++ ++ DP(BNX2X_MSG_OFF, "DMAE: opcode 0x%08x\n" + DP_LEVEL "src_addr [%x:%08x] len [%d *4] " + "dst_addr [%x:%08x (%08x)]\n" + DP_LEVEL "comp_addr [%x:%08x] comp_val 0x%08x\n", +- dmae->opcode, dmae->src_addr_hi, dmae->src_addr_lo, +- dmae->len, dmae->dst_addr_hi, dmae->dst_addr_lo, src_addr, +- dmae->comp_addr_hi, dmae->comp_addr_lo, dmae->comp_val); +- ++ dmae.opcode, dmae.src_addr_hi, dmae.src_addr_lo, ++ dmae.len, dmae.dst_addr_hi, dmae.dst_addr_lo, src_addr, ++ dmae.comp_addr_hi, dmae.comp_addr_lo, dmae.comp_val); ++ ++ mutex_lock(&bp->dmae_mutex); ++ ++ memset(bnx2x_sp(bp, wb_data[0]), 0, sizeof(u32) * 4); + *wb_comp = 0; + +- bnx2x_post_dmae(bp, dmae, INIT_DMAE_C(bp)); ++ bnx2x_post_dmae(bp, &dmae, INIT_DMAE_C(bp)); + + udelay(5); + + while (*wb_comp != DMAE_COMP_VAL) { + + if (!cnt) { +- BNX2X_ERR("dmae timeout!\n"); ++ BNX2X_ERR("DMAE timeout!\n"); + break; + } + cnt--; +@@ -321,6 +438,21 @@ + bp->slowpath->wb_data[2], bp->slowpath->wb_data[3]); + + mutex_unlock(&bp->dmae_mutex); ++} ++ ++void bnx2x_write_dmae_phys_len(struct bnx2x *bp, dma_addr_t phys_addr, ++ u32 addr, u32 len) ++{ ++ int offset = 0; ++ ++ while (len > DMAE_LEN32_WR_MAX) { ++ bnx2x_write_dmae(bp, phys_addr + offset, ++ addr + offset, DMAE_LEN32_WR_MAX); ++ offset += DMAE_LEN32_WR_MAX * 4; ++ len -= DMAE_LEN32_WR_MAX; ++ } ++ ++ bnx2x_write_dmae(bp, phys_addr + offset, addr + offset, len); + } + + /* used only for slowpath so not inlined */ +@@ -468,7 +600,7 @@ + static void bnx2x_fw_dump(struct bnx2x *bp) + { + u32 mark, offset; +- u32 data[9]; ++ __be32 data[9]; + int word; + + mark = REG_RD(bp, MCP_REG_MCPR_SCRATCH + 0xf104); +@@ -502,84 +634,111 @@ + + BNX2X_ERR("begin crash dump -----------------\n"); + +- for_each_queue(bp, i) { +- struct bnx2x_fastpath *fp = &bp->fp[i]; +- struct eth_tx_db_data *hw_prods = fp->hw_tx_prods; +- +- BNX2X_ERR("queue[%d]: tx_pkt_prod(%x) tx_pkt_cons(%x)" +- " tx_bd_prod(%x) tx_bd_cons(%x) *tx_cons_sb(%x)\n", +- i, fp->tx_pkt_prod, fp->tx_pkt_cons, fp->tx_bd_prod, +- fp->tx_bd_cons, le16_to_cpu(*fp->tx_cons_sb)); +- BNX2X_ERR(" rx_bd_prod(%x) rx_bd_cons(%x)" +- " *rx_bd_cons_sb(%x) rx_comp_prod(%x)" +- " rx_comp_cons(%x) *rx_cons_sb(%x)\n", +- fp->rx_bd_prod, fp->rx_bd_cons, +- le16_to_cpu(*fp->rx_bd_cons_sb), fp->rx_comp_prod, +- fp->rx_comp_cons, le16_to_cpu(*fp->rx_cons_sb)); +- BNX2X_ERR(" rx_sge_prod(%x) last_max_sge(%x)" +- " fp_c_idx(%x) *sb_c_idx(%x) fp_u_idx(%x)" +- " *sb_u_idx(%x) bd data(%x,%x)\n", +- fp->rx_sge_prod, fp->last_max_sge, fp->fp_c_idx, +- fp->status_blk->c_status_block.status_block_index, +- fp->fp_u_idx, +- fp->status_blk->u_status_block.status_block_index, +- hw_prods->packets_prod, hw_prods->bds_prod); +- +- start = TX_BD(le16_to_cpu(*fp->tx_cons_sb) - 10); +- end = TX_BD(le16_to_cpu(*fp->tx_cons_sb) + 245); +- for (j = start; j < end; j++) { +- struct sw_tx_bd *sw_bd = &fp->tx_buf_ring[j]; +- +- BNX2X_ERR("packet[%x]=[%p,%x]\n", j, +- sw_bd->skb, sw_bd->first_bd); +- } +- +- start = TX_BD(fp->tx_bd_cons - 10); +- end = TX_BD(fp->tx_bd_cons + 254); +- for (j = start; j < end; j++) { +- u32 *tx_bd = (u32 *)&fp->tx_desc_ring[j]; +- +- BNX2X_ERR("tx_bd[%x]=[%x:%x:%x:%x]\n", +- j, tx_bd[0], tx_bd[1], tx_bd[2], tx_bd[3]); +- } +- +- start = RX_BD(le16_to_cpu(*fp->rx_cons_sb) - 10); +- end = RX_BD(le16_to_cpu(*fp->rx_cons_sb) + 503); +- for (j = start; j < end; j++) { +- u32 *rx_bd = (u32 *)&fp->rx_desc_ring[j]; +- struct sw_rx_bd *sw_bd = &fp->rx_buf_ring[j]; +- +- BNX2X_ERR("rx_bd[%x]=[%x:%x] sw_bd=[%p]\n", +- j, rx_bd[1], rx_bd[0], sw_bd->skb); +- } +- +- start = RX_SGE(fp->rx_sge_prod); +- end = RX_SGE(fp->last_max_sge); +- for (j = start; j < end; j++) { +- u32 *rx_sge = (u32 *)&fp->rx_sge_ring[j]; +- struct sw_rx_page *sw_page = &fp->rx_page_ring[j]; +- +- BNX2X_ERR("rx_sge[%x]=[%x:%x] sw_page=[%p]\n", +- j, rx_sge[1], rx_sge[0], sw_page->page); +- } +- +- start = RCQ_BD(fp->rx_comp_cons - 10); +- end = RCQ_BD(fp->rx_comp_cons + 503); +- for (j = start; j < end; j++) { +- u32 *cqe = (u32 *)&fp->rx_comp_ring[j]; +- +- BNX2X_ERR("cqe[%x]=[%x:%x:%x:%x]\n", +- j, cqe[0], cqe[1], cqe[2], cqe[3]); +- } +- } +- ++ /* Indices */ ++ /* Common */ + BNX2X_ERR("def_c_idx(%u) def_u_idx(%u) def_x_idx(%u)" + " def_t_idx(%u) def_att_idx(%u) attn_state(%u)" + " spq_prod_idx(%u)\n", + bp->def_c_idx, bp->def_u_idx, bp->def_x_idx, bp->def_t_idx, + bp->def_att_idx, bp->attn_state, bp->spq_prod_idx); + ++ /* Rx */ ++ for_each_rx_queue(bp, i) { ++ struct bnx2x_fastpath *fp = &bp->fp[i]; ++ ++ BNX2X_ERR("fp%d: rx_bd_prod(%x) rx_bd_cons(%x)" ++ " *rx_bd_cons_sb(%x) rx_comp_prod(%x)" ++ " rx_comp_cons(%x) *rx_cons_sb(%x)\n", ++ i, fp->rx_bd_prod, fp->rx_bd_cons, ++ le16_to_cpu(*fp->rx_bd_cons_sb), fp->rx_comp_prod, ++ fp->rx_comp_cons, le16_to_cpu(*fp->rx_cons_sb)); ++ BNX2X_ERR(" rx_sge_prod(%x) last_max_sge(%x)" ++ " fp_u_idx(%x) *sb_u_idx(%x)\n", ++ fp->rx_sge_prod, fp->last_max_sge, ++ le16_to_cpu(fp->fp_u_idx), ++ fp->status_blk->u_status_block.status_block_index); ++ } ++ ++ /* Tx */ ++ for_each_tx_queue(bp, i) { ++ struct bnx2x_fastpath *fp = &bp->fp[i]; ++ ++ BNX2X_ERR("fp%d: tx_pkt_prod(%x) tx_pkt_cons(%x)" ++ " tx_bd_prod(%x) tx_bd_cons(%x) *tx_cons_sb(%x)\n", ++ i, fp->tx_pkt_prod, fp->tx_pkt_cons, fp->tx_bd_prod, ++ fp->tx_bd_cons, le16_to_cpu(*fp->tx_cons_sb)); ++ BNX2X_ERR(" fp_c_idx(%x) *sb_c_idx(%x)" ++ " tx_db_prod(%x)\n", le16_to_cpu(fp->fp_c_idx), ++ fp->status_blk->c_status_block.status_block_index, ++ fp->tx_db.data.prod); ++ } ++ ++ /* Rings */ ++ /* Rx */ ++ for_each_rx_queue(bp, i) { ++ struct bnx2x_fastpath *fp = &bp->fp[i]; ++ ++ start = RX_BD(le16_to_cpu(*fp->rx_cons_sb) - 10); ++ end = RX_BD(le16_to_cpu(*fp->rx_cons_sb) + 503); ++ for (j = start; j != end; j = RX_BD(j + 1)) { ++ u32 *rx_bd = (u32 *)&fp->rx_desc_ring[j]; ++ struct sw_rx_bd *sw_bd = &fp->rx_buf_ring[j]; ++ ++ BNX2X_ERR("fp%d: rx_bd[%x]=[%x:%x] sw_bd=[%p]\n", ++ i, j, rx_bd[1], rx_bd[0], sw_bd->skb); ++ } ++ ++ start = RX_SGE(fp->rx_sge_prod); ++ end = RX_SGE(fp->last_max_sge); ++ for (j = start; j != end; j = RX_SGE(j + 1)) { ++ u32 *rx_sge = (u32 *)&fp->rx_sge_ring[j]; ++ struct sw_rx_page *sw_page = &fp->rx_page_ring[j]; ++ ++ BNX2X_ERR("fp%d: rx_sge[%x]=[%x:%x] sw_page=[%p]\n", ++ i, j, rx_sge[1], rx_sge[0], sw_page->page); ++ } ++ ++ start = RCQ_BD(fp->rx_comp_cons - 10); ++ end = RCQ_BD(fp->rx_comp_cons + 503); ++ for (j = start; j != end; j = RCQ_BD(j + 1)) { ++ u32 *cqe = (u32 *)&fp->rx_comp_ring[j]; ++ ++ BNX2X_ERR("fp%d: cqe[%x]=[%x:%x:%x:%x]\n", ++ i, j, cqe[0], cqe[1], cqe[2], cqe[3]); ++ } ++ } ++ ++ /* Tx */ ++ for_each_tx_queue(bp, i) { ++ struct bnx2x_fastpath *fp = &bp->fp[i]; ++ ++ start = TX_BD(le16_to_cpu(*fp->tx_cons_sb) - 10); ++ end = TX_BD(le16_to_cpu(*fp->tx_cons_sb) + 245); ++ for (j = start; j != end; j = TX_BD(j + 1)) { ++ struct sw_tx_bd *sw_bd = &fp->tx_buf_ring[j]; ++ ++ BNX2X_ERR("fp%d: packet[%x]=[%p,%x]\n", ++ i, j, sw_bd->skb, sw_bd->first_bd); ++ } ++ ++ start = TX_BD(fp->tx_bd_cons - 10); ++ end = TX_BD(fp->tx_bd_cons + 254); ++ for (j = start; j != end; j = TX_BD(j + 1)) { ++ u32 *tx_bd = (u32 *)&fp->tx_desc_ring[j]; ++ ++ BNX2X_ERR("fp%d: tx_bd[%x]=[%x:%x:%x:%x]\n", ++ i, j, tx_bd[0], tx_bd[1], tx_bd[2], tx_bd[3]); ++ } ++ } ++ + bnx2x_fw_dump(bp); ++#ifndef BNX2X_UPSTREAM /* ! BNX2X_UPSTREAM */ ++ bp->msglevel |= NETIF_MSG_PROBE; ++ BNX2X_ERR("Idle check (1st round) ----------\n"); ++ bnx2x_idle_chk(bp); ++ BNX2X_ERR("Idle check (2nd round) ----------\n"); ++ bnx2x_idle_chk(bp); ++#endif + bnx2x_mc_assert(bp); + BNX2X_ERR("end crash dump -----------------\n"); + } +@@ -590,10 +749,17 @@ + u32 addr = port ? HC_REG_CONFIG_1 : HC_REG_CONFIG_0; + u32 val = REG_RD(bp, addr); + int msix = (bp->flags & USING_MSIX_FLAG) ? 1 : 0; ++ int msi = (bp->flags & USING_MSI_FLAG) ? 1 : 0; + + if (msix) { +- val &= ~HC_CONFIG_0_REG_SINGLE_ISR_EN_0; ++ val &= ~(HC_CONFIG_0_REG_SINGLE_ISR_EN_0 | ++ HC_CONFIG_0_REG_INT_LINE_EN_0); + val |= (HC_CONFIG_0_REG_MSI_MSIX_INT_EN_0 | ++ HC_CONFIG_0_REG_ATTN_BIT_EN_0); ++ } else if (msi) { ++ val &= ~HC_CONFIG_0_REG_INT_LINE_EN_0; ++ val |= (HC_CONFIG_0_REG_SINGLE_ISR_EN_0 | ++ HC_CONFIG_0_REG_MSI_MSIX_INT_EN_0 | + HC_CONFIG_0_REG_ATTN_BIT_EN_0); + } else { + val |= (HC_CONFIG_0_REG_SINGLE_ISR_EN_0 | +@@ -601,32 +767,36 @@ + HC_CONFIG_0_REG_INT_LINE_EN_0 | + HC_CONFIG_0_REG_ATTN_BIT_EN_0); + +- DP(NETIF_MSG_INTR, "write %x to HC %d (addr 0x%x) MSI-X %d\n", +- val, port, addr, msix); ++ DP(NETIF_MSG_INTR, "write %x to HC %d (addr 0x%x)\n", ++ val, port, addr); + + REG_WR(bp, addr, val); + + val &= ~HC_CONFIG_0_REG_MSI_MSIX_INT_EN_0; + } + +- DP(NETIF_MSG_INTR, "write %x to HC %d (addr 0x%x) MSI-X %d\n", +- val, port, addr, msix); ++ DP(NETIF_MSG_INTR, "write %x to HC %d (addr 0x%x) mode %s\n", ++ val, port, addr, (msix ? "MSI-X" : (msi ? "MSI" : "INTx"))); + + REG_WR(bp, addr, val); ++ barrier(); + + if (CHIP_IS_E1H(bp)) { + /* init leading/trailing edge */ + if (IS_E1HMF(bp)) { +- val = (0xfe0f | (1 << (BP_E1HVN(bp) + 4))); ++ val = (0xee0f | (1 << (BP_E1HVN(bp) + 4))); + if (bp->port.pmf) +- /* enable nig attention */ +- val |= 0x0100; ++ /* enable nig and gpio3 attention */ ++ val |= 0x1100; + } else + val = 0xffff; + + REG_WR(bp, HC_REG_TRAILING_EDGE_0 + port*8, val); + REG_WR(bp, HC_REG_LEADING_EDGE_0 + port*8, val); + } ++ ++ /* Make sure that interrupts are indeed enabled from here on */ ++ mmiowb(); + } + + static void bnx2x_int_disable(struct bnx2x *bp) +@@ -643,6 +813,9 @@ + DP(NETIF_MSG_INTR, "write %x to HC %d (addr 0x%x)\n", + val, port, addr); + ++ /* flush all outstanding writes */ ++ mmiowb(); ++ + REG_WR(bp, addr, val); + if (REG_RD(bp, addr) != val) + BNX2X_ERR("BUG! proper val not read from IGU!\n"); +@@ -650,28 +823,50 @@ + + static void bnx2x_int_disable_sync(struct bnx2x *bp, int disable_hw) + { ++#ifdef CONFIG_PCI_MSI /* BNX2X_UPSTREAM */ + int msix = (bp->flags & USING_MSIX_FLAG) ? 1 : 0; +- int i; ++ int i, offset; ++#endif ++#if (LINUX_VERSION_CODE < 0x020618) /* ! BNX2X_UPSTREAM */ ++ int j; ++#endif + + /* disable interrupt handling */ + atomic_inc(&bp->intr_sem); ++ smp_wmb(); /* Ensure that bp->intr_sem update is SMP-safe */ ++ + if (disable_hw) + /* prevent the HW from sending interrupts */ + bnx2x_int_disable(bp); + + /* make sure all ISRs are done */ ++#ifdef CONFIG_PCI_MSI /* BNX2X_UPSTREAM */ + if (msix) { ++ synchronize_irq(bp->msix_table[0].vector); ++ offset = 1; ++#ifdef BCM_CNIC /* ! BNX2X_UPSTREAM */ ++ offset++; ++#endif + for_each_queue(bp, i) +- synchronize_irq(bp->msix_table[i].vector); +- +- /* one more for the Slow Path IRQ */ +- synchronize_irq(bp->msix_table[i].vector); ++ synchronize_irq(bp->msix_table[i + offset].vector); + } else ++#endif + synchronize_irq(bp->pdev->irq); + + /* make sure sp_task is not running */ ++#if (LINUX_VERSION_CODE >= 0x020618) /* BNX2X_UPSTREAM */ + cancel_delayed_work(&bp->sp_task); + flush_workqueue(bnx2x_wq); ++#else ++ j = 0; ++ smp_mb(); /* sp_running is set by sp_task */ ++ while (bp->sp_running) { ++ if (!(++j % 1000)) ++ BNX2X_ERR("sp_running (j %d)\n", j); ++ msleep(1); ++ smp_mb(); ++ } ++#endif + } + + /* fast path */ +@@ -694,9 +889,17 @@ + (update << IGU_ACK_REGISTER_UPDATE_INDEX_SHIFT) | + (op << IGU_ACK_REGISTER_INTERRUPT_MODE_SHIFT)); + ++#if (LINUX_VERSION_CODE < 0x020600) /* ! BNX2X_UPSTREAM */ ++ /* x86's writel() in 2.4.x does not have barrier(). */ ++ barrier(); ++#endif + DP(BNX2X_MSG_OFF, "write 0x%08x to HC addr 0x%x\n", + (*(u32 *)&igu_ack), hc_addr); + REG_WR(bp, hc_addr, (*(u32 *)&igu_ack)); ++ ++ /* Make sure that ACK is written */ ++ mmiowb(); ++ barrier(); + } + + static inline u16 bnx2x_update_fpsb_idx(struct bnx2x_fastpath *fp) +@@ -733,22 +936,11 @@ + * fast path service functions + */ + +-static inline int bnx2x_has_tx_work(struct bnx2x_fastpath *fp) +-{ +- u16 tx_cons_sb; +- +- /* Tell compiler that status block fields can change */ +- barrier(); +- tx_cons_sb = le16_to_cpu(*fp->tx_cons_sb); +- return (fp->tx_pkt_cons != tx_cons_sb); +-} +- + static inline int bnx2x_has_tx_work_unload(struct bnx2x_fastpath *fp) + { + /* Tell compiler that consumer and producer can change */ + barrier(); + return (fp->tx_pkt_prod != fp->tx_pkt_cons); +- + } + + /* free skb in the packet ring at pos idx +@@ -758,61 +950,60 @@ + u16 idx) + { + struct sw_tx_bd *tx_buf = &fp->tx_buf_ring[idx]; +- struct eth_tx_bd *tx_bd; ++ struct eth_tx_start_bd *tx_start_bd; ++ struct eth_tx_bd *tx_data_bd; + struct sk_buff *skb = tx_buf->skb; + u16 bd_idx = TX_BD(tx_buf->first_bd), new_cons; + int nbd; + ++ /* prefetch skb end pointer to speedup dev_kfree_skb() */ ++ prefetch(&skb->end); ++ + DP(BNX2X_MSG_OFF, "pkt_idx %d buff @(%p)->skb %p\n", + idx, tx_buf, skb); + + /* unmap first bd */ + DP(BNX2X_MSG_OFF, "free bd_idx %d\n", bd_idx); +- tx_bd = &fp->tx_desc_ring[bd_idx]; +- pci_unmap_single(bp->pdev, BD_UNMAP_ADDR(tx_bd), +- BD_UNMAP_LEN(tx_bd), PCI_DMA_TODEVICE); +- +- nbd = le16_to_cpu(tx_bd->nbd) - 1; +- new_cons = nbd + tx_buf->first_bd; +-#ifdef BNX2X_STOP_ON_ERROR +- if (nbd > (MAX_SKB_FRAGS + 2)) { ++ tx_start_bd = &fp->tx_desc_ring[bd_idx].start_bd; ++ pci_unmap_single(bp->pdev, BD_UNMAP_ADDR(tx_start_bd), ++ BD_UNMAP_LEN(tx_start_bd), PCI_DMA_TODEVICE); ++ ++ nbd = le16_to_cpu(tx_start_bd->nbd) - 1; ++#ifdef BNX2X_STOP_ON_ERROR ++ if ((nbd - 1) > (MAX_SKB_FRAGS + 2)) { + BNX2X_ERR("BAD nbd!\n"); + bnx2x_panic(); + } + #endif +- +- /* Skip a parse bd and the TSO split header bd +- since they have no mapping */ +- if (nbd) ++ new_cons = nbd + tx_buf->first_bd; ++ ++ /* Get the next bd */ ++ bd_idx = TX_BD(NEXT_TX_IDX(bd_idx)); ++ ++ /* Skip a parse bd... */ ++ --nbd; ++ bd_idx = TX_BD(NEXT_TX_IDX(bd_idx)); ++ ++ /* ...and the TSO split header bd since they have no mapping */ ++ if (tx_buf->flags & BNX2X_TSO_SPLIT_BD) { ++ --nbd; + bd_idx = TX_BD(NEXT_TX_IDX(bd_idx)); +- +- if (tx_bd->bd_flags.as_bitfield & (ETH_TX_BD_FLAGS_IP_CSUM | +- ETH_TX_BD_FLAGS_TCP_CSUM | +- ETH_TX_BD_FLAGS_SW_LSO)) { ++ } ++ ++ /* now free frags */ ++ while (nbd > 0) { ++ ++ DP(BNX2X_MSG_OFF, "free frag bd_idx %d\n", bd_idx); ++ tx_data_bd = &fp->tx_desc_ring[bd_idx].reg_bd; ++ pci_unmap_page(bp->pdev, BD_UNMAP_ADDR(tx_data_bd), ++ BD_UNMAP_LEN(tx_data_bd), PCI_DMA_TODEVICE); + if (--nbd) + bd_idx = TX_BD(NEXT_TX_IDX(bd_idx)); +- tx_bd = &fp->tx_desc_ring[bd_idx]; +- /* is this a TSO split header bd? */ +- if (tx_bd->bd_flags.as_bitfield & ETH_TX_BD_FLAGS_SW_LSO) { +- if (--nbd) +- bd_idx = TX_BD(NEXT_TX_IDX(bd_idx)); +- } +- } +- +- /* now free frags */ +- while (nbd > 0) { +- +- DP(BNX2X_MSG_OFF, "free frag bd_idx %d\n", bd_idx); +- tx_bd = &fp->tx_desc_ring[bd_idx]; +- pci_unmap_page(bp->pdev, BD_UNMAP_ADDR(tx_bd), +- BD_UNMAP_LEN(tx_bd), PCI_DMA_TODEVICE); +- if (--nbd) +- bd_idx = TX_BD(NEXT_TX_IDX(bd_idx)); + } + + /* release skb */ + WARN_ON(!skb); +- dev_kfree_skb(skb); ++ dev_kfree_skb_any(skb); + tx_buf->first_bd = 0; + tx_buf->skb = NULL; + +@@ -842,9 +1033,12 @@ + return (s16)(fp->bp->tx_ring_size) - used; + } + +-static void bnx2x_tx_int(struct bnx2x_fastpath *fp, int work) ++static void bnx2x_tx_int(struct bnx2x_fastpath *fp) + { + struct bnx2x *bp = fp->bp; ++#ifdef BNX2X_MULTI_QUEUE /* BNX2X_UPSTREAM */ ++ struct netdev_queue *txq; ++#endif + u16 hw_cons, sw_cons, bd_cons = fp->tx_bd_cons; + int done = 0; + +@@ -853,6 +1047,9 @@ + return; + #endif + ++#ifdef BNX2X_MULTI_QUEUE /* BNX2X_UPSTREAM */ ++ txq = netdev_get_tx_queue(bp->dev, fp->index - bp->num_rx_queues); ++#endif + hw_cons = le16_to_cpu(*fp->tx_cons_sb); + sw_cons = fp->tx_pkt_cons; + +@@ -874,35 +1071,45 @@ + bd_cons = bnx2x_free_tx_pkt(bp, fp, pkt_cons); + sw_cons++; + done++; +- +- if (done == work) +- break; + } + + fp->tx_pkt_cons = sw_cons; + fp->tx_bd_cons = bd_cons; + +- /* Need to make the tx_cons update visible to start_xmit() +- * before checking for netif_queue_stopped(). Without the +- * memory barrier, there is a small possibility that start_xmit() +- * will miss it and cause the queue to be stopped forever. +- */ +- smp_mb(); +- + /* TBD need a thresh? */ ++#ifdef BNX2X_MULTI_QUEUE /* BNX2X_UPSTREAM */ ++ if (unlikely(netif_tx_queue_stopped(txq))) { ++ ++ /* Need to make the tx_bd_cons update visible to start_xmit() ++ * before checking for netif_tx_queue_stopped(). Without the ++ * memory barrier, there is a small possibility that ++ * start_xmit() will miss it and cause the queue to be stopped ++ * forever. ++ */ ++ smp_mb(); ++ ++ if ((netif_tx_queue_stopped(txq)) && ++ (bp->state == BNX2X_STATE_OPEN) && ++ (bnx2x_tx_avail(fp) >= MAX_SKB_FRAGS + 3)) ++ netif_tx_wake_queue(txq); ++ } ++#else + if (unlikely(netif_queue_stopped(bp->dev))) { + +- netif_tx_lock(bp->dev); ++ /* See above */ ++ smp_mb(); + + if (netif_queue_stopped(bp->dev) && + (bp->state == BNX2X_STATE_OPEN) && + (bnx2x_tx_avail(fp) >= MAX_SKB_FRAGS + 3)) + netif_wake_queue(bp->dev); +- +- netif_tx_unlock(bp->dev); +- } +-} +- ++ } ++#endif ++} ++ ++#ifdef BCM_CNIC /* ! BNX2X_UPSTREAM */ ++static void bnx2x_cnic_cfc_comp(struct bnx2x *bp, int cid); ++#endif + + static void bnx2x_sp_event(struct bnx2x_fastpath *fp, + union eth_rx_cqe *rr_cqe) +@@ -913,12 +1120,12 @@ + + DP(BNX2X_MSG_SP, + "fp %d cid %d got ramrod #%d state is %x type is %d\n", +- FP_IDX(fp), cid, command, bp->state, ++ fp->index, cid, command, bp->state, + rr_cqe->ramrod_cqe.ramrod_type); + + bp->spq_left++; + +- if (FP_IDX(fp)) { ++ if (fp->index) { + switch (command | fp->state) { + case (RAMROD_CMD_ID_ETH_CLIENT_SETUP | + BNX2X_FP_STATE_OPENING): +@@ -959,6 +1166,12 @@ + bnx2x_fp(bp, cid, state) = BNX2X_FP_STATE_CLOSED; + break; + ++#ifdef BCM_CNIC /* ! BNX2X_UPSTREAM */ ++ case (RAMROD_CMD_ID_ETH_CFC_DEL | BNX2X_STATE_OPEN): ++ DP(NETIF_MSG_IFDOWN, "got delete ramrod for CID %d\n", cid); ++ bnx2x_cnic_cfc_comp(bp, cid); ++ break; ++#endif + + case (RAMROD_CMD_ID_ETH_SET_MAC | BNX2X_STATE_OPEN): + case (RAMROD_CMD_ID_ETH_SET_MAC | BNX2X_STATE_DIAG): +@@ -967,6 +1180,7 @@ + break; + + case (RAMROD_CMD_ID_ETH_SET_MAC | BNX2X_STATE_CLOSING_WAIT4_HALT): ++ case (RAMROD_CMD_ID_ETH_SET_MAC | BNX2X_STATE_DISABLED): + DP(NETIF_MSG_IFDOWN, "got (un)set mac ramrod\n"); + break; + +@@ -1020,7 +1234,11 @@ + + mapping = pci_map_page(bp->pdev, page, 0, SGE_PAGE_SIZE*PAGES_PER_SGE, + PCI_DMA_FROMDEVICE); ++#if (LINUX_VERSION_CODE >= 0x02061b) /* BNX2X_UPSTREAM */ + if (unlikely(dma_mapping_error(&bp->pdev->dev, mapping))) { ++#else ++ if (unlikely(dma_mapping_error(mapping))) { ++#endif + __free_pages(page, PAGES_PER_SGE_SHIFT); + return -ENOMEM; + } +@@ -1048,7 +1266,11 @@ + + mapping = pci_map_single(bp->pdev, skb->data, bp->rx_buf_size, + PCI_DMA_FROMDEVICE); ++#if (LINUX_VERSION_CODE >= 0x02061b) /* BNX2X_UPSTREAM */ + if (unlikely(dma_mapping_error(&bp->pdev->dev, mapping))) { ++#else ++ if (unlikely(dma_mapping_error(mapping))) { ++#endif + dev_kfree_skb(skb); + return -ENOMEM; + } +@@ -1078,8 +1300,7 @@ + + pci_dma_sync_single_for_device(bp->pdev, + pci_unmap_addr(cons_rx_buf, mapping), +- bp->rx_offset + RX_COPY_THRESH, +- PCI_DMA_FROMDEVICE); ++ RX_COPY_THRESH, PCI_DMA_FROMDEVICE); + + prod_rx_buf->skb = cons_rx_buf->skb; + pci_unmap_addr_set(prod_rx_buf, mapping, +@@ -1087,6 +1308,7 @@ + *prod_bd = *cons_bd; + } + ++#if !defined(__NO_TPA__) /* BNX2X_UPSTREAM */ + static inline void bnx2x_update_last_max_sge(struct bnx2x_fastpath *fp, + u16 idx) + { +@@ -1206,10 +1428,18 @@ + + #ifdef BNX2X_STOP_ON_ERROR + fp->tpa_queue_used |= (1 << queue); +-#ifdef __powerpc64__ ++#if (LINUX_VERSION_CODE >= 0x02061a) /* BNX2X_UPSTREAM */ ++#ifdef _ASM_GENERIC_INT_L64_H + DP(NETIF_MSG_RX_STATUS, "fp->tpa_queue_used = 0x%lx\n", + #else + DP(NETIF_MSG_RX_STATUS, "fp->tpa_queue_used = 0x%llx\n", ++#endif ++#else ++#if defined(__powerpc64__) || defined(_ASM_IA64_TYPES_H) ++ DP(NETIF_MSG_RX_STATUS, "fp->tpa_queue_used = 0x%lx\n", ++#else ++ DP(NETIF_MSG_RX_STATUS, "fp->tpa_queue_used = 0x%llx\n", ++#endif + #endif + fp->tpa_queue_used); + #endif +@@ -1260,7 +1490,7 @@ + where we are and drop the whole packet */ + err = bnx2x_alloc_rx_sge(bp, fp, sge_idx); + if (unlikely(err)) { +- bp->eth_stats.rx_skb_alloc_failed++; ++ fp->eth_q_stats.rx_skb_alloc_failed++; + return err; + } + +@@ -1357,7 +1587,9 @@ + dev_kfree_skb(skb); + } + ++#if (LINUX_VERSION_CODE < 0x02061b) /* ! BNX2X_UPSTREAM */ + bp->dev->last_rx = jiffies; ++#endif + + /* put new skb in bin */ + fp->tpa_pool[queue].skb = new_skb; +@@ -1366,18 +1598,19 @@ + /* else drop the packet and keep the buffer in the bin */ + DP(NETIF_MSG_RX_STATUS, + "Failed to allocate new skb - dropping packet!\n"); +- bp->eth_stats.rx_skb_alloc_failed++; ++ fp->eth_q_stats.rx_skb_alloc_failed++; + } + + fp->tpa_state[queue] = BNX2X_TPA_STOP; + } ++#endif + + static inline void bnx2x_update_rx_prod(struct bnx2x *bp, + struct bnx2x_fastpath *fp, + u16 bd_prod, u16 rx_comp_prod, + u16 rx_sge_prod) + { +- struct tstorm_eth_rx_producers rx_prods = {0}; ++ struct ustorm_eth_rx_producers rx_prods = {0}; + int i; + + /* Update producers */ +@@ -1395,16 +1628,16 @@ + */ + wmb(); + +- for (i = 0; i < sizeof(struct tstorm_eth_rx_producers)/4; i++) +- REG_WR(bp, BAR_TSTRORM_INTMEM + +- TSTORM_RX_PRODS_OFFSET(BP_PORT(bp), FP_CL_ID(fp)) + i*4, ++ for (i = 0; i < sizeof(struct ustorm_eth_rx_producers)/4; i++) ++ REG_WR(bp, BAR_USTRORM_INTMEM + ++ USTORM_RX_PRODS_OFFSET(BP_PORT(bp), fp->cl_id) + i*4, + ((u32 *)&rx_prods)[i]); + + mmiowb(); /* keep prod updates ordered */ + + DP(NETIF_MSG_RX_STATUS, +- "Wrote: bd_prod %u cqe_prod %u sge_prod %u\n", +- bd_prod, rx_comp_prod, rx_sge_prod); ++ "queue[%d]: wrote bd_prod %u cqe_prod %u sge_prod %u\n", ++ fp->index, bd_prod, rx_comp_prod, rx_sge_prod); + } + + static int bnx2x_rx_int(struct bnx2x_fastpath *fp, int budget) +@@ -1438,7 +1671,7 @@ + + DP(NETIF_MSG_RX_STATUS, + "queue[%d]: hw_comp_cons %u sw_comp_cons %u\n", +- FP_IDX(fp), hw_comp_cons, sw_comp_cons); ++ fp->index, hw_comp_cons, sw_comp_cons); + + while (sw_comp_cons != hw_comp_cons) { + struct sw_rx_bd *rx_buf = NULL; +@@ -1451,6 +1684,13 @@ + bd_prod = RX_BD(bd_prod); + bd_cons = RX_BD(bd_cons); + ++ /* Prefetch the page containing the BD descriptor ++ at producer's index. It will be needed when new skb is ++ allocated */ ++ prefetch((void *)(PAGE_ALIGN((unsigned long) ++ (&fp->rx_desc_ring[bd_prod])) - ++ PAGE_SIZE + 1)); ++ + cqe = &fp->rx_comp_ring[comp_ring_cons]; + cqe_fp_flags = cqe->fast_path_cqe.type_error_flags; + +@@ -1473,6 +1713,7 @@ + len = le16_to_cpu(cqe->fast_path_cqe.pkt_len); + pad = cqe->fast_path_cqe.placement_offset; + ++#if !defined(__NO_TPA__) /* BNX2X_UPSTREAM */ + /* If CQE is marked both TPA_START and TPA_END + it is a non-TPA CQE */ + if ((!fp->disable_tpa) && +@@ -1507,7 +1748,7 @@ + len, cqe, comp_ring_cons); + #ifdef BNX2X_STOP_ON_ERROR + if (bp->panic) +- return -EINVAL; ++ return 0; + #endif + + bnx2x_update_sge_prod(fp, +@@ -1515,6 +1756,7 @@ + goto next_cqe; + } + } ++#endif + + pci_dma_sync_single_for_device(bp->pdev, + pci_unmap_addr(rx_buf, mapping), +@@ -1528,7 +1770,7 @@ + DP(NETIF_MSG_RX_ERR, + "ERROR flags %x rx packet %u\n", + cqe_fp_flags, sw_comp_cons); +- bp->eth_stats.rx_err_discard_pkt++; ++ fp->eth_q_stats.rx_err_discard_pkt++; + goto reuse_rx; + } + +@@ -1545,7 +1787,7 @@ + DP(NETIF_MSG_RX_ERR, + "ERROR packet dropped " + "because of alloc failure\n"); +- bp->eth_stats.rx_skb_alloc_failed++; ++ fp->eth_q_stats.rx_skb_alloc_failed++; + goto reuse_rx; + } + +@@ -1559,7 +1801,8 @@ + + skb = new_skb; + +- } else if (bnx2x_alloc_rx_skb(bp, fp, bd_prod) == 0) { ++ } else ++ if (likely(bnx2x_alloc_rx_skb(bp, fp, bd_prod) == 0)) { + pci_unmap_single(bp->pdev, + pci_unmap_addr(rx_buf, mapping), + bp->rx_buf_size, +@@ -1571,7 +1814,7 @@ + DP(NETIF_MSG_RX_ERR, + "ERROR packet dropped because " + "of alloc failure\n"); +- bp->eth_stats.rx_skb_alloc_failed++; ++ fp->eth_q_stats.rx_skb_alloc_failed++; + reuse_rx: + bnx2x_reuse_rx_skb(fp, skb, bd_cons, bd_prod); + goto next_rx; +@@ -1584,9 +1827,16 @@ + if (likely(BNX2X_RX_CSUM_OK(cqe))) + skb->ip_summed = CHECKSUM_UNNECESSARY; + else +- bp->eth_stats.hw_csum_err++; +- } +- } ++ fp->eth_q_stats.hw_csum_err++; ++ } ++ } ++ ++ skb_record_rx_queue(skb, fp->index); ++ ++#if defined(__VMKLNX__) && defined(__VMKNETDDI_QUEUEOPS__) /* ! BNX2X_UPSTREAM */ ++ vmknetddi_queueops_set_skb_queueid(skb, ++ VMKNETDDI_QUEUEOPS_MK_RX_QUEUEID(fp->index)); ++#endif + + #ifdef BCM_VLAN + if ((bp->vlgrp != NULL) && (bp->flags & HW_VLAN_RX_FLAG) && +@@ -1598,7 +1848,9 @@ + #endif + netif_receive_skb(skb); + ++#if (LINUX_VERSION_CODE < 0x02061b) /* ! BNX2X_UPSTREAM */ + bp->dev->last_rx = jiffies; ++#endif + + next_rx: + rx_buf->skb = NULL; +@@ -1630,12 +1882,16 @@ + return rx_pkt; + } + ++#ifdef CONFIG_PCI_MSI /* BNX2X_UPSTREAM */ ++#if (LINUX_VERSION_CODE < 0x020613) && (VMWARE_ESX_DDK_VERSION < 4000) ++static irqreturn_t bnx2x_msix_fp_int(int irq, void *fp_cookie, ++ struct pt_regs *regs) ++#else /* BNX2X_UPSTREAM */ + static irqreturn_t bnx2x_msix_fp_int(int irq, void *fp_cookie) ++#endif + { + struct bnx2x_fastpath *fp = fp_cookie; + struct bnx2x *bp = fp->bp; +- struct net_device *dev = bp->dev; +- int index = FP_IDX(fp); + + /* Return here if interrupt is disabled */ + if (unlikely(atomic_read(&bp->intr_sem) != 0)) { +@@ -1644,37 +1900,57 @@ + } + + DP(BNX2X_MSG_FP, "got an MSI-X interrupt on IDX:SB [%d:%d]\n", +- index, FP_SB_ID(fp)); +- bnx2x_ack_sb(bp, FP_SB_ID(fp), USTORM_ID, 0, IGU_INT_DISABLE, 0); ++ fp->index, fp->sb_id); ++ bnx2x_ack_sb(bp, fp->sb_id, USTORM_ID, 0, IGU_INT_DISABLE, 0); + + #ifdef BNX2X_STOP_ON_ERROR + if (unlikely(bp->panic)) + return IRQ_HANDLED; + #endif +- +- prefetch(fp->rx_cons_sb); +- prefetch(fp->tx_cons_sb); +- prefetch(&fp->status_blk->c_status_block.status_block_index); +- prefetch(&fp->status_blk->u_status_block.status_block_index); +- +- netif_rx_schedule(dev, &bnx2x_fp(bp, index, napi)); ++ /* Handle Rx or Tx according to MSI-X vector */ ++ if (fp->is_rx_queue) { ++ prefetch(fp->rx_cons_sb); ++ prefetch(&fp->status_blk->u_status_block.status_block_index); ++ ++ napi_schedule(&bnx2x_fp(bp, fp->index, napi)); ++ ++ } else { ++ prefetch(fp->tx_cons_sb); ++ prefetch(&fp->status_blk->c_status_block.status_block_index); ++ ++ bnx2x_update_fpsb_idx(fp); ++ rmb(); ++ bnx2x_tx_int(fp); ++ ++ /* Re-enable interrupts */ ++ bnx2x_ack_sb(bp, fp->sb_id, USTORM_ID, ++ le16_to_cpu(fp->fp_u_idx), IGU_INT_NOP, 1); ++ bnx2x_ack_sb(bp, fp->sb_id, CSTORM_ID, ++ le16_to_cpu(fp->fp_c_idx), IGU_INT_ENABLE, 1); ++ } + + return IRQ_HANDLED; + } +- ++#endif ++ ++#if (LINUX_VERSION_CODE < 0x020613) && (VMWARE_ESX_DDK_VERSION < 40000) ++static irqreturn_t bnx2x_interrupt(int irq, void *dev_instance, ++ struct pt_regs *regs) ++#else /* BNX2X_UPSTREAM */ + static irqreturn_t bnx2x_interrupt(int irq, void *dev_instance) +-{ +- struct net_device *dev = dev_instance; +- struct bnx2x *bp = netdev_priv(dev); ++#endif ++{ ++ struct bnx2x *bp = netdev_priv(dev_instance); + u16 status = bnx2x_ack_int(bp); + u16 mask; ++ int i; + + /* Return here if interrupt is shared and it's not for us */ + if (unlikely(status == 0)) { + DP(NETIF_MSG_INTR, "not our interrupt!\n"); + return IRQ_NONE; + } +- DP(NETIF_MSG_INTR, "got an interrupt status %u\n", status); ++ DP(NETIF_MSG_INTR, "got an interrupt status 0x%x\n", status); + + /* Return here if interrupt is disabled */ + if (unlikely(atomic_read(&bp->intr_sem) != 0)) { +@@ -1687,23 +1963,61 @@ + return IRQ_HANDLED; + #endif + +- mask = 0x2 << bp->fp[0].sb_id; ++ for (i = 0; i < BNX2X_NUM_QUEUES(bp); i++) { ++ struct bnx2x_fastpath *fp = &bp->fp[i]; ++ ++ mask = 0x2 << fp->sb_id; ++ if (status & mask) { ++ /* Handle Rx or Tx according to SB id */ ++ if (fp->is_rx_queue) { ++ prefetch(fp->rx_cons_sb); ++ prefetch(&fp->status_blk->u_status_block. ++ status_block_index); ++ ++ napi_schedule(&bnx2x_fp(bp, fp->index, napi)); ++ ++ } else { ++ prefetch(fp->tx_cons_sb); ++ prefetch(&fp->status_blk->c_status_block. ++ status_block_index); ++ ++ bnx2x_update_fpsb_idx(fp); ++ rmb(); ++ bnx2x_tx_int(fp); ++ ++ /* Re-enable interrupts */ ++ bnx2x_ack_sb(bp, fp->sb_id, USTORM_ID, ++ le16_to_cpu(fp->fp_u_idx), ++ IGU_INT_NOP, 1); ++ bnx2x_ack_sb(bp, fp->sb_id, CSTORM_ID, ++ le16_to_cpu(fp->fp_c_idx), ++ IGU_INT_ENABLE, 1); ++ } ++ status &= ~mask; ++ } ++ } ++ ++#ifdef BCM_CNIC /* ! BNX2X_UPSTREAM */ ++ mask = 0x2 << CNIC_SB_ID(bp); + if (status & mask) { +- struct bnx2x_fastpath *fp = &bp->fp[0]; +- +- prefetch(fp->rx_cons_sb); +- prefetch(fp->tx_cons_sb); +- prefetch(&fp->status_blk->c_status_block.status_block_index); +- prefetch(&fp->status_blk->u_status_block.status_block_index); +- +- netif_rx_schedule(dev, &bnx2x_fp(bp, 0, napi)); ++ struct cnic_ops *c_ops = NULL; ++ ++ rcu_read_lock(); ++ c_ops = rcu_dereference(bp->cnic_ops); ++ if (c_ops) ++ c_ops->cnic_handler(bp->cnic_data, NULL); ++ rcu_read_unlock(); + + status &= ~mask; + } +- ++#endif + + if (unlikely(status & 0x1)) { ++#if (LINUX_VERSION_CODE >= 0x020614) /* BNX2X_UPSTREAM */ + queue_delayed_work(bnx2x_wq, &bp->sp_task, 0); ++#else ++ queue_work(bnx2x_wq, &bp->sp_task); ++#endif + + status &= ~0x1; + if (!status) +@@ -1809,27 +2123,21 @@ + /* HW Lock for shared dual port PHYs */ + static void bnx2x_acquire_phy_lock(struct bnx2x *bp) + { +- u32 ext_phy_type = XGXS_EXT_PHY_TYPE(bp->link_params.ext_phy_config); +- + mutex_lock(&bp->port.phy_mutex); + +- if ((ext_phy_type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8072) || +- (ext_phy_type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073)) +- bnx2x_acquire_hw_lock(bp, HW_LOCK_RESOURCE_8072_MDIO); ++ if (bp->port.need_hw_lock) ++ bnx2x_acquire_hw_lock(bp, HW_LOCK_RESOURCE_MDIO); + } + + static void bnx2x_release_phy_lock(struct bnx2x *bp) + { +- u32 ext_phy_type = XGXS_EXT_PHY_TYPE(bp->link_params.ext_phy_config); +- +- if ((ext_phy_type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8072) || +- (ext_phy_type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073)) +- bnx2x_release_hw_lock(bp, HW_LOCK_RESOURCE_8072_MDIO); ++ if (bp->port.need_hw_lock) ++ bnx2x_release_hw_lock(bp, HW_LOCK_RESOURCE_MDIO); + + mutex_unlock(&bp->port.phy_mutex); + } + +-int bnx2x_set_gpio(struct bnx2x *bp, int gpio_num, u32 mode, u8 port) ++int bnx2x_get_gpio(struct bnx2x *bp, int gpio_num, u8 port) + { + /* The GPIO should be swapped if swap register is set and active */ + int gpio_port = (REG_RD(bp, NIG_REG_PORT_SWAP) && +@@ -1838,6 +2146,36 @@ + (gpio_port ? MISC_REGISTERS_GPIO_PORT_SHIFT : 0); + u32 gpio_mask = (1 << gpio_shift); + u32 gpio_reg; ++ int value; ++ ++ if (gpio_num > MISC_REGISTERS_GPIO_3) { ++ BNX2X_ERR("Invalid GPIO %d\n", gpio_num); ++ return -EINVAL; ++ } ++ ++ /* read GPIO value */ ++ gpio_reg = REG_RD(bp, MISC_REG_GPIO); ++ ++ /* get the requested pin value */ ++ if ((gpio_reg & gpio_mask) == gpio_mask) ++ value = 1; ++ else ++ value = 0; ++ ++ DP(NETIF_MSG_LINK, "pin %d value 0x%x\n", gpio_num, value); ++ ++ return value; ++} ++ ++int bnx2x_set_gpio(struct bnx2x *bp, int gpio_num, u32 mode, u8 port) ++{ ++ /* The GPIO should be swapped if swap register is set and active */ ++ int gpio_port = (REG_RD(bp, NIG_REG_PORT_SWAP) && ++ REG_RD(bp, NIG_REG_STRAP_OVERRIDE)) ^ port; ++ int gpio_shift = gpio_num + ++ (gpio_port ? MISC_REGISTERS_GPIO_PORT_SHIFT : 0); ++ u32 gpio_mask = (1 << gpio_shift); ++ u32 gpio_reg; + + if (gpio_num > MISC_REGISTERS_GPIO_3) { + BNX2X_ERR("Invalid GPIO %d\n", gpio_num); +@@ -1882,6 +2220,52 @@ + return 0; + } + ++int bnx2x_set_gpio_int(struct bnx2x *bp, int gpio_num, u32 mode, u8 port) ++{ ++ /* The GPIO should be swapped if swap register is set and active */ ++ int gpio_port = (REG_RD(bp, NIG_REG_PORT_SWAP) && ++ REG_RD(bp, NIG_REG_STRAP_OVERRIDE)) ^ port; ++ int gpio_shift = gpio_num + ++ (gpio_port ? MISC_REGISTERS_GPIO_PORT_SHIFT : 0); ++ u32 gpio_mask = (1 << gpio_shift); ++ u32 gpio_reg; ++ ++ if (gpio_num > MISC_REGISTERS_GPIO_3) { ++ BNX2X_ERR("Invalid GPIO %d\n", gpio_num); ++ return -EINVAL; ++ } ++ ++ bnx2x_acquire_hw_lock(bp, HW_LOCK_RESOURCE_GPIO); ++ /* read GPIO int */ ++ gpio_reg = REG_RD(bp, MISC_REG_GPIO_INT); ++ ++ switch (mode) { ++ case MISC_REGISTERS_GPIO_INT_OUTPUT_CLR: ++ DP(NETIF_MSG_LINK, "Clear GPIO INT %d (shift %d) -> " ++ "output low\n", gpio_num, gpio_shift); ++ /* clear SET and set CLR */ ++ gpio_reg &= ~(gpio_mask << MISC_REGISTERS_GPIO_INT_SET_POS); ++ gpio_reg |= (gpio_mask << MISC_REGISTERS_GPIO_INT_CLR_POS); ++ break; ++ ++ case MISC_REGISTERS_GPIO_INT_OUTPUT_SET: ++ DP(NETIF_MSG_LINK, "Set GPIO INT %d (shift %d) -> " ++ "output high\n", gpio_num, gpio_shift); ++ /* clear CLR and set SET */ ++ gpio_reg &= ~(gpio_mask << MISC_REGISTERS_GPIO_INT_CLR_POS); ++ gpio_reg |= (gpio_mask << MISC_REGISTERS_GPIO_INT_SET_POS); ++ break; ++ ++ default: ++ break; ++ } ++ ++ REG_WR(bp, MISC_REG_GPIO_INT, gpio_reg); ++ bnx2x_release_hw_lock(bp, HW_LOCK_RESOURCE_GPIO); ++ ++ return 0; ++} ++ + static int bnx2x_set_spio(struct bnx2x *bp, int spio_num, u32 mode) + { + u32 spio_mask = (1 << spio_num); +@@ -1936,13 +2320,16 @@ + bp->port.advertising &= ~(ADVERTISED_Asym_Pause | + ADVERTISED_Pause); + break; ++ + case MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_BOTH: + bp->port.advertising |= (ADVERTISED_Asym_Pause | + ADVERTISED_Pause); + break; ++ + case MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_ASYMMETRIC: + bp->port.advertising |= ADVERTISED_Asym_Pause; + break; ++ + default: + bp->port.advertising &= ~(ADVERTISED_Asym_Pause | + ADVERTISED_Pause); +@@ -1952,6 +2339,12 @@ + + static void bnx2x_link_report(struct bnx2x *bp) + { ++ if (bp->state == BNX2X_STATE_DISABLED) { ++ netif_carrier_off(bp->dev); ++ printk(KERN_ERR PFX "%s NIC Link is Down\n", bp->dev->name); ++ return; ++ } ++ + if (bp->link_vars.link_up) { + if (bp->state == BNX2X_STATE_OPEN) + netif_carrier_on(bp->dev); +@@ -1964,10 +2357,11 @@ + else + printk("half duplex"); + +- if (bp->link_vars.flow_ctrl != FLOW_CTRL_NONE) { +- if (bp->link_vars.flow_ctrl & FLOW_CTRL_RX) { ++ if (bp->link_vars.flow_ctrl != BNX2X_FLOW_CTRL_NONE) { ++ if (bp->link_vars.flow_ctrl & BNX2X_FLOW_CTRL_RX) { + printk(", receive "); +- if (bp->link_vars.flow_ctrl & FLOW_CTRL_TX) ++ if (bp->link_vars.flow_ctrl & ++ BNX2X_FLOW_CTRL_TX) + printk("& transmit "); + } else { + printk(", transmit "); +@@ -1982,7 +2376,7 @@ + } + } + +-static u8 bnx2x_initial_phy_init(struct bnx2x *bp) ++static u8 bnx2x_initial_phy_init(struct bnx2x *bp, int load_mode) + { + if (!BP_NOMCP(bp)) { + u8 rc; +@@ -1990,26 +2384,30 @@ + /* Initialize link parameters structure variables */ + /* It is recommended to turn off RX FC for jumbo frames + for better performance */ +- if (IS_E1HMF(bp)) +- bp->link_params.req_fc_auto_adv = FLOW_CTRL_BOTH; +- else if (bp->dev->mtu > 5000) +- bp->link_params.req_fc_auto_adv = FLOW_CTRL_TX; +- else +- bp->link_params.req_fc_auto_adv = FLOW_CTRL_BOTH; ++ if (bp->dev->mtu > 5000) ++ bp->link_params.req_fc_auto_adv = BNX2X_FLOW_CTRL_TX; ++ else ++ bp->link_params.req_fc_auto_adv = BNX2X_FLOW_CTRL_BOTH; + + bnx2x_acquire_phy_lock(bp); ++ ++ if (load_mode == LOAD_DIAG) ++ bp->link_params.loopback_mode = LOOPBACK_XGXS_10; ++ + rc = bnx2x_phy_init(&bp->link_params, &bp->link_vars); ++ + bnx2x_release_phy_lock(bp); + + bnx2x_calc_fc_adv(bp); + +- if (bp->link_vars.link_up) ++ if (CHIP_REV_IS_SLOW(bp) && bp->link_vars.link_up) { ++ bnx2x_stats_handle(bp, STATS_EVENT_LINK_UP); + bnx2x_link_report(bp); +- ++ } + + return rc; + } +- BNX2X_ERR("Bootcode is missing -not initializing link\n"); ++ BNX2X_ERR("Bootcode is missing - can not initialize link\n"); + return -EINVAL; + } + +@@ -2022,17 +2420,17 @@ + + bnx2x_calc_fc_adv(bp); + } else +- BNX2X_ERR("Bootcode is missing -not setting link\n"); ++ BNX2X_ERR("Bootcode is missing - can not set link\n"); + } + + static void bnx2x__link_reset(struct bnx2x *bp) + { + if (!BP_NOMCP(bp)) { + bnx2x_acquire_phy_lock(bp); +- bnx2x_link_reset(&bp->link_params, &bp->link_vars); ++ bnx2x_link_reset(&bp->link_params, &bp->link_vars, 1); + bnx2x_release_phy_lock(bp); + } else +- BNX2X_ERR("Bootcode is missing -not resetting link\n"); ++ BNX2X_ERR("Bootcode is missing - can not reset link\n"); + } + + static u8 bnx2x_link_test(struct bnx2x *bp) +@@ -2046,119 +2444,82 @@ + return rc; + } + ++static void bnx2x_init_port_minmax(struct bnx2x *bp) ++{ ++ u32 r_param = bp->link_vars.line_speed / 8; ++ u32 fair_periodic_timeout_usec; ++ u32 t_fair; ++ ++ memset(&(bp->cmng.rs_vars), 0, ++ sizeof(struct rate_shaping_vars_per_port)); ++ memset(&(bp->cmng.fair_vars), 0, sizeof(struct fairness_vars_per_port)); ++ ++ /* 100 usec in SDM ticks = 25 since each tick is 4 usec */ ++ bp->cmng.rs_vars.rs_periodic_timeout = RS_PERIODIC_TIMEOUT_USEC / 4; ++ ++ /* this is the threshold below which no timer arming will occur ++ 1.25 coefficient is for the threshold to be a little bigger ++ than the real time, to compensate for timer in-accuracy */ ++ bp->cmng.rs_vars.rs_threshold = ++ (RS_PERIODIC_TIMEOUT_USEC * r_param * 5) / 4; ++ ++ /* resolution of fairness timer */ ++ fair_periodic_timeout_usec = QM_ARB_BYTES / r_param; ++ /* for 10G it is 1000usec. for 1G it is 10000usec. */ ++ t_fair = T_FAIR_COEF / bp->link_vars.line_speed; ++ ++ /* this is the threshold below which we won't arm the timer anymore */ ++ bp->cmng.fair_vars.fair_threshold = QM_ARB_BYTES; ++ ++ /* we multiply by 1e3/8 to get bytes/msec. ++ We don't want the credits to pass a credit ++ of the t_fair*FAIR_MEM (algorithm resolution) */ ++ bp->cmng.fair_vars.upper_bound = r_param * t_fair * FAIR_MEM; ++ /* since each tick is 4 usec */ ++ bp->cmng.fair_vars.fairness_timeout = fair_periodic_timeout_usec / 4; ++} ++ + /* Calculates the sum of vn_min_rates. + It's needed for further normalizing of the min_rates. +- + Returns: +- sum of vn_min_rates ++ sum of vn_min_rates. + or + 0 - if all the min_rates are 0. +- In the later case fairness algorithm should be deactivated. +- If not all min_rates are zero then those that are zeroes will +- be set to 1. +- */ +-static u32 bnx2x_calc_vn_wsum(struct bnx2x *bp) +-{ +- int i, port = BP_PORT(bp); +- u32 wsum = 0; ++ In the later case fainess algorithm should be deactivated. ++ If not all min_rates are zero then those that are zeroes will be set to 1. ++ */ ++static void bnx2x_calc_vn_weight_sum(struct bnx2x *bp) ++{ + int all_zero = 1; +- +- for (i = 0; i < E1HVN_MAX; i++) { +- u32 vn_cfg = +- SHMEM_RD(bp, mf_cfg.func_mf_config[2*i + port].config); ++ int port = BP_PORT(bp); ++ int vn; ++ ++ bp->vn_weight_sum = 0; ++ for (vn = VN_0; vn < E1HVN_MAX; vn++) { ++ int func = 2*vn + port; ++ u32 vn_cfg = SHMEM_RD(bp, mf_cfg.func_mf_config[func].config); + u32 vn_min_rate = ((vn_cfg & FUNC_MF_CFG_MIN_BW_MASK) >> +- FUNC_MF_CFG_MIN_BW_SHIFT) * 100; +- if (!(vn_cfg & FUNC_MF_CFG_FUNC_HIDE)) { +- /* If min rate is zero - set it to 1 */ +- if (!vn_min_rate) +- vn_min_rate = DEF_MIN_RATE; +- else +- all_zero = 0; +- +- wsum += vn_min_rate; +- } +- } +- +- /* ... only if all min rates are zeros - disable FAIRNESS */ ++ FUNC_MF_CFG_MIN_BW_SHIFT) * 100; ++ ++ /* Skip hidden vns */ ++ if (vn_cfg & FUNC_MF_CFG_FUNC_HIDE) ++ continue; ++ ++ /* If min rate is zero - set it to 1 */ ++ if (!vn_min_rate) ++ vn_min_rate = DEF_MIN_RATE; ++ else ++ all_zero = 0; ++ ++ bp->vn_weight_sum += vn_min_rate; ++ } ++ ++ /* ... only if all min rates are zeros - disable fairness */ + if (all_zero) +- return 0; +- +- return wsum; +-} +- +-static void bnx2x_init_port_minmax(struct bnx2x *bp, +- int en_fness, +- u16 port_rate, +- struct cmng_struct_per_port *m_cmng_port) +-{ +- u32 r_param = port_rate / 8; +- int port = BP_PORT(bp); +- int i; +- +- memset(m_cmng_port, 0, sizeof(struct cmng_struct_per_port)); +- +- /* Enable minmax only if we are in e1hmf mode */ +- if (IS_E1HMF(bp)) { +- u32 fair_periodic_timeout_usec; +- u32 t_fair; +- +- /* Enable rate shaping and fairness */ +- m_cmng_port->flags.cmng_vn_enable = 1; +- m_cmng_port->flags.fairness_enable = en_fness ? 1 : 0; +- m_cmng_port->flags.rate_shaping_enable = 1; +- +- if (!en_fness) +- DP(NETIF_MSG_IFUP, "All MIN values are zeroes" +- " fairness will be disabled\n"); +- +- /* 100 usec in SDM ticks = 25 since each tick is 4 usec */ +- m_cmng_port->rs_vars.rs_periodic_timeout = +- RS_PERIODIC_TIMEOUT_USEC / 4; +- +- /* this is the threshold below which no timer arming will occur +- 1.25 coefficient is for the threshold to be a little bigger +- than the real time, to compensate for timer in-accuracy */ +- m_cmng_port->rs_vars.rs_threshold = +- (RS_PERIODIC_TIMEOUT_USEC * r_param * 5) / 4; +- +- /* resolution of fairness timer */ +- fair_periodic_timeout_usec = QM_ARB_BYTES / r_param; +- /* for 10G it is 1000usec. for 1G it is 10000usec. */ +- t_fair = T_FAIR_COEF / port_rate; +- +- /* this is the threshold below which we won't arm +- the timer anymore */ +- m_cmng_port->fair_vars.fair_threshold = QM_ARB_BYTES; +- +- /* we multiply by 1e3/8 to get bytes/msec. +- We don't want the credits to pass a credit +- of the T_FAIR*FAIR_MEM (algorithm resolution) */ +- m_cmng_port->fair_vars.upper_bound = +- r_param * t_fair * FAIR_MEM; +- /* since each tick is 4 usec */ +- m_cmng_port->fair_vars.fairness_timeout = +- fair_periodic_timeout_usec / 4; +- +- } else { +- /* Disable rate shaping and fairness */ +- m_cmng_port->flags.cmng_vn_enable = 0; +- m_cmng_port->flags.fairness_enable = 0; +- m_cmng_port->flags.rate_shaping_enable = 0; +- +- DP(NETIF_MSG_IFUP, +- "Single function mode minmax will be disabled\n"); +- } +- +- /* Store it to internal memory */ +- for (i = 0; i < sizeof(struct cmng_struct_per_port) / 4; i++) +- REG_WR(bp, BAR_XSTRORM_INTMEM + +- XSTORM_CMNG_PER_PORT_VARS_OFFSET(port) + i * 4, +- ((u32 *)(m_cmng_port))[i]); +-} +- +-static void bnx2x_init_vn_minmax(struct bnx2x *bp, int func, +- u32 wsum, u16 port_rate, +- struct cmng_struct_per_port *m_cmng_port) ++ bp->vn_weight_sum = 0; ++} ++ ++static void bnx2x_init_vn_minmax(struct bnx2x *bp, int func) + { + struct rate_shaping_vars_per_vn m_rs_vn; + struct fairness_vars_per_vn m_fair_vn; +@@ -2174,17 +2535,18 @@ + } else { + vn_min_rate = ((vn_cfg & FUNC_MF_CFG_MIN_BW_MASK) >> + FUNC_MF_CFG_MIN_BW_SHIFT) * 100; +- /* If FAIRNESS is enabled (not all min rates are zeroes) and ++ /* If fairness is enabled (not all min rates are zeroes) and + if current min rate is zero - set it to 1. + This is a requirement of the algorithm. */ +- if ((vn_min_rate == 0) && wsum) ++ if (bp->vn_weight_sum && (vn_min_rate == 0)) + vn_min_rate = DEF_MIN_RATE; + vn_max_rate = ((vn_cfg & FUNC_MF_CFG_MAX_BW_MASK) >> + FUNC_MF_CFG_MAX_BW_SHIFT) * 100; + } + +- DP(NETIF_MSG_IFUP, "func %d: vn_min_rate=%d vn_max_rate=%d " +- "wsum=%d\n", func, vn_min_rate, vn_max_rate, wsum); ++ DP(NETIF_MSG_IFUP, ++ "func %d: vn_min_rate=%d vn_max_rate=%d vn_weight_sum=%d\n", ++ func, vn_min_rate, vn_max_rate, bp->vn_weight_sum); + + memset(&m_rs_vn, 0, sizeof(struct rate_shaping_vars_per_vn)); + memset(&m_fair_vn, 0, sizeof(struct fairness_vars_per_vn)); +@@ -2196,54 +2558,19 @@ + m_rs_vn.vn_counter.quota = + (vn_max_rate * RS_PERIODIC_TIMEOUT_USEC) / 8; + +-#ifdef BNX2X_PER_PROT_QOS +- /* per protocol counter */ +- for (protocol = 0; protocol < NUM_OF_PROTOCOLS; protocol++) { +- /* maximal Mbps for this protocol */ +- m_rs_vn.protocol_counters[protocol].rate = +- protocol_max_rate[protocol]; +- /* the quota in each timer period - +- number of bytes transmitted in this period */ +- m_rs_vn.protocol_counters[protocol].quota = +- (u32)(rs_periodic_timeout_usec * +- ((double)m_rs_vn. +- protocol_counters[protocol].rate/8)); +- } +-#endif +- +- if (wsum) { ++ if (bp->vn_weight_sum) { + /* credit for each period of the fairness algorithm: + number of bytes in T_FAIR (the vn share the port rate). +- wsum should not be larger than 10000, thus +- T_FAIR_COEF / (8 * wsum) will always be grater than zero */ ++ vn_weight_sum should not be larger than 10000, thus ++ T_FAIR_COEF / (8 * vn_weight_sum) will always be greater ++ than zero */ + m_fair_vn.vn_credit_delta = +- max((u64)(vn_min_rate * (T_FAIR_COEF / (8 * wsum))), +- (u64)(m_cmng_port->fair_vars.fair_threshold * 2)); ++ max((u32)(vn_min_rate * (T_FAIR_COEF / ++ (8 * bp->vn_weight_sum))), ++ (u32)(bp->cmng.fair_vars.fair_threshold * 2)); + DP(NETIF_MSG_IFUP, "m_fair_vn.vn_credit_delta=%d\n", + m_fair_vn.vn_credit_delta); + } +- +-#ifdef BNX2X_PER_PROT_QOS +- do { +- u32 protocolWeightSum = 0; +- +- for (protocol = 0; protocol < NUM_OF_PROTOCOLS; protocol++) +- protocolWeightSum += +- drvInit.protocol_min_rate[protocol]; +- /* per protocol counter - +- NOT NEEDED IF NO PER-PROTOCOL CONGESTION MANAGEMENT */ +- if (protocolWeightSum > 0) { +- for (protocol = 0; +- protocol < NUM_OF_PROTOCOLS; protocol++) +- /* credit for each period of the +- fairness algorithm - number of bytes in +- T_FAIR (the protocol share the vn rate) */ +- m_fair_vn.protocol_credit_delta[protocol] = +- (u32)((vn_min_rate / 8) * t_fair * +- protocol_min_rate / protocolWeightSum); +- } +- } while (0); +-#endif + + /* Store it to internal memory */ + for (i = 0; i < sizeof(struct rate_shaping_vars_per_vn)/4; i++) +@@ -2257,17 +2584,60 @@ + ((u32 *)(&m_fair_vn))[i]); + } + ++#ifdef BNX2X_SAFC /* ! BNX2X_UPSTREAM */ ++static void bnx2x_init_cos_credit(struct bnx2x *bp) ++{ ++ struct fairness_vars_per_vn m_fair_vn; ++ int func = BP_FUNC(bp); ++ int i, cos; ++ ++ memset(&m_fair_vn, 0, sizeof(struct fairness_vars_per_vn)); ++ ++ for (cos = 0; cos < BNX2X_MAX_COS; cos++) { ++ if (bp->cos_min_rate[cos]) { ++ m_fair_vn.cos_credit_delta[cos] = ++ max((u32)(bp->cos_min_rate[cos] * ++ (T_FAIR_COEF / (8 * bp->cos_weight_sum))), ++ (u32)(bp->cmng.fair_vars.fair_threshold * 2)); ++ } ++ DP(NETIF_MSG_IFUP, "cos_credit_delta[%d] = %d\n", ++ cos, m_fair_vn.cos_credit_delta[cos]); ++ } ++ ++ for (i = 0; i < sizeof(struct fairness_vars_per_vn)/4; i++) ++ REG_WR(bp, BAR_XSTRORM_INTMEM + ++ XSTORM_FAIRNESS_PER_VN_VARS_OFFSET(func) + i * 4, ++ ((u32 *)(&m_fair_vn))[i]); ++} ++#endif ++ + /* This function is called upon link interrupt */ + static void bnx2x_link_attn(struct bnx2x *bp) + { +- int vn; +- + /* Make sure that we are synced with the current statistics */ + bnx2x_stats_handle(bp, STATS_EVENT_STOP); + + bnx2x_link_update(&bp->link_params, &bp->link_vars); + + if (bp->link_vars.link_up) { ++ ++ /* dropless flow control */ ++ if (CHIP_IS_E1H(bp) && bp->dropless_fc) { ++ int port = BP_PORT(bp); ++ u32 pause_enabled = 0; ++ ++#ifdef BNX2X_SAFC ++ if ((bp->link_vars.flow_ctrl & BNX2X_FLOW_CTRL_TX) || ++ (bp->flags & SAFC_TX_FLAG)) ++#else /* BNX2X_UPSTREAM */ ++ if (bp->link_vars.flow_ctrl & BNX2X_FLOW_CTRL_TX) ++#endif ++ pause_enabled = 1; ++ ++ REG_WR(bp, BAR_USTRORM_INTMEM + ++ USTORM_ETH_PAUSE_ENABLED_OFFSET(port), ++ pause_enabled); ++ } + + if (bp->link_vars.mac_type == MAC_TYPE_BMAC) { + struct host_port_stats *pstats; +@@ -2286,41 +2656,62 @@ + bnx2x_link_report(bp); + + if (IS_E1HMF(bp)) { ++ int port = BP_PORT(bp); + int func; +- ++ int vn; ++ ++ /* Set the attention towards other drivers on the same port */ + for (vn = VN_0; vn < E1HVN_MAX; vn++) { + if (vn == BP_E1HVN(bp)) + continue; + +- func = ((vn << 1) | BP_PORT(bp)); +- +- /* Set the attention towards other drivers +- on the same port */ ++ func = ((vn << 1) | port); + REG_WR(bp, MISC_REG_AEU_GENERAL_ATTN_0 + + (LINK_SYNC_ATTENTION_BIT_FUNC_0 + func)*4, 1); + } +- } +- +- if (CHIP_IS_E1H(bp) && (bp->link_vars.line_speed > 0)) { +- struct cmng_struct_per_port m_cmng_port; +- u32 wsum; +- int port = BP_PORT(bp); +- +- /* Init RATE SHAPING and FAIRNESS contexts */ +- wsum = bnx2x_calc_vn_wsum(bp); +- bnx2x_init_port_minmax(bp, (int)wsum, +- bp->link_vars.line_speed, +- &m_cmng_port); +- if (IS_E1HMF(bp)) ++ ++ if (bp->link_vars.link_up) { ++ int i; ++ ++ /* Init rate shaping and fairness contexts */ ++ bnx2x_init_port_minmax(bp); ++ + for (vn = VN_0; vn < E1HVN_MAX; vn++) +- bnx2x_init_vn_minmax(bp, 2*vn + port, +- wsum, bp->link_vars.line_speed, +- &m_cmng_port); ++ bnx2x_init_vn_minmax(bp, 2*vn + port); ++ ++ /* Store it to internal memory */ ++ for (i = 0; ++ i < sizeof(struct cmng_struct_per_port) / 4; i++) ++ REG_WR(bp, BAR_XSTRORM_INTMEM + ++ XSTORM_CMNG_PER_PORT_VARS_OFFSET(port) + i*4, ++ ((u32 *)(&bp->cmng))[i]); ++ } ++#ifdef BNX2X_SAFC /* ! BNX2X_UPSTREAM */ ++ } else { ++ if (bp->link_vars.link_up && bp->cos_weight_sum) { ++ int port = BP_PORT(bp); ++ int i; ++ ++ /* Init fairness context */ ++ bnx2x_init_port_minmax(bp); ++ ++ bnx2x_init_cos_credit(bp); ++ ++ /* Store it to internal memory */ ++ for (i = 0; ++ i < sizeof(struct cmng_struct_per_port) / 4; i++) ++ REG_WR(bp, BAR_XSTRORM_INTMEM + ++ XSTORM_CMNG_PER_PORT_VARS_OFFSET(port) + i*4, ++ ((u32 *)(&bp->cmng))[i]); ++ } ++#endif + } + } + + static void bnx2x__link_status_update(struct bnx2x *bp) + { ++ int func = BP_FUNC(bp); ++ + if (bp->state != BNX2X_STATE_OPEN) + return; + +@@ -2330,6 +2721,9 @@ + bnx2x_stats_handle(bp, STATS_EVENT_LINK_UP); + else + bnx2x_stats_handle(bp, STATS_EVENT_STOP); ++ ++ bp->mf_config = SHMEM_RD(bp, mf_cfg.func_mf_config[func].config); ++ bnx2x_calc_vn_weight_sum(bp); + + /* indicate link status */ + bnx2x_link_report(bp); +@@ -2358,6 +2752,152 @@ + /* + * General service functions + */ ++ ++/* send the MCP a request, block until there is a reply */ ++u32 bnx2x_fw_command(struct bnx2x *bp, u32 command) ++{ ++ int func = BP_FUNC(bp); ++ u32 seq = ++bp->fw_seq; ++ u32 rc = 0; ++ u32 cnt = 1; ++ u8 delay = CHIP_REV_IS_SLOW(bp) ? 100 : 10; ++ ++ SHMEM_WR(bp, func_mb[func].drv_mb_header, (command | seq)); ++ DP(BNX2X_MSG_MCP, "wrote command (%x) to FW MB\n", (command | seq)); ++ ++ do { ++ /* let the FW do it's magic ... */ ++ msleep(delay); ++ ++ rc = SHMEM_RD(bp, func_mb[func].fw_mb_header); ++ ++ /* Give the FW up to 2 second (200*10ms) */ ++ } while ((seq != (rc & FW_MSG_SEQ_NUMBER_MASK)) && (cnt++ < 200)); ++ ++ DP(BNX2X_MSG_MCP, "[after %d ms] read (%x) seq is (%x) from FW MB\n", ++ cnt*delay, rc, seq); ++ ++ /* is this a reply to our command? */ ++ if (seq == (rc & FW_MSG_SEQ_NUMBER_MASK)) ++ rc &= FW_MSG_CODE_MASK; ++ else { ++ /* FW BUG! */ ++ BNX2X_ERR("FW failed to respond!\n"); ++ bnx2x_fw_dump(bp); ++ rc = 0; ++ } ++ ++ return rc; ++} ++ ++static void bnx2x_set_storm_rx_mode(struct bnx2x *bp); ++static void bnx2x_set_mac_addr_e1h(struct bnx2x *bp, int set); ++static void bnx2x_set_rx_mode(struct net_device *dev); ++ ++static void bnx2x_e1h_disable(struct bnx2x *bp) ++{ ++ int port = BP_PORT(bp); ++ int i; ++ ++ bp->rx_mode = BNX2X_RX_MODE_NONE; ++ bnx2x_set_storm_rx_mode(bp); ++ ++ netif_tx_disable(bp->dev); ++ bp->dev->trans_start = jiffies; /* prevent tx timeout */ ++ ++ REG_WR(bp, NIG_REG_LLH0_FUNC_EN + port*8, 0); ++ ++ bnx2x_set_mac_addr_e1h(bp, 0); ++ ++ for (i = 0; i < MC_HASH_SIZE; i++) ++ REG_WR(bp, MC_HASH_OFFSET(bp, i), 0); ++ ++ netif_carrier_off(bp->dev); ++} ++ ++static void bnx2x_e1h_enable(struct bnx2x *bp) ++{ ++ int port = BP_PORT(bp); ++ ++ REG_WR(bp, NIG_REG_LLH0_FUNC_EN + port*8, 1); ++ ++ bnx2x_set_mac_addr_e1h(bp, 1); ++ ++ /* Tx queue should be only reenabled */ ++ netif_tx_wake_all_queues(bp->dev); ++ ++ /* Initialize the receive filter. */ ++ bnx2x_set_rx_mode(bp->dev); ++} ++ ++static void bnx2x_update_min_max(struct bnx2x *bp) ++{ ++ int port = BP_PORT(bp); ++ int vn, i; ++ ++ /* Init rate shaping and fairness contexts */ ++ bnx2x_init_port_minmax(bp); ++ ++ bnx2x_calc_vn_weight_sum(bp); ++ ++ for (vn = VN_0; vn < E1HVN_MAX; vn++) ++ bnx2x_init_vn_minmax(bp, 2*vn + port); ++ ++ if (bp->port.pmf) { ++ int func; ++ ++ /* Set the attention towards other drivers on the same port */ ++ for (vn = VN_0; vn < E1HVN_MAX; vn++) { ++ if (vn == BP_E1HVN(bp)) ++ continue; ++ ++ func = ((vn << 1) | port); ++ REG_WR(bp, MISC_REG_AEU_GENERAL_ATTN_0 + ++ (LINK_SYNC_ATTENTION_BIT_FUNC_0 + func)*4, 1); ++ } ++ ++ /* Store it to internal memory */ ++ for (i = 0; i < sizeof(struct cmng_struct_per_port) / 4; i++) ++ REG_WR(bp, BAR_XSTRORM_INTMEM + ++ XSTORM_CMNG_PER_PORT_VARS_OFFSET(port) + i*4, ++ ((u32 *)(&bp->cmng))[i]); ++ } ++} ++ ++static void bnx2x_dcc_event(struct bnx2x *bp, u32 dcc_event) ++{ ++ int func = BP_FUNC(bp); ++ ++ DP(BNX2X_MSG_MCP, "dcc_event 0x%x\n", dcc_event); ++ bp->mf_config = SHMEM_RD(bp, mf_cfg.func_mf_config[func].config); ++ ++ if (dcc_event & DRV_STATUS_DCC_DISABLE_ENABLE_PF) { ++ ++ if (bp->mf_config & FUNC_MF_CFG_FUNC_DISABLED) { ++ DP(NETIF_MSG_IFDOWN, "mf_cfg function disabled\n"); ++ bp->state = BNX2X_STATE_DISABLED; ++ ++ bnx2x_e1h_disable(bp); ++ } else { ++ DP(NETIF_MSG_IFUP, "mf_cfg function enabled\n"); ++ bp->state = BNX2X_STATE_OPEN; ++ ++ bnx2x_e1h_enable(bp); ++ } ++ dcc_event &= ~DRV_STATUS_DCC_DISABLE_ENABLE_PF; ++ } ++ if (dcc_event & DRV_STATUS_DCC_BANDWIDTH_ALLOCATION) { ++ ++ bnx2x_update_min_max(bp); ++ dcc_event &= ~DRV_STATUS_DCC_BANDWIDTH_ALLOCATION; ++ } ++ ++ /* Report results to MCP */ ++ if (dcc_event) ++ bnx2x_fw_command(bp, DRV_MSG_CODE_DCC_FAILURE); ++ else ++ bnx2x_fw_command(bp, DRV_MSG_CODE_DCC_OK); ++} + + /* the slow path queue is odd since completions arrive on the fastpath ring */ + static int bnx2x_sp_post(struct bnx2x *bp, int command, int cid, +@@ -2409,8 +2949,13 @@ + bp->spq_prod_idx++; + } + ++ /* Make sure that BD data is updated before writing the producer */ ++ wmb(); ++ + REG_WR(bp, BAR_XSTRORM_INTMEM + XSTORM_SPQ_PROD_OFFSET(func), + bp->spq_prod_idx); ++ ++ mmiowb(); + + spin_unlock_bh(&bp->spq_lock); + return 0; +@@ -2492,6 +3037,7 @@ + u32 nig_int_mask_addr = port ? NIG_REG_MASK_INTERRUPT_PORT1 : + NIG_REG_MASK_INTERRUPT_PORT0; + u32 aeu_mask; ++ u32 nig_mask = 0; + + if (bp->attn_state & asserted) + BNX2X_ERR("IGU ERROR\n"); +@@ -2517,7 +3063,7 @@ + bnx2x_acquire_phy_lock(bp); + + /* save nig interrupt mask */ +- bp->nig_mask = REG_RD(bp, nig_int_mask_addr); ++ nig_mask = REG_RD(bp, nig_int_mask_addr); + REG_WR(bp, nig_int_mask_addr, 0); + + bnx2x_link_attn(bp); +@@ -2572,16 +3118,33 @@ + + /* now set back the mask */ + if (asserted & ATTN_NIG_FOR_FUNC) { +- REG_WR(bp, nig_int_mask_addr, bp->nig_mask); ++ REG_WR(bp, nig_int_mask_addr, nig_mask); + bnx2x_release_phy_lock(bp); + } + } + ++static inline void bnx2x_fan_failure(struct bnx2x *bp) ++{ ++ int port = BP_PORT(bp); ++ ++ /* mark the failure */ ++ bp->link_params.ext_phy_config &= ~PORT_HW_CFG_XGXS_EXT_PHY_TYPE_MASK; ++ bp->link_params.ext_phy_config |= PORT_HW_CFG_XGXS_EXT_PHY_TYPE_FAILURE; ++ SHMEM_WR(bp, dev_info.port_hw_config[port].external_phy_config, ++ bp->link_params.ext_phy_config); ++ ++ /* log the failure */ ++ printk(KERN_ERR PFX "Fan Failure on Network Controller %s has caused" ++ " the driver to shutdown the card to prevent permanent" ++ " damage. Please contact Dell Support for assistance\n", ++ bp->dev->name); ++} ++ + static inline void bnx2x_attn_int_deasserted0(struct bnx2x *bp, u32 attn) + { + int port = BP_PORT(bp); + int reg_offset; +- u32 val; ++ u32 val, swap_val, swap_override; + + reg_offset = (port ? MISC_REG_AEU_ENABLE1_FUNC_1_OUT_0 : + MISC_REG_AEU_ENABLE1_FUNC_0_OUT_0); +@@ -2594,37 +3157,40 @@ + + BNX2X_ERR("SPIO5 hw attention\n"); + +- switch (bp->common.board & SHARED_HW_CFG_BOARD_TYPE_MASK) { +- case SHARED_HW_CFG_BOARD_TYPE_BCM957710A1021G: +- case SHARED_HW_CFG_BOARD_TYPE_BCM957710A1022G: +- /* Fan failure attention */ +- ++ /* Fan failure attention */ ++ switch (XGXS_EXT_PHY_TYPE(bp->link_params.ext_phy_config)) { ++ case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_SFX7101: ++ /* Low power mode is controlled by GPIO 2 */ ++ bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_2, ++ MISC_REGISTERS_GPIO_OUTPUT_LOW, port); + /* The PHY reset is controlled by GPIO 1 */ + bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_1, + MISC_REGISTERS_GPIO_OUTPUT_LOW, port); +- /* Low power mode is controlled by GPIO 2 */ +- bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_2, ++ bnx2x_fan_failure(bp); ++ break; ++ ++ case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8727: ++ /* The PHY reset is controlled by GPIO 1 */ ++ /* fake the port number to cancel the swap done in ++ set_gpio() */ ++ swap_val = REG_RD(bp, NIG_REG_PORT_SWAP); ++ swap_override = REG_RD(bp, NIG_REG_STRAP_OVERRIDE); ++ port = (swap_val && swap_override) ^ 1; ++ bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_1, + MISC_REGISTERS_GPIO_OUTPUT_LOW, port); +- /* mark the failure */ +- bp->link_params.ext_phy_config &= +- ~PORT_HW_CFG_XGXS_EXT_PHY_TYPE_MASK; +- bp->link_params.ext_phy_config |= +- PORT_HW_CFG_XGXS_EXT_PHY_TYPE_FAILURE; +- SHMEM_WR(bp, +- dev_info.port_hw_config[port]. +- external_phy_config, +- bp->link_params.ext_phy_config); +- /* log the failure */ +- printk(KERN_ERR PFX "Fan Failure on Network" +- " Controller %s has caused the driver to" +- " shutdown the card to prevent permanent" +- " damage. Please contact Dell Support for" +- " assistance\n", bp->dev->name); ++ bnx2x_fan_failure(bp); + break; + + default: + break; + } ++ } ++ ++ if (attn & (AEU_INPUTS_ATTN_BITS_GPIO3_FUNCTION_0 | ++ AEU_INPUTS_ATTN_BITS_GPIO3_FUNCTION_1)) { ++ bnx2x_acquire_phy_lock(bp); ++ bnx2x_handle_module_detect_int(&bp->link_params); ++ bnx2x_release_phy_lock(bp); + } + + if (attn & HW_INTERRUT_ASSERT_SET_0) { +@@ -2634,7 +3200,7 @@ + REG_WR(bp, reg_offset, val); + + BNX2X_ERR("FATAL HW block attention set0 0x%x\n", +- (attn & HW_INTERRUT_ASSERT_SET_0)); ++ (u32)(attn & HW_INTERRUT_ASSERT_SET_0)); + bnx2x_panic(); + } + } +@@ -2643,7 +3209,7 @@ + { + u32 val; + +- if (attn & BNX2X_DOORQ_ASSERT) { ++ if (attn & AEU_INPUTS_ATTN_BITS_DOORBELLQ_HW_INTERRUPT) { + + val = REG_RD(bp, DORQ_REG_DORQ_INT_STS_CLR); + BNX2X_ERR("DB hw attention 0x%x\n", val); +@@ -2665,7 +3231,7 @@ + REG_WR(bp, reg_offset, val); + + BNX2X_ERR("FATAL HW block attention set1 0x%x\n", +- (attn & HW_INTERRUT_ASSERT_SET_1)); ++ (u32)(attn & HW_INTERRUT_ASSERT_SET_1)); + bnx2x_panic(); + } + } +@@ -2705,7 +3271,7 @@ + REG_WR(bp, reg_offset, val); + + BNX2X_ERR("FATAL HW block attention set2 0x%x\n", +- (attn & HW_INTERRUT_ASSERT_SET_2)); ++ (u32)(attn & HW_INTERRUT_ASSERT_SET_2)); + bnx2x_panic(); + } + } +@@ -2720,9 +3286,12 @@ + int func = BP_FUNC(bp); + + REG_WR(bp, MISC_REG_AEU_GENERAL_ATTN_12 + func*4, 0); ++ val = SHMEM_RD(bp, func_mb[func].drv_status); ++ if (val & DRV_STATUS_DCC_EVENT_MASK) ++ bnx2x_dcc_event(bp, ++ (val & DRV_STATUS_DCC_EVENT_MASK)); + bnx2x__link_status_update(bp); +- if (SHMEM_RD(bp, func_mb[func].drv_status) & +- DRV_STATUS_PMF) ++ if ((bp->port.pmf == 0) && (val & DRV_STATUS_PMF)) + bnx2x_pmf_update(bp); + + } else if (attn & BNX2X_MC_ASSERT_BITS) { +@@ -2867,16 +3436,34 @@ + bnx2x_attn_int_deasserted(bp, deasserted); + } + ++#if defined(INIT_DELAYED_WORK_DEFERRABLE) || defined(INIT_WORK_NAR) || (VMWARE_ESX_DDK_VERSION >= 40000) /* BNX2X_UPSTREAM */ + static void bnx2x_sp_task(struct work_struct *work) + { ++#if (LINUX_VERSION_CODE >= 0x020614) /* BNX2X_UPSTREAM */ + struct bnx2x *bp = container_of(work, struct bnx2x, sp_task.work); ++#else ++ struct bnx2x *bp = container_of(work, struct bnx2x, sp_task); ++#endif ++#else ++static void bnx2x_sp_task(void *data) ++{ ++ struct bnx2x *bp = (struct bnx2x *)data; ++#endif + u16 status; + ++#if (LINUX_VERSION_CODE < 0x020618) /* ! BNX2X_UPSTREAM */ ++ bp->sp_running = 1; ++ smp_mb(); /* make sure close can see this */ ++#endif + + /* Return here if interrupt is disabled */ + if (unlikely(atomic_read(&bp->intr_sem) != 0)) { + DP(NETIF_MSG_INTR, "called but intr_sem not 0, returning\n"); +- return; ++#if (LINUX_VERSION_CODE >= 0x020618) /* BNX2X_UPSTREAM */ ++ return; ++#else ++ goto sp_task_exit; ++#endif + } + + status = bnx2x_update_dsb_idx(bp); +@@ -2888,10 +3475,6 @@ + /* HW attentions */ + if (status & 0x1) + bnx2x_attn_int(bp); +- +- /* CStorm events: query_stats, port delete ramrod */ +- if (status & 0x2) +- bp->stats_pending = 0; + + bnx2x_ack_sb(bp, DEF_SB_ID, ATTENTION_ID, le16_to_cpu(bp->def_att_idx), + IGU_INT_NOP, 1); +@@ -2904,9 +3487,20 @@ + bnx2x_ack_sb(bp, DEF_SB_ID, TSTORM_ID, le16_to_cpu(bp->def_t_idx), + IGU_INT_ENABLE, 1); + +-} +- ++#if (LINUX_VERSION_CODE < 0x020618) /* ! BNX2X_UPSTREAM */ ++sp_task_exit: ++ bp->sp_running = 0; ++ smp_mb(); /* make sure close can see this */ ++#endif ++} ++ ++#ifdef CONFIG_PCI_MSI /* BNX2X_UPSTREAM */ ++#if (LINUX_VERSION_CODE < 0x020613) && (VMWARE_ESX_DDK_VERSION < 40000) ++static irqreturn_t bnx2x_msix_sp_int(int irq, void *dev_instance, ++ struct pt_regs *regs) ++#else /* BNX2X_UPSTREAM */ + static irqreturn_t bnx2x_msix_sp_int(int irq, void *dev_instance) ++#endif + { + struct net_device *dev = dev_instance; + struct bnx2x *bp = netdev_priv(dev); +@@ -2917,17 +3511,22 @@ + return IRQ_HANDLED; + } + +- bnx2x_ack_sb(bp, DEF_SB_ID, XSTORM_ID, 0, IGU_INT_DISABLE, 0); ++ bnx2x_ack_sb(bp, DEF_SB_ID, TSTORM_ID, 0, IGU_INT_DISABLE, 0); + + #ifdef BNX2X_STOP_ON_ERROR + if (unlikely(bp->panic)) + return IRQ_HANDLED; + #endif + ++#if (LINUX_VERSION_CODE >= 0x020614) /* BNX2X_UPSTREAM */ + queue_delayed_work(bnx2x_wq, &bp->sp_task, 0); ++#else ++ queue_work(bnx2x_wq, &bp->sp_task); ++#endif + + return IRQ_HANDLED; + } ++#endif + + /* end of slow path */ + +@@ -3006,16 +3605,41 @@ + + #define UPDATE_EXTEND_TSTAT(s, t) \ + do { \ +- diff = le32_to_cpu(tclient->s) - old_tclient->s; \ +- old_tclient->s = le32_to_cpu(tclient->s); \ +- ADD_EXTEND_64(fstats->t##_hi, fstats->t##_lo, diff); \ ++ diff = le32_to_cpu(tclient->s) - le32_to_cpu(old_tclient->s); \ ++ old_tclient->s = tclient->s; \ ++ ADD_EXTEND_64(qstats->t##_hi, qstats->t##_lo, diff); \ ++ } while (0) ++ ++#define UPDATE_EXTEND_USTAT(s, t) \ ++ do { \ ++ diff = le32_to_cpu(uclient->s) - le32_to_cpu(old_uclient->s); \ ++ old_uclient->s = uclient->s; \ ++ ADD_EXTEND_64(qstats->t##_hi, qstats->t##_lo, diff); \ + } while (0) + + #define UPDATE_EXTEND_XSTAT(s, t) \ + do { \ +- diff = le32_to_cpu(xclient->s) - old_xclient->s; \ +- old_xclient->s = le32_to_cpu(xclient->s); \ +- ADD_EXTEND_64(fstats->t##_hi, fstats->t##_lo, diff); \ ++ diff = le32_to_cpu(xclient->s) - le32_to_cpu(old_xclient->s); \ ++ old_xclient->s = xclient->s; \ ++ ADD_EXTEND_64(qstats->t##_hi, qstats->t##_lo, diff); \ ++ } while (0) ++ ++/* minuend -= subtrahend */ ++#define SUB_64(m_hi, s_hi, m_lo, s_lo) \ ++ do { \ ++ DIFF_64(m_hi, m_hi, s_hi, m_lo, m_lo, s_lo); \ ++ } while (0) ++ ++/* minuend[hi:lo] -= subtrahend */ ++#define SUB_EXTEND_64(m_hi, m_lo, s) \ ++ do { \ ++ SUB_64(m_hi, 0, m_lo, s); \ ++ } while (0) ++ ++#define SUB_EXTEND_USTAT(s, t) \ ++ do { \ ++ diff = le32_to_cpu(uclient->s) - le32_to_cpu(old_uclient->s); \ ++ SUB_EXTEND_64(qstats->t##_hi, qstats->t##_lo, diff); \ + } while (0) + + /* +@@ -3042,11 +3666,12 @@ + { + if (!bp->stats_pending) { + struct eth_query_ramrod_data ramrod_data = {0}; +- int rc; ++ int i, rc; + + ramrod_data.drv_counter = bp->stats_counter++; +- ramrod_data.collect_port_1b = bp->port.pmf ? 1 : 0; +- ramrod_data.ctr_id_vector = (1 << BP_CL_ID(bp)); ++ ramrod_data.collect_port = bp->port.pmf ? 1 : 0; ++ for_each_queue(bp, i) ++ ramrod_data.ctr_id_vector |= (1 << bp->fp[i].cl_id); + + rc = bnx2x_sp_post(bp, RAMROD_CMD_ID_ETH_STAT_QUERY, 0, + ((u32 *)&ramrod_data)[1], +@@ -3059,47 +3684,14 @@ + } + } + +-static void bnx2x_stats_init(struct bnx2x *bp) +-{ +- int port = BP_PORT(bp); +- +- bp->executer_idx = 0; +- bp->stats_counter = 0; +- +- /* port stats */ +- if (!BP_NOMCP(bp)) +- bp->port.port_stx = SHMEM_RD(bp, port_mb[port].port_stx); +- else +- bp->port.port_stx = 0; +- DP(BNX2X_MSG_STATS, "port_stx 0x%x\n", bp->port.port_stx); +- +- memset(&(bp->port.old_nig_stats), 0, sizeof(struct nig_stats)); +- bp->port.old_nig_stats.brb_discard = +- REG_RD(bp, NIG_REG_STAT0_BRB_DISCARD + port*0x38); +- bp->port.old_nig_stats.brb_truncate = +- REG_RD(bp, NIG_REG_STAT0_BRB_TRUNCATE + port*0x38); +- REG_RD_DMAE(bp, NIG_REG_STAT0_EGRESS_MAC_PKT0 + port*0x50, +- &(bp->port.old_nig_stats.egress_mac_pkt0_lo), 2); +- REG_RD_DMAE(bp, NIG_REG_STAT0_EGRESS_MAC_PKT1 + port*0x50, +- &(bp->port.old_nig_stats.egress_mac_pkt1_lo), 2); +- +- /* function stats */ +- memset(&bp->dev->stats, 0, sizeof(struct net_device_stats)); +- memset(&bp->old_tclient, 0, sizeof(struct tstorm_per_client_stats)); +- memset(&bp->old_xclient, 0, sizeof(struct xstorm_per_client_stats)); +- memset(&bp->eth_stats, 0, sizeof(struct bnx2x_eth_stats)); +- +- bp->stats_state = STATS_STATE_DISABLED; +- if (IS_E1HMF(bp) && bp->port.pmf && bp->port.port_stx) +- bnx2x_stats_handle(bp, STATS_EVENT_PMF); +-} +- + static void bnx2x_hw_stats_post(struct bnx2x *bp) + { + struct dmae_command *dmae = &bp->stats_dmae; + u32 *stats_comp = bnx2x_sp(bp, stats_comp); + + *stats_comp = DMAE_COMP_VAL; ++ if (CHIP_REV_IS_SLOW(bp)) ++ return; + + /* loader */ + if (bp->executer_idx) { +@@ -3489,7 +4081,11 @@ + { + struct bmac_stats *new = bnx2x_sp(bp, mac_stats.bmac_stats); + struct host_port_stats *pstats = bnx2x_sp(bp, port_stats); +- struct regpair diff; ++ struct bnx2x_eth_stats *estats = &bp->eth_stats; ++ struct { ++ u32 lo; ++ u32 hi; ++ } diff; + + UPDATE_STAT64(rx_stat_grerb, rx_stat_ifhcinbadoctets); + UPDATE_STAT64(rx_stat_grfcs, rx_stat_dot3statsfcserrors); +@@ -3499,7 +4095,7 @@ + UPDATE_STAT64(rx_stat_grjbr, rx_stat_etherstatsjabbers); + UPDATE_STAT64(rx_stat_grxcf, rx_stat_maccontrolframesreceived); + UPDATE_STAT64(rx_stat_grxpf, rx_stat_xoffstateentered); +- UPDATE_STAT64(rx_stat_grxpf, rx_stat_xoffpauseframesreceived); ++ UPDATE_STAT64(rx_stat_grxpf, rx_stat_bmac_xpf); + UPDATE_STAT64(tx_stat_gtxpf, tx_stat_outxoffsent); + UPDATE_STAT64(tx_stat_gtxpf, tx_stat_flowcontroldone); + UPDATE_STAT64(tx_stat_gt64, tx_stat_etherstatspkts64octets); +@@ -3520,12 +4116,23 @@ + UPDATE_STAT64(tx_stat_gterr, + tx_stat_dot3statsinternalmactransmiterrors); + UPDATE_STAT64(tx_stat_gtufl, tx_stat_bmac_ufl); ++ ++ estats->pause_frames_received_hi = ++ pstats->mac_stx[1].rx_stat_bmac_xpf_hi; ++ estats->pause_frames_received_lo = ++ pstats->mac_stx[1].rx_stat_bmac_xpf_lo; ++ ++ estats->pause_frames_sent_hi = ++ pstats->mac_stx[1].tx_stat_outxoffsent_hi; ++ estats->pause_frames_sent_lo = ++ pstats->mac_stx[1].tx_stat_outxoffsent_lo; + } + + static void bnx2x_emac_stats_update(struct bnx2x *bp) + { + struct emac_stats *new = bnx2x_sp(bp, mac_stats.emac_stats); + struct host_port_stats *pstats = bnx2x_sp(bp, port_stats); ++ struct bnx2x_eth_stats *estats = &bp->eth_stats; + + UPDATE_EXTEND_STAT(rx_stat_ifhcinbadoctets); + UPDATE_EXTEND_STAT(tx_stat_ifhcoutbadoctets); +@@ -3558,6 +4165,24 @@ + UPDATE_EXTEND_STAT(tx_stat_etherstatspkts1024octetsto1522octets); + UPDATE_EXTEND_STAT(tx_stat_etherstatspktsover1522octets); + UPDATE_EXTEND_STAT(tx_stat_dot3statsinternalmactransmiterrors); ++ ++ estats->pause_frames_received_hi = ++ pstats->mac_stx[1].rx_stat_xonpauseframesreceived_hi; ++ estats->pause_frames_received_lo = ++ pstats->mac_stx[1].rx_stat_xonpauseframesreceived_lo; ++ ADD_64(estats->pause_frames_received_hi, ++ pstats->mac_stx[1].rx_stat_xoffpauseframesreceived_hi, ++ estats->pause_frames_received_lo, ++ pstats->mac_stx[1].rx_stat_xoffpauseframesreceived_lo); ++ ++ estats->pause_frames_sent_hi = ++ pstats->mac_stx[1].tx_stat_outxonsent_hi; ++ estats->pause_frames_sent_lo = ++ pstats->mac_stx[1].tx_stat_outxonsent_lo; ++ ADD_64(estats->pause_frames_sent_hi, ++ pstats->mac_stx[1].tx_stat_outxoffsent_hi, ++ estats->pause_frames_sent_lo, ++ pstats->mac_stx[1].tx_stat_outxoffsent_lo); + } + + static int bnx2x_hw_stats_update(struct bnx2x *bp) +@@ -3566,7 +4191,11 @@ + struct nig_stats *old = &(bp->port.old_nig_stats); + struct host_port_stats *pstats = bnx2x_sp(bp, port_stats); + struct bnx2x_eth_stats *estats = &bp->eth_stats; +- struct regpair diff; ++ struct { ++ u32 lo; ++ u32 hi; ++ } diff; ++ u32 nig_timer_max; + + if (bp->link_vars.mac_type == MAC_TYPE_BMAC) + bnx2x_bmac_stats_update(bp); +@@ -3575,7 +4204,7 @@ + bnx2x_emac_stats_update(bp); + + else { /* unreached */ +- BNX2X_ERR("stats updated by dmae but no MAC active\n"); ++ BNX2X_ERR("stats updated by DMAE but no MAC active\n"); + return -1; + } + +@@ -3597,134 +4226,239 @@ + + pstats->host_port_stats_start = ++pstats->host_port_stats_end; + ++ nig_timer_max = SHMEM_RD(bp, port_mb[BP_PORT(bp)].stat_nig_timer); ++ if (nig_timer_max != estats->nig_timer_max) { ++ estats->nig_timer_max = nig_timer_max; ++ BNX2X_ERR("NIG timer max (%u)\n", estats->nig_timer_max); ++ } ++ + return 0; + } + + static int bnx2x_storm_stats_update(struct bnx2x *bp) + { + struct eth_stats_query *stats = bnx2x_sp(bp, fw_stats); +- int cl_id = BP_CL_ID(bp); + struct tstorm_per_port_stats *tport = +- &stats->tstorm_common.port_statistics; +- struct tstorm_per_client_stats *tclient = +- &stats->tstorm_common.client_statistics[cl_id]; +- struct tstorm_per_client_stats *old_tclient = &bp->old_tclient; +- struct xstorm_per_client_stats *xclient = +- &stats->xstorm_common.client_statistics[cl_id]; +- struct xstorm_per_client_stats *old_xclient = &bp->old_xclient; ++ &stats->tstorm_common.port_statistics; + struct host_func_stats *fstats = bnx2x_sp(bp, func_stats); + struct bnx2x_eth_stats *estats = &bp->eth_stats; +- u32 diff; +- +- /* are storm stats valid? */ +- if ((u16)(le16_to_cpu(tclient->stats_counter) + 1) != ++ int i; ++ ++ memcpy(&(fstats->total_bytes_received_hi), ++ &(bnx2x_sp(bp, func_stats_base)->total_bytes_received_hi), ++ sizeof(struct host_func_stats) - 2*sizeof(u32)); ++ estats->error_bytes_received_hi = 0; ++ estats->error_bytes_received_lo = 0; ++ estats->etherstatsoverrsizepkts_hi = 0; ++ estats->etherstatsoverrsizepkts_lo = 0; ++ estats->no_buff_discard_hi = 0; ++ estats->no_buff_discard_lo = 0; ++ ++ for_each_rx_queue(bp, i) { ++ struct bnx2x_fastpath *fp = &bp->fp[i]; ++ int cl_id = fp->cl_id; ++ struct tstorm_per_client_stats *tclient = ++ &stats->tstorm_common.client_statistics[cl_id]; ++ struct tstorm_per_client_stats *old_tclient = &fp->old_tclient; ++ struct ustorm_per_client_stats *uclient = ++ &stats->ustorm_common.client_statistics[cl_id]; ++ struct ustorm_per_client_stats *old_uclient = &fp->old_uclient; ++ struct xstorm_per_client_stats *xclient = ++ &stats->xstorm_common.client_statistics[cl_id]; ++ struct xstorm_per_client_stats *old_xclient = &fp->old_xclient; ++ struct bnx2x_eth_q_stats *qstats = &fp->eth_q_stats; ++ u32 diff; ++ ++ /* are storm stats valid? */ ++ if ((u16)(le16_to_cpu(xclient->stats_counter) + 1) != + bp->stats_counter) { +- DP(BNX2X_MSG_STATS, "stats not updated by tstorm" +- " tstorm counter (%d) != stats_counter (%d)\n", +- tclient->stats_counter, bp->stats_counter); +- return -1; +- } +- if ((u16)(le16_to_cpu(xclient->stats_counter) + 1) != ++ DP(BNX2X_MSG_STATS, "[%d] stats not updated by xstorm" ++ " xstorm counter (%d) != stats_counter (%d)\n", ++ i, xclient->stats_counter, bp->stats_counter); ++ return -1; ++ } ++ if ((u16)(le16_to_cpu(tclient->stats_counter) + 1) != + bp->stats_counter) { +- DP(BNX2X_MSG_STATS, "stats not updated by xstorm" +- " xstorm counter (%d) != stats_counter (%d)\n", +- xclient->stats_counter, bp->stats_counter); +- return -2; +- } +- +- fstats->total_bytes_received_hi = +- fstats->valid_bytes_received_hi = +- le32_to_cpu(tclient->total_rcv_bytes.hi); +- fstats->total_bytes_received_lo = +- fstats->valid_bytes_received_lo = +- le32_to_cpu(tclient->total_rcv_bytes.lo); +- +- estats->error_bytes_received_hi = ++ DP(BNX2X_MSG_STATS, "[%d] stats not updated by tstorm" ++ " tstorm counter (%d) != stats_counter (%d)\n", ++ i, tclient->stats_counter, bp->stats_counter); ++ return -2; ++ } ++ if ((u16)(le16_to_cpu(uclient->stats_counter) + 1) != ++ bp->stats_counter) { ++ DP(BNX2X_MSG_STATS, "[%d] stats not updated by ustorm" ++ " ustorm counter (%d) != stats_counter (%d)\n", ++ i, uclient->stats_counter, bp->stats_counter); ++ return -4; ++ } ++ ++ qstats->total_bytes_received_hi = ++ le32_to_cpu(tclient->rcv_broadcast_bytes.hi); ++ qstats->total_bytes_received_lo = ++ le32_to_cpu(tclient->rcv_broadcast_bytes.lo); ++ ++ ADD_64(qstats->total_bytes_received_hi, ++ le32_to_cpu(tclient->rcv_multicast_bytes.hi), ++ qstats->total_bytes_received_lo, ++ le32_to_cpu(tclient->rcv_multicast_bytes.lo)); ++ ++ ADD_64(qstats->total_bytes_received_hi, ++ le32_to_cpu(tclient->rcv_unicast_bytes.hi), ++ qstats->total_bytes_received_lo, ++ le32_to_cpu(tclient->rcv_unicast_bytes.lo)); ++ ++ qstats->valid_bytes_received_hi = ++ qstats->total_bytes_received_hi; ++ qstats->valid_bytes_received_lo = ++ qstats->total_bytes_received_lo; ++ ++ qstats->error_bytes_received_hi = + le32_to_cpu(tclient->rcv_error_bytes.hi); +- estats->error_bytes_received_lo = ++ qstats->error_bytes_received_lo = + le32_to_cpu(tclient->rcv_error_bytes.lo); ++ ++ ADD_64(qstats->total_bytes_received_hi, ++ qstats->error_bytes_received_hi, ++ qstats->total_bytes_received_lo, ++ qstats->error_bytes_received_lo); ++ ++ UPDATE_EXTEND_TSTAT(rcv_unicast_pkts, ++ total_unicast_packets_received); ++ UPDATE_EXTEND_TSTAT(rcv_multicast_pkts, ++ total_multicast_packets_received); ++ UPDATE_EXTEND_TSTAT(rcv_broadcast_pkts, ++ total_broadcast_packets_received); ++ UPDATE_EXTEND_TSTAT(packets_too_big_discard, ++ etherstatsoverrsizepkts); ++ UPDATE_EXTEND_TSTAT(no_buff_discard, no_buff_discard); ++ ++ SUB_EXTEND_USTAT(ucast_no_buff_pkts, ++ total_unicast_packets_received); ++ SUB_EXTEND_USTAT(mcast_no_buff_pkts, ++ total_multicast_packets_received); ++ SUB_EXTEND_USTAT(bcast_no_buff_pkts, ++ total_broadcast_packets_received); ++ UPDATE_EXTEND_USTAT(ucast_no_buff_pkts, no_buff_discard); ++ UPDATE_EXTEND_USTAT(mcast_no_buff_pkts, no_buff_discard); ++ UPDATE_EXTEND_USTAT(bcast_no_buff_pkts, no_buff_discard); ++ ++ qstats->total_bytes_transmitted_hi = ++ le32_to_cpu(xclient->unicast_bytes_sent.hi); ++ qstats->total_bytes_transmitted_lo = ++ le32_to_cpu(xclient->unicast_bytes_sent.lo); ++ ++ ADD_64(qstats->total_bytes_transmitted_hi, ++ le32_to_cpu(xclient->multicast_bytes_sent.hi), ++ qstats->total_bytes_transmitted_lo, ++ le32_to_cpu(xclient->multicast_bytes_sent.lo)); ++ ++ ADD_64(qstats->total_bytes_transmitted_hi, ++ le32_to_cpu(xclient->broadcast_bytes_sent.hi), ++ qstats->total_bytes_transmitted_lo, ++ le32_to_cpu(xclient->broadcast_bytes_sent.lo)); ++ ++ UPDATE_EXTEND_XSTAT(unicast_pkts_sent, ++ total_unicast_packets_transmitted); ++ UPDATE_EXTEND_XSTAT(multicast_pkts_sent, ++ total_multicast_packets_transmitted); ++ UPDATE_EXTEND_XSTAT(broadcast_pkts_sent, ++ total_broadcast_packets_transmitted); ++ ++ old_tclient->checksum_discard = tclient->checksum_discard; ++ old_tclient->ttl0_discard = tclient->ttl0_discard; ++ ++ ADD_64(fstats->total_bytes_received_hi, ++ qstats->total_bytes_received_hi, ++ fstats->total_bytes_received_lo, ++ qstats->total_bytes_received_lo); ++ ADD_64(fstats->total_bytes_transmitted_hi, ++ qstats->total_bytes_transmitted_hi, ++ fstats->total_bytes_transmitted_lo, ++ qstats->total_bytes_transmitted_lo); ++ ADD_64(fstats->total_unicast_packets_received_hi, ++ qstats->total_unicast_packets_received_hi, ++ fstats->total_unicast_packets_received_lo, ++ qstats->total_unicast_packets_received_lo); ++ ADD_64(fstats->total_multicast_packets_received_hi, ++ qstats->total_multicast_packets_received_hi, ++ fstats->total_multicast_packets_received_lo, ++ qstats->total_multicast_packets_received_lo); ++ ADD_64(fstats->total_broadcast_packets_received_hi, ++ qstats->total_broadcast_packets_received_hi, ++ fstats->total_broadcast_packets_received_lo, ++ qstats->total_broadcast_packets_received_lo); ++ ADD_64(fstats->total_unicast_packets_transmitted_hi, ++ qstats->total_unicast_packets_transmitted_hi, ++ fstats->total_unicast_packets_transmitted_lo, ++ qstats->total_unicast_packets_transmitted_lo); ++ ADD_64(fstats->total_multicast_packets_transmitted_hi, ++ qstats->total_multicast_packets_transmitted_hi, ++ fstats->total_multicast_packets_transmitted_lo, ++ qstats->total_multicast_packets_transmitted_lo); ++ ADD_64(fstats->total_broadcast_packets_transmitted_hi, ++ qstats->total_broadcast_packets_transmitted_hi, ++ fstats->total_broadcast_packets_transmitted_lo, ++ qstats->total_broadcast_packets_transmitted_lo); ++ ADD_64(fstats->valid_bytes_received_hi, ++ qstats->valid_bytes_received_hi, ++ fstats->valid_bytes_received_lo, ++ qstats->valid_bytes_received_lo); ++ ++ ADD_64(estats->error_bytes_received_hi, ++ qstats->error_bytes_received_hi, ++ estats->error_bytes_received_lo, ++ qstats->error_bytes_received_lo); ++ ADD_64(estats->etherstatsoverrsizepkts_hi, ++ qstats->etherstatsoverrsizepkts_hi, ++ estats->etherstatsoverrsizepkts_lo, ++ qstats->etherstatsoverrsizepkts_lo); ++ ADD_64(estats->no_buff_discard_hi, qstats->no_buff_discard_hi, ++ estats->no_buff_discard_lo, qstats->no_buff_discard_lo); ++ } ++ ++ ADD_64(fstats->total_bytes_received_hi, ++ estats->rx_stat_ifhcinbadoctets_hi, ++ fstats->total_bytes_received_lo, ++ estats->rx_stat_ifhcinbadoctets_lo); ++ ++ memcpy(estats, &(fstats->total_bytes_received_hi), ++ sizeof(struct host_func_stats) - 2*sizeof(u32)); ++ ++ ADD_64(estats->etherstatsoverrsizepkts_hi, ++ estats->rx_stat_dot3statsframestoolong_hi, ++ estats->etherstatsoverrsizepkts_lo, ++ estats->rx_stat_dot3statsframestoolong_lo); + ADD_64(estats->error_bytes_received_hi, + estats->rx_stat_ifhcinbadoctets_hi, + estats->error_bytes_received_lo, + estats->rx_stat_ifhcinbadoctets_lo); + +- ADD_64(fstats->total_bytes_received_hi, +- estats->error_bytes_received_hi, +- fstats->total_bytes_received_lo, +- estats->error_bytes_received_lo); +- +- UPDATE_EXTEND_TSTAT(rcv_unicast_pkts, total_unicast_packets_received); +- UPDATE_EXTEND_TSTAT(rcv_multicast_pkts, +- total_multicast_packets_received); +- UPDATE_EXTEND_TSTAT(rcv_broadcast_pkts, +- total_broadcast_packets_received); +- +- fstats->total_bytes_transmitted_hi = +- le32_to_cpu(xclient->total_sent_bytes.hi); +- fstats->total_bytes_transmitted_lo = +- le32_to_cpu(xclient->total_sent_bytes.lo); +- +- UPDATE_EXTEND_XSTAT(unicast_pkts_sent, +- total_unicast_packets_transmitted); +- UPDATE_EXTEND_XSTAT(multicast_pkts_sent, +- total_multicast_packets_transmitted); +- UPDATE_EXTEND_XSTAT(broadcast_pkts_sent, +- total_broadcast_packets_transmitted); +- +- memcpy(estats, &(fstats->total_bytes_received_hi), +- sizeof(struct host_func_stats) - 2*sizeof(u32)); +- +- estats->mac_filter_discard = le32_to_cpu(tport->mac_filter_discard); +- estats->xxoverflow_discard = le32_to_cpu(tport->xxoverflow_discard); +- estats->brb_truncate_discard = ++ if (bp->port.pmf) { ++ estats->mac_filter_discard = ++ le32_to_cpu(tport->mac_filter_discard); ++ estats->xxoverflow_discard = ++ le32_to_cpu(tport->xxoverflow_discard); ++ estats->brb_truncate_discard = + le32_to_cpu(tport->brb_truncate_discard); +- estats->mac_discard = le32_to_cpu(tport->mac_discard); +- +- old_tclient->rcv_unicast_bytes.hi = +- le32_to_cpu(tclient->rcv_unicast_bytes.hi); +- old_tclient->rcv_unicast_bytes.lo = +- le32_to_cpu(tclient->rcv_unicast_bytes.lo); +- old_tclient->rcv_broadcast_bytes.hi = +- le32_to_cpu(tclient->rcv_broadcast_bytes.hi); +- old_tclient->rcv_broadcast_bytes.lo = +- le32_to_cpu(tclient->rcv_broadcast_bytes.lo); +- old_tclient->rcv_multicast_bytes.hi = +- le32_to_cpu(tclient->rcv_multicast_bytes.hi); +- old_tclient->rcv_multicast_bytes.lo = +- le32_to_cpu(tclient->rcv_multicast_bytes.lo); +- old_tclient->total_rcv_pkts = le32_to_cpu(tclient->total_rcv_pkts); +- +- old_tclient->checksum_discard = le32_to_cpu(tclient->checksum_discard); +- old_tclient->packets_too_big_discard = +- le32_to_cpu(tclient->packets_too_big_discard); +- estats->no_buff_discard = +- old_tclient->no_buff_discard = le32_to_cpu(tclient->no_buff_discard); +- old_tclient->ttl0_discard = le32_to_cpu(tclient->ttl0_discard); +- +- old_xclient->total_sent_pkts = le32_to_cpu(xclient->total_sent_pkts); +- old_xclient->unicast_bytes_sent.hi = +- le32_to_cpu(xclient->unicast_bytes_sent.hi); +- old_xclient->unicast_bytes_sent.lo = +- le32_to_cpu(xclient->unicast_bytes_sent.lo); +- old_xclient->multicast_bytes_sent.hi = +- le32_to_cpu(xclient->multicast_bytes_sent.hi); +- old_xclient->multicast_bytes_sent.lo = +- le32_to_cpu(xclient->multicast_bytes_sent.lo); +- old_xclient->broadcast_bytes_sent.hi = +- le32_to_cpu(xclient->broadcast_bytes_sent.hi); +- old_xclient->broadcast_bytes_sent.lo = +- le32_to_cpu(xclient->broadcast_bytes_sent.lo); ++ estats->mac_discard = le32_to_cpu(tport->mac_discard); ++ } + + fstats->host_func_stats_start = ++fstats->host_func_stats_end; + ++ bp->stats_pending = 0; ++ + return 0; + } + + static void bnx2x_net_stats_update(struct bnx2x *bp) + { +- struct tstorm_per_client_stats *old_tclient = &bp->old_tclient; + struct bnx2x_eth_stats *estats = &bp->eth_stats; ++#if (LINUX_VERSION_CODE >= 0x020618) /* BNX2X_UPSTREAM */ + struct net_device_stats *nstats = &bp->dev->stats; ++#else ++ struct net_device_stats *nstats = &bp->net_stats; ++#endif ++ int i; + + nstats->rx_packets = + bnx2x_hilo(&estats->total_unicast_packets_received_hi) + +@@ -3736,34 +4470,33 @@ + bnx2x_hilo(&estats->total_multicast_packets_transmitted_hi) + + bnx2x_hilo(&estats->total_broadcast_packets_transmitted_hi); + +- nstats->rx_bytes = bnx2x_hilo(&estats->valid_bytes_received_hi); ++ nstats->rx_bytes = bnx2x_hilo(&estats->total_bytes_received_hi); + + nstats->tx_bytes = bnx2x_hilo(&estats->total_bytes_transmitted_hi); + +- nstats->rx_dropped = old_tclient->checksum_discard + +- estats->mac_discard; ++ nstats->rx_dropped = estats->mac_discard; ++ for_each_rx_queue(bp, i) ++ nstats->rx_dropped += ++ le32_to_cpu(bp->fp[i].old_tclient.checksum_discard); ++ + nstats->tx_dropped = 0; + + nstats->multicast = +- bnx2x_hilo(&estats->total_multicast_packets_transmitted_hi); ++ bnx2x_hilo(&estats->total_multicast_packets_received_hi); + + nstats->collisions = +- estats->tx_stat_dot3statssinglecollisionframes_lo + +- estats->tx_stat_dot3statsmultiplecollisionframes_lo + +- estats->tx_stat_dot3statslatecollisions_lo + +- estats->tx_stat_dot3statsexcessivecollisions_lo; +- +- estats->jabber_packets_received = +- old_tclient->packets_too_big_discard + +- estats->rx_stat_dot3statsframestoolong_lo; ++ bnx2x_hilo(&estats->tx_stat_etherstatscollisions_hi); + + nstats->rx_length_errors = +- estats->rx_stat_etherstatsundersizepkts_lo + +- estats->jabber_packets_received; +- nstats->rx_over_errors = estats->brb_drop_lo + estats->brb_truncate_lo; +- nstats->rx_crc_errors = estats->rx_stat_dot3statsfcserrors_lo; +- nstats->rx_frame_errors = estats->rx_stat_dot3statsalignmenterrors_lo; +- nstats->rx_fifo_errors = old_tclient->no_buff_discard; ++ bnx2x_hilo(&estats->rx_stat_etherstatsundersizepkts_hi) + ++ bnx2x_hilo(&estats->etherstatsoverrsizepkts_hi); ++ nstats->rx_over_errors = bnx2x_hilo(&estats->brb_drop_hi) + ++ bnx2x_hilo(&estats->brb_truncate_hi); ++ nstats->rx_crc_errors = ++ bnx2x_hilo(&estats->rx_stat_dot3statsfcserrors_hi); ++ nstats->rx_frame_errors = ++ bnx2x_hilo(&estats->rx_stat_dot3statsalignmenterrors_hi); ++ nstats->rx_fifo_errors = bnx2x_hilo(&estats->no_buff_discard_hi); + nstats->rx_missed_errors = estats->xxoverflow_discard; + + nstats->rx_errors = nstats->rx_length_errors + +@@ -3774,74 +4507,97 @@ + nstats->rx_missed_errors; + + nstats->tx_aborted_errors = +- estats->tx_stat_dot3statslatecollisions_lo + +- estats->tx_stat_dot3statsexcessivecollisions_lo; +- nstats->tx_carrier_errors = estats->rx_stat_falsecarriererrors_lo; ++ bnx2x_hilo(&estats->tx_stat_dot3statslatecollisions_hi) + ++ bnx2x_hilo(&estats->tx_stat_dot3statsexcessivecollisions_hi); ++ nstats->tx_carrier_errors = ++ bnx2x_hilo(&estats->rx_stat_dot3statscarriersenseerrors_hi); + nstats->tx_fifo_errors = 0; + nstats->tx_heartbeat_errors = 0; + nstats->tx_window_errors = 0; + + nstats->tx_errors = nstats->tx_aborted_errors + +- nstats->tx_carrier_errors; ++ nstats->tx_carrier_errors + ++ bnx2x_hilo(&estats->tx_stat_dot3statsinternalmactransmiterrors_hi); ++} ++ ++static void bnx2x_drv_stats_update(struct bnx2x *bp) ++{ ++ struct bnx2x_eth_stats *estats = &bp->eth_stats; ++ int i; ++ ++ estats->driver_xoff = 0; ++ estats->rx_err_discard_pkt = 0; ++ estats->rx_skb_alloc_failed = 0; ++ estats->hw_csum_err = 0; ++ for_each_rx_queue(bp, i) { ++ struct bnx2x_eth_q_stats *qstats = &bp->fp[i].eth_q_stats; ++ ++ estats->driver_xoff += qstats->driver_xoff; ++ estats->rx_err_discard_pkt += qstats->rx_err_discard_pkt; ++ estats->rx_skb_alloc_failed += qstats->rx_skb_alloc_failed; ++ estats->hw_csum_err += qstats->hw_csum_err; ++ } + } + + static void bnx2x_stats_update(struct bnx2x *bp) + { + u32 *stats_comp = bnx2x_sp(bp, stats_comp); +- int update = 0; + + if (*stats_comp != DMAE_COMP_VAL) + return; + + if (bp->port.pmf) +- update = (bnx2x_hw_stats_update(bp) == 0); +- +- update |= (bnx2x_storm_stats_update(bp) == 0); +- +- if (update) +- bnx2x_net_stats_update(bp); +- +- else { +- if (bp->stats_pending) { +- bp->stats_pending++; +- if (bp->stats_pending == 3) { +- BNX2X_ERR("stats not updated for 3 times\n"); +- bnx2x_panic(); +- return; +- } +- } +- } ++ bnx2x_hw_stats_update(bp); ++ ++ if (bnx2x_storm_stats_update(bp) && (bp->stats_pending++ == 3)) { ++ BNX2X_ERR("storm stats were not updated for 3 times\n"); ++ bnx2x_panic(); ++ return; ++ } ++ ++ bnx2x_net_stats_update(bp); ++ bnx2x_drv_stats_update(bp); + + if (bp->msglevel & NETIF_MSG_TIMER) { +- struct tstorm_per_client_stats *old_tclient = &bp->old_tclient; ++ struct bnx2x_fastpath *fp0_rx = bp->fp; ++ struct bnx2x_fastpath *fp0_tx = &(bp->fp[bp->num_rx_queues]); ++ struct tstorm_per_client_stats *old_tclient = ++ &bp->fp->old_tclient; ++ struct bnx2x_eth_q_stats *qstats = &bp->fp->eth_q_stats; + struct bnx2x_eth_stats *estats = &bp->eth_stats; ++#if (LINUX_VERSION_CODE >= 0x020618) /* BNX2X_UPSTREAM */ + struct net_device_stats *nstats = &bp->dev->stats; ++#else ++ struct net_device_stats *nstats = &bp->net_stats; ++#endif + int i; + + printk(KERN_DEBUG "%s:\n", bp->dev->name); + printk(KERN_DEBUG " tx avail (%4x) tx hc idx (%x)" + " tx pkt (%lx)\n", +- bnx2x_tx_avail(bp->fp), +- le16_to_cpu(*bp->fp->tx_cons_sb), nstats->tx_packets); ++ bnx2x_tx_avail(fp0_tx), ++ le16_to_cpu(*fp0_tx->tx_cons_sb), nstats->tx_packets); + printk(KERN_DEBUG " rx usage (%4x) rx hc idx (%x)" + " rx pkt (%lx)\n", +- (u16)(le16_to_cpu(*bp->fp->rx_cons_sb) - +- bp->fp->rx_comp_cons), +- le16_to_cpu(*bp->fp->rx_cons_sb), nstats->rx_packets); +- printk(KERN_DEBUG " %s (Xoff events %u) brb drops %u\n", +- netif_queue_stopped(bp->dev) ? "Xoff" : "Xon", +- estats->driver_xoff, estats->brb_drop_lo); ++ (u16)(le16_to_cpu(*fp0_rx->rx_cons_sb) - ++ fp0_rx->rx_comp_cons), ++ le16_to_cpu(*fp0_rx->rx_cons_sb), nstats->rx_packets); ++ printk(KERN_DEBUG " %s (Xoff events %u) brb drops %u " ++ "brb truncate %u\n", ++ (netif_queue_stopped(bp->dev) ? "Xoff" : "Xon"), ++ qstats->driver_xoff, ++ estats->brb_drop_lo, estats->brb_truncate_lo); + printk(KERN_DEBUG "tstats: checksum_discard %u " +- "packets_too_big_discard %u no_buff_discard %u " ++ "packets_too_big_discard %lu no_buff_discard %lu " + "mac_discard %u mac_filter_discard %u " + "xxovrflow_discard %u brb_truncate_discard %u " + "ttl0_discard %u\n", +- old_tclient->checksum_discard, +- old_tclient->packets_too_big_discard, +- old_tclient->no_buff_discard, estats->mac_discard, +- estats->mac_filter_discard, estats->xxoverflow_discard, +- estats->brb_truncate_discard, +- old_tclient->ttl0_discard); ++ le32_to_cpu(old_tclient->checksum_discard), ++ bnx2x_hilo(&qstats->etherstatsoverrsizepkts_hi), ++ bnx2x_hilo(&qstats->no_buff_discard_hi), ++ estats->mac_discard, estats->mac_filter_discard, ++ estats->xxoverflow_discard, estats->brb_truncate_discard, ++ le32_to_cpu(old_tclient->ttl0_discard)); + + for_each_queue(bp, i) { + printk(KERN_DEBUG "[%d]: %lu\t%lu\t%lu\n", i, +@@ -3976,6 +4732,177 @@ + state, event, bp->stats_state); + } + ++static void bnx2x_port_stats_base_init(struct bnx2x *bp) ++{ ++ struct dmae_command *dmae; ++ u32 *stats_comp = bnx2x_sp(bp, stats_comp); ++ ++ /* sanity */ ++ if (!bp->port.pmf || !bp->port.port_stx) { ++ BNX2X_ERR("BUG!\n"); ++ return; ++ } ++ ++ bp->executer_idx = 0; ++ ++ dmae = bnx2x_sp(bp, dmae[bp->executer_idx++]); ++ dmae->opcode = (DMAE_CMD_SRC_PCI | DMAE_CMD_DST_GRC | ++ DMAE_CMD_C_DST_PCI | DMAE_CMD_C_ENABLE | ++ DMAE_CMD_SRC_RESET | DMAE_CMD_DST_RESET | ++#ifdef __BIG_ENDIAN ++ DMAE_CMD_ENDIANITY_B_DW_SWAP | ++#else ++ DMAE_CMD_ENDIANITY_DW_SWAP | ++#endif ++ (BP_PORT(bp) ? DMAE_CMD_PORT_1 : DMAE_CMD_PORT_0) | ++ (BP_E1HVN(bp) << DMAE_CMD_E1HVN_SHIFT)); ++ dmae->src_addr_lo = U64_LO(bnx2x_sp_mapping(bp, port_stats)); ++ dmae->src_addr_hi = U64_HI(bnx2x_sp_mapping(bp, port_stats)); ++ dmae->dst_addr_lo = bp->port.port_stx >> 2; ++ dmae->dst_addr_hi = 0; ++ dmae->len = sizeof(struct host_port_stats) >> 2; ++ dmae->comp_addr_lo = U64_LO(bnx2x_sp_mapping(bp, stats_comp)); ++ dmae->comp_addr_hi = U64_HI(bnx2x_sp_mapping(bp, stats_comp)); ++ dmae->comp_val = DMAE_COMP_VAL; ++ ++ *stats_comp = 0; ++ bnx2x_hw_stats_post(bp); ++ bnx2x_stats_comp(bp); ++} ++ ++static void bnx2x_func_stats_base_init(struct bnx2x *bp) ++{ ++ int vn, vn_max = IS_E1HMF(bp) ? E1HVN_MAX : E1VN_MAX; ++ int port = BP_PORT(bp); ++ int func; ++ u32 func_stx; ++ ++ /* sanity */ ++ if (!bp->port.pmf || !bp->func_stx) { ++ BNX2X_ERR("BUG!\n"); ++ return; ++ } ++ ++ /* save our func_stx */ ++ func_stx = bp->func_stx; ++ ++ for (vn = VN_0; vn < vn_max; vn++) { ++ func = 2*vn + port; ++ ++ bp->func_stx = SHMEM_RD(bp, func_mb[func].fw_mb_param); ++ bnx2x_func_stats_init(bp); ++ bnx2x_hw_stats_post(bp); ++ bnx2x_stats_comp(bp); ++ } ++ ++ /* restore our func_stx */ ++ bp->func_stx = func_stx; ++} ++ ++static void bnx2x_func_stats_base_update(struct bnx2x *bp) ++{ ++ struct dmae_command *dmae = &bp->stats_dmae; ++ u32 *stats_comp = bnx2x_sp(bp, stats_comp); ++ ++ /* sanity */ ++ if (!bp->func_stx) { ++ BNX2X_ERR("BUG!\n"); ++ return; ++ } ++ ++ bp->executer_idx = 0; ++ memset(dmae, 0, sizeof(struct dmae_command)); ++ ++ dmae->opcode = (DMAE_CMD_SRC_GRC | DMAE_CMD_DST_PCI | ++ DMAE_CMD_C_DST_PCI | DMAE_CMD_C_ENABLE | ++ DMAE_CMD_SRC_RESET | DMAE_CMD_DST_RESET | ++#ifdef __BIG_ENDIAN ++ DMAE_CMD_ENDIANITY_B_DW_SWAP | ++#else ++ DMAE_CMD_ENDIANITY_DW_SWAP | ++#endif ++ (BP_PORT(bp) ? DMAE_CMD_PORT_1 : DMAE_CMD_PORT_0) | ++ (BP_E1HVN(bp) << DMAE_CMD_E1HVN_SHIFT)); ++ dmae->src_addr_lo = bp->func_stx >> 2; ++ dmae->src_addr_hi = 0; ++ dmae->dst_addr_lo = U64_LO(bnx2x_sp_mapping(bp, func_stats_base)); ++ dmae->dst_addr_hi = U64_HI(bnx2x_sp_mapping(bp, func_stats_base)); ++ dmae->len = sizeof(struct host_func_stats) >> 2; ++ dmae->comp_addr_lo = U64_LO(bnx2x_sp_mapping(bp, stats_comp)); ++ dmae->comp_addr_hi = U64_HI(bnx2x_sp_mapping(bp, stats_comp)); ++ dmae->comp_val = DMAE_COMP_VAL; ++ ++ *stats_comp = 0; ++ bnx2x_hw_stats_post(bp); ++ bnx2x_stats_comp(bp); ++} ++ ++static void bnx2x_stats_init(struct bnx2x *bp) ++{ ++ int port = BP_PORT(bp); ++ int func = BP_FUNC(bp); ++ int i; ++ ++ bp->stats_pending = 0; ++ bp->executer_idx = 0; ++ bp->stats_counter = 0; ++ ++ /* port and func stats for management */ ++ if (!BP_NOMCP(bp)) { ++ bp->port.port_stx = SHMEM_RD(bp, port_mb[port].port_stx); ++ bp->func_stx = SHMEM_RD(bp, func_mb[func].fw_mb_param); ++ ++ } else { ++ bp->port.port_stx = 0; ++ bp->func_stx = 0; ++ } ++ DP(BNX2X_MSG_STATS, "port_stx 0x%x func_stx 0x%x\n", ++ bp->port.port_stx, bp->func_stx); ++ ++ /* port stats */ ++ memset(&(bp->port.old_nig_stats), 0, sizeof(struct nig_stats)); ++ bp->port.old_nig_stats.brb_discard = ++ REG_RD(bp, NIG_REG_STAT0_BRB_DISCARD + port*0x38); ++ bp->port.old_nig_stats.brb_truncate = ++ REG_RD(bp, NIG_REG_STAT0_BRB_TRUNCATE + port*0x38); ++ REG_RD_DMAE(bp, NIG_REG_STAT0_EGRESS_MAC_PKT0 + port*0x50, ++ &(bp->port.old_nig_stats.egress_mac_pkt0_lo), 2); ++ REG_RD_DMAE(bp, NIG_REG_STAT0_EGRESS_MAC_PKT1 + port*0x50, ++ &(bp->port.old_nig_stats.egress_mac_pkt1_lo), 2); ++ ++ /* function stats */ ++ for_each_queue(bp, i) { ++ struct bnx2x_fastpath *fp = &bp->fp[i]; ++ ++ memset(&fp->old_tclient, 0, ++ sizeof(struct tstorm_per_client_stats)); ++ memset(&fp->old_uclient, 0, ++ sizeof(struct ustorm_per_client_stats)); ++ memset(&fp->old_xclient, 0, ++ sizeof(struct xstorm_per_client_stats)); ++ memset(&fp->eth_q_stats, 0, sizeof(struct bnx2x_eth_q_stats)); ++ } ++ ++#if (LINUX_VERSION_CODE >= 0x020618) /* BNX2X_UPSTREAM */ ++ memset(&bp->dev->stats, 0, sizeof(struct net_device_stats)); ++#else ++ memset(&bp->net_stats, 0, sizeof(struct net_device_stats)); ++#endif ++ memset(&bp->eth_stats, 0, sizeof(struct bnx2x_eth_stats)); ++ ++ bp->stats_state = STATS_STATE_DISABLED; ++ ++ if (bp->port.pmf) { ++ if (bp->port.port_stx) ++ bnx2x_port_stats_base_init(bp); ++ ++ if (bp->func_stx) ++ bnx2x_func_stats_base_init(bp); ++ ++ } else if (bp->func_stx) ++ bnx2x_func_stats_base_update(bp); ++} ++ + static void bnx2x_timer(unsigned long data) + { + struct bnx2x *bp = (struct bnx2x *) data; +@@ -3990,7 +4917,7 @@ + struct bnx2x_fastpath *fp = &bp->fp[0]; + int rc; + +- bnx2x_tx_int(fp, 1000); ++ bnx2x_tx_int(fp); + rc = bnx2x_rx_int(fp, 1000); + } + +@@ -4038,12 +4965,13 @@ + { + int port = BP_PORT(bp); + +- bnx2x_init_fill(bp, BAR_USTRORM_INTMEM + +- USTORM_SB_HOST_STATUS_BLOCK_OFFSET(port, sb_id), 0, +- sizeof(struct ustorm_status_block)/4); +- bnx2x_init_fill(bp, BAR_CSTRORM_INTMEM + +- CSTORM_SB_HOST_STATUS_BLOCK_OFFSET(port, sb_id), 0, +- sizeof(struct cstorm_status_block)/4); ++ /* "CSTORM" */ ++ bnx2x_init_fill(bp, CSEM_REG_FAST_MEMORY + ++ CSTORM_SB_HOST_STATUS_BLOCK_U_OFFSET(port, sb_id), 0, ++ CSTORM_SB_STATUS_BLOCK_U_SIZE / 4); ++ bnx2x_init_fill(bp, CSEM_REG_FAST_MEMORY + ++ CSTORM_SB_HOST_STATUS_BLOCK_C_OFFSET(port, sb_id), 0, ++ CSTORM_SB_STATUS_BLOCK_C_SIZE / 4); + } + + static void bnx2x_init_sb(struct bnx2x *bp, struct host_status_block *sb, +@@ -4059,17 +4987,17 @@ + u_status_block); + sb->u_status_block.status_block_id = sb_id; + +- REG_WR(bp, BAR_USTRORM_INTMEM + +- USTORM_SB_HOST_SB_ADDR_OFFSET(port, sb_id), U64_LO(section)); +- REG_WR(bp, BAR_USTRORM_INTMEM + +- ((USTORM_SB_HOST_SB_ADDR_OFFSET(port, sb_id)) + 4), ++ REG_WR(bp, BAR_CSTRORM_INTMEM + ++ CSTORM_SB_HOST_SB_ADDR_U_OFFSET(port, sb_id), U64_LO(section)); ++ REG_WR(bp, BAR_CSTRORM_INTMEM + ++ ((CSTORM_SB_HOST_SB_ADDR_U_OFFSET(port, sb_id)) + 4), + U64_HI(section)); +- REG_WR8(bp, BAR_USTRORM_INTMEM + FP_USB_FUNC_OFF + +- USTORM_SB_HOST_STATUS_BLOCK_OFFSET(port, sb_id), func); ++ REG_WR8(bp, BAR_CSTRORM_INTMEM + FP_USB_FUNC_OFF + ++ CSTORM_SB_HOST_STATUS_BLOCK_U_OFFSET(port, sb_id), func); + + for (index = 0; index < HC_USTORM_SB_NUM_INDICES; index++) +- REG_WR16(bp, BAR_USTRORM_INTMEM + +- USTORM_SB_HC_DISABLE_OFFSET(port, sb_id, index), 1); ++ REG_WR16(bp, BAR_CSTRORM_INTMEM + ++ CSTORM_SB_HC_DISABLE_U_OFFSET(port, sb_id, index), 1); + + /* CSTORM */ + section = ((u64)mapping) + offsetof(struct host_status_block, +@@ -4077,16 +5005,16 @@ + sb->c_status_block.status_block_id = sb_id; + + REG_WR(bp, BAR_CSTRORM_INTMEM + +- CSTORM_SB_HOST_SB_ADDR_OFFSET(port, sb_id), U64_LO(section)); ++ CSTORM_SB_HOST_SB_ADDR_C_OFFSET(port, sb_id), U64_LO(section)); + REG_WR(bp, BAR_CSTRORM_INTMEM + +- ((CSTORM_SB_HOST_SB_ADDR_OFFSET(port, sb_id)) + 4), ++ ((CSTORM_SB_HOST_SB_ADDR_C_OFFSET(port, sb_id)) + 4), + U64_HI(section)); + REG_WR8(bp, BAR_CSTRORM_INTMEM + FP_CSB_FUNC_OFF + +- CSTORM_SB_HOST_STATUS_BLOCK_OFFSET(port, sb_id), func); ++ CSTORM_SB_HOST_STATUS_BLOCK_C_OFFSET(port, sb_id), func); + + for (index = 0; index < HC_CSTORM_SB_NUM_INDICES; index++) + REG_WR16(bp, BAR_CSTRORM_INTMEM + +- CSTORM_SB_HC_DISABLE_OFFSET(port, sb_id, index), 1); ++ CSTORM_SB_HC_DISABLE_C_OFFSET(port, sb_id, index), 1); + + bnx2x_ack_sb(bp, sb_id, CSTORM_ID, 0, IGU_INT_ENABLE, 0); + } +@@ -4095,18 +5023,18 @@ + { + int func = BP_FUNC(bp); + +- bnx2x_init_fill(bp, BAR_USTRORM_INTMEM + +- USTORM_DEF_SB_HOST_STATUS_BLOCK_OFFSET(func), 0, +- sizeof(struct ustorm_def_status_block)/4); +- bnx2x_init_fill(bp, BAR_CSTRORM_INTMEM + +- CSTORM_DEF_SB_HOST_STATUS_BLOCK_OFFSET(func), 0, +- sizeof(struct cstorm_def_status_block)/4); +- bnx2x_init_fill(bp, BAR_XSTRORM_INTMEM + ++ bnx2x_init_fill(bp, TSEM_REG_FAST_MEMORY + ++ TSTORM_DEF_SB_HOST_STATUS_BLOCK_OFFSET(func), 0, ++ sizeof(struct tstorm_def_status_block)/4); ++ bnx2x_init_fill(bp, CSEM_REG_FAST_MEMORY + ++ CSTORM_DEF_SB_HOST_STATUS_BLOCK_U_OFFSET(func), 0, ++ sizeof(struct cstorm_def_status_block_u)/4); ++ bnx2x_init_fill(bp, CSEM_REG_FAST_MEMORY + ++ CSTORM_DEF_SB_HOST_STATUS_BLOCK_C_OFFSET(func), 0, ++ sizeof(struct cstorm_def_status_block_c)/4); ++ bnx2x_init_fill(bp, XSEM_REG_FAST_MEMORY + + XSTORM_DEF_SB_HOST_STATUS_BLOCK_OFFSET(func), 0, + sizeof(struct xstorm_def_status_block)/4); +- bnx2x_init_fill(bp, BAR_TSTRORM_INTMEM + +- TSTORM_DEF_SB_HOST_STATUS_BLOCK_OFFSET(func), 0, +- sizeof(struct tstorm_def_status_block)/4); + } + + static void bnx2x_init_def_sb(struct bnx2x *bp, +@@ -4156,17 +5084,17 @@ + u_def_status_block); + def_sb->u_def_status_block.status_block_id = sb_id; + +- REG_WR(bp, BAR_USTRORM_INTMEM + +- USTORM_DEF_SB_HOST_SB_ADDR_OFFSET(func), U64_LO(section)); +- REG_WR(bp, BAR_USTRORM_INTMEM + +- ((USTORM_DEF_SB_HOST_SB_ADDR_OFFSET(func)) + 4), ++ REG_WR(bp, BAR_CSTRORM_INTMEM + ++ CSTORM_DEF_SB_HOST_SB_ADDR_U_OFFSET(func), U64_LO(section)); ++ REG_WR(bp, BAR_CSTRORM_INTMEM + ++ ((CSTORM_DEF_SB_HOST_SB_ADDR_U_OFFSET(func)) + 4), + U64_HI(section)); +- REG_WR8(bp, BAR_USTRORM_INTMEM + DEF_USB_FUNC_OFF + +- USTORM_DEF_SB_HOST_STATUS_BLOCK_OFFSET(func), func); ++ REG_WR8(bp, BAR_CSTRORM_INTMEM + DEF_USB_FUNC_OFF + ++ CSTORM_DEF_SB_HOST_STATUS_BLOCK_U_OFFSET(func), func); + + for (index = 0; index < HC_USTORM_DEF_SB_NUM_INDICES; index++) +- REG_WR16(bp, BAR_USTRORM_INTMEM + +- USTORM_DEF_SB_HC_DISABLE_OFFSET(func, index), 1); ++ REG_WR16(bp, BAR_CSTRORM_INTMEM + ++ CSTORM_DEF_SB_HC_DISABLE_U_OFFSET(func, index), 1); + + /* CSTORM */ + section = ((u64)mapping) + offsetof(struct host_def_status_block, +@@ -4174,16 +5102,16 @@ + def_sb->c_def_status_block.status_block_id = sb_id; + + REG_WR(bp, BAR_CSTRORM_INTMEM + +- CSTORM_DEF_SB_HOST_SB_ADDR_OFFSET(func), U64_LO(section)); ++ CSTORM_DEF_SB_HOST_SB_ADDR_C_OFFSET(func), U64_LO(section)); + REG_WR(bp, BAR_CSTRORM_INTMEM + +- ((CSTORM_DEF_SB_HOST_SB_ADDR_OFFSET(func)) + 4), ++ ((CSTORM_DEF_SB_HOST_SB_ADDR_C_OFFSET(func)) + 4), + U64_HI(section)); + REG_WR8(bp, BAR_CSTRORM_INTMEM + DEF_CSB_FUNC_OFF + +- CSTORM_DEF_SB_HOST_STATUS_BLOCK_OFFSET(func), func); ++ CSTORM_DEF_SB_HOST_STATUS_BLOCK_C_OFFSET(func), func); + + for (index = 0; index < HC_CSTORM_DEF_SB_NUM_INDICES; index++) + REG_WR16(bp, BAR_CSTRORM_INTMEM + +- CSTORM_DEF_SB_HC_DISABLE_OFFSET(func, index), 1); ++ CSTORM_DEF_SB_HC_DISABLE_C_OFFSET(func, index), 1); + + /* TSTORM */ + section = ((u64)mapping) + offsetof(struct host_def_status_block, +@@ -4234,27 +5162,23 @@ + int sb_id = bp->fp[i].sb_id; + + /* HC_INDEX_U_ETH_RX_CQ_CONS */ +- REG_WR8(bp, BAR_USTRORM_INTMEM + +- USTORM_SB_HC_TIMEOUT_OFFSET(port, sb_id, +- U_SB_ETH_RX_CQ_INDEX), ++ REG_WR8(bp, BAR_CSTRORM_INTMEM + ++ CSTORM_SB_HC_TIMEOUT_U_OFFSET(port, sb_id, ++ U_SB_ETH_RX_CQ_INDEX), + bp->rx_ticks/12); +- REG_WR16(bp, BAR_USTRORM_INTMEM + +- USTORM_SB_HC_DISABLE_OFFSET(port, sb_id, +- U_SB_ETH_RX_CQ_INDEX), +- bp->rx_ticks ? 0 : 1); +- REG_WR16(bp, BAR_USTRORM_INTMEM + +- USTORM_SB_HC_DISABLE_OFFSET(port, sb_id, +- U_SB_ETH_RX_BD_INDEX), ++ REG_WR16(bp, BAR_CSTRORM_INTMEM + ++ CSTORM_SB_HC_DISABLE_U_OFFSET(port, sb_id, ++ U_SB_ETH_RX_CQ_INDEX), + bp->rx_ticks ? 0 : 1); + + /* HC_INDEX_C_ETH_TX_CQ_CONS */ + REG_WR8(bp, BAR_CSTRORM_INTMEM + +- CSTORM_SB_HC_TIMEOUT_OFFSET(port, sb_id, +- C_SB_ETH_TX_CQ_INDEX), ++ CSTORM_SB_HC_TIMEOUT_C_OFFSET(port, sb_id, ++ C_SB_ETH_TX_CQ_INDEX), + bp->tx_ticks/12); + REG_WR16(bp, BAR_CSTRORM_INTMEM + +- CSTORM_SB_HC_DISABLE_OFFSET(port, sb_id, +- C_SB_ETH_TX_CQ_INDEX), ++ CSTORM_SB_HC_DISABLE_C_OFFSET(port, sb_id, ++ C_SB_ETH_TX_CQ_INDEX), + bp->tx_ticks ? 0 : 1); + } + } +@@ -4276,8 +5200,7 @@ + if (fp->tpa_state[i] == BNX2X_TPA_START) + pci_unmap_single(bp->pdev, + pci_unmap_addr(rx_buf, mapping), +- bp->rx_buf_size, +- PCI_DMA_FROMDEVICE); ++ bp->rx_buf_size, PCI_DMA_FROMDEVICE); + + dev_kfree_skb(skb); + rx_buf->skb = NULL; +@@ -4292,16 +5215,13 @@ + u16 ring_prod, cqe_ring_prod; + int i, j; + +- bp->rx_buf_size = bp->dev->mtu; +- bp->rx_buf_size += bp->rx_offset + ETH_OVREHEAD + +- BCM_RX_ETH_PAYLOAD_ALIGN; ++ bp->rx_buf_size = bp->dev->mtu + ETH_OVREHEAD + BNX2X_RX_ALIGN; ++ DP(NETIF_MSG_IFUP, ++ "mtu %d rx_buf_size %d\n", bp->dev->mtu, bp->rx_buf_size); + + if (bp->flags & TPA_ENABLE_FLAG) { +- DP(NETIF_MSG_IFUP, +- "rx_buf_size %d effective_mtu %d\n", +- bp->rx_buf_size, bp->dev->mtu + ETH_OVREHEAD); +- +- for_each_queue(bp, j) { ++ ++ for_each_rx_queue(bp, j) { + struct bnx2x_fastpath *fp = &bp->fp[j]; + + for (i = 0; i < max_agg_queues; i++) { +@@ -4324,13 +5244,19 @@ + } + } + +- for_each_queue(bp, j) { ++ for_each_rx_queue(bp, j) { + struct bnx2x_fastpath *fp = &bp->fp[j]; + + fp->rx_bd_cons = 0; + fp->rx_cons_sb = BNX2X_RX_SB_INDEX; + fp->rx_bd_cons_sb = BNX2X_RX_SB_BD_INDEX; + ++ /* Mark queue as Rx */ ++ fp->is_rx_queue = 1; ++ ++#if defined(__NO_TPA__) ++ fp->disable_tpa = 1; ++#else /* BNX2X_UPSTREAM */ + /* "next page" elements initialization */ + /* SGE ring */ + for (i = 1; i <= NUM_RX_SGE_PAGES; i++) { +@@ -4346,6 +5272,7 @@ + } + + bnx2x_init_sge_ring_bit_mask(fp); ++#endif + + /* RX BD ring */ + for (i = 1; i <= NUM_RX_RINGS; i++) { +@@ -4374,6 +5301,7 @@ + BCM_PAGE_SIZE*(i % NUM_RCQ_RINGS))); + } + ++#if !defined(__NO_TPA__) /* BNX2X_UPSTREAM */ + /* Allocate SGEs and initialize the ring elements */ + for (i = 0, ring_prod = 0; + i < MAX_RX_SGE_CNT*NUM_RX_SGE_PAGES; i++) { +@@ -4392,6 +5320,7 @@ + ring_prod = NEXT_SGE_IDX(ring_prod); + } + fp->rx_sge_prod = ring_prod; ++#endif + + /* Allocate BDs and initialize BD ring */ + fp->rx_comp_cons = 0; +@@ -4399,8 +5328,8 @@ + for (i = 0; i < bp->rx_ring_size; i++) { + if (bnx2x_alloc_rx_skb(bp, fp, ring_prod) < 0) { + BNX2X_ERR("was only able to allocate " +- "%d rx skbs\n", i); +- bp->eth_stats.rx_skb_alloc_failed++; ++ "%d rx skbs on queue[%d]\n", i, j); ++ fp->eth_q_stats.rx_skb_alloc_failed++; + break; + } + ring_prod = NEXT_RX_IDX(ring_prod); +@@ -4436,20 +5365,24 @@ + { + int i, j; + +- for_each_queue(bp, j) { ++ for_each_tx_queue(bp, j) { + struct bnx2x_fastpath *fp = &bp->fp[j]; + + for (i = 1; i <= NUM_TX_RINGS; i++) { +- struct eth_tx_bd *tx_bd = +- &fp->tx_desc_ring[TX_DESC_CNT * i - 1]; +- +- tx_bd->addr_hi = ++ struct eth_tx_next_bd *tx_next_bd = ++ &fp->tx_desc_ring[TX_DESC_CNT * i - 1].next_bd; ++ ++ tx_next_bd->addr_hi = + cpu_to_le32(U64_HI(fp->tx_desc_mapping + + BCM_PAGE_SIZE*(i % NUM_TX_RINGS))); +- tx_bd->addr_lo = ++ tx_next_bd->addr_lo = + cpu_to_le32(U64_LO(fp->tx_desc_mapping + + BCM_PAGE_SIZE*(i % NUM_TX_RINGS))); + } ++ ++ fp->tx_db.data.header.header = DOORBELL_HDR_DB_TYPE; ++ fp->tx_db.data.zero_fill1 = 0; ++ fp->tx_db.data.prod = 0; + + fp->tx_pkt_prod = 0; + fp->tx_pkt_cons = 0; +@@ -4458,6 +5391,10 @@ + fp->tx_cons_sb = BNX2X_TX_SB_INDEX; + fp->tx_pkt = 0; + } ++ ++ /* clean tx statistics */ ++ for_each_rx_queue(bp, i) ++ bnx2x_fp(bp, i, tx_pkt) = 0; + } + + static void bnx2x_init_sp_ring(struct bnx2x *bp) +@@ -4486,30 +5423,22 @@ + { + int i; + +- for_each_queue(bp, i) { ++ for_each_rx_queue(bp, i) { + struct eth_context *context = bnx2x_sp(bp, context[i].eth); + struct bnx2x_fastpath *fp = &bp->fp[i]; +- u8 sb_id = FP_SB_ID(fp); +- +- context->xstorm_st_context.tx_bd_page_base_hi = +- U64_HI(fp->tx_desc_mapping); +- context->xstorm_st_context.tx_bd_page_base_lo = +- U64_LO(fp->tx_desc_mapping); +- context->xstorm_st_context.db_data_addr_hi = +- U64_HI(fp->tx_prods_mapping); +- context->xstorm_st_context.db_data_addr_lo = +- U64_LO(fp->tx_prods_mapping); +- context->xstorm_st_context.statistics_data = (BP_CL_ID(bp) | +- XSTORM_ETH_ST_CONTEXT_STATISTICS_ENABLE); ++ u8 cl_id = fp->cl_id; + + context->ustorm_st_context.common.sb_index_numbers = + BNX2X_RX_SB_INDEX_NUM; +- context->ustorm_st_context.common.clientId = FP_CL_ID(fp); +- context->ustorm_st_context.common.status_block_id = sb_id; ++ context->ustorm_st_context.common.clientId = cl_id; ++ context->ustorm_st_context.common.status_block_id = fp->sb_id; + context->ustorm_st_context.common.flags = +- USTORM_ETH_ST_CONTEXT_CONFIG_ENABLE_MC_ALIGNMENT; +- context->ustorm_st_context.common.mc_alignment_size = +- BCM_RX_ETH_PAYLOAD_ALIGN; ++ (USTORM_ETH_ST_CONTEXT_CONFIG_ENABLE_MC_ALIGNMENT | ++ USTORM_ETH_ST_CONTEXT_CONFIG_ENABLE_STATISTICS); ++ context->ustorm_st_context.common.statistics_counter_id = ++ cl_id; ++ context->ustorm_st_context.common.mc_alignment_log_size = ++ BNX2X_RX_ALIGN_SHIFT; + context->ustorm_st_context.common.bd_buff_size = + bp->rx_buf_size; + context->ustorm_st_context.common.bd_page_base_hi = +@@ -4518,44 +5447,98 @@ + U64_LO(fp->rx_desc_mapping); + if (!fp->disable_tpa) { + context->ustorm_st_context.common.flags |= +- (USTORM_ETH_ST_CONTEXT_CONFIG_ENABLE_TPA | +- USTORM_ETH_ST_CONTEXT_CONFIG_ENABLE_SGE_RING); ++ USTORM_ETH_ST_CONTEXT_CONFIG_ENABLE_TPA; + context->ustorm_st_context.common.sge_buff_size = +- (u16)(BCM_PAGE_SIZE*PAGES_PER_SGE); ++ (u16)min((u32)SGE_PAGE_SIZE*PAGES_PER_SGE, ++ (u32)0xffff); + context->ustorm_st_context.common.sge_page_base_hi = + U64_HI(fp->rx_sge_mapping); + context->ustorm_st_context.common.sge_page_base_lo = + U64_LO(fp->rx_sge_mapping); +- } +- +- context->cstorm_st_context.sb_index_number = +- C_SB_ETH_TX_CQ_INDEX; +- context->cstorm_st_context.status_block_id = sb_id; +- ++ ++ context->ustorm_st_context.common.max_sges_for_packet = ++ SGE_PAGE_ALIGN(bp->dev->mtu) >> SGE_PAGE_SHIFT; ++ context->ustorm_st_context.common.max_sges_for_packet = ++ ((context->ustorm_st_context.common. ++ max_sges_for_packet + PAGES_PER_SGE - 1) & ++ (~(PAGES_PER_SGE - 1))) >> PAGES_PER_SGE_SHIFT; ++ } ++ ++ context->ustorm_ag_context.cdu_usage = ++ CDU_RSRVD_VALUE_TYPE_A(HW_CID(bp, i), ++ CDU_REGION_NUMBER_UCM_AG, ++ ETH_CONNECTION_TYPE); ++ ++#ifdef BNX2X_SAFC /* ! BNX2X_UPSTREAM */ ++ switch (bp->multi_mode) { ++ case ETH_RSS_MODE_DISABLED: ++ case ETH_RSS_MODE_REGULAR: ++ break; ++ ++ case ETH_RSS_MODE_VLAN_PRI: ++ case ETH_RSS_MODE_E1HOV_PRI: ++ case ETH_RSS_MODE_IP_DSCP: ++ context->xstorm_st_context.safc_group_en = 1; ++ context->xstorm_st_context.safc_group_num = fp->cos; ++ break; ++ ++ default: ++ break; ++ } ++#endif + context->xstorm_ag_context.cdu_reserved = + CDU_RSRVD_VALUE_TYPE_A(HW_CID(bp, i), + CDU_REGION_NUMBER_XCM_AG, + ETH_CONNECTION_TYPE); +- context->ustorm_ag_context.cdu_usage = +- CDU_RSRVD_VALUE_TYPE_A(HW_CID(bp, i), +- CDU_REGION_NUMBER_UCM_AG, +- ETH_CONNECTION_TYPE); ++ } ++ ++ for_each_tx_queue(bp, i) { ++ struct bnx2x_fastpath *fp = &bp->fp[i]; ++ struct eth_context *context = ++ bnx2x_sp(bp, context[i - bp->num_rx_queues].eth); ++ ++ context->cstorm_st_context.sb_index_number = ++ C_SB_ETH_TX_CQ_INDEX; ++ context->cstorm_st_context.status_block_id = fp->sb_id; ++ ++ context->xstorm_st_context.tx_bd_page_base_hi = ++ U64_HI(fp->tx_desc_mapping); ++ context->xstorm_st_context.tx_bd_page_base_lo = ++ U64_LO(fp->tx_desc_mapping); ++ context->xstorm_st_context.statistics_data = (fp->cl_id | ++ XSTORM_ETH_ST_CONTEXT_STATISTICS_ENABLE); + } + } + + static void bnx2x_init_ind_table(struct bnx2x *bp) + { + int func = BP_FUNC(bp); +- int i; +- +- if (!is_multi(bp)) +- return; +- +- DP(NETIF_MSG_IFUP, "Initializing indirection table\n"); ++#ifdef BNX2X_SAFC ++ int i, cos; ++ u8 val; ++#else /* BNX2X_UPSTREAM */ ++ int i; ++#endif ++ ++ if (bp->multi_mode == ETH_RSS_MODE_DISABLED) ++ return; ++ ++ DP(NETIF_MSG_IFUP, ++ "Initializing indirection table multi_mode %d\n", bp->multi_mode); ++#ifdef BNX2X_SAFC ++ for (i = 0; i < TSTORM_INDIRECTION_TABLE_SIZE; i++) { ++ cos = bp->pri_map[i / BNX2X_MAX_ENTRIES_PER_PRI]; ++ val = bp->fp->cl_id + bp->cos_map[cos] + ++ (i % bp->qs_per_cos[cos]); ++ REG_WR8(bp, BAR_TSTRORM_INTMEM + ++ TSTORM_INDIRECTION_TABLE_OFFSET(func) + i, val); ++ } ++#else /* BNX2X_UPSTREAM */ + for (i = 0; i < TSTORM_INDIRECTION_TABLE_SIZE; i++) + REG_WR8(bp, BAR_TSTRORM_INTMEM + + TSTORM_INDIRECTION_TABLE_OFFSET(func) + i, +- BP_CL_ID(bp) + (i % bp->num_queues)); ++ bp->fp->cl_id + (i % bp->num_rx_queues)); ++#endif + } + + static void bnx2x_set_client_config(struct bnx2x *bp) +@@ -4565,30 +5548,20 @@ + int i; + + tstorm_client.mtu = bp->dev->mtu; +- tstorm_client.statistics_counter_id = BP_CL_ID(bp); + tstorm_client.config_flags = +- TSTORM_ETH_CLIENT_CONFIG_STATSITICS_ENABLE; ++ (TSTORM_ETH_CLIENT_CONFIG_STATSITICS_ENABLE | ++ TSTORM_ETH_CLIENT_CONFIG_E1HOV_REM_ENABLE); + #ifdef BCM_VLAN + if (bp->rx_mode && bp->vlgrp && (bp->flags & HW_VLAN_RX_FLAG)) { + tstorm_client.config_flags |= +- TSTORM_ETH_CLIENT_CONFIG_VLAN_REMOVAL_ENABLE; ++ TSTORM_ETH_CLIENT_CONFIG_VLAN_REM_ENABLE; + DP(NETIF_MSG_IFUP, "vlan removal enabled\n"); + } + #endif + +- if (bp->flags & TPA_ENABLE_FLAG) { +- tstorm_client.max_sges_for_packet = +- SGE_PAGE_ALIGN(tstorm_client.mtu) >> SGE_PAGE_SHIFT; +- tstorm_client.max_sges_for_packet = +- ((tstorm_client.max_sges_for_packet + +- PAGES_PER_SGE - 1) & (~(PAGES_PER_SGE - 1))) >> +- PAGES_PER_SGE_SHIFT; +- +- tstorm_client.config_flags |= +- TSTORM_ETH_CLIENT_CONFIG_ENABLE_SGE_RING; +- } +- + for_each_queue(bp, i) { ++ tstorm_client.statistics_counter_id = bp->fp[i].cl_id; ++ + REG_WR(bp, BAR_TSTRORM_INTMEM + + TSTORM_CLIENT_CONFIG_OFFSET(port, bp->fp[i].cl_id), + ((u32 *)&tstorm_client)[0]); +@@ -4617,18 +5590,22 @@ + tstorm_mac_filter.mcast_drop_all = mask; + tstorm_mac_filter.bcast_drop_all = mask; + break; ++ + case BNX2X_RX_MODE_NORMAL: + tstorm_mac_filter.bcast_accept_all = mask; + break; ++ + case BNX2X_RX_MODE_ALLMULTI: + tstorm_mac_filter.mcast_accept_all = mask; + tstorm_mac_filter.bcast_accept_all = mask; + break; ++ + case BNX2X_RX_MODE_PROMISC: + tstorm_mac_filter.ucast_accept_all = mask; + tstorm_mac_filter.mcast_accept_all = mask; + tstorm_mac_filter.bcast_accept_all = mask; + break; ++ + default: + BNX2X_ERR("BAD rx mode (%d)\n", mode); + break; +@@ -4650,31 +5627,33 @@ + static void bnx2x_init_internal_common(struct bnx2x *bp) + { + int i; +- +- if (bp->flags & TPA_ENABLE_FLAG) { +- struct tstorm_eth_tpa_exist tpa = {0}; +- +- tpa.tpa_exist = 1; +- +- REG_WR(bp, BAR_TSTRORM_INTMEM + TSTORM_TPA_EXIST_OFFSET, +- ((u32 *)&tpa)[0]); +- REG_WR(bp, BAR_TSTRORM_INTMEM + TSTORM_TPA_EXIST_OFFSET + 4, +- ((u32 *)&tpa)[1]); +- } + + /* Zero this manually as its initialization is + currently missing in the initTool */ + for (i = 0; i < (USTORM_AGG_DATA_SIZE >> 2); i++) + REG_WR(bp, BAR_USTRORM_INTMEM + + USTORM_AGG_DATA_OFFSET + i * 4, 0); ++ ++#ifdef BNX2X_SAFC /* ! BNX2X_UPSTREAM */ ++ if (bp->flags & SAFC_TX_FLAG) { ++ REG_WR(bp, BAR_TSTRORM_INTMEM + ++ TSTORM_COMMON_SAFC_WORKAROUND_ENABLE_OFFSET, 1); ++ REG_WR(bp, BAR_TSTRORM_INTMEM + ++ TSTORM_COMMON_SAFC_WORKAROUND_TIMEOUT_10USEC_OFFSET, 10); ++ REG_WR(bp, MISC_REG_SW_TIMER_VAL + 0xc, 10); ++ REG_WR(bp, MISC_REG_SW_TIMER_RELOAD_VAL_4, 10); ++ } ++#endif + } + + static void bnx2x_init_internal_port(struct bnx2x *bp) + { + int port = BP_PORT(bp); + +- REG_WR(bp, BAR_USTRORM_INTMEM + USTORM_HC_BTR_OFFSET(port), BNX2X_BTR); +- REG_WR(bp, BAR_CSTRORM_INTMEM + CSTORM_HC_BTR_OFFSET(port), BNX2X_BTR); ++ REG_WR(bp, ++ BAR_CSTRORM_INTMEM + CSTORM_HC_BTR_U_OFFSET(port), BNX2X_BTR); ++ REG_WR(bp, ++ BAR_CSTRORM_INTMEM + CSTORM_HC_BTR_C_OFFSET(port), BNX2X_BTR); + REG_WR(bp, BAR_TSTRORM_INTMEM + TSTORM_HC_BTR_OFFSET(port), BNX2X_BTR); + REG_WR(bp, BAR_XSTRORM_INTMEM + XSTORM_HC_BTR_OFFSET(port), BNX2X_BTR); + } +@@ -4685,13 +5664,29 @@ + struct stats_indication_flags stats_flags = {0}; + int port = BP_PORT(bp); + int func = BP_FUNC(bp); +- int i; ++ int i, j; ++ u32 offset; + u16 max_agg_size; + + if (is_multi(bp)) { +- tstorm_config.config_flags = MULTI_FLAGS; ++#if defined(__VMKLNX__) && defined(__VMKNETDDI_QUEUEOPS__) ++ /* enable queue 0 as the default queue */ ++ tstorm_config.config_flags = ++ TSTORM_ETH_FUNCTION_COMMON_CONFIG_DEFAULT_ENABLE; ++#else /* BNX2X_UPSTREAM */ ++ tstorm_config.config_flags = MULTI_FLAGS(bp); + tstorm_config.rss_result_mask = MULTI_MASK; +- } ++#endif ++ } ++ ++ /* Enable TPA if needed */ ++ if (bp->flags & TPA_ENABLE_FLAG) ++ tstorm_config.config_flags |= ++ TSTORM_ETH_FUNCTION_COMMON_CONFIG_ENABLE_TPA; ++ ++ if (IS_E1HMF(bp)) ++ tstorm_config.config_flags |= ++ TSTORM_ETH_FUNCTION_COMMON_CONFIG_E1HOV_IN_CAM; + + tstorm_config.leading_client_id = BP_L_ID(bp); + +@@ -4702,17 +5697,29 @@ + bp->rx_mode = BNX2X_RX_MODE_NONE; /* no rx until link is up */ + bnx2x_set_storm_rx_mode(bp); + +- /* reset xstorm per client statistics */ +- for (i = 0; i < sizeof(struct xstorm_per_client_stats) / 4; i++) { +- REG_WR(bp, BAR_XSTRORM_INTMEM + +- XSTORM_PER_COUNTER_ID_STATS_OFFSET(port, BP_CL_ID(bp)) + +- i*4, 0); +- } +- /* reset tstorm per client statistics */ +- for (i = 0; i < sizeof(struct tstorm_per_client_stats) / 4; i++) { +- REG_WR(bp, BAR_TSTRORM_INTMEM + +- TSTORM_PER_COUNTER_ID_STATS_OFFSET(port, BP_CL_ID(bp)) + +- i*4, 0); ++ for_each_queue(bp, i) { ++ u8 cl_id = bp->fp[i].cl_id; ++ ++ /* reset xstorm per client statistics */ ++ offset = BAR_XSTRORM_INTMEM + ++ XSTORM_PER_COUNTER_ID_STATS_OFFSET(port, cl_id); ++ for (j = 0; ++ j < sizeof(struct xstorm_per_client_stats) / 4; j++) ++ REG_WR(bp, offset + j*4, 0); ++ ++ /* reset tstorm per client statistics */ ++ offset = BAR_TSTRORM_INTMEM + ++ TSTORM_PER_COUNTER_ID_STATS_OFFSET(port, cl_id); ++ for (j = 0; ++ j < sizeof(struct tstorm_per_client_stats) / 4; j++) ++ REG_WR(bp, offset + j*4, 0); ++ ++ /* reset ustorm per client statistics */ ++ offset = BAR_USTRORM_INTMEM + ++ USTORM_PER_COUNTER_ID_STATS_OFFSET(port, cl_id); ++ for (j = 0; ++ j < sizeof(struct ustorm_per_client_stats) / 4; j++) ++ REG_WR(bp, offset + j*4, 0); + } + + /* Init statistics related context */ +@@ -4726,6 +5733,11 @@ + REG_WR(bp, BAR_TSTRORM_INTMEM + TSTORM_STATS_FLAGS_OFFSET(func), + ((u32 *)&stats_flags)[0]); + REG_WR(bp, BAR_TSTRORM_INTMEM + TSTORM_STATS_FLAGS_OFFSET(func) + 4, ++ ((u32 *)&stats_flags)[1]); ++ ++ REG_WR(bp, BAR_USTRORM_INTMEM + USTORM_STATS_FLAGS_OFFSET(func), ++ ((u32 *)&stats_flags)[0]); ++ REG_WR(bp, BAR_USTRORM_INTMEM + USTORM_STATS_FLAGS_OFFSET(func) + 4, + ((u32 *)&stats_flags)[1]); + + REG_WR(bp, BAR_CSTRORM_INTMEM + CSTORM_STATS_FLAGS_OFFSET(func), +@@ -4745,6 +5757,13 @@ + U64_LO(bnx2x_sp_mapping(bp, fw_stats))); + REG_WR(bp, BAR_TSTRORM_INTMEM + + TSTORM_ETH_STATS_QUERY_ADDR_OFFSET(func) + 4, ++ U64_HI(bnx2x_sp_mapping(bp, fw_stats))); ++ ++ REG_WR(bp, BAR_USTRORM_INTMEM + ++ USTORM_ETH_STATS_QUERY_ADDR_OFFSET(func), ++ U64_LO(bnx2x_sp_mapping(bp, fw_stats))); ++ REG_WR(bp, BAR_USTRORM_INTMEM + ++ USTORM_ETH_STATS_QUERY_ADDR_OFFSET(func) + 4, + U64_HI(bnx2x_sp_mapping(bp, fw_stats))); + + if (CHIP_IS_E1H(bp)) { +@@ -4766,20 +5785,143 @@ + min((u32)(min((u32)8, (u32)MAX_SKB_FRAGS) * + SGE_PAGE_SIZE * PAGES_PER_SGE), + (u32)0xffff); +- for_each_queue(bp, i) { ++ for_each_rx_queue(bp, i) { + struct bnx2x_fastpath *fp = &bp->fp[i]; + + REG_WR(bp, BAR_USTRORM_INTMEM + +- USTORM_CQE_PAGE_BASE_OFFSET(port, FP_CL_ID(fp)), ++ USTORM_CQE_PAGE_BASE_OFFSET(port, fp->cl_id), + U64_LO(fp->rx_comp_mapping)); + REG_WR(bp, BAR_USTRORM_INTMEM + +- USTORM_CQE_PAGE_BASE_OFFSET(port, FP_CL_ID(fp)) + 4, ++ USTORM_CQE_PAGE_BASE_OFFSET(port, fp->cl_id) + 4, + U64_HI(fp->rx_comp_mapping)); + ++ /* Next page */ ++ REG_WR(bp, BAR_USTRORM_INTMEM + ++ USTORM_CQE_PAGE_NEXT_OFFSET(port, fp->cl_id), ++ U64_LO(fp->rx_comp_mapping + BCM_PAGE_SIZE)); ++ REG_WR(bp, BAR_USTRORM_INTMEM + ++ USTORM_CQE_PAGE_NEXT_OFFSET(port, fp->cl_id) + 4, ++ U64_HI(fp->rx_comp_mapping + BCM_PAGE_SIZE)); ++ + REG_WR16(bp, BAR_USTRORM_INTMEM + +- USTORM_MAX_AGG_SIZE_OFFSET(port, FP_CL_ID(fp)), ++ USTORM_MAX_AGG_SIZE_OFFSET(port, fp->cl_id), + max_agg_size); + } ++ ++ /* dropless flow control */ ++ if (CHIP_IS_E1H(bp)) { ++ struct ustorm_eth_rx_pause_data_e1h rx_pause = {0}; ++ ++ rx_pause.bd_thr_low = 250; ++ rx_pause.cqe_thr_low = 250; ++ rx_pause.cos = 1; ++ rx_pause.sge_thr_low = 0; ++ rx_pause.bd_thr_high = 350; ++ rx_pause.cqe_thr_high = 350; ++ rx_pause.sge_thr_high = 0; ++ ++ for_each_rx_queue(bp, i) { ++ struct bnx2x_fastpath *fp = &bp->fp[i]; ++ ++ if (!fp->disable_tpa) { ++ rx_pause.sge_thr_low = 150; ++ rx_pause.sge_thr_high = 250; ++ } ++ ++#ifdef BNX2X_SAFC /* ! BNX2X_UPSTREAM */ ++ if (bp->flags & SAFC_TX_FLAG) { ++ rx_pause.cos = 0; ++ for (j = 0; j < BNX2X_MAX_PRIORITY; j++) ++ if (bp->pri_map[j] == fp->cos) ++ rx_pause.cos |= (1 << j); ++ } ++#endif ++ ++ offset = BAR_USTRORM_INTMEM + ++ USTORM_ETH_RING_PAUSE_DATA_OFFSET(port, ++ fp->cl_id); ++ for (j = 0; ++ j < sizeof(struct ustorm_eth_rx_pause_data_e1h)/4; ++ j++) ++ REG_WR(bp, offset + j*4, ++ ((u32 *)&rx_pause)[j]); ++ } ++ } ++ ++ memset(&(bp->cmng), 0, sizeof(struct cmng_struct_per_port)); ++ ++ /* Init rate shaping and fairness contexts */ ++ if (IS_E1HMF(bp)) { ++ int vn; ++ ++ /* During init there is no active link ++ Until link is up, set link rate to 10Gbps */ ++ bp->link_vars.line_speed = SPEED_10000; ++ bnx2x_init_port_minmax(bp); ++ ++ bnx2x_calc_vn_weight_sum(bp); ++ ++ for (vn = VN_0; vn < E1HVN_MAX; vn++) ++ bnx2x_init_vn_minmax(bp, 2*vn + port); ++ ++ /* Enable rate shaping and fairness */ ++ bp->cmng.flags.cmng_enables = ++ CMNG_FLAGS_PER_PORT_RATE_SHAPING_VN; ++ if (bp->vn_weight_sum) ++ bp->cmng.flags.cmng_enables |= ++ CMNG_FLAGS_PER_PORT_FAIRNESS_VN; ++ else ++ DP(NETIF_MSG_IFUP, "All MIN values are zeroes" ++ " fairness will be disabled\n"); ++ } else { ++#ifdef BNX2X_SAFC ++ if (bp->cos_weight_sum) { ++ /* During init there is no active link ++ Until link is up, set link rate to 10Gbps */ ++ bp->link_vars.line_speed = SPEED_10000; ++ bnx2x_init_port_minmax(bp); ++ ++ bnx2x_init_cos_credit(bp); ++ ++ /* Enable fairness */ ++ bp->cmng.flags.cmng_enables = ++ CMNG_FLAGS_PER_PORT_FAIRNESS_COS; ++ } else ++ DP(NETIF_MSG_IFUP, "All MIN values are zeroes" ++ " fairness will be disabled\n"); ++#else /* BNX2X_UPSTREAM */ ++ /* rate shaping and fairness are disabled */ ++ DP(NETIF_MSG_IFUP, ++ "single function mode minmax will be disabled\n"); ++#endif ++ } ++ ++#ifdef BNX2X_SAFC /* ! BNX2X_UPSTREAM */ ++ switch (bp->multi_mode) { ++ case ETH_RSS_MODE_DISABLED: ++ case ETH_RSS_MODE_REGULAR: ++ break; ++ ++ case ETH_RSS_MODE_VLAN_PRI: ++ case ETH_RSS_MODE_E1HOV_PRI: ++ case ETH_RSS_MODE_IP_DSCP: ++ bp->cmng.safc_vars.safc_timeout_usec = 200; ++ for (i = 0; i < BNX2X_MAX_PRIORITY; i++) ++ bp->cmng.safc_vars.cos_to_pause_mask[i] = ++ (1 << bp->pri_map[i]); ++ break; ++ ++ default: ++ break; ++ } ++#endif ++ ++ /* Store it to internal memory */ ++ if (bp->port.pmf) ++ for (i = 0; i < sizeof(struct cmng_struct_per_port) / 4; i++) ++ REG_WR(bp, BAR_XSTRORM_INTMEM + ++ XSTORM_CMNG_PER_PORT_VARS_OFFSET(port) + i * 4, ++ ((u32 *)(&bp->cmng))[i]); + } + + static void bnx2x_init_internal(struct bnx2x *bp, u32 load_code) +@@ -4806,6 +5948,9 @@ + static void bnx2x_nic_init(struct bnx2x *bp, u32 load_code) + { + int i; ++#ifdef BNX2X_SAFC /* ! BNX2X_UPSTREAM */ ++ int cos, num_queues; ++#endif + + for_each_queue(bp, i) { + struct bnx2x_fastpath *fp = &bp->fp[i]; +@@ -4814,14 +5959,51 @@ + fp->state = BNX2X_FP_STATE_CLOSED; + fp->index = i; + fp->cl_id = BP_L_ID(bp) + i; ++#ifdef BCM_CNIC ++ fp->sb_id = fp->cl_id + 1; ++#else/* BNX2X_UPSTREAM */ + fp->sb_id = fp->cl_id; ++#endif ++ /* Suitable Rx and Tx SBs are served by the same client */ ++ if (i >= bp->num_rx_queues) ++ fp->cl_id -= bp->num_rx_queues; ++#ifdef BNX2X_SAFC ++ num_queues = 0; ++ for (cos = 0; cos < BNX2X_MAX_COS; cos++) { ++ if (i < (num_queues + bp->qs_per_cos[cos])) { ++ fp->cos = cos; ++ break; ++ } else ++ num_queues += bp->qs_per_cos[cos]; ++ } ++ DP(NETIF_MSG_IFUP, "queue[%d]: bnx2x_init_sb(%p,%p) " ++ "cl_id %d sb %d cos %d\n", ++ i, bp, fp->status_blk, fp->cl_id, fp->sb_id, fp->cos); ++#else /* BNX2X_UPSTREAM */ + DP(NETIF_MSG_IFUP, +- "bnx2x_init_sb(%p,%p) index %d cl_id %d sb %d\n", +- bp, fp->status_blk, i, FP_CL_ID(fp), FP_SB_ID(fp)); ++ "queue[%d]: bnx2x_init_sb(%p,%p) cl_id %d sb %d\n", ++ i, bp, fp->status_blk, fp->cl_id, fp->sb_id); ++#endif + bnx2x_init_sb(bp, fp->status_blk, fp->status_blk_mapping, +- FP_SB_ID(fp)); ++ fp->sb_id); + bnx2x_update_fpsb_idx(fp); + } ++ ++ /* ensure status block indices were read */ ++ rmb(); ++ ++#ifdef BNX2X_SAFC /* ! BNX2X_UPSTREAM */ ++ for (cos = 0; cos < BNX2X_MAX_COS; cos++) { ++ bp->cos_map[cos] = 0; ++ for_each_queue(bp, i) { ++ /* take the 1st queue that belongs to this cos */ ++ if (bp->fp[i].cos == cos) { ++ bp->cos_map[cos] = i; ++ break; ++ } ++ } ++ } ++#endif + + bnx2x_init_def_sb(bp, bp->def_status_blk, bp->def_status_blk_mapping, + DEF_SB_ID); +@@ -4898,13 +6080,15 @@ + } + } + +-static int bnx2x_gunzip(struct bnx2x *bp, u8 *zbuf, int len) ++static int bnx2x_gunzip(struct bnx2x *bp, const u8 *zbuf, int len) + { + int n, rc; + + /* check gzip header */ +- if ((zbuf[0] != 0x1f) || (zbuf[1] != 0x8b) || (zbuf[2] != Z_DEFLATED)) +- return -EINVAL; ++ if ((zbuf[0] != 0x1f) || (zbuf[1] != 0x8b) || (zbuf[2] != Z_DEFLATED)) { ++ BNX2X_ERR("Bad gzip header\n"); ++ return -EINVAL; ++ } + + n = 10; + +@@ -4913,7 +6097,7 @@ + if (zbuf[3] & FNAME) + while ((zbuf[n++] != 0) && (n < len)); + +- bp->strm->next_in = zbuf + n; ++ bp->strm->next_in = (typeof(bp->strm->next_in))zbuf + n; + bp->strm->avail_in = len - n; + bp->strm->next_out = bp->gunzip_buf; + bp->strm->avail_out = FW_BUF_SIZE; +@@ -5035,8 +6219,8 @@ + msleep(50); + REG_WR(bp, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_1_SET, 0x03); + msleep(50); +- bnx2x_init_block(bp, BRB1_COMMON_START, BRB1_COMMON_END); +- bnx2x_init_block(bp, PRS_COMMON_START, PRS_COMMON_END); ++ bnx2x_init_block(bp, BRB1_BLOCK, COMMON_STAGE); ++ bnx2x_init_block(bp, PRS_BLOCK, COMMON_STAGE); + + DP(NETIF_MSG_HW, "part2\n"); + +@@ -5100,9 +6284,9 @@ + msleep(50); + REG_WR(bp, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_1_SET, 0x03); + msleep(50); +- bnx2x_init_block(bp, BRB1_COMMON_START, BRB1_COMMON_END); +- bnx2x_init_block(bp, PRS_COMMON_START, PRS_COMMON_END); +-#ifndef BCM_ISCSI ++ bnx2x_init_block(bp, BRB1_BLOCK, COMMON_STAGE); ++ bnx2x_init_block(bp, PRS_BLOCK, COMMON_STAGE); ++#ifndef BCM_CNIC /* BNX2X_UPSTREAM */ + /* set NIC mode */ + REG_WR(bp, PRS_REG_NIC_MODE, 1); + #endif +@@ -5157,6 +6341,39 @@ + REG_WR(bp, PBF_REG_PBF_INT_MASK, 0X18); /* bit 3,4 masked */ + } + ++#ifdef BNX2X_EXTRA_DEBUG /* ! BNX2X_UPSTREAM */ ++static void enable_blocks_parity(struct bnx2x *bp) ++{ ++ REG_WR(bp, PXP_REG_PXP_PRTY_MASK, 0x80000); /* bit 19 masked */ ++ REG_WR(bp, PXP2_REG_PXP2_PRTY_MASK_0, 0xfff40020);/* bit 5,18,20-31 */ ++ REG_WR(bp, PXP2_REG_PXP2_PRTY_MASK_1, 0x20); /* bit 5 */ ++ REG_WR(bp, QM_REG_QM_PRTY_MASK, 0x0); ++ REG_WR(bp, DORQ_REG_DORQ_PRTY_MASK, 0x0); ++ REG_WR(bp, GRCBASE_UPB + PB_REG_PB_PRTY_MASK, 0x0); ++ REG_WR(bp, GRCBASE_XPB + PB_REG_PB_PRTY_MASK, 0x0); ++ REG_WR(bp, SRC_REG_SRC_PRTY_MASK, 0x4); /* bit 2 */ ++ REG_WR(bp, CDU_REG_CDU_PRTY_MASK, 0x0); ++ REG_WR(bp, CFC_REG_CFC_PRTY_MASK, 0x0); ++ REG_WR(bp, HC_REG_HC_PRTY_MASK, 0x0); ++ REG_WR(bp, MISC_REG_MISC_PRTY_MASK, 0x0); ++ REG_WR(bp, DBG_REG_DBG_PRTY_MASK, 0x0); ++ REG_WR(bp, DMAE_REG_DMAE_PRTY_MASK, 0x0); ++ REG_WR(bp, BRB1_REG_BRB1_PRTY_MASK, 0x0); ++ REG_WR(bp, PRS_REG_PRS_PRTY_MASK, (1<<6)); /* bit 6 */ ++ REG_WR(bp, TSDM_REG_TSDM_PRTY_MASK, 0x8); /* bit 3 */ ++ REG_WR(bp, CSDM_REG_CSDM_PRTY_MASK, 0x8); /* bit 3 */ ++ REG_WR(bp, USDM_REG_USDM_PRTY_MASK, 0x28); /* bit 3,5 */ ++ REG_WR(bp, XSDM_REG_XSDM_PRTY_MASK, 0x8); /* bit 3 */ ++ REG_WR(bp, TSEM_REG_TSEM_PRTY_MASK_0, 0x0); ++ REG_WR(bp, TSEM_REG_TSEM_PRTY_MASK_1, 0x0); ++ REG_WR(bp, USEM_REG_USEM_PRTY_MASK_0, 0x0); ++ REG_WR(bp, USEM_REG_USEM_PRTY_MASK_1, 0x0); ++ REG_WR(bp, CSEM_REG_CSEM_PRTY_MASK_0, 0x0); ++ REG_WR(bp, CSEM_REG_CSEM_PRTY_MASK_1, 0x0); ++ REG_WR(bp, XSEM_REG_XSEM_PRTY_MASK_0, 0x0); ++ REG_WR(bp, XSEM_REG_XSEM_PRTY_MASK_1, 0x0); ++} ++#endif + + static void bnx2x_reset_common(struct bnx2x *bp) + { +@@ -5166,9 +6383,84 @@ + REG_WR(bp, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_2_CLEAR, 0x1403); + } + ++static void bnx2x_init_pxp(struct bnx2x *bp) ++{ ++ u16 devctl; ++ int r_order, w_order; ++ ++ pci_read_config_word(bp->pdev, ++ bp->pcie_cap + PCI_EXP_DEVCTL, &devctl); ++ DP(NETIF_MSG_HW, "read 0x%x from devctl\n", devctl); ++ w_order = ((devctl & PCI_EXP_DEVCTL_PAYLOAD) >> 5); ++ if (bp->mrrs == -1) ++ r_order = ((devctl & PCI_EXP_DEVCTL_READRQ) >> 12); ++ else { ++ DP(NETIF_MSG_HW, "force read order to %d\n", bp->mrrs); ++ r_order = bp->mrrs; ++ } ++ ++ bnx2x_init_pxp_arb(bp, r_order, w_order); ++} ++ ++static void bnx2x_setup_fan_failure_detection(struct bnx2x* bp) ++{ ++ u32 val; ++ u8 port; ++ u8 is_required = 0; ++ ++ val = SHMEM_RD(bp, dev_info.shared_hw_config.config2) & ++ SHARED_HW_CFG_FAN_FAILURE_MASK; ++ ++ if (val == SHARED_HW_CFG_FAN_FAILURE_ENABLED) ++ is_required = 1; ++ /* ++ * The fan failure mechanism is usually related to the PHY type since ++ * the power consumption of the board is effected by the PHY. Currently, ++ * fan is required for most designs with SFX7101, BCM8727 and BCM8481. ++ */ ++ else if (val == SHARED_HW_CFG_FAN_FAILURE_PHY_TYPE) ++ for (port = PORT_0; port < PORT_MAX; port++) ++ { ++ u32 phy_type = ++ SHMEM_RD(bp, dev_info.port_hw_config[port]. ++ external_phy_config) & ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_MASK; ++ is_required |= ++ ((phy_type == ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_SFX7101) || ++ (phy_type == ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8727) || ++ (phy_type == ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481)); ++ } ++ ++ DP(NETIF_MSG_HW, "fan detection setting: %d\n", is_required); ++ ++ if (is_required == 0) ++ return; ++ ++ /* Fan failure is indicated by SPIO 5 */ ++ bnx2x_set_spio(bp, MISC_REGISTERS_SPIO_5, ++ MISC_REGISTERS_SPIO_INPUT_HI_Z); ++ ++ /* set to active low mode */ ++ val = REG_RD(bp, MISC_REG_SPIO_INT); ++ val |= ((1 << MISC_REGISTERS_SPIO_5) << ++ MISC_REGISTERS_SPIO_INT_OLD_SET_POS); ++ REG_WR(bp, MISC_REG_SPIO_INT, val); ++ ++ /* enable interrupt to signal the IGU */ ++ val = REG_RD(bp, MISC_REG_SPIO_EVENT_EN); ++ val |= (1 << MISC_REGISTERS_SPIO_5); ++ REG_WR(bp, MISC_REG_SPIO_EVENT_EN, val); ++} ++ + static int bnx2x_init_common(struct bnx2x *bp) + { + u32 val, i; ++#ifdef BCM_CNIC /* ! BNX2X_UPSTREAM */ ++ u32 wb_write[2]; ++#endif + + DP(BNX2X_MSG_MCP, "starting common init func %d\n", BP_FUNC(bp)); + +@@ -5176,7 +6468,7 @@ + REG_WR(bp, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_1_SET, 0xffffffff); + REG_WR(bp, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_2_SET, 0xfffc); + +- bnx2x_init_block(bp, MISC_COMMON_START, MISC_COMMON_END); ++ bnx2x_init_block(bp, MISC_BLOCK, COMMON_STAGE); + if (CHIP_IS_E1H(bp)) + REG_WR(bp, MISC_REG_E1HMF_MODE, IS_E1HMF(bp)); + +@@ -5184,14 +6476,14 @@ + msleep(30); + REG_WR(bp, MISC_REG_LCPLL_CTRL_REG_2, 0x0); + +- bnx2x_init_block(bp, PXP_COMMON_START, PXP_COMMON_END); ++ bnx2x_init_block(bp, PXP_BLOCK, COMMON_STAGE); + if (CHIP_IS_E1(bp)) { + /* enable HW interrupt from PXP on USDM overflow + bit 16 on INT_MASK_0 */ + REG_WR(bp, PXP_REG_PXP_INT_MASK_0, 0); + } + +- bnx2x_init_block(bp, PXP2_COMMON_START, PXP2_COMMON_END); ++ bnx2x_init_block(bp, PXP2_BLOCK, COMMON_STAGE); + bnx2x_init_pxp(bp); + + #ifdef __BIG_ENDIAN +@@ -5200,6 +6492,8 @@ + REG_WR(bp, PXP2_REG_RQ_SRC_ENDIAN_M, 1); + REG_WR(bp, PXP2_REG_RQ_CDU_ENDIAN_M, 1); + REG_WR(bp, PXP2_REG_RQ_DBG_ENDIAN_M, 1); ++ /* make sure this value is 0 */ ++ REG_WR(bp, PXP2_REG_RQ_HC_ENDIAN_M, 0); + + /* REG_WR(bp, PXP2_REG_RD_PBF_SWAP_MODE, 1); */ + REG_WR(bp, PXP2_REG_RD_QM_SWAP_MODE, 1); +@@ -5209,7 +6503,7 @@ + #endif + + REG_WR(bp, PXP2_REG_RQ_CDU_P_SIZE, 2); +-#ifdef BCM_ISCSI ++#ifdef BCM_CNIC /* ! BNX2X_UPSTREAM */ + REG_WR(bp, PXP2_REG_RQ_TM_P_SIZE, 5); + REG_WR(bp, PXP2_REG_RQ_QM_P_SIZE, 5); + REG_WR(bp, PXP2_REG_RQ_SRC_P_SIZE, 5); +@@ -5235,95 +6529,100 @@ + REG_WR(bp, PXP2_REG_RQ_DISABLE_INPUTS, 0); + REG_WR(bp, PXP2_REG_RD_DISABLE_INPUTS, 0); + +- bnx2x_init_block(bp, DMAE_COMMON_START, DMAE_COMMON_END); ++ bnx2x_init_block(bp, DMAE_BLOCK, COMMON_STAGE); + + /* clean the DMAE memory */ + bp->dmae_ready = 1; + bnx2x_init_fill(bp, TSEM_REG_PRAM, 0, 8); + +- bnx2x_init_block(bp, TCM_COMMON_START, TCM_COMMON_END); +- bnx2x_init_block(bp, UCM_COMMON_START, UCM_COMMON_END); +- bnx2x_init_block(bp, CCM_COMMON_START, CCM_COMMON_END); +- bnx2x_init_block(bp, XCM_COMMON_START, XCM_COMMON_END); ++ bnx2x_init_block(bp, TCM_BLOCK, COMMON_STAGE); ++ bnx2x_init_block(bp, UCM_BLOCK, COMMON_STAGE); ++ bnx2x_init_block(bp, CCM_BLOCK, COMMON_STAGE); ++ bnx2x_init_block(bp, XCM_BLOCK, COMMON_STAGE); + + bnx2x_read_dmae(bp, XSEM_REG_PASSIVE_BUFFER, 3); + bnx2x_read_dmae(bp, CSEM_REG_PASSIVE_BUFFER, 3); + bnx2x_read_dmae(bp, TSEM_REG_PASSIVE_BUFFER, 3); + bnx2x_read_dmae(bp, USEM_REG_PASSIVE_BUFFER, 3); + +- bnx2x_init_block(bp, QM_COMMON_START, QM_COMMON_END); ++ bnx2x_init_block(bp, QM_BLOCK, COMMON_STAGE); ++#ifdef BNX2X_SAFC /* ! BNX2X_UPSTREAM */ ++ switch (bp->multi_mode) { ++ case ETH_RSS_MODE_DISABLED: ++ case ETH_RSS_MODE_REGULAR: ++ break; ++ ++ case ETH_RSS_MODE_VLAN_PRI: ++ case ETH_RSS_MODE_E1HOV_PRI: ++ case ETH_RSS_MODE_IP_DSCP: ++ REG_WR(bp, QM_REG_BYTECRDINITVAL, 0x5dc0); ++ break; ++ ++ default: ++ break; ++ } ++#endif ++#ifdef BCM_CNIC /* ! BNX2X_UPSTREAM */ ++ wb_write[0] = 0; ++ wb_write[1] = 0; ++ for (i = 0; i < 64; i++) { ++ REG_WR(bp, QM_REG_BASEADDR + i*4, 1024 * 4 * (i%16)); ++ bnx2x_init_ind_wr(bp, QM_REG_PTRTBL + i*8, wb_write, 2); ++ ++ if (CHIP_IS_E1H(bp)) { ++ REG_WR(bp, QM_REG_BASEADDR_EXT_A + i*4, 1024*4*(i%16)); ++ bnx2x_init_ind_wr(bp, QM_REG_PTRTBL_EXT_A + i*8, ++ wb_write, 2); ++ } ++ } ++#endif + /* soft reset pulse */ + REG_WR(bp, QM_REG_SOFT_RESET, 1); + REG_WR(bp, QM_REG_SOFT_RESET, 0); + +-#ifdef BCM_ISCSI +- bnx2x_init_block(bp, TIMERS_COMMON_START, TIMERS_COMMON_END); +-#endif +- +- bnx2x_init_block(bp, DQ_COMMON_START, DQ_COMMON_END); ++#ifdef BCM_CNIC /* ! BNX2X_UPSTREAM */ ++ bnx2x_init_block(bp, TIMERS_BLOCK, COMMON_STAGE); ++#endif ++ ++ bnx2x_init_block(bp, DQ_BLOCK, COMMON_STAGE); + REG_WR(bp, DORQ_REG_DPM_CID_OFST, BCM_PAGE_SHIFT); + if (!CHIP_REV_IS_SLOW(bp)) { + /* enable hw interrupt from doorbell Q */ + REG_WR(bp, DORQ_REG_DORQ_INT_MASK, 0); + } + +- bnx2x_init_block(bp, BRB1_COMMON_START, BRB1_COMMON_END); +- if (CHIP_REV_IS_SLOW(bp)) { +- /* fix for emulation and FPGA for no pause */ +- REG_WR(bp, BRB1_REG_PAUSE_HIGH_THRESHOLD_0, 513); +- REG_WR(bp, BRB1_REG_PAUSE_HIGH_THRESHOLD_1, 513); +- REG_WR(bp, BRB1_REG_PAUSE_LOW_THRESHOLD_0, 0); +- REG_WR(bp, BRB1_REG_PAUSE_LOW_THRESHOLD_1, 0); +- } +- +- bnx2x_init_block(bp, PRS_COMMON_START, PRS_COMMON_END); ++ bnx2x_init_block(bp, BRB1_BLOCK, COMMON_STAGE); ++ bnx2x_init_block(bp, PRS_BLOCK, COMMON_STAGE); + REG_WR(bp, PRS_REG_A_PRSU_20, 0xf); ++#ifndef BCM_CNIC /* BNX2X_UPSTREAM */ + /* set NIC mode */ + REG_WR(bp, PRS_REG_NIC_MODE, 1); ++#endif ++#ifdef BNX2X_SAFC ++ if (CHIP_IS_E1H(bp)) { ++ val = (IS_E1HMF(bp) || ++ (bp->multi_mode == ETH_RSS_MODE_E1HOV_PRI)) ? 1 : 0; ++ REG_WR(bp, PRS_REG_E1HOV_MODE, val); ++ } ++#else /* BNX2X_UPSTREAM */ + if (CHIP_IS_E1H(bp)) + REG_WR(bp, PRS_REG_E1HOV_MODE, IS_E1HMF(bp)); +- +- bnx2x_init_block(bp, TSDM_COMMON_START, TSDM_COMMON_END); +- bnx2x_init_block(bp, CSDM_COMMON_START, CSDM_COMMON_END); +- bnx2x_init_block(bp, USDM_COMMON_START, USDM_COMMON_END); +- bnx2x_init_block(bp, XSDM_COMMON_START, XSDM_COMMON_END); +- +- if (CHIP_IS_E1H(bp)) { +- bnx2x_init_fill(bp, TSTORM_INTMEM_ADDR, 0, +- STORM_INTMEM_SIZE_E1H/2); +- bnx2x_init_fill(bp, +- TSTORM_INTMEM_ADDR + STORM_INTMEM_SIZE_E1H/2, +- 0, STORM_INTMEM_SIZE_E1H/2); +- bnx2x_init_fill(bp, CSTORM_INTMEM_ADDR, 0, +- STORM_INTMEM_SIZE_E1H/2); +- bnx2x_init_fill(bp, +- CSTORM_INTMEM_ADDR + STORM_INTMEM_SIZE_E1H/2, +- 0, STORM_INTMEM_SIZE_E1H/2); +- bnx2x_init_fill(bp, XSTORM_INTMEM_ADDR, 0, +- STORM_INTMEM_SIZE_E1H/2); +- bnx2x_init_fill(bp, +- XSTORM_INTMEM_ADDR + STORM_INTMEM_SIZE_E1H/2, +- 0, STORM_INTMEM_SIZE_E1H/2); +- bnx2x_init_fill(bp, USTORM_INTMEM_ADDR, 0, +- STORM_INTMEM_SIZE_E1H/2); +- bnx2x_init_fill(bp, +- USTORM_INTMEM_ADDR + STORM_INTMEM_SIZE_E1H/2, +- 0, STORM_INTMEM_SIZE_E1H/2); +- } else { /* E1 */ +- bnx2x_init_fill(bp, TSTORM_INTMEM_ADDR, 0, +- STORM_INTMEM_SIZE_E1); +- bnx2x_init_fill(bp, CSTORM_INTMEM_ADDR, 0, +- STORM_INTMEM_SIZE_E1); +- bnx2x_init_fill(bp, XSTORM_INTMEM_ADDR, 0, +- STORM_INTMEM_SIZE_E1); +- bnx2x_init_fill(bp, USTORM_INTMEM_ADDR, 0, +- STORM_INTMEM_SIZE_E1); +- } +- +- bnx2x_init_block(bp, TSEM_COMMON_START, TSEM_COMMON_END); +- bnx2x_init_block(bp, USEM_COMMON_START, USEM_COMMON_END); +- bnx2x_init_block(bp, CSEM_COMMON_START, CSEM_COMMON_END); +- bnx2x_init_block(bp, XSEM_COMMON_START, XSEM_COMMON_END); ++#endif ++ ++ bnx2x_init_block(bp, TSDM_BLOCK, COMMON_STAGE); ++ bnx2x_init_block(bp, CSDM_BLOCK, COMMON_STAGE); ++ bnx2x_init_block(bp, USDM_BLOCK, COMMON_STAGE); ++ bnx2x_init_block(bp, XSDM_BLOCK, COMMON_STAGE); ++ ++ bnx2x_init_fill(bp, TSEM_REG_FAST_MEMORY, 0, STORM_INTMEM_SIZE(bp)); ++ bnx2x_init_fill(bp, USEM_REG_FAST_MEMORY, 0, STORM_INTMEM_SIZE(bp)); ++ bnx2x_init_fill(bp, CSEM_REG_FAST_MEMORY, 0, STORM_INTMEM_SIZE(bp)); ++ bnx2x_init_fill(bp, XSEM_REG_FAST_MEMORY, 0, STORM_INTMEM_SIZE(bp)); ++ ++ bnx2x_init_block(bp, TSEM_BLOCK, COMMON_STAGE); ++ bnx2x_init_block(bp, USEM_BLOCK, COMMON_STAGE); ++ bnx2x_init_block(bp, CSEM_BLOCK, COMMON_STAGE); ++ bnx2x_init_block(bp, XSEM_BLOCK, COMMON_STAGE); + + /* sync semi rtc */ + REG_WR(bp, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_1_CLEAR, +@@ -5331,17 +6630,28 @@ + REG_WR(bp, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_1_SET, + 0x80000000); + +- bnx2x_init_block(bp, UPB_COMMON_START, UPB_COMMON_END); +- bnx2x_init_block(bp, XPB_COMMON_START, XPB_COMMON_END); +- bnx2x_init_block(bp, PBF_COMMON_START, PBF_COMMON_END); ++ bnx2x_init_block(bp, UPB_BLOCK, COMMON_STAGE); ++ bnx2x_init_block(bp, XPB_BLOCK, COMMON_STAGE); ++ bnx2x_init_block(bp, PBF_BLOCK, COMMON_STAGE); + + REG_WR(bp, SRC_REG_SOFT_RST, 1); + for (i = SRC_REG_KEYRSS0_0; i <= SRC_REG_KEYRSS1_9; i += 4) { + REG_WR(bp, i, 0xc0cac01a); + /* TODO: replace with something meaningful */ + } +- if (CHIP_IS_E1H(bp)) +- bnx2x_init_block(bp, SRCH_COMMON_START, SRCH_COMMON_END); ++ bnx2x_init_block(bp, SRCH_BLOCK, COMMON_STAGE); ++#ifdef BCM_CNIC /* ! BNX2X_UPSTREAM */ ++ REG_WR(bp, SRC_REG_KEYSEARCH_0, 0x63285672); ++ REG_WR(bp, SRC_REG_KEYSEARCH_1, 0x24b8f2cc); ++ REG_WR(bp, SRC_REG_KEYSEARCH_2, 0x223aef9b); ++ REG_WR(bp, SRC_REG_KEYSEARCH_3, 0x26001e3a); ++ REG_WR(bp, SRC_REG_KEYSEARCH_4, 0x7ae91116); ++ REG_WR(bp, SRC_REG_KEYSEARCH_5, 0x5ce5230b); ++ REG_WR(bp, SRC_REG_KEYSEARCH_6, 0x298d8adf); ++ REG_WR(bp, SRC_REG_KEYSEARCH_7, 0x6eb0ff09); ++ REG_WR(bp, SRC_REG_KEYSEARCH_8, 0x1830f82f); ++ REG_WR(bp, SRC_REG_KEYSEARCH_9, 0x01e46be7); ++#endif + REG_WR(bp, SRC_REG_SOFT_RST, 0); + + if (sizeof(union cdu_context) != 1024) +@@ -5349,32 +6659,32 @@ + printk(KERN_ALERT PFX "please adjust the size of" + " cdu_context(%ld)\n", (long)sizeof(union cdu_context)); + +- bnx2x_init_block(bp, CDU_COMMON_START, CDU_COMMON_END); ++ bnx2x_init_block(bp, CDU_BLOCK, COMMON_STAGE); + val = (4 << 24) + (0 << 12) + 1024; + REG_WR(bp, CDU_REG_CDU_GLOBAL_PARAMS, val); +- if (CHIP_IS_E1(bp)) { +- /* !!! fix pxp client crdit until excel update */ +- REG_WR(bp, CDU_REG_CDU_DEBUG, 0x264); +- REG_WR(bp, CDU_REG_CDU_DEBUG, 0); +- } +- +- bnx2x_init_block(bp, CFC_COMMON_START, CFC_COMMON_END); ++ ++ bnx2x_init_block(bp, CFC_BLOCK, COMMON_STAGE); + REG_WR(bp, CFC_REG_INIT_REG, 0x7FF); +- +- bnx2x_init_block(bp, HC_COMMON_START, HC_COMMON_END); +- bnx2x_init_block(bp, MISC_AEU_COMMON_START, MISC_AEU_COMMON_END); +- +- /* PXPCS COMMON comes here */ ++ /* enable context validation interrupt from CFC */ ++ REG_WR(bp, CFC_REG_CFC_INT_MASK, 0); ++ ++ /* set the thresholds to prevent CFC/CDU race */ ++ REG_WR(bp, CFC_REG_DEBUG0, 0x20020000); ++ ++ bnx2x_init_block(bp, HC_BLOCK, COMMON_STAGE); ++ bnx2x_init_block(bp, MISC_AEU_BLOCK, COMMON_STAGE); ++ ++ bnx2x_init_block(bp, PXPCS_BLOCK, COMMON_STAGE); + /* Reset PCIE errors for debug */ + REG_WR(bp, 0x2814, 0xffffffff); + REG_WR(bp, 0x3820, 0xffffffff); + +- /* EMAC0 COMMON comes here */ +- /* EMAC1 COMMON comes here */ +- /* DBU COMMON comes here */ +- /* DBG COMMON comes here */ +- +- bnx2x_init_block(bp, NIG_COMMON_START, NIG_COMMON_END); ++ bnx2x_init_block(bp, EMAC0_BLOCK, COMMON_STAGE); ++ bnx2x_init_block(bp, EMAC1_BLOCK, COMMON_STAGE); ++ bnx2x_init_block(bp, DBU_BLOCK, COMMON_STAGE); ++ bnx2x_init_block(bp, DBG_BLOCK, COMMON_STAGE); ++ ++ bnx2x_init_block(bp, NIG_BLOCK, COMMON_STAGE); + if (CHIP_IS_E1H(bp)) { + REG_WR(bp, NIG_REG_LLH_MF_MODE, IS_E1HMF(bp)); + REG_WR(bp, NIG_REG_LLH_E1HOV_MODE, IS_E1HMF(bp)); +@@ -5412,33 +6722,27 @@ + return -EBUSY; + } + +- switch (bp->common.board & SHARED_HW_CFG_BOARD_TYPE_MASK) { +- case SHARED_HW_CFG_BOARD_TYPE_BCM957710A1021G: +- case SHARED_HW_CFG_BOARD_TYPE_BCM957710A1022G: +- /* Fan failure is indicated by SPIO 5 */ +- bnx2x_set_spio(bp, MISC_REGISTERS_SPIO_5, +- MISC_REGISTERS_SPIO_INPUT_HI_Z); +- +- /* set to active low mode */ +- val = REG_RD(bp, MISC_REG_SPIO_INT); +- val |= ((1 << MISC_REGISTERS_SPIO_5) << +- MISC_REGISTERS_SPIO_INT_OLD_SET_POS); +- REG_WR(bp, MISC_REG_SPIO_INT, val); +- +- /* enable interrupt to signal the IGU */ +- val = REG_RD(bp, MISC_REG_SPIO_EVENT_EN); +- val |= (1 << MISC_REGISTERS_SPIO_5); +- REG_WR(bp, MISC_REG_SPIO_EVENT_EN, val); +- break; +- +- default: +- break; +- } ++ switch (XGXS_EXT_PHY_TYPE(bp->link_params.ext_phy_config)) { ++ case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8072: ++ case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073: ++ case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8726: ++ case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8727: ++ bp->port.need_hw_lock = 1; ++ break; ++ ++ default: ++ break; ++ } ++ ++ bnx2x_setup_fan_failure_detection(bp); + + /* clear PXP2 attentions */ + REG_RD(bp, PXP2_REG_PXP2_INT_STS_CLR_0); + + enable_blocks_attention(bp); ++#ifdef BNX2X_EXTRA_DEBUG /* ! BNX2X_UPSTREAM */ ++ enable_blocks_parity(bp); ++#endif + + if (!BP_NOMCP(bp)) { + bnx2x_acquire_phy_lock(bp); +@@ -5453,69 +6757,83 @@ + static int bnx2x_init_port(struct bnx2x *bp) + { + int port = BP_PORT(bp); +- u32 val; ++ int init_stage = port ? PORT1_STAGE : PORT0_STAGE; ++ u32 low, high; ++ u32 val; ++#ifdef BNX2X_SAFC /* ! BNX2X_UPSTREAM */ ++ int i; ++#endif + + DP(BNX2X_MSG_MCP, "starting port init port %x\n", port); + + REG_WR(bp, NIG_REG_MASK_INTERRUPT_PORT0 + port*4, 0); + +- /* Port PXP comes here */ +- /* Port PXP2 comes here */ +-#ifdef BCM_ISCSI +- /* Port0 1 +- * Port1 385 */ +- i++; +- wb_write[0] = ONCHIP_ADDR1(bp->timers_mapping); +- wb_write[1] = ONCHIP_ADDR2(bp->timers_mapping); +- REG_WR_DMAE(bp, PXP2_REG_RQ_ONCHIP_AT + i*8, wb_write, 2); +- REG_WR(bp, PXP2_REG_PSWRQ_TM0_L2P + func*4, PXP_ONE_ILT(i)); +- +- /* Port0 2 +- * Port1 386 */ +- i++; +- wb_write[0] = ONCHIP_ADDR1(bp->qm_mapping); +- wb_write[1] = ONCHIP_ADDR2(bp->qm_mapping); +- REG_WR_DMAE(bp, PXP2_REG_RQ_ONCHIP_AT + i*8, wb_write, 2); +- REG_WR(bp, PXP2_REG_PSWRQ_QM0_L2P + func*4, PXP_ONE_ILT(i)); +- +- /* Port0 3 +- * Port1 387 */ +- i++; +- wb_write[0] = ONCHIP_ADDR1(bp->t1_mapping); +- wb_write[1] = ONCHIP_ADDR2(bp->t1_mapping); +- REG_WR_DMAE(bp, PXP2_REG_RQ_ONCHIP_AT + i*8, wb_write, 2); +- REG_WR(bp, PXP2_REG_PSWRQ_SRC0_L2P + func*4, PXP_ONE_ILT(i)); +-#endif +- /* Port CMs come here */ +- +- /* Port QM comes here */ +-#ifdef BCM_ISCSI +- REG_WR(bp, TM_REG_LIN0_SCAN_TIME + func*4, 1024/64*20); +- REG_WR(bp, TM_REG_LIN0_MAX_ACTIVE_CID + func*4, 31); +- +- bnx2x_init_block(bp, func ? TIMERS_PORT1_START : TIMERS_PORT0_START, +- func ? TIMERS_PORT1_END : TIMERS_PORT0_END); +-#endif +- /* Port DQ comes here */ +- /* Port BRB1 comes here */ +- /* Port PRS comes here */ +- /* Port TSDM comes here */ +- /* Port CSDM comes here */ +- /* Port USDM comes here */ +- /* Port XSDM comes here */ +- bnx2x_init_block(bp, port ? TSEM_PORT1_START : TSEM_PORT0_START, +- port ? TSEM_PORT1_END : TSEM_PORT0_END); +- bnx2x_init_block(bp, port ? USEM_PORT1_START : USEM_PORT0_START, +- port ? USEM_PORT1_END : USEM_PORT0_END); +- bnx2x_init_block(bp, port ? CSEM_PORT1_START : CSEM_PORT0_START, +- port ? CSEM_PORT1_END : CSEM_PORT0_END); +- bnx2x_init_block(bp, port ? XSEM_PORT1_START : XSEM_PORT0_START, +- port ? XSEM_PORT1_END : XSEM_PORT0_END); +- /* Port UPB comes here */ +- /* Port XPB comes here */ +- +- bnx2x_init_block(bp, port ? PBF_PORT1_START : PBF_PORT0_START, +- port ? PBF_PORT1_END : PBF_PORT0_END); ++ bnx2x_init_block(bp, PXP_BLOCK, init_stage); ++ bnx2x_init_block(bp, PXP2_BLOCK, init_stage); ++ ++ bnx2x_init_block(bp, TCM_BLOCK, init_stage); ++ bnx2x_init_block(bp, UCM_BLOCK, init_stage); ++ bnx2x_init_block(bp, CCM_BLOCK, init_stage); ++ bnx2x_init_block(bp, XCM_BLOCK, init_stage); ++ ++#ifdef BCM_CNIC /* ! BNX2X_UPSTREAM */ ++ REG_WR(bp, QM_REG_CONNNUM_0 + port*4, 1024/16 - 1); ++ ++ bnx2x_init_block(bp, TIMERS_BLOCK, init_stage); ++ REG_WR(bp, TM_REG_LIN0_SCAN_TIME + port*4, 20); ++ REG_WR(bp, TM_REG_LIN0_MAX_ACTIVE_CID + port*4, 31); ++#endif ++ ++ bnx2x_init_block(bp, DQ_BLOCK, init_stage); ++ ++ bnx2x_init_block(bp, BRB1_BLOCK, init_stage); ++ if (CHIP_REV_IS_SLOW(bp) && !CHIP_IS_E1H(bp)) { ++ /* no pause for emulation and FPGA */ ++ low = 0; ++ high = 513; ++ } else { ++ if (IS_E1HMF(bp)) ++ low = ((bp->flags & ONE_PORT_FLAG) ? 160 : 246); ++ else if (bp->dev->mtu > 4096) { ++ if (bp->flags & ONE_PORT_FLAG) ++ low = 160; ++ else { ++ val = bp->dev->mtu; ++ /* (24*1024 + val*4)/256 */ ++ low = 96 + (val/64) + ((val % 64) ? 1 : 0); ++ } ++ } else ++ low = ((bp->flags & ONE_PORT_FLAG) ? 80 : 160); ++ high = low + 56; /* 14*1024/256 */ ++ } ++ REG_WR(bp, BRB1_REG_PAUSE_LOW_THRESHOLD_0 + port*4, low); ++ REG_WR(bp, BRB1_REG_PAUSE_HIGH_THRESHOLD_0 + port*4, high); ++ ++#ifdef BNX2X_SAFC /* ! BNX2X_UPSTREAM */ ++ if (bp->flags & SAFC_TX_FLAG) { ++ REG_WR(bp, BRB1_REG_HIGH_LLFC_LOW_THRESHOLD_0 + port*4, 0xa0); ++ REG_WR(bp, BRB1_REG_HIGH_LLFC_HIGH_THRESHOLD_0 + port*4, 0xd8); ++ REG_WR(bp, BRB1_REG_LOW_LLFC_LOW_THRESHOLD_0 + port*4, 0xa0); ++ REG_WR(bp, BRB1_REG_LOW_LLFC_HIGH_THRESHOLD_0 + port*4, 0xd8); ++ } ++#endif ++ ++ bnx2x_init_block(bp, PRS_BLOCK, init_stage); ++ ++ bnx2x_init_block(bp, TSDM_BLOCK, init_stage); ++ bnx2x_init_block(bp, CSDM_BLOCK, init_stage); ++ bnx2x_init_block(bp, USDM_BLOCK, init_stage); ++ bnx2x_init_block(bp, XSDM_BLOCK, init_stage); ++ ++ bnx2x_init_block(bp, TSEM_BLOCK, init_stage); ++ bnx2x_init_block(bp, USEM_BLOCK, init_stage); ++ bnx2x_init_block(bp, CSEM_BLOCK, init_stage); ++ bnx2x_init_block(bp, XSEM_BLOCK, init_stage); ++ ++ bnx2x_init_block(bp, UPB_BLOCK, init_stage); ++ bnx2x_init_block(bp, XPB_BLOCK, init_stage); ++ ++ bnx2x_init_block(bp, PBF_BLOCK, init_stage); + + /* configure PBF to work without PAUSE mtu 9000 */ + REG_WR(bp, PBF_REG_P0_PAUSE_ENABLE + port*4, 0); +@@ -5530,33 +6848,19 @@ + msleep(5); + REG_WR(bp, PBF_REG_INIT_P0 + port*4, 0); + +-#ifdef BCM_ISCSI +- /* tell the searcher where the T2 table is */ +- REG_WR(bp, SRC_REG_COUNTFREE0 + func*4, 16*1024/64); +- +- wb_write[0] = U64_LO(bp->t2_mapping); +- wb_write[1] = U64_HI(bp->t2_mapping); +- REG_WR_DMAE(bp, SRC_REG_FIRSTFREE0 + func*4, wb_write, 2); +- wb_write[0] = U64_LO((u64)bp->t2_mapping + 16*1024 - 64); +- wb_write[1] = U64_HI((u64)bp->t2_mapping + 16*1024 - 64); +- REG_WR_DMAE(bp, SRC_REG_LASTFREE0 + func*4, wb_write, 2); +- +- REG_WR(bp, SRC_REG_NUMBER_HASH_BITS0 + func*4, 10); +- /* Port SRCH comes here */ +-#endif +- /* Port CDU comes here */ +- /* Port CFC comes here */ ++#ifdef BCM_CNIC /* ! BNX2X_UPSTREAM */ ++ bnx2x_init_block(bp, SRCH_BLOCK, init_stage); ++#endif ++ bnx2x_init_block(bp, CDU_BLOCK, init_stage); ++ bnx2x_init_block(bp, CFC_BLOCK, init_stage); + + if (CHIP_IS_E1(bp)) { + REG_WR(bp, HC_REG_LEADING_EDGE_0 + port*8, 0); + REG_WR(bp, HC_REG_TRAILING_EDGE_0 + port*8, 0); + } +- bnx2x_init_block(bp, port ? HC_PORT1_START : HC_PORT0_START, +- port ? HC_PORT1_END : HC_PORT0_END); +- +- bnx2x_init_block(bp, port ? MISC_AEU_PORT1_START : +- MISC_AEU_PORT0_START, +- port ? MISC_AEU_PORT1_END : MISC_AEU_PORT0_END); ++ bnx2x_init_block(bp, HC_BLOCK, init_stage); ++ ++ bnx2x_init_block(bp, MISC_AEU_BLOCK, init_stage); + /* init aeu_mask_attn_func_0/1: + * - SF mode: bits 3-7 are masked. only bits 0-2 are in use + * - MF mode: bit 3 is masked. bits 0-2 are in use as in SF +@@ -5564,45 +6868,96 @@ + REG_WR(bp, MISC_REG_AEU_MASK_ATTN_FUNC_0 + port*4, + (IS_E1HMF(bp) ? 0xF7 : 0x7)); + +- /* Port PXPCS comes here */ +- /* Port EMAC0 comes here */ +- /* Port EMAC1 comes here */ +- /* Port DBU comes here */ +- /* Port DBG comes here */ +- bnx2x_init_block(bp, port ? NIG_PORT1_START : NIG_PORT0_START, +- port ? NIG_PORT1_END : NIG_PORT0_END); ++ bnx2x_init_block(bp, PXPCS_BLOCK, init_stage); ++ bnx2x_init_block(bp, EMAC0_BLOCK, init_stage); ++ bnx2x_init_block(bp, EMAC1_BLOCK, init_stage); ++ bnx2x_init_block(bp, DBU_BLOCK, init_stage); ++ bnx2x_init_block(bp, DBG_BLOCK, init_stage); ++ ++ bnx2x_init_block(bp, NIG_BLOCK, init_stage); + + REG_WR(bp, NIG_REG_XGXS_SERDES0_MODE_SEL + port*4, 1); + + if (CHIP_IS_E1H(bp)) { +- u32 wsum; +- struct cmng_struct_per_port m_cmng_port; +- int vn; +- + /* 0x2 disable e1hov, 0x1 enable */ + REG_WR(bp, NIG_REG_LLH0_BRB1_DRV_MASK_MF + port*4, + (IS_E1HMF(bp) ? 0x1 : 0x2)); + +- /* Init RATE SHAPING and FAIRNESS contexts. +- Initialize as if there is 10G link. */ +- wsum = bnx2x_calc_vn_wsum(bp); +- bnx2x_init_port_minmax(bp, (int)wsum, 10000, &m_cmng_port); +- if (IS_E1HMF(bp)) +- for (vn = VN_0; vn < E1HVN_MAX; vn++) +- bnx2x_init_vn_minmax(bp, 2*vn + port, +- wsum, 10000, &m_cmng_port); +- } +- +- /* Port MCP comes here */ +- /* Port DMAE comes here */ +- +- switch (bp->common.board & SHARED_HW_CFG_BOARD_TYPE_MASK) { +- case SHARED_HW_CFG_BOARD_TYPE_BCM957710A1021G: +- case SHARED_HW_CFG_BOARD_TYPE_BCM957710A1022G: ++#ifdef BNX2X_SAFC ++ if (bp->flags & SAFC_TX_FLAG) { ++ high = 0; ++ for (i = 0; i < BNX2X_MAX_PRIORITY; i++) ++ if (bp->pri_map[i] == 1) ++ high |= (1 << i); ++ REG_WR(bp, ++ NIG_REG_LLFC_HIGH_PRIORITY_CLASSES_0 + port*4, ++ high); ++ low = 0; ++ for (i = 0; i < BNX2X_MAX_PRIORITY; i++) ++ if (bp->pri_map[i] == 0) ++ low |= (1 << i); ++ REG_WR(bp, ++ NIG_REG_LLFC_LOW_PRIORITY_CLASSES_0 + port*4, ++ low); ++ ++ REG_WR(bp, NIG_REG_PAUSE_ENABLE_0 + port*4, 0); ++ REG_WR(bp, NIG_REG_LLFC_ENABLE_0 + port*4, 1); ++ REG_WR(bp, NIG_REG_LLFC_OUT_EN_0 + port*4, 1); ++ } else { ++#else /* BNX2X_UPSTREAM */ ++ { ++#endif ++ REG_WR(bp, NIG_REG_LLFC_ENABLE_0 + port*4, 0); ++ REG_WR(bp, NIG_REG_LLFC_OUT_EN_0 + port*4, 0); ++ REG_WR(bp, NIG_REG_PAUSE_ENABLE_0 + port*4, 1); ++ } ++ } ++ ++ bnx2x_init_block(bp, MCP_BLOCK, init_stage); ++ bnx2x_init_block(bp, DMAE_BLOCK, init_stage); ++ ++ switch (XGXS_EXT_PHY_TYPE(bp->link_params.ext_phy_config)) { ++ case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8726: ++ { ++ u32 swap_val, swap_override, aeu_gpio_mask, offset; ++ ++ bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_3, ++ MISC_REGISTERS_GPIO_INPUT_HI_Z, port); ++ ++ /* The GPIO should be swapped if the swap register is ++ set and active */ ++ swap_val = REG_RD(bp, NIG_REG_PORT_SWAP); ++ swap_override = REG_RD(bp, NIG_REG_STRAP_OVERRIDE); ++ ++ /* Select function upon port-swap configuration */ ++ if (port == 0) { ++ offset = MISC_REG_AEU_ENABLE1_FUNC_0_OUT_0; ++ aeu_gpio_mask = (swap_val && swap_override) ? ++ AEU_INPUTS_ATTN_BITS_GPIO3_FUNCTION_1 : ++ AEU_INPUTS_ATTN_BITS_GPIO3_FUNCTION_0; ++ } else { ++ offset = MISC_REG_AEU_ENABLE1_FUNC_1_OUT_0; ++ aeu_gpio_mask = (swap_val && swap_override) ? ++ AEU_INPUTS_ATTN_BITS_GPIO3_FUNCTION_0 : ++ AEU_INPUTS_ATTN_BITS_GPIO3_FUNCTION_1; ++ } ++ val = REG_RD(bp, offset); ++ /* add GPIO3 to group */ ++ val |= aeu_gpio_mask; ++ REG_WR(bp, offset, val); ++ } ++ break; ++ ++ case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_SFX7101: ++ case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8727: + /* add SPIO 5 to group 0 */ +- val = REG_RD(bp, MISC_REG_AEU_ENABLE1_FUNC_0_OUT_0); ++ { ++ u32 reg_addr = (port ? MISC_REG_AEU_ENABLE1_FUNC_1_OUT_0 : ++ MISC_REG_AEU_ENABLE1_FUNC_0_OUT_0); ++ val = REG_RD(bp, reg_addr); + val |= AEU_INPUTS_ATTN_BITS_SPIO5; +- REG_WR(bp, MISC_REG_AEU_ENABLE1_FUNC_0_OUT_0, val); ++ REG_WR(bp, reg_addr, val); ++ } + break; + + default: +@@ -5626,7 +6981,12 @@ + #define PXP_ONE_ILT(x) (((x) << 10) | x) + #define PXP_ILT_RANGE(f, l) (((l) << 10) | f) + ++#ifdef BCM_CNIC ++#define CNIC_ILT_LINES 127 ++#define CNIC_CTX_PER_ILT 16 ++#else /* BNX2X_UPSTREAM */ + #define CNIC_ILT_LINES 0 ++#endif + + static void bnx2x_ilt_wr(struct bnx2x *bp, u32 index, dma_addr_t addr) + { +@@ -5644,9 +7004,16 @@ + { + int port = BP_PORT(bp); + int func = BP_FUNC(bp); ++ u32 addr, val; + int i; + + DP(BNX2X_MSG_MCP, "starting func init func %x\n", func); ++ ++ /* set MSI reconfigure capability */ ++ addr = (port ? HC_REG_CONFIG_1 : HC_REG_CONFIG_0); ++ val = REG_RD(bp, addr); ++ val |= HC_CONFIG_0_REG_MSI_ATTN_EN_0; ++ REG_WR(bp, addr, val); + + i = FUNC_ILT_BASE(func); + +@@ -5658,11 +7025,54 @@ + REG_WR(bp, PXP2_REG_PSWRQ_CDU0_L2P + func*4, + PXP_ILT_RANGE(i, i + CNIC_ILT_LINES)); + +- ++#ifdef BCM_CNIC /* ! BNX2X_UPSTREAM */ ++ i += 1 + CNIC_ILT_LINES; ++ bnx2x_ilt_wr(bp, i, bp->timers_mapping); + if (CHIP_IS_E1H(bp)) { +- for (i = 0; i < 9; i++) +- bnx2x_init_block(bp, +- cm_start[func][i], cm_end[func][i]); ++ REG_WR(bp, PXP2_REG_RQ_TM_FIRST_ILT, i); ++ REG_WR(bp, PXP2_REG_RQ_TM_LAST_ILT, i); ++ } else /* E1 */ ++ REG_WR(bp, PXP2_REG_PSWRQ_TM0_L2P + func*4, PXP_ONE_ILT(i)); ++ ++ i++; ++ bnx2x_ilt_wr(bp, i, bp->qm_mapping); ++ if (CHIP_IS_E1H(bp)) { ++ REG_WR(bp, PXP2_REG_RQ_QM_FIRST_ILT, i); ++ REG_WR(bp, PXP2_REG_RQ_QM_LAST_ILT, i); ++ } else /* E1 */ ++ REG_WR(bp, PXP2_REG_PSWRQ_QM0_L2P + func*4, PXP_ONE_ILT(i)); ++ ++ i++; ++ bnx2x_ilt_wr(bp, i, bp->t1_mapping); ++ if (CHIP_IS_E1H(bp)) { ++ REG_WR(bp, PXP2_REG_RQ_SRC_FIRST_ILT, i); ++ REG_WR(bp, PXP2_REG_RQ_SRC_LAST_ILT, i); ++ } else /* E1 */ ++ REG_WR(bp, PXP2_REG_PSWRQ_SRC0_L2P + func*4, PXP_ONE_ILT(i)); ++ ++ /* tell the searcher where the T2 table is */ ++ REG_WR(bp, SRC_REG_COUNTFREE0 + port*4, 16*1024/64); ++ ++ bnx2x_wb_wr(bp, SRC_REG_FIRSTFREE0 + port*16, ++ U64_LO(bp->t2_mapping), U64_HI(bp->t2_mapping)); ++ ++ bnx2x_wb_wr(bp, SRC_REG_LASTFREE0 + port*16, ++ U64_LO((u64)bp->t2_mapping + 16*1024 - 64), ++ U64_HI((u64)bp->t2_mapping + 16*1024 - 64)); ++ ++ REG_WR(bp, SRC_REG_NUMBER_HASH_BITS0 + port*4, 10); ++#endif ++ ++ if (CHIP_IS_E1H(bp)) { ++ bnx2x_init_block(bp, MISC_BLOCK, FUNC0_STAGE + func); ++ bnx2x_init_block(bp, TCM_BLOCK, FUNC0_STAGE + func); ++ bnx2x_init_block(bp, UCM_BLOCK, FUNC0_STAGE + func); ++ bnx2x_init_block(bp, CCM_BLOCK, FUNC0_STAGE + func); ++ bnx2x_init_block(bp, XCM_BLOCK, FUNC0_STAGE + func); ++ bnx2x_init_block(bp, TSEM_BLOCK, FUNC0_STAGE + func); ++ bnx2x_init_block(bp, USEM_BLOCK, FUNC0_STAGE + func); ++ bnx2x_init_block(bp, CSEM_BLOCK, FUNC0_STAGE + func); ++ bnx2x_init_block(bp, XSEM_BLOCK, FUNC0_STAGE + func); + + REG_WR(bp, NIG_REG_LLH0_FUNC_EN + port*8, 1); + REG_WR(bp, NIG_REG_LLH0_FUNC_VLAN_ID + port*8, bp->e1hov); +@@ -5675,10 +7085,7 @@ + REG_WR(bp, HC_REG_LEADING_EDGE_0 + port*8, 0); + REG_WR(bp, HC_REG_TRAILING_EDGE_0 + port*8, 0); + } +- bnx2x_init_block(bp, hc_limits[func][0], hc_limits[func][1]); +- +- if (CHIP_IS_E1H(bp)) +- REG_WR(bp, HC_REG_FUNC_NUM_P0 + port*4, func); ++ bnx2x_init_block(bp, HC_BLOCK, FUNC0_STAGE + func); + + /* Reset PCIE errors for debug */ + REG_WR(bp, 0x2114, 0xffffffff); +@@ -5696,7 +7103,9 @@ + + bp->dmae_ready = 0; + mutex_init(&bp->dmae_mutex); +- bnx2x_gunzip_init(bp); ++ rc = bnx2x_gunzip_init(bp); ++ if (rc) ++ return rc; + + switch (load_code) { + case FW_MSG_CODE_DRV_LOAD_COMMON: +@@ -5730,57 +7139,19 @@ + bp->fw_drv_pulse_wr_seq = + (SHMEM_RD(bp, func_mb[func].drv_pulse_mb) & + DRV_PULSE_SEQ_MASK); +- bp->func_stx = SHMEM_RD(bp, func_mb[func].fw_mb_param); +- DP(BNX2X_MSG_MCP, "drv_pulse 0x%x func_stx 0x%x\n", +- bp->fw_drv_pulse_wr_seq, bp->func_stx); +- } else +- bp->func_stx = 0; ++ DP(BNX2X_MSG_MCP, "drv_pulse 0x%x\n", bp->fw_drv_pulse_wr_seq); ++ } + + /* this needs to be done before gunzip end */ + bnx2x_zero_def_sb(bp); + for_each_queue(bp, i) + bnx2x_zero_sb(bp, BP_L_ID(bp) + i); ++#ifdef BCM_CNIC /* ! BNX2X_UPSTREAM */ ++ bnx2x_zero_sb(bp, BP_L_ID(bp) + i); ++#endif + + init_hw_err: + bnx2x_gunzip_end(bp); +- +- return rc; +-} +- +-/* send the MCP a request, block until there is a reply */ +-static u32 bnx2x_fw_command(struct bnx2x *bp, u32 command) +-{ +- int func = BP_FUNC(bp); +- u32 seq = ++bp->fw_seq; +- u32 rc = 0; +- u32 cnt = 1; +- u8 delay = CHIP_REV_IS_SLOW(bp) ? 100 : 10; +- +- SHMEM_WR(bp, func_mb[func].drv_mb_header, (command | seq)); +- DP(BNX2X_MSG_MCP, "wrote command (%x) to FW MB\n", (command | seq)); +- +- do { +- /* let the FW do it's magic ... */ +- msleep(delay); +- +- rc = SHMEM_RD(bp, func_mb[func].fw_mb_header); +- +- /* Give the FW up to 2 second (200*10ms) */ +- } while ((seq != (rc & FW_MSG_SEQ_NUMBER_MASK)) && (cnt++ < 200)); +- +- DP(BNX2X_MSG_MCP, "[after %d ms] read (%x) seq is (%x) from FW MB\n", +- cnt*delay, rc, seq); +- +- /* is this a reply to our command? */ +- if (seq == (rc & FW_MSG_SEQ_NUMBER_MASK)) { +- rc &= FW_MSG_CODE_MASK; +- +- } else { +- /* FW BUG! */ +- BNX2X_ERR("FW failed to respond!\n"); +- bnx2x_fw_dump(bp); +- rc = 0; +- } + + return rc; + } +@@ -5808,20 +7179,18 @@ + int i; + + /* fastpath */ ++ /* Common */ + for_each_queue(bp, i) { + +- /* Status blocks */ ++ /* status blocks */ + BNX2X_PCI_FREE(bnx2x_fp(bp, i, status_blk), + bnx2x_fp(bp, i, status_blk_mapping), +- sizeof(struct host_status_block) + +- sizeof(struct eth_tx_db_data)); +- +- /* fast path rings: tx_buf tx_desc rx_buf rx_desc rx_comp */ +- BNX2X_FREE(bnx2x_fp(bp, i, tx_buf_ring)); +- BNX2X_PCI_FREE(bnx2x_fp(bp, i, tx_desc_ring), +- bnx2x_fp(bp, i, tx_desc_mapping), +- sizeof(struct eth_tx_bd) * NUM_TX_BD); +- ++ sizeof(struct host_status_block)); ++ } ++ /* Rx */ ++ for_each_rx_queue(bp, i) { ++ ++ /* fastpath rx rings: rx_buf rx_desc rx_comp */ + BNX2X_FREE(bnx2x_fp(bp, i, rx_buf_ring)); + BNX2X_PCI_FREE(bnx2x_fp(bp, i, rx_desc_ring), + bnx2x_fp(bp, i, rx_desc_mapping), +@@ -5838,6 +7207,15 @@ + bnx2x_fp(bp, i, rx_sge_mapping), + BCM_PAGE_SIZE * NUM_RX_SGE_PAGES); + } ++ /* Tx */ ++ for_each_tx_queue(bp, i) { ++ ++ /* fastpath tx rings: tx_buf tx_desc */ ++ BNX2X_FREE(bnx2x_fp(bp, i, tx_buf_ring)); ++ BNX2X_PCI_FREE(bnx2x_fp(bp, i, tx_desc_ring), ++ bnx2x_fp(bp, i, tx_desc_mapping), ++ sizeof(union eth_tx_bd_types) * NUM_TX_BD); ++ } + /* end of fastpath */ + + BNX2X_PCI_FREE(bp->def_status_blk, bp->def_status_blk_mapping, +@@ -5846,11 +7224,13 @@ + BNX2X_PCI_FREE(bp->slowpath, bp->slowpath_mapping, + sizeof(struct bnx2x_slowpath)); + +-#ifdef BCM_ISCSI ++#ifdef BCM_CNIC /* ! BNX2X_UPSTREAM */ + BNX2X_PCI_FREE(bp->t1, bp->t1_mapping, 64*1024); + BNX2X_PCI_FREE(bp->t2, bp->t2_mapping, 16*1024); + BNX2X_PCI_FREE(bp->timers, bp->timers_mapping, 8*1024); + BNX2X_PCI_FREE(bp->qm, bp->qm_mapping, 128*1024); ++ BNX2X_PCI_FREE(bp->cnic_sb, bp->cnic_sb_mapping, ++ sizeof(struct host_status_block)); + #endif + BNX2X_PCI_FREE(bp->spq, bp->spq_mapping, BCM_PAGE_SIZE); + +@@ -5880,29 +7260,19 @@ + int i; + + /* fastpath */ ++ /* Common */ + for_each_queue(bp, i) { + bnx2x_fp(bp, i, bp) = bp; + +- /* Status blocks */ ++ /* status blocks */ + BNX2X_PCI_ALLOC(bnx2x_fp(bp, i, status_blk), + &bnx2x_fp(bp, i, status_blk_mapping), +- sizeof(struct host_status_block) + +- sizeof(struct eth_tx_db_data)); +- +- bnx2x_fp(bp, i, hw_tx_prods) = +- (void *)(bnx2x_fp(bp, i, status_blk) + 1); +- +- bnx2x_fp(bp, i, tx_prods_mapping) = +- bnx2x_fp(bp, i, status_blk_mapping) + +- sizeof(struct host_status_block); +- +- /* fast path rings: tx_buf tx_desc rx_buf rx_desc rx_comp */ +- BNX2X_ALLOC(bnx2x_fp(bp, i, tx_buf_ring), +- sizeof(struct sw_tx_bd) * NUM_TX_BD); +- BNX2X_PCI_ALLOC(bnx2x_fp(bp, i, tx_desc_ring), +- &bnx2x_fp(bp, i, tx_desc_mapping), +- sizeof(struct eth_tx_bd) * NUM_TX_BD); +- ++ sizeof(struct host_status_block)); ++ } ++ /* Rx */ ++ for_each_rx_queue(bp, i) { ++ ++ /* fastpath rx rings: rx_buf rx_desc rx_comp */ + BNX2X_ALLOC(bnx2x_fp(bp, i, rx_buf_ring), + sizeof(struct sw_rx_bd) * NUM_RX_BD); + BNX2X_PCI_ALLOC(bnx2x_fp(bp, i, rx_desc_ring), +@@ -5921,6 +7291,16 @@ + &bnx2x_fp(bp, i, rx_sge_mapping), + BCM_PAGE_SIZE * NUM_RX_SGE_PAGES); + } ++ /* Tx */ ++ for_each_tx_queue(bp, i) { ++ ++ /* fastpath tx rings: tx_buf tx_desc */ ++ BNX2X_ALLOC(bnx2x_fp(bp, i, tx_buf_ring), ++ sizeof(struct sw_tx_bd) * NUM_TX_BD); ++ BNX2X_PCI_ALLOC(bnx2x_fp(bp, i, tx_desc_ring), ++ &bnx2x_fp(bp, i, tx_desc_mapping), ++ sizeof(union eth_tx_bd_types) * NUM_TX_BD); ++ } + /* end of fastpath */ + + BNX2X_PCI_ALLOC(bp->def_status_blk, &bp->def_status_blk_mapping, +@@ -5929,32 +7309,26 @@ + BNX2X_PCI_ALLOC(bp->slowpath, &bp->slowpath_mapping, + sizeof(struct bnx2x_slowpath)); + +-#ifdef BCM_ISCSI ++#ifdef BCM_CNIC /* ! BNX2X_UPSTREAM */ + BNX2X_PCI_ALLOC(bp->t1, &bp->t1_mapping, 64*1024); +- +- /* Initialize T1 */ +- for (i = 0; i < 64*1024; i += 64) { +- *(u64 *)((char *)bp->t1 + i + 56) = 0x0UL; +- *(u64 *)((char *)bp->t1 + i + 3) = 0x0UL; +- } + + /* allocate searcher T2 table + we allocate 1/4 of alloc num for T2 + (which is not entered into the ILT) */ + BNX2X_PCI_ALLOC(bp->t2, &bp->t2_mapping, 16*1024); + +- /* Initialize T2 */ ++ /* Initialize T2 (for 1024 connections) */ + for (i = 0; i < 16*1024; i += 64) +- * (u64 *)((char *)bp->t2 + i + 56) = bp->t2_mapping + i + 64; +- +- /* now fixup the last line in the block to point to the next block */ +- *(u64 *)((char *)bp->t2 + 1024*16-8) = bp->t2_mapping; +- +- /* Timer block array (MAX_CONN*8) phys uncached for now 1024 conns */ ++ *(u64 *)((char *)bp->t2 + i + 56) = bp->t2_mapping + i + 64; ++ ++ /* Timer block array (8*MAX_CONN) phys uncached for now 1024 conns */ + BNX2X_PCI_ALLOC(bp->timers, &bp->timers_mapping, 8*1024); + + /* QM queues (128*MAX_CONN) */ + BNX2X_PCI_ALLOC(bp->qm, &bp->qm_mapping, 128*1024); ++ ++ BNX2X_PCI_ALLOC(bp->cnic_sb, &bp->cnic_sb_mapping, ++ sizeof(struct host_status_block)); + #endif + + /* Slow path ring */ +@@ -5974,7 +7348,7 @@ + { + int i; + +- for_each_queue(bp, i) { ++ for_each_tx_queue(bp, i) { + struct bnx2x_fastpath *fp = &bp->fp[i]; + + u16 bd_cons = fp->tx_bd_cons; +@@ -5992,7 +7366,7 @@ + { + int i, j; + +- for_each_queue(bp, j) { ++ for_each_rx_queue(bp, j) { + struct bnx2x_fastpath *fp = &bp->fp[j]; + + for (i = 0; i < NUM_RX_BD; i++) { +@@ -6004,8 +7378,7 @@ + + pci_unmap_single(bp->pdev, + pci_unmap_addr(rx_buf, mapping), +- bp->rx_buf_size, +- PCI_DMA_FROMDEVICE); ++ bp->rx_buf_size, PCI_DMA_FROMDEVICE); + + rx_buf->skb = NULL; + dev_kfree_skb(skb); +@@ -6023,6 +7396,7 @@ + bnx2x_free_rx_skbs(bp); + } + ++#ifdef CONFIG_PCI_MSI /* BNX2X_UPSTREAM */ + static void bnx2x_free_msix_irqs(struct bnx2x *bp) + { + int i, offset = 1; +@@ -6031,57 +7405,75 @@ + DP(NETIF_MSG_IFDOWN, "released sp irq (%d)\n", + bp->msix_table[0].vector); + ++#ifdef BCM_CNIC /* ! BNX2X_UPSTREAM */ ++ offset++; ++#endif + for_each_queue(bp, i) { + DP(NETIF_MSG_IFDOWN, "about to release fp #%d->%d irq " + "state %x\n", i, bp->msix_table[i + offset].vector, + bnx2x_fp(bp, i, state)); + +- if (bnx2x_fp(bp, i, state) != BNX2X_FP_STATE_CLOSED) +- BNX2X_ERR("IRQ of fp #%d being freed while " +- "state != closed\n", i); +- + free_irq(bp->msix_table[i + offset].vector, &bp->fp[i]); + } + } ++#endif + + static void bnx2x_free_irq(struct bnx2x *bp) + { ++#ifdef CONFIG_PCI_MSI /* BNX2X_UPSTREAM */ + if (bp->flags & USING_MSIX_FLAG) { + bnx2x_free_msix_irqs(bp); + pci_disable_msix(bp->pdev); + bp->flags &= ~USING_MSIX_FLAG; + ++ } else if (bp->flags & USING_MSI_FLAG) { ++ free_irq(bp->pdev->irq, bp->dev); ++ pci_disable_msi(bp->pdev); ++ bp->flags &= ~USING_MSI_FLAG; ++ + } else ++#endif + free_irq(bp->pdev->irq, bp->dev); + } + + static int bnx2x_enable_msix(struct bnx2x *bp) + { +- int i, rc, offset; +- +- bp->msix_table[0].entry = 0; +- offset = 1; +- DP(NETIF_MSG_IFUP, "msix_table[0].entry = 0 (slowpath)\n"); +- ++#ifdef CONFIG_PCI_MSI /* BNX2X_UPSTREAM */ ++ int i, rc, offset = 1; ++ int igu_vec = 0; ++ ++ bp->msix_table[0].entry = igu_vec; ++ DP(NETIF_MSG_IFUP, "msix_table[0].entry = %d (slowpath)\n", igu_vec); ++ ++#ifdef BCM_CNIC /* ! BNX2X_UPSTREAM */ ++ igu_vec = BP_L_ID(bp) + offset; ++ bp->msix_table[1].entry = igu_vec; ++ DP(NETIF_MSG_IFUP, "msix_table[1].entry = %d (CNIC)\n", igu_vec); ++ offset++; ++#endif + for_each_queue(bp, i) { +- int igu_vec = offset + i + BP_L_ID(bp); +- ++ igu_vec = BP_L_ID(bp) + offset + i; + bp->msix_table[i + offset].entry = igu_vec; + DP(NETIF_MSG_IFUP, "msix_table[%d].entry = %d " + "(fastpath #%u)\n", i + offset, igu_vec, i); + } + + rc = pci_enable_msix(bp->pdev, &bp->msix_table[0], +- bp->num_queues + offset); ++ BNX2X_NUM_QUEUES(bp) + offset); + if (rc) { +- DP(NETIF_MSG_IFUP, "MSI-X is not attainable\n"); +- return -1; +- } ++ DP(NETIF_MSG_IFUP, "MSI-X is not attainable rc %d\n", rc); ++ return rc; ++ } ++ + bp->flags |= USING_MSIX_FLAG; + + return 0; +-} +- ++#else ++ return -1; ++#endif ++} ++ ++#ifdef CONFIG_PCI_MSI /* BNX2X_UPSTREAM */ + static int bnx2x_req_msix_irqs(struct bnx2x *bp) + { + int i, rc, offset = 1; +@@ -6093,28 +7485,65 @@ + return -EBUSY; + } + ++#ifdef BCM_CNIC /* ! BNX2X_UPSTREAM */ ++ offset++; ++#endif + for_each_queue(bp, i) { ++ struct bnx2x_fastpath *fp = &bp->fp[i]; ++ ++ if (i < bp->num_rx_queues) ++ sprintf(fp->name, "%s-rx-%d", bp->dev->name, i); ++ else ++ sprintf(fp->name, "%s-tx-%d", ++ bp->dev->name, i - bp->num_rx_queues); ++ + rc = request_irq(bp->msix_table[i + offset].vector, +- bnx2x_msix_fp_int, 0, +- bp->dev->name, &bp->fp[i]); ++ bnx2x_msix_fp_int, 0, fp->name, fp); + if (rc) { +- BNX2X_ERR("request fp #%d irq failed rc -%d\n", +- i + offset, -rc); ++ BNX2X_ERR("request fp #%d irq failed rc %d\n", i, rc); + bnx2x_free_msix_irqs(bp); + return -EBUSY; + } + +- bnx2x_fp(bp, i, state) = BNX2X_FP_STATE_IRQ; +- } +- +- return 0; +-} ++ fp->state = BNX2X_FP_STATE_IRQ; ++ } ++ ++ i = BNX2X_NUM_QUEUES(bp); ++ printk(KERN_INFO PFX "%s: using MSI-X IRQs: sp %d fp[%d] %d" ++ " ... fp[%d] %d\n", ++ bp->dev->name, bp->msix_table[0].vector, ++ 0, bp->msix_table[offset].vector, ++ i - 1, bp->msix_table[offset + i - 1].vector); ++ ++ return 0; ++} ++ ++static int bnx2x_enable_msi(struct bnx2x *bp) ++{ ++ int rc; ++ ++ rc = pci_enable_msi(bp->pdev); ++ if (rc) { ++ DP(NETIF_MSG_IFUP, "MSI is not attainable\n"); ++ return -1; ++ } ++ bp->flags |= USING_MSI_FLAG; ++ ++ return 0; ++} ++#endif + + static int bnx2x_req_irq(struct bnx2x *bp) + { +- int rc; +- +- rc = request_irq(bp->pdev->irq, bnx2x_interrupt, IRQF_SHARED, ++ unsigned long flags; ++ int rc; ++ ++ if (bp->flags & USING_MSI_FLAG) ++ flags = 0; ++ else ++ flags = IRQF_SHARED; ++ ++ rc = request_irq(bp->pdev->irq, bnx2x_interrupt, flags, + bp->dev->name, bp->dev); + if (!rc) + bnx2x_fp(bp, 0, state) = BNX2X_FP_STATE_IRQ; +@@ -6124,28 +7553,41 @@ + + static void bnx2x_napi_enable(struct bnx2x *bp) + { +- int i; +- +- for_each_queue(bp, i) ++#ifdef BNX2X_NEW_NAPI /* BNX2X_UPSTREAM */ ++ int i; ++ ++ for_each_rx_queue(bp, i) + napi_enable(&bnx2x_fp(bp, i, napi)); ++#else ++ netif_poll_enable(bp->dev); ++#endif + } + + static void bnx2x_napi_disable(struct bnx2x *bp) + { +- int i; +- +- for_each_queue(bp, i) ++#ifdef BNX2X_NEW_NAPI /* BNX2X_UPSTREAM */ ++ int i; ++ ++ for_each_rx_queue(bp, i) + napi_disable(&bnx2x_fp(bp, i, napi)); ++#else ++ netif_poll_disable(bp->dev); ++#endif + } + + static void bnx2x_netif_start(struct bnx2x *bp) + { +- if (atomic_dec_and_test(&bp->intr_sem)) { ++ int intr_sem; ++ ++ intr_sem = atomic_dec_and_test(&bp->intr_sem); ++ smp_wmb(); /* Ensure that bp->intr_sem update is SMP-safe */ ++ ++ if (intr_sem) { + if (netif_running(bp->dev)) { +- if (bp->state == BNX2X_STATE_OPEN) +- netif_wake_queue(bp->dev); + bnx2x_napi_enable(bp); + bnx2x_int_enable(bp); ++ if (bp->state == BNX2X_STATE_OPEN) ++ netif_tx_wake_all_queues(bp->dev); + } + } + } +@@ -6153,11 +7595,14 @@ + static void bnx2x_netif_stop(struct bnx2x *bp, int disable_hw) + { + bnx2x_int_disable_sync(bp, disable_hw); ++#ifdef BNX2X_NEW_NAPI /* BNX2X_UPSTREAM */ + bnx2x_napi_disable(bp); +- if (netif_running(bp->dev)) { +- netif_tx_disable(bp->dev); +- bp->dev->trans_start = jiffies; /* prevent tx timeout */ +- } ++#else ++ if (netif_running(bp->dev)) ++ bnx2x_napi_disable(bp); ++#endif ++ netif_tx_disable(bp->dev); ++ bp->dev->trans_start = jiffies; /* prevent tx timeout */ + } + + /* +@@ -6173,9 +7618,9 @@ + * unicasts 0-31:port0 32-63:port1 + * multicast 64-127:port0 128-191:port1 + */ +- config->hdr.length_6b = 2; ++ config->hdr.length = 2; + config->hdr.offset = port ? 32 : 0; +- config->hdr.client_id = BP_CL_ID(bp); ++ config->hdr.client_id = bp->fp->cl_id; + config->hdr.reserved1 = 0; + + /* primary MAC */ +@@ -6190,7 +7635,8 @@ + config->config_table[0].target_table_entry.flags = 0; + else + CAM_INVALIDATE(config->config_table[0]); +- config->config_table[0].target_table_entry.client_id = 0; ++ config->config_table[0].target_table_entry.clients_bit_vector = ++ cpu_to_le32(1 << BP_L_ID(bp)); + config->config_table[0].target_table_entry.vlan_id = 0; + + DP(NETIF_MSG_IFUP, "%s MAC (%04x:%04x:%04x)\n", +@@ -6200,16 +7646,17 @@ + config->config_table[0].cam_entry.lsb_mac_addr); + + /* broadcast */ +- config->config_table[1].cam_entry.msb_mac_addr = 0xffff; +- config->config_table[1].cam_entry.middle_mac_addr = 0xffff; +- config->config_table[1].cam_entry.lsb_mac_addr = 0xffff; ++ config->config_table[1].cam_entry.msb_mac_addr = cpu_to_le16(0xffff); ++ config->config_table[1].cam_entry.middle_mac_addr = cpu_to_le16(0xffff); ++ config->config_table[1].cam_entry.lsb_mac_addr = cpu_to_le16(0xffff); + config->config_table[1].cam_entry.flags = cpu_to_le16(port); + if (set) + config->config_table[1].target_table_entry.flags = + TSTORM_CAM_TARGET_TABLE_ENTRY_BROADCAST; + else + CAM_INVALIDATE(config->config_table[1]); +- config->config_table[1].target_table_entry.client_id = 0; ++ config->config_table[1].target_table_entry.clients_bit_vector = ++ cpu_to_le32(1 << BP_L_ID(bp)); + config->config_table[1].target_table_entry.vlan_id = 0; + + bnx2x_sp_post(bp, RAMROD_CMD_ID_ETH_SET_MAC, 0, +@@ -6221,19 +7668,14 @@ + { + struct mac_configuration_cmd_e1h *config = + (struct mac_configuration_cmd_e1h *)bnx2x_sp(bp, mac_config); +- +- if (set && (bp->state != BNX2X_STATE_OPEN)) { +- DP(NETIF_MSG_IFUP, "state is %x, returning\n", bp->state); +- return; +- } + + /* CAM allocation for E1H + * unicasts: by func number + * multicast: 20+FUNC*20, 20 each + */ +- config->hdr.length_6b = 1; ++ config->hdr.length = 1; + config->hdr.offset = BP_FUNC(bp); +- config->hdr.client_id = BP_CL_ID(bp); ++ config->hdr.client_id = bp->fp->cl_id; + config->hdr.reserved1 = 0; + + /* primary MAC */ +@@ -6243,7 +7685,8 @@ + swab16(*(u16 *)&bp->dev->dev_addr[2]); + config->config_table[0].lsb_mac_addr = + swab16(*(u16 *)&bp->dev->dev_addr[4]); +- config->config_table[0].client_id = BP_L_ID(bp); ++ config->config_table[0].clients_bit_vector = ++ cpu_to_le32(1 << BP_L_ID(bp)); + config->config_table[0].vlan_id = 0; + config->config_table[0].e1hov_id = cpu_to_le16(bp->e1hov); + if (set) +@@ -6267,7 +7710,7 @@ + int *state_p, int poll) + { + /* can take a while if any port is running */ +- int cnt = 500; ++ int cnt = 5000; + + DP(NETIF_MSG_IFUP, "%s for state to become %x on IDX [%d]\n", + poll ? "polling" : "waiting", state, idx); +@@ -6285,10 +7728,17 @@ + } + + mb(); /* state is changed by bnx2x_sp_event() */ +- if (*state_p == state) ++ if (*state_p == state) { ++#ifdef BNX2X_STOP_ON_ERROR ++ DP(NETIF_MSG_IFUP, "exit (cnt %d)\n", 5000 - cnt); ++#endif + return 0; ++ } + + msleep(1); ++ ++ if (bp->panic) ++ return -EIO; + } + + /* timeout! */ +@@ -6319,49 +7769,115 @@ + + static int bnx2x_setup_multi(struct bnx2x *bp, int index) + { ++ struct bnx2x_fastpath *fp = &bp->fp[index]; ++ + /* reset IGU state */ +- bnx2x_ack_sb(bp, bp->fp[index].sb_id, CSTORM_ID, 0, IGU_INT_ENABLE, 0); ++ bnx2x_ack_sb(bp, fp->sb_id, CSTORM_ID, 0, IGU_INT_ENABLE, 0); + + /* SETUP ramrod */ +- bp->fp[index].state = BNX2X_FP_STATE_OPENING; +- bnx2x_sp_post(bp, RAMROD_CMD_ID_ETH_CLIENT_SETUP, index, 0, index, 0); ++ fp->state = BNX2X_FP_STATE_OPENING; ++ bnx2x_sp_post(bp, RAMROD_CMD_ID_ETH_CLIENT_SETUP, index, 0, ++ fp->cl_id, 0); + + /* Wait for completion */ + return bnx2x_wait_ramrod(bp, BNX2X_FP_STATE_OPEN, index, +- &(bp->fp[index].state), 0); +-} +- ++ &(fp->state), 0); ++} ++ ++#ifdef BNX2X_NEW_NAPI /* BNX2X_UPSTREAM */ + static int bnx2x_poll(struct napi_struct *napi, int budget); +-static void bnx2x_set_rx_mode(struct net_device *dev); +- +-/* must be called with rtnl_lock */ +-static int bnx2x_nic_load(struct bnx2x *bp, int load_mode) +-{ +- u32 load_code; +- int i, rc = 0; +-#ifdef BNX2X_STOP_ON_ERROR +- if (unlikely(bp->panic)) +- return -EPERM; +-#endif +- +- bp->state = BNX2X_STATE_OPENING_WAIT4_LOAD; +- +- if (use_inta) { +- bp->num_queues = 1; +- +- } else { +- if ((use_multi > 1) && (use_multi <= BP_MAX_QUEUES(bp))) +- /* user requested number */ +- bp->num_queues = use_multi; +- +- else if (use_multi) +- bp->num_queues = min_t(u32, num_online_cpus(), +- BP_MAX_QUEUES(bp)); +- else +- bp->num_queues = 1; +- +- DP(NETIF_MSG_IFUP, +- "set number of queues to %d\n", bp->num_queues); ++#else ++static int bnx2x_poll(struct net_device *dev, int *budget); ++#endif ++ ++static void bnx2x_set_int_mode_msix(struct bnx2x *bp, int *num_rx_queues_out, ++ int *num_tx_queues_out) ++{ ++ int _num_rx_queues = 0, _num_tx_queues = 0; ++#ifdef BNX2X_SAFC /* ! BNX2X_UPSTREAM */ ++ int i; ++#endif ++ ++ switch (bp->multi_mode) { ++ case ETH_RSS_MODE_DISABLED: ++ _num_rx_queues = 1; ++ _num_tx_queues = 1; ++ break; ++ ++ case ETH_RSS_MODE_REGULAR: ++#ifdef BNX2X_NEW_NAPI /* BNX2X_UPSTREAM */ ++ if (num_rx_queues) ++ _num_rx_queues = min_t(u32, num_rx_queues, ++ BNX2X_MAX_QUEUES(bp)); ++ else ++ _num_rx_queues = min_t(u32, num_online_cpus(), ++ BNX2X_MAX_QUEUES(bp)); ++#else ++ _num_rx_queues = 1; ++#endif ++ ++#ifdef BNX2X_MULTI_QUEUE /* BNX2X_UPSTREAM */ ++ if (num_tx_queues) ++ _num_tx_queues = min_t(u32, num_tx_queues, ++ BNX2X_MAX_QUEUES(bp)); ++ else ++ _num_tx_queues = min_t(u32, num_online_cpus(), ++ BNX2X_MAX_QUEUES(bp)); ++ ++ /* There must be not more Tx queues than Rx queues */ ++ if (_num_tx_queues > _num_rx_queues) { ++ BNX2X_ERR("number of tx queues (%d) > " ++ "number of rx queues (%d)" ++ " defaulting to %d\n", ++ _num_tx_queues, _num_rx_queues, ++ _num_rx_queues); ++ _num_tx_queues = _num_rx_queues; ++ } ++#else ++ _num_tx_queues = 1; ++#endif ++ break; ++ ++#ifdef BNX2X_SAFC /* ! BNX2X_UPSTREAM */ ++ case ETH_RSS_MODE_VLAN_PRI: ++ case ETH_RSS_MODE_E1HOV_PRI: ++ case ETH_RSS_MODE_IP_DSCP: ++ _num_rx_queues = 0; ++ for (i = 0; i < BNX2X_MAX_COS; i++) ++ _num_rx_queues += bp->qs_per_cos[i]; ++ _num_tx_queues = _num_rx_queues; ++ break; ++#endif ++ ++ default: ++ _num_rx_queues = 1; ++ _num_tx_queues = 1; ++ break; ++ } ++ ++ *num_rx_queues_out = _num_rx_queues; ++ *num_tx_queues_out = _num_tx_queues; ++} ++ ++static int bnx2x_set_int_mode(struct bnx2x *bp) ++{ ++ int rc = 0; ++ ++ switch (int_mode) { ++ case INT_MODE_INTx: ++ case INT_MODE_MSI: ++ bp->num_rx_queues = 1; ++ bp->num_tx_queues = 1; ++ DP(NETIF_MSG_IFUP, "set number of queues to 1\n"); ++ break; ++ ++ case INT_MODE_MSIX: ++ default: ++ /* Set interrupt mode according to bp->multi_mode value */ ++ bnx2x_set_int_mode_msix(bp, &bp->num_rx_queues, &bp->num_tx_queues); ++ ++ DP(NETIF_MSG_IFUP, "set number of queues to: rx %d tx %d\n", ++ bp->num_rx_queues, bp->num_tx_queues); + + /* if we can't use MSI-X we only need one fp, + * so try to enable MSI-X with the requested number of fp's +@@ -6370,50 +7886,86 @@ + rc = bnx2x_enable_msix(bp); + if (rc) { + /* failed to enable MSI-X */ +- bp->num_queues = 1; +- if (use_multi) +- BNX2X_ERR("Multi requested but failed" +- " to enable MSI-X\n"); +- } +- } ++ if (bp->multi_mode) ++ BNX2X_ERR("Multi requested but failed to " ++ "enable MSI-X (rx %d tx %d), " ++ "set number of queues to 1\n", ++ bp->num_rx_queues, bp->num_tx_queues); ++ bp->num_rx_queues = 1; ++ bp->num_tx_queues = 1; ++ } ++ break; ++ } ++#ifdef BNX2X_MULTI_QUEUE /* BNX2X_UPSTREAM */ ++ bp->dev->real_num_tx_queues = bp->num_tx_queues; ++#endif ++ return rc; ++} ++ ++#ifdef BCM_CNIC /* ! BNX2X_UPSTREAM */ ++static int bnx2x_cnic_notify(struct bnx2x *bp, int cmd); ++static void bnx2x_setup_cnic_irq_info(struct bnx2x *bp); ++#endif ++ ++/* must be called with rtnl_lock */ ++static int bnx2x_nic_load(struct bnx2x *bp, int load_mode) ++{ ++ u32 load_code; ++ int i, rc; ++ ++#ifdef BNX2X_STOP_ON_ERROR ++ if (unlikely(bp->panic)) ++ return -EPERM; ++#endif ++ ++ bp->state = BNX2X_STATE_OPENING_WAIT4_LOAD; ++ ++ rc = bnx2x_set_int_mode(bp); + + if (bnx2x_alloc_mem(bp)) + return -ENOMEM; + +- for_each_queue(bp, i) ++ for_each_rx_queue(bp, i) + bnx2x_fp(bp, i, disable_tpa) = + ((bp->flags & TPA_ENABLE_FLAG) == 0); + +- for_each_queue(bp, i) ++#ifdef BNX2X_NEW_NAPI /* BNX2X_UPSTREAM */ ++ for_each_rx_queue(bp, i) + netif_napi_add(bp->dev, &bnx2x_fp(bp, i, napi), + bnx2x_poll, 128); +- +-#ifdef BNX2X_STOP_ON_ERROR +- for_each_queue(bp, i) { +- struct bnx2x_fastpath *fp = &bp->fp[i]; +- +- fp->poll_no_work = 0; +- fp->poll_calls = 0; +- fp->poll_max_calls = 0; +- fp->poll_complete = 0; +- fp->poll_exit = 0; +- } +-#endif ++#endif ++ + bnx2x_napi_enable(bp); + ++#ifdef CONFIG_PCI_MSI /* BNX2X_UPSTREAM */ + if (bp->flags & USING_MSIX_FLAG) { + rc = bnx2x_req_msix_irqs(bp); + if (rc) { + pci_disable_msix(bp->pdev); + goto load_error1; + } +- printk(KERN_INFO PFX "%s: using MSI-X\n", bp->dev->name); +- } else { ++ } else { ++ /* Fall to INTx if failed to enable MSI-X due to lack of ++ memory (in bnx2x_set_int_mode()) */ ++ if ((rc != -ENOMEM) && (int_mode != INT_MODE_INTx)) ++ bnx2x_enable_msi(bp); ++#else ++ { ++#endif + bnx2x_ack_int(bp); + rc = bnx2x_req_irq(bp); + if (rc) { + BNX2X_ERR("IRQ request failed rc %d, aborting\n", rc); ++#ifdef CONFIG_PCI_MSI /* BNX2X_UPSTREAM */ ++ if (bp->flags & USING_MSI_FLAG) ++ pci_disable_msi(bp->pdev); ++#endif + goto load_error1; ++ } ++ if (bp->flags & USING_MSI_FLAG) { ++ bp->dev->irq = bp->pdev->irq; ++ printk(KERN_INFO PFX "%s: using MSI IRQ %d\n", ++ bp->dev->name, bp->pdev->irq); + } + } + +@@ -6437,11 +7989,11 @@ + } else { + int port = BP_PORT(bp); + +- DP(NETIF_MSG_IFUP, "NO MCP load counts before us %d, %d, %d\n", ++ DP(NETIF_MSG_IFUP, "NO MCP - load counts %d, %d, %d\n", + load_count[0], load_count[1], load_count[2]); + load_count[0]++; + load_count[1 + port]++; +- DP(NETIF_MSG_IFUP, "NO MCP new load counts %d, %d, %d\n", ++ DP(NETIF_MSG_IFUP, "NO MCP - new load counts %d, %d, %d\n", + load_count[0], load_count[1], load_count[2]); + if (load_count[0] == 1) + load_code = FW_MSG_CODE_DRV_LOAD_COMMON; +@@ -6467,6 +8019,12 @@ + + /* Setup NIC internals and enable interrupts */ + bnx2x_nic_init(bp, load_code); ++ ++ if ((load_code == FW_MSG_CODE_DRV_LOAD_COMMON) && ++ (bp->common.shmem2_base)) ++ SHMEM2_WR(bp, dcc_support, ++ (SHMEM_DCC_SUPPORT_DISABLE_ENABLE_PF_TLV | ++ SHMEM_DCC_SUPPORT_BANDWIDTH_ALLOCATION_TLV)); + + /* Send LOAD_DONE command to MCP */ + if (!BP_NOMCP(bp)) { +@@ -6483,41 +8041,59 @@ + rc = bnx2x_setup_leading(bp); + if (rc) { + BNX2X_ERR("Setup leading failed!\n"); ++#ifndef BNX2X_STOP_ON_ERROR + goto load_error3; ++#else ++ bp->panic = 1; ++ return -EBUSY; ++#endif + } + + if (CHIP_IS_E1H(bp)) + if (bp->mf_config & FUNC_MF_CFG_FUNC_DISABLED) { +- BNX2X_ERR("!!! mf_cfg function disabled\n"); ++ DP(NETIF_MSG_IFUP, "mf_cfg function disabled\n"); + bp->state = BNX2X_STATE_DISABLED; + } + +- if (bp->state == BNX2X_STATE_OPEN) ++ if (bp->state == BNX2X_STATE_OPEN) { ++#ifdef BCM_CNIC /* ! BNX2X_UPSTREAM */ ++ /* Enable Timer scan */ ++ REG_WR(bp, TM_REG_EN_LINEAR0_TIMER + BP_PORT(bp)*4, 1); ++#endif + for_each_nondefault_queue(bp, i) { + rc = bnx2x_setup_multi(bp, i); + if (rc) ++#ifdef BCM_CNIC ++ goto load_error4; ++#else /* BNX2X_UPSTREAM */ + goto load_error3; +- } +- +- if (CHIP_IS_E1(bp)) +- bnx2x_set_mac_addr_e1(bp, 1); +- else +- bnx2x_set_mac_addr_e1h(bp, 1); ++#endif ++ } ++ ++ if (CHIP_IS_E1(bp)) ++ bnx2x_set_mac_addr_e1(bp, 1); ++ else ++ bnx2x_set_mac_addr_e1h(bp, 1); ++ } + + if (bp->port.pmf) +- bnx2x_initial_phy_init(bp); ++ bnx2x_initial_phy_init(bp, load_mode); + + /* Start fast path */ + switch (load_mode) { + case LOAD_NORMAL: +- /* Tx queue should be only reenabled */ +- netif_wake_queue(bp->dev); ++ if (bp->state == BNX2X_STATE_OPEN) { ++ /* Tx queue should be only reenabled */ ++ netif_tx_wake_all_queues(bp->dev); ++ } + /* Initialize the receive filter. */ + bnx2x_set_rx_mode(bp->dev); + break; + + case LOAD_OPEN: +- netif_start_queue(bp->dev); ++ netif_tx_start_all_queues(bp->dev); ++ if (bp->state != BNX2X_STATE_OPEN) ++ netif_tx_disable(bp->dev); + /* Initialize the receive filter. */ + bnx2x_set_rx_mode(bp->dev); + break; +@@ -6538,9 +8114,34 @@ + /* start the timer */ + mod_timer(&bp->timer, jiffies + bp->current_interval); + +- +- return 0; +- ++#if defined(__VMKLNX__) && defined(__VMKNETDDI_QUEUEOPS__) /* ! BNX2X_UPSTREAM */ ++ for_each_queue(bp, i) { ++ struct bnx2x_fastpath *fp = &bp->fp[i]; ++ ++ fp->netq_flags &= ~(BNX2X_NETQ_RX_QUEUE_ALLOCATED | ++ BNX2X_NETQ_TX_QUEUE_ALLOCATED); ++ } ++ bp->n_rx_queues_allocated = 0; ++ bp->n_tx_queues_allocated = 0; ++ if (bp->netq_enabled) { ++ /* workaround for packets duplicated issue when NetQ enabled */ ++ bp->rx_mode = BNX2X_RX_MODE_NORMAL; ++ bnx2x_set_storm_rx_mode(bp); ++ } ++#endif ++ ++#ifdef BCM_CNIC /* ! BNX2X_UPSTREAM */ ++ bnx2x_setup_cnic_irq_info(bp); ++ if (bp->state == BNX2X_STATE_OPEN) ++ bnx2x_cnic_notify(bp, CNIC_CTL_START_CMD); ++#endif ++ return 0; ++ ++#ifdef BCM_CNIC /* ! BNX2X_UPSTREAM */ ++load_error4: ++ /* Disable Timer scan */ ++ REG_WR(bp, TM_REG_EN_LINEAR0_TIMER + BP_PORT(bp)*4, 0); ++#endif + load_error3: + bnx2x_int_disable_sync(bp, 1); + if (!BP_NOMCP(bp)) { +@@ -6550,33 +8151,34 @@ + bp->port.pmf = 0; + /* Free SKBs, SGEs, TPA pool and driver internals */ + bnx2x_free_skbs(bp); +- for_each_queue(bp, i) ++ for_each_rx_queue(bp, i) + bnx2x_free_rx_sge_range(bp, bp->fp + i, NUM_RX_SGE); + load_error2: + /* Release IRQs */ + bnx2x_free_irq(bp); + load_error1: + bnx2x_napi_disable(bp); +- for_each_queue(bp, i) ++#if defined(BNX2X_NEW_NAPI) && (LINUX_VERSION_CODE >= 0x02061b) /* BNX2X_UPSTREAM */ ++ for_each_rx_queue(bp, i) + netif_napi_del(&bnx2x_fp(bp, i, napi)); ++#endif + bnx2x_free_mem(bp); + +- /* TBD we really need to reset the chip +- if we want to recover from this */ + return rc; + } + + static int bnx2x_stop_multi(struct bnx2x *bp, int index) + { ++ struct bnx2x_fastpath *fp = &bp->fp[index]; + int rc; + + /* halt the connection */ +- bp->fp[index].state = BNX2X_FP_STATE_HALTING; +- bnx2x_sp_post(bp, RAMROD_CMD_ID_ETH_HALT, index, 0, index, 0); ++ fp->state = BNX2X_FP_STATE_HALTING; ++ bnx2x_sp_post(bp, RAMROD_CMD_ID_ETH_HALT, index, 0, fp->cl_id, 0); + + /* Wait for completion */ + rc = bnx2x_wait_ramrod(bp, BNX2X_FP_STATE_HALTED, index, +- &(bp->fp[index].state), 1); ++ &(fp->state), 1); + if (rc) /* timeout */ + return rc; + +@@ -6585,13 +8187,13 @@ + + /* Wait for completion */ + rc = bnx2x_wait_ramrod(bp, BNX2X_FP_STATE_CLOSED, index, +- &(bp->fp[index].state), 1); ++ &(fp->state), 1); + return rc; + } + + static int bnx2x_stop_leading(struct bnx2x *bp) + { +- u16 dsb_sp_prod_idx; ++ __le16 dsb_sp_prod_idx; + /* if the other port is handling traffic, + this can take a lot of time */ + int cnt = 500; +@@ -6601,7 +8203,7 @@ + + /* Send HALT ramrod */ + bp->fp[0].state = BNX2X_FP_STATE_HALTING; +- bnx2x_sp_post(bp, RAMROD_CMD_ID_ETH_HALT, 0, 0, BP_CL_ID(bp), 0); ++ bnx2x_sp_post(bp, RAMROD_CMD_ID_ETH_HALT, 0, 0, bp->fp->cl_id, 0); + + /* Wait for completion */ + rc = bnx2x_wait_ramrod(bp, BNX2X_FP_STATE_HALTED, 0, +@@ -6620,14 +8222,13 @@ + */ + while (dsb_sp_prod_idx == *bp->dsb_sp_prod) { + if (!cnt) { +- DP(NETIF_MSG_IFDOWN, "timeout waiting for port del " ++ DP(NETIF_MSG_IFDOWN, "timeout waiting for port del " + "dsb_sp_prod 0x%x != dsb_sp_prod_idx 0x%x\n", + *bp->dsb_sp_prod, dsb_sp_prod_idx); + #ifdef BNX2X_STOP_ON_ERROR + bnx2x_panic(); +-#else ++#endif + rc = -EBUSY; +-#endif + break; + } + cnt--; +@@ -6650,8 +8251,19 @@ + REG_WR(bp, HC_REG_LEADING_EDGE_0 + port*8, 0); + REG_WR(bp, HC_REG_TRAILING_EDGE_0 + port*8, 0); + +- REG_WR(bp, HC_REG_CONFIG_0 + port*4, 0x1000); +- ++#ifdef BCM_CNIC /* ! BNX2X_UPSTREAM */ ++ /* Disable Timer scan */ ++ REG_WR(bp, TM_REG_EN_LINEAR0_TIMER + port*4, 0); ++ /* ++ * Wait for at least 10ms and up to 2 second for the timers scan to ++ * complete ++ */ ++ for (i = 0; i < 200; i++) { ++ msleep(10); ++ if (!REG_RD(bp, TM_REG_LIN0_SCAN_ON + port*4)) ++ break; ++ } ++#endif + /* Clear ILT */ + base = FUNC_ILT_BASE(func); + for (i = base; i < base + ILT_PER_FUNC; i++) +@@ -6718,11 +8330,16 @@ + u32 reset_code = 0; + int i, cnt, rc; + ++#ifdef BCM_CNIC /* ! BNX2X_UPSTREAM */ ++ bnx2x_cnic_notify(bp, CNIC_CTL_STOP_CMD); ++#endif + bp->state = BNX2X_STATE_CLOSING_WAIT4_HALT; + ++ /* Set "drop all" */ + bp->rx_mode = BNX2X_RX_MODE_NONE; + bnx2x_set_storm_rx_mode(bp); + ++ /* Disable HW interrupts, NAPI and Tx */ + bnx2x_netif_stop(bp, 1); + + del_timer_sync(&bp->timer); +@@ -6733,15 +8350,14 @@ + /* Release IRQs */ + bnx2x_free_irq(bp); + +- /* Wait until tx fast path tasks complete */ +- for_each_queue(bp, i) { ++ /* Wait until tx fastpath tasks complete */ ++ for_each_tx_queue(bp, i) { + struct bnx2x_fastpath *fp = &bp->fp[i]; + + cnt = 1000; +- smp_rmb(); + while (bnx2x_has_tx_work_unload(fp)) { + +- bnx2x_tx_int(fp, 1000); ++ bnx2x_tx_int(fp); + if (!cnt) { + BNX2X_ERR("timeout waiting for queue[%d]\n", + i); +@@ -6754,7 +8370,6 @@ + } + cnt--; + msleep(1); +- smp_rmb(); + } + } + /* Give HW time to discard old tx messages */ +@@ -6766,15 +8381,15 @@ + + bnx2x_set_mac_addr_e1(bp, 0); + +- for (i = 0; i < config->hdr.length_6b; i++) ++ for (i = 0; i < config->hdr.length; i++) + CAM_INVALIDATE(config->config_table[i]); + +- config->hdr.length_6b = i; ++ config->hdr.length = i; + if (CHIP_REV_IS_SLOW(bp)) + config->hdr.offset = BNX2X_MAX_EMUL_MULTI*(1 + port); + else + config->hdr.offset = BNX2X_MAX_MULTICAST*(1 + port); +- config->hdr.client_id = BP_CL_ID(bp); ++ config->hdr.client_id = bp->fp->cl_id; + config->hdr.reserved1 = 0; + + bnx2x_sp_post(bp, RAMROD_CMD_ID_ETH_SET_MAC, 0, +@@ -6838,11 +8453,11 @@ + if (!BP_NOMCP(bp)) + reset_code = bnx2x_fw_command(bp, reset_code); + else { +- DP(NETIF_MSG_IFDOWN, "NO MCP load counts %d, %d, %d\n", ++ DP(NETIF_MSG_IFDOWN, "NO MCP - load counts %d, %d, %d\n", + load_count[0], load_count[1], load_count[2]); + load_count[0]--; + load_count[1 + port]--; +- DP(NETIF_MSG_IFDOWN, "NO MCP new load counts %d, %d, %d\n", ++ DP(NETIF_MSG_IFDOWN, "NO MCP - new load counts %d, %d, %d\n", + load_count[0], load_count[1], load_count[2]); + if (load_count[0] == 0) + reset_code = FW_MSG_CODE_DRV_UNLOAD_COMMON; +@@ -6862,14 +8477,17 @@ + /* Report UNLOAD_DONE to MCP */ + if (!BP_NOMCP(bp)) + bnx2x_fw_command(bp, DRV_MSG_CODE_UNLOAD_DONE); ++ + bp->port.pmf = 0; + + /* Free SKBs, SGEs, TPA pool and driver internals */ + bnx2x_free_skbs(bp); +- for_each_queue(bp, i) ++ for_each_rx_queue(bp, i) + bnx2x_free_rx_sge_range(bp, bp->fp + i, NUM_RX_SGE); +- for_each_queue(bp, i) ++#if defined(BNX2X_NEW_NAPI) && (LINUX_VERSION_CODE >= 0x02061b) /* BNX2X_UPSTREAM */ ++ for_each_rx_queue(bp, i) + netif_napi_del(&bnx2x_fp(bp, i, napi)); ++#endif + bnx2x_free_mem(bp); + + bp->state = BNX2X_STATE_CLOSED; +@@ -6879,9 +8497,15 @@ + return 0; + } + ++#if defined(INIT_DELAYED_WORK_DEFERRABLE) || defined(INIT_WORK_NAR) || (VMWARE_ESX_DDK_VERSION >= 40000) /* BNX2X_UPSTREAM */ + static void bnx2x_reset_task(struct work_struct *work) + { + struct bnx2x *bp = container_of(work, struct bnx2x, reset_task); ++#else ++static void bnx2x_reset_task(void *data) ++{ ++ struct bnx2x *bp = (struct bnx2x *)data; ++#endif + + #ifdef BNX2X_STOP_ON_ERROR + BNX2X_ERR("reset task called but STOP_ON_ERROR defined" +@@ -6909,6 +8533,64 @@ + /* + * Init service functions + */ ++ ++static inline u32 bnx2x_get_pretend_reg(struct bnx2x *bp, int func) ++{ ++ switch (func) { ++ case 0: return PXP2_REG_PGL_PRETEND_FUNC_F0; ++ case 1: return PXP2_REG_PGL_PRETEND_FUNC_F1; ++ case 2: return PXP2_REG_PGL_PRETEND_FUNC_F2; ++ case 3: return PXP2_REG_PGL_PRETEND_FUNC_F3; ++ case 4: return PXP2_REG_PGL_PRETEND_FUNC_F4; ++ case 5: return PXP2_REG_PGL_PRETEND_FUNC_F5; ++ case 6: return PXP2_REG_PGL_PRETEND_FUNC_F6; ++ case 7: return PXP2_REG_PGL_PRETEND_FUNC_F7; ++ default: ++ BNX2X_ERR("Unsupported function index: %d\n", func); ++ return (u32)(-1); ++ } ++} ++ ++static void bnx2x_undi_int_disable_e1h(struct bnx2x *bp, int orig_func) ++{ ++ u32 reg = bnx2x_get_pretend_reg(bp, orig_func), new_val; ++ ++ /* Flush all outstanding writes */ ++ mmiowb(); ++ ++ /* Pretend to be function 0 */ ++ REG_WR(bp, reg, 0); ++ /* Flush the GRC transaction (in the chip) */ ++ new_val = REG_RD(bp, reg); ++ if (new_val != 0) { ++ BNX2X_ERR("Hmmm... Pretend register wasn't updated: (0,%d)!\n", ++ new_val); ++ BUG(); ++ } ++ ++ /* From now we are in the "like-E1" mode */ ++ bnx2x_int_disable(bp); ++ ++ /* Flush all outstanding writes */ ++ mmiowb(); ++ ++ /* Restore the original funtion settings */ ++ REG_WR(bp, reg, orig_func); ++ new_val = REG_RD(bp, reg); ++ if (new_val != orig_func) { ++ BNX2X_ERR("Hmmm... Pretend register wasn't updated: (%d,%d)!\n", ++ orig_func, new_val); ++ BUG(); ++ } ++} ++ ++static inline void bnx2x_undi_int_disable(struct bnx2x *bp, int func) ++{ ++ if (CHIP_IS_E1H(bp)) ++ bnx2x_undi_int_disable_e1h(bp, func); ++ else ++ bnx2x_int_disable(bp); ++} + + static void __devinit bnx2x_undi_unload(struct bnx2x *bp) + { +@@ -6960,8 +8642,7 @@ + /* now it's safe to release the lock */ + bnx2x_release_hw_lock(bp, HW_LOCK_RESOURCE_UNDI); + +- REG_WR(bp, (BP_PORT(bp) ? HC_REG_CONFIG_1 : +- HC_REG_CONFIG_0), 0x1000); ++ bnx2x_undi_int_disable(bp, func); + + /* close input traffic and wait for it */ + /* Do not rcv packets to BRB */ +@@ -7029,6 +8710,13 @@ + bp->link_params.chip_id = bp->common.chip_id; + BNX2X_DEV_INFO("chip ID is 0x%x\n", id); + ++ val = (REG_RD(bp, 0x2874) & 0x55); ++ if ((bp->common.chip_id & 0x1) || ++ (CHIP_IS_E1(bp) && val) || (CHIP_IS_E1H(bp) && (val == 0x55))) { ++ bp->flags |= ONE_PORT_FLAG; ++ BNX2X_DEV_INFO("single port device\n"); ++ } ++ + val = REG_RD(bp, MCP_REG_MCPR_NVM_CFG4); + bp->common.flash_size = (NVRAM_1MB_SIZE << + (val & MCPR_NVM_CFG4_FLASH_SIZE)); +@@ -7036,8 +8724,10 @@ + bp->common.flash_size, bp->common.flash_size); + + bp->common.shmem_base = REG_RD(bp, MISC_REG_SHARED_MEM_ADDR); ++ bp->common.shmem2_base = REG_RD(bp, MISC_REG_GENERIC_CR_0); + bp->link_params.shmem_base = bp->common.shmem_base; +- BNX2X_DEV_INFO("shmem offset is 0x%x\n", bp->common.shmem_base); ++ BNX2X_DEV_INFO("shmem offset 0x%x shmem2 offset 0x%x\n", ++ bp->common.shmem_base, bp->common.shmem2_base); + + if (!bp->common.shmem_base || + (bp->common.shmem_base < 0xA0000) || +@@ -7053,14 +8743,20 @@ + BNX2X_ERR("BAD MCP validity signature\n"); + + bp->common.hw_config = SHMEM_RD(bp, dev_info.shared_hw_config.config); +- bp->common.board = SHMEM_RD(bp, dev_info.shared_hw_config.board); +- +- BNX2X_DEV_INFO("hw_config 0x%08x board 0x%08x\n", +- bp->common.hw_config, bp->common.board); ++ BNX2X_DEV_INFO("hw_config 0x%08x\n", bp->common.hw_config); + + bp->link_params.hw_led_mode = ((bp->common.hw_config & + SHARED_HW_CFG_LED_MODE_MASK) >> + SHARED_HW_CFG_LED_MODE_SHIFT); ++ ++ bp->link_params.feature_config_flags = 0; ++ val = SHMEM_RD(bp, dev_info.shared_feature_config.config); ++ if (val & SHARED_FEAT_CFG_OVERRIDE_PREEMPHASIS_CFG_ENABLED) ++ bp->link_params.feature_config_flags |= ++ FEATURE_CONFIG_OVERRIDE_PREEMPHASIS_ENABLED; ++ else ++ bp->link_params.feature_config_flags &= ++ ~FEATURE_CONFIG_OVERRIDE_PREEMPHASIS_ENABLED; + + val = SHMEM_RD(bp, dev_info.bc_rev) >> 8; + bp->common.bc_ver = val; +@@ -7071,6 +8767,9 @@ + BNX2X_ERR("This driver needs bc_ver %X but found %X," + " please upgrade BC\n", BNX2X_BC_VER, val); + } ++ bp->link_params.feature_config_flags |= ++ (val >= REQ_BC_VER_4_VRFY_OPT_MDL) ? ++ FEATURE_CONFIG_BC_SUPPORTS_OPT_MDL_VRFY : 0; + + if (BP_E1HVN(bp) == 0) { + pci_read_config_word(bp->pdev, bp->pm_cap + PCI_PM_PMC, &pmc); +@@ -7080,7 +8779,7 @@ + bp->flags |= NO_WOL_FLAG; + } + BNX2X_DEV_INFO("%sWoL capable\n", +- (bp->flags & NO_WOL_FLAG) ? "Not " : ""); ++ (bp->flags & NO_WOL_FLAG) ? "not " : ""); + + val = SHMEM_RD(bp, dev_info.shared_hw_config.part_num); + val2 = SHMEM_RD(bp, dev_info.shared_hw_config.part_num[4]); +@@ -7173,27 +8872,6 @@ + SUPPORTED_Asym_Pause); + break; + +- case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8705: +- BNX2X_DEV_INFO("ext_phy_type 0x%x (8705)\n", +- ext_phy_type); +- +- bp->port.supported |= (SUPPORTED_10000baseT_Full | +- SUPPORTED_FIBRE | +- SUPPORTED_Pause | +- SUPPORTED_Asym_Pause); +- break; +- +- case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8706: +- BNX2X_DEV_INFO("ext_phy_type 0x%x (8706)\n", +- ext_phy_type); +- +- bp->port.supported |= (SUPPORTED_10000baseT_Full | +- SUPPORTED_1000baseT_Full | +- SUPPORTED_FIBRE | +- SUPPORTED_Pause | +- SUPPORTED_Asym_Pause); +- break; +- + case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8072: + BNX2X_DEV_INFO("ext_phy_type 0x%x (8072)\n", + ext_phy_type); +@@ -7219,11 +8897,72 @@ + SUPPORTED_Asym_Pause); + break; + ++ case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8705: ++ BNX2X_DEV_INFO("ext_phy_type 0x%x (8705)\n", ++ ext_phy_type); ++ ++ bp->port.supported |= (SUPPORTED_10000baseT_Full | ++ SUPPORTED_FIBRE | ++ SUPPORTED_Pause | ++ SUPPORTED_Asym_Pause); ++ break; ++ ++ case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8706: ++ BNX2X_DEV_INFO("ext_phy_type 0x%x (8706)\n", ++ ext_phy_type); ++ ++ bp->port.supported |= (SUPPORTED_10000baseT_Full | ++ SUPPORTED_1000baseT_Full | ++ SUPPORTED_FIBRE | ++ SUPPORTED_Pause | ++ SUPPORTED_Asym_Pause); ++ break; ++ ++ case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8726: ++ BNX2X_DEV_INFO("ext_phy_type 0x%x (8726)\n", ++ ext_phy_type); ++ ++ bp->port.supported |= (SUPPORTED_10000baseT_Full | ++ SUPPORTED_1000baseT_Full | ++ SUPPORTED_Autoneg | ++ SUPPORTED_FIBRE | ++ SUPPORTED_Pause | ++ SUPPORTED_Asym_Pause); ++ break; ++ ++ case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8727: ++ BNX2X_DEV_INFO("ext_phy_type 0x%x (8727)\n", ++ ext_phy_type); ++ ++ bp->port.supported |= (SUPPORTED_10000baseT_Full | ++ SUPPORTED_1000baseT_Full | ++ SUPPORTED_Autoneg | ++ SUPPORTED_FIBRE | ++ SUPPORTED_Pause | ++ SUPPORTED_Asym_Pause); ++ break; ++ + case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_SFX7101: + BNX2X_DEV_INFO("ext_phy_type 0x%x (SFX7101)\n", + ext_phy_type); + + bp->port.supported |= (SUPPORTED_10000baseT_Full | ++ SUPPORTED_TP | ++ SUPPORTED_Autoneg | ++ SUPPORTED_Pause | ++ SUPPORTED_Asym_Pause); ++ break; ++ ++ case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481: ++ BNX2X_DEV_INFO("ext_phy_type 0x%x (BCM8481)\n", ++ ext_phy_type); ++ ++ bp->port.supported |= (SUPPORTED_10baseT_Half | ++ SUPPORTED_10baseT_Full | ++ SUPPORTED_100baseT_Half | ++ SUPPORTED_100baseT_Full | ++ SUPPORTED_1000baseT_Full | ++ SUPPORTED_10000baseT_Full | + SUPPORTED_TP | + SUPPORTED_Autoneg | + SUPPORTED_Pause | +@@ -7440,9 +9179,9 @@ + + bp->link_params.req_flow_ctrl = (bp->port.link_config & + PORT_FEATURE_FLOW_CONTROL_MASK); +- if ((bp->link_params.req_flow_ctrl == FLOW_CTRL_AUTO) && ++ if ((bp->link_params.req_flow_ctrl == BNX2X_FLOW_CTRL_AUTO) && + !(bp->port.supported & SUPPORTED_Autoneg)) +- bp->link_params.req_flow_ctrl = FLOW_CTRL_NONE; ++ bp->link_params.req_flow_ctrl = BNX2X_FLOW_CTRL_NONE; + + BNX2X_DEV_INFO("req_line_speed %d req_duplex %d req_flow_ctrl 0x%x" + " advertising 0x%x\n", +@@ -7455,17 +9194,29 @@ + { + int port = BP_PORT(bp); + u32 val, val2; ++ u32 config; ++ u16 i; ++ u32 ext_phy_type; + + bp->link_params.bp = bp; + bp->link_params.port = port; + +- bp->link_params.serdes_config = +- SHMEM_RD(bp, dev_info.port_hw_config[port].serdes_config); + bp->link_params.lane_config = + SHMEM_RD(bp, dev_info.port_hw_config[port].lane_config); + bp->link_params.ext_phy_config = + SHMEM_RD(bp, + dev_info.port_hw_config[port].external_phy_config); ++ /* BCM8727_NOC => BCM8727 no over current */ ++ if (XGXS_EXT_PHY_TYPE(bp->link_params.ext_phy_config) == ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8727_NOC) { ++ bp->link_params.ext_phy_config &= ++ ~PORT_HW_CFG_XGXS_EXT_PHY_TYPE_MASK; ++ bp->link_params.ext_phy_config |= ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8727; ++ bp->link_params.feature_config_flags |= ++ FEATURE_CONFIG_BCM8727_NOC; ++ } ++ + bp->link_params.speed_cap_mask = + SHMEM_RD(bp, + dev_info.port_hw_config[port].speed_capability_mask); +@@ -7473,19 +9224,51 @@ + bp->port.link_config = + SHMEM_RD(bp, dev_info.port_feature_config[port].link_config); + +- BNX2X_DEV_INFO("serdes_config 0x%08x lane_config 0x%08x\n" +- KERN_INFO " ext_phy_config 0x%08x speed_cap_mask 0x%08x" +- " link_config 0x%08x\n", +- bp->link_params.serdes_config, ++ /* Get the 4 lanes xgxs config rx and tx */ ++ for (i = 0; i < 2; i++) { ++ val = SHMEM_RD(bp, ++ dev_info.port_hw_config[port].xgxs_config_rx[i<<1]); ++ bp->link_params.xgxs_config_rx[i << 1] = ((val>>16) & 0xffff); ++ bp->link_params.xgxs_config_rx[(i << 1) + 1] = (val & 0xffff); ++ ++ val = SHMEM_RD(bp, ++ dev_info.port_hw_config[port].xgxs_config_tx[i<<1]); ++ bp->link_params.xgxs_config_tx[i << 1] = ((val>>16) & 0xffff); ++ bp->link_params.xgxs_config_tx[(i << 1) + 1] = (val & 0xffff); ++ } ++ ++ /* If the device is capable of WoL, set the default state according ++ * to the HW ++ */ ++ config = SHMEM_RD(bp, dev_info.port_feature_config[port].config); ++ bp->wol = (!(bp->flags & NO_WOL_FLAG) && ++ (config & PORT_FEATURE_WOL_ENABLED)); ++ ++ BNX2X_DEV_INFO("lane_config 0x%08x ext_phy_config 0x%08x" ++ " speed_cap_mask 0x%08x link_config 0x%08x\n", + bp->link_params.lane_config, + bp->link_params.ext_phy_config, + bp->link_params.speed_cap_mask, bp->port.link_config); + +- bp->link_params.switch_cfg = (bp->port.link_config & +- PORT_FEATURE_CONNECTED_SWITCH_MASK); ++ bp->link_params.switch_cfg |= (bp->port.link_config & ++ PORT_FEATURE_CONNECTED_SWITCH_MASK); + bnx2x_link_settings_supported(bp, bp->link_params.switch_cfg); + + bnx2x_link_settings_requested(bp); ++ ++ /* ++ * If connected directly, work with the internal PHY, otherwise, work ++ * with the external PHY ++ */ ++ ext_phy_type = XGXS_EXT_PHY_TYPE(bp->link_params.ext_phy_config); ++ if (ext_phy_type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_DIRECT) ++ bp->mdio.prtad = bp->link_params.phy_addr; ++ ++ else if ((ext_phy_type != PORT_HW_CFG_XGXS_EXT_PHY_TYPE_FAILURE) && ++ (ext_phy_type != PORT_HW_CFG_XGXS_EXT_PHY_TYPE_NOT_CONN)) { ++ bp->mdio.prtad = ++ XGXS_EXT_PHY_ADDR(bp->link_params.ext_phy_config); ++ } + + val2 = SHMEM_RD(bp, dev_info.port_hw_config[port].mac_upper); + val = SHMEM_RD(bp, dev_info.port_hw_config[port].mac_lower); +@@ -7496,7 +9279,9 @@ + bp->dev->dev_addr[4] = (u8)(val >> 8 & 0xff); + bp->dev->dev_addr[5] = (u8)(val & 0xff); + memcpy(bp->link_params.mac_addr, bp->dev->dev_addr, ETH_ALEN); ++#ifdef ETHTOOL_GPERMADDR /* BNX2X_UPSTREAM */ + memcpy(bp->dev->perm_addr, bp->dev->dev_addr, ETH_ALEN); ++#endif + } + + static int __devinit bnx2x_get_hwinfo(struct bnx2x *bp) +@@ -7513,20 +9298,31 @@ + bp->mf_config = + SHMEM_RD(bp, mf_cfg.func_mf_config[func].config); + +- val = (SHMEM_RD(bp, mf_cfg.func_mf_config[func].e1hov_tag) & ++ val = (SHMEM_RD(bp, mf_cfg.func_mf_config[FUNC_0].e1hov_tag) & + FUNC_MF_CFG_E1HOV_TAG_MASK); +- if (val != FUNC_MF_CFG_E1HOV_TAG_DEFAULT) { +- +- bp->e1hov = val; ++ if (val != FUNC_MF_CFG_E1HOV_TAG_DEFAULT) + bp->e1hmf = 1; +- BNX2X_DEV_INFO("MF mode E1HOV for func %d is %d " +- "(0x%04x)\n", +- func, bp->e1hov, bp->e1hov); +- } else { +- BNX2X_DEV_INFO("Single function mode\n"); +- if (BP_E1HVN(bp)) { ++ BNX2X_DEV_INFO("%s function mode\n", ++ IS_E1HMF(bp) ? "multi" : "single"); ++ ++ if (IS_E1HMF(bp)) { ++ val = (SHMEM_RD(bp, mf_cfg.func_mf_config[func]. ++ e1hov_tag) & ++ FUNC_MF_CFG_E1HOV_TAG_MASK); ++ if (val != FUNC_MF_CFG_E1HOV_TAG_DEFAULT) { ++ bp->e1hov = val; ++ BNX2X_DEV_INFO("E1HOV for func %d is %d " ++ "(0x%04x)\n", ++ func, bp->e1hov, bp->e1hov); ++ } else { + BNX2X_ERR("!!! No valid E1HOV for func %d," + " aborting\n", func); ++ rc = -EPERM; ++ } ++ } else { ++ if (BP_E1HVN(bp)) { ++ BNX2X_ERR("!!! VN %d in single function mode," ++ " aborting\n", BP_E1HVN(bp)); + rc = -EPERM; + } + } +@@ -7553,8 +9349,10 @@ + bp->dev->dev_addr[5] = (u8)(val & 0xff); + memcpy(bp->link_params.mac_addr, bp->dev->dev_addr, + ETH_ALEN); ++#ifdef ETHTOOL_GPERMADDR /* BNX2X_UPSTREAM */ + memcpy(bp->dev->perm_addr, bp->dev->dev_addr, + ETH_ALEN); ++#endif + } + + return rc; +@@ -7562,26 +9360,189 @@ + + if (BP_NOMCP(bp)) { + /* only supposed to happen on emulation/FPGA */ ++#if (LINUX_VERSION_CODE >= 0x020618) /* BNX2X_UPSTREAM */ + BNX2X_ERR("warning random MAC workaround active\n"); + random_ether_addr(bp->dev->dev_addr); ++#else ++ BNX2X_ERR("warning constant MAC workaround active\n"); ++ bp->dev->dev_addr[0] = 0; ++ bp->dev->dev_addr[1] = 0x50; ++ bp->dev->dev_addr[2] = 0xc2; ++ bp->dev->dev_addr[3] = 0x2c; ++ bp->dev->dev_addr[4] = (func + 1) * 0x10; ++ bp->dev->dev_addr[5] = 0x00; ++ memcpy(bp->link_params.mac_addr, bp->dev->dev_addr, ETH_ALEN); ++#endif ++#ifdef ETHTOOL_GPERMADDR /* BNX2X_UPSTREAM */ + memcpy(bp->dev->perm_addr, bp->dev->dev_addr, ETH_ALEN); +- } +- +- return rc; +-} ++#endif ++ } ++ ++ return rc; ++} ++ ++#ifdef BNX2X_SAFC /* ! BNX2X_UPSTREAM */ ++static u16 bnx2x_select_queue(struct net_device *dev, struct sk_buff *skb); ++ ++static void __devinit bnx2x_init_safc(struct bnx2x *bp) ++{ ++ int i, cos, max_cos, max_queues; ++ ++ bp->flags &= ~SAFC_TX_FLAG; ++ ++ for (i = 0; i < BNX2X_MAX_PRIORITY; i++) ++ bp->pri_map[i] = 0; ++ ++ max_cos = BNX2X_MAX_COS; ++ bp->cos_weight_sum = 0; ++ for (cos = 0; cos < BNX2X_MAX_COS; cos++) { ++ bp->qs_per_cos[cos] = 0; ++ bp->cos_min_rate[cos] = 0; ++ } ++ ++ switch (bp->multi_mode) { ++ case ETH_RSS_MODE_DISABLED: ++ bp->qs_per_cos[0] = 1; ++ break; ++ ++ case ETH_RSS_MODE_REGULAR: ++ bp->qs_per_cos[0] = min_t(u32, num_online_cpus(), ++ BNX2X_MAX_QUEUES(bp)); ++ break; ++ ++ case ETH_RSS_MODE_VLAN_PRI: ++ case ETH_RSS_MODE_E1HOV_PRI: ++ if (CHIP_IS_E1H(bp)) { ++ bp->flags |= SAFC_TX_FLAG; ++ max_cos = BNX2X_MAX_TX_COS; ++ } ++ ++ /* fallthrough */ ++ ++ case ETH_RSS_MODE_IP_DSCP: ++ /* COS 0 must have at least 1 queue */ ++ if (BNX2X_COS_QUEUES(0) == 0) { ++ printk(KERN_ERR PFX ++ "Illegal number of queues per COS 0 " ++ "defaulting to 1\n"); ++ qs_per_cos |= 0x1; ++ } ++ ++ for (i = 0; i < BNX2X_MAX_PRIORITY; i++) { ++ cos = ((pri_map & (0xf << i*4)) >> i*4); ++ if (cos < max_cos) { ++ bp->pri_map[i] = cos; ++ if (BNX2X_COS_QUEUES(cos) == 0) { ++ printk(KERN_ERR PFX ++ "Illegal number of queues per " ++ "COS %d defaulting to 1\n", ++ cos); ++ qs_per_cos |= (0x1 << cos*8); ++ } ++ } else { ++ printk(KERN_ERR PFX ++ "Illegal COS (%d) for priority %d " ++ "defaulting to 0\n", cos, i); ++ pri_map &= ~(0xf << i*4); ++ bp->pri_map[i] = 0; ++ } ++ } ++ ++ max_queues = BNX2X_MAX_QUEUES(bp); ++ for (cos = 0; cos < BNX2X_MAX_COS; cos++) { ++ i = BNX2X_COS_QUEUES(cos); ++ if (i <= max_queues) { ++ bp->qs_per_cos[cos] = i; ++ max_queues -= i; ++ } else { ++ bp->qs_per_cos[cos] = max_queues; ++ max_queues = 0; ++ } ++ if (bp->qs_per_cos[cos] == 0) ++ for (i = 0; i < BNX2X_MAX_PRIORITY; i++) ++ if (bp->pri_map[i] == cos) { ++ printk(KERN_ERR PFX ++ "Illegal COS (%d) for " ++ "priority %d " ++ "defaulting to 0\n", ++ cos, i); ++ pri_map &= ~(0xf << i*4); ++ bp->pri_map[i] = 0; ++ } ++ } ++ ++ bp->dev->select_queue = bnx2x_select_queue; ++ ++ if (cos_min_rate == 0) ++ break; ++ ++ for (cos = 0; cos < BNX2X_MAX_COS; cos++) { ++ i = BNX2X_COS_RATE(cos); ++ if (i > 100) { ++ printk(KERN_ERR PFX ++ "Illegal rate (%d) for COS %d " ++ "defaulting to 100\n", i, cos); ++ i = 100; ++ cos_min_rate |= (i << cos*8); ++ } ++ i *= 100; ++ if (bp->qs_per_cos[cos]) { ++ if (i == 0) { ++ printk(KERN_ERR PFX ++ "Illegal rate for COS %d " ++ "defaulting to 1\n", cos); ++ i = DEF_MIN_RATE; ++ cos_min_rate |= (i << cos*8); ++ } ++ } else { ++ if (i) { ++ printk(KERN_ERR PFX ++ "Illegal rate (%d) for COS %d " ++ "with no queues " ++ "defaulting to 0\n", i, cos); ++ i = 0; ++ cos_min_rate &= ~(0xff << cos*8); ++ } ++ } ++ bp->cos_min_rate[cos] = i; ++ bp->cos_weight_sum += i; ++ } ++ break; ++ ++ default: ++ bp->multi_mode = ETH_RSS_MODE_DISABLED; ++ bp->qs_per_cos[0] = 1; ++ break; ++ } ++} ++#endif + + static int __devinit bnx2x_init_bp(struct bnx2x *bp) + { + int func = BP_FUNC(bp); ++ int timer_interval; + int rc; + + /* Disable interrupt handling until HW is initialized */ + atomic_set(&bp->intr_sem, 1); ++ smp_wmb(); /* Ensure that bp->intr_sem update is SMP-safe */ + + mutex_init(&bp->port.phy_mutex); + ++#if defined(INIT_DELAYED_WORK_DEFERRABLE) || defined(INIT_WORK_NAR) || (VMWARE_ESX_DDK_VERSION >= 40000) /* BNX2X_UPSTREAM */ ++#if (LINUX_VERSION_CODE >= 0x020614) /* BNX2X_UPSTREAM */ + INIT_DELAYED_WORK(&bp->sp_task, bnx2x_sp_task); ++#else ++ INIT_WORK(&bp->sp_task, bnx2x_sp_task); ++#endif + INIT_WORK(&bp->reset_task, bnx2x_reset_task); ++#else ++ INIT_WORK(&bp->sp_task, bnx2x_sp_task, bp); ++ INIT_WORK(&bp->reset_task, bnx2x_reset_task, bp); ++#endif ++#if (LINUX_VERSION_CODE < 0x020618) /* ! BNX2X_UPSTREAM */ ++ bp->sp_running = 0; ++#endif + + rc = bnx2x_get_hwinfo(bp); + +@@ -7596,27 +9557,65 @@ + printk(KERN_ERR PFX + "MCP disabled, must load devices in order!\n"); + ++ /* Set multi queue mode and priority mapping */ ++ if ((multi_mode != ETH_RSS_MODE_DISABLED) && ++ ((int_mode == INT_MODE_INTx) || (int_mode == INT_MODE_MSI))) { ++ printk(KERN_ERR PFX ++ "Multi disabled since int_mode requested is not MSI-X\n"); ++ multi_mode = ETH_RSS_MODE_DISABLED; ++ } ++ bp->multi_mode = multi_mode; ++ ++#ifdef BNX2X_SAFC /* ! BNX2X_UPSTREAM */ ++ bnx2x_init_safc(bp); ++#endif ++ + /* Set TPA flags */ + if (disable_tpa) { + bp->flags &= ~TPA_ENABLE_FLAG; ++#if (LINUX_VERSION_CODE >= 0x02061a) /* BNX2X_UPSTREAM */ + bp->dev->features &= ~NETIF_F_LRO; ++#endif + } else { + bp->flags |= TPA_ENABLE_FLAG; ++#if (LINUX_VERSION_CODE >= 0x02061a) /* BNX2X_UPSTREAM */ + bp->dev->features |= NETIF_F_LRO; +- } +- +- ++#endif ++ } ++ ++ if (CHIP_IS_E1(bp)) ++ bp->dropless_fc = 0; ++ else ++ bp->dropless_fc = dropless_fc; ++ ++ bp->mrrs = mrrs; ++ ++#if (LINUX_VERSION_CODE < 0x020618) /* ! BNX2X_UPSTREAM */ ++ /* MCP workaround */ ++ if (BP_NOMCP(bp)) { ++ /* [0x24c0]table size: ++ PCI_REG_GRC_PTR(func)->pci_msix_control = 0x10; */ ++ REG_WR(bp, 0x24c0, 0x10); ++ /* [0x24c4]table pointer: ++ PCI_REG_GRC_PTR(func)->pci_msix_tbl_off_bir = ++ 0x440000 + 0x2000*func; */ ++ REG_WR(bp, 0x24c4, 0x440000 + 0x2000*func); ++ /* [0x24c8]PBA pointer: ++ PCI_REG_GRC_PTR(func)->pci_msix_pba_off_bir = ++ 0x441800 + 0x2000*func; */ ++ REG_WR(bp, 0x24c8, 0x441800 + 0x2000*func); ++ } ++#endif + bp->tx_ring_size = MAX_TX_AVAIL; + bp->rx_ring_size = MAX_RX_AVAIL; + + bp->rx_csum = 1; +- bp->rx_offset = 0; + + bp->tx_ticks = 50; + bp->rx_ticks = 25; + +- bp->timer_interval = (CHIP_REV_IS_SLOW(bp) ? 5*HZ : HZ); +- bp->current_interval = (poll ? poll : bp->timer_interval); ++ timer_interval = (CHIP_REV_IS_SLOW(bp) ? 5*HZ : HZ); ++ bp->current_interval = (poll ? poll : timer_interval); + + init_timer(&bp->timer); + bp->timer.expires = jiffies + bp->current_interval; +@@ -7661,14 +9660,17 @@ + + switch (ext_phy_type) { + case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_DIRECT: ++ case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8072: ++ case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073: + case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8705: + case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8706: +- case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8072: +- case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073: ++ case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8726: ++ case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8727: + cmd->port = PORT_FIBRE; + break; + + case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_SFX7101: ++ case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481: + cmd->port = PORT_TP; + break; + +@@ -7685,7 +9687,7 @@ + } else + cmd->port = PORT_TP; + +- cmd->phy_address = bp->port.phy_addr; ++ cmd->phy_address = bp->mdio.prtad; + cmd->transceiver = XCVR_INTERNAL; + + if (bp->link_params.req_line_speed == SPEED_AUTO_NEG) +@@ -7858,6 +9860,81 @@ + return 0; + } + ++#define IS_E1_ONLINE(info) (((info) & RI_E1_ONLINE) == RI_E1_ONLINE) ++#define IS_E1H_ONLINE(info) (((info) & RI_E1H_ONLINE) == RI_E1H_ONLINE) ++ ++static int bnx2x_get_regs_len(struct net_device *dev) ++{ ++ struct bnx2x *bp = netdev_priv(dev); ++ int regdump_len = 0; ++ int i; ++ ++ if (CHIP_IS_E1(bp)) { ++ for (i = 0; i < REGS_COUNT; i++) ++ if (IS_E1_ONLINE(reg_addrs[i].info)) ++ regdump_len += reg_addrs[i].size; ++ ++ for (i = 0; i < WREGS_COUNT_E1; i++) ++ if (IS_E1_ONLINE(wreg_addrs_e1[i].info)) ++ regdump_len += wreg_addrs_e1[i].size * ++ (1 + wreg_addrs_e1[i].read_regs_count); ++ ++ } else { /* E1H */ ++ for (i = 0; i < REGS_COUNT; i++) ++ if (IS_E1H_ONLINE(reg_addrs[i].info)) ++ regdump_len += reg_addrs[i].size; ++ ++ for (i = 0; i < WREGS_COUNT_E1H; i++) ++ if (IS_E1H_ONLINE(wreg_addrs_e1h[i].info)) ++ regdump_len += wreg_addrs_e1h[i].size * ++ (1 + wreg_addrs_e1h[i].read_regs_count); ++ } ++ regdump_len *= 4; ++ regdump_len += sizeof(struct dump_hdr); ++ ++ return regdump_len; ++} ++ ++static void bnx2x_get_regs(struct net_device *dev, ++ struct ethtool_regs *regs, void *_p) ++{ ++ u32 *p = _p, i, j; ++ struct bnx2x *bp = netdev_priv(dev); ++ struct dump_hdr dump_hdr = {0}; ++ ++ regs->version = 0; ++ memset(p, 0, regs->len); ++ ++ if (!netif_running(bp->dev)) ++ return; ++ ++ dump_hdr.hdr_size = (sizeof(struct dump_hdr) / 4) - 1; ++ dump_hdr.dump_sign = dump_sign_all; ++ dump_hdr.xstorm_waitp = REG_RD(bp, XSTORM_WAITP_ADDR); ++ dump_hdr.tstorm_waitp = REG_RD(bp, TSTORM_WAITP_ADDR); ++ dump_hdr.ustorm_waitp = REG_RD(bp, USTORM_WAITP_ADDR); ++ dump_hdr.cstorm_waitp = REG_RD(bp, CSTORM_WAITP_ADDR); ++ dump_hdr.info = CHIP_IS_E1(bp) ? RI_E1_ONLINE : RI_E1H_ONLINE; ++ ++ memcpy(p, &dump_hdr, sizeof(struct dump_hdr)); ++ p += dump_hdr.hdr_size + 1; ++ ++ if (CHIP_IS_E1(bp)) { ++ for (i = 0; i < REGS_COUNT; i++) ++ if (IS_E1_ONLINE(reg_addrs[i].info)) ++ for (j = 0; j < reg_addrs[i].size; j++) ++ *p++ = REG_RD(bp, ++ reg_addrs[i].addr + j*4); ++ ++ } else { /* E1H */ ++ for (i = 0; i < REGS_COUNT; i++) ++ if (IS_E1H_ONLINE(reg_addrs[i].info)) ++ for (j = 0; j < reg_addrs[i].size; j++) ++ *p++ = REG_RD(bp, ++ reg_addrs[i].addr + j*4); ++ } ++} ++ + #define PHY_FW_VER_LEN 10 + + static void bnx2x_get_drvinfo(struct net_device *dev, +@@ -7887,7 +9964,7 @@ + info->n_stats = BNX2X_NUM_STATS; + info->testinfo_len = BNX2X_NUM_TESTS; + info->eedump_len = bp->common.flash_size; +- info->regdump_len = 0; ++ info->regdump_len = bnx2x_get_regs_len(dev); + } + + static void bnx2x_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol) +@@ -7955,12 +10032,14 @@ + return 0; + } + ++#if (LINUX_VERSION_CODE >= 0x020418) /* BNX2X_UPSTREAM */ + static int bnx2x_get_eeprom_len(struct net_device *dev) + { + struct bnx2x *bp = netdev_priv(dev); + + return bp->common.flash_size; + } ++#endif + + static int bnx2x_acquire_nvram_lock(struct bnx2x *bp) + { +@@ -8048,7 +10127,7 @@ + MCPR_NVM_ACCESS_ENABLE_WR_EN))); + } + +-static int bnx2x_nvram_read_dword(struct bnx2x *bp, u32 offset, u32 *ret_val, ++static int bnx2x_nvram_read_dword(struct bnx2x *bp, u32 offset, __be32 *ret_val, + u32 cmd_flags) + { + int count, i, rc; +@@ -8084,8 +10163,7 @@ + /* we read nvram data in cpu order + * but ethtool sees it as an array of bytes + * converting to big-endian will do the work */ +- val = cpu_to_be32(val); +- *ret_val = val; ++ *ret_val = cpu_to_be32(val); + rc = 0; + break; + } +@@ -8099,7 +10177,7 @@ + { + int rc; + u32 cmd_flags; +- u32 val; ++ __be32 val; + + if ((offset & 0x03) || (buf_size & 0x03) || (buf_size == 0)) { + DP(BNX2X_MSG_NVM, +@@ -8218,7 +10296,7 @@ + int rc; + u32 cmd_flags; + u32 align_offset; +- u32 val; ++ __be32 val; + + if (offset + buf_size > bp->common.flash_size) { + DP(BNX2X_MSG_NVM, "Invalid parameter: offset (0x%x) +" +@@ -8323,7 +10401,8 @@ + struct ethtool_eeprom *eeprom, u8 *eebuf) + { + struct bnx2x *bp = netdev_priv(dev); +- int rc; ++ int port = BP_PORT(bp); ++ int rc = 0; + + if (!netif_running(dev)) + return -EAGAIN; +@@ -8335,27 +10414,60 @@ + + /* parameters already validated in ethtool_set_eeprom */ + +- /* If the magic number is PHY (0x00504859) upgrade the PHY FW */ +- if (eeprom->magic == 0x00504859) +- if (bp->port.pmf) { +- ++ /* PHY eeprom can be accessed only by the PMF */ ++ if ((eeprom->magic >= 0x50485900) && (eeprom->magic <= 0x504859FF) && ++ !bp->port.pmf) ++ return -EINVAL; ++ ++ if (eeprom->magic == 0x50485950) { ++ /* 'PHYP' (0x50485950): prepare phy for FW upgrade */ ++ bnx2x_stats_handle(bp, STATS_EVENT_STOP); ++ ++ bnx2x_acquire_phy_lock(bp); ++ rc |= bnx2x_link_reset(&bp->link_params, ++ &bp->link_vars, 0); ++ if (XGXS_EXT_PHY_TYPE(bp->link_params.ext_phy_config) == ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_SFX7101) ++ bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_0, ++ MISC_REGISTERS_GPIO_HIGH, port); ++ bnx2x_release_phy_lock(bp); ++ bnx2x_link_report(bp); ++ ++ } else if (eeprom->magic == 0x50485952) { ++ /* 'PHYR' (0x50485952): re-init link after FW upgrade */ ++ if ((bp->state == BNX2X_STATE_OPEN) || ++ (bp->state == BNX2X_STATE_DISABLED)) { + bnx2x_acquire_phy_lock(bp); +- rc = bnx2x_flash_download(bp, BP_PORT(bp), +- bp->link_params.ext_phy_config, +- (bp->state != BNX2X_STATE_CLOSED), +- eebuf, eeprom->len); +- if ((bp->state == BNX2X_STATE_OPEN) || +- (bp->state == BNX2X_STATE_DISABLED)) { +- rc |= bnx2x_link_reset(&bp->link_params, +- &bp->link_vars); +- rc |= bnx2x_phy_init(&bp->link_params, +- &bp->link_vars); +- } ++ rc |= bnx2x_link_reset(&bp->link_params, ++ &bp->link_vars, 1); ++ ++ rc |= bnx2x_phy_init(&bp->link_params, ++ &bp->link_vars); + bnx2x_release_phy_lock(bp); +- +- } else /* Only the PMF can access the PHY */ +- return -EINVAL; +- else ++ bnx2x_calc_fc_adv(bp); ++ } ++ } else if (eeprom->magic == 0x53985943) { ++ /* 'PHYC' (0x53985943): PHY FW upgrade completed */ ++ if (XGXS_EXT_PHY_TYPE(bp->link_params.ext_phy_config) == ++ PORT_HW_CFG_XGXS_EXT_PHY_TYPE_SFX7101) { ++ u8 ext_phy_addr = ++ XGXS_EXT_PHY_ADDR(bp->link_params.ext_phy_config); ++ ++ /* DSP Remove Download Mode */ ++ bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_0, ++ MISC_REGISTERS_GPIO_LOW, port); ++ ++ bnx2x_acquire_phy_lock(bp); ++ ++ bnx2x_sfx7101_sp_sw_reset(bp, port, ext_phy_addr); ++ ++ /* wait 0.5 sec to allow it to run */ ++ msleep(500); ++ bnx2x_ext_phy_hw_reset(bp, port); ++ msleep(500); ++ bnx2x_release_phy_lock(bp); ++ } ++ } else + rc = bnx2x_nvram_write(bp, eeprom->offset, eebuf, eeprom->len); + + return rc; +@@ -8374,18 +10486,19 @@ + return 0; + } + ++#define BNX2X_MAX_COALES_TOUT (0xf0*12) /* Maximal coalescing timeout in us */ + static int bnx2x_set_coalesce(struct net_device *dev, + struct ethtool_coalesce *coal) + { + struct bnx2x *bp = netdev_priv(dev); + + bp->rx_ticks = (u16) coal->rx_coalesce_usecs; +- if (bp->rx_ticks > 3000) +- bp->rx_ticks = 3000; ++ if (bp->rx_ticks > BNX2X_MAX_COALES_TOUT) ++ bp->rx_ticks = BNX2X_MAX_COALES_TOUT; + + bp->tx_ticks = (u16) coal->tx_coalesce_usecs; +- if (bp->tx_ticks > 0x3000) +- bp->tx_ticks = 0x3000; ++ if (bp->tx_ticks > BNX2X_MAX_COALES_TOUT) ++ bp->tx_ticks = BNX2X_MAX_COALES_TOUT; + + if (netif_running(dev)) + bnx2x_update_coalesce(bp); +@@ -8437,13 +10550,14 @@ + { + struct bnx2x *bp = netdev_priv(dev); + +- epause->autoneg = (bp->link_params.req_flow_ctrl == FLOW_CTRL_AUTO) && ++ epause->autoneg = (bp->link_params.req_flow_ctrl == ++ BNX2X_FLOW_CTRL_AUTO) && + (bp->link_params.req_line_speed == SPEED_AUTO_NEG); + +- epause->rx_pause = ((bp->link_vars.flow_ctrl & FLOW_CTRL_RX) == +- FLOW_CTRL_RX); +- epause->tx_pause = ((bp->link_vars.flow_ctrl & FLOW_CTRL_TX) == +- FLOW_CTRL_TX); ++ epause->rx_pause = ((bp->link_vars.flow_ctrl & BNX2X_FLOW_CTRL_RX) == ++ BNX2X_FLOW_CTRL_RX); ++ epause->tx_pause = ((bp->link_vars.flow_ctrl & BNX2X_FLOW_CTRL_TX) == ++ BNX2X_FLOW_CTRL_TX); + + DP(NETIF_MSG_LINK, "ethtool_pauseparam: cmd %d\n" + DP_LEVEL " autoneg %d rx_pause %d tx_pause %d\n", +@@ -8462,16 +10576,16 @@ + DP_LEVEL " autoneg %d rx_pause %d tx_pause %d\n", + epause->cmd, epause->autoneg, epause->rx_pause, epause->tx_pause); + +- bp->link_params.req_flow_ctrl = FLOW_CTRL_AUTO; ++ bp->link_params.req_flow_ctrl = BNX2X_FLOW_CTRL_AUTO; + + if (epause->rx_pause) +- bp->link_params.req_flow_ctrl |= FLOW_CTRL_RX; ++ bp->link_params.req_flow_ctrl |= BNX2X_FLOW_CTRL_RX; + + if (epause->tx_pause) +- bp->link_params.req_flow_ctrl |= FLOW_CTRL_TX; +- +- if (bp->link_params.req_flow_ctrl == FLOW_CTRL_AUTO) +- bp->link_params.req_flow_ctrl = FLOW_CTRL_NONE; ++ bp->link_params.req_flow_ctrl |= BNX2X_FLOW_CTRL_TX; ++ ++ if (bp->link_params.req_flow_ctrl == BNX2X_FLOW_CTRL_AUTO) ++ bp->link_params.req_flow_ctrl = BNX2X_FLOW_CTRL_NONE; + + if (epause->autoneg) { + if (!(bp->port.supported & SUPPORTED_Autoneg)) { +@@ -8480,7 +10594,7 @@ + } + + if (bp->link_params.req_line_speed == SPEED_AUTO_NEG) +- bp->link_params.req_flow_ctrl = FLOW_CTRL_AUTO; ++ bp->link_params.req_flow_ctrl = BNX2X_FLOW_CTRL_AUTO; + } + + DP(NETIF_MSG_LINK, +@@ -8494,6 +10608,7 @@ + return 0; + } + ++#if (LINUX_VERSION_CODE >= 0x02061a) /* BNX2X_UPSTREAM */ + static int bnx2x_set_flags(struct net_device *dev, u32 data) + { + struct bnx2x *bp = netdev_priv(dev); +@@ -8521,6 +10636,7 @@ + + return rc; + } ++#endif + + static u32 bnx2x_get_rx_csum(struct net_device *dev) + { +@@ -8539,26 +10655,40 @@ + /* Disable TPA, when Rx CSUM is disabled. Otherwise all + TPA'ed packets will be discarded due to wrong TCP CSUM */ + if (!data) { ++#if (LINUX_VERSION_CODE >= 0x02061a) /* BNX2X_UPSTREAM */ + u32 flags = ethtool_op_get_flags(dev); + + rc = bnx2x_set_flags(dev, (flags & ~ETH_FLAG_LRO)); +- } +- +- return rc; +-} +- ++#else ++ bp->flags &= ~TPA_ENABLE_FLAG; ++ if (netif_running(dev)) { ++ bnx2x_nic_unload(bp, UNLOAD_NORMAL); ++ rc = bnx2x_nic_load(bp, LOAD_NORMAL); ++ } ++#endif ++ } ++ ++ return rc; ++} ++ ++#ifdef NETIF_F_TSO /* BNX2X_UPSTREAM */ + static int bnx2x_set_tso(struct net_device *dev, u32 data) + { + if (data) { + dev->features |= (NETIF_F_TSO | NETIF_F_TSO_ECN); ++#ifdef NETIF_F_TSO6 /* BNX2X_UPSTREAM */ + dev->features |= NETIF_F_TSO6; ++#endif + } else { + dev->features &= ~(NETIF_F_TSO | NETIF_F_TSO_ECN); ++#ifdef NETIF_F_TSO6 /* BNX2X_UPSTREAM */ + dev->features &= ~NETIF_F_TSO6; +- } +- +- return 0; +-} ++#endif ++ } ++ ++ return 0; ++} ++#endif + + static const struct { + char string[ETH_GSTRING_LEN]; +@@ -8569,8 +10699,7 @@ + { "nvram_test (online)" }, + { "interrupt_test (online)" }, + { "link_test (online)" }, +- { "idle check (online)" }, +- { "MC errors (online)" } ++ { "idle check (online)" } + }; + + static int bnx2x_self_test_count(struct net_device *dev) +@@ -8745,12 +10874,14 @@ + unsigned int pkt_size, num_pkts, i; + struct sk_buff *skb; + unsigned char *packet; +- struct bnx2x_fastpath *fp = &bp->fp[0]; ++ struct bnx2x_fastpath *fp_rx = &bp->fp[0]; ++ struct bnx2x_fastpath *fp_tx = &bp->fp[bp->num_rx_queues]; + u16 tx_start_idx, tx_idx; + u16 rx_start_idx, rx_idx; +- u16 pkt_prod; ++ u16 pkt_prod, bd_prod; + struct sw_tx_bd *tx_buf; +- struct eth_tx_bd *tx_bd; ++ struct eth_tx_start_bd *tx_start_bd; ++ struct eth_tx_parse_bd *pbd = NULL; + dma_addr_t mapping; + union eth_rx_cqe *cqe; + u8 cqe_fp_flags; +@@ -8758,23 +10889,23 @@ + u16 len; + int rc = -ENODEV; + +- if (loopback_mode == BNX2X_MAC_LOOPBACK) { ++ /* check the loopback mode */ ++ switch (loopback_mode) { ++ case BNX2X_PHY_LOOPBACK: ++ if (bp->link_params.loopback_mode != LOOPBACK_XGXS_10) ++ return -EINVAL; ++ break; ++ case BNX2X_MAC_LOOPBACK: + bp->link_params.loopback_mode = LOOPBACK_BMAC; + bnx2x_phy_init(&bp->link_params, &bp->link_vars); +- +- } else if (loopback_mode == BNX2X_PHY_LOOPBACK) { +- u16 cnt = 1000; +- bp->link_params.loopback_mode = LOOPBACK_XGXS_10; +- bnx2x_phy_init(&bp->link_params, &bp->link_vars); +- /* wait until link state is restored */ +- if (link_up) +- while (cnt-- && bnx2x_test_link(&bp->link_params, +- &bp->link_vars)) +- msleep(10); +- } else +- return -EINVAL; +- +- pkt_size = 1514; ++ break; ++ default: ++ return -EINVAL; ++ } ++ ++ /* prepare the loopback packet */ ++ pkt_size = (((bp->dev->mtu < ETH_MAX_PACKET_SIZE) ? ++ bp->dev->mtu : ETH_MAX_PACKET_SIZE) + ETH_HLEN); + skb = netdev_alloc_skb(bp->dev, bp->rx_buf_size); + if (!skb) { + rc = -ENOMEM; +@@ -8786,54 +10917,59 @@ + for (i = ETH_HLEN; i < pkt_size; i++) + packet[i] = (unsigned char) (i & 0xff); + ++ /* send the loopback packet */ + num_pkts = 0; +- tx_start_idx = le16_to_cpu(*fp->tx_cons_sb); +- rx_start_idx = le16_to_cpu(*fp->rx_cons_sb); +- +- pkt_prod = fp->tx_pkt_prod++; +- tx_buf = &fp->tx_buf_ring[TX_BD(pkt_prod)]; +- tx_buf->first_bd = fp->tx_bd_prod; ++ tx_start_idx = le16_to_cpu(*fp_tx->tx_cons_sb); ++ rx_start_idx = le16_to_cpu(*fp_rx->rx_cons_sb); ++ ++ pkt_prod = fp_tx->tx_pkt_prod++; ++ tx_buf = &fp_tx->tx_buf_ring[TX_BD(pkt_prod)]; ++ tx_buf->first_bd = fp_tx->tx_bd_prod; + tx_buf->skb = skb; +- +- tx_bd = &fp->tx_desc_ring[TX_BD(fp->tx_bd_prod)]; ++ tx_buf->flags = 0; ++ ++ bd_prod = TX_BD(fp_tx->tx_bd_prod); ++ tx_start_bd = &fp_tx->tx_desc_ring[bd_prod].start_bd; + mapping = pci_map_single(bp->pdev, skb->data, + skb_headlen(skb), PCI_DMA_TODEVICE); +- tx_bd->addr_hi = cpu_to_le32(U64_HI(mapping)); +- tx_bd->addr_lo = cpu_to_le32(U64_LO(mapping)); +- tx_bd->nbd = cpu_to_le16(1); +- tx_bd->nbytes = cpu_to_le16(skb_headlen(skb)); +- tx_bd->vlan = cpu_to_le16(pkt_prod); +- tx_bd->bd_flags.as_bitfield = (ETH_TX_BD_FLAGS_START_BD | +- ETH_TX_BD_FLAGS_END_BD); +- tx_bd->general_data = ((UNICAST_ADDRESS << +- ETH_TX_BD_ETH_ADDR_TYPE_SHIFT) | 1); ++ tx_start_bd->addr_hi = cpu_to_le32(U64_HI(mapping)); ++ tx_start_bd->addr_lo = cpu_to_le32(U64_LO(mapping)); ++ tx_start_bd->nbd = cpu_to_le16(2); /* start + pbd */ ++ tx_start_bd->nbytes = cpu_to_le16(skb_headlen(skb)); ++ tx_start_bd->vlan = cpu_to_le16(pkt_prod); ++ tx_start_bd->bd_flags.as_bitfield = ETH_TX_BD_FLAGS_START_BD; ++ tx_start_bd->general_data = ((UNICAST_ADDRESS << ++ ETH_TX_START_BD_ETH_ADDR_TYPE_SHIFT) | 1); ++ ++ /* turn on parsing and get a BD */ ++ bd_prod = TX_BD(NEXT_TX_IDX(bd_prod)); ++ pbd = &fp_tx->tx_desc_ring[bd_prod].parse_bd; ++ ++ memset(pbd, 0, sizeof(struct eth_tx_parse_bd)); + + wmb(); + +- fp->hw_tx_prods->bds_prod = +- cpu_to_le16(le16_to_cpu(fp->hw_tx_prods->bds_prod) + 1); +- mb(); /* FW restriction: must not reorder writing nbd and packets */ +- fp->hw_tx_prods->packets_prod = +- cpu_to_le32(le32_to_cpu(fp->hw_tx_prods->packets_prod) + 1); +- DOORBELL(bp, FP_IDX(fp), 0); ++ fp_tx->tx_db.data.prod += 2; ++ barrier(); ++ DOORBELL(bp, fp_tx->index - bp->num_rx_queues, fp_tx->tx_db.raw); + + mmiowb(); + + num_pkts++; +- fp->tx_bd_prod++; ++ fp_tx->tx_bd_prod += 2; /* start + pbd */ + bp->dev->trans_start = jiffies; + + udelay(100); + +- tx_idx = le16_to_cpu(*fp->tx_cons_sb); ++ tx_idx = le16_to_cpu(*fp_tx->tx_cons_sb); + if (tx_idx != tx_start_idx + num_pkts) + goto test_loopback_exit; + +- rx_idx = le16_to_cpu(*fp->rx_cons_sb); ++ rx_idx = le16_to_cpu(*fp_rx->rx_cons_sb); + if (rx_idx != rx_start_idx + num_pkts) + goto test_loopback_exit; + +- cqe = &fp->rx_comp_ring[RCQ_BD(fp->rx_comp_cons)]; ++ cqe = &fp_rx->rx_comp_ring[RCQ_BD(fp_rx->rx_comp_cons)]; + cqe_fp_flags = cqe->fast_path_cqe.type_error_flags; + if (CQE_TYPE(cqe_fp_flags) || (cqe_fp_flags & ETH_RX_ERROR_FALGS)) + goto test_loopback_rx_exit; +@@ -8842,7 +10978,7 @@ + if (len != pkt_size) + goto test_loopback_rx_exit; + +- rx_buf = &fp->rx_buf_ring[RX_BD(fp->rx_bd_cons)]; ++ rx_buf = &fp_rx->rx_buf_ring[RX_BD(fp_rx->rx_bd_cons)]; + skb = rx_buf->skb; + skb_reserve(skb, cqe->fast_path_cqe.placement_offset); + for (i = ETH_HLEN; i < pkt_size; i++) +@@ -8852,16 +10988,18 @@ + rc = 0; + + test_loopback_rx_exit: ++#if (LINUX_VERSION_CODE < 0x02061b) /* ! BNX2X_UPSTREAM */ + bp->dev->last_rx = jiffies; +- +- fp->rx_bd_cons = NEXT_RX_IDX(fp->rx_bd_cons); +- fp->rx_bd_prod = NEXT_RX_IDX(fp->rx_bd_prod); +- fp->rx_comp_cons = NEXT_RCQ_IDX(fp->rx_comp_cons); +- fp->rx_comp_prod = NEXT_RCQ_IDX(fp->rx_comp_prod); ++#endif ++ ++ fp_rx->rx_bd_cons = NEXT_RX_IDX(fp_rx->rx_bd_cons); ++ fp_rx->rx_bd_prod = NEXT_RX_IDX(fp_rx->rx_bd_prod); ++ fp_rx->rx_comp_cons = NEXT_RCQ_IDX(fp_rx->rx_comp_cons); ++ fp_rx->rx_comp_prod = NEXT_RCQ_IDX(fp_rx->rx_comp_prod); + + /* Update producers */ +- bnx2x_update_rx_prod(bp, fp, fp->rx_bd_prod, fp->rx_comp_prod, +- fp->rx_sge_prod); ++ bnx2x_update_rx_prod(bp, fp_rx, fp_rx->rx_bd_prod, fp_rx->rx_comp_prod, ++ fp_rx->rx_sge_prod); + + test_loopback_exit: + bp->link_params.loopback_mode = LOOPBACK_NONE; +@@ -8871,7 +11009,7 @@ + + static int bnx2x_test_loopback(struct bnx2x *bp, u8 link_up) + { +- int rc = 0; ++ int rc = 0, res; + + if (!netif_running(bp->dev)) + return BNX2X_LOOPBACK_FAILED; +@@ -8879,14 +11017,16 @@ + bnx2x_netif_stop(bp, 1); + bnx2x_acquire_phy_lock(bp); + +- if (bnx2x_run_loopback(bp, BNX2X_MAC_LOOPBACK, link_up)) { +- DP(NETIF_MSG_PROBE, "MAC loopback failed\n"); ++ res = bnx2x_run_loopback(bp, BNX2X_PHY_LOOPBACK, link_up); ++ if (res) { ++ DP(NETIF_MSG_PROBE, " PHY loopback failed (res %d)\n", res); ++ rc |= BNX2X_PHY_LOOPBACK_FAILED; ++ } ++ ++ res = bnx2x_run_loopback(bp, BNX2X_MAC_LOOPBACK, link_up); ++ if (res) { ++ DP(NETIF_MSG_PROBE, " MAC loopback failed (res %d)\n", res); + rc |= BNX2X_MAC_LOOPBACK_FAILED; +- } +- +- if (bnx2x_run_loopback(bp, BNX2X_PHY_LOOPBACK, link_up)) { +- DP(NETIF_MSG_PROBE, "PHY loopback failed\n"); +- rc |= BNX2X_PHY_LOOPBACK_FAILED; + } + + bnx2x_release_phy_lock(bp); +@@ -8913,14 +11053,14 @@ + { 0x778, 0x70 }, + { 0, 0 } + }; +- u32 buf[0x350 / 4]; ++ __be32 buf[0x350 / 4]; + u8 *data = (u8 *)buf; + int i, rc; +- u32 magic, csum; ++ u32 magic, crc; + + rc = bnx2x_nvram_read(bp, 0, data, 4); + if (rc) { +- DP(NETIF_MSG_PROBE, "magic value read (rc -%d)\n", -rc); ++ DP(NETIF_MSG_PROBE, "magic value read (rc %d)\n", rc); + goto test_nvram_exit; + } + +@@ -8937,14 +11077,14 @@ + nvram_tbl[i].size); + if (rc) { + DP(NETIF_MSG_PROBE, +- "nvram_tbl[%d] read data (rc -%d)\n", i, -rc); ++ "nvram_tbl[%d] read data (rc %d)\n", i, rc); + goto test_nvram_exit; + } + +- csum = ether_crc_le(nvram_tbl[i].size, data); +- if (csum != CRC32_RESIDUAL) { ++ crc = ether_crc_le(nvram_tbl[i].size, data); ++ if (crc != CRC32_RESIDUAL) { + DP(NETIF_MSG_PROBE, +- "nvram_tbl[%d] csum value (0x%08x)\n", i, csum); ++ "nvram_tbl[%d] crc value (0x%08x)\n", i, crc); + rc = -ENODEV; + goto test_nvram_exit; + } +@@ -8962,12 +11102,12 @@ + if (!netif_running(bp->dev)) + return -ENODEV; + +- config->hdr.length_6b = 0; ++ config->hdr.length = 0; + if (CHIP_IS_E1(bp)) + config->hdr.offset = (BP_PORT(bp) ? 32 : 0); + else + config->hdr.offset = BP_FUNC(bp); +- config->hdr.client_id = BP_CL_ID(bp); ++ config->hdr.client_id = bp->fp->cl_id; + config->hdr.reserved1 = 0; + + rc = bnx2x_sp_post(bp, RAMROD_CMD_ID_ETH_SET_MAC, 0, +@@ -9040,14 +11180,44 @@ + buf[5] = 1; + etest->flags |= ETH_TEST_FL_FAILED; + } +- buf[7] = bnx2x_mc_assert(bp); +- if (buf[7] != 0) ++#ifndef BNX2X_UPSTREAM /* ! BNX2X_UPSTREAM */ ++ /* run the idle check twice */ ++ bnx2x_idle_chk(bp); ++ buf[6] = bnx2x_idle_chk(bp); ++ if (buf[6] != 0) + etest->flags |= ETH_TEST_FL_FAILED; ++#endif + + #ifdef BNX2X_EXTRA_DEBUG + bnx2x_panic_dump(bp); + #endif + } ++ ++static const struct { ++ long offset; ++ int size; ++ u8 string[ETH_GSTRING_LEN]; ++} bnx2x_q_stats_arr[BNX2X_NUM_Q_STATS] = { ++/* 1 */ { Q_STATS_OFFSET32(total_bytes_received_hi), 8, "[%d]: rx_bytes" }, ++ { Q_STATS_OFFSET32(error_bytes_received_hi), ++ 8, "[%d]: rx_error_bytes" }, ++ { Q_STATS_OFFSET32(total_unicast_packets_received_hi), ++ 8, "[%d]: rx_ucast_packets" }, ++ { Q_STATS_OFFSET32(total_multicast_packets_received_hi), ++ 8, "[%d]: rx_mcast_packets" }, ++ { Q_STATS_OFFSET32(total_broadcast_packets_received_hi), ++ 8, "[%d]: rx_bcast_packets" }, ++ { Q_STATS_OFFSET32(no_buff_discard_hi), 8, "[%d]: rx_discards" }, ++ { Q_STATS_OFFSET32(rx_err_discard_pkt), ++ 4, "[%d]: rx_phy_ip_err_discards"}, ++ { Q_STATS_OFFSET32(rx_skb_alloc_failed), ++ 4, "[%d]: rx_skb_alloc_discard" }, ++ { Q_STATS_OFFSET32(hw_csum_err), 4, "[%d]: rx_csum_offload_errors" }, ++ ++/* 10 */{ Q_STATS_OFFSET32(total_bytes_transmitted_hi), 8, "[%d]: tx_bytes" }, ++ { Q_STATS_OFFSET32(total_unicast_packets_transmitted_hi), ++ 8, "[%d]: tx_packets" } ++}; + + static const struct { + long offset; +@@ -9055,37 +11225,69 @@ + u32 flags; + #define STATS_FLAGS_PORT 1 + #define STATS_FLAGS_FUNC 2 ++#define STATS_FLAGS_BOTH (STATS_FLAGS_FUNC | STATS_FLAGS_PORT) + u8 string[ETH_GSTRING_LEN]; + } bnx2x_stats_arr[BNX2X_NUM_STATS] = { +-/* 1 */ { STATS_OFFSET32(valid_bytes_received_hi), +- 8, STATS_FLAGS_FUNC, "rx_bytes" }, ++/* 1 */ { STATS_OFFSET32(total_bytes_received_hi), ++ 8, STATS_FLAGS_BOTH, "rx_bytes" }, + { STATS_OFFSET32(error_bytes_received_hi), +- 8, STATS_FLAGS_FUNC, "rx_error_bytes" }, +- { STATS_OFFSET32(total_bytes_transmitted_hi), +- 8, STATS_FLAGS_FUNC, "tx_bytes" }, +- { STATS_OFFSET32(tx_stat_ifhcoutbadoctets_hi), +- 8, STATS_FLAGS_PORT, "tx_error_bytes" }, ++ 8, STATS_FLAGS_BOTH, "rx_error_bytes" }, + { STATS_OFFSET32(total_unicast_packets_received_hi), +- 8, STATS_FLAGS_FUNC, "rx_ucast_packets" }, ++ 8, STATS_FLAGS_BOTH, "rx_ucast_packets" }, + { STATS_OFFSET32(total_multicast_packets_received_hi), +- 8, STATS_FLAGS_FUNC, "rx_mcast_packets" }, ++ 8, STATS_FLAGS_BOTH, "rx_mcast_packets" }, + { STATS_OFFSET32(total_broadcast_packets_received_hi), +- 8, STATS_FLAGS_FUNC, "rx_bcast_packets" }, +- { STATS_OFFSET32(total_unicast_packets_transmitted_hi), +- 8, STATS_FLAGS_FUNC, "tx_packets" }, +- { STATS_OFFSET32(tx_stat_dot3statsinternalmactransmiterrors_hi), +- 8, STATS_FLAGS_PORT, "tx_mac_errors" }, +-/* 10 */{ STATS_OFFSET32(rx_stat_dot3statscarriersenseerrors_hi), +- 8, STATS_FLAGS_PORT, "tx_carrier_errors" }, ++ 8, STATS_FLAGS_BOTH, "rx_bcast_packets" }, + { STATS_OFFSET32(rx_stat_dot3statsfcserrors_hi), + 8, STATS_FLAGS_PORT, "rx_crc_errors" }, + { STATS_OFFSET32(rx_stat_dot3statsalignmenterrors_hi), + 8, STATS_FLAGS_PORT, "rx_align_errors" }, ++ { STATS_OFFSET32(rx_stat_etherstatsundersizepkts_hi), ++ 8, STATS_FLAGS_PORT, "rx_undersize_packets" }, ++ { STATS_OFFSET32(etherstatsoverrsizepkts_hi), ++ 8, STATS_FLAGS_PORT, "rx_oversize_packets" }, ++/* 10 */{ STATS_OFFSET32(rx_stat_etherstatsfragments_hi), ++ 8, STATS_FLAGS_PORT, "rx_fragments" }, ++ { STATS_OFFSET32(rx_stat_etherstatsjabbers_hi), ++ 8, STATS_FLAGS_PORT, "rx_jabbers" }, ++ { STATS_OFFSET32(no_buff_discard_hi), ++ 8, STATS_FLAGS_BOTH, "rx_discards" }, ++ { STATS_OFFSET32(mac_filter_discard), ++ 4, STATS_FLAGS_PORT, "rx_filtered_packets" }, ++ { STATS_OFFSET32(xxoverflow_discard), ++ 4, STATS_FLAGS_PORT, "rx_fw_discards" }, ++ { STATS_OFFSET32(brb_drop_hi), ++ 8, STATS_FLAGS_PORT, "rx_brb_discard" }, ++ { STATS_OFFSET32(brb_truncate_hi), ++ 8, STATS_FLAGS_PORT, "rx_brb_truncate" }, ++ { STATS_OFFSET32(pause_frames_received_hi), ++ 8, STATS_FLAGS_PORT, "rx_pause_frames" }, ++ { STATS_OFFSET32(rx_stat_maccontrolframesreceived_hi), ++ 8, STATS_FLAGS_PORT, "rx_mac_ctrl_frames" }, ++ { STATS_OFFSET32(nig_timer_max), ++ 4, STATS_FLAGS_PORT, "rx_constant_pause_events" }, ++/* 20 */{ STATS_OFFSET32(rx_err_discard_pkt), ++ 4, STATS_FLAGS_BOTH, "rx_phy_ip_err_discards"}, ++ { STATS_OFFSET32(rx_skb_alloc_failed), ++ 4, STATS_FLAGS_BOTH, "rx_skb_alloc_discard" }, ++ { STATS_OFFSET32(hw_csum_err), ++ 4, STATS_FLAGS_BOTH, "rx_csum_offload_errors" }, ++ ++ { STATS_OFFSET32(total_bytes_transmitted_hi), ++ 8, STATS_FLAGS_BOTH, "tx_bytes" }, ++ { STATS_OFFSET32(tx_stat_ifhcoutbadoctets_hi), ++ 8, STATS_FLAGS_PORT, "tx_error_bytes" }, ++ { STATS_OFFSET32(total_unicast_packets_transmitted_hi), ++ 8, STATS_FLAGS_BOTH, "tx_packets" }, ++ { STATS_OFFSET32(tx_stat_dot3statsinternalmactransmiterrors_hi), ++ 8, STATS_FLAGS_PORT, "tx_mac_errors" }, ++ { STATS_OFFSET32(rx_stat_dot3statscarriersenseerrors_hi), ++ 8, STATS_FLAGS_PORT, "tx_carrier_errors" }, + { STATS_OFFSET32(tx_stat_dot3statssinglecollisionframes_hi), + 8, STATS_FLAGS_PORT, "tx_single_collisions" }, + { STATS_OFFSET32(tx_stat_dot3statsmultiplecollisionframes_hi), + 8, STATS_FLAGS_PORT, "tx_multi_collisions" }, +- { STATS_OFFSET32(tx_stat_dot3statsdeferredtransmissions_hi), ++/* 30 */{ STATS_OFFSET32(tx_stat_dot3statsdeferredtransmissions_hi), + 8, STATS_FLAGS_PORT, "tx_deferred" }, + { STATS_OFFSET32(tx_stat_dot3statsexcessivecollisions_hi), + 8, STATS_FLAGS_PORT, "tx_excess_collisions" }, +@@ -9093,14 +11295,6 @@ + 8, STATS_FLAGS_PORT, "tx_late_collisions" }, + { STATS_OFFSET32(tx_stat_etherstatscollisions_hi), + 8, STATS_FLAGS_PORT, "tx_total_collisions" }, +- { STATS_OFFSET32(rx_stat_etherstatsfragments_hi), +- 8, STATS_FLAGS_PORT, "rx_fragments" }, +-/* 20 */{ STATS_OFFSET32(rx_stat_etherstatsjabbers_hi), +- 8, STATS_FLAGS_PORT, "rx_jabbers" }, +- { STATS_OFFSET32(rx_stat_etherstatsundersizepkts_hi), +- 8, STATS_FLAGS_PORT, "rx_undersize_packets" }, +- { STATS_OFFSET32(jabber_packets_received), +- 4, STATS_FLAGS_FUNC, "rx_oversize_packets" }, + { STATS_OFFSET32(tx_stat_etherstatspkts64octets_hi), + 8, STATS_FLAGS_PORT, "tx_64_byte_packets" }, + { STATS_OFFSET32(tx_stat_etherstatspkts65octetsto127octets_hi), +@@ -9113,52 +11307,46 @@ + 8, STATS_FLAGS_PORT, "tx_512_to_1023_byte_packets" }, + { STATS_OFFSET32(etherstatspkts1024octetsto1522octets_hi), + 8, STATS_FLAGS_PORT, "tx_1024_to_1522_byte_packets" }, +- { STATS_OFFSET32(etherstatspktsover1522octets_hi), ++/* 40 */{ STATS_OFFSET32(etherstatspktsover1522octets_hi), + 8, STATS_FLAGS_PORT, "tx_1523_to_9022_byte_packets" }, +-/* 30 */{ STATS_OFFSET32(rx_stat_xonpauseframesreceived_hi), +- 8, STATS_FLAGS_PORT, "rx_xon_frames" }, +- { STATS_OFFSET32(rx_stat_xoffpauseframesreceived_hi), +- 8, STATS_FLAGS_PORT, "rx_xoff_frames" }, +- { STATS_OFFSET32(tx_stat_outxonsent_hi), +- 8, STATS_FLAGS_PORT, "tx_xon_frames" }, +- { STATS_OFFSET32(tx_stat_outxoffsent_hi), +- 8, STATS_FLAGS_PORT, "tx_xoff_frames" }, +- { STATS_OFFSET32(rx_stat_maccontrolframesreceived_hi), +- 8, STATS_FLAGS_PORT, "rx_mac_ctrl_frames" }, +- { STATS_OFFSET32(mac_filter_discard), +- 4, STATS_FLAGS_PORT, "rx_filtered_packets" }, +- { STATS_OFFSET32(no_buff_discard), +- 4, STATS_FLAGS_FUNC, "rx_discards" }, +- { STATS_OFFSET32(xxoverflow_discard), +- 4, STATS_FLAGS_PORT, "rx_fw_discards" }, +- { STATS_OFFSET32(brb_drop_hi), +- 8, STATS_FLAGS_PORT, "brb_discard" }, +- { STATS_OFFSET32(brb_truncate_hi), +- 8, STATS_FLAGS_PORT, "brb_truncate" }, +-/* 40 */{ STATS_OFFSET32(rx_err_discard_pkt), +- 4, STATS_FLAGS_FUNC, "rx_phy_ip_err_discards"}, +- { STATS_OFFSET32(rx_skb_alloc_failed), +- 4, STATS_FLAGS_FUNC, "rx_skb_alloc_discard" }, +-/* 42 */{ STATS_OFFSET32(hw_csum_err), +- 4, STATS_FLAGS_FUNC, "rx_csum_offload_errors" } ++ { STATS_OFFSET32(pause_frames_sent_hi), ++ 8, STATS_FLAGS_PORT, "tx_pause_frames" } + }; + +-#define IS_NOT_E1HMF_STAT(bp, i) \ +- (IS_E1HMF(bp) && (bnx2x_stats_arr[i].flags & STATS_FLAGS_PORT)) ++#define IS_PORT_STAT(i) \ ++ ((bnx2x_stats_arr[i].flags & STATS_FLAGS_BOTH) == STATS_FLAGS_PORT) ++#define IS_FUNC_STAT(i) (bnx2x_stats_arr[i].flags & STATS_FLAGS_FUNC) ++#define IS_E1HMF_MODE_STAT(bp) \ ++ (IS_E1HMF(bp) && !(bp->msglevel & BNX2X_MSG_STATS)) + + static void bnx2x_get_strings(struct net_device *dev, u32 stringset, u8 *buf) + { + struct bnx2x *bp = netdev_priv(dev); +- int i, j; ++ int i, j, k; + + switch (stringset) { + case ETH_SS_STATS: +- for (i = 0, j = 0; i < BNX2X_NUM_STATS; i++) { +- if (IS_NOT_E1HMF_STAT(bp, i)) +- continue; +- strcpy(buf + j*ETH_GSTRING_LEN, +- bnx2x_stats_arr[i].string); +- j++; ++ if (is_multi(bp)) { ++ k = 0; ++ for_each_rx_queue(bp, i) { ++ for (j = 0; j < BNX2X_NUM_Q_STATS; j++) ++ sprintf(buf + (k + j)*ETH_GSTRING_LEN, ++ bnx2x_q_stats_arr[j].string, i); ++ k += BNX2X_NUM_Q_STATS; ++ } ++ if (IS_E1HMF_MODE_STAT(bp)) ++ break; ++ for (j = 0; j < BNX2X_NUM_STATS; j++) ++ strcpy(buf + (k + j)*ETH_GSTRING_LEN, ++ bnx2x_stats_arr[j].string); ++ } else { ++ for (i = 0, j = 0; i < BNX2X_NUM_STATS; i++) { ++ if (IS_E1HMF_MODE_STAT(bp) && IS_PORT_STAT(i)) ++ continue; ++ strcpy(buf + j*ETH_GSTRING_LEN, ++ bnx2x_stats_arr[i].string); ++ j++; ++ } + } + break; + +@@ -9171,13 +11359,22 @@ + static int bnx2x_get_stats_count(struct net_device *dev) + { + struct bnx2x *bp = netdev_priv(dev); +- int i, num_stats = 0; +- +- for (i = 0; i < BNX2X_NUM_STATS; i++) { +- if (IS_NOT_E1HMF_STAT(bp, i)) +- continue; +- num_stats++; +- } ++ int i, num_stats; ++ ++ if (is_multi(bp)) { ++ num_stats = BNX2X_NUM_Q_STATS * bp->num_rx_queues; ++ if (!IS_E1HMF_MODE_STAT(bp)) ++ num_stats += BNX2X_NUM_STATS; ++ } else { ++ if (IS_E1HMF_MODE_STAT(bp)) { ++ num_stats = 0; ++ for (i = 0; i < BNX2X_NUM_STATS; i++) ++ if (IS_FUNC_STAT(i)) ++ num_stats++; ++ } else ++ num_stats = BNX2X_NUM_STATS; ++ } ++ + return num_stats; + } + +@@ -9185,29 +11382,71 @@ + struct ethtool_stats *stats, u64 *buf) + { + struct bnx2x *bp = netdev_priv(dev); +- u32 *hw_stats = (u32 *)&bp->eth_stats; +- int i, j; +- +- for (i = 0, j = 0; i < BNX2X_NUM_STATS; i++) { +- if (IS_NOT_E1HMF_STAT(bp, i)) +- continue; +- +- if (bnx2x_stats_arr[i].size == 0) { +- /* skip this counter */ +- buf[j] = 0; ++ u32 *hw_stats, *offset; ++ int i, j, k; ++ ++ if (is_multi(bp)) { ++ k = 0; ++ for_each_rx_queue(bp, i) { ++ hw_stats = (u32 *)&bp->fp[i].eth_q_stats; ++ for (j = 0; j < BNX2X_NUM_Q_STATS; j++) { ++ if (bnx2x_q_stats_arr[j].size == 0) { ++ /* skip this counter */ ++ buf[k + j] = 0; ++ continue; ++ } ++ offset = (hw_stats + ++ bnx2x_q_stats_arr[j].offset); ++ if (bnx2x_q_stats_arr[j].size == 4) { ++ /* 4-byte counter */ ++ buf[k + j] = (u64) *offset; ++ continue; ++ } ++ /* 8-byte counter */ ++ buf[k + j] = HILO_U64(*offset, *(offset + 1)); ++ } ++ k += BNX2X_NUM_Q_STATS; ++ } ++ if (IS_E1HMF_MODE_STAT(bp)) ++ return; ++ hw_stats = (u32 *)&bp->eth_stats; ++ for (j = 0; j < BNX2X_NUM_STATS; j++) { ++ if (bnx2x_stats_arr[j].size == 0) { ++ /* skip this counter */ ++ buf[k + j] = 0; ++ continue; ++ } ++ offset = (hw_stats + bnx2x_stats_arr[j].offset); ++ if (bnx2x_stats_arr[j].size == 4) { ++ /* 4-byte counter */ ++ buf[k + j] = (u64) *offset; ++ continue; ++ } ++ /* 8-byte counter */ ++ buf[k + j] = HILO_U64(*offset, *(offset + 1)); ++ } ++ } else { ++ hw_stats = (u32 *)&bp->eth_stats; ++ for (i = 0, j = 0; i < BNX2X_NUM_STATS; i++) { ++ if (IS_E1HMF_MODE_STAT(bp) && IS_PORT_STAT(i)) ++ continue; ++ if (bnx2x_stats_arr[i].size == 0) { ++ /* skip this counter */ ++ buf[j] = 0; ++ j++; ++ continue; ++ } ++ offset = (hw_stats + bnx2x_stats_arr[i].offset); ++ if (bnx2x_stats_arr[i].size == 4) { ++ /* 4-byte counter */ ++ buf[j] = (u64) *offset; ++ j++; ++ continue; ++ } ++ /* 8-byte counter */ ++ buf[j] = HILO_U64(*offset, *(offset + 1)); + j++; +- continue; +- } +- if (bnx2x_stats_arr[i].size == 4) { +- /* 4-byte counter */ +- buf[j] = (u64) *(hw_stats + bnx2x_stats_arr[i].offset); +- j++; +- continue; +- } +- /* 8-byte counter */ +- buf[j] = HILO_U64(*(hw_stats + bnx2x_stats_arr[i].offset), +- *(hw_stats + bnx2x_stats_arr[i].offset + 1)); +- j++; ++ } + } + } + +@@ -9254,13 +11493,17 @@ + .get_settings = bnx2x_get_settings, + .set_settings = bnx2x_set_settings, + .get_drvinfo = bnx2x_get_drvinfo, ++ .get_regs_len = bnx2x_get_regs_len, ++ .get_regs = bnx2x_get_regs, + .get_wol = bnx2x_get_wol, + .set_wol = bnx2x_set_wol, + .get_msglevel = bnx2x_get_msglevel, + .set_msglevel = bnx2x_set_msglevel, + .nway_reset = bnx2x_nway_reset, + .get_link = ethtool_op_get_link, ++#if (LINUX_VERSION_CODE >= 0x020418) /* BNX2X_UPSTREAM */ + .get_eeprom_len = bnx2x_get_eeprom_len, ++#endif + .get_eeprom = bnx2x_get_eeprom, + .set_eeprom = bnx2x_set_eeprom, + .get_coalesce = bnx2x_get_coalesce, +@@ -9272,19 +11515,32 @@ + .get_rx_csum = bnx2x_get_rx_csum, + .set_rx_csum = bnx2x_set_rx_csum, + .get_tx_csum = ethtool_op_get_tx_csum, ++#if (LINUX_VERSION_CODE >= 0x020618) /* BNX2X_UPSTREAM */ + .set_tx_csum = ethtool_op_set_tx_hw_csum, ++#else ++ .set_tx_csum = bnx2x_set_tx_hw_csum, ++#endif ++#if (LINUX_VERSION_CODE >= 0x02061a) /* BNX2X_UPSTREAM */ + .set_flags = bnx2x_set_flags, + .get_flags = ethtool_op_get_flags, ++#endif + .get_sg = ethtool_op_get_sg, + .set_sg = ethtool_op_set_sg, ++#ifdef NETIF_F_TSO /* BNX2X_UPSTREAM */ + .get_tso = ethtool_op_get_tso, + .set_tso = bnx2x_set_tso, ++#endif + .self_test_count = bnx2x_self_test_count, + .self_test = bnx2x_self_test, + .get_strings = bnx2x_get_strings, + .phys_id = bnx2x_phys_id, + .get_stats_count = bnx2x_get_stats_count, + .get_ethtool_stats = bnx2x_get_ethtool_stats, ++#ifdef ETHTOOL_GPERMADDR /* ! BNX2X_UPSTREAM */ ++#if (LINUX_VERSION_CODE < 0x020617) ++ .get_perm_addr = ethtool_op_get_perm_addr ++#endif ++#endif + }; + + /* end of ethtool_ops */ +@@ -9347,48 +11603,96 @@ + * net_device service functions + */ + ++#ifdef BNX2X_NEW_NAPI /* BNX2X_UPSTREAM */ + static int bnx2x_poll(struct napi_struct *napi, int budget) +-{ ++#else ++static int bnx2x_poll(struct net_device *dev, int *budget) ++#endif ++{ ++#ifdef BNX2X_NEW_NAPI /* BNX2X_UPSTREAM */ + struct bnx2x_fastpath *fp = container_of(napi, struct bnx2x_fastpath, + napi); + struct bnx2x *bp = fp->bp; + int work_done = 0; ++#else ++ struct bnx2x *bp = netdev_priv(dev); ++ struct bnx2x_fastpath *fp = &bp->fp[0]; ++ int orig_budget = min(*budget, dev->quota); ++ int work_done; ++#endif + + #ifdef BNX2X_STOP_ON_ERROR + if (unlikely(bp->panic)) + goto poll_panic; + #endif + +- prefetch(fp->tx_buf_ring[TX_BD(fp->tx_pkt_cons)].skb); + prefetch(fp->rx_buf_ring[RX_BD(fp->rx_bd_cons)].skb); + prefetch((char *)(fp->rx_buf_ring[RX_BD(fp->rx_bd_cons)].skb) + 256); + + bnx2x_update_fpsb_idx(fp); + +- if (bnx2x_has_tx_work(fp)) +- bnx2x_tx_int(fp, budget); +- +- if (bnx2x_has_rx_work(fp)) ++ if (bnx2x_has_rx_work(fp)) { ++#ifdef BNX2X_NEW_NAPI /* BNX2X_UPSTREAM */ + work_done = bnx2x_rx_int(fp, budget); +- rmb(); /* BNX2X_HAS_WORK() reads the status block */ +- +- /* must not complete if we consumed full budget */ +- if ((work_done < budget) && !BNX2X_HAS_WORK(fp)) { +- ++ ++ /* must not complete if we consumed full budget */ ++ if (work_done >= budget) ++ goto poll_again; ++#else ++ work_done = bnx2x_rx_int(fp, orig_budget); ++ ++ *budget -= work_done; ++ dev->quota -= work_done; ++ if (dev->quota <= 0) ++ goto poll_again; ++#endif ++ } ++ ++ /* bnx2x_has_rx_work() reads the status block, thus we need to ++ * ensure that status block indices have been actually read ++ * (bnx2x_update_fpsb_idx) prior to this check (bnx2x_has_rx_work) ++ * so that we won't write the "newer" value of the status block to IGU ++ * (if there was a DMA right after bnx2x_has_rx_work and ++ * if there is no rmb, the memory reading (bnx2x_update_fpsb_idx) ++ * may be postponed to right before bnx2x_ack_sb). In this case ++ * there will never be another interrupt until there is another update ++ * of the status block, while there is still unhandled work. ++ */ ++ rmb(); ++ ++ if (!bnx2x_has_rx_work(fp)) { + #ifdef BNX2X_STOP_ON_ERROR + poll_panic: + #endif +- netif_rx_complete(bp->dev, napi); +- +- bnx2x_ack_sb(bp, FP_SB_ID(fp), USTORM_ID, ++ napi_complete(napi); ++ ++ bnx2x_ack_sb(bp, fp->sb_id, USTORM_ID, + le16_to_cpu(fp->fp_u_idx), IGU_INT_NOP, 1); +- bnx2x_ack_sb(bp, FP_SB_ID(fp), CSTORM_ID, ++ bnx2x_ack_sb(bp, fp->sb_id, CSTORM_ID, + le16_to_cpu(fp->fp_c_idx), IGU_INT_ENABLE, 1); +- } ++#ifndef BNX2X_NEW_NAPI /* ! BNX2X_UPSTREAM */ ++ return 0; ++#endif ++ } ++ ++poll_again: ++#ifdef BNX2X_NEW_NAPI /* BNX2X_UPSTREAM */ + return work_done; +-} +- +- ++#else ++ return 1; ++#endif ++} ++ ++#if (LINUX_VERSION_CODE < 0x020618) /* ! BNX2X_UPSTREAM */ ++static struct net_device_stats *bnx2x_get_stats(struct net_device *dev) ++{ ++ struct bnx2x *bp = netdev_priv(dev); ++ ++ return &bp->net_stats; ++} ++#endif ++ ++#ifdef NETIF_F_TSO /* BNX2X_UPSTREAM */ + /* we split the first BD into headers and data BDs + * to ease the pain of our fellow microcode engineers + * we use one mapping for both BDs +@@ -9397,10 +11701,11 @@ + */ + static noinline u16 bnx2x_tx_split(struct bnx2x *bp, + struct bnx2x_fastpath *fp, +- struct eth_tx_bd **tx_bd, u16 hlen, ++ struct sw_tx_bd *tx_buf, ++ struct eth_tx_start_bd **tx_bd, u16 hlen, + u16 bd_prod, int nbd) + { +- struct eth_tx_bd *h_tx_bd = *tx_bd; ++ struct eth_tx_start_bd *h_tx_bd = *tx_bd; + struct eth_tx_bd *d_tx_bd; + dma_addr_t mapping; + int old_len = le16_to_cpu(h_tx_bd->nbytes); +@@ -9416,7 +11721,7 @@ + /* now get a new data BD + * (after the pbd) and fill it */ + bd_prod = TX_BD(NEXT_TX_IDX(bd_prod)); +- d_tx_bd = &fp->tx_desc_ring[bd_prod]; ++ d_tx_bd = &fp->tx_desc_ring[bd_prod].reg_bd; + + mapping = HILO_U64(le32_to_cpu(h_tx_bd->addr_hi), + le32_to_cpu(h_tx_bd->addr_lo)) + hlen; +@@ -9424,20 +11729,20 @@ + d_tx_bd->addr_hi = cpu_to_le32(U64_HI(mapping)); + d_tx_bd->addr_lo = cpu_to_le32(U64_LO(mapping)); + d_tx_bd->nbytes = cpu_to_le16(old_len - hlen); +- d_tx_bd->vlan = 0; +- /* this marks the BD as one that has no individual mapping +- * the FW ignores this flag in a BD not marked start +- */ +- d_tx_bd->bd_flags.as_bitfield = ETH_TX_BD_FLAGS_SW_LSO; ++ ++ /* this marks the BD as one that has no individual mapping */ ++ tx_buf->flags |= BNX2X_TSO_SPLIT_BD; ++ + DP(NETIF_MSG_TX_QUEUED, + "TSO split data size is %d (%x:%x)\n", + d_tx_bd->nbytes, d_tx_bd->addr_hi, d_tx_bd->addr_lo); + +- /* update tx_bd for marking the last BD flag */ +- *tx_bd = d_tx_bd; ++ /* update tx_bd */ ++ *tx_bd = (struct eth_tx_start_bd *)d_tx_bd; + + return bd_prod; + } ++#endif + + static inline u16 bnx2x_csum_fix(unsigned char *t_header, u16 csum, s8 fix) + { +@@ -9460,7 +11765,7 @@ + rc = XMIT_PLAIN; + + else { +- if (skb->protocol == ntohs(ETH_P_IPV6)) { ++ if (skb->protocol == htons(ETH_P_IPV6)) { + rc = XMIT_CSUM_V6; + if (ipv6_hdr(skb)->nexthdr == IPPROTO_TCP) + rc |= XMIT_CSUM_TCP; +@@ -9472,17 +11777,27 @@ + } + } + ++#ifdef NETIF_F_GSO /* BNX2X_UPSTREAM */ + if (skb_shinfo(skb)->gso_type & SKB_GSO_TCPV4) + rc |= XMIT_GSO_V4; + ++#ifdef NETIF_F_TSO6 /* BNX2X_UPSTREAM */ + else if (skb_shinfo(skb)->gso_type & SKB_GSO_TCPV6) + rc |= XMIT_GSO_V6; ++#endif ++#elif defined(NETIF_F_TSO) /* ! BNX2X_UPSTREAM */ ++ if ((skb_shinfo(skb)->gso_size) && ++ (skb->len > (bp->dev->mtu + ETH_HLEN))) ++ rc |= XMIT_GSO_V4; ++#endif + + return rc; + } + + #if (MAX_SKB_FRAGS >= MAX_FETCH_BD - 3) +-/* check if packet requires linearization (packet is too fragmented) */ ++/* check if packet requires linearization (packet is too fragmented) ++ no need to check fragmentation if page size > 8K (there will be no ++ violation to FW restrictions) */ + static int bnx2x_pkt_req_lin(struct bnx2x *bp, struct sk_buff *skb, + u32 xmit_type) + { +@@ -9494,6 +11809,7 @@ + if (skb_shinfo(skb)->nr_frags >= (MAX_FETCH_BD - 3)) { + + if (xmit_type & XMIT_GSO) { ++#ifdef NETIF_F_TSO /* BNX2X_UPSTREAM */ + unsigned short lso_mss = skb_shinfo(skb)->gso_size; + /* Check if LSO packet needs to be copied: + 3 = 1 (for headers BD) + 2 (for PBD and last BD) */ +@@ -9541,7 +11857,7 @@ + wnd_sum -= + skb_shinfo(skb)->frags[wnd_idx].size; + } +- ++#endif + } else { + /* in non-LSO too fragmented packet should always + be linearized */ +@@ -9549,7 +11865,9 @@ + } + } + ++#ifdef NETIF_F_TSO /* BNX2X_UPSTREAM */ + exit_lbl: ++#endif + if (unlikely(to_copy)) + DP(NETIF_MSG_TX_QUEUED, + "Linearization IS REQUIRED for %s packet. " +@@ -9561,6 +11879,36 @@ + } + #endif + ++#ifdef BNX2X_SAFC /* ! BNX2X_UPSTREAM */ ++static u16 bnx2x_select_queue(struct net_device *dev, struct sk_buff *skb) ++{ ++ struct bnx2x *bp = netdev_priv(dev); ++ int i, fp_index = 0; ++ ++ /* Determine which tx ring we will be placed on */ ++ switch (bp->multi_mode) { ++ case ETH_RSS_MODE_VLAN_PRI: ++ case ETH_RSS_MODE_E1HOV_PRI: ++#ifdef BCM_VLAN ++ if ((bp->vlgrp != NULL) && vlan_tx_tag_present(skb)) { ++ i = ((vlan_tx_tag_get(skb) >> 13) & 0x7); ++ fp_index = bp->cos_map[bp->pri_map[i]]; ++ } ++#endif ++ break; ++ ++ case ETH_RSS_MODE_IP_DSCP: ++ if (skb->protocol == htons(ETH_P_IP)) { ++ i = ((ip_hdr(skb)->tos >> 2) & 0x7); ++ fp_index = bp->cos_map[bp->pri_map[i]]; ++ } ++ break; ++ } ++ ++ return fp_index; ++} ++#endif ++ + /* called with netif_tx_lock + * bnx2x_tx_int() runs without netif_tx_lock unless it needs to call + * netif_wake_queue() +@@ -9568,45 +11916,73 @@ + static int bnx2x_start_xmit(struct sk_buff *skb, struct net_device *dev) + { + struct bnx2x *bp = netdev_priv(dev); +- struct bnx2x_fastpath *fp; ++ struct bnx2x_fastpath *fp, *fp_stat; ++#ifdef BNX2X_MULTI_QUEUE /* BNX2X_UPSTREAM */ ++ struct netdev_queue *txq; ++#endif + struct sw_tx_bd *tx_buf; +- struct eth_tx_bd *tx_bd; ++ struct eth_tx_start_bd *tx_start_bd; ++ struct eth_tx_bd *tx_data_bd, *total_pkt_bd = NULL; + struct eth_tx_parse_bd *pbd = NULL; + u16 pkt_prod, bd_prod; + int nbd, fp_index; + dma_addr_t mapping; + u32 xmit_type = bnx2x_xmit_type(bp, skb); +- int vlan_off = (bp->e1hov ? 4 : 0); + int i; + u8 hlen = 0; ++ __le16 pkt_size = 0; + + #ifdef BNX2X_STOP_ON_ERROR + if (unlikely(bp->panic)) + return NETDEV_TX_BUSY; + #endif + +- fp_index = (smp_processor_id() % bp->num_queues); +- fp = &bp->fp[fp_index]; ++#if defined(__VMKLNX__) && defined(__VMKNETDDI_QUEUEOPS__) ++ VMK_ASSERT(skb->queue_mapping < BNX2X_NUM_QUEUES(bp)); ++ fp_index = skb->queue_mapping; ++ txq = netdev_get_tx_queue(dev, fp_index); ++#else /* BNX2X_UPSTREAM */ ++#ifdef BNX2X_MULTI_QUEUE /* BNX2X_UPSTREAM */ ++ fp_index = skb_get_queue_mapping(skb); ++ txq = netdev_get_tx_queue(dev, fp_index); ++#else ++ fp_index = 0; ++#endif ++#endif ++ ++ fp = &bp->fp[fp_index + bp->num_rx_queues]; ++ fp_stat = &bp->fp[fp_index]; + + if (unlikely(bnx2x_tx_avail(fp) < (skb_shinfo(skb)->nr_frags + 3))) { +- bp->eth_stats.driver_xoff++, ++ fp_stat->eth_q_stats.driver_xoff++; ++#ifdef BNX2X_MULTI_QUEUE /* BNX2X_UPSTREAM */ ++ netif_tx_stop_queue(txq); ++#else + netif_stop_queue(dev); ++#endif + BNX2X_ERR("BUG! Tx ring full when queue awake!\n"); + return NETDEV_TX_BUSY; + } + ++#ifdef NETIF_F_GSO /* BNX2X_UPSTREAM */ + DP(NETIF_MSG_TX_QUEUED, "SKB: summed %x protocol %x protocol(%x,%x)" + " gso type %x xmit_type %x\n", + skb->ip_summed, skb->protocol, ipv6_hdr(skb)->nexthdr, + ip_hdr(skb)->protocol, skb_shinfo(skb)->gso_type, xmit_type); ++#endif + + #if (MAX_SKB_FRAGS >= MAX_FETCH_BD - 3) +- /* First, check if we need to linearize the skb +- (due to FW restrictions) */ ++ /* First, check if we need to linearize the skb (due to FW ++ restrictions). No need to check fragmentation if page size > 8K ++ (there will be no violation to FW restrictions) */ + if (bnx2x_pkt_req_lin(bp, skb, xmit_type)) { + /* Statistics of linearization */ + bp->lin_cnt++; ++#if (LINUX_VERSION_CODE > 0x020611) || defined(SLE_VERSION_CODE) /* BNX2X_UPSTREAM */ + if (skb_linearize(skb) != 0) { ++#else ++ if (skb_linearize(skb, GFP_ATOMIC) != 0) { ++#endif + DP(NETIF_MSG_TX_QUEUED, "SKB linearization failed - " + "silently dropping this SKB\n"); + dev_kfree_skb_any(skb); +@@ -9617,7 +11993,7 @@ + + /* + Please read carefully. First we use one BD which we mark as start, +- then for TSO or xsum we have a parsing info BD, ++ then we have a parsing info BD (used for TSO or xsum), + and only then we have the rest of the TSO BDs. + (don't forget to mark the last one as last, + and to unmap only AFTER you write to the BD ...) +@@ -9629,47 +12005,45 @@ + + /* get a tx_buf and first BD */ + tx_buf = &fp->tx_buf_ring[TX_BD(pkt_prod)]; +- tx_bd = &fp->tx_desc_ring[bd_prod]; +- +- tx_bd->bd_flags.as_bitfield = ETH_TX_BD_FLAGS_START_BD; +- tx_bd->general_data = (UNICAST_ADDRESS << +- ETH_TX_BD_ETH_ADDR_TYPE_SHIFT); ++ tx_start_bd = &fp->tx_desc_ring[bd_prod].start_bd; ++ ++ tx_start_bd->bd_flags.as_bitfield = ETH_TX_BD_FLAGS_START_BD; ++ tx_start_bd->general_data = (UNICAST_ADDRESS << ++ ETH_TX_START_BD_ETH_ADDR_TYPE_SHIFT); + /* header nbd */ +- tx_bd->general_data |= (1 << ETH_TX_BD_HDR_NBDS_SHIFT); ++ tx_start_bd->general_data |= (1 << ETH_TX_START_BD_HDR_NBDS_SHIFT); + + /* remember the first BD of the packet */ + tx_buf->first_bd = fp->tx_bd_prod; + tx_buf->skb = skb; ++ tx_buf->flags = 0; + + DP(NETIF_MSG_TX_QUEUED, + "sending pkt %u @%p next_idx %u bd %u @%p\n", +- pkt_prod, tx_buf, fp->tx_pkt_prod, bd_prod, tx_bd); ++ pkt_prod, tx_buf, fp->tx_pkt_prod, bd_prod, tx_start_bd); + + #ifdef BCM_VLAN + if ((bp->vlgrp != NULL) && vlan_tx_tag_present(skb) && + (bp->flags & HW_VLAN_TX_FLAG)) { +- tx_bd->vlan = cpu_to_le16(vlan_tx_tag_get(skb)); +- tx_bd->bd_flags.as_bitfield |= ETH_TX_BD_FLAGS_VLAN_TAG; +- vlan_off += 4; ++ tx_start_bd->vlan = cpu_to_le16(vlan_tx_tag_get(skb)); ++ tx_start_bd->bd_flags.as_bitfield |= ETH_TX_BD_FLAGS_VLAN_TAG; + } else + #endif +- tx_bd->vlan = cpu_to_le16(pkt_prod); +- +- if (xmit_type) { +- /* turn on parsing and get a BD */ +- bd_prod = TX_BD(NEXT_TX_IDX(bd_prod)); +- pbd = (void *)&fp->tx_desc_ring[bd_prod]; +- +- memset(pbd, 0, sizeof(struct eth_tx_parse_bd)); +- } ++ tx_start_bd->vlan = cpu_to_le16(pkt_prod); ++ ++ /* turn on parsing and get a BD */ ++ bd_prod = TX_BD(NEXT_TX_IDX(bd_prod)); ++ pbd = &fp->tx_desc_ring[bd_prod].parse_bd; ++ ++ memset(pbd, 0, sizeof(struct eth_tx_parse_bd)); + + if (xmit_type & XMIT_CSUM) { +- hlen = (skb_network_header(skb) - skb->data + vlan_off) / 2; ++ hlen = (skb_network_header(skb) - skb->data) / 2; + + /* for now NS flag is not used in Linux */ +- pbd->global_data = (hlen | +- ((skb->protocol == ntohs(ETH_P_8021Q)) << +- ETH_TX_PARSE_BD_LLC_SNAP_EN_SHIFT)); ++ pbd->global_data = ++ (hlen | ((skb->protocol == cpu_to_be16(ETH_P_8021Q)) << ++ ETH_TX_PARSE_BD_LLC_SNAP_EN_SHIFT)); + + pbd->ip_hlen = (skb_transport_header(skb) - + skb_network_header(skb)) / 2; +@@ -9677,15 +12051,15 @@ + hlen += pbd->ip_hlen + tcp_hdrlen(skb) / 2; + + pbd->total_hlen = cpu_to_le16(hlen); +- hlen = hlen*2 - vlan_off; +- +- tx_bd->bd_flags.as_bitfield |= ETH_TX_BD_FLAGS_TCP_CSUM; ++ hlen = hlen*2; ++ ++ tx_start_bd->bd_flags.as_bitfield |= ETH_TX_BD_FLAGS_L4_CSUM; + + if (xmit_type & XMIT_CSUM_V4) +- tx_bd->bd_flags.as_bitfield |= ++ tx_start_bd->bd_flags.as_bitfield |= + ETH_TX_BD_FLAGS_IP_CSUM; + else +- tx_bd->bd_flags.as_bitfield |= ETH_TX_BD_FLAGS_IPV6; ++ tx_start_bd->bd_flags.as_bitfield |= ETH_TX_BD_FLAGS_IPV6; + + if (xmit_type & XMIT_CSUM_TCP) { + pbd->tcp_pseudo_csum = swab16(tcp_hdr(skb)->check); +@@ -9693,13 +12067,11 @@ + } else { + s8 fix = SKB_CS_OFF(skb); /* signed! */ + +- pbd->global_data |= ETH_TX_PARSE_BD_CS_ANY_FLG; +- pbd->cs_offset = fix / 2; ++ pbd->global_data |= ETH_TX_PARSE_BD_UDP_CS_FLG; + + DP(NETIF_MSG_TX_QUEUED, +- "hlen %d offset %d fix %d csum before fix %x\n", +- le16_to_cpu(pbd->total_hlen), pbd->cs_offset, fix, +- SKB_CS(skb)); ++ "hlen %d fix %d csum before fix %x\n", ++ le16_to_cpu(pbd->total_hlen), fix, SKB_CS(skb)); + + /* HW bug: fixup the CSUM */ + pbd->tcp_pseudo_csum = +@@ -9714,18 +12086,20 @@ + mapping = pci_map_single(bp->pdev, skb->data, + skb_headlen(skb), PCI_DMA_TODEVICE); + +- tx_bd->addr_hi = cpu_to_le32(U64_HI(mapping)); +- tx_bd->addr_lo = cpu_to_le32(U64_LO(mapping)); +- nbd = skb_shinfo(skb)->nr_frags + ((pbd == NULL) ? 1 : 2); +- tx_bd->nbd = cpu_to_le16(nbd); +- tx_bd->nbytes = cpu_to_le16(skb_headlen(skb)); ++ tx_start_bd->addr_hi = cpu_to_le32(U64_HI(mapping)); ++ tx_start_bd->addr_lo = cpu_to_le32(U64_LO(mapping)); ++ nbd = skb_shinfo(skb)->nr_frags + 2; /* start_bd + pbd + frags */ ++ tx_start_bd->nbd = cpu_to_le16(nbd); ++ tx_start_bd->nbytes = cpu_to_le16(skb_headlen(skb)); ++ pkt_size = tx_start_bd->nbytes; + + DP(NETIF_MSG_TX_QUEUED, "first bd @%p addr (%x:%x) nbd %d" + " nbytes %d flags %x vlan %x\n", +- tx_bd, tx_bd->addr_hi, tx_bd->addr_lo, le16_to_cpu(tx_bd->nbd), +- le16_to_cpu(tx_bd->nbytes), tx_bd->bd_flags.as_bitfield, +- le16_to_cpu(tx_bd->vlan)); +- ++ tx_start_bd, tx_start_bd->addr_hi, tx_start_bd->addr_lo, ++ le16_to_cpu(tx_start_bd->nbd), le16_to_cpu(tx_start_bd->nbytes), ++ tx_start_bd->bd_flags.as_bitfield, le16_to_cpu(tx_start_bd->vlan)); ++ ++#ifdef NETIF_F_TSO /* BNX2X_UPSTREAM */ + if (xmit_type & XMIT_GSO) { + + DP(NETIF_MSG_TX_QUEUED, +@@ -9733,11 +12107,11 @@ + skb->len, hlen, skb_headlen(skb), + skb_shinfo(skb)->gso_size); + +- tx_bd->bd_flags.as_bitfield |= ETH_TX_BD_FLAGS_SW_LSO; ++ tx_start_bd->bd_flags.as_bitfield |= ETH_TX_BD_FLAGS_SW_LSO; + + if (unlikely(skb_headlen(skb) > hlen)) +- bd_prod = bnx2x_tx_split(bp, fp, &tx_bd, hlen, +- bd_prod, ++nbd); ++ bd_prod = bnx2x_tx_split(bp, fp, tx_buf, &tx_start_bd, ++ hlen, bd_prod, ++nbd); + + pbd->lso_mss = cpu_to_le16(skb_shinfo(skb)->gso_size); + pbd->tcp_send_seq = swab32(tcp_hdr(skb)->seq); +@@ -9758,33 +12132,32 @@ + + pbd->global_data |= ETH_TX_PARSE_BD_PSEUDO_CS_WITHOUT_LEN; + } ++#endif ++ tx_data_bd = (struct eth_tx_bd *)tx_start_bd; + + for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { + skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; + + bd_prod = TX_BD(NEXT_TX_IDX(bd_prod)); +- tx_bd = &fp->tx_desc_ring[bd_prod]; ++ tx_data_bd = &fp->tx_desc_ring[bd_prod].reg_bd; ++ if (total_pkt_bd == NULL) ++ total_pkt_bd = &fp->tx_desc_ring[bd_prod].reg_bd; + + mapping = pci_map_page(bp->pdev, frag->page, frag->page_offset, + frag->size, PCI_DMA_TODEVICE); + +- tx_bd->addr_hi = cpu_to_le32(U64_HI(mapping)); +- tx_bd->addr_lo = cpu_to_le32(U64_LO(mapping)); +- tx_bd->nbytes = cpu_to_le16(frag->size); +- tx_bd->vlan = cpu_to_le16(pkt_prod); +- tx_bd->bd_flags.as_bitfield = 0; ++ tx_data_bd->addr_hi = cpu_to_le32(U64_HI(mapping)); ++ tx_data_bd->addr_lo = cpu_to_le32(U64_LO(mapping)); ++ tx_data_bd->nbytes = cpu_to_le16(frag->size); ++ le16_add_cpu(&pkt_size, frag->size); + + DP(NETIF_MSG_TX_QUEUED, +- "frag %d bd @%p addr (%x:%x) nbytes %d flags %x\n", +- i, tx_bd, tx_bd->addr_hi, tx_bd->addr_lo, +- le16_to_cpu(tx_bd->nbytes), tx_bd->bd_flags.as_bitfield); +- } +- +- /* now at last mark the BD as the last BD */ +- tx_bd->bd_flags.as_bitfield |= ETH_TX_BD_FLAGS_END_BD; +- +- DP(NETIF_MSG_TX_QUEUED, "last bd @%p flags %x\n", +- tx_bd, tx_bd->bd_flags.as_bitfield); ++ "frag %d bd @%p addr (%x:%x) nbytes %d\n", ++ i, tx_data_bd, tx_data_bd->addr_hi, tx_data_bd->addr_lo, ++ le16_to_cpu(tx_data_bd->nbytes)); ++ } ++ ++ DP(NETIF_MSG_TX_QUEUED, "last bd @%p\n", tx_data_bd); + + bd_prod = TX_BD(NEXT_TX_IDX(bd_prod)); + +@@ -9793,6 +12166,9 @@ + */ + if (TX_BD_POFF(bd_prod) < nbd) + nbd++; ++ ++ if (total_pkt_bd != NULL) ++ total_pkt_bd->total_pkt_bytes = pkt_size; + + if (pbd) + DP(NETIF_MSG_TX_QUEUED, +@@ -9813,28 +12189,36 @@ + */ + wmb(); + +- fp->hw_tx_prods->bds_prod = +- cpu_to_le16(le16_to_cpu(fp->hw_tx_prods->bds_prod) + nbd); +- mb(); /* FW restriction: must not reorder writing nbd and packets */ +- fp->hw_tx_prods->packets_prod = +- cpu_to_le32(le32_to_cpu(fp->hw_tx_prods->packets_prod) + 1); +- DOORBELL(bp, FP_IDX(fp), 0); ++ fp->tx_db.data.prod += nbd; ++ barrier(); ++ DOORBELL(bp, fp->index - bp->num_rx_queues, fp->tx_db.raw); + + mmiowb(); + + fp->tx_bd_prod += nbd; ++#if (LINUX_VERSION_CODE < 0x02061f) /* ! BNX2X_UPSTREAM */ ++ /* In kernels starting from 2.6.31 netdev layer does this */ + dev->trans_start = jiffies; ++#endif + + if (unlikely(bnx2x_tx_avail(fp) < MAX_SKB_FRAGS + 3)) { ++#ifdef BNX2X_MULTI_QUEUE /* BNX2X_UPSTREAM */ ++ netif_tx_stop_queue(txq); ++#else ++ netif_stop_queue(dev); ++#endif + /* We want bnx2x_tx_int to "see" the updated tx_bd_prod + if we put Tx into XOFF state. */ + smp_mb(); +- netif_stop_queue(dev); +- bp->eth_stats.driver_xoff++; ++ fp_stat->eth_q_stats.driver_xoff++; + if (bnx2x_tx_avail(fp) >= MAX_SKB_FRAGS + 3) ++#ifdef BNX2X_MULTI_QUEUE /* BNX2X_UPSTREAM */ ++ netif_tx_wake_queue(txq); ++#else + netif_wake_queue(dev); +- } +- fp->tx_pkt++; ++#endif ++ } ++ fp_stat->tx_pkt++; + + return NETDEV_TX_OK; + } +@@ -9858,14 +12242,16 @@ + + /* Unload the driver, release IRQs */ + bnx2x_nic_unload(bp, UNLOAD_CLOSE); ++#if (LINUX_VERSION_CODE >= 0x020614) /* BNX2X_UPSTREAM */ + if (atomic_read(&bp->pdev->enable_cnt) == 1) ++#endif + if (!CHIP_REV_IS_SLOW(bp)) + bnx2x_set_power_state(bp, PCI_D3hot); + + return 0; + } + +-/* called with netif_tx_lock from set_multicast */ ++/* called with netif_tx_lock from dev_mcast.c */ + static void bnx2x_set_rx_mode(struct net_device *dev) + { + struct bnx2x *bp = netdev_priv(dev); +@@ -9910,8 +12296,9 @@ + cpu_to_le16(port); + config->config_table[i]. + target_table_entry.flags = 0; +- config->config_table[i]. +- target_table_entry.client_id = 0; ++ config->config_table[i].target_table_entry. ++ clients_bit_vector = ++ cpu_to_le32(1 << BP_L_ID(bp)); + config->config_table[i]. + target_table_entry.vlan_id = 0; + +@@ -9924,7 +12311,7 @@ + config->config_table[i]. + cam_entry.lsb_mac_addr); + } +- old = config->hdr.length_6b; ++ old = config->hdr.length; + if (old > i) { + for (; i < old; i++) { + if (CAM_IS_INVALID(config-> +@@ -9943,9 +12330,9 @@ + else + offset = BNX2X_MAX_MULTICAST*(1 + port); + +- config->hdr.length_6b = i; ++ config->hdr.length = i; + config->hdr.offset = offset; +- config->hdr.client_id = BP_CL_ID(bp); ++ config->hdr.client_id = bp->fp->cl_id; + config->hdr.reserved1 = 0; + + bnx2x_sp_post(bp, RAMROD_CMD_ID_ETH_SET_MAC, 0, +@@ -9965,11 +12352,16 @@ + mclist && (i < dev->mc_count); + i++, mclist = mclist->next) { + ++#if (LINUX_VERSION_CODE >= 0x02061b) /* BNX2X_UPSTREAM */ ++ DP(NETIF_MSG_IFUP, "Adding mcast MAC: %pM\n", ++ mclist->dmi_addr); ++#else + DP(NETIF_MSG_IFUP, "Adding mcast MAC: " + "%02x:%02x:%02x:%02x:%02x:%02x\n", + mclist->dmi_addr[0], mclist->dmi_addr[1], + mclist->dmi_addr[2], mclist->dmi_addr[3], + mclist->dmi_addr[4], mclist->dmi_addr[5]); ++#endif + + crc = crc32c_le(0, mclist->dmi_addr, ETH_ALEN); + bit = (crc >> 24) & 0xff; +@@ -10009,54 +12401,77 @@ + } + + /* called with rtnl_lock */ ++static int bnx2x_mdio_read(struct net_device *netdev, int prtad, ++ int devad, u16 addr) ++{ ++ struct bnx2x *bp = netdev_priv(netdev); ++ u16 value; ++ int rc; ++ u32 phy_type = XGXS_EXT_PHY_TYPE(bp->link_params.ext_phy_config); ++ ++ DP(NETIF_MSG_LINK, "mdio_read: prtad 0x%x, devad 0x%x, addr 0x%x\n", ++ prtad, devad, addr); ++ ++ if (prtad != bp->mdio.prtad) { ++ DP(NETIF_MSG_LINK, "prtad missmatch (cmd:0x%x != bp:0x%x)\n", ++ prtad, bp->mdio.prtad); ++ return -EINVAL; ++ } ++ ++ /* The HW expects different devad if CL22 is used */ ++ devad = (devad == MDIO_DEVAD_NONE) ? DEFAULT_PHY_DEV_ADDR : devad; ++ ++ bnx2x_acquire_phy_lock(bp); ++ rc = bnx2x_cl45_read(bp, BP_PORT(bp), phy_type, prtad, ++ devad, addr, &value); ++ bnx2x_release_phy_lock(bp); ++ DP(NETIF_MSG_LINK, "mdio_read_val 0x%x rc = 0x%x\n", value, rc); ++ ++ if (!rc) ++ rc = value; ++ return rc; ++} ++ ++/* called with rtnl_lock */ ++static int bnx2x_mdio_write(struct net_device *netdev, int prtad, int devad, ++ u16 addr, u16 value) ++{ ++ struct bnx2x *bp = netdev_priv(netdev); ++ u32 ext_phy_type = XGXS_EXT_PHY_TYPE(bp->link_params.ext_phy_config); ++ int rc; ++ ++ DP(NETIF_MSG_LINK, "mdio_write: prtad 0x%x, devad 0x%x, addr 0x%x," ++ " value 0x%x\n", prtad, devad, addr, value); ++ ++ if (prtad != bp->mdio.prtad) { ++ DP(NETIF_MSG_LINK, "prtad missmatch (cmd:0x%x != bp:0x%x)\n", ++ prtad, bp->mdio.prtad); ++ return -EINVAL; ++ } ++ ++ /* The HW expects different devad if CL22 is used */ ++ devad = (devad == MDIO_DEVAD_NONE) ? DEFAULT_PHY_DEV_ADDR : devad; ++ ++ bnx2x_acquire_phy_lock(bp); ++ rc = bnx2x_cl45_write(bp, BP_PORT(bp), ext_phy_type, prtad, ++ devad, addr, value); ++ bnx2x_release_phy_lock(bp); ++ return rc; ++} ++ ++/* called with rtnl_lock */ + static int bnx2x_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) + { +- struct mii_ioctl_data *data = if_mii(ifr); +- struct bnx2x *bp = netdev_priv(dev); +- int port = BP_PORT(bp); +- int err; +- +- switch (cmd) { +- case SIOCGMIIPHY: +- data->phy_id = bp->port.phy_addr; +- +- /* fallthrough */ +- +- case SIOCGMIIREG: { +- u16 mii_regval; +- +- if (!netif_running(dev)) +- return -EAGAIN; +- +- mutex_lock(&bp->port.phy_mutex); +- err = bnx2x_cl45_read(bp, port, 0, bp->port.phy_addr, +- DEFAULT_PHY_DEV_ADDR, +- (data->reg_num & 0x1f), &mii_regval); +- data->val_out = mii_regval; +- mutex_unlock(&bp->port.phy_mutex); +- return err; +- } +- +- case SIOCSMIIREG: +- if (!capable(CAP_NET_ADMIN)) +- return -EPERM; +- +- if (!netif_running(dev)) +- return -EAGAIN; +- +- mutex_lock(&bp->port.phy_mutex); +- err = bnx2x_cl45_write(bp, port, 0, bp->port.phy_addr, +- DEFAULT_PHY_DEV_ADDR, +- (data->reg_num & 0x1f), data->val_in); +- mutex_unlock(&bp->port.phy_mutex); +- return err; +- +- default: +- /* do nothing */ +- break; +- } +- +- return -EOPNOTSUPP; ++ struct bnx2x *bp = netdev_priv(dev); ++ struct mii_ioctl_data *mdio = if_mii(ifr); ++ ++ DP(NETIF_MSG_LINK, "ioctl: phy id 0x%x, reg 0x%x, val_in 0x%x\n", ++ mdio->phy_id, mdio->reg_num, mdio->val_in); ++ ++ if (!netif_running(dev)) ++ return -EAGAIN; ++ ++ return mdio_mii_ioctl(&bp->mdio, mdio, cmd); + } + + /* called with rtnl_lock */ +@@ -10117,6 +12532,15 @@ + bnx2x_set_client_config(bp); + } + ++#if (LINUX_VERSION_CODE < 0x020616) /* ! BNX2X_UPSTREAM */ ++static void bnx2x_vlan_rx_kill_vid(struct net_device *dev, uint16_t vid) ++{ ++ struct bnx2x *bp = netdev_priv(dev); ++ ++ if (bp->vlgrp) ++ vlan_group_set_device(bp->vlgrp, vid, NULL); ++} ++#endif + #endif + + #if defined(HAVE_POLL_CONTROLLER) || defined(CONFIG_NET_POLL_CONTROLLER) +@@ -10125,9 +12549,33 @@ + struct bnx2x *bp = netdev_priv(dev); + + disable_irq(bp->pdev->irq); ++#if (LINUX_VERSION_CODE < 0x020613) && (VMWARE_ESX_DDK_VERSION < 40000) ++ bnx2x_interrupt(bp->pdev->irq, dev, NULL); ++#else /* BNX2X_UPSTREAM */ + bnx2x_interrupt(bp->pdev->irq, dev); ++#endif + enable_irq(bp->pdev->irq); + } ++#endif ++ ++#if (LINUX_VERSION_CODE >= 0x02061e) /* BNX2X_UPSTREAM */ ++static const struct net_device_ops bnx2x_netdev_ops = { ++ .ndo_open = bnx2x_open, ++ .ndo_stop = bnx2x_close, ++ .ndo_start_xmit = bnx2x_start_xmit, ++ .ndo_set_multicast_list = bnx2x_set_rx_mode, ++ .ndo_set_mac_address = bnx2x_change_mac_addr, ++ .ndo_validate_addr = eth_validate_addr, ++ .ndo_do_ioctl = bnx2x_ioctl, ++ .ndo_change_mtu = bnx2x_change_mtu, ++ .ndo_tx_timeout = bnx2x_tx_timeout, ++#ifdef BCM_VLAN ++ .ndo_vlan_rx_register = bnx2x_vlan_rx_register, ++#endif ++#if defined(HAVE_POLL_CONTROLLER) || defined(CONFIG_NET_POLL_CONTROLLER) ++ .ndo_poll_controller = poll_bnx2x, ++#endif ++}; + #endif + + static int __devinit bnx2x_init_dev(struct pci_dev *pdev, +@@ -10136,7 +12584,12 @@ + struct bnx2x *bp; + int rc; + ++#if (LINUX_VERSION_CODE < 0x020618) /* ! BNX2X_UPSTREAM */ ++ SET_MODULE_OWNER(dev); ++#endif ++#if (LINUX_VERSION_CODE >= 0x020419) /* BNX2X_UPSTREAM */ + SET_NETDEV_DEV(dev, &pdev->dev); ++#endif + bp = netdev_priv(dev); + + bp->dev = dev; +@@ -10164,7 +12617,9 @@ + goto err_out_disable; + } + ++#if (LINUX_VERSION_CODE >= 0x020614) /* BNX2X_UPSTREAM */ + if (atomic_read(&pdev->enable_cnt) == 1) { ++#endif + rc = pci_request_regions(pdev, DRV_MODULE_NAME); + if (rc) { + printk(KERN_ERR PFX "Cannot obtain PCI resources," +@@ -10173,8 +12628,14 @@ + } + + pci_set_master(pdev); ++#if (LINUX_VERSION_CODE >= 0x02060b) /* BNX2X_UPSTREAM */ + pci_save_state(pdev); +- } ++#else ++ pci_save_state(pdev, bp->pci_state); ++#endif ++#if (LINUX_VERSION_CODE >= 0x020614) /* BNX2X_UPSTREAM */ ++ } ++#endif + + bp->pm_cap = pci_find_capability(pdev, PCI_CAP_ID_PM); + if (bp->pm_cap == 0) { +@@ -10214,8 +12675,12 @@ + + dev->irq = pdev->irq; + ++#if (LINUX_VERSION_CODE >= 0x02061c) /* BNX2X_UPSTREAM */ ++ bp->regview = pci_ioremap_bar(pdev, 0); ++#else + bp->regview = ioremap_nocache(dev->base_addr, + pci_resource_len(pdev, 0)); ++#endif + if (!bp->regview) { + printk(KERN_ERR PFX "Cannot map register space, aborting\n"); + rc = -ENOMEM; +@@ -10241,10 +12706,23 @@ + REG_WR(bp, PXP2_REG_PGL_ADDR_90_F0 + BP_PORT(bp)*16, 0); + REG_WR(bp, PXP2_REG_PGL_ADDR_94_F0 + BP_PORT(bp)*16, 0); + ++#if (LINUX_VERSION_CODE < 0x02061e) /* ! BNX2X_UPSTREAM */ ++#ifndef BNX2X_NEW_NAPI /* ! BNX2X_UPSTREAM */ ++ dev->poll = bnx2x_poll; ++ dev->weight = 128*4; ++#endif ++#if (LINUX_VERSION_CODE < 0x020618) /* ! BNX2X_UPSTREAM */ ++ dev->get_stats = bnx2x_get_stats; ++#endif + dev->hard_start_xmit = bnx2x_start_xmit; ++#endif + dev->watchdog_timeo = TX_TIMEOUT; + ++#if (LINUX_VERSION_CODE >= 0x02061e) /* BNX2X_UPSTREAM */ ++ dev->netdev_ops = &bnx2x_netdev_ops; ++#endif + dev->ethtool_ops = &bnx2x_ethtool_ops; ++#if (LINUX_VERSION_CODE < 0x02061e) /* ! BNX2X_UPSTREAM */ + dev->open = bnx2x_open; + dev->stop = bnx2x_close; + dev->set_multicast_list = bnx2x_set_rx_mode; +@@ -10254,9 +12732,13 @@ + dev->tx_timeout = bnx2x_tx_timeout; + #ifdef BCM_VLAN + dev->vlan_rx_register = bnx2x_vlan_rx_register; ++#if (LINUX_VERSION_CODE < 0x020616) /* ! BNX2X_UPSTREAM */ ++ dev->vlan_rx_kill_vid = bnx2x_vlan_rx_kill_vid; ++#endif + #endif + #if defined(HAVE_POLL_CONTROLLER) || defined(CONFIG_NET_POLL_CONTROLLER) + dev->poll_controller = poll_bnx2x; ++#endif + #endif + dev->features |= NETIF_F_SG; + dev->features |= NETIF_F_HW_CSUM; +@@ -10266,8 +12748,20 @@ + dev->features |= (NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX); + bp->flags |= (HW_VLAN_RX_FLAG | HW_VLAN_TX_FLAG); + #endif ++#ifdef NETIF_F_TSO /* BNX2X_UPSTREAM */ + dev->features |= (NETIF_F_TSO | NETIF_F_TSO_ECN); ++#endif ++#ifdef NETIF_F_TSO6 /* BNX2X_UPSTREAM */ + dev->features |= NETIF_F_TSO6; ++#endif ++ ++ /* get_port_hwinfo() will set prtad and mmds properly */ ++ bp->mdio.prtad = MDIO_PRTAD_NONE; ++ bp->mdio.mmds = 0; ++ bp->mdio.mode_support = MDIO_SUPPORTS_C45 | MDIO_EMULATE_C22; ++ bp->mdio.dev = dev; ++ bp->mdio.mdio_read = bnx2x_mdio_read; ++ bp->mdio.mdio_write = bnx2x_mdio_write; + + return 0; + +@@ -10282,7 +12776,9 @@ + } + + err_out_release: ++#if (LINUX_VERSION_CODE >= 0x020614) /* BNX2X_UPSTREAM */ + if (atomic_read(&pdev->enable_cnt) == 1) ++#endif + pci_release_regions(pdev); + + err_out_disable: +@@ -10293,37 +12789,239 @@ + return rc; + } + +-static int __devinit bnx2x_get_pcie_width(struct bnx2x *bp) ++static void __devinit bnx2x_get_pcie_width_speed(struct bnx2x *bp, ++ int *width, int *speed) + { + u32 val = REG_RD(bp, PCICFG_OFFSET + PCICFG_LINK_CONTROL); + +- val = (val & PCICFG_LINK_WIDTH) >> PCICFG_LINK_WIDTH_SHIFT; +- return val; +-} +- +-/* return value of 1=2.5GHz 2=5GHz */ +-static int __devinit bnx2x_get_pcie_speed(struct bnx2x *bp) +-{ +- u32 val = REG_RD(bp, PCICFG_OFFSET + PCICFG_LINK_CONTROL); +- +- val = (val & PCICFG_LINK_SPEED) >> PCICFG_LINK_SPEED_SHIFT; +- return val; +-} ++ *width = (val & PCICFG_LINK_WIDTH) >> PCICFG_LINK_WIDTH_SHIFT; ++ ++ /* return value of 1=2.5GHz 2=5GHz */ ++ *speed = (val & PCICFG_LINK_SPEED) >> PCICFG_LINK_SPEED_SHIFT; ++} ++ ++#if defined(BNX2X_UPSTREAM) && !defined(BNX2X_USE_INIT_VALUES) /* BNX2X_UPSTREAM */ ++static int __devinit bnx2x_check_firmware(struct bnx2x *bp) ++{ ++ const struct firmware *firmware = bp->firmware; ++ struct bnx2x_fw_file_hdr *fw_hdr; ++ struct bnx2x_fw_file_section *sections; ++ u32 offset, len, num_ops; ++ u16 *ops_offsets; ++ int i; ++ const u8 *fw_ver; ++ ++ if (firmware->size < sizeof(struct bnx2x_fw_file_hdr)) ++ return -EINVAL; ++ ++ fw_hdr = (struct bnx2x_fw_file_hdr *)firmware->data; ++ sections = (struct bnx2x_fw_file_section *)fw_hdr; ++ ++ /* Make sure none of the offsets and sizes make us read beyond ++ * the end of the firmware data */ ++ for (i = 0; i < sizeof(*fw_hdr) / sizeof(*sections); i++) { ++ offset = be32_to_cpu(sections[i].offset); ++ len = be32_to_cpu(sections[i].len); ++ if (offset + len > firmware->size) { ++ printk(KERN_ERR PFX "Section %d length is out of " ++ "bounds\n", i); ++ return -EINVAL; ++ } ++ } ++ ++ /* Likewise for the init_ops offsets */ ++ offset = be32_to_cpu(fw_hdr->init_ops_offsets.offset); ++ ops_offsets = (u16 *)(firmware->data + offset); ++ num_ops = be32_to_cpu(fw_hdr->init_ops.len) / sizeof(struct raw_op); ++ ++ for (i = 0; i < be32_to_cpu(fw_hdr->init_ops_offsets.len) / 2; i++) { ++ if (be16_to_cpu(ops_offsets[i]) > num_ops) { ++ printk(KERN_ERR PFX "Section offset %d is out of " ++ "bounds\n", i); ++ return -EINVAL; ++ } ++ } ++ ++ /* Check FW version */ ++ offset = be32_to_cpu(fw_hdr->fw_version.offset); ++ fw_ver = firmware->data + offset; ++ if ((fw_ver[0] != BCM_5710_FW_MAJOR_VERSION) || ++ (fw_ver[1] != BCM_5710_FW_MINOR_VERSION) || ++ (fw_ver[2] != BCM_5710_FW_REVISION_VERSION) || ++ (fw_ver[3] != BCM_5710_FW_ENGINEERING_VERSION)) { ++ printk(KERN_ERR PFX "Bad FW version:%d.%d.%d.%d." ++ " Should be %d.%d.%d.%d\n", ++ fw_ver[0], fw_ver[1], fw_ver[2], ++ fw_ver[3], BCM_5710_FW_MAJOR_VERSION, ++ BCM_5710_FW_MINOR_VERSION, ++ BCM_5710_FW_REVISION_VERSION, ++ BCM_5710_FW_ENGINEERING_VERSION); ++ return -EINVAL; ++ } ++ ++ return 0; ++} ++ ++static inline void be32_to_cpu_n(const u8 *_source, u8 *_target, u32 n) ++{ ++ const __be32 *source = (const __be32 *)_source; ++ u32 *target = (u32 *)_target; ++ u32 i; ++ ++ for (i = 0; i < n/4; i++) ++ target[i] = be32_to_cpu(source[i]); ++} ++ ++/* ++ Ops array is stored in the following format: ++ {op(8bit), offset(24bit, big endian), data(32bit, big endian)} ++ */ ++static inline void bnx2x_prep_ops(const u8 *_source, u8 *_target, u32 n) ++{ ++ const __be32 *source = (const __be32 *)_source; ++ struct raw_op *target = (struct raw_op *)_target; ++ u32 i, j, tmp; ++ ++ for (i = 0, j = 0; i < n/8; i++, j += 2) { ++ tmp = be32_to_cpu(source[j]); ++ target[i].op = (tmp >> 24) & 0xff; ++ target[i].offset = tmp & 0xffffff; ++ target[i].raw_data = be32_to_cpu(source[j+1]); ++ } ++} ++ ++static inline void be16_to_cpu_n(const u8 *_source, u8 *_target, u32 n) ++{ ++ const __be16 *source = (const __be16 *)_source; ++ u16 *target = (u16 *)_target; ++ u32 i; ++ ++ for (i = 0; i < n/2; i++) ++ target[i] = be16_to_cpu(source[i]); ++} ++ ++#define BNX2X_ALLOC_AND_SET(arr, lbl, func) \ ++ do { \ ++ u32 len = be32_to_cpu(fw_hdr->arr.len); \ ++ bp->arr = kmalloc(len, GFP_KERNEL); \ ++ if (!bp->arr) { \ ++ printk(KERN_ERR PFX "Failed to allocate %d bytes " \ ++ "for "#arr"\n", len); \ ++ goto lbl; \ ++ } \ ++ func(bp->firmware->data + be32_to_cpu(fw_hdr->arr.offset), \ ++ (u8 *)bp->arr, len); \ ++ } while (0) ++ ++static int __devinit bnx2x_init_firmware(struct bnx2x *bp, struct device *dev) ++{ ++ char fw_file_name[40] = {0}; ++ struct bnx2x_fw_file_hdr *fw_hdr; ++ int rc, offset; ++ ++ /* Create a FW file name */ ++ if (CHIP_IS_E1(bp)) ++ offset = sprintf(fw_file_name, FW_FILE_PREFIX_E1); ++ else ++ offset = sprintf(fw_file_name, FW_FILE_PREFIX_E1H); ++ ++ sprintf(fw_file_name + offset, "%d.%d.%d.%d.fw", ++ BCM_5710_FW_MAJOR_VERSION, ++ BCM_5710_FW_MINOR_VERSION, ++ BCM_5710_FW_REVISION_VERSION, ++ BCM_5710_FW_ENGINEERING_VERSION); ++ ++ printk(KERN_INFO PFX "Loading %s\n", fw_file_name); ++ ++ rc = request_firmware(&bp->firmware, fw_file_name, dev); ++ if (rc) { ++ printk(KERN_ERR PFX "Can't load firmware file %s\n", ++ fw_file_name); ++ goto request_firmware_exit; ++ } ++ ++ rc = bnx2x_check_firmware(bp); ++ if (rc) { ++ printk(KERN_ERR PFX "Corrupt firmware file %s\n", fw_file_name); ++ goto request_firmware_exit; ++ } ++ ++ fw_hdr = (struct bnx2x_fw_file_hdr *)bp->firmware->data; ++ ++ /* Initialize the pointers to the init arrays */ ++ /* Blob */ ++ BNX2X_ALLOC_AND_SET(init_data, request_firmware_exit, be32_to_cpu_n); ++ ++ /* Opcodes */ ++ BNX2X_ALLOC_AND_SET(init_ops, init_ops_alloc_err, bnx2x_prep_ops); ++ ++ /* Offsets */ ++ BNX2X_ALLOC_AND_SET(init_ops_offsets, init_offsets_alloc_err, ++ be16_to_cpu_n); ++ ++ /* STORMs firmware */ ++ INIT_TSEM_INT_TABLE_DATA(bp) = bp->firmware->data + ++ be32_to_cpu(fw_hdr->tsem_int_table_data.offset); ++ INIT_TSEM_PRAM_DATA(bp) = bp->firmware->data + ++ be32_to_cpu(fw_hdr->tsem_pram_data.offset); ++ INIT_USEM_INT_TABLE_DATA(bp) = bp->firmware->data + ++ be32_to_cpu(fw_hdr->usem_int_table_data.offset); ++ INIT_USEM_PRAM_DATA(bp) = bp->firmware->data + ++ be32_to_cpu(fw_hdr->usem_pram_data.offset); ++ INIT_XSEM_INT_TABLE_DATA(bp) = bp->firmware->data + ++ be32_to_cpu(fw_hdr->xsem_int_table_data.offset); ++ INIT_XSEM_PRAM_DATA(bp) = bp->firmware->data + ++ be32_to_cpu(fw_hdr->xsem_pram_data.offset); ++ INIT_CSEM_INT_TABLE_DATA(bp) = bp->firmware->data + ++ be32_to_cpu(fw_hdr->csem_int_table_data.offset); ++ INIT_CSEM_PRAM_DATA(bp) = bp->firmware->data + ++ be32_to_cpu(fw_hdr->csem_pram_data.offset); ++ ++ return 0; ++ ++init_offsets_alloc_err: ++ kfree(bp->init_ops); ++init_ops_alloc_err: ++ kfree(bp->init_data); ++request_firmware_exit: ++ release_firmware(bp->firmware); ++ ++ return rc; ++} ++ ++#else ++ ++static int __devinit bnx2x_init_firmware(struct bnx2x *bp, struct device *dev) ++{ ++ if (CHIP_IS_E1(bp)) ++ bnx2x_init_e1_firmware(bp); ++ ++ else if (CHIP_IS_E1H(bp)) ++ bnx2x_init_e1h_firmware(bp); ++ ++ else { ++ printk(KERN_ERR PFX "Unsupported chip revision\n"); ++ return -EINVAL; ++ } ++ ++ return 0; ++} ++#endif + + static int __devinit bnx2x_init_one(struct pci_dev *pdev, + const struct pci_device_id *ent) + { +- static int version_printed; + struct net_device *dev = NULL; + struct bnx2x *bp; +- int rc; +- DECLARE_MAC_BUF(mac); +- +- if (version_printed++ == 0) +- printk(KERN_INFO "%s", version); ++ int pcie_width, pcie_speed; ++ int rc; + + /* dev zeroed in init_etherdev */ ++#ifdef BNX2X_MULTI_QUEUE /* BNX2X_UPSTREAM */ ++ dev = alloc_etherdev_mq(sizeof(*bp), MAX_CONTEXT); ++#else + dev = alloc_etherdev(sizeof(*bp)); ++#endif + if (!dev) { + printk(KERN_ERR PFX "Cannot allocate net device\n"); + return -ENOMEM; +@@ -10331,6 +13029,8 @@ + + bp = netdev_priv(dev); + bp->msglevel = debug; ++ ++ pci_set_drvdata(pdev, dev); + + rc = bnx2x_init_dev(pdev, dev); + if (rc < 0) { +@@ -10338,11 +13038,16 @@ + return rc; + } + +- pci_set_drvdata(pdev, dev); +- + rc = bnx2x_init_bp(bp); + if (rc) + goto init_one_exit; ++ ++ /* Set init arrays */ ++ rc = bnx2x_init_firmware(bp, &pdev->dev); ++ if (rc) { ++ printk(KERN_ERR PFX "Error loading firmware\n"); ++ goto init_one_exit; ++ } + + rc = register_netdev(dev); + if (rc) { +@@ -10350,14 +13055,29 @@ + goto init_one_exit; + } + +- bp->common.name = board_info[ent->driver_data].name; ++ bnx2x_get_pcie_width_speed(bp, &pcie_width, &pcie_speed); + printk(KERN_INFO "%s: %s (%c%d) PCI-E x%d %s found at mem %lx," +- " IRQ %d, ", dev->name, bp->common.name, ++ " IRQ %d, ", dev->name, board_info[ent->driver_data].name, + (CHIP_REV(bp) >> 12) + 'A', (CHIP_METAL(bp) >> 4), +- bnx2x_get_pcie_width(bp), +- (bnx2x_get_pcie_speed(bp) == 2) ? "5GHz (Gen2)" : "2.5GHz", ++ pcie_width, (pcie_speed == 2) ? "5GHz (Gen2)" : "2.5GHz", + dev->base_addr, bp->pdev->irq); +- printk(KERN_CONT "node addr %s\n", print_mac(mac, dev->dev_addr)); ++#if (LINUX_VERSION_CODE >= 0x02061b) /* BNX2X_UPSTREAM */ ++ printk(KERN_CONT "node addr %pM\n", dev->dev_addr); ++#else ++ printk(KERN_CONT "node addr "); ++ { ++ int i; ++ ++ for (i = 0; i < ETH_ALEN; i++) ++ printk(KERN_CONT "%2.2x", dev->dev_addr[i]); ++ } ++ printk(KERN_CONT "\n"); ++#endif ++#if defined(__VMKLNX__) && defined(__VMKNETDDI_QUEUEOPS__) /* ! BNX2X_UPSTREAM */ ++ VMKNETDDI_REGISTER_QUEUEOPS(dev, bnx2x_netqueue_ops); ++ printk(KERN_INFO "VMware NetQueue Ops is registered for bnx2x\n"); ++#endif ++ + return 0; + + init_one_exit: +@@ -10369,7 +13089,9 @@ + + free_netdev(dev); + ++#if (LINUX_VERSION_CODE >= 0x020614) /* BNX2X_UPSTREAM */ + if (atomic_read(&pdev->enable_cnt) == 1) ++#endif + pci_release_regions(pdev); + + pci_disable_device(pdev); +@@ -10389,7 +13111,17 @@ + } + bp = netdev_priv(dev); + ++#if (LINUX_VERSION_CODE < 0x020618) /* ! BNX2X_UPSTREAM */ ++ flush_scheduled_work(); ++#endif + unregister_netdev(dev); ++ ++#if defined(BNX2X_UPSTREAM) && !defined(BNX2X_USE_INIT_VALUES) /* BNX2X_UPSTREAM */ ++ kfree(bp->init_ops_offsets); ++ kfree(bp->init_ops); ++ kfree(bp->init_data); ++ release_firmware(bp->firmware); ++#endif + + if (bp->regview) + iounmap(bp->regview); +@@ -10399,7 +13131,9 @@ + + free_netdev(dev); + ++#if (LINUX_VERSION_CODE >= 0x020614) /* BNX2X_UPSTREAM */ + if (atomic_read(&pdev->enable_cnt) == 1) ++#endif + pci_release_regions(pdev); + + pci_disable_device(pdev); +@@ -10419,13 +13153,20 @@ + + rtnl_lock(); + ++#if (LINUX_VERSION_CODE >= 0x02060b) /* BNX2X_UPSTREAM */ + pci_save_state(pdev); ++#else ++ pci_save_state(pdev, bp->pci_state); ++#endif + + if (!netif_running(dev)) { + rtnl_unlock(); + return 0; + } + ++#if (LINUX_VERSION_CODE < 0x020618) /* ! BNX2X_UPSTREAM */ ++ flush_scheduled_work(); ++#endif + netif_device_detach(dev); + + bnx2x_nic_unload(bp, UNLOAD_CLOSE); +@@ -10451,7 +13192,11 @@ + + rtnl_lock(); + ++#if (LINUX_VERSION_CODE >= 0x02060b) /* BNX2X_UPSTREAM */ + pci_restore_state(pdev); ++#else ++ pci_restore_state(pdev, bp->pci_state); ++#endif + + if (!netif_running(dev)) { + rtnl_unlock(); +@@ -10468,6 +13213,7 @@ + return rc; + } + ++#if (LINUX_VERSION_CODE >= 0x02060b) && !defined(__VMKLNX__) /* BNX2X_UPSTREAM */ + static int bnx2x_eeh_nic_unload(struct bnx2x *bp) + { + int i; +@@ -10489,16 +13235,18 @@ + struct mac_configuration_cmd *config = + bnx2x_sp(bp, mcast_config); + +- for (i = 0; i < config->hdr.length_6b; i++) ++ for (i = 0; i < config->hdr.length; i++) + CAM_INVALIDATE(config->config_table[i]); + } + + /* Free SKBs, SGEs, TPA pool and driver internals */ + bnx2x_free_skbs(bp); +- for_each_queue(bp, i) ++ for_each_rx_queue(bp, i) + bnx2x_free_rx_sge_range(bp, bp->fp + i, NUM_RX_SGE); +- for_each_queue(bp, i) ++#if defined(BNX2X_NEW_NAPI) && (LINUX_VERSION_CODE >= 0x02061b) /* BNX2X_UPSTREAM */ ++ for_each_rx_queue(bp, i) + netif_napi_del(&bnx2x_fp(bp, i, napi)); ++#endif + bnx2x_free_mem(bp); + + bp->state = BNX2X_STATE_CLOSED; +@@ -10624,9 +13372,10 @@ + + static struct pci_error_handlers bnx2x_err_handler = { + .error_detected = bnx2x_io_error_detected, +- .slot_reset = bnx2x_io_slot_reset, +- .resume = bnx2x_io_resume, ++ .slot_reset = bnx2x_io_slot_reset, ++ .resume = bnx2x_io_resume, + }; ++#endif + + static struct pci_driver bnx2x_pci_driver = { + .name = DRV_MODULE_NAME, +@@ -10635,18 +13384,35 @@ + .remove = __devexit_p(bnx2x_remove_one), + .suspend = bnx2x_suspend, + .resume = bnx2x_resume, ++#if (LINUX_VERSION_CODE >= 0x02060b) && !defined(__VMKLNX__) /* BNX2X_UPSTREAM */ + .err_handler = &bnx2x_err_handler, ++#endif + }; + + static int __init bnx2x_init(void) + { ++ int rc; ++ ++ printk(KERN_INFO "%s", version); ++ + bnx2x_wq = create_singlethread_workqueue("bnx2x"); + if (bnx2x_wq == NULL) { + printk(KERN_ERR PFX "Cannot create workqueue\n"); + return -ENOMEM; + } + +- return pci_register_driver(&bnx2x_pci_driver); ++#if (LINUX_VERSION_CODE >= 0x020600) /* BNX2X_UPSTREAM */ ++ rc = pci_register_driver(&bnx2x_pci_driver); ++#else ++ rc = pci_module_init(&bnx2x_pci_driver); ++#endif ++#if (LINUX_VERSION_CODE >= 0x02060a) /* BNX2X_UPSTREAM */ ++ if (rc) { ++ printk(KERN_ERR PFX "Cannot register driver\n"); ++ destroy_workqueue(bnx2x_wq); ++ } ++#endif ++ return rc; + } + + static void __exit bnx2x_cleanup(void) +@@ -10659,3 +13425,727 @@ + module_init(bnx2x_init); + module_exit(bnx2x_cleanup); + ++#ifdef BCM_CNIC /* ! BNX2X_UPSTREAM */ ++ ++/* count denotes the number of new completions we have seen */ ++static void bnx2x_cnic_sp_post(struct bnx2x *bp, int count) ++{ ++ int func = BP_FUNC(bp); ++ ++#ifdef BNX2X_STOP_ON_ERROR ++ if (unlikely(bp->panic)) ++ return; ++#endif ++ ++ spin_lock_bh(&bp->spq_lock); ++ bp->cnic_spq_pending -= count; ++ ++ for (; bp->cnic_spq_pending < bp->cnic_eth_dev.max_kwqe_pending; ++ bp->cnic_spq_pending++) { ++ ++ if (!bp->cnic_kwq_pending) ++ break; ++ ++ *bp->spq_prod_bd = *bp->cnic_kwq_cons; ++ ++ bp->cnic_kwq_pending--; ++ ++ DP(NETIF_MSG_TIMER, "pending on SPQ %d, on KWQ %d count %d\n", ++ bp->cnic_spq_pending, bp->cnic_kwq_pending, count); ++ ++ if (bp->spq_prod_bd == bp->spq_last_bd) { ++ bp->spq_prod_bd = bp->spq; ++ bp->spq_prod_idx = 0; ++ DP(NETIF_MSG_TIMER, "end of spq\n"); ++ ++ } else { ++ bp->spq_prod_bd++; ++ bp->spq_prod_idx++; ++ } ++ ++ if (bp->cnic_kwq_cons == bp->cnic_kwq_last) ++ bp->cnic_kwq_cons = bp->cnic_kwq; ++ else ++ bp->cnic_kwq_cons++; ++ } ++ ++ REG_WR(bp, BAR_XSTRORM_INTMEM + XSTORM_SPQ_PROD_OFFSET(func), ++ bp->spq_prod_idx); ++ ++ spin_unlock_bh(&bp->spq_lock); ++} ++ ++static int bnx2x_cnic_sp_queue(struct net_device *dev, ++ struct kwqe_16 *kwqes[], u32 count) ++{ ++ struct bnx2x *bp = netdev_priv(dev); ++ int i; ++ ++#ifdef BNX2X_STOP_ON_ERROR ++ if (unlikely(bp->panic)) ++ return -EIO; ++#endif ++ ++ spin_lock_bh(&bp->spq_lock); ++ ++ for (i = 0; i < count; i++) { ++ struct eth_spe *spe = (struct eth_spe *)kwqes[i]; ++ ++ if (bp->cnic_kwq_pending == MAX_SP_DESC_CNT) ++ break; ++ ++ *bp->cnic_kwq_prod = *spe; ++ ++ bp->cnic_kwq_pending++; ++ ++ DP(NETIF_MSG_TIMER, "L5 SPQE %x %x %x:%x pos %d\n", ++ spe->hdr.conn_and_cmd_data, spe->hdr.type, ++ spe->data.mac_config_addr.hi, ++ spe->data.mac_config_addr.lo, ++ bp->cnic_kwq_pending); ++ ++ if (bp->cnic_kwq_prod == bp->cnic_kwq_last) ++ bp->cnic_kwq_prod = bp->cnic_kwq; ++ else ++ bp->cnic_kwq_prod++; ++ } ++ ++ spin_unlock_bh(&bp->spq_lock); ++ ++ if (bp->cnic_spq_pending < bp->cnic_eth_dev.max_kwqe_pending) ++ bnx2x_cnic_sp_post(bp, 0); ++ ++ return i; ++} ++ ++static int bnx2x_cnic_ctl_send(struct bnx2x *bp, struct cnic_ctl_info *ctl) ++{ ++ struct cnic_ops *c_ops; ++ int rc = 0; ++ ++ rcu_read_lock(); ++ c_ops = rcu_dereference(bp->cnic_ops); ++ if (c_ops) ++ rc = c_ops->cnic_ctl(bp->cnic_data, ctl); ++ rcu_read_unlock(); ++ ++ /* since for now we don't handle send failure just tell the user */ ++ if (rc) ++ BNX2X_ERR("sending cmd %x returned %d\n", ctl->cmd, rc); ++ ++ return rc; ++} ++ ++/* ++ * for commands that have no data ++ */ ++static int bnx2x_cnic_notify(struct bnx2x *bp, int cmd) ++{ ++ struct cnic_ctl_info ctl = {0}; ++ ++ ctl.cmd = cmd; ++ ++ return bnx2x_cnic_ctl_send(bp, &ctl); ++} ++ ++static void bnx2x_cnic_cfc_comp(struct bnx2x *bp, int cid) ++{ ++ struct cnic_ctl_info ctl; ++ ++ /* first we tell CNIC and only then we count this as a completion */ ++ ctl.cmd = CNIC_CTL_COMPLETION_CMD; ++ ctl.data.comp.cid = cid; ++ ++ bnx2x_cnic_ctl_send(bp, &ctl); ++ bnx2x_cnic_sp_post(bp, 1); ++} ++ ++static int bnx2x_drv_ctl(struct net_device *dev, struct drv_ctl_info *ctl) ++{ ++ struct bnx2x *bp = netdev_priv(dev); ++ ++ switch (ctl->cmd) { ++ case DRV_CTL_CTXTBL_WR_CMD: ++ { ++ u32 index = ctl->data.io.offset; ++ dma_addr_t addr = ctl->data.io.dma_addr; ++ ++ bnx2x_ilt_wr(bp, index, addr); ++ return 0; ++ } ++ break; ++ ++ case DRV_CTL_COMPLETION_CMD: ++ { ++ int count = ctl->data.comp.comp_count; ++ ++ bnx2x_cnic_sp_post(bp, count); ++ return 0; ++ } ++ break; ++ ++ default: ++ BNX2X_ERR("unknown command %x\n", ctl->cmd); ++ return -EINVAL; ++ } ++} ++ ++static void bnx2x_setup_cnic_irq_info(struct bnx2x *bp) ++{ ++ struct cnic_eth_dev *cp = &bp->cnic_eth_dev; ++ ++#ifdef CONFIG_PCI_MSI /* BNX2X_UPSTREAM */ ++ if (bp->flags & USING_MSIX_FLAG) { ++ cp->drv_state |= CNIC_DRV_STATE_USING_MSIX; ++ cp->irq_arr[0].irq_flags |= CNIC_IRQ_FL_MSIX; ++ cp->irq_arr[0].vector = bp->msix_table[1].vector; ++ } else { ++#else ++ { ++#endif ++ cp->drv_state &= ~CNIC_DRV_STATE_USING_MSIX; ++ cp->irq_arr[0].irq_flags &= ~CNIC_IRQ_FL_MSIX; ++ } ++ cp->irq_arr[0].status_blk = bp->cnic_sb; ++ cp->irq_arr[0].status_blk_num = CNIC_SB_ID(bp); ++ ++ cp->num_irq = 1; ++} ++ ++static int bnx2x_register_cnic(struct net_device *dev, struct cnic_ops *ops, ++ void *data) ++{ ++ struct bnx2x *bp = netdev_priv(dev); ++ struct cnic_eth_dev *cp = &bp->cnic_eth_dev; ++ ++ if (ops == NULL) ++ return -EINVAL; ++ ++#if !defined(__VMKLNX__) ++ if (!try_module_get(ops->cnic_owner)) ++ return -EBUSY; ++#endif ++ ++ if (atomic_read(&bp->intr_sem) != 0) ++ return -EBUSY; ++ ++ bp->cnic_kwq = kzalloc(PAGE_SIZE, GFP_KERNEL); ++ if (!bp->cnic_kwq) ++ return -ENOMEM; ++ ++ bp->cnic_kwq_cons = bp->cnic_kwq; ++ bp->cnic_kwq_prod = bp->cnic_kwq; ++ bp->cnic_kwq_last = bp->cnic_kwq + MAX_SP_DESC_CNT; ++ ++ bp->cnic_spq_pending = 0; ++ bp->cnic_kwq_pending = 0; ++ ++ bp->cnic_data = data; ++ rcu_assign_pointer(bp->cnic_ops, ops); ++ ++ cp->num_irq = 0; ++ cp->drv_state = CNIC_DRV_STATE_REGD; ++ ++ bnx2x_init_sb(bp, bp->cnic_sb, bp->cnic_sb_mapping, CNIC_SB_ID(bp)); ++ ++ bnx2x_setup_cnic_irq_info(bp); ++ ++ return 0; ++} ++ ++static int bnx2x_unregister_cnic(struct net_device *dev) ++{ ++ struct bnx2x *bp = netdev_priv(dev); ++ struct cnic_eth_dev *cp = &bp->cnic_eth_dev; ++ ++ cp->drv_state = 0; ++#if !defined(__VMKLNX__) ++ module_put(bp->cnic_ops->cnic_owner); ++#endif ++ rcu_assign_pointer(bp->cnic_ops, NULL); ++#if !defined(__VMKLNX__) ++ synchronize_rcu(); ++#endif ++ kfree(bp->cnic_kwq); ++ ++ return 0; ++} ++ ++struct cnic_eth_dev *bnx2x_cnic_probe(struct net_device *dev) ++{ ++ struct bnx2x *bp = netdev_priv(dev); ++ struct cnic_eth_dev *cp = &bp->cnic_eth_dev; ++ ++ cp->drv_owner = THIS_MODULE; ++ cp->chip_id = CHIP_ID(bp); ++ cp->pdev = bp->pdev; ++ cp->io_base = bp->regview; ++ cp->max_kwqe_pending = 8; ++ cp->ctx_blk_size = CNIC_CTX_PER_ILT * sizeof(union cdu_context); ++ cp->ctx_tbl_offset = FUNC_ILT_BASE(bp->func) + 1; ++ cp->ctx_tbl_len = CNIC_ILT_LINES; ++ cp->starting_cid = 16; ++ cp->drv_submit_kwqes_16 = bnx2x_cnic_sp_queue; ++ cp->drv_ctl = bnx2x_drv_ctl; ++ cp->drv_register_cnic = bnx2x_register_cnic; ++ cp->drv_unregister_cnic = bnx2x_unregister_cnic; ++ ++ return cp; ++} ++EXPORT_SYMBOL(bnx2x_cnic_probe); ++ ++#endif /* BCM_CNIC */ ++ ++#if defined(__VMKLNX__) && defined(__VMKNETDDI_QUEUEOPS__) /* ! BNX2X_UPSTREAM */ ++ ++static int bnx2x_get_netqueue_features(vmknetddi_queueop_get_features_args_t *args) ++{ ++ args->features = VMKNETDDI_QUEUEOPS_FEATURE_NONE; ++ args->features |= VMKNETDDI_QUEUEOPS_FEATURE_RXQUEUES; ++ args->features |= VMKNETDDI_QUEUEOPS_FEATURE_TXQUEUES; ++ return VMKNETDDI_QUEUEOPS_OK; ++} ++ ++static int bnx2x_get_queue_count(vmknetddi_queueop_get_queue_count_args_t *args) ++{ ++ struct bnx2x *bp = netdev_priv(args->netdev); ++ ++ /* workaround for packets duplicated */ ++ if (is_multi(bp)) { ++ bp->rx_mode = BNX2X_RX_MODE_NORMAL; ++ bnx2x_set_storm_rx_mode(bp); ++ bp->netq_enabled = 1; ++ } ++ if (args->type == VMKNETDDI_QUEUEOPS_QUEUE_TYPE_RX) { ++ args->count = max_t(u16, BNX2X_NUM_QUEUES(bp) - 1, 0); ++ return VMKNETDDI_QUEUEOPS_OK; ++ ++ } else if (args->type == VMKNETDDI_QUEUEOPS_QUEUE_TYPE_TX) { ++ args->count = max_t(u16, BNX2X_NUM_QUEUES(bp) - 1, 0); ++ return VMKNETDDI_QUEUEOPS_OK; ++ ++ } else { ++ printk("bnx2x_get_queue_count: invalid queue type\n"); ++ return VMKNETDDI_QUEUEOPS_ERR; ++ } ++} ++ ++static int bnx2x_get_filter_count(vmknetddi_queueop_get_filter_count_args_t *args) ++{ ++ /* Only support 1 Mac filter per queue */ ++ args->count = 1; ++ return VMKNETDDI_QUEUEOPS_OK; ++} ++ ++static int bnx2x_alloc_rx_queue(struct net_device *netdev, ++ vmknetddi_queueops_queueid_t *p_qid, ++ struct napi_struct **napi_p) ++{ ++ struct bnx2x *bp = netdev_priv(netdev); ++ int i; ++ ++ if (bp->n_rx_queues_allocated >= BNX2X_NUM_QUEUES(bp)) ++ return VMKNETDDI_QUEUEOPS_ERR; ++ ++ for_each_nondefault_queue(bp, i) { ++ struct bnx2x_fastpath *fp = &bp->fp[i]; ++ ++ if (!BNX2X_IS_NETQ_RX_QUEUE_ALLOCATED(fp)) { ++ fp->netq_flags |= BNX2X_NETQ_RX_QUEUE_ALLOCATED; ++ bp->n_rx_queues_allocated++; ++ *p_qid = VMKNETDDI_QUEUEOPS_MK_RX_QUEUEID(fp->index); ++ *napi_p = &fp->napi; ++ return VMKNETDDI_QUEUEOPS_OK; ++ } ++ } ++ BNX2X_ERR("bnx2x_alloc_rx_queue: no free rx queues found!\n"); ++ return VMKNETDDI_QUEUEOPS_ERR; ++} ++ ++static int bnx2x_alloc_tx_queue(struct net_device *netdev, ++ vmknetddi_queueops_queueid_t *p_qid, ++ u16 *queue_mapping) ++{ ++ struct bnx2x *bp = netdev_priv(netdev); ++ int i; ++ ++ if (bp->n_tx_queues_allocated >= BNX2X_NUM_QUEUES(bp)) ++ return VMKNETDDI_QUEUEOPS_ERR; ++ ++ for_each_nondefault_queue(bp, i) { ++ struct bnx2x_fastpath *fp = &bp->fp[i]; ++ ++ if (!BNX2X_IS_NETQ_TX_QUEUE_ALLOCATED(fp)) { ++ fp->netq_flags |= BNX2X_NETQ_TX_QUEUE_ALLOCATED; ++ bp->n_tx_queues_allocated++; ++ *p_qid = VMKNETDDI_QUEUEOPS_MK_TX_QUEUEID(fp->index); ++ *queue_mapping = fp->index; ++ return VMKNETDDI_QUEUEOPS_OK; ++ } ++ } ++ BNX2X_ERR("bnx2x_alloc_tx_queue: no free tx queues found!\n"); ++ return VMKNETDDI_QUEUEOPS_ERR; ++} ++ ++static int bnx2x_alloc_queue(vmknetddi_queueop_alloc_queue_args_t *args) ++{ ++ if (args->type == VMKNETDDI_QUEUEOPS_QUEUE_TYPE_TX) ++ return bnx2x_alloc_tx_queue(args->netdev, &args->queueid, ++ &args->queue_mapping); ++ ++ else if (args->type == VMKNETDDI_QUEUEOPS_QUEUE_TYPE_RX) ++ return bnx2x_alloc_rx_queue(args->netdev, &args->queueid, ++ &args->napi); ++ else { ++ printk("bnx2x_alloc_queue: invalid queue type\n"); ++ return VMKNETDDI_QUEUEOPS_ERR; ++ } ++} ++ ++static int bnx2x_free_tx_queue(struct net_device *netdev, ++ vmknetddi_queueops_queueid_t qid) ++{ ++ struct bnx2x *bp = netdev_priv(netdev); ++ u16 index = VMKNETDDI_QUEUEOPS_QUEUEID_VAL(qid); ++ ++ if (index > BNX2X_NUM_QUEUES(bp)) ++ return VMKNETDDI_QUEUEOPS_ERR; ++ ++ struct bnx2x_fastpath *fp = &bp->fp[index]; ++ ++ if (!BNX2X_IS_NETQ_TX_QUEUE_ALLOCATED(fp)) ++ return VMKNETDDI_QUEUEOPS_ERR; ++ ++ fp->netq_flags &= ~BNX2X_NETQ_TX_QUEUE_ALLOCATED; ++ bp->n_tx_queues_allocated--; ++ ++ return VMKNETDDI_QUEUEOPS_OK; ++} ++ ++static int bnx2x_free_rx_queue(struct net_device *netdev, ++ vmknetddi_queueops_queueid_t qid) ++{ ++ struct bnx2x *bp = netdev_priv(netdev); ++ u16 index = VMKNETDDI_QUEUEOPS_QUEUEID_VAL(qid); ++ ++ if (index > BNX2X_NUM_QUEUES(bp)) ++ return VMKNETDDI_QUEUEOPS_ERR; ++ ++ struct bnx2x_fastpath *fp = &bp->fp[index]; ++ ++ if (!BNX2X_IS_NETQ_RX_QUEUE_ALLOCATED(fp)) ++ return VMKNETDDI_QUEUEOPS_ERR; ++ ++ fp->netq_flags &= ~BNX2X_NETQ_RX_QUEUE_ALLOCATED; ++ bp->n_rx_queues_allocated--; ++ ++ return VMKNETDDI_QUEUEOPS_OK; ++} ++ ++static int bnx2x_free_queue(vmknetddi_queueop_free_queue_args_t *args) ++{ ++ if (VMKNETDDI_QUEUEOPS_IS_TX_QUEUEID(args->queueid)) ++ return bnx2x_free_tx_queue(args->netdev, args->queueid); ++ ++ else if (VMKNETDDI_QUEUEOPS_IS_RX_QUEUEID(args->queueid)) ++ return bnx2x_free_rx_queue(args->netdev, args->queueid); ++ ++ else { ++ printk("bnx2x_free_queue: invalid queue type\n"); ++ return VMKNETDDI_QUEUEOPS_ERR; ++ } ++} ++ ++static int bnx2x_get_queue_vector(vmknetddi_queueop_get_queue_vector_args_t *args) ++{ ++ struct net_device *netdev = args->netdev; ++ struct bnx2x *bp = netdev_priv(netdev); ++ int qid; ++ ++ qid = VMKNETDDI_QUEUEOPS_QUEUEID_VAL(args->queueid); ++ if (qid > BNX2X_NUM_QUEUES(bp)) ++ return VMKNETDDI_QUEUEOPS_ERR; ++ ++#ifdef CONFIG_PCI_MSI ++ args->vector = bp->msix_table[qid].vector; ++#endif ++ return VMKNETDDI_QUEUEOPS_OK; ++} ++ ++static int bnx2x_get_default_queue(vmknetddi_queueop_get_default_queue_args_t *args) ++{ ++ struct net_device *netdev = args->netdev; ++ struct bnx2x *bp = netdev_priv(netdev); ++ ++ if (args->type == VMKNETDDI_QUEUEOPS_QUEUE_TYPE_RX) { ++ args->queueid = VMKNETDDI_QUEUEOPS_MK_RX_QUEUEID(0); ++ args->napi = &bp->fp[0].napi; ++ return VMKNETDDI_QUEUEOPS_OK; ++ ++ } else if (args->type == VMKNETDDI_QUEUEOPS_QUEUE_TYPE_TX) { ++ args->queueid = VMKNETDDI_QUEUEOPS_MK_TX_QUEUEID(0); ++ args->queue_mapping = 0; ++ return VMKNETDDI_QUEUEOPS_OK; ++ ++ } else ++ return VMKNETDDI_QUEUEOPS_ERR; ++} ++ ++static void bnx2x_remove_rx_filter_e1h(struct bnx2x *bp, u16 qid) ++{ ++ struct bnx2x_fastpath *fp = &bp->fp[qid]; ++ struct mac_configuration_cmd_e1h *config = ++ (struct mac_configuration_cmd_e1h *)bnx2x_sp(bp, mac_config); ++ ++ /* CAM allocation for E1H ++ * unicasts: by func number ++ * multicast: 20+FUNC*20, 20 each ++ */ ++ config->hdr.length = 1; ++ config->hdr.offset = BP_FUNC(bp) + (qid << (IS_E1HMF(bp) ? 3 : 1)); ++ config->hdr.client_id = bp->fp[0].cl_id; ++ config->hdr.reserved1 = 0; ++ ++ /* primary MAC */ ++ config->config_table[0].msb_mac_addr = ++ swab16(*(u16 *)&fp->mac_filter_addr[0]); ++ config->config_table[0].middle_mac_addr = ++ swab16(*(u16 *)&fp->mac_filter_addr[2]); ++ config->config_table[0].lsb_mac_addr = ++ swab16(*(u16 *)&fp->mac_filter_addr[4]); ++ config->config_table[0].client_id = BP_L_ID(bp) + qid; ++ config->config_table[0].vlan_id = 0; ++ config->config_table[0].e1hov_id = cpu_to_le16(bp->e1hov); ++ config->config_table[0].flags = MAC_CONFIGURATION_ENTRY_E1H_ACTION_TYPE; ++ ++ bnx2x_sp_post(bp, RAMROD_CMD_ID_ETH_SET_MAC, 0, ++ U64_HI(bnx2x_sp_mapping(bp, mac_config)), ++ U64_LO(bnx2x_sp_mapping(bp, mac_config)), 0); ++ ++ memset(fp->mac_filter_addr, 0, 6); ++ fp->netq_flags &= ~BNX2X_NETQ_RX_QUEUE_ACTIVE; ++} ++ ++static void bnx2x_remove_rx_filter_e1(struct bnx2x *bp, u16 qid) ++{ ++ struct mac_configuration_cmd *config = bnx2x_sp(bp, mac_config); ++ struct bnx2x_fastpath *fp = &bp->fp[qid]; ++ ++ config->hdr.length = 1; ++ config->hdr.offset = (BP_PORT(bp) ? 32 : 0) + qid; ++ config->hdr.client_id = bp->fp[0].cl_id; ++ config->hdr.reserved1 = 0; ++ ++ config->config_table[0].cam_entry.msb_mac_addr = ++ swab16(*(u16 *)&fp->mac_filter_addr[0]); ++ config->config_table[0].cam_entry.middle_mac_addr = ++ swab16(*(u16 *)&fp->mac_filter_addr[2]); ++ config->config_table[0].cam_entry.lsb_mac_addr = ++ swab16(*(u16 *)&fp->mac_filter_addr[4]); ++ config->config_table[0].cam_entry.flags = cpu_to_le16(BP_PORT(bp)); ++ config->config_table[0].target_table_entry.flags = ++ TSTORM_CAM_TARGET_TABLE_ENTRY_ACTION_TYPE; ++ config->config_table[0].target_table_entry.client_id = qid; ++ config->config_table[0].target_table_entry.vlan_id = 0; ++ ++ bnx2x_sp_post(bp, RAMROD_CMD_ID_ETH_SET_MAC, 0, ++ U64_HI(bnx2x_sp_mapping(bp, mac_config)), ++ U64_LO(bnx2x_sp_mapping(bp, mac_config)), 0); ++ ++ memset(fp->mac_filter_addr, 0, 6); ++ fp->netq_flags &= ~BNX2X_NETQ_RX_QUEUE_ACTIVE; ++} ++ ++static int bnx2x_remove_rx_filter(vmknetddi_queueop_remove_rx_filter_args_t *args) ++{ ++ struct bnx2x *bp = netdev_priv(args->netdev); ++ u16 qid = VMKNETDDI_QUEUEOPS_QUEUEID_VAL(args->queueid); ++ u16 fid = VMKNETDDI_QUEUEOPS_FILTERID_VAL(args->filterid); ++ struct bnx2x_fastpath *fp = &bp->fp[qid]; ++ ++ if (!VMKNETDDI_QUEUEOPS_IS_RX_QUEUEID(args->queueid)) ++ return VMKNETDDI_QUEUEOPS_ERR; ++ ++ if (qid > BNX2X_NUM_QUEUES(bp)) ++ return VMKNETDDI_QUEUEOPS_ERR; ++ ++ /* Only support one Mac filter per queue */ ++ if ((fid != 0) || !BNX2X_IS_NETQ_RX_QUEUE_ACTIVE(fp)) ++ return VMKNETDDI_QUEUEOPS_ERR; ++ ++ if (CHIP_IS_E1H(bp)) ++ bnx2x_remove_rx_filter_e1h(bp, qid); ++ else ++ bnx2x_remove_rx_filter_e1(bp, qid); ++ ++ return VMKNETDDI_QUEUEOPS_OK; ++} ++ ++static void bnx2x_apply_rx_filter_e1h(struct bnx2x *bp, u16 queueid) ++{ ++ struct mac_configuration_cmd_e1h *config = ++ (struct mac_configuration_cmd_e1h *)bnx2x_sp(bp, mac_config); ++ struct bnx2x_fastpath *fp = &bp->fp[queueid]; ++ ++ config->hdr.length = 1; ++ config->hdr.offset = BP_FUNC(bp) + (queueid << (IS_E1HMF(bp) ? 3 : 1)); ++ config->hdr.client_id = bp->fp[0].cl_id; ++ config->hdr.reserved1 = 0; ++ ++ config->config_table[0].msb_mac_addr = ++ swab16(*(u16 *)&fp->mac_filter_addr[0]); ++ config->config_table[0].middle_mac_addr = ++ swab16(*(u16 *)&fp->mac_filter_addr[2]); ++ config->config_table[0].lsb_mac_addr = ++ swab16(*(u16 *)&fp->mac_filter_addr[4]); ++ config->config_table[0].client_id = BP_L_ID(bp) + queueid; ++ config->config_table[0].vlan_id = 0; ++ config->config_table[0].e1hov_id = cpu_to_le16(bp->e1hov); ++ config->config_table[0].flags = BP_PORT(bp); ++ ++ bnx2x_sp_post(bp, RAMROD_CMD_ID_ETH_SET_MAC, 0, ++ U64_HI(bnx2x_sp_mapping(bp, mac_config)), ++ U64_LO(bnx2x_sp_mapping(bp, mac_config)), 0); ++ ++ fp->netq_flags |= BNX2X_NETQ_RX_QUEUE_ACTIVE; ++} ++ ++static void bnx2x_apply_rx_filter_e1(struct bnx2x *bp, u16 queueid) ++{ ++ struct mac_configuration_cmd *config = bnx2x_sp(bp, mac_config); ++ struct bnx2x_fastpath *fp = &bp->fp[queueid]; ++ ++ config->hdr.length = 1; ++ config->hdr.offset = (BP_PORT(bp) ? 32 : 0) + queueid; ++ config->hdr.client_id = bp->fp[0].cl_id; ++ config->hdr.reserved1 = 0; ++ ++ config->config_table[0].cam_entry.msb_mac_addr = ++ swab16(*(u16 *)&fp->mac_filter_addr[0]); ++ config->config_table[0].cam_entry.middle_mac_addr = ++ swab16(*(u16 *)&fp->mac_filter_addr[2]); ++ config->config_table[0].cam_entry.lsb_mac_addr = ++ swab16(*(u16 *)&fp->mac_filter_addr[4]); ++ config->config_table[0].cam_entry.flags = cpu_to_le16(BP_PORT(bp)); ++ config->config_table[0].target_table_entry.flags = 0; ++ config->config_table[0].target_table_entry.client_id = queueid; ++ config->config_table[0].target_table_entry.vlan_id = 0; ++ ++ bnx2x_sp_post(bp, RAMROD_CMD_ID_ETH_SET_MAC, 0, ++ U64_HI(bnx2x_sp_mapping(bp, mac_config)), ++ U64_LO(bnx2x_sp_mapping(bp, mac_config)), 0); ++ ++ fp->netq_flags |= BNX2X_NETQ_RX_QUEUE_ACTIVE; ++} ++ ++static int bnx2x_apply_rx_filter(vmknetddi_queueop_apply_rx_filter_args_t *args) ++{ ++ struct bnx2x *bp = netdev_priv(args->netdev); ++ struct bnx2x_fastpath *fp; ++ u16 queueid = VMKNETDDI_QUEUEOPS_QUEUEID_VAL(args->queueid); ++ u8 *macaddr; ++ ++ if (!VMKNETDDI_QUEUEOPS_IS_RX_QUEUEID(args->queueid)) ++ return VMKNETDDI_QUEUEOPS_ERR; ++ ++ if (vmknetddi_queueops_get_filter_class(&args->filter) ++ != VMKNETDDI_QUEUEOPS_FILTER_MACADDR) ++ return VMKNETDDI_QUEUEOPS_ERR; ++ ++ if (queueid > BNX2X_NUM_QUEUES(bp)) ++ return VMKNETDDI_QUEUEOPS_ERR; ++ ++ fp = &bp->fp[queueid]; ++ ++ if (BNX2X_IS_NETQ_RX_QUEUE_ACTIVE(fp) || ++ !BNX2X_IS_NETQ_RX_QUEUE_ALLOCATED(fp)) ++ return VMKNETDDI_QUEUEOPS_ERR; ++ ++ macaddr = (void *)vmknetddi_queueops_get_filter_macaddr(&args->filter); ++ memcpy(fp->mac_filter_addr, macaddr, 6); ++ if (CHIP_IS_E1H(bp)) ++ bnx2x_apply_rx_filter_e1h(bp, queueid); ++ else ++ bnx2x_apply_rx_filter_e1(bp, queueid); ++ args->filterid = VMKNETDDI_QUEUEOPS_MK_FILTERID(0); ++ ++ return VMKNETDDI_QUEUEOPS_OK; ++} ++ ++static int bnx2x_get_queue_stats(vmknetddi_queueop_get_stats_args_t *args) ++{ ++ return VMKNETDDI_QUEUEOPS_ERR; ++} ++ ++static int bnx2x_get_netqueue_version(vmknetddi_queueop_get_version_args_t *args) ++{ ++ return vmknetddi_queueops_version(args); ++} ++ ++static int bnx2x_netqueue_ops(vmknetddi_queueops_op_t op, void *args) ++{ ++ switch (op) { ++ case VMKNETDDI_QUEUEOPS_OP_GET_VERSION: ++ return bnx2x_get_netqueue_version( ++ (vmknetddi_queueop_get_version_args_t *)args); ++ break; ++ ++ case VMKNETDDI_QUEUEOPS_OP_GET_FEATURES: ++ return bnx2x_get_netqueue_features( ++ (vmknetddi_queueop_get_features_args_t *)args); ++ break; ++ ++ case VMKNETDDI_QUEUEOPS_OP_GET_QUEUE_COUNT: ++ return bnx2x_get_queue_count( ++ (vmknetddi_queueop_get_queue_count_args_t *)args); ++ break; ++ ++ case VMKNETDDI_QUEUEOPS_OP_GET_FILTER_COUNT: ++ return bnx2x_get_filter_count( ++ (vmknetddi_queueop_get_filter_count_args_t *)args); ++ break; ++ ++ case VMKNETDDI_QUEUEOPS_OP_ALLOC_QUEUE: ++ return bnx2x_alloc_queue( ++ (vmknetddi_queueop_alloc_queue_args_t *)args); ++ break; ++ ++ case VMKNETDDI_QUEUEOPS_OP_FREE_QUEUE: ++ return bnx2x_free_queue( ++ (vmknetddi_queueop_free_queue_args_t *)args); ++ break; ++ ++ case VMKNETDDI_QUEUEOPS_OP_GET_QUEUE_VECTOR: ++ return bnx2x_get_queue_vector( ++ (vmknetddi_queueop_get_queue_vector_args_t *)args); ++ break; ++ ++ case VMKNETDDI_QUEUEOPS_OP_GET_DEFAULT_QUEUE: ++ return bnx2x_get_default_queue( ++ (vmknetddi_queueop_get_default_queue_args_t *)args); ++ break; ++ ++ case VMKNETDDI_QUEUEOPS_OP_APPLY_RX_FILTER: ++ return bnx2x_apply_rx_filter( ++ (vmknetddi_queueop_apply_rx_filter_args_t *)args); ++ break; ++ ++ case VMKNETDDI_QUEUEOPS_OP_REMOVE_RX_FILTER: ++ return bnx2x_remove_rx_filter( ++ (vmknetddi_queueop_remove_rx_filter_args_t *)args); ++ break; ++ ++ case VMKNETDDI_QUEUEOPS_OP_GET_STATS: ++ return bnx2x_get_queue_stats( ++ (vmknetddi_queueop_get_stats_args_t *)args); ++ break; ++ ++ default: ++ printk("Unhandled NETQUEUE OP %d\n", op); ++ return VMKNETDDI_QUEUEOPS_ERR; ++ } ++ ++ return VMKNETDDI_QUEUEOPS_ERR; ++} ++ ++#endif /* defined(__VMKLNX__) && defined(__VMKNETDDI_QUEUEOPS__) */ +diff -r ddb96c0bbe13 drivers/net/bnx2x_reg.h +--- a/drivers/net/bnx2x_reg.h Tue Jun 16 11:03:28 2009 +0100 ++++ b/drivers/net/bnx2x_reg.h Tue Jun 16 13:15:30 2009 +0100 +@@ -30,8 +30,20 @@ + address BRB1_IND_FREE_LIST_PRS_CRDT+1 initialize free tail. At address + BRB1_IND_FREE_LIST_PRS_CRDT+2 initialize parser initial credit. */ + #define BRB1_REG_FREE_LIST_PRS_CRDT 0x60200 ++/* [RW 10] The number of free blocks above which the High_llfc signal to ++ interface #n is de-asserted. */ ++#define BRB1_REG_HIGH_LLFC_HIGH_THRESHOLD_0 0x6014c ++/* [RW 10] The number of free blocks below which the High_llfc signal to ++ interface #n is asserted. */ ++#define BRB1_REG_HIGH_LLFC_LOW_THRESHOLD_0 0x6013c + /* [RW 23] LL RAM data. */ + #define BRB1_REG_LL_RAM 0x61000 ++/* [RW 10] The number of free blocks above which the Low_llfc signal to ++ interface #n is de-asserted. */ ++#define BRB1_REG_LOW_LLFC_HIGH_THRESHOLD_0 0x6016c ++/* [RW 10] The number of free blocks below which the Low_llfc signal to ++ interface #n is asserted. */ ++#define BRB1_REG_LOW_LLFC_LOW_THRESHOLD_0 0x6015c + /* [R 24] The number of full blocks. */ + #define BRB1_REG_NUM_OF_FULL_BLOCKS 0x60090 + /* [ST 32] The number of cycles that the write_full signal towards MAC #0 +@@ -125,6 +137,10 @@ + stands for weight 8 (the most prioritised); 1 stands for weight 1(least + prioritised); 2 stands for weight 2; tc. */ + #define CCM_REG_CQM_P_WEIGHT 0xd00b8 ++/* [RW 3] The weight of the QM (secondary) input in the WRR mechanism. 0 ++ stands for weight 8 (the most prioritised); 1 stands for weight 1(least ++ prioritised); 2 stands for weight 2; tc. */ ++#define CCM_REG_CQM_S_WEIGHT 0xd00bc + /* [RW 1] Input SDM Interface enable. If 0 - the valid input is disregarded; + acknowledge output is deasserted; all other signals are treated as usual; + if 1 - normal activity. */ +@@ -132,6 +148,10 @@ + /* [RC 1] Set when the message length mismatch (relative to last indication) + at the SDM interface is detected. */ + #define CCM_REG_CSDM_LENGTH_MIS 0xd0170 ++/* [RW 3] The weight of the SDM input in the WRR mechanism. 0 stands for ++ weight 8 (the most prioritised); 1 stands for weight 1(least ++ prioritised); 2 stands for weight 2; tc. */ ++#define CCM_REG_CSDM_WEIGHT 0xd00b4 + /* [RW 28] The CM header for QM formatting in case of an error in the QM + inputs. */ + #define CCM_REG_ERR_CCM_HDR 0xd0094 +@@ -170,12 +190,6 @@ + _(0..15) stands for the connection type (one of 16). */ + #define CCM_REG_N_SM_CTX_LD_0 0xd004c + #define CCM_REG_N_SM_CTX_LD_1 0xd0050 +-#define CCM_REG_N_SM_CTX_LD_10 0xd0074 +-#define CCM_REG_N_SM_CTX_LD_11 0xd0078 +-#define CCM_REG_N_SM_CTX_LD_12 0xd007c +-#define CCM_REG_N_SM_CTX_LD_13 0xd0080 +-#define CCM_REG_N_SM_CTX_LD_14 0xd0084 +-#define CCM_REG_N_SM_CTX_LD_15 0xd0088 + #define CCM_REG_N_SM_CTX_LD_2 0xd0054 + #define CCM_REG_N_SM_CTX_LD_3 0xd0058 + #define CCM_REG_N_SM_CTX_LD_4 0xd005c +@@ -211,6 +225,11 @@ + /* [RC 1] Set when the message length mismatch (relative to last indication) + at the STORM interface is detected. */ + #define CCM_REG_STORM_LENGTH_MIS 0xd016c ++/* [RW 3] The weight of the STORM input in the WRR (Weighted Round robin) ++ mechanism. 0 stands for weight 8 (the most prioritised); 1 stands for ++ weight 1(least prioritised); 2 stands for weight 2 (more prioritised); ++ tc. */ ++#define CCM_REG_STORM_WEIGHT 0xd009c + /* [RW 1] Input tsem Interface enable. If 0 - the valid input is + disregarded; acknowledge output is deasserted; all other signals are + treated as usual; if 1 - normal activity. */ +@@ -294,12 +313,12 @@ + #define CDU_REG_MATT 0x101100 + /* [RW 1] when this bit is set the CDU operates in e1hmf mode */ + #define CDU_REG_MF_MODE 0x101050 ++/* [RW 13] activity counter ram access */ ++#define CFC_REG_ACTIVITY_COUNTER 0x104400 ++#define CFC_REG_ACTIVITY_COUNTER_SIZE 256 + /* [R 1] indication the initializing the activity counter by the hardware + was done. */ + #define CFC_REG_AC_INIT_DONE 0x104078 +-/* [RW 13] activity counter ram access */ +-#define CFC_REG_ACTIVITY_COUNTER 0x104400 +-#define CFC_REG_ACTIVITY_COUNTER_SIZE 256 + /* [R 1] indication the initializing the cams by the hardware was done. */ + #define CFC_REG_CAM_INIT_DONE 0x10407c + /* [RW 2] Interrupt mask register #0 read/write */ +@@ -323,7 +342,11 @@ + set one of these bits. the bit description can be found in CFC + specifications */ + #define CFC_REG_ERROR_VECTOR 0x10403c ++/* [WB 93] LCID info ram access */ ++#define CFC_REG_INFO_RAM 0x105000 ++#define CFC_REG_INFO_RAM_SIZE 1024 + #define CFC_REG_INIT_REG 0x10404c ++#define CFC_REG_INTERFACES 0x104058 + /* [RW 24] {weight_load_client7[2:0] to weight_load_client0[2:0]}. this + field allows changing the priorities of the weighted-round-robin arbiter + which selects which CFC load client should be served next */ +@@ -337,13 +360,10 @@ + #define CFC_REG_NUM_LCIDS_ALLOC 0x104020 + /* [R 9] Number of Arriving LCIDs in Link List Block */ + #define CFC_REG_NUM_LCIDS_ARRIVING 0x104004 +-/* [R 9] Number of Inside LCIDs in Link List Block */ +-#define CFC_REG_NUM_LCIDS_INSIDE 0x104008 + /* [R 9] Number of Leaving LCIDs in Link List Block */ + #define CFC_REG_NUM_LCIDS_LEAVING 0x104018 + /* [RW 8] The event id for aggregated interrupt 0 */ + #define CSDM_REG_AGG_INT_EVENT_0 0xc2038 +-#define CSDM_REG_AGG_INT_EVENT_1 0xc203c + #define CSDM_REG_AGG_INT_EVENT_10 0xc2060 + #define CSDM_REG_AGG_INT_EVENT_11 0xc2064 + #define CSDM_REG_AGG_INT_EVENT_12 0xc2068 +@@ -351,37 +371,27 @@ + #define CSDM_REG_AGG_INT_EVENT_14 0xc2070 + #define CSDM_REG_AGG_INT_EVENT_15 0xc2074 + #define CSDM_REG_AGG_INT_EVENT_16 0xc2078 +-#define CSDM_REG_AGG_INT_EVENT_17 0xc207c +-#define CSDM_REG_AGG_INT_EVENT_18 0xc2080 +-#define CSDM_REG_AGG_INT_EVENT_19 0xc2084 + #define CSDM_REG_AGG_INT_EVENT_2 0xc2040 +-#define CSDM_REG_AGG_INT_EVENT_20 0xc2088 +-#define CSDM_REG_AGG_INT_EVENT_21 0xc208c +-#define CSDM_REG_AGG_INT_EVENT_22 0xc2090 +-#define CSDM_REG_AGG_INT_EVENT_23 0xc2094 +-#define CSDM_REG_AGG_INT_EVENT_24 0xc2098 +-#define CSDM_REG_AGG_INT_EVENT_25 0xc209c +-#define CSDM_REG_AGG_INT_EVENT_26 0xc20a0 +-#define CSDM_REG_AGG_INT_EVENT_27 0xc20a4 +-#define CSDM_REG_AGG_INT_EVENT_28 0xc20a8 +-#define CSDM_REG_AGG_INT_EVENT_29 0xc20ac + #define CSDM_REG_AGG_INT_EVENT_3 0xc2044 +-#define CSDM_REG_AGG_INT_EVENT_30 0xc20b0 +-#define CSDM_REG_AGG_INT_EVENT_31 0xc20b4 + #define CSDM_REG_AGG_INT_EVENT_4 0xc2048 +-/* [RW 1] The T bit for aggregated interrupt 0 */ +-#define CSDM_REG_AGG_INT_T_0 0xc20b8 +-#define CSDM_REG_AGG_INT_T_1 0xc20bc +-#define CSDM_REG_AGG_INT_T_10 0xc20e0 +-#define CSDM_REG_AGG_INT_T_11 0xc20e4 +-#define CSDM_REG_AGG_INT_T_12 0xc20e8 +-#define CSDM_REG_AGG_INT_T_13 0xc20ec +-#define CSDM_REG_AGG_INT_T_14 0xc20f0 +-#define CSDM_REG_AGG_INT_T_15 0xc20f4 +-#define CSDM_REG_AGG_INT_T_16 0xc20f8 +-#define CSDM_REG_AGG_INT_T_17 0xc20fc +-#define CSDM_REG_AGG_INT_T_18 0xc2100 +-#define CSDM_REG_AGG_INT_T_19 0xc2104 ++#define CSDM_REG_AGG_INT_EVENT_5 0xc204c ++#define CSDM_REG_AGG_INT_EVENT_6 0xc2050 ++#define CSDM_REG_AGG_INT_EVENT_7 0xc2054 ++#define CSDM_REG_AGG_INT_EVENT_8 0xc2058 ++#define CSDM_REG_AGG_INT_EVENT_9 0xc205c ++/* [RW 1] For each aggregated interrupt index whether the mode is normal (0) ++ or auto-mask-mode (1) */ ++#define CSDM_REG_AGG_INT_MODE_10 0xc21e0 ++#define CSDM_REG_AGG_INT_MODE_11 0xc21e4 ++#define CSDM_REG_AGG_INT_MODE_12 0xc21e8 ++#define CSDM_REG_AGG_INT_MODE_13 0xc21ec ++#define CSDM_REG_AGG_INT_MODE_14 0xc21f0 ++#define CSDM_REG_AGG_INT_MODE_15 0xc21f4 ++#define CSDM_REG_AGG_INT_MODE_16 0xc21f8 ++#define CSDM_REG_AGG_INT_MODE_6 0xc21d0 ++#define CSDM_REG_AGG_INT_MODE_7 0xc21d4 ++#define CSDM_REG_AGG_INT_MODE_8 0xc21d8 ++#define CSDM_REG_AGG_INT_MODE_9 0xc21dc + /* [RW 13] The start address in the internal RAM for the cfc_rsp lcid */ + #define CSDM_REG_CFC_RSP_START_ADDR 0xc2008 + /* [RW 16] The maximum value of the competion counter #0 */ +@@ -529,11 +539,11 @@ + /* [ST 24] Statistics register. The number of messages that were sent to + FOC3 */ + #define CSEM_REG_MSG_NUM_FOC3 0x200014 ++/* [WB 128] Debug only. Passive buffer memory */ ++#define CSEM_REG_PASSIVE_BUFFER 0x202000 + /* [RW 1] Disables input messages from the passive buffer May be updated + during run_time by the microcode */ + #define CSEM_REG_PAS_DISABLE 0x20024c +-/* [WB 128] Debug only. Passive buffer memory */ +-#define CSEM_REG_PASSIVE_BUFFER 0x202000 + /* [WB 46] pram memory. B45 is parity; b[44:0] - data. */ + #define CSEM_REG_PRAM 0x240000 + /* [R 16] Valid sleeping threads indication have bit per thread */ +@@ -604,24 +614,6 @@ + #define DMAE_REG_GO_C0 0x102080 + /* [RW 1] Command 1 go. */ + #define DMAE_REG_GO_C1 0x102084 +-/* [RW 1] Command 10 go. */ +-#define DMAE_REG_GO_C10 0x102088 +-#define DMAE_REG_GO_C10_SIZE 1 +-/* [RW 1] Command 11 go. */ +-#define DMAE_REG_GO_C11 0x10208c +-#define DMAE_REG_GO_C11_SIZE 1 +-/* [RW 1] Command 12 go. */ +-#define DMAE_REG_GO_C12 0x102090 +-#define DMAE_REG_GO_C12_SIZE 1 +-/* [RW 1] Command 13 go. */ +-#define DMAE_REG_GO_C13 0x102094 +-#define DMAE_REG_GO_C13_SIZE 1 +-/* [RW 1] Command 14 go. */ +-#define DMAE_REG_GO_C14 0x102098 +-#define DMAE_REG_GO_C14_SIZE 1 +-/* [RW 1] Command 15 go. */ +-#define DMAE_REG_GO_C15 0x10209c +-#define DMAE_REG_GO_C15_SIZE 1 + /* [RW 1] Command 10 go. */ + #define DMAE_REG_GO_C10 0x102088 + /* [RW 1] Command 11 go. */ +@@ -730,6 +722,7 @@ + #define DORQ_REG_SHRT_CMHEAD 0x170054 + #define HC_CONFIG_0_REG_ATTN_BIT_EN_0 (0x1<<4) + #define HC_CONFIG_0_REG_INT_LINE_EN_0 (0x1<<3) ++#define HC_CONFIG_0_REG_MSI_ATTN_EN_0 (0x1<<7) + #define HC_CONFIG_0_REG_MSI_MSIX_INT_EN_0 (0x1<<2) + #define HC_CONFIG_0_REG_SINGLE_ISR_EN_0 (0x1<<1) + #define HC_REG_AGG_INT_0 0x108050 +@@ -772,7 +765,6 @@ + #define MCP_REG_MCPR_NVM_READ 0x86410 + #define MCP_REG_MCPR_NVM_SW_ARB 0x86420 + #define MCP_REG_MCPR_NVM_WRITE 0x86408 +-#define MCP_REG_MCPR_NVM_WRITE1 0x86428 + #define MCP_REG_MCPR_SCRATCH 0xa0000 + /* [R 32] read first 32 bit after inversion of function 0. mapped as + follows: [0] NIG attention for function0; [1] NIG attention for +@@ -1158,19 +1150,7 @@ + #define MISC_REG_AEU_GENERAL_ATTN_10 0xa028 + #define MISC_REG_AEU_GENERAL_ATTN_11 0xa02c + #define MISC_REG_AEU_GENERAL_ATTN_12 0xa030 +-#define MISC_REG_AEU_GENERAL_ATTN_13 0xa034 +-#define MISC_REG_AEU_GENERAL_ATTN_14 0xa038 +-#define MISC_REG_AEU_GENERAL_ATTN_15 0xa03c +-#define MISC_REG_AEU_GENERAL_ATTN_16 0xa040 +-#define MISC_REG_AEU_GENERAL_ATTN_17 0xa044 +-#define MISC_REG_AEU_GENERAL_ATTN_18 0xa048 +-#define MISC_REG_AEU_GENERAL_ATTN_19 0xa04c +-#define MISC_REG_AEU_GENERAL_ATTN_10 0xa028 +-#define MISC_REG_AEU_GENERAL_ATTN_11 0xa02c +-#define MISC_REG_AEU_GENERAL_ATTN_12 0xa030 + #define MISC_REG_AEU_GENERAL_ATTN_2 0xa008 +-#define MISC_REG_AEU_GENERAL_ATTN_20 0xa050 +-#define MISC_REG_AEU_GENERAL_ATTN_21 0xa054 + #define MISC_REG_AEU_GENERAL_ATTN_3 0xa00c + #define MISC_REG_AEU_GENERAL_ATTN_4 0xa010 + #define MISC_REG_AEU_GENERAL_ATTN_5 0xa014 +@@ -1262,137 +1242,13 @@ + set. if the appropriate bit is clear (the driver request to free a client + it doesn't controls the ~MISC_REGISTERS_INT_STS.GENERIC_SW interrupt will + be asserted). */ +-#define MISC_REG_DRIVER_CONTROL_10 0xa3e0 +-#define MISC_REG_DRIVER_CONTROL_10_SIZE 2 +-/* [RW 32] The following driver registers(1...16) represent 16 drivers and +- 32 clients. Each client can be controlled by one driver only. One in each +- bit represent that this driver control the appropriate client (Ex: bit 5 +- is set means this driver control client number 5). addr1 = set; addr0 = +- clear; read from both addresses will give the same result = status. write +- to address 1 will set a request to control all the clients that their +- appropriate bit (in the write command) is set. if the client is free (the +- appropriate bit in all the other drivers is clear) one will be written to +- that driver register; if the client isn't free the bit will remain zero. +- if the appropriate bit is set (the driver request to gain control on a +- client it already controls the ~MISC_REGISTERS_INT_STS.GENERIC_SW +- interrupt will be asserted). write to address 0 will set a request to +- free all the clients that their appropriate bit (in the write command) is +- set. if the appropriate bit is clear (the driver request to free a client +- it doesn't controls the ~MISC_REGISTERS_INT_STS.GENERIC_SW interrupt will +- be asserted). */ +-#define MISC_REG_DRIVER_CONTROL_11 0xa3e8 +-#define MISC_REG_DRIVER_CONTROL_11_SIZE 2 +-/* [RW 32] The following driver registers(1...16) represent 16 drivers and +- 32 clients. Each client can be controlled by one driver only. One in each +- bit represent that this driver control the appropriate client (Ex: bit 5 +- is set means this driver control client number 5). addr1 = set; addr0 = +- clear; read from both addresses will give the same result = status. write +- to address 1 will set a request to control all the clients that their +- appropriate bit (in the write command) is set. if the client is free (the +- appropriate bit in all the other drivers is clear) one will be written to +- that driver register; if the client isn't free the bit will remain zero. +- if the appropriate bit is set (the driver request to gain control on a +- client it already controls the ~MISC_REGISTERS_INT_STS.GENERIC_SW +- interrupt will be asserted). write to address 0 will set a request to +- free all the clients that their appropriate bit (in the write command) is +- set. if the appropriate bit is clear (the driver request to free a client +- it doesn't controls the ~MISC_REGISTERS_INT_STS.GENERIC_SW interrupt will +- be asserted). */ +-#define MISC_REG_DRIVER_CONTROL_12 0xa3f0 +-#define MISC_REG_DRIVER_CONTROL_12_SIZE 2 +-/* [RW 32] The following driver registers(1...16) represent 16 drivers and +- 32 clients. Each client can be controlled by one driver only. One in each +- bit represent that this driver control the appropriate client (Ex: bit 5 +- is set means this driver control client number 5). addr1 = set; addr0 = +- clear; read from both addresses will give the same result = status. write +- to address 1 will set a request to control all the clients that their +- appropriate bit (in the write command) is set. if the client is free (the +- appropriate bit in all the other drivers is clear) one will be written to +- that driver register; if the client isn't free the bit will remain zero. +- if the appropriate bit is set (the driver request to gain control on a +- client it already controls the ~MISC_REGISTERS_INT_STS.GENERIC_SW +- interrupt will be asserted). write to address 0 will set a request to +- free all the clients that their appropriate bit (in the write command) is +- set. if the appropriate bit is clear (the driver request to free a client +- it doesn't controls the ~MISC_REGISTERS_INT_STS.GENERIC_SW interrupt will +- be asserted). */ +-#define MISC_REG_DRIVER_CONTROL_13 0xa3f8 +-#define MISC_REG_DRIVER_CONTROL_13_SIZE 2 +-/* [RW 32] The following driver registers(1...16) represent 16 drivers and +- 32 clients. Each client can be controlled by one driver only. One in each +- bit represent that this driver control the appropriate client (Ex: bit 5 +- is set means this driver control client number 5). addr1 = set; addr0 = +- clear; read from both addresses will give the same result = status. write +- to address 1 will set a request to control all the clients that their +- appropriate bit (in the write command) is set. if the client is free (the +- appropriate bit in all the other drivers is clear) one will be written to +- that driver register; if the client isn't free the bit will remain zero. +- if the appropriate bit is set (the driver request to gain control on a +- client it already controls the ~MISC_REGISTERS_INT_STS.GENERIC_SW +- interrupt will be asserted). write to address 0 will set a request to +- free all the clients that their appropriate bit (in the write command) is +- set. if the appropriate bit is clear (the driver request to free a client +- it doesn't controls the ~MISC_REGISTERS_INT_STS.GENERIC_SW interrupt will +- be asserted). */ + #define MISC_REG_DRIVER_CONTROL_1 0xa510 +-#define MISC_REG_DRIVER_CONTROL_14 0xa5e0 +-#define MISC_REG_DRIVER_CONTROL_14_SIZE 2 +-/* [RW 32] The following driver registers(1...16) represent 16 drivers and +- 32 clients. Each client can be controlled by one driver only. One in each +- bit represent that this driver control the appropriate client (Ex: bit 5 +- is set means this driver control client number 5). addr1 = set; addr0 = +- clear; read from both addresses will give the same result = status. write +- to address 1 will set a request to control all the clients that their +- appropriate bit (in the write command) is set. if the client is free (the +- appropriate bit in all the other drivers is clear) one will be written to +- that driver register; if the client isn't free the bit will remain zero. +- if the appropriate bit is set (the driver request to gain control on a +- client it already controls the ~MISC_REGISTERS_INT_STS.GENERIC_SW +- interrupt will be asserted). write to address 0 will set a request to +- free all the clients that their appropriate bit (in the write command) is +- set. if the appropriate bit is clear (the driver request to free a client +- it doesn't controls the ~MISC_REGISTERS_INT_STS.GENERIC_SW interrupt will +- be asserted). */ +-#define MISC_REG_DRIVER_CONTROL_15 0xa5e8 +-#define MISC_REG_DRIVER_CONTROL_15_SIZE 2 +-/* [RW 32] The following driver registers(1...16) represent 16 drivers and +- 32 clients. Each client can be controlled by one driver only. One in each +- bit represent that this driver control the appropriate client (Ex: bit 5 +- is set means this driver control client number 5). addr1 = set; addr0 = +- clear; read from both addresses will give the same result = status. write +- to address 1 will set a request to control all the clients that their +- appropriate bit (in the write command) is set. if the client is free (the +- appropriate bit in all the other drivers is clear) one will be written to +- that driver register; if the client isn't free the bit will remain zero. +- if the appropriate bit is set (the driver request to gain control on a +- client it already controls the ~MISC_REGISTERS_INT_STS.GENERIC_SW +- interrupt will be asserted). write to address 0 will set a request to +- free all the clients that their appropriate bit (in the write command) is +- set. if the appropriate bit is clear (the driver request to free a client +- it doesn't controls the ~MISC_REGISTERS_INT_STS.GENERIC_SW interrupt will +- be asserted). */ +-#define MISC_REG_DRIVER_CONTROL_16 0xa5f0 +-#define MISC_REG_DRIVER_CONTROL_16_SIZE 2 +-/* [RW 32] The following driver registers(1...16) represent 16 drivers and +- 32 clients. Each client can be controlled by one driver only. One in each +- bit represent that this driver control the appropriate client (Ex: bit 5 +- is set means this driver control client number 5). addr1 = set; addr0 = +- clear; read from both addresses will give the same result = status. write +- to address 1 will set a request to control all the clients that their +- appropriate bit (in the write command) is set. if the client is free (the +- appropriate bit in all the other drivers is clear) one will be written to +- that driver register; if the client isn't free the bit will remain zero. +- if the appropriate bit is set (the driver request to gain control on a +- client it already controls the ~MISC_REGISTERS_INT_STS.GENERIC_SW +- interrupt will be asserted). write to address 0 will set a request to +- free all the clients that their appropriate bit (in the write command) is +- set. if the appropriate bit is clear (the driver request to free a client +- it doesn't controls the ~MISC_REGISTERS_INT_STS.GENERIC_SW interrupt will +- be asserted). */ + #define MISC_REG_DRIVER_CONTROL_7 0xa3c8 + /* [RW 1] e1hmf for WOL. If clr WOL signal o the PXP will be send on bit 0 + only. */ + #define MISC_REG_E1HMF_MODE 0xa5f8 ++/* [RW 32] Debug only: spare RW register reset by core reset */ ++#define MISC_REG_GENERIC_CR_0 0xa460 + /* [RW 32] GPIO. [31-28] FLOAT port 0; [27-24] FLOAT port 0; When any of + these bits is written as a '1'; the corresponding SPIO bit will turn off + it's drivers and become an input. This is the reset state of all GPIO +@@ -1410,6 +1266,29 @@ + This is the result value of the pin; not the drive value. Writing these + bits will have not effect. */ + #define MISC_REG_GPIO 0xa490 ++/* [RW 8] These bits enable the GPIO_INTs to signals event to the ++ IGU/MCP.according to the following map: [0] p0_gpio_0; [1] p0_gpio_1; [2] ++ p0_gpio_2; [3] p0_gpio_3; [4] p1_gpio_0; [5] p1_gpio_1; [6] p1_gpio_2; ++ [7] p1_gpio_3; */ ++#define MISC_REG_GPIO_EVENT_EN 0xa2bc ++/* [RW 32] GPIO INT. [31-28] OLD_CLR port1; [27-24] OLD_CLR port0; Writing a ++ '1' to these bit clears the corresponding bit in the #OLD_VALUE register. ++ This will acknowledge an interrupt on the falling edge of corresponding ++ GPIO input (reset value 0). [23-16] OLD_SET [23-16] port1; OLD_SET port0; ++ Writing a '1' to these bit sets the corresponding bit in the #OLD_VALUE ++ register. This will acknowledge an interrupt on the rising edge of ++ corresponding SPIO input (reset value 0). [15-12] OLD_VALUE [11-8] port1; ++ OLD_VALUE port0; RO; These bits indicate the old value of the GPIO input ++ value. When the ~INT_STATE bit is set; this bit indicates the OLD value ++ of the pin such that if ~INT_STATE is set and this bit is '0'; then the ++ interrupt is due to a low to high edge. If ~INT_STATE is set and this bit ++ is '1'; then the interrupt is due to a high to low edge (reset value 0). ++ [7-4] INT_STATE port1; [3-0] INT_STATE RO port0; These bits indicate the ++ current GPIO interrupt state for each GPIO pin. This bit is cleared when ++ the appropriate #OLD_SET or #OLD_CLR command bit is written. This bit is ++ set when the GPIO input does not match the current value in #OLD_VALUE ++ (reset value 0). */ ++#define MISC_REG_GPIO_INT 0xa494 + /* [R 28] this field hold the last information that caused reserved + attention. bits [19:0] - address; [22:20] function; [23] reserved; + [27:24] the master that caused the attention - according to the following +@@ -1554,6 +1433,14 @@ + command bit is written. This bit is set when the SPIO input does not + match the current value in #OLD_VALUE (reset value 0). */ + #define MISC_REG_SPIO_INT 0xa500 ++/* [RW 32] reload value for counter 4 if reload; the value will be reload if ++ the counter reached zero and the reload bit ++ (~misc_registers_sw_timer_cfg_4.sw_timer_cfg_4[1] ) is set */ ++#define MISC_REG_SW_TIMER_RELOAD_VAL_4 0xa2fc ++/* [RW 32] the value of the counter for sw timers1-8. there are 8 addresses ++ in this register. addres 0 - timer 1; address - timer 2�address 7 - ++ timer 8 */ ++#define MISC_REG_SW_TIMER_VAL 0xa5c0 + /* [RW 1] Set by the MCP to remember if one or more of the drivers is/are + loaded; 0-prepare; -unprepare */ + #define MISC_REG_UNPREPARED 0xa424 +@@ -1624,6 +1511,24 @@ + /* [RW 17] Debug only. RX_EOP_DSCR_lb_FIFO in NIG_RX_EOP. Data + packet_length[13:0]; mac_error[14]; trunc_error[15]; parity[16] */ + #define NIG_REG_INGRESS_EOP_LB_FIFO 0x104e4 ++/* [RW 27] 0 - must be active for Everest A0; 1- for Everest B0 when latch ++ logic for interrupts must be used. Enable per bit of interrupt of ++ ~latch_status.latch_status */ ++#define NIG_REG_LATCH_BC_0 0x16210 ++/* [RW 27] Latch for each interrupt from Unicore.b[0] ++ status_emac0_misc_mi_int; b[1] status_emac0_misc_mi_complete; ++ b[2]status_emac0_misc_cfg_change; b[3]status_emac0_misc_link_status; ++ b[4]status_emac0_misc_link_change; b[5]status_emac0_misc_attn; ++ b[6]status_serdes0_mac_crs; b[7]status_serdes0_autoneg_complete; ++ b[8]status_serdes0_fiber_rxact; b[9]status_serdes0_link_status; ++ b[10]status_serdes0_mr_page_rx; b[11]status_serdes0_cl73_an_complete; ++ b[12]status_serdes0_cl73_mr_page_rx; b[13]status_serdes0_rx_sigdet; ++ b[14]status_xgxs0_remotemdioreq; b[15]status_xgxs0_link10g; ++ b[16]status_xgxs0_autoneg_complete; b[17]status_xgxs0_fiber_rxact; ++ b[21:18]status_xgxs0_link_status; b[22]status_xgxs0_mr_page_rx; ++ b[23]status_xgxs0_cl73_an_complete; b[24]status_xgxs0_cl73_mr_page_rx; ++ b[25]status_xgxs0_rx_sigdet; b[26]status_xgxs0_mac_crs */ ++#define NIG_REG_LATCH_STATUS_0 0x18000 + /* [RW 1] led 10g for port 0 */ + #define NIG_REG_LED_10G_P0 0x10320 + /* [RW 1] led 10g for port 1 */ +@@ -1660,6 +1565,20 @@ + /* [RW 4] led mode for port0: 0 MAC; 1-3 PHY1; 4 MAC2; 5-7 PHY4; 8-MAC3; + 9-11PHY7; 12 MAC4; 13-15 PHY10; */ + #define NIG_REG_LED_MODE_P0 0x102f0 ++/* [RW 3] for port0 enable for llfc ppp and pause. b0 - brb1 enable; b1- ++ tsdm enable; b2- usdm enable */ ++#define NIG_REG_LLFC_EGRESS_SRC_ENABLE_0 0x16070 ++#define NIG_REG_LLFC_EGRESS_SRC_ENABLE_1 0x16074 ++/* [RW 1] SAFC enable for port0. This register may get 1 only when ++ ~ppp_enable.ppp_enable = 0 and pause_enable.pause_enable =0 for the same ++ port */ ++#define NIG_REG_LLFC_ENABLE_0 0x16208 ++/* [RW 16] classes are high-priority for port0 */ ++#define NIG_REG_LLFC_HIGH_PRIORITY_CLASSES_0 0x16058 ++/* [RW 16] classes are low-priority for port0 */ ++#define NIG_REG_LLFC_LOW_PRIORITY_CLASSES_0 0x16060 ++/* [RW 1] Output enable of message to LLFC BMAC IF for port0 */ ++#define NIG_REG_LLFC_OUT_EN_0 0x160c8 + #define NIG_REG_LLH0_ACPI_PAT_0_CRC 0x1015c + #define NIG_REG_LLH0_ACPI_PAT_6_LEN 0x10154 + #define NIG_REG_LLH0_BRB1_DRV_MASK 0x10244 +@@ -1730,6 +1649,10 @@ + #define NIG_REG_NIG_INT_STS_1 0x103c0 + /* [R 32] Parity register #0 read */ + #define NIG_REG_NIG_PRTY_STS 0x103d0 ++/* [RW 1] Pause enable for port0. This register may get 1 only when ++ ~safc_enable.safc_enable = 0 and ppp_enable.ppp_enable =0 for the same ++ port */ ++#define NIG_REG_PAUSE_ENABLE_0 0x160c0 + /* [RW 1] Input enable for RX PBF LP IF */ + #define NIG_REG_PBF_LB_IN_EN 0x100b4 + /* [RW 1] Value of this register will be transmitted to port swap when +@@ -1739,6 +1662,10 @@ + #define NIG_REG_PRS_EOP_OUT_EN 0x10104 + /* [RW 1] Input enable for RX parser request IF */ + #define NIG_REG_PRS_REQ_IN_EN 0x100b8 ++/* [RW 5] control to serdes - CL45 DEVAD */ ++#define NIG_REG_SERDES0_CTRL_MD_DEVAD 0x10370 ++/* [RW 1] control to serdes; 0 - clause 45; 1 - clause 22 */ ++#define NIG_REG_SERDES0_CTRL_MD_ST 0x1036c + /* [RW 5] control to serdes - CL22 PHY_ADD and CL45 PRTAD */ + #define NIG_REG_SERDES0_CTRL_PHY_ADDR 0x10374 + /* [R 1] status from serdes0 that inputs to interrupt logic of link status */ +@@ -1792,6 +1719,7 @@ + #define NIG_REG_XGXS_LANE_SEL_P0 0x102e8 + /* [RW 1] selection for port0 for NIG_MUX block : 0 = SerDes; 1 = XGXS */ + #define NIG_REG_XGXS_SERDES0_MODE_SEL 0x102e0 ++#define NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_EMAC0_MISC_MI_INT (0x1<<0) + #define NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_SERDES0_LINK_STATUS (0x1<<9) + #define NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_XGXS0_LINK10G (0x1<<15) + #define NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_XGXS0_LINK_STATUS (0xf<<18) +@@ -1885,6 +1813,7 @@ + #define PRS_REG_CM_HDR_FLUSH_LOAD_TYPE_2 0x400e4 + #define PRS_REG_CM_HDR_FLUSH_LOAD_TYPE_3 0x400e8 + #define PRS_REG_CM_HDR_FLUSH_LOAD_TYPE_4 0x400ec ++#define PRS_REG_CM_HDR_FLUSH_LOAD_TYPE_5 0x400f0 + /* [RW 32] The CM header for flush message where 'load existed' bit in CFC + load response is set and packet type is 0. Used in packet start message + to TCM. */ +@@ -1893,6 +1822,7 @@ + #define PRS_REG_CM_HDR_FLUSH_NO_LOAD_TYPE_2 0x400c4 + #define PRS_REG_CM_HDR_FLUSH_NO_LOAD_TYPE_3 0x400c8 + #define PRS_REG_CM_HDR_FLUSH_NO_LOAD_TYPE_4 0x400cc ++#define PRS_REG_CM_HDR_FLUSH_NO_LOAD_TYPE_5 0x400d0 + /* [RW 32] The CM header for a match and packet type 1 for loopback port. + Used in packet start message to TCM. */ + #define PRS_REG_CM_HDR_LOOPBACK_TYPE_1 0x4009c +@@ -1990,6 +1920,7 @@ + #define PXP2_REG_PGL_ADDR_94_F0 0x120540 + #define PXP2_REG_PGL_CONTROL0 0x120490 + #define PXP2_REG_PGL_CONTROL1 0x120514 ++#define PXP2_REG_PGL_DEBUG 0x120520 + /* [RW 32] third dword data of expansion rom request. this register is + special. reading from it provides a vector outstanding read requests. if + a bit is zero it means that a read request on the corresponding tag did +@@ -2035,6 +1966,54 @@ + #define PXP2_REG_PGL_INT_XSDM_5 0x1204e8 + #define PXP2_REG_PGL_INT_XSDM_6 0x1204ec + #define PXP2_REG_PGL_INT_XSDM_7 0x1204f0 ++/* [RW 3] this field allows one function to pretend being another function ++ when accessing any BAR mapped resource within the device. the value of ++ the field is the number of the function that will be accessed ++ effectively. after software write to this bit it must read it in order to ++ know that the new value is updated */ ++#define PXP2_REG_PGL_PRETEND_FUNC_F0 0x120674 ++/* [RW 3] this field allows one function to pretend being another function ++ when accessing any BAR mapped resource within the device. the value of ++ the field is the number of the function that will be accessed ++ effectively. after software write to this bit it must read it in order to ++ know that the new value is updated */ ++#define PXP2_REG_PGL_PRETEND_FUNC_F1 0x120678 ++/* [RW 3] this field allows one function to pretend being another function ++ when accessing any BAR mapped resource within the device. the value of ++ the field is the number of the function that will be accessed ++ effectively. after software write to this bit it must read it in order to ++ know that the new value is updated */ ++#define PXP2_REG_PGL_PRETEND_FUNC_F2 0x12067c ++/* [RW 3] this field allows one function to pretend being another function ++ when accessing any BAR mapped resource within the device. the value of ++ the field is the number of the function that will be accessed ++ effectively. after software write to this bit it must read it in order to ++ know that the new value is updated */ ++#define PXP2_REG_PGL_PRETEND_FUNC_F3 0x120680 ++/* [RW 3] this field allows one function to pretend being another function ++ when accessing any BAR mapped resource within the device. the value of ++ the field is the number of the function that will be accessed ++ effectively. after software write to this bit it must read it in order to ++ know that the new value is updated */ ++#define PXP2_REG_PGL_PRETEND_FUNC_F4 0x120684 ++/* [RW 3] this field allows one function to pretend being another function ++ when accessing any BAR mapped resource within the device. the value of ++ the field is the number of the function that will be accessed ++ effectively. after software write to this bit it must read it in order to ++ know that the new value is updated */ ++#define PXP2_REG_PGL_PRETEND_FUNC_F5 0x120688 ++/* [RW 3] this field allows one function to pretend being another function ++ when accessing any BAR mapped resource within the device. the value of ++ the field is the number of the function that will be accessed ++ effectively. after software write to this bit it must read it in order to ++ know that the new value is updated */ ++#define PXP2_REG_PGL_PRETEND_FUNC_F6 0x12068c ++/* [RW 3] this field allows one function to pretend being another function ++ when accessing any BAR mapped resource within the device. the value of ++ the field is the number of the function that will be accessed ++ effectively. after software write to this bit it must read it in order to ++ know that the new value is updated */ ++#define PXP2_REG_PGL_PRETEND_FUNC_F7 0x120690 + /* [R 1] this bit indicates that a read request was blocked because of + bus_master_en was deasserted */ + #define PXP2_REG_PGL_READ_BLOCKED 0x120568 +@@ -2047,10 +2026,7 @@ + #define PXP2_REG_PSWRQ_BW_ADD1 0x1201c0 + #define PXP2_REG_PSWRQ_BW_ADD10 0x1201e4 + #define PXP2_REG_PSWRQ_BW_ADD11 0x1201e8 +-#define PXP2_REG_PSWRQ_BW_ADD10 0x1201e4 +-#define PXP2_REG_PSWRQ_BW_ADD11 0x1201e8 + #define PXP2_REG_PSWRQ_BW_ADD2 0x1201c4 +-#define PXP2_REG_PSWRQ_BW_ADD28 0x120228 + #define PXP2_REG_PSWRQ_BW_ADD28 0x120228 + #define PXP2_REG_PSWRQ_BW_ADD3 0x1201c8 + #define PXP2_REG_PSWRQ_BW_ADD6 0x1201d4 +@@ -2061,10 +2037,7 @@ + #define PXP2_REG_PSWRQ_BW_L1 0x1202b0 + #define PXP2_REG_PSWRQ_BW_L10 0x1202d4 + #define PXP2_REG_PSWRQ_BW_L11 0x1202d8 +-#define PXP2_REG_PSWRQ_BW_L10 0x1202d4 +-#define PXP2_REG_PSWRQ_BW_L11 0x1202d8 + #define PXP2_REG_PSWRQ_BW_L2 0x1202b4 +-#define PXP2_REG_PSWRQ_BW_L28 0x120318 + #define PXP2_REG_PSWRQ_BW_L28 0x120318 + #define PXP2_REG_PSWRQ_BW_L3 0x1202b8 + #define PXP2_REG_PSWRQ_BW_L6 0x1202c4 +@@ -2075,10 +2048,7 @@ + #define PXP2_REG_PSWRQ_BW_UB1 0x120238 + #define PXP2_REG_PSWRQ_BW_UB10 0x12025c + #define PXP2_REG_PSWRQ_BW_UB11 0x120260 +-#define PXP2_REG_PSWRQ_BW_UB10 0x12025c +-#define PXP2_REG_PSWRQ_BW_UB11 0x120260 + #define PXP2_REG_PSWRQ_BW_UB2 0x12023c +-#define PXP2_REG_PSWRQ_BW_UB28 0x1202a0 + #define PXP2_REG_PSWRQ_BW_UB28 0x1202a0 + #define PXP2_REG_PSWRQ_BW_UB3 0x120240 + #define PXP2_REG_PSWRQ_BW_UB6 0x12024c +@@ -2137,6 +2107,9 @@ + allocated for vq22 */ + #define PXP2_REG_RD_MAX_BLKS_VQ22 0x1203d0 + /* [RW 8] The maximum number of blocks in Tetris Buffer that can be ++ allocated for vq25 */ ++#define PXP2_REG_RD_MAX_BLKS_VQ25 0x1203dc ++/* [RW 8] The maximum number of blocks in Tetris Buffer that can be + allocated for vq6 */ + #define PXP2_REG_RD_MAX_BLKS_VQ6 0x120390 + /* [RW 8] The maximum number of blocks in Tetris Buffer that can be +@@ -2149,10 +2122,10 @@ + #define PXP2_REG_RD_PORT_IS_IDLE_1 0x120420 + /* [RW 2] QM byte swapping mode configuration for master read requests */ + #define PXP2_REG_RD_QM_SWAP_MODE 0x1203f8 ++/* [RW 2] SRC byte swapping mode configuration for master read requests */ ++#define PXP2_REG_RD_SRC_SWAP_MODE 0x120400 + /* [R 7] Debug only: The SR counter - number of unused sub request ids */ + #define PXP2_REG_RD_SR_CNT 0x120414 +-/* [RW 2] SRC byte swapping mode configuration for master read requests */ +-#define PXP2_REG_RD_SRC_SWAP_MODE 0x120400 + /* [RW 7] Debug only: Total number of available PCI read sub-requests. Must + be bigger than 1. Normally should not be changed. */ + #define PXP2_REG_RD_SR_NUM_CFG 0x120408 +@@ -2498,6 +2471,11 @@ + considered zero so practically there are only 20 bits in this register; + queues 63-0 */ + #define QM_REG_BASEADDR 0x168900 ++/* [RW 32] The base logical address (in bytes) of each physical queue. The ++ index I represents the physical queue number. The 12 lsbs are ignore and ++ considered zero so practically there are only 20 bits in this register; ++ queues 127-64 */ ++#define QM_REG_BASEADDR_EXT_A 0x16e100 + /* [RW 16] The byte credit cost for each task. This value is for both ports */ + #define QM_REG_BYTECRDCOST 0x168234 + /* [RW 16] The initial byte credit value for both ports. */ +@@ -2662,16 +2640,6 @@ + #define QM_REG_QVOQIDX_107 0x16e4b8 + #define QM_REG_QVOQIDX_108 0x16e4bc + #define QM_REG_QVOQIDX_109 0x16e4c0 +-#define QM_REG_QVOQIDX_100 0x16e49c +-#define QM_REG_QVOQIDX_101 0x16e4a0 +-#define QM_REG_QVOQIDX_102 0x16e4a4 +-#define QM_REG_QVOQIDX_103 0x16e4a8 +-#define QM_REG_QVOQIDX_104 0x16e4ac +-#define QM_REG_QVOQIDX_105 0x16e4b0 +-#define QM_REG_QVOQIDX_106 0x16e4b4 +-#define QM_REG_QVOQIDX_107 0x16e4b8 +-#define QM_REG_QVOQIDX_108 0x16e4bc +-#define QM_REG_QVOQIDX_109 0x16e4c0 + #define QM_REG_QVOQIDX_11 0x168120 + #define QM_REG_QVOQIDX_110 0x16e4c4 + #define QM_REG_QVOQIDX_111 0x16e4c8 +@@ -2683,25 +2651,7 @@ + #define QM_REG_QVOQIDX_117 0x16e4e0 + #define QM_REG_QVOQIDX_118 0x16e4e4 + #define QM_REG_QVOQIDX_119 0x16e4e8 +-#define QM_REG_QVOQIDX_110 0x16e4c4 +-#define QM_REG_QVOQIDX_111 0x16e4c8 +-#define QM_REG_QVOQIDX_112 0x16e4cc +-#define QM_REG_QVOQIDX_113 0x16e4d0 +-#define QM_REG_QVOQIDX_114 0x16e4d4 +-#define QM_REG_QVOQIDX_115 0x16e4d8 +-#define QM_REG_QVOQIDX_116 0x16e4dc +-#define QM_REG_QVOQIDX_117 0x16e4e0 +-#define QM_REG_QVOQIDX_118 0x16e4e4 +-#define QM_REG_QVOQIDX_119 0x16e4e8 + #define QM_REG_QVOQIDX_12 0x168124 +-#define QM_REG_QVOQIDX_120 0x16e4ec +-#define QM_REG_QVOQIDX_121 0x16e4f0 +-#define QM_REG_QVOQIDX_122 0x16e4f4 +-#define QM_REG_QVOQIDX_123 0x16e4f8 +-#define QM_REG_QVOQIDX_124 0x16e4fc +-#define QM_REG_QVOQIDX_125 0x16e500 +-#define QM_REG_QVOQIDX_126 0x16e504 +-#define QM_REG_QVOQIDX_127 0x16e508 + #define QM_REG_QVOQIDX_120 0x16e4ec + #define QM_REG_QVOQIDX_121 0x16e4f0 + #define QM_REG_QVOQIDX_122 0x16e4f4 +@@ -2755,27 +2705,7 @@ + #define QM_REG_QVOQIDX_57 0x1681d8 + #define QM_REG_QVOQIDX_58 0x1681dc + #define QM_REG_QVOQIDX_59 0x1681e0 +-#define QM_REG_QVOQIDX_50 0x1681bc +-#define QM_REG_QVOQIDX_51 0x1681c0 +-#define QM_REG_QVOQIDX_52 0x1681c4 +-#define QM_REG_QVOQIDX_53 0x1681c8 +-#define QM_REG_QVOQIDX_54 0x1681cc +-#define QM_REG_QVOQIDX_55 0x1681d0 +-#define QM_REG_QVOQIDX_56 0x1681d4 +-#define QM_REG_QVOQIDX_57 0x1681d8 +-#define QM_REG_QVOQIDX_58 0x1681dc +-#define QM_REG_QVOQIDX_59 0x1681e0 + #define QM_REG_QVOQIDX_6 0x16810c +-#define QM_REG_QVOQIDX_60 0x1681e4 +-#define QM_REG_QVOQIDX_61 0x1681e8 +-#define QM_REG_QVOQIDX_62 0x1681ec +-#define QM_REG_QVOQIDX_63 0x1681f0 +-#define QM_REG_QVOQIDX_64 0x16e40c +-#define QM_REG_QVOQIDX_65 0x16e410 +-#define QM_REG_QVOQIDX_66 0x16e414 +-#define QM_REG_QVOQIDX_67 0x16e418 +-#define QM_REG_QVOQIDX_68 0x16e41c +-#define QM_REG_QVOQIDX_69 0x16e420 + #define QM_REG_QVOQIDX_60 0x1681e4 + #define QM_REG_QVOQIDX_61 0x1681e8 + #define QM_REG_QVOQIDX_62 0x1681ec +@@ -2794,27 +2724,7 @@ + #define QM_REG_QVOQIDX_77 0x16e440 + #define QM_REG_QVOQIDX_78 0x16e444 + #define QM_REG_QVOQIDX_79 0x16e448 +-#define QM_REG_QVOQIDX_70 0x16e424 +-#define QM_REG_QVOQIDX_71 0x16e428 +-#define QM_REG_QVOQIDX_72 0x16e42c +-#define QM_REG_QVOQIDX_73 0x16e430 +-#define QM_REG_QVOQIDX_74 0x16e434 +-#define QM_REG_QVOQIDX_75 0x16e438 +-#define QM_REG_QVOQIDX_76 0x16e43c +-#define QM_REG_QVOQIDX_77 0x16e440 +-#define QM_REG_QVOQIDX_78 0x16e444 +-#define QM_REG_QVOQIDX_79 0x16e448 + #define QM_REG_QVOQIDX_8 0x168114 +-#define QM_REG_QVOQIDX_80 0x16e44c +-#define QM_REG_QVOQIDX_81 0x16e450 +-#define QM_REG_QVOQIDX_82 0x16e454 +-#define QM_REG_QVOQIDX_83 0x16e458 +-#define QM_REG_QVOQIDX_84 0x16e45c +-#define QM_REG_QVOQIDX_85 0x16e460 +-#define QM_REG_QVOQIDX_86 0x16e464 +-#define QM_REG_QVOQIDX_87 0x16e468 +-#define QM_REG_QVOQIDX_88 0x16e46c +-#define QM_REG_QVOQIDX_89 0x16e470 + #define QM_REG_QVOQIDX_80 0x16e44c + #define QM_REG_QVOQIDX_81 0x16e450 + #define QM_REG_QVOQIDX_85 0x16e460 +@@ -2833,23 +2743,11 @@ + #define QM_REG_QVOQIDX_97 0x16e490 + #define QM_REG_QVOQIDX_98 0x16e494 + #define QM_REG_QVOQIDX_99 0x16e498 +-#define QM_REG_QVOQIDX_90 0x16e474 +-#define QM_REG_QVOQIDX_91 0x16e478 +-#define QM_REG_QVOQIDX_92 0x16e47c +-#define QM_REG_QVOQIDX_93 0x16e480 +-#define QM_REG_QVOQIDX_94 0x16e484 +-#define QM_REG_QVOQIDX_95 0x16e488 +-#define QM_REG_QVOQIDX_96 0x16e48c +-#define QM_REG_QVOQIDX_97 0x16e490 +-#define QM_REG_QVOQIDX_98 0x16e494 +-#define QM_REG_QVOQIDX_99 0x16e498 + /* [RW 1] Initialization bit command */ + #define QM_REG_SOFT_RESET 0x168428 + /* [RW 8] The credit cost per every task in the QM. A value per each VOQ */ + #define QM_REG_TASKCRDCOST_0 0x16809c + #define QM_REG_TASKCRDCOST_1 0x1680a0 +-#define QM_REG_TASKCRDCOST_10 0x1680c4 +-#define QM_REG_TASKCRDCOST_11 0x1680c8 + #define QM_REG_TASKCRDCOST_2 0x1680a4 + #define QM_REG_TASKCRDCOST_4 0x1680ac + #define QM_REG_TASKCRDCOST_5 0x1680b0 +@@ -2859,27 +2757,21 @@ + #define QM_REG_UQM_WRC_FIFOLVL 0x168008 + /* [RC 32] Credit update error register */ + #define QM_REG_VOQCRDERRREG 0x168408 ++/* [RW 16] The credit value that if above the QM is considered almost full */ ++#define QM_REG_VOQCREDITAFULLTHR 0x168090 + /* [R 16] The credit value for each VOQ */ + #define QM_REG_VOQCREDIT_0 0x1682d0 + #define QM_REG_VOQCREDIT_1 0x1682d4 +-#define QM_REG_VOQCREDIT_10 0x1682f8 +-#define QM_REG_VOQCREDIT_11 0x1682fc + #define QM_REG_VOQCREDIT_4 0x1682e0 +-/* [RW 16] The credit value that if above the QM is considered almost full */ +-#define QM_REG_VOQCREDITAFULLTHR 0x168090 + /* [RW 16] The init and maximum credit for each VoQ */ + #define QM_REG_VOQINITCREDIT_0 0x168060 + #define QM_REG_VOQINITCREDIT_1 0x168064 +-#define QM_REG_VOQINITCREDIT_10 0x168088 +-#define QM_REG_VOQINITCREDIT_11 0x16808c + #define QM_REG_VOQINITCREDIT_2 0x168068 + #define QM_REG_VOQINITCREDIT_4 0x168070 + #define QM_REG_VOQINITCREDIT_5 0x168074 + /* [RW 1] The port of which VOQ belongs */ + #define QM_REG_VOQPORT_0 0x1682a0 + #define QM_REG_VOQPORT_1 0x1682a4 +-#define QM_REG_VOQPORT_10 0x1682c8 +-#define QM_REG_VOQPORT_11 0x1682cc + #define QM_REG_VOQPORT_2 0x1682a8 + /* [RW 32] The physical queue number associated with each VOQ; queues 31-0 */ + #define QM_REG_VOQQMASK_0_LSB 0x168240 +@@ -2976,36 +2868,6 @@ + /* [RW 32] Wrr weights */ + #define QM_REG_WRRWEIGHTS_0 0x16880c + #define QM_REG_WRRWEIGHTS_1 0x168810 +-#define QM_REG_WRRWEIGHTS_10 0x168814 +-#define QM_REG_WRRWEIGHTS_10_SIZE 1 +-/* [RW 32] Wrr weights */ +-#define QM_REG_WRRWEIGHTS_11 0x168818 +-#define QM_REG_WRRWEIGHTS_11_SIZE 1 +-/* [RW 32] Wrr weights */ +-#define QM_REG_WRRWEIGHTS_12 0x16881c +-#define QM_REG_WRRWEIGHTS_12_SIZE 1 +-/* [RW 32] Wrr weights */ +-#define QM_REG_WRRWEIGHTS_13 0x168820 +-#define QM_REG_WRRWEIGHTS_13_SIZE 1 +-/* [RW 32] Wrr weights */ +-#define QM_REG_WRRWEIGHTS_14 0x168824 +-#define QM_REG_WRRWEIGHTS_14_SIZE 1 +-/* [RW 32] Wrr weights */ +-#define QM_REG_WRRWEIGHTS_15 0x168828 +-#define QM_REG_WRRWEIGHTS_15_SIZE 1 +-/* [RW 32] Wrr weights */ +-#define QM_REG_WRRWEIGHTS_16 0x16e000 +-#define QM_REG_WRRWEIGHTS_16_SIZE 1 +-/* [RW 32] Wrr weights */ +-#define QM_REG_WRRWEIGHTS_17 0x16e004 +-#define QM_REG_WRRWEIGHTS_17_SIZE 1 +-/* [RW 32] Wrr weights */ +-#define QM_REG_WRRWEIGHTS_18 0x16e008 +-#define QM_REG_WRRWEIGHTS_18_SIZE 1 +-/* [RW 32] Wrr weights */ +-#define QM_REG_WRRWEIGHTS_19 0x16e00c +-#define QM_REG_WRRWEIGHTS_19_SIZE 1 +-/* [RW 32] Wrr weights */ + #define QM_REG_WRRWEIGHTS_10 0x168814 + #define QM_REG_WRRWEIGHTS_11 0x168818 + #define QM_REG_WRRWEIGHTS_12 0x16881c +@@ -3018,36 +2880,6 @@ + #define QM_REG_WRRWEIGHTS_19 0x16e00c + #define QM_REG_WRRWEIGHTS_2 0x16882c + #define QM_REG_WRRWEIGHTS_20 0x16e010 +-#define QM_REG_WRRWEIGHTS_20_SIZE 1 +-/* [RW 32] Wrr weights */ +-#define QM_REG_WRRWEIGHTS_21 0x16e014 +-#define QM_REG_WRRWEIGHTS_21_SIZE 1 +-/* [RW 32] Wrr weights */ +-#define QM_REG_WRRWEIGHTS_22 0x16e018 +-#define QM_REG_WRRWEIGHTS_22_SIZE 1 +-/* [RW 32] Wrr weights */ +-#define QM_REG_WRRWEIGHTS_23 0x16e01c +-#define QM_REG_WRRWEIGHTS_23_SIZE 1 +-/* [RW 32] Wrr weights */ +-#define QM_REG_WRRWEIGHTS_24 0x16e020 +-#define QM_REG_WRRWEIGHTS_24_SIZE 1 +-/* [RW 32] Wrr weights */ +-#define QM_REG_WRRWEIGHTS_25 0x16e024 +-#define QM_REG_WRRWEIGHTS_25_SIZE 1 +-/* [RW 32] Wrr weights */ +-#define QM_REG_WRRWEIGHTS_26 0x16e028 +-#define QM_REG_WRRWEIGHTS_26_SIZE 1 +-/* [RW 32] Wrr weights */ +-#define QM_REG_WRRWEIGHTS_27 0x16e02c +-#define QM_REG_WRRWEIGHTS_27_SIZE 1 +-/* [RW 32] Wrr weights */ +-#define QM_REG_WRRWEIGHTS_28 0x16e030 +-#define QM_REG_WRRWEIGHTS_28_SIZE 1 +-/* [RW 32] Wrr weights */ +-#define QM_REG_WRRWEIGHTS_29 0x16e034 +-#define QM_REG_WRRWEIGHTS_29_SIZE 1 +-/* [RW 32] Wrr weights */ +-#define QM_REG_WRRWEIGHTS_20 0x16e010 + #define QM_REG_WRRWEIGHTS_21 0x16e014 + #define QM_REG_WRRWEIGHTS_22 0x16e018 + #define QM_REG_WRRWEIGHTS_23 0x16e01c +@@ -3059,12 +2891,6 @@ + #define QM_REG_WRRWEIGHTS_29 0x16e034 + #define QM_REG_WRRWEIGHTS_3 0x168830 + #define QM_REG_WRRWEIGHTS_30 0x16e038 +-#define QM_REG_WRRWEIGHTS_30_SIZE 1 +-/* [RW 32] Wrr weights */ +-#define QM_REG_WRRWEIGHTS_31 0x16e03c +-#define QM_REG_WRRWEIGHTS_31_SIZE 1 +-/* [RW 32] Wrr weights */ +-#define QM_REG_WRRWEIGHTS_30 0x16e038 + #define QM_REG_WRRWEIGHTS_31 0x16e03c + #define QM_REG_WRRWEIGHTS_4 0x168834 + #define QM_REG_WRRWEIGHTS_5 0x168838 +@@ -3074,362 +2900,6 @@ + #define QM_REG_WRRWEIGHTS_9 0x168848 + /* [R 6] Keep the fill level of the fifo from write client 1 */ + #define QM_REG_XQM_WRC_FIFOLVL 0x168000 +-#define BRB1_BRB1_INT_STS_REG_ADDRESS_ERROR (0x1<<0) +-#define BRB1_BRB1_INT_STS_REG_ADDRESS_ERROR_SIZE 0 +-#define BRB1_BRB1_INT_STS_CLR_REG_ADDRESS_ERROR (0x1<<0) +-#define BRB1_BRB1_INT_STS_CLR_REG_ADDRESS_ERROR_SIZE 0 +-#define BRB1_BRB1_INT_STS_WR_REG_ADDRESS_ERROR (0x1<<0) +-#define BRB1_BRB1_INT_STS_WR_REG_ADDRESS_ERROR_SIZE 0 +-#define BRB1_BRB1_INT_MASK_REG_ADDRESS_ERROR (0x1<<0) +-#define BRB1_BRB1_INT_MASK_REG_ADDRESS_ERROR_SIZE 0 +-#define CCM_CCM_INT_STS_REG_ADDRESS_ERROR (0x1<<0) +-#define CCM_CCM_INT_STS_REG_ADDRESS_ERROR_SIZE 0 +-#define CCM_CCM_INT_STS_CLR_REG_ADDRESS_ERROR (0x1<<0) +-#define CCM_CCM_INT_STS_CLR_REG_ADDRESS_ERROR_SIZE 0 +-#define CCM_CCM_INT_STS_WR_REG_ADDRESS_ERROR (0x1<<0) +-#define CCM_CCM_INT_STS_WR_REG_ADDRESS_ERROR_SIZE 0 +-#define CCM_CCM_INT_MASK_REG_ADDRESS_ERROR (0x1<<0) +-#define CCM_CCM_INT_MASK_REG_ADDRESS_ERROR_SIZE 0 +-#define CDU_CDU_INT_STS_REG_ADDRESS_ERROR (0x1<<0) +-#define CDU_CDU_INT_STS_REG_ADDRESS_ERROR_SIZE 0 +-#define CDU_CDU_INT_STS_CLR_REG_ADDRESS_ERROR (0x1<<0) +-#define CDU_CDU_INT_STS_CLR_REG_ADDRESS_ERROR_SIZE 0 +-#define CDU_CDU_INT_STS_WR_REG_ADDRESS_ERROR (0x1<<0) +-#define CDU_CDU_INT_STS_WR_REG_ADDRESS_ERROR_SIZE 0 +-#define CDU_CDU_INT_MASK_REG_ADDRESS_ERROR (0x1<<0) +-#define CDU_CDU_INT_MASK_REG_ADDRESS_ERROR_SIZE 0 +-#define CFC_CFC_INT_STS_REG_ADDRESS_ERROR (0x1<<0) +-#define CFC_CFC_INT_STS_REG_ADDRESS_ERROR_SIZE 0 +-#define CFC_CFC_INT_STS_CLR_REG_ADDRESS_ERROR (0x1<<0) +-#define CFC_CFC_INT_STS_CLR_REG_ADDRESS_ERROR_SIZE 0 +-#define CFC_CFC_INT_STS_WR_REG_ADDRESS_ERROR (0x1<<0) +-#define CFC_CFC_INT_STS_WR_REG_ADDRESS_ERROR_SIZE 0 +-#define CFC_CFC_INT_MASK_REG_ADDRESS_ERROR (0x1<<0) +-#define CFC_CFC_INT_MASK_REG_ADDRESS_ERROR_SIZE 0 +-#define CSDM_CSDM_INT_STS_0_REG_ADDRESS_ERROR (0x1<<0) +-#define CSDM_CSDM_INT_STS_0_REG_ADDRESS_ERROR_SIZE 0 +-#define CSDM_CSDM_INT_STS_CLR_0_REG_ADDRESS_ERROR (0x1<<0) +-#define CSDM_CSDM_INT_STS_CLR_0_REG_ADDRESS_ERROR_SIZE 0 +-#define CSDM_CSDM_INT_STS_WR_0_REG_ADDRESS_ERROR (0x1<<0) +-#define CSDM_CSDM_INT_STS_WR_0_REG_ADDRESS_ERROR_SIZE 0 +-#define CSDM_CSDM_INT_MASK_0_REG_ADDRESS_ERROR (0x1<<0) +-#define CSDM_CSDM_INT_MASK_0_REG_ADDRESS_ERROR_SIZE 0 +-#define CSEM_CSEM_INT_STS_0_REG_ADDRESS_ERROR (0x1<<0) +-#define CSEM_CSEM_INT_STS_0_REG_ADDRESS_ERROR_SIZE 0 +-#define CSEM_CSEM_INT_STS_CLR_0_REG_ADDRESS_ERROR (0x1<<0) +-#define CSEM_CSEM_INT_STS_CLR_0_REG_ADDRESS_ERROR_SIZE 0 +-#define CSEM_CSEM_INT_STS_WR_0_REG_ADDRESS_ERROR (0x1<<0) +-#define CSEM_CSEM_INT_STS_WR_0_REG_ADDRESS_ERROR_SIZE 0 +-#define CSEM_CSEM_INT_MASK_0_REG_ADDRESS_ERROR (0x1<<0) +-#define CSEM_CSEM_INT_MASK_0_REG_ADDRESS_ERROR_SIZE 0 +-#define DBG_DBG_INT_STS_REG_ADDRESS_ERROR (0x1<<0) +-#define DBG_DBG_INT_STS_REG_ADDRESS_ERROR_SIZE 0 +-#define DBG_DBG_INT_STS_CLR_REG_ADDRESS_ERROR (0x1<<0) +-#define DBG_DBG_INT_STS_CLR_REG_ADDRESS_ERROR_SIZE 0 +-#define DBG_DBG_INT_STS_WR_REG_ADDRESS_ERROR (0x1<<0) +-#define DBG_DBG_INT_STS_WR_REG_ADDRESS_ERROR_SIZE 0 +-#define DBG_DBG_INT_MASK_REG_ADDRESS_ERROR (0x1<<0) +-#define DBG_DBG_INT_MASK_REG_ADDRESS_ERROR_SIZE 0 +-#define DMAE_DMAE_INT_STS_REG_ADDRESS_ERROR (0x1<<0) +-#define DMAE_DMAE_INT_STS_REG_ADDRESS_ERROR_SIZE 0 +-#define DMAE_DMAE_INT_STS_CLR_REG_ADDRESS_ERROR (0x1<<0) +-#define DMAE_DMAE_INT_STS_CLR_REG_ADDRESS_ERROR_SIZE 0 +-#define DMAE_DMAE_INT_STS_WR_REG_ADDRESS_ERROR (0x1<<0) +-#define DMAE_DMAE_INT_STS_WR_REG_ADDRESS_ERROR_SIZE 0 +-#define DMAE_DMAE_INT_MASK_REG_ADDRESS_ERROR (0x1<<0) +-#define DMAE_DMAE_INT_MASK_REG_ADDRESS_ERROR_SIZE 0 +-#define DORQ_DORQ_INT_STS_REG_ADDRESS_ERROR (0x1<<0) +-#define DORQ_DORQ_INT_STS_REG_ADDRESS_ERROR_SIZE 0 +-#define DORQ_DORQ_INT_STS_CLR_REG_ADDRESS_ERROR (0x1<<0) +-#define DORQ_DORQ_INT_STS_CLR_REG_ADDRESS_ERROR_SIZE 0 +-#define DORQ_DORQ_INT_STS_WR_REG_ADDRESS_ERROR (0x1<<0) +-#define DORQ_DORQ_INT_STS_WR_REG_ADDRESS_ERROR_SIZE 0 +-#define DORQ_DORQ_INT_MASK_REG_ADDRESS_ERROR (0x1<<0) +-#define DORQ_DORQ_INT_MASK_REG_ADDRESS_ERROR_SIZE 0 +-#define HC_HC_INT_STS_REG_ADDRESS_ERROR (0x1<<0) +-#define HC_HC_INT_STS_REG_ADDRESS_ERROR_SIZE 0 +-#define HC_HC_INT_STS_CLR_REG_ADDRESS_ERROR (0x1<<0) +-#define HC_HC_INT_STS_CLR_REG_ADDRESS_ERROR_SIZE 0 +-#define HC_HC_INT_STS_WR_REG_ADDRESS_ERROR (0x1<<0) +-#define HC_HC_INT_STS_WR_REG_ADDRESS_ERROR_SIZE 0 +-#define HC_HC_INT_MASK_REG_ADDRESS_ERROR (0x1<<0) +-#define HC_HC_INT_MASK_REG_ADDRESS_ERROR_SIZE 0 +-#define MISC_MISC_INT_STS_REG_ADDRESS_ERROR (0x1<<0) +-#define MISC_MISC_INT_STS_REG_ADDRESS_ERROR_SIZE 0 +-#define MISC_MISC_INT_STS_CLR_REG_ADDRESS_ERROR (0x1<<0) +-#define MISC_MISC_INT_STS_CLR_REG_ADDRESS_ERROR_SIZE 0 +-#define MISC_MISC_INT_STS_WR_REG_ADDRESS_ERROR (0x1<<0) +-#define MISC_MISC_INT_STS_WR_REG_ADDRESS_ERROR_SIZE 0 +-#define MISC_MISC_INT_MASK_REG_ADDRESS_ERROR (0x1<<0) +-#define MISC_MISC_INT_MASK_REG_ADDRESS_ERROR_SIZE 0 +-#define NIG_NIG_INT_STS_0_REG_ADDRESS_ERROR (0x1<<0) +-#define NIG_NIG_INT_STS_0_REG_ADDRESS_ERROR_SIZE 0 +-#define NIG_NIG_INT_STS_CLR_0_REG_ADDRESS_ERROR (0x1<<0) +-#define NIG_NIG_INT_STS_CLR_0_REG_ADDRESS_ERROR_SIZE 0 +-#define NIG_NIG_INT_STS_WR_0_REG_ADDRESS_ERROR (0x1<<0) +-#define NIG_NIG_INT_STS_WR_0_REG_ADDRESS_ERROR_SIZE 0 +-#define NIG_NIG_INT_MASK_0_REG_ADDRESS_ERROR (0x1<<0) +-#define NIG_NIG_INT_MASK_0_REG_ADDRESS_ERROR_SIZE 0 +-#define PBF_PBF_INT_STS_REG_ADDRESS_ERROR (0x1<<0) +-#define PBF_PBF_INT_STS_REG_ADDRESS_ERROR_SIZE 0 +-#define PBF_PBF_INT_STS_CLR_REG_ADDRESS_ERROR (0x1<<0) +-#define PBF_PBF_INT_STS_CLR_REG_ADDRESS_ERROR_SIZE 0 +-#define PBF_PBF_INT_STS_WR_REG_ADDRESS_ERROR (0x1<<0) +-#define PBF_PBF_INT_STS_WR_REG_ADDRESS_ERROR_SIZE 0 +-#define PBF_PBF_INT_MASK_REG_ADDRESS_ERROR (0x1<<0) +-#define PBF_PBF_INT_MASK_REG_ADDRESS_ERROR_SIZE 0 +-#define PB_PB_INT_STS_REG_ADDRESS_ERROR (0x1<<0) +-#define PB_PB_INT_STS_REG_ADDRESS_ERROR_SIZE 0 +-#define PB_PB_INT_STS_CLR_REG_ADDRESS_ERROR (0x1<<0) +-#define PB_PB_INT_STS_CLR_REG_ADDRESS_ERROR_SIZE 0 +-#define PB_PB_INT_STS_WR_REG_ADDRESS_ERROR (0x1<<0) +-#define PB_PB_INT_STS_WR_REG_ADDRESS_ERROR_SIZE 0 +-#define PB_PB_INT_MASK_REG_ADDRESS_ERROR (0x1<<0) +-#define PB_PB_INT_MASK_REG_ADDRESS_ERROR_SIZE 0 +-#define PRS_PRS_INT_STS_REG_ADDRESS_ERROR (0x1<<0) +-#define PRS_PRS_INT_STS_REG_ADDRESS_ERROR_SIZE 0 +-#define PRS_PRS_INT_STS_CLR_REG_ADDRESS_ERROR (0x1<<0) +-#define PRS_PRS_INT_STS_CLR_REG_ADDRESS_ERROR_SIZE 0 +-#define PRS_PRS_INT_STS_WR_REG_ADDRESS_ERROR (0x1<<0) +-#define PRS_PRS_INT_STS_WR_REG_ADDRESS_ERROR_SIZE 0 +-#define PRS_PRS_INT_MASK_REG_ADDRESS_ERROR (0x1<<0) +-#define PRS_PRS_INT_MASK_REG_ADDRESS_ERROR_SIZE 0 +-#define PXP2_PXP2_INT_STS_0_REG_ADDRESS_ERROR (0x1<<0) +-#define PXP2_PXP2_INT_STS_0_REG_ADDRESS_ERROR_SIZE 0 +-#define PXP2_PXP2_INT_STS_CLR_0_REG_ADDRESS_ERROR (0x1<<0) +-#define PXP2_PXP2_INT_STS_CLR_0_REG_ADDRESS_ERROR_SIZE 0 +-#define PXP2_PXP2_INT_STS_WR_0_REG_ADDRESS_ERROR (0x1<<0) +-#define PXP2_PXP2_INT_STS_WR_0_REG_ADDRESS_ERROR_SIZE 0 +-#define PXP2_PXP2_INT_MASK_0_REG_ADDRESS_ERROR (0x1<<0) +-#define PXP2_PXP2_INT_MASK_0_REG_ADDRESS_ERROR_SIZE 0 +-#define PXP_PXP_INT_STS_0_REG_ADDRESS_ERROR (0x1<<0) +-#define PXP_PXP_INT_STS_0_REG_ADDRESS_ERROR_SIZE 0 +-#define PXP_PXP_INT_STS_CLR_0_REG_ADDRESS_ERROR (0x1<<0) +-#define PXP_PXP_INT_STS_CLR_0_REG_ADDRESS_ERROR_SIZE 0 +-#define PXP_PXP_INT_STS_WR_0_REG_ADDRESS_ERROR (0x1<<0) +-#define PXP_PXP_INT_STS_WR_0_REG_ADDRESS_ERROR_SIZE 0 +-#define PXP_PXP_INT_MASK_0_REG_ADDRESS_ERROR (0x1<<0) +-#define PXP_PXP_INT_MASK_0_REG_ADDRESS_ERROR_SIZE 0 +-#define QM_QM_INT_STS_REG_ADDRESS_ERROR (0x1<<0) +-#define QM_QM_INT_STS_REG_ADDRESS_ERROR_SIZE 0 +-#define QM_QM_INT_STS_CLR_REG_ADDRESS_ERROR (0x1<<0) +-#define QM_QM_INT_STS_CLR_REG_ADDRESS_ERROR_SIZE 0 +-#define QM_QM_INT_STS_WR_REG_ADDRESS_ERROR (0x1<<0) +-#define QM_QM_INT_STS_WR_REG_ADDRESS_ERROR_SIZE 0 +-#define QM_QM_INT_MASK_REG_ADDRESS_ERROR (0x1<<0) +-#define QM_QM_INT_MASK_REG_ADDRESS_ERROR_SIZE 0 +-#define SEM_FAST_SEM_FAST_INT_STS_REG_ADDRESS_ERROR (0x1<<0) +-#define SEM_FAST_SEM_FAST_INT_STS_REG_ADDRESS_ERROR_SIZE 0 +-#define SEM_FAST_SEM_FAST_INT_STS_CLR_REG_ADDRESS_ERROR (0x1<<0) +-#define SEM_FAST_SEM_FAST_INT_STS_CLR_REG_ADDRESS_ERROR_SIZE 0 +-#define SEM_FAST_SEM_FAST_INT_STS_WR_REG_ADDRESS_ERROR (0x1<<0) +-#define SEM_FAST_SEM_FAST_INT_STS_WR_REG_ADDRESS_ERROR_SIZE 0 +-#define SEM_FAST_SEM_FAST_INT_MASK_REG_ADDRESS_ERROR (0x1<<0) +-#define SEM_FAST_SEM_FAST_INT_MASK_REG_ADDRESS_ERROR_SIZE 0 +-#define SRC_SRC_INT_STS_REG_ADDRESS_ERROR (0x1<<0) +-#define SRC_SRC_INT_STS_REG_ADDRESS_ERROR_SIZE 0 +-#define SRC_SRC_INT_STS_CLR_REG_ADDRESS_ERROR (0x1<<0) +-#define SRC_SRC_INT_STS_CLR_REG_ADDRESS_ERROR_SIZE 0 +-#define SRC_SRC_INT_STS_WR_REG_ADDRESS_ERROR (0x1<<0) +-#define SRC_SRC_INT_STS_WR_REG_ADDRESS_ERROR_SIZE 0 +-#define SRC_SRC_INT_MASK_REG_ADDRESS_ERROR (0x1<<0) +-#define SRC_SRC_INT_MASK_REG_ADDRESS_ERROR_SIZE 0 +-#define TCM_TCM_INT_STS_REG_ADDRESS_ERROR (0x1<<0) +-#define TCM_TCM_INT_STS_REG_ADDRESS_ERROR_SIZE 0 +-#define TCM_TCM_INT_STS_CLR_REG_ADDRESS_ERROR (0x1<<0) +-#define TCM_TCM_INT_STS_CLR_REG_ADDRESS_ERROR_SIZE 0 +-#define TCM_TCM_INT_STS_WR_REG_ADDRESS_ERROR (0x1<<0) +-#define TCM_TCM_INT_STS_WR_REG_ADDRESS_ERROR_SIZE 0 +-#define TCM_TCM_INT_MASK_REG_ADDRESS_ERROR (0x1<<0) +-#define TCM_TCM_INT_MASK_REG_ADDRESS_ERROR_SIZE 0 +-#define TM_TM_INT_STS_REG_ADDRESS_ERROR (0x1<<0) +-#define TM_TM_INT_STS_REG_ADDRESS_ERROR_SIZE 0 +-#define TM_TM_INT_STS_CLR_REG_ADDRESS_ERROR (0x1<<0) +-#define TM_TM_INT_STS_CLR_REG_ADDRESS_ERROR_SIZE 0 +-#define TM_TM_INT_STS_WR_REG_ADDRESS_ERROR (0x1<<0) +-#define TM_TM_INT_STS_WR_REG_ADDRESS_ERROR_SIZE 0 +-#define TM_TM_INT_MASK_REG_ADDRESS_ERROR (0x1<<0) +-#define TM_TM_INT_MASK_REG_ADDRESS_ERROR_SIZE 0 +-#define TSDM_TSDM_INT_STS_0_REG_ADDRESS_ERROR (0x1<<0) +-#define TSDM_TSDM_INT_STS_0_REG_ADDRESS_ERROR_SIZE 0 +-#define TSDM_TSDM_INT_STS_CLR_0_REG_ADDRESS_ERROR (0x1<<0) +-#define TSDM_TSDM_INT_STS_CLR_0_REG_ADDRESS_ERROR_SIZE 0 +-#define TSDM_TSDM_INT_STS_WR_0_REG_ADDRESS_ERROR (0x1<<0) +-#define TSDM_TSDM_INT_STS_WR_0_REG_ADDRESS_ERROR_SIZE 0 +-#define TSDM_TSDM_INT_MASK_0_REG_ADDRESS_ERROR (0x1<<0) +-#define TSDM_TSDM_INT_MASK_0_REG_ADDRESS_ERROR_SIZE 0 +-#define TSEM_TSEM_INT_STS_0_REG_ADDRESS_ERROR (0x1<<0) +-#define TSEM_TSEM_INT_STS_0_REG_ADDRESS_ERROR_SIZE 0 +-#define TSEM_TSEM_INT_STS_CLR_0_REG_ADDRESS_ERROR (0x1<<0) +-#define TSEM_TSEM_INT_STS_CLR_0_REG_ADDRESS_ERROR_SIZE 0 +-#define TSEM_TSEM_INT_STS_WR_0_REG_ADDRESS_ERROR (0x1<<0) +-#define TSEM_TSEM_INT_STS_WR_0_REG_ADDRESS_ERROR_SIZE 0 +-#define TSEM_TSEM_INT_MASK_0_REG_ADDRESS_ERROR (0x1<<0) +-#define TSEM_TSEM_INT_MASK_0_REG_ADDRESS_ERROR_SIZE 0 +-#define UCM_UCM_INT_STS_REG_ADDRESS_ERROR (0x1<<0) +-#define UCM_UCM_INT_STS_REG_ADDRESS_ERROR_SIZE 0 +-#define UCM_UCM_INT_STS_CLR_REG_ADDRESS_ERROR (0x1<<0) +-#define UCM_UCM_INT_STS_CLR_REG_ADDRESS_ERROR_SIZE 0 +-#define UCM_UCM_INT_STS_WR_REG_ADDRESS_ERROR (0x1<<0) +-#define UCM_UCM_INT_STS_WR_REG_ADDRESS_ERROR_SIZE 0 +-#define UCM_UCM_INT_MASK_REG_ADDRESS_ERROR (0x1<<0) +-#define UCM_UCM_INT_MASK_REG_ADDRESS_ERROR_SIZE 0 +-#define USDM_USDM_INT_STS_0_REG_ADDRESS_ERROR (0x1<<0) +-#define USDM_USDM_INT_STS_0_REG_ADDRESS_ERROR_SIZE 0 +-#define USDM_USDM_INT_STS_CLR_0_REG_ADDRESS_ERROR (0x1<<0) +-#define USDM_USDM_INT_STS_CLR_0_REG_ADDRESS_ERROR_SIZE 0 +-#define USDM_USDM_INT_STS_WR_0_REG_ADDRESS_ERROR (0x1<<0) +-#define USDM_USDM_INT_STS_WR_0_REG_ADDRESS_ERROR_SIZE 0 +-#define USDM_USDM_INT_MASK_0_REG_ADDRESS_ERROR (0x1<<0) +-#define USDM_USDM_INT_MASK_0_REG_ADDRESS_ERROR_SIZE 0 +-#define USEM_USEM_INT_STS_0_REG_ADDRESS_ERROR (0x1<<0) +-#define USEM_USEM_INT_STS_0_REG_ADDRESS_ERROR_SIZE 0 +-#define USEM_USEM_INT_STS_CLR_0_REG_ADDRESS_ERROR (0x1<<0) +-#define USEM_USEM_INT_STS_CLR_0_REG_ADDRESS_ERROR_SIZE 0 +-#define USEM_USEM_INT_STS_WR_0_REG_ADDRESS_ERROR (0x1<<0) +-#define USEM_USEM_INT_STS_WR_0_REG_ADDRESS_ERROR_SIZE 0 +-#define USEM_USEM_INT_MASK_0_REG_ADDRESS_ERROR (0x1<<0) +-#define USEM_USEM_INT_MASK_0_REG_ADDRESS_ERROR_SIZE 0 +-#define XCM_XCM_INT_STS_REG_ADDRESS_ERROR (0x1<<0) +-#define XCM_XCM_INT_STS_REG_ADDRESS_ERROR_SIZE 0 +-#define XCM_XCM_INT_STS_CLR_REG_ADDRESS_ERROR (0x1<<0) +-#define XCM_XCM_INT_STS_CLR_REG_ADDRESS_ERROR_SIZE 0 +-#define XCM_XCM_INT_STS_WR_REG_ADDRESS_ERROR (0x1<<0) +-#define XCM_XCM_INT_STS_WR_REG_ADDRESS_ERROR_SIZE 0 +-#define XCM_XCM_INT_MASK_REG_ADDRESS_ERROR (0x1<<0) +-#define XCM_XCM_INT_MASK_REG_ADDRESS_ERROR_SIZE 0 +-#define XSDM_XSDM_INT_STS_0_REG_ADDRESS_ERROR (0x1<<0) +-#define XSDM_XSDM_INT_STS_0_REG_ADDRESS_ERROR_SIZE 0 +-#define XSDM_XSDM_INT_STS_CLR_0_REG_ADDRESS_ERROR (0x1<<0) +-#define XSDM_XSDM_INT_STS_CLR_0_REG_ADDRESS_ERROR_SIZE 0 +-#define XSDM_XSDM_INT_STS_WR_0_REG_ADDRESS_ERROR (0x1<<0) +-#define XSDM_XSDM_INT_STS_WR_0_REG_ADDRESS_ERROR_SIZE 0 +-#define XSDM_XSDM_INT_MASK_0_REG_ADDRESS_ERROR (0x1<<0) +-#define XSDM_XSDM_INT_MASK_0_REG_ADDRESS_ERROR_SIZE 0 +-#define XSEM_XSEM_INT_STS_0_REG_ADDRESS_ERROR (0x1<<0) +-#define XSEM_XSEM_INT_STS_0_REG_ADDRESS_ERROR_SIZE 0 +-#define XSEM_XSEM_INT_STS_CLR_0_REG_ADDRESS_ERROR (0x1<<0) +-#define XSEM_XSEM_INT_STS_CLR_0_REG_ADDRESS_ERROR_SIZE 0 +-#define XSEM_XSEM_INT_STS_WR_0_REG_ADDRESS_ERROR (0x1<<0) +-#define XSEM_XSEM_INT_STS_WR_0_REG_ADDRESS_ERROR_SIZE 0 +-#define XSEM_XSEM_INT_MASK_0_REG_ADDRESS_ERROR (0x1<<0) +-#define XSEM_XSEM_INT_MASK_0_REG_ADDRESS_ERROR_SIZE 0 +-#define CFC_DEBUG1_REG_WRITE_AC (0x1<<4) +-#define CFC_DEBUG1_REG_WRITE_AC_SIZE 4 +-/* [R 1] debug only: This bit indicates whether indicates that external +- buffer was wrapped (oldest data was thrown); Relevant only when +- ~dbg_registers_debug_target=2 (PCI) & ~dbg_registers_full_mode=1 (wrap); */ +-#define DBG_REG_WRAP_ON_EXT_BUFFER 0xc124 +-#define DBG_REG_WRAP_ON_EXT_BUFFER_SIZE 1 +-/* [R 1] debug only: This bit indicates whether the internal buffer was +- wrapped (oldest data was thrown) Relevant only when +- ~dbg_registers_debug_target=0 (internal buffer) */ +-#define DBG_REG_WRAP_ON_INT_BUFFER 0xc128 +-#define DBG_REG_WRAP_ON_INT_BUFFER_SIZE 1 +-#define QM_QM_PRTY_STS_REG_WRBUFF (0x1<<8) +-#define QM_QM_PRTY_STS_REG_WRBUFF_SIZE 8 +-#define QM_QM_PRTY_STS_CLR_REG_WRBUFF (0x1<<8) +-#define QM_QM_PRTY_STS_CLR_REG_WRBUFF_SIZE 8 +-#define QM_QM_PRTY_STS_WR_REG_WRBUFF (0x1<<8) +-#define QM_QM_PRTY_STS_WR_REG_WRBUFF_SIZE 8 +-#define QM_QM_PRTY_MASK_REG_WRBUFF (0x1<<8) +-#define QM_QM_PRTY_MASK_REG_WRBUFF_SIZE 8 +-/* [RW 32] Wrr weights */ +-#define QM_REG_WRRWEIGHTS_0 0x16880c +-#define QM_REG_WRRWEIGHTS_0_SIZE 1 +-/* [RW 32] Wrr weights */ +-#define QM_REG_WRRWEIGHTS_1 0x168810 +-#define QM_REG_WRRWEIGHTS_1_SIZE 1 +-/* [RW 32] Wrr weights */ +-#define QM_REG_WRRWEIGHTS_10 0x168814 +-#define QM_REG_WRRWEIGHTS_10_SIZE 1 +-/* [RW 32] Wrr weights */ +-#define QM_REG_WRRWEIGHTS_11 0x168818 +-#define QM_REG_WRRWEIGHTS_11_SIZE 1 +-/* [RW 32] Wrr weights */ +-#define QM_REG_WRRWEIGHTS_12 0x16881c +-#define QM_REG_WRRWEIGHTS_12_SIZE 1 +-/* [RW 32] Wrr weights */ +-#define QM_REG_WRRWEIGHTS_13 0x168820 +-#define QM_REG_WRRWEIGHTS_13_SIZE 1 +-/* [RW 32] Wrr weights */ +-#define QM_REG_WRRWEIGHTS_14 0x168824 +-#define QM_REG_WRRWEIGHTS_14_SIZE 1 +-/* [RW 32] Wrr weights */ +-#define QM_REG_WRRWEIGHTS_15 0x168828 +-#define QM_REG_WRRWEIGHTS_15_SIZE 1 +-/* [RW 32] Wrr weights */ +-#define QM_REG_WRRWEIGHTS_2 0x16882c +-#define QM_REG_WRRWEIGHTS_2_SIZE 1 +-/* [RW 32] Wrr weights */ +-#define QM_REG_WRRWEIGHTS_3 0x168830 +-#define QM_REG_WRRWEIGHTS_3_SIZE 1 +-/* [RW 32] Wrr weights */ +-#define QM_REG_WRRWEIGHTS_4 0x168834 +-#define QM_REG_WRRWEIGHTS_4_SIZE 1 +-/* [RW 32] Wrr weights */ +-#define QM_REG_WRRWEIGHTS_5 0x168838 +-#define QM_REG_WRRWEIGHTS_5_SIZE 1 +-/* [RW 32] Wrr weights */ +-#define QM_REG_WRRWEIGHTS_6 0x16883c +-#define QM_REG_WRRWEIGHTS_6_SIZE 1 +-/* [RW 32] Wrr weights */ +-#define QM_REG_WRRWEIGHTS_7 0x168840 +-#define QM_REG_WRRWEIGHTS_7_SIZE 1 +-/* [RW 32] Wrr weights */ +-#define QM_REG_WRRWEIGHTS_8 0x168844 +-#define QM_REG_WRRWEIGHTS_8_SIZE 1 +-/* [RW 32] Wrr weights */ +-#define QM_REG_WRRWEIGHTS_9 0x168848 +-#define QM_REG_WRRWEIGHTS_9_SIZE 1 +-/* [RW 32] Wrr weights */ +-#define QM_REG_WRRWEIGHTS_16 0x16e000 +-#define QM_REG_WRRWEIGHTS_16_SIZE 1 +-/* [RW 32] Wrr weights */ +-#define QM_REG_WRRWEIGHTS_17 0x16e004 +-#define QM_REG_WRRWEIGHTS_17_SIZE 1 +-/* [RW 32] Wrr weights */ +-#define QM_REG_WRRWEIGHTS_18 0x16e008 +-#define QM_REG_WRRWEIGHTS_18_SIZE 1 +-/* [RW 32] Wrr weights */ +-#define QM_REG_WRRWEIGHTS_19 0x16e00c +-#define QM_REG_WRRWEIGHTS_19_SIZE 1 +-/* [RW 32] Wrr weights */ +-#define QM_REG_WRRWEIGHTS_20 0x16e010 +-#define QM_REG_WRRWEIGHTS_20_SIZE 1 +-/* [RW 32] Wrr weights */ +-#define QM_REG_WRRWEIGHTS_21 0x16e014 +-#define QM_REG_WRRWEIGHTS_21_SIZE 1 +-/* [RW 32] Wrr weights */ +-#define QM_REG_WRRWEIGHTS_22 0x16e018 +-#define QM_REG_WRRWEIGHTS_22_SIZE 1 +-/* [RW 32] Wrr weights */ +-#define QM_REG_WRRWEIGHTS_23 0x16e01c +-#define QM_REG_WRRWEIGHTS_23_SIZE 1 +-/* [RW 32] Wrr weights */ +-#define QM_REG_WRRWEIGHTS_24 0x16e020 +-#define QM_REG_WRRWEIGHTS_24_SIZE 1 +-/* [RW 32] Wrr weights */ +-#define QM_REG_WRRWEIGHTS_25 0x16e024 +-#define QM_REG_WRRWEIGHTS_25_SIZE 1 +-/* [RW 32] Wrr weights */ +-#define QM_REG_WRRWEIGHTS_26 0x16e028 +-#define QM_REG_WRRWEIGHTS_26_SIZE 1 +-/* [RW 32] Wrr weights */ +-#define QM_REG_WRRWEIGHTS_27 0x16e02c +-#define QM_REG_WRRWEIGHTS_27_SIZE 1 +-/* [RW 32] Wrr weights */ +-#define QM_REG_WRRWEIGHTS_28 0x16e030 +-#define QM_REG_WRRWEIGHTS_28_SIZE 1 +-/* [RW 32] Wrr weights */ +-#define QM_REG_WRRWEIGHTS_29 0x16e034 +-#define QM_REG_WRRWEIGHTS_29_SIZE 1 +-/* [RW 32] Wrr weights */ +-#define QM_REG_WRRWEIGHTS_30 0x16e038 +-#define QM_REG_WRRWEIGHTS_30_SIZE 1 +-/* [RW 32] Wrr weights */ +-#define QM_REG_WRRWEIGHTS_31 0x16e03c +-#define QM_REG_WRRWEIGHTS_31_SIZE 1 + #define SRC_REG_COUNTFREE0 0x40500 + /* [RW 1] If clr the searcher is compatible to E1 A0 - support only two + ports. If set the searcher support 8 functions. */ +@@ -3438,6 +2908,16 @@ + #define SRC_REG_KEYRSS0_0 0x40408 + #define SRC_REG_KEYRSS0_7 0x40424 + #define SRC_REG_KEYRSS1_9 0x40454 ++#define SRC_REG_KEYSEARCH_0 0x40458 ++#define SRC_REG_KEYSEARCH_1 0x4045c ++#define SRC_REG_KEYSEARCH_2 0x40460 ++#define SRC_REG_KEYSEARCH_3 0x40464 ++#define SRC_REG_KEYSEARCH_4 0x40468 ++#define SRC_REG_KEYSEARCH_5 0x4046c ++#define SRC_REG_KEYSEARCH_6 0x40470 ++#define SRC_REG_KEYSEARCH_7 0x40474 ++#define SRC_REG_KEYSEARCH_8 0x40478 ++#define SRC_REG_KEYSEARCH_9 0x4047c + #define SRC_REG_LASTFREE0 0x40530 + #define SRC_REG_NUMBER_HASH_BITS0 0x40400 + /* [RW 1] Reset internal state machines. */ +@@ -3481,6 +2961,10 @@ + /* [RC 1] Message length mismatch (relative to last indication) at the In#9 + interface. */ + #define TCM_REG_CSEM_LENGTH_MIS 0x50174 ++/* [RW 3] The weight of the input csem in the WRR mechanism. 0 stands for ++ weight 8 (the most prioritised); 1 stands for weight 1(least ++ prioritised); 2 stands for weight 2; tc. */ ++#define TCM_REG_CSEM_WEIGHT 0x500bc + /* [RW 8] The Event ID in case of ErrorFlg is set in the input message. */ + #define TCM_REG_ERR_EVNT_ID 0x500a0 + /* [RW 28] The CM erroneous header for QM and Timers formatting. */ +@@ -3515,15 +2999,10 @@ + type (one of 16). */ + #define TCM_REG_N_SM_CTX_LD_0 0x50050 + #define TCM_REG_N_SM_CTX_LD_1 0x50054 +-#define TCM_REG_N_SM_CTX_LD_10 0x50078 +-#define TCM_REG_N_SM_CTX_LD_11 0x5007c +-#define TCM_REG_N_SM_CTX_LD_12 0x50080 +-#define TCM_REG_N_SM_CTX_LD_13 0x50084 +-#define TCM_REG_N_SM_CTX_LD_14 0x50088 +-#define TCM_REG_N_SM_CTX_LD_15 0x5008c + #define TCM_REG_N_SM_CTX_LD_2 0x50058 + #define TCM_REG_N_SM_CTX_LD_3 0x5005c + #define TCM_REG_N_SM_CTX_LD_4 0x50060 ++#define TCM_REG_N_SM_CTX_LD_5 0x50064 + /* [RW 1] Input pbf Interface enable. If 0 - the valid input is disregarded; + acknowledge output is deasserted; all other signals are treated as usual; + if 1 - normal activity. */ +@@ -3563,6 +3042,10 @@ + disregarded; acknowledge output is deasserted; all other signals are + treated as usual; if 1 - normal activity. */ + #define TCM_REG_STORM_TCM_IFEN 0x50010 ++/* [RW 3] The weight of the STORM input in the WRR mechanism. 0 stands for ++ weight 8 (the most prioritised); 1 stands for weight 1(least ++ prioritised); 2 stands for weight 2; tc. */ ++#define TCM_REG_STORM_WEIGHT 0x500ac + /* [RW 1] CM - CFC Interface enable. If 0 - the valid input is disregarded; + acknowledge output is deasserted; all other signals are treated as usual; + if 1 - normal activity. */ +@@ -3598,10 +3081,22 @@ + disregarded; acknowledge output is deasserted; all other signals are + treated as usual; if 1 - normal activity. */ + #define TCM_REG_TM_TCM_IFEN 0x5001c ++/* [RW 3] The weight of the Timers input in the WRR mechanism. 0 stands for ++ weight 8 (the most prioritised); 1 stands for weight 1(least ++ prioritised); 2 stands for weight 2; tc. */ ++#define TCM_REG_TM_WEIGHT 0x500d0 + /* [RW 6] QM output initial credit. Max credit available - 32.Write writes + the initial credit value; read returns the current value of the credit + counter. Must be initialized to 32 at start-up. */ + #define TCM_REG_TQM_INIT_CRD 0x5021c ++/* [RW 3] The weight of the QM (primary) input in the WRR mechanism. 0 ++ stands for weight 8 (the most prioritised); 1 stands for weight 1(least ++ prioritised); 2 stands for weight 2; tc. */ ++#define TCM_REG_TQM_P_WEIGHT 0x500c8 ++/* [RW 3] The weight of the QM (secondary) input in the WRR mechanism. 0 ++ stands for weight 8 (the most prioritised); 1 stands for weight 1(least ++ prioritised); 2 stands for weight 2; tc. */ ++#define TCM_REG_TQM_S_WEIGHT 0x500cc + /* [RW 28] The CM header value for QM request (primary). */ + #define TCM_REG_TQM_TCM_HDR_P 0x50090 + /* [RW 28] The CM header value for QM request (secondary). */ +@@ -3628,6 +3123,10 @@ + /* [RC 1] Message length mismatch (relative to last indication) at the In#8 + interface. */ + #define TCM_REG_USEM_LENGTH_MIS 0x50170 ++/* [RW 3] The weight of the input usem in the WRR mechanism. 0 stands for ++ weight 8 (the most prioritised); 1 stands for weight 1(least ++ prioritised); 2 stands for weight 2; tc. */ ++#define TCM_REG_USEM_WEIGHT 0x500b8 + /* [RW 21] Indirect access to the descriptor table of the XX protection + mechanism. The fields are: [5:0] - length of the message; 15:6] - message + pointer; 20:16] - next pointer. */ +@@ -3677,6 +3176,7 @@ + #define TM_REG_EN_CL1_INPUT 0x16400c + /* [RW 1] Enable client2 input. */ + #define TM_REG_EN_CL2_INPUT 0x164010 ++#define TM_REG_EN_LINEAR0_TIMER 0x164014 + /* [RW 1] Enable real time counter. */ + #define TM_REG_EN_REAL_TIME_CNT 0x1640d8 + /* [RW 1] Enable for Timers state machines. */ +@@ -3684,20 +3184,27 @@ + /* [RW 4] Load value for expiration credit cnt. CFC max number of + outstanding load requests for timers (expiration) context loading. */ + #define TM_REG_EXP_CRDCNT_VAL 0x164238 ++/* [RW 32] Linear0 logic address. */ ++#define TM_REG_LIN0_LOGIC_ADDR 0x164240 + /* [RW 18] Linear0 Max active cid (in banks of 32 entries). */ + #define TM_REG_LIN0_MAX_ACTIVE_CID 0x164048 + /* [WB 64] Linear0 phy address. */ + #define TM_REG_LIN0_PHY_ADDR 0x164270 ++/* [RW 1] Linear0 physical address valid. */ ++#define TM_REG_LIN0_PHY_ADDR_VALID 0x164248 ++#define TM_REG_LIN0_SCAN_ON 0x1640d0 + /* [RW 24] Linear0 array scan timeout. */ + #define TM_REG_LIN0_SCAN_TIME 0x16403c ++/* [RW 32] Linear1 logic address. */ ++#define TM_REG_LIN1_LOGIC_ADDR 0x164250 + /* [WB 64] Linear1 phy address. */ + #define TM_REG_LIN1_PHY_ADDR 0x164280 ++/* [RW 1] Linear1 physical address valid. */ ++#define TM_REG_LIN1_PHY_ADDR_VALID 0x164258 + /* [RW 6] Linear timer set_clear fifo threshold. */ + #define TM_REG_LIN_SETCLR_FIFO_ALFULL_THR 0x164070 + /* [RW 2] Load value for pci arbiter credit cnt. */ + #define TM_REG_PCIARB_CRDCNT_VAL 0x164260 +-/* [RW 1] Timer software reset - active high. */ +-#define TM_REG_TIMER_SOFT_RST 0x164004 + /* [RW 20] The amount of hardware cycles for each timer tick. */ + #define TM_REG_TIMER_TICK_SIZE 0x16401c + /* [RW 8] Timers Context region. */ +@@ -3708,21 +3215,13 @@ + #define TM_REG_TM_INT_STS 0x1640f0 + /* [RW 8] The event id for aggregated interrupt 0 */ + #define TSDM_REG_AGG_INT_EVENT_0 0x42038 ++#define TSDM_REG_AGG_INT_EVENT_1 0x4203c + #define TSDM_REG_AGG_INT_EVENT_2 0x42040 +-#define TSDM_REG_AGG_INT_EVENT_20 0x42088 +-#define TSDM_REG_AGG_INT_EVENT_21 0x4208c +-#define TSDM_REG_AGG_INT_EVENT_22 0x42090 +-#define TSDM_REG_AGG_INT_EVENT_23 0x42094 +-#define TSDM_REG_AGG_INT_EVENT_24 0x42098 +-#define TSDM_REG_AGG_INT_EVENT_25 0x4209c +-#define TSDM_REG_AGG_INT_EVENT_26 0x420a0 +-#define TSDM_REG_AGG_INT_EVENT_27 0x420a4 +-#define TSDM_REG_AGG_INT_EVENT_28 0x420a8 +-#define TSDM_REG_AGG_INT_EVENT_29 0x420ac + #define TSDM_REG_AGG_INT_EVENT_3 0x42044 +-#define TSDM_REG_AGG_INT_EVENT_30 0x420b0 +-#define TSDM_REG_AGG_INT_EVENT_31 0x420b4 + #define TSDM_REG_AGG_INT_EVENT_4 0x42048 ++/* [RW 1] The T bit for aggregated interrupt 0 */ ++#define TSDM_REG_AGG_INT_T_0 0x420b8 ++#define TSDM_REG_AGG_INT_T_1 0x420bc + /* [RW 13] The start address in the internal RAM for the cfc_rsp lcid */ + #define TSDM_REG_CFC_RSP_START_ADDR 0x42008 + /* [RW 16] The maximum value of the competion counter #0 */ +@@ -3860,11 +3359,11 @@ + /* [ST 24] Statistics register. The number of messages that were sent to + FOC3 */ + #define TSEM_REG_MSG_NUM_FOC3 0x180014 ++/* [WB 128] Debug only. Passive buffer memory */ ++#define TSEM_REG_PASSIVE_BUFFER 0x181000 + /* [RW 1] Disables input messages from the passive buffer May be updated + during run_time by the microcode */ + #define TSEM_REG_PAS_DISABLE 0x18024c +-/* [WB 128] Debug only. Passive buffer memory */ +-#define TSEM_REG_PASSIVE_BUFFER 0x181000 + /* [WB 46] pram memory. B45 is parity; b[44:0] - data. */ + #define TSEM_REG_PRAM 0x1c0000 + /* [R 8] Valid sleeping threads indication have bit per thread */ +@@ -3873,6 +3372,18 @@ + #define TSEM_REG_SLOW_EXT_STORE_EMPTY 0x1802a0 + /* [RW 8] List of free threads . There is a bit per thread. */ + #define TSEM_REG_THREADS_LIST 0x1802e4 ++/* [RW 32] Interrupt mask register #0 read/write */ ++#define TSEM_REG_TSEM_INT_MASK_0 0x180100 ++#define TSEM_REG_TSEM_INT_MASK_1 0x180110 ++/* [R 32] Interrupt register #0 read */ ++#define TSEM_REG_TSEM_INT_STS_0 0x1800f4 ++#define TSEM_REG_TSEM_INT_STS_1 0x180104 ++/* [RW 32] Parity mask register #0 read/write */ ++#define TSEM_REG_TSEM_PRTY_MASK_0 0x180120 ++#define TSEM_REG_TSEM_PRTY_MASK_1 0x180130 ++/* [R 32] Parity register #0 read */ ++#define TSEM_REG_TSEM_PRTY_STS_0 0x180114 ++#define TSEM_REG_TSEM_PRTY_STS_1 0x180124 + /* [RW 3] The arbitration scheme of time_slot 0 */ + #define TSEM_REG_TS_0_AS 0x180038 + /* [RW 3] The arbitration scheme of time_slot 10 */ +@@ -3911,18 +3422,6 @@ + #define TSEM_REG_TS_8_AS 0x180058 + /* [RW 3] The arbitration scheme of time_slot 9 */ + #define TSEM_REG_TS_9_AS 0x18005c +-/* [RW 32] Interrupt mask register #0 read/write */ +-#define TSEM_REG_TSEM_INT_MASK_0 0x180100 +-#define TSEM_REG_TSEM_INT_MASK_1 0x180110 +-/* [R 32] Interrupt register #0 read */ +-#define TSEM_REG_TSEM_INT_STS_0 0x1800f4 +-#define TSEM_REG_TSEM_INT_STS_1 0x180104 +-/* [RW 32] Parity mask register #0 read/write */ +-#define TSEM_REG_TSEM_PRTY_MASK_0 0x180120 +-#define TSEM_REG_TSEM_PRTY_MASK_1 0x180130 +-/* [R 32] Parity register #0 read */ +-#define TSEM_REG_TSEM_PRTY_STS_0 0x180114 +-#define TSEM_REG_TSEM_PRTY_STS_1 0x180124 + /* [R 5] Used to read the XX protection CAM occupancy counter. */ + #define UCM_REG_CAM_OCCUP 0xe0170 + /* [RW 1] CDU AG read Interface enable. If 0 - the request input is +@@ -3967,6 +3466,10 @@ + /* [RC 1] Set when the message length mismatch (relative to last indication) + at the dorq interface is detected. */ + #define UCM_REG_DORQ_LENGTH_MIS 0xe0168 ++/* [RW 3] The weight of the input dorq in the WRR mechanism. 0 stands for ++ weight 8 (the most prioritised); 1 stands for weight 1(least ++ prioritised); 2 stands for weight 2; tc. */ ++#define UCM_REG_DORQ_WEIGHT 0xe00c0 + /* [RW 8] The Event ID in case ErrorFlg input message bit is set. */ + #define UCM_REG_ERR_EVNT_ID 0xe00a4 + /* [RW 28] The CM erroneous header for QM and Timers formatting. */ +@@ -4003,12 +3506,6 @@ + connection type (one of 16). */ + #define UCM_REG_N_SM_CTX_LD_0 0xe0054 + #define UCM_REG_N_SM_CTX_LD_1 0xe0058 +-#define UCM_REG_N_SM_CTX_LD_10 0xe007c +-#define UCM_REG_N_SM_CTX_LD_11 0xe0080 +-#define UCM_REG_N_SM_CTX_LD_12 0xe0084 +-#define UCM_REG_N_SM_CTX_LD_13 0xe0088 +-#define UCM_REG_N_SM_CTX_LD_14 0xe008c +-#define UCM_REG_N_SM_CTX_LD_15 0xe0090 + #define UCM_REG_N_SM_CTX_LD_2 0xe005c + #define UCM_REG_N_SM_CTX_LD_3 0xe0060 + #define UCM_REG_N_SM_CTX_LD_4 0xe0064 +@@ -4030,6 +3527,10 @@ + disregarded; acknowledge output is deasserted; all other signals are + treated as usual; if 1 - normal activity. */ + #define UCM_REG_STORM_UCM_IFEN 0xe0010 ++/* [RW 3] The weight of the STORM input in the WRR mechanism. 0 stands for ++ weight 8 (the most prioritised); 1 stands for weight 1(least ++ prioritised); 2 stands for weight 2; tc. */ ++#define UCM_REG_STORM_WEIGHT 0xe00b0 + /* [RW 4] Timers output initial credit. Max credit available - 15.Write + writes the initial credit value; read returns the current value of the + credit counter. Must be initialized to 4 at start-up. */ +@@ -4040,6 +3541,10 @@ + disregarded; acknowledge output is deasserted; all other signals are + treated as usual; if 1 - normal activity. */ + #define UCM_REG_TM_UCM_IFEN 0xe001c ++/* [RW 3] The weight of the Timers input in the WRR mechanism. 0 stands for ++ weight 8 (the most prioritised); 1 stands for weight 1(least ++ prioritised); 2 stands for weight 2; tc. */ ++#define UCM_REG_TM_WEIGHT 0xe00d4 + /* [RW 1] Input tsem Interface enable. If 0 - the valid input is + disregarded; acknowledge output is deasserted; all other signals are + treated as usual; if 1 - normal activity. */ +@@ -4092,6 +3597,10 @@ + stands for weight 8 (the most prioritised); 1 stands for weight 1(least + prioritised); 2 stands for weight 2; tc. */ + #define UCM_REG_UQM_P_WEIGHT 0xe00cc ++/* [RW 3] The weight of the QM (secondary) input in the WRR mechanism. 0 ++ stands for weight 8 (the most prioritised); 1 stands for weight 1(least ++ prioritised); 2 stands for weight 2; tc. */ ++#define UCM_REG_UQM_S_WEIGHT 0xe00d0 + /* [RW 28] The CM header value for QM request (primary). */ + #define UCM_REG_UQM_UCM_HDR_P 0xe0094 + /* [RW 28] The CM header value for QM request (secondary). */ +@@ -4107,6 +3616,10 @@ + /* [RC 1] Set when the message length mismatch (relative to last indication) + at the SDM interface is detected. */ + #define UCM_REG_USDM_LENGTH_MIS 0xe0158 ++/* [RW 3] The weight of the SDM input in the WRR mechanism. 0 stands for ++ weight 8 (the most prioritised); 1 stands for weight 1(least ++ prioritised); 2 stands for weight 2; tc. */ ++#define UCM_REG_USDM_WEIGHT 0xe00c8 + /* [RW 1] Input xsem Interface enable. If 0 - the valid input is + disregarded; acknowledge output is deasserted; all other signals are + treated as usual; if 1 - normal activity. */ +@@ -4114,6 +3627,10 @@ + /* [RC 1] Set when the message length mismatch (relative to last indication) + at the xsem interface isdetected. */ + #define UCM_REG_XSEM_LENGTH_MIS 0xe0164 ++/* [RW 3] The weight of the input xsem in the WRR mechanism. 0 stands for ++ weight 8 (the most prioritised); 1 stands for weight 1(least ++ prioritised); 2 stands for weight 2; tc. */ ++#define UCM_REG_XSEM_WEIGHT 0xe00bc + /* [RW 20] Indirect access to the descriptor table of the XX protection + mechanism. The fields are:[5:0] - message length; 14:6] - message + pointer; 19:15] - next pointer. */ +@@ -4138,45 +3655,20 @@ + /* [RW 8] The event id for aggregated interrupt 0 */ + #define USDM_REG_AGG_INT_EVENT_0 0xc4038 + #define USDM_REG_AGG_INT_EVENT_1 0xc403c +-#define USDM_REG_AGG_INT_EVENT_10 0xc4060 +-#define USDM_REG_AGG_INT_EVENT_11 0xc4064 +-#define USDM_REG_AGG_INT_EVENT_12 0xc4068 +-#define USDM_REG_AGG_INT_EVENT_13 0xc406c +-#define USDM_REG_AGG_INT_EVENT_14 0xc4070 +-#define USDM_REG_AGG_INT_EVENT_15 0xc4074 +-#define USDM_REG_AGG_INT_EVENT_16 0xc4078 +-#define USDM_REG_AGG_INT_EVENT_17 0xc407c +-#define USDM_REG_AGG_INT_EVENT_18 0xc4080 +-#define USDM_REG_AGG_INT_EVENT_19 0xc4084 + #define USDM_REG_AGG_INT_EVENT_2 0xc4040 +-#define USDM_REG_AGG_INT_EVENT_20 0xc4088 +-#define USDM_REG_AGG_INT_EVENT_21 0xc408c +-#define USDM_REG_AGG_INT_EVENT_22 0xc4090 +-#define USDM_REG_AGG_INT_EVENT_23 0xc4094 +-#define USDM_REG_AGG_INT_EVENT_24 0xc4098 +-#define USDM_REG_AGG_INT_EVENT_25 0xc409c +-#define USDM_REG_AGG_INT_EVENT_26 0xc40a0 +-#define USDM_REG_AGG_INT_EVENT_27 0xc40a4 +-#define USDM_REG_AGG_INT_EVENT_28 0xc40a8 +-#define USDM_REG_AGG_INT_EVENT_29 0xc40ac +-#define USDM_REG_AGG_INT_EVENT_3 0xc4044 +-#define USDM_REG_AGG_INT_EVENT_30 0xc40b0 +-#define USDM_REG_AGG_INT_EVENT_31 0xc40b4 + #define USDM_REG_AGG_INT_EVENT_4 0xc4048 ++#define USDM_REG_AGG_INT_EVENT_5 0xc404c ++#define USDM_REG_AGG_INT_EVENT_6 0xc4050 + /* [RW 1] For each aggregated interrupt index whether the mode is normal (0) + or auto-mask-mode (1) */ + #define USDM_REG_AGG_INT_MODE_0 0xc41b8 + #define USDM_REG_AGG_INT_MODE_1 0xc41bc +-#define USDM_REG_AGG_INT_MODE_10 0xc41e0 +-#define USDM_REG_AGG_INT_MODE_11 0xc41e4 +-#define USDM_REG_AGG_INT_MODE_12 0xc41e8 +-#define USDM_REG_AGG_INT_MODE_13 0xc41ec +-#define USDM_REG_AGG_INT_MODE_14 0xc41f0 +-#define USDM_REG_AGG_INT_MODE_15 0xc41f4 +-#define USDM_REG_AGG_INT_MODE_16 0xc41f8 +-#define USDM_REG_AGG_INT_MODE_17 0xc41fc +-#define USDM_REG_AGG_INT_MODE_18 0xc4200 +-#define USDM_REG_AGG_INT_MODE_19 0xc4204 ++#define USDM_REG_AGG_INT_MODE_4 0xc41c8 ++#define USDM_REG_AGG_INT_MODE_5 0xc41cc ++#define USDM_REG_AGG_INT_MODE_6 0xc41d0 ++/* [RW 1] The T bit for aggregated interrupt 5 */ ++#define USDM_REG_AGG_INT_T_5 0xc40cc ++#define USDM_REG_AGG_INT_T_6 0xc40d0 + /* [RW 13] The start address in the internal RAM for the cfc_rsp lcid */ + #define USDM_REG_CFC_RSP_START_ADDR 0xc4008 + /* [RW 16] The maximum value of the competion counter #0 */ +@@ -4316,11 +3808,11 @@ + /* [ST 24] Statistics register. The number of messages that were sent to + FOC3 */ + #define USEM_REG_MSG_NUM_FOC3 0x300014 ++/* [WB 128] Debug only. Passive buffer memory */ ++#define USEM_REG_PASSIVE_BUFFER 0x302000 + /* [RW 1] Disables input messages from the passive buffer May be updated + during run_time by the microcode */ + #define USEM_REG_PAS_DISABLE 0x30024c +-/* [WB 128] Debug only. Passive buffer memory */ +-#define USEM_REG_PASSIVE_BUFFER 0x302000 + /* [WB 46] pram memory. B45 is parity; b[44:0] - data. */ + #define USEM_REG_PRAM 0x340000 + /* [R 16] Valid sleeping threads indication have bit per thread */ +@@ -4427,6 +3919,10 @@ + /* [RC 1] Set at message length mismatch (relative to last indication) at + the dorq interface. */ + #define XCM_REG_DORQ_LENGTH_MIS 0x20230 ++/* [RW 3] The weight of the input dorq in the WRR mechanism. 0 stands for ++ weight 8 (the most prioritised); 1 stands for weight 1(least ++ prioritised); 2 stands for weight 2; tc. */ ++#define XCM_REG_DORQ_WEIGHT 0x200cc + /* [RW 8] The Event ID in case the ErrorFlg input message bit is set. */ + #define XCM_REG_ERR_EVNT_ID 0x200b0 + /* [RW 28] The CM erroneous header for QM and Timers formatting. */ +@@ -4465,6 +3961,10 @@ + /* [RC 1] Set at message length mismatch (relative to last indication) at + the nig0 interface. */ + #define XCM_REG_NIG0_LENGTH_MIS 0x20238 ++/* [RW 3] The weight of the input nig0 in the WRR mechanism. 0 stands for ++ weight 8 (the most prioritised); 1 stands for weight 1(least ++ prioritised); 2 stands for weight 2; tc. */ ++#define XCM_REG_NIG0_WEIGHT 0x200d4 + /* [RW 1] Input nig1 Interface enable. If 0 - the valid input is + disregarded; acknowledge output is deasserted; all other signals are + treated as usual; if 1 - normal activity. */ +@@ -4472,10 +3972,6 @@ + /* [RC 1] Set at message length mismatch (relative to last indication) at + the nig1 interface. */ + #define XCM_REG_NIG1_LENGTH_MIS 0x2023c +-/* [RW 3] The weight of the input nig1 in the WRR mechanism. 0 stands for +- weight 8 (the most prioritised); 1 stands for weight 1(least +- prioritised); 2 stands for weight 2; tc. */ +-#define XCM_REG_NIG1_WEIGHT 0x200d8 + /* [RW 5] The number of double REG-pairs; loaded from the STORM context and + sent to STORM; for a specific connection type. The double REG-pairs are + used in order to align to STORM context row size of 128 bits. The offset +@@ -4483,12 +3979,6 @@ + connection type (one of 16). */ + #define XCM_REG_N_SM_CTX_LD_0 0x20060 + #define XCM_REG_N_SM_CTX_LD_1 0x20064 +-#define XCM_REG_N_SM_CTX_LD_10 0x20088 +-#define XCM_REG_N_SM_CTX_LD_11 0x2008c +-#define XCM_REG_N_SM_CTX_LD_12 0x20090 +-#define XCM_REG_N_SM_CTX_LD_13 0x20094 +-#define XCM_REG_N_SM_CTX_LD_14 0x20098 +-#define XCM_REG_N_SM_CTX_LD_15 0x2009c + #define XCM_REG_N_SM_CTX_LD_2 0x20068 + #define XCM_REG_N_SM_CTX_LD_3 0x2006c + #define XCM_REG_N_SM_CTX_LD_4 0x20070 +@@ -4523,6 +4013,10 @@ + writes the initial credit value; read returns the current value of the + credit counter. Must be initialized to 4 at start-up. */ + #define XCM_REG_TM_INIT_CRD 0x2041c ++/* [RW 3] The weight of the Timers input in the WRR mechanism. 0 stands for ++ weight 8 (the most prioritised); 1 stands for weight 1(least ++ prioritised); 2 stands for weight 2; tc. */ ++#define XCM_REG_TM_WEIGHT 0x200ec + /* [RW 28] The CM header for Timers expiration command. */ + #define XCM_REG_TM_XCM_HDR 0x200a8 + /* [RW 1] Timers - CM Interface enable. If 0 - the valid input is +@@ -4608,6 +4102,10 @@ + stands for weight 8 (the most prioritised); 1 stands for weight 1(least + prioritised); 2 stands for weight 2; tc. */ + #define XCM_REG_XQM_P_WEIGHT 0x200e4 ++/* [RW 3] The weight of the QM (secondary) input in the WRR mechanism. 0 ++ stands for weight 8 (the most prioritised); 1 stands for weight 1(least ++ prioritised); 2 stands for weight 2; tc. */ ++#define XCM_REG_XQM_S_WEIGHT 0x200e8 + /* [RW 28] The CM header value for QM request (primary). */ + #define XCM_REG_XQM_XCM_HDR_P 0x200a0 + /* [RW 28] The CM header value for QM request (secondary). */ +@@ -4657,28 +4155,8 @@ + #define XSDM_REG_AGG_INT_EVENT_12 0x166068 + #define XSDM_REG_AGG_INT_EVENT_13 0x16606c + #define XSDM_REG_AGG_INT_EVENT_14 0x166070 +-#define XSDM_REG_AGG_INT_EVENT_15 0x166074 +-#define XSDM_REG_AGG_INT_EVENT_16 0x166078 +-#define XSDM_REG_AGG_INT_EVENT_17 0x16607c +-#define XSDM_REG_AGG_INT_EVENT_18 0x166080 +-#define XSDM_REG_AGG_INT_EVENT_19 0x166084 +-#define XSDM_REG_AGG_INT_EVENT_10 0x166060 +-#define XSDM_REG_AGG_INT_EVENT_11 0x166064 +-#define XSDM_REG_AGG_INT_EVENT_12 0x166068 + #define XSDM_REG_AGG_INT_EVENT_2 0x166040 +-#define XSDM_REG_AGG_INT_EVENT_20 0x166088 +-#define XSDM_REG_AGG_INT_EVENT_21 0x16608c +-#define XSDM_REG_AGG_INT_EVENT_22 0x166090 +-#define XSDM_REG_AGG_INT_EVENT_23 0x166094 +-#define XSDM_REG_AGG_INT_EVENT_24 0x166098 +-#define XSDM_REG_AGG_INT_EVENT_25 0x16609c +-#define XSDM_REG_AGG_INT_EVENT_26 0x1660a0 +-#define XSDM_REG_AGG_INT_EVENT_27 0x1660a4 +-#define XSDM_REG_AGG_INT_EVENT_28 0x1660a8 +-#define XSDM_REG_AGG_INT_EVENT_29 0x1660ac + #define XSDM_REG_AGG_INT_EVENT_3 0x166044 +-#define XSDM_REG_AGG_INT_EVENT_30 0x1660b0 +-#define XSDM_REG_AGG_INT_EVENT_31 0x1660b4 + #define XSDM_REG_AGG_INT_EVENT_4 0x166048 + #define XSDM_REG_AGG_INT_EVENT_5 0x16604c + #define XSDM_REG_AGG_INT_EVENT_6 0x166050 +@@ -4689,16 +4167,6 @@ + or auto-mask-mode (1) */ + #define XSDM_REG_AGG_INT_MODE_0 0x1661b8 + #define XSDM_REG_AGG_INT_MODE_1 0x1661bc +-#define XSDM_REG_AGG_INT_MODE_10 0x1661e0 +-#define XSDM_REG_AGG_INT_MODE_11 0x1661e4 +-#define XSDM_REG_AGG_INT_MODE_12 0x1661e8 +-#define XSDM_REG_AGG_INT_MODE_13 0x1661ec +-#define XSDM_REG_AGG_INT_MODE_14 0x1661f0 +-#define XSDM_REG_AGG_INT_MODE_15 0x1661f4 +-#define XSDM_REG_AGG_INT_MODE_16 0x1661f8 +-#define XSDM_REG_AGG_INT_MODE_17 0x1661fc +-#define XSDM_REG_AGG_INT_MODE_18 0x166200 +-#define XSDM_REG_AGG_INT_MODE_19 0x166204 + /* [RW 13] The start address in the internal RAM for the cfc_rsp lcid */ + #define XSDM_REG_CFC_RSP_START_ADDR 0x166008 + /* [RW 16] The maximum value of the competion counter #0 */ +@@ -4834,11 +4302,11 @@ + /* [ST 24] Statistics register. The number of messages that were sent to + FOC3 */ + #define XSEM_REG_MSG_NUM_FOC3 0x280014 ++/* [WB 128] Debug only. Passive buffer memory */ ++#define XSEM_REG_PASSIVE_BUFFER 0x282000 + /* [RW 1] Disables input messages from the passive buffer May be updated + during run_time by the microcode */ + #define XSEM_REG_PAS_DISABLE 0x28024c +-/* [WB 128] Debug only. Passive buffer memory */ +-#define XSEM_REG_PASSIVE_BUFFER 0x282000 + /* [WB 46] pram memory. B45 is parity; b[44:0] - data. */ + #define XSEM_REG_PRAM 0x2c0000 + /* [R 16] Valid sleeping threads indication have bit per thread */ +@@ -4906,10 +4374,6 @@ + #define MCPR_NVM_COMMAND_FIRST (1L<<7) + #define MCPR_NVM_COMMAND_LAST (1L<<8) + #define MCPR_NVM_COMMAND_WR (1L<<5) +-#define MCPR_NVM_COMMAND_WREN (1L<<16) +-#define MCPR_NVM_COMMAND_WREN_BITSHIFT 16 +-#define MCPR_NVM_COMMAND_WRDI (1L<<17) +-#define MCPR_NVM_COMMAND_WRDI_BITSHIFT 17 + #define MCPR_NVM_SW_ARB_ARB_ARB1 (1L<<9) + #define MCPR_NVM_SW_ARB_ARB_REQ_CLR1 (1L<<5) + #define MCPR_NVM_SW_ARB_ARB_REQ_SET1 (1L<<1) +@@ -4927,6 +4391,15 @@ + #define BIGMAC_REGISTER_TX_SOURCE_ADDR (0x08<<3) + #define BIGMAC_REGISTER_TX_STAT_GTBYT (0x20<<3) + #define BIGMAC_REGISTER_TX_STAT_GTPKT (0x0C<<3) ++#define BIGMAC2_REGISTER_BMAC_CONTROL (0x00<<3) ++#define BIGMAC2_REGISTER_BMAC_XGXS_CONTROL (0x01<<3) ++#define BIGMAC2_REGISTER_PFC_CONTROL (0x06<<3) ++#define BIGMAC2_REGISTER_RX_CONTROL (0x3A<<3) ++#define BIGMAC2_REGISTER_RX_LLFC_MSG_FLDS (0x62<<3) ++#define BIGMAC2_REGISTER_RX_MAX_SIZE (0x3C<<3) ++#define BIGMAC2_REGISTER_TX_CONTROL (0x1C<<3) ++#define BIGMAC2_REGISTER_TX_MAX_SIZE (0x1E<<3) ++#define BIGMAC2_REGISTER_TX_SOURCE_ADDR (0x1D<<3) + #define EMAC_LED_1000MB_OVERRIDE (1L<<1) + #define EMAC_LED_100MB_OVERRIDE (1L<<2) + #define EMAC_LED_10MB_OVERRIDE (1L<<3) +@@ -4939,7 +4412,7 @@ + #define EMAC_MDIO_COMM_DATA (0xffffL<<0) + #define EMAC_MDIO_COMM_START_BUSY (1L<<29) + #define EMAC_MDIO_MODE_AUTO_POLL (1L<<4) +-#define EMAC_MDIO_MODE_CLAUSE_45 (1L<<31) ++#define EMAC_MDIO_MODE_CLAUSE_45 (1<<31) + #define EMAC_MDIO_MODE_CLOCK_CNT (0x3fL<<16) + #define EMAC_MDIO_MODE_CLOCK_CNT_BITSHIFT 16 + #define EMAC_MODE_25G_MODE (1L<<5) +@@ -4964,9 +4437,11 @@ + #define EMAC_RX_MODE_FLOW_EN (1L<<2) + #define EMAC_RX_MODE_KEEP_VLAN_TAG (1L<<10) + #define EMAC_RX_MODE_PROMISCUOUS (1L<<8) +-#define EMAC_RX_MTU_SIZE_JUMBO_ENA (1L<<31) ++#define EMAC_RX_MODE_RESET (1L<<0) ++#define EMAC_RX_MTU_SIZE_JUMBO_ENA (1<<31) + #define EMAC_TX_MODE_EXT_PAUSE_EN (1L<<3) + #define EMAC_TX_MODE_FLOW_EN (1L<<4) ++#define EMAC_TX_MODE_RESET (1L<<0) + #define MISC_REGISTERS_GPIO_0 0 + #define MISC_REGISTERS_GPIO_1 1 + #define MISC_REGISTERS_GPIO_2 2 +@@ -4976,6 +4451,10 @@ + #define MISC_REGISTERS_GPIO_FLOAT_POS 24 + #define MISC_REGISTERS_GPIO_HIGH 1 + #define MISC_REGISTERS_GPIO_INPUT_HI_Z 2 ++#define MISC_REGISTERS_GPIO_INT_CLR_POS 24 ++#define MISC_REGISTERS_GPIO_INT_OUTPUT_CLR 0 ++#define MISC_REGISTERS_GPIO_INT_OUTPUT_SET 1 ++#define MISC_REGISTERS_GPIO_INT_SET_POS 16 + #define MISC_REGISTERS_GPIO_LOW 0 + #define MISC_REGISTERS_GPIO_OUTPUT_HIGH 1 + #define MISC_REGISTERS_GPIO_OUTPUT_LOW 0 +@@ -5004,10 +4483,6 @@ + #define MISC_REGISTERS_SPIO_7 7 + #define MISC_REGISTERS_SPIO_CLR_POS 16 + #define MISC_REGISTERS_SPIO_FLOAT (0xffL<<24) +-#define GRC_MISC_REGISTERS_SPIO_FLOAT7 0x80000000 +-#define GRC_MISC_REGISTERS_SPIO_FLOAT6 0x40000000 +-#define GRC_MISC_REGISTERS_SPIO_FLOAT5 0x20000000 +-#define GRC_MISC_REGISTERS_SPIO_FLOAT4 0x10000000 + #define MISC_REGISTERS_SPIO_FLOAT_POS 24 + #define MISC_REGISTERS_SPIO_INPUT_HI_Z 2 + #define MISC_REGISTERS_SPIO_INT_OLD_SET_POS 16 +@@ -5015,58 +4490,61 @@ + #define MISC_REGISTERS_SPIO_OUTPUT_LOW 0 + #define MISC_REGISTERS_SPIO_SET_POS 8 + #define HW_LOCK_MAX_RESOURCE_VALUE 31 +-#define HW_LOCK_RESOURCE_8072_MDIO 0 + #define HW_LOCK_RESOURCE_GPIO 1 ++#define HW_LOCK_RESOURCE_MDIO 0 + #define HW_LOCK_RESOURCE_PORT0_ATT_MASK 3 + #define HW_LOCK_RESOURCE_SPIO 2 + #define HW_LOCK_RESOURCE_UNDI 5 +-#define AEU_INPUTS_ATTN_BITS_BRB_PARITY_ERROR (1<<18) +-#define AEU_INPUTS_ATTN_BITS_CCM_HW_INTERRUPT (1<<31) +-#define AEU_INPUTS_ATTN_BITS_CDU_HW_INTERRUPT (1<<9) +-#define AEU_INPUTS_ATTN_BITS_CDU_PARITY_ERROR (1<<8) +-#define AEU_INPUTS_ATTN_BITS_CFC_HW_INTERRUPT (1<<7) +-#define AEU_INPUTS_ATTN_BITS_CFC_PARITY_ERROR (1<<6) +-#define AEU_INPUTS_ATTN_BITS_CSDM_HW_INTERRUPT (1<<29) +-#define AEU_INPUTS_ATTN_BITS_CSDM_PARITY_ERROR (1<<28) +-#define AEU_INPUTS_ATTN_BITS_CSEMI_HW_INTERRUPT (1<<1) +-#define AEU_INPUTS_ATTN_BITS_CSEMI_PARITY_ERROR (1<<0) +-#define AEU_INPUTS_ATTN_BITS_DEBUG_PARITY_ERROR (1<<18) +-#define AEU_INPUTS_ATTN_BITS_DMAE_HW_INTERRUPT (1<<11) +-#define AEU_INPUTS_ATTN_BITS_DOORBELLQ_HW_INTERRUPT (1<<13) +-#define AEU_INPUTS_ATTN_BITS_DOORBELLQ_PARITY_ERROR (1<<12) +-#define AEU_INPUTS_ATTN_BITS_IGU_PARITY_ERROR (1<<12) +-#define AEU_INPUTS_ATTN_BITS_MISC_HW_INTERRUPT (1<<15) +-#define AEU_INPUTS_ATTN_BITS_MISC_PARITY_ERROR (1<<14) +-#define AEU_INPUTS_ATTN_BITS_PARSER_PARITY_ERROR (1<<20) +-#define AEU_INPUTS_ATTN_BITS_PBCLIENT_PARITY_ERROR (1<<0) +-#define AEU_INPUTS_ATTN_BITS_PBF_HW_INTERRUPT (1<<31) +-#define AEU_INPUTS_ATTN_BITS_PXP_HW_INTERRUPT (1<<3) +-#define AEU_INPUTS_ATTN_BITS_PXP_PARITY_ERROR (1<<2) +-#define AEU_INPUTS_ATTN_BITS_PXPPCICLOCKCLIENT_HW_INTERRUPT (1<<5) +-#define AEU_INPUTS_ATTN_BITS_PXPPCICLOCKCLIENT_PARITY_ERROR (1<<4) +-#define AEU_INPUTS_ATTN_BITS_QM_HW_INTERRUPT (1<<3) +-#define AEU_INPUTS_ATTN_BITS_QM_PARITY_ERROR (1<<2) +-#define AEU_INPUTS_ATTN_BITS_SEARCHER_PARITY_ERROR (1<<22) +-#define AEU_INPUTS_ATTN_BITS_SPIO5 (1<<15) +-#define AEU_INPUTS_ATTN_BITS_TCM_HW_INTERRUPT (1<<27) +-#define AEU_INPUTS_ATTN_BITS_TIMERS_HW_INTERRUPT (1<<5) +-#define AEU_INPUTS_ATTN_BITS_TSDM_HW_INTERRUPT (1<<25) +-#define AEU_INPUTS_ATTN_BITS_TSDM_PARITY_ERROR (1<<24) +-#define AEU_INPUTS_ATTN_BITS_TSEMI_HW_INTERRUPT (1<<29) +-#define AEU_INPUTS_ATTN_BITS_TSEMI_PARITY_ERROR (1<<28) +-#define AEU_INPUTS_ATTN_BITS_UCM_HW_INTERRUPT (1<<23) +-#define AEU_INPUTS_ATTN_BITS_UPB_HW_INTERRUPT (1<<27) +-#define AEU_INPUTS_ATTN_BITS_UPB_PARITY_ERROR (1<<26) +-#define AEU_INPUTS_ATTN_BITS_USDM_HW_INTERRUPT (1<<21) +-#define AEU_INPUTS_ATTN_BITS_USDM_PARITY_ERROR (1<<20) +-#define AEU_INPUTS_ATTN_BITS_USEMI_HW_INTERRUPT (1<<25) +-#define AEU_INPUTS_ATTN_BITS_USEMI_PARITY_ERROR (1<<24) +-#define AEU_INPUTS_ATTN_BITS_VAUX_PCI_CORE_PARITY_ERROR (1<<16) +-#define AEU_INPUTS_ATTN_BITS_XCM_HW_INTERRUPT (1<<9) +-#define AEU_INPUTS_ATTN_BITS_XSDM_HW_INTERRUPT (1<<7) +-#define AEU_INPUTS_ATTN_BITS_XSDM_PARITY_ERROR (1<<6) +-#define AEU_INPUTS_ATTN_BITS_XSEMI_HW_INTERRUPT (1<<11) +-#define AEU_INPUTS_ATTN_BITS_XSEMI_PARITY_ERROR (1<<10) ++#define PRS_FLAG_OVERETH_IPV4 1 ++#define AEU_INPUTS_ATTN_BITS_BRB_PARITY_ERROR (1UL<<18) ++#define AEU_INPUTS_ATTN_BITS_CCM_HW_INTERRUPT (1UL<<31) ++#define AEU_INPUTS_ATTN_BITS_CDU_HW_INTERRUPT (1UL<<9) ++#define AEU_INPUTS_ATTN_BITS_CDU_PARITY_ERROR (1UL<<8) ++#define AEU_INPUTS_ATTN_BITS_CFC_HW_INTERRUPT (1UL<<7) ++#define AEU_INPUTS_ATTN_BITS_CFC_PARITY_ERROR (1UL<<6) ++#define AEU_INPUTS_ATTN_BITS_CSDM_HW_INTERRUPT (1UL<<29) ++#define AEU_INPUTS_ATTN_BITS_CSDM_PARITY_ERROR (1UL<<28) ++#define AEU_INPUTS_ATTN_BITS_CSEMI_HW_INTERRUPT (1UL<<1) ++#define AEU_INPUTS_ATTN_BITS_CSEMI_PARITY_ERROR (1UL<<0) ++#define AEU_INPUTS_ATTN_BITS_DEBUG_PARITY_ERROR (1UL<<18) ++#define AEU_INPUTS_ATTN_BITS_DMAE_HW_INTERRUPT (1UL<<11) ++#define AEU_INPUTS_ATTN_BITS_DOORBELLQ_HW_INTERRUPT (1UL<<13) ++#define AEU_INPUTS_ATTN_BITS_DOORBELLQ_PARITY_ERROR (1UL<<12) ++#define AEU_INPUTS_ATTN_BITS_GPIO3_FUNCTION_0 (1UL<<5) ++#define AEU_INPUTS_ATTN_BITS_GPIO3_FUNCTION_1 (1UL<<9) ++#define AEU_INPUTS_ATTN_BITS_IGU_PARITY_ERROR (1UL<<12) ++#define AEU_INPUTS_ATTN_BITS_MISC_HW_INTERRUPT (1UL<<15) ++#define AEU_INPUTS_ATTN_BITS_MISC_PARITY_ERROR (1UL<<14) ++#define AEU_INPUTS_ATTN_BITS_PARSER_PARITY_ERROR (1UL<<20) ++#define AEU_INPUTS_ATTN_BITS_PBCLIENT_PARITY_ERROR (1UL<<0) ++#define AEU_INPUTS_ATTN_BITS_PBF_HW_INTERRUPT (1UL<<31) ++#define AEU_INPUTS_ATTN_BITS_PXPPCICLOCKCLIENT_HW_INTERRUPT (1UL<<5) ++#define AEU_INPUTS_ATTN_BITS_PXPPCICLOCKCLIENT_PARITY_ERROR (1UL<<4) ++#define AEU_INPUTS_ATTN_BITS_PXP_HW_INTERRUPT (1UL<<3) ++#define AEU_INPUTS_ATTN_BITS_PXP_PARITY_ERROR (1UL<<2) ++#define AEU_INPUTS_ATTN_BITS_QM_HW_INTERRUPT (1UL<<3) ++#define AEU_INPUTS_ATTN_BITS_QM_PARITY_ERROR (1UL<<2) ++#define AEU_INPUTS_ATTN_BITS_SEARCHER_PARITY_ERROR (1UL<<22) ++#define AEU_INPUTS_ATTN_BITS_SPIO5 (1UL<<15) ++#define AEU_INPUTS_ATTN_BITS_TCM_HW_INTERRUPT (1UL<<27) ++#define AEU_INPUTS_ATTN_BITS_TIMERS_HW_INTERRUPT (1UL<<5) ++#define AEU_INPUTS_ATTN_BITS_TSDM_HW_INTERRUPT (1UL<<25) ++#define AEU_INPUTS_ATTN_BITS_TSDM_PARITY_ERROR (1UL<<24) ++#define AEU_INPUTS_ATTN_BITS_TSEMI_HW_INTERRUPT (1UL<<29) ++#define AEU_INPUTS_ATTN_BITS_TSEMI_PARITY_ERROR (1UL<<28) ++#define AEU_INPUTS_ATTN_BITS_UCM_HW_INTERRUPT (1UL<<23) ++#define AEU_INPUTS_ATTN_BITS_UPB_HW_INTERRUPT (1UL<<27) ++#define AEU_INPUTS_ATTN_BITS_UPB_PARITY_ERROR (1UL<<26) ++#define AEU_INPUTS_ATTN_BITS_USDM_HW_INTERRUPT (1UL<<21) ++#define AEU_INPUTS_ATTN_BITS_USDM_PARITY_ERROR (1UL<<20) ++#define AEU_INPUTS_ATTN_BITS_USEMI_HW_INTERRUPT (1UL<<25) ++#define AEU_INPUTS_ATTN_BITS_USEMI_PARITY_ERROR (1UL<<24) ++#define AEU_INPUTS_ATTN_BITS_VAUX_PCI_CORE_PARITY_ERROR (1UL<<16) ++#define AEU_INPUTS_ATTN_BITS_XCM_HW_INTERRUPT (1UL<<9) ++#define AEU_INPUTS_ATTN_BITS_XSDM_HW_INTERRUPT (1UL<<7) ++#define AEU_INPUTS_ATTN_BITS_XSDM_PARITY_ERROR (1UL<<6) ++#define AEU_INPUTS_ATTN_BITS_XSEMI_HW_INTERRUPT (1UL<<11) ++#define AEU_INPUTS_ATTN_BITS_XSEMI_PARITY_ERROR (1UL<<10) + #define RESERVED_GENERAL_ATTENTION_BIT_0 0 + + #define EVEREST_GEN_ATTN_IN_USE_MASK 0x3ffe0 +@@ -5122,7 +4600,8 @@ + #define LATCHED_ATTN_SCPAD_PARITY_MCP 33 + + #define GENERAL_ATTEN_WORD(atten_name) ((94 + atten_name) / 32) +-#define GENERAL_ATTEN_OFFSET(atten_name) (1 << ((94 + atten_name) % 32)) ++#define GENERAL_ATTEN_OFFSET(atten_name)\ ++ (1UL << ((94 + atten_name) % 32)) + /* + * This file defines GRC base address for every block. + * This file is included by chipsim, asm microcode and cpp microcode. +@@ -5136,6 +4615,7 @@ + #define GRCBASE_EMAC0 0x008000 + #define GRCBASE_EMAC1 0x008400 + #define GRCBASE_DBU 0x008800 ++#define GRCBASE_PGLUE_B 0x009000 + #define GRCBASE_MISC 0x00A000 + #define GRCBASE_DBG 0x00C000 + #define GRCBASE_NIG 0x010000 +@@ -5157,6 +4637,7 @@ + #define GRCBASE_CFC 0x104000 + #define GRCBASE_HC 0x108000 + #define GRCBASE_PXP2 0x120000 ++#define GRCBASE_IGU 0x130000 + #define GRCBASE_PBF 0x140000 + #define GRCBASE_XPB 0x161000 + #define GRCBASE_TIMERS 0x164000 +@@ -5188,7 +4669,7 @@ + #define PCICFG_COMMAND_INT_DISABLE (1<<10) + #define PCICFG_COMMAND_RESERVED (0x1f<<11) + #define PCICFG_STATUS_OFFSET 0x06 +-#define PCICFG_REVESION_ID 0x08 ++#define PCICFG_REVESION_ID_OFFSET 0x08 + #define PCICFG_CACHE_LINE_SIZE 0x0c + #define PCICFG_LATENCY_TIMER 0x0d + #define PCICFG_BAR_1_LOW 0x10 +@@ -5216,9 +4697,28 @@ + #define PCICFG_PM_CSR_STATE (0x3<<0) + #define PCICFG_PM_CSR_PME_ENABLE (1<<8) + #define PCICFG_PM_CSR_PME_STATUS (1<<15) ++#define PCICFG_MSI_CAP_ID_OFFSET 0x58 ++#define PCICFG_MSI_CONTROL_ENABLE (0x1<<16) ++#define PCICFG_MSI_CONTROL_MCAP (0x7<<17) ++#define PCICFG_MSI_CONTROL_MENA (0x7<<20) ++#define PCICFG_MSI_CONTROL_64_BIT_ADDR_CAP (0x1<<23) ++#define PCICFG_MSI_CONTROL_MSI_PVMASK_CAPABLE (0x1<<24) + #define PCICFG_GRC_ADDRESS 0x78 + #define PCICFG_GRC_DATA 0x80 ++#define PCICFG_MSIX_CAP_ID_OFFSET 0xa0 ++#define PCICFG_MSIX_CONTROL_TABLE_SIZE (0x7ff<<16) ++#define PCICFG_MSIX_CONTROL_RESERVED (0x7<<27) ++#define PCICFG_MSIX_CONTROL_FUNC_MASK (0x1<<30) ++#define PCICFG_MSIX_CONTROL_MSIX_ENABLE (0x1<<31) ++ + #define PCICFG_DEVICE_CONTROL 0xb4 ++#define PCICFG_DEVICE_STATUS 0xb6 ++#define PCICFG_DEVICE_STATUS_CORR_ERR_DET (1<<0) ++#define PCICFG_DEVICE_STATUS_NON_FATAL_ERR_DET (1<<1) ++#define PCICFG_DEVICE_STATUS_FATAL_ERR_DET (1<<2) ++#define PCICFG_DEVICE_STATUS_UNSUP_REQ_DET (1<<3) ++#define PCICFG_DEVICE_STATUS_AUX_PWR_DET (1<<4) ++#define PCICFG_DEVICE_STATUS_NO_PEND (1<<5) + #define PCICFG_LINK_CONTROL 0xbc + + +@@ -5233,6 +4733,11 @@ + #define BAR_DOORBELL_OFFSET 0x800000 + + #define BAR_ME_REGISTER 0x450000 ++#define ME_REG_PF_NUM (7L<<0) /* Relative PF Num */ ++#define ME_REG_PF_NUM_SHIFT 0 ++#define ME_REG_ABS_PF_NUM (7L<<16) /* Absolute PF Num */ ++#define ME_REG_ABS_PF_NUM_SHIFT 16 ++ + + /* config_2 offset */ + #define GRC_CONFIG_2_SIZE_REG 0x408 +@@ -5279,12 +4784,12 @@ + + /* config_3 offset */ + #define GRC_CONFIG_3_SIZE_REG 0x40c +-#define PCI_CONFIG_3_STICKY_BYTE (0xffL<<0) ++#define PCI_CONFIG_3_STICKY_BYTE (0xffL<<0) + #define PCI_CONFIG_3_FORCE_PME (1L<<24) + #define PCI_CONFIG_3_PME_STATUS (1L<<25) + #define PCI_CONFIG_3_PME_ENABLE (1L<<26) + #define PCI_CONFIG_3_PM_STATE (0x3L<<27) +-#define PCI_CONFIG_3_VAUX_PRESET (1L<<30) ++#define PCI_CONFIG_3_VAUX_PRESET (1L<<30) + #define PCI_CONFIG_3_PCI_POWER (1L<<31) + + #define GRC_BAR2_CONFIG 0x4e0 +@@ -5353,6 +4858,42 @@ + + #define MDIO_REG_BANK_TX0 0x8060 + #define MDIO_TX0_TX_DRIVER 0x17 ++#define MDIO_TX0_TX_DRIVER_PREEMPHASIS_MASK 0xf000 ++#define MDIO_TX0_TX_DRIVER_PREEMPHASIS_SHIFT 12 ++#define MDIO_TX0_TX_DRIVER_IDRIVER_MASK 0x0f00 ++#define MDIO_TX0_TX_DRIVER_IDRIVER_SHIFT 8 ++#define MDIO_TX0_TX_DRIVER_IPREDRIVER_MASK 0x00f0 ++#define MDIO_TX0_TX_DRIVER_IPREDRIVER_SHIFT 4 ++#define MDIO_TX0_TX_DRIVER_IFULLSPD_MASK 0x000e ++#define MDIO_TX0_TX_DRIVER_IFULLSPD_SHIFT 1 ++#define MDIO_TX0_TX_DRIVER_ICBUF1T 1 ++ ++#define MDIO_REG_BANK_TX1 0x8070 ++#define MDIO_TX1_TX_DRIVER 0x17 ++#define MDIO_TX0_TX_DRIVER_PREEMPHASIS_MASK 0xf000 ++#define MDIO_TX0_TX_DRIVER_PREEMPHASIS_SHIFT 12 ++#define MDIO_TX0_TX_DRIVER_IDRIVER_MASK 0x0f00 ++#define MDIO_TX0_TX_DRIVER_IDRIVER_SHIFT 8 ++#define MDIO_TX0_TX_DRIVER_IPREDRIVER_MASK 0x00f0 ++#define MDIO_TX0_TX_DRIVER_IPREDRIVER_SHIFT 4 ++#define MDIO_TX0_TX_DRIVER_IFULLSPD_MASK 0x000e ++#define MDIO_TX0_TX_DRIVER_IFULLSPD_SHIFT 1 ++#define MDIO_TX0_TX_DRIVER_ICBUF1T 1 ++ ++#define MDIO_REG_BANK_TX2 0x8080 ++#define MDIO_TX2_TX_DRIVER 0x17 ++#define MDIO_TX0_TX_DRIVER_PREEMPHASIS_MASK 0xf000 ++#define MDIO_TX0_TX_DRIVER_PREEMPHASIS_SHIFT 12 ++#define MDIO_TX0_TX_DRIVER_IDRIVER_MASK 0x0f00 ++#define MDIO_TX0_TX_DRIVER_IDRIVER_SHIFT 8 ++#define MDIO_TX0_TX_DRIVER_IPREDRIVER_MASK 0x00f0 ++#define MDIO_TX0_TX_DRIVER_IPREDRIVER_SHIFT 4 ++#define MDIO_TX0_TX_DRIVER_IFULLSPD_MASK 0x000e ++#define MDIO_TX0_TX_DRIVER_IFULLSPD_SHIFT 1 ++#define MDIO_TX0_TX_DRIVER_ICBUF1T 1 ++ ++#define MDIO_REG_BANK_TX3 0x8090 ++#define MDIO_TX3_TX_DRIVER 0x17 + #define MDIO_TX0_TX_DRIVER_PREEMPHASIS_MASK 0xf000 + #define MDIO_TX0_TX_DRIVER_PREEMPHASIS_SHIFT 12 + #define MDIO_TX0_TX_DRIVER_IDRIVER_MASK 0x0f00 +@@ -5566,13 +5107,46 @@ + #define MDIO_PMA_REG_ROM_VER2 0xca1a + #define MDIO_PMA_REG_EDC_FFE_MAIN 0xca1b + #define MDIO_PMA_REG_PLL_BANDWIDTH 0xca1d ++#define MDIO_PMA_REG_PLL_CTRL 0xca1e ++#define MDIO_PMA_REG_MISC_CTRL0 0xca23 ++#define MDIO_PMA_REG_LRM_MODE 0xca3f + #define MDIO_PMA_REG_CDR_BANDWIDTH 0xca46 + #define MDIO_PMA_REG_MISC_CTRL1 0xca85 ++ ++#define MDIO_PMA_REG_SFP_TWO_WIRE_CTRL 0x8000 ++#define MDIO_PMA_REG_SFP_TWO_WIRE_CTRL_STATUS_MASK 0x000c ++#define MDIO_PMA_REG_SFP_TWO_WIRE_STATUS_IDLE 0x0000 ++#define MDIO_PMA_REG_SFP_TWO_WIRE_STATUS_COMPLETE 0x0004 ++#define MDIO_PMA_REG_SFP_TWO_WIRE_STATUS_IN_PROGRESS 0x0008 ++#define MDIO_PMA_REG_SFP_TWO_WIRE_STATUS_FAILED 0x000c ++#define MDIO_PMA_REG_SFP_TWO_WIRE_BYTE_CNT 0x8002 ++#define MDIO_PMA_REG_SFP_TWO_WIRE_MEM_ADDR 0x8003 ++#define MDIO_PMA_REG_8726_TWO_WIRE_DATA_BUF 0xc820 ++#define MDIO_PMA_REG_8726_TWO_WIRE_DATA_MASK 0xff ++#define MDIO_PMA_REG_8726_TX_CTRL1 0xca01 ++#define MDIO_PMA_REG_8726_TX_CTRL2 0xca05 ++ ++#define MDIO_PMA_REG_8727_TWO_WIRE_SLAVE_ADDR 0x8005 ++#define MDIO_PMA_REG_8727_TWO_WIRE_DATA_BUF 0x8007 ++#define MDIO_PMA_REG_8727_TWO_WIRE_DATA_MASK 0xff ++#define MDIO_PMA_REG_8727_MISC_CTRL 0x8309 ++#define MDIO_PMA_REG_8727_TX_CTRL1 0xca02 ++#define MDIO_PMA_REG_8727_TX_CTRL2 0xca05 ++#define MDIO_PMA_REG_8727_PCS_OPT_CTRL 0xc808 ++#define MDIO_PMA_REG_8727_GPIO_CTRL 0xc80e ++ ++#define MDIO_PMA_REG_8073_CHIP_REV 0xc801 ++#define MDIO_PMA_REG_8073_SPEED_LINK_STATUS 0xc820 ++#define MDIO_PMA_REG_8073_XAUI_WA 0xc841 + + #define MDIO_PMA_REG_7101_RESET 0xc000 + #define MDIO_PMA_REG_7107_LED_CNTL 0xc007 + #define MDIO_PMA_REG_7101_VER1 0xc026 + #define MDIO_PMA_REG_7101_VER2 0xc027 ++ ++#define MDIO_PMA_REG_8481_PMD_SIGNAL 0xa811 ++#define MDIO_PMA_REG_8481_SIGNAL_MASK 0xa835 ++#define MDIO_PMA_REG_8481_LINK_SIGNAL 0xa83b + + + #define MDIO_WIS_DEVAD 0x2 +@@ -5597,6 +5171,12 @@ + #define MDIO_XS_DEVAD 0x4 + #define MDIO_XS_PLL_SEQUENCER 0x8000 + #define MDIO_XS_SFX7101_XGXS_TEST1 0xc00a ++ ++#define MDIO_XS_8706_REG_BANK_RX0 0x80bc ++#define MDIO_XS_8706_REG_BANK_RX1 0x80cc ++#define MDIO_XS_8706_REG_BANK_RX2 0x80dc ++#define MDIO_XS_8706_REG_BANK_RX3 0x80ec ++#define MDIO_XS_8706_REG_BANK_RXA 0x80fc + + #define MDIO_AN_DEVAD 0x7 + /*ieee*/ +@@ -5619,6 +5199,14 @@ + #define MDIO_AN_REG_CL37_FC_LD 0xffe4 + #define MDIO_AN_REG_CL37_FC_LP 0xffe5 + ++#define MDIO_AN_REG_8073_2_5G 0x8329 ++ ++#define MDIO_AN_REG_8481_LEGACY_MII_CTRL 0xffe0 ++#define MDIO_AN_REG_8481_LEGACY_AN_ADV 0xffe4 ++#define MDIO_AN_REG_8481_1000T_CTRL 0xffe9 ++#define MDIO_AN_REG_8481_EXPANSION_REG_RD_RW 0xfff5 ++#define MDIO_AN_REG_8481_EXPANSION_REG_ACCESS 0xfff7 ++#define MDIO_AN_REG_8481_LEGACY_SHADOW 0xfffc + + #define IGU_FUNC_BASE 0x0400 + +@@ -5651,3 +5239,114 @@ + #define COMMAND_REG_SIMD_NOMASK 0x1c + + ++#define IGU_MEM_BASE 0x0000 ++ ++#define IGU_MEM_MSIX_BASE 0x0000 ++#define IGU_MEM_MSIX_UPPER 0x007f ++#define IGU_MEM_MSIX_RESERVED_UPPER 0x01ff ++ ++#define IGU_MEM_PBA_MSIX_BASE 0x0200 ++#define IGU_MEM_PBA_MSIX_UPPER 0x0200 ++ ++#define IGU_CMD_BACKWARD_COMP_PROD_UPD 0x0201 ++#define IGU_MEM_PBA_MSIX_RESERVED_UPPER 0x03ff ++ ++#define IGU_CMD_INT_ACK_BASE 0x0400 ++#define IGU_CMD_INT_ACK_UPPER\ ++ (IGU_CMD_INT_ACK_BASE + MAX_SB_PER_PORT * NUM_OF_PORTS_PER_PATH - 1) ++#define IGU_CMD_INT_ACK_RESERVED_UPPER 0x04ff ++ ++#define IGU_CMD_E2_PROD_UPD_BASE 0x0500 ++#define IGU_CMD_E2_PROD_UPD_UPPER\ ++ (IGU_CMD_E2_PROD_UPD_BASE + MAX_SB_PER_PORT * NUM_OF_PORTS_PER_PATH - 1) ++#define IGU_CMD_E2_PROD_UPD_RESERVED_UPPER 0x059f ++ ++#define IGU_CMD_ATTN_BIT_UPD_UPPER 0x05a0 ++#define IGU_CMD_ATTN_BIT_SET_UPPER 0x05a1 ++#define IGU_CMD_ATTN_BIT_CLR_UPPER 0x05a2 ++ ++#define IGU_REG_SISR_MDPC_WMASK_UPPER 0x05a3 ++#define IGU_REG_SISR_MDPC_WMASK_LSB_UPPER 0x05a4 ++#define IGU_REG_SISR_MDPC_WMASK_MSB_UPPER 0x05a5 ++#define IGU_REG_SISR_MDPC_WOMASK_UPPER 0x05a6 ++ ++#define IGU_REG_RESERVED_UPPER 0x05ff ++ ++ ++#define CDU_REGION_NUMBER_XCM_AG 2 ++#define CDU_REGION_NUMBER_UCM_AG 4 ++ ++ ++/** ++ * String-to-compress [31:8] = CID (all 24 bits) ++ * String-to-compress [7:4] = Region ++ * String-to-compress [3:0] = Type ++ */ ++#define CDU_VALID_DATA(_cid, _region, _type)\ ++ (((_cid) << 8) | (((_region)&0xf)<<4) | (((_type)&0xf))) ++#define CDU_CRC8(_cid, _region, _type)\ ++ (calc_crc8(CDU_VALID_DATA(_cid, _region, _type), 0xff)) ++#define CDU_RSRVD_VALUE_TYPE_A(_cid, _region, _type)\ ++ (0x80 | ((CDU_CRC8(_cid, _region, _type)) & 0x7f)) ++#define CDU_RSRVD_VALUE_TYPE_B(_crc, _type)\ ++ (0x80 | ((_type)&0xf << 3) | ((CDU_CRC8(_cid, _region, _type)) & 0x7)) ++#define CDU_RSRVD_INVALIDATE_CONTEXT_VALUE(_val) ((_val) & ~0x80) ++ ++/****************************************************************************** ++ * Description: ++ * Calculates crc 8 on a word value: polynomial 0-1-2-8 ++ * Code was translated from Verilog. ++ * Return: ++ *****************************************************************************/ ++static inline u8 calc_crc8(u32 data, u8 crc) ++{ ++ u8 D[32]; ++ u8 NewCRC[8]; ++ u8 C[8]; ++ u8 crc_res; ++ u8 i; ++ ++ /* split the data into 31 bits */ ++ for (i = 0; i < 32; i++) { ++ D[i] = (u8)(data & 1); ++ data = data >> 1; ++ } ++ ++ /* split the crc into 8 bits */ ++ for (i = 0; i < 8; i++ ) { ++ C[i] = crc & 1; ++ crc = crc >> 1; ++ } ++ ++ NewCRC[0] = D[31] ^ D[30] ^ D[28] ^ D[23] ^ D[21] ^ D[19] ^ D[18] ^ ++ D[16] ^ D[14] ^ D[12] ^ D[8] ^ D[7] ^ D[6] ^ D[0] ^ C[4] ^ ++ C[6] ^ C[7]; ++ NewCRC[1] = D[30] ^ D[29] ^ D[28] ^ D[24] ^ D[23] ^ D[22] ^ D[21] ^ ++ D[20] ^ D[18] ^ D[17] ^ D[16] ^ D[15] ^ D[14] ^ D[13] ^ ++ D[12] ^ D[9] ^ D[6] ^ D[1] ^ D[0] ^ C[0] ^ C[4] ^ C[5] ^ C[6]; ++ NewCRC[2] = D[29] ^ D[28] ^ D[25] ^ D[24] ^ D[22] ^ D[17] ^ D[15] ^ ++ D[13] ^ D[12] ^ D[10] ^ D[8] ^ D[6] ^ D[2] ^ D[1] ^ D[0] ^ ++ C[0] ^ C[1] ^ C[4] ^ C[5]; ++ NewCRC[3] = D[30] ^ D[29] ^ D[26] ^ D[25] ^ D[23] ^ D[18] ^ D[16] ^ ++ D[14] ^ D[13] ^ D[11] ^ D[9] ^ D[7] ^ D[3] ^ D[2] ^ D[1] ^ ++ C[1] ^ C[2] ^ C[5] ^ C[6]; ++ NewCRC[4] = D[31] ^ D[30] ^ D[27] ^ D[26] ^ D[24] ^ D[19] ^ D[17] ^ ++ D[15] ^ D[14] ^ D[12] ^ D[10] ^ D[8] ^ D[4] ^ D[3] ^ D[2] ^ ++ C[0] ^ C[2] ^ C[3] ^ C[6] ^ C[7]; ++ NewCRC[5] = D[31] ^ D[28] ^ D[27] ^ D[25] ^ D[20] ^ D[18] ^ D[16] ^ ++ D[15] ^ D[13] ^ D[11] ^ D[9] ^ D[5] ^ D[4] ^ D[3] ^ C[1] ^ ++ C[3] ^ C[4] ^ C[7]; ++ NewCRC[6] = D[29] ^ D[28] ^ D[26] ^ D[21] ^ D[19] ^ D[17] ^ D[16] ^ ++ D[14] ^ D[12] ^ D[10] ^ D[6] ^ D[5] ^ D[4] ^ C[2] ^ C[4] ^ C[5]; ++ NewCRC[7] = D[30] ^ D[29] ^ D[27] ^ D[22] ^ D[20] ^ D[18] ^ D[17] ^ ++ D[15] ^ D[13] ^ D[11] ^ D[7] ^ D[6] ^ D[5] ^ C[3] ^ C[5] ^ C[6]; ++ ++ crc_res = 0; ++ for (i = 0; i < 8; i++) { ++ crc_res |= (NewCRC[i] << i); ++ } ++ ++ return crc_res; ++} ++ ++ +diff -r ddb96c0bbe13 drivers/net/bnx2x_self_test.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/bnx2x_self_test.h Tue Jun 16 13:15:30 2009 +0100 +@@ -0,0 +1,1004 @@ ++/* bnx2x_self_test.h: Broadcom Everest network driver. ++ * ++ * Copyright (c) 2007-2009 Broadcom Corporation ++ * ++ * 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. ++ * ++ * Maintained by: Eilon Greenstein ++ * Written by: Yitchak Gertner ++ */ ++ ++/* self test */ ++ ++static int idle_chk_errors; ++static int idle_chk_warnings; ++ ++ ++#define IDLE_CHK_E1 0x1 ++#define IDLE_CHK_E1H 0x2 ++ ++#define IDLE_CHK_ERROR 1 ++#define IDLE_CHK_ERROR_NO_TRAFFIC 2 ++#define IDLE_CHK_WARNING 3 ++ ++ ++#define CHIP_MASK_CHK(chip_mask) \ ++ (((((chip_mask) & IDLE_CHK_E1) && is_e1) || \ ++ (((chip_mask) & IDLE_CHK_E1H) && is_e1h)) ? 1 : 0) ++ ++#define CONDITION_CHK(condition, severity, fail_msg, arg_list...) \ ++ do { \ ++ if (condition) { \ ++ switch (severity) { \ ++ case IDLE_CHK_ERROR: \ ++ BNX2X_DBG_ERR("ERROR " fail_msg, ##arg_list); \ ++ idle_chk_errors++; \ ++ break; \ ++ case IDLE_CHK_ERROR_NO_TRAFFIC: \ ++ BNX2X_DBG_ERR("INFO " fail_msg, ##arg_list); \ ++ break; \ ++ case IDLE_CHK_WARNING: \ ++ BNX2X_DBG_ERR("WARNING " fail_msg, \ ++ ##arg_list); \ ++ idle_chk_warnings++; \ ++ break; \ ++ } \ ++ } \ ++ } while (0); ++ ++ ++static void bnx2x_idle_chk6(struct bnx2x *bp, u32 chip_mask, u32 offset, ++ int loop, int inc, int severity) ++{ ++ int is_e1 = CHIP_IS_E1(bp); ++ int is_e1h = CHIP_IS_E1H(bp); ++ int i; ++ u32 val1, val2; ++ u32 rd_ptr, wr_ptr, rd_bank, wr_bank; ++ ++ if (!CHIP_MASK_CHK(chip_mask)) ++ return; ++ ++ for (i = 0; i < loop; i++) { ++ val1 = REG_RD(bp, offset + i*inc); ++ val2 = REG_RD(bp, offset + i*inc + 4); ++ rd_ptr = ((val1 & 0x3FFFFFC0) >> 6); ++ wr_ptr = ((((val1 & 0xC0000000) >> 30) & 0x3) | ++ ((val2 & 0x3FFFFF) << 2)); ++ CONDITION_CHK((rd_ptr != wr_ptr), severity, ++ "QM: PTRTBL entry %d - rd_ptr is not" ++ " equal to wr_ptr. Values are 0x%x 0x%x\n", ++ i, rd_ptr, wr_ptr); ++ rd_bank = ((val1 & 0x30) >> 4); ++ wr_bank = (val1 & 0x03); ++ CONDITION_CHK((rd_bank != wr_bank), severity, ++ "QM: PTRTBL entry %d - rd_bank is not" ++ " equal to wr_bank. Values are 0x%x 0x%x\n", ++ i, rd_bank, wr_bank); ++ } ++} ++ ++static int bnx2x_idle_chk(struct bnx2x *bp) ++{ ++ ++/* read one reg and check the condition */ ++#define IDLE_CHK_1(chip_mask, offset, condition, severity, fail_msg) \ ++ do { \ ++ if (CHIP_MASK_CHK(chip_mask)) { \ ++ val = REG_RD(bp, offset); \ ++ CONDITION_CHK(condition, severity, \ ++ fail_msg ". Value is 0x%x\n", val); \ ++ } \ ++ } while (0); ++ ++/* loop to read one reg and check the condition */ ++#define IDLE_CHK_2(chip_mask, offset, loop, inc, condition, severity, \ ++ fail_msg) \ ++ do { \ ++ if (CHIP_MASK_CHK(chip_mask)) \ ++ for (i = 0; i < (loop); i++) { \ ++ val = REG_RD(bp, offset + i*(inc)); \ ++ CONDITION_CHK(condition, severity, \ ++ fail_msg ". Value is 0x%x\n", \ ++ i, val); \ ++ } \ ++ } while (0); ++ ++/* read two regs and check the condition */ ++#define IDLE_CHK_3(chip_mask, offset1, offset2, condition, severity, \ ++ fail_msg) \ ++ do { \ ++ if (CHIP_MASK_CHK(chip_mask)) { \ ++ val1 = REG_RD(bp, offset1); \ ++ val2 = REG_RD(bp, offset2); \ ++ CONDITION_CHK(condition, severity, \ ++ fail_msg ". Values are 0x%x 0x%x\n", \ ++ val1, val2); \ ++ } \ ++ } while (0); ++ ++/* loop to read two regs and check the condition */ ++#define IDLE_CHK_4(chip_mask, offset1, offset2, loop, inc, condition, \ ++ severity, fail_msg) \ ++ do { \ ++ if (CHIP_MASK_CHK(chip_mask)) \ ++ for (i = 0; i < (loop); i++) { \ ++ val1 = REG_RD(bp, offset1 + i*(inc)); \ ++ val2 = (REG_RD(bp, offset2 + i*(inc)) >> 1); \ ++ CONDITION_CHK(condition, severity, fail_msg \ ++ " - LCID %d CID_CAM 0x%x" \ ++ " Value is 0x%x\n", \ ++ i, val2, val1); \ ++ } \ ++ } while (0); ++ ++/* read one reg and check according to another reg */ ++#define IDLE_CHK_5(chip_mask, offset, offset1, offset2, condition, severity, \ ++ fail_msg) \ ++ do { \ ++ if (CHIP_MASK_CHK(chip_mask)) \ ++ if (!REG_RD(bp, offset)) \ ++ IDLE_CHK_3(chip_mask, offset1, offset2, \ ++ condition, severity, fail_msg); \ ++ } while (0); ++ ++/* read wide-bus reg and check sub-fields */ ++#define IDLE_CHK_6(chip_mask, offset, loop, inc, severity) \ ++ bnx2x_idle_chk6(bp, chip_mask, offset, loop, inc, severity) ++ ++/* loop to read wide-bus reg and check according to another reg */ ++#define IDLE_CHK_7(chip_mask, offset, offset1, offset2, loop, inc, condition, \ ++ severity, fail_msg) \ ++ do { \ ++ if (CHIP_MASK_CHK(chip_mask)) \ ++ for (i = 0; i < (loop); i++) { \ ++ if (REG_RD(bp, offset + i*4) == 1) { \ ++ val1 = REG_RD(bp, offset1 + i*(inc)); \ ++ val1 = REG_RD(bp, offset1 + i*(inc) + \ ++ 4); \ ++ val1 = ((REG_RD(bp, offset1 + i*(inc) \ ++ + 8) & 0x00000078) >> 3); \ ++ val2 = (REG_RD(bp, offset2 + i*4)>>1); \ ++ CONDITION_CHK(condition, severity, \ ++ fail_msg " - LCID %d " \ ++ "CID_CAM 0x%x" \ ++ " Value is 0x%x\n", \ ++ i, val2, val1); \ ++ } \ ++ } \ ++ } while (0); ++ ++ ++ int is_e1 = CHIP_IS_E1(bp); ++ int is_e1h = CHIP_IS_E1H(bp); ++ int i; ++ u32 val, val1, val2; ++ ++ idle_chk_errors = 0; ++ idle_chk_warnings = 0; ++ ++ if (!netif_running(bp->dev)) ++ return idle_chk_errors; ++ ++ IDLE_CHK_1(0x7, 0x2114, ((val & 0x0ff010) != 0), IDLE_CHK_ERROR, ++ "PCIE: ucorr_err_status is not 0"); ++ IDLE_CHK_1(0x7, 0x2114, ((val & 0x100000) != 0), IDLE_CHK_WARNING, ++ "PCIE: ucorr_err_status - Unsupported request error"); ++ IDLE_CHK_1(0x7, 0x2120, ++ (((val & 0x31c1) != 0x2000) && ((val & 0x31c1) != 0)), ++ IDLE_CHK_WARNING, "PCIE: corr_err_status is not 0x2000"); ++ IDLE_CHK_1(0x7, 0x2814, ((val & ~0x40100) != 0), IDLE_CHK_ERROR, ++ "PCIE: attentions register is not 0x40100"); ++ IDLE_CHK_1(0x6, 0x281c, ((val & ~0x40040100) != 0), IDLE_CHK_ERROR, ++ "PCIE: attentions register is not 0x40040100"); ++ IDLE_CHK_1(0x6, 0x2820, ((val & ~0x40040100) != 0), IDLE_CHK_ERROR, ++ "PCIE: attentions register is not 0x40040100"); ++ IDLE_CHK_1(0x1, PXP2_REG_PGL_EXP_ROM2, (val != 0xffffffff), ++ IDLE_CHK_WARNING, ++ "PXP2: There are outstanding read requests. Not all" ++ " completions have arrived for read requests on tags that" ++ " are marked with 0"); ++ IDLE_CHK_2(0x7, 0x212c, 4, 4, ((val != 0) && (idle_chk_errors > 0)), ++ IDLE_CHK_WARNING, "PCIE: error packet header %d is not 0"); ++ ++ IDLE_CHK_1(0x7, PXP2_REG_RQ_VQ0_ENTRY_CNT, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, "PXP2: VQ0 is not empty"); ++ IDLE_CHK_1(0x7, PXP2_REG_RQ_VQ1_ENTRY_CNT, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, "PXP2: VQ1 is not empty"); ++ IDLE_CHK_1(0x7, PXP2_REG_RQ_VQ2_ENTRY_CNT, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, "PXP2: VQ2 is not empty"); ++ IDLE_CHK_1(0x7, PXP2_REG_RQ_VQ3_ENTRY_CNT, (val > 2), ++ IDLE_CHK_ERROR_NO_TRAFFIC, "PXP2: VQ3 is not empty"); ++ IDLE_CHK_1(0x7, PXP2_REG_RQ_VQ4_ENTRY_CNT, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, "PXP2: VQ4 is not empty"); ++ IDLE_CHK_1(0x7, PXP2_REG_RQ_VQ5_ENTRY_CNT, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, "PXP2: VQ5 is not empty"); ++ IDLE_CHK_1(0x7, PXP2_REG_RQ_VQ6_ENTRY_CNT, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, "PXP2: VQ6 is not empty"); ++ IDLE_CHK_1(0x7, PXP2_REG_RQ_VQ7_ENTRY_CNT, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, "PXP2: VQ7 is not empty"); ++ IDLE_CHK_1(0x7, PXP2_REG_RQ_VQ8_ENTRY_CNT, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, "PXP2: VQ8 is not empty"); ++ IDLE_CHK_1(0x7, PXP2_REG_RQ_VQ9_ENTRY_CNT, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, "PXP2: VQ9 is not empty"); ++ IDLE_CHK_1(0x7, PXP2_REG_RQ_VQ10_ENTRY_CNT, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, "PXP2: VQ10 is not empty"); ++ IDLE_CHK_1(0x7, PXP2_REG_RQ_VQ11_ENTRY_CNT, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, "PXP2: VQ11 is not empty"); ++ IDLE_CHK_1(0x7, PXP2_REG_RQ_VQ12_ENTRY_CNT, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, "PXP2: VQ12 is not empty"); ++ IDLE_CHK_1(0x7, PXP2_REG_RQ_VQ13_ENTRY_CNT, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, "PXP2: VQ13 is not empty"); ++ IDLE_CHK_1(0x7, PXP2_REG_RQ_VQ14_ENTRY_CNT, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, "PXP2: VQ14 is not empty"); ++ IDLE_CHK_1(0x7, PXP2_REG_RQ_VQ15_ENTRY_CNT, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, "PXP2: VQ15 is not empty"); ++ IDLE_CHK_1(0x7, PXP2_REG_RQ_VQ16_ENTRY_CNT, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, "PXP2: VQ16 is not empty"); ++ IDLE_CHK_1(0x7, PXP2_REG_RQ_VQ17_ENTRY_CNT, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, "PXP2: VQ17 is not empty"); ++ IDLE_CHK_1(0x7, PXP2_REG_RQ_VQ18_ENTRY_CNT, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, "PXP2: VQ18 is not empty"); ++ IDLE_CHK_1(0x7, PXP2_REG_RQ_VQ19_ENTRY_CNT, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, "PXP2: VQ19 is not empty"); ++ IDLE_CHK_1(0x7, PXP2_REG_RQ_VQ20_ENTRY_CNT, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, "PXP2: VQ20 is not empty"); ++ IDLE_CHK_1(0x7, PXP2_REG_RQ_VQ21_ENTRY_CNT, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, "PXP2: VQ21 is not empty"); ++ IDLE_CHK_1(0x7, PXP2_REG_RQ_VQ22_ENTRY_CNT, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, "PXP2: VQ22 is not empty"); ++ IDLE_CHK_1(0x7, PXP2_REG_RQ_VQ23_ENTRY_CNT, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, "PXP2: VQ23 is not empty"); ++ IDLE_CHK_1(0x7, PXP2_REG_RQ_VQ24_ENTRY_CNT, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, "PXP2: VQ24 is not empty"); ++ IDLE_CHK_1(0x7, PXP2_REG_RQ_VQ25_ENTRY_CNT, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, "PXP2: VQ25 is not empty"); ++ IDLE_CHK_1(0x7, PXP2_REG_RQ_VQ26_ENTRY_CNT, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, "PXP2: VQ26 is not empty"); ++ IDLE_CHK_1(0x7, PXP2_REG_RQ_VQ27_ENTRY_CNT, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, "PXP2: VQ27 is not empty"); ++ IDLE_CHK_1(0x7, PXP2_REG_RQ_VQ28_ENTRY_CNT, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, "PXP2: VQ28 is not empty"); ++ IDLE_CHK_1(0x7, PXP2_REG_RQ_VQ29_ENTRY_CNT, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, "PXP2: VQ29 is not empty"); ++ IDLE_CHK_1(0x7, PXP2_REG_RQ_VQ30_ENTRY_CNT, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, "PXP2: VQ30 is not empty"); ++ IDLE_CHK_1(0x7, PXP2_REG_RQ_VQ31_ENTRY_CNT, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, "PXP2: VQ31 is not empty"); ++ ++ IDLE_CHK_1(0x7, PXP2_REG_RQ_UFIFO_NUM_OF_ENTRY, (val != 0), ++ IDLE_CHK_ERROR, "PXP2: rq_ufifo_num_of_entry is not 0"); ++ IDLE_CHK_1(0x7, PXP2_REG_RQ_RBC_DONE, (val != 1), IDLE_CHK_ERROR, ++ "PXP2: rq_rbc_done is not 1"); ++ IDLE_CHK_1(0x7, PXP2_REG_RQ_CFG_DONE, (val != 1), IDLE_CHK_ERROR, ++ "PXP2: rq_cfg_done is not 1"); ++ IDLE_CHK_1(0x7, PXP2_REG_PSWRQ_BW_CREDIT, (val != 0x1b), ++ IDLE_CHK_ERROR, ++ "PXP2: rq_read_credit and rq_write_credit are not 3"); ++ IDLE_CHK_1(0x7, PXP2_REG_RD_START_INIT, (val != 1), IDLE_CHK_ERROR, ++ "PXP2: rd_start_init is not 1"); ++ IDLE_CHK_1(0x7, PXP2_REG_RD_INIT_DONE, (val != 1), IDLE_CHK_ERROR, ++ "PXP2: rd_init_done is not 1"); ++ ++ IDLE_CHK_3(0x7, PXP2_REG_RD_SR_CNT, PXP2_REG_RD_SR_NUM_CFG, ++ (val1 != (val2-1)), IDLE_CHK_WARNING, ++ "PXP2: rd_sr_cnt is not equal to rd_sr_num_cfg"); ++ IDLE_CHK_3(0x7, PXP2_REG_RD_BLK_CNT, PXP2_REG_RD_BLK_NUM_CFG, ++ (val1 != val2), IDLE_CHK_WARNING, ++ "PXP2: rd_blk_cnt is not equal to rd_blk_num_cfg"); ++ ++ IDLE_CHK_3(0x7, PXP2_REG_RD_SR_CNT, PXP2_REG_RD_SR_NUM_CFG, ++ (val1 < (val2-3)), IDLE_CHK_ERROR_NO_TRAFFIC, ++ "PXP2: There are more than two unused SRs"); ++ IDLE_CHK_3(0x7, PXP2_REG_RD_BLK_CNT, PXP2_REG_RD_BLK_NUM_CFG, ++ (val1 < (val2-2)), IDLE_CHK_ERROR_NO_TRAFFIC, ++ "PXP2: There are more than two unused blocks"); ++ ++ IDLE_CHK_1(0x7, PXP2_REG_RD_PORT_IS_IDLE_0, (val != 1), ++ IDLE_CHK_ERROR_NO_TRAFFIC, ++ "PXP2: P0 All delivery ports are not idle"); ++ IDLE_CHK_1(0x7, PXP2_REG_RD_PORT_IS_IDLE_1, (val != 1), ++ IDLE_CHK_ERROR_NO_TRAFFIC, ++ "PXP2: P1 All delivery ports are not idle"); ++ ++ IDLE_CHK_2(0x7, PXP2_REG_RD_ALMOST_FULL_0, 11, 4, (val != 0), ++ IDLE_CHK_ERROR, "PXP2: rd_almost_full_%d is not 0"); ++ ++ IDLE_CHK_1(0x7, PXP2_REG_RD_DISABLE_INPUTS, (val != 0), ++ IDLE_CHK_ERROR, "PXP2: PSWRD inputs are disabled"); ++ IDLE_CHK_1(0x7, PXP2_REG_HST_HEADER_FIFO_STATUS, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, ++ "PXP2: HST header FIFO status is not 0"); ++ IDLE_CHK_1(0x7, PXP2_REG_HST_DATA_FIFO_STATUS, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, ++ "PXP2: HST data FIFO status is not 0"); ++ IDLE_CHK_1(0x7, PXP2_REG_PGL_WRITE_BLOCKED, (val != 0), ++ IDLE_CHK_ERROR, "PXP2: pgl_write_blocked is not 0"); ++ IDLE_CHK_1(0x7, PXP2_REG_PGL_READ_BLOCKED, (val != 0), IDLE_CHK_ERROR, ++ "PXP2: pgl_read_blocked is not 0"); ++ IDLE_CHK_1(0x7, PXP2_REG_PGL_TXW_CDTS, (((val >> 17) & 1) != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, ++ "PXP2: There is data which is ready"); ++ ++ IDLE_CHK_1(0x7, PXP_REG_HST_ARB_IS_IDLE, (val != 1), IDLE_CHK_WARNING, ++ "PXP: HST arbiter is not idle"); ++ IDLE_CHK_1(0x7, PXP_REG_HST_CLIENTS_WAITING_TO_ARB, (val != 0), ++ IDLE_CHK_WARNING, ++ "PXP: HST one of the clients is waiting for delivery"); ++ IDLE_CHK_1(0x6, PXP_REG_HST_DISCARD_INTERNAL_WRITES_STATUS, ++ (val != 0), IDLE_CHK_WARNING, ++ "PXP: HST Close the gates: Discarding internal writes"); ++ IDLE_CHK_1(0x6, PXP_REG_HST_DISCARD_DOORBELLS_STATUS, (val != 0), ++ IDLE_CHK_WARNING, ++ "PXP: HST Close the gates: Discarding doorbells"); ++ ++ IDLE_CHK_1(0x7, DMAE_REG_GO_C0, (val != 0), IDLE_CHK_ERROR_NO_TRAFFIC, ++ "DMAE: command 0 go is not 0"); ++ IDLE_CHK_1(0x7, DMAE_REG_GO_C1, (val != 0), IDLE_CHK_ERROR_NO_TRAFFIC, ++ "DMAE: command 1 go is not 0"); ++ IDLE_CHK_1(0x7, DMAE_REG_GO_C2, (val != 0), IDLE_CHK_ERROR_NO_TRAFFIC, ++ "DMAE: command 2 go is not 0"); ++ IDLE_CHK_1(0x7, DMAE_REG_GO_C3, (val != 0), IDLE_CHK_ERROR_NO_TRAFFIC, ++ "DMAE: command 3 go is not 0"); ++ IDLE_CHK_1(0x7, DMAE_REG_GO_C4, (val != 0), IDLE_CHK_ERROR_NO_TRAFFIC, ++ "DMAE: command 4 go is not 0"); ++ IDLE_CHK_1(0x7, DMAE_REG_GO_C5, (val != 0), IDLE_CHK_ERROR_NO_TRAFFIC, ++ "DMAE: command 5 go is not 0"); ++ IDLE_CHK_1(0x7, DMAE_REG_GO_C6, (val != 0), IDLE_CHK_ERROR_NO_TRAFFIC, ++ "DMAE: command 6 go is not 0"); ++ IDLE_CHK_1(0x7, DMAE_REG_GO_C7, (val != 0), IDLE_CHK_ERROR_NO_TRAFFIC, ++ "DMAE: command 7 go is not 0"); ++ IDLE_CHK_1(0x7, DMAE_REG_GO_C8, (val != 0), IDLE_CHK_ERROR_NO_TRAFFIC, ++ "DMAE: command 8 go is not 0"); ++ IDLE_CHK_1(0x7, DMAE_REG_GO_C9, (val != 0), IDLE_CHK_ERROR_NO_TRAFFIC, ++ "DMAE: command 9 go is not 0"); ++ IDLE_CHK_1(0x7, DMAE_REG_GO_C10, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, "DMAE: command 10 go is not 0"); ++ IDLE_CHK_1(0x7, DMAE_REG_GO_C11, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, "DMAE: command 11 go is not 0"); ++ IDLE_CHK_1(0x7, DMAE_REG_GO_C12, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, "DMAE: command 12 go is not 0"); ++ IDLE_CHK_1(0x7, DMAE_REG_GO_C13, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, "DMAE: command 13 go is not 0"); ++ IDLE_CHK_1(0x7, DMAE_REG_GO_C14, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, "DMAE: command 14 go is not 0"); ++ IDLE_CHK_1(0x7, DMAE_REG_GO_C15, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, "DMAE: command 15 go is not 0"); ++ ++ IDLE_CHK_1(0x7, CFC_REG_ERROR_VECTOR, (val != 0), IDLE_CHK_ERROR, ++ "CFC: error vector is not 0"); ++ IDLE_CHK_1(0x7, CFC_REG_NUM_LCIDS_ARRIVING, (val != 0), ++ IDLE_CHK_ERROR, "CFC: number of arriving LCIDs is not 0"); ++ IDLE_CHK_1(0x7, CFC_REG_NUM_LCIDS_ALLOC, (val != 0), IDLE_CHK_ERROR, ++ "CFC: number of alloc LCIDs is not 0"); ++ IDLE_CHK_1(0x7, CFC_REG_NUM_LCIDS_LEAVING, (val != 0), IDLE_CHK_ERROR, ++ "CFC: number of leaving LCIDs is not 0"); ++ ++ IDLE_CHK_4(0x7, CFC_REG_ACTIVITY_COUNTER, CFC_REG_CID_CAM, ++ (CFC_REG_ACTIVITY_COUNTER_SIZE >> 2), 4, (val1 > 1), ++ IDLE_CHK_ERROR_NO_TRAFFIC, "CFC: AC > 1"); ++ IDLE_CHK_7(0x7, CFC_REG_ACTIVITY_COUNTER, CFC_REG_INFO_RAM, ++ CFC_REG_CID_CAM, (CFC_REG_INFO_RAM_SIZE >> 4), 16, ++ (val1 == 3), IDLE_CHK_WARNING, ++ "CFC: AC is 1, connType is 3"); ++ IDLE_CHK_7(0x7, CFC_REG_ACTIVITY_COUNTER, CFC_REG_INFO_RAM, ++ CFC_REG_CID_CAM, (CFC_REG_INFO_RAM_SIZE >> 4), 16, ++ ((val1 != 0) && (val1 != 3)), IDLE_CHK_ERROR, ++ "CFC: AC is 1, connType is not 0 nor 3"); ++ ++ IDLE_CHK_2(0x7, QM_REG_QTASKCTR_0, 64, 4, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, "QM: Q_%d, queue is not empty"); ++ ++ IDLE_CHK_3(0x7, QM_REG_VOQCREDIT_0, QM_REG_VOQINITCREDIT_0, ++ (val1 != val2), IDLE_CHK_ERROR_NO_TRAFFIC, ++ "QM: VOQ_0, VOQ credit is not equal to initial credit"); ++ IDLE_CHK_3(0x7, QM_REG_VOQCREDIT_1, QM_REG_VOQINITCREDIT_1, ++ (val1 != val2), IDLE_CHK_ERROR_NO_TRAFFIC, ++ "QM: VOQ_1, VOQ credit is not equal to initial credit"); ++ IDLE_CHK_3(0x7, QM_REG_VOQCREDIT_4, QM_REG_VOQINITCREDIT_4, ++ (val1 != val2), IDLE_CHK_ERROR, ++ "QM: VOQ_4, VOQ credit is not equal to initial credit"); ++ ++ IDLE_CHK_3(0x3, QM_REG_PORT0BYTECRD, QM_REG_BYTECRDINITVAL, ++ (val1 != val2), IDLE_CHK_ERROR_NO_TRAFFIC, ++ "QM: P0 Byte credit is not equal to initial credit"); ++ IDLE_CHK_3(0x3, QM_REG_PORT1BYTECRD, QM_REG_BYTECRDINITVAL, ++ (val1 != val2), IDLE_CHK_ERROR_NO_TRAFFIC, ++ "QM: P1 Byte credit is not equal to initial credit"); ++ ++ IDLE_CHK_1(0x7, CCM_REG_CAM_OCCUP, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, ++ "CCM: XX protection CAM is not empty"); ++ IDLE_CHK_1(0x7, TCM_REG_CAM_OCCUP, (val != 0), IDLE_CHK_ERROR, ++ "TCM: XX protection CAM is not empty"); ++ IDLE_CHK_1(0x7, UCM_REG_CAM_OCCUP, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, ++ "UCM: XX protection CAM is not empty"); ++ IDLE_CHK_1(0x7, XCM_REG_CAM_OCCUP, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, ++ "XCM: XX protection CAM is not empty"); ++ ++ IDLE_CHK_1(0x7, BRB1_REG_NUM_OF_FULL_BLOCKS, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, "BRB1: BRB is not empty"); ++ ++ IDLE_CHK_1(0x7, CSEM_REG_SLEEP_THREADS_VALID, (val != 0), ++ IDLE_CHK_ERROR, "CSEM: There are sleeping threads"); ++ IDLE_CHK_1(0x7, TSEM_REG_SLEEP_THREADS_VALID, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, ++ "TSEM: There are sleeping threads"); ++ IDLE_CHK_1(0x7, USEM_REG_SLEEP_THREADS_VALID, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, ++ "USEM: There are sleeping threads"); ++ IDLE_CHK_1(0x7, XSEM_REG_SLEEP_THREADS_VALID, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, ++ "XSEM: There are sleeping threads"); ++ ++ IDLE_CHK_1(0x7, CSEM_REG_SLOW_EXT_STORE_EMPTY, (val != 1), ++ IDLE_CHK_ERROR, "CSEM: External store FIFO is not empty"); ++ IDLE_CHK_1(0x7, TSEM_REG_SLOW_EXT_STORE_EMPTY, (val != 1), ++ IDLE_CHK_ERROR_NO_TRAFFIC, ++ "TSEM: External store FIFO is not empty"); ++ IDLE_CHK_1(0x7, USEM_REG_SLOW_EXT_STORE_EMPTY, (val != 1), ++ IDLE_CHK_ERROR_NO_TRAFFIC, ++ "USEM: External store FIFO is not empty"); ++ IDLE_CHK_1(0x7, XSEM_REG_SLOW_EXT_STORE_EMPTY, (val != 1), ++ IDLE_CHK_ERROR_NO_TRAFFIC, ++ "XSEM: External store FIFO is not empty"); ++ ++ IDLE_CHK_1(0x7, CSDM_REG_SYNC_PARSER_EMPTY, (val != 1), ++ IDLE_CHK_ERROR, "CSDM: Parser serial FIFO is not empty"); ++ IDLE_CHK_1(0x7, TSDM_REG_SYNC_PARSER_EMPTY, (val != 1), ++ IDLE_CHK_ERROR_NO_TRAFFIC, ++ "TSDM: Parser serial FIFO is not empty"); ++ IDLE_CHK_1(0x7, USDM_REG_SYNC_PARSER_EMPTY, (val != 1), ++ IDLE_CHK_ERROR, "USDM: Parser serial FIFO is not empty"); ++ IDLE_CHK_1(0x7, XSDM_REG_SYNC_PARSER_EMPTY, (val != 1), ++ IDLE_CHK_ERROR, "XSDM: Parser serial FIFO is not empty"); ++ ++ IDLE_CHK_1(0x7, CSDM_REG_SYNC_SYNC_EMPTY, (val != 1), IDLE_CHK_ERROR, ++ "CSDM: Parser SYNC serial FIFO is not empty"); ++ IDLE_CHK_1(0x7, TSDM_REG_SYNC_SYNC_EMPTY, (val != 1), IDLE_CHK_ERROR, ++ "TSDM: Parser SYNC serial FIFO is not empty"); ++ IDLE_CHK_1(0x7, USDM_REG_SYNC_SYNC_EMPTY, (val != 1), IDLE_CHK_ERROR, ++ "USDM: Parser SYNC serial FIFO is not empty"); ++ IDLE_CHK_1(0x7, XSDM_REG_SYNC_SYNC_EMPTY, (val != 1), IDLE_CHK_ERROR, ++ "XSDM: Parser SYNC serial FIFO is not empty"); ++ ++ IDLE_CHK_1(0x7, CSDM_REG_RSP_PXP_CTRL_RDATA_EMPTY, (val != 1), ++ IDLE_CHK_ERROR, ++ "CSDM: pxp_ctrl rd_data fifo is not empty in sdm_dma_rsp" ++ " block"); ++ IDLE_CHK_1(0x7, TSDM_REG_RSP_PXP_CTRL_RDATA_EMPTY, (val != 1), ++ IDLE_CHK_ERROR, ++ "TSDM: pxp_ctrl rd_data fifo is not empty in sdm_dma_rsp" ++ " block"); ++ IDLE_CHK_1(0x7, USDM_REG_RSP_PXP_CTRL_RDATA_EMPTY, (val != 1), ++ IDLE_CHK_ERROR_NO_TRAFFIC, ++ "USDM: pxp_ctrl rd_data fifo is not empty in sdm_dma_rsp" ++ " block"); ++ IDLE_CHK_1(0x7, XSDM_REG_RSP_PXP_CTRL_RDATA_EMPTY, (val != 1), ++ IDLE_CHK_ERROR_NO_TRAFFIC, ++ "XSDM: pxp_ctrl rd_data fifo is not empty in sdm_dma_rsp" ++ " block"); ++ ++ IDLE_CHK_1(0x7, DORQ_REG_DQ_FILL_LVLF, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, "DQ: DORQ queue is not empty"); ++ ++ IDLE_CHK_1(0x7, CFC_REG_CFC_INT_STS, (val != 0), IDLE_CHK_ERROR, ++ "CFC: interrupt status is not 0"); ++ IDLE_CHK_1(0x7, CDU_REG_CDU_INT_STS, (val != 0), IDLE_CHK_ERROR, ++ "CDU: interrupt status is not 0"); ++ IDLE_CHK_1(0x7, CCM_REG_CCM_INT_STS, (val != 0), IDLE_CHK_ERROR, ++ "CCM: interrupt status is not 0"); ++ IDLE_CHK_1(0x7, TCM_REG_TCM_INT_STS, (val != 0), IDLE_CHK_ERROR, ++ "TCM: interrupt status is not 0"); ++ IDLE_CHK_1(0x7, UCM_REG_UCM_INT_STS, (val != 0), IDLE_CHK_ERROR, ++ "UCM: interrupt status is not 0"); ++ IDLE_CHK_1(0x7, XCM_REG_XCM_INT_STS, (val != 0), IDLE_CHK_ERROR, ++ "XCM: interrupt status is not 0"); ++ IDLE_CHK_1(0x7, PBF_REG_PBF_INT_STS, (val != 0), IDLE_CHK_ERROR, ++ "PBF: interrupt status is not 0"); ++ IDLE_CHK_1(0x7, TM_REG_TM_INT_STS, (val != 0), IDLE_CHK_ERROR, ++ "TIMERS: interrupt status is not 0"); ++ IDLE_CHK_1(0x7, DORQ_REG_DORQ_INT_STS, (val != 0), IDLE_CHK_ERROR, ++ "DQ: interrupt status is not 0"); ++ IDLE_CHK_1(0x7, SRC_REG_SRC_INT_STS, (val != 0), IDLE_CHK_ERROR, ++ "SRCH: interrupt status is not 0"); ++ IDLE_CHK_1(0x7, PRS_REG_PRS_INT_STS, (val != 0), IDLE_CHK_ERROR, ++ "PRS: interrupt status is not 0"); ++ IDLE_CHK_1(0x7, BRB1_REG_BRB1_INT_STS, ((val & ~0xfc00) != 0), ++ IDLE_CHK_ERROR, "BRB1: interrupt status is not 0"); ++ IDLE_CHK_1(0x7, GRCBASE_XPB + PB_REG_PB_INT_STS, (val != 0), ++ IDLE_CHK_ERROR, "XPB: interrupt status is not 0"); ++ IDLE_CHK_1(0x7, GRCBASE_UPB + PB_REG_PB_INT_STS, (val != 0), ++ IDLE_CHK_ERROR, "UPB: interrupt status is not 0"); ++ IDLE_CHK_1(0x7, PXP2_REG_PXP2_INT_STS_0, (val != 0), IDLE_CHK_WARNING, ++ "PXP2: interrupt status 0 is not 0"); ++ IDLE_CHK_1(0x6, PXP2_REG_PXP2_INT_STS_1, (val != 0), IDLE_CHK_WARNING, ++ "PXP2: interrupt status 1 is not 0"); ++ IDLE_CHK_1(0x7, QM_REG_QM_INT_STS, (val != 0), IDLE_CHK_ERROR, ++ "QM: interrupt status is not 0"); ++ IDLE_CHK_1(0x7, PXP_REG_PXP_INT_STS_0, (val != 0), IDLE_CHK_ERROR, ++ "PXP: interrupt status 0 is not 0"); ++ IDLE_CHK_1(0x7, PXP_REG_PXP_INT_STS_1, (val != 0), IDLE_CHK_ERROR, ++ "PXP: interrupt status 1 is not 0"); ++ ++ IDLE_CHK_1(0x7, DORQ_REG_RSPA_CRD_CNT, (val != 2), ++ IDLE_CHK_ERROR_NO_TRAFFIC, ++ "DQ: Credit to XCM is not full"); ++ IDLE_CHK_1(0x7, DORQ_REG_RSPB_CRD_CNT, (val != 2), IDLE_CHK_ERROR, ++ "DQ: Credit to UCM is not full"); ++ ++ IDLE_CHK_1(0x3, QM_REG_VOQCRDERRREG, (val != 0), IDLE_CHK_ERROR, ++ "QM: Credit error register is not 0 (byte or credit" ++ " overflow/underflow)"); ++ IDLE_CHK_1(0x7, DORQ_REG_DQ_FULL_ST, (val != 0), IDLE_CHK_ERROR, ++ "DQ: DORQ queue is full"); ++ ++ IDLE_CHK_1(0x7, MISC_REG_AEU_AFTER_INVERT_1_FUNC_0, ++ ((val & ~0xcffc) != 0), IDLE_CHK_WARNING, ++ "AEU: P0 AFTER_INVERT_1 is not 0"); ++ IDLE_CHK_1(0x7, MISC_REG_AEU_AFTER_INVERT_2_FUNC_0, (val != 0), ++ IDLE_CHK_ERROR, "AEU: P0 AFTER_INVERT_2 is not 0"); ++ IDLE_CHK_1(0x7, MISC_REG_AEU_AFTER_INVERT_3_FUNC_0, ++ ((val & ~0xc21b0000) != 0), IDLE_CHK_ERROR, ++ "AEU: P0 AFTER_INVERT_3 is not 0"); ++ IDLE_CHK_1(0x7, MISC_REG_AEU_AFTER_INVERT_4_FUNC_0, ++ ((val & ~0x801fffff) != 0), IDLE_CHK_ERROR, ++ "AEU: P0 AFTER_INVERT_4 is not 0"); ++ ++ IDLE_CHK_1(0x3, MISC_REG_AEU_AFTER_INVERT_1_FUNC_1, ++ ((val & ~0xcffc) != 0), IDLE_CHK_WARNING, ++ "AEU: P1 AFTER_INVERT_1 is not 0"); ++ IDLE_CHK_1(0x3, MISC_REG_AEU_AFTER_INVERT_2_FUNC_1, (val != 0), ++ IDLE_CHK_ERROR, "AEU: P1 AFTER_INVERT_2 is not 0"); ++ IDLE_CHK_1(0x3, MISC_REG_AEU_AFTER_INVERT_3_FUNC_1, ++ ((val & ~0xc21b0000) != 0), IDLE_CHK_ERROR, ++ "AEU: P1 AFTER_INVERT_3 is not 0"); ++ IDLE_CHK_1(0x3, MISC_REG_AEU_AFTER_INVERT_4_FUNC_1, ++ ((val & ~0x801fffff) != 0), IDLE_CHK_ERROR, ++ "AEU: P1 AFTER_INVERT_4 is not 0"); ++ ++ IDLE_CHK_1(0x7, MISC_REG_AEU_AFTER_INVERT_1_MCP, ++ ((val & ~0xcffc) != 0), IDLE_CHK_WARNING, ++ "AEU: MCP AFTER_INVERT_1 is not 0"); ++ IDLE_CHK_1(0x7, MISC_REG_AEU_AFTER_INVERT_2_MCP, (val != 0), ++ IDLE_CHK_ERROR, "AEU: MCP AFTER_INVERT_2 is not 0"); ++ IDLE_CHK_1(0x7, MISC_REG_AEU_AFTER_INVERT_3_MCP, ++ ((val & ~0xc21b0000) != 0), IDLE_CHK_ERROR, ++ "AEU: MCP AFTER_INVERT_3 is not 0"); ++ IDLE_CHK_1(0x7, MISC_REG_AEU_AFTER_INVERT_4_MCP, ++ ((val & ~0x801fffff) != 0), IDLE_CHK_ERROR, ++ "AEU: MCP AFTER_INVERT_4 is not 0"); ++ ++ IDLE_CHK_5(0x7, PBF_REG_DISABLE_NEW_TASK_PROC_P0, PBF_REG_P0_CREDIT, ++ PBF_REG_P0_INIT_CRD, (val1 != val2), ++ IDLE_CHK_ERROR_NO_TRAFFIC, ++ "PBF: P0 credit is not equal to init_crd"); ++ IDLE_CHK_5(0x7, PBF_REG_DISABLE_NEW_TASK_PROC_P1, PBF_REG_P1_CREDIT, ++ PBF_REG_P1_INIT_CRD, (val1 != val2), ++ IDLE_CHK_ERROR_NO_TRAFFIC, ++ "PBF: P1 credit is not equal to init_crd"); ++ IDLE_CHK_3(0x7, PBF_REG_P4_CREDIT, PBF_REG_P4_INIT_CRD, ++ (val1 != val2), IDLE_CHK_ERROR, ++ "PBF: P4 credit is not equal to init_crd"); ++ ++ IDLE_CHK_1(0x7, PBF_REG_P0_TASK_CNT, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, "PBF: P0 task_cnt is not 0"); ++ IDLE_CHK_1(0x7, PBF_REG_P1_TASK_CNT, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, "PBF: P1 task_cnt is not 0"); ++ IDLE_CHK_1(0x7, PBF_REG_P4_TASK_CNT, (val != 0), IDLE_CHK_ERROR, ++ "PBF: P4 task_cnt is not 0"); ++ ++ IDLE_CHK_1(0x7, XCM_REG_CFC_INIT_CRD, (val != 1), IDLE_CHK_ERROR, ++ "XCM: CFC_INIT_CRD is not 1"); ++ IDLE_CHK_1(0x7, UCM_REG_CFC_INIT_CRD, (val != 1), IDLE_CHK_ERROR, ++ "UCM: CFC_INIT_CRD is not 1"); ++ IDLE_CHK_1(0x7, TCM_REG_CFC_INIT_CRD, (val != 1), IDLE_CHK_ERROR, ++ "TCM: CFC_INIT_CRD is not 1"); ++ IDLE_CHK_1(0x7, CCM_REG_CFC_INIT_CRD, (val != 1), ++ IDLE_CHK_ERROR_NO_TRAFFIC, "CCM: CFC_INIT_CRD is not 1"); ++ ++ IDLE_CHK_1(0x7, XCM_REG_XQM_INIT_CRD, (val != 32), IDLE_CHK_ERROR, ++ "XCM: XQM_INIT_CRD is not 32"); ++ IDLE_CHK_1(0x7, UCM_REG_UQM_INIT_CRD, (val != 32), IDLE_CHK_ERROR, ++ "UCM: UQM_INIT_CRD is not 32"); ++ IDLE_CHK_1(0x7, TCM_REG_TQM_INIT_CRD, (val != 32), IDLE_CHK_ERROR, ++ "TCM: TQM_INIT_CRD is not 32"); ++ IDLE_CHK_1(0x7, CCM_REG_CQM_INIT_CRD, (val != 32), ++ IDLE_CHK_ERROR_NO_TRAFFIC, "CCM: CQM_INIT_CRD is not 32"); ++ ++ IDLE_CHK_1(0x7, XCM_REG_TM_INIT_CRD, (val != 4), IDLE_CHK_ERROR, ++ "XCM: TM_INIT_CRD is not 4"); ++ IDLE_CHK_1(0x7, UCM_REG_TM_INIT_CRD, (val != 4), IDLE_CHK_ERROR, ++ "UCM: TM_INIT_CRD is not 4"); ++ ++ IDLE_CHK_1(0x7, XCM_REG_FIC0_INIT_CRD, (val != 64), IDLE_CHK_WARNING, ++ "XCM: FIC0_INIT_CRD is not 64"); ++ IDLE_CHK_1(0x7, UCM_REG_FIC0_INIT_CRD, (val != 64), ++ IDLE_CHK_ERROR_NO_TRAFFIC, "UCM: FIC0_INIT_CRD is not 64"); ++ IDLE_CHK_1(0x7, TCM_REG_FIC0_INIT_CRD, (val != 64), ++ IDLE_CHK_ERROR_NO_TRAFFIC, "TCM: FIC0_INIT_CRD is not 64"); ++ IDLE_CHK_1(0x7, CCM_REG_FIC0_INIT_CRD, (val != 64), ++ IDLE_CHK_ERROR_NO_TRAFFIC, "CCM: FIC0_INIT_CRD is not 64"); ++ ++ IDLE_CHK_1(0x7, XCM_REG_FIC1_INIT_CRD, (val != 64), IDLE_CHK_ERROR, ++ "XCM: FIC1_INIT_CRD is not 64"); ++ IDLE_CHK_1(0x7, UCM_REG_FIC1_INIT_CRD, (val != 64), IDLE_CHK_ERROR, ++ "UCM: FIC1_INIT_CRD is not 64"); ++ IDLE_CHK_1(0x7, TCM_REG_FIC1_INIT_CRD, (val != 64), IDLE_CHK_ERROR, ++ "TCM: FIC1_INIT_CRD is not 64"); ++ IDLE_CHK_1(0x7, CCM_REG_FIC1_INIT_CRD, (val != 64), IDLE_CHK_ERROR, ++ "CCM: FIC1_INIT_CRD is not 64"); ++ ++ IDLE_CHK_1(0x1, XCM_REG_XX_FREE, (val != 31), IDLE_CHK_ERROR, ++ "XCM: XX_FREE is not 31"); ++ IDLE_CHK_1(0x6, XCM_REG_XX_FREE, (val != 32), IDLE_CHK_ERROR, ++ "XCM: XX_FREE is not 32"); ++ IDLE_CHK_1(0x7, UCM_REG_XX_FREE, (val != 27), ++ IDLE_CHK_ERROR_NO_TRAFFIC, "UCM: XX_FREE is not 27"); ++ IDLE_CHK_1(0x7, TCM_REG_XX_FREE, (val != 32), IDLE_CHK_ERROR, ++ "TCM: XX_FREE is not 32"); ++ IDLE_CHK_1(0x7, CCM_REG_XX_FREE, (val != 24), IDLE_CHK_ERROR, ++ "CCM: XX_FREE is not 24"); ++ ++ IDLE_CHK_1(0x7, XSEM_REG_FAST_MEMORY + 0x18000, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, ++ "XSEM: FOC0 credit less than initial credit"); ++ IDLE_CHK_1(0x7, XSEM_REG_FAST_MEMORY + 0x18040, (val != 24), ++ IDLE_CHK_ERROR_NO_TRAFFIC, ++ "XSEM: FOC1 credit less than initial credit"); ++ IDLE_CHK_1(0x7, XSEM_REG_FAST_MEMORY + 0x18080, (val != 12), ++ IDLE_CHK_ERROR_NO_TRAFFIC, ++ "XSEM: FOC2 credit less than initial credit"); ++ IDLE_CHK_1(0x7, XSEM_REG_FAST_MEMORY + 0x180C0, (val != 102), ++ IDLE_CHK_ERROR_NO_TRAFFIC, ++ "XSEM: FOC3 credit less than initial credit"); ++ ++ IDLE_CHK_1(0x7, USEM_REG_FAST_MEMORY + 0x18000, (val != 26), ++ IDLE_CHK_ERROR_NO_TRAFFIC, ++ "USEM: FOC0 credit less than initial credit"); ++ IDLE_CHK_1(0x7, USEM_REG_FAST_MEMORY + 0x18040, (val != 78), ++ IDLE_CHK_ERROR_NO_TRAFFIC, ++ "USEM: FOC1 credit less than initial credit"); ++ IDLE_CHK_1(0x7, USEM_REG_FAST_MEMORY + 0x18080, (val != 16), ++ IDLE_CHK_ERROR_NO_TRAFFIC, ++ "USEM: FOC2 credit less than initial credit"); ++ IDLE_CHK_1(0x7, USEM_REG_FAST_MEMORY + 0x180C0, (val != 32), ++ IDLE_CHK_ERROR_NO_TRAFFIC, ++ "USEM: FOC3 credit less than initial credit"); ++ ++ IDLE_CHK_1(0x7, TSEM_REG_FAST_MEMORY + 0x18000, (val != 52), ++ IDLE_CHK_ERROR_NO_TRAFFIC, ++ "TSEM: FOC0 credit less than initial credit"); ++ IDLE_CHK_1(0x7, TSEM_REG_FAST_MEMORY + 0x18040, (val != 24), ++ IDLE_CHK_ERROR_NO_TRAFFIC, ++ "TSEM: FOC1 credit less than initial credit"); ++ IDLE_CHK_1(0x7, TSEM_REG_FAST_MEMORY + 0x18080, (val != 12), ++ IDLE_CHK_ERROR_NO_TRAFFIC, ++ "TSEM: FOC2 credit less than initial credit"); ++ IDLE_CHK_1(0x7, TSEM_REG_FAST_MEMORY + 0x180C0, (val != 32), ++ IDLE_CHK_ERROR_NO_TRAFFIC, ++ "TSEM: FOC3 credit less than initial credit"); ++ ++ IDLE_CHK_1(0x7, CSEM_REG_FAST_MEMORY + 0x18000, (val != 16), ++ IDLE_CHK_ERROR_NO_TRAFFIC, ++ "CSEM: FOC0 credit less than initial credit"); ++ IDLE_CHK_1(0x7, CSEM_REG_FAST_MEMORY + 0x18040, (val != 18), ++ IDLE_CHK_ERROR_NO_TRAFFIC, ++ "CSEM: FOC1 credit less than initial credit"); ++ IDLE_CHK_1(0x7, CSEM_REG_FAST_MEMORY + 0x18080, (val != 48), ++ IDLE_CHK_ERROR_NO_TRAFFIC, ++ "CSEM: FOC2 credit less than initial credit"); ++ IDLE_CHK_1(0x7, CSEM_REG_FAST_MEMORY + 0x180C0, (val != 14), ++ IDLE_CHK_ERROR_NO_TRAFFIC, ++ "CSEM: FOC3 credit less than initial credit"); ++ ++ IDLE_CHK_1(0x7, PRS_REG_TSDM_CURRENT_CREDIT, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, ++ "PRS: TSDM current credit is not 0"); ++ IDLE_CHK_1(0x7, PRS_REG_TCM_CURRENT_CREDIT, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, ++ "PRS: TCM current credit is not 0"); ++ IDLE_CHK_1(0x7, PRS_REG_CFC_LD_CURRENT_CREDIT, (val != 0), ++ IDLE_CHK_ERROR, "PRS: CFC_LD current credit is not 0"); ++ IDLE_CHK_1(0x7, PRS_REG_CFC_SEARCH_CURRENT_CREDIT, (val != 0), ++ IDLE_CHK_ERROR, "PRS: CFC_SEARCH current credit is not 0"); ++ IDLE_CHK_1(0x7, PRS_REG_SRC_CURRENT_CREDIT, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, ++ "PRS: SRCH current credit is not 0"); ++ ++ IDLE_CHK_1(0x7, PRS_REG_PENDING_BRB_PRS_RQ, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, ++ "PRS: PENDING_BRB_PRS_RQ is not 0"); ++ IDLE_CHK_2(0x7, PRS_REG_PENDING_BRB_CAC0_RQ, 5, 4, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, ++ "PRS: PENDING_BRB_CAC%d_RQ is not 0"); ++ ++ IDLE_CHK_1(0x7, PRS_REG_SERIAL_NUM_STATUS_LSB, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, ++ "PRS: SERIAL_NUM_STATUS_LSB is not 0"); ++ IDLE_CHK_1(0x7, PRS_REG_SERIAL_NUM_STATUS_MSB, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, ++ "PRS: SERIAL_NUM_STATUS_MSB is not 0"); ++ ++ IDLE_CHK_1(0x7, CDU_REG_ERROR_DATA, (val != 0), IDLE_CHK_ERROR, ++ "CDU: ERROR_DATA is not 0"); ++ ++ IDLE_CHK_1(0x7, CCM_REG_STORM_LENGTH_MIS, (val != 0), IDLE_CHK_ERROR, ++ "CCM: STORM declared message length unequal to actual"); ++ IDLE_CHK_1(0x7, CCM_REG_CSDM_LENGTH_MIS, (val != 0), IDLE_CHK_ERROR, ++ "CCM: CSDM declared message length unequal to actual"); ++ IDLE_CHK_1(0x7, CCM_REG_TSEM_LENGTH_MIS, (val != 0), IDLE_CHK_ERROR, ++ "CCM: TSEM declared message length unequal to actual"); ++ IDLE_CHK_1(0x7, CCM_REG_XSEM_LENGTH_MIS, (val != 0), IDLE_CHK_ERROR, ++ "CCM: XSEM declared message length unequal to actual"); ++ IDLE_CHK_1(0x7, CCM_REG_USEM_LENGTH_MIS, (val != 0), IDLE_CHK_ERROR, ++ "CCM: USEM declared message length unequal to actual"); ++ IDLE_CHK_1(0x7, CCM_REG_PBF_LENGTH_MIS, (val != 0), IDLE_CHK_ERROR, ++ "CCM: PBF declared message length unequal to actual"); ++ ++ IDLE_CHK_1(0x7, TCM_REG_STORM_LENGTH_MIS, (val != 0), IDLE_CHK_ERROR, ++ "TCM: STORM declared message length unequal to actual"); ++ IDLE_CHK_1(0x7, TCM_REG_TSDM_LENGTH_MIS, (val != 0), IDLE_CHK_ERROR, ++ "TCM: TSDM declared message length unequal to actual"); ++ IDLE_CHK_1(0x7, TCM_REG_PRS_LENGTH_MIS, (val != 0), IDLE_CHK_ERROR, ++ "TCM: PRS declared message length unequal to actual"); ++ IDLE_CHK_1(0x7, TCM_REG_PBF_LENGTH_MIS, (val != 0), IDLE_CHK_ERROR, ++ "TCM: PBF declared message length unequal to actual"); ++ IDLE_CHK_1(0x7, TCM_REG_USEM_LENGTH_MIS, (val != 0), IDLE_CHK_ERROR, ++ "TCM: USEM declared message length unequal to actual"); ++ IDLE_CHK_1(0x7, TCM_REG_CSEM_LENGTH_MIS, (val != 0), IDLE_CHK_ERROR, ++ "TCM: CSEM declared message length unequal to actual"); ++ ++ IDLE_CHK_1(0x7, UCM_REG_STORM_LENGTH_MIS, (val != 0), IDLE_CHK_ERROR, ++ "UCM: STORM declared message length unequal to actual"); ++ IDLE_CHK_1(0x7, UCM_REG_USDM_LENGTH_MIS, (val != 0), IDLE_CHK_ERROR, ++ "UCM: USDM declared message length unequal to actual"); ++ IDLE_CHK_1(0x7, UCM_REG_TSEM_LENGTH_MIS, (val != 0), IDLE_CHK_ERROR, ++ "UCM: TSEM declared message length unequal to actual"); ++ IDLE_CHK_1(0x7, UCM_REG_CSEM_LENGTH_MIS, (val != 0), IDLE_CHK_ERROR, ++ "UCM: CSEM declared message length unequal to actual"); ++ IDLE_CHK_1(0x7, UCM_REG_XSEM_LENGTH_MIS, (val != 0), IDLE_CHK_ERROR, ++ "UCM: XSEM declared message length unequal to actual"); ++ IDLE_CHK_1(0x7, UCM_REG_DORQ_LENGTH_MIS, (val != 0), IDLE_CHK_ERROR, ++ "UCM: DORQ declared message length unequal to actual"); ++ ++ IDLE_CHK_1(0x7, XCM_REG_STORM_LENGTH_MIS, (val != 0), IDLE_CHK_ERROR, ++ "XCM: STORM declared message length unequal to actual"); ++ IDLE_CHK_1(0x7, XCM_REG_XSDM_LENGTH_MIS, (val != 0), IDLE_CHK_ERROR, ++ "XCM: XSDM declared message length unequal to actual"); ++ IDLE_CHK_1(0x7, XCM_REG_TSEM_LENGTH_MIS, (val != 0), IDLE_CHK_ERROR, ++ "XCM: TSEM declared message length unequal to actual"); ++ IDLE_CHK_1(0x7, XCM_REG_CSEM_LENGTH_MIS, (val != 0), IDLE_CHK_ERROR, ++ "XCM: CSEM declared message length unequal to actual"); ++ IDLE_CHK_1(0x7, XCM_REG_USEM_LENGTH_MIS, (val != 0), IDLE_CHK_ERROR, ++ "XCM: USEM declared message length unequal to actual"); ++ IDLE_CHK_1(0x7, XCM_REG_DORQ_LENGTH_MIS, (val != 0), IDLE_CHK_ERROR, ++ "XCM: DORQ declared message length unequal to actual"); ++ IDLE_CHK_1(0x7, XCM_REG_PBF_LENGTH_MIS, (val != 0), IDLE_CHK_ERROR, ++ "XCM: PBF declared message length unequal to actual"); ++ IDLE_CHK_1(0x7, XCM_REG_NIG0_LENGTH_MIS, (val != 0), IDLE_CHK_ERROR, ++ "XCM: NIG0 declared message length unequal to actual"); ++ IDLE_CHK_1(0x7, XCM_REG_NIG1_LENGTH_MIS, (val != 0), IDLE_CHK_ERROR, ++ "XCM: NIG1 declared message length unequal to actual"); ++ ++ IDLE_CHK_1(0x7, QM_REG_XQM_WRC_FIFOLVL, (val != 0), IDLE_CHK_ERROR, ++ "QM: XQM wrc_fifolvl is not 0"); ++ IDLE_CHK_1(0x7, QM_REG_UQM_WRC_FIFOLVL, (val != 0), IDLE_CHK_ERROR, ++ "QM: UQM wrc_fifolvl is not 0"); ++ IDLE_CHK_1(0x7, QM_REG_TQM_WRC_FIFOLVL, (val != 0), IDLE_CHK_ERROR, ++ "QM: TQM wrc_fifolvl is not 0"); ++ IDLE_CHK_1(0x7, QM_REG_CQM_WRC_FIFOLVL, (val != 0), IDLE_CHK_ERROR, ++ "QM: CQM wrc_fifolvl is not 0"); ++ IDLE_CHK_1(0x7, QM_REG_QSTATUS_LOW, (val != 0), IDLE_CHK_ERROR, ++ "QM: QSTATUS_LOW is not 0"); ++ IDLE_CHK_1(0x7, QM_REG_QSTATUS_HIGH, (val != 0), IDLE_CHK_ERROR, ++ "QM: QSTATUS_HIGH is not 0"); ++ IDLE_CHK_1(0x7, QM_REG_PAUSESTATE0, (val != 0), IDLE_CHK_ERROR, ++ "QM: PAUSESTATE0 is not 0"); ++ IDLE_CHK_1(0x7, QM_REG_PAUSESTATE1, (val != 0), IDLE_CHK_ERROR, ++ "QM: PAUSESTATE1 is not 0"); ++ IDLE_CHK_1(0x7, QM_REG_OVFQNUM, (val != 0), IDLE_CHK_ERROR, ++ "QM: OVFQNUM is not 0"); ++ IDLE_CHK_1(0x7, QM_REG_OVFERROR, (val != 0), IDLE_CHK_ERROR, ++ "QM: OVFERROR is not 0"); ++ ++ IDLE_CHK_6(0x7, QM_REG_PTRTBL, 64, 8, IDLE_CHK_ERROR_NO_TRAFFIC); ++ ++ IDLE_CHK_1(0x7, BRB1_REG_BRB1_PRTY_STS, ((val & ~0x8) != 0), ++ IDLE_CHK_WARNING, "BRB1: parity status is not 0"); ++ IDLE_CHK_1(0x7, CDU_REG_CDU_PRTY_STS, (val != 0), IDLE_CHK_WARNING, ++ "CDU: parity status is not 0"); ++ IDLE_CHK_1(0x7, CFC_REG_CFC_PRTY_STS, ((val & ~0x2) != 0), ++ IDLE_CHK_WARNING, "CFC: parity status is not 0"); ++ IDLE_CHK_1(0x7, CSDM_REG_CSDM_PRTY_STS, (val != 0), IDLE_CHK_WARNING, ++ "CSDM: parity status is not 0"); ++ IDLE_CHK_1(0x7, DBG_REG_DBG_PRTY_STS, (val != 0), IDLE_CHK_WARNING, ++ "DBG: parity status is not 0"); ++ IDLE_CHK_1(0x7, DMAE_REG_DMAE_PRTY_STS, (val != 0), IDLE_CHK_WARNING, ++ "DMAE: parity status is not 0"); ++ IDLE_CHK_1(0x7, DORQ_REG_DORQ_PRTY_STS, (val != 0), IDLE_CHK_WARNING, ++ "DQ: parity status is not 0"); ++ IDLE_CHK_1(0x1, TCM_REG_TCM_PRTY_STS, ((val & ~0x3ffc0) != 0), ++ IDLE_CHK_WARNING, "TCM: parity status is not 0"); ++ IDLE_CHK_1(0x6, TCM_REG_TCM_PRTY_STS, (val != 0), IDLE_CHK_WARNING, ++ "TCM: parity status is not 0"); ++ IDLE_CHK_1(0x1, CCM_REG_CCM_PRTY_STS, ((val & ~0x3ffc0) != 0), ++ IDLE_CHK_WARNING, "CCM: parity status is not 0"); ++ IDLE_CHK_1(0x6, CCM_REG_CCM_PRTY_STS, (val != 0), IDLE_CHK_WARNING, ++ "CCM: parity status is not 0"); ++ IDLE_CHK_1(0x1, UCM_REG_UCM_PRTY_STS, ((val & ~0x3ffc0) != 0), ++ IDLE_CHK_WARNING, "UCM: parity status is not 0"); ++ IDLE_CHK_1(0x6, UCM_REG_UCM_PRTY_STS, (val != 0), IDLE_CHK_WARNING, ++ "UCM: parity status is not 0"); ++ IDLE_CHK_1(0x1, XCM_REG_XCM_PRTY_STS, ((val & ~0x3ffc0) != 0), ++ IDLE_CHK_WARNING, "XCM: parity status is not 0"); ++ IDLE_CHK_1(0x6, XCM_REG_XCM_PRTY_STS, (val != 0), IDLE_CHK_WARNING, ++ "XCM: parity status is not 0"); ++ IDLE_CHK_1(0x1, HC_REG_HC_PRTY_STS, ((val & ~0x1) != 0), ++ IDLE_CHK_WARNING, "HC: parity status is not 0"); ++ IDLE_CHK_1(0x1, MISC_REG_MISC_PRTY_STS, ((val & ~0x1) != 0), ++ IDLE_CHK_WARNING, "MISC: parity status is not 0"); ++ IDLE_CHK_1(0x7, PRS_REG_PRS_PRTY_STS, (val != 0), IDLE_CHK_WARNING, ++ "PRS: parity status is not 0"); ++ IDLE_CHK_1(0x7, PXP_REG_PXP_PRTY_STS, (val != 0), IDLE_CHK_WARNING, ++ "PXP: parity status is not 0"); ++ IDLE_CHK_1(0x7, QM_REG_QM_PRTY_STS, (val != 0), IDLE_CHK_WARNING, ++ "QM: parity status is not 0"); ++ IDLE_CHK_1(0x1, SRC_REG_SRC_PRTY_STS, ((val & ~0x4) != 0), ++ IDLE_CHK_WARNING, "SRCH: parity status is not 0"); ++ IDLE_CHK_1(0x7, TSDM_REG_TSDM_PRTY_STS, (val != 0), IDLE_CHK_WARNING, ++ "TSDM: parity status is not 0"); ++ IDLE_CHK_1(0x7, USDM_REG_USDM_PRTY_STS, ((val & ~0x20) != 0), ++ IDLE_CHK_WARNING, "USDM: parity status is not 0"); ++ IDLE_CHK_1(0x7, XSDM_REG_XSDM_PRTY_STS, (val != 0), IDLE_CHK_WARNING, ++ "XSDM: parity status is not 0"); ++ IDLE_CHK_1(0x7, GRCBASE_XPB + PB_REG_PB_PRTY_STS, (val != 0), ++ IDLE_CHK_WARNING, "XPB: parity status is not 0"); ++ IDLE_CHK_1(0x7, GRCBASE_UPB + PB_REG_PB_PRTY_STS, (val != 0), ++ IDLE_CHK_WARNING, "UPB: parity status is not 0"); ++ ++ IDLE_CHK_1(0x7, CSEM_REG_CSEM_PRTY_STS_0, (val != 0), ++ IDLE_CHK_WARNING, "CSEM: parity status 0 is not 0"); ++ IDLE_CHK_1(0x1, PXP2_REG_PXP2_PRTY_STS_0, ((val & ~0xfff40020) != 0), ++ IDLE_CHK_WARNING, "PXP2: parity status 0 is not 0"); ++ IDLE_CHK_1(0x6, PXP2_REG_PXP2_PRTY_STS_0, ((val & ~0x20) != 0), ++ IDLE_CHK_WARNING, "PXP2: parity status 0 is not 0"); ++ IDLE_CHK_1(0x7, TSEM_REG_TSEM_PRTY_STS_0, (val != 0), ++ IDLE_CHK_WARNING, "TSEM: parity status 0 is not 0"); ++ IDLE_CHK_1(0x7, USEM_REG_USEM_PRTY_STS_0, (val != 0), ++ IDLE_CHK_WARNING, "USEM: parity status 0 is not 0"); ++ IDLE_CHK_1(0x7, XSEM_REG_XSEM_PRTY_STS_0, (val != 0), ++ IDLE_CHK_WARNING, "XSEM: parity status 0 is not 0"); ++ ++ IDLE_CHK_1(0x7, CSEM_REG_CSEM_PRTY_STS_1, (val != 0), ++ IDLE_CHK_WARNING, "CSEM: parity status 1 is not 0"); ++ IDLE_CHK_1(0x1, PXP2_REG_PXP2_PRTY_STS_1, ((val & ~0x20) != 0), ++ IDLE_CHK_WARNING, "PXP2: parity status 1 is not 0"); ++ IDLE_CHK_1(0x6, PXP2_REG_PXP2_PRTY_STS_1, (val != 0), ++ IDLE_CHK_WARNING, "PXP2: parity status 1 is not 0"); ++ IDLE_CHK_1(0x7, TSEM_REG_TSEM_PRTY_STS_1, (val != 0), ++ IDLE_CHK_WARNING, "TSEM: parity status 1 is not 0"); ++ IDLE_CHK_1(0x7, USEM_REG_USEM_PRTY_STS_1, (val != 0), ++ IDLE_CHK_WARNING, "USEM: parity status 1 is not 0"); ++ IDLE_CHK_1(0x7, XSEM_REG_XSEM_PRTY_STS_1, (val != 0), ++ IDLE_CHK_WARNING, "XSEM: parity status 1 is not 0"); ++ ++ IDLE_CHK_2(0x2, QM_REG_QTASKCTR_EXT_A_0, 64, 4, (val != 0), ++ IDLE_CHK_ERROR_NO_TRAFFIC, ++ "QM: Q_EXT_A_%d, queue is not empty"); ++ IDLE_CHK_1(0x2, QM_REG_QSTATUS_LOW_EXT_A, (val != 0), IDLE_CHK_ERROR, ++ "QM: QSTATUS_LOW_EXT_A is not 0"); ++ IDLE_CHK_1(0x2, QM_REG_QSTATUS_HIGH_EXT_A, (val != 0), IDLE_CHK_ERROR, ++ "QM: QSTATUS_HIGH_EXT_A is not 0"); ++ IDLE_CHK_1(0x6, QM_REG_PAUSESTATE2, (val != 0), IDLE_CHK_ERROR, ++ "QM: PAUSESTATE2 is not 0"); ++ IDLE_CHK_1(0x6, QM_REG_PAUSESTATE3, (val != 0), IDLE_CHK_ERROR, ++ "QM: PAUSESTATE3 is not 0"); ++ IDLE_CHK_1(0x2, QM_REG_PAUSESTATE4, (val != 0), IDLE_CHK_ERROR, ++ "QM: PAUSESTATE4 is not 0"); ++ IDLE_CHK_1(0x2, QM_REG_PAUSESTATE5, (val != 0), IDLE_CHK_ERROR, ++ "QM: PAUSESTATE5 is not 0"); ++ IDLE_CHK_1(0x2, QM_REG_PAUSESTATE6, (val != 0), IDLE_CHK_ERROR, ++ "QM: PAUSESTATE6 is not 0"); ++ IDLE_CHK_1(0x2, QM_REG_PAUSESTATE7, (val != 0), IDLE_CHK_ERROR, ++ "QM: PAUSESTATE7 is not 0"); ++ IDLE_CHK_6(0x2, QM_REG_PTRTBL_EXT_A, 64, 8, ++ IDLE_CHK_ERROR_NO_TRAFFIC); ++ ++ IDLE_CHK_1(0x6, MISC_REG_AEU_SYS_KILL_OCCURRED, (val != 0), ++ IDLE_CHK_ERROR, "MISC: system kill occurd;"); ++ IDLE_CHK_1(0x6, MISC_REG_AEU_SYS_KILL_STATUS_0, (val != 0), ++ IDLE_CHK_ERROR, ++ "MISC: system kill occurd; status_0 register"); ++ IDLE_CHK_1(0x6, MISC_REG_AEU_SYS_KILL_STATUS_1, (val != 0), ++ IDLE_CHK_ERROR, ++ "MISC: system kill occurd; status_1 register"); ++ IDLE_CHK_1(0x6, MISC_REG_AEU_SYS_KILL_STATUS_2, (val != 0), ++ IDLE_CHK_ERROR, ++ "MISC: system kill occurd; status_2 register"); ++ IDLE_CHK_1(0x6, MISC_REG_AEU_SYS_KILL_STATUS_3, (val != 0), ++ IDLE_CHK_ERROR, ++ "MISC: system kill occurd; status_3 register"); ++ IDLE_CHK_1(0x6, MISC_REG_PCIE_HOT_RESET, (val != 0), IDLE_CHK_WARNING, ++ "MISC: pcie_rst_b was asserted without perst assertion"); ++ ++ IDLE_CHK_1(0x7, NIG_REG_NIG_INT_STS_0, ((val & ~0x300) != 0), ++ IDLE_CHK_ERROR, "NIG: interrupt status 0 is not 0"); ++ IDLE_CHK_1(0x7, NIG_REG_NIG_INT_STS_0, (val == 0x300), ++ IDLE_CHK_WARNING, ++ "NIG: Access to BMAC while not active. If tested on FPGA," ++ " ignore this warning."); ++ IDLE_CHK_1(0x7, NIG_REG_NIG_INT_STS_1, (val != 0), IDLE_CHK_ERROR, ++ "NIG: interrupt status 1 is not 0"); ++ IDLE_CHK_1(0x6, NIG_REG_NIG_PRTY_STS, ((val & ~0xffc00000) != 0), ++ IDLE_CHK_WARNING, "NIG: parity status is not 0"); ++ ++ IDLE_CHK_1(0x7, TSEM_REG_TSEM_INT_STS_0, ((val & ~0x10000000) != 0), ++ IDLE_CHK_ERROR, "TSEM: interrupt status 0 is not 0"); ++ IDLE_CHK_1(0x7, TSEM_REG_TSEM_INT_STS_0, (val == 0x10000000), ++ IDLE_CHK_WARNING, "TSEM: interrupt status 0 is not 0"); ++ IDLE_CHK_1(0x7, TSEM_REG_TSEM_INT_STS_1, (val != 0), IDLE_CHK_ERROR, ++ "TSEM: interrupt status 1 is not 0"); ++ ++ IDLE_CHK_1(0x7, CSEM_REG_CSEM_INT_STS_0, ((val & ~0x10000000) != 0), ++ IDLE_CHK_ERROR, "CSEM: interrupt status 0 is not 0"); ++ IDLE_CHK_1(0x7, CSEM_REG_CSEM_INT_STS_0, (val == 0x10000000), ++ IDLE_CHK_WARNING, "CSEM: interrupt status 0 is not 0"); ++ IDLE_CHK_1(0x7, CSEM_REG_CSEM_INT_STS_1, (val != 0), IDLE_CHK_ERROR, ++ "CSEM: interrupt status 1 is not 0"); ++ ++ IDLE_CHK_1(0x7, USEM_REG_USEM_INT_STS_0, ((val & ~0x10000000) != 0), ++ IDLE_CHK_ERROR, "USEM: interrupt status 0 is not 0"); ++ IDLE_CHK_1(0x7, USEM_REG_USEM_INT_STS_0, (val == 0x10000000), ++ IDLE_CHK_WARNING, "USEM: interrupt status 0 is not 0"); ++ IDLE_CHK_1(0x7, USEM_REG_USEM_INT_STS_1, (val != 0), IDLE_CHK_ERROR, ++ "USEM: interrupt status 1 is not 0"); ++ ++ IDLE_CHK_1(0x7, XSEM_REG_XSEM_INT_STS_0, ((val & ~0x10000000) != 0), ++ IDLE_CHK_ERROR, "XSEM: interrupt status 0 is not 0"); ++ IDLE_CHK_1(0x7, XSEM_REG_XSEM_INT_STS_0, (val == 0x10000000), ++ IDLE_CHK_WARNING, "XSEM: interrupt status 0 is not 0"); ++ IDLE_CHK_1(0x7, XSEM_REG_XSEM_INT_STS_1, (val != 0), IDLE_CHK_ERROR, ++ "XSEM: interrupt status 1 is not 0"); ++ ++ IDLE_CHK_1(0x7, TSDM_REG_TSDM_INT_STS_0, (val != 0), IDLE_CHK_ERROR, ++ "TSDM: interrupt status 0 is not 0"); ++ IDLE_CHK_1(0x7, TSDM_REG_TSDM_INT_STS_1, (val != 0), IDLE_CHK_ERROR, ++ "TSDM: interrupt status 1 is not 0"); ++ ++ IDLE_CHK_1(0x7, CSDM_REG_CSDM_INT_STS_0, (val != 0), IDLE_CHK_ERROR, ++ "CSDM: interrupt status 0 is not 0"); ++ IDLE_CHK_1(0x7, CSDM_REG_CSDM_INT_STS_1, (val != 0), IDLE_CHK_ERROR, ++ "CSDM: interrupt status 1 is not 0"); ++ ++ IDLE_CHK_1(0x7, USDM_REG_USDM_INT_STS_0, (val != 0), IDLE_CHK_ERROR, ++ "USDM: interrupt status 0 is not 0"); ++ IDLE_CHK_1(0x7, USDM_REG_USDM_INT_STS_1, (val != 0), IDLE_CHK_ERROR, ++ "USDM: interrupt status 1 is not 0"); ++ ++ IDLE_CHK_1(0x7, XSDM_REG_XSDM_INT_STS_0, (val != 0), IDLE_CHK_ERROR, ++ "XSDM: interrupt status 0 is not 0"); ++ IDLE_CHK_1(0x7, XSDM_REG_XSDM_INT_STS_1, (val != 0), IDLE_CHK_ERROR, ++ "XSDM: interrupt status 1 is not 0"); ++ ++ IDLE_CHK_1(0x6, HC_REG_HC_PRTY_STS, (val != 0), IDLE_CHK_WARNING, ++ "HC: parity status is not 0"); ++ IDLE_CHK_1(0x6, MISC_REG_MISC_PRTY_STS, (val != 0), IDLE_CHK_WARNING, ++ "MISC: parity status is not 0"); ++ IDLE_CHK_1(0x6, SRC_REG_SRC_PRTY_STS, (val != 0), IDLE_CHK_WARNING, ++ "SRCH: parity status is not 0"); ++ ++ if (idle_chk_errors == 0) { ++ BNX2X_DBG_ERR("completed successfully (with %d warnings)\n", ++ idle_chk_warnings); ++ } else { ++ BNX2X_DBG_ERR("failed (with %d errors, %d warnings)\n", ++ idle_chk_errors, idle_chk_warnings); ++ } ++ return idle_chk_errors; ++} ++ diff --git a/master/bnx2x-fix-paths b/master/bnx2x-fix-paths index 8d668e0..9bbefd9 100644 --- a/master/bnx2x-fix-paths +++ b/master/bnx2x-fix-paths @@ -1,18 +1,18 @@ -diff -r e9260016d9ee drivers/net/bnx2x.h ---- a/drivers/net/bnx2x.h Thu Nov 06 09:54:32 2008 +0000 -+++ b/drivers/net/bnx2x.h Thu Nov 06 10:09:10 2008 +0000 -@@ -32,7 +32,7 @@ +diff -r 0e51dea127e3 drivers/net/bnx2x.h +--- a/drivers/net/bnx2x.h Mon Jun 15 17:05:43 2009 +0100 ++++ b/drivers/net/bnx2x.h Mon Jun 15 17:47:52 2009 +0100 +@@ -57,7 +57,7 @@ #include "bnx2x_compat.h" #endif - #ifdef BCM_CNIC + #ifdef BCM_CNIC /* ! BNX2X_UPSTREAM */ -#include "../../bnx2/src/cnic_drv.h" +#include "cnic_drv.h" #endif #include "bnx2x_reg.h" #include "bnx2x_fw_defs.h" -diff -r e9260016d9ee drivers/net/cnic.c ---- a/drivers/net/cnic.c Thu Nov 06 09:54:32 2008 +0000 -+++ b/drivers/net/cnic.c Thu Nov 06 10:09:10 2008 +0000 +diff -r 0e51dea127e3 drivers/net/cnic.c +--- a/drivers/net/cnic.c Mon Jun 15 17:05:43 2009 +0100 ++++ b/drivers/net/cnic.c Mon Jun 15 17:47:52 2009 +0100 @@ -54,9 +54,9 @@ #endif #include "cnic_drv.h" diff --git a/master/e1000-8.0.13.patch b/master/e1000-8.0.13.patch new file mode 100644 index 0000000..d08747d --- /dev/null +++ b/master/e1000-8.0.13.patch @@ -0,0 +1,31182 @@ +diff -r d03036c09699 drivers/net/e1000/Makefile +--- a/drivers/net/e1000/Makefile Thu Jun 04 15:13:56 2009 +0100 ++++ b/drivers/net/e1000/Makefile Mon Jun 15 11:43:11 2009 +0100 +@@ -32,4 +32,11 @@ + + obj-$(CONFIG_E1000) += e1000.o + +-e1000-objs := e1000_main.o e1000_hw.o e1000_ethtool.o e1000_param.o ++FAMILYC = e1000_82540.c e1000_82542.c e1000_82541.c e1000_82543.c ++ ++CFILES = e1000_main.c $(FAMILYC) e1000_mac.c e1000_nvm.c e1000_phy.c \ ++ e1000_manage.c e1000_param.c e1000_ethtool.c kcompat.c e1000_api.c ++ ++e1000-objs := $(CFILES:.c=.o) ++ ++EXTRA_CFLAGS += -DDRIVER_E1000 +diff -r d03036c09699 drivers/net/e1000/e1000.h +--- a/drivers/net/e1000/e1000.h Thu Jun 04 15:13:56 2009 +0100 ++++ b/drivers/net/e1000/e1000.h Mon Jun 15 11:43:11 2009 +0100 +@@ -1,7 +1,7 @@ + /******************************************************************************* + + Intel PRO/1000 Linux driver +- Copyright(c) 1999 - 2006 Intel Corporation. ++ Copyright(c) 1999 - 2008 Intel Corporation. + + This program is free software; you can redistribute it and/or modify it + under the terms and conditions of the GNU General Public License, +@@ -32,43 +32,9 @@ + #ifndef _E1000_H_ + #define _E1000_H_ + +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include ++#include "kcompat.h" ++ ++#include "e1000_api.h" + + #define BAR_0 0 + #define BAR_1 1 +@@ -79,24 +45,15 @@ + + struct e1000_adapter; + +-#include "e1000_hw.h" +- +-#ifdef DBG +-#define E1000_DBG(args...) printk(KERN_DEBUG "e1000: " args) +-#else + #define E1000_DBG(args...) +-#endif + + #define E1000_ERR(args...) printk(KERN_ERR "e1000: " args) + + #define PFX "e1000: " +- +-#define DPRINTK(nlevel, klevel, fmt, args...) \ +-do { \ +- if (NETIF_MSG_##nlevel & adapter->msg_enable) \ +- printk(KERN_##klevel PFX "%s: %s: " fmt, \ +- adapter->netdev->name, __func__, ##args); \ +-} while (0) ++#define DPRINTK(nlevel, klevel, fmt, args...) \ ++ (void)((NETIF_MSG_##nlevel & adapter->msg_enable) && \ ++ printk(KERN_##klevel PFX "%s: %s: " fmt, adapter->netdev->name, \ ++ __FUNCTION__ , ## args)) + + #define E1000_MAX_INTR 10 + +@@ -106,17 +63,26 @@ + #define E1000_MIN_TXD 80 + #define E1000_MAX_82544_TXD 4096 + ++#define E1000_DEFAULT_TXD_PWR 12 ++#define E1000_MAX_TXD_PWR 12 ++#define E1000_MIN_TXD_PWR 7 ++ + #define E1000_DEFAULT_RXD 256 + #define E1000_MAX_RXD 256 ++ + #define E1000_MIN_RXD 80 + #define E1000_MAX_82544_RXD 4096 ++ ++#define E1000_MIN_ITR_USECS 10 /* 100000 irq/sec */ ++#define E1000_MAX_ITR_USECS 10000 /* 100 irq/sec */ ++ + + /* this is the size past which hardware will drop packets when setting LPE=0 */ + #define MAXIMUM_ETHERNET_VLAN_SIZE 1522 + + /* Supported Rx Buffer Sizes */ +-#define E1000_RXBUFFER_128 128 /* Used for packet split */ +-#define E1000_RXBUFFER_256 256 /* Used for packet split */ ++#define E1000_RXBUFFER_128 128 ++#define E1000_RXBUFFER_256 256 + #define E1000_RXBUFFER_512 512 + #define E1000_RXBUFFER_1024 1024 + #define E1000_RXBUFFER_2048 2048 +@@ -133,9 +99,8 @@ + #define E1000_TX_HEAD_ADDR_SHIFT 7 + #define E1000_PBA_TX_MASK 0xFFFF0000 + +-/* Flow Control Watermarks */ +-#define E1000_FC_HIGH_DIFF 0x1638 /* High: 5688 bytes below Rx FIFO size */ +-#define E1000_FC_LOW_DIFF 0x1640 /* Low: 5696 bytes below Rx FIFO size */ ++/* Early Receive defines */ ++#define E1000_ERT_2048 0x100 + + #define E1000_FC_PAUSE_TIME 0x0680 /* 858 usec */ + +@@ -146,7 +111,6 @@ + + #define AUTO_ALL_MODES 0 + #define E1000_EEPROM_82544_APM 0x0004 +-#define E1000_EEPROM_ICH8_APME 0x0004 + #define E1000_EEPROM_APME 0x0400 + + #ifndef E1000_MASTER_SLAVE +@@ -154,9 +118,9 @@ + #define E1000_MASTER_SLAVE e1000_ms_hw_default + #endif + +-#define E1000_MNG_VLAN_NONE (-1) +-/* Number of packet split data buffers (not including the header buffer) */ +-#define PS_PAGE_BUFFERS (MAX_PS_BUFFERS - 1) ++#ifdef NETIF_F_HW_VLAN_TX ++#define E1000_MNG_VLAN_NONE -1 ++#endif + + /* wrapper around a pointer to a socket buffer, + * so a DMA handle can be stored along with the buffer */ +@@ -168,13 +132,12 @@ + u16 next_to_watch; + }; + +-struct e1000_ps_page { +- struct page *ps_page[PS_PAGE_BUFFERS]; ++struct e1000_rx_buffer { ++ struct sk_buff *skb; ++ dma_addr_t dma; ++ struct page *page; + }; +- +-struct e1000_ps_page_dma { +- u64 ps_page_dma[PS_PAGE_BUFFERS]; +-}; ++ + + struct e1000_tx_ring { + /* pointer to the descriptor ring memory */ +@@ -195,10 +158,20 @@ + spinlock_t tx_lock; + u16 tdh; + u16 tdt; ++ ++ /* TXDdescriptor index increment to be used when advancing ++ * to the next descriptor. This is normally one, but on some ++ * architectures, but on some architectures there are cache ++ * coherency issues that require only the first descriptor in ++ * cache line can be used. ++ */ ++ unsigned int step; ++ + bool last_tx_tso; + }; + + struct e1000_rx_ring { ++ struct e1000_adapter *adapter; /* back link */ + /* pointer to the descriptor ring memory */ + void *desc; + /* physical address of the descriptor ring */ +@@ -211,11 +184,12 @@ + unsigned int next_to_use; + /* next descriptor to check for DD status bit */ + unsigned int next_to_clean; ++#ifdef CONFIG_E1000_NAPI ++ struct napi_struct napi; ++#endif + /* array of buffer information structs */ +- struct e1000_buffer *buffer_info; +- /* arrays of page information for packet split */ +- struct e1000_ps_page *ps_page; +- struct e1000_ps_page_dma *ps_page_dma; ++ struct e1000_rx_buffer *buffer_info; ++ struct sk_buff *rx_skb_top; + + /* cpu for rx queue */ + int cpu; +@@ -224,18 +198,38 @@ + u16 rdt; + }; + +-#define E1000_DESC_UNUSED(R) \ +- ((((R)->next_to_clean > (R)->next_to_use) \ +- ? 0 : (R)->count) + (R)->next_to_clean - (R)->next_to_use - 1) + +-#define E1000_RX_DESC_PS(R, i) \ +- (&(((union e1000_rx_desc_packet_split *)((R).desc))[i])) +-#define E1000_RX_DESC_EXT(R, i) \ ++#define E1000_TX_DESC_INC(R,index) \ ++ {index += (R)->step; if (index == (R)->count) index = 0; } ++ ++#define E1000_TX_DESC_DEC(R,index) \ ++ { if (index == 0) index = (R)->count - (R)->step; \ ++ else index -= (R)->step; } ++ ++#define E1000_DESC_UNUSED(R) \ ++ ((((R)->next_to_clean > (R)->next_to_use) ? 0 : (R)->count) + \ ++ (R)->next_to_clean - (R)->next_to_use - 1) ++ ++#define E1000_RX_DESC_EXT(R, i) \ + (&(((union e1000_rx_desc_extended *)((R).desc))[i])) + #define E1000_GET_DESC(R, i, type) (&(((struct type *)((R).desc))[i])) + #define E1000_RX_DESC(R, i) E1000_GET_DESC(R, i, e1000_rx_desc) + #define E1000_TX_DESC(R, i) E1000_GET_DESC(R, i, e1000_tx_desc) + #define E1000_CONTEXT_DESC(R, i) E1000_GET_DESC(R, i, e1000_context_desc) ++ ++#ifdef SIOCGMIIPHY ++/* PHY register snapshot values */ ++struct e1000_phy_regs { ++ u16 bmcr; /* basic mode control register */ ++ u16 bmsr; /* basic mode status register */ ++ u16 advertise; /* auto-negotiation advertisement */ ++ u16 lpa; /* link partner ability register */ ++ u16 expansion; /* auto-negotiation expansion reg */ ++ u16 ctrl1000; /* 1000BASE-T control register */ ++ u16 stat1000; /* 1000BASE-T status register */ ++ u16 estatus; /* extended status register */ ++}; ++#endif + + /* board specific private data structure */ + +@@ -243,8 +237,10 @@ + struct timer_list tx_fifo_stall_timer; + struct timer_list watchdog_timer; + struct timer_list phy_info_timer; ++#ifdef NETIF_F_HW_VLAN_TX + struct vlan_group *vlgrp; + u16 mng_vlan_id; ++#endif + u32 bd_number; + u32 rx_buffer_len; + u32 wol; +@@ -253,7 +249,9 @@ + u16 link_speed; + u16 link_duplex; + spinlock_t stats_lock; ++#ifdef CONFIG_E1000_NAPI + spinlock_t tx_queue_lock; ++#endif + unsigned int total_tx_bytes; + unsigned int total_tx_packets; + unsigned int total_rx_bytes; +@@ -265,10 +263,13 @@ + u16 rx_itr; + + struct work_struct reset_task; +- u8 fc_autoneg; ++ struct work_struct watchdog_task; ++ bool fc_autoneg; + ++#ifdef ETHTOOL_PHYS_ID + struct timer_list blink_timer; + unsigned long led_status; ++#endif + + /* TX */ + struct e1000_tx_ring *tx_ring; /* One per active queue */ +@@ -277,44 +278,46 @@ + u32 txd_cmd; + u32 tx_int_delay; + u32 tx_abs_int_delay; +- u32 gotcl; +- u64 gotcl_old; ++ u32 gotc; ++ u64 gotc_old; + u64 tpt_old; + u64 colc_old; + u32 tx_timeout_count; + u32 tx_fifo_head; + u32 tx_head_addr; + u32 tx_fifo_size; +- u8 tx_timeout_factor; ++ u8 tx_timeout_factor; + atomic_t tx_fifo_stall; + bool pcix_82544; + bool detect_tx_hung; + + /* RX */ +- bool (*clean_rx)(struct e1000_adapter *adapter, +- struct e1000_rx_ring *rx_ring, +- int *work_done, int work_to_do); +- void (*alloc_rx_buf)(struct e1000_adapter *adapter, +- struct e1000_rx_ring *rx_ring, +- int cleaned_count); ++#ifdef CONFIG_E1000_NAPI ++ bool (*clean_rx) (struct e1000_adapter *adapter, ++ struct e1000_rx_ring *rx_ring, ++ int *work_done, int work_to_do); ++#else ++ bool (*clean_rx) (struct e1000_adapter *adapter, ++ struct e1000_rx_ring *rx_ring); ++#endif ++ void (*alloc_rx_buf) (struct e1000_adapter *adapter, ++ struct e1000_rx_ring *rx_ring, ++ int cleaned_count); + struct e1000_rx_ring *rx_ring; /* One per active queue */ +- struct napi_struct napi; +- struct net_device *polling_netdev; /* One per active queue */ +- + int num_tx_queues; + int num_rx_queues; + + u64 hw_csum_err; + u64 hw_csum_good; +- u64 rx_hdr_split; + u32 alloc_rx_buff_failed; + u32 rx_int_delay; + u32 rx_abs_int_delay; + bool rx_csum; +- unsigned int rx_ps_pages; +- u32 gorcl; +- u64 gorcl_old; +- u16 rx_ps_bsize0; ++ u32 gorc; ++ u64 gorc_old; ++ u32 max_frame_size; ++ u32 min_frame_size; ++ + + /* OS defined structs */ + struct net_device *netdev; +@@ -327,24 +330,44 @@ + struct e1000_phy_info phy_info; + struct e1000_phy_stats phy_stats; + ++#ifdef SIOCGMIIPHY ++ /* Snapshot of PHY registers */ ++ struct e1000_phy_regs phy_regs; ++#endif ++ ++#ifdef ETHTOOL_TEST + u32 test_icr; + struct e1000_tx_ring test_tx_ring; + struct e1000_rx_ring test_rx_ring; ++#endif ++ + + int msg_enable; +- bool have_msi; +- + /* to not mess up cache alignment, always add to the bottom */ +- bool tso_force; +- bool smart_power_down; /* phy smart power down */ +- bool quad_port_a; +- unsigned long flags; ++ unsigned long state; + u32 eeprom_wol; + +- /* for ioport free */ +- int bars; +- int need_ioport; ++ u32 *config_space; ++ ++ /* hardware capability, feature, and workaround flags */ ++ unsigned int flags; ++ ++ /* upper limit parameter for tx desc size */ ++ u32 tx_desc_pwr; + }; ++ ++#define E1000_FLAG_HAS_SMBUS (1 << 0) ++#define E1000_FLAG_HAS_INTR_MODERATION (1 << 4) ++#define E1000_FLAG_BAD_TX_CARRIER_STATS_FD (1 << 6) ++#define E1000_FLAG_QUAD_PORT_A (1 << 8) ++#define E1000_FLAG_SMART_POWER_DOWN (1 << 9) ++#ifdef NETIF_F_TSO ++#define E1000_FLAG_HAS_TSO (1 << 10) ++#ifdef NETIF_F_TSO6 ++#define E1000_FLAG_HAS_TSO6 (1 << 11) ++#endif ++#define E1000_FLAG_TSO_FORCE (1 << 12) ++#endif + + enum e1000_state_t { + __E1000_TESTING, +@@ -354,6 +377,11 @@ + + extern char e1000_driver_name[]; + extern const char e1000_driver_version[]; ++ ++extern void e1000_power_up_phy(struct e1000_hw *hw); ++ ++extern void e1000_set_ethtool_ops(struct net_device *netdev); ++extern void e1000_check_options(struct e1000_adapter *adapter); + + extern int e1000_up(struct e1000_adapter *adapter); + extern void e1000_down(struct e1000_adapter *adapter); +@@ -365,8 +393,8 @@ + extern void e1000_free_all_rx_resources(struct e1000_adapter *adapter); + extern void e1000_free_all_tx_resources(struct e1000_adapter *adapter); + extern void e1000_update_stats(struct e1000_adapter *adapter); +-extern void e1000_power_up_phy(struct e1000_adapter *); +-extern void e1000_set_ethtool_ops(struct net_device *netdev); +-extern void e1000_check_options(struct e1000_adapter *adapter); ++#ifdef ETHTOOL_OPS_COMPAT ++extern int ethtool_ioctl(struct ifreq *ifr); ++#endif + + #endif /* _E1000_H_ */ +diff -r d03036c09699 drivers/net/e1000/e1000_80003es2lan.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/e1000/e1000_80003es2lan.h Mon Jun 15 11:43:11 2009 +0100 +@@ -0,0 +1,95 @@ ++/******************************************************************************* ++ ++ Intel PRO/1000 Linux driver ++ Copyright(c) 1999 - 2007 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ Linux NICS ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++#ifndef _E1000_80003ES2LAN_H_ ++#define _E1000_80003ES2LAN_H_ ++ ++#define E1000_KMRNCTRLSTA_OFFSET_FIFO_CTRL 0x00 ++#define E1000_KMRNCTRLSTA_OFFSET_INB_CTRL 0x02 ++#define E1000_KMRNCTRLSTA_OFFSET_HD_CTRL 0x10 ++#define E1000_KMRNCTRLSTA_OFFSET_MAC2PHY_OPMODE 0x1F ++ ++#define E1000_KMRNCTRLSTA_FIFO_CTRL_RX_BYPASS 0x0008 ++#define E1000_KMRNCTRLSTA_FIFO_CTRL_TX_BYPASS 0x0800 ++#define E1000_KMRNCTRLSTA_INB_CTRL_DIS_PADDING 0x0010 ++ ++#define E1000_KMRNCTRLSTA_HD_CTRL_10_100_DEFAULT 0x0004 ++#define E1000_KMRNCTRLSTA_HD_CTRL_1000_DEFAULT 0x0000 ++#define E1000_KMRNCTRLSTA_OPMODE_E_IDLE 0x2000 ++ ++#define E1000_TCTL_EXT_GCEX_MASK 0x000FFC00 /* Gigabit Carry Extend Padding */ ++#define DEFAULT_TCTL_EXT_GCEX_80003ES2LAN 0x00010000 ++ ++#define DEFAULT_TIPG_IPGT_1000_80003ES2LAN 0x8 ++#define DEFAULT_TIPG_IPGT_10_100_80003ES2LAN 0x9 ++ ++/* GG82563 PHY Specific Status Register (Page 0, Register 16 */ ++#define GG82563_PSCR_POLARITY_REVERSAL_DISABLE 0x0002 /* 1=Reversal Disabled */ ++#define GG82563_PSCR_CROSSOVER_MODE_MASK 0x0060 ++#define GG82563_PSCR_CROSSOVER_MODE_MDI 0x0000 /* 00=Manual MDI */ ++#define GG82563_PSCR_CROSSOVER_MODE_MDIX 0x0020 /* 01=Manual MDIX */ ++#define GG82563_PSCR_CROSSOVER_MODE_AUTO 0x0060 /* 11=Auto crossover */ ++ ++/* PHY Specific Control Register 2 (Page 0, Register 26) */ ++#define GG82563_PSCR2_REVERSE_AUTO_NEG 0x2000 ++ /* 1=Reverse Auto-Negotiation */ ++ ++/* MAC Specific Control Register (Page 2, Register 21) */ ++/* Tx clock speed for Link Down and 1000BASE-T for the following speeds */ ++#define GG82563_MSCR_TX_CLK_MASK 0x0007 ++#define GG82563_MSCR_TX_CLK_10MBPS_2_5 0x0004 ++#define GG82563_MSCR_TX_CLK_100MBPS_25 0x0005 ++#define GG82563_MSCR_TX_CLK_1000MBPS_2_5 0x0006 ++#define GG82563_MSCR_TX_CLK_1000MBPS_25 0x0007 ++ ++#define GG82563_MSCR_ASSERT_CRS_ON_TX 0x0010 /* 1=Assert */ ++ ++/* DSP Distance Register (Page 5, Register 26) */ ++/* ++ * 0 = <50M ++ * 1 = 50-80M ++ * 2 = 80-100M ++ * 3 = 110-140M ++ * 4 = >140M ++ */ ++#define GG82563_DSPD_CABLE_LENGTH 0x0007 ++ ++/* Kumeran Mode Control Register (Page 193, Register 16) */ ++#define GG82563_KMCR_PASS_FALSE_CARRIER 0x0800 ++ ++/* Max number of times Kumeran read/write should be validated */ ++#define GG82563_MAX_KMRN_RETRY 0x5 ++ ++/* Power Management Control Register (Page 193, Register 20) */ ++#define GG82563_PMCR_ENABLE_ELECTRICAL_IDLE 0x0001 ++ /* 1=Enable SERDES Electrical Idle */ ++ ++/* In-Band Control Register (Page 194, Register 18) */ ++#define GG82563_ICR_DIS_PADDING 0x0010 /* Disable Padding */ ++ ++#endif +diff -r d03036c09699 drivers/net/e1000/e1000_82540.c +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/e1000/e1000_82540.c Mon Jun 15 11:43:11 2009 +0100 +@@ -0,0 +1,672 @@ ++/******************************************************************************* ++ ++ Intel PRO/1000 Linux driver ++ Copyright(c) 1999 - 2008 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ Linux NICS ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++/* ++ * 82540EM Gigabit Ethernet Controller ++ * 82540EP Gigabit Ethernet Controller ++ * 82545EM Gigabit Ethernet Controller (Copper) ++ * 82545EM Gigabit Ethernet Controller (Fiber) ++ * 82545GM Gigabit Ethernet Controller ++ * 82546EB Gigabit Ethernet Controller (Copper) ++ * 82546EB Gigabit Ethernet Controller (Fiber) ++ * 82546GB Gigabit Ethernet Controller ++ */ ++ ++#include "e1000_api.h" ++ ++static s32 e1000_init_phy_params_82540(struct e1000_hw *hw); ++static s32 e1000_init_nvm_params_82540(struct e1000_hw *hw); ++static s32 e1000_init_mac_params_82540(struct e1000_hw *hw); ++static s32 e1000_adjust_serdes_amplitude_82540(struct e1000_hw *hw); ++static void e1000_clear_hw_cntrs_82540(struct e1000_hw *hw); ++static s32 e1000_init_hw_82540(struct e1000_hw *hw); ++static s32 e1000_reset_hw_82540(struct e1000_hw *hw); ++static s32 e1000_set_phy_mode_82540(struct e1000_hw *hw); ++static s32 e1000_set_vco_speed_82540(struct e1000_hw *hw); ++static s32 e1000_setup_copper_link_82540(struct e1000_hw *hw); ++static s32 e1000_setup_fiber_serdes_link_82540(struct e1000_hw *hw); ++static void e1000_power_down_phy_copper_82540(struct e1000_hw *hw); ++ ++/** ++ * e1000_init_phy_params_82540 - Init PHY func ptrs. ++ * @hw: pointer to the HW structure ++ **/ ++static s32 e1000_init_phy_params_82540(struct e1000_hw *hw) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ s32 ret_val = E1000_SUCCESS; ++ ++ phy->addr = 1; ++ phy->autoneg_mask = AUTONEG_ADVERTISE_SPEED_DEFAULT; ++ phy->reset_delay_us = 10000; ++ phy->type = e1000_phy_m88; ++ ++ /* Function Pointers */ ++ phy->ops.check_polarity = e1000_check_polarity_m88; ++ phy->ops.commit = e1000_phy_sw_reset_generic; ++ phy->ops.force_speed_duplex = e1000_phy_force_speed_duplex_m88; ++ phy->ops.get_cable_length = e1000_get_cable_length_m88; ++ phy->ops.get_cfg_done = e1000_get_cfg_done_generic; ++ phy->ops.read_reg = e1000_read_phy_reg_m88; ++ phy->ops.reset = e1000_phy_hw_reset_generic; ++ phy->ops.write_reg = e1000_write_phy_reg_m88; ++ phy->ops.get_info = e1000_get_phy_info_m88; ++ phy->ops.power_up = e1000_power_up_phy_copper; ++ phy->ops.power_down = e1000_power_down_phy_copper_82540; ++ ++ ret_val = e1000_get_phy_id(hw); ++ if (ret_val) ++ goto out; ++ ++ /* Verify phy id */ ++ switch (hw->mac.type) { ++ case e1000_82540: ++ case e1000_82545: ++ case e1000_82545_rev_3: ++ case e1000_82546: ++ case e1000_82546_rev_3: ++ if (phy->id == M88E1011_I_PHY_ID) ++ break; ++ /* Fall Through */ ++ default: ++ ret_val = -E1000_ERR_PHY; ++ goto out; ++ break; ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_init_nvm_params_82540 - Init NVM func ptrs. ++ * @hw: pointer to the HW structure ++ **/ ++static s32 e1000_init_nvm_params_82540(struct e1000_hw *hw) ++{ ++ struct e1000_nvm_info *nvm = &hw->nvm; ++ u32 eecd = E1000_READ_REG(hw, E1000_EECD); ++ ++ DEBUGFUNC("e1000_init_nvm_params_82540"); ++ ++ nvm->type = e1000_nvm_eeprom_microwire; ++ nvm->delay_usec = 50; ++ nvm->opcode_bits = 3; ++ switch (nvm->override) { ++ case e1000_nvm_override_microwire_large: ++ nvm->address_bits = 8; ++ nvm->word_size = 256; ++ break; ++ case e1000_nvm_override_microwire_small: ++ nvm->address_bits = 6; ++ nvm->word_size = 64; ++ break; ++ default: ++ nvm->address_bits = eecd & E1000_EECD_SIZE ? 8 : 6; ++ nvm->word_size = eecd & E1000_EECD_SIZE ? 256 : 64; ++ break; ++ } ++ ++ /* Function Pointers */ ++ nvm->ops.acquire = e1000_acquire_nvm_generic; ++ nvm->ops.read = e1000_read_nvm_microwire; ++ nvm->ops.release = e1000_release_nvm_generic; ++ nvm->ops.update = e1000_update_nvm_checksum_generic; ++ nvm->ops.valid_led_default = e1000_valid_led_default_generic; ++ nvm->ops.validate = e1000_validate_nvm_checksum_generic; ++ nvm->ops.write = e1000_write_nvm_microwire; ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_init_mac_params_82540 - Init MAC func ptrs. ++ * @hw: pointer to the HW structure ++ **/ ++static s32 e1000_init_mac_params_82540(struct e1000_hw *hw) ++{ ++ struct e1000_mac_info *mac = &hw->mac; ++ s32 ret_val = E1000_SUCCESS; ++ ++ DEBUGFUNC("e1000_init_mac_params_82540"); ++ ++ /* Set media type */ ++ switch (hw->device_id) { ++ case E1000_DEV_ID_82545EM_FIBER: ++ case E1000_DEV_ID_82545GM_FIBER: ++ case E1000_DEV_ID_82546EB_FIBER: ++ case E1000_DEV_ID_82546GB_FIBER: ++ hw->phy.media_type = e1000_media_type_fiber; ++ break; ++ case E1000_DEV_ID_82545GM_SERDES: ++ case E1000_DEV_ID_82546GB_SERDES: ++ hw->phy.media_type = e1000_media_type_internal_serdes; ++ break; ++ default: ++ hw->phy.media_type = e1000_media_type_copper; ++ break; ++ } ++ ++ /* Set mta register count */ ++ mac->mta_reg_count = 128; ++ /* Set rar entry count */ ++ mac->rar_entry_count = E1000_RAR_ENTRIES; ++ ++ /* Function pointers */ ++ ++ /* bus type/speed/width */ ++ mac->ops.get_bus_info = e1000_get_bus_info_pci_generic; ++ /* function id */ ++ mac->ops.set_lan_id = e1000_set_lan_id_multi_port_pci; ++ /* reset */ ++ mac->ops.reset_hw = e1000_reset_hw_82540; ++ /* hw initialization */ ++ mac->ops.init_hw = e1000_init_hw_82540; ++ /* link setup */ ++ mac->ops.setup_link = e1000_setup_link_generic; ++ /* physical interface setup */ ++ mac->ops.setup_physical_interface = ++ (hw->phy.media_type == e1000_media_type_copper) ++ ? e1000_setup_copper_link_82540 ++ : e1000_setup_fiber_serdes_link_82540; ++ /* check for link */ ++ switch (hw->phy.media_type) { ++ case e1000_media_type_copper: ++ mac->ops.check_for_link = e1000_check_for_copper_link_generic; ++ break; ++ case e1000_media_type_fiber: ++ mac->ops.check_for_link = e1000_check_for_fiber_link_generic; ++ break; ++ case e1000_media_type_internal_serdes: ++ mac->ops.check_for_link = e1000_check_for_serdes_link_generic; ++ break; ++ default: ++ ret_val = -E1000_ERR_CONFIG; ++ goto out; ++ break; ++ } ++ /* link info */ ++ mac->ops.get_link_up_info = ++ (hw->phy.media_type == e1000_media_type_copper) ++ ? e1000_get_speed_and_duplex_copper_generic ++ : e1000_get_speed_and_duplex_fiber_serdes_generic; ++ /* multicast address update */ ++ mac->ops.update_mc_addr_list = e1000_update_mc_addr_list_generic; ++ /* writing VFTA */ ++ mac->ops.write_vfta = e1000_write_vfta_generic; ++ /* clearing VFTA */ ++ mac->ops.clear_vfta = e1000_clear_vfta_generic; ++ /* setting MTA */ ++ mac->ops.mta_set = e1000_mta_set_generic; ++ /* ID LED init */ ++ mac->ops.id_led_init = e1000_id_led_init_generic; ++ /* setup LED */ ++ mac->ops.setup_led = e1000_setup_led_generic; ++ /* cleanup LED */ ++ mac->ops.cleanup_led = e1000_cleanup_led_generic; ++ /* turn on/off LED */ ++ mac->ops.led_on = e1000_led_on_generic; ++ mac->ops.led_off = e1000_led_off_generic; ++ /* clear hardware counters */ ++ mac->ops.clear_hw_cntrs = e1000_clear_hw_cntrs_82540; ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_init_function_pointers_82540 - Init func ptrs. ++ * @hw: pointer to the HW structure ++ * ++ * Called to initialize all function pointers and parameters. ++ **/ ++void e1000_init_function_pointers_82540(struct e1000_hw *hw) ++{ ++ DEBUGFUNC("e1000_init_function_pointers_82540"); ++ ++ hw->mac.ops.init_params = e1000_init_mac_params_82540; ++ hw->nvm.ops.init_params = e1000_init_nvm_params_82540; ++ hw->phy.ops.init_params = e1000_init_phy_params_82540; ++} ++ ++/** ++ * e1000_reset_hw_82540 - Reset hardware ++ * @hw: pointer to the HW structure ++ * ++ * This resets the hardware into a known state. ++ **/ ++static s32 e1000_reset_hw_82540(struct e1000_hw *hw) ++{ ++ u32 ctrl, icr, manc; ++ s32 ret_val = E1000_SUCCESS; ++ ++ DEBUGFUNC("e1000_reset_hw_82540"); ++ ++ DEBUGOUT("Masking off all interrupts\n"); ++ E1000_WRITE_REG(hw, E1000_IMC, 0xFFFFFFFF); ++ ++ E1000_WRITE_REG(hw, E1000_RCTL, 0); ++ E1000_WRITE_REG(hw, E1000_TCTL, E1000_TCTL_PSP); ++ E1000_WRITE_FLUSH(hw); ++ ++ /* ++ * Delay to allow any outstanding PCI transactions to complete ++ * before resetting the device. ++ */ ++ msec_delay(10); ++ ++ ctrl = E1000_READ_REG(hw, E1000_CTRL); ++ ++ DEBUGOUT("Issuing a global reset to 82540/82545/82546 MAC\n"); ++ switch (hw->mac.type) { ++ case e1000_82545_rev_3: ++ case e1000_82546_rev_3: ++ E1000_WRITE_REG(hw, E1000_CTRL_DUP, ctrl | E1000_CTRL_RST); ++ break; ++ default: ++ /* ++ * These controllers can't ack the 64-bit write when ++ * issuing the reset, so we use IO-mapping as a ++ * workaround to issue the reset. ++ */ ++ E1000_WRITE_REG_IO(hw, E1000_CTRL, ctrl | E1000_CTRL_RST); ++ break; ++ } ++ ++ /* Wait for EEPROM reload */ ++ msec_delay(5); ++ ++ /* Disable HW ARPs on ASF enabled adapters */ ++ manc = E1000_READ_REG(hw, E1000_MANC); ++ manc &= ~E1000_MANC_ARP_EN; ++ E1000_WRITE_REG(hw, E1000_MANC, manc); ++ ++ E1000_WRITE_REG(hw, E1000_IMC, 0xffffffff); ++ icr = E1000_READ_REG(hw, E1000_ICR); ++ ++ return ret_val; ++} ++ ++/** ++ * e1000_init_hw_82540 - Initialize hardware ++ * @hw: pointer to the HW structure ++ * ++ * This inits the hardware readying it for operation. ++ **/ ++static s32 e1000_init_hw_82540(struct e1000_hw *hw) ++{ ++ struct e1000_mac_info *mac = &hw->mac; ++ u32 txdctl, ctrl_ext; ++ s32 ret_val = E1000_SUCCESS; ++ u16 i; ++ ++ DEBUGFUNC("e1000_init_hw_82540"); ++ ++ /* Initialize identification LED */ ++ ret_val = mac->ops.id_led_init(hw); ++ if (ret_val) { ++ DEBUGOUT("Error initializing identification LED\n"); ++ /* This is not fatal and we should not stop init due to this */ ++ } ++ ++ /* Disabling VLAN filtering */ ++ DEBUGOUT("Initializing the IEEE VLAN\n"); ++ if (mac->type < e1000_82545_rev_3) ++ E1000_WRITE_REG(hw, E1000_VET, 0); ++ ++ mac->ops.clear_vfta(hw); ++ ++ /* Setup the receive address. */ ++ e1000_init_rx_addrs_generic(hw, mac->rar_entry_count); ++ ++ /* Zero out the Multicast HASH table */ ++ DEBUGOUT("Zeroing the MTA\n"); ++ for (i = 0; i < mac->mta_reg_count; i++) { ++ E1000_WRITE_REG_ARRAY(hw, E1000_MTA, i, 0); ++ /* ++ * Avoid back to back register writes by adding the register ++ * read (flush). This is to protect against some strange ++ * bridge configurations that may issue Memory Write Block ++ * (MWB) to our register space. The *_rev_3 hardware at ++ * least doesn't respond correctly to every other dword in an ++ * MWB to our register space. ++ */ ++ E1000_WRITE_FLUSH(hw); ++ } ++ ++ if (mac->type < e1000_82545_rev_3) ++ e1000_pcix_mmrbc_workaround_generic(hw); ++ ++ /* Setup link and flow control */ ++ ret_val = mac->ops.setup_link(hw); ++ ++ txdctl = E1000_READ_REG(hw, E1000_TXDCTL(0)); ++ txdctl = (txdctl & ~E1000_TXDCTL_WTHRESH) | ++ E1000_TXDCTL_FULL_TX_DESC_WB; ++ E1000_WRITE_REG(hw, E1000_TXDCTL(0), txdctl); ++ ++ /* ++ * Clear all of the statistics registers (clear on read). It is ++ * important that we do this after we have tried to establish link ++ * because the symbol error count will increment wildly if there ++ * is no link. ++ */ ++ e1000_clear_hw_cntrs_82540(hw); ++ ++ if ((hw->device_id == E1000_DEV_ID_82546GB_QUAD_COPPER) || ++ (hw->device_id == E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3)) { ++ ctrl_ext = E1000_READ_REG(hw, E1000_CTRL_EXT); ++ /* ++ * Relaxed ordering must be disabled to avoid a parity ++ * error crash in a PCI slot. ++ */ ++ ctrl_ext |= E1000_CTRL_EXT_RO_DIS; ++ E1000_WRITE_REG(hw, E1000_CTRL_EXT, ctrl_ext); ++ } ++ ++ return ret_val; ++} ++ ++/** ++ * e1000_setup_copper_link_82540 - Configure copper link settings ++ * @hw: pointer to the HW structure ++ * ++ * Calls the appropriate function to configure the link for auto-neg or forced ++ * speed and duplex. Then we check for link, once link is established calls ++ * to configure collision distance and flow control are called. If link is ++ * not established, we return -E1000_ERR_PHY (-2). ++ **/ ++static s32 e1000_setup_copper_link_82540(struct e1000_hw *hw) ++{ ++ u32 ctrl; ++ s32 ret_val = E1000_SUCCESS; ++ u16 data; ++ ++ DEBUGFUNC("e1000_setup_copper_link_82540"); ++ ++ ctrl = E1000_READ_REG(hw, E1000_CTRL); ++ ctrl |= E1000_CTRL_SLU; ++ ctrl &= ~(E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX); ++ E1000_WRITE_REG(hw, E1000_CTRL, ctrl); ++ ++ ret_val = e1000_set_phy_mode_82540(hw); ++ if (ret_val) ++ goto out; ++ ++ if (hw->mac.type == e1000_82545_rev_3 || ++ hw->mac.type == e1000_82546_rev_3) { ++ ret_val = hw->phy.ops.read_reg(hw, M88E1000_PHY_SPEC_CTRL, &data); ++ if (ret_val) ++ goto out; ++ data |= 0x00000008; ++ ret_val = hw->phy.ops.write_reg(hw, M88E1000_PHY_SPEC_CTRL, data); ++ if (ret_val) ++ goto out; ++ } ++ ++ ret_val = e1000_copper_link_setup_m88(hw); ++ if (ret_val) ++ goto out; ++ ++ ret_val = e1000_setup_copper_link_generic(hw); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_setup_fiber_serdes_link_82540 - Setup link for fiber/serdes ++ * @hw: pointer to the HW structure ++ * ++ * Set the output amplitude to the value in the EEPROM and adjust the VCO ++ * speed to improve Bit Error Rate (BER) performance. Configures collision ++ * distance and flow control for fiber and serdes links. Upon successful ++ * setup, poll for link. ++ **/ ++static s32 e1000_setup_fiber_serdes_link_82540(struct e1000_hw *hw) ++{ ++ struct e1000_mac_info *mac = &hw->mac; ++ s32 ret_val = E1000_SUCCESS; ++ ++ DEBUGFUNC("e1000_setup_fiber_serdes_link_82540"); ++ ++ switch (mac->type) { ++ case e1000_82545_rev_3: ++ case e1000_82546_rev_3: ++ if (hw->phy.media_type == e1000_media_type_internal_serdes) { ++ /* ++ * If we're on serdes media, adjust the output ++ * amplitude to value set in the EEPROM. ++ */ ++ ret_val = e1000_adjust_serdes_amplitude_82540(hw); ++ if (ret_val) ++ goto out; ++ } ++ /* Adjust VCO speed to improve BER performance */ ++ ret_val = e1000_set_vco_speed_82540(hw); ++ if (ret_val) ++ goto out; ++ default: ++ break; ++ } ++ ++ ret_val = e1000_setup_fiber_serdes_link_generic(hw); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_adjust_serdes_amplitude_82540 - Adjust amplitude based on EEPROM ++ * @hw: pointer to the HW structure ++ * ++ * Adjust the SERDES output amplitude based on the EEPROM settings. ++ **/ ++static s32 e1000_adjust_serdes_amplitude_82540(struct e1000_hw *hw) ++{ ++ s32 ret_val = E1000_SUCCESS; ++ u16 nvm_data; ++ ++ DEBUGFUNC("e1000_adjust_serdes_amplitude_82540"); ++ ++ ret_val = hw->nvm.ops.read(hw, NVM_SERDES_AMPLITUDE, 1, &nvm_data); ++ if (ret_val) ++ goto out; ++ ++ if (nvm_data != NVM_RESERVED_WORD) { ++ /* Adjust serdes output amplitude only. */ ++ nvm_data &= NVM_SERDES_AMPLITUDE_MASK; ++ ret_val = hw->phy.ops.write_reg(hw, ++ M88E1000_PHY_EXT_CTRL, ++ nvm_data); ++ if (ret_val) ++ goto out; ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_set_vco_speed_82540 - Set VCO speed for better performance ++ * @hw: pointer to the HW structure ++ * ++ * Set the VCO speed to improve Bit Error Rate (BER) performance. ++ **/ ++static s32 e1000_set_vco_speed_82540(struct e1000_hw *hw) ++{ ++ s32 ret_val = E1000_SUCCESS; ++ u16 default_page = 0; ++ u16 phy_data; ++ ++ DEBUGFUNC("e1000_set_vco_speed_82540"); ++ ++ /* Set PHY register 30, page 5, bit 8 to 0 */ ++ ++ ret_val = hw->phy.ops.read_reg(hw, ++ M88E1000_PHY_PAGE_SELECT, ++ &default_page); ++ if (ret_val) ++ goto out; ++ ++ ret_val = hw->phy.ops.write_reg(hw, M88E1000_PHY_PAGE_SELECT, 0x0005); ++ if (ret_val) ++ goto out; ++ ++ ret_val = hw->phy.ops.read_reg(hw, M88E1000_PHY_GEN_CONTROL, &phy_data); ++ if (ret_val) ++ goto out; ++ ++ phy_data &= ~M88E1000_PHY_VCO_REG_BIT8; ++ ret_val = hw->phy.ops.write_reg(hw, M88E1000_PHY_GEN_CONTROL, phy_data); ++ if (ret_val) ++ goto out; ++ ++ /* Set PHY register 30, page 4, bit 11 to 1 */ ++ ++ ret_val = hw->phy.ops.write_reg(hw, M88E1000_PHY_PAGE_SELECT, 0x0004); ++ if (ret_val) ++ goto out; ++ ++ ret_val = hw->phy.ops.read_reg(hw, M88E1000_PHY_GEN_CONTROL, &phy_data); ++ if (ret_val) ++ goto out; ++ ++ phy_data |= M88E1000_PHY_VCO_REG_BIT11; ++ ret_val = hw->phy.ops.write_reg(hw, M88E1000_PHY_GEN_CONTROL, phy_data); ++ if (ret_val) ++ goto out; ++ ++ ret_val = hw->phy.ops.write_reg(hw, M88E1000_PHY_PAGE_SELECT, ++ default_page); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_set_phy_mode_82540 - Set PHY to class A mode ++ * @hw: pointer to the HW structure ++ * ++ * Sets the PHY to class A mode and assumes the following operations will ++ * follow to enable the new class mode: ++ * 1. Do a PHY soft reset. ++ * 2. Restart auto-negotiation or force link. ++ **/ ++static s32 e1000_set_phy_mode_82540(struct e1000_hw *hw) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ s32 ret_val = E1000_SUCCESS; ++ u16 nvm_data; ++ ++ DEBUGFUNC("e1000_set_phy_mode_82540"); ++ ++ if (hw->mac.type != e1000_82545_rev_3) ++ goto out; ++ ++ ret_val = hw->nvm.ops.read(hw, NVM_PHY_CLASS_WORD, 1, &nvm_data); ++ if (ret_val) { ++ ret_val = -E1000_ERR_PHY; ++ goto out; ++ } ++ ++ if ((nvm_data != NVM_RESERVED_WORD) && (nvm_data & NVM_PHY_CLASS_A)) { ++ ret_val = hw->phy.ops.write_reg(hw, M88E1000_PHY_PAGE_SELECT, ++ 0x000B); ++ if (ret_val) { ++ ret_val = -E1000_ERR_PHY; ++ goto out; ++ } ++ ret_val = hw->phy.ops.write_reg(hw, ++ M88E1000_PHY_GEN_CONTROL, ++ 0x8104); ++ if (ret_val) { ++ ret_val = -E1000_ERR_PHY; ++ goto out; ++ } ++ ++ phy->reset_disable = false; ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_power_down_phy_copper_82540 - Remove link in case of PHY power down ++ * @hw: pointer to the HW structure ++ * ++ * In the case of a PHY power down to save power, or to turn off link during a ++ * driver unload, or wake on lan is not enabled, remove the link. ++ **/ ++static void e1000_power_down_phy_copper_82540(struct e1000_hw *hw) ++{ ++ /* If the management interface is not enabled, then power down */ ++ if (!(E1000_READ_REG(hw, E1000_MANC) & E1000_MANC_SMBUS_EN)) ++ e1000_power_down_phy_copper(hw); ++ ++ return; ++} ++ ++/** ++ * e1000_clear_hw_cntrs_82540 - Clear device specific hardware counters ++ * @hw: pointer to the HW structure ++ * ++ * Clears the hardware counters by reading the counter registers. ++ **/ ++static void e1000_clear_hw_cntrs_82540(struct e1000_hw *hw) ++{ ++ DEBUGFUNC("e1000_clear_hw_cntrs_82540"); ++ ++ e1000_clear_hw_cntrs_base_generic(hw); ++ ++ E1000_READ_REG(hw, E1000_PRC64); ++ E1000_READ_REG(hw, E1000_PRC127); ++ E1000_READ_REG(hw, E1000_PRC255); ++ E1000_READ_REG(hw, E1000_PRC511); ++ E1000_READ_REG(hw, E1000_PRC1023); ++ E1000_READ_REG(hw, E1000_PRC1522); ++ E1000_READ_REG(hw, E1000_PTC64); ++ E1000_READ_REG(hw, E1000_PTC127); ++ E1000_READ_REG(hw, E1000_PTC255); ++ E1000_READ_REG(hw, E1000_PTC511); ++ E1000_READ_REG(hw, E1000_PTC1023); ++ E1000_READ_REG(hw, E1000_PTC1522); ++ ++ E1000_READ_REG(hw, E1000_ALGNERRC); ++ E1000_READ_REG(hw, E1000_RXERRC); ++ E1000_READ_REG(hw, E1000_TNCRS); ++ E1000_READ_REG(hw, E1000_CEXTERR); ++ E1000_READ_REG(hw, E1000_TSCTC); ++ E1000_READ_REG(hw, E1000_TSCTFC); ++ ++ E1000_READ_REG(hw, E1000_MGTPRC); ++ E1000_READ_REG(hw, E1000_MGTPDC); ++ E1000_READ_REG(hw, E1000_MGTPTC); ++} ++ +diff -r d03036c09699 drivers/net/e1000/e1000_82541.c +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/e1000/e1000_82541.c Mon Jun 15 11:43:11 2009 +0100 +@@ -0,0 +1,1279 @@ ++/******************************************************************************* ++ ++ Intel PRO/1000 Linux driver ++ Copyright(c) 1999 - 2008 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ Linux NICS ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++/* ++ * 82541EI Gigabit Ethernet Controller ++ * 82541ER Gigabit Ethernet Controller ++ * 82541GI Gigabit Ethernet Controller ++ * 82541PI Gigabit Ethernet Controller ++ * 82547EI Gigabit Ethernet Controller ++ * 82547GI Gigabit Ethernet Controller ++ */ ++ ++#include "e1000_api.h" ++ ++static s32 e1000_init_phy_params_82541(struct e1000_hw *hw); ++static s32 e1000_init_nvm_params_82541(struct e1000_hw *hw); ++static s32 e1000_init_mac_params_82541(struct e1000_hw *hw); ++static s32 e1000_reset_hw_82541(struct e1000_hw *hw); ++static s32 e1000_init_hw_82541(struct e1000_hw *hw); ++static s32 e1000_get_link_up_info_82541(struct e1000_hw *hw, u16 *speed, ++ u16 *duplex); ++static s32 e1000_phy_hw_reset_82541(struct e1000_hw *hw); ++static s32 e1000_setup_copper_link_82541(struct e1000_hw *hw); ++static s32 e1000_check_for_link_82541(struct e1000_hw *hw); ++static s32 e1000_get_cable_length_igp_82541(struct e1000_hw *hw); ++static s32 e1000_set_d3_lplu_state_82541(struct e1000_hw *hw, ++ bool active); ++static s32 e1000_setup_led_82541(struct e1000_hw *hw); ++static s32 e1000_cleanup_led_82541(struct e1000_hw *hw); ++static void e1000_clear_hw_cntrs_82541(struct e1000_hw *hw); ++static s32 e1000_config_dsp_after_link_change_82541(struct e1000_hw *hw, ++ bool link_up); ++static s32 e1000_phy_init_script_82541(struct e1000_hw *hw); ++static void e1000_power_down_phy_copper_82541(struct e1000_hw *hw); ++ ++static const u16 e1000_igp_cable_length_table[] = ++ { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, ++ 5, 10, 10, 10, 10, 10, 10, 10, 20, 20, 20, 20, 20, 25, 25, 25, ++ 25, 25, 25, 25, 30, 30, 30, 30, 40, 40, 40, 40, 40, 40, 40, 40, ++ 40, 50, 50, 50, 50, 50, 50, 50, 60, 60, 60, 60, 60, 60, 60, 60, ++ 60, 70, 70, 70, 70, 70, 70, 80, 80, 80, 80, 80, 80, 90, 90, 90, ++ 90, 90, 90, 90, 90, 90, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, ++ 100, 100, 100, 100, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, ++ 110, 110, 110, 110, 110, 110, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120}; ++#define IGP01E1000_AGC_LENGTH_TABLE_SIZE \ ++ (sizeof(e1000_igp_cable_length_table) / \ ++ sizeof(e1000_igp_cable_length_table[0])) ++ ++/** ++ * e1000_init_phy_params_82541 - Init PHY func ptrs. ++ * @hw: pointer to the HW structure ++ **/ ++static s32 e1000_init_phy_params_82541(struct e1000_hw *hw) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ s32 ret_val = E1000_SUCCESS; ++ ++ DEBUGFUNC("e1000_init_phy_params_82541"); ++ ++ phy->addr = 1; ++ phy->autoneg_mask = AUTONEG_ADVERTISE_SPEED_DEFAULT; ++ phy->reset_delay_us = 10000; ++ phy->type = e1000_phy_igp; ++ ++ /* Function Pointers */ ++ phy->ops.check_polarity = e1000_check_polarity_igp; ++ phy->ops.force_speed_duplex = e1000_phy_force_speed_duplex_igp; ++ phy->ops.get_cable_length = e1000_get_cable_length_igp_82541; ++ phy->ops.get_cfg_done = e1000_get_cfg_done_generic; ++ phy->ops.get_info = e1000_get_phy_info_igp; ++ phy->ops.read_reg = e1000_read_phy_reg_igp; ++ phy->ops.reset = e1000_phy_hw_reset_82541; ++ phy->ops.set_d3_lplu_state = e1000_set_d3_lplu_state_82541; ++ phy->ops.write_reg = e1000_write_phy_reg_igp; ++ phy->ops.power_up = e1000_power_up_phy_copper; ++ phy->ops.power_down = e1000_power_down_phy_copper_82541; ++ ++ ret_val = e1000_get_phy_id(hw); ++ if (ret_val) ++ goto out; ++ ++ /* Verify phy id */ ++ if (phy->id != IGP01E1000_I_PHY_ID) { ++ ret_val = -E1000_ERR_PHY; ++ goto out; ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_init_nvm_params_82541 - Init NVM func ptrs. ++ * @hw: pointer to the HW structure ++ **/ ++static s32 e1000_init_nvm_params_82541(struct e1000_hw *hw) ++{ ++ struct e1000_nvm_info *nvm = &hw->nvm; ++ s32 ret_val = E1000_SUCCESS; ++ u32 eecd = E1000_READ_REG(hw, E1000_EECD); ++ u16 size; ++ ++ DEBUGFUNC("e1000_init_nvm_params_82541"); ++ ++ switch (nvm->override) { ++ case e1000_nvm_override_spi_large: ++ nvm->type = e1000_nvm_eeprom_spi; ++ eecd |= E1000_EECD_ADDR_BITS; ++ break; ++ case e1000_nvm_override_spi_small: ++ nvm->type = e1000_nvm_eeprom_spi; ++ eecd &= ~E1000_EECD_ADDR_BITS; ++ break; ++ case e1000_nvm_override_microwire_large: ++ nvm->type = e1000_nvm_eeprom_microwire; ++ eecd |= E1000_EECD_SIZE; ++ break; ++ case e1000_nvm_override_microwire_small: ++ nvm->type = e1000_nvm_eeprom_microwire; ++ eecd &= ~E1000_EECD_SIZE; ++ break; ++ default: ++ nvm->type = eecd & E1000_EECD_TYPE ++ ? e1000_nvm_eeprom_spi ++ : e1000_nvm_eeprom_microwire; ++ break; ++ } ++ ++ if (nvm->type == e1000_nvm_eeprom_spi) { ++ nvm->address_bits = (eecd & E1000_EECD_ADDR_BITS) ++ ? 16 : 8; ++ nvm->delay_usec = 1; ++ nvm->opcode_bits = 8; ++ nvm->page_size = (eecd & E1000_EECD_ADDR_BITS) ++ ? 32 : 8; ++ ++ /* Function Pointers */ ++ nvm->ops.acquire = e1000_acquire_nvm_generic; ++ nvm->ops.read = e1000_read_nvm_spi; ++ nvm->ops.release = e1000_release_nvm_generic; ++ nvm->ops.update = e1000_update_nvm_checksum_generic; ++ nvm->ops.valid_led_default = e1000_valid_led_default_generic; ++ nvm->ops.validate = e1000_validate_nvm_checksum_generic; ++ nvm->ops.write = e1000_write_nvm_spi; ++ ++ /* ++ * nvm->word_size must be discovered after the pointers ++ * are set so we can verify the size from the nvm image ++ * itself. Temporarily set it to a dummy value so the ++ * read will work. ++ */ ++ nvm->word_size = 64; ++ ret_val = nvm->ops.read(hw, NVM_CFG, 1, &size); ++ if (ret_val) ++ goto out; ++ size = (size & NVM_SIZE_MASK) >> NVM_SIZE_SHIFT; ++ /* ++ * if size != 0, it can be added to a constant and become ++ * the left-shift value to set the word_size. Otherwise, ++ * word_size stays at 64. ++ */ ++ if (size) { ++ size += NVM_WORD_SIZE_BASE_SHIFT_82541; ++ nvm->word_size = 1 << size; ++ } ++ } else { ++ nvm->address_bits = (eecd & E1000_EECD_ADDR_BITS) ++ ? 8 : 6; ++ nvm->delay_usec = 50; ++ nvm->opcode_bits = 3; ++ nvm->word_size = (eecd & E1000_EECD_ADDR_BITS) ++ ? 256 : 64; ++ ++ /* Function Pointers */ ++ nvm->ops.acquire = e1000_acquire_nvm_generic; ++ nvm->ops.read = e1000_read_nvm_microwire; ++ nvm->ops.release = e1000_release_nvm_generic; ++ nvm->ops.update = e1000_update_nvm_checksum_generic; ++ nvm->ops.valid_led_default = e1000_valid_led_default_generic; ++ nvm->ops.validate = e1000_validate_nvm_checksum_generic; ++ nvm->ops.write = e1000_write_nvm_microwire; ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_init_mac_params_82541 - Init MAC func ptrs. ++ * @hw: pointer to the HW structure ++ **/ ++static s32 e1000_init_mac_params_82541(struct e1000_hw *hw) ++{ ++ struct e1000_mac_info *mac = &hw->mac; ++ ++ DEBUGFUNC("e1000_init_mac_params_82541"); ++ ++ /* Set media type */ ++ hw->phy.media_type = e1000_media_type_copper; ++ /* Set mta register count */ ++ mac->mta_reg_count = 128; ++ /* Set rar entry count */ ++ mac->rar_entry_count = E1000_RAR_ENTRIES; ++ /* Set if part includes ASF firmware */ ++ mac->asf_firmware_present = true; ++ ++ /* Function Pointers */ ++ ++ /* bus type/speed/width */ ++ mac->ops.get_bus_info = e1000_get_bus_info_pci_generic; ++ /* function id */ ++ mac->ops.set_lan_id = e1000_set_lan_id_single_port; ++ /* reset */ ++ mac->ops.reset_hw = e1000_reset_hw_82541; ++ /* hw initialization */ ++ mac->ops.init_hw = e1000_init_hw_82541; ++ /* link setup */ ++ mac->ops.setup_link = e1000_setup_link_generic; ++ /* physical interface link setup */ ++ mac->ops.setup_physical_interface = e1000_setup_copper_link_82541; ++ /* check for link */ ++ mac->ops.check_for_link = e1000_check_for_link_82541; ++ /* link info */ ++ mac->ops.get_link_up_info = e1000_get_link_up_info_82541; ++ /* multicast address update */ ++ mac->ops.update_mc_addr_list = e1000_update_mc_addr_list_generic; ++ /* writing VFTA */ ++ mac->ops.write_vfta = e1000_write_vfta_generic; ++ /* clearing VFTA */ ++ mac->ops.clear_vfta = e1000_clear_vfta_generic; ++ /* setting MTA */ ++ mac->ops.mta_set = e1000_mta_set_generic; ++ /* ID LED init */ ++ mac->ops.id_led_init = e1000_id_led_init_generic; ++ /* setup LED */ ++ mac->ops.setup_led = e1000_setup_led_82541; ++ /* cleanup LED */ ++ mac->ops.cleanup_led = e1000_cleanup_led_82541; ++ /* turn on/off LED */ ++ mac->ops.led_on = e1000_led_on_generic; ++ mac->ops.led_off = e1000_led_off_generic; ++ /* clear hardware counters */ ++ mac->ops.clear_hw_cntrs = e1000_clear_hw_cntrs_82541; ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_init_function_pointers_82541 - Init func ptrs. ++ * @hw: pointer to the HW structure ++ * ++ * Called to initialize all function pointers and parameters. ++ **/ ++void e1000_init_function_pointers_82541(struct e1000_hw *hw) ++{ ++ DEBUGFUNC("e1000_init_function_pointers_82541"); ++ ++ hw->mac.ops.init_params = e1000_init_mac_params_82541; ++ hw->nvm.ops.init_params = e1000_init_nvm_params_82541; ++ hw->phy.ops.init_params = e1000_init_phy_params_82541; ++} ++ ++/** ++ * e1000_reset_hw_82541 - Reset hardware ++ * @hw: pointer to the HW structure ++ * ++ * This resets the hardware into a known state. ++ **/ ++static s32 e1000_reset_hw_82541(struct e1000_hw *hw) ++{ ++ u32 ledctl, ctrl, icr, manc; ++ ++ DEBUGFUNC("e1000_reset_hw_82541"); ++ ++ DEBUGOUT("Masking off all interrupts\n"); ++ E1000_WRITE_REG(hw, E1000_IMC, 0xFFFFFFFF); ++ ++ E1000_WRITE_REG(hw, E1000_RCTL, 0); ++ E1000_WRITE_REG(hw, E1000_TCTL, E1000_TCTL_PSP); ++ E1000_WRITE_FLUSH(hw); ++ ++ /* ++ * Delay to allow any outstanding PCI transactions to complete ++ * before resetting the device. ++ */ ++ msec_delay(10); ++ ++ ctrl = E1000_READ_REG(hw, E1000_CTRL); ++ ++ /* Must reset the Phy before resetting the MAC */ ++ if ((hw->mac.type == e1000_82541) || (hw->mac.type == e1000_82547)) { ++ E1000_WRITE_REG(hw, E1000_CTRL, (ctrl | E1000_CTRL_PHY_RST)); ++ msec_delay(5); ++ } ++ ++ DEBUGOUT("Issuing a global reset to 82541/82547 MAC\n"); ++ switch (hw->mac.type) { ++ case e1000_82541: ++ case e1000_82541_rev_2: ++ /* ++ * These controllers can't ack the 64-bit write when ++ * issuing the reset, so we use IO-mapping as a ++ * workaround to issue the reset. ++ */ ++ E1000_WRITE_REG_IO(hw, E1000_CTRL, ctrl | E1000_CTRL_RST); ++ break; ++ default: ++ E1000_WRITE_REG(hw, E1000_CTRL, ctrl | E1000_CTRL_RST); ++ break; ++ } ++ ++ /* Wait for NVM reload */ ++ msec_delay(20); ++ ++ /* Disable HW ARPs on ASF enabled adapters */ ++ manc = E1000_READ_REG(hw, E1000_MANC); ++ manc &= ~E1000_MANC_ARP_EN; ++ E1000_WRITE_REG(hw, E1000_MANC, manc); ++ ++ if ((hw->mac.type == e1000_82541) || (hw->mac.type == e1000_82547)) { ++ e1000_phy_init_script_82541(hw); ++ ++ /* Configure activity LED after Phy reset */ ++ ledctl = E1000_READ_REG(hw, E1000_LEDCTL); ++ ledctl &= IGP_ACTIVITY_LED_MASK; ++ ledctl |= (IGP_ACTIVITY_LED_ENABLE | IGP_LED3_MODE); ++ E1000_WRITE_REG(hw, E1000_LEDCTL, ledctl); ++ } ++ ++ /* Once again, mask the interrupts */ ++ DEBUGOUT("Masking off all interrupts\n"); ++ E1000_WRITE_REG(hw, E1000_IMC, 0xFFFFFFFF); ++ ++ /* Clear any pending interrupt events. */ ++ icr = E1000_READ_REG(hw, E1000_ICR); ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_init_hw_82541 - Initialize hardware ++ * @hw: pointer to the HW structure ++ * ++ * This inits the hardware readying it for operation. ++ **/ ++static s32 e1000_init_hw_82541(struct e1000_hw *hw) ++{ ++ struct e1000_mac_info *mac = &hw->mac; ++ u32 i, txdctl; ++ s32 ret_val; ++ ++ DEBUGFUNC("e1000_init_hw_82541"); ++ ++ /* Initialize identification LED */ ++ ret_val = mac->ops.id_led_init(hw); ++ if (ret_val) { ++ DEBUGOUT("Error initializing identification LED\n"); ++ /* This is not fatal and we should not stop init due to this */ ++ } ++ ++ /* Disabling VLAN filtering */ ++ DEBUGOUT("Initializing the IEEE VLAN\n"); ++ mac->ops.clear_vfta(hw); ++ ++ /* Setup the receive address. */ ++ e1000_init_rx_addrs_generic(hw, mac->rar_entry_count); ++ ++ /* Zero out the Multicast HASH table */ ++ DEBUGOUT("Zeroing the MTA\n"); ++ for (i = 0; i < mac->mta_reg_count; i++) { ++ E1000_WRITE_REG_ARRAY(hw, E1000_MTA, i, 0); ++ /* ++ * Avoid back to back register writes by adding the register ++ * read (flush). This is to protect against some strange ++ * bridge configurations that may issue Memory Write Block ++ * (MWB) to our register space. ++ */ ++ E1000_WRITE_FLUSH(hw); ++ } ++ ++ /* Setup link and flow control */ ++ ret_val = mac->ops.setup_link(hw); ++ ++ txdctl = E1000_READ_REG(hw, E1000_TXDCTL(0)); ++ txdctl = (txdctl & ~E1000_TXDCTL_WTHRESH) | ++ E1000_TXDCTL_FULL_TX_DESC_WB; ++ E1000_WRITE_REG(hw, E1000_TXDCTL(0), txdctl); ++ ++ /* ++ * Clear all of the statistics registers (clear on read). It is ++ * important that we do this after we have tried to establish link ++ * because the symbol error count will increment wildly if there ++ * is no link. ++ */ ++ e1000_clear_hw_cntrs_82541(hw); ++ ++ return ret_val; ++} ++ ++/** ++ * e1000_get_link_up_info_82541 - Report speed and duplex ++ * @hw: pointer to the HW structure ++ * @speed: pointer to speed buffer ++ * @duplex: pointer to duplex buffer ++ * ++ * Retrieve the current speed and duplex configuration. ++ **/ ++static s32 e1000_get_link_up_info_82541(struct e1000_hw *hw, u16 *speed, ++ u16 *duplex) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ s32 ret_val; ++ u16 data; ++ ++ DEBUGFUNC("e1000_get_link_up_info_82541"); ++ ++ ret_val = e1000_get_speed_and_duplex_copper_generic(hw, speed, duplex); ++ if (ret_val) ++ goto out; ++ ++ if (!phy->speed_downgraded) ++ goto out; ++ ++ /* ++ * IGP01 PHY may advertise full duplex operation after speed ++ * downgrade even if it is operating at half duplex. ++ * Here we set the duplex settings to match the duplex in the ++ * link partner's capabilities. ++ */ ++ ret_val = phy->ops.read_reg(hw, PHY_AUTONEG_EXP, &data); ++ if (ret_val) ++ goto out; ++ ++ if (!(data & NWAY_ER_LP_NWAY_CAPS)) { ++ *duplex = HALF_DUPLEX; ++ } else { ++ ret_val = phy->ops.read_reg(hw, PHY_LP_ABILITY, &data); ++ if (ret_val) ++ goto out; ++ ++ if (*speed == SPEED_100) { ++ if (!(data & NWAY_LPAR_100TX_FD_CAPS)) ++ *duplex = HALF_DUPLEX; ++ } else if (*speed == SPEED_10) { ++ if (!(data & NWAY_LPAR_10T_FD_CAPS)) ++ *duplex = HALF_DUPLEX; ++ } ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_phy_hw_reset_82541 - PHY hardware reset ++ * @hw: pointer to the HW structure ++ * ++ * Verify the reset block is not blocking us from resetting. Acquire ++ * semaphore (if necessary) and read/set/write the device control reset ++ * bit in the PHY. Wait the appropriate delay time for the device to ++ * reset and release the semaphore (if necessary). ++ **/ ++static s32 e1000_phy_hw_reset_82541(struct e1000_hw *hw) ++{ ++ s32 ret_val; ++ u32 ledctl; ++ ++ DEBUGFUNC("e1000_phy_hw_reset_82541"); ++ ++ ret_val = e1000_phy_hw_reset_generic(hw); ++ if (ret_val) ++ goto out; ++ ++ e1000_phy_init_script_82541(hw); ++ ++ if ((hw->mac.type == e1000_82541) || (hw->mac.type == e1000_82547)) { ++ /* Configure activity LED after PHY reset */ ++ ledctl = E1000_READ_REG(hw, E1000_LEDCTL); ++ ledctl &= IGP_ACTIVITY_LED_MASK; ++ ledctl |= (IGP_ACTIVITY_LED_ENABLE | IGP_LED3_MODE); ++ E1000_WRITE_REG(hw, E1000_LEDCTL, ledctl); ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_setup_copper_link_82541 - Configure copper link settings ++ * @hw: pointer to the HW structure ++ * ++ * Calls the appropriate function to configure the link for auto-neg or forced ++ * speed and duplex. Then we check for link, once link is established calls ++ * to configure collision distance and flow control are called. If link is ++ * not established, we return -E1000_ERR_PHY (-2). ++ **/ ++static s32 e1000_setup_copper_link_82541(struct e1000_hw *hw) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ struct e1000_dev_spec_82541 *dev_spec = &hw->dev_spec._82541; ++ s32 ret_val; ++ u32 ctrl, ledctl; ++ ++ DEBUGFUNC("e1000_setup_copper_link_82541"); ++ ++ ctrl = E1000_READ_REG(hw, E1000_CTRL); ++ ctrl |= E1000_CTRL_SLU; ++ ctrl &= ~(E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX); ++ E1000_WRITE_REG(hw, E1000_CTRL, ctrl); ++ ++ hw->phy.reset_disable = false; ++ ++ /* Earlier revs of the IGP phy require us to force MDI. */ ++ if (hw->mac.type == e1000_82541 || hw->mac.type == e1000_82547) { ++ dev_spec->dsp_config = e1000_dsp_config_disabled; ++ phy->mdix = 1; ++ } else { ++ dev_spec->dsp_config = e1000_dsp_config_enabled; ++ } ++ ++ ret_val = e1000_copper_link_setup_igp(hw); ++ if (ret_val) ++ goto out; ++ ++ if (hw->mac.autoneg) { ++ if (dev_spec->ffe_config == e1000_ffe_config_active) ++ dev_spec->ffe_config = e1000_ffe_config_enabled; ++ } ++ ++ /* Configure activity LED after Phy reset */ ++ ledctl = E1000_READ_REG(hw, E1000_LEDCTL); ++ ledctl &= IGP_ACTIVITY_LED_MASK; ++ ledctl |= (IGP_ACTIVITY_LED_ENABLE | IGP_LED3_MODE); ++ E1000_WRITE_REG(hw, E1000_LEDCTL, ledctl); ++ ++ ret_val = e1000_setup_copper_link_generic(hw); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_check_for_link_82541 - Check/Store link connection ++ * @hw: pointer to the HW structure ++ * ++ * This checks the link condition of the adapter and stores the ++ * results in the hw->mac structure. ++ **/ ++static s32 e1000_check_for_link_82541(struct e1000_hw *hw) ++{ ++ struct e1000_mac_info *mac = &hw->mac; ++ s32 ret_val; ++ bool link; ++ ++ DEBUGFUNC("e1000_check_for_link_82541"); ++ ++ /* ++ * We only want to go out to the PHY registers to see if Auto-Neg ++ * has completed and/or if our link status has changed. The ++ * get_link_status flag is set upon receiving a Link Status ++ * Change or Rx Sequence Error interrupt. ++ */ ++ if (!mac->get_link_status) { ++ ret_val = E1000_SUCCESS; ++ goto out; ++ } ++ ++ /* ++ * First we want to see if the MII Status Register reports ++ * link. If so, then we want to get the current speed/duplex ++ * of the PHY. ++ */ ++ ret_val = e1000_phy_has_link_generic(hw, 1, 0, &link); ++ if (ret_val) ++ goto out; ++ ++ if (!link) { ++ ret_val = e1000_config_dsp_after_link_change_82541(hw, false); ++ goto out; /* No link detected */ ++ } ++ ++ mac->get_link_status = false; ++ ++ /* ++ * Check if there was DownShift, must be checked ++ * immediately after link-up ++ */ ++ e1000_check_downshift_generic(hw); ++ ++ /* ++ * If we are forcing speed/duplex, then we simply return since ++ * we have already determined whether we have link or not. ++ */ ++ if (!mac->autoneg) { ++ ret_val = -E1000_ERR_CONFIG; ++ goto out; ++ } ++ ++ ret_val = e1000_config_dsp_after_link_change_82541(hw, true); ++ ++ /* ++ * Auto-Neg is enabled. Auto Speed Detection takes care ++ * of MAC speed/duplex configuration. So we only need to ++ * configure Collision Distance in the MAC. ++ */ ++ e1000_config_collision_dist_generic(hw); ++ ++ /* ++ * Configure Flow Control now that Auto-Neg has completed. ++ * First, we need to restore the desired flow control ++ * settings because we may have had to re-autoneg with a ++ * different link partner. ++ */ ++ ret_val = e1000_config_fc_after_link_up_generic(hw); ++ if (ret_val) { ++ DEBUGOUT("Error configuring flow control\n"); ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_config_dsp_after_link_change_82541 - Config DSP after link ++ * @hw: pointer to the HW structure ++ * @link_up: boolean flag for link up status ++ * ++ * Return E1000_ERR_PHY when failing to read/write the PHY, else E1000_SUCCESS ++ * at any other case. ++ * ++ * 82541_rev_2 & 82547_rev_2 have the capability to configure the DSP when a ++ * gigabit link is achieved to improve link quality. ++ **/ ++static s32 e1000_config_dsp_after_link_change_82541(struct e1000_hw *hw, ++ bool link_up) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ struct e1000_dev_spec_82541 *dev_spec = &hw->dev_spec._82541; ++ s32 ret_val; ++ u32 idle_errs = 0; ++ u16 phy_data, phy_saved_data, speed, duplex, i; ++ u16 ffe_idle_err_timeout = FFE_IDLE_ERR_COUNT_TIMEOUT_20; ++ u16 dsp_reg_array[IGP01E1000_PHY_CHANNEL_NUM] = ++ {IGP01E1000_PHY_AGC_PARAM_A, ++ IGP01E1000_PHY_AGC_PARAM_B, ++ IGP01E1000_PHY_AGC_PARAM_C, ++ IGP01E1000_PHY_AGC_PARAM_D}; ++ ++ DEBUGFUNC("e1000_config_dsp_after_link_change_82541"); ++ ++ if (link_up) { ++ ret_val = hw->mac.ops.get_link_up_info(hw, &speed, &duplex); ++ if (ret_val) { ++ DEBUGOUT("Error getting link speed and duplex\n"); ++ goto out; ++ } ++ ++ if (speed != SPEED_1000) { ++ ret_val = E1000_SUCCESS; ++ goto out; ++ } ++ ++ ret_val = phy->ops.get_cable_length(hw); ++ if (ret_val) ++ goto out; ++ ++ if ((dev_spec->dsp_config == e1000_dsp_config_enabled) && ++ phy->min_cable_length >= 50) { ++ ++ for (i = 0; i < IGP01E1000_PHY_CHANNEL_NUM; i++) { ++ ret_val = phy->ops.read_reg(hw, ++ dsp_reg_array[i], ++ &phy_data); ++ if (ret_val) ++ goto out; ++ ++ phy_data &= ~IGP01E1000_PHY_EDAC_MU_INDEX; ++ ++ ret_val = phy->ops.write_reg(hw, ++ dsp_reg_array[i], ++ phy_data); ++ if (ret_val) ++ goto out; ++ } ++ dev_spec->dsp_config = e1000_dsp_config_activated; ++ } ++ ++ if ((dev_spec->ffe_config != e1000_ffe_config_enabled) || ++ (phy->min_cable_length >= 50)) { ++ ret_val = E1000_SUCCESS; ++ goto out; ++ } ++ ++ /* clear previous idle error counts */ ++ ret_val = phy->ops.read_reg(hw, PHY_1000T_STATUS, &phy_data); ++ if (ret_val) ++ goto out; ++ ++ for (i = 0; i < ffe_idle_err_timeout; i++) { ++ usec_delay(1000); ++ ret_val = phy->ops.read_reg(hw, ++ PHY_1000T_STATUS, ++ &phy_data); ++ if (ret_val) ++ goto out; ++ ++ idle_errs += (phy_data & SR_1000T_IDLE_ERROR_CNT); ++ if (idle_errs > SR_1000T_PHY_EXCESSIVE_IDLE_ERR_COUNT) { ++ dev_spec->ffe_config = e1000_ffe_config_active; ++ ++ ret_val = phy->ops.write_reg(hw, ++ IGP01E1000_PHY_DSP_FFE, ++ IGP01E1000_PHY_DSP_FFE_CM_CP); ++ if (ret_val) ++ goto out; ++ break; ++ } ++ ++ if (idle_errs) ++ ffe_idle_err_timeout = ++ FFE_IDLE_ERR_COUNT_TIMEOUT_100; ++ } ++ } else { ++ if (dev_spec->dsp_config == e1000_dsp_config_activated) { ++ /* ++ * Save off the current value of register 0x2F5B ++ * to be restored at the end of the routines. ++ */ ++ ret_val = phy->ops.read_reg(hw, ++ 0x2F5B, ++ &phy_saved_data); ++ if (ret_val) ++ goto out; ++ ++ /* Disable the PHY transmitter */ ++ ret_val = phy->ops.write_reg(hw, 0x2F5B, 0x0003); ++ if (ret_val) ++ goto out; ++ ++ msec_delay_irq(20); ++ ++ ret_val = phy->ops.write_reg(hw, ++ 0x0000, ++ IGP01E1000_IEEE_FORCE_GIG); ++ if (ret_val) ++ goto out; ++ for (i = 0; i < IGP01E1000_PHY_CHANNEL_NUM; i++) { ++ ret_val = phy->ops.read_reg(hw, ++ dsp_reg_array[i], ++ &phy_data); ++ if (ret_val) ++ goto out; ++ ++ phy_data &= ~IGP01E1000_PHY_EDAC_MU_INDEX; ++ phy_data |= IGP01E1000_PHY_EDAC_SIGN_EXT_9_BITS; ++ ++ ret_val = phy->ops.write_reg(hw, ++ dsp_reg_array[i], ++ phy_data); ++ if (ret_val) ++ goto out; ++ } ++ ++ ret_val = phy->ops.write_reg(hw, ++ 0x0000, ++ IGP01E1000_IEEE_RESTART_AUTONEG); ++ if (ret_val) ++ goto out; ++ ++ msec_delay_irq(20); ++ ++ /* Now enable the transmitter */ ++ ret_val = phy->ops.write_reg(hw, ++ 0x2F5B, ++ phy_saved_data); ++ if (ret_val) ++ goto out; ++ ++ dev_spec->dsp_config = e1000_dsp_config_enabled; ++ } ++ ++ if (dev_spec->ffe_config != e1000_ffe_config_active) { ++ ret_val = E1000_SUCCESS; ++ goto out; ++ } ++ ++ /* ++ * Save off the current value of register 0x2F5B ++ * to be restored at the end of the routines. ++ */ ++ ret_val = phy->ops.read_reg(hw, 0x2F5B, &phy_saved_data); ++ if (ret_val) ++ goto out; ++ ++ /* Disable the PHY transmitter */ ++ ret_val = phy->ops.write_reg(hw, 0x2F5B, 0x0003); ++ if (ret_val) ++ goto out; ++ ++ msec_delay_irq(20); ++ ++ ret_val = phy->ops.write_reg(hw, ++ 0x0000, ++ IGP01E1000_IEEE_FORCE_GIG); ++ if (ret_val) ++ goto out; ++ ++ ret_val = phy->ops.write_reg(hw, ++ IGP01E1000_PHY_DSP_FFE, ++ IGP01E1000_PHY_DSP_FFE_DEFAULT); ++ if (ret_val) ++ goto out; ++ ++ ret_val = phy->ops.write_reg(hw, ++ 0x0000, ++ IGP01E1000_IEEE_RESTART_AUTONEG); ++ if (ret_val) ++ goto out; ++ ++ msec_delay_irq(20); ++ ++ /* Now enable the transmitter */ ++ ret_val = phy->ops.write_reg(hw, 0x2F5B, phy_saved_data); ++ ++ if (ret_val) ++ goto out; ++ ++ dev_spec->ffe_config = e1000_ffe_config_enabled; ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_get_cable_length_igp_82541 - Determine cable length for igp PHY ++ * @hw: pointer to the HW structure ++ * ++ * The automatic gain control (agc) normalizes the amplitude of the ++ * received signal, adjusting for the attenuation produced by the ++ * cable. By reading the AGC registers, which represent the ++ * combination of coarse and fine gain value, the value can be put ++ * into a lookup table to obtain the approximate cable length ++ * for each channel. ++ **/ ++static s32 e1000_get_cable_length_igp_82541(struct e1000_hw *hw) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ s32 ret_val = E1000_SUCCESS; ++ u16 i, data; ++ u16 cur_agc_value, agc_value = 0; ++ u16 min_agc_value = IGP01E1000_AGC_LENGTH_TABLE_SIZE; ++ u16 agc_reg_array[IGP01E1000_PHY_CHANNEL_NUM] = ++ {IGP01E1000_PHY_AGC_A, ++ IGP01E1000_PHY_AGC_B, ++ IGP01E1000_PHY_AGC_C, ++ IGP01E1000_PHY_AGC_D}; ++ ++ DEBUGFUNC("e1000_get_cable_length_igp_82541"); ++ ++ /* Read the AGC registers for all channels */ ++ for (i = 0; i < IGP01E1000_PHY_CHANNEL_NUM; i++) { ++ ret_val = phy->ops.read_reg(hw, agc_reg_array[i], &data); ++ if (ret_val) ++ goto out; ++ ++ cur_agc_value = data >> IGP01E1000_AGC_LENGTH_SHIFT; ++ ++ /* Bounds checking */ ++ if ((cur_agc_value >= IGP01E1000_AGC_LENGTH_TABLE_SIZE - 1) || ++ (cur_agc_value == 0)) { ++ ret_val = -E1000_ERR_PHY; ++ goto out; ++ } ++ ++ agc_value += cur_agc_value; ++ ++ if (min_agc_value > cur_agc_value) ++ min_agc_value = cur_agc_value; ++ } ++ ++ /* Remove the minimal AGC result for length < 50m */ ++ if (agc_value < IGP01E1000_PHY_CHANNEL_NUM * 50) { ++ agc_value -= min_agc_value; ++ /* Average the three remaining channels for the length. */ ++ agc_value /= (IGP01E1000_PHY_CHANNEL_NUM - 1); ++ } else { ++ /* Average the channels for the length. */ ++ agc_value /= IGP01E1000_PHY_CHANNEL_NUM; ++ } ++ ++ phy->min_cable_length = (e1000_igp_cable_length_table[agc_value] > ++ IGP01E1000_AGC_RANGE) ++ ? (e1000_igp_cable_length_table[agc_value] - ++ IGP01E1000_AGC_RANGE) ++ : 0; ++ phy->max_cable_length = e1000_igp_cable_length_table[agc_value] + ++ IGP01E1000_AGC_RANGE; ++ ++ phy->cable_length = (phy->min_cable_length + phy->max_cable_length) / 2; ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_set_d3_lplu_state_82541 - Sets low power link up state for D3 ++ * @hw: pointer to the HW structure ++ * @active: boolean used to enable/disable lplu ++ * ++ * Success returns 0, Failure returns 1 ++ * ++ * The low power link up (lplu) state is set to the power management level D3 ++ * and SmartSpeed is disabled when active is true, else clear lplu for D3 ++ * and enable Smartspeed. LPLU and Smartspeed are mutually exclusive. LPLU ++ * is used during Dx states where the power conservation is most important. ++ * During driver activity, SmartSpeed should be enabled so performance is ++ * maintained. ++ **/ ++static s32 e1000_set_d3_lplu_state_82541(struct e1000_hw *hw, bool active) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ s32 ret_val; ++ u16 data; ++ ++ DEBUGFUNC("e1000_set_d3_lplu_state_82541"); ++ ++ switch (hw->mac.type) { ++ case e1000_82541_rev_2: ++ case e1000_82547_rev_2: ++ break; ++ default: ++ ret_val = e1000_set_d3_lplu_state_generic(hw, active); ++ goto out; ++ break; ++ } ++ ++ ret_val = phy->ops.read_reg(hw, IGP01E1000_GMII_FIFO, &data); ++ if (ret_val) ++ goto out; ++ ++ if (!active) { ++ data &= ~IGP01E1000_GMII_FLEX_SPD; ++ ret_val = phy->ops.write_reg(hw, IGP01E1000_GMII_FIFO, data); ++ if (ret_val) ++ goto out; ++ ++ /* ++ * LPLU and SmartSpeed are mutually exclusive. LPLU is used ++ * during Dx states where the power conservation is most ++ * important. During driver activity we should enable ++ * SmartSpeed, so performance is maintained. ++ */ ++ if (phy->smart_speed == e1000_smart_speed_on) { ++ ret_val = phy->ops.read_reg(hw, ++ IGP01E1000_PHY_PORT_CONFIG, ++ &data); ++ if (ret_val) ++ goto out; ++ ++ data |= IGP01E1000_PSCFR_SMART_SPEED; ++ ret_val = phy->ops.write_reg(hw, ++ IGP01E1000_PHY_PORT_CONFIG, ++ data); ++ if (ret_val) ++ goto out; ++ } else if (phy->smart_speed == e1000_smart_speed_off) { ++ ret_val = phy->ops.read_reg(hw, ++ IGP01E1000_PHY_PORT_CONFIG, ++ &data); ++ if (ret_val) ++ goto out; ++ ++ data &= ~IGP01E1000_PSCFR_SMART_SPEED; ++ ret_val = phy->ops.write_reg(hw, ++ IGP01E1000_PHY_PORT_CONFIG, ++ data); ++ if (ret_val) ++ goto out; ++ } ++ } else if ((phy->autoneg_advertised == E1000_ALL_SPEED_DUPLEX) || ++ (phy->autoneg_advertised == E1000_ALL_NOT_GIG) || ++ (phy->autoneg_advertised == E1000_ALL_10_SPEED)) { ++ data |= IGP01E1000_GMII_FLEX_SPD; ++ ret_val = phy->ops.write_reg(hw, IGP01E1000_GMII_FIFO, data); ++ if (ret_val) ++ goto out; ++ ++ /* When LPLU is enabled, we should disable SmartSpeed */ ++ ret_val = phy->ops.read_reg(hw, ++ IGP01E1000_PHY_PORT_CONFIG, ++ &data); ++ if (ret_val) ++ goto out; ++ ++ data &= ~IGP01E1000_PSCFR_SMART_SPEED; ++ ret_val = phy->ops.write_reg(hw, ++ IGP01E1000_PHY_PORT_CONFIG, ++ data); ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_setup_led_82541 - Configures SW controllable LED ++ * @hw: pointer to the HW structure ++ * ++ * This prepares the SW controllable LED for use and saves the current state ++ * of the LED so it can be later restored. ++ **/ ++static s32 e1000_setup_led_82541(struct e1000_hw *hw) ++{ ++ struct e1000_dev_spec_82541 *dev_spec = &hw->dev_spec._82541; ++ s32 ret_val; ++ ++ DEBUGFUNC("e1000_setup_led_82541"); ++ ++ ret_val = hw->phy.ops.read_reg(hw, ++ IGP01E1000_GMII_FIFO, ++ &dev_spec->spd_default); ++ if (ret_val) ++ goto out; ++ ++ ret_val = hw->phy.ops.write_reg(hw, ++ IGP01E1000_GMII_FIFO, ++ (u16)(dev_spec->spd_default & ++ ~IGP01E1000_GMII_SPD)); ++ if (ret_val) ++ goto out; ++ ++ E1000_WRITE_REG(hw, E1000_LEDCTL, hw->mac.ledctl_mode1); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_cleanup_led_82541 - Set LED config to default operation ++ * @hw: pointer to the HW structure ++ * ++ * Remove the current LED configuration and set the LED configuration ++ * to the default value, saved from the EEPROM. ++ **/ ++static s32 e1000_cleanup_led_82541(struct e1000_hw *hw) ++{ ++ struct e1000_dev_spec_82541 *dev_spec = &hw->dev_spec._82541; ++ s32 ret_val; ++ ++ DEBUGFUNC("e1000_cleanup_led_82541"); ++ ++ ret_val = hw->phy.ops.write_reg(hw, ++ IGP01E1000_GMII_FIFO, ++ dev_spec->spd_default); ++ if (ret_val) ++ goto out; ++ ++ E1000_WRITE_REG(hw, E1000_LEDCTL, hw->mac.ledctl_default); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_phy_init_script_82541 - Initialize GbE PHY ++ * @hw: pointer to the HW structure ++ * ++ * Initializes the IGP PHY. ++ **/ ++static s32 e1000_phy_init_script_82541(struct e1000_hw *hw) ++{ ++ struct e1000_dev_spec_82541 *dev_spec = &hw->dev_spec._82541; ++ u32 ret_val; ++ u16 phy_saved_data; ++ ++ DEBUGFUNC("e1000_phy_init_script_82541"); ++ ++ if (!dev_spec->phy_init_script) { ++ ret_val = E1000_SUCCESS; ++ goto out; ++ } ++ ++ /* Delay after phy reset to enable NVM configuration to load */ ++ msec_delay(20); ++ ++ /* ++ * Save off the current value of register 0x2F5B to be restored at ++ * the end of this routine. ++ */ ++ ret_val = hw->phy.ops.read_reg(hw, 0x2F5B, &phy_saved_data); ++ ++ /* Disabled the PHY transmitter */ ++ hw->phy.ops.write_reg(hw, 0x2F5B, 0x0003); ++ ++ msec_delay(20); ++ ++ hw->phy.ops.write_reg(hw, 0x0000, 0x0140); ++ ++ msec_delay(5); ++ ++ switch (hw->mac.type) { ++ case e1000_82541: ++ case e1000_82547: ++ hw->phy.ops.write_reg(hw, 0x1F95, 0x0001); ++ ++ hw->phy.ops.write_reg(hw, 0x1F71, 0xBD21); ++ ++ hw->phy.ops.write_reg(hw, 0x1F79, 0x0018); ++ ++ hw->phy.ops.write_reg(hw, 0x1F30, 0x1600); ++ ++ hw->phy.ops.write_reg(hw, 0x1F31, 0x0014); ++ ++ hw->phy.ops.write_reg(hw, 0x1F32, 0x161C); ++ ++ hw->phy.ops.write_reg(hw, 0x1F94, 0x0003); ++ ++ hw->phy.ops.write_reg(hw, 0x1F96, 0x003F); ++ ++ hw->phy.ops.write_reg(hw, 0x2010, 0x0008); ++ break; ++ case e1000_82541_rev_2: ++ case e1000_82547_rev_2: ++ hw->phy.ops.write_reg(hw, 0x1F73, 0x0099); ++ break; ++ default: ++ break; ++ } ++ ++ hw->phy.ops.write_reg(hw, 0x0000, 0x3300); ++ ++ msec_delay(20); ++ ++ /* Now enable the transmitter */ ++ hw->phy.ops.write_reg(hw, 0x2F5B, phy_saved_data); ++ ++ if (hw->mac.type == e1000_82547) { ++ u16 fused, fine, coarse; ++ ++ /* Move to analog registers page */ ++ hw->phy.ops.read_reg(hw, ++ IGP01E1000_ANALOG_SPARE_FUSE_STATUS, ++ &fused); ++ ++ if (!(fused & IGP01E1000_ANALOG_SPARE_FUSE_ENABLED)) { ++ hw->phy.ops.read_reg(hw, ++ IGP01E1000_ANALOG_FUSE_STATUS, ++ &fused); ++ ++ fine = fused & IGP01E1000_ANALOG_FUSE_FINE_MASK; ++ coarse = fused & IGP01E1000_ANALOG_FUSE_COARSE_MASK; ++ ++ if (coarse > IGP01E1000_ANALOG_FUSE_COARSE_THRESH) { ++ coarse -= IGP01E1000_ANALOG_FUSE_COARSE_10; ++ fine -= IGP01E1000_ANALOG_FUSE_FINE_1; ++ } else if (coarse == ++ IGP01E1000_ANALOG_FUSE_COARSE_THRESH) ++ fine -= IGP01E1000_ANALOG_FUSE_FINE_10; ++ ++ fused = (fused & IGP01E1000_ANALOG_FUSE_POLY_MASK) | ++ (fine & IGP01E1000_ANALOG_FUSE_FINE_MASK) | ++ (coarse & IGP01E1000_ANALOG_FUSE_COARSE_MASK); ++ ++ hw->phy.ops.write_reg(hw, ++ IGP01E1000_ANALOG_FUSE_CONTROL, ++ fused); ++ hw->phy.ops.write_reg(hw, ++ IGP01E1000_ANALOG_FUSE_BYPASS, ++ IGP01E1000_ANALOG_FUSE_ENABLE_SW_CONTROL); ++ } ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_init_script_state_82541 - Enable/Disable PHY init script ++ * @hw: pointer to the HW structure ++ * @state: boolean value used to enable/disable PHY init script ++ * ++ * Allows the driver to enable/disable the PHY init script, if the PHY is an ++ * IGP PHY. ++ **/ ++void e1000_init_script_state_82541(struct e1000_hw *hw, bool state) ++{ ++ struct e1000_dev_spec_82541 *dev_spec = &hw->dev_spec._82541; ++ ++ DEBUGFUNC("e1000_init_script_state_82541"); ++ ++ if (hw->phy.type != e1000_phy_igp) { ++ DEBUGOUT("Initialization script not necessary.\n"); ++ goto out; ++ } ++ ++ dev_spec->phy_init_script = state; ++ ++out: ++ return; ++} ++ ++/** ++ * e1000_power_down_phy_copper_82541 - Remove link in case of PHY power down ++ * @hw: pointer to the HW structure ++ * ++ * In the case of a PHY power down to save power, or to turn off link during a ++ * driver unload, or wake on lan is not enabled, remove the link. ++ **/ ++static void e1000_power_down_phy_copper_82541(struct e1000_hw *hw) ++{ ++ /* If the management interface is not enabled, then power down */ ++ if (!(E1000_READ_REG(hw, E1000_MANC) & E1000_MANC_SMBUS_EN)) ++ e1000_power_down_phy_copper(hw); ++ ++ return; ++} ++ ++/** ++ * e1000_clear_hw_cntrs_82541 - Clear device specific hardware counters ++ * @hw: pointer to the HW structure ++ * ++ * Clears the hardware counters by reading the counter registers. ++ **/ ++static void e1000_clear_hw_cntrs_82541(struct e1000_hw *hw) ++{ ++ DEBUGFUNC("e1000_clear_hw_cntrs_82541"); ++ ++ e1000_clear_hw_cntrs_base_generic(hw); ++ ++ E1000_READ_REG(hw, E1000_PRC64); ++ E1000_READ_REG(hw, E1000_PRC127); ++ E1000_READ_REG(hw, E1000_PRC255); ++ E1000_READ_REG(hw, E1000_PRC511); ++ E1000_READ_REG(hw, E1000_PRC1023); ++ E1000_READ_REG(hw, E1000_PRC1522); ++ E1000_READ_REG(hw, E1000_PTC64); ++ E1000_READ_REG(hw, E1000_PTC127); ++ E1000_READ_REG(hw, E1000_PTC255); ++ E1000_READ_REG(hw, E1000_PTC511); ++ E1000_READ_REG(hw, E1000_PTC1023); ++ E1000_READ_REG(hw, E1000_PTC1522); ++ ++ E1000_READ_REG(hw, E1000_ALGNERRC); ++ E1000_READ_REG(hw, E1000_RXERRC); ++ E1000_READ_REG(hw, E1000_TNCRS); ++ E1000_READ_REG(hw, E1000_CEXTERR); ++ E1000_READ_REG(hw, E1000_TSCTC); ++ E1000_READ_REG(hw, E1000_TSCTFC); ++ ++ E1000_READ_REG(hw, E1000_MGTPRC); ++ E1000_READ_REG(hw, E1000_MGTPDC); ++ E1000_READ_REG(hw, E1000_MGTPTC); ++} +diff -r d03036c09699 drivers/net/e1000/e1000_82541.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/e1000/e1000_82541.h Mon Jun 15 11:43:11 2009 +0100 +@@ -0,0 +1,86 @@ ++/******************************************************************************* ++ ++ Intel PRO/1000 Linux driver ++ Copyright(c) 1999 - 2008 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ Linux NICS ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++#ifndef _E1000_82541_H_ ++#define _E1000_82541_H_ ++ ++#define NVM_WORD_SIZE_BASE_SHIFT_82541 (NVM_WORD_SIZE_BASE_SHIFT + 1) ++ ++#define IGP01E1000_PHY_CHANNEL_NUM 4 ++ ++#define IGP01E1000_PHY_AGC_A 0x1172 ++#define IGP01E1000_PHY_AGC_B 0x1272 ++#define IGP01E1000_PHY_AGC_C 0x1472 ++#define IGP01E1000_PHY_AGC_D 0x1872 ++ ++#define IGP01E1000_PHY_AGC_PARAM_A 0x1171 ++#define IGP01E1000_PHY_AGC_PARAM_B 0x1271 ++#define IGP01E1000_PHY_AGC_PARAM_C 0x1471 ++#define IGP01E1000_PHY_AGC_PARAM_D 0x1871 ++ ++#define IGP01E1000_PHY_EDAC_MU_INDEX 0xC000 ++#define IGP01E1000_PHY_EDAC_SIGN_EXT_9_BITS 0x8000 ++ ++#define IGP01E1000_PHY_DSP_RESET 0x1F33 ++ ++#define IGP01E1000_PHY_DSP_FFE 0x1F35 ++#define IGP01E1000_PHY_DSP_FFE_CM_CP 0x0069 ++#define IGP01E1000_PHY_DSP_FFE_DEFAULT 0x002A ++ ++#define IGP01E1000_IEEE_FORCE_GIG 0x0140 ++#define IGP01E1000_IEEE_RESTART_AUTONEG 0x3300 ++ ++#define IGP01E1000_AGC_LENGTH_SHIFT 7 ++#define IGP01E1000_AGC_RANGE 10 ++ ++#define FFE_IDLE_ERR_COUNT_TIMEOUT_20 20 ++#define FFE_IDLE_ERR_COUNT_TIMEOUT_100 100 ++ ++#define IGP01E1000_ANALOG_FUSE_STATUS 0x20D0 ++#define IGP01E1000_ANALOG_SPARE_FUSE_STATUS 0x20D1 ++#define IGP01E1000_ANALOG_FUSE_CONTROL 0x20DC ++#define IGP01E1000_ANALOG_FUSE_BYPASS 0x20DE ++ ++#define IGP01E1000_ANALOG_SPARE_FUSE_ENABLED 0x0100 ++#define IGP01E1000_ANALOG_FUSE_FINE_MASK 0x0F80 ++#define IGP01E1000_ANALOG_FUSE_COARSE_MASK 0x0070 ++#define IGP01E1000_ANALOG_FUSE_COARSE_THRESH 0x0040 ++#define IGP01E1000_ANALOG_FUSE_COARSE_10 0x0010 ++#define IGP01E1000_ANALOG_FUSE_FINE_1 0x0080 ++#define IGP01E1000_ANALOG_FUSE_FINE_10 0x0500 ++#define IGP01E1000_ANALOG_FUSE_POLY_MASK 0xF000 ++#define IGP01E1000_ANALOG_FUSE_ENABLE_SW_CONTROL 0x0002 ++ ++#define IGP01E1000_MSE_CHANNEL_D 0x000F ++#define IGP01E1000_MSE_CHANNEL_C 0x00F0 ++#define IGP01E1000_MSE_CHANNEL_B 0x0F00 ++#define IGP01E1000_MSE_CHANNEL_A 0xF000 ++ ++ ++void e1000_init_script_state_82541(struct e1000_hw *hw, bool state); ++#endif +diff -r d03036c09699 drivers/net/e1000/e1000_82542.c +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/e1000/e1000_82542.c Mon Jun 15 11:43:11 2009 +0100 +@@ -0,0 +1,550 @@ ++/******************************************************************************* ++ ++ Intel PRO/1000 Linux driver ++ Copyright(c) 1999 - 2008 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ Linux NICS ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++/* ++ * 82542 Gigabit Ethernet Controller ++ */ ++ ++#include "e1000_api.h" ++ ++static s32 e1000_init_phy_params_82542(struct e1000_hw *hw); ++static s32 e1000_init_nvm_params_82542(struct e1000_hw *hw); ++static s32 e1000_init_mac_params_82542(struct e1000_hw *hw); ++static s32 e1000_get_bus_info_82542(struct e1000_hw *hw); ++static s32 e1000_reset_hw_82542(struct e1000_hw *hw); ++static s32 e1000_init_hw_82542(struct e1000_hw *hw); ++static s32 e1000_setup_link_82542(struct e1000_hw *hw); ++static s32 e1000_led_on_82542(struct e1000_hw *hw); ++static s32 e1000_led_off_82542(struct e1000_hw *hw); ++static void e1000_rar_set_82542(struct e1000_hw *hw, u8 *addr, u32 index); ++static void e1000_clear_hw_cntrs_82542(struct e1000_hw *hw); ++ ++/** ++ * e1000_init_phy_params_82542 - Init PHY func ptrs. ++ * @hw: pointer to the HW structure ++ **/ ++static s32 e1000_init_phy_params_82542(struct e1000_hw *hw) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ s32 ret_val = E1000_SUCCESS; ++ ++ DEBUGFUNC("e1000_init_phy_params_82542"); ++ ++ phy->type = e1000_phy_none; ++ ++ return ret_val; ++} ++ ++/** ++ * e1000_init_nvm_params_82542 - Init NVM func ptrs. ++ * @hw: pointer to the HW structure ++ **/ ++static s32 e1000_init_nvm_params_82542(struct e1000_hw *hw) ++{ ++ struct e1000_nvm_info *nvm = &hw->nvm; ++ ++ DEBUGFUNC("e1000_init_nvm_params_82542"); ++ ++ nvm->address_bits = 6; ++ nvm->delay_usec = 50; ++ nvm->opcode_bits = 3; ++ nvm->type = e1000_nvm_eeprom_microwire; ++ nvm->word_size = 64; ++ ++ /* Function Pointers */ ++ nvm->ops.read = e1000_read_nvm_microwire; ++ nvm->ops.release = e1000_stop_nvm; ++ nvm->ops.write = e1000_write_nvm_microwire; ++ nvm->ops.update = e1000_update_nvm_checksum_generic; ++ nvm->ops.validate = e1000_validate_nvm_checksum_generic; ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_init_mac_params_82542 - Init MAC func ptrs. ++ * @hw: pointer to the HW structure ++ **/ ++static s32 e1000_init_mac_params_82542(struct e1000_hw *hw) ++{ ++ struct e1000_mac_info *mac = &hw->mac; ++ ++ DEBUGFUNC("e1000_init_mac_params_82542"); ++ ++ /* Set media type */ ++ hw->phy.media_type = e1000_media_type_fiber; ++ ++ /* Set mta register count */ ++ mac->mta_reg_count = 128; ++ /* Set rar entry count */ ++ mac->rar_entry_count = E1000_RAR_ENTRIES; ++ ++ /* Function pointers */ ++ ++ /* bus type/speed/width */ ++ mac->ops.get_bus_info = e1000_get_bus_info_82542; ++ /* function id */ ++ mac->ops.set_lan_id = e1000_set_lan_id_multi_port_pci; ++ /* reset */ ++ mac->ops.reset_hw = e1000_reset_hw_82542; ++ /* hw initialization */ ++ mac->ops.init_hw = e1000_init_hw_82542; ++ /* link setup */ ++ mac->ops.setup_link = e1000_setup_link_82542; ++ /* phy/fiber/serdes setup */ ++ mac->ops.setup_physical_interface = e1000_setup_fiber_serdes_link_generic; ++ /* check for link */ ++ mac->ops.check_for_link = e1000_check_for_fiber_link_generic; ++ /* multicast address update */ ++ mac->ops.update_mc_addr_list = e1000_update_mc_addr_list_generic; ++ /* writing VFTA */ ++ mac->ops.write_vfta = e1000_write_vfta_generic; ++ /* clearing VFTA */ ++ mac->ops.clear_vfta = e1000_clear_vfta_generic; ++ /* setting MTA */ ++ mac->ops.mta_set = e1000_mta_set_generic; ++ /* set RAR */ ++ mac->ops.rar_set = e1000_rar_set_82542; ++ /* turn on/off LED */ ++ mac->ops.led_on = e1000_led_on_82542; ++ mac->ops.led_off = e1000_led_off_82542; ++ /* clear hardware counters */ ++ mac->ops.clear_hw_cntrs = e1000_clear_hw_cntrs_82542; ++ /* link info */ ++ mac->ops.get_link_up_info = e1000_get_speed_and_duplex_fiber_serdes_generic; ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_init_function_pointers_82542 - Init func ptrs. ++ * @hw: pointer to the HW structure ++ * ++ * Called to initialize all function pointers and parameters. ++ **/ ++void e1000_init_function_pointers_82542(struct e1000_hw *hw) ++{ ++ DEBUGFUNC("e1000_init_function_pointers_82542"); ++ ++ hw->mac.ops.init_params = e1000_init_mac_params_82542; ++ hw->nvm.ops.init_params = e1000_init_nvm_params_82542; ++ hw->phy.ops.init_params = e1000_init_phy_params_82542; ++} ++ ++/** ++ * e1000_get_bus_info_82542 - Obtain bus information for adapter ++ * @hw: pointer to the HW structure ++ * ++ * This will obtain information about the HW bus for which the ++ * adapter is attached and stores it in the hw structure. ++ **/ ++static s32 e1000_get_bus_info_82542(struct e1000_hw *hw) ++{ ++ DEBUGFUNC("e1000_get_bus_info_82542"); ++ ++ hw->bus.type = e1000_bus_type_pci; ++ hw->bus.speed = e1000_bus_speed_unknown; ++ hw->bus.width = e1000_bus_width_unknown; ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_reset_hw_82542 - Reset hardware ++ * @hw: pointer to the HW structure ++ * ++ * This resets the hardware into a known state. ++ **/ ++static s32 e1000_reset_hw_82542(struct e1000_hw *hw) ++{ ++ struct e1000_bus_info *bus = &hw->bus; ++ s32 ret_val = E1000_SUCCESS; ++ u32 ctrl, icr; ++ ++ DEBUGFUNC("e1000_reset_hw_82542"); ++ ++ if (hw->revision_id == E1000_REVISION_2) { ++ DEBUGOUT("Disabling MWI on 82542 rev 2\n"); ++ e1000_pci_clear_mwi(hw); ++ } ++ ++ DEBUGOUT("Masking off all interrupts\n"); ++ E1000_WRITE_REG(hw, E1000_IMC, 0xffffffff); ++ ++ E1000_WRITE_REG(hw, E1000_RCTL, 0); ++ E1000_WRITE_REG(hw, E1000_TCTL, E1000_TCTL_PSP); ++ E1000_WRITE_FLUSH(hw); ++ ++ /* ++ * Delay to allow any outstanding PCI transactions to complete before ++ * resetting the device ++ */ ++ msec_delay(10); ++ ++ ctrl = E1000_READ_REG(hw, E1000_CTRL); ++ ++ DEBUGOUT("Issuing a global reset to 82542/82543 MAC\n"); ++ E1000_WRITE_REG(hw, E1000_CTRL, ctrl | E1000_CTRL_RST); ++ ++ hw->nvm.ops.reload(hw); ++ msec_delay(2); ++ ++ E1000_WRITE_REG(hw, E1000_IMC, 0xffffffff); ++ icr = E1000_READ_REG(hw, E1000_ICR); ++ ++ if (hw->revision_id == E1000_REVISION_2) { ++ if (bus->pci_cmd_word & CMD_MEM_WRT_INVALIDATE) ++ e1000_pci_set_mwi(hw); ++ } ++ ++ return ret_val; ++} ++ ++/** ++ * e1000_init_hw_82542 - Initialize hardware ++ * @hw: pointer to the HW structure ++ * ++ * This inits the hardware readying it for operation. ++ **/ ++static s32 e1000_init_hw_82542(struct e1000_hw *hw) ++{ ++ struct e1000_mac_info *mac = &hw->mac; ++ struct e1000_dev_spec_82542 *dev_spec = &hw->dev_spec._82542; ++ s32 ret_val = E1000_SUCCESS; ++ u32 ctrl; ++ u16 i; ++ ++ DEBUGFUNC("e1000_init_hw_82542"); ++ ++ /* Disabling VLAN filtering */ ++ E1000_WRITE_REG(hw, E1000_VET, 0); ++ mac->ops.clear_vfta(hw); ++ ++ /* For 82542 (rev 2.0), disable MWI and put the receiver into reset */ ++ if (hw->revision_id == E1000_REVISION_2) { ++ DEBUGOUT("Disabling MWI on 82542 rev 2.0\n"); ++ e1000_pci_clear_mwi(hw); ++ E1000_WRITE_REG(hw, E1000_RCTL, E1000_RCTL_RST); ++ E1000_WRITE_FLUSH(hw); ++ msec_delay(5); ++ } ++ ++ /* Setup the receive address. */ ++ e1000_init_rx_addrs_generic(hw, mac->rar_entry_count); ++ ++ /* For 82542 (rev 2.0), take the receiver out of reset and enable MWI */ ++ if (hw->revision_id == E1000_REVISION_2) { ++ E1000_WRITE_REG(hw, E1000_RCTL, 0); ++ E1000_WRITE_FLUSH(hw); ++ msec_delay(1); ++ if (hw->bus.pci_cmd_word & CMD_MEM_WRT_INVALIDATE) ++ e1000_pci_set_mwi(hw); ++ } ++ ++ /* Zero out the Multicast HASH table */ ++ DEBUGOUT("Zeroing the MTA\n"); ++ for (i = 0; i < mac->mta_reg_count; i++) ++ E1000_WRITE_REG_ARRAY(hw, E1000_MTA, i, 0); ++ ++ /* ++ * Set the PCI priority bit correctly in the CTRL register. This ++ * determines if the adapter gives priority to receives, or if it ++ * gives equal priority to transmits and receives. ++ */ ++ if (dev_spec->dma_fairness) { ++ ctrl = E1000_READ_REG(hw, E1000_CTRL); ++ E1000_WRITE_REG(hw, E1000_CTRL, ctrl | E1000_CTRL_PRIOR); ++ } ++ ++ /* Setup link and flow control */ ++ ret_val = e1000_setup_link_82542(hw); ++ ++ /* ++ * Clear all of the statistics registers (clear on read). It is ++ * important that we do this after we have tried to establish link ++ * because the symbol error count will increment wildly if there ++ * is no link. ++ */ ++ e1000_clear_hw_cntrs_82542(hw); ++ ++ return ret_val; ++} ++ ++/** ++ * e1000_setup_link_82542 - Setup flow control and link settings ++ * @hw: pointer to the HW structure ++ * ++ * Determines which flow control settings to use, then configures flow ++ * control. Calls the appropriate media-specific link configuration ++ * function. Assuming the adapter has a valid link partner, a valid link ++ * should be established. Assumes the hardware has previously been reset ++ * and the transmitter and receiver are not enabled. ++ **/ ++static s32 e1000_setup_link_82542(struct e1000_hw *hw) ++{ ++ struct e1000_mac_info *mac = &hw->mac; ++ s32 ret_val = E1000_SUCCESS; ++ ++ DEBUGFUNC("e1000_setup_link_82542"); ++ ++ ret_val = e1000_set_default_fc_generic(hw); ++ if (ret_val) ++ goto out; ++ ++ hw->fc.requested_mode &= ~e1000_fc_tx_pause; ++ ++ if (mac->report_tx_early == 1) ++ hw->fc.requested_mode &= ~e1000_fc_rx_pause; ++ ++ /* ++ * Save off the requested flow control mode for use later. Depending ++ * on the link partner's capabilities, we may or may not use this mode. ++ */ ++ hw->fc.current_mode = hw->fc.requested_mode; ++ ++ DEBUGOUT1("After fix-ups FlowControl is now = %x\n", ++ hw->fc.current_mode); ++ ++ /* Call the necessary subroutine to configure the link. */ ++ ret_val = mac->ops.setup_physical_interface(hw); ++ if (ret_val) ++ goto out; ++ ++ /* ++ * Initialize the flow control address, type, and PAUSE timer ++ * registers to their default values. This is done even if flow ++ * control is disabled, because it does not hurt anything to ++ * initialize these registers. ++ */ ++ DEBUGOUT("Initializing Flow Control address, type and timer regs\n"); ++ ++ E1000_WRITE_REG(hw, E1000_FCAL, FLOW_CONTROL_ADDRESS_LOW); ++ E1000_WRITE_REG(hw, E1000_FCAH, FLOW_CONTROL_ADDRESS_HIGH); ++ E1000_WRITE_REG(hw, E1000_FCT, FLOW_CONTROL_TYPE); ++ ++ E1000_WRITE_REG(hw, E1000_FCTTV, hw->fc.pause_time); ++ ++ ret_val = e1000_set_fc_watermarks_generic(hw); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_led_on_82542 - Turn on SW controllable LED ++ * @hw: pointer to the HW structure ++ * ++ * Turns the SW defined LED on. ++ **/ ++static s32 e1000_led_on_82542(struct e1000_hw *hw) ++{ ++ u32 ctrl = E1000_READ_REG(hw, E1000_CTRL); ++ ++ DEBUGFUNC("e1000_led_on_82542"); ++ ++ ctrl |= E1000_CTRL_SWDPIN0; ++ ctrl |= E1000_CTRL_SWDPIO0; ++ E1000_WRITE_REG(hw, E1000_CTRL, ctrl); ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_led_off_82542 - Turn off SW controllable LED ++ * @hw: pointer to the HW structure ++ * ++ * Turns the SW defined LED off. ++ **/ ++static s32 e1000_led_off_82542(struct e1000_hw *hw) ++{ ++ u32 ctrl = E1000_READ_REG(hw, E1000_CTRL); ++ ++ DEBUGFUNC("e1000_led_off_82542"); ++ ++ ctrl &= ~E1000_CTRL_SWDPIN0; ++ ctrl |= E1000_CTRL_SWDPIO0; ++ E1000_WRITE_REG(hw, E1000_CTRL, ctrl); ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_rar_set_82542 - Set receive address register ++ * @hw: pointer to the HW structure ++ * @addr: pointer to the receive address ++ * @index: receive address array register ++ * ++ * Sets the receive address array register at index to the address passed ++ * in by addr. ++ **/ ++static void e1000_rar_set_82542(struct e1000_hw *hw, u8 *addr, u32 index) ++{ ++ u32 rar_low, rar_high; ++ ++ DEBUGFUNC("e1000_rar_set_82542"); ++ ++ /* ++ * HW expects these in little endian so we reverse the byte order ++ * from network order (big endian) to little endian ++ */ ++ rar_low = ((u32) addr[0] | ++ ((u32) addr[1] << 8) | ++ ((u32) addr[2] << 16) | ((u32) addr[3] << 24)); ++ ++ rar_high = ((u32) addr[4] | ((u32) addr[5] << 8)); ++ ++ /* If MAC address zero, no need to set the AV bit */ ++ if (rar_low || rar_high) ++ rar_high |= E1000_RAH_AV; ++ ++ E1000_WRITE_REG_ARRAY(hw, E1000_RA, (index << 1), rar_low); ++ E1000_WRITE_REG_ARRAY(hw, E1000_RA, ((index << 1) + 1), rar_high); ++} ++ ++/** ++ * e1000_translate_register_82542 - Translate the proper register offset ++ * @reg: e1000 register to be read ++ * ++ * Registers in 82542 are located in different offsets than other adapters ++ * even though they function in the same manner. This function takes in ++ * the name of the register to read and returns the correct offset for ++ * 82542 silicon. ++ **/ ++u32 e1000_translate_register_82542(u32 reg) ++{ ++ /* ++ * Some of the 82542 registers are located at different ++ * offsets than they are in newer adapters. ++ * Despite the difference in location, the registers ++ * function in the same manner. ++ */ ++ switch (reg) { ++ case E1000_RA: ++ reg = 0x00040; ++ break; ++ case E1000_RDTR: ++ reg = 0x00108; ++ break; ++ case E1000_RDBAL(0): ++ reg = 0x00110; ++ break; ++ case E1000_RDBAH(0): ++ reg = 0x00114; ++ break; ++ case E1000_RDLEN(0): ++ reg = 0x00118; ++ break; ++ case E1000_RDH(0): ++ reg = 0x00120; ++ break; ++ case E1000_RDT(0): ++ reg = 0x00128; ++ break; ++ case E1000_RDBAL(1): ++ reg = 0x00138; ++ break; ++ case E1000_RDBAH(1): ++ reg = 0x0013C; ++ break; ++ case E1000_RDLEN(1): ++ reg = 0x00140; ++ break; ++ case E1000_RDH(1): ++ reg = 0x00148; ++ break; ++ case E1000_RDT(1): ++ reg = 0x00150; ++ break; ++ case E1000_FCRTH: ++ reg = 0x00160; ++ break; ++ case E1000_FCRTL: ++ reg = 0x00168; ++ break; ++ case E1000_MTA: ++ reg = 0x00200; ++ break; ++ case E1000_TDBAL(0): ++ reg = 0x00420; ++ break; ++ case E1000_TDBAH(0): ++ reg = 0x00424; ++ break; ++ case E1000_TDLEN(0): ++ reg = 0x00428; ++ break; ++ case E1000_TDH(0): ++ reg = 0x00430; ++ break; ++ case E1000_TDT(0): ++ reg = 0x00438; ++ break; ++ case E1000_TIDV: ++ reg = 0x00440; ++ break; ++ case E1000_VFTA: ++ reg = 0x00600; ++ break; ++ case E1000_TDFH: ++ reg = 0x08010; ++ break; ++ case E1000_TDFT: ++ reg = 0x08018; ++ break; ++ default: ++ break; ++ } ++ ++ return reg; ++} ++ ++/** ++ * e1000_clear_hw_cntrs_82542 - Clear device specific hardware counters ++ * @hw: pointer to the HW structure ++ * ++ * Clears the hardware counters by reading the counter registers. ++ **/ ++static void e1000_clear_hw_cntrs_82542(struct e1000_hw *hw) ++{ ++ DEBUGFUNC("e1000_clear_hw_cntrs_82542"); ++ ++ e1000_clear_hw_cntrs_base_generic(hw); ++ ++ E1000_READ_REG(hw, E1000_PRC64); ++ E1000_READ_REG(hw, E1000_PRC127); ++ E1000_READ_REG(hw, E1000_PRC255); ++ E1000_READ_REG(hw, E1000_PRC511); ++ E1000_READ_REG(hw, E1000_PRC1023); ++ E1000_READ_REG(hw, E1000_PRC1522); ++ E1000_READ_REG(hw, E1000_PTC64); ++ E1000_READ_REG(hw, E1000_PTC127); ++ E1000_READ_REG(hw, E1000_PTC255); ++ E1000_READ_REG(hw, E1000_PTC511); ++ E1000_READ_REG(hw, E1000_PTC1023); ++ E1000_READ_REG(hw, E1000_PTC1522); ++} +diff -r d03036c09699 drivers/net/e1000/e1000_82543.c +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/e1000/e1000_82543.c Mon Jun 15 11:43:11 2009 +0100 +@@ -0,0 +1,1596 @@ ++/******************************************************************************* ++ ++ Intel PRO/1000 Linux driver ++ Copyright(c) 1999 - 2008 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ Linux NICS ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++/* ++ * 82543GC Gigabit Ethernet Controller (Fiber) ++ * 82543GC Gigabit Ethernet Controller (Copper) ++ * 82544EI Gigabit Ethernet Controller (Copper) ++ * 82544EI Gigabit Ethernet Controller (Fiber) ++ * 82544GC Gigabit Ethernet Controller (Copper) ++ * 82544GC Gigabit Ethernet Controller (LOM) ++ */ ++ ++#include "e1000_api.h" ++ ++static s32 e1000_init_phy_params_82543(struct e1000_hw *hw); ++static s32 e1000_init_nvm_params_82543(struct e1000_hw *hw); ++static s32 e1000_init_mac_params_82543(struct e1000_hw *hw); ++static s32 e1000_read_phy_reg_82543(struct e1000_hw *hw, u32 offset, ++ u16 *data); ++static s32 e1000_write_phy_reg_82543(struct e1000_hw *hw, u32 offset, ++ u16 data); ++static s32 e1000_phy_force_speed_duplex_82543(struct e1000_hw *hw); ++static s32 e1000_phy_hw_reset_82543(struct e1000_hw *hw); ++static s32 e1000_reset_hw_82543(struct e1000_hw *hw); ++static s32 e1000_init_hw_82543(struct e1000_hw *hw); ++static s32 e1000_setup_link_82543(struct e1000_hw *hw); ++static s32 e1000_setup_copper_link_82543(struct e1000_hw *hw); ++static s32 e1000_setup_fiber_link_82543(struct e1000_hw *hw); ++static s32 e1000_check_for_copper_link_82543(struct e1000_hw *hw); ++static s32 e1000_check_for_fiber_link_82543(struct e1000_hw *hw); ++static s32 e1000_led_on_82543(struct e1000_hw *hw); ++static s32 e1000_led_off_82543(struct e1000_hw *hw); ++static void e1000_write_vfta_82543(struct e1000_hw *hw, u32 offset, ++ u32 value); ++static void e1000_mta_set_82543(struct e1000_hw *hw, u32 hash_value); ++static void e1000_clear_hw_cntrs_82543(struct e1000_hw *hw); ++static s32 e1000_config_mac_to_phy_82543(struct e1000_hw *hw); ++static bool e1000_init_phy_disabled_82543(struct e1000_hw *hw); ++static void e1000_lower_mdi_clk_82543(struct e1000_hw *hw, u32 *ctrl); ++static s32 e1000_polarity_reversal_workaround_82543(struct e1000_hw *hw); ++static void e1000_raise_mdi_clk_82543(struct e1000_hw *hw, u32 *ctrl); ++static u16 e1000_shift_in_mdi_bits_82543(struct e1000_hw *hw); ++static void e1000_shift_out_mdi_bits_82543(struct e1000_hw *hw, u32 data, ++ u16 count); ++static bool e1000_tbi_compatibility_enabled_82543(struct e1000_hw *hw); ++static void e1000_set_tbi_sbp_82543(struct e1000_hw *hw, bool state); ++ ++/** ++ * e1000_init_phy_params_82543 - Init PHY func ptrs. ++ * @hw: pointer to the HW structure ++ **/ ++static s32 e1000_init_phy_params_82543(struct e1000_hw *hw) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ s32 ret_val = E1000_SUCCESS; ++ ++ DEBUGFUNC("e1000_init_phy_params_82543"); ++ ++ if (hw->phy.media_type != e1000_media_type_copper) { ++ phy->type = e1000_phy_none; ++ goto out; ++ } else { ++ phy->ops.power_up = e1000_power_up_phy_copper; ++ phy->ops.power_down = e1000_power_down_phy_copper; ++ } ++ ++ phy->addr = 1; ++ phy->autoneg_mask = AUTONEG_ADVERTISE_SPEED_DEFAULT; ++ phy->reset_delay_us = 10000; ++ phy->type = e1000_phy_m88; ++ ++ /* Function Pointers */ ++ phy->ops.check_polarity = e1000_check_polarity_m88; ++ phy->ops.commit = e1000_phy_sw_reset_generic; ++ phy->ops.force_speed_duplex = e1000_phy_force_speed_duplex_82543; ++ phy->ops.get_cable_length = e1000_get_cable_length_m88; ++ phy->ops.get_cfg_done = e1000_get_cfg_done_generic; ++ phy->ops.read_reg = (hw->mac.type == e1000_82543) ++ ? e1000_read_phy_reg_82543 ++ : e1000_read_phy_reg_m88; ++ phy->ops.reset = (hw->mac.type == e1000_82543) ++ ? e1000_phy_hw_reset_82543 ++ : e1000_phy_hw_reset_generic; ++ phy->ops.write_reg = (hw->mac.type == e1000_82543) ++ ? e1000_write_phy_reg_82543 ++ : e1000_write_phy_reg_m88; ++ phy->ops.get_info = e1000_get_phy_info_m88; ++ ++ /* ++ * The external PHY of the 82543 can be in a funky state. ++ * Resetting helps us read the PHY registers for acquiring ++ * the PHY ID. ++ */ ++ if (!e1000_init_phy_disabled_82543(hw)) { ++ ret_val = phy->ops.reset(hw); ++ if (ret_val) { ++ DEBUGOUT("Resetting PHY during init failed.\n"); ++ goto out; ++ } ++ msec_delay(20); ++ } ++ ++ ret_val = e1000_get_phy_id(hw); ++ if (ret_val) ++ goto out; ++ ++ /* Verify phy id */ ++ switch (hw->mac.type) { ++ case e1000_82543: ++ if (phy->id != M88E1000_E_PHY_ID) { ++ ret_val = -E1000_ERR_PHY; ++ goto out; ++ } ++ break; ++ case e1000_82544: ++ if (phy->id != M88E1000_I_PHY_ID) { ++ ret_val = -E1000_ERR_PHY; ++ goto out; ++ } ++ break; ++ default: ++ ret_val = -E1000_ERR_PHY; ++ goto out; ++ break; ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_init_nvm_params_82543 - Init NVM func ptrs. ++ * @hw: pointer to the HW structure ++ **/ ++static s32 e1000_init_nvm_params_82543(struct e1000_hw *hw) ++{ ++ struct e1000_nvm_info *nvm = &hw->nvm; ++ ++ DEBUGFUNC("e1000_init_nvm_params_82543"); ++ ++ nvm->type = e1000_nvm_eeprom_microwire; ++ nvm->word_size = 64; ++ nvm->delay_usec = 50; ++ nvm->address_bits = 6; ++ nvm->opcode_bits = 3; ++ ++ /* Function Pointers */ ++ nvm->ops.read = e1000_read_nvm_microwire; ++ nvm->ops.update = e1000_update_nvm_checksum_generic; ++ nvm->ops.valid_led_default = e1000_valid_led_default_generic; ++ nvm->ops.validate = e1000_validate_nvm_checksum_generic; ++ nvm->ops.write = e1000_write_nvm_microwire; ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_init_mac_params_82543 - Init MAC func ptrs. ++ * @hw: pointer to the HW structure ++ **/ ++static s32 e1000_init_mac_params_82543(struct e1000_hw *hw) ++{ ++ struct e1000_mac_info *mac = &hw->mac; ++ ++ DEBUGFUNC("e1000_init_mac_params_82543"); ++ ++ /* Set media type */ ++ switch (hw->device_id) { ++ case E1000_DEV_ID_82543GC_FIBER: ++ case E1000_DEV_ID_82544EI_FIBER: ++ hw->phy.media_type = e1000_media_type_fiber; ++ break; ++ default: ++ hw->phy.media_type = e1000_media_type_copper; ++ break; ++ } ++ ++ /* Set mta register count */ ++ mac->mta_reg_count = 128; ++ /* Set rar entry count */ ++ mac->rar_entry_count = E1000_RAR_ENTRIES; ++ ++ /* Function pointers */ ++ ++ /* bus type/speed/width */ ++ mac->ops.get_bus_info = e1000_get_bus_info_pci_generic; ++ /* function id */ ++ mac->ops.set_lan_id = e1000_set_lan_id_multi_port_pci; ++ /* reset */ ++ mac->ops.reset_hw = e1000_reset_hw_82543; ++ /* hw initialization */ ++ mac->ops.init_hw = e1000_init_hw_82543; ++ /* link setup */ ++ mac->ops.setup_link = e1000_setup_link_82543; ++ /* physical interface setup */ ++ mac->ops.setup_physical_interface = ++ (hw->phy.media_type == e1000_media_type_copper) ++ ? e1000_setup_copper_link_82543 ++ : e1000_setup_fiber_link_82543; ++ /* check for link */ ++ mac->ops.check_for_link = ++ (hw->phy.media_type == e1000_media_type_copper) ++ ? e1000_check_for_copper_link_82543 ++ : e1000_check_for_fiber_link_82543; ++ /* link info */ ++ mac->ops.get_link_up_info = ++ (hw->phy.media_type == e1000_media_type_copper) ++ ? e1000_get_speed_and_duplex_copper_generic ++ : e1000_get_speed_and_duplex_fiber_serdes_generic; ++ /* multicast address update */ ++ mac->ops.update_mc_addr_list = e1000_update_mc_addr_list_generic; ++ /* writing VFTA */ ++ mac->ops.write_vfta = e1000_write_vfta_82543; ++ /* clearing VFTA */ ++ mac->ops.clear_vfta = e1000_clear_vfta_generic; ++ /* setting MTA */ ++ mac->ops.mta_set = e1000_mta_set_82543; ++ /* turn on/off LED */ ++ mac->ops.led_on = e1000_led_on_82543; ++ mac->ops.led_off = e1000_led_off_82543; ++ /* clear hardware counters */ ++ mac->ops.clear_hw_cntrs = e1000_clear_hw_cntrs_82543; ++ ++ /* Set tbi compatibility */ ++ if ((hw->mac.type != e1000_82543) || ++ (hw->phy.media_type == e1000_media_type_fiber)) ++ e1000_set_tbi_compatibility_82543(hw, false); ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_init_function_pointers_82543 - Init func ptrs. ++ * @hw: pointer to the HW structure ++ * ++ * Called to initialize all function pointers and parameters. ++ **/ ++void e1000_init_function_pointers_82543(struct e1000_hw *hw) ++{ ++ DEBUGFUNC("e1000_init_function_pointers_82543"); ++ ++ hw->mac.ops.init_params = e1000_init_mac_params_82543; ++ hw->nvm.ops.init_params = e1000_init_nvm_params_82543; ++ hw->phy.ops.init_params = e1000_init_phy_params_82543; ++} ++ ++/** ++ * e1000_tbi_compatibility_enabled_82543 - Returns TBI compat status ++ * @hw: pointer to the HW structure ++ * ++ * Returns the current status of 10-bit Interface (TBI) compatibility ++ * (enabled/disabled). ++ **/ ++static bool e1000_tbi_compatibility_enabled_82543(struct e1000_hw *hw) ++{ ++ struct e1000_dev_spec_82543 *dev_spec = &hw->dev_spec._82543; ++ bool state = false; ++ ++ DEBUGFUNC("e1000_tbi_compatibility_enabled_82543"); ++ ++ if (hw->mac.type != e1000_82543) { ++ DEBUGOUT("TBI compatibility workaround for 82543 only.\n"); ++ goto out; ++ } ++ ++ state = (dev_spec->tbi_compatibility & TBI_COMPAT_ENABLED) ++ ? true : false; ++ ++out: ++ return state; ++} ++ ++/** ++ * e1000_set_tbi_compatibility_82543 - Set TBI compatibility ++ * @hw: pointer to the HW structure ++ * @state: enable/disable TBI compatibility ++ * ++ * Enables or disabled 10-bit Interface (TBI) compatibility. ++ **/ ++void e1000_set_tbi_compatibility_82543(struct e1000_hw *hw, bool state) ++{ ++ struct e1000_dev_spec_82543 *dev_spec = &hw->dev_spec._82543; ++ ++ DEBUGFUNC("e1000_set_tbi_compatibility_82543"); ++ ++ if (hw->mac.type != e1000_82543) { ++ DEBUGOUT("TBI compatibility workaround for 82543 only.\n"); ++ goto out; ++ } ++ ++ if (state) ++ dev_spec->tbi_compatibility |= TBI_COMPAT_ENABLED; ++ else ++ dev_spec->tbi_compatibility &= ~TBI_COMPAT_ENABLED; ++ ++out: ++ return; ++} ++ ++/** ++ * e1000_tbi_sbp_enabled_82543 - Returns TBI SBP status ++ * @hw: pointer to the HW structure ++ * ++ * Returns the current status of 10-bit Interface (TBI) store bad packet (SBP) ++ * (enabled/disabled). ++ **/ ++bool e1000_tbi_sbp_enabled_82543(struct e1000_hw *hw) ++{ ++ struct e1000_dev_spec_82543 *dev_spec = &hw->dev_spec._82543; ++ bool state = false; ++ ++ DEBUGFUNC("e1000_tbi_sbp_enabled_82543"); ++ ++ if (hw->mac.type != e1000_82543) { ++ DEBUGOUT("TBI compatibility workaround for 82543 only.\n"); ++ goto out; ++ } ++ ++ state = (dev_spec->tbi_compatibility & TBI_SBP_ENABLED) ++ ? true : false; ++ ++out: ++ return state; ++} ++ ++/** ++ * e1000_set_tbi_sbp_82543 - Set TBI SBP ++ * @hw: pointer to the HW structure ++ * @state: enable/disable TBI store bad packet ++ * ++ * Enables or disabled 10-bit Interface (TBI) store bad packet (SBP). ++ **/ ++static void e1000_set_tbi_sbp_82543(struct e1000_hw *hw, bool state) ++{ ++ struct e1000_dev_spec_82543 *dev_spec = &hw->dev_spec._82543; ++ ++ DEBUGFUNC("e1000_set_tbi_sbp_82543"); ++ ++ if (state && e1000_tbi_compatibility_enabled_82543(hw)) ++ dev_spec->tbi_compatibility |= TBI_SBP_ENABLED; ++ else ++ dev_spec->tbi_compatibility &= ~TBI_SBP_ENABLED; ++ ++ return; ++} ++ ++/** ++ * e1000_init_phy_disabled_82543 - Returns init PHY status ++ * @hw: pointer to the HW structure ++ * ++ * Returns the current status of whether PHY initialization is disabled. ++ * True if PHY initialization is disabled else false. ++ **/ ++static bool e1000_init_phy_disabled_82543(struct e1000_hw *hw) ++{ ++ struct e1000_dev_spec_82543 *dev_spec = &hw->dev_spec._82543; ++ bool ret_val; ++ ++ DEBUGFUNC("e1000_init_phy_disabled_82543"); ++ ++ if (hw->mac.type != e1000_82543) { ++ ret_val = false; ++ goto out; ++ } ++ ++ ret_val = dev_spec->init_phy_disabled; ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_tbi_adjust_stats_82543 - Adjust stats when TBI enabled ++ * @hw: pointer to the HW structure ++ * @stats: Struct containing statistic register values ++ * @frame_len: The length of the frame in question ++ * @mac_addr: The Ethernet destination address of the frame in question ++ * @max_frame_size: The maximum frame size ++ * ++ * Adjusts the statistic counters when a frame is accepted by TBI_ACCEPT ++ **/ ++void e1000_tbi_adjust_stats_82543(struct e1000_hw *hw, ++ struct e1000_hw_stats *stats, u32 frame_len, ++ u8 *mac_addr, u32 max_frame_size) ++{ ++ if (!(e1000_tbi_sbp_enabled_82543(hw))) ++ goto out; ++ ++ /* First adjust the frame length. */ ++ frame_len--; ++ /* ++ * We need to adjust the statistics counters, since the hardware ++ * counters overcount this packet as a CRC error and undercount ++ * the packet as a good packet ++ */ ++ /* This packet should not be counted as a CRC error. */ ++ stats->crcerrs--; ++ /* This packet does count as a Good Packet Received. */ ++ stats->gprc++; ++ ++ /* Adjust the Good Octets received counters */ ++ stats->gorc += frame_len; ++ ++ /* ++ * Is this a broadcast or multicast? Check broadcast first, ++ * since the test for a multicast frame will test positive on ++ * a broadcast frame. ++ */ ++ if ((mac_addr[0] == 0xff) && (mac_addr[1] == 0xff)) ++ /* Broadcast packet */ ++ stats->bprc++; ++ else if (*mac_addr & 0x01) ++ /* Multicast packet */ ++ stats->mprc++; ++ ++ /* ++ * In this case, the hardware has overcounted the number of ++ * oversize frames. ++ */ ++ if ((frame_len == max_frame_size) && (stats->roc > 0)) ++ stats->roc--; ++ ++ /* ++ * Adjust the bin counters when the extra byte put the frame in the ++ * wrong bin. Remember that the frame_len was adjusted above. ++ */ ++ if (frame_len == 64) { ++ stats->prc64++; ++ stats->prc127--; ++ } else if (frame_len == 127) { ++ stats->prc127++; ++ stats->prc255--; ++ } else if (frame_len == 255) { ++ stats->prc255++; ++ stats->prc511--; ++ } else if (frame_len == 511) { ++ stats->prc511++; ++ stats->prc1023--; ++ } else if (frame_len == 1023) { ++ stats->prc1023++; ++ stats->prc1522--; ++ } else if (frame_len == 1522) { ++ stats->prc1522++; ++ } ++ ++out: ++ return; ++} ++ ++/** ++ * e1000_read_phy_reg_82543 - Read PHY register ++ * @hw: pointer to the HW structure ++ * @offset: register offset to be read ++ * @data: pointer to the read data ++ * ++ * Reads the PHY at offset and stores the information read to data. ++ **/ ++static s32 e1000_read_phy_reg_82543(struct e1000_hw *hw, u32 offset, u16 *data) ++{ ++ u32 mdic; ++ s32 ret_val = E1000_SUCCESS; ++ ++ DEBUGFUNC("e1000_read_phy_reg_82543"); ++ ++ if (offset > MAX_PHY_REG_ADDRESS) { ++ DEBUGOUT1("PHY Address %d is out of range\n", offset); ++ ret_val = -E1000_ERR_PARAM; ++ goto out; ++ } ++ ++ /* ++ * We must first send a preamble through the MDIO pin to signal the ++ * beginning of an MII instruction. This is done by sending 32 ++ * consecutive "1" bits. ++ */ ++ e1000_shift_out_mdi_bits_82543(hw, PHY_PREAMBLE, PHY_PREAMBLE_SIZE); ++ ++ /* ++ * Now combine the next few fields that are required for a read ++ * operation. We use this method instead of calling the ++ * e1000_shift_out_mdi_bits routine five different times. The format ++ * of an MII read instruction consists of a shift out of 14 bits and ++ * is defined as follows: ++ * ++ * followed by a shift in of 18 bits. This first two bits shifted in ++ * are TurnAround bits used to avoid contention on the MDIO pin when a ++ * READ operation is performed. These two bits are thrown away ++ * followed by a shift in of 16 bits which contains the desired data. ++ */ ++ mdic = (offset | (hw->phy.addr << 5) | ++ (PHY_OP_READ << 10) | (PHY_SOF << 12)); ++ ++ e1000_shift_out_mdi_bits_82543(hw, mdic, 14); ++ ++ /* ++ * Now that we've shifted out the read command to the MII, we need to ++ * "shift in" the 16-bit value (18 total bits) of the requested PHY ++ * register address. ++ */ ++ *data = e1000_shift_in_mdi_bits_82543(hw); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_write_phy_reg_82543 - Write PHY register ++ * @hw: pointer to the HW structure ++ * @offset: register offset to be written ++ * @data: pointer to the data to be written at offset ++ * ++ * Writes data to the PHY at offset. ++ **/ ++static s32 e1000_write_phy_reg_82543(struct e1000_hw *hw, u32 offset, u16 data) ++{ ++ u32 mdic; ++ s32 ret_val = E1000_SUCCESS; ++ ++ DEBUGFUNC("e1000_write_phy_reg_82543"); ++ ++ if (offset > MAX_PHY_REG_ADDRESS) { ++ DEBUGOUT1("PHY Address %d is out of range\n", offset); ++ ret_val = -E1000_ERR_PARAM; ++ goto out; ++ } ++ ++ /* ++ * We'll need to use the SW defined pins to shift the write command ++ * out to the PHY. We first send a preamble to the PHY to signal the ++ * beginning of the MII instruction. This is done by sending 32 ++ * consecutive "1" bits. ++ */ ++ e1000_shift_out_mdi_bits_82543(hw, PHY_PREAMBLE, PHY_PREAMBLE_SIZE); ++ ++ /* ++ * Now combine the remaining required fields that will indicate a ++ * write operation. We use this method instead of calling the ++ * e1000_shift_out_mdi_bits routine for each field in the command. The ++ * format of a MII write instruction is as follows: ++ * . ++ */ ++ mdic = ((PHY_TURNAROUND) | (offset << 2) | (hw->phy.addr << 7) | ++ (PHY_OP_WRITE << 12) | (PHY_SOF << 14)); ++ mdic <<= 16; ++ mdic |= (u32) data; ++ ++ e1000_shift_out_mdi_bits_82543(hw, mdic, 32); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_raise_mdi_clk_82543 - Raise Management Data Input clock ++ * @hw: pointer to the HW structure ++ * @ctrl: pointer to the control register ++ * ++ * Raise the management data input clock by setting the MDC bit in the control ++ * register. ++ **/ ++static void e1000_raise_mdi_clk_82543(struct e1000_hw *hw, u32 *ctrl) ++{ ++ /* ++ * Raise the clock input to the Management Data Clock (by setting the ++ * MDC bit), and then delay a sufficient amount of time. ++ */ ++ E1000_WRITE_REG(hw, E1000_CTRL, (*ctrl | E1000_CTRL_MDC)); ++ E1000_WRITE_FLUSH(hw); ++ usec_delay(10); ++} ++ ++/** ++ * e1000_lower_mdi_clk_82543 - Lower Management Data Input clock ++ * @hw: pointer to the HW structure ++ * @ctrl: pointer to the control register ++ * ++ * Lower the management data input clock by clearing the MDC bit in the ++ * control register. ++ **/ ++static void e1000_lower_mdi_clk_82543(struct e1000_hw *hw, u32 *ctrl) ++{ ++ /* ++ * Lower the clock input to the Management Data Clock (by clearing the ++ * MDC bit), and then delay a sufficient amount of time. ++ */ ++ E1000_WRITE_REG(hw, E1000_CTRL, (*ctrl & ~E1000_CTRL_MDC)); ++ E1000_WRITE_FLUSH(hw); ++ usec_delay(10); ++} ++ ++/** ++ * e1000_shift_out_mdi_bits_82543 - Shift data bits our to the PHY ++ * @hw: pointer to the HW structure ++ * @data: data to send to the PHY ++ * @count: number of bits to shift out ++ * ++ * We need to shift 'count' bits out to the PHY. So, the value in the ++ * "data" parameter will be shifted out to the PHY one bit at a time. ++ * In order to do this, "data" must be broken down into bits. ++ **/ ++static void e1000_shift_out_mdi_bits_82543(struct e1000_hw *hw, u32 data, ++ u16 count) ++{ ++ u32 ctrl, mask; ++ ++ /* ++ * We need to shift "count" number of bits out to the PHY. So, the ++ * value in the "data" parameter will be shifted out to the PHY one ++ * bit at a time. In order to do this, "data" must be broken down ++ * into bits. ++ */ ++ mask = 0x01; ++ mask <<= (count -1); ++ ++ ctrl = E1000_READ_REG(hw, E1000_CTRL); ++ ++ /* Set MDIO_DIR and MDC_DIR direction bits to be used as output pins. */ ++ ctrl |= (E1000_CTRL_MDIO_DIR | E1000_CTRL_MDC_DIR); ++ ++ while (mask) { ++ /* ++ * A "1" is shifted out to the PHY by setting the MDIO bit to ++ * "1" and then raising and lowering the Management Data Clock. ++ * A "0" is shifted out to the PHY by setting the MDIO bit to ++ * "0" and then raising and lowering the clock. ++ */ ++ if (data & mask) ctrl |= E1000_CTRL_MDIO; ++ else ctrl &= ~E1000_CTRL_MDIO; ++ ++ E1000_WRITE_REG(hw, E1000_CTRL, ctrl); ++ E1000_WRITE_FLUSH(hw); ++ ++ usec_delay(10); ++ ++ e1000_raise_mdi_clk_82543(hw, &ctrl); ++ e1000_lower_mdi_clk_82543(hw, &ctrl); ++ ++ mask >>= 1; ++ } ++} ++ ++/** ++ * e1000_shift_in_mdi_bits_82543 - Shift data bits in from the PHY ++ * @hw: pointer to the HW structure ++ * ++ * In order to read a register from the PHY, we need to shift 18 bits ++ * in from the PHY. Bits are "shifted in" by raising the clock input to ++ * the PHY (setting the MDC bit), and then reading the value of the data out ++ * MDIO bit. ++ **/ ++static u16 e1000_shift_in_mdi_bits_82543(struct e1000_hw *hw) ++{ ++ u32 ctrl; ++ u16 data = 0; ++ u8 i; ++ ++ /* ++ * In order to read a register from the PHY, we need to shift in a ++ * total of 18 bits from the PHY. The first two bit (turnaround) ++ * times are used to avoid contention on the MDIO pin when a read ++ * operation is performed. These two bits are ignored by us and ++ * thrown away. Bits are "shifted in" by raising the input to the ++ * Management Data Clock (setting the MDC bit) and then reading the ++ * value of the MDIO bit. ++ */ ++ ctrl = E1000_READ_REG(hw, E1000_CTRL); ++ ++ /* ++ * Clear MDIO_DIR (SWDPIO1) to indicate this bit is to be used as ++ * input. ++ */ ++ ctrl &= ~E1000_CTRL_MDIO_DIR; ++ ctrl &= ~E1000_CTRL_MDIO; ++ ++ E1000_WRITE_REG(hw, E1000_CTRL, ctrl); ++ E1000_WRITE_FLUSH(hw); ++ ++ /* ++ * Raise and lower the clock before reading in the data. This accounts ++ * for the turnaround bits. The first clock occurred when we clocked ++ * out the last bit of the Register Address. ++ */ ++ e1000_raise_mdi_clk_82543(hw, &ctrl); ++ e1000_lower_mdi_clk_82543(hw, &ctrl); ++ ++ for (data = 0, i = 0; i < 16; i++) { ++ data <<= 1; ++ e1000_raise_mdi_clk_82543(hw, &ctrl); ++ ctrl = E1000_READ_REG(hw, E1000_CTRL); ++ /* Check to see if we shifted in a "1". */ ++ if (ctrl & E1000_CTRL_MDIO) ++ data |= 1; ++ e1000_lower_mdi_clk_82543(hw, &ctrl); ++ } ++ ++ e1000_raise_mdi_clk_82543(hw, &ctrl); ++ e1000_lower_mdi_clk_82543(hw, &ctrl); ++ ++ return data; ++} ++ ++/** ++ * e1000_phy_force_speed_duplex_82543 - Force speed/duplex for PHY ++ * @hw: pointer to the HW structure ++ * ++ * Calls the function to force speed and duplex for the m88 PHY, and ++ * if the PHY is not auto-negotiating and the speed is forced to 10Mbit, ++ * then call the function for polarity reversal workaround. ++ **/ ++static s32 e1000_phy_force_speed_duplex_82543(struct e1000_hw *hw) ++{ ++ s32 ret_val; ++ ++ DEBUGFUNC("e1000_phy_force_speed_duplex_82543"); ++ ++ ret_val = e1000_phy_force_speed_duplex_m88(hw); ++ if (ret_val) ++ goto out; ++ ++ if (!hw->mac.autoneg && ++ (hw->mac.forced_speed_duplex & E1000_ALL_10_SPEED)) ++ ret_val = e1000_polarity_reversal_workaround_82543(hw); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_polarity_reversal_workaround_82543 - Workaround polarity reversal ++ * @hw: pointer to the HW structure ++ * ++ * When forcing link to 10 Full or 10 Half, the PHY can reverse the polarity ++ * inadvertently. To workaround the issue, we disable the transmitter on ++ * the PHY until we have established the link partner's link parameters. ++ **/ ++static s32 e1000_polarity_reversal_workaround_82543(struct e1000_hw *hw) ++{ ++ s32 ret_val = E1000_SUCCESS; ++ u16 mii_status_reg; ++ u16 i; ++ bool link; ++ ++ if (!(hw->phy.ops.write_reg)) ++ goto out; ++ ++ /* Polarity reversal workaround for forced 10F/10H links. */ ++ ++ /* Disable the transmitter on the PHY */ ++ ++ ret_val = hw->phy.ops.write_reg(hw, M88E1000_PHY_PAGE_SELECT, 0x0019); ++ if (ret_val) ++ goto out; ++ ret_val = hw->phy.ops.write_reg(hw, M88E1000_PHY_GEN_CONTROL, 0xFFFF); ++ if (ret_val) ++ goto out; ++ ++ ret_val = hw->phy.ops.write_reg(hw, M88E1000_PHY_PAGE_SELECT, 0x0000); ++ if (ret_val) ++ goto out; ++ ++ /* ++ * This loop will early-out if the NO link condition has been met. ++ * In other words, DO NOT use e1000_phy_has_link_generic() here. ++ */ ++ for (i = PHY_FORCE_TIME; i > 0; i--) { ++ /* ++ * Read the MII Status Register and wait for Link Status bit ++ * to be clear. ++ */ ++ ++ ret_val = hw->phy.ops.read_reg(hw, PHY_STATUS, &mii_status_reg); ++ if (ret_val) ++ goto out; ++ ++ ret_val = hw->phy.ops.read_reg(hw, PHY_STATUS, &mii_status_reg); ++ if (ret_val) ++ goto out; ++ ++ if ((mii_status_reg & ~MII_SR_LINK_STATUS) == 0) ++ break; ++ msec_delay_irq(100); ++ } ++ ++ /* Recommended delay time after link has been lost */ ++ msec_delay_irq(1000); ++ ++ /* Now we will re-enable the transmitter on the PHY */ ++ ++ ret_val = hw->phy.ops.write_reg(hw, M88E1000_PHY_PAGE_SELECT, 0x0019); ++ if (ret_val) ++ goto out; ++ msec_delay_irq(50); ++ ret_val = hw->phy.ops.write_reg(hw, M88E1000_PHY_GEN_CONTROL, 0xFFF0); ++ if (ret_val) ++ goto out; ++ msec_delay_irq(50); ++ ret_val = hw->phy.ops.write_reg(hw, M88E1000_PHY_GEN_CONTROL, 0xFF00); ++ if (ret_val) ++ goto out; ++ msec_delay_irq(50); ++ ret_val = hw->phy.ops.write_reg(hw, M88E1000_PHY_GEN_CONTROL, 0x0000); ++ if (ret_val) ++ goto out; ++ ++ ret_val = hw->phy.ops.write_reg(hw, M88E1000_PHY_PAGE_SELECT, 0x0000); ++ if (ret_val) ++ goto out; ++ ++ /* ++ * Read the MII Status Register and wait for Link Status bit ++ * to be set. ++ */ ++ ret_val = e1000_phy_has_link_generic(hw, PHY_FORCE_TIME, 100000, &link); ++ if (ret_val) ++ goto out; ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_phy_hw_reset_82543 - PHY hardware reset ++ * @hw: pointer to the HW structure ++ * ++ * Sets the PHY_RESET_DIR bit in the extended device control register ++ * to put the PHY into a reset and waits for completion. Once the reset ++ * has been accomplished, clear the PHY_RESET_DIR bit to take the PHY out ++ * of reset. ++ **/ ++static s32 e1000_phy_hw_reset_82543(struct e1000_hw *hw) ++{ ++ u32 ctrl_ext; ++ s32 ret_val; ++ ++ DEBUGFUNC("e1000_phy_hw_reset_82543"); ++ ++ /* ++ * Read the Extended Device Control Register, assert the PHY_RESET_DIR ++ * bit to put the PHY into reset... ++ */ ++ ctrl_ext = E1000_READ_REG(hw, E1000_CTRL_EXT); ++ ctrl_ext |= E1000_CTRL_EXT_SDP4_DIR; ++ ctrl_ext &= ~E1000_CTRL_EXT_SDP4_DATA; ++ E1000_WRITE_REG(hw, E1000_CTRL_EXT, ctrl_ext); ++ E1000_WRITE_FLUSH(hw); ++ ++ msec_delay(10); ++ ++ /* ...then take it out of reset. */ ++ ctrl_ext |= E1000_CTRL_EXT_SDP4_DATA; ++ E1000_WRITE_REG(hw, E1000_CTRL_EXT, ctrl_ext); ++ E1000_WRITE_FLUSH(hw); ++ ++ usec_delay(150); ++ ++ if (!(hw->phy.ops.get_cfg_done)) ++ return E1000_SUCCESS; ++ ++ ret_val = hw->phy.ops.get_cfg_done(hw); ++ ++ return ret_val; ++} ++ ++/** ++ * e1000_reset_hw_82543 - Reset hardware ++ * @hw: pointer to the HW structure ++ * ++ * This resets the hardware into a known state. ++ **/ ++static s32 e1000_reset_hw_82543(struct e1000_hw *hw) ++{ ++ u32 ctrl, icr; ++ s32 ret_val = E1000_SUCCESS; ++ ++ DEBUGFUNC("e1000_reset_hw_82543"); ++ ++ DEBUGOUT("Masking off all interrupts\n"); ++ E1000_WRITE_REG(hw, E1000_IMC, 0xffffffff); ++ ++ E1000_WRITE_REG(hw, E1000_RCTL, 0); ++ E1000_WRITE_REG(hw, E1000_TCTL, E1000_TCTL_PSP); ++ E1000_WRITE_FLUSH(hw); ++ ++ e1000_set_tbi_sbp_82543(hw, false); ++ ++ /* ++ * Delay to allow any outstanding PCI transactions to complete before ++ * resetting the device ++ */ ++ msec_delay(10); ++ ++ ctrl = E1000_READ_REG(hw, E1000_CTRL); ++ ++ DEBUGOUT("Issuing a global reset to 82543/82544 MAC\n"); ++ if (hw->mac.type == e1000_82543) { ++ E1000_WRITE_REG(hw, E1000_CTRL, ctrl | E1000_CTRL_RST); ++ } else { ++ /* ++ * The 82544 can't ACK the 64-bit write when issuing the ++ * reset, so use IO-mapping as a workaround. ++ */ ++ E1000_WRITE_REG_IO(hw, E1000_CTRL, ctrl | E1000_CTRL_RST); ++ } ++ ++ /* ++ * After MAC reset, force reload of NVM to restore power-on ++ * settings to device. ++ */ ++ hw->nvm.ops.reload(hw); ++ msec_delay(2); ++ ++ /* Masking off and clearing any pending interrupts */ ++ E1000_WRITE_REG(hw, E1000_IMC, 0xffffffff); ++ icr = E1000_READ_REG(hw, E1000_ICR); ++ ++ return ret_val; ++} ++ ++/** ++ * e1000_init_hw_82543 - Initialize hardware ++ * @hw: pointer to the HW structure ++ * ++ * This inits the hardware readying it for operation. ++ **/ ++static s32 e1000_init_hw_82543(struct e1000_hw *hw) ++{ ++ struct e1000_mac_info *mac = &hw->mac; ++ struct e1000_dev_spec_82543 *dev_spec = &hw->dev_spec._82543; ++ u32 ctrl; ++ s32 ret_val; ++ u16 i; ++ ++ DEBUGFUNC("e1000_init_hw_82543"); ++ ++ /* Disabling VLAN filtering */ ++ E1000_WRITE_REG(hw, E1000_VET, 0); ++ mac->ops.clear_vfta(hw); ++ ++ /* Setup the receive address. */ ++ e1000_init_rx_addrs_generic(hw, mac->rar_entry_count); ++ ++ /* Zero out the Multicast HASH table */ ++ DEBUGOUT("Zeroing the MTA\n"); ++ for (i = 0; i < mac->mta_reg_count; i++) { ++ E1000_WRITE_REG_ARRAY(hw, E1000_MTA, i, 0); ++ E1000_WRITE_FLUSH(hw); ++ } ++ ++ /* ++ * Set the PCI priority bit correctly in the CTRL register. This ++ * determines if the adapter gives priority to receives, or if it ++ * gives equal priority to transmits and receives. ++ */ ++ if (hw->mac.type == e1000_82543 && dev_spec->dma_fairness) { ++ ctrl = E1000_READ_REG(hw, E1000_CTRL); ++ E1000_WRITE_REG(hw, E1000_CTRL, ctrl | E1000_CTRL_PRIOR); ++ } ++ ++ e1000_pcix_mmrbc_workaround_generic(hw); ++ ++ /* Setup link and flow control */ ++ ret_val = mac->ops.setup_link(hw); ++ ++ /* ++ * Clear all of the statistics registers (clear on read). It is ++ * important that we do this after we have tried to establish link ++ * because the symbol error count will increment wildly if there ++ * is no link. ++ */ ++ e1000_clear_hw_cntrs_82543(hw); ++ ++ return ret_val; ++} ++ ++/** ++ * e1000_setup_link_82543 - Setup flow control and link settings ++ * @hw: pointer to the HW structure ++ * ++ * Read the EEPROM to determine the initial polarity value and write the ++ * extended device control register with the information before calling ++ * the generic setup link function, which does the following: ++ * Determines which flow control settings to use, then configures flow ++ * control. Calls the appropriate media-specific link configuration ++ * function. Assuming the adapter has a valid link partner, a valid link ++ * should be established. Assumes the hardware has previously been reset ++ * and the transmitter and receiver are not enabled. ++ **/ ++static s32 e1000_setup_link_82543(struct e1000_hw *hw) ++{ ++ u32 ctrl_ext; ++ s32 ret_val; ++ u16 data; ++ ++ DEBUGFUNC("e1000_setup_link_82543"); ++ ++ /* ++ * Take the 4 bits from NVM word 0xF that determine the initial ++ * polarity value for the SW controlled pins, and setup the ++ * Extended Device Control reg with that info. ++ * This is needed because one of the SW controlled pins is used for ++ * signal detection. So this should be done before phy setup. ++ */ ++ if (hw->mac.type == e1000_82543) { ++ ret_val = hw->nvm.ops.read(hw, NVM_INIT_CONTROL2_REG, 1, &data); ++ if (ret_val) { ++ DEBUGOUT("NVM Read Error\n"); ++ ret_val = -E1000_ERR_NVM; ++ goto out; ++ } ++ ctrl_ext = ((data & NVM_WORD0F_SWPDIO_EXT_MASK) << ++ NVM_SWDPIO_EXT_SHIFT); ++ E1000_WRITE_REG(hw, E1000_CTRL_EXT, ctrl_ext); ++ } ++ ++ ret_val = e1000_setup_link_generic(hw); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_setup_copper_link_82543 - Configure copper link settings ++ * @hw: pointer to the HW structure ++ * ++ * Configures the link for auto-neg or forced speed and duplex. Then we check ++ * for link, once link is established calls to configure collision distance ++ * and flow control are called. ++ **/ ++static s32 e1000_setup_copper_link_82543(struct e1000_hw *hw) ++{ ++ u32 ctrl; ++ s32 ret_val; ++ bool link; ++ ++ DEBUGFUNC("e1000_setup_copper_link_82543"); ++ ++ ctrl = E1000_READ_REG(hw, E1000_CTRL) | E1000_CTRL_SLU; ++ /* ++ * With 82543, we need to force speed and duplex on the MAC ++ * equal to what the PHY speed and duplex configuration is. ++ * In addition, we need to perform a hardware reset on the ++ * PHY to take it out of reset. ++ */ ++ if (hw->mac.type == e1000_82543) { ++ ctrl |= (E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX); ++ E1000_WRITE_REG(hw, E1000_CTRL, ctrl); ++ ret_val = hw->phy.ops.reset(hw); ++ if (ret_val) ++ goto out; ++ hw->phy.reset_disable = false; ++ } else { ++ ctrl &= ~(E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX); ++ E1000_WRITE_REG(hw, E1000_CTRL, ctrl); ++ } ++ ++ /* Set MDI/MDI-X, Polarity Reversal, and downshift settings */ ++ ret_val = e1000_copper_link_setup_m88(hw); ++ if (ret_val) ++ goto out; ++ ++ if (hw->mac.autoneg) { ++ /* ++ * Setup autoneg and flow control advertisement and perform ++ * autonegotiation. ++ */ ++ ret_val = e1000_copper_link_autoneg(hw); ++ if (ret_val) ++ goto out; ++ } else { ++ /* ++ * PHY will be set to 10H, 10F, 100H or 100F ++ * depending on user settings. ++ */ ++ DEBUGOUT("Forcing Speed and Duplex\n"); ++ ret_val = e1000_phy_force_speed_duplex_82543(hw); ++ if (ret_val) { ++ DEBUGOUT("Error Forcing Speed and Duplex\n"); ++ goto out; ++ } ++ } ++ ++ /* ++ * Check link status. Wait up to 100 microseconds for link to become ++ * valid. ++ */ ++ ret_val = e1000_phy_has_link_generic(hw, ++ COPPER_LINK_UP_LIMIT, ++ 10, ++ &link); ++ if (ret_val) ++ goto out; ++ ++ ++ if (link) { ++ DEBUGOUT("Valid link established!!!\n"); ++ /* Config the MAC and PHY after link is up */ ++ if (hw->mac.type == e1000_82544) { ++ e1000_config_collision_dist_generic(hw); ++ } else { ++ ret_val = e1000_config_mac_to_phy_82543(hw); ++ if (ret_val) ++ goto out; ++ } ++ ret_val = e1000_config_fc_after_link_up_generic(hw); ++ } else { ++ DEBUGOUT("Unable to establish link!!!\n"); ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_setup_fiber_link_82543 - Setup link for fiber ++ * @hw: pointer to the HW structure ++ * ++ * Configures collision distance and flow control for fiber links. Upon ++ * successful setup, poll for link. ++ **/ ++static s32 e1000_setup_fiber_link_82543(struct e1000_hw *hw) ++{ ++ u32 ctrl; ++ s32 ret_val; ++ ++ DEBUGFUNC("e1000_setup_fiber_link_82543"); ++ ++ ctrl = E1000_READ_REG(hw, E1000_CTRL); ++ ++ /* Take the link out of reset */ ++ ctrl &= ~E1000_CTRL_LRST; ++ ++ e1000_config_collision_dist_generic(hw); ++ ++ ret_val = e1000_commit_fc_settings_generic(hw); ++ if (ret_val) ++ goto out; ++ ++ DEBUGOUT("Auto-negotiation enabled\n"); ++ ++ E1000_WRITE_REG(hw, E1000_CTRL, ctrl); ++ E1000_WRITE_FLUSH(hw); ++ msec_delay(1); ++ ++ /* ++ * For these adapters, the SW definable pin 1 is cleared when the ++ * optics detect a signal. If we have a signal, then poll for a ++ * "Link-Up" indication. ++ */ ++ if (!(E1000_READ_REG(hw, E1000_CTRL) & E1000_CTRL_SWDPIN1)) { ++ ret_val = e1000_poll_fiber_serdes_link_generic(hw); ++ } else { ++ DEBUGOUT("No signal detected\n"); ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_check_for_copper_link_82543 - Check for link (Copper) ++ * @hw: pointer to the HW structure ++ * ++ * Checks the phy for link, if link exists, do the following: ++ * - check for downshift ++ * - do polarity workaround (if necessary) ++ * - configure collision distance ++ * - configure flow control after link up ++ * - configure tbi compatibility ++ **/ ++static s32 e1000_check_for_copper_link_82543(struct e1000_hw *hw) ++{ ++ struct e1000_mac_info *mac = &hw->mac; ++ u32 icr, rctl; ++ s32 ret_val; ++ u16 speed, duplex; ++ bool link; ++ ++ DEBUGFUNC("e1000_check_for_copper_link_82543"); ++ ++ if (!mac->get_link_status) { ++ ret_val = E1000_SUCCESS; ++ goto out; ++ } ++ ++ ret_val = e1000_phy_has_link_generic(hw, 1, 0, &link); ++ if (ret_val) ++ goto out; ++ ++ if (!link) ++ goto out; /* No link detected */ ++ ++ mac->get_link_status = false; ++ ++ e1000_check_downshift_generic(hw); ++ ++ /* ++ * If we are forcing speed/duplex, then we can return since ++ * we have already determined whether we have link or not. ++ */ ++ if (!mac->autoneg) { ++ /* ++ * If speed and duplex are forced to 10H or 10F, then we will ++ * implement the polarity reversal workaround. We disable ++ * interrupts first, and upon returning, place the devices ++ * interrupt state to its previous value except for the link ++ * status change interrupt which will happened due to the ++ * execution of this workaround. ++ */ ++ if (mac->forced_speed_duplex & E1000_ALL_10_SPEED) { ++ E1000_WRITE_REG(hw, E1000_IMC, 0xFFFFFFFF); ++ ret_val = e1000_polarity_reversal_workaround_82543(hw); ++ icr = E1000_READ_REG(hw, E1000_ICR); ++ E1000_WRITE_REG(hw, E1000_ICS, (icr & ~E1000_ICS_LSC)); ++ E1000_WRITE_REG(hw, E1000_IMS, IMS_ENABLE_MASK); ++ } ++ ++ ret_val = -E1000_ERR_CONFIG; ++ goto out; ++ } ++ ++ /* ++ * We have a M88E1000 PHY and Auto-Neg is enabled. If we ++ * have Si on board that is 82544 or newer, Auto ++ * Speed Detection takes care of MAC speed/duplex ++ * configuration. So we only need to configure Collision ++ * Distance in the MAC. Otherwise, we need to force ++ * speed/duplex on the MAC to the current PHY speed/duplex ++ * settings. ++ */ ++ if (mac->type == e1000_82544) ++ e1000_config_collision_dist_generic(hw); ++ else { ++ ret_val = e1000_config_mac_to_phy_82543(hw); ++ if (ret_val) { ++ DEBUGOUT("Error configuring MAC to PHY settings\n"); ++ goto out; ++ } ++ } ++ ++ /* ++ * Configure Flow Control now that Auto-Neg has completed. ++ * First, we need to restore the desired flow control ++ * settings because we may have had to re-autoneg with a ++ * different link partner. ++ */ ++ ret_val = e1000_config_fc_after_link_up_generic(hw); ++ if (ret_val) { ++ DEBUGOUT("Error configuring flow control\n"); ++ } ++ ++ /* ++ * At this point we know that we are on copper and we have ++ * auto-negotiated link. These are conditions for checking the link ++ * partner capability register. We use the link speed to determine if ++ * TBI compatibility needs to be turned on or off. If the link is not ++ * at gigabit speed, then TBI compatibility is not needed. If we are ++ * at gigabit speed, we turn on TBI compatibility. ++ */ ++ if (e1000_tbi_compatibility_enabled_82543(hw)) { ++ ret_val = mac->ops.get_link_up_info(hw, &speed, &duplex); ++ if (ret_val) { ++ DEBUGOUT("Error getting link speed and duplex\n"); ++ return ret_val; ++ } ++ if (speed != SPEED_1000) { ++ /* ++ * If link speed is not set to gigabit speed, ++ * we do not need to enable TBI compatibility. ++ */ ++ if (e1000_tbi_sbp_enabled_82543(hw)) { ++ /* ++ * If we previously were in the mode, ++ * turn it off. ++ */ ++ e1000_set_tbi_sbp_82543(hw, false); ++ rctl = E1000_READ_REG(hw, E1000_RCTL); ++ rctl &= ~E1000_RCTL_SBP; ++ E1000_WRITE_REG(hw, E1000_RCTL, rctl); ++ } ++ } else { ++ /* ++ * If TBI compatibility is was previously off, ++ * turn it on. For compatibility with a TBI link ++ * partner, we will store bad packets. Some ++ * frames have an additional byte on the end and ++ * will look like CRC errors to to the hardware. ++ */ ++ if (!e1000_tbi_sbp_enabled_82543(hw)) { ++ e1000_set_tbi_sbp_82543(hw, true); ++ rctl = E1000_READ_REG(hw, E1000_RCTL); ++ rctl |= E1000_RCTL_SBP; ++ E1000_WRITE_REG(hw, E1000_RCTL, rctl); ++ } ++ } ++ } ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_check_for_fiber_link_82543 - Check for link (Fiber) ++ * @hw: pointer to the HW structure ++ * ++ * Checks for link up on the hardware. If link is not up and we have ++ * a signal, then we need to force link up. ++ **/ ++static s32 e1000_check_for_fiber_link_82543(struct e1000_hw *hw) ++{ ++ struct e1000_mac_info *mac = &hw->mac; ++ u32 rxcw, ctrl, status; ++ s32 ret_val = E1000_SUCCESS; ++ ++ DEBUGFUNC("e1000_check_for_fiber_link_82543"); ++ ++ ctrl = E1000_READ_REG(hw, E1000_CTRL); ++ status = E1000_READ_REG(hw, E1000_STATUS); ++ rxcw = E1000_READ_REG(hw, E1000_RXCW); ++ ++ /* ++ * If we don't have link (auto-negotiation failed or link partner ++ * cannot auto-negotiate), the cable is plugged in (we have signal), ++ * and our link partner is not trying to auto-negotiate with us (we ++ * are receiving idles or data), we need to force link up. We also ++ * need to give auto-negotiation time to complete, in case the cable ++ * was just plugged in. The autoneg_failed flag does this. ++ */ ++ /* (ctrl & E1000_CTRL_SWDPIN1) == 0 == have signal */ ++ if ((!(ctrl & E1000_CTRL_SWDPIN1)) && ++ (!(status & E1000_STATUS_LU)) && ++ (!(rxcw & E1000_RXCW_C))) { ++ if (mac->autoneg_failed == 0) { ++ mac->autoneg_failed = 1; ++ ret_val = 0; ++ goto out; ++ } ++ DEBUGOUT("NOT RXing /C/, disable AutoNeg and force link.\n"); ++ ++ /* Disable auto-negotiation in the TXCW register */ ++ E1000_WRITE_REG(hw, E1000_TXCW, (mac->txcw & ~E1000_TXCW_ANE)); ++ ++ /* Force link-up and also force full-duplex. */ ++ ctrl = E1000_READ_REG(hw, E1000_CTRL); ++ ctrl |= (E1000_CTRL_SLU | E1000_CTRL_FD); ++ E1000_WRITE_REG(hw, E1000_CTRL, ctrl); ++ ++ /* Configure Flow Control after forcing link up. */ ++ ret_val = e1000_config_fc_after_link_up_generic(hw); ++ if (ret_val) { ++ DEBUGOUT("Error configuring flow control\n"); ++ goto out; ++ } ++ } else if ((ctrl & E1000_CTRL_SLU) && (rxcw & E1000_RXCW_C)) { ++ /* ++ * If we are forcing link and we are receiving /C/ ordered ++ * sets, re-enable auto-negotiation in the TXCW register ++ * and disable forced link in the Device Control register ++ * in an attempt to auto-negotiate with our link partner. ++ */ ++ DEBUGOUT("RXing /C/, enable AutoNeg and stop forcing link.\n"); ++ E1000_WRITE_REG(hw, E1000_TXCW, mac->txcw); ++ E1000_WRITE_REG(hw, E1000_CTRL, (ctrl & ~E1000_CTRL_SLU)); ++ ++ mac->serdes_has_link = true; ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_config_mac_to_phy_82543 - Configure MAC to PHY settings ++ * @hw: pointer to the HW structure ++ * ++ * For the 82543 silicon, we need to set the MAC to match the settings ++ * of the PHY, even if the PHY is auto-negotiating. ++ **/ ++static s32 e1000_config_mac_to_phy_82543(struct e1000_hw *hw) ++{ ++ u32 ctrl; ++ s32 ret_val = E1000_SUCCESS; ++ u16 phy_data; ++ ++ DEBUGFUNC("e1000_config_mac_to_phy_82543"); ++ ++ if (!(hw->phy.ops.read_reg)) ++ goto out; ++ ++ /* Set the bits to force speed and duplex */ ++ ctrl = E1000_READ_REG(hw, E1000_CTRL); ++ ctrl |= (E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX); ++ ctrl &= ~(E1000_CTRL_SPD_SEL | E1000_CTRL_ILOS); ++ ++ /* ++ * Set up duplex in the Device Control and Transmit Control ++ * registers depending on negotiated values. ++ */ ++ ret_val = hw->phy.ops.read_reg(hw, M88E1000_PHY_SPEC_STATUS, &phy_data); ++ if (ret_val) ++ goto out; ++ ++ ctrl &= ~E1000_CTRL_FD; ++ if (phy_data & M88E1000_PSSR_DPLX) ++ ctrl |= E1000_CTRL_FD; ++ ++ e1000_config_collision_dist_generic(hw); ++ ++ /* ++ * Set up speed in the Device Control register depending on ++ * negotiated values. ++ */ ++ if ((phy_data & M88E1000_PSSR_SPEED) == M88E1000_PSSR_1000MBS) ++ ctrl |= E1000_CTRL_SPD_1000; ++ else if ((phy_data & M88E1000_PSSR_SPEED) == M88E1000_PSSR_100MBS) ++ ctrl |= E1000_CTRL_SPD_100; ++ ++ E1000_WRITE_REG(hw, E1000_CTRL, ctrl); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_write_vfta_82543 - Write value to VLAN filter table ++ * @hw: pointer to the HW structure ++ * @offset: the 32-bit offset in which to write the value to. ++ * @value: the 32-bit value to write at location offset. ++ * ++ * This writes a 32-bit value to a 32-bit offset in the VLAN filter ++ * table. ++ **/ ++static void e1000_write_vfta_82543(struct e1000_hw *hw, u32 offset, u32 value) ++{ ++ u32 temp; ++ ++ DEBUGFUNC("e1000_write_vfta_82543"); ++ ++ if ((hw->mac.type == e1000_82544) && (offset & 1)) { ++ temp = E1000_READ_REG_ARRAY(hw, E1000_VFTA, offset - 1); ++ E1000_WRITE_REG_ARRAY(hw, E1000_VFTA, offset, value); ++ E1000_WRITE_FLUSH(hw); ++ E1000_WRITE_REG_ARRAY(hw, E1000_VFTA, offset - 1, temp); ++ E1000_WRITE_FLUSH(hw); ++ } else { ++ e1000_write_vfta_generic(hw, offset, value); ++ } ++} ++ ++/** ++ * e1000_mta_set_82543 - Set multicast filter table address ++ * @hw: pointer to the HW structure ++ * @hash_value: determines the MTA register and bit to set ++ * ++ * The multicast table address is a register array of 32-bit registers. ++ * The hash_value is used to determine what register the bit is in, the ++ * current value is read, the new bit is OR'd in and the new value is ++ * written back into the register. ++ **/ ++static void e1000_mta_set_82543(struct e1000_hw *hw, u32 hash_value) ++{ ++ u32 hash_bit, hash_reg, mta, temp; ++ ++ DEBUGFUNC("e1000_mta_set_82543"); ++ ++ hash_reg = (hash_value >> 5); ++ ++ /* ++ * If we are on an 82544 and we are trying to write an odd offset ++ * in the MTA, save off the previous entry before writing and ++ * restore the old value after writing. ++ */ ++ if ((hw->mac.type == e1000_82544) && (hash_reg & 1)) { ++ hash_reg &= (hw->mac.mta_reg_count - 1); ++ hash_bit = hash_value & 0x1F; ++ mta = E1000_READ_REG_ARRAY(hw, E1000_MTA, hash_reg); ++ mta |= (1 << hash_bit); ++ temp = E1000_READ_REG_ARRAY(hw, E1000_MTA, hash_reg - 1); ++ ++ E1000_WRITE_REG_ARRAY(hw, E1000_MTA, hash_reg, mta); ++ E1000_WRITE_FLUSH(hw); ++ E1000_WRITE_REG_ARRAY(hw, E1000_MTA, hash_reg - 1, temp); ++ E1000_WRITE_FLUSH(hw); ++ } else { ++ e1000_mta_set_generic(hw, hash_value); ++ } ++} ++ ++/** ++ * e1000_led_on_82543 - Turn on SW controllable LED ++ * @hw: pointer to the HW structure ++ * ++ * Turns the SW defined LED on. ++ **/ ++static s32 e1000_led_on_82543(struct e1000_hw *hw) ++{ ++ u32 ctrl = E1000_READ_REG(hw, E1000_CTRL); ++ ++ DEBUGFUNC("e1000_led_on_82543"); ++ ++ if (hw->mac.type == e1000_82544 && ++ hw->phy.media_type == e1000_media_type_copper) { ++ /* Clear SW-definable Pin 0 to turn on the LED */ ++ ctrl &= ~E1000_CTRL_SWDPIN0; ++ ctrl |= E1000_CTRL_SWDPIO0; ++ } else { ++ /* Fiber 82544 and all 82543 use this method */ ++ ctrl |= E1000_CTRL_SWDPIN0; ++ ctrl |= E1000_CTRL_SWDPIO0; ++ } ++ E1000_WRITE_REG(hw, E1000_CTRL, ctrl); ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_led_off_82543 - Turn off SW controllable LED ++ * @hw: pointer to the HW structure ++ * ++ * Turns the SW defined LED off. ++ **/ ++static s32 e1000_led_off_82543(struct e1000_hw *hw) ++{ ++ u32 ctrl = E1000_READ_REG(hw, E1000_CTRL); ++ ++ DEBUGFUNC("e1000_led_off_82543"); ++ ++ if (hw->mac.type == e1000_82544 && ++ hw->phy.media_type == e1000_media_type_copper) { ++ /* Set SW-definable Pin 0 to turn off the LED */ ++ ctrl |= E1000_CTRL_SWDPIN0; ++ ctrl |= E1000_CTRL_SWDPIO0; ++ } else { ++ ctrl &= ~E1000_CTRL_SWDPIN0; ++ ctrl |= E1000_CTRL_SWDPIO0; ++ } ++ E1000_WRITE_REG(hw, E1000_CTRL, ctrl); ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_clear_hw_cntrs_82543 - Clear device specific hardware counters ++ * @hw: pointer to the HW structure ++ * ++ * Clears the hardware counters by reading the counter registers. ++ **/ ++static void e1000_clear_hw_cntrs_82543(struct e1000_hw *hw) ++{ ++ DEBUGFUNC("e1000_clear_hw_cntrs_82543"); ++ ++ e1000_clear_hw_cntrs_base_generic(hw); ++ ++ E1000_READ_REG(hw, E1000_PRC64); ++ E1000_READ_REG(hw, E1000_PRC127); ++ E1000_READ_REG(hw, E1000_PRC255); ++ E1000_READ_REG(hw, E1000_PRC511); ++ E1000_READ_REG(hw, E1000_PRC1023); ++ E1000_READ_REG(hw, E1000_PRC1522); ++ E1000_READ_REG(hw, E1000_PTC64); ++ E1000_READ_REG(hw, E1000_PTC127); ++ E1000_READ_REG(hw, E1000_PTC255); ++ E1000_READ_REG(hw, E1000_PTC511); ++ E1000_READ_REG(hw, E1000_PTC1023); ++ E1000_READ_REG(hw, E1000_PTC1522); ++ ++ E1000_READ_REG(hw, E1000_ALGNERRC); ++ E1000_READ_REG(hw, E1000_RXERRC); ++ E1000_READ_REG(hw, E1000_TNCRS); ++ E1000_READ_REG(hw, E1000_CEXTERR); ++ E1000_READ_REG(hw, E1000_TSCTC); ++ E1000_READ_REG(hw, E1000_TSCTFC); ++} +diff -r d03036c09699 drivers/net/e1000/e1000_82543.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/e1000/e1000_82543.h Mon Jun 15 11:43:11 2009 +0100 +@@ -0,0 +1,51 @@ ++/******************************************************************************* ++ ++ Intel PRO/1000 Linux driver ++ Copyright(c) 1999 - 2008 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ Linux NICS ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++#ifndef _E1000_82543_H_ ++#define _E1000_82543_H_ ++ ++#define PHY_PREAMBLE 0xFFFFFFFF ++#define PHY_PREAMBLE_SIZE 32 ++#define PHY_SOF 0x1 ++#define PHY_OP_READ 0x2 ++#define PHY_OP_WRITE 0x1 ++#define PHY_TURNAROUND 0x2 ++ ++#define TBI_COMPAT_ENABLED 0x1 /* Global "knob" for the workaround */ ++/* If TBI_COMPAT_ENABLED, then this is the current state (on/off) */ ++#define TBI_SBP_ENABLED 0x2 ++ ++void e1000_tbi_adjust_stats_82543(struct e1000_hw *hw, ++ struct e1000_hw_stats *stats, ++ u32 frame_len, u8 *mac_addr, ++ u32 max_frame_size); ++void e1000_set_tbi_compatibility_82543(struct e1000_hw *hw, ++ bool state); ++bool e1000_tbi_sbp_enabled_82543(struct e1000_hw *hw); ++ ++#endif +diff -r d03036c09699 drivers/net/e1000/e1000_82571.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/e1000/e1000_82571.h Mon Jun 15 11:43:11 2009 +0100 +@@ -0,0 +1,40 @@ ++/******************************************************************************* ++ ++ Intel PRO/1000 Linux driver ++ Copyright(c) 1999 - 2007 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ Linux NICS ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++#ifndef _E1000_82571_H_ ++#define _E1000_82571_H_ ++ ++#define ID_LED_RESERVED_F746 0xF746 ++#define ID_LED_DEFAULT_82573 ((ID_LED_DEF1_DEF2 << 12) | \ ++ (ID_LED_OFF1_ON2 << 8) | \ ++ (ID_LED_DEF1_DEF2 << 4) | \ ++ (ID_LED_DEF1_DEF2)) ++ ++#define E1000_GCR_L1_ACT_WITHOUT_L0S_RX 0x08000000 ++ ++#endif +diff -r d03036c09699 drivers/net/e1000/e1000_api.c +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/e1000/e1000_api.c Mon Jun 15 11:43:11 2009 +0100 +@@ -0,0 +1,1102 @@ ++/******************************************************************************* ++ ++ Intel PRO/1000 Linux driver ++ Copyright(c) 1999 - 2008 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ Linux NICS ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++#include "e1000_api.h" ++ ++/** ++ * e1000_init_mac_params - Initialize MAC function pointers ++ * @hw: pointer to the HW structure ++ * ++ * This function initializes the function pointers for the MAC ++ * set of functions. Called by drivers or by e1000_setup_init_funcs. ++ **/ ++s32 e1000_init_mac_params(struct e1000_hw *hw) ++{ ++ s32 ret_val = E1000_SUCCESS; ++ ++ if (hw->mac.ops.init_params) { ++ ret_val = hw->mac.ops.init_params(hw); ++ if (ret_val) { ++ DEBUGOUT("MAC Initialization Error\n"); ++ goto out; ++ } ++ } else { ++ DEBUGOUT("mac.init_mac_params was NULL\n"); ++ ret_val = -E1000_ERR_CONFIG; ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_init_nvm_params - Initialize NVM function pointers ++ * @hw: pointer to the HW structure ++ * ++ * This function initializes the function pointers for the NVM ++ * set of functions. Called by drivers or by e1000_setup_init_funcs. ++ **/ ++s32 e1000_init_nvm_params(struct e1000_hw *hw) ++{ ++ s32 ret_val = E1000_SUCCESS; ++ ++ if (hw->nvm.ops.init_params) { ++ ret_val = hw->nvm.ops.init_params(hw); ++ if (ret_val) { ++ DEBUGOUT("NVM Initialization Error\n"); ++ goto out; ++ } ++ } else { ++ DEBUGOUT("nvm.init_nvm_params was NULL\n"); ++ ret_val = -E1000_ERR_CONFIG; ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_init_phy_params - Initialize PHY function pointers ++ * @hw: pointer to the HW structure ++ * ++ * This function initializes the function pointers for the PHY ++ * set of functions. Called by drivers or by e1000_setup_init_funcs. ++ **/ ++s32 e1000_init_phy_params(struct e1000_hw *hw) ++{ ++ s32 ret_val = E1000_SUCCESS; ++ ++ if (hw->phy.ops.init_params) { ++ ret_val = hw->phy.ops.init_params(hw); ++ if (ret_val) { ++ DEBUGOUT("PHY Initialization Error\n"); ++ goto out; ++ } ++ } else { ++ DEBUGOUT("phy.init_phy_params was NULL\n"); ++ ret_val = -E1000_ERR_CONFIG; ++ } ++ ++out: ++ return ret_val; ++} ++ ++ ++/** ++ * e1000_set_mac_type - Sets MAC type ++ * @hw: pointer to the HW structure ++ * ++ * This function sets the mac type of the adapter based on the ++ * device ID stored in the hw structure. ++ * MUST BE FIRST FUNCTION CALLED (explicitly or through ++ * e1000_setup_init_funcs()). ++ **/ ++s32 e1000_set_mac_type(struct e1000_hw *hw) ++{ ++ struct e1000_mac_info *mac = &hw->mac; ++ s32 ret_val = E1000_SUCCESS; ++ ++ DEBUGFUNC("e1000_set_mac_type"); ++ ++ switch (hw->device_id) { ++ case E1000_DEV_ID_82542: ++ mac->type = e1000_82542; ++ break; ++ case E1000_DEV_ID_82543GC_FIBER: ++ case E1000_DEV_ID_82543GC_COPPER: ++ mac->type = e1000_82543; ++ break; ++ case E1000_DEV_ID_82544EI_COPPER: ++ case E1000_DEV_ID_82544EI_FIBER: ++ case E1000_DEV_ID_82544GC_COPPER: ++ case E1000_DEV_ID_82544GC_LOM: ++ mac->type = e1000_82544; ++ break; ++ case E1000_DEV_ID_82540EM: ++ case E1000_DEV_ID_82540EM_LOM: ++ case E1000_DEV_ID_82540EP: ++ case E1000_DEV_ID_82540EP_LOM: ++ case E1000_DEV_ID_82540EP_LP: ++ mac->type = e1000_82540; ++ break; ++ case E1000_DEV_ID_82545EM_COPPER: ++ case E1000_DEV_ID_82545EM_FIBER: ++ mac->type = e1000_82545; ++ break; ++ case E1000_DEV_ID_82545GM_COPPER: ++ case E1000_DEV_ID_82545GM_FIBER: ++ case E1000_DEV_ID_82545GM_SERDES: ++ mac->type = e1000_82545_rev_3; ++ break; ++ case E1000_DEV_ID_82546EB_COPPER: ++ case E1000_DEV_ID_82546EB_FIBER: ++ case E1000_DEV_ID_82546EB_QUAD_COPPER: ++ mac->type = e1000_82546; ++ break; ++ case E1000_DEV_ID_82546GB_COPPER: ++ case E1000_DEV_ID_82546GB_FIBER: ++ case E1000_DEV_ID_82546GB_SERDES: ++ case E1000_DEV_ID_82546GB_PCIE: ++ case E1000_DEV_ID_82546GB_QUAD_COPPER: ++ case E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3: ++ mac->type = e1000_82546_rev_3; ++ break; ++ case E1000_DEV_ID_82541EI: ++ case E1000_DEV_ID_82541EI_MOBILE: ++ case E1000_DEV_ID_82541ER_LOM: ++ mac->type = e1000_82541; ++ break; ++ case E1000_DEV_ID_82541ER: ++ case E1000_DEV_ID_82541GI: ++ case E1000_DEV_ID_82541GI_LF: ++ case E1000_DEV_ID_82541GI_MOBILE: ++ mac->type = e1000_82541_rev_2; ++ break; ++ case E1000_DEV_ID_82547EI: ++ case E1000_DEV_ID_82547EI_MOBILE: ++ mac->type = e1000_82547; ++ break; ++ case E1000_DEV_ID_82547GI: ++ mac->type = e1000_82547_rev_2; ++ break; ++ default: ++ /* Should never have loaded on this device */ ++ ret_val = -E1000_ERR_MAC_INIT; ++ break; ++ } ++ ++ return ret_val; ++} ++ ++/** ++ * e1000_setup_init_funcs - Initializes function pointers ++ * @hw: pointer to the HW structure ++ * @init_device: true will initialize the rest of the function pointers ++ * getting the device ready for use. false will only set ++ * MAC type and the function pointers for the other init ++ * functions. Passing false will not generate any hardware ++ * reads or writes. ++ * ++ * This function must be called by a driver in order to use the rest ++ * of the 'shared' code files. Called by drivers only. ++ **/ ++s32 e1000_setup_init_funcs(struct e1000_hw *hw, bool init_device) ++{ ++ s32 ret_val; ++ ++ /* Can't do much good without knowing the MAC type. */ ++ ret_val = e1000_set_mac_type(hw); ++ if (ret_val) { ++ DEBUGOUT("ERROR: MAC type could not be set properly.\n"); ++ goto out; ++ } ++ ++ if (!hw->hw_addr) { ++ DEBUGOUT("ERROR: Registers not mapped\n"); ++ ret_val = -E1000_ERR_CONFIG; ++ goto out; ++ } ++ ++ /* ++ * Init function pointers to generic implementations. We do this first ++ * allowing a driver module to override it afterward. ++ */ ++ e1000_init_mac_ops_generic(hw); ++ e1000_init_phy_ops_generic(hw); ++ e1000_init_nvm_ops_generic(hw); ++ ++ /* ++ * Set up the init function pointers. These are functions within the ++ * adapter family file that sets up function pointers for the rest of ++ * the functions in that family. ++ */ ++ switch (hw->mac.type) { ++ case e1000_82542: ++ e1000_init_function_pointers_82542(hw); ++ break; ++ case e1000_82543: ++ case e1000_82544: ++ e1000_init_function_pointers_82543(hw); ++ break; ++ case e1000_82540: ++ case e1000_82545: ++ case e1000_82545_rev_3: ++ case e1000_82546: ++ case e1000_82546_rev_3: ++ e1000_init_function_pointers_82540(hw); ++ break; ++ case e1000_82541: ++ case e1000_82541_rev_2: ++ case e1000_82547: ++ case e1000_82547_rev_2: ++ e1000_init_function_pointers_82541(hw); ++ break; ++ default: ++ DEBUGOUT("Hardware not supported\n"); ++ ret_val = -E1000_ERR_CONFIG; ++ break; ++ } ++ ++ /* ++ * Initialize the rest of the function pointers. These require some ++ * register reads/writes in some cases. ++ */ ++ if (!(ret_val) && init_device) { ++ ret_val = e1000_init_mac_params(hw); ++ if (ret_val) ++ goto out; ++ ++ ret_val = e1000_init_nvm_params(hw); ++ if (ret_val) ++ goto out; ++ ++ ret_val = e1000_init_phy_params(hw); ++ if (ret_val) ++ goto out; ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_get_bus_info - Obtain bus information for adapter ++ * @hw: pointer to the HW structure ++ * ++ * This will obtain information about the HW bus for which the ++ * adapter is attached and stores it in the hw structure. This is a ++ * function pointer entry point called by drivers. ++ **/ ++s32 e1000_get_bus_info(struct e1000_hw *hw) ++{ ++ if (hw->mac.ops.get_bus_info) ++ return hw->mac.ops.get_bus_info(hw); ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_clear_vfta - Clear VLAN filter table ++ * @hw: pointer to the HW structure ++ * ++ * This clears the VLAN filter table on the adapter. This is a function ++ * pointer entry point called by drivers. ++ **/ ++void e1000_clear_vfta(struct e1000_hw *hw) ++{ ++ if (hw->mac.ops.clear_vfta) ++ hw->mac.ops.clear_vfta(hw); ++} ++ ++/** ++ * e1000_write_vfta - Write value to VLAN filter table ++ * @hw: pointer to the HW structure ++ * @offset: the 32-bit offset in which to write the value to. ++ * @value: the 32-bit value to write at location offset. ++ * ++ * This writes a 32-bit value to a 32-bit offset in the VLAN filter ++ * table. This is a function pointer entry point called by drivers. ++ **/ ++void e1000_write_vfta(struct e1000_hw *hw, u32 offset, u32 value) ++{ ++ if (hw->mac.ops.write_vfta) ++ hw->mac.ops.write_vfta(hw, offset, value); ++} ++ ++/** ++ * e1000_update_mc_addr_list - Update Multicast addresses ++ * @hw: pointer to the HW structure ++ * @mc_addr_list: array of multicast addresses to program ++ * @mc_addr_count: number of multicast addresses to program ++ * ++ * Updates the Multicast Table Array. ++ * The caller must have a packed mc_addr_list of multicast addresses. ++ **/ ++void e1000_update_mc_addr_list(struct e1000_hw *hw, u8 *mc_addr_list, ++ u32 mc_addr_count) ++{ ++ if (hw->mac.ops.update_mc_addr_list) ++ hw->mac.ops.update_mc_addr_list(hw, mc_addr_list, ++ mc_addr_count); ++} ++ ++/** ++ * e1000_force_mac_fc - Force MAC flow control ++ * @hw: pointer to the HW structure ++ * ++ * Force the MAC's flow control settings. Currently no func pointer exists ++ * and all implementations are handled in the generic version of this ++ * function. ++ **/ ++s32 e1000_force_mac_fc(struct e1000_hw *hw) ++{ ++ return e1000_force_mac_fc_generic(hw); ++} ++ ++/** ++ * e1000_check_for_link - Check/Store link connection ++ * @hw: pointer to the HW structure ++ * ++ * This checks the link condition of the adapter and stores the ++ * results in the hw->mac structure. This is a function pointer entry ++ * point called by drivers. ++ **/ ++s32 e1000_check_for_link(struct e1000_hw *hw) ++{ ++ if (hw->mac.ops.check_for_link) ++ return hw->mac.ops.check_for_link(hw); ++ ++ return -E1000_ERR_CONFIG; ++} ++ ++/** ++ * e1000_check_mng_mode - Check management mode ++ * @hw: pointer to the HW structure ++ * ++ * This checks if the adapter has manageability enabled. ++ * This is a function pointer entry point called by drivers. ++ **/ ++bool e1000_check_mng_mode(struct e1000_hw *hw) ++{ ++ if (hw->mac.ops.check_mng_mode) ++ return hw->mac.ops.check_mng_mode(hw); ++ ++ return false; ++} ++ ++/** ++ * e1000_mng_write_dhcp_info - Writes DHCP info to host interface ++ * @hw: pointer to the HW structure ++ * @buffer: pointer to the host interface ++ * @length: size of the buffer ++ * ++ * Writes the DHCP information to the host interface. ++ **/ ++s32 e1000_mng_write_dhcp_info(struct e1000_hw *hw, u8 *buffer, u16 length) ++{ ++ return e1000_mng_write_dhcp_info_generic(hw, buffer, length); ++} ++ ++/** ++ * e1000_reset_hw - Reset hardware ++ * @hw: pointer to the HW structure ++ * ++ * This resets the hardware into a known state. This is a function pointer ++ * entry point called by drivers. ++ **/ ++s32 e1000_reset_hw(struct e1000_hw *hw) ++{ ++ if (hw->mac.ops.reset_hw) ++ return hw->mac.ops.reset_hw(hw); ++ ++ return -E1000_ERR_CONFIG; ++} ++ ++/** ++ * e1000_init_hw - Initialize hardware ++ * @hw: pointer to the HW structure ++ * ++ * This inits the hardware readying it for operation. This is a function ++ * pointer entry point called by drivers. ++ **/ ++s32 e1000_init_hw(struct e1000_hw *hw) ++{ ++ if (hw->mac.ops.init_hw) ++ return hw->mac.ops.init_hw(hw); ++ ++ return -E1000_ERR_CONFIG; ++} ++ ++/** ++ * e1000_setup_link - Configures link and flow control ++ * @hw: pointer to the HW structure ++ * ++ * This configures link and flow control settings for the adapter. This ++ * is a function pointer entry point called by drivers. While modules can ++ * also call this, they probably call their own version of this function. ++ **/ ++s32 e1000_setup_link(struct e1000_hw *hw) ++{ ++ if (hw->mac.ops.setup_link) ++ return hw->mac.ops.setup_link(hw); ++ ++ return -E1000_ERR_CONFIG; ++} ++ ++/** ++ * e1000_get_speed_and_duplex - Returns current speed and duplex ++ * @hw: pointer to the HW structure ++ * @speed: pointer to a 16-bit value to store the speed ++ * @duplex: pointer to a 16-bit value to store the duplex. ++ * ++ * This returns the speed and duplex of the adapter in the two 'out' ++ * variables passed in. This is a function pointer entry point called ++ * by drivers. ++ **/ ++s32 e1000_get_speed_and_duplex(struct e1000_hw *hw, u16 *speed, u16 *duplex) ++{ ++ if (hw->mac.ops.get_link_up_info) ++ return hw->mac.ops.get_link_up_info(hw, speed, duplex); ++ ++ return -E1000_ERR_CONFIG; ++} ++ ++/** ++ * e1000_setup_led - Configures SW controllable LED ++ * @hw: pointer to the HW structure ++ * ++ * This prepares the SW controllable LED for use and saves the current state ++ * of the LED so it can be later restored. This is a function pointer entry ++ * point called by drivers. ++ **/ ++s32 e1000_setup_led(struct e1000_hw *hw) ++{ ++ if (hw->mac.ops.setup_led) ++ return hw->mac.ops.setup_led(hw); ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_cleanup_led - Restores SW controllable LED ++ * @hw: pointer to the HW structure ++ * ++ * This restores the SW controllable LED to the value saved off by ++ * e1000_setup_led. This is a function pointer entry point called by drivers. ++ **/ ++s32 e1000_cleanup_led(struct e1000_hw *hw) ++{ ++ if (hw->mac.ops.cleanup_led) ++ return hw->mac.ops.cleanup_led(hw); ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_blink_led - Blink SW controllable LED ++ * @hw: pointer to the HW structure ++ * ++ * This starts the adapter LED blinking. Request the LED to be setup first ++ * and cleaned up after. This is a function pointer entry point called by ++ * drivers. ++ **/ ++s32 e1000_blink_led(struct e1000_hw *hw) ++{ ++ if (hw->mac.ops.blink_led) ++ return hw->mac.ops.blink_led(hw); ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_id_led_init - store LED configurations in SW ++ * @hw: pointer to the HW structure ++ * ++ * Initializes the LED config in SW. This is a function pointer entry point ++ * called by drivers. ++ **/ ++s32 e1000_id_led_init(struct e1000_hw *hw) ++{ ++ if (hw->mac.ops.id_led_init) ++ return hw->mac.ops.id_led_init(hw); ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_led_on - Turn on SW controllable LED ++ * @hw: pointer to the HW structure ++ * ++ * Turns the SW defined LED on. This is a function pointer entry point ++ * called by drivers. ++ **/ ++s32 e1000_led_on(struct e1000_hw *hw) ++{ ++ if (hw->mac.ops.led_on) ++ return hw->mac.ops.led_on(hw); ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_led_off - Turn off SW controllable LED ++ * @hw: pointer to the HW structure ++ * ++ * Turns the SW defined LED off. This is a function pointer entry point ++ * called by drivers. ++ **/ ++s32 e1000_led_off(struct e1000_hw *hw) ++{ ++ if (hw->mac.ops.led_off) ++ return hw->mac.ops.led_off(hw); ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_reset_adaptive - Reset adaptive IFS ++ * @hw: pointer to the HW structure ++ * ++ * Resets the adaptive IFS. Currently no func pointer exists and all ++ * implementations are handled in the generic version of this function. ++ **/ ++void e1000_reset_adaptive(struct e1000_hw *hw) ++{ ++ e1000_reset_adaptive_generic(hw); ++} ++ ++/** ++ * e1000_update_adaptive - Update adaptive IFS ++ * @hw: pointer to the HW structure ++ * ++ * Updates adapter IFS. Currently no func pointer exists and all ++ * implementations are handled in the generic version of this function. ++ **/ ++void e1000_update_adaptive(struct e1000_hw *hw) ++{ ++ e1000_update_adaptive_generic(hw); ++} ++ ++/** ++ * e1000_disable_pcie_master - Disable PCI-Express master access ++ * @hw: pointer to the HW structure ++ * ++ * Disables PCI-Express master access and verifies there are no pending ++ * requests. Currently no func pointer exists and all implementations are ++ * handled in the generic version of this function. ++ **/ ++s32 e1000_disable_pcie_master(struct e1000_hw *hw) ++{ ++ return e1000_disable_pcie_master_generic(hw); ++} ++ ++/** ++ * e1000_config_collision_dist - Configure collision distance ++ * @hw: pointer to the HW structure ++ * ++ * Configures the collision distance to the default value and is used ++ * during link setup. ++ **/ ++void e1000_config_collision_dist(struct e1000_hw *hw) ++{ ++ if (hw->mac.ops.config_collision_dist) ++ hw->mac.ops.config_collision_dist(hw); ++} ++ ++/** ++ * e1000_rar_set - Sets a receive address register ++ * @hw: pointer to the HW structure ++ * @addr: address to set the RAR to ++ * @index: the RAR to set ++ * ++ * Sets a Receive Address Register (RAR) to the specified address. ++ **/ ++void e1000_rar_set(struct e1000_hw *hw, u8 *addr, u32 index) ++{ ++ if (hw->mac.ops.rar_set) ++ hw->mac.ops.rar_set(hw, addr, index); ++} ++ ++/** ++ * e1000_validate_mdi_setting - Ensures valid MDI/MDIX SW state ++ * @hw: pointer to the HW structure ++ * ++ * Ensures that the MDI/MDIX SW state is valid. ++ **/ ++s32 e1000_validate_mdi_setting(struct e1000_hw *hw) ++{ ++ if (hw->mac.ops.validate_mdi_setting) ++ return hw->mac.ops.validate_mdi_setting(hw); ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_mta_set - Sets multicast table bit ++ * @hw: pointer to the HW structure ++ * @hash_value: Multicast hash value. ++ * ++ * This sets the bit in the multicast table corresponding to the ++ * hash value. This is a function pointer entry point called by drivers. ++ **/ ++void e1000_mta_set(struct e1000_hw *hw, u32 hash_value) ++{ ++ if (hw->mac.ops.mta_set) ++ hw->mac.ops.mta_set(hw, hash_value); ++} ++ ++/** ++ * e1000_hash_mc_addr - Determines address location in multicast table ++ * @hw: pointer to the HW structure ++ * @mc_addr: Multicast address to hash. ++ * ++ * This hashes an address to determine its location in the multicast ++ * table. Currently no func pointer exists and all implementations ++ * are handled in the generic version of this function. ++ **/ ++u32 e1000_hash_mc_addr(struct e1000_hw *hw, u8 *mc_addr) ++{ ++ return e1000_hash_mc_addr_generic(hw, mc_addr); ++} ++ ++/** ++ * e1000_enable_tx_pkt_filtering - Enable packet filtering on TX ++ * @hw: pointer to the HW structure ++ * ++ * Enables packet filtering on transmit packets if manageability is enabled ++ * and host interface is enabled. ++ * Currently no func pointer exists and all implementations are handled in the ++ * generic version of this function. ++ **/ ++bool e1000_enable_tx_pkt_filtering(struct e1000_hw *hw) ++{ ++ return e1000_enable_tx_pkt_filtering_generic(hw); ++} ++ ++/** ++ * e1000_mng_host_if_write - Writes to the manageability host interface ++ * @hw: pointer to the HW structure ++ * @buffer: pointer to the host interface buffer ++ * @length: size of the buffer ++ * @offset: location in the buffer to write to ++ * @sum: sum of the data (not checksum) ++ * ++ * This function writes the buffer content at the offset given on the host if. ++ * It also does alignment considerations to do the writes in most efficient ++ * way. Also fills up the sum of the buffer in *buffer parameter. ++ **/ ++s32 e1000_mng_host_if_write(struct e1000_hw * hw, u8 *buffer, u16 length, ++ u16 offset, u8 *sum) ++{ ++ if (hw->mac.ops.mng_host_if_write) ++ return hw->mac.ops.mng_host_if_write(hw, buffer, length, ++ offset, sum); ++ ++ return E1000_NOT_IMPLEMENTED; ++} ++ ++/** ++ * e1000_mng_write_cmd_header - Writes manageability command header ++ * @hw: pointer to the HW structure ++ * @hdr: pointer to the host interface command header ++ * ++ * Writes the command header after does the checksum calculation. ++ **/ ++s32 e1000_mng_write_cmd_header(struct e1000_hw *hw, ++ struct e1000_host_mng_command_header *hdr) ++{ ++ if (hw->mac.ops.mng_write_cmd_header) ++ return hw->mac.ops.mng_write_cmd_header(hw, hdr); ++ ++ return E1000_NOT_IMPLEMENTED; ++} ++ ++/** ++ * e1000_mng_enable_host_if - Checks host interface is enabled ++ * @hw: pointer to the HW structure ++ * ++ * Returns E1000_success upon success, else E1000_ERR_HOST_INTERFACE_COMMAND ++ * ++ * This function checks whether the HOST IF is enabled for command operation ++ * and also checks whether the previous command is completed. It busy waits ++ * in case of previous command is not completed. ++ **/ ++s32 e1000_mng_enable_host_if(struct e1000_hw * hw) ++{ ++ if (hw->mac.ops.mng_enable_host_if) ++ return hw->mac.ops.mng_enable_host_if(hw); ++ ++ return E1000_NOT_IMPLEMENTED; ++} ++ ++/** ++ * e1000_wait_autoneg - Waits for autonegotiation completion ++ * @hw: pointer to the HW structure ++ * ++ * Waits for autoneg to complete. Currently no func pointer exists and all ++ * implementations are handled in the generic version of this function. ++ **/ ++s32 e1000_wait_autoneg(struct e1000_hw *hw) ++{ ++ if (hw->mac.ops.wait_autoneg) ++ return hw->mac.ops.wait_autoneg(hw); ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_check_reset_block - Verifies PHY can be reset ++ * @hw: pointer to the HW structure ++ * ++ * Checks if the PHY is in a state that can be reset or if manageability ++ * has it tied up. This is a function pointer entry point called by drivers. ++ **/ ++s32 e1000_check_reset_block(struct e1000_hw *hw) ++{ ++ if (hw->phy.ops.check_reset_block) ++ return hw->phy.ops.check_reset_block(hw); ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_read_phy_reg - Reads PHY register ++ * @hw: pointer to the HW structure ++ * @offset: the register to read ++ * @data: the buffer to store the 16-bit read. ++ * ++ * Reads the PHY register and returns the value in data. ++ * This is a function pointer entry point called by drivers. ++ **/ ++s32 e1000_read_phy_reg(struct e1000_hw *hw, u32 offset, u16 *data) ++{ ++ if (hw->phy.ops.read_reg) ++ return hw->phy.ops.read_reg(hw, offset, data); ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_write_phy_reg - Writes PHY register ++ * @hw: pointer to the HW structure ++ * @offset: the register to write ++ * @data: the value to write. ++ * ++ * Writes the PHY register at offset with the value in data. ++ * This is a function pointer entry point called by drivers. ++ **/ ++s32 e1000_write_phy_reg(struct e1000_hw *hw, u32 offset, u16 data) ++{ ++ if (hw->phy.ops.write_reg) ++ return hw->phy.ops.write_reg(hw, offset, data); ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_release_phy - Generic release PHY ++ * @hw: pointer to the HW structure ++ * ++ * Return if silicon family does not require a semaphore when accessing the ++ * PHY. ++ **/ ++void e1000_release_phy(struct e1000_hw *hw) ++{ ++ if (hw->phy.ops.release) ++ hw->phy.ops.release(hw); ++} ++ ++/** ++ * e1000_acquire_phy - Generic acquire PHY ++ * @hw: pointer to the HW structure ++ * ++ * Return success if silicon family does not require a semaphore when ++ * accessing the PHY. ++ **/ ++s32 e1000_acquire_phy(struct e1000_hw *hw) ++{ ++ if (hw->phy.ops.acquire) ++ return hw->phy.ops.acquire(hw); ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_read_kmrn_reg - Reads register using Kumeran interface ++ * @hw: pointer to the HW structure ++ * @offset: the register to read ++ * @data: the location to store the 16-bit value read. ++ * ++ * Reads a register out of the Kumeran interface. Currently no func pointer ++ * exists and all implementations are handled in the generic version of ++ * this function. ++ **/ ++s32 e1000_read_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 *data) ++{ ++ return e1000_read_kmrn_reg_generic(hw, offset, data); ++} ++ ++/** ++ * e1000_write_kmrn_reg - Writes register using Kumeran interface ++ * @hw: pointer to the HW structure ++ * @offset: the register to write ++ * @data: the value to write. ++ * ++ * Writes a register to the Kumeran interface. Currently no func pointer ++ * exists and all implementations are handled in the generic version of ++ * this function. ++ **/ ++s32 e1000_write_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 data) ++{ ++ return e1000_write_kmrn_reg_generic(hw, offset, data); ++} ++ ++/** ++ * e1000_get_cable_length - Retrieves cable length estimation ++ * @hw: pointer to the HW structure ++ * ++ * This function estimates the cable length and stores them in ++ * hw->phy.min_length and hw->phy.max_length. This is a function pointer ++ * entry point called by drivers. ++ **/ ++s32 e1000_get_cable_length(struct e1000_hw *hw) ++{ ++ if (hw->phy.ops.get_cable_length) ++ return hw->phy.ops.get_cable_length(hw); ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_get_phy_info - Retrieves PHY information from registers ++ * @hw: pointer to the HW structure ++ * ++ * This function gets some information from various PHY registers and ++ * populates hw->phy values with it. This is a function pointer entry ++ * point called by drivers. ++ **/ ++s32 e1000_get_phy_info(struct e1000_hw *hw) ++{ ++ if (hw->phy.ops.get_info) ++ return hw->phy.ops.get_info(hw); ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_phy_hw_reset - Hard PHY reset ++ * @hw: pointer to the HW structure ++ * ++ * Performs a hard PHY reset. This is a function pointer entry point called ++ * by drivers. ++ **/ ++s32 e1000_phy_hw_reset(struct e1000_hw *hw) ++{ ++ if (hw->phy.ops.reset) ++ return hw->phy.ops.reset(hw); ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_phy_commit - Soft PHY reset ++ * @hw: pointer to the HW structure ++ * ++ * Performs a soft PHY reset on those that apply. This is a function pointer ++ * entry point called by drivers. ++ **/ ++s32 e1000_phy_commit(struct e1000_hw *hw) ++{ ++ if (hw->phy.ops.commit) ++ return hw->phy.ops.commit(hw); ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_set_d0_lplu_state - Sets low power link up state for D0 ++ * @hw: pointer to the HW structure ++ * @active: boolean used to enable/disable lplu ++ * ++ * Success returns 0, Failure returns 1 ++ * ++ * The low power link up (lplu) state is set to the power management level D0 ++ * and SmartSpeed is disabled when active is true, else clear lplu for D0 ++ * and enable Smartspeed. LPLU and Smartspeed are mutually exclusive. LPLU ++ * is used during Dx states where the power conservation is most important. ++ * During driver activity, SmartSpeed should be enabled so performance is ++ * maintained. This is a function pointer entry point called by drivers. ++ **/ ++s32 e1000_set_d0_lplu_state(struct e1000_hw *hw, bool active) ++{ ++ if (hw->phy.ops.set_d0_lplu_state) ++ return hw->phy.ops.set_d0_lplu_state(hw, active); ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_set_d3_lplu_state - Sets low power link up state for D3 ++ * @hw: pointer to the HW structure ++ * @active: boolean used to enable/disable lplu ++ * ++ * Success returns 0, Failure returns 1 ++ * ++ * The low power link up (lplu) state is set to the power management level D3 ++ * and SmartSpeed is disabled when active is true, else clear lplu for D3 ++ * and enable Smartspeed. LPLU and Smartspeed are mutually exclusive. LPLU ++ * is used during Dx states where the power conservation is most important. ++ * During driver activity, SmartSpeed should be enabled so performance is ++ * maintained. This is a function pointer entry point called by drivers. ++ **/ ++s32 e1000_set_d3_lplu_state(struct e1000_hw *hw, bool active) ++{ ++ if (hw->phy.ops.set_d3_lplu_state) ++ return hw->phy.ops.set_d3_lplu_state(hw, active); ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_read_mac_addr - Reads MAC address ++ * @hw: pointer to the HW structure ++ * ++ * Reads the MAC address out of the adapter and stores it in the HW structure. ++ * Currently no func pointer exists and all implementations are handled in the ++ * generic version of this function. ++ **/ ++s32 e1000_read_mac_addr(struct e1000_hw *hw) ++{ ++ if (hw->mac.ops.read_mac_addr) ++ return hw->mac.ops.read_mac_addr(hw); ++ ++ return e1000_read_mac_addr_generic(hw); ++} ++ ++/** ++ * e1000_read_pba_num - Read device part number ++ * @hw: pointer to the HW structure ++ * @pba_num: pointer to device part number ++ * ++ * Reads the product board assembly (PBA) number from the EEPROM and stores ++ * the value in pba_num. ++ * Currently no func pointer exists and all implementations are handled in the ++ * generic version of this function. ++ **/ ++s32 e1000_read_pba_num(struct e1000_hw *hw, u32 *pba_num) ++{ ++ return e1000_read_pba_num_generic(hw, pba_num); ++} ++ ++/** ++ * e1000_validate_nvm_checksum - Verifies NVM (EEPROM) checksum ++ * @hw: pointer to the HW structure ++ * ++ * Validates the NVM checksum is correct. This is a function pointer entry ++ * point called by drivers. ++ **/ ++s32 e1000_validate_nvm_checksum(struct e1000_hw *hw) ++{ ++ if (hw->nvm.ops.validate) ++ return hw->nvm.ops.validate(hw); ++ ++ return -E1000_ERR_CONFIG; ++} ++ ++/** ++ * e1000_update_nvm_checksum - Updates NVM (EEPROM) checksum ++ * @hw: pointer to the HW structure ++ * ++ * Updates the NVM checksum. Currently no func pointer exists and all ++ * implementations are handled in the generic version of this function. ++ **/ ++s32 e1000_update_nvm_checksum(struct e1000_hw *hw) ++{ ++ if (hw->nvm.ops.update) ++ return hw->nvm.ops.update(hw); ++ ++ return -E1000_ERR_CONFIG; ++} ++ ++/** ++ * e1000_reload_nvm - Reloads EEPROM ++ * @hw: pointer to the HW structure ++ * ++ * Reloads the EEPROM by setting the "Reinitialize from EEPROM" bit in the ++ * extended control register. ++ **/ ++void e1000_reload_nvm(struct e1000_hw *hw) ++{ ++ if (hw->nvm.ops.reload) ++ hw->nvm.ops.reload(hw); ++} ++ ++/** ++ * e1000_read_nvm - Reads NVM (EEPROM) ++ * @hw: pointer to the HW structure ++ * @offset: the word offset to read ++ * @words: number of 16-bit words to read ++ * @data: pointer to the properly sized buffer for the data. ++ * ++ * Reads 16-bit chunks of data from the NVM (EEPROM). This is a function ++ * pointer entry point called by drivers. ++ **/ ++s32 e1000_read_nvm(struct e1000_hw *hw, u16 offset, u16 words, u16 *data) ++{ ++ if (hw->nvm.ops.read) ++ return hw->nvm.ops.read(hw, offset, words, data); ++ ++ return -E1000_ERR_CONFIG; ++} ++ ++/** ++ * e1000_write_nvm - Writes to NVM (EEPROM) ++ * @hw: pointer to the HW structure ++ * @offset: the word offset to read ++ * @words: number of 16-bit words to write ++ * @data: pointer to the properly sized buffer for the data. ++ * ++ * Writes 16-bit chunks of data to the NVM (EEPROM). This is a function ++ * pointer entry point called by drivers. ++ **/ ++s32 e1000_write_nvm(struct e1000_hw *hw, u16 offset, u16 words, u16 *data) ++{ ++ if (hw->nvm.ops.write) ++ return hw->nvm.ops.write(hw, offset, words, data); ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_power_up_phy - Restores link in case of PHY power down ++ * @hw: pointer to the HW structure ++ * ++ * The phy may be powered down to save power, to turn off link when the ++ * driver is unloaded, or wake on lan is not enabled (among others). ++ **/ ++void e1000_power_up_phy(struct e1000_hw *hw) ++{ ++ if (hw->phy.ops.power_up) ++ hw->phy.ops.power_up(hw); ++ ++ e1000_setup_link(hw); ++} ++ ++/** ++ * e1000_power_down_phy - Power down PHY ++ * @hw: pointer to the HW structure ++ * ++ * The phy may be powered down to save power, to turn off link when the ++ * driver is unloaded, or wake on lan is not enabled (among others). ++ **/ ++void e1000_power_down_phy(struct e1000_hw *hw) ++{ ++ if (hw->phy.ops.power_down) ++ hw->phy.ops.power_down(hw); ++} ++ +diff -r d03036c09699 drivers/net/e1000/e1000_api.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/e1000/e1000_api.h Mon Jun 15 11:43:11 2009 +0100 +@@ -0,0 +1,146 @@ ++/******************************************************************************* ++ ++ Intel PRO/1000 Linux driver ++ Copyright(c) 1999 - 2008 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ Linux NICS ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++#ifndef _E1000_API_H_ ++#define _E1000_API_H_ ++ ++#include "e1000_hw.h" ++ ++extern void e1000_init_function_pointers_82542(struct e1000_hw *hw); ++extern void e1000_init_function_pointers_82543(struct e1000_hw *hw); ++extern void e1000_init_function_pointers_82540(struct e1000_hw *hw); ++extern void e1000_init_function_pointers_82541(struct e1000_hw *hw); ++ ++s32 e1000_set_mac_type(struct e1000_hw *hw); ++s32 e1000_setup_init_funcs(struct e1000_hw *hw, bool init_device); ++s32 e1000_init_mac_params(struct e1000_hw *hw); ++s32 e1000_init_nvm_params(struct e1000_hw *hw); ++s32 e1000_init_phy_params(struct e1000_hw *hw); ++s32 e1000_get_bus_info(struct e1000_hw *hw); ++void e1000_clear_vfta(struct e1000_hw *hw); ++void e1000_write_vfta(struct e1000_hw *hw, u32 offset, u32 value); ++s32 e1000_force_mac_fc(struct e1000_hw *hw); ++s32 e1000_check_for_link(struct e1000_hw *hw); ++s32 e1000_reset_hw(struct e1000_hw *hw); ++s32 e1000_init_hw(struct e1000_hw *hw); ++s32 e1000_setup_link(struct e1000_hw *hw); ++s32 e1000_get_speed_and_duplex(struct e1000_hw *hw, u16 *speed, ++ u16 *duplex); ++s32 e1000_disable_pcie_master(struct e1000_hw *hw); ++void e1000_config_collision_dist(struct e1000_hw *hw); ++void e1000_rar_set(struct e1000_hw *hw, u8 *addr, u32 index); ++void e1000_mta_set(struct e1000_hw *hw, u32 hash_value); ++u32 e1000_hash_mc_addr(struct e1000_hw *hw, u8 *mc_addr); ++void e1000_update_mc_addr_list(struct e1000_hw *hw, ++ u8 *mc_addr_list, u32 mc_addr_count); ++s32 e1000_setup_led(struct e1000_hw *hw); ++s32 e1000_cleanup_led(struct e1000_hw *hw); ++s32 e1000_check_reset_block(struct e1000_hw *hw); ++s32 e1000_blink_led(struct e1000_hw *hw); ++s32 e1000_led_on(struct e1000_hw *hw); ++s32 e1000_led_off(struct e1000_hw *hw); ++s32 e1000_id_led_init(struct e1000_hw *hw); ++void e1000_reset_adaptive(struct e1000_hw *hw); ++void e1000_update_adaptive(struct e1000_hw *hw); ++s32 e1000_get_cable_length(struct e1000_hw *hw); ++s32 e1000_validate_mdi_setting(struct e1000_hw *hw); ++s32 e1000_read_phy_reg(struct e1000_hw *hw, u32 offset, u16 *data); ++s32 e1000_write_phy_reg(struct e1000_hw *hw, u32 offset, u16 data); ++s32 e1000_get_phy_info(struct e1000_hw *hw); ++void e1000_release_phy(struct e1000_hw *hw); ++s32 e1000_acquire_phy(struct e1000_hw *hw); ++s32 e1000_phy_hw_reset(struct e1000_hw *hw); ++s32 e1000_phy_commit(struct e1000_hw *hw); ++void e1000_power_up_phy(struct e1000_hw *hw); ++void e1000_power_down_phy(struct e1000_hw *hw); ++s32 e1000_read_mac_addr(struct e1000_hw *hw); ++s32 e1000_read_pba_num(struct e1000_hw *hw, u32 *part_num); ++void e1000_reload_nvm(struct e1000_hw *hw); ++s32 e1000_update_nvm_checksum(struct e1000_hw *hw); ++s32 e1000_validate_nvm_checksum(struct e1000_hw *hw); ++s32 e1000_read_nvm(struct e1000_hw *hw, u16 offset, u16 words, u16 *data); ++s32 e1000_read_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 *data); ++s32 e1000_write_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 data); ++s32 e1000_write_nvm(struct e1000_hw *hw, u16 offset, u16 words, ++ u16 *data); ++s32 e1000_wait_autoneg(struct e1000_hw *hw); ++s32 e1000_set_d3_lplu_state(struct e1000_hw *hw, bool active); ++s32 e1000_set_d0_lplu_state(struct e1000_hw *hw, bool active); ++bool e1000_check_mng_mode(struct e1000_hw *hw); ++bool e1000_enable_tx_pkt_filtering(struct e1000_hw *hw); ++s32 e1000_mng_enable_host_if(struct e1000_hw *hw); ++s32 e1000_mng_host_if_write(struct e1000_hw *hw, ++ u8 *buffer, u16 length, u16 offset, u8 *sum); ++s32 e1000_mng_write_cmd_header(struct e1000_hw *hw, ++ struct e1000_host_mng_command_header *hdr); ++s32 e1000_mng_write_dhcp_info(struct e1000_hw * hw, ++ u8 *buffer, u16 length); ++u32 e1000_translate_register_82542(u32 reg); ++ ++/* ++ * TBI_ACCEPT macro definition: ++ * ++ * This macro requires: ++ * adapter = a pointer to struct e1000_hw ++ * status = the 8 bit status field of the Rx descriptor with EOP set ++ * error = the 8 bit error field of the Rx descriptor with EOP set ++ * length = the sum of all the length fields of the Rx descriptors that ++ * make up the current frame ++ * last_byte = the last byte of the frame DMAed by the hardware ++ * max_frame_length = the maximum frame length we want to accept. ++ * min_frame_length = the minimum frame length we want to accept. ++ * ++ * This macro is a conditional that should be used in the interrupt ++ * handler's Rx processing routine when RxErrors have been detected. ++ * ++ * Typical use: ++ * ... ++ * if (TBI_ACCEPT) { ++ * accept_frame = true; ++ * e1000_tbi_adjust_stats(adapter, MacAddress); ++ * frame_length--; ++ * } else { ++ * accept_frame = false; ++ * } ++ * ... ++ */ ++ ++/* The carrier extension symbol, as received by the NIC. */ ++#define CARRIER_EXTENSION 0x0F ++ ++#define TBI_ACCEPT(a, status, errors, length, last_byte, min_frame_size, max_frame_size) \ ++ (e1000_tbi_sbp_enabled_82543(a) && \ ++ (((errors) & E1000_RXD_ERR_FRAME_ERR_MASK) == E1000_RXD_ERR_CE) && \ ++ ((last_byte) == CARRIER_EXTENSION) && \ ++ (((status) & E1000_RXD_STAT_VP) ? \ ++ (((length) > (min_frame_size - VLAN_TAG_SIZE)) && \ ++ ((length) <= (max_frame_size + 1))) : \ ++ (((length) > min_frame_size) && \ ++ ((length) <= (max_frame_size + VLAN_TAG_SIZE + 1))))) ++ ++#endif +diff -r d03036c09699 drivers/net/e1000/e1000_defines.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/e1000/e1000_defines.h Mon Jun 15 11:43:11 2009 +0100 +@@ -0,0 +1,1404 @@ ++/******************************************************************************* ++ ++ Intel PRO/1000 Linux driver ++ Copyright(c) 1999 - 2008 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ Linux NICS ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++#ifndef _E1000_DEFINES_H_ ++#define _E1000_DEFINES_H_ ++ ++/* Number of Transmit and Receive Descriptors must be a multiple of 8 */ ++#define REQ_TX_DESCRIPTOR_MULTIPLE 8 ++#define REQ_RX_DESCRIPTOR_MULTIPLE 8 ++ ++/* Definitions for power management and wakeup registers */ ++/* Wake Up Control */ ++#define E1000_WUC_APME 0x00000001 /* APM Enable */ ++#define E1000_WUC_PME_EN 0x00000002 /* PME Enable */ ++#define E1000_WUC_PME_STATUS 0x00000004 /* PME Status */ ++#define E1000_WUC_APMPME 0x00000008 /* Assert PME on APM Wakeup */ ++#define E1000_WUC_LSCWE 0x00000010 /* Link Status wake up enable */ ++#define E1000_WUC_LSCWO 0x00000020 /* Link Status wake up override */ ++#define E1000_WUC_SPM 0x80000000 /* Enable SPM */ ++#define E1000_WUC_PHY_WAKE 0x00000100 /* if PHY supports wakeup */ ++ ++/* Wake Up Filter Control */ ++#define E1000_WUFC_LNKC 0x00000001 /* Link Status Change Wakeup Enable */ ++#define E1000_WUFC_MAG 0x00000002 /* Magic Packet Wakeup Enable */ ++#define E1000_WUFC_EX 0x00000004 /* Directed Exact Wakeup Enable */ ++#define E1000_WUFC_MC 0x00000008 /* Directed Multicast Wakeup Enable */ ++#define E1000_WUFC_BC 0x00000010 /* Broadcast Wakeup Enable */ ++#define E1000_WUFC_ARP 0x00000020 /* ARP Request Packet Wakeup Enable */ ++#define E1000_WUFC_IPV4 0x00000040 /* Directed IPv4 Packet Wakeup Enable */ ++#define E1000_WUFC_IPV6 0x00000080 /* Directed IPv6 Packet Wakeup Enable */ ++#define E1000_WUFC_IGNORE_TCO 0x00008000 /* Ignore WakeOn TCO packets */ ++#define E1000_WUFC_FLX0 0x00010000 /* Flexible Filter 0 Enable */ ++#define E1000_WUFC_FLX1 0x00020000 /* Flexible Filter 1 Enable */ ++#define E1000_WUFC_FLX2 0x00040000 /* Flexible Filter 2 Enable */ ++#define E1000_WUFC_FLX3 0x00080000 /* Flexible Filter 3 Enable */ ++#define E1000_WUFC_ALL_FILTERS 0x000F00FF /* Mask for all wakeup filters */ ++#define E1000_WUFC_FLX_OFFSET 16 /* Offset to the Flexible Filters bits */ ++#define E1000_WUFC_FLX_FILTERS 0x000F0000 /*Mask for the 4 flexible filters */ ++ ++/* Wake Up Status */ ++#define E1000_WUS_LNKC E1000_WUFC_LNKC ++#define E1000_WUS_MAG E1000_WUFC_MAG ++#define E1000_WUS_EX E1000_WUFC_EX ++#define E1000_WUS_MC E1000_WUFC_MC ++#define E1000_WUS_BC E1000_WUFC_BC ++#define E1000_WUS_ARP E1000_WUFC_ARP ++#define E1000_WUS_IPV4 E1000_WUFC_IPV4 ++#define E1000_WUS_IPV6 E1000_WUFC_IPV6 ++#define E1000_WUS_FLX0 E1000_WUFC_FLX0 ++#define E1000_WUS_FLX1 E1000_WUFC_FLX1 ++#define E1000_WUS_FLX2 E1000_WUFC_FLX2 ++#define E1000_WUS_FLX3 E1000_WUFC_FLX3 ++#define E1000_WUS_FLX_FILTERS E1000_WUFC_FLX_FILTERS ++ ++/* Wake Up Packet Length */ ++#define E1000_WUPL_LENGTH_MASK 0x0FFF /* Only the lower 12 bits are valid */ ++ ++/* Four Flexible Filters are supported */ ++#define E1000_FLEXIBLE_FILTER_COUNT_MAX 4 ++ ++/* Each Flexible Filter is at most 128 (0x80) bytes in length */ ++#define E1000_FLEXIBLE_FILTER_SIZE_MAX 128 ++ ++#define E1000_FFLT_SIZE E1000_FLEXIBLE_FILTER_COUNT_MAX ++#define E1000_FFMT_SIZE E1000_FLEXIBLE_FILTER_SIZE_MAX ++#define E1000_FFVT_SIZE E1000_FLEXIBLE_FILTER_SIZE_MAX ++ ++/* Extended Device Control */ ++#define E1000_CTRL_EXT_GPI0_EN 0x00000001 /* Maps SDP4 to GPI0 */ ++#define E1000_CTRL_EXT_GPI1_EN 0x00000002 /* Maps SDP5 to GPI1 */ ++#define E1000_CTRL_EXT_PHYINT_EN E1000_CTRL_EXT_GPI1_EN ++#define E1000_CTRL_EXT_GPI2_EN 0x00000004 /* Maps SDP6 to GPI2 */ ++#define E1000_CTRL_EXT_GPI3_EN 0x00000008 /* Maps SDP7 to GPI3 */ ++/* Reserved (bits 4,5) in >= 82575 */ ++#define E1000_CTRL_EXT_SDP4_DATA 0x00000010 /* Value of SW Definable Pin 4 */ ++#define E1000_CTRL_EXT_SDP5_DATA 0x00000020 /* Value of SW Definable Pin 5 */ ++#define E1000_CTRL_EXT_PHY_INT E1000_CTRL_EXT_SDP5_DATA ++#define E1000_CTRL_EXT_SDP6_DATA 0x00000040 /* Value of SW Definable Pin 6 */ ++#define E1000_CTRL_EXT_SDP7_DATA 0x00000080 /* Value of SW Definable Pin 7 */ ++/* SDP 4/5 (bits 8,9) are reserved in >= 82575 */ ++#define E1000_CTRL_EXT_SDP4_DIR 0x00000100 /* Direction of SDP4 0=in 1=out */ ++#define E1000_CTRL_EXT_SDP5_DIR 0x00000200 /* Direction of SDP5 0=in 1=out */ ++#define E1000_CTRL_EXT_SDP6_DIR 0x00000400 /* Direction of SDP6 0=in 1=out */ ++#define E1000_CTRL_EXT_SDP7_DIR 0x00000800 /* Direction of SDP7 0=in 1=out */ ++#define E1000_CTRL_EXT_ASDCHK 0x00001000 /* Initiate an ASD sequence */ ++#define E1000_CTRL_EXT_EE_RST 0x00002000 /* Reinitialize from EEPROM */ ++#define E1000_CTRL_EXT_IPS 0x00004000 /* Invert Power State */ ++#define E1000_CTRL_EXT_SPD_BYPS 0x00008000 /* Speed Select Bypass */ ++#define E1000_CTRL_EXT_RO_DIS 0x00020000 /* Relaxed Ordering disable */ ++#define E1000_CTRL_EXT_DMA_DYN_CLK_EN 0x00080000 /* DMA Dynamic Clock Gating */ ++#define E1000_CTRL_EXT_LINK_MODE_MASK 0x00C00000 ++#define E1000_CTRL_EXT_LINK_MODE_GMII 0x00000000 ++#define E1000_CTRL_EXT_LINK_MODE_TBI 0x00C00000 ++#define E1000_CTRL_EXT_LINK_MODE_KMRN 0x00000000 ++#define E1000_CTRL_EXT_LINK_MODE_PCIE_SERDES 0x00C00000 ++#define E1000_CTRL_EXT_LINK_MODE_PCIX_SERDES 0x00800000 ++#define E1000_CTRL_EXT_LINK_MODE_SGMII 0x00800000 ++#define E1000_CTRL_EXT_EIAME 0x01000000 ++#define E1000_CTRL_EXT_IRCA 0x00000001 ++#define E1000_CTRL_EXT_WR_WMARK_MASK 0x03000000 ++#define E1000_CTRL_EXT_WR_WMARK_256 0x00000000 ++#define E1000_CTRL_EXT_WR_WMARK_320 0x01000000 ++#define E1000_CTRL_EXT_WR_WMARK_384 0x02000000 ++#define E1000_CTRL_EXT_WR_WMARK_448 0x03000000 ++#define E1000_CTRL_EXT_CANC 0x04000000 /* Int delay cancellation */ ++#define E1000_CTRL_EXT_DRV_LOAD 0x10000000 /* Driver loaded bit for FW */ ++/* IAME enable bit (27) was removed in >= 82575 */ ++#define E1000_CTRL_EXT_IAME 0x08000000 /* Int acknowledge Auto-mask */ ++#define E1000_CRTL_EXT_PB_PAREN 0x01000000 /* packet buffer parity error ++ * detection enabled */ ++#define E1000_CTRL_EXT_DF_PAREN 0x02000000 /* descriptor FIFO parity ++ * error detection enable */ ++#define E1000_CTRL_EXT_GHOST_PAREN 0x40000000 ++#define E1000_CTRL_EXT_PBA_CLR 0x80000000 /* PBA Clear */ ++#define E1000_I2CCMD_REG_ADDR_SHIFT 16 ++#define E1000_I2CCMD_REG_ADDR 0x00FF0000 ++#define E1000_I2CCMD_PHY_ADDR_SHIFT 24 ++#define E1000_I2CCMD_PHY_ADDR 0x07000000 ++#define E1000_I2CCMD_OPCODE_READ 0x08000000 ++#define E1000_I2CCMD_OPCODE_WRITE 0x00000000 ++#define E1000_I2CCMD_RESET 0x10000000 ++#define E1000_I2CCMD_READY 0x20000000 ++#define E1000_I2CCMD_INTERRUPT_ENA 0x40000000 ++#define E1000_I2CCMD_ERROR 0x80000000 ++#define E1000_MAX_SGMII_PHY_REG_ADDR 255 ++#define E1000_I2CCMD_PHY_TIMEOUT 200 ++ ++/* Receive Descriptor bit definitions */ ++#define E1000_RXD_STAT_DD 0x01 /* Descriptor Done */ ++#define E1000_RXD_STAT_EOP 0x02 /* End of Packet */ ++#define E1000_RXD_STAT_IXSM 0x04 /* Ignore checksum */ ++#define E1000_RXD_STAT_VP 0x08 /* IEEE VLAN Packet */ ++#define E1000_RXD_STAT_UDPCS 0x10 /* UDP xsum calculated */ ++#define E1000_RXD_STAT_TCPCS 0x20 /* TCP xsum calculated */ ++#define E1000_RXD_STAT_IPCS 0x40 /* IP xsum calculated */ ++#define E1000_RXD_STAT_PIF 0x80 /* passed in-exact filter */ ++#define E1000_RXD_STAT_CRCV 0x100 /* Speculative CRC Valid */ ++#define E1000_RXD_STAT_IPIDV 0x200 /* IP identification valid */ ++#define E1000_RXD_STAT_UDPV 0x400 /* Valid UDP checksum */ ++#define E1000_RXD_STAT_DYNINT 0x800 /* Pkt caused INT via DYNINT */ ++#define E1000_RXD_STAT_ACK 0x8000 /* ACK Packet indication */ ++#define E1000_RXD_ERR_CE 0x01 /* CRC Error */ ++#define E1000_RXD_ERR_SE 0x02 /* Symbol Error */ ++#define E1000_RXD_ERR_SEQ 0x04 /* Sequence Error */ ++#define E1000_RXD_ERR_CXE 0x10 /* Carrier Extension Error */ ++#define E1000_RXD_ERR_TCPE 0x20 /* TCP/UDP Checksum Error */ ++#define E1000_RXD_ERR_IPE 0x40 /* IP Checksum Error */ ++#define E1000_RXD_ERR_RXE 0x80 /* Rx Data Error */ ++#define E1000_RXD_SPC_VLAN_MASK 0x0FFF /* VLAN ID is in lower 12 bits */ ++#define E1000_RXD_SPC_PRI_MASK 0xE000 /* Priority is in upper 3 bits */ ++#define E1000_RXD_SPC_PRI_SHIFT 13 ++#define E1000_RXD_SPC_CFI_MASK 0x1000 /* CFI is bit 12 */ ++#define E1000_RXD_SPC_CFI_SHIFT 12 ++ ++#define E1000_RXDEXT_STATERR_CE 0x01000000 ++#define E1000_RXDEXT_STATERR_SE 0x02000000 ++#define E1000_RXDEXT_STATERR_SEQ 0x04000000 ++#define E1000_RXDEXT_STATERR_CXE 0x10000000 ++#define E1000_RXDEXT_STATERR_TCPE 0x20000000 ++#define E1000_RXDEXT_STATERR_IPE 0x40000000 ++#define E1000_RXDEXT_STATERR_RXE 0x80000000 ++ ++/* mask to determine if packets should be dropped due to frame errors */ ++#define E1000_RXD_ERR_FRAME_ERR_MASK ( \ ++ E1000_RXD_ERR_CE | \ ++ E1000_RXD_ERR_SE | \ ++ E1000_RXD_ERR_SEQ | \ ++ E1000_RXD_ERR_CXE | \ ++ E1000_RXD_ERR_RXE) ++ ++/* Same mask, but for extended and packet split descriptors */ ++#define E1000_RXDEXT_ERR_FRAME_ERR_MASK ( \ ++ E1000_RXDEXT_STATERR_CE | \ ++ E1000_RXDEXT_STATERR_SE | \ ++ E1000_RXDEXT_STATERR_SEQ | \ ++ E1000_RXDEXT_STATERR_CXE | \ ++ E1000_RXDEXT_STATERR_RXE) ++ ++#define E1000_MRQC_ENABLE_MASK 0x00000007 ++#define E1000_MRQC_ENABLE_RSS_2Q 0x00000001 ++#define E1000_MRQC_ENABLE_RSS_INT 0x00000004 ++#define E1000_MRQC_RSS_FIELD_MASK 0xFFFF0000 ++#define E1000_MRQC_RSS_FIELD_IPV4_TCP 0x00010000 ++#define E1000_MRQC_RSS_FIELD_IPV4 0x00020000 ++#define E1000_MRQC_RSS_FIELD_IPV6_TCP_EX 0x00040000 ++#define E1000_MRQC_RSS_FIELD_IPV6_EX 0x00080000 ++#define E1000_MRQC_RSS_FIELD_IPV6 0x00100000 ++#define E1000_MRQC_RSS_FIELD_IPV6_TCP 0x00200000 ++ ++#define E1000_RXDPS_HDRSTAT_HDRSP 0x00008000 ++#define E1000_RXDPS_HDRSTAT_HDRLEN_MASK 0x000003FF ++ ++/* Management Control */ ++#define E1000_MANC_SMBUS_EN 0x00000001 /* SMBus Enabled - RO */ ++#define E1000_MANC_ASF_EN 0x00000002 /* ASF Enabled - RO */ ++#define E1000_MANC_R_ON_FORCE 0x00000004 /* Reset on Force TCO - RO */ ++#define E1000_MANC_RMCP_EN 0x00000100 /* Enable RCMP 026Fh Filtering */ ++#define E1000_MANC_0298_EN 0x00000200 /* Enable RCMP 0298h Filtering */ ++#define E1000_MANC_IPV4_EN 0x00000400 /* Enable IPv4 */ ++#define E1000_MANC_IPV6_EN 0x00000800 /* Enable IPv6 */ ++#define E1000_MANC_SNAP_EN 0x00001000 /* Accept LLC/SNAP */ ++#define E1000_MANC_ARP_EN 0x00002000 /* Enable ARP Request Filtering */ ++/* Enable Neighbor Discovery Filtering */ ++#define E1000_MANC_NEIGHBOR_EN 0x00004000 ++#define E1000_MANC_ARP_RES_EN 0x00008000 /* Enable ARP response Filtering */ ++#define E1000_MANC_TCO_RESET 0x00010000 /* TCO Reset Occurred */ ++#define E1000_MANC_RCV_TCO_EN 0x00020000 /* Receive TCO Packets Enabled */ ++#define E1000_MANC_REPORT_STATUS 0x00040000 /* Status Reporting Enabled */ ++#define E1000_MANC_RCV_ALL 0x00080000 /* Receive All Enabled */ ++#define E1000_MANC_BLK_PHY_RST_ON_IDE 0x00040000 /* Block phy resets */ ++/* Enable MAC address filtering */ ++#define E1000_MANC_EN_MAC_ADDR_FILTER 0x00100000 ++/* Enable MNG packets to host memory */ ++#define E1000_MANC_EN_MNG2HOST 0x00200000 ++/* Enable IP address filtering */ ++#define E1000_MANC_EN_IP_ADDR_FILTER 0x00400000 ++#define E1000_MANC_EN_XSUM_FILTER 0x00800000 /* Enable checksum filtering */ ++#define E1000_MANC_BR_EN 0x01000000 /* Enable broadcast filtering */ ++#define E1000_MANC_SMB_REQ 0x01000000 /* SMBus Request */ ++#define E1000_MANC_SMB_GNT 0x02000000 /* SMBus Grant */ ++#define E1000_MANC_SMB_CLK_IN 0x04000000 /* SMBus Clock In */ ++#define E1000_MANC_SMB_DATA_IN 0x08000000 /* SMBus Data In */ ++#define E1000_MANC_SMB_DATA_OUT 0x10000000 /* SMBus Data Out */ ++#define E1000_MANC_SMB_CLK_OUT 0x20000000 /* SMBus Clock Out */ ++ ++#define E1000_MANC_SMB_DATA_OUT_SHIFT 28 /* SMBus Data Out Shift */ ++#define E1000_MANC_SMB_CLK_OUT_SHIFT 29 /* SMBus Clock Out Shift */ ++ ++/* Receive Control */ ++#define E1000_RCTL_RST 0x00000001 /* Software reset */ ++#define E1000_RCTL_EN 0x00000002 /* enable */ ++#define E1000_RCTL_SBP 0x00000004 /* store bad packet */ ++#define E1000_RCTL_UPE 0x00000008 /* unicast promisc enable */ ++#define E1000_RCTL_MPE 0x00000010 /* multicast promisc enable */ ++#define E1000_RCTL_LPE 0x00000020 /* long packet enable */ ++#define E1000_RCTL_LBM_NO 0x00000000 /* no loopback mode */ ++#define E1000_RCTL_LBM_MAC 0x00000040 /* MAC loopback mode */ ++#define E1000_RCTL_LBM_SLP 0x00000080 /* serial link loopback mode */ ++#define E1000_RCTL_LBM_TCVR 0x000000C0 /* tcvr loopback mode */ ++#define E1000_RCTL_DTYP_MASK 0x00000C00 /* Descriptor type mask */ ++#define E1000_RCTL_DTYP_PS 0x00000400 /* Packet Split descriptor */ ++#define E1000_RCTL_RDMTS_HALF 0x00000000 /* rx desc min thresh size */ ++#define E1000_RCTL_RDMTS_QUAT 0x00000100 /* rx desc min thresh size */ ++#define E1000_RCTL_RDMTS_EIGTH 0x00000200 /* rx desc min thresh size */ ++#define E1000_RCTL_MO_SHIFT 12 /* multicast offset shift */ ++#define E1000_RCTL_MO_0 0x00000000 /* multicast offset 11:0 */ ++#define E1000_RCTL_MO_1 0x00001000 /* multicast offset 12:1 */ ++#define E1000_RCTL_MO_2 0x00002000 /* multicast offset 13:2 */ ++#define E1000_RCTL_MO_3 0x00003000 /* multicast offset 15:4 */ ++#define E1000_RCTL_MDR 0x00004000 /* multicast desc ring 0 */ ++#define E1000_RCTL_BAM 0x00008000 /* broadcast enable */ ++/* these buffer sizes are valid if E1000_RCTL_BSEX is 0 */ ++#define E1000_RCTL_SZ_2048 0x00000000 /* rx buffer size 2048 */ ++#define E1000_RCTL_SZ_1024 0x00010000 /* rx buffer size 1024 */ ++#define E1000_RCTL_SZ_512 0x00020000 /* rx buffer size 512 */ ++#define E1000_RCTL_SZ_256 0x00030000 /* rx buffer size 256 */ ++/* these buffer sizes are valid if E1000_RCTL_BSEX is 1 */ ++#define E1000_RCTL_SZ_16384 0x00010000 /* rx buffer size 16384 */ ++#define E1000_RCTL_SZ_8192 0x00020000 /* rx buffer size 8192 */ ++#define E1000_RCTL_SZ_4096 0x00030000 /* rx buffer size 4096 */ ++#define E1000_RCTL_VFE 0x00040000 /* vlan filter enable */ ++#define E1000_RCTL_CFIEN 0x00080000 /* canonical form enable */ ++#define E1000_RCTL_CFI 0x00100000 /* canonical form indicator */ ++#define E1000_RCTL_DPF 0x00400000 /* discard pause frames */ ++#define E1000_RCTL_PMCF 0x00800000 /* pass MAC control frames */ ++#define E1000_RCTL_BSEX 0x02000000 /* Buffer size extension */ ++#define E1000_RCTL_SECRC 0x04000000 /* Strip Ethernet CRC */ ++#define E1000_RCTL_FLXBUF_MASK 0x78000000 /* Flexible buffer size */ ++#define E1000_RCTL_FLXBUF_SHIFT 27 /* Flexible buffer shift */ ++ ++/* ++ * Use byte values for the following shift parameters ++ * Usage: ++ * psrctl |= (((ROUNDUP(value0, 128) >> E1000_PSRCTL_BSIZE0_SHIFT) & ++ * E1000_PSRCTL_BSIZE0_MASK) | ++ * ((ROUNDUP(value1, 1024) >> E1000_PSRCTL_BSIZE1_SHIFT) & ++ * E1000_PSRCTL_BSIZE1_MASK) | ++ * ((ROUNDUP(value2, 1024) << E1000_PSRCTL_BSIZE2_SHIFT) & ++ * E1000_PSRCTL_BSIZE2_MASK) | ++ * ((ROUNDUP(value3, 1024) << E1000_PSRCTL_BSIZE3_SHIFT) |; ++ * E1000_PSRCTL_BSIZE3_MASK)) ++ * where value0 = [128..16256], default=256 ++ * value1 = [1024..64512], default=4096 ++ * value2 = [0..64512], default=4096 ++ * value3 = [0..64512], default=0 ++ */ ++ ++#define E1000_PSRCTL_BSIZE0_MASK 0x0000007F ++#define E1000_PSRCTL_BSIZE1_MASK 0x00003F00 ++#define E1000_PSRCTL_BSIZE2_MASK 0x003F0000 ++#define E1000_PSRCTL_BSIZE3_MASK 0x3F000000 ++ ++#define E1000_PSRCTL_BSIZE0_SHIFT 7 /* Shift _right_ 7 */ ++#define E1000_PSRCTL_BSIZE1_SHIFT 2 /* Shift _right_ 2 */ ++#define E1000_PSRCTL_BSIZE2_SHIFT 6 /* Shift _left_ 6 */ ++#define E1000_PSRCTL_BSIZE3_SHIFT 14 /* Shift _left_ 14 */ ++ ++/* SWFW_SYNC Definitions */ ++#define E1000_SWFW_EEP_SM 0x1 ++#define E1000_SWFW_PHY0_SM 0x2 ++#define E1000_SWFW_PHY1_SM 0x4 ++#define E1000_SWFW_CSR_SM 0x8 ++ ++/* FACTPS Definitions */ ++#define E1000_FACTPS_LFS 0x40000000 /* LAN Function Select */ ++/* Device Control */ ++#define E1000_CTRL_FD 0x00000001 /* Full duplex.0=half; 1=full */ ++#define E1000_CTRL_BEM 0x00000002 /* Endian Mode.0=little,1=big */ ++#define E1000_CTRL_PRIOR 0x00000004 /* Priority on PCI. 0=rx,1=fair */ ++#define E1000_CTRL_GIO_MASTER_DISABLE 0x00000004 /*Blocks new Master reqs */ ++#define E1000_CTRL_LRST 0x00000008 /* Link reset. 0=normal,1=reset */ ++#define E1000_CTRL_TME 0x00000010 /* Test mode. 0=normal,1=test */ ++#define E1000_CTRL_SLE 0x00000020 /* Serial Link on 0=dis,1=en */ ++#define E1000_CTRL_ASDE 0x00000020 /* Auto-speed detect enable */ ++#define E1000_CTRL_SLU 0x00000040 /* Set link up (Force Link) */ ++#define E1000_CTRL_ILOS 0x00000080 /* Invert Loss-Of Signal */ ++#define E1000_CTRL_SPD_SEL 0x00000300 /* Speed Select Mask */ ++#define E1000_CTRL_SPD_10 0x00000000 /* Force 10Mb */ ++#define E1000_CTRL_SPD_100 0x00000100 /* Force 100Mb */ ++#define E1000_CTRL_SPD_1000 0x00000200 /* Force 1Gb */ ++#define E1000_CTRL_BEM32 0x00000400 /* Big Endian 32 mode */ ++#define E1000_CTRL_FRCSPD 0x00000800 /* Force Speed */ ++#define E1000_CTRL_FRCDPX 0x00001000 /* Force Duplex */ ++#define E1000_CTRL_D_UD_EN 0x00002000 /* Dock/Undock enable */ ++#define E1000_CTRL_D_UD_POLARITY 0x00004000 /* Defined polarity of Dock/Undock ++ * indication in SDP[0] */ ++#define E1000_CTRL_FORCE_PHY_RESET 0x00008000 /* Reset both PHY ports, through ++ * PHYRST_N pin */ ++#define E1000_CTRL_EXT_LINK_EN 0x00010000 /* enable link status from external ++ * LINK_0 and LINK_1 pins */ ++#define E1000_CTRL_SWDPIN0 0x00040000 /* SWDPIN 0 value */ ++#define E1000_CTRL_SWDPIN1 0x00080000 /* SWDPIN 1 value */ ++#define E1000_CTRL_SWDPIN2 0x00100000 /* SWDPIN 2 value */ ++#define E1000_CTRL_SWDPIN3 0x00200000 /* SWDPIN 3 value */ ++#define E1000_CTRL_SWDPIO0 0x00400000 /* SWDPIN 0 Input or output */ ++#define E1000_CTRL_SWDPIO1 0x00800000 /* SWDPIN 1 input or output */ ++#define E1000_CTRL_SWDPIO2 0x01000000 /* SWDPIN 2 input or output */ ++#define E1000_CTRL_SWDPIO3 0x02000000 /* SWDPIN 3 input or output */ ++#define E1000_CTRL_RST 0x04000000 /* Global reset */ ++#define E1000_CTRL_RFCE 0x08000000 /* Receive Flow Control enable */ ++#define E1000_CTRL_TFCE 0x10000000 /* Transmit flow control enable */ ++#define E1000_CTRL_RTE 0x20000000 /* Routing tag enable */ ++#define E1000_CTRL_VME 0x40000000 /* IEEE VLAN mode enable */ ++#define E1000_CTRL_PHY_RST 0x80000000 /* PHY Reset */ ++#define E1000_CTRL_SW2FW_INT 0x02000000 /* Initiate an interrupt to ME */ ++#define E1000_CTRL_I2C_ENA 0x02000000 /* I2C enable */ ++ ++/* ++ * Bit definitions for the Management Data IO (MDIO) and Management Data ++ * Clock (MDC) pins in the Device Control Register. ++ */ ++#define E1000_CTRL_PHY_RESET_DIR E1000_CTRL_SWDPIO0 ++#define E1000_CTRL_PHY_RESET E1000_CTRL_SWDPIN0 ++#define E1000_CTRL_MDIO_DIR E1000_CTRL_SWDPIO2 ++#define E1000_CTRL_MDIO E1000_CTRL_SWDPIN2 ++#define E1000_CTRL_MDC_DIR E1000_CTRL_SWDPIO3 ++#define E1000_CTRL_MDC E1000_CTRL_SWDPIN3 ++#define E1000_CTRL_PHY_RESET_DIR4 E1000_CTRL_EXT_SDP4_DIR ++#define E1000_CTRL_PHY_RESET4 E1000_CTRL_EXT_SDP4_DATA ++ ++#define E1000_CONNSW_ENRGSRC 0x4 ++#define E1000_PCS_CFG_PCS_EN 8 ++#define E1000_PCS_LCTL_FLV_LINK_UP 1 ++#define E1000_PCS_LCTL_FSV_10 0 ++#define E1000_PCS_LCTL_FSV_100 2 ++#define E1000_PCS_LCTL_FSV_1000 4 ++#define E1000_PCS_LCTL_FDV_FULL 8 ++#define E1000_PCS_LCTL_FSD 0x10 ++#define E1000_PCS_LCTL_FORCE_LINK 0x20 ++#define E1000_PCS_LCTL_LOW_LINK_LATCH 0x40 ++#define E1000_PCS_LCTL_FORCE_FCTRL 0x80 ++#define E1000_PCS_LCTL_AN_ENABLE 0x10000 ++#define E1000_PCS_LCTL_AN_RESTART 0x20000 ++#define E1000_PCS_LCTL_AN_TIMEOUT 0x40000 ++#define E1000_PCS_LCTL_AN_SGMII_BYPASS 0x80000 ++#define E1000_PCS_LCTL_AN_SGMII_TRIGGER 0x100000 ++#define E1000_PCS_LCTL_FAST_LINK_TIMER 0x1000000 ++#define E1000_PCS_LCTL_LINK_OK_FIX 0x2000000 ++#define E1000_PCS_LCTL_CRS_ON_NI 0x4000000 ++#define E1000_ENABLE_SERDES_LOOPBACK 0x0410 ++ ++#define E1000_PCS_LSTS_LINK_OK 1 ++#define E1000_PCS_LSTS_SPEED_10 0 ++#define E1000_PCS_LSTS_SPEED_100 2 ++#define E1000_PCS_LSTS_SPEED_1000 4 ++#define E1000_PCS_LSTS_DUPLEX_FULL 8 ++#define E1000_PCS_LSTS_SYNK_OK 0x10 ++#define E1000_PCS_LSTS_AN_COMPLETE 0x10000 ++#define E1000_PCS_LSTS_AN_PAGE_RX 0x20000 ++#define E1000_PCS_LSTS_AN_TIMED_OUT 0x40000 ++#define E1000_PCS_LSTS_AN_REMOTE_FAULT 0x80000 ++#define E1000_PCS_LSTS_AN_ERROR_RWS 0x100000 ++ ++/* Device Status */ ++#define E1000_STATUS_FD 0x00000001 /* Full duplex.0=half,1=full */ ++#define E1000_STATUS_LU 0x00000002 /* Link up.0=no,1=link */ ++#define E1000_STATUS_FUNC_MASK 0x0000000C /* PCI Function Mask */ ++#define E1000_STATUS_FUNC_SHIFT 2 ++#define E1000_STATUS_FUNC_0 0x00000000 /* Function 0 */ ++#define E1000_STATUS_FUNC_1 0x00000004 /* Function 1 */ ++#define E1000_STATUS_TXOFF 0x00000010 /* transmission paused */ ++#define E1000_STATUS_TBIMODE 0x00000020 /* TBI mode */ ++#define E1000_STATUS_SPEED_MASK 0x000000C0 ++#define E1000_STATUS_SPEED_10 0x00000000 /* Speed 10Mb/s */ ++#define E1000_STATUS_SPEED_100 0x00000040 /* Speed 100Mb/s */ ++#define E1000_STATUS_SPEED_1000 0x00000080 /* Speed 1000Mb/s */ ++#define E1000_STATUS_LAN_INIT_DONE 0x00000200 /* Lan Init Completion by NVM */ ++#define E1000_STATUS_ASDV 0x00000300 /* Auto speed detect value */ ++#define E1000_STATUS_DOCK_CI 0x00000800 /* Change in Dock/Undock state. ++ * Clear on write '0'. */ ++#define E1000_STATUS_GIO_MASTER_ENABLE 0x00080000 /* Master request status */ ++#define E1000_STATUS_MTXCKOK 0x00000400 /* MTX clock running OK */ ++#define E1000_STATUS_PCI66 0x00000800 /* In 66Mhz slot */ ++#define E1000_STATUS_BUS64 0x00001000 /* In 64 bit slot */ ++#define E1000_STATUS_PCIX_MODE 0x00002000 /* PCI-X mode */ ++#define E1000_STATUS_PCIX_SPEED 0x0000C000 /* PCI-X bus speed */ ++#define E1000_STATUS_BMC_SKU_0 0x00100000 /* BMC USB redirect disabled */ ++#define E1000_STATUS_BMC_SKU_1 0x00200000 /* BMC SRAM disabled */ ++#define E1000_STATUS_BMC_SKU_2 0x00400000 /* BMC SDRAM disabled */ ++#define E1000_STATUS_BMC_CRYPTO 0x00800000 /* BMC crypto disabled */ ++#define E1000_STATUS_BMC_LITE 0x01000000 /* BMC external code execution ++ * disabled */ ++#define E1000_STATUS_RGMII_ENABLE 0x02000000 /* RGMII disabled */ ++#define E1000_STATUS_FUSE_8 0x04000000 ++#define E1000_STATUS_FUSE_9 0x08000000 ++#define E1000_STATUS_SERDES0_DIS 0x10000000 /* SERDES disabled on port 0 */ ++#define E1000_STATUS_SERDES1_DIS 0x20000000 /* SERDES disabled on port 1 */ ++ ++/* Constants used to interpret the masked PCI-X bus speed. */ ++#define E1000_STATUS_PCIX_SPEED_66 0x00000000 /* PCI-X bus speed 50-66 MHz */ ++#define E1000_STATUS_PCIX_SPEED_100 0x00004000 /* PCI-X bus speed 66-100 MHz */ ++#define E1000_STATUS_PCIX_SPEED_133 0x00008000 /*PCI-X bus speed 100-133 MHz*/ ++ ++#define SPEED_10 10 ++#define SPEED_100 100 ++#define SPEED_1000 1000 ++#define HALF_DUPLEX 1 ++#define FULL_DUPLEX 2 ++ ++#define PHY_FORCE_TIME 20 ++ ++#define ADVERTISE_10_HALF 0x0001 ++#define ADVERTISE_10_FULL 0x0002 ++#define ADVERTISE_100_HALF 0x0004 ++#define ADVERTISE_100_FULL 0x0008 ++#define ADVERTISE_1000_HALF 0x0010 /* Not used, just FYI */ ++#define ADVERTISE_1000_FULL 0x0020 ++ ++/* 1000/H is not supported, nor spec-compliant. */ ++#define E1000_ALL_SPEED_DUPLEX (ADVERTISE_10_HALF | ADVERTISE_10_FULL | \ ++ ADVERTISE_100_HALF | ADVERTISE_100_FULL | \ ++ ADVERTISE_1000_FULL) ++#define E1000_ALL_NOT_GIG (ADVERTISE_10_HALF | ADVERTISE_10_FULL | \ ++ ADVERTISE_100_HALF | ADVERTISE_100_FULL) ++#define E1000_ALL_100_SPEED (ADVERTISE_100_HALF | ADVERTISE_100_FULL) ++#define E1000_ALL_10_SPEED (ADVERTISE_10_HALF | ADVERTISE_10_FULL) ++#define E1000_ALL_FULL_DUPLEX (ADVERTISE_10_FULL | ADVERTISE_100_FULL | \ ++ ADVERTISE_1000_FULL) ++#define E1000_ALL_HALF_DUPLEX (ADVERTISE_10_HALF | ADVERTISE_100_HALF) ++ ++#define AUTONEG_ADVERTISE_SPEED_DEFAULT E1000_ALL_SPEED_DUPLEX ++ ++/* LED Control */ ++#define E1000_LEDCTL_LED0_MODE_MASK 0x0000000F ++#define E1000_LEDCTL_LED0_MODE_SHIFT 0 ++#define E1000_LEDCTL_LED0_BLINK_RATE 0x00000020 ++#define E1000_LEDCTL_LED0_IVRT 0x00000040 ++#define E1000_LEDCTL_LED0_BLINK 0x00000080 ++#define E1000_LEDCTL_LED1_MODE_MASK 0x00000F00 ++#define E1000_LEDCTL_LED1_MODE_SHIFT 8 ++#define E1000_LEDCTL_LED1_BLINK_RATE 0x00002000 ++#define E1000_LEDCTL_LED1_IVRT 0x00004000 ++#define E1000_LEDCTL_LED1_BLINK 0x00008000 ++#define E1000_LEDCTL_LED2_MODE_MASK 0x000F0000 ++#define E1000_LEDCTL_LED2_MODE_SHIFT 16 ++#define E1000_LEDCTL_LED2_BLINK_RATE 0x00200000 ++#define E1000_LEDCTL_LED2_IVRT 0x00400000 ++#define E1000_LEDCTL_LED2_BLINK 0x00800000 ++#define E1000_LEDCTL_LED3_MODE_MASK 0x0F000000 ++#define E1000_LEDCTL_LED3_MODE_SHIFT 24 ++#define E1000_LEDCTL_LED3_BLINK_RATE 0x20000000 ++#define E1000_LEDCTL_LED3_IVRT 0x40000000 ++#define E1000_LEDCTL_LED3_BLINK 0x80000000 ++ ++#define E1000_LEDCTL_MODE_LINK_10_1000 0x0 ++#define E1000_LEDCTL_MODE_LINK_100_1000 0x1 ++#define E1000_LEDCTL_MODE_LINK_UP 0x2 ++#define E1000_LEDCTL_MODE_ACTIVITY 0x3 ++#define E1000_LEDCTL_MODE_LINK_ACTIVITY 0x4 ++#define E1000_LEDCTL_MODE_LINK_10 0x5 ++#define E1000_LEDCTL_MODE_LINK_100 0x6 ++#define E1000_LEDCTL_MODE_LINK_1000 0x7 ++#define E1000_LEDCTL_MODE_PCIX_MODE 0x8 ++#define E1000_LEDCTL_MODE_FULL_DUPLEX 0x9 ++#define E1000_LEDCTL_MODE_COLLISION 0xA ++#define E1000_LEDCTL_MODE_BUS_SPEED 0xB ++#define E1000_LEDCTL_MODE_BUS_SIZE 0xC ++#define E1000_LEDCTL_MODE_PAUSED 0xD ++#define E1000_LEDCTL_MODE_LED_ON 0xE ++#define E1000_LEDCTL_MODE_LED_OFF 0xF ++ ++/* Transmit Descriptor bit definitions */ ++#define E1000_TXD_DTYP_D 0x00100000 /* Data Descriptor */ ++#define E1000_TXD_DTYP_C 0x00000000 /* Context Descriptor */ ++#define E1000_TXD_POPTS_SHIFT 8 /* POPTS shift */ ++#define E1000_TXD_POPTS_IXSM 0x01 /* Insert IP checksum */ ++#define E1000_TXD_POPTS_TXSM 0x02 /* Insert TCP/UDP checksum */ ++#define E1000_TXD_CMD_EOP 0x01000000 /* End of Packet */ ++#define E1000_TXD_CMD_IFCS 0x02000000 /* Insert FCS (Ethernet CRC) */ ++#define E1000_TXD_CMD_IC 0x04000000 /* Insert Checksum */ ++#define E1000_TXD_CMD_RS 0x08000000 /* Report Status */ ++#define E1000_TXD_CMD_RPS 0x10000000 /* Report Packet Sent */ ++#define E1000_TXD_CMD_DEXT 0x20000000 /* Descriptor extension (0 = legacy) */ ++#define E1000_TXD_CMD_VLE 0x40000000 /* Add VLAN tag */ ++#define E1000_TXD_CMD_IDE 0x80000000 /* Enable Tidv register */ ++#define E1000_TXD_STAT_DD 0x00000001 /* Descriptor Done */ ++#define E1000_TXD_STAT_EC 0x00000002 /* Excess Collisions */ ++#define E1000_TXD_STAT_LC 0x00000004 /* Late Collisions */ ++#define E1000_TXD_STAT_TU 0x00000008 /* Transmit underrun */ ++#define E1000_TXD_CMD_TCP 0x01000000 /* TCP packet */ ++#define E1000_TXD_CMD_IP 0x02000000 /* IP packet */ ++#define E1000_TXD_CMD_TSE 0x04000000 /* TCP Seg enable */ ++#define E1000_TXD_STAT_TC 0x00000004 /* Tx Underrun */ ++/* Extended desc bits for Linksec and timesync */ ++ ++/* Transmit Control */ ++#define E1000_TCTL_RST 0x00000001 /* software reset */ ++#define E1000_TCTL_EN 0x00000002 /* enable tx */ ++#define E1000_TCTL_BCE 0x00000004 /* busy check enable */ ++#define E1000_TCTL_PSP 0x00000008 /* pad short packets */ ++#define E1000_TCTL_CT 0x00000ff0 /* collision threshold */ ++#define E1000_TCTL_COLD 0x003ff000 /* collision distance */ ++#define E1000_TCTL_SWXOFF 0x00400000 /* SW Xoff transmission */ ++#define E1000_TCTL_PBE 0x00800000 /* Packet Burst Enable */ ++#define E1000_TCTL_RTLC 0x01000000 /* Re-transmit on late collision */ ++#define E1000_TCTL_NRTU 0x02000000 /* No Re-transmit on underrun */ ++#define E1000_TCTL_MULR 0x10000000 /* Multiple request support */ ++ ++/* Transmit Arbitration Count */ ++#define E1000_TARC0_ENABLE 0x00000400 /* Enable Tx Queue 0 */ ++ ++/* SerDes Control */ ++#define E1000_SCTL_DISABLE_SERDES_LOOPBACK 0x0400 ++ ++/* Receive Checksum Control */ ++#define E1000_RXCSUM_PCSS_MASK 0x000000FF /* Packet Checksum Start */ ++#define E1000_RXCSUM_IPOFL 0x00000100 /* IPv4 checksum offload */ ++#define E1000_RXCSUM_TUOFL 0x00000200 /* TCP / UDP checksum offload */ ++#define E1000_RXCSUM_IPV6OFL 0x00000400 /* IPv6 checksum offload */ ++#define E1000_RXCSUM_CRCOFL 0x00000800 /* CRC32 offload enable */ ++#define E1000_RXCSUM_IPPCSE 0x00001000 /* IP payload checksum enable */ ++#define E1000_RXCSUM_PCSD 0x00002000 /* packet checksum disabled */ ++ ++/* Header split receive */ ++#define E1000_RFCTL_ISCSI_DIS 0x00000001 ++#define E1000_RFCTL_ISCSI_DWC_MASK 0x0000003E ++#define E1000_RFCTL_ISCSI_DWC_SHIFT 1 ++#define E1000_RFCTL_NFSW_DIS 0x00000040 ++#define E1000_RFCTL_NFSR_DIS 0x00000080 ++#define E1000_RFCTL_NFS_VER_MASK 0x00000300 ++#define E1000_RFCTL_NFS_VER_SHIFT 8 ++#define E1000_RFCTL_IPV6_DIS 0x00000400 ++#define E1000_RFCTL_IPV6_XSUM_DIS 0x00000800 ++#define E1000_RFCTL_ACK_DIS 0x00001000 ++#define E1000_RFCTL_ACKD_DIS 0x00002000 ++#define E1000_RFCTL_IPFRSP_DIS 0x00004000 ++#define E1000_RFCTL_EXTEN 0x00008000 ++#define E1000_RFCTL_IPV6_EX_DIS 0x00010000 ++#define E1000_RFCTL_NEW_IPV6_EXT_DIS 0x00020000 ++#define E1000_RFCTL_LEF 0x00040000 ++ ++/* Collision related configuration parameters */ ++#define E1000_COLLISION_THRESHOLD 15 ++#define E1000_CT_SHIFT 4 ++#define E1000_COLLISION_DISTANCE 63 ++#define E1000_COLD_SHIFT 12 ++ ++/* Default values for the transmit IPG register */ ++#define DEFAULT_82542_TIPG_IPGT 10 ++#define DEFAULT_82543_TIPG_IPGT_FIBER 9 ++#define DEFAULT_82543_TIPG_IPGT_COPPER 8 ++ ++#define E1000_TIPG_IPGT_MASK 0x000003FF ++#define E1000_TIPG_IPGR1_MASK 0x000FFC00 ++#define E1000_TIPG_IPGR2_MASK 0x3FF00000 ++ ++#define DEFAULT_82542_TIPG_IPGR1 2 ++#define DEFAULT_82543_TIPG_IPGR1 8 ++#define E1000_TIPG_IPGR1_SHIFT 10 ++ ++#define DEFAULT_82542_TIPG_IPGR2 10 ++#define DEFAULT_82543_TIPG_IPGR2 6 ++#define DEFAULT_80003ES2LAN_TIPG_IPGR2 7 ++#define E1000_TIPG_IPGR2_SHIFT 20 ++ ++/* Ethertype field values */ ++#define ETHERNET_IEEE_VLAN_TYPE 0x8100 /* 802.3ac packet */ ++ ++#define ETHERNET_FCS_SIZE 4 ++#define MAX_JUMBO_FRAME_SIZE 0x3F00 ++ ++/* Extended Configuration Control and Size */ ++#define E1000_EXTCNF_CTRL_MDIO_SW_OWNERSHIP 0x00000020 ++#define E1000_EXTCNF_CTRL_LCD_WRITE_ENABLE 0x00000001 ++#define E1000_EXTCNF_CTRL_SWFLAG 0x00000020 ++#define E1000_EXTCNF_SIZE_EXT_PCIE_LENGTH_MASK 0x00FF0000 ++#define E1000_EXTCNF_SIZE_EXT_PCIE_LENGTH_SHIFT 16 ++#define E1000_EXTCNF_CTRL_EXT_CNF_POINTER_MASK 0x0FFF0000 ++#define E1000_EXTCNF_CTRL_EXT_CNF_POINTER_SHIFT 16 ++ ++#define E1000_PHY_CTRL_SPD_EN 0x00000001 ++#define E1000_PHY_CTRL_D0A_LPLU 0x00000002 ++#define E1000_PHY_CTRL_NOND0A_LPLU 0x00000004 ++#define E1000_PHY_CTRL_NOND0A_GBE_DISABLE 0x00000008 ++#define E1000_PHY_CTRL_GBE_DISABLE 0x00000040 ++ ++#define E1000_KABGTXD_BGSQLBIAS 0x00050000 ++ ++/* PBA constants */ ++#define E1000_PBA_6K 0x0006 /* 6KB */ ++#define E1000_PBA_8K 0x0008 /* 8KB */ ++#define E1000_PBA_10K 0x000A /* 10KB */ ++#define E1000_PBA_12K 0x000C /* 12KB */ ++#define E1000_PBA_14K 0x000E /* 14KB */ ++#define E1000_PBA_16K 0x0010 /* 16KB */ ++#define E1000_PBA_18K 0x0012 ++#define E1000_PBA_20K 0x0014 ++#define E1000_PBA_22K 0x0016 ++#define E1000_PBA_24K 0x0018 ++#define E1000_PBA_26K 0x001A ++#define E1000_PBA_30K 0x001E ++#define E1000_PBA_32K 0x0020 ++#define E1000_PBA_34K 0x0022 ++#define E1000_PBA_35K 0x0023 ++#define E1000_PBA_38K 0x0026 ++#define E1000_PBA_40K 0x0028 ++#define E1000_PBA_48K 0x0030 /* 48KB */ ++#define E1000_PBA_64K 0x0040 /* 64KB */ ++ ++#define E1000_PBS_16K E1000_PBA_16K ++#define E1000_PBS_24K E1000_PBA_24K ++ ++#define IFS_MAX 80 ++#define IFS_MIN 40 ++#define IFS_RATIO 4 ++#define IFS_STEP 10 ++#define MIN_NUM_XMITS 1000 ++ ++/* SW Semaphore Register */ ++#define E1000_SWSM_SMBI 0x00000001 /* Driver Semaphore bit */ ++#define E1000_SWSM_SWESMBI 0x00000002 /* FW Semaphore bit */ ++#define E1000_SWSM_WMNG 0x00000004 /* Wake MNG Clock */ ++#define E1000_SWSM_DRV_LOAD 0x00000008 /* Driver Loaded Bit */ ++ ++#define E1000_SWSM2_LOCK 0x00000002 /* Secondary driver semaphore bit */ ++ ++/* Interrupt Cause Read */ ++#define E1000_ICR_TXDW 0x00000001 /* Transmit desc written back */ ++#define E1000_ICR_TXQE 0x00000002 /* Transmit Queue empty */ ++#define E1000_ICR_LSC 0x00000004 /* Link Status Change */ ++#define E1000_ICR_RXSEQ 0x00000008 /* rx sequence error */ ++#define E1000_ICR_RXDMT0 0x00000010 /* rx desc min. threshold (0) */ ++#define E1000_ICR_RXO 0x00000040 /* rx overrun */ ++#define E1000_ICR_RXT0 0x00000080 /* rx timer intr (ring 0) */ ++#define E1000_ICR_VMMB 0x00000100 /* VM MB event */ ++#define E1000_ICR_MDAC 0x00000200 /* MDIO access complete */ ++#define E1000_ICR_RXCFG 0x00000400 /* Rx /c/ ordered set */ ++#define E1000_ICR_GPI_EN0 0x00000800 /* GP Int 0 */ ++#define E1000_ICR_GPI_EN1 0x00001000 /* GP Int 1 */ ++#define E1000_ICR_GPI_EN2 0x00002000 /* GP Int 2 */ ++#define E1000_ICR_GPI_EN3 0x00004000 /* GP Int 3 */ ++#define E1000_ICR_TXD_LOW 0x00008000 ++#define E1000_ICR_SRPD 0x00010000 ++#define E1000_ICR_ACK 0x00020000 /* Receive Ack frame */ ++#define E1000_ICR_MNG 0x00040000 /* Manageability event */ ++#define E1000_ICR_DOCK 0x00080000 /* Dock/Undock */ ++#define E1000_ICR_INT_ASSERTED 0x80000000 /* If this bit asserted, the driver ++ * should claim the interrupt */ ++#define E1000_ICR_RXD_FIFO_PAR0 0x00100000 /* Q0 Rx desc FIFO parity error */ ++#define E1000_ICR_TXD_FIFO_PAR0 0x00200000 /* Q0 Tx desc FIFO parity error */ ++#define E1000_ICR_HOST_ARB_PAR 0x00400000 /* host arb read buffer parity err */ ++#define E1000_ICR_PB_PAR 0x00800000 /* packet buffer parity error */ ++#define E1000_ICR_RXD_FIFO_PAR1 0x01000000 /* Q1 Rx desc FIFO parity error */ ++#define E1000_ICR_TXD_FIFO_PAR1 0x02000000 /* Q1 Tx desc FIFO parity error */ ++#define E1000_ICR_ALL_PARITY 0x03F00000 /* all parity error bits */ ++#define E1000_ICR_DSW 0x00000020 /* FW changed the status of DISSW ++ * bit in the FWSM */ ++#define E1000_ICR_PHYINT 0x00001000 /* LAN connected device generates ++ * an interrupt */ ++#define E1000_ICR_DOUTSYNC 0x10000000 /* NIC DMA out of sync */ ++#define E1000_ICR_EPRST 0x00100000 /* ME hardware reset occurs */ ++ ++ ++/* ++ * This defines the bits that are set in the Interrupt Mask ++ * Set/Read Register. Each bit is documented below: ++ * o RXDMT0 = Receive Descriptor Minimum Threshold hit (ring 0) ++ * o RXSEQ = Receive Sequence Error ++ */ ++#define POLL_IMS_ENABLE_MASK ( \ ++ E1000_IMS_RXDMT0 | \ ++ E1000_IMS_RXSEQ) ++ ++/* ++ * This defines the bits that are set in the Interrupt Mask ++ * Set/Read Register. Each bit is documented below: ++ * o RXT0 = Receiver Timer Interrupt (ring 0) ++ * o TXDW = Transmit Descriptor Written Back ++ * o RXDMT0 = Receive Descriptor Minimum Threshold hit (ring 0) ++ * o RXSEQ = Receive Sequence Error ++ * o LSC = Link Status Change ++ */ ++#define IMS_ENABLE_MASK ( \ ++ E1000_IMS_RXT0 | \ ++ E1000_IMS_TXDW | \ ++ E1000_IMS_RXDMT0 | \ ++ E1000_IMS_RXSEQ | \ ++ E1000_IMS_LSC) ++ ++/* Interrupt Mask Set */ ++#define E1000_IMS_TXDW E1000_ICR_TXDW /* Tx desc written back */ ++#define E1000_IMS_TXQE E1000_ICR_TXQE /* Transmit Queue empty */ ++#define E1000_IMS_LSC E1000_ICR_LSC /* Link Status Change */ ++#define E1000_IMS_VMMB E1000_ICR_VMMB /* Mail box activity */ ++#define E1000_IMS_RXSEQ E1000_ICR_RXSEQ /* rx sequence error */ ++#define E1000_IMS_RXDMT0 E1000_ICR_RXDMT0 /* rx desc min. threshold */ ++#define E1000_IMS_RXO E1000_ICR_RXO /* rx overrun */ ++#define E1000_IMS_RXT0 E1000_ICR_RXT0 /* rx timer intr */ ++#define E1000_IMS_MDAC E1000_ICR_MDAC /* MDIO access complete */ ++#define E1000_IMS_RXCFG E1000_ICR_RXCFG /* Rx /c/ ordered set */ ++#define E1000_IMS_GPI_EN0 E1000_ICR_GPI_EN0 /* GP Int 0 */ ++#define E1000_IMS_GPI_EN1 E1000_ICR_GPI_EN1 /* GP Int 1 */ ++#define E1000_IMS_GPI_EN2 E1000_ICR_GPI_EN2 /* GP Int 2 */ ++#define E1000_IMS_GPI_EN3 E1000_ICR_GPI_EN3 /* GP Int 3 */ ++#define E1000_IMS_TXD_LOW E1000_ICR_TXD_LOW ++#define E1000_IMS_SRPD E1000_ICR_SRPD ++#define E1000_IMS_ACK E1000_ICR_ACK /* Receive Ack frame */ ++#define E1000_IMS_MNG E1000_ICR_MNG /* Manageability event */ ++#define E1000_IMS_DOCK E1000_ICR_DOCK /* Dock/Undock */ ++#define E1000_IMS_RXD_FIFO_PAR0 E1000_ICR_RXD_FIFO_PAR0 /* Q0 Rx desc FIFO ++ * parity error */ ++#define E1000_IMS_TXD_FIFO_PAR0 E1000_ICR_TXD_FIFO_PAR0 /* Q0 Tx desc FIFO ++ * parity error */ ++#define E1000_IMS_HOST_ARB_PAR E1000_ICR_HOST_ARB_PAR /* host arb read buffer ++ * parity error */ ++#define E1000_IMS_PB_PAR E1000_ICR_PB_PAR /* packet buffer parity ++ * error */ ++#define E1000_IMS_RXD_FIFO_PAR1 E1000_ICR_RXD_FIFO_PAR1 /* Q1 Rx desc FIFO ++ * parity error */ ++#define E1000_IMS_TXD_FIFO_PAR1 E1000_ICR_TXD_FIFO_PAR1 /* Q1 Tx desc FIFO ++ * parity error */ ++#define E1000_IMS_DSW E1000_ICR_DSW ++#define E1000_IMS_PHYINT E1000_ICR_PHYINT ++#define E1000_IMS_DOUTSYNC E1000_ICR_DOUTSYNC /* NIC DMA out of sync */ ++#define E1000_IMS_EPRST E1000_ICR_EPRST ++ ++/* Interrupt Cause Set */ ++#define E1000_ICS_TXDW E1000_ICR_TXDW /* Tx desc written back */ ++#define E1000_ICS_TXQE E1000_ICR_TXQE /* Transmit Queue empty */ ++#define E1000_ICS_LSC E1000_ICR_LSC /* Link Status Change */ ++#define E1000_ICS_RXSEQ E1000_ICR_RXSEQ /* rx sequence error */ ++#define E1000_ICS_RXDMT0 E1000_ICR_RXDMT0 /* rx desc min. threshold */ ++#define E1000_ICS_RXO E1000_ICR_RXO /* rx overrun */ ++#define E1000_ICS_RXT0 E1000_ICR_RXT0 /* rx timer intr */ ++#define E1000_ICS_MDAC E1000_ICR_MDAC /* MDIO access complete */ ++#define E1000_ICS_RXCFG E1000_ICR_RXCFG /* Rx /c/ ordered set */ ++#define E1000_ICS_GPI_EN0 E1000_ICR_GPI_EN0 /* GP Int 0 */ ++#define E1000_ICS_GPI_EN1 E1000_ICR_GPI_EN1 /* GP Int 1 */ ++#define E1000_ICS_GPI_EN2 E1000_ICR_GPI_EN2 /* GP Int 2 */ ++#define E1000_ICS_GPI_EN3 E1000_ICR_GPI_EN3 /* GP Int 3 */ ++#define E1000_ICS_TXD_LOW E1000_ICR_TXD_LOW ++#define E1000_ICS_SRPD E1000_ICR_SRPD ++#define E1000_ICS_ACK E1000_ICR_ACK /* Receive Ack frame */ ++#define E1000_ICS_MNG E1000_ICR_MNG /* Manageability event */ ++#define E1000_ICS_DOCK E1000_ICR_DOCK /* Dock/Undock */ ++#define E1000_ICS_RXD_FIFO_PAR0 E1000_ICR_RXD_FIFO_PAR0 /* Q0 Rx desc FIFO ++ * parity error */ ++#define E1000_ICS_TXD_FIFO_PAR0 E1000_ICR_TXD_FIFO_PAR0 /* Q0 Tx desc FIFO ++ * parity error */ ++#define E1000_ICS_HOST_ARB_PAR E1000_ICR_HOST_ARB_PAR /* host arb read buffer ++ * parity error */ ++#define E1000_ICS_PB_PAR E1000_ICR_PB_PAR /* packet buffer parity ++ * error */ ++#define E1000_ICS_RXD_FIFO_PAR1 E1000_ICR_RXD_FIFO_PAR1 /* Q1 Rx desc FIFO ++ * parity error */ ++#define E1000_ICS_TXD_FIFO_PAR1 E1000_ICR_TXD_FIFO_PAR1 /* Q1 Tx desc FIFO ++ * parity error */ ++#define E1000_ICS_DSW E1000_ICR_DSW ++#define E1000_ICS_DOUTSYNC E1000_ICR_DOUTSYNC /* NIC DMA out of sync */ ++#define E1000_ICS_PHYINT E1000_ICR_PHYINT ++#define E1000_ICS_EPRST E1000_ICR_EPRST ++ ++/* Transmit Descriptor Control */ ++#define E1000_TXDCTL_PTHRESH 0x0000003F /* TXDCTL Prefetch Threshold */ ++#define E1000_TXDCTL_HTHRESH 0x00003F00 /* TXDCTL Host Threshold */ ++#define E1000_TXDCTL_WTHRESH 0x003F0000 /* TXDCTL Writeback Threshold */ ++#define E1000_TXDCTL_GRAN 0x01000000 /* TXDCTL Granularity */ ++#define E1000_TXDCTL_LWTHRESH 0xFE000000 /* TXDCTL Low Threshold */ ++#define E1000_TXDCTL_FULL_TX_DESC_WB 0x01010000 /* GRAN=1, WTHRESH=1 */ ++#define E1000_TXDCTL_MAX_TX_DESC_PREFETCH 0x0100001F /* GRAN=1, PTHRESH=31 */ ++/* Enable the counting of descriptors still to be processed. */ ++#define E1000_TXDCTL_COUNT_DESC 0x00400000 ++ ++/* Flow Control Constants */ ++#define FLOW_CONTROL_ADDRESS_LOW 0x00C28001 ++#define FLOW_CONTROL_ADDRESS_HIGH 0x00000100 ++#define FLOW_CONTROL_TYPE 0x8808 ++ ++/* 802.1q VLAN Packet Size */ ++#define VLAN_TAG_SIZE 4 /* 802.3ac tag (not DMA'd) */ ++#define E1000_VLAN_FILTER_TBL_SIZE 128 /* VLAN Filter Table (4096 bits) */ ++ ++/* Receive Address */ ++/* ++ * Number of high/low register pairs in the RAR. The RAR (Receive Address ++ * Registers) holds the directed and multicast addresses that we monitor. ++ * Technically, we have 16 spots. However, we reserve one of these spots ++ * (RAR[15]) for our directed address used by controllers with ++ * manageability enabled, allowing us room for 15 multicast addresses. ++ */ ++#define E1000_RAR_ENTRIES 15 ++#define E1000_RAH_AV 0x80000000 /* Receive descriptor valid */ ++#define E1000_RAL_MAC_ADDR_LEN 4 ++#define E1000_RAH_MAC_ADDR_LEN 2 ++#define E1000_RAH_POOL_MASK 0x03FC0000 ++#define E1000_RAH_POOL_1 0x00040000 ++ ++/* Error Codes */ ++#define E1000_SUCCESS 0 ++#define E1000_ERR_NVM 1 ++#define E1000_ERR_PHY 2 ++#define E1000_ERR_CONFIG 3 ++#define E1000_ERR_PARAM 4 ++#define E1000_ERR_MAC_INIT 5 ++#define E1000_ERR_PHY_TYPE 6 ++#define E1000_ERR_RESET 9 ++#define E1000_ERR_MASTER_REQUESTS_PENDING 10 ++#define E1000_ERR_HOST_INTERFACE_COMMAND 11 ++#define E1000_BLK_PHY_RESET 12 ++#define E1000_ERR_SWFW_SYNC 13 ++#define E1000_NOT_IMPLEMENTED 14 ++#define E1000_ERR_MBX 15 ++ ++/* Loop limit on how long we wait for auto-negotiation to complete */ ++#define FIBER_LINK_UP_LIMIT 50 ++#define COPPER_LINK_UP_LIMIT 10 ++#define PHY_AUTO_NEG_LIMIT 45 ++#define PHY_FORCE_LIMIT 20 ++/* Number of 100 microseconds we wait for PCI Express master disable */ ++#define MASTER_DISABLE_TIMEOUT 800 ++/* Number of milliseconds we wait for PHY configuration done after MAC reset */ ++#define PHY_CFG_TIMEOUT 100 ++/* Number of 2 milliseconds we wait for acquiring MDIO ownership. */ ++#define MDIO_OWNERSHIP_TIMEOUT 10 ++/* Number of milliseconds for NVM auto read done after MAC reset. */ ++#define AUTO_READ_DONE_TIMEOUT 10 ++ ++/* Flow Control */ ++#define E1000_FCRTH_RTH 0x0000FFF8 /* Mask Bits[15:3] for RTH */ ++#define E1000_FCRTH_XFCE 0x80000000 /* External Flow Control Enable */ ++#define E1000_FCRTL_RTL 0x0000FFF8 /* Mask Bits[15:3] for RTL */ ++#define E1000_FCRTL_XONE 0x80000000 /* Enable XON frame transmission */ ++ ++/* Transmit Configuration Word */ ++#define E1000_TXCW_FD 0x00000020 /* TXCW full duplex */ ++#define E1000_TXCW_HD 0x00000040 /* TXCW half duplex */ ++#define E1000_TXCW_PAUSE 0x00000080 /* TXCW sym pause request */ ++#define E1000_TXCW_ASM_DIR 0x00000100 /* TXCW astm pause direction */ ++#define E1000_TXCW_PAUSE_MASK 0x00000180 /* TXCW pause request mask */ ++#define E1000_TXCW_RF 0x00003000 /* TXCW remote fault */ ++#define E1000_TXCW_NP 0x00008000 /* TXCW next page */ ++#define E1000_TXCW_CW 0x0000ffff /* TxConfigWord mask */ ++#define E1000_TXCW_TXC 0x40000000 /* Transmit Config control */ ++#define E1000_TXCW_ANE 0x80000000 /* Auto-neg enable */ ++ ++/* Receive Configuration Word */ ++#define E1000_RXCW_CW 0x0000ffff /* RxConfigWord mask */ ++#define E1000_RXCW_NC 0x04000000 /* Receive config no carrier */ ++#define E1000_RXCW_IV 0x08000000 /* Receive config invalid */ ++#define E1000_RXCW_CC 0x10000000 /* Receive config change */ ++#define E1000_RXCW_C 0x20000000 /* Receive config */ ++#define E1000_RXCW_SYNCH 0x40000000 /* Receive config synch */ ++#define E1000_RXCW_ANC 0x80000000 /* Auto-neg complete */ ++ ++/* PCI Express Control */ ++#define E1000_GCR_RXD_NO_SNOOP 0x00000001 ++#define E1000_GCR_RXDSCW_NO_SNOOP 0x00000002 ++#define E1000_GCR_RXDSCR_NO_SNOOP 0x00000004 ++#define E1000_GCR_TXD_NO_SNOOP 0x00000008 ++#define E1000_GCR_TXDSCW_NO_SNOOP 0x00000010 ++#define E1000_GCR_TXDSCR_NO_SNOOP 0x00000020 ++ ++#define PCIE_NO_SNOOP_ALL (E1000_GCR_RXD_NO_SNOOP | \ ++ E1000_GCR_RXDSCW_NO_SNOOP | \ ++ E1000_GCR_RXDSCR_NO_SNOOP | \ ++ E1000_GCR_TXD_NO_SNOOP | \ ++ E1000_GCR_TXDSCW_NO_SNOOP | \ ++ E1000_GCR_TXDSCR_NO_SNOOP) ++ ++/* PHY Control Register */ ++#define MII_CR_SPEED_SELECT_MSB 0x0040 /* bits 6,13: 10=1000, 01=100, 00=10 */ ++#define MII_CR_COLL_TEST_ENABLE 0x0080 /* Collision test enable */ ++#define MII_CR_FULL_DUPLEX 0x0100 /* FDX =1, half duplex =0 */ ++#define MII_CR_RESTART_AUTO_NEG 0x0200 /* Restart auto negotiation */ ++#define MII_CR_ISOLATE 0x0400 /* Isolate PHY from MII */ ++#define MII_CR_POWER_DOWN 0x0800 /* Power down */ ++#define MII_CR_AUTO_NEG_EN 0x1000 /* Auto Neg Enable */ ++#define MII_CR_SPEED_SELECT_LSB 0x2000 /* bits 6,13: 10=1000, 01=100, 00=10 */ ++#define MII_CR_LOOPBACK 0x4000 /* 0 = normal, 1 = loopback */ ++#define MII_CR_RESET 0x8000 /* 0 = normal, 1 = PHY reset */ ++#define MII_CR_SPEED_1000 0x0040 ++#define MII_CR_SPEED_100 0x2000 ++#define MII_CR_SPEED_10 0x0000 ++ ++/* PHY Status Register */ ++#define MII_SR_EXTENDED_CAPS 0x0001 /* Extended register capabilities */ ++#define MII_SR_JABBER_DETECT 0x0002 /* Jabber Detected */ ++#define MII_SR_LINK_STATUS 0x0004 /* Link Status 1 = link */ ++#define MII_SR_AUTONEG_CAPS 0x0008 /* Auto Neg Capable */ ++#define MII_SR_REMOTE_FAULT 0x0010 /* Remote Fault Detect */ ++#define MII_SR_AUTONEG_COMPLETE 0x0020 /* Auto Neg Complete */ ++#define MII_SR_PREAMBLE_SUPPRESS 0x0040 /* Preamble may be suppressed */ ++#define MII_SR_EXTENDED_STATUS 0x0100 /* Ext. status info in Reg 0x0F */ ++#define MII_SR_100T2_HD_CAPS 0x0200 /* 100T2 Half Duplex Capable */ ++#define MII_SR_100T2_FD_CAPS 0x0400 /* 100T2 Full Duplex Capable */ ++#define MII_SR_10T_HD_CAPS 0x0800 /* 10T Half Duplex Capable */ ++#define MII_SR_10T_FD_CAPS 0x1000 /* 10T Full Duplex Capable */ ++#define MII_SR_100X_HD_CAPS 0x2000 /* 100X Half Duplex Capable */ ++#define MII_SR_100X_FD_CAPS 0x4000 /* 100X Full Duplex Capable */ ++#define MII_SR_100T4_CAPS 0x8000 /* 100T4 Capable */ ++ ++/* Autoneg Advertisement Register */ ++#define NWAY_AR_SELECTOR_FIELD 0x0001 /* indicates IEEE 802.3 CSMA/CD */ ++#define NWAY_AR_10T_HD_CAPS 0x0020 /* 10T Half Duplex Capable */ ++#define NWAY_AR_10T_FD_CAPS 0x0040 /* 10T Full Duplex Capable */ ++#define NWAY_AR_100TX_HD_CAPS 0x0080 /* 100TX Half Duplex Capable */ ++#define NWAY_AR_100TX_FD_CAPS 0x0100 /* 100TX Full Duplex Capable */ ++#define NWAY_AR_100T4_CAPS 0x0200 /* 100T4 Capable */ ++#define NWAY_AR_PAUSE 0x0400 /* Pause operation desired */ ++#define NWAY_AR_ASM_DIR 0x0800 /* Asymmetric Pause Direction bit */ ++#define NWAY_AR_REMOTE_FAULT 0x2000 /* Remote Fault detected */ ++#define NWAY_AR_NEXT_PAGE 0x8000 /* Next Page ability supported */ ++ ++/* Link Partner Ability Register (Base Page) */ ++#define NWAY_LPAR_SELECTOR_FIELD 0x0000 /* LP protocol selector field */ ++#define NWAY_LPAR_10T_HD_CAPS 0x0020 /* LP is 10T Half Duplex Capable */ ++#define NWAY_LPAR_10T_FD_CAPS 0x0040 /* LP is 10T Full Duplex Capable */ ++#define NWAY_LPAR_100TX_HD_CAPS 0x0080 /* LP is 100TX Half Duplex Capable */ ++#define NWAY_LPAR_100TX_FD_CAPS 0x0100 /* LP is 100TX Full Duplex Capable */ ++#define NWAY_LPAR_100T4_CAPS 0x0200 /* LP is 100T4 Capable */ ++#define NWAY_LPAR_PAUSE 0x0400 /* LP Pause operation desired */ ++#define NWAY_LPAR_ASM_DIR 0x0800 /* LP Asymmetric Pause Direction bit */ ++#define NWAY_LPAR_REMOTE_FAULT 0x2000 /* LP has detected Remote Fault */ ++#define NWAY_LPAR_ACKNOWLEDGE 0x4000 /* LP has rx'd link code word */ ++#define NWAY_LPAR_NEXT_PAGE 0x8000 /* Next Page ability supported */ ++ ++/* Autoneg Expansion Register */ ++#define NWAY_ER_LP_NWAY_CAPS 0x0001 /* LP has Auto Neg Capability */ ++#define NWAY_ER_PAGE_RXD 0x0002 /* LP is 10T Half Duplex Capable */ ++#define NWAY_ER_NEXT_PAGE_CAPS 0x0004 /* LP is 10T Full Duplex Capable */ ++#define NWAY_ER_LP_NEXT_PAGE_CAPS 0x0008 /* LP is 100TX Half Duplex Capable */ ++#define NWAY_ER_PAR_DETECT_FAULT 0x0010 /* LP is 100TX Full Duplex Capable */ ++ ++/* 1000BASE-T Control Register */ ++#define CR_1000T_ASYM_PAUSE 0x0080 /* Advertise asymmetric pause bit */ ++#define CR_1000T_HD_CAPS 0x0100 /* Advertise 1000T HD capability */ ++#define CR_1000T_FD_CAPS 0x0200 /* Advertise 1000T FD capability */ ++#define CR_1000T_REPEATER_DTE 0x0400 /* 1=Repeater/switch device port */ ++ /* 0=DTE device */ ++#define CR_1000T_MS_VALUE 0x0800 /* 1=Configure PHY as Master */ ++ /* 0=Configure PHY as Slave */ ++#define CR_1000T_MS_ENABLE 0x1000 /* 1=Master/Slave manual config value */ ++ /* 0=Automatic Master/Slave config */ ++#define CR_1000T_TEST_MODE_NORMAL 0x0000 /* Normal Operation */ ++#define CR_1000T_TEST_MODE_1 0x2000 /* Transmit Waveform test */ ++#define CR_1000T_TEST_MODE_2 0x4000 /* Master Transmit Jitter test */ ++#define CR_1000T_TEST_MODE_3 0x6000 /* Slave Transmit Jitter test */ ++#define CR_1000T_TEST_MODE_4 0x8000 /* Transmitter Distortion test */ ++ ++/* 1000BASE-T Status Register */ ++#define SR_1000T_IDLE_ERROR_CNT 0x00FF /* Num idle errors since last read */ ++#define SR_1000T_ASYM_PAUSE_DIR 0x0100 /* LP asymmetric pause direction bit */ ++#define SR_1000T_LP_HD_CAPS 0x0400 /* LP is 1000T HD capable */ ++#define SR_1000T_LP_FD_CAPS 0x0800 /* LP is 1000T FD capable */ ++#define SR_1000T_REMOTE_RX_STATUS 0x1000 /* Remote receiver OK */ ++#define SR_1000T_LOCAL_RX_STATUS 0x2000 /* Local receiver OK */ ++#define SR_1000T_MS_CONFIG_RES 0x4000 /* 1=Local Tx is Master, 0=Slave */ ++#define SR_1000T_MS_CONFIG_FAULT 0x8000 /* Master/Slave config fault */ ++ ++#define SR_1000T_PHY_EXCESSIVE_IDLE_ERR_COUNT 5 ++ ++/* PHY 1000 MII Register/Bit Definitions */ ++/* PHY Registers defined by IEEE */ ++#define PHY_CONTROL 0x00 /* Control Register */ ++#define PHY_STATUS 0x01 /* Status Register */ ++#define PHY_ID1 0x02 /* Phy Id Reg (word 1) */ ++#define PHY_ID2 0x03 /* Phy Id Reg (word 2) */ ++#define PHY_AUTONEG_ADV 0x04 /* Autoneg Advertisement */ ++#define PHY_LP_ABILITY 0x05 /* Link Partner Ability (Base Page) */ ++#define PHY_AUTONEG_EXP 0x06 /* Autoneg Expansion Reg */ ++#define PHY_NEXT_PAGE_TX 0x07 /* Next Page Tx */ ++#define PHY_LP_NEXT_PAGE 0x08 /* Link Partner Next Page */ ++#define PHY_1000T_CTRL 0x09 /* 1000Base-T Control Reg */ ++#define PHY_1000T_STATUS 0x0A /* 1000Base-T Status Reg */ ++#define PHY_EXT_STATUS 0x0F /* Extended Status Reg */ ++ ++/* NVM Control */ ++#define E1000_EECD_SK 0x00000001 /* NVM Clock */ ++#define E1000_EECD_CS 0x00000002 /* NVM Chip Select */ ++#define E1000_EECD_DI 0x00000004 /* NVM Data In */ ++#define E1000_EECD_DO 0x00000008 /* NVM Data Out */ ++#define E1000_EECD_FWE_MASK 0x00000030 ++#define E1000_EECD_FWE_DIS 0x00000010 /* Disable FLASH writes */ ++#define E1000_EECD_FWE_EN 0x00000020 /* Enable FLASH writes */ ++#define E1000_EECD_FWE_SHIFT 4 ++#define E1000_EECD_REQ 0x00000040 /* NVM Access Request */ ++#define E1000_EECD_GNT 0x00000080 /* NVM Access Grant */ ++#define E1000_EECD_PRES 0x00000100 /* NVM Present */ ++#define E1000_EECD_SIZE 0x00000200 /* NVM Size (0=64 word 1=256 word) */ ++/* NVM Addressing bits based on type 0=small, 1=large */ ++#define E1000_EECD_ADDR_BITS 0x00000400 ++#define E1000_EECD_TYPE 0x00002000 /* NVM Type (1-SPI, 0-Microwire) */ ++#define E1000_NVM_GRANT_ATTEMPTS 1000 /* NVM # attempts to gain grant */ ++#define E1000_EECD_AUTO_RD 0x00000200 /* NVM Auto Read done */ ++#define E1000_EECD_SIZE_EX_MASK 0x00007800 /* NVM Size */ ++#define E1000_EECD_SIZE_EX_SHIFT 11 ++#define E1000_EECD_NVADDS 0x00018000 /* NVM Address Size */ ++#define E1000_EECD_SELSHAD 0x00020000 /* Select Shadow RAM */ ++#define E1000_EECD_INITSRAM 0x00040000 /* Initialize Shadow RAM */ ++#define E1000_EECD_FLUPD 0x00080000 /* Update FLASH */ ++#define E1000_EECD_AUPDEN 0x00100000 /* Enable Autonomous FLASH update */ ++#define E1000_EECD_SHADV 0x00200000 /* Shadow RAM Data Valid */ ++#define E1000_EECD_SEC1VAL 0x00400000 /* Sector One Valid */ ++#define E1000_EECD_SECVAL_SHIFT 22 ++#define E1000_EECD_SEC1VAL_VALID_MASK (E1000_EECD_AUTO_RD | E1000_EECD_PRES) ++ ++#define E1000_NVM_SWDPIN0 0x0001 /* SWDPIN 0 NVM Value */ ++#define E1000_NVM_LED_LOGIC 0x0020 /* Led Logic Word */ ++#define E1000_NVM_RW_REG_DATA 16 /* Offset to data in NVM read/write regs */ ++#define E1000_NVM_RW_REG_DONE 2 /* Offset to READ/WRITE done bit */ ++#define E1000_NVM_RW_REG_START 1 /* Start operation */ ++#define E1000_NVM_RW_ADDR_SHIFT 2 /* Shift to the address bits */ ++#define E1000_NVM_POLL_WRITE 1 /* Flag for polling for write complete */ ++#define E1000_NVM_POLL_READ 0 /* Flag for polling for read complete */ ++#define E1000_FLASH_UPDATES 2000 ++ ++/* NVM Word Offsets */ ++#define NVM_COMPAT 0x0003 ++#define NVM_ID_LED_SETTINGS 0x0004 ++#define NVM_VERSION 0x0005 ++#define NVM_SERDES_AMPLITUDE 0x0006 /* SERDES output amplitude */ ++#define NVM_PHY_CLASS_WORD 0x0007 ++#define NVM_INIT_CONTROL1_REG 0x000A ++#define NVM_INIT_CONTROL2_REG 0x000F ++#define NVM_SWDEF_PINS_CTRL_PORT_1 0x0010 ++#define NVM_INIT_CONTROL3_PORT_B 0x0014 ++#define NVM_INIT_3GIO_3 0x001A ++#define NVM_SWDEF_PINS_CTRL_PORT_0 0x0020 ++#define NVM_INIT_CONTROL3_PORT_A 0x0024 ++#define NVM_CFG 0x0012 ++#define NVM_FLASH_VERSION 0x0032 ++#define NVM_ALT_MAC_ADDR_PTR 0x0037 ++#define NVM_CHECKSUM_REG 0x003F ++ ++#define E1000_NVM_CFG_DONE_PORT_0 0x40000 /* MNG config cycle done */ ++#define E1000_NVM_CFG_DONE_PORT_1 0x80000 /* ...for second port */ ++ ++/* Mask bits for fields in Word 0x0f of the NVM */ ++#define NVM_WORD0F_PAUSE_MASK 0x3000 ++#define NVM_WORD0F_PAUSE 0x1000 ++#define NVM_WORD0F_ASM_DIR 0x2000 ++#define NVM_WORD0F_ANE 0x0800 ++#define NVM_WORD0F_SWPDIO_EXT_MASK 0x00F0 ++#define NVM_WORD0F_LPLU 0x0001 ++ ++/* Mask bits for fields in Word 0x1a of the NVM */ ++#define NVM_WORD1A_ASPM_MASK 0x000C ++ ++/* For checksumming, the sum of all words in the NVM should equal 0xBABA. */ ++#define NVM_SUM 0xBABA ++ ++#define NVM_MAC_ADDR_OFFSET 0 ++#define NVM_PBA_OFFSET_0 8 ++#define NVM_PBA_OFFSET_1 9 ++#define NVM_RESERVED_WORD 0xFFFF ++#define NVM_PHY_CLASS_A 0x8000 ++#define NVM_SERDES_AMPLITUDE_MASK 0x000F ++#define NVM_SIZE_MASK 0x1C00 ++#define NVM_SIZE_SHIFT 10 ++#define NVM_WORD_SIZE_BASE_SHIFT 6 ++#define NVM_SWDPIO_EXT_SHIFT 4 ++ ++/* NVM Commands - Microwire */ ++#define NVM_READ_OPCODE_MICROWIRE 0x6 /* NVM read opcode */ ++#define NVM_WRITE_OPCODE_MICROWIRE 0x5 /* NVM write opcode */ ++#define NVM_ERASE_OPCODE_MICROWIRE 0x7 /* NVM erase opcode */ ++#define NVM_EWEN_OPCODE_MICROWIRE 0x13 /* NVM erase/write enable */ ++#define NVM_EWDS_OPCODE_MICROWIRE 0x10 /* NVM erase/write disable */ ++ ++/* NVM Commands - SPI */ ++#define NVM_MAX_RETRY_SPI 5000 /* Max wait of 5ms, for RDY signal */ ++#define NVM_READ_OPCODE_SPI 0x03 /* NVM read opcode */ ++#define NVM_WRITE_OPCODE_SPI 0x02 /* NVM write opcode */ ++#define NVM_A8_OPCODE_SPI 0x08 /* opcode bit-3 = address bit-8 */ ++#define NVM_WREN_OPCODE_SPI 0x06 /* NVM set Write Enable latch */ ++#define NVM_WRDI_OPCODE_SPI 0x04 /* NVM reset Write Enable latch */ ++#define NVM_RDSR_OPCODE_SPI 0x05 /* NVM read Status register */ ++#define NVM_WRSR_OPCODE_SPI 0x01 /* NVM write Status register */ ++ ++/* SPI NVM Status Register */ ++#define NVM_STATUS_RDY_SPI 0x01 ++#define NVM_STATUS_WEN_SPI 0x02 ++#define NVM_STATUS_BP0_SPI 0x04 ++#define NVM_STATUS_BP1_SPI 0x08 ++#define NVM_STATUS_WPEN_SPI 0x80 ++ ++/* Word definitions for ID LED Settings */ ++#define ID_LED_RESERVED_0000 0x0000 ++#define ID_LED_RESERVED_FFFF 0xFFFF ++#define ID_LED_DEFAULT ((ID_LED_OFF1_ON2 << 12) | \ ++ (ID_LED_OFF1_OFF2 << 8) | \ ++ (ID_LED_DEF1_DEF2 << 4) | \ ++ (ID_LED_DEF1_DEF2)) ++#define ID_LED_DEF1_DEF2 0x1 ++#define ID_LED_DEF1_ON2 0x2 ++#define ID_LED_DEF1_OFF2 0x3 ++#define ID_LED_ON1_DEF2 0x4 ++#define ID_LED_ON1_ON2 0x5 ++#define ID_LED_ON1_OFF2 0x6 ++#define ID_LED_OFF1_DEF2 0x7 ++#define ID_LED_OFF1_ON2 0x8 ++#define ID_LED_OFF1_OFF2 0x9 ++ ++#define IGP_ACTIVITY_LED_MASK 0xFFFFF0FF ++#define IGP_ACTIVITY_LED_ENABLE 0x0300 ++#define IGP_LED3_MODE 0x07000000 ++ ++/* PCI/PCI-X/PCI-EX Config space */ ++#define PCIX_COMMAND_REGISTER 0xE6 ++#define PCIX_STATUS_REGISTER_LO 0xE8 ++#define PCIX_STATUS_REGISTER_HI 0xEA ++#define PCI_HEADER_TYPE_REGISTER 0x0E ++#define PCIE_LINK_STATUS 0x12 ++ ++#define PCIX_COMMAND_MMRBC_MASK 0x000C ++#define PCIX_COMMAND_MMRBC_SHIFT 0x2 ++#define PCIX_STATUS_HI_MMRBC_MASK 0x0060 ++#define PCIX_STATUS_HI_MMRBC_SHIFT 0x5 ++#define PCIX_STATUS_HI_MMRBC_4K 0x3 ++#define PCIX_STATUS_HI_MMRBC_2K 0x2 ++#define PCIX_STATUS_LO_FUNC_MASK 0x7 ++#define PCI_HEADER_TYPE_MULTIFUNC 0x80 ++#define PCIE_LINK_WIDTH_MASK 0x3F0 ++#define PCIE_LINK_WIDTH_SHIFT 4 ++ ++#ifndef ETH_ADDR_LEN ++#define ETH_ADDR_LEN 6 ++#endif ++ ++#define PHY_REVISION_MASK 0xFFFFFFF0 ++#define MAX_PHY_REG_ADDRESS 0x1F /* 5 bit address bus (0-0x1F) */ ++#define MAX_PHY_MULTI_PAGE_REG 0xF ++ ++/* Bit definitions for valid PHY IDs. */ ++/* ++ * I = Integrated ++ * E = External ++ */ ++#define M88E1000_E_PHY_ID 0x01410C50 ++#define M88E1000_I_PHY_ID 0x01410C30 ++#define M88E1011_I_PHY_ID 0x01410C20 ++#define IGP01E1000_I_PHY_ID 0x02A80380 ++#define M88E1011_I_REV_4 0x04 ++#define M88E1111_I_PHY_ID 0x01410CC0 ++#define GG82563_E_PHY_ID 0x01410CA0 ++#define IGP03E1000_E_PHY_ID 0x02A80390 ++#define IFE_E_PHY_ID 0x02A80330 ++#define IFE_PLUS_E_PHY_ID 0x02A80320 ++#define IFE_C_E_PHY_ID 0x02A80310 ++#define M88_VENDOR 0x0141 ++ ++/* M88E1000 Specific Registers */ ++#define M88E1000_PHY_SPEC_CTRL 0x10 /* PHY Specific Control Register */ ++#define M88E1000_PHY_SPEC_STATUS 0x11 /* PHY Specific Status Register */ ++#define M88E1000_INT_ENABLE 0x12 /* Interrupt Enable Register */ ++#define M88E1000_INT_STATUS 0x13 /* Interrupt Status Register */ ++#define M88E1000_EXT_PHY_SPEC_CTRL 0x14 /* Extended PHY Specific Control */ ++#define M88E1000_RX_ERR_CNTR 0x15 /* Receive Error Counter */ ++ ++#define M88E1000_PHY_EXT_CTRL 0x1A /* PHY extend control register */ ++#define M88E1000_PHY_PAGE_SELECT 0x1D /* Reg 29 for page number setting */ ++#define M88E1000_PHY_GEN_CONTROL 0x1E /* Its meaning depends on reg 29 */ ++#define M88E1000_PHY_VCO_REG_BIT8 0x100 /* Bits 8 & 11 are adjusted for */ ++#define M88E1000_PHY_VCO_REG_BIT11 0x800 /* improved BER performance */ ++ ++/* M88E1000 PHY Specific Control Register */ ++#define M88E1000_PSCR_JABBER_DISABLE 0x0001 /* 1=Jabber Function disabled */ ++#define M88E1000_PSCR_POLARITY_REVERSAL 0x0002 /* 1=Polarity Reverse enabled */ ++#define M88E1000_PSCR_SQE_TEST 0x0004 /* 1=SQE Test enabled */ ++/* 1=CLK125 low, 0=CLK125 toggling */ ++#define M88E1000_PSCR_CLK125_DISABLE 0x0010 ++#define M88E1000_PSCR_MDI_MANUAL_MODE 0x0000 /* MDI Crossover Mode bits 6:5 */ ++ /* Manual MDI configuration */ ++#define M88E1000_PSCR_MDIX_MANUAL_MODE 0x0020 /* Manual MDIX configuration */ ++/* 1000BASE-T: Auto crossover, 100BASE-TX/10BASE-T: MDI Mode */ ++#define M88E1000_PSCR_AUTO_X_1000T 0x0040 ++/* Auto crossover enabled all speeds */ ++#define M88E1000_PSCR_AUTO_X_MODE 0x0060 ++/* ++ * 1=Enable Extended 10BASE-T distance (Lower 10BASE-T Rx Threshold ++ * 0=Normal 10BASE-T Rx Threshold ++ */ ++#define M88E1000_PSCR_EN_10BT_EXT_DIST 0x0080 ++/* 1=5-bit interface in 100BASE-TX, 0=MII interface in 100BASE-TX */ ++#define M88E1000_PSCR_MII_5BIT_ENABLE 0x0100 ++#define M88E1000_PSCR_SCRAMBLER_DISABLE 0x0200 /* 1=Scrambler disable */ ++#define M88E1000_PSCR_FORCE_LINK_GOOD 0x0400 /* 1=Force link good */ ++#define M88E1000_PSCR_ASSERT_CRS_ON_TX 0x0800 /* 1=Assert CRS on Tx */ ++ ++/* M88E1000 PHY Specific Status Register */ ++#define M88E1000_PSSR_JABBER 0x0001 /* 1=Jabber */ ++#define M88E1000_PSSR_REV_POLARITY 0x0002 /* 1=Polarity reversed */ ++#define M88E1000_PSSR_DOWNSHIFT 0x0020 /* 1=Downshifted */ ++#define M88E1000_PSSR_MDIX 0x0040 /* 1=MDIX; 0=MDI */ ++/* ++ * 0 = <50M ++ * 1 = 50-80M ++ * 2 = 80-110M ++ * 3 = 110-140M ++ * 4 = >140M ++ */ ++#define M88E1000_PSSR_CABLE_LENGTH 0x0380 ++#define M88E1000_PSSR_LINK 0x0400 /* 1=Link up, 0=Link down */ ++#define M88E1000_PSSR_SPD_DPLX_RESOLVED 0x0800 /* 1=Speed & Duplex resolved */ ++#define M88E1000_PSSR_PAGE_RCVD 0x1000 /* 1=Page received */ ++#define M88E1000_PSSR_DPLX 0x2000 /* 1=Duplex 0=Half Duplex */ ++#define M88E1000_PSSR_SPEED 0xC000 /* Speed, bits 14:15 */ ++#define M88E1000_PSSR_10MBS 0x0000 /* 00=10Mbs */ ++#define M88E1000_PSSR_100MBS 0x4000 /* 01=100Mbs */ ++#define M88E1000_PSSR_1000MBS 0x8000 /* 10=1000Mbs */ ++ ++#define M88E1000_PSSR_CABLE_LENGTH_SHIFT 7 ++ ++/* M88E1000 Extended PHY Specific Control Register */ ++#define M88E1000_EPSCR_FIBER_LOOPBACK 0x4000 /* 1=Fiber loopback */ ++/* ++ * 1 = Lost lock detect enabled. ++ * Will assert lost lock and bring ++ * link down if idle not seen ++ * within 1ms in 1000BASE-T ++ */ ++#define M88E1000_EPSCR_DOWN_NO_IDLE 0x8000 ++/* ++ * Number of times we will attempt to autonegotiate before downshifting if we ++ * are the master ++ */ ++#define M88E1000_EPSCR_MASTER_DOWNSHIFT_MASK 0x0C00 ++#define M88E1000_EPSCR_MASTER_DOWNSHIFT_1X 0x0000 ++#define M88E1000_EPSCR_MASTER_DOWNSHIFT_2X 0x0400 ++#define M88E1000_EPSCR_MASTER_DOWNSHIFT_3X 0x0800 ++#define M88E1000_EPSCR_MASTER_DOWNSHIFT_4X 0x0C00 ++/* ++ * Number of times we will attempt to autonegotiate before downshifting if we ++ * are the slave ++ */ ++#define M88E1000_EPSCR_SLAVE_DOWNSHIFT_MASK 0x0300 ++#define M88E1000_EPSCR_SLAVE_DOWNSHIFT_DIS 0x0000 ++#define M88E1000_EPSCR_SLAVE_DOWNSHIFT_1X 0x0100 ++#define M88E1000_EPSCR_SLAVE_DOWNSHIFT_2X 0x0200 ++#define M88E1000_EPSCR_SLAVE_DOWNSHIFT_3X 0x0300 ++#define M88E1000_EPSCR_TX_CLK_2_5 0x0060 /* 2.5 MHz TX_CLK */ ++#define M88E1000_EPSCR_TX_CLK_25 0x0070 /* 25 MHz TX_CLK */ ++#define M88E1000_EPSCR_TX_CLK_0 0x0000 /* NO TX_CLK */ ++ ++/* M88EC018 Rev 2 specific DownShift settings */ ++#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_MASK 0x0E00 ++#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_1X 0x0000 ++#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_2X 0x0200 ++#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_3X 0x0400 ++#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_4X 0x0600 ++#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_5X 0x0800 ++#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_6X 0x0A00 ++#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_7X 0x0C00 ++#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_8X 0x0E00 ++ ++/* ++ * Bits... ++ * 15-5: page ++ * 4-0: register offset ++ */ ++#define GG82563_PAGE_SHIFT 5 ++#define GG82563_REG(page, reg) \ ++ (((page) << GG82563_PAGE_SHIFT) | ((reg) & MAX_PHY_REG_ADDRESS)) ++#define GG82563_MIN_ALT_REG 30 ++ ++/* GG82563 Specific Registers */ ++#define GG82563_PHY_SPEC_CTRL \ ++ GG82563_REG(0, 16) /* PHY Specific Control */ ++#define GG82563_PHY_SPEC_STATUS \ ++ GG82563_REG(0, 17) /* PHY Specific Status */ ++#define GG82563_PHY_INT_ENABLE \ ++ GG82563_REG(0, 18) /* Interrupt Enable */ ++#define GG82563_PHY_SPEC_STATUS_2 \ ++ GG82563_REG(0, 19) /* PHY Specific Status 2 */ ++#define GG82563_PHY_RX_ERR_CNTR \ ++ GG82563_REG(0, 21) /* Receive Error Counter */ ++#define GG82563_PHY_PAGE_SELECT \ ++ GG82563_REG(0, 22) /* Page Select */ ++#define GG82563_PHY_SPEC_CTRL_2 \ ++ GG82563_REG(0, 26) /* PHY Specific Control 2 */ ++#define GG82563_PHY_PAGE_SELECT_ALT \ ++ GG82563_REG(0, 29) /* Alternate Page Select */ ++#define GG82563_PHY_TEST_CLK_CTRL \ ++ GG82563_REG(0, 30) /* Test Clock Control (use reg. 29 to select) */ ++ ++#define GG82563_PHY_MAC_SPEC_CTRL \ ++ GG82563_REG(2, 21) /* MAC Specific Control Register */ ++#define GG82563_PHY_MAC_SPEC_CTRL_2 \ ++ GG82563_REG(2, 26) /* MAC Specific Control 2 */ ++ ++#define GG82563_PHY_DSP_DISTANCE \ ++ GG82563_REG(5, 26) /* DSP Distance */ ++ ++/* Page 193 - Port Control Registers */ ++#define GG82563_PHY_KMRN_MODE_CTRL \ ++ GG82563_REG(193, 16) /* Kumeran Mode Control */ ++#define GG82563_PHY_PORT_RESET \ ++ GG82563_REG(193, 17) /* Port Reset */ ++#define GG82563_PHY_REVISION_ID \ ++ GG82563_REG(193, 18) /* Revision ID */ ++#define GG82563_PHY_DEVICE_ID \ ++ GG82563_REG(193, 19) /* Device ID */ ++#define GG82563_PHY_PWR_MGMT_CTRL \ ++ GG82563_REG(193, 20) /* Power Management Control */ ++#define GG82563_PHY_RATE_ADAPT_CTRL \ ++ GG82563_REG(193, 25) /* Rate Adaptation Control */ ++ ++/* Page 194 - KMRN Registers */ ++#define GG82563_PHY_KMRN_FIFO_CTRL_STAT \ ++ GG82563_REG(194, 16) /* FIFO's Control/Status */ ++#define GG82563_PHY_KMRN_CTRL \ ++ GG82563_REG(194, 17) /* Control */ ++#define GG82563_PHY_INBAND_CTRL \ ++ GG82563_REG(194, 18) /* Inband Control */ ++#define GG82563_PHY_KMRN_DIAGNOSTIC \ ++ GG82563_REG(194, 19) /* Diagnostic */ ++#define GG82563_PHY_ACK_TIMEOUTS \ ++ GG82563_REG(194, 20) /* Acknowledge Timeouts */ ++#define GG82563_PHY_ADV_ABILITY \ ++ GG82563_REG(194, 21) /* Advertised Ability */ ++#define GG82563_PHY_LINK_PARTNER_ADV_ABILITY \ ++ GG82563_REG(194, 23) /* Link Partner Advertised Ability */ ++#define GG82563_PHY_ADV_NEXT_PAGE \ ++ GG82563_REG(194, 24) /* Advertised Next Page */ ++#define GG82563_PHY_LINK_PARTNER_ADV_NEXT_PAGE \ ++ GG82563_REG(194, 25) /* Link Partner Advertised Next page */ ++#define GG82563_PHY_KMRN_MISC \ ++ GG82563_REG(194, 26) /* Misc. */ ++ ++/* MDI Control */ ++#define E1000_MDIC_DATA_MASK 0x0000FFFF ++#define E1000_MDIC_REG_MASK 0x001F0000 ++#define E1000_MDIC_REG_SHIFT 16 ++#define E1000_MDIC_PHY_MASK 0x03E00000 ++#define E1000_MDIC_PHY_SHIFT 21 ++#define E1000_MDIC_OP_WRITE 0x04000000 ++#define E1000_MDIC_OP_READ 0x08000000 ++#define E1000_MDIC_READY 0x10000000 ++#define E1000_MDIC_INT_EN 0x20000000 ++#define E1000_MDIC_ERROR 0x40000000 ++ ++/* SerDes Control */ ++#define E1000_GEN_CTL_READY 0x80000000 ++#define E1000_GEN_CTL_ADDRESS_SHIFT 8 ++#define E1000_GEN_POLL_TIMEOUT 640 ++ ++ ++ ++#endif /* _E1000_DEFINES_H_ */ +diff -r d03036c09699 drivers/net/e1000/e1000_ethtool.c +--- a/drivers/net/e1000/e1000_ethtool.c Thu Jun 04 15:13:56 2009 +0100 ++++ b/drivers/net/e1000/e1000_ethtool.c Mon Jun 15 11:43:11 2009 +0100 +@@ -1,7 +1,7 @@ + /******************************************************************************* + + Intel PRO/1000 Linux driver +- Copyright(c) 1999 - 2006 Intel Corporation. ++ Copyright(c) 1999 - 2008 Intel Corporation. + + This program is free software; you can redistribute it and/or modify it + under the terms and conditions of the GNU General Public License, +@@ -28,32 +28,45 @@ + + /* ethtool support for e1000 */ + ++#include ++ ++#ifdef SIOCETHTOOL ++#include ++ + #include "e1000.h" +-#include ++#include "e1000_82541.h" ++#ifdef NETIF_F_HW_VLAN_TX ++#include ++#endif + ++#ifdef ETHTOOL_OPS_COMPAT ++#include "kcompat_ethtool.c" ++#endif ++ ++#ifdef ETHTOOL_GSTATS + struct e1000_stats { + char stat_string[ETH_GSTRING_LEN]; + int sizeof_stat; + int stat_offset; + }; + +-#define E1000_STAT(m) FIELD_SIZEOF(struct e1000_adapter, m), \ ++#define E1000_STAT(m) sizeof(((struct e1000_adapter *)0)->m), \ + offsetof(struct e1000_adapter, m) + static const struct e1000_stats e1000_gstrings_stats[] = { + { "rx_packets", E1000_STAT(stats.gprc) }, + { "tx_packets", E1000_STAT(stats.gptc) }, +- { "rx_bytes", E1000_STAT(stats.gorcl) }, +- { "tx_bytes", E1000_STAT(stats.gotcl) }, ++ { "rx_bytes", E1000_STAT(stats.gorc) }, ++ { "tx_bytes", E1000_STAT(stats.gotc) }, + { "rx_broadcast", E1000_STAT(stats.bprc) }, + { "tx_broadcast", E1000_STAT(stats.bptc) }, + { "rx_multicast", E1000_STAT(stats.mprc) }, + { "tx_multicast", E1000_STAT(stats.mptc) }, +- { "rx_errors", E1000_STAT(stats.rxerrc) }, +- { "tx_errors", E1000_STAT(stats.txerrc) }, ++ { "rx_errors", E1000_STAT(net_stats.rx_errors) }, ++ { "tx_errors", E1000_STAT(net_stats.tx_errors) }, + { "tx_dropped", E1000_STAT(net_stats.tx_dropped) }, + { "multicast", E1000_STAT(stats.mprc) }, + { "collisions", E1000_STAT(stats.colc) }, +- { "rx_length_errors", E1000_STAT(stats.rlerrc) }, ++ { "rx_length_errors", E1000_STAT(net_stats.rx_length_errors) }, + { "rx_over_errors", E1000_STAT(net_stats.rx_over_errors) }, + { "rx_crc_errors", E1000_STAT(stats.crcerrs) }, + { "rx_frame_errors", E1000_STAT(net_stats.rx_frame_errors) }, +@@ -79,10 +92,9 @@ + { "rx_flow_control_xoff", E1000_STAT(stats.xoffrxc) }, + { "tx_flow_control_xon", E1000_STAT(stats.xontxc) }, + { "tx_flow_control_xoff", E1000_STAT(stats.xofftxc) }, +- { "rx_long_byte_count", E1000_STAT(stats.gorcl) }, ++ { "rx_long_byte_count", E1000_STAT(stats.gorc) }, + { "rx_csum_offload_good", E1000_STAT(hw_csum_good) }, + { "rx_csum_offload_errors", E1000_STAT(hw_csum_err) }, +- { "rx_header_split", E1000_STAT(rx_hdr_split) }, + { "alloc_rx_buff_failed", E1000_STAT(alloc_rx_buff_failed) }, + { "tx_smbus", E1000_STAT(stats.mgptc) }, + { "rx_smbus", E1000_STAT(stats.mgprc) }, +@@ -90,22 +102,27 @@ + }; + + #define E1000_QUEUE_STATS_LEN 0 +-#define E1000_GLOBAL_STATS_LEN ARRAY_SIZE(e1000_gstrings_stats) ++#define E1000_GLOBAL_STATS_LEN \ ++ sizeof(e1000_gstrings_stats) / sizeof(struct e1000_stats) + #define E1000_STATS_LEN (E1000_GLOBAL_STATS_LEN + E1000_QUEUE_STATS_LEN) ++#endif /* ETHTOOL_GSTATS */ ++#ifdef ETHTOOL_TEST + static const char e1000_gstrings_test[][ETH_GSTRING_LEN] = { + "Register test (offline)", "Eeprom test (offline)", + "Interrupt test (offline)", "Loopback test (offline)", + "Link test (on/offline)" + }; +-#define E1000_TEST_LEN ARRAY_SIZE(e1000_gstrings_test) ++#define E1000_TEST_LEN sizeof(e1000_gstrings_test) / ETH_GSTRING_LEN ++#endif /* ETHTOOL_TEST */ + + static int e1000_get_settings(struct net_device *netdev, +- struct ethtool_cmd *ecmd) ++ struct ethtool_cmd *ecmd) + { + struct e1000_adapter *adapter = netdev_priv(netdev); + struct e1000_hw *hw = &adapter->hw; ++ u32 status; + +- if (hw->media_type == e1000_media_type_copper) { ++ if (hw->phy.media_type == e1000_media_type_copper) { + + ecmd->supported = (SUPPORTED_10baseT_Half | + SUPPORTED_10baseT_Full | +@@ -114,20 +131,20 @@ + SUPPORTED_1000baseT_Full| + SUPPORTED_Autoneg | + SUPPORTED_TP); +- if (hw->phy_type == e1000_phy_ife) ++ if (hw->phy.type == e1000_phy_ife) + ecmd->supported &= ~SUPPORTED_1000baseT_Full; + ecmd->advertising = ADVERTISED_TP; + +- if (hw->autoneg == 1) { ++ if (hw->mac.autoneg == 1) { + ecmd->advertising |= ADVERTISED_Autoneg; + /* the e1000 autoneg seems to match ethtool nicely */ +- ecmd->advertising |= hw->autoneg_advertised; ++ ecmd->advertising |= hw->phy.autoneg_advertised; + } + + ecmd->port = PORT_TP; +- ecmd->phy_address = hw->phy_addr; ++ ecmd->phy_address = hw->phy.addr; + +- if (hw->mac_type == e1000_82543) ++ if (hw->mac.type == e1000_82543) + ecmd->transceiver = XCVR_EXTERNAL; + else + ecmd->transceiver = XCVR_INTERNAL; +@@ -143,22 +160,26 @@ + + ecmd->port = PORT_FIBRE; + +- if (hw->mac_type >= e1000_82545) ++ if (hw->mac.type >= e1000_82545) + ecmd->transceiver = XCVR_INTERNAL; + else + ecmd->transceiver = XCVR_EXTERNAL; + } + +- if (er32(STATUS) & E1000_STATUS_LU) { ++ status = E1000_READ_REG(&adapter->hw, E1000_STATUS); + +- e1000_get_speed_and_duplex(hw, &adapter->link_speed, +- &adapter->link_duplex); +- ecmd->speed = adapter->link_speed; ++ if (status & E1000_STATUS_LU) { + +- /* unfortunatly FULL_DUPLEX != DUPLEX_FULL +- * and HALF_DUPLEX != DUPLEX_HALF */ ++ if ((status & E1000_STATUS_SPEED_1000) || ++ hw->phy.media_type != e1000_media_type_copper) ++ ecmd->speed = SPEED_1000; ++ else if (status & E1000_STATUS_SPEED_100) ++ ecmd->speed = SPEED_100; ++ else ++ ecmd->speed = SPEED_10; + +- if (adapter->link_duplex == FULL_DUPLEX) ++ if ((status & E1000_STATUS_FD) || ++ hw->phy.media_type != e1000_media_type_copper) + ecmd->duplex = DUPLEX_FULL; + else + ecmd->duplex = DUPLEX_HALF; +@@ -167,59 +188,68 @@ + ecmd->duplex = -1; + } + +- ecmd->autoneg = ((hw->media_type == e1000_media_type_fiber) || +- hw->autoneg) ? AUTONEG_ENABLE : AUTONEG_DISABLE; ++ ecmd->autoneg = ((hw->phy.media_type == e1000_media_type_fiber) || ++ hw->mac.autoneg) ? AUTONEG_ENABLE : AUTONEG_DISABLE; + return 0; + } + + static int e1000_set_settings(struct net_device *netdev, +- struct ethtool_cmd *ecmd) ++ struct ethtool_cmd *ecmd) + { + struct e1000_adapter *adapter = netdev_priv(netdev); + struct e1000_hw *hw = &adapter->hw; + ++ /* If speed is 1000, autoneg cannot be turned off */ ++ if ((ecmd->autoneg == 0) && (ecmd->speed == SPEED_1000) && ++ (ecmd->duplex = DUPLEX_FULL)) ++ return -EINVAL; ++ + /* When SoL/IDER sessions are active, autoneg/speed/duplex + * cannot be changed */ +- if (e1000_check_phy_reset_block(hw)) { ++ if (e1000_check_reset_block(hw)) { + DPRINTK(DRV, ERR, "Cannot change link characteristics " + "when SoL/IDER is active.\n"); + return -EINVAL; + } + +- while (test_and_set_bit(__E1000_RESETTING, &adapter->flags)) ++ while (test_and_set_bit(__E1000_RESETTING, &adapter->state)) + msleep(1); + + if (ecmd->autoneg == AUTONEG_ENABLE) { +- hw->autoneg = 1; +- if (hw->media_type == e1000_media_type_fiber) +- hw->autoneg_advertised = ADVERTISED_1000baseT_Full | +- ADVERTISED_FIBRE | +- ADVERTISED_Autoneg; ++ hw->mac.autoneg = 1; ++ if (hw->phy.media_type == e1000_media_type_fiber) ++ hw->phy.autoneg_advertised = ADVERTISED_1000baseT_Full | ++ ADVERTISED_FIBRE | ++ ADVERTISED_Autoneg; + else +- hw->autoneg_advertised = ecmd->advertising | +- ADVERTISED_TP | +- ADVERTISED_Autoneg; +- ecmd->advertising = hw->autoneg_advertised; +- } else ++ hw->phy.autoneg_advertised = ecmd->advertising | ++ ADVERTISED_TP | ++ ADVERTISED_Autoneg; ++ ecmd->advertising = hw->phy.autoneg_advertised; ++ if (adapter->fc_autoneg) ++ hw->fc.requested_mode = e1000_fc_default; ++ } else { + if (e1000_set_spd_dplx(adapter, ecmd->speed + ecmd->duplex)) { +- clear_bit(__E1000_RESETTING, &adapter->flags); ++ clear_bit(__E1000_RESETTING, &adapter->state); + return -EINVAL; + } ++ } + + /* reset the link */ + + if (netif_running(adapter->netdev)) { + e1000_down(adapter); + e1000_up(adapter); +- } else ++ } else { + e1000_reset(adapter); ++ } + +- clear_bit(__E1000_RESETTING, &adapter->flags); ++ clear_bit(__E1000_RESETTING, &adapter->state); + return 0; + } + + static void e1000_get_pauseparam(struct net_device *netdev, +- struct ethtool_pauseparam *pause) ++ struct ethtool_pauseparam *pause) + { + struct e1000_adapter *adapter = netdev_priv(netdev); + struct e1000_hw *hw = &adapter->hw; +@@ -227,18 +257,18 @@ + pause->autoneg = + (adapter->fc_autoneg ? AUTONEG_ENABLE : AUTONEG_DISABLE); + +- if (hw->fc == E1000_FC_RX_PAUSE) ++ if (hw->fc.current_mode == e1000_fc_rx_pause) + pause->rx_pause = 1; +- else if (hw->fc == E1000_FC_TX_PAUSE) ++ else if (hw->fc.current_mode == e1000_fc_tx_pause) + pause->tx_pause = 1; +- else if (hw->fc == E1000_FC_FULL) { ++ else if (hw->fc.current_mode == e1000_fc_full) { + pause->rx_pause = 1; + pause->tx_pause = 1; + } + } + + static int e1000_set_pauseparam(struct net_device *netdev, +- struct ethtool_pauseparam *pause) ++ struct ethtool_pauseparam *pause) + { + struct e1000_adapter *adapter = netdev_priv(netdev); + struct e1000_hw *hw = &adapter->hw; +@@ -246,31 +276,34 @@ + + adapter->fc_autoneg = pause->autoneg; + +- while (test_and_set_bit(__E1000_RESETTING, &adapter->flags)) ++ while (test_and_set_bit(__E1000_RESETTING, &adapter->state)) + msleep(1); + + if (pause->rx_pause && pause->tx_pause) +- hw->fc = E1000_FC_FULL; ++ hw->fc.current_mode = e1000_fc_full; + else if (pause->rx_pause && !pause->tx_pause) +- hw->fc = E1000_FC_RX_PAUSE; ++ hw->fc.current_mode = e1000_fc_rx_pause; + else if (!pause->rx_pause && pause->tx_pause) +- hw->fc = E1000_FC_TX_PAUSE; ++ hw->fc.current_mode = e1000_fc_tx_pause; + else if (!pause->rx_pause && !pause->tx_pause) +- hw->fc = E1000_FC_NONE; ++ hw->fc.current_mode = e1000_fc_none; + +- hw->original_fc = hw->fc; ++ hw->fc.requested_mode = hw->fc.current_mode; + + if (adapter->fc_autoneg == AUTONEG_ENABLE) { ++ hw->fc.current_mode = e1000_fc_default; + if (netif_running(adapter->netdev)) { + e1000_down(adapter); + e1000_up(adapter); +- } else ++ } else { + e1000_reset(adapter); +- } else +- retval = ((hw->media_type == e1000_media_type_fiber) ? ++ } ++ } else { ++ retval = ((hw->phy.media_type == e1000_media_type_fiber) ? + e1000_setup_link(hw) : e1000_force_mac_fc(hw)); ++ } + +- clear_bit(__E1000_RESETTING, &adapter->flags); ++ clear_bit(__E1000_RESETTING, &adapter->state); + return retval; + } + +@@ -300,9 +333,8 @@ + static int e1000_set_tx_csum(struct net_device *netdev, u32 data) + { + struct e1000_adapter *adapter = netdev_priv(netdev); +- struct e1000_hw *hw = &adapter->hw; + +- if (hw->mac_type < e1000_82543) { ++ if (adapter->hw.mac.type < e1000_82543) { + if (!data) + return -EINVAL; + return 0; +@@ -316,29 +348,52 @@ + return 0; + } + ++#ifdef NETIF_F_TSO + static int e1000_set_tso(struct net_device *netdev, u32 data) + { + struct e1000_adapter *adapter = netdev_priv(netdev); +- struct e1000_hw *hw = &adapter->hw; +- +- if ((hw->mac_type < e1000_82544) || +- (hw->mac_type == e1000_82547)) ++ int i; ++ struct net_device *v_netdev; ++ if (!(adapter->flags & E1000_FLAG_HAS_TSO)) + return data ? -EINVAL : 0; + +- if (data) ++ if (data) { + netdev->features |= NETIF_F_TSO; +- else ++#ifdef NETIF_F_TSO6 ++ if (adapter->flags & E1000_FLAG_HAS_TSO6) ++ netdev->features |= NETIF_F_TSO6; ++#endif ++ } else { + netdev->features &= ~NETIF_F_TSO; ++#ifdef NETIF_F_TSO6 ++ if (adapter->flags & E1000_FLAG_HAS_TSO6) ++ netdev->features &= ~NETIF_F_TSO6; ++#endif ++#ifdef NETIF_F_HW_VLAN_TX ++ /* disable TSO on all VLANs if they're present */ ++ if (!adapter->vlgrp) ++ goto tso_out; ++ for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) { ++ v_netdev = vlan_group_get_device(adapter->vlgrp, i); ++ if (!v_netdev) ++ continue; + +- if (data && (adapter->hw.mac_type > e1000_82547_rev_2)) +- netdev->features |= NETIF_F_TSO6; +- else +- netdev->features &= ~NETIF_F_TSO6; ++ v_netdev->features &= ~NETIF_F_TSO; ++#ifdef NETIF_F_TSO6 ++ if (adapter->flags & E1000_FLAG_HAS_TSO6) ++ v_netdev->features &= ~NETIF_F_TSO6; ++#endif ++ vlan_group_set_device(adapter->vlgrp, i, v_netdev); ++ } ++#endif ++ } + ++tso_out: + DPRINTK(PROBE, INFO, "TSO is %s\n", data ? "Enabled" : "Disabled"); +- adapter->tso_force = true; ++ adapter->flags |= E1000_FLAG_TSO_FORCE; + return 0; + } ++#endif /* NETIF_F_TSO */ + + static u32 e1000_get_msglevel(struct net_device *netdev) + { +@@ -358,8 +413,8 @@ + return E1000_REGS_LEN * sizeof(u32); + } + +-static void e1000_get_regs(struct net_device *netdev, struct ethtool_regs *regs, +- void *p) ++static void e1000_get_regs(struct net_device *netdev, ++ struct ethtool_regs *regs, void *p) + { + struct e1000_adapter *adapter = netdev_priv(netdev); + struct e1000_hw *hw = &adapter->hw; +@@ -370,23 +425,23 @@ + + regs->version = (1 << 24) | (hw->revision_id << 16) | hw->device_id; + +- regs_buff[0] = er32(CTRL); +- regs_buff[1] = er32(STATUS); ++ regs_buff[0] = E1000_READ_REG(hw, E1000_CTRL); ++ regs_buff[1] = E1000_READ_REG(hw, E1000_STATUS); + +- regs_buff[2] = er32(RCTL); +- regs_buff[3] = er32(RDLEN); +- regs_buff[4] = er32(RDH); +- regs_buff[5] = er32(RDT); +- regs_buff[6] = er32(RDTR); ++ regs_buff[2] = E1000_READ_REG(hw, E1000_RCTL); ++ regs_buff[3] = E1000_READ_REG(hw, E1000_RDLEN(0)); ++ regs_buff[4] = E1000_READ_REG(hw, E1000_RDH(0)); ++ regs_buff[5] = E1000_READ_REG(hw, E1000_RDT(0)); ++ regs_buff[6] = E1000_READ_REG(hw, E1000_RDTR); + +- regs_buff[7] = er32(TCTL); +- regs_buff[8] = er32(TDLEN); +- regs_buff[9] = er32(TDH); +- regs_buff[10] = er32(TDT); +- regs_buff[11] = er32(TIDV); ++ regs_buff[7] = E1000_READ_REG(hw, E1000_TCTL); ++ regs_buff[8] = E1000_READ_REG(hw, E1000_TDLEN(0)); ++ regs_buff[9] = E1000_READ_REG(hw, E1000_TDH(0)); ++ regs_buff[10] = E1000_READ_REG(hw, E1000_TDT(0)); ++ regs_buff[11] = E1000_READ_REG(hw, E1000_TIDV); + +- regs_buff[12] = hw->phy_type; /* PHY type (IGP=1, M88=0) */ +- if (hw->phy_type == e1000_phy_igp) { ++ regs_buff[12] = adapter->hw.phy.type; /* PHY type (IGP=1, M88=0) */ ++ if (hw->phy.type == e1000_phy_igp) { + e1000_write_phy_reg(hw, IGP01E1000_PHY_PAGE_SELECT, + IGP01E1000_PHY_AGC_A); + e1000_read_phy_reg(hw, IGP01E1000_PHY_AGC_A & +@@ -440,23 +495,20 @@ + e1000_read_phy_reg(hw, PHY_1000T_STATUS, &phy_data); + regs_buff[24] = (u32)phy_data; /* phy local receiver status */ + regs_buff[25] = regs_buff[24]; /* phy remote receiver status */ +- if (hw->mac_type >= e1000_82540 && +- hw->mac_type < e1000_82571 && +- hw->media_type == e1000_media_type_copper) { +- regs_buff[26] = er32(MANC); ++ if (hw->mac.type >= e1000_82540 && ++ hw->phy.media_type == e1000_media_type_copper) { ++ regs_buff[26] = E1000_READ_REG(hw, E1000_MANC); + } + } + + static int e1000_get_eeprom_len(struct net_device *netdev) + { + struct e1000_adapter *adapter = netdev_priv(netdev); +- struct e1000_hw *hw = &adapter->hw; +- +- return hw->eeprom.word_size * 2; ++ return adapter->hw.nvm.word_size * 2; + } + + static int e1000_get_eeprom(struct net_device *netdev, +- struct ethtool_eeprom *eeprom, u8 *bytes) ++ struct ethtool_eeprom *eeprom, u8 *bytes) + { + struct e1000_adapter *adapter = netdev_priv(netdev); + struct e1000_hw *hw = &adapter->hw; +@@ -478,17 +530,15 @@ + if (!eeprom_buff) + return -ENOMEM; + +- if (hw->eeprom.type == e1000_eeprom_spi) +- ret_val = e1000_read_eeprom(hw, first_word, +- last_word - first_word + 1, +- eeprom_buff); ++ if (hw->nvm.type == e1000_nvm_eeprom_spi) ++ ret_val = e1000_read_nvm(hw, first_word, ++ last_word - first_word + 1, ++ eeprom_buff); + else { +- for (i = 0; i < last_word - first_word + 1; i++) { +- ret_val = e1000_read_eeprom(hw, first_word + i, 1, +- &eeprom_buff[i]); +- if (ret_val) ++ for (i = 0; i < last_word - first_word + 1; i++) ++ if ((ret_val = e1000_read_nvm(hw, first_word + i, 1, ++ &eeprom_buff[i]))) + break; +- } + } + + /* Device's eeprom is always little-endian, word addressable */ +@@ -503,7 +553,7 @@ + } + + static int e1000_set_eeprom(struct net_device *netdev, +- struct ethtool_eeprom *eeprom, u8 *bytes) ++ struct ethtool_eeprom *eeprom, u8 *bytes) + { + struct e1000_adapter *adapter = netdev_priv(netdev); + struct e1000_hw *hw = &adapter->hw; +@@ -518,7 +568,7 @@ + if (eeprom->magic != (hw->vendor_id | (hw->device_id << 16))) + return -EFAULT; + +- max_len = hw->eeprom.word_size * 2; ++ max_len = hw->nvm.word_size * 2; + + first_word = eeprom->offset >> 1; + last_word = (eeprom->offset + eeprom->len - 1) >> 1; +@@ -531,14 +581,14 @@ + if (eeprom->offset & 1) { + /* need read/modify/write of first changed EEPROM word */ + /* only the second byte of the word is being modified */ +- ret_val = e1000_read_eeprom(hw, first_word, 1, ++ ret_val = e1000_read_nvm(hw, first_word, 1, + &eeprom_buff[0]); + ptr++; + } + if (((eeprom->offset + eeprom->len) & 1) && (ret_val == 0)) { + /* need read/modify/write of last changed EEPROM word */ + /* only the first byte of the word is being modified */ +- ret_val = e1000_read_eeprom(hw, last_word, 1, ++ ret_val = e1000_read_nvm(hw, last_word, 1, + &eeprom_buff[last_word - first_word]); + } + +@@ -551,62 +601,39 @@ + for (i = 0; i < last_word - first_word + 1; i++) + eeprom_buff[i] = cpu_to_le16(eeprom_buff[i]); + +- ret_val = e1000_write_eeprom(hw, first_word, +- last_word - first_word + 1, eeprom_buff); ++ ret_val = e1000_write_nvm(hw, first_word, ++ last_word - first_word + 1, eeprom_buff); + +- /* Update the checksum over the first part of the EEPROM if needed +- * and flush shadow RAM for 82573 conrollers */ +- if ((ret_val == 0) && ((first_word <= EEPROM_CHECKSUM_REG) || +- (hw->mac_type == e1000_82573))) +- e1000_update_eeprom_checksum(hw); ++ /* Update the checksum over the first part of the EEPROM if needed */ ++ if ((ret_val == 0) && (first_word <= NVM_CHECKSUM_REG)) ++ e1000_update_nvm_checksum(hw); + + kfree(eeprom_buff); + return ret_val; + } + + static void e1000_get_drvinfo(struct net_device *netdev, +- struct ethtool_drvinfo *drvinfo) ++ struct ethtool_drvinfo *drvinfo) + { + struct e1000_adapter *adapter = netdev_priv(netdev); +- struct e1000_hw *hw = &adapter->hw; +- char firmware_version[32]; +- u16 eeprom_data; + + strncpy(drvinfo->driver, e1000_driver_name, 32); + strncpy(drvinfo->version, e1000_driver_version, 32); +- +- /* EEPROM image version # is reported as firmware version # for +- * 8257{1|2|3} controllers */ +- e1000_read_eeprom(hw, 5, 1, &eeprom_data); +- switch (hw->mac_type) { +- case e1000_82571: +- case e1000_82572: +- case e1000_82573: +- case e1000_80003es2lan: +- case e1000_ich8lan: +- sprintf(firmware_version, "%d.%d-%d", +- (eeprom_data & 0xF000) >> 12, +- (eeprom_data & 0x0FF0) >> 4, +- eeprom_data & 0x000F); +- break; +- default: +- sprintf(firmware_version, "N/A"); +- } +- +- strncpy(drvinfo->fw_version, firmware_version, 32); ++ strcpy(drvinfo->fw_version, "N/A"); + strncpy(drvinfo->bus_info, pci_name(adapter->pdev), 32); ++ drvinfo->n_stats = E1000_STATS_LEN; ++ drvinfo->testinfo_len = E1000_TEST_LEN; + drvinfo->regdump_len = e1000_get_regs_len(netdev); + drvinfo->eedump_len = e1000_get_eeprom_len(netdev); + } + + static void e1000_get_ringparam(struct net_device *netdev, +- struct ethtool_ringparam *ring) ++ struct ethtool_ringparam *ring) + { + struct e1000_adapter *adapter = netdev_priv(netdev); +- struct e1000_hw *hw = &adapter->hw; +- e1000_mac_type mac_type = hw->mac_type; +- struct e1000_tx_ring *txdr = adapter->tx_ring; +- struct e1000_rx_ring *rxdr = adapter->rx_ring; ++ enum e1000_mac_type mac_type = adapter->hw.mac.type; ++ struct e1000_tx_ring *tx_ring = adapter->tx_ring; ++ struct e1000_rx_ring *rx_ring = adapter->rx_ring; + + ring->rx_max_pending = (mac_type < e1000_82544) ? E1000_MAX_RXD : + E1000_MAX_82544_RXD; +@@ -614,26 +641,28 @@ + E1000_MAX_82544_TXD; + ring->rx_mini_max_pending = 0; + ring->rx_jumbo_max_pending = 0; +- ring->rx_pending = rxdr->count; +- ring->tx_pending = txdr->count; ++ ring->rx_pending = rx_ring->count; ++ ring->tx_pending = tx_ring->count; + ring->rx_mini_pending = 0; + ring->rx_jumbo_pending = 0; + } + + static int e1000_set_ringparam(struct net_device *netdev, +- struct ethtool_ringparam *ring) ++ struct ethtool_ringparam *ring) + { + struct e1000_adapter *adapter = netdev_priv(netdev); +- struct e1000_hw *hw = &adapter->hw; +- e1000_mac_type mac_type = hw->mac_type; +- struct e1000_tx_ring *txdr, *tx_old; +- struct e1000_rx_ring *rxdr, *rx_old; +- int i, err; ++ enum e1000_mac_type mac_type = adapter->hw.mac.type; ++ struct e1000_tx_ring *tx_ring, *tx_old; ++ struct e1000_rx_ring *rx_ring, *rx_old; ++ int i, err, tx_ring_size, rx_ring_size; + + if ((ring->rx_mini_pending) || (ring->rx_jumbo_pending)) + return -EINVAL; + +- while (test_and_set_bit(__E1000_RESETTING, &adapter->flags)) ++ tx_ring_size = sizeof(struct e1000_tx_ring) * adapter->num_tx_queues; ++ rx_ring_size = sizeof(struct e1000_rx_ring) * adapter->num_rx_queues; ++ ++ while (test_and_set_bit(__E1000_RESETTING, &adapter->state)) + msleep(1); + + if (netif_running(adapter->netdev)) +@@ -643,164 +672,142 @@ + rx_old = adapter->rx_ring; + + err = -ENOMEM; +- txdr = kcalloc(adapter->num_tx_queues, sizeof(struct e1000_tx_ring), GFP_KERNEL); +- if (!txdr) ++ tx_ring = kzalloc(tx_ring_size, GFP_KERNEL); ++ if (!tx_ring) + goto err_alloc_tx; ++ /* use a memcpy to save any previously configured ++ * items like napi structs from having to be ++ * reinitialized */ ++ memcpy(tx_ring, tx_old, tx_ring_size); + +- rxdr = kcalloc(adapter->num_rx_queues, sizeof(struct e1000_rx_ring), GFP_KERNEL); +- if (!rxdr) ++ rx_ring = kzalloc(rx_ring_size, GFP_KERNEL); ++ if (!rx_ring) + goto err_alloc_rx; ++ memcpy(rx_ring, rx_old, rx_ring_size); + +- adapter->tx_ring = txdr; +- adapter->rx_ring = rxdr; ++ adapter->tx_ring = tx_ring; ++ adapter->rx_ring = rx_ring; + +- rxdr->count = max(ring->rx_pending,(u32)E1000_MIN_RXD); +- rxdr->count = min(rxdr->count,(u32)(mac_type < e1000_82544 ? ++ rx_ring->count = max(ring->rx_pending,(u32)E1000_MIN_RXD); ++ rx_ring->count = min(rx_ring->count,(u32)(mac_type < e1000_82544 ? + E1000_MAX_RXD : E1000_MAX_82544_RXD)); +- rxdr->count = ALIGN(rxdr->count, REQ_RX_DESCRIPTOR_MULTIPLE); ++ rx_ring->count = ALIGN(rx_ring->count, REQ_RX_DESCRIPTOR_MULTIPLE); + +- txdr->count = max(ring->tx_pending,(u32)E1000_MIN_TXD); +- txdr->count = min(txdr->count,(u32)(mac_type < e1000_82544 ? ++ tx_ring->count = max(ring->tx_pending,(u32)E1000_MIN_TXD); ++ tx_ring->count = min(tx_ring->count,(u32)(mac_type < e1000_82544 ? + E1000_MAX_TXD : E1000_MAX_82544_TXD)); +- txdr->count = ALIGN(txdr->count, REQ_TX_DESCRIPTOR_MULTIPLE); ++ tx_ring->count = ALIGN(tx_ring->count, REQ_TX_DESCRIPTOR_MULTIPLE); + ++ /* overwrite the counts with the new values */ + for (i = 0; i < adapter->num_tx_queues; i++) +- txdr[i].count = txdr->count; ++ tx_ring[i].count = tx_ring->count; ++ + for (i = 0; i < adapter->num_rx_queues; i++) +- rxdr[i].count = rxdr->count; ++ rx_ring[i].count = rx_ring->count; + + if (netif_running(adapter->netdev)) { + /* Try to get new resources before deleting old */ +- err = e1000_setup_all_rx_resources(adapter); +- if (err) ++ if ((err = e1000_setup_all_rx_resources(adapter))) + goto err_setup_rx; +- err = e1000_setup_all_tx_resources(adapter); +- if (err) ++ if ((err = e1000_setup_all_tx_resources(adapter))) + goto err_setup_tx; + +- /* save the new, restore the old in order to free it, +- * then restore the new back again */ +- ++ /* restore the old in order to free it, ++ * then add in the new */ + adapter->rx_ring = rx_old; + adapter->tx_ring = tx_old; + e1000_free_all_rx_resources(adapter); + e1000_free_all_tx_resources(adapter); + kfree(tx_old); + kfree(rx_old); +- adapter->rx_ring = rxdr; +- adapter->tx_ring = txdr; +- err = e1000_up(adapter); +- if (err) ++ adapter->rx_ring = rx_ring; ++ adapter->tx_ring = tx_ring; ++ if ((err = e1000_up(adapter))) + goto err_setup; + } + +- clear_bit(__E1000_RESETTING, &adapter->flags); ++ clear_bit(__E1000_RESETTING, &adapter->state); + return 0; + err_setup_tx: + e1000_free_all_rx_resources(adapter); + err_setup_rx: + adapter->rx_ring = rx_old; + adapter->tx_ring = tx_old; +- kfree(rxdr); ++ kfree(rx_ring); + err_alloc_rx: +- kfree(txdr); ++ kfree(tx_ring); + err_alloc_tx: + e1000_up(adapter); + err_setup: +- clear_bit(__E1000_RESETTING, &adapter->flags); ++ clear_bit(__E1000_RESETTING, &adapter->state); + return err; + } + +-static bool reg_pattern_test(struct e1000_adapter *adapter, u64 *data, int reg, +- u32 mask, u32 write) +-{ +- struct e1000_hw *hw = &adapter->hw; ++static bool reg_pattern_test(struct e1000_adapter *adapter, u64 *data, ++ int reg, int offset, u32 mask, u32 write) ++{ \ ++ u32 pat, val; + static const u32 test[] = + {0x5A5A5A5A, 0xA5A5A5A5, 0x00000000, 0xFFFFFFFF}; +- u8 __iomem *address = hw->hw_addr + reg; +- u32 read; +- int i; +- +- for (i = 0; i < ARRAY_SIZE(test); i++) { +- writel(write & test[i], address); +- read = readl(address); +- if (read != (write & test[i] & mask)) { +- DPRINTK(DRV, ERR, "pattern test reg %04X failed: " +- "got 0x%08X expected 0x%08X\n", +- reg, read, (write & test[i] & mask)); +- *data = reg; +- return true; ++ for (pat = 0; pat < ARRAY_SIZE(test); pat++) { ++ E1000_WRITE_REG_ARRAY(&adapter->hw, reg, offset, ++ (test[pat] & write)); ++ val = E1000_READ_REG_ARRAY(&adapter->hw, reg, offset); ++ if (val != (test[pat] & write & mask)) { ++ DPRINTK(DRV, ERR, "pattern test reg %04X failed: got " ++ "0x%08X expected 0x%08X\n", ++ E1000_REGISTER(&adapter->hw, reg) + offset, ++ val, (test[pat] & write & mask)); ++ *data = E1000_REGISTER(&adapter->hw, reg); ++ return 1; + } + } +- return false; ++ return 0; + } + +-static bool reg_set_and_check(struct e1000_adapter *adapter, u64 *data, int reg, +- u32 mask, u32 write) ++static bool reg_set_and_check(struct e1000_adapter *adapter, u64 *data, ++ int reg, u32 mask, u32 write) + { +- struct e1000_hw *hw = &adapter->hw; +- u8 __iomem *address = hw->hw_addr + reg; +- u32 read; ++ u32 val; ++ E1000_WRITE_REG(&adapter->hw, reg, write & mask); ++ val = E1000_READ_REG(&adapter->hw, reg); ++ if ((write & mask) != (val & mask)) { ++ DPRINTK(DRV, ERR, "set/check reg %04X test failed: got 0x%08X" ++ "expected 0x%08X\n", reg, (val & mask), (write & mask)); ++ *data = E1000_REGISTER(&adapter->hw, reg); ++ return 1; ++ } ++ return 0; ++} ++#define REG_PATTERN_TEST_ARRAY(reg, offset, mask, write) \ ++ do { \ ++ if (reg_pattern_test(adapter, data, reg, offset, mask, write)) \ ++ return 1; \ ++ } while (0) ++#define REG_PATTERN_TEST(reg, mask, write) \ ++ REG_PATTERN_TEST_ARRAY(reg, 0, mask, write) + +- writel(write & mask, address); +- read = readl(address); +- if ((read & mask) != (write & mask)) { +- DPRINTK(DRV, ERR, "set/check reg %04X test failed: " +- "got 0x%08X expected 0x%08X\n", +- reg, (read & mask), (write & mask)); +- *data = reg; +- return true; +- } +- return false; +-} +- +-#define REG_PATTERN_TEST(reg, mask, write) \ +- do { \ +- if (reg_pattern_test(adapter, data, \ +- (hw->mac_type >= e1000_82543) \ +- ? E1000_##reg : E1000_82542_##reg, \ +- mask, write)) \ +- return 1; \ +- } while (0) +- +-#define REG_SET_AND_CHECK(reg, mask, write) \ +- do { \ +- if (reg_set_and_check(adapter, data, \ +- (hw->mac_type >= e1000_82543) \ +- ? E1000_##reg : E1000_82542_##reg, \ +- mask, write)) \ +- return 1; \ ++#define REG_SET_AND_CHECK(reg, mask, write) \ ++ do { \ ++ if (reg_set_and_check(adapter, data, reg, mask, write)) \ ++ return 1; \ + } while (0) + + static int e1000_reg_test(struct e1000_adapter *adapter, u64 *data) + { ++ struct e1000_mac_info *mac = &adapter->hw.mac; + u32 value, before, after; + u32 i, toggle; +- struct e1000_hw *hw = &adapter->hw; + + /* The status register is Read Only, so a write should fail. + * Some bits that get toggled are ignored. + */ +- switch (hw->mac_type) { +- /* there are several bits on newer hardware that are r/w */ +- case e1000_82571: +- case e1000_82572: +- case e1000_80003es2lan: +- toggle = 0x7FFFF3FF; +- break; +- case e1000_82573: +- case e1000_ich8lan: +- toggle = 0x7FFFF033; +- break; +- default: +- toggle = 0xFFFFF833; +- break; +- } ++ toggle = 0xFFFFF833; + +- before = er32(STATUS); +- value = (er32(STATUS) & toggle); +- ew32(STATUS, toggle); +- after = er32(STATUS) & toggle; ++ before = E1000_READ_REG(&adapter->hw, E1000_STATUS); ++ value = (E1000_READ_REG(&adapter->hw, E1000_STATUS) & toggle); ++ E1000_WRITE_REG(&adapter->hw, E1000_STATUS, toggle); ++ after = E1000_READ_REG(&adapter->hw, E1000_STATUS) & toggle; + if (value != after) { + DPRINTK(DRV, ERR, "failed STATUS register test got: " + "0x%08X expected: 0x%08X\n", after, value); +@@ -808,61 +815,52 @@ + return 1; + } + /* restore previous status */ +- ew32(STATUS, before); ++ E1000_WRITE_REG(&adapter->hw, E1000_STATUS, before); + +- if (hw->mac_type != e1000_ich8lan) { +- REG_PATTERN_TEST(FCAL, 0xFFFFFFFF, 0xFFFFFFFF); +- REG_PATTERN_TEST(FCAH, 0x0000FFFF, 0xFFFFFFFF); +- REG_PATTERN_TEST(FCT, 0x0000FFFF, 0xFFFFFFFF); +- REG_PATTERN_TEST(VET, 0x0000FFFF, 0xFFFFFFFF); +- } ++ REG_PATTERN_TEST(E1000_FCAL, 0xFFFFFFFF, 0xFFFFFFFF); ++ REG_PATTERN_TEST(E1000_FCAH, 0x0000FFFF, 0xFFFFFFFF); ++ REG_PATTERN_TEST(E1000_FCT, 0x0000FFFF, 0xFFFFFFFF); ++ REG_PATTERN_TEST(E1000_VET, 0x0000FFFF, 0xFFFFFFFF); ++ REG_PATTERN_TEST(E1000_RDTR, 0x0000FFFF, 0xFFFFFFFF); ++ REG_PATTERN_TEST(E1000_RDBAH(0), 0xFFFFFFFF, 0xFFFFFFFF); ++ REG_PATTERN_TEST(E1000_RDLEN(0), 0x000FFF80, 0x000FFFFF); ++ REG_PATTERN_TEST(E1000_RDH(0), 0x0000FFFF, 0x0000FFFF); ++ REG_PATTERN_TEST(E1000_RDT(0), 0x0000FFFF, 0x0000FFFF); ++ REG_PATTERN_TEST(E1000_FCRTH, 0x0000FFF8, 0x0000FFF8); ++ REG_PATTERN_TEST(E1000_FCTTV, 0x0000FFFF, 0x0000FFFF); ++ REG_PATTERN_TEST(E1000_TIPG, 0x3FFFFFFF, 0x3FFFFFFF); ++ REG_PATTERN_TEST(E1000_TDBAH(0), 0xFFFFFFFF, 0xFFFFFFFF); ++ REG_PATTERN_TEST(E1000_TDLEN(0), 0x000FFF80, 0x000FFFFF); + +- REG_PATTERN_TEST(RDTR, 0x0000FFFF, 0xFFFFFFFF); +- REG_PATTERN_TEST(RDBAH, 0xFFFFFFFF, 0xFFFFFFFF); +- REG_PATTERN_TEST(RDLEN, 0x000FFF80, 0x000FFFFF); +- REG_PATTERN_TEST(RDH, 0x0000FFFF, 0x0000FFFF); +- REG_PATTERN_TEST(RDT, 0x0000FFFF, 0x0000FFFF); +- REG_PATTERN_TEST(FCRTH, 0x0000FFF8, 0x0000FFF8); +- REG_PATTERN_TEST(FCTTV, 0x0000FFFF, 0x0000FFFF); +- REG_PATTERN_TEST(TIPG, 0x3FFFFFFF, 0x3FFFFFFF); +- REG_PATTERN_TEST(TDBAH, 0xFFFFFFFF, 0xFFFFFFFF); +- REG_PATTERN_TEST(TDLEN, 0x000FFF80, 0x000FFFFF); ++ REG_SET_AND_CHECK(E1000_RCTL, 0xFFFFFFFF, 0x00000000); + +- REG_SET_AND_CHECK(RCTL, 0xFFFFFFFF, 0x00000000); ++ before = 0x06DFB3FE; ++ REG_SET_AND_CHECK(E1000_RCTL, before, 0x003FFFFB); ++ REG_SET_AND_CHECK(E1000_TCTL, 0xFFFFFFFF, 0x00000000); + +- before = (hw->mac_type == e1000_ich8lan ? +- 0x06C3B33E : 0x06DFB3FE); +- REG_SET_AND_CHECK(RCTL, before, 0x003FFFFB); +- REG_SET_AND_CHECK(TCTL, 0xFFFFFFFF, 0x00000000); ++ if (mac->type >= e1000_82543) { + +- if (hw->mac_type >= e1000_82543) { +- +- REG_SET_AND_CHECK(RCTL, before, 0xFFFFFFFF); +- REG_PATTERN_TEST(RDBAL, 0xFFFFFFF0, 0xFFFFFFFF); +- if (hw->mac_type != e1000_ich8lan) +- REG_PATTERN_TEST(TXCW, 0xC000FFFF, 0x0000FFFF); +- REG_PATTERN_TEST(TDBAL, 0xFFFFFFF0, 0xFFFFFFFF); +- REG_PATTERN_TEST(TIDV, 0x0000FFFF, 0x0000FFFF); +- value = (hw->mac_type == e1000_ich8lan ? +- E1000_RAR_ENTRIES_ICH8LAN : E1000_RAR_ENTRIES); +- for (i = 0; i < value; i++) { +- REG_PATTERN_TEST(RA + (((i << 1) + 1) << 2), 0x8003FFFF, +- 0xFFFFFFFF); ++ REG_SET_AND_CHECK(E1000_RCTL, before, 0xFFFFFFFF); ++ REG_PATTERN_TEST(E1000_RDBAL(0), 0xFFFFFFF0, 0xFFFFFFFF); ++ REG_PATTERN_TEST(E1000_TXCW, 0xC000FFFF, 0x0000FFFF); ++ REG_PATTERN_TEST(E1000_TDBAL(0), 0xFFFFFFF0, 0xFFFFFFFF); ++ REG_PATTERN_TEST(E1000_TIDV, 0x0000FFFF, 0x0000FFFF); ++ for (i = 0; i < mac->rar_entry_count; i++) { ++ REG_PATTERN_TEST_ARRAY(E1000_RA, ((i << 1) + 1), ++ 0x8003FFFF, 0xFFFFFFFF); + } + + } else { + +- REG_SET_AND_CHECK(RCTL, 0xFFFFFFFF, 0x01FFFFFF); +- REG_PATTERN_TEST(RDBAL, 0xFFFFF000, 0xFFFFFFFF); +- REG_PATTERN_TEST(TXCW, 0x0000FFFF, 0x0000FFFF); +- REG_PATTERN_TEST(TDBAL, 0xFFFFF000, 0xFFFFFFFF); ++ REG_SET_AND_CHECK(E1000_RCTL, 0xFFFFFFFF, 0x01FFFFFF); ++ REG_PATTERN_TEST(E1000_RDBAL(0), 0xFFFFF000, 0xFFFFFFFF); ++ REG_PATTERN_TEST(E1000_TXCW, 0x0000FFFF, 0x0000FFFF); ++ REG_PATTERN_TEST(E1000_TDBAL(0), 0xFFFFF000, 0xFFFFFFFF); + + } + +- value = (hw->mac_type == e1000_ich8lan ? +- E1000_MC_TBL_SIZE_ICH8LAN : E1000_MC_TBL_SIZE); +- for (i = 0; i < value; i++) +- REG_PATTERN_TEST(MTA + (i << 2), 0xFFFFFFFF, 0xFFFFFFFF); ++ for (i = 0; i < mac->mta_reg_count; i++) ++ REG_PATTERN_TEST_ARRAY(E1000_MTA, i, 0xFFFFFFFF, 0xFFFFFFFF); + + *data = 0; + return 0; +@@ -870,15 +868,14 @@ + + static int e1000_eeprom_test(struct e1000_adapter *adapter, u64 *data) + { +- struct e1000_hw *hw = &adapter->hw; + u16 temp; + u16 checksum = 0; + u16 i; + + *data = 0; + /* Read and add up the contents of the EEPROM */ +- for (i = 0; i < (EEPROM_CHECKSUM_REG + 1); i++) { +- if ((e1000_read_eeprom(hw, i, 1, &temp)) < 0) { ++ for (i = 0; i < (NVM_CHECKSUM_REG + 1); i++) { ++ if ((e1000_read_nvm(&adapter->hw, i, 1, &temp)) < 0) { + *data = 1; + break; + } +@@ -886,7 +883,7 @@ + } + + /* If Checksum is not Correct return error else test passed */ +- if ((checksum != (u16)EEPROM_SUM) && !(*data)) ++ if ((checksum != (u16) NVM_SUM) && !(*data)) + *data = 2; + + return *data; +@@ -894,11 +891,10 @@ + + static irqreturn_t e1000_test_intr(int irq, void *data) + { +- struct net_device *netdev = (struct net_device *)data; ++ struct net_device *netdev = (struct net_device *) data; + struct e1000_adapter *adapter = netdev_priv(netdev); +- struct e1000_hw *hw = &adapter->hw; + +- adapter->test_icr |= er32(ICR); ++ adapter->test_icr |= E1000_READ_REG(&adapter->hw, E1000_ICR); + + return IRQ_HANDLED; + } +@@ -906,10 +902,8 @@ + static int e1000_intr_test(struct e1000_adapter *adapter, u64 *data) + { + struct net_device *netdev = adapter->netdev; +- u32 mask, i = 0; +- bool shared_int = true; ++ u32 mask, i=0, shared_int = TRUE; + u32 irq = adapter->pdev->irq; +- struct e1000_hw *hw = &adapter->hw; + + *data = 0; + +@@ -917,7 +911,7 @@ + /* Hook up test interrupt handler just for this test */ + if (!request_irq(irq, &e1000_test_intr, IRQF_PROBE_SHARED, netdev->name, + netdev)) +- shared_int = false; ++ shared_int = FALSE; + else if (request_irq(irq, &e1000_test_intr, IRQF_SHARED, + netdev->name, netdev)) { + *data = 1; +@@ -927,14 +921,11 @@ + (shared_int ? "shared" : "unshared")); + + /* Disable all the interrupts */ +- ew32(IMC, 0xFFFFFFFF); ++ E1000_WRITE_REG(&adapter->hw, E1000_IMC, 0xFFFFFFFF); + msleep(10); + + /* Test each interrupt */ + for (; i < 10; i++) { +- +- if (hw->mac_type == e1000_ich8lan && i == 8) +- continue; + + /* Interrupt to test */ + mask = 1 << i; +@@ -947,8 +938,8 @@ + * test failed. + */ + adapter->test_icr = 0; +- ew32(IMC, mask); +- ew32(ICS, mask); ++ E1000_WRITE_REG(&adapter->hw, E1000_IMC, mask); ++ E1000_WRITE_REG(&adapter->hw, E1000_ICS, mask); + msleep(10); + + if (adapter->test_icr & mask) { +@@ -964,8 +955,8 @@ + * test failed. + */ + adapter->test_icr = 0; +- ew32(IMS, mask); +- ew32(ICS, mask); ++ E1000_WRITE_REG(&adapter->hw, E1000_IMS, mask); ++ E1000_WRITE_REG(&adapter->hw, E1000_ICS, mask); + msleep(10); + + if (!(adapter->test_icr & mask)) { +@@ -981,8 +972,10 @@ + * test failed. + */ + adapter->test_icr = 0; +- ew32(IMC, ~mask & 0x00007FFF); +- ew32(ICS, ~mask & 0x00007FFF); ++ E1000_WRITE_REG(&adapter->hw, E1000_IMC, ++ ~mask & 0x00007FFF); ++ E1000_WRITE_REG(&adapter->hw, E1000_ICS, ++ ~mask & 0x00007FFF); + msleep(10); + + if (adapter->test_icr) { +@@ -993,7 +986,7 @@ + } + + /* Disable all the interrupts */ +- ew32(IMC, 0xFFFFFFFF); ++ E1000_WRITE_REG(&adapter->hw, E1000_IMC, 0xFFFFFFFF); + msleep(10); + + /* Unhook test interrupt handler */ +@@ -1004,163 +997,167 @@ + + static void e1000_free_desc_rings(struct e1000_adapter *adapter) + { +- struct e1000_tx_ring *txdr = &adapter->test_tx_ring; +- struct e1000_rx_ring *rxdr = &adapter->test_rx_ring; ++ struct e1000_tx_ring *tx_ring = &adapter->test_tx_ring; ++ struct e1000_rx_ring *rx_ring = &adapter->test_rx_ring; + struct pci_dev *pdev = adapter->pdev; + int i; + +- if (txdr->desc && txdr->buffer_info) { +- for (i = 0; i < txdr->count; i++) { +- if (txdr->buffer_info[i].dma) +- pci_unmap_single(pdev, txdr->buffer_info[i].dma, +- txdr->buffer_info[i].length, ++ if (tx_ring->desc && tx_ring->buffer_info) { ++ for (i = 0; i < tx_ring->count; i++) { ++ if (tx_ring->buffer_info[i].dma) ++ pci_unmap_single(pdev, tx_ring->buffer_info[i].dma, ++ tx_ring->buffer_info[i].length, + PCI_DMA_TODEVICE); +- if (txdr->buffer_info[i].skb) +- dev_kfree_skb(txdr->buffer_info[i].skb); ++ if (tx_ring->buffer_info[i].skb) ++ dev_kfree_skb(tx_ring->buffer_info[i].skb); + } + } + +- if (rxdr->desc && rxdr->buffer_info) { +- for (i = 0; i < rxdr->count; i++) { +- if (rxdr->buffer_info[i].dma) +- pci_unmap_single(pdev, rxdr->buffer_info[i].dma, +- rxdr->buffer_info[i].length, ++ if (rx_ring->desc && rx_ring->buffer_info) { ++ for (i = 0; i < rx_ring->count; i++) { ++ if (rx_ring->buffer_info[i].dma) ++ pci_unmap_single(pdev, rx_ring->buffer_info[i].dma, ++ E1000_RXBUFFER_2048, + PCI_DMA_FROMDEVICE); +- if (rxdr->buffer_info[i].skb) +- dev_kfree_skb(rxdr->buffer_info[i].skb); ++ if (rx_ring->buffer_info[i].skb) ++ dev_kfree_skb(rx_ring->buffer_info[i].skb); + } + } + +- if (txdr->desc) { +- pci_free_consistent(pdev, txdr->size, txdr->desc, txdr->dma); +- txdr->desc = NULL; ++ if (tx_ring->desc) { ++ pci_free_consistent(pdev, tx_ring->size, tx_ring->desc, tx_ring->dma); ++ tx_ring->desc = NULL; + } +- if (rxdr->desc) { +- pci_free_consistent(pdev, rxdr->size, rxdr->desc, rxdr->dma); +- rxdr->desc = NULL; ++ if (rx_ring->desc) { ++ pci_free_consistent(pdev, rx_ring->size, rx_ring->desc, rx_ring->dma); ++ rx_ring->desc = NULL; + } + +- kfree(txdr->buffer_info); +- txdr->buffer_info = NULL; +- kfree(rxdr->buffer_info); +- rxdr->buffer_info = NULL; ++ kfree(tx_ring->buffer_info); ++ tx_ring->buffer_info = NULL; ++ kfree(rx_ring->buffer_info); ++ rx_ring->buffer_info = NULL; + + return; + } + + static int e1000_setup_desc_rings(struct e1000_adapter *adapter) + { +- struct e1000_hw *hw = &adapter->hw; +- struct e1000_tx_ring *txdr = &adapter->test_tx_ring; +- struct e1000_rx_ring *rxdr = &adapter->test_rx_ring; ++ struct e1000_tx_ring *tx_ring = &adapter->test_tx_ring; ++ struct e1000_rx_ring *rx_ring = &adapter->test_rx_ring; + struct pci_dev *pdev = adapter->pdev; + u32 rctl; + int i, ret_val; + + /* Setup Tx descriptor ring and Tx buffers */ + +- if (!txdr->count) +- txdr->count = E1000_DEFAULT_TXD; ++ if (!tx_ring->count) ++ tx_ring->count = E1000_DEFAULT_TXD; + +- txdr->buffer_info = kcalloc(txdr->count, sizeof(struct e1000_buffer), +- GFP_KERNEL); +- if (!txdr->buffer_info) { ++ if (!(tx_ring->buffer_info = kcalloc(tx_ring->count, ++ sizeof(struct e1000_buffer), ++ GFP_KERNEL))) { + ret_val = 1; + goto err_nomem; + } + +- txdr->size = txdr->count * sizeof(struct e1000_tx_desc); +- txdr->size = ALIGN(txdr->size, 4096); +- txdr->desc = pci_alloc_consistent(pdev, txdr->size, &txdr->dma); +- if (!txdr->desc) { ++ tx_ring->size = tx_ring->count * sizeof(struct e1000_tx_desc); ++ tx_ring->size = ALIGN(tx_ring->size, 4096); ++ if (!(tx_ring->desc = pci_alloc_consistent(pdev, tx_ring->size, ++ &tx_ring->dma))) { + ret_val = 2; + goto err_nomem; + } +- memset(txdr->desc, 0, txdr->size); +- txdr->next_to_use = txdr->next_to_clean = 0; ++ tx_ring->next_to_use = tx_ring->next_to_clean = 0; + +- ew32(TDBAL, ((u64)txdr->dma & 0x00000000FFFFFFFF)); +- ew32(TDBAH, ((u64)txdr->dma >> 32)); +- ew32(TDLEN, txdr->count * sizeof(struct e1000_tx_desc)); +- ew32(TDH, 0); +- ew32(TDT, 0); +- ew32(TCTL, E1000_TCTL_PSP | E1000_TCTL_EN | +- E1000_COLLISION_THRESHOLD << E1000_CT_SHIFT | +- E1000_FDX_COLLISION_DISTANCE << E1000_COLD_SHIFT); ++ E1000_WRITE_REG(&adapter->hw, E1000_TDBAL(0), ++ ((u64) tx_ring->dma & 0x00000000FFFFFFFF)); ++ E1000_WRITE_REG(&adapter->hw, E1000_TDBAH(0), ((u64) tx_ring->dma >> 32)); ++ E1000_WRITE_REG(&adapter->hw, E1000_TDLEN(0), ++ tx_ring->count * sizeof(struct e1000_tx_desc)); ++ E1000_WRITE_REG(&adapter->hw, E1000_TDH(0), 0); ++ E1000_WRITE_REG(&adapter->hw, E1000_TDT(0), 0); ++ E1000_WRITE_REG(&adapter->hw, E1000_TCTL, ++ E1000_TCTL_MULR | ++ E1000_TCTL_PSP | E1000_TCTL_EN | ++ E1000_COLLISION_THRESHOLD << E1000_CT_SHIFT | ++ E1000_COLLISION_DISTANCE << E1000_COLD_SHIFT); + +- for (i = 0; i < txdr->count; i++) { +- struct e1000_tx_desc *tx_desc = E1000_TX_DESC(*txdr, i); ++ for (i = 0; i < tx_ring->count; i++) { ++ struct e1000_tx_desc *tx_desc = E1000_TX_DESC(*tx_ring, i); + struct sk_buff *skb; + unsigned int size = 1024; + +- skb = alloc_skb(size, GFP_KERNEL); +- if (!skb) { ++ if (!(skb = alloc_skb(size, GFP_KERNEL))) { + ret_val = 3; + goto err_nomem; + } + skb_put(skb, size); +- txdr->buffer_info[i].skb = skb; +- txdr->buffer_info[i].length = skb->len; +- txdr->buffer_info[i].dma = ++ tx_ring->buffer_info[i].skb = skb; ++ tx_ring->buffer_info[i].length = skb->len; ++ tx_ring->buffer_info[i].dma = + pci_map_single(pdev, skb->data, skb->len, + PCI_DMA_TODEVICE); +- tx_desc->buffer_addr = cpu_to_le64(txdr->buffer_info[i].dma); ++ tx_desc->buffer_addr = cpu_to_le64(tx_ring->buffer_info[i].dma); + tx_desc->lower.data = cpu_to_le32(skb->len); + tx_desc->lower.data |= cpu_to_le32(E1000_TXD_CMD_EOP | +- E1000_TXD_CMD_IFCS | +- E1000_TXD_CMD_RPS); ++ E1000_TXD_CMD_IFCS); ++ if (adapter->hw.mac.type < e1000_82543) ++ tx_desc->lower.data |= E1000_TXD_CMD_RPS; ++ else ++ tx_desc->lower.data |= E1000_TXD_CMD_RS; ++ + tx_desc->upper.data = 0; + } + + /* Setup Rx descriptor ring and Rx buffers */ + +- if (!rxdr->count) +- rxdr->count = E1000_DEFAULT_RXD; ++ if (!rx_ring->count) ++ rx_ring->count = E1000_DEFAULT_RXD; + +- rxdr->buffer_info = kcalloc(rxdr->count, sizeof(struct e1000_buffer), +- GFP_KERNEL); +- if (!rxdr->buffer_info) { ++ if (!(rx_ring->buffer_info = kcalloc(rx_ring->count, ++ sizeof(struct e1000_rx_buffer), ++ GFP_KERNEL))) { + ret_val = 4; + goto err_nomem; + } + +- rxdr->size = rxdr->count * sizeof(struct e1000_rx_desc); +- rxdr->desc = pci_alloc_consistent(pdev, rxdr->size, &rxdr->dma); +- if (!rxdr->desc) { ++ rx_ring->size = rx_ring->count * sizeof(struct e1000_rx_desc); ++ if (!(rx_ring->desc = pci_alloc_consistent(pdev, rx_ring->size, ++ &rx_ring->dma))) { + ret_val = 5; + goto err_nomem; + } +- memset(rxdr->desc, 0, rxdr->size); +- rxdr->next_to_use = rxdr->next_to_clean = 0; ++ rx_ring->next_to_use = rx_ring->next_to_clean = 0; + +- rctl = er32(RCTL); +- ew32(RCTL, rctl & ~E1000_RCTL_EN); +- ew32(RDBAL, ((u64)rxdr->dma & 0xFFFFFFFF)); +- ew32(RDBAH, ((u64)rxdr->dma >> 32)); +- ew32(RDLEN, rxdr->size); +- ew32(RDH, 0); +- ew32(RDT, 0); ++ rctl = E1000_READ_REG(&adapter->hw, E1000_RCTL); ++ E1000_WRITE_REG(&adapter->hw, E1000_RCTL, rctl & ~E1000_RCTL_EN); ++ E1000_WRITE_REG(&adapter->hw, E1000_RDBAL(0), ++ ((u64) rx_ring->dma & 0xFFFFFFFF)); ++ E1000_WRITE_REG(&adapter->hw, E1000_RDBAH(0), ((u64) rx_ring->dma >> 32)); ++ E1000_WRITE_REG(&adapter->hw, E1000_RDLEN(0), rx_ring->size); ++ E1000_WRITE_REG(&adapter->hw, E1000_RDH(0), 0); ++ E1000_WRITE_REG(&adapter->hw, E1000_RDT(0), 0); + rctl = E1000_RCTL_EN | E1000_RCTL_BAM | E1000_RCTL_SZ_2048 | + E1000_RCTL_LBM_NO | E1000_RCTL_RDMTS_HALF | +- (hw->mc_filter_type << E1000_RCTL_MO_SHIFT); +- ew32(RCTL, rctl); ++ (adapter->hw.mac.mc_filter_type << E1000_RCTL_MO_SHIFT); ++ E1000_WRITE_REG(&adapter->hw, E1000_RCTL, rctl); + +- for (i = 0; i < rxdr->count; i++) { +- struct e1000_rx_desc *rx_desc = E1000_RX_DESC(*rxdr, i); ++ for (i = 0; i < rx_ring->count; i++) { ++ struct e1000_rx_desc *rx_desc = E1000_RX_DESC(*rx_ring, i); + struct sk_buff *skb; + +- skb = alloc_skb(E1000_RXBUFFER_2048 + NET_IP_ALIGN, GFP_KERNEL); +- if (!skb) { ++ if (!(skb = alloc_skb(E1000_RXBUFFER_2048 + NET_IP_ALIGN, ++ GFP_KERNEL))) { + ret_val = 6; + goto err_nomem; + } + skb_reserve(skb, NET_IP_ALIGN); +- rxdr->buffer_info[i].skb = skb; +- rxdr->buffer_info[i].length = E1000_RXBUFFER_2048; +- rxdr->buffer_info[i].dma = ++ rx_ring->buffer_info[i].skb = skb; ++ rx_ring->buffer_info[i].dma = + pci_map_single(pdev, skb->data, E1000_RXBUFFER_2048, + PCI_DMA_FROMDEVICE); +- rx_desc->buffer_addr = cpu_to_le64(rxdr->buffer_info[i].dma); ++ rx_desc->buffer_addr = cpu_to_le64(rx_ring->buffer_info[i].dma); + memset(skb->data, 0x00, skb->len); + } + +@@ -1173,72 +1170,68 @@ + + static void e1000_phy_disable_receiver(struct e1000_adapter *adapter) + { +- struct e1000_hw *hw = &adapter->hw; +- + /* Write out to PHY registers 29 and 30 to disable the Receiver. */ +- e1000_write_phy_reg(hw, 29, 0x001F); +- e1000_write_phy_reg(hw, 30, 0x8FFC); +- e1000_write_phy_reg(hw, 29, 0x001A); +- e1000_write_phy_reg(hw, 30, 0x8FF0); ++ e1000_write_phy_reg(&adapter->hw, 29, 0x001F); ++ e1000_write_phy_reg(&adapter->hw, 30, 0x8FFC); ++ e1000_write_phy_reg(&adapter->hw, 29, 0x001A); ++ e1000_write_phy_reg(&adapter->hw, 30, 0x8FF0); + } + + static void e1000_phy_reset_clk_and_crs(struct e1000_adapter *adapter) + { +- struct e1000_hw *hw = &adapter->hw; + u16 phy_reg; + + /* Because we reset the PHY above, we need to re-force TX_CLK in the + * Extended PHY Specific Control Register to 25MHz clock. This + * value defaults back to a 2.5MHz clock when the PHY is reset. + */ +- e1000_read_phy_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL, &phy_reg); ++ e1000_read_phy_reg(&adapter->hw, M88E1000_EXT_PHY_SPEC_CTRL, &phy_reg); + phy_reg |= M88E1000_EPSCR_TX_CLK_25; +- e1000_write_phy_reg(hw, ++ e1000_write_phy_reg(&adapter->hw, + M88E1000_EXT_PHY_SPEC_CTRL, phy_reg); + + /* In addition, because of the s/w reset above, we need to enable + * CRS on TX. This must be set for both full and half duplex + * operation. + */ +- e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, &phy_reg); ++ e1000_read_phy_reg(&adapter->hw, M88E1000_PHY_SPEC_CTRL, &phy_reg); + phy_reg |= M88E1000_PSCR_ASSERT_CRS_ON_TX; +- e1000_write_phy_reg(hw, ++ e1000_write_phy_reg(&adapter->hw, + M88E1000_PHY_SPEC_CTRL, phy_reg); + } + + static int e1000_nonintegrated_phy_loopback(struct e1000_adapter *adapter) + { +- struct e1000_hw *hw = &adapter->hw; + u32 ctrl_reg; + u16 phy_reg; + + /* Setup the Device Control Register for PHY loopback test. */ + +- ctrl_reg = er32(CTRL); ++ ctrl_reg = E1000_READ_REG(&adapter->hw, E1000_CTRL); + ctrl_reg |= (E1000_CTRL_ILOS | /* Invert Loss-Of-Signal */ + E1000_CTRL_FRCSPD | /* Set the Force Speed Bit */ + E1000_CTRL_FRCDPX | /* Set the Force Duplex Bit */ + E1000_CTRL_SPD_1000 | /* Force Speed to 1000 */ + E1000_CTRL_FD); /* Force Duplex to FULL */ + +- ew32(CTRL, ctrl_reg); ++ E1000_WRITE_REG(&adapter->hw, E1000_CTRL, ctrl_reg); + + /* Read the PHY Specific Control Register (0x10) */ +- e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, &phy_reg); ++ e1000_read_phy_reg(&adapter->hw, M88E1000_PHY_SPEC_CTRL, &phy_reg); + + /* Clear Auto-Crossover bits in PHY Specific Control Register + * (bits 6:5). + */ + phy_reg &= ~M88E1000_PSCR_AUTO_X_MODE; +- e1000_write_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, phy_reg); ++ e1000_write_phy_reg(&adapter->hw, M88E1000_PHY_SPEC_CTRL, phy_reg); + + /* Perform software reset on the PHY */ +- e1000_phy_reset(hw); ++ e1000_phy_commit(&adapter->hw); + + /* Have to setup TX_CLK and TX_CRS after software reset */ + e1000_phy_reset_clk_and_crs(adapter); + +- e1000_write_phy_reg(hw, PHY_CTRL, 0x8100); ++ e1000_write_phy_reg(&adapter->hw, PHY_CONTROL, 0x8100); + + /* Wait for reset to complete. */ + udelay(500); +@@ -1250,23 +1243,23 @@ + e1000_phy_disable_receiver(adapter); + + /* Set the loopback bit in the PHY control register. */ +- e1000_read_phy_reg(hw, PHY_CTRL, &phy_reg); ++ e1000_read_phy_reg(&adapter->hw, PHY_CONTROL, &phy_reg); + phy_reg |= MII_CR_LOOPBACK; +- e1000_write_phy_reg(hw, PHY_CTRL, phy_reg); ++ e1000_write_phy_reg(&adapter->hw, PHY_CONTROL, phy_reg); + + /* Setup TX_CLK and TX_CRS one more time. */ + e1000_phy_reset_clk_and_crs(adapter); + + /* Check Phy Configuration */ +- e1000_read_phy_reg(hw, PHY_CTRL, &phy_reg); ++ e1000_read_phy_reg(&adapter->hw, PHY_CONTROL, &phy_reg); + if (phy_reg != 0x4100) + return 9; + +- e1000_read_phy_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL, &phy_reg); ++ e1000_read_phy_reg(&adapter->hw, M88E1000_EXT_PHY_SPEC_CTRL, &phy_reg); + if (phy_reg != 0x0070) + return 10; + +- e1000_read_phy_reg(hw, 29, &phy_reg); ++ e1000_read_phy_reg(&adapter->hw, 29, &phy_reg); + if (phy_reg != 0x001A) + return 11; + +@@ -1275,30 +1268,29 @@ + + static int e1000_integrated_phy_loopback(struct e1000_adapter *adapter) + { +- struct e1000_hw *hw = &adapter->hw; + u32 ctrl_reg = 0; + u32 stat_reg = 0; + +- hw->autoneg = false; ++ adapter->hw.mac.autoneg = FALSE; + +- if (hw->phy_type == e1000_phy_m88) { ++ if (adapter->hw.phy.type == e1000_phy_m88) { + /* Auto-MDI/MDIX Off */ +- e1000_write_phy_reg(hw, ++ e1000_write_phy_reg(&adapter->hw, + M88E1000_PHY_SPEC_CTRL, 0x0808); + /* reset to update Auto-MDI/MDIX */ +- e1000_write_phy_reg(hw, PHY_CTRL, 0x9140); ++ e1000_write_phy_reg(&adapter->hw, PHY_CONTROL, 0x9140); + /* autoneg off */ +- e1000_write_phy_reg(hw, PHY_CTRL, 0x8140); +- } else if (hw->phy_type == e1000_phy_gg82563) +- e1000_write_phy_reg(hw, ++ e1000_write_phy_reg(&adapter->hw, PHY_CONTROL, 0x8140); ++ } else if (adapter->hw.phy.type == e1000_phy_gg82563) ++ e1000_write_phy_reg(&adapter->hw, + GG82563_PHY_KMRN_MODE_CTRL, + 0x1CC); + +- ctrl_reg = er32(CTRL); ++ ctrl_reg = E1000_READ_REG(&adapter->hw, E1000_CTRL); + +- if (hw->phy_type == e1000_phy_ife) { ++ if (adapter->hw.phy.type == e1000_phy_ife) { + /* force 100, set loopback */ +- e1000_write_phy_reg(hw, PHY_CTRL, 0x6100); ++ e1000_write_phy_reg(&adapter->hw, PHY_CONTROL, 0x6100); + + /* Now set up the MAC to the same speed/duplex as the PHY. */ + ctrl_reg &= ~E1000_CTRL_SPD_SEL; /* Clear the speed sel bits */ +@@ -1308,10 +1300,10 @@ + E1000_CTRL_FD); /* Force Duplex to FULL */ + } else { + /* force 1000, set loopback */ +- e1000_write_phy_reg(hw, PHY_CTRL, 0x4140); ++ e1000_write_phy_reg(&adapter->hw, PHY_CONTROL, 0x4140); + + /* Now set up the MAC to the same speed/duplex as the PHY. */ +- ctrl_reg = er32(CTRL); ++ ctrl_reg = E1000_READ_REG(&adapter->hw, E1000_CTRL); + ctrl_reg &= ~E1000_CTRL_SPD_SEL; /* Clear the speed sel bits */ + ctrl_reg |= (E1000_CTRL_FRCSPD | /* Set the Force Speed Bit */ + E1000_CTRL_FRCDPX | /* Set the Force Duplex Bit */ +@@ -1319,23 +1311,23 @@ + E1000_CTRL_FD); /* Force Duplex to FULL */ + } + +- if (hw->media_type == e1000_media_type_copper && +- hw->phy_type == e1000_phy_m88) ++ if (adapter->hw.phy.media_type == e1000_media_type_copper && ++ adapter->hw.phy.type == e1000_phy_m88) { + ctrl_reg |= E1000_CTRL_ILOS; /* Invert Loss of Signal */ +- else { +- /* Set the ILOS bit on the fiber Nic is half +- * duplex link is detected. */ +- stat_reg = er32(STATUS); ++ } else { ++ /* Set the ILOS bit on the fiber Nic if half duplex link is ++ * detected. */ ++ stat_reg = E1000_READ_REG(&adapter->hw, E1000_STATUS); + if ((stat_reg & E1000_STATUS_FD) == 0) + ctrl_reg |= (E1000_CTRL_ILOS | E1000_CTRL_SLU); + } + +- ew32(CTRL, ctrl_reg); ++ E1000_WRITE_REG(&adapter->hw, E1000_CTRL, ctrl_reg); + + /* Disable the receiver on the PHY so when a cable is plugged in, the + * PHY does not begin to autoneg when a cable is reconnected to the NIC. + */ +- if (hw->phy_type == e1000_phy_m88) ++ if (adapter->hw.phy.type == e1000_phy_m88) + e1000_phy_disable_receiver(adapter); + + udelay(500); +@@ -1345,13 +1337,12 @@ + + static int e1000_set_phy_loopback(struct e1000_adapter *adapter) + { +- struct e1000_hw *hw = &adapter->hw; + u16 phy_reg = 0; + u16 count = 0; + +- switch (hw->mac_type) { ++ switch (adapter->hw.mac.type) { + case e1000_82543: +- if (hw->media_type == e1000_media_type_copper) { ++ if (adapter->hw.phy.media_type == e1000_media_type_copper) { + /* Attempt to setup Loopback mode on Non-integrated PHY. + * Some PHY registers get corrupted at random, so + * attempt this 10 times. +@@ -1373,11 +1364,6 @@ + case e1000_82541_rev_2: + case e1000_82547: + case e1000_82547_rev_2: +- case e1000_82571: +- case e1000_82572: +- case e1000_82573: +- case e1000_80003es2lan: +- case e1000_ich8lan: + return e1000_integrated_phy_loopback(adapter); + break; + +@@ -1385,9 +1371,9 @@ + /* Default PHY loopback work is to read the MII + * control register and assert bit 14 (loopback mode). + */ +- e1000_read_phy_reg(hw, PHY_CTRL, &phy_reg); ++ e1000_read_phy_reg(&adapter->hw, PHY_CONTROL, &phy_reg); + phy_reg |= MII_CR_LOOPBACK; +- e1000_write_phy_reg(hw, PHY_CTRL, phy_reg); ++ e1000_write_phy_reg(&adapter->hw, PHY_CONTROL, phy_reg); + return 0; + break; + } +@@ -1400,30 +1386,22 @@ + struct e1000_hw *hw = &adapter->hw; + u32 rctl; + +- if (hw->media_type == e1000_media_type_fiber || +- hw->media_type == e1000_media_type_internal_serdes) { +- switch (hw->mac_type) { ++ if (hw->phy.media_type == e1000_media_type_fiber || ++ hw->phy.media_type == e1000_media_type_internal_serdes) { ++ switch (hw->mac.type) { + case e1000_82545: + case e1000_82546: + case e1000_82545_rev_3: + case e1000_82546_rev_3: + return e1000_set_phy_loopback(adapter); + break; +- case e1000_82571: +- case e1000_82572: +-#define E1000_SERDES_LB_ON 0x410 +- e1000_set_phy_loopback(adapter); +- ew32(SCTL, E1000_SERDES_LB_ON); +- msleep(10); +- return 0; +- break; + default: +- rctl = er32(RCTL); ++ rctl = E1000_READ_REG(hw, E1000_RCTL); + rctl |= E1000_RCTL_LBM_TCVR; +- ew32(RCTL, rctl); ++ E1000_WRITE_REG(hw, E1000_RCTL, rctl); + return 0; + } +- } else if (hw->media_type == e1000_media_type_copper) ++ } else if (hw->phy.media_type == e1000_media_type_copper) + return e1000_set_phy_loopback(adapter); + + return 7; +@@ -1435,43 +1413,23 @@ + u32 rctl; + u16 phy_reg; + +- rctl = er32(RCTL); ++ rctl = E1000_READ_REG(hw, E1000_RCTL); + rctl &= ~(E1000_RCTL_LBM_TCVR | E1000_RCTL_LBM_MAC); +- ew32(RCTL, rctl); ++ E1000_WRITE_REG(hw, E1000_RCTL, rctl); + +- switch (hw->mac_type) { +- case e1000_82571: +- case e1000_82572: +- if (hw->media_type == e1000_media_type_fiber || +- hw->media_type == e1000_media_type_internal_serdes) { +-#define E1000_SERDES_LB_OFF 0x400 +- ew32(SCTL, E1000_SERDES_LB_OFF); +- msleep(10); +- break; +- } +- /* Fall Through */ +- case e1000_82545: +- case e1000_82546: +- case e1000_82545_rev_3: +- case e1000_82546_rev_3: +- default: +- hw->autoneg = true; +- if (hw->phy_type == e1000_phy_gg82563) +- e1000_write_phy_reg(hw, +- GG82563_PHY_KMRN_MODE_CTRL, +- 0x180); +- e1000_read_phy_reg(hw, PHY_CTRL, &phy_reg); +- if (phy_reg & MII_CR_LOOPBACK) { +- phy_reg &= ~MII_CR_LOOPBACK; +- e1000_write_phy_reg(hw, PHY_CTRL, phy_reg); +- e1000_phy_reset(hw); +- } +- break; ++ hw->mac.autoneg = TRUE; ++ if (hw->phy.type == e1000_phy_gg82563) ++ e1000_write_phy_reg(hw, GG82563_PHY_KMRN_MODE_CTRL, 0x180); ++ e1000_read_phy_reg(hw, PHY_CONTROL, &phy_reg); ++ if (phy_reg & MII_CR_LOOPBACK) { ++ phy_reg &= ~MII_CR_LOOPBACK; ++ e1000_write_phy_reg(hw, PHY_CONTROL, phy_reg); ++ e1000_phy_commit(hw); + } + } + + static void e1000_create_lbtest_frame(struct sk_buff *skb, +- unsigned int frame_size) ++ unsigned int frame_size) + { + memset(skb->data, 0xFF, frame_size); + frame_size &= ~1; +@@ -1480,8 +1438,7 @@ + memset(&skb->data[frame_size / 2 + 12], 0xAF, 1); + } + +-static int e1000_check_lbtest_frame(struct sk_buff *skb, +- unsigned int frame_size) ++static int e1000_check_lbtest_frame(struct sk_buff *skb, unsigned int frame_size) + { + frame_size &= ~1; + if (*(skb->data + 3) == 0xFF) { +@@ -1495,52 +1452,51 @@ + + static int e1000_run_loopback_test(struct e1000_adapter *adapter) + { +- struct e1000_hw *hw = &adapter->hw; +- struct e1000_tx_ring *txdr = &adapter->test_tx_ring; +- struct e1000_rx_ring *rxdr = &adapter->test_rx_ring; ++ struct e1000_tx_ring *tx_ring = &adapter->test_tx_ring; ++ struct e1000_rx_ring *rx_ring = &adapter->test_rx_ring; + struct pci_dev *pdev = adapter->pdev; + int i, j, k, l, lc, good_cnt, ret_val=0; + unsigned long time; + +- ew32(RDT, rxdr->count - 1); ++ E1000_WRITE_REG(&adapter->hw, E1000_RDT(0), rx_ring->count - 1); + + /* Calculate the loop count based on the largest descriptor ring + * The idea is to wrap the largest ring a number of times using 64 + * send/receive pairs during each loop + */ + +- if (rxdr->count <= txdr->count) +- lc = ((txdr->count / 64) * 2) + 1; ++ if (rx_ring->count <= tx_ring->count) ++ lc = ((tx_ring->count / 64) * 2) + 1; + else +- lc = ((rxdr->count / 64) * 2) + 1; ++ lc = ((rx_ring->count / 64) * 2) + 1; + + k = l = 0; + for (j = 0; j <= lc; j++) { /* loop count loop */ + for (i = 0; i < 64; i++) { /* send the packets */ +- e1000_create_lbtest_frame(txdr->buffer_info[i].skb, ++ e1000_create_lbtest_frame(tx_ring->buffer_info[k].skb, + 1024); + pci_dma_sync_single_for_device(pdev, +- txdr->buffer_info[k].dma, +- txdr->buffer_info[k].length, ++ tx_ring->buffer_info[k].dma, ++ tx_ring->buffer_info[k].length, + PCI_DMA_TODEVICE); +- if (unlikely(++k == txdr->count)) k = 0; ++ if (unlikely(++k == tx_ring->count)) k = 0; + } +- ew32(TDT, k); ++ E1000_WRITE_REG(&adapter->hw, E1000_TDT(0), k); + msleep(200); + time = jiffies; /* set the start time for the receive */ + good_cnt = 0; + do { /* receive the sent packets */ + pci_dma_sync_single_for_cpu(pdev, +- rxdr->buffer_info[l].dma, +- rxdr->buffer_info[l].length, +- PCI_DMA_FROMDEVICE); ++ rx_ring->buffer_info[l].dma, ++ E1000_RXBUFFER_2048, ++ PCI_DMA_FROMDEVICE); + + ret_val = e1000_check_lbtest_frame( +- rxdr->buffer_info[l].skb, ++ rx_ring->buffer_info[l].skb, + 1024); + if (!ret_val) + good_cnt++; +- if (unlikely(++l == rxdr->count)) l = 0; ++ if (unlikely(++l == rx_ring->count)) l = 0; + /* time + 20 msecs (200 msecs on 2.4) is more than + * enough time to complete the receives, if it's + * exceeded, break and error off +@@ -1550,7 +1506,7 @@ + ret_val = 13; /* ret_val is the same as mis-compare */ + break; + } +- if (jiffies >= (time + 2)) { ++ if (jiffies >= (time + 20)) { + ret_val = 14; /* error code for time out error */ + break; + } +@@ -1560,22 +1516,18 @@ + + static int e1000_loopback_test(struct e1000_adapter *adapter, u64 *data) + { +- struct e1000_hw *hw = &adapter->hw; +- + /* PHY loopback cannot be performed if SoL/IDER + * sessions are active */ +- if (e1000_check_phy_reset_block(hw)) { ++ if (e1000_check_reset_block(&adapter->hw)) { + DPRINTK(DRV, ERR, "Cannot do PHY loopback test " + "when SoL/IDER is active.\n"); + *data = 0; + goto out; + } + +- *data = e1000_setup_desc_rings(adapter); +- if (*data) ++ if ((*data = e1000_setup_desc_rings(adapter))) + goto out; +- *data = e1000_setup_loopback_test(adapter); +- if (*data) ++ if ((*data = e1000_setup_loopback_test(adapter))) + goto err_loopback; + *data = e1000_run_loopback_test(adapter); + e1000_loopback_cleanup(adapter); +@@ -1588,61 +1540,54 @@ + + static int e1000_link_test(struct e1000_adapter *adapter, u64 *data) + { +- struct e1000_hw *hw = &adapter->hw; + *data = 0; +- if (hw->media_type == e1000_media_type_internal_serdes) { ++ if (adapter->hw.phy.media_type == e1000_media_type_internal_serdes) { + int i = 0; +- hw->serdes_link_down = true; ++ adapter->hw.mac.serdes_has_link = FALSE; + + /* On some blade server designs, link establishment + * could take as long as 2-3 minutes */ + do { +- e1000_check_for_link(hw); +- if (!hw->serdes_link_down) ++ e1000_check_for_link(&adapter->hw); ++ if (adapter->hw.mac.serdes_has_link == TRUE) + return *data; + msleep(20); + } while (i++ < 3750); + + *data = 1; + } else { +- e1000_check_for_link(hw); +- if (hw->autoneg) /* if auto_neg is set wait for it */ ++ e1000_check_for_link(&adapter->hw); ++ if (adapter->hw.mac.autoneg) + msleep(4000); + +- if (!(er32(STATUS) & E1000_STATUS_LU)) { ++ if (!(E1000_READ_REG(&adapter->hw, E1000_STATUS) & E1000_STATUS_LU)) { + *data = 1; + } + } + return *data; + } + +-static int e1000_get_sset_count(struct net_device *netdev, int sset) ++static int e1000_diag_test_count(struct net_device *netdev) + { +- switch (sset) { +- case ETH_SS_TEST: +- return E1000_TEST_LEN; +- case ETH_SS_STATS: +- return E1000_STATS_LEN; +- default: +- return -EOPNOTSUPP; +- } ++ return E1000_TEST_LEN; + } + + static void e1000_diag_test(struct net_device *netdev, +- struct ethtool_test *eth_test, u64 *data) ++ struct ethtool_test *eth_test, u64 *data) + { + struct e1000_adapter *adapter = netdev_priv(netdev); +- struct e1000_hw *hw = &adapter->hw; ++ u16 autoneg_advertised; ++ u8 forced_speed_duplex, autoneg; + bool if_running = netif_running(netdev); + +- set_bit(__E1000_TESTING, &adapter->flags); ++ set_bit(__E1000_TESTING, &adapter->state); + if (eth_test->flags == ETH_TEST_FL_OFFLINE) { + /* Offline tests */ + + /* save speed, duplex, autoneg settings */ +- u16 autoneg_advertised = hw->autoneg_advertised; +- u8 forced_speed_duplex = hw->forced_speed_duplex; +- u8 autoneg = hw->autoneg; ++ autoneg_advertised = adapter->hw.phy.autoneg_advertised; ++ forced_speed_duplex = adapter->hw.mac.forced_speed_duplex; ++ autoneg = adapter->hw.mac.autoneg; + + DPRINTK(HW, INFO, "offline testing starting\n"); + +@@ -1670,17 +1615,22 @@ + + e1000_reset(adapter); + /* make sure the phy is powered up */ +- e1000_power_up_phy(adapter); ++ if (adapter->hw.phy.media_type == e1000_media_type_copper) ++ e1000_power_up_phy(&adapter->hw); + if (e1000_loopback_test(adapter, &data[3])) + eth_test->flags |= ETH_TEST_FL_FAILED; + + /* restore speed, duplex, autoneg settings */ +- hw->autoneg_advertised = autoneg_advertised; +- hw->forced_speed_duplex = forced_speed_duplex; +- hw->autoneg = autoneg; ++ adapter->hw.phy.autoneg_advertised = autoneg_advertised; ++ adapter->hw.mac.forced_speed_duplex = forced_speed_duplex; ++ adapter->hw.mac.autoneg = autoneg; + ++ /* force this routine to wait until autoneg complete/timeout */ ++ adapter->hw.phy.autoneg_wait_to_complete = TRUE; + e1000_reset(adapter); +- clear_bit(__E1000_TESTING, &adapter->flags); ++ adapter->hw.phy.autoneg_wait_to_complete = FALSE; ++ ++ clear_bit(__E1000_TESTING, &adapter->state); + if (if_running) + dev_open(netdev); + } else { +@@ -1695,13 +1645,13 @@ + data[2] = 0; + data[3] = 0; + +- clear_bit(__E1000_TESTING, &adapter->flags); ++ clear_bit(__E1000_TESTING, &adapter->state); + } + msleep_interruptible(4 * 1000); + } + + static int e1000_wol_exclusion(struct e1000_adapter *adapter, +- struct ethtool_wolinfo *wol) ++ struct ethtool_wolinfo *wol) + { + struct e1000_hw *hw = &adapter->hw; + int retval = 1; /* fail by default */ +@@ -1716,30 +1666,22 @@ + case E1000_DEV_ID_82545EM_COPPER: + case E1000_DEV_ID_82546GB_QUAD_COPPER: + case E1000_DEV_ID_82546GB_PCIE: +- case E1000_DEV_ID_82571EB_SERDES_QUAD: + /* these don't support WoL at all */ + wol->supported = 0; + break; + case E1000_DEV_ID_82546EB_FIBER: + case E1000_DEV_ID_82546GB_FIBER: +- case E1000_DEV_ID_82571EB_FIBER: +- case E1000_DEV_ID_82571EB_SERDES: +- case E1000_DEV_ID_82571EB_COPPER: + /* Wake events not supported on port B */ +- if (er32(STATUS) & E1000_STATUS_FUNC_1) { ++ if (E1000_READ_REG(hw, E1000_STATUS) & E1000_STATUS_FUNC_1) { + wol->supported = 0; + break; + } + /* return success for non excluded adapter ports */ + retval = 0; + break; +- case E1000_DEV_ID_82571EB_QUAD_COPPER: +- case E1000_DEV_ID_82571EB_QUAD_FIBER: +- case E1000_DEV_ID_82571EB_QUAD_COPPER_LOWPROFILE: +- case E1000_DEV_ID_82571PT_QUAD_COPPER: + case E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3: + /* quad port adapters only support WoL on port A */ +- if (!adapter->quad_port_a) { ++ if (!(adapter->flags & E1000_FLAG_QUAD_PORT_A)) { + wol->supported = 0; + break; + } +@@ -1750,7 +1692,7 @@ + /* dual port cards only support WoL on port A from now on + * unless it was enabled in the eeprom for port B + * so exclude FUNC_1 ports from having WoL enabled */ +- if (er32(STATUS) & E1000_STATUS_FUNC_1 && ++ if (E1000_READ_REG(hw, E1000_STATUS) & E1000_STATUS_FUNC_1 && + !adapter->eeprom_wol) { + wol->supported = 0; + break; +@@ -1763,10 +1705,9 @@ + } + + static void e1000_get_wol(struct net_device *netdev, +- struct ethtool_wolinfo *wol) ++ struct ethtool_wolinfo *wol) + { + struct e1000_adapter *adapter = netdev_priv(netdev); +- struct e1000_hw *hw = &adapter->hw; + + wol->supported = WAKE_UCAST | WAKE_MCAST | + WAKE_BCAST | WAKE_MAGIC; +@@ -1774,14 +1715,13 @@ + + /* this function will set ->supported = 0 and return 1 if wol is not + * supported by this hardware */ +- if (e1000_wol_exclusion(adapter, wol) || +- !device_can_wakeup(&adapter->pdev->dev)) ++ if (e1000_wol_exclusion(adapter, wol)) + return; + + /* apply any specific unsupported masks here */ +- switch (hw->device_id) { ++ switch (adapter->hw.device_id) { + case E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3: +- /* KSP3 does not suppport UCAST wake-ups */ ++ /* KSP3 does not support UCAST wake-ups */ + wol->supported &= ~WAKE_UCAST; + + if (adapter->wol & E1000_WUFC_EX) +@@ -1804,7 +1744,8 @@ + return; + } + +-static int e1000_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol) ++static int e1000_set_wol(struct net_device *netdev, ++ struct ethtool_wolinfo *wol) + { + struct e1000_adapter *adapter = netdev_priv(netdev); + struct e1000_hw *hw = &adapter->hw; +@@ -1812,8 +1753,7 @@ + if (wol->wolopts & (WAKE_PHY | WAKE_ARP | WAKE_MAGICSECURE)) + return -EOPNOTSUPP; + +- if (e1000_wol_exclusion(adapter, wol) || +- !device_can_wakeup(&adapter->pdev->dev)) ++ if (e1000_wol_exclusion(adapter, wol)) + return wol->wolopts ? -EOPNOTSUPP : 0; + + switch (hw->device_id) { +@@ -1840,8 +1780,6 @@ + if (wol->wolopts & WAKE_MAGIC) + adapter->wol |= E1000_WUFC_MAG; + +- device_set_wakeup_enable(&adapter->pdev->dev, adapter->wol); +- + return 0; + } + +@@ -1854,12 +1792,11 @@ + static void e1000_led_blink_callback(unsigned long data) + { + struct e1000_adapter *adapter = (struct e1000_adapter *) data; +- struct e1000_hw *hw = &adapter->hw; + + if (test_and_change_bit(E1000_LED_ON, &adapter->led_status)) +- e1000_led_off(hw); ++ e1000_led_off(&adapter->hw); + else +- e1000_led_on(hw); ++ e1000_led_on(&adapter->hw); + + mod_timer(&adapter->blink_timer, jiffies + E1000_ID_INTERVAL); + } +@@ -1867,39 +1804,67 @@ + static int e1000_phys_id(struct net_device *netdev, u32 data) + { + struct e1000_adapter *adapter = netdev_priv(netdev); +- struct e1000_hw *hw = &adapter->hw; + + if (!data) + data = INT_MAX; + +- if (hw->mac_type < e1000_82571) { +- if (!adapter->blink_timer.function) { +- init_timer(&adapter->blink_timer); +- adapter->blink_timer.function = e1000_led_blink_callback; +- adapter->blink_timer.data = (unsigned long)adapter; +- } +- e1000_setup_led(hw); +- mod_timer(&adapter->blink_timer, jiffies); +- msleep_interruptible(data * 1000); +- del_timer_sync(&adapter->blink_timer); +- } else if (hw->phy_type == e1000_phy_ife) { +- if (!adapter->blink_timer.function) { +- init_timer(&adapter->blink_timer); +- adapter->blink_timer.function = e1000_led_blink_callback; +- adapter->blink_timer.data = (unsigned long)adapter; +- } +- mod_timer(&adapter->blink_timer, jiffies); +- msleep_interruptible(data * 1000); +- del_timer_sync(&adapter->blink_timer); +- e1000_write_phy_reg(&(adapter->hw), IFE_PHY_SPECIAL_CONTROL_LED, 0); ++ if (!adapter->blink_timer.function) { ++ init_timer(&adapter->blink_timer); ++ adapter->blink_timer.function = e1000_led_blink_callback; ++ adapter->blink_timer.data = (unsigned long) adapter; ++ } ++ e1000_setup_led(&adapter->hw); ++ mod_timer(&adapter->blink_timer, jiffies); ++ msleep_interruptible(data * 1000); ++ del_timer_sync(&adapter->blink_timer); ++ ++ e1000_led_off(&adapter->hw); ++ clear_bit(E1000_LED_ON, &adapter->led_status); ++ e1000_cleanup_led(&adapter->hw); ++ ++ return 0; ++} ++ ++static int e1000_get_coalesce(struct net_device *netdev, ++ struct ethtool_coalesce *ec) ++{ ++ struct e1000_adapter *adapter = netdev_priv(netdev); ++ ++ if (adapter->itr_setting <= 3) ++ ec->rx_coalesce_usecs = adapter->itr_setting; ++ else ++ ec->rx_coalesce_usecs = 1000000 / adapter->itr_setting; ++ ++ return 0; ++} ++ ++static int e1000_set_coalesce(struct net_device *netdev, ++ struct ethtool_coalesce *ec) ++{ ++ struct e1000_adapter *adapter = netdev_priv(netdev); ++ ++ if ((ec->rx_coalesce_usecs > E1000_MAX_ITR_USECS) || ++ ((ec->rx_coalesce_usecs > 3) && ++ (ec->rx_coalesce_usecs < E1000_MIN_ITR_USECS)) || ++ (ec->rx_coalesce_usecs == 2)) ++ return -EINVAL; ++ ++ if (!(adapter->flags & E1000_FLAG_HAS_INTR_MODERATION)) ++ return -ENOTSUPP; ++ ++ if (ec->rx_coalesce_usecs <= 3) { ++ adapter->itr = 20000; ++ adapter->itr_setting = ec->rx_coalesce_usecs; + } else { +- e1000_blink_led_start(hw); +- msleep_interruptible(data * 1000); ++ adapter->itr = (1000000 / ec->rx_coalesce_usecs); ++ adapter->itr_setting = adapter->itr & ~3; + } + +- e1000_led_off(hw); +- clear_bit(E1000_LED_ON, &adapter->led_status); +- e1000_cleanup_led(hw); ++ if (adapter->itr_setting != 0) ++ E1000_WRITE_REG(&adapter->hw, E1000_ITR, ++ 1000000000 / (adapter->itr * 256)); ++ else ++ E1000_WRITE_REG(&adapter->hw, E1000_ITR, 0); + + return 0; + } +@@ -1912,8 +1877,13 @@ + return 0; + } + ++static int e1000_get_stats_count(struct net_device *netdev) ++{ ++ return E1000_STATS_LEN; ++} ++ + static void e1000_get_ethtool_stats(struct net_device *netdev, +- struct ethtool_stats *stats, u64 *data) ++ struct ethtool_stats *stats, u64 *data) + { + struct e1000_adapter *adapter = netdev_priv(netdev); + int i; +@@ -1928,7 +1898,7 @@ + } + + static void e1000_get_strings(struct net_device *netdev, u32 stringset, +- u8 *data) ++ u8 *data) + { + u8 *p = data; + int i; +@@ -1936,7 +1906,7 @@ + switch (stringset) { + case ETH_SS_TEST: + memcpy(data, *e1000_gstrings_test, +- sizeof(e1000_gstrings_test)); ++ E1000_TEST_LEN*ETH_GSTRING_LEN); + break; + case ETH_SS_STATS: + for (i = 0; i < E1000_GLOBAL_STATS_LEN; i++) { +@@ -1949,7 +1919,7 @@ + } + } + +-static const struct ethtool_ops e1000_ethtool_ops = { ++static struct ethtool_ops e1000_ethtool_ops = { + .get_settings = e1000_get_settings, + .set_settings = e1000_set_settings, + .get_drvinfo = e1000_get_drvinfo, +@@ -1972,16 +1942,27 @@ + .set_rx_csum = e1000_set_rx_csum, + .get_tx_csum = e1000_get_tx_csum, + .set_tx_csum = e1000_set_tx_csum, ++ .get_sg = ethtool_op_get_sg, + .set_sg = ethtool_op_set_sg, ++#ifdef NETIF_F_TSO ++ .get_tso = ethtool_op_get_tso, + .set_tso = e1000_set_tso, ++#endif ++ .self_test_count = e1000_diag_test_count, + .self_test = e1000_diag_test, + .get_strings = e1000_get_strings, + .phys_id = e1000_phys_id, ++ .get_stats_count = e1000_get_stats_count, + .get_ethtool_stats = e1000_get_ethtool_stats, +- .get_sset_count = e1000_get_sset_count, ++#ifdef ETHTOOL_GPERMADDR ++ .get_perm_addr = ethtool_op_get_perm_addr, ++#endif ++ .get_coalesce = e1000_get_coalesce, ++ .set_coalesce = e1000_set_coalesce, + }; + + void e1000_set_ethtool_ops(struct net_device *netdev) + { + SET_ETHTOOL_OPS(netdev, &e1000_ethtool_ops); + } ++#endif /* SIOCETHTOOL */ +diff -r d03036c09699 drivers/net/e1000/e1000_hw.h +--- a/drivers/net/e1000/e1000_hw.h Thu Jun 04 15:13:56 2009 +0100 ++++ b/drivers/net/e1000/e1000_hw.h Mon Jun 15 11:43:11 2009 +0100 +@@ -1,7 +1,7 @@ + /******************************************************************************* + + Intel PRO/1000 Linux driver +- Copyright(c) 1999 - 2006 Intel Corporation. ++ Copyright(c) 1999 - 2008 Intel Corporation. + + This program is free software; you can redistribute it and/or modify it + under the terms and conditions of the GNU General Public License, +@@ -26,3381 +26,697 @@ + + *******************************************************************************/ + +-/* e1000_hw.h +- * Structures, enums, and macros for the MAC +- */ +- + #ifndef _E1000_HW_H_ + #define _E1000_HW_H_ + + #include "e1000_osdep.h" ++#include "e1000_regs.h" ++#include "e1000_defines.h" + ++struct e1000_hw; + +-/* Forward declarations of structures used by the shared code */ +-struct e1000_hw; +-struct e1000_hw_stats; ++#define E1000_DEV_ID_82542 0x1000 ++#define E1000_DEV_ID_82543GC_FIBER 0x1001 ++#define E1000_DEV_ID_82543GC_COPPER 0x1004 ++#define E1000_DEV_ID_82544EI_COPPER 0x1008 ++#define E1000_DEV_ID_82544EI_FIBER 0x1009 ++#define E1000_DEV_ID_82544GC_COPPER 0x100C ++#define E1000_DEV_ID_82544GC_LOM 0x100D ++#define E1000_DEV_ID_82540EM 0x100E ++#define E1000_DEV_ID_82540EM_LOM 0x1015 ++#define E1000_DEV_ID_82540EP_LOM 0x1016 ++#define E1000_DEV_ID_82540EP 0x1017 ++#define E1000_DEV_ID_82540EP_LP 0x101E ++#define E1000_DEV_ID_82545EM_COPPER 0x100F ++#define E1000_DEV_ID_82545EM_FIBER 0x1011 ++#define E1000_DEV_ID_82545GM_COPPER 0x1026 ++#define E1000_DEV_ID_82545GM_FIBER 0x1027 ++#define E1000_DEV_ID_82545GM_SERDES 0x1028 ++#define E1000_DEV_ID_82546EB_COPPER 0x1010 ++#define E1000_DEV_ID_82546EB_FIBER 0x1012 ++#define E1000_DEV_ID_82546EB_QUAD_COPPER 0x101D ++#define E1000_DEV_ID_82546GB_COPPER 0x1079 ++#define E1000_DEV_ID_82546GB_FIBER 0x107A ++#define E1000_DEV_ID_82546GB_SERDES 0x107B ++#define E1000_DEV_ID_82546GB_PCIE 0x108A ++#define E1000_DEV_ID_82546GB_QUAD_COPPER 0x1099 ++#define E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3 0x10B5 ++#define E1000_DEV_ID_82541EI 0x1013 ++#define E1000_DEV_ID_82541EI_MOBILE 0x1018 ++#define E1000_DEV_ID_82541ER_LOM 0x1014 ++#define E1000_DEV_ID_82541ER 0x1078 ++#define E1000_DEV_ID_82541GI 0x1076 ++#define E1000_DEV_ID_82541GI_LF 0x107C ++#define E1000_DEV_ID_82541GI_MOBILE 0x1077 ++#define E1000_DEV_ID_82547EI 0x1019 ++#define E1000_DEV_ID_82547EI_MOBILE 0x101A ++#define E1000_DEV_ID_82547GI 0x1075 ++#define E1000_REVISION_0 0 ++#define E1000_REVISION_1 1 ++#define E1000_REVISION_2 2 ++#define E1000_REVISION_3 3 ++#define E1000_REVISION_4 4 + +-/* Enumerated types specific to the e1000 hardware */ +-/* Media Access Controlers */ +-typedef enum { +- e1000_undefined = 0, +- e1000_82542_rev2_0, +- e1000_82542_rev2_1, +- e1000_82543, +- e1000_82544, +- e1000_82540, +- e1000_82545, +- e1000_82545_rev_3, +- e1000_82546, +- e1000_82546_rev_3, +- e1000_82541, +- e1000_82541_rev_2, +- e1000_82547, +- e1000_82547_rev_2, +- e1000_82571, +- e1000_82572, +- e1000_82573, +- e1000_80003es2lan, +- e1000_ich8lan, +- e1000_num_macs +-} e1000_mac_type; ++#define E1000_FUNC_0 0 ++#define E1000_FUNC_1 1 + +-typedef enum { +- e1000_eeprom_uninitialized = 0, +- e1000_eeprom_spi, +- e1000_eeprom_microwire, +- e1000_eeprom_flash, +- e1000_eeprom_ich8, +- e1000_eeprom_none, /* No NVM support */ +- e1000_num_eeprom_types +-} e1000_eeprom_type; ++#define E1000_ALT_MAC_ADDRESS_OFFSET_LAN0 0 ++#define E1000_ALT_MAC_ADDRESS_OFFSET_LAN1 3 + +-/* Media Types */ +-typedef enum { +- e1000_media_type_copper = 0, +- e1000_media_type_fiber = 1, +- e1000_media_type_internal_serdes = 2, +- e1000_num_media_types +-} e1000_media_type; +- +-typedef enum { +- e1000_10_half = 0, +- e1000_10_full = 1, +- e1000_100_half = 2, +- e1000_100_full = 3 +-} e1000_speed_duplex_type; +- +-/* Flow Control Settings */ +-typedef enum { +- E1000_FC_NONE = 0, +- E1000_FC_RX_PAUSE = 1, +- E1000_FC_TX_PAUSE = 2, +- E1000_FC_FULL = 3, +- E1000_FC_DEFAULT = 0xFF +-} e1000_fc_type; +- +-struct e1000_shadow_ram { +- u16 eeprom_word; +- bool modified; ++enum e1000_mac_type { ++ e1000_undefined = 0, ++ e1000_82542, ++ e1000_82543, ++ e1000_82544, ++ e1000_82540, ++ e1000_82545, ++ e1000_82545_rev_3, ++ e1000_82546, ++ e1000_82546_rev_3, ++ e1000_82541, ++ e1000_82541_rev_2, ++ e1000_82547, ++ e1000_82547_rev_2, ++ e1000_num_macs /* List is 1-based, so subtract 1 for true count. */ + }; + +-/* PCI bus types */ +-typedef enum { +- e1000_bus_type_unknown = 0, +- e1000_bus_type_pci, +- e1000_bus_type_pcix, +- e1000_bus_type_pci_express, +- e1000_bus_type_reserved +-} e1000_bus_type; +- +-/* PCI bus speeds */ +-typedef enum { +- e1000_bus_speed_unknown = 0, +- e1000_bus_speed_33, +- e1000_bus_speed_66, +- e1000_bus_speed_100, +- e1000_bus_speed_120, +- e1000_bus_speed_133, +- e1000_bus_speed_2500, +- e1000_bus_speed_reserved +-} e1000_bus_speed; +- +-/* PCI bus widths */ +-typedef enum { +- e1000_bus_width_unknown = 0, +- /* These PCIe values should literally match the possible return values +- * from config space */ +- e1000_bus_width_pciex_1 = 1, +- e1000_bus_width_pciex_2 = 2, +- e1000_bus_width_pciex_4 = 4, +- e1000_bus_width_32, +- e1000_bus_width_64, +- e1000_bus_width_reserved +-} e1000_bus_width; +- +-/* PHY status info structure and supporting enums */ +-typedef enum { +- e1000_cable_length_50 = 0, +- e1000_cable_length_50_80, +- e1000_cable_length_80_110, +- e1000_cable_length_110_140, +- e1000_cable_length_140, +- e1000_cable_length_undefined = 0xFF +-} e1000_cable_length; +- +-typedef enum { +- e1000_gg_cable_length_60 = 0, +- e1000_gg_cable_length_60_115 = 1, +- e1000_gg_cable_length_115_150 = 2, +- e1000_gg_cable_length_150 = 4 +-} e1000_gg_cable_length; +- +-typedef enum { +- e1000_igp_cable_length_10 = 10, +- e1000_igp_cable_length_20 = 20, +- e1000_igp_cable_length_30 = 30, +- e1000_igp_cable_length_40 = 40, +- e1000_igp_cable_length_50 = 50, +- e1000_igp_cable_length_60 = 60, +- e1000_igp_cable_length_70 = 70, +- e1000_igp_cable_length_80 = 80, +- e1000_igp_cable_length_90 = 90, +- e1000_igp_cable_length_100 = 100, +- e1000_igp_cable_length_110 = 110, +- e1000_igp_cable_length_115 = 115, +- e1000_igp_cable_length_120 = 120, +- e1000_igp_cable_length_130 = 130, +- e1000_igp_cable_length_140 = 140, +- e1000_igp_cable_length_150 = 150, +- e1000_igp_cable_length_160 = 160, +- e1000_igp_cable_length_170 = 170, +- e1000_igp_cable_length_180 = 180 +-} e1000_igp_cable_length; +- +-typedef enum { +- e1000_10bt_ext_dist_enable_normal = 0, +- e1000_10bt_ext_dist_enable_lower, +- e1000_10bt_ext_dist_enable_undefined = 0xFF +-} e1000_10bt_ext_dist_enable; +- +-typedef enum { +- e1000_rev_polarity_normal = 0, +- e1000_rev_polarity_reversed, +- e1000_rev_polarity_undefined = 0xFF +-} e1000_rev_polarity; +- +-typedef enum { +- e1000_downshift_normal = 0, +- e1000_downshift_activated, +- e1000_downshift_undefined = 0xFF +-} e1000_downshift; +- +-typedef enum { +- e1000_smart_speed_default = 0, +- e1000_smart_speed_on, +- e1000_smart_speed_off +-} e1000_smart_speed; +- +-typedef enum { +- e1000_polarity_reversal_enabled = 0, +- e1000_polarity_reversal_disabled, +- e1000_polarity_reversal_undefined = 0xFF +-} e1000_polarity_reversal; +- +-typedef enum { +- e1000_auto_x_mode_manual_mdi = 0, +- e1000_auto_x_mode_manual_mdix, +- e1000_auto_x_mode_auto1, +- e1000_auto_x_mode_auto2, +- e1000_auto_x_mode_undefined = 0xFF +-} e1000_auto_x_mode; +- +-typedef enum { +- e1000_1000t_rx_status_not_ok = 0, +- e1000_1000t_rx_status_ok, +- e1000_1000t_rx_status_undefined = 0xFF +-} e1000_1000t_rx_status; +- +-typedef enum { +- e1000_phy_m88 = 0, +- e1000_phy_igp, +- e1000_phy_igp_2, +- e1000_phy_gg82563, +- e1000_phy_igp_3, +- e1000_phy_ife, +- e1000_phy_undefined = 0xFF +-} e1000_phy_type; +- +-typedef enum { +- e1000_ms_hw_default = 0, +- e1000_ms_force_master, +- e1000_ms_force_slave, +- e1000_ms_auto +-} e1000_ms_type; +- +-typedef enum { +- e1000_ffe_config_enabled = 0, +- e1000_ffe_config_active, +- e1000_ffe_config_blocked +-} e1000_ffe_config; +- +-typedef enum { +- e1000_dsp_config_disabled = 0, +- e1000_dsp_config_enabled, +- e1000_dsp_config_activated, +- e1000_dsp_config_undefined = 0xFF +-} e1000_dsp_config; +- +-struct e1000_phy_info { +- e1000_cable_length cable_length; +- e1000_10bt_ext_dist_enable extended_10bt_distance; +- e1000_rev_polarity cable_polarity; +- e1000_downshift downshift; +- e1000_polarity_reversal polarity_correction; +- e1000_auto_x_mode mdix_mode; +- e1000_1000t_rx_status local_rx; +- e1000_1000t_rx_status remote_rx; ++enum e1000_media_type { ++ e1000_media_type_unknown = 0, ++ e1000_media_type_copper = 1, ++ e1000_media_type_fiber = 2, ++ e1000_media_type_internal_serdes = 3, ++ e1000_num_media_types + }; + +-struct e1000_phy_stats { +- u32 idle_errors; +- u32 receive_errors; ++enum e1000_nvm_type { ++ e1000_nvm_unknown = 0, ++ e1000_nvm_none, ++ e1000_nvm_eeprom_spi, ++ e1000_nvm_eeprom_microwire, ++ e1000_nvm_flash_hw, ++ e1000_nvm_flash_sw + }; + +-struct e1000_eeprom_info { +- e1000_eeprom_type type; +- u16 word_size; +- u16 opcode_bits; +- u16 address_bits; +- u16 delay_usec; +- u16 page_size; +- bool use_eerd; +- bool use_eewr; ++enum e1000_nvm_override { ++ e1000_nvm_override_none = 0, ++ e1000_nvm_override_spi_small, ++ e1000_nvm_override_spi_large, ++ e1000_nvm_override_microwire_small, ++ e1000_nvm_override_microwire_large + }; + +-/* Flex ASF Information */ +-#define E1000_HOST_IF_MAX_SIZE 2048 +- +-typedef enum { +- e1000_byte_align = 0, +- e1000_word_align = 1, +- e1000_dword_align = 2 +-} e1000_align_type; +- +- +- +-/* Error Codes */ +-#define E1000_SUCCESS 0 +-#define E1000_ERR_EEPROM 1 +-#define E1000_ERR_PHY 2 +-#define E1000_ERR_CONFIG 3 +-#define E1000_ERR_PARAM 4 +-#define E1000_ERR_MAC_TYPE 5 +-#define E1000_ERR_PHY_TYPE 6 +-#define E1000_ERR_RESET 9 +-#define E1000_ERR_MASTER_REQUESTS_PENDING 10 +-#define E1000_ERR_HOST_INTERFACE_COMMAND 11 +-#define E1000_BLK_PHY_RESET 12 +-#define E1000_ERR_SWFW_SYNC 13 +- +-#define E1000_BYTE_SWAP_WORD(_value) ((((_value) & 0x00ff) << 8) | \ +- (((_value) & 0xff00) >> 8)) +- +-/* Function prototypes */ +-/* Initialization */ +-s32 e1000_reset_hw(struct e1000_hw *hw); +-s32 e1000_init_hw(struct e1000_hw *hw); +-s32 e1000_set_mac_type(struct e1000_hw *hw); +-void e1000_set_media_type(struct e1000_hw *hw); +- +-/* Link Configuration */ +-s32 e1000_setup_link(struct e1000_hw *hw); +-s32 e1000_phy_setup_autoneg(struct e1000_hw *hw); +-void e1000_config_collision_dist(struct e1000_hw *hw); +-s32 e1000_check_for_link(struct e1000_hw *hw); +-s32 e1000_get_speed_and_duplex(struct e1000_hw *hw, u16 *speed, u16 *duplex); +-s32 e1000_force_mac_fc(struct e1000_hw *hw); +- +-/* PHY */ +-s32 e1000_read_phy_reg(struct e1000_hw *hw, u32 reg_addr, u16 *phy_data); +-s32 e1000_write_phy_reg(struct e1000_hw *hw, u32 reg_addr, u16 data); +-s32 e1000_phy_hw_reset(struct e1000_hw *hw); +-s32 e1000_phy_reset(struct e1000_hw *hw); +-s32 e1000_phy_get_info(struct e1000_hw *hw, struct e1000_phy_info *phy_info); +-s32 e1000_validate_mdi_setting(struct e1000_hw *hw); +- +-void e1000_phy_powerdown_workaround(struct e1000_hw *hw); +- +-/* EEPROM Functions */ +-s32 e1000_init_eeprom_params(struct e1000_hw *hw); +- +-/* MNG HOST IF functions */ +-u32 e1000_enable_mng_pass_thru(struct e1000_hw *hw); +- +-#define E1000_MNG_DHCP_TX_PAYLOAD_CMD 64 +-#define E1000_HI_MAX_MNG_DATA_LENGTH 0x6F8 /* Host Interface data length */ +- +-#define E1000_MNG_DHCP_COMMAND_TIMEOUT 10 /* Time in ms to process MNG command */ +-#define E1000_MNG_DHCP_COOKIE_OFFSET 0x6F0 /* Cookie offset */ +-#define E1000_MNG_DHCP_COOKIE_LENGTH 0x10 /* Cookie length */ +-#define E1000_MNG_IAMT_MODE 0x3 +-#define E1000_MNG_ICH_IAMT_MODE 0x2 +-#define E1000_IAMT_SIGNATURE 0x544D4149 /* Intel(R) Active Management Technology signature */ +- +-#define E1000_MNG_DHCP_COOKIE_STATUS_PARSING_SUPPORT 0x1 /* DHCP parsing enabled */ +-#define E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT 0x2 /* DHCP parsing enabled */ +-#define E1000_VFTA_ENTRY_SHIFT 0x5 +-#define E1000_VFTA_ENTRY_MASK 0x7F +-#define E1000_VFTA_ENTRY_BIT_SHIFT_MASK 0x1F +- +-struct e1000_host_mng_command_header { +- u8 command_id; +- u8 checksum; +- u16 reserved1; +- u16 reserved2; +- u16 command_length; ++enum e1000_phy_type { ++ e1000_phy_unknown = 0, ++ e1000_phy_none, ++ e1000_phy_m88, ++ e1000_phy_igp, ++ e1000_phy_igp_2, ++ e1000_phy_gg82563, ++ e1000_phy_igp_3, ++ e1000_phy_ife, + }; + +-struct e1000_host_mng_command_info { +- struct e1000_host_mng_command_header command_header; /* Command Head/Command Result Head has 4 bytes */ +- u8 command_data[E1000_HI_MAX_MNG_DATA_LENGTH]; /* Command data can length 0..0x658*/ ++enum e1000_bus_type { ++ e1000_bus_type_unknown = 0, ++ e1000_bus_type_pci, ++ e1000_bus_type_pcix, ++ e1000_bus_type_pci_express, ++ e1000_bus_type_reserved + }; +-#ifdef __BIG_ENDIAN +-struct e1000_host_mng_dhcp_cookie{ +- u32 signature; +- u16 vlan_id; +- u8 reserved0; +- u8 status; +- u32 reserved1; +- u8 checksum; +- u8 reserved3; +- u16 reserved2; ++ ++enum e1000_bus_speed { ++ e1000_bus_speed_unknown = 0, ++ e1000_bus_speed_33, ++ e1000_bus_speed_66, ++ e1000_bus_speed_100, ++ e1000_bus_speed_120, ++ e1000_bus_speed_133, ++ e1000_bus_speed_2500, ++ e1000_bus_speed_5000, ++ e1000_bus_speed_reserved + }; +-#else +-struct e1000_host_mng_dhcp_cookie{ +- u32 signature; +- u8 status; +- u8 reserved0; +- u16 vlan_id; +- u32 reserved1; +- u16 reserved2; +- u8 reserved3; +- u8 checksum; ++ ++enum e1000_bus_width { ++ e1000_bus_width_unknown = 0, ++ e1000_bus_width_pcie_x1, ++ e1000_bus_width_pcie_x2, ++ e1000_bus_width_pcie_x4 = 4, ++ e1000_bus_width_pcie_x8 = 8, ++ e1000_bus_width_32, ++ e1000_bus_width_64, ++ e1000_bus_width_reserved + }; +-#endif + +-s32 e1000_mng_write_dhcp_info(struct e1000_hw *hw, u8 *buffer, +- u16 length); +-bool e1000_check_mng_mode(struct e1000_hw *hw); +-bool e1000_enable_tx_pkt_filtering(struct e1000_hw *hw); +-s32 e1000_read_eeprom(struct e1000_hw *hw, u16 reg, u16 words, u16 *data); +-s32 e1000_validate_eeprom_checksum(struct e1000_hw *hw); +-s32 e1000_update_eeprom_checksum(struct e1000_hw *hw); +-s32 e1000_write_eeprom(struct e1000_hw *hw, u16 reg, u16 words, u16 *data); +-s32 e1000_read_mac_addr(struct e1000_hw * hw); ++enum e1000_1000t_rx_status { ++ e1000_1000t_rx_status_not_ok = 0, ++ e1000_1000t_rx_status_ok, ++ e1000_1000t_rx_status_undefined = 0xFF ++}; + +-/* Filters (multicast, vlan, receive) */ +-u32 e1000_hash_mc_addr(struct e1000_hw *hw, u8 * mc_addr); +-void e1000_mta_set(struct e1000_hw *hw, u32 hash_value); +-void e1000_rar_set(struct e1000_hw *hw, u8 * mc_addr, u32 rar_index); +-void e1000_write_vfta(struct e1000_hw *hw, u32 offset, u32 value); ++enum e1000_rev_polarity { ++ e1000_rev_polarity_normal = 0, ++ e1000_rev_polarity_reversed, ++ e1000_rev_polarity_undefined = 0xFF ++}; + +-/* LED functions */ +-s32 e1000_setup_led(struct e1000_hw *hw); +-s32 e1000_cleanup_led(struct e1000_hw *hw); +-s32 e1000_led_on(struct e1000_hw *hw); +-s32 e1000_led_off(struct e1000_hw *hw); +-s32 e1000_blink_led_start(struct e1000_hw *hw); ++enum e1000_fc_mode { ++ e1000_fc_none = 0, ++ e1000_fc_rx_pause, ++ e1000_fc_tx_pause, ++ e1000_fc_full, ++ e1000_fc_default = 0xFF ++}; + +-/* Adaptive IFS Functions */ ++enum e1000_ffe_config { ++ e1000_ffe_config_enabled = 0, ++ e1000_ffe_config_active, ++ e1000_ffe_config_blocked ++}; + +-/* Everything else */ +-void e1000_reset_adaptive(struct e1000_hw *hw); +-void e1000_update_adaptive(struct e1000_hw *hw); +-void e1000_tbi_adjust_stats(struct e1000_hw *hw, struct e1000_hw_stats *stats, u32 frame_len, u8 * mac_addr); +-void e1000_get_bus_info(struct e1000_hw *hw); +-void e1000_pci_set_mwi(struct e1000_hw *hw); +-void e1000_pci_clear_mwi(struct e1000_hw *hw); +-s32 e1000_read_pcie_cap_reg(struct e1000_hw *hw, u32 reg, u16 *value); +-void e1000_pcix_set_mmrbc(struct e1000_hw *hw, int mmrbc); +-int e1000_pcix_get_mmrbc(struct e1000_hw *hw); +-/* Port I/O is only supported on 82544 and newer */ +-void e1000_io_write(struct e1000_hw *hw, unsigned long port, u32 value); +-s32 e1000_disable_pciex_master(struct e1000_hw *hw); +-s32 e1000_check_phy_reset_block(struct e1000_hw *hw); ++enum e1000_dsp_config { ++ e1000_dsp_config_disabled = 0, ++ e1000_dsp_config_enabled, ++ e1000_dsp_config_activated, ++ e1000_dsp_config_undefined = 0xFF ++}; + ++enum e1000_ms_type { ++ e1000_ms_hw_default = 0, ++ e1000_ms_force_master, ++ e1000_ms_force_slave, ++ e1000_ms_auto ++}; + +-#define E1000_READ_REG_IO(a, reg) \ +- e1000_read_reg_io((a), E1000_##reg) +-#define E1000_WRITE_REG_IO(a, reg, val) \ +- e1000_write_reg_io((a), E1000_##reg, val) ++enum e1000_smart_speed { ++ e1000_smart_speed_default = 0, ++ e1000_smart_speed_on, ++ e1000_smart_speed_off ++}; + +-/* PCI Device IDs */ +-#define E1000_DEV_ID_82542 0x1000 +-#define E1000_DEV_ID_82543GC_FIBER 0x1001 +-#define E1000_DEV_ID_82543GC_COPPER 0x1004 +-#define E1000_DEV_ID_82544EI_COPPER 0x1008 +-#define E1000_DEV_ID_82544EI_FIBER 0x1009 +-#define E1000_DEV_ID_82544GC_COPPER 0x100C +-#define E1000_DEV_ID_82544GC_LOM 0x100D +-#define E1000_DEV_ID_82540EM 0x100E +-#define E1000_DEV_ID_82540EM_LOM 0x1015 +-#define E1000_DEV_ID_82540EP_LOM 0x1016 +-#define E1000_DEV_ID_82540EP 0x1017 +-#define E1000_DEV_ID_82540EP_LP 0x101E +-#define E1000_DEV_ID_82545EM_COPPER 0x100F +-#define E1000_DEV_ID_82545EM_FIBER 0x1011 +-#define E1000_DEV_ID_82545GM_COPPER 0x1026 +-#define E1000_DEV_ID_82545GM_FIBER 0x1027 +-#define E1000_DEV_ID_82545GM_SERDES 0x1028 +-#define E1000_DEV_ID_82546EB_COPPER 0x1010 +-#define E1000_DEV_ID_82546EB_FIBER 0x1012 +-#define E1000_DEV_ID_82546EB_QUAD_COPPER 0x101D +-#define E1000_DEV_ID_82541EI 0x1013 +-#define E1000_DEV_ID_82541EI_MOBILE 0x1018 +-#define E1000_DEV_ID_82541ER_LOM 0x1014 +-#define E1000_DEV_ID_82541ER 0x1078 +-#define E1000_DEV_ID_82547GI 0x1075 +-#define E1000_DEV_ID_82541GI 0x1076 +-#define E1000_DEV_ID_82541GI_MOBILE 0x1077 +-#define E1000_DEV_ID_82541GI_LF 0x107C +-#define E1000_DEV_ID_82546GB_COPPER 0x1079 +-#define E1000_DEV_ID_82546GB_FIBER 0x107A +-#define E1000_DEV_ID_82546GB_SERDES 0x107B +-#define E1000_DEV_ID_82546GB_PCIE 0x108A +-#define E1000_DEV_ID_82546GB_QUAD_COPPER 0x1099 +-#define E1000_DEV_ID_82547EI 0x1019 +-#define E1000_DEV_ID_82547EI_MOBILE 0x101A +-#define E1000_DEV_ID_82571EB_COPPER 0x105E +-#define E1000_DEV_ID_82571EB_FIBER 0x105F +-#define E1000_DEV_ID_82571EB_SERDES 0x1060 +-#define E1000_DEV_ID_82571EB_QUAD_COPPER 0x10A4 +-#define E1000_DEV_ID_82571PT_QUAD_COPPER 0x10D5 +-#define E1000_DEV_ID_82571EB_QUAD_FIBER 0x10A5 +-#define E1000_DEV_ID_82571EB_QUAD_COPPER_LOWPROFILE 0x10BC +-#define E1000_DEV_ID_82571EB_SERDES_DUAL 0x10D9 +-#define E1000_DEV_ID_82571EB_SERDES_QUAD 0x10DA +-#define E1000_DEV_ID_82572EI_COPPER 0x107D +-#define E1000_DEV_ID_82572EI_FIBER 0x107E +-#define E1000_DEV_ID_82572EI_SERDES 0x107F +-#define E1000_DEV_ID_82572EI 0x10B9 +-#define E1000_DEV_ID_82573E 0x108B +-#define E1000_DEV_ID_82573E_IAMT 0x108C +-#define E1000_DEV_ID_82573L 0x109A +-#define E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3 0x10B5 +-#define E1000_DEV_ID_80003ES2LAN_COPPER_DPT 0x1096 +-#define E1000_DEV_ID_80003ES2LAN_SERDES_DPT 0x1098 +-#define E1000_DEV_ID_80003ES2LAN_COPPER_SPT 0x10BA +-#define E1000_DEV_ID_80003ES2LAN_SERDES_SPT 0x10BB +- +-#define E1000_DEV_ID_ICH8_IGP_M_AMT 0x1049 +-#define E1000_DEV_ID_ICH8_IGP_AMT 0x104A +-#define E1000_DEV_ID_ICH8_IGP_C 0x104B +-#define E1000_DEV_ID_ICH8_IFE 0x104C +-#define E1000_DEV_ID_ICH8_IFE_GT 0x10C4 +-#define E1000_DEV_ID_ICH8_IFE_G 0x10C5 +-#define E1000_DEV_ID_ICH8_IGP_M 0x104D +- +- +-#define NODE_ADDRESS_SIZE 6 +-#define ETH_LENGTH_OF_ADDRESS 6 +- +-/* MAC decode size is 128K - This is the size of BAR0 */ +-#define MAC_DECODE_SIZE (128 * 1024) +- +-#define E1000_82542_2_0_REV_ID 2 +-#define E1000_82542_2_1_REV_ID 3 +-#define E1000_REVISION_0 0 +-#define E1000_REVISION_1 1 +-#define E1000_REVISION_2 2 +-#define E1000_REVISION_3 3 +- +-#define SPEED_10 10 +-#define SPEED_100 100 +-#define SPEED_1000 1000 +-#define HALF_DUPLEX 1 +-#define FULL_DUPLEX 2 +- +-/* The sizes (in bytes) of a ethernet packet */ +-#define ENET_HEADER_SIZE 14 +-#define MAXIMUM_ETHERNET_FRAME_SIZE 1518 /* With FCS */ +-#define MINIMUM_ETHERNET_FRAME_SIZE 64 /* With FCS */ +-#define ETHERNET_FCS_SIZE 4 +-#define MAXIMUM_ETHERNET_PACKET_SIZE \ +- (MAXIMUM_ETHERNET_FRAME_SIZE - ETHERNET_FCS_SIZE) +-#define MINIMUM_ETHERNET_PACKET_SIZE \ +- (MINIMUM_ETHERNET_FRAME_SIZE - ETHERNET_FCS_SIZE) +-#define CRC_LENGTH ETHERNET_FCS_SIZE +-#define MAX_JUMBO_FRAME_SIZE 0x3F00 +- +- +-/* 802.1q VLAN Packet Sizes */ +-#define VLAN_TAG_SIZE 4 /* 802.3ac tag (not DMAed) */ +- +-/* Ethertype field values */ +-#define ETHERNET_IEEE_VLAN_TYPE 0x8100 /* 802.3ac packet */ +-#define ETHERNET_IP_TYPE 0x0800 /* IP packets */ +-#define ETHERNET_ARP_TYPE 0x0806 /* Address Resolution Protocol (ARP) */ +- +-/* Packet Header defines */ +-#define IP_PROTOCOL_TCP 6 +-#define IP_PROTOCOL_UDP 0x11 +- +-/* This defines the bits that are set in the Interrupt Mask +- * Set/Read Register. Each bit is documented below: +- * o RXDMT0 = Receive Descriptor Minimum Threshold hit (ring 0) +- * o RXSEQ = Receive Sequence Error +- */ +-#define POLL_IMS_ENABLE_MASK ( \ +- E1000_IMS_RXDMT0 | \ +- E1000_IMS_RXSEQ) +- +-/* This defines the bits that are set in the Interrupt Mask +- * Set/Read Register. Each bit is documented below: +- * o RXT0 = Receiver Timer Interrupt (ring 0) +- * o TXDW = Transmit Descriptor Written Back +- * o RXDMT0 = Receive Descriptor Minimum Threshold hit (ring 0) +- * o RXSEQ = Receive Sequence Error +- * o LSC = Link Status Change +- */ +-#define IMS_ENABLE_MASK ( \ +- E1000_IMS_RXT0 | \ +- E1000_IMS_TXDW | \ +- E1000_IMS_RXDMT0 | \ +- E1000_IMS_RXSEQ | \ +- E1000_IMS_LSC) +- +-/* Additional interrupts need to be handled for e1000_ich8lan: +- DSW = The FW changed the status of the DISSW bit in FWSM +- PHYINT = The LAN connected device generates an interrupt +- EPRST = Manageability reset event */ +-#define IMS_ICH8LAN_ENABLE_MASK (\ +- E1000_IMS_DSW | \ +- E1000_IMS_PHYINT | \ +- E1000_IMS_EPRST) +- +-/* Number of high/low register pairs in the RAR. The RAR (Receive Address +- * Registers) holds the directed and multicast addresses that we monitor. We +- * reserve one of these spots for our directed address, allowing us room for +- * E1000_RAR_ENTRIES - 1 multicast addresses. +- */ +-#define E1000_RAR_ENTRIES 15 +- +-#define E1000_RAR_ENTRIES_ICH8LAN 6 +- +-#define MIN_NUMBER_OF_DESCRIPTORS 8 +-#define MAX_NUMBER_OF_DESCRIPTORS 0xFFF8 ++enum e1000_serdes_link_state { ++ e1000_serdes_link_down = 0, ++ e1000_serdes_link_autoneg_progress, ++ e1000_serdes_link_autoneg_complete, ++ e1000_serdes_link_forced_up ++}; + + /* Receive Descriptor */ + struct e1000_rx_desc { +- __le64 buffer_addr; /* Address of the descriptor's data buffer */ +- __le16 length; /* Length of data DMAed into data buffer */ +- __le16 csum; /* Packet checksum */ +- u8 status; /* Descriptor status */ +- u8 errors; /* Descriptor Errors */ +- __le16 special; ++ __le64 buffer_addr; /* Address of the descriptor's data buffer */ ++ __le16 length; /* Length of data DMAed into data buffer */ ++ __le16 csum; /* Packet checksum */ ++ u8 status; /* Descriptor status */ ++ u8 errors; /* Descriptor Errors */ ++ __le16 special; + }; + + /* Receive Descriptor - Extended */ + union e1000_rx_desc_extended { +- struct { +- __le64 buffer_addr; +- __le64 reserved; +- } read; +- struct { +- struct { +- __le32 mrq; /* Multiple Rx Queues */ +- union { +- __le32 rss; /* RSS Hash */ +- struct { +- __le16 ip_id; /* IP id */ +- __le16 csum; /* Packet Checksum */ +- } csum_ip; +- } hi_dword; +- } lower; +- struct { +- __le32 status_error; /* ext status/error */ +- __le16 length; +- __le16 vlan; /* VLAN tag */ +- } upper; +- } wb; /* writeback */ ++ struct { ++ __le64 buffer_addr; ++ __le64 reserved; ++ } read; ++ struct { ++ struct { ++ __le32 mrq; /* Multiple Rx Queues */ ++ union { ++ __le32 rss; /* RSS Hash */ ++ struct { ++ __le16 ip_id; /* IP id */ ++ __le16 csum; /* Packet Checksum */ ++ } csum_ip; ++ } hi_dword; ++ } lower; ++ struct { ++ __le32 status_error; /* ext status/error */ ++ __le16 length; ++ __le16 vlan; /* VLAN tag */ ++ } upper; ++ } wb; /* writeback */ + }; + + #define MAX_PS_BUFFERS 4 + /* Receive Descriptor - Packet Split */ + union e1000_rx_desc_packet_split { +- struct { +- /* one buffer for protocol header(s), three data buffers */ +- __le64 buffer_addr[MAX_PS_BUFFERS]; +- } read; +- struct { +- struct { +- __le32 mrq; /* Multiple Rx Queues */ +- union { +- __le32 rss; /* RSS Hash */ +- struct { +- __le16 ip_id; /* IP id */ +- __le16 csum; /* Packet Checksum */ +- } csum_ip; +- } hi_dword; +- } lower; +- struct { +- __le32 status_error; /* ext status/error */ +- __le16 length0; /* length of buffer 0 */ +- __le16 vlan; /* VLAN tag */ +- } middle; +- struct { +- __le16 header_status; +- __le16 length[3]; /* length of buffers 1-3 */ +- } upper; +- __le64 reserved; +- } wb; /* writeback */ ++ struct { ++ /* one buffer for protocol header(s), three data buffers */ ++ __le64 buffer_addr[MAX_PS_BUFFERS]; ++ } read; ++ struct { ++ struct { ++ __le32 mrq; /* Multiple Rx Queues */ ++ union { ++ __le32 rss; /* RSS Hash */ ++ struct { ++ __le16 ip_id; /* IP id */ ++ __le16 csum; /* Packet Checksum */ ++ } csum_ip; ++ } hi_dword; ++ } lower; ++ struct { ++ __le32 status_error; /* ext status/error */ ++ __le16 length0; /* length of buffer 0 */ ++ __le16 vlan; /* VLAN tag */ ++ } middle; ++ struct { ++ __le16 header_status; ++ __le16 length[3]; /* length of buffers 1-3 */ ++ } upper; ++ __le64 reserved; ++ } wb; /* writeback */ + }; +- +-/* Receive Decriptor bit definitions */ +-#define E1000_RXD_STAT_DD 0x01 /* Descriptor Done */ +-#define E1000_RXD_STAT_EOP 0x02 /* End of Packet */ +-#define E1000_RXD_STAT_IXSM 0x04 /* Ignore checksum */ +-#define E1000_RXD_STAT_VP 0x08 /* IEEE VLAN Packet */ +-#define E1000_RXD_STAT_UDPCS 0x10 /* UDP xsum caculated */ +-#define E1000_RXD_STAT_TCPCS 0x20 /* TCP xsum calculated */ +-#define E1000_RXD_STAT_IPCS 0x40 /* IP xsum calculated */ +-#define E1000_RXD_STAT_PIF 0x80 /* passed in-exact filter */ +-#define E1000_RXD_STAT_IPIDV 0x200 /* IP identification valid */ +-#define E1000_RXD_STAT_UDPV 0x400 /* Valid UDP checksum */ +-#define E1000_RXD_STAT_ACK 0x8000 /* ACK Packet indication */ +-#define E1000_RXD_ERR_CE 0x01 /* CRC Error */ +-#define E1000_RXD_ERR_SE 0x02 /* Symbol Error */ +-#define E1000_RXD_ERR_SEQ 0x04 /* Sequence Error */ +-#define E1000_RXD_ERR_CXE 0x10 /* Carrier Extension Error */ +-#define E1000_RXD_ERR_TCPE 0x20 /* TCP/UDP Checksum Error */ +-#define E1000_RXD_ERR_IPE 0x40 /* IP Checksum Error */ +-#define E1000_RXD_ERR_RXE 0x80 /* Rx Data Error */ +-#define E1000_RXD_SPC_VLAN_MASK 0x0FFF /* VLAN ID is in lower 12 bits */ +-#define E1000_RXD_SPC_PRI_MASK 0xE000 /* Priority is in upper 3 bits */ +-#define E1000_RXD_SPC_PRI_SHIFT 13 +-#define E1000_RXD_SPC_CFI_MASK 0x1000 /* CFI is bit 12 */ +-#define E1000_RXD_SPC_CFI_SHIFT 12 +- +-#define E1000_RXDEXT_STATERR_CE 0x01000000 +-#define E1000_RXDEXT_STATERR_SE 0x02000000 +-#define E1000_RXDEXT_STATERR_SEQ 0x04000000 +-#define E1000_RXDEXT_STATERR_CXE 0x10000000 +-#define E1000_RXDEXT_STATERR_TCPE 0x20000000 +-#define E1000_RXDEXT_STATERR_IPE 0x40000000 +-#define E1000_RXDEXT_STATERR_RXE 0x80000000 +- +-#define E1000_RXDPS_HDRSTAT_HDRSP 0x00008000 +-#define E1000_RXDPS_HDRSTAT_HDRLEN_MASK 0x000003FF +- +-/* mask to determine if packets should be dropped due to frame errors */ +-#define E1000_RXD_ERR_FRAME_ERR_MASK ( \ +- E1000_RXD_ERR_CE | \ +- E1000_RXD_ERR_SE | \ +- E1000_RXD_ERR_SEQ | \ +- E1000_RXD_ERR_CXE | \ +- E1000_RXD_ERR_RXE) +- +- +-/* Same mask, but for extended and packet split descriptors */ +-#define E1000_RXDEXT_ERR_FRAME_ERR_MASK ( \ +- E1000_RXDEXT_STATERR_CE | \ +- E1000_RXDEXT_STATERR_SE | \ +- E1000_RXDEXT_STATERR_SEQ | \ +- E1000_RXDEXT_STATERR_CXE | \ +- E1000_RXDEXT_STATERR_RXE) +- + + /* Transmit Descriptor */ + struct e1000_tx_desc { +- __le64 buffer_addr; /* Address of the descriptor's data buffer */ +- union { +- __le32 data; +- struct { +- __le16 length; /* Data buffer length */ +- u8 cso; /* Checksum offset */ +- u8 cmd; /* Descriptor control */ +- } flags; +- } lower; +- union { +- __le32 data; +- struct { +- u8 status; /* Descriptor status */ +- u8 css; /* Checksum start */ +- __le16 special; +- } fields; +- } upper; ++ __le64 buffer_addr; /* Address of the descriptor's data buffer */ ++ union { ++ __le32 data; ++ struct { ++ __le16 length; /* Data buffer length */ ++ u8 cso; /* Checksum offset */ ++ u8 cmd; /* Descriptor control */ ++ } flags; ++ } lower; ++ union { ++ __le32 data; ++ struct { ++ u8 status; /* Descriptor status */ ++ u8 css; /* Checksum start */ ++ __le16 special; ++ } fields; ++ } upper; + }; +- +-/* Transmit Descriptor bit definitions */ +-#define E1000_TXD_DTYP_D 0x00100000 /* Data Descriptor */ +-#define E1000_TXD_DTYP_C 0x00000000 /* Context Descriptor */ +-#define E1000_TXD_POPTS_IXSM 0x01 /* Insert IP checksum */ +-#define E1000_TXD_POPTS_TXSM 0x02 /* Insert TCP/UDP checksum */ +-#define E1000_TXD_CMD_EOP 0x01000000 /* End of Packet */ +-#define E1000_TXD_CMD_IFCS 0x02000000 /* Insert FCS (Ethernet CRC) */ +-#define E1000_TXD_CMD_IC 0x04000000 /* Insert Checksum */ +-#define E1000_TXD_CMD_RS 0x08000000 /* Report Status */ +-#define E1000_TXD_CMD_RPS 0x10000000 /* Report Packet Sent */ +-#define E1000_TXD_CMD_DEXT 0x20000000 /* Descriptor extension (0 = legacy) */ +-#define E1000_TXD_CMD_VLE 0x40000000 /* Add VLAN tag */ +-#define E1000_TXD_CMD_IDE 0x80000000 /* Enable Tidv register */ +-#define E1000_TXD_STAT_DD 0x00000001 /* Descriptor Done */ +-#define E1000_TXD_STAT_EC 0x00000002 /* Excess Collisions */ +-#define E1000_TXD_STAT_LC 0x00000004 /* Late Collisions */ +-#define E1000_TXD_STAT_TU 0x00000008 /* Transmit underrun */ +-#define E1000_TXD_CMD_TCP 0x01000000 /* TCP packet */ +-#define E1000_TXD_CMD_IP 0x02000000 /* IP packet */ +-#define E1000_TXD_CMD_TSE 0x04000000 /* TCP Seg enable */ +-#define E1000_TXD_STAT_TC 0x00000004 /* Tx Underrun */ + + /* Offload Context Descriptor */ + struct e1000_context_desc { +- union { +- __le32 ip_config; +- struct { +- u8 ipcss; /* IP checksum start */ +- u8 ipcso; /* IP checksum offset */ +- __le16 ipcse; /* IP checksum end */ +- } ip_fields; +- } lower_setup; +- union { +- __le32 tcp_config; +- struct { +- u8 tucss; /* TCP checksum start */ +- u8 tucso; /* TCP checksum offset */ +- __le16 tucse; /* TCP checksum end */ +- } tcp_fields; +- } upper_setup; +- __le32 cmd_and_length; /* */ +- union { +- __le32 data; +- struct { +- u8 status; /* Descriptor status */ +- u8 hdr_len; /* Header length */ +- __le16 mss; /* Maximum segment size */ +- } fields; +- } tcp_seg_setup; ++ union { ++ __le32 ip_config; ++ struct { ++ u8 ipcss; /* IP checksum start */ ++ u8 ipcso; /* IP checksum offset */ ++ __le16 ipcse; /* IP checksum end */ ++ } ip_fields; ++ } lower_setup; ++ union { ++ __le32 tcp_config; ++ struct { ++ u8 tucss; /* TCP checksum start */ ++ u8 tucso; /* TCP checksum offset */ ++ __le16 tucse; /* TCP checksum end */ ++ } tcp_fields; ++ } upper_setup; ++ __le32 cmd_and_length; ++ union { ++ __le32 data; ++ struct { ++ u8 status; /* Descriptor status */ ++ u8 hdr_len; /* Header length */ ++ __le16 mss; /* Maximum segment size */ ++ } fields; ++ } tcp_seg_setup; + }; + + /* Offload data descriptor */ + struct e1000_data_desc { +- __le64 buffer_addr; /* Address of the descriptor's buffer address */ +- union { +- __le32 data; +- struct { +- __le16 length; /* Data buffer length */ +- u8 typ_len_ext; /* */ +- u8 cmd; /* */ +- } flags; +- } lower; +- union { +- __le32 data; +- struct { +- u8 status; /* Descriptor status */ +- u8 popts; /* Packet Options */ +- __le16 special; /* */ +- } fields; +- } upper; ++ __le64 buffer_addr; /* Address of the descriptor's buffer address */ ++ union { ++ __le32 data; ++ struct { ++ __le16 length; /* Data buffer length */ ++ u8 typ_len_ext; ++ u8 cmd; ++ } flags; ++ } lower; ++ union { ++ __le32 data; ++ struct { ++ u8 status; /* Descriptor status */ ++ u8 popts; /* Packet Options */ ++ __le16 special; ++ } fields; ++ } upper; + }; +- +-/* Filters */ +-#define E1000_NUM_UNICAST 16 /* Unicast filter entries */ +-#define E1000_MC_TBL_SIZE 128 /* Multicast Filter Table (4096 bits) */ +-#define E1000_VLAN_FILTER_TBL_SIZE 128 /* VLAN Filter Table (4096 bits) */ +- +-#define E1000_NUM_UNICAST_ICH8LAN 7 +-#define E1000_MC_TBL_SIZE_ICH8LAN 32 +- +- +-/* Receive Address Register */ +-struct e1000_rar { +- volatile __le32 low; /* receive address low */ +- volatile __le32 high; /* receive address high */ +-}; +- +-/* Number of entries in the Multicast Table Array (MTA). */ +-#define E1000_NUM_MTA_REGISTERS 128 +-#define E1000_NUM_MTA_REGISTERS_ICH8LAN 32 +- +-/* IPv4 Address Table Entry */ +-struct e1000_ipv4_at_entry { +- volatile u32 ipv4_addr; /* IP Address (RW) */ +- volatile u32 reserved; +-}; +- +-/* Four wakeup IP addresses are supported */ +-#define E1000_WAKEUP_IP_ADDRESS_COUNT_MAX 4 +-#define E1000_IP4AT_SIZE E1000_WAKEUP_IP_ADDRESS_COUNT_MAX +-#define E1000_IP4AT_SIZE_ICH8LAN 3 +-#define E1000_IP6AT_SIZE 1 +- +-/* IPv6 Address Table Entry */ +-struct e1000_ipv6_at_entry { +- volatile u8 ipv6_addr[16]; +-}; +- +-/* Flexible Filter Length Table Entry */ +-struct e1000_fflt_entry { +- volatile u32 length; /* Flexible Filter Length (RW) */ +- volatile u32 reserved; +-}; +- +-/* Flexible Filter Mask Table Entry */ +-struct e1000_ffmt_entry { +- volatile u32 mask; /* Flexible Filter Mask (RW) */ +- volatile u32 reserved; +-}; +- +-/* Flexible Filter Value Table Entry */ +-struct e1000_ffvt_entry { +- volatile u32 value; /* Flexible Filter Value (RW) */ +- volatile u32 reserved; +-}; +- +-/* Four Flexible Filters are supported */ +-#define E1000_FLEXIBLE_FILTER_COUNT_MAX 4 +- +-/* Each Flexible Filter is at most 128 (0x80) bytes in length */ +-#define E1000_FLEXIBLE_FILTER_SIZE_MAX 128 +- +-#define E1000_FFLT_SIZE E1000_FLEXIBLE_FILTER_COUNT_MAX +-#define E1000_FFMT_SIZE E1000_FLEXIBLE_FILTER_SIZE_MAX +-#define E1000_FFVT_SIZE E1000_FLEXIBLE_FILTER_SIZE_MAX +- +-#define E1000_DISABLE_SERDES_LOOPBACK 0x0400 +- +-/* Register Set. (82543, 82544) +- * +- * Registers are defined to be 32 bits and should be accessed as 32 bit values. +- * These registers are physically located on the NIC, but are mapped into the +- * host memory address space. +- * +- * RW - register is both readable and writable +- * RO - register is read only +- * WO - register is write only +- * R/clr - register is read only and is cleared when read +- * A - register array +- */ +-#define E1000_CTRL 0x00000 /* Device Control - RW */ +-#define E1000_CTRL_DUP 0x00004 /* Device Control Duplicate (Shadow) - RW */ +-#define E1000_STATUS 0x00008 /* Device Status - RO */ +-#define E1000_EECD 0x00010 /* EEPROM/Flash Control - RW */ +-#define E1000_EERD 0x00014 /* EEPROM Read - RW */ +-#define E1000_CTRL_EXT 0x00018 /* Extended Device Control - RW */ +-#define E1000_FLA 0x0001C /* Flash Access - RW */ +-#define E1000_MDIC 0x00020 /* MDI Control - RW */ +-#define E1000_SCTL 0x00024 /* SerDes Control - RW */ +-#define E1000_FEXTNVM 0x00028 /* Future Extended NVM register */ +-#define E1000_FCAL 0x00028 /* Flow Control Address Low - RW */ +-#define E1000_FCAH 0x0002C /* Flow Control Address High -RW */ +-#define E1000_FCT 0x00030 /* Flow Control Type - RW */ +-#define E1000_VET 0x00038 /* VLAN Ether Type - RW */ +-#define E1000_ICR 0x000C0 /* Interrupt Cause Read - R/clr */ +-#define E1000_ITR 0x000C4 /* Interrupt Throttling Rate - RW */ +-#define E1000_ICS 0x000C8 /* Interrupt Cause Set - WO */ +-#define E1000_IMS 0x000D0 /* Interrupt Mask Set - RW */ +-#define E1000_IMC 0x000D8 /* Interrupt Mask Clear - WO */ +-#define E1000_IAM 0x000E0 /* Interrupt Acknowledge Auto Mask */ +-#define E1000_RCTL 0x00100 /* RX Control - RW */ +-#define E1000_RDTR1 0x02820 /* RX Delay Timer (1) - RW */ +-#define E1000_RDBAL1 0x02900 /* RX Descriptor Base Address Low (1) - RW */ +-#define E1000_RDBAH1 0x02904 /* RX Descriptor Base Address High (1) - RW */ +-#define E1000_RDLEN1 0x02908 /* RX Descriptor Length (1) - RW */ +-#define E1000_RDH1 0x02910 /* RX Descriptor Head (1) - RW */ +-#define E1000_RDT1 0x02918 /* RX Descriptor Tail (1) - RW */ +-#define E1000_FCTTV 0x00170 /* Flow Control Transmit Timer Value - RW */ +-#define E1000_TXCW 0x00178 /* TX Configuration Word - RW */ +-#define E1000_RXCW 0x00180 /* RX Configuration Word - RO */ +-#define E1000_TCTL 0x00400 /* TX Control - RW */ +-#define E1000_TCTL_EXT 0x00404 /* Extended TX Control - RW */ +-#define E1000_TIPG 0x00410 /* TX Inter-packet gap -RW */ +-#define E1000_TBT 0x00448 /* TX Burst Timer - RW */ +-#define E1000_AIT 0x00458 /* Adaptive Interframe Spacing Throttle - RW */ +-#define E1000_LEDCTL 0x00E00 /* LED Control - RW */ +-#define E1000_EXTCNF_CTRL 0x00F00 /* Extended Configuration Control */ +-#define E1000_EXTCNF_SIZE 0x00F08 /* Extended Configuration Size */ +-#define E1000_PHY_CTRL 0x00F10 /* PHY Control Register in CSR */ +-#define FEXTNVM_SW_CONFIG 0x0001 +-#define E1000_PBA 0x01000 /* Packet Buffer Allocation - RW */ +-#define E1000_PBS 0x01008 /* Packet Buffer Size */ +-#define E1000_EEMNGCTL 0x01010 /* MNG EEprom Control */ +-#define E1000_FLASH_UPDATES 1000 +-#define E1000_EEARBC 0x01024 /* EEPROM Auto Read Bus Control */ +-#define E1000_FLASHT 0x01028 /* FLASH Timer Register */ +-#define E1000_EEWR 0x0102C /* EEPROM Write Register - RW */ +-#define E1000_FLSWCTL 0x01030 /* FLASH control register */ +-#define E1000_FLSWDATA 0x01034 /* FLASH data register */ +-#define E1000_FLSWCNT 0x01038 /* FLASH Access Counter */ +-#define E1000_FLOP 0x0103C /* FLASH Opcode Register */ +-#define E1000_ERT 0x02008 /* Early Rx Threshold - RW */ +-#define E1000_FCRTL 0x02160 /* Flow Control Receive Threshold Low - RW */ +-#define E1000_FCRTH 0x02168 /* Flow Control Receive Threshold High - RW */ +-#define E1000_PSRCTL 0x02170 /* Packet Split Receive Control - RW */ +-#define E1000_RDBAL 0x02800 /* RX Descriptor Base Address Low - RW */ +-#define E1000_RDBAH 0x02804 /* RX Descriptor Base Address High - RW */ +-#define E1000_RDLEN 0x02808 /* RX Descriptor Length - RW */ +-#define E1000_RDH 0x02810 /* RX Descriptor Head - RW */ +-#define E1000_RDT 0x02818 /* RX Descriptor Tail - RW */ +-#define E1000_RDTR 0x02820 /* RX Delay Timer - RW */ +-#define E1000_RDBAL0 E1000_RDBAL /* RX Desc Base Address Low (0) - RW */ +-#define E1000_RDBAH0 E1000_RDBAH /* RX Desc Base Address High (0) - RW */ +-#define E1000_RDLEN0 E1000_RDLEN /* RX Desc Length (0) - RW */ +-#define E1000_RDH0 E1000_RDH /* RX Desc Head (0) - RW */ +-#define E1000_RDT0 E1000_RDT /* RX Desc Tail (0) - RW */ +-#define E1000_RDTR0 E1000_RDTR /* RX Delay Timer (0) - RW */ +-#define E1000_RXDCTL 0x02828 /* RX Descriptor Control queue 0 - RW */ +-#define E1000_RXDCTL1 0x02928 /* RX Descriptor Control queue 1 - RW */ +-#define E1000_RADV 0x0282C /* RX Interrupt Absolute Delay Timer - RW */ +-#define E1000_RSRPD 0x02C00 /* RX Small Packet Detect - RW */ +-#define E1000_RAID 0x02C08 /* Receive Ack Interrupt Delay - RW */ +-#define E1000_TXDMAC 0x03000 /* TX DMA Control - RW */ +-#define E1000_KABGTXD 0x03004 /* AFE Band Gap Transmit Ref Data */ +-#define E1000_TDFH 0x03410 /* TX Data FIFO Head - RW */ +-#define E1000_TDFT 0x03418 /* TX Data FIFO Tail - RW */ +-#define E1000_TDFHS 0x03420 /* TX Data FIFO Head Saved - RW */ +-#define E1000_TDFTS 0x03428 /* TX Data FIFO Tail Saved - RW */ +-#define E1000_TDFPC 0x03430 /* TX Data FIFO Packet Count - RW */ +-#define E1000_TDBAL 0x03800 /* TX Descriptor Base Address Low - RW */ +-#define E1000_TDBAH 0x03804 /* TX Descriptor Base Address High - RW */ +-#define E1000_TDLEN 0x03808 /* TX Descriptor Length - RW */ +-#define E1000_TDH 0x03810 /* TX Descriptor Head - RW */ +-#define E1000_TDT 0x03818 /* TX Descripotr Tail - RW */ +-#define E1000_TIDV 0x03820 /* TX Interrupt Delay Value - RW */ +-#define E1000_TXDCTL 0x03828 /* TX Descriptor Control - RW */ +-#define E1000_TADV 0x0382C /* TX Interrupt Absolute Delay Val - RW */ +-#define E1000_TSPMT 0x03830 /* TCP Segmentation PAD & Min Threshold - RW */ +-#define E1000_TARC0 0x03840 /* TX Arbitration Count (0) */ +-#define E1000_TDBAL1 0x03900 /* TX Desc Base Address Low (1) - RW */ +-#define E1000_TDBAH1 0x03904 /* TX Desc Base Address High (1) - RW */ +-#define E1000_TDLEN1 0x03908 /* TX Desc Length (1) - RW */ +-#define E1000_TDH1 0x03910 /* TX Desc Head (1) - RW */ +-#define E1000_TDT1 0x03918 /* TX Desc Tail (1) - RW */ +-#define E1000_TXDCTL1 0x03928 /* TX Descriptor Control (1) - RW */ +-#define E1000_TARC1 0x03940 /* TX Arbitration Count (1) */ +-#define E1000_CRCERRS 0x04000 /* CRC Error Count - R/clr */ +-#define E1000_ALGNERRC 0x04004 /* Alignment Error Count - R/clr */ +-#define E1000_SYMERRS 0x04008 /* Symbol Error Count - R/clr */ +-#define E1000_RXERRC 0x0400C /* Receive Error Count - R/clr */ +-#define E1000_MPC 0x04010 /* Missed Packet Count - R/clr */ +-#define E1000_SCC 0x04014 /* Single Collision Count - R/clr */ +-#define E1000_ECOL 0x04018 /* Excessive Collision Count - R/clr */ +-#define E1000_MCC 0x0401C /* Multiple Collision Count - R/clr */ +-#define E1000_LATECOL 0x04020 /* Late Collision Count - R/clr */ +-#define E1000_COLC 0x04028 /* Collision Count - R/clr */ +-#define E1000_DC 0x04030 /* Defer Count - R/clr */ +-#define E1000_TNCRS 0x04034 /* TX-No CRS - R/clr */ +-#define E1000_SEC 0x04038 /* Sequence Error Count - R/clr */ +-#define E1000_CEXTERR 0x0403C /* Carrier Extension Error Count - R/clr */ +-#define E1000_RLEC 0x04040 /* Receive Length Error Count - R/clr */ +-#define E1000_XONRXC 0x04048 /* XON RX Count - R/clr */ +-#define E1000_XONTXC 0x0404C /* XON TX Count - R/clr */ +-#define E1000_XOFFRXC 0x04050 /* XOFF RX Count - R/clr */ +-#define E1000_XOFFTXC 0x04054 /* XOFF TX Count - R/clr */ +-#define E1000_FCRUC 0x04058 /* Flow Control RX Unsupported Count- R/clr */ +-#define E1000_PRC64 0x0405C /* Packets RX (64 bytes) - R/clr */ +-#define E1000_PRC127 0x04060 /* Packets RX (65-127 bytes) - R/clr */ +-#define E1000_PRC255 0x04064 /* Packets RX (128-255 bytes) - R/clr */ +-#define E1000_PRC511 0x04068 /* Packets RX (255-511 bytes) - R/clr */ +-#define E1000_PRC1023 0x0406C /* Packets RX (512-1023 bytes) - R/clr */ +-#define E1000_PRC1522 0x04070 /* Packets RX (1024-1522 bytes) - R/clr */ +-#define E1000_GPRC 0x04074 /* Good Packets RX Count - R/clr */ +-#define E1000_BPRC 0x04078 /* Broadcast Packets RX Count - R/clr */ +-#define E1000_MPRC 0x0407C /* Multicast Packets RX Count - R/clr */ +-#define E1000_GPTC 0x04080 /* Good Packets TX Count - R/clr */ +-#define E1000_GORCL 0x04088 /* Good Octets RX Count Low - R/clr */ +-#define E1000_GORCH 0x0408C /* Good Octets RX Count High - R/clr */ +-#define E1000_GOTCL 0x04090 /* Good Octets TX Count Low - R/clr */ +-#define E1000_GOTCH 0x04094 /* Good Octets TX Count High - R/clr */ +-#define E1000_RNBC 0x040A0 /* RX No Buffers Count - R/clr */ +-#define E1000_RUC 0x040A4 /* RX Undersize Count - R/clr */ +-#define E1000_RFC 0x040A8 /* RX Fragment Count - R/clr */ +-#define E1000_ROC 0x040AC /* RX Oversize Count - R/clr */ +-#define E1000_RJC 0x040B0 /* RX Jabber Count - R/clr */ +-#define E1000_MGTPRC 0x040B4 /* Management Packets RX Count - R/clr */ +-#define E1000_MGTPDC 0x040B8 /* Management Packets Dropped Count - R/clr */ +-#define E1000_MGTPTC 0x040BC /* Management Packets TX Count - R/clr */ +-#define E1000_TORL 0x040C0 /* Total Octets RX Low - R/clr */ +-#define E1000_TORH 0x040C4 /* Total Octets RX High - R/clr */ +-#define E1000_TOTL 0x040C8 /* Total Octets TX Low - R/clr */ +-#define E1000_TOTH 0x040CC /* Total Octets TX High - R/clr */ +-#define E1000_TPR 0x040D0 /* Total Packets RX - R/clr */ +-#define E1000_TPT 0x040D4 /* Total Packets TX - R/clr */ +-#define E1000_PTC64 0x040D8 /* Packets TX (64 bytes) - R/clr */ +-#define E1000_PTC127 0x040DC /* Packets TX (65-127 bytes) - R/clr */ +-#define E1000_PTC255 0x040E0 /* Packets TX (128-255 bytes) - R/clr */ +-#define E1000_PTC511 0x040E4 /* Packets TX (256-511 bytes) - R/clr */ +-#define E1000_PTC1023 0x040E8 /* Packets TX (512-1023 bytes) - R/clr */ +-#define E1000_PTC1522 0x040EC /* Packets TX (1024-1522 Bytes) - R/clr */ +-#define E1000_MPTC 0x040F0 /* Multicast Packets TX Count - R/clr */ +-#define E1000_BPTC 0x040F4 /* Broadcast Packets TX Count - R/clr */ +-#define E1000_TSCTC 0x040F8 /* TCP Segmentation Context TX - R/clr */ +-#define E1000_TSCTFC 0x040FC /* TCP Segmentation Context TX Fail - R/clr */ +-#define E1000_IAC 0x04100 /* Interrupt Assertion Count */ +-#define E1000_ICRXPTC 0x04104 /* Interrupt Cause Rx Packet Timer Expire Count */ +-#define E1000_ICRXATC 0x04108 /* Interrupt Cause Rx Absolute Timer Expire Count */ +-#define E1000_ICTXPTC 0x0410C /* Interrupt Cause Tx Packet Timer Expire Count */ +-#define E1000_ICTXATC 0x04110 /* Interrupt Cause Tx Absolute Timer Expire Count */ +-#define E1000_ICTXQEC 0x04118 /* Interrupt Cause Tx Queue Empty Count */ +-#define E1000_ICTXQMTC 0x0411C /* Interrupt Cause Tx Queue Minimum Threshold Count */ +-#define E1000_ICRXDMTC 0x04120 /* Interrupt Cause Rx Descriptor Minimum Threshold Count */ +-#define E1000_ICRXOC 0x04124 /* Interrupt Cause Receiver Overrun Count */ +-#define E1000_RXCSUM 0x05000 /* RX Checksum Control - RW */ +-#define E1000_RFCTL 0x05008 /* Receive Filter Control*/ +-#define E1000_MTA 0x05200 /* Multicast Table Array - RW Array */ +-#define E1000_RA 0x05400 /* Receive Address - RW Array */ +-#define E1000_VFTA 0x05600 /* VLAN Filter Table Array - RW Array */ +-#define E1000_WUC 0x05800 /* Wakeup Control - RW */ +-#define E1000_WUFC 0x05808 /* Wakeup Filter Control - RW */ +-#define E1000_WUS 0x05810 /* Wakeup Status - RO */ +-#define E1000_MANC 0x05820 /* Management Control - RW */ +-#define E1000_IPAV 0x05838 /* IP Address Valid - RW */ +-#define E1000_IP4AT 0x05840 /* IPv4 Address Table - RW Array */ +-#define E1000_IP6AT 0x05880 /* IPv6 Address Table - RW Array */ +-#define E1000_WUPL 0x05900 /* Wakeup Packet Length - RW */ +-#define E1000_WUPM 0x05A00 /* Wakeup Packet Memory - RO A */ +-#define E1000_FFLT 0x05F00 /* Flexible Filter Length Table - RW Array */ +-#define E1000_HOST_IF 0x08800 /* Host Interface */ +-#define E1000_FFMT 0x09000 /* Flexible Filter Mask Table - RW Array */ +-#define E1000_FFVT 0x09800 /* Flexible Filter Value Table - RW Array */ +- +-#define E1000_KUMCTRLSTA 0x00034 /* MAC-PHY interface - RW */ +-#define E1000_MDPHYA 0x0003C /* PHY address - RW */ +-#define E1000_MANC2H 0x05860 /* Managment Control To Host - RW */ +-#define E1000_SW_FW_SYNC 0x05B5C /* Software-Firmware Synchronization - RW */ +- +-#define E1000_GCR 0x05B00 /* PCI-Ex Control */ +-#define E1000_GSCL_1 0x05B10 /* PCI-Ex Statistic Control #1 */ +-#define E1000_GSCL_2 0x05B14 /* PCI-Ex Statistic Control #2 */ +-#define E1000_GSCL_3 0x05B18 /* PCI-Ex Statistic Control #3 */ +-#define E1000_GSCL_4 0x05B1C /* PCI-Ex Statistic Control #4 */ +-#define E1000_FACTPS 0x05B30 /* Function Active and Power State to MNG */ +-#define E1000_SWSM 0x05B50 /* SW Semaphore */ +-#define E1000_FWSM 0x05B54 /* FW Semaphore */ +-#define E1000_FFLT_DBG 0x05F04 /* Debug Register */ +-#define E1000_HICR 0x08F00 /* Host Inteface Control */ +- +-/* RSS registers */ +-#define E1000_CPUVEC 0x02C10 /* CPU Vector Register - RW */ +-#define E1000_MRQC 0x05818 /* Multiple Receive Control - RW */ +-#define E1000_RETA 0x05C00 /* Redirection Table - RW Array */ +-#define E1000_RSSRK 0x05C80 /* RSS Random Key - RW Array */ +-#define E1000_RSSIM 0x05864 /* RSS Interrupt Mask */ +-#define E1000_RSSIR 0x05868 /* RSS Interrupt Request */ +-/* Register Set (82542) +- * +- * Some of the 82542 registers are located at different offsets than they are +- * in more current versions of the 8254x. Despite the difference in location, +- * the registers function in the same manner. +- */ +-#define E1000_82542_CTRL E1000_CTRL +-#define E1000_82542_CTRL_DUP E1000_CTRL_DUP +-#define E1000_82542_STATUS E1000_STATUS +-#define E1000_82542_EECD E1000_EECD +-#define E1000_82542_EERD E1000_EERD +-#define E1000_82542_CTRL_EXT E1000_CTRL_EXT +-#define E1000_82542_FLA E1000_FLA +-#define E1000_82542_MDIC E1000_MDIC +-#define E1000_82542_SCTL E1000_SCTL +-#define E1000_82542_FEXTNVM E1000_FEXTNVM +-#define E1000_82542_FCAL E1000_FCAL +-#define E1000_82542_FCAH E1000_FCAH +-#define E1000_82542_FCT E1000_FCT +-#define E1000_82542_VET E1000_VET +-#define E1000_82542_RA 0x00040 +-#define E1000_82542_ICR E1000_ICR +-#define E1000_82542_ITR E1000_ITR +-#define E1000_82542_ICS E1000_ICS +-#define E1000_82542_IMS E1000_IMS +-#define E1000_82542_IMC E1000_IMC +-#define E1000_82542_RCTL E1000_RCTL +-#define E1000_82542_RDTR 0x00108 +-#define E1000_82542_RDBAL 0x00110 +-#define E1000_82542_RDBAH 0x00114 +-#define E1000_82542_RDLEN 0x00118 +-#define E1000_82542_RDH 0x00120 +-#define E1000_82542_RDT 0x00128 +-#define E1000_82542_RDTR0 E1000_82542_RDTR +-#define E1000_82542_RDBAL0 E1000_82542_RDBAL +-#define E1000_82542_RDBAH0 E1000_82542_RDBAH +-#define E1000_82542_RDLEN0 E1000_82542_RDLEN +-#define E1000_82542_RDH0 E1000_82542_RDH +-#define E1000_82542_RDT0 E1000_82542_RDT +-#define E1000_82542_SRRCTL(_n) (0x280C + ((_n) << 8)) /* Split and Replication +- * RX Control - RW */ +-#define E1000_82542_DCA_RXCTRL(_n) (0x02814 + ((_n) << 8)) +-#define E1000_82542_RDBAH3 0x02B04 /* RX Desc Base High Queue 3 - RW */ +-#define E1000_82542_RDBAL3 0x02B00 /* RX Desc Low Queue 3 - RW */ +-#define E1000_82542_RDLEN3 0x02B08 /* RX Desc Length Queue 3 - RW */ +-#define E1000_82542_RDH3 0x02B10 /* RX Desc Head Queue 3 - RW */ +-#define E1000_82542_RDT3 0x02B18 /* RX Desc Tail Queue 3 - RW */ +-#define E1000_82542_RDBAL2 0x02A00 /* RX Desc Base Low Queue 2 - RW */ +-#define E1000_82542_RDBAH2 0x02A04 /* RX Desc Base High Queue 2 - RW */ +-#define E1000_82542_RDLEN2 0x02A08 /* RX Desc Length Queue 2 - RW */ +-#define E1000_82542_RDH2 0x02A10 /* RX Desc Head Queue 2 - RW */ +-#define E1000_82542_RDT2 0x02A18 /* RX Desc Tail Queue 2 - RW */ +-#define E1000_82542_RDTR1 0x00130 +-#define E1000_82542_RDBAL1 0x00138 +-#define E1000_82542_RDBAH1 0x0013C +-#define E1000_82542_RDLEN1 0x00140 +-#define E1000_82542_RDH1 0x00148 +-#define E1000_82542_RDT1 0x00150 +-#define E1000_82542_FCRTH 0x00160 +-#define E1000_82542_FCRTL 0x00168 +-#define E1000_82542_FCTTV E1000_FCTTV +-#define E1000_82542_TXCW E1000_TXCW +-#define E1000_82542_RXCW E1000_RXCW +-#define E1000_82542_MTA 0x00200 +-#define E1000_82542_TCTL E1000_TCTL +-#define E1000_82542_TCTL_EXT E1000_TCTL_EXT +-#define E1000_82542_TIPG E1000_TIPG +-#define E1000_82542_TDBAL 0x00420 +-#define E1000_82542_TDBAH 0x00424 +-#define E1000_82542_TDLEN 0x00428 +-#define E1000_82542_TDH 0x00430 +-#define E1000_82542_TDT 0x00438 +-#define E1000_82542_TIDV 0x00440 +-#define E1000_82542_TBT E1000_TBT +-#define E1000_82542_AIT E1000_AIT +-#define E1000_82542_VFTA 0x00600 +-#define E1000_82542_LEDCTL E1000_LEDCTL +-#define E1000_82542_PBA E1000_PBA +-#define E1000_82542_PBS E1000_PBS +-#define E1000_82542_EEMNGCTL E1000_EEMNGCTL +-#define E1000_82542_EEARBC E1000_EEARBC +-#define E1000_82542_FLASHT E1000_FLASHT +-#define E1000_82542_EEWR E1000_EEWR +-#define E1000_82542_FLSWCTL E1000_FLSWCTL +-#define E1000_82542_FLSWDATA E1000_FLSWDATA +-#define E1000_82542_FLSWCNT E1000_FLSWCNT +-#define E1000_82542_FLOP E1000_FLOP +-#define E1000_82542_EXTCNF_CTRL E1000_EXTCNF_CTRL +-#define E1000_82542_EXTCNF_SIZE E1000_EXTCNF_SIZE +-#define E1000_82542_PHY_CTRL E1000_PHY_CTRL +-#define E1000_82542_ERT E1000_ERT +-#define E1000_82542_RXDCTL E1000_RXDCTL +-#define E1000_82542_RXDCTL1 E1000_RXDCTL1 +-#define E1000_82542_RADV E1000_RADV +-#define E1000_82542_RSRPD E1000_RSRPD +-#define E1000_82542_TXDMAC E1000_TXDMAC +-#define E1000_82542_KABGTXD E1000_KABGTXD +-#define E1000_82542_TDFHS E1000_TDFHS +-#define E1000_82542_TDFTS E1000_TDFTS +-#define E1000_82542_TDFPC E1000_TDFPC +-#define E1000_82542_TXDCTL E1000_TXDCTL +-#define E1000_82542_TADV E1000_TADV +-#define E1000_82542_TSPMT E1000_TSPMT +-#define E1000_82542_CRCERRS E1000_CRCERRS +-#define E1000_82542_ALGNERRC E1000_ALGNERRC +-#define E1000_82542_SYMERRS E1000_SYMERRS +-#define E1000_82542_RXERRC E1000_RXERRC +-#define E1000_82542_MPC E1000_MPC +-#define E1000_82542_SCC E1000_SCC +-#define E1000_82542_ECOL E1000_ECOL +-#define E1000_82542_MCC E1000_MCC +-#define E1000_82542_LATECOL E1000_LATECOL +-#define E1000_82542_COLC E1000_COLC +-#define E1000_82542_DC E1000_DC +-#define E1000_82542_TNCRS E1000_TNCRS +-#define E1000_82542_SEC E1000_SEC +-#define E1000_82542_CEXTERR E1000_CEXTERR +-#define E1000_82542_RLEC E1000_RLEC +-#define E1000_82542_XONRXC E1000_XONRXC +-#define E1000_82542_XONTXC E1000_XONTXC +-#define E1000_82542_XOFFRXC E1000_XOFFRXC +-#define E1000_82542_XOFFTXC E1000_XOFFTXC +-#define E1000_82542_FCRUC E1000_FCRUC +-#define E1000_82542_PRC64 E1000_PRC64 +-#define E1000_82542_PRC127 E1000_PRC127 +-#define E1000_82542_PRC255 E1000_PRC255 +-#define E1000_82542_PRC511 E1000_PRC511 +-#define E1000_82542_PRC1023 E1000_PRC1023 +-#define E1000_82542_PRC1522 E1000_PRC1522 +-#define E1000_82542_GPRC E1000_GPRC +-#define E1000_82542_BPRC E1000_BPRC +-#define E1000_82542_MPRC E1000_MPRC +-#define E1000_82542_GPTC E1000_GPTC +-#define E1000_82542_GORCL E1000_GORCL +-#define E1000_82542_GORCH E1000_GORCH +-#define E1000_82542_GOTCL E1000_GOTCL +-#define E1000_82542_GOTCH E1000_GOTCH +-#define E1000_82542_RNBC E1000_RNBC +-#define E1000_82542_RUC E1000_RUC +-#define E1000_82542_RFC E1000_RFC +-#define E1000_82542_ROC E1000_ROC +-#define E1000_82542_RJC E1000_RJC +-#define E1000_82542_MGTPRC E1000_MGTPRC +-#define E1000_82542_MGTPDC E1000_MGTPDC +-#define E1000_82542_MGTPTC E1000_MGTPTC +-#define E1000_82542_TORL E1000_TORL +-#define E1000_82542_TORH E1000_TORH +-#define E1000_82542_TOTL E1000_TOTL +-#define E1000_82542_TOTH E1000_TOTH +-#define E1000_82542_TPR E1000_TPR +-#define E1000_82542_TPT E1000_TPT +-#define E1000_82542_PTC64 E1000_PTC64 +-#define E1000_82542_PTC127 E1000_PTC127 +-#define E1000_82542_PTC255 E1000_PTC255 +-#define E1000_82542_PTC511 E1000_PTC511 +-#define E1000_82542_PTC1023 E1000_PTC1023 +-#define E1000_82542_PTC1522 E1000_PTC1522 +-#define E1000_82542_MPTC E1000_MPTC +-#define E1000_82542_BPTC E1000_BPTC +-#define E1000_82542_TSCTC E1000_TSCTC +-#define E1000_82542_TSCTFC E1000_TSCTFC +-#define E1000_82542_RXCSUM E1000_RXCSUM +-#define E1000_82542_WUC E1000_WUC +-#define E1000_82542_WUFC E1000_WUFC +-#define E1000_82542_WUS E1000_WUS +-#define E1000_82542_MANC E1000_MANC +-#define E1000_82542_IPAV E1000_IPAV +-#define E1000_82542_IP4AT E1000_IP4AT +-#define E1000_82542_IP6AT E1000_IP6AT +-#define E1000_82542_WUPL E1000_WUPL +-#define E1000_82542_WUPM E1000_WUPM +-#define E1000_82542_FFLT E1000_FFLT +-#define E1000_82542_TDFH 0x08010 +-#define E1000_82542_TDFT 0x08018 +-#define E1000_82542_FFMT E1000_FFMT +-#define E1000_82542_FFVT E1000_FFVT +-#define E1000_82542_HOST_IF E1000_HOST_IF +-#define E1000_82542_IAM E1000_IAM +-#define E1000_82542_EEMNGCTL E1000_EEMNGCTL +-#define E1000_82542_PSRCTL E1000_PSRCTL +-#define E1000_82542_RAID E1000_RAID +-#define E1000_82542_TARC0 E1000_TARC0 +-#define E1000_82542_TDBAL1 E1000_TDBAL1 +-#define E1000_82542_TDBAH1 E1000_TDBAH1 +-#define E1000_82542_TDLEN1 E1000_TDLEN1 +-#define E1000_82542_TDH1 E1000_TDH1 +-#define E1000_82542_TDT1 E1000_TDT1 +-#define E1000_82542_TXDCTL1 E1000_TXDCTL1 +-#define E1000_82542_TARC1 E1000_TARC1 +-#define E1000_82542_RFCTL E1000_RFCTL +-#define E1000_82542_GCR E1000_GCR +-#define E1000_82542_GSCL_1 E1000_GSCL_1 +-#define E1000_82542_GSCL_2 E1000_GSCL_2 +-#define E1000_82542_GSCL_3 E1000_GSCL_3 +-#define E1000_82542_GSCL_4 E1000_GSCL_4 +-#define E1000_82542_FACTPS E1000_FACTPS +-#define E1000_82542_SWSM E1000_SWSM +-#define E1000_82542_FWSM E1000_FWSM +-#define E1000_82542_FFLT_DBG E1000_FFLT_DBG +-#define E1000_82542_IAC E1000_IAC +-#define E1000_82542_ICRXPTC E1000_ICRXPTC +-#define E1000_82542_ICRXATC E1000_ICRXATC +-#define E1000_82542_ICTXPTC E1000_ICTXPTC +-#define E1000_82542_ICTXATC E1000_ICTXATC +-#define E1000_82542_ICTXQEC E1000_ICTXQEC +-#define E1000_82542_ICTXQMTC E1000_ICTXQMTC +-#define E1000_82542_ICRXDMTC E1000_ICRXDMTC +-#define E1000_82542_ICRXOC E1000_ICRXOC +-#define E1000_82542_HICR E1000_HICR +- +-#define E1000_82542_CPUVEC E1000_CPUVEC +-#define E1000_82542_MRQC E1000_MRQC +-#define E1000_82542_RETA E1000_RETA +-#define E1000_82542_RSSRK E1000_RSSRK +-#define E1000_82542_RSSIM E1000_RSSIM +-#define E1000_82542_RSSIR E1000_RSSIR +-#define E1000_82542_KUMCTRLSTA E1000_KUMCTRLSTA +-#define E1000_82542_SW_FW_SYNC E1000_SW_FW_SYNC +-#define E1000_82542_MANC2H E1000_MANC2H + + /* Statistics counters collected by the MAC */ + struct e1000_hw_stats { +- u64 crcerrs; +- u64 algnerrc; +- u64 symerrs; +- u64 rxerrc; +- u64 txerrc; +- u64 mpc; +- u64 scc; +- u64 ecol; +- u64 mcc; +- u64 latecol; +- u64 colc; +- u64 dc; +- u64 tncrs; +- u64 sec; +- u64 cexterr; +- u64 rlec; +- u64 xonrxc; +- u64 xontxc; +- u64 xoffrxc; +- u64 xofftxc; +- u64 fcruc; +- u64 prc64; +- u64 prc127; +- u64 prc255; +- u64 prc511; +- u64 prc1023; +- u64 prc1522; +- u64 gprc; +- u64 bprc; +- u64 mprc; +- u64 gptc; +- u64 gorcl; +- u64 gorch; +- u64 gotcl; +- u64 gotch; +- u64 rnbc; +- u64 ruc; +- u64 rfc; +- u64 roc; +- u64 rlerrc; +- u64 rjc; +- u64 mgprc; +- u64 mgpdc; +- u64 mgptc; +- u64 torl; +- u64 torh; +- u64 totl; +- u64 toth; +- u64 tpr; +- u64 tpt; +- u64 ptc64; +- u64 ptc127; +- u64 ptc255; +- u64 ptc511; +- u64 ptc1023; +- u64 ptc1522; +- u64 mptc; +- u64 bptc; +- u64 tsctc; +- u64 tsctfc; +- u64 iac; +- u64 icrxptc; +- u64 icrxatc; +- u64 ictxptc; +- u64 ictxatc; +- u64 ictxqec; +- u64 ictxqmtc; +- u64 icrxdmtc; +- u64 icrxoc; ++ u64 crcerrs; ++ u64 algnerrc; ++ u64 symerrs; ++ u64 rxerrc; ++ u64 mpc; ++ u64 scc; ++ u64 ecol; ++ u64 mcc; ++ u64 latecol; ++ u64 colc; ++ u64 dc; ++ u64 tncrs; ++ u64 sec; ++ u64 cexterr; ++ u64 rlec; ++ u64 xonrxc; ++ u64 xontxc; ++ u64 xoffrxc; ++ u64 xofftxc; ++ u64 fcruc; ++ u64 prc64; ++ u64 prc127; ++ u64 prc255; ++ u64 prc511; ++ u64 prc1023; ++ u64 prc1522; ++ u64 gprc; ++ u64 bprc; ++ u64 mprc; ++ u64 gptc; ++ u64 gorc; ++ u64 gotc; ++ u64 rnbc; ++ u64 ruc; ++ u64 rfc; ++ u64 roc; ++ u64 rjc; ++ u64 mgprc; ++ u64 mgpdc; ++ u64 mgptc; ++ u64 tor; ++ u64 tot; ++ u64 tpr; ++ u64 tpt; ++ u64 ptc64; ++ u64 ptc127; ++ u64 ptc255; ++ u64 ptc511; ++ u64 ptc1023; ++ u64 ptc1522; ++ u64 mptc; ++ u64 bptc; ++ u64 tsctc; ++ u64 tsctfc; ++ u64 iac; ++ u64 icrxptc; ++ u64 icrxatc; ++ u64 ictxptc; ++ u64 ictxatc; ++ u64 ictxqec; ++ u64 ictxqmtc; ++ u64 icrxdmtc; ++ u64 icrxoc; ++ u64 cbtmpc; ++ u64 htdpmc; ++ u64 cbrdpc; ++ u64 cbrmpc; ++ u64 rpthc; ++ u64 hgptc; ++ u64 htcbdpc; ++ u64 hgorc; ++ u64 hgotc; ++ u64 lenerrs; ++ u64 scvpc; ++ u64 hrmpc; ++ u64 doosync; + }; + +-/* Structure containing variables used by the shared code (e1000_hw.c) */ +-struct e1000_hw { +- u8 __iomem *hw_addr; +- u8 __iomem *flash_address; +- e1000_mac_type mac_type; +- e1000_phy_type phy_type; +- u32 phy_init_script; +- e1000_media_type media_type; +- void *back; +- struct e1000_shadow_ram *eeprom_shadow_ram; +- u32 flash_bank_size; +- u32 flash_base_addr; +- e1000_fc_type fc; +- e1000_bus_speed bus_speed; +- e1000_bus_width bus_width; +- e1000_bus_type bus_type; +- struct e1000_eeprom_info eeprom; +- e1000_ms_type master_slave; +- e1000_ms_type original_master_slave; +- e1000_ffe_config ffe_config_state; +- u32 asf_firmware_present; +- u32 eeprom_semaphore_present; +- u32 swfw_sync_present; +- u32 swfwhw_semaphore_present; +- unsigned long io_base; +- u32 phy_id; +- u32 phy_revision; +- u32 phy_addr; +- u32 original_fc; +- u32 txcw; +- u32 autoneg_failed; +- u32 max_frame_size; +- u32 min_frame_size; +- u32 mc_filter_type; +- u32 num_mc_addrs; +- u32 collision_delta; +- u32 tx_packet_delta; +- u32 ledctl_default; +- u32 ledctl_mode1; +- u32 ledctl_mode2; +- bool tx_pkt_filtering; +- struct e1000_host_mng_dhcp_cookie mng_cookie; +- u16 phy_spd_default; +- u16 autoneg_advertised; +- u16 pci_cmd_word; +- u16 fc_high_water; +- u16 fc_low_water; +- u16 fc_pause_time; +- u16 current_ifs_val; +- u16 ifs_min_val; +- u16 ifs_max_val; +- u16 ifs_step_size; +- u16 ifs_ratio; +- u16 device_id; +- u16 vendor_id; +- u16 subsystem_id; +- u16 subsystem_vendor_id; +- u8 revision_id; +- u8 autoneg; +- u8 mdix; +- u8 forced_speed_duplex; +- u8 wait_autoneg_complete; +- u8 dma_fairness; +- u8 mac_addr[NODE_ADDRESS_SIZE]; +- u8 perm_mac_addr[NODE_ADDRESS_SIZE]; +- bool disable_polarity_correction; +- bool speed_downgraded; +- e1000_smart_speed smart_speed; +- e1000_dsp_config dsp_config_state; +- bool get_link_status; +- bool serdes_link_down; +- bool tbi_compatibility_en; +- bool tbi_compatibility_on; +- bool laa_is_present; +- bool phy_reset_disable; +- bool initialize_hw_bits_disable; +- bool fc_send_xon; +- bool fc_strict_ieee; +- bool report_tx_early; +- bool adaptive_ifs; +- bool ifs_params_forced; +- bool in_ifs_mode; +- bool mng_reg_access_disabled; +- bool leave_av_bit_off; +- bool kmrn_lock_loss_workaround_disabled; +- bool bad_tx_carr_stats_fd; +- bool has_manc2h; +- bool rx_needs_kicking; +- bool has_smbus; ++ ++struct e1000_phy_stats { ++ u32 idle_errors; ++ u32 receive_errors; + }; + +- +-#define E1000_EEPROM_SWDPIN0 0x0001 /* SWDPIN 0 EEPROM Value */ +-#define E1000_EEPROM_LED_LOGIC 0x0020 /* Led Logic Word */ +-#define E1000_EEPROM_RW_REG_DATA 16 /* Offset to data in EEPROM read/write registers */ +-#define E1000_EEPROM_RW_REG_DONE 2 /* Offset to READ/WRITE done bit */ +-#define E1000_EEPROM_RW_REG_START 1 /* First bit for telling part to start operation */ +-#define E1000_EEPROM_RW_ADDR_SHIFT 2 /* Shift to the address bits */ +-#define E1000_EEPROM_POLL_WRITE 1 /* Flag for polling for write complete */ +-#define E1000_EEPROM_POLL_READ 0 /* Flag for polling for read complete */ +-/* Register Bit Masks */ +-/* Device Control */ +-#define E1000_CTRL_FD 0x00000001 /* Full duplex.0=half; 1=full */ +-#define E1000_CTRL_BEM 0x00000002 /* Endian Mode.0=little,1=big */ +-#define E1000_CTRL_PRIOR 0x00000004 /* Priority on PCI. 0=rx,1=fair */ +-#define E1000_CTRL_GIO_MASTER_DISABLE 0x00000004 /*Blocks new Master requests */ +-#define E1000_CTRL_LRST 0x00000008 /* Link reset. 0=normal,1=reset */ +-#define E1000_CTRL_TME 0x00000010 /* Test mode. 0=normal,1=test */ +-#define E1000_CTRL_SLE 0x00000020 /* Serial Link on 0=dis,1=en */ +-#define E1000_CTRL_ASDE 0x00000020 /* Auto-speed detect enable */ +-#define E1000_CTRL_SLU 0x00000040 /* Set link up (Force Link) */ +-#define E1000_CTRL_ILOS 0x00000080 /* Invert Loss-Of Signal */ +-#define E1000_CTRL_SPD_SEL 0x00000300 /* Speed Select Mask */ +-#define E1000_CTRL_SPD_10 0x00000000 /* Force 10Mb */ +-#define E1000_CTRL_SPD_100 0x00000100 /* Force 100Mb */ +-#define E1000_CTRL_SPD_1000 0x00000200 /* Force 1Gb */ +-#define E1000_CTRL_BEM32 0x00000400 /* Big Endian 32 mode */ +-#define E1000_CTRL_FRCSPD 0x00000800 /* Force Speed */ +-#define E1000_CTRL_FRCDPX 0x00001000 /* Force Duplex */ +-#define E1000_CTRL_D_UD_EN 0x00002000 /* Dock/Undock enable */ +-#define E1000_CTRL_D_UD_POLARITY 0x00004000 /* Defined polarity of Dock/Undock indication in SDP[0] */ +-#define E1000_CTRL_FORCE_PHY_RESET 0x00008000 /* Reset both PHY ports, through PHYRST_N pin */ +-#define E1000_CTRL_EXT_LINK_EN 0x00010000 /* enable link status from external LINK_0 and LINK_1 pins */ +-#define E1000_CTRL_SWDPIN0 0x00040000 /* SWDPIN 0 value */ +-#define E1000_CTRL_SWDPIN1 0x00080000 /* SWDPIN 1 value */ +-#define E1000_CTRL_SWDPIN2 0x00100000 /* SWDPIN 2 value */ +-#define E1000_CTRL_SWDPIN3 0x00200000 /* SWDPIN 3 value */ +-#define E1000_CTRL_SWDPIO0 0x00400000 /* SWDPIN 0 Input or output */ +-#define E1000_CTRL_SWDPIO1 0x00800000 /* SWDPIN 1 input or output */ +-#define E1000_CTRL_SWDPIO2 0x01000000 /* SWDPIN 2 input or output */ +-#define E1000_CTRL_SWDPIO3 0x02000000 /* SWDPIN 3 input or output */ +-#define E1000_CTRL_RST 0x04000000 /* Global reset */ +-#define E1000_CTRL_RFCE 0x08000000 /* Receive Flow Control enable */ +-#define E1000_CTRL_TFCE 0x10000000 /* Transmit flow control enable */ +-#define E1000_CTRL_RTE 0x20000000 /* Routing tag enable */ +-#define E1000_CTRL_VME 0x40000000 /* IEEE VLAN mode enable */ +-#define E1000_CTRL_PHY_RST 0x80000000 /* PHY Reset */ +-#define E1000_CTRL_SW2FW_INT 0x02000000 /* Initiate an interrupt to manageability engine */ +- +-/* Device Status */ +-#define E1000_STATUS_FD 0x00000001 /* Full duplex.0=half,1=full */ +-#define E1000_STATUS_LU 0x00000002 /* Link up.0=no,1=link */ +-#define E1000_STATUS_FUNC_MASK 0x0000000C /* PCI Function Mask */ +-#define E1000_STATUS_FUNC_SHIFT 2 +-#define E1000_STATUS_FUNC_0 0x00000000 /* Function 0 */ +-#define E1000_STATUS_FUNC_1 0x00000004 /* Function 1 */ +-#define E1000_STATUS_TXOFF 0x00000010 /* transmission paused */ +-#define E1000_STATUS_TBIMODE 0x00000020 /* TBI mode */ +-#define E1000_STATUS_SPEED_MASK 0x000000C0 +-#define E1000_STATUS_SPEED_10 0x00000000 /* Speed 10Mb/s */ +-#define E1000_STATUS_SPEED_100 0x00000040 /* Speed 100Mb/s */ +-#define E1000_STATUS_SPEED_1000 0x00000080 /* Speed 1000Mb/s */ +-#define E1000_STATUS_LAN_INIT_DONE 0x00000200 /* Lan Init Completion +- by EEPROM/Flash */ +-#define E1000_STATUS_ASDV 0x00000300 /* Auto speed detect value */ +-#define E1000_STATUS_DOCK_CI 0x00000800 /* Change in Dock/Undock state. Clear on write '0'. */ +-#define E1000_STATUS_GIO_MASTER_ENABLE 0x00080000 /* Status of Master requests. */ +-#define E1000_STATUS_MTXCKOK 0x00000400 /* MTX clock running OK */ +-#define E1000_STATUS_PCI66 0x00000800 /* In 66Mhz slot */ +-#define E1000_STATUS_BUS64 0x00001000 /* In 64 bit slot */ +-#define E1000_STATUS_PCIX_MODE 0x00002000 /* PCI-X mode */ +-#define E1000_STATUS_PCIX_SPEED 0x0000C000 /* PCI-X bus speed */ +-#define E1000_STATUS_BMC_SKU_0 0x00100000 /* BMC USB redirect disabled */ +-#define E1000_STATUS_BMC_SKU_1 0x00200000 /* BMC SRAM disabled */ +-#define E1000_STATUS_BMC_SKU_2 0x00400000 /* BMC SDRAM disabled */ +-#define E1000_STATUS_BMC_CRYPTO 0x00800000 /* BMC crypto disabled */ +-#define E1000_STATUS_BMC_LITE 0x01000000 /* BMC external code execution disabled */ +-#define E1000_STATUS_RGMII_ENABLE 0x02000000 /* RGMII disabled */ +-#define E1000_STATUS_FUSE_8 0x04000000 +-#define E1000_STATUS_FUSE_9 0x08000000 +-#define E1000_STATUS_SERDES0_DIS 0x10000000 /* SERDES disabled on port 0 */ +-#define E1000_STATUS_SERDES1_DIS 0x20000000 /* SERDES disabled on port 1 */ +- +-/* Constants used to intrepret the masked PCI-X bus speed. */ +-#define E1000_STATUS_PCIX_SPEED_66 0x00000000 /* PCI-X bus speed 50-66 MHz */ +-#define E1000_STATUS_PCIX_SPEED_100 0x00004000 /* PCI-X bus speed 66-100 MHz */ +-#define E1000_STATUS_PCIX_SPEED_133 0x00008000 /* PCI-X bus speed 100-133 MHz */ +- +-/* EEPROM/Flash Control */ +-#define E1000_EECD_SK 0x00000001 /* EEPROM Clock */ +-#define E1000_EECD_CS 0x00000002 /* EEPROM Chip Select */ +-#define E1000_EECD_DI 0x00000004 /* EEPROM Data In */ +-#define E1000_EECD_DO 0x00000008 /* EEPROM Data Out */ +-#define E1000_EECD_FWE_MASK 0x00000030 +-#define E1000_EECD_FWE_DIS 0x00000010 /* Disable FLASH writes */ +-#define E1000_EECD_FWE_EN 0x00000020 /* Enable FLASH writes */ +-#define E1000_EECD_FWE_SHIFT 4 +-#define E1000_EECD_REQ 0x00000040 /* EEPROM Access Request */ +-#define E1000_EECD_GNT 0x00000080 /* EEPROM Access Grant */ +-#define E1000_EECD_PRES 0x00000100 /* EEPROM Present */ +-#define E1000_EECD_SIZE 0x00000200 /* EEPROM Size (0=64 word 1=256 word) */ +-#define E1000_EECD_ADDR_BITS 0x00000400 /* EEPROM Addressing bits based on type +- * (0-small, 1-large) */ +-#define E1000_EECD_TYPE 0x00002000 /* EEPROM Type (1-SPI, 0-Microwire) */ +-#ifndef E1000_EEPROM_GRANT_ATTEMPTS +-#define E1000_EEPROM_GRANT_ATTEMPTS 1000 /* EEPROM # attempts to gain grant */ +-#endif +-#define E1000_EECD_AUTO_RD 0x00000200 /* EEPROM Auto Read done */ +-#define E1000_EECD_SIZE_EX_MASK 0x00007800 /* EEprom Size */ +-#define E1000_EECD_SIZE_EX_SHIFT 11 +-#define E1000_EECD_NVADDS 0x00018000 /* NVM Address Size */ +-#define E1000_EECD_SELSHAD 0x00020000 /* Select Shadow RAM */ +-#define E1000_EECD_INITSRAM 0x00040000 /* Initialize Shadow RAM */ +-#define E1000_EECD_FLUPD 0x00080000 /* Update FLASH */ +-#define E1000_EECD_AUPDEN 0x00100000 /* Enable Autonomous FLASH update */ +-#define E1000_EECD_SHADV 0x00200000 /* Shadow RAM Data Valid */ +-#define E1000_EECD_SEC1VAL 0x00400000 /* Sector One Valid */ +-#define E1000_EECD_SECVAL_SHIFT 22 +-#define E1000_STM_OPCODE 0xDB00 +-#define E1000_HICR_FW_RESET 0xC0 +- +-#define E1000_SHADOW_RAM_WORDS 2048 +-#define E1000_ICH_NVM_SIG_WORD 0x13 +-#define E1000_ICH_NVM_SIG_MASK 0xC0 +- +-/* EEPROM Read */ +-#define E1000_EERD_START 0x00000001 /* Start Read */ +-#define E1000_EERD_DONE 0x00000010 /* Read Done */ +-#define E1000_EERD_ADDR_SHIFT 8 +-#define E1000_EERD_ADDR_MASK 0x0000FF00 /* Read Address */ +-#define E1000_EERD_DATA_SHIFT 16 +-#define E1000_EERD_DATA_MASK 0xFFFF0000 /* Read Data */ +- +-/* SPI EEPROM Status Register */ +-#define EEPROM_STATUS_RDY_SPI 0x01 +-#define EEPROM_STATUS_WEN_SPI 0x02 +-#define EEPROM_STATUS_BP0_SPI 0x04 +-#define EEPROM_STATUS_BP1_SPI 0x08 +-#define EEPROM_STATUS_WPEN_SPI 0x80 +- +-/* Extended Device Control */ +-#define E1000_CTRL_EXT_GPI0_EN 0x00000001 /* Maps SDP4 to GPI0 */ +-#define E1000_CTRL_EXT_GPI1_EN 0x00000002 /* Maps SDP5 to GPI1 */ +-#define E1000_CTRL_EXT_PHYINT_EN E1000_CTRL_EXT_GPI1_EN +-#define E1000_CTRL_EXT_GPI2_EN 0x00000004 /* Maps SDP6 to GPI2 */ +-#define E1000_CTRL_EXT_GPI3_EN 0x00000008 /* Maps SDP7 to GPI3 */ +-#define E1000_CTRL_EXT_SDP4_DATA 0x00000010 /* Value of SW Defineable Pin 4 */ +-#define E1000_CTRL_EXT_SDP5_DATA 0x00000020 /* Value of SW Defineable Pin 5 */ +-#define E1000_CTRL_EXT_PHY_INT E1000_CTRL_EXT_SDP5_DATA +-#define E1000_CTRL_EXT_SDP6_DATA 0x00000040 /* Value of SW Defineable Pin 6 */ +-#define E1000_CTRL_EXT_SDP7_DATA 0x00000080 /* Value of SW Defineable Pin 7 */ +-#define E1000_CTRL_EXT_SDP4_DIR 0x00000100 /* Direction of SDP4 0=in 1=out */ +-#define E1000_CTRL_EXT_SDP5_DIR 0x00000200 /* Direction of SDP5 0=in 1=out */ +-#define E1000_CTRL_EXT_SDP6_DIR 0x00000400 /* Direction of SDP6 0=in 1=out */ +-#define E1000_CTRL_EXT_SDP7_DIR 0x00000800 /* Direction of SDP7 0=in 1=out */ +-#define E1000_CTRL_EXT_ASDCHK 0x00001000 /* Initiate an ASD sequence */ +-#define E1000_CTRL_EXT_EE_RST 0x00002000 /* Reinitialize from EEPROM */ +-#define E1000_CTRL_EXT_IPS 0x00004000 /* Invert Power State */ +-#define E1000_CTRL_EXT_SPD_BYPS 0x00008000 /* Speed Select Bypass */ +-#define E1000_CTRL_EXT_RO_DIS 0x00020000 /* Relaxed Ordering disable */ +-#define E1000_CTRL_EXT_LINK_MODE_MASK 0x00C00000 +-#define E1000_CTRL_EXT_LINK_MODE_GMII 0x00000000 +-#define E1000_CTRL_EXT_LINK_MODE_TBI 0x00C00000 +-#define E1000_CTRL_EXT_LINK_MODE_KMRN 0x00000000 +-#define E1000_CTRL_EXT_LINK_MODE_SERDES 0x00C00000 +-#define E1000_CTRL_EXT_LINK_MODE_SGMII 0x00800000 +-#define E1000_CTRL_EXT_WR_WMARK_MASK 0x03000000 +-#define E1000_CTRL_EXT_WR_WMARK_256 0x00000000 +-#define E1000_CTRL_EXT_WR_WMARK_320 0x01000000 +-#define E1000_CTRL_EXT_WR_WMARK_384 0x02000000 +-#define E1000_CTRL_EXT_WR_WMARK_448 0x03000000 +-#define E1000_CTRL_EXT_DRV_LOAD 0x10000000 /* Driver loaded bit for FW */ +-#define E1000_CTRL_EXT_IAME 0x08000000 /* Interrupt acknowledge Auto-mask */ +-#define E1000_CTRL_EXT_INT_TIMER_CLR 0x20000000 /* Clear Interrupt timers after IMS clear */ +-#define E1000_CRTL_EXT_PB_PAREN 0x01000000 /* packet buffer parity error detection enabled */ +-#define E1000_CTRL_EXT_DF_PAREN 0x02000000 /* descriptor FIFO parity error detection enable */ +-#define E1000_CTRL_EXT_GHOST_PAREN 0x40000000 +- +-/* MDI Control */ +-#define E1000_MDIC_DATA_MASK 0x0000FFFF +-#define E1000_MDIC_REG_MASK 0x001F0000 +-#define E1000_MDIC_REG_SHIFT 16 +-#define E1000_MDIC_PHY_MASK 0x03E00000 +-#define E1000_MDIC_PHY_SHIFT 21 +-#define E1000_MDIC_OP_WRITE 0x04000000 +-#define E1000_MDIC_OP_READ 0x08000000 +-#define E1000_MDIC_READY 0x10000000 +-#define E1000_MDIC_INT_EN 0x20000000 +-#define E1000_MDIC_ERROR 0x40000000 +- +-#define E1000_KUMCTRLSTA_MASK 0x0000FFFF +-#define E1000_KUMCTRLSTA_OFFSET 0x001F0000 +-#define E1000_KUMCTRLSTA_OFFSET_SHIFT 16 +-#define E1000_KUMCTRLSTA_REN 0x00200000 +- +-#define E1000_KUMCTRLSTA_OFFSET_FIFO_CTRL 0x00000000 +-#define E1000_KUMCTRLSTA_OFFSET_CTRL 0x00000001 +-#define E1000_KUMCTRLSTA_OFFSET_INB_CTRL 0x00000002 +-#define E1000_KUMCTRLSTA_OFFSET_DIAG 0x00000003 +-#define E1000_KUMCTRLSTA_OFFSET_TIMEOUTS 0x00000004 +-#define E1000_KUMCTRLSTA_OFFSET_INB_PARAM 0x00000009 +-#define E1000_KUMCTRLSTA_OFFSET_HD_CTRL 0x00000010 +-#define E1000_KUMCTRLSTA_OFFSET_M2P_SERDES 0x0000001E +-#define E1000_KUMCTRLSTA_OFFSET_M2P_MODES 0x0000001F +- +-/* FIFO Control */ +-#define E1000_KUMCTRLSTA_FIFO_CTRL_RX_BYPASS 0x00000008 +-#define E1000_KUMCTRLSTA_FIFO_CTRL_TX_BYPASS 0x00000800 +- +-/* In-Band Control */ +-#define E1000_KUMCTRLSTA_INB_CTRL_LINK_STATUS_TX_TIMEOUT_DEFAULT 0x00000500 +-#define E1000_KUMCTRLSTA_INB_CTRL_DIS_PADDING 0x00000010 +- +-/* Half-Duplex Control */ +-#define E1000_KUMCTRLSTA_HD_CTRL_10_100_DEFAULT 0x00000004 +-#define E1000_KUMCTRLSTA_HD_CTRL_1000_DEFAULT 0x00000000 +- +-#define E1000_KUMCTRLSTA_OFFSET_K0S_CTRL 0x0000001E +- +-#define E1000_KUMCTRLSTA_DIAG_FELPBK 0x2000 +-#define E1000_KUMCTRLSTA_DIAG_NELPBK 0x1000 +- +-#define E1000_KUMCTRLSTA_K0S_100_EN 0x2000 +-#define E1000_KUMCTRLSTA_K0S_GBE_EN 0x1000 +-#define E1000_KUMCTRLSTA_K0S_ENTRY_LATENCY_MASK 0x0003 +- +-#define E1000_KABGTXD_BGSQLBIAS 0x00050000 +- +-#define E1000_PHY_CTRL_SPD_EN 0x00000001 +-#define E1000_PHY_CTRL_D0A_LPLU 0x00000002 +-#define E1000_PHY_CTRL_NOND0A_LPLU 0x00000004 +-#define E1000_PHY_CTRL_NOND0A_GBE_DISABLE 0x00000008 +-#define E1000_PHY_CTRL_GBE_DISABLE 0x00000040 +-#define E1000_PHY_CTRL_B2B_EN 0x00000080 +- +-/* LED Control */ +-#define E1000_LEDCTL_LED0_MODE_MASK 0x0000000F +-#define E1000_LEDCTL_LED0_MODE_SHIFT 0 +-#define E1000_LEDCTL_LED0_BLINK_RATE 0x0000020 +-#define E1000_LEDCTL_LED0_IVRT 0x00000040 +-#define E1000_LEDCTL_LED0_BLINK 0x00000080 +-#define E1000_LEDCTL_LED1_MODE_MASK 0x00000F00 +-#define E1000_LEDCTL_LED1_MODE_SHIFT 8 +-#define E1000_LEDCTL_LED1_BLINK_RATE 0x0002000 +-#define E1000_LEDCTL_LED1_IVRT 0x00004000 +-#define E1000_LEDCTL_LED1_BLINK 0x00008000 +-#define E1000_LEDCTL_LED2_MODE_MASK 0x000F0000 +-#define E1000_LEDCTL_LED2_MODE_SHIFT 16 +-#define E1000_LEDCTL_LED2_BLINK_RATE 0x00200000 +-#define E1000_LEDCTL_LED2_IVRT 0x00400000 +-#define E1000_LEDCTL_LED2_BLINK 0x00800000 +-#define E1000_LEDCTL_LED3_MODE_MASK 0x0F000000 +-#define E1000_LEDCTL_LED3_MODE_SHIFT 24 +-#define E1000_LEDCTL_LED3_BLINK_RATE 0x20000000 +-#define E1000_LEDCTL_LED3_IVRT 0x40000000 +-#define E1000_LEDCTL_LED3_BLINK 0x80000000 +- +-#define E1000_LEDCTL_MODE_LINK_10_1000 0x0 +-#define E1000_LEDCTL_MODE_LINK_100_1000 0x1 +-#define E1000_LEDCTL_MODE_LINK_UP 0x2 +-#define E1000_LEDCTL_MODE_ACTIVITY 0x3 +-#define E1000_LEDCTL_MODE_LINK_ACTIVITY 0x4 +-#define E1000_LEDCTL_MODE_LINK_10 0x5 +-#define E1000_LEDCTL_MODE_LINK_100 0x6 +-#define E1000_LEDCTL_MODE_LINK_1000 0x7 +-#define E1000_LEDCTL_MODE_PCIX_MODE 0x8 +-#define E1000_LEDCTL_MODE_FULL_DUPLEX 0x9 +-#define E1000_LEDCTL_MODE_COLLISION 0xA +-#define E1000_LEDCTL_MODE_BUS_SPEED 0xB +-#define E1000_LEDCTL_MODE_BUS_SIZE 0xC +-#define E1000_LEDCTL_MODE_PAUSED 0xD +-#define E1000_LEDCTL_MODE_LED_ON 0xE +-#define E1000_LEDCTL_MODE_LED_OFF 0xF +- +-/* Receive Address */ +-#define E1000_RAH_AV 0x80000000 /* Receive descriptor valid */ +- +-/* Interrupt Cause Read */ +-#define E1000_ICR_TXDW 0x00000001 /* Transmit desc written back */ +-#define E1000_ICR_TXQE 0x00000002 /* Transmit Queue empty */ +-#define E1000_ICR_LSC 0x00000004 /* Link Status Change */ +-#define E1000_ICR_RXSEQ 0x00000008 /* rx sequence error */ +-#define E1000_ICR_RXDMT0 0x00000010 /* rx desc min. threshold (0) */ +-#define E1000_ICR_RXO 0x00000040 /* rx overrun */ +-#define E1000_ICR_RXT0 0x00000080 /* rx timer intr (ring 0) */ +-#define E1000_ICR_MDAC 0x00000200 /* MDIO access complete */ +-#define E1000_ICR_RXCFG 0x00000400 /* RX /c/ ordered set */ +-#define E1000_ICR_GPI_EN0 0x00000800 /* GP Int 0 */ +-#define E1000_ICR_GPI_EN1 0x00001000 /* GP Int 1 */ +-#define E1000_ICR_GPI_EN2 0x00002000 /* GP Int 2 */ +-#define E1000_ICR_GPI_EN3 0x00004000 /* GP Int 3 */ +-#define E1000_ICR_TXD_LOW 0x00008000 +-#define E1000_ICR_SRPD 0x00010000 +-#define E1000_ICR_ACK 0x00020000 /* Receive Ack frame */ +-#define E1000_ICR_MNG 0x00040000 /* Manageability event */ +-#define E1000_ICR_DOCK 0x00080000 /* Dock/Undock */ +-#define E1000_ICR_INT_ASSERTED 0x80000000 /* If this bit asserted, the driver should claim the interrupt */ +-#define E1000_ICR_RXD_FIFO_PAR0 0x00100000 /* queue 0 Rx descriptor FIFO parity error */ +-#define E1000_ICR_TXD_FIFO_PAR0 0x00200000 /* queue 0 Tx descriptor FIFO parity error */ +-#define E1000_ICR_HOST_ARB_PAR 0x00400000 /* host arb read buffer parity error */ +-#define E1000_ICR_PB_PAR 0x00800000 /* packet buffer parity error */ +-#define E1000_ICR_RXD_FIFO_PAR1 0x01000000 /* queue 1 Rx descriptor FIFO parity error */ +-#define E1000_ICR_TXD_FIFO_PAR1 0x02000000 /* queue 1 Tx descriptor FIFO parity error */ +-#define E1000_ICR_ALL_PARITY 0x03F00000 /* all parity error bits */ +-#define E1000_ICR_DSW 0x00000020 /* FW changed the status of DISSW bit in the FWSM */ +-#define E1000_ICR_PHYINT 0x00001000 /* LAN connected device generates an interrupt */ +-#define E1000_ICR_EPRST 0x00100000 /* ME handware reset occurs */ +- +-/* Interrupt Cause Set */ +-#define E1000_ICS_TXDW E1000_ICR_TXDW /* Transmit desc written back */ +-#define E1000_ICS_TXQE E1000_ICR_TXQE /* Transmit Queue empty */ +-#define E1000_ICS_LSC E1000_ICR_LSC /* Link Status Change */ +-#define E1000_ICS_RXSEQ E1000_ICR_RXSEQ /* rx sequence error */ +-#define E1000_ICS_RXDMT0 E1000_ICR_RXDMT0 /* rx desc min. threshold */ +-#define E1000_ICS_RXO E1000_ICR_RXO /* rx overrun */ +-#define E1000_ICS_RXT0 E1000_ICR_RXT0 /* rx timer intr */ +-#define E1000_ICS_MDAC E1000_ICR_MDAC /* MDIO access complete */ +-#define E1000_ICS_RXCFG E1000_ICR_RXCFG /* RX /c/ ordered set */ +-#define E1000_ICS_GPI_EN0 E1000_ICR_GPI_EN0 /* GP Int 0 */ +-#define E1000_ICS_GPI_EN1 E1000_ICR_GPI_EN1 /* GP Int 1 */ +-#define E1000_ICS_GPI_EN2 E1000_ICR_GPI_EN2 /* GP Int 2 */ +-#define E1000_ICS_GPI_EN3 E1000_ICR_GPI_EN3 /* GP Int 3 */ +-#define E1000_ICS_TXD_LOW E1000_ICR_TXD_LOW +-#define E1000_ICS_SRPD E1000_ICR_SRPD +-#define E1000_ICS_ACK E1000_ICR_ACK /* Receive Ack frame */ +-#define E1000_ICS_MNG E1000_ICR_MNG /* Manageability event */ +-#define E1000_ICS_DOCK E1000_ICR_DOCK /* Dock/Undock */ +-#define E1000_ICS_RXD_FIFO_PAR0 E1000_ICR_RXD_FIFO_PAR0 /* queue 0 Rx descriptor FIFO parity error */ +-#define E1000_ICS_TXD_FIFO_PAR0 E1000_ICR_TXD_FIFO_PAR0 /* queue 0 Tx descriptor FIFO parity error */ +-#define E1000_ICS_HOST_ARB_PAR E1000_ICR_HOST_ARB_PAR /* host arb read buffer parity error */ +-#define E1000_ICS_PB_PAR E1000_ICR_PB_PAR /* packet buffer parity error */ +-#define E1000_ICS_RXD_FIFO_PAR1 E1000_ICR_RXD_FIFO_PAR1 /* queue 1 Rx descriptor FIFO parity error */ +-#define E1000_ICS_TXD_FIFO_PAR1 E1000_ICR_TXD_FIFO_PAR1 /* queue 1 Tx descriptor FIFO parity error */ +-#define E1000_ICS_DSW E1000_ICR_DSW +-#define E1000_ICS_PHYINT E1000_ICR_PHYINT +-#define E1000_ICS_EPRST E1000_ICR_EPRST +- +-/* Interrupt Mask Set */ +-#define E1000_IMS_TXDW E1000_ICR_TXDW /* Transmit desc written back */ +-#define E1000_IMS_TXQE E1000_ICR_TXQE /* Transmit Queue empty */ +-#define E1000_IMS_LSC E1000_ICR_LSC /* Link Status Change */ +-#define E1000_IMS_RXSEQ E1000_ICR_RXSEQ /* rx sequence error */ +-#define E1000_IMS_RXDMT0 E1000_ICR_RXDMT0 /* rx desc min. threshold */ +-#define E1000_IMS_RXO E1000_ICR_RXO /* rx overrun */ +-#define E1000_IMS_RXT0 E1000_ICR_RXT0 /* rx timer intr */ +-#define E1000_IMS_MDAC E1000_ICR_MDAC /* MDIO access complete */ +-#define E1000_IMS_RXCFG E1000_ICR_RXCFG /* RX /c/ ordered set */ +-#define E1000_IMS_GPI_EN0 E1000_ICR_GPI_EN0 /* GP Int 0 */ +-#define E1000_IMS_GPI_EN1 E1000_ICR_GPI_EN1 /* GP Int 1 */ +-#define E1000_IMS_GPI_EN2 E1000_ICR_GPI_EN2 /* GP Int 2 */ +-#define E1000_IMS_GPI_EN3 E1000_ICR_GPI_EN3 /* GP Int 3 */ +-#define E1000_IMS_TXD_LOW E1000_ICR_TXD_LOW +-#define E1000_IMS_SRPD E1000_ICR_SRPD +-#define E1000_IMS_ACK E1000_ICR_ACK /* Receive Ack frame */ +-#define E1000_IMS_MNG E1000_ICR_MNG /* Manageability event */ +-#define E1000_IMS_DOCK E1000_ICR_DOCK /* Dock/Undock */ +-#define E1000_IMS_RXD_FIFO_PAR0 E1000_ICR_RXD_FIFO_PAR0 /* queue 0 Rx descriptor FIFO parity error */ +-#define E1000_IMS_TXD_FIFO_PAR0 E1000_ICR_TXD_FIFO_PAR0 /* queue 0 Tx descriptor FIFO parity error */ +-#define E1000_IMS_HOST_ARB_PAR E1000_ICR_HOST_ARB_PAR /* host arb read buffer parity error */ +-#define E1000_IMS_PB_PAR E1000_ICR_PB_PAR /* packet buffer parity error */ +-#define E1000_IMS_RXD_FIFO_PAR1 E1000_ICR_RXD_FIFO_PAR1 /* queue 1 Rx descriptor FIFO parity error */ +-#define E1000_IMS_TXD_FIFO_PAR1 E1000_ICR_TXD_FIFO_PAR1 /* queue 1 Tx descriptor FIFO parity error */ +-#define E1000_IMS_DSW E1000_ICR_DSW +-#define E1000_IMS_PHYINT E1000_ICR_PHYINT +-#define E1000_IMS_EPRST E1000_ICR_EPRST +- +-/* Interrupt Mask Clear */ +-#define E1000_IMC_TXDW E1000_ICR_TXDW /* Transmit desc written back */ +-#define E1000_IMC_TXQE E1000_ICR_TXQE /* Transmit Queue empty */ +-#define E1000_IMC_LSC E1000_ICR_LSC /* Link Status Change */ +-#define E1000_IMC_RXSEQ E1000_ICR_RXSEQ /* rx sequence error */ +-#define E1000_IMC_RXDMT0 E1000_ICR_RXDMT0 /* rx desc min. threshold */ +-#define E1000_IMC_RXO E1000_ICR_RXO /* rx overrun */ +-#define E1000_IMC_RXT0 E1000_ICR_RXT0 /* rx timer intr */ +-#define E1000_IMC_MDAC E1000_ICR_MDAC /* MDIO access complete */ +-#define E1000_IMC_RXCFG E1000_ICR_RXCFG /* RX /c/ ordered set */ +-#define E1000_IMC_GPI_EN0 E1000_ICR_GPI_EN0 /* GP Int 0 */ +-#define E1000_IMC_GPI_EN1 E1000_ICR_GPI_EN1 /* GP Int 1 */ +-#define E1000_IMC_GPI_EN2 E1000_ICR_GPI_EN2 /* GP Int 2 */ +-#define E1000_IMC_GPI_EN3 E1000_ICR_GPI_EN3 /* GP Int 3 */ +-#define E1000_IMC_TXD_LOW E1000_ICR_TXD_LOW +-#define E1000_IMC_SRPD E1000_ICR_SRPD +-#define E1000_IMC_ACK E1000_ICR_ACK /* Receive Ack frame */ +-#define E1000_IMC_MNG E1000_ICR_MNG /* Manageability event */ +-#define E1000_IMC_DOCK E1000_ICR_DOCK /* Dock/Undock */ +-#define E1000_IMC_RXD_FIFO_PAR0 E1000_ICR_RXD_FIFO_PAR0 /* queue 0 Rx descriptor FIFO parity error */ +-#define E1000_IMC_TXD_FIFO_PAR0 E1000_ICR_TXD_FIFO_PAR0 /* queue 0 Tx descriptor FIFO parity error */ +-#define E1000_IMC_HOST_ARB_PAR E1000_ICR_HOST_ARB_PAR /* host arb read buffer parity error */ +-#define E1000_IMC_PB_PAR E1000_ICR_PB_PAR /* packet buffer parity error */ +-#define E1000_IMC_RXD_FIFO_PAR1 E1000_ICR_RXD_FIFO_PAR1 /* queue 1 Rx descriptor FIFO parity error */ +-#define E1000_IMC_TXD_FIFO_PAR1 E1000_ICR_TXD_FIFO_PAR1 /* queue 1 Tx descriptor FIFO parity error */ +-#define E1000_IMC_DSW E1000_ICR_DSW +-#define E1000_IMC_PHYINT E1000_ICR_PHYINT +-#define E1000_IMC_EPRST E1000_ICR_EPRST +- +-/* Receive Control */ +-#define E1000_RCTL_RST 0x00000001 /* Software reset */ +-#define E1000_RCTL_EN 0x00000002 /* enable */ +-#define E1000_RCTL_SBP 0x00000004 /* store bad packet */ +-#define E1000_RCTL_UPE 0x00000008 /* unicast promiscuous enable */ +-#define E1000_RCTL_MPE 0x00000010 /* multicast promiscuous enab */ +-#define E1000_RCTL_LPE 0x00000020 /* long packet enable */ +-#define E1000_RCTL_LBM_NO 0x00000000 /* no loopback mode */ +-#define E1000_RCTL_LBM_MAC 0x00000040 /* MAC loopback mode */ +-#define E1000_RCTL_LBM_SLP 0x00000080 /* serial link loopback mode */ +-#define E1000_RCTL_LBM_TCVR 0x000000C0 /* tcvr loopback mode */ +-#define E1000_RCTL_DTYP_MASK 0x00000C00 /* Descriptor type mask */ +-#define E1000_RCTL_DTYP_PS 0x00000400 /* Packet Split descriptor */ +-#define E1000_RCTL_RDMTS_HALF 0x00000000 /* rx desc min threshold size */ +-#define E1000_RCTL_RDMTS_QUAT 0x00000100 /* rx desc min threshold size */ +-#define E1000_RCTL_RDMTS_EIGTH 0x00000200 /* rx desc min threshold size */ +-#define E1000_RCTL_MO_SHIFT 12 /* multicast offset shift */ +-#define E1000_RCTL_MO_0 0x00000000 /* multicast offset 11:0 */ +-#define E1000_RCTL_MO_1 0x00001000 /* multicast offset 12:1 */ +-#define E1000_RCTL_MO_2 0x00002000 /* multicast offset 13:2 */ +-#define E1000_RCTL_MO_3 0x00003000 /* multicast offset 15:4 */ +-#define E1000_RCTL_MDR 0x00004000 /* multicast desc ring 0 */ +-#define E1000_RCTL_BAM 0x00008000 /* broadcast enable */ +-/* these buffer sizes are valid if E1000_RCTL_BSEX is 0 */ +-#define E1000_RCTL_SZ_2048 0x00000000 /* rx buffer size 2048 */ +-#define E1000_RCTL_SZ_1024 0x00010000 /* rx buffer size 1024 */ +-#define E1000_RCTL_SZ_512 0x00020000 /* rx buffer size 512 */ +-#define E1000_RCTL_SZ_256 0x00030000 /* rx buffer size 256 */ +-/* these buffer sizes are valid if E1000_RCTL_BSEX is 1 */ +-#define E1000_RCTL_SZ_16384 0x00010000 /* rx buffer size 16384 */ +-#define E1000_RCTL_SZ_8192 0x00020000 /* rx buffer size 8192 */ +-#define E1000_RCTL_SZ_4096 0x00030000 /* rx buffer size 4096 */ +-#define E1000_RCTL_VFE 0x00040000 /* vlan filter enable */ +-#define E1000_RCTL_CFIEN 0x00080000 /* canonical form enable */ +-#define E1000_RCTL_CFI 0x00100000 /* canonical form indicator */ +-#define E1000_RCTL_DPF 0x00400000 /* discard pause frames */ +-#define E1000_RCTL_PMCF 0x00800000 /* pass MAC control frames */ +-#define E1000_RCTL_BSEX 0x02000000 /* Buffer size extension */ +-#define E1000_RCTL_SECRC 0x04000000 /* Strip Ethernet CRC */ +-#define E1000_RCTL_FLXBUF_MASK 0x78000000 /* Flexible buffer size */ +-#define E1000_RCTL_FLXBUF_SHIFT 27 /* Flexible buffer shift */ +- +-/* Use byte values for the following shift parameters +- * Usage: +- * psrctl |= (((ROUNDUP(value0, 128) >> E1000_PSRCTL_BSIZE0_SHIFT) & +- * E1000_PSRCTL_BSIZE0_MASK) | +- * ((ROUNDUP(value1, 1024) >> E1000_PSRCTL_BSIZE1_SHIFT) & +- * E1000_PSRCTL_BSIZE1_MASK) | +- * ((ROUNDUP(value2, 1024) << E1000_PSRCTL_BSIZE2_SHIFT) & +- * E1000_PSRCTL_BSIZE2_MASK) | +- * ((ROUNDUP(value3, 1024) << E1000_PSRCTL_BSIZE3_SHIFT) |; +- * E1000_PSRCTL_BSIZE3_MASK)) +- * where value0 = [128..16256], default=256 +- * value1 = [1024..64512], default=4096 +- * value2 = [0..64512], default=4096 +- * value3 = [0..64512], default=0 +- */ +- +-#define E1000_PSRCTL_BSIZE0_MASK 0x0000007F +-#define E1000_PSRCTL_BSIZE1_MASK 0x00003F00 +-#define E1000_PSRCTL_BSIZE2_MASK 0x003F0000 +-#define E1000_PSRCTL_BSIZE3_MASK 0x3F000000 +- +-#define E1000_PSRCTL_BSIZE0_SHIFT 7 /* Shift _right_ 7 */ +-#define E1000_PSRCTL_BSIZE1_SHIFT 2 /* Shift _right_ 2 */ +-#define E1000_PSRCTL_BSIZE2_SHIFT 6 /* Shift _left_ 6 */ +-#define E1000_PSRCTL_BSIZE3_SHIFT 14 /* Shift _left_ 14 */ +- +-/* SW_W_SYNC definitions */ +-#define E1000_SWFW_EEP_SM 0x0001 +-#define E1000_SWFW_PHY0_SM 0x0002 +-#define E1000_SWFW_PHY1_SM 0x0004 +-#define E1000_SWFW_MAC_CSR_SM 0x0008 +- +-/* Receive Descriptor */ +-#define E1000_RDT_DELAY 0x0000ffff /* Delay timer (1=1024us) */ +-#define E1000_RDT_FPDB 0x80000000 /* Flush descriptor block */ +-#define E1000_RDLEN_LEN 0x0007ff80 /* descriptor length */ +-#define E1000_RDH_RDH 0x0000ffff /* receive descriptor head */ +-#define E1000_RDT_RDT 0x0000ffff /* receive descriptor tail */ +- +-/* Flow Control */ +-#define E1000_FCRTH_RTH 0x0000FFF8 /* Mask Bits[15:3] for RTH */ +-#define E1000_FCRTH_XFCE 0x80000000 /* External Flow Control Enable */ +-#define E1000_FCRTL_RTL 0x0000FFF8 /* Mask Bits[15:3] for RTL */ +-#define E1000_FCRTL_XONE 0x80000000 /* Enable XON frame transmission */ +- +-/* Header split receive */ +-#define E1000_RFCTL_ISCSI_DIS 0x00000001 +-#define E1000_RFCTL_ISCSI_DWC_MASK 0x0000003E +-#define E1000_RFCTL_ISCSI_DWC_SHIFT 1 +-#define E1000_RFCTL_NFSW_DIS 0x00000040 +-#define E1000_RFCTL_NFSR_DIS 0x00000080 +-#define E1000_RFCTL_NFS_VER_MASK 0x00000300 +-#define E1000_RFCTL_NFS_VER_SHIFT 8 +-#define E1000_RFCTL_IPV6_DIS 0x00000400 +-#define E1000_RFCTL_IPV6_XSUM_DIS 0x00000800 +-#define E1000_RFCTL_ACK_DIS 0x00001000 +-#define E1000_RFCTL_ACKD_DIS 0x00002000 +-#define E1000_RFCTL_IPFRSP_DIS 0x00004000 +-#define E1000_RFCTL_EXTEN 0x00008000 +-#define E1000_RFCTL_IPV6_EX_DIS 0x00010000 +-#define E1000_RFCTL_NEW_IPV6_EXT_DIS 0x00020000 +- +-/* Receive Descriptor Control */ +-#define E1000_RXDCTL_PTHRESH 0x0000003F /* RXDCTL Prefetch Threshold */ +-#define E1000_RXDCTL_HTHRESH 0x00003F00 /* RXDCTL Host Threshold */ +-#define E1000_RXDCTL_WTHRESH 0x003F0000 /* RXDCTL Writeback Threshold */ +-#define E1000_RXDCTL_GRAN 0x01000000 /* RXDCTL Granularity */ +- +-/* Transmit Descriptor Control */ +-#define E1000_TXDCTL_PTHRESH 0x0000003F /* TXDCTL Prefetch Threshold */ +-#define E1000_TXDCTL_HTHRESH 0x00003F00 /* TXDCTL Host Threshold */ +-#define E1000_TXDCTL_WTHRESH 0x003F0000 /* TXDCTL Writeback Threshold */ +-#define E1000_TXDCTL_GRAN 0x01000000 /* TXDCTL Granularity */ +-#define E1000_TXDCTL_LWTHRESH 0xFE000000 /* TXDCTL Low Threshold */ +-#define E1000_TXDCTL_FULL_TX_DESC_WB 0x01010000 /* GRAN=1, WTHRESH=1 */ +-#define E1000_TXDCTL_COUNT_DESC 0x00400000 /* Enable the counting of desc. +- still to be processed. */ +-/* Transmit Configuration Word */ +-#define E1000_TXCW_FD 0x00000020 /* TXCW full duplex */ +-#define E1000_TXCW_HD 0x00000040 /* TXCW half duplex */ +-#define E1000_TXCW_PAUSE 0x00000080 /* TXCW sym pause request */ +-#define E1000_TXCW_ASM_DIR 0x00000100 /* TXCW astm pause direction */ +-#define E1000_TXCW_PAUSE_MASK 0x00000180 /* TXCW pause request mask */ +-#define E1000_TXCW_RF 0x00003000 /* TXCW remote fault */ +-#define E1000_TXCW_NP 0x00008000 /* TXCW next page */ +-#define E1000_TXCW_CW 0x0000ffff /* TxConfigWord mask */ +-#define E1000_TXCW_TXC 0x40000000 /* Transmit Config control */ +-#define E1000_TXCW_ANE 0x80000000 /* Auto-neg enable */ +- +-/* Receive Configuration Word */ +-#define E1000_RXCW_CW 0x0000ffff /* RxConfigWord mask */ +-#define E1000_RXCW_NC 0x04000000 /* Receive config no carrier */ +-#define E1000_RXCW_IV 0x08000000 /* Receive config invalid */ +-#define E1000_RXCW_CC 0x10000000 /* Receive config change */ +-#define E1000_RXCW_C 0x20000000 /* Receive config */ +-#define E1000_RXCW_SYNCH 0x40000000 /* Receive config synch */ +-#define E1000_RXCW_ANC 0x80000000 /* Auto-neg complete */ +- +-/* Transmit Control */ +-#define E1000_TCTL_RST 0x00000001 /* software reset */ +-#define E1000_TCTL_EN 0x00000002 /* enable tx */ +-#define E1000_TCTL_BCE 0x00000004 /* busy check enable */ +-#define E1000_TCTL_PSP 0x00000008 /* pad short packets */ +-#define E1000_TCTL_CT 0x00000ff0 /* collision threshold */ +-#define E1000_TCTL_COLD 0x003ff000 /* collision distance */ +-#define E1000_TCTL_SWXOFF 0x00400000 /* SW Xoff transmission */ +-#define E1000_TCTL_PBE 0x00800000 /* Packet Burst Enable */ +-#define E1000_TCTL_RTLC 0x01000000 /* Re-transmit on late collision */ +-#define E1000_TCTL_NRTU 0x02000000 /* No Re-transmit on underrun */ +-#define E1000_TCTL_MULR 0x10000000 /* Multiple request support */ +-/* Extended Transmit Control */ +-#define E1000_TCTL_EXT_BST_MASK 0x000003FF /* Backoff Slot Time */ +-#define E1000_TCTL_EXT_GCEX_MASK 0x000FFC00 /* Gigabit Carry Extend Padding */ +- +-#define DEFAULT_80003ES2LAN_TCTL_EXT_GCEX 0x00010000 +- +-/* Receive Checksum Control */ +-#define E1000_RXCSUM_PCSS_MASK 0x000000FF /* Packet Checksum Start */ +-#define E1000_RXCSUM_IPOFL 0x00000100 /* IPv4 checksum offload */ +-#define E1000_RXCSUM_TUOFL 0x00000200 /* TCP / UDP checksum offload */ +-#define E1000_RXCSUM_IPV6OFL 0x00000400 /* IPv6 checksum offload */ +-#define E1000_RXCSUM_IPPCSE 0x00001000 /* IP payload checksum enable */ +-#define E1000_RXCSUM_PCSD 0x00002000 /* packet checksum disabled */ +- +-/* Multiple Receive Queue Control */ +-#define E1000_MRQC_ENABLE_MASK 0x00000003 +-#define E1000_MRQC_ENABLE_RSS_2Q 0x00000001 +-#define E1000_MRQC_ENABLE_RSS_INT 0x00000004 +-#define E1000_MRQC_RSS_FIELD_MASK 0xFFFF0000 +-#define E1000_MRQC_RSS_FIELD_IPV4_TCP 0x00010000 +-#define E1000_MRQC_RSS_FIELD_IPV4 0x00020000 +-#define E1000_MRQC_RSS_FIELD_IPV6_TCP_EX 0x00040000 +-#define E1000_MRQC_RSS_FIELD_IPV6_EX 0x00080000 +-#define E1000_MRQC_RSS_FIELD_IPV6 0x00100000 +-#define E1000_MRQC_RSS_FIELD_IPV6_TCP 0x00200000 +- +-/* Definitions for power management and wakeup registers */ +-/* Wake Up Control */ +-#define E1000_WUC_APME 0x00000001 /* APM Enable */ +-#define E1000_WUC_PME_EN 0x00000002 /* PME Enable */ +-#define E1000_WUC_PME_STATUS 0x00000004 /* PME Status */ +-#define E1000_WUC_APMPME 0x00000008 /* Assert PME on APM Wakeup */ +-#define E1000_WUC_SPM 0x80000000 /* Enable SPM */ +- +-/* Wake Up Filter Control */ +-#define E1000_WUFC_LNKC 0x00000001 /* Link Status Change Wakeup Enable */ +-#define E1000_WUFC_MAG 0x00000002 /* Magic Packet Wakeup Enable */ +-#define E1000_WUFC_EX 0x00000004 /* Directed Exact Wakeup Enable */ +-#define E1000_WUFC_MC 0x00000008 /* Directed Multicast Wakeup Enable */ +-#define E1000_WUFC_BC 0x00000010 /* Broadcast Wakeup Enable */ +-#define E1000_WUFC_ARP 0x00000020 /* ARP Request Packet Wakeup Enable */ +-#define E1000_WUFC_IPV4 0x00000040 /* Directed IPv4 Packet Wakeup Enable */ +-#define E1000_WUFC_IPV6 0x00000080 /* Directed IPv6 Packet Wakeup Enable */ +-#define E1000_WUFC_IGNORE_TCO 0x00008000 /* Ignore WakeOn TCO packets */ +-#define E1000_WUFC_FLX0 0x00010000 /* Flexible Filter 0 Enable */ +-#define E1000_WUFC_FLX1 0x00020000 /* Flexible Filter 1 Enable */ +-#define E1000_WUFC_FLX2 0x00040000 /* Flexible Filter 2 Enable */ +-#define E1000_WUFC_FLX3 0x00080000 /* Flexible Filter 3 Enable */ +-#define E1000_WUFC_ALL_FILTERS 0x000F00FF /* Mask for all wakeup filters */ +-#define E1000_WUFC_FLX_OFFSET 16 /* Offset to the Flexible Filters bits */ +-#define E1000_WUFC_FLX_FILTERS 0x000F0000 /* Mask for the 4 flexible filters */ +- +-/* Wake Up Status */ +-#define E1000_WUS_LNKC 0x00000001 /* Link Status Changed */ +-#define E1000_WUS_MAG 0x00000002 /* Magic Packet Received */ +-#define E1000_WUS_EX 0x00000004 /* Directed Exact Received */ +-#define E1000_WUS_MC 0x00000008 /* Directed Multicast Received */ +-#define E1000_WUS_BC 0x00000010 /* Broadcast Received */ +-#define E1000_WUS_ARP 0x00000020 /* ARP Request Packet Received */ +-#define E1000_WUS_IPV4 0x00000040 /* Directed IPv4 Packet Wakeup Received */ +-#define E1000_WUS_IPV6 0x00000080 /* Directed IPv6 Packet Wakeup Received */ +-#define E1000_WUS_FLX0 0x00010000 /* Flexible Filter 0 Match */ +-#define E1000_WUS_FLX1 0x00020000 /* Flexible Filter 1 Match */ +-#define E1000_WUS_FLX2 0x00040000 /* Flexible Filter 2 Match */ +-#define E1000_WUS_FLX3 0x00080000 /* Flexible Filter 3 Match */ +-#define E1000_WUS_FLX_FILTERS 0x000F0000 /* Mask for the 4 flexible filters */ +- +-/* Management Control */ +-#define E1000_MANC_SMBUS_EN 0x00000001 /* SMBus Enabled - RO */ +-#define E1000_MANC_ASF_EN 0x00000002 /* ASF Enabled - RO */ +-#define E1000_MANC_R_ON_FORCE 0x00000004 /* Reset on Force TCO - RO */ +-#define E1000_MANC_RMCP_EN 0x00000100 /* Enable RCMP 026Fh Filtering */ +-#define E1000_MANC_0298_EN 0x00000200 /* Enable RCMP 0298h Filtering */ +-#define E1000_MANC_IPV4_EN 0x00000400 /* Enable IPv4 */ +-#define E1000_MANC_IPV6_EN 0x00000800 /* Enable IPv6 */ +-#define E1000_MANC_SNAP_EN 0x00001000 /* Accept LLC/SNAP */ +-#define E1000_MANC_ARP_EN 0x00002000 /* Enable ARP Request Filtering */ +-#define E1000_MANC_NEIGHBOR_EN 0x00004000 /* Enable Neighbor Discovery +- * Filtering */ +-#define E1000_MANC_ARP_RES_EN 0x00008000 /* Enable ARP response Filtering */ +-#define E1000_MANC_TCO_RESET 0x00010000 /* TCO Reset Occurred */ +-#define E1000_MANC_RCV_TCO_EN 0x00020000 /* Receive TCO Packets Enabled */ +-#define E1000_MANC_REPORT_STATUS 0x00040000 /* Status Reporting Enabled */ +-#define E1000_MANC_RCV_ALL 0x00080000 /* Receive All Enabled */ +-#define E1000_MANC_BLK_PHY_RST_ON_IDE 0x00040000 /* Block phy resets */ +-#define E1000_MANC_EN_MAC_ADDR_FILTER 0x00100000 /* Enable MAC address +- * filtering */ +-#define E1000_MANC_EN_MNG2HOST 0x00200000 /* Enable MNG packets to host +- * memory */ +-#define E1000_MANC_EN_IP_ADDR_FILTER 0x00400000 /* Enable IP address +- * filtering */ +-#define E1000_MANC_EN_XSUM_FILTER 0x00800000 /* Enable checksum filtering */ +-#define E1000_MANC_BR_EN 0x01000000 /* Enable broadcast filtering */ +-#define E1000_MANC_SMB_REQ 0x01000000 /* SMBus Request */ +-#define E1000_MANC_SMB_GNT 0x02000000 /* SMBus Grant */ +-#define E1000_MANC_SMB_CLK_IN 0x04000000 /* SMBus Clock In */ +-#define E1000_MANC_SMB_DATA_IN 0x08000000 /* SMBus Data In */ +-#define E1000_MANC_SMB_DATA_OUT 0x10000000 /* SMBus Data Out */ +-#define E1000_MANC_SMB_CLK_OUT 0x20000000 /* SMBus Clock Out */ +- +-#define E1000_MANC_SMB_DATA_OUT_SHIFT 28 /* SMBus Data Out Shift */ +-#define E1000_MANC_SMB_CLK_OUT_SHIFT 29 /* SMBus Clock Out Shift */ +- +-/* SW Semaphore Register */ +-#define E1000_SWSM_SMBI 0x00000001 /* Driver Semaphore bit */ +-#define E1000_SWSM_SWESMBI 0x00000002 /* FW Semaphore bit */ +-#define E1000_SWSM_WMNG 0x00000004 /* Wake MNG Clock */ +-#define E1000_SWSM_DRV_LOAD 0x00000008 /* Driver Loaded Bit */ +- +-/* FW Semaphore Register */ +-#define E1000_FWSM_MODE_MASK 0x0000000E /* FW mode */ +-#define E1000_FWSM_MODE_SHIFT 1 +-#define E1000_FWSM_FW_VALID 0x00008000 /* FW established a valid mode */ +- +-#define E1000_FWSM_RSPCIPHY 0x00000040 /* Reset PHY on PCI reset */ +-#define E1000_FWSM_DISSW 0x10000000 /* FW disable SW Write Access */ +-#define E1000_FWSM_SKUSEL_MASK 0x60000000 /* LAN SKU select */ +-#define E1000_FWSM_SKUEL_SHIFT 29 +-#define E1000_FWSM_SKUSEL_EMB 0x0 /* Embedded SKU */ +-#define E1000_FWSM_SKUSEL_CONS 0x1 /* Consumer SKU */ +-#define E1000_FWSM_SKUSEL_PERF_100 0x2 /* Perf & Corp 10/100 SKU */ +-#define E1000_FWSM_SKUSEL_PERF_GBE 0x3 /* Perf & Copr GbE SKU */ +- +-/* FFLT Debug Register */ +-#define E1000_FFLT_DBG_INVC 0x00100000 /* Invalid /C/ code handling */ +- +-typedef enum { +- e1000_mng_mode_none = 0, +- e1000_mng_mode_asf, +- e1000_mng_mode_pt, +- e1000_mng_mode_ipmi, +- e1000_mng_mode_host_interface_only +-} e1000_mng_mode; +- +-/* Host Inteface Control Register */ +-#define E1000_HICR_EN 0x00000001 /* Enable Bit - RO */ +-#define E1000_HICR_C 0x00000002 /* Driver sets this bit when done +- * to put command in RAM */ +-#define E1000_HICR_SV 0x00000004 /* Status Validity */ +-#define E1000_HICR_FWR 0x00000080 /* FW reset. Set by the Host */ +- +-/* Host Interface Command Interface - Address range 0x8800-0x8EFF */ +-#define E1000_HI_MAX_DATA_LENGTH 252 /* Host Interface data length */ +-#define E1000_HI_MAX_BLOCK_BYTE_LENGTH 1792 /* Number of bytes in range */ +-#define E1000_HI_MAX_BLOCK_DWORD_LENGTH 448 /* Number of dwords in range */ +-#define E1000_HI_COMMAND_TIMEOUT 500 /* Time in ms to process HI command */ +- +-struct e1000_host_command_header { +- u8 command_id; +- u8 command_length; +- u8 command_options; /* I/F bits for command, status for return */ +- u8 checksum; +-}; +-struct e1000_host_command_info { +- struct e1000_host_command_header command_header; /* Command Head/Command Result Head has 4 bytes */ +- u8 command_data[E1000_HI_MAX_DATA_LENGTH]; /* Command data can length 0..252 */ ++struct e1000_host_mng_dhcp_cookie { ++ u32 signature; ++ u8 status; ++ u8 reserved0; ++ u16 vlan_id; ++ u32 reserved1; ++ u16 reserved2; ++ u8 reserved3; ++ u8 checksum; + }; + +-/* Host SMB register #0 */ +-#define E1000_HSMC0R_CLKIN 0x00000001 /* SMB Clock in */ +-#define E1000_HSMC0R_DATAIN 0x00000002 /* SMB Data in */ +-#define E1000_HSMC0R_DATAOUT 0x00000004 /* SMB Data out */ +-#define E1000_HSMC0R_CLKOUT 0x00000008 /* SMB Clock out */ +- +-/* Host SMB register #1 */ +-#define E1000_HSMC1R_CLKIN E1000_HSMC0R_CLKIN +-#define E1000_HSMC1R_DATAIN E1000_HSMC0R_DATAIN +-#define E1000_HSMC1R_DATAOUT E1000_HSMC0R_DATAOUT +-#define E1000_HSMC1R_CLKOUT E1000_HSMC0R_CLKOUT +- +-/* FW Status Register */ +-#define E1000_FWSTS_FWS_MASK 0x000000FF /* FW Status */ +- +-/* Wake Up Packet Length */ +-#define E1000_WUPL_LENGTH_MASK 0x0FFF /* Only the lower 12 bits are valid */ +- +-#define E1000_MDALIGN 4096 +- +-/* PCI-Ex registers*/ +- +-/* PCI-Ex Control Register */ +-#define E1000_GCR_RXD_NO_SNOOP 0x00000001 +-#define E1000_GCR_RXDSCW_NO_SNOOP 0x00000002 +-#define E1000_GCR_RXDSCR_NO_SNOOP 0x00000004 +-#define E1000_GCR_TXD_NO_SNOOP 0x00000008 +-#define E1000_GCR_TXDSCW_NO_SNOOP 0x00000010 +-#define E1000_GCR_TXDSCR_NO_SNOOP 0x00000020 +- +-#define PCI_EX_NO_SNOOP_ALL (E1000_GCR_RXD_NO_SNOOP | \ +- E1000_GCR_RXDSCW_NO_SNOOP | \ +- E1000_GCR_RXDSCR_NO_SNOOP | \ +- E1000_GCR_TXD_NO_SNOOP | \ +- E1000_GCR_TXDSCW_NO_SNOOP | \ +- E1000_GCR_TXDSCR_NO_SNOOP) +- +-#define PCI_EX_82566_SNOOP_ALL PCI_EX_NO_SNOOP_ALL +- +-#define E1000_GCR_L1_ACT_WITHOUT_L0S_RX 0x08000000 +-/* Function Active and Power State to MNG */ +-#define E1000_FACTPS_FUNC0_POWER_STATE_MASK 0x00000003 +-#define E1000_FACTPS_LAN0_VALID 0x00000004 +-#define E1000_FACTPS_FUNC0_AUX_EN 0x00000008 +-#define E1000_FACTPS_FUNC1_POWER_STATE_MASK 0x000000C0 +-#define E1000_FACTPS_FUNC1_POWER_STATE_SHIFT 6 +-#define E1000_FACTPS_LAN1_VALID 0x00000100 +-#define E1000_FACTPS_FUNC1_AUX_EN 0x00000200 +-#define E1000_FACTPS_FUNC2_POWER_STATE_MASK 0x00003000 +-#define E1000_FACTPS_FUNC2_POWER_STATE_SHIFT 12 +-#define E1000_FACTPS_IDE_ENABLE 0x00004000 +-#define E1000_FACTPS_FUNC2_AUX_EN 0x00008000 +-#define E1000_FACTPS_FUNC3_POWER_STATE_MASK 0x000C0000 +-#define E1000_FACTPS_FUNC3_POWER_STATE_SHIFT 18 +-#define E1000_FACTPS_SP_ENABLE 0x00100000 +-#define E1000_FACTPS_FUNC3_AUX_EN 0x00200000 +-#define E1000_FACTPS_FUNC4_POWER_STATE_MASK 0x03000000 +-#define E1000_FACTPS_FUNC4_POWER_STATE_SHIFT 24 +-#define E1000_FACTPS_IPMI_ENABLE 0x04000000 +-#define E1000_FACTPS_FUNC4_AUX_EN 0x08000000 +-#define E1000_FACTPS_MNGCG 0x20000000 +-#define E1000_FACTPS_LAN_FUNC_SEL 0x40000000 +-#define E1000_FACTPS_PM_STATE_CHANGED 0x80000000 +- +-/* PCI-Ex Config Space */ +-#define PCI_EX_LINK_STATUS 0x12 +-#define PCI_EX_LINK_WIDTH_MASK 0x3F0 +-#define PCI_EX_LINK_WIDTH_SHIFT 4 +- +-/* EEPROM Commands - Microwire */ +-#define EEPROM_READ_OPCODE_MICROWIRE 0x6 /* EEPROM read opcode */ +-#define EEPROM_WRITE_OPCODE_MICROWIRE 0x5 /* EEPROM write opcode */ +-#define EEPROM_ERASE_OPCODE_MICROWIRE 0x7 /* EEPROM erase opcode */ +-#define EEPROM_EWEN_OPCODE_MICROWIRE 0x13 /* EEPROM erase/write enable */ +-#define EEPROM_EWDS_OPCODE_MICROWIRE 0x10 /* EEPROM erast/write disable */ +- +-/* EEPROM Commands - SPI */ +-#define EEPROM_MAX_RETRY_SPI 5000 /* Max wait of 5ms, for RDY signal */ +-#define EEPROM_READ_OPCODE_SPI 0x03 /* EEPROM read opcode */ +-#define EEPROM_WRITE_OPCODE_SPI 0x02 /* EEPROM write opcode */ +-#define EEPROM_A8_OPCODE_SPI 0x08 /* opcode bit-3 = address bit-8 */ +-#define EEPROM_WREN_OPCODE_SPI 0x06 /* EEPROM set Write Enable latch */ +-#define EEPROM_WRDI_OPCODE_SPI 0x04 /* EEPROM reset Write Enable latch */ +-#define EEPROM_RDSR_OPCODE_SPI 0x05 /* EEPROM read Status register */ +-#define EEPROM_WRSR_OPCODE_SPI 0x01 /* EEPROM write Status register */ +-#define EEPROM_ERASE4K_OPCODE_SPI 0x20 /* EEPROM ERASE 4KB */ +-#define EEPROM_ERASE64K_OPCODE_SPI 0xD8 /* EEPROM ERASE 64KB */ +-#define EEPROM_ERASE256_OPCODE_SPI 0xDB /* EEPROM ERASE 256B */ +- +-/* EEPROM Size definitions */ +-#define EEPROM_WORD_SIZE_SHIFT 6 +-#define EEPROM_SIZE_SHIFT 10 +-#define EEPROM_SIZE_MASK 0x1C00 +- +-/* EEPROM Word Offsets */ +-#define EEPROM_COMPAT 0x0003 +-#define EEPROM_ID_LED_SETTINGS 0x0004 +-#define EEPROM_VERSION 0x0005 +-#define EEPROM_SERDES_AMPLITUDE 0x0006 /* For SERDES output amplitude adjustment. */ +-#define EEPROM_PHY_CLASS_WORD 0x0007 +-#define EEPROM_INIT_CONTROL1_REG 0x000A +-#define EEPROM_INIT_CONTROL2_REG 0x000F +-#define EEPROM_SWDEF_PINS_CTRL_PORT_1 0x0010 +-#define EEPROM_INIT_CONTROL3_PORT_B 0x0014 +-#define EEPROM_INIT_3GIO_3 0x001A +-#define EEPROM_SWDEF_PINS_CTRL_PORT_0 0x0020 +-#define EEPROM_INIT_CONTROL3_PORT_A 0x0024 +-#define EEPROM_CFG 0x0012 +-#define EEPROM_FLASH_VERSION 0x0032 +-#define EEPROM_CHECKSUM_REG 0x003F +- +-#define E1000_EEPROM_CFG_DONE 0x00040000 /* MNG config cycle done */ +-#define E1000_EEPROM_CFG_DONE_PORT_1 0x00080000 /* ...for second port */ +- +-/* Word definitions for ID LED Settings */ +-#define ID_LED_RESERVED_0000 0x0000 +-#define ID_LED_RESERVED_FFFF 0xFFFF +-#define ID_LED_RESERVED_82573 0xF746 +-#define ID_LED_DEFAULT_82573 0x1811 +-#define ID_LED_DEFAULT ((ID_LED_OFF1_ON2 << 12) | \ +- (ID_LED_OFF1_OFF2 << 8) | \ +- (ID_LED_DEF1_DEF2 << 4) | \ +- (ID_LED_DEF1_DEF2)) +-#define ID_LED_DEFAULT_ICH8LAN ((ID_LED_DEF1_DEF2 << 12) | \ +- (ID_LED_DEF1_OFF2 << 8) | \ +- (ID_LED_DEF1_ON2 << 4) | \ +- (ID_LED_DEF1_DEF2)) +-#define ID_LED_DEF1_DEF2 0x1 +-#define ID_LED_DEF1_ON2 0x2 +-#define ID_LED_DEF1_OFF2 0x3 +-#define ID_LED_ON1_DEF2 0x4 +-#define ID_LED_ON1_ON2 0x5 +-#define ID_LED_ON1_OFF2 0x6 +-#define ID_LED_OFF1_DEF2 0x7 +-#define ID_LED_OFF1_ON2 0x8 +-#define ID_LED_OFF1_OFF2 0x9 +- +-#define IGP_ACTIVITY_LED_MASK 0xFFFFF0FF +-#define IGP_ACTIVITY_LED_ENABLE 0x0300 +-#define IGP_LED3_MODE 0x07000000 +- +- +-/* Mask bits for SERDES amplitude adjustment in Word 6 of the EEPROM */ +-#define EEPROM_SERDES_AMPLITUDE_MASK 0x000F +- +-/* Mask bit for PHY class in Word 7 of the EEPROM */ +-#define EEPROM_PHY_CLASS_A 0x8000 +- +-/* Mask bits for fields in Word 0x0a of the EEPROM */ +-#define EEPROM_WORD0A_ILOS 0x0010 +-#define EEPROM_WORD0A_SWDPIO 0x01E0 +-#define EEPROM_WORD0A_LRST 0x0200 +-#define EEPROM_WORD0A_FD 0x0400 +-#define EEPROM_WORD0A_66MHZ 0x0800 +- +-/* Mask bits for fields in Word 0x0f of the EEPROM */ +-#define EEPROM_WORD0F_PAUSE_MASK 0x3000 +-#define EEPROM_WORD0F_PAUSE 0x1000 +-#define EEPROM_WORD0F_ASM_DIR 0x2000 +-#define EEPROM_WORD0F_ANE 0x0800 +-#define EEPROM_WORD0F_SWPDIO_EXT 0x00F0 +-#define EEPROM_WORD0F_LPLU 0x0001 +- +-/* Mask bits for fields in Word 0x10/0x20 of the EEPROM */ +-#define EEPROM_WORD1020_GIGA_DISABLE 0x0010 +-#define EEPROM_WORD1020_GIGA_DISABLE_NON_D0A 0x0008 +- +-/* Mask bits for fields in Word 0x1a of the EEPROM */ +-#define EEPROM_WORD1A_ASPM_MASK 0x000C +- +-/* For checksumming, the sum of all words in the EEPROM should equal 0xBABA. */ +-#define EEPROM_SUM 0xBABA +- +-/* EEPROM Map defines (WORD OFFSETS)*/ +-#define EEPROM_NODE_ADDRESS_BYTE_0 0 +-#define EEPROM_PBA_BYTE_1 8 +- +-#define EEPROM_RESERVED_WORD 0xFFFF +- +-/* EEPROM Map Sizes (Byte Counts) */ +-#define PBA_SIZE 4 +- +-/* Collision related configuration parameters */ +-#define E1000_COLLISION_THRESHOLD 15 +-#define E1000_CT_SHIFT 4 +-/* Collision distance is a 0-based value that applies to +- * half-duplex-capable hardware only. */ +-#define E1000_COLLISION_DISTANCE 63 +-#define E1000_COLLISION_DISTANCE_82542 64 +-#define E1000_FDX_COLLISION_DISTANCE E1000_COLLISION_DISTANCE +-#define E1000_HDX_COLLISION_DISTANCE E1000_COLLISION_DISTANCE +-#define E1000_COLD_SHIFT 12 +- +-/* Number of Transmit and Receive Descriptors must be a multiple of 8 */ +-#define REQ_TX_DESCRIPTOR_MULTIPLE 8 +-#define REQ_RX_DESCRIPTOR_MULTIPLE 8 +- +-/* Default values for the transmit IPG register */ +-#define DEFAULT_82542_TIPG_IPGT 10 +-#define DEFAULT_82543_TIPG_IPGT_FIBER 9 +-#define DEFAULT_82543_TIPG_IPGT_COPPER 8 +- +-#define E1000_TIPG_IPGT_MASK 0x000003FF +-#define E1000_TIPG_IPGR1_MASK 0x000FFC00 +-#define E1000_TIPG_IPGR2_MASK 0x3FF00000 +- +-#define DEFAULT_82542_TIPG_IPGR1 2 +-#define DEFAULT_82543_TIPG_IPGR1 8 +-#define E1000_TIPG_IPGR1_SHIFT 10 +- +-#define DEFAULT_82542_TIPG_IPGR2 10 +-#define DEFAULT_82543_TIPG_IPGR2 6 +-#define DEFAULT_80003ES2LAN_TIPG_IPGR2 7 +-#define E1000_TIPG_IPGR2_SHIFT 20 +- +-#define DEFAULT_80003ES2LAN_TIPG_IPGT_10_100 0x00000009 +-#define DEFAULT_80003ES2LAN_TIPG_IPGT_1000 0x00000008 +-#define E1000_TXDMAC_DPP 0x00000001 +- +-/* Adaptive IFS defines */ +-#define TX_THRESHOLD_START 8 +-#define TX_THRESHOLD_INCREMENT 10 +-#define TX_THRESHOLD_DECREMENT 1 +-#define TX_THRESHOLD_STOP 190 +-#define TX_THRESHOLD_DISABLE 0 +-#define TX_THRESHOLD_TIMER_MS 10000 +-#define MIN_NUM_XMITS 1000 +-#define IFS_MAX 80 +-#define IFS_STEP 10 +-#define IFS_MIN 40 +-#define IFS_RATIO 4 +- +-/* Extended Configuration Control and Size */ +-#define E1000_EXTCNF_CTRL_PCIE_WRITE_ENABLE 0x00000001 +-#define E1000_EXTCNF_CTRL_PHY_WRITE_ENABLE 0x00000002 +-#define E1000_EXTCNF_CTRL_D_UD_ENABLE 0x00000004 +-#define E1000_EXTCNF_CTRL_D_UD_LATENCY 0x00000008 +-#define E1000_EXTCNF_CTRL_D_UD_OWNER 0x00000010 +-#define E1000_EXTCNF_CTRL_MDIO_SW_OWNERSHIP 0x00000020 +-#define E1000_EXTCNF_CTRL_MDIO_HW_OWNERSHIP 0x00000040 +-#define E1000_EXTCNF_CTRL_EXT_CNF_POINTER 0x0FFF0000 +- +-#define E1000_EXTCNF_SIZE_EXT_PHY_LENGTH 0x000000FF +-#define E1000_EXTCNF_SIZE_EXT_DOCK_LENGTH 0x0000FF00 +-#define E1000_EXTCNF_SIZE_EXT_PCIE_LENGTH 0x00FF0000 +-#define E1000_EXTCNF_CTRL_LCD_WRITE_ENABLE 0x00000001 +-#define E1000_EXTCNF_CTRL_SWFLAG 0x00000020 +- +-/* PBA constants */ +-#define E1000_PBA_8K 0x0008 /* 8KB, default Rx allocation */ +-#define E1000_PBA_12K 0x000C /* 12KB, default Rx allocation */ +-#define E1000_PBA_16K 0x0010 /* 16KB, default TX allocation */ +-#define E1000_PBA_20K 0x0014 +-#define E1000_PBA_22K 0x0016 +-#define E1000_PBA_24K 0x0018 +-#define E1000_PBA_30K 0x001E +-#define E1000_PBA_32K 0x0020 +-#define E1000_PBA_34K 0x0022 +-#define E1000_PBA_38K 0x0026 +-#define E1000_PBA_40K 0x0028 +-#define E1000_PBA_48K 0x0030 /* 48KB, default RX allocation */ +- +-#define E1000_PBS_16K E1000_PBA_16K +- +-/* Flow Control Constants */ +-#define FLOW_CONTROL_ADDRESS_LOW 0x00C28001 +-#define FLOW_CONTROL_ADDRESS_HIGH 0x00000100 +-#define FLOW_CONTROL_TYPE 0x8808 +- +-/* The historical defaults for the flow control values are given below. */ +-#define FC_DEFAULT_HI_THRESH (0x8000) /* 32KB */ +-#define FC_DEFAULT_LO_THRESH (0x4000) /* 16KB */ +-#define FC_DEFAULT_TX_TIMER (0x100) /* ~130 us */ +- +-/* PCIX Config space */ +-#define PCIX_COMMAND_REGISTER 0xE6 +-#define PCIX_STATUS_REGISTER_LO 0xE8 +-#define PCIX_STATUS_REGISTER_HI 0xEA +- +-#define PCIX_COMMAND_MMRBC_MASK 0x000C +-#define PCIX_COMMAND_MMRBC_SHIFT 0x2 +-#define PCIX_STATUS_HI_MMRBC_MASK 0x0060 +-#define PCIX_STATUS_HI_MMRBC_SHIFT 0x5 +-#define PCIX_STATUS_HI_MMRBC_4K 0x3 +-#define PCIX_STATUS_HI_MMRBC_2K 0x2 +- +- +-/* Number of bits required to shift right the "pause" bits from the +- * EEPROM (bits 13:12) to the "pause" (bits 8:7) field in the TXCW register. +- */ +-#define PAUSE_SHIFT 5 +- +-/* Number of bits required to shift left the "SWDPIO" bits from the +- * EEPROM (bits 8:5) to the "SWDPIO" (bits 25:22) field in the CTRL register. +- */ +-#define SWDPIO_SHIFT 17 +- +-/* Number of bits required to shift left the "SWDPIO_EXT" bits from the +- * EEPROM word F (bits 7:4) to the bits 11:8 of The Extended CTRL register. +- */ +-#define SWDPIO__EXT_SHIFT 4 +- +-/* Number of bits required to shift left the "ILOS" bit from the EEPROM +- * (bit 4) to the "ILOS" (bit 7) field in the CTRL register. +- */ +-#define ILOS_SHIFT 3 +- +- +-#define RECEIVE_BUFFER_ALIGN_SIZE (256) +- +-/* Number of milliseconds we wait for auto-negotiation to complete */ +-#define LINK_UP_TIMEOUT 500 +- +-/* Number of 100 microseconds we wait for PCI Express master disable */ +-#define MASTER_DISABLE_TIMEOUT 800 +-/* Number of milliseconds we wait for Eeprom auto read bit done after MAC reset */ +-#define AUTO_READ_DONE_TIMEOUT 10 +-/* Number of milliseconds we wait for PHY configuration done after MAC reset */ +-#define PHY_CFG_TIMEOUT 100 +- +-#define E1000_TX_BUFFER_SIZE ((u32)1514) +- +-/* The carrier extension symbol, as received by the NIC. */ +-#define CARRIER_EXTENSION 0x0F +- +-/* TBI_ACCEPT macro definition: +- * +- * This macro requires: +- * adapter = a pointer to struct e1000_hw +- * status = the 8 bit status field of the RX descriptor with EOP set +- * error = the 8 bit error field of the RX descriptor with EOP set +- * length = the sum of all the length fields of the RX descriptors that +- * make up the current frame +- * last_byte = the last byte of the frame DMAed by the hardware +- * max_frame_length = the maximum frame length we want to accept. +- * min_frame_length = the minimum frame length we want to accept. +- * +- * This macro is a conditional that should be used in the interrupt +- * handler's Rx processing routine when RxErrors have been detected. +- * +- * Typical use: +- * ... +- * if (TBI_ACCEPT) { +- * accept_frame = true; +- * e1000_tbi_adjust_stats(adapter, MacAddress); +- * frame_length--; +- * } else { +- * accept_frame = false; +- * } +- * ... +- */ +- +-#define TBI_ACCEPT(adapter, status, errors, length, last_byte) \ +- ((adapter)->tbi_compatibility_on && \ +- (((errors) & E1000_RXD_ERR_FRAME_ERR_MASK) == E1000_RXD_ERR_CE) && \ +- ((last_byte) == CARRIER_EXTENSION) && \ +- (((status) & E1000_RXD_STAT_VP) ? \ +- (((length) > ((adapter)->min_frame_size - VLAN_TAG_SIZE)) && \ +- ((length) <= ((adapter)->max_frame_size + 1))) : \ +- (((length) > (adapter)->min_frame_size) && \ +- ((length) <= ((adapter)->max_frame_size + VLAN_TAG_SIZE + 1))))) +- +- +-/* Structures, enums, and macros for the PHY */ +- +-/* Bit definitions for the Management Data IO (MDIO) and Management Data +- * Clock (MDC) pins in the Device Control Register. +- */ +-#define E1000_CTRL_PHY_RESET_DIR E1000_CTRL_SWDPIO0 +-#define E1000_CTRL_PHY_RESET E1000_CTRL_SWDPIN0 +-#define E1000_CTRL_MDIO_DIR E1000_CTRL_SWDPIO2 +-#define E1000_CTRL_MDIO E1000_CTRL_SWDPIN2 +-#define E1000_CTRL_MDC_DIR E1000_CTRL_SWDPIO3 +-#define E1000_CTRL_MDC E1000_CTRL_SWDPIN3 +-#define E1000_CTRL_PHY_RESET_DIR4 E1000_CTRL_EXT_SDP4_DIR +-#define E1000_CTRL_PHY_RESET4 E1000_CTRL_EXT_SDP4_DATA +- +-/* PHY 1000 MII Register/Bit Definitions */ +-/* PHY Registers defined by IEEE */ +-#define PHY_CTRL 0x00 /* Control Register */ +-#define PHY_STATUS 0x01 /* Status Regiser */ +-#define PHY_ID1 0x02 /* Phy Id Reg (word 1) */ +-#define PHY_ID2 0x03 /* Phy Id Reg (word 2) */ +-#define PHY_AUTONEG_ADV 0x04 /* Autoneg Advertisement */ +-#define PHY_LP_ABILITY 0x05 /* Link Partner Ability (Base Page) */ +-#define PHY_AUTONEG_EXP 0x06 /* Autoneg Expansion Reg */ +-#define PHY_NEXT_PAGE_TX 0x07 /* Next Page TX */ +-#define PHY_LP_NEXT_PAGE 0x08 /* Link Partner Next Page */ +-#define PHY_1000T_CTRL 0x09 /* 1000Base-T Control Reg */ +-#define PHY_1000T_STATUS 0x0A /* 1000Base-T Status Reg */ +-#define PHY_EXT_STATUS 0x0F /* Extended Status Reg */ +- +-#define MAX_PHY_REG_ADDRESS 0x1F /* 5 bit address bus (0-0x1F) */ +-#define MAX_PHY_MULTI_PAGE_REG 0xF /* Registers equal on all pages */ +- +-/* M88E1000 Specific Registers */ +-#define M88E1000_PHY_SPEC_CTRL 0x10 /* PHY Specific Control Register */ +-#define M88E1000_PHY_SPEC_STATUS 0x11 /* PHY Specific Status Register */ +-#define M88E1000_INT_ENABLE 0x12 /* Interrupt Enable Register */ +-#define M88E1000_INT_STATUS 0x13 /* Interrupt Status Register */ +-#define M88E1000_EXT_PHY_SPEC_CTRL 0x14 /* Extended PHY Specific Control */ +-#define M88E1000_RX_ERR_CNTR 0x15 /* Receive Error Counter */ +- +-#define M88E1000_PHY_EXT_CTRL 0x1A /* PHY extend control register */ +-#define M88E1000_PHY_PAGE_SELECT 0x1D /* Reg 29 for page number setting */ +-#define M88E1000_PHY_GEN_CONTROL 0x1E /* Its meaning depends on reg 29 */ +-#define M88E1000_PHY_VCO_REG_BIT8 0x100 /* Bits 8 & 11 are adjusted for */ +-#define M88E1000_PHY_VCO_REG_BIT11 0x800 /* improved BER performance */ +- +-#define IGP01E1000_IEEE_REGS_PAGE 0x0000 +-#define IGP01E1000_IEEE_RESTART_AUTONEG 0x3300 +-#define IGP01E1000_IEEE_FORCE_GIGA 0x0140 +- +-/* IGP01E1000 Specific Registers */ +-#define IGP01E1000_PHY_PORT_CONFIG 0x10 /* PHY Specific Port Config Register */ +-#define IGP01E1000_PHY_PORT_STATUS 0x11 /* PHY Specific Status Register */ +-#define IGP01E1000_PHY_PORT_CTRL 0x12 /* PHY Specific Control Register */ +-#define IGP01E1000_PHY_LINK_HEALTH 0x13 /* PHY Link Health Register */ +-#define IGP01E1000_GMII_FIFO 0x14 /* GMII FIFO Register */ +-#define IGP01E1000_PHY_CHANNEL_QUALITY 0x15 /* PHY Channel Quality Register */ +-#define IGP02E1000_PHY_POWER_MGMT 0x19 +-#define IGP01E1000_PHY_PAGE_SELECT 0x1F /* PHY Page Select Core Register */ +- +-/* IGP01E1000 AGC Registers - stores the cable length values*/ +-#define IGP01E1000_PHY_AGC_A 0x1172 +-#define IGP01E1000_PHY_AGC_B 0x1272 +-#define IGP01E1000_PHY_AGC_C 0x1472 +-#define IGP01E1000_PHY_AGC_D 0x1872 +- +-/* IGP02E1000 AGC Registers for cable length values */ +-#define IGP02E1000_PHY_AGC_A 0x11B1 +-#define IGP02E1000_PHY_AGC_B 0x12B1 +-#define IGP02E1000_PHY_AGC_C 0x14B1 +-#define IGP02E1000_PHY_AGC_D 0x18B1 +- +-/* IGP01E1000 DSP Reset Register */ +-#define IGP01E1000_PHY_DSP_RESET 0x1F33 +-#define IGP01E1000_PHY_DSP_SET 0x1F71 +-#define IGP01E1000_PHY_DSP_FFE 0x1F35 +- +-#define IGP01E1000_PHY_CHANNEL_NUM 4 +-#define IGP02E1000_PHY_CHANNEL_NUM 4 +- +-#define IGP01E1000_PHY_AGC_PARAM_A 0x1171 +-#define IGP01E1000_PHY_AGC_PARAM_B 0x1271 +-#define IGP01E1000_PHY_AGC_PARAM_C 0x1471 +-#define IGP01E1000_PHY_AGC_PARAM_D 0x1871 +- +-#define IGP01E1000_PHY_EDAC_MU_INDEX 0xC000 +-#define IGP01E1000_PHY_EDAC_SIGN_EXT_9_BITS 0x8000 +- +-#define IGP01E1000_PHY_ANALOG_TX_STATE 0x2890 +-#define IGP01E1000_PHY_ANALOG_CLASS_A 0x2000 +-#define IGP01E1000_PHY_FORCE_ANALOG_ENABLE 0x0004 +-#define IGP01E1000_PHY_DSP_FFE_CM_CP 0x0069 +- +-#define IGP01E1000_PHY_DSP_FFE_DEFAULT 0x002A +-/* IGP01E1000 PCS Initialization register - stores the polarity status when +- * speed = 1000 Mbps. */ +-#define IGP01E1000_PHY_PCS_INIT_REG 0x00B4 +-#define IGP01E1000_PHY_PCS_CTRL_REG 0x00B5 +- +-#define IGP01E1000_ANALOG_REGS_PAGE 0x20C0 +- +-/* Bits... +- * 15-5: page +- * 4-0: register offset +- */ +-#define GG82563_PAGE_SHIFT 5 +-#define GG82563_REG(page, reg) \ +- (((page) << GG82563_PAGE_SHIFT) | ((reg) & MAX_PHY_REG_ADDRESS)) +-#define GG82563_MIN_ALT_REG 30 +- +-/* GG82563 Specific Registers */ +-#define GG82563_PHY_SPEC_CTRL \ +- GG82563_REG(0, 16) /* PHY Specific Control */ +-#define GG82563_PHY_SPEC_STATUS \ +- GG82563_REG(0, 17) /* PHY Specific Status */ +-#define GG82563_PHY_INT_ENABLE \ +- GG82563_REG(0, 18) /* Interrupt Enable */ +-#define GG82563_PHY_SPEC_STATUS_2 \ +- GG82563_REG(0, 19) /* PHY Specific Status 2 */ +-#define GG82563_PHY_RX_ERR_CNTR \ +- GG82563_REG(0, 21) /* Receive Error Counter */ +-#define GG82563_PHY_PAGE_SELECT \ +- GG82563_REG(0, 22) /* Page Select */ +-#define GG82563_PHY_SPEC_CTRL_2 \ +- GG82563_REG(0, 26) /* PHY Specific Control 2 */ +-#define GG82563_PHY_PAGE_SELECT_ALT \ +- GG82563_REG(0, 29) /* Alternate Page Select */ +-#define GG82563_PHY_TEST_CLK_CTRL \ +- GG82563_REG(0, 30) /* Test Clock Control (use reg. 29 to select) */ +- +-#define GG82563_PHY_MAC_SPEC_CTRL \ +- GG82563_REG(2, 21) /* MAC Specific Control Register */ +-#define GG82563_PHY_MAC_SPEC_CTRL_2 \ +- GG82563_REG(2, 26) /* MAC Specific Control 2 */ +- +-#define GG82563_PHY_DSP_DISTANCE \ +- GG82563_REG(5, 26) /* DSP Distance */ +- +-/* Page 193 - Port Control Registers */ +-#define GG82563_PHY_KMRN_MODE_CTRL \ +- GG82563_REG(193, 16) /* Kumeran Mode Control */ +-#define GG82563_PHY_PORT_RESET \ +- GG82563_REG(193, 17) /* Port Reset */ +-#define GG82563_PHY_REVISION_ID \ +- GG82563_REG(193, 18) /* Revision ID */ +-#define GG82563_PHY_DEVICE_ID \ +- GG82563_REG(193, 19) /* Device ID */ +-#define GG82563_PHY_PWR_MGMT_CTRL \ +- GG82563_REG(193, 20) /* Power Management Control */ +-#define GG82563_PHY_RATE_ADAPT_CTRL \ +- GG82563_REG(193, 25) /* Rate Adaptation Control */ +- +-/* Page 194 - KMRN Registers */ +-#define GG82563_PHY_KMRN_FIFO_CTRL_STAT \ +- GG82563_REG(194, 16) /* FIFO's Control/Status */ +-#define GG82563_PHY_KMRN_CTRL \ +- GG82563_REG(194, 17) /* Control */ +-#define GG82563_PHY_INBAND_CTRL \ +- GG82563_REG(194, 18) /* Inband Control */ +-#define GG82563_PHY_KMRN_DIAGNOSTIC \ +- GG82563_REG(194, 19) /* Diagnostic */ +-#define GG82563_PHY_ACK_TIMEOUTS \ +- GG82563_REG(194, 20) /* Acknowledge Timeouts */ +-#define GG82563_PHY_ADV_ABILITY \ +- GG82563_REG(194, 21) /* Advertised Ability */ +-#define GG82563_PHY_LINK_PARTNER_ADV_ABILITY \ +- GG82563_REG(194, 23) /* Link Partner Advertised Ability */ +-#define GG82563_PHY_ADV_NEXT_PAGE \ +- GG82563_REG(194, 24) /* Advertised Next Page */ +-#define GG82563_PHY_LINK_PARTNER_ADV_NEXT_PAGE \ +- GG82563_REG(194, 25) /* Link Partner Advertised Next page */ +-#define GG82563_PHY_KMRN_MISC \ +- GG82563_REG(194, 26) /* Misc. */ +- +-/* PHY Control Register */ +-#define MII_CR_SPEED_SELECT_MSB 0x0040 /* bits 6,13: 10=1000, 01=100, 00=10 */ +-#define MII_CR_COLL_TEST_ENABLE 0x0080 /* Collision test enable */ +-#define MII_CR_FULL_DUPLEX 0x0100 /* FDX =1, half duplex =0 */ +-#define MII_CR_RESTART_AUTO_NEG 0x0200 /* Restart auto negotiation */ +-#define MII_CR_ISOLATE 0x0400 /* Isolate PHY from MII */ +-#define MII_CR_POWER_DOWN 0x0800 /* Power down */ +-#define MII_CR_AUTO_NEG_EN 0x1000 /* Auto Neg Enable */ +-#define MII_CR_SPEED_SELECT_LSB 0x2000 /* bits 6,13: 10=1000, 01=100, 00=10 */ +-#define MII_CR_LOOPBACK 0x4000 /* 0 = normal, 1 = loopback */ +-#define MII_CR_RESET 0x8000 /* 0 = normal, 1 = PHY reset */ +- +-/* PHY Status Register */ +-#define MII_SR_EXTENDED_CAPS 0x0001 /* Extended register capabilities */ +-#define MII_SR_JABBER_DETECT 0x0002 /* Jabber Detected */ +-#define MII_SR_LINK_STATUS 0x0004 /* Link Status 1 = link */ +-#define MII_SR_AUTONEG_CAPS 0x0008 /* Auto Neg Capable */ +-#define MII_SR_REMOTE_FAULT 0x0010 /* Remote Fault Detect */ +-#define MII_SR_AUTONEG_COMPLETE 0x0020 /* Auto Neg Complete */ +-#define MII_SR_PREAMBLE_SUPPRESS 0x0040 /* Preamble may be suppressed */ +-#define MII_SR_EXTENDED_STATUS 0x0100 /* Ext. status info in Reg 0x0F */ +-#define MII_SR_100T2_HD_CAPS 0x0200 /* 100T2 Half Duplex Capable */ +-#define MII_SR_100T2_FD_CAPS 0x0400 /* 100T2 Full Duplex Capable */ +-#define MII_SR_10T_HD_CAPS 0x0800 /* 10T Half Duplex Capable */ +-#define MII_SR_10T_FD_CAPS 0x1000 /* 10T Full Duplex Capable */ +-#define MII_SR_100X_HD_CAPS 0x2000 /* 100X Half Duplex Capable */ +-#define MII_SR_100X_FD_CAPS 0x4000 /* 100X Full Duplex Capable */ +-#define MII_SR_100T4_CAPS 0x8000 /* 100T4 Capable */ +- +-/* Autoneg Advertisement Register */ +-#define NWAY_AR_SELECTOR_FIELD 0x0001 /* indicates IEEE 802.3 CSMA/CD */ +-#define NWAY_AR_10T_HD_CAPS 0x0020 /* 10T Half Duplex Capable */ +-#define NWAY_AR_10T_FD_CAPS 0x0040 /* 10T Full Duplex Capable */ +-#define NWAY_AR_100TX_HD_CAPS 0x0080 /* 100TX Half Duplex Capable */ +-#define NWAY_AR_100TX_FD_CAPS 0x0100 /* 100TX Full Duplex Capable */ +-#define NWAY_AR_100T4_CAPS 0x0200 /* 100T4 Capable */ +-#define NWAY_AR_PAUSE 0x0400 /* Pause operation desired */ +-#define NWAY_AR_ASM_DIR 0x0800 /* Asymmetric Pause Direction bit */ +-#define NWAY_AR_REMOTE_FAULT 0x2000 /* Remote Fault detected */ +-#define NWAY_AR_NEXT_PAGE 0x8000 /* Next Page ability supported */ +- +-/* Link Partner Ability Register (Base Page) */ +-#define NWAY_LPAR_SELECTOR_FIELD 0x0000 /* LP protocol selector field */ +-#define NWAY_LPAR_10T_HD_CAPS 0x0020 /* LP is 10T Half Duplex Capable */ +-#define NWAY_LPAR_10T_FD_CAPS 0x0040 /* LP is 10T Full Duplex Capable */ +-#define NWAY_LPAR_100TX_HD_CAPS 0x0080 /* LP is 100TX Half Duplex Capable */ +-#define NWAY_LPAR_100TX_FD_CAPS 0x0100 /* LP is 100TX Full Duplex Capable */ +-#define NWAY_LPAR_100T4_CAPS 0x0200 /* LP is 100T4 Capable */ +-#define NWAY_LPAR_PAUSE 0x0400 /* LP Pause operation desired */ +-#define NWAY_LPAR_ASM_DIR 0x0800 /* LP Asymmetric Pause Direction bit */ +-#define NWAY_LPAR_REMOTE_FAULT 0x2000 /* LP has detected Remote Fault */ +-#define NWAY_LPAR_ACKNOWLEDGE 0x4000 /* LP has rx'd link code word */ +-#define NWAY_LPAR_NEXT_PAGE 0x8000 /* Next Page ability supported */ +- +-/* Autoneg Expansion Register */ +-#define NWAY_ER_LP_NWAY_CAPS 0x0001 /* LP has Auto Neg Capability */ +-#define NWAY_ER_PAGE_RXD 0x0002 /* LP is 10T Half Duplex Capable */ +-#define NWAY_ER_NEXT_PAGE_CAPS 0x0004 /* LP is 10T Full Duplex Capable */ +-#define NWAY_ER_LP_NEXT_PAGE_CAPS 0x0008 /* LP is 100TX Half Duplex Capable */ +-#define NWAY_ER_PAR_DETECT_FAULT 0x0010 /* LP is 100TX Full Duplex Capable */ +- +-/* Next Page TX Register */ +-#define NPTX_MSG_CODE_FIELD 0x0001 /* NP msg code or unformatted data */ +-#define NPTX_TOGGLE 0x0800 /* Toggles between exchanges +- * of different NP +- */ +-#define NPTX_ACKNOWLDGE2 0x1000 /* 1 = will comply with msg +- * 0 = cannot comply with msg +- */ +-#define NPTX_MSG_PAGE 0x2000 /* formatted(1)/unformatted(0) pg */ +-#define NPTX_NEXT_PAGE 0x8000 /* 1 = addition NP will follow +- * 0 = sending last NP +- */ +- +-/* Link Partner Next Page Register */ +-#define LP_RNPR_MSG_CODE_FIELD 0x0001 /* NP msg code or unformatted data */ +-#define LP_RNPR_TOGGLE 0x0800 /* Toggles between exchanges +- * of different NP +- */ +-#define LP_RNPR_ACKNOWLDGE2 0x1000 /* 1 = will comply with msg +- * 0 = cannot comply with msg +- */ +-#define LP_RNPR_MSG_PAGE 0x2000 /* formatted(1)/unformatted(0) pg */ +-#define LP_RNPR_ACKNOWLDGE 0x4000 /* 1 = ACK / 0 = NO ACK */ +-#define LP_RNPR_NEXT_PAGE 0x8000 /* 1 = addition NP will follow +- * 0 = sending last NP +- */ +- +-/* 1000BASE-T Control Register */ +-#define CR_1000T_ASYM_PAUSE 0x0080 /* Advertise asymmetric pause bit */ +-#define CR_1000T_HD_CAPS 0x0100 /* Advertise 1000T HD capability */ +-#define CR_1000T_FD_CAPS 0x0200 /* Advertise 1000T FD capability */ +-#define CR_1000T_REPEATER_DTE 0x0400 /* 1=Repeater/switch device port */ +- /* 0=DTE device */ +-#define CR_1000T_MS_VALUE 0x0800 /* 1=Configure PHY as Master */ +- /* 0=Configure PHY as Slave */ +-#define CR_1000T_MS_ENABLE 0x1000 /* 1=Master/Slave manual config value */ +- /* 0=Automatic Master/Slave config */ +-#define CR_1000T_TEST_MODE_NORMAL 0x0000 /* Normal Operation */ +-#define CR_1000T_TEST_MODE_1 0x2000 /* Transmit Waveform test */ +-#define CR_1000T_TEST_MODE_2 0x4000 /* Master Transmit Jitter test */ +-#define CR_1000T_TEST_MODE_3 0x6000 /* Slave Transmit Jitter test */ +-#define CR_1000T_TEST_MODE_4 0x8000 /* Transmitter Distortion test */ +- +-/* 1000BASE-T Status Register */ +-#define SR_1000T_IDLE_ERROR_CNT 0x00FF /* Num idle errors since last read */ +-#define SR_1000T_ASYM_PAUSE_DIR 0x0100 /* LP asymmetric pause direction bit */ +-#define SR_1000T_LP_HD_CAPS 0x0400 /* LP is 1000T HD capable */ +-#define SR_1000T_LP_FD_CAPS 0x0800 /* LP is 1000T FD capable */ +-#define SR_1000T_REMOTE_RX_STATUS 0x1000 /* Remote receiver OK */ +-#define SR_1000T_LOCAL_RX_STATUS 0x2000 /* Local receiver OK */ +-#define SR_1000T_MS_CONFIG_RES 0x4000 /* 1=Local TX is Master, 0=Slave */ +-#define SR_1000T_MS_CONFIG_FAULT 0x8000 /* Master/Slave config fault */ +-#define SR_1000T_REMOTE_RX_STATUS_SHIFT 12 +-#define SR_1000T_LOCAL_RX_STATUS_SHIFT 13 +-#define SR_1000T_PHY_EXCESSIVE_IDLE_ERR_COUNT 5 +-#define FFE_IDLE_ERR_COUNT_TIMEOUT_20 20 +-#define FFE_IDLE_ERR_COUNT_TIMEOUT_100 100 +- +-/* Extended Status Register */ +-#define IEEE_ESR_1000T_HD_CAPS 0x1000 /* 1000T HD capable */ +-#define IEEE_ESR_1000T_FD_CAPS 0x2000 /* 1000T FD capable */ +-#define IEEE_ESR_1000X_HD_CAPS 0x4000 /* 1000X HD capable */ +-#define IEEE_ESR_1000X_FD_CAPS 0x8000 /* 1000X FD capable */ +- +-#define PHY_TX_POLARITY_MASK 0x0100 /* register 10h bit 8 (polarity bit) */ +-#define PHY_TX_NORMAL_POLARITY 0 /* register 10h bit 8 (normal polarity) */ +- +-#define AUTO_POLARITY_DISABLE 0x0010 /* register 11h bit 4 */ +- /* (0=enable, 1=disable) */ +- +-/* M88E1000 PHY Specific Control Register */ +-#define M88E1000_PSCR_JABBER_DISABLE 0x0001 /* 1=Jabber Function disabled */ +-#define M88E1000_PSCR_POLARITY_REVERSAL 0x0002 /* 1=Polarity Reversal enabled */ +-#define M88E1000_PSCR_SQE_TEST 0x0004 /* 1=SQE Test enabled */ +-#define M88E1000_PSCR_CLK125_DISABLE 0x0010 /* 1=CLK125 low, +- * 0=CLK125 toggling +- */ +-#define M88E1000_PSCR_MDI_MANUAL_MODE 0x0000 /* MDI Crossover Mode bits 6:5 */ +- /* Manual MDI configuration */ +-#define M88E1000_PSCR_MDIX_MANUAL_MODE 0x0020 /* Manual MDIX configuration */ +-#define M88E1000_PSCR_AUTO_X_1000T 0x0040 /* 1000BASE-T: Auto crossover, +- * 100BASE-TX/10BASE-T: +- * MDI Mode +- */ +-#define M88E1000_PSCR_AUTO_X_MODE 0x0060 /* Auto crossover enabled +- * all speeds. +- */ +-#define M88E1000_PSCR_10BT_EXT_DIST_ENABLE 0x0080 +- /* 1=Enable Extended 10BASE-T distance +- * (Lower 10BASE-T RX Threshold) +- * 0=Normal 10BASE-T RX Threshold */ +-#define M88E1000_PSCR_MII_5BIT_ENABLE 0x0100 +- /* 1=5-Bit interface in 100BASE-TX +- * 0=MII interface in 100BASE-TX */ +-#define M88E1000_PSCR_SCRAMBLER_DISABLE 0x0200 /* 1=Scrambler disable */ +-#define M88E1000_PSCR_FORCE_LINK_GOOD 0x0400 /* 1=Force link good */ +-#define M88E1000_PSCR_ASSERT_CRS_ON_TX 0x0800 /* 1=Assert CRS on Transmit */ +- +-#define M88E1000_PSCR_POLARITY_REVERSAL_SHIFT 1 +-#define M88E1000_PSCR_AUTO_X_MODE_SHIFT 5 +-#define M88E1000_PSCR_10BT_EXT_DIST_ENABLE_SHIFT 7 +- +-/* M88E1000 PHY Specific Status Register */ +-#define M88E1000_PSSR_JABBER 0x0001 /* 1=Jabber */ +-#define M88E1000_PSSR_REV_POLARITY 0x0002 /* 1=Polarity reversed */ +-#define M88E1000_PSSR_DOWNSHIFT 0x0020 /* 1=Downshifted */ +-#define M88E1000_PSSR_MDIX 0x0040 /* 1=MDIX; 0=MDI */ +-#define M88E1000_PSSR_CABLE_LENGTH 0x0380 /* 0=<50M;1=50-80M;2=80-110M; +- * 3=110-140M;4=>140M */ +-#define M88E1000_PSSR_LINK 0x0400 /* 1=Link up, 0=Link down */ +-#define M88E1000_PSSR_SPD_DPLX_RESOLVED 0x0800 /* 1=Speed & Duplex resolved */ +-#define M88E1000_PSSR_PAGE_RCVD 0x1000 /* 1=Page received */ +-#define M88E1000_PSSR_DPLX 0x2000 /* 1=Duplex 0=Half Duplex */ +-#define M88E1000_PSSR_SPEED 0xC000 /* Speed, bits 14:15 */ +-#define M88E1000_PSSR_10MBS 0x0000 /* 00=10Mbs */ +-#define M88E1000_PSSR_100MBS 0x4000 /* 01=100Mbs */ +-#define M88E1000_PSSR_1000MBS 0x8000 /* 10=1000Mbs */ +- +-#define M88E1000_PSSR_REV_POLARITY_SHIFT 1 +-#define M88E1000_PSSR_DOWNSHIFT_SHIFT 5 +-#define M88E1000_PSSR_MDIX_SHIFT 6 +-#define M88E1000_PSSR_CABLE_LENGTH_SHIFT 7 +- +-/* M88E1000 Extended PHY Specific Control Register */ +-#define M88E1000_EPSCR_FIBER_LOOPBACK 0x4000 /* 1=Fiber loopback */ +-#define M88E1000_EPSCR_DOWN_NO_IDLE 0x8000 /* 1=Lost lock detect enabled. +- * Will assert lost lock and bring +- * link down if idle not seen +- * within 1ms in 1000BASE-T +- */ +-/* Number of times we will attempt to autonegotiate before downshifting if we +- * are the master */ +-#define M88E1000_EPSCR_MASTER_DOWNSHIFT_MASK 0x0C00 +-#define M88E1000_EPSCR_MASTER_DOWNSHIFT_1X 0x0000 +-#define M88E1000_EPSCR_MASTER_DOWNSHIFT_2X 0x0400 +-#define M88E1000_EPSCR_MASTER_DOWNSHIFT_3X 0x0800 +-#define M88E1000_EPSCR_MASTER_DOWNSHIFT_4X 0x0C00 +-/* Number of times we will attempt to autonegotiate before downshifting if we +- * are the slave */ +-#define M88E1000_EPSCR_SLAVE_DOWNSHIFT_MASK 0x0300 +-#define M88E1000_EPSCR_SLAVE_DOWNSHIFT_DIS 0x0000 +-#define M88E1000_EPSCR_SLAVE_DOWNSHIFT_1X 0x0100 +-#define M88E1000_EPSCR_SLAVE_DOWNSHIFT_2X 0x0200 +-#define M88E1000_EPSCR_SLAVE_DOWNSHIFT_3X 0x0300 +-#define M88E1000_EPSCR_TX_CLK_2_5 0x0060 /* 2.5 MHz TX_CLK */ +-#define M88E1000_EPSCR_TX_CLK_25 0x0070 /* 25 MHz TX_CLK */ +-#define M88E1000_EPSCR_TX_CLK_0 0x0000 /* NO TX_CLK */ +- +-/* M88EC018 Rev 2 specific DownShift settings */ +-#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_MASK 0x0E00 +-#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_1X 0x0000 +-#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_2X 0x0200 +-#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_3X 0x0400 +-#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_4X 0x0600 +-#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_5X 0x0800 +-#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_6X 0x0A00 +-#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_7X 0x0C00 +-#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_8X 0x0E00 +- +-/* IGP01E1000 Specific Port Config Register - R/W */ +-#define IGP01E1000_PSCFR_AUTO_MDIX_PAR_DETECT 0x0010 +-#define IGP01E1000_PSCFR_PRE_EN 0x0020 +-#define IGP01E1000_PSCFR_SMART_SPEED 0x0080 +-#define IGP01E1000_PSCFR_DISABLE_TPLOOPBACK 0x0100 +-#define IGP01E1000_PSCFR_DISABLE_JABBER 0x0400 +-#define IGP01E1000_PSCFR_DISABLE_TRANSMIT 0x2000 +- +-/* IGP01E1000 Specific Port Status Register - R/O */ +-#define IGP01E1000_PSSR_AUTONEG_FAILED 0x0001 /* RO LH SC */ +-#define IGP01E1000_PSSR_POLARITY_REVERSED 0x0002 +-#define IGP01E1000_PSSR_CABLE_LENGTH 0x007C +-#define IGP01E1000_PSSR_FULL_DUPLEX 0x0200 +-#define IGP01E1000_PSSR_LINK_UP 0x0400 +-#define IGP01E1000_PSSR_MDIX 0x0800 +-#define IGP01E1000_PSSR_SPEED_MASK 0xC000 /* speed bits mask */ +-#define IGP01E1000_PSSR_SPEED_10MBPS 0x4000 +-#define IGP01E1000_PSSR_SPEED_100MBPS 0x8000 +-#define IGP01E1000_PSSR_SPEED_1000MBPS 0xC000 +-#define IGP01E1000_PSSR_CABLE_LENGTH_SHIFT 0x0002 /* shift right 2 */ +-#define IGP01E1000_PSSR_MDIX_SHIFT 0x000B /* shift right 11 */ +- +-/* IGP01E1000 Specific Port Control Register - R/W */ +-#define IGP01E1000_PSCR_TP_LOOPBACK 0x0010 +-#define IGP01E1000_PSCR_CORRECT_NC_SCMBLR 0x0200 +-#define IGP01E1000_PSCR_TEN_CRS_SELECT 0x0400 +-#define IGP01E1000_PSCR_FLIP_CHIP 0x0800 +-#define IGP01E1000_PSCR_AUTO_MDIX 0x1000 +-#define IGP01E1000_PSCR_FORCE_MDI_MDIX 0x2000 /* 0-MDI, 1-MDIX */ +- +-/* IGP01E1000 Specific Port Link Health Register */ +-#define IGP01E1000_PLHR_SS_DOWNGRADE 0x8000 +-#define IGP01E1000_PLHR_GIG_SCRAMBLER_ERROR 0x4000 +-#define IGP01E1000_PLHR_MASTER_FAULT 0x2000 +-#define IGP01E1000_PLHR_MASTER_RESOLUTION 0x1000 +-#define IGP01E1000_PLHR_GIG_REM_RCVR_NOK 0x0800 /* LH */ +-#define IGP01E1000_PLHR_IDLE_ERROR_CNT_OFLOW 0x0400 /* LH */ +-#define IGP01E1000_PLHR_DATA_ERR_1 0x0200 /* LH */ +-#define IGP01E1000_PLHR_DATA_ERR_0 0x0100 +-#define IGP01E1000_PLHR_AUTONEG_FAULT 0x0040 +-#define IGP01E1000_PLHR_AUTONEG_ACTIVE 0x0010 +-#define IGP01E1000_PLHR_VALID_CHANNEL_D 0x0008 +-#define IGP01E1000_PLHR_VALID_CHANNEL_C 0x0004 +-#define IGP01E1000_PLHR_VALID_CHANNEL_B 0x0002 +-#define IGP01E1000_PLHR_VALID_CHANNEL_A 0x0001 +- +-/* IGP01E1000 Channel Quality Register */ +-#define IGP01E1000_MSE_CHANNEL_D 0x000F +-#define IGP01E1000_MSE_CHANNEL_C 0x00F0 +-#define IGP01E1000_MSE_CHANNEL_B 0x0F00 +-#define IGP01E1000_MSE_CHANNEL_A 0xF000 +- +-#define IGP02E1000_PM_SPD 0x0001 /* Smart Power Down */ +-#define IGP02E1000_PM_D3_LPLU 0x0004 /* Enable LPLU in non-D0a modes */ +-#define IGP02E1000_PM_D0_LPLU 0x0002 /* Enable LPLU in D0a mode */ +- +-/* IGP01E1000 DSP reset macros */ +-#define DSP_RESET_ENABLE 0x0 +-#define DSP_RESET_DISABLE 0x2 +-#define E1000_MAX_DSP_RESETS 10 +- +-/* IGP01E1000 & IGP02E1000 AGC Registers */ +- +-#define IGP01E1000_AGC_LENGTH_SHIFT 7 /* Coarse - 13:11, Fine - 10:7 */ +-#define IGP02E1000_AGC_LENGTH_SHIFT 9 /* Coarse - 15:13, Fine - 12:9 */ +- +-/* IGP02E1000 AGC Register Length 9-bit mask */ +-#define IGP02E1000_AGC_LENGTH_MASK 0x7F +- +-/* 7 bits (3 Coarse + 4 Fine) --> 128 optional values */ +-#define IGP01E1000_AGC_LENGTH_TABLE_SIZE 128 +-#define IGP02E1000_AGC_LENGTH_TABLE_SIZE 113 +- +-/* The precision error of the cable length is +/- 10 meters */ +-#define IGP01E1000_AGC_RANGE 10 +-#define IGP02E1000_AGC_RANGE 15 +- +-/* IGP01E1000 PCS Initialization register */ +-/* bits 3:6 in the PCS registers stores the channels polarity */ +-#define IGP01E1000_PHY_POLARITY_MASK 0x0078 +- +-/* IGP01E1000 GMII FIFO Register */ +-#define IGP01E1000_GMII_FLEX_SPD 0x10 /* Enable flexible speed +- * on Link-Up */ +-#define IGP01E1000_GMII_SPD 0x20 /* Enable SPD */ +- +-/* IGP01E1000 Analog Register */ +-#define IGP01E1000_ANALOG_SPARE_FUSE_STATUS 0x20D1 +-#define IGP01E1000_ANALOG_FUSE_STATUS 0x20D0 +-#define IGP01E1000_ANALOG_FUSE_CONTROL 0x20DC +-#define IGP01E1000_ANALOG_FUSE_BYPASS 0x20DE +- +-#define IGP01E1000_ANALOG_FUSE_POLY_MASK 0xF000 +-#define IGP01E1000_ANALOG_FUSE_FINE_MASK 0x0F80 +-#define IGP01E1000_ANALOG_FUSE_COARSE_MASK 0x0070 +-#define IGP01E1000_ANALOG_SPARE_FUSE_ENABLED 0x0100 +-#define IGP01E1000_ANALOG_FUSE_ENABLE_SW_CONTROL 0x0002 +- +-#define IGP01E1000_ANALOG_FUSE_COARSE_THRESH 0x0040 +-#define IGP01E1000_ANALOG_FUSE_COARSE_10 0x0010 +-#define IGP01E1000_ANALOG_FUSE_FINE_1 0x0080 +-#define IGP01E1000_ANALOG_FUSE_FINE_10 0x0500 +- +-/* GG82563 PHY Specific Status Register (Page 0, Register 16 */ +-#define GG82563_PSCR_DISABLE_JABBER 0x0001 /* 1=Disable Jabber */ +-#define GG82563_PSCR_POLARITY_REVERSAL_DISABLE 0x0002 /* 1=Polarity Reversal Disabled */ +-#define GG82563_PSCR_POWER_DOWN 0x0004 /* 1=Power Down */ +-#define GG82563_PSCR_COPPER_TRANSMITER_DISABLE 0x0008 /* 1=Transmitter Disabled */ +-#define GG82563_PSCR_CROSSOVER_MODE_MASK 0x0060 +-#define GG82563_PSCR_CROSSOVER_MODE_MDI 0x0000 /* 00=Manual MDI configuration */ +-#define GG82563_PSCR_CROSSOVER_MODE_MDIX 0x0020 /* 01=Manual MDIX configuration */ +-#define GG82563_PSCR_CROSSOVER_MODE_AUTO 0x0060 /* 11=Automatic crossover */ +-#define GG82563_PSCR_ENALBE_EXTENDED_DISTANCE 0x0080 /* 1=Enable Extended Distance */ +-#define GG82563_PSCR_ENERGY_DETECT_MASK 0x0300 +-#define GG82563_PSCR_ENERGY_DETECT_OFF 0x0000 /* 00,01=Off */ +-#define GG82563_PSCR_ENERGY_DETECT_RX 0x0200 /* 10=Sense on Rx only (Energy Detect) */ +-#define GG82563_PSCR_ENERGY_DETECT_RX_TM 0x0300 /* 11=Sense and Tx NLP */ +-#define GG82563_PSCR_FORCE_LINK_GOOD 0x0400 /* 1=Force Link Good */ +-#define GG82563_PSCR_DOWNSHIFT_ENABLE 0x0800 /* 1=Enable Downshift */ +-#define GG82563_PSCR_DOWNSHIFT_COUNTER_MASK 0x7000 +-#define GG82563_PSCR_DOWNSHIFT_COUNTER_SHIFT 12 +- +-/* PHY Specific Status Register (Page 0, Register 17) */ +-#define GG82563_PSSR_JABBER 0x0001 /* 1=Jabber */ +-#define GG82563_PSSR_POLARITY 0x0002 /* 1=Polarity Reversed */ +-#define GG82563_PSSR_LINK 0x0008 /* 1=Link is Up */ +-#define GG82563_PSSR_ENERGY_DETECT 0x0010 /* 1=Sleep, 0=Active */ +-#define GG82563_PSSR_DOWNSHIFT 0x0020 /* 1=Downshift */ +-#define GG82563_PSSR_CROSSOVER_STATUS 0x0040 /* 1=MDIX, 0=MDI */ +-#define GG82563_PSSR_RX_PAUSE_ENABLED 0x0100 /* 1=Receive Pause Enabled */ +-#define GG82563_PSSR_TX_PAUSE_ENABLED 0x0200 /* 1=Transmit Pause Enabled */ +-#define GG82563_PSSR_LINK_UP 0x0400 /* 1=Link Up */ +-#define GG82563_PSSR_SPEED_DUPLEX_RESOLVED 0x0800 /* 1=Resolved */ +-#define GG82563_PSSR_PAGE_RECEIVED 0x1000 /* 1=Page Received */ +-#define GG82563_PSSR_DUPLEX 0x2000 /* 1-Full-Duplex */ +-#define GG82563_PSSR_SPEED_MASK 0xC000 +-#define GG82563_PSSR_SPEED_10MBPS 0x0000 /* 00=10Mbps */ +-#define GG82563_PSSR_SPEED_100MBPS 0x4000 /* 01=100Mbps */ +-#define GG82563_PSSR_SPEED_1000MBPS 0x8000 /* 10=1000Mbps */ +- +-/* PHY Specific Status Register 2 (Page 0, Register 19) */ +-#define GG82563_PSSR2_JABBER 0x0001 /* 1=Jabber */ +-#define GG82563_PSSR2_POLARITY_CHANGED 0x0002 /* 1=Polarity Changed */ +-#define GG82563_PSSR2_ENERGY_DETECT_CHANGED 0x0010 /* 1=Energy Detect Changed */ +-#define GG82563_PSSR2_DOWNSHIFT_INTERRUPT 0x0020 /* 1=Downshift Detected */ +-#define GG82563_PSSR2_MDI_CROSSOVER_CHANGE 0x0040 /* 1=Crossover Changed */ +-#define GG82563_PSSR2_FALSE_CARRIER 0x0100 /* 1=False Carrier */ +-#define GG82563_PSSR2_SYMBOL_ERROR 0x0200 /* 1=Symbol Error */ +-#define GG82563_PSSR2_LINK_STATUS_CHANGED 0x0400 /* 1=Link Status Changed */ +-#define GG82563_PSSR2_AUTO_NEG_COMPLETED 0x0800 /* 1=Auto-Neg Completed */ +-#define GG82563_PSSR2_PAGE_RECEIVED 0x1000 /* 1=Page Received */ +-#define GG82563_PSSR2_DUPLEX_CHANGED 0x2000 /* 1=Duplex Changed */ +-#define GG82563_PSSR2_SPEED_CHANGED 0x4000 /* 1=Speed Changed */ +-#define GG82563_PSSR2_AUTO_NEG_ERROR 0x8000 /* 1=Auto-Neg Error */ +- +-/* PHY Specific Control Register 2 (Page 0, Register 26) */ +-#define GG82563_PSCR2_10BT_POLARITY_FORCE 0x0002 /* 1=Force Negative Polarity */ +-#define GG82563_PSCR2_1000MB_TEST_SELECT_MASK 0x000C +-#define GG82563_PSCR2_1000MB_TEST_SELECT_NORMAL 0x0000 /* 00,01=Normal Operation */ +-#define GG82563_PSCR2_1000MB_TEST_SELECT_112NS 0x0008 /* 10=Select 112ns Sequence */ +-#define GG82563_PSCR2_1000MB_TEST_SELECT_16NS 0x000C /* 11=Select 16ns Sequence */ +-#define GG82563_PSCR2_REVERSE_AUTO_NEG 0x2000 /* 1=Reverse Auto-Negotiation */ +-#define GG82563_PSCR2_1000BT_DISABLE 0x4000 /* 1=Disable 1000BASE-T */ +-#define GG82563_PSCR2_TRANSMITER_TYPE_MASK 0x8000 +-#define GG82563_PSCR2_TRANSMITTER_TYPE_CLASS_B 0x0000 /* 0=Class B */ +-#define GG82563_PSCR2_TRANSMITTER_TYPE_CLASS_A 0x8000 /* 1=Class A */ +- +-/* MAC Specific Control Register (Page 2, Register 21) */ +-/* Tx clock speed for Link Down and 1000BASE-T for the following speeds */ +-#define GG82563_MSCR_TX_CLK_MASK 0x0007 +-#define GG82563_MSCR_TX_CLK_10MBPS_2_5MHZ 0x0004 +-#define GG82563_MSCR_TX_CLK_100MBPS_25MHZ 0x0005 +-#define GG82563_MSCR_TX_CLK_1000MBPS_2_5MHZ 0x0006 +-#define GG82563_MSCR_TX_CLK_1000MBPS_25MHZ 0x0007 +- +-#define GG82563_MSCR_ASSERT_CRS_ON_TX 0x0010 /* 1=Assert */ +- +-/* DSP Distance Register (Page 5, Register 26) */ +-#define GG82563_DSPD_CABLE_LENGTH 0x0007 /* 0 = <50M; +- 1 = 50-80M; +- 2 = 80-110M; +- 3 = 110-140M; +- 4 = >140M */ +- +-/* Kumeran Mode Control Register (Page 193, Register 16) */ +-#define GG82563_KMCR_PHY_LEDS_EN 0x0020 /* 1=PHY LEDs, 0=Kumeran Inband LEDs */ +-#define GG82563_KMCR_FORCE_LINK_UP 0x0040 /* 1=Force Link Up */ +-#define GG82563_KMCR_SUPPRESS_SGMII_EPD_EXT 0x0080 +-#define GG82563_KMCR_MDIO_BUS_SPEED_SELECT_MASK 0x0400 +-#define GG82563_KMCR_MDIO_BUS_SPEED_SELECT 0x0400 /* 1=6.25MHz, 0=0.8MHz */ +-#define GG82563_KMCR_PASS_FALSE_CARRIER 0x0800 +- +-/* Power Management Control Register (Page 193, Register 20) */ +-#define GG82563_PMCR_ENABLE_ELECTRICAL_IDLE 0x0001 /* 1=Enalbe SERDES Electrical Idle */ +-#define GG82563_PMCR_DISABLE_PORT 0x0002 /* 1=Disable Port */ +-#define GG82563_PMCR_DISABLE_SERDES 0x0004 /* 1=Disable SERDES */ +-#define GG82563_PMCR_REVERSE_AUTO_NEG 0x0008 /* 1=Enable Reverse Auto-Negotiation */ +-#define GG82563_PMCR_DISABLE_1000_NON_D0 0x0010 /* 1=Disable 1000Mbps Auto-Neg in non D0 */ +-#define GG82563_PMCR_DISABLE_1000 0x0020 /* 1=Disable 1000Mbps Auto-Neg Always */ +-#define GG82563_PMCR_REVERSE_AUTO_NEG_D0A 0x0040 /* 1=Enable D0a Reverse Auto-Negotiation */ +-#define GG82563_PMCR_FORCE_POWER_STATE 0x0080 /* 1=Force Power State */ +-#define GG82563_PMCR_PROGRAMMED_POWER_STATE_MASK 0x0300 +-#define GG82563_PMCR_PROGRAMMED_POWER_STATE_DR 0x0000 /* 00=Dr */ +-#define GG82563_PMCR_PROGRAMMED_POWER_STATE_D0U 0x0100 /* 01=D0u */ +-#define GG82563_PMCR_PROGRAMMED_POWER_STATE_D0A 0x0200 /* 10=D0a */ +-#define GG82563_PMCR_PROGRAMMED_POWER_STATE_D3 0x0300 /* 11=D3 */ +- +-/* In-Band Control Register (Page 194, Register 18) */ +-#define GG82563_ICR_DIS_PADDING 0x0010 /* Disable Padding Use */ +- +- +-/* Bit definitions for valid PHY IDs. */ +-/* I = Integrated +- * E = External +- */ +-#define M88_VENDOR 0x0141 +-#define M88E1000_E_PHY_ID 0x01410C50 +-#define M88E1000_I_PHY_ID 0x01410C30 +-#define M88E1011_I_PHY_ID 0x01410C20 +-#define IGP01E1000_I_PHY_ID 0x02A80380 +-#define M88E1000_12_PHY_ID M88E1000_E_PHY_ID +-#define M88E1000_14_PHY_ID M88E1000_E_PHY_ID +-#define M88E1011_I_REV_4 0x04 +-#define M88E1111_I_PHY_ID 0x01410CC0 +-#define L1LXT971A_PHY_ID 0x001378E0 +-#define GG82563_E_PHY_ID 0x01410CA0 +- +- +-/* Bits... +- * 15-5: page +- * 4-0: register offset +- */ +-#define PHY_PAGE_SHIFT 5 +-#define PHY_REG(page, reg) \ +- (((page) << PHY_PAGE_SHIFT) | ((reg) & MAX_PHY_REG_ADDRESS)) +- +-#define IGP3_PHY_PORT_CTRL \ +- PHY_REG(769, 17) /* Port General Configuration */ +-#define IGP3_PHY_RATE_ADAPT_CTRL \ +- PHY_REG(769, 25) /* Rate Adapter Control Register */ +- +-#define IGP3_KMRN_FIFO_CTRL_STATS \ +- PHY_REG(770, 16) /* KMRN FIFO's control/status register */ +-#define IGP3_KMRN_POWER_MNG_CTRL \ +- PHY_REG(770, 17) /* KMRN Power Management Control Register */ +-#define IGP3_KMRN_INBAND_CTRL \ +- PHY_REG(770, 18) /* KMRN Inband Control Register */ +-#define IGP3_KMRN_DIAG \ +- PHY_REG(770, 19) /* KMRN Diagnostic register */ +-#define IGP3_KMRN_DIAG_PCS_LOCK_LOSS 0x0002 /* RX PCS is not synced */ +-#define IGP3_KMRN_ACK_TIMEOUT \ +- PHY_REG(770, 20) /* KMRN Acknowledge Timeouts register */ +- +-#define IGP3_VR_CTRL \ +- PHY_REG(776, 18) /* Voltage regulator control register */ +-#define IGP3_VR_CTRL_MODE_SHUT 0x0200 /* Enter powerdown, shutdown VRs */ +-#define IGP3_VR_CTRL_MODE_MASK 0x0300 /* Shutdown VR Mask */ +- +-#define IGP3_CAPABILITY \ +- PHY_REG(776, 19) /* IGP3 Capability Register */ +- +-/* Capabilities for SKU Control */ +-#define IGP3_CAP_INITIATE_TEAM 0x0001 /* Able to initiate a team */ +-#define IGP3_CAP_WFM 0x0002 /* Support WoL and PXE */ +-#define IGP3_CAP_ASF 0x0004 /* Support ASF */ +-#define IGP3_CAP_LPLU 0x0008 /* Support Low Power Link Up */ +-#define IGP3_CAP_DC_AUTO_SPEED 0x0010 /* Support AC/DC Auto Link Speed */ +-#define IGP3_CAP_SPD 0x0020 /* Support Smart Power Down */ +-#define IGP3_CAP_MULT_QUEUE 0x0040 /* Support 2 tx & 2 rx queues */ +-#define IGP3_CAP_RSS 0x0080 /* Support RSS */ +-#define IGP3_CAP_8021PQ 0x0100 /* Support 802.1Q & 802.1p */ +-#define IGP3_CAP_AMT_CB 0x0200 /* Support active manageability and circuit breaker */ +- +-#define IGP3_PPC_JORDAN_EN 0x0001 +-#define IGP3_PPC_JORDAN_GIGA_SPEED 0x0002 +- +-#define IGP3_KMRN_PMC_EE_IDLE_LINK_DIS 0x0001 +-#define IGP3_KMRN_PMC_K0S_ENTRY_LATENCY_MASK 0x001E +-#define IGP3_KMRN_PMC_K0S_MODE1_EN_GIGA 0x0020 +-#define IGP3_KMRN_PMC_K0S_MODE1_EN_100 0x0040 +- +-#define IGP3E1000_PHY_MISC_CTRL 0x1B /* Misc. Ctrl register */ +-#define IGP3_PHY_MISC_DUPLEX_MANUAL_SET 0x1000 /* Duplex Manual Set */ +- +-#define IGP3_KMRN_EXT_CTRL PHY_REG(770, 18) +-#define IGP3_KMRN_EC_DIS_INBAND 0x0080 +- +-#define IGP03E1000_E_PHY_ID 0x02A80390 +-#define IFE_E_PHY_ID 0x02A80330 /* 10/100 PHY */ +-#define IFE_PLUS_E_PHY_ID 0x02A80320 +-#define IFE_C_E_PHY_ID 0x02A80310 +- +-#define IFE_PHY_EXTENDED_STATUS_CONTROL 0x10 /* 100BaseTx Extended Status, Control and Address */ +-#define IFE_PHY_SPECIAL_CONTROL 0x11 /* 100BaseTx PHY special control register */ +-#define IFE_PHY_RCV_FALSE_CARRIER 0x13 /* 100BaseTx Receive False Carrier Counter */ +-#define IFE_PHY_RCV_DISCONNECT 0x14 /* 100BaseTx Receive Disconnet Counter */ +-#define IFE_PHY_RCV_ERROT_FRAME 0x15 /* 100BaseTx Receive Error Frame Counter */ +-#define IFE_PHY_RCV_SYMBOL_ERR 0x16 /* Receive Symbol Error Counter */ +-#define IFE_PHY_PREM_EOF_ERR 0x17 /* 100BaseTx Receive Premature End Of Frame Error Counter */ +-#define IFE_PHY_RCV_EOF_ERR 0x18 /* 10BaseT Receive End Of Frame Error Counter */ +-#define IFE_PHY_TX_JABBER_DETECT 0x19 /* 10BaseT Transmit Jabber Detect Counter */ +-#define IFE_PHY_EQUALIZER 0x1A /* PHY Equalizer Control and Status */ +-#define IFE_PHY_SPECIAL_CONTROL_LED 0x1B /* PHY special control and LED configuration */ +-#define IFE_PHY_MDIX_CONTROL 0x1C /* MDI/MDI-X Control register */ +-#define IFE_PHY_HWI_CONTROL 0x1D /* Hardware Integrity Control (HWI) */ +- +-#define IFE_PESC_REDUCED_POWER_DOWN_DISABLE 0x2000 /* Defaut 1 = Disable auto reduced power down */ +-#define IFE_PESC_100BTX_POWER_DOWN 0x0400 /* Indicates the power state of 100BASE-TX */ +-#define IFE_PESC_10BTX_POWER_DOWN 0x0200 /* Indicates the power state of 10BASE-T */ +-#define IFE_PESC_POLARITY_REVERSED 0x0100 /* Indicates 10BASE-T polarity */ +-#define IFE_PESC_PHY_ADDR_MASK 0x007C /* Bit 6:2 for sampled PHY address */ +-#define IFE_PESC_SPEED 0x0002 /* Auto-negotiation speed result 1=100Mbs, 0=10Mbs */ +-#define IFE_PESC_DUPLEX 0x0001 /* Auto-negotiation duplex result 1=Full, 0=Half */ +-#define IFE_PESC_POLARITY_REVERSED_SHIFT 8 +- +-#define IFE_PSC_DISABLE_DYNAMIC_POWER_DOWN 0x0100 /* 1 = Dyanmic Power Down disabled */ +-#define IFE_PSC_FORCE_POLARITY 0x0020 /* 1=Reversed Polarity, 0=Normal */ +-#define IFE_PSC_AUTO_POLARITY_DISABLE 0x0010 /* 1=Auto Polarity Disabled, 0=Enabled */ +-#define IFE_PSC_JABBER_FUNC_DISABLE 0x0001 /* 1=Jabber Disabled, 0=Normal Jabber Operation */ +-#define IFE_PSC_FORCE_POLARITY_SHIFT 5 +-#define IFE_PSC_AUTO_POLARITY_DISABLE_SHIFT 4 +- +-#define IFE_PMC_AUTO_MDIX 0x0080 /* 1=enable MDI/MDI-X feature, default 0=disabled */ +-#define IFE_PMC_FORCE_MDIX 0x0040 /* 1=force MDIX-X, 0=force MDI */ +-#define IFE_PMC_MDIX_STATUS 0x0020 /* 1=MDI-X, 0=MDI */ +-#define IFE_PMC_AUTO_MDIX_COMPLETE 0x0010 /* Resolution algorithm is completed */ +-#define IFE_PMC_MDIX_MODE_SHIFT 6 +-#define IFE_PHC_MDIX_RESET_ALL_MASK 0x0000 /* Disable auto MDI-X */ +- +-#define IFE_PHC_HWI_ENABLE 0x8000 /* Enable the HWI feature */ +-#define IFE_PHC_ABILITY_CHECK 0x4000 /* 1= Test Passed, 0=failed */ +-#define IFE_PHC_TEST_EXEC 0x2000 /* PHY launch test pulses on the wire */ +-#define IFE_PHC_HIGHZ 0x0200 /* 1 = Open Circuit */ +-#define IFE_PHC_LOWZ 0x0400 /* 1 = Short Circuit */ +-#define IFE_PHC_LOW_HIGH_Z_MASK 0x0600 /* Mask for indication type of problem on the line */ +-#define IFE_PHC_DISTANCE_MASK 0x01FF /* Mask for distance to the cable problem, in 80cm granularity */ +-#define IFE_PHC_RESET_ALL_MASK 0x0000 /* Disable HWI */ +-#define IFE_PSCL_PROBE_MODE 0x0020 /* LED Probe mode */ +-#define IFE_PSCL_PROBE_LEDS_OFF 0x0006 /* Force LEDs 0 and 2 off */ +-#define IFE_PSCL_PROBE_LEDS_ON 0x0007 /* Force LEDs 0 and 2 on */ +- +-#define ICH_FLASH_COMMAND_TIMEOUT 5000 /* 5000 uSecs - adjusted */ +-#define ICH_FLASH_ERASE_TIMEOUT 3000000 /* Up to 3 seconds - worst case */ +-#define ICH_FLASH_CYCLE_REPEAT_COUNT 10 /* 10 cycles */ +-#define ICH_FLASH_SEG_SIZE_256 256 +-#define ICH_FLASH_SEG_SIZE_4K 4096 +-#define ICH_FLASH_SEG_SIZE_64K 65536 +- +-#define ICH_CYCLE_READ 0x0 +-#define ICH_CYCLE_RESERVED 0x1 +-#define ICH_CYCLE_WRITE 0x2 +-#define ICH_CYCLE_ERASE 0x3 +- +-#define ICH_FLASH_GFPREG 0x0000 +-#define ICH_FLASH_HSFSTS 0x0004 +-#define ICH_FLASH_HSFCTL 0x0006 +-#define ICH_FLASH_FADDR 0x0008 +-#define ICH_FLASH_FDATA0 0x0010 +-#define ICH_FLASH_FRACC 0x0050 +-#define ICH_FLASH_FREG0 0x0054 +-#define ICH_FLASH_FREG1 0x0058 +-#define ICH_FLASH_FREG2 0x005C +-#define ICH_FLASH_FREG3 0x0060 +-#define ICH_FLASH_FPR0 0x0074 +-#define ICH_FLASH_FPR1 0x0078 +-#define ICH_FLASH_SSFSTS 0x0090 +-#define ICH_FLASH_SSFCTL 0x0092 +-#define ICH_FLASH_PREOP 0x0094 +-#define ICH_FLASH_OPTYPE 0x0096 +-#define ICH_FLASH_OPMENU 0x0098 +- +-#define ICH_FLASH_REG_MAPSIZE 0x00A0 +-#define ICH_FLASH_SECTOR_SIZE 4096 +-#define ICH_GFPREG_BASE_MASK 0x1FFF +-#define ICH_FLASH_LINEAR_ADDR_MASK 0x00FFFFFF +- +-/* ICH8 GbE Flash Hardware Sequencing Flash Status Register bit breakdown */ +-/* Offset 04h HSFSTS */ +-union ich8_hws_flash_status { +- struct ich8_hsfsts { +-#ifdef __BIG_ENDIAN +- u16 reserved2 :6; +- u16 fldesvalid :1; +- u16 flockdn :1; +- u16 flcdone :1; +- u16 flcerr :1; +- u16 dael :1; +- u16 berasesz :2; +- u16 flcinprog :1; +- u16 reserved1 :2; +-#else +- u16 flcdone :1; /* bit 0 Flash Cycle Done */ +- u16 flcerr :1; /* bit 1 Flash Cycle Error */ +- u16 dael :1; /* bit 2 Direct Access error Log */ +- u16 berasesz :2; /* bit 4:3 Block/Sector Erase Size */ +- u16 flcinprog :1; /* bit 5 flash SPI cycle in Progress */ +- u16 reserved1 :2; /* bit 13:6 Reserved */ +- u16 reserved2 :6; /* bit 13:6 Reserved */ +- u16 fldesvalid :1; /* bit 14 Flash Descriptor Valid */ +- u16 flockdn :1; /* bit 15 Flash Configuration Lock-Down */ +-#endif +- } hsf_status; +- u16 regval; ++/* Host Interface "Rev 1" */ ++struct e1000_host_command_header { ++ u8 command_id; ++ u8 command_length; ++ u8 command_options; ++ u8 checksum; + }; + +-/* ICH8 GbE Flash Hardware Sequencing Flash control Register bit breakdown */ +-/* Offset 06h FLCTL */ +-union ich8_hws_flash_ctrl { +- struct ich8_hsflctl { +-#ifdef __BIG_ENDIAN +- u16 fldbcount :2; +- u16 flockdn :6; +- u16 flcgo :1; +- u16 flcycle :2; +- u16 reserved :5; +-#else +- u16 flcgo :1; /* 0 Flash Cycle Go */ +- u16 flcycle :2; /* 2:1 Flash Cycle */ +- u16 reserved :5; /* 7:3 Reserved */ +- u16 fldbcount :2; /* 9:8 Flash Data Byte Count */ +- u16 flockdn :6; /* 15:10 Reserved */ +-#endif +- } hsf_ctrl; +- u16 regval; ++#define E1000_HI_MAX_DATA_LENGTH 252 ++struct e1000_host_command_info { ++ struct e1000_host_command_header command_header; ++ u8 command_data[E1000_HI_MAX_DATA_LENGTH]; + }; + +-/* ICH8 Flash Region Access Permissions */ +-union ich8_hws_flash_regacc { +- struct ich8_flracc { +-#ifdef __BIG_ENDIAN +- u32 gmwag :8; +- u32 gmrag :8; +- u32 grwa :8; +- u32 grra :8; +-#else +- u32 grra :8; /* 0:7 GbE region Read Access */ +- u32 grwa :8; /* 8:15 GbE region Write Access */ +- u32 gmrag :8; /* 23:16 GbE Master Read Access Grant */ +- u32 gmwag :8; /* 31:24 GbE Master Write Access Grant */ +-#endif +- } hsf_flregacc; +- u16 regval; ++/* Host Interface "Rev 2" */ ++struct e1000_host_mng_command_header { ++ u8 command_id; ++ u8 checksum; ++ u16 reserved1; ++ u16 reserved2; ++ u16 command_length; + }; + +-/* Miscellaneous PHY bit definitions. */ +-#define PHY_PREAMBLE 0xFFFFFFFF +-#define PHY_SOF 0x01 +-#define PHY_OP_READ 0x02 +-#define PHY_OP_WRITE 0x01 +-#define PHY_TURNAROUND 0x02 +-#define PHY_PREAMBLE_SIZE 32 +-#define MII_CR_SPEED_1000 0x0040 +-#define MII_CR_SPEED_100 0x2000 +-#define MII_CR_SPEED_10 0x0000 +-#define E1000_PHY_ADDRESS 0x01 +-#define PHY_AUTO_NEG_TIME 45 /* 4.5 Seconds */ +-#define PHY_FORCE_TIME 20 /* 2.0 Seconds */ +-#define PHY_REVISION_MASK 0xFFFFFFF0 +-#define DEVICE_SPEED_MASK 0x00000300 /* Device Ctrl Reg Speed Mask */ +-#define REG4_SPEED_MASK 0x01E0 +-#define REG9_SPEED_MASK 0x0300 +-#define ADVERTISE_10_HALF 0x0001 +-#define ADVERTISE_10_FULL 0x0002 +-#define ADVERTISE_100_HALF 0x0004 +-#define ADVERTISE_100_FULL 0x0008 +-#define ADVERTISE_1000_HALF 0x0010 +-#define ADVERTISE_1000_FULL 0x0020 +-#define AUTONEG_ADVERTISE_SPEED_DEFAULT 0x002F /* Everything but 1000-Half */ +-#define AUTONEG_ADVERTISE_10_100_ALL 0x000F /* All 10/100 speeds*/ +-#define AUTONEG_ADVERTISE_10_ALL 0x0003 /* 10Mbps Full & Half speeds*/ ++#define E1000_HI_MAX_MNG_DATA_LENGTH 0x6F8 ++struct e1000_host_mng_command_info { ++ struct e1000_host_mng_command_header command_header; ++ u8 command_data[E1000_HI_MAX_MNG_DATA_LENGTH]; ++}; + +-#endif /* _E1000_HW_H_ */ ++#include "e1000_mac.h" ++#include "e1000_phy.h" ++#include "e1000_nvm.h" ++#include "e1000_manage.h" ++ ++struct e1000_mac_operations { ++ /* Function pointers for the MAC. */ ++ s32 (*init_params)(struct e1000_hw *); ++ s32 (*id_led_init)(struct e1000_hw *); ++ s32 (*blink_led)(struct e1000_hw *); ++ s32 (*check_for_link)(struct e1000_hw *); ++ bool (*check_mng_mode)(struct e1000_hw *hw); ++ s32 (*cleanup_led)(struct e1000_hw *); ++ void (*clear_hw_cntrs)(struct e1000_hw *); ++ void (*clear_vfta)(struct e1000_hw *); ++ s32 (*get_bus_info)(struct e1000_hw *); ++ void (*set_lan_id)(struct e1000_hw *); ++ s32 (*get_link_up_info)(struct e1000_hw *, u16 *, u16 *); ++ s32 (*led_on)(struct e1000_hw *); ++ s32 (*led_off)(struct e1000_hw *); ++ void (*update_mc_addr_list)(struct e1000_hw *, u8 *, u32); ++ s32 (*reset_hw)(struct e1000_hw *); ++ s32 (*init_hw)(struct e1000_hw *); ++ s32 (*setup_link)(struct e1000_hw *); ++ s32 (*setup_physical_interface)(struct e1000_hw *); ++ s32 (*setup_led)(struct e1000_hw *); ++ void (*write_vfta)(struct e1000_hw *, u32, u32); ++ void (*mta_set)(struct e1000_hw *, u32); ++ void (*config_collision_dist)(struct e1000_hw *); ++ void (*rar_set)(struct e1000_hw *, u8*, u32); ++ s32 (*read_mac_addr)(struct e1000_hw *); ++ s32 (*validate_mdi_setting)(struct e1000_hw *); ++ s32 (*mng_host_if_write)(struct e1000_hw *, u8*, u16, u16, u8*); ++ s32 (*mng_write_cmd_header)(struct e1000_hw *hw, ++ struct e1000_host_mng_command_header*); ++ s32 (*mng_enable_host_if)(struct e1000_hw *); ++ s32 (*wait_autoneg)(struct e1000_hw *); ++}; ++ ++struct e1000_phy_operations { ++ s32 (*init_params)(struct e1000_hw *); ++ s32 (*acquire)(struct e1000_hw *); ++ s32 (*check_polarity)(struct e1000_hw *); ++ s32 (*check_reset_block)(struct e1000_hw *); ++ s32 (*commit)(struct e1000_hw *); ++ s32 (*force_speed_duplex)(struct e1000_hw *); ++ s32 (*get_cfg_done)(struct e1000_hw *hw); ++ s32 (*get_cable_length)(struct e1000_hw *); ++ s32 (*get_info)(struct e1000_hw *); ++ s32 (*read_reg)(struct e1000_hw *, u32, u16 *); ++ void (*release)(struct e1000_hw *); ++ s32 (*reset)(struct e1000_hw *); ++ s32 (*set_d0_lplu_state)(struct e1000_hw *, bool); ++ s32 (*set_d3_lplu_state)(struct e1000_hw *, bool); ++ s32 (*write_reg)(struct e1000_hw *, u32, u16); ++ void (*power_up)(struct e1000_hw *); ++ void (*power_down)(struct e1000_hw *); ++}; ++ ++struct e1000_nvm_operations { ++ s32 (*init_params)(struct e1000_hw *); ++ s32 (*acquire)(struct e1000_hw *); ++ s32 (*read)(struct e1000_hw *, u16, u16, u16 *); ++ void (*release)(struct e1000_hw *); ++ void (*reload)(struct e1000_hw *); ++ s32 (*update)(struct e1000_hw *); ++ s32 (*valid_led_default)(struct e1000_hw *, u16 *); ++ s32 (*validate)(struct e1000_hw *); ++ s32 (*write)(struct e1000_hw *, u16, u16, u16 *); ++}; ++ ++struct e1000_mac_info { ++ struct e1000_mac_operations ops; ++ u8 addr[6]; ++ u8 perm_addr[6]; ++ ++ enum e1000_mac_type type; ++ ++ u32 collision_delta; ++ u32 ledctl_default; ++ u32 ledctl_mode1; ++ u32 ledctl_mode2; ++ u32 mc_filter_type; ++ u32 tx_packet_delta; ++ u32 txcw; ++ ++ u16 current_ifs_val; ++ u16 ifs_max_val; ++ u16 ifs_min_val; ++ u16 ifs_ratio; ++ u16 ifs_step_size; ++ u16 mta_reg_count; ++ ++ /* Maximum size of the MTA register table in all supported adapters */ ++ #define MAX_MTA_REG 128 ++ u32 mta_shadow[MAX_MTA_REG]; ++ u16 rar_entry_count; ++ ++ u8 forced_speed_duplex; ++ ++ bool adaptive_ifs; ++ bool arc_subsystem_valid; ++ bool asf_firmware_present; ++ bool autoneg; ++ bool autoneg_failed; ++ bool get_link_status; ++ bool in_ifs_mode; ++ bool report_tx_early; ++ enum e1000_serdes_link_state serdes_link_state; ++ bool serdes_has_link; ++ bool tx_pkt_filtering; ++}; ++ ++struct e1000_phy_info { ++ struct e1000_phy_operations ops; ++ enum e1000_phy_type type; ++ ++ enum e1000_1000t_rx_status local_rx; ++ enum e1000_1000t_rx_status remote_rx; ++ enum e1000_ms_type ms_type; ++ enum e1000_ms_type original_ms_type; ++ enum e1000_rev_polarity cable_polarity; ++ enum e1000_smart_speed smart_speed; ++ ++ u32 addr; ++ u32 id; ++ u32 reset_delay_us; /* in usec */ ++ u32 revision; ++ ++ enum e1000_media_type media_type; ++ ++ u16 autoneg_advertised; ++ u16 autoneg_mask; ++ u16 cable_length; ++ u16 max_cable_length; ++ u16 min_cable_length; ++ ++ u8 mdix; ++ ++ bool disable_polarity_correction; ++ bool is_mdix; ++ bool polarity_correction; ++ bool reset_disable; ++ bool speed_downgraded; ++ bool autoneg_wait_to_complete; ++}; ++ ++struct e1000_nvm_info { ++ struct e1000_nvm_operations ops; ++ enum e1000_nvm_type type; ++ enum e1000_nvm_override override; ++ ++ u32 flash_bank_size; ++ u32 flash_base_addr; ++ ++ u16 word_size; ++ u16 delay_usec; ++ u16 address_bits; ++ u16 opcode_bits; ++ u16 page_size; ++}; ++ ++struct e1000_bus_info { ++ enum e1000_bus_type type; ++ enum e1000_bus_speed speed; ++ enum e1000_bus_width width; ++ ++ u16 func; ++ u16 pci_cmd_word; ++}; ++ ++struct e1000_fc_info { ++ u32 high_water; /* Flow control high-water mark */ ++ u32 low_water; /* Flow control low-water mark */ ++ u16 pause_time; /* Flow control pause timer */ ++ bool send_xon; /* Flow control send XON */ ++ bool strict_ieee; /* Strict IEEE mode */ ++ enum e1000_fc_mode current_mode; /* FC mode in effect */ ++ enum e1000_fc_mode requested_mode; /* FC mode requested by caller */ ++}; ++ ++struct e1000_dev_spec_82541 { ++ enum e1000_dsp_config dsp_config; ++ enum e1000_ffe_config ffe_config; ++ u16 spd_default; ++ bool phy_init_script; ++}; ++ ++struct e1000_dev_spec_82542 { ++ bool dma_fairness; ++}; ++ ++struct e1000_dev_spec_82543 { ++ u32 tbi_compatibility; ++ bool dma_fairness; ++ bool init_phy_disabled; ++}; ++ ++struct e1000_hw { ++ void *back; ++ ++ u8 __iomem *hw_addr; ++ u8 __iomem *flash_address; ++ unsigned long io_base; ++ ++ struct e1000_mac_info mac; ++ struct e1000_fc_info fc; ++ struct e1000_phy_info phy; ++ struct e1000_nvm_info nvm; ++ struct e1000_bus_info bus; ++ struct e1000_host_mng_dhcp_cookie mng_cookie; ++ ++ union { ++ struct e1000_dev_spec_82541 _82541; ++ struct e1000_dev_spec_82542 _82542; ++ struct e1000_dev_spec_82543 _82543; ++ } dev_spec; ++ ++ u16 device_id; ++ u16 subsystem_vendor_id; ++ u16 subsystem_device_id; ++ u16 vendor_id; ++ ++ u8 revision_id; ++}; ++ ++#include "e1000_82541.h" ++#include "e1000_82543.h" ++ ++/* These functions must be implemented by drivers */ ++void e1000_pci_clear_mwi(struct e1000_hw *hw); ++void e1000_pci_set_mwi(struct e1000_hw *hw); ++s32 e1000_read_pcie_cap_reg(struct e1000_hw *hw, u32 reg, u16 *value); ++void e1000_read_pci_cfg(struct e1000_hw *hw, u32 reg, u16 *value); ++void e1000_write_pci_cfg(struct e1000_hw *hw, u32 reg, u16 *value); ++ ++#endif +diff -r d03036c09699 drivers/net/e1000/e1000_ich8lan.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/e1000/e1000_ich8lan.h Mon Jun 15 11:43:11 2009 +0100 +@@ -0,0 +1,109 @@ ++/******************************************************************************* ++ ++ Intel PRO/1000 Linux driver ++ Copyright(c) 1999 - 2007 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ Linux NICS ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++#ifndef _E1000_ICH8LAN_H_ ++#define _E1000_ICH8LAN_H_ ++ ++#define ICH_FLASH_GFPREG 0x0000 ++#define ICH_FLASH_HSFSTS 0x0004 ++#define ICH_FLASH_HSFCTL 0x0006 ++#define ICH_FLASH_FADDR 0x0008 ++#define ICH_FLASH_FDATA0 0x0010 ++ ++#define ICH_FLASH_READ_COMMAND_TIMEOUT 500 ++#define ICH_FLASH_WRITE_COMMAND_TIMEOUT 500 ++#define ICH_FLASH_ERASE_COMMAND_TIMEOUT 3000000 ++#define ICH_FLASH_LINEAR_ADDR_MASK 0x00FFFFFF ++#define ICH_FLASH_CYCLE_REPEAT_COUNT 10 ++ ++#define ICH_CYCLE_READ 0 ++#define ICH_CYCLE_WRITE 2 ++#define ICH_CYCLE_ERASE 3 ++ ++#define FLASH_GFPREG_BASE_MASK 0x1FFF ++#define FLASH_SECTOR_ADDR_SHIFT 12 ++ ++#define E1000_SHADOW_RAM_WORDS 2048 ++ ++#define ICH_FLASH_SEG_SIZE_256 256 ++#define ICH_FLASH_SEG_SIZE_4K 4096 ++#define ICH_FLASH_SEG_SIZE_8K 8192 ++#define ICH_FLASH_SEG_SIZE_64K 65536 ++#define ICH_FLASH_SECTOR_SIZE 4096 ++ ++#define ICH_FLASH_REG_MAPSIZE 0x00A0 ++ ++#define E1000_ICH_FWSM_RSPCIPHY 0x00000040 /* Reset PHY on PCI Reset */ ++#define E1000_ICH_FWSM_DISSW 0x10000000 /* FW Disables SW Writes */ ++/* FW established a valid mode */ ++#define E1000_ICH_FWSM_FW_VALID 0x00008000 ++ ++#define E1000_ICH_MNG_IAMT_MODE 0x2 ++ ++#define ID_LED_DEFAULT_ICH8LAN ((ID_LED_DEF1_DEF2 << 12) | \ ++ (ID_LED_DEF1_OFF2 << 8) | \ ++ (ID_LED_DEF1_ON2 << 4) | \ ++ (ID_LED_DEF1_DEF2)) ++ ++#define E1000_ICH_NVM_SIG_WORD 0x13 ++#define E1000_ICH_NVM_SIG_MASK 0xC000 ++ ++#define E1000_ICH8_LAN_INIT_TIMEOUT 1500 ++ ++#define E1000_FEXTNVM_SW_CONFIG 1 ++#define E1000_FEXTNVM_SW_CONFIG_ICH8M (1 << 27) /* Bit redefined for ICH8M :/ */ ++ ++#define PCIE_ICH8_SNOOP_ALL PCIE_NO_SNOOP_ALL ++ ++#define E1000_ICH_RAR_ENTRIES 7 ++ ++#define PHY_PAGE_SHIFT 5 ++#define PHY_REG(page, reg) (((page) << PHY_PAGE_SHIFT) | \ ++ ((reg) & MAX_PHY_REG_ADDRESS)) ++#define IGP3_KMRN_DIAG PHY_REG(770, 19) /* KMRN Diagnostic */ ++#define IGP3_VR_CTRL PHY_REG(776, 18) /* Voltage Regulator Control */ ++#define IGP3_CAPABILITY PHY_REG(776, 19) /* Capability */ ++#define IGP3_PM_CTRL PHY_REG(769, 20) /* Power Management Control */ ++ ++#define IGP3_KMRN_DIAG_PCS_LOCK_LOSS 0x0002 ++#define IGP3_VR_CTRL_DEV_POWERDOWN_MODE_MASK 0x0300 ++#define IGP3_VR_CTRL_MODE_SHUTDOWN 0x0200 ++#define IGP3_PM_CTRL_FORCE_PWR_DOWN 0x0020 ++ ++/* ++ * Additional interrupts need to be handled for ICH family: ++ * DSW = The FW changed the status of the DISSW bit in FWSM ++ * PHYINT = The LAN connected device generates an interrupt ++ * EPRST = Manageability reset event ++ */ ++#define IMS_ICH_ENABLE_MASK (\ ++ E1000_IMS_DSW | \ ++ E1000_IMS_PHYINT | \ ++ E1000_IMS_EPRST) ++ ++#endif +diff -r d03036c09699 drivers/net/e1000/e1000_mac.c +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/e1000/e1000_mac.c Mon Jun 15 11:43:11 2009 +0100 +@@ -0,0 +1,2157 @@ ++/******************************************************************************* ++ ++ Intel PRO/1000 Linux driver ++ Copyright(c) 1999 - 2008 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ Linux NICS ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++#include "e1000_api.h" ++ ++static s32 e1000_validate_mdi_setting_generic(struct e1000_hw *hw); ++static void e1000_set_lan_id_multi_port_pcie(struct e1000_hw *hw); ++ ++/** ++ * e1000_init_mac_ops_generic - Initialize MAC function pointers ++ * @hw: pointer to the HW structure ++ * ++ * Setups up the function pointers to no-op functions ++ **/ ++void e1000_init_mac_ops_generic(struct e1000_hw *hw) ++{ ++ struct e1000_mac_info *mac = &hw->mac; ++ DEBUGFUNC("e1000_init_mac_ops_generic"); ++ ++ /* General Setup */ ++ mac->ops.init_params = e1000_null_ops_generic; ++ mac->ops.init_hw = e1000_null_ops_generic; ++ mac->ops.reset_hw = e1000_null_ops_generic; ++ mac->ops.setup_physical_interface = e1000_null_ops_generic; ++ mac->ops.get_bus_info = e1000_null_ops_generic; ++ mac->ops.set_lan_id = e1000_set_lan_id_multi_port_pcie; ++ mac->ops.read_mac_addr = e1000_read_mac_addr_generic; ++ mac->ops.config_collision_dist = e1000_config_collision_dist_generic; ++ mac->ops.clear_hw_cntrs = e1000_null_mac_generic; ++ /* LED */ ++ mac->ops.cleanup_led = e1000_null_ops_generic; ++ mac->ops.setup_led = e1000_null_ops_generic; ++ mac->ops.blink_led = e1000_null_ops_generic; ++ mac->ops.led_on = e1000_null_ops_generic; ++ mac->ops.led_off = e1000_null_ops_generic; ++ /* LINK */ ++ mac->ops.setup_link = e1000_null_ops_generic; ++ mac->ops.get_link_up_info = e1000_null_link_info; ++ mac->ops.check_for_link = e1000_null_ops_generic; ++ mac->ops.wait_autoneg = e1000_wait_autoneg_generic; ++ /* Management */ ++ mac->ops.check_mng_mode = e1000_null_mng_mode; ++ mac->ops.mng_host_if_write = e1000_mng_host_if_write_generic; ++ mac->ops.mng_write_cmd_header = e1000_mng_write_cmd_header_generic; ++ mac->ops.mng_enable_host_if = e1000_mng_enable_host_if_generic; ++ /* VLAN, MC, etc. */ ++ mac->ops.update_mc_addr_list = e1000_null_update_mc; ++ mac->ops.clear_vfta = e1000_null_mac_generic; ++ mac->ops.write_vfta = e1000_null_write_vfta; ++ mac->ops.mta_set = e1000_null_mta_set; ++ mac->ops.rar_set = e1000_rar_set_generic; ++ mac->ops.validate_mdi_setting = e1000_validate_mdi_setting_generic; ++} ++ ++/** ++ * e1000_null_ops_generic - No-op function, returns 0 ++ * @hw: pointer to the HW structure ++ **/ ++s32 e1000_null_ops_generic(struct e1000_hw *hw) ++{ ++ DEBUGFUNC("e1000_null_ops_generic"); ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_null_mac_generic - No-op function, return void ++ * @hw: pointer to the HW structure ++ **/ ++void e1000_null_mac_generic(struct e1000_hw *hw) ++{ ++ DEBUGFUNC("e1000_null_mac_generic"); ++ return; ++} ++ ++/** ++ * e1000_null_link_info - No-op function, return 0 ++ * @hw: pointer to the HW structure ++ **/ ++s32 e1000_null_link_info(struct e1000_hw *hw, u16 *s, u16 *d) ++{ ++ DEBUGFUNC("e1000_null_link_info"); ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_null_mng_mode - No-op function, return false ++ * @hw: pointer to the HW structure ++ **/ ++bool e1000_null_mng_mode(struct e1000_hw *hw) ++{ ++ DEBUGFUNC("e1000_null_mng_mode"); ++ return false; ++} ++ ++/** ++ * e1000_null_update_mc - No-op function, return void ++ * @hw: pointer to the HW structure ++ **/ ++void e1000_null_update_mc(struct e1000_hw *hw, u8 *h, u32 a) ++{ ++ DEBUGFUNC("e1000_null_update_mc"); ++ return; ++} ++ ++/** ++ * e1000_null_write_vfta - No-op function, return void ++ * @hw: pointer to the HW structure ++ **/ ++void e1000_null_write_vfta(struct e1000_hw *hw, u32 a, u32 b) ++{ ++ DEBUGFUNC("e1000_null_write_vfta"); ++ return; ++} ++ ++/** ++ * e1000_null_set_mta - No-op function, return void ++ * @hw: pointer to the HW structure ++ **/ ++void e1000_null_mta_set(struct e1000_hw *hw, u32 a) ++{ ++ DEBUGFUNC("e1000_null_mta_set"); ++ return; ++} ++ ++/** ++ * e1000_null_rar_set - No-op function, return void ++ * @hw: pointer to the HW structure ++ **/ ++void e1000_null_rar_set(struct e1000_hw *hw, u8 *h, u32 a) ++{ ++ DEBUGFUNC("e1000_null_rar_set"); ++ return; ++} ++ ++/** ++ * e1000_get_bus_info_pci_generic - Get PCI(x) bus information ++ * @hw: pointer to the HW structure ++ * ++ * Determines and stores the system bus information for a particular ++ * network interface. The following bus information is determined and stored: ++ * bus speed, bus width, type (PCI/PCIx), and PCI(-x) function. ++ **/ ++s32 e1000_get_bus_info_pci_generic(struct e1000_hw *hw) ++{ ++ struct e1000_mac_info *mac = &hw->mac; ++ struct e1000_bus_info *bus = &hw->bus; ++ u32 status = E1000_READ_REG(hw, E1000_STATUS); ++ s32 ret_val = E1000_SUCCESS; ++ ++ DEBUGFUNC("e1000_get_bus_info_pci_generic"); ++ ++ /* PCI or PCI-X? */ ++ bus->type = (status & E1000_STATUS_PCIX_MODE) ++ ? e1000_bus_type_pcix ++ : e1000_bus_type_pci; ++ ++ /* Bus speed */ ++ if (bus->type == e1000_bus_type_pci) { ++ bus->speed = (status & E1000_STATUS_PCI66) ++ ? e1000_bus_speed_66 ++ : e1000_bus_speed_33; ++ } else { ++ switch (status & E1000_STATUS_PCIX_SPEED) { ++ case E1000_STATUS_PCIX_SPEED_66: ++ bus->speed = e1000_bus_speed_66; ++ break; ++ case E1000_STATUS_PCIX_SPEED_100: ++ bus->speed = e1000_bus_speed_100; ++ break; ++ case E1000_STATUS_PCIX_SPEED_133: ++ bus->speed = e1000_bus_speed_133; ++ break; ++ default: ++ bus->speed = e1000_bus_speed_reserved; ++ break; ++ } ++ } ++ ++ /* Bus width */ ++ bus->width = (status & E1000_STATUS_BUS64) ++ ? e1000_bus_width_64 ++ : e1000_bus_width_32; ++ ++ /* Which PCI(-X) function? */ ++ mac->ops.set_lan_id(hw); ++ ++ return ret_val; ++} ++ ++/** ++ * e1000_get_bus_info_pcie_generic - Get PCIe bus information ++ * @hw: pointer to the HW structure ++ * ++ * Determines and stores the system bus information for a particular ++ * network interface. The following bus information is determined and stored: ++ * bus speed, bus width, type (PCIe), and PCIe function. ++ **/ ++s32 e1000_get_bus_info_pcie_generic(struct e1000_hw *hw) ++{ ++ struct e1000_mac_info *mac = &hw->mac; ++ struct e1000_bus_info *bus = &hw->bus; ++ ++ s32 ret_val; ++ u16 pcie_link_status; ++ ++ DEBUGFUNC("e1000_get_bus_info_pcie_generic"); ++ ++ bus->type = e1000_bus_type_pci_express; ++ bus->speed = e1000_bus_speed_2500; ++ ++ ret_val = e1000_read_pcie_cap_reg(hw, ++ PCIE_LINK_STATUS, ++ &pcie_link_status); ++ if (ret_val) ++ bus->width = e1000_bus_width_unknown; ++ else ++ bus->width = (enum e1000_bus_width)((pcie_link_status & ++ PCIE_LINK_WIDTH_MASK) >> ++ PCIE_LINK_WIDTH_SHIFT); ++ ++ mac->ops.set_lan_id(hw); ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_set_lan_id_multi_port_pcie - Set LAN id for PCIe multiple port devices ++ * ++ * @hw: pointer to the HW structure ++ * ++ * Determines the LAN function id by reading memory-mapped registers ++ * and swaps the port value if requested. ++ **/ ++static void e1000_set_lan_id_multi_port_pcie(struct e1000_hw *hw) ++{ ++ struct e1000_bus_info *bus = &hw->bus; ++ u32 reg; ++ ++ /* ++ * The status register reports the correct function number ++ * for the device regardless of function swap state. ++ */ ++ reg = E1000_READ_REG(hw, E1000_STATUS); ++ bus->func = (reg & E1000_STATUS_FUNC_MASK) >> E1000_STATUS_FUNC_SHIFT; ++} ++ ++/** ++ * e1000_set_lan_id_multi_port_pci - Set LAN id for PCI multiple port devices ++ * @hw: pointer to the HW structure ++ * ++ * Determines the LAN function id by reading PCI config space. ++ **/ ++void e1000_set_lan_id_multi_port_pci(struct e1000_hw *hw) ++{ ++ struct e1000_bus_info *bus = &hw->bus; ++ u16 pci_header_type; ++ u32 status; ++ ++ e1000_read_pci_cfg(hw, PCI_HEADER_TYPE_REGISTER, &pci_header_type); ++ if (pci_header_type & PCI_HEADER_TYPE_MULTIFUNC) { ++ status = E1000_READ_REG(hw, E1000_STATUS); ++ bus->func = (status & E1000_STATUS_FUNC_MASK) ++ >> E1000_STATUS_FUNC_SHIFT; ++ } else { ++ bus->func = 0; ++ } ++} ++ ++/** ++ * e1000_set_lan_id_single_port - Set LAN id for a single port device ++ * @hw: pointer to the HW structure ++ * ++ * Sets the LAN function id to zero for a single port device. ++ **/ ++void e1000_set_lan_id_single_port(struct e1000_hw *hw) ++{ ++ struct e1000_bus_info *bus = &hw->bus; ++ ++ bus->func = 0; ++} ++ ++/** ++ * e1000_clear_vfta_generic - Clear VLAN filter table ++ * @hw: pointer to the HW structure ++ * ++ * Clears the register array which contains the VLAN filter table by ++ * setting all the values to 0. ++ **/ ++void e1000_clear_vfta_generic(struct e1000_hw *hw) ++{ ++ u32 offset; ++ ++ DEBUGFUNC("e1000_clear_vfta_generic"); ++ ++ for (offset = 0; offset < E1000_VLAN_FILTER_TBL_SIZE; offset++) { ++ E1000_WRITE_REG_ARRAY(hw, E1000_VFTA, offset, 0); ++ E1000_WRITE_FLUSH(hw); ++ } ++} ++ ++/** ++ * e1000_write_vfta_generic - Write value to VLAN filter table ++ * @hw: pointer to the HW structure ++ * @offset: register offset in VLAN filter table ++ * @value: register value written to VLAN filter table ++ * ++ * Writes value at the given offset in the register array which stores ++ * the VLAN filter table. ++ **/ ++void e1000_write_vfta_generic(struct e1000_hw *hw, u32 offset, u32 value) ++{ ++ DEBUGFUNC("e1000_write_vfta_generic"); ++ ++ E1000_WRITE_REG_ARRAY(hw, E1000_VFTA, offset, value); ++ E1000_WRITE_FLUSH(hw); ++} ++ ++/** ++ * e1000_init_rx_addrs_generic - Initialize receive address's ++ * @hw: pointer to the HW structure ++ * @rar_count: receive address registers ++ * ++ * Setups the receive address registers by setting the base receive address ++ * register to the devices MAC address and clearing all the other receive ++ * address registers to 0. ++ **/ ++void e1000_init_rx_addrs_generic(struct e1000_hw *hw, u16 rar_count) ++{ ++ u32 i; ++ u8 mac_addr[ETH_ADDR_LEN] = {0}; ++ ++ DEBUGFUNC("e1000_init_rx_addrs_generic"); ++ ++ /* Setup the receive address */ ++ DEBUGOUT("Programming MAC Address into RAR[0]\n"); ++ ++ hw->mac.ops.rar_set(hw, hw->mac.addr, 0); ++ ++ /* Zero out the other (rar_entry_count - 1) receive addresses */ ++ DEBUGOUT1("Clearing RAR[1-%u]\n", rar_count-1); ++ for (i = 1; i < rar_count; i++) ++ hw->mac.ops.rar_set(hw, mac_addr, i); ++} ++ ++/** ++ * e1000_check_alt_mac_addr_generic - Check for alternate MAC addr ++ * @hw: pointer to the HW structure ++ * ++ * Checks the nvm for an alternate MAC address. An alternate MAC address ++ * can be setup by pre-boot software and must be treated like a permanent ++ * address and must override the actual permanent MAC address. If an ++ * alternate MAC address is found it is programmed into RAR0, replacing ++ * the permanent address that was installed into RAR0 by the Si on reset. ++ * This function will return SUCCESS unless it encounters an error while ++ * reading the EEPROM. ++ **/ ++s32 e1000_check_alt_mac_addr_generic(struct e1000_hw *hw) ++{ ++ u32 i; ++ s32 ret_val = E1000_SUCCESS; ++ u16 offset, nvm_alt_mac_addr_offset, nvm_data; ++ u8 alt_mac_addr[ETH_ADDR_LEN]; ++ ++ DEBUGFUNC("e1000_check_alt_mac_addr_generic"); ++ ++ ret_val = hw->nvm.ops.read(hw, NVM_ALT_MAC_ADDR_PTR, 1, ++ &nvm_alt_mac_addr_offset); ++ if (ret_val) { ++ DEBUGOUT("NVM Read Error\n"); ++ goto out; ++ } ++ ++ if (nvm_alt_mac_addr_offset == 0xFFFF) { ++ /* There is no Alternate MAC Address */ ++ goto out; ++ } ++ ++ if (hw->bus.func == E1000_FUNC_1) ++ nvm_alt_mac_addr_offset += E1000_ALT_MAC_ADDRESS_OFFSET_LAN1; ++ for (i = 0; i < ETH_ADDR_LEN; i += 2) { ++ offset = nvm_alt_mac_addr_offset + (i >> 1); ++ ret_val = hw->nvm.ops.read(hw, offset, 1, &nvm_data); ++ if (ret_val) { ++ DEBUGOUT("NVM Read Error\n"); ++ goto out; ++ } ++ ++ alt_mac_addr[i] = (u8)(nvm_data & 0xFF); ++ alt_mac_addr[i + 1] = (u8)(nvm_data >> 8); ++ } ++ ++ /* if multicast bit is set, the alternate address will not be used */ ++ if (alt_mac_addr[0] & 0x01) { ++ DEBUGOUT("Ignoring Alternate Mac Address with MC bit set\n"); ++ goto out; ++ } ++ ++ /* ++ * We have a valid alternate MAC address, and we want to treat it the ++ * same as the normal permanent MAC address stored by the HW into the ++ * RAR. Do this by mapping this address into RAR0. ++ */ ++ hw->mac.ops.rar_set(hw, alt_mac_addr, 0); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_rar_set_generic - Set receive address register ++ * @hw: pointer to the HW structure ++ * @addr: pointer to the receive address ++ * @index: receive address array register ++ * ++ * Sets the receive address array register at index to the address passed ++ * in by addr. ++ **/ ++void e1000_rar_set_generic(struct e1000_hw *hw, u8 *addr, u32 index) ++{ ++ u32 rar_low, rar_high; ++ ++ DEBUGFUNC("e1000_rar_set_generic"); ++ ++ /* ++ * HW expects these in little endian so we reverse the byte order ++ * from network order (big endian) to little endian ++ */ ++ rar_low = ((u32) addr[0] | ++ ((u32) addr[1] << 8) | ++ ((u32) addr[2] << 16) | ((u32) addr[3] << 24)); ++ ++ rar_high = ((u32) addr[4] | ((u32) addr[5] << 8)); ++ ++ /* If MAC address zero, no need to set the AV bit */ ++ if (rar_low || rar_high) ++ rar_high |= E1000_RAH_AV; ++ ++ /* ++ * Some bridges will combine consecutive 32-bit writes into ++ * a single burst write, which will malfunction on some parts. ++ * The flushes avoid this. ++ */ ++ E1000_WRITE_REG(hw, E1000_RAL(index), rar_low); ++ E1000_WRITE_FLUSH(hw); ++ E1000_WRITE_REG(hw, E1000_RAH(index), rar_high); ++ E1000_WRITE_FLUSH(hw); ++} ++ ++/** ++ * e1000_mta_set_generic - Set multicast filter table address ++ * @hw: pointer to the HW structure ++ * @hash_value: determines the MTA register and bit to set ++ * ++ * The multicast table address is a register array of 32-bit registers. ++ * The hash_value is used to determine what register the bit is in, the ++ * current value is read, the new bit is OR'd in and the new value is ++ * written back into the register. ++ **/ ++void e1000_mta_set_generic(struct e1000_hw *hw, u32 hash_value) ++{ ++ u32 hash_bit, hash_reg, mta; ++ ++ DEBUGFUNC("e1000_mta_set_generic"); ++ /* ++ * The MTA is a register array of 32-bit registers. It is ++ * treated like an array of (32*mta_reg_count) bits. We want to ++ * set bit BitArray[hash_value]. So we figure out what register ++ * the bit is in, read it, OR in the new bit, then write ++ * back the new value. The (hw->mac.mta_reg_count - 1) serves as a ++ * mask to bits 31:5 of the hash value which gives us the ++ * register we're modifying. The hash bit within that register ++ * is determined by the lower 5 bits of the hash value. ++ */ ++ hash_reg = (hash_value >> 5) & (hw->mac.mta_reg_count - 1); ++ hash_bit = hash_value & 0x1F; ++ ++ mta = E1000_READ_REG_ARRAY(hw, E1000_MTA, hash_reg); ++ ++ mta |= (1 << hash_bit); ++ ++ E1000_WRITE_REG_ARRAY(hw, E1000_MTA, hash_reg, mta); ++ E1000_WRITE_FLUSH(hw); ++} ++ ++/** ++ * e1000_update_mc_addr_list_generic - Update Multicast addresses ++ * @hw: pointer to the HW structure ++ * @mc_addr_list: array of multicast addresses to program ++ * @mc_addr_count: number of multicast addresses to program ++ * ++ * Updates entire Multicast Table Array. ++ * The caller must have a packed mc_addr_list of multicast addresses. ++ **/ ++void e1000_update_mc_addr_list_generic(struct e1000_hw *hw, ++ u8 *mc_addr_list, u32 mc_addr_count) ++{ ++ u32 hash_value, hash_bit, hash_reg; ++ int i; ++ ++ DEBUGFUNC("e1000_update_mc_addr_list_generic"); ++ ++ /* clear mta_shadow */ ++ memset(&hw->mac.mta_shadow, 0, sizeof(hw->mac.mta_shadow)); ++ ++ /* update mta_shadow from mc_addr_list */ ++ for (i = 0; (u32) i < mc_addr_count; i++) { ++ hash_value = e1000_hash_mc_addr_generic(hw, mc_addr_list); ++ ++ hash_reg = (hash_value >> 5) & (hw->mac.mta_reg_count - 1); ++ hash_bit = hash_value & 0x1F; ++ ++ hw->mac.mta_shadow[hash_reg] |= (1 << hash_bit); ++ mc_addr_list += (ETH_ADDR_LEN); ++ } ++ ++ /* replace the entire MTA table */ ++ for (i = hw->mac.mta_reg_count - 1; i >= 0; i--) ++ E1000_WRITE_REG_ARRAY(hw, E1000_MTA, i, hw->mac.mta_shadow[i]); ++ E1000_WRITE_FLUSH(hw); ++} ++ ++/** ++ * e1000_hash_mc_addr_generic - Generate a multicast hash value ++ * @hw: pointer to the HW structure ++ * @mc_addr: pointer to a multicast address ++ * ++ * Generates a multicast address hash value which is used to determine ++ * the multicast filter table array address and new table value. See ++ * e1000_mta_set_generic() ++ **/ ++u32 e1000_hash_mc_addr_generic(struct e1000_hw *hw, u8 *mc_addr) ++{ ++ u32 hash_value, hash_mask; ++ u8 bit_shift = 0; ++ ++ DEBUGFUNC("e1000_hash_mc_addr_generic"); ++ ++ /* Register count multiplied by bits per register */ ++ hash_mask = (hw->mac.mta_reg_count * 32) - 1; ++ ++ /* ++ * For a mc_filter_type of 0, bit_shift is the number of left-shifts ++ * where 0xFF would still fall within the hash mask. ++ */ ++ while (hash_mask >> bit_shift != 0xFF) ++ bit_shift++; ++ ++ /* ++ * The portion of the address that is used for the hash table ++ * is determined by the mc_filter_type setting. ++ * The algorithm is such that there is a total of 8 bits of shifting. ++ * The bit_shift for a mc_filter_type of 0 represents the number of ++ * left-shifts where the MSB of mc_addr[5] would still fall within ++ * the hash_mask. Case 0 does this exactly. Since there are a total ++ * of 8 bits of shifting, then mc_addr[4] will shift right the ++ * remaining number of bits. Thus 8 - bit_shift. The rest of the ++ * cases are a variation of this algorithm...essentially raising the ++ * number of bits to shift mc_addr[5] left, while still keeping the ++ * 8-bit shifting total. ++ * ++ * For example, given the following Destination MAC Address and an ++ * mta register count of 128 (thus a 4096-bit vector and 0xFFF mask), ++ * we can see that the bit_shift for case 0 is 4. These are the hash ++ * values resulting from each mc_filter_type... ++ * [0] [1] [2] [3] [4] [5] ++ * 01 AA 00 12 34 56 ++ * LSB MSB ++ * ++ * case 0: hash_value = ((0x34 >> 4) | (0x56 << 4)) & 0xFFF = 0x563 ++ * case 1: hash_value = ((0x34 >> 3) | (0x56 << 5)) & 0xFFF = 0xAC6 ++ * case 2: hash_value = ((0x34 >> 2) | (0x56 << 6)) & 0xFFF = 0x163 ++ * case 3: hash_value = ((0x34 >> 0) | (0x56 << 8)) & 0xFFF = 0x634 ++ */ ++ switch (hw->mac.mc_filter_type) { ++ default: ++ case 0: ++ break; ++ case 1: ++ bit_shift += 1; ++ break; ++ case 2: ++ bit_shift += 2; ++ break; ++ case 3: ++ bit_shift += 4; ++ break; ++ } ++ ++ hash_value = hash_mask & (((mc_addr[4] >> (8 - bit_shift)) | ++ (((u16) mc_addr[5]) << bit_shift))); ++ ++ return hash_value; ++} ++ ++/** ++ * e1000_pcix_mmrbc_workaround_generic - Fix incorrect MMRBC value ++ * @hw: pointer to the HW structure ++ * ++ * In certain situations, a system BIOS may report that the PCIx maximum ++ * memory read byte count (MMRBC) value is higher than than the actual ++ * value. We check the PCIx command register with the current PCIx status ++ * register. ++ **/ ++void e1000_pcix_mmrbc_workaround_generic(struct e1000_hw *hw) ++{ ++ u16 cmd_mmrbc; ++ u16 pcix_cmd; ++ u16 pcix_stat_hi_word; ++ u16 stat_mmrbc; ++ ++ DEBUGFUNC("e1000_pcix_mmrbc_workaround_generic"); ++ ++ /* Workaround for PCI-X issue when BIOS sets MMRBC incorrectly */ ++ if (hw->bus.type != e1000_bus_type_pcix) ++ return; ++ ++ e1000_read_pci_cfg(hw, PCIX_COMMAND_REGISTER, &pcix_cmd); ++ e1000_read_pci_cfg(hw, PCIX_STATUS_REGISTER_HI, &pcix_stat_hi_word); ++ cmd_mmrbc = (pcix_cmd & PCIX_COMMAND_MMRBC_MASK) >> ++ PCIX_COMMAND_MMRBC_SHIFT; ++ stat_mmrbc = (pcix_stat_hi_word & PCIX_STATUS_HI_MMRBC_MASK) >> ++ PCIX_STATUS_HI_MMRBC_SHIFT; ++ if (stat_mmrbc == PCIX_STATUS_HI_MMRBC_4K) ++ stat_mmrbc = PCIX_STATUS_HI_MMRBC_2K; ++ if (cmd_mmrbc > stat_mmrbc) { ++ pcix_cmd &= ~PCIX_COMMAND_MMRBC_MASK; ++ pcix_cmd |= stat_mmrbc << PCIX_COMMAND_MMRBC_SHIFT; ++ e1000_write_pci_cfg(hw, PCIX_COMMAND_REGISTER, &pcix_cmd); ++ } ++} ++ ++/** ++ * e1000_clear_hw_cntrs_base_generic - Clear base hardware counters ++ * @hw: pointer to the HW structure ++ * ++ * Clears the base hardware counters by reading the counter registers. ++ **/ ++void e1000_clear_hw_cntrs_base_generic(struct e1000_hw *hw) ++{ ++ DEBUGFUNC("e1000_clear_hw_cntrs_base_generic"); ++ ++ E1000_READ_REG(hw, E1000_CRCERRS); ++ E1000_READ_REG(hw, E1000_SYMERRS); ++ E1000_READ_REG(hw, E1000_MPC); ++ E1000_READ_REG(hw, E1000_SCC); ++ E1000_READ_REG(hw, E1000_ECOL); ++ E1000_READ_REG(hw, E1000_MCC); ++ E1000_READ_REG(hw, E1000_LATECOL); ++ E1000_READ_REG(hw, E1000_COLC); ++ E1000_READ_REG(hw, E1000_DC); ++ E1000_READ_REG(hw, E1000_SEC); ++ E1000_READ_REG(hw, E1000_RLEC); ++ E1000_READ_REG(hw, E1000_XONRXC); ++ E1000_READ_REG(hw, E1000_XONTXC); ++ E1000_READ_REG(hw, E1000_XOFFRXC); ++ E1000_READ_REG(hw, E1000_XOFFTXC); ++ E1000_READ_REG(hw, E1000_FCRUC); ++ E1000_READ_REG(hw, E1000_GPRC); ++ E1000_READ_REG(hw, E1000_BPRC); ++ E1000_READ_REG(hw, E1000_MPRC); ++ E1000_READ_REG(hw, E1000_GPTC); ++ E1000_READ_REG(hw, E1000_GORCL); ++ E1000_READ_REG(hw, E1000_GORCH); ++ E1000_READ_REG(hw, E1000_GOTCL); ++ E1000_READ_REG(hw, E1000_GOTCH); ++ E1000_READ_REG(hw, E1000_RNBC); ++ E1000_READ_REG(hw, E1000_RUC); ++ E1000_READ_REG(hw, E1000_RFC); ++ E1000_READ_REG(hw, E1000_ROC); ++ E1000_READ_REG(hw, E1000_RJC); ++ E1000_READ_REG(hw, E1000_TORL); ++ E1000_READ_REG(hw, E1000_TORH); ++ E1000_READ_REG(hw, E1000_TOTL); ++ E1000_READ_REG(hw, E1000_TOTH); ++ E1000_READ_REG(hw, E1000_TPR); ++ E1000_READ_REG(hw, E1000_TPT); ++ E1000_READ_REG(hw, E1000_MPTC); ++ E1000_READ_REG(hw, E1000_BPTC); ++} ++ ++/** ++ * e1000_check_for_copper_link_generic - Check for link (Copper) ++ * @hw: pointer to the HW structure ++ * ++ * Checks to see of the link status of the hardware has changed. If a ++ * change in link status has been detected, then we read the PHY registers ++ * to get the current speed/duplex if link exists. ++ **/ ++s32 e1000_check_for_copper_link_generic(struct e1000_hw *hw) ++{ ++ struct e1000_mac_info *mac = &hw->mac; ++ s32 ret_val; ++ bool link; ++ ++ DEBUGFUNC("e1000_check_for_copper_link"); ++ ++ /* ++ * We only want to go out to the PHY registers to see if Auto-Neg ++ * has completed and/or if our link status has changed. The ++ * get_link_status flag is set upon receiving a Link Status ++ * Change or Rx Sequence Error interrupt. ++ */ ++ if (!mac->get_link_status) { ++ ret_val = E1000_SUCCESS; ++ goto out; ++ } ++ ++ /* ++ * First we want to see if the MII Status Register reports ++ * link. If so, then we want to get the current speed/duplex ++ * of the PHY. ++ */ ++ ret_val = e1000_phy_has_link_generic(hw, 1, 0, &link); ++ if (ret_val) ++ goto out; ++ ++ if (!link) ++ goto out; /* No link detected */ ++ ++ mac->get_link_status = false; ++ ++ /* ++ * Check if there was DownShift, must be checked ++ * immediately after link-up ++ */ ++ e1000_check_downshift_generic(hw); ++ ++ /* ++ * If we are forcing speed/duplex, then we simply return since ++ * we have already determined whether we have link or not. ++ */ ++ if (!mac->autoneg) { ++ ret_val = -E1000_ERR_CONFIG; ++ goto out; ++ } ++ ++ /* ++ * Auto-Neg is enabled. Auto Speed Detection takes care ++ * of MAC speed/duplex configuration. So we only need to ++ * configure Collision Distance in the MAC. ++ */ ++ e1000_config_collision_dist_generic(hw); ++ ++ /* ++ * Configure Flow Control now that Auto-Neg has completed. ++ * First, we need to restore the desired flow control ++ * settings because we may have had to re-autoneg with a ++ * different link partner. ++ */ ++ ret_val = e1000_config_fc_after_link_up_generic(hw); ++ if (ret_val) ++ DEBUGOUT("Error configuring flow control\n"); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_check_for_fiber_link_generic - Check for link (Fiber) ++ * @hw: pointer to the HW structure ++ * ++ * Checks for link up on the hardware. If link is not up and we have ++ * a signal, then we need to force link up. ++ **/ ++s32 e1000_check_for_fiber_link_generic(struct e1000_hw *hw) ++{ ++ struct e1000_mac_info *mac = &hw->mac; ++ u32 rxcw; ++ u32 ctrl; ++ u32 status; ++ s32 ret_val = E1000_SUCCESS; ++ ++ DEBUGFUNC("e1000_check_for_fiber_link_generic"); ++ ++ ctrl = E1000_READ_REG(hw, E1000_CTRL); ++ status = E1000_READ_REG(hw, E1000_STATUS); ++ rxcw = E1000_READ_REG(hw, E1000_RXCW); ++ ++ /* ++ * If we don't have link (auto-negotiation failed or link partner ++ * cannot auto-negotiate), the cable is plugged in (we have signal), ++ * and our link partner is not trying to auto-negotiate with us (we ++ * are receiving idles or data), we need to force link up. We also ++ * need to give auto-negotiation time to complete, in case the cable ++ * was just plugged in. The autoneg_failed flag does this. ++ */ ++ /* (ctrl & E1000_CTRL_SWDPIN1) == 1 == have signal */ ++ if ((ctrl & E1000_CTRL_SWDPIN1) && (!(status & E1000_STATUS_LU)) && ++ (!(rxcw & E1000_RXCW_C))) { ++ if (mac->autoneg_failed == 0) { ++ mac->autoneg_failed = 1; ++ goto out; ++ } ++ DEBUGOUT("NOT RXing /C/, disable AutoNeg and force link.\n"); ++ ++ /* Disable auto-negotiation in the TXCW register */ ++ E1000_WRITE_REG(hw, E1000_TXCW, (mac->txcw & ~E1000_TXCW_ANE)); ++ ++ /* Force link-up and also force full-duplex. */ ++ ctrl = E1000_READ_REG(hw, E1000_CTRL); ++ ctrl |= (E1000_CTRL_SLU | E1000_CTRL_FD); ++ E1000_WRITE_REG(hw, E1000_CTRL, ctrl); ++ ++ /* Configure Flow Control after forcing link up. */ ++ ret_val = e1000_config_fc_after_link_up_generic(hw); ++ if (ret_val) { ++ DEBUGOUT("Error configuring flow control\n"); ++ goto out; ++ } ++ } else if ((ctrl & E1000_CTRL_SLU) && (rxcw & E1000_RXCW_C)) { ++ /* ++ * If we are forcing link and we are receiving /C/ ordered ++ * sets, re-enable auto-negotiation in the TXCW register ++ * and disable forced link in the Device Control register ++ * in an attempt to auto-negotiate with our link partner. ++ */ ++ DEBUGOUT("RXing /C/, enable AutoNeg and stop forcing link.\n"); ++ E1000_WRITE_REG(hw, E1000_TXCW, mac->txcw); ++ E1000_WRITE_REG(hw, E1000_CTRL, (ctrl & ~E1000_CTRL_SLU)); ++ ++ mac->serdes_has_link = true; ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_check_for_serdes_link_generic - Check for link (Serdes) ++ * @hw: pointer to the HW structure ++ * ++ * Checks for link up on the hardware. If link is not up and we have ++ * a signal, then we need to force link up. ++ **/ ++s32 e1000_check_for_serdes_link_generic(struct e1000_hw *hw) ++{ ++ struct e1000_mac_info *mac = &hw->mac; ++ u32 rxcw; ++ u32 ctrl; ++ u32 status; ++ s32 ret_val = E1000_SUCCESS; ++ ++ DEBUGFUNC("e1000_check_for_serdes_link_generic"); ++ ++ ctrl = E1000_READ_REG(hw, E1000_CTRL); ++ status = E1000_READ_REG(hw, E1000_STATUS); ++ rxcw = E1000_READ_REG(hw, E1000_RXCW); ++ ++ /* ++ * If we don't have link (auto-negotiation failed or link partner ++ * cannot auto-negotiate), and our link partner is not trying to ++ * auto-negotiate with us (we are receiving idles or data), ++ * we need to force link up. We also need to give auto-negotiation ++ * time to complete. ++ */ ++ /* (ctrl & E1000_CTRL_SWDPIN1) == 1 == have signal */ ++ if ((!(status & E1000_STATUS_LU)) && (!(rxcw & E1000_RXCW_C))) { ++ if (mac->autoneg_failed == 0) { ++ mac->autoneg_failed = 1; ++ goto out; ++ } ++ DEBUGOUT("NOT RXing /C/, disable AutoNeg and force link.\n"); ++ ++ /* Disable auto-negotiation in the TXCW register */ ++ E1000_WRITE_REG(hw, E1000_TXCW, (mac->txcw & ~E1000_TXCW_ANE)); ++ ++ /* Force link-up and also force full-duplex. */ ++ ctrl = E1000_READ_REG(hw, E1000_CTRL); ++ ctrl |= (E1000_CTRL_SLU | E1000_CTRL_FD); ++ E1000_WRITE_REG(hw, E1000_CTRL, ctrl); ++ ++ /* Configure Flow Control after forcing link up. */ ++ ret_val = e1000_config_fc_after_link_up_generic(hw); ++ if (ret_val) { ++ DEBUGOUT("Error configuring flow control\n"); ++ goto out; ++ } ++ } else if ((ctrl & E1000_CTRL_SLU) && (rxcw & E1000_RXCW_C)) { ++ /* ++ * If we are forcing link and we are receiving /C/ ordered ++ * sets, re-enable auto-negotiation in the TXCW register ++ * and disable forced link in the Device Control register ++ * in an attempt to auto-negotiate with our link partner. ++ */ ++ DEBUGOUT("RXing /C/, enable AutoNeg and stop forcing link.\n"); ++ E1000_WRITE_REG(hw, E1000_TXCW, mac->txcw); ++ E1000_WRITE_REG(hw, E1000_CTRL, (ctrl & ~E1000_CTRL_SLU)); ++ ++ mac->serdes_has_link = true; ++ } else if (!(E1000_TXCW_ANE & E1000_READ_REG(hw, E1000_TXCW))) { ++ /* ++ * If we force link for non-auto-negotiation switch, check ++ * link status based on MAC synchronization for internal ++ * serdes media type. ++ */ ++ /* SYNCH bit and IV bit are sticky. */ ++ usec_delay(10); ++ rxcw = E1000_READ_REG(hw, E1000_RXCW); ++ if (rxcw & E1000_RXCW_SYNCH) { ++ if (!(rxcw & E1000_RXCW_IV)) { ++ mac->serdes_has_link = true; ++ DEBUGOUT("SERDES: Link up - forced.\n"); ++ } ++ } else { ++ mac->serdes_has_link = false; ++ DEBUGOUT("SERDES: Link down - force failed.\n"); ++ } ++ } ++ ++ if (E1000_TXCW_ANE & E1000_READ_REG(hw, E1000_TXCW)) { ++ status = E1000_READ_REG(hw, E1000_STATUS); ++ if (status & E1000_STATUS_LU) { ++ /* SYNCH bit and IV bit are sticky, so reread rxcw. */ ++ usec_delay(10); ++ rxcw = E1000_READ_REG(hw, E1000_RXCW); ++ if (rxcw & E1000_RXCW_SYNCH) { ++ if (!(rxcw & E1000_RXCW_IV)) { ++ mac->serdes_has_link = true; ++ DEBUGOUT("SERDES: Link up - autoneg " ++ "completed sucessfully.\n"); ++ } else { ++ mac->serdes_has_link = false; ++ DEBUGOUT("SERDES: Link down - invalid" ++ "codewords detected in autoneg.\n"); ++ } ++ } else { ++ mac->serdes_has_link = false; ++ DEBUGOUT("SERDES: Link down - no sync.\n"); ++ } ++ } else { ++ mac->serdes_has_link = false; ++ DEBUGOUT("SERDES: Link down - autoneg failed\n"); ++ } ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_setup_link_generic - Setup flow control and link settings ++ * @hw: pointer to the HW structure ++ * ++ * Determines which flow control settings to use, then configures flow ++ * control. Calls the appropriate media-specific link configuration ++ * function. Assuming the adapter has a valid link partner, a valid link ++ * should be established. Assumes the hardware has previously been reset ++ * and the transmitter and receiver are not enabled. ++ **/ ++s32 e1000_setup_link_generic(struct e1000_hw *hw) ++{ ++ s32 ret_val = E1000_SUCCESS; ++ ++ DEBUGFUNC("e1000_setup_link_generic"); ++ ++ /* ++ * In the case of the phy reset being blocked, we already have a link. ++ * We do not need to set it up again. ++ */ ++ if (hw->phy.ops.check_reset_block) ++ if (hw->phy.ops.check_reset_block(hw)) ++ goto out; ++ ++ /* ++ * If requested flow control is set to default, set flow control ++ * based on the EEPROM flow control settings. ++ */ ++ if (hw->fc.requested_mode == e1000_fc_default) { ++ ret_val = e1000_set_default_fc_generic(hw); ++ if (ret_val) ++ goto out; ++ } ++ ++ /* ++ * Save off the requested flow control mode for use later. Depending ++ * on the link partner's capabilities, we may or may not use this mode. ++ */ ++ hw->fc.current_mode = hw->fc.requested_mode; ++ ++ DEBUGOUT1("After fix-ups FlowControl is now = %x\n", ++ hw->fc.current_mode); ++ ++ /* Call the necessary media_type subroutine to configure the link. */ ++ ret_val = hw->mac.ops.setup_physical_interface(hw); ++ if (ret_val) ++ goto out; ++ ++ /* ++ * Initialize the flow control address, type, and PAUSE timer ++ * registers to their default values. This is done even if flow ++ * control is disabled, because it does not hurt anything to ++ * initialize these registers. ++ */ ++ DEBUGOUT("Initializing the Flow Control address, type and timer regs\n"); ++ E1000_WRITE_REG(hw, E1000_FCT, FLOW_CONTROL_TYPE); ++ E1000_WRITE_REG(hw, E1000_FCAH, FLOW_CONTROL_ADDRESS_HIGH); ++ E1000_WRITE_REG(hw, E1000_FCAL, FLOW_CONTROL_ADDRESS_LOW); ++ ++ E1000_WRITE_REG(hw, E1000_FCTTV, hw->fc.pause_time); ++ ++ ret_val = e1000_set_fc_watermarks_generic(hw); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_setup_fiber_serdes_link_generic - Setup link for fiber/serdes ++ * @hw: pointer to the HW structure ++ * ++ * Configures collision distance and flow control for fiber and serdes ++ * links. Upon successful setup, poll for link. ++ **/ ++s32 e1000_setup_fiber_serdes_link_generic(struct e1000_hw *hw) ++{ ++ u32 ctrl; ++ s32 ret_val = E1000_SUCCESS; ++ ++ DEBUGFUNC("e1000_setup_fiber_serdes_link_generic"); ++ ++ ctrl = E1000_READ_REG(hw, E1000_CTRL); ++ ++ /* Take the link out of reset */ ++ ctrl &= ~E1000_CTRL_LRST; ++ ++ e1000_config_collision_dist_generic(hw); ++ ++ ret_val = e1000_commit_fc_settings_generic(hw); ++ if (ret_val) ++ goto out; ++ ++ /* ++ * Since auto-negotiation is enabled, take the link out of reset (the ++ * link will be in reset, because we previously reset the chip). This ++ * will restart auto-negotiation. If auto-negotiation is successful ++ * then the link-up status bit will be set and the flow control enable ++ * bits (RFCE and TFCE) will be set according to their negotiated value. ++ */ ++ DEBUGOUT("Auto-negotiation enabled\n"); ++ ++ E1000_WRITE_REG(hw, E1000_CTRL, ctrl); ++ E1000_WRITE_FLUSH(hw); ++ msec_delay(1); ++ ++ /* ++ * For these adapters, the SW definable pin 1 is set when the optics ++ * detect a signal. If we have a signal, then poll for a "Link-Up" ++ * indication. ++ */ ++ if (hw->phy.media_type == e1000_media_type_internal_serdes || ++ (E1000_READ_REG(hw, E1000_CTRL) & E1000_CTRL_SWDPIN1)) { ++ ret_val = e1000_poll_fiber_serdes_link_generic(hw); ++ } else { ++ DEBUGOUT("No signal detected\n"); ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_config_collision_dist_generic - Configure collision distance ++ * @hw: pointer to the HW structure ++ * ++ * Configures the collision distance to the default value and is used ++ * during link setup. Currently no func pointer exists and all ++ * implementations are handled in the generic version of this function. ++ **/ ++void e1000_config_collision_dist_generic(struct e1000_hw *hw) ++{ ++ u32 tctl; ++ ++ DEBUGFUNC("e1000_config_collision_dist_generic"); ++ ++ tctl = E1000_READ_REG(hw, E1000_TCTL); ++ ++ tctl &= ~E1000_TCTL_COLD; ++ tctl |= E1000_COLLISION_DISTANCE << E1000_COLD_SHIFT; ++ ++ E1000_WRITE_REG(hw, E1000_TCTL, tctl); ++ E1000_WRITE_FLUSH(hw); ++} ++ ++/** ++ * e1000_poll_fiber_serdes_link_generic - Poll for link up ++ * @hw: pointer to the HW structure ++ * ++ * Polls for link up by reading the status register, if link fails to come ++ * up with auto-negotiation, then the link is forced if a signal is detected. ++ **/ ++s32 e1000_poll_fiber_serdes_link_generic(struct e1000_hw *hw) ++{ ++ struct e1000_mac_info *mac = &hw->mac; ++ u32 i, status; ++ s32 ret_val = E1000_SUCCESS; ++ ++ DEBUGFUNC("e1000_poll_fiber_serdes_link_generic"); ++ ++ /* ++ * If we have a signal (the cable is plugged in, or assumed true for ++ * serdes media) then poll for a "Link-Up" indication in the Device ++ * Status Register. Time-out if a link isn't seen in 500 milliseconds ++ * seconds (Auto-negotiation should complete in less than 500 ++ * milliseconds even if the other end is doing it in SW). ++ */ ++ for (i = 0; i < FIBER_LINK_UP_LIMIT; i++) { ++ msec_delay(10); ++ status = E1000_READ_REG(hw, E1000_STATUS); ++ if (status & E1000_STATUS_LU) ++ break; ++ } ++ if (i == FIBER_LINK_UP_LIMIT) { ++ DEBUGOUT("Never got a valid link from auto-neg!!!\n"); ++ mac->autoneg_failed = 1; ++ /* ++ * AutoNeg failed to achieve a link, so we'll call ++ * mac->check_for_link. This routine will force the ++ * link up if we detect a signal. This will allow us to ++ * communicate with non-autonegotiating link partners. ++ */ ++ ret_val = hw->mac.ops.check_for_link(hw); ++ if (ret_val) { ++ DEBUGOUT("Error while checking for link\n"); ++ goto out; ++ } ++ mac->autoneg_failed = 0; ++ } else { ++ mac->autoneg_failed = 0; ++ DEBUGOUT("Valid Link Found\n"); ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_commit_fc_settings_generic - Configure flow control ++ * @hw: pointer to the HW structure ++ * ++ * Write the flow control settings to the Transmit Config Word Register (TXCW) ++ * base on the flow control settings in e1000_mac_info. ++ **/ ++s32 e1000_commit_fc_settings_generic(struct e1000_hw *hw) ++{ ++ struct e1000_mac_info *mac = &hw->mac; ++ u32 txcw; ++ s32 ret_val = E1000_SUCCESS; ++ ++ DEBUGFUNC("e1000_commit_fc_settings_generic"); ++ ++ /* ++ * Check for a software override of the flow control settings, and ++ * setup the device accordingly. If auto-negotiation is enabled, then ++ * software will have to set the "PAUSE" bits to the correct value in ++ * the Transmit Config Word Register (TXCW) and re-start auto- ++ * negotiation. However, if auto-negotiation is disabled, then ++ * software will have to manually configure the two flow control enable ++ * bits in the CTRL register. ++ * ++ * The possible values of the "fc" parameter are: ++ * 0: Flow control is completely disabled ++ * 1: Rx flow control is enabled (we can receive pause frames, ++ * but not send pause frames). ++ * 2: Tx flow control is enabled (we can send pause frames but we ++ * do not support receiving pause frames). ++ * 3: Both Rx and Tx flow control (symmetric) are enabled. ++ */ ++ switch (hw->fc.current_mode) { ++ case e1000_fc_none: ++ /* Flow control completely disabled by a software over-ride. */ ++ txcw = (E1000_TXCW_ANE | E1000_TXCW_FD); ++ break; ++ case e1000_fc_rx_pause: ++ /* ++ * Rx Flow control is enabled and Tx Flow control is disabled ++ * by a software over-ride. Since there really isn't a way to ++ * advertise that we are capable of Rx Pause ONLY, we will ++ * advertise that we support both symmetric and asymmetric RX ++ * PAUSE. Later, we will disable the adapter's ability to send ++ * PAUSE frames. ++ */ ++ txcw = (E1000_TXCW_ANE | E1000_TXCW_FD | E1000_TXCW_PAUSE_MASK); ++ break; ++ case e1000_fc_tx_pause: ++ /* ++ * Tx Flow control is enabled, and Rx Flow control is disabled, ++ * by a software over-ride. ++ */ ++ txcw = (E1000_TXCW_ANE | E1000_TXCW_FD | E1000_TXCW_ASM_DIR); ++ break; ++ case e1000_fc_full: ++ /* ++ * Flow control (both Rx and Tx) is enabled by a software ++ * over-ride. ++ */ ++ txcw = (E1000_TXCW_ANE | E1000_TXCW_FD | E1000_TXCW_PAUSE_MASK); ++ break; ++ default: ++ DEBUGOUT("Flow control param set incorrectly\n"); ++ ret_val = -E1000_ERR_CONFIG; ++ goto out; ++ break; ++ } ++ ++ E1000_WRITE_REG(hw, E1000_TXCW, txcw); ++ mac->txcw = txcw; ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_set_fc_watermarks_generic - Set flow control high/low watermarks ++ * @hw: pointer to the HW structure ++ * ++ * Sets the flow control high/low threshold (watermark) registers. If ++ * flow control XON frame transmission is enabled, then set XON frame ++ * transmission as well. ++ **/ ++s32 e1000_set_fc_watermarks_generic(struct e1000_hw *hw) ++{ ++ s32 ret_val = E1000_SUCCESS; ++ u32 fcrtl = 0, fcrth = 0; ++ ++ DEBUGFUNC("e1000_set_fc_watermarks_generic"); ++ ++ /* ++ * Set the flow control receive threshold registers. Normally, ++ * these registers will be set to a default threshold that may be ++ * adjusted later by the driver's runtime code. However, if the ++ * ability to transmit pause frames is not enabled, then these ++ * registers will be set to 0. ++ */ ++ if (hw->fc.current_mode & e1000_fc_tx_pause) { ++ /* ++ * We need to set up the Receive Threshold high and low water ++ * marks as well as (optionally) enabling the transmission of ++ * XON frames. ++ */ ++ fcrtl = hw->fc.low_water; ++ if (hw->fc.send_xon) ++ fcrtl |= E1000_FCRTL_XONE; ++ ++ fcrth = hw->fc.high_water; ++ } ++ E1000_WRITE_REG(hw, E1000_FCRTL, fcrtl); ++ E1000_WRITE_REG(hw, E1000_FCRTH, fcrth); ++ ++ return ret_val; ++} ++ ++/** ++ * e1000_set_default_fc_generic - Set flow control default values ++ * @hw: pointer to the HW structure ++ * ++ * Read the EEPROM for the default values for flow control and store the ++ * values. ++ **/ ++s32 e1000_set_default_fc_generic(struct e1000_hw *hw) ++{ ++ s32 ret_val = E1000_SUCCESS; ++ u16 nvm_data; ++ ++ DEBUGFUNC("e1000_set_default_fc_generic"); ++ ++ /* ++ * Read and store word 0x0F of the EEPROM. This word contains bits ++ * that determine the hardware's default PAUSE (flow control) mode, ++ * a bit that determines whether the HW defaults to enabling or ++ * disabling auto-negotiation, and the direction of the ++ * SW defined pins. If there is no SW over-ride of the flow ++ * control setting, then the variable hw->fc will ++ * be initialized based on a value in the EEPROM. ++ */ ++ ret_val = hw->nvm.ops.read(hw, NVM_INIT_CONTROL2_REG, 1, &nvm_data); ++ ++ if (ret_val) { ++ DEBUGOUT("NVM Read Error\n"); ++ goto out; ++ } ++ ++ if ((nvm_data & NVM_WORD0F_PAUSE_MASK) == 0) ++ hw->fc.requested_mode = e1000_fc_none; ++ else if ((nvm_data & NVM_WORD0F_PAUSE_MASK) == ++ NVM_WORD0F_ASM_DIR) ++ hw->fc.requested_mode = e1000_fc_tx_pause; ++ else ++ hw->fc.requested_mode = e1000_fc_full; ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_force_mac_fc_generic - Force the MAC's flow control settings ++ * @hw: pointer to the HW structure ++ * ++ * Force the MAC's flow control settings. Sets the TFCE and RFCE bits in the ++ * device control register to reflect the adapter settings. TFCE and RFCE ++ * need to be explicitly set by software when a copper PHY is used because ++ * autonegotiation is managed by the PHY rather than the MAC. Software must ++ * also configure these bits when link is forced on a fiber connection. ++ **/ ++s32 e1000_force_mac_fc_generic(struct e1000_hw *hw) ++{ ++ u32 ctrl; ++ s32 ret_val = E1000_SUCCESS; ++ ++ DEBUGFUNC("e1000_force_mac_fc_generic"); ++ ++ ctrl = E1000_READ_REG(hw, E1000_CTRL); ++ ++ /* ++ * Because we didn't get link via the internal auto-negotiation ++ * mechanism (we either forced link or we got link via PHY ++ * auto-neg), we have to manually enable/disable transmit an ++ * receive flow control. ++ * ++ * The "Case" statement below enables/disable flow control ++ * according to the "hw->fc.current_mode" parameter. ++ * ++ * The possible values of the "fc" parameter are: ++ * 0: Flow control is completely disabled ++ * 1: Rx flow control is enabled (we can receive pause ++ * frames but not send pause frames). ++ * 2: Tx flow control is enabled (we can send pause frames ++ * frames but we do not receive pause frames). ++ * 3: Both Rx and Tx flow control (symmetric) is enabled. ++ * other: No other values should be possible at this point. ++ */ ++ DEBUGOUT1("hw->fc.current_mode = %u\n", hw->fc.current_mode); ++ ++ switch (hw->fc.current_mode) { ++ case e1000_fc_none: ++ ctrl &= (~(E1000_CTRL_TFCE | E1000_CTRL_RFCE)); ++ break; ++ case e1000_fc_rx_pause: ++ ctrl &= (~E1000_CTRL_TFCE); ++ ctrl |= E1000_CTRL_RFCE; ++ break; ++ case e1000_fc_tx_pause: ++ ctrl &= (~E1000_CTRL_RFCE); ++ ctrl |= E1000_CTRL_TFCE; ++ break; ++ case e1000_fc_full: ++ ctrl |= (E1000_CTRL_TFCE | E1000_CTRL_RFCE); ++ break; ++ default: ++ DEBUGOUT("Flow control param set incorrectly\n"); ++ ret_val = -E1000_ERR_CONFIG; ++ goto out; ++ } ++ ++ E1000_WRITE_REG(hw, E1000_CTRL, ctrl); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_config_fc_after_link_up_generic - Configures flow control after link ++ * @hw: pointer to the HW structure ++ * ++ * Checks the status of auto-negotiation after link up to ensure that the ++ * speed and duplex were not forced. If the link needed to be forced, then ++ * flow control needs to be forced also. If auto-negotiation is enabled ++ * and did not fail, then we configure flow control based on our link ++ * partner. ++ **/ ++s32 e1000_config_fc_after_link_up_generic(struct e1000_hw *hw) ++{ ++ struct e1000_mac_info *mac = &hw->mac; ++ s32 ret_val = E1000_SUCCESS; ++ u16 mii_status_reg, mii_nway_adv_reg, mii_nway_lp_ability_reg; ++ u16 speed, duplex; ++ ++ DEBUGFUNC("e1000_config_fc_after_link_up_generic"); ++ ++ /* ++ * Check for the case where we have fiber media and auto-neg failed ++ * so we had to force link. In this case, we need to force the ++ * configuration of the MAC to match the "fc" parameter. ++ */ ++ if (mac->autoneg_failed) { ++ if (hw->phy.media_type == e1000_media_type_fiber || ++ hw->phy.media_type == e1000_media_type_internal_serdes) ++ ret_val = e1000_force_mac_fc_generic(hw); ++ } else { ++ if (hw->phy.media_type == e1000_media_type_copper) ++ ret_val = e1000_force_mac_fc_generic(hw); ++ } ++ ++ if (ret_val) { ++ DEBUGOUT("Error forcing flow control settings\n"); ++ goto out; ++ } ++ ++ /* ++ * Check for the case where we have copper media and auto-neg is ++ * enabled. In this case, we need to check and see if Auto-Neg ++ * has completed, and if so, how the PHY and link partner has ++ * flow control configured. ++ */ ++ if ((hw->phy.media_type == e1000_media_type_copper) && mac->autoneg) { ++ /* ++ * Read the MII Status Register and check to see if AutoNeg ++ * has completed. We read this twice because this reg has ++ * some "sticky" (latched) bits. ++ */ ++ ret_val = hw->phy.ops.read_reg(hw, PHY_STATUS, &mii_status_reg); ++ if (ret_val) ++ goto out; ++ ret_val = hw->phy.ops.read_reg(hw, PHY_STATUS, &mii_status_reg); ++ if (ret_val) ++ goto out; ++ ++ if (!(mii_status_reg & MII_SR_AUTONEG_COMPLETE)) { ++ DEBUGOUT("Copper PHY and Auto Neg " ++ "has not completed.\n"); ++ goto out; ++ } ++ ++ /* ++ * The AutoNeg process has completed, so we now need to ++ * read both the Auto Negotiation Advertisement ++ * Register (Address 4) and the Auto_Negotiation Base ++ * Page Ability Register (Address 5) to determine how ++ * flow control was negotiated. ++ */ ++ ret_val = hw->phy.ops.read_reg(hw, PHY_AUTONEG_ADV, ++ &mii_nway_adv_reg); ++ if (ret_val) ++ goto out; ++ ret_val = hw->phy.ops.read_reg(hw, PHY_LP_ABILITY, ++ &mii_nway_lp_ability_reg); ++ if (ret_val) ++ goto out; ++ ++ /* ++ * Two bits in the Auto Negotiation Advertisement Register ++ * (Address 4) and two bits in the Auto Negotiation Base ++ * Page Ability Register (Address 5) determine flow control ++ * for both the PHY and the link partner. The following ++ * table, taken out of the IEEE 802.3ab/D6.0 dated March 25, ++ * 1999, describes these PAUSE resolution bits and how flow ++ * control is determined based upon these settings. ++ * NOTE: DC = Don't Care ++ * ++ * LOCAL DEVICE | LINK PARTNER ++ * PAUSE | ASM_DIR | PAUSE | ASM_DIR | NIC Resolution ++ *-------|---------|-------|---------|-------------------- ++ * 0 | 0 | DC | DC | e1000_fc_none ++ * 0 | 1 | 0 | DC | e1000_fc_none ++ * 0 | 1 | 1 | 0 | e1000_fc_none ++ * 0 | 1 | 1 | 1 | e1000_fc_tx_pause ++ * 1 | 0 | 0 | DC | e1000_fc_none ++ * 1 | DC | 1 | DC | e1000_fc_full ++ * 1 | 1 | 0 | 0 | e1000_fc_none ++ * 1 | 1 | 0 | 1 | e1000_fc_rx_pause ++ * ++ * Are both PAUSE bits set to 1? If so, this implies ++ * Symmetric Flow Control is enabled at both ends. The ++ * ASM_DIR bits are irrelevant per the spec. ++ * ++ * For Symmetric Flow Control: ++ * ++ * LOCAL DEVICE | LINK PARTNER ++ * PAUSE | ASM_DIR | PAUSE | ASM_DIR | Result ++ *-------|---------|-------|---------|-------------------- ++ * 1 | DC | 1 | DC | E1000_fc_full ++ * ++ */ ++ if ((mii_nway_adv_reg & NWAY_AR_PAUSE) && ++ (mii_nway_lp_ability_reg & NWAY_LPAR_PAUSE)) { ++ /* ++ * Now we need to check if the user selected Rx ONLY ++ * of pause frames. In this case, we had to advertise ++ * FULL flow control because we could not advertise RX ++ * ONLY. Hence, we must now check to see if we need to ++ * turn OFF the TRANSMISSION of PAUSE frames. ++ */ ++ if (hw->fc.requested_mode == e1000_fc_full) { ++ hw->fc.current_mode = e1000_fc_full; ++ DEBUGOUT("Flow Control = FULL.\r\n"); ++ } else { ++ hw->fc.current_mode = e1000_fc_rx_pause; ++ DEBUGOUT("Flow Control = " ++ "RX PAUSE frames only.\r\n"); ++ } ++ } ++ /* ++ * For receiving PAUSE frames ONLY. ++ * ++ * LOCAL DEVICE | LINK PARTNER ++ * PAUSE | ASM_DIR | PAUSE | ASM_DIR | Result ++ *-------|---------|-------|---------|-------------------- ++ * 0 | 1 | 1 | 1 | e1000_fc_tx_pause ++ */ ++ else if (!(mii_nway_adv_reg & NWAY_AR_PAUSE) && ++ (mii_nway_adv_reg & NWAY_AR_ASM_DIR) && ++ (mii_nway_lp_ability_reg & NWAY_LPAR_PAUSE) && ++ (mii_nway_lp_ability_reg & NWAY_LPAR_ASM_DIR)) { ++ hw->fc.current_mode = e1000_fc_tx_pause; ++ DEBUGOUT("Flow Control = TX PAUSE frames only.\r\n"); ++ } ++ /* ++ * For transmitting PAUSE frames ONLY. ++ * ++ * LOCAL DEVICE | LINK PARTNER ++ * PAUSE | ASM_DIR | PAUSE | ASM_DIR | Result ++ *-------|---------|-------|---------|-------------------- ++ * 1 | 1 | 0 | 1 | e1000_fc_rx_pause ++ */ ++ else if ((mii_nway_adv_reg & NWAY_AR_PAUSE) && ++ (mii_nway_adv_reg & NWAY_AR_ASM_DIR) && ++ !(mii_nway_lp_ability_reg & NWAY_LPAR_PAUSE) && ++ (mii_nway_lp_ability_reg & NWAY_LPAR_ASM_DIR)) { ++ hw->fc.current_mode = e1000_fc_rx_pause; ++ DEBUGOUT("Flow Control = RX PAUSE frames only.\r\n"); ++ } else { ++ /* ++ * Per the IEEE spec, at this point flow control ++ * should be disabled. ++ */ ++ hw->fc.current_mode = e1000_fc_none; ++ DEBUGOUT("Flow Control = NONE.\r\n"); ++ } ++ ++ /* ++ * Now we need to do one last check... If we auto- ++ * negotiated to HALF DUPLEX, flow control should not be ++ * enabled per IEEE 802.3 spec. ++ */ ++ ret_val = mac->ops.get_link_up_info(hw, &speed, &duplex); ++ if (ret_val) { ++ DEBUGOUT("Error getting link speed and duplex\n"); ++ goto out; ++ } ++ ++ if (duplex == HALF_DUPLEX) ++ hw->fc.current_mode = e1000_fc_none; ++ ++ /* ++ * Now we call a subroutine to actually force the MAC ++ * controller to use the correct flow control settings. ++ */ ++ ret_val = e1000_force_mac_fc_generic(hw); ++ if (ret_val) { ++ DEBUGOUT("Error forcing flow control settings\n"); ++ goto out; ++ } ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_get_speed_and_duplex_copper_generic - Retrieve current speed/duplex ++ * @hw: pointer to the HW structure ++ * @speed: stores the current speed ++ * @duplex: stores the current duplex ++ * ++ * Read the status register for the current speed/duplex and store the current ++ * speed and duplex for copper connections. ++ **/ ++s32 e1000_get_speed_and_duplex_copper_generic(struct e1000_hw *hw, u16 *speed, ++ u16 *duplex) ++{ ++ u32 status; ++ ++ DEBUGFUNC("e1000_get_speed_and_duplex_copper_generic"); ++ ++ status = E1000_READ_REG(hw, E1000_STATUS); ++ if (status & E1000_STATUS_SPEED_1000) { ++ *speed = SPEED_1000; ++ DEBUGOUT("1000 Mbs, "); ++ } else if (status & E1000_STATUS_SPEED_100) { ++ *speed = SPEED_100; ++ DEBUGOUT("100 Mbs, "); ++ } else { ++ *speed = SPEED_10; ++ DEBUGOUT("10 Mbs, "); ++ } ++ ++ if (status & E1000_STATUS_FD) { ++ *duplex = FULL_DUPLEX; ++ DEBUGOUT("Full Duplex\n"); ++ } else { ++ *duplex = HALF_DUPLEX; ++ DEBUGOUT("Half Duplex\n"); ++ } ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_get_speed_and_duplex_fiber_generic - Retrieve current speed/duplex ++ * @hw: pointer to the HW structure ++ * @speed: stores the current speed ++ * @duplex: stores the current duplex ++ * ++ * Sets the speed and duplex to gigabit full duplex (the only possible option) ++ * for fiber/serdes links. ++ **/ ++s32 e1000_get_speed_and_duplex_fiber_serdes_generic(struct e1000_hw *hw, ++ u16 *speed, u16 *duplex) ++{ ++ DEBUGFUNC("e1000_get_speed_and_duplex_fiber_serdes_generic"); ++ ++ *speed = SPEED_1000; ++ *duplex = FULL_DUPLEX; ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_get_hw_semaphore_generic - Acquire hardware semaphore ++ * @hw: pointer to the HW structure ++ * ++ * Acquire the HW semaphore to access the PHY or NVM ++ **/ ++s32 e1000_get_hw_semaphore_generic(struct e1000_hw *hw) ++{ ++ u32 swsm; ++ s32 ret_val = E1000_SUCCESS; ++ s32 timeout = hw->nvm.word_size + 1; ++ s32 i = 0; ++ ++ DEBUGFUNC("e1000_get_hw_semaphore_generic"); ++ ++ /* Get the SW semaphore */ ++ while (i < timeout) { ++ swsm = E1000_READ_REG(hw, E1000_SWSM); ++ if (!(swsm & E1000_SWSM_SMBI)) ++ break; ++ ++ usec_delay(50); ++ i++; ++ } ++ ++ if (i == timeout) { ++ DEBUGOUT("Driver can't access device - SMBI bit is set.\n"); ++ ret_val = -E1000_ERR_NVM; ++ goto out; ++ } ++ ++ /* Get the FW semaphore. */ ++ for (i = 0; i < timeout; i++) { ++ swsm = E1000_READ_REG(hw, E1000_SWSM); ++ E1000_WRITE_REG(hw, E1000_SWSM, swsm | E1000_SWSM_SWESMBI); ++ ++ /* Semaphore acquired if bit latched */ ++ if (E1000_READ_REG(hw, E1000_SWSM) & E1000_SWSM_SWESMBI) ++ break; ++ ++ usec_delay(50); ++ } ++ ++ if (i == timeout) { ++ /* Release semaphores */ ++ e1000_put_hw_semaphore_generic(hw); ++ DEBUGOUT("Driver can't access the NVM\n"); ++ ret_val = -E1000_ERR_NVM; ++ goto out; ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_put_hw_semaphore_generic - Release hardware semaphore ++ * @hw: pointer to the HW structure ++ * ++ * Release hardware semaphore used to access the PHY or NVM ++ **/ ++void e1000_put_hw_semaphore_generic(struct e1000_hw *hw) ++{ ++ u32 swsm; ++ ++ DEBUGFUNC("e1000_put_hw_semaphore_generic"); ++ ++ swsm = E1000_READ_REG(hw, E1000_SWSM); ++ ++ swsm &= ~(E1000_SWSM_SMBI | E1000_SWSM_SWESMBI); ++ ++ E1000_WRITE_REG(hw, E1000_SWSM, swsm); ++} ++ ++/** ++ * e1000_get_auto_rd_done_generic - Check for auto read completion ++ * @hw: pointer to the HW structure ++ * ++ * Check EEPROM for Auto Read done bit. ++ **/ ++s32 e1000_get_auto_rd_done_generic(struct e1000_hw *hw) ++{ ++ s32 i = 0; ++ s32 ret_val = E1000_SUCCESS; ++ ++ DEBUGFUNC("e1000_get_auto_rd_done_generic"); ++ ++ while (i < AUTO_READ_DONE_TIMEOUT) { ++ if (E1000_READ_REG(hw, E1000_EECD) & E1000_EECD_AUTO_RD) ++ break; ++ msec_delay(1); ++ i++; ++ } ++ ++ if (i == AUTO_READ_DONE_TIMEOUT) { ++ DEBUGOUT("Auto read by HW from NVM has not completed.\n"); ++ ret_val = -E1000_ERR_RESET; ++ goto out; ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_valid_led_default_generic - Verify a valid default LED config ++ * @hw: pointer to the HW structure ++ * @data: pointer to the NVM (EEPROM) ++ * ++ * Read the EEPROM for the current default LED configuration. If the ++ * LED configuration is not valid, set to a valid LED configuration. ++ **/ ++s32 e1000_valid_led_default_generic(struct e1000_hw *hw, u16 *data) ++{ ++ s32 ret_val; ++ ++ DEBUGFUNC("e1000_valid_led_default_generic"); ++ ++ ret_val = hw->nvm.ops.read(hw, NVM_ID_LED_SETTINGS, 1, data); ++ if (ret_val) { ++ DEBUGOUT("NVM Read Error\n"); ++ goto out; ++ } ++ ++ if (*data == ID_LED_RESERVED_0000 || *data == ID_LED_RESERVED_FFFF) ++ *data = ID_LED_DEFAULT; ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_id_led_init_generic - ++ * @hw: pointer to the HW structure ++ * ++ **/ ++s32 e1000_id_led_init_generic(struct e1000_hw *hw) ++{ ++ struct e1000_mac_info *mac = &hw->mac; ++ s32 ret_val; ++ const u32 ledctl_mask = 0x000000FF; ++ const u32 ledctl_on = E1000_LEDCTL_MODE_LED_ON; ++ const u32 ledctl_off = E1000_LEDCTL_MODE_LED_OFF; ++ u16 data, i, temp; ++ const u16 led_mask = 0x0F; ++ ++ DEBUGFUNC("e1000_id_led_init_generic"); ++ ++ ret_val = hw->nvm.ops.valid_led_default(hw, &data); ++ if (ret_val) ++ goto out; ++ ++ mac->ledctl_default = E1000_READ_REG(hw, E1000_LEDCTL); ++ mac->ledctl_mode1 = mac->ledctl_default; ++ mac->ledctl_mode2 = mac->ledctl_default; ++ ++ for (i = 0; i < 4; i++) { ++ temp = (data >> (i << 2)) & led_mask; ++ switch (temp) { ++ case ID_LED_ON1_DEF2: ++ case ID_LED_ON1_ON2: ++ case ID_LED_ON1_OFF2: ++ mac->ledctl_mode1 &= ~(ledctl_mask << (i << 3)); ++ mac->ledctl_mode1 |= ledctl_on << (i << 3); ++ break; ++ case ID_LED_OFF1_DEF2: ++ case ID_LED_OFF1_ON2: ++ case ID_LED_OFF1_OFF2: ++ mac->ledctl_mode1 &= ~(ledctl_mask << (i << 3)); ++ mac->ledctl_mode1 |= ledctl_off << (i << 3); ++ break; ++ default: ++ /* Do nothing */ ++ break; ++ } ++ switch (temp) { ++ case ID_LED_DEF1_ON2: ++ case ID_LED_ON1_ON2: ++ case ID_LED_OFF1_ON2: ++ mac->ledctl_mode2 &= ~(ledctl_mask << (i << 3)); ++ mac->ledctl_mode2 |= ledctl_on << (i << 3); ++ break; ++ case ID_LED_DEF1_OFF2: ++ case ID_LED_ON1_OFF2: ++ case ID_LED_OFF1_OFF2: ++ mac->ledctl_mode2 &= ~(ledctl_mask << (i << 3)); ++ mac->ledctl_mode2 |= ledctl_off << (i << 3); ++ break; ++ default: ++ /* Do nothing */ ++ break; ++ } ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_setup_led_generic - Configures SW controllable LED ++ * @hw: pointer to the HW structure ++ * ++ * This prepares the SW controllable LED for use and saves the current state ++ * of the LED so it can be later restored. ++ **/ ++s32 e1000_setup_led_generic(struct e1000_hw *hw) ++{ ++ u32 ledctl; ++ s32 ret_val = E1000_SUCCESS; ++ ++ DEBUGFUNC("e1000_setup_led_generic"); ++ ++ if (hw->mac.ops.setup_led != e1000_setup_led_generic) { ++ ret_val = -E1000_ERR_CONFIG; ++ goto out; ++ } ++ ++ if (hw->phy.media_type == e1000_media_type_fiber) { ++ ledctl = E1000_READ_REG(hw, E1000_LEDCTL); ++ hw->mac.ledctl_default = ledctl; ++ /* Turn off LED0 */ ++ ledctl &= ~(E1000_LEDCTL_LED0_IVRT | ++ E1000_LEDCTL_LED0_BLINK | ++ E1000_LEDCTL_LED0_MODE_MASK); ++ ledctl |= (E1000_LEDCTL_MODE_LED_OFF << ++ E1000_LEDCTL_LED0_MODE_SHIFT); ++ E1000_WRITE_REG(hw, E1000_LEDCTL, ledctl); ++ } else if (hw->phy.media_type == e1000_media_type_copper) { ++ E1000_WRITE_REG(hw, E1000_LEDCTL, hw->mac.ledctl_mode1); ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_cleanup_led_generic - Set LED config to default operation ++ * @hw: pointer to the HW structure ++ * ++ * Remove the current LED configuration and set the LED configuration ++ * to the default value, saved from the EEPROM. ++ **/ ++s32 e1000_cleanup_led_generic(struct e1000_hw *hw) ++{ ++ s32 ret_val = E1000_SUCCESS; ++ ++ DEBUGFUNC("e1000_cleanup_led_generic"); ++ ++ if (hw->mac.ops.cleanup_led != e1000_cleanup_led_generic) { ++ ret_val = -E1000_ERR_CONFIG; ++ goto out; ++ } ++ ++ E1000_WRITE_REG(hw, E1000_LEDCTL, hw->mac.ledctl_default); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_blink_led_generic - Blink LED ++ * @hw: pointer to the HW structure ++ * ++ * Blink the LEDs which are set to be on. ++ **/ ++s32 e1000_blink_led_generic(struct e1000_hw *hw) ++{ ++ u32 ledctl_blink = 0; ++ u32 i; ++ ++ DEBUGFUNC("e1000_blink_led_generic"); ++ ++ if (hw->phy.media_type == e1000_media_type_fiber) { ++ /* always blink LED0 for PCI-E fiber */ ++ ledctl_blink = E1000_LEDCTL_LED0_BLINK | ++ (E1000_LEDCTL_MODE_LED_ON << E1000_LEDCTL_LED0_MODE_SHIFT); ++ } else { ++ /* ++ * set the blink bit for each LED that's "on" (0x0E) ++ * in ledctl_mode2 ++ */ ++ ledctl_blink = hw->mac.ledctl_mode2; ++ for (i = 0; i < 4; i++) ++ if (((hw->mac.ledctl_mode2 >> (i * 8)) & 0xFF) == ++ E1000_LEDCTL_MODE_LED_ON) ++ ledctl_blink |= (E1000_LEDCTL_LED0_BLINK << ++ (i * 8)); ++ } ++ ++ E1000_WRITE_REG(hw, E1000_LEDCTL, ledctl_blink); ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_led_on_generic - Turn LED on ++ * @hw: pointer to the HW structure ++ * ++ * Turn LED on. ++ **/ ++s32 e1000_led_on_generic(struct e1000_hw *hw) ++{ ++ u32 ctrl; ++ ++ DEBUGFUNC("e1000_led_on_generic"); ++ ++ switch (hw->phy.media_type) { ++ case e1000_media_type_fiber: ++ ctrl = E1000_READ_REG(hw, E1000_CTRL); ++ ctrl &= ~E1000_CTRL_SWDPIN0; ++ ctrl |= E1000_CTRL_SWDPIO0; ++ E1000_WRITE_REG(hw, E1000_CTRL, ctrl); ++ break; ++ case e1000_media_type_copper: ++ E1000_WRITE_REG(hw, E1000_LEDCTL, hw->mac.ledctl_mode2); ++ break; ++ default: ++ break; ++ } ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_led_off_generic - Turn LED off ++ * @hw: pointer to the HW structure ++ * ++ * Turn LED off. ++ **/ ++s32 e1000_led_off_generic(struct e1000_hw *hw) ++{ ++ u32 ctrl; ++ ++ DEBUGFUNC("e1000_led_off_generic"); ++ ++ switch (hw->phy.media_type) { ++ case e1000_media_type_fiber: ++ ctrl = E1000_READ_REG(hw, E1000_CTRL); ++ ctrl |= E1000_CTRL_SWDPIN0; ++ ctrl |= E1000_CTRL_SWDPIO0; ++ E1000_WRITE_REG(hw, E1000_CTRL, ctrl); ++ break; ++ case e1000_media_type_copper: ++ E1000_WRITE_REG(hw, E1000_LEDCTL, hw->mac.ledctl_mode1); ++ break; ++ default: ++ break; ++ } ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_set_pcie_no_snoop_generic - Set PCI-express capabilities ++ * @hw: pointer to the HW structure ++ * @no_snoop: bitmap of snoop events ++ * ++ * Set the PCI-express register to snoop for events enabled in 'no_snoop'. ++ **/ ++void e1000_set_pcie_no_snoop_generic(struct e1000_hw *hw, u32 no_snoop) ++{ ++ u32 gcr; ++ ++ DEBUGFUNC("e1000_set_pcie_no_snoop_generic"); ++ ++ if (hw->bus.type != e1000_bus_type_pci_express) ++ goto out; ++ ++ if (no_snoop) { ++ gcr = E1000_READ_REG(hw, E1000_GCR); ++ gcr &= ~(PCIE_NO_SNOOP_ALL); ++ gcr |= no_snoop; ++ E1000_WRITE_REG(hw, E1000_GCR, gcr); ++ } ++out: ++ return; ++} ++ ++/** ++ * e1000_disable_pcie_master_generic - Disables PCI-express master access ++ * @hw: pointer to the HW structure ++ * ++ * Returns 0 (E1000_SUCCESS) if successful, else returns -10 ++ * (-E1000_ERR_MASTER_REQUESTS_PENDING) if master disable bit has not caused ++ * the master requests to be disabled. ++ * ++ * Disables PCI-Express master access and verifies there are no pending ++ * requests. ++ **/ ++s32 e1000_disable_pcie_master_generic(struct e1000_hw *hw) ++{ ++ u32 ctrl; ++ s32 timeout = MASTER_DISABLE_TIMEOUT; ++ s32 ret_val = E1000_SUCCESS; ++ ++ DEBUGFUNC("e1000_disable_pcie_master_generic"); ++ ++ if (hw->bus.type != e1000_bus_type_pci_express) ++ goto out; ++ ++ ctrl = E1000_READ_REG(hw, E1000_CTRL); ++ ctrl |= E1000_CTRL_GIO_MASTER_DISABLE; ++ E1000_WRITE_REG(hw, E1000_CTRL, ctrl); ++ ++ while (timeout) { ++ if (!(E1000_READ_REG(hw, E1000_STATUS) & ++ E1000_STATUS_GIO_MASTER_ENABLE)) ++ break; ++ usec_delay(100); ++ timeout--; ++ } ++ ++ if (!timeout) { ++ DEBUGOUT("Master requests are pending.\n"); ++ ret_val = -E1000_ERR_MASTER_REQUESTS_PENDING; ++ goto out; ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_reset_adaptive_generic - Reset Adaptive Interframe Spacing ++ * @hw: pointer to the HW structure ++ * ++ * Reset the Adaptive Interframe Spacing throttle to default values. ++ **/ ++void e1000_reset_adaptive_generic(struct e1000_hw *hw) ++{ ++ struct e1000_mac_info *mac = &hw->mac; ++ ++ DEBUGFUNC("e1000_reset_adaptive_generic"); ++ ++ if (!mac->adaptive_ifs) { ++ DEBUGOUT("Not in Adaptive IFS mode!\n"); ++ goto out; ++ } ++ ++ mac->current_ifs_val = 0; ++ mac->ifs_min_val = IFS_MIN; ++ mac->ifs_max_val = IFS_MAX; ++ mac->ifs_step_size = IFS_STEP; ++ mac->ifs_ratio = IFS_RATIO; ++ ++ mac->in_ifs_mode = false; ++ E1000_WRITE_REG(hw, E1000_AIT, 0); ++out: ++ return; ++} ++ ++/** ++ * e1000_update_adaptive_generic - Update Adaptive Interframe Spacing ++ * @hw: pointer to the HW structure ++ * ++ * Update the Adaptive Interframe Spacing Throttle value based on the ++ * time between transmitted packets and time between collisions. ++ **/ ++void e1000_update_adaptive_generic(struct e1000_hw *hw) ++{ ++ struct e1000_mac_info *mac = &hw->mac; ++ ++ DEBUGFUNC("e1000_update_adaptive_generic"); ++ ++ if (!mac->adaptive_ifs) { ++ DEBUGOUT("Not in Adaptive IFS mode!\n"); ++ goto out; ++ } ++ ++ if ((mac->collision_delta * mac->ifs_ratio) > mac->tx_packet_delta) { ++ if (mac->tx_packet_delta > MIN_NUM_XMITS) { ++ mac->in_ifs_mode = true; ++ if (mac->current_ifs_val < mac->ifs_max_val) { ++ if (!mac->current_ifs_val) ++ mac->current_ifs_val = mac->ifs_min_val; ++ else ++ mac->current_ifs_val += ++ mac->ifs_step_size; ++ E1000_WRITE_REG(hw, E1000_AIT, mac->current_ifs_val); ++ } ++ } ++ } else { ++ if (mac->in_ifs_mode && ++ (mac->tx_packet_delta <= MIN_NUM_XMITS)) { ++ mac->current_ifs_val = 0; ++ mac->in_ifs_mode = false; ++ E1000_WRITE_REG(hw, E1000_AIT, 0); ++ } ++ } ++out: ++ return; ++} ++ ++/** ++ * e1000_validate_mdi_setting_generic - Verify MDI/MDIx settings ++ * @hw: pointer to the HW structure ++ * ++ * Verify that when not using auto-negotiation that MDI/MDIx is correctly ++ * set, which is forced to MDI mode only. ++ **/ ++s32 e1000_validate_mdi_setting_generic(struct e1000_hw *hw) ++{ ++ s32 ret_val = E1000_SUCCESS; ++ ++ DEBUGFUNC("e1000_validate_mdi_setting_generic"); ++ ++ if (!hw->mac.autoneg && (hw->phy.mdix == 0 || hw->phy.mdix == 3)) { ++ DEBUGOUT("Invalid MDI setting detected\n"); ++ hw->phy.mdix = 1; ++ ret_val = -E1000_ERR_CONFIG; ++ goto out; ++ } ++ ++out: ++ return ret_val; ++} +diff -r d03036c09699 drivers/net/e1000/e1000_mac.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/e1000/e1000_mac.h Mon Jun 15 11:43:11 2009 +0100 +@@ -0,0 +1,92 @@ ++/******************************************************************************* ++ ++ Intel PRO/1000 Linux driver ++ Copyright(c) 1999 - 2008 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ Linux NICS ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++#ifndef _E1000_MAC_H_ ++#define _E1000_MAC_H_ ++ ++/* ++ * Functions that should not be called directly from drivers but can be used ++ * by other files in this 'shared code' ++ */ ++void e1000_init_mac_ops_generic(struct e1000_hw *hw); ++void e1000_null_mac_generic(struct e1000_hw *hw); ++s32 e1000_null_ops_generic(struct e1000_hw *hw); ++s32 e1000_null_link_info(struct e1000_hw *hw, u16 *s, u16 *d); ++bool e1000_null_mng_mode(struct e1000_hw *hw); ++void e1000_null_update_mc(struct e1000_hw *hw, u8 *h, u32 a); ++void e1000_null_write_vfta(struct e1000_hw *hw, u32 a, u32 b); ++void e1000_null_mta_set(struct e1000_hw *hw, u32 a); ++void e1000_null_rar_set(struct e1000_hw *hw, u8 *h, u32 a); ++s32 e1000_blink_led_generic(struct e1000_hw *hw); ++s32 e1000_check_for_copper_link_generic(struct e1000_hw *hw); ++s32 e1000_check_for_fiber_link_generic(struct e1000_hw *hw); ++s32 e1000_check_for_serdes_link_generic(struct e1000_hw *hw); ++s32 e1000_cleanup_led_generic(struct e1000_hw *hw); ++s32 e1000_commit_fc_settings_generic(struct e1000_hw *hw); ++s32 e1000_poll_fiber_serdes_link_generic(struct e1000_hw *hw); ++s32 e1000_config_fc_after_link_up_generic(struct e1000_hw *hw); ++s32 e1000_disable_pcie_master_generic(struct e1000_hw *hw); ++s32 e1000_force_mac_fc_generic(struct e1000_hw *hw); ++s32 e1000_get_auto_rd_done_generic(struct e1000_hw *hw); ++s32 e1000_get_bus_info_pci_generic(struct e1000_hw *hw); ++s32 e1000_get_bus_info_pcie_generic(struct e1000_hw *hw); ++void e1000_set_lan_id_single_port(struct e1000_hw *hw); ++void e1000_set_lan_id_multi_port_pci(struct e1000_hw *hw); ++s32 e1000_get_hw_semaphore_generic(struct e1000_hw *hw); ++s32 e1000_get_speed_and_duplex_copper_generic(struct e1000_hw *hw, u16 *speed, ++ u16 *duplex); ++s32 e1000_get_speed_and_duplex_fiber_serdes_generic(struct e1000_hw *hw, ++ u16 *speed, u16 *duplex); ++s32 e1000_id_led_init_generic(struct e1000_hw *hw); ++s32 e1000_led_on_generic(struct e1000_hw *hw); ++s32 e1000_led_off_generic(struct e1000_hw *hw); ++void e1000_update_mc_addr_list_generic(struct e1000_hw *hw, ++ u8 *mc_addr_list, u32 mc_addr_count); ++s32 e1000_set_default_fc_generic(struct e1000_hw *hw); ++s32 e1000_set_fc_watermarks_generic(struct e1000_hw *hw); ++s32 e1000_setup_fiber_serdes_link_generic(struct e1000_hw *hw); ++s32 e1000_setup_led_generic(struct e1000_hw *hw); ++s32 e1000_setup_link_generic(struct e1000_hw *hw); ++ ++u32 e1000_hash_mc_addr_generic(struct e1000_hw *hw, u8 *mc_addr); ++ ++void e1000_clear_hw_cntrs_base_generic(struct e1000_hw *hw); ++void e1000_clear_vfta_generic(struct e1000_hw *hw); ++void e1000_config_collision_dist_generic(struct e1000_hw *hw); ++void e1000_init_rx_addrs_generic(struct e1000_hw *hw, u16 rar_count); ++void e1000_mta_set_generic(struct e1000_hw *hw, u32 hash_value); ++void e1000_pcix_mmrbc_workaround_generic(struct e1000_hw *hw); ++void e1000_put_hw_semaphore_generic(struct e1000_hw *hw); ++void e1000_rar_set_generic(struct e1000_hw *hw, u8 *addr, u32 index); ++s32 e1000_check_alt_mac_addr_generic(struct e1000_hw *hw); ++void e1000_reset_adaptive_generic(struct e1000_hw *hw); ++void e1000_set_pcie_no_snoop_generic(struct e1000_hw *hw, u32 no_snoop); ++void e1000_update_adaptive_generic(struct e1000_hw *hw); ++void e1000_write_vfta_generic(struct e1000_hw *hw, u32 offset, u32 value); ++ ++#endif +diff -r d03036c09699 drivers/net/e1000/e1000_main.c +--- a/drivers/net/e1000/e1000_main.c Thu Jun 04 15:13:56 2009 +0100 ++++ b/drivers/net/e1000/e1000_main.c Mon Jun 15 11:43:11 2009 +0100 +@@ -1,7 +1,7 @@ + /******************************************************************************* + + Intel PRO/1000 Linux driver +- Copyright(c) 1999 - 2006 Intel Corporation. ++ Copyright(c) 1999 - 2008 Intel Corporation. + + This program is free software; you can redistribute it and/or modify it + under the terms and conditions of the GNU General Public License, +@@ -26,14 +26,48 @@ + + *******************************************************************************/ + ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#ifdef NETIF_F_TSO ++#include ++#ifdef NETIF_F_TSO6 ++#include ++#endif ++#endif ++#ifdef SIOCGMIIPHY ++#include ++#endif ++#ifdef SIOCETHTOOL ++#include ++#endif ++#ifdef NETIF_F_HW_VLAN_TX ++#include ++#endif ++ + #include "e1000.h" +-#include + + char e1000_driver_name[] = "e1000"; + static char e1000_driver_string[] = "Intel(R) PRO/1000 Network Driver"; +-#define DRV_VERSION "7.3.21-k3-NAPI" ++ ++#ifdef CONFIG_E1000_NAPI ++#define DRV_NAPI "-NAPI" ++#else ++#define DRV_NAPI ++#endif ++ ++#define DRV_DEBUG ++ ++#define DRV_HW_PERF ++ ++#define DRV_VERSION "8.0.13" DRV_NAPI DRV_DEBUG DRV_HW_PERF + const char e1000_driver_version[] = DRV_VERSION; +-static const char e1000_copyright[] = "Copyright (c) 1999-2006 Intel Corporation."; ++static const char e1000_copyright[] = "Copyright (c) 1999-2009 Intel Corporation."; + + /* e1000_pci_tbl - PCI Device ID Table + * +@@ -43,66 +77,56 @@ + * {PCI_DEVICE(PCI_VENDOR_ID_INTEL, device_id)} + */ + static struct pci_device_id e1000_pci_tbl[] = { +- INTEL_E1000_ETHERNET_DEVICE(0x1000), +- INTEL_E1000_ETHERNET_DEVICE(0x1001), +- INTEL_E1000_ETHERNET_DEVICE(0x1004), +- INTEL_E1000_ETHERNET_DEVICE(0x1008), +- INTEL_E1000_ETHERNET_DEVICE(0x1009), +- INTEL_E1000_ETHERNET_DEVICE(0x100C), +- INTEL_E1000_ETHERNET_DEVICE(0x100D), +- INTEL_E1000_ETHERNET_DEVICE(0x100E), +- INTEL_E1000_ETHERNET_DEVICE(0x100F), +- INTEL_E1000_ETHERNET_DEVICE(0x1010), +- INTEL_E1000_ETHERNET_DEVICE(0x1011), +- INTEL_E1000_ETHERNET_DEVICE(0x1012), +- INTEL_E1000_ETHERNET_DEVICE(0x1013), +- INTEL_E1000_ETHERNET_DEVICE(0x1014), +- INTEL_E1000_ETHERNET_DEVICE(0x1015), +- INTEL_E1000_ETHERNET_DEVICE(0x1016), +- INTEL_E1000_ETHERNET_DEVICE(0x1017), +- INTEL_E1000_ETHERNET_DEVICE(0x1018), +- INTEL_E1000_ETHERNET_DEVICE(0x1019), +- INTEL_E1000_ETHERNET_DEVICE(0x101A), +- INTEL_E1000_ETHERNET_DEVICE(0x101D), +- INTEL_E1000_ETHERNET_DEVICE(0x101E), +- INTEL_E1000_ETHERNET_DEVICE(0x1026), +- INTEL_E1000_ETHERNET_DEVICE(0x1027), +- INTEL_E1000_ETHERNET_DEVICE(0x1028), +- INTEL_E1000_ETHERNET_DEVICE(0x1075), +- INTEL_E1000_ETHERNET_DEVICE(0x1076), +- INTEL_E1000_ETHERNET_DEVICE(0x1077), +- INTEL_E1000_ETHERNET_DEVICE(0x1078), +- INTEL_E1000_ETHERNET_DEVICE(0x1079), +- INTEL_E1000_ETHERNET_DEVICE(0x107A), +- INTEL_E1000_ETHERNET_DEVICE(0x107B), +- INTEL_E1000_ETHERNET_DEVICE(0x107C), +- INTEL_E1000_ETHERNET_DEVICE(0x108A), +- INTEL_E1000_ETHERNET_DEVICE(0x1099), +- INTEL_E1000_ETHERNET_DEVICE(0x10B5), ++ INTEL_E1000_ETHERNET_DEVICE(E1000_DEV_ID_82542), ++ INTEL_E1000_ETHERNET_DEVICE(E1000_DEV_ID_82543GC_FIBER), ++ INTEL_E1000_ETHERNET_DEVICE(E1000_DEV_ID_82543GC_COPPER), ++ INTEL_E1000_ETHERNET_DEVICE(E1000_DEV_ID_82544EI_COPPER), ++ INTEL_E1000_ETHERNET_DEVICE(E1000_DEV_ID_82544EI_FIBER), ++ INTEL_E1000_ETHERNET_DEVICE(E1000_DEV_ID_82544GC_COPPER), ++ INTEL_E1000_ETHERNET_DEVICE(E1000_DEV_ID_82544GC_LOM), ++ INTEL_E1000_ETHERNET_DEVICE(E1000_DEV_ID_82540EM), ++ INTEL_E1000_ETHERNET_DEVICE(E1000_DEV_ID_82545EM_COPPER), ++ INTEL_E1000_ETHERNET_DEVICE(E1000_DEV_ID_82546EB_COPPER), ++ INTEL_E1000_ETHERNET_DEVICE(E1000_DEV_ID_82545EM_FIBER), ++ INTEL_E1000_ETHERNET_DEVICE(E1000_DEV_ID_82546EB_FIBER), ++ INTEL_E1000_ETHERNET_DEVICE(E1000_DEV_ID_82541EI), ++ INTEL_E1000_ETHERNET_DEVICE(E1000_DEV_ID_82541ER_LOM), ++ INTEL_E1000_ETHERNET_DEVICE(E1000_DEV_ID_82540EM_LOM), ++ INTEL_E1000_ETHERNET_DEVICE(E1000_DEV_ID_82540EP_LOM), ++ INTEL_E1000_ETHERNET_DEVICE(E1000_DEV_ID_82540EP), ++ INTEL_E1000_ETHERNET_DEVICE(E1000_DEV_ID_82541EI_MOBILE), ++ INTEL_E1000_ETHERNET_DEVICE(E1000_DEV_ID_82547EI), ++ INTEL_E1000_ETHERNET_DEVICE(E1000_DEV_ID_82547EI_MOBILE), ++ INTEL_E1000_ETHERNET_DEVICE(E1000_DEV_ID_82546EB_QUAD_COPPER), ++ INTEL_E1000_ETHERNET_DEVICE(E1000_DEV_ID_82540EP_LP), ++ INTEL_E1000_ETHERNET_DEVICE(E1000_DEV_ID_82545GM_COPPER), ++ INTEL_E1000_ETHERNET_DEVICE(E1000_DEV_ID_82545GM_FIBER), ++ INTEL_E1000_ETHERNET_DEVICE(E1000_DEV_ID_82545GM_SERDES), ++ INTEL_E1000_ETHERNET_DEVICE(E1000_DEV_ID_82547GI), ++ INTEL_E1000_ETHERNET_DEVICE(E1000_DEV_ID_82541GI), ++ INTEL_E1000_ETHERNET_DEVICE(E1000_DEV_ID_82541GI_MOBILE), ++ INTEL_E1000_ETHERNET_DEVICE(E1000_DEV_ID_82541ER), ++ INTEL_E1000_ETHERNET_DEVICE(E1000_DEV_ID_82546GB_COPPER), ++ INTEL_E1000_ETHERNET_DEVICE(E1000_DEV_ID_82546GB_FIBER), ++ INTEL_E1000_ETHERNET_DEVICE(E1000_DEV_ID_82546GB_SERDES), ++ INTEL_E1000_ETHERNET_DEVICE(E1000_DEV_ID_82541GI_LF), ++ INTEL_E1000_ETHERNET_DEVICE(E1000_DEV_ID_82546GB_PCIE), ++ INTEL_E1000_ETHERNET_DEVICE(E1000_DEV_ID_82546GB_QUAD_COPPER), ++ INTEL_E1000_ETHERNET_DEVICE(E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3), + /* required last entry */ + {0,} + }; + + MODULE_DEVICE_TABLE(pci, e1000_pci_tbl); + +-int e1000_up(struct e1000_adapter *adapter); +-void e1000_down(struct e1000_adapter *adapter); +-void e1000_reinit_locked(struct e1000_adapter *adapter); +-void e1000_reset(struct e1000_adapter *adapter); +-int e1000_set_spd_dplx(struct e1000_adapter *adapter, u16 spddplx); +-int e1000_setup_all_tx_resources(struct e1000_adapter *adapter); +-int e1000_setup_all_rx_resources(struct e1000_adapter *adapter); +-void e1000_free_all_tx_resources(struct e1000_adapter *adapter); +-void e1000_free_all_rx_resources(struct e1000_adapter *adapter); + static int e1000_setup_tx_resources(struct e1000_adapter *adapter, +- struct e1000_tx_ring *txdr); ++ struct e1000_tx_ring *tx_ring); + static int e1000_setup_rx_resources(struct e1000_adapter *adapter, +- struct e1000_rx_ring *rxdr); ++ struct e1000_rx_ring *rx_ring); + static void e1000_free_tx_resources(struct e1000_adapter *adapter, +- struct e1000_tx_ring *tx_ring); ++ struct e1000_tx_ring *tx_ring); + static void e1000_free_rx_resources(struct e1000_adapter *adapter, +- struct e1000_rx_ring *rx_ring); +-void e1000_update_stats(struct e1000_adapter *adapter); ++ struct e1000_rx_ring *rx_ring); + + static int e1000_init_module(void); + static void e1000_exit_module(void); +@@ -112,6 +136,7 @@ + static int e1000_sw_init(struct e1000_adapter *adapter); + static int e1000_open(struct net_device *netdev); + static int e1000_close(struct net_device *netdev); ++static void e1000_configure(struct e1000_adapter *adapter); + static void e1000_configure_tx(struct e1000_adapter *adapter); + static void e1000_configure_rx(struct e1000_adapter *adapter); + static void e1000_setup_rctl(struct e1000_adapter *adapter); +@@ -121,34 +146,44 @@ + struct e1000_tx_ring *tx_ring); + static void e1000_clean_rx_ring(struct e1000_adapter *adapter, + struct e1000_rx_ring *rx_ring); +-static void e1000_set_rx_mode(struct net_device *netdev); ++static void e1000_set_multi(struct net_device *netdev); + static void e1000_update_phy_info(unsigned long data); + static void e1000_watchdog(unsigned long data); ++static void e1000_watchdog_task(struct work_struct *work); + static void e1000_82547_tx_fifo_stall(unsigned long data); ++static int e1000_xmit_frame_ring(struct sk_buff *skb, struct net_device *netdev, ++ struct e1000_tx_ring *tx_ring); + static int e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev); ++static void e1000_phy_read_status(struct e1000_adapter *adapter); + static struct net_device_stats * e1000_get_stats(struct net_device *netdev); + static int e1000_change_mtu(struct net_device *netdev, int new_mtu); + static int e1000_set_mac(struct net_device *netdev, void *p); + static irqreturn_t e1000_intr(int irq, void *data); +-static irqreturn_t e1000_intr_msi(int irq, void *data); + static bool e1000_clean_tx_irq(struct e1000_adapter *adapter, +- struct e1000_tx_ring *tx_ring); +-static int e1000_clean(struct napi_struct *napi, int budget); ++ struct e1000_tx_ring *tx_ring); ++#ifdef CONFIG_E1000_NAPI ++static int e1000_poll(struct napi_struct *napi, int budget); + static bool e1000_clean_rx_irq(struct e1000_adapter *adapter, +- struct e1000_rx_ring *rx_ring, +- int *work_done, int work_to_do); +-static bool e1000_clean_rx_irq_ps(struct e1000_adapter *adapter, +- struct e1000_rx_ring *rx_ring, +- int *work_done, int work_to_do); ++ struct e1000_rx_ring *rx_ring, ++ int *work_done, int work_to_do); ++static bool e1000_clean_jumbo_rx_irq(struct e1000_adapter *adapter, ++ struct e1000_rx_ring *rx_ring, ++ int *work_done, int work_to_do); ++static void e1000_alloc_jumbo_rx_buffers(struct e1000_adapter *adapter, ++ struct e1000_rx_ring *rx_ring, ++ int cleaned_count); ++#else ++static bool e1000_clean_rx_irq(struct e1000_adapter *adapter, ++ struct e1000_rx_ring *rx_ring); ++#endif + static void e1000_alloc_rx_buffers(struct e1000_adapter *adapter, + struct e1000_rx_ring *rx_ring, +- int cleaned_count); +-static void e1000_alloc_rx_buffers_ps(struct e1000_adapter *adapter, +- struct e1000_rx_ring *rx_ring, +- int cleaned_count); ++ int cleaned_count); + static int e1000_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd); ++#ifdef SIOCGMIIPHY + static int e1000_mii_ioctl(struct net_device *netdev, struct ifreq *ifr, +- int cmd); ++ int cmd); ++#endif + static void e1000_enter_82542_rst(struct e1000_adapter *adapter); + static void e1000_leave_82542_rst(struct e1000_adapter *adapter); + static void e1000_tx_timeout(struct net_device *dev); +@@ -157,16 +192,29 @@ + static int e1000_82547_fifo_workaround(struct e1000_adapter *adapter, + struct sk_buff *skb); + +-static void e1000_vlan_rx_register(struct net_device *netdev, struct vlan_group *grp); ++#ifdef NETIF_F_HW_VLAN_TX ++static void e1000_vlan_rx_register(struct net_device *netdev, ++ struct vlan_group *grp); + static void e1000_vlan_rx_add_vid(struct net_device *netdev, u16 vid); + static void e1000_vlan_rx_kill_vid(struct net_device *netdev, u16 vid); + static void e1000_restore_vlan(struct e1000_adapter *adapter); ++#endif + + static int e1000_suspend(struct pci_dev *pdev, pm_message_t state); + #ifdef CONFIG_PM + static int e1000_resume(struct pci_dev *pdev); + #endif ++#ifndef USE_REBOOT_NOTIFIER + static void e1000_shutdown(struct pci_dev *pdev); ++#else ++static int e1000_notify_reboot(struct notifier_block *, unsigned long event, ++ void *ptr); ++static struct notifier_block e1000_notifier_reboot = { ++ .notifier_call = e1000_notify_reboot, ++ .next = NULL, ++ .priority = 0 ++}; ++#endif + + #ifdef CONFIG_NET_POLL_CONTROLLER + /* for netdump / net console */ +@@ -179,6 +227,8 @@ + MODULE_PARM_DESC(copybreak, + "Maximum size of packet that is copied to a new buffer on receive"); + ++ ++#ifdef HAVE_PCI_ERS + static pci_ers_result_t e1000_io_error_detected(struct pci_dev *pdev, + pci_channel_state_t state); + static pci_ers_result_t e1000_io_slot_reset(struct pci_dev *pdev); +@@ -189,6 +239,7 @@ + .slot_reset = e1000_io_slot_reset, + .resume = e1000_io_resume, + }; ++#endif + + static struct pci_driver e1000_driver = { + .name = e1000_driver_name, +@@ -196,12 +247,16 @@ + .probe = e1000_probe, + .remove = __devexit_p(e1000_remove), + #ifdef CONFIG_PM +- /* Power Managment Hooks */ ++ /* Power Management Hooks */ + .suspend = e1000_suspend, + .resume = e1000_resume, + #endif ++#ifndef USE_REBOOT_NOTIFIER + .shutdown = e1000_shutdown, ++#endif ++#ifdef HAVE_PCI_ERS + .err_handler = &e1000_err_handler ++#endif + }; + + MODULE_AUTHOR("Intel Corporation, "); +@@ -219,7 +274,6 @@ + * e1000_init_module is the first routine called when the driver is + * loaded. All it does is register with the PCI subsystem. + **/ +- + static int __init e1000_init_module(void) + { + int ret; +@@ -229,6 +283,11 @@ + printk(KERN_INFO "%s\n", e1000_copyright); + + ret = pci_register_driver(&e1000_driver); ++#ifdef USE_REBOOT_NOTIFIER ++ if (ret >= 0) { ++ register_reboot_notifier(&e1000_notifier_reboot); ++ } ++#endif + if (copybreak != COPYBREAK_DEFAULT) { + if (copybreak == 0) + printk(KERN_INFO "e1000: copybreak disabled\n"); +@@ -247,9 +306,11 @@ + * e1000_exit_module is called just before the driver is removed + * from memory. + **/ +- + static void __exit e1000_exit_module(void) + { ++#ifdef USE_REBOOT_NOTIFIER ++ unregister_reboot_notifier(&e1000_notifier_reboot); ++#endif + pci_unregister_driver(&e1000_driver); + } + +@@ -257,28 +318,16 @@ + + static int e1000_request_irq(struct e1000_adapter *adapter) + { +- struct e1000_hw *hw = &adapter->hw; +- struct net_device *netdev = adapter->netdev; +- irq_handler_t handler = e1000_intr; +- int irq_flags = IRQF_SHARED; +- int err; +- +- if (hw->mac_type >= e1000_82571) { +- adapter->have_msi = !pci_enable_msi(adapter->pdev); +- if (adapter->have_msi) { +- handler = e1000_intr_msi; +- irq_flags = 0; +- } +- } +- +- err = request_irq(adapter->pdev->irq, handler, irq_flags, netdev->name, +- netdev); +- if (err) { +- if (adapter->have_msi) +- pci_disable_msi(adapter->pdev); +- DPRINTK(PROBE, ERR, +- "Unable to allocate interrupt Error: %d\n", err); +- } ++ struct net_device *netdev = adapter->netdev; ++ int irq_flags, err = 0; ++ ++ irq_flags = IRQF_SHARED; ++ ++ err = request_irq(adapter->pdev->irq, &e1000_intr, irq_flags, ++ netdev->name, netdev); ++ if (err) ++ DPRINTK(PROBE, ERR, "Unable to allocate interrupt Error: %d\n", ++ err); + + return err; + } +@@ -288,22 +337,16 @@ + struct net_device *netdev = adapter->netdev; + + free_irq(adapter->pdev->irq, netdev); +- +- if (adapter->have_msi) +- pci_disable_msi(adapter->pdev); + } + + /** + * e1000_irq_disable - Mask off interrupt generation on the NIC + * @adapter: board private structure + **/ +- + static void e1000_irq_disable(struct e1000_adapter *adapter) + { +- struct e1000_hw *hw = &adapter->hw; +- +- ew32(IMC, ~0); +- E1000_WRITE_FLUSH(); ++ E1000_WRITE_REG(&adapter->hw, E1000_IMC, ~0); ++ E1000_WRITE_FLUSH(&adapter->hw); + synchronize_irq(adapter->pdev->irq); + } + +@@ -314,166 +357,82 @@ + + static void e1000_irq_enable(struct e1000_adapter *adapter) + { +- struct e1000_hw *hw = &adapter->hw; +- +- ew32(IMS, IMS_ENABLE_MASK); +- E1000_WRITE_FLUSH(); +-} ++ E1000_WRITE_REG(&adapter->hw, E1000_IMS, IMS_ENABLE_MASK); ++ E1000_WRITE_FLUSH(&adapter->hw); ++} ++#ifdef NETIF_F_HW_VLAN_TX + + static void e1000_update_mng_vlan(struct e1000_adapter *adapter) + { +- struct e1000_hw *hw = &adapter->hw; +- struct net_device *netdev = adapter->netdev; +- u16 vid = hw->mng_cookie.vlan_id; ++ struct net_device *netdev = adapter->netdev; ++ u16 vid = adapter->hw.mng_cookie.vlan_id; + u16 old_vid = adapter->mng_vlan_id; + if (adapter->vlgrp) { + if (!vlan_group_get_device(adapter->vlgrp, vid)) { +- if (hw->mng_cookie.status & +- E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT) { ++ if (adapter->hw.mng_cookie.status & ++ E1000_MNG_DHCP_COOKIE_STATUS_VLAN) { + e1000_vlan_rx_add_vid(netdev, vid); + adapter->mng_vlan_id = vid; +- } else ++ } else { + adapter->mng_vlan_id = E1000_MNG_VLAN_NONE; ++ } + + if ((old_vid != (u16)E1000_MNG_VLAN_NONE) && + (vid != old_vid) && + !vlan_group_get_device(adapter->vlgrp, old_vid)) + e1000_vlan_rx_kill_vid(netdev, old_vid); +- } else ++ } else { + adapter->mng_vlan_id = vid; +- } +-} +- +-/** +- * e1000_release_hw_control - release control of the h/w to f/w +- * @adapter: address of board private structure +- * +- * e1000_release_hw_control resets {CTRL_EXT|FWSM}:DRV_LOAD bit. +- * For ASF and Pass Through versions of f/w this means that the +- * driver is no longer loaded. For AMT version (only with 82573) i +- * of the f/w this means that the network i/f is closed. +- * +- **/ +- +-static void e1000_release_hw_control(struct e1000_adapter *adapter) +-{ +- u32 ctrl_ext; +- u32 swsm; +- struct e1000_hw *hw = &adapter->hw; +- +- /* Let firmware taken over control of h/w */ +- switch (hw->mac_type) { +- case e1000_82573: +- swsm = er32(SWSM); +- ew32(SWSM, swsm & ~E1000_SWSM_DRV_LOAD); +- break; +- case e1000_82571: +- case e1000_82572: +- case e1000_80003es2lan: +- case e1000_ich8lan: +- ctrl_ext = er32(CTRL_EXT); +- ew32(CTRL_EXT, ctrl_ext & ~E1000_CTRL_EXT_DRV_LOAD); +- break; +- default: +- break; +- } +-} +- +-/** +- * e1000_get_hw_control - get control of the h/w from f/w +- * @adapter: address of board private structure +- * +- * e1000_get_hw_control sets {CTRL_EXT|FWSM}:DRV_LOAD bit. +- * For ASF and Pass Through versions of f/w this means that +- * the driver is loaded. For AMT version (only with 82573) +- * of the f/w this means that the network i/f is open. +- * +- **/ +- +-static void e1000_get_hw_control(struct e1000_adapter *adapter) +-{ +- u32 ctrl_ext; +- u32 swsm; +- struct e1000_hw *hw = &adapter->hw; +- +- /* Let firmware know the driver has taken over */ +- switch (hw->mac_type) { +- case e1000_82573: +- swsm = er32(SWSM); +- ew32(SWSM, swsm | E1000_SWSM_DRV_LOAD); +- break; +- case e1000_82571: +- case e1000_82572: +- case e1000_80003es2lan: +- case e1000_ich8lan: +- ctrl_ext = er32(CTRL_EXT); +- ew32(CTRL_EXT, ctrl_ext | E1000_CTRL_EXT_DRV_LOAD); +- break; +- default: +- break; +- } +-} ++ } ++ } ++} ++#endif + + static void e1000_init_manageability(struct e1000_adapter *adapter) + { +- struct e1000_hw *hw = &adapter->hw; +- + if (adapter->en_mng_pt) { +- u32 manc = er32(MANC); ++ u32 manc = E1000_READ_REG(&adapter->hw, E1000_MANC); + + /* disable hardware interception of ARP */ + manc &= ~(E1000_MANC_ARP_EN); + +- /* enable receiving management packets to the host */ +- /* this will probably generate destination unreachable messages +- * from the host OS, but the packets will be handled on SMBUS */ +- if (hw->has_manc2h) { +- u32 manc2h = er32(MANC2H); +- +- manc |= E1000_MANC_EN_MNG2HOST; +-#define E1000_MNG2HOST_PORT_623 (1 << 5) +-#define E1000_MNG2HOST_PORT_664 (1 << 6) +- manc2h |= E1000_MNG2HOST_PORT_623; +- manc2h |= E1000_MNG2HOST_PORT_664; +- ew32(MANC2H, manc2h); +- } +- +- ew32(MANC, manc); ++ E1000_WRITE_REG(&adapter->hw, E1000_MANC, manc); + } + } + + static void e1000_release_manageability(struct e1000_adapter *adapter) + { +- struct e1000_hw *hw = &adapter->hw; +- + if (adapter->en_mng_pt) { +- u32 manc = er32(MANC); ++ u32 manc = E1000_READ_REG(&adapter->hw, E1000_MANC); + + /* re-enable hardware interception of ARP */ + manc |= E1000_MANC_ARP_EN; + +- if (hw->has_manc2h) +- manc &= ~E1000_MANC_EN_MNG2HOST; +- +- /* don't explicitly have to mess with MANC2H since +- * MANC has an enable disable that gates MANC2H */ +- +- ew32(MANC, manc); ++ /* This is asymmetric with init_manageability, as we want to ++ * ensure that MNG2HOST filters are still enabled after this ++ * driver is unloaded as other host drivers such as PXE also ++ * may require these filters. */ ++ ++ /* XXX stop the hardware watchdog ? */ ++ ++ E1000_WRITE_REG(&adapter->hw, E1000_MANC, manc); + } + } + + /** + * e1000_configure - configure the hardware for RX and TX +- * @adapter = private board structure ++ * @adapter: private board structure + **/ + static void e1000_configure(struct e1000_adapter *adapter) + { + struct net_device *netdev = adapter->netdev; + int i; + +- e1000_set_rx_mode(netdev); +- ++ e1000_set_multi(netdev); ++ ++#ifdef NETIF_F_HW_VLAN_TX + e1000_restore_vlan(adapter); ++#endif + e1000_init_manageability(adapter); + + e1000_configure_tx(adapter); +@@ -488,108 +447,77 @@ + E1000_DESC_UNUSED(ring)); + } + ++ + adapter->tx_queue_len = netdev->tx_queue_len; + } + ++static void e1000_napi_enable_all(struct e1000_adapter *adapter) ++{ ++#ifdef CONFIG_E1000_NAPI ++ int i; ++ for (i = 0; i < adapter->num_rx_queues; i++) ++ napi_enable(&adapter->rx_ring[i].napi); ++#endif ++} ++ ++static void e1000_napi_disable_all(struct e1000_adapter *adapter) ++{ ++#ifdef CONFIG_E1000_NAPI ++ int i; ++ for (i = 0; i < adapter->num_rx_queues; i++) ++ napi_disable(&adapter->rx_ring[i].napi); ++#endif ++} ++ + int e1000_up(struct e1000_adapter *adapter) + { +- struct e1000_hw *hw = &adapter->hw; +- + /* hardware has been reset, we need to reload some things */ + e1000_configure(adapter); + +- clear_bit(__E1000_DOWN, &adapter->flags); +- +- napi_enable(&adapter->napi); ++ clear_bit(__E1000_DOWN, &adapter->state); ++ ++ e1000_napi_enable_all(adapter); + + e1000_irq_enable(adapter); + + /* fire a link change interrupt to start the watchdog */ +- ew32(ICS, E1000_ICS_LSC); +- return 0; +-} +- +-/** +- * e1000_power_up_phy - restore link in case the phy was powered down +- * @adapter: address of board private structure +- * +- * The phy may be powered down to save power and turn off link when the +- * driver is unloaded and wake on lan is not enabled (among others) +- * *** this routine MUST be followed by a call to e1000_reset *** +- * +- **/ +- +-void e1000_power_up_phy(struct e1000_adapter *adapter) +-{ +- struct e1000_hw *hw = &adapter->hw; +- u16 mii_reg = 0; +- +- /* Just clear the power down bit to wake the phy back up */ +- if (hw->media_type == e1000_media_type_copper) { +- /* according to the manual, the phy will retain its +- * settings across a power-down/up cycle */ +- e1000_read_phy_reg(hw, PHY_CTRL, &mii_reg); +- mii_reg &= ~MII_CR_POWER_DOWN; +- e1000_write_phy_reg(hw, PHY_CTRL, mii_reg); +- } +-} +- +-static void e1000_power_down_phy(struct e1000_adapter *adapter) +-{ +- struct e1000_hw *hw = &adapter->hw; +- +- /* Power down the PHY so no link is implied when interface is down * +- * The PHY cannot be powered down if any of the following is true * +- * (a) WoL is enabled +- * (b) AMT is active +- * (c) SoL/IDER session is active */ +- if (!adapter->wol && hw->mac_type >= e1000_82540 && +- hw->media_type == e1000_media_type_copper) { +- u16 mii_reg = 0; +- +- switch (hw->mac_type) { +- case e1000_82540: +- case e1000_82545: +- case e1000_82545_rev_3: +- case e1000_82546: +- case e1000_82546_rev_3: +- case e1000_82541: +- case e1000_82541_rev_2: +- case e1000_82547: +- case e1000_82547_rev_2: +- if (er32(MANC) & E1000_MANC_SMBUS_EN) +- goto out; +- break; +- case e1000_82571: +- case e1000_82572: +- case e1000_82573: +- case e1000_80003es2lan: +- case e1000_ich8lan: +- if (e1000_check_mng_mode(hw) || +- e1000_check_phy_reset_block(hw)) +- goto out; +- break; +- default: +- goto out; +- } +- e1000_read_phy_reg(hw, PHY_CTRL, &mii_reg); +- mii_reg |= MII_CR_POWER_DOWN; +- e1000_write_phy_reg(hw, PHY_CTRL, mii_reg); +- mdelay(1); +- } +-out: +- return; ++ E1000_WRITE_REG(&adapter->hw, E1000_ICS, E1000_ICS_LSC); ++ return 0; + } + + void e1000_down(struct e1000_adapter *adapter) + { + struct net_device *netdev = adapter->netdev; ++ u32 tctl, rctl; + + /* signal that we're down so the interrupt handler does not + * reschedule our watchdog timer */ +- set_bit(__E1000_DOWN, &adapter->flags); +- +- napi_disable(&adapter->napi); ++ set_bit(__E1000_DOWN, &adapter->state); ++ ++ /* disable receives in the hardware */ ++ rctl = E1000_READ_REG(&adapter->hw, E1000_RCTL); ++ E1000_WRITE_REG(&adapter->hw, E1000_RCTL, rctl & ~E1000_RCTL_EN); ++ /* flush and sleep below */ ++ ++#ifdef NETIF_F_LLTX ++#ifdef CONFIG_NETDEVICES_MULTIQUEUE ++ netif_stop_subqueue(netdev, 0); ++#else ++ netif_stop_queue(netdev); ++#endif ++#else ++ netif_tx_disable(netdev); ++#endif ++ ++ /* disable transmits in the hardware */ ++ tctl = E1000_READ_REG(&adapter->hw, E1000_TCTL); ++ tctl &= ~E1000_TCTL_EN; ++ E1000_WRITE_REG(&adapter->hw, E1000_TCTL, tctl); ++ /* flush both disables and wait for them to finish */ ++ E1000_WRITE_FLUSH(&adapter->hw); ++ msleep(10); ++ ++ e1000_napi_disable_all(adapter); + + e1000_irq_disable(adapter); + +@@ -598,10 +526,9 @@ + del_timer_sync(&adapter->phy_info_timer); + + netdev->tx_queue_len = adapter->tx_queue_len; ++ netif_carrier_off(netdev); + adapter->link_speed = 0; + adapter->link_duplex = 0; +- netif_carrier_off(netdev); +- netif_stop_queue(netdev); + + e1000_reset(adapter); + e1000_clean_all_tx_rings(adapter); +@@ -611,33 +538,33 @@ + void e1000_reinit_locked(struct e1000_adapter *adapter) + { + WARN_ON(in_interrupt()); +- while (test_and_set_bit(__E1000_RESETTING, &adapter->flags)) ++ while (test_and_set_bit(__E1000_RESETTING, &adapter->state)) + msleep(1); + e1000_down(adapter); + e1000_up(adapter); +- clear_bit(__E1000_RESETTING, &adapter->flags); ++ clear_bit(__E1000_RESETTING, &adapter->state); + } + + void e1000_reset(struct e1000_adapter *adapter) + { +- struct e1000_hw *hw = &adapter->hw; ++ struct e1000_mac_info *mac = &adapter->hw.mac; ++ struct e1000_fc_info *fc = &adapter->hw.fc; + u32 pba = 0, tx_space, min_tx_space, min_rx_space; +- u16 fc_high_water_mark = E1000_FC_HIGH_DIFF; +- bool legacy_pba_adjust = false; ++ bool legacy_pba_adjust = FALSE; ++ u16 hwm; + + /* Repartition Pba for greater than 9k mtu + * To take effect CTRL.RST is required. + */ + +- switch (hw->mac_type) { +- case e1000_82542_rev2_0: +- case e1000_82542_rev2_1: ++ switch (mac->type) { ++ case e1000_82542: + case e1000_82543: + case e1000_82544: + case e1000_82540: + case e1000_82541: + case e1000_82541_rev_2: +- legacy_pba_adjust = true; ++ legacy_pba_adjust = TRUE; + pba = E1000_PBA_48K; + break; + case e1000_82545: +@@ -648,57 +575,49 @@ + break; + case e1000_82547: + case e1000_82547_rev_2: +- legacy_pba_adjust = true; ++ legacy_pba_adjust = TRUE; + pba = E1000_PBA_30K; + break; +- case e1000_82571: +- case e1000_82572: +- case e1000_80003es2lan: +- pba = E1000_PBA_38K; +- break; +- case e1000_82573: +- pba = E1000_PBA_20K; +- break; +- case e1000_ich8lan: +- pba = E1000_PBA_8K; + case e1000_undefined: + case e1000_num_macs: + break; + } + +- if (legacy_pba_adjust) { +- if (adapter->netdev->mtu > E1000_RXBUFFER_8192) ++ if (legacy_pba_adjust == TRUE) { ++ if (adapter->max_frame_size > E1000_RXBUFFER_8192) + pba -= 8; /* allocate more FIFO for Tx */ + +- if (hw->mac_type == e1000_82547) { ++ if (mac->type == e1000_82547) { + adapter->tx_fifo_head = 0; + adapter->tx_head_addr = pba << E1000_TX_HEAD_ADDR_SHIFT; + adapter->tx_fifo_size = + (E1000_PBA_40K - pba) << E1000_PBA_BYTES_SHIFT; + atomic_set(&adapter->tx_fifo_stall, 0); + } +- } else if (hw->max_frame_size > MAXIMUM_ETHERNET_FRAME_SIZE) { ++ } else if (adapter->max_frame_size > ETH_FRAME_LEN + ETH_FCS_LEN) { + /* adjust PBA for jumbo frames */ +- ew32(PBA, pba); ++ E1000_WRITE_REG(&adapter->hw, E1000_PBA, pba); + + /* To maintain wire speed transmits, the Tx FIFO should be +- * large enough to accomodate two full transmit packets, ++ * large enough to accommodate two full transmit packets, + * rounded up to the next 1KB and expressed in KB. Likewise, +- * the Rx FIFO should be large enough to accomodate at least ++ * the Rx FIFO should be large enough to accommodate at least + * one full receive packet and is similarly rounded up and + * expressed in KB. */ +- pba = er32(PBA); ++ pba = E1000_READ_REG(&adapter->hw, E1000_PBA); + /* upper 16 bits has Tx packet buffer allocation size in KB */ + tx_space = pba >> 16; + /* lower 16 bits has Rx packet buffer allocation size in KB */ + pba &= 0xffff; +- /* don't include ethernet FCS because hardware appends/strips */ +- min_rx_space = adapter->netdev->mtu + ENET_HEADER_SIZE + +- VLAN_TAG_SIZE; +- min_tx_space = min_rx_space; +- min_tx_space *= 2; ++ /* the tx fifo also stores 16 bytes of information about the tx ++ * but don't include ethernet FCS because hardware appends it */ ++ min_tx_space = (adapter->max_frame_size + ++ sizeof(struct e1000_tx_desc) - ++ ETH_FCS_LEN) * 2; + min_tx_space = ALIGN(min_tx_space, 1024); + min_tx_space >>= 10; ++ /* software strips receive CRC, so leave room for it */ ++ min_rx_space = adapter->max_frame_size; + min_rx_space = ALIGN(min_rx_space, 1024); + min_rx_space >>= 10; + +@@ -710,7 +629,7 @@ + pba = pba - (min_tx_space - tx_space); + + /* PCI/PCIx hardware has PBA alignment constraints */ +- switch (hw->mac_type) { ++ switch (mac->type) { + case e1000_82545 ... e1000_82546_rev_3: + pba &= ~(E1000_PBA_8K - 1); + break; +@@ -721,177 +640,62 @@ + /* if short on rx space, rx wins and must trump tx + * adjustment or use Early Receive if available */ + if (pba < min_rx_space) { +- switch (hw->mac_type) { +- case e1000_82573: +- /* ERT enabled in e1000_configure_rx */ +- break; +- default: +- pba = min_rx_space; +- break; +- } +- } +- } +- } +- +- ew32(PBA, pba); ++ pba = min_rx_space; ++ } ++ } ++ } ++ ++ E1000_WRITE_REG(&adapter->hw, E1000_PBA, pba); + + /* flow control settings */ +- /* Set the FC high water mark to 90% of the FIFO size. +- * Required to clear last 3 LSB */ +- fc_high_water_mark = ((pba * 9216)/10) & 0xFFF8; +- /* We can't use 90% on small FIFOs because the remainder +- * would be less than 1 full frame. In this case, we size +- * it to allow at least a full frame above the high water +- * mark. */ +- if (pba < E1000_PBA_16K) +- fc_high_water_mark = (pba * 1024) - 1600; +- +- hw->fc_high_water = fc_high_water_mark; +- hw->fc_low_water = fc_high_water_mark - 8; +- if (hw->mac_type == e1000_80003es2lan) +- hw->fc_pause_time = 0xFFFF; +- else +- hw->fc_pause_time = E1000_FC_PAUSE_TIME; +- hw->fc_send_xon = 1; +- hw->fc = hw->original_fc; ++ /* The high water mark must be low enough to fit one full frame ++ * (or the size used for early receive) above it in the Rx FIFO. ++ * Set it to the lower of: ++ * - 90% of the Rx FIFO size, and ++ * - the full Rx FIFO size minus the early receive size (for parts ++ * with ERT support assuming ERT set to E1000_ERT_2048), or ++ * - the full Rx FIFO size minus one full frame */ ++ hwm = min(((pba << 10) * 9 / 10), ++ ((pba << 10) - adapter->max_frame_size)); ++ ++ fc->high_water = hwm & 0xFFF8; /* 8-byte granularity */ ++ fc->low_water = fc->high_water - 8; ++ ++ fc->pause_time = E1000_FC_PAUSE_TIME; ++ fc->send_xon = 1; ++ fc->current_mode = fc->requested_mode; + + /* Allow time for pending master requests to run */ +- e1000_reset_hw(hw); +- if (hw->mac_type >= e1000_82544) +- ew32(WUC, 0); +- +- if (e1000_init_hw(hw)) ++ e1000_reset_hw(&adapter->hw); ++ ++ if (mac->type >= e1000_82544) ++ E1000_WRITE_REG(&adapter->hw, E1000_WUC, 0); ++ ++ if (e1000_init_hw(&adapter->hw)) + DPRINTK(PROBE, ERR, "Hardware Error\n"); ++#ifdef NETIF_F_HW_VLAN_TX + e1000_update_mng_vlan(adapter); +- ++#endif + /* if (adapter->hwflags & HWFLAGS_PHY_PWR_BIT) { */ +- if (hw->mac_type >= e1000_82544 && +- hw->mac_type <= e1000_82547_rev_2 && +- hw->autoneg == 1 && +- hw->autoneg_advertised == ADVERTISE_1000_FULL) { +- u32 ctrl = er32(CTRL); ++ if (mac->type >= e1000_82544 && ++ mac->type <= e1000_82547_rev_2 && ++ mac->autoneg == 1 && ++ adapter->hw.phy.autoneg_advertised == ADVERTISE_1000_FULL) { ++ u32 ctrl = E1000_READ_REG(&adapter->hw, E1000_CTRL); + /* clear phy power management bit if we are in gig only mode, + * which if enabled will attempt negotiation to 100Mb, which + * can cause a loss of link at power off or driver unload */ + ctrl &= ~E1000_CTRL_SWDPIN3; +- ew32(CTRL, ctrl); ++ E1000_WRITE_REG(&adapter->hw, E1000_CTRL, ctrl); + } + + /* Enable h/w to recognize an 802.1Q VLAN Ethernet packet */ +- ew32(VET, ETHERNET_IEEE_VLAN_TYPE); +- +- e1000_reset_adaptive(hw); +- e1000_phy_get_info(hw, &adapter->phy_info); +- +- if (!adapter->smart_power_down && +- (hw->mac_type == e1000_82571 || +- hw->mac_type == e1000_82572)) { +- u16 phy_data = 0; +- /* speed up time to link by disabling smart power down, ignore +- * the return value of this function because there is nothing +- * different we would do if it failed */ +- e1000_read_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT, +- &phy_data); +- phy_data &= ~IGP02E1000_PM_SPD; +- e1000_write_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT, +- phy_data); +- } ++ E1000_WRITE_REG(&adapter->hw, E1000_VET, ETHERNET_IEEE_VLAN_TYPE); ++ ++ e1000_reset_adaptive(&adapter->hw); ++ e1000_get_phy_info(&adapter->hw); + + e1000_release_manageability(adapter); +-} +- +-/** +- * Dump the eeprom for users having checksum issues +- **/ +-static void e1000_dump_eeprom(struct e1000_adapter *adapter) +-{ +- struct net_device *netdev = adapter->netdev; +- struct ethtool_eeprom eeprom; +- const struct ethtool_ops *ops = netdev->ethtool_ops; +- u8 *data; +- int i; +- u16 csum_old, csum_new = 0; +- +- eeprom.len = ops->get_eeprom_len(netdev); +- eeprom.offset = 0; +- +- data = kmalloc(eeprom.len, GFP_KERNEL); +- if (!data) { +- printk(KERN_ERR "Unable to allocate memory to dump EEPROM" +- " data\n"); +- return; +- } +- +- ops->get_eeprom(netdev, &eeprom, data); +- +- csum_old = (data[EEPROM_CHECKSUM_REG * 2]) + +- (data[EEPROM_CHECKSUM_REG * 2 + 1] << 8); +- for (i = 0; i < EEPROM_CHECKSUM_REG * 2; i += 2) +- csum_new += data[i] + (data[i + 1] << 8); +- csum_new = EEPROM_SUM - csum_new; +- +- printk(KERN_ERR "/*********************/\n"); +- printk(KERN_ERR "Current EEPROM Checksum : 0x%04x\n", csum_old); +- printk(KERN_ERR "Calculated : 0x%04x\n", csum_new); +- +- printk(KERN_ERR "Offset Values\n"); +- printk(KERN_ERR "======== ======\n"); +- print_hex_dump(KERN_ERR, "", DUMP_PREFIX_OFFSET, 16, 1, data, 128, 0); +- +- printk(KERN_ERR "Include this output when contacting your support " +- "provider.\n"); +- printk(KERN_ERR "This is not a software error! Something bad " +- "happened to your hardware or\n"); +- printk(KERN_ERR "EEPROM image. Ignoring this " +- "problem could result in further problems,\n"); +- printk(KERN_ERR "possibly loss of data, corruption or system hangs!\n"); +- printk(KERN_ERR "The MAC Address will be reset to 00:00:00:00:00:00, " +- "which is invalid\n"); +- printk(KERN_ERR "and requires you to set the proper MAC " +- "address manually before continuing\n"); +- printk(KERN_ERR "to enable this network device.\n"); +- printk(KERN_ERR "Please inspect the EEPROM dump and report the issue " +- "to your hardware vendor\n"); +- printk(KERN_ERR "or Intel Customer Support.\n"); +- printk(KERN_ERR "/*********************/\n"); +- +- kfree(data); +-} +- +-/** +- * e1000_is_need_ioport - determine if an adapter needs ioport resources or not +- * @pdev: PCI device information struct +- * +- * Return true if an adapter needs ioport resources +- **/ +-static int e1000_is_need_ioport(struct pci_dev *pdev) +-{ +- switch (pdev->device) { +- case E1000_DEV_ID_82540EM: +- case E1000_DEV_ID_82540EM_LOM: +- case E1000_DEV_ID_82540EP: +- case E1000_DEV_ID_82540EP_LOM: +- case E1000_DEV_ID_82540EP_LP: +- case E1000_DEV_ID_82541EI: +- case E1000_DEV_ID_82541EI_MOBILE: +- case E1000_DEV_ID_82541ER: +- case E1000_DEV_ID_82541ER_LOM: +- case E1000_DEV_ID_82541GI: +- case E1000_DEV_ID_82541GI_LF: +- case E1000_DEV_ID_82541GI_MOBILE: +- case E1000_DEV_ID_82544EI_COPPER: +- case E1000_DEV_ID_82544EI_FIBER: +- case E1000_DEV_ID_82544GC_COPPER: +- case E1000_DEV_ID_82544GC_LOM: +- case E1000_DEV_ID_82545EM_COPPER: +- case E1000_DEV_ID_82545EM_FIBER: +- case E1000_DEV_ID_82546EB_COPPER: +- case E1000_DEV_ID_82546EB_FIBER: +- case E1000_DEV_ID_82546EB_QUAD_COPPER: +- return true; +- default: +- return false; +- } + } + + /** +@@ -906,50 +710,32 @@ + * and a hardware reset occur. + **/ + static int __devinit e1000_probe(struct pci_dev *pdev, +- const struct pci_device_id *ent) ++ const struct pci_device_id *ent) + { + struct net_device *netdev; + struct e1000_adapter *adapter; +- struct e1000_hw *hw; + + static int cards_found = 0; + static int global_quad_port_a = 0; /* global ksp3 port a indication */ + int i, err, pci_using_dac; + u16 eeprom_data = 0; + u16 eeprom_apme_mask = E1000_EEPROM_APME; +- int bars, need_ioport; +- DECLARE_MAC_BUF(mac); +- +- /* do not allocate ioport bars when not needed */ +- need_ioport = e1000_is_need_ioport(pdev); +- if (need_ioport) { +- bars = pci_select_bars(pdev, IORESOURCE_MEM | IORESOURCE_IO); +- err = pci_enable_device(pdev); +- } else { +- bars = pci_select_bars(pdev, IORESOURCE_MEM); +- err = pci_enable_device_mem(pdev); +- } +- if (err) ++ if ((err = pci_enable_device(pdev))) + return err; + +- if (!pci_set_dma_mask(pdev, DMA_64BIT_MASK) && +- !pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK)) { ++ if (!(err = pci_set_dma_mask(pdev, DMA_64BIT_MASK)) && ++ !(err = pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK))) { + pci_using_dac = 1; + } else { +- err = pci_set_dma_mask(pdev, DMA_32BIT_MASK); +- if (err) { +- err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK); +- if (err) { +- E1000_ERR("No usable DMA configuration, " +- "aborting\n"); +- goto err_dma; +- } ++ if ((err = pci_set_dma_mask(pdev, DMA_32BIT_MASK)) && ++ (err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK))) { ++ E1000_ERR("No usable DMA configuration, aborting\n"); ++ goto err_dma; + } + pci_using_dac = 0; + } + +- err = pci_request_selected_regions(pdev, bars, e1000_driver_name); +- if (err) ++ if ((err = pci_request_regions(pdev, e1000_driver_name))) + goto err_pci_reg; + + pci_set_master(pdev); +@@ -959,33 +745,28 @@ + if (!netdev) + goto err_alloc_etherdev; + ++ SET_MODULE_OWNER(netdev); + SET_NETDEV_DEV(netdev, &pdev->dev); + + pci_set_drvdata(pdev, netdev); + adapter = netdev_priv(netdev); + adapter->netdev = netdev; + adapter->pdev = pdev; ++ adapter->hw.back = adapter; + adapter->msg_enable = (1 << debug) - 1; +- adapter->bars = bars; +- adapter->need_ioport = need_ioport; +- +- hw = &adapter->hw; +- hw->back = adapter; + + err = -EIO; +- hw->hw_addr = ioremap(pci_resource_start(pdev, BAR_0), +- pci_resource_len(pdev, BAR_0)); +- if (!hw->hw_addr) ++ adapter->hw.hw_addr = ioremap(pci_resource_start(pdev, BAR_0), ++ pci_resource_len(pdev, BAR_0)); ++ if (!adapter->hw.hw_addr) + goto err_ioremap; + +- if (adapter->need_ioport) { +- for (i = BAR_1; i <= BAR_5; i++) { +- if (pci_resource_len(pdev, i) == 0) +- continue; +- if (pci_resource_flags(pdev, i) & IORESOURCE_IO) { +- hw->io_base = pci_resource_start(pdev, i); +- break; +- } ++ for (i = BAR_1; i <= BAR_5; i++) { ++ if (pci_resource_len(pdev, i) == 0) ++ continue; ++ if (pci_resource_flags(pdev, i) & IORESOURCE_IO) { ++ adapter->hw.io_base = pci_resource_start(pdev, i); ++ break; + } + } + +@@ -993,17 +774,20 @@ + netdev->stop = &e1000_close; + netdev->hard_start_xmit = &e1000_xmit_frame; + netdev->get_stats = &e1000_get_stats; +- netdev->set_rx_mode = &e1000_set_rx_mode; ++ netdev->set_multicast_list = &e1000_set_multi; + netdev->set_mac_address = &e1000_set_mac; + netdev->change_mtu = &e1000_change_mtu; + netdev->do_ioctl = &e1000_ioctl; + e1000_set_ethtool_ops(netdev); ++#ifdef HAVE_TX_TIMEOUT + netdev->tx_timeout = &e1000_tx_timeout; + netdev->watchdog_timeo = 5 * HZ; +- netif_napi_add(netdev, &adapter->napi, e1000_clean, 64); ++#endif ++#ifdef NETIF_F_HW_VLAN_TX + netdev->vlan_rx_register = e1000_vlan_rx_register; + netdev->vlan_rx_add_vid = e1000_vlan_rx_add_vid; + netdev->vlan_rx_kill_vid = e1000_vlan_rx_kill_vid; ++#endif + #ifdef CONFIG_NET_POLL_CONTROLLER + netdev->poll_controller = e1000_netpoll; + #endif +@@ -1012,90 +796,120 @@ + adapter->bd_number = cards_found; + + /* setup the private structure */ +- +- err = e1000_sw_init(adapter); +- if (err) ++ if ((err = e1000_sw_init(adapter))) + goto err_sw_init; + + err = -EIO; +- /* Flash BAR mapping must happen after e1000_sw_init +- * because it depends on mac_type */ +- if ((hw->mac_type == e1000_ich8lan) && +- (pci_resource_flags(pdev, 1) & IORESOURCE_MEM)) { +- hw->flash_address = +- ioremap(pci_resource_start(pdev, 1), +- pci_resource_len(pdev, 1)); +- if (!hw->flash_address) +- goto err_flashmap; +- } +- +- if (e1000_check_phy_reset_block(hw)) ++ if ((err = e1000_init_mac_params(&adapter->hw))) ++ goto err_hw_init; ++ ++ if ((err = e1000_init_nvm_params(&adapter->hw))) ++ goto err_hw_init; ++ ++ if ((err = e1000_init_phy_params(&adapter->hw))) ++ goto err_hw_init; ++ ++ e1000_get_bus_info(&adapter->hw); ++ ++ e1000_init_script_state_82541(&adapter->hw, TRUE); ++ e1000_set_tbi_compatibility_82543(&adapter->hw, TRUE); ++ ++ adapter->hw.phy.autoneg_wait_to_complete = FALSE; ++ adapter->hw.mac.adaptive_ifs = TRUE; ++ ++ /* Copper options */ ++ ++ if (adapter->hw.phy.media_type == e1000_media_type_copper) { ++ adapter->hw.phy.mdix = AUTO_ALL_MODES; ++ adapter->hw.phy.disable_polarity_correction = FALSE; ++ adapter->hw.phy.ms_type = E1000_MASTER_SLAVE; ++ } ++ ++ if (e1000_check_reset_block(&adapter->hw)) + DPRINTK(PROBE, INFO, "PHY reset is blocked due to SOL/IDER session.\n"); + +- if (hw->mac_type >= e1000_82543) { ++#ifdef MAX_SKB_FRAGS ++ if (adapter->hw.mac.type >= e1000_82543) { ++#ifdef NETIF_F_HW_VLAN_TX + netdev->features = NETIF_F_SG | + NETIF_F_HW_CSUM | + NETIF_F_HW_VLAN_TX | + NETIF_F_HW_VLAN_RX | + NETIF_F_HW_VLAN_FILTER; +- if (hw->mac_type == e1000_ich8lan) +- netdev->features &= ~NETIF_F_HW_VLAN_FILTER; +- } +- +- if ((hw->mac_type >= e1000_82544) && +- (hw->mac_type != e1000_82547)) ++#else ++ netdev->features = NETIF_F_SG | NETIF_F_HW_CSUM; ++#endif ++ } ++ ++#ifdef NETIF_F_TSO ++ if ((adapter->hw.mac.type >= e1000_82544) && ++ (adapter->hw.mac.type != e1000_82547)) { ++ adapter->flags |= E1000_FLAG_HAS_TSO; + netdev->features |= NETIF_F_TSO; +- +- if (hw->mac_type > e1000_82547_rev_2) ++ } ++ ++#ifdef NETIF_F_TSO6 ++ if (adapter->hw.mac.type > e1000_82547_rev_2) { ++ adapter->flags |= E1000_FLAG_HAS_TSO6; + netdev->features |= NETIF_F_TSO6; ++ } ++#endif ++#endif + if (pci_using_dac) + netdev->features |= NETIF_F_HIGHDMA; + ++#endif ++#ifdef NETIF_F_LLTX + netdev->features |= NETIF_F_LLTX; +- +- adapter->en_mng_pt = e1000_enable_mng_pass_thru(hw); +- +- /* initialize eeprom parameters */ +- if (e1000_init_eeprom_params(hw)) { +- E1000_ERR("EEPROM initialization failed\n"); ++#endif ++ ++ /* Hardware features, flags and workarounds */ ++ if (adapter->hw.mac.type >= e1000_82540) { ++ adapter->flags |= E1000_FLAG_HAS_SMBUS; ++ adapter->flags |= E1000_FLAG_HAS_INTR_MODERATION; ++ } ++ ++ if (adapter->hw.mac.type == e1000_82543) ++ adapter->flags |= E1000_FLAG_BAD_TX_CARRIER_STATS_FD; ++ ++ adapter->en_mng_pt = e1000_enable_mng_pass_thru(&adapter->hw); ++ ++ /* before reading the NVM, reset the controller to ++ * put the device in a known good starting state */ ++ ++ e1000_reset_hw(&adapter->hw); ++ ++ /* make sure we don't intercept ARP packets until we're up */ ++ e1000_release_manageability(adapter); ++ ++ /* make sure the NVM is good */ ++ ++ if (e1000_validate_nvm_checksum(&adapter->hw) < 0) { ++ DPRINTK(PROBE, ERR, "The NVM Checksum Is Not Valid\n"); ++ err = -EIO; + goto err_eeprom; + } + +- /* before reading the EEPROM, reset the controller to +- * put the device in a known good starting state */ +- +- e1000_reset_hw(hw); +- +- /* make sure the EEPROM is good */ +- if (e1000_validate_eeprom_checksum(hw) < 0) { +- DPRINTK(PROBE, ERR, "The EEPROM Checksum Is Not Valid\n"); +- e1000_dump_eeprom(adapter); +- /* +- * set MAC address to all zeroes to invalidate and temporary +- * disable this device for the user. This blocks regular +- * traffic while still permitting ethtool ioctls from reaching +- * the hardware as well as allowing the user to run the +- * interface after manually setting a hw addr using +- * `ip set address` +- */ +- memset(hw->mac_addr, 0, netdev->addr_len); +- } else { +- /* copy the MAC address out of the EEPROM */ +- if (e1000_read_mac_addr(hw)) +- DPRINTK(PROBE, ERR, "EEPROM Read Error\n"); +- } +- /* don't block initalization here due to bad MAC address */ +- memcpy(netdev->dev_addr, hw->mac_addr, netdev->addr_len); +- memcpy(netdev->perm_addr, hw->mac_addr, netdev->addr_len); +- +- if (!is_valid_ether_addr(netdev->perm_addr)) ++ /* copy the MAC address out of the NVM */ ++ ++ if (e1000_read_mac_addr(&adapter->hw)) ++ DPRINTK(PROBE, ERR, "NVM Read Error\n"); ++ memcpy(netdev->dev_addr, adapter->hw.mac.addr, netdev->addr_len); ++#ifdef ETHTOOL_GPERMADDR ++ memcpy(netdev->perm_addr, adapter->hw.mac.addr, netdev->addr_len); ++ ++ if (!is_valid_ether_addr(netdev->perm_addr)) { ++#else ++ if (!is_valid_ether_addr(netdev->dev_addr)) { ++#endif + DPRINTK(PROBE, ERR, "Invalid MAC Address\n"); +- +- e1000_get_bus_info(hw); ++ err = -EIO; ++ goto err_eeprom; ++ } + + init_timer(&adapter->tx_fifo_stall_timer); + adapter->tx_fifo_stall_timer.function = &e1000_82547_tx_fifo_stall; +- adapter->tx_fifo_stall_timer.data = (unsigned long)adapter; ++ adapter->tx_fifo_stall_timer.data = (unsigned long) adapter; + + init_timer(&adapter->watchdog_timer); + adapter->watchdog_timer.function = &e1000_watchdog; +@@ -1103,9 +917,10 @@ + + init_timer(&adapter->phy_info_timer); + adapter->phy_info_timer.function = &e1000_update_phy_info; +- adapter->phy_info_timer.data = (unsigned long)adapter; ++ adapter->phy_info_timer.data = (unsigned long) adapter; + + INIT_WORK(&adapter->reset_task, e1000_reset_task); ++ INIT_WORK(&adapter->watchdog_task, e1000_watchdog_task); + + e1000_check_options(adapter); + +@@ -1114,34 +929,26 @@ + * enable the ACPI Magic Packet filter + */ + +- switch (hw->mac_type) { +- case e1000_82542_rev2_0: +- case e1000_82542_rev2_1: ++ switch (adapter->hw.mac.type) { ++ case e1000_82542: + case e1000_82543: + break; + case e1000_82544: +- e1000_read_eeprom(hw, +- EEPROM_INIT_CONTROL2_REG, 1, &eeprom_data); ++ e1000_read_nvm(&adapter->hw, ++ NVM_INIT_CONTROL2_REG, 1, &eeprom_data); + eeprom_apme_mask = E1000_EEPROM_82544_APM; +- break; +- case e1000_ich8lan: +- e1000_read_eeprom(hw, +- EEPROM_INIT_CONTROL1_REG, 1, &eeprom_data); +- eeprom_apme_mask = E1000_EEPROM_ICH8_APME; + break; + case e1000_82546: + case e1000_82546_rev_3: +- case e1000_82571: +- case e1000_80003es2lan: +- if (er32(STATUS) & E1000_STATUS_FUNC_1){ +- e1000_read_eeprom(hw, +- EEPROM_INIT_CONTROL3_PORT_B, 1, &eeprom_data); ++ if (adapter->hw.bus.func == 1) { ++ e1000_read_nvm(&adapter->hw, ++ NVM_INIT_CONTROL3_PORT_B, 1, &eeprom_data); + break; + } + /* Fall Through */ + default: +- e1000_read_eeprom(hw, +- EEPROM_INIT_CONTROL3_PORT_A, 1, &eeprom_data); ++ e1000_read_nvm(&adapter->hw, ++ NVM_INIT_CONTROL3_PORT_A, 1, &eeprom_data); + break; + } + if (eeprom_data & eeprom_apme_mask) +@@ -1156,22 +963,18 @@ + break; + case E1000_DEV_ID_82546EB_FIBER: + case E1000_DEV_ID_82546GB_FIBER: +- case E1000_DEV_ID_82571EB_FIBER: + /* Wake events only supported on port A for dual fiber + * regardless of eeprom setting */ +- if (er32(STATUS) & E1000_STATUS_FUNC_1) ++ if (E1000_READ_REG(&adapter->hw, E1000_STATUS) & ++ E1000_STATUS_FUNC_1) + adapter->eeprom_wol = 0; + break; + case E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3: +- case E1000_DEV_ID_82571EB_QUAD_COPPER: +- case E1000_DEV_ID_82571EB_QUAD_FIBER: +- case E1000_DEV_ID_82571EB_QUAD_COPPER_LOWPROFILE: +- case E1000_DEV_ID_82571PT_QUAD_COPPER: + /* if quad port adapter, disable WoL on all but port A */ + if (global_quad_port_a != 0) + adapter->eeprom_wol = 0; + else +- adapter->quad_port_a = 1; ++ adapter->flags |= E1000_FLAG_QUAD_PORT_A; + /* Reset for multiple quad port adapters */ + if (++global_quad_port_a == 4) + global_quad_port_a = 0; +@@ -1180,42 +983,29 @@ + + /* initialize the wol settings based on the eeprom settings */ + adapter->wol = adapter->eeprom_wol; +- device_set_wakeup_enable(&adapter->pdev->dev, adapter->wol); + + /* print bus type/speed/width info */ ++ { ++ struct e1000_hw *hw = &adapter->hw; + DPRINTK(PROBE, INFO, "(PCI%s:%s:%s) ", +- ((hw->bus_type == e1000_bus_type_pcix) ? "-X" : +- (hw->bus_type == e1000_bus_type_pci_express ? " Express":"")), +- ((hw->bus_speed == e1000_bus_speed_2500) ? "2.5Gb/s" : +- (hw->bus_speed == e1000_bus_speed_133) ? "133MHz" : +- (hw->bus_speed == e1000_bus_speed_120) ? "120MHz" : +- (hw->bus_speed == e1000_bus_speed_100) ? "100MHz" : +- (hw->bus_speed == e1000_bus_speed_66) ? "66MHz" : "33MHz"), +- ((hw->bus_width == e1000_bus_width_64) ? "64-bit" : +- (hw->bus_width == e1000_bus_width_pciex_4) ? "Width x4" : +- (hw->bus_width == e1000_bus_width_pciex_1) ? "Width x1" : ++ ((hw->bus.type == e1000_bus_type_pcix) ? "-X" : ++ (hw->bus.type == e1000_bus_type_pci_express ? " Express":"")), ++ ((hw->bus.speed == e1000_bus_speed_2500) ? "2.5Gb/s" : ++ (hw->bus.speed == e1000_bus_speed_133) ? "133MHz" : ++ (hw->bus.speed == e1000_bus_speed_120) ? "120MHz" : ++ (hw->bus.speed == e1000_bus_speed_100) ? "100MHz" : ++ (hw->bus.speed == e1000_bus_speed_66) ? "66MHz" : "33MHz"), ++ ((hw->bus.width == e1000_bus_width_64) ? "64-bit" : ++ (hw->bus.width == e1000_bus_width_pcie_x4) ? "Width x4" : ++ (hw->bus.width == e1000_bus_width_pcie_x1) ? "Width x1" : + "32-bit")); +- +- printk("%s\n", print_mac(mac, netdev->dev_addr)); +- +- if (hw->bus_type == e1000_bus_type_pci_express) { +- DPRINTK(PROBE, WARNING, "This device (id %04x:%04x) will no " +- "longer be supported by this driver in the future.\n", +- pdev->vendor, pdev->device); +- DPRINTK(PROBE, WARNING, "please use the \"e1000e\" " +- "driver instead.\n"); +- } ++ } ++ ++ for (i = 0; i < 6; i++) ++ printk("%2.2x%c", netdev->dev_addr[i], i == 5 ? '\n' : ':'); + + /* reset the hardware with the new settings */ + e1000_reset(adapter); +- +- /* If the controller is 82573 and f/w is AMT, do not set +- * DRV_LOAD until the interface is up. For all other cases, +- * let the f/w know that the h/w is now under the control +- * of the driver. */ +- if (hw->mac_type != e1000_82573 || +- !e1000_check_mng_mode(hw)) +- e1000_get_hw_control(adapter); + + /* tell the stack to leave us alone until e1000_open() is called */ + netif_carrier_off(netdev); +@@ -1232,26 +1022,22 @@ + return 0; + + err_register: +- e1000_release_hw_control(adapter); ++err_hw_init: + err_eeprom: +- if (!e1000_check_phy_reset_block(hw)) +- e1000_phy_hw_reset(hw); +- +- if (hw->flash_address) +- iounmap(hw->flash_address); +-err_flashmap: +- for (i = 0; i < adapter->num_rx_queues; i++) +- dev_put(&adapter->polling_netdev[i]); ++ if (!e1000_check_reset_block(&adapter->hw)) ++ e1000_phy_hw_reset(&adapter->hw); ++ ++ if (adapter->hw.flash_address) ++ iounmap(adapter->hw.flash_address); + + kfree(adapter->tx_ring); + kfree(adapter->rx_ring); +- kfree(adapter->polling_netdev); + err_sw_init: +- iounmap(hw->hw_addr); ++ iounmap(adapter->hw.hw_addr); + err_ioremap: + free_netdev(netdev); + err_alloc_etherdev: +- pci_release_selected_regions(pdev, bars); ++ pci_release_regions(pdev); + err_pci_reg: + err_dma: + pci_disable_device(pdev); +@@ -1267,38 +1053,34 @@ + * Hot-Plug event, or because the driver is going to be removed from + * memory. + **/ +- + static void __devexit e1000_remove(struct pci_dev *pdev) + { + struct net_device *netdev = pci_get_drvdata(pdev); + struct e1000_adapter *adapter = netdev_priv(netdev); +- struct e1000_hw *hw = &adapter->hw; +- int i; +- +- cancel_work_sync(&adapter->reset_task); ++ ++ /* flush_scheduled work may reschedule our watchdog task, so ++ * explicitly disable watchdog tasks from being rescheduled */ ++ set_bit(__E1000_DOWN, &adapter->state); ++ del_timer_sync(&adapter->tx_fifo_stall_timer); ++ del_timer_sync(&adapter->watchdog_timer); ++ del_timer_sync(&adapter->phy_info_timer); ++ ++ flush_scheduled_work(); + + e1000_release_manageability(adapter); + +- /* Release control of h/w to f/w. If f/w is AMT enabled, this +- * would have already happened in close and is redundant. */ +- e1000_release_hw_control(adapter); +- +- for (i = 0; i < adapter->num_rx_queues; i++) +- dev_put(&adapter->polling_netdev[i]); +- + unregister_netdev(netdev); + +- if (!e1000_check_phy_reset_block(hw)) +- e1000_phy_hw_reset(hw); ++ if (!e1000_check_reset_block(&adapter->hw)) ++ e1000_phy_hw_reset(&adapter->hw); + + kfree(adapter->tx_ring); + kfree(adapter->rx_ring); +- kfree(adapter->polling_netdev); +- +- iounmap(hw->hw_addr); +- if (hw->flash_address) +- iounmap(hw->flash_address); +- pci_release_selected_regions(pdev, adapter->bars); ++ ++ iounmap(adapter->hw.hw_addr); ++ if (adapter->hw.flash_address) ++ iounmap(adapter->hw.flash_address); ++ pci_release_regions(pdev); + + free_netdev(netdev); + +@@ -1313,60 +1095,36 @@ + * Fields are initialized based on PCI device information and + * OS network device settings (MTU size). + **/ +- + static int __devinit e1000_sw_init(struct e1000_adapter *adapter) + { + struct e1000_hw *hw = &adapter->hw; + struct net_device *netdev = adapter->netdev; + struct pci_dev *pdev = adapter->pdev; +- int i; ++#ifdef CONFIG_E1000_NAPI ++ int i; ++#endif + + /* PCI config space info */ + + hw->vendor_id = pdev->vendor; + hw->device_id = pdev->device; + hw->subsystem_vendor_id = pdev->subsystem_vendor; +- hw->subsystem_id = pdev->subsystem_device; +- hw->revision_id = pdev->revision; +- +- pci_read_config_word(pdev, PCI_COMMAND, &hw->pci_cmd_word); ++ hw->subsystem_device_id = pdev->subsystem_device; ++ ++ pci_read_config_byte(pdev, PCI_REVISION_ID, &hw->revision_id); ++ ++ pci_read_config_word(pdev, PCI_COMMAND, &hw->bus.pci_cmd_word); + + adapter->rx_buffer_len = MAXIMUM_ETHERNET_VLAN_SIZE; +- adapter->rx_ps_bsize0 = E1000_RXBUFFER_128; +- hw->max_frame_size = netdev->mtu + +- ENET_HEADER_SIZE + ETHERNET_FCS_SIZE; +- hw->min_frame_size = MINIMUM_ETHERNET_FRAME_SIZE; +- +- /* identify the MAC */ +- +- if (e1000_set_mac_type(hw)) { +- DPRINTK(PROBE, ERR, "Unknown MAC Type\n"); ++ adapter->max_frame_size = netdev->mtu + ETH_HLEN + ETH_FCS_LEN; ++ adapter->min_frame_size = ETH_ZLEN + ETH_FCS_LEN; ++ ++ hw->fc.requested_mode = e1000_fc_default; ++ ++ /* Initialize the hardware-specific values */ ++ if (e1000_setup_init_funcs(hw, FALSE)) { ++ DPRINTK(PROBE, ERR, "Hardware Initialization Failure\n"); + return -EIO; +- } +- +- switch (hw->mac_type) { +- default: +- break; +- case e1000_82541: +- case e1000_82547: +- case e1000_82541_rev_2: +- case e1000_82547_rev_2: +- hw->phy_init_script = 1; +- break; +- } +- +- e1000_set_media_type(hw); +- +- hw->wait_autoneg_complete = false; +- hw->tbi_compatibility_en = true; +- hw->adaptive_ifs = true; +- +- /* Copper options */ +- +- if (hw->media_type == e1000_media_type_copper) { +- hw->mdix = AUTO_ALL_MODES; +- hw->disable_polarity_correction = false; +- hw->master_slave = E1000_MASTER_SLAVE; + } + + adapter->num_tx_queues = 1; +@@ -1377,32 +1135,27 @@ + return -ENOMEM; + } + +- for (i = 0; i < adapter->num_rx_queues; i++) { +- adapter->polling_netdev[i].priv = adapter; +- dev_hold(&adapter->polling_netdev[i]); +- set_bit(__LINK_STATE_START, &adapter->polling_netdev[i].state); ++#ifdef CONFIG_E1000_NAPI ++ for (i = 0; i < adapter->num_rx_queues; i++) { ++ struct e1000_rx_ring *rx_ring = &adapter->rx_ring[i]; ++ netif_napi_add(adapter->netdev, &rx_ring->napi, e1000_poll, 64); + } + spin_lock_init(&adapter->tx_queue_lock); ++#endif + + /* Explicitly disable IRQ since the NIC can be in any state. */ + e1000_irq_disable(adapter); + + spin_lock_init(&adapter->stats_lock); + +- set_bit(__E1000_DOWN, &adapter->flags); +- ++ set_bit(__E1000_DOWN, &adapter->state); + return 0; + } + + /** + * e1000_alloc_queues - Allocate memory for all rings + * @adapter: board private structure to initialize +- * +- * We allocate one ring per queue at run-time since we don't know the +- * number of queues at compile-time. The polling_netdev array is +- * intended for Multiqueue, but should work fine with a single queue. +- **/ +- ++ **/ + static int __devinit e1000_alloc_queues(struct e1000_adapter *adapter) + { + adapter->tx_ring = kcalloc(adapter->num_tx_queues, +@@ -1417,17 +1170,10 @@ + return -ENOMEM; + } + +- adapter->polling_netdev = kcalloc(adapter->num_rx_queues, +- sizeof(struct net_device), +- GFP_KERNEL); +- if (!adapter->polling_netdev) { +- kfree(adapter->tx_ring); +- kfree(adapter->rx_ring); +- return -ENOMEM; +- } + + return E1000_SUCCESS; + } ++ + + /** + * e1000_open - Called when a network interface is made active +@@ -1441,15 +1187,12 @@ + * handler is registered with the OS, the watchdog timer is started, + * and the stack is notified that the interface is ready. + **/ +- + static int e1000_open(struct net_device *netdev) + { + struct e1000_adapter *adapter = netdev_priv(netdev); +- struct e1000_hw *hw = &adapter->hw; + int err; +- + /* disallow open during test */ +- if (test_bit(__E1000_TESTING, &adapter->flags)) ++ if (test_bit(__E1000_TESTING, &adapter->state)) + return -EBUSY; + + /* allocate transmit descriptors */ +@@ -1462,19 +1205,16 @@ + if (err) + goto err_setup_rx; + +- e1000_power_up_phy(adapter); +- ++ if (adapter->hw.phy.media_type == e1000_media_type_copper) ++ e1000_power_up_phy(&adapter->hw); ++ ++#ifdef NETIF_F_HW_VLAN_TX + adapter->mng_vlan_id = E1000_MNG_VLAN_NONE; +- if ((hw->mng_cookie.status & +- E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT)) { ++ if ((adapter->hw.mng_cookie.status & ++ E1000_MNG_DHCP_COOKIE_STATUS_VLAN)) { + e1000_update_mng_vlan(adapter); + } +- +- /* If AMT is enabled, let the firmware know that the network +- * interface is now open */ +- if (hw->mac_type == e1000_82573 && +- e1000_check_mng_mode(hw)) +- e1000_get_hw_control(adapter); ++#endif + + /* before we allocate an interrupt, we must be ready to handle it. + * Setting DEBUG_SHIRQ in the kernel makes it fire an interrupt +@@ -1482,27 +1222,32 @@ + * clean_rx handler before we do so. */ + e1000_configure(adapter); + ++ + err = e1000_request_irq(adapter); + if (err) + goto err_req_irq; + + /* From here on the code is the same as e1000_up() */ +- clear_bit(__E1000_DOWN, &adapter->flags); +- +- napi_enable(&adapter->napi); ++ clear_bit(__E1000_DOWN, &adapter->state); ++ ++ e1000_napi_enable_all(adapter); + + e1000_irq_enable(adapter); + +- netif_start_queue(netdev); +- + /* fire a link status change interrupt to start the watchdog */ +- ew32(ICS, E1000_ICS_LSC); ++ E1000_WRITE_REG(&adapter->hw, E1000_ICS, E1000_ICS_LSC); + + return E1000_SUCCESS; + + err_req_irq: +- e1000_release_hw_control(adapter); +- e1000_power_down_phy(adapter); ++ /* Power down the PHY so no link is implied when interface is down * ++ * The PHY cannot be powered down if any of the following is TRUE * ++ * (a) WoL is enabled ++ * (b) AMT is active ++ * (c) SoL/IDER session is active */ ++ if (!adapter->wol && adapter->hw.mac.type >= e1000_82540 && ++ adapter->hw.phy.media_type == e1000_media_type_copper) ++ e1000_power_down_phy(&adapter->hw); + e1000_free_all_rx_resources(adapter); + err_setup_rx: + e1000_free_all_tx_resources(adapter); +@@ -1523,34 +1268,35 @@ + * needs to be disabled. A global MAC reset is issued to stop the + * hardware, and all transmit and receive resources are freed. + **/ +- + static int e1000_close(struct net_device *netdev) + { + struct e1000_adapter *adapter = netdev_priv(netdev); +- struct e1000_hw *hw = &adapter->hw; +- +- WARN_ON(test_bit(__E1000_RESETTING, &adapter->flags)); ++ ++ WARN_ON(test_bit(__E1000_RESETTING, &adapter->state)); + e1000_down(adapter); +- e1000_power_down_phy(adapter); ++ /* Power down the PHY so no link is implied when interface is down * ++ * The PHY cannot be powered down if any of the following is TRUE * ++ * (a) WoL is enabled ++ * (b) AMT is active ++ * (c) SoL/IDER session is active */ ++ if (!adapter->wol && adapter->hw.mac.type >= e1000_82540 && ++ adapter->hw.phy.media_type == e1000_media_type_copper) ++ e1000_power_down_phy(&adapter->hw); + e1000_free_irq(adapter); + + e1000_free_all_tx_resources(adapter); + e1000_free_all_rx_resources(adapter); + ++#ifdef NETIF_F_HW_VLAN_TX + /* kill manageability vlan ID if supported, but not if a vlan with + * the same ID is registered on the host OS (let 8021q kill it) */ +- if ((hw->mng_cookie.status & +- E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT) && ++ if ((adapter->hw.mng_cookie.status & ++ E1000_MNG_DHCP_COOKIE_STATUS_VLAN) && + !(adapter->vlgrp && + vlan_group_get_device(adapter->vlgrp, adapter->mng_vlan_id))) { + e1000_vlan_rx_kill_vid(netdev, adapter->mng_vlan_id); + } +- +- /* If AMT is enabled, let the firmware know that the network +- * interface is now closed */ +- if (hw->mac_type == e1000_82573 && +- e1000_check_mng_mode(hw)) +- e1000_release_hw_control(adapter); ++#endif + + return 0; + } +@@ -1561,106 +1307,109 @@ + * @start: address of beginning of memory + * @len: length of memory + **/ +-static bool e1000_check_64k_bound(struct e1000_adapter *adapter, void *start, +- unsigned long len) +-{ +- struct e1000_hw *hw = &adapter->hw; +- unsigned long begin = (unsigned long)start; ++static bool e1000_check_64k_bound(struct e1000_adapter *adapter, ++ void *start, unsigned long len) ++{ ++ unsigned long begin = (unsigned long) start; + unsigned long end = begin + len; + + /* First rev 82545 and 82546 need to not allow any memory + * write location to cross 64k boundary due to errata 23 */ +- if (hw->mac_type == e1000_82545 || +- hw->mac_type == e1000_82546) { +- return ((begin ^ (end - 1)) >> 16) != 0 ? false : true; +- } +- +- return true; ++ if (adapter->hw.mac.type == e1000_82545 || ++ adapter->hw.mac.type == e1000_82546) { ++ return ((begin ^ (end - 1)) >> 16) != 0 ? FALSE : TRUE; ++ } ++ ++ return TRUE; + } + + /** + * e1000_setup_tx_resources - allocate Tx resources (Descriptors) + * @adapter: board private structure +- * @txdr: tx descriptor ring (for a specific queue) to setup ++ * @tx_ring: tx descriptor ring (for a specific queue) to setup + * + * Return 0 on success, negative on failure + **/ +- + static int e1000_setup_tx_resources(struct e1000_adapter *adapter, +- struct e1000_tx_ring *txdr) ++ struct e1000_tx_ring *tx_ring) + { + struct pci_dev *pdev = adapter->pdev; + int size; + +- size = sizeof(struct e1000_buffer) * txdr->count; +- txdr->buffer_info = vmalloc(size); +- if (!txdr->buffer_info) { ++ size = sizeof(struct e1000_buffer) * tx_ring->count; ++ tx_ring->buffer_info = vmalloc(size); ++ if (!tx_ring->buffer_info) { + DPRINTK(PROBE, ERR, + "Unable to allocate memory for the transmit descriptor ring\n"); + return -ENOMEM; + } +- memset(txdr->buffer_info, 0, size); ++ memset(tx_ring->buffer_info, 0, size); + + /* round up to nearest 4K */ + +- txdr->size = txdr->count * sizeof(struct e1000_tx_desc); +- txdr->size = ALIGN(txdr->size, 4096); +- +- txdr->desc = pci_alloc_consistent(pdev, txdr->size, &txdr->dma); +- if (!txdr->desc) { ++ tx_ring->size = tx_ring->count * sizeof(struct e1000_tx_desc); ++ tx_ring->size = ALIGN(tx_ring->size, 4096); ++ ++ tx_ring->desc = pci_alloc_consistent(pdev, tx_ring->size, ++ &tx_ring->dma); ++ if (!tx_ring->desc) { + setup_tx_desc_die: +- vfree(txdr->buffer_info); ++ vfree(tx_ring->buffer_info); + DPRINTK(PROBE, ERR, + "Unable to allocate memory for the transmit descriptor ring\n"); + return -ENOMEM; + } + + /* Fix for errata 23, can't cross 64kB boundary */ +- if (!e1000_check_64k_bound(adapter, txdr->desc, txdr->size)) { +- void *olddesc = txdr->desc; +- dma_addr_t olddma = txdr->dma; +- DPRINTK(TX_ERR, ERR, "txdr align check failed: %u bytes " +- "at %p\n", txdr->size, txdr->desc); ++ if (!e1000_check_64k_bound(adapter, tx_ring->desc, tx_ring->size)) { ++ void *olddesc = tx_ring->desc; ++ dma_addr_t olddma = tx_ring->dma; ++ DPRINTK(TX_ERR, ERR, "tx_ring align check failed: %u bytes " ++ "at %p\n", tx_ring->size, tx_ring->desc); + /* Try again, without freeing the previous */ +- txdr->desc = pci_alloc_consistent(pdev, txdr->size, &txdr->dma); ++ tx_ring->desc = pci_alloc_consistent(pdev, tx_ring->size, ++ &tx_ring->dma); + /* Failed allocation, critical failure */ +- if (!txdr->desc) { +- pci_free_consistent(pdev, txdr->size, olddesc, olddma); ++ if (!tx_ring->desc) { ++ pci_free_consistent(pdev, tx_ring->size, olddesc, ++ olddma); + goto setup_tx_desc_die; + } + +- if (!e1000_check_64k_bound(adapter, txdr->desc, txdr->size)) { ++ if (!e1000_check_64k_bound(adapter, tx_ring->desc, ++ tx_ring->size)) { + /* give up */ +- pci_free_consistent(pdev, txdr->size, txdr->desc, +- txdr->dma); +- pci_free_consistent(pdev, txdr->size, olddesc, olddma); ++ pci_free_consistent(pdev, tx_ring->size, tx_ring->desc, ++ tx_ring->dma); ++ pci_free_consistent(pdev, tx_ring->size, olddesc, ++ olddma); + DPRINTK(PROBE, ERR, + "Unable to allocate aligned memory " + "for the transmit descriptor ring\n"); +- vfree(txdr->buffer_info); ++ vfree(tx_ring->buffer_info); + return -ENOMEM; + } else { + /* Free old allocation, new allocation was successful */ +- pci_free_consistent(pdev, txdr->size, olddesc, olddma); +- } +- } +- memset(txdr->desc, 0, txdr->size); +- +- txdr->next_to_use = 0; +- txdr->next_to_clean = 0; +- spin_lock_init(&txdr->tx_lock); ++ pci_free_consistent(pdev, tx_ring->size, olddesc, ++ olddma); ++ } ++ } ++ memset(tx_ring->desc, 0, tx_ring->size); ++ ++ tx_ring->next_to_use = 0; ++ tx_ring->next_to_clean = 0; ++ spin_lock_init(&tx_ring->tx_lock); + + return 0; + } + + /** + * e1000_setup_all_tx_resources - wrapper to allocate Tx resources +- * (Descriptors) for all queues +- * @adapter: board private structure +- * +- * Return 0 on success, negative on failure +- **/ +- ++ * @adapter: board private structure ++ * ++ * this allocates tx resources for all queues, return 0 on success, negative ++ * on failure ++ **/ + int e1000_setup_all_tx_resources(struct e1000_adapter *adapter) + { + int i, err = 0; +@@ -1686,51 +1435,42 @@ + * + * Configure the Tx unit of the MAC after a reset. + **/ +- + static void e1000_configure_tx(struct e1000_adapter *adapter) + { + u64 tdba; + struct e1000_hw *hw = &adapter->hw; +- u32 tdlen, tctl, tipg, tarc; ++ u32 tdlen, tctl, tipg; + u32 ipgr1, ipgr2; ++ int i; + + /* Setup the HW Tx Head and Tail descriptor pointers */ +- +- switch (adapter->num_tx_queues) { +- case 1: +- default: +- tdba = adapter->tx_ring[0].dma; +- tdlen = adapter->tx_ring[0].count * +- sizeof(struct e1000_tx_desc); +- ew32(TDLEN, tdlen); +- ew32(TDBAH, (tdba >> 32)); +- ew32(TDBAL, (tdba & 0x00000000ffffffffULL)); +- ew32(TDT, 0); +- ew32(TDH, 0); +- adapter->tx_ring[0].tdh = ((hw->mac_type >= e1000_82543) ? E1000_TDH : E1000_82542_TDH); +- adapter->tx_ring[0].tdt = ((hw->mac_type >= e1000_82543) ? E1000_TDT : E1000_82542_TDT); +- break; +- } ++ for (i = 0; i < adapter->num_tx_queues; i++) { ++ tdba = adapter->tx_ring[i].dma; ++ tdlen = adapter->tx_ring[i].count * sizeof(struct e1000_tx_desc); ++ E1000_WRITE_REG(hw, E1000_TDBAL(i), (tdba & 0x00000000ffffffffULL)); ++ E1000_WRITE_REG(hw, E1000_TDBAH(i), (tdba >> 32)); ++ E1000_WRITE_REG(hw, E1000_TDLEN(i), tdlen); ++ E1000_WRITE_REG(hw, E1000_TDH(i), 0); ++ E1000_WRITE_REG(hw, E1000_TDT(i), 0); ++ adapter->tx_ring[i].tdh = E1000_REGISTER(hw, E1000_TDH(i)); ++ adapter->tx_ring[i].tdt = E1000_REGISTER(hw, E1000_TDT(i)); ++ } ++ + + /* Set the default values for the Tx Inter Packet Gap timer */ +- if (hw->mac_type <= e1000_82547_rev_2 && +- (hw->media_type == e1000_media_type_fiber || +- hw->media_type == e1000_media_type_internal_serdes)) ++ if (adapter->hw.mac.type <= e1000_82547_rev_2 && ++ (hw->phy.media_type == e1000_media_type_fiber || ++ hw->phy.media_type == e1000_media_type_internal_serdes)) + tipg = DEFAULT_82543_TIPG_IPGT_FIBER; + else + tipg = DEFAULT_82543_TIPG_IPGT_COPPER; + +- switch (hw->mac_type) { +- case e1000_82542_rev2_0: +- case e1000_82542_rev2_1: ++ switch (hw->mac.type) { ++ case e1000_82542: + tipg = DEFAULT_82542_TIPG_IPGT; + ipgr1 = DEFAULT_82542_TIPG_IPGR1; + ipgr2 = DEFAULT_82542_TIPG_IPGR2; + break; +- case e1000_80003es2lan: +- ipgr1 = DEFAULT_82543_TIPG_IPGR1; +- ipgr2 = DEFAULT_80003ES2LAN_TIPG_IPGR2; +- break; + default: + ipgr1 = DEFAULT_82543_TIPG_IPGR1; + ipgr2 = DEFAULT_82543_TIPG_IPGR2; +@@ -1738,36 +1478,21 @@ + } + tipg |= ipgr1 << E1000_TIPG_IPGR1_SHIFT; + tipg |= ipgr2 << E1000_TIPG_IPGR2_SHIFT; +- ew32(TIPG, tipg); ++ E1000_WRITE_REG(hw, E1000_TIPG, tipg); + + /* Set the Tx Interrupt Delay register */ + +- ew32(TIDV, adapter->tx_int_delay); +- if (hw->mac_type >= e1000_82540) +- ew32(TADV, adapter->tx_abs_int_delay); ++ E1000_WRITE_REG(hw, E1000_TIDV, adapter->tx_int_delay); ++ if (adapter->flags & E1000_FLAG_HAS_INTR_MODERATION) ++ E1000_WRITE_REG(hw, E1000_TADV, adapter->tx_abs_int_delay); + + /* Program the Transmit Control Register */ + +- tctl = er32(TCTL); ++ tctl = E1000_READ_REG(hw, E1000_TCTL); + tctl &= ~E1000_TCTL_CT; + tctl |= E1000_TCTL_PSP | E1000_TCTL_RTLC | + (E1000_COLLISION_THRESHOLD << E1000_CT_SHIFT); + +- if (hw->mac_type == e1000_82571 || hw->mac_type == e1000_82572) { +- tarc = er32(TARC0); +- /* set the speed mode bit, we'll clear it if we're not at +- * gigabit link later */ +- tarc |= (1 << 21); +- ew32(TARC0, tarc); +- } else if (hw->mac_type == e1000_80003es2lan) { +- tarc = er32(TARC0); +- tarc |= 1; +- ew32(TARC0, tarc); +- tarc = er32(TARC1); +- tarc |= 1; +- ew32(TARC1, tarc); +- } +- + e1000_config_collision_dist(hw); + + /* Setup Transmit Descriptor Settings for eop descriptor */ +@@ -1777,134 +1502,115 @@ + if (adapter->tx_int_delay) + adapter->txd_cmd |= E1000_TXD_CMD_IDE; + +- if (hw->mac_type < e1000_82543) ++ if (hw->mac.type < e1000_82543) + adapter->txd_cmd |= E1000_TXD_CMD_RPS; + else + adapter->txd_cmd |= E1000_TXD_CMD_RS; + + /* Cache if we're 82544 running in PCI-X because we'll + * need this to apply a workaround later in the send path. */ +- if (hw->mac_type == e1000_82544 && +- hw->bus_type == e1000_bus_type_pcix) ++ if (hw->mac.type == e1000_82544 && ++ hw->bus.type == e1000_bus_type_pcix) + adapter->pcix_82544 = 1; + +- ew32(TCTL, tctl); ++ E1000_WRITE_REG(hw, E1000_TCTL, tctl); + + } + + /** + * e1000_setup_rx_resources - allocate Rx resources (Descriptors) + * @adapter: board private structure +- * @rxdr: rx descriptor ring (for a specific queue) to setup ++ * @rx_ring: rx descriptor ring (for a specific queue) to setup + * + * Returns 0 on success, negative on failure + **/ +- + static int e1000_setup_rx_resources(struct e1000_adapter *adapter, +- struct e1000_rx_ring *rxdr) +-{ +- struct e1000_hw *hw = &adapter->hw; ++ struct e1000_rx_ring *rx_ring) ++{ + struct pci_dev *pdev = adapter->pdev; + int size, desc_len; + +- size = sizeof(struct e1000_buffer) * rxdr->count; +- rxdr->buffer_info = vmalloc(size); +- if (!rxdr->buffer_info) { ++ size = sizeof(struct e1000_rx_buffer) * rx_ring->count; ++ rx_ring->buffer_info = vmalloc(size); ++ if (!rx_ring->buffer_info) { + DPRINTK(PROBE, ERR, + "Unable to allocate memory for the receive descriptor ring\n"); + return -ENOMEM; + } +- memset(rxdr->buffer_info, 0, size); +- +- rxdr->ps_page = kcalloc(rxdr->count, sizeof(struct e1000_ps_page), +- GFP_KERNEL); +- if (!rxdr->ps_page) { +- vfree(rxdr->buffer_info); +- DPRINTK(PROBE, ERR, +- "Unable to allocate memory for the receive descriptor ring\n"); +- return -ENOMEM; +- } +- +- rxdr->ps_page_dma = kcalloc(rxdr->count, +- sizeof(struct e1000_ps_page_dma), +- GFP_KERNEL); +- if (!rxdr->ps_page_dma) { +- vfree(rxdr->buffer_info); +- kfree(rxdr->ps_page); +- DPRINTK(PROBE, ERR, +- "Unable to allocate memory for the receive descriptor ring\n"); +- return -ENOMEM; +- } +- +- if (hw->mac_type <= e1000_82547_rev_2) +- desc_len = sizeof(struct e1000_rx_desc); +- else +- desc_len = sizeof(union e1000_rx_desc_packet_split); ++ memset(rx_ring->buffer_info, 0, size); ++ ++ desc_len = sizeof(struct e1000_rx_desc); + + /* Round up to nearest 4K */ + +- rxdr->size = rxdr->count * desc_len; +- rxdr->size = ALIGN(rxdr->size, 4096); +- +- rxdr->desc = pci_alloc_consistent(pdev, rxdr->size, &rxdr->dma); +- +- if (!rxdr->desc) { ++ rx_ring->size = rx_ring->count * desc_len; ++ rx_ring->size = ALIGN(rx_ring->size, 4096); ++ ++ rx_ring->desc = pci_alloc_consistent(pdev, rx_ring->size, ++ &rx_ring->dma); ++ ++ if (!rx_ring->desc) { + DPRINTK(PROBE, ERR, + "Unable to allocate memory for the receive descriptor ring\n"); + setup_rx_desc_die: +- vfree(rxdr->buffer_info); +- kfree(rxdr->ps_page); +- kfree(rxdr->ps_page_dma); ++ vfree(rx_ring->buffer_info); + return -ENOMEM; + } + + /* Fix for errata 23, can't cross 64kB boundary */ +- if (!e1000_check_64k_bound(adapter, rxdr->desc, rxdr->size)) { +- void *olddesc = rxdr->desc; +- dma_addr_t olddma = rxdr->dma; +- DPRINTK(RX_ERR, ERR, "rxdr align check failed: %u bytes " +- "at %p\n", rxdr->size, rxdr->desc); ++ if (!e1000_check_64k_bound(adapter, rx_ring->desc, rx_ring->size)) { ++ void *olddesc = rx_ring->desc; ++ dma_addr_t olddma = rx_ring->dma; ++ DPRINTK(RX_ERR, ERR, "rx_ring align check failed: %u bytes " ++ "at %p\n", rx_ring->size, rx_ring->desc); + /* Try again, without freeing the previous */ +- rxdr->desc = pci_alloc_consistent(pdev, rxdr->size, &rxdr->dma); ++ rx_ring->desc = pci_alloc_consistent(pdev, rx_ring->size, ++ &rx_ring->dma); + /* Failed allocation, critical failure */ +- if (!rxdr->desc) { +- pci_free_consistent(pdev, rxdr->size, olddesc, olddma); ++ if (!rx_ring->desc) { ++ pci_free_consistent(pdev, rx_ring->size, olddesc, ++ olddma); + DPRINTK(PROBE, ERR, + "Unable to allocate memory " + "for the receive descriptor ring\n"); + goto setup_rx_desc_die; + } + +- if (!e1000_check_64k_bound(adapter, rxdr->desc, rxdr->size)) { ++ if (!e1000_check_64k_bound(adapter, rx_ring->desc, ++ rx_ring->size)) { + /* give up */ +- pci_free_consistent(pdev, rxdr->size, rxdr->desc, +- rxdr->dma); +- pci_free_consistent(pdev, rxdr->size, olddesc, olddma); ++ pci_free_consistent(pdev, rx_ring->size, rx_ring->desc, ++ rx_ring->dma); ++ pci_free_consistent(pdev, rx_ring->size, olddesc, ++ olddma); + DPRINTK(PROBE, ERR, + "Unable to allocate aligned memory " + "for the receive descriptor ring\n"); + goto setup_rx_desc_die; + } else { + /* Free old allocation, new allocation was successful */ +- pci_free_consistent(pdev, rxdr->size, olddesc, olddma); +- } +- } +- memset(rxdr->desc, 0, rxdr->size); +- +- rxdr->next_to_clean = 0; +- rxdr->next_to_use = 0; ++ pci_free_consistent(pdev, rx_ring->size, olddesc, ++ olddma); ++ } ++ } ++ memset(rx_ring->desc, 0, rx_ring->size); ++ ++ /* set up ring defaults */ ++ rx_ring->next_to_clean = 0; ++ rx_ring->next_to_use = 0; ++ rx_ring->rx_skb_top = NULL; ++ rx_ring->adapter = adapter; + + return 0; + } + + /** + * e1000_setup_all_rx_resources - wrapper to allocate Rx resources +- * (Descriptors) for all queues +- * @adapter: board private structure +- * +- * Return 0 on success, negative on failure +- **/ +- ++ * @adapter: board private structure ++ * ++ * this allocates rx resources for all queues, return 0 on success, negative ++ * on failure ++ **/ + int e1000_setup_all_rx_resources(struct e1000_adapter *adapter) + { + int i, err = 0; +@@ -1924,30 +1630,31 @@ + return err; + } + ++#define PAGE_USE_COUNT(S) (((S) >> PAGE_SHIFT) + \ ++ (((S) & (PAGE_SIZE - 1)) ? 1 : 0)) + /** + * e1000_setup_rctl - configure the receive control registers + * @adapter: Board private structure + **/ +-#define PAGE_USE_COUNT(S) (((S) >> PAGE_SHIFT) + \ +- (((S) & (PAGE_SIZE - 1)) ? 1 : 0)) + static void e1000_setup_rctl(struct e1000_adapter *adapter) + { +- struct e1000_hw *hw = &adapter->hw; +- u32 rctl, rfctl; +- u32 psrctl = 0; +-#ifndef CONFIG_E1000_DISABLE_PACKET_SPLIT +- u32 pages = 0; +-#endif +- +- rctl = er32(RCTL); ++ u32 rctl; ++ ++ rctl = E1000_READ_REG(&adapter->hw, E1000_RCTL); + + rctl &= ~(3 << E1000_RCTL_MO_SHIFT); + + rctl |= E1000_RCTL_EN | E1000_RCTL_BAM | + E1000_RCTL_LBM_NO | E1000_RCTL_RDMTS_HALF | +- (hw->mc_filter_type << E1000_RCTL_MO_SHIFT); +- +- if (hw->tbi_compatibility_on == 1) ++ (adapter->hw.mac.mc_filter_type << E1000_RCTL_MO_SHIFT); ++ ++ /* disable the stripping of CRC because it breaks ++ * BMC firmware connected over SMBUS ++ if (adapter->hw.mac.type > e1000_82543) ++ rctl |= E1000_RCTL_SECRC; ++ */ ++ ++ if (e1000_tbi_sbp_enabled_82543(&adapter->hw)) + rctl |= E1000_RCTL_SBP; + else + rctl &= ~E1000_RCTL_SBP; +@@ -1989,56 +1696,7 @@ + break; + } + +-#ifndef CONFIG_E1000_DISABLE_PACKET_SPLIT +- /* 82571 and greater support packet-split where the protocol +- * header is placed in skb->data and the packet data is +- * placed in pages hanging off of skb_shinfo(skb)->nr_frags. +- * In the case of a non-split, skb->data is linearly filled, +- * followed by the page buffers. Therefore, skb->data is +- * sized to hold the largest protocol header. +- */ +- /* allocations using alloc_page take too long for regular MTU +- * so only enable packet split for jumbo frames */ +- pages = PAGE_USE_COUNT(adapter->netdev->mtu); +- if ((hw->mac_type >= e1000_82571) && (pages <= 3) && +- PAGE_SIZE <= 16384 && (rctl & E1000_RCTL_LPE)) +- adapter->rx_ps_pages = pages; +- else +- adapter->rx_ps_pages = 0; +-#endif +- if (adapter->rx_ps_pages) { +- /* Configure extra packet-split registers */ +- rfctl = er32(RFCTL); +- rfctl |= E1000_RFCTL_EXTEN; +- /* disable packet split support for IPv6 extension headers, +- * because some malformed IPv6 headers can hang the RX */ +- rfctl |= (E1000_RFCTL_IPV6_EX_DIS | +- E1000_RFCTL_NEW_IPV6_EXT_DIS); +- +- ew32(RFCTL, rfctl); +- +- rctl |= E1000_RCTL_DTYP_PS; +- +- psrctl |= adapter->rx_ps_bsize0 >> +- E1000_PSRCTL_BSIZE0_SHIFT; +- +- switch (adapter->rx_ps_pages) { +- case 3: +- psrctl |= PAGE_SIZE << +- E1000_PSRCTL_BSIZE3_SHIFT; +- case 2: +- psrctl |= PAGE_SIZE << +- E1000_PSRCTL_BSIZE2_SHIFT; +- case 1: +- psrctl |= PAGE_SIZE >> +- E1000_PSRCTL_BSIZE1_SHIFT; +- break; +- } +- +- ew32(PSRCTL, psrctl); +- } +- +- ew32(RCTL, rctl); ++ E1000_WRITE_REG(&adapter->hw, E1000_RCTL, rctl); + } + + /** +@@ -2047,20 +1705,22 @@ + * + * Configure the Rx unit of the MAC after a reset. + **/ +- + static void e1000_configure_rx(struct e1000_adapter *adapter) + { + u64 rdba; + struct e1000_hw *hw = &adapter->hw; +- u32 rdlen, rctl, rxcsum, ctrl_ext; +- +- if (adapter->rx_ps_pages) { +- /* this is a 32 byte descriptor */ ++ u32 rdlen, rctl, rxcsum; ++ int i; ++ ++#ifdef CONFIG_E1000_NAPI ++ if (adapter->netdev->mtu > MAXIMUM_ETHERNET_VLAN_SIZE) { + rdlen = adapter->rx_ring[0].count * +- sizeof(union e1000_rx_desc_packet_split); +- adapter->clean_rx = e1000_clean_rx_irq_ps; +- adapter->alloc_rx_buf = e1000_alloc_rx_buffers_ps; +- } else { ++ sizeof(struct e1000_rx_desc); ++ adapter->clean_rx = e1000_clean_jumbo_rx_irq; ++ adapter->alloc_rx_buf = e1000_alloc_jumbo_rx_buffers; ++ } else ++#endif /* CONFIG_E1000_NAPI */ ++ { + rdlen = adapter->rx_ring[0].count * + sizeof(struct e1000_rx_desc); + adapter->clean_rx = e1000_clean_rx_irq; +@@ -2068,72 +1728,48 @@ + } + + /* disable receives while setting up the descriptors */ +- rctl = er32(RCTL); +- ew32(RCTL, rctl & ~E1000_RCTL_EN); ++ rctl = E1000_READ_REG(hw, E1000_RCTL); ++ E1000_WRITE_REG(hw, E1000_RCTL, rctl & ~E1000_RCTL_EN); ++ /* do not flush or delay here, causes some strange problem ++ * on SERDES connected SFP modules */ + + /* set the Receive Delay Timer Register */ +- ew32(RDTR, adapter->rx_int_delay); +- +- if (hw->mac_type >= e1000_82540) { +- ew32(RADV, adapter->rx_abs_int_delay); ++ E1000_WRITE_REG(hw, E1000_RDTR, adapter->rx_int_delay); ++ ++ if (adapter->flags & E1000_FLAG_HAS_INTR_MODERATION) { ++ E1000_WRITE_REG(hw, E1000_RADV, adapter->rx_abs_int_delay); + if (adapter->itr_setting != 0) +- ew32(ITR, 1000000000 / (adapter->itr * 256)); +- } +- +- if (hw->mac_type >= e1000_82571) { +- ctrl_ext = er32(CTRL_EXT); +- /* Reset delay timers after every interrupt */ +- ctrl_ext |= E1000_CTRL_EXT_INT_TIMER_CLR; +- /* Auto-Mask interrupts upon ICR access */ +- ctrl_ext |= E1000_CTRL_EXT_IAME; +- ew32(IAM, 0xffffffff); +- ew32(CTRL_EXT, ctrl_ext); +- E1000_WRITE_FLUSH(); ++ E1000_WRITE_REG(hw, E1000_ITR, ++ 1000000000 / (adapter->itr * 256)); + } + + /* Setup the HW Rx Head and Tail Descriptor Pointers and + * the Base and Length of the Rx Descriptor Ring */ +- switch (adapter->num_rx_queues) { +- case 1: +- default: +- rdba = adapter->rx_ring[0].dma; +- ew32(RDLEN, rdlen); +- ew32(RDBAH, (rdba >> 32)); +- ew32(RDBAL, (rdba & 0x00000000ffffffffULL)); +- ew32(RDT, 0); +- ew32(RDH, 0); +- adapter->rx_ring[0].rdh = ((hw->mac_type >= e1000_82543) ? E1000_RDH : E1000_82542_RDH); +- adapter->rx_ring[0].rdt = ((hw->mac_type >= e1000_82543) ? E1000_RDT : E1000_82542_RDT); +- break; +- } +- +- /* Enable 82543 Receive Checksum Offload for TCP and UDP */ +- if (hw->mac_type >= e1000_82543) { +- rxcsum = er32(RXCSUM); +- if (adapter->rx_csum) { ++ for (i = 0; i < adapter->num_rx_queues; i++) { ++ rdba = adapter->rx_ring[i].dma; ++ E1000_WRITE_REG(hw, E1000_RDBAL(i), (rdba & 0x00000000ffffffffULL)); ++ E1000_WRITE_REG(hw, E1000_RDBAH(i), (rdba >> 32)); ++ E1000_WRITE_REG(hw, E1000_RDLEN(i), rdlen); ++ E1000_WRITE_REG(hw, E1000_RDH(i), 0); ++ E1000_WRITE_REG(hw, E1000_RDT(i), 0); ++ adapter->rx_ring[i].rdh = E1000_REGISTER(hw, E1000_RDH(i)); ++ adapter->rx_ring[i].rdt = E1000_REGISTER(hw, E1000_RDT(i)); ++ } ++ ++ if (hw->mac.type >= e1000_82543) { ++ /* Enable 82543 Receive Checksum Offload for TCP and UDP */ ++ rxcsum = E1000_READ_REG(hw, E1000_RXCSUM); ++ if (adapter->rx_csum == TRUE) { + rxcsum |= E1000_RXCSUM_TUOFL; +- +- /* Enable 82571 IPv4 payload checksum for UDP fragments +- * Must be used in conjunction with packet-split. */ +- if ((hw->mac_type >= e1000_82571) && +- (adapter->rx_ps_pages)) { +- rxcsum |= E1000_RXCSUM_IPPCSE; +- } + } else { + rxcsum &= ~E1000_RXCSUM_TUOFL; + /* don't need to clear IPPCSE as it defaults to 0 */ + } +- ew32(RXCSUM, rxcsum); +- } +- +- /* enable early receives on 82573, only takes effect if using > 2048 +- * byte total frame size. for example only for jumbo frames */ +-#define E1000_ERT_2048 0x100 +- if (hw->mac_type == e1000_82573) +- ew32(ERT, E1000_ERT_2048); ++ E1000_WRITE_REG(hw, E1000_RXCSUM, rxcsum); ++ } + + /* Enable Receives */ +- ew32(RCTL, rctl); ++ E1000_WRITE_REG(hw, E1000_RCTL, rctl); + } + + /** +@@ -2143,9 +1779,8 @@ + * + * Free all transmit software resources + **/ +- + static void e1000_free_tx_resources(struct e1000_adapter *adapter, +- struct e1000_tx_ring *tx_ring) ++ struct e1000_tx_ring *tx_ring) + { + struct pci_dev *pdev = adapter->pdev; + +@@ -2165,7 +1800,6 @@ + * + * Free all transmit software resources + **/ +- + void e1000_free_all_tx_resources(struct e1000_adapter *adapter) + { + int i; +@@ -2175,7 +1809,7 @@ + } + + static void e1000_unmap_and_free_tx_resource(struct e1000_adapter *adapter, +- struct e1000_buffer *buffer_info) ++ struct e1000_buffer *buffer_info) + { + if (buffer_info->dma) { + pci_unmap_page(adapter->pdev, +@@ -2196,11 +1830,9 @@ + * @adapter: board private structure + * @tx_ring: ring to be cleaned + **/ +- + static void e1000_clean_tx_ring(struct e1000_adapter *adapter, +- struct e1000_tx_ring *tx_ring) +-{ +- struct e1000_hw *hw = &adapter->hw; ++ struct e1000_tx_ring *tx_ring) ++{ + struct e1000_buffer *buffer_info; + unsigned long size; + unsigned int i; +@@ -2223,15 +1855,14 @@ + tx_ring->next_to_clean = 0; + tx_ring->last_tx_tso = 0; + +- writel(0, hw->hw_addr + tx_ring->tdh); +- writel(0, hw->hw_addr + tx_ring->tdt); ++ writel(0, adapter->hw.hw_addr + tx_ring->tdh); ++ writel(0, adapter->hw.hw_addr + tx_ring->tdt); + } + + /** + * e1000_clean_all_tx_rings - Free Tx Buffers for all queues + * @adapter: board private structure + **/ +- + static void e1000_clean_all_tx_rings(struct e1000_adapter *adapter) + { + int i; +@@ -2247,9 +1878,8 @@ + * + * Free all receive software resources + **/ +- + static void e1000_free_rx_resources(struct e1000_adapter *adapter, +- struct e1000_rx_ring *rx_ring) ++ struct e1000_rx_ring *rx_ring) + { + struct pci_dev *pdev = adapter->pdev; + +@@ -2257,10 +1887,6 @@ + + vfree(rx_ring->buffer_info); + rx_ring->buffer_info = NULL; +- kfree(rx_ring->ps_page); +- rx_ring->ps_page = NULL; +- kfree(rx_ring->ps_page_dma); +- rx_ring->ps_page_dma = NULL; + + pci_free_consistent(pdev, rx_ring->size, rx_ring->desc, rx_ring->dma); + +@@ -2273,7 +1899,6 @@ + * + * Free all receive software resources + **/ +- + void e1000_free_all_rx_resources(struct e1000_adapter *adapter) + { + int i; +@@ -2287,49 +1912,50 @@ + * @adapter: board private structure + * @rx_ring: ring to free buffers from + **/ +- + static void e1000_clean_rx_ring(struct e1000_adapter *adapter, +- struct e1000_rx_ring *rx_ring) +-{ +- struct e1000_hw *hw = &adapter->hw; +- struct e1000_buffer *buffer_info; +- struct e1000_ps_page *ps_page; +- struct e1000_ps_page_dma *ps_page_dma; ++ struct e1000_rx_ring *rx_ring) ++{ ++ struct e1000_rx_buffer *buffer_info; + struct pci_dev *pdev = adapter->pdev; + unsigned long size; +- unsigned int i, j; ++ unsigned int i; + + /* Free all the Rx ring sk_buffs */ + for (i = 0; i < rx_ring->count; i++) { + buffer_info = &rx_ring->buffer_info[i]; ++ if (buffer_info->dma && ++ adapter->clean_rx == e1000_clean_rx_irq) { ++ pci_unmap_single(pdev, buffer_info->dma, ++ adapter->rx_buffer_len, ++ PCI_DMA_FROMDEVICE); ++#ifdef CONFIG_E1000_NAPI ++ } else if (buffer_info->dma && ++ adapter->clean_rx == e1000_clean_jumbo_rx_irq) { ++ pci_unmap_page(pdev, buffer_info->dma, PAGE_SIZE, ++ PCI_DMA_FROMDEVICE); ++#endif /* CONFIG_E1000_NAPI */ ++ } ++ buffer_info->dma = 0; ++ if (buffer_info->page) { ++ put_page(buffer_info->page); ++ buffer_info->page = NULL; ++ } + if (buffer_info->skb) { +- pci_unmap_single(pdev, +- buffer_info->dma, +- buffer_info->length, +- PCI_DMA_FROMDEVICE); +- + dev_kfree_skb(buffer_info->skb); + buffer_info->skb = NULL; + } +- ps_page = &rx_ring->ps_page[i]; +- ps_page_dma = &rx_ring->ps_page_dma[i]; +- for (j = 0; j < adapter->rx_ps_pages; j++) { +- if (!ps_page->ps_page[j]) break; +- pci_unmap_page(pdev, +- ps_page_dma->ps_page_dma[j], +- PAGE_SIZE, PCI_DMA_FROMDEVICE); +- ps_page_dma->ps_page_dma[j] = 0; +- put_page(ps_page->ps_page[j]); +- ps_page->ps_page[j] = NULL; +- } +- } +- +- size = sizeof(struct e1000_buffer) * rx_ring->count; ++ } ++ ++#ifdef CONFIG_E1000_NAPI ++ /* there also may be some cached data from a chained receive */ ++ if (rx_ring->rx_skb_top) { ++ dev_kfree_skb(rx_ring->rx_skb_top); ++ rx_ring->rx_skb_top = NULL; ++ } ++#endif ++ ++ size = sizeof(struct e1000_rx_buffer) * rx_ring->count; + memset(rx_ring->buffer_info, 0, size); +- size = sizeof(struct e1000_ps_page) * rx_ring->count; +- memset(rx_ring->ps_page, 0, size); +- size = sizeof(struct e1000_ps_page_dma) * rx_ring->count; +- memset(rx_ring->ps_page_dma, 0, size); + + /* Zero out the descriptor ring */ + +@@ -2338,15 +1964,14 @@ + rx_ring->next_to_clean = 0; + rx_ring->next_to_use = 0; + +- writel(0, hw->hw_addr + rx_ring->rdh); +- writel(0, hw->hw_addr + rx_ring->rdt); ++ writel(0, adapter->hw.hw_addr + rx_ring->rdh); ++ writel(0, adapter->hw.hw_addr + rx_ring->rdt); + } + + /** + * e1000_clean_all_rx_rings - Free Rx Buffers for all queues + * @adapter: board private structure + **/ +- + static void e1000_clean_all_rx_rings(struct e1000_adapter *adapter) + { + int i; +@@ -2360,16 +1985,20 @@ + */ + static void e1000_enter_82542_rst(struct e1000_adapter *adapter) + { +- struct e1000_hw *hw = &adapter->hw; + struct net_device *netdev = adapter->netdev; + u32 rctl; + +- e1000_pci_clear_mwi(hw); +- +- rctl = er32(RCTL); ++ if (adapter->hw.mac.type != e1000_82542) ++ return; ++ if (adapter->hw.revision_id != E1000_REVISION_2) ++ return; ++ ++ e1000_pci_clear_mwi(&adapter->hw); ++ ++ rctl = E1000_READ_REG(&adapter->hw, E1000_RCTL); + rctl |= E1000_RCTL_RST; +- ew32(RCTL, rctl); +- E1000_WRITE_FLUSH(); ++ E1000_WRITE_REG(&adapter->hw, E1000_RCTL, rctl); ++ E1000_WRITE_FLUSH(&adapter->hw); + mdelay(5); + + if (netif_running(netdev)) +@@ -2378,18 +2007,22 @@ + + static void e1000_leave_82542_rst(struct e1000_adapter *adapter) + { +- struct e1000_hw *hw = &adapter->hw; + struct net_device *netdev = adapter->netdev; + u32 rctl; + +- rctl = er32(RCTL); ++ if (adapter->hw.mac.type != e1000_82542) ++ return; ++ if (adapter->hw.revision_id != E1000_REVISION_2) ++ return; ++ ++ rctl = E1000_READ_REG(&adapter->hw, E1000_RCTL); + rctl &= ~E1000_RCTL_RST; +- ew32(RCTL, rctl); +- E1000_WRITE_FLUSH(); ++ E1000_WRITE_REG(&adapter->hw, E1000_RCTL, rctl); ++ E1000_WRITE_FLUSH(&adapter->hw); + mdelay(5); + +- if (hw->pci_cmd_word & PCI_COMMAND_INVALIDATE) +- e1000_pci_set_mwi(hw); ++ if (adapter->hw.bus.pci_cmd_word & PCI_COMMAND_INVALIDATE) ++ e1000_pci_set_mwi(&adapter->hw); + + if (netif_running(netdev)) { + /* No need to loop, because 82542 supports only 1 queue */ +@@ -2406,11 +2039,9 @@ + * + * Returns 0 on success, negative on failure + **/ +- + static int e1000_set_mac(struct net_device *netdev, void *p) + { + struct e1000_adapter *adapter = netdev_priv(netdev); +- struct e1000_hw *hw = &adapter->hw; + struct sockaddr *addr = p; + + if (!is_valid_ether_addr(addr->sa_data)) +@@ -2418,184 +2049,179 @@ + + /* 82542 2.0 needs to be in reset to write receive address registers */ + +- if (hw->mac_type == e1000_82542_rev2_0) ++ if (adapter->hw.mac.type == e1000_82542) + e1000_enter_82542_rst(adapter); + + memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len); +- memcpy(hw->mac_addr, addr->sa_data, netdev->addr_len); +- +- e1000_rar_set(hw, hw->mac_addr, 0); +- +- /* With 82571 controllers, LAA may be overwritten (with the default) +- * due to controller reset from the other port. */ +- if (hw->mac_type == e1000_82571) { +- /* activate the work around */ +- hw->laa_is_present = 1; +- +- /* Hold a copy of the LAA in RAR[14] This is done so that +- * between the time RAR[0] gets clobbered and the time it +- * gets fixed (in e1000_watchdog), the actual LAA is in one +- * of the RARs and no incoming packets directed to this port +- * are dropped. Eventaully the LAA will be in RAR[0] and +- * RAR[14] */ +- e1000_rar_set(hw, hw->mac_addr, +- E1000_RAR_ENTRIES - 1); +- } +- +- if (hw->mac_type == e1000_82542_rev2_0) ++ memcpy(adapter->hw.mac.addr, addr->sa_data, netdev->addr_len); ++ ++ e1000_rar_set(&adapter->hw, adapter->hw.mac.addr, 0); ++ ++ if (adapter->hw.mac.type == e1000_82542) + e1000_leave_82542_rst(adapter); + + return 0; + } + + /** +- * e1000_set_rx_mode - Secondary Unicast, Multicast and Promiscuous mode set +- * @netdev: network interface device structure +- * +- * The set_rx_mode entry point is called whenever the unicast or multicast +- * address lists or the network interface flags are updated. This routine is +- * responsible for configuring the hardware for proper unicast, multicast, ++ * e1000_set_multi - Multicast and Promiscuous mode set ++ * @netdev: network interface device structure ++ * ++ * The set_multi entry point is called whenever the multicast address ++ * list or the network interface flags are updated. This routine is ++ * responsible for configuring the hardware for proper multicast, + * promiscuous mode, and all-multi behavior. + **/ +- +-static void e1000_set_rx_mode(struct net_device *netdev) +-{ +- struct e1000_adapter *adapter = netdev_priv(netdev); +- struct e1000_hw *hw = &adapter->hw; +- struct dev_addr_list *uc_ptr; +- struct dev_addr_list *mc_ptr; ++static void e1000_set_multi(struct net_device *netdev) ++{ ++ struct e1000_adapter *adapter = netdev_priv(netdev); ++ struct e1000_hw *hw = &adapter->hw; ++ struct dev_mc_list *mc_ptr; ++ u8 *mta_list; + u32 rctl; +- u32 hash_value; +- int i, rar_entries = E1000_RAR_ENTRIES; +- int mta_reg_count = (hw->mac_type == e1000_ich8lan) ? +- E1000_NUM_MTA_REGISTERS_ICH8LAN : +- E1000_NUM_MTA_REGISTERS; +- +- if (hw->mac_type == e1000_ich8lan) +- rar_entries = E1000_RAR_ENTRIES_ICH8LAN; +- +- /* reserve RAR[14] for LAA over-write work-around */ +- if (hw->mac_type == e1000_82571) +- rar_entries--; ++ int i; + + /* Check for Promiscuous and All Multicast modes */ + +- rctl = er32(RCTL); ++ rctl = E1000_READ_REG(hw, E1000_RCTL); + + if (netdev->flags & IFF_PROMISC) { + rctl |= (E1000_RCTL_UPE | E1000_RCTL_MPE); ++ ++ /* disable VLAN filters */ + rctl &= ~E1000_RCTL_VFE; + } else { + if (netdev->flags & IFF_ALLMULTI) { + rctl |= E1000_RCTL_MPE; +- } else { +- rctl &= ~E1000_RCTL_MPE; +- } +- if (adapter->hw.mac_type != e1000_ich8lan) +- rctl |= E1000_RCTL_VFE; +- } +- +- uc_ptr = NULL; +- if (netdev->uc_count > rar_entries - 1) { +- rctl |= E1000_RCTL_UPE; +- } else if (!(netdev->flags & IFF_PROMISC)) { +- rctl &= ~E1000_RCTL_UPE; +- uc_ptr = netdev->uc_list; +- } +- +- ew32(RCTL, rctl); ++ rctl &= ~E1000_RCTL_UPE; ++ } else { ++ rctl &= ~(E1000_RCTL_UPE | E1000_RCTL_MPE); ++ } ++ ++ /* enable VLAN filters */ ++ rctl |= E1000_RCTL_VFE; ++ } ++ E1000_WRITE_REG(hw, E1000_RCTL, rctl); + + /* 82542 2.0 needs to be in reset to write receive address registers */ + +- if (hw->mac_type == e1000_82542_rev2_0) ++ if (hw->mac.type == e1000_82542) + e1000_enter_82542_rst(adapter); + +- /* load the first 14 addresses into the exact filters 1-14. Unicast +- * addresses take precedence to avoid disabling unicast filtering +- * when possible. +- * +- * RAR 0 is used for the station MAC adddress +- * if there are not 14 addresses, go ahead and clear the filters +- * -- with 82571 controllers only 0-13 entries are filled here +- */ ++ mta_list = kmalloc(netdev->mc_count * 6, GFP_ATOMIC); ++ if (!mta_list) ++ return; ++ ++ /* The shared function expects a packed array of only addresses. */ + mc_ptr = netdev->mc_list; + +- for (i = 1; i < rar_entries; i++) { +- if (uc_ptr) { +- e1000_rar_set(hw, uc_ptr->da_addr, i); +- uc_ptr = uc_ptr->next; +- } else if (mc_ptr) { +- e1000_rar_set(hw, mc_ptr->da_addr, i); +- mc_ptr = mc_ptr->next; +- } else { +- E1000_WRITE_REG_ARRAY(hw, RA, i << 1, 0); +- E1000_WRITE_FLUSH(); +- E1000_WRITE_REG_ARRAY(hw, RA, (i << 1) + 1, 0); +- E1000_WRITE_FLUSH(); +- } +- } +- WARN_ON(uc_ptr != NULL); +- +- /* clear the old settings from the multicast hash table */ +- +- for (i = 0; i < mta_reg_count; i++) { +- E1000_WRITE_REG_ARRAY(hw, MTA, i, 0); +- E1000_WRITE_FLUSH(); +- } +- +- /* load any remaining addresses into the hash table */ +- +- for (; mc_ptr; mc_ptr = mc_ptr->next) { +- hash_value = e1000_hash_mc_addr(hw, mc_ptr->da_addr); +- e1000_mta_set(hw, hash_value); +- } +- +- if (hw->mac_type == e1000_82542_rev2_0) ++ for (i = 0; i < netdev->mc_count; i++) { ++ if (!mc_ptr) ++ break; ++ memcpy(mta_list + (i*ETH_ALEN), mc_ptr->dmi_addr, ETH_ALEN); ++ mc_ptr = mc_ptr->next; ++ } ++ ++ e1000_update_mc_addr_list(hw, mta_list, i); ++ ++ kfree(mta_list); ++ ++ if (hw->mac.type == e1000_82542) + e1000_leave_82542_rst(adapter); + } + + /* Need to wait a few seconds after link up to get diagnostic information from + * the phy */ +- + static void e1000_update_phy_info(unsigned long data) + { +- struct e1000_adapter *adapter = (struct e1000_adapter *)data; +- struct e1000_hw *hw = &adapter->hw; +- e1000_phy_get_info(hw, &adapter->phy_info); ++ struct e1000_adapter *adapter = (struct e1000_adapter *) data; ++ e1000_get_phy_info(&adapter->hw); + } + + /** + * e1000_82547_tx_fifo_stall - Timer Call-back + * @data: pointer to adapter cast into an unsigned long + **/ +- + static void e1000_82547_tx_fifo_stall(unsigned long data) + { +- struct e1000_adapter *adapter = (struct e1000_adapter *)data; +- struct e1000_hw *hw = &adapter->hw; ++ struct e1000_adapter *adapter = (struct e1000_adapter *) data; + struct net_device *netdev = adapter->netdev; + u32 tctl; + + if (atomic_read(&adapter->tx_fifo_stall)) { +- if ((er32(TDT) == er32(TDH)) && +- (er32(TDFT) == er32(TDFH)) && +- (er32(TDFTS) == er32(TDFHS))) { +- tctl = er32(TCTL); +- ew32(TCTL, tctl & ~E1000_TCTL_EN); +- ew32(TDFT, adapter->tx_head_addr); +- ew32(TDFH, adapter->tx_head_addr); +- ew32(TDFTS, adapter->tx_head_addr); +- ew32(TDFHS, adapter->tx_head_addr); +- ew32(TCTL, tctl); +- E1000_WRITE_FLUSH(); ++ if ((E1000_READ_REG(&adapter->hw, E1000_TDT(0)) == ++ E1000_READ_REG(&adapter->hw, E1000_TDH(0))) && ++ (E1000_READ_REG(&adapter->hw, E1000_TDFT) == ++ E1000_READ_REG(&adapter->hw, E1000_TDFH)) && ++ (E1000_READ_REG(&adapter->hw, E1000_TDFTS) == ++ E1000_READ_REG(&adapter->hw, E1000_TDFHS))) { ++ tctl = E1000_READ_REG(&adapter->hw, E1000_TCTL); ++ E1000_WRITE_REG(&adapter->hw, E1000_TCTL, ++ tctl & ~E1000_TCTL_EN); ++ E1000_WRITE_REG(&adapter->hw, E1000_TDFT, ++ adapter->tx_head_addr); ++ E1000_WRITE_REG(&adapter->hw, E1000_TDFH, ++ adapter->tx_head_addr); ++ E1000_WRITE_REG(&adapter->hw, E1000_TDFTS, ++ adapter->tx_head_addr); ++ E1000_WRITE_REG(&adapter->hw, E1000_TDFHS, ++ adapter->tx_head_addr); ++ E1000_WRITE_REG(&adapter->hw, E1000_TCTL, tctl); ++ E1000_WRITE_FLUSH(&adapter->hw); + + adapter->tx_fifo_head = 0; + atomic_set(&adapter->tx_fifo_stall, 0); ++#ifdef CONFIG_NETDEVICES_MULTIQUEUE ++ netif_wake_subqueue(netdev, 0); ++#else + netif_wake_queue(netdev); +- } else { ++#endif ++ } else if (!test_bit(__E1000_DOWN, &adapter->state)) + mod_timer(&adapter->tx_fifo_stall_timer, jiffies + 1); +- } +- } ++ } ++} ++ ++static bool e1000_has_link(struct e1000_adapter *adapter) ++{ ++ struct e1000_hw *hw = &adapter->hw; ++ bool link_active = FALSE; ++ s32 ret_val = 0; ++ ++ /* get_link_status is set on LSC (link status) interrupt or ++ * rx sequence error interrupt. get_link_status will stay ++ * false until the e1000_check_for_link establishes link ++ * for copper adapters ONLY ++ */ ++ switch (hw->phy.media_type) { ++ case e1000_media_type_copper: ++ if (hw->mac.get_link_status) { ++ ret_val = e1000_check_for_link(hw); ++ link_active = !hw->mac.get_link_status; ++ } else { ++ link_active = TRUE; ++ } ++ break; ++ case e1000_media_type_fiber: ++ ret_val = e1000_check_for_link(hw); ++ link_active = !!(E1000_READ_REG(hw, E1000_STATUS) & ++ E1000_STATUS_LU); ++ break; ++ case e1000_media_type_internal_serdes: ++ ret_val = e1000_check_for_link(hw); ++ link_active = adapter->hw.mac.serdes_has_link; ++ break; ++ default: ++ case e1000_media_type_unknown: ++ break; ++ } ++ ++ if ((ret_val == E1000_ERR_PHY) && (hw->phy.type == e1000_phy_igp_3) && ++ (E1000_READ_REG(&adapter->hw, E1000_CTRL) & E1000_PHY_CTRL_GBE_DISABLE)) { ++ DPRINTK(LINK, INFO, ++ "Gigabit has been disabled, downgrading speed\n"); ++ } ++ ++ return link_active; + } + + /** +@@ -2604,43 +2230,39 @@ + **/ + static void e1000_watchdog(unsigned long data) + { +- struct e1000_adapter *adapter = (struct e1000_adapter *)data; +- struct e1000_hw *hw = &adapter->hw; +- struct net_device *netdev = adapter->netdev; +- struct e1000_tx_ring *txdr = adapter->tx_ring; ++ struct e1000_adapter *adapter = (struct e1000_adapter *) data; ++ ++ /* Do the rest outside of interrupt context */ ++ schedule_work(&adapter->watchdog_task); ++} ++ ++static void e1000_watchdog_task(struct work_struct *work) ++{ ++ struct e1000_adapter *adapter = container_of(work, ++ struct e1000_adapter, watchdog_task); ++ struct net_device *netdev = adapter->netdev; ++ struct e1000_mac_info *mac = &adapter->hw.mac; ++ struct e1000_tx_ring *tx_ring; + u32 link, tctl; +- s32 ret_val; +- +- ret_val = e1000_check_for_link(hw); +- if ((ret_val == E1000_ERR_PHY) && +- (hw->phy_type == e1000_phy_igp_3) && +- (er32(CTRL) & E1000_PHY_CTRL_GBE_DISABLE)) { +- /* See e1000_kumeran_lock_loss_workaround() */ +- DPRINTK(LINK, INFO, +- "Gigabit has been disabled, downgrading speed\n"); +- } +- +- if (hw->mac_type == e1000_82573) { +- e1000_enable_tx_pkt_filtering(hw); +- if (adapter->mng_vlan_id != hw->mng_cookie.vlan_id) +- e1000_update_mng_vlan(adapter); +- } +- +- if ((hw->media_type == e1000_media_type_internal_serdes) && +- !(er32(TXCW) & E1000_TXCW_ANE)) +- link = !hw->serdes_link_down; +- else +- link = er32(STATUS) & E1000_STATUS_LU; ++ int i, tx_pending = 0; ++ ++ link = e1000_has_link(adapter); ++ if ((netif_carrier_ok(netdev)) && link) ++ goto link_up; + + if (link) { + if (!netif_carrier_ok(netdev)) { + u32 ctrl; +- bool txb2b = true; +- e1000_get_speed_and_duplex(hw, ++ bool txb2b = 1; ++#ifdef SIOCGMIIPHY ++ /* update snapshot of PHY registers on LSC */ ++ e1000_phy_read_status(adapter); ++#endif ++ e1000_get_speed_and_duplex(&adapter->hw, + &adapter->link_speed, + &adapter->link_duplex); + +- ctrl = er32(CTRL); ++ ctrl = E1000_READ_REG(&adapter->hw, E1000_CTRL); + DPRINTK(LINK, INFO, "NIC Link is Up %d Mbps %s, " + "Flow Control: %s\n", + adapter->link_speed, +@@ -2657,64 +2279,61 @@ + adapter->tx_timeout_factor = 1; + switch (adapter->link_speed) { + case SPEED_10: +- txb2b = false; ++ txb2b = 0; + netdev->tx_queue_len = 10; +- adapter->tx_timeout_factor = 8; ++ adapter->tx_timeout_factor = 16; + break; + case SPEED_100: +- txb2b = false; ++ txb2b = 0; + netdev->tx_queue_len = 100; + /* maybe add some timeout factor ? */ + break; + } + +- if ((hw->mac_type == e1000_82571 || +- hw->mac_type == e1000_82572) && +- !txb2b) { +- u32 tarc0; +- tarc0 = er32(TARC0); +- tarc0 &= ~(1 << 21); +- ew32(TARC0, tarc0); +- } +- ++#ifdef NETIF_F_TSO + /* disable TSO for pcie and 10/100 speeds, to avoid + * some hardware issues */ +- if (!adapter->tso_force && +- hw->bus_type == e1000_bus_type_pci_express){ ++ if (!(adapter->flags & E1000_FLAG_TSO_FORCE) && ++ adapter->hw.bus.type == e1000_bus_type_pci_express){ + switch (adapter->link_speed) { + case SPEED_10: + case SPEED_100: + DPRINTK(PROBE,INFO, + "10/100 speed: disabling TSO\n"); + netdev->features &= ~NETIF_F_TSO; ++#ifdef NETIF_F_TSO6 + netdev->features &= ~NETIF_F_TSO6; ++#endif + break; + case SPEED_1000: + netdev->features |= NETIF_F_TSO; ++#ifdef NETIF_F_TSO6 + netdev->features |= NETIF_F_TSO6; ++#endif + break; + default: + /* oops */ + break; + } + } ++#endif + + /* enable transmits in the hardware, need to do this + * after setting TARC0 */ +- tctl = er32(TCTL); ++ tctl = E1000_READ_REG(&adapter->hw, E1000_TCTL); + tctl |= E1000_TCTL_EN; +- ew32(TCTL, tctl); ++ E1000_WRITE_REG(&adapter->hw, E1000_TCTL, tctl); + + netif_carrier_on(netdev); ++#ifdef CONFIG_NETDEVICES_MULTIQUEUE ++ netif_wake_subqueue(netdev, 0); ++#endif + netif_wake_queue(netdev); +- mod_timer(&adapter->phy_info_timer, round_jiffies(jiffies + 2 * HZ)); ++ ++ if (!test_bit(__E1000_DOWN, &adapter->state)) ++ mod_timer(&adapter->phy_info_timer, ++ round_jiffies(jiffies + 2 * HZ)); + adapter->smartspeed = 0; +- } else { +- /* make sure the receive unit is started */ +- if (hw->rx_needs_kicking) { +- u32 rctl = er32(RCTL); +- ew32(RCTL, rctl | E1000_RCTL_EN); +- } + } + } else { + if (netif_carrier_ok(netdev)) { +@@ -2722,38 +2341,41 @@ + adapter->link_duplex = 0; + DPRINTK(LINK, INFO, "NIC Link is Down\n"); + netif_carrier_off(netdev); ++#ifdef CONFIG_NETDEVICES_MULTIQUEUE ++ netif_stop_subqueue(netdev, 0); ++#endif + netif_stop_queue(netdev); +- mod_timer(&adapter->phy_info_timer, round_jiffies(jiffies + 2 * HZ)); +- +- /* 80003ES2LAN workaround-- +- * For packet buffer work-around on link down event; +- * disable receives in the ISR and +- * reset device here in the watchdog +- */ +- if (hw->mac_type == e1000_80003es2lan) +- /* reset device */ +- schedule_work(&adapter->reset_task); ++ ++ if (!test_bit(__E1000_DOWN, &adapter->state)) ++ mod_timer(&adapter->phy_info_timer, ++ round_jiffies(jiffies + 2 * HZ)); + } + + e1000_smartspeed(adapter); + } + ++link_up: + e1000_update_stats(adapter); + +- hw->tx_packet_delta = adapter->stats.tpt - adapter->tpt_old; ++ mac->tx_packet_delta = adapter->stats.tpt - adapter->tpt_old; + adapter->tpt_old = adapter->stats.tpt; +- hw->collision_delta = adapter->stats.colc - adapter->colc_old; ++ mac->collision_delta = adapter->stats.colc - adapter->colc_old; + adapter->colc_old = adapter->stats.colc; + +- adapter->gorcl = adapter->stats.gorcl - adapter->gorcl_old; +- adapter->gorcl_old = adapter->stats.gorcl; +- adapter->gotcl = adapter->stats.gotcl - adapter->gotcl_old; +- adapter->gotcl_old = adapter->stats.gotcl; +- +- e1000_update_adaptive(hw); ++ adapter->gorc = adapter->stats.gorc - adapter->gorc_old; ++ adapter->gorc_old = adapter->stats.gorc; ++ adapter->gotc = adapter->stats.gotc - adapter->gotc_old; ++ adapter->gotc_old = adapter->stats.gotc; ++ ++ e1000_update_adaptive(&adapter->hw); + + if (!netif_carrier_ok(netdev)) { +- if (E1000_DESC_UNUSED(txdr) + 1 < txdr->count) { ++ for (i = 0 ; i < adapter->num_tx_queues ; i++) { ++ tx_ring = &adapter->tx_ring[i]; ++ tx_pending |= (E1000_DESC_UNUSED(tx_ring) + ++ tx_ring->step < tx_ring->count); ++ } ++ if (tx_pending) { + /* We've lost link, so the controller stops DMA, + * but we've got queued Tx work that's never going + * to get done, so reset controller to flush Tx. +@@ -2764,18 +2386,15 @@ + } + + /* Cause software interrupt to ensure rx ring is cleaned */ +- ew32(ICS, E1000_ICS_RXDMT0); ++ E1000_WRITE_REG(&adapter->hw, E1000_ICS, E1000_ICS_RXDMT0); + + /* Force detection of hung controller every watchdog period */ +- adapter->detect_tx_hung = true; +- +- /* With 82571 controllers, LAA may be overwritten due to controller +- * reset from the other port. Set the appropriate LAA in RAR[0] */ +- if (hw->mac_type == e1000_82571 && hw->laa_is_present) +- e1000_rar_set(hw, hw->mac_addr, 0); ++ adapter->detect_tx_hung = TRUE; + + /* Reset the timer */ +- mod_timer(&adapter->watchdog_timer, round_jiffies(jiffies + 2 * HZ)); ++ if (!test_bit(__E1000_DOWN, &adapter->state)) ++ mod_timer(&adapter->watchdog_timer, ++ round_jiffies(jiffies + 2 * HZ)); + } + + enum latency_range { +@@ -2787,6 +2406,11 @@ + + /** + * e1000_update_itr - update the dynamic ITR value based on statistics ++ * @adapter: pointer to adapter ++ * @itr_setting: current adapter->itr ++ * @packets: the number of packets during this measurement interval ++ * @bytes: the number of bytes during this measurement interval ++ * + * Stores a new ITR value based on packets and byte + * counts during the last interrupt. The advantage of per interrupt + * computation is faster updates and more accurate ITR for the current +@@ -2796,18 +2420,14 @@ + * while increasing bulk throughput. + * this functionality is controlled by the InterruptThrottleRate module + * parameter (see e1000_param.c) +- * @adapter: pointer to adapter +- * @itr_setting: current adapter->itr +- * @packets: the number of packets during this measurement interval +- * @bytes: the number of bytes during this measurement interval + **/ + static unsigned int e1000_update_itr(struct e1000_adapter *adapter, +- u16 itr_setting, int packets, int bytes) ++ u16 itr_setting, int packets, ++ int bytes) + { + unsigned int retval = itr_setting; +- struct e1000_hw *hw = &adapter->hw; +- +- if (unlikely(hw->mac_type < e1000_82540)) ++ ++ if (unlikely(!(adapter->flags & E1000_FLAG_HAS_INTR_MODERATION))) + goto update_itr_done; + + if (packets == 0) +@@ -2815,30 +2435,34 @@ + + switch (itr_setting) { + case lowest_latency: +- /* jumbo frames get bulk treatment*/ ++ /* handle TSO and jumbo frames */ + if (bytes/packets > 8000) + retval = bulk_latency; +- else if ((packets < 5) && (bytes > 512)) ++ else if ((packets < 5) && (bytes > 512)) { + retval = low_latency; ++ } + break; + case low_latency: /* 50 usec aka 20000 ints/s */ + if (bytes > 10000) { +- /* jumbo frames need bulk latency setting */ +- if (bytes/packets > 8000) ++ /* this if handles the TSO accounting */ ++ if (bytes/packets > 8000) { + retval = bulk_latency; +- else if ((packets < 10) || ((bytes/packets) > 1200)) ++ } else if ((packets < 10) || ((bytes/packets) > 1200)) { + retval = bulk_latency; +- else if ((packets > 35)) ++ } else if ((packets > 35)) { + retval = lowest_latency; +- } else if (bytes/packets > 2000) ++ } ++ } else if (bytes/packets > 2000) { + retval = bulk_latency; +- else if (packets <= 2 && bytes < 512) ++ } else if (packets <= 2 && bytes < 512) { + retval = lowest_latency; ++ } + break; + case bulk_latency: /* 250 usec aka 4000 ints/s */ + if (bytes > 25000) { +- if (packets > 35) ++ if (packets > 35) { + retval = low_latency; ++ } + } else if (bytes < 6000) { + retval = low_latency; + } +@@ -2855,7 +2479,7 @@ + u16 current_itr; + u32 new_itr = adapter->itr; + +- if (unlikely(hw->mac_type < e1000_82540)) ++ if (unlikely(!(adapter->flags & E1000_FLAG_HAS_INTR_MODERATION))) + return; + + /* for non-gigabit speeds, just fix the interrupt rate at 4000 */ +@@ -2907,7 +2531,7 @@ + min(adapter->itr + (new_itr >> 2), new_itr) : + new_itr; + adapter->itr = new_itr; +- ew32(ITR, 1000000000 / (new_itr * 256)); ++ E1000_WRITE_REG(hw, E1000_ITR, 1000000000 / (new_itr * 256)); + } + + return; +@@ -2921,8 +2545,9 @@ + #define E1000_TX_FLAGS_VLAN_SHIFT 16 + + static int e1000_tso(struct e1000_adapter *adapter, +- struct e1000_tx_ring *tx_ring, struct sk_buff *skb) +-{ ++ struct e1000_tx_ring *tx_ring, struct sk_buff *skb) ++{ ++#ifdef NETIF_F_TSO + struct e1000_context_desc *context_desc; + struct e1000_buffer *buffer_info; + unsigned int i; +@@ -2950,13 +2575,15 @@ + 0); + cmd_length = E1000_TXD_CMD_IP; + ipcse = skb_transport_offset(skb) - 1; +- } else if (skb->protocol == htons(ETH_P_IPV6)) { ++#ifdef NETIF_F_TSO6 ++ } else if (skb_shinfo(skb)->gso_type == SKB_GSO_TCPV6) { + ipv6_hdr(skb)->payload_len = 0; + tcp_hdr(skb)->check = + ~csum_ipv6_magic(&ipv6_hdr(skb)->saddr, + &ipv6_hdr(skb)->daddr, + 0, IPPROTO_TCP, 0); + ipcse = 0; ++#endif + } + ipcss = skb_network_offset(skb); + ipcso = (void *)&(ip_hdr(skb)->check) - (void *)skb->data; +@@ -2984,90 +2611,111 @@ + buffer_info->time_stamp = jiffies; + buffer_info->next_to_watch = i; + +- if (++i == tx_ring->count) i = 0; ++ E1000_TX_DESC_INC(tx_ring,i); + tx_ring->next_to_use = i; + +- return true; +- } +- return false; ++ return TRUE; ++ } ++#endif ++ ++ return FALSE; + } + + static bool e1000_tx_csum(struct e1000_adapter *adapter, +- struct e1000_tx_ring *tx_ring, struct sk_buff *skb) ++ struct e1000_tx_ring *tx_ring, ++ struct sk_buff *skb) + { + struct e1000_context_desc *context_desc; + struct e1000_buffer *buffer_info; + unsigned int i; + u8 css; +- +- if (likely(skb->ip_summed == CHECKSUM_PARTIAL)) { +- css = skb_transport_offset(skb); +- +- i = tx_ring->next_to_use; +- buffer_info = &tx_ring->buffer_info[i]; +- context_desc = E1000_CONTEXT_DESC(*tx_ring, i); +- +- context_desc->lower_setup.ip_config = 0; +- context_desc->upper_setup.tcp_fields.tucss = css; +- context_desc->upper_setup.tcp_fields.tucso = +- css + skb->csum_offset; +- context_desc->upper_setup.tcp_fields.tucse = 0; +- context_desc->tcp_seg_setup.data = 0; +- context_desc->cmd_and_length = cpu_to_le32(E1000_TXD_CMD_DEXT); +- +- buffer_info->time_stamp = jiffies; +- buffer_info->next_to_watch = i; +- +- if (unlikely(++i == tx_ring->count)) i = 0; +- tx_ring->next_to_use = i; +- +- return true; +- } +- +- return false; +-} +- +-#define E1000_MAX_TXD_PWR 12 +-#define E1000_MAX_DATA_PER_TXD (1<ip_summed != CHECKSUM_PARTIAL)) ++ return FALSE; ++ ++ switch (skb->protocol) { ++ case __constant_htons(ETH_P_IP): ++ if (ip_hdr(skb)->protocol == IPPROTO_TCP) ++ cmd_len |= E1000_TXD_CMD_TCP; ++ break; ++ case __constant_htons(ETH_P_IPV6): ++ /* XXX not handling all IPV6 headers */ ++ if (ipv6_hdr(skb)->nexthdr == IPPROTO_TCP) ++ cmd_len |= E1000_TXD_CMD_TCP; ++ break; ++ default: ++ if (unlikely(net_ratelimit())) { ++ DPRINTK(PROBE, WARNING, "checksum_partial proto=%x!\n", ++ skb->protocol); ++ } ++ break; ++ } ++ ++ css = skb_transport_offset(skb); ++ ++ i = tx_ring->next_to_use; ++ buffer_info = &tx_ring->buffer_info[i]; ++ context_desc = E1000_CONTEXT_DESC(*tx_ring, i); ++ ++ context_desc->lower_setup.ip_config = 0; ++ context_desc->upper_setup.tcp_fields.tucss = css; ++ context_desc->upper_setup.tcp_fields.tucso = css + ++ skb->csum_offset; ++ context_desc->upper_setup.tcp_fields.tucse = 0; ++ context_desc->tcp_seg_setup.data = 0; ++ context_desc->cmd_and_length = cpu_to_le32(cmd_len); ++ ++ buffer_info->time_stamp = jiffies; ++ buffer_info->next_to_watch = i; ++ ++ E1000_TX_DESC_INC(tx_ring,i); ++ tx_ring->next_to_use = i; ++ ++ return TRUE; ++} + + static int e1000_tx_map(struct e1000_adapter *adapter, +- struct e1000_tx_ring *tx_ring, +- struct sk_buff *skb, unsigned int first, +- unsigned int max_per_txd, unsigned int nr_frags, +- unsigned int mss) +-{ +- struct e1000_hw *hw = &adapter->hw; ++ struct e1000_tx_ring *tx_ring, ++ struct sk_buff *skb, unsigned int first, ++ unsigned int max_per_txd, unsigned int nr_frags, ++ unsigned int mss) ++{ + struct e1000_buffer *buffer_info; + unsigned int len = skb->len; + unsigned int offset = 0, size, count = 0, i; ++#ifdef MAX_SKB_FRAGS + unsigned int f; + len -= skb->data_len; ++#endif + + i = tx_ring->next_to_use; + + while (len) { + buffer_info = &tx_ring->buffer_info[i]; + size = min(len, max_per_txd); ++#ifdef NETIF_F_TSO + /* Workaround for Controller erratum -- + * descriptor for non-tso packet in a linear SKB that follows a + * tso gets written back prematurely before the data is fully + * DMA'd to the controller */ +- if (!skb->data_len && tx_ring->last_tx_tso && +- !skb_is_gso(skb)) { ++ if (tx_ring->last_tx_tso && !skb_is_gso(skb)) { + tx_ring->last_tx_tso = 0; +- size -= 4; ++ if (!skb->data_len) ++ size -= 4; + } + + /* Workaround for premature desc write-backs + * in TSO mode. Append 4-byte sentinel desc */ + if (unlikely(mss && !nr_frags && size == len && size > 8)) + size -= 4; ++#endif + /* work-around for errata 10 and it applies + * to all controllers in PCI-X mode + * The fix is to make sure that the first descriptor of a + * packet is smaller than 2048 - 16 - 16 (or 2016) bytes + */ +- if (unlikely((hw->bus_type == e1000_bus_type_pcix) && ++ if (unlikely((adapter->hw.bus.type == e1000_bus_type_pcix) && + (size > 2015) && count == 0)) + size = 2015; + +@@ -3079,20 +2727,22 @@ + size -= 4; + + buffer_info->length = size; ++ /* set time_stamp *before* dma to help avoid a possible race */ ++ buffer_info->time_stamp = jiffies; + buffer_info->dma = + pci_map_single(adapter->pdev, + skb->data + offset, + size, + PCI_DMA_TODEVICE); +- buffer_info->time_stamp = jiffies; + buffer_info->next_to_watch = i; + + len -= size; + offset += size; + count++; +- if (unlikely(++i == tx_ring->count)) i = 0; +- } +- ++ E1000_TX_DESC_INC(tx_ring,i); ++ } ++ ++#ifdef MAX_SKB_FRAGS + for (f = 0; f < nr_frags; f++) { + struct skb_frag_struct *frag; + +@@ -3103,10 +2753,12 @@ + while (len) { + buffer_info = &tx_ring->buffer_info[i]; + size = min(len, max_per_txd); ++#ifdef NETIF_F_TSO + /* Workaround for premature desc write-backs + * in TSO mode. Append 4-byte sentinel desc */ + if (unlikely(mss && f == (nr_frags-1) && size == len && size > 8)) + size -= 4; ++#endif + /* Workaround for potential 82544 hang in PCI-X. + * Avoid terminating buffers within evenly-aligned + * dwords. */ +@@ -3116,23 +2768,23 @@ + size -= 4; + + buffer_info->length = size; ++ buffer_info->time_stamp = jiffies; + buffer_info->dma = + pci_map_page(adapter->pdev, + frag->page, + offset, + size, + PCI_DMA_TODEVICE); +- buffer_info->time_stamp = jiffies; + buffer_info->next_to_watch = i; + + len -= size; + offset += size; + count++; +- if (unlikely(++i == tx_ring->count)) i = 0; +- } +- } +- +- i = (i == 0) ? tx_ring->count - 1 : i - 1; ++ E1000_TX_DESC_INC(tx_ring,i); ++ } ++ } ++#endif ++ E1000_TX_DESC_DEC(tx_ring,i); + tx_ring->buffer_info[i].skb = skb; + tx_ring->buffer_info[first].next_to_watch = i; + +@@ -3140,10 +2792,9 @@ + } + + static void e1000_tx_queue(struct e1000_adapter *adapter, +- struct e1000_tx_ring *tx_ring, int tx_flags, +- int count) +-{ +- struct e1000_hw *hw = &adapter->hw; ++ struct e1000_tx_ring *tx_ring, ++ int tx_flags, int count) ++{ + struct e1000_tx_desc *tx_desc = NULL; + struct e1000_buffer *buffer_info; + u32 txd_upper = 0, txd_lower = E1000_TXD_CMD_IFCS; +@@ -3177,7 +2828,7 @@ + tx_desc->lower.data = + cpu_to_le32(txd_lower | buffer_info->length); + tx_desc->upper.data = cpu_to_le32(txd_upper); +- if (unlikely(++i == tx_ring->count)) i = 0; ++ E1000_TX_DESC_INC(tx_ring,i); + } + + tx_desc->lower.data |= cpu_to_le32(adapter->txd_cmd); +@@ -3189,11 +2840,14 @@ + wmb(); + + tx_ring->next_to_use = i; +- writel(i, hw->hw_addr + tx_ring->tdt); ++ writel(i, adapter->hw.hw_addr + tx_ring->tdt); + /* we need this if more than one processor can write to our tail +- * at a time, it syncronizes IO on IA64/Altix systems */ ++ * at a time, it synchronizes IO on IA64/Altix systems */ + mmiowb(); + } ++ ++#define E1000_FIFO_HDR 0x10 ++#define E1000_82547_PAD_LEN 0x3E0 + + /** + * 82547 workaround to avoid controller hang in half-duplex environment. +@@ -3203,12 +2857,8 @@ + * flush all packets. When that occurs, we reset the Tx FIFO pointers + * to the beginning of the Tx FIFO. + **/ +- +-#define E1000_FIFO_HDR 0x10 +-#define E1000_82547_PAD_LEN 0x3E0 +- + static int e1000_82547_fifo_workaround(struct e1000_adapter *adapter, +- struct sk_buff *skb) ++ struct sk_buff *skb) + { + u32 fifo_space = adapter->tx_fifo_size - adapter->tx_fifo_head; + u32 skb_fifo_len = skb->len + E1000_FIFO_HDR; +@@ -3233,47 +2883,16 @@ + return 0; + } + +-#define MINIMUM_DHCP_PACKET_SIZE 282 +-static int e1000_transfer_dhcp_info(struct e1000_adapter *adapter, +- struct sk_buff *skb) +-{ +- struct e1000_hw *hw = &adapter->hw; +- u16 length, offset; +- if (vlan_tx_tag_present(skb)) { +- if (!((vlan_tx_tag_get(skb) == hw->mng_cookie.vlan_id) && +- ( hw->mng_cookie.status & +- E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT)) ) +- return 0; +- } +- if (skb->len > MINIMUM_DHCP_PACKET_SIZE) { +- struct ethhdr *eth = (struct ethhdr *)skb->data; +- if ((htons(ETH_P_IP) == eth->h_proto)) { +- const struct iphdr *ip = +- (struct iphdr *)((u8 *)skb->data+14); +- if (IPPROTO_UDP == ip->protocol) { +- struct udphdr *udp = +- (struct udphdr *)((u8 *)ip + +- (ip->ihl << 2)); +- if (ntohs(udp->dest) == 67) { +- offset = (u8 *)udp + 8 - skb->data; +- length = skb->len - offset; +- +- return e1000_mng_write_dhcp_info(hw, +- (u8 *)udp + 8, +- length); +- } +- } +- } +- } +- return 0; +-} +- +-static int __e1000_maybe_stop_tx(struct net_device *netdev, int size) +-{ +- struct e1000_adapter *adapter = netdev_priv(netdev); +- struct e1000_tx_ring *tx_ring = adapter->tx_ring; +- ++static int __e1000_maybe_stop_tx(struct net_device *netdev, ++ struct e1000_tx_ring *tx_ring, int size) ++{ ++ struct e1000_adapter *adapter = netdev_priv(netdev); ++ ++#ifdef CONFIG_NETDEVICES_MULTIQUEUE ++ netif_stop_subqueue(netdev, 0); ++#else + netif_stop_queue(netdev); ++#endif + /* Herbert's original patch had: + * smp_mb__after_netif_stop_queue(); + * but since that doesn't exist yet, just open code it. */ +@@ -3281,11 +2900,16 @@ + + /* We need to check again in a case another CPU has just + * made room available. */ +- if (likely(E1000_DESC_UNUSED(tx_ring) < size)) ++ if (likely(E1000_DESC_UNUSED(tx_ring) < ((size) * tx_ring->step))) + return -EBUSY; + + /* A reprieve! */ ++#ifdef CONFIG_NETDEVICES_MULTIQUEUE ++ /* Only one subqueue, which is our only queue. */ ++ netif_start_subqueue(netdev, 0); ++#else + netif_start_queue(netdev); ++#endif + ++adapter->restart_queue; + return 0; + } +@@ -3293,44 +2917,54 @@ + static int e1000_maybe_stop_tx(struct net_device *netdev, + struct e1000_tx_ring *tx_ring, int size) + { +- if (likely(E1000_DESC_UNUSED(tx_ring) >= size)) ++ if (likely(E1000_DESC_UNUSED(tx_ring) >= ((size) * tx_ring->step))) + return 0; +- return __e1000_maybe_stop_tx(netdev, size); ++ return __e1000_maybe_stop_tx(netdev, tx_ring, size); + } + + #define TXD_USE_COUNT(S, X) (((S) >> (X)) + 1 ) +-static int e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev) +-{ +- struct e1000_adapter *adapter = netdev_priv(netdev); +- struct e1000_hw *hw = &adapter->hw; +- struct e1000_tx_ring *tx_ring; +- unsigned int first, max_per_txd = E1000_MAX_DATA_PER_TXD; +- unsigned int max_txd_pwr = E1000_MAX_TXD_PWR; ++static int e1000_xmit_frame_ring(struct sk_buff *skb, ++ struct net_device *netdev, ++ struct e1000_tx_ring *tx_ring) ++{ ++ struct e1000_adapter *adapter = netdev_priv(netdev); ++ unsigned int max_txd_pwr = adapter->tx_desc_pwr; ++ unsigned int first, max_per_txd = (1 << max_txd_pwr); + unsigned int tx_flags = 0; +- unsigned int len = skb->len - skb->data_len; +- unsigned long flags; +- unsigned int nr_frags; +- unsigned int mss; ++ unsigned int len = skb->len; ++ unsigned long irq_flags; ++ unsigned int nr_frags = 0; ++ unsigned int mss = 0; + int count = 0; + int tso; ++#ifdef MAX_SKB_FRAGS + unsigned int f; +- +- /* This goes back to the question of how to logically map a tx queue +- * to a flow. Right now, performance is impacted slightly negatively +- * if using multiple tx queues. If the stack breaks away from a +- * single qdisc implementation, we can look at this again. */ +- tx_ring = adapter->tx_ring; ++ len -= skb->data_len; ++#endif ++ ++ if (test_bit(__E1000_DOWN, &adapter->state)) { ++ dev_kfree_skb_any(skb); ++ return NETDEV_TX_OK; ++ } + + if (unlikely(skb->len <= 0)) { + dev_kfree_skb_any(skb); + return NETDEV_TX_OK; + } +- +- /* 82571 and newer doesn't need the workaround that limited descriptor +- * length to 4kB */ +- if (hw->mac_type >= e1000_82571) +- max_per_txd = 8192; +- ++ /* On PCIX HW, there have been rare TXHangs caused by custom apps ++ * sending frames with skb->len == 16 (macdest+macsrc+protocol+2bytes). ++ * Such frames are not transmitted by registered protocols, so are ++ * only a problem for experimental code. ++ * Pad all 16 byte packets with an additional byte to work-around this ++ * problem case. ++ */ ++ if (unlikely(skb->len == 16)) { ++ skb_pad(skb,1); ++ skb_put(skb,1); ++ } ++ ++ ++#ifdef NETIF_F_TSO + mss = skb_shinfo(skb)->gso_size; + /* The controller does a simple calculation to + * make sure there is enough room in the FIFO before +@@ -3347,8 +2981,8 @@ + * points to just header, pull a few bytes of payload from + * frags into skb->data */ + hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb); +- if (skb->data_len && hdr_len == len) { +- switch (hw->mac_type) { ++ if (skb->data_len && (hdr_len == (skb->len - skb->data_len))) { ++ switch (adapter->hw.mac.type) { + unsigned int pull_size; + case e1000_82544: + /* Make sure we have room to chop off 4 bytes, +@@ -3359,11 +2993,6 @@ + * into the next dword */ + if ((unsigned long)(skb_tail_pointer(skb) - 1) & 4) + break; +- /* fall through */ +- case e1000_82571: +- case e1000_82572: +- case e1000_82573: +- case e1000_ich8lan: + pull_size = min((unsigned int)4, skb->data_len); + if (!__pskb_pull_tail(skb, pull_size)) { + DPRINTK(DRV, ERR, +@@ -3384,10 +3013,16 @@ + if ((mss) || (skb->ip_summed == CHECKSUM_PARTIAL)) + count++; + count++; +- ++#else ++ if (skb->ip_summed == CHECKSUM_PARTIAL) ++ count++; ++#endif ++ ++#ifdef NETIF_F_TSO + /* Controller Erratum workaround */ + if (!skb->data_len && tx_ring->last_tx_tso && !skb_is_gso(skb)) + count++; ++#endif + + count += TXD_USE_COUNT(len, max_txd_pwr); + +@@ -3397,10 +3032,11 @@ + /* work-around for errata 10 and it applies to all controllers + * in PCI-X mode, so add one more descriptor to the count + */ +- if (unlikely((hw->bus_type == e1000_bus_type_pcix) && ++ if (unlikely((adapter->hw.bus.type == e1000_bus_type_pcix) && + (len > 2015))) + count++; + ++#ifdef MAX_SKB_FRAGS + nr_frags = skb_shinfo(skb)->nr_frags; + for (f = 0; f < nr_frags; f++) + count += TXD_USE_COUNT(skb_shinfo(skb)->frags[f].size, +@@ -3408,47 +3044,64 @@ + if (adapter->pcix_82544) + count += nr_frags; + +- +- if (hw->tx_pkt_filtering && +- (hw->mac_type == e1000_82573)) +- e1000_transfer_dhcp_info(adapter, skb); +- +- if (!spin_trylock_irqsave(&tx_ring->tx_lock, flags)) ++#endif ++ ++#ifdef NETIF_F_LLTX ++ if (!spin_trylock_irqsave(&tx_ring->tx_lock, irq_flags)) { + /* Collision - tell upper layer to requeue */ + return NETDEV_TX_LOCKED; ++ } ++#else ++ spin_lock_irqsave(&tx_ring->tx_lock, irq_flags); ++#endif + + /* need: count + 2 desc gap to keep tail from touching + * head, otherwise try next time */ + if (unlikely(e1000_maybe_stop_tx(netdev, tx_ring, count + 2))) { +- spin_unlock_irqrestore(&tx_ring->tx_lock, flags); ++ spin_unlock_irqrestore(&tx_ring->tx_lock, irq_flags); + return NETDEV_TX_BUSY; + } + +- if (unlikely(hw->mac_type == e1000_82547)) { ++ if (unlikely(adapter->hw.mac.type == e1000_82547)) { + if (unlikely(e1000_82547_fifo_workaround(adapter, skb))) { ++#ifdef CONFIG_NETDEVICES_MULTIQUEUE ++ netif_stop_subqueue(netdev, 0); ++#else + netif_stop_queue(netdev); +- mod_timer(&adapter->tx_fifo_stall_timer, jiffies + 1); +- spin_unlock_irqrestore(&tx_ring->tx_lock, flags); ++#endif ++ if (!test_bit(__E1000_DOWN, &adapter->state)) ++ mod_timer(&adapter->tx_fifo_stall_timer, ++ jiffies + 1); ++ spin_unlock_irqrestore(&tx_ring->tx_lock, irq_flags); + return NETDEV_TX_BUSY; + } + } + ++#ifndef NETIF_F_LLTX ++ spin_unlock_irqrestore(&tx_ring->tx_lock, irq_flags); ++ ++#endif ++#ifdef NETIF_F_HW_VLAN_TX + if (unlikely(adapter->vlgrp && vlan_tx_tag_present(skb))) { + tx_flags |= E1000_TX_FLAGS_VLAN; + tx_flags |= (vlan_tx_tag_get(skb) << E1000_TX_FLAGS_VLAN_SHIFT); + } ++#endif + + first = tx_ring->next_to_use; + + tso = e1000_tso(adapter, tx_ring, skb); + if (tso < 0) { + dev_kfree_skb_any(skb); +- spin_unlock_irqrestore(&tx_ring->tx_lock, flags); ++#ifdef NETIF_F_LLTX ++ spin_unlock_irqrestore(&tx_ring->tx_lock, irq_flags); ++#endif + return NETDEV_TX_OK; + } + + if (likely(tso)) { +- tx_ring->last_tx_tso = 1; ++ if (likely(adapter->hw.mac.type != e1000_82544)) ++ tx_ring->last_tx_tso = 1; + tx_flags |= E1000_TX_FLAGS_TSO; + } else if (likely(e1000_tx_csum(adapter, tx_ring, skb))) + tx_flags |= E1000_TX_FLAGS_CSUM; +@@ -3468,15 +3121,31 @@ + /* Make sure there is space in the ring for the next send. */ + e1000_maybe_stop_tx(netdev, tx_ring, MAX_SKB_FRAGS + 2); + +- spin_unlock_irqrestore(&tx_ring->tx_lock, flags); ++#ifdef NETIF_F_LLTX ++ spin_unlock_irqrestore(&tx_ring->tx_lock, irq_flags); ++#endif + return NETDEV_TX_OK; + } + ++static int e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev) ++{ ++ struct e1000_adapter *adapter = netdev_priv(netdev); ++ struct e1000_tx_ring *tx_ring = adapter->tx_ring; ++ ++ /* This goes back to the question of how to logically map a tx queue ++ * to a flow. Right now, performance is impacted slightly negatively ++ * if using multiple tx queues. If the stack breaks away from a ++ * single qdisc implementation, we can look at this again. */ ++ ++ return (e1000_xmit_frame_ring(skb, netdev, tx_ring)); ++} ++ ++ ++ + /** + * e1000_tx_timeout - Respond to a Tx Hang + * @netdev: network interface device structure + **/ +- + static void e1000_tx_timeout(struct net_device *netdev) + { + struct e1000_adapter *adapter = netdev_priv(netdev); +@@ -3488,8 +3157,8 @@ + + static void e1000_reset_task(struct work_struct *work) + { +- struct e1000_adapter *adapter = +- container_of(work, struct e1000_adapter, reset_task); ++ struct e1000_adapter *adapter; ++ adapter = container_of(work, struct e1000_adapter, reset_task); + + e1000_reinit_locked(adapter); + } +@@ -3501,8 +3170,7 @@ + * Returns the address of the device statistics structure. + * The statistics are actually updated from the timer callback. + **/ +- +-static struct net_device_stats *e1000_get_stats(struct net_device *netdev) ++static struct net_device_stats * e1000_get_stats(struct net_device *netdev) + { + struct e1000_adapter *adapter = netdev_priv(netdev); + +@@ -3517,65 +3185,43 @@ + * + * Returns 0 on success, negative on failure + **/ +- + static int e1000_change_mtu(struct net_device *netdev, int new_mtu) + { + struct e1000_adapter *adapter = netdev_priv(netdev); +- struct e1000_hw *hw = &adapter->hw; +- int max_frame = new_mtu + ENET_HEADER_SIZE + ETHERNET_FCS_SIZE; +- u16 eeprom_data = 0; +- +- if ((max_frame < MINIMUM_ETHERNET_FRAME_SIZE) || +- (max_frame > MAX_JUMBO_FRAME_SIZE)) { ++ int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN; ++ ++ if ((new_mtu < 68) || (max_frame > MAX_JUMBO_FRAME_SIZE)) { + DPRINTK(PROBE, ERR, "Invalid MTU setting\n"); + return -EINVAL; + } + + /* Adapter-specific max frame size limits. */ +- switch (hw->mac_type) { +- case e1000_undefined ... e1000_82542_rev2_1: +- case e1000_ich8lan: +- if (max_frame > MAXIMUM_ETHERNET_FRAME_SIZE) { ++ switch (adapter->hw.mac.type) { ++ case e1000_undefined: ++ case e1000_82542: ++ if (max_frame > ETH_FRAME_LEN + ETH_FCS_LEN) { + DPRINTK(PROBE, ERR, "Jumbo Frames not supported.\n"); + return -EINVAL; + } + break; +- case e1000_82573: +- /* Jumbo Frames not supported if: +- * - this is not an 82573L device +- * - ASPM is enabled in any way (0x1A bits 3:2) */ +- e1000_read_eeprom(hw, EEPROM_INIT_3GIO_3, 1, +- &eeprom_data); +- if ((hw->device_id != E1000_DEV_ID_82573L) || +- (eeprom_data & EEPROM_WORD1A_ASPM_MASK)) { +- if (max_frame > MAXIMUM_ETHERNET_FRAME_SIZE) { +- DPRINTK(PROBE, ERR, +- "Jumbo Frames not supported.\n"); +- return -EINVAL; +- } +- break; +- } +- /* ERT will be enabled later to enable wire speed receives */ +- +- /* fall through to get support */ +- case e1000_82571: +- case e1000_82572: +- case e1000_80003es2lan: +-#define MAX_STD_JUMBO_FRAME_SIZE 9234 +- if (max_frame > MAX_STD_JUMBO_FRAME_SIZE) { +- DPRINTK(PROBE, ERR, "MTU > 9216 not supported.\n"); +- return -EINVAL; +- } +- break; + default: + /* Capable of supporting up to MAX_JUMBO_FRAME_SIZE limit. */ + break; + } ++ ++ while (test_and_set_bit(__E1000_RESETTING, &adapter->state)) ++ msleep(1); ++ /* e1000_down has a dependency on max_frame_size */ ++ adapter->max_frame_size = max_frame; ++ if (netif_running(netdev)) ++ e1000_down(adapter); + + /* NOTE: netdev_alloc_skb reserves 16 bytes, and typically NET_IP_ALIGN + * means we reserve 2 more, this pushes us to allocate from the next +- * larger slab size +- * i.e. RXBUFFER_2048 --> size-4096 slab */ ++ * larger slab size. ++ * i.e. RXBUFFER_2048 --> size-4096 slab ++ * however with the new *_jumbo_rx* routines, jumbo receives will use ++ * fragmented skbs */ + + if (max_frame <= E1000_RXBUFFER_256) + adapter->rx_buffer_len = E1000_RXBUFFER_256; +@@ -3585,24 +3231,34 @@ + adapter->rx_buffer_len = E1000_RXBUFFER_1024; + else if (max_frame <= E1000_RXBUFFER_2048) + adapter->rx_buffer_len = E1000_RXBUFFER_2048; ++#ifdef CONFIG_E1000_NAPI ++ else ++ adapter->rx_buffer_len = E1000_RXBUFFER_4096; ++#else + else if (max_frame <= E1000_RXBUFFER_4096) + adapter->rx_buffer_len = E1000_RXBUFFER_4096; + else if (max_frame <= E1000_RXBUFFER_8192) + adapter->rx_buffer_len = E1000_RXBUFFER_8192; + else if (max_frame <= E1000_RXBUFFER_16384) + adapter->rx_buffer_len = E1000_RXBUFFER_16384; ++#endif + + /* adjust allocation if LPE protects us, and we aren't using SBP */ +- if (!hw->tbi_compatibility_on && +- ((max_frame == MAXIMUM_ETHERNET_FRAME_SIZE) || ++ if (!e1000_tbi_sbp_enabled_82543(&adapter->hw) && ++ ((max_frame == ETH_FRAME_LEN + ETH_FCS_LEN) || + (max_frame == MAXIMUM_ETHERNET_VLAN_SIZE))) + adapter->rx_buffer_len = MAXIMUM_ETHERNET_VLAN_SIZE; + ++ DPRINTK(PROBE, INFO, "changing MTU from %d to %d\n", ++ netdev->mtu, new_mtu); + netdev->mtu = new_mtu; +- hw->max_frame_size = max_frame; +- +- if (netif_running(netdev)) +- e1000_reinit_locked(adapter); ++ ++ if (netif_running(netdev)) ++ e1000_up(adapter); ++ else ++ e1000_reset(adapter); ++ ++ clear_bit(__E1000_RESETTING, &adapter->state); + + return 0; + } +@@ -3611,12 +3267,13 @@ + * e1000_update_stats - Update the board statistics counters + * @adapter: board private structure + **/ +- + void e1000_update_stats(struct e1000_adapter *adapter) + { + struct e1000_hw *hw = &adapter->hw; +- struct pci_dev *pdev = adapter->pdev; +- unsigned long flags; ++#ifdef HAVE_PCI_ERS ++ struct pci_dev *pdev = adapter->pdev; ++#endif ++ unsigned long irq_flags; + u16 phy_tmp; + + #define PHY_IDLE_ERROR_COUNT_MASK 0x00FF +@@ -3627,100 +3284,58 @@ + */ + if (adapter->link_speed == 0) + return; ++#ifdef HAVE_PCI_ERS + if (pci_channel_offline(pdev)) + return; +- +- spin_lock_irqsave(&adapter->stats_lock, flags); +- +- /* these counters are modified from e1000_tbi_adjust_stats, ++#endif ++ ++ spin_lock_irqsave(&adapter->stats_lock, irq_flags); ++ ++ /* these counters are modified from e1000_adjust_tbi_stats, + * called from the interrupt context, so they must only + * be written while holding adapter->stats_lock + */ + +- adapter->stats.crcerrs += er32(CRCERRS); +- adapter->stats.gprc += er32(GPRC); +- adapter->stats.gorcl += er32(GORCL); +- adapter->stats.gorch += er32(GORCH); +- adapter->stats.bprc += er32(BPRC); +- adapter->stats.mprc += er32(MPRC); +- adapter->stats.roc += er32(ROC); +- +- if (hw->mac_type != e1000_ich8lan) { +- adapter->stats.prc64 += er32(PRC64); +- adapter->stats.prc127 += er32(PRC127); +- adapter->stats.prc255 += er32(PRC255); +- adapter->stats.prc511 += er32(PRC511); +- adapter->stats.prc1023 += er32(PRC1023); +- adapter->stats.prc1522 += er32(PRC1522); +- } +- +- adapter->stats.symerrs += er32(SYMERRS); +- adapter->stats.mpc += er32(MPC); +- adapter->stats.scc += er32(SCC); +- adapter->stats.ecol += er32(ECOL); +- adapter->stats.mcc += er32(MCC); +- adapter->stats.latecol += er32(LATECOL); +- adapter->stats.dc += er32(DC); +- adapter->stats.sec += er32(SEC); +- adapter->stats.rlec += er32(RLEC); +- adapter->stats.xonrxc += er32(XONRXC); +- adapter->stats.xontxc += er32(XONTXC); +- adapter->stats.xoffrxc += er32(XOFFRXC); +- adapter->stats.xofftxc += er32(XOFFTXC); +- adapter->stats.fcruc += er32(FCRUC); +- adapter->stats.gptc += er32(GPTC); +- adapter->stats.gotcl += er32(GOTCL); +- adapter->stats.gotch += er32(GOTCH); +- adapter->stats.rnbc += er32(RNBC); +- adapter->stats.ruc += er32(RUC); +- adapter->stats.rfc += er32(RFC); +- adapter->stats.rjc += er32(RJC); +- adapter->stats.torl += er32(TORL); +- adapter->stats.torh += er32(TORH); +- adapter->stats.totl += er32(TOTL); +- adapter->stats.toth += er32(TOTH); +- adapter->stats.tpr += er32(TPR); +- +- if (hw->mac_type != e1000_ich8lan) { +- adapter->stats.ptc64 += er32(PTC64); +- adapter->stats.ptc127 += er32(PTC127); +- adapter->stats.ptc255 += er32(PTC255); +- adapter->stats.ptc511 += er32(PTC511); +- adapter->stats.ptc1023 += er32(PTC1023); +- adapter->stats.ptc1522 += er32(PTC1522); +- } +- +- adapter->stats.mptc += er32(MPTC); +- adapter->stats.bptc += er32(BPTC); ++ adapter->stats.crcerrs += E1000_READ_REG(hw, E1000_CRCERRS); ++ adapter->stats.gprc += E1000_READ_REG(hw, E1000_GPRC); ++ adapter->stats.gorc += E1000_READ_REG(hw, E1000_GORCL); ++ E1000_READ_REG(hw, E1000_GORCH); /* Clear gorc */ ++ adapter->stats.bprc += E1000_READ_REG(hw, E1000_BPRC); ++ adapter->stats.mprc += E1000_READ_REG(hw, E1000_MPRC); ++ adapter->stats.roc += E1000_READ_REG(hw, E1000_ROC); ++ adapter->stats.mpc += E1000_READ_REG(hw, E1000_MPC); ++ adapter->stats.scc += E1000_READ_REG(hw, E1000_SCC); ++ adapter->stats.ecol += E1000_READ_REG(hw, E1000_ECOL); ++ adapter->stats.mcc += E1000_READ_REG(hw, E1000_MCC); ++ adapter->stats.latecol += E1000_READ_REG(hw, E1000_LATECOL); ++ adapter->stats.dc += E1000_READ_REG(hw, E1000_DC); ++ adapter->stats.xonrxc += E1000_READ_REG(hw, E1000_XONRXC); ++ adapter->stats.xontxc += E1000_READ_REG(hw, E1000_XONTXC); ++ adapter->stats.xoffrxc += E1000_READ_REG(hw, E1000_XOFFRXC); ++ adapter->stats.xofftxc += E1000_READ_REG(hw, E1000_XOFFTXC); ++ adapter->stats.gptc += E1000_READ_REG(hw, E1000_GPTC); ++ adapter->stats.gotc += E1000_READ_REG(hw, E1000_GOTCL); ++ E1000_READ_REG(hw, E1000_GOTCH); /* Clear gotc */ ++ adapter->stats.rnbc += E1000_READ_REG(hw, E1000_RNBC); ++ adapter->stats.ruc += E1000_READ_REG(hw, E1000_RUC); ++ ++ adapter->stats.mptc += E1000_READ_REG(hw, E1000_MPTC); ++ adapter->stats.bptc += E1000_READ_REG(hw, E1000_BPTC); + + /* used for adaptive IFS */ + +- hw->tx_packet_delta = er32(TPT); +- adapter->stats.tpt += hw->tx_packet_delta; +- hw->collision_delta = er32(COLC); +- adapter->stats.colc += hw->collision_delta; +- +- if (hw->mac_type >= e1000_82543) { +- adapter->stats.algnerrc += er32(ALGNERRC); +- adapter->stats.rxerrc += er32(RXERRC); +- adapter->stats.tncrs += er32(TNCRS); +- adapter->stats.cexterr += er32(CEXTERR); +- adapter->stats.tsctc += er32(TSCTC); +- adapter->stats.tsctfc += er32(TSCTFC); +- } +- if (hw->mac_type > e1000_82547_rev_2) { +- adapter->stats.iac += er32(IAC); +- adapter->stats.icrxoc += er32(ICRXOC); +- +- if (hw->mac_type != e1000_ich8lan) { +- adapter->stats.icrxptc += er32(ICRXPTC); +- adapter->stats.icrxatc += er32(ICRXATC); +- adapter->stats.ictxptc += er32(ICTXPTC); +- adapter->stats.ictxatc += er32(ICTXATC); +- adapter->stats.ictxqec += er32(ICTXQEC); +- adapter->stats.ictxqmtc += er32(ICTXQMTC); +- adapter->stats.icrxdmtc += er32(ICRXDMTC); +- } ++ hw->mac.tx_packet_delta = E1000_READ_REG(hw, E1000_TPT); ++ adapter->stats.tpt += hw->mac.tx_packet_delta; ++ hw->mac.collision_delta = E1000_READ_REG(hw, E1000_COLC); ++ adapter->stats.colc += hw->mac.collision_delta; ++ ++ if (hw->mac.type >= e1000_82543) { ++ adapter->stats.algnerrc += E1000_READ_REG(hw, E1000_ALGNERRC); ++ adapter->stats.rxerrc += E1000_READ_REG(hw, E1000_RXERRC); ++ adapter->stats.tncrs += E1000_READ_REG(hw, E1000_TNCRS); ++ adapter->stats.cexterr += E1000_READ_REG(hw, E1000_CEXTERR); ++ adapter->stats.tsctc += E1000_READ_REG(hw, E1000_TSCTC); ++ adapter->stats.tsctfc += E1000_READ_REG(hw, E1000_TSCTFC); + } + + /* Fill out the OS statistics structure */ +@@ -3735,223 +3350,270 @@ + adapter->stats.crcerrs + adapter->stats.algnerrc + + adapter->stats.ruc + adapter->stats.roc + + adapter->stats.cexterr; +- adapter->stats.rlerrc = adapter->stats.ruc + adapter->stats.roc; +- adapter->net_stats.rx_length_errors = adapter->stats.rlerrc; ++ adapter->net_stats.rx_length_errors = adapter->stats.ruc + ++ adapter->stats.roc; + adapter->net_stats.rx_crc_errors = adapter->stats.crcerrs; + adapter->net_stats.rx_frame_errors = adapter->stats.algnerrc; + adapter->net_stats.rx_missed_errors = adapter->stats.mpc; + + /* Tx Errors */ +- adapter->stats.txerrc = adapter->stats.ecol + adapter->stats.latecol; +- adapter->net_stats.tx_errors = adapter->stats.txerrc; ++ adapter->net_stats.tx_errors = adapter->stats.ecol + ++ adapter->stats.latecol; + adapter->net_stats.tx_aborted_errors = adapter->stats.ecol; + adapter->net_stats.tx_window_errors = adapter->stats.latecol; +- adapter->net_stats.tx_carrier_errors = adapter->stats.tncrs; +- if (hw->bad_tx_carr_stats_fd && ++ if ((adapter->flags & E1000_FLAG_BAD_TX_CARRIER_STATS_FD) && + adapter->link_duplex == FULL_DUPLEX) { + adapter->net_stats.tx_carrier_errors = 0; + adapter->stats.tncrs = 0; ++ } else { ++ adapter->net_stats.tx_carrier_errors = adapter->stats.tncrs; + } + + /* Tx Dropped needs to be maintained elsewhere */ + + /* Phy Stats */ +- if (hw->media_type == e1000_media_type_copper) { ++ if (hw->phy.media_type == e1000_media_type_copper) { + if ((adapter->link_speed == SPEED_1000) && + (!e1000_read_phy_reg(hw, PHY_1000T_STATUS, &phy_tmp))) { + phy_tmp &= PHY_IDLE_ERROR_COUNT_MASK; + adapter->phy_stats.idle_errors += phy_tmp; + } + +- if ((hw->mac_type <= e1000_82546) && +- (hw->phy_type == e1000_phy_m88) && ++ if ((hw->mac.type <= e1000_82546) && ++ (hw->phy.type == e1000_phy_m88) && + !e1000_read_phy_reg(hw, M88E1000_RX_ERR_CNTR, &phy_tmp)) + adapter->phy_stats.receive_errors += phy_tmp; + } + + /* Management Stats */ +- if (hw->has_smbus) { +- adapter->stats.mgptc += er32(MGTPTC); +- adapter->stats.mgprc += er32(MGTPRC); +- adapter->stats.mgpdc += er32(MGTPDC); +- } +- +- spin_unlock_irqrestore(&adapter->stats_lock, flags); +-} +- +-/** +- * e1000_intr_msi - Interrupt Handler ++ if (adapter->flags & E1000_FLAG_HAS_SMBUS) { ++ adapter->stats.mgptc += E1000_READ_REG(hw, E1000_MGTPTC); ++ adapter->stats.mgprc += E1000_READ_REG(hw, E1000_MGTPRC); ++ adapter->stats.mgpdc += E1000_READ_REG(hw, E1000_MGTPDC); ++ } ++ ++ spin_unlock_irqrestore(&adapter->stats_lock, irq_flags); ++} ++#ifdef SIOCGMIIPHY ++ ++/** ++ * e1000_phy_read_status - Update the PHY register status snapshot ++ * @adapter: board private structure ++ **/ ++static void e1000_phy_read_status(struct e1000_adapter *adapter) ++{ ++ struct e1000_hw *hw = &adapter->hw; ++ struct e1000_phy_regs *phy = &adapter->phy_regs; ++ int ret_val = E1000_SUCCESS; ++ unsigned long irq_flags; ++ ++ ++ spin_lock_irqsave(&adapter->stats_lock, irq_flags); ++ ++ if (E1000_READ_REG(hw, E1000_STATUS)& E1000_STATUS_LU) { ++ ret_val = e1000_read_phy_reg(hw, PHY_CONTROL, &phy->bmcr); ++ ret_val |= e1000_read_phy_reg(hw, PHY_STATUS, &phy->bmsr); ++ ret_val |= e1000_read_phy_reg(hw, PHY_AUTONEG_ADV, ++ &phy->advertise); ++ ret_val |= e1000_read_phy_reg(hw, PHY_LP_ABILITY, &phy->lpa); ++ ret_val |= e1000_read_phy_reg(hw, PHY_AUTONEG_EXP, ++ &phy->expansion); ++ ret_val |= e1000_read_phy_reg(hw, PHY_1000T_CTRL, ++ &phy->ctrl1000); ++ ret_val |= e1000_read_phy_reg(hw, PHY_1000T_STATUS, ++ &phy->stat1000); ++ ret_val |= e1000_read_phy_reg(hw, PHY_EXT_STATUS, ++ &phy->estatus); ++ if (ret_val) ++ DPRINTK(DRV, WARNING, "Error reading PHY register\n"); ++ } else { ++ /* Do not read PHY registers if link is not up ++ * Set values to typical power-on defaults */ ++ phy->bmcr = (BMCR_SPEED1000 | BMCR_ANENABLE | BMCR_FULLDPLX); ++ phy->bmsr = (BMSR_100FULL | BMSR_100HALF | BMSR_10FULL | ++ BMSR_10HALF | BMSR_ESTATEN | BMSR_ANEGCAPABLE | ++ BMSR_ERCAP); ++ phy->advertise = (ADVERTISE_PAUSE_ASYM | ADVERTISE_PAUSE_CAP | ++ ADVERTISE_ALL | ADVERTISE_CSMA); ++ phy->lpa = 0; ++ phy->expansion = EXPANSION_ENABLENPAGE; ++ phy->ctrl1000 = ADVERTISE_1000FULL; ++ phy->stat1000 = 0; ++ phy->estatus = (ESTATUS_1000_TFULL | ESTATUS_1000_THALF); ++ } ++ ++ spin_unlock_irqrestore(&adapter->stats_lock, irq_flags); ++} ++#endif ++ ++ ++/** ++ * e1000_intr - Interrupt Handler + * @irq: interrupt number + * @data: pointer to a network interface device structure + **/ +- +-static irqreturn_t e1000_intr_msi(int irq, void *data) ++static irqreturn_t e1000_intr(int irq, void *data) + { + struct net_device *netdev = data; + struct e1000_adapter *adapter = netdev_priv(netdev); + struct e1000_hw *hw = &adapter->hw; +- u32 icr = er32(ICR); +- +- /* in NAPI mode read ICR disables interrupts using IAM */ +- +- if (icr & (E1000_ICR_RXSEQ | E1000_ICR_LSC)) { +- hw->get_link_status = 1; +- /* 80003ES2LAN workaround-- For packet buffer work-around on +- * link down event; disable receives here in the ISR and reset +- * adapter in watchdog */ +- if (netif_carrier_ok(netdev) && +- (hw->mac_type == e1000_80003es2lan)) { +- /* disable receives */ +- u32 rctl = er32(RCTL); +- ew32(RCTL, rctl & ~E1000_RCTL_EN); +- } ++ u32 icr = E1000_READ_REG(hw, E1000_ICR); ++#ifndef CONFIG_E1000_NAPI ++ int i, j; ++ int rx_cleaned, tx_cleaned; ++#endif ++ if (unlikely((!icr) || test_bit(__E1000_DOWN, &adapter->state))) ++ return IRQ_NONE; /* Not our interrupt */ ++ ++#ifdef CONFIG_E1000_NAPI ++#endif ++ if (unlikely(icr & (E1000_ICR_RXSEQ | E1000_ICR_LSC))) { ++ hw->mac.get_link_status = 1; ++ + /* guard against interrupt when we're going down */ +- if (!test_bit(__E1000_DOWN, &adapter->flags)) ++ if (!test_bit(__E1000_DOWN, &adapter->state)) + mod_timer(&adapter->watchdog_timer, jiffies + 1); + } + +- if (likely(netif_rx_schedule_prep(netdev, &adapter->napi))) { ++#ifdef CONFIG_E1000_NAPI ++ /* XXX only using ring 0 for napi */ ++ if (likely(napi_schedule_prep(&adapter->rx_ring[0].napi))) { + adapter->total_tx_bytes = 0; + adapter->total_tx_packets = 0; + adapter->total_rx_bytes = 0; + adapter->total_rx_packets = 0; +- __netif_rx_schedule(netdev, &adapter->napi); +- } else ++ __napi_schedule(&adapter->rx_ring[0].napi); ++ } ++#else ++ /* Writing IMC and IMS is needed for 82547. ++ * Due to Hub Link bus being occupied, an interrupt ++ * de-assertion message is not able to be sent. ++ * When an interrupt assertion message is generated later, ++ * two messages are re-ordered and sent out. ++ * That causes APIC to think 82547 is in de-assertion ++ * state, while 82547 is in assertion state, resulting ++ * in dead lock. Writing IMC forces 82547 into ++ * de-assertion state. ++ */ ++ if (hw->mac.type == e1000_82547 || hw->mac.type == e1000_82547_rev_2) ++ E1000_WRITE_REG(hw, E1000_IMC, ~0); ++ ++ adapter->total_tx_bytes = 0; ++ adapter->total_rx_bytes = 0; ++ adapter->total_tx_packets = 0; ++ adapter->total_rx_packets = 0; ++ ++ for (i = 0; i < E1000_MAX_INTR; i++) { ++ rx_cleaned = 0; ++ for (j = 0; j < adapter->num_rx_queues; j++) ++ rx_cleaned |= adapter->clean_rx(adapter, ++ &adapter->rx_ring[j]); ++ ++ tx_cleaned = 0; ++ for (j = 0 ; j < adapter->num_tx_queues ; j++) ++ tx_cleaned |= e1000_clean_tx_irq(adapter, ++ &adapter->tx_ring[j]); ++ ++ if (!rx_cleaned && !tx_cleaned) ++ break; ++ } ++ ++ if (likely(adapter->itr_setting & 3)) ++ e1000_set_itr(adapter); ++ ++ if (hw->mac.type == e1000_82547 || hw->mac.type == e1000_82547_rev_2) + e1000_irq_enable(adapter); + ++#endif + return IRQ_HANDLED; + } + +-/** +- * e1000_intr - Interrupt Handler +- * @irq: interrupt number +- * @data: pointer to a network interface device structure +- **/ +- +-static irqreturn_t e1000_intr(int irq, void *data) +-{ +- struct net_device *netdev = data; +- struct e1000_adapter *adapter = netdev_priv(netdev); +- struct e1000_hw *hw = &adapter->hw; +- u32 rctl, icr = er32(ICR); +- +- if (unlikely((!icr) || test_bit(__E1000_RESETTING, &adapter->flags))) +- return IRQ_NONE; /* Not our interrupt */ +- +- /* IMS will not auto-mask if INT_ASSERTED is not set, and if it is +- * not set, then the adapter didn't send an interrupt */ +- if (unlikely(hw->mac_type >= e1000_82571 && +- !(icr & E1000_ICR_INT_ASSERTED))) +- return IRQ_NONE; +- +- /* Interrupt Auto-Mask...upon reading ICR, interrupts are masked. No +- * need for the IMC write */ +- +- if (unlikely(icr & (E1000_ICR_RXSEQ | E1000_ICR_LSC))) { +- hw->get_link_status = 1; +- /* 80003ES2LAN workaround-- +- * For packet buffer work-around on link down event; +- * disable receives here in the ISR and +- * reset adapter in watchdog +- */ +- if (netif_carrier_ok(netdev) && +- (hw->mac_type == e1000_80003es2lan)) { +- /* disable receives */ +- rctl = er32(RCTL); +- ew32(RCTL, rctl & ~E1000_RCTL_EN); +- } +- /* guard against interrupt when we're going down */ +- if (!test_bit(__E1000_DOWN, &adapter->flags)) +- mod_timer(&adapter->watchdog_timer, jiffies + 1); +- } +- +- if (unlikely(hw->mac_type < e1000_82571)) { +- /* disable interrupts, without the synchronize_irq bit */ +- ew32(IMC, ~0); +- E1000_WRITE_FLUSH(); +- } +- if (likely(netif_rx_schedule_prep(netdev, &adapter->napi))) { +- adapter->total_tx_bytes = 0; +- adapter->total_tx_packets = 0; +- adapter->total_rx_bytes = 0; +- adapter->total_rx_packets = 0; +- __netif_rx_schedule(netdev, &adapter->napi); +- } else +- /* this really should not happen! if it does it is basically a +- * bug, but not a hard error, so enable ints and continue */ +- e1000_irq_enable(adapter); +- +- return IRQ_HANDLED; +-} +- +-/** +- * e1000_clean - NAPI Rx polling callback +- * @adapter: board private structure +- **/ +-static int e1000_clean(struct napi_struct *napi, int budget) +-{ +- struct e1000_adapter *adapter = container_of(napi, struct e1000_adapter, napi); +- struct net_device *poll_dev = adapter->netdev; +- int tx_cleaned = 0, work_done = 0; +- +- /* Must NOT use netdev_priv macro here. */ +- adapter = poll_dev->priv; +- +- /* e1000_clean is called per-cpu. This lock protects +- * tx_ring[0] from being cleaned by multiple cpus ++#ifdef CONFIG_E1000_NAPI ++/** ++ * e1000_poll - NAPI Rx polling callback ++ * @napi: struct associated with this polling callback ++ * @budget: amount of packets driver is allowed to process this poll ++ **/ ++static int e1000_poll(struct napi_struct *napi, int budget) ++{ ++ struct e1000_rx_ring *rx_ring = container_of(napi, struct e1000_rx_ring, ++ napi); ++ struct e1000_adapter *adapter = rx_ring->adapter; ++ int tx_clean_complete = 1, work_done = 0; ++ int i; ++ ++ /* e1000_poll is called per-cpu. This lock protects ++ * tx_ring[i] from being cleaned by multiple cpus + * simultaneously. A failure obtaining the lock means +- * tx_ring[0] is currently being cleaned anyway. */ ++ * tx_ring[i] is currently being cleaned anyway. */ + if (spin_trylock(&adapter->tx_queue_lock)) { +- tx_cleaned = e1000_clean_tx_irq(adapter, +- &adapter->tx_ring[0]); ++ tx_clean_complete &= e1000_clean_tx_irq(adapter, ++ adapter->tx_ring); + spin_unlock(&adapter->tx_queue_lock); + } + +- adapter->clean_rx(adapter, &adapter->rx_ring[0], +- &work_done, budget); +- +- if (tx_cleaned) ++ for (i = 0; i < adapter->num_rx_queues; i++) { ++ adapter->clean_rx(adapter, &adapter->rx_ring[i], ++ &work_done, budget); ++ } ++ ++ if (!tx_clean_complete) + work_done = budget; + +- /* If budget not fully consumed, exit the polling mode */ ++#ifndef HAVE_NETDEV_NAPI_LIST ++ if (!netif_running(adapter->netdev)) ++ work_done = 0; ++ ++#endif ++ /* If no Tx and not enough Rx work done, exit the polling mode */ + if (work_done < budget) { + if (likely(adapter->itr_setting & 3)) + e1000_set_itr(adapter); +- netif_rx_complete(poll_dev, napi); +- e1000_irq_enable(adapter); ++ napi_complete(napi); ++ if (!test_bit(__E1000_DOWN, &adapter->state)) ++ e1000_irq_enable(adapter); ++ + } + + return work_done; + } + ++#endif + /** + * e1000_clean_tx_irq - Reclaim resources after transmit completes + * @adapter: board private structure ++ * ++ * the return value indicates whether actual cleaning was done, there ++ * is no guarantee that everything was cleaned + **/ + static bool e1000_clean_tx_irq(struct e1000_adapter *adapter, +- struct e1000_tx_ring *tx_ring) +-{ +- struct e1000_hw *hw = &adapter->hw; ++ struct e1000_tx_ring *tx_ring) ++{ + struct net_device *netdev = adapter->netdev; + struct e1000_tx_desc *tx_desc, *eop_desc; + struct e1000_buffer *buffer_info; + unsigned int i, eop; ++#ifdef CONFIG_E1000_NAPI + unsigned int count = 0; +- bool cleaned = false; ++#endif ++ bool cleaned = FALSE; ++ bool retval = TRUE; + unsigned int total_tx_bytes=0, total_tx_packets=0; ++ + + i = tx_ring->next_to_clean; + eop = tx_ring->buffer_info[i].next_to_watch; + eop_desc = E1000_TX_DESC(*tx_ring, eop); + + while (eop_desc->upper.data & cpu_to_le32(E1000_TXD_STAT_DD)) { +- for (cleaned = false; !cleaned; ) { ++ for (cleaned = FALSE; !cleaned; ) { + tx_desc = E1000_TX_DESC(*tx_ring, i); + buffer_info = &tx_ring->buffer_info[i]; + cleaned = (i == eop); + + if (cleaned) { + struct sk_buff *skb = buffer_info->skb; ++#ifdef NETIF_F_TSO + unsigned int segs, bytecount; + segs = skb_shinfo(skb)->gso_segs ?: 1; + /* multiply data chunks by size of headers */ +@@ -3959,19 +3621,26 @@ + skb->len; + total_tx_packets += segs; + total_tx_bytes += bytecount; ++#else ++ total_tx_packets++; ++ total_tx_bytes += skb->len; ++#endif + } + e1000_unmap_and_free_tx_resource(adapter, buffer_info); + tx_desc->upper.data = 0; +- +- if (unlikely(++i == tx_ring->count)) i = 0; ++ E1000_TX_DESC_INC(tx_ring,i); + } + + eop = tx_ring->buffer_info[i].next_to_watch; + eop_desc = E1000_TX_DESC(*tx_ring, eop); ++#ifdef CONFIG_E1000_NAPI + #define E1000_TX_WEIGHT 64 + /* weight of a sort for tx, to avoid endless transmit cleanup */ +- if (count++ == E1000_TX_WEIGHT) +- break; ++ if (count++ == E1000_TX_WEIGHT) { ++ retval = FALSE; ++ break; ++ } ++#endif + } + + tx_ring->next_to_clean = i; +@@ -3983,20 +3652,31 @@ + * sees the new next_to_clean. + */ + smp_mb(); +- if (netif_queue_stopped(netdev)) { ++ ++#ifdef CONFIG_NETDEVICES_MULTIQUEUE ++ if (__netif_subqueue_stopped(netdev, 0) && ++ !(test_bit(__E1000_DOWN, &adapter->state))) { ++ netif_wake_subqueue(netdev, 0); ++ ++adapter->restart_queue; ++ } ++#else ++ if (netif_queue_stopped(netdev) && ++ !(test_bit(__E1000_DOWN, &adapter->state))) { + netif_wake_queue(netdev); + ++adapter->restart_queue; + } ++#endif + } + + if (adapter->detect_tx_hung) { + /* Detect a transmit hang in hardware, this serializes the + * check with the clearing of time_stamp and movement of i */ +- adapter->detect_tx_hung = false; ++ adapter->detect_tx_hung = FALSE; + if (tx_ring->buffer_info[eop].dma && + time_after(jiffies, tx_ring->buffer_info[eop].time_stamp + + (adapter->tx_timeout_factor * HZ)) +- && !(er32(STATUS) & E1000_STATUS_TXOFF)) { ++ && !(E1000_READ_REG(&adapter->hw, E1000_STATUS) & ++ E1000_STATUS_TXOFF)) { + + /* detected Tx unit hang */ + DPRINTK(DRV, ERR, "Detected Tx Unit Hang\n" +@@ -4012,22 +3692,26 @@ + " next_to_watch.status <%x>\n", + (unsigned long)((tx_ring - adapter->tx_ring) / + sizeof(struct e1000_tx_ring)), +- readl(hw->hw_addr + tx_ring->tdh), +- readl(hw->hw_addr + tx_ring->tdt), ++ readl(adapter->hw.hw_addr + tx_ring->tdh), ++ readl(adapter->hw.hw_addr + tx_ring->tdt), + tx_ring->next_to_use, + tx_ring->next_to_clean, + tx_ring->buffer_info[eop].time_stamp, + eop, + jiffies, + eop_desc->upper.fields.status); ++#ifdef CONFIG_NETDEVICES_MULTIQUEUE ++ netif_stop_subqueue(netdev, 0); ++#else + netif_stop_queue(netdev); ++#endif + } + } + adapter->total_tx_bytes += total_tx_bytes; + adapter->total_tx_packets += total_tx_packets; + adapter->net_stats.tx_bytes += total_tx_bytes; + adapter->net_stats.tx_packets += total_tx_packets; +- return cleaned; ++ return retval; + } + + /** +@@ -4037,17 +3721,15 @@ + * @csum: receive descriptor csum field + * @sk_buff: socket buffer with received data + **/ +- + static void e1000_rx_checksum(struct e1000_adapter *adapter, u32 status_err, +- u32 csum, struct sk_buff *skb) +-{ +- struct e1000_hw *hw = &adapter->hw; ++ u32 csum, struct sk_buff *skb) ++{ + u16 status = (u16)status_err; + u8 errors = (u8)(status_err >> 24); + skb->ip_summed = CHECKSUM_NONE; + + /* 82543 or newer only */ +- if (unlikely(hw->mac_type < e1000_82543)) return; ++ if (unlikely(adapter->hw.mac.type < e1000_82543)) return; + /* Ignore Checksum bit is set */ + if (unlikely(status & E1000_RXD_STAT_IXSM)) return; + /* TCP/UDP checksum error bit is set */ +@@ -4057,7 +3739,7 @@ + return; + } + /* TCP/UDP Checksum has not been calculated */ +- if (hw->mac_type <= e1000_82547_rev_2) { ++ if (adapter->hw.mac.type <= e1000_82547_rev_2) { + if (!(status & E1000_RXD_STAT_TCPCS)) + return; + } else { +@@ -4068,37 +3750,91 @@ + if (likely(status & E1000_RXD_STAT_TCPCS)) { + /* TCP checksum is good */ + skb->ip_summed = CHECKSUM_UNNECESSARY; +- } else if (hw->mac_type > e1000_82547_rev_2) { ++ } else if (adapter->hw.mac.type > e1000_82547_rev_2) { + /* IP fragment with UDP payload */ + /* Hardware complements the payload checksum, so we undo it + * and then put the value in host order for further stack use. + */ +- __sum16 sum = (__force __sum16)htons(csum); +- skb->csum = csum_unfold(~sum); ++ csum = ntohl(csum ^ 0xFFFF); ++ skb->csum = csum; + skb->ip_summed = CHECKSUM_COMPLETE; + } + adapter->hw_csum_good++; + } + + /** +- * e1000_clean_rx_irq - Send received data up the network stack; legacy +- * @adapter: board private structure +- **/ +-static bool e1000_clean_rx_irq(struct e1000_adapter *adapter, +- struct e1000_rx_ring *rx_ring, +- int *work_done, int work_to_do) +-{ +- struct e1000_hw *hw = &adapter->hw; ++ * e1000_receive_skb - helper function to handle rx indications ++ * @adapter: board private structure ++ * @status: descriptor status field as written by hardware ++ * @vlan: descriptor vlan field as written by hardware (no le/be conversion) ++ * @skb: pointer to sk_buff to be indicated to stack ++ **/ ++static void e1000_receive_skb(struct e1000_adapter *adapter, u8 status, ++ u16 vlan, struct sk_buff *skb) ++{ ++#ifdef CONFIG_E1000_NAPI ++#ifdef NETIF_F_HW_VLAN_TX ++ if (unlikely(adapter->vlgrp && (status & E1000_RXD_STAT_VP))) { ++ vlan_hwaccel_receive_skb(skb, adapter->vlgrp, ++ le16_to_cpu(vlan) & ++ E1000_RXD_SPC_VLAN_MASK); ++ } else { ++ netif_receive_skb(skb); ++ } ++#else ++ netif_receive_skb(skb); ++#endif ++#else /* CONFIG_E1000_NAPI */ ++#ifdef NETIF_F_HW_VLAN_TX ++ if (unlikely(adapter->vlgrp && (status & E1000_RXD_STAT_VP))) { ++ vlan_hwaccel_rx(skb, adapter->vlgrp, ++ le16_to_cpu(vlan) & E1000_RXD_SPC_VLAN_MASK); ++ } else { ++ netif_rx(skb); ++ } ++#else ++ netif_rx(skb); ++#endif ++#endif /* CONFIG_E1000_NAPI */ ++} ++ ++#ifdef CONFIG_E1000_NAPI ++/* NOTE: these new jumbo frame routines rely on NAPI because of the ++ * pskb_may_pull call, which eventually must call kmap_atomic which you cannot ++ * call from hard irq context */ ++ ++/** ++ * e1000_consume_page - helper function ++ **/ ++static void e1000_consume_page(struct e1000_rx_buffer *bi, struct sk_buff *skb, ++ u16 length) ++{ ++ bi->page = NULL; ++ skb->len += length; ++ skb->data_len += length; ++ skb->truesize += length; ++} ++ ++/** ++ * e1000_clean_jumbo_rx_irq - Send received data up the network stack; legacy ++ * @adapter: board private structure ++ * ++ * the return value indicates whether actual cleaning was done, there ++ * is no guarantee that everything was cleaned ++ **/ ++static bool e1000_clean_jumbo_rx_irq(struct e1000_adapter *adapter, ++ struct e1000_rx_ring *rx_ring, ++ int *work_done, int work_to_do) ++{ + struct net_device *netdev = adapter->netdev; + struct pci_dev *pdev = adapter->pdev; + struct e1000_rx_desc *rx_desc, *next_rxd; +- struct e1000_buffer *buffer_info, *next_buffer; +- unsigned long flags; ++ struct e1000_rx_buffer *buffer_info, *next_buffer; ++ unsigned long irq_flags; + u32 length; +- u8 last_byte; + unsigned int i; + int cleaned_count = 0; +- bool cleaned = false; ++ bool cleaned = FALSE; + unsigned int total_rx_bytes=0, total_rx_packets=0; + + i = rx_ring->next_to_clean; +@@ -4117,24 +3853,223 @@ + skb = buffer_info->skb; + buffer_info->skb = NULL; + +- prefetch(skb->data - NET_IP_ALIGN); +- + if (++i == rx_ring->count) i = 0; + next_rxd = E1000_RX_DESC(*rx_ring, i); + prefetch(next_rxd); + + next_buffer = &rx_ring->buffer_info[i]; + +- cleaned = true; ++ cleaned = TRUE; ++ cleaned_count++; ++ pci_unmap_page(pdev, ++ buffer_info->dma, ++ PAGE_SIZE, ++ PCI_DMA_FROMDEVICE); ++ buffer_info->dma = 0; ++ ++ length = le16_to_cpu(rx_desc->length); ++ ++ /* errors is only valid for DD + EOP descriptors */ ++ if (unlikely((status & E1000_RXD_STAT_EOP) && ++ (rx_desc->errors & E1000_RXD_ERR_FRAME_ERR_MASK))) { ++ u8 last_byte = *(skb->data + length - 1); ++ if (TBI_ACCEPT(&adapter->hw, status, ++ rx_desc->errors, length, last_byte, ++ adapter->min_frame_size, ++ adapter->max_frame_size)) { ++ spin_lock_irqsave(&adapter->stats_lock, ++ irq_flags); ++ e1000_tbi_adjust_stats_82543(&adapter->hw, ++ &adapter->stats, ++ length, skb->data, ++ adapter->max_frame_size); ++ spin_unlock_irqrestore(&adapter->stats_lock, ++ irq_flags); ++ length--; ++ } else { ++ /* recycle both page and skb */ ++ buffer_info->skb = skb; ++ /* an error means any chain goes out the window ++ * too */ ++ if (rx_ring->rx_skb_top) ++ dev_kfree_skb(rx_ring->rx_skb_top); ++ rx_ring->rx_skb_top = NULL; ++ goto next_desc; ++ } ++ } ++ ++#define rxtop rx_ring->rx_skb_top ++ if (!(status & E1000_RXD_STAT_EOP)) { ++ /* this descriptor is only the beginning (or middle) */ ++ if (!rxtop) { ++ /* this is the beginning of a chain */ ++ rxtop = skb; ++ skb_fill_page_desc(rxtop, 0, buffer_info->page, ++ 0, length); ++ } else { ++ /* this is the middle of a chain */ ++ skb_fill_page_desc(rxtop, ++ skb_shinfo(rxtop)->nr_frags, ++ buffer_info->page, 0, length); ++ /* re-use the skb, only consumed the page */ ++ buffer_info->skb = skb; ++ } ++ e1000_consume_page(buffer_info, rxtop, length); ++ goto next_desc; ++ } else { ++ if (rxtop) { ++ /* end of the chain */ ++ skb_fill_page_desc(rxtop, ++ skb_shinfo(rxtop)->nr_frags, ++ buffer_info->page, 0, length); ++ /* re-use the current skb, we only consumed the ++ * page */ ++ buffer_info->skb = skb; ++ skb = rxtop; ++ rxtop = NULL; ++ e1000_consume_page(buffer_info, skb, length); ++ } else { ++ /* no chain, got EOP, this buf is the packet ++ * copybreak to save the put_page/alloc_page */ ++ if (length <= copybreak && ++ skb_tailroom(skb) >= length) { ++ u8 *vaddr; ++ vaddr = kmap_atomic(buffer_info->page, ++ KM_SKB_DATA_SOFTIRQ); ++ memcpy(skb_tail_pointer(skb), vaddr, length); ++ kunmap_atomic(vaddr, ++ KM_SKB_DATA_SOFTIRQ); ++ /* re-use the page, so don't erase ++ * buffer_info->page */ ++ skb_put(skb, length); ++ } else { ++ skb_fill_page_desc(skb, 0, ++ buffer_info->page, 0, ++ length); ++ e1000_consume_page(buffer_info, skb, ++ length); ++ } ++ } ++ } ++ ++ /* Receive Checksum Offload XXX recompute due to CRC strip? */ ++ e1000_rx_checksum(adapter, ++ (u32)(status) | ++ ((u32)(rx_desc->errors) << 24), ++ le16_to_cpu(rx_desc->csum), skb); ++ ++ pskb_trim(skb, skb->len - 4); ++ ++ /* probably a little skewed due to removing CRC */ ++ total_rx_bytes += skb->len; ++ total_rx_packets++; ++ ++ /* eth type trans needs skb->data to point to something */ ++ if (!pskb_may_pull(skb, ETH_HLEN)) { ++ DPRINTK(DRV, ERR, "__pskb_pull_tail failed.\n"); ++ dev_kfree_skb(skb); ++ goto next_desc; ++ } ++ ++ skb->protocol = eth_type_trans(skb, netdev); ++ ++ e1000_receive_skb(adapter, status, rx_desc->special, skb); ++ ++ netdev->last_rx = jiffies; ++ ++next_desc: ++ rx_desc->status = 0; ++ ++ /* return some buffers to hardware, one at a time is too slow */ ++ if (unlikely(cleaned_count >= E1000_RX_BUFFER_WRITE)) { ++ adapter->alloc_rx_buf(adapter, rx_ring, cleaned_count); ++ cleaned_count = 0; ++ } ++ ++ /* use prefetched values */ ++ rx_desc = next_rxd; ++ buffer_info = next_buffer; ++ } ++ rx_ring->next_to_clean = i; ++ ++ cleaned_count = E1000_DESC_UNUSED(rx_ring); ++ if (cleaned_count) ++ adapter->alloc_rx_buf(adapter, rx_ring, cleaned_count); ++ ++ adapter->total_rx_packets += total_rx_packets; ++ adapter->total_rx_bytes += total_rx_bytes; ++ adapter->net_stats.rx_bytes += total_rx_bytes; ++ adapter->net_stats.rx_packets += total_rx_packets; ++ return cleaned; ++} ++#endif /* NAPI */ ++ ++ ++/** ++ * e1000_clean_rx_irq - Send received data up the network stack; legacy ++ * @adapter: board private structure ++ * ++ * the return value indicates whether actual cleaning was done, there ++ * is no guarantee that everything was cleaned ++ **/ ++#ifdef CONFIG_E1000_NAPI ++static bool e1000_clean_rx_irq(struct e1000_adapter *adapter, ++ struct e1000_rx_ring *rx_ring, ++ int *work_done, int work_to_do) ++#else ++static bool e1000_clean_rx_irq(struct e1000_adapter *adapter, ++ struct e1000_rx_ring *rx_ring) ++#endif ++{ ++ struct net_device *netdev = adapter->netdev; ++ struct pci_dev *pdev = adapter->pdev; ++ struct e1000_rx_desc *rx_desc, *next_rxd; ++ struct e1000_rx_buffer *buffer_info, *next_buffer; ++ unsigned long irq_flags; ++ u32 length; ++ unsigned int i; ++ int cleaned_count = 0; ++ bool cleaned = FALSE; ++ unsigned int total_rx_bytes=0, total_rx_packets=0; ++ ++ i = rx_ring->next_to_clean; ++ rx_desc = E1000_RX_DESC(*rx_ring, i); ++ buffer_info = &rx_ring->buffer_info[i]; ++ ++ while (rx_desc->status & E1000_RXD_STAT_DD) { ++ struct sk_buff *skb; ++ u8 status; ++ ++#ifdef CONFIG_E1000_NAPI ++ if (*work_done >= work_to_do) ++ break; ++ (*work_done)++; ++#endif ++ status = rx_desc->status; ++ skb = buffer_info->skb; ++ buffer_info->skb = NULL; ++ ++ prefetch(skb->data - NET_IP_ALIGN); ++ ++ if (++i == rx_ring->count) i = 0; ++ next_rxd = E1000_RX_DESC(*rx_ring, i); ++ prefetch(next_rxd); ++ ++ next_buffer = &rx_ring->buffer_info[i]; ++ ++ cleaned = TRUE; + cleaned_count++; + pci_unmap_single(pdev, + buffer_info->dma, +- buffer_info->length, ++ adapter->rx_buffer_len, + PCI_DMA_FROMDEVICE); ++ buffer_info->dma = 0; + + length = le16_to_cpu(rx_desc->length); + +- if (unlikely(!(status & E1000_RXD_STAT_EOP))) { ++ /* !EOP means multiple descriptors were used to store a single ++ * packet, also make sure the frame isn't just CRC only */ ++ if (unlikely(!(status & E1000_RXD_STAT_EOP) || (length <= 4))) { + /* All receives must fit into a single buffer */ + E1000_DBG("%s: Receive packet consumed multiple" + " buffers\n", netdev->name); +@@ -4144,14 +4079,19 @@ + } + + if (unlikely(rx_desc->errors & E1000_RXD_ERR_FRAME_ERR_MASK)) { +- last_byte = *(skb->data + length - 1); +- if (TBI_ACCEPT(hw, status, rx_desc->errors, length, +- last_byte)) { +- spin_lock_irqsave(&adapter->stats_lock, flags); +- e1000_tbi_adjust_stats(hw, &adapter->stats, +- length, skb->data); ++ u8 last_byte = *(skb->data + length - 1); ++ if (TBI_ACCEPT(&adapter->hw, status, ++ rx_desc->errors, length, last_byte, ++ adapter->min_frame_size, ++ adapter->max_frame_size)) { ++ spin_lock_irqsave(&adapter->stats_lock, ++ irq_flags); ++ e1000_tbi_adjust_stats_82543(&adapter->hw, ++ &adapter->stats, ++ length, skb->data, ++ adapter->max_frame_size); + spin_unlock_irqrestore(&adapter->stats_lock, +- flags); ++ irq_flags); + length--; + } else { + /* recycle */ +@@ -4177,11 +4117,11 @@ + if (new_skb) { + skb_reserve(new_skb, NET_IP_ALIGN); + skb_copy_to_linear_data_offset(new_skb, +- -NET_IP_ALIGN, +- (skb->data - +- NET_IP_ALIGN), +- (length + +- NET_IP_ALIGN)); ++ -NET_IP_ALIGN, ++ (skb->data - ++ NET_IP_ALIGN), ++ (length + ++ NET_IP_ALIGN)); + /* save the skb in buffer_info as good */ + buffer_info->skb = skb; + skb = new_skb; +@@ -4199,13 +4139,7 @@ + + skb->protocol = eth_type_trans(skb, netdev); + +- if (unlikely(adapter->vlgrp && +- (status & E1000_RXD_STAT_VP))) { +- vlan_hwaccel_receive_skb(skb, adapter->vlgrp, +- le16_to_cpu(rx_desc->special)); +- } else { +- netif_receive_skb(skb); +- } ++ e1000_receive_skb(adapter, status, rx_desc->special, skb); + + netdev->last_rx = jiffies; + +@@ -4235,191 +4169,127 @@ + return cleaned; + } + +-/** +- * e1000_clean_rx_irq_ps - Send received data up the network stack; packet split +- * @adapter: board private structure +- **/ +- +-static bool e1000_clean_rx_irq_ps(struct e1000_adapter *adapter, +- struct e1000_rx_ring *rx_ring, +- int *work_done, int work_to_do) +-{ +- union e1000_rx_desc_packet_split *rx_desc, *next_rxd; +- struct net_device *netdev = adapter->netdev; +- struct pci_dev *pdev = adapter->pdev; +- struct e1000_buffer *buffer_info, *next_buffer; +- struct e1000_ps_page *ps_page; +- struct e1000_ps_page_dma *ps_page_dma; ++#ifdef CONFIG_E1000_NAPI ++/** ++ * e1000_alloc_jumbo_rx_buffers - Replace used jumbo receive buffers ++ * @adapter: address of board private structure ++ * @rx_ring: pointer to receive ring structure ++ * @cleaned_count: number of buffers to allocate this pass ++ **/ ++static void e1000_alloc_jumbo_rx_buffers(struct e1000_adapter *adapter, ++ struct e1000_rx_ring *rx_ring, ++ int cleaned_count) ++{ ++ struct net_device *netdev = adapter->netdev; ++ struct pci_dev *pdev = adapter->pdev; ++ struct e1000_rx_desc *rx_desc; ++ struct e1000_rx_buffer *buffer_info; + struct sk_buff *skb; +- unsigned int i, j; +- u32 length, staterr; +- int cleaned_count = 0; +- bool cleaned = false; +- unsigned int total_rx_bytes=0, total_rx_packets=0; +- +- i = rx_ring->next_to_clean; +- rx_desc = E1000_RX_DESC_PS(*rx_ring, i); +- staterr = le32_to_cpu(rx_desc->wb.middle.status_error); ++ unsigned int i; ++ unsigned int bufsz = 256 - ++ 16 /*for skb_reserve */ - ++ NET_IP_ALIGN; ++ ++ i = rx_ring->next_to_use; + buffer_info = &rx_ring->buffer_info[i]; + +- while (staterr & E1000_RXD_STAT_DD) { +- ps_page = &rx_ring->ps_page[i]; +- ps_page_dma = &rx_ring->ps_page_dma[i]; +- +- if (unlikely(*work_done >= work_to_do)) +- break; +- (*work_done)++; +- ++ while (cleaned_count--) { + skb = buffer_info->skb; +- +- /* in the packet split case this is header only */ +- prefetch(skb->data - NET_IP_ALIGN); +- +- if (++i == rx_ring->count) i = 0; +- next_rxd = E1000_RX_DESC_PS(*rx_ring, i); +- prefetch(next_rxd); +- +- next_buffer = &rx_ring->buffer_info[i]; +- +- cleaned = true; +- cleaned_count++; +- pci_unmap_single(pdev, buffer_info->dma, +- buffer_info->length, +- PCI_DMA_FROMDEVICE); +- +- if (unlikely(!(staterr & E1000_RXD_STAT_EOP))) { +- E1000_DBG("%s: Packet Split buffers didn't pick up" +- " the full packet\n", netdev->name); +- dev_kfree_skb_irq(skb); +- goto next_desc; +- } +- +- if (unlikely(staterr & E1000_RXDEXT_ERR_FRAME_ERR_MASK)) { +- dev_kfree_skb_irq(skb); +- goto next_desc; +- } +- +- length = le16_to_cpu(rx_desc->wb.middle.length0); +- +- if (unlikely(!length)) { +- E1000_DBG("%s: Last part of the packet spanning" +- " multiple descriptors\n", netdev->name); +- dev_kfree_skb_irq(skb); +- goto next_desc; +- } +- +- /* Good Receive */ +- skb_put(skb, length); +- +- { +- /* this looks ugly, but it seems compiler issues make it +- more efficient than reusing j */ +- int l1 = le16_to_cpu(rx_desc->wb.upper.length[0]); +- +- /* page alloc/put takes too long and effects small packet +- * throughput, so unsplit small packets and save the alloc/put*/ +- if (l1 && (l1 <= copybreak) && ((length + l1) <= adapter->rx_ps_bsize0)) { +- u8 *vaddr; +- /* there is no documentation about how to call +- * kmap_atomic, so we can't hold the mapping +- * very long */ +- pci_dma_sync_single_for_cpu(pdev, +- ps_page_dma->ps_page_dma[0], +- PAGE_SIZE, +- PCI_DMA_FROMDEVICE); +- vaddr = kmap_atomic(ps_page->ps_page[0], +- KM_SKB_DATA_SOFTIRQ); +- memcpy(skb_tail_pointer(skb), vaddr, l1); +- kunmap_atomic(vaddr, KM_SKB_DATA_SOFTIRQ); +- pci_dma_sync_single_for_device(pdev, +- ps_page_dma->ps_page_dma[0], +- PAGE_SIZE, PCI_DMA_FROMDEVICE); +- /* remove the CRC */ +- l1 -= 4; +- skb_put(skb, l1); +- goto copydone; +- } /* if */ +- } +- +- for (j = 0; j < adapter->rx_ps_pages; j++) { +- length = le16_to_cpu(rx_desc->wb.upper.length[j]); +- if (!length) +- break; +- pci_unmap_page(pdev, ps_page_dma->ps_page_dma[j], +- PAGE_SIZE, PCI_DMA_FROMDEVICE); +- ps_page_dma->ps_page_dma[j] = 0; +- skb_add_rx_frag(skb, j, ps_page->ps_page[j], 0, length); +- ps_page->ps_page[j] = NULL; +- } +- +- /* strip the ethernet crc, problem is we're using pages now so +- * this whole operation can get a little cpu intensive */ +- pskb_trim(skb, skb->len - 4); +- +-copydone: +- total_rx_bytes += skb->len; +- total_rx_packets++; +- +- e1000_rx_checksum(adapter, staterr, +- le16_to_cpu(rx_desc->wb.lower.hi_dword.csum_ip.csum), skb); +- skb->protocol = eth_type_trans(skb, netdev); +- +- if (likely(rx_desc->wb.upper.header_status & +- cpu_to_le16(E1000_RXDPS_HDRSTAT_HDRSP))) +- adapter->rx_hdr_split++; +- +- if (unlikely(adapter->vlgrp && (staterr & E1000_RXD_STAT_VP))) { +- vlan_hwaccel_receive_skb(skb, adapter->vlgrp, +- le16_to_cpu(rx_desc->wb.middle.vlan)); +- } else { +- netif_receive_skb(skb); +- } +- +- netdev->last_rx = jiffies; +- +-next_desc: +- rx_desc->wb.middle.status_error &= cpu_to_le32(~0xFF); +- buffer_info->skb = NULL; +- +- /* return some buffers to hardware, one at a time is too slow */ +- if (unlikely(cleaned_count >= E1000_RX_BUFFER_WRITE)) { +- adapter->alloc_rx_buf(adapter, rx_ring, cleaned_count); +- cleaned_count = 0; +- } +- +- /* use prefetched values */ +- rx_desc = next_rxd; +- buffer_info = next_buffer; +- +- staterr = le32_to_cpu(rx_desc->wb.middle.status_error); +- } +- rx_ring->next_to_clean = i; +- +- cleaned_count = E1000_DESC_UNUSED(rx_ring); +- if (cleaned_count) +- adapter->alloc_rx_buf(adapter, rx_ring, cleaned_count); +- +- adapter->total_rx_packets += total_rx_packets; +- adapter->total_rx_bytes += total_rx_bytes; +- adapter->net_stats.rx_bytes += total_rx_bytes; +- adapter->net_stats.rx_packets += total_rx_packets; +- return cleaned; +-} ++ if (skb) { ++ skb_trim(skb, 0); ++ goto check_page; ++ } ++ ++ skb = netdev_alloc_skb(netdev, bufsz); ++ if (unlikely(!skb)) { ++ /* Better luck next round */ ++ adapter->alloc_rx_buff_failed++; ++ break; ++ } ++ ++ /* Fix for errata 23, can't cross 64kB boundary */ ++ if (!e1000_check_64k_bound(adapter, skb->data, bufsz)) { ++ struct sk_buff *oldskb = skb; ++ DPRINTK(PROBE, ERR, "skb align check failed: %u bytes " ++ "at %p\n", bufsz, skb->data); ++ /* Try again, without freeing the previous */ ++ skb = netdev_alloc_skb(netdev, bufsz); ++ /* Failed allocation, critical failure */ ++ if (!skb) { ++ dev_kfree_skb(oldskb); ++ adapter->alloc_rx_buff_failed++; ++ break; ++ } ++ ++ if (!e1000_check_64k_bound(adapter, skb->data, bufsz)) { ++ /* give up */ ++ dev_kfree_skb(skb); ++ dev_kfree_skb(oldskb); ++ adapter->alloc_rx_buff_failed++; ++ break; /* while !buffer_info->skb */ ++ } ++ ++ /* Use new allocation */ ++ dev_kfree_skb(oldskb); ++ } ++ /* Make buffer alignment 2 beyond a 16 byte boundary ++ * this will result in a 16 byte aligned IP header after ++ * the 14 byte MAC header is removed ++ */ ++ skb_reserve(skb, NET_IP_ALIGN); ++ ++ buffer_info->skb = skb; ++check_page: ++ /* allocate a new page if necessary */ ++ if (!buffer_info->page) { ++ buffer_info->page = alloc_page(GFP_ATOMIC); ++ if (unlikely(!buffer_info->page)) { ++ adapter->alloc_rx_buff_failed++; ++ break; ++ } ++ } ++ ++ if (!buffer_info->dma) ++ buffer_info->dma = pci_map_page(pdev, ++ buffer_info->page, 0, ++ PAGE_SIZE, ++ PCI_DMA_FROMDEVICE); ++ ++ rx_desc = E1000_RX_DESC(*rx_ring, i); ++ rx_desc->buffer_addr = cpu_to_le64(buffer_info->dma); ++ ++ if (unlikely(++i == rx_ring->count)) ++ i = 0; ++ buffer_info = &rx_ring->buffer_info[i]; ++ } ++ ++ if (likely(rx_ring->next_to_use != i)) { ++ rx_ring->next_to_use = i; ++ if (unlikely(i-- == 0)) ++ i = (rx_ring->count - 1); ++ ++ /* Force memory writes to complete before letting h/w ++ * know there are new descriptors to fetch. (Only ++ * applicable for weak-ordered memory model archs, ++ * such as IA-64). */ ++ wmb(); ++ writel(i, adapter->hw.hw_addr + rx_ring->rdt); ++ } ++} ++#endif /* NAPI */ + + /** + * e1000_alloc_rx_buffers - Replace used receive buffers; legacy & extended + * @adapter: address of board private structure + **/ +- + static void e1000_alloc_rx_buffers(struct e1000_adapter *adapter, +- struct e1000_rx_ring *rx_ring, +- int cleaned_count) +-{ +- struct e1000_hw *hw = &adapter->hw; ++ struct e1000_rx_ring *rx_ring, ++ int cleaned_count) ++{ + struct net_device *netdev = adapter->netdev; + struct pci_dev *pdev = adapter->pdev; + struct e1000_rx_desc *rx_desc; +- struct e1000_buffer *buffer_info; ++ struct e1000_rx_buffer *buffer_info; + struct sk_buff *skb; + unsigned int i; + unsigned int bufsz = adapter->rx_buffer_len + NET_IP_ALIGN; +@@ -4451,6 +4321,7 @@ + /* Failed allocation, critical failure */ + if (!skb) { + dev_kfree_skb(oldskb); ++ adapter->alloc_rx_buff_failed++; + break; + } + +@@ -4458,6 +4329,7 @@ + /* give up */ + dev_kfree_skb(skb); + dev_kfree_skb(oldskb); ++ adapter->alloc_rx_buff_failed++; + break; /* while !buffer_info->skb */ + } + +@@ -4471,7 +4343,6 @@ + skb_reserve(skb, NET_IP_ALIGN); + + buffer_info->skb = skb; +- buffer_info->length = adapter->rx_buffer_len; + map_skb: + buffer_info->dma = pci_map_single(pdev, + skb->data, +@@ -4492,7 +4363,9 @@ + pci_unmap_single(pdev, buffer_info->dma, + adapter->rx_buffer_len, + PCI_DMA_FROMDEVICE); +- ++ buffer_info->dma = 0; ++ ++ adapter->alloc_rx_buff_failed++; + break; /* while !buffer_info->skb */ + } + rx_desc = E1000_RX_DESC(*rx_ring, i); +@@ -4513,105 +4386,7 @@ + * applicable for weak-ordered memory model archs, + * such as IA-64). */ + wmb(); +- writel(i, hw->hw_addr + rx_ring->rdt); +- } +-} +- +-/** +- * e1000_alloc_rx_buffers_ps - Replace used receive buffers; packet split +- * @adapter: address of board private structure +- **/ +- +-static void e1000_alloc_rx_buffers_ps(struct e1000_adapter *adapter, +- struct e1000_rx_ring *rx_ring, +- int cleaned_count) +-{ +- struct e1000_hw *hw = &adapter->hw; +- struct net_device *netdev = adapter->netdev; +- struct pci_dev *pdev = adapter->pdev; +- union e1000_rx_desc_packet_split *rx_desc; +- struct e1000_buffer *buffer_info; +- struct e1000_ps_page *ps_page; +- struct e1000_ps_page_dma *ps_page_dma; +- struct sk_buff *skb; +- unsigned int i, j; +- +- i = rx_ring->next_to_use; +- buffer_info = &rx_ring->buffer_info[i]; +- ps_page = &rx_ring->ps_page[i]; +- ps_page_dma = &rx_ring->ps_page_dma[i]; +- +- while (cleaned_count--) { +- rx_desc = E1000_RX_DESC_PS(*rx_ring, i); +- +- for (j = 0; j < PS_PAGE_BUFFERS; j++) { +- if (j < adapter->rx_ps_pages) { +- if (likely(!ps_page->ps_page[j])) { +- ps_page->ps_page[j] = +- netdev_alloc_page(netdev); +- if (unlikely(!ps_page->ps_page[j])) { +- adapter->alloc_rx_buff_failed++; +- goto no_buffers; +- } +- ps_page_dma->ps_page_dma[j] = +- pci_map_page(pdev, +- ps_page->ps_page[j], +- 0, PAGE_SIZE, +- PCI_DMA_FROMDEVICE); +- } +- /* Refresh the desc even if buffer_addrs didn't +- * change because each write-back erases +- * this info. +- */ +- rx_desc->read.buffer_addr[j+1] = +- cpu_to_le64(ps_page_dma->ps_page_dma[j]); +- } else +- rx_desc->read.buffer_addr[j+1] = ~cpu_to_le64(0); +- } +- +- skb = netdev_alloc_skb(netdev, +- adapter->rx_ps_bsize0 + NET_IP_ALIGN); +- +- if (unlikely(!skb)) { +- adapter->alloc_rx_buff_failed++; +- break; +- } +- +- /* Make buffer alignment 2 beyond a 16 byte boundary +- * this will result in a 16 byte aligned IP header after +- * the 14 byte MAC header is removed +- */ +- skb_reserve(skb, NET_IP_ALIGN); +- +- buffer_info->skb = skb; +- buffer_info->length = adapter->rx_ps_bsize0; +- buffer_info->dma = pci_map_single(pdev, skb->data, +- adapter->rx_ps_bsize0, +- PCI_DMA_FROMDEVICE); +- +- rx_desc->read.buffer_addr[0] = cpu_to_le64(buffer_info->dma); +- +- if (unlikely(++i == rx_ring->count)) i = 0; +- buffer_info = &rx_ring->buffer_info[i]; +- ps_page = &rx_ring->ps_page[i]; +- ps_page_dma = &rx_ring->ps_page_dma[i]; +- } +- +-no_buffers: +- if (likely(rx_ring->next_to_use != i)) { +- rx_ring->next_to_use = i; +- if (unlikely(i-- == 0)) i = (rx_ring->count - 1); +- +- /* Force memory writes to complete before letting h/w +- * know there are new descriptors to fetch. (Only +- * applicable for weak-ordered memory model archs, +- * such as IA-64). */ +- wmb(); +- /* Hardware increments by 16 bytes, but packet split +- * descriptors are 32 bytes...so we increment tail +- * twice as much. +- */ +- writel(i<<1, hw->hw_addr + rx_ring->rdt); ++ writel(i, adapter->hw.hw_addr + rx_ring->rdt); + } + } + +@@ -4619,50 +4394,50 @@ + * e1000_smartspeed - Workaround for SmartSpeed on 82541 and 82547 controllers. + * @adapter: + **/ +- + static void e1000_smartspeed(struct e1000_adapter *adapter) + { +- struct e1000_hw *hw = &adapter->hw; ++ struct e1000_mac_info *mac = &adapter->hw.mac; ++ struct e1000_phy_info *phy = &adapter->hw.phy; + u16 phy_status; + u16 phy_ctrl; + +- if ((hw->phy_type != e1000_phy_igp) || !hw->autoneg || +- !(hw->autoneg_advertised & ADVERTISE_1000_FULL)) ++ if ((phy->type != e1000_phy_igp) || !mac->autoneg || ++ !(phy->autoneg_advertised & ADVERTISE_1000_FULL)) + return; + + if (adapter->smartspeed == 0) { + /* If Master/Slave config fault is asserted twice, + * we assume back-to-back */ +- e1000_read_phy_reg(hw, PHY_1000T_STATUS, &phy_status); ++ e1000_read_phy_reg(&adapter->hw, PHY_1000T_STATUS, &phy_status); + if (!(phy_status & SR_1000T_MS_CONFIG_FAULT)) return; +- e1000_read_phy_reg(hw, PHY_1000T_STATUS, &phy_status); ++ e1000_read_phy_reg(&adapter->hw, PHY_1000T_STATUS, &phy_status); + if (!(phy_status & SR_1000T_MS_CONFIG_FAULT)) return; +- e1000_read_phy_reg(hw, PHY_1000T_CTRL, &phy_ctrl); ++ e1000_read_phy_reg(&adapter->hw, PHY_1000T_CTRL, &phy_ctrl); + if (phy_ctrl & CR_1000T_MS_ENABLE) { + phy_ctrl &= ~CR_1000T_MS_ENABLE; +- e1000_write_phy_reg(hw, PHY_1000T_CTRL, ++ e1000_write_phy_reg(&adapter->hw, PHY_1000T_CTRL, + phy_ctrl); + adapter->smartspeed++; +- if (!e1000_phy_setup_autoneg(hw) && +- !e1000_read_phy_reg(hw, PHY_CTRL, ++ if (!e1000_phy_setup_autoneg(&adapter->hw) && ++ !e1000_read_phy_reg(&adapter->hw, PHY_CONTROL, + &phy_ctrl)) { + phy_ctrl |= (MII_CR_AUTO_NEG_EN | + MII_CR_RESTART_AUTO_NEG); +- e1000_write_phy_reg(hw, PHY_CTRL, ++ e1000_write_phy_reg(&adapter->hw, PHY_CONTROL, + phy_ctrl); + } + } + return; + } else if (adapter->smartspeed == E1000_SMARTSPEED_DOWNSHIFT) { + /* If still no link, perhaps using 2/3 pair cable */ +- e1000_read_phy_reg(hw, PHY_1000T_CTRL, &phy_ctrl); ++ e1000_read_phy_reg(&adapter->hw, PHY_1000T_CTRL, &phy_ctrl); + phy_ctrl |= CR_1000T_MS_ENABLE; +- e1000_write_phy_reg(hw, PHY_1000T_CTRL, phy_ctrl); +- if (!e1000_phy_setup_autoneg(hw) && +- !e1000_read_phy_reg(hw, PHY_CTRL, &phy_ctrl)) { ++ e1000_write_phy_reg(&adapter->hw, PHY_1000T_CTRL, phy_ctrl); ++ if (!e1000_phy_setup_autoneg(&adapter->hw) && ++ !e1000_read_phy_reg(&adapter->hw, PHY_CONTROL, &phy_ctrl)) { + phy_ctrl |= (MII_CR_AUTO_NEG_EN | + MII_CR_RESTART_AUTO_NEG); +- e1000_write_phy_reg(hw, PHY_CTRL, phy_ctrl); ++ e1000_write_phy_reg(&adapter->hw, PHY_CONTROL, phy_ctrl); + } + } + /* Restart process after E1000_SMARTSPEED_MAX iterations */ +@@ -4676,120 +4451,89 @@ + * @ifreq: + * @cmd: + **/ +- + static int e1000_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd) + { + switch (cmd) { ++#ifdef SIOCGMIIPHY + case SIOCGMIIPHY: + case SIOCGMIIREG: + case SIOCSMIIREG: + return e1000_mii_ioctl(netdev, ifr, cmd); ++#endif ++#ifdef ETHTOOL_OPS_COMPAT ++ case SIOCETHTOOL: ++ return ethtool_ioctl(ifr); ++#endif + default: + return -EOPNOTSUPP; + } + } + ++#ifdef SIOCGMIIPHY + /** + * e1000_mii_ioctl - + * @netdev: + * @ifreq: + * @cmd: + **/ +- + static int e1000_mii_ioctl(struct net_device *netdev, struct ifreq *ifr, +- int cmd) +-{ +- struct e1000_adapter *adapter = netdev_priv(netdev); +- struct e1000_hw *hw = &adapter->hw; ++ int cmd) ++{ ++ struct e1000_adapter *adapter = netdev_priv(netdev); + struct mii_ioctl_data *data = if_mii(ifr); +- int retval; +- u16 mii_reg; +- u16 spddplx; +- unsigned long flags; +- +- if (hw->media_type != e1000_media_type_copper) ++ ++ if (adapter->hw.phy.media_type != e1000_media_type_copper) + return -EOPNOTSUPP; + + switch (cmd) { + case SIOCGMIIPHY: +- data->phy_id = hw->phy_addr; ++ data->phy_id = adapter->hw.phy.addr; + break; + case SIOCGMIIREG: + if (!capable(CAP_NET_ADMIN)) + return -EPERM; +- spin_lock_irqsave(&adapter->stats_lock, flags); +- if (e1000_read_phy_reg(hw, data->reg_num & 0x1F, +- &data->val_out)) { +- spin_unlock_irqrestore(&adapter->stats_lock, flags); ++ switch (data->reg_num & 0x1F) { ++ case MII_BMCR: ++ data->val_out = adapter->phy_regs.bmcr; ++ break; ++ case MII_BMSR: ++ data->val_out = adapter->phy_regs.bmsr; ++ break; ++ case MII_PHYSID1: ++ data->val_out = (adapter->hw.phy.id >> 16); ++ break; ++ case MII_PHYSID2: ++ data->val_out = (adapter->hw.phy.id & 0xFFFF); ++ break; ++ case MII_ADVERTISE: ++ data->val_out = adapter->phy_regs.advertise; ++ break; ++ case MII_LPA: ++ data->val_out = adapter->phy_regs.lpa; ++ break; ++ case MII_EXPANSION: ++ data->val_out = adapter->phy_regs.expansion; ++ break; ++ case MII_CTRL1000: ++ data->val_out = adapter->phy_regs.ctrl1000; ++ break; ++ case MII_STAT1000: ++ data->val_out = adapter->phy_regs.stat1000; ++ break; ++ case MII_ESTATUS: ++ data->val_out = adapter->phy_regs.estatus; ++ break; ++ default: + return -EIO; + } +- spin_unlock_irqrestore(&adapter->stats_lock, flags); + break; + case SIOCSMIIREG: +- if (!capable(CAP_NET_ADMIN)) +- return -EPERM; +- if (data->reg_num & ~(0x1F)) +- return -EFAULT; +- mii_reg = data->val_in; +- spin_lock_irqsave(&adapter->stats_lock, flags); +- if (e1000_write_phy_reg(hw, data->reg_num, +- mii_reg)) { +- spin_unlock_irqrestore(&adapter->stats_lock, flags); +- return -EIO; +- } +- spin_unlock_irqrestore(&adapter->stats_lock, flags); +- if (hw->media_type == e1000_media_type_copper) { +- switch (data->reg_num) { +- case PHY_CTRL: +- if (mii_reg & MII_CR_POWER_DOWN) +- break; +- if (mii_reg & MII_CR_AUTO_NEG_EN) { +- hw->autoneg = 1; +- hw->autoneg_advertised = 0x2F; +- } else { +- if (mii_reg & 0x40) +- spddplx = SPEED_1000; +- else if (mii_reg & 0x2000) +- spddplx = SPEED_100; +- else +- spddplx = SPEED_10; +- spddplx += (mii_reg & 0x100) +- ? DUPLEX_FULL : +- DUPLEX_HALF; +- retval = e1000_set_spd_dplx(adapter, +- spddplx); +- if (retval) +- return retval; +- } +- if (netif_running(adapter->netdev)) +- e1000_reinit_locked(adapter); +- else +- e1000_reset(adapter); +- break; +- case M88E1000_PHY_SPEC_CTRL: +- case M88E1000_EXT_PHY_SPEC_CTRL: +- if (e1000_phy_reset(hw)) +- return -EIO; +- break; +- } +- } else { +- switch (data->reg_num) { +- case PHY_CTRL: +- if (mii_reg & MII_CR_POWER_DOWN) +- break; +- if (netif_running(adapter->netdev)) +- e1000_reinit_locked(adapter); +- else +- e1000_reset(adapter); +- break; +- } +- } +- break; + default: + return -EOPNOTSUPP; + } + return E1000_SUCCESS; + } ++#endif + + void e1000_pci_set_mwi(struct e1000_hw *hw) + { +@@ -4807,123 +4551,118 @@ + pci_clear_mwi(adapter->pdev); + } + +-int e1000_pcix_get_mmrbc(struct e1000_hw *hw) +-{ +- struct e1000_adapter *adapter = hw->back; +- return pcix_get_mmrbc(adapter->pdev); +-} +- +-void e1000_pcix_set_mmrbc(struct e1000_hw *hw, int mmrbc) +-{ +- struct e1000_adapter *adapter = hw->back; +- pcix_set_mmrbc(adapter->pdev, mmrbc); ++void e1000_read_pci_cfg(struct e1000_hw *hw, u32 reg, u16 *value) ++{ ++ struct e1000_adapter *adapter = hw->back; ++ ++ pci_read_config_word(adapter->pdev, reg, value); ++} ++ ++void e1000_write_pci_cfg(struct e1000_hw *hw, u32 reg, u16 *value) ++{ ++ struct e1000_adapter *adapter = hw->back; ++ ++ pci_write_config_word(adapter->pdev, reg, *value); + } + + s32 e1000_read_pcie_cap_reg(struct e1000_hw *hw, u32 reg, u16 *value) + { +- struct e1000_adapter *adapter = hw->back; +- u16 cap_offset; +- +- cap_offset = pci_find_capability(adapter->pdev, PCI_CAP_ID_EXP); +- if (!cap_offset) +- return -E1000_ERR_CONFIG; +- +- pci_read_config_word(adapter->pdev, cap_offset + reg, value); +- +- return E1000_SUCCESS; +-} +- +-void e1000_io_write(struct e1000_hw *hw, unsigned long port, u32 value) +-{ +- outl(value, port); +-} +- ++ struct e1000_adapter *adapter = hw->back; ++ u16 cap_offset; ++ ++ cap_offset = pci_find_capability(adapter->pdev, PCI_CAP_ID_EXP); ++ if (!cap_offset) ++ return -E1000_ERR_CONFIG; ++ ++ pci_read_config_word(adapter->pdev, cap_offset + reg, value); ++ ++ return E1000_SUCCESS; ++} ++ ++#ifdef NETIF_F_HW_VLAN_TX + static void e1000_vlan_rx_register(struct net_device *netdev, +- struct vlan_group *grp) +-{ +- struct e1000_adapter *adapter = netdev_priv(netdev); +- struct e1000_hw *hw = &adapter->hw; ++ struct vlan_group *grp) ++{ ++ struct e1000_adapter *adapter = netdev_priv(netdev); + u32 ctrl, rctl; + +- if (!test_bit(__E1000_DOWN, &adapter->flags)) ++ if (!test_bit(__E1000_DOWN, &adapter->state)) + e1000_irq_disable(adapter); + adapter->vlgrp = grp; + + if (grp) { + /* enable VLAN tag insert/strip */ +- ctrl = er32(CTRL); ++ ctrl = E1000_READ_REG(&adapter->hw, E1000_CTRL); + ctrl |= E1000_CTRL_VME; +- ew32(CTRL, ctrl); +- +- if (adapter->hw.mac_type != e1000_ich8lan) { +- /* enable VLAN receive filtering */ +- rctl = er32(RCTL); +- rctl &= ~E1000_RCTL_CFIEN; +- ew32(RCTL, rctl); +- e1000_update_mng_vlan(adapter); +- } ++ E1000_WRITE_REG(&adapter->hw, E1000_CTRL, ctrl); ++ ++ /* enable VLAN receive filtering */ ++ rctl = E1000_READ_REG(&adapter->hw, E1000_RCTL); ++ if (!(netdev->flags & IFF_PROMISC)) ++ rctl |= E1000_RCTL_VFE; ++ rctl &= ~E1000_RCTL_CFIEN; ++ E1000_WRITE_REG(&adapter->hw, E1000_RCTL, rctl); ++ e1000_update_mng_vlan(adapter); + } else { + /* disable VLAN tag insert/strip */ +- ctrl = er32(CTRL); ++ ctrl = E1000_READ_REG(&adapter->hw, E1000_CTRL); + ctrl &= ~E1000_CTRL_VME; +- ew32(CTRL, ctrl); +- +- if (adapter->hw.mac_type != e1000_ich8lan) { +- if (adapter->mng_vlan_id != +- (u16)E1000_MNG_VLAN_NONE) { +- e1000_vlan_rx_kill_vid(netdev, +- adapter->mng_vlan_id); +- adapter->mng_vlan_id = E1000_MNG_VLAN_NONE; +- } +- } +- } +- +- if (!test_bit(__E1000_DOWN, &adapter->flags)) ++ E1000_WRITE_REG(&adapter->hw, E1000_CTRL, ctrl); ++ ++ /* disable VLAN filtering */ ++ rctl = E1000_READ_REG(&adapter->hw, E1000_RCTL); ++ rctl &= ~E1000_RCTL_VFE; ++ E1000_WRITE_REG(&adapter->hw, E1000_RCTL, rctl); ++ if (adapter->mng_vlan_id != ++ (u16)E1000_MNG_VLAN_NONE) { ++ e1000_vlan_rx_kill_vid(netdev, adapter->mng_vlan_id); ++ adapter->mng_vlan_id = E1000_MNG_VLAN_NONE; ++ } ++ } ++ ++ if (!test_bit(__E1000_DOWN, &adapter->state)) + e1000_irq_enable(adapter); + } + + static void e1000_vlan_rx_add_vid(struct net_device *netdev, u16 vid) + { + struct e1000_adapter *adapter = netdev_priv(netdev); +- struct e1000_hw *hw = &adapter->hw; + u32 vfta, index; +- +- if ((hw->mng_cookie.status & +- E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT) && ++ struct net_device *v_netdev; ++ ++ if ((adapter->hw.mng_cookie.status & ++ E1000_MNG_DHCP_COOKIE_STATUS_VLAN) && + (vid == adapter->mng_vlan_id)) + return; + /* add VID to filter table */ + index = (vid >> 5) & 0x7F; +- vfta = E1000_READ_REG_ARRAY(hw, VFTA, index); ++ vfta = E1000_READ_REG_ARRAY(&adapter->hw, E1000_VFTA, index); + vfta |= (1 << (vid & 0x1F)); +- e1000_write_vfta(hw, index, vfta); ++ e1000_write_vfta(&adapter->hw, index, vfta); ++ /* Copy feature flags from netdev to the vlan netdev for this vid. ++ * This allows things like TSO to bubble down to our vlan device. ++ */ ++ v_netdev = vlan_group_get_device(adapter->vlgrp, vid); ++ v_netdev->features |= adapter->netdev->features; ++ vlan_group_set_device(adapter->vlgrp, vid, v_netdev); + } + + static void e1000_vlan_rx_kill_vid(struct net_device *netdev, u16 vid) + { + struct e1000_adapter *adapter = netdev_priv(netdev); +- struct e1000_hw *hw = &adapter->hw; + u32 vfta, index; + +- if (!test_bit(__E1000_DOWN, &adapter->flags)) ++ if (!test_bit(__E1000_DOWN, &adapter->state)) + e1000_irq_disable(adapter); + vlan_group_set_device(adapter->vlgrp, vid, NULL); +- if (!test_bit(__E1000_DOWN, &adapter->flags)) ++ if (!test_bit(__E1000_DOWN, &adapter->state)) + e1000_irq_enable(adapter); +- +- if ((hw->mng_cookie.status & +- E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT) && +- (vid == adapter->mng_vlan_id)) { +- /* release control to f/w */ +- e1000_release_hw_control(adapter); +- return; +- } + + /* remove VID from filter table */ + index = (vid >> 5) & 0x7F; +- vfta = E1000_READ_REG_ARRAY(hw, VFTA, index); ++ vfta = E1000_READ_REG_ARRAY(&adapter->hw, E1000_VFTA, index); + vfta &= ~(1 << (vid & 0x1F)); +- e1000_write_vfta(hw, index, vfta); ++ e1000_write_vfta(&adapter->hw, index, vfta); + } + + static void e1000_restore_vlan(struct e1000_adapter *adapter) +@@ -4939,15 +4678,16 @@ + } + } + } ++#endif + + int e1000_set_spd_dplx(struct e1000_adapter *adapter, u16 spddplx) + { +- struct e1000_hw *hw = &adapter->hw; +- +- hw->autoneg = 0; ++ struct e1000_mac_info *mac = &adapter->hw.mac; ++ ++ mac->autoneg = 0; + + /* Fiber NICs only allow 1000 gbps Full duplex */ +- if ((hw->media_type == e1000_media_type_fiber) && ++ if ((adapter->hw.phy.media_type == e1000_media_type_fiber) && + spddplx != (SPEED_1000 + DUPLEX_FULL)) { + DPRINTK(PROBE, ERR, "Unsupported Speed/Duplex configuration\n"); + return -EINVAL; +@@ -4955,20 +4695,20 @@ + + switch (spddplx) { + case SPEED_10 + DUPLEX_HALF: +- hw->forced_speed_duplex = e1000_10_half; ++ mac->forced_speed_duplex = ADVERTISE_10_HALF; + break; + case SPEED_10 + DUPLEX_FULL: +- hw->forced_speed_duplex = e1000_10_full; ++ mac->forced_speed_duplex = ADVERTISE_10_FULL; + break; + case SPEED_100 + DUPLEX_HALF: +- hw->forced_speed_duplex = e1000_100_half; ++ mac->forced_speed_duplex = ADVERTISE_100_HALF; + break; + case SPEED_100 + DUPLEX_FULL: +- hw->forced_speed_duplex = e1000_100_full; ++ mac->forced_speed_duplex = ADVERTISE_100_FULL; + break; + case SPEED_1000 + DUPLEX_FULL: +- hw->autoneg = 1; +- hw->autoneg_advertised = ADVERTISE_1000_FULL; ++ mac->autoneg = 1; ++ adapter->hw.phy.autoneg_advertised = ADVERTISE_1000_FULL; + break; + case SPEED_1000 + DUPLEX_HALF: /* not supported */ + default: +@@ -4978,11 +4718,30 @@ + return 0; + } + ++#ifdef USE_REBOOT_NOTIFIER ++/* only want to do this for 2.4 kernels? */ ++static int e1000_notify_reboot(struct notifier_block *nb, ++ unsigned long event, void *p) ++{ ++ struct pci_dev *pdev = NULL; ++ ++ switch (event) { ++ case SYS_DOWN: ++ case SYS_HALT: ++ case SYS_POWER_OFF: ++ while ((pdev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, pdev))) { ++ if (pci_dev_driver(pdev) == &e1000_driver) ++ e1000_suspend(pdev, PMSG_SUSPEND); ++ } ++ } ++ return NOTIFY_DONE; ++} ++#endif ++ + static int e1000_suspend(struct pci_dev *pdev, pm_message_t state) + { + struct net_device *netdev = pci_get_drvdata(pdev); + struct e1000_adapter *adapter = netdev_priv(netdev); +- struct e1000_hw *hw = &adapter->hw; + u32 ctrl, ctrl_ext, rctl, status; + u32 wufc = adapter->wol; + #ifdef CONFIG_PM +@@ -4992,8 +4751,9 @@ + netif_device_detach(netdev); + + if (netif_running(netdev)) { +- WARN_ON(test_bit(__E1000_RESETTING, &adapter->flags)); ++ WARN_ON(test_bit(__E1000_RESETTING, &adapter->state)); + e1000_down(adapter); ++ e1000_free_irq(adapter); + } + + #ifdef CONFIG_PM +@@ -5002,50 +4762,50 @@ + return retval; + #endif + +- status = er32(STATUS); ++ status = E1000_READ_REG(&adapter->hw, E1000_STATUS); + if (status & E1000_STATUS_LU) + wufc &= ~E1000_WUFC_LNKC; + + if (wufc) { + e1000_setup_rctl(adapter); +- e1000_set_rx_mode(netdev); ++ e1000_set_multi(netdev); + + /* turn on all-multi mode if wake on multicast is enabled */ + if (wufc & E1000_WUFC_MC) { +- rctl = er32(RCTL); ++ rctl = E1000_READ_REG(&adapter->hw, E1000_RCTL); + rctl |= E1000_RCTL_MPE; +- ew32(RCTL, rctl); +- } +- +- if (hw->mac_type >= e1000_82540) { +- ctrl = er32(CTRL); ++ E1000_WRITE_REG(&adapter->hw, E1000_RCTL, rctl); ++ } ++ ++ if (adapter->hw.mac.type >= e1000_82540) { ++ ctrl = E1000_READ_REG(&adapter->hw, E1000_CTRL); + /* advertise wake from D3Cold */ + #define E1000_CTRL_ADVD3WUC 0x00100000 + /* phy power management enable */ + #define E1000_CTRL_EN_PHY_PWR_MGMT 0x00200000 + ctrl |= E1000_CTRL_ADVD3WUC | + E1000_CTRL_EN_PHY_PWR_MGMT; +- ew32(CTRL, ctrl); +- } +- +- if (hw->media_type == e1000_media_type_fiber || +- hw->media_type == e1000_media_type_internal_serdes) { ++ E1000_WRITE_REG(&adapter->hw, E1000_CTRL, ctrl); ++ } ++ ++ if (adapter->hw.phy.media_type == e1000_media_type_fiber || ++ adapter->hw.phy.media_type == e1000_media_type_internal_serdes) { + /* keep the laser running in D3 */ +- ctrl_ext = er32(CTRL_EXT); ++ ctrl_ext = E1000_READ_REG(&adapter->hw, E1000_CTRL_EXT); + ctrl_ext |= E1000_CTRL_EXT_SDP7_DATA; +- ew32(CTRL_EXT, ctrl_ext); ++ E1000_WRITE_REG(&adapter->hw, E1000_CTRL_EXT, ctrl_ext); + } + + /* Allow time for pending master requests to run */ +- e1000_disable_pciex_master(hw); +- +- ew32(WUC, E1000_WUC_PME_EN); +- ew32(WUFC, wufc); ++ e1000_disable_pcie_master(&adapter->hw); ++ ++ E1000_WRITE_REG(&adapter->hw, E1000_WUC, E1000_WUC_PME_EN); ++ E1000_WRITE_REG(&adapter->hw, E1000_WUFC, wufc); + pci_enable_wake(pdev, PCI_D3hot, 1); + pci_enable_wake(pdev, PCI_D3cold, 1); + } else { +- ew32(WUC, 0); +- ew32(WUFC, 0); ++ E1000_WRITE_REG(&adapter->hw, E1000_WUC, 0); ++ E1000_WRITE_REG(&adapter->hw, E1000_WUFC, 0); + pci_enable_wake(pdev, PCI_D3hot, 0); + pci_enable_wake(pdev, PCI_D3cold, 0); + } +@@ -5058,16 +4818,6 @@ + pci_enable_wake(pdev, PCI_D3cold, 1); + } + +- if (hw->phy_type == e1000_phy_igp_3) +- e1000_phy_powerdown_workaround(hw); +- +- if (netif_running(netdev)) +- e1000_free_irq(adapter); +- +- /* Release control of h/w to f/w. If f/w is AMT enabled, this +- * would have already happened in close and is redundant. */ +- e1000_release_hw_control(adapter); +- + pci_disable_device(pdev); + + pci_set_power_state(pdev, pci_choose_state(pdev, state)); +@@ -5080,17 +4830,11 @@ + { + struct net_device *netdev = pci_get_drvdata(pdev); + struct e1000_adapter *adapter = netdev_priv(netdev); +- struct e1000_hw *hw = &adapter->hw; + u32 err; + + pci_set_power_state(pdev, PCI_D0); + pci_restore_state(pdev); +- +- if (adapter->need_ioport) +- err = pci_enable_device(pdev); +- else +- err = pci_enable_device_mem(pdev); +- if (err) { ++ if ((err = pci_enable_device(pdev))) { + printk(KERN_ERR "e1000: Cannot enable PCI device from suspend\n"); + return err; + } +@@ -5099,15 +4843,13 @@ + pci_enable_wake(pdev, PCI_D3hot, 0); + pci_enable_wake(pdev, PCI_D3cold, 0); + +- if (netif_running(netdev)) { +- err = e1000_request_irq(adapter); +- if (err) +- return err; +- } +- +- e1000_power_up_phy(adapter); +- e1000_reset(adapter); +- ew32(WUS, ~0); ++ if (netif_running(netdev) && (err = e1000_request_irq(adapter))) ++ return err; ++ ++ if (adapter->hw.phy.media_type == e1000_media_type_copper) ++ e1000_power_up_phy(&adapter->hw); ++ e1000_reset(adapter); ++ E1000_WRITE_REG(&adapter->hw, E1000_WUS, ~0); + + e1000_init_manageability(adapter); + +@@ -5116,22 +4858,16 @@ + + netif_device_attach(netdev); + +- /* If the controller is 82573 and f/w is AMT, do not set +- * DRV_LOAD until the interface is up. For all other cases, +- * let the f/w know that the h/w is now under the control +- * of the driver. */ +- if (hw->mac_type != e1000_82573 || +- !e1000_check_mng_mode(hw)) +- e1000_get_hw_control(adapter); +- +- return 0; +-} +-#endif +- ++ return 0; ++} ++#endif ++ ++#ifndef USE_REBOOT_NOTIFIER + static void e1000_shutdown(struct pci_dev *pdev) + { + e1000_suspend(pdev, PMSG_SUSPEND); + } ++#endif + + #ifdef CONFIG_NET_POLL_CONTROLLER + /* +@@ -5142,26 +4878,35 @@ + static void e1000_netpoll(struct net_device *netdev) + { + struct e1000_adapter *adapter = netdev_priv(netdev); ++ int i; + + disable_irq(adapter->pdev->irq); + e1000_intr(adapter->pdev->irq, netdev); ++ ++ for (i = 0; i < adapter->num_tx_queues ; i++ ) ++ e1000_clean_tx_irq(adapter, &adapter->tx_ring[i]); ++#ifndef CONFIG_E1000_NAPI ++ for (i = 0; i < adapter->num_rx_queues ; i++ ) ++ adapter->clean_rx(adapter, &adapter->rx_ring[i]); ++#endif + enable_irq(adapter->pdev->irq); + } + #endif + ++#ifdef HAVE_PCI_ERS + /** + * e1000_io_error_detected - called when PCI error is detected + * @pdev: Pointer to PCI device +- * @state: The current pci conneection state ++ * @state: The current pci connection state + * + * This function is called after a PCI bus error affecting + * this device has been detected. + */ + static pci_ers_result_t e1000_io_error_detected(struct pci_dev *pdev, +- pci_channel_state_t state) +-{ +- struct net_device *netdev = pci_get_drvdata(pdev); +- struct e1000_adapter *adapter = netdev->priv; ++ pci_channel_state_t state) ++{ ++ struct net_device *netdev = pci_get_drvdata(pdev); ++ struct e1000_adapter *adapter = netdev_priv(netdev); + + netif_device_detach(netdev); + +@@ -5183,15 +4928,9 @@ + static pci_ers_result_t e1000_io_slot_reset(struct pci_dev *pdev) + { + struct net_device *netdev = pci_get_drvdata(pdev); +- struct e1000_adapter *adapter = netdev->priv; +- struct e1000_hw *hw = &adapter->hw; +- int err; +- +- if (adapter->need_ioport) +- err = pci_enable_device(pdev); +- else +- err = pci_enable_device_mem(pdev); +- if (err) { ++ struct e1000_adapter *adapter = netdev_priv(netdev); ++ ++ if (pci_enable_device(pdev)) { + printk(KERN_ERR "e1000: Cannot re-enable PCI device after reset.\n"); + return PCI_ERS_RESULT_DISCONNECT; + } +@@ -5201,7 +4940,7 @@ + pci_enable_wake(pdev, PCI_D3cold, 0); + + e1000_reset(adapter); +- ew32(WUS, ~0); ++ E1000_WRITE_REG(&adapter->hw, E1000_WUS, ~0); + + return PCI_ERS_RESULT_RECOVERED; + } +@@ -5217,8 +4956,7 @@ + static void e1000_io_resume(struct pci_dev *pdev) + { + struct net_device *netdev = pci_get_drvdata(pdev); +- struct e1000_adapter *adapter = netdev->priv; +- struct e1000_hw *hw = &adapter->hw; ++ struct e1000_adapter *adapter = netdev_priv(netdev); + + e1000_init_manageability(adapter); + +@@ -5230,15 +4968,7 @@ + } + + netif_device_attach(netdev); +- +- /* If the controller is 82573 and f/w is AMT, do not set +- * DRV_LOAD until the interface is up. For all other cases, +- * let the f/w know that the h/w is now under the control +- * of the driver. */ +- if (hw->mac_type != e1000_82573 || +- !e1000_check_mng_mode(hw)) +- e1000_get_hw_control(adapter); +- +-} ++} ++#endif /* HAVE_PCI_ERS */ + + /* e1000_main.c */ +diff -r d03036c09699 drivers/net/e1000/e1000_manage.c +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/e1000/e1000_manage.c Mon Jun 15 11:43:11 2009 +0100 +@@ -0,0 +1,384 @@ ++/******************************************************************************* ++ ++ Intel PRO/1000 Linux driver ++ Copyright(c) 1999 - 2008 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ Linux NICS ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++#include "e1000_api.h" ++ ++static u8 e1000_calculate_checksum(u8 *buffer, u32 length); ++ ++/** ++ * e1000_calculate_checksum - Calculate checksum for buffer ++ * @buffer: pointer to EEPROM ++ * @length: size of EEPROM to calculate a checksum for ++ * ++ * Calculates the checksum for some buffer on a specified length. The ++ * checksum calculated is returned. ++ **/ ++static u8 e1000_calculate_checksum(u8 *buffer, u32 length) ++{ ++ u32 i; ++ u8 sum = 0; ++ ++ DEBUGFUNC("e1000_calculate_checksum"); ++ ++ if (!buffer) ++ return 0; ++ ++ for (i = 0; i < length; i++) ++ sum += buffer[i]; ++ ++ return (u8) (0 - sum); ++} ++ ++/** ++ * e1000_mng_enable_host_if_generic - Checks host interface is enabled ++ * @hw: pointer to the HW structure ++ * ++ * Returns E1000_success upon success, else E1000_ERR_HOST_INTERFACE_COMMAND ++ * ++ * This function checks whether the HOST IF is enabled for command operation ++ * and also checks whether the previous command is completed. It busy waits ++ * in case of previous command is not completed. ++ **/ ++s32 e1000_mng_enable_host_if_generic(struct e1000_hw *hw) ++{ ++ u32 hicr; ++ s32 ret_val = E1000_SUCCESS; ++ u8 i; ++ ++ DEBUGFUNC("e1000_mng_enable_host_if_generic"); ++ ++ /* Check that the host interface is enabled. */ ++ hicr = E1000_READ_REG(hw, E1000_HICR); ++ if ((hicr & E1000_HICR_EN) == 0) { ++ DEBUGOUT("E1000_HOST_EN bit disabled.\n"); ++ ret_val = -E1000_ERR_HOST_INTERFACE_COMMAND; ++ goto out; ++ } ++ /* check the previous command is completed */ ++ for (i = 0; i < E1000_MNG_DHCP_COMMAND_TIMEOUT; i++) { ++ hicr = E1000_READ_REG(hw, E1000_HICR); ++ if (!(hicr & E1000_HICR_C)) ++ break; ++ msec_delay_irq(1); ++ } ++ ++ if (i == E1000_MNG_DHCP_COMMAND_TIMEOUT) { ++ DEBUGOUT("Previous command timeout failed .\n"); ++ ret_val = -E1000_ERR_HOST_INTERFACE_COMMAND; ++ goto out; ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_check_mng_mode_generic - Generic check management mode ++ * @hw: pointer to the HW structure ++ * ++ * Reads the firmware semaphore register and returns true (>0) if ++ * manageability is enabled, else false (0). ++ **/ ++bool e1000_check_mng_mode_generic(struct e1000_hw *hw) ++{ ++ u32 fwsm; ++ ++ DEBUGFUNC("e1000_check_mng_mode_generic"); ++ ++ fwsm = E1000_READ_REG(hw, E1000_FWSM); ++ ++ return (fwsm & E1000_FWSM_MODE_MASK) == ++ (E1000_MNG_IAMT_MODE << E1000_FWSM_MODE_SHIFT); ++} ++ ++/** ++ * e1000_enable_tx_pkt_filtering_generic - Enable packet filtering on TX ++ * @hw: pointer to the HW structure ++ * ++ * Enables packet filtering on transmit packets if manageability is enabled ++ * and host interface is enabled. ++ **/ ++bool e1000_enable_tx_pkt_filtering_generic(struct e1000_hw *hw) ++{ ++ struct e1000_host_mng_dhcp_cookie *hdr = &hw->mng_cookie; ++ u32 *buffer = (u32 *)&hw->mng_cookie; ++ u32 offset; ++ s32 ret_val, hdr_csum, csum; ++ u8 i, len; ++ bool tx_filter = true; ++ ++ DEBUGFUNC("e1000_enable_tx_pkt_filtering_generic"); ++ ++ /* No manageability, no filtering */ ++ if (!hw->mac.ops.check_mng_mode(hw)) { ++ tx_filter = false; ++ goto out; ++ } ++ ++ /* ++ * If we can't read from the host interface for whatever ++ * reason, disable filtering. ++ */ ++ ret_val = hw->mac.ops.mng_enable_host_if(hw); ++ if (ret_val != E1000_SUCCESS) { ++ tx_filter = false; ++ goto out; ++ } ++ ++ /* Read in the header. Length and offset are in dwords. */ ++ len = E1000_MNG_DHCP_COOKIE_LENGTH >> 2; ++ offset = E1000_MNG_DHCP_COOKIE_OFFSET >> 2; ++ for (i = 0; i < len; i++) { ++ *(buffer + i) = E1000_READ_REG_ARRAY_DWORD(hw, ++ E1000_HOST_IF, ++ offset + i); ++ } ++ hdr_csum = hdr->checksum; ++ hdr->checksum = 0; ++ csum = e1000_calculate_checksum((u8 *)hdr, ++ E1000_MNG_DHCP_COOKIE_LENGTH); ++ /* ++ * If either the checksums or signature don't match, then ++ * the cookie area isn't considered valid, in which case we ++ * take the safe route of assuming Tx filtering is enabled. ++ */ ++ if (hdr_csum != csum) ++ goto out; ++ if (hdr->signature != E1000_IAMT_SIGNATURE) ++ goto out; ++ ++ /* Cookie area is valid, make the final check for filtering. */ ++ if (!(hdr->status & E1000_MNG_DHCP_COOKIE_STATUS_PARSING)) ++ tx_filter = false; ++ ++out: ++ hw->mac.tx_pkt_filtering = tx_filter; ++ return tx_filter; ++} ++ ++/** ++ * e1000_mng_write_dhcp_info_generic - Writes DHCP info to host interface ++ * @hw: pointer to the HW structure ++ * @buffer: pointer to the host interface ++ * @length: size of the buffer ++ * ++ * Writes the DHCP information to the host interface. ++ **/ ++s32 e1000_mng_write_dhcp_info_generic(struct e1000_hw *hw, u8 *buffer, ++ u16 length) ++{ ++ struct e1000_host_mng_command_header hdr; ++ s32 ret_val; ++ u32 hicr; ++ ++ DEBUGFUNC("e1000_mng_write_dhcp_info_generic"); ++ ++ hdr.command_id = E1000_MNG_DHCP_TX_PAYLOAD_CMD; ++ hdr.command_length = length; ++ hdr.reserved1 = 0; ++ hdr.reserved2 = 0; ++ hdr.checksum = 0; ++ ++ /* Enable the host interface */ ++ ret_val = hw->mac.ops.mng_enable_host_if(hw); ++ if (ret_val) ++ goto out; ++ ++ /* Populate the host interface with the contents of "buffer". */ ++ ret_val = hw->mac.ops.mng_host_if_write(hw, buffer, length, ++ sizeof(hdr), &(hdr.checksum)); ++ if (ret_val) ++ goto out; ++ ++ /* Write the manageability command header */ ++ ret_val = hw->mac.ops.mng_write_cmd_header(hw, &hdr); ++ if (ret_val) ++ goto out; ++ ++ /* Tell the ARC a new command is pending. */ ++ hicr = E1000_READ_REG(hw, E1000_HICR); ++ E1000_WRITE_REG(hw, E1000_HICR, hicr | E1000_HICR_C); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_mng_write_cmd_header_generic - Writes manageability command header ++ * @hw: pointer to the HW structure ++ * @hdr: pointer to the host interface command header ++ * ++ * Writes the command header after does the checksum calculation. ++ **/ ++s32 e1000_mng_write_cmd_header_generic(struct e1000_hw *hw, ++ struct e1000_host_mng_command_header *hdr) ++{ ++ u16 i, length = sizeof(struct e1000_host_mng_command_header); ++ ++ DEBUGFUNC("e1000_mng_write_cmd_header_generic"); ++ ++ /* Write the whole command header structure with new checksum. */ ++ ++ hdr->checksum = e1000_calculate_checksum((u8 *)hdr, length); ++ ++ length >>= 2; ++ /* Write the relevant command block into the ram area. */ ++ for (i = 0; i < length; i++) { ++ E1000_WRITE_REG_ARRAY_DWORD(hw, E1000_HOST_IF, i, ++ *((u32 *) hdr + i)); ++ E1000_WRITE_FLUSH(hw); ++ } ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_mng_host_if_write_generic - Write to the manageability host interface ++ * @hw: pointer to the HW structure ++ * @buffer: pointer to the host interface buffer ++ * @length: size of the buffer ++ * @offset: location in the buffer to write to ++ * @sum: sum of the data (not checksum) ++ * ++ * This function writes the buffer content at the offset given on the host if. ++ * It also does alignment considerations to do the writes in most efficient ++ * way. Also fills up the sum of the buffer in *buffer parameter. ++ **/ ++s32 e1000_mng_host_if_write_generic(struct e1000_hw *hw, u8 *buffer, ++ u16 length, u16 offset, u8 *sum) ++{ ++ u8 *tmp; ++ u8 *bufptr = buffer; ++ u32 data = 0; ++ s32 ret_val = E1000_SUCCESS; ++ u16 remaining, i, j, prev_bytes; ++ ++ DEBUGFUNC("e1000_mng_host_if_write_generic"); ++ ++ /* sum = only sum of the data and it is not checksum */ ++ ++ if (length == 0 || offset + length > E1000_HI_MAX_MNG_DATA_LENGTH) { ++ ret_val = -E1000_ERR_PARAM; ++ goto out; ++ } ++ ++ tmp = (u8 *)&data; ++ prev_bytes = offset & 0x3; ++ offset >>= 2; ++ ++ if (prev_bytes) { ++ data = E1000_READ_REG_ARRAY_DWORD(hw, E1000_HOST_IF, offset); ++ for (j = prev_bytes; j < sizeof(u32); j++) { ++ *(tmp + j) = *bufptr++; ++ *sum += *(tmp + j); ++ } ++ E1000_WRITE_REG_ARRAY_DWORD(hw, E1000_HOST_IF, offset, data); ++ length -= j - prev_bytes; ++ offset++; ++ } ++ ++ remaining = length & 0x3; ++ length -= remaining; ++ ++ /* Calculate length in DWORDs */ ++ length >>= 2; ++ ++ /* ++ * The device driver writes the relevant command block into the ++ * ram area. ++ */ ++ for (i = 0; i < length; i++) { ++ for (j = 0; j < sizeof(u32); j++) { ++ *(tmp + j) = *bufptr++; ++ *sum += *(tmp + j); ++ } ++ ++ E1000_WRITE_REG_ARRAY_DWORD(hw, E1000_HOST_IF, offset + i, ++ data); ++ } ++ if (remaining) { ++ for (j = 0; j < sizeof(u32); j++) { ++ if (j < remaining) ++ *(tmp + j) = *bufptr++; ++ else ++ *(tmp + j) = 0; ++ ++ *sum += *(tmp + j); ++ } ++ E1000_WRITE_REG_ARRAY_DWORD(hw, E1000_HOST_IF, offset + i, data); ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_enable_mng_pass_thru - Enable processing of ARP's ++ * @hw: pointer to the HW structure ++ * ++ * Verifies the hardware needs to allow ARPs to be processed by the host. ++ **/ ++bool e1000_enable_mng_pass_thru(struct e1000_hw *hw) ++{ ++ u32 manc; ++ u32 fwsm, factps; ++ bool ret_val = false; ++ ++ DEBUGFUNC("e1000_enable_mng_pass_thru"); ++ ++ if (!hw->mac.asf_firmware_present) ++ goto out; ++ ++ manc = E1000_READ_REG(hw, E1000_MANC); ++ ++ if (!(manc & E1000_MANC_RCV_TCO_EN) || ++ !(manc & E1000_MANC_EN_MAC_ADDR_FILTER)) ++ goto out; ++ ++ if (hw->mac.arc_subsystem_valid) { ++ fwsm = E1000_READ_REG(hw, E1000_FWSM); ++ factps = E1000_READ_REG(hw, E1000_FACTPS); ++ ++ if (!(factps & E1000_FACTPS_MNGCG) && ++ ((fwsm & E1000_FWSM_MODE_MASK) == ++ (e1000_mng_mode_pt << E1000_FWSM_MODE_SHIFT))) { ++ ret_val = true; ++ goto out; ++ } ++ } else { ++ if ((manc & E1000_MANC_SMBUS_EN) && ++ !(manc & E1000_MANC_ASF_EN)) { ++ ret_val = true; ++ goto out; ++ } ++ } ++ ++out: ++ return ret_val; ++} ++ +diff -r d03036c09699 drivers/net/e1000/e1000_manage.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/e1000/e1000_manage.h Mon Jun 15 11:43:11 2009 +0100 +@@ -0,0 +1,82 @@ ++/******************************************************************************* ++ ++ Intel PRO/1000 Linux driver ++ Copyright(c) 1999 - 2008 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ Linux NICS ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++#ifndef _E1000_MANAGE_H_ ++#define _E1000_MANAGE_H_ ++ ++bool e1000_check_mng_mode_generic(struct e1000_hw *hw); ++bool e1000_enable_tx_pkt_filtering_generic(struct e1000_hw *hw); ++s32 e1000_mng_enable_host_if_generic(struct e1000_hw *hw); ++s32 e1000_mng_host_if_write_generic(struct e1000_hw *hw, u8 *buffer, ++ u16 length, u16 offset, u8 *sum); ++s32 e1000_mng_write_cmd_header_generic(struct e1000_hw *hw, ++ struct e1000_host_mng_command_header *hdr); ++s32 e1000_mng_write_dhcp_info_generic(struct e1000_hw *hw, ++ u8 *buffer, u16 length); ++bool e1000_enable_mng_pass_thru(struct e1000_hw *hw); ++ ++enum e1000_mng_mode { ++ e1000_mng_mode_none = 0, ++ e1000_mng_mode_asf, ++ e1000_mng_mode_pt, ++ e1000_mng_mode_ipmi, ++ e1000_mng_mode_host_if_only ++}; ++ ++#define E1000_FACTPS_MNGCG 0x20000000 ++ ++#define E1000_FWSM_MODE_MASK 0xE ++#define E1000_FWSM_MODE_SHIFT 1 ++ ++#define E1000_MNG_IAMT_MODE 0x3 ++#define E1000_MNG_DHCP_COOKIE_LENGTH 0x10 ++#define E1000_MNG_DHCP_COOKIE_OFFSET 0x6F0 ++#define E1000_MNG_DHCP_COMMAND_TIMEOUT 10 ++#define E1000_MNG_DHCP_TX_PAYLOAD_CMD 64 ++#define E1000_MNG_DHCP_COOKIE_STATUS_PARSING 0x1 ++#define E1000_MNG_DHCP_COOKIE_STATUS_VLAN 0x2 ++ ++#define E1000_VFTA_ENTRY_SHIFT 5 ++#define E1000_VFTA_ENTRY_MASK 0x7F ++#define E1000_VFTA_ENTRY_BIT_SHIFT_MASK 0x1F ++ ++#define E1000_HI_MAX_BLOCK_BYTE_LENGTH 1792 /* Num of bytes in range */ ++#define E1000_HI_MAX_BLOCK_DWORD_LENGTH 448 /* Num of dwords in range */ ++#define E1000_HI_COMMAND_TIMEOUT 500 /* Process HI command limit */ ++ ++#define E1000_HICR_EN 0x01 /* Enable bit - RO */ ++/* Driver sets this bit when done to put command in RAM */ ++#define E1000_HICR_C 0x02 ++#define E1000_HICR_SV 0x04 /* Status Validity */ ++#define E1000_HICR_FW_RESET_ENABLE 0x40 ++#define E1000_HICR_FW_RESET 0x80 ++ ++/* Intel(R) Active Management Technology signature */ ++#define E1000_IAMT_SIGNATURE 0x544D4149 ++ ++#endif +diff -r d03036c09699 drivers/net/e1000/e1000_nvm.c +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/e1000/e1000_nvm.c Mon Jun 15 11:43:11 2009 +0100 +@@ -0,0 +1,919 @@ ++/******************************************************************************* ++ ++ Intel PRO/1000 Linux driver ++ Copyright(c) 1999 - 2008 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ Linux NICS ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++#include "e1000_api.h" ++ ++static void e1000_reload_nvm_generic(struct e1000_hw *hw); ++ ++/** ++ * e1000_init_nvm_ops_generic - Initialize NVM function pointers ++ * @hw: pointer to the HW structure ++ * ++ * Setups up the function pointers to no-op functions ++ **/ ++void e1000_init_nvm_ops_generic(struct e1000_hw *hw) ++{ ++ struct e1000_nvm_info *nvm = &hw->nvm; ++ DEBUGFUNC("e1000_init_nvm_ops_generic"); ++ ++ /* Initialize function pointers */ ++ nvm->ops.init_params = e1000_null_ops_generic; ++ nvm->ops.acquire = e1000_null_ops_generic; ++ nvm->ops.read = e1000_null_read_nvm; ++ nvm->ops.release = e1000_null_nvm_generic; ++ nvm->ops.reload = e1000_reload_nvm_generic; ++ nvm->ops.update = e1000_null_ops_generic; ++ nvm->ops.valid_led_default = e1000_null_led_default; ++ nvm->ops.validate = e1000_null_ops_generic; ++ nvm->ops.write = e1000_null_write_nvm; ++} ++ ++/** ++ * e1000_null_nvm_read - No-op function, return 0 ++ * @hw: pointer to the HW structure ++ **/ ++s32 e1000_null_read_nvm(struct e1000_hw *hw, u16 a, u16 b, u16 *c) ++{ ++ DEBUGFUNC("e1000_null_read_nvm"); ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_null_nvm_generic - No-op function, return void ++ * @hw: pointer to the HW structure ++ **/ ++void e1000_null_nvm_generic(struct e1000_hw *hw) ++{ ++ DEBUGFUNC("e1000_null_nvm_generic"); ++ return; ++} ++ ++/** ++ * e1000_null_led_default - No-op function, return 0 ++ * @hw: pointer to the HW structure ++ **/ ++s32 e1000_null_led_default(struct e1000_hw *hw, u16 *data) ++{ ++ DEBUGFUNC("e1000_null_led_default"); ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_null_write_nvm - No-op function, return 0 ++ * @hw: pointer to the HW structure ++ **/ ++s32 e1000_null_write_nvm(struct e1000_hw *hw, u16 a, u16 b, u16 *c) ++{ ++ DEBUGFUNC("e1000_null_write_nvm"); ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_raise_eec_clk - Raise EEPROM clock ++ * @hw: pointer to the HW structure ++ * @eecd: pointer to the EEPROM ++ * ++ * Enable/Raise the EEPROM clock bit. ++ **/ ++static void e1000_raise_eec_clk(struct e1000_hw *hw, u32 *eecd) ++{ ++ *eecd = *eecd | E1000_EECD_SK; ++ E1000_WRITE_REG(hw, E1000_EECD, *eecd); ++ E1000_WRITE_FLUSH(hw); ++ usec_delay(hw->nvm.delay_usec); ++} ++ ++/** ++ * e1000_lower_eec_clk - Lower EEPROM clock ++ * @hw: pointer to the HW structure ++ * @eecd: pointer to the EEPROM ++ * ++ * Clear/Lower the EEPROM clock bit. ++ **/ ++static void e1000_lower_eec_clk(struct e1000_hw *hw, u32 *eecd) ++{ ++ *eecd = *eecd & ~E1000_EECD_SK; ++ E1000_WRITE_REG(hw, E1000_EECD, *eecd); ++ E1000_WRITE_FLUSH(hw); ++ usec_delay(hw->nvm.delay_usec); ++} ++ ++/** ++ * e1000_shift_out_eec_bits - Shift data bits our to the EEPROM ++ * @hw: pointer to the HW structure ++ * @data: data to send to the EEPROM ++ * @count: number of bits to shift out ++ * ++ * We need to shift 'count' bits out to the EEPROM. So, the value in the ++ * "data" parameter will be shifted out to the EEPROM one bit at a time. ++ * In order to do this, "data" must be broken down into bits. ++ **/ ++static void e1000_shift_out_eec_bits(struct e1000_hw *hw, u16 data, u16 count) ++{ ++ struct e1000_nvm_info *nvm = &hw->nvm; ++ u32 eecd = E1000_READ_REG(hw, E1000_EECD); ++ u32 mask; ++ ++ DEBUGFUNC("e1000_shift_out_eec_bits"); ++ ++ mask = 0x01 << (count - 1); ++ if (nvm->type == e1000_nvm_eeprom_microwire) ++ eecd &= ~E1000_EECD_DO; ++ else ++ if (nvm->type == e1000_nvm_eeprom_spi) ++ eecd |= E1000_EECD_DO; ++ ++ do { ++ eecd &= ~E1000_EECD_DI; ++ ++ if (data & mask) ++ eecd |= E1000_EECD_DI; ++ ++ E1000_WRITE_REG(hw, E1000_EECD, eecd); ++ E1000_WRITE_FLUSH(hw); ++ ++ usec_delay(nvm->delay_usec); ++ ++ e1000_raise_eec_clk(hw, &eecd); ++ e1000_lower_eec_clk(hw, &eecd); ++ ++ mask >>= 1; ++ } while (mask); ++ ++ eecd &= ~E1000_EECD_DI; ++ E1000_WRITE_REG(hw, E1000_EECD, eecd); ++} ++ ++/** ++ * e1000_shift_in_eec_bits - Shift data bits in from the EEPROM ++ * @hw: pointer to the HW structure ++ * @count: number of bits to shift in ++ * ++ * In order to read a register from the EEPROM, we need to shift 'count' bits ++ * in from the EEPROM. Bits are "shifted in" by raising the clock input to ++ * the EEPROM (setting the SK bit), and then reading the value of the data out ++ * "DO" bit. During this "shifting in" process the data in "DI" bit should ++ * always be clear. ++ **/ ++static u16 e1000_shift_in_eec_bits(struct e1000_hw *hw, u16 count) ++{ ++ u32 eecd; ++ u32 i; ++ u16 data; ++ ++ DEBUGFUNC("e1000_shift_in_eec_bits"); ++ ++ eecd = E1000_READ_REG(hw, E1000_EECD); ++ ++ eecd &= ~(E1000_EECD_DO | E1000_EECD_DI); ++ data = 0; ++ ++ for (i = 0; i < count; i++) { ++ data <<= 1; ++ e1000_raise_eec_clk(hw, &eecd); ++ ++ eecd = E1000_READ_REG(hw, E1000_EECD); ++ ++ eecd &= ~E1000_EECD_DI; ++ if (eecd & E1000_EECD_DO) ++ data |= 1; ++ ++ e1000_lower_eec_clk(hw, &eecd); ++ } ++ ++ return data; ++} ++ ++/** ++ * e1000_poll_eerd_eewr_done - Poll for EEPROM read/write completion ++ * @hw: pointer to the HW structure ++ * @ee_reg: EEPROM flag for polling ++ * ++ * Polls the EEPROM status bit for either read or write completion based ++ * upon the value of 'ee_reg'. ++ **/ ++s32 e1000_poll_eerd_eewr_done(struct e1000_hw *hw, int ee_reg) ++{ ++ u32 attempts = 100000; ++ u32 i, reg = 0; ++ s32 ret_val = -E1000_ERR_NVM; ++ ++ DEBUGFUNC("e1000_poll_eerd_eewr_done"); ++ ++ for (i = 0; i < attempts; i++) { ++ if (ee_reg == E1000_NVM_POLL_READ) ++ reg = E1000_READ_REG(hw, E1000_EERD); ++ else ++ reg = E1000_READ_REG(hw, E1000_EEWR); ++ ++ if (reg & E1000_NVM_RW_REG_DONE) { ++ ret_val = E1000_SUCCESS; ++ break; ++ } ++ ++ usec_delay(5); ++ } ++ ++ return ret_val; ++} ++ ++/** ++ * e1000_acquire_nvm_generic - Generic request for access to EEPROM ++ * @hw: pointer to the HW structure ++ * ++ * Set the EEPROM access request bit and wait for EEPROM access grant bit. ++ * Return successful if access grant bit set, else clear the request for ++ * EEPROM access and return -E1000_ERR_NVM (-1). ++ **/ ++s32 e1000_acquire_nvm_generic(struct e1000_hw *hw) ++{ ++ u32 eecd = E1000_READ_REG(hw, E1000_EECD); ++ s32 timeout = E1000_NVM_GRANT_ATTEMPTS; ++ s32 ret_val = E1000_SUCCESS; ++ ++ DEBUGFUNC("e1000_acquire_nvm_generic"); ++ ++ E1000_WRITE_REG(hw, E1000_EECD, eecd | E1000_EECD_REQ); ++ eecd = E1000_READ_REG(hw, E1000_EECD); ++ ++ while (timeout) { ++ if (eecd & E1000_EECD_GNT) ++ break; ++ usec_delay(5); ++ eecd = E1000_READ_REG(hw, E1000_EECD); ++ timeout--; ++ } ++ ++ if (!timeout) { ++ eecd &= ~E1000_EECD_REQ; ++ E1000_WRITE_REG(hw, E1000_EECD, eecd); ++ DEBUGOUT("Could not acquire NVM grant\n"); ++ ret_val = -E1000_ERR_NVM; ++ } ++ ++ return ret_val; ++} ++ ++/** ++ * e1000_standby_nvm - Return EEPROM to standby state ++ * @hw: pointer to the HW structure ++ * ++ * Return the EEPROM to a standby state. ++ **/ ++static void e1000_standby_nvm(struct e1000_hw *hw) ++{ ++ struct e1000_nvm_info *nvm = &hw->nvm; ++ u32 eecd = E1000_READ_REG(hw, E1000_EECD); ++ ++ DEBUGFUNC("e1000_standby_nvm"); ++ ++ if (nvm->type == e1000_nvm_eeprom_microwire) { ++ eecd &= ~(E1000_EECD_CS | E1000_EECD_SK); ++ E1000_WRITE_REG(hw, E1000_EECD, eecd); ++ E1000_WRITE_FLUSH(hw); ++ usec_delay(nvm->delay_usec); ++ ++ e1000_raise_eec_clk(hw, &eecd); ++ ++ /* Select EEPROM */ ++ eecd |= E1000_EECD_CS; ++ E1000_WRITE_REG(hw, E1000_EECD, eecd); ++ E1000_WRITE_FLUSH(hw); ++ usec_delay(nvm->delay_usec); ++ ++ e1000_lower_eec_clk(hw, &eecd); ++ } else ++ if (nvm->type == e1000_nvm_eeprom_spi) { ++ /* Toggle CS to flush commands */ ++ eecd |= E1000_EECD_CS; ++ E1000_WRITE_REG(hw, E1000_EECD, eecd); ++ E1000_WRITE_FLUSH(hw); ++ usec_delay(nvm->delay_usec); ++ eecd &= ~E1000_EECD_CS; ++ E1000_WRITE_REG(hw, E1000_EECD, eecd); ++ E1000_WRITE_FLUSH(hw); ++ usec_delay(nvm->delay_usec); ++ } ++} ++ ++/** ++ * e1000_stop_nvm - Terminate EEPROM command ++ * @hw: pointer to the HW structure ++ * ++ * Terminates the current command by inverting the EEPROM's chip select pin. ++ **/ ++void e1000_stop_nvm(struct e1000_hw *hw) ++{ ++ u32 eecd; ++ ++ DEBUGFUNC("e1000_stop_nvm"); ++ ++ eecd = E1000_READ_REG(hw, E1000_EECD); ++ if (hw->nvm.type == e1000_nvm_eeprom_spi) { ++ /* Pull CS high */ ++ eecd |= E1000_EECD_CS; ++ e1000_lower_eec_clk(hw, &eecd); ++ } else if (hw->nvm.type == e1000_nvm_eeprom_microwire) { ++ /* CS on Microwire is active-high */ ++ eecd &= ~(E1000_EECD_CS | E1000_EECD_DI); ++ E1000_WRITE_REG(hw, E1000_EECD, eecd); ++ e1000_raise_eec_clk(hw, &eecd); ++ e1000_lower_eec_clk(hw, &eecd); ++ } ++} ++ ++/** ++ * e1000_release_nvm_generic - Release exclusive access to EEPROM ++ * @hw: pointer to the HW structure ++ * ++ * Stop any current commands to the EEPROM and clear the EEPROM request bit. ++ **/ ++void e1000_release_nvm_generic(struct e1000_hw *hw) ++{ ++ u32 eecd; ++ ++ DEBUGFUNC("e1000_release_nvm_generic"); ++ ++ e1000_stop_nvm(hw); ++ ++ eecd = E1000_READ_REG(hw, E1000_EECD); ++ eecd &= ~E1000_EECD_REQ; ++ E1000_WRITE_REG(hw, E1000_EECD, eecd); ++} ++ ++/** ++ * e1000_ready_nvm_eeprom - Prepares EEPROM for read/write ++ * @hw: pointer to the HW structure ++ * ++ * Setups the EEPROM for reading and writing. ++ **/ ++static s32 e1000_ready_nvm_eeprom(struct e1000_hw *hw) ++{ ++ struct e1000_nvm_info *nvm = &hw->nvm; ++ u32 eecd = E1000_READ_REG(hw, E1000_EECD); ++ s32 ret_val = E1000_SUCCESS; ++ u16 timeout = 0; ++ u8 spi_stat_reg; ++ ++ DEBUGFUNC("e1000_ready_nvm_eeprom"); ++ ++ if (nvm->type == e1000_nvm_eeprom_microwire) { ++ /* Clear SK and DI */ ++ eecd &= ~(E1000_EECD_DI | E1000_EECD_SK); ++ E1000_WRITE_REG(hw, E1000_EECD, eecd); ++ /* Set CS */ ++ eecd |= E1000_EECD_CS; ++ E1000_WRITE_REG(hw, E1000_EECD, eecd); ++ } else ++ if (nvm->type == e1000_nvm_eeprom_spi) { ++ /* Clear SK and CS */ ++ eecd &= ~(E1000_EECD_CS | E1000_EECD_SK); ++ E1000_WRITE_REG(hw, E1000_EECD, eecd); ++ usec_delay(1); ++ timeout = NVM_MAX_RETRY_SPI; ++ ++ /* ++ * Read "Status Register" repeatedly until the LSB is cleared. ++ * The EEPROM will signal that the command has been completed ++ * by clearing bit 0 of the internal status register. If it's ++ * not cleared within 'timeout', then error out. ++ */ ++ while (timeout) { ++ e1000_shift_out_eec_bits(hw, NVM_RDSR_OPCODE_SPI, ++ hw->nvm.opcode_bits); ++ spi_stat_reg = (u8)e1000_shift_in_eec_bits(hw, 8); ++ if (!(spi_stat_reg & NVM_STATUS_RDY_SPI)) ++ break; ++ ++ usec_delay(5); ++ e1000_standby_nvm(hw); ++ timeout--; ++ } ++ ++ if (!timeout) { ++ DEBUGOUT("SPI NVM Status error\n"); ++ ret_val = -E1000_ERR_NVM; ++ goto out; ++ } ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_read_nvm_spi - Read EEPROM's using SPI ++ * @hw: pointer to the HW structure ++ * @offset: offset of word in the EEPROM to read ++ * @words: number of words to read ++ * @data: word read from the EEPROM ++ * ++ * Reads a 16 bit word from the EEPROM. ++ **/ ++s32 e1000_read_nvm_spi(struct e1000_hw *hw, u16 offset, u16 words, u16 *data) ++{ ++ struct e1000_nvm_info *nvm = &hw->nvm; ++ u32 i = 0; ++ s32 ret_val; ++ u16 word_in; ++ u8 read_opcode = NVM_READ_OPCODE_SPI; ++ ++ DEBUGFUNC("e1000_read_nvm_spi"); ++ ++ /* ++ * A check for invalid values: offset too large, too many words, ++ * and not enough words. ++ */ ++ if ((offset >= nvm->word_size) || (words > (nvm->word_size - offset)) || ++ (words == 0)) { ++ DEBUGOUT("nvm parameter(s) out of bounds\n"); ++ ret_val = -E1000_ERR_NVM; ++ goto out; ++ } ++ ++ ret_val = nvm->ops.acquire(hw); ++ if (ret_val) ++ goto out; ++ ++ ret_val = e1000_ready_nvm_eeprom(hw); ++ if (ret_val) ++ goto release; ++ ++ e1000_standby_nvm(hw); ++ ++ if ((nvm->address_bits == 8) && (offset >= 128)) ++ read_opcode |= NVM_A8_OPCODE_SPI; ++ ++ /* Send the READ command (opcode + addr) */ ++ e1000_shift_out_eec_bits(hw, read_opcode, nvm->opcode_bits); ++ e1000_shift_out_eec_bits(hw, (u16)(offset*2), nvm->address_bits); ++ ++ /* ++ * Read the data. SPI NVMs increment the address with each byte ++ * read and will roll over if reading beyond the end. This allows ++ * us to read the whole NVM from any offset ++ */ ++ for (i = 0; i < words; i++) { ++ word_in = e1000_shift_in_eec_bits(hw, 16); ++ data[i] = (word_in >> 8) | (word_in << 8); ++ } ++ ++release: ++ nvm->ops.release(hw); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_read_nvm_microwire - Reads EEPROM's using microwire ++ * @hw: pointer to the HW structure ++ * @offset: offset of word in the EEPROM to read ++ * @words: number of words to read ++ * @data: word read from the EEPROM ++ * ++ * Reads a 16 bit word from the EEPROM. ++ **/ ++s32 e1000_read_nvm_microwire(struct e1000_hw *hw, u16 offset, u16 words, ++ u16 *data) ++{ ++ struct e1000_nvm_info *nvm = &hw->nvm; ++ u32 i = 0; ++ s32 ret_val; ++ u8 read_opcode = NVM_READ_OPCODE_MICROWIRE; ++ ++ DEBUGFUNC("e1000_read_nvm_microwire"); ++ ++ /* ++ * A check for invalid values: offset too large, too many words, ++ * and not enough words. ++ */ ++ if ((offset >= nvm->word_size) || (words > (nvm->word_size - offset)) || ++ (words == 0)) { ++ DEBUGOUT("nvm parameter(s) out of bounds\n"); ++ ret_val = -E1000_ERR_NVM; ++ goto out; ++ } ++ ++ ret_val = nvm->ops.acquire(hw); ++ if (ret_val) ++ goto out; ++ ++ ret_val = e1000_ready_nvm_eeprom(hw); ++ if (ret_val) ++ goto release; ++ ++ for (i = 0; i < words; i++) { ++ /* Send the READ command (opcode + addr) */ ++ e1000_shift_out_eec_bits(hw, read_opcode, nvm->opcode_bits); ++ e1000_shift_out_eec_bits(hw, (u16)(offset + i), ++ nvm->address_bits); ++ ++ /* ++ * Read the data. For microwire, each word requires the ++ * overhead of setup and tear-down. ++ */ ++ data[i] = e1000_shift_in_eec_bits(hw, 16); ++ e1000_standby_nvm(hw); ++ } ++ ++release: ++ nvm->ops.release(hw); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_read_nvm_eerd - Reads EEPROM using EERD register ++ * @hw: pointer to the HW structure ++ * @offset: offset of word in the EEPROM to read ++ * @words: number of words to read ++ * @data: word read from the EEPROM ++ * ++ * Reads a 16 bit word from the EEPROM using the EERD register. ++ **/ ++s32 e1000_read_nvm_eerd(struct e1000_hw *hw, u16 offset, u16 words, u16 *data) ++{ ++ struct e1000_nvm_info *nvm = &hw->nvm; ++ u32 i, eerd = 0; ++ s32 ret_val = E1000_SUCCESS; ++ ++ DEBUGFUNC("e1000_read_nvm_eerd"); ++ ++ /* ++ * A check for invalid values: offset too large, too many words, ++ * too many words for the offset, and not enough words. ++ */ ++ if ((offset >= nvm->word_size) || (words > (nvm->word_size - offset)) || ++ (words == 0)) { ++ DEBUGOUT("nvm parameter(s) out of bounds\n"); ++ ret_val = -E1000_ERR_NVM; ++ goto out; ++ } ++ ++ for (i = 0; i < words; i++) { ++ eerd = ((offset+i) << E1000_NVM_RW_ADDR_SHIFT) + ++ E1000_NVM_RW_REG_START; ++ ++ E1000_WRITE_REG(hw, E1000_EERD, eerd); ++ ret_val = e1000_poll_eerd_eewr_done(hw, E1000_NVM_POLL_READ); ++ if (ret_val) ++ break; ++ ++ data[i] = (E1000_READ_REG(hw, E1000_EERD) >> ++ E1000_NVM_RW_REG_DATA); ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_write_nvm_spi - Write to EEPROM using SPI ++ * @hw: pointer to the HW structure ++ * @offset: offset within the EEPROM to be written to ++ * @words: number of words to write ++ * @data: 16 bit word(s) to be written to the EEPROM ++ * ++ * Writes data to EEPROM at offset using SPI interface. ++ * ++ * If e1000_update_nvm_checksum is not called after this function , the ++ * EEPROM will most likely contain an invalid checksum. ++ **/ ++s32 e1000_write_nvm_spi(struct e1000_hw *hw, u16 offset, u16 words, u16 *data) ++{ ++ struct e1000_nvm_info *nvm = &hw->nvm; ++ s32 ret_val; ++ u16 widx = 0; ++ ++ DEBUGFUNC("e1000_write_nvm_spi"); ++ ++ /* ++ * A check for invalid values: offset too large, too many words, ++ * and not enough words. ++ */ ++ if ((offset >= nvm->word_size) || (words > (nvm->word_size - offset)) || ++ (words == 0)) { ++ DEBUGOUT("nvm parameter(s) out of bounds\n"); ++ ret_val = -E1000_ERR_NVM; ++ goto out; ++ } ++ ++ ret_val = nvm->ops.acquire(hw); ++ if (ret_val) ++ goto out; ++ ++ while (widx < words) { ++ u8 write_opcode = NVM_WRITE_OPCODE_SPI; ++ ++ ret_val = e1000_ready_nvm_eeprom(hw); ++ if (ret_val) ++ goto release; ++ ++ e1000_standby_nvm(hw); ++ ++ /* Send the WRITE ENABLE command (8 bit opcode) */ ++ e1000_shift_out_eec_bits(hw, NVM_WREN_OPCODE_SPI, ++ nvm->opcode_bits); ++ ++ e1000_standby_nvm(hw); ++ ++ /* ++ * Some SPI eeproms use the 8th address bit embedded in the ++ * opcode ++ */ ++ if ((nvm->address_bits == 8) && (offset >= 128)) ++ write_opcode |= NVM_A8_OPCODE_SPI; ++ ++ /* Send the Write command (8-bit opcode + addr) */ ++ e1000_shift_out_eec_bits(hw, write_opcode, nvm->opcode_bits); ++ e1000_shift_out_eec_bits(hw, (u16)((offset + widx) * 2), ++ nvm->address_bits); ++ ++ /* Loop to allow for up to whole page write of eeprom */ ++ while (widx < words) { ++ u16 word_out = data[widx]; ++ word_out = (word_out >> 8) | (word_out << 8); ++ e1000_shift_out_eec_bits(hw, word_out, 16); ++ widx++; ++ ++ if ((((offset + widx) * 2) % nvm->page_size) == 0) { ++ e1000_standby_nvm(hw); ++ break; ++ } ++ } ++ } ++ ++ msec_delay(10); ++release: ++ nvm->ops.release(hw); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_write_nvm_microwire - Writes EEPROM using microwire ++ * @hw: pointer to the HW structure ++ * @offset: offset within the EEPROM to be written to ++ * @words: number of words to write ++ * @data: 16 bit word(s) to be written to the EEPROM ++ * ++ * Writes data to EEPROM at offset using microwire interface. ++ * ++ * If e1000_update_nvm_checksum is not called after this function , the ++ * EEPROM will most likely contain an invalid checksum. ++ **/ ++s32 e1000_write_nvm_microwire(struct e1000_hw *hw, u16 offset, u16 words, ++ u16 *data) ++{ ++ struct e1000_nvm_info *nvm = &hw->nvm; ++ s32 ret_val; ++ u32 eecd; ++ u16 words_written = 0; ++ u16 widx = 0; ++ ++ DEBUGFUNC("e1000_write_nvm_microwire"); ++ ++ /* ++ * A check for invalid values: offset too large, too many words, ++ * and not enough words. ++ */ ++ if ((offset >= nvm->word_size) || (words > (nvm->word_size - offset)) || ++ (words == 0)) { ++ DEBUGOUT("nvm parameter(s) out of bounds\n"); ++ ret_val = -E1000_ERR_NVM; ++ goto out; ++ } ++ ++ ret_val = nvm->ops.acquire(hw); ++ if (ret_val) ++ goto out; ++ ++ ret_val = e1000_ready_nvm_eeprom(hw); ++ if (ret_val) ++ goto release; ++ ++ e1000_shift_out_eec_bits(hw, NVM_EWEN_OPCODE_MICROWIRE, ++ (u16)(nvm->opcode_bits + 2)); ++ ++ e1000_shift_out_eec_bits(hw, 0, (u16)(nvm->address_bits - 2)); ++ ++ e1000_standby_nvm(hw); ++ ++ while (words_written < words) { ++ e1000_shift_out_eec_bits(hw, NVM_WRITE_OPCODE_MICROWIRE, ++ nvm->opcode_bits); ++ ++ e1000_shift_out_eec_bits(hw, (u16)(offset + words_written), ++ nvm->address_bits); ++ ++ e1000_shift_out_eec_bits(hw, data[words_written], 16); ++ ++ e1000_standby_nvm(hw); ++ ++ for (widx = 0; widx < 200; widx++) { ++ eecd = E1000_READ_REG(hw, E1000_EECD); ++ if (eecd & E1000_EECD_DO) ++ break; ++ usec_delay(50); ++ } ++ ++ if (widx == 200) { ++ DEBUGOUT("NVM Write did not complete\n"); ++ ret_val = -E1000_ERR_NVM; ++ goto release; ++ } ++ ++ e1000_standby_nvm(hw); ++ ++ words_written++; ++ } ++ ++ e1000_shift_out_eec_bits(hw, NVM_EWDS_OPCODE_MICROWIRE, ++ (u16)(nvm->opcode_bits + 2)); ++ ++ e1000_shift_out_eec_bits(hw, 0, (u16)(nvm->address_bits - 2)); ++ ++release: ++ nvm->ops.release(hw); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_read_pba_num_generic - Read device part number ++ * @hw: pointer to the HW structure ++ * @pba_num: pointer to device part number ++ * ++ * Reads the product board assembly (PBA) number from the EEPROM and stores ++ * the value in pba_num. ++ **/ ++s32 e1000_read_pba_num_generic(struct e1000_hw *hw, u32 *pba_num) ++{ ++ s32 ret_val; ++ u16 nvm_data; ++ ++ DEBUGFUNC("e1000_read_pba_num_generic"); ++ ++ ret_val = hw->nvm.ops.read(hw, NVM_PBA_OFFSET_0, 1, &nvm_data); ++ if (ret_val) { ++ DEBUGOUT("NVM Read Error\n"); ++ goto out; ++ } ++ *pba_num = (u32)(nvm_data << 16); ++ ++ ret_val = hw->nvm.ops.read(hw, NVM_PBA_OFFSET_1, 1, &nvm_data); ++ if (ret_val) { ++ DEBUGOUT("NVM Read Error\n"); ++ goto out; ++ } ++ *pba_num |= nvm_data; ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_read_mac_addr_generic - Read device MAC address ++ * @hw: pointer to the HW structure ++ * ++ * Reads the device MAC address from the EEPROM and stores the value. ++ * Since devices with two ports use the same EEPROM, we increment the ++ * last bit in the MAC address for the second port. ++ **/ ++s32 e1000_read_mac_addr_generic(struct e1000_hw *hw) ++{ ++ u32 rar_high; ++ u32 rar_low; ++ u16 i; ++ ++ rar_high = E1000_READ_REG(hw, E1000_RAH(0)); ++ rar_low = E1000_READ_REG(hw, E1000_RAL(0)); ++ ++ for (i = 0; i < E1000_RAL_MAC_ADDR_LEN; i++) ++ hw->mac.perm_addr[i] = (u8)(rar_low >> (i*8)); ++ ++ for (i = 0; i < E1000_RAH_MAC_ADDR_LEN; i++) ++ hw->mac.perm_addr[i+4] = (u8)(rar_high >> (i*8)); ++ ++ for (i = 0; i < ETH_ADDR_LEN; i++) ++ hw->mac.addr[i] = hw->mac.perm_addr[i]; ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_validate_nvm_checksum_generic - Validate EEPROM checksum ++ * @hw: pointer to the HW structure ++ * ++ * Calculates the EEPROM checksum by reading/adding each word of the EEPROM ++ * and then verifies that the sum of the EEPROM is equal to 0xBABA. ++ **/ ++s32 e1000_validate_nvm_checksum_generic(struct e1000_hw *hw) ++{ ++ s32 ret_val = E1000_SUCCESS; ++ u16 checksum = 0; ++ u16 i, nvm_data; ++ ++ DEBUGFUNC("e1000_validate_nvm_checksum_generic"); ++ ++ for (i = 0; i < (NVM_CHECKSUM_REG + 1); i++) { ++ ret_val = hw->nvm.ops.read(hw, i, 1, &nvm_data); ++ if (ret_val) { ++ DEBUGOUT("NVM Read Error\n"); ++ goto out; ++ } ++ checksum += nvm_data; ++ } ++ ++ if (checksum != (u16) NVM_SUM) { ++ DEBUGOUT("NVM Checksum Invalid\n"); ++ ret_val = -E1000_ERR_NVM; ++ goto out; ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_update_nvm_checksum_generic - Update EEPROM checksum ++ * @hw: pointer to the HW structure ++ * ++ * Updates the EEPROM checksum by reading/adding each word of the EEPROM ++ * up to the checksum. Then calculates the EEPROM checksum and writes the ++ * value to the EEPROM. ++ **/ ++s32 e1000_update_nvm_checksum_generic(struct e1000_hw *hw) ++{ ++ s32 ret_val; ++ u16 checksum = 0; ++ u16 i, nvm_data; ++ ++ DEBUGFUNC("e1000_update_nvm_checksum"); ++ ++ for (i = 0; i < NVM_CHECKSUM_REG; i++) { ++ ret_val = hw->nvm.ops.read(hw, i, 1, &nvm_data); ++ if (ret_val) { ++ DEBUGOUT("NVM Read Error while updating checksum.\n"); ++ goto out; ++ } ++ checksum += nvm_data; ++ } ++ checksum = (u16) NVM_SUM - checksum; ++ ret_val = hw->nvm.ops.write(hw, NVM_CHECKSUM_REG, 1, &checksum); ++ if (ret_val) ++ DEBUGOUT("NVM Write Error while updating checksum.\n"); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_reload_nvm_generic - Reloads EEPROM ++ * @hw: pointer to the HW structure ++ * ++ * Reloads the EEPROM by setting the "Reinitialize from EEPROM" bit in the ++ * extended control register. ++ **/ ++static void e1000_reload_nvm_generic(struct e1000_hw *hw) ++{ ++ u32 ctrl_ext; ++ ++ DEBUGFUNC("e1000_reload_nvm_generic"); ++ ++ usec_delay(10); ++ ctrl_ext = E1000_READ_REG(hw, E1000_CTRL_EXT); ++ ctrl_ext |= E1000_CTRL_EXT_EE_RST; ++ E1000_WRITE_REG(hw, E1000_CTRL_EXT, ctrl_ext); ++ E1000_WRITE_FLUSH(hw); ++} ++ +diff -r d03036c09699 drivers/net/e1000/e1000_nvm.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/e1000/e1000_nvm.h Mon Jun 15 11:43:11 2009 +0100 +@@ -0,0 +1,61 @@ ++/******************************************************************************* ++ ++ Intel PRO/1000 Linux driver ++ Copyright(c) 1999 - 2008 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ Linux NICS ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++#ifndef _E1000_NVM_H_ ++#define _E1000_NVM_H_ ++ ++void e1000_init_nvm_ops_generic(struct e1000_hw *hw); ++s32 e1000_null_read_nvm(struct e1000_hw *hw, u16 a, u16 b, u16 *c); ++void e1000_null_nvm_generic(struct e1000_hw *hw); ++s32 e1000_null_led_default(struct e1000_hw *hw, u16 *data); ++s32 e1000_null_write_nvm(struct e1000_hw *hw, u16 a, u16 b, u16 *c); ++s32 e1000_acquire_nvm_generic(struct e1000_hw *hw); ++ ++s32 e1000_poll_eerd_eewr_done(struct e1000_hw *hw, int ee_reg); ++s32 e1000_read_mac_addr_generic(struct e1000_hw *hw); ++s32 e1000_read_pba_num_generic(struct e1000_hw *hw, u32 *pba_num); ++s32 e1000_read_nvm_spi(struct e1000_hw *hw, u16 offset, u16 words, u16 *data); ++s32 e1000_read_nvm_microwire(struct e1000_hw *hw, u16 offset, ++ u16 words, u16 *data); ++s32 e1000_read_nvm_eerd(struct e1000_hw *hw, u16 offset, u16 words, ++ u16 *data); ++s32 e1000_valid_led_default_generic(struct e1000_hw *hw, u16 *data); ++s32 e1000_validate_nvm_checksum_generic(struct e1000_hw *hw); ++s32 e1000_write_nvm_eewr(struct e1000_hw *hw, u16 offset, ++ u16 words, u16 *data); ++s32 e1000_write_nvm_microwire(struct e1000_hw *hw, u16 offset, ++ u16 words, u16 *data); ++s32 e1000_write_nvm_spi(struct e1000_hw *hw, u16 offset, u16 words, ++ u16 *data); ++s32 e1000_update_nvm_checksum_generic(struct e1000_hw *hw); ++void e1000_stop_nvm(struct e1000_hw *hw); ++void e1000_release_nvm_generic(struct e1000_hw *hw); ++ ++#define E1000_STM_OPCODE 0xDB00 ++ ++#endif +diff -r d03036c09699 drivers/net/e1000/e1000_osdep.h +--- a/drivers/net/e1000/e1000_osdep.h Thu Jun 04 15:13:56 2009 +0100 ++++ b/drivers/net/e1000/e1000_osdep.h Mon Jun 15 11:43:11 2009 +0100 +@@ -1,7 +1,7 @@ + /******************************************************************************* + + Intel PRO/1000 Linux driver +- Copyright(c) 1999 - 2006 Intel Corporation. ++ Copyright(c) 1999 - 2008 Intel Corporation. + + This program is free software; you can redistribute it and/or modify it + under the terms and conditions of the GNU General Public License, +@@ -27,87 +27,98 @@ + *******************************************************************************/ + + +-/* glue for the OS independent part of e1000 ++/* glue for the OS-dependent part of e1000 + * includes register access macros + */ + + #ifndef _E1000_OSDEP_H_ + #define _E1000_OSDEP_H_ + +-#include + #include + #include +-#include + #include +-#include ++#include + +-#ifdef DBG +-#define DEBUGOUT(S) printk(KERN_DEBUG S "\n") +-#define DEBUGOUT1(S, A...) printk(KERN_DEBUG S "\n", A) +-#else ++#include "kcompat.h" ++ ++#define usec_delay(x) udelay(x) ++#ifndef msec_delay ++#define msec_delay(x) do { if(in_interrupt()) { \ ++ /* Don't sleep in interrupt context! */ \ ++ BUG(); \ ++ } else { \ ++ msleep(x); \ ++ } } while (0) ++ ++/* Some workarounds require millisecond delays and are run during interrupt ++ * context. Most notably, when establishing link, the phy may need tweaking ++ * but cannot process phy register reads/writes faster than millisecond ++ * intervals...and we establish link due to a "link status change" interrupt. ++ */ ++#define msec_delay_irq(x) mdelay(x) ++#endif ++ ++#define PCI_COMMAND_REGISTER PCI_COMMAND ++#define CMD_MEM_WRT_INVALIDATE PCI_COMMAND_INVALIDATE ++#define ETH_ADDR_LEN ETH_ALEN ++ ++#ifdef __BIG_ENDIAN ++#define E1000_BIG_ENDIAN __BIG_ENDIAN ++#endif ++ ++ + #define DEBUGOUT(S) + #define DEBUGOUT1(S, A...) +-#endif + + #define DEBUGFUNC(F) DEBUGOUT(F "\n") + #define DEBUGOUT2 DEBUGOUT1 + #define DEBUGOUT3 DEBUGOUT2 + #define DEBUGOUT7 DEBUGOUT3 + ++#define E1000_REGISTER(a, reg) (((a)->mac.type >= e1000_82543) \ ++ ? reg \ ++ : e1000_translate_register_82542(reg)) + +-#define er32(reg) \ +- (readl(hw->hw_addr + ((hw->mac_type >= e1000_82543) \ +- ? E1000_##reg : E1000_82542_##reg))) ++#define E1000_WRITE_REG(a, reg, value) ( \ ++ writel((value), ((a)->hw_addr + E1000_REGISTER(a, reg)))) + +-#define ew32(reg, value) \ +- (writel((value), (hw->hw_addr + ((hw->mac_type >= e1000_82543) \ +- ? E1000_##reg : E1000_82542_##reg)))) ++#define E1000_READ_REG(a, reg) (readl((a)->hw_addr + E1000_REGISTER(a, reg))) + + #define E1000_WRITE_REG_ARRAY(a, reg, offset, value) ( \ +- writel((value), ((a)->hw_addr + \ +- (((a)->mac_type >= e1000_82543) ? E1000_##reg : E1000_82542_##reg) + \ +- ((offset) << 2)))) ++ writel((value), ((a)->hw_addr + E1000_REGISTER(a, reg) + ((offset) << 2)))) + + #define E1000_READ_REG_ARRAY(a, reg, offset) ( \ +- readl((a)->hw_addr + \ +- (((a)->mac_type >= e1000_82543) ? E1000_##reg : E1000_82542_##reg) + \ +- ((offset) << 2))) ++ readl((a)->hw_addr + E1000_REGISTER(a, reg) + ((offset) << 2))) + + #define E1000_READ_REG_ARRAY_DWORD E1000_READ_REG_ARRAY + #define E1000_WRITE_REG_ARRAY_DWORD E1000_WRITE_REG_ARRAY + + #define E1000_WRITE_REG_ARRAY_WORD(a, reg, offset, value) ( \ +- writew((value), ((a)->hw_addr + \ +- (((a)->mac_type >= e1000_82543) ? E1000_##reg : E1000_82542_##reg) + \ +- ((offset) << 1)))) ++ writew((value), ((a)->hw_addr + E1000_REGISTER(a, reg) + ((offset) << 1)))) + + #define E1000_READ_REG_ARRAY_WORD(a, reg, offset) ( \ +- readw((a)->hw_addr + \ +- (((a)->mac_type >= e1000_82543) ? E1000_##reg : E1000_82542_##reg) + \ +- ((offset) << 1))) ++ readw((a)->hw_addr + E1000_REGISTER(a, reg) + ((offset) << 1))) + + #define E1000_WRITE_REG_ARRAY_BYTE(a, reg, offset, value) ( \ +- writeb((value), ((a)->hw_addr + \ +- (((a)->mac_type >= e1000_82543) ? E1000_##reg : E1000_82542_##reg) + \ +- (offset)))) ++ writeb((value), ((a)->hw_addr + E1000_REGISTER(a, reg) + (offset)))) + + #define E1000_READ_REG_ARRAY_BYTE(a, reg, offset) ( \ +- readb((a)->hw_addr + \ +- (((a)->mac_type >= e1000_82543) ? E1000_##reg : E1000_82542_##reg) + \ +- (offset))) ++ readb((a)->hw_addr + E1000_REGISTER(a, reg) + (offset))) + +-#define E1000_WRITE_FLUSH() er32(STATUS) ++#define E1000_WRITE_REG_IO(a, reg, offset) do { \ ++ outl(reg, ((a)->io_base)); \ ++ outl(offset, ((a)->io_base + 4)); } while(0) + +-#define E1000_WRITE_ICH_FLASH_REG(a, reg, value) ( \ ++#define E1000_WRITE_FLUSH(a) E1000_READ_REG(a, E1000_STATUS) ++ ++#define E1000_WRITE_FLASH_REG(a, reg, value) ( \ + writel((value), ((a)->flash_address + reg))) + +-#define E1000_READ_ICH_FLASH_REG(a, reg) ( \ +- readl((a)->flash_address + reg)) +- +-#define E1000_WRITE_ICH_FLASH_REG16(a, reg, value) ( \ ++#define E1000_WRITE_FLASH_REG16(a, reg, value) ( \ + writew((value), ((a)->flash_address + reg))) + +-#define E1000_READ_ICH_FLASH_REG16(a, reg) ( \ +- readw((a)->flash_address + reg)) ++#define E1000_READ_FLASH_REG(a, reg) (readl((a)->flash_address + reg)) ++ ++#define E1000_READ_FLASH_REG16(a, reg) (readw((a)->flash_address + reg)) + + #endif /* _E1000_OSDEP_H_ */ +diff -r d03036c09699 drivers/net/e1000/e1000_param.c +--- a/drivers/net/e1000/e1000_param.c Thu Jun 04 15:13:56 2009 +0100 ++++ b/drivers/net/e1000/e1000_param.c Mon Jun 15 11:43:11 2009 +0100 +@@ -1,7 +1,7 @@ + /******************************************************************************* + + Intel PRO/1000 Linux driver +- Copyright(c) 1999 - 2006 Intel Corporation. ++ Copyright(c) 1999 - 2008 Intel Corporation. + + This program is free software; you can redistribute it and/or modify it + under the terms and conditions of the GNU General Public License, +@@ -26,6 +26,9 @@ + + *******************************************************************************/ + ++ ++#include ++ + #include "e1000.h" + + /* This is the only thing that needs to be changed to adjust the +@@ -44,11 +47,28 @@ + */ + + #define E1000_PARAM_INIT { [0 ... E1000_MAX_NIC] = OPTION_UNSET } ++#ifndef module_param_array ++/* Module Parameters are always initialized to -1, so that the driver ++ * can tell the difference between no user specified value or the ++ * user asking for the default value. ++ * The true default values are loaded in when e1000_check_options is called. ++ * ++ * This is a GCC extension to ANSI C. ++ * See the item "Labeled Elements in Initializers" in the section ++ * "Extensions to the C Language Family" of the GCC documentation. ++ */ ++ ++#define E1000_PARAM(X, desc) \ ++ static const int __devinitdata X[E1000_MAX_NIC+1] = E1000_PARAM_INIT; \ ++ MODULE_PARM(X, "1-" __MODULE_STRING(E1000_MAX_NIC) "i"); \ ++ MODULE_PARM_DESC(X, desc); ++#else + #define E1000_PARAM(X, desc) \ + static int __devinitdata X[E1000_MAX_NIC+1] = E1000_PARAM_INIT; \ +- static unsigned int num_##X; \ ++ static unsigned int num_##X = 0; \ + module_param_array_named(X, X, int, &num_##X, 0); \ + MODULE_PARM_DESC(X, desc); ++#endif + + /* Transmit Descriptor Count + * +@@ -59,6 +79,18 @@ + */ + E1000_PARAM(TxDescriptors, "Number of transmit descriptors"); + ++/* Transmit Descriptor Power ++ * ++ * Valid Range: 7-12 ++ * This value represents the size-order of each transmit descriptor. ++ * The valid size for descriptors would be 2^7 (128) to 2^12 (4096) bytes ++ * each. As this value decreases one may want to consider increasing ++ * the TxDescriptors value to maintain the same amount of frame memory. ++ * ++ * Default Value: 12 ++ */ ++E1000_PARAM(TxDescPower, "Binary exponential size (2^X) of each transmit descriptor"); ++ + /* Receive Descriptor Count + * + * Valid Range: 80-256 for 82542 and 82543 gigabit ethernet controllers +@@ -67,6 +99,16 @@ + * Default Value: 256 + */ + E1000_PARAM(RxDescriptors, "Number of receive descriptors"); ++ ++/* User Specified Transmit Decriptor Step ++ * ++ * Valid Range: 1, 4 ++ * - 1 - Use every TX descriptor ++ * - 4 - Use every 4th TX descriptor ++ * ++ * Default Value: 1 ++ */ ++E1000_PARAM(TxDescriptorStep, "Transmit Descriptor Step"); + + /* User Specified Speed Override + * +@@ -188,13 +230,7 @@ + */ + E1000_PARAM(SmartPowerDownEnable, "Enable PHY smart power down"); + +-/* Enable Kumeran Lock Loss workaround +- * +- * Valid Range: 0, 1 +- * +- * Default Value: 1 (enabled) +- */ +-E1000_PARAM(KumeranLockLoss, "Enable Kumeran lock loss workaround"); ++ + + struct e1000_option { + enum { enable_option, range_option, list_option } type; +@@ -208,14 +244,14 @@ + } r; + struct { /* list_option info */ + int nr; +- const struct e1000_opt_list { int i; char *str; } *p; ++ struct e1000_opt_list { int i; char *str; } *p; + } l; + } arg; + }; + + static int __devinit e1000_validate_option(unsigned int *value, +- const struct e1000_option *opt, +- struct e1000_adapter *adapter) ++ const struct e1000_option *opt, ++ struct e1000_adapter *adapter) + { + if (*value == OPTION_UNSET) { + *value = opt->def; +@@ -242,7 +278,7 @@ + break; + case list_option: { + int i; +- const struct e1000_opt_list *ent; ++ struct e1000_opt_list *ent; + + for (i = 0; i < opt->arg.l.nr; i++) { + ent = &opt->arg.l.p[i]; +@@ -276,118 +312,186 @@ + * value exists, a default value is used. The final value is stored + * in a variable in the adapter structure. + **/ +- + void __devinit e1000_check_options(struct e1000_adapter *adapter) + { +- struct e1000_option opt; ++ struct e1000_hw *hw = &adapter->hw; + int bd = adapter->bd_number; +- + if (bd >= E1000_MAX_NIC) { + DPRINTK(PROBE, NOTICE, + "Warning: no configuration for board #%i\n", bd); + DPRINTK(PROBE, NOTICE, "Using defaults for all values\n"); ++#ifndef module_param_array ++ bd = E1000_MAX_NIC; ++#endif + } + + { /* Transmit Descriptor Count */ +- struct e1000_tx_ring *tx_ring = adapter->tx_ring; +- int i; +- e1000_mac_type mac_type = adapter->hw.mac_type; +- +- opt = (struct e1000_option) { ++ struct e1000_option opt = { + .type = range_option, + .name = "Transmit Descriptors", + .err = "using default of " + __MODULE_STRING(E1000_DEFAULT_TXD), + .def = E1000_DEFAULT_TXD, +- .arg = { .r = { +- .min = E1000_MIN_TXD, +- .max = mac_type < e1000_82544 ? E1000_MAX_TXD : E1000_MAX_82544_TXD +- }} ++ .arg = { .r = { .min = E1000_MIN_TXD }} + }; ++ struct e1000_tx_ring *tx_ring = adapter->tx_ring; ++ int i; ++ opt.arg.r.max = hw->mac.type < e1000_82544 ? ++ E1000_MAX_TXD : E1000_MAX_82544_TXD; + ++#ifdef module_param_array + if (num_TxDescriptors > bd) { ++#endif + tx_ring->count = TxDescriptors[bd]; + e1000_validate_option(&tx_ring->count, &opt, adapter); + tx_ring->count = ALIGN(tx_ring->count, +- REQ_TX_DESCRIPTOR_MULTIPLE); ++ REQ_TX_DESCRIPTOR_MULTIPLE); ++#ifdef module_param_array + } else { + tx_ring->count = opt.def; + } ++#endif + for (i = 0; i < adapter->num_tx_queues; i++) + tx_ring[i].count = tx_ring->count; + } ++ ++ { /* Transmit Descriptor Power */ ++ struct e1000_option opt = { ++ .type = range_option, ++ .name = "Transmit Descriptor Power", ++ .err = "using default of " ++ __MODULE_STRING(E1000_DEFAULT_TXD_PWR), ++ .def = E1000_DEFAULT_TXD_PWR, ++ .arg = { .r = { .min = E1000_MIN_TXD_PWR, ++ .max = E1000_MAX_TXD_PWR }} ++ }; ++ ++#ifdef module_param_array ++ if (num_TxDescPower > bd) { ++#endif ++ adapter->tx_desc_pwr = TxDescPower[bd]; ++ e1000_validate_option(&adapter->tx_desc_pwr, &opt, adapter); ++#ifdef module_param_array ++ } else { ++ adapter->tx_desc_pwr = opt.def; ++ } ++#endif ++ } ++ + { /* Receive Descriptor Count */ +- struct e1000_rx_ring *rx_ring = adapter->rx_ring; +- int i; +- e1000_mac_type mac_type = adapter->hw.mac_type; +- +- opt = (struct e1000_option) { ++ struct e1000_option opt = { + .type = range_option, + .name = "Receive Descriptors", + .err = "using default of " + __MODULE_STRING(E1000_DEFAULT_RXD), + .def = E1000_DEFAULT_RXD, +- .arg = { .r = { +- .min = E1000_MIN_RXD, +- .max = mac_type < e1000_82544 ? E1000_MAX_RXD : E1000_MAX_82544_RXD +- }} ++ .arg = { .r = { .min = E1000_MIN_RXD }} + }; ++ struct e1000_rx_ring *rx_ring = adapter->rx_ring; ++ int i; ++ opt.arg.r.max = hw->mac.type < e1000_82544 ? E1000_MAX_RXD : ++ E1000_MAX_82544_RXD; + ++#ifdef module_param_array + if (num_RxDescriptors > bd) { ++#endif + rx_ring->count = RxDescriptors[bd]; + e1000_validate_option(&rx_ring->count, &opt, adapter); + rx_ring->count = ALIGN(rx_ring->count, +- REQ_RX_DESCRIPTOR_MULTIPLE); ++ REQ_RX_DESCRIPTOR_MULTIPLE); ++#ifdef module_param_array + } else { + rx_ring->count = opt.def; + } ++#endif + for (i = 0; i < adapter->num_rx_queues; i++) + rx_ring[i].count = rx_ring->count; + } ++ { /* Transmit Descriptor Step */ ++ struct e1000_tx_ring *tx_ring = adapter->tx_ring; ++ int i; ++ ++ struct e1000_opt_list step_list[] = ++ {{ 1, "Transmit Descriptor step = 1" }, ++ { 4, "Transmit_descriptor_step = 4" }}; ++ ++ struct e1000_option opt = { ++ .type = list_option, ++ .name = "Transmit Descriptor Step", ++ .err = "using default of 1", ++ .def = 1, ++ .arg = { .l = { .nr = ARRAY_SIZE(step_list), ++ .p = step_list }} ++ }; ++ ++#ifdef module_param_array ++ if (num_TxDescriptorStep > bd) { ++#endif ++ tx_ring->step = TxDescriptorStep[bd]; ++ e1000_validate_option(&tx_ring->step, ++ &opt, adapter); ++#ifdef module_param_array ++ } else { ++ tx_ring->step = opt.def; ++ } ++#endif ++ for (i = 0; i < adapter->num_tx_queues; i++) ++ tx_ring[i].step = tx_ring->step; ++ } + { /* Checksum Offload Enable/Disable */ +- opt = (struct e1000_option) { ++ struct e1000_option opt = { + .type = enable_option, + .name = "Checksum Offload", + .err = "defaulting to Enabled", + .def = OPTION_ENABLED + }; + ++#ifdef module_param_array + if (num_XsumRX > bd) { ++#endif + unsigned int rx_csum = XsumRX[bd]; + e1000_validate_option(&rx_csum, &opt, adapter); + adapter->rx_csum = rx_csum; ++#ifdef module_param_array + } else { + adapter->rx_csum = opt.def; + } ++#endif + } + { /* Flow Control */ + + struct e1000_opt_list fc_list[] = +- {{ E1000_FC_NONE, "Flow Control Disabled" }, +- { E1000_FC_RX_PAUSE,"Flow Control Receive Only" }, +- { E1000_FC_TX_PAUSE,"Flow Control Transmit Only" }, +- { E1000_FC_FULL, "Flow Control Enabled" }, +- { E1000_FC_DEFAULT, "Flow Control Hardware Default" }}; ++ {{ e1000_fc_none, "Flow Control Disabled" }, ++ { e1000_fc_rx_pause,"Flow Control Receive Only" }, ++ { e1000_fc_tx_pause,"Flow Control Transmit Only" }, ++ { e1000_fc_full, "Flow Control Enabled" }, ++ { e1000_fc_default, "Flow Control Hardware Default" }}; + +- opt = (struct e1000_option) { ++ struct e1000_option opt = { + .type = list_option, + .name = "Flow Control", + .err = "reading default settings from EEPROM", +- .def = E1000_FC_DEFAULT, ++ .def = e1000_fc_default, + .arg = { .l = { .nr = ARRAY_SIZE(fc_list), + .p = fc_list }} + }; + ++#ifdef module_param_array + if (num_FlowControl > bd) { ++#endif + unsigned int fc = FlowControl[bd]; + e1000_validate_option(&fc, &opt, adapter); +- adapter->hw.fc = adapter->hw.original_fc = fc; ++ hw->fc.requested_mode = fc; ++ hw->fc.current_mode = fc; ++#ifdef module_param_array + } else { +- adapter->hw.fc = adapter->hw.original_fc = opt.def; ++ hw->fc.requested_mode = opt.def; ++ hw->fc.current_mode = opt.def; + } ++#endif + } + { /* Transmit Interrupt Delay */ +- opt = (struct e1000_option) { ++ struct e1000_option opt = { + .type = range_option, + .name = "Transmit Interrupt Delay", + .err = "using default of " __MODULE_STRING(DEFAULT_TIDV), +@@ -396,16 +500,20 @@ + .max = MAX_TXDELAY }} + }; + ++#ifdef module_param_array + if (num_TxIntDelay > bd) { ++#endif + adapter->tx_int_delay = TxIntDelay[bd]; + e1000_validate_option(&adapter->tx_int_delay, &opt, + adapter); ++#ifdef module_param_array + } else { + adapter->tx_int_delay = opt.def; + } ++#endif + } + { /* Transmit Absolute Interrupt Delay */ +- opt = (struct e1000_option) { ++ struct e1000_option opt = { + .type = range_option, + .name = "Transmit Absolute Interrupt Delay", + .err = "using default of " __MODULE_STRING(DEFAULT_TADV), +@@ -414,16 +522,20 @@ + .max = MAX_TXABSDELAY }} + }; + ++#ifdef module_param_array + if (num_TxAbsIntDelay > bd) { ++#endif + adapter->tx_abs_int_delay = TxAbsIntDelay[bd]; + e1000_validate_option(&adapter->tx_abs_int_delay, &opt, + adapter); ++#ifdef module_param_array + } else { + adapter->tx_abs_int_delay = opt.def; + } ++#endif + } + { /* Receive Interrupt Delay */ +- opt = (struct e1000_option) { ++ struct e1000_option opt = { + .type = range_option, + .name = "Receive Interrupt Delay", + .err = "using default of " __MODULE_STRING(DEFAULT_RDTR), +@@ -432,16 +544,20 @@ + .max = MAX_RXDELAY }} + }; + ++#ifdef module_param_array + if (num_RxIntDelay > bd) { ++#endif + adapter->rx_int_delay = RxIntDelay[bd]; + e1000_validate_option(&adapter->rx_int_delay, &opt, + adapter); ++#ifdef module_param_array + } else { + adapter->rx_int_delay = opt.def; + } ++#endif + } + { /* Receive Absolute Interrupt Delay */ +- opt = (struct e1000_option) { ++ struct e1000_option opt = { + .type = range_option, + .name = "Receive Absolute Interrupt Delay", + .err = "using default of " __MODULE_STRING(DEFAULT_RADV), +@@ -450,16 +566,20 @@ + .max = MAX_RXABSDELAY }} + }; + ++#ifdef module_param_array + if (num_RxAbsIntDelay > bd) { ++#endif + adapter->rx_abs_int_delay = RxAbsIntDelay[bd]; + e1000_validate_option(&adapter->rx_abs_int_delay, &opt, + adapter); ++#ifdef module_param_array + } else { + adapter->rx_abs_int_delay = opt.def; + } ++#endif + } + { /* Interrupt Throttling Rate */ +- opt = (struct e1000_option) { ++ struct e1000_option opt = { + .type = range_option, + .name = "Interrupt Throttling Rate (ints/sec)", + .err = "using default of " __MODULE_STRING(DEFAULT_ITR), +@@ -468,7 +588,9 @@ + .max = MAX_ITR }} + }; + ++#ifdef module_param_array + if (num_InterruptThrottleRate > bd) { ++#endif + adapter->itr = InterruptThrottleRate[bd]; + switch (adapter->itr) { + case 0: +@@ -489,53 +611,58 @@ + adapter->itr = 20000; + break; + default: +- e1000_validate_option(&adapter->itr, &opt, +- adapter); +- /* save the setting, because the dynamic bits change itr */ +- /* clear the lower two bits because they are +- * used as control */ +- adapter->itr_setting = adapter->itr & ~3; ++ /* ++ * Save the setting, because the dynamic bits ++ * change itr. ++ */ ++ if (e1000_validate_option(&adapter->itr, &opt, ++ adapter) && ++ (adapter->itr == 3)) { ++ /* ++ * In case of invalid user value, ++ * default to conservative mode. ++ */ ++ adapter->itr_setting = adapter->itr; ++ adapter->itr = 20000; ++ } else { ++ /* ++ * Clear the lower two bits because ++ * they are used as control. ++ */ ++ adapter->itr_setting = ++ adapter->itr & ~3; ++ } + break; + } ++#ifdef module_param_array + } else { + adapter->itr_setting = opt.def; + adapter->itr = 20000; + } ++#endif + } + { /* Smart Power Down */ +- opt = (struct e1000_option) { ++ struct e1000_option opt = { + .type = enable_option, + .name = "PHY Smart Power Down", + .err = "defaulting to Disabled", + .def = OPTION_DISABLED + }; + ++#ifdef module_param_array + if (num_SmartPowerDownEnable > bd) { ++#endif + unsigned int spd = SmartPowerDownEnable[bd]; + e1000_validate_option(&spd, &opt, adapter); +- adapter->smart_power_down = spd; ++ adapter->flags |= spd ? E1000_FLAG_SMART_POWER_DOWN : 0; ++#ifdef module_param_array + } else { +- adapter->smart_power_down = opt.def; ++ adapter->flags &= ~E1000_FLAG_SMART_POWER_DOWN; + } +- } +- { /* Kumeran Lock Loss Workaround */ +- opt = (struct e1000_option) { +- .type = enable_option, +- .name = "Kumeran Lock Loss Workaround", +- .err = "defaulting to Enabled", +- .def = OPTION_ENABLED +- }; +- +- if (num_KumeranLockLoss > bd) { +- unsigned int kmrn_lock_loss = KumeranLockLoss[bd]; +- e1000_validate_option(&kmrn_lock_loss, &opt, adapter); +- adapter->hw.kmrn_lock_loss_workaround_disabled = !kmrn_lock_loss; +- } else { +- adapter->hw.kmrn_lock_loss_workaround_disabled = !opt.def; +- } ++#endif + } + +- switch (adapter->hw.media_type) { ++ switch (hw->phy.media_type) { + case e1000_media_type_fiber: + case e1000_media_type_internal_serdes: + e1000_check_fiber_options(adapter); +@@ -546,6 +673,7 @@ + default: + BUG(); + } ++ + } + + /** +@@ -554,21 +682,33 @@ + * + * Handles speed and duplex options on fiber adapters + **/ +- + static void __devinit e1000_check_fiber_options(struct e1000_adapter *adapter) + { + int bd = adapter->bd_number; ++#ifndef module_param_array ++ bd = bd > E1000_MAX_NIC ? E1000_MAX_NIC : bd; ++ if ((Speed[bd] != OPTION_UNSET)) { ++#else + if (num_Speed > bd) { ++#endif + DPRINTK(PROBE, INFO, "Speed not valid for fiber adapters, " + "parameter ignored\n"); + } + ++#ifndef module_param_array ++ if ((Duplex[bd] != OPTION_UNSET)) { ++#else + if (num_Duplex > bd) { ++#endif + DPRINTK(PROBE, INFO, "Duplex not valid for fiber adapters, " + "parameter ignored\n"); + } + ++#ifndef module_param_array ++ if ((AutoNeg[bd] != OPTION_UNSET) && (AutoNeg[bd] != 0x20)) { ++#else + if ((num_AutoNeg > bd) && (AutoNeg[bd] != 0x20)) { ++#endif + DPRINTK(PROBE, INFO, "AutoNeg other than 1000/Full is " + "not valid for fiber adapters, " + "parameter ignored\n"); +@@ -581,21 +721,22 @@ + * + * Handles speed and duplex options on copper adapters + **/ +- + static void __devinit e1000_check_copper_options(struct e1000_adapter *adapter) + { +- struct e1000_option opt; ++ struct e1000_hw *hw = &adapter->hw; + unsigned int speed, dplx, an; + int bd = adapter->bd_number; ++#ifndef module_param_array ++ bd = bd > E1000_MAX_NIC ? E1000_MAX_NIC : bd; ++#endif + + { /* Speed */ +- static const struct e1000_opt_list speed_list[] = { +- { 0, "" }, +- { SPEED_10, "" }, +- { SPEED_100, "" }, +- { SPEED_1000, "" }}; ++ struct e1000_opt_list speed_list[] = {{ 0, "" }, ++ { SPEED_10, "" }, ++ { SPEED_100, "" }, ++ { SPEED_1000, "" }}; + +- opt = (struct e1000_option) { ++ struct e1000_option opt = { + .type = list_option, + .name = "Speed", + .err = "parameter ignored", +@@ -604,20 +745,23 @@ + .p = speed_list }} + }; + ++#ifdef module_param_array + if (num_Speed > bd) { ++#endif + speed = Speed[bd]; + e1000_validate_option(&speed, &opt, adapter); ++#ifdef module_param_array + } else { + speed = opt.def; + } ++#endif + } + { /* Duplex */ +- static const struct e1000_opt_list dplx_list[] = { +- { 0, "" }, +- { HALF_DUPLEX, "" }, +- { FULL_DUPLEX, "" }}; ++ struct e1000_opt_list dplx_list[] = {{ 0, "" }, ++ { HALF_DUPLEX, "" }, ++ { FULL_DUPLEX, "" }}; + +- opt = (struct e1000_option) { ++ struct e1000_option opt = { + .type = list_option, + .name = "Duplex", + .err = "parameter ignored", +@@ -626,27 +770,35 @@ + .p = dplx_list }} + }; + +- if (e1000_check_phy_reset_block(&adapter->hw)) { ++ if (e1000_check_reset_block(hw)) { + DPRINTK(PROBE, INFO, + "Link active due to SoL/IDER Session. " + "Speed/Duplex/AutoNeg parameter ignored.\n"); + return; + } ++#ifdef module_param_array + if (num_Duplex > bd) { ++#endif + dplx = Duplex[bd]; + e1000_validate_option(&dplx, &opt, adapter); ++#ifdef module_param_array + } else { + dplx = opt.def; + } ++#endif + } + ++#ifdef module_param_array + if ((num_AutoNeg > bd) && (speed != 0 || dplx != 0)) { ++#else ++ if (AutoNeg[bd] != OPTION_UNSET && (speed != 0 || dplx != 0)) { ++#endif + DPRINTK(PROBE, INFO, + "AutoNeg specified along with Speed or Duplex, " + "parameter ignored\n"); +- adapter->hw.autoneg_advertised = AUTONEG_ADV_DEFAULT; ++ hw->phy.autoneg_advertised = AUTONEG_ADV_DEFAULT; + } else { /* Autoneg */ +- static const struct e1000_opt_list an_list[] = ++ struct e1000_opt_list an_list[] = + #define AA "AutoNeg advertising " + {{ 0x01, AA "10/HD" }, + { 0x02, AA "10/FD" }, +@@ -680,7 +832,7 @@ + { 0x2e, AA "1000/FD, 100/FD, 100/HD, 10/FD" }, + { 0x2f, AA "1000/FD, 100/FD, 100/HD, 10/FD, 10/HD" }}; + +- opt = (struct e1000_option) { ++ struct e1000_option opt = { + .type = list_option, + .name = "AutoNeg", + .err = "parameter ignored", +@@ -689,19 +841,27 @@ + .p = an_list }} + }; + ++#ifdef module_param_array + if (num_AutoNeg > bd) { ++#endif + an = AutoNeg[bd]; + e1000_validate_option(&an, &opt, adapter); ++#ifdef module_param_array + } else { + an = opt.def; + } +- adapter->hw.autoneg_advertised = an; ++#endif ++ hw->phy.autoneg_advertised = an; + } + + switch (speed + dplx) { + case 0: +- adapter->hw.autoneg = adapter->fc_autoneg = 1; ++ hw->mac.autoneg = adapter->fc_autoneg = TRUE; ++#ifdef module_param_array + if ((num_Speed > bd) && (speed != 0 || dplx != 0)) ++#else ++ if (Speed[bd] != OPTION_UNSET || Duplex[bd] != OPTION_UNSET) ++#endif + DPRINTK(PROBE, INFO, + "Speed and duplex autonegotiation enabled\n"); + break; +@@ -709,59 +869,59 @@ + DPRINTK(PROBE, INFO, "Half Duplex specified without Speed\n"); + DPRINTK(PROBE, INFO, "Using Autonegotiation at " + "Half Duplex only\n"); +- adapter->hw.autoneg = adapter->fc_autoneg = 1; +- adapter->hw.autoneg_advertised = ADVERTISE_10_HALF | +- ADVERTISE_100_HALF; ++ hw->mac.autoneg = adapter->fc_autoneg = TRUE; ++ hw->phy.autoneg_advertised = ADVERTISE_10_HALF | ++ ADVERTISE_100_HALF; + break; + case FULL_DUPLEX: + DPRINTK(PROBE, INFO, "Full Duplex specified without Speed\n"); + DPRINTK(PROBE, INFO, "Using Autonegotiation at " + "Full Duplex only\n"); +- adapter->hw.autoneg = adapter->fc_autoneg = 1; +- adapter->hw.autoneg_advertised = ADVERTISE_10_FULL | +- ADVERTISE_100_FULL | +- ADVERTISE_1000_FULL; ++ hw->mac.autoneg = adapter->fc_autoneg = TRUE; ++ hw->phy.autoneg_advertised = ADVERTISE_10_FULL | ++ ADVERTISE_100_FULL | ++ ADVERTISE_1000_FULL; + break; + case SPEED_10: + DPRINTK(PROBE, INFO, "10 Mbps Speed specified " + "without Duplex\n"); + DPRINTK(PROBE, INFO, "Using Autonegotiation at 10 Mbps only\n"); +- adapter->hw.autoneg = adapter->fc_autoneg = 1; +- adapter->hw.autoneg_advertised = ADVERTISE_10_HALF | +- ADVERTISE_10_FULL; ++ hw->mac.autoneg = adapter->fc_autoneg = TRUE; ++ hw->phy.autoneg_advertised = ADVERTISE_10_HALF | ++ ADVERTISE_10_FULL; + break; + case SPEED_10 + HALF_DUPLEX: + DPRINTK(PROBE, INFO, "Forcing to 10 Mbps Half Duplex\n"); +- adapter->hw.autoneg = adapter->fc_autoneg = 0; +- adapter->hw.forced_speed_duplex = e1000_10_half; +- adapter->hw.autoneg_advertised = 0; ++ hw->mac.autoneg = adapter->fc_autoneg = FALSE; ++ hw->mac.forced_speed_duplex = ADVERTISE_10_HALF; ++ hw->phy.autoneg_advertised = 0; + break; + case SPEED_10 + FULL_DUPLEX: + DPRINTK(PROBE, INFO, "Forcing to 10 Mbps Full Duplex\n"); +- adapter->hw.autoneg = adapter->fc_autoneg = 0; +- adapter->hw.forced_speed_duplex = e1000_10_full; +- adapter->hw.autoneg_advertised = 0; ++ hw->mac.autoneg = adapter->fc_autoneg = FALSE; ++ hw->mac.forced_speed_duplex = ADVERTISE_10_FULL; ++ hw->phy.autoneg_advertised = 0; + break; + case SPEED_100: + DPRINTK(PROBE, INFO, "100 Mbps Speed specified " + "without Duplex\n"); + DPRINTK(PROBE, INFO, "Using Autonegotiation at " + "100 Mbps only\n"); +- adapter->hw.autoneg = adapter->fc_autoneg = 1; +- adapter->hw.autoneg_advertised = ADVERTISE_100_HALF | +- ADVERTISE_100_FULL; ++ hw->mac.autoneg = adapter->fc_autoneg = TRUE; ++ hw->phy.autoneg_advertised = ADVERTISE_100_HALF | ++ ADVERTISE_100_FULL; + break; + case SPEED_100 + HALF_DUPLEX: + DPRINTK(PROBE, INFO, "Forcing to 100 Mbps Half Duplex\n"); +- adapter->hw.autoneg = adapter->fc_autoneg = 0; +- adapter->hw.forced_speed_duplex = e1000_100_half; +- adapter->hw.autoneg_advertised = 0; ++ hw->mac.autoneg = adapter->fc_autoneg = FALSE; ++ hw->mac.forced_speed_duplex = ADVERTISE_100_HALF; ++ hw->phy.autoneg_advertised = 0; + break; + case SPEED_100 + FULL_DUPLEX: + DPRINTK(PROBE, INFO, "Forcing to 100 Mbps Full Duplex\n"); +- adapter->hw.autoneg = adapter->fc_autoneg = 0; +- adapter->hw.forced_speed_duplex = e1000_100_full; +- adapter->hw.autoneg_advertised = 0; ++ hw->mac.autoneg = adapter->fc_autoneg = FALSE; ++ hw->mac.forced_speed_duplex = ADVERTISE_100_FULL; ++ hw->phy.autoneg_advertised = 0; + break; + case SPEED_1000: + DPRINTK(PROBE, INFO, "1000 Mbps Speed specified without " +@@ -775,8 +935,8 @@ + full_duplex_only: + DPRINTK(PROBE, INFO, + "Using Autonegotiation at 1000 Mbps Full Duplex only\n"); +- adapter->hw.autoneg = adapter->fc_autoneg = 1; +- adapter->hw.autoneg_advertised = ADVERTISE_1000_FULL; ++ hw->mac.autoneg = adapter->fc_autoneg = TRUE; ++ hw->phy.autoneg_advertised = ADVERTISE_1000_FULL; + break; + default: + BUG(); +diff -r d03036c09699 drivers/net/e1000/e1000_phy.c +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/e1000/e1000_phy.c Mon Jun 15 11:43:11 2009 +0100 +@@ -0,0 +1,2170 @@ ++/******************************************************************************* ++ ++ Intel PRO/1000 Linux driver ++ Copyright(c) 1999 - 2008 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ Linux NICS ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++#include "e1000_api.h" ++ ++/* Cable length tables */ ++static const u16 e1000_m88_cable_length_table[] = ++ { 0, 50, 80, 110, 140, 140, E1000_CABLE_LENGTH_UNDEFINED }; ++#define M88E1000_CABLE_LENGTH_TABLE_SIZE \ ++ (sizeof(e1000_m88_cable_length_table) / \ ++ sizeof(e1000_m88_cable_length_table[0])) ++ ++static const u16 e1000_igp_2_cable_length_table[] = ++ { 0, 0, 0, 0, 0, 0, 0, 0, 3, 5, 8, 11, 13, 16, 18, 21, ++ 0, 0, 0, 3, 6, 10, 13, 16, 19, 23, 26, 29, 32, 35, 38, 41, ++ 6, 10, 14, 18, 22, 26, 30, 33, 37, 41, 44, 48, 51, 54, 58, 61, ++ 21, 26, 31, 35, 40, 44, 49, 53, 57, 61, 65, 68, 72, 75, 79, 82, ++ 40, 45, 51, 56, 61, 66, 70, 75, 79, 83, 87, 91, 94, 98, 101, 104, ++ 60, 66, 72, 77, 82, 87, 92, 96, 100, 104, 108, 111, 114, 117, 119, 121, ++ 83, 89, 95, 100, 105, 109, 113, 116, 119, 122, 124, ++ 104, 109, 114, 118, 121, 124}; ++#define IGP02E1000_CABLE_LENGTH_TABLE_SIZE \ ++ (sizeof(e1000_igp_2_cable_length_table) / \ ++ sizeof(e1000_igp_2_cable_length_table[0])) ++ ++/** ++ * e1000_init_phy_ops_generic - Initialize PHY function pointers ++ * @hw: pointer to the HW structure ++ * ++ * Setups up the function pointers to no-op functions ++ **/ ++void e1000_init_phy_ops_generic(struct e1000_hw *hw) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ DEBUGFUNC("e1000_init_phy_ops_generic"); ++ ++ /* Initialize function pointers */ ++ phy->ops.init_params = e1000_null_ops_generic; ++ phy->ops.acquire = e1000_null_ops_generic; ++ phy->ops.check_polarity = e1000_null_ops_generic; ++ phy->ops.check_reset_block = e1000_null_ops_generic; ++ phy->ops.commit = e1000_null_ops_generic; ++ phy->ops.force_speed_duplex = e1000_null_ops_generic; ++ phy->ops.get_cfg_done = e1000_null_ops_generic; ++ phy->ops.get_cable_length = e1000_null_ops_generic; ++ phy->ops.get_info = e1000_null_ops_generic; ++ phy->ops.read_reg = e1000_null_read_reg; ++ phy->ops.release = e1000_null_phy_generic; ++ phy->ops.reset = e1000_null_ops_generic; ++ phy->ops.set_d0_lplu_state = e1000_null_lplu_state; ++ phy->ops.set_d3_lplu_state = e1000_null_lplu_state; ++ phy->ops.write_reg = e1000_null_write_reg; ++ phy->ops.power_up = e1000_null_phy_generic; ++ phy->ops.power_down = e1000_null_phy_generic; ++} ++ ++/** ++ * e1000_null_read_reg - No-op function, return 0 ++ * @hw: pointer to the HW structure ++ **/ ++s32 e1000_null_read_reg(struct e1000_hw *hw, u32 offset, u16 *data) ++{ ++ DEBUGFUNC("e1000_null_read_reg"); ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_null_phy_generic - No-op function, return void ++ * @hw: pointer to the HW structure ++ **/ ++void e1000_null_phy_generic(struct e1000_hw *hw) ++{ ++ DEBUGFUNC("e1000_null_phy_generic"); ++ return; ++} ++ ++/** ++ * e1000_null_lplu_state - No-op function, return 0 ++ * @hw: pointer to the HW structure ++ **/ ++s32 e1000_null_lplu_state(struct e1000_hw *hw, bool active) ++{ ++ DEBUGFUNC("e1000_null_lplu_state"); ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_null_write_reg - No-op function, return 0 ++ * @hw: pointer to the HW structure ++ **/ ++s32 e1000_null_write_reg(struct e1000_hw *hw, u32 offset, u16 data) ++{ ++ DEBUGFUNC("e1000_null_write_reg"); ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_check_reset_block_generic - Check if PHY reset is blocked ++ * @hw: pointer to the HW structure ++ * ++ * Read the PHY management control register and check whether a PHY reset ++ * is blocked. If a reset is not blocked return E1000_SUCCESS, otherwise ++ * return E1000_BLK_PHY_RESET (12). ++ **/ ++s32 e1000_check_reset_block_generic(struct e1000_hw *hw) ++{ ++ u32 manc; ++ ++ DEBUGFUNC("e1000_check_reset_block"); ++ ++ manc = E1000_READ_REG(hw, E1000_MANC); ++ ++ return (manc & E1000_MANC_BLK_PHY_RST_ON_IDE) ? ++ E1000_BLK_PHY_RESET : E1000_SUCCESS; ++} ++ ++/** ++ * e1000_get_phy_id - Retrieve the PHY ID and revision ++ * @hw: pointer to the HW structure ++ * ++ * Reads the PHY registers and stores the PHY ID and possibly the PHY ++ * revision in the hardware structure. ++ **/ ++s32 e1000_get_phy_id(struct e1000_hw *hw) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ s32 ret_val = E1000_SUCCESS; ++ u16 phy_id; ++ ++ DEBUGFUNC("e1000_get_phy_id"); ++ ++ if (!(phy->ops.read_reg)) ++ goto out; ++ ++ ret_val = phy->ops.read_reg(hw, PHY_ID1, &phy_id); ++ if (ret_val) ++ goto out; ++ ++ phy->id = (u32)(phy_id << 16); ++ usec_delay(20); ++ ret_val = phy->ops.read_reg(hw, PHY_ID2, &phy_id); ++ if (ret_val) ++ goto out; ++ ++ phy->id |= (u32)(phy_id & PHY_REVISION_MASK); ++ phy->revision = (u32)(phy_id & ~PHY_REVISION_MASK); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_phy_reset_dsp_generic - Reset PHY DSP ++ * @hw: pointer to the HW structure ++ * ++ * Reset the digital signal processor. ++ **/ ++s32 e1000_phy_reset_dsp_generic(struct e1000_hw *hw) ++{ ++ s32 ret_val = E1000_SUCCESS; ++ ++ DEBUGFUNC("e1000_phy_reset_dsp_generic"); ++ ++ if (!(hw->phy.ops.write_reg)) ++ goto out; ++ ++ ret_val = hw->phy.ops.write_reg(hw, M88E1000_PHY_GEN_CONTROL, 0xC1); ++ if (ret_val) ++ goto out; ++ ++ ret_val = hw->phy.ops.write_reg(hw, M88E1000_PHY_GEN_CONTROL, 0); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_read_phy_reg_mdic - Read MDI control register ++ * @hw: pointer to the HW structure ++ * @offset: register offset to be read ++ * @data: pointer to the read data ++ * ++ * Reads the MDI control register in the PHY at offset and stores the ++ * information read to data. ++ **/ ++s32 e1000_read_phy_reg_mdic(struct e1000_hw *hw, u32 offset, u16 *data) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ u32 i, mdic = 0; ++ s32 ret_val = E1000_SUCCESS; ++ ++ DEBUGFUNC("e1000_read_phy_reg_mdic"); ++ ++ /* ++ * Set up Op-code, Phy Address, and register offset in the MDI ++ * Control register. The MAC will take care of interfacing with the ++ * PHY to retrieve the desired data. ++ */ ++ mdic = ((offset << E1000_MDIC_REG_SHIFT) | ++ (phy->addr << E1000_MDIC_PHY_SHIFT) | ++ (E1000_MDIC_OP_READ)); ++ ++ E1000_WRITE_REG(hw, E1000_MDIC, mdic); ++ ++ /* ++ * Poll the ready bit to see if the MDI read completed ++ * Increasing the time out as testing showed failures with ++ * the lower time out ++ */ ++ for (i = 0; i < (E1000_GEN_POLL_TIMEOUT * 3); i++) { ++ usec_delay(50); ++ mdic = E1000_READ_REG(hw, E1000_MDIC); ++ if (mdic & E1000_MDIC_READY) ++ break; ++ } ++ if (!(mdic & E1000_MDIC_READY)) { ++ DEBUGOUT("MDI Read did not complete\n"); ++ ret_val = -E1000_ERR_PHY; ++ goto out; ++ } ++ if (mdic & E1000_MDIC_ERROR) { ++ DEBUGOUT("MDI Error\n"); ++ ret_val = -E1000_ERR_PHY; ++ goto out; ++ } ++ *data = (u16) mdic; ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_write_phy_reg_mdic - Write MDI control register ++ * @hw: pointer to the HW structure ++ * @offset: register offset to write to ++ * @data: data to write to register at offset ++ * ++ * Writes data to MDI control register in the PHY at offset. ++ **/ ++s32 e1000_write_phy_reg_mdic(struct e1000_hw *hw, u32 offset, u16 data) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ u32 i, mdic = 0; ++ s32 ret_val = E1000_SUCCESS; ++ ++ DEBUGFUNC("e1000_write_phy_reg_mdic"); ++ ++ /* ++ * Set up Op-code, Phy Address, and register offset in the MDI ++ * Control register. The MAC will take care of interfacing with the ++ * PHY to retrieve the desired data. ++ */ ++ mdic = (((u32)data) | ++ (offset << E1000_MDIC_REG_SHIFT) | ++ (phy->addr << E1000_MDIC_PHY_SHIFT) | ++ (E1000_MDIC_OP_WRITE)); ++ ++ E1000_WRITE_REG(hw, E1000_MDIC, mdic); ++ ++ /* ++ * Poll the ready bit to see if the MDI read completed ++ * Increasing the time out as testing showed failures with ++ * the lower time out ++ */ ++ for (i = 0; i < (E1000_GEN_POLL_TIMEOUT * 3); i++) { ++ usec_delay(50); ++ mdic = E1000_READ_REG(hw, E1000_MDIC); ++ if (mdic & E1000_MDIC_READY) ++ break; ++ } ++ if (!(mdic & E1000_MDIC_READY)) { ++ DEBUGOUT("MDI Write did not complete\n"); ++ ret_val = -E1000_ERR_PHY; ++ goto out; ++ } ++ if (mdic & E1000_MDIC_ERROR) { ++ DEBUGOUT("MDI Error\n"); ++ ret_val = -E1000_ERR_PHY; ++ goto out; ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_read_phy_reg_m88 - Read m88 PHY register ++ * @hw: pointer to the HW structure ++ * @offset: register offset to be read ++ * @data: pointer to the read data ++ * ++ * Acquires semaphore, if necessary, then reads the PHY register at offset ++ * and storing the retrieved information in data. Release any acquired ++ * semaphores before exiting. ++ **/ ++s32 e1000_read_phy_reg_m88(struct e1000_hw *hw, u32 offset, u16 *data) ++{ ++ s32 ret_val = E1000_SUCCESS; ++ ++ DEBUGFUNC("e1000_read_phy_reg_m88"); ++ ++ if (!(hw->phy.ops.acquire)) ++ goto out; ++ ++ ret_val = hw->phy.ops.acquire(hw); ++ if (ret_val) ++ goto out; ++ ++ ret_val = e1000_read_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset, ++ data); ++ ++ hw->phy.ops.release(hw); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_write_phy_reg_m88 - Write m88 PHY register ++ * @hw: pointer to the HW structure ++ * @offset: register offset to write to ++ * @data: data to write at register offset ++ * ++ * Acquires semaphore, if necessary, then writes the data to PHY register ++ * at the offset. Release any acquired semaphores before exiting. ++ **/ ++s32 e1000_write_phy_reg_m88(struct e1000_hw *hw, u32 offset, u16 data) ++{ ++ s32 ret_val = E1000_SUCCESS; ++ ++ DEBUGFUNC("e1000_write_phy_reg_m88"); ++ ++ if (!(hw->phy.ops.acquire)) ++ goto out; ++ ++ ret_val = hw->phy.ops.acquire(hw); ++ if (ret_val) ++ goto out; ++ ++ ret_val = e1000_write_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset, ++ data); ++ ++ hw->phy.ops.release(hw); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_read_phy_reg_igp - Read igp PHY register ++ * @hw: pointer to the HW structure ++ * @offset: register offset to be read ++ * @data: pointer to the read data ++ * ++ * Acquires semaphore, if necessary, then reads the PHY register at offset ++ * and storing the retrieved information in data. Release any acquired ++ * semaphores before exiting. ++ **/ ++s32 e1000_read_phy_reg_igp(struct e1000_hw *hw, u32 offset, u16 *data) ++{ ++ s32 ret_val = E1000_SUCCESS; ++ ++ DEBUGFUNC("e1000_read_phy_reg_igp"); ++ ++ if (!(hw->phy.ops.acquire)) ++ goto out; ++ ++ ret_val = hw->phy.ops.acquire(hw); ++ if (ret_val) ++ goto out; ++ ++ if (offset > MAX_PHY_MULTI_PAGE_REG) { ++ ret_val = e1000_write_phy_reg_mdic(hw, ++ IGP01E1000_PHY_PAGE_SELECT, ++ (u16)offset); ++ if (ret_val) { ++ hw->phy.ops.release(hw); ++ goto out; ++ } ++ } ++ ++ ret_val = e1000_read_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset, ++ data); ++ ++ hw->phy.ops.release(hw); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_write_phy_reg_igp - Write igp PHY register ++ * @hw: pointer to the HW structure ++ * @offset: register offset to write to ++ * @data: data to write at register offset ++ * ++ * Acquires semaphore, if necessary, then writes the data to PHY register ++ * at the offset. Release any acquired semaphores before exiting. ++ **/ ++s32 e1000_write_phy_reg_igp(struct e1000_hw *hw, u32 offset, u16 data) ++{ ++ s32 ret_val = E1000_SUCCESS; ++ ++ DEBUGFUNC("e1000_write_phy_reg_igp"); ++ ++ if (!(hw->phy.ops.acquire)) ++ goto out; ++ ++ ret_val = hw->phy.ops.acquire(hw); ++ if (ret_val) ++ goto out; ++ ++ if (offset > MAX_PHY_MULTI_PAGE_REG) { ++ ret_val = e1000_write_phy_reg_mdic(hw, ++ IGP01E1000_PHY_PAGE_SELECT, ++ (u16)offset); ++ if (ret_val) { ++ hw->phy.ops.release(hw); ++ goto out; ++ } ++ } ++ ++ ret_val = e1000_write_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset, ++ data); ++ ++ hw->phy.ops.release(hw); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_read_kmrn_reg_generic - Read kumeran register ++ * @hw: pointer to the HW structure ++ * @offset: register offset to be read ++ * @data: pointer to the read data ++ * ++ * Acquires semaphore, if necessary. Then reads the PHY register at offset ++ * using the kumeran interface. The information retrieved is stored in data. ++ * Release any acquired semaphores before exiting. ++ **/ ++s32 e1000_read_kmrn_reg_generic(struct e1000_hw *hw, u32 offset, u16 *data) ++{ ++ u32 kmrnctrlsta; ++ s32 ret_val = E1000_SUCCESS; ++ ++ DEBUGFUNC("e1000_read_kmrn_reg_generic"); ++ ++ if (!(hw->phy.ops.acquire)) ++ goto out; ++ ++ ret_val = hw->phy.ops.acquire(hw); ++ if (ret_val) ++ goto out; ++ ++ kmrnctrlsta = ((offset << E1000_KMRNCTRLSTA_OFFSET_SHIFT) & ++ E1000_KMRNCTRLSTA_OFFSET) | E1000_KMRNCTRLSTA_REN; ++ E1000_WRITE_REG(hw, E1000_KMRNCTRLSTA, kmrnctrlsta); ++ ++ usec_delay(2); ++ ++ kmrnctrlsta = E1000_READ_REG(hw, E1000_KMRNCTRLSTA); ++ *data = (u16)kmrnctrlsta; ++ ++ hw->phy.ops.release(hw); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_write_kmrn_reg_generic - Write kumeran register ++ * @hw: pointer to the HW structure ++ * @offset: register offset to write to ++ * @data: data to write at register offset ++ * ++ * Acquires semaphore, if necessary. Then write the data to PHY register ++ * at the offset using the kumeran interface. Release any acquired semaphores ++ * before exiting. ++ **/ ++s32 e1000_write_kmrn_reg_generic(struct e1000_hw *hw, u32 offset, u16 data) ++{ ++ u32 kmrnctrlsta; ++ s32 ret_val = E1000_SUCCESS; ++ ++ DEBUGFUNC("e1000_write_kmrn_reg_generic"); ++ ++ if (!(hw->phy.ops.acquire)) ++ goto out; ++ ++ ret_val = hw->phy.ops.acquire(hw); ++ if (ret_val) ++ goto out; ++ ++ kmrnctrlsta = ((offset << E1000_KMRNCTRLSTA_OFFSET_SHIFT) & ++ E1000_KMRNCTRLSTA_OFFSET) | data; ++ E1000_WRITE_REG(hw, E1000_KMRNCTRLSTA, kmrnctrlsta); ++ ++ usec_delay(2); ++ hw->phy.ops.release(hw); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_copper_link_setup_m88 - Setup m88 PHY's for copper link ++ * @hw: pointer to the HW structure ++ * ++ * Sets up MDI/MDI-X and polarity for m88 PHY's. If necessary, transmit clock ++ * and downshift values are set also. ++ **/ ++s32 e1000_copper_link_setup_m88(struct e1000_hw *hw) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ s32 ret_val; ++ u16 phy_data; ++ ++ DEBUGFUNC("e1000_copper_link_setup_m88"); ++ ++ if (phy->reset_disable) { ++ ret_val = E1000_SUCCESS; ++ goto out; ++ } ++ ++ /* Enable CRS on TX. This must be set for half-duplex operation. */ ++ ret_val = phy->ops.read_reg(hw, M88E1000_PHY_SPEC_CTRL, &phy_data); ++ if (ret_val) ++ goto out; ++ ++ phy_data |= M88E1000_PSCR_ASSERT_CRS_ON_TX; ++ ++ /* ++ * Options: ++ * MDI/MDI-X = 0 (default) ++ * 0 - Auto for all speeds ++ * 1 - MDI mode ++ * 2 - MDI-X mode ++ * 3 - Auto for 1000Base-T only (MDI-X for 10/100Base-T modes) ++ */ ++ phy_data &= ~M88E1000_PSCR_AUTO_X_MODE; ++ ++ switch (phy->mdix) { ++ case 1: ++ phy_data |= M88E1000_PSCR_MDI_MANUAL_MODE; ++ break; ++ case 2: ++ phy_data |= M88E1000_PSCR_MDIX_MANUAL_MODE; ++ break; ++ case 3: ++ phy_data |= M88E1000_PSCR_AUTO_X_1000T; ++ break; ++ case 0: ++ default: ++ phy_data |= M88E1000_PSCR_AUTO_X_MODE; ++ break; ++ } ++ ++ /* ++ * Options: ++ * disable_polarity_correction = 0 (default) ++ * Automatic Correction for Reversed Cable Polarity ++ * 0 - Disabled ++ * 1 - Enabled ++ */ ++ phy_data &= ~M88E1000_PSCR_POLARITY_REVERSAL; ++ if (phy->disable_polarity_correction == 1) ++ phy_data |= M88E1000_PSCR_POLARITY_REVERSAL; ++ ++ ret_val = phy->ops.write_reg(hw, M88E1000_PHY_SPEC_CTRL, phy_data); ++ if (ret_val) ++ goto out; ++ ++ if (phy->revision < E1000_REVISION_4) { ++ /* ++ * Force TX_CLK in the Extended PHY Specific Control Register ++ * to 25MHz clock. ++ */ ++ ret_val = phy->ops.read_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL, ++ &phy_data); ++ if (ret_val) ++ goto out; ++ ++ phy_data |= M88E1000_EPSCR_TX_CLK_25; ++ ++ if ((phy->revision == E1000_REVISION_2) && ++ (phy->id == M88E1111_I_PHY_ID)) { ++ /* 82573L PHY - set the downshift counter to 5x. */ ++ phy_data &= ~M88EC018_EPSCR_DOWNSHIFT_COUNTER_MASK; ++ phy_data |= M88EC018_EPSCR_DOWNSHIFT_COUNTER_5X; ++ } else { ++ /* Configure Master and Slave downshift values */ ++ phy_data &= ~(M88E1000_EPSCR_MASTER_DOWNSHIFT_MASK | ++ M88E1000_EPSCR_SLAVE_DOWNSHIFT_MASK); ++ phy_data |= (M88E1000_EPSCR_MASTER_DOWNSHIFT_1X | ++ M88E1000_EPSCR_SLAVE_DOWNSHIFT_1X); ++ } ++ ret_val = phy->ops.write_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL, ++ phy_data); ++ if (ret_val) ++ goto out; ++ } ++ ++ /* Commit the changes. */ ++ ret_val = phy->ops.commit(hw); ++ if (ret_val) { ++ DEBUGOUT("Error committing the PHY changes\n"); ++ goto out; ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_copper_link_setup_igp - Setup igp PHY's for copper link ++ * @hw: pointer to the HW structure ++ * ++ * Sets up LPLU, MDI/MDI-X, polarity, Smartspeed and Master/Slave config for ++ * igp PHY's. ++ **/ ++s32 e1000_copper_link_setup_igp(struct e1000_hw *hw) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ s32 ret_val; ++ u16 data; ++ ++ DEBUGFUNC("e1000_copper_link_setup_igp"); ++ ++ if (phy->reset_disable) { ++ ret_val = E1000_SUCCESS; ++ goto out; ++ } ++ ++ ret_val = hw->phy.ops.reset(hw); ++ if (ret_val) { ++ DEBUGOUT("Error resetting the PHY.\n"); ++ goto out; ++ } ++ ++ /* ++ * Wait 100ms for MAC to configure PHY from NVM settings, to avoid ++ * timeout issues when LFS is enabled. ++ */ ++ msec_delay(100); ++ ++ /* ++ * The NVM settings will configure LPLU in D3 for ++ * non-IGP1 PHYs. ++ */ ++ if (phy->type == e1000_phy_igp) { ++ /* disable lplu d3 during driver init */ ++ ret_val = hw->phy.ops.set_d3_lplu_state(hw, false); ++ if (ret_val) { ++ DEBUGOUT("Error Disabling LPLU D3\n"); ++ goto out; ++ } ++ } ++ ++ /* disable lplu d0 during driver init */ ++ if (hw->phy.ops.set_d0_lplu_state) { ++ ret_val = hw->phy.ops.set_d0_lplu_state(hw, false); ++ if (ret_val) { ++ DEBUGOUT("Error Disabling LPLU D0\n"); ++ goto out; ++ } ++ } ++ /* Configure mdi-mdix settings */ ++ ret_val = phy->ops.read_reg(hw, IGP01E1000_PHY_PORT_CTRL, &data); ++ if (ret_val) ++ goto out; ++ ++ data &= ~IGP01E1000_PSCR_AUTO_MDIX; ++ ++ switch (phy->mdix) { ++ case 1: ++ data &= ~IGP01E1000_PSCR_FORCE_MDI_MDIX; ++ break; ++ case 2: ++ data |= IGP01E1000_PSCR_FORCE_MDI_MDIX; ++ break; ++ case 0: ++ default: ++ data |= IGP01E1000_PSCR_AUTO_MDIX; ++ break; ++ } ++ ret_val = phy->ops.write_reg(hw, IGP01E1000_PHY_PORT_CTRL, data); ++ if (ret_val) ++ goto out; ++ ++ /* set auto-master slave resolution settings */ ++ if (hw->mac.autoneg) { ++ /* ++ * when autonegotiation advertisement is only 1000Mbps then we ++ * should disable SmartSpeed and enable Auto MasterSlave ++ * resolution as hardware default. ++ */ ++ if (phy->autoneg_advertised == ADVERTISE_1000_FULL) { ++ /* Disable SmartSpeed */ ++ ret_val = phy->ops.read_reg(hw, ++ IGP01E1000_PHY_PORT_CONFIG, ++ &data); ++ if (ret_val) ++ goto out; ++ ++ data &= ~IGP01E1000_PSCFR_SMART_SPEED; ++ ret_val = phy->ops.write_reg(hw, ++ IGP01E1000_PHY_PORT_CONFIG, ++ data); ++ if (ret_val) ++ goto out; ++ ++ /* Set auto Master/Slave resolution process */ ++ ret_val = phy->ops.read_reg(hw, PHY_1000T_CTRL, &data); ++ if (ret_val) ++ goto out; ++ ++ data &= ~CR_1000T_MS_ENABLE; ++ ret_val = phy->ops.write_reg(hw, PHY_1000T_CTRL, data); ++ if (ret_val) ++ goto out; ++ } ++ ++ ret_val = phy->ops.read_reg(hw, PHY_1000T_CTRL, &data); ++ if (ret_val) ++ goto out; ++ ++ /* load defaults for future use */ ++ phy->original_ms_type = (data & CR_1000T_MS_ENABLE) ? ++ ((data & CR_1000T_MS_VALUE) ? ++ e1000_ms_force_master : ++ e1000_ms_force_slave) : ++ e1000_ms_auto; ++ ++ switch (phy->ms_type) { ++ case e1000_ms_force_master: ++ data |= (CR_1000T_MS_ENABLE | CR_1000T_MS_VALUE); ++ break; ++ case e1000_ms_force_slave: ++ data |= CR_1000T_MS_ENABLE; ++ data &= ~(CR_1000T_MS_VALUE); ++ break; ++ case e1000_ms_auto: ++ data &= ~CR_1000T_MS_ENABLE; ++ default: ++ break; ++ } ++ ret_val = phy->ops.write_reg(hw, PHY_1000T_CTRL, data); ++ if (ret_val) ++ goto out; ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_copper_link_autoneg - Setup/Enable autoneg for copper link ++ * @hw: pointer to the HW structure ++ * ++ * Performs initial bounds checking on autoneg advertisement parameter, then ++ * configure to advertise the full capability. Setup the PHY to autoneg ++ * and restart the negotiation process between the link partner. If ++ * autoneg_wait_to_complete, then wait for autoneg to complete before exiting. ++ **/ ++s32 e1000_copper_link_autoneg(struct e1000_hw *hw) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ s32 ret_val; ++ u16 phy_ctrl; ++ ++ DEBUGFUNC("e1000_copper_link_autoneg"); ++ ++ /* ++ * Perform some bounds checking on the autoneg advertisement ++ * parameter. ++ */ ++ phy->autoneg_advertised &= phy->autoneg_mask; ++ ++ /* ++ * If autoneg_advertised is zero, we assume it was not defaulted ++ * by the calling code so we set to advertise full capability. ++ */ ++ if (phy->autoneg_advertised == 0) ++ phy->autoneg_advertised = phy->autoneg_mask; ++ ++ DEBUGOUT("Reconfiguring auto-neg advertisement params\n"); ++ ret_val = e1000_phy_setup_autoneg(hw); ++ if (ret_val) { ++ DEBUGOUT("Error Setting up Auto-Negotiation\n"); ++ goto out; ++ } ++ DEBUGOUT("Restarting Auto-Neg\n"); ++ ++ /* ++ * Restart auto-negotiation by setting the Auto Neg Enable bit and ++ * the Auto Neg Restart bit in the PHY control register. ++ */ ++ ret_val = phy->ops.read_reg(hw, PHY_CONTROL, &phy_ctrl); ++ if (ret_val) ++ goto out; ++ ++ phy_ctrl |= (MII_CR_AUTO_NEG_EN | MII_CR_RESTART_AUTO_NEG); ++ ret_val = phy->ops.write_reg(hw, PHY_CONTROL, phy_ctrl); ++ if (ret_val) ++ goto out; ++ ++ /* ++ * Does the user want to wait for Auto-Neg to complete here, or ++ * check at a later time (for example, callback routine). ++ */ ++ if (phy->autoneg_wait_to_complete) { ++ ret_val = hw->mac.ops.wait_autoneg(hw); ++ if (ret_val) { ++ DEBUGOUT("Error while waiting for " ++ "autoneg to complete\n"); ++ goto out; ++ } ++ } ++ ++ hw->mac.get_link_status = true; ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_phy_setup_autoneg - Configure PHY for auto-negotiation ++ * @hw: pointer to the HW structure ++ * ++ * Reads the MII auto-neg advertisement register and/or the 1000T control ++ * register and if the PHY is already setup for auto-negotiation, then ++ * return successful. Otherwise, setup advertisement and flow control to ++ * the appropriate values for the wanted auto-negotiation. ++ **/ ++s32 e1000_phy_setup_autoneg(struct e1000_hw *hw) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ s32 ret_val; ++ u16 mii_autoneg_adv_reg; ++ u16 mii_1000t_ctrl_reg = 0; ++ ++ DEBUGFUNC("e1000_phy_setup_autoneg"); ++ ++ phy->autoneg_advertised &= phy->autoneg_mask; ++ ++ /* Read the MII Auto-Neg Advertisement Register (Address 4). */ ++ ret_val = phy->ops.read_reg(hw, PHY_AUTONEG_ADV, &mii_autoneg_adv_reg); ++ if (ret_val) ++ goto out; ++ ++ if (phy->autoneg_mask & ADVERTISE_1000_FULL) { ++ /* Read the MII 1000Base-T Control Register (Address 9). */ ++ ret_val = phy->ops.read_reg(hw, PHY_1000T_CTRL, ++ &mii_1000t_ctrl_reg); ++ if (ret_val) ++ goto out; ++ } ++ ++ /* ++ * Need to parse both autoneg_advertised and fc and set up ++ * the appropriate PHY registers. First we will parse for ++ * autoneg_advertised software override. Since we can advertise ++ * a plethora of combinations, we need to check each bit ++ * individually. ++ */ ++ ++ /* ++ * First we clear all the 10/100 mb speed bits in the Auto-Neg ++ * Advertisement Register (Address 4) and the 1000 mb speed bits in ++ * the 1000Base-T Control Register (Address 9). ++ */ ++ mii_autoneg_adv_reg &= ~(NWAY_AR_100TX_FD_CAPS | ++ NWAY_AR_100TX_HD_CAPS | ++ NWAY_AR_10T_FD_CAPS | ++ NWAY_AR_10T_HD_CAPS); ++ mii_1000t_ctrl_reg &= ~(CR_1000T_HD_CAPS | CR_1000T_FD_CAPS); ++ ++ DEBUGOUT1("autoneg_advertised %x\n", phy->autoneg_advertised); ++ ++ /* Do we want to advertise 10 Mb Half Duplex? */ ++ if (phy->autoneg_advertised & ADVERTISE_10_HALF) { ++ DEBUGOUT("Advertise 10mb Half duplex\n"); ++ mii_autoneg_adv_reg |= NWAY_AR_10T_HD_CAPS; ++ } ++ ++ /* Do we want to advertise 10 Mb Full Duplex? */ ++ if (phy->autoneg_advertised & ADVERTISE_10_FULL) { ++ DEBUGOUT("Advertise 10mb Full duplex\n"); ++ mii_autoneg_adv_reg |= NWAY_AR_10T_FD_CAPS; ++ } ++ ++ /* Do we want to advertise 100 Mb Half Duplex? */ ++ if (phy->autoneg_advertised & ADVERTISE_100_HALF) { ++ DEBUGOUT("Advertise 100mb Half duplex\n"); ++ mii_autoneg_adv_reg |= NWAY_AR_100TX_HD_CAPS; ++ } ++ ++ /* Do we want to advertise 100 Mb Full Duplex? */ ++ if (phy->autoneg_advertised & ADVERTISE_100_FULL) { ++ DEBUGOUT("Advertise 100mb Full duplex\n"); ++ mii_autoneg_adv_reg |= NWAY_AR_100TX_FD_CAPS; ++ } ++ ++ /* We do not allow the Phy to advertise 1000 Mb Half Duplex */ ++ if (phy->autoneg_advertised & ADVERTISE_1000_HALF) ++ DEBUGOUT("Advertise 1000mb Half duplex request denied!\n"); ++ ++ /* Do we want to advertise 1000 Mb Full Duplex? */ ++ if (phy->autoneg_advertised & ADVERTISE_1000_FULL) { ++ DEBUGOUT("Advertise 1000mb Full duplex\n"); ++ mii_1000t_ctrl_reg |= CR_1000T_FD_CAPS; ++ } ++ ++ /* ++ * Check for a software override of the flow control settings, and ++ * setup the PHY advertisement registers accordingly. If ++ * auto-negotiation is enabled, then software will have to set the ++ * "PAUSE" bits to the correct value in the Auto-Negotiation ++ * Advertisement Register (PHY_AUTONEG_ADV) and re-start auto- ++ * negotiation. ++ * ++ * The possible values of the "fc" parameter are: ++ * 0: Flow control is completely disabled ++ * 1: Rx flow control is enabled (we can receive pause frames ++ * but not send pause frames). ++ * 2: Tx flow control is enabled (we can send pause frames ++ * but we do not support receiving pause frames). ++ * 3: Both Rx and Tx flow control (symmetric) are enabled. ++ * other: No software override. The flow control configuration ++ * in the EEPROM is used. ++ */ ++ switch (hw->fc.current_mode) { ++ case e1000_fc_none: ++ /* ++ * Flow control (Rx & Tx) is completely disabled by a ++ * software over-ride. ++ */ ++ mii_autoneg_adv_reg &= ~(NWAY_AR_ASM_DIR | NWAY_AR_PAUSE); ++ break; ++ case e1000_fc_rx_pause: ++ /* ++ * Rx Flow control is enabled, and Tx Flow control is ++ * disabled, by a software over-ride. ++ * ++ * Since there really isn't a way to advertise that we are ++ * capable of Rx Pause ONLY, we will advertise that we ++ * support both symmetric and asymmetric Rx PAUSE. Later ++ * (in e1000_config_fc_after_link_up) we will disable the ++ * hw's ability to send PAUSE frames. ++ */ ++ mii_autoneg_adv_reg |= (NWAY_AR_ASM_DIR | NWAY_AR_PAUSE); ++ break; ++ case e1000_fc_tx_pause: ++ /* ++ * Tx Flow control is enabled, and Rx Flow control is ++ * disabled, by a software over-ride. ++ */ ++ mii_autoneg_adv_reg |= NWAY_AR_ASM_DIR; ++ mii_autoneg_adv_reg &= ~NWAY_AR_PAUSE; ++ break; ++ case e1000_fc_full: ++ /* ++ * Flow control (both Rx and Tx) is enabled by a software ++ * over-ride. ++ */ ++ mii_autoneg_adv_reg |= (NWAY_AR_ASM_DIR | NWAY_AR_PAUSE); ++ break; ++ default: ++ DEBUGOUT("Flow control param set incorrectly\n"); ++ ret_val = -E1000_ERR_CONFIG; ++ goto out; ++ } ++ ++ ret_val = phy->ops.write_reg(hw, PHY_AUTONEG_ADV, mii_autoneg_adv_reg); ++ if (ret_val) ++ goto out; ++ ++ DEBUGOUT1("Auto-Neg Advertising %x\n", mii_autoneg_adv_reg); ++ ++ if (phy->autoneg_mask & ADVERTISE_1000_FULL) { ++ ret_val = phy->ops.write_reg(hw, ++ PHY_1000T_CTRL, ++ mii_1000t_ctrl_reg); ++ if (ret_val) ++ goto out; ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_setup_copper_link_generic - Configure copper link settings ++ * @hw: pointer to the HW structure ++ * ++ * Calls the appropriate function to configure the link for auto-neg or forced ++ * speed and duplex. Then we check for link, once link is established calls ++ * to configure collision distance and flow control are called. If link is ++ * not established, we return -E1000_ERR_PHY (-2). ++ **/ ++s32 e1000_setup_copper_link_generic(struct e1000_hw *hw) ++{ ++ s32 ret_val; ++ bool link; ++ ++ DEBUGFUNC("e1000_setup_copper_link_generic"); ++ ++ if (hw->mac.autoneg) { ++ /* ++ * Setup autoneg and flow control advertisement and perform ++ * autonegotiation. ++ */ ++ ret_val = e1000_copper_link_autoneg(hw); ++ if (ret_val) ++ goto out; ++ } else { ++ /* ++ * PHY will be set to 10H, 10F, 100H or 100F ++ * depending on user settings. ++ */ ++ DEBUGOUT("Forcing Speed and Duplex\n"); ++ ret_val = hw->phy.ops.force_speed_duplex(hw); ++ if (ret_val) { ++ DEBUGOUT("Error Forcing Speed and Duplex\n"); ++ goto out; ++ } ++ } ++ ++ /* ++ * Check link status. Wait up to 100 microseconds for link to become ++ * valid. ++ */ ++ ret_val = e1000_phy_has_link_generic(hw, ++ COPPER_LINK_UP_LIMIT, ++ 10, ++ &link); ++ if (ret_val) ++ goto out; ++ ++ if (link) { ++ DEBUGOUT("Valid link established!!!\n"); ++ e1000_config_collision_dist_generic(hw); ++ ret_val = e1000_config_fc_after_link_up_generic(hw); ++ } else { ++ DEBUGOUT("Unable to establish link!!!\n"); ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_phy_force_speed_duplex_igp - Force speed/duplex for igp PHY ++ * @hw: pointer to the HW structure ++ * ++ * Calls the PHY setup function to force speed and duplex. Clears the ++ * auto-crossover to force MDI manually. Waits for link and returns ++ * successful if link up is successful, else -E1000_ERR_PHY (-2). ++ **/ ++s32 e1000_phy_force_speed_duplex_igp(struct e1000_hw *hw) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ s32 ret_val; ++ u16 phy_data; ++ bool link; ++ ++ DEBUGFUNC("e1000_phy_force_speed_duplex_igp"); ++ ++ ret_val = phy->ops.read_reg(hw, PHY_CONTROL, &phy_data); ++ if (ret_val) ++ goto out; ++ ++ e1000_phy_force_speed_duplex_setup(hw, &phy_data); ++ ++ ret_val = phy->ops.write_reg(hw, PHY_CONTROL, phy_data); ++ if (ret_val) ++ goto out; ++ ++ /* ++ * Clear Auto-Crossover to force MDI manually. IGP requires MDI ++ * forced whenever speed and duplex are forced. ++ */ ++ ret_val = phy->ops.read_reg(hw, IGP01E1000_PHY_PORT_CTRL, &phy_data); ++ if (ret_val) ++ goto out; ++ ++ phy_data &= ~IGP01E1000_PSCR_AUTO_MDIX; ++ phy_data &= ~IGP01E1000_PSCR_FORCE_MDI_MDIX; ++ ++ ret_val = phy->ops.write_reg(hw, IGP01E1000_PHY_PORT_CTRL, phy_data); ++ if (ret_val) ++ goto out; ++ ++ DEBUGOUT1("IGP PSCR: %X\n", phy_data); ++ ++ usec_delay(1); ++ ++ if (phy->autoneg_wait_to_complete) { ++ DEBUGOUT("Waiting for forced speed/duplex link on IGP phy.\n"); ++ ++ ret_val = e1000_phy_has_link_generic(hw, ++ PHY_FORCE_LIMIT, ++ 100000, ++ &link); ++ if (ret_val) ++ goto out; ++ ++ if (!link) ++ DEBUGOUT("Link taking longer than expected.\n"); ++ ++ /* Try once more */ ++ ret_val = e1000_phy_has_link_generic(hw, ++ PHY_FORCE_LIMIT, ++ 100000, ++ &link); ++ if (ret_val) ++ goto out; ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_phy_force_speed_duplex_m88 - Force speed/duplex for m88 PHY ++ * @hw: pointer to the HW structure ++ * ++ * Calls the PHY setup function to force speed and duplex. Clears the ++ * auto-crossover to force MDI manually. Resets the PHY to commit the ++ * changes. If time expires while waiting for link up, we reset the DSP. ++ * After reset, TX_CLK and CRS on Tx must be set. Return successful upon ++ * successful completion, else return corresponding error code. ++ **/ ++s32 e1000_phy_force_speed_duplex_m88(struct e1000_hw *hw) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ s32 ret_val; ++ u16 phy_data; ++ bool link; ++ ++ DEBUGFUNC("e1000_phy_force_speed_duplex_m88"); ++ ++ /* ++ * Clear Auto-Crossover to force MDI manually. M88E1000 requires MDI ++ * forced whenever speed and duplex are forced. ++ */ ++ ret_val = phy->ops.read_reg(hw, M88E1000_PHY_SPEC_CTRL, &phy_data); ++ if (ret_val) ++ goto out; ++ ++ phy_data &= ~M88E1000_PSCR_AUTO_X_MODE; ++ ret_val = phy->ops.write_reg(hw, M88E1000_PHY_SPEC_CTRL, phy_data); ++ if (ret_val) ++ goto out; ++ ++ DEBUGOUT1("M88E1000 PSCR: %X\n", phy_data); ++ ++ ret_val = phy->ops.read_reg(hw, PHY_CONTROL, &phy_data); ++ if (ret_val) ++ goto out; ++ ++ e1000_phy_force_speed_duplex_setup(hw, &phy_data); ++ ++ ret_val = phy->ops.write_reg(hw, PHY_CONTROL, phy_data); ++ if (ret_val) ++ goto out; ++ ++ /* Reset the phy to commit changes. */ ++ ret_val = hw->phy.ops.commit(hw); ++ if (ret_val) ++ goto out; ++ ++ if (phy->autoneg_wait_to_complete) { ++ DEBUGOUT("Waiting for forced speed/duplex link on M88 phy.\n"); ++ ++ ret_val = e1000_phy_has_link_generic(hw, PHY_FORCE_LIMIT, ++ 100000, &link); ++ if (ret_val) ++ goto out; ++ ++ if (!link) { ++ /* ++ * We didn't get link. ++ * Reset the DSP and cross our fingers. ++ */ ++ ret_val = phy->ops.write_reg(hw, ++ M88E1000_PHY_PAGE_SELECT, ++ 0x001d); ++ if (ret_val) ++ goto out; ++ ret_val = e1000_phy_reset_dsp_generic(hw); ++ if (ret_val) ++ goto out; ++ } ++ ++ /* Try once more */ ++ ret_val = e1000_phy_has_link_generic(hw, PHY_FORCE_LIMIT, ++ 100000, &link); ++ if (ret_val) ++ goto out; ++ } ++ ++ ret_val = phy->ops.read_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL, &phy_data); ++ if (ret_val) ++ goto out; ++ ++ /* ++ * Resetting the phy means we need to re-force TX_CLK in the ++ * Extended PHY Specific Control Register to 25MHz clock from ++ * the reset value of 2.5MHz. ++ */ ++ phy_data |= M88E1000_EPSCR_TX_CLK_25; ++ ret_val = phy->ops.write_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL, phy_data); ++ if (ret_val) ++ goto out; ++ ++ /* ++ * In addition, we must re-enable CRS on Tx for both half and full ++ * duplex. ++ */ ++ ret_val = phy->ops.read_reg(hw, M88E1000_PHY_SPEC_CTRL, &phy_data); ++ if (ret_val) ++ goto out; ++ ++ phy_data |= M88E1000_PSCR_ASSERT_CRS_ON_TX; ++ ret_val = phy->ops.write_reg(hw, M88E1000_PHY_SPEC_CTRL, phy_data); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_phy_force_speed_duplex_setup - Configure forced PHY speed/duplex ++ * @hw: pointer to the HW structure ++ * @phy_ctrl: pointer to current value of PHY_CONTROL ++ * ++ * Forces speed and duplex on the PHY by doing the following: disable flow ++ * control, force speed/duplex on the MAC, disable auto speed detection, ++ * disable auto-negotiation, configure duplex, configure speed, configure ++ * the collision distance, write configuration to CTRL register. The ++ * caller must write to the PHY_CONTROL register for these settings to ++ * take affect. ++ **/ ++void e1000_phy_force_speed_duplex_setup(struct e1000_hw *hw, u16 *phy_ctrl) ++{ ++ struct e1000_mac_info *mac = &hw->mac; ++ u32 ctrl; ++ ++ DEBUGFUNC("e1000_phy_force_speed_duplex_setup"); ++ ++ /* Turn off flow control when forcing speed/duplex */ ++ hw->fc.current_mode = e1000_fc_none; ++ ++ /* Force speed/duplex on the mac */ ++ ctrl = E1000_READ_REG(hw, E1000_CTRL); ++ ctrl |= (E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX); ++ ctrl &= ~E1000_CTRL_SPD_SEL; ++ ++ /* Disable Auto Speed Detection */ ++ ctrl &= ~E1000_CTRL_ASDE; ++ ++ /* Disable autoneg on the phy */ ++ *phy_ctrl &= ~MII_CR_AUTO_NEG_EN; ++ ++ /* Forcing Full or Half Duplex? */ ++ if (mac->forced_speed_duplex & E1000_ALL_HALF_DUPLEX) { ++ ctrl &= ~E1000_CTRL_FD; ++ *phy_ctrl &= ~MII_CR_FULL_DUPLEX; ++ DEBUGOUT("Half Duplex\n"); ++ } else { ++ ctrl |= E1000_CTRL_FD; ++ *phy_ctrl |= MII_CR_FULL_DUPLEX; ++ DEBUGOUT("Full Duplex\n"); ++ } ++ ++ /* Forcing 10mb or 100mb? */ ++ if (mac->forced_speed_duplex & E1000_ALL_100_SPEED) { ++ ctrl |= E1000_CTRL_SPD_100; ++ *phy_ctrl |= MII_CR_SPEED_100; ++ *phy_ctrl &= ~(MII_CR_SPEED_1000 | MII_CR_SPEED_10); ++ DEBUGOUT("Forcing 100mb\n"); ++ } else { ++ ctrl &= ~(E1000_CTRL_SPD_1000 | E1000_CTRL_SPD_100); ++ *phy_ctrl |= MII_CR_SPEED_10; ++ *phy_ctrl &= ~(MII_CR_SPEED_1000 | MII_CR_SPEED_100); ++ DEBUGOUT("Forcing 10mb\n"); ++ } ++ ++ e1000_config_collision_dist_generic(hw); ++ ++ E1000_WRITE_REG(hw, E1000_CTRL, ctrl); ++} ++ ++/** ++ * e1000_set_d3_lplu_state_generic - Sets low power link up state for D3 ++ * @hw: pointer to the HW structure ++ * @active: boolean used to enable/disable lplu ++ * ++ * Success returns 0, Failure returns 1 ++ * ++ * The low power link up (lplu) state is set to the power management level D3 ++ * and SmartSpeed is disabled when active is true, else clear lplu for D3 ++ * and enable Smartspeed. LPLU and Smartspeed are mutually exclusive. LPLU ++ * is used during Dx states where the power conservation is most important. ++ * During driver activity, SmartSpeed should be enabled so performance is ++ * maintained. ++ **/ ++s32 e1000_set_d3_lplu_state_generic(struct e1000_hw *hw, bool active) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ s32 ret_val = E1000_SUCCESS; ++ u16 data; ++ ++ DEBUGFUNC("e1000_set_d3_lplu_state_generic"); ++ ++ if (!(hw->phy.ops.read_reg)) ++ goto out; ++ ++ ret_val = phy->ops.read_reg(hw, IGP02E1000_PHY_POWER_MGMT, &data); ++ if (ret_val) ++ goto out; ++ ++ if (!active) { ++ data &= ~IGP02E1000_PM_D3_LPLU; ++ ret_val = phy->ops.write_reg(hw, IGP02E1000_PHY_POWER_MGMT, ++ data); ++ if (ret_val) ++ goto out; ++ /* ++ * LPLU and SmartSpeed are mutually exclusive. LPLU is used ++ * during Dx states where the power conservation is most ++ * important. During driver activity we should enable ++ * SmartSpeed, so performance is maintained. ++ */ ++ if (phy->smart_speed == e1000_smart_speed_on) { ++ ret_val = phy->ops.read_reg(hw, ++ IGP01E1000_PHY_PORT_CONFIG, ++ &data); ++ if (ret_val) ++ goto out; ++ ++ data |= IGP01E1000_PSCFR_SMART_SPEED; ++ ret_val = phy->ops.write_reg(hw, ++ IGP01E1000_PHY_PORT_CONFIG, ++ data); ++ if (ret_val) ++ goto out; ++ } else if (phy->smart_speed == e1000_smart_speed_off) { ++ ret_val = phy->ops.read_reg(hw, ++ IGP01E1000_PHY_PORT_CONFIG, ++ &data); ++ if (ret_val) ++ goto out; ++ ++ data &= ~IGP01E1000_PSCFR_SMART_SPEED; ++ ret_val = phy->ops.write_reg(hw, ++ IGP01E1000_PHY_PORT_CONFIG, ++ data); ++ if (ret_val) ++ goto out; ++ } ++ } else if ((phy->autoneg_advertised == E1000_ALL_SPEED_DUPLEX) || ++ (phy->autoneg_advertised == E1000_ALL_NOT_GIG) || ++ (phy->autoneg_advertised == E1000_ALL_10_SPEED)) { ++ data |= IGP02E1000_PM_D3_LPLU; ++ ret_val = phy->ops.write_reg(hw, IGP02E1000_PHY_POWER_MGMT, ++ data); ++ if (ret_val) ++ goto out; ++ ++ /* When LPLU is enabled, we should disable SmartSpeed */ ++ ret_val = phy->ops.read_reg(hw, IGP01E1000_PHY_PORT_CONFIG, ++ &data); ++ if (ret_val) ++ goto out; ++ ++ data &= ~IGP01E1000_PSCFR_SMART_SPEED; ++ ret_val = phy->ops.write_reg(hw, IGP01E1000_PHY_PORT_CONFIG, ++ data); ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_check_downshift_generic - Checks whether a downshift in speed occurred ++ * @hw: pointer to the HW structure ++ * ++ * Success returns 0, Failure returns 1 ++ * ++ * A downshift is detected by querying the PHY link health. ++ **/ ++s32 e1000_check_downshift_generic(struct e1000_hw *hw) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ s32 ret_val; ++ u16 phy_data, offset, mask; ++ ++ DEBUGFUNC("e1000_check_downshift_generic"); ++ ++ switch (phy->type) { ++ case e1000_phy_m88: ++ case e1000_phy_gg82563: ++ offset = M88E1000_PHY_SPEC_STATUS; ++ mask = M88E1000_PSSR_DOWNSHIFT; ++ break; ++ case e1000_phy_igp_2: ++ case e1000_phy_igp: ++ case e1000_phy_igp_3: ++ offset = IGP01E1000_PHY_LINK_HEALTH; ++ mask = IGP01E1000_PLHR_SS_DOWNGRADE; ++ break; ++ default: ++ /* speed downshift not supported */ ++ phy->speed_downgraded = false; ++ ret_val = E1000_SUCCESS; ++ goto out; ++ } ++ ++ ret_val = phy->ops.read_reg(hw, offset, &phy_data); ++ ++ if (!ret_val) ++ phy->speed_downgraded = (phy_data & mask) ? true : false; ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_check_polarity_m88 - Checks the polarity. ++ * @hw: pointer to the HW structure ++ * ++ * Success returns 0, Failure returns -E1000_ERR_PHY (-2) ++ * ++ * Polarity is determined based on the PHY specific status register. ++ **/ ++s32 e1000_check_polarity_m88(struct e1000_hw *hw) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ s32 ret_val; ++ u16 data; ++ ++ DEBUGFUNC("e1000_check_polarity_m88"); ++ ++ ret_val = phy->ops.read_reg(hw, M88E1000_PHY_SPEC_STATUS, &data); ++ ++ if (!ret_val) ++ phy->cable_polarity = (data & M88E1000_PSSR_REV_POLARITY) ++ ? e1000_rev_polarity_reversed ++ : e1000_rev_polarity_normal; ++ ++ return ret_val; ++} ++ ++/** ++ * e1000_check_polarity_igp - Checks the polarity. ++ * @hw: pointer to the HW structure ++ * ++ * Success returns 0, Failure returns -E1000_ERR_PHY (-2) ++ * ++ * Polarity is determined based on the PHY port status register, and the ++ * current speed (since there is no polarity at 100Mbps). ++ **/ ++s32 e1000_check_polarity_igp(struct e1000_hw *hw) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ s32 ret_val; ++ u16 data, offset, mask; ++ ++ DEBUGFUNC("e1000_check_polarity_igp"); ++ ++ /* ++ * Polarity is determined based on the speed of ++ * our connection. ++ */ ++ ret_val = phy->ops.read_reg(hw, IGP01E1000_PHY_PORT_STATUS, &data); ++ if (ret_val) ++ goto out; ++ ++ if ((data & IGP01E1000_PSSR_SPEED_MASK) == ++ IGP01E1000_PSSR_SPEED_1000MBPS) { ++ offset = IGP01E1000_PHY_PCS_INIT_REG; ++ mask = IGP01E1000_PHY_POLARITY_MASK; ++ } else { ++ /* ++ * This really only applies to 10Mbps since ++ * there is no polarity for 100Mbps (always 0). ++ */ ++ offset = IGP01E1000_PHY_PORT_STATUS; ++ mask = IGP01E1000_PSSR_POLARITY_REVERSED; ++ } ++ ++ ret_val = phy->ops.read_reg(hw, offset, &data); ++ ++ if (!ret_val) ++ phy->cable_polarity = (data & mask) ++ ? e1000_rev_polarity_reversed ++ : e1000_rev_polarity_normal; ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_wait_autoneg_generic - Wait for auto-neg completion ++ * @hw: pointer to the HW structure ++ * ++ * Waits for auto-negotiation to complete or for the auto-negotiation time ++ * limit to expire, which ever happens first. ++ **/ ++s32 e1000_wait_autoneg_generic(struct e1000_hw *hw) ++{ ++ s32 ret_val = E1000_SUCCESS; ++ u16 i, phy_status; ++ ++ DEBUGFUNC("e1000_wait_autoneg_generic"); ++ ++ if (!(hw->phy.ops.read_reg)) ++ return E1000_SUCCESS; ++ ++ /* Break after autoneg completes or PHY_AUTO_NEG_LIMIT expires. */ ++ for (i = PHY_AUTO_NEG_LIMIT; i > 0; i--) { ++ ret_val = hw->phy.ops.read_reg(hw, PHY_STATUS, &phy_status); ++ if (ret_val) ++ break; ++ ret_val = hw->phy.ops.read_reg(hw, PHY_STATUS, &phy_status); ++ if (ret_val) ++ break; ++ if (phy_status & MII_SR_AUTONEG_COMPLETE) ++ break; ++ msec_delay(100); ++ } ++ ++ /* ++ * PHY_AUTO_NEG_TIME expiration doesn't guarantee auto-negotiation ++ * has completed. ++ */ ++ return ret_val; ++} ++ ++/** ++ * e1000_phy_has_link_generic - Polls PHY for link ++ * @hw: pointer to the HW structure ++ * @iterations: number of times to poll for link ++ * @usec_interval: delay between polling attempts ++ * @success: pointer to whether polling was successful or not ++ * ++ * Polls the PHY status register for link, 'iterations' number of times. ++ **/ ++s32 e1000_phy_has_link_generic(struct e1000_hw *hw, u32 iterations, ++ u32 usec_interval, bool *success) ++{ ++ s32 ret_val = E1000_SUCCESS; ++ u16 i, phy_status; ++ ++ DEBUGFUNC("e1000_phy_has_link_generic"); ++ ++ if (!(hw->phy.ops.read_reg)) ++ return E1000_SUCCESS; ++ ++ for (i = 0; i < iterations; i++) { ++ /* ++ * Some PHYs require the PHY_STATUS register to be read ++ * twice due to the link bit being sticky. No harm doing ++ * it across the board. ++ */ ++ ret_val = hw->phy.ops.read_reg(hw, PHY_STATUS, &phy_status); ++ if (ret_val) ++ break; ++ ret_val = hw->phy.ops.read_reg(hw, PHY_STATUS, &phy_status); ++ if (ret_val) ++ break; ++ if (phy_status & MII_SR_LINK_STATUS) ++ break; ++ if (usec_interval >= 1000) ++ msec_delay_irq(usec_interval/1000); ++ else ++ usec_delay(usec_interval); ++ } ++ ++ *success = (i < iterations) ? true : false; ++ ++ return ret_val; ++} ++ ++/** ++ * e1000_get_cable_length_m88 - Determine cable length for m88 PHY ++ * @hw: pointer to the HW structure ++ * ++ * Reads the PHY specific status register to retrieve the cable length ++ * information. The cable length is determined by averaging the minimum and ++ * maximum values to get the "average" cable length. The m88 PHY has four ++ * possible cable length values, which are: ++ * Register Value Cable Length ++ * 0 < 50 meters ++ * 1 50 - 80 meters ++ * 2 80 - 110 meters ++ * 3 110 - 140 meters ++ * 4 > 140 meters ++ **/ ++s32 e1000_get_cable_length_m88(struct e1000_hw *hw) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ s32 ret_val; ++ u16 phy_data, index; ++ ++ DEBUGFUNC("e1000_get_cable_length_m88"); ++ ++ ret_val = phy->ops.read_reg(hw, M88E1000_PHY_SPEC_STATUS, &phy_data); ++ if (ret_val) ++ goto out; ++ ++ index = (phy_data & M88E1000_PSSR_CABLE_LENGTH) >> ++ M88E1000_PSSR_CABLE_LENGTH_SHIFT; ++ if (index >= M88E1000_CABLE_LENGTH_TABLE_SIZE + 1) { ++ ret_val = E1000_ERR_PHY; ++ goto out; ++ } ++ ++ phy->min_cable_length = e1000_m88_cable_length_table[index]; ++ phy->max_cable_length = e1000_m88_cable_length_table[index+1]; ++ ++ phy->cable_length = (phy->min_cable_length + phy->max_cable_length) / 2; ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_get_cable_length_igp_2 - Determine cable length for igp2 PHY ++ * @hw: pointer to the HW structure ++ * ++ * The automatic gain control (agc) normalizes the amplitude of the ++ * received signal, adjusting for the attenuation produced by the ++ * cable. By reading the AGC registers, which represent the ++ * combination of coarse and fine gain value, the value can be put ++ * into a lookup table to obtain the approximate cable length ++ * for each channel. ++ **/ ++s32 e1000_get_cable_length_igp_2(struct e1000_hw *hw) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ s32 ret_val = E1000_SUCCESS; ++ u16 phy_data, i, agc_value = 0; ++ u16 cur_agc_index, max_agc_index = 0; ++ u16 min_agc_index = IGP02E1000_CABLE_LENGTH_TABLE_SIZE - 1; ++ u16 agc_reg_array[IGP02E1000_PHY_CHANNEL_NUM] = ++ {IGP02E1000_PHY_AGC_A, ++ IGP02E1000_PHY_AGC_B, ++ IGP02E1000_PHY_AGC_C, ++ IGP02E1000_PHY_AGC_D}; ++ ++ DEBUGFUNC("e1000_get_cable_length_igp_2"); ++ ++ /* Read the AGC registers for all channels */ ++ for (i = 0; i < IGP02E1000_PHY_CHANNEL_NUM; i++) { ++ ret_val = phy->ops.read_reg(hw, agc_reg_array[i], &phy_data); ++ if (ret_val) ++ goto out; ++ ++ /* ++ * Getting bits 15:9, which represent the combination of ++ * coarse and fine gain values. The result is a number ++ * that can be put into the lookup table to obtain the ++ * approximate cable length. ++ */ ++ cur_agc_index = (phy_data >> IGP02E1000_AGC_LENGTH_SHIFT) & ++ IGP02E1000_AGC_LENGTH_MASK; ++ ++ /* Array index bound check. */ ++ if ((cur_agc_index >= IGP02E1000_CABLE_LENGTH_TABLE_SIZE) || ++ (cur_agc_index == 0)) { ++ ret_val = -E1000_ERR_PHY; ++ goto out; ++ } ++ ++ /* Remove min & max AGC values from calculation. */ ++ if (e1000_igp_2_cable_length_table[min_agc_index] > ++ e1000_igp_2_cable_length_table[cur_agc_index]) ++ min_agc_index = cur_agc_index; ++ if (e1000_igp_2_cable_length_table[max_agc_index] < ++ e1000_igp_2_cable_length_table[cur_agc_index]) ++ max_agc_index = cur_agc_index; ++ ++ agc_value += e1000_igp_2_cable_length_table[cur_agc_index]; ++ } ++ ++ agc_value -= (e1000_igp_2_cable_length_table[min_agc_index] + ++ e1000_igp_2_cable_length_table[max_agc_index]); ++ agc_value /= (IGP02E1000_PHY_CHANNEL_NUM - 2); ++ ++ /* Calculate cable length with the error range of +/- 10 meters. */ ++ phy->min_cable_length = ((agc_value - IGP02E1000_AGC_RANGE) > 0) ? ++ (agc_value - IGP02E1000_AGC_RANGE) : 0; ++ phy->max_cable_length = agc_value + IGP02E1000_AGC_RANGE; ++ ++ phy->cable_length = (phy->min_cable_length + phy->max_cable_length) / 2; ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_get_phy_info_m88 - Retrieve PHY information ++ * @hw: pointer to the HW structure ++ * ++ * Valid for only copper links. Read the PHY status register (sticky read) ++ * to verify that link is up. Read the PHY special control register to ++ * determine the polarity and 10base-T extended distance. Read the PHY ++ * special status register to determine MDI/MDIx and current speed. If ++ * speed is 1000, then determine cable length, local and remote receiver. ++ **/ ++s32 e1000_get_phy_info_m88(struct e1000_hw *hw) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ s32 ret_val; ++ u16 phy_data; ++ bool link; ++ ++ DEBUGFUNC("e1000_get_phy_info_m88"); ++ ++ if (hw->phy.media_type != e1000_media_type_copper) { ++ DEBUGOUT("Phy info is only valid for copper media\n"); ++ ret_val = -E1000_ERR_CONFIG; ++ goto out; ++ } ++ ++ ret_val = e1000_phy_has_link_generic(hw, 1, 0, &link); ++ if (ret_val) ++ goto out; ++ ++ if (!link) { ++ DEBUGOUT("Phy info is only valid if link is up\n"); ++ ret_val = -E1000_ERR_CONFIG; ++ goto out; ++ } ++ ++ ret_val = phy->ops.read_reg(hw, M88E1000_PHY_SPEC_CTRL, &phy_data); ++ if (ret_val) ++ goto out; ++ ++ phy->polarity_correction = (phy_data & M88E1000_PSCR_POLARITY_REVERSAL) ++ ? true : false; ++ ++ ret_val = e1000_check_polarity_m88(hw); ++ if (ret_val) ++ goto out; ++ ++ ret_val = phy->ops.read_reg(hw, M88E1000_PHY_SPEC_STATUS, &phy_data); ++ if (ret_val) ++ goto out; ++ ++ phy->is_mdix = (phy_data & M88E1000_PSSR_MDIX) ? true : false; ++ ++ if ((phy_data & M88E1000_PSSR_SPEED) == M88E1000_PSSR_1000MBS) { ++ ret_val = hw->phy.ops.get_cable_length(hw); ++ if (ret_val) ++ goto out; ++ ++ ret_val = phy->ops.read_reg(hw, PHY_1000T_STATUS, &phy_data); ++ if (ret_val) ++ goto out; ++ ++ phy->local_rx = (phy_data & SR_1000T_LOCAL_RX_STATUS) ++ ? e1000_1000t_rx_status_ok ++ : e1000_1000t_rx_status_not_ok; ++ ++ phy->remote_rx = (phy_data & SR_1000T_REMOTE_RX_STATUS) ++ ? e1000_1000t_rx_status_ok ++ : e1000_1000t_rx_status_not_ok; ++ } else { ++ /* Set values to "undefined" */ ++ phy->cable_length = E1000_CABLE_LENGTH_UNDEFINED; ++ phy->local_rx = e1000_1000t_rx_status_undefined; ++ phy->remote_rx = e1000_1000t_rx_status_undefined; ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_get_phy_info_igp - Retrieve igp PHY information ++ * @hw: pointer to the HW structure ++ * ++ * Read PHY status to determine if link is up. If link is up, then ++ * set/determine 10base-T extended distance and polarity correction. Read ++ * PHY port status to determine MDI/MDIx and speed. Based on the speed, ++ * determine on the cable length, local and remote receiver. ++ **/ ++s32 e1000_get_phy_info_igp(struct e1000_hw *hw) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ s32 ret_val; ++ u16 data; ++ bool link; ++ ++ DEBUGFUNC("e1000_get_phy_info_igp"); ++ ++ ret_val = e1000_phy_has_link_generic(hw, 1, 0, &link); ++ if (ret_val) ++ goto out; ++ ++ if (!link) { ++ DEBUGOUT("Phy info is only valid if link is up\n"); ++ ret_val = -E1000_ERR_CONFIG; ++ goto out; ++ } ++ ++ phy->polarity_correction = true; ++ ++ ret_val = e1000_check_polarity_igp(hw); ++ if (ret_val) ++ goto out; ++ ++ ret_val = phy->ops.read_reg(hw, IGP01E1000_PHY_PORT_STATUS, &data); ++ if (ret_val) ++ goto out; ++ ++ phy->is_mdix = (data & IGP01E1000_PSSR_MDIX) ? true : false; ++ ++ if ((data & IGP01E1000_PSSR_SPEED_MASK) == ++ IGP01E1000_PSSR_SPEED_1000MBPS) { ++ ret_val = hw->phy.ops.get_cable_length(hw); ++ if (ret_val) ++ goto out; ++ ++ ret_val = phy->ops.read_reg(hw, PHY_1000T_STATUS, &data); ++ if (ret_val) ++ goto out; ++ ++ phy->local_rx = (data & SR_1000T_LOCAL_RX_STATUS) ++ ? e1000_1000t_rx_status_ok ++ : e1000_1000t_rx_status_not_ok; ++ ++ phy->remote_rx = (data & SR_1000T_REMOTE_RX_STATUS) ++ ? e1000_1000t_rx_status_ok ++ : e1000_1000t_rx_status_not_ok; ++ } else { ++ phy->cable_length = E1000_CABLE_LENGTH_UNDEFINED; ++ phy->local_rx = e1000_1000t_rx_status_undefined; ++ phy->remote_rx = e1000_1000t_rx_status_undefined; ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_phy_sw_reset_generic - PHY software reset ++ * @hw: pointer to the HW structure ++ * ++ * Does a software reset of the PHY by reading the PHY control register and ++ * setting/write the control register reset bit to the PHY. ++ **/ ++s32 e1000_phy_sw_reset_generic(struct e1000_hw *hw) ++{ ++ s32 ret_val = E1000_SUCCESS; ++ u16 phy_ctrl; ++ ++ DEBUGFUNC("e1000_phy_sw_reset_generic"); ++ ++ if (!(hw->phy.ops.read_reg)) ++ goto out; ++ ++ ret_val = hw->phy.ops.read_reg(hw, PHY_CONTROL, &phy_ctrl); ++ if (ret_val) ++ goto out; ++ ++ phy_ctrl |= MII_CR_RESET; ++ ret_val = hw->phy.ops.write_reg(hw, PHY_CONTROL, phy_ctrl); ++ if (ret_val) ++ goto out; ++ ++ usec_delay(1); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_phy_hw_reset_generic - PHY hardware reset ++ * @hw: pointer to the HW structure ++ * ++ * Verify the reset block is not blocking us from resetting. Acquire ++ * semaphore (if necessary) and read/set/write the device control reset ++ * bit in the PHY. Wait the appropriate delay time for the device to ++ * reset and release the semaphore (if necessary). ++ **/ ++s32 e1000_phy_hw_reset_generic(struct e1000_hw *hw) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ s32 ret_val = E1000_SUCCESS; ++ u32 ctrl; ++ ++ DEBUGFUNC("e1000_phy_hw_reset_generic"); ++ ++ ret_val = phy->ops.check_reset_block(hw); ++ if (ret_val) { ++ ret_val = E1000_SUCCESS; ++ goto out; ++ } ++ ++ ret_val = phy->ops.acquire(hw); ++ if (ret_val) ++ goto out; ++ ++ ctrl = E1000_READ_REG(hw, E1000_CTRL); ++ E1000_WRITE_REG(hw, E1000_CTRL, ctrl | E1000_CTRL_PHY_RST); ++ E1000_WRITE_FLUSH(hw); ++ ++ usec_delay(phy->reset_delay_us); ++ ++ E1000_WRITE_REG(hw, E1000_CTRL, ctrl); ++ E1000_WRITE_FLUSH(hw); ++ ++ usec_delay(150); ++ ++ phy->ops.release(hw); ++ ++ ret_val = phy->ops.get_cfg_done(hw); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_get_cfg_done_generic - Generic configuration done ++ * @hw: pointer to the HW structure ++ * ++ * Generic function to wait 10 milli-seconds for configuration to complete ++ * and return success. ++ **/ ++s32 e1000_get_cfg_done_generic(struct e1000_hw *hw) ++{ ++ DEBUGFUNC("e1000_get_cfg_done_generic"); ++ ++ msec_delay_irq(10); ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_phy_init_script_igp3 - Inits the IGP3 PHY ++ * @hw: pointer to the HW structure ++ * ++ * Initializes a Intel Gigabit PHY3 when an EEPROM is not present. ++ **/ ++s32 e1000_phy_init_script_igp3(struct e1000_hw *hw) ++{ ++ DEBUGOUT("Running IGP 3 PHY init script\n"); ++ ++ /* PHY init IGP 3 */ ++ /* Enable rise/fall, 10-mode work in class-A */ ++ hw->phy.ops.write_reg(hw, 0x2F5B, 0x9018); ++ /* Remove all caps from Replica path filter */ ++ hw->phy.ops.write_reg(hw, 0x2F52, 0x0000); ++ /* Bias trimming for ADC, AFE and Driver (Default) */ ++ hw->phy.ops.write_reg(hw, 0x2FB1, 0x8B24); ++ /* Increase Hybrid poly bias */ ++ hw->phy.ops.write_reg(hw, 0x2FB2, 0xF8F0); ++ /* Add 4% to Tx amplitude in Gig mode */ ++ hw->phy.ops.write_reg(hw, 0x2010, 0x10B0); ++ /* Disable trimming (TTT) */ ++ hw->phy.ops.write_reg(hw, 0x2011, 0x0000); ++ /* Poly DC correction to 94.6% + 2% for all channels */ ++ hw->phy.ops.write_reg(hw, 0x20DD, 0x249A); ++ /* ABS DC correction to 95.9% */ ++ hw->phy.ops.write_reg(hw, 0x20DE, 0x00D3); ++ /* BG temp curve trim */ ++ hw->phy.ops.write_reg(hw, 0x28B4, 0x04CE); ++ /* Increasing ADC OPAMP stage 1 currents to max */ ++ hw->phy.ops.write_reg(hw, 0x2F70, 0x29E4); ++ /* Force 1000 ( required for enabling PHY regs configuration) */ ++ hw->phy.ops.write_reg(hw, 0x0000, 0x0140); ++ /* Set upd_freq to 6 */ ++ hw->phy.ops.write_reg(hw, 0x1F30, 0x1606); ++ /* Disable NPDFE */ ++ hw->phy.ops.write_reg(hw, 0x1F31, 0xB814); ++ /* Disable adaptive fixed FFE (Default) */ ++ hw->phy.ops.write_reg(hw, 0x1F35, 0x002A); ++ /* Enable FFE hysteresis */ ++ hw->phy.ops.write_reg(hw, 0x1F3E, 0x0067); ++ /* Fixed FFE for short cable lengths */ ++ hw->phy.ops.write_reg(hw, 0x1F54, 0x0065); ++ /* Fixed FFE for medium cable lengths */ ++ hw->phy.ops.write_reg(hw, 0x1F55, 0x002A); ++ /* Fixed FFE for long cable lengths */ ++ hw->phy.ops.write_reg(hw, 0x1F56, 0x002A); ++ /* Enable Adaptive Clip Threshold */ ++ hw->phy.ops.write_reg(hw, 0x1F72, 0x3FB0); ++ /* AHT reset limit to 1 */ ++ hw->phy.ops.write_reg(hw, 0x1F76, 0xC0FF); ++ /* Set AHT master delay to 127 msec */ ++ hw->phy.ops.write_reg(hw, 0x1F77, 0x1DEC); ++ /* Set scan bits for AHT */ ++ hw->phy.ops.write_reg(hw, 0x1F78, 0xF9EF); ++ /* Set AHT Preset bits */ ++ hw->phy.ops.write_reg(hw, 0x1F79, 0x0210); ++ /* Change integ_factor of channel A to 3 */ ++ hw->phy.ops.write_reg(hw, 0x1895, 0x0003); ++ /* Change prop_factor of channels BCD to 8 */ ++ hw->phy.ops.write_reg(hw, 0x1796, 0x0008); ++ /* Change cg_icount + enable integbp for channels BCD */ ++ hw->phy.ops.write_reg(hw, 0x1798, 0xD008); ++ /* ++ * Change cg_icount + enable integbp + change prop_factor_master ++ * to 8 for channel A ++ */ ++ hw->phy.ops.write_reg(hw, 0x1898, 0xD918); ++ /* Disable AHT in Slave mode on channel A */ ++ hw->phy.ops.write_reg(hw, 0x187A, 0x0800); ++ /* ++ * Enable LPLU and disable AN to 1000 in non-D0a states, ++ * Enable SPD+B2B ++ */ ++ hw->phy.ops.write_reg(hw, 0x0019, 0x008D); ++ /* Enable restart AN on an1000_dis change */ ++ hw->phy.ops.write_reg(hw, 0x001B, 0x2080); ++ /* Enable wh_fifo read clock in 10/100 modes */ ++ hw->phy.ops.write_reg(hw, 0x0014, 0x0045); ++ /* Restart AN, Speed selection is 1000 */ ++ hw->phy.ops.write_reg(hw, 0x0000, 0x1340); ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_get_phy_type_from_id - Get PHY type from id ++ * @phy_id: phy_id read from the phy ++ * ++ * Returns the phy type from the id. ++ **/ ++enum e1000_phy_type e1000_get_phy_type_from_id(u32 phy_id) ++{ ++ enum e1000_phy_type phy_type = e1000_phy_unknown; ++ ++ switch (phy_id) { ++ case M88E1000_I_PHY_ID: ++ case M88E1000_E_PHY_ID: ++ case M88E1111_I_PHY_ID: ++ case M88E1011_I_PHY_ID: ++ phy_type = e1000_phy_m88; ++ break; ++ case IGP01E1000_I_PHY_ID: /* IGP 1 & 2 share this */ ++ phy_type = e1000_phy_igp_2; ++ break; ++ case GG82563_E_PHY_ID: ++ phy_type = e1000_phy_gg82563; ++ break; ++ case IGP03E1000_E_PHY_ID: ++ phy_type = e1000_phy_igp_3; ++ break; ++ case IFE_E_PHY_ID: ++ case IFE_PLUS_E_PHY_ID: ++ case IFE_C_E_PHY_ID: ++ phy_type = e1000_phy_ife; ++ break; ++ default: ++ phy_type = e1000_phy_unknown; ++ break; ++ } ++ return phy_type; ++} ++ ++/** ++ * e1000_determine_phy_address - Determines PHY address. ++ * @hw: pointer to the HW structure ++ * ++ * This uses a trial and error method to loop through possible PHY ++ * addresses. It tests each by reading the PHY ID registers and ++ * checking for a match. ++ **/ ++s32 e1000_determine_phy_address(struct e1000_hw *hw) ++{ ++ s32 ret_val = -E1000_ERR_PHY_TYPE; ++ u32 phy_addr = 0; ++ u32 i; ++ enum e1000_phy_type phy_type = e1000_phy_unknown; ++ ++ hw->phy.id = phy_type; ++ ++ for (phy_addr = 0; phy_addr < E1000_MAX_PHY_ADDR; phy_addr++) { ++ hw->phy.addr = phy_addr; ++ i = 0; ++ ++ do { ++ e1000_get_phy_id(hw); ++ phy_type = e1000_get_phy_type_from_id(hw->phy.id); ++ ++ /* ++ * If phy_type is valid, break - we found our ++ * PHY address ++ */ ++ if (phy_type != e1000_phy_unknown) { ++ ret_val = E1000_SUCCESS; ++ goto out; ++ } ++ msec_delay(1); ++ i++; ++ } while (i < 10); ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_power_up_phy_copper - Restore copper link in case of PHY power down ++ * @hw: pointer to the HW structure ++ * ++ * In the case of a PHY power down to save power, or to turn off link during a ++ * driver unload, or wake on lan is not enabled, restore the link to previous ++ * settings. ++ **/ ++void e1000_power_up_phy_copper(struct e1000_hw *hw) ++{ ++ u16 mii_reg = 0; ++ ++ /* The PHY will retain its settings across a power down/up cycle */ ++ hw->phy.ops.read_reg(hw, PHY_CONTROL, &mii_reg); ++ mii_reg &= ~MII_CR_POWER_DOWN; ++ hw->phy.ops.write_reg(hw, PHY_CONTROL, mii_reg); ++} ++ ++/** ++ * e1000_power_down_phy_copper - Restore copper link in case of PHY power down ++ * @hw: pointer to the HW structure ++ * ++ * In the case of a PHY power down to save power, or to turn off link during a ++ * driver unload, or wake on lan is not enabled, restore the link to previous ++ * settings. ++ **/ ++void e1000_power_down_phy_copper(struct e1000_hw *hw) ++{ ++ u16 mii_reg = 0; ++ ++ /* The PHY will retain its settings across a power down/up cycle */ ++ hw->phy.ops.read_reg(hw, PHY_CONTROL, &mii_reg); ++ mii_reg |= MII_CR_POWER_DOWN; ++ hw->phy.ops.write_reg(hw, PHY_CONTROL, mii_reg); ++ msec_delay(1); ++} +diff -r d03036c09699 drivers/net/e1000/e1000_phy.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/e1000/e1000_phy.h Mon Jun 15 11:43:11 2009 +0100 +@@ -0,0 +1,159 @@ ++/******************************************************************************* ++ ++ Intel PRO/1000 Linux driver ++ Copyright(c) 1999 - 2008 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ Linux NICS ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++#ifndef _E1000_PHY_H_ ++#define _E1000_PHY_H_ ++ ++void e1000_init_phy_ops_generic(struct e1000_hw *hw); ++s32 e1000_null_read_reg(struct e1000_hw *hw, u32 offset, u16 *data); ++void e1000_null_phy_generic(struct e1000_hw *hw); ++s32 e1000_null_lplu_state(struct e1000_hw *hw, bool active); ++s32 e1000_null_write_reg(struct e1000_hw *hw, u32 offset, u16 data); ++s32 e1000_check_downshift_generic(struct e1000_hw *hw); ++s32 e1000_check_polarity_m88(struct e1000_hw *hw); ++s32 e1000_check_polarity_igp(struct e1000_hw *hw); ++s32 e1000_check_reset_block_generic(struct e1000_hw *hw); ++s32 e1000_copper_link_autoneg(struct e1000_hw *hw); ++s32 e1000_copper_link_setup_igp(struct e1000_hw *hw); ++s32 e1000_copper_link_setup_m88(struct e1000_hw *hw); ++s32 e1000_phy_force_speed_duplex_igp(struct e1000_hw *hw); ++s32 e1000_phy_force_speed_duplex_m88(struct e1000_hw *hw); ++s32 e1000_get_cable_length_m88(struct e1000_hw *hw); ++s32 e1000_get_cable_length_igp_2(struct e1000_hw *hw); ++s32 e1000_get_cfg_done_generic(struct e1000_hw *hw); ++s32 e1000_get_phy_id(struct e1000_hw *hw); ++s32 e1000_get_phy_info_igp(struct e1000_hw *hw); ++s32 e1000_get_phy_info_m88(struct e1000_hw *hw); ++s32 e1000_phy_sw_reset_generic(struct e1000_hw *hw); ++void e1000_phy_force_speed_duplex_setup(struct e1000_hw *hw, u16 *phy_ctrl); ++s32 e1000_phy_hw_reset_generic(struct e1000_hw *hw); ++s32 e1000_phy_reset_dsp_generic(struct e1000_hw *hw); ++s32 e1000_phy_setup_autoneg(struct e1000_hw *hw); ++s32 e1000_read_kmrn_reg_generic(struct e1000_hw *hw, u32 offset, u16 *data); ++s32 e1000_read_phy_reg_igp(struct e1000_hw *hw, u32 offset, u16 *data); ++s32 e1000_read_phy_reg_m88(struct e1000_hw *hw, u32 offset, u16 *data); ++s32 e1000_set_d3_lplu_state_generic(struct e1000_hw *hw, bool active); ++s32 e1000_setup_copper_link_generic(struct e1000_hw *hw); ++s32 e1000_wait_autoneg_generic(struct e1000_hw *hw); ++s32 e1000_write_kmrn_reg_generic(struct e1000_hw *hw, u32 offset, u16 data); ++s32 e1000_write_phy_reg_igp(struct e1000_hw *hw, u32 offset, u16 data); ++s32 e1000_write_phy_reg_m88(struct e1000_hw *hw, u32 offset, u16 data); ++s32 e1000_phy_reset_dsp(struct e1000_hw *hw); ++s32 e1000_phy_has_link_generic(struct e1000_hw *hw, u32 iterations, ++ u32 usec_interval, bool *success); ++s32 e1000_phy_init_script_igp3(struct e1000_hw *hw); ++enum e1000_phy_type e1000_get_phy_type_from_id(u32 phy_id); ++s32 e1000_determine_phy_address(struct e1000_hw *hw); ++void e1000_power_up_phy_copper(struct e1000_hw *hw); ++void e1000_power_down_phy_copper(struct e1000_hw *hw); ++s32 e1000_read_phy_reg_mdic(struct e1000_hw *hw, u32 offset, u16 *data); ++s32 e1000_write_phy_reg_mdic(struct e1000_hw *hw, u32 offset, u16 data); ++ ++#define E1000_MAX_PHY_ADDR 4 ++ ++/* IGP01E1000 Specific Registers */ ++#define IGP01E1000_PHY_PORT_CONFIG 0x10 /* Port Config */ ++#define IGP01E1000_PHY_PORT_STATUS 0x11 /* Status */ ++#define IGP01E1000_PHY_PORT_CTRL 0x12 /* Control */ ++#define IGP01E1000_PHY_LINK_HEALTH 0x13 /* PHY Link Health */ ++#define IGP01E1000_GMII_FIFO 0x14 /* GMII FIFO */ ++#define IGP01E1000_PHY_CHANNEL_QUALITY 0x15 /* PHY Channel Quality */ ++#define IGP02E1000_PHY_POWER_MGMT 0x19 /* Power Management */ ++#define IGP01E1000_PHY_PAGE_SELECT 0x1F /* Page Select */ ++#define BM_PHY_PAGE_SELECT 22 /* Page Select for BM */ ++#define IGP_PAGE_SHIFT 5 ++#define PHY_REG_MASK 0x1F ++ ++#define IGP01E1000_PHY_PCS_INIT_REG 0x00B4 ++#define IGP01E1000_PHY_POLARITY_MASK 0x0078 ++ ++#define IGP01E1000_PSCR_AUTO_MDIX 0x1000 ++#define IGP01E1000_PSCR_FORCE_MDI_MDIX 0x2000 /* 0=MDI, 1=MDIX */ ++ ++#define IGP01E1000_PSCFR_SMART_SPEED 0x0080 ++ ++/* Enable flexible speed on link-up */ ++#define IGP01E1000_GMII_FLEX_SPD 0x0010 ++#define IGP01E1000_GMII_SPD 0x0020 /* Enable SPD */ ++ ++#define IGP02E1000_PM_SPD 0x0001 /* Smart Power Down */ ++#define IGP02E1000_PM_D0_LPLU 0x0002 /* For D0a states */ ++#define IGP02E1000_PM_D3_LPLU 0x0004 /* For all other states */ ++ ++#define IGP01E1000_PLHR_SS_DOWNGRADE 0x8000 ++ ++#define IGP01E1000_PSSR_POLARITY_REVERSED 0x0002 ++#define IGP01E1000_PSSR_MDIX 0x0008 ++#define IGP01E1000_PSSR_SPEED_MASK 0xC000 ++#define IGP01E1000_PSSR_SPEED_1000MBPS 0xC000 ++ ++#define IGP02E1000_PHY_CHANNEL_NUM 4 ++#define IGP02E1000_PHY_AGC_A 0x11B1 ++#define IGP02E1000_PHY_AGC_B 0x12B1 ++#define IGP02E1000_PHY_AGC_C 0x14B1 ++#define IGP02E1000_PHY_AGC_D 0x18B1 ++ ++#define IGP02E1000_AGC_LENGTH_SHIFT 9 /* Course - 15:13, Fine - 12:9 */ ++#define IGP02E1000_AGC_LENGTH_MASK 0x7F ++#define IGP02E1000_AGC_RANGE 15 ++ ++#define IGP03E1000_PHY_MISC_CTRL 0x1B ++#define IGP03E1000_PHY_MISC_DUPLEX_MANUAL_SET 0x1000 /* Manually Set Duplex */ ++ ++#define E1000_CABLE_LENGTH_UNDEFINED 0xFF ++ ++#define E1000_KMRNCTRLSTA_OFFSET 0x001F0000 ++#define E1000_KMRNCTRLSTA_OFFSET_SHIFT 16 ++#define E1000_KMRNCTRLSTA_REN 0x00200000 ++#define E1000_KMRNCTRLSTA_DIAG_OFFSET 0x3 /* Kumeran Diagnostic */ ++#define E1000_KMRNCTRLSTA_DIAG_NELPBK 0x1000 /* Nearend Loopback mode */ ++ ++#define IFE_PHY_EXTENDED_STATUS_CONTROL 0x10 ++#define IFE_PHY_SPECIAL_CONTROL 0x11 /* 100BaseTx PHY Special Control */ ++#define IFE_PHY_SPECIAL_CONTROL_LED 0x1B /* PHY Special and LED Control */ ++#define IFE_PHY_MDIX_CONTROL 0x1C /* MDI/MDI-X Control */ ++ ++/* IFE PHY Extended Status Control */ ++#define IFE_PESC_POLARITY_REVERSED 0x0100 ++ ++/* IFE PHY Special Control */ ++#define IFE_PSC_AUTO_POLARITY_DISABLE 0x0010 ++#define IFE_PSC_FORCE_POLARITY 0x0020 ++#define IFE_PSC_DISABLE_DYNAMIC_POWER_DOWN 0x0100 ++ ++/* IFE PHY Special Control and LED Control */ ++#define IFE_PSCL_PROBE_MODE 0x0020 ++#define IFE_PSCL_PROBE_LEDS_OFF 0x0006 /* Force LEDs 0 and 2 off */ ++#define IFE_PSCL_PROBE_LEDS_ON 0x0007 /* Force LEDs 0 and 2 on */ ++ ++/* IFE PHY MDIX Control */ ++#define IFE_PMC_MDIX_STATUS 0x0020 /* 1=MDI-X, 0=MDI */ ++#define IFE_PMC_FORCE_MDIX 0x0040 /* 1=force MDI-X, 0=force MDI */ ++#define IFE_PMC_AUTO_MDIX 0x0080 /* 1=enable auto MDI/MDI-X, 0=disable */ ++ ++#endif +diff -r d03036c09699 drivers/net/e1000/e1000_regs.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/e1000/e1000_regs.h Mon Jun 15 11:43:11 2009 +0100 +@@ -0,0 +1,327 @@ ++/******************************************************************************* ++ ++ Intel PRO/1000 Linux driver ++ Copyright(c) 1999 - 2008 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ Linux NICS ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++#ifndef _E1000_REGS_H_ ++#define _E1000_REGS_H_ ++ ++#define E1000_CTRL 0x00000 /* Device Control - RW */ ++#define E1000_CTRL_DUP 0x00004 /* Device Control Duplicate (Shadow) - RW */ ++#define E1000_STATUS 0x00008 /* Device Status - RO */ ++#define E1000_EECD 0x00010 /* EEPROM/Flash Control - RW */ ++#define E1000_EERD 0x00014 /* EEPROM Read - RW */ ++#define E1000_CTRL_EXT 0x00018 /* Extended Device Control - RW */ ++#define E1000_FLA 0x0001C /* Flash Access - RW */ ++#define E1000_MDIC 0x00020 /* MDI Control - RW */ ++#define E1000_SCTL 0x00024 /* SerDes Control - RW */ ++#define E1000_FCAL 0x00028 /* Flow Control Address Low - RW */ ++#define E1000_FCAH 0x0002C /* Flow Control Address High -RW */ ++#define E1000_FEXT 0x0002C /* Future Extended - RW */ ++#define E1000_FEXTNVM 0x00028 /* Future Extended NVM - RW */ ++#define E1000_FCT 0x00030 /* Flow Control Type - RW */ ++#define E1000_CONNSW 0x00034 /* Copper/Fiber switch control - RW */ ++#define E1000_VET 0x00038 /* VLAN Ether Type - RW */ ++#define E1000_ICR 0x000C0 /* Interrupt Cause Read - R/clr */ ++#define E1000_ITR 0x000C4 /* Interrupt Throttling Rate - RW */ ++#define E1000_ICS 0x000C8 /* Interrupt Cause Set - WO */ ++#define E1000_IMS 0x000D0 /* Interrupt Mask Set - RW */ ++#define E1000_IMC 0x000D8 /* Interrupt Mask Clear - WO */ ++#define E1000_IAM 0x000E0 /* Interrupt Acknowledge Auto Mask */ ++#define E1000_RCTL 0x00100 /* Rx Control - RW */ ++#define E1000_FCTTV 0x00170 /* Flow Control Transmit Timer Value - RW */ ++#define E1000_TXCW 0x00178 /* Tx Configuration Word - RW */ ++#define E1000_RXCW 0x00180 /* Rx Configuration Word - RO */ ++#define E1000_TCTL 0x00400 /* Tx Control - RW */ ++#define E1000_TCTL_EXT 0x00404 /* Extended Tx Control - RW */ ++#define E1000_TIPG 0x00410 /* Tx Inter-packet gap -RW */ ++#define E1000_TBT 0x00448 /* Tx Burst Timer - RW */ ++#define E1000_AIT 0x00458 /* Adaptive Interframe Spacing Throttle - RW */ ++#define E1000_LEDCTL 0x00E00 /* LED Control - RW */ ++#define E1000_EXTCNF_CTRL 0x00F00 /* Extended Configuration Control */ ++#define E1000_EXTCNF_SIZE 0x00F08 /* Extended Configuration Size */ ++#define E1000_PHY_CTRL 0x00F10 /* PHY Control Register in CSR */ ++#define E1000_PBA 0x01000 /* Packet Buffer Allocation - RW */ ++#define E1000_PBS 0x01008 /* Packet Buffer Size */ ++#define E1000_EEMNGCTL 0x01010 /* MNG EEprom Control */ ++#define E1000_EEARBC 0x01024 /* EEPROM Auto Read Bus Control */ ++#define E1000_FLASHT 0x01028 /* FLASH Timer Register */ ++#define E1000_EEWR 0x0102C /* EEPROM Write Register - RW */ ++#define E1000_FLSWCTL 0x01030 /* FLASH control register */ ++#define E1000_FLSWDATA 0x01034 /* FLASH data register */ ++#define E1000_FLSWCNT 0x01038 /* FLASH Access Counter */ ++#define E1000_FLOP 0x0103C /* FLASH Opcode Register */ ++#define E1000_I2CCMD 0x01028 /* SFPI2C Command Register - RW */ ++#define E1000_I2CPARAMS 0x0102C /* SFPI2C Parameters Register - RW */ ++#define E1000_WDSTP 0x01040 /* Watchdog Setup - RW */ ++#define E1000_SWDSTS 0x01044 /* SW Device Status - RW */ ++#define E1000_FRTIMER 0x01048 /* Free Running Timer - RW */ ++#define E1000_ERT 0x02008 /* Early Rx Threshold - RW */ ++#define E1000_FCRTL 0x02160 /* Flow Control Receive Threshold Low - RW */ ++#define E1000_FCRTH 0x02168 /* Flow Control Receive Threshold High - RW */ ++#define E1000_PSRCTL 0x02170 /* Packet Split Receive Control - RW */ ++#define E1000_RDFPCQ(_n) (0x02430 + (0x4 * (_n))) ++#define E1000_PBRTH 0x02458 /* PB Rx Arbitration Threshold - RW */ ++#define E1000_FCRTV 0x02460 /* Flow Control Refresh Timer Value - RW */ ++/* Split and Replication Rx Control - RW */ ++#define E1000_RDPUMB 0x025CC /* DMA Rx Descriptor uC Mailbox - RW */ ++#define E1000_RDPUAD 0x025D0 /* DMA Rx Descriptor uC Addr Command - RW */ ++#define E1000_RDPUWD 0x025D4 /* DMA Rx Descriptor uC Data Write - RW */ ++#define E1000_RDPURD 0x025D8 /* DMA Rx Descriptor uC Data Read - RW */ ++#define E1000_RDPUCTL 0x025DC /* DMA Rx Descriptor uC Control - RW */ ++#define E1000_RXCTL(_n) (0x0C014 + (0x40 * (_n))) ++#define E1000_RQDPC(_n) (0x0C030 + (0x40 * (_n))) ++#define E1000_RDTR 0x02820 /* Rx Delay Timer - RW */ ++#define E1000_RADV 0x0282C /* Rx Interrupt Absolute Delay Timer - RW */ ++/* ++ * Convenience macros ++ * ++ * Note: "_n" is the queue number of the register to be written to. ++ * ++ * Example usage: ++ * E1000_RDBAL_REG(current_rx_queue) ++ */ ++#define E1000_RDBAL(_n) ((_n) < 4 ? (0x02800 + ((_n) * 0x100)) : \ ++ (0x0C000 + ((_n) * 0x40))) ++#define E1000_RDBAH(_n) ((_n) < 4 ? (0x02804 + ((_n) * 0x100)) : \ ++ (0x0C004 + ((_n) * 0x40))) ++#define E1000_RDLEN(_n) ((_n) < 4 ? (0x02808 + ((_n) * 0x100)) : \ ++ (0x0C008 + ((_n) * 0x40))) ++#define E1000_SRRCTL(_n) ((_n) < 4 ? (0x0280C + ((_n) * 0x100)) : \ ++ (0x0C00C + ((_n) * 0x40))) ++#define E1000_RDH(_n) ((_n) < 4 ? (0x02810 + ((_n) * 0x100)) : \ ++ (0x0C010 + ((_n) * 0x40))) ++#define E1000_RDT(_n) ((_n) < 4 ? (0x02818 + ((_n) * 0x100)) : \ ++ (0x0C018 + ((_n) * 0x40))) ++#define E1000_RXDCTL(_n) ((_n) < 4 ? (0x02828 + ((_n) * 0x100)) : \ ++ (0x0C028 + ((_n) * 0x40))) ++#define E1000_TDBAL(_n) ((_n) < 4 ? (0x03800 + ((_n) * 0x100)) : \ ++ (0x0E000 + ((_n) * 0x40))) ++#define E1000_TDBAH(_n) ((_n) < 4 ? (0x03804 + ((_n) * 0x100)) : \ ++ (0x0E004 + ((_n) * 0x40))) ++#define E1000_TDLEN(_n) ((_n) < 4 ? (0x03808 + ((_n) * 0x100)) : \ ++ (0x0E008 + ((_n) * 0x40))) ++#define E1000_TDH(_n) ((_n) < 4 ? (0x03810 + ((_n) * 0x100)) : \ ++ (0x0E010 + ((_n) * 0x40))) ++#define E1000_TDT(_n) ((_n) < 4 ? (0x03818 + ((_n) * 0x100)) : \ ++ (0x0E018 + ((_n) * 0x40))) ++#define E1000_TXDCTL(_n) ((_n) < 4 ? (0x03828 + ((_n) * 0x100)) : \ ++ (0x0E028 + ((_n) * 0x40))) ++#define E1000_TARC(_n) (0x03840 + (_n << 8)) ++#define E1000_DCA_TXCTRL(_n) (0x03814 + (_n << 8)) ++#define E1000_DCA_RXCTRL(_n) (0x02814 + (_n << 8)) ++#define E1000_TDWBAL(_n) ((_n) < 4 ? (0x03838 + ((_n) * 0x100)) : \ ++ (0x0E038 + ((_n) * 0x40))) ++#define E1000_TDWBAH(_n) ((_n) < 4 ? (0x0383C + ((_n) * 0x100)) : \ ++ (0x0E03C + ((_n) * 0x40))) ++#define E1000_RSRPD 0x02C00 /* Rx Small Packet Detect - RW */ ++#define E1000_RAID 0x02C08 /* Receive Ack Interrupt Delay - RW */ ++#define E1000_TXDMAC 0x03000 /* Tx DMA Control - RW */ ++#define E1000_KABGTXD 0x03004 /* AFE Band Gap Transmit Ref Data */ ++#define E1000_PSRTYPE(_i) (0x05480 + ((_i) * 4)) ++#define E1000_RAL(_i) (((_i) <= 15) ? (0x05400 + ((_i) * 8)) : \ ++ (0x054E0 + ((_i - 16) * 8))) ++#define E1000_RAH(_i) (((_i) <= 15) ? (0x05404 + ((_i) * 8)) : \ ++ (0x054E4 + ((_i - 16) * 8))) ++#define E1000_IP4AT_REG(_i) (0x05840 + ((_i) * 8)) ++#define E1000_IP6AT_REG(_i) (0x05880 + ((_i) * 4)) ++#define E1000_WUPM_REG(_i) (0x05A00 + ((_i) * 4)) ++#define E1000_FFMT_REG(_i) (0x09000 + ((_i) * 8)) ++#define E1000_FFVT_REG(_i) (0x09800 + ((_i) * 8)) ++#define E1000_FFLT_REG(_i) (0x05F00 + ((_i) * 8)) ++#define E1000_TDFH 0x03410 /* Tx Data FIFO Head - RW */ ++#define E1000_TDFT 0x03418 /* Tx Data FIFO Tail - RW */ ++#define E1000_TDFHS 0x03420 /* Tx Data FIFO Head Saved - RW */ ++#define E1000_TDFTS 0x03428 /* Tx Data FIFO Tail Saved - RW */ ++#define E1000_TDFPC 0x03430 /* Tx Data FIFO Packet Count - RW */ ++#define E1000_TDPUMB 0x0357C /* DMA Tx Descriptor uC Mail Box - RW */ ++#define E1000_TDPUAD 0x03580 /* DMA Tx Descriptor uC Addr Command - RW */ ++#define E1000_TDPUWD 0x03584 /* DMA Tx Descriptor uC Data Write - RW */ ++#define E1000_TDPURD 0x03588 /* DMA Tx Descriptor uC Data Read - RW */ ++#define E1000_TDPUCTL 0x0358C /* DMA Tx Descriptor uC Control - RW */ ++#define E1000_DTXCTL 0x03590 /* DMA Tx Control - RW */ ++#define E1000_TIDV 0x03820 /* Tx Interrupt Delay Value - RW */ ++#define E1000_TADV 0x0382C /* Tx Interrupt Absolute Delay Val - RW */ ++#define E1000_TSPMT 0x03830 /* TCP Segmentation PAD & Min Threshold - RW */ ++#define E1000_CRCERRS 0x04000 /* CRC Error Count - R/clr */ ++#define E1000_ALGNERRC 0x04004 /* Alignment Error Count - R/clr */ ++#define E1000_SYMERRS 0x04008 /* Symbol Error Count - R/clr */ ++#define E1000_RXERRC 0x0400C /* Receive Error Count - R/clr */ ++#define E1000_MPC 0x04010 /* Missed Packet Count - R/clr */ ++#define E1000_SCC 0x04014 /* Single Collision Count - R/clr */ ++#define E1000_ECOL 0x04018 /* Excessive Collision Count - R/clr */ ++#define E1000_MCC 0x0401C /* Multiple Collision Count - R/clr */ ++#define E1000_LATECOL 0x04020 /* Late Collision Count - R/clr */ ++#define E1000_COLC 0x04028 /* Collision Count - R/clr */ ++#define E1000_DC 0x04030 /* Defer Count - R/clr */ ++#define E1000_TNCRS 0x04034 /* Tx-No CRS - R/clr */ ++#define E1000_SEC 0x04038 /* Sequence Error Count - R/clr */ ++#define E1000_CEXTERR 0x0403C /* Carrier Extension Error Count - R/clr */ ++#define E1000_RLEC 0x04040 /* Receive Length Error Count - R/clr */ ++#define E1000_XONRXC 0x04048 /* XON Rx Count - R/clr */ ++#define E1000_XONTXC 0x0404C /* XON Tx Count - R/clr */ ++#define E1000_XOFFRXC 0x04050 /* XOFF Rx Count - R/clr */ ++#define E1000_XOFFTXC 0x04054 /* XOFF Tx Count - R/clr */ ++#define E1000_FCRUC 0x04058 /* Flow Control Rx Unsupported Count- R/clr */ ++#define E1000_PRC64 0x0405C /* Packets Rx (64 bytes) - R/clr */ ++#define E1000_PRC127 0x04060 /* Packets Rx (65-127 bytes) - R/clr */ ++#define E1000_PRC255 0x04064 /* Packets Rx (128-255 bytes) - R/clr */ ++#define E1000_PRC511 0x04068 /* Packets Rx (255-511 bytes) - R/clr */ ++#define E1000_PRC1023 0x0406C /* Packets Rx (512-1023 bytes) - R/clr */ ++#define E1000_PRC1522 0x04070 /* Packets Rx (1024-1522 bytes) - R/clr */ ++#define E1000_GPRC 0x04074 /* Good Packets Rx Count - R/clr */ ++#define E1000_BPRC 0x04078 /* Broadcast Packets Rx Count - R/clr */ ++#define E1000_MPRC 0x0407C /* Multicast Packets Rx Count - R/clr */ ++#define E1000_GPTC 0x04080 /* Good Packets Tx Count - R/clr */ ++#define E1000_GORCL 0x04088 /* Good Octets Rx Count Low - R/clr */ ++#define E1000_GORCH 0x0408C /* Good Octets Rx Count High - R/clr */ ++#define E1000_GOTCL 0x04090 /* Good Octets Tx Count Low - R/clr */ ++#define E1000_GOTCH 0x04094 /* Good Octets Tx Count High - R/clr */ ++#define E1000_RNBC 0x040A0 /* Rx No Buffers Count - R/clr */ ++#define E1000_RUC 0x040A4 /* Rx Undersize Count - R/clr */ ++#define E1000_RFC 0x040A8 /* Rx Fragment Count - R/clr */ ++#define E1000_ROC 0x040AC /* Rx Oversize Count - R/clr */ ++#define E1000_RJC 0x040B0 /* Rx Jabber Count - R/clr */ ++#define E1000_MGTPRC 0x040B4 /* Management Packets Rx Count - R/clr */ ++#define E1000_MGTPDC 0x040B8 /* Management Packets Dropped Count - R/clr */ ++#define E1000_MGTPTC 0x040BC /* Management Packets Tx Count - R/clr */ ++#define E1000_TORL 0x040C0 /* Total Octets Rx Low - R/clr */ ++#define E1000_TORH 0x040C4 /* Total Octets Rx High - R/clr */ ++#define E1000_TOTL 0x040C8 /* Total Octets Tx Low - R/clr */ ++#define E1000_TOTH 0x040CC /* Total Octets Tx High - R/clr */ ++#define E1000_TPR 0x040D0 /* Total Packets Rx - R/clr */ ++#define E1000_TPT 0x040D4 /* Total Packets Tx - R/clr */ ++#define E1000_PTC64 0x040D8 /* Packets Tx (64 bytes) - R/clr */ ++#define E1000_PTC127 0x040DC /* Packets Tx (65-127 bytes) - R/clr */ ++#define E1000_PTC255 0x040E0 /* Packets Tx (128-255 bytes) - R/clr */ ++#define E1000_PTC511 0x040E4 /* Packets Tx (256-511 bytes) - R/clr */ ++#define E1000_PTC1023 0x040E8 /* Packets Tx (512-1023 bytes) - R/clr */ ++#define E1000_PTC1522 0x040EC /* Packets Tx (1024-1522 Bytes) - R/clr */ ++#define E1000_MPTC 0x040F0 /* Multicast Packets Tx Count - R/clr */ ++#define E1000_BPTC 0x040F4 /* Broadcast Packets Tx Count - R/clr */ ++#define E1000_TSCTC 0x040F8 /* TCP Segmentation Context Tx - R/clr */ ++#define E1000_TSCTFC 0x040FC /* TCP Segmentation Context Tx Fail - R/clr */ ++#define E1000_IAC 0x04100 /* Interrupt Assertion Count */ ++#define E1000_ICRXPTC 0x04104 /* Interrupt Cause Rx Pkt Timer Expire Count */ ++#define E1000_ICRXATC 0x04108 /* Interrupt Cause Rx Abs Timer Expire Count */ ++#define E1000_ICTXPTC 0x0410C /* Interrupt Cause Tx Pkt Timer Expire Count */ ++#define E1000_ICTXATC 0x04110 /* Interrupt Cause Tx Abs Timer Expire Count */ ++#define E1000_ICTXQEC 0x04118 /* Interrupt Cause Tx Queue Empty Count */ ++#define E1000_ICTXQMTC 0x0411C /* Interrupt Cause Tx Queue Min Thresh Count */ ++#define E1000_ICRXDMTC 0x04120 /* Interrupt Cause Rx Desc Min Thresh Count */ ++#define E1000_ICRXOC 0x04124 /* Interrupt Cause Receiver Overrun Count */ ++ ++#define E1000_PCS_CFG0 0x04200 /* PCS Configuration 0 - RW */ ++#define E1000_PCS_LCTL 0x04208 /* PCS Link Control - RW */ ++#define E1000_PCS_LSTAT 0x0420C /* PCS Link Status - RO */ ++#define E1000_CBTMPC 0x0402C /* Circuit Breaker Tx Packet Count */ ++#define E1000_HTDPMC 0x0403C /* Host Transmit Discarded Packets */ ++#define E1000_CBRDPC 0x04044 /* Circuit Breaker Rx Dropped Count */ ++#define E1000_CBRMPC 0x040FC /* Circuit Breaker Rx Packet Count */ ++#define E1000_RPTHC 0x04104 /* Rx Packets To Host */ ++#define E1000_HGPTC 0x04118 /* Host Good Packets Tx Count */ ++#define E1000_HTCBDPC 0x04124 /* Host Tx Circuit Breaker Dropped Count */ ++#define E1000_HGORCL 0x04128 /* Host Good Octets Received Count Low */ ++#define E1000_HGORCH 0x0412C /* Host Good Octets Received Count High */ ++#define E1000_HGOTCL 0x04130 /* Host Good Octets Transmit Count Low */ ++#define E1000_HGOTCH 0x04134 /* Host Good Octets Transmit Count High */ ++#define E1000_LENERRS 0x04138 /* Length Errors Count */ ++#define E1000_SCVPC 0x04228 /* SerDes/SGMII Code Violation Pkt Count */ ++#define E1000_HRMPC 0x0A018 /* Header Redirection Missed Packet Count */ ++#define E1000_PCS_ANADV 0x04218 /* AN advertisement - RW */ ++#define E1000_PCS_LPAB 0x0421C /* Link Partner Ability - RW */ ++#define E1000_PCS_NPTX 0x04220 /* AN Next Page Transmit - RW */ ++#define E1000_PCS_LPABNP 0x04224 /* Link Partner Ability Next Page - RW */ ++#define E1000_1GSTAT_RCV 0x04228 /* 1GSTAT Code Violation Packet Count - RW */ ++#define E1000_RXCSUM 0x05000 /* Rx Checksum Control - RW */ ++#define E1000_RLPML 0x05004 /* Rx Long Packet Max Length */ ++#define E1000_RFCTL 0x05008 /* Receive Filter Control*/ ++#define E1000_MTA 0x05200 /* Multicast Table Array - RW Array */ ++#define E1000_RA 0x05400 /* Receive Address - RW Array */ ++#define E1000_VFTA 0x05600 /* VLAN Filter Table Array - RW Array */ ++#define E1000_VT_CTL 0x0581C /* VMDq Control - RW */ ++#define E1000_VFQA0 0x0B000 /* VLAN Filter Queue Array 0 - RW Array */ ++#define E1000_VFQA1 0x0B200 /* VLAN Filter Queue Array 1 - RW Array */ ++#define E1000_WUC 0x05800 /* Wakeup Control - RW */ ++#define E1000_WUFC 0x05808 /* Wakeup Filter Control - RW */ ++#define E1000_WUS 0x05810 /* Wakeup Status - RO */ ++#define E1000_MANC 0x05820 /* Management Control - RW */ ++#define E1000_IPAV 0x05838 /* IP Address Valid - RW */ ++#define E1000_IP4AT 0x05840 /* IPv4 Address Table - RW Array */ ++#define E1000_IP6AT 0x05880 /* IPv6 Address Table - RW Array */ ++#define E1000_WUPL 0x05900 /* Wakeup Packet Length - RW */ ++#define E1000_WUPM 0x05A00 /* Wakeup Packet Memory - RO A */ ++#define E1000_PBACL 0x05B68 /* MSIx PBA Clear - Read/Write 1's to clear */ ++#define E1000_FFLT 0x05F00 /* Flexible Filter Length Table - RW Array */ ++#define E1000_HOST_IF 0x08800 /* Host Interface */ ++#define E1000_FFMT 0x09000 /* Flexible Filter Mask Table - RW Array */ ++#define E1000_FFVT 0x09800 /* Flexible Filter Value Table - RW Array */ ++ ++#define E1000_KMRNCTRLSTA 0x00034 /* MAC-PHY interface - RW */ ++#define E1000_MDPHYA 0x0003C /* PHY address - RW */ ++#define E1000_MANC2H 0x05860 /* Management Control To Host - RW */ ++#define E1000_SW_FW_SYNC 0x05B5C /* Software-Firmware Synchronization - RW */ ++#define E1000_CCMCTL 0x05B48 /* CCM Control Register */ ++#define E1000_GIOCTL 0x05B44 /* GIO Analog Control Register */ ++#define E1000_SCCTL 0x05B4C /* PCIc PLL Configuration Register */ ++#define E1000_GCR 0x05B00 /* PCI-Ex Control */ ++#define E1000_GCR2 0x05B64 /* PCI-Ex Control #2 */ ++#define E1000_GSCL_1 0x05B10 /* PCI-Ex Statistic Control #1 */ ++#define E1000_GSCL_2 0x05B14 /* PCI-Ex Statistic Control #2 */ ++#define E1000_GSCL_3 0x05B18 /* PCI-Ex Statistic Control #3 */ ++#define E1000_GSCL_4 0x05B1C /* PCI-Ex Statistic Control #4 */ ++#define E1000_FACTPS 0x05B30 /* Function Active and Power State to MNG */ ++#define E1000_SWSM 0x05B50 /* SW Semaphore */ ++#define E1000_FWSM 0x05B54 /* FW Semaphore */ ++#define E1000_SWSM2 0x05B58 /* Driver-only SW semaphore (not used by BOOT agents) */ ++#define E1000_DCA_ID 0x05B70 /* DCA Requester ID Information - RO */ ++#define E1000_DCA_CTRL 0x05B74 /* DCA Control - RW */ ++#define E1000_FFLT_DBG 0x05F04 /* Debug Register */ ++#define E1000_HICR 0x08F00 /* Host Interface Control */ ++ ++/* RSS registers */ ++#define E1000_CPUVEC 0x02C10 /* CPU Vector Register - RW */ ++#define E1000_MRQC 0x05818 /* Multiple Receive Control - RW */ ++#define E1000_IMIR(_i) (0x05A80 + ((_i) * 4)) /* Immediate Interrupt */ ++#define E1000_IMIREXT(_i) (0x05AA0 + ((_i) * 4)) /* Immediate Interrupt Ext*/ ++#define E1000_IMIRVP 0x05AC0 /* Immediate Interrupt Rx VLAN Priority - RW */ ++#define E1000_MSIXBM(_i) (0x01600 + ((_i) * 4)) /* MSI-X Allocation Register ++ * (_i) - RW */ ++#define E1000_MSIXTADD(_i) (0x0C000 + ((_i) * 0x10)) /* MSI-X Table entry addr ++ * low reg - RW */ ++#define E1000_MSIXTUADD(_i) (0x0C004 + ((_i) * 0x10)) /* MSI-X Table entry addr ++ * upper reg - RW */ ++#define E1000_MSIXTMSG(_i) (0x0C008 + ((_i) * 0x10)) /* MSI-X Table entry ++ * message reg - RW */ ++#define E1000_MSIXVCTRL(_i) (0x0C00C + ((_i) * 0x10)) /* MSI-X Table entry ++ * vector ctrl reg - RW */ ++#define E1000_MSIXPBA 0x0E000 /* MSI-X Pending bit array */ ++#define E1000_RETA(_i) (0x05C00 + ((_i) * 4)) /* Redirection Table - RW */ ++#define E1000_RSSRK(_i) (0x05C80 + ((_i) * 4)) /* RSS Random Key - RW */ ++#define E1000_RSSIM 0x05864 /* RSS Interrupt Mask */ ++#define E1000_RSSIR 0x05868 /* RSS Interrupt Request */ ++ ++#endif +diff -r d03036c09699 drivers/net/e1000/kcompat.c +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/e1000/kcompat.c Mon Jun 15 11:43:11 2009 +0100 +@@ -0,0 +1,488 @@ ++/******************************************************************************* ++ ++ Intel PRO/1000 Linux driver ++ Copyright(c) 1999 - 2008 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ Linux NICS ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++#include "e1000.h" ++#include "kcompat.h" ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,21) ) ++struct sk_buff * ++_kc_skb_pad(struct sk_buff *skb, int pad) ++{ ++ struct sk_buff *nskb; ++ ++ /* If the skbuff is non linear tailroom is always zero.. */ ++ if(skb_tailroom(skb) >= pad) ++ { ++ memset(skb->data+skb->len, 0, pad); ++ return skb; ++ } ++ ++ nskb = skb_copy_expand(skb, skb_headroom(skb), skb_tailroom(skb) + pad, GFP_ATOMIC); ++ kfree_skb(skb); ++ if(nskb) ++ memset(nskb->data+nskb->len, 0, pad); ++ return nskb; ++} ++#endif /* < 2.4.21 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,13) ) ++ ++/**************************************/ ++/* PCI DMA MAPPING */ ++ ++#if defined(CONFIG_HIGHMEM) ++ ++#ifndef PCI_DRAM_OFFSET ++#define PCI_DRAM_OFFSET 0 ++#endif ++ ++u64 ++_kc_pci_map_page(struct pci_dev *dev, struct page *page, unsigned long offset, ++ size_t size, int direction) ++{ ++ return (((u64) (page - mem_map) << PAGE_SHIFT) + offset + ++ PCI_DRAM_OFFSET); ++} ++ ++#else /* CONFIG_HIGHMEM */ ++ ++u64 ++_kc_pci_map_page(struct pci_dev *dev, struct page *page, unsigned long offset, ++ size_t size, int direction) ++{ ++ return pci_map_single(dev, (void *)page_address(page) + offset, size, ++ direction); ++} ++ ++#endif /* CONFIG_HIGHMEM */ ++ ++void ++_kc_pci_unmap_page(struct pci_dev *dev, u64 dma_addr, size_t size, ++ int direction) ++{ ++ return pci_unmap_single(dev, dma_addr, size, direction); ++} ++ ++#endif /* 2.4.13 => 2.4.3 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,3) ) ++ ++/**************************************/ ++/* PCI DRIVER API */ ++ ++int ++_kc_pci_set_dma_mask(struct pci_dev *dev, dma_addr_t mask) ++{ ++ if (!pci_dma_supported(dev, mask)) ++ return -EIO; ++ dev->dma_mask = mask; ++ return 0; ++} ++ ++int ++_kc_pci_request_regions(struct pci_dev *dev, char *res_name) ++{ ++ int i; ++ ++ for (i = 0; i < 6; i++) { ++ if (pci_resource_len(dev, i) == 0) ++ continue; ++ ++ if (pci_resource_flags(dev, i) & IORESOURCE_IO) { ++ if (!request_region(pci_resource_start(dev, i), pci_resource_len(dev, i), res_name)) { ++ pci_release_regions(dev); ++ return -EBUSY; ++ } ++ } else if (pci_resource_flags(dev, i) & IORESOURCE_MEM) { ++ if (!request_mem_region(pci_resource_start(dev, i), pci_resource_len(dev, i), res_name)) { ++ pci_release_regions(dev); ++ return -EBUSY; ++ } ++ } ++ } ++ return 0; ++} ++ ++void ++_kc_pci_release_regions(struct pci_dev *dev) ++{ ++ int i; ++ ++ for (i = 0; i < 6; i++) { ++ if (pci_resource_len(dev, i) == 0) ++ continue; ++ ++ if (pci_resource_flags(dev, i) & IORESOURCE_IO) ++ release_region(pci_resource_start(dev, i), pci_resource_len(dev, i)); ++ ++ else if (pci_resource_flags(dev, i) & IORESOURCE_MEM) ++ release_mem_region(pci_resource_start(dev, i), pci_resource_len(dev, i)); ++ } ++} ++ ++/**************************************/ ++/* NETWORK DRIVER API */ ++ ++struct net_device * ++_kc_alloc_etherdev(int sizeof_priv) ++{ ++ struct net_device *dev; ++ int alloc_size; ++ ++ alloc_size = sizeof(*dev) + sizeof_priv + IFNAMSIZ + 31; ++ dev = kmalloc(alloc_size, GFP_KERNEL); ++ if (!dev) ++ return NULL; ++ memset(dev, 0, alloc_size); ++ ++ if (sizeof_priv) ++ dev->priv = (void *) (((unsigned long)(dev + 1) + 31) & ~31); ++ dev->name[0] = '\0'; ++ ether_setup(dev); ++ ++ return dev; ++} ++ ++int ++_kc_is_valid_ether_addr(u8 *addr) ++{ ++ const char zaddr[6] = { 0, }; ++ ++ return !(addr[0] & 1) && memcmp(addr, zaddr, 6); ++} ++ ++#endif /* 2.4.3 => 2.4.0 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,6) ) ++ ++int ++_kc_pci_set_power_state(struct pci_dev *dev, int state) ++{ ++ return 0; ++} ++ ++int ++_kc_pci_enable_wake(struct pci_dev *pdev, u32 state, int enable) ++{ ++ return 0; ++} ++ ++#endif /* 2.4.6 => 2.4.3 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) ) ++void _kc_skb_fill_page_desc(struct sk_buff *skb, int i, struct page *page, ++ int off, int size) ++{ ++ skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; ++ frag->page = page; ++ frag->page_offset = off; ++ frag->size = size; ++ skb_shinfo(skb)->nr_frags = i + 1; ++} ++ ++/* ++ * Original Copyright: ++ * find_next_bit.c: fallback find next bit implementation ++ * ++ * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. ++ * Written by David Howells (dhowells@redhat.com) ++ */ ++ ++/** ++ * find_next_bit - find the next set bit in a memory region ++ * @addr: The address to base the search on ++ * @offset: The bitnumber to start searching at ++ * @size: The maximum size to search ++ */ ++unsigned long find_next_bit(const unsigned long *addr, unsigned long size, ++ unsigned long offset) ++{ ++ const unsigned long *p = addr + BITOP_WORD(offset); ++ unsigned long result = offset & ~(BITS_PER_LONG-1); ++ unsigned long tmp; ++ ++ if (offset >= size) ++ return size; ++ size -= result; ++ offset %= BITS_PER_LONG; ++ if (offset) { ++ tmp = *(p++); ++ tmp &= (~0UL << offset); ++ if (size < BITS_PER_LONG) ++ goto found_first; ++ if (tmp) ++ goto found_middle; ++ size -= BITS_PER_LONG; ++ result += BITS_PER_LONG; ++ } ++ while (size & ~(BITS_PER_LONG-1)) { ++ if ((tmp = *(p++))) ++ goto found_middle; ++ result += BITS_PER_LONG; ++ size -= BITS_PER_LONG; ++ } ++ if (!size) ++ return result; ++ tmp = *p; ++ ++found_first: ++ tmp &= (~0UL >> (BITS_PER_LONG - size)); ++ if (tmp == 0UL) /* Are any bits set? */ ++ return result + size; /* Nope. */ ++found_middle: ++ return result + ffs(tmp); ++} ++ ++#endif /* 2.6.0 => 2.4.6 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,14) ) ++void *_kc_kzalloc(size_t size, int flags) ++{ ++ void *ret = kmalloc(size, flags); ++ if (ret) ++ memset(ret, 0, size); ++ return ret; ++} ++#endif /* <= 2.6.13 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18) ) ++struct sk_buff *_kc_netdev_alloc_skb(struct net_device *dev, ++ unsigned int length) ++{ ++ /* 16 == NET_PAD_SKB */ ++ struct sk_buff *skb; ++ skb = alloc_skb(length + 16, GFP_ATOMIC); ++ if (likely(skb != NULL)) { ++ skb_reserve(skb, 16); ++ skb->dev = dev; ++ } ++ return skb; ++} ++#endif /* <= 2.6.17 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) ) ++int _kc_pci_save_state(struct pci_dev *pdev) ++{ ++ struct net_device *netdev = pci_get_drvdata(pdev); ++ struct adapter_struct *adapter = netdev_priv(netdev); ++ int size = PCI_CONFIG_SPACE_LEN, i; ++ u16 pcie_cap_offset = pci_find_capability(pdev, PCI_CAP_ID_EXP); ++ u16 pcie_link_status; ++ ++ if (pcie_cap_offset) { ++ if (!pci_read_config_word(pdev, ++ pcie_cap_offset + PCIE_LINK_STATUS, ++ &pcie_link_status)) ++ size = PCIE_CONFIG_SPACE_LEN; ++ } ++ pci_config_space_ich8lan(); ++#ifdef HAVE_PCI_ERS ++ if (adapter->config_space == NULL) ++#else ++ WARN_ON(adapter->config_space != NULL); ++#endif ++ adapter->config_space = kmalloc(size, GFP_KERNEL); ++ if (!adapter->config_space) { ++ printk(KERN_ERR "Out of memory in pci_save_state\n"); ++ return -ENOMEM; ++ } ++ for (i = 0; i < (size / 4); i++) ++ pci_read_config_dword(pdev, i * 4, &adapter->config_space[i]); ++ return 0; ++} ++ ++void _kc_pci_restore_state(struct pci_dev * pdev) ++{ ++ struct net_device *netdev = pci_get_drvdata(pdev); ++ struct adapter_struct *adapter = netdev_priv(netdev); ++ int size = PCI_CONFIG_SPACE_LEN, i; ++ u16 pcie_cap_offset; ++ u16 pcie_link_status; ++ ++ if (adapter->config_space != NULL) { ++ pcie_cap_offset = pci_find_capability(pdev, PCI_CAP_ID_EXP); ++ if (pcie_cap_offset && ++ !pci_read_config_word(pdev, ++ pcie_cap_offset + PCIE_LINK_STATUS, ++ &pcie_link_status)) ++ size = PCIE_CONFIG_SPACE_LEN; ++ ++ pci_config_space_ich8lan(); ++ for (i = 0; i < (size / 4); i++) ++ pci_write_config_dword(pdev, i * 4, adapter->config_space[i]); ++#ifndef HAVE_PCI_ERS ++ kfree(adapter->config_space); ++ adapter->config_space = NULL; ++#endif ++ } ++} ++ ++#ifdef HAVE_PCI_ERS ++void _kc_free_netdev(struct net_device *netdev) ++{ ++ struct adapter_struct *adapter = netdev_priv(netdev); ++ ++ if (adapter->config_space != NULL) ++ kfree(adapter->config_space); ++#ifdef CONFIG_SYSFS ++ if (netdev->reg_state == NETREG_UNINITIALIZED) { ++ kfree((char *)netdev - netdev->padded); ++ } else { ++ BUG_ON(netdev->reg_state != NETREG_UNREGISTERED); ++ netdev->reg_state = NETREG_RELEASED; ++ class_device_put(&netdev->class_dev); ++ } ++#else ++ kfree((char *)netdev - netdev->padded); ++#endif ++} ++#endif ++#endif /* <= 2.6.18 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) ) ++#ifdef NAPI ++/* this function returns the true netdev of the napi struct */ ++struct net_device * napi_to_netdev(struct napi_struct *napi) ++{ ++ struct adapter_q_vector *q_vector = container_of(napi, ++ struct adapter_q_vector, ++ napi); ++ struct adapter_struct *adapter = q_vector->adapter; ++ ++ return adapter->netdev; ++} ++ ++int _kc_napi_schedule_prep(struct napi_struct *napi) ++{ ++ return (netif_running(napi_to_netdev(napi)) && ++ netif_rx_schedule_prep(napi_to_poll_dev(napi))); ++} ++ ++int __kc_adapter_clean(struct net_device *netdev, int *budget) ++{ ++ int work_done; ++ int work_to_do = min(*budget, netdev->quota); ++ struct adapter_struct *adapter = netdev_priv(netdev); ++ struct napi_struct *napi = &adapter->rx_ring[0].napi; ++ work_done = napi->poll(napi, work_to_do); ++ *budget -= work_done; ++ netdev->quota -= work_done; ++ return (work_done >= work_to_do) ? 1 : 0; ++} ++#endif /* NAPI */ ++#endif /* <= 2.6.24 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27) ) ++#ifdef HAVE_TX_MQ ++void _kc_netif_tx_stop_all_queues(struct net_device *netdev) ++{ ++ struct adapter_struct *adapter = netdev_priv(netdev); ++ int i; ++ ++ netif_stop_queue(netdev); ++ if (netif_is_multiqueue(netdev)) ++ for (i = 0; i < adapter->num_tx_queues; i++) ++ netif_stop_subqueue(netdev, i); ++} ++void _kc_netif_tx_wake_all_queues(struct net_device *netdev) ++{ ++ struct adapter_struct *adapter = netdev_priv(netdev); ++ int i; ++ ++ netif_wake_queue(netdev); ++ if (netif_is_multiqueue(netdev)) ++ for (i = 0; i < adapter->num_tx_queues; i++) ++ netif_wake_subqueue(netdev, i); ++} ++void _kc_netif_tx_start_all_queues(struct net_device *netdev) ++{ ++ struct adapter_struct *adapter = netdev_priv(netdev); ++ int i; ++ ++ netif_start_queue(netdev); ++ if (netif_is_multiqueue(netdev)) ++ for (i = 0; i < adapter->num_tx_queues; i++) ++ netif_start_subqueue(netdev, i); ++} ++#endif /* HAVE_TX_MQ */ ++#endif /* < 2.6.27 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,28) ) ++ ++int ++_kc_pci_prepare_to_sleep(struct pci_dev *dev) ++{ ++ pci_power_t target_state; ++ int error; ++ ++ target_state = pci_choose_state(dev, PMSG_SUSPEND); ++ ++ pci_enable_wake(dev, target_state, true); ++ ++ error = pci_set_power_state(dev, target_state); ++ ++ if (error) ++ pci_enable_wake(dev, target_state, false); ++ ++ return error; ++} ++ ++int ++_kc_pci_wake_from_d3(struct pci_dev *dev, bool enable) ++{ ++ int err; ++ ++ err = pci_enable_wake(dev, PCI_D3cold, enable); ++ if (err) ++ goto out; ++ ++ err = pci_enable_wake(dev, PCI_D3hot, enable); ++ ++out: ++ return err; ++} ++#endif /* < 2.6.28 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29) ) ++#endif /* < 2.6.29 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30) ) ++#endif /* < 2.6.30 */ +diff -r d03036c09699 drivers/net/e1000/kcompat.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/e1000/kcompat.h Mon Jun 15 11:43:11 2009 +0100 +@@ -0,0 +1,1701 @@ ++/******************************************************************************* ++ ++ Intel PRO/1000 Linux driver ++ Copyright(c) 1999 - 2008 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ Linux NICS ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++#ifndef _KCOMPAT_H_ ++#define _KCOMPAT_H_ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++/* NAPI enable/disable flags here */ ++#ifdef CONFIG_E1000_NAPI ++#define NAPI ++#endif ++#ifdef E1000_NAPI ++#undef NAPI ++#define NAPI ++#endif ++#ifdef E1000_NO_NAPI ++#undef NAPI ++#endif ++ ++#define adapter_struct e1000_adapter ++#define adapter_q_vector e1000_rx_ring ++ ++/* and finally set defines so that the code sees the changes */ ++#ifdef NAPI ++#ifndef CONFIG_E1000_NAPI ++#define CONFIG_E1000_NAPI ++#endif ++#else ++#undef CONFIG_E1000_NAPI ++#endif /* NAPI */ ++ ++/* packet split disable/enable */ ++#ifdef DISABLE_PACKET_SPLIT ++#undef CONFIG_E1000_DISABLE_PACKET_SPLIT ++#define CONFIG_E1000_DISABLE_PACKET_SPLIT ++#undef CONFIG_IGB_DISABLE_PACKET_SPLIT ++#define CONFIG_IGB_DISABLE_PACKET_SPLIT ++#endif ++ ++/* MSI compatibility code for all kernels and drivers */ ++#ifdef DISABLE_PCI_MSI ++#undef CONFIG_PCI_MSI ++#endif ++#ifndef CONFIG_PCI_MSI ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,8) ) ++struct msix_entry { ++ u16 vector; /* kernel uses to write allocated vector */ ++ u16 entry; /* driver uses to specify entry, OS writes */ ++}; ++#endif ++#define pci_enable_msi(a) -ENOTSUPP ++#define pci_disable_msi(a) do {} while (0) ++#define pci_enable_msix(a, b, c) -ENOTSUPP ++#define pci_disable_msix(a) do {} while (0) ++#define msi_remove_pci_irq_vectors(a) do {} while (0) ++#endif /* CONFIG_PCI_MSI */ ++#ifdef DISABLE_PM ++#undef CONFIG_PM ++#endif ++ ++#ifdef DISABLE_NET_POLL_CONTROLLER ++#undef CONFIG_NET_POLL_CONTROLLER ++#endif ++ ++#ifndef PMSG_SUSPEND ++#define PMSG_SUSPEND 3 ++#endif ++ ++/* generic boolean compatibility */ ++#undef TRUE ++#undef FALSE ++#define TRUE true ++#define FALSE false ++#ifdef GCC_VERSION ++#if ( GCC_VERSION < 3000 ) ++#define _Bool char ++#endif ++#endif ++#ifndef bool ++#define bool _Bool ++#define true 1 ++#define false 0 ++#endif ++ ++ ++#ifndef module_param ++#define module_param(v,t,p) MODULE_PARM(v, "i"); ++#endif ++ ++#ifndef DMA_64BIT_MASK ++#define DMA_64BIT_MASK 0xffffffffffffffffULL ++#endif ++ ++#ifndef DMA_32BIT_MASK ++#define DMA_32BIT_MASK 0x00000000ffffffffULL ++#endif ++ ++#ifndef PCI_CAP_ID_EXP ++#define PCI_CAP_ID_EXP 0x10 ++#endif ++ ++#ifndef PCIE_LINK_STATE_L0S ++#define PCIE_LINK_STATE_L0S 1 ++#endif ++ ++#ifndef mmiowb ++#ifdef CONFIG_IA64 ++#define mmiowb() asm volatile ("mf.a" ::: "memory") ++#else ++#define mmiowb() ++#endif ++#endif ++ ++#ifndef SET_NETDEV_DEV ++#define SET_NETDEV_DEV(net, pdev) ++#endif ++ ++#ifndef HAVE_FREE_NETDEV ++#define free_netdev(x) kfree(x) ++#endif ++ ++#ifdef HAVE_POLL_CONTROLLER ++#define CONFIG_NET_POLL_CONTROLLER ++#endif ++ ++#ifndef NETDEV_TX_OK ++#define NETDEV_TX_OK 0 ++#endif ++ ++#ifndef NETDEV_TX_BUSY ++#define NETDEV_TX_BUSY 1 ++#endif ++ ++#ifndef NETDEV_TX_LOCKED ++#define NETDEV_TX_LOCKED -1 ++#endif ++ ++#ifndef SKB_DATAREF_SHIFT ++/* if we do not have the infrastructure to detect if skb_header is cloned ++ just return false in all cases */ ++#define skb_header_cloned(x) 0 ++#endif ++ ++#ifndef NETIF_F_GSO ++#define gso_size tso_size ++#define gso_segs tso_segs ++#endif ++ ++#ifndef NETIF_F_GRO ++#define vlan_gro_receive(_napi, _vlgrp, _vlan, _skb) \ ++ vlan_hwaccel_receive_skb(_skb, _vlgrp, _vlan) ++#define napi_gro_receive(_napi, _skb) netif_receive_skb(_skb) ++#endif ++ ++#ifndef CHECKSUM_PARTIAL ++#define CHECKSUM_PARTIAL CHECKSUM_HW ++#define CHECKSUM_COMPLETE CHECKSUM_HW ++#endif ++ ++#ifndef __read_mostly ++#define __read_mostly ++#endif ++ ++#ifndef HAVE_NETIF_MSG ++#define HAVE_NETIF_MSG 1 ++enum { ++ NETIF_MSG_DRV = 0x0001, ++ NETIF_MSG_PROBE = 0x0002, ++ NETIF_MSG_LINK = 0x0004, ++ NETIF_MSG_TIMER = 0x0008, ++ NETIF_MSG_IFDOWN = 0x0010, ++ NETIF_MSG_IFUP = 0x0020, ++ NETIF_MSG_RX_ERR = 0x0040, ++ NETIF_MSG_TX_ERR = 0x0080, ++ NETIF_MSG_TX_QUEUED = 0x0100, ++ NETIF_MSG_INTR = 0x0200, ++ NETIF_MSG_TX_DONE = 0x0400, ++ NETIF_MSG_RX_STATUS = 0x0800, ++ NETIF_MSG_PKTDATA = 0x1000, ++ NETIF_MSG_HW = 0x2000, ++ NETIF_MSG_WOL = 0x4000, ++}; ++ ++#else ++#define NETIF_MSG_HW 0x2000 ++#define NETIF_MSG_WOL 0x4000 ++#endif /* HAVE_NETIF_MSG */ ++ ++#ifndef MII_RESV1 ++#define MII_RESV1 0x17 /* Reserved... */ ++#endif ++ ++#ifndef unlikely ++#define unlikely(_x) _x ++#define likely(_x) _x ++#endif ++ ++#ifndef WARN_ON ++#define WARN_ON(x) ++#endif ++ ++#ifndef PCI_DEVICE ++#define PCI_DEVICE(vend,dev) \ ++ .vendor = (vend), .device = (dev), \ ++ .subvendor = PCI_ANY_ID, .subdevice = PCI_ANY_ID ++#endif ++ ++#ifndef num_online_cpus ++#define num_online_cpus() smp_num_cpus ++#endif ++ ++#ifndef _LINUX_RANDOM_H ++#include ++#endif ++ ++#ifndef DECLARE_BITMAP ++#ifndef BITS_TO_LONGS ++#define BITS_TO_LONGS(bits) (((bits)+BITS_PER_LONG-1)/BITS_PER_LONG) ++#endif ++#define DECLARE_BITMAP(name,bits) long name[BITS_TO_LONGS(bits)] ++#endif ++ ++#ifndef VLAN_HLEN ++#define VLAN_HLEN 4 ++#endif ++ ++#ifndef VLAN_ETH_HLEN ++#define VLAN_ETH_HLEN 18 ++#endif ++ ++#ifndef VLAN_ETH_FRAME_LEN ++#define VLAN_ETH_FRAME_LEN 1518 ++#endif ++ ++#ifndef DCA_GET_TAG_TWO_ARGS ++#define dca3_get_tag(a,b) dca_get_tag(b) ++#endif ++ ++ ++/*****************************************************************************/ ++/* Installations with ethtool version without eeprom, adapter id, or statistics ++ * support */ ++ ++#ifndef ETH_GSTRING_LEN ++#define ETH_GSTRING_LEN 32 ++#endif ++ ++#ifndef ETHTOOL_GSTATS ++#define ETHTOOL_GSTATS 0x1d ++#undef ethtool_drvinfo ++#define ethtool_drvinfo k_ethtool_drvinfo ++struct k_ethtool_drvinfo { ++ u32 cmd; ++ char driver[32]; ++ char version[32]; ++ char fw_version[32]; ++ char bus_info[32]; ++ char reserved1[32]; ++ char reserved2[16]; ++ u32 n_stats; ++ u32 testinfo_len; ++ u32 eedump_len; ++ u32 regdump_len; ++}; ++ ++struct ethtool_stats { ++ u32 cmd; ++ u32 n_stats; ++ u64 data[0]; ++}; ++#endif /* ETHTOOL_GSTATS */ ++ ++#ifndef ETHTOOL_PHYS_ID ++#define ETHTOOL_PHYS_ID 0x1c ++#endif /* ETHTOOL_PHYS_ID */ ++ ++#ifndef ETHTOOL_GSTRINGS ++#define ETHTOOL_GSTRINGS 0x1b ++enum ethtool_stringset { ++ ETH_SS_TEST = 0, ++ ETH_SS_STATS, ++}; ++struct ethtool_gstrings { ++ u32 cmd; /* ETHTOOL_GSTRINGS */ ++ u32 string_set; /* string set id e.c. ETH_SS_TEST, etc*/ ++ u32 len; /* number of strings in the string set */ ++ u8 data[0]; ++}; ++#endif /* ETHTOOL_GSTRINGS */ ++ ++#ifndef ETHTOOL_TEST ++#define ETHTOOL_TEST 0x1a ++enum ethtool_test_flags { ++ ETH_TEST_FL_OFFLINE = (1 << 0), ++ ETH_TEST_FL_FAILED = (1 << 1), ++}; ++struct ethtool_test { ++ u32 cmd; ++ u32 flags; ++ u32 reserved; ++ u32 len; ++ u64 data[0]; ++}; ++#endif /* ETHTOOL_TEST */ ++ ++#ifndef ETHTOOL_GEEPROM ++#define ETHTOOL_GEEPROM 0xb ++#undef ETHTOOL_GREGS ++struct ethtool_eeprom { ++ u32 cmd; ++ u32 magic; ++ u32 offset; ++ u32 len; ++ u8 data[0]; ++}; ++ ++struct ethtool_value { ++ u32 cmd; ++ u32 data; ++}; ++#endif /* ETHTOOL_GEEPROM */ ++ ++#ifndef ETHTOOL_GLINK ++#define ETHTOOL_GLINK 0xa ++#endif /* ETHTOOL_GLINK */ ++ ++#ifndef ETHTOOL_GREGS ++#define ETHTOOL_GREGS 0x00000004 /* Get NIC registers */ ++#define ethtool_regs _kc_ethtool_regs ++/* for passing big chunks of data */ ++struct _kc_ethtool_regs { ++ u32 cmd; ++ u32 version; /* driver-specific, indicates different chips/revs */ ++ u32 len; /* bytes */ ++ u8 data[0]; ++}; ++#endif /* ETHTOOL_GREGS */ ++ ++#ifndef ETHTOOL_GMSGLVL ++#define ETHTOOL_GMSGLVL 0x00000007 /* Get driver message level */ ++#endif ++#ifndef ETHTOOL_SMSGLVL ++#define ETHTOOL_SMSGLVL 0x00000008 /* Set driver msg level, priv. */ ++#endif ++#ifndef ETHTOOL_NWAY_RST ++#define ETHTOOL_NWAY_RST 0x00000009 /* Restart autonegotiation, priv */ ++#endif ++#ifndef ETHTOOL_GLINK ++#define ETHTOOL_GLINK 0x0000000a /* Get link status */ ++#endif ++#ifndef ETHTOOL_GEEPROM ++#define ETHTOOL_GEEPROM 0x0000000b /* Get EEPROM data */ ++#endif ++#ifndef ETHTOOL_SEEPROM ++#define ETHTOOL_SEEPROM 0x0000000c /* Set EEPROM data */ ++#endif ++#ifndef ETHTOOL_GCOALESCE ++#define ETHTOOL_GCOALESCE 0x0000000e /* Get coalesce config */ ++/* for configuring coalescing parameters of chip */ ++#define ethtool_coalesce _kc_ethtool_coalesce ++struct _kc_ethtool_coalesce { ++ u32 cmd; /* ETHTOOL_{G,S}COALESCE */ ++ ++ /* How many usecs to delay an RX interrupt after ++ * a packet arrives. If 0, only rx_max_coalesced_frames ++ * is used. ++ */ ++ u32 rx_coalesce_usecs; ++ ++ /* How many packets to delay an RX interrupt after ++ * a packet arrives. If 0, only rx_coalesce_usecs is ++ * used. It is illegal to set both usecs and max frames ++ * to zero as this would cause RX interrupts to never be ++ * generated. ++ */ ++ u32 rx_max_coalesced_frames; ++ ++ /* Same as above two parameters, except that these values ++ * apply while an IRQ is being serviced by the host. Not ++ * all cards support this feature and the values are ignored ++ * in that case. ++ */ ++ u32 rx_coalesce_usecs_irq; ++ u32 rx_max_coalesced_frames_irq; ++ ++ /* How many usecs to delay a TX interrupt after ++ * a packet is sent. If 0, only tx_max_coalesced_frames ++ * is used. ++ */ ++ u32 tx_coalesce_usecs; ++ ++ /* How many packets to delay a TX interrupt after ++ * a packet is sent. If 0, only tx_coalesce_usecs is ++ * used. It is illegal to set both usecs and max frames ++ * to zero as this would cause TX interrupts to never be ++ * generated. ++ */ ++ u32 tx_max_coalesced_frames; ++ ++ /* Same as above two parameters, except that these values ++ * apply while an IRQ is being serviced by the host. Not ++ * all cards support this feature and the values are ignored ++ * in that case. ++ */ ++ u32 tx_coalesce_usecs_irq; ++ u32 tx_max_coalesced_frames_irq; ++ ++ /* How many usecs to delay in-memory statistics ++ * block updates. Some drivers do not have an in-memory ++ * statistic block, and in such cases this value is ignored. ++ * This value must not be zero. ++ */ ++ u32 stats_block_coalesce_usecs; ++ ++ /* Adaptive RX/TX coalescing is an algorithm implemented by ++ * some drivers to improve latency under low packet rates and ++ * improve throughput under high packet rates. Some drivers ++ * only implement one of RX or TX adaptive coalescing. Anything ++ * not implemented by the driver causes these values to be ++ * silently ignored. ++ */ ++ u32 use_adaptive_rx_coalesce; ++ u32 use_adaptive_tx_coalesce; ++ ++ /* When the packet rate (measured in packets per second) ++ * is below pkt_rate_low, the {rx,tx}_*_low parameters are ++ * used. ++ */ ++ u32 pkt_rate_low; ++ u32 rx_coalesce_usecs_low; ++ u32 rx_max_coalesced_frames_low; ++ u32 tx_coalesce_usecs_low; ++ u32 tx_max_coalesced_frames_low; ++ ++ /* When the packet rate is below pkt_rate_high but above ++ * pkt_rate_low (both measured in packets per second) the ++ * normal {rx,tx}_* coalescing parameters are used. ++ */ ++ ++ /* When the packet rate is (measured in packets per second) ++ * is above pkt_rate_high, the {rx,tx}_*_high parameters are ++ * used. ++ */ ++ u32 pkt_rate_high; ++ u32 rx_coalesce_usecs_high; ++ u32 rx_max_coalesced_frames_high; ++ u32 tx_coalesce_usecs_high; ++ u32 tx_max_coalesced_frames_high; ++ ++ /* How often to do adaptive coalescing packet rate sampling, ++ * measured in seconds. Must not be zero. ++ */ ++ u32 rate_sample_interval; ++}; ++#endif /* ETHTOOL_GCOALESCE */ ++ ++#ifndef ETHTOOL_SCOALESCE ++#define ETHTOOL_SCOALESCE 0x0000000f /* Set coalesce config. */ ++#endif ++#ifndef ETHTOOL_GRINGPARAM ++#define ETHTOOL_GRINGPARAM 0x00000010 /* Get ring parameters */ ++/* for configuring RX/TX ring parameters */ ++#define ethtool_ringparam _kc_ethtool_ringparam ++struct _kc_ethtool_ringparam { ++ u32 cmd; /* ETHTOOL_{G,S}RINGPARAM */ ++ ++ /* Read only attributes. These indicate the maximum number ++ * of pending RX/TX ring entries the driver will allow the ++ * user to set. ++ */ ++ u32 rx_max_pending; ++ u32 rx_mini_max_pending; ++ u32 rx_jumbo_max_pending; ++ u32 tx_max_pending; ++ ++ /* Values changeable by the user. The valid values are ++ * in the range 1 to the "*_max_pending" counterpart above. ++ */ ++ u32 rx_pending; ++ u32 rx_mini_pending; ++ u32 rx_jumbo_pending; ++ u32 tx_pending; ++}; ++#endif /* ETHTOOL_GRINGPARAM */ ++ ++#ifndef ETHTOOL_SRINGPARAM ++#define ETHTOOL_SRINGPARAM 0x00000011 /* Set ring parameters, priv. */ ++#endif ++#ifndef ETHTOOL_GPAUSEPARAM ++#define ETHTOOL_GPAUSEPARAM 0x00000012 /* Get pause parameters */ ++/* for configuring link flow control parameters */ ++#define ethtool_pauseparam _kc_ethtool_pauseparam ++struct _kc_ethtool_pauseparam { ++ u32 cmd; /* ETHTOOL_{G,S}PAUSEPARAM */ ++ ++ /* If the link is being auto-negotiated (via ethtool_cmd.autoneg ++ * being true) the user may set 'autoneg' here non-zero to have the ++ * pause parameters be auto-negotiated too. In such a case, the ++ * {rx,tx}_pause values below determine what capabilities are ++ * advertised. ++ * ++ * If 'autoneg' is zero or the link is not being auto-negotiated, ++ * then {rx,tx}_pause force the driver to use/not-use pause ++ * flow control. ++ */ ++ u32 autoneg; ++ u32 rx_pause; ++ u32 tx_pause; ++}; ++#endif /* ETHTOOL_GPAUSEPARAM */ ++ ++#ifndef ETHTOOL_SPAUSEPARAM ++#define ETHTOOL_SPAUSEPARAM 0x00000013 /* Set pause parameters. */ ++#endif ++#ifndef ETHTOOL_GRXCSUM ++#define ETHTOOL_GRXCSUM 0x00000014 /* Get RX hw csum enable (ethtool_value) */ ++#endif ++#ifndef ETHTOOL_SRXCSUM ++#define ETHTOOL_SRXCSUM 0x00000015 /* Set RX hw csum enable (ethtool_value) */ ++#endif ++#ifndef ETHTOOL_GTXCSUM ++#define ETHTOOL_GTXCSUM 0x00000016 /* Get TX hw csum enable (ethtool_value) */ ++#endif ++#ifndef ETHTOOL_STXCSUM ++#define ETHTOOL_STXCSUM 0x00000017 /* Set TX hw csum enable (ethtool_value) */ ++#endif ++#ifndef ETHTOOL_GSG ++#define ETHTOOL_GSG 0x00000018 /* Get scatter-gather enable ++ * (ethtool_value) */ ++#endif ++#ifndef ETHTOOL_SSG ++#define ETHTOOL_SSG 0x00000019 /* Set scatter-gather enable ++ * (ethtool_value). */ ++#endif ++#ifndef ETHTOOL_TEST ++#define ETHTOOL_TEST 0x0000001a /* execute NIC self-test, priv. */ ++#endif ++#ifndef ETHTOOL_GSTRINGS ++#define ETHTOOL_GSTRINGS 0x0000001b /* get specified string set */ ++#endif ++#ifndef ETHTOOL_PHYS_ID ++#define ETHTOOL_PHYS_ID 0x0000001c /* identify the NIC */ ++#endif ++#ifndef ETHTOOL_GSTATS ++#define ETHTOOL_GSTATS 0x0000001d /* get NIC-specific statistics */ ++#endif ++#ifndef ETHTOOL_GTSO ++#define ETHTOOL_GTSO 0x0000001e /* Get TSO enable (ethtool_value) */ ++#endif ++#ifndef ETHTOOL_STSO ++#define ETHTOOL_STSO 0x0000001f /* Set TSO enable (ethtool_value) */ ++#endif ++ ++#ifndef ETHTOOL_BUSINFO_LEN ++#define ETHTOOL_BUSINFO_LEN 32 ++#endif ++ ++/*****************************************************************************/ ++/* 2.4.3 => 2.4.0 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,3) ) ++ ++/**************************************/ ++/* PCI DRIVER API */ ++ ++#ifndef pci_set_dma_mask ++#define pci_set_dma_mask _kc_pci_set_dma_mask ++extern int _kc_pci_set_dma_mask(struct pci_dev *dev, dma_addr_t mask); ++#endif ++ ++#ifndef pci_request_regions ++#define pci_request_regions _kc_pci_request_regions ++extern int _kc_pci_request_regions(struct pci_dev *pdev, char *res_name); ++#endif ++ ++#ifndef pci_release_regions ++#define pci_release_regions _kc_pci_release_regions ++extern void _kc_pci_release_regions(struct pci_dev *pdev); ++#endif ++ ++/**************************************/ ++/* NETWORK DRIVER API */ ++ ++#ifndef alloc_etherdev ++#define alloc_etherdev _kc_alloc_etherdev ++extern struct net_device * _kc_alloc_etherdev(int sizeof_priv); ++#endif ++ ++#ifndef is_valid_ether_addr ++#define is_valid_ether_addr _kc_is_valid_ether_addr ++extern int _kc_is_valid_ether_addr(u8 *addr); ++#endif ++ ++/**************************************/ ++/* MISCELLANEOUS */ ++ ++#ifndef INIT_TQUEUE ++#define INIT_TQUEUE(_tq, _routine, _data) \ ++ do { \ ++ INIT_LIST_HEAD(&(_tq)->list); \ ++ (_tq)->sync = 0; \ ++ (_tq)->routine = _routine; \ ++ (_tq)->data = _data; \ ++ } while (0) ++#endif ++ ++#endif /* 2.4.3 => 2.4.0 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,5) ) ++/* Generic MII registers. */ ++#define MII_BMCR 0x00 /* Basic mode control register */ ++#define MII_BMSR 0x01 /* Basic mode status register */ ++#define MII_PHYSID1 0x02 /* PHYS ID 1 */ ++#define MII_PHYSID2 0x03 /* PHYS ID 2 */ ++#define MII_ADVERTISE 0x04 /* Advertisement control reg */ ++#define MII_LPA 0x05 /* Link partner ability reg */ ++#define MII_EXPANSION 0x06 /* Expansion register */ ++/* Basic mode control register. */ ++#define BMCR_FULLDPLX 0x0100 /* Full duplex */ ++#define BMCR_ANENABLE 0x1000 /* Enable auto negotiation */ ++/* Basic mode status register. */ ++#define BMSR_ERCAP 0x0001 /* Ext-reg capability */ ++#define BMSR_ANEGCAPABLE 0x0008 /* Able to do auto-negotiation */ ++#define BMSR_10HALF 0x0800 /* Can do 10mbps, half-duplex */ ++#define BMSR_10FULL 0x1000 /* Can do 10mbps, full-duplex */ ++#define BMSR_100HALF 0x2000 /* Can do 100mbps, half-duplex */ ++#define BMSR_100FULL 0x4000 /* Can do 100mbps, full-duplex */ ++/* Advertisement control register. */ ++#define ADVERTISE_CSMA 0x0001 /* Only selector supported */ ++#define ADVERTISE_10HALF 0x0020 /* Try for 10mbps half-duplex */ ++#define ADVERTISE_10FULL 0x0040 /* Try for 10mbps full-duplex */ ++#define ADVERTISE_100HALF 0x0080 /* Try for 100mbps half-duplex */ ++#define ADVERTISE_100FULL 0x0100 /* Try for 100mbps full-duplex */ ++#define ADVERTISE_ALL (ADVERTISE_10HALF | ADVERTISE_10FULL | \ ++ ADVERTISE_100HALF | ADVERTISE_100FULL) ++/* Expansion register for auto-negotiation. */ ++#define EXPANSION_ENABLENPAGE 0x0004 /* This enables npage words */ ++#endif ++ ++/*****************************************************************************/ ++/* 2.4.6 => 2.4.3 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,6) ) ++ ++#ifndef pci_set_power_state ++#define pci_set_power_state _kc_pci_set_power_state ++extern int _kc_pci_set_power_state(struct pci_dev *dev, int state); ++#endif ++ ++#ifndef pci_enable_wake ++#define pci_enable_wake _kc_pci_enable_wake ++extern int _kc_pci_enable_wake(struct pci_dev *pdev, u32 state, int enable); ++#endif ++ ++#ifndef pci_disable_device ++#define pci_disable_device _kc_pci_disable_device ++extern void _kc_pci_disable_device(struct pci_dev *pdev); ++#endif ++ ++/* PCI PM entry point syntax changed, so don't support suspend/resume */ ++#undef CONFIG_PM ++ ++#endif /* 2.4.6 => 2.4.3 */ ++ ++#ifndef HAVE_PCI_SET_MWI ++#define pci_set_mwi(X) pci_write_config_word(X, \ ++ PCI_COMMAND, adapter->hw.bus.pci_cmd_word | \ ++ PCI_COMMAND_INVALIDATE); ++#define pci_clear_mwi(X) pci_write_config_word(X, \ ++ PCI_COMMAND, adapter->hw.bus.pci_cmd_word & \ ++ ~PCI_COMMAND_INVALIDATE); ++#endif ++ ++/*****************************************************************************/ ++/* 2.4.10 => 2.4.9 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,10) ) ++ ++/**************************************/ ++/* MODULE API */ ++ ++#ifndef MODULE_LICENSE ++ #define MODULE_LICENSE(X) ++#endif ++ ++/**************************************/ ++/* OTHER */ ++ ++#undef min ++#define min(x,y) ({ \ ++ const typeof(x) _x = (x); \ ++ const typeof(y) _y = (y); \ ++ (void) (&_x == &_y); \ ++ _x < _y ? _x : _y; }) ++ ++#undef max ++#define max(x,y) ({ \ ++ const typeof(x) _x = (x); \ ++ const typeof(y) _y = (y); \ ++ (void) (&_x == &_y); \ ++ _x > _y ? _x : _y; }) ++ ++#define min_t(type,x,y) ({ \ ++ type _x = (x); \ ++ type _y = (y); \ ++ _x < _y ? _x : _y; }) ++ ++#define max_t(type,x,y) ({ \ ++ type _x = (x); \ ++ type _y = (y); \ ++ _x > _y ? _x : _y; }) ++ ++#ifndef list_for_each_safe ++#define list_for_each_safe(pos, n, head) \ ++ for (pos = (head)->next, n = pos->next; pos != (head); \ ++ pos = n, n = pos->next) ++#endif ++ ++#endif /* 2.4.10 -> 2.4.6 */ ++ ++ ++/*****************************************************************************/ ++/* 2.4.13 => 2.4.10 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,13) ) ++ ++/**************************************/ ++/* PCI DMA MAPPING */ ++ ++#ifndef virt_to_page ++ #define virt_to_page(v) (mem_map + (virt_to_phys(v) >> PAGE_SHIFT)) ++#endif ++ ++#ifndef pci_map_page ++#define pci_map_page _kc_pci_map_page ++extern u64 _kc_pci_map_page(struct pci_dev *dev, struct page *page, unsigned long offset, size_t size, int direction); ++#endif ++ ++#ifndef pci_unmap_page ++#define pci_unmap_page _kc_pci_unmap_page ++extern void _kc_pci_unmap_page(struct pci_dev *dev, u64 dma_addr, size_t size, int direction); ++#endif ++ ++/* pci_set_dma_mask takes dma_addr_t, which is only 32-bits prior to 2.4.13 */ ++ ++#undef DMA_32BIT_MASK ++#define DMA_32BIT_MASK 0xffffffff ++#undef DMA_64BIT_MASK ++#define DMA_64BIT_MASK 0xffffffff ++ ++/**************************************/ ++/* OTHER */ ++ ++#ifndef cpu_relax ++#define cpu_relax() rep_nop() ++#endif ++ ++#endif /* 2.4.13 => 2.4.10 */ ++ ++/*****************************************************************************/ ++/* 2.4.17 => 2.4.12 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,17) ) ++ ++#ifndef __devexit_p ++ #define __devexit_p(x) &(x) ++#endif ++ ++#endif /* 2.4.17 => 2.4.13 */ ++ ++/*****************************************************************************/ ++/* 2.4.20 => 2.4.19 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,20) ) ++ ++/* we won't support NAPI on less than 2.4.20 */ ++#ifdef NAPI ++#undef CONFIG_E1000_NAPI ++#endif ++ ++#endif /* 2.4.20 => 2.4.19 */ ++ ++/*****************************************************************************/ ++/* < 2.4.21 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,21) ) ++#define skb_pad(x,y) _kc_skb_pad(x, y) ++struct sk_buff * _kc_skb_pad(struct sk_buff *skb, int pad); ++#endif /* < 2.4.21 */ ++ ++/*****************************************************************************/ ++/* 2.4.22 => 2.4.17 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,22) ) ++#define pci_name(x) ((x)->slot_name) ++#endif ++ ++/*****************************************************************************/ ++/*****************************************************************************/ ++/* 2.4.23 => 2.4.22 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,23) ) ++/*****************************************************************************/ ++#ifdef NAPI ++#ifndef netif_poll_disable ++#define netif_poll_disable(x) _kc_netif_poll_disable(x) ++static inline void _kc_netif_poll_disable(struct net_device *netdev) ++{ ++ while (test_and_set_bit(__LINK_STATE_RX_SCHED, &netdev->state)) { ++ /* No hurry */ ++ current->state = TASK_INTERRUPTIBLE; ++ schedule_timeout(1); ++ } ++} ++#endif ++ ++#ifndef netif_poll_enable ++#define netif_poll_enable(x) _kc_netif_poll_enable(x) ++static inline void _kc_netif_poll_enable(struct net_device *netdev) ++{ ++ clear_bit(__LINK_STATE_RX_SCHED, &netdev->state); ++} ++#endif ++#endif /* NAPI */ ++#ifndef netif_tx_disable ++#define netif_tx_disable(x) _kc_netif_tx_disable(x) ++static inline void _kc_netif_tx_disable(struct net_device *dev) ++{ ++ spin_lock_bh(&dev->xmit_lock); ++ netif_stop_queue(dev); ++ spin_unlock_bh(&dev->xmit_lock); ++} ++#endif ++#endif /* 2.4.23 => 2.4.22 */ ++ ++/*****************************************************************************/ ++/* 2.6.4 => 2.6.0 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,25) || \ ++ ( LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) && \ ++ LINUX_VERSION_CODE < KERNEL_VERSION(2,6,4) ) ) ++#define ETHTOOL_OPS_COMPAT ++#endif /* 2.6.4 => 2.6.0 */ ++ ++/*****************************************************************************/ ++/* 2.5.71 => 2.4.x */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,5,71) ) ++#include ++#define sk_protocol protocol ++ ++#define pci_get_device pci_find_device ++#endif /* 2.5.70 => 2.4.x */ ++ ++/*****************************************************************************/ ++/* < 2.4.27 or 2.6.0 <= 2.6.5 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,27) || \ ++ ( LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) && \ ++ LINUX_VERSION_CODE < KERNEL_VERSION(2,6,5) ) ) ++ ++#ifndef netif_msg_init ++#define netif_msg_init _kc_netif_msg_init ++static inline u32 _kc_netif_msg_init(int debug_value, int default_msg_enable_bits) ++{ ++ /* use default */ ++ if (debug_value < 0 || debug_value >= (sizeof(u32) * 8)) ++ return default_msg_enable_bits; ++ if (debug_value == 0) /* no output */ ++ return 0; ++ /* set low N bits */ ++ return (1 << debug_value) -1; ++} ++#endif ++ ++#endif /* < 2.4.27 or 2.6.0 <= 2.6.5 */ ++/*****************************************************************************/ ++#if (( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,27) ) || \ ++ (( LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) ) && \ ++ ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,3) ))) ++#define netdev_priv(x) x->priv ++#endif ++ ++/*****************************************************************************/ ++/* <= 2.5.0 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) ) ++#undef pci_register_driver ++#define pci_register_driver pci_module_init ++ ++#define dev_err(__unused_dev, format, arg...) \ ++ printk(KERN_ERR "%s: " format, pci_name(adapter->pdev) , ## arg) ++#define dev_warn(__unused_dev, format, arg...) \ ++ printk(KERN_WARNING "%s: " format, pci_name(pdev) , ## arg) ++ ++/* hlist_* code - double linked lists */ ++struct hlist_head { ++ struct hlist_node *first; ++}; ++ ++struct hlist_node { ++ struct hlist_node *next, **pprev; ++}; ++ ++static inline void __hlist_del(struct hlist_node *n) ++{ ++ struct hlist_node *next = n->next; ++ struct hlist_node **pprev = n->pprev; ++ *pprev = next; ++ if (next) ++ next->pprev = pprev; ++} ++ ++static inline void hlist_del(struct hlist_node *n) ++{ ++ __hlist_del(n); ++ n->next = NULL; ++ n->pprev = NULL; ++} ++ ++static inline void hlist_add_head(struct hlist_node *n, struct hlist_head *h) ++{ ++ struct hlist_node *first = h->first; ++ n->next = first; ++ if (first) ++ first->pprev = &n->next; ++ h->first = n; ++ n->pprev = &h->first; ++} ++ ++static inline int hlist_empty(const struct hlist_head *h) ++{ ++ return !h->first; ++} ++#define HLIST_HEAD_INIT { .first = NULL } ++#define HLIST_HEAD(name) struct hlist_head name = { .first = NULL } ++#define INIT_HLIST_HEAD(ptr) ((ptr)->first = NULL) ++static inline void INIT_HLIST_NODE(struct hlist_node *h) ++{ ++ h->next = NULL; ++ h->pprev = NULL; ++} ++#define hlist_entry(ptr, type, member) container_of(ptr,type,member) ++ ++#define hlist_for_each_entry(tpos, pos, head, member) \ ++ for (pos = (head)->first; \ ++ pos && ({ prefetch(pos->next); 1;}) && \ ++ ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ ++ pos = pos->next) ++ ++#define hlist_for_each_entry_safe(tpos, pos, n, head, member) \ ++ for (pos = (head)->first; \ ++ pos && ({ n = pos->next; 1; }) && \ ++ ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ ++ pos = n) ++ ++/* we ignore GFP here */ ++#define dma_alloc_coherent(dv, sz, dma, gfp) \ ++ pci_alloc_consistent(pdev, (sz), (dma)) ++#define dma_free_coherent(dv, sz, addr, dma_addr) \ ++ pci_free_consistent(pdev, (sz), (addr), (dma_addr)) ++ ++#ifndef might_sleep ++#define might_sleep() ++#endif ++ ++#endif /* <= 2.5.0 */ ++ ++/*****************************************************************************/ ++/* 2.5.28 => 2.4.23 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,5,28) ) ++ ++static inline void _kc_synchronize_irq(void) ++{ ++ synchronize_irq(); ++} ++#undef synchronize_irq ++#define synchronize_irq(X) _kc_synchronize_irq() ++ ++#include ++#define work_struct tq_struct ++#undef INIT_WORK ++#define INIT_WORK(a,b) INIT_TQUEUE(a,(void (*)(void *))b,a) ++#undef container_of ++#define container_of list_entry ++#define schedule_work schedule_task ++#define flush_scheduled_work flush_scheduled_tasks ++#define cancel_work_sync(x) flush_scheduled_work() ++ ++#endif /* 2.5.28 => 2.4.17 */ ++ ++/*****************************************************************************/ ++/* 2.6.0 => 2.5.28 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) ) ++#define MODULE_INFO(version, _version) ++#ifndef CONFIG_IGB_DISABLE_PACKET_SPLIT ++#define CONFIG_IGB_DISABLE_PACKET_SPLIT 1 ++#endif ++ ++#define pci_set_consistent_dma_mask(dev,mask) 1 ++ ++#undef dev_put ++#define dev_put(dev) __dev_put(dev) ++ ++#ifndef skb_fill_page_desc ++#define skb_fill_page_desc _kc_skb_fill_page_desc ++extern void _kc_skb_fill_page_desc(struct sk_buff *skb, int i, struct page *page, int off, int size); ++#endif ++ ++#undef ALIGN ++#define ALIGN(x,a) (((x)+(a)-1)&~((a)-1)) ++ ++#ifndef page_count ++#define page_count(p) atomic_read(&(p)->count) ++#endif ++ ++/* find_first_bit and find_next bit are not defined for most ++ * 2.4 kernels (except for the redhat 2.4.21 kernels ++ */ ++#include ++#define BITOP_WORD(nr) ((nr) / BITS_PER_LONG) ++#undef find_next_bit ++#define find_next_bit _kc_find_next_bit ++extern unsigned long _kc_find_next_bit(const unsigned long *addr, ++ unsigned long size, ++ unsigned long offset); ++#define find_first_bit(addr, size) find_next_bit((addr), (size), 0) ++ ++#endif /* 2.6.0 => 2.5.28 */ ++ ++/*****************************************************************************/ ++/* 2.6.4 => 2.6.0 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,4) ) ++#define MODULE_VERSION(_version) MODULE_INFO(version, _version) ++#endif /* 2.6.4 => 2.6.0 */ ++ ++/*****************************************************************************/ ++/* 2.6.5 => 2.6.0 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,5) ) ++#define pci_dma_sync_single_for_cpu pci_dma_sync_single ++#define pci_dma_sync_single_for_device pci_dma_sync_single_for_cpu ++#endif /* 2.6.5 => 2.6.0 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,6) ) ++/* taken from 2.6 include/linux/bitmap.h */ ++#undef bitmap_zero ++#define bitmap_zero _kc_bitmap_zero ++static inline void _kc_bitmap_zero(unsigned long *dst, int nbits) ++{ ++ if (nbits <= BITS_PER_LONG) ++ *dst = 0UL; ++ else { ++ int len = BITS_TO_LONGS(nbits) * sizeof(unsigned long); ++ memset(dst, 0, len); ++ } ++} ++#endif /* < 2.6.6 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,7) ) ++#undef if_mii ++#define if_mii _kc_if_mii ++static inline struct mii_ioctl_data *_kc_if_mii(struct ifreq *rq) ++{ ++ return (struct mii_ioctl_data *) &rq->ifr_ifru; ++} ++#endif /* < 2.6.7 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,8) ) ++#ifndef PCI_EXP_DEVCTL ++#define PCI_EXP_DEVCTL 8 ++#endif ++#ifndef PCI_EXP_DEVCTL_CERE ++#define PCI_EXP_DEVCTL_CERE 0x0001 ++#endif ++#define msleep(x) do { set_current_state(TASK_UNINTERRUPTIBLE); \ ++ schedule_timeout((x * HZ)/1000 + 2); \ ++ } while (0) ++ ++#endif /* < 2.6.8 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,9)) ++#include ++#define __iomem ++ ++#ifndef kcalloc ++#define kcalloc(n, size, flags) _kc_kzalloc(((n) * (size)), flags) ++extern void *_kc_kzalloc(size_t size, int flags); ++#endif ++#define MSEC_PER_SEC 1000L ++static inline unsigned int _kc_jiffies_to_msecs(const unsigned long j) ++{ ++#if HZ <= MSEC_PER_SEC && !(MSEC_PER_SEC % HZ) ++ return (MSEC_PER_SEC / HZ) * j; ++#elif HZ > MSEC_PER_SEC && !(HZ % MSEC_PER_SEC) ++ return (j + (HZ / MSEC_PER_SEC) - 1)/(HZ / MSEC_PER_SEC); ++#else ++ return (j * MSEC_PER_SEC) / HZ; ++#endif ++} ++static inline unsigned long _kc_msecs_to_jiffies(const unsigned int m) ++{ ++ if (m > _kc_jiffies_to_msecs(MAX_JIFFY_OFFSET)) ++ return MAX_JIFFY_OFFSET; ++#if HZ <= MSEC_PER_SEC && !(MSEC_PER_SEC % HZ) ++ return (m + (MSEC_PER_SEC / HZ) - 1) / (MSEC_PER_SEC / HZ); ++#elif HZ > MSEC_PER_SEC && !(HZ % MSEC_PER_SEC) ++ return m * (HZ / MSEC_PER_SEC); ++#else ++ return (m * HZ + MSEC_PER_SEC - 1) / MSEC_PER_SEC; ++#endif ++} ++ ++#define msleep_interruptible _kc_msleep_interruptible ++static inline unsigned long _kc_msleep_interruptible(unsigned int msecs) ++{ ++ unsigned long timeout = _kc_msecs_to_jiffies(msecs) + 1; ++ ++ while (timeout && !signal_pending(current)) { ++ __set_current_state(TASK_INTERRUPTIBLE); ++ timeout = schedule_timeout(timeout); ++ } ++ return _kc_jiffies_to_msecs(timeout); ++} ++ ++/* Basic mode control register. */ ++#define BMCR_SPEED1000 0x0040 /* MSB of Speed (1000) */ ++ ++#ifndef __le16 ++#define __le16 u16 ++#endif ++#ifndef __le32 ++#define __le32 u32 ++#endif ++#ifndef __le64 ++#define __le64 u64 ++#endif ++ ++#ifdef pci_dma_mapping_error ++#undef pci_dma_mapping_error ++#endif ++#define pci_dma_mapping_error _kc_pci_dma_mapping_error ++static inline int _kc_pci_dma_mapping_error(struct pci_dev *pdev, ++ dma_addr_t dma_addr) ++{ ++ return dma_addr == 0; ++} ++ ++#endif /* < 2.6.9 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10) ) ++#ifdef module_param_array_named ++#undef module_param_array_named ++#define module_param_array_named(name, array, type, nump, perm) \ ++ static struct kparam_array __param_arr_##name \ ++ = { ARRAY_SIZE(array), nump, param_set_##type, param_get_##type, \ ++ sizeof(array[0]), array }; \ ++ module_param_call(name, param_array_set, param_array_get, \ ++ &__param_arr_##name, perm) ++#endif /* module_param_array_named */ ++#endif /* < 2.6.10 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,11) ) ++#define PCI_D0 0 ++#define PCI_D1 1 ++#define PCI_D2 2 ++#define PCI_D3hot 3 ++#define PCI_D3cold 4 ++typedef int pci_power_t; ++#define pci_choose_state(pdev,state) state ++#define PMSG_SUSPEND 3 ++#define PCI_EXP_LNKCTL 16 ++ ++#undef NETIF_F_LLTX ++ ++#ifndef ARCH_HAS_PREFETCH ++#define prefetch(X) ++#endif ++ ++#ifndef NET_IP_ALIGN ++#define NET_IP_ALIGN 2 ++#endif ++ ++#define KC_USEC_PER_SEC 1000000L ++#define usecs_to_jiffies _kc_usecs_to_jiffies ++static inline unsigned int _kc_jiffies_to_usecs(const unsigned long j) ++{ ++#if HZ <= KC_USEC_PER_SEC && !(KC_USEC_PER_SEC % HZ) ++ return (KC_USEC_PER_SEC / HZ) * j; ++#elif HZ > KC_USEC_PER_SEC && !(HZ % KC_USEC_PER_SEC) ++ return (j + (HZ / KC_USEC_PER_SEC) - 1)/(HZ / KC_USEC_PER_SEC); ++#else ++ return (j * KC_USEC_PER_SEC) / HZ; ++#endif ++} ++static inline unsigned long _kc_usecs_to_jiffies(const unsigned int m) ++{ ++ if (m > _kc_jiffies_to_usecs(MAX_JIFFY_OFFSET)) ++ return MAX_JIFFY_OFFSET; ++#if HZ <= KC_USEC_PER_SEC && !(KC_USEC_PER_SEC % HZ) ++ return (m + (KC_USEC_PER_SEC / HZ) - 1) / (KC_USEC_PER_SEC / HZ); ++#elif HZ > KC_USEC_PER_SEC && !(HZ % KC_USEC_PER_SEC) ++ return m * (HZ / KC_USEC_PER_SEC); ++#else ++ return (m * HZ + KC_USEC_PER_SEC - 1) / KC_USEC_PER_SEC; ++#endif ++} ++#endif /* < 2.6.11 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,12) ) ++#include ++#define USE_REBOOT_NOTIFIER ++ ++/* Generic MII registers. */ ++#define MII_CTRL1000 0x09 /* 1000BASE-T control */ ++#define MII_STAT1000 0x0a /* 1000BASE-T status */ ++/* Advertisement control register. */ ++#define ADVERTISE_PAUSE_CAP 0x0400 /* Try for pause */ ++#define ADVERTISE_PAUSE_ASYM 0x0800 /* Try for asymmetric pause */ ++/* 1000BASE-T Control register */ ++#define ADVERTISE_1000FULL 0x0200 /* Advertise 1000BASE-T full duplex */ ++#endif /* < 2.6.12 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,14) ) ++#define pm_message_t u32 ++#ifndef kzalloc ++#define kzalloc _kc_kzalloc ++extern void *_kc_kzalloc(size_t size, int flags); ++#endif ++ ++/* Generic MII registers. */ ++#define MII_ESTATUS 0x0f /* Extended Status */ ++/* Basic mode status register. */ ++#define BMSR_ESTATEN 0x0100 /* Extended Status in R15 */ ++/* Extended status register. */ ++#define ESTATUS_1000_TFULL 0x2000 /* Can do 1000BT Full */ ++#define ESTATUS_1000_THALF 0x1000 /* Can do 1000BT Half */ ++#endif /* < 2.6.14 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,15) ) ++#ifndef device_can_wakeup ++#define device_can_wakeup(dev) (1) ++#endif ++#ifndef device_set_wakeup_enable ++#define device_set_wakeup_enable(dev, val) do{}while(0) ++#endif ++#ifndef device_init_wakeup ++#define device_init_wakeup(dev,val) do {} while (0) ++#endif ++#endif /* < 2.6.15 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,16) ) ++#undef HAVE_PCI_ERS ++#else /* 2.6.16 and above */ ++#undef HAVE_PCI_ERS ++#define HAVE_PCI_ERS ++#endif /* < 2.6.16 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18) ) ++ ++#ifndef IRQ_HANDLED ++#define irqreturn_t void ++#define IRQ_HANDLED ++#define IRQ_NONE ++#endif ++ ++#ifndef IRQF_PROBE_SHARED ++#ifdef SA_PROBEIRQ ++#define IRQF_PROBE_SHARED SA_PROBEIRQ ++#else ++#define IRQF_PROBE_SHARED 0 ++#endif ++#endif ++ ++#ifndef IRQF_SHARED ++#define IRQF_SHARED SA_SHIRQ ++#endif ++ ++#ifndef ARRAY_SIZE ++#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) ++#endif ++ ++#ifndef netdev_alloc_skb ++#define netdev_alloc_skb _kc_netdev_alloc_skb ++extern struct sk_buff *_kc_netdev_alloc_skb(struct net_device *dev, ++ unsigned int length); ++#endif ++ ++#ifndef skb_is_gso ++#ifdef NETIF_F_TSO ++#define skb_is_gso _kc_skb_is_gso ++static inline int _kc_skb_is_gso(const struct sk_buff *skb) ++{ ++ return skb_shinfo(skb)->gso_size; ++} ++#else ++#define skb_is_gso(a) 0 ++#endif ++#endif ++ ++#endif /* < 2.6.18 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) ) ++ ++#ifndef DIV_ROUND_UP ++#define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d)) ++#endif ++#if ( LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) ) ++#ifndef RHEL_RELEASE_CODE ++#define RHEL_RELEASE_CODE 0 ++#endif ++#ifndef RHEL_RELEASE_VERSION ++#define RHEL_RELEASE_VERSION(a,b) 0 ++#endif ++#ifndef AX_RELEASE_CODE ++#define AX_RELEASE_CODE 0 ++#endif ++#ifndef AX_RELEASE_VERSION ++#define AX_RELEASE_VERSION(a,b) 0 ++#endif ++#if (!(( RHEL_RELEASE_CODE > RHEL_RELEASE_VERSION(4,4) ) && ( RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(5,0) ) || ( RHEL_RELEASE_CODE > RHEL_RELEASE_VERSION(5,0) ) || (AX_RELEASE_CODE > AX_RELEASE_VERSION(3,0)))) ++typedef irqreturn_t (*irq_handler_t)(int, void*, struct pt_regs *); ++#endif ++#if (RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(6,0)) ++#undef CONFIG_INET_LRO ++#undef CONFIG_INET_LRO_MODULE ++#ifdef IXGBE_FCOE ++#undef CONFIG_FCOE ++#undef CONFIG_FCOE_MODULE ++#endif /* IXGBE_FCOE */ ++#endif ++typedef irqreturn_t (*new_handler_t)(int, void*); ++static inline irqreturn_t _kc_request_irq(unsigned int irq, new_handler_t handler, unsigned long flags, const char *devname, void *dev_id) ++#else /* 2.4.x */ ++typedef void (*irq_handler_t)(int, void*, struct pt_regs *); ++typedef void (*new_handler_t)(int, void*); ++static inline int _kc_request_irq(unsigned int irq, new_handler_t handler, unsigned long flags, const char *devname, void *dev_id) ++#endif /* >= 2.5.x */ ++{ ++ irq_handler_t new_handler = (irq_handler_t) handler; ++ return request_irq(irq, new_handler, flags, devname, dev_id); ++} ++ ++#undef request_irq ++#define request_irq(irq, handler, flags, devname, dev_id) _kc_request_irq((irq), (handler), (flags), (devname), (dev_id)) ++ ++#define irq_handler_t new_handler_t ++/* pci_restore_state and pci_save_state handles MSI/PCIE from 2.6.19 */ ++#define PCIE_CONFIG_SPACE_LEN 256 ++#define PCI_CONFIG_SPACE_LEN 64 ++#define PCIE_LINK_STATUS 0x12 ++#define pci_config_space_ich8lan() do {} while(0) ++#undef pci_save_state ++extern int _kc_pci_save_state(struct pci_dev *); ++#define pci_save_state(pdev) _kc_pci_save_state(pdev) ++#undef pci_restore_state ++extern void _kc_pci_restore_state(struct pci_dev *); ++#define pci_restore_state(pdev) _kc_pci_restore_state(pdev) ++#ifdef HAVE_PCI_ERS ++#undef free_netdev ++extern void _kc_free_netdev(struct net_device *); ++#define free_netdev(netdev) _kc_free_netdev(netdev) ++#endif ++static inline int pci_enable_pcie_error_reporting(struct pci_dev *dev) ++{ ++ return 0; ++} ++#define pci_disable_pcie_error_reporting(dev) do {} while (0) ++#define pci_cleanup_aer_uncorrect_error_status(dev) do {} while (0) ++#else /* 2.6.19 */ ++#include ++#endif /* < 2.6.19 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) ) ++#if ( LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,28) ) ++#undef INIT_WORK ++#define INIT_WORK(_work, _func) \ ++do { \ ++ INIT_LIST_HEAD(&(_work)->entry); \ ++ (_work)->pending = 0; \ ++ (_work)->func = (void (*)(void *))_func; \ ++ (_work)->data = _work; \ ++ init_timer(&(_work)->timer); \ ++} while (0) ++#endif ++ ++#ifndef PCI_VDEVICE ++#define PCI_VDEVICE(ven, dev) \ ++ PCI_VENDOR_ID_##ven, (dev), \ ++ PCI_ANY_ID, PCI_ANY_ID, 0, 0 ++#endif ++ ++#ifndef round_jiffies ++#define round_jiffies(x) x ++#endif ++ ++#define csum_offset csum ++ ++#endif /* < 2.6.20 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21) ) ++#define to_net_dev(class) container_of(class, struct net_device, class_dev) ++#define NETDEV_CLASS_DEV ++#define vlan_group_get_device(vg, id) (vg->vlan_devices[id]) ++#define vlan_group_set_device(vg, id, dev) if (vg) vg->vlan_devices[id] = dev; ++#define pci_channel_offline(pdev) (pdev->error_state && \ ++ pdev->error_state != pci_channel_io_normal) ++#define pci_request_selected_regions(pdev, bars, name) \ ++ pci_request_regions(pdev, name) ++#define pci_release_selected_regions(pdev, bars) pci_release_regions(pdev); ++#endif /* < 2.6.21 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22) ) ++#define tcp_hdr(skb) (skb->h.th) ++#define tcp_hdrlen(skb) (skb->h.th->doff << 2) ++#define skb_transport_offset(skb) (skb->h.raw - skb->data) ++#define skb_transport_header(skb) (skb->h.raw) ++#define ipv6_hdr(skb) (skb->nh.ipv6h) ++#define ip_hdr(skb) (skb->nh.iph) ++#define skb_network_offset(skb) (skb->nh.raw - skb->data) ++#define skb_network_header(skb) (skb->nh.raw) ++#define skb_tail_pointer(skb) skb->tail ++#define skb_copy_to_linear_data_offset(skb, offset, from, len) \ ++ memcpy(skb->data + offset, from, len) ++#define skb_network_header_len(skb) (skb->h.raw - skb->nh.raw) ++#define pci_register_driver pci_module_init ++#define skb_mac_header(skb) skb->mac.raw ++ ++#ifndef alloc_etherdev_mq ++#define alloc_etherdev_mq(_a, _b) alloc_etherdev(_a) ++#endif ++ ++#ifndef ETH_FCS_LEN ++#define ETH_FCS_LEN 4 ++#endif ++#define cancel_work_sync(x) flush_scheduled_work() ++#ifndef udp_hdr ++#define udp_hdr _udp_hdr ++static inline struct udphdr *_udp_hdr(const struct sk_buff *skb) ++{ ++ return (struct udphdr *)skb_transport_header(skb); ++} ++#endif ++#endif /* < 2.6.22 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE > KERNEL_VERSION(2,6,22) ) ++#undef ETHTOOL_GPERMADDR ++#undef SET_MODULE_OWNER ++#define SET_MODULE_OWNER(dev) do { } while (0) ++#endif /* > 2.6.22 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23) ) ++#define netif_subqueue_stopped(_a, _b) 0 ++#endif /* < 2.6.23 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) ) ++/* NAPI API changes in 2.6.24 break everything */ ++struct napi_struct { ++ /* used to look up the real NAPI polling routine */ ++ int (*poll)(struct napi_struct *, int); ++ struct net_device poll_dev; ++ int weight; ++}; ++#ifdef NAPI ++extern int __kc_adapter_clean(struct net_device *, int *); ++extern struct net_device * napi_to_netdev(struct napi_struct *); ++#define napi_to_poll_dev(napi) napi_to_netdev(napi) ++#define napi_enable(napi) netif_poll_enable(adapter->netdev) ++#define napi_disable(napi) netif_poll_disable(adapter->netdev) ++#define netif_napi_add(_netdev, _napi, _poll, _weight) \ ++ do { \ ++ struct napi_struct *__napi = (_napi); \ ++ _netdev->poll = &(__kc_adapter_clean); \ ++ _netdev->weight = (_weight); \ ++ __napi->poll = &(_poll); \ ++ __napi->weight = (_weight); \ ++ netif_poll_disable(_netdev); \ ++ } while (0) ++#define netif_napi_del(_a) do {} while (0) ++#define napi_schedule_prep(napi) netif_rx_schedule_prep(napi_to_netdev(napi)) ++#define napi_schedule(napi) netif_rx_schedule(napi_to_poll_dev(napi)) ++#define __napi_schedule(napi) __netif_rx_schedule(napi_to_poll_dev(napi)) ++#define napi_complete(napi) netif_rx_complete(napi_to_poll_dev(napi)) ++#else /* NAPI */ ++#define netif_napi_add(_netdev, _napi, _poll, _weight) \ ++ do { \ ++ struct napi_struct *__napi = _napi; \ ++ _netdev->poll = &(_poll); \ ++ _netdev->weight = (_weight); \ ++ __napi->poll = &(_poll); \ ++ __napi->weight = (_weight); \ ++ } while (0) ++#define netif_napi_del(_a) do {} while (0) ++#endif /* NAPI */ ++ ++#undef dev_get_by_name ++#define dev_get_by_name(_a, _b) dev_get_by_name(_b) ++#define __netif_subqueue_stopped(_a, _b) netif_subqueue_stopped(_a, _b) ++#define DMA_BIT_MASK(n) (((n) == 64) ? ~0ULL : ((1ULL<<(n))-1)) ++#else /* < 2.6.24 */ ++#define HAVE_NETDEV_NAPI_LIST ++#endif /* < 2.6.24 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE > KERNEL_VERSION(2,6,24) ) ++#include ++#endif /* > 2.6.24 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25) ) ++#define PM_QOS_CPU_DMA_LATENCY 1 ++ ++#if ( LINUX_VERSION_CODE > KERNEL_VERSION(2,6,18) ) ++#include ++#define PM_QOS_DEFAULT_VALUE INFINITE_LATENCY ++#define pm_qos_add_requirement(pm_qos_class, name, value) \ ++ set_acceptable_latency(name, value) ++#define pm_qos_remove_requirement(pm_qos_class, name) \ ++ remove_acceptable_latency(name) ++#define pm_qos_update_requirement(pm_qos_class, name, value) \ ++ modify_acceptable_latency(name, value) ++#else ++#define PM_QOS_DEFAULT_VALUE -1 ++#define pm_qos_add_requirement(pm_qos_class, name, value) ++#define pm_qos_remove_requirement(pm_qos_class, name) ++#define pm_qos_update_requirement(pm_qos_class, name, value) { \ ++ if (value != PM_QOS_DEFAULT_VALUE) { \ ++ printk(KERN_WARNING "%s: unable to set PM QoS requirement\n", \ ++ pci_name(adapter->pdev)); \ ++ } \ ++} ++#endif /* > 2.6.18 */ ++ ++#define pci_enable_device_mem(pdev) pci_enable_device(pdev) ++ ++#endif /* < 2.6.25 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26) ) ++#else /* < 2.6.26 */ ++#include ++#define HAVE_NETDEV_VLAN_FEATURES ++#endif /* < 2.6.26 */ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27) ) ++#if ( LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,15) ) ++#if (((LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)) && defined(CONFIG_PM)) || ((LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)) && defined(CONFIG_PM_SLEEP))) ++#undef device_set_wakeup_enable ++#define device_set_wakeup_enable(dev, val) \ ++ do { \ ++ u16 pmc = 0; \ ++ int pm = pci_find_capability(adapter->pdev, PCI_CAP_ID_PM); \ ++ if (pm) { \ ++ pci_read_config_word(adapter->pdev, pm + PCI_PM_PMC, \ ++ &pmc); \ ++ } \ ++ (dev)->power.can_wakeup = !!(pmc >> 11); \ ++ (dev)->power.should_wakeup = (val && (pmc >> 11)); \ ++ } while (0) ++#endif /* 2.6.15-2.6.22 and CONFIG_PM or 2.6.23-2.6.25 and CONFIG_PM_SLEEP */ ++#endif /* 2.6.15 through 2.6.27 */ ++#ifndef netif_napi_del ++#define netif_napi_del(_a) do {} while (0) ++#ifdef NAPI ++#ifdef CONFIG_NETPOLL ++#undef netif_napi_del ++#define netif_napi_del(_a) list_del(&(_a)->dev_list); ++#endif ++#endif ++#endif /* netif_napi_del */ ++#ifndef pci_dma_mapping_error ++#define pci_dma_mapping_error(pdev, dma_addr) pci_dma_mapping_error(dma_addr) ++#endif ++ ++ ++#ifdef HAVE_TX_MQ ++extern void _kc_netif_tx_stop_all_queues(struct net_device *); ++extern void _kc_netif_tx_wake_all_queues(struct net_device *); ++extern void _kc_netif_tx_start_all_queues(struct net_device *); ++#define netif_tx_stop_all_queues(a) _kc_netif_tx_stop_all_queues(a) ++#define netif_tx_wake_all_queues(a) _kc_netif_tx_wake_all_queues(a) ++#define netif_tx_start_all_queues(a) _kc_netif_tx_start_all_queues(a) ++#undef netif_stop_subqueue ++#define netif_stop_subqueue(_ndev,_qi) do { \ ++ if (netif_is_multiqueue((_ndev))) \ ++ netif_stop_subqueue((_ndev), (_qi)); \ ++ else \ ++ netif_stop_queue((_ndev)); \ ++ } while (0) ++#undef netif_start_subqueue ++#define netif_start_subqueue(_ndev,_qi) do { \ ++ if (netif_is_multiqueue((_ndev))) \ ++ netif_start_subqueue((_ndev), (_qi)); \ ++ else \ ++ netif_start_queue((_ndev)); \ ++ } while (0) ++#else /* HAVE_TX_MQ */ ++#define netif_tx_stop_all_queues(a) netif_stop_queue(a) ++#define netif_tx_wake_all_queues(a) netif_wake_queue(a) ++#if ( LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,12) ) ++#define netif_tx_start_all_queues(a) netif_start_queue(a) ++#else ++#define netif_tx_start_all_queues(a) do {} while (0) ++#endif ++#define netif_stop_subqueue(_ndev,_qi) netif_stop_queue((_ndev)) ++#define netif_start_subqueue(_ndev,_qi) netif_start_queue((_ndev)) ++#endif /* HAVE_TX_MQ */ ++#else /* < 2.6.27 */ ++#define HAVE_TX_MQ ++#define HAVE_NETDEV_SELECT_QUEUE ++#endif /* < 2.6.27 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,28) ) ++#define pci_ioremap_bar(pdev, bar) ioremap(pci_resource_start(pdev, bar), \ ++ pci_resource_len(pdev, bar)) ++#define pci_wake_from_d3 _kc_pci_wake_from_d3 ++#define pci_prepare_to_sleep _kc_pci_prepare_to_sleep ++extern int _kc_pci_wake_from_d3(struct pci_dev *dev, bool enable); ++extern int _kc_pci_prepare_to_sleep(struct pci_dev *dev); ++#endif /* < 2.6.28 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29) ) ++#define pci_request_selected_regions_exclusive(pdev, bars, name) \ ++ pci_request_selected_regions(pdev, bars, name) ++#else /* < 2.6.29 */ ++#ifdef CONFIG_DCB ++#define HAVE_PFC_MODE_ENABLE ++#endif /* CONFIG_DCB */ ++#endif /* < 2.6.29 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30) ) ++#ifdef IXGBE_FCOE ++#undef CONFIG_FCOE ++#undef CONFIG_FCOE_MODULE ++#endif /* IXGBE_FCOE */ ++extern u16 _kc_skb_tx_hash(struct net_device *dev, struct sk_buff *skb); ++#define skb_tx_hash(n, s) _kc_skb_tx_hash(n, s) ++#else ++#define HAVE_ASPM_QUIRKS ++#endif /* < 2.6.30 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,31) ) ++#else ++#ifndef HAVE_NETDEV_STORAGE_ADDRESS ++#define HAVE_NETDEV_STORAGE_ADDRESS ++#endif ++#endif /* < 2.6.31 */ ++#endif /* _KCOMPAT_H_ */ +diff -r d03036c09699 drivers/net/e1000/kcompat_ethtool.c +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/e1000/kcompat_ethtool.c Mon Jun 15 11:43:11 2009 +0100 +@@ -0,0 +1,1169 @@ ++/******************************************************************************* ++ ++ Intel PRO/1000 Linux driver ++ Copyright(c) 1999 - 2008 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ Linux NICS ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++/* ++ * net/core/ethtool.c - Ethtool ioctl handler ++ * Copyright (c) 2003 Matthew Wilcox ++ * ++ * This file is where we call all the ethtool_ops commands to get ++ * the information ethtool needs. We fall back to calling do_ioctl() ++ * for drivers which haven't been converted to ethtool_ops yet. ++ * ++ * It's GPL, stupid. ++ * ++ * Modification by sfeldma@pobox.com to work as backward compat ++ * solution for pre-ethtool_ops kernels. ++ * - copied struct ethtool_ops from ethtool.h ++ * - defined SET_ETHTOOL_OPS ++ * - put in some #ifndef NETIF_F_xxx wrappers ++ * - changes refs to dev->ethtool_ops to ethtool_ops ++ * - changed dev_ethtool to ethtool_ioctl ++ * - remove EXPORT_SYMBOL()s ++ * - added _kc_ prefix in built-in ethtool_op_xxx ops. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "kcompat.h" ++ ++#undef SUPPORTED_10000baseT_Full ++#define SUPPORTED_10000baseT_Full (1 << 12) ++#undef ADVERTISED_10000baseT_Full ++#define ADVERTISED_10000baseT_Full (1 << 12) ++#undef SPEED_10000 ++#define SPEED_10000 10000 ++ ++#undef ethtool_ops ++#define ethtool_ops _kc_ethtool_ops ++ ++struct _kc_ethtool_ops { ++ int (*get_settings)(struct net_device *, struct ethtool_cmd *); ++ int (*set_settings)(struct net_device *, struct ethtool_cmd *); ++ void (*get_drvinfo)(struct net_device *, struct ethtool_drvinfo *); ++ int (*get_regs_len)(struct net_device *); ++ void (*get_regs)(struct net_device *, struct ethtool_regs *, void *); ++ void (*get_wol)(struct net_device *, struct ethtool_wolinfo *); ++ int (*set_wol)(struct net_device *, struct ethtool_wolinfo *); ++ u32 (*get_msglevel)(struct net_device *); ++ void (*set_msglevel)(struct net_device *, u32); ++ int (*nway_reset)(struct net_device *); ++ u32 (*get_link)(struct net_device *); ++ int (*get_eeprom_len)(struct net_device *); ++ int (*get_eeprom)(struct net_device *, struct ethtool_eeprom *, u8 *); ++ int (*set_eeprom)(struct net_device *, struct ethtool_eeprom *, u8 *); ++ int (*get_coalesce)(struct net_device *, struct ethtool_coalesce *); ++ int (*set_coalesce)(struct net_device *, struct ethtool_coalesce *); ++ void (*get_ringparam)(struct net_device *, struct ethtool_ringparam *); ++ int (*set_ringparam)(struct net_device *, struct ethtool_ringparam *); ++ void (*get_pauseparam)(struct net_device *, ++ struct ethtool_pauseparam*); ++ int (*set_pauseparam)(struct net_device *, ++ struct ethtool_pauseparam*); ++ u32 (*get_rx_csum)(struct net_device *); ++ int (*set_rx_csum)(struct net_device *, u32); ++ u32 (*get_tx_csum)(struct net_device *); ++ int (*set_tx_csum)(struct net_device *, u32); ++ u32 (*get_sg)(struct net_device *); ++ int (*set_sg)(struct net_device *, u32); ++ u32 (*get_tso)(struct net_device *); ++ int (*set_tso)(struct net_device *, u32); ++ int (*self_test_count)(struct net_device *); ++ void (*self_test)(struct net_device *, struct ethtool_test *, u64 *); ++ void (*get_strings)(struct net_device *, u32 stringset, u8 *); ++ int (*phys_id)(struct net_device *, u32); ++ int (*get_stats_count)(struct net_device *); ++ void (*get_ethtool_stats)(struct net_device *, struct ethtool_stats *, ++ u64 *); ++} *ethtool_ops = NULL; ++ ++#undef SET_ETHTOOL_OPS ++#define SET_ETHTOOL_OPS(netdev, ops) (ethtool_ops = (ops)) ++ ++/* ++ * Some useful ethtool_ops methods that are device independent. If we find that ++ * all drivers want to do the same thing here, we can turn these into dev_() ++ * function calls. ++ */ ++ ++#undef ethtool_op_get_link ++#define ethtool_op_get_link _kc_ethtool_op_get_link ++u32 _kc_ethtool_op_get_link(struct net_device *dev) ++{ ++ return netif_carrier_ok(dev) ? 1 : 0; ++} ++ ++#undef ethtool_op_get_tx_csum ++#define ethtool_op_get_tx_csum _kc_ethtool_op_get_tx_csum ++u32 _kc_ethtool_op_get_tx_csum(struct net_device *dev) ++{ ++#ifdef NETIF_F_IP_CSUM ++ return (dev->features & NETIF_F_IP_CSUM) != 0; ++#else ++ return 0; ++#endif ++} ++ ++#undef ethtool_op_set_tx_csum ++#define ethtool_op_set_tx_csum _kc_ethtool_op_set_tx_csum ++int _kc_ethtool_op_set_tx_csum(struct net_device *dev, u32 data) ++{ ++#ifdef NETIF_F_IP_CSUM ++ if (data) ++#ifdef NETIF_F_IPV6_CSUM ++ dev->features |= (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM); ++ else ++ dev->features &= ~(NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM); ++#else ++ dev->features |= NETIF_F_IP_CSUM; ++ else ++ dev->features &= ~NETIF_F_IP_CSUM; ++#endif ++#endif ++ ++ return 0; ++} ++ ++#undef ethtool_op_get_sg ++#define ethtool_op_get_sg _kc_ethtool_op_get_sg ++u32 _kc_ethtool_op_get_sg(struct net_device *dev) ++{ ++#ifdef NETIF_F_SG ++ return (dev->features & NETIF_F_SG) != 0; ++#else ++ return 0; ++#endif ++} ++ ++#undef ethtool_op_set_sg ++#define ethtool_op_set_sg _kc_ethtool_op_set_sg ++int _kc_ethtool_op_set_sg(struct net_device *dev, u32 data) ++{ ++#ifdef NETIF_F_SG ++ if (data) ++ dev->features |= NETIF_F_SG; ++ else ++ dev->features &= ~NETIF_F_SG; ++#endif ++ ++ return 0; ++} ++ ++#undef ethtool_op_get_tso ++#define ethtool_op_get_tso _kc_ethtool_op_get_tso ++u32 _kc_ethtool_op_get_tso(struct net_device *dev) ++{ ++#ifdef NETIF_F_TSO ++ return (dev->features & NETIF_F_TSO) != 0; ++#else ++ return 0; ++#endif ++} ++ ++#undef ethtool_op_set_tso ++#define ethtool_op_set_tso _kc_ethtool_op_set_tso ++int _kc_ethtool_op_set_tso(struct net_device *dev, u32 data) ++{ ++#ifdef NETIF_F_TSO ++ if (data) ++ dev->features |= NETIF_F_TSO; ++ else ++ dev->features &= ~NETIF_F_TSO; ++#endif ++ ++ return 0; ++} ++ ++/* Handlers for each ethtool command */ ++ ++static int ethtool_get_settings(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_cmd cmd = { ETHTOOL_GSET }; ++ int err; ++ ++ if (!ethtool_ops->get_settings) ++ return -EOPNOTSUPP; ++ ++ err = ethtool_ops->get_settings(dev, &cmd); ++ if (err < 0) ++ return err; ++ ++ if (copy_to_user(useraddr, &cmd, sizeof(cmd))) ++ return -EFAULT; ++ return 0; ++} ++ ++static int ethtool_set_settings(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_cmd cmd; ++ ++ if (!ethtool_ops->set_settings) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&cmd, useraddr, sizeof(cmd))) ++ return -EFAULT; ++ ++ return ethtool_ops->set_settings(dev, &cmd); ++} ++ ++static int ethtool_get_drvinfo(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_drvinfo info; ++ struct ethtool_ops *ops = ethtool_ops; ++ ++ if (!ops->get_drvinfo) ++ return -EOPNOTSUPP; ++ ++ memset(&info, 0, sizeof(info)); ++ info.cmd = ETHTOOL_GDRVINFO; ++ ops->get_drvinfo(dev, &info); ++ ++ if (ops->self_test_count) ++ info.testinfo_len = ops->self_test_count(dev); ++ if (ops->get_stats_count) ++ info.n_stats = ops->get_stats_count(dev); ++ if (ops->get_regs_len) ++ info.regdump_len = ops->get_regs_len(dev); ++ if (ops->get_eeprom_len) ++ info.eedump_len = ops->get_eeprom_len(dev); ++ ++ if (copy_to_user(useraddr, &info, sizeof(info))) ++ return -EFAULT; ++ return 0; ++} ++ ++static int ethtool_get_regs(struct net_device *dev, char *useraddr) ++{ ++ struct ethtool_regs regs; ++ struct ethtool_ops *ops = ethtool_ops; ++ void *regbuf; ++ int reglen, ret; ++ ++ if (!ops->get_regs || !ops->get_regs_len) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(®s, useraddr, sizeof(regs))) ++ return -EFAULT; ++ ++ reglen = ops->get_regs_len(dev); ++ if (regs.len > reglen) ++ regs.len = reglen; ++ ++ regbuf = kmalloc(reglen, GFP_USER); ++ if (!regbuf) ++ return -ENOMEM; ++ ++ ops->get_regs(dev, ®s, regbuf); ++ ++ ret = -EFAULT; ++ if (copy_to_user(useraddr, ®s, sizeof(regs))) ++ goto out; ++ useraddr += offsetof(struct ethtool_regs, data); ++ if (copy_to_user(useraddr, regbuf, reglen)) ++ goto out; ++ ret = 0; ++ ++out: ++ kfree(regbuf); ++ return ret; ++} ++ ++static int ethtool_get_wol(struct net_device *dev, char *useraddr) ++{ ++ struct ethtool_wolinfo wol = { ETHTOOL_GWOL }; ++ ++ if (!ethtool_ops->get_wol) ++ return -EOPNOTSUPP; ++ ++ ethtool_ops->get_wol(dev, &wol); ++ ++ if (copy_to_user(useraddr, &wol, sizeof(wol))) ++ return -EFAULT; ++ return 0; ++} ++ ++static int ethtool_set_wol(struct net_device *dev, char *useraddr) ++{ ++ struct ethtool_wolinfo wol; ++ ++ if (!ethtool_ops->set_wol) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&wol, useraddr, sizeof(wol))) ++ return -EFAULT; ++ ++ return ethtool_ops->set_wol(dev, &wol); ++} ++ ++static int ethtool_get_msglevel(struct net_device *dev, char *useraddr) ++{ ++ struct ethtool_value edata = { ETHTOOL_GMSGLVL }; ++ ++ if (!ethtool_ops->get_msglevel) ++ return -EOPNOTSUPP; ++ ++ edata.data = ethtool_ops->get_msglevel(dev); ++ ++ if (copy_to_user(useraddr, &edata, sizeof(edata))) ++ return -EFAULT; ++ return 0; ++} ++ ++static int ethtool_set_msglevel(struct net_device *dev, char *useraddr) ++{ ++ struct ethtool_value edata; ++ ++ if (!ethtool_ops->set_msglevel) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&edata, useraddr, sizeof(edata))) ++ return -EFAULT; ++ ++ ethtool_ops->set_msglevel(dev, edata.data); ++ return 0; ++} ++ ++static int ethtool_nway_reset(struct net_device *dev) ++{ ++ if (!ethtool_ops->nway_reset) ++ return -EOPNOTSUPP; ++ ++ return ethtool_ops->nway_reset(dev); ++} ++ ++static int ethtool_get_link(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_value edata = { ETHTOOL_GLINK }; ++ ++ if (!ethtool_ops->get_link) ++ return -EOPNOTSUPP; ++ ++ edata.data = ethtool_ops->get_link(dev); ++ ++ if (copy_to_user(useraddr, &edata, sizeof(edata))) ++ return -EFAULT; ++ return 0; ++} ++ ++static int ethtool_get_eeprom(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_eeprom eeprom; ++ struct ethtool_ops *ops = ethtool_ops; ++ u8 *data; ++ int ret; ++ ++ if (!ops->get_eeprom || !ops->get_eeprom_len) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&eeprom, useraddr, sizeof(eeprom))) ++ return -EFAULT; ++ ++ /* Check for wrap and zero */ ++ if (eeprom.offset + eeprom.len <= eeprom.offset) ++ return -EINVAL; ++ ++ /* Check for exceeding total eeprom len */ ++ if (eeprom.offset + eeprom.len > ops->get_eeprom_len(dev)) ++ return -EINVAL; ++ ++ data = kmalloc(eeprom.len, GFP_USER); ++ if (!data) ++ return -ENOMEM; ++ ++ ret = -EFAULT; ++ if (copy_from_user(data, useraddr + sizeof(eeprom), eeprom.len)) ++ goto out; ++ ++ ret = ops->get_eeprom(dev, &eeprom, data); ++ if (ret) ++ goto out; ++ ++ ret = -EFAULT; ++ if (copy_to_user(useraddr, &eeprom, sizeof(eeprom))) ++ goto out; ++ if (copy_to_user(useraddr + sizeof(eeprom), data, eeprom.len)) ++ goto out; ++ ret = 0; ++ ++out: ++ kfree(data); ++ return ret; ++} ++ ++static int ethtool_set_eeprom(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_eeprom eeprom; ++ struct ethtool_ops *ops = ethtool_ops; ++ u8 *data; ++ int ret; ++ ++ if (!ops->set_eeprom || !ops->get_eeprom_len) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&eeprom, useraddr, sizeof(eeprom))) ++ return -EFAULT; ++ ++ /* Check for wrap and zero */ ++ if (eeprom.offset + eeprom.len <= eeprom.offset) ++ return -EINVAL; ++ ++ /* Check for exceeding total eeprom len */ ++ if (eeprom.offset + eeprom.len > ops->get_eeprom_len(dev)) ++ return -EINVAL; ++ ++ data = kmalloc(eeprom.len, GFP_USER); ++ if (!data) ++ return -ENOMEM; ++ ++ ret = -EFAULT; ++ if (copy_from_user(data, useraddr + sizeof(eeprom), eeprom.len)) ++ goto out; ++ ++ ret = ops->set_eeprom(dev, &eeprom, data); ++ if (ret) ++ goto out; ++ ++ if (copy_to_user(useraddr + sizeof(eeprom), data, eeprom.len)) ++ ret = -EFAULT; ++ ++out: ++ kfree(data); ++ return ret; ++} ++ ++static int ethtool_get_coalesce(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_coalesce coalesce = { ETHTOOL_GCOALESCE }; ++ ++ if (!ethtool_ops->get_coalesce) ++ return -EOPNOTSUPP; ++ ++ ethtool_ops->get_coalesce(dev, &coalesce); ++ ++ if (copy_to_user(useraddr, &coalesce, sizeof(coalesce))) ++ return -EFAULT; ++ return 0; ++} ++ ++static int ethtool_set_coalesce(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_coalesce coalesce; ++ ++ if (!ethtool_ops->get_coalesce) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&coalesce, useraddr, sizeof(coalesce))) ++ return -EFAULT; ++ ++ return ethtool_ops->set_coalesce(dev, &coalesce); ++} ++ ++static int ethtool_get_ringparam(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_ringparam ringparam = { ETHTOOL_GRINGPARAM }; ++ ++ if (!ethtool_ops->get_ringparam) ++ return -EOPNOTSUPP; ++ ++ ethtool_ops->get_ringparam(dev, &ringparam); ++ ++ if (copy_to_user(useraddr, &ringparam, sizeof(ringparam))) ++ return -EFAULT; ++ return 0; ++} ++ ++static int ethtool_set_ringparam(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_ringparam ringparam; ++ ++ if (!ethtool_ops->get_ringparam) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&ringparam, useraddr, sizeof(ringparam))) ++ return -EFAULT; ++ ++ return ethtool_ops->set_ringparam(dev, &ringparam); ++} ++ ++static int ethtool_get_pauseparam(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_pauseparam pauseparam = { ETHTOOL_GPAUSEPARAM }; ++ ++ if (!ethtool_ops->get_pauseparam) ++ return -EOPNOTSUPP; ++ ++ ethtool_ops->get_pauseparam(dev, &pauseparam); ++ ++ if (copy_to_user(useraddr, &pauseparam, sizeof(pauseparam))) ++ return -EFAULT; ++ return 0; ++} ++ ++static int ethtool_set_pauseparam(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_pauseparam pauseparam; ++ ++ if (!ethtool_ops->get_pauseparam) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&pauseparam, useraddr, sizeof(pauseparam))) ++ return -EFAULT; ++ ++ return ethtool_ops->set_pauseparam(dev, &pauseparam); ++} ++ ++static int ethtool_get_rx_csum(struct net_device *dev, char *useraddr) ++{ ++ struct ethtool_value edata = { ETHTOOL_GRXCSUM }; ++ ++ if (!ethtool_ops->get_rx_csum) ++ return -EOPNOTSUPP; ++ ++ edata.data = ethtool_ops->get_rx_csum(dev); ++ ++ if (copy_to_user(useraddr, &edata, sizeof(edata))) ++ return -EFAULT; ++ return 0; ++} ++ ++static int ethtool_set_rx_csum(struct net_device *dev, char *useraddr) ++{ ++ struct ethtool_value edata; ++ ++ if (!ethtool_ops->set_rx_csum) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&edata, useraddr, sizeof(edata))) ++ return -EFAULT; ++ ++ ethtool_ops->set_rx_csum(dev, edata.data); ++ return 0; ++} ++ ++static int ethtool_get_tx_csum(struct net_device *dev, char *useraddr) ++{ ++ struct ethtool_value edata = { ETHTOOL_GTXCSUM }; ++ ++ if (!ethtool_ops->get_tx_csum) ++ return -EOPNOTSUPP; ++ ++ edata.data = ethtool_ops->get_tx_csum(dev); ++ ++ if (copy_to_user(useraddr, &edata, sizeof(edata))) ++ return -EFAULT; ++ return 0; ++} ++ ++static int ethtool_set_tx_csum(struct net_device *dev, char *useraddr) ++{ ++ struct ethtool_value edata; ++ ++ if (!ethtool_ops->set_tx_csum) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&edata, useraddr, sizeof(edata))) ++ return -EFAULT; ++ ++ return ethtool_ops->set_tx_csum(dev, edata.data); ++} ++ ++static int ethtool_get_sg(struct net_device *dev, char *useraddr) ++{ ++ struct ethtool_value edata = { ETHTOOL_GSG }; ++ ++ if (!ethtool_ops->get_sg) ++ return -EOPNOTSUPP; ++ ++ edata.data = ethtool_ops->get_sg(dev); ++ ++ if (copy_to_user(useraddr, &edata, sizeof(edata))) ++ return -EFAULT; ++ return 0; ++} ++ ++static int ethtool_set_sg(struct net_device *dev, char *useraddr) ++{ ++ struct ethtool_value edata; ++ ++ if (!ethtool_ops->set_sg) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&edata, useraddr, sizeof(edata))) ++ return -EFAULT; ++ ++ return ethtool_ops->set_sg(dev, edata.data); ++} ++ ++static int ethtool_get_tso(struct net_device *dev, char *useraddr) ++{ ++ struct ethtool_value edata = { ETHTOOL_GTSO }; ++ ++ if (!ethtool_ops->get_tso) ++ return -EOPNOTSUPP; ++ ++ edata.data = ethtool_ops->get_tso(dev); ++ ++ if (copy_to_user(useraddr, &edata, sizeof(edata))) ++ return -EFAULT; ++ return 0; ++} ++ ++static int ethtool_set_tso(struct net_device *dev, char *useraddr) ++{ ++ struct ethtool_value edata; ++ ++ if (!ethtool_ops->set_tso) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&edata, useraddr, sizeof(edata))) ++ return -EFAULT; ++ ++ return ethtool_ops->set_tso(dev, edata.data); ++} ++ ++static int ethtool_self_test(struct net_device *dev, char *useraddr) ++{ ++ struct ethtool_test test; ++ struct ethtool_ops *ops = ethtool_ops; ++ u64 *data; ++ int ret; ++ ++ if (!ops->self_test || !ops->self_test_count) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&test, useraddr, sizeof(test))) ++ return -EFAULT; ++ ++ test.len = ops->self_test_count(dev); ++ data = kmalloc(test.len * sizeof(u64), GFP_USER); ++ if (!data) ++ return -ENOMEM; ++ ++ ops->self_test(dev, &test, data); ++ ++ ret = -EFAULT; ++ if (copy_to_user(useraddr, &test, sizeof(test))) ++ goto out; ++ useraddr += sizeof(test); ++ if (copy_to_user(useraddr, data, test.len * sizeof(u64))) ++ goto out; ++ ret = 0; ++ ++out: ++ kfree(data); ++ return ret; ++} ++ ++static int ethtool_get_strings(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_gstrings gstrings; ++ struct ethtool_ops *ops = ethtool_ops; ++ u8 *data; ++ int ret; ++ ++ if (!ops->get_strings) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&gstrings, useraddr, sizeof(gstrings))) ++ return -EFAULT; ++ ++ switch (gstrings.string_set) { ++ case ETH_SS_TEST: ++ if (!ops->self_test_count) ++ return -EOPNOTSUPP; ++ gstrings.len = ops->self_test_count(dev); ++ break; ++ case ETH_SS_STATS: ++ if (!ops->get_stats_count) ++ return -EOPNOTSUPP; ++ gstrings.len = ops->get_stats_count(dev); ++ break; ++ default: ++ return -EINVAL; ++ } ++ ++ data = kmalloc(gstrings.len * ETH_GSTRING_LEN, GFP_USER); ++ if (!data) ++ return -ENOMEM; ++ ++ ops->get_strings(dev, gstrings.string_set, data); ++ ++ ret = -EFAULT; ++ if (copy_to_user(useraddr, &gstrings, sizeof(gstrings))) ++ goto out; ++ useraddr += sizeof(gstrings); ++ if (copy_to_user(useraddr, data, gstrings.len * ETH_GSTRING_LEN)) ++ goto out; ++ ret = 0; ++ ++out: ++ kfree(data); ++ return ret; ++} ++ ++static int ethtool_phys_id(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_value id; ++ ++ if (!ethtool_ops->phys_id) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&id, useraddr, sizeof(id))) ++ return -EFAULT; ++ ++ return ethtool_ops->phys_id(dev, id.data); ++} ++ ++static int ethtool_get_stats(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_stats stats; ++ struct ethtool_ops *ops = ethtool_ops; ++ u64 *data; ++ int ret; ++ ++ if (!ops->get_ethtool_stats || !ops->get_stats_count) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&stats, useraddr, sizeof(stats))) ++ return -EFAULT; ++ ++ stats.n_stats = ops->get_stats_count(dev); ++ data = kmalloc(stats.n_stats * sizeof(u64), GFP_USER); ++ if (!data) ++ return -ENOMEM; ++ ++ ops->get_ethtool_stats(dev, &stats, data); ++ ++ ret = -EFAULT; ++ if (copy_to_user(useraddr, &stats, sizeof(stats))) ++ goto out; ++ useraddr += sizeof(stats); ++ if (copy_to_user(useraddr, data, stats.n_stats * sizeof(u64))) ++ goto out; ++ ret = 0; ++ ++out: ++ kfree(data); ++ return ret; ++} ++ ++/* The main entry point in this file. Called from net/core/dev.c */ ++ ++#define ETHTOOL_OPS_COMPAT ++int ethtool_ioctl(struct ifreq *ifr) ++{ ++ struct net_device *dev = __dev_get_by_name(ifr->ifr_name); ++ void *useraddr = (void *) ifr->ifr_data; ++ u32 ethcmd; ++ ++ /* ++ * XXX: This can be pushed down into the ethtool_* handlers that ++ * need it. Keep existing behavior for the moment. ++ */ ++ if (!capable(CAP_NET_ADMIN)) ++ return -EPERM; ++ ++ if (!dev || !netif_device_present(dev)) ++ return -ENODEV; ++ ++ if (copy_from_user(ðcmd, useraddr, sizeof (ethcmd))) ++ return -EFAULT; ++ ++ switch (ethcmd) { ++ case ETHTOOL_GSET: ++ return ethtool_get_settings(dev, useraddr); ++ case ETHTOOL_SSET: ++ return ethtool_set_settings(dev, useraddr); ++ case ETHTOOL_GDRVINFO: ++ return ethtool_get_drvinfo(dev, useraddr); ++ case ETHTOOL_GREGS: ++ return ethtool_get_regs(dev, useraddr); ++ case ETHTOOL_GWOL: ++ return ethtool_get_wol(dev, useraddr); ++ case ETHTOOL_SWOL: ++ return ethtool_set_wol(dev, useraddr); ++ case ETHTOOL_GMSGLVL: ++ return ethtool_get_msglevel(dev, useraddr); ++ case ETHTOOL_SMSGLVL: ++ return ethtool_set_msglevel(dev, useraddr); ++ case ETHTOOL_NWAY_RST: ++ return ethtool_nway_reset(dev); ++ case ETHTOOL_GLINK: ++ return ethtool_get_link(dev, useraddr); ++ case ETHTOOL_GEEPROM: ++ return ethtool_get_eeprom(dev, useraddr); ++ case ETHTOOL_SEEPROM: ++ return ethtool_set_eeprom(dev, useraddr); ++ case ETHTOOL_GCOALESCE: ++ return ethtool_get_coalesce(dev, useraddr); ++ case ETHTOOL_SCOALESCE: ++ return ethtool_set_coalesce(dev, useraddr); ++ case ETHTOOL_GRINGPARAM: ++ return ethtool_get_ringparam(dev, useraddr); ++ case ETHTOOL_SRINGPARAM: ++ return ethtool_set_ringparam(dev, useraddr); ++ case ETHTOOL_GPAUSEPARAM: ++ return ethtool_get_pauseparam(dev, useraddr); ++ case ETHTOOL_SPAUSEPARAM: ++ return ethtool_set_pauseparam(dev, useraddr); ++ case ETHTOOL_GRXCSUM: ++ return ethtool_get_rx_csum(dev, useraddr); ++ case ETHTOOL_SRXCSUM: ++ return ethtool_set_rx_csum(dev, useraddr); ++ case ETHTOOL_GTXCSUM: ++ return ethtool_get_tx_csum(dev, useraddr); ++ case ETHTOOL_STXCSUM: ++ return ethtool_set_tx_csum(dev, useraddr); ++ case ETHTOOL_GSG: ++ return ethtool_get_sg(dev, useraddr); ++ case ETHTOOL_SSG: ++ return ethtool_set_sg(dev, useraddr); ++ case ETHTOOL_GTSO: ++ return ethtool_get_tso(dev, useraddr); ++ case ETHTOOL_STSO: ++ return ethtool_set_tso(dev, useraddr); ++ case ETHTOOL_TEST: ++ return ethtool_self_test(dev, useraddr); ++ case ETHTOOL_GSTRINGS: ++ return ethtool_get_strings(dev, useraddr); ++ case ETHTOOL_PHYS_ID: ++ return ethtool_phys_id(dev, useraddr); ++ case ETHTOOL_GSTATS: ++ return ethtool_get_stats(dev, useraddr); ++ default: ++ return -EOPNOTSUPP; ++ } ++ ++ return -EOPNOTSUPP; ++} ++ ++#define mii_if_info _kc_mii_if_info ++struct _kc_mii_if_info { ++ int phy_id; ++ int advertising; ++ int phy_id_mask; ++ int reg_num_mask; ++ ++ unsigned int full_duplex : 1; /* is full duplex? */ ++ unsigned int force_media : 1; /* is autoneg. disabled? */ ++ ++ struct net_device *dev; ++ int (*mdio_read) (struct net_device *dev, int phy_id, int location); ++ void (*mdio_write) (struct net_device *dev, int phy_id, int location, int val); ++}; ++ ++struct ethtool_cmd; ++struct mii_ioctl_data; ++ ++#undef mii_link_ok ++#define mii_link_ok _kc_mii_link_ok ++#undef mii_nway_restart ++#define mii_nway_restart _kc_mii_nway_restart ++#undef mii_ethtool_gset ++#define mii_ethtool_gset _kc_mii_ethtool_gset ++#undef mii_ethtool_sset ++#define mii_ethtool_sset _kc_mii_ethtool_sset ++#undef mii_check_link ++#define mii_check_link _kc_mii_check_link ++#undef generic_mii_ioctl ++#define generic_mii_ioctl _kc_generic_mii_ioctl ++extern int _kc_mii_link_ok (struct mii_if_info *mii); ++extern int _kc_mii_nway_restart (struct mii_if_info *mii); ++extern int _kc_mii_ethtool_gset(struct mii_if_info *mii, ++ struct ethtool_cmd *ecmd); ++extern int _kc_mii_ethtool_sset(struct mii_if_info *mii, ++ struct ethtool_cmd *ecmd); ++extern void _kc_mii_check_link (struct mii_if_info *mii); ++extern int _kc_generic_mii_ioctl(struct mii_if_info *mii_if, ++ struct mii_ioctl_data *mii_data, int cmd, ++ unsigned int *duplex_changed); ++ ++ ++struct _kc_pci_dev_ext { ++ struct pci_dev *dev; ++ void *pci_drvdata; ++ struct pci_driver *driver; ++}; ++ ++struct _kc_net_dev_ext { ++ struct net_device *dev; ++ unsigned int carrier; ++}; ++ ++ ++/**************************************/ ++/* mii support */ ++ ++int _kc_mii_ethtool_gset(struct mii_if_info *mii, struct ethtool_cmd *ecmd) ++{ ++ struct net_device *dev = mii->dev; ++ u32 advert, bmcr, lpa, nego; ++ ++ ecmd->supported = ++ (SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full | ++ SUPPORTED_100baseT_Half | SUPPORTED_100baseT_Full | ++ SUPPORTED_Autoneg | SUPPORTED_TP | SUPPORTED_MII); ++ ++ /* only supports twisted-pair */ ++ ecmd->port = PORT_MII; ++ ++ /* only supports internal transceiver */ ++ ecmd->transceiver = XCVR_INTERNAL; ++ ++ /* this isn't fully supported at higher layers */ ++ ecmd->phy_address = mii->phy_id; ++ ++ ecmd->advertising = ADVERTISED_TP | ADVERTISED_MII; ++ advert = mii->mdio_read(dev, mii->phy_id, MII_ADVERTISE); ++ if (advert & ADVERTISE_10HALF) ++ ecmd->advertising |= ADVERTISED_10baseT_Half; ++ if (advert & ADVERTISE_10FULL) ++ ecmd->advertising |= ADVERTISED_10baseT_Full; ++ if (advert & ADVERTISE_100HALF) ++ ecmd->advertising |= ADVERTISED_100baseT_Half; ++ if (advert & ADVERTISE_100FULL) ++ ecmd->advertising |= ADVERTISED_100baseT_Full; ++ ++ bmcr = mii->mdio_read(dev, mii->phy_id, MII_BMCR); ++ lpa = mii->mdio_read(dev, mii->phy_id, MII_LPA); ++ if (bmcr & BMCR_ANENABLE) { ++ ecmd->advertising |= ADVERTISED_Autoneg; ++ ecmd->autoneg = AUTONEG_ENABLE; ++ ++ nego = mii_nway_result(advert & lpa); ++ if (nego == LPA_100FULL || nego == LPA_100HALF) ++ ecmd->speed = SPEED_100; ++ else ++ ecmd->speed = SPEED_10; ++ if (nego == LPA_100FULL || nego == LPA_10FULL) { ++ ecmd->duplex = DUPLEX_FULL; ++ mii->full_duplex = 1; ++ } else { ++ ecmd->duplex = DUPLEX_HALF; ++ mii->full_duplex = 0; ++ } ++ } else { ++ ecmd->autoneg = AUTONEG_DISABLE; ++ ++ ecmd->speed = (bmcr & BMCR_SPEED100) ? SPEED_100 : SPEED_10; ++ ecmd->duplex = (bmcr & BMCR_FULLDPLX) ? DUPLEX_FULL : DUPLEX_HALF; ++ } ++ ++ /* ignore maxtxpkt, maxrxpkt for now */ ++ ++ return 0; ++} ++ ++int _kc_mii_ethtool_sset(struct mii_if_info *mii, struct ethtool_cmd *ecmd) ++{ ++ struct net_device *dev = mii->dev; ++ ++ if (ecmd->speed != SPEED_10 && ecmd->speed != SPEED_100) ++ return -EINVAL; ++ if (ecmd->duplex != DUPLEX_HALF && ecmd->duplex != DUPLEX_FULL) ++ return -EINVAL; ++ if (ecmd->port != PORT_MII) ++ return -EINVAL; ++ if (ecmd->transceiver != XCVR_INTERNAL) ++ return -EINVAL; ++ if (ecmd->phy_address != mii->phy_id) ++ return -EINVAL; ++ if (ecmd->autoneg != AUTONEG_DISABLE && ecmd->autoneg != AUTONEG_ENABLE) ++ return -EINVAL; ++ ++ /* ignore supported, maxtxpkt, maxrxpkt */ ++ ++ if (ecmd->autoneg == AUTONEG_ENABLE) { ++ u32 bmcr, advert, tmp; ++ ++ if ((ecmd->advertising & (ADVERTISED_10baseT_Half | ++ ADVERTISED_10baseT_Full | ++ ADVERTISED_100baseT_Half | ++ ADVERTISED_100baseT_Full)) == 0) ++ return -EINVAL; ++ ++ /* advertise only what has been requested */ ++ advert = mii->mdio_read(dev, mii->phy_id, MII_ADVERTISE); ++ tmp = advert & ~(ADVERTISE_ALL | ADVERTISE_100BASE4); ++ if (ADVERTISED_10baseT_Half) ++ tmp |= ADVERTISE_10HALF; ++ if (ADVERTISED_10baseT_Full) ++ tmp |= ADVERTISE_10FULL; ++ if (ADVERTISED_100baseT_Half) ++ tmp |= ADVERTISE_100HALF; ++ if (ADVERTISED_100baseT_Full) ++ tmp |= ADVERTISE_100FULL; ++ if (advert != tmp) { ++ mii->mdio_write(dev, mii->phy_id, MII_ADVERTISE, tmp); ++ mii->advertising = tmp; ++ } ++ ++ /* turn on autonegotiation, and force a renegotiate */ ++ bmcr = mii->mdio_read(dev, mii->phy_id, MII_BMCR); ++ bmcr |= (BMCR_ANENABLE | BMCR_ANRESTART); ++ mii->mdio_write(dev, mii->phy_id, MII_BMCR, bmcr); ++ ++ mii->force_media = 0; ++ } else { ++ u32 bmcr, tmp; ++ ++ /* turn off auto negotiation, set speed and duplexity */ ++ bmcr = mii->mdio_read(dev, mii->phy_id, MII_BMCR); ++ tmp = bmcr & ~(BMCR_ANENABLE | BMCR_SPEED100 | BMCR_FULLDPLX); ++ if (ecmd->speed == SPEED_100) ++ tmp |= BMCR_SPEED100; ++ if (ecmd->duplex == DUPLEX_FULL) { ++ tmp |= BMCR_FULLDPLX; ++ mii->full_duplex = 1; ++ } else ++ mii->full_duplex = 0; ++ if (bmcr != tmp) ++ mii->mdio_write(dev, mii->phy_id, MII_BMCR, tmp); ++ ++ mii->force_media = 1; ++ } ++ return 0; ++} ++ ++int _kc_mii_link_ok (struct mii_if_info *mii) ++{ ++ /* first, a dummy read, needed to latch some MII phys */ ++ mii->mdio_read(mii->dev, mii->phy_id, MII_BMSR); ++ if (mii->mdio_read(mii->dev, mii->phy_id, MII_BMSR) & BMSR_LSTATUS) ++ return 1; ++ return 0; ++} ++ ++int _kc_mii_nway_restart (struct mii_if_info *mii) ++{ ++ int bmcr; ++ int r = -EINVAL; ++ ++ /* if autoneg is off, it's an error */ ++ bmcr = mii->mdio_read(mii->dev, mii->phy_id, MII_BMCR); ++ ++ if (bmcr & BMCR_ANENABLE) { ++ bmcr |= BMCR_ANRESTART; ++ mii->mdio_write(mii->dev, mii->phy_id, MII_BMCR, bmcr); ++ r = 0; ++ } ++ ++ return r; ++} ++ ++void _kc_mii_check_link (struct mii_if_info *mii) ++{ ++ int cur_link = mii_link_ok(mii); ++ int prev_link = netif_carrier_ok(mii->dev); ++ ++ if (cur_link && !prev_link) ++ netif_carrier_on(mii->dev); ++ else if (prev_link && !cur_link) ++ netif_carrier_off(mii->dev); ++} ++ ++int _kc_generic_mii_ioctl(struct mii_if_info *mii_if, ++ struct mii_ioctl_data *mii_data, int cmd, ++ unsigned int *duplex_chg_out) ++{ ++ int rc = 0; ++ unsigned int duplex_changed = 0; ++ ++ if (duplex_chg_out) ++ *duplex_chg_out = 0; ++ ++ mii_data->phy_id &= mii_if->phy_id_mask; ++ mii_data->reg_num &= mii_if->reg_num_mask; ++ ++ switch(cmd) { ++ case SIOCDEVPRIVATE: /* binary compat, remove in 2.5 */ ++ case SIOCGMIIPHY: ++ mii_data->phy_id = mii_if->phy_id; ++ /* fall through */ ++ ++ case SIOCDEVPRIVATE + 1:/* binary compat, remove in 2.5 */ ++ case SIOCGMIIREG: ++ mii_data->val_out = ++ mii_if->mdio_read(mii_if->dev, mii_data->phy_id, ++ mii_data->reg_num); ++ break; ++ ++ case SIOCDEVPRIVATE + 2:/* binary compat, remove in 2.5 */ ++ case SIOCSMIIREG: { ++ u16 val = mii_data->val_in; ++ ++ if (!capable(CAP_NET_ADMIN)) ++ return -EPERM; ++ ++ if (mii_data->phy_id == mii_if->phy_id) { ++ switch(mii_data->reg_num) { ++ case MII_BMCR: { ++ unsigned int new_duplex = 0; ++ if (val & (BMCR_RESET|BMCR_ANENABLE)) ++ mii_if->force_media = 0; ++ else ++ mii_if->force_media = 1; ++ if (mii_if->force_media && ++ (val & BMCR_FULLDPLX)) ++ new_duplex = 1; ++ if (mii_if->full_duplex != new_duplex) { ++ duplex_changed = 1; ++ mii_if->full_duplex = new_duplex; ++ } ++ break; ++ } ++ case MII_ADVERTISE: ++ mii_if->advertising = val; ++ break; ++ default: ++ /* do nothing */ ++ break; ++ } ++ } ++ ++ mii_if->mdio_write(mii_if->dev, mii_data->phy_id, ++ mii_data->reg_num, val); ++ break; ++ } ++ ++ default: ++ rc = -EOPNOTSUPP; ++ break; ++ } ++ ++ if ((rc == 0) && (duplex_chg_out) && (duplex_changed)) ++ *duplex_chg_out = 1; ++ ++ return rc; ++} ++ diff --git a/master/e1000e-0.5.18.3.patch b/master/e1000e-0.5.18.3.patch new file mode 100644 index 0000000..e379c79 --- /dev/null +++ b/master/e1000e-0.5.18.3.patch @@ -0,0 +1,22770 @@ +diff -r bd70f2f305c6 drivers/net/e1000e/82571.c +--- a/drivers/net/e1000e/82571.c Mon Jun 15 11:43:16 2009 +0100 ++++ b/drivers/net/e1000e/82571.c Mon Jun 15 11:45:35 2009 +0100 +@@ -92,10 +92,22 @@ + switch (hw->mac.type) { + case e1000_82571: + case e1000_82572: +- phy->type = e1000_phy_igp_2; ++ phy->type = e1000_phy_igp_2; ++ ret_val = e1000_get_phy_id_82571(hw); ++ ++ /* Verify PHY ID */ ++ if (phy->id != IGP01E1000_I_PHY_ID) ++ return -E1000_ERR_PHY; + break; + case e1000_82573: +- phy->type = e1000_phy_m88; ++ phy->type = e1000_phy_m88; ++ ret_val = e1000_get_phy_id_82571(hw); ++ ++ /* Verify PHY ID */ ++ if (phy->id != M88E1111_I_PHY_ID) { ++ hw_dbg(hw, "PHY ID unknown: type = 0x%08x\n", phy->id); ++ return -E1000_ERR_PHY; ++ } + break; + case e1000_82574: + phy->type = e1000_phy_bm; +@@ -333,10 +345,11 @@ + if (pdev->device == E1000_DEV_ID_82573L) { + e1000_read_nvm(&adapter->hw, NVM_INIT_3GIO_3, 1, + &eeprom_data); +- if (eeprom_data & NVM_WORD1A_ASPM_MASK) +- adapter->flags &= ~FLAG_HAS_JUMBO_FRAMES; ++ if (!(eeprom_data & NVM_WORD1A_ASPM_MASK)) ++ adapter->flags |= FLAG_HAS_JUMBO_FRAMES; + } + break; ++ + default: + break; + } +diff -r bd70f2f305c6 drivers/net/e1000e/Makefile +--- a/drivers/net/e1000e/Makefile Mon Jun 15 11:43:16 2009 +0100 ++++ b/drivers/net/e1000e/Makefile Mon Jun 15 11:45:35 2009 +0100 +@@ -32,6 +32,13 @@ + + obj-$(CONFIG_E1000E) += e1000e.o + +-e1000e-objs := 82571.o ich8lan.o es2lan.o \ +- lib.o phy.o param.o ethtool.o netdev.o ++FAMILYC = e1000_82571.c e1000_ich8lan.c e1000_80003es2lan.c + ++# core driver files ++CFILES = netdev.c ethtool.c param.c $(FAMILYC) \ ++ e1000_mac.c e1000_nvm.c e1000_phy.c e1000_manage.c kcompat.c ++ ++e1000e-objs := $(CFILES:.c=.o) ++ ++EXTRA_CFLAGS += -DDRIVER_E1000E ++ +diff -r bd70f2f305c6 drivers/net/e1000e/e1000.h +--- a/drivers/net/e1000e/e1000.h Mon Jun 15 11:43:16 2009 +0100 ++++ b/drivers/net/e1000e/e1000.h Mon Jun 15 11:45:35 2009 +0100 +@@ -1,7 +1,7 @@ + /******************************************************************************* + + Intel PRO/1000 Linux driver +- Copyright(c) 1999 - 2008 Intel Corporation. ++ Copyright(c) 1999 - 2009 Intel Corporation. + + This program is free software; you can redistribute it and/or modify it + under the terms and conditions of the GNU General Public License, +@@ -32,24 +32,25 @@ + #define _E1000_H_ + + #include +-#include +-#include +-#include ++#include + #include ++#include + ++#include "kcompat.h" + #include "hw.h" + + struct e1000_info; + + #define e_printk(level, adapter, format, arg...) \ + printk(level "%s: %s: " format, pci_name(adapter->pdev), \ +- adapter->netdev->name, ## arg) ++ (strchr(adapter->netdev->name, '%') ? "" : \ ++ adapter->netdev->name), ## arg) + + #ifdef DEBUG + #define e_dbg(format, arg...) \ +- e_printk(KERN_DEBUG , adapter, format, ## arg) ++ e_printk(KERN_DEBUG, hw->adapter, format, ## arg) + #else +-#define e_dbg(format, arg...) do { (void)(adapter); } while (0) ++#define e_dbg(format, arg...) do { (void)(hw); } while (0) + #endif + + #define e_err(format, arg...) \ +@@ -62,11 +63,17 @@ + e_printk(KERN_NOTICE, adapter, format, ## arg) + + ++#ifdef CONFIG_E1000E_MSIX + /* Interrupt modes, as used by the IntMode paramter */ + #define E1000E_INT_MODE_LEGACY 0 + #define E1000E_INT_MODE_MSI 1 + #define E1000E_INT_MODE_MSIX 2 + ++#endif /* CONFIG_E1000E_MSIX */ ++#ifndef CONFIG_E1000E_NAPI ++#define E1000_MAX_INTR 10 ++ ++#endif /* CONFIG_E1000E_NAPI */ + /* Tx/Rx descriptor defines */ + #define E1000_DEFAULT_TXD 256 + #define E1000_MAX_TXD 4096 +@@ -105,6 +112,7 @@ + board_ich8lan, + board_ich9lan, + board_ich10lan, ++ board_82583, + }; + + struct e1000_queue_stats { +@@ -153,17 +161,20 @@ + /* array of buffer information structs */ + struct e1000_buffer *buffer_info; + ++#ifdef CONFIG_E1000E_MSIX + char name[IFNAMSIZ + 5]; + u32 ims_val; + u32 itr_val; + u16 itr_register; + int set_itr; + ++#endif /* CONFIG_E1000E_MSIX */ + struct sk_buff *rx_skb_top; + + struct e1000_queue_stats stats; + }; + ++#ifdef SIOCGMIIPHY + /* PHY register snapshot values */ + struct e1000_phy_regs { + u16 bmcr; /* basic mode control register */ +@@ -175,6 +186,7 @@ + u16 stat1000; /* 1000BASE-T status register */ + u16 estatus; /* extended status register */ + }; ++#endif + + /* board specific private data structure */ + struct e1000_adapter { +@@ -193,8 +205,7 @@ + u16 mng_vlan_id; + u16 link_speed; + u16 link_duplex; +- +- spinlock_t tx_queue_lock; /* prevent concurrent tail updates */ ++ u16 eeprom_vers; + + /* track device up/down/testing state */ + unsigned long state; +@@ -211,7 +222,9 @@ + struct e1000_ring *tx_ring /* One per active queue */ + ____cacheline_aligned_in_smp; + ++#ifdef CONFIG_E1000E_NAPI + struct napi_struct napi; ++#endif + + unsigned long tx_queue_len; + unsigned int restart_queue; +@@ -242,9 +255,14 @@ + /* + * Rx + */ ++#ifdef CONFIG_E1000E_NAPI + bool (*clean_rx) (struct e1000_adapter *adapter, + int *work_done, int work_to_do) + ____cacheline_aligned_in_smp; ++#else ++ bool (*clean_rx) (struct e1000_adapter *adapter) ++ ____cacheline_aligned_in_smp; ++#endif + void (*alloc_rx_buf) (struct e1000_adapter *adapter, + int cleaned_count); + struct e1000_ring *rx_ring; +@@ -278,17 +296,21 @@ + struct e1000_phy_info phy_info; + struct e1000_phy_stats phy_stats; + ++#ifdef SIOCGMIIPHY + /* Snapshot of PHY registers */ + struct e1000_phy_regs phy_regs; ++#endif + + struct e1000_ring test_tx_ring; + struct e1000_ring test_rx_ring; + u32 test_icr; + + u32 msg_enable; ++#ifdef CONFIG_E1000E_MSIX + struct msix_entry *msix_entries; + int int_mode; + u32 eiac_mask; ++#endif /* CONFIG_E1000E_MSIX */ + + u32 eeprom_wol; + u32 wol; +@@ -302,17 +324,16 @@ + unsigned int flags2; + struct work_struct downshift_task; + struct work_struct update_phy_task; ++ u32 *config_space; + }; + + struct e1000_info { + enum e1000_mac_type mac; + unsigned int flags; +- unsigned int flags2; ++ unsigned int flags2; + u32 pba; + s32 (*get_variants)(struct e1000_adapter *); +- struct e1000_mac_operations *mac_ops; +- struct e1000_phy_operations *phy_ops; +- struct e1000_nvm_operations *nvm_ops; ++ void (*init_ops)(struct e1000_hw *); + }; + + /* hardware capability, feature, and workaround flags */ +@@ -324,9 +345,10 @@ + #define FLAG_HAS_CTRLEXT_ON_LOAD (1 << 5) + #define FLAG_HAS_SWSM_ON_LOAD (1 << 6) + #define FLAG_HAS_JUMBO_FRAMES (1 << 7) +-#define FLAG_READ_ONLY_NVM (1 << 8) + #define FLAG_IS_ICH (1 << 9) ++#ifdef CONFIG_E1000E_MSIX + #define FLAG_HAS_MSIX (1 << 10) ++#endif + #define FLAG_HAS_SMART_POWER_DOWN (1 << 11) + #define FLAG_IS_QUAD_PORT_A (1 << 12) + #define FLAG_IS_QUAD_PORT (1 << 13) +@@ -377,6 +399,9 @@ + + extern void e1000e_check_options(struct e1000_adapter *adapter); + extern void e1000e_set_ethtool_ops(struct net_device *netdev); ++#ifdef ETHTOOL_OPS_COMPAT ++extern int ethtool_ioctl(struct ifreq *ifr); ++#endif + + extern int e1000e_up(struct e1000_adapter *adapter); + extern void e1000e_down(struct e1000_adapter *adapter); +@@ -388,32 +413,33 @@ + extern void e1000e_free_rx_resources(struct e1000_adapter *adapter); + extern void e1000e_free_tx_resources(struct e1000_adapter *adapter); + extern void e1000e_update_stats(struct e1000_adapter *adapter); ++extern bool e1000_has_link(struct e1000_adapter *adapter); ++#ifdef CONFIG_E1000E_MSIX + extern void e1000e_set_interrupt_capability(struct e1000_adapter *adapter); + extern void e1000e_reset_interrupt_capability(struct e1000_adapter *adapter); ++#endif + + extern unsigned int copybreak; + +-extern char *e1000e_get_hw_dev_name(struct e1000_hw *hw); +- +-extern struct e1000_info e1000_82571_info; +-extern struct e1000_info e1000_82572_info; +-extern struct e1000_info e1000_82573_info; +-extern struct e1000_info e1000_82574_info; +-extern struct e1000_info e1000_ich8_info; +-extern struct e1000_info e1000_ich9_info; +-extern struct e1000_info e1000_ich10_info; +-extern struct e1000_info e1000_es2_info; ++extern void e1000_init_function_pointers_82571(struct e1000_hw *hw); ++extern void e1000_init_function_pointers_80003es2lan(struct e1000_hw *hw); ++extern void e1000_init_function_pointers_ich8lan(struct e1000_hw *hw); + + extern s32 e1000e_read_pba_num(struct e1000_hw *hw, u32 *pba_num); + +-extern s32 e1000e_commit_phy(struct e1000_hw *hw); ++static inline s32 e1000e_commit_phy(struct e1000_hw *hw) ++{ ++ if (hw->phy.ops.commit) ++ return hw->phy.ops.commit(hw); ++ ++ return 0; ++} + + extern bool e1000e_enable_mng_pass_thru(struct e1000_hw *hw); + + extern bool e1000e_get_laa_state_82571(struct e1000_hw *hw); + extern void e1000e_set_laa_state_82571(struct e1000_hw *hw, bool state); + +-extern void e1000e_write_protect_nvm_ich8lan(struct e1000_hw *hw); + extern void e1000e_set_kmrn_lock_loss_workaround_ich8lan(struct e1000_hw *hw, + bool state); + extern void e1000e_igp3_phy_powerdown_workaround_ich8lan(struct e1000_hw *hw); +@@ -437,7 +463,10 @@ + extern s32 e1000e_copper_link_setup_m88(struct e1000_hw *hw); + extern s32 e1000e_copper_link_setup_igp(struct e1000_hw *hw); + extern s32 e1000e_setup_link(struct e1000_hw *hw); +-extern void e1000e_clear_vfta(struct e1000_hw *hw); ++static inline void e1000e_clear_vfta(struct e1000_hw *hw) ++{ ++ hw->mac.ops.clear_vfta(hw); ++} + extern void e1000e_init_rx_addrs(struct e1000_hw *hw, u16 rar_count); + extern void e1000e_update_mc_addr_list_generic(struct e1000_hw *hw, + u8 *mc_addr_list, +@@ -453,12 +482,16 @@ + extern s32 e1000e_config_fc_after_link_up(struct e1000_hw *hw); + extern s32 e1000e_force_mac_fc(struct e1000_hw *hw); + extern s32 e1000e_blink_led(struct e1000_hw *hw); +-extern void e1000e_write_vfta(struct e1000_hw *hw, u32 offset, u32 value); ++extern void e1000e_write_vfta_generic(struct e1000_hw *hw, u32 offset, u32 value); ++static inline void e1000e_write_vfta(struct e1000_hw *hw, u32 offset, u32 value) ++{ ++ if (hw->mac.ops.write_vfta) ++ hw->mac.ops.write_vfta(hw, offset, value); ++} + extern void e1000e_reset_adaptive(struct e1000_hw *hw); + extern void e1000e_update_adaptive(struct e1000_hw *hw); + + extern s32 e1000e_setup_copper_link(struct e1000_hw *hw); +-extern s32 e1000e_get_phy_id(struct e1000_hw *hw); + extern void e1000e_put_hw_semaphore(struct e1000_hw *hw); + extern s32 e1000e_check_reset_block_generic(struct e1000_hw *hw); + extern s32 e1000e_phy_force_speed_duplex_igp(struct e1000_hw *hw); +@@ -475,13 +508,10 @@ + extern s32 e1000e_get_phy_info_m88(struct e1000_hw *hw); + extern s32 e1000e_read_phy_reg_m88(struct e1000_hw *hw, u32 offset, u16 *data); + extern s32 e1000e_write_phy_reg_m88(struct e1000_hw *hw, u32 offset, u16 data); +-extern s32 e1000e_phy_init_script_igp3(struct e1000_hw *hw); + extern enum e1000_phy_type e1000e_get_phy_type_from_id(u32 phy_id); + extern s32 e1000e_determine_phy_address(struct e1000_hw *hw); + extern s32 e1000e_write_phy_reg_bm(struct e1000_hw *hw, u32 offset, u16 data); + extern s32 e1000e_read_phy_reg_bm(struct e1000_hw *hw, u32 offset, u16 *data); +-extern s32 e1000e_read_phy_reg_bm2(struct e1000_hw *hw, u32 offset, u16 *data); +-extern s32 e1000e_write_phy_reg_bm2(struct e1000_hw *hw, u32 offset, u16 data); + extern void e1000e_phy_force_speed_duplex_setup(struct e1000_hw *hw, u16 *phy_ctrl); + extern s32 e1000e_write_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 data); + extern s32 e1000e_read_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 *data); +@@ -494,27 +524,42 @@ + + static inline s32 e1000_phy_hw_reset(struct e1000_hw *hw) + { +- return hw->phy.ops.reset_phy(hw); ++ if (hw->phy.ops.reset) ++ return hw->phy.ops.reset(hw); ++ ++ return 0; + } + + static inline s32 e1000_check_reset_block(struct e1000_hw *hw) + { +- return hw->phy.ops.check_reset_block(hw); ++ if (hw->phy.ops.check_reset_block) ++ return hw->phy.ops.check_reset_block(hw); ++ ++ return 0; + } + + static inline s32 e1e_rphy(struct e1000_hw *hw, u32 offset, u16 *data) + { +- return hw->phy.ops.read_phy_reg(hw, offset, data); ++ if (hw->phy.ops.read_reg) ++ return hw->phy.ops.read_reg(hw, offset, data); ++ ++ return 0; + } + + static inline s32 e1e_wphy(struct e1000_hw *hw, u32 offset, u16 data) + { +- return hw->phy.ops.write_phy_reg(hw, offset, data); ++ if (hw->phy.ops.write_reg) ++ return hw->phy.ops.write_reg(hw, offset, data); ++ ++ return 0; + } + + static inline s32 e1000_get_cable_length(struct e1000_hw *hw) + { +- return hw->phy.ops.get_cable_length(hw); ++ if (hw->phy.ops.get_cable_length) ++ return hw->phy.ops.get_cable_length(hw); ++ ++ return 0; + } + + extern s32 e1000e_acquire_nvm(struct e1000_hw *hw); +@@ -524,40 +569,43 @@ + extern s32 e1000e_read_nvm_eerd(struct e1000_hw *hw, u16 offset, u16 words, u16 *data); + extern s32 e1000e_validate_nvm_checksum_generic(struct e1000_hw *hw); + extern void e1000e_release_nvm(struct e1000_hw *hw); +-extern void e1000e_reload_nvm(struct e1000_hw *hw); +-extern s32 e1000e_read_mac_addr(struct e1000_hw *hw); ++ ++static inline s32 e1000e_read_mac_addr(struct e1000_hw *hw) ++{ ++ if (hw->mac.ops.read_mac_addr) ++ return hw->mac.ops.read_mac_addr(hw); ++ ++ return e1000e_read_mac_addr_generic(hw); ++} + + static inline s32 e1000_validate_nvm_checksum(struct e1000_hw *hw) + { +- return hw->nvm.ops.validate_nvm(hw); ++ return hw->nvm.ops.validate(hw); + } + + static inline s32 e1000e_update_nvm_checksum(struct e1000_hw *hw) + { +- return hw->nvm.ops.update_nvm(hw); ++ return hw->nvm.ops.update(hw); + } + + static inline s32 e1000_read_nvm(struct e1000_hw *hw, u16 offset, u16 words, u16 *data) + { +- return hw->nvm.ops.read_nvm(hw, offset, words, data); ++ return hw->nvm.ops.read(hw, offset, words, data); + } + + static inline s32 e1000_write_nvm(struct e1000_hw *hw, u16 offset, u16 words, u16 *data) + { +- return hw->nvm.ops.write_nvm(hw, offset, words, data); ++ return hw->nvm.ops.write(hw, offset, words, data); + } + + static inline s32 e1000_get_phy_info(struct e1000_hw *hw) + { +- return hw->phy.ops.get_phy_info(hw); ++ if (hw->phy.ops.get_info) ++ return hw->phy.ops.get_info(hw); ++ ++ return 0; + } + +-static inline s32 e1000e_check_mng_mode(struct e1000_hw *hw) +-{ +- return hw->mac.ops.check_mng_mode(hw); +-} +- +-extern bool e1000e_check_mng_mode_generic(struct e1000_hw *hw); + extern bool e1000e_enable_tx_pkt_filtering(struct e1000_hw *hw); + extern s32 e1000e_mng_write_dhcp_info(struct e1000_hw *hw, u8 *buffer, u16 length); + +@@ -571,4 +619,47 @@ + writel(val, hw->hw_addr + reg); + } + ++#define er32(reg) __er32(hw, E1000_##reg) ++#define ew32(reg,val) __ew32(hw, E1000_##reg, (val)) ++#define e1e_flush() er32(STATUS) ++ ++#define E1000_WRITE_REG(a, reg, value) ( \ ++ writel((value), ((a)->hw_addr + reg))) ++ ++#define E1000_READ_REG(a, reg) (readl((a)->hw_addr + reg)) ++ ++#define E1000_WRITE_REG_ARRAY(a, reg, offset, value) ( \ ++ writel((value), ((a)->hw_addr + reg + ((offset) << 2)))) ++ ++#define E1000_READ_REG_ARRAY(a, reg, offset) ( \ ++ readl((a)->hw_addr + reg + ((offset) << 2))) ++ ++#define E1000_READ_REG_ARRAY_DWORD E1000_READ_REG_ARRAY ++#define E1000_WRITE_REG_ARRAY_DWORD E1000_WRITE_REG_ARRAY ++ ++static inline u16 __er16flash(struct e1000_hw *hw, unsigned long reg) ++{ ++ return readw(hw->flash_address + reg); ++} ++ ++static inline u32 __er32flash(struct e1000_hw *hw, unsigned long reg) ++{ ++ return readl(hw->flash_address + reg); ++} ++ ++static inline void __ew16flash(struct e1000_hw *hw, unsigned long reg, u16 val) ++{ ++ writew(val, hw->flash_address + reg); ++} ++ ++static inline void __ew32flash(struct e1000_hw *hw, unsigned long reg, u32 val) ++{ ++ writel(val, hw->flash_address + reg); ++} ++ ++#define er16flash(reg) __er16flash(hw, (reg)) ++#define er32flash(reg) __er32flash(hw, (reg)) ++#define ew16flash(reg,val) __ew16flash(hw, (reg), (val)) ++#define ew32flash(reg,val) __ew32flash(hw, (reg), (val)) ++ + #endif /* _E1000_H_ */ +diff -r bd70f2f305c6 drivers/net/e1000e/e1000_80003es2lan.c +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/e1000e/e1000_80003es2lan.c Mon Jun 15 11:45:35 2009 +0100 +@@ -0,0 +1,1465 @@ ++/******************************************************************************* ++ ++ Intel PRO/1000 Linux driver ++ Copyright(c) 1999 - 2009 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ Linux NICS ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++/* ++ * 80003ES2LAN Gigabit Ethernet Controller (Copper) ++ * 80003ES2LAN Gigabit Ethernet Controller (Serdes) ++ */ ++ ++#include "e1000.h" ++ ++static s32 e1000_init_phy_params_80003es2lan(struct e1000_hw *hw); ++static s32 e1000_init_nvm_params_80003es2lan(struct e1000_hw *hw); ++static s32 e1000_init_mac_params_80003es2lan(struct e1000_hw *hw); ++static s32 e1000_acquire_phy_80003es2lan(struct e1000_hw *hw); ++static void e1000_release_phy_80003es2lan(struct e1000_hw *hw); ++static s32 e1000_acquire_nvm_80003es2lan(struct e1000_hw *hw); ++static void e1000_release_nvm_80003es2lan(struct e1000_hw *hw); ++static s32 e1000_read_phy_reg_gg82563_80003es2lan(struct e1000_hw *hw, ++ u32 offset, ++ u16 *data); ++static s32 e1000_write_phy_reg_gg82563_80003es2lan(struct e1000_hw *hw, ++ u32 offset, ++ u16 data); ++static s32 e1000_write_nvm_80003es2lan(struct e1000_hw *hw, u16 offset, ++ u16 words, u16 *data); ++static s32 e1000_get_cfg_done_80003es2lan(struct e1000_hw *hw); ++static s32 e1000_phy_force_speed_duplex_80003es2lan(struct e1000_hw *hw); ++static s32 e1000_get_cable_length_80003es2lan(struct e1000_hw *hw); ++static s32 e1000_get_link_up_info_80003es2lan(struct e1000_hw *hw, u16 *speed, ++ u16 *duplex); ++static s32 e1000_reset_hw_80003es2lan(struct e1000_hw *hw); ++static s32 e1000_init_hw_80003es2lan(struct e1000_hw *hw); ++static s32 e1000_setup_copper_link_80003es2lan(struct e1000_hw *hw); ++static void e1000_clear_hw_cntrs_80003es2lan(struct e1000_hw *hw); ++static s32 e1000_acquire_swfw_sync_80003es2lan(struct e1000_hw *hw, u16 mask); ++static s32 e1000_cfg_kmrn_10_100_80003es2lan(struct e1000_hw *hw, u16 duplex); ++static s32 e1000_cfg_kmrn_1000_80003es2lan(struct e1000_hw *hw); ++static s32 e1000_cfg_on_link_up_80003es2lan(struct e1000_hw *hw); ++static s32 e1000_read_kmrn_reg_80003es2lan(struct e1000_hw *hw, u32 offset, ++ u16 *data); ++static s32 e1000_write_kmrn_reg_80003es2lan(struct e1000_hw *hw, u32 offset, ++ u16 data); ++static s32 e1000_copper_link_setup_gg82563_80003es2lan(struct e1000_hw *hw); ++static void e1000_initialize_hw_bits_80003es2lan(struct e1000_hw *hw); ++static void e1000_release_swfw_sync_80003es2lan(struct e1000_hw *hw, u16 mask); ++static s32 e1000_read_mac_addr_80003es2lan(struct e1000_hw *hw); ++static void e1000_power_down_phy_copper_80003es2lan(struct e1000_hw *hw); ++ ++/* ++ * A table for the GG82563 cable length where the range is defined ++ * with a lower bound at "index" and the upper bound at ++ * "index + 5". ++ */ ++static const u16 e1000_gg82563_cable_length_table[] = ++ { 0, 60, 115, 150, 150, 60, 115, 150, 180, 180, 0xFF }; ++#define GG82563_CABLE_LENGTH_TABLE_SIZE \ ++ (sizeof(e1000_gg82563_cable_length_table) / \ ++ sizeof(e1000_gg82563_cable_length_table[0])) ++ ++/** ++ * e1000_init_phy_params_80003es2lan - Init ESB2 PHY func ptrs. ++ * @hw: pointer to the HW structure ++ **/ ++static s32 e1000_init_phy_params_80003es2lan(struct e1000_hw *hw) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ s32 ret_val = E1000_SUCCESS; ++ ++ if (hw->phy.media_type != e1000_media_type_copper) { ++ phy->type = e1000_phy_none; ++ goto out; ++ } else { ++ phy->ops.power_up = e1000_power_up_phy_copper; ++ phy->ops.power_down = e1000_power_down_phy_copper_80003es2lan; ++ } ++ ++ phy->addr = 1; ++ phy->autoneg_mask = AUTONEG_ADVERTISE_SPEED_DEFAULT; ++ phy->reset_delay_us = 100; ++ phy->type = e1000_phy_gg82563; ++ ++ phy->ops.acquire = e1000_acquire_phy_80003es2lan; ++ phy->ops.check_polarity = e1000_check_polarity_m88; ++ phy->ops.check_reset_block = e1000e_check_reset_block_generic; ++ phy->ops.commit = e1000e_phy_sw_reset; ++ phy->ops.get_cfg_done = e1000_get_cfg_done_80003es2lan; ++ phy->ops.get_info = e1000e_get_phy_info_m88; ++ phy->ops.release = e1000_release_phy_80003es2lan; ++ phy->ops.reset = e1000e_phy_hw_reset_generic; ++ phy->ops.set_d3_lplu_state = e1000e_set_d3_lplu_state; ++ ++ phy->ops.force_speed_duplex = e1000_phy_force_speed_duplex_80003es2lan; ++ phy->ops.get_cable_length = e1000_get_cable_length_80003es2lan; ++ phy->ops.read_reg = e1000_read_phy_reg_gg82563_80003es2lan; ++ phy->ops.write_reg = e1000_write_phy_reg_gg82563_80003es2lan; ++ ++ phy->ops.cfg_on_link_up = e1000_cfg_on_link_up_80003es2lan; ++ ++ /* This can only be done after all function pointers are setup. */ ++ ret_val = e1000e_get_phy_id(hw); ++ ++ /* Verify phy id */ ++ if (phy->id != GG82563_E_PHY_ID) { ++ ret_val = -E1000_ERR_PHY; ++ goto out; ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_init_nvm_params_80003es2lan - Init ESB2 NVM func ptrs. ++ * @hw: pointer to the HW structure ++ **/ ++static s32 e1000_init_nvm_params_80003es2lan(struct e1000_hw *hw) ++{ ++ struct e1000_nvm_info *nvm = &hw->nvm; ++ u32 eecd = er32(EECD); ++ u16 size; ++ ++ nvm->opcode_bits = 8; ++ nvm->delay_usec = 1; ++ switch (nvm->override) { ++ case e1000_nvm_override_spi_large: ++ nvm->page_size = 32; ++ nvm->address_bits = 16; ++ break; ++ case e1000_nvm_override_spi_small: ++ nvm->page_size = 8; ++ nvm->address_bits = 8; ++ break; ++ default: ++ nvm->page_size = eecd & E1000_EECD_ADDR_BITS ? 32 : 8; ++ nvm->address_bits = eecd & E1000_EECD_ADDR_BITS ? 16 : 8; ++ break; ++ } ++ ++ nvm->type = e1000_nvm_eeprom_spi; ++ ++ size = (u16)((eecd & E1000_EECD_SIZE_EX_MASK) >> ++ E1000_EECD_SIZE_EX_SHIFT); ++ ++ /* ++ * Added to a constant, "size" becomes the left-shift value ++ * for setting word_size. ++ */ ++ size += NVM_WORD_SIZE_BASE_SHIFT; ++ ++ /* EEPROM access above 16k is unsupported */ ++ if (size > 14) ++ size = 14; ++ nvm->word_size = 1 << size; ++ ++ /* Function Pointers */ ++ nvm->ops.acquire = e1000_acquire_nvm_80003es2lan; ++ nvm->ops.read = e1000e_read_nvm_eerd; ++ nvm->ops.release = e1000_release_nvm_80003es2lan; ++ nvm->ops.update = e1000e_update_nvm_checksum_generic; ++ nvm->ops.valid_led_default = e1000e_valid_led_default; ++ nvm->ops.validate = e1000e_validate_nvm_checksum_generic; ++ nvm->ops.write = e1000_write_nvm_80003es2lan; ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_init_mac_params_80003es2lan - Init ESB2 MAC func ptrs. ++ * @hw: pointer to the HW structure ++ **/ ++static s32 e1000_init_mac_params_80003es2lan(struct e1000_hw *hw) ++{ ++ struct e1000_mac_info *mac = &hw->mac; ++ s32 ret_val = E1000_SUCCESS; ++ ++ /* Set media type */ ++ switch (hw->device_id) { ++ case E1000_DEV_ID_80003ES2LAN_SERDES_DPT: ++ hw->phy.media_type = e1000_media_type_internal_serdes; ++ break; ++ default: ++ hw->phy.media_type = e1000_media_type_copper; ++ break; ++ } ++ ++ /* Set mta register count */ ++ mac->mta_reg_count = 128; ++ /* Set rar entry count */ ++ mac->rar_entry_count = E1000_RAR_ENTRIES; ++ /* Set if part includes ASF firmware */ ++ mac->asf_firmware_present = true; ++ /* Set if manageability features are enabled. */ ++ mac->arc_subsystem_valid = ++ (er32(FWSM) & E1000_FWSM_MODE_MASK) ++ ? true : false; ++ ++ /* Function pointers */ ++ ++ /* bus type/speed/width */ ++ mac->ops.get_bus_info = e1000e_get_bus_info_pcie; ++ /* reset */ ++ mac->ops.reset_hw = e1000_reset_hw_80003es2lan; ++ /* hw initialization */ ++ mac->ops.init_hw = e1000_init_hw_80003es2lan; ++ /* link setup */ ++ mac->ops.setup_link = e1000e_setup_link; ++ /* physical interface link setup */ ++ mac->ops.setup_physical_interface = ++ (hw->phy.media_type == e1000_media_type_copper) ++ ? e1000_setup_copper_link_80003es2lan ++ : e1000e_setup_fiber_serdes_link; ++ /* check for link */ ++ switch (hw->phy.media_type) { ++ case e1000_media_type_copper: ++ mac->ops.check_for_link = e1000e_check_for_copper_link; ++ break; ++ case e1000_media_type_fiber: ++ mac->ops.check_for_link = e1000e_check_for_fiber_link; ++ break; ++ case e1000_media_type_internal_serdes: ++ mac->ops.check_for_link = e1000e_check_for_serdes_link; ++ break; ++ default: ++ ret_val = -E1000_ERR_CONFIG; ++ goto out; ++ break; ++ } ++ /* check management mode */ ++ mac->ops.check_mng_mode = e1000_check_mng_mode_generic; ++ /* multicast address update */ ++ mac->ops.update_mc_addr_list = e1000e_update_mc_addr_list_generic; ++ /* writing VFTA */ ++ mac->ops.write_vfta = e1000e_write_vfta_generic; ++ /* clearing VFTA */ ++ mac->ops.clear_vfta = e1000e_clear_vfta_generic; ++ /* setting MTA */ ++ mac->ops.mta_set = e1000_mta_set_generic; ++ /* read mac address */ ++ mac->ops.read_mac_addr = e1000_read_mac_addr_80003es2lan; ++ /* ID LED init */ ++ mac->ops.id_led_init = e1000e_id_led_init; ++ /* blink LED */ ++ mac->ops.blink_led = e1000e_blink_led; ++ /* setup LED */ ++ mac->ops.setup_led = e1000_setup_led_generic; ++ /* cleanup LED */ ++ mac->ops.cleanup_led = e1000e_cleanup_led_generic; ++ /* turn on/off LED */ ++ mac->ops.led_on = e1000e_led_on_generic; ++ mac->ops.led_off = e1000e_led_off_generic; ++ /* clear hardware counters */ ++ mac->ops.clear_hw_cntrs = e1000_clear_hw_cntrs_80003es2lan; ++ /* link info */ ++ mac->ops.get_link_up_info = e1000_get_link_up_info_80003es2lan; ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_init_function_pointers_80003es2lan - Init ESB2 func ptrs. ++ * @hw: pointer to the HW structure ++ * ++ * Called to initialize all function pointers and parameters. ++ **/ ++void e1000_init_function_pointers_80003es2lan(struct e1000_hw *hw) ++{ ++ e1000_init_mac_ops_generic(hw); ++ e1000_init_nvm_ops_generic(hw); ++ hw->mac.ops.init_params = e1000_init_mac_params_80003es2lan; ++ hw->nvm.ops.init_params = e1000_init_nvm_params_80003es2lan; ++ hw->phy.ops.init_params = e1000_init_phy_params_80003es2lan; ++ e1000e_get_bus_info_pcie(hw); ++} ++ ++/** ++ * e1000_acquire_phy_80003es2lan - Acquire rights to access PHY ++ * @hw: pointer to the HW structure ++ * ++ * A wrapper to acquire access rights to the correct PHY. ++ **/ ++static s32 e1000_acquire_phy_80003es2lan(struct e1000_hw *hw) ++{ ++ u16 mask; ++ ++ mask = hw->bus.func ? E1000_SWFW_PHY1_SM : E1000_SWFW_PHY0_SM; ++ return e1000_acquire_swfw_sync_80003es2lan(hw, mask); ++} ++ ++/** ++ * e1000_release_phy_80003es2lan - Release rights to access PHY ++ * @hw: pointer to the HW structure ++ * ++ * A wrapper to release access rights to the correct PHY. ++ **/ ++static void e1000_release_phy_80003es2lan(struct e1000_hw *hw) ++{ ++ u16 mask; ++ ++ mask = hw->bus.func ? E1000_SWFW_PHY1_SM : E1000_SWFW_PHY0_SM; ++ e1000_release_swfw_sync_80003es2lan(hw, mask); ++} ++ ++ ++/** ++ * e1000_acquire_mac_csr_80003es2lan - Acquire rights to access Kumeran register ++ * @hw: pointer to the HW structure ++ * ++ * Acquire the semaphore to access the Kumeran interface. ++ * ++ **/ ++static s32 e1000_acquire_mac_csr_80003es2lan(struct e1000_hw *hw) ++{ ++ u16 mask; ++ ++ mask = E1000_SWFW_CSR_SM; ++ ++ return e1000_acquire_swfw_sync_80003es2lan(hw, mask); ++} ++ ++/** ++ * e1000_release_mac_csr_80003es2lan - Release rights to access Kumeran Register ++ * @hw: pointer to the HW structure ++ * ++ * Release the semaphore used to access the Kumeran interface ++ **/ ++static void e1000_release_mac_csr_80003es2lan(struct e1000_hw *hw) ++{ ++ u16 mask; ++ ++ mask = E1000_SWFW_CSR_SM; ++ ++ e1000_release_swfw_sync_80003es2lan(hw, mask); ++} ++ ++/** ++ * e1000_acquire_nvm_80003es2lan - Acquire rights to access NVM ++ * @hw: pointer to the HW structure ++ * ++ * Acquire the semaphore to access the EEPROM. ++ **/ ++static s32 e1000_acquire_nvm_80003es2lan(struct e1000_hw *hw) ++{ ++ s32 ret_val; ++ ++ ret_val = e1000_acquire_swfw_sync_80003es2lan(hw, E1000_SWFW_EEP_SM); ++ if (ret_val) ++ goto out; ++ ++ ret_val = e1000e_acquire_nvm(hw); ++ ++ if (ret_val) ++ e1000_release_swfw_sync_80003es2lan(hw, E1000_SWFW_EEP_SM); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_release_nvm_80003es2lan - Relinquish rights to access NVM ++ * @hw: pointer to the HW structure ++ * ++ * Release the semaphore used to access the EEPROM. ++ **/ ++static void e1000_release_nvm_80003es2lan(struct e1000_hw *hw) ++{ ++ e1000e_release_nvm(hw); ++ e1000_release_swfw_sync_80003es2lan(hw, E1000_SWFW_EEP_SM); ++} ++ ++/** ++ * e1000_acquire_swfw_sync_80003es2lan - Acquire SW/FW semaphore ++ * @hw: pointer to the HW structure ++ * @mask: specifies which semaphore to acquire ++ * ++ * Acquire the SW/FW semaphore to access the PHY or NVM. The mask ++ * will also specify which port we're acquiring the lock for. ++ **/ ++static s32 e1000_acquire_swfw_sync_80003es2lan(struct e1000_hw *hw, u16 mask) ++{ ++ u32 swfw_sync; ++ u32 swmask = mask; ++ u32 fwmask = mask << 16; ++ s32 ret_val = E1000_SUCCESS; ++ s32 i = 0, timeout = 50; ++ ++ while (i < timeout) { ++ if (e1000e_get_hw_semaphore(hw)) { ++ ret_val = -E1000_ERR_SWFW_SYNC; ++ goto out; ++ } ++ ++ swfw_sync = er32(SW_FW_SYNC); ++ if (!(swfw_sync & (fwmask | swmask))) ++ break; ++ ++ /* ++ * Firmware currently using resource (fwmask) ++ * or other software thread using resource (swmask) ++ */ ++ e1000e_put_hw_semaphore(hw); ++ mdelay(5); ++ i++; ++ } ++ ++ if (i == timeout) { ++ e_dbg("Driver can't access resource, SW_FW_SYNC timeout.\n"); ++ ret_val = -E1000_ERR_SWFW_SYNC; ++ goto out; ++ } ++ ++ swfw_sync |= swmask; ++ ew32(SW_FW_SYNC, swfw_sync); ++ ++ e1000e_put_hw_semaphore(hw); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_release_swfw_sync_80003es2lan - Release SW/FW semaphore ++ * @hw: pointer to the HW structure ++ * @mask: specifies which semaphore to acquire ++ * ++ * Release the SW/FW semaphore used to access the PHY or NVM. The mask ++ * will also specify which port we're releasing the lock for. ++ **/ ++static void e1000_release_swfw_sync_80003es2lan(struct e1000_hw *hw, u16 mask) ++{ ++ u32 swfw_sync; ++ ++ while (e1000e_get_hw_semaphore(hw) != E1000_SUCCESS) ++ ; /* Empty */ ++ ++ swfw_sync = er32(SW_FW_SYNC); ++ swfw_sync &= ~mask; ++ ew32(SW_FW_SYNC, swfw_sync); ++ ++ e1000e_put_hw_semaphore(hw); ++} ++ ++/** ++ * e1000_read_phy_reg_gg82563_80003es2lan - Read GG82563 PHY register ++ * @hw: pointer to the HW structure ++ * @offset: offset of the register to read ++ * @data: pointer to the data returned from the operation ++ * ++ * Read the GG82563 PHY register. ++ **/ ++static s32 e1000_read_phy_reg_gg82563_80003es2lan(struct e1000_hw *hw, ++ u32 offset, u16 *data) ++{ ++ s32 ret_val; ++ u32 page_select; ++ u16 temp; ++ ++ ret_val = e1000_acquire_phy_80003es2lan(hw); ++ if (ret_val) ++ goto out; ++ ++ /* Select Configuration Page */ ++ if ((offset & MAX_PHY_REG_ADDRESS) < GG82563_MIN_ALT_REG) { ++ page_select = GG82563_PHY_PAGE_SELECT; ++ } else { ++ /* ++ * Use Alternative Page Select register to access ++ * registers 30 and 31 ++ */ ++ page_select = GG82563_PHY_PAGE_SELECT_ALT; ++ } ++ ++ temp = (u16)((u16)offset >> GG82563_PAGE_SHIFT); ++ ret_val = e1000e_write_phy_reg_mdic(hw, page_select, temp); ++ if (ret_val) { ++ e1000_release_phy_80003es2lan(hw); ++ goto out; ++ } ++ ++ /* ++ * The "ready" bit in the MDIC register may be incorrectly set ++ * before the device has completed the "Page Select" MDI ++ * transaction. So we wait 200us after each MDI command... ++ */ ++ udelay(200); ++ ++ /* ...and verify the command was successful. */ ++ ret_val = e1000e_read_phy_reg_mdic(hw, page_select, &temp); ++ ++ if (((u16)offset >> GG82563_PAGE_SHIFT) != temp) { ++ ret_val = -E1000_ERR_PHY; ++ e1000_release_phy_80003es2lan(hw); ++ goto out; ++ } ++ ++ udelay(200); ++ ++ ret_val = e1000e_read_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset, ++ data); ++ ++ udelay(200); ++ e1000_release_phy_80003es2lan(hw); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_write_phy_reg_gg82563_80003es2lan - Write GG82563 PHY register ++ * @hw: pointer to the HW structure ++ * @offset: offset of the register to read ++ * @data: value to write to the register ++ * ++ * Write to the GG82563 PHY register. ++ **/ ++static s32 e1000_write_phy_reg_gg82563_80003es2lan(struct e1000_hw *hw, ++ u32 offset, u16 data) ++{ ++ s32 ret_val; ++ u32 page_select; ++ u16 temp; ++ ++ ret_val = e1000_acquire_phy_80003es2lan(hw); ++ if (ret_val) ++ goto out; ++ ++ /* Select Configuration Page */ ++ if ((offset & MAX_PHY_REG_ADDRESS) < GG82563_MIN_ALT_REG) { ++ page_select = GG82563_PHY_PAGE_SELECT; ++ } else { ++ /* ++ * Use Alternative Page Select register to access ++ * registers 30 and 31 ++ */ ++ page_select = GG82563_PHY_PAGE_SELECT_ALT; ++ } ++ ++ temp = (u16)((u16)offset >> GG82563_PAGE_SHIFT); ++ ret_val = e1000e_write_phy_reg_mdic(hw, page_select, temp); ++ if (ret_val) { ++ e1000_release_phy_80003es2lan(hw); ++ goto out; ++ } ++ ++ ++ /* ++ * The "ready" bit in the MDIC register may be incorrectly set ++ * before the device has completed the "Page Select" MDI ++ * transaction. So we wait 200us after each MDI command... ++ */ ++ udelay(200); ++ ++ /* ...and verify the command was successful. */ ++ ret_val = e1000e_read_phy_reg_mdic(hw, page_select, &temp); ++ ++ if (((u16)offset >> GG82563_PAGE_SHIFT) != temp) { ++ ret_val = -E1000_ERR_PHY; ++ e1000_release_phy_80003es2lan(hw); ++ goto out; ++ } ++ ++ udelay(200); ++ ++ ret_val = e1000e_write_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset, ++ data); ++ ++ udelay(200); ++ e1000_release_phy_80003es2lan(hw); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_write_nvm_80003es2lan - Write to ESB2 NVM ++ * @hw: pointer to the HW structure ++ * @offset: offset of the register to read ++ * @words: number of words to write ++ * @data: buffer of data to write to the NVM ++ * ++ * Write "words" of data to the ESB2 NVM. ++ **/ ++static s32 e1000_write_nvm_80003es2lan(struct e1000_hw *hw, u16 offset, ++ u16 words, u16 *data) ++{ ++ return e1000e_write_nvm_spi(hw, offset, words, data); ++} ++ ++/** ++ * e1000_get_cfg_done_80003es2lan - Wait for configuration to complete ++ * @hw: pointer to the HW structure ++ * ++ * Wait a specific amount of time for manageability processes to complete. ++ * This is a function pointer entry point called by the phy module. ++ **/ ++static s32 e1000_get_cfg_done_80003es2lan(struct e1000_hw *hw) ++{ ++ s32 timeout = PHY_CFG_TIMEOUT; ++ s32 ret_val = E1000_SUCCESS; ++ u32 mask = E1000_NVM_CFG_DONE_PORT_0; ++ ++ if (hw->bus.func == 1) ++ mask = E1000_NVM_CFG_DONE_PORT_1; ++ ++ while (timeout) { ++ if (er32(EEMNGCTL) & mask) ++ break; ++ msleep(1); ++ timeout--; ++ } ++ if (!timeout) { ++ e_dbg("MNG configuration cycle has not completed.\n"); ++ ret_val = -E1000_ERR_RESET; ++ goto out; ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_phy_force_speed_duplex_80003es2lan - Force PHY speed and duplex ++ * @hw: pointer to the HW structure ++ * ++ * Force the speed and duplex settings onto the PHY. This is a ++ * function pointer entry point called by the phy module. ++ **/ ++static s32 e1000_phy_force_speed_duplex_80003es2lan(struct e1000_hw *hw) ++{ ++ s32 ret_val = E1000_SUCCESS; ++ u16 phy_data; ++ bool link; ++ ++ if (!(hw->phy.ops.read_reg)) ++ goto out; ++ ++ /* ++ * Clear Auto-Crossover to force MDI manually. M88E1000 requires MDI ++ * forced whenever speed and duplex are forced. ++ */ ++ ret_val = e1e_rphy(hw, M88E1000_PHY_SPEC_CTRL, &phy_data); ++ if (ret_val) ++ goto out; ++ ++ phy_data &= ~GG82563_PSCR_CROSSOVER_MODE_AUTO; ++ ret_val = e1e_wphy(hw, GG82563_PHY_SPEC_CTRL, phy_data); ++ if (ret_val) ++ goto out; ++ ++ e_dbg("GG82563 PSCR: %X\n", phy_data); ++ ++ ret_val = e1e_rphy(hw, PHY_CONTROL, &phy_data); ++ if (ret_val) ++ goto out; ++ ++ e1000e_phy_force_speed_duplex_setup(hw, &phy_data); ++ ++ /* Reset the phy to commit changes. */ ++ phy_data |= MII_CR_RESET; ++ ++ ret_val = e1e_wphy(hw, PHY_CONTROL, phy_data); ++ if (ret_val) ++ goto out; ++ ++ udelay(1); ++ ++ if (hw->phy.autoneg_wait_to_complete) { ++ e_dbg("Waiting for forced speed/duplex link " ++ "on GG82563 phy.\n"); ++ ++ ret_val = e1000e_phy_has_link_generic(hw, PHY_FORCE_LIMIT, ++ 100000, &link); ++ if (ret_val) ++ goto out; ++ ++ if (!link) { ++ /* ++ * We didn't get link. ++ * Reset the DSP and cross our fingers. ++ */ ++ ret_val = e1000e_phy_reset_dsp(hw); ++ if (ret_val) ++ goto out; ++ } ++ ++ /* Try once more */ ++ ret_val = e1000e_phy_has_link_generic(hw, PHY_FORCE_LIMIT, ++ 100000, &link); ++ if (ret_val) ++ goto out; ++ } ++ ++ ret_val = e1e_rphy(hw, GG82563_PHY_MAC_SPEC_CTRL, &phy_data); ++ if (ret_val) ++ goto out; ++ ++ /* ++ * Resetting the phy means we need to verify the TX_CLK corresponds ++ * to the link speed. 10Mbps -> 2.5MHz, else 25MHz. ++ */ ++ phy_data &= ~GG82563_MSCR_TX_CLK_MASK; ++ if (hw->mac.forced_speed_duplex & E1000_ALL_10_SPEED) ++ phy_data |= GG82563_MSCR_TX_CLK_10MBPS_2_5; ++ else ++ phy_data |= GG82563_MSCR_TX_CLK_100MBPS_25; ++ ++ /* ++ * In addition, we must re-enable CRS on Tx for both half and full ++ * duplex. ++ */ ++ phy_data |= GG82563_MSCR_ASSERT_CRS_ON_TX; ++ ret_val = e1e_wphy(hw, GG82563_PHY_MAC_SPEC_CTRL, phy_data); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_get_cable_length_80003es2lan - Set approximate cable length ++ * @hw: pointer to the HW structure ++ * ++ * Find the approximate cable length as measured by the GG82563 PHY. ++ * This is a function pointer entry point called by the phy module. ++ **/ ++static s32 e1000_get_cable_length_80003es2lan(struct e1000_hw *hw) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ s32 ret_val = E1000_SUCCESS; ++ u16 phy_data, index; ++ ++ if (!(hw->phy.ops.read_reg)) ++ goto out; ++ ++ ret_val = e1e_rphy(hw, GG82563_PHY_DSP_DISTANCE, &phy_data); ++ if (ret_val) ++ goto out; ++ ++ index = phy_data & GG82563_DSPD_CABLE_LENGTH; ++ ++ if (index >= GG82563_CABLE_LENGTH_TABLE_SIZE + 5) { ++ ret_val = E1000_ERR_PHY; ++ goto out; ++ } ++ ++ phy->min_cable_length = e1000_gg82563_cable_length_table[index]; ++ phy->max_cable_length = e1000_gg82563_cable_length_table[index+5]; ++ ++ phy->cable_length = (phy->min_cable_length + phy->max_cable_length) / 2; ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_get_link_up_info_80003es2lan - Report speed and duplex ++ * @hw: pointer to the HW structure ++ * @speed: pointer to speed buffer ++ * @duplex: pointer to duplex buffer ++ * ++ * Retrieve the current speed and duplex configuration. ++ **/ ++static s32 e1000_get_link_up_info_80003es2lan(struct e1000_hw *hw, u16 *speed, ++ u16 *duplex) ++{ ++ s32 ret_val; ++ ++ if (hw->phy.media_type == e1000_media_type_copper) { ++ ret_val = e1000e_get_speed_and_duplex_copper(hw, ++ speed, ++ duplex); ++ hw->phy.ops.cfg_on_link_up(hw); ++ } else { ++ ret_val = e1000e_get_speed_and_duplex_fiber_serdes(hw, ++ speed, ++ duplex); ++ } ++ ++ return ret_val; ++} ++ ++/** ++ * e1000_reset_hw_80003es2lan - Reset the ESB2 controller ++ * @hw: pointer to the HW structure ++ * ++ * Perform a global reset to the ESB2 controller. ++ **/ ++static s32 e1000_reset_hw_80003es2lan(struct e1000_hw *hw) ++{ ++ u32 ctrl, icr; ++ s32 ret_val; ++ ++ /* ++ * Prevent the PCI-E bus from sticking if there is no TLP connection ++ * on the last TLP read/write transaction when MAC is reset. ++ */ ++ ret_val = e1000e_disable_pcie_master(hw); ++ if (ret_val) ++ e_dbg("PCI-E Master disable polling has failed.\n"); ++ ++ e_dbg("Masking off all interrupts\n"); ++ ew32(IMC, 0xffffffff); ++ ++ ew32(RCTL, 0); ++ ew32(TCTL, E1000_TCTL_PSP); ++ e1e_flush(); ++ ++ msleep(10); ++ ++ ctrl = er32(CTRL); ++ ++ ret_val = e1000_acquire_phy_80003es2lan(hw); ++ e_dbg("Issuing a global reset to MAC\n"); ++ ew32(CTRL, ctrl | E1000_CTRL_RST); ++ e1000_release_phy_80003es2lan(hw); ++ ++ ret_val = e1000e_get_auto_rd_done(hw); ++ if (ret_val) ++ /* We don't want to continue accessing MAC registers. */ ++ goto out; ++ ++ /* Clear any pending interrupt events. */ ++ ew32(IMC, 0xffffffff); ++ icr = er32(ICR); ++ ++ e1000_check_alt_mac_addr_generic(hw); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_init_hw_80003es2lan - Initialize the ESB2 controller ++ * @hw: pointer to the HW structure ++ * ++ * Initialize the hw bits, LED, VFTA, MTA, link and hw counters. ++ **/ ++static s32 e1000_init_hw_80003es2lan(struct e1000_hw *hw) ++{ ++ struct e1000_mac_info *mac = &hw->mac; ++ u32 reg_data; ++ s32 ret_val; ++ u16 i; ++ ++ e1000_initialize_hw_bits_80003es2lan(hw); ++ ++ /* Initialize identification LED */ ++ ret_val = mac->ops.id_led_init(hw); ++ if (ret_val) { ++ e_dbg("Error initializing identification LED\n"); ++ /* This is not fatal and we should not stop init due to this */ ++ } ++ ++ /* Disabling VLAN filtering */ ++ e_dbg("Initializing the IEEE VLAN\n"); ++ e1000e_clear_vfta(hw); ++ ++ /* Setup the receive address. */ ++ e1000e_init_rx_addrs(hw, mac->rar_entry_count); ++ ++ /* Zero out the Multicast HASH table */ ++ e_dbg("Zeroing the MTA\n"); ++ for (i = 0; i < mac->mta_reg_count; i++) ++ E1000_WRITE_REG_ARRAY(hw, E1000_MTA, i, 0); ++ ++ /* Setup link and flow control */ ++ ret_val = mac->ops.setup_link(hw); ++ ++ /* Set the transmit descriptor write-back policy */ ++ reg_data = er32(TXDCTL(0)); ++ reg_data = (reg_data & ~E1000_TXDCTL_WTHRESH) | ++ E1000_TXDCTL_FULL_TX_DESC_WB | E1000_TXDCTL_COUNT_DESC; ++ ew32(TXDCTL(0), reg_data); ++ ++ /* ...for both queues. */ ++ reg_data = er32(TXDCTL(1)); ++ reg_data = (reg_data & ~E1000_TXDCTL_WTHRESH) | ++ E1000_TXDCTL_FULL_TX_DESC_WB | E1000_TXDCTL_COUNT_DESC; ++ ew32(TXDCTL(1), reg_data); ++ ++ /* Enable retransmit on late collisions */ ++ reg_data = er32(TCTL); ++ reg_data |= E1000_TCTL_RTLC; ++ ew32(TCTL, reg_data); ++ ++ /* Configure Gigabit Carry Extend Padding */ ++ reg_data = er32(TCTL_EXT); ++ reg_data &= ~E1000_TCTL_EXT_GCEX_MASK; ++ reg_data |= DEFAULT_TCTL_EXT_GCEX_80003ES2LAN; ++ ew32(TCTL_EXT, reg_data); ++ ++ /* Configure Transmit Inter-Packet Gap */ ++ reg_data = er32(TIPG); ++ reg_data &= ~E1000_TIPG_IPGT_MASK; ++ reg_data |= DEFAULT_TIPG_IPGT_1000_80003ES2LAN; ++ ew32(TIPG, reg_data); ++ ++ reg_data = E1000_READ_REG_ARRAY(hw, E1000_FFLT, 0x0001); ++ reg_data &= ~0x00100000; ++ E1000_WRITE_REG_ARRAY(hw, E1000_FFLT, 0x0001, reg_data); ++ ++ /* ++ * Clear all of the statistics registers (clear on read). It is ++ * important that we do this after we have tried to establish link ++ * because the symbol error count will increment wildly if there ++ * is no link. ++ */ ++ e1000_clear_hw_cntrs_80003es2lan(hw); ++ ++ return ret_val; ++} ++ ++/** ++ * e1000_initialize_hw_bits_80003es2lan - Init hw bits of ESB2 ++ * @hw: pointer to the HW structure ++ * ++ * Initializes required hardware-dependent bits needed for normal operation. ++ **/ ++static void e1000_initialize_hw_bits_80003es2lan(struct e1000_hw *hw) ++{ ++ u32 reg; ++ ++ /* Transmit Descriptor Control 0 */ ++ reg = er32(TXDCTL(0)); ++ reg |= (1 << 22); ++ ew32(TXDCTL(0), reg); ++ ++ /* Transmit Descriptor Control 1 */ ++ reg = er32(TXDCTL(1)); ++ reg |= (1 << 22); ++ ew32(TXDCTL(1), reg); ++ ++ /* Transmit Arbitration Control 0 */ ++ reg = er32(TARC(0)); ++ reg &= ~(0xF << 27); /* 30:27 */ ++ if (hw->phy.media_type != e1000_media_type_copper) ++ reg &= ~(1 << 20); ++ ew32(TARC(0), reg); ++ ++ /* Transmit Arbitration Control 1 */ ++ reg = er32(TARC(1)); ++ if (er32(TCTL) & E1000_TCTL_MULR) ++ reg &= ~(1 << 28); ++ else ++ reg |= (1 << 28); ++ ew32(TARC(1), reg); ++ ++ return; ++} ++ ++/** ++ * e1000_copper_link_setup_gg82563_80003es2lan - Configure GG82563 Link ++ * @hw: pointer to the HW structure ++ * ++ * Setup some GG82563 PHY registers for obtaining link ++ **/ ++static s32 e1000_copper_link_setup_gg82563_80003es2lan(struct e1000_hw *hw) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ s32 ret_val; ++ u32 ctrl_ext; ++ u16 data; ++ ++ if (!phy->reset_disable) { ++ ret_val = e1e_rphy(hw, GG82563_PHY_MAC_SPEC_CTRL, ++ &data); ++ if (ret_val) ++ goto out; ++ ++ data |= GG82563_MSCR_ASSERT_CRS_ON_TX; ++ /* Use 25MHz for both link down and 1000Base-T for Tx clock. */ ++ data |= GG82563_MSCR_TX_CLK_1000MBPS_25; ++ ++ ret_val = e1e_wphy(hw, GG82563_PHY_MAC_SPEC_CTRL, ++ data); ++ if (ret_val) ++ goto out; ++ ++ /* ++ * Options: ++ * MDI/MDI-X = 0 (default) ++ * 0 - Auto for all speeds ++ * 1 - MDI mode ++ * 2 - MDI-X mode ++ * 3 - Auto for 1000Base-T only (MDI-X for 10/100Base-T modes) ++ */ ++ ret_val = e1e_rphy(hw, GG82563_PHY_SPEC_CTRL, &data); ++ if (ret_val) ++ goto out; ++ ++ data &= ~GG82563_PSCR_CROSSOVER_MODE_MASK; ++ ++ switch (phy->mdix) { ++ case 1: ++ data |= GG82563_PSCR_CROSSOVER_MODE_MDI; ++ break; ++ case 2: ++ data |= GG82563_PSCR_CROSSOVER_MODE_MDIX; ++ break; ++ case 0: ++ default: ++ data |= GG82563_PSCR_CROSSOVER_MODE_AUTO; ++ break; ++ } ++ ++ /* ++ * Options: ++ * disable_polarity_correction = 0 (default) ++ * Automatic Correction for Reversed Cable Polarity ++ * 0 - Disabled ++ * 1 - Enabled ++ */ ++ data &= ~GG82563_PSCR_POLARITY_REVERSAL_DISABLE; ++ if (phy->disable_polarity_correction) ++ data |= GG82563_PSCR_POLARITY_REVERSAL_DISABLE; ++ ++ ret_val = e1e_wphy(hw, GG82563_PHY_SPEC_CTRL, data); ++ if (ret_val) ++ goto out; ++ ++ /* SW Reset the PHY so all changes take effect */ ++ ret_val = e1000e_commit_phy(hw); ++ if (ret_val) { ++ e_dbg("Error Resetting the PHY\n"); ++ goto out; ++ } ++ ++ } ++ ++ /* Bypass Rx and Tx FIFO's */ ++ ret_val = e1000_write_kmrn_reg_80003es2lan(hw, ++ E1000_KMRNCTRLSTA_OFFSET_FIFO_CTRL, ++ E1000_KMRNCTRLSTA_FIFO_CTRL_RX_BYPASS | ++ E1000_KMRNCTRLSTA_FIFO_CTRL_TX_BYPASS); ++ if (ret_val) ++ goto out; ++ ++ ret_val = e1000_read_kmrn_reg_80003es2lan(hw, ++ E1000_KMRNCTRLSTA_OFFSET_MAC2PHY_OPMODE, ++ &data); ++ if (ret_val) ++ goto out; ++ data |= E1000_KMRNCTRLSTA_OPMODE_E_IDLE; ++ ret_val = e1000_write_kmrn_reg_80003es2lan(hw, ++ E1000_KMRNCTRLSTA_OFFSET_MAC2PHY_OPMODE, ++ data); ++ if (ret_val) ++ goto out; ++ ++ ret_val = e1e_rphy(hw, GG82563_PHY_SPEC_CTRL_2, &data); ++ if (ret_val) ++ goto out; ++ ++ data &= ~GG82563_PSCR2_REVERSE_AUTO_NEG; ++ ret_val = e1e_wphy(hw, GG82563_PHY_SPEC_CTRL_2, data); ++ if (ret_val) ++ goto out; ++ ++ ctrl_ext = er32(CTRL_EXT); ++ ctrl_ext &= ~(E1000_CTRL_EXT_LINK_MODE_MASK); ++ ew32(CTRL_EXT, ctrl_ext); ++ ++ ret_val = e1e_rphy(hw, GG82563_PHY_PWR_MGMT_CTRL, &data); ++ if (ret_val) ++ goto out; ++ ++ /* ++ * Do not init these registers when the HW is in IAMT mode, since the ++ * firmware will have already initialized them. We only initialize ++ * them if the HW is not in IAMT mode. ++ */ ++ if (!(hw->mac.ops.check_mng_mode(hw))) { ++ /* Enable Electrical Idle on the PHY */ ++ data |= GG82563_PMCR_ENABLE_ELECTRICAL_IDLE; ++ ret_val = e1e_wphy(hw, GG82563_PHY_PWR_MGMT_CTRL, ++ data); ++ if (ret_val) ++ goto out; ++ ++ ret_val = e1e_rphy(hw, GG82563_PHY_KMRN_MODE_CTRL, ++ &data); ++ if (ret_val) ++ goto out; ++ ++ data &= ~GG82563_KMCR_PASS_FALSE_CARRIER; ++ ret_val = e1e_wphy(hw, GG82563_PHY_KMRN_MODE_CTRL, ++ data); ++ if (ret_val) ++ goto out; ++ } ++ ++ /* ++ * Workaround: Disable padding in Kumeran interface in the MAC ++ * and in the PHY to avoid CRC errors. ++ */ ++ ret_val = e1e_rphy(hw, GG82563_PHY_INBAND_CTRL, &data); ++ if (ret_val) ++ goto out; ++ ++ data |= GG82563_ICR_DIS_PADDING; ++ ret_val = e1e_wphy(hw, GG82563_PHY_INBAND_CTRL, data); ++ if (ret_val) ++ goto out; ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_setup_copper_link_80003es2lan - Setup Copper Link for ESB2 ++ * @hw: pointer to the HW structure ++ * ++ * Essentially a wrapper for setting up all things "copper" related. ++ * This is a function pointer entry point called by the mac module. ++ **/ ++static s32 e1000_setup_copper_link_80003es2lan(struct e1000_hw *hw) ++{ ++ u32 ctrl; ++ s32 ret_val; ++ u16 reg_data; ++ ++ ctrl = er32(CTRL); ++ ctrl |= E1000_CTRL_SLU; ++ ctrl &= ~(E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX); ++ ew32(CTRL, ctrl); ++ ++ /* ++ * Set the mac to wait the maximum time between each ++ * iteration and increase the max iterations when ++ * polling the phy; this fixes erroneous timeouts at 10Mbps. ++ */ ++ ret_val = e1000_write_kmrn_reg_80003es2lan(hw, GG82563_REG(0x34, 4), ++ 0xFFFF); ++ if (ret_val) ++ goto out; ++ ret_val = e1000_read_kmrn_reg_80003es2lan(hw, GG82563_REG(0x34, 9), ++ ®_data); ++ if (ret_val) ++ goto out; ++ reg_data |= 0x3F; ++ ret_val = e1000_write_kmrn_reg_80003es2lan(hw, GG82563_REG(0x34, 9), ++ reg_data); ++ if (ret_val) ++ goto out; ++ ret_val = e1000_read_kmrn_reg_80003es2lan(hw, ++ E1000_KMRNCTRLSTA_OFFSET_INB_CTRL, ++ ®_data); ++ if (ret_val) ++ goto out; ++ reg_data |= E1000_KMRNCTRLSTA_INB_CTRL_DIS_PADDING; ++ ret_val = e1000_write_kmrn_reg_80003es2lan(hw, ++ E1000_KMRNCTRLSTA_OFFSET_INB_CTRL, ++ reg_data); ++ if (ret_val) ++ goto out; ++ ++ ret_val = e1000_copper_link_setup_gg82563_80003es2lan(hw); ++ if (ret_val) ++ goto out; ++ ++ ret_val = e1000e_setup_copper_link(hw); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_cfg_on_link_up_80003es2lan - es2 link configuration after link-up ++ * @hw: pointer to the HW structure ++ * @duplex: current duplex setting ++ * ++ * Configure the KMRN interface by applying last minute quirks for ++ * 10/100 operation. ++ **/ ++static s32 e1000_cfg_on_link_up_80003es2lan(struct e1000_hw *hw) ++{ ++ s32 ret_val = E1000_SUCCESS; ++ u16 speed; ++ u16 duplex; ++ ++ if (hw->phy.media_type == e1000_media_type_copper) { ++ ret_val = e1000e_get_speed_and_duplex_copper(hw, ++ &speed, ++ &duplex); ++ if (ret_val) ++ goto out; ++ ++ if (speed == SPEED_1000) ++ ret_val = e1000_cfg_kmrn_1000_80003es2lan(hw); ++ else ++ ret_val = e1000_cfg_kmrn_10_100_80003es2lan(hw, duplex); ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_cfg_kmrn_10_100_80003es2lan - Apply "quirks" for 10/100 operation ++ * @hw: pointer to the HW structure ++ * @duplex: current duplex setting ++ * ++ * Configure the KMRN interface by applying last minute quirks for ++ * 10/100 operation. ++ **/ ++static s32 e1000_cfg_kmrn_10_100_80003es2lan(struct e1000_hw *hw, u16 duplex) ++{ ++ s32 ret_val = E1000_SUCCESS; ++ u32 tipg; ++ u32 i = 0; ++ u16 reg_data, reg_data2; ++ ++ reg_data = E1000_KMRNCTRLSTA_HD_CTRL_10_100_DEFAULT; ++ ret_val = e1000_write_kmrn_reg_80003es2lan(hw, ++ E1000_KMRNCTRLSTA_OFFSET_HD_CTRL, ++ reg_data); ++ if (ret_val) ++ goto out; ++ ++ /* Configure Transmit Inter-Packet Gap */ ++ tipg = er32(TIPG); ++ tipg &= ~E1000_TIPG_IPGT_MASK; ++ tipg |= DEFAULT_TIPG_IPGT_10_100_80003ES2LAN; ++ ew32(TIPG, tipg); ++ ++ ++ do { ++ ret_val = e1e_rphy(hw, GG82563_PHY_KMRN_MODE_CTRL, ++ ®_data); ++ if (ret_val) ++ goto out; ++ ++ ret_val = e1e_rphy(hw, GG82563_PHY_KMRN_MODE_CTRL, ++ ®_data2); ++ if (ret_val) ++ goto out; ++ i++; ++ } while ((reg_data != reg_data2) && (i < GG82563_MAX_KMRN_RETRY)); ++ ++ if (duplex == HALF_DUPLEX) ++ reg_data |= GG82563_KMCR_PASS_FALSE_CARRIER; ++ else ++ reg_data &= ~GG82563_KMCR_PASS_FALSE_CARRIER; ++ ++ ret_val = e1e_wphy(hw, GG82563_PHY_KMRN_MODE_CTRL, reg_data); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_cfg_kmrn_1000_80003es2lan - Apply "quirks" for gigabit operation ++ * @hw: pointer to the HW structure ++ * ++ * Configure the KMRN interface by applying last minute quirks for ++ * gigabit operation. ++ **/ ++static s32 e1000_cfg_kmrn_1000_80003es2lan(struct e1000_hw *hw) ++{ ++ s32 ret_val = E1000_SUCCESS; ++ u16 reg_data, reg_data2; ++ u32 tipg; ++ u32 i = 0; ++ ++ reg_data = E1000_KMRNCTRLSTA_HD_CTRL_1000_DEFAULT; ++ ret_val = e1000_write_kmrn_reg_80003es2lan(hw, ++ E1000_KMRNCTRLSTA_OFFSET_HD_CTRL, ++ reg_data); ++ if (ret_val) ++ goto out; ++ ++ /* Configure Transmit Inter-Packet Gap */ ++ tipg = er32(TIPG); ++ tipg &= ~E1000_TIPG_IPGT_MASK; ++ tipg |= DEFAULT_TIPG_IPGT_1000_80003ES2LAN; ++ ew32(TIPG, tipg); ++ ++ ++ do { ++ ret_val = e1e_rphy(hw, GG82563_PHY_KMRN_MODE_CTRL, ++ ®_data); ++ if (ret_val) ++ goto out; ++ ++ ret_val = e1e_rphy(hw, GG82563_PHY_KMRN_MODE_CTRL, ++ ®_data2); ++ if (ret_val) ++ goto out; ++ i++; ++ } while ((reg_data != reg_data2) && (i < GG82563_MAX_KMRN_RETRY)); ++ ++ reg_data &= ~GG82563_KMCR_PASS_FALSE_CARRIER; ++ ret_val = e1e_wphy(hw, GG82563_PHY_KMRN_MODE_CTRL, reg_data); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_read_kmrn_reg_80003es2lan - Read kumeran register ++ * @hw: pointer to the HW structure ++ * @offset: register offset to be read ++ * @data: pointer to the read data ++ * ++ * Acquire semaphore, then read the PHY register at offset ++ * using the kumeran interface. The information retrieved is stored in data. ++ * Release the semaphore before exiting. ++ **/ ++static s32 e1000_read_kmrn_reg_80003es2lan(struct e1000_hw *hw, u32 offset, ++ u16 *data) ++{ ++ u32 kmrnctrlsta; ++ s32 ret_val = E1000_SUCCESS; ++ ++ ret_val = e1000_acquire_mac_csr_80003es2lan(hw); ++ if (ret_val) ++ goto out; ++ ++ kmrnctrlsta = ((offset << E1000_KMRNCTRLSTA_OFFSET_SHIFT) & ++ E1000_KMRNCTRLSTA_OFFSET) | E1000_KMRNCTRLSTA_REN; ++ ew32(KMRNCTRLSTA, kmrnctrlsta); ++ ++ udelay(2); ++ ++ kmrnctrlsta = er32(KMRNCTRLSTA); ++ *data = (u16)kmrnctrlsta; ++ ++ e1000_release_mac_csr_80003es2lan(hw); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_write_kmrn_reg_80003es2lan - Write kumeran register ++ * @hw: pointer to the HW structure ++ * @offset: register offset to write to ++ * @data: data to write at register offset ++ * ++ * Acquire semaphore, then write the data to PHY register ++ * at the offset using the kumeran interface. Release semaphore ++ * before exiting. ++ **/ ++static s32 e1000_write_kmrn_reg_80003es2lan(struct e1000_hw *hw, u32 offset, ++ u16 data) ++{ ++ u32 kmrnctrlsta; ++ s32 ret_val = E1000_SUCCESS; ++ ++ ret_val = e1000_acquire_mac_csr_80003es2lan(hw); ++ if (ret_val) ++ goto out; ++ ++ kmrnctrlsta = ((offset << E1000_KMRNCTRLSTA_OFFSET_SHIFT) & ++ E1000_KMRNCTRLSTA_OFFSET) | data; ++ ew32(KMRNCTRLSTA, kmrnctrlsta); ++ ++ udelay(2); ++ ++ e1000_release_mac_csr_80003es2lan(hw); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_read_mac_addr_80003es2lan - Read device MAC address ++ * @hw: pointer to the HW structure ++ **/ ++static s32 e1000_read_mac_addr_80003es2lan(struct e1000_hw *hw) ++{ ++ s32 ret_val = E1000_SUCCESS; ++ ++ if (e1000_check_alt_mac_addr_generic(hw)) ++ ret_val = e1000e_read_mac_addr_generic(hw); ++ ++ return ret_val; ++} ++ ++/** ++ * e1000_power_down_phy_copper_80003es2lan - Remove link during PHY power down ++ * @hw: pointer to the HW structure ++ * ++ * In the case of a PHY power down to save power, or to turn off link during a ++ * driver unload, or wake on lan is not enabled, remove the link. ++ **/ ++static void e1000_power_down_phy_copper_80003es2lan(struct e1000_hw *hw) ++{ ++ /* If the management interface is not enabled, then power down */ ++ if (!(hw->mac.ops.check_mng_mode(hw) || ++ e1000_check_reset_block(hw))) ++ e1000_power_down_phy_copper(hw); ++ ++ return; ++} ++ ++/** ++ * e1000_clear_hw_cntrs_80003es2lan - Clear device specific hardware counters ++ * @hw: pointer to the HW structure ++ * ++ * Clears the hardware counters by reading the counter registers. ++ **/ ++static void e1000_clear_hw_cntrs_80003es2lan(struct e1000_hw *hw) ++{ ++ e1000e_clear_hw_cntrs_base(hw); ++ ++ er32(PRC64); ++ er32(PRC127); ++ er32(PRC255); ++ er32(PRC511); ++ er32(PRC1023); ++ er32(PRC1522); ++ er32(PTC64); ++ er32(PTC127); ++ er32(PTC255); ++ er32(PTC511); ++ er32(PTC1023); ++ er32(PTC1522); ++ ++ er32(ALGNERRC); ++ er32(RXERRC); ++ er32(TNCRS); ++ er32(CEXTERR); ++ er32(TSCTC); ++ er32(TSCTFC); ++ ++ er32(MGTPRC); ++ er32(MGTPDC); ++ er32(MGTPTC); ++ ++ er32(IAC); ++ er32(ICRXOC); ++ ++ er32(ICRXPTC); ++ er32(ICRXATC); ++ er32(ICTXPTC); ++ er32(ICTXATC); ++ er32(ICTXQEC); ++ er32(ICTXQMTC); ++ er32(ICRXDMTC); ++} +diff -r bd70f2f305c6 drivers/net/e1000e/e1000_80003es2lan.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/e1000e/e1000_80003es2lan.h Mon Jun 15 11:45:35 2009 +0100 +@@ -0,0 +1,95 @@ ++/******************************************************************************* ++ ++ Intel PRO/1000 Linux driver ++ Copyright(c) 1999 - 2009 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ Linux NICS ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++#ifndef _E1000_80003ES2LAN_H_ ++#define _E1000_80003ES2LAN_H_ ++ ++#define E1000_KMRNCTRLSTA_OFFSET_FIFO_CTRL 0x00 ++#define E1000_KMRNCTRLSTA_OFFSET_INB_CTRL 0x02 ++#define E1000_KMRNCTRLSTA_OFFSET_HD_CTRL 0x10 ++#define E1000_KMRNCTRLSTA_OFFSET_MAC2PHY_OPMODE 0x1F ++ ++#define E1000_KMRNCTRLSTA_FIFO_CTRL_RX_BYPASS 0x0008 ++#define E1000_KMRNCTRLSTA_FIFO_CTRL_TX_BYPASS 0x0800 ++#define E1000_KMRNCTRLSTA_INB_CTRL_DIS_PADDING 0x0010 ++ ++#define E1000_KMRNCTRLSTA_HD_CTRL_10_100_DEFAULT 0x0004 ++#define E1000_KMRNCTRLSTA_HD_CTRL_1000_DEFAULT 0x0000 ++#define E1000_KMRNCTRLSTA_OPMODE_E_IDLE 0x2000 ++ ++#define E1000_TCTL_EXT_GCEX_MASK 0x000FFC00 /* Gigabit Carry Extend Padding */ ++#define DEFAULT_TCTL_EXT_GCEX_80003ES2LAN 0x00010000 ++ ++#define DEFAULT_TIPG_IPGT_1000_80003ES2LAN 0x8 ++#define DEFAULT_TIPG_IPGT_10_100_80003ES2LAN 0x9 ++ ++/* GG82563 PHY Specific Status Register (Page 0, Register 16 */ ++#define GG82563_PSCR_POLARITY_REVERSAL_DISABLE 0x0002 /* 1=Reversal Disabled */ ++#define GG82563_PSCR_CROSSOVER_MODE_MASK 0x0060 ++#define GG82563_PSCR_CROSSOVER_MODE_MDI 0x0000 /* 00=Manual MDI */ ++#define GG82563_PSCR_CROSSOVER_MODE_MDIX 0x0020 /* 01=Manual MDIX */ ++#define GG82563_PSCR_CROSSOVER_MODE_AUTO 0x0060 /* 11=Auto crossover */ ++ ++/* PHY Specific Control Register 2 (Page 0, Register 26) */ ++#define GG82563_PSCR2_REVERSE_AUTO_NEG 0x2000 ++ /* 1=Reverse Auto-Negotiation */ ++ ++/* MAC Specific Control Register (Page 2, Register 21) */ ++/* Tx clock speed for Link Down and 1000BASE-T for the following speeds */ ++#define GG82563_MSCR_TX_CLK_MASK 0x0007 ++#define GG82563_MSCR_TX_CLK_10MBPS_2_5 0x0004 ++#define GG82563_MSCR_TX_CLK_100MBPS_25 0x0005 ++#define GG82563_MSCR_TX_CLK_1000MBPS_2_5 0x0006 ++#define GG82563_MSCR_TX_CLK_1000MBPS_25 0x0007 ++ ++#define GG82563_MSCR_ASSERT_CRS_ON_TX 0x0010 /* 1=Assert */ ++ ++/* DSP Distance Register (Page 5, Register 26) */ ++/* ++ * 0 = <50M ++ * 1 = 50-80M ++ * 2 = 80-100M ++ * 3 = 110-140M ++ * 4 = >140M ++ */ ++#define GG82563_DSPD_CABLE_LENGTH 0x0007 ++ ++/* Kumeran Mode Control Register (Page 193, Register 16) */ ++#define GG82563_KMCR_PASS_FALSE_CARRIER 0x0800 ++ ++/* Max number of times Kumeran read/write should be validated */ ++#define GG82563_MAX_KMRN_RETRY 0x5 ++ ++/* Power Management Control Register (Page 193, Register 20) */ ++#define GG82563_PMCR_ENABLE_ELECTRICAL_IDLE 0x0001 ++ /* 1=Enable SERDES Electrical Idle */ ++ ++/* In-Band Control Register (Page 194, Register 18) */ ++#define GG82563_ICR_DIS_PADDING 0x0010 /* Disable Padding */ ++ ++#endif +diff -r bd70f2f305c6 drivers/net/e1000e/e1000_82571.c +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/e1000e/e1000_82571.c Mon Jun 15 11:45:35 2009 +0100 +@@ -0,0 +1,1692 @@ ++/******************************************************************************* ++ ++ Intel PRO/1000 Linux driver ++ Copyright(c) 1999 - 2009 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ Linux NICS ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++/* ++ * 82571EB Gigabit Ethernet Controller ++ * 82571EB Gigabit Ethernet Controller (Copper) ++ * 82571EB Gigabit Ethernet Controller (Fiber) ++ * 82571EB Dual Port Gigabit Mezzanine Adapter ++ * 82571EB Quad Port Gigabit Mezzanine Adapter ++ * 82571PT Gigabit PT Quad Port Server ExpressModule ++ * 82572EI Gigabit Ethernet Controller (Copper) ++ * 82572EI Gigabit Ethernet Controller (Fiber) ++ * 82572EI Gigabit Ethernet Controller ++ * 82573V Gigabit Ethernet Controller (Copper) ++ * 82573E Gigabit Ethernet Controller (Copper) ++ * 82573L Gigabit Ethernet Controller ++ * 82574L Gigabit Network Connection ++ * 82574L Gigabit Network Connection ++ * 82583V Gigabit Network Connection ++ */ ++ ++#include "e1000.h" ++ ++static s32 e1000_init_phy_params_82571(struct e1000_hw *hw); ++static s32 e1000_init_nvm_params_82571(struct e1000_hw *hw); ++static s32 e1000_init_mac_params_82571(struct e1000_hw *hw); ++static s32 e1000_acquire_nvm_82571(struct e1000_hw *hw); ++static void e1000_release_nvm_82571(struct e1000_hw *hw); ++static s32 e1000_write_nvm_82571(struct e1000_hw *hw, u16 offset, ++ u16 words, u16 *data); ++static s32 e1000_update_nvm_checksum_82571(struct e1000_hw *hw); ++static s32 e1000_validate_nvm_checksum_82571(struct e1000_hw *hw); ++static s32 e1000_get_cfg_done_82571(struct e1000_hw *hw); ++static s32 e1000_set_d0_lplu_state_82571(struct e1000_hw *hw, ++ bool active); ++static s32 e1000_reset_hw_82571(struct e1000_hw *hw); ++static s32 e1000_init_hw_82571(struct e1000_hw *hw); ++static void e1000_clear_vfta_82571(struct e1000_hw *hw); ++static bool e1000_check_mng_mode_82574(struct e1000_hw *hw); ++static s32 e1000_led_on_82574(struct e1000_hw *hw); ++static void e1000_update_mc_addr_list_82571(struct e1000_hw *hw, ++ u8 *mc_addr_list, u32 mc_addr_count, ++ u32 rar_used_count, u32 rar_count); ++static s32 e1000_setup_link_82571(struct e1000_hw *hw); ++static s32 e1000_setup_copper_link_82571(struct e1000_hw *hw); ++static s32 e1000_check_for_serdes_link_82571(struct e1000_hw *hw); ++static s32 e1000_setup_fiber_serdes_link_82571(struct e1000_hw *hw); ++static s32 e1000_valid_led_default_82571(struct e1000_hw *hw, u16 *data); ++static void e1000_clear_hw_cntrs_82571(struct e1000_hw *hw); ++static s32 e1000_get_hw_semaphore_82571(struct e1000_hw *hw); ++static s32 e1000_fix_nvm_checksum_82571(struct e1000_hw *hw); ++static s32 e1000_get_phy_id_82571(struct e1000_hw *hw); ++static void e1000_put_hw_semaphore_82571(struct e1000_hw *hw); ++static void e1000_initialize_hw_bits_82571(struct e1000_hw *hw); ++static s32 e1000_write_nvm_eewr_82571(struct e1000_hw *hw, u16 offset, ++ u16 words, u16 *data); ++static s32 e1000_read_mac_addr_82571(struct e1000_hw *hw); ++static void e1000_power_down_phy_copper_82571(struct e1000_hw *hw); ++ ++/** ++ * e1000_init_phy_params_82571 - Init PHY func ptrs. ++ * @hw: pointer to the HW structure ++ **/ ++static s32 e1000_init_phy_params_82571(struct e1000_hw *hw) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ s32 ret_val = E1000_SUCCESS; ++ ++ if (hw->phy.media_type != e1000_media_type_copper) { ++ phy->type = e1000_phy_none; ++ goto out; ++ } ++ ++ phy->addr = 1; ++ phy->autoneg_mask = AUTONEG_ADVERTISE_SPEED_DEFAULT; ++ phy->reset_delay_us = 100; ++ ++ phy->ops.acquire = e1000_get_hw_semaphore_82571; ++ phy->ops.check_polarity = e1000_check_polarity_igp; ++ phy->ops.check_reset_block = e1000e_check_reset_block_generic; ++ phy->ops.release = e1000_put_hw_semaphore_82571; ++ phy->ops.reset = e1000e_phy_hw_reset_generic; ++ phy->ops.set_d0_lplu_state = e1000_set_d0_lplu_state_82571; ++ phy->ops.set_d3_lplu_state = e1000e_set_d3_lplu_state; ++ phy->ops.power_up = e1000_power_up_phy_copper; ++ phy->ops.power_down = e1000_power_down_phy_copper_82571; ++ ++ switch (hw->mac.type) { ++ case e1000_82571: ++ case e1000_82572: ++ phy->type = e1000_phy_igp_2; ++ phy->ops.get_cfg_done = e1000_get_cfg_done_82571; ++ phy->ops.get_info = e1000e_get_phy_info_igp; ++ phy->ops.force_speed_duplex = e1000e_phy_force_speed_duplex_igp; ++ phy->ops.get_cable_length = e1000e_get_cable_length_igp_2; ++ phy->ops.read_reg = e1000e_read_phy_reg_igp; ++ phy->ops.write_reg = e1000e_write_phy_reg_igp; ++ ++ /* This uses above function pointers */ ++ ret_val = e1000_get_phy_id_82571(hw); ++ ++ /* Verify PHY ID */ ++ if (phy->id != IGP01E1000_I_PHY_ID) { ++ ret_val = -E1000_ERR_PHY; ++ goto out; ++ } ++ break; ++ case e1000_82573: ++ phy->type = e1000_phy_m88; ++ phy->ops.get_cfg_done = e1000e_get_cfg_done; ++ phy->ops.get_info = e1000e_get_phy_info_m88; ++ phy->ops.commit = e1000e_phy_sw_reset; ++ phy->ops.force_speed_duplex = e1000e_phy_force_speed_duplex_m88; ++ phy->ops.get_cable_length = e1000e_get_cable_length_m88; ++ phy->ops.read_reg = e1000e_read_phy_reg_m88; ++ phy->ops.write_reg = e1000e_write_phy_reg_m88; ++ ++ /* This uses above function pointers */ ++ ret_val = e1000_get_phy_id_82571(hw); ++ ++ /* Verify PHY ID */ ++ if (phy->id != M88E1111_I_PHY_ID) { ++ ret_val = -E1000_ERR_PHY; ++ e_dbg("PHY ID unknown: type = 0x%08x\n", phy->id); ++ goto out; ++ } ++ break; ++ case e1000_82583: ++ case e1000_82574: ++ phy->type = e1000_phy_bm; ++ phy->ops.get_cfg_done = e1000e_get_cfg_done; ++ phy->ops.get_info = e1000e_get_phy_info_m88; ++ phy->ops.commit = e1000e_phy_sw_reset; ++ phy->ops.force_speed_duplex = e1000e_phy_force_speed_duplex_m88; ++ phy->ops.get_cable_length = e1000e_get_cable_length_m88; ++ phy->ops.read_reg = e1000e_read_phy_reg_bm2; ++ phy->ops.write_reg = e1000e_write_phy_reg_bm2; ++ ++ /* This uses above function pointers */ ++ ret_val = e1000_get_phy_id_82571(hw); ++ /* Verify PHY ID */ ++ if (phy->id != BME1000_E_PHY_ID_R2) { ++ ret_val = -E1000_ERR_PHY; ++ e_dbg("PHY ID unknown: type = 0x%08x\n", phy->id); ++ goto out; ++ } ++ break; ++ default: ++ ret_val = -E1000_ERR_PHY; ++ goto out; ++ break; ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_init_nvm_params_82571 - Init NVM func ptrs. ++ * @hw: pointer to the HW structure ++ **/ ++static s32 e1000_init_nvm_params_82571(struct e1000_hw *hw) ++{ ++ struct e1000_nvm_info *nvm = &hw->nvm; ++ u32 eecd = er32(EECD); ++ u16 size; ++ ++ nvm->opcode_bits = 8; ++ nvm->delay_usec = 1; ++ switch (nvm->override) { ++ case e1000_nvm_override_spi_large: ++ nvm->page_size = 32; ++ nvm->address_bits = 16; ++ break; ++ case e1000_nvm_override_spi_small: ++ nvm->page_size = 8; ++ nvm->address_bits = 8; ++ break; ++ default: ++ nvm->page_size = eecd & E1000_EECD_ADDR_BITS ? 32 : 8; ++ nvm->address_bits = eecd & E1000_EECD_ADDR_BITS ? 16 : 8; ++ break; ++ } ++ ++ switch (hw->mac.type) { ++ case e1000_82573: ++ case e1000_82574: ++ case e1000_82583: ++ if (((eecd >> 15) & 0x3) == 0x3) { ++ nvm->type = e1000_nvm_flash_hw; ++ nvm->word_size = 2048; ++ /* ++ * Autonomous Flash update bit must be cleared due ++ * to Flash update issue. ++ */ ++ eecd &= ~E1000_EECD_AUPDEN; ++ ew32(EECD, eecd); ++ break; ++ } ++ /* Fall Through */ ++ default: ++ nvm->type = e1000_nvm_eeprom_spi; ++ size = (u16)((eecd & E1000_EECD_SIZE_EX_MASK) >> ++ E1000_EECD_SIZE_EX_SHIFT); ++ /* ++ * Added to a constant, "size" becomes the left-shift value ++ * for setting word_size. ++ */ ++ size += NVM_WORD_SIZE_BASE_SHIFT; ++ ++ /* EEPROM access above 16k is unsupported */ ++ if (size > 14) ++ size = 14; ++ nvm->word_size = 1 << size; ++ break; ++ } ++ ++ /* Function Pointers */ ++ nvm->ops.acquire = e1000_acquire_nvm_82571; ++ nvm->ops.read = e1000e_read_nvm_eerd; ++ nvm->ops.release = e1000_release_nvm_82571; ++ nvm->ops.update = e1000_update_nvm_checksum_82571; ++ nvm->ops.validate = e1000_validate_nvm_checksum_82571; ++ nvm->ops.valid_led_default = e1000_valid_led_default_82571; ++ nvm->ops.write = e1000_write_nvm_82571; ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_init_mac_params_82571 - Init MAC func ptrs. ++ * @hw: pointer to the HW structure ++ **/ ++static s32 e1000_init_mac_params_82571(struct e1000_hw *hw) ++{ ++ struct e1000_mac_info *mac = &hw->mac; ++ s32 ret_val = E1000_SUCCESS; ++ ++ /* Set media type */ ++ switch (hw->device_id) { ++ case E1000_DEV_ID_82571EB_FIBER: ++ case E1000_DEV_ID_82572EI_FIBER: ++ case E1000_DEV_ID_82571EB_QUAD_FIBER: ++ hw->phy.media_type = e1000_media_type_fiber; ++ break; ++ case E1000_DEV_ID_82571EB_SERDES: ++ case E1000_DEV_ID_82571EB_SERDES_DUAL: ++ case E1000_DEV_ID_82571EB_SERDES_QUAD: ++ case E1000_DEV_ID_82572EI_SERDES: ++ hw->phy.media_type = e1000_media_type_internal_serdes; ++ break; ++ default: ++ hw->phy.media_type = e1000_media_type_copper; ++ break; ++ } ++ ++ /* Set mta register count */ ++ mac->mta_reg_count = 128; ++ /* Set rar entry count */ ++ mac->rar_entry_count = E1000_RAR_ENTRIES; ++ /* Set if part includes ASF firmware */ ++ mac->asf_firmware_present = true; ++ /* Set if manageability features are enabled. */ ++ mac->arc_subsystem_valid = ++ (er32(FWSM) & E1000_FWSM_MODE_MASK) ++ ? true : false; ++ ++ /* Function pointers */ ++ ++ /* bus type/speed/width */ ++ mac->ops.get_bus_info = e1000e_get_bus_info_pcie; ++ /* function id */ ++ switch (hw->mac.type) { ++ case e1000_82573: ++ case e1000_82574: ++ case e1000_82583: ++ mac->ops.set_lan_id = e1000_set_lan_id_single_port; ++ break; ++ default: ++ break; ++ } ++ /* reset */ ++ mac->ops.reset_hw = e1000_reset_hw_82571; ++ /* hw initialization */ ++ mac->ops.init_hw = e1000_init_hw_82571; ++ /* link setup */ ++ mac->ops.setup_link = e1000_setup_link_82571; ++ /* physical interface link setup */ ++ mac->ops.setup_physical_interface = ++ (hw->phy.media_type == e1000_media_type_copper) ++ ? e1000_setup_copper_link_82571 ++ : e1000_setup_fiber_serdes_link_82571; ++ /* check for link */ ++ switch (hw->phy.media_type) { ++ case e1000_media_type_copper: ++ mac->ops.check_for_link = e1000e_check_for_copper_link; ++ break; ++ case e1000_media_type_fiber: ++ mac->ops.check_for_link = e1000e_check_for_fiber_link; ++ break; ++ case e1000_media_type_internal_serdes: ++ mac->ops.check_for_link = e1000_check_for_serdes_link_82571; ++ break; ++ default: ++ ret_val = -E1000_ERR_CONFIG; ++ goto out; ++ break; ++ } ++ /* check management mode */ ++ switch (hw->mac.type) { ++ case e1000_82574: ++ case e1000_82583: ++ mac->ops.check_mng_mode = e1000_check_mng_mode_82574; ++ break; ++ default: ++ mac->ops.check_mng_mode = e1000_check_mng_mode_generic; ++ break; ++ } ++ /* multicast address update */ ++ mac->ops.update_mc_addr_list = e1000_update_mc_addr_list_82571; ++ /* writing VFTA */ ++ mac->ops.write_vfta = e1000e_write_vfta_generic; ++ /* clearing VFTA */ ++ mac->ops.clear_vfta = e1000_clear_vfta_82571; ++ /* setting MTA */ ++ mac->ops.mta_set = e1000_mta_set_generic; ++ /* read mac address */ ++ mac->ops.read_mac_addr = e1000_read_mac_addr_82571; ++ /* ID LED init */ ++ mac->ops.id_led_init = e1000e_id_led_init; ++ /* blink LED */ ++ mac->ops.blink_led = e1000e_blink_led; ++ /* setup LED */ ++ mac->ops.setup_led = e1000_setup_led_generic; ++ /* cleanup LED */ ++ mac->ops.cleanup_led = e1000e_cleanup_led_generic; ++ /* turn on/off LED */ ++ switch (hw->mac.type) { ++ case e1000_82574: ++ case e1000_82583: ++ mac->ops.led_on = e1000_led_on_82574; ++ break; ++ default: ++ mac->ops.led_on = e1000e_led_on_generic; ++ break; ++ } ++ mac->ops.led_off = e1000e_led_off_generic; ++ /* clear hardware counters */ ++ mac->ops.clear_hw_cntrs = e1000_clear_hw_cntrs_82571; ++ /* link info */ ++ mac->ops.get_link_up_info = ++ (hw->phy.media_type == e1000_media_type_copper) ++ ? e1000e_get_speed_and_duplex_copper ++ : e1000e_get_speed_and_duplex_fiber_serdes; ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_init_function_pointers_82571 - Init func ptrs. ++ * @hw: pointer to the HW structure ++ * ++ * Called to initialize all function pointers and parameters. ++ **/ ++void e1000_init_function_pointers_82571(struct e1000_hw *hw) ++{ ++ e1000_init_mac_ops_generic(hw); ++ e1000_init_nvm_ops_generic(hw); ++ hw->mac.ops.init_params = e1000_init_mac_params_82571; ++ hw->nvm.ops.init_params = e1000_init_nvm_params_82571; ++ hw->phy.ops.init_params = e1000_init_phy_params_82571; ++} ++ ++/** ++ * e1000_get_phy_id_82571 - Retrieve the PHY ID and revision ++ * @hw: pointer to the HW structure ++ * ++ * Reads the PHY registers and stores the PHY ID and possibly the PHY ++ * revision in the hardware structure. ++ **/ ++static s32 e1000_get_phy_id_82571(struct e1000_hw *hw) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ s32 ret_val = E1000_SUCCESS; ++ u16 phy_id = 0; ++ ++ switch (hw->mac.type) { ++ case e1000_82571: ++ case e1000_82572: ++ /* ++ * The 82571 firmware may still be configuring the PHY. ++ * In this case, we cannot access the PHY until the ++ * configuration is done. So we explicitly set the ++ * PHY ID. ++ */ ++ phy->id = IGP01E1000_I_PHY_ID; ++ break; ++ case e1000_82573: ++ ret_val = e1000e_get_phy_id(hw); ++ break; ++ case e1000_82574: ++ case e1000_82583: ++ ret_val = e1e_rphy(hw, PHY_ID1, &phy_id); ++ if (ret_val) ++ goto out; ++ ++ phy->id = (u32)(phy_id << 16); ++ udelay(20); ++ ret_val = e1e_rphy(hw, PHY_ID2, &phy_id); ++ if (ret_val) ++ goto out; ++ ++ phy->id |= (u32)(phy_id); ++ phy->revision = (u32)(phy_id & ~PHY_REVISION_MASK); ++ break; ++ default: ++ ret_val = -E1000_ERR_PHY; ++ break; ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_get_hw_semaphore_82571 - Acquire hardware semaphore ++ * @hw: pointer to the HW structure ++ * ++ * Acquire the HW semaphore to access the PHY or NVM ++ **/ ++static s32 e1000_get_hw_semaphore_82571(struct e1000_hw *hw) ++{ ++ u32 swsm; ++ s32 ret_val = E1000_SUCCESS; ++ s32 timeout = hw->nvm.word_size + 1; ++ s32 i = 0; ++ ++ /* Get the FW semaphore. */ ++ for (i = 0; i < timeout; i++) { ++ swsm = er32(SWSM); ++ ew32(SWSM, swsm | E1000_SWSM_SWESMBI); ++ ++ /* Semaphore acquired if bit latched */ ++ if (er32(SWSM) & E1000_SWSM_SWESMBI) ++ break; ++ ++ udelay(50); ++ } ++ ++ if (i == timeout) { ++ /* Release semaphores */ ++ e1000e_put_hw_semaphore(hw); ++ e_dbg("Driver can't access the NVM\n"); ++ ret_val = -E1000_ERR_NVM; ++ goto out; ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_put_hw_semaphore_82571 - Release hardware semaphore ++ * @hw: pointer to the HW structure ++ * ++ * Release hardware semaphore used to access the PHY or NVM ++ **/ ++static void e1000_put_hw_semaphore_82571(struct e1000_hw *hw) ++{ ++ u32 swsm; ++ ++ swsm = er32(SWSM); ++ swsm &= ~E1000_SWSM_SWESMBI; ++ ew32(SWSM, swsm); ++} ++/** ++ * e1000_acquire_nvm_82571 - Request for access to the EEPROM ++ * @hw: pointer to the HW structure ++ * ++ * To gain access to the EEPROM, first we must obtain a hardware semaphore. ++ * Then for non-82573 hardware, set the EEPROM access request bit and wait ++ * for EEPROM access grant bit. If the access grant bit is not set, release ++ * hardware semaphore. ++ **/ ++static s32 e1000_acquire_nvm_82571(struct e1000_hw *hw) ++{ ++ s32 ret_val; ++ ++ ret_val = e1000_get_hw_semaphore_82571(hw); ++ if (ret_val) ++ goto out; ++ ++ switch (hw->mac.type) { ++ case e1000_82574: ++ case e1000_82583: ++ case e1000_82573: ++ break; ++ default: ++ ret_val = e1000e_acquire_nvm(hw); ++ break; ++ } ++ ++ if (ret_val) ++ e1000_put_hw_semaphore_82571(hw); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_release_nvm_82571 - Release exclusive access to EEPROM ++ * @hw: pointer to the HW structure ++ * ++ * Stop any current commands to the EEPROM and clear the EEPROM request bit. ++ **/ ++static void e1000_release_nvm_82571(struct e1000_hw *hw) ++{ ++ e1000e_release_nvm(hw); ++ e1000_put_hw_semaphore_82571(hw); ++} ++ ++/** ++ * e1000_write_nvm_82571 - Write to EEPROM using appropriate interface ++ * @hw: pointer to the HW structure ++ * @offset: offset within the EEPROM to be written to ++ * @words: number of words to write ++ * @data: 16 bit word(s) to be written to the EEPROM ++ * ++ * For non-82573 silicon, write data to EEPROM at offset using SPI interface. ++ * ++ * If e1000_update_nvm_checksum is not called after this function, the ++ * EEPROM will most likely contain an invalid checksum. ++ **/ ++static s32 e1000_write_nvm_82571(struct e1000_hw *hw, u16 offset, u16 words, ++ u16 *data) ++{ ++ s32 ret_val = E1000_SUCCESS; ++ ++ switch (hw->mac.type) { ++ case e1000_82573: ++ case e1000_82574: ++ case e1000_82583: ++ ret_val = e1000_write_nvm_eewr_82571(hw, offset, words, data); ++ break; ++ case e1000_82571: ++ case e1000_82572: ++ ret_val = e1000e_write_nvm_spi(hw, offset, words, data); ++ break; ++ default: ++ ret_val = -E1000_ERR_NVM; ++ break; ++ } ++ ++ return ret_val; ++} ++ ++/** ++ * e1000_update_nvm_checksum_82571 - Update EEPROM checksum ++ * @hw: pointer to the HW structure ++ * ++ * Updates the EEPROM checksum by reading/adding each word of the EEPROM ++ * up to the checksum. Then calculates the EEPROM checksum and writes the ++ * value to the EEPROM. ++ **/ ++static s32 e1000_update_nvm_checksum_82571(struct e1000_hw *hw) ++{ ++ u32 eecd; ++ s32 ret_val; ++ u16 i; ++ ++ ret_val = e1000e_update_nvm_checksum_generic(hw); ++ if (ret_val) ++ goto out; ++ ++ /* ++ * If our nvm is an EEPROM, then we're done ++ * otherwise, commit the checksum to the flash NVM. ++ */ ++ if (hw->nvm.type != e1000_nvm_flash_hw) ++ goto out; ++ ++ /* Check for pending operations. */ ++ for (i = 0; i < E1000_FLASH_UPDATES; i++) { ++ msleep(1); ++ if ((er32(EECD) & E1000_EECD_FLUPD) == 0) ++ break; ++ } ++ ++ if (i == E1000_FLASH_UPDATES) { ++ ret_val = -E1000_ERR_NVM; ++ goto out; ++ } ++ ++ /* Reset the firmware if using STM opcode. */ ++ if ((er32(FLOP) & 0xFF00) == E1000_STM_OPCODE) { ++ /* ++ * The enabling of and the actual reset must be done ++ * in two write cycles. ++ */ ++ ew32(HICR, E1000_HICR_FW_RESET_ENABLE); ++ e1e_flush(); ++ ew32(HICR, E1000_HICR_FW_RESET); ++ } ++ ++ /* Commit the write to flash */ ++ eecd = er32(EECD) | E1000_EECD_FLUPD; ++ ew32(EECD, eecd); ++ ++ for (i = 0; i < E1000_FLASH_UPDATES; i++) { ++ msleep(1); ++ if ((er32(EECD) & E1000_EECD_FLUPD) == 0) ++ break; ++ } ++ ++ if (i == E1000_FLASH_UPDATES) { ++ ret_val = -E1000_ERR_NVM; ++ goto out; ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_validate_nvm_checksum_82571 - Validate EEPROM checksum ++ * @hw: pointer to the HW structure ++ * ++ * Calculates the EEPROM checksum by reading/adding each word of the EEPROM ++ * and then verifies that the sum of the EEPROM is equal to 0xBABA. ++ **/ ++static s32 e1000_validate_nvm_checksum_82571(struct e1000_hw *hw) ++{ ++ if (hw->nvm.type == e1000_nvm_flash_hw) ++ e1000_fix_nvm_checksum_82571(hw); ++ ++ return e1000e_validate_nvm_checksum_generic(hw); ++} ++ ++/** ++ * e1000_write_nvm_eewr_82571 - Write to EEPROM for 82573 silicon ++ * @hw: pointer to the HW structure ++ * @offset: offset within the EEPROM to be written to ++ * @words: number of words to write ++ * @data: 16 bit word(s) to be written to the EEPROM ++ * ++ * After checking for invalid values, poll the EEPROM to ensure the previous ++ * command has completed before trying to write the next word. After write ++ * poll for completion. ++ * ++ * If e1000_update_nvm_checksum is not called after this function, the ++ * EEPROM will most likely contain an invalid checksum. ++ **/ ++static s32 e1000_write_nvm_eewr_82571(struct e1000_hw *hw, u16 offset, ++ u16 words, u16 *data) ++{ ++ struct e1000_nvm_info *nvm = &hw->nvm; ++ u32 i, eewr = 0; ++ s32 ret_val = 0; ++ ++ /* ++ * A check for invalid values: offset too large, too many words, ++ * and not enough words. ++ */ ++ if ((offset >= nvm->word_size) || (words > (nvm->word_size - offset)) || ++ (words == 0)) { ++ e_dbg("nvm parameter(s) out of bounds\n"); ++ ret_val = -E1000_ERR_NVM; ++ goto out; ++ } ++ ++ for (i = 0; i < words; i++) { ++ eewr = (data[i] << E1000_NVM_RW_REG_DATA) | ++ ((offset+i) << E1000_NVM_RW_ADDR_SHIFT) | ++ E1000_NVM_RW_REG_START; ++ ++ ret_val = e1000e_poll_eerd_eewr_done(hw, E1000_NVM_POLL_WRITE); ++ if (ret_val) ++ break; ++ ++ ew32(EEWR, eewr); ++ ++ ret_val = e1000e_poll_eerd_eewr_done(hw, E1000_NVM_POLL_WRITE); ++ if (ret_val) ++ break; ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_get_cfg_done_82571 - Poll for configuration done ++ * @hw: pointer to the HW structure ++ * ++ * Reads the management control register for the config done bit to be set. ++ **/ ++static s32 e1000_get_cfg_done_82571(struct e1000_hw *hw) ++{ ++ s32 timeout = PHY_CFG_TIMEOUT; ++ s32 ret_val = E1000_SUCCESS; ++ ++ while (timeout) { ++ if (er32(EEMNGCTL) & E1000_NVM_CFG_DONE_PORT_0) ++ break; ++ msleep(1); ++ timeout--; ++ } ++ if (!timeout) { ++ e_dbg("MNG configuration cycle has not completed.\n"); ++ ret_val = -E1000_ERR_RESET; ++ goto out; ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_set_d0_lplu_state_82571 - Set Low Power Linkup D0 state ++ * @hw: pointer to the HW structure ++ * @active: true to enable LPLU, false to disable ++ * ++ * Sets the LPLU D0 state according to the active flag. When activating LPLU ++ * this function also disables smart speed and vice versa. LPLU will not be ++ * activated unless the device autonegotiation advertisement meets standards ++ * of either 10 or 10/100 or 10/100/1000 at all duplexes. This is a function ++ * pointer entry point only called by PHY setup routines. ++ **/ ++static s32 e1000_set_d0_lplu_state_82571(struct e1000_hw *hw, bool active) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ s32 ret_val = E1000_SUCCESS; ++ u16 data; ++ ++ if (!(phy->ops.read_reg)) ++ goto out; ++ ++ ret_val = e1e_rphy(hw, IGP02E1000_PHY_POWER_MGMT, &data); ++ if (ret_val) ++ goto out; ++ ++ if (active) { ++ data |= IGP02E1000_PM_D0_LPLU; ++ ret_val = e1e_wphy(hw, IGP02E1000_PHY_POWER_MGMT, ++ data); ++ if (ret_val) ++ goto out; ++ ++ /* When LPLU is enabled, we should disable SmartSpeed */ ++ ret_val = e1e_rphy(hw, IGP01E1000_PHY_PORT_CONFIG, ++ &data); ++ data &= ~IGP01E1000_PSCFR_SMART_SPEED; ++ ret_val = e1e_wphy(hw, IGP01E1000_PHY_PORT_CONFIG, ++ data); ++ if (ret_val) ++ goto out; ++ } else { ++ data &= ~IGP02E1000_PM_D0_LPLU; ++ ret_val = e1e_wphy(hw, IGP02E1000_PHY_POWER_MGMT, ++ data); ++ /* ++ * LPLU and SmartSpeed are mutually exclusive. LPLU is used ++ * during Dx states where the power conservation is most ++ * important. During driver activity we should enable ++ * SmartSpeed, so performance is maintained. ++ */ ++ if (phy->smart_speed == e1000_smart_speed_on) { ++ ret_val = e1e_rphy(hw, ++ IGP01E1000_PHY_PORT_CONFIG, ++ &data); ++ if (ret_val) ++ goto out; ++ ++ data |= IGP01E1000_PSCFR_SMART_SPEED; ++ ret_val = e1e_wphy(hw, ++ IGP01E1000_PHY_PORT_CONFIG, ++ data); ++ if (ret_val) ++ goto out; ++ } else if (phy->smart_speed == e1000_smart_speed_off) { ++ ret_val = e1e_rphy(hw, ++ IGP01E1000_PHY_PORT_CONFIG, ++ &data); ++ if (ret_val) ++ goto out; ++ ++ data &= ~IGP01E1000_PSCFR_SMART_SPEED; ++ ret_val = e1e_wphy(hw, ++ IGP01E1000_PHY_PORT_CONFIG, ++ data); ++ if (ret_val) ++ goto out; ++ } ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_reset_hw_82571 - Reset hardware ++ * @hw: pointer to the HW structure ++ * ++ * This resets the hardware into a known state. ++ **/ ++static s32 e1000_reset_hw_82571(struct e1000_hw *hw) ++{ ++ u32 ctrl, extcnf_ctrl, ctrl_ext, icr; ++ s32 ret_val; ++ u16 i = 0; ++ ++ /* ++ * Prevent the PCI-E bus from sticking if there is no TLP connection ++ * on the last TLP read/write transaction when MAC is reset. ++ */ ++ ret_val = e1000e_disable_pcie_master(hw); ++ if (ret_val) ++ e_dbg("PCI-E Master disable polling has failed.\n"); ++ ++ e_dbg("Masking off all interrupts\n"); ++ ew32(IMC, 0xffffffff); ++ ++ ew32(RCTL, 0); ++ ew32(TCTL, E1000_TCTL_PSP); ++ e1e_flush(); ++ ++ msleep(10); ++ ++ /* ++ * Must acquire the MDIO ownership before MAC reset. ++ * Ownership defaults to firmware after a reset. ++ */ ++ switch (hw->mac.type) { ++ case e1000_82574: ++ case e1000_82583: ++ case e1000_82573: ++ extcnf_ctrl = er32(EXTCNF_CTRL); ++ extcnf_ctrl |= E1000_EXTCNF_CTRL_MDIO_SW_OWNERSHIP; ++ ++ do { ++ ew32(EXTCNF_CTRL, extcnf_ctrl); ++ extcnf_ctrl = er32(EXTCNF_CTRL); ++ ++ if (extcnf_ctrl & E1000_EXTCNF_CTRL_MDIO_SW_OWNERSHIP) ++ break; ++ ++ extcnf_ctrl |= E1000_EXTCNF_CTRL_MDIO_SW_OWNERSHIP; ++ ++ msleep(2); ++ i++; ++ } while (i < MDIO_OWNERSHIP_TIMEOUT); ++ break; ++ default: ++ break; ++ } ++ ++ ctrl = er32(CTRL); ++ ++ e_dbg("Issuing a global reset to MAC\n"); ++ ew32(CTRL, ctrl | E1000_CTRL_RST); ++ ++ if (hw->nvm.type == e1000_nvm_flash_hw) { ++ udelay(10); ++ ctrl_ext = er32(CTRL_EXT); ++ ctrl_ext |= E1000_CTRL_EXT_EE_RST; ++ ew32(CTRL_EXT, ctrl_ext); ++ e1e_flush(); ++ } ++ ++ ret_val = e1000e_get_auto_rd_done(hw); ++ if (ret_val) ++ /* We don't want to continue accessing MAC registers. */ ++ goto out; ++ ++ /* ++ * Phy configuration from NVM just starts after EECD_AUTO_RD is set. ++ * Need to wait for Phy configuration completion before accessing ++ * NVM and Phy. ++ */ ++ ++ switch (hw->mac.type) { ++ case e1000_82574: ++ case e1000_82583: ++ case e1000_82573: ++ msleep(25); ++ break; ++ default: ++ break; ++ } ++ ++ /* Clear any pending interrupt events. */ ++ ew32(IMC, 0xffffffff); ++ icr = er32(ICR); ++ ++ if (!(e1000_check_alt_mac_addr_generic(hw))) ++ e1000e_set_laa_state_82571(hw, true); ++ ++ /* Reinitialize the 82571 serdes link state machine */ ++ if (hw->phy.media_type == e1000_media_type_internal_serdes) ++ hw->mac.serdes_link_state = e1000_serdes_link_down; ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_init_hw_82571 - Initialize hardware ++ * @hw: pointer to the HW structure ++ * ++ * This inits the hardware readying it for operation. ++ **/ ++static s32 e1000_init_hw_82571(struct e1000_hw *hw) ++{ ++ struct e1000_mac_info *mac = &hw->mac; ++ u32 reg_data; ++ s32 ret_val; ++ u16 i, rar_count = mac->rar_entry_count; ++ ++ e1000_initialize_hw_bits_82571(hw); ++ ++ /* Initialize identification LED */ ++ ret_val = mac->ops.id_led_init(hw); ++ if (ret_val) { ++ e_dbg("Error initializing identification LED\n"); ++ /* This is not fatal and we should not stop init due to this */ ++ } ++ ++ /* Disabling VLAN filtering */ ++ e_dbg("Initializing the IEEE VLAN\n"); ++ e1000e_clear_vfta(hw); ++ ++ /* Setup the receive address. */ ++ /* ++ * If, however, a locally administered address was assigned to the ++ * 82571, we must reserve a RAR for it to work around an issue where ++ * resetting one port will reload the MAC on the other port. ++ */ ++ if (e1000e_get_laa_state_82571(hw)) ++ rar_count--; ++ e1000e_init_rx_addrs(hw, rar_count); ++ ++ /* Zero out the Multicast HASH table */ ++ e_dbg("Zeroing the MTA\n"); ++ for (i = 0; i < mac->mta_reg_count; i++) ++ E1000_WRITE_REG_ARRAY(hw, E1000_MTA, i, 0); ++ ++ /* Setup link and flow control */ ++ ret_val = mac->ops.setup_link(hw); ++ ++ /* Set the transmit descriptor write-back policy */ ++ reg_data = er32(TXDCTL(0)); ++ reg_data = (reg_data & ~E1000_TXDCTL_WTHRESH) | ++ E1000_TXDCTL_FULL_TX_DESC_WB | ++ E1000_TXDCTL_COUNT_DESC; ++ ew32(TXDCTL(0), reg_data); ++ ++ /* ...for both queues. */ ++ switch (mac->type) { ++ case e1000_82574: ++ case e1000_82583: ++ case e1000_82573: ++ e1000e_enable_tx_pkt_filtering(hw); ++ reg_data = er32(GCR); ++ reg_data |= E1000_GCR_L1_ACT_WITHOUT_L0S_RX; ++ ew32(GCR, reg_data); ++ break; ++ default: ++ reg_data = er32(TXDCTL(1)); ++ reg_data = (reg_data & ~E1000_TXDCTL_WTHRESH) | ++ E1000_TXDCTL_FULL_TX_DESC_WB | ++ E1000_TXDCTL_COUNT_DESC; ++ ew32(TXDCTL(1), reg_data); ++ break; ++ } ++ ++ /* ++ * Clear all of the statistics registers (clear on read). It is ++ * important that we do this after we have tried to establish link ++ * because the symbol error count will increment wildly if there ++ * is no link. ++ */ ++ e1000_clear_hw_cntrs_82571(hw); ++ ++ return ret_val; ++} ++ ++/** ++ * e1000_initialize_hw_bits_82571 - Initialize hardware-dependent bits ++ * @hw: pointer to the HW structure ++ * ++ * Initializes required hardware-dependent bits needed for normal operation. ++ **/ ++static void e1000_initialize_hw_bits_82571(struct e1000_hw *hw) ++{ ++ u32 reg; ++ ++ /* Transmit Descriptor Control 0 */ ++ reg = er32(TXDCTL(0)); ++ reg |= (1 << 22); ++ ew32(TXDCTL(0), reg); ++ ++ /* Transmit Descriptor Control 1 */ ++ reg = er32(TXDCTL(1)); ++ reg |= (1 << 22); ++ ew32(TXDCTL(1), reg); ++ ++ /* Transmit Arbitration Control 0 */ ++ reg = er32(TARC(0)); ++ reg &= ~(0xF << 27); /* 30:27 */ ++ switch (hw->mac.type) { ++ case e1000_82571: ++ case e1000_82572: ++ reg |= (1 << 23) | (1 << 24) | (1 << 25) | (1 << 26); ++ break; ++ default: ++ break; ++ } ++ ew32(TARC(0), reg); ++ ++ /* Transmit Arbitration Control 1 */ ++ reg = er32(TARC(1)); ++ switch (hw->mac.type) { ++ case e1000_82571: ++ case e1000_82572: ++ reg &= ~((1 << 29) | (1 << 30)); ++ reg |= (1 << 22) | (1 << 24) | (1 << 25) | (1 << 26); ++ if (er32(TCTL) & E1000_TCTL_MULR) ++ reg &= ~(1 << 28); ++ else ++ reg |= (1 << 28); ++ ew32(TARC(1), reg); ++ break; ++ default: ++ break; ++ } ++ ++ /* Device Control */ ++ ++ switch (hw->mac.type) { ++ case e1000_82574: ++ case e1000_82583: ++ case e1000_82573: ++ reg = er32(CTRL); ++ reg &= ~(1 << 29); ++ ew32(CTRL, reg); ++ break; ++ default: ++ break; ++ } ++ ++ /* Extended Device Control */ ++ switch (hw->mac.type) { ++ case e1000_82574: ++ case e1000_82583: ++ case e1000_82573: ++ reg = er32(CTRL_EXT); ++ reg &= ~(1 << 23); ++ reg |= (1 << 22); ++ ew32(CTRL_EXT, reg); ++ break; ++ default: ++ break; ++ } ++ ++ ++ if (hw->mac.type == e1000_82571) { ++ reg = er32(PBA_ECC); ++ reg |= E1000_PBA_ECC_CORR_EN; ++ ew32(PBA_ECC, reg); ++ } ++ ++ /* ++ * Workaround for hardware errata. ++ * Ensure that DMA Dynamic Clock gating is disabled on 82571 and 82572 ++ */ ++ ++ if ((hw->mac.type == e1000_82571) || ++ (hw->mac.type == e1000_82572)) { ++ reg = er32(CTRL_EXT); ++ reg &= ~E1000_CTRL_EXT_DMA_DYN_CLK_EN; ++ ew32(CTRL_EXT, reg); ++ } ++ ++ /* PCI-Ex Control Registers */ ++ ++ switch (hw->mac.type) { ++ case e1000_82574: ++ case e1000_82583: ++ reg = er32(GCR); ++ reg |= (1 << 22); ++ ew32(GCR, reg); ++ /* ++ * Workaround for hardware errata. ++ * apply workaround for hardware errata documented in errata ++ * docs Fixes issue where some error prone or unreliable PCIe ++ * completions are occurring, particularly with ASPM enabled. ++ * Without fix, issue can cause tx timeouts. ++ */ ++ reg = er32(GCR2); ++ reg |= 1; ++ ew32(GCR2, reg); ++ break; ++ default: ++ break; ++ } ++ ++ return; ++} ++ ++/** ++ * e1000_clear_vfta_82571 - Clear VLAN filter table ++ * @hw: pointer to the HW structure ++ * ++ * Clears the register array which contains the VLAN filter table by ++ * setting all the values to 0. ++ **/ ++static void e1000_clear_vfta_82571(struct e1000_hw *hw) ++{ ++ u32 offset; ++ u32 vfta_value = 0; ++ u32 vfta_offset = 0; ++ u32 vfta_bit_in_reg = 0; ++ ++ switch (hw->mac.type) { ++ case e1000_82574: ++ case e1000_82583: ++ case e1000_82573: ++ if (hw->mng_cookie.vlan_id != 0) { ++ /* ++ *The VFTA is a 4096b bit-field, each identifying ++ *a single VLAN ID. The following operations ++ *determine which 32b entry (i.e. offset) into the ++ *array we want to set the VLAN ID (i.e. bit) of ++ *the manageability unit. ++ */ ++ vfta_offset = (hw->mng_cookie.vlan_id >> ++ E1000_VFTA_ENTRY_SHIFT) & E1000_VFTA_ENTRY_MASK; ++ vfta_bit_in_reg = 1 << (hw->mng_cookie.vlan_id & ++ E1000_VFTA_ENTRY_BIT_SHIFT_MASK); ++ } ++ ++ for (offset = 0; offset < E1000_VLAN_FILTER_TBL_SIZE; offset++) { ++ /* ++ *If the offset we want to clear is the same offset of ++ *the manageability VLAN ID, then clear all bits except ++ *that of the manageability unit ++ */ ++ vfta_value = (offset == vfta_offset) ? ++ vfta_bit_in_reg : 0; ++ E1000_WRITE_REG_ARRAY(hw, E1000_VFTA, offset, ++ vfta_value); ++ e1e_flush(); ++ } ++ break; ++ default: ++ break; ++ } ++} ++ ++/** ++ * e1000_check_mng_mode_82574 - Check manageability is enabled ++ * @hw: pointer to the HW structure ++ * ++ * Reads the NVM Initialization Control Word 2 and returns true ++ * (>0) if any manageability is enabled, else false (0). ++ **/ ++static bool e1000_check_mng_mode_82574(struct e1000_hw *hw) ++{ ++ u16 data; ++ ++ e1000_read_nvm(hw, NVM_INIT_CONTROL2_REG, 1, &data); ++ return (data & E1000_NVM_INIT_CTRL2_MNGM) != 0; ++} ++ ++/** ++ * e1000_led_on_82574 - Turn LED on ++ * @hw: pointer to the HW structure ++ * ++ * Turn LED on. ++ **/ ++static s32 e1000_led_on_82574(struct e1000_hw *hw) ++{ ++ u32 ctrl; ++ u32 i; ++ ++ ctrl = hw->mac.ledctl_mode2; ++ if (!(E1000_STATUS_LU & er32(STATUS))) { ++ /* ++ * If no link, then turn LED on by setting the invert bit ++ * for each LED that's "on" (0x0E) in ledctl_mode2. ++ */ ++ for (i = 0; i < 4; i++) ++ if (((hw->mac.ledctl_mode2 >> (i * 8)) & 0xFF) == ++ E1000_LEDCTL_MODE_LED_ON) ++ ctrl |= (E1000_LEDCTL_LED0_IVRT << (i * 8)); ++ } ++ ew32(LEDCTL, ctrl); ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_update_mc_addr_list_82571 - Update Multicast addresses ++ * @hw: pointer to the HW structure ++ * @mc_addr_list: array of multicast addresses to program ++ * @mc_addr_count: number of multicast addresses to program ++ * @rar_used_count: the first RAR register free to program ++ * @rar_count: total number of supported Receive Address Registers ++ * ++ * Updates the Receive Address Registers and Multicast Table Array. ++ * The caller must have a packed mc_addr_list of multicast addresses. ++ * The parameter rar_count will usually be hw->mac.rar_entry_count ++ * unless there are workarounds that change this. ++ **/ ++static void e1000_update_mc_addr_list_82571(struct e1000_hw *hw, ++ u8 *mc_addr_list, u32 mc_addr_count, ++ u32 rar_used_count, u32 rar_count) ++{ ++ if (e1000e_get_laa_state_82571(hw)) ++ rar_count--; ++ ++ e1000e_update_mc_addr_list_generic(hw, mc_addr_list, mc_addr_count, ++ rar_used_count, rar_count); ++} ++ ++/** ++ * e1000_setup_link_82571 - Setup flow control and link settings ++ * @hw: pointer to the HW structure ++ * ++ * Determines which flow control settings to use, then configures flow ++ * control. Calls the appropriate media-specific link configuration ++ * function. Assuming the adapter has a valid link partner, a valid link ++ * should be established. Assumes the hardware has previously been reset ++ * and the transmitter and receiver are not enabled. ++ **/ ++static s32 e1000_setup_link_82571(struct e1000_hw *hw) ++{ ++ /* ++ * 82573 does not have a word in the NVM to determine ++ * the default flow control setting, so we explicitly ++ * set it to full. ++ */ ++ switch (hw->mac.type) { ++ case e1000_82574: ++ case e1000_82583: ++ case e1000_82573: ++ if (hw->fc.requested_mode == e1000_fc_default) ++ hw->fc.requested_mode = e1000_fc_full; ++ break; ++ default: ++ break; ++ } ++ return e1000e_setup_link(hw); ++} ++ ++/** ++ * e1000_setup_copper_link_82571 - Configure copper link settings ++ * @hw: pointer to the HW structure ++ * ++ * Configures the link for auto-neg or forced speed and duplex. Then we check ++ * for link, once link is established calls to configure collision distance ++ * and flow control are called. ++ **/ ++static s32 e1000_setup_copper_link_82571(struct e1000_hw *hw) ++{ ++ u32 ctrl, led_ctrl; ++ s32 ret_val; ++ ++ ctrl = er32(CTRL); ++ ctrl |= E1000_CTRL_SLU; ++ ctrl &= ~(E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX); ++ ew32(CTRL, ctrl); ++ ++ switch (hw->phy.type) { ++ case e1000_phy_m88: ++ case e1000_phy_bm: ++ ret_val = e1000e_copper_link_setup_m88(hw); ++ break; ++ case e1000_phy_igp_2: ++ ret_val = e1000e_copper_link_setup_igp(hw); ++ /* Setup activity LED */ ++ led_ctrl = er32(LEDCTL); ++ led_ctrl &= IGP_ACTIVITY_LED_MASK; ++ led_ctrl |= (IGP_ACTIVITY_LED_ENABLE | IGP_LED3_MODE); ++ ew32(LEDCTL, led_ctrl); ++ break; ++ default: ++ ret_val = -E1000_ERR_PHY; ++ break; ++ } ++ ++ if (ret_val) ++ goto out; ++ ++ ret_val = e1000e_setup_copper_link(hw); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_setup_fiber_serdes_link_82571 - Setup link for fiber/serdes ++ * @hw: pointer to the HW structure ++ * ++ * Configures collision distance and flow control for fiber and serdes links. ++ * Upon successful setup, poll for link. ++ **/ ++static s32 e1000_setup_fiber_serdes_link_82571(struct e1000_hw *hw) ++{ ++ switch (hw->mac.type) { ++ case e1000_82571: ++ case e1000_82572: ++ /* ++ * If SerDes loopback mode is entered, there is no form ++ * of reset to take the adapter out of that mode. So we ++ * have to explicitly take the adapter out of loopback ++ * mode. This prevents drivers from twiddling their thumbs ++ * if another tool failed to take it out of loopback mode. ++ */ ++ ew32(SCTL, E1000_SCTL_DISABLE_SERDES_LOOPBACK); ++ break; ++ default: ++ break; ++ } ++ ++ return e1000e_setup_fiber_serdes_link(hw); ++} ++ ++/** ++ * e1000_check_for_serdes_link_82571 - Check for link (Serdes) ++ * @hw: pointer to the HW structure ++ * ++ * Checks for link up on the hardware. If link is not up and we have ++ * a signal, then we need to force link up. ++ **/ ++s32 e1000_check_for_serdes_link_82571(struct e1000_hw *hw) ++{ ++ struct e1000_mac_info *mac = &hw->mac; ++ u32 rxcw; ++ u32 ctrl; ++ u32 status; ++ s32 ret_val = E1000_SUCCESS; ++ ++ ctrl = er32(CTRL); ++ status = er32(STATUS); ++ rxcw = er32(RXCW); ++ ++ if ((rxcw & E1000_RXCW_SYNCH) && !(rxcw & E1000_RXCW_IV)) { ++ ++ /* Receiver is synchronized with no invalid bits. */ ++ switch (mac->serdes_link_state) { ++ case e1000_serdes_link_autoneg_complete: ++ if (!(status & E1000_STATUS_LU)) { ++ /* ++ * We have lost link, retry autoneg before ++ * reporting link failure ++ */ ++ mac->serdes_link_state = ++ e1000_serdes_link_autoneg_progress; ++ e_dbg("AN_UP -> AN_PROG\n"); ++ } ++ break; ++ ++ case e1000_serdes_link_forced_up: ++ /* ++ * If we are receiving /C/ ordered sets, re-enable ++ * auto-negotiation in the TXCW register and disable ++ * forced link in the Device Control register in an ++ * attempt to auto-negotiate with our link partner. ++ */ ++ if (rxcw & E1000_RXCW_C) { ++ /* Enable autoneg, and unforce link up */ ++ ew32(TXCW, mac->txcw); ++ ew32(CTRL, ++ (ctrl & ~E1000_CTRL_SLU)); ++ mac->serdes_link_state = ++ e1000_serdes_link_autoneg_progress; ++ e_dbg("FORCED_UP -> AN_PROG\n"); ++ } ++ break; ++ ++ case e1000_serdes_link_autoneg_progress: ++ /* ++ * If the LU bit is set in the STATUS register, ++ * autoneg has completed sucessfully. If not, ++ * try foring the link because the far end may be ++ * available but not capable of autonegotiation. ++ */ ++ if (status & E1000_STATUS_LU) { ++ mac->serdes_link_state = ++ e1000_serdes_link_autoneg_complete; ++ e_dbg("AN_PROG -> AN_UP\n"); ++ } else { ++ /* ++ * Disable autoneg, force link up and ++ * full duplex, and change state to forced ++ */ ++ ew32(TXCW, ++ (mac->txcw & ~E1000_TXCW_ANE)); ++ ctrl |= (E1000_CTRL_SLU | E1000_CTRL_FD); ++ ew32(CTRL, ctrl); ++ ++ /* Configure Flow Control after link up. */ ++ ret_val = ++ e1000e_config_fc_after_link_up(hw); ++ if (ret_val) { ++ e_dbg("Error config flow control\n"); ++ break; ++ } ++ mac->serdes_link_state = ++ e1000_serdes_link_forced_up; ++ e_dbg("AN_PROG -> FORCED_UP\n"); ++ } ++ mac->serdes_has_link = true; ++ break; ++ ++ case e1000_serdes_link_down: ++ default: ++ /* The link was down but the receiver has now gained ++ * valid sync, so lets see if we can bring the link ++ * up. */ ++ ew32(TXCW, mac->txcw); ++ ew32(CTRL, ++ (ctrl & ~E1000_CTRL_SLU)); ++ mac->serdes_link_state = ++ e1000_serdes_link_autoneg_progress; ++ e_dbg("DOWN -> AN_PROG\n"); ++ break; ++ } ++ } else { ++ if (!(rxcw & E1000_RXCW_SYNCH)) { ++ mac->serdes_has_link = false; ++ mac->serdes_link_state = e1000_serdes_link_down; ++ e_dbg("ANYSTATE -> DOWN\n"); ++ } else { ++ /* ++ * We have sync, and can tolerate one ++ * invalid (IV) codeword before declaring ++ * link down, so reread to look again ++ */ ++ udelay(10); ++ rxcw = er32(RXCW); ++ if (rxcw & E1000_RXCW_IV) { ++ mac->serdes_link_state = e1000_serdes_link_down; ++ mac->serdes_has_link = false; ++ e_dbg("ANYSTATE -> DOWN\n"); ++ } ++ } ++ } ++ ++ return ret_val; ++} ++ ++/** ++ * e1000_valid_led_default_82571 - Verify a valid default LED config ++ * @hw: pointer to the HW structure ++ * @data: pointer to the NVM (EEPROM) ++ * ++ * Read the EEPROM for the current default LED configuration. If the ++ * LED configuration is not valid, set to a valid LED configuration. ++ **/ ++static s32 e1000_valid_led_default_82571(struct e1000_hw *hw, u16 *data) ++{ ++ s32 ret_val; ++ ++ ret_val = e1000_read_nvm(hw, NVM_ID_LED_SETTINGS, 1, data); ++ if (ret_val) { ++ e_dbg("NVM Read Error\n"); ++ goto out; ++ } ++ ++ switch (hw->mac.type) { ++ case e1000_82574: ++ case e1000_82583: ++ case e1000_82573: ++ if(*data == ID_LED_RESERVED_F746) ++ *data = ID_LED_DEFAULT_82573; ++ break; ++ default: ++ if (*data == ID_LED_RESERVED_0000 || ++ *data == ID_LED_RESERVED_FFFF) ++ *data = ID_LED_DEFAULT; ++ break; ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000e_get_laa_state_82571 - Get locally administered address state ++ * @hw: pointer to the HW structure ++ * ++ * Retrieve and return the current locally administered address state. ++ **/ ++bool e1000e_get_laa_state_82571(struct e1000_hw *hw) ++{ ++ if (hw->mac.type != e1000_82571) ++ return false; ++ ++ return hw->dev_spec._82571.laa_is_present; ++} ++ ++/** ++ * e1000e_set_laa_state_82571 - Set locally administered address state ++ * @hw: pointer to the HW structure ++ * @state: enable/disable locally administered address ++ * ++ * Enable/Disable the current locally administered address state. ++ **/ ++void e1000e_set_laa_state_82571(struct e1000_hw *hw, bool state) ++{ ++ if (hw->mac.type != e1000_82571) ++ return; ++ ++ hw->dev_spec._82571.laa_is_present = state; ++ ++ /* If workaround is activated... */ ++ if (state) ++ /* ++ * Hold a copy of the LAA in RAR[14] This is done so that ++ * between the time RAR[0] gets clobbered and the time it ++ * gets fixed, the actual LAA is in one of the RARs and no ++ * incoming packets directed to this port are dropped. ++ * Eventually the LAA will be in RAR[0] and RAR[14]. ++ */ ++ e1000e_rar_set(hw, hw->mac.addr, ++ hw->mac.rar_entry_count - 1); ++ return; ++} ++ ++/** ++ * e1000_fix_nvm_checksum_82571 - Fix EEPROM checksum ++ * @hw: pointer to the HW structure ++ * ++ * Verifies that the EEPROM has completed the update. After updating the ++ * EEPROM, we need to check bit 15 in work 0x23 for the checksum fix. If ++ * the checksum fix is not implemented, we need to set the bit and update ++ * the checksum. Otherwise, if bit 15 is set and the checksum is incorrect, ++ * we need to return bad checksum. ++ **/ ++static s32 e1000_fix_nvm_checksum_82571(struct e1000_hw *hw) ++{ ++ struct e1000_nvm_info *nvm = &hw->nvm; ++ s32 ret_val = E1000_SUCCESS; ++ u16 data; ++ ++ if (nvm->type != e1000_nvm_flash_hw) ++ goto out; ++ ++ /* ++ * Check bit 4 of word 10h. If it is 0, firmware is done updating ++ * 10h-12h. Checksum may need to be fixed. ++ */ ++ ret_val = e1000_read_nvm(hw, 0x10, 1, &data); ++ if (ret_val) ++ goto out; ++ ++ if (!(data & 0x10)) { ++ /* ++ * Read 0x23 and check bit 15. This bit is a 1 ++ * when the checksum has already been fixed. If ++ * the checksum is still wrong and this bit is a ++ * 1, we need to return bad checksum. Otherwise, ++ * we need to set this bit to a 1 and update the ++ * checksum. ++ */ ++ ret_val = e1000_read_nvm(hw, 0x23, 1, &data); ++ if (ret_val) ++ goto out; ++ ++ if (!(data & 0x8000)) { ++ data |= 0x8000; ++ ret_val = e1000_write_nvm(hw, 0x23, 1, &data); ++ if (ret_val) ++ goto out; ++ ret_val = e1000e_update_nvm_checksum(hw); ++ } ++ } ++ ++out: ++ return ret_val; ++} ++ ++ ++/** ++ * e1000_read_mac_addr_82571 - Read device MAC address ++ * @hw: pointer to the HW structure ++ **/ ++static s32 e1000_read_mac_addr_82571(struct e1000_hw *hw) ++{ ++ s32 ret_val = E1000_SUCCESS; ++ ++ if (e1000_check_alt_mac_addr_generic(hw)) ++ ret_val = e1000e_read_mac_addr_generic(hw); ++ ++ return ret_val; ++} ++ ++/** ++ * e1000_power_down_phy_copper_82571 - Remove link during PHY power down ++ * @hw: pointer to the HW structure ++ * ++ * In the case of a PHY power down to save power, or to turn off link during a ++ * driver unload, or wake on lan is not enabled, remove the link. ++ **/ ++static void e1000_power_down_phy_copper_82571(struct e1000_hw *hw) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ struct e1000_mac_info *mac = &hw->mac; ++ ++ if (!(phy->ops.check_reset_block)) ++ return; ++ ++ /* If the management interface is not enabled, then power down */ ++ if (!(mac->ops.check_mng_mode(hw) || e1000_check_reset_block(hw))) ++ e1000_power_down_phy_copper(hw); ++ ++ return; ++} ++ ++/** ++ * e1000_clear_hw_cntrs_82571 - Clear device specific hardware counters ++ * @hw: pointer to the HW structure ++ * ++ * Clears the hardware counters by reading the counter registers. ++ **/ ++static void e1000_clear_hw_cntrs_82571(struct e1000_hw *hw) ++{ ++ e1000e_clear_hw_cntrs_base(hw); ++ ++ er32(PRC64); ++ er32(PRC127); ++ er32(PRC255); ++ er32(PRC511); ++ er32(PRC1023); ++ er32(PRC1522); ++ er32(PTC64); ++ er32(PTC127); ++ er32(PTC255); ++ er32(PTC511); ++ er32(PTC1023); ++ er32(PTC1522); ++ ++ er32(ALGNERRC); ++ er32(RXERRC); ++ er32(TNCRS); ++ er32(CEXTERR); ++ er32(TSCTC); ++ er32(TSCTFC); ++ ++ er32(MGTPRC); ++ er32(MGTPDC); ++ er32(MGTPTC); ++ ++ er32(IAC); ++ er32(ICRXOC); ++ ++ er32(ICRXPTC); ++ er32(ICRXATC); ++ er32(ICTXPTC); ++ er32(ICTXATC); ++ er32(ICTXQEC); ++ er32(ICTXQMTC); ++ er32(ICRXDMTC); ++} +diff -r bd70f2f305c6 drivers/net/e1000e/e1000_82571.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/e1000e/e1000_82571.h Mon Jun 15 11:45:35 2009 +0100 +@@ -0,0 +1,53 @@ ++/******************************************************************************* ++ ++ Intel PRO/1000 Linux driver ++ Copyright(c) 1999 - 2009 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ Linux NICS ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++#ifndef _E1000_82571_H_ ++#define _E1000_82571_H_ ++ ++#define ID_LED_RESERVED_F746 0xF746 ++#define ID_LED_DEFAULT_82573 ((ID_LED_DEF1_DEF2 << 12) | \ ++ (ID_LED_OFF1_ON2 << 8) | \ ++ (ID_LED_DEF1_DEF2 << 4) | \ ++ (ID_LED_DEF1_DEF2)) ++ ++#define E1000_GCR_L1_ACT_WITHOUT_L0S_RX 0x08000000 ++ ++/* Intr Throttling - RW */ ++#define E1000_EITR_82574(_n) (0x000E8 + (0x4 * (_n))) ++ ++#define E1000_EIAC_82574 0x000DC /* Ext. Interrupt Auto Clear - RW */ ++#define E1000_EIAC_MASK_82574 0x01F00000 ++ ++#define E1000_NVM_INIT_CTRL2_MNGM 0x6000 /* Manageability Operation Mode mask */ ++ ++#define E1000_RXCFGL 0x0B634 /* TimeSync Rx EtherType & Msg Type Reg - RW */ ++ ++bool e1000e_get_laa_state_82571(struct e1000_hw *hw); ++void e1000e_set_laa_state_82571(struct e1000_hw *hw, bool state); ++ ++#endif +diff -r bd70f2f305c6 drivers/net/e1000e/e1000_defines.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/e1000e/e1000_defines.h Mon Jun 15 11:45:35 2009 +0100 +@@ -0,0 +1,1425 @@ ++/******************************************************************************* ++ ++ Intel PRO/1000 Linux driver ++ Copyright(c) 1999 - 2009 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ Linux NICS ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++#ifndef _E1000_DEFINES_H_ ++#define _E1000_DEFINES_H_ ++ ++/* Number of Transmit and Receive Descriptors must be a multiple of 8 */ ++#define REQ_TX_DESCRIPTOR_MULTIPLE 8 ++#define REQ_RX_DESCRIPTOR_MULTIPLE 8 ++ ++/* Definitions for power management and wakeup registers */ ++/* Wake Up Control */ ++#define E1000_WUC_APME 0x00000001 /* APM Enable */ ++#define E1000_WUC_PME_EN 0x00000002 /* PME Enable */ ++#define E1000_WUC_PME_STATUS 0x00000004 /* PME Status */ ++#define E1000_WUC_APMPME 0x00000008 /* Assert PME on APM Wakeup */ ++#define E1000_WUC_LSCWE 0x00000010 /* Link Status wake up enable */ ++#define E1000_WUC_LSCWO 0x00000020 /* Link Status wake up override */ ++#define E1000_WUC_SPM 0x80000000 /* Enable SPM */ ++#define E1000_WUC_PHY_WAKE 0x00000100 /* if PHY supports wakeup */ ++ ++/* Wake Up Filter Control */ ++#define E1000_WUFC_LNKC 0x00000001 /* Link Status Change Wakeup Enable */ ++#define E1000_WUFC_MAG 0x00000002 /* Magic Packet Wakeup Enable */ ++#define E1000_WUFC_EX 0x00000004 /* Directed Exact Wakeup Enable */ ++#define E1000_WUFC_MC 0x00000008 /* Directed Multicast Wakeup Enable */ ++#define E1000_WUFC_BC 0x00000010 /* Broadcast Wakeup Enable */ ++#define E1000_WUFC_ARP 0x00000020 /* ARP Request Packet Wakeup Enable */ ++#define E1000_WUFC_IPV4 0x00000040 /* Directed IPv4 Packet Wakeup Enable */ ++#define E1000_WUFC_IPV6 0x00000080 /* Directed IPv6 Packet Wakeup Enable */ ++#define E1000_WUFC_IGNORE_TCO_PHY 0x00000800 /* Ignore WakeOn TCO packets */ ++#define E1000_WUFC_FLX0_PHY 0x00001000 /* Flexible Filter 0 Enable */ ++#define E1000_WUFC_FLX1_PHY 0x00002000 /* Flexible Filter 1 Enable */ ++#define E1000_WUFC_FLX2_PHY 0x00004000 /* Flexible Filter 2 Enable */ ++#define E1000_WUFC_FLX3_PHY 0x00008000 /* Flexible Filter 3 Enable */ ++#define E1000_WUFC_IGNORE_TCO 0x00008000 /* Ignore WakeOn TCO packets */ ++#define E1000_WUFC_FLX0 0x00010000 /* Flexible Filter 0 Enable */ ++#define E1000_WUFC_FLX1 0x00020000 /* Flexible Filter 1 Enable */ ++#define E1000_WUFC_FLX2 0x00040000 /* Flexible Filter 2 Enable */ ++#define E1000_WUFC_FLX3 0x00080000 /* Flexible Filter 3 Enable */ ++#define E1000_WUFC_ALL_FILTERS_PHY_4 0x0000F0FF /*Mask for all wakeup filters*/ ++#define E1000_WUFC_FLX_OFFSET_PHY 12 /* Offset to the Flexible Filters bits */ ++#define E1000_WUFC_FLX_FILTERS_PHY_4 0x0000F000 /*Mask for 4 flexible filters*/ ++#define E1000_WUFC_ALL_FILTERS 0x000F00FF /* Mask for all wakeup filters */ ++#define E1000_WUFC_FLX_OFFSET 16 /* Offset to the Flexible Filters bits */ ++#define E1000_WUFC_FLX_FILTERS 0x000F0000 /*Mask for the 4 flexible filters */ ++ ++/* Wake Up Status */ ++#define E1000_WUS_LNKC E1000_WUFC_LNKC ++#define E1000_WUS_MAG E1000_WUFC_MAG ++#define E1000_WUS_EX E1000_WUFC_EX ++#define E1000_WUS_MC E1000_WUFC_MC ++#define E1000_WUS_BC E1000_WUFC_BC ++#define E1000_WUS_ARP E1000_WUFC_ARP ++#define E1000_WUS_IPV4 E1000_WUFC_IPV4 ++#define E1000_WUS_IPV6 E1000_WUFC_IPV6 ++#define E1000_WUS_FLX0_PHY E1000_WUFC_FLX0_PHY ++#define E1000_WUS_FLX1_PHY E1000_WUFC_FLX1_PHY ++#define E1000_WUS_FLX2_PHY E1000_WUFC_FLX2_PHY ++#define E1000_WUS_FLX3_PHY E1000_WUFC_FLX3_PHY ++#define E1000_WUS_FLX_FILTERS_PHY_4 E1000_WUFC_FLX_FILTERS_PHY_4 ++#define E1000_WUS_FLX0 E1000_WUFC_FLX0 ++#define E1000_WUS_FLX1 E1000_WUFC_FLX1 ++#define E1000_WUS_FLX2 E1000_WUFC_FLX2 ++#define E1000_WUS_FLX3 E1000_WUFC_FLX3 ++#define E1000_WUS_FLX_FILTERS E1000_WUFC_FLX_FILTERS ++ ++/* Wake Up Packet Length */ ++#define E1000_WUPL_LENGTH_MASK 0x0FFF /* Only the lower 12 bits are valid */ ++ ++/* Four Flexible Filters are supported */ ++#define E1000_FLEXIBLE_FILTER_COUNT_MAX 4 ++ ++/* Each Flexible Filter is at most 128 (0x80) bytes in length */ ++#define E1000_FLEXIBLE_FILTER_SIZE_MAX 128 ++ ++#define E1000_FFLT_SIZE E1000_FLEXIBLE_FILTER_COUNT_MAX ++#define E1000_FFMT_SIZE E1000_FLEXIBLE_FILTER_SIZE_MAX ++#define E1000_FFVT_SIZE E1000_FLEXIBLE_FILTER_SIZE_MAX ++ ++/* Extended Device Control */ ++#define E1000_CTRL_EXT_GPI0_EN 0x00000001 /* Maps SDP4 to GPI0 */ ++#define E1000_CTRL_EXT_GPI1_EN 0x00000002 /* Maps SDP5 to GPI1 */ ++#define E1000_CTRL_EXT_PHYINT_EN E1000_CTRL_EXT_GPI1_EN ++#define E1000_CTRL_EXT_GPI2_EN 0x00000004 /* Maps SDP6 to GPI2 */ ++#define E1000_CTRL_EXT_GPI3_EN 0x00000008 /* Maps SDP7 to GPI3 */ ++/* Reserved (bits 4,5) in >= 82575 */ ++#define E1000_CTRL_EXT_SDP4_DATA 0x00000010 /* Value of SW Definable Pin 4 */ ++#define E1000_CTRL_EXT_SDP5_DATA 0x00000020 /* Value of SW Definable Pin 5 */ ++#define E1000_CTRL_EXT_PHY_INT E1000_CTRL_EXT_SDP5_DATA ++#define E1000_CTRL_EXT_SDP6_DATA 0x00000040 /* Value of SW Definable Pin 6 */ ++#define E1000_CTRL_EXT_SDP7_DATA 0x00000080 /* Value of SW Definable Pin 7 */ ++/* SDP 4/5 (bits 8,9) are reserved in >= 82575 */ ++#define E1000_CTRL_EXT_SDP4_DIR 0x00000100 /* Direction of SDP4 0=in 1=out */ ++#define E1000_CTRL_EXT_SDP5_DIR 0x00000200 /* Direction of SDP5 0=in 1=out */ ++#define E1000_CTRL_EXT_SDP6_DIR 0x00000400 /* Direction of SDP6 0=in 1=out */ ++#define E1000_CTRL_EXT_SDP7_DIR 0x00000800 /* Direction of SDP7 0=in 1=out */ ++#define E1000_CTRL_EXT_ASDCHK 0x00001000 /* Initiate an ASD sequence */ ++#define E1000_CTRL_EXT_EE_RST 0x00002000 /* Reinitialize from EEPROM */ ++#define E1000_CTRL_EXT_IPS 0x00004000 /* Invert Power State */ ++#define E1000_CTRL_EXT_SPD_BYPS 0x00008000 /* Speed Select Bypass */ ++#define E1000_CTRL_EXT_RO_DIS 0x00020000 /* Relaxed Ordering disable */ ++#define E1000_CTRL_EXT_DMA_DYN_CLK_EN 0x00080000 /* DMA Dynamic Clock Gating */ ++#define E1000_CTRL_EXT_LINK_MODE_MASK 0x00C00000 ++#define E1000_CTRL_EXT_LINK_MODE_GMII 0x00000000 ++#define E1000_CTRL_EXT_LINK_MODE_TBI 0x00C00000 ++#define E1000_CTRL_EXT_LINK_MODE_KMRN 0x00000000 ++#define E1000_CTRL_EXT_LINK_MODE_PCIE_SERDES 0x00C00000 ++#define E1000_CTRL_EXT_LINK_MODE_PCIX_SERDES 0x00800000 ++#define E1000_CTRL_EXT_LINK_MODE_SGMII 0x00800000 ++#define E1000_CTRL_EXT_EIAME 0x01000000 ++#define E1000_CTRL_EXT_IRCA 0x00000001 ++#define E1000_CTRL_EXT_WR_WMARK_MASK 0x03000000 ++#define E1000_CTRL_EXT_WR_WMARK_256 0x00000000 ++#define E1000_CTRL_EXT_WR_WMARK_320 0x01000000 ++#define E1000_CTRL_EXT_WR_WMARK_384 0x02000000 ++#define E1000_CTRL_EXT_WR_WMARK_448 0x03000000 ++#define E1000_CTRL_EXT_CANC 0x04000000 /* Int delay cancellation */ ++#define E1000_CTRL_EXT_DRV_LOAD 0x10000000 /* Driver loaded bit for FW */ ++/* IAME enable bit (27) was removed in >= 82575 */ ++#define E1000_CTRL_EXT_IAME 0x08000000 /* Int acknowledge Auto-mask */ ++#define E1000_CTRL_EXT_INT_TIMER_CLR 0x20000000 /* Clear Interrupt timers ++ * after IMS clear */ ++#define E1000_CRTL_EXT_PB_PAREN 0x01000000 /* packet buffer parity error ++ * detection enabled */ ++#define E1000_CTRL_EXT_DF_PAREN 0x02000000 /* descriptor FIFO parity ++ * error detection enable */ ++#define E1000_CTRL_EXT_GHOST_PAREN 0x40000000 ++#define E1000_CTRL_EXT_PBA_CLR 0x80000000 /* PBA Clear */ ++#define E1000_CTRL_EXT_LSECCK 0x00001000 ++#define E1000_I2CCMD_REG_ADDR_SHIFT 16 ++#define E1000_I2CCMD_REG_ADDR 0x00FF0000 ++#define E1000_I2CCMD_PHY_ADDR_SHIFT 24 ++#define E1000_I2CCMD_PHY_ADDR 0x07000000 ++#define E1000_I2CCMD_OPCODE_READ 0x08000000 ++#define E1000_I2CCMD_OPCODE_WRITE 0x00000000 ++#define E1000_I2CCMD_RESET 0x10000000 ++#define E1000_I2CCMD_READY 0x20000000 ++#define E1000_I2CCMD_INTERRUPT_ENA 0x40000000 ++#define E1000_I2CCMD_ERROR 0x80000000 ++#define E1000_MAX_SGMII_PHY_REG_ADDR 255 ++#define E1000_I2CCMD_PHY_TIMEOUT 200 ++ ++/* Receive Descriptor bit definitions */ ++#define E1000_RXD_STAT_DD 0x01 /* Descriptor Done */ ++#define E1000_RXD_STAT_EOP 0x02 /* End of Packet */ ++#define E1000_RXD_STAT_IXSM 0x04 /* Ignore checksum */ ++#define E1000_RXD_STAT_VP 0x08 /* IEEE VLAN Packet */ ++#define E1000_RXD_STAT_UDPCS 0x10 /* UDP xsum calculated */ ++#define E1000_RXD_STAT_TCPCS 0x20 /* TCP xsum calculated */ ++#define E1000_RXD_STAT_IPCS 0x40 /* IP xsum calculated */ ++#define E1000_RXD_STAT_PIF 0x80 /* passed in-exact filter */ ++#define E1000_RXD_STAT_CRCV 0x100 /* Speculative CRC Valid */ ++#define E1000_RXD_STAT_IPIDV 0x200 /* IP identification valid */ ++#define E1000_RXD_STAT_UDPV 0x400 /* Valid UDP checksum */ ++#define E1000_RXD_STAT_DYNINT 0x800 /* Pkt caused INT via DYNINT */ ++#define E1000_RXD_STAT_ACK 0x8000 /* ACK Packet indication */ ++#define E1000_RXD_ERR_CE 0x01 /* CRC Error */ ++#define E1000_RXD_ERR_SE 0x02 /* Symbol Error */ ++#define E1000_RXD_ERR_SEQ 0x04 /* Sequence Error */ ++#define E1000_RXD_ERR_CXE 0x10 /* Carrier Extension Error */ ++#define E1000_RXD_ERR_TCPE 0x20 /* TCP/UDP Checksum Error */ ++#define E1000_RXD_ERR_IPE 0x40 /* IP Checksum Error */ ++#define E1000_RXD_ERR_RXE 0x80 /* Rx Data Error */ ++#define E1000_RXD_SPC_VLAN_MASK 0x0FFF /* VLAN ID is in lower 12 bits */ ++#define E1000_RXD_SPC_PRI_MASK 0xE000 /* Priority is in upper 3 bits */ ++#define E1000_RXD_SPC_PRI_SHIFT 13 ++#define E1000_RXD_SPC_CFI_MASK 0x1000 /* CFI is bit 12 */ ++#define E1000_RXD_SPC_CFI_SHIFT 12 ++ ++#define E1000_RXDEXT_STATERR_CE 0x01000000 ++#define E1000_RXDEXT_STATERR_SE 0x02000000 ++#define E1000_RXDEXT_STATERR_SEQ 0x04000000 ++#define E1000_RXDEXT_STATERR_CXE 0x10000000 ++#define E1000_RXDEXT_STATERR_TCPE 0x20000000 ++#define E1000_RXDEXT_STATERR_IPE 0x40000000 ++#define E1000_RXDEXT_STATERR_RXE 0x80000000 ++ ++#define E1000_RXDEXT_LSECH 0x01000000 ++#define E1000_RXDEXT_LSECE_MASK 0x60000000 ++#define E1000_RXDEXT_LSECE_NO_ERROR 0x00000000 ++#define E1000_RXDEXT_LSECE_NO_SA_MATCH 0x20000000 ++#define E1000_RXDEXT_LSECE_REPLAY_DETECT 0x40000000 ++#define E1000_RXDEXT_LSECE_BAD_SIG 0x60000000 ++ ++/* mask to determine if packets should be dropped due to frame errors */ ++#define E1000_RXD_ERR_FRAME_ERR_MASK ( \ ++ E1000_RXD_ERR_CE | \ ++ E1000_RXD_ERR_SE | \ ++ E1000_RXD_ERR_SEQ | \ ++ E1000_RXD_ERR_CXE | \ ++ E1000_RXD_ERR_RXE) ++ ++/* Same mask, but for extended and packet split descriptors */ ++#define E1000_RXDEXT_ERR_FRAME_ERR_MASK ( \ ++ E1000_RXDEXT_STATERR_CE | \ ++ E1000_RXDEXT_STATERR_SE | \ ++ E1000_RXDEXT_STATERR_SEQ | \ ++ E1000_RXDEXT_STATERR_CXE | \ ++ E1000_RXDEXT_STATERR_RXE) ++ ++#define E1000_MRQC_ENABLE_MASK 0x00000007 ++#define E1000_MRQC_ENABLE_RSS_2Q 0x00000001 ++#define E1000_MRQC_ENABLE_RSS_INT 0x00000004 ++#define E1000_MRQC_RSS_FIELD_MASK 0xFFFF0000 ++#define E1000_MRQC_RSS_FIELD_IPV4_TCP 0x00010000 ++#define E1000_MRQC_RSS_FIELD_IPV4 0x00020000 ++#define E1000_MRQC_RSS_FIELD_IPV6_TCP_EX 0x00040000 ++#define E1000_MRQC_RSS_FIELD_IPV6_EX 0x00080000 ++#define E1000_MRQC_RSS_FIELD_IPV6 0x00100000 ++#define E1000_MRQC_RSS_FIELD_IPV6_TCP 0x00200000 ++ ++#define E1000_RXDPS_HDRSTAT_HDRSP 0x00008000 ++#define E1000_RXDPS_HDRSTAT_HDRLEN_MASK 0x000003FF ++ ++/* Management Control */ ++#define E1000_MANC_SMBUS_EN 0x00000001 /* SMBus Enabled - RO */ ++#define E1000_MANC_ASF_EN 0x00000002 /* ASF Enabled - RO */ ++#define E1000_MANC_R_ON_FORCE 0x00000004 /* Reset on Force TCO - RO */ ++#define E1000_MANC_RMCP_EN 0x00000100 /* Enable RCMP 026Fh Filtering */ ++#define E1000_MANC_0298_EN 0x00000200 /* Enable RCMP 0298h Filtering */ ++#define E1000_MANC_IPV4_EN 0x00000400 /* Enable IPv4 */ ++#define E1000_MANC_IPV6_EN 0x00000800 /* Enable IPv6 */ ++#define E1000_MANC_SNAP_EN 0x00001000 /* Accept LLC/SNAP */ ++#define E1000_MANC_ARP_EN 0x00002000 /* Enable ARP Request Filtering */ ++/* Enable Neighbor Discovery Filtering */ ++#define E1000_MANC_NEIGHBOR_EN 0x00004000 ++#define E1000_MANC_ARP_RES_EN 0x00008000 /* Enable ARP response Filtering */ ++#define E1000_MANC_TCO_RESET 0x00010000 /* TCO Reset Occurred */ ++#define E1000_MANC_RCV_TCO_EN 0x00020000 /* Receive TCO Packets Enabled */ ++#define E1000_MANC_REPORT_STATUS 0x00040000 /* Status Reporting Enabled */ ++#define E1000_MANC_RCV_ALL 0x00080000 /* Receive All Enabled */ ++#define E1000_MANC_BLK_PHY_RST_ON_IDE 0x00040000 /* Block phy resets */ ++/* Enable MAC address filtering */ ++#define E1000_MANC_EN_MAC_ADDR_FILTER 0x00100000 ++/* Enable MNG packets to host memory */ ++#define E1000_MANC_EN_MNG2HOST 0x00200000 ++/* Enable IP address filtering */ ++#define E1000_MANC_EN_IP_ADDR_FILTER 0x00400000 ++#define E1000_MANC_EN_XSUM_FILTER 0x00800000 /* Enable checksum filtering */ ++#define E1000_MANC_BR_EN 0x01000000 /* Enable broadcast filtering */ ++#define E1000_MANC_SMB_REQ 0x01000000 /* SMBus Request */ ++#define E1000_MANC_SMB_GNT 0x02000000 /* SMBus Grant */ ++#define E1000_MANC_SMB_CLK_IN 0x04000000 /* SMBus Clock In */ ++#define E1000_MANC_SMB_DATA_IN 0x08000000 /* SMBus Data In */ ++#define E1000_MANC_SMB_DATA_OUT 0x10000000 /* SMBus Data Out */ ++#define E1000_MANC_SMB_CLK_OUT 0x20000000 /* SMBus Clock Out */ ++ ++#define E1000_MANC_SMB_DATA_OUT_SHIFT 28 /* SMBus Data Out Shift */ ++#define E1000_MANC_SMB_CLK_OUT_SHIFT 29 /* SMBus Clock Out Shift */ ++ ++/* Receive Control */ ++#define E1000_RCTL_RST 0x00000001 /* Software reset */ ++#define E1000_RCTL_EN 0x00000002 /* enable */ ++#define E1000_RCTL_SBP 0x00000004 /* store bad packet */ ++#define E1000_RCTL_UPE 0x00000008 /* unicast promiscuous enable */ ++#define E1000_RCTL_MPE 0x00000010 /* multicast promiscuous enab */ ++#define E1000_RCTL_LPE 0x00000020 /* long packet enable */ ++#define E1000_RCTL_LBM_NO 0x00000000 /* no loopback mode */ ++#define E1000_RCTL_LBM_MAC 0x00000040 /* MAC loopback mode */ ++#define E1000_RCTL_LBM_SLP 0x00000080 /* serial link loopback mode */ ++#define E1000_RCTL_LBM_TCVR 0x000000C0 /* tcvr loopback mode */ ++#define E1000_RCTL_DTYP_MASK 0x00000C00 /* Descriptor type mask */ ++#define E1000_RCTL_DTYP_PS 0x00000400 /* Packet Split descriptor */ ++#define E1000_RCTL_RDMTS_HALF 0x00000000 /* rx desc min threshold size */ ++#define E1000_RCTL_RDMTS_QUAT 0x00000100 /* rx desc min threshold size */ ++#define E1000_RCTL_RDMTS_EIGTH 0x00000200 /* rx desc min threshold size */ ++#define E1000_RCTL_MO_SHIFT 12 /* multicast offset shift */ ++#define E1000_RCTL_MO_0 0x00000000 /* multicast offset 11:0 */ ++#define E1000_RCTL_MO_1 0x00001000 /* multicast offset 12:1 */ ++#define E1000_RCTL_MO_2 0x00002000 /* multicast offset 13:2 */ ++#define E1000_RCTL_MO_3 0x00003000 /* multicast offset 15:4 */ ++#define E1000_RCTL_MDR 0x00004000 /* multicast desc ring 0 */ ++#define E1000_RCTL_BAM 0x00008000 /* broadcast enable */ ++/* these buffer sizes are valid if E1000_RCTL_BSEX is 0 */ ++#define E1000_RCTL_SZ_2048 0x00000000 /* rx buffer size 2048 */ ++#define E1000_RCTL_SZ_1024 0x00010000 /* rx buffer size 1024 */ ++#define E1000_RCTL_SZ_512 0x00020000 /* rx buffer size 512 */ ++#define E1000_RCTL_SZ_256 0x00030000 /* rx buffer size 256 */ ++/* these buffer sizes are valid if E1000_RCTL_BSEX is 1 */ ++#define E1000_RCTL_SZ_16384 0x00010000 /* rx buffer size 16384 */ ++#define E1000_RCTL_SZ_8192 0x00020000 /* rx buffer size 8192 */ ++#define E1000_RCTL_SZ_4096 0x00030000 /* rx buffer size 4096 */ ++#define E1000_RCTL_VFE 0x00040000 /* vlan filter enable */ ++#define E1000_RCTL_CFIEN 0x00080000 /* canonical form enable */ ++#define E1000_RCTL_CFI 0x00100000 /* canonical form indicator */ ++#define E1000_RCTL_DPF 0x00400000 /* discard pause frames */ ++#define E1000_RCTL_PMCF 0x00800000 /* pass MAC control frames */ ++#define E1000_RCTL_BSEX 0x02000000 /* Buffer size extension */ ++#define E1000_RCTL_SECRC 0x04000000 /* Strip Ethernet CRC */ ++#define E1000_RCTL_FLXBUF_MASK 0x78000000 /* Flexible buffer size */ ++#define E1000_RCTL_FLXBUF_SHIFT 27 /* Flexible buffer shift */ ++ ++/* ++ * Use byte values for the following shift parameters ++ * Usage: ++ * psrctl |= (((ROUNDUP(value0, 128) >> E1000_PSRCTL_BSIZE0_SHIFT) & ++ * E1000_PSRCTL_BSIZE0_MASK) | ++ * ((ROUNDUP(value1, 1024) >> E1000_PSRCTL_BSIZE1_SHIFT) & ++ * E1000_PSRCTL_BSIZE1_MASK) | ++ * ((ROUNDUP(value2, 1024) << E1000_PSRCTL_BSIZE2_SHIFT) & ++ * E1000_PSRCTL_BSIZE2_MASK) | ++ * ((ROUNDUP(value3, 1024) << E1000_PSRCTL_BSIZE3_SHIFT) |; ++ * E1000_PSRCTL_BSIZE3_MASK)) ++ * where value0 = [128..16256], default=256 ++ * value1 = [1024..64512], default=4096 ++ * value2 = [0..64512], default=4096 ++ * value3 = [0..64512], default=0 ++ */ ++ ++#define E1000_PSRCTL_BSIZE0_MASK 0x0000007F ++#define E1000_PSRCTL_BSIZE1_MASK 0x00003F00 ++#define E1000_PSRCTL_BSIZE2_MASK 0x003F0000 ++#define E1000_PSRCTL_BSIZE3_MASK 0x3F000000 ++ ++#define E1000_PSRCTL_BSIZE0_SHIFT 7 /* Shift _right_ 7 */ ++#define E1000_PSRCTL_BSIZE1_SHIFT 2 /* Shift _right_ 2 */ ++#define E1000_PSRCTL_BSIZE2_SHIFT 6 /* Shift _left_ 6 */ ++#define E1000_PSRCTL_BSIZE3_SHIFT 14 /* Shift _left_ 14 */ ++ ++/* SWFW_SYNC Definitions */ ++#define E1000_SWFW_EEP_SM 0x1 ++#define E1000_SWFW_PHY0_SM 0x2 ++#define E1000_SWFW_PHY1_SM 0x4 ++#define E1000_SWFW_CSR_SM 0x8 ++ ++/* FACTPS Definitions */ ++#define E1000_FACTPS_LFS 0x40000000 /* LAN Function Select */ ++/* Device Control */ ++#define E1000_CTRL_FD 0x00000001 /* Full duplex.0=half; 1=full */ ++#define E1000_CTRL_BEM 0x00000002 /* Endian Mode.0=little,1=big */ ++#define E1000_CTRL_PRIOR 0x00000004 /* Priority on PCI. 0=rx,1=fair */ ++#define E1000_CTRL_GIO_MASTER_DISABLE 0x00000004 /*Blocks new Master requests */ ++#define E1000_CTRL_LRST 0x00000008 /* Link reset. 0=normal,1=reset */ ++#define E1000_CTRL_TME 0x00000010 /* Test mode. 0=normal,1=test */ ++#define E1000_CTRL_SLE 0x00000020 /* Serial Link on 0=dis,1=en */ ++#define E1000_CTRL_ASDE 0x00000020 /* Auto-speed detect enable */ ++#define E1000_CTRL_SLU 0x00000040 /* Set link up (Force Link) */ ++#define E1000_CTRL_ILOS 0x00000080 /* Invert Loss-Of Signal */ ++#define E1000_CTRL_SPD_SEL 0x00000300 /* Speed Select Mask */ ++#define E1000_CTRL_SPD_10 0x00000000 /* Force 10Mb */ ++#define E1000_CTRL_SPD_100 0x00000100 /* Force 100Mb */ ++#define E1000_CTRL_SPD_1000 0x00000200 /* Force 1Gb */ ++#define E1000_CTRL_BEM32 0x00000400 /* Big Endian 32 mode */ ++#define E1000_CTRL_FRCSPD 0x00000800 /* Force Speed */ ++#define E1000_CTRL_FRCDPX 0x00001000 /* Force Duplex */ ++#define E1000_CTRL_D_UD_EN 0x00002000 /* Dock/Undock enable */ ++#define E1000_CTRL_D_UD_POLARITY 0x00004000 /* Defined polarity of Dock/Undock ++ * indication in SDP[0] */ ++#define E1000_CTRL_FORCE_PHY_RESET 0x00008000 /* Reset both PHY ports, through ++ * PHYRST_N pin */ ++#define E1000_CTRL_EXT_LINK_EN 0x00010000 /* enable link status from external ++ * LINK_0 and LINK_1 pins */ ++#define E1000_CTRL_SWDPIN0 0x00040000 /* SWDPIN 0 value */ ++#define E1000_CTRL_SWDPIN1 0x00080000 /* SWDPIN 1 value */ ++#define E1000_CTRL_SWDPIN2 0x00100000 /* SWDPIN 2 value */ ++#define E1000_CTRL_SWDPIN3 0x00200000 /* SWDPIN 3 value */ ++#define E1000_CTRL_SWDPIO0 0x00400000 /* SWDPIN 0 Input or output */ ++#define E1000_CTRL_SWDPIO1 0x00800000 /* SWDPIN 1 input or output */ ++#define E1000_CTRL_SWDPIO2 0x01000000 /* SWDPIN 2 input or output */ ++#define E1000_CTRL_SWDPIO3 0x02000000 /* SWDPIN 3 input or output */ ++#define E1000_CTRL_RST 0x04000000 /* Global reset */ ++#define E1000_CTRL_RFCE 0x08000000 /* Receive Flow Control enable */ ++#define E1000_CTRL_TFCE 0x10000000 /* Transmit flow control enable */ ++#define E1000_CTRL_RTE 0x20000000 /* Routing tag enable */ ++#define E1000_CTRL_VME 0x40000000 /* IEEE VLAN mode enable */ ++#define E1000_CTRL_PHY_RST 0x80000000 /* PHY Reset */ ++#define E1000_CTRL_SW2FW_INT 0x02000000 /* Initiate an interrupt to ME */ ++#define E1000_CTRL_I2C_ENA 0x02000000 /* I2C enable */ ++ ++/* ++ * Bit definitions for the Management Data IO (MDIO) and Management Data ++ * Clock (MDC) pins in the Device Control Register. ++ */ ++#define E1000_CTRL_PHY_RESET_DIR E1000_CTRL_SWDPIO0 ++#define E1000_CTRL_PHY_RESET E1000_CTRL_SWDPIN0 ++#define E1000_CTRL_MDIO_DIR E1000_CTRL_SWDPIO2 ++#define E1000_CTRL_MDIO E1000_CTRL_SWDPIN2 ++#define E1000_CTRL_MDC_DIR E1000_CTRL_SWDPIO3 ++#define E1000_CTRL_MDC E1000_CTRL_SWDPIN3 ++#define E1000_CTRL_PHY_RESET_DIR4 E1000_CTRL_EXT_SDP4_DIR ++#define E1000_CTRL_PHY_RESET4 E1000_CTRL_EXT_SDP4_DATA ++ ++#define E1000_CONNSW_ENRGSRC 0x4 ++#define E1000_PCS_CFG_PCS_EN 8 ++#define E1000_PCS_LCTL_FLV_LINK_UP 1 ++#define E1000_PCS_LCTL_FSV_10 0 ++#define E1000_PCS_LCTL_FSV_100 2 ++#define E1000_PCS_LCTL_FSV_1000 4 ++#define E1000_PCS_LCTL_FDV_FULL 8 ++#define E1000_PCS_LCTL_FSD 0x10 ++#define E1000_PCS_LCTL_FORCE_LINK 0x20 ++#define E1000_PCS_LCTL_LOW_LINK_LATCH 0x40 ++#define E1000_PCS_LCTL_FORCE_FCTRL 0x80 ++#define E1000_PCS_LCTL_AN_ENABLE 0x10000 ++#define E1000_PCS_LCTL_AN_RESTART 0x20000 ++#define E1000_PCS_LCTL_AN_TIMEOUT 0x40000 ++#define E1000_PCS_LCTL_AN_SGMII_BYPASS 0x80000 ++#define E1000_PCS_LCTL_AN_SGMII_TRIGGER 0x100000 ++#define E1000_PCS_LCTL_FAST_LINK_TIMER 0x1000000 ++#define E1000_PCS_LCTL_LINK_OK_FIX 0x2000000 ++#define E1000_PCS_LCTL_CRS_ON_NI 0x4000000 ++#define E1000_ENABLE_SERDES_LOOPBACK 0x0410 ++ ++#define E1000_PCS_LSTS_LINK_OK 1 ++#define E1000_PCS_LSTS_SPEED_10 0 ++#define E1000_PCS_LSTS_SPEED_100 2 ++#define E1000_PCS_LSTS_SPEED_1000 4 ++#define E1000_PCS_LSTS_DUPLEX_FULL 8 ++#define E1000_PCS_LSTS_SYNK_OK 0x10 ++#define E1000_PCS_LSTS_AN_COMPLETE 0x10000 ++#define E1000_PCS_LSTS_AN_PAGE_RX 0x20000 ++#define E1000_PCS_LSTS_AN_TIMED_OUT 0x40000 ++#define E1000_PCS_LSTS_AN_REMOTE_FAULT 0x80000 ++#define E1000_PCS_LSTS_AN_ERROR_RWS 0x100000 ++ ++/* Device Status */ ++#define E1000_STATUS_FD 0x00000001 /* Full duplex.0=half,1=full */ ++#define E1000_STATUS_LU 0x00000002 /* Link up.0=no,1=link */ ++#define E1000_STATUS_FUNC_MASK 0x0000000C /* PCI Function Mask */ ++#define E1000_STATUS_FUNC_SHIFT 2 ++#define E1000_STATUS_FUNC_0 0x00000000 /* Function 0 */ ++#define E1000_STATUS_FUNC_1 0x00000004 /* Function 1 */ ++#define E1000_STATUS_TXOFF 0x00000010 /* transmission paused */ ++#define E1000_STATUS_TBIMODE 0x00000020 /* TBI mode */ ++#define E1000_STATUS_SPEED_MASK 0x000000C0 ++#define E1000_STATUS_SPEED_10 0x00000000 /* Speed 10Mb/s */ ++#define E1000_STATUS_SPEED_100 0x00000040 /* Speed 100Mb/s */ ++#define E1000_STATUS_SPEED_1000 0x00000080 /* Speed 1000Mb/s */ ++#define E1000_STATUS_LAN_INIT_DONE 0x00000200 /* Lan Init Completion by NVM */ ++#define E1000_STATUS_ASDV 0x00000300 /* Auto speed detect value */ ++#define E1000_STATUS_DOCK_CI 0x00000800 /* Change in Dock/Undock state. ++ * Clear on write '0'. */ ++#define E1000_STATUS_GIO_MASTER_ENABLE 0x00080000 /* Master request status */ ++#define E1000_STATUS_MTXCKOK 0x00000400 /* MTX clock running OK */ ++#define E1000_STATUS_PCI66 0x00000800 /* In 66Mhz slot */ ++#define E1000_STATUS_BUS64 0x00001000 /* In 64 bit slot */ ++#define E1000_STATUS_PCIX_MODE 0x00002000 /* PCI-X mode */ ++#define E1000_STATUS_PCIX_SPEED 0x0000C000 /* PCI-X bus speed */ ++#define E1000_STATUS_BMC_SKU_0 0x00100000 /* BMC USB redirect disabled */ ++#define E1000_STATUS_BMC_SKU_1 0x00200000 /* BMC SRAM disabled */ ++#define E1000_STATUS_BMC_SKU_2 0x00400000 /* BMC SDRAM disabled */ ++#define E1000_STATUS_BMC_CRYPTO 0x00800000 /* BMC crypto disabled */ ++#define E1000_STATUS_BMC_LITE 0x01000000 /* BMC external code execution ++ * disabled */ ++#define E1000_STATUS_RGMII_ENABLE 0x02000000 /* RGMII disabled */ ++#define E1000_STATUS_FUSE_8 0x04000000 ++#define E1000_STATUS_FUSE_9 0x08000000 ++#define E1000_STATUS_SERDES0_DIS 0x10000000 /* SERDES disabled on port 0 */ ++#define E1000_STATUS_SERDES1_DIS 0x20000000 /* SERDES disabled on port 1 */ ++ ++/* Constants used to interpret the masked PCI-X bus speed. */ ++#define E1000_STATUS_PCIX_SPEED_66 0x00000000 /* PCI-X bus speed 50-66 MHz */ ++#define E1000_STATUS_PCIX_SPEED_100 0x00004000 /* PCI-X bus speed 66-100 MHz */ ++#define E1000_STATUS_PCIX_SPEED_133 0x00008000 /* PCI-X bus speed 100-133 MHz */ ++ ++#define SPEED_10 10 ++#define SPEED_100 100 ++#define SPEED_1000 1000 ++#define HALF_DUPLEX 1 ++#define FULL_DUPLEX 2 ++ ++#define PHY_FORCE_TIME 20 ++ ++#define ADVERTISE_10_HALF 0x0001 ++#define ADVERTISE_10_FULL 0x0002 ++#define ADVERTISE_100_HALF 0x0004 ++#define ADVERTISE_100_FULL 0x0008 ++#define ADVERTISE_1000_HALF 0x0010 /* Not used, just FYI */ ++#define ADVERTISE_1000_FULL 0x0020 ++ ++/* 1000/H is not supported, nor spec-compliant. */ ++#define E1000_ALL_SPEED_DUPLEX (ADVERTISE_10_HALF | ADVERTISE_10_FULL | \ ++ ADVERTISE_100_HALF | ADVERTISE_100_FULL | \ ++ ADVERTISE_1000_FULL) ++#define E1000_ALL_NOT_GIG (ADVERTISE_10_HALF | ADVERTISE_10_FULL | \ ++ ADVERTISE_100_HALF | ADVERTISE_100_FULL) ++#define E1000_ALL_100_SPEED (ADVERTISE_100_HALF | ADVERTISE_100_FULL) ++#define E1000_ALL_10_SPEED (ADVERTISE_10_HALF | ADVERTISE_10_FULL) ++#define E1000_ALL_FULL_DUPLEX (ADVERTISE_10_FULL | ADVERTISE_100_FULL | \ ++ ADVERTISE_1000_FULL) ++#define E1000_ALL_HALF_DUPLEX (ADVERTISE_10_HALF | ADVERTISE_100_HALF) ++ ++#define AUTONEG_ADVERTISE_SPEED_DEFAULT E1000_ALL_SPEED_DUPLEX ++ ++/* LED Control */ ++#define E1000_LEDCTL_LED0_MODE_MASK 0x0000000F ++#define E1000_LEDCTL_LED0_MODE_SHIFT 0 ++#define E1000_LEDCTL_LED0_BLINK_RATE 0x00000020 ++#define E1000_LEDCTL_LED0_IVRT 0x00000040 ++#define E1000_LEDCTL_LED0_BLINK 0x00000080 ++#define E1000_LEDCTL_LED1_MODE_MASK 0x00000F00 ++#define E1000_LEDCTL_LED1_MODE_SHIFT 8 ++#define E1000_LEDCTL_LED1_BLINK_RATE 0x00002000 ++#define E1000_LEDCTL_LED1_IVRT 0x00004000 ++#define E1000_LEDCTL_LED1_BLINK 0x00008000 ++#define E1000_LEDCTL_LED2_MODE_MASK 0x000F0000 ++#define E1000_LEDCTL_LED2_MODE_SHIFT 16 ++#define E1000_LEDCTL_LED2_BLINK_RATE 0x00200000 ++#define E1000_LEDCTL_LED2_IVRT 0x00400000 ++#define E1000_LEDCTL_LED2_BLINK 0x00800000 ++#define E1000_LEDCTL_LED3_MODE_MASK 0x0F000000 ++#define E1000_LEDCTL_LED3_MODE_SHIFT 24 ++#define E1000_LEDCTL_LED3_BLINK_RATE 0x20000000 ++#define E1000_LEDCTL_LED3_IVRT 0x40000000 ++#define E1000_LEDCTL_LED3_BLINK 0x80000000 ++ ++#define E1000_LEDCTL_MODE_LINK_10_1000 0x0 ++#define E1000_LEDCTL_MODE_LINK_100_1000 0x1 ++#define E1000_LEDCTL_MODE_LINK_UP 0x2 ++#define E1000_LEDCTL_MODE_ACTIVITY 0x3 ++#define E1000_LEDCTL_MODE_LINK_ACTIVITY 0x4 ++#define E1000_LEDCTL_MODE_LINK_10 0x5 ++#define E1000_LEDCTL_MODE_LINK_100 0x6 ++#define E1000_LEDCTL_MODE_LINK_1000 0x7 ++#define E1000_LEDCTL_MODE_PCIX_MODE 0x8 ++#define E1000_LEDCTL_MODE_FULL_DUPLEX 0x9 ++#define E1000_LEDCTL_MODE_COLLISION 0xA ++#define E1000_LEDCTL_MODE_BUS_SPEED 0xB ++#define E1000_LEDCTL_MODE_BUS_SIZE 0xC ++#define E1000_LEDCTL_MODE_PAUSED 0xD ++#define E1000_LEDCTL_MODE_LED_ON 0xE ++#define E1000_LEDCTL_MODE_LED_OFF 0xF ++ ++/* Transmit Descriptor bit definitions */ ++#define E1000_TXD_DTYP_D 0x00100000 /* Data Descriptor */ ++#define E1000_TXD_DTYP_C 0x00000000 /* Context Descriptor */ ++#define E1000_TXD_POPTS_SHIFT 8 /* POPTS shift */ ++#define E1000_TXD_POPTS_IXSM 0x01 /* Insert IP checksum */ ++#define E1000_TXD_POPTS_TXSM 0x02 /* Insert TCP/UDP checksum */ ++#define E1000_TXD_CMD_EOP 0x01000000 /* End of Packet */ ++#define E1000_TXD_CMD_IFCS 0x02000000 /* Insert FCS (Ethernet CRC) */ ++#define E1000_TXD_CMD_IC 0x04000000 /* Insert Checksum */ ++#define E1000_TXD_CMD_RS 0x08000000 /* Report Status */ ++#define E1000_TXD_CMD_RPS 0x10000000 /* Report Packet Sent */ ++#define E1000_TXD_CMD_DEXT 0x20000000 /* Descriptor extension (0 = legacy) */ ++#define E1000_TXD_CMD_VLE 0x40000000 /* Add VLAN tag */ ++#define E1000_TXD_CMD_IDE 0x80000000 /* Enable Tidv register */ ++#define E1000_TXD_STAT_DD 0x00000001 /* Descriptor Done */ ++#define E1000_TXD_STAT_EC 0x00000002 /* Excess Collisions */ ++#define E1000_TXD_STAT_LC 0x00000004 /* Late Collisions */ ++#define E1000_TXD_STAT_TU 0x00000008 /* Transmit underrun */ ++#define E1000_TXD_CMD_TCP 0x01000000 /* TCP packet */ ++#define E1000_TXD_CMD_IP 0x02000000 /* IP packet */ ++#define E1000_TXD_CMD_TSE 0x04000000 /* TCP Seg enable */ ++#define E1000_TXD_STAT_TC 0x00000004 /* Tx Underrun */ ++/* Extended desc bits for Linksec and timesync */ ++#define E1000_TXD_CMD_LINKSEC 0x10000000 /* Apply LinkSec on packet */ ++#define E1000_TXD_EXTCMD_TSTAMP 0x00000010 /* IEEE1588 Timestamp packet */ ++ ++/* Transmit Control */ ++#define E1000_TCTL_RST 0x00000001 /* software reset */ ++#define E1000_TCTL_EN 0x00000002 /* enable tx */ ++#define E1000_TCTL_BCE 0x00000004 /* busy check enable */ ++#define E1000_TCTL_PSP 0x00000008 /* pad short packets */ ++#define E1000_TCTL_CT 0x00000ff0 /* collision threshold */ ++#define E1000_TCTL_COLD 0x003ff000 /* collision distance */ ++#define E1000_TCTL_SWXOFF 0x00400000 /* SW Xoff transmission */ ++#define E1000_TCTL_PBE 0x00800000 /* Packet Burst Enable */ ++#define E1000_TCTL_RTLC 0x01000000 /* Re-transmit on late collision */ ++#define E1000_TCTL_NRTU 0x02000000 /* No Re-transmit on underrun */ ++#define E1000_TCTL_MULR 0x10000000 /* Multiple request support */ ++ ++/* Transmit Arbitration Count */ ++#define E1000_TARC0_ENABLE 0x00000400 /* Enable Tx Queue 0 */ ++ ++/* SerDes Control */ ++#define E1000_SCTL_DISABLE_SERDES_LOOPBACK 0x0400 ++ ++/* Receive Checksum Control */ ++#define E1000_RXCSUM_PCSS_MASK 0x000000FF /* Packet Checksum Start */ ++#define E1000_RXCSUM_IPOFL 0x00000100 /* IPv4 checksum offload */ ++#define E1000_RXCSUM_TUOFL 0x00000200 /* TCP / UDP checksum offload */ ++#define E1000_RXCSUM_IPV6OFL 0x00000400 /* IPv6 checksum offload */ ++#define E1000_RXCSUM_CRCOFL 0x00000800 /* CRC32 offload enable */ ++#define E1000_RXCSUM_IPPCSE 0x00001000 /* IP payload checksum enable */ ++#define E1000_RXCSUM_PCSD 0x00002000 /* packet checksum disabled */ ++ ++/* Header split receive */ ++#define E1000_RFCTL_ISCSI_DIS 0x00000001 ++#define E1000_RFCTL_ISCSI_DWC_MASK 0x0000003E ++#define E1000_RFCTL_ISCSI_DWC_SHIFT 1 ++#define E1000_RFCTL_NFSW_DIS 0x00000040 ++#define E1000_RFCTL_NFSR_DIS 0x00000080 ++#define E1000_RFCTL_NFS_VER_MASK 0x00000300 ++#define E1000_RFCTL_NFS_VER_SHIFT 8 ++#define E1000_RFCTL_IPV6_DIS 0x00000400 ++#define E1000_RFCTL_IPV6_XSUM_DIS 0x00000800 ++#define E1000_RFCTL_ACK_DIS 0x00001000 ++#define E1000_RFCTL_ACKD_DIS 0x00002000 ++#define E1000_RFCTL_IPFRSP_DIS 0x00004000 ++#define E1000_RFCTL_EXTEN 0x00008000 ++#define E1000_RFCTL_IPV6_EX_DIS 0x00010000 ++#define E1000_RFCTL_NEW_IPV6_EXT_DIS 0x00020000 ++#define E1000_RFCTL_LEF 0x00040000 ++ ++/* Collision related configuration parameters */ ++#define E1000_COLLISION_THRESHOLD 15 ++#define E1000_CT_SHIFT 4 ++#define E1000_COLLISION_DISTANCE 63 ++#define E1000_COLD_SHIFT 12 ++ ++/* Default values for the transmit IPG register */ ++#define DEFAULT_82543_TIPG_IPGT_FIBER 9 ++#define DEFAULT_82543_TIPG_IPGT_COPPER 8 ++ ++#define E1000_TIPG_IPGT_MASK 0x000003FF ++#define E1000_TIPG_IPGR1_MASK 0x000FFC00 ++#define E1000_TIPG_IPGR2_MASK 0x3FF00000 ++ ++#define DEFAULT_82543_TIPG_IPGR1 8 ++#define E1000_TIPG_IPGR1_SHIFT 10 ++ ++#define DEFAULT_82543_TIPG_IPGR2 6 ++#define DEFAULT_80003ES2LAN_TIPG_IPGR2 7 ++#define E1000_TIPG_IPGR2_SHIFT 20 ++ ++/* Ethertype field values */ ++#define ETHERNET_IEEE_VLAN_TYPE 0x8100 /* 802.3ac packet */ ++ ++#define ETHERNET_FCS_SIZE 4 ++#define MAX_JUMBO_FRAME_SIZE 0x3F00 ++ ++/* Extended Configuration Control and Size */ ++#define E1000_EXTCNF_CTRL_MDIO_SW_OWNERSHIP 0x00000020 ++#define E1000_EXTCNF_CTRL_LCD_WRITE_ENABLE 0x00000001 ++#define E1000_EXTCNF_CTRL_SWFLAG 0x00000020 ++#define E1000_EXTCNF_SIZE_EXT_PCIE_LENGTH_MASK 0x00FF0000 ++#define E1000_EXTCNF_SIZE_EXT_PCIE_LENGTH_SHIFT 16 ++#define E1000_EXTCNF_CTRL_EXT_CNF_POINTER_MASK 0x0FFF0000 ++#define E1000_EXTCNF_CTRL_EXT_CNF_POINTER_SHIFT 16 ++ ++#define E1000_PHY_CTRL_SPD_EN 0x00000001 ++#define E1000_PHY_CTRL_D0A_LPLU 0x00000002 ++#define E1000_PHY_CTRL_NOND0A_LPLU 0x00000004 ++#define E1000_PHY_CTRL_NOND0A_GBE_DISABLE 0x00000008 ++#define E1000_PHY_CTRL_GBE_DISABLE 0x00000040 ++ ++#define E1000_KABGTXD_BGSQLBIAS 0x00050000 ++ ++/* PBA constants */ ++#define E1000_PBA_6K 0x0006 /* 6KB */ ++#define E1000_PBA_8K 0x0008 /* 8KB */ ++#define E1000_PBA_12K 0x000C /* 12KB */ ++#define E1000_PBA_14K 0x000E /* 14KB */ ++#define E1000_PBA_16K 0x0010 /* 16KB */ ++#define E1000_PBA_18K 0x0012 ++#define E1000_PBA_20K 0x0014 ++#define E1000_PBA_22K 0x0016 ++#define E1000_PBA_24K 0x0018 ++#define E1000_PBA_26K 0x001A ++#define E1000_PBA_30K 0x001E ++#define E1000_PBA_32K 0x0020 ++#define E1000_PBA_34K 0x0022 ++#define E1000_PBA_35K 0x0023 ++#define E1000_PBA_38K 0x0026 ++#define E1000_PBA_40K 0x0028 ++#define E1000_PBA_48K 0x0030 /* 48KB */ ++#define E1000_PBA_64K 0x0040 /* 64KB */ ++ ++#define E1000_PBS_16K E1000_PBA_16K ++#define E1000_PBS_24K E1000_PBA_24K ++ ++#define IFS_MAX 80 ++#define IFS_MIN 40 ++#define IFS_RATIO 4 ++#define IFS_STEP 10 ++#define MIN_NUM_XMITS 1000 ++ ++/* SW Semaphore Register */ ++#define E1000_SWSM_SMBI 0x00000001 /* Driver Semaphore bit */ ++#define E1000_SWSM_SWESMBI 0x00000002 /* FW Semaphore bit */ ++#define E1000_SWSM_WMNG 0x00000004 /* Wake MNG Clock */ ++#define E1000_SWSM_DRV_LOAD 0x00000008 /* Driver Loaded Bit */ ++ ++/* Interrupt Cause Read */ ++#define E1000_ICR_TXDW 0x00000001 /* Transmit desc written back */ ++#define E1000_ICR_TXQE 0x00000002 /* Transmit Queue empty */ ++#define E1000_ICR_LSC 0x00000004 /* Link Status Change */ ++#define E1000_ICR_RXSEQ 0x00000008 /* rx sequence error */ ++#define E1000_ICR_RXDMT0 0x00000010 /* rx desc min. threshold (0) */ ++#define E1000_ICR_RXO 0x00000040 /* rx overrun */ ++#define E1000_ICR_RXT0 0x00000080 /* rx timer intr (ring 0) */ ++#define E1000_ICR_VMMB 0x00000100 /* VM MB event */ ++#define E1000_ICR_MDAC 0x00000200 /* MDIO access complete */ ++#define E1000_ICR_RXCFG 0x00000400 /* Rx /c/ ordered set */ ++#define E1000_ICR_GPI_EN0 0x00000800 /* GP Int 0 */ ++#define E1000_ICR_GPI_EN1 0x00001000 /* GP Int 1 */ ++#define E1000_ICR_GPI_EN2 0x00002000 /* GP Int 2 */ ++#define E1000_ICR_GPI_EN3 0x00004000 /* GP Int 3 */ ++#define E1000_ICR_TXD_LOW 0x00008000 ++#define E1000_ICR_SRPD 0x00010000 ++#define E1000_ICR_ACK 0x00020000 /* Receive Ack frame */ ++#define E1000_ICR_MNG 0x00040000 /* Manageability event */ ++#define E1000_ICR_DOCK 0x00080000 /* Dock/Undock */ ++#define E1000_ICR_INT_ASSERTED 0x80000000 /* If this bit asserted, the driver ++ * should claim the interrupt */ ++#define E1000_ICR_RXD_FIFO_PAR0 0x00100000 /* Q0 Rx desc FIFO parity error */ ++#define E1000_ICR_TXD_FIFO_PAR0 0x00200000 /* Q0 Tx desc FIFO parity error */ ++#define E1000_ICR_HOST_ARB_PAR 0x00400000 /* host arb read buffer parity err */ ++#define E1000_ICR_PB_PAR 0x00800000 /* packet buffer parity error */ ++#define E1000_ICR_RXD_FIFO_PAR1 0x01000000 /* Q1 Rx desc FIFO parity error */ ++#define E1000_ICR_TXD_FIFO_PAR1 0x02000000 /* Q1 Tx desc FIFO parity error */ ++#define E1000_ICR_ALL_PARITY 0x03F00000 /* all parity error bits */ ++#define E1000_ICR_DSW 0x00000020 /* FW changed the status of DISSW ++ * bit in the FWSM */ ++#define E1000_ICR_PHYINT 0x00001000 /* LAN connected device generates ++ * an interrupt */ ++#define E1000_ICR_DOUTSYNC 0x10000000 /* NIC DMA out of sync */ ++#define E1000_ICR_EPRST 0x00100000 /* ME hardware reset occurs */ ++#define E1000_ICR_RXQ0 0x00100000 /* Rx Queue 0 Interrupt */ ++#define E1000_ICR_RXQ1 0x00200000 /* Rx Queue 1 Interrupt */ ++#define E1000_ICR_TXQ0 0x00400000 /* Tx Queue 0 Interrupt */ ++#define E1000_ICR_TXQ1 0x00800000 /* Tx Queue 1 Interrupt */ ++#define E1000_ICR_OTHER 0x01000000 /* Other Interrupts */ ++ ++/* PBA ECC Register */ ++#define E1000_PBA_ECC_COUNTER_MASK 0xFFF00000 /* ECC counter mask */ ++#define E1000_PBA_ECC_COUNTER_SHIFT 20 /* ECC counter shift value */ ++#define E1000_PBA_ECC_CORR_EN 0x00000001 /* Enable ECC error correction */ ++#define E1000_PBA_ECC_STAT_CLR 0x00000002 /* Clear ECC error counter */ ++#define E1000_PBA_ECC_INT_EN 0x00000004 /* Enable ICR bit 5 on ECC error */ ++ ++/* ++ * This defines the bits that are set in the Interrupt Mask ++ * Set/Read Register. Each bit is documented below: ++ * o RXDMT0 = Receive Descriptor Minimum Threshold hit (ring 0) ++ * o RXSEQ = Receive Sequence Error ++ */ ++#define POLL_IMS_ENABLE_MASK ( \ ++ E1000_IMS_RXDMT0 | \ ++ E1000_IMS_RXSEQ) ++ ++/* ++ * This defines the bits that are set in the Interrupt Mask ++ * Set/Read Register. Each bit is documented below: ++ * o RXT0 = Receiver Timer Interrupt (ring 0) ++ * o TXDW = Transmit Descriptor Written Back ++ * o RXDMT0 = Receive Descriptor Minimum Threshold hit (ring 0) ++ * o RXSEQ = Receive Sequence Error ++ * o LSC = Link Status Change ++ */ ++#define IMS_ENABLE_MASK ( \ ++ E1000_IMS_RXT0 | \ ++ E1000_IMS_TXDW | \ ++ E1000_IMS_RXDMT0 | \ ++ E1000_IMS_RXSEQ | \ ++ E1000_IMS_LSC) ++ ++/* Interrupt Mask Set */ ++#define E1000_IMS_TXDW E1000_ICR_TXDW /* Transmit desc written back */ ++#define E1000_IMS_TXQE E1000_ICR_TXQE /* Transmit Queue empty */ ++#define E1000_IMS_LSC E1000_ICR_LSC /* Link Status Change */ ++#define E1000_IMS_VMMB E1000_ICR_VMMB /* Mail box activity */ ++#define E1000_IMS_RXSEQ E1000_ICR_RXSEQ /* rx sequence error */ ++#define E1000_IMS_RXDMT0 E1000_ICR_RXDMT0 /* rx desc min. threshold */ ++#define E1000_IMS_RXO E1000_ICR_RXO /* rx overrun */ ++#define E1000_IMS_RXT0 E1000_ICR_RXT0 /* rx timer intr */ ++#define E1000_IMS_MDAC E1000_ICR_MDAC /* MDIO access complete */ ++#define E1000_IMS_RXCFG E1000_ICR_RXCFG /* Rx /c/ ordered set */ ++#define E1000_IMS_GPI_EN0 E1000_ICR_GPI_EN0 /* GP Int 0 */ ++#define E1000_IMS_GPI_EN1 E1000_ICR_GPI_EN1 /* GP Int 1 */ ++#define E1000_IMS_GPI_EN2 E1000_ICR_GPI_EN2 /* GP Int 2 */ ++#define E1000_IMS_GPI_EN3 E1000_ICR_GPI_EN3 /* GP Int 3 */ ++#define E1000_IMS_TXD_LOW E1000_ICR_TXD_LOW ++#define E1000_IMS_SRPD E1000_ICR_SRPD ++#define E1000_IMS_ACK E1000_ICR_ACK /* Receive Ack frame */ ++#define E1000_IMS_MNG E1000_ICR_MNG /* Manageability event */ ++#define E1000_IMS_DOCK E1000_ICR_DOCK /* Dock/Undock */ ++#define E1000_IMS_RXD_FIFO_PAR0 E1000_ICR_RXD_FIFO_PAR0 /* Q0 Rx desc FIFO ++ * parity error */ ++#define E1000_IMS_TXD_FIFO_PAR0 E1000_ICR_TXD_FIFO_PAR0 /* Q0 Tx desc FIFO ++ * parity error */ ++#define E1000_IMS_HOST_ARB_PAR E1000_ICR_HOST_ARB_PAR /* host arb read buffer ++ * parity error */ ++#define E1000_IMS_PB_PAR E1000_ICR_PB_PAR /* packet buffer parity ++ * error */ ++#define E1000_IMS_RXD_FIFO_PAR1 E1000_ICR_RXD_FIFO_PAR1 /* Q1 Rx desc FIFO ++ * parity error */ ++#define E1000_IMS_TXD_FIFO_PAR1 E1000_ICR_TXD_FIFO_PAR1 /* Q1 Tx desc FIFO ++ * parity error */ ++#define E1000_IMS_DSW E1000_ICR_DSW ++#define E1000_IMS_PHYINT E1000_ICR_PHYINT ++#define E1000_IMS_DOUTSYNC E1000_ICR_DOUTSYNC /* NIC DMA out of sync */ ++#define E1000_IMS_EPRST E1000_ICR_EPRST ++#define E1000_IMS_RXQ0 E1000_ICR_RXQ0 /* Rx Queue 0 Interrupt */ ++#define E1000_IMS_RXQ1 E1000_ICR_RXQ1 /* Rx Queue 1 Interrupt */ ++#define E1000_IMS_TXQ0 E1000_ICR_TXQ0 /* Tx Queue 0 Interrupt */ ++#define E1000_IMS_TXQ1 E1000_ICR_TXQ1 /* Tx Queue 1 Interrupt */ ++#define E1000_IMS_OTHER E1000_ICR_OTHER /* Other Interrupts */ ++ ++/* Interrupt Cause Set */ ++#define E1000_ICS_TXDW E1000_ICR_TXDW /* Transmit desc written back */ ++#define E1000_ICS_TXQE E1000_ICR_TXQE /* Transmit Queue empty */ ++#define E1000_ICS_LSC E1000_ICR_LSC /* Link Status Change */ ++#define E1000_ICS_RXSEQ E1000_ICR_RXSEQ /* rx sequence error */ ++#define E1000_ICS_RXDMT0 E1000_ICR_RXDMT0 /* rx desc min. threshold */ ++#define E1000_ICS_RXO E1000_ICR_RXO /* rx overrun */ ++#define E1000_ICS_RXT0 E1000_ICR_RXT0 /* rx timer intr */ ++#define E1000_ICS_MDAC E1000_ICR_MDAC /* MDIO access complete */ ++#define E1000_ICS_RXCFG E1000_ICR_RXCFG /* Rx /c/ ordered set */ ++#define E1000_ICS_GPI_EN0 E1000_ICR_GPI_EN0 /* GP Int 0 */ ++#define E1000_ICS_GPI_EN1 E1000_ICR_GPI_EN1 /* GP Int 1 */ ++#define E1000_ICS_GPI_EN2 E1000_ICR_GPI_EN2 /* GP Int 2 */ ++#define E1000_ICS_GPI_EN3 E1000_ICR_GPI_EN3 /* GP Int 3 */ ++#define E1000_ICS_TXD_LOW E1000_ICR_TXD_LOW ++#define E1000_ICS_SRPD E1000_ICR_SRPD ++#define E1000_ICS_ACK E1000_ICR_ACK /* Receive Ack frame */ ++#define E1000_ICS_MNG E1000_ICR_MNG /* Manageability event */ ++#define E1000_ICS_DOCK E1000_ICR_DOCK /* Dock/Undock */ ++#define E1000_ICS_RXD_FIFO_PAR0 E1000_ICR_RXD_FIFO_PAR0 /* Q0 Rx desc FIFO ++ * parity error */ ++#define E1000_ICS_TXD_FIFO_PAR0 E1000_ICR_TXD_FIFO_PAR0 /* Q0 Tx desc FIFO ++ * parity error */ ++#define E1000_ICS_HOST_ARB_PAR E1000_ICR_HOST_ARB_PAR /* host arb read buffer ++ * parity error */ ++#define E1000_ICS_PB_PAR E1000_ICR_PB_PAR /* packet buffer parity ++ * error */ ++#define E1000_ICS_RXD_FIFO_PAR1 E1000_ICR_RXD_FIFO_PAR1 /* Q1 Rx desc FIFO ++ * parity error */ ++#define E1000_ICS_TXD_FIFO_PAR1 E1000_ICR_TXD_FIFO_PAR1 /* Q1 Tx desc FIFO ++ * parity error */ ++#define E1000_ICS_DSW E1000_ICR_DSW ++#define E1000_ICS_DOUTSYNC E1000_ICR_DOUTSYNC /* NIC DMA out of sync */ ++#define E1000_ICS_PHYINT E1000_ICR_PHYINT ++#define E1000_ICS_EPRST E1000_ICR_EPRST ++ ++/* Transmit Descriptor Control */ ++#define E1000_TXDCTL_PTHRESH 0x0000003F /* TXDCTL Prefetch Threshold */ ++#define E1000_TXDCTL_HTHRESH 0x00003F00 /* TXDCTL Host Threshold */ ++#define E1000_TXDCTL_WTHRESH 0x003F0000 /* TXDCTL Writeback Threshold */ ++#define E1000_TXDCTL_GRAN 0x01000000 /* TXDCTL Granularity */ ++#define E1000_TXDCTL_LWTHRESH 0xFE000000 /* TXDCTL Low Threshold */ ++#define E1000_TXDCTL_FULL_TX_DESC_WB 0x01010000 /* GRAN=1, WTHRESH=1 */ ++#define E1000_TXDCTL_MAX_TX_DESC_PREFETCH 0x0100001F /* GRAN=1, PTHRESH=31 */ ++/* Enable the counting of descriptors still to be processed. */ ++#define E1000_TXDCTL_COUNT_DESC 0x00400000 ++ ++/* Flow Control Constants */ ++#define FLOW_CONTROL_ADDRESS_LOW 0x00C28001 ++#define FLOW_CONTROL_ADDRESS_HIGH 0x00000100 ++#define FLOW_CONTROL_TYPE 0x8808 ++ ++/* 802.1q VLAN Packet Size */ ++#define VLAN_TAG_SIZE 4 /* 802.3ac tag (not DMA'd) */ ++#define E1000_VLAN_FILTER_TBL_SIZE 128 /* VLAN Filter Table (4096 bits) */ ++ ++/* Receive Address */ ++/* ++ * Number of high/low register pairs in the RAR. The RAR (Receive Address ++ * Registers) holds the directed and multicast addresses that we monitor. ++ * Technically, we have 16 spots. However, we reserve one of these spots ++ * (RAR[15]) for our directed address used by controllers with ++ * manageability enabled, allowing us room for 15 multicast addresses. ++ */ ++#define E1000_RAR_ENTRIES 15 ++#define E1000_RAH_AV 0x80000000 /* Receive descriptor valid */ ++#define E1000_RAL_MAC_ADDR_LEN 4 ++#define E1000_RAH_MAC_ADDR_LEN 2 ++#define E1000_RAH_POOL_MASK 0x03FC0000 ++#define E1000_RAH_POOL_1 0x00040000 ++ ++/* Error Codes */ ++#define E1000_SUCCESS 0 ++#define E1000_ERR_NVM 1 ++#define E1000_ERR_PHY 2 ++#define E1000_ERR_CONFIG 3 ++#define E1000_ERR_PARAM 4 ++#define E1000_ERR_MAC_INIT 5 ++#define E1000_ERR_PHY_TYPE 6 ++#define E1000_ERR_RESET 9 ++#define E1000_ERR_MASTER_REQUESTS_PENDING 10 ++#define E1000_ERR_HOST_INTERFACE_COMMAND 11 ++#define E1000_BLK_PHY_RESET 12 ++#define E1000_ERR_SWFW_SYNC 13 ++#define E1000_NOT_IMPLEMENTED 14 ++#define E1000_ERR_MBX 15 ++ ++/* Loop limit on how long we wait for auto-negotiation to complete */ ++#define FIBER_LINK_UP_LIMIT 50 ++#define COPPER_LINK_UP_LIMIT 10 ++#define PHY_AUTO_NEG_LIMIT 45 ++#define PHY_FORCE_LIMIT 20 ++/* Number of 100 microseconds we wait for PCI Express master disable */ ++#define MASTER_DISABLE_TIMEOUT 800 ++/* Number of milliseconds we wait for PHY configuration done after MAC reset */ ++#define PHY_CFG_TIMEOUT 100 ++/* Number of 2 milliseconds we wait for acquiring MDIO ownership. */ ++#define MDIO_OWNERSHIP_TIMEOUT 10 ++/* Number of milliseconds for NVM auto read done after MAC reset. */ ++#define AUTO_READ_DONE_TIMEOUT 10 ++ ++/* Flow Control */ ++#define E1000_FCRTH_RTH 0x0000FFF8 /* Mask Bits[15:3] for RTH */ ++#define E1000_FCRTH_XFCE 0x80000000 /* External Flow Control Enable */ ++#define E1000_FCRTL_RTL 0x0000FFF8 /* Mask Bits[15:3] for RTL */ ++#define E1000_FCRTL_XONE 0x80000000 /* Enable XON frame transmission */ ++ ++/* Transmit Configuration Word */ ++#define E1000_TXCW_FD 0x00000020 /* TXCW full duplex */ ++#define E1000_TXCW_HD 0x00000040 /* TXCW half duplex */ ++#define E1000_TXCW_PAUSE 0x00000080 /* TXCW sym pause request */ ++#define E1000_TXCW_ASM_DIR 0x00000100 /* TXCW astm pause direction */ ++#define E1000_TXCW_PAUSE_MASK 0x00000180 /* TXCW pause request mask */ ++#define E1000_TXCW_RF 0x00003000 /* TXCW remote fault */ ++#define E1000_TXCW_NP 0x00008000 /* TXCW next page */ ++#define E1000_TXCW_CW 0x0000ffff /* TxConfigWord mask */ ++#define E1000_TXCW_TXC 0x40000000 /* Transmit Config control */ ++#define E1000_TXCW_ANE 0x80000000 /* Auto-neg enable */ ++ ++/* Receive Configuration Word */ ++#define E1000_RXCW_CW 0x0000ffff /* RxConfigWord mask */ ++#define E1000_RXCW_NC 0x04000000 /* Receive config no carrier */ ++#define E1000_RXCW_IV 0x08000000 /* Receive config invalid */ ++#define E1000_RXCW_CC 0x10000000 /* Receive config change */ ++#define E1000_RXCW_C 0x20000000 /* Receive config */ ++#define E1000_RXCW_SYNCH 0x40000000 /* Receive config synch */ ++#define E1000_RXCW_ANC 0x80000000 /* Auto-neg complete */ ++ ++/* PCI Express Control */ ++#define E1000_GCR_RXD_NO_SNOOP 0x00000001 ++#define E1000_GCR_RXDSCW_NO_SNOOP 0x00000002 ++#define E1000_GCR_RXDSCR_NO_SNOOP 0x00000004 ++#define E1000_GCR_TXD_NO_SNOOP 0x00000008 ++#define E1000_GCR_TXDSCW_NO_SNOOP 0x00000010 ++#define E1000_GCR_TXDSCR_NO_SNOOP 0x00000020 ++ ++#define PCIE_NO_SNOOP_ALL (E1000_GCR_RXD_NO_SNOOP | \ ++ E1000_GCR_RXDSCW_NO_SNOOP | \ ++ E1000_GCR_RXDSCR_NO_SNOOP | \ ++ E1000_GCR_TXD_NO_SNOOP | \ ++ E1000_GCR_TXDSCW_NO_SNOOP | \ ++ E1000_GCR_TXDSCR_NO_SNOOP) ++ ++/* PHY Control Register */ ++#define MII_CR_SPEED_SELECT_MSB 0x0040 /* bits 6,13: 10=1000, 01=100, 00=10 */ ++#define MII_CR_COLL_TEST_ENABLE 0x0080 /* Collision test enable */ ++#define MII_CR_FULL_DUPLEX 0x0100 /* FDX =1, half duplex =0 */ ++#define MII_CR_RESTART_AUTO_NEG 0x0200 /* Restart auto negotiation */ ++#define MII_CR_ISOLATE 0x0400 /* Isolate PHY from MII */ ++#define MII_CR_POWER_DOWN 0x0800 /* Power down */ ++#define MII_CR_AUTO_NEG_EN 0x1000 /* Auto Neg Enable */ ++#define MII_CR_SPEED_SELECT_LSB 0x2000 /* bits 6,13: 10=1000, 01=100, 00=10 */ ++#define MII_CR_LOOPBACK 0x4000 /* 0 = normal, 1 = loopback */ ++#define MII_CR_RESET 0x8000 /* 0 = normal, 1 = PHY reset */ ++#define MII_CR_SPEED_1000 0x0040 ++#define MII_CR_SPEED_100 0x2000 ++#define MII_CR_SPEED_10 0x0000 ++ ++/* PHY Status Register */ ++#define MII_SR_EXTENDED_CAPS 0x0001 /* Extended register capabilities */ ++#define MII_SR_JABBER_DETECT 0x0002 /* Jabber Detected */ ++#define MII_SR_LINK_STATUS 0x0004 /* Link Status 1 = link */ ++#define MII_SR_AUTONEG_CAPS 0x0008 /* Auto Neg Capable */ ++#define MII_SR_REMOTE_FAULT 0x0010 /* Remote Fault Detect */ ++#define MII_SR_AUTONEG_COMPLETE 0x0020 /* Auto Neg Complete */ ++#define MII_SR_PREAMBLE_SUPPRESS 0x0040 /* Preamble may be suppressed */ ++#define MII_SR_EXTENDED_STATUS 0x0100 /* Ext. status info in Reg 0x0F */ ++#define MII_SR_100T2_HD_CAPS 0x0200 /* 100T2 Half Duplex Capable */ ++#define MII_SR_100T2_FD_CAPS 0x0400 /* 100T2 Full Duplex Capable */ ++#define MII_SR_10T_HD_CAPS 0x0800 /* 10T Half Duplex Capable */ ++#define MII_SR_10T_FD_CAPS 0x1000 /* 10T Full Duplex Capable */ ++#define MII_SR_100X_HD_CAPS 0x2000 /* 100X Half Duplex Capable */ ++#define MII_SR_100X_FD_CAPS 0x4000 /* 100X Full Duplex Capable */ ++#define MII_SR_100T4_CAPS 0x8000 /* 100T4 Capable */ ++ ++/* Autoneg Advertisement Register */ ++#define NWAY_AR_SELECTOR_FIELD 0x0001 /* indicates IEEE 802.3 CSMA/CD */ ++#define NWAY_AR_10T_HD_CAPS 0x0020 /* 10T Half Duplex Capable */ ++#define NWAY_AR_10T_FD_CAPS 0x0040 /* 10T Full Duplex Capable */ ++#define NWAY_AR_100TX_HD_CAPS 0x0080 /* 100TX Half Duplex Capable */ ++#define NWAY_AR_100TX_FD_CAPS 0x0100 /* 100TX Full Duplex Capable */ ++#define NWAY_AR_100T4_CAPS 0x0200 /* 100T4 Capable */ ++#define NWAY_AR_PAUSE 0x0400 /* Pause operation desired */ ++#define NWAY_AR_ASM_DIR 0x0800 /* Asymmetric Pause Direction bit */ ++#define NWAY_AR_REMOTE_FAULT 0x2000 /* Remote Fault detected */ ++#define NWAY_AR_NEXT_PAGE 0x8000 /* Next Page ability supported */ ++ ++/* Link Partner Ability Register (Base Page) */ ++#define NWAY_LPAR_SELECTOR_FIELD 0x0000 /* LP protocol selector field */ ++#define NWAY_LPAR_10T_HD_CAPS 0x0020 /* LP is 10T Half Duplex Capable */ ++#define NWAY_LPAR_10T_FD_CAPS 0x0040 /* LP is 10T Full Duplex Capable */ ++#define NWAY_LPAR_100TX_HD_CAPS 0x0080 /* LP is 100TX Half Duplex Capable */ ++#define NWAY_LPAR_100TX_FD_CAPS 0x0100 /* LP is 100TX Full Duplex Capable */ ++#define NWAY_LPAR_100T4_CAPS 0x0200 /* LP is 100T4 Capable */ ++#define NWAY_LPAR_PAUSE 0x0400 /* LP Pause operation desired */ ++#define NWAY_LPAR_ASM_DIR 0x0800 /* LP Asymmetric Pause Direction bit */ ++#define NWAY_LPAR_REMOTE_FAULT 0x2000 /* LP has detected Remote Fault */ ++#define NWAY_LPAR_ACKNOWLEDGE 0x4000 /* LP has rx'd link code word */ ++#define NWAY_LPAR_NEXT_PAGE 0x8000 /* Next Page ability supported */ ++ ++/* Autoneg Expansion Register */ ++#define NWAY_ER_LP_NWAY_CAPS 0x0001 /* LP has Auto Neg Capability */ ++#define NWAY_ER_PAGE_RXD 0x0002 /* LP is 10T Half Duplex Capable */ ++#define NWAY_ER_NEXT_PAGE_CAPS 0x0004 /* LP is 10T Full Duplex Capable */ ++#define NWAY_ER_LP_NEXT_PAGE_CAPS 0x0008 /* LP is 100TX Half Duplex Capable */ ++#define NWAY_ER_PAR_DETECT_FAULT 0x0010 /* LP is 100TX Full Duplex Capable */ ++ ++/* 1000BASE-T Control Register */ ++#define CR_1000T_ASYM_PAUSE 0x0080 /* Advertise asymmetric pause bit */ ++#define CR_1000T_HD_CAPS 0x0100 /* Advertise 1000T HD capability */ ++#define CR_1000T_FD_CAPS 0x0200 /* Advertise 1000T FD capability */ ++#define CR_1000T_REPEATER_DTE 0x0400 /* 1=Repeater/switch device port */ ++ /* 0=DTE device */ ++#define CR_1000T_MS_VALUE 0x0800 /* 1=Configure PHY as Master */ ++ /* 0=Configure PHY as Slave */ ++#define CR_1000T_MS_ENABLE 0x1000 /* 1=Master/Slave manual config value */ ++ /* 0=Automatic Master/Slave config */ ++#define CR_1000T_TEST_MODE_NORMAL 0x0000 /* Normal Operation */ ++#define CR_1000T_TEST_MODE_1 0x2000 /* Transmit Waveform test */ ++#define CR_1000T_TEST_MODE_2 0x4000 /* Master Transmit Jitter test */ ++#define CR_1000T_TEST_MODE_3 0x6000 /* Slave Transmit Jitter test */ ++#define CR_1000T_TEST_MODE_4 0x8000 /* Transmitter Distortion test */ ++ ++/* 1000BASE-T Status Register */ ++#define SR_1000T_IDLE_ERROR_CNT 0x00FF /* Num idle errors since last read */ ++#define SR_1000T_ASYM_PAUSE_DIR 0x0100 /* LP asymmetric pause direction bit */ ++#define SR_1000T_LP_HD_CAPS 0x0400 /* LP is 1000T HD capable */ ++#define SR_1000T_LP_FD_CAPS 0x0800 /* LP is 1000T FD capable */ ++#define SR_1000T_REMOTE_RX_STATUS 0x1000 /* Remote receiver OK */ ++#define SR_1000T_LOCAL_RX_STATUS 0x2000 /* Local receiver OK */ ++#define SR_1000T_MS_CONFIG_RES 0x4000 /* 1=Local Tx is Master, 0=Slave */ ++#define SR_1000T_MS_CONFIG_FAULT 0x8000 /* Master/Slave config fault */ ++ ++#define SR_1000T_PHY_EXCESSIVE_IDLE_ERR_COUNT 5 ++ ++/* PHY 1000 MII Register/Bit Definitions */ ++/* PHY Registers defined by IEEE */ ++#define PHY_CONTROL 0x00 /* Control Register */ ++#define PHY_STATUS 0x01 /* Status Register */ ++#define PHY_ID1 0x02 /* Phy Id Reg (word 1) */ ++#define PHY_ID2 0x03 /* Phy Id Reg (word 2) */ ++#define PHY_AUTONEG_ADV 0x04 /* Autoneg Advertisement */ ++#define PHY_LP_ABILITY 0x05 /* Link Partner Ability (Base Page) */ ++#define PHY_AUTONEG_EXP 0x06 /* Autoneg Expansion Reg */ ++#define PHY_NEXT_PAGE_TX 0x07 /* Next Page Tx */ ++#define PHY_LP_NEXT_PAGE 0x08 /* Link Partner Next Page */ ++#define PHY_1000T_CTRL 0x09 /* 1000Base-T Control Reg */ ++#define PHY_1000T_STATUS 0x0A /* 1000Base-T Status Reg */ ++#define PHY_EXT_STATUS 0x0F /* Extended Status Reg */ ++ ++/* NVM Control */ ++#define E1000_EECD_SK 0x00000001 /* NVM Clock */ ++#define E1000_EECD_CS 0x00000002 /* NVM Chip Select */ ++#define E1000_EECD_DI 0x00000004 /* NVM Data In */ ++#define E1000_EECD_DO 0x00000008 /* NVM Data Out */ ++#define E1000_EECD_FWE_MASK 0x00000030 ++#define E1000_EECD_FWE_DIS 0x00000010 /* Disable FLASH writes */ ++#define E1000_EECD_FWE_EN 0x00000020 /* Enable FLASH writes */ ++#define E1000_EECD_FWE_SHIFT 4 ++#define E1000_EECD_REQ 0x00000040 /* NVM Access Request */ ++#define E1000_EECD_GNT 0x00000080 /* NVM Access Grant */ ++#define E1000_EECD_PRES 0x00000100 /* NVM Present */ ++#define E1000_EECD_SIZE 0x00000200 /* NVM Size (0=64 word 1=256 word) */ ++/* NVM Addressing bits based on type 0=small, 1=large */ ++#define E1000_EECD_ADDR_BITS 0x00000400 ++#define E1000_EECD_TYPE 0x00002000 /* NVM Type (1-SPI, 0-Microwire) */ ++#define E1000_NVM_GRANT_ATTEMPTS 1000 /* NVM # attempts to gain grant */ ++#define E1000_EECD_AUTO_RD 0x00000200 /* NVM Auto Read done */ ++#define E1000_EECD_SIZE_EX_MASK 0x00007800 /* NVM Size */ ++#define E1000_EECD_SIZE_EX_SHIFT 11 ++#define E1000_EECD_NVADDS 0x00018000 /* NVM Address Size */ ++#define E1000_EECD_SELSHAD 0x00020000 /* Select Shadow RAM */ ++#define E1000_EECD_INITSRAM 0x00040000 /* Initialize Shadow RAM */ ++#define E1000_EECD_FLUPD 0x00080000 /* Update FLASH */ ++#define E1000_EECD_AUPDEN 0x00100000 /* Enable Autonomous FLASH update */ ++#define E1000_EECD_SHADV 0x00200000 /* Shadow RAM Data Valid */ ++#define E1000_EECD_SEC1VAL 0x00400000 /* Sector One Valid */ ++#define E1000_EECD_SECVAL_SHIFT 22 ++#define E1000_EECD_SEC1VAL_VALID_MASK (E1000_EECD_AUTO_RD | E1000_EECD_PRES) ++ ++#define E1000_NVM_SWDPIN0 0x0001 /* SWDPIN 0 NVM Value */ ++#define E1000_NVM_LED_LOGIC 0x0020 /* Led Logic Word */ ++#define E1000_NVM_RW_REG_DATA 16 /* Offset to data in NVM read/write regs */ ++#define E1000_NVM_RW_REG_DONE 2 /* Offset to READ/WRITE done bit */ ++#define E1000_NVM_RW_REG_START 1 /* Start operation */ ++#define E1000_NVM_RW_ADDR_SHIFT 2 /* Shift to the address bits */ ++#define E1000_NVM_POLL_WRITE 1 /* Flag for polling for write complete */ ++#define E1000_NVM_POLL_READ 0 /* Flag for polling for read complete */ ++#define E1000_FLASH_UPDATES 2000 ++ ++/* NVM Word Offsets */ ++#define NVM_COMPAT 0x0003 ++#define NVM_ID_LED_SETTINGS 0x0004 ++#define NVM_VERSION 0x0005 ++#define NVM_SERDES_AMPLITUDE 0x0006 /* SERDES output amplitude */ ++#define NVM_PHY_CLASS_WORD 0x0007 ++#define NVM_INIT_CONTROL1_REG 0x000A ++#define NVM_INIT_CONTROL2_REG 0x000F ++#define NVM_SWDEF_PINS_CTRL_PORT_1 0x0010 ++#define NVM_INIT_CONTROL3_PORT_B 0x0014 ++#define NVM_INIT_3GIO_3 0x001A ++#define NVM_SWDEF_PINS_CTRL_PORT_0 0x0020 ++#define NVM_INIT_CONTROL3_PORT_A 0x0024 ++#define NVM_CFG 0x0012 ++#define NVM_FLASH_VERSION 0x0032 ++#define NVM_ALT_MAC_ADDR_PTR 0x0037 ++#define NVM_CHECKSUM_REG 0x003F ++ ++#define E1000_NVM_CFG_DONE_PORT_0 0x40000 /* MNG config cycle done */ ++#define E1000_NVM_CFG_DONE_PORT_1 0x80000 /* ...for second port */ ++ ++/* Mask bits for fields in Word 0x0f of the NVM */ ++#define NVM_WORD0F_PAUSE_MASK 0x3000 ++#define NVM_WORD0F_PAUSE 0x1000 ++#define NVM_WORD0F_ASM_DIR 0x2000 ++#define NVM_WORD0F_ANE 0x0800 ++#define NVM_WORD0F_SWPDIO_EXT_MASK 0x00F0 ++#define NVM_WORD0F_LPLU 0x0001 ++ ++/* Mask bits for fields in Word 0x1a of the NVM */ ++#define NVM_WORD1A_ASPM_MASK 0x000C ++ ++/* For checksumming, the sum of all words in the NVM should equal 0xBABA. */ ++#define NVM_SUM 0xBABA ++ ++#define NVM_MAC_ADDR_OFFSET 0 ++#define NVM_PBA_OFFSET_0 8 ++#define NVM_PBA_OFFSET_1 9 ++#define NVM_RESERVED_WORD 0xFFFF ++#define NVM_PHY_CLASS_A 0x8000 ++#define NVM_SERDES_AMPLITUDE_MASK 0x000F ++#define NVM_SIZE_MASK 0x1C00 ++#define NVM_SIZE_SHIFT 10 ++#define NVM_WORD_SIZE_BASE_SHIFT 6 ++#define NVM_SWDPIO_EXT_SHIFT 4 ++ ++/* NVM Commands - SPI */ ++#define NVM_MAX_RETRY_SPI 5000 /* Max wait of 5ms, for RDY signal */ ++#define NVM_READ_OPCODE_SPI 0x03 /* NVM read opcode */ ++#define NVM_WRITE_OPCODE_SPI 0x02 /* NVM write opcode */ ++#define NVM_A8_OPCODE_SPI 0x08 /* opcode bit-3 = address bit-8 */ ++#define NVM_WREN_OPCODE_SPI 0x06 /* NVM set Write Enable latch */ ++#define NVM_WRDI_OPCODE_SPI 0x04 /* NVM reset Write Enable latch */ ++#define NVM_RDSR_OPCODE_SPI 0x05 /* NVM read Status register */ ++#define NVM_WRSR_OPCODE_SPI 0x01 /* NVM write Status register */ ++ ++/* SPI NVM Status Register */ ++#define NVM_STATUS_RDY_SPI 0x01 ++#define NVM_STATUS_WEN_SPI 0x02 ++#define NVM_STATUS_BP0_SPI 0x04 ++#define NVM_STATUS_BP1_SPI 0x08 ++#define NVM_STATUS_WPEN_SPI 0x80 ++ ++/* Word definitions for ID LED Settings */ ++#define ID_LED_RESERVED_0000 0x0000 ++#define ID_LED_RESERVED_FFFF 0xFFFF ++#define ID_LED_DEFAULT ((ID_LED_OFF1_ON2 << 12) | \ ++ (ID_LED_OFF1_OFF2 << 8) | \ ++ (ID_LED_DEF1_DEF2 << 4) | \ ++ (ID_LED_DEF1_DEF2)) ++#define ID_LED_DEF1_DEF2 0x1 ++#define ID_LED_DEF1_ON2 0x2 ++#define ID_LED_DEF1_OFF2 0x3 ++#define ID_LED_ON1_DEF2 0x4 ++#define ID_LED_ON1_ON2 0x5 ++#define ID_LED_ON1_OFF2 0x6 ++#define ID_LED_OFF1_DEF2 0x7 ++#define ID_LED_OFF1_ON2 0x8 ++#define ID_LED_OFF1_OFF2 0x9 ++ ++#define IGP_ACTIVITY_LED_MASK 0xFFFFF0FF ++#define IGP_ACTIVITY_LED_ENABLE 0x0300 ++#define IGP_LED3_MODE 0x07000000 ++ ++/* PCI/PCI-X/PCI-EX Config space */ ++#define PCI_HEADER_TYPE_REGISTER 0x0E ++#define PCIE_LINK_STATUS 0x12 ++ ++#define PCI_HEADER_TYPE_MULTIFUNC 0x80 ++#define PCIE_LINK_WIDTH_MASK 0x3F0 ++#define PCIE_LINK_WIDTH_SHIFT 4 ++ ++#ifndef ETH_ADDR_LEN ++#define ETH_ADDR_LEN 6 ++#endif ++ ++#define PHY_REVISION_MASK 0xFFFFFFF0 ++#define MAX_PHY_REG_ADDRESS 0x1F /* 5 bit address bus (0-0x1F) */ ++#define MAX_PHY_MULTI_PAGE_REG 0xF ++ ++/* Bit definitions for valid PHY IDs. */ ++/* ++ * I = Integrated ++ * E = External ++ */ ++#define M88E1000_E_PHY_ID 0x01410C50 ++#define M88E1000_I_PHY_ID 0x01410C30 ++#define M88E1011_I_PHY_ID 0x01410C20 ++#define IGP01E1000_I_PHY_ID 0x02A80380 ++#define M88E1011_I_REV_4 0x04 ++#define M88E1111_I_PHY_ID 0x01410CC0 ++#define GG82563_E_PHY_ID 0x01410CA0 ++#define IGP03E1000_E_PHY_ID 0x02A80390 ++#define IFE_E_PHY_ID 0x02A80330 ++#define IFE_PLUS_E_PHY_ID 0x02A80320 ++#define IFE_C_E_PHY_ID 0x02A80310 ++#define BME1000_E_PHY_ID 0x01410CB0 ++#define BME1000_E_PHY_ID_R2 0x01410CB1 ++#define M88_VENDOR 0x0141 ++ ++/* M88E1000 Specific Registers */ ++#define M88E1000_PHY_SPEC_CTRL 0x10 /* PHY Specific Control Register */ ++#define M88E1000_PHY_SPEC_STATUS 0x11 /* PHY Specific Status Register */ ++#define M88E1000_INT_ENABLE 0x12 /* Interrupt Enable Register */ ++#define M88E1000_INT_STATUS 0x13 /* Interrupt Status Register */ ++#define M88E1000_EXT_PHY_SPEC_CTRL 0x14 /* Extended PHY Specific Control */ ++#define M88E1000_RX_ERR_CNTR 0x15 /* Receive Error Counter */ ++ ++#define M88E1000_PHY_EXT_CTRL 0x1A /* PHY extend control register */ ++#define M88E1000_PHY_PAGE_SELECT 0x1D /* Reg 29 for page number setting */ ++#define M88E1000_PHY_GEN_CONTROL 0x1E /* Its meaning depends on reg 29 */ ++#define M88E1000_PHY_VCO_REG_BIT8 0x100 /* Bits 8 & 11 are adjusted for */ ++#define M88E1000_PHY_VCO_REG_BIT11 0x800 /* improved BER performance */ ++ ++/* M88E1000 PHY Specific Control Register */ ++#define M88E1000_PSCR_JABBER_DISABLE 0x0001 /* 1=Jabber Function disabled */ ++#define M88E1000_PSCR_POLARITY_REVERSAL 0x0002 /* 1=Polarity Reversal enabled */ ++#define M88E1000_PSCR_SQE_TEST 0x0004 /* 1=SQE Test enabled */ ++/* 1=CLK125 low, 0=CLK125 toggling */ ++#define M88E1000_PSCR_CLK125_DISABLE 0x0010 ++#define M88E1000_PSCR_MDI_MANUAL_MODE 0x0000 /* MDI Crossover Mode bits 6:5 */ ++ /* Manual MDI configuration */ ++#define M88E1000_PSCR_MDIX_MANUAL_MODE 0x0020 /* Manual MDIX configuration */ ++/* 1000BASE-T: Auto crossover, 100BASE-TX/10BASE-T: MDI Mode */ ++#define M88E1000_PSCR_AUTO_X_1000T 0x0040 ++/* Auto crossover enabled all speeds */ ++#define M88E1000_PSCR_AUTO_X_MODE 0x0060 ++/* ++ * 1=Enable Extended 10BASE-T distance (Lower 10BASE-T Rx Threshold ++ * 0=Normal 10BASE-T Rx Threshold ++ */ ++#define M88E1000_PSCR_EN_10BT_EXT_DIST 0x0080 ++/* 1=5-bit interface in 100BASE-TX, 0=MII interface in 100BASE-TX */ ++#define M88E1000_PSCR_MII_5BIT_ENABLE 0x0100 ++#define M88E1000_PSCR_SCRAMBLER_DISABLE 0x0200 /* 1=Scrambler disable */ ++#define M88E1000_PSCR_FORCE_LINK_GOOD 0x0400 /* 1=Force link good */ ++#define M88E1000_PSCR_ASSERT_CRS_ON_TX 0x0800 /* 1=Assert CRS on Transmit */ ++ ++/* M88E1000 PHY Specific Status Register */ ++#define M88E1000_PSSR_JABBER 0x0001 /* 1=Jabber */ ++#define M88E1000_PSSR_REV_POLARITY 0x0002 /* 1=Polarity reversed */ ++#define M88E1000_PSSR_DOWNSHIFT 0x0020 /* 1=Downshifted */ ++#define M88E1000_PSSR_MDIX 0x0040 /* 1=MDIX; 0=MDI */ ++/* ++ * 0 = <50M ++ * 1 = 50-80M ++ * 2 = 80-110M ++ * 3 = 110-140M ++ * 4 = >140M ++ */ ++#define M88E1000_PSSR_CABLE_LENGTH 0x0380 ++#define M88E1000_PSSR_LINK 0x0400 /* 1=Link up, 0=Link down */ ++#define M88E1000_PSSR_SPD_DPLX_RESOLVED 0x0800 /* 1=Speed & Duplex resolved */ ++#define M88E1000_PSSR_PAGE_RCVD 0x1000 /* 1=Page received */ ++#define M88E1000_PSSR_DPLX 0x2000 /* 1=Duplex 0=Half Duplex */ ++#define M88E1000_PSSR_SPEED 0xC000 /* Speed, bits 14:15 */ ++#define M88E1000_PSSR_10MBS 0x0000 /* 00=10Mbs */ ++#define M88E1000_PSSR_100MBS 0x4000 /* 01=100Mbs */ ++#define M88E1000_PSSR_1000MBS 0x8000 /* 10=1000Mbs */ ++ ++#define M88E1000_PSSR_CABLE_LENGTH_SHIFT 7 ++ ++/* M88E1000 Extended PHY Specific Control Register */ ++#define M88E1000_EPSCR_FIBER_LOOPBACK 0x4000 /* 1=Fiber loopback */ ++/* ++ * 1 = Lost lock detect enabled. ++ * Will assert lost lock and bring ++ * link down if idle not seen ++ * within 1ms in 1000BASE-T ++ */ ++#define M88E1000_EPSCR_DOWN_NO_IDLE 0x8000 ++/* ++ * Number of times we will attempt to autonegotiate before downshifting if we ++ * are the master ++ */ ++#define M88E1000_EPSCR_MASTER_DOWNSHIFT_MASK 0x0C00 ++#define M88E1000_EPSCR_MASTER_DOWNSHIFT_1X 0x0000 ++#define M88E1000_EPSCR_MASTER_DOWNSHIFT_2X 0x0400 ++#define M88E1000_EPSCR_MASTER_DOWNSHIFT_3X 0x0800 ++#define M88E1000_EPSCR_MASTER_DOWNSHIFT_4X 0x0C00 ++/* ++ * Number of times we will attempt to autonegotiate before downshifting if we ++ * are the slave ++ */ ++#define M88E1000_EPSCR_SLAVE_DOWNSHIFT_MASK 0x0300 ++#define M88E1000_EPSCR_SLAVE_DOWNSHIFT_DIS 0x0000 ++#define M88E1000_EPSCR_SLAVE_DOWNSHIFT_1X 0x0100 ++#define M88E1000_EPSCR_SLAVE_DOWNSHIFT_2X 0x0200 ++#define M88E1000_EPSCR_SLAVE_DOWNSHIFT_3X 0x0300 ++#define M88E1000_EPSCR_TX_CLK_2_5 0x0060 /* 2.5 MHz TX_CLK */ ++#define M88E1000_EPSCR_TX_CLK_25 0x0070 /* 25 MHz TX_CLK */ ++#define M88E1000_EPSCR_TX_CLK_0 0x0000 /* NO TX_CLK */ ++ ++/* M88EC018 Rev 2 specific DownShift settings */ ++#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_MASK 0x0E00 ++#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_1X 0x0000 ++#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_2X 0x0200 ++#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_3X 0x0400 ++#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_4X 0x0600 ++#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_5X 0x0800 ++#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_6X 0x0A00 ++#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_7X 0x0C00 ++#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_8X 0x0E00 ++ ++/* BME1000 PHY Specific Control Register */ ++#define BME1000_PSCR_ENABLE_DOWNSHIFT 0x0800 /* 1 = enable downshift */ ++ ++/* ++ * Bits... ++ * 15-5: page ++ * 4-0: register offset ++ */ ++#define GG82563_PAGE_SHIFT 5 ++#define GG82563_REG(page, reg) \ ++ (((page) << GG82563_PAGE_SHIFT) | ((reg) & MAX_PHY_REG_ADDRESS)) ++#define GG82563_MIN_ALT_REG 30 ++ ++/* GG82563 Specific Registers */ ++#define GG82563_PHY_SPEC_CTRL \ ++ GG82563_REG(0, 16) /* PHY Specific Control */ ++#define GG82563_PHY_SPEC_STATUS \ ++ GG82563_REG(0, 17) /* PHY Specific Status */ ++#define GG82563_PHY_INT_ENABLE \ ++ GG82563_REG(0, 18) /* Interrupt Enable */ ++#define GG82563_PHY_SPEC_STATUS_2 \ ++ GG82563_REG(0, 19) /* PHY Specific Status 2 */ ++#define GG82563_PHY_RX_ERR_CNTR \ ++ GG82563_REG(0, 21) /* Receive Error Counter */ ++#define GG82563_PHY_PAGE_SELECT \ ++ GG82563_REG(0, 22) /* Page Select */ ++#define GG82563_PHY_SPEC_CTRL_2 \ ++ GG82563_REG(0, 26) /* PHY Specific Control 2 */ ++#define GG82563_PHY_PAGE_SELECT_ALT \ ++ GG82563_REG(0, 29) /* Alternate Page Select */ ++#define GG82563_PHY_TEST_CLK_CTRL \ ++ GG82563_REG(0, 30) /* Test Clock Control (use reg. 29 to select) */ ++ ++#define GG82563_PHY_MAC_SPEC_CTRL \ ++ GG82563_REG(2, 21) /* MAC Specific Control Register */ ++#define GG82563_PHY_MAC_SPEC_CTRL_2 \ ++ GG82563_REG(2, 26) /* MAC Specific Control 2 */ ++ ++#define GG82563_PHY_DSP_DISTANCE \ ++ GG82563_REG(5, 26) /* DSP Distance */ ++ ++/* Page 193 - Port Control Registers */ ++#define GG82563_PHY_KMRN_MODE_CTRL \ ++ GG82563_REG(193, 16) /* Kumeran Mode Control */ ++#define GG82563_PHY_PORT_RESET \ ++ GG82563_REG(193, 17) /* Port Reset */ ++#define GG82563_PHY_REVISION_ID \ ++ GG82563_REG(193, 18) /* Revision ID */ ++#define GG82563_PHY_DEVICE_ID \ ++ GG82563_REG(193, 19) /* Device ID */ ++#define GG82563_PHY_PWR_MGMT_CTRL \ ++ GG82563_REG(193, 20) /* Power Management Control */ ++#define GG82563_PHY_RATE_ADAPT_CTRL \ ++ GG82563_REG(193, 25) /* Rate Adaptation Control */ ++ ++/* Page 194 - KMRN Registers */ ++#define GG82563_PHY_KMRN_FIFO_CTRL_STAT \ ++ GG82563_REG(194, 16) /* FIFO's Control/Status */ ++#define GG82563_PHY_KMRN_CTRL \ ++ GG82563_REG(194, 17) /* Control */ ++#define GG82563_PHY_INBAND_CTRL \ ++ GG82563_REG(194, 18) /* Inband Control */ ++#define GG82563_PHY_KMRN_DIAGNOSTIC \ ++ GG82563_REG(194, 19) /* Diagnostic */ ++#define GG82563_PHY_ACK_TIMEOUTS \ ++ GG82563_REG(194, 20) /* Acknowledge Timeouts */ ++#define GG82563_PHY_ADV_ABILITY \ ++ GG82563_REG(194, 21) /* Advertised Ability */ ++#define GG82563_PHY_LINK_PARTNER_ADV_ABILITY \ ++ GG82563_REG(194, 23) /* Link Partner Advertised Ability */ ++#define GG82563_PHY_ADV_NEXT_PAGE \ ++ GG82563_REG(194, 24) /* Advertised Next Page */ ++#define GG82563_PHY_LINK_PARTNER_ADV_NEXT_PAGE \ ++ GG82563_REG(194, 25) /* Link Partner Advertised Next page */ ++#define GG82563_PHY_KMRN_MISC \ ++ GG82563_REG(194, 26) /* Misc. */ ++ ++/* MDI Control */ ++#define E1000_MDIC_DATA_MASK 0x0000FFFF ++#define E1000_MDIC_REG_MASK 0x001F0000 ++#define E1000_MDIC_REG_SHIFT 16 ++#define E1000_MDIC_PHY_MASK 0x03E00000 ++#define E1000_MDIC_PHY_SHIFT 21 ++#define E1000_MDIC_OP_WRITE 0x04000000 ++#define E1000_MDIC_OP_READ 0x08000000 ++#define E1000_MDIC_READY 0x10000000 ++#define E1000_MDIC_INT_EN 0x20000000 ++#define E1000_MDIC_ERROR 0x40000000 ++ ++/* SerDes Control */ ++#define E1000_GEN_CTL_READY 0x80000000 ++#define E1000_GEN_CTL_ADDRESS_SHIFT 8 ++#define E1000_GEN_POLL_TIMEOUT 640 ++ ++#endif /* _E1000_DEFINES_H_ */ +diff -r bd70f2f305c6 drivers/net/e1000e/e1000_hw.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/e1000e/e1000_hw.h Mon Jun 15 11:45:35 2009 +0100 +@@ -0,0 +1,671 @@ ++/******************************************************************************* ++ ++ Intel PRO/1000 Linux driver ++ Copyright(c) 1999 - 2008 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ Linux NICS ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++#ifndef _E1000_HW_H_ ++#define _E1000_HW_H_ ++ ++#include "e1000_osdep.h" ++#include "e1000_regs.h" ++#include "e1000_defines.h" ++ ++struct e1000_hw; ++ ++#define E1000_DEV_ID_82571EB_COPPER 0x105E ++#define E1000_DEV_ID_82571EB_FIBER 0x105F ++#define E1000_DEV_ID_82571EB_SERDES 0x1060 ++#define E1000_DEV_ID_82571EB_SERDES_DUAL 0x10D9 ++#define E1000_DEV_ID_82571EB_SERDES_QUAD 0x10DA ++#define E1000_DEV_ID_82571EB_QUAD_COPPER 0x10A4 ++#define E1000_DEV_ID_82571PT_QUAD_COPPER 0x10D5 ++#define E1000_DEV_ID_82571EB_QUAD_FIBER 0x10A5 ++#define E1000_DEV_ID_82571EB_QUAD_COPPER_LP 0x10BC ++#define E1000_DEV_ID_82572EI_COPPER 0x107D ++#define E1000_DEV_ID_82572EI_FIBER 0x107E ++#define E1000_DEV_ID_82572EI_SERDES 0x107F ++#define E1000_DEV_ID_82572EI 0x10B9 ++#define E1000_DEV_ID_82573E 0x108B ++#define E1000_DEV_ID_82573E_IAMT 0x108C ++#define E1000_DEV_ID_82573L 0x109A ++#define E1000_DEV_ID_82574L 0x10D3 ++#define E1000_DEV_ID_80003ES2LAN_COPPER_DPT 0x1096 ++#define E1000_DEV_ID_80003ES2LAN_SERDES_DPT 0x1098 ++#define E1000_DEV_ID_80003ES2LAN_COPPER_SPT 0x10BA ++#define E1000_DEV_ID_80003ES2LAN_SERDES_SPT 0x10BB ++#define E1000_DEV_ID_ICH8_IGP_M_AMT 0x1049 ++#define E1000_DEV_ID_ICH8_IGP_AMT 0x104A ++#define E1000_DEV_ID_ICH8_IGP_C 0x104B ++#define E1000_DEV_ID_ICH8_IFE 0x104C ++#define E1000_DEV_ID_ICH8_IFE_GT 0x10C4 ++#define E1000_DEV_ID_ICH8_IFE_G 0x10C5 ++#define E1000_DEV_ID_ICH8_IGP_M 0x104D ++#define E1000_DEV_ID_ICH9_IGP_M 0x10BF ++#define E1000_DEV_ID_ICH9_IGP_M_AMT 0x10F5 ++#define E1000_DEV_ID_ICH9_IGP_M_V 0x10CB ++#define E1000_DEV_ID_ICH9_IGP_AMT 0x10BD ++#define E1000_DEV_ID_ICH9_BM 0x10E5 ++#define E1000_DEV_ID_ICH9_IGP_C 0x294C ++#define E1000_DEV_ID_ICH9_IFE 0x10C0 ++#define E1000_DEV_ID_ICH9_IFE_GT 0x10C3 ++#define E1000_DEV_ID_ICH9_IFE_G 0x10C2 ++#define E1000_DEV_ID_ICH10_R_BM_LM 0x10CC ++#define E1000_DEV_ID_ICH10_R_BM_LF 0x10CD ++#define E1000_DEV_ID_ICH10_R_BM_V 0x10CE ++#define E1000_DEV_ID_ICH10_D_BM_LM 0x10DE ++#define E1000_DEV_ID_ICH10_D_BM_LF 0x10DF ++ ++#define E1000_REVISION_0 0 ++#define E1000_REVISION_1 1 ++#define E1000_REVISION_2 2 ++#define E1000_REVISION_3 3 ++#define E1000_REVISION_4 4 ++ ++#define E1000_FUNC_0 0 ++#define E1000_FUNC_1 1 ++ ++typedef enum { ++ e1000_undefined = 0, ++ e1000_82571, ++ e1000_82572, ++ e1000_82573, ++ e1000_82574, ++ e1000_80003es2lan, ++ e1000_ich8lan, ++ e1000_ich9lan, ++ e1000_ich10lan, ++ e1000_num_macs /* List is 1-based, so subtract 1 for true count. */ ++} e1000_mac_type; ++ ++typedef enum { ++ e1000_media_type_unknown = 0, ++ e1000_media_type_copper = 1, ++ e1000_media_type_fiber = 2, ++ e1000_media_type_internal_serdes = 3, ++ e1000_num_media_types ++} e1000_media_type; ++ ++typedef enum { ++ e1000_nvm_unknown = 0, ++ e1000_nvm_none, ++ e1000_nvm_eeprom_spi, ++ e1000_nvm_eeprom_microwire, ++ e1000_nvm_flash_hw, ++ e1000_nvm_flash_sw ++} e1000_nvm_type; ++ ++typedef enum { ++ e1000_nvm_override_none = 0, ++ e1000_nvm_override_spi_small, ++ e1000_nvm_override_spi_large, ++ e1000_nvm_override_microwire_small, ++ e1000_nvm_override_microwire_large ++} e1000_nvm_override; ++ ++typedef enum { ++ e1000_phy_unknown = 0, ++ e1000_phy_none, ++ e1000_phy_m88, ++ e1000_phy_igp, ++ e1000_phy_igp_2, ++ e1000_phy_gg82563, ++ e1000_phy_igp_3, ++ e1000_phy_ife, ++ e1000_phy_bm, ++} e1000_phy_type; ++ ++typedef enum { ++ e1000_bus_type_unknown = 0, ++ e1000_bus_type_pci, ++ e1000_bus_type_pcix, ++ e1000_bus_type_pci_express, ++ e1000_bus_type_reserved ++} e1000_bus_type; ++ ++typedef enum { ++ e1000_bus_speed_unknown = 0, ++ e1000_bus_speed_33, ++ e1000_bus_speed_66, ++ e1000_bus_speed_100, ++ e1000_bus_speed_120, ++ e1000_bus_speed_133, ++ e1000_bus_speed_2500, ++ e1000_bus_speed_5000, ++ e1000_bus_speed_reserved ++} e1000_bus_speed; ++ ++typedef enum { ++ e1000_bus_width_unknown = 0, ++ e1000_bus_width_pcie_x1, ++ e1000_bus_width_pcie_x2, ++ e1000_bus_width_pcie_x4 = 4, ++ e1000_bus_width_pcie_x8 = 8, ++ e1000_bus_width_32, ++ e1000_bus_width_64, ++ e1000_bus_width_reserved ++} e1000_bus_width; ++ ++typedef enum { ++ e1000_1000t_rx_status_not_ok = 0, ++ e1000_1000t_rx_status_ok, ++ e1000_1000t_rx_status_undefined = 0xFF ++} e1000_1000t_rx_status; ++ ++typedef enum { ++ e1000_rev_polarity_normal = 0, ++ e1000_rev_polarity_reversed, ++ e1000_rev_polarity_undefined = 0xFF ++} e1000_rev_polarity; ++ ++typedef enum { ++ e1000_fc_none = 0, ++ e1000_fc_rx_pause, ++ e1000_fc_tx_pause, ++ e1000_fc_full, ++ e1000_fc_default = 0xFF ++} e1000_fc_type; ++ ++ ++/* Receive Descriptor */ ++struct e1000_rx_desc { ++ u64 buffer_addr; /* Address of the descriptor's data buffer */ ++ u16 length; /* Length of data DMAed into data buffer */ ++ u16 csum; /* Packet checksum */ ++ u8 status; /* Descriptor status */ ++ u8 errors; /* Descriptor Errors */ ++ u16 special; ++}; ++ ++/* Receive Descriptor - Extended */ ++union e1000_rx_desc_extended { ++ struct { ++ u64 buffer_addr; ++ u64 reserved; ++ } read; ++ struct { ++ struct { ++ u32 mrq; /* Multiple Rx Queues */ ++ union { ++ u32 rss; /* RSS Hash */ ++ struct { ++ u16 ip_id; /* IP id */ ++ u16 csum; /* Packet Checksum */ ++ } csum_ip; ++ } hi_dword; ++ } lower; ++ struct { ++ u32 status_error; /* ext status/error */ ++ u16 length; ++ u16 vlan; /* VLAN tag */ ++ } upper; ++ } wb; /* writeback */ ++}; ++ ++#define MAX_PS_BUFFERS 4 ++/* Receive Descriptor - Packet Split */ ++union e1000_rx_desc_packet_split { ++ struct { ++ /* one buffer for protocol header(s), three data buffers */ ++ u64 buffer_addr[MAX_PS_BUFFERS]; ++ } read; ++ struct { ++ struct { ++ u32 mrq; /* Multiple Rx Queues */ ++ union { ++ u32 rss; /* RSS Hash */ ++ struct { ++ u16 ip_id; /* IP id */ ++ u16 csum; /* Packet Checksum */ ++ } csum_ip; ++ } hi_dword; ++ } lower; ++ struct { ++ u32 status_error; /* ext status/error */ ++ u16 length0; /* length of buffer 0 */ ++ u16 vlan; /* VLAN tag */ ++ } middle; ++ struct { ++ u16 header_status; ++ u16 length[3]; /* length of buffers 1-3 */ ++ } upper; ++ u64 reserved; ++ } wb; /* writeback */ ++}; ++ ++/* Transmit Descriptor */ ++struct e1000_tx_desc { ++ u64 buffer_addr; /* Address of the descriptor's data buffer */ ++ union { ++ u32 data; ++ struct { ++ u16 length; /* Data buffer length */ ++ u8 cso; /* Checksum offset */ ++ u8 cmd; /* Descriptor control */ ++ } flags; ++ } lower; ++ union { ++ u32 data; ++ struct { ++ u8 status; /* Descriptor status */ ++ u8 css; /* Checksum start */ ++ u16 special; ++ } fields; ++ } upper; ++}; ++ ++/* Offload Context Descriptor */ ++struct e1000_context_desc { ++ union { ++ u32 ip_config; ++ struct { ++ u8 ipcss; /* IP checksum start */ ++ u8 ipcso; /* IP checksum offset */ ++ u16 ipcse; /* IP checksum end */ ++ } ip_fields; ++ } lower_setup; ++ union { ++ u32 tcp_config; ++ struct { ++ u8 tucss; /* TCP checksum start */ ++ u8 tucso; /* TCP checksum offset */ ++ u16 tucse; /* TCP checksum end */ ++ } tcp_fields; ++ } upper_setup; ++ u32 cmd_and_length; ++ union { ++ u32 data; ++ struct { ++ u8 status; /* Descriptor status */ ++ u8 hdr_len; /* Header length */ ++ u16 mss; /* Maximum segment size */ ++ } fields; ++ } tcp_seg_setup; ++}; ++ ++/* Offload data descriptor */ ++struct e1000_data_desc { ++ u64 buffer_addr; /* Address of the descriptor's buffer address */ ++ union { ++ u32 data; ++ struct { ++ u16 length; /* Data buffer length */ ++ u8 typ_len_ext; ++ u8 cmd; ++ } flags; ++ } lower; ++ union { ++ u32 data; ++ struct { ++ u8 status; /* Descriptor status */ ++ u8 popts; /* Packet Options */ ++ u16 special; ++ } fields; ++ } upper; ++}; ++ ++/* Statistics counters collected by the MAC */ ++struct e1000_hw_stats { ++ u64 crcerrs; ++ u64 algnerrc; ++ u64 symerrs; ++ u64 rxerrc; ++ u64 mpc; ++ u64 scc; ++ u64 ecol; ++ u64 mcc; ++ u64 latecol; ++ u64 colc; ++ u64 dc; ++ u64 tncrs; ++ u64 sec; ++ u64 cexterr; ++ u64 rlec; ++ u64 xonrxc; ++ u64 xontxc; ++ u64 xoffrxc; ++ u64 xofftxc; ++ u64 fcruc; ++ u64 prc64; ++ u64 prc127; ++ u64 prc255; ++ u64 prc511; ++ u64 prc1023; ++ u64 prc1522; ++ u64 gprc; ++ u64 bprc; ++ u64 mprc; ++ u64 gptc; ++ u64 gorc; ++ u64 gotc; ++ u64 rnbc; ++ u64 ruc; ++ u64 rfc; ++ u64 roc; ++ u64 rjc; ++ u64 mgprc; ++ u64 mgpdc; ++ u64 mgptc; ++ u64 tor; ++ u64 tot; ++ u64 tpr; ++ u64 tpt; ++ u64 ptc64; ++ u64 ptc127; ++ u64 ptc255; ++ u64 ptc511; ++ u64 ptc1023; ++ u64 ptc1522; ++ u64 mptc; ++ u64 bptc; ++ u64 tsctc; ++ u64 tsctfc; ++ u64 iac; ++ u64 icrxptc; ++ u64 icrxatc; ++ u64 ictxptc; ++ u64 ictxatc; ++ u64 ictxqec; ++ u64 ictxqmtc; ++ u64 icrxdmtc; ++ u64 icrxoc; ++ u64 cbtmpc; ++ u64 htdpmc; ++ u64 cbrdpc; ++ u64 cbrmpc; ++ u64 rpthc; ++ u64 hgptc; ++ u64 htcbdpc; ++ u64 hgorc; ++ u64 hgotc; ++ u64 lenerrs; ++ u64 scvpc; ++ u64 hrmpc; ++}; ++ ++struct e1000_phy_stats { ++ u32 idle_errors; ++ u32 receive_errors; ++}; ++ ++struct e1000_host_mng_dhcp_cookie { ++ u32 signature; ++ u8 status; ++ u8 reserved0; ++ u16 vlan_id; ++ u32 reserved1; ++ u16 reserved2; ++ u8 reserved3; ++ u8 checksum; ++}; ++ ++/* Host Interface "Rev 1" */ ++struct e1000_host_command_header { ++ u8 command_id; ++ u8 command_length; ++ u8 command_options; ++ u8 checksum; ++}; ++ ++#define E1000_HI_MAX_DATA_LENGTH 252 ++struct e1000_host_command_info { ++ struct e1000_host_command_header command_header; ++ u8 command_data[E1000_HI_MAX_DATA_LENGTH]; ++}; ++ ++/* Host Interface "Rev 2" */ ++struct e1000_host_mng_command_header { ++ u8 command_id; ++ u8 checksum; ++ u16 reserved1; ++ u16 reserved2; ++ u16 command_length; ++}; ++ ++#define E1000_HI_MAX_MNG_DATA_LENGTH 0x6F8 ++struct e1000_host_mng_command_info { ++ struct e1000_host_mng_command_header command_header; ++ u8 command_data[E1000_HI_MAX_MNG_DATA_LENGTH]; ++}; ++ ++#include "e1000_mac.h" ++#include "e1000_phy.h" ++#include "e1000_nvm.h" ++#include "e1000_manage.h" ++ ++struct e1000_mac_operations { ++ /* Function pointers for the MAC. */ ++ s32 (*init_params)(struct e1000_hw *); ++ s32 (*blink_led)(struct e1000_hw *); ++ s32 (*check_for_link)(struct e1000_hw *); ++ bool (*check_mng_mode)(struct e1000_hw *hw); ++ s32 (*cleanup_led)(struct e1000_hw *); ++ void (*clear_hw_cntrs)(struct e1000_hw *); ++ void (*clear_vfta)(struct e1000_hw *); ++ s32 (*get_bus_info)(struct e1000_hw *); ++ s32 (*get_link_up_info)(struct e1000_hw *, u16 *, u16 *); ++ s32 (*led_on)(struct e1000_hw *); ++ s32 (*led_off)(struct e1000_hw *); ++ void (*update_mc_addr_list)(struct e1000_hw *, u8 *, u32, u32, ++ u32); ++ void (*remove_device)(struct e1000_hw *); ++ s32 (*reset_hw)(struct e1000_hw *); ++ s32 (*init_hw)(struct e1000_hw *); ++ s32 (*setup_link)(struct e1000_hw *); ++ s32 (*setup_physical_interface)(struct e1000_hw *); ++ s32 (*setup_led)(struct e1000_hw *); ++ void (*write_vfta)(struct e1000_hw *, u32, u32); ++ void (*mta_set)(struct e1000_hw *, u32); ++ void (*config_collision_dist)(struct e1000_hw*); ++ void (*rar_set)(struct e1000_hw*, u8*, u32); ++ s32 (*read_mac_addr)(struct e1000_hw*); ++ s32 (*validate_mdi_setting)(struct e1000_hw*); ++ s32 (*mng_host_if_write)(struct e1000_hw*, u8*, u16, u16, u8*); ++ s32 (*mng_write_cmd_header)(struct e1000_hw *hw, ++ struct e1000_host_mng_command_header*); ++ s32 (*mng_enable_host_if)(struct e1000_hw*); ++ s32 (*wait_autoneg)(struct e1000_hw*); ++}; ++ ++struct e1000_phy_operations { ++ s32 (*init_params)(struct e1000_hw *); ++ s32 (*acquire)(struct e1000_hw *); ++ s32 (*cfg_on_link_up)(struct e1000_hw *); ++ s32 (*check_polarity)(struct e1000_hw *); ++ s32 (*check_reset_block)(struct e1000_hw *); ++ s32 (*commit)(struct e1000_hw *); ++ s32 (*force_speed_duplex)(struct e1000_hw *); ++ s32 (*get_cfg_done)(struct e1000_hw *hw); ++ s32 (*get_cable_length)(struct e1000_hw *); ++ s32 (*get_info)(struct e1000_hw *); ++ s32 (*read_reg)(struct e1000_hw *, u32, u16 *); ++ void (*release)(struct e1000_hw *); ++ s32 (*reset)(struct e1000_hw *); ++ s32 (*set_d0_lplu_state)(struct e1000_hw *, bool); ++ s32 (*set_d3_lplu_state)(struct e1000_hw *, bool); ++ s32 (*write_reg)(struct e1000_hw *, u32, u16); ++ void (*power_up)(struct e1000_hw *); ++ void (*power_down)(struct e1000_hw *); ++}; ++ ++struct e1000_nvm_operations { ++ s32 (*init_params)(struct e1000_hw *); ++ s32 (*acquire)(struct e1000_hw *); ++ s32 (*read)(struct e1000_hw *, u16, u16, u16 *); ++ void (*release)(struct e1000_hw *); ++ void (*reload)(struct e1000_hw *); ++ s32 (*update)(struct e1000_hw *); ++ s32 (*valid_led_default)(struct e1000_hw *, u16 *); ++ s32 (*validate)(struct e1000_hw *); ++ s32 (*write)(struct e1000_hw *, u16, u16, u16 *); ++}; ++ ++struct e1000_mac_info { ++ struct e1000_mac_operations ops; ++ u8 addr[6]; ++ u8 perm_addr[6]; ++ ++ e1000_mac_type type; ++ ++ u32 collision_delta; ++ u32 ledctl_default; ++ u32 ledctl_mode1; ++ u32 ledctl_mode2; ++ u32 mc_filter_type; ++ u32 tx_packet_delta; ++ u32 txcw; ++ ++ u16 current_ifs_val; ++ u16 ifs_max_val; ++ u16 ifs_min_val; ++ u16 ifs_ratio; ++ u16 ifs_step_size; ++ u16 mta_reg_count; ++ u16 rar_entry_count; ++ ++ u8 forced_speed_duplex; ++ ++ bool adaptive_ifs; ++ bool arc_subsystem_valid; ++ bool asf_firmware_present; ++ bool autoneg; ++ bool autoneg_failed; ++ bool disable_av; ++ bool disable_hw_init_bits; ++ bool get_link_status; ++ bool ifs_params_forced; ++ bool in_ifs_mode; ++ bool report_tx_early; ++ bool serdes_has_link; ++ bool tx_pkt_filtering; ++}; ++ ++struct e1000_phy_info { ++ struct e1000_phy_operations ops; ++ e1000_phy_type type; ++ ++ e1000_1000t_rx_status local_rx; ++ e1000_1000t_rx_status remote_rx; ++ e1000_ms_type ms_type; ++ e1000_ms_type original_ms_type; ++ e1000_rev_polarity cable_polarity; ++ e1000_smart_speed smart_speed; ++ ++ u32 addr; ++ u32 id; ++ u32 reset_delay_us; /* in usec */ ++ u32 revision; ++ ++ e1000_media_type media_type; ++ ++ u16 autoneg_advertised; ++ u16 autoneg_mask; ++ u16 cable_length; ++ u16 max_cable_length; ++ u16 min_cable_length; ++ ++ u8 mdix; ++ ++ bool disable_polarity_correction; ++ bool is_mdix; ++ bool polarity_correction; ++ bool reset_disable; ++ bool speed_downgraded; ++ bool autoneg_wait_to_complete; ++}; ++ ++struct e1000_nvm_info { ++ struct e1000_nvm_operations ops; ++ e1000_nvm_type type; ++ e1000_nvm_override override; ++ ++ u32 flash_bank_size; ++ u32 flash_base_addr; ++ u32 semaphore_delay; ++ ++ u16 word_size; ++ u16 delay_usec; ++ u16 address_bits; ++ u16 opcode_bits; ++ u16 page_size; ++}; ++ ++struct e1000_bus_info { ++ e1000_bus_type type; ++ e1000_bus_speed speed; ++ e1000_bus_width width; ++ ++ u32 snoop; ++ ++ u16 func; ++ u16 pci_cmd_word; ++}; ++ ++struct e1000_fc_info { ++ u32 high_water; /* Flow control high-water mark */ ++ u32 low_water; /* Flow control low-water mark */ ++ u16 pause_time; /* Flow control pause timer */ ++ bool send_xon; /* Flow control send XON */ ++ bool strict_ieee; /* Strict IEEE mode */ ++ e1000_fc_type type; /* Type of flow control */ ++ e1000_fc_type original_type; ++}; ++ ++struct e1000_hw { ++ void *back; ++ void *dev_spec; ++ ++ u8 __iomem *hw_addr; ++ u8 __iomem *flash_address; ++ unsigned long io_base; ++ ++ struct e1000_mac_info mac; ++ struct e1000_fc_info fc; ++ struct e1000_phy_info phy; ++ struct e1000_nvm_info nvm; ++ struct e1000_bus_info bus; ++ struct e1000_host_mng_dhcp_cookie mng_cookie; ++ ++ u32 dev_spec_size; ++ ++ u16 device_id; ++ u16 subsystem_vendor_id; ++ u16 subsystem_device_id; ++ u16 vendor_id; ++ ++ u8 revision_id; ++}; ++ ++#include "e1000_82571.h" ++#include "e1000_80003es2lan.h" ++#include "e1000_ich8lan.h" ++ ++/* These functions must be implemented by drivers */ ++s32 e1000_alloc_zeroed_dev_spec_struct(struct e1000_hw *hw, u32 size); ++s32 e1000_read_pcie_cap_reg(struct e1000_hw *hw, u32 reg, u16 *value); ++void e1000_free_dev_spec_struct(struct e1000_hw *hw); ++void e1000_read_pci_cfg(struct e1000_hw *hw, u32 reg, u16 *value); ++ ++#endif +diff -r bd70f2f305c6 drivers/net/e1000e/e1000_ich8lan.c +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/e1000e/e1000_ich8lan.c Mon Jun 15 11:45:35 2009 +0100 +@@ -0,0 +1,2720 @@ ++/******************************************************************************* ++ ++ Intel PRO/1000 Linux driver ++ Copyright(c) 1999 - 2009 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ Linux NICS ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++/* ++ * 82562G 10/100 Network Connection ++ * 82562G-2 10/100 Network Connection ++ * 82562GT 10/100 Network Connection ++ * 82562GT-2 10/100 Network Connection ++ * 82562V 10/100 Network Connection ++ * 82562V-2 10/100 Network Connection ++ * 82566DC-2 Gigabit Network Connection ++ * 82566DC Gigabit Network Connection ++ * 82566DM-2 Gigabit Network Connection ++ * 82566DM Gigabit Network Connection ++ * 82566MC Gigabit Network Connection ++ * 82566MM Gigabit Network Connection ++ * 82567LM Gigabit Network Connection ++ * 82567LF Gigabit Network Connection ++ * 82567V Gigabit Network Connection ++ * 82567LM-2 Gigabit Network Connection ++ * 82567LF-2 Gigabit Network Connection ++ * 82567V-2 Gigabit Network Connection ++ * 82567LF-3 Gigabit Network Connection ++ * 82567LM-3 Gigabit Network Connection ++ * 82567LM-4 Gigabit Network Connection ++ */ ++ ++#include "e1000.h" ++ ++static s32 e1000_init_phy_params_ich8lan(struct e1000_hw *hw); ++static s32 e1000_init_nvm_params_ich8lan(struct e1000_hw *hw); ++static s32 e1000_init_mac_params_ich8lan(struct e1000_hw *hw); ++static s32 e1000_acquire_swflag_ich8lan(struct e1000_hw *hw); ++static void e1000_release_swflag_ich8lan(struct e1000_hw *hw); ++static bool e1000_check_mng_mode_ich8lan(struct e1000_hw *hw); ++static s32 e1000_check_polarity_ife_ich8lan(struct e1000_hw *hw); ++static s32 e1000_check_reset_block_ich8lan(struct e1000_hw *hw); ++static s32 e1000_phy_force_speed_duplex_ich8lan(struct e1000_hw *hw); ++static s32 e1000_phy_hw_reset_ich8lan(struct e1000_hw *hw); ++static s32 e1000_get_phy_info_ich8lan(struct e1000_hw *hw); ++static s32 e1000_set_d0_lplu_state_ich8lan(struct e1000_hw *hw, ++ bool active); ++static s32 e1000_set_d3_lplu_state_ich8lan(struct e1000_hw *hw, ++ bool active); ++static s32 e1000_read_nvm_ich8lan(struct e1000_hw *hw, u16 offset, ++ u16 words, u16 *data); ++static s32 e1000_write_nvm_ich8lan(struct e1000_hw *hw, u16 offset, ++ u16 words, u16 *data); ++static s32 e1000_validate_nvm_checksum_ich8lan(struct e1000_hw *hw); ++static s32 e1000_update_nvm_checksum_ich8lan(struct e1000_hw *hw); ++static s32 e1000_valid_led_default_ich8lan(struct e1000_hw *hw, ++ u16 *data); ++static s32 e1000_get_bus_info_ich8lan(struct e1000_hw *hw); ++static s32 e1000_reset_hw_ich8lan(struct e1000_hw *hw); ++static s32 e1000_init_hw_ich8lan(struct e1000_hw *hw); ++static s32 e1000_setup_link_ich8lan(struct e1000_hw *hw); ++static s32 e1000_setup_copper_link_ich8lan(struct e1000_hw *hw); ++static s32 e1000_get_link_up_info_ich8lan(struct e1000_hw *hw, ++ u16 *speed, u16 *duplex); ++static s32 e1000_cleanup_led_ich8lan(struct e1000_hw *hw); ++static s32 e1000_led_on_ich8lan(struct e1000_hw *hw); ++static s32 e1000_led_off_ich8lan(struct e1000_hw *hw); ++static void e1000_clear_hw_cntrs_ich8lan(struct e1000_hw *hw); ++static s32 e1000_erase_flash_bank_ich8lan(struct e1000_hw *hw, u32 bank); ++static s32 e1000_flash_cycle_ich8lan(struct e1000_hw *hw, u32 timeout); ++static s32 e1000_flash_cycle_init_ich8lan(struct e1000_hw *hw); ++static s32 e1000_get_phy_info_ife_ich8lan(struct e1000_hw *hw); ++static void e1000_initialize_hw_bits_ich8lan(struct e1000_hw *hw); ++static s32 e1000_kmrn_lock_loss_workaround_ich8lan(struct e1000_hw *hw); ++static s32 e1000_read_flash_byte_ich8lan(struct e1000_hw *hw, ++ u32 offset, u8 *data); ++static s32 e1000_read_flash_data_ich8lan(struct e1000_hw *hw, u32 offset, ++ u8 size, u16 *data); ++static s32 e1000_read_flash_word_ich8lan(struct e1000_hw *hw, ++ u32 offset, u16 *data); ++static s32 e1000_retry_write_flash_byte_ich8lan(struct e1000_hw *hw, ++ u32 offset, u8 byte); ++static s32 e1000_write_flash_byte_ich8lan(struct e1000_hw *hw, ++ u32 offset, u8 data); ++static s32 e1000_write_flash_data_ich8lan(struct e1000_hw *hw, u32 offset, ++ u8 size, u16 data); ++static s32 e1000_get_cfg_done_ich8lan(struct e1000_hw *hw); ++static void e1000_power_down_phy_copper_ich8lan(struct e1000_hw *hw); ++static void e1000_rar_set_ich8lan(struct e1000_hw *hw, u8 *mac_addr, u32 index); ++static void e1000_mta_set_ich8lan(struct e1000_hw *hw, u32 hash_value); ++static void e1000_update_mc_addr_list_ich8lan(struct e1000_hw *hw, ++ u8 *mc_addr_list, ++ u32 mc_addr_count, ++ u32 rar_used_count, ++ u32 rar_count); ++ ++/* ICH GbE Flash Hardware Sequencing Flash Status Register bit breakdown */ ++/* Offset 04h HSFSTS */ ++union ich8_hws_flash_status { ++ struct ich8_hsfsts { ++ u16 flcdone :1; /* bit 0 Flash Cycle Done */ ++ u16 flcerr :1; /* bit 1 Flash Cycle Error */ ++ u16 dael :1; /* bit 2 Direct Access error Log */ ++ u16 berasesz :2; /* bit 4:3 Sector Erase Size */ ++ u16 flcinprog :1; /* bit 5 flash cycle in Progress */ ++ u16 reserved1 :2; /* bit 13:6 Reserved */ ++ u16 reserved2 :6; /* bit 13:6 Reserved */ ++ u16 fldesvalid :1; /* bit 14 Flash Descriptor Valid */ ++ u16 flockdn :1; /* bit 15 Flash Config Lock-Down */ ++ } hsf_status; ++ u16 regval; ++}; ++ ++/* ICH GbE Flash Hardware Sequencing Flash control Register bit breakdown */ ++/* Offset 06h FLCTL */ ++union ich8_hws_flash_ctrl { ++ struct ich8_hsflctl { ++ u16 flcgo :1; /* 0 Flash Cycle Go */ ++ u16 flcycle :2; /* 2:1 Flash Cycle */ ++ u16 reserved :5; /* 7:3 Reserved */ ++ u16 fldbcount :2; /* 9:8 Flash Data Byte Count */ ++ u16 flockdn :6; /* 15:10 Reserved */ ++ } hsf_ctrl; ++ u16 regval; ++}; ++ ++/* ICH Flash Region Access Permissions */ ++union ich8_hws_flash_regacc { ++ struct ich8_flracc { ++ u32 grra :8; /* 0:7 GbE region Read Access */ ++ u32 grwa :8; /* 8:15 GbE region Write Access */ ++ u32 gmrag :8; /* 23:16 GbE Master Read Access Grant */ ++ u32 gmwag :8; /* 31:24 GbE Master Write Access Grant */ ++ } hsf_flregacc; ++ u16 regval; ++}; ++ ++/** ++ * e1000_init_phy_params_ich8lan - Initialize PHY function pointers ++ * @hw: pointer to the HW structure ++ * ++ * Initialize family-specific PHY parameters and function pointers. ++ **/ ++static s32 e1000_init_phy_params_ich8lan(struct e1000_hw *hw) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ s32 ret_val = E1000_SUCCESS; ++ u16 i = 0; ++ ++ phy->addr = 1; ++ phy->reset_delay_us = 100; ++ ++ phy->ops.acquire = e1000_acquire_swflag_ich8lan; ++ phy->ops.check_polarity = e1000_check_polarity_ife_ich8lan; ++ phy->ops.check_reset_block = e1000_check_reset_block_ich8lan; ++ phy->ops.force_speed_duplex = e1000_phy_force_speed_duplex_ich8lan; ++ phy->ops.get_cable_length = e1000e_get_cable_length_igp_2; ++ phy->ops.get_cfg_done = e1000_get_cfg_done_ich8lan; ++ phy->ops.get_info = e1000_get_phy_info_ich8lan; ++ phy->ops.read_reg = e1000e_read_phy_reg_igp; ++ phy->ops.release = e1000_release_swflag_ich8lan; ++ phy->ops.reset = e1000_phy_hw_reset_ich8lan; ++ phy->ops.set_d0_lplu_state = e1000_set_d0_lplu_state_ich8lan; ++ phy->ops.set_d3_lplu_state = e1000_set_d3_lplu_state_ich8lan; ++ phy->ops.write_reg = e1000e_write_phy_reg_igp; ++ phy->ops.power_up = e1000_power_up_phy_copper; ++ phy->ops.power_down = e1000_power_down_phy_copper_ich8lan; ++ ++ /* ++ * We may need to do this twice - once for IGP and if that fails, ++ * we'll set BM func pointers and try again ++ */ ++ ret_val = e1000e_determine_phy_address(hw); ++ if (ret_val) { ++ phy->ops.write_reg = e1000e_write_phy_reg_bm; ++ phy->ops.read_reg = e1000e_read_phy_reg_bm; ++ ret_val = e1000e_determine_phy_address(hw); ++ if (ret_val) { ++ e_dbg("Cannot determine PHY addr. Erroring out\n"); ++ goto out; ++ } ++ } ++ ++ phy->id = 0; ++ while ((e1000_phy_unknown == e1000e_get_phy_type_from_id(phy->id)) && ++ (i++ < 100)) { ++ msleep(1); ++ ret_val = e1000e_get_phy_id(hw); ++ if (ret_val) ++ goto out; ++ } ++ ++ /* Verify phy id */ ++ switch (phy->id) { ++ case IGP03E1000_E_PHY_ID: ++ phy->type = e1000_phy_igp_3; ++ phy->autoneg_mask = AUTONEG_ADVERTISE_SPEED_DEFAULT; ++ break; ++ case IFE_E_PHY_ID: ++ case IFE_PLUS_E_PHY_ID: ++ case IFE_C_E_PHY_ID: ++ phy->type = e1000_phy_ife; ++ phy->autoneg_mask = E1000_ALL_NOT_GIG; ++ break; ++ case BME1000_E_PHY_ID: ++ phy->type = e1000_phy_bm; ++ phy->autoneg_mask = AUTONEG_ADVERTISE_SPEED_DEFAULT; ++ phy->ops.read_reg = e1000e_read_phy_reg_bm; ++ phy->ops.write_reg = e1000e_write_phy_reg_bm; ++ phy->ops.commit = e1000e_phy_sw_reset; ++ break; ++ default: ++ ret_val = -E1000_ERR_PHY; ++ goto out; ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_init_nvm_params_ich8lan - Initialize NVM function pointers ++ * @hw: pointer to the HW structure ++ * ++ * Initialize family-specific NVM parameters and function ++ * pointers. ++ **/ ++static s32 e1000_init_nvm_params_ich8lan(struct e1000_hw *hw) ++{ ++ struct e1000_nvm_info *nvm = &hw->nvm; ++ struct e1000_dev_spec_ich8lan *dev_spec = &hw->dev_spec.ich8lan; ++ u32 gfpreg, sector_base_addr, sector_end_addr; ++ s32 ret_val = E1000_SUCCESS; ++ u16 i; ++ ++ /* Can't read flash registers if the register set isn't mapped. */ ++ if (!hw->flash_address) { ++ e_dbg("ERROR: Flash registers not mapped\n"); ++ ret_val = -E1000_ERR_CONFIG; ++ goto out; ++ } ++ ++ nvm->type = e1000_nvm_flash_sw; ++ ++ gfpreg = er32flash(ICH_FLASH_GFPREG); ++ ++ /* ++ * sector_X_addr is a "sector"-aligned address (4096 bytes) ++ * Add 1 to sector_end_addr since this sector is included in ++ * the overall size. ++ */ ++ sector_base_addr = gfpreg & FLASH_GFPREG_BASE_MASK; ++ sector_end_addr = ((gfpreg >> 16) & FLASH_GFPREG_BASE_MASK) + 1; ++ ++ /* flash_base_addr is byte-aligned */ ++ nvm->flash_base_addr = sector_base_addr << FLASH_SECTOR_ADDR_SHIFT; ++ ++ /* ++ * find total size of the NVM, then cut in half since the total ++ * size represents two separate NVM banks. ++ */ ++ nvm->flash_bank_size = (sector_end_addr - sector_base_addr) ++ << FLASH_SECTOR_ADDR_SHIFT; ++ nvm->flash_bank_size /= 2; ++ /* Adjust to word count */ ++ nvm->flash_bank_size /= sizeof(u16); ++ ++ nvm->word_size = E1000_ICH8_SHADOW_RAM_WORDS; ++ ++ /* Clear shadow ram */ ++ for (i = 0; i < nvm->word_size; i++) { ++ dev_spec->shadow_ram[i].modified = false; ++ dev_spec->shadow_ram[i].value = 0xFFFF; ++ } ++ ++ /* Function Pointers */ ++ nvm->ops.acquire = e1000_acquire_swflag_ich8lan; ++ nvm->ops.read = e1000_read_nvm_ich8lan; ++ nvm->ops.release = e1000_release_swflag_ich8lan; ++ nvm->ops.update = e1000_update_nvm_checksum_ich8lan; ++ nvm->ops.valid_led_default = e1000_valid_led_default_ich8lan; ++ nvm->ops.validate = e1000_validate_nvm_checksum_ich8lan; ++ nvm->ops.write = e1000_write_nvm_ich8lan; ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_init_mac_params_ich8lan - Initialize MAC function pointers ++ * @hw: pointer to the HW structure ++ * ++ * Initialize family-specific MAC parameters and function ++ * pointers. ++ **/ ++static s32 e1000_init_mac_params_ich8lan(struct e1000_hw *hw) ++{ ++ struct e1000_mac_info *mac = &hw->mac; ++ ++ /* Set media type function pointer */ ++ hw->phy.media_type = e1000_media_type_copper; ++ ++ /* Set mta register count */ ++ mac->mta_reg_count = 32; ++ /* Set rar entry count */ ++ mac->rar_entry_count = E1000_ICH_RAR_ENTRIES; ++ if (mac->type == e1000_ich8lan) ++ mac->rar_entry_count--; ++ /* Set if part includes ASF firmware */ ++ mac->asf_firmware_present = true; ++ /* Set if manageability features are enabled. */ ++ mac->arc_subsystem_valid = true; ++ ++ /* Function pointers */ ++ ++ /* bus type/speed/width */ ++ mac->ops.get_bus_info = e1000_get_bus_info_ich8lan; ++ /* function id */ ++ mac->ops.set_lan_id = e1000_set_lan_id_single_port; ++ /* reset */ ++ mac->ops.reset_hw = e1000_reset_hw_ich8lan; ++ /* hw initialization */ ++ mac->ops.init_hw = e1000_init_hw_ich8lan; ++ /* link setup */ ++ mac->ops.setup_link = e1000_setup_link_ich8lan; ++ /* physical interface setup */ ++ mac->ops.setup_physical_interface = e1000_setup_copper_link_ich8lan; ++ /* check for link */ ++ mac->ops.check_for_link = e1000e_check_for_copper_link; ++ /* receive address register setting */ ++ mac->ops.rar_set = e1000_rar_set_ich8lan; ++ /* check management mode */ ++ mac->ops.check_mng_mode = e1000_check_mng_mode_ich8lan; ++ /* link info */ ++ mac->ops.get_link_up_info = e1000_get_link_up_info_ich8lan; ++ /* multicast address update */ ++ mac->ops.update_mc_addr_list = e1000_update_mc_addr_list_ich8lan; ++ /* setting MTA */ ++ mac->ops.mta_set = e1000_mta_set_ich8lan; ++ /* clear hardware counters */ ++ mac->ops.clear_hw_cntrs = e1000_clear_hw_cntrs_ich8lan; ++ ++ /* LED operations */ ++ switch (mac->type) { ++ case e1000_ich8lan: ++ case e1000_ich9lan: ++ case e1000_ich10lan: ++ /* ID LED init */ ++ mac->ops.id_led_init = e1000e_id_led_init; ++ /* blink LED */ ++ mac->ops.blink_led = e1000e_blink_led; ++ /* setup LED */ ++ mac->ops.setup_led = e1000_setup_led_generic; ++ /* cleanup LED */ ++ mac->ops.cleanup_led = e1000_cleanup_led_ich8lan; ++ /* turn on/off LED */ ++ mac->ops.led_on = e1000_led_on_ich8lan; ++ mac->ops.led_off = e1000_led_off_ich8lan; ++ break; ++ default: ++ break; ++ } ++ ++ /* Enable PCS Lock-loss workaround for ICH8 */ ++ if (mac->type == e1000_ich8lan) ++ e1000e_set_kmrn_lock_loss_workaround_ich8lan(hw, true); ++ ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_init_function_pointers_ich8lan - Initialize ICH8 function pointers ++ * @hw: pointer to the HW structure ++ * ++ * Initialize family-specific function pointers for PHY, MAC, and NVM. ++ **/ ++void e1000_init_function_pointers_ich8lan(struct e1000_hw *hw) ++{ ++ e1000_init_mac_ops_generic(hw); ++ e1000_init_nvm_ops_generic(hw); ++ hw->mac.ops.init_params = e1000_init_mac_params_ich8lan; ++ hw->nvm.ops.init_params = e1000_init_nvm_params_ich8lan; ++ hw->phy.ops.init_params = e1000_init_phy_params_ich8lan; ++} ++ ++/** ++ * e1000_acquire_swflag_ich8lan - Acquire software control flag ++ * @hw: pointer to the HW structure ++ * ++ * Acquires the software control flag for performing NVM and PHY ++ * operations. This is a function pointer entry point only called by ++ * read/write routines for the PHY and NVM parts. ++ **/ ++static s32 e1000_acquire_swflag_ich8lan(struct e1000_hw *hw) ++{ ++ u32 extcnf_ctrl, timeout = PHY_CFG_TIMEOUT; ++ s32 ret_val = E1000_SUCCESS; ++ ++ while (timeout) { ++ extcnf_ctrl = er32(EXTCNF_CTRL); ++ extcnf_ctrl |= E1000_EXTCNF_CTRL_SWFLAG; ++ ew32(EXTCNF_CTRL, extcnf_ctrl); ++ ++ extcnf_ctrl = er32(EXTCNF_CTRL); ++ if (extcnf_ctrl & E1000_EXTCNF_CTRL_SWFLAG) ++ break; ++ mdelay(1); ++ timeout--; ++ } ++ ++ if (!timeout) { ++ e_dbg("FW or HW has locked the resource for too long.\n"); ++ extcnf_ctrl &= ~E1000_EXTCNF_CTRL_SWFLAG; ++ ew32(EXTCNF_CTRL, extcnf_ctrl); ++ ret_val = -E1000_ERR_CONFIG; ++ goto out; ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_release_swflag_ich8lan - Release software control flag ++ * @hw: pointer to the HW structure ++ * ++ * Releases the software control flag for performing NVM and PHY operations. ++ * This is a function pointer entry point only called by read/write ++ * routines for the PHY and NVM parts. ++ **/ ++static void e1000_release_swflag_ich8lan(struct e1000_hw *hw) ++{ ++ u32 extcnf_ctrl; ++ ++ extcnf_ctrl = er32(EXTCNF_CTRL); ++ extcnf_ctrl &= ~E1000_EXTCNF_CTRL_SWFLAG; ++ ew32(EXTCNF_CTRL, extcnf_ctrl); ++ ++ return; ++} ++ ++/** ++ * e1000_check_mng_mode_ich8lan - Checks management mode ++ * @hw: pointer to the HW structure ++ * ++ * This checks if the adapter has manageability enabled. ++ * This is a function pointer entry point only called by read/write ++ * routines for the PHY and NVM parts. ++ **/ ++static bool e1000_check_mng_mode_ich8lan(struct e1000_hw *hw) ++{ ++ u32 fwsm; ++ ++ fwsm = er32(FWSM); ++ return (fwsm & E1000_FWSM_MODE_MASK) == ++ (E1000_ICH_MNG_IAMT_MODE << E1000_FWSM_MODE_SHIFT); ++} ++/** ++ * e1000_check_reset_block_ich8lan - Check if PHY reset is blocked ++ * @hw: pointer to the HW structure ++ * ++ * Checks if firmware is blocking the reset of the PHY. ++ * This is a function pointer entry point only called by ++ * reset routines. ++ **/ ++static s32 e1000_check_reset_block_ich8lan(struct e1000_hw *hw) ++{ ++ u32 fwsm; ++ ++ fwsm = er32(FWSM); ++ return (fwsm & E1000_ICH_FWSM_RSPCIPHY) ? E1000_SUCCESS ++ : E1000_BLK_PHY_RESET; ++} ++ ++/** ++ * e1000_phy_force_speed_duplex_ich8lan - Force PHY speed & duplex ++ * @hw: pointer to the HW structure ++ * ++ * Forces the speed and duplex settings of the PHY. ++ * This is a function pointer entry point only called by ++ * PHY setup routines. ++ **/ ++static s32 e1000_phy_force_speed_duplex_ich8lan(struct e1000_hw *hw) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ s32 ret_val; ++ u16 data; ++ bool link; ++ ++ if (phy->type != e1000_phy_ife) { ++ ret_val = e1000e_phy_force_speed_duplex_igp(hw); ++ goto out; ++ } ++ ++ ret_val = e1e_rphy(hw, PHY_CONTROL, &data); ++ if (ret_val) ++ goto out; ++ ++ e1000e_phy_force_speed_duplex_setup(hw, &data); ++ ++ ret_val = e1e_wphy(hw, PHY_CONTROL, data); ++ if (ret_val) ++ goto out; ++ ++ /* Disable MDI-X support for 10/100 */ ++ ret_val = e1e_rphy(hw, IFE_PHY_MDIX_CONTROL, &data); ++ if (ret_val) ++ goto out; ++ ++ data &= ~IFE_PMC_AUTO_MDIX; ++ data &= ~IFE_PMC_FORCE_MDIX; ++ ++ ret_val = e1e_wphy(hw, IFE_PHY_MDIX_CONTROL, data); ++ if (ret_val) ++ goto out; ++ ++ e_dbg("IFE PMC: %X\n", data); ++ ++ udelay(1); ++ ++ if (phy->autoneg_wait_to_complete) { ++ e_dbg("Waiting for forced speed/duplex link on IFE phy.\n"); ++ ++ ret_val = e1000e_phy_has_link_generic(hw, ++ PHY_FORCE_LIMIT, ++ 100000, ++ &link); ++ if (ret_val) ++ goto out; ++ ++ if (!link) ++ e_dbg("Link taking longer than expected.\n"); ++ ++ /* Try once more */ ++ ret_val = e1000e_phy_has_link_generic(hw, ++ PHY_FORCE_LIMIT, ++ 100000, ++ &link); ++ if (ret_val) ++ goto out; ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_phy_hw_reset_ich8lan - Performs a PHY reset ++ * @hw: pointer to the HW structure ++ * ++ * Resets the PHY ++ * This is a function pointer entry point called by drivers ++ * or other shared routines. ++ **/ ++static s32 e1000_phy_hw_reset_ich8lan(struct e1000_hw *hw) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ u32 i, data, cnf_size, cnf_base_addr, sw_cfg_mask; ++ s32 ret_val; ++ u16 loop = E1000_ICH8_LAN_INIT_TIMEOUT; ++ u16 word_addr, reg_data, reg_addr, phy_page = 0; ++ ++ ret_val = e1000e_phy_hw_reset_generic(hw); ++ if (ret_val) ++ goto out; ++ ++ /* ++ * Initialize the PHY from the NVM on ICH platforms. This ++ * is needed due to an issue where the NVM configuration is ++ * not properly autoloaded after power transitions. ++ * Therefore, after each PHY reset, we will load the ++ * configuration data out of the NVM manually. ++ */ ++ if (hw->mac.type == e1000_ich8lan && phy->type == e1000_phy_igp_3) { ++ /* Check if SW needs configure the PHY */ ++ if ((hw->device_id == E1000_DEV_ID_ICH8_IGP_M_AMT) || ++ (hw->device_id == E1000_DEV_ID_ICH8_IGP_M)) ++ sw_cfg_mask = E1000_FEXTNVM_SW_CONFIG_ICH8M; ++ else ++ sw_cfg_mask = E1000_FEXTNVM_SW_CONFIG; ++ ++ data = er32(FEXTNVM); ++ if (!(data & sw_cfg_mask)) ++ goto out; ++ ++ /* Wait for basic configuration completes before proceeding*/ ++ do { ++ data = er32(STATUS); ++ data &= E1000_STATUS_LAN_INIT_DONE; ++ udelay(100); ++ } while ((!data) && --loop); ++ ++ /* ++ * If basic configuration is incomplete before the above loop ++ * count reaches 0, loading the configuration from NVM will ++ * leave the PHY in a bad state possibly resulting in no link. ++ */ ++ if (loop == 0) ++ e_dbg("LAN_INIT_DONE not set, increase timeout\n"); ++ ++ /* Clear the Init Done bit for the next init event */ ++ data = er32(STATUS); ++ data &= ~E1000_STATUS_LAN_INIT_DONE; ++ ew32(STATUS, data); ++ ++ /* ++ * Make sure HW does not configure LCD from PHY ++ * extended configuration before SW configuration ++ */ ++ data = er32(EXTCNF_CTRL); ++ if (data & E1000_EXTCNF_CTRL_LCD_WRITE_ENABLE) ++ goto out; ++ ++ cnf_size = er32(EXTCNF_SIZE); ++ cnf_size &= E1000_EXTCNF_SIZE_EXT_PCIE_LENGTH_MASK; ++ cnf_size >>= E1000_EXTCNF_SIZE_EXT_PCIE_LENGTH_SHIFT; ++ if (!cnf_size) ++ goto out; ++ ++ cnf_base_addr = data & E1000_EXTCNF_CTRL_EXT_CNF_POINTER_MASK; ++ cnf_base_addr >>= E1000_EXTCNF_CTRL_EXT_CNF_POINTER_SHIFT; ++ ++ /* Configure LCD from extended configuration region. */ ++ ++ /* cnf_base_addr is in DWORD */ ++ word_addr = (u16)(cnf_base_addr << 1); ++ ++ for (i = 0; i < cnf_size; i++) { ++ ret_val = e1000_read_nvm(hw, (word_addr + i * 2), 1, ++ ®_data); ++ if (ret_val) ++ goto out; ++ ++ ret_val = e1000_read_nvm(hw, (word_addr + i * 2 + 1), ++ 1, ®_addr); ++ if (ret_val) ++ goto out; ++ ++ /* Save off the PHY page for future writes. */ ++ if (reg_addr == IGP01E1000_PHY_PAGE_SELECT) { ++ phy_page = reg_data; ++ continue; ++ } ++ ++ reg_addr |= phy_page; ++ ++ ret_val = e1e_wphy(hw, (u32)reg_addr, reg_data); ++ if (ret_val) ++ goto out; ++ } ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_get_phy_info_ich8lan - Calls appropriate PHY type get_phy_info ++ * @hw: pointer to the HW structure ++ * ++ * Wrapper for calling the get_phy_info routines for the appropriate phy type. ++ **/ ++static s32 e1000_get_phy_info_ich8lan(struct e1000_hw *hw) ++{ ++ s32 ret_val = -E1000_ERR_PHY_TYPE; ++ ++ switch (hw->phy.type) { ++ case e1000_phy_ife: ++ ret_val = e1000_get_phy_info_ife_ich8lan(hw); ++ break; ++ case e1000_phy_igp_3: ++ case e1000_phy_bm: ++ ret_val = e1000e_get_phy_info_igp(hw); ++ break; ++ default: ++ break; ++ } ++ ++ return ret_val; ++} ++ ++/** ++ * e1000_get_phy_info_ife_ich8lan - Retrieves various IFE PHY states ++ * @hw: pointer to the HW structure ++ * ++ * Populates "phy" structure with various feature states. ++ * This function is only called by other family-specific ++ * routines. ++ **/ ++static s32 e1000_get_phy_info_ife_ich8lan(struct e1000_hw *hw) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ s32 ret_val; ++ u16 data; ++ bool link; ++ ++ ret_val = e1000e_phy_has_link_generic(hw, 1, 0, &link); ++ if (ret_val) ++ goto out; ++ ++ if (!link) { ++ e_dbg("Phy info is only valid if link is up\n"); ++ ret_val = -E1000_ERR_CONFIG; ++ goto out; ++ } ++ ++ ret_val = e1e_rphy(hw, IFE_PHY_SPECIAL_CONTROL, &data); ++ if (ret_val) ++ goto out; ++ phy->polarity_correction = (data & IFE_PSC_AUTO_POLARITY_DISABLE) ++ ? false : true; ++ ++ if (phy->polarity_correction) { ++ ret_val = e1000_check_polarity_ife_ich8lan(hw); ++ if (ret_val) ++ goto out; ++ } else { ++ /* Polarity is forced */ ++ phy->cable_polarity = (data & IFE_PSC_FORCE_POLARITY) ++ ? e1000_rev_polarity_reversed ++ : e1000_rev_polarity_normal; ++ } ++ ++ ret_val = e1e_rphy(hw, IFE_PHY_MDIX_CONTROL, &data); ++ if (ret_val) ++ goto out; ++ ++ phy->is_mdix = (data & IFE_PMC_MDIX_STATUS) ? true : false; ++ ++ /* The following parameters are undefined for 10/100 operation. */ ++ phy->cable_length = E1000_CABLE_LENGTH_UNDEFINED; ++ phy->local_rx = e1000_1000t_rx_status_undefined; ++ phy->remote_rx = e1000_1000t_rx_status_undefined; ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_check_polarity_ife_ich8lan - Check cable polarity for IFE PHY ++ * @hw: pointer to the HW structure ++ * ++ * Polarity is determined on the polarity reversal feature being enabled. ++ * This function is only called by other family-specific ++ * routines. ++ **/ ++static s32 e1000_check_polarity_ife_ich8lan(struct e1000_hw *hw) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ s32 ret_val; ++ u16 phy_data, offset, mask; ++ ++ /* ++ * Polarity is determined based on the reversal feature being enabled. ++ */ ++ if (phy->polarity_correction) { ++ offset = IFE_PHY_EXTENDED_STATUS_CONTROL; ++ mask = IFE_PESC_POLARITY_REVERSED; ++ } else { ++ offset = IFE_PHY_SPECIAL_CONTROL; ++ mask = IFE_PSC_FORCE_POLARITY; ++ } ++ ++ ret_val = e1e_rphy(hw, offset, &phy_data); ++ ++ if (!ret_val) ++ phy->cable_polarity = (phy_data & mask) ++ ? e1000_rev_polarity_reversed ++ : e1000_rev_polarity_normal; ++ ++ return ret_val; ++} ++ ++/** ++ * e1000_set_d0_lplu_state_ich8lan - Set Low Power Linkup D0 state ++ * @hw: pointer to the HW structure ++ * @active: true to enable LPLU, false to disable ++ * ++ * Sets the LPLU D0 state according to the active flag. When ++ * activating LPLU this function also disables smart speed ++ * and vice versa. LPLU will not be activated unless the ++ * device autonegotiation advertisement meets standards of ++ * either 10 or 10/100 or 10/100/1000 at all duplexes. ++ * This is a function pointer entry point only called by ++ * PHY setup routines. ++ **/ ++static s32 e1000_set_d0_lplu_state_ich8lan(struct e1000_hw *hw, bool active) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ u32 phy_ctrl; ++ s32 ret_val = E1000_SUCCESS; ++ u16 data; ++ ++ if (phy->type == e1000_phy_ife) ++ goto out; ++ ++ phy_ctrl = er32(PHY_CTRL); ++ ++ if (active) { ++ phy_ctrl |= E1000_PHY_CTRL_D0A_LPLU; ++ ew32(PHY_CTRL, phy_ctrl); ++ ++ /* ++ * Call gig speed drop workaround on LPLU before accessing ++ * any PHY registers ++ */ ++ if ((hw->mac.type == e1000_ich8lan) && ++ (hw->phy.type == e1000_phy_igp_3)) ++ e1000e_gig_downshift_workaround_ich8lan(hw); ++ ++ /* When LPLU is enabled, we should disable SmartSpeed */ ++ ret_val = e1e_rphy(hw, ++ IGP01E1000_PHY_PORT_CONFIG, ++ &data); ++ data &= ~IGP01E1000_PSCFR_SMART_SPEED; ++ ret_val = e1e_wphy(hw, ++ IGP01E1000_PHY_PORT_CONFIG, ++ data); ++ if (ret_val) ++ goto out; ++ } else { ++ phy_ctrl &= ~E1000_PHY_CTRL_D0A_LPLU; ++ ew32(PHY_CTRL, phy_ctrl); ++ ++ /* ++ * LPLU and SmartSpeed are mutually exclusive. LPLU is used ++ * during Dx states where the power conservation is most ++ * important. During driver activity we should enable ++ * SmartSpeed, so performance is maintained. ++ */ ++ if (phy->smart_speed == e1000_smart_speed_on) { ++ ret_val = e1e_rphy(hw, ++ IGP01E1000_PHY_PORT_CONFIG, ++ &data); ++ if (ret_val) ++ goto out; ++ ++ data |= IGP01E1000_PSCFR_SMART_SPEED; ++ ret_val = e1e_wphy(hw, ++ IGP01E1000_PHY_PORT_CONFIG, ++ data); ++ if (ret_val) ++ goto out; ++ } else if (phy->smart_speed == e1000_smart_speed_off) { ++ ret_val = e1e_rphy(hw, ++ IGP01E1000_PHY_PORT_CONFIG, ++ &data); ++ if (ret_val) ++ goto out; ++ ++ data &= ~IGP01E1000_PSCFR_SMART_SPEED; ++ ret_val = e1e_wphy(hw, ++ IGP01E1000_PHY_PORT_CONFIG, ++ data); ++ if (ret_val) ++ goto out; ++ } ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_set_d3_lplu_state_ich8lan - Set Low Power Linkup D3 state ++ * @hw: pointer to the HW structure ++ * @active: true to enable LPLU, false to disable ++ * ++ * Sets the LPLU D3 state according to the active flag. When ++ * activating LPLU this function also disables smart speed ++ * and vice versa. LPLU will not be activated unless the ++ * device autonegotiation advertisement meets standards of ++ * either 10 or 10/100 or 10/100/1000 at all duplexes. ++ * This is a function pointer entry point only called by ++ * PHY setup routines. ++ **/ ++static s32 e1000_set_d3_lplu_state_ich8lan(struct e1000_hw *hw, bool active) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ u32 phy_ctrl; ++ s32 ret_val = E1000_SUCCESS; ++ u16 data; ++ ++ phy_ctrl = er32(PHY_CTRL); ++ ++ if (!active) { ++ phy_ctrl &= ~E1000_PHY_CTRL_NOND0A_LPLU; ++ ew32(PHY_CTRL, phy_ctrl); ++ /* ++ * LPLU and SmartSpeed are mutually exclusive. LPLU is used ++ * during Dx states where the power conservation is most ++ * important. During driver activity we should enable ++ * SmartSpeed, so performance is maintained. ++ */ ++ if (phy->smart_speed == e1000_smart_speed_on) { ++ ret_val = e1e_rphy(hw, ++ IGP01E1000_PHY_PORT_CONFIG, ++ &data); ++ if (ret_val) ++ goto out; ++ ++ data |= IGP01E1000_PSCFR_SMART_SPEED; ++ ret_val = e1e_wphy(hw, ++ IGP01E1000_PHY_PORT_CONFIG, ++ data); ++ if (ret_val) ++ goto out; ++ } else if (phy->smart_speed == e1000_smart_speed_off) { ++ ret_val = e1e_rphy(hw, ++ IGP01E1000_PHY_PORT_CONFIG, ++ &data); ++ if (ret_val) ++ goto out; ++ ++ data &= ~IGP01E1000_PSCFR_SMART_SPEED; ++ ret_val = e1e_wphy(hw, ++ IGP01E1000_PHY_PORT_CONFIG, ++ data); ++ if (ret_val) ++ goto out; ++ } ++ } else if ((phy->autoneg_advertised == E1000_ALL_SPEED_DUPLEX) || ++ (phy->autoneg_advertised == E1000_ALL_NOT_GIG) || ++ (phy->autoneg_advertised == E1000_ALL_10_SPEED)) { ++ phy_ctrl |= E1000_PHY_CTRL_NOND0A_LPLU; ++ ew32(PHY_CTRL, phy_ctrl); ++ ++ /* ++ * Call gig speed drop workaround on LPLU before accessing ++ * any PHY registers ++ */ ++ if ((hw->mac.type == e1000_ich8lan) && ++ (hw->phy.type == e1000_phy_igp_3)) ++ e1000e_gig_downshift_workaround_ich8lan(hw); ++ ++ /* When LPLU is enabled, we should disable SmartSpeed */ ++ ret_val = e1e_rphy(hw, ++ IGP01E1000_PHY_PORT_CONFIG, ++ &data); ++ if (ret_val) ++ goto out; ++ ++ data &= ~IGP01E1000_PSCFR_SMART_SPEED; ++ ret_val = e1e_wphy(hw, ++ IGP01E1000_PHY_PORT_CONFIG, ++ data); ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_valid_nvm_bank_detect_ich8lan - finds out the valid bank 0 or 1 ++ * @hw: pointer to the HW structure ++ * @bank: pointer to the variable that returns the active bank ++ * ++ * Reads signature byte from the NVM using the flash access registers. ++ * Word 0x13 bits 15:14 = 10b indicate a valid signature for that bank. ++ **/ ++static s32 e1000_valid_nvm_bank_detect_ich8lan(struct e1000_hw *hw, u32 *bank) ++{ ++ u32 eecd; ++ struct e1000_nvm_info *nvm = &hw->nvm; ++ u32 bank1_offset = nvm->flash_bank_size * sizeof(u16); ++ u32 act_offset = E1000_ICH_NVM_SIG_WORD * 2 + 1; ++ u8 sig_byte = 0; ++ s32 ret_val = E1000_SUCCESS; ++ ++ switch (hw->mac.type) { ++ case e1000_ich8lan: ++ case e1000_ich9lan: ++ eecd = er32(EECD); ++ if ((eecd & E1000_EECD_SEC1VAL_VALID_MASK) == ++ E1000_EECD_SEC1VAL_VALID_MASK) { ++ if (eecd & E1000_EECD_SEC1VAL) ++ *bank = 1; ++ else ++ *bank = 0; ++ ++ goto out; ++ } ++ e_dbg("Unable to determine valid NVM bank via EEC - " ++ "reading flash signature\n"); ++ /* fall-thru */ ++ default: ++ /* set bank to 0 in case flash read fails */ ++ *bank = 0; ++ ++ /* Check bank 0 */ ++ ret_val = e1000_read_flash_byte_ich8lan(hw, act_offset, ++ &sig_byte); ++ if (ret_val) ++ goto out; ++ if ((sig_byte & E1000_ICH_NVM_VALID_SIG_MASK) == ++ E1000_ICH_NVM_SIG_VALUE) { ++ *bank = 0; ++ goto out; ++ } ++ ++ /* Check bank 1 */ ++ ret_val = e1000_read_flash_byte_ich8lan(hw, act_offset + ++ bank1_offset, ++ &sig_byte); ++ if (ret_val) ++ goto out; ++ if ((sig_byte & E1000_ICH_NVM_VALID_SIG_MASK) == ++ E1000_ICH_NVM_SIG_VALUE) { ++ *bank = 1; ++ goto out; ++ } ++ ++ e_dbg("ERROR: No valid NVM bank present\n"); ++ ret_val = -E1000_ERR_NVM; ++ break; ++ } ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_read_nvm_ich8lan - Read word(s) from the NVM ++ * @hw: pointer to the HW structure ++ * @offset: The offset (in bytes) of the word(s) to read. ++ * @words: Size of data to read in words ++ * @data: Pointer to the word(s) to read at offset. ++ * ++ * Reads a word(s) from the NVM using the flash access registers. ++ **/ ++static s32 e1000_read_nvm_ich8lan(struct e1000_hw *hw, u16 offset, u16 words, ++ u16 *data) ++{ ++ struct e1000_nvm_info *nvm = &hw->nvm; ++ struct e1000_dev_spec_ich8lan *dev_spec = &hw->dev_spec.ich8lan; ++ u32 act_offset; ++ s32 ret_val = E1000_SUCCESS; ++ u32 bank = 0; ++ u16 i, word; ++ ++ if ((offset >= nvm->word_size) || (words > nvm->word_size - offset) || ++ (words == 0)) { ++ e_dbg("nvm parameter(s) out of bounds\n"); ++ ret_val = -E1000_ERR_NVM; ++ goto out; ++ } ++ ++ ret_val = nvm->ops.acquire(hw); ++ if (ret_val) ++ goto out; ++ ++ ret_val = e1000_valid_nvm_bank_detect_ich8lan(hw, &bank); ++ if (ret_val != E1000_SUCCESS) ++ goto release; ++ ++ act_offset = (bank) ? nvm->flash_bank_size : 0; ++ act_offset += offset; ++ ++ for (i = 0; i < words; i++) { ++ if ((dev_spec->shadow_ram) && ++ (dev_spec->shadow_ram[offset+i].modified)) { ++ data[i] = dev_spec->shadow_ram[offset+i].value; ++ } else { ++ ret_val = e1000_read_flash_word_ich8lan(hw, ++ act_offset + i, ++ &word); ++ if (ret_val) ++ break; ++ data[i] = word; ++ } ++ } ++ ++release: ++ nvm->ops.release(hw); ++ ++out: ++ if (ret_val) ++ e_dbg("NVM read error: %d\n", ret_val); ++ ++ return ret_val; ++} ++ ++/** ++ * e1000_flash_cycle_init_ich8lan - Initialize flash ++ * @hw: pointer to the HW structure ++ * ++ * This function does initial flash setup so that a new read/write/erase cycle ++ * can be started. ++ **/ ++static s32 e1000_flash_cycle_init_ich8lan(struct e1000_hw *hw) ++{ ++ union ich8_hws_flash_status hsfsts; ++ s32 ret_val = -E1000_ERR_NVM; ++ s32 i = 0; ++ ++ hsfsts.regval = er16flash(ICH_FLASH_HSFSTS); ++ ++ /* Check if the flash descriptor is valid */ ++ if (hsfsts.hsf_status.fldesvalid == 0) { ++ e_dbg("Flash descriptor invalid. " ++ "SW Sequencing must be used."); ++ goto out; ++ } ++ ++ /* Clear FCERR and DAEL in hw status by writing 1 */ ++ hsfsts.hsf_status.flcerr = 1; ++ hsfsts.hsf_status.dael = 1; ++ ++ ew16flash(ICH_FLASH_HSFSTS, hsfsts.regval); ++ ++ /* ++ * Either we should have a hardware SPI cycle in progress ++ * bit to check against, in order to start a new cycle or ++ * FDONE bit should be changed in the hardware so that it ++ * is 1 after hardware reset, which can then be used as an ++ * indication whether a cycle is in progress or has been ++ * completed. ++ */ ++ ++ if (hsfsts.hsf_status.flcinprog == 0) { ++ /* ++ * There is no cycle running at present, ++ * so we can start a cycle. ++ * Begin by setting Flash Cycle Done. ++ */ ++ hsfsts.hsf_status.flcdone = 1; ++ ew16flash(ICH_FLASH_HSFSTS, hsfsts.regval); ++ ret_val = E1000_SUCCESS; ++ } else { ++ /* ++ * Otherwise poll for sometime so the current ++ * cycle has a chance to end before giving up. ++ */ ++ for (i = 0; i < ICH_FLASH_READ_COMMAND_TIMEOUT; i++) { ++ hsfsts.regval = er16flash( ++ ICH_FLASH_HSFSTS); ++ if (hsfsts.hsf_status.flcinprog == 0) { ++ ret_val = E1000_SUCCESS; ++ break; ++ } ++ udelay(1); ++ } ++ if (ret_val == E1000_SUCCESS) { ++ /* ++ * Successful in waiting for previous cycle to timeout, ++ * now set the Flash Cycle Done. ++ */ ++ hsfsts.hsf_status.flcdone = 1; ++ ew16flash(ICH_FLASH_HSFSTS, ++ hsfsts.regval); ++ } else { ++ e_dbg("Flash controller busy, cannot get access"); ++ } ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_flash_cycle_ich8lan - Starts flash cycle (read/write/erase) ++ * @hw: pointer to the HW structure ++ * @timeout: maximum time to wait for completion ++ * ++ * This function starts a flash cycle and waits for its completion. ++ **/ ++static s32 e1000_flash_cycle_ich8lan(struct e1000_hw *hw, u32 timeout) ++{ ++ union ich8_hws_flash_ctrl hsflctl; ++ union ich8_hws_flash_status hsfsts; ++ s32 ret_val = -E1000_ERR_NVM; ++ u32 i = 0; ++ ++ /* Start a cycle by writing 1 in Flash Cycle Go in Hw Flash Control */ ++ hsflctl.regval = er16flash(ICH_FLASH_HSFCTL); ++ hsflctl.hsf_ctrl.flcgo = 1; ++ ew16flash(ICH_FLASH_HSFCTL, hsflctl.regval); ++ ++ /* wait till FDONE bit is set to 1 */ ++ do { ++ hsfsts.regval = er16flash(ICH_FLASH_HSFSTS); ++ if (hsfsts.hsf_status.flcdone == 1) ++ break; ++ udelay(1); ++ } while (i++ < timeout); ++ ++ if (hsfsts.hsf_status.flcdone == 1 && hsfsts.hsf_status.flcerr == 0) ++ ret_val = E1000_SUCCESS; ++ ++ return ret_val; ++} ++ ++/** ++ * e1000_read_flash_word_ich8lan - Read word from flash ++ * @hw: pointer to the HW structure ++ * @offset: offset to data location ++ * @data: pointer to the location for storing the data ++ * ++ * Reads the flash word at offset into data. Offset is converted ++ * to bytes before read. ++ **/ ++static s32 e1000_read_flash_word_ich8lan(struct e1000_hw *hw, u32 offset, ++ u16 *data) ++{ ++ s32 ret_val; ++ ++ if (!data) { ++ ret_val = -E1000_ERR_NVM; ++ goto out; ++ } ++ ++ /* Must convert offset into bytes. */ ++ offset <<= 1; ++ ++ ret_val = e1000_read_flash_data_ich8lan(hw, offset, 2, data); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_read_flash_byte_ich8lan - Read byte from flash ++ * @hw: pointer to the HW structure ++ * @offset: The offset of the byte to read. ++ * @data: Pointer to a byte to store the value read. ++ * ++ * Reads a single byte from the NVM using the flash access registers. ++ **/ ++static s32 e1000_read_flash_byte_ich8lan(struct e1000_hw *hw, u32 offset, ++ u8 *data) ++{ ++ s32 ret_val = E1000_SUCCESS; ++ u16 word = 0; ++ ++ ret_val = e1000_read_flash_data_ich8lan(hw, offset, 1, &word); ++ if (ret_val) ++ goto out; ++ ++ *data = (u8)word; ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_read_flash_data_ich8lan - Read byte or word from NVM ++ * @hw: pointer to the HW structure ++ * @offset: The offset (in bytes) of the byte or word to read. ++ * @size: Size of data to read, 1=byte 2=word ++ * @data: Pointer to the word to store the value read. ++ * ++ * Reads a byte or word from the NVM using the flash access registers. ++ **/ ++static s32 e1000_read_flash_data_ich8lan(struct e1000_hw *hw, u32 offset, ++ u8 size, u16 *data) ++{ ++ union ich8_hws_flash_status hsfsts; ++ union ich8_hws_flash_ctrl hsflctl; ++ u32 flash_linear_addr; ++ u32 flash_data = 0; ++ s32 ret_val = -E1000_ERR_NVM; ++ u8 count = 0; ++ ++ if (size < 1 || size > 2 || offset > ICH_FLASH_LINEAR_ADDR_MASK) ++ goto out; ++ flash_linear_addr = (ICH_FLASH_LINEAR_ADDR_MASK & offset) + ++ hw->nvm.flash_base_addr; ++ ++ do { ++ udelay(1); ++ /* Steps */ ++ ret_val = e1000_flash_cycle_init_ich8lan(hw); ++ if (ret_val != E1000_SUCCESS) ++ break; ++ ++ hsflctl.regval = er16flash(ICH_FLASH_HSFCTL); ++ /* 0b/1b corresponds to 1 or 2 byte size, respectively. */ ++ hsflctl.hsf_ctrl.fldbcount = size - 1; ++ hsflctl.hsf_ctrl.flcycle = ICH_CYCLE_READ; ++ ew16flash(ICH_FLASH_HSFCTL, hsflctl.regval); ++ ++ ew32flash(ICH_FLASH_FADDR, flash_linear_addr); ++ ++ ret_val = e1000_flash_cycle_ich8lan(hw, ++ ICH_FLASH_READ_COMMAND_TIMEOUT); ++ ++ /* ++ * Check if FCERR is set to 1, if set to 1, clear it ++ * and try the whole sequence a few more times, else ++ * read in (shift in) the Flash Data0, the order is ++ * least significant byte first msb to lsb ++ */ ++ if (ret_val == E1000_SUCCESS) { ++ flash_data = er32flash(ICH_FLASH_FDATA0); ++ if (size == 1) ++ *data = (u8)(flash_data & 0x000000FF); ++ else if (size == 2) ++ *data = (u16)(flash_data & 0x0000FFFF); ++ break; ++ } else { ++ /* ++ * If we've gotten here, then things are probably ++ * completely hosed, but if the error condition is ++ * detected, it won't hurt to give it another try... ++ * ICH_FLASH_CYCLE_REPEAT_COUNT times. ++ */ ++ hsfsts.regval = er16flash( ++ ICH_FLASH_HSFSTS); ++ if (hsfsts.hsf_status.flcerr == 1) { ++ /* Repeat for some time before giving up. */ ++ continue; ++ } else if (hsfsts.hsf_status.flcdone == 0) { ++ e_dbg("Timeout error - flash cycle " ++ "did not complete."); ++ break; ++ } ++ } ++ } while (count++ < ICH_FLASH_CYCLE_REPEAT_COUNT); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_write_nvm_ich8lan - Write word(s) to the NVM ++ * @hw: pointer to the HW structure ++ * @offset: The offset (in bytes) of the word(s) to write. ++ * @words: Size of data to write in words ++ * @data: Pointer to the word(s) to write at offset. ++ * ++ * Writes a byte or word to the NVM using the flash access registers. ++ **/ ++static s32 e1000_write_nvm_ich8lan(struct e1000_hw *hw, u16 offset, u16 words, ++ u16 *data) ++{ ++ struct e1000_nvm_info *nvm = &hw->nvm; ++ struct e1000_dev_spec_ich8lan *dev_spec = &hw->dev_spec.ich8lan; ++ s32 ret_val = E1000_SUCCESS; ++ u16 i; ++ ++ if ((offset >= nvm->word_size) || (words > nvm->word_size - offset) || ++ (words == 0)) { ++ e_dbg("nvm parameter(s) out of bounds\n"); ++ ret_val = -E1000_ERR_NVM; ++ goto out; ++ } ++ ++ ret_val = nvm->ops.acquire(hw); ++ if (ret_val) ++ goto out; ++ ++ for (i = 0; i < words; i++) { ++ dev_spec->shadow_ram[offset+i].modified = true; ++ dev_spec->shadow_ram[offset+i].value = data[i]; ++ } ++ ++ nvm->ops.release(hw); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_update_nvm_checksum_ich8lan - Update the checksum for NVM ++ * @hw: pointer to the HW structure ++ * ++ * The NVM checksum is updated by calling the generic update_nvm_checksum, ++ * which writes the checksum to the shadow ram. The changes in the shadow ++ * ram are then committed to the EEPROM by processing each bank at a time ++ * checking for the modified bit and writing only the pending changes. ++ * After a successful commit, the shadow ram is cleared and is ready for ++ * future writes. ++ **/ ++static s32 e1000_update_nvm_checksum_ich8lan(struct e1000_hw *hw) ++{ ++ struct e1000_nvm_info *nvm = &hw->nvm; ++ struct e1000_dev_spec_ich8lan *dev_spec = &hw->dev_spec.ich8lan; ++ u32 i, act_offset, new_bank_offset, old_bank_offset, bank; ++ s32 ret_val; ++ u16 data; ++ ++ ret_val = e1000e_update_nvm_checksum_generic(hw); ++ if (ret_val) ++ goto out; ++ ++ if (nvm->type != e1000_nvm_flash_sw) ++ goto out; ++ ++ ret_val = nvm->ops.acquire(hw); ++ if (ret_val) ++ goto out; ++ ++ /* ++ * We're writing to the opposite bank so if we're on bank 1, ++ * write to bank 0 etc. We also need to erase the segment that ++ * is going to be written ++ */ ++ ret_val = e1000_valid_nvm_bank_detect_ich8lan(hw, &bank); ++ if (ret_val != E1000_SUCCESS) { ++ nvm->ops.release(hw); ++ goto out; ++ } ++ ++ if (bank == 0) { ++ new_bank_offset = nvm->flash_bank_size; ++ old_bank_offset = 0; ++ ret_val = e1000_erase_flash_bank_ich8lan(hw, 1); ++ if (ret_val) { ++ nvm->ops.release(hw); ++ goto out; ++ } ++ } else { ++ old_bank_offset = nvm->flash_bank_size; ++ new_bank_offset = 0; ++ ret_val = e1000_erase_flash_bank_ich8lan(hw, 0); ++ if (ret_val) { ++ nvm->ops.release(hw); ++ goto out; ++ } ++ } ++ ++ for (i = 0; i < E1000_ICH8_SHADOW_RAM_WORDS; i++) { ++ /* ++ * Determine whether to write the value stored ++ * in the other NVM bank or a modified value stored ++ * in the shadow RAM ++ */ ++ if (dev_spec->shadow_ram[i].modified) { ++ data = dev_spec->shadow_ram[i].value; ++ } else { ++ ret_val = e1000_read_flash_word_ich8lan(hw, i + ++ old_bank_offset, ++ &data); ++ if (ret_val) ++ break; ++ } ++ ++ /* ++ * If the word is 0x13, then make sure the signature bits ++ * (15:14) are 11b until the commit has completed. ++ * This will allow us to write 10b which indicates the ++ * signature is valid. We want to do this after the write ++ * has completed so that we don't mark the segment valid ++ * while the write is still in progress ++ */ ++ if (i == E1000_ICH_NVM_SIG_WORD) ++ data |= E1000_ICH_NVM_SIG_MASK; ++ ++ /* Convert offset to bytes. */ ++ act_offset = (i + new_bank_offset) << 1; ++ ++ udelay(100); ++ /* Write the bytes to the new bank. */ ++ ret_val = e1000_retry_write_flash_byte_ich8lan(hw, ++ act_offset, ++ (u8)data); ++ if (ret_val) ++ break; ++ ++ udelay(100); ++ ret_val = e1000_retry_write_flash_byte_ich8lan(hw, ++ act_offset + 1, ++ (u8)(data >> 8)); ++ if (ret_val) ++ break; ++ } ++ ++ /* ++ * Don't bother writing the segment valid bits if sector ++ * programming failed. ++ */ ++ if (ret_val) { ++ e_dbg("Flash commit failed.\n"); ++ nvm->ops.release(hw); ++ goto out; ++ } ++ ++ /* ++ * Finally validate the new segment by setting bit 15:14 ++ * to 10b in word 0x13 , this can be done without an ++ * erase as well since these bits are 11 to start with ++ * and we need to change bit 14 to 0b ++ */ ++ act_offset = new_bank_offset + E1000_ICH_NVM_SIG_WORD; ++ ret_val = e1000_read_flash_word_ich8lan(hw, act_offset, &data); ++ if (ret_val) { ++ nvm->ops.release(hw); ++ goto out; ++ } ++ data &= 0xBFFF; ++ ret_val = e1000_retry_write_flash_byte_ich8lan(hw, ++ act_offset * 2 + 1, ++ (u8)(data >> 8)); ++ if (ret_val) { ++ nvm->ops.release(hw); ++ goto out; ++ } ++ ++ /* ++ * And invalidate the previously valid segment by setting ++ * its signature word (0x13) high_byte to 0b. This can be ++ * done without an erase because flash erase sets all bits ++ * to 1's. We can write 1's to 0's without an erase ++ */ ++ act_offset = (old_bank_offset + E1000_ICH_NVM_SIG_WORD) * 2 + 1; ++ ret_val = e1000_retry_write_flash_byte_ich8lan(hw, act_offset, 0); ++ if (ret_val) { ++ nvm->ops.release(hw); ++ goto out; ++ } ++ ++ /* Great! Everything worked, we can now clear the cached entries. */ ++ for (i = 0; i < E1000_ICH8_SHADOW_RAM_WORDS; i++) { ++ dev_spec->shadow_ram[i].modified = false; ++ dev_spec->shadow_ram[i].value = 0xFFFF; ++ } ++ ++ nvm->ops.release(hw); ++ ++ /* ++ * Reload the EEPROM, or else modifications will not appear ++ * until after the next adapter reset. ++ */ ++ nvm->ops.reload(hw); ++ msleep(10); ++ ++out: ++ if (ret_val) ++ e_dbg("NVM update error: %d\n", ret_val); ++ ++ return ret_val; ++} ++ ++/** ++ * e1000_validate_nvm_checksum_ich8lan - Validate EEPROM checksum ++ * @hw: pointer to the HW structure ++ * ++ * Check to see if checksum needs to be fixed by reading bit 6 in word 0x19. ++ * If the bit is 0, that the EEPROM had been modified, but the checksum was not ++ * calculated, in which case we need to calculate the checksum and set bit 6. ++ **/ ++static s32 e1000_validate_nvm_checksum_ich8lan(struct e1000_hw *hw) ++{ ++ s32 ret_val = E1000_SUCCESS; ++ u16 data; ++ ++ /* ++ * Read 0x19 and check bit 6. If this bit is 0, the checksum ++ * needs to be fixed. This bit is an indication that the NVM ++ * was prepared by OEM software and did not calculate the ++ * checksum...a likely scenario. ++ */ ++ ret_val = e1000_read_nvm(hw, 0x19, 1, &data); ++ if (ret_val) ++ goto out; ++ ++ if ((data & 0x40) == 0) { ++ data |= 0x40; ++ ret_val = e1000_write_nvm(hw, 0x19, 1, &data); ++ if (ret_val) ++ goto out; ++ ret_val = e1000e_update_nvm_checksum(hw); ++ if (ret_val) ++ goto out; ++ } ++ ++ ret_val = e1000e_validate_nvm_checksum_generic(hw); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_write_flash_data_ich8lan - Writes bytes to the NVM ++ * @hw: pointer to the HW structure ++ * @offset: The offset (in bytes) of the byte/word to read. ++ * @size: Size of data to read, 1=byte 2=word ++ * @data: The byte(s) to write to the NVM. ++ * ++ * Writes one/two bytes to the NVM using the flash access registers. ++ **/ ++static s32 e1000_write_flash_data_ich8lan(struct e1000_hw *hw, u32 offset, ++ u8 size, u16 data) ++{ ++ union ich8_hws_flash_status hsfsts; ++ union ich8_hws_flash_ctrl hsflctl; ++ u32 flash_linear_addr; ++ u32 flash_data = 0; ++ s32 ret_val = -E1000_ERR_NVM; ++ u8 count = 0; ++ ++ if (size < 1 || size > 2 || data > size * 0xff || ++ offset > ICH_FLASH_LINEAR_ADDR_MASK) ++ goto out; ++ ++ flash_linear_addr = (ICH_FLASH_LINEAR_ADDR_MASK & offset) + ++ hw->nvm.flash_base_addr; ++ ++ do { ++ udelay(1); ++ /* Steps */ ++ ret_val = e1000_flash_cycle_init_ich8lan(hw); ++ if (ret_val != E1000_SUCCESS) ++ break; ++ ++ hsflctl.regval = er16flash(ICH_FLASH_HSFCTL); ++ /* 0b/1b corresponds to 1 or 2 byte size, respectively. */ ++ hsflctl.hsf_ctrl.fldbcount = size - 1; ++ hsflctl.hsf_ctrl.flcycle = ICH_CYCLE_WRITE; ++ ew16flash(ICH_FLASH_HSFCTL, hsflctl.regval); ++ ++ ew32flash(ICH_FLASH_FADDR, flash_linear_addr); ++ ++ if (size == 1) ++ flash_data = (u32)data & 0x00FF; ++ else ++ flash_data = (u32)data; ++ ++ ew32flash(ICH_FLASH_FDATA0, flash_data); ++ ++ /* ++ * check if FCERR is set to 1 , if set to 1, clear it ++ * and try the whole sequence a few more times else done ++ */ ++ ret_val = e1000_flash_cycle_ich8lan(hw, ++ ICH_FLASH_WRITE_COMMAND_TIMEOUT); ++ if (ret_val == E1000_SUCCESS) ++ break; ++ ++ /* ++ * If we're here, then things are most likely ++ * completely hosed, but if the error condition ++ * is detected, it won't hurt to give it another ++ * try...ICH_FLASH_CYCLE_REPEAT_COUNT times. ++ */ ++ hsfsts.regval = er16flash(ICH_FLASH_HSFSTS); ++ if (hsfsts.hsf_status.flcerr == 1) { ++ /* Repeat for some time before giving up. */ ++ continue; ++ } else if (hsfsts.hsf_status.flcdone == 0) { ++ e_dbg("Timeout error - flash cycle " ++ "did not complete."); ++ break; ++ } ++ } while (count++ < ICH_FLASH_CYCLE_REPEAT_COUNT); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_write_flash_byte_ich8lan - Write a single byte to NVM ++ * @hw: pointer to the HW structure ++ * @offset: The index of the byte to read. ++ * @data: The byte to write to the NVM. ++ * ++ * Writes a single byte to the NVM using the flash access registers. ++ **/ ++static s32 e1000_write_flash_byte_ich8lan(struct e1000_hw *hw, u32 offset, ++ u8 data) ++{ ++ u16 word = (u16)data; ++ ++ return e1000_write_flash_data_ich8lan(hw, offset, 1, word); ++} ++ ++/** ++ * e1000_retry_write_flash_byte_ich8lan - Writes a single byte to NVM ++ * @hw: pointer to the HW structure ++ * @offset: The offset of the byte to write. ++ * @byte: The byte to write to the NVM. ++ * ++ * Writes a single byte to the NVM using the flash access registers. ++ * Goes through a retry algorithm before giving up. ++ **/ ++static s32 e1000_retry_write_flash_byte_ich8lan(struct e1000_hw *hw, ++ u32 offset, u8 byte) ++{ ++ s32 ret_val; ++ u16 program_retries; ++ ++ ret_val = e1000_write_flash_byte_ich8lan(hw, offset, byte); ++ if (ret_val == E1000_SUCCESS) ++ goto out; ++ ++ for (program_retries = 0; program_retries < 100; program_retries++) { ++ e_dbg("Retrying Byte %2.2X at offset %u\n", byte, offset); ++ udelay(100); ++ ret_val = e1000_write_flash_byte_ich8lan(hw, offset, byte); ++ if (ret_val == E1000_SUCCESS) ++ break; ++ } ++ if (program_retries == 100) { ++ ret_val = -E1000_ERR_NVM; ++ goto out; ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_erase_flash_bank_ich8lan - Erase a bank (4k) from NVM ++ * @hw: pointer to the HW structure ++ * @bank: 0 for first bank, 1 for second bank, etc. ++ * ++ * Erases the bank specified. Each bank is a 4k block. Banks are 0 based. ++ * bank N is 4096 * N + flash_reg_addr. ++ **/ ++static s32 e1000_erase_flash_bank_ich8lan(struct e1000_hw *hw, u32 bank) ++{ ++ struct e1000_nvm_info *nvm = &hw->nvm; ++ union ich8_hws_flash_status hsfsts; ++ union ich8_hws_flash_ctrl hsflctl; ++ u32 flash_linear_addr; ++ /* bank size is in 16bit words - adjust to bytes */ ++ u32 flash_bank_size = nvm->flash_bank_size * 2; ++ s32 ret_val = E1000_SUCCESS; ++ s32 count = 0; ++ s32 j, iteration, sector_size; ++ ++ hsfsts.regval = er16flash(ICH_FLASH_HSFSTS); ++ ++ /* ++ * Determine HW Sector size: Read BERASE bits of hw flash status ++ * register ++ * 00: The Hw sector is 256 bytes, hence we need to erase 16 ++ * consecutive sectors. The start index for the nth Hw sector ++ * can be calculated as = bank * 4096 + n * 256 ++ * 01: The Hw sector is 4K bytes, hence we need to erase 1 sector. ++ * The start index for the nth Hw sector can be calculated ++ * as = bank * 4096 ++ * 10: The Hw sector is 8K bytes, nth sector = bank * 8192 ++ * (ich9 only, otherwise error condition) ++ * 11: The Hw sector is 64K bytes, nth sector = bank * 65536 ++ */ ++ switch (hsfsts.hsf_status.berasesz) { ++ case 0: ++ /* Hw sector size 256 */ ++ sector_size = ICH_FLASH_SEG_SIZE_256; ++ iteration = flash_bank_size / ICH_FLASH_SEG_SIZE_256; ++ break; ++ case 1: ++ sector_size = ICH_FLASH_SEG_SIZE_4K; ++ iteration = flash_bank_size / ICH_FLASH_SEG_SIZE_4K; ++ break; ++ case 2: ++ if (hw->mac.type == e1000_ich9lan) { ++ sector_size = ICH_FLASH_SEG_SIZE_8K; ++ iteration = flash_bank_size / ICH_FLASH_SEG_SIZE_8K; ++ } else { ++ ret_val = -E1000_ERR_NVM; ++ goto out; ++ } ++ break; ++ case 3: ++ sector_size = ICH_FLASH_SEG_SIZE_64K; ++ iteration = flash_bank_size / ICH_FLASH_SEG_SIZE_64K; ++ break; ++ default: ++ ret_val = -E1000_ERR_NVM; ++ goto out; ++ } ++ ++ /* Start with the base address, then add the sector offset. */ ++ flash_linear_addr = hw->nvm.flash_base_addr; ++ flash_linear_addr += (bank) ? (sector_size * iteration) : 0; ++ ++ for (j = 0; j < iteration ; j++) { ++ do { ++ /* Steps */ ++ ret_val = e1000_flash_cycle_init_ich8lan(hw); ++ if (ret_val) ++ goto out; ++ ++ /* ++ * Write a value 11 (block Erase) in Flash ++ * Cycle field in hw flash control ++ */ ++ hsflctl.regval = er16flash( ++ ICH_FLASH_HSFCTL); ++ hsflctl.hsf_ctrl.flcycle = ICH_CYCLE_ERASE; ++ ew16flash(ICH_FLASH_HSFCTL, ++ hsflctl.regval); ++ ++ /* ++ * Write the last 24 bits of an index within the ++ * block into Flash Linear address field in Flash ++ * Address. ++ */ ++ flash_linear_addr += (j * sector_size); ++ ew32flash(ICH_FLASH_FADDR, ++ flash_linear_addr); ++ ++ ret_val = e1000_flash_cycle_ich8lan(hw, ++ ICH_FLASH_ERASE_COMMAND_TIMEOUT); ++ if (ret_val == E1000_SUCCESS) ++ break; ++ ++ /* ++ * Check if FCERR is set to 1. If 1, ++ * clear it and try the whole sequence ++ * a few more times else Done ++ */ ++ hsfsts.regval = er16flash( ++ ICH_FLASH_HSFSTS); ++ if (hsfsts.hsf_status.flcerr == 1) ++ /* repeat for some time before giving up */ ++ continue; ++ else if (hsfsts.hsf_status.flcdone == 0) ++ goto out; ++ } while (++count < ICH_FLASH_CYCLE_REPEAT_COUNT); ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_valid_led_default_ich8lan - Set the default LED settings ++ * @hw: pointer to the HW structure ++ * @data: Pointer to the LED settings ++ * ++ * Reads the LED default settings from the NVM to data. If the NVM LED ++ * settings is all 0's or F's, set the LED default to a valid LED default ++ * setting. ++ **/ ++static s32 e1000_valid_led_default_ich8lan(struct e1000_hw *hw, u16 *data) ++{ ++ s32 ret_val; ++ ++ ret_val = e1000_read_nvm(hw, NVM_ID_LED_SETTINGS, 1, data); ++ if (ret_val) { ++ e_dbg("NVM Read Error\n"); ++ goto out; ++ } ++ ++ if (*data == ID_LED_RESERVED_0000 || ++ *data == ID_LED_RESERVED_FFFF) ++ *data = ID_LED_DEFAULT_ICH8LAN; ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_get_bus_info_ich8lan - Get/Set the bus type and width ++ * @hw: pointer to the HW structure ++ * ++ * ICH8 use the PCI Express bus, but does not contain a PCI Express Capability ++ * register, so the the bus width is hard coded. ++ **/ ++static s32 e1000_get_bus_info_ich8lan(struct e1000_hw *hw) ++{ ++ struct e1000_bus_info *bus = &hw->bus; ++ s32 ret_val; ++ ++ ret_val = e1000e_get_bus_info_pcie(hw); ++ ++ /* ++ * ICH devices are "PCI Express"-ish. They have ++ * a configuration space, but do not contain ++ * PCI Express Capability registers, so bus width ++ * must be hardcoded. ++ */ ++ if (bus->width == e1000_bus_width_unknown) ++ bus->width = e1000_bus_width_pcie_x1; ++ ++ return ret_val; ++} ++ ++/** ++ * e1000_reset_hw_ich8lan - Reset the hardware ++ * @hw: pointer to the HW structure ++ * ++ * Does a full reset of the hardware which includes a reset of the PHY and ++ * MAC. ++ **/ ++static s32 e1000_reset_hw_ich8lan(struct e1000_hw *hw) ++{ ++ u32 ctrl, icr, kab; ++ s32 ret_val; ++ ++ /* ++ * Prevent the PCI-E bus from sticking if there is no TLP connection ++ * on the last TLP read/write transaction when MAC is reset. ++ */ ++ ret_val = e1000e_disable_pcie_master(hw); ++ if (ret_val) ++ e_dbg("PCI-E Master disable polling has failed.\n"); ++ ++ e_dbg("Masking off all interrupts\n"); ++ ew32(IMC, 0xffffffff); ++ ++ /* ++ * Disable the Transmit and Receive units. Then delay to allow ++ * any pending transactions to complete before we hit the MAC ++ * with the global reset. ++ */ ++ ew32(RCTL, 0); ++ ew32(TCTL, E1000_TCTL_PSP); ++ e1e_flush(); ++ ++ msleep(10); ++ ++ /* Workaround for ICH8 bit corruption issue in FIFO memory */ ++ if (hw->mac.type == e1000_ich8lan) { ++ /* Set Tx and Rx buffer allocation to 8k apiece. */ ++ ew32(PBA, E1000_PBA_8K); ++ /* Set Packet Buffer Size to 16k. */ ++ ew32(PBS, E1000_PBS_16K); ++ } ++ ++ ctrl = er32(CTRL); ++ ++ if (!e1000_check_reset_block(hw) && !hw->phy.reset_disable) { ++ /* ++ * PHY HW reset requires MAC CORE reset at the same ++ * time to make sure the interface between MAC and the ++ * external PHY is reset. ++ */ ++ ctrl |= E1000_CTRL_PHY_RST; ++ } ++ ret_val = e1000_acquire_swflag_ich8lan(hw); ++ e_dbg("Issuing a global reset to ich8lan\n"); ++ ew32(CTRL, (ctrl | E1000_CTRL_RST)); ++ msleep(20); ++ ++ ret_val = e1000e_get_auto_rd_done(hw); ++ if (ret_val) { ++ /* ++ * When auto config read does not complete, do not ++ * return with an error. This can happen in situations ++ * where there is no eeprom and prevents getting link. ++ */ ++ e_dbg("Auto Read Done did not complete\n"); ++ } ++ ++ ew32(IMC, 0xffffffff); ++ icr = er32(ICR); ++ ++ kab = er32(KABGTXD); ++ kab |= E1000_KABGTXD_BGSQLBIAS; ++ ew32(KABGTXD, kab); ++ ++ return ret_val; ++} ++ ++/** ++ * e1000_init_hw_ich8lan - Initialize the hardware ++ * @hw: pointer to the HW structure ++ * ++ * Prepares the hardware for transmit and receive by doing the following: ++ * - initialize hardware bits ++ * - initialize LED identification ++ * - setup receive address registers ++ * - setup flow control ++ * - setup transmit descriptors ++ * - clear statistics ++ **/ ++static s32 e1000_init_hw_ich8lan(struct e1000_hw *hw) ++{ ++ struct e1000_mac_info *mac = &hw->mac; ++ u32 ctrl_ext, txdctl, snoop; ++ s32 ret_val; ++ u16 i; ++ ++ e1000_initialize_hw_bits_ich8lan(hw); ++ ++ /* Initialize identification LED */ ++ ret_val = mac->ops.id_led_init(hw); ++ if (ret_val) ++ /* This is not fatal and we should not stop init due to this */ ++ e_dbg("Error initializing identification LED\n"); ++ ++ /* Setup the receive address. */ ++ e1000e_init_rx_addrs(hw, mac->rar_entry_count); ++ ++ /* Zero out the Multicast HASH table */ ++ e_dbg("Zeroing the MTA\n"); ++ for (i = 0; i < mac->mta_reg_count; i++) { ++ E1000_WRITE_REG_ARRAY(hw, E1000_MTA, i, 0); ++ if ((hw->phy.type != e1000_phy_ife) && ++ (hw->phy.type != e1000_phy_igp_3)) { ++ e1e_wphy(hw, BM_MTA(i), 0); ++ e1e_wphy(hw, BM_MTA(i) + 1, 0); ++ } ++ } ++ ++ /* Setup link and flow control */ ++ ret_val = mac->ops.setup_link(hw); ++ ++ /* Set the transmit descriptor write-back policy for both queues */ ++ txdctl = er32(TXDCTL(0)); ++ txdctl = (txdctl & ~E1000_TXDCTL_WTHRESH) | ++ E1000_TXDCTL_FULL_TX_DESC_WB; ++ txdctl = (txdctl & ~E1000_TXDCTL_PTHRESH) | ++ E1000_TXDCTL_MAX_TX_DESC_PREFETCH; ++ ew32(TXDCTL(0), txdctl); ++ txdctl = er32(TXDCTL(1)); ++ txdctl = (txdctl & ~E1000_TXDCTL_WTHRESH) | ++ E1000_TXDCTL_FULL_TX_DESC_WB; ++ txdctl = (txdctl & ~E1000_TXDCTL_PTHRESH) | ++ E1000_TXDCTL_MAX_TX_DESC_PREFETCH; ++ ew32(TXDCTL(1), txdctl); ++ ++ /* ++ * ICH8 has opposite polarity of no_snoop bits. ++ * By default, we should use snoop behavior. ++ */ ++ if (mac->type == e1000_ich8lan) ++ snoop = PCIE_ICH8_SNOOP_ALL; ++ else ++ snoop = (u32)~(PCIE_NO_SNOOP_ALL); ++ e1000e_set_pcie_no_snoop(hw, snoop); ++ ++ ctrl_ext = er32(CTRL_EXT); ++ ctrl_ext |= E1000_CTRL_EXT_RO_DIS; ++ ew32(CTRL_EXT, ctrl_ext); ++ ++ /* ++ * Clear all of the statistics registers (clear on read). It is ++ * important that we do this after we have tried to establish link ++ * because the symbol error count will increment wildly if there ++ * is no link. ++ */ ++ e1000_clear_hw_cntrs_ich8lan(hw); ++ ++ return ret_val; ++} ++/** ++ * e1000_initialize_hw_bits_ich8lan - Initialize required hardware bits ++ * @hw: pointer to the HW structure ++ * ++ * Sets/Clears required hardware bits necessary for correctly setting up the ++ * hardware for transmit and receive. ++ **/ ++static void e1000_initialize_hw_bits_ich8lan(struct e1000_hw *hw) ++{ ++ u32 reg; ++ ++ /* Extended Device Control */ ++ reg = er32(CTRL_EXT); ++ reg |= (1 << 22); ++ ew32(CTRL_EXT, reg); ++ ++ /* Transmit Descriptor Control 0 */ ++ reg = er32(TXDCTL(0)); ++ reg |= (1 << 22); ++ ew32(TXDCTL(0), reg); ++ ++ /* Transmit Descriptor Control 1 */ ++ reg = er32(TXDCTL(1)); ++ reg |= (1 << 22); ++ ew32(TXDCTL(1), reg); ++ ++ /* Transmit Arbitration Control 0 */ ++ reg = er32(TARC(0)); ++ if (hw->mac.type == e1000_ich8lan) ++ reg |= (1 << 28) | (1 << 29); ++ reg |= (1 << 23) | (1 << 24) | (1 << 26) | (1 << 27); ++ ew32(TARC(0), reg); ++ ++ /* Transmit Arbitration Control 1 */ ++ reg = er32(TARC(1)); ++ if (er32(TCTL) & E1000_TCTL_MULR) ++ reg &= ~(1 << 28); ++ else ++ reg |= (1 << 28); ++ reg |= (1 << 24) | (1 << 26) | (1 << 30); ++ ew32(TARC(1), reg); ++ ++ /* Device Status */ ++ if (hw->mac.type == e1000_ich8lan) { ++ reg = er32(STATUS); ++ reg &= ~(1 << 31); ++ ew32(STATUS, reg); ++ } ++ ++ return; ++} ++ ++/** ++ * e1000_setup_link_ich8lan - Setup flow control and link settings ++ * @hw: pointer to the HW structure ++ * ++ * Determines which flow control settings to use, then configures flow ++ * control. Calls the appropriate media-specific link configuration ++ * function. Assuming the adapter has a valid link partner, a valid link ++ * should be established. Assumes the hardware has previously been reset ++ * and the transmitter and receiver are not enabled. ++ **/ ++static s32 e1000_setup_link_ich8lan(struct e1000_hw *hw) ++{ ++ s32 ret_val = E1000_SUCCESS; ++ ++ if (e1000_check_reset_block(hw)) ++ goto out; ++ ++ /* ++ * ICH parts do not have a word in the NVM to determine ++ * the default flow control setting, so we explicitly ++ * set it to full. ++ */ ++ if (hw->fc.requested_mode == e1000_fc_default) ++ hw->fc.requested_mode = e1000_fc_full; ++ ++ /* ++ * Save off the requested flow control mode for use later. Depending ++ * on the link partner's capabilities, we may or may not use this mode. ++ */ ++ hw->fc.current_mode = hw->fc.requested_mode; ++ ++ e_dbg("After fix-ups FlowControl is now = %x\n", ++ hw->fc.current_mode); ++ ++ /* Continue to configure the copper link. */ ++ ret_val = hw->mac.ops.setup_physical_interface(hw); ++ if (ret_val) ++ goto out; ++ ++ ew32(FCTTV, hw->fc.pause_time); ++ ++ ret_val = e1000e_set_fc_watermarks(hw); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_setup_copper_link_ich8lan - Configure MAC/PHY interface ++ * @hw: pointer to the HW structure ++ * ++ * Configures the kumeran interface to the PHY to wait the appropriate time ++ * when polling the PHY, then call the generic setup_copper_link to finish ++ * configuring the copper link. ++ **/ ++static s32 e1000_setup_copper_link_ich8lan(struct e1000_hw *hw) ++{ ++ u32 ctrl; ++ s32 ret_val; ++ u16 reg_data; ++ ++ ctrl = er32(CTRL); ++ ctrl |= E1000_CTRL_SLU; ++ ctrl &= ~(E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX); ++ ew32(CTRL, ctrl); ++ ++ /* ++ * Set the mac to wait the maximum time between each iteration ++ * and increase the max iterations when polling the phy; ++ * this fixes erroneous timeouts at 10Mbps. ++ */ ++ ret_val = e1000e_write_kmrn_reg(hw, GG82563_REG(0x34, 4), ++ 0xFFFF); ++ if (ret_val) ++ goto out; ++ ret_val = e1000e_read_kmrn_reg(hw, GG82563_REG(0x34, 9), ++ ®_data); ++ if (ret_val) ++ goto out; ++ reg_data |= 0x3F; ++ ret_val = e1000e_write_kmrn_reg(hw, GG82563_REG(0x34, 9), ++ reg_data); ++ if (ret_val) ++ goto out; ++ ++ switch (hw->phy.type) { ++ case e1000_phy_igp_3: ++ ret_val = e1000e_copper_link_setup_igp(hw); ++ if (ret_val) ++ goto out; ++ break; ++ case e1000_phy_bm: ++ ret_val = e1000e_copper_link_setup_m88(hw); ++ if (ret_val) ++ goto out; ++ break; ++ case e1000_phy_ife: ++ ret_val = e1e_rphy(hw, IFE_PHY_MDIX_CONTROL, ++ ®_data); ++ if (ret_val) ++ goto out; ++ ++ reg_data &= ~IFE_PMC_AUTO_MDIX; ++ ++ switch (hw->phy.mdix) { ++ case 1: ++ reg_data &= ~IFE_PMC_FORCE_MDIX; ++ break; ++ case 2: ++ reg_data |= IFE_PMC_FORCE_MDIX; ++ break; ++ case 0: ++ default: ++ reg_data |= IFE_PMC_AUTO_MDIX; ++ break; ++ } ++ ret_val = e1e_wphy(hw, IFE_PHY_MDIX_CONTROL, ++ reg_data); ++ if (ret_val) ++ goto out; ++ break; ++ default: ++ break; ++ } ++ ret_val = e1000e_setup_copper_link(hw); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_get_link_up_info_ich8lan - Get current link speed and duplex ++ * @hw: pointer to the HW structure ++ * @speed: pointer to store current link speed ++ * @duplex: pointer to store the current link duplex ++ * ++ * Calls the generic get_speed_and_duplex to retrieve the current link ++ * information and then calls the Kumeran lock loss workaround for links at ++ * gigabit speeds. ++ **/ ++static s32 e1000_get_link_up_info_ich8lan(struct e1000_hw *hw, u16 *speed, ++ u16 *duplex) ++{ ++ s32 ret_val; ++ ++ ret_val = e1000e_get_speed_and_duplex_copper(hw, speed, duplex); ++ if (ret_val) ++ goto out; ++ ++ if ((hw->mac.type == e1000_ich8lan) && ++ (hw->phy.type == e1000_phy_igp_3) && ++ (*speed == SPEED_1000)) { ++ ret_val = e1000_kmrn_lock_loss_workaround_ich8lan(hw); ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_kmrn_lock_loss_workaround_ich8lan - Kumeran workaround ++ * @hw: pointer to the HW structure ++ * ++ * Work-around for 82566 Kumeran PCS lock loss: ++ * On link status change (i.e. PCI reset, speed change) and link is up and ++ * speed is gigabit- ++ * 0) if workaround is optionally disabled do nothing ++ * 1) wait 1ms for Kumeran link to come up ++ * 2) check Kumeran Diagnostic register PCS lock loss bit ++ * 3) if not set the link is locked (all is good), otherwise... ++ * 4) reset the PHY ++ * 5) repeat up to 10 times ++ * Note: this is only called for IGP3 copper when speed is 1gb. ++ **/ ++static s32 e1000_kmrn_lock_loss_workaround_ich8lan(struct e1000_hw *hw) ++{ ++ struct e1000_dev_spec_ich8lan *dev_spec = &hw->dev_spec.ich8lan; ++ u32 phy_ctrl; ++ s32 ret_val = E1000_SUCCESS; ++ u16 i, data; ++ bool link; ++ ++ if (!(dev_spec->kmrn_lock_loss_workaround_enabled)) ++ goto out; ++ ++ /* ++ * Make sure link is up before proceeding. If not just return. ++ * Attempting this while link is negotiating fouled up link ++ * stability ++ */ ++ ret_val = e1000e_phy_has_link_generic(hw, 1, 0, &link); ++ if (!link) { ++ ret_val = E1000_SUCCESS; ++ goto out; ++ } ++ ++ for (i = 0; i < 10; i++) { ++ /* read once to clear */ ++ ret_val = e1e_rphy(hw, IGP3_KMRN_DIAG, &data); ++ if (ret_val) ++ goto out; ++ /* and again to get new status */ ++ ret_val = e1e_rphy(hw, IGP3_KMRN_DIAG, &data); ++ if (ret_val) ++ goto out; ++ ++ /* check for PCS lock */ ++ if (!(data & IGP3_KMRN_DIAG_PCS_LOCK_LOSS)) { ++ ret_val = E1000_SUCCESS; ++ goto out; ++ } ++ ++ /* Issue PHY reset */ ++ e1000_phy_hw_reset(hw); ++ mdelay(5); ++ } ++ /* Disable GigE link negotiation */ ++ phy_ctrl = er32(PHY_CTRL); ++ phy_ctrl |= (E1000_PHY_CTRL_GBE_DISABLE | ++ E1000_PHY_CTRL_NOND0A_GBE_DISABLE); ++ ew32(PHY_CTRL, phy_ctrl); ++ ++ /* ++ * Call gig speed drop workaround on Gig disable before accessing ++ * any PHY registers ++ */ ++ e1000e_gig_downshift_workaround_ich8lan(hw); ++ ++ /* unable to acquire PCS lock */ ++ ret_val = -E1000_ERR_PHY; ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000e_set_kmrn_lock_loss_workaround_ich8lan - Set Kumeran workaround state ++ * @hw: pointer to the HW structure ++ * @state: boolean value used to set the current Kumeran workaround state ++ * ++ * If ICH8, set the current Kumeran workaround state (enabled - true ++ * /disabled - false). ++ **/ ++void e1000e_set_kmrn_lock_loss_workaround_ich8lan(struct e1000_hw *hw, ++ bool state) ++{ ++ struct e1000_dev_spec_ich8lan *dev_spec = &hw->dev_spec.ich8lan; ++ ++ if (hw->mac.type != e1000_ich8lan) { ++ e_dbg("Workaround applies to ICH8 only.\n"); ++ return; ++ } ++ ++ dev_spec->kmrn_lock_loss_workaround_enabled = state; ++ ++ return; ++} ++ ++/** ++ * e1000_ipg3_phy_powerdown_workaround_ich8lan - Power down workaround on D3 ++ * @hw: pointer to the HW structure ++ * ++ * Workaround for 82566 power-down on D3 entry: ++ * 1) disable gigabit link ++ * 2) write VR power-down enable ++ * 3) read it back ++ * Continue if successful, else issue LCD reset and repeat ++ **/ ++void e1000e_igp3_phy_powerdown_workaround_ich8lan(struct e1000_hw *hw) ++{ ++ u32 reg; ++ u16 data; ++ u8 retry = 0; ++ ++ if (hw->phy.type != e1000_phy_igp_3) ++ goto out; ++ ++ /* Try the workaround twice (if needed) */ ++ do { ++ /* Disable link */ ++ reg = er32(PHY_CTRL); ++ reg |= (E1000_PHY_CTRL_GBE_DISABLE | ++ E1000_PHY_CTRL_NOND0A_GBE_DISABLE); ++ ew32(PHY_CTRL, reg); ++ ++ /* ++ * Call gig speed drop workaround on Gig disable before ++ * accessing any PHY registers ++ */ ++ if (hw->mac.type == e1000_ich8lan) ++ e1000e_gig_downshift_workaround_ich8lan(hw); ++ ++ /* Write VR power-down enable */ ++ e1e_rphy(hw, IGP3_VR_CTRL, &data); ++ data &= ~IGP3_VR_CTRL_DEV_POWERDOWN_MODE_MASK; ++ e1e_wphy(hw, IGP3_VR_CTRL, ++ data | IGP3_VR_CTRL_MODE_SHUTDOWN); ++ ++ /* Read it back and test */ ++ e1e_rphy(hw, IGP3_VR_CTRL, &data); ++ data &= IGP3_VR_CTRL_DEV_POWERDOWN_MODE_MASK; ++ if ((data == IGP3_VR_CTRL_MODE_SHUTDOWN) || retry) ++ break; ++ ++ /* Issue PHY reset and repeat at most one more time */ ++ reg = er32(CTRL); ++ ew32(CTRL, reg | E1000_CTRL_PHY_RST); ++ retry++; ++ } while (retry); ++ ++out: ++ return; ++} ++ ++/** ++ * e1000e_gig_downshift_workaround_ich8lan - WoL from S5 stops working ++ * @hw: pointer to the HW structure ++ * ++ * Steps to take when dropping from 1Gb/s (eg. link cable removal (LSC), ++ * LPLU, Gig disable, MDIC PHY reset): ++ * 1) Set Kumeran Near-end loopback ++ * 2) Clear Kumeran Near-end loopback ++ * Should only be called for ICH8[m] devices with IGP_3 Phy. ++ **/ ++void e1000e_gig_downshift_workaround_ich8lan(struct e1000_hw *hw) ++{ ++ s32 ret_val = E1000_SUCCESS; ++ u16 reg_data; ++ ++ if ((hw->mac.type != e1000_ich8lan) || ++ (hw->phy.type != e1000_phy_igp_3)) ++ goto out; ++ ++ ret_val = e1000e_read_kmrn_reg(hw, E1000_KMRNCTRLSTA_DIAG_OFFSET, ++ ®_data); ++ if (ret_val) ++ goto out; ++ reg_data |= E1000_KMRNCTRLSTA_DIAG_NELPBK; ++ ret_val = e1000e_write_kmrn_reg(hw, ++ E1000_KMRNCTRLSTA_DIAG_OFFSET, ++ reg_data); ++ if (ret_val) ++ goto out; ++ reg_data &= ~E1000_KMRNCTRLSTA_DIAG_NELPBK; ++ ret_val = e1000e_write_kmrn_reg(hw, ++ E1000_KMRNCTRLSTA_DIAG_OFFSET, ++ reg_data); ++out: ++ return; ++} ++ ++/** ++ * e1000e_disable_gig_wol_ich8lan - disable gig during WoL ++ * @hw: pointer to the HW structure ++ * ++ * During S0 to Sx transition, it is possible the link remains at gig ++ * instead of negotiating to a lower speed. Before going to Sx, set ++ * 'LPLU Enabled' and 'Gig Disable' to force link speed negotiation ++ * to a lower speed. ++ * ++ * Should only be called for applicable parts. ++ **/ ++void e1000e_disable_gig_wol_ich8lan(struct e1000_hw *hw) ++{ ++ u32 phy_ctrl; ++ ++ switch (hw->mac.type) { ++ case e1000_ich9lan: ++ case e1000_ich10lan: ++ phy_ctrl = er32(PHY_CTRL); ++ phy_ctrl |= E1000_PHY_CTRL_D0A_LPLU | ++ E1000_PHY_CTRL_GBE_DISABLE; ++ ew32(PHY_CTRL, phy_ctrl); ++ default: ++ break; ++ } ++ ++ return; ++} ++ ++/** ++ * e1000_cleanup_led_ich8lan - Restore the default LED operation ++ * @hw: pointer to the HW structure ++ * ++ * Return the LED back to the default configuration. ++ **/ ++static s32 e1000_cleanup_led_ich8lan(struct e1000_hw *hw) ++{ ++ s32 ret_val = E1000_SUCCESS; ++ ++ if (hw->phy.type == e1000_phy_ife) ++ ret_val = e1e_wphy(hw, IFE_PHY_SPECIAL_CONTROL_LED, ++ 0); ++ else ++ ew32(LEDCTL, hw->mac.ledctl_default); ++ ++ return ret_val; ++} ++ ++/** ++ * e1000_led_on_ich8lan - Turn LEDs on ++ * @hw: pointer to the HW structure ++ * ++ * Turn on the LEDs. ++ **/ ++static s32 e1000_led_on_ich8lan(struct e1000_hw *hw) ++{ ++ s32 ret_val = E1000_SUCCESS; ++ ++ if (hw->phy.type == e1000_phy_ife) ++ ret_val = e1e_wphy(hw, IFE_PHY_SPECIAL_CONTROL_LED, ++ (IFE_PSCL_PROBE_MODE | IFE_PSCL_PROBE_LEDS_ON)); ++ else ++ ew32(LEDCTL, hw->mac.ledctl_mode2); ++ ++ return ret_val; ++} ++ ++/** ++ * e1000_led_off_ich8lan - Turn LEDs off ++ * @hw: pointer to the HW structure ++ * ++ * Turn off the LEDs. ++ **/ ++static s32 e1000_led_off_ich8lan(struct e1000_hw *hw) ++{ ++ s32 ret_val = E1000_SUCCESS; ++ ++ if (hw->phy.type == e1000_phy_ife) ++ ret_val = e1e_wphy(hw, ++ IFE_PHY_SPECIAL_CONTROL_LED, ++ (IFE_PSCL_PROBE_MODE | IFE_PSCL_PROBE_LEDS_OFF)); ++ else ++ ew32(LEDCTL, hw->mac.ledctl_mode1); ++ ++ return ret_val; ++} ++ ++/** ++ * e1000_get_cfg_done_ich8lan - Read config done bit ++ * @hw: pointer to the HW structure ++ * ++ * Read the management control register for the config done bit for ++ * completion status. NOTE: silicon which is EEPROM-less will fail trying ++ * to read the config done bit, so an error is *ONLY* logged and returns ++ * E1000_SUCCESS. If we were to return with error, EEPROM-less silicon ++ * would not be able to be reset or change link. ++ **/ ++static s32 e1000_get_cfg_done_ich8lan(struct e1000_hw *hw) ++{ ++ s32 ret_val = E1000_SUCCESS; ++ u32 bank = 0; ++ ++ e1000e_get_cfg_done(hw); ++ ++ /* If EEPROM is not marked present, init the IGP 3 PHY manually */ ++ if (hw->mac.type != e1000_ich10lan) { ++ if (((er32(EECD) & E1000_EECD_PRES) == 0) && ++ (hw->phy.type == e1000_phy_igp_3)) { ++ e1000_phy_init_script_igp3(hw); ++ } ++ } else { ++ if (e1000_valid_nvm_bank_detect_ich8lan(hw, &bank)) { ++ /* Maybe we should do a basic PHY config */ ++ e_dbg("EEPROM not present\n"); ++ ret_val = -E1000_ERR_CONFIG; ++ } ++ } ++ ++ return ret_val; ++} ++ ++/** ++ * e1000_power_down_phy_copper_ich8lan - Remove link during PHY power down ++ * @hw: pointer to the HW structure ++ * ++ * In the case of a PHY power down to save power, or to turn off link during a ++ * driver unload, or wake on lan is not enabled, remove the link. ++ **/ ++static void e1000_power_down_phy_copper_ich8lan(struct e1000_hw *hw) ++{ ++ /* If the management interface is not enabled, then power down */ ++ if (!(hw->mac.ops.check_mng_mode(hw) || ++ e1000_check_reset_block(hw))) ++ e1000_power_down_phy_copper(hw); ++ ++ return; ++} ++ ++/** ++ * e1000_rar_set_ich8lan - Set receive address register ++ * @hw: pointer to the HW structure ++ * @mac_addr: pointer to the receive address ++ * @index: receive address array register ++ * ++ * Sets the receive address array register at index to the address passed ++ * in by mac_addr. For parts with PHY Recieve Address Registers, set that ++ * too as it is needed for PHY wakeup. ++ **/ ++static void e1000_rar_set_ich8lan(struct e1000_hw *hw, u8 *mac_addr, u32 index) ++{ ++ u32 rar; ++ ++ e1000e_rar_set(hw, mac_addr, index); ++ ++ if ((hw->phy.type == e1000_phy_ife) || ++ (hw->phy.type == e1000_phy_igp_3)) ++ return; ++ ++ /* copy MAC RAR to PHY RAR */ ++ rar = er32(RAL(index)); ++ e1e_wphy(hw, BM_RAR_L(index), (u16)(rar & 0xFFFF)); ++ e1e_wphy(hw, BM_RAR_M(index), (u16)((rar >> 16) & 0xFFFF)); ++ ++ rar = er32(RAH(index)); ++ e1e_wphy(hw, BM_RAR_H(index), (u16)(rar & 0xFFFF)); ++ e1e_wphy(hw, BM_RAR_CTRL(index), ++ (u16)((rar >> 16) & 0xFFFF)); ++} ++ ++/** ++ * e1000_mta_set_ich8lan - Set multicast filter table address ++ * @hw: pointer to the HW structure ++ * @hash_value: determines the MTA register and bit to set ++ * ++ * Set the MAC MTA register via e1000_mta_set_generic() and copy to ++ * the appropriate PHY MTA register. ++ **/ ++static void e1000_mta_set_ich8lan(struct e1000_hw *hw, u32 hash_value) ++{ ++ u32 hash_bit, hash_reg, mta; ++ ++ e1000_mta_set_generic(hw, hash_value); ++ ++ if ((hw->phy.type == e1000_phy_ife) || ++ (hw->phy.type == e1000_phy_igp_3)) ++ return; ++ ++ /* ++ * The PHY MTA is a register array of 16-bit registers. It is ++ * treated like an array of (2*16*mta_reg_count) bits. We want to ++ * copy the applicable word of the 32-bit MAC MTA register to the ++ * corresponding PHY register. The (hw->mac.mta_reg_count - 1) ++ * serves as a mask to bits 31:5 of the hash value which gives the ++ * MAC register modified above. The lower 5 bits of the hash value ++ * determine which bit was set above. ++ */ ++ hash_reg = (hash_value >> 5) & (hw->mac.mta_reg_count - 1); ++ hash_bit = hash_value & 0x1F; ++ ++ mta = E1000_READ_REG_ARRAY(hw, E1000_MTA, hash_reg); ++ ++ e1e_wphy(hw, BM_MTA(hash_reg), (u16)(mta & 0xFFFF)); ++ e1e_wphy(hw, BM_MTA(hash_reg) + 1, ++ (u16)((mta >> 16) & 0xFFFF)); ++} ++ ++/** ++ * e1000_update_mc_addr_list_ich8lan - Update Multicast addresses ++ * @hw: pointer to the HW structure ++ * @mc_addr_list: array of multicast addresses to program ++ * @mc_addr_count: number of multicast addresses to program ++ * @rar_used_count: the first RAR register free to program ++ * @rar_count: total number of supported Receive Address Registers ++ * ++ * Updates the Receive Address Registers and Multicast Table Array. ++ * The caller must have a packed mc_addr_list of multicast addresses. ++ * The parameter rar_count will usually be hw->mac.rar_entry_count ++ * unless there are workarounds that change this. ++ **/ ++static void e1000_update_mc_addr_list_ich8lan(struct e1000_hw *hw, ++ u8 *mc_addr_list, ++ u32 mc_addr_count, ++ u32 rar_used_count, ++ u32 rar_count) ++{ ++ u32 i; ++ ++ if ((hw->phy.type != e1000_phy_ife) && ++ (hw->phy.type != e1000_phy_igp_3)) { ++ /* Clear the old settings from the PHY MTA */ ++ e_dbg("Clearing PHY MTA\n"); ++ for (i = 0; i < hw->mac.mta_reg_count; i++) { ++ e1e_wphy(hw, BM_MTA(i), 0); ++ e1e_wphy(hw, BM_MTA(i) + 1, 0); ++ } ++ } ++ ++ e1000e_update_mc_addr_list_generic(hw, mc_addr_list, mc_addr_count, ++ rar_used_count, rar_count); ++} ++ ++/** ++ * e1000_clear_hw_cntrs_ich8lan - Clear statistical counters ++ * @hw: pointer to the HW structure ++ * ++ * Clears hardware counters specific to the silicon family and calls ++ * clear_hw_cntrs_generic to clear all general purpose counters. ++ **/ ++static void e1000_clear_hw_cntrs_ich8lan(struct e1000_hw *hw) ++{ ++ e1000e_clear_hw_cntrs_base(hw); ++ ++ er32(ALGNERRC); ++ er32(RXERRC); ++ er32(TNCRS); ++ er32(CEXTERR); ++ er32(TSCTC); ++ er32(TSCTFC); ++ ++ er32(MGTPRC); ++ er32(MGTPDC); ++ er32(MGTPTC); ++ ++ er32(IAC); ++ er32(ICRXOC); ++} ++ +diff -r bd70f2f305c6 drivers/net/e1000e/e1000_ich8lan.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/e1000e/e1000_ich8lan.h Mon Jun 15 11:45:35 2009 +0100 +@@ -0,0 +1,147 @@ ++/******************************************************************************* ++ ++ Intel PRO/1000 Linux driver ++ Copyright(c) 1999 - 2009 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ Linux NICS ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++#ifndef _E1000_ICH8LAN_H_ ++#define _E1000_ICH8LAN_H_ ++ ++#define ICH_FLASH_GFPREG 0x0000 ++#define ICH_FLASH_HSFSTS 0x0004 ++#define ICH_FLASH_HSFCTL 0x0006 ++#define ICH_FLASH_FADDR 0x0008 ++#define ICH_FLASH_FDATA0 0x0010 ++ ++#define ICH_FLASH_READ_COMMAND_TIMEOUT 500 ++#define ICH_FLASH_WRITE_COMMAND_TIMEOUT 500 ++#define ICH_FLASH_ERASE_COMMAND_TIMEOUT 3000000 ++#define ICH_FLASH_LINEAR_ADDR_MASK 0x00FFFFFF ++#define ICH_FLASH_CYCLE_REPEAT_COUNT 10 ++ ++#define ICH_CYCLE_READ 0 ++#define ICH_CYCLE_WRITE 2 ++#define ICH_CYCLE_ERASE 3 ++ ++#define FLASH_GFPREG_BASE_MASK 0x1FFF ++#define FLASH_SECTOR_ADDR_SHIFT 12 ++ ++#define ICH_FLASH_SEG_SIZE_256 256 ++#define ICH_FLASH_SEG_SIZE_4K 4096 ++#define ICH_FLASH_SEG_SIZE_8K 8192 ++#define ICH_FLASH_SEG_SIZE_64K 65536 ++#define ICH_FLASH_SECTOR_SIZE 4096 ++ ++#define ICH_FLASH_REG_MAPSIZE 0x00A0 ++ ++#define E1000_ICH_FWSM_RSPCIPHY 0x00000040 /* Reset PHY on PCI Reset */ ++#define E1000_ICH_FWSM_DISSW 0x10000000 /* FW Disables SW Writes */ ++/* FW established a valid mode */ ++#define E1000_ICH_FWSM_FW_VALID 0x00008000 ++ ++#define E1000_ICH_MNG_IAMT_MODE 0x2 ++ ++#define ID_LED_DEFAULT_ICH8LAN ((ID_LED_DEF1_DEF2 << 12) | \ ++ (ID_LED_OFF1_OFF2 << 8) | \ ++ (ID_LED_OFF1_ON2 << 4) | \ ++ (ID_LED_DEF1_DEF2)) ++ ++#define E1000_ICH_NVM_SIG_WORD 0x13 ++#define E1000_ICH_NVM_SIG_MASK 0xC000 ++#define E1000_ICH_NVM_VALID_SIG_MASK 0xC0 ++#define E1000_ICH_NVM_SIG_VALUE 0x80 ++ ++#define E1000_ICH8_LAN_INIT_TIMEOUT 1500 ++ ++#define E1000_FEXTNVM_SW_CONFIG 1 ++#define E1000_FEXTNVM_SW_CONFIG_ICH8M (1 << 27) /* Bit redefined for ICH8M */ ++ ++#define PCIE_ICH8_SNOOP_ALL PCIE_NO_SNOOP_ALL ++ ++#define E1000_ICH_RAR_ENTRIES 7 ++ ++#define PHY_PAGE_SHIFT 5 ++#define PHY_REG(page, reg) (((page) << PHY_PAGE_SHIFT) | \ ++ ((reg) & MAX_PHY_REG_ADDRESS)) ++#define IGP3_KMRN_DIAG PHY_REG(770, 19) /* KMRN Diagnostic */ ++#define IGP3_VR_CTRL PHY_REG(776, 18) /* Voltage Regulator Control */ ++#define IGP3_CAPABILITY PHY_REG(776, 19) /* Capability */ ++#define IGP3_PM_CTRL PHY_REG(769, 20) /* Power Management Control */ ++ ++#define IGP3_KMRN_DIAG_PCS_LOCK_LOSS 0x0002 ++#define IGP3_VR_CTRL_DEV_POWERDOWN_MODE_MASK 0x0300 ++#define IGP3_VR_CTRL_MODE_SHUTDOWN 0x0200 ++#define IGP3_PM_CTRL_FORCE_PWR_DOWN 0x0020 ++ ++/* PHY Wakeup Registers and defines */ ++#define BM_RCTL PHY_REG(BM_WUC_PAGE, 0) ++#define BM_WUC PHY_REG(BM_WUC_PAGE, 1) ++#define BM_WUFC PHY_REG(BM_WUC_PAGE, 2) ++#define BM_WUS PHY_REG(BM_WUC_PAGE, 3) ++#define BM_RAR_L(_i) (BM_PHY_REG(BM_WUC_PAGE, 16 + ((_i) << 2))) ++#define BM_RAR_M(_i) (BM_PHY_REG(BM_WUC_PAGE, 17 + ((_i) << 2))) ++#define BM_RAR_H(_i) (BM_PHY_REG(BM_WUC_PAGE, 18 + ((_i) << 2))) ++#define BM_RAR_CTRL(_i) (BM_PHY_REG(BM_WUC_PAGE, 19 + ((_i) << 2))) ++#define BM_MTA(_i) (BM_PHY_REG(BM_WUC_PAGE, 128 + ((_i) << 1))) ++ ++#define BM_RCTL_UPE 0x0001 /* Unicast Promiscuous Mode */ ++#define BM_RCTL_MPE 0x0002 /* Multicast Promiscuous Mode */ ++#define BM_RCTL_MO_SHIFT 3 /* Multicast Offset Shift */ ++#define BM_RCTL_MO_MASK (3 << 3) /* Multicast Offset Mask */ ++#define BM_RCTL_BAM 0x0020 /* Broadcast Accept Mode */ ++#define BM_RCTL_PMCF 0x0040 /* Pass MAC Control Frames */ ++#define BM_RCTL_RFCE 0x0080 /* Rx Flow Control Enable */ ++ ++/* ++ * Additional interrupts need to be handled for ICH family: ++ * DSW = The FW changed the status of the DISSW bit in FWSM ++ * PHYINT = The LAN connected device generates an interrupt ++ * EPRST = Manageability reset event ++ */ ++#define IMS_ICH_ENABLE_MASK (\ ++ E1000_IMS_DSW | \ ++ E1000_IMS_PHYINT | \ ++ E1000_IMS_EPRST) ++ ++/* Additional interrupt register bit definitions */ ++#define E1000_ICR_LSECPNC 0x00004000 /* PN threshold - client */ ++#define E1000_IMS_LSECPNC E1000_ICR_LSECPNC /* PN threshold - client */ ++#define E1000_ICS_LSECPNC E1000_ICR_LSECPNC /* PN threshold - client */ ++ ++/* Security Processing bit Indication */ ++#define E1000_RXDEXT_LINKSEC_STATUS_LSECH 0x01000000 ++#define E1000_RXDEXT_LINKSEC_ERROR_BIT_MASK 0x60000000 ++#define E1000_RXDEXT_LINKSEC_ERROR_NO_SA_MATCH 0x20000000 ++#define E1000_RXDEXT_LINKSEC_ERROR_REPLAY_ERROR 0x40000000 ++#define E1000_RXDEXT_LINKSEC_ERROR_BAD_SIG 0x60000000 ++ ++ ++void e1000e_set_kmrn_lock_loss_workaround_ich8lan(struct e1000_hw *hw, ++ bool state); ++void e1000e_igp3_phy_powerdown_workaround_ich8lan(struct e1000_hw *hw); ++void e1000e_gig_downshift_workaround_ich8lan(struct e1000_hw *hw); ++void e1000e_disable_gig_wol_ich8lan(struct e1000_hw *hw); ++ ++#endif +diff -r bd70f2f305c6 drivers/net/e1000e/e1000_mac.c +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/e1000e/e1000_mac.c Mon Jun 15 11:45:35 2009 +0100 +@@ -0,0 +1,1878 @@ ++/******************************************************************************* ++ ++ Intel PRO/1000 Linux driver ++ Copyright(c) 1999 - 2009 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ Linux NICS ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++#include "e1000.h" ++ ++static u32 e1000_hash_mc_addr_generic(struct e1000_hw *hw, u8 *mc_addr); ++static s32 e1000_set_default_fc_generic(struct e1000_hw *hw); ++static s32 e1000_commit_fc_settings_generic(struct e1000_hw *hw); ++static s32 e1000_poll_fiber_serdes_link_generic(struct e1000_hw *hw); ++static s32 e1000_validate_mdi_setting_generic(struct e1000_hw *hw); ++static void e1000_set_lan_id_multi_port_pcie(struct e1000_hw *hw); ++ ++/** ++ * e1000_init_mac_ops_generic - Initialize MAC function pointers ++ * @hw: pointer to the HW structure ++ * ++ * Setups up the function pointers to no-op functions ++ **/ ++void e1000_init_mac_ops_generic(struct e1000_hw *hw) ++{ ++ struct e1000_mac_info *mac = &hw->mac; ++ /* General Setup */ ++ mac->ops.set_lan_id = e1000_set_lan_id_multi_port_pcie; ++ mac->ops.read_mac_addr = e1000e_read_mac_addr_generic; ++ mac->ops.config_collision_dist = e1000e_config_collision_dist; ++ /* LINK */ ++ mac->ops.wait_autoneg = e1000_wait_autoneg; ++ /* Management */ ++ mac->ops.mng_host_if_write = e1000_mng_host_if_write_generic; ++ mac->ops.mng_write_cmd_header = e1000_mng_write_cmd_header_generic; ++ mac->ops.mng_enable_host_if = e1000_mng_enable_host_if_generic; ++ /* VLAN, MC, etc. */ ++ mac->ops.rar_set = e1000e_rar_set; ++ mac->ops.validate_mdi_setting = e1000_validate_mdi_setting_generic; ++} ++ ++/** ++ * e1000e_get_bus_info_pcie - Get PCIe bus information ++ * @hw: pointer to the HW structure ++ * ++ * Determines and stores the system bus information for a particular ++ * network interface. The following bus information is determined and stored: ++ * bus speed, bus width, type (PCIe), and PCIe function. ++ **/ ++s32 e1000e_get_bus_info_pcie(struct e1000_hw *hw) ++{ ++ struct e1000_mac_info *mac = &hw->mac; ++ struct e1000_bus_info *bus = &hw->bus; ++ ++ s32 ret_val; ++ u16 pcie_link_status; ++ ++ bus->type = e1000_bus_type_pci_express; ++ bus->speed = e1000_bus_speed_2500; ++ ++ ret_val = e1000_read_pcie_cap_reg(hw, ++ PCIE_LINK_STATUS, ++ &pcie_link_status); ++ if (ret_val) ++ bus->width = e1000_bus_width_unknown; ++ else ++ bus->width = (enum e1000_bus_width)((pcie_link_status & ++ PCIE_LINK_WIDTH_MASK) >> ++ PCIE_LINK_WIDTH_SHIFT); ++ ++ mac->ops.set_lan_id(hw); ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_set_lan_id_multi_port_pcie - Set LAN id for PCIe multiple port devices ++ * ++ * @hw: pointer to the HW structure ++ * ++ * Determines the LAN function id by reading memory-mapped registers ++ * and swaps the port value if requested. ++ **/ ++static void e1000_set_lan_id_multi_port_pcie(struct e1000_hw *hw) ++{ ++ struct e1000_bus_info *bus = &hw->bus; ++ u32 reg; ++ ++ /* ++ * The status register reports the correct function number ++ * for the device regardless of function swap state. ++ */ ++ reg = er32(STATUS); ++ bus->func = (reg & E1000_STATUS_FUNC_MASK) >> E1000_STATUS_FUNC_SHIFT; ++} ++ ++/** ++ * e1000_set_lan_id_single_port - Set LAN id for a single port device ++ * @hw: pointer to the HW structure ++ * ++ * Sets the LAN function id to zero for a single port device. ++ **/ ++void e1000_set_lan_id_single_port(struct e1000_hw *hw) ++{ ++ struct e1000_bus_info *bus = &hw->bus; ++ ++ bus->func = 0; ++} ++ ++/** ++ * e1000e_clear_vfta_generic - Clear VLAN filter table ++ * @hw: pointer to the HW structure ++ * ++ * Clears the register array which contains the VLAN filter table by ++ * setting all the values to 0. ++ **/ ++void e1000e_clear_vfta_generic(struct e1000_hw *hw) ++{ ++ u32 offset; ++ ++ for (offset = 0; offset < E1000_VLAN_FILTER_TBL_SIZE; offset++) { ++ E1000_WRITE_REG_ARRAY(hw, E1000_VFTA, offset, 0); ++ e1e_flush(); ++ } ++} ++ ++/** ++ * e1000e_write_vfta_generic - Write value to VLAN filter table ++ * @hw: pointer to the HW structure ++ * @offset: register offset in VLAN filter table ++ * @value: register value written to VLAN filter table ++ * ++ * Writes value at the given offset in the register array which stores ++ * the VLAN filter table. ++ **/ ++void e1000e_write_vfta_generic(struct e1000_hw *hw, u32 offset, u32 value) ++{ ++ E1000_WRITE_REG_ARRAY(hw, E1000_VFTA, offset, value); ++ e1e_flush(); ++} ++ ++/** ++ * e1000e_init_rx_addrs - Initialize receive address's ++ * @hw: pointer to the HW structure ++ * @rar_count: receive address registers ++ * ++ * Setups the receive address registers by setting the base receive address ++ * register to the devices MAC address and clearing all the other receive ++ * address registers to 0. ++ **/ ++void e1000e_init_rx_addrs(struct e1000_hw *hw, u16 rar_count) ++{ ++ u32 i; ++ u8 mac_addr[ETH_ADDR_LEN] = {0}; ++ ++ /* Setup the receive address */ ++ e_dbg("Programming MAC Address into RAR[0]\n"); ++ ++ hw->mac.ops.rar_set(hw, hw->mac.addr, 0); ++ ++ /* Zero out the other (rar_entry_count - 1) receive addresses */ ++ e_dbg("Clearing RAR[1-%u]\n", rar_count-1); ++ for (i = 1; i < rar_count; i++) ++ hw->mac.ops.rar_set(hw, mac_addr, i); ++} ++ ++/** ++ * e1000_check_alt_mac_addr_generic - Check for alternate MAC addr ++ * @hw: pointer to the HW structure ++ * ++ * Checks the nvm for an alternate MAC address. An alternate MAC address ++ * can be setup by pre-boot software and must be treated like a permanent ++ * address and must override the actual permanent MAC address. If an ++ * alternate MAC address is found it is saved in the hw struct and ++ * programmed into RAR0 and the function returns success, otherwise the ++ * function returns an error. ++ **/ ++s32 e1000_check_alt_mac_addr_generic(struct e1000_hw *hw) ++{ ++ u32 i; ++ s32 ret_val = E1000_SUCCESS; ++ u16 offset, nvm_alt_mac_addr_offset, nvm_data; ++ u8 alt_mac_addr[ETH_ADDR_LEN]; ++ ++ ret_val = e1000_read_nvm(hw, NVM_ALT_MAC_ADDR_PTR, 1, ++ &nvm_alt_mac_addr_offset); ++ if (ret_val) { ++ e_dbg("NVM Read Error\n"); ++ goto out; ++ } ++ ++ if (nvm_alt_mac_addr_offset == 0xFFFF) { ++ ret_val = -(E1000_NOT_IMPLEMENTED); ++ goto out; ++ } ++ ++ if (hw->bus.func == E1000_FUNC_1) ++ nvm_alt_mac_addr_offset += E1000_ALT_MAC_ADDRESS_OFFSET_LAN1; ++ for (i = 0; i < ETH_ADDR_LEN; i += 2) { ++ offset = nvm_alt_mac_addr_offset + (i >> 1); ++ ret_val = e1000_read_nvm(hw, offset, 1, &nvm_data); ++ if (ret_val) { ++ e_dbg("NVM Read Error\n"); ++ goto out; ++ } ++ ++ alt_mac_addr[i] = (u8)(nvm_data & 0xFF); ++ alt_mac_addr[i + 1] = (u8)(nvm_data >> 8); ++ } ++ ++ /* if multicast bit is set, the alternate address will not be used */ ++ if (alt_mac_addr[0] & 0x01) { ++ ret_val = -(E1000_NOT_IMPLEMENTED); ++ goto out; ++ } ++ ++ for (i = 0; i < ETH_ADDR_LEN; i++) ++ hw->mac.addr[i] = hw->mac.perm_addr[i] = alt_mac_addr[i]; ++ ++ hw->mac.ops.rar_set(hw, hw->mac.perm_addr, 0); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000e_rar_set - Set receive address register ++ * @hw: pointer to the HW structure ++ * @addr: pointer to the receive address ++ * @index: receive address array register ++ * ++ * Sets the receive address array register at index to the address passed ++ * in by addr. ++ **/ ++void e1000e_rar_set(struct e1000_hw *hw, u8 *addr, u32 index) ++{ ++ u32 rar_low, rar_high; ++ ++ /* ++ * HW expects these in little endian so we reverse the byte order ++ * from network order (big endian) to little endian ++ */ ++ rar_low = ((u32) addr[0] | ++ ((u32) addr[1] << 8) | ++ ((u32) addr[2] << 16) | ((u32) addr[3] << 24)); ++ ++ rar_high = ((u32) addr[4] | ((u32) addr[5] << 8)); ++ ++ /* If MAC address zero, no need to set the AV bit */ ++ if (rar_low || rar_high) ++ rar_high |= E1000_RAH_AV; ++ ++ /* ++ * Some bridges will combine consecutive 32-bit writes into ++ * a single burst write, which will malfunction on some parts. ++ * The flushes avoid this. ++ */ ++ ew32(RAL(index), rar_low); ++ e1e_flush(); ++ ew32(RAH(index), rar_high); ++ e1e_flush(); ++} ++ ++/** ++ * e1000_mta_set_generic - Set multicast filter table address ++ * @hw: pointer to the HW structure ++ * @hash_value: determines the MTA register and bit to set ++ * ++ * The multicast table address is a register array of 32-bit registers. ++ * The hash_value is used to determine what register the bit is in, the ++ * current value is read, the new bit is OR'd in and the new value is ++ * written back into the register. ++ **/ ++void e1000_mta_set_generic(struct e1000_hw *hw, u32 hash_value) ++{ ++ u32 hash_bit, hash_reg, mta; ++ ++ /* ++ * The MTA is a register array of 32-bit registers. It is ++ * treated like an array of (32*mta_reg_count) bits. We want to ++ * set bit BitArray[hash_value]. So we figure out what register ++ * the bit is in, read it, OR in the new bit, then write ++ * back the new value. The (hw->mac.mta_reg_count - 1) serves as a ++ * mask to bits 31:5 of the hash value which gives us the ++ * register we're modifying. The hash bit within that register ++ * is determined by the lower 5 bits of the hash value. ++ */ ++ hash_reg = (hash_value >> 5) & (hw->mac.mta_reg_count - 1); ++ hash_bit = hash_value & 0x1F; ++ ++ mta = E1000_READ_REG_ARRAY(hw, E1000_MTA, hash_reg); ++ ++ mta |= (1 << hash_bit); ++ ++ E1000_WRITE_REG_ARRAY(hw, E1000_MTA, hash_reg, mta); ++ e1e_flush(); ++} ++ ++/** ++ * e1000e_update_mc_addr_list_generic - Update Multicast addresses ++ * @hw: pointer to the HW structure ++ * @mc_addr_list: array of multicast addresses to program ++ * @mc_addr_count: number of multicast addresses to program ++ * @rar_used_count: the first RAR register free to program ++ * @rar_count: total number of supported Receive Address Registers ++ * ++ * Updates the Receive Address Registers and Multicast Table Array. ++ * The caller must have a packed mc_addr_list of multicast addresses. ++ * The parameter rar_count will usually be hw->mac.rar_entry_count ++ * unless there are workarounds that change this. ++ **/ ++void e1000e_update_mc_addr_list_generic(struct e1000_hw *hw, ++ u8 *mc_addr_list, u32 mc_addr_count, ++ u32 rar_used_count, u32 rar_count) ++{ ++ u32 hash_value; ++ u32 i; ++ u8 mac_addr[ETH_ADDR_LEN] = {0}; ++ ++ /* ++ * Load the first set of multicast addresses into the exact ++ * filters (RAR). If there are not enough to fill the RAR ++ * array, clear the filters. ++ */ ++ for (i = rar_used_count; i < rar_count; i++) { ++ if (mc_addr_count) { ++ hw->mac.ops.rar_set(hw, mc_addr_list, i); ++ mc_addr_count--; ++ mc_addr_list += ETH_ADDR_LEN; ++ } else { ++ hw->mac.ops.rar_set(hw, mac_addr, i); ++ } ++ } ++ ++ /* Clear the old settings from the MTA */ ++ e_dbg("Clearing MTA\n"); ++ for (i = 0; i < hw->mac.mta_reg_count; i++) { ++ E1000_WRITE_REG_ARRAY(hw, E1000_MTA, i, 0); ++ e1e_flush(); ++ } ++ ++ /* Load any remaining multicast addresses into the hash table. */ ++ for (; mc_addr_count > 0; mc_addr_count--) { ++ hash_value = e1000_hash_mc_addr_generic(hw, mc_addr_list); ++ e_dbg("Hash value = 0x%03X\n", hash_value); ++ hw->mac.ops.mta_set(hw, hash_value); ++ mc_addr_list += ETH_ADDR_LEN; ++ } ++} ++ ++/** ++ * e1000_hash_mc_addr_generic - Generate a multicast hash value ++ * @hw: pointer to the HW structure ++ * @mc_addr: pointer to a multicast address ++ * ++ * Generates a multicast address hash value which is used to determine ++ * the multicast filter table array address and new table value. See ++ * e1000_mta_set_generic() ++ **/ ++static u32 e1000_hash_mc_addr_generic(struct e1000_hw *hw, u8 *mc_addr) ++{ ++ u32 hash_value, hash_mask; ++ u8 bit_shift = 0; ++ ++ /* Register count multiplied by bits per register */ ++ hash_mask = (hw->mac.mta_reg_count * 32) - 1; ++ ++ /* ++ * For a mc_filter_type of 0, bit_shift is the number of left-shifts ++ * where 0xFF would still fall within the hash mask. ++ */ ++ while (hash_mask >> bit_shift != 0xFF) ++ bit_shift++; ++ ++ /* ++ * The portion of the address that is used for the hash table ++ * is determined by the mc_filter_type setting. ++ * The algorithm is such that there is a total of 8 bits of shifting. ++ * The bit_shift for a mc_filter_type of 0 represents the number of ++ * left-shifts where the MSB of mc_addr[5] would still fall within ++ * the hash_mask. Case 0 does this exactly. Since there are a total ++ * of 8 bits of shifting, then mc_addr[4] will shift right the ++ * remaining number of bits. Thus 8 - bit_shift. The rest of the ++ * cases are a variation of this algorithm...essentially raising the ++ * number of bits to shift mc_addr[5] left, while still keeping the ++ * 8-bit shifting total. ++ * ++ * For example, given the following Destination MAC Address and an ++ * mta register count of 128 (thus a 4096-bit vector and 0xFFF mask), ++ * we can see that the bit_shift for case 0 is 4. These are the hash ++ * values resulting from each mc_filter_type... ++ * [0] [1] [2] [3] [4] [5] ++ * 01 AA 00 12 34 56 ++ * LSB MSB ++ * ++ * case 0: hash_value = ((0x34 >> 4) | (0x56 << 4)) & 0xFFF = 0x563 ++ * case 1: hash_value = ((0x34 >> 3) | (0x56 << 5)) & 0xFFF = 0xAC6 ++ * case 2: hash_value = ((0x34 >> 2) | (0x56 << 6)) & 0xFFF = 0x163 ++ * case 3: hash_value = ((0x34 >> 0) | (0x56 << 8)) & 0xFFF = 0x634 ++ */ ++ switch (hw->mac.mc_filter_type) { ++ default: ++ case 0: ++ break; ++ case 1: ++ bit_shift += 1; ++ break; ++ case 2: ++ bit_shift += 2; ++ break; ++ case 3: ++ bit_shift += 4; ++ break; ++ } ++ ++ hash_value = hash_mask & (((mc_addr[4] >> (8 - bit_shift)) | ++ (((u16) mc_addr[5]) << bit_shift))); ++ ++ return hash_value; ++} ++ ++/** ++ * e1000e_clear_hw_cntrs_base - Clear base hardware counters ++ * @hw: pointer to the HW structure ++ * ++ * Clears the base hardware counters by reading the counter registers. ++ **/ ++void e1000e_clear_hw_cntrs_base(struct e1000_hw *hw) ++{ ++ er32(CRCERRS); ++ er32(SYMERRS); ++ er32(MPC); ++ er32(SCC); ++ er32(ECOL); ++ er32(MCC); ++ er32(LATECOL); ++ er32(COLC); ++ er32(DC); ++ er32(SEC); ++ er32(RLEC); ++ er32(XONRXC); ++ er32(XONTXC); ++ er32(XOFFRXC); ++ er32(XOFFTXC); ++ er32(FCRUC); ++ er32(GPRC); ++ er32(BPRC); ++ er32(MPRC); ++ er32(GPTC); ++ er32(GORCL); ++ er32(GORCH); ++ er32(GOTCL); ++ er32(GOTCH); ++ er32(RNBC); ++ er32(RUC); ++ er32(RFC); ++ er32(ROC); ++ er32(RJC); ++ er32(TORL); ++ er32(TORH); ++ er32(TOTL); ++ er32(TOTH); ++ er32(TPR); ++ er32(TPT); ++ er32(MPTC); ++ er32(BPTC); ++} ++/** ++ * e1000e_check_for_copper_link - Check for link (Copper) ++ * @hw: pointer to the HW structure ++ * ++ * Checks to see of the link status of the hardware has changed. If a ++ * change in link status has been detected, then we read the PHY registers ++ * to get the current speed/duplex if link exists. ++ **/ ++s32 e1000e_check_for_copper_link(struct e1000_hw *hw) ++{ ++ struct e1000_mac_info *mac = &hw->mac; ++ s32 ret_val; ++ bool link; ++ ++ /* ++ * We only want to go out to the PHY registers to see if Auto-Neg ++ * has completed and/or if our link status has changed. The ++ * get_link_status flag is set upon receiving a Link Status ++ * Change or Rx Sequence Error interrupt. ++ */ ++ if (!mac->get_link_status) { ++ ret_val = E1000_SUCCESS; ++ goto out; ++ } ++ ++ /* ++ * First we want to see if the MII Status Register reports ++ * link. If so, then we want to get the current speed/duplex ++ * of the PHY. ++ */ ++ ret_val = e1000e_phy_has_link_generic(hw, 1, 0, &link); ++ if (ret_val) ++ goto out; ++ ++ if (!link) ++ goto out; /* No link detected */ ++ ++ mac->get_link_status = false; ++ ++ /* ++ * Check if there was DownShift, must be checked ++ * immediately after link-up ++ */ ++ e1000e_check_downshift(hw); ++ ++ /* ++ * If we are forcing speed/duplex, then we simply return since ++ * we have already determined whether we have link or not. ++ */ ++ if (!mac->autoneg) { ++ ret_val = -E1000_ERR_CONFIG; ++ goto out; ++ } ++ ++ /* ++ * Auto-Neg is enabled. Auto Speed Detection takes care ++ * of MAC speed/duplex configuration. So we only need to ++ * configure Collision Distance in the MAC. ++ */ ++ e1000e_config_collision_dist(hw); ++ ++ /* ++ * Configure Flow Control now that Auto-Neg has completed. ++ * First, we need to restore the desired flow control ++ * settings because we may have had to re-autoneg with a ++ * different link partner. ++ */ ++ ret_val = e1000e_config_fc_after_link_up(hw); ++ if (ret_val) ++ e_dbg("Error configuring flow control\n"); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000e_check_for_fiber_link - Check for link (Fiber) ++ * @hw: pointer to the HW structure ++ * ++ * Checks for link up on the hardware. If link is not up and we have ++ * a signal, then we need to force link up. ++ **/ ++s32 e1000e_check_for_fiber_link(struct e1000_hw *hw) ++{ ++ struct e1000_mac_info *mac = &hw->mac; ++ u32 rxcw; ++ u32 ctrl; ++ u32 status; ++ s32 ret_val = E1000_SUCCESS; ++ ++ ctrl = er32(CTRL); ++ status = er32(STATUS); ++ rxcw = er32(RXCW); ++ ++ /* ++ * If we don't have link (auto-negotiation failed or link partner ++ * cannot auto-negotiate), the cable is plugged in (we have signal), ++ * and our link partner is not trying to auto-negotiate with us (we ++ * are receiving idles or data), we need to force link up. We also ++ * need to give auto-negotiation time to complete, in case the cable ++ * was just plugged in. The autoneg_failed flag does this. ++ */ ++ /* (ctrl & E1000_CTRL_SWDPIN1) == 1 == have signal */ ++ if ((ctrl & E1000_CTRL_SWDPIN1) && (!(status & E1000_STATUS_LU)) && ++ (!(rxcw & E1000_RXCW_C))) { ++ if (mac->autoneg_failed == 0) { ++ mac->autoneg_failed = 1; ++ goto out; ++ } ++ e_dbg("NOT RXing /C/, disable AutoNeg and force link.\n"); ++ ++ /* Disable auto-negotiation in the TXCW register */ ++ ew32(TXCW, (mac->txcw & ~E1000_TXCW_ANE)); ++ ++ /* Force link-up and also force full-duplex. */ ++ ctrl = er32(CTRL); ++ ctrl |= (E1000_CTRL_SLU | E1000_CTRL_FD); ++ ew32(CTRL, ctrl); ++ ++ /* Configure Flow Control after forcing link up. */ ++ ret_val = e1000e_config_fc_after_link_up(hw); ++ if (ret_val) { ++ e_dbg("Error configuring flow control\n"); ++ goto out; ++ } ++ } else if ((ctrl & E1000_CTRL_SLU) && (rxcw & E1000_RXCW_C)) { ++ /* ++ * If we are forcing link and we are receiving /C/ ordered ++ * sets, re-enable auto-negotiation in the TXCW register ++ * and disable forced link in the Device Control register ++ * in an attempt to auto-negotiate with our link partner. ++ */ ++ e_dbg("RXing /C/, enable AutoNeg and stop forcing link.\n"); ++ ew32(TXCW, mac->txcw); ++ ew32(CTRL, (ctrl & ~E1000_CTRL_SLU)); ++ ++ mac->serdes_has_link = true; ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000e_check_for_serdes_link - Check for link (Serdes) ++ * @hw: pointer to the HW structure ++ * ++ * Checks for link up on the hardware. If link is not up and we have ++ * a signal, then we need to force link up. ++ **/ ++s32 e1000e_check_for_serdes_link(struct e1000_hw *hw) ++{ ++ struct e1000_mac_info *mac = &hw->mac; ++ u32 rxcw; ++ u32 ctrl; ++ u32 status; ++ s32 ret_val = E1000_SUCCESS; ++ ++ ctrl = er32(CTRL); ++ status = er32(STATUS); ++ rxcw = er32(RXCW); ++ ++ /* ++ * If we don't have link (auto-negotiation failed or link partner ++ * cannot auto-negotiate), and our link partner is not trying to ++ * auto-negotiate with us (we are receiving idles or data), ++ * we need to force link up. We also need to give auto-negotiation ++ * time to complete. ++ */ ++ /* (ctrl & E1000_CTRL_SWDPIN1) == 1 == have signal */ ++ if ((!(status & E1000_STATUS_LU)) && (!(rxcw & E1000_RXCW_C))) { ++ if (mac->autoneg_failed == 0) { ++ mac->autoneg_failed = 1; ++ goto out; ++ } ++ e_dbg("NOT RXing /C/, disable AutoNeg and force link.\n"); ++ ++ /* Disable auto-negotiation in the TXCW register */ ++ ew32(TXCW, (mac->txcw & ~E1000_TXCW_ANE)); ++ ++ /* Force link-up and also force full-duplex. */ ++ ctrl = er32(CTRL); ++ ctrl |= (E1000_CTRL_SLU | E1000_CTRL_FD); ++ ew32(CTRL, ctrl); ++ ++ /* Configure Flow Control after forcing link up. */ ++ ret_val = e1000e_config_fc_after_link_up(hw); ++ if (ret_val) { ++ e_dbg("Error configuring flow control\n"); ++ goto out; ++ } ++ } else if ((ctrl & E1000_CTRL_SLU) && (rxcw & E1000_RXCW_C)) { ++ /* ++ * If we are forcing link and we are receiving /C/ ordered ++ * sets, re-enable auto-negotiation in the TXCW register ++ * and disable forced link in the Device Control register ++ * in an attempt to auto-negotiate with our link partner. ++ */ ++ e_dbg("RXing /C/, enable AutoNeg and stop forcing link.\n"); ++ ew32(TXCW, mac->txcw); ++ ew32(CTRL, (ctrl & ~E1000_CTRL_SLU)); ++ ++ mac->serdes_has_link = true; ++ } else if (!(E1000_TXCW_ANE & er32(TXCW))) { ++ /* ++ * If we force link for non-auto-negotiation switch, check ++ * link status based on MAC synchronization for internal ++ * serdes media type. ++ */ ++ /* SYNCH bit and IV bit are sticky. */ ++ udelay(10); ++ rxcw = er32(RXCW); ++ if (rxcw & E1000_RXCW_SYNCH) { ++ if (!(rxcw & E1000_RXCW_IV)) { ++ mac->serdes_has_link = true; ++ e_dbg("SERDES: Link up - forced.\n"); ++ } ++ } else { ++ mac->serdes_has_link = false; ++ e_dbg("SERDES: Link down - force failed.\n"); ++ } ++ } ++ ++ if (E1000_TXCW_ANE & er32(TXCW)) { ++ status = er32(STATUS); ++ if (status & E1000_STATUS_LU) { ++ /* SYNCH bit and IV bit are sticky, so reread rxcw. */ ++ udelay(10); ++ rxcw = er32(RXCW); ++ if (rxcw & E1000_RXCW_SYNCH) { ++ if (!(rxcw & E1000_RXCW_IV)) { ++ mac->serdes_has_link = true; ++ e_dbg("SERDES: Link up - autoneg " ++ "completed sucessfully.\n"); ++ } else { ++ mac->serdes_has_link = false; ++ e_dbg("SERDES: Link down - invalid" ++ "codewords detected in autoneg.\n"); ++ } ++ } else { ++ mac->serdes_has_link = false; ++ e_dbg("SERDES: Link down - no sync.\n"); ++ } ++ } else { ++ mac->serdes_has_link = false; ++ e_dbg("SERDES: Link down - autoneg failed\n"); ++ } ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000e_setup_link - Setup flow control and link settings ++ * @hw: pointer to the HW structure ++ * ++ * Determines which flow control settings to use, then configures flow ++ * control. Calls the appropriate media-specific link configuration ++ * function. Assuming the adapter has a valid link partner, a valid link ++ * should be established. Assumes the hardware has previously been reset ++ * and the transmitter and receiver are not enabled. ++ **/ ++s32 e1000e_setup_link(struct e1000_hw *hw) ++{ ++ s32 ret_val = E1000_SUCCESS; ++ ++ /* ++ * In the case of the phy reset being blocked, we already have a link. ++ * We do not need to set it up again. ++ */ ++ if (hw->phy.ops.check_reset_block) ++ if (e1000_check_reset_block(hw)) ++ goto out; ++ ++ /* ++ * If requested flow control is set to default, set flow control ++ * based on the EEPROM flow control settings. ++ */ ++ if (hw->fc.requested_mode == e1000_fc_default) { ++ ret_val = e1000_set_default_fc_generic(hw); ++ if (ret_val) ++ goto out; ++ } ++ ++ /* ++ * Save off the requested flow control mode for use later. Depending ++ * on the link partner's capabilities, we may or may not use this mode. ++ */ ++ hw->fc.current_mode = hw->fc.requested_mode; ++ ++ e_dbg("After fix-ups FlowControl is now = %x\n", ++ hw->fc.current_mode); ++ ++ /* Call the necessary media_type subroutine to configure the link. */ ++ ret_val = hw->mac.ops.setup_physical_interface(hw); ++ if (ret_val) ++ goto out; ++ ++ /* ++ * Initialize the flow control address, type, and PAUSE timer ++ * registers to their default values. This is done even if flow ++ * control is disabled, because it does not hurt anything to ++ * initialize these registers. ++ */ ++ e_dbg("Initializing the Flow Control address, type and timer regs\n"); ++ ew32(FCT, FLOW_CONTROL_TYPE); ++ ew32(FCAH, FLOW_CONTROL_ADDRESS_HIGH); ++ ew32(FCAL, FLOW_CONTROL_ADDRESS_LOW); ++ ++ ew32(FCTTV, hw->fc.pause_time); ++ ++ ret_val = e1000e_set_fc_watermarks(hw); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000e_setup_fiber_serdes_link - Setup link for fiber/serdes ++ * @hw: pointer to the HW structure ++ * ++ * Configures collision distance and flow control for fiber and serdes ++ * links. Upon successful setup, poll for link. ++ **/ ++s32 e1000e_setup_fiber_serdes_link(struct e1000_hw *hw) ++{ ++ u32 ctrl; ++ s32 ret_val = E1000_SUCCESS; ++ ++ ctrl = er32(CTRL); ++ ++ /* Take the link out of reset */ ++ ctrl &= ~E1000_CTRL_LRST; ++ ++ e1000e_config_collision_dist(hw); ++ ++ ret_val = e1000_commit_fc_settings_generic(hw); ++ if (ret_val) ++ goto out; ++ ++ /* ++ * Since auto-negotiation is enabled, take the link out of reset (the ++ * link will be in reset, because we previously reset the chip). This ++ * will restart auto-negotiation. If auto-negotiation is successful ++ * then the link-up status bit will be set and the flow control enable ++ * bits (RFCE and TFCE) will be set according to their negotiated value. ++ */ ++ e_dbg("Auto-negotiation enabled\n"); ++ ++ ew32(CTRL, ctrl); ++ e1e_flush(); ++ msleep(1); ++ ++ /* ++ * For these adapters, the SW definable pin 1 is set when the optics ++ * detect a signal. If we have a signal, then poll for a "Link-Up" ++ * indication. ++ */ ++ if (hw->phy.media_type == e1000_media_type_internal_serdes || ++ (er32(CTRL) & E1000_CTRL_SWDPIN1)) { ++ ret_val = e1000_poll_fiber_serdes_link_generic(hw); ++ } else { ++ e_dbg("No signal detected\n"); ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000e_config_collision_dist - Configure collision distance ++ * @hw: pointer to the HW structure ++ * ++ * Configures the collision distance to the default value and is used ++ * during link setup. Currently no func pointer exists and all ++ * implementations are handled in the generic version of this function. ++ **/ ++void e1000e_config_collision_dist(struct e1000_hw *hw) ++{ ++ u32 tctl; ++ ++ tctl = er32(TCTL); ++ ++ tctl &= ~E1000_TCTL_COLD; ++ tctl |= E1000_COLLISION_DISTANCE << E1000_COLD_SHIFT; ++ ++ ew32(TCTL, tctl); ++ e1e_flush(); ++} ++ ++/** ++ * e1000_poll_fiber_serdes_link_generic - Poll for link up ++ * @hw: pointer to the HW structure ++ * ++ * Polls for link up by reading the status register, if link fails to come ++ * up with auto-negotiation, then the link is forced if a signal is detected. ++ **/ ++static s32 e1000_poll_fiber_serdes_link_generic(struct e1000_hw *hw) ++{ ++ struct e1000_mac_info *mac = &hw->mac; ++ u32 i, status; ++ s32 ret_val = E1000_SUCCESS; ++ ++ /* ++ * If we have a signal (the cable is plugged in, or assumed true for ++ * serdes media) then poll for a "Link-Up" indication in the Device ++ * Status Register. Time-out if a link isn't seen in 500 milliseconds ++ * seconds (Auto-negotiation should complete in less than 500 ++ * milliseconds even if the other end is doing it in SW). ++ */ ++ for (i = 0; i < FIBER_LINK_UP_LIMIT; i++) { ++ msleep(10); ++ status = er32(STATUS); ++ if (status & E1000_STATUS_LU) ++ break; ++ } ++ if (i == FIBER_LINK_UP_LIMIT) { ++ e_dbg("Never got a valid link from auto-neg!!!\n"); ++ mac->autoneg_failed = 1; ++ /* ++ * AutoNeg failed to achieve a link, so we'll call ++ * mac->check_for_link. This routine will force the ++ * link up if we detect a signal. This will allow us to ++ * communicate with non-autonegotiating link partners. ++ */ ++ ret_val = hw->mac.ops.check_for_link(hw); ++ if (ret_val) { ++ e_dbg("Error while checking for link\n"); ++ goto out; ++ } ++ mac->autoneg_failed = 0; ++ } else { ++ mac->autoneg_failed = 0; ++ e_dbg("Valid Link Found\n"); ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_commit_fc_settings_generic - Configure flow control ++ * @hw: pointer to the HW structure ++ * ++ * Write the flow control settings to the Transmit Config Word Register (TXCW) ++ * base on the flow control settings in e1000_mac_info. ++ **/ ++static s32 e1000_commit_fc_settings_generic(struct e1000_hw *hw) ++{ ++ struct e1000_mac_info *mac = &hw->mac; ++ u32 txcw; ++ s32 ret_val = E1000_SUCCESS; ++ ++ /* ++ * Check for a software override of the flow control settings, and ++ * setup the device accordingly. If auto-negotiation is enabled, then ++ * software will have to set the "PAUSE" bits to the correct value in ++ * the Transmit Config Word Register (TXCW) and re-start auto- ++ * negotiation. However, if auto-negotiation is disabled, then ++ * software will have to manually configure the two flow control enable ++ * bits in the CTRL register. ++ * ++ * The possible values of the "fc" parameter are: ++ * 0: Flow control is completely disabled ++ * 1: Rx flow control is enabled (we can receive pause frames, ++ * but not send pause frames). ++ * 2: Tx flow control is enabled (we can send pause frames but we ++ * do not support receiving pause frames). ++ * 3: Both Rx and Tx flow control (symmetric) are enabled. ++ */ ++ switch (hw->fc.current_mode) { ++ case e1000_fc_none: ++ /* Flow control completely disabled by a software over-ride. */ ++ txcw = (E1000_TXCW_ANE | E1000_TXCW_FD); ++ break; ++ case e1000_fc_rx_pause: ++ /* ++ * Rx Flow control is enabled and Tx Flow control is disabled ++ * by a software over-ride. Since there really isn't a way to ++ * advertise that we are capable of Rx Pause ONLY, we will ++ * advertise that we support both symmetric and asymmetric RX ++ * PAUSE. Later, we will disable the adapter's ability to send ++ * PAUSE frames. ++ */ ++ txcw = (E1000_TXCW_ANE | E1000_TXCW_FD | E1000_TXCW_PAUSE_MASK); ++ break; ++ case e1000_fc_tx_pause: ++ /* ++ * Tx Flow control is enabled, and Rx Flow control is disabled, ++ * by a software over-ride. ++ */ ++ txcw = (E1000_TXCW_ANE | E1000_TXCW_FD | E1000_TXCW_ASM_DIR); ++ break; ++ case e1000_fc_full: ++ /* ++ * Flow control (both Rx and Tx) is enabled by a software ++ * over-ride. ++ */ ++ txcw = (E1000_TXCW_ANE | E1000_TXCW_FD | E1000_TXCW_PAUSE_MASK); ++ break; ++ default: ++ e_dbg("Flow control param set incorrectly\n"); ++ ret_val = -E1000_ERR_CONFIG; ++ goto out; ++ break; ++ } ++ ++ ew32(TXCW, txcw); ++ mac->txcw = txcw; ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000e_set_fc_watermarks - Set flow control high/low watermarks ++ * @hw: pointer to the HW structure ++ * ++ * Sets the flow control high/low threshold (watermark) registers. If ++ * flow control XON frame transmission is enabled, then set XON frame ++ * transmission as well. ++ **/ ++s32 e1000e_set_fc_watermarks(struct e1000_hw *hw) ++{ ++ s32 ret_val = E1000_SUCCESS; ++ u32 fcrtl = 0, fcrth = 0; ++ ++ /* ++ * Set the flow control receive threshold registers. Normally, ++ * these registers will be set to a default threshold that may be ++ * adjusted later by the driver's runtime code. However, if the ++ * ability to transmit pause frames is not enabled, then these ++ * registers will be set to 0. ++ */ ++ if (hw->fc.current_mode & e1000_fc_tx_pause) { ++ /* ++ * We need to set up the Receive Threshold high and low water ++ * marks as well as (optionally) enabling the transmission of ++ * XON frames. ++ */ ++ fcrtl = hw->fc.low_water; ++ if (hw->fc.send_xon) ++ fcrtl |= E1000_FCRTL_XONE; ++ ++ fcrth = hw->fc.high_water; ++ } ++ ew32(FCRTL, fcrtl); ++ ew32(FCRTH, fcrth); ++ ++ return ret_val; ++} ++ ++/** ++ * e1000_set_default_fc_generic - Set flow control default values ++ * @hw: pointer to the HW structure ++ * ++ * Read the EEPROM for the default values for flow control and store the ++ * values. ++ **/ ++static s32 e1000_set_default_fc_generic(struct e1000_hw *hw) ++{ ++ s32 ret_val = E1000_SUCCESS; ++ u16 nvm_data; ++ ++ /* ++ * Read and store word 0x0F of the EEPROM. This word contains bits ++ * that determine the hardware's default PAUSE (flow control) mode, ++ * a bit that determines whether the HW defaults to enabling or ++ * disabling auto-negotiation, and the direction of the ++ * SW defined pins. If there is no SW over-ride of the flow ++ * control setting, then the variable hw->fc will ++ * be initialized based on a value in the EEPROM. ++ */ ++ ret_val = e1000_read_nvm(hw, NVM_INIT_CONTROL2_REG, 1, &nvm_data); ++ ++ if (ret_val) { ++ e_dbg("NVM Read Error\n"); ++ goto out; ++ } ++ ++ if ((nvm_data & NVM_WORD0F_PAUSE_MASK) == 0) ++ hw->fc.requested_mode = e1000_fc_none; ++ else if ((nvm_data & NVM_WORD0F_PAUSE_MASK) == ++ NVM_WORD0F_ASM_DIR) ++ hw->fc.requested_mode = e1000_fc_tx_pause; ++ else ++ hw->fc.requested_mode = e1000_fc_full; ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000e_force_mac_fc - Force the MAC's flow control settings ++ * @hw: pointer to the HW structure ++ * ++ * Force the MAC's flow control settings. Sets the TFCE and RFCE bits in the ++ * device control register to reflect the adapter settings. TFCE and RFCE ++ * need to be explicitly set by software when a copper PHY is used because ++ * autonegotiation is managed by the PHY rather than the MAC. Software must ++ * also configure these bits when link is forced on a fiber connection. ++ **/ ++s32 e1000e_force_mac_fc(struct e1000_hw *hw) ++{ ++ u32 ctrl; ++ s32 ret_val = E1000_SUCCESS; ++ ++ ctrl = er32(CTRL); ++ ++ /* ++ * Because we didn't get link via the internal auto-negotiation ++ * mechanism (we either forced link or we got link via PHY ++ * auto-neg), we have to manually enable/disable transmit an ++ * receive flow control. ++ * ++ * The "Case" statement below enables/disable flow control ++ * according to the "hw->fc.current_mode" parameter. ++ * ++ * The possible values of the "fc" parameter are: ++ * 0: Flow control is completely disabled ++ * 1: Rx flow control is enabled (we can receive pause ++ * frames but not send pause frames). ++ * 2: Tx flow control is enabled (we can send pause frames ++ * frames but we do not receive pause frames). ++ * 3: Both Rx and Tx flow control (symmetric) is enabled. ++ * other: No other values should be possible at this point. ++ */ ++ e_dbg("hw->fc.current_mode = %u\n", hw->fc.current_mode); ++ ++ switch (hw->fc.current_mode) { ++ case e1000_fc_none: ++ ctrl &= (~(E1000_CTRL_TFCE | E1000_CTRL_RFCE)); ++ break; ++ case e1000_fc_rx_pause: ++ ctrl &= (~E1000_CTRL_TFCE); ++ ctrl |= E1000_CTRL_RFCE; ++ break; ++ case e1000_fc_tx_pause: ++ ctrl &= (~E1000_CTRL_RFCE); ++ ctrl |= E1000_CTRL_TFCE; ++ break; ++ case e1000_fc_full: ++ ctrl |= (E1000_CTRL_TFCE | E1000_CTRL_RFCE); ++ break; ++ default: ++ e_dbg("Flow control param set incorrectly\n"); ++ ret_val = -E1000_ERR_CONFIG; ++ goto out; ++ } ++ ++ ew32(CTRL, ctrl); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000e_config_fc_after_link_up - Configures flow control after link ++ * @hw: pointer to the HW structure ++ * ++ * Checks the status of auto-negotiation after link up to ensure that the ++ * speed and duplex were not forced. If the link needed to be forced, then ++ * flow control needs to be forced also. If auto-negotiation is enabled ++ * and did not fail, then we configure flow control based on our link ++ * partner. ++ **/ ++s32 e1000e_config_fc_after_link_up(struct e1000_hw *hw) ++{ ++ struct e1000_mac_info *mac = &hw->mac; ++ s32 ret_val = E1000_SUCCESS; ++ u16 mii_status_reg, mii_nway_adv_reg, mii_nway_lp_ability_reg; ++ u16 speed, duplex; ++ ++ /* ++ * Check for the case where we have fiber media and auto-neg failed ++ * so we had to force link. In this case, we need to force the ++ * configuration of the MAC to match the "fc" parameter. ++ */ ++ if (mac->autoneg_failed) { ++ if (hw->phy.media_type == e1000_media_type_fiber || ++ hw->phy.media_type == e1000_media_type_internal_serdes) ++ ret_val = e1000e_force_mac_fc(hw); ++ } else { ++ if (hw->phy.media_type == e1000_media_type_copper) ++ ret_val = e1000e_force_mac_fc(hw); ++ } ++ ++ if (ret_val) { ++ e_dbg("Error forcing flow control settings\n"); ++ goto out; ++ } ++ ++ /* ++ * Check for the case where we have copper media and auto-neg is ++ * enabled. In this case, we need to check and see if Auto-Neg ++ * has completed, and if so, how the PHY and link partner has ++ * flow control configured. ++ */ ++ if ((hw->phy.media_type == e1000_media_type_copper) && mac->autoneg) { ++ /* ++ * Read the MII Status Register and check to see if AutoNeg ++ * has completed. We read this twice because this reg has ++ * some "sticky" (latched) bits. ++ */ ++ ret_val = e1e_rphy(hw, PHY_STATUS, &mii_status_reg); ++ if (ret_val) ++ goto out; ++ ret_val = e1e_rphy(hw, PHY_STATUS, &mii_status_reg); ++ if (ret_val) ++ goto out; ++ ++ if (!(mii_status_reg & MII_SR_AUTONEG_COMPLETE)) { ++ e_dbg("Copper PHY and Auto Neg " ++ "has not completed.\n"); ++ goto out; ++ } ++ ++ /* ++ * The AutoNeg process has completed, so we now need to ++ * read both the Auto Negotiation Advertisement ++ * Register (Address 4) and the Auto_Negotiation Base ++ * Page Ability Register (Address 5) to determine how ++ * flow control was negotiated. ++ */ ++ ret_val = e1e_rphy(hw, PHY_AUTONEG_ADV, ++ &mii_nway_adv_reg); ++ if (ret_val) ++ goto out; ++ ret_val = e1e_rphy(hw, PHY_LP_ABILITY, ++ &mii_nway_lp_ability_reg); ++ if (ret_val) ++ goto out; ++ ++ /* ++ * Two bits in the Auto Negotiation Advertisement Register ++ * (Address 4) and two bits in the Auto Negotiation Base ++ * Page Ability Register (Address 5) determine flow control ++ * for both the PHY and the link partner. The following ++ * table, taken out of the IEEE 802.3ab/D6.0 dated March 25, ++ * 1999, describes these PAUSE resolution bits and how flow ++ * control is determined based upon these settings. ++ * NOTE: DC = Don't Care ++ * ++ * LOCAL DEVICE | LINK PARTNER ++ * PAUSE | ASM_DIR | PAUSE | ASM_DIR | NIC Resolution ++ *-------|---------|-------|---------|-------------------- ++ * 0 | 0 | DC | DC | e1000_fc_none ++ * 0 | 1 | 0 | DC | e1000_fc_none ++ * 0 | 1 | 1 | 0 | e1000_fc_none ++ * 0 | 1 | 1 | 1 | e1000_fc_tx_pause ++ * 1 | 0 | 0 | DC | e1000_fc_none ++ * 1 | DC | 1 | DC | e1000_fc_full ++ * 1 | 1 | 0 | 0 | e1000_fc_none ++ * 1 | 1 | 0 | 1 | e1000_fc_rx_pause ++ * ++ * Are both PAUSE bits set to 1? If so, this implies ++ * Symmetric Flow Control is enabled at both ends. The ++ * ASM_DIR bits are irrelevant per the spec. ++ * ++ * For Symmetric Flow Control: ++ * ++ * LOCAL DEVICE | LINK PARTNER ++ * PAUSE | ASM_DIR | PAUSE | ASM_DIR | Result ++ *-------|---------|-------|---------|-------------------- ++ * 1 | DC | 1 | DC | E1000_fc_full ++ * ++ */ ++ if ((mii_nway_adv_reg & NWAY_AR_PAUSE) && ++ (mii_nway_lp_ability_reg & NWAY_LPAR_PAUSE)) { ++ /* ++ * Now we need to check if the user selected Rx ONLY ++ * of pause frames. In this case, we had to advertise ++ * FULL flow control because we could not advertise RX ++ * ONLY. Hence, we must now check to see if we need to ++ * turn OFF the TRANSMISSION of PAUSE frames. ++ */ ++ if (hw->fc.requested_mode == e1000_fc_full) { ++ hw->fc.current_mode = e1000_fc_full; ++ e_dbg("Flow Control = FULL.\r\n"); ++ } else { ++ hw->fc.current_mode = e1000_fc_rx_pause; ++ e_dbg("Flow Control = " ++ "RX PAUSE frames only.\r\n"); ++ } ++ } ++ /* ++ * For receiving PAUSE frames ONLY. ++ * ++ * LOCAL DEVICE | LINK PARTNER ++ * PAUSE | ASM_DIR | PAUSE | ASM_DIR | Result ++ *-------|---------|-------|---------|-------------------- ++ * 0 | 1 | 1 | 1 | e1000_fc_tx_pause ++ */ ++ else if (!(mii_nway_adv_reg & NWAY_AR_PAUSE) && ++ (mii_nway_adv_reg & NWAY_AR_ASM_DIR) && ++ (mii_nway_lp_ability_reg & NWAY_LPAR_PAUSE) && ++ (mii_nway_lp_ability_reg & NWAY_LPAR_ASM_DIR)) { ++ hw->fc.current_mode = e1000_fc_tx_pause; ++ e_dbg("Flow Control = TX PAUSE frames only.\r\n"); ++ } ++ /* ++ * For transmitting PAUSE frames ONLY. ++ * ++ * LOCAL DEVICE | LINK PARTNER ++ * PAUSE | ASM_DIR | PAUSE | ASM_DIR | Result ++ *-------|---------|-------|---------|-------------------- ++ * 1 | 1 | 0 | 1 | e1000_fc_rx_pause ++ */ ++ else if ((mii_nway_adv_reg & NWAY_AR_PAUSE) && ++ (mii_nway_adv_reg & NWAY_AR_ASM_DIR) && ++ !(mii_nway_lp_ability_reg & NWAY_LPAR_PAUSE) && ++ (mii_nway_lp_ability_reg & NWAY_LPAR_ASM_DIR)) { ++ hw->fc.current_mode = e1000_fc_rx_pause; ++ e_dbg("Flow Control = RX PAUSE frames only.\r\n"); ++ } else { ++ /* ++ * Per the IEEE spec, at this point flow control ++ * should be disabled. ++ */ ++ hw->fc.current_mode = e1000_fc_none; ++ e_dbg("Flow Control = NONE.\r\n"); ++ } ++ ++ /* ++ * Now we need to do one last check... If we auto- ++ * negotiated to HALF DUPLEX, flow control should not be ++ * enabled per IEEE 802.3 spec. ++ */ ++ ret_val = mac->ops.get_link_up_info(hw, &speed, &duplex); ++ if (ret_val) { ++ e_dbg("Error getting link speed and duplex\n"); ++ goto out; ++ } ++ ++ if (duplex == HALF_DUPLEX) ++ hw->fc.current_mode = e1000_fc_none; ++ ++ /* ++ * Now we call a subroutine to actually force the MAC ++ * controller to use the correct flow control settings. ++ */ ++ ret_val = e1000e_force_mac_fc(hw); ++ if (ret_val) { ++ e_dbg("Error forcing flow control settings\n"); ++ goto out; ++ } ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000e_get_speed_and_duplex_copper - Retrieve current speed/duplex ++ * @hw: pointer to the HW structure ++ * @speed: stores the current speed ++ * @duplex: stores the current duplex ++ * ++ * Read the status register for the current speed/duplex and store the current ++ * speed and duplex for copper connections. ++ **/ ++s32 e1000e_get_speed_and_duplex_copper(struct e1000_hw *hw, u16 *speed, ++ u16 *duplex) ++{ ++ u32 status; ++ ++ status = er32(STATUS); ++ if (status & E1000_STATUS_SPEED_1000) { ++ *speed = SPEED_1000; ++ e_dbg("1000 Mbs, "); ++ } else if (status & E1000_STATUS_SPEED_100) { ++ *speed = SPEED_100; ++ e_dbg("100 Mbs, "); ++ } else { ++ *speed = SPEED_10; ++ e_dbg("10 Mbs, "); ++ } ++ ++ if (status & E1000_STATUS_FD) { ++ *duplex = FULL_DUPLEX; ++ e_dbg("Full Duplex\n"); ++ } else { ++ *duplex = HALF_DUPLEX; ++ e_dbg("Half Duplex\n"); ++ } ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_get_speed_and_duplex_fiber_generic - Retrieve current speed/duplex ++ * @hw: pointer to the HW structure ++ * @speed: stores the current speed ++ * @duplex: stores the current duplex ++ * ++ * Sets the speed and duplex to gigabit full duplex (the only possible option) ++ * for fiber/serdes links. ++ **/ ++s32 e1000e_get_speed_and_duplex_fiber_serdes(struct e1000_hw *hw, ++ u16 *speed, u16 *duplex) ++{ ++ *speed = SPEED_1000; ++ *duplex = FULL_DUPLEX; ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000e_get_hw_semaphore - Acquire hardware semaphore ++ * @hw: pointer to the HW structure ++ * ++ * Acquire the HW semaphore to access the PHY or NVM ++ **/ ++s32 e1000e_get_hw_semaphore(struct e1000_hw *hw) ++{ ++ u32 swsm; ++ s32 ret_val = E1000_SUCCESS; ++ s32 timeout = hw->nvm.word_size + 1; ++ s32 i = 0; ++ ++ /* Get the SW semaphore */ ++ while (i < timeout) { ++ swsm = er32(SWSM); ++ if (!(swsm & E1000_SWSM_SMBI)) ++ break; ++ ++ udelay(50); ++ i++; ++ } ++ ++ if (i == timeout) { ++ e_dbg("Driver can't access device - SMBI bit is set.\n"); ++ ret_val = -E1000_ERR_NVM; ++ goto out; ++ } ++ ++ /* Get the FW semaphore. */ ++ for (i = 0; i < timeout; i++) { ++ swsm = er32(SWSM); ++ ew32(SWSM, swsm | E1000_SWSM_SWESMBI); ++ ++ /* Semaphore acquired if bit latched */ ++ if (er32(SWSM) & E1000_SWSM_SWESMBI) ++ break; ++ ++ udelay(50); ++ } ++ ++ if (i == timeout) { ++ /* Release semaphores */ ++ e1000e_put_hw_semaphore(hw); ++ e_dbg("Driver can't access the NVM\n"); ++ ret_val = -E1000_ERR_NVM; ++ goto out; ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000e_put_hw_semaphore - Release hardware semaphore ++ * @hw: pointer to the HW structure ++ * ++ * Release hardware semaphore used to access the PHY or NVM ++ **/ ++void e1000e_put_hw_semaphore(struct e1000_hw *hw) ++{ ++ u32 swsm; ++ ++ swsm = er32(SWSM); ++ swsm &= ~(E1000_SWSM_SMBI | E1000_SWSM_SWESMBI); ++ ew32(SWSM, swsm); ++} ++/** ++ * e1000e_get_auto_rd_done - Check for auto read completion ++ * @hw: pointer to the HW structure ++ * ++ * Check EEPROM for Auto Read done bit. ++ **/ ++s32 e1000e_get_auto_rd_done(struct e1000_hw *hw) ++{ ++ s32 i = 0; ++ s32 ret_val = E1000_SUCCESS; ++ ++ while (i < AUTO_READ_DONE_TIMEOUT) { ++ if (er32(EECD) & E1000_EECD_AUTO_RD) ++ break; ++ msleep(1); ++ i++; ++ } ++ ++ if (i == AUTO_READ_DONE_TIMEOUT) { ++ e_dbg("Auto read by HW from NVM has not completed.\n"); ++ ret_val = -E1000_ERR_RESET; ++ goto out; ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000e_valid_led_default - Verify a valid default LED config ++ * @hw: pointer to the HW structure ++ * @data: pointer to the NVM (EEPROM) ++ * ++ * Read the EEPROM for the current default LED configuration. If the ++ * LED configuration is not valid, set to a valid LED configuration. ++ **/ ++s32 e1000e_valid_led_default(struct e1000_hw *hw, u16 *data) ++{ ++ s32 ret_val; ++ ++ ret_val = e1000_read_nvm(hw, NVM_ID_LED_SETTINGS, 1, data); ++ if (ret_val) { ++ e_dbg("NVM Read Error\n"); ++ goto out; ++ } ++ ++ if (*data == ID_LED_RESERVED_0000 || *data == ID_LED_RESERVED_FFFF) ++ *data = ID_LED_DEFAULT; ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000e_id_led_init - ++ * @hw: pointer to the HW structure ++ * ++ **/ ++s32 e1000e_id_led_init(struct e1000_hw *hw) ++{ ++ struct e1000_mac_info *mac = &hw->mac; ++ s32 ret_val; ++ const u32 ledctl_mask = 0x000000FF; ++ const u32 ledctl_on = E1000_LEDCTL_MODE_LED_ON; ++ const u32 ledctl_off = E1000_LEDCTL_MODE_LED_OFF; ++ u16 data, i, temp; ++ const u16 led_mask = 0x0F; ++ ++ ret_val = hw->nvm.ops.valid_led_default(hw, &data); ++ if (ret_val) ++ goto out; ++ ++ mac->ledctl_default = er32(LEDCTL); ++ mac->ledctl_mode1 = mac->ledctl_default; ++ mac->ledctl_mode2 = mac->ledctl_default; ++ ++ for (i = 0; i < 4; i++) { ++ temp = (data >> (i << 2)) & led_mask; ++ switch (temp) { ++ case ID_LED_ON1_DEF2: ++ case ID_LED_ON1_ON2: ++ case ID_LED_ON1_OFF2: ++ mac->ledctl_mode1 &= ~(ledctl_mask << (i << 3)); ++ mac->ledctl_mode1 |= ledctl_on << (i << 3); ++ break; ++ case ID_LED_OFF1_DEF2: ++ case ID_LED_OFF1_ON2: ++ case ID_LED_OFF1_OFF2: ++ mac->ledctl_mode1 &= ~(ledctl_mask << (i << 3)); ++ mac->ledctl_mode1 |= ledctl_off << (i << 3); ++ break; ++ default: ++ /* Do nothing */ ++ break; ++ } ++ switch (temp) { ++ case ID_LED_DEF1_ON2: ++ case ID_LED_ON1_ON2: ++ case ID_LED_OFF1_ON2: ++ mac->ledctl_mode2 &= ~(ledctl_mask << (i << 3)); ++ mac->ledctl_mode2 |= ledctl_on << (i << 3); ++ break; ++ case ID_LED_DEF1_OFF2: ++ case ID_LED_ON1_OFF2: ++ case ID_LED_OFF1_OFF2: ++ mac->ledctl_mode2 &= ~(ledctl_mask << (i << 3)); ++ mac->ledctl_mode2 |= ledctl_off << (i << 3); ++ break; ++ default: ++ /* Do nothing */ ++ break; ++ } ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_setup_led_generic - Configures SW controllable LED ++ * @hw: pointer to the HW structure ++ * ++ * This prepares the SW controllable LED for use and saves the current state ++ * of the LED so it can be later restored. ++ **/ ++s32 e1000_setup_led_generic(struct e1000_hw *hw) ++{ ++ u32 ledctl; ++ s32 ret_val = E1000_SUCCESS; ++ ++ if (hw->mac.ops.setup_led != e1000_setup_led_generic) { ++ ret_val = -E1000_ERR_CONFIG; ++ goto out; ++ } ++ ++ if (hw->phy.media_type == e1000_media_type_fiber) { ++ ledctl = er32(LEDCTL); ++ hw->mac.ledctl_default = ledctl; ++ /* Turn off LED0 */ ++ ledctl &= ~(E1000_LEDCTL_LED0_IVRT | ++ E1000_LEDCTL_LED0_BLINK | ++ E1000_LEDCTL_LED0_MODE_MASK); ++ ledctl |= (E1000_LEDCTL_MODE_LED_OFF << ++ E1000_LEDCTL_LED0_MODE_SHIFT); ++ ew32(LEDCTL, ledctl); ++ } else if (hw->phy.media_type == e1000_media_type_copper) { ++ ew32(LEDCTL, hw->mac.ledctl_mode1); ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000e_cleanup_led_generic - Set LED config to default operation ++ * @hw: pointer to the HW structure ++ * ++ * Remove the current LED configuration and set the LED configuration ++ * to the default value, saved from the EEPROM. ++ **/ ++s32 e1000e_cleanup_led_generic(struct e1000_hw *hw) ++{ ++ s32 ret_val = E1000_SUCCESS; ++ ++ if (hw->mac.ops.cleanup_led != e1000e_cleanup_led_generic) { ++ ret_val = -E1000_ERR_CONFIG; ++ goto out; ++ } ++ ++ ew32(LEDCTL, hw->mac.ledctl_default); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000e_blink_led - Blink LED ++ * @hw: pointer to the HW structure ++ * ++ * Blink the LEDs which are set to be on. ++ **/ ++s32 e1000e_blink_led(struct e1000_hw *hw) ++{ ++ u32 ledctl_blink = 0; ++ u32 i; ++ ++ if (hw->phy.media_type == e1000_media_type_fiber) { ++ /* always blink LED0 for PCI-E fiber */ ++ ledctl_blink = E1000_LEDCTL_LED0_BLINK | ++ (E1000_LEDCTL_MODE_LED_ON << E1000_LEDCTL_LED0_MODE_SHIFT); ++ } else { ++ /* ++ * set the blink bit for each LED that's "on" (0x0E) ++ * in ledctl_mode2 ++ */ ++ ledctl_blink = hw->mac.ledctl_mode2; ++ for (i = 0; i < 4; i++) ++ if (((hw->mac.ledctl_mode2 >> (i * 8)) & 0xFF) == ++ E1000_LEDCTL_MODE_LED_ON) ++ ledctl_blink |= (E1000_LEDCTL_LED0_BLINK << ++ (i * 8)); ++ } ++ ++ ew32(LEDCTL, ledctl_blink); ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000e_led_on_generic - Turn LED on ++ * @hw: pointer to the HW structure ++ * ++ * Turn LED on. ++ **/ ++s32 e1000e_led_on_generic(struct e1000_hw *hw) ++{ ++ u32 ctrl; ++ ++ switch (hw->phy.media_type) { ++ case e1000_media_type_fiber: ++ ctrl = er32(CTRL); ++ ctrl &= ~E1000_CTRL_SWDPIN0; ++ ctrl |= E1000_CTRL_SWDPIO0; ++ ew32(CTRL, ctrl); ++ break; ++ case e1000_media_type_copper: ++ ew32(LEDCTL, hw->mac.ledctl_mode2); ++ break; ++ default: ++ break; ++ } ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000e_led_off_generic - Turn LED off ++ * @hw: pointer to the HW structure ++ * ++ * Turn LED off. ++ **/ ++s32 e1000e_led_off_generic(struct e1000_hw *hw) ++{ ++ u32 ctrl; ++ ++ switch (hw->phy.media_type) { ++ case e1000_media_type_fiber: ++ ctrl = er32(CTRL); ++ ctrl |= E1000_CTRL_SWDPIN0; ++ ctrl |= E1000_CTRL_SWDPIO0; ++ ew32(CTRL, ctrl); ++ break; ++ case e1000_media_type_copper: ++ ew32(LEDCTL, hw->mac.ledctl_mode1); ++ break; ++ default: ++ break; ++ } ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000e_set_pcie_no_snoop - Set PCI-express capabilities ++ * @hw: pointer to the HW structure ++ * @no_snoop: bitmap of snoop events ++ * ++ * Set the PCI-express register to snoop for events enabled in 'no_snoop'. ++ **/ ++void e1000e_set_pcie_no_snoop(struct e1000_hw *hw, u32 no_snoop) ++{ ++ u32 gcr; ++ ++ if (hw->bus.type != e1000_bus_type_pci_express) ++ goto out; ++ ++ if (no_snoop) { ++ gcr = er32(GCR); ++ gcr &= ~(PCIE_NO_SNOOP_ALL); ++ gcr |= no_snoop; ++ ew32(GCR, gcr); ++ } ++out: ++ return; ++} ++ ++/** ++ * e1000e_disable_pcie_master - Disables PCI-express master access ++ * @hw: pointer to the HW structure ++ * ++ * Returns 0 (E1000_SUCCESS) if successful, else returns -10 ++ * (-E1000_ERR_MASTER_REQUESTS_PENDING) if master disable bit has not caused ++ * the master requests to be disabled. ++ * ++ * Disables PCI-Express master access and verifies there are no pending ++ * requests. ++ **/ ++s32 e1000e_disable_pcie_master(struct e1000_hw *hw) ++{ ++ u32 ctrl; ++ s32 timeout = MASTER_DISABLE_TIMEOUT; ++ s32 ret_val = E1000_SUCCESS; ++ ++ if (hw->bus.type != e1000_bus_type_pci_express) ++ goto out; ++ ++ ctrl = er32(CTRL); ++ ctrl |= E1000_CTRL_GIO_MASTER_DISABLE; ++ ew32(CTRL, ctrl); ++ ++ while (timeout) { ++ if (!(er32(STATUS) & ++ E1000_STATUS_GIO_MASTER_ENABLE)) ++ break; ++ udelay(100); ++ timeout--; ++ } ++ ++ if (!timeout) { ++ e_dbg("Master requests are pending.\n"); ++ ret_val = -E1000_ERR_MASTER_REQUESTS_PENDING; ++ goto out; ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000e_reset_adaptive - Reset Adaptive Interframe Spacing ++ * @hw: pointer to the HW structure ++ * ++ * Reset the Adaptive Interframe Spacing throttle to default values. ++ **/ ++void e1000e_reset_adaptive(struct e1000_hw *hw) ++{ ++ struct e1000_mac_info *mac = &hw->mac; ++ ++ if (!mac->adaptive_ifs) { ++ e_dbg("Not in Adaptive IFS mode!\n"); ++ goto out; ++ } ++ ++ mac->current_ifs_val = 0; ++ mac->ifs_min_val = IFS_MIN; ++ mac->ifs_max_val = IFS_MAX; ++ mac->ifs_step_size = IFS_STEP; ++ mac->ifs_ratio = IFS_RATIO; ++ ++ mac->in_ifs_mode = false; ++ ew32(AIT, 0); ++out: ++ return; ++} ++ ++/** ++ * e1000e_update_adaptive - Update Adaptive Interframe Spacing ++ * @hw: pointer to the HW structure ++ * ++ * Update the Adaptive Interframe Spacing Throttle value based on the ++ * time between transmitted packets and time between collisions. ++ **/ ++void e1000e_update_adaptive(struct e1000_hw *hw) ++{ ++ struct e1000_mac_info *mac = &hw->mac; ++ ++ if (!mac->adaptive_ifs) { ++ e_dbg("Not in Adaptive IFS mode!\n"); ++ goto out; ++ } ++ ++ if ((mac->collision_delta * mac->ifs_ratio) > mac->tx_packet_delta) { ++ if (mac->tx_packet_delta > MIN_NUM_XMITS) { ++ mac->in_ifs_mode = true; ++ if (mac->current_ifs_val < mac->ifs_max_val) { ++ if (!mac->current_ifs_val) ++ mac->current_ifs_val = mac->ifs_min_val; ++ else ++ mac->current_ifs_val += ++ mac->ifs_step_size; ++ ew32(AIT, mac->current_ifs_val); ++ } ++ } ++ } else { ++ if (mac->in_ifs_mode && ++ (mac->tx_packet_delta <= MIN_NUM_XMITS)) { ++ mac->current_ifs_val = 0; ++ mac->in_ifs_mode = false; ++ ew32(AIT, 0); ++ } ++ } ++out: ++ return; ++} ++ ++/** ++ * e1000_validate_mdi_setting_generic - Verify MDI/MDIx settings ++ * @hw: pointer to the HW structure ++ * ++ * Verify that when not using auto-negotiation that MDI/MDIx is correctly ++ * set, which is forced to MDI mode only. ++ **/ ++s32 e1000_validate_mdi_setting_generic(struct e1000_hw *hw) ++{ ++ s32 ret_val = E1000_SUCCESS; ++ ++ if (!hw->mac.autoneg && (hw->phy.mdix == 0 || hw->phy.mdix == 3)) { ++ e_dbg("Invalid MDI setting detected\n"); ++ hw->phy.mdix = 1; ++ ret_val = -E1000_ERR_CONFIG; ++ goto out; ++ } ++ ++out: ++ return ret_val; ++} +diff -r bd70f2f305c6 drivers/net/e1000e/e1000_mac.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/e1000e/e1000_mac.h Mon Jun 15 11:45:35 2009 +0100 +@@ -0,0 +1,78 @@ ++/******************************************************************************* ++ ++ Intel PRO/1000 Linux driver ++ Copyright(c) 1999 - 2009 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ Linux NICS ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++#ifndef _E1000_MAC_H_ ++#define _E1000_MAC_H_ ++ ++/* ++ * Functions that should not be called directly from drivers but can be used ++ * by other files in this 'shared code' ++ */ ++void e1000_init_mac_ops_generic(struct e1000_hw *hw); ++s32 e1000e_blink_led(struct e1000_hw *hw); ++s32 e1000e_check_for_copper_link(struct e1000_hw *hw); ++s32 e1000e_check_for_fiber_link(struct e1000_hw *hw); ++s32 e1000e_check_for_serdes_link(struct e1000_hw *hw); ++s32 e1000e_cleanup_led_generic(struct e1000_hw *hw); ++s32 e1000e_config_fc_after_link_up(struct e1000_hw *hw); ++s32 e1000e_disable_pcie_master(struct e1000_hw *hw); ++s32 e1000e_force_mac_fc(struct e1000_hw *hw); ++s32 e1000e_get_auto_rd_done(struct e1000_hw *hw); ++s32 e1000e_get_bus_info_pcie(struct e1000_hw *hw); ++void e1000_set_lan_id_single_port(struct e1000_hw *hw); ++s32 e1000e_get_hw_semaphore(struct e1000_hw *hw); ++s32 e1000e_get_speed_and_duplex_copper(struct e1000_hw *hw, u16 *speed, ++ u16 *duplex); ++s32 e1000e_get_speed_and_duplex_fiber_serdes(struct e1000_hw *hw, ++ u16 *speed, u16 *duplex); ++s32 e1000e_id_led_init(struct e1000_hw *hw); ++s32 e1000e_led_on_generic(struct e1000_hw *hw); ++s32 e1000e_led_off_generic(struct e1000_hw *hw); ++void e1000e_update_mc_addr_list_generic(struct e1000_hw *hw, ++ u8 *mc_addr_list, u32 mc_addr_count, ++ u32 rar_used_count, u32 rar_count); ++s32 e1000e_set_fc_watermarks(struct e1000_hw *hw); ++s32 e1000e_setup_fiber_serdes_link(struct e1000_hw *hw); ++s32 e1000_setup_led_generic(struct e1000_hw *hw); ++s32 e1000e_setup_link(struct e1000_hw *hw); ++ ++void e1000e_clear_hw_cntrs_base(struct e1000_hw *hw); ++void e1000e_clear_vfta_generic(struct e1000_hw *hw); ++void e1000e_config_collision_dist(struct e1000_hw *hw); ++void e1000e_init_rx_addrs(struct e1000_hw *hw, u16 rar_count); ++void e1000_mta_set_generic(struct e1000_hw *hw, u32 hash_value); ++void e1000_pcix_mmrbc_workaround_generic(struct e1000_hw *hw); ++void e1000e_put_hw_semaphore(struct e1000_hw *hw); ++void e1000e_rar_set(struct e1000_hw *hw, u8 *addr, u32 index); ++s32 e1000_check_alt_mac_addr_generic(struct e1000_hw *hw); ++void e1000e_reset_adaptive(struct e1000_hw *hw); ++void e1000e_set_pcie_no_snoop(struct e1000_hw *hw, u32 no_snoop); ++void e1000e_update_adaptive(struct e1000_hw *hw); ++void e1000e_write_vfta_generic(struct e1000_hw *hw, u32 offset, u32 value); ++ ++#endif +diff -r bd70f2f305c6 drivers/net/e1000e/e1000_manage.c +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/e1000e/e1000_manage.c Mon Jun 15 11:45:35 2009 +0100 +@@ -0,0 +1,365 @@ ++/******************************************************************************* ++ ++ Intel PRO/1000 Linux driver ++ Copyright(c) 1999 - 2009 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ Linux NICS ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++#include "e1000.h" ++ ++static u8 e1000_calculate_checksum(u8 *buffer, u32 length); ++ ++/** ++ * e1000_calculate_checksum - Calculate checksum for buffer ++ * @buffer: pointer to EEPROM ++ * @length: size of EEPROM to calculate a checksum for ++ * ++ * Calculates the checksum for some buffer on a specified length. The ++ * checksum calculated is returned. ++ **/ ++static u8 e1000_calculate_checksum(u8 *buffer, u32 length) ++{ ++ u32 i; ++ u8 sum = 0; ++ ++ if (!buffer) ++ return 0; ++ for (i = 0; i < length; i++) ++ sum += buffer[i]; ++ ++ return (u8) (0 - sum); ++} ++ ++/** ++ * e1000_mng_enable_host_if_generic - Checks host interface is enabled ++ * @hw: pointer to the HW structure ++ * ++ * Returns E1000_success upon success, else E1000_ERR_HOST_INTERFACE_COMMAND ++ * ++ * This function checks whether the HOST IF is enabled for command operation ++ * and also checks whether the previous command is completed. It busy waits ++ * in case of previous command is not completed. ++ **/ ++s32 e1000_mng_enable_host_if_generic(struct e1000_hw *hw) ++{ ++ u32 hicr; ++ s32 ret_val = E1000_SUCCESS; ++ u8 i; ++ ++ /* Check that the host interface is enabled. */ ++ hicr = er32(HICR); ++ if ((hicr & E1000_HICR_EN) == 0) { ++ e_dbg("E1000_HOST_EN bit disabled.\n"); ++ ret_val = -E1000_ERR_HOST_INTERFACE_COMMAND; ++ goto out; ++ } ++ /* check the previous command is completed */ ++ for (i = 0; i < E1000_MNG_DHCP_COMMAND_TIMEOUT; i++) { ++ hicr = er32(HICR); ++ if (!(hicr & E1000_HICR_C)) ++ break; ++ mdelay(1); ++ } ++ ++ if (i == E1000_MNG_DHCP_COMMAND_TIMEOUT) { ++ e_dbg("Previous command timeout failed .\n"); ++ ret_val = -E1000_ERR_HOST_INTERFACE_COMMAND; ++ goto out; ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_check_mng_mode_generic - Generic check management mode ++ * @hw: pointer to the HW structure ++ * ++ * Reads the firmware semaphore register and returns true (>0) if ++ * manageability is enabled, else false (0). ++ **/ ++bool e1000_check_mng_mode_generic(struct e1000_hw *hw) ++{ ++ u32 fwsm; ++ ++ fwsm = er32(FWSM); ++ return (fwsm & E1000_FWSM_MODE_MASK) == ++ (E1000_MNG_IAMT_MODE << E1000_FWSM_MODE_SHIFT); ++} ++/** ++ * e1000e_enable_tx_pkt_filtering - Enable packet filtering on TX ++ * @hw: pointer to the HW structure ++ * ++ * Enables packet filtering on transmit packets if manageability is enabled ++ * and host interface is enabled. ++ **/ ++bool e1000e_enable_tx_pkt_filtering(struct e1000_hw *hw) ++{ ++ struct e1000_host_mng_dhcp_cookie *hdr = &hw->mng_cookie; ++ u32 *buffer = (u32 *)&hw->mng_cookie; ++ u32 offset; ++ s32 ret_val, hdr_csum, csum; ++ u8 i, len; ++ bool tx_filter = true; ++ ++ /* No manageability, no filtering */ ++ if (!hw->mac.ops.check_mng_mode(hw)) { ++ tx_filter = false; ++ goto out; ++ } ++ ++ /* ++ * If we can't read from the host interface for whatever ++ * reason, disable filtering. ++ */ ++ ret_val = hw->mac.ops.mng_enable_host_if(hw); ++ if (ret_val != E1000_SUCCESS) { ++ tx_filter = false; ++ goto out; ++ } ++ ++ /* Read in the header. Length and offset are in dwords. */ ++ len = E1000_MNG_DHCP_COOKIE_LENGTH >> 2; ++ offset = E1000_MNG_DHCP_COOKIE_OFFSET >> 2; ++ for (i = 0; i < len; i++) { ++ *(buffer + i) = E1000_READ_REG_ARRAY_DWORD(hw, ++ E1000_HOST_IF, ++ offset + i); ++ } ++ hdr_csum = hdr->checksum; ++ hdr->checksum = 0; ++ csum = e1000_calculate_checksum((u8 *)hdr, ++ E1000_MNG_DHCP_COOKIE_LENGTH); ++ /* ++ * If either the checksums or signature don't match, then ++ * the cookie area isn't considered valid, in which case we ++ * take the safe route of assuming Tx filtering is enabled. ++ */ ++ if (hdr_csum != csum) ++ goto out; ++ if (hdr->signature != E1000_IAMT_SIGNATURE) ++ goto out; ++ ++ /* Cookie area is valid, make the final check for filtering. */ ++ if (!(hdr->status & E1000_MNG_DHCP_COOKIE_STATUS_PARSING)) ++ tx_filter = false; ++ ++out: ++ hw->mac.tx_pkt_filtering = tx_filter; ++ return tx_filter; ++} ++ ++/** ++ * e1000e_mng_write_dhcp_info - Writes DHCP info to host interface ++ * @hw: pointer to the HW structure ++ * @buffer: pointer to the host interface ++ * @length: size of the buffer ++ * ++ * Writes the DHCP information to the host interface. ++ **/ ++s32 e1000e_mng_write_dhcp_info(struct e1000_hw *hw, u8 *buffer, ++ u16 length) ++{ ++ struct e1000_host_mng_command_header hdr; ++ s32 ret_val; ++ u32 hicr; ++ ++ hdr.command_id = E1000_MNG_DHCP_TX_PAYLOAD_CMD; ++ hdr.command_length = length; ++ hdr.reserved1 = 0; ++ hdr.reserved2 = 0; ++ hdr.checksum = 0; ++ ++ /* Enable the host interface */ ++ ret_val = hw->mac.ops.mng_enable_host_if(hw); ++ if (ret_val) ++ goto out; ++ ++ /* Populate the host interface with the contents of "buffer". */ ++ ret_val = hw->mac.ops.mng_host_if_write(hw, buffer, length, ++ sizeof(hdr), &(hdr.checksum)); ++ if (ret_val) ++ goto out; ++ ++ /* Write the manageability command header */ ++ ret_val = hw->mac.ops.mng_write_cmd_header(hw, &hdr); ++ if (ret_val) ++ goto out; ++ ++ /* Tell the ARC a new command is pending. */ ++ hicr = er32(HICR); ++ ew32(HICR, hicr | E1000_HICR_C); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_mng_write_cmd_header_generic - Writes manageability command header ++ * @hw: pointer to the HW structure ++ * @hdr: pointer to the host interface command header ++ * ++ * Writes the command header after does the checksum calculation. ++ **/ ++s32 e1000_mng_write_cmd_header_generic(struct e1000_hw *hw, ++ struct e1000_host_mng_command_header *hdr) ++{ ++ u16 i, length = sizeof(struct e1000_host_mng_command_header); ++ ++ /* Write the whole command header structure with new checksum. */ ++ ++ hdr->checksum = e1000_calculate_checksum((u8 *)hdr, length); ++ ++ length >>= 2; ++ /* Write the relevant command block into the ram area. */ ++ for (i = 0; i < length; i++) { ++ E1000_WRITE_REG_ARRAY_DWORD(hw, E1000_HOST_IF, i, ++ *((u32 *) hdr + i)); ++ e1e_flush(); ++ } ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_mng_host_if_write_generic - Write to the manageability host interface ++ * @hw: pointer to the HW structure ++ * @buffer: pointer to the host interface buffer ++ * @length: size of the buffer ++ * @offset: location in the buffer to write to ++ * @sum: sum of the data (not checksum) ++ * ++ * This function writes the buffer content at the offset given on the host if. ++ * It also does alignment considerations to do the writes in most efficient ++ * way. Also fills up the sum of the buffer in *buffer parameter. ++ **/ ++s32 e1000_mng_host_if_write_generic(struct e1000_hw *hw, u8 *buffer, ++ u16 length, u16 offset, u8 *sum) ++{ ++ u8 *tmp; ++ u8 *bufptr = buffer; ++ u32 data = 0; ++ s32 ret_val = E1000_SUCCESS; ++ u16 remaining, i, j, prev_bytes; ++ ++ /* sum = only sum of the data and it is not checksum */ ++ ++ if (length == 0 || offset + length > E1000_HI_MAX_MNG_DATA_LENGTH) { ++ ret_val = -E1000_ERR_PARAM; ++ goto out; ++ } ++ ++ tmp = (u8 *)&data; ++ prev_bytes = offset & 0x3; ++ offset >>= 2; ++ ++ if (prev_bytes) { ++ data = E1000_READ_REG_ARRAY_DWORD(hw, E1000_HOST_IF, offset); ++ for (j = prev_bytes; j < sizeof(u32); j++) { ++ *(tmp + j) = *bufptr++; ++ *sum += *(tmp + j); ++ } ++ E1000_WRITE_REG_ARRAY_DWORD(hw, E1000_HOST_IF, offset, data); ++ length -= j - prev_bytes; ++ offset++; ++ } ++ ++ remaining = length & 0x3; ++ length -= remaining; ++ ++ /* Calculate length in DWORDs */ ++ length >>= 2; ++ ++ /* ++ * The device driver writes the relevant command block into the ++ * ram area. ++ */ ++ for (i = 0; i < length; i++) { ++ for (j = 0; j < sizeof(u32); j++) { ++ *(tmp + j) = *bufptr++; ++ *sum += *(tmp + j); ++ } ++ ++ E1000_WRITE_REG_ARRAY_DWORD(hw, E1000_HOST_IF, offset + i, ++ data); ++ } ++ if (remaining) { ++ for (j = 0; j < sizeof(u32); j++) { ++ if (j < remaining) ++ *(tmp + j) = *bufptr++; ++ else ++ *(tmp + j) = 0; ++ ++ *sum += *(tmp + j); ++ } ++ E1000_WRITE_REG_ARRAY_DWORD(hw, E1000_HOST_IF, offset + i, data); ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000e_enable_mng_pass_thru - Enable processing of ARP's ++ * @hw: pointer to the HW structure ++ * ++ * Verifies the hardware needs to allow ARPs to be processed by the host. ++ **/ ++bool e1000e_enable_mng_pass_thru(struct e1000_hw *hw) ++{ ++ u32 manc; ++ u32 fwsm, factps; ++ bool ret_val = false; ++ ++ if (!hw->mac.asf_firmware_present) ++ goto out; ++ ++ manc = er32(MANC); ++ ++ if (!(manc & E1000_MANC_RCV_TCO_EN) || ++ !(manc & E1000_MANC_EN_MAC_ADDR_FILTER)) ++ goto out; ++ ++ if (hw->mac.arc_subsystem_valid) { ++ fwsm = er32(FWSM); ++ factps = er32(FACTPS); ++ ++ if (!(factps & E1000_FACTPS_MNGCG) && ++ ((fwsm & E1000_FWSM_MODE_MASK) == ++ (e1000_mng_mode_pt << E1000_FWSM_MODE_SHIFT))) { ++ ret_val = true; ++ goto out; ++ } ++ } else { ++ if ((manc & E1000_MANC_SMBUS_EN) && ++ !(manc & E1000_MANC_ASF_EN)) { ++ ret_val = true; ++ goto out; ++ } ++ } ++ ++out: ++ return ret_val; ++} ++ +diff -r bd70f2f305c6 drivers/net/e1000e/e1000_manage.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/e1000e/e1000_manage.h Mon Jun 15 11:45:35 2009 +0100 +@@ -0,0 +1,82 @@ ++/******************************************************************************* ++ ++ Intel PRO/1000 Linux driver ++ Copyright(c) 1999 - 2009 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ Linux NICS ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++#ifndef _E1000_MANAGE_H_ ++#define _E1000_MANAGE_H_ ++ ++bool e1000_check_mng_mode_generic(struct e1000_hw *hw); ++bool e1000e_enable_tx_pkt_filtering(struct e1000_hw *hw); ++s32 e1000_mng_enable_host_if_generic(struct e1000_hw *hw); ++s32 e1000_mng_host_if_write_generic(struct e1000_hw *hw, u8 *buffer, ++ u16 length, u16 offset, u8 *sum); ++s32 e1000_mng_write_cmd_header_generic(struct e1000_hw *hw, ++ struct e1000_host_mng_command_header *hdr); ++s32 e1000e_mng_write_dhcp_info(struct e1000_hw *hw, ++ u8 *buffer, u16 length); ++bool e1000e_enable_mng_pass_thru(struct e1000_hw *hw); ++ ++enum e1000_mng_mode { ++ e1000_mng_mode_none = 0, ++ e1000_mng_mode_asf, ++ e1000_mng_mode_pt, ++ e1000_mng_mode_ipmi, ++ e1000_mng_mode_host_if_only ++}; ++ ++#define E1000_FACTPS_MNGCG 0x20000000 ++ ++#define E1000_FWSM_MODE_MASK 0xE ++#define E1000_FWSM_MODE_SHIFT 1 ++ ++#define E1000_MNG_IAMT_MODE 0x3 ++#define E1000_MNG_DHCP_COOKIE_LENGTH 0x10 ++#define E1000_MNG_DHCP_COOKIE_OFFSET 0x6F0 ++#define E1000_MNG_DHCP_COMMAND_TIMEOUT 10 ++#define E1000_MNG_DHCP_TX_PAYLOAD_CMD 64 ++#define E1000_MNG_DHCP_COOKIE_STATUS_PARSING 0x1 ++#define E1000_MNG_DHCP_COOKIE_STATUS_VLAN 0x2 ++ ++#define E1000_VFTA_ENTRY_SHIFT 5 ++#define E1000_VFTA_ENTRY_MASK 0x7F ++#define E1000_VFTA_ENTRY_BIT_SHIFT_MASK 0x1F ++ ++#define E1000_HI_MAX_BLOCK_BYTE_LENGTH 1792 /* Num of bytes in range */ ++#define E1000_HI_MAX_BLOCK_DWORD_LENGTH 448 /* Num of dwords in range */ ++#define E1000_HI_COMMAND_TIMEOUT 500 /* Process HI command limit */ ++ ++#define E1000_HICR_EN 0x01 /* Enable bit - RO */ ++/* Driver sets this bit when done to put command in RAM */ ++#define E1000_HICR_C 0x02 ++#define E1000_HICR_SV 0x04 /* Status Validity */ ++#define E1000_HICR_FW_RESET_ENABLE 0x40 ++#define E1000_HICR_FW_RESET 0x80 ++ ++/* Intel(R) Active Management Technology signature */ ++#define E1000_IAMT_SIGNATURE 0x544D4149 ++ ++#endif +diff -r bd70f2f305c6 drivers/net/e1000e/e1000_nvm.c +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/e1000e/e1000_nvm.c Mon Jun 15 11:45:35 2009 +0100 +@@ -0,0 +1,594 @@ ++/******************************************************************************* ++ ++ Intel PRO/1000 Linux driver ++ Copyright(c) 1999 - 2009 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ Linux NICS ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++#include "e1000.h" ++ ++static void e1000_stop_nvm(struct e1000_hw *hw); ++static void e1000e_reload_nvm(struct e1000_hw *hw); ++ ++/** ++ * e1000_init_nvm_ops_generic - Initialize NVM function pointers ++ * @hw: pointer to the HW structure ++ * ++ * Setups up the function pointers to no-op functions ++ **/ ++void e1000_init_nvm_ops_generic(struct e1000_hw *hw) ++{ ++ struct e1000_nvm_info *nvm = &hw->nvm; ++ /* Initialize function pointers */ ++ nvm->ops.reload = e1000e_reload_nvm; ++} ++ ++/** ++ * e1000_raise_eec_clk - Raise EEPROM clock ++ * @hw: pointer to the HW structure ++ * @eecd: pointer to the EEPROM ++ * ++ * Enable/Raise the EEPROM clock bit. ++ **/ ++static void e1000_raise_eec_clk(struct e1000_hw *hw, u32 *eecd) ++{ ++ *eecd = *eecd | E1000_EECD_SK; ++ ew32(EECD, *eecd); ++ e1e_flush(); ++ udelay(hw->nvm.delay_usec); ++} ++ ++/** ++ * e1000_lower_eec_clk - Lower EEPROM clock ++ * @hw: pointer to the HW structure ++ * @eecd: pointer to the EEPROM ++ * ++ * Clear/Lower the EEPROM clock bit. ++ **/ ++static void e1000_lower_eec_clk(struct e1000_hw *hw, u32 *eecd) ++{ ++ *eecd = *eecd & ~E1000_EECD_SK; ++ ew32(EECD, *eecd); ++ e1e_flush(); ++ udelay(hw->nvm.delay_usec); ++} ++ ++/** ++ * e1000_shift_out_eec_bits - Shift data bits our to the EEPROM ++ * @hw: pointer to the HW structure ++ * @data: data to send to the EEPROM ++ * @count: number of bits to shift out ++ * ++ * We need to shift 'count' bits out to the EEPROM. So, the value in the ++ * "data" parameter will be shifted out to the EEPROM one bit at a time. ++ * In order to do this, "data" must be broken down into bits. ++ **/ ++static void e1000_shift_out_eec_bits(struct e1000_hw *hw, u16 data, u16 count) ++{ ++ struct e1000_nvm_info *nvm = &hw->nvm; ++ u32 eecd = er32(EECD); ++ u32 mask; ++ ++ mask = 0x01 << (count - 1); ++ if (nvm->type == e1000_nvm_eeprom_spi) ++ eecd |= E1000_EECD_DO; ++ ++ do { ++ eecd &= ~E1000_EECD_DI; ++ ++ if (data & mask) ++ eecd |= E1000_EECD_DI; ++ ++ ew32(EECD, eecd); ++ e1e_flush(); ++ ++ udelay(nvm->delay_usec); ++ ++ e1000_raise_eec_clk(hw, &eecd); ++ e1000_lower_eec_clk(hw, &eecd); ++ ++ mask >>= 1; ++ } while (mask); ++ ++ eecd &= ~E1000_EECD_DI; ++ ew32(EECD, eecd); ++} ++ ++/** ++ * e1000_shift_in_eec_bits - Shift data bits in from the EEPROM ++ * @hw: pointer to the HW structure ++ * @count: number of bits to shift in ++ * ++ * In order to read a register from the EEPROM, we need to shift 'count' bits ++ * in from the EEPROM. Bits are "shifted in" by raising the clock input to ++ * the EEPROM (setting the SK bit), and then reading the value of the data out ++ * "DO" bit. During this "shifting in" process the data in "DI" bit should ++ * always be clear. ++ **/ ++static u16 e1000_shift_in_eec_bits(struct e1000_hw *hw, u16 count) ++{ ++ u32 eecd; ++ u32 i; ++ u16 data; ++ ++ eecd = er32(EECD); ++ eecd &= ~(E1000_EECD_DO | E1000_EECD_DI); ++ data = 0; ++ ++ for (i = 0; i < count; i++) { ++ data <<= 1; ++ e1000_raise_eec_clk(hw, &eecd); ++ ++ eecd = er32(EECD); ++ ++ eecd &= ~E1000_EECD_DI; ++ if (eecd & E1000_EECD_DO) ++ data |= 1; ++ ++ e1000_lower_eec_clk(hw, &eecd); ++ } ++ ++ return data; ++} ++ ++/** ++ * e1000e_poll_eerd_eewr_done - Poll for EEPROM read/write completion ++ * @hw: pointer to the HW structure ++ * @ee_reg: EEPROM flag for polling ++ * ++ * Polls the EEPROM status bit for either read or write completion based ++ * upon the value of 'ee_reg'. ++ **/ ++s32 e1000e_poll_eerd_eewr_done(struct e1000_hw *hw, int ee_reg) ++{ ++ u32 attempts = 100000; ++ u32 i, reg = 0; ++ s32 ret_val = -E1000_ERR_NVM; ++ ++ for (i = 0; i < attempts; i++) { ++ if (ee_reg == E1000_NVM_POLL_READ) ++ reg = er32(EERD); ++ else ++ reg = er32(EEWR); ++ ++ if (reg & E1000_NVM_RW_REG_DONE) { ++ ret_val = E1000_SUCCESS; ++ break; ++ } ++ ++ udelay(5); ++ } ++ ++ return ret_val; ++} ++ ++/** ++ * e1000e_acquire_nvm - Generic request for access to EEPROM ++ * @hw: pointer to the HW structure ++ * ++ * Set the EEPROM access request bit and wait for EEPROM access grant bit. ++ * Return successful if access grant bit set, else clear the request for ++ * EEPROM access and return -E1000_ERR_NVM (-1). ++ **/ ++s32 e1000e_acquire_nvm(struct e1000_hw *hw) ++{ ++ u32 eecd = er32(EECD); ++ s32 timeout = E1000_NVM_GRANT_ATTEMPTS; ++ s32 ret_val = E1000_SUCCESS; ++ ++ ew32(EECD, eecd | E1000_EECD_REQ); ++ eecd = er32(EECD); ++ while (timeout) { ++ if (eecd & E1000_EECD_GNT) ++ break; ++ udelay(5); ++ eecd = er32(EECD); ++ timeout--; ++ } ++ ++ if (!timeout) { ++ eecd &= ~E1000_EECD_REQ; ++ ew32(EECD, eecd); ++ e_dbg("Could not acquire NVM grant\n"); ++ ret_val = -E1000_ERR_NVM; ++ } ++ ++ return ret_val; ++} ++ ++/** ++ * e1000_standby_nvm - Return EEPROM to standby state ++ * @hw: pointer to the HW structure ++ * ++ * Return the EEPROM to a standby state. ++ **/ ++static void e1000_standby_nvm(struct e1000_hw *hw) ++{ ++ struct e1000_nvm_info *nvm = &hw->nvm; ++ u32 eecd = er32(EECD); ++ ++ if (nvm->type == e1000_nvm_eeprom_spi) { ++ /* Toggle CS to flush commands */ ++ eecd |= E1000_EECD_CS; ++ ew32(EECD, eecd); ++ e1e_flush(); ++ udelay(nvm->delay_usec); ++ eecd &= ~E1000_EECD_CS; ++ ew32(EECD, eecd); ++ e1e_flush(); ++ udelay(nvm->delay_usec); ++ } ++} ++ ++/** ++ * e1000_stop_nvm - Terminate EEPROM command ++ * @hw: pointer to the HW structure ++ * ++ * Terminates the current command by inverting the EEPROM's chip select pin. ++ **/ ++static void e1000_stop_nvm(struct e1000_hw *hw) ++{ ++ u32 eecd; ++ ++ eecd = er32(EECD); ++ if (hw->nvm.type == e1000_nvm_eeprom_spi) { ++ /* Pull CS high */ ++ eecd |= E1000_EECD_CS; ++ e1000_lower_eec_clk(hw, &eecd); ++ } ++} ++ ++/** ++ * e1000e_release_nvm - Release exclusive access to EEPROM ++ * @hw: pointer to the HW structure ++ * ++ * Stop any current commands to the EEPROM and clear the EEPROM request bit. ++ **/ ++void e1000e_release_nvm(struct e1000_hw *hw) ++{ ++ u32 eecd; ++ ++ e1000_stop_nvm(hw); ++ ++ eecd = er32(EECD); ++ eecd &= ~E1000_EECD_REQ; ++ ew32(EECD, eecd); ++} ++ ++/** ++ * e1000_ready_nvm_eeprom - Prepares EEPROM for read/write ++ * @hw: pointer to the HW structure ++ * ++ * Setups the EEPROM for reading and writing. ++ **/ ++static s32 e1000_ready_nvm_eeprom(struct e1000_hw *hw) ++{ ++ struct e1000_nvm_info *nvm = &hw->nvm; ++ u32 eecd = er32(EECD); ++ s32 ret_val = E1000_SUCCESS; ++ u16 timeout = 0; ++ u8 spi_stat_reg; ++ ++ if (nvm->type == e1000_nvm_eeprom_spi) { ++ /* Clear SK and CS */ ++ eecd &= ~(E1000_EECD_CS | E1000_EECD_SK); ++ ew32(EECD, eecd); ++ udelay(1); ++ timeout = NVM_MAX_RETRY_SPI; ++ ++ /* ++ * Read "Status Register" repeatedly until the LSB is cleared. ++ * The EEPROM will signal that the command has been completed ++ * by clearing bit 0 of the internal status register. If it's ++ * not cleared within 'timeout', then error out. ++ */ ++ while (timeout) { ++ e1000_shift_out_eec_bits(hw, NVM_RDSR_OPCODE_SPI, ++ hw->nvm.opcode_bits); ++ spi_stat_reg = (u8)e1000_shift_in_eec_bits(hw, 8); ++ if (!(spi_stat_reg & NVM_STATUS_RDY_SPI)) ++ break; ++ ++ udelay(5); ++ e1000_standby_nvm(hw); ++ timeout--; ++ } ++ ++ if (!timeout) { ++ e_dbg("SPI NVM Status error\n"); ++ ret_val = -E1000_ERR_NVM; ++ goto out; ++ } ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000e_read_nvm_eerd - Reads EEPROM using EERD register ++ * @hw: pointer to the HW structure ++ * @offset: offset of word in the EEPROM to read ++ * @words: number of words to read ++ * @data: word read from the EEPROM ++ * ++ * Reads a 16 bit word from the EEPROM using the EERD register. ++ **/ ++s32 e1000e_read_nvm_eerd(struct e1000_hw *hw, u16 offset, u16 words, u16 *data) ++{ ++ struct e1000_nvm_info *nvm = &hw->nvm; ++ u32 i, eerd = 0; ++ s32 ret_val = E1000_SUCCESS; ++ ++ /* ++ * A check for invalid values: offset too large, too many words, ++ * too many words for the offset, and not enough words. ++ */ ++ if ((offset >= nvm->word_size) || (words > (nvm->word_size - offset)) || ++ (words == 0)) { ++ e_dbg("nvm parameter(s) out of bounds\n"); ++ ret_val = -E1000_ERR_NVM; ++ goto out; ++ } ++ ++ for (i = 0; i < words; i++) { ++ eerd = ((offset+i) << E1000_NVM_RW_ADDR_SHIFT) + ++ E1000_NVM_RW_REG_START; ++ ++ ew32(EERD, eerd); ++ ret_val = e1000e_poll_eerd_eewr_done(hw, E1000_NVM_POLL_READ); ++ if (ret_val) ++ break; ++ ++ data[i] = (er32(EERD) >> ++ E1000_NVM_RW_REG_DATA); ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000e_write_nvm_spi - Write to EEPROM using SPI ++ * @hw: pointer to the HW structure ++ * @offset: offset within the EEPROM to be written to ++ * @words: number of words to write ++ * @data: 16 bit word(s) to be written to the EEPROM ++ * ++ * Writes data to EEPROM at offset using SPI interface. ++ * ++ * If e1000_update_nvm_checksum is not called after this function , the ++ * EEPROM will most likely contain an invalid checksum. ++ **/ ++s32 e1000e_write_nvm_spi(struct e1000_hw *hw, u16 offset, u16 words, u16 *data) ++{ ++ struct e1000_nvm_info *nvm = &hw->nvm; ++ s32 ret_val; ++ u16 widx = 0; ++ ++ /* ++ * A check for invalid values: offset too large, too many words, ++ * and not enough words. ++ */ ++ if ((offset >= nvm->word_size) || (words > (nvm->word_size - offset)) || ++ (words == 0)) { ++ e_dbg("nvm parameter(s) out of bounds\n"); ++ ret_val = -E1000_ERR_NVM; ++ goto out; ++ } ++ ++ ret_val = nvm->ops.acquire(hw); ++ if (ret_val) ++ goto out; ++ ++ while (widx < words) { ++ u8 write_opcode = NVM_WRITE_OPCODE_SPI; ++ ++ ret_val = e1000_ready_nvm_eeprom(hw); ++ if (ret_val) ++ goto release; ++ ++ e1000_standby_nvm(hw); ++ ++ /* Send the WRITE ENABLE command (8 bit opcode) */ ++ e1000_shift_out_eec_bits(hw, NVM_WREN_OPCODE_SPI, ++ nvm->opcode_bits); ++ ++ e1000_standby_nvm(hw); ++ ++ /* ++ * Some SPI eeproms use the 8th address bit embedded in the ++ * opcode ++ */ ++ if ((nvm->address_bits == 8) && (offset >= 128)) ++ write_opcode |= NVM_A8_OPCODE_SPI; ++ ++ /* Send the Write command (8-bit opcode + addr) */ ++ e1000_shift_out_eec_bits(hw, write_opcode, nvm->opcode_bits); ++ e1000_shift_out_eec_bits(hw, (u16)((offset + widx) * 2), ++ nvm->address_bits); ++ ++ /* Loop to allow for up to whole page write of eeprom */ ++ while (widx < words) { ++ u16 word_out = data[widx]; ++ word_out = (word_out >> 8) | (word_out << 8); ++ e1000_shift_out_eec_bits(hw, word_out, 16); ++ widx++; ++ ++ if ((((offset + widx) * 2) % nvm->page_size) == 0) { ++ e1000_standby_nvm(hw); ++ break; ++ } ++ } ++ } ++ ++ msleep(10); ++release: ++ nvm->ops.release(hw); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000e_read_pba_num - Read device part number ++ * @hw: pointer to the HW structure ++ * @pba_num: pointer to device part number ++ * ++ * Reads the product board assembly (PBA) number from the EEPROM and stores ++ * the value in pba_num. ++ **/ ++s32 e1000e_read_pba_num(struct e1000_hw *hw, u32 *pba_num) ++{ ++ s32 ret_val; ++ u16 nvm_data; ++ ++ ret_val = e1000_read_nvm(hw, NVM_PBA_OFFSET_0, 1, &nvm_data); ++ if (ret_val) { ++ e_dbg("NVM Read Error\n"); ++ goto out; ++ } ++ *pba_num = (u32)(nvm_data << 16); ++ ++ ret_val = e1000_read_nvm(hw, NVM_PBA_OFFSET_1, 1, &nvm_data); ++ if (ret_val) { ++ e_dbg("NVM Read Error\n"); ++ goto out; ++ } ++ *pba_num |= nvm_data; ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000e_read_mac_addr_generic - Read device MAC address ++ * @hw: pointer to the HW structure ++ * ++ * Reads the device MAC address from the EEPROM and stores the value. ++ * Since devices with two ports use the same EEPROM, we increment the ++ * last bit in the MAC address for the second port. ++ **/ ++s32 e1000e_read_mac_addr_generic(struct e1000_hw *hw) ++{ ++ u32 rar_high; ++ u32 rar_low; ++ u16 i; ++ ++ rar_high = er32(RAH(0)); ++ rar_low = er32(RAL(0)); ++ ++ for (i = 0; i < E1000_RAL_MAC_ADDR_LEN; i++) ++ hw->mac.perm_addr[i] = (u8)(rar_low >> (i*8)); ++ ++ for (i = 0; i < E1000_RAH_MAC_ADDR_LEN; i++) ++ hw->mac.perm_addr[i+4] = (u8)(rar_high >> (i*8)); ++ ++ for (i = 0; i < ETH_ADDR_LEN; i++) ++ hw->mac.addr[i] = hw->mac.perm_addr[i]; ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000e_validate_nvm_checksum_generic - Validate EEPROM checksum ++ * @hw: pointer to the HW structure ++ * ++ * Calculates the EEPROM checksum by reading/adding each word of the EEPROM ++ * and then verifies that the sum of the EEPROM is equal to 0xBABA. ++ **/ ++s32 e1000e_validate_nvm_checksum_generic(struct e1000_hw *hw) ++{ ++ s32 ret_val = E1000_SUCCESS; ++ u16 checksum = 0; ++ u16 i, nvm_data; ++ ++ for (i = 0; i < (NVM_CHECKSUM_REG + 1); i++) { ++ ret_val = e1000_read_nvm(hw, i, 1, &nvm_data); ++ if (ret_val) { ++ e_dbg("NVM Read Error\n"); ++ goto out; ++ } ++ checksum += nvm_data; ++ } ++ ++ if (checksum != (u16) NVM_SUM) { ++ e_dbg("NVM Checksum Invalid\n"); ++ ret_val = -E1000_ERR_NVM; ++ goto out; ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000e_update_nvm_checksum_generic - Update EEPROM checksum ++ * @hw: pointer to the HW structure ++ * ++ * Updates the EEPROM checksum by reading/adding each word of the EEPROM ++ * up to the checksum. Then calculates the EEPROM checksum and writes the ++ * value to the EEPROM. ++ **/ ++s32 e1000e_update_nvm_checksum_generic(struct e1000_hw *hw) ++{ ++ s32 ret_val; ++ u16 checksum = 0; ++ u16 i, nvm_data; ++ ++ for (i = 0; i < NVM_CHECKSUM_REG; i++) { ++ ret_val = e1000_read_nvm(hw, i, 1, &nvm_data); ++ if (ret_val) { ++ e_dbg("NVM Read Error while updating checksum.\n"); ++ goto out; ++ } ++ checksum += nvm_data; ++ } ++ checksum = (u16) NVM_SUM - checksum; ++ ret_val = e1000_write_nvm(hw, NVM_CHECKSUM_REG, 1, &checksum); ++ if (ret_val) ++ e_dbg("NVM Write Error while updating checksum.\n"); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000e_reload_nvm - Reloads EEPROM ++ * @hw: pointer to the HW structure ++ * ++ * Reloads the EEPROM by setting the "Reinitialize from EEPROM" bit in the ++ * extended control register. ++ **/ ++static void e1000e_reload_nvm(struct e1000_hw *hw) ++{ ++ u32 ctrl_ext; ++ ++ udelay(10); ++ ctrl_ext = er32(CTRL_EXT); ++ ctrl_ext |= E1000_CTRL_EXT_EE_RST; ++ ew32(CTRL_EXT, ctrl_ext); ++ e1e_flush(); ++} ++ +diff -r bd70f2f305c6 drivers/net/e1000e/e1000_nvm.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/e1000e/e1000_nvm.h Mon Jun 15 11:45:35 2009 +0100 +@@ -0,0 +1,51 @@ ++/******************************************************************************* ++ ++ Intel PRO/1000 Linux driver ++ Copyright(c) 1999 - 2009 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ Linux NICS ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++#ifndef _E1000_NVM_H_ ++#define _E1000_NVM_H_ ++ ++void e1000_init_nvm_ops_generic(struct e1000_hw *hw); ++s32 e1000e_acquire_nvm(struct e1000_hw *hw); ++ ++s32 e1000e_poll_eerd_eewr_done(struct e1000_hw *hw, int ee_reg); ++s32 e1000e_read_mac_addr_generic(struct e1000_hw *hw); ++s32 e1000e_read_pba_num(struct e1000_hw *hw, u32 *pba_num); ++s32 e1000e_read_nvm_eerd(struct e1000_hw *hw, u16 offset, u16 words, ++ u16 *data); ++s32 e1000e_valid_led_default(struct e1000_hw *hw, u16 *data); ++s32 e1000e_validate_nvm_checksum_generic(struct e1000_hw *hw); ++s32 e1000_write_nvm_eewr(struct e1000_hw *hw, u16 offset, ++ u16 words, u16 *data); ++s32 e1000e_write_nvm_spi(struct e1000_hw *hw, u16 offset, u16 words, ++ u16 *data); ++s32 e1000e_update_nvm_checksum_generic(struct e1000_hw *hw); ++void e1000e_release_nvm(struct e1000_hw *hw); ++ ++#define E1000_STM_OPCODE 0xDB00 ++ ++#endif +diff -r bd70f2f305c6 drivers/net/e1000e/e1000_osdep.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/e1000e/e1000_osdep.h Mon Jun 15 11:45:35 2009 +0100 +@@ -0,0 +1,116 @@ ++/******************************************************************************* ++ ++ Intel PRO/1000 Linux driver ++ Copyright(c) 1999 - 2008 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ Linux NICS ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++ ++/* glue for the OS-dependent part of e1000 ++ * includes register access macros ++ */ ++ ++#ifndef _E1000_OSDEP_H_ ++#define _E1000_OSDEP_H_ ++ ++#include ++#include ++#include ++#include ++ ++#include "kcompat.h" ++ ++#define usec_delay(x) udelay(x) ++#ifndef msec_delay ++#define msec_delay(x) do { if(in_interrupt()) { \ ++ /* Don't sleep in interrupt context! */ \ ++ BUG(); \ ++ } else { \ ++ msleep(x); \ ++ } } while (0) ++ ++/* Some workarounds require millisecond delays and are run during interrupt ++ * context. Most notably, when establishing link, the phy may need tweaking ++ * but cannot process phy register reads/writes faster than millisecond ++ * intervals...and we establish link due to a "link status change" interrupt. ++ */ ++#define msec_delay_irq(x) mdelay(x) ++#endif ++ ++#define PCI_COMMAND_REGISTER PCI_COMMAND ++#define CMD_MEM_WRT_INVALIDATE PCI_COMMAND_INVALIDATE ++#define ETH_ADDR_LEN ETH_ALEN ++ ++ ++#define DEBUGOUT(S) ++#define DEBUGOUT1(S, A...) ++ ++#define DEBUGFUNC(F) DEBUGOUT(F "\n") ++#define DEBUGOUT2 DEBUGOUT1 ++#define DEBUGOUT3 DEBUGOUT2 ++#define DEBUGOUT7 DEBUGOUT3 ++ ++#define E1000_WRITE_REG(a, reg, value) ( \ ++ writel((value), ((a)->hw_addr + reg))) ++ ++#define E1000_READ_REG(a, reg) (readl((a)->hw_addr + reg)) ++ ++#define E1000_WRITE_REG_ARRAY(a, reg, offset, value) ( \ ++ writel((value), ((a)->hw_addr + reg + ((offset) << 2)))) ++ ++#define E1000_READ_REG_ARRAY(a, reg, offset) ( \ ++ readl((a)->hw_addr + reg + ((offset) << 2))) ++ ++#define E1000_READ_REG_ARRAY_DWORD E1000_READ_REG_ARRAY ++#define E1000_WRITE_REG_ARRAY_DWORD E1000_WRITE_REG_ARRAY ++ ++#define E1000_WRITE_REG_ARRAY_WORD(a, reg, offset, value) ( \ ++ writew((value), ((a)->hw_addr + reg + ((offset) << 1)))) ++ ++#define E1000_READ_REG_ARRAY_WORD(a, reg, offset) ( \ ++ readw((a)->hw_addr + reg + ((offset) << 1))) ++ ++#define E1000_WRITE_REG_ARRAY_BYTE(a, reg, offset, value) ( \ ++ writeb((value), ((a)->hw_addr + reg + (offset)))) ++ ++#define E1000_READ_REG_ARRAY_BYTE(a, reg, offset) ( \ ++ readb((a)->hw_addr + reg + (offset))) ++ ++#define E1000_WRITE_REG_IO(a, reg, offset) do { \ ++ outl(reg, ((a)->io_base)); \ ++ outl(offset, ((a)->io_base + 4)); } while(0) ++ ++#define E1000_WRITE_FLUSH(a) E1000_READ_REG(a, E1000_STATUS) ++ ++#define E1000_WRITE_FLASH_REG(a, reg, value) ( \ ++ writel((value), ((a)->flash_address + reg))) ++ ++#define E1000_WRITE_FLASH_REG16(a, reg, value) ( \ ++ writew((value), ((a)->flash_address + reg))) ++ ++#define E1000_READ_FLASH_REG(a, reg) (readl((a)->flash_address + reg)) ++ ++#define E1000_READ_FLASH_REG16(a, reg) (readw((a)->flash_address + reg)) ++ ++#endif /* _E1000_OSDEP_H_ */ +diff -r bd70f2f305c6 drivers/net/e1000e/e1000_phy.c +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/e1000e/e1000_phy.c Mon Jun 15 11:45:35 2009 +0100 +@@ -0,0 +1,2406 @@ ++/******************************************************************************* ++ ++ Intel PRO/1000 Linux driver ++ Copyright(c) 1999 - 2009 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ Linux NICS ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++#include "e1000.h" ++ ++static s32 e1000_phy_setup_autoneg(struct e1000_hw *hw); ++static s32 e1000_copper_link_autoneg(struct e1000_hw *hw); ++static u32 e1000_get_phy_addr_for_bm_page(u32 page, u32 reg); ++static s32 e1000_access_phy_wakeup_reg_bm(struct e1000_hw *hw, u32 offset, ++ u16 *data, bool read); ++/* Cable length tables */ ++static const u16 e1000_m88_cable_length_table[] = ++ { 0, 50, 80, 110, 140, 140, E1000_CABLE_LENGTH_UNDEFINED }; ++#define M88E1000_CABLE_LENGTH_TABLE_SIZE \ ++ (sizeof(e1000_m88_cable_length_table) / \ ++ sizeof(e1000_m88_cable_length_table[0])) ++ ++static const u16 e1000_igp_2_cable_length_table[] = ++ { 0, 0, 0, 0, 0, 0, 0, 0, 3, 5, 8, 11, 13, 16, 18, 21, ++ 0, 0, 0, 3, 6, 10, 13, 16, 19, 23, 26, 29, 32, 35, 38, 41, ++ 6, 10, 14, 18, 22, 26, 30, 33, 37, 41, 44, 48, 51, 54, 58, 61, ++ 21, 26, 31, 35, 40, 44, 49, 53, 57, 61, 65, 68, 72, 75, 79, 82, ++ 40, 45, 51, 56, 61, 66, 70, 75, 79, 83, 87, 91, 94, 98, 101, 104, ++ 60, 66, 72, 77, 82, 87, 92, 96, 100, 104, 108, 111, 114, 117, 119, 121, ++ 83, 89, 95, 100, 105, 109, 113, 116, 119, 122, 124, ++ 104, 109, 114, 118, 121, 124}; ++#define IGP02E1000_CABLE_LENGTH_TABLE_SIZE \ ++ (sizeof(e1000_igp_2_cable_length_table) / \ ++ sizeof(e1000_igp_2_cable_length_table[0])) ++ ++/** ++ * e1000e_check_reset_block_generic - Check if PHY reset is blocked ++ * @hw: pointer to the HW structure ++ * ++ * Read the PHY management control register and check whether a PHY reset ++ * is blocked. If a reset is not blocked return E1000_SUCCESS, otherwise ++ * return E1000_BLK_PHY_RESET (12). ++ **/ ++s32 e1000e_check_reset_block_generic(struct e1000_hw *hw) ++{ ++ u32 manc; ++ ++ manc = er32(MANC); ++ ++ return (manc & E1000_MANC_BLK_PHY_RST_ON_IDE) ? ++ E1000_BLK_PHY_RESET : E1000_SUCCESS; ++} ++ ++/** ++ * e1000e_get_phy_id - Retrieve the PHY ID and revision ++ * @hw: pointer to the HW structure ++ * ++ * Reads the PHY registers and stores the PHY ID and possibly the PHY ++ * revision in the hardware structure. ++ **/ ++s32 e1000e_get_phy_id(struct e1000_hw *hw) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ s32 ret_val = E1000_SUCCESS; ++ u16 phy_id; ++ ++ if (!(phy->ops.read_reg)) ++ goto out; ++ ++ ret_val = e1e_rphy(hw, PHY_ID1, &phy_id); ++ if (ret_val) ++ goto out; ++ ++ phy->id = (u32)(phy_id << 16); ++ udelay(20); ++ ret_val = e1e_rphy(hw, PHY_ID2, &phy_id); ++ if (ret_val) ++ goto out; ++ ++ phy->id |= (u32)(phy_id & PHY_REVISION_MASK); ++ phy->revision = (u32)(phy_id & ~PHY_REVISION_MASK); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000e_phy_reset_dsp - Reset PHY DSP ++ * @hw: pointer to the HW structure ++ * ++ * Reset the digital signal processor. ++ **/ ++s32 e1000e_phy_reset_dsp(struct e1000_hw *hw) ++{ ++ s32 ret_val = E1000_SUCCESS; ++ ++ if (!(hw->phy.ops.write_reg)) ++ goto out; ++ ++ ret_val = e1e_wphy(hw, M88E1000_PHY_GEN_CONTROL, 0xC1); ++ if (ret_val) ++ goto out; ++ ++ ret_val = e1e_wphy(hw, M88E1000_PHY_GEN_CONTROL, 0); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000e_read_phy_reg_mdic - Read MDI control register ++ * @hw: pointer to the HW structure ++ * @offset: register offset to be read ++ * @data: pointer to the read data ++ * ++ * Reads the MDI control register in the PHY at offset and stores the ++ * information read to data. ++ **/ ++s32 e1000e_read_phy_reg_mdic(struct e1000_hw *hw, u32 offset, u16 *data) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ u32 i, mdic = 0; ++ s32 ret_val = E1000_SUCCESS; ++ ++ /* ++ * Set up Op-code, Phy Address, and register offset in the MDI ++ * Control register. The MAC will take care of interfacing with the ++ * PHY to retrieve the desired data. ++ */ ++ mdic = ((offset << E1000_MDIC_REG_SHIFT) | ++ (phy->addr << E1000_MDIC_PHY_SHIFT) | ++ (E1000_MDIC_OP_READ)); ++ ++ ew32(MDIC, mdic); ++ ++ /* ++ * Poll the ready bit to see if the MDI read completed ++ * Increasing the time out as testing showed failures with ++ * the lower time out ++ */ ++ for (i = 0; i < (E1000_GEN_POLL_TIMEOUT * 3); i++) { ++ udelay(50); ++ mdic = er32(MDIC); ++ if (mdic & E1000_MDIC_READY) ++ break; ++ } ++ if (!(mdic & E1000_MDIC_READY)) { ++ e_dbg("MDI Read did not complete\n"); ++ ret_val = -E1000_ERR_PHY; ++ goto out; ++ } ++ if (mdic & E1000_MDIC_ERROR) { ++ e_dbg("MDI Error\n"); ++ ret_val = -E1000_ERR_PHY; ++ goto out; ++ } ++ *data = (u16) mdic; ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000e_write_phy_reg_mdic - Write MDI control register ++ * @hw: pointer to the HW structure ++ * @offset: register offset to write to ++ * @data: data to write to register at offset ++ * ++ * Writes data to MDI control register in the PHY at offset. ++ **/ ++s32 e1000e_write_phy_reg_mdic(struct e1000_hw *hw, u32 offset, u16 data) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ u32 i, mdic = 0; ++ s32 ret_val = E1000_SUCCESS; ++ ++ /* ++ * Set up Op-code, Phy Address, and register offset in the MDI ++ * Control register. The MAC will take care of interfacing with the ++ * PHY to retrieve the desired data. ++ */ ++ mdic = (((u32)data) | ++ (offset << E1000_MDIC_REG_SHIFT) | ++ (phy->addr << E1000_MDIC_PHY_SHIFT) | ++ (E1000_MDIC_OP_WRITE)); ++ ++ ew32(MDIC, mdic); ++ ++ /* ++ * Poll the ready bit to see if the MDI read completed ++ * Increasing the time out as testing showed failures with ++ * the lower time out ++ */ ++ for (i = 0; i < (E1000_GEN_POLL_TIMEOUT * 3); i++) { ++ udelay(50); ++ mdic = er32(MDIC); ++ if (mdic & E1000_MDIC_READY) ++ break; ++ } ++ if (!(mdic & E1000_MDIC_READY)) { ++ e_dbg("MDI Write did not complete\n"); ++ ret_val = -E1000_ERR_PHY; ++ goto out; ++ } ++ if (mdic & E1000_MDIC_ERROR) { ++ e_dbg("MDI Error\n"); ++ ret_val = -E1000_ERR_PHY; ++ goto out; ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000e_read_phy_reg_m88 - Read m88 PHY register ++ * @hw: pointer to the HW structure ++ * @offset: register offset to be read ++ * @data: pointer to the read data ++ * ++ * Acquires semaphore, if necessary, then reads the PHY register at offset ++ * and storing the retrieved information in data. Release any acquired ++ * semaphores before exiting. ++ **/ ++s32 e1000e_read_phy_reg_m88(struct e1000_hw *hw, u32 offset, u16 *data) ++{ ++ s32 ret_val = E1000_SUCCESS; ++ ++ if (!(hw->phy.ops.acquire)) ++ goto out; ++ ++ ret_val = hw->phy.ops.acquire(hw); ++ if (ret_val) ++ goto out; ++ ++ ret_val = e1000e_read_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset, ++ data); ++ ++ hw->phy.ops.release(hw); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000e_write_phy_reg_m88 - Write m88 PHY register ++ * @hw: pointer to the HW structure ++ * @offset: register offset to write to ++ * @data: data to write at register offset ++ * ++ * Acquires semaphore, if necessary, then writes the data to PHY register ++ * at the offset. Release any acquired semaphores before exiting. ++ **/ ++s32 e1000e_write_phy_reg_m88(struct e1000_hw *hw, u32 offset, u16 data) ++{ ++ s32 ret_val = E1000_SUCCESS; ++ ++ if (!(hw->phy.ops.acquire)) ++ goto out; ++ ++ ret_val = hw->phy.ops.acquire(hw); ++ if (ret_val) ++ goto out; ++ ++ ret_val = e1000e_write_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset, ++ data); ++ ++ hw->phy.ops.release(hw); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000e_read_phy_reg_igp - Read igp PHY register ++ * @hw: pointer to the HW structure ++ * @offset: register offset to be read ++ * @data: pointer to the read data ++ * ++ * Acquires semaphore, if necessary, then reads the PHY register at offset ++ * and storing the retrieved information in data. Release any acquired ++ * semaphores before exiting. ++ **/ ++s32 e1000e_read_phy_reg_igp(struct e1000_hw *hw, u32 offset, u16 *data) ++{ ++ s32 ret_val = E1000_SUCCESS; ++ ++ if (!(hw->phy.ops.acquire)) ++ goto out; ++ ++ ret_val = hw->phy.ops.acquire(hw); ++ if (ret_val) ++ goto out; ++ ++ if (offset > MAX_PHY_MULTI_PAGE_REG) { ++ ret_val = e1000e_write_phy_reg_mdic(hw, ++ IGP01E1000_PHY_PAGE_SELECT, ++ (u16)offset); ++ if (ret_val) { ++ hw->phy.ops.release(hw); ++ goto out; ++ } ++ } ++ ++ ret_val = e1000e_read_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset, ++ data); ++ ++ hw->phy.ops.release(hw); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000e_write_phy_reg_igp - Write igp PHY register ++ * @hw: pointer to the HW structure ++ * @offset: register offset to write to ++ * @data: data to write at register offset ++ * ++ * Acquires semaphore, if necessary, then writes the data to PHY register ++ * at the offset. Release any acquired semaphores before exiting. ++ **/ ++s32 e1000e_write_phy_reg_igp(struct e1000_hw *hw, u32 offset, u16 data) ++{ ++ s32 ret_val = E1000_SUCCESS; ++ ++ if (!(hw->phy.ops.acquire)) ++ goto out; ++ ++ ret_val = hw->phy.ops.acquire(hw); ++ if (ret_val) ++ goto out; ++ ++ if (offset > MAX_PHY_MULTI_PAGE_REG) { ++ ret_val = e1000e_write_phy_reg_mdic(hw, ++ IGP01E1000_PHY_PAGE_SELECT, ++ (u16)offset); ++ if (ret_val) { ++ hw->phy.ops.release(hw); ++ goto out; ++ } ++ } ++ ++ ret_val = e1000e_write_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset, ++ data); ++ ++ hw->phy.ops.release(hw); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000e_read_kmrn_reg - Read kumeran register ++ * @hw: pointer to the HW structure ++ * @offset: register offset to be read ++ * @data: pointer to the read data ++ * ++ * Acquires semaphore, if necessary. Then reads the PHY register at offset ++ * using the kumeran interface. The information retrieved is stored in data. ++ * Release any acquired semaphores before exiting. ++ **/ ++s32 e1000e_read_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 *data) ++{ ++ u32 kmrnctrlsta; ++ s32 ret_val = E1000_SUCCESS; ++ ++ if (!(hw->phy.ops.acquire)) ++ goto out; ++ ++ ret_val = hw->phy.ops.acquire(hw); ++ if (ret_val) ++ goto out; ++ ++ kmrnctrlsta = ((offset << E1000_KMRNCTRLSTA_OFFSET_SHIFT) & ++ E1000_KMRNCTRLSTA_OFFSET) | E1000_KMRNCTRLSTA_REN; ++ ew32(KMRNCTRLSTA, kmrnctrlsta); ++ ++ udelay(2); ++ ++ kmrnctrlsta = er32(KMRNCTRLSTA); ++ *data = (u16)kmrnctrlsta; ++ ++ hw->phy.ops.release(hw); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000e_write_kmrn_reg - Write kumeran register ++ * @hw: pointer to the HW structure ++ * @offset: register offset to write to ++ * @data: data to write at register offset ++ * ++ * Acquires semaphore, if necessary. Then write the data to PHY register ++ * at the offset using the kumeran interface. Release any acquired semaphores ++ * before exiting. ++ **/ ++s32 e1000e_write_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 data) ++{ ++ u32 kmrnctrlsta; ++ s32 ret_val = E1000_SUCCESS; ++ ++ if (!(hw->phy.ops.acquire)) ++ goto out; ++ ++ ret_val = hw->phy.ops.acquire(hw); ++ if (ret_val) ++ goto out; ++ ++ kmrnctrlsta = ((offset << E1000_KMRNCTRLSTA_OFFSET_SHIFT) & ++ E1000_KMRNCTRLSTA_OFFSET) | data; ++ ew32(KMRNCTRLSTA, kmrnctrlsta); ++ ++ udelay(2); ++ hw->phy.ops.release(hw); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000e_copper_link_setup_m88 - Setup m88 PHY's for copper link ++ * @hw: pointer to the HW structure ++ * ++ * Sets up MDI/MDI-X and polarity for m88 PHY's. If necessary, transmit clock ++ * and downshift values are set also. ++ **/ ++s32 e1000e_copper_link_setup_m88(struct e1000_hw *hw) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ s32 ret_val; ++ u16 phy_data; ++ ++ if (phy->reset_disable) { ++ ret_val = E1000_SUCCESS; ++ goto out; ++ } ++ ++ /* Enable CRS on TX. This must be set for half-duplex operation. */ ++ ret_val = e1e_rphy(hw, M88E1000_PHY_SPEC_CTRL, &phy_data); ++ if (ret_val) ++ goto out; ++ ++ /* For BM PHY this bit is downshift enable */ ++ if (phy->type != e1000_phy_bm) ++ phy_data |= M88E1000_PSCR_ASSERT_CRS_ON_TX; ++ ++ /* ++ * Options: ++ * MDI/MDI-X = 0 (default) ++ * 0 - Auto for all speeds ++ * 1 - MDI mode ++ * 2 - MDI-X mode ++ * 3 - Auto for 1000Base-T only (MDI-X for 10/100Base-T modes) ++ */ ++ phy_data &= ~M88E1000_PSCR_AUTO_X_MODE; ++ ++ switch (phy->mdix) { ++ case 1: ++ phy_data |= M88E1000_PSCR_MDI_MANUAL_MODE; ++ break; ++ case 2: ++ phy_data |= M88E1000_PSCR_MDIX_MANUAL_MODE; ++ break; ++ case 3: ++ phy_data |= M88E1000_PSCR_AUTO_X_1000T; ++ break; ++ case 0: ++ default: ++ phy_data |= M88E1000_PSCR_AUTO_X_MODE; ++ break; ++ } ++ ++ /* ++ * Options: ++ * disable_polarity_correction = 0 (default) ++ * Automatic Correction for Reversed Cable Polarity ++ * 0 - Disabled ++ * 1 - Enabled ++ */ ++ phy_data &= ~M88E1000_PSCR_POLARITY_REVERSAL; ++ if (phy->disable_polarity_correction == 1) ++ phy_data |= M88E1000_PSCR_POLARITY_REVERSAL; ++ ++ /* Enable downshift on BM (disabled by default) */ ++ if (phy->type == e1000_phy_bm) ++ phy_data |= BME1000_PSCR_ENABLE_DOWNSHIFT; ++ ++ ret_val = e1e_wphy(hw, M88E1000_PHY_SPEC_CTRL, phy_data); ++ if (ret_val) ++ goto out; ++ ++ if ((phy->type == e1000_phy_m88) && ++ (phy->revision < E1000_REVISION_4) && ++ (phy->id != BME1000_E_PHY_ID_R2)) { ++ /* ++ * Force TX_CLK in the Extended PHY Specific Control Register ++ * to 25MHz clock. ++ */ ++ ret_val = e1e_rphy(hw, M88E1000_EXT_PHY_SPEC_CTRL, ++ &phy_data); ++ if (ret_val) ++ goto out; ++ ++ phy_data |= M88E1000_EPSCR_TX_CLK_25; ++ ++ if ((phy->revision == E1000_REVISION_2) && ++ (phy->id == M88E1111_I_PHY_ID)) { ++ /* 82573L PHY - set the downshift counter to 5x. */ ++ phy_data &= ~M88EC018_EPSCR_DOWNSHIFT_COUNTER_MASK; ++ phy_data |= M88EC018_EPSCR_DOWNSHIFT_COUNTER_5X; ++ } else { ++ /* Configure Master and Slave downshift values */ ++ phy_data &= ~(M88E1000_EPSCR_MASTER_DOWNSHIFT_MASK | ++ M88E1000_EPSCR_SLAVE_DOWNSHIFT_MASK); ++ phy_data |= (M88E1000_EPSCR_MASTER_DOWNSHIFT_1X | ++ M88E1000_EPSCR_SLAVE_DOWNSHIFT_1X); ++ } ++ ret_val = e1e_wphy(hw, M88E1000_EXT_PHY_SPEC_CTRL, ++ phy_data); ++ if (ret_val) ++ goto out; ++ } ++ ++ if ((phy->type == e1000_phy_bm) && (phy->id == BME1000_E_PHY_ID_R2)) { ++ /* Set PHY page 0, register 29 to 0x0003 */ ++ ret_val = e1e_wphy(hw, 29, 0x0003); ++ if (ret_val) ++ goto out; ++ ++ /* Set PHY page 0, register 30 to 0x0000 */ ++ ret_val = e1e_wphy(hw, 30, 0x0000); ++ if (ret_val) ++ goto out; ++ } ++ ++ /* Commit the changes. */ ++ ret_val = e1000e_commit_phy(hw); ++ if (ret_val) { ++ e_dbg("Error committing the PHY changes\n"); ++ goto out; ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000e_copper_link_setup_igp - Setup igp PHY's for copper link ++ * @hw: pointer to the HW structure ++ * ++ * Sets up LPLU, MDI/MDI-X, polarity, Smartspeed and Master/Slave config for ++ * igp PHY's. ++ **/ ++s32 e1000e_copper_link_setup_igp(struct e1000_hw *hw) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ s32 ret_val; ++ u16 data; ++ ++ if (phy->reset_disable) { ++ ret_val = E1000_SUCCESS; ++ goto out; ++ } ++ ++ ret_val = e1000_phy_hw_reset(hw); ++ if (ret_val) { ++ e_dbg("Error resetting the PHY.\n"); ++ goto out; ++ } ++ ++ /* ++ * Wait 100ms for MAC to configure PHY from NVM settings, to avoid ++ * timeout issues when LFS is enabled. ++ */ ++ msleep(100); ++ ++ /* ++ * The NVM settings will configure LPLU in D3 for ++ * non-IGP1 PHYs. ++ */ ++ if (phy->type == e1000_phy_igp) { ++ /* disable lplu d3 during driver init */ ++ ret_val = hw->phy.ops.set_d3_lplu_state(hw, false); ++ if (ret_val) { ++ e_dbg("Error Disabling LPLU D3\n"); ++ goto out; ++ } ++ } ++ ++ /* disable lplu d0 during driver init */ ++ if (hw->phy.ops.set_d0_lplu_state) { ++ ret_val = hw->phy.ops.set_d0_lplu_state(hw, false); ++ if (ret_val) { ++ e_dbg("Error Disabling LPLU D0\n"); ++ goto out; ++ } ++ } ++ /* Configure mdi-mdix settings */ ++ ret_val = e1e_rphy(hw, IGP01E1000_PHY_PORT_CTRL, &data); ++ if (ret_val) ++ goto out; ++ ++ data &= ~IGP01E1000_PSCR_AUTO_MDIX; ++ ++ switch (phy->mdix) { ++ case 1: ++ data &= ~IGP01E1000_PSCR_FORCE_MDI_MDIX; ++ break; ++ case 2: ++ data |= IGP01E1000_PSCR_FORCE_MDI_MDIX; ++ break; ++ case 0: ++ default: ++ data |= IGP01E1000_PSCR_AUTO_MDIX; ++ break; ++ } ++ ret_val = e1e_wphy(hw, IGP01E1000_PHY_PORT_CTRL, data); ++ if (ret_val) ++ goto out; ++ ++ /* set auto-master slave resolution settings */ ++ if (hw->mac.autoneg) { ++ /* ++ * when autonegotiation advertisement is only 1000Mbps then we ++ * should disable SmartSpeed and enable Auto MasterSlave ++ * resolution as hardware default. ++ */ ++ if (phy->autoneg_advertised == ADVERTISE_1000_FULL) { ++ /* Disable SmartSpeed */ ++ ret_val = e1e_rphy(hw, ++ IGP01E1000_PHY_PORT_CONFIG, ++ &data); ++ if (ret_val) ++ goto out; ++ ++ data &= ~IGP01E1000_PSCFR_SMART_SPEED; ++ ret_val = e1e_wphy(hw, ++ IGP01E1000_PHY_PORT_CONFIG, ++ data); ++ if (ret_val) ++ goto out; ++ ++ /* Set auto Master/Slave resolution process */ ++ ret_val = e1e_rphy(hw, PHY_1000T_CTRL, &data); ++ if (ret_val) ++ goto out; ++ ++ data &= ~CR_1000T_MS_ENABLE; ++ ret_val = e1e_wphy(hw, PHY_1000T_CTRL, data); ++ if (ret_val) ++ goto out; ++ } ++ ++ ret_val = e1e_rphy(hw, PHY_1000T_CTRL, &data); ++ if (ret_val) ++ goto out; ++ ++ /* load defaults for future use */ ++ phy->original_ms_type = (data & CR_1000T_MS_ENABLE) ? ++ ((data & CR_1000T_MS_VALUE) ? ++ e1000_ms_force_master : ++ e1000_ms_force_slave) : ++ e1000_ms_auto; ++ ++ switch (phy->ms_type) { ++ case e1000_ms_force_master: ++ data |= (CR_1000T_MS_ENABLE | CR_1000T_MS_VALUE); ++ break; ++ case e1000_ms_force_slave: ++ data |= CR_1000T_MS_ENABLE; ++ data &= ~(CR_1000T_MS_VALUE); ++ break; ++ case e1000_ms_auto: ++ data &= ~CR_1000T_MS_ENABLE; ++ default: ++ break; ++ } ++ ret_val = e1e_wphy(hw, PHY_1000T_CTRL, data); ++ if (ret_val) ++ goto out; ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_copper_link_autoneg - Setup/Enable autoneg for copper link ++ * @hw: pointer to the HW structure ++ * ++ * Performs initial bounds checking on autoneg advertisement parameter, then ++ * configure to advertise the full capability. Setup the PHY to autoneg ++ * and restart the negotiation process between the link partner. If ++ * autoneg_wait_to_complete, then wait for autoneg to complete before exiting. ++ **/ ++static s32 e1000_copper_link_autoneg(struct e1000_hw *hw) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ s32 ret_val; ++ u16 phy_ctrl; ++ ++ /* ++ * Perform some bounds checking on the autoneg advertisement ++ * parameter. ++ */ ++ phy->autoneg_advertised &= phy->autoneg_mask; ++ ++ /* ++ * If autoneg_advertised is zero, we assume it was not defaulted ++ * by the calling code so we set to advertise full capability. ++ */ ++ if (phy->autoneg_advertised == 0) ++ phy->autoneg_advertised = phy->autoneg_mask; ++ ++ e_dbg("Reconfiguring auto-neg advertisement params\n"); ++ ret_val = e1000_phy_setup_autoneg(hw); ++ if (ret_val) { ++ e_dbg("Error Setting up Auto-Negotiation\n"); ++ goto out; ++ } ++ e_dbg("Restarting Auto-Neg\n"); ++ ++ /* ++ * Restart auto-negotiation by setting the Auto Neg Enable bit and ++ * the Auto Neg Restart bit in the PHY control register. ++ */ ++ ret_val = e1e_rphy(hw, PHY_CONTROL, &phy_ctrl); ++ if (ret_val) ++ goto out; ++ ++ phy_ctrl |= (MII_CR_AUTO_NEG_EN | MII_CR_RESTART_AUTO_NEG); ++ ret_val = e1e_wphy(hw, PHY_CONTROL, phy_ctrl); ++ if (ret_val) ++ goto out; ++ ++ /* ++ * Does the user want to wait for Auto-Neg to complete here, or ++ * check at a later time (for example, callback routine). ++ */ ++ if (phy->autoneg_wait_to_complete) { ++ ret_val = hw->mac.ops.wait_autoneg(hw); ++ if (ret_val) { ++ e_dbg("Error while waiting for " ++ "autoneg to complete\n"); ++ goto out; ++ } ++ } ++ ++ hw->mac.get_link_status = true; ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_phy_setup_autoneg - Configure PHY for auto-negotiation ++ * @hw: pointer to the HW structure ++ * ++ * Reads the MII auto-neg advertisement register and/or the 1000T control ++ * register and if the PHY is already setup for auto-negotiation, then ++ * return successful. Otherwise, setup advertisement and flow control to ++ * the appropriate values for the wanted auto-negotiation. ++ **/ ++static s32 e1000_phy_setup_autoneg(struct e1000_hw *hw) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ s32 ret_val; ++ u16 mii_autoneg_adv_reg; ++ u16 mii_1000t_ctrl_reg = 0; ++ ++ phy->autoneg_advertised &= phy->autoneg_mask; ++ ++ /* Read the MII Auto-Neg Advertisement Register (Address 4). */ ++ ret_val = e1e_rphy(hw, PHY_AUTONEG_ADV, &mii_autoneg_adv_reg); ++ if (ret_val) ++ goto out; ++ ++ if (phy->autoneg_mask & ADVERTISE_1000_FULL) { ++ /* Read the MII 1000Base-T Control Register (Address 9). */ ++ ret_val = e1e_rphy(hw, PHY_1000T_CTRL, ++ &mii_1000t_ctrl_reg); ++ if (ret_val) ++ goto out; ++ } ++ ++ /* ++ * Need to parse both autoneg_advertised and fc and set up ++ * the appropriate PHY registers. First we will parse for ++ * autoneg_advertised software override. Since we can advertise ++ * a plethora of combinations, we need to check each bit ++ * individually. ++ */ ++ ++ /* ++ * First we clear all the 10/100 mb speed bits in the Auto-Neg ++ * Advertisement Register (Address 4) and the 1000 mb speed bits in ++ * the 1000Base-T Control Register (Address 9). ++ */ ++ mii_autoneg_adv_reg &= ~(NWAY_AR_100TX_FD_CAPS | ++ NWAY_AR_100TX_HD_CAPS | ++ NWAY_AR_10T_FD_CAPS | ++ NWAY_AR_10T_HD_CAPS); ++ mii_1000t_ctrl_reg &= ~(CR_1000T_HD_CAPS | CR_1000T_FD_CAPS); ++ ++ e_dbg("autoneg_advertised %x\n", phy->autoneg_advertised); ++ ++ /* Do we want to advertise 10 Mb Half Duplex? */ ++ if (phy->autoneg_advertised & ADVERTISE_10_HALF) { ++ e_dbg("Advertise 10mb Half duplex\n"); ++ mii_autoneg_adv_reg |= NWAY_AR_10T_HD_CAPS; ++ } ++ ++ /* Do we want to advertise 10 Mb Full Duplex? */ ++ if (phy->autoneg_advertised & ADVERTISE_10_FULL) { ++ e_dbg("Advertise 10mb Full duplex\n"); ++ mii_autoneg_adv_reg |= NWAY_AR_10T_FD_CAPS; ++ } ++ ++ /* Do we want to advertise 100 Mb Half Duplex? */ ++ if (phy->autoneg_advertised & ADVERTISE_100_HALF) { ++ e_dbg("Advertise 100mb Half duplex\n"); ++ mii_autoneg_adv_reg |= NWAY_AR_100TX_HD_CAPS; ++ } ++ ++ /* Do we want to advertise 100 Mb Full Duplex? */ ++ if (phy->autoneg_advertised & ADVERTISE_100_FULL) { ++ e_dbg("Advertise 100mb Full duplex\n"); ++ mii_autoneg_adv_reg |= NWAY_AR_100TX_FD_CAPS; ++ } ++ ++ /* We do not allow the Phy to advertise 1000 Mb Half Duplex */ ++ if (phy->autoneg_advertised & ADVERTISE_1000_HALF) ++ e_dbg("Advertise 1000mb Half duplex request denied!\n"); ++ ++ /* Do we want to advertise 1000 Mb Full Duplex? */ ++ if (phy->autoneg_advertised & ADVERTISE_1000_FULL) { ++ e_dbg("Advertise 1000mb Full duplex\n"); ++ mii_1000t_ctrl_reg |= CR_1000T_FD_CAPS; ++ } ++ ++ /* ++ * Check for a software override of the flow control settings, and ++ * setup the PHY advertisement registers accordingly. If ++ * auto-negotiation is enabled, then software will have to set the ++ * "PAUSE" bits to the correct value in the Auto-Negotiation ++ * Advertisement Register (PHY_AUTONEG_ADV) and re-start auto- ++ * negotiation. ++ * ++ * The possible values of the "fc" parameter are: ++ * 0: Flow control is completely disabled ++ * 1: Rx flow control is enabled (we can receive pause frames ++ * but not send pause frames). ++ * 2: Tx flow control is enabled (we can send pause frames ++ * but we do not support receiving pause frames). ++ * 3: Both Rx and Tx flow control (symmetric) are enabled. ++ * other: No software override. The flow control configuration ++ * in the EEPROM is used. ++ */ ++ switch (hw->fc.current_mode) { ++ case e1000_fc_none: ++ /* ++ * Flow control (Rx & Tx) is completely disabled by a ++ * software over-ride. ++ */ ++ mii_autoneg_adv_reg &= ~(NWAY_AR_ASM_DIR | NWAY_AR_PAUSE); ++ break; ++ case e1000_fc_rx_pause: ++ /* ++ * Rx Flow control is enabled, and Tx Flow control is ++ * disabled, by a software over-ride. ++ * ++ * Since there really isn't a way to advertise that we are ++ * capable of Rx Pause ONLY, we will advertise that we ++ * support both symmetric and asymmetric Rx PAUSE. Later ++ * (in e1000e_config_fc_after_link_up) we will disable the ++ * hw's ability to send PAUSE frames. ++ */ ++ mii_autoneg_adv_reg |= (NWAY_AR_ASM_DIR | NWAY_AR_PAUSE); ++ break; ++ case e1000_fc_tx_pause: ++ /* ++ * Tx Flow control is enabled, and Rx Flow control is ++ * disabled, by a software over-ride. ++ */ ++ mii_autoneg_adv_reg |= NWAY_AR_ASM_DIR; ++ mii_autoneg_adv_reg &= ~NWAY_AR_PAUSE; ++ break; ++ case e1000_fc_full: ++ /* ++ * Flow control (both Rx and Tx) is enabled by a software ++ * over-ride. ++ */ ++ mii_autoneg_adv_reg |= (NWAY_AR_ASM_DIR | NWAY_AR_PAUSE); ++ break; ++ default: ++ e_dbg("Flow control param set incorrectly\n"); ++ ret_val = -E1000_ERR_CONFIG; ++ goto out; ++ } ++ ++ ret_val = e1e_wphy(hw, PHY_AUTONEG_ADV, mii_autoneg_adv_reg); ++ if (ret_val) ++ goto out; ++ ++ e_dbg("Auto-Neg Advertising %x\n", mii_autoneg_adv_reg); ++ ++ if (phy->autoneg_mask & ADVERTISE_1000_FULL) { ++ ret_val = e1e_wphy(hw, ++ PHY_1000T_CTRL, ++ mii_1000t_ctrl_reg); ++ if (ret_val) ++ goto out; ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000e_setup_copper_link - Configure copper link settings ++ * @hw: pointer to the HW structure ++ * ++ * Calls the appropriate function to configure the link for auto-neg or forced ++ * speed and duplex. Then we check for link, once link is established calls ++ * to configure collision distance and flow control are called. If link is ++ * not established, we return -E1000_ERR_PHY (-2). ++ **/ ++s32 e1000e_setup_copper_link(struct e1000_hw *hw) ++{ ++ s32 ret_val; ++ bool link; ++ ++ if (hw->mac.autoneg) { ++ /* ++ * Setup autoneg and flow control advertisement and perform ++ * autonegotiation. ++ */ ++ ret_val = e1000_copper_link_autoneg(hw); ++ if (ret_val) ++ goto out; ++ } else { ++ /* ++ * PHY will be set to 10H, 10F, 100H or 100F ++ * depending on user settings. ++ */ ++ e_dbg("Forcing Speed and Duplex\n"); ++ ret_val = hw->phy.ops.force_speed_duplex(hw); ++ if (ret_val) { ++ e_dbg("Error Forcing Speed and Duplex\n"); ++ goto out; ++ } ++ } ++ ++ /* ++ * Check link status. Wait up to 100 microseconds for link to become ++ * valid. ++ */ ++ ret_val = e1000e_phy_has_link_generic(hw, ++ COPPER_LINK_UP_LIMIT, ++ 10, ++ &link); ++ if (ret_val) ++ goto out; ++ ++ if (link) { ++ e_dbg("Valid link established!!!\n"); ++ e1000e_config_collision_dist(hw); ++ ret_val = e1000e_config_fc_after_link_up(hw); ++ } else { ++ e_dbg("Unable to establish link!!!\n"); ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000e_phy_force_speed_duplex_igp - Force speed/duplex for igp PHY ++ * @hw: pointer to the HW structure ++ * ++ * Calls the PHY setup function to force speed and duplex. Clears the ++ * auto-crossover to force MDI manually. Waits for link and returns ++ * successful if link up is successful, else -E1000_ERR_PHY (-2). ++ **/ ++s32 e1000e_phy_force_speed_duplex_igp(struct e1000_hw *hw) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ s32 ret_val; ++ u16 phy_data; ++ bool link; ++ ++ ret_val = e1e_rphy(hw, PHY_CONTROL, &phy_data); ++ if (ret_val) ++ goto out; ++ ++ e1000e_phy_force_speed_duplex_setup(hw, &phy_data); ++ ++ ret_val = e1e_wphy(hw, PHY_CONTROL, phy_data); ++ if (ret_val) ++ goto out; ++ ++ /* ++ * Clear Auto-Crossover to force MDI manually. IGP requires MDI ++ * forced whenever speed and duplex are forced. ++ */ ++ ret_val = e1e_rphy(hw, IGP01E1000_PHY_PORT_CTRL, &phy_data); ++ if (ret_val) ++ goto out; ++ ++ phy_data &= ~IGP01E1000_PSCR_AUTO_MDIX; ++ phy_data &= ~IGP01E1000_PSCR_FORCE_MDI_MDIX; ++ ++ ret_val = e1e_wphy(hw, IGP01E1000_PHY_PORT_CTRL, phy_data); ++ if (ret_val) ++ goto out; ++ ++ e_dbg("IGP PSCR: %X\n", phy_data); ++ ++ udelay(1); ++ ++ if (phy->autoneg_wait_to_complete) { ++ e_dbg("Waiting for forced speed/duplex link on IGP phy.\n"); ++ ++ ret_val = e1000e_phy_has_link_generic(hw, ++ PHY_FORCE_LIMIT, ++ 100000, ++ &link); ++ if (ret_val) ++ goto out; ++ ++ if (!link) ++ e_dbg("Link taking longer than expected.\n"); ++ ++ /* Try once more */ ++ ret_val = e1000e_phy_has_link_generic(hw, ++ PHY_FORCE_LIMIT, ++ 100000, ++ &link); ++ if (ret_val) ++ goto out; ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000e_phy_force_speed_duplex_m88 - Force speed/duplex for m88 PHY ++ * @hw: pointer to the HW structure ++ * ++ * Calls the PHY setup function to force speed and duplex. Clears the ++ * auto-crossover to force MDI manually. Resets the PHY to commit the ++ * changes. If time expires while waiting for link up, we reset the DSP. ++ * After reset, TX_CLK and CRS on Tx must be set. Return successful upon ++ * successful completion, else return corresponding error code. ++ **/ ++s32 e1000e_phy_force_speed_duplex_m88(struct e1000_hw *hw) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ s32 ret_val; ++ u16 phy_data; ++ bool link; ++ ++ /* ++ * Clear Auto-Crossover to force MDI manually. M88E1000 requires MDI ++ * forced whenever speed and duplex are forced. ++ */ ++ ret_val = e1e_rphy(hw, M88E1000_PHY_SPEC_CTRL, &phy_data); ++ if (ret_val) ++ goto out; ++ ++ phy_data &= ~M88E1000_PSCR_AUTO_X_MODE; ++ ret_val = e1e_wphy(hw, M88E1000_PHY_SPEC_CTRL, phy_data); ++ if (ret_val) ++ goto out; ++ ++ e_dbg("M88E1000 PSCR: %X\n", phy_data); ++ ++ ret_val = e1e_rphy(hw, PHY_CONTROL, &phy_data); ++ if (ret_val) ++ goto out; ++ ++ e1000e_phy_force_speed_duplex_setup(hw, &phy_data); ++ ++ ret_val = e1e_wphy(hw, PHY_CONTROL, phy_data); ++ if (ret_val) ++ goto out; ++ ++ /* Reset the phy to commit changes. */ ++ ret_val = e1000e_commit_phy(hw); ++ if (ret_val) ++ goto out; ++ ++ if (phy->autoneg_wait_to_complete) { ++ e_dbg("Waiting for forced speed/duplex link on M88 phy.\n"); ++ ++ ret_val = e1000e_phy_has_link_generic(hw, PHY_FORCE_LIMIT, ++ 100000, &link); ++ if (ret_val) ++ goto out; ++ ++ if (!link) { ++ /* ++ * We didn't get link. ++ * Reset the DSP and cross our fingers. ++ */ ++ ret_val = e1e_wphy(hw, ++ M88E1000_PHY_PAGE_SELECT, ++ 0x001d); ++ if (ret_val) ++ goto out; ++ ret_val = e1000e_phy_reset_dsp(hw); ++ if (ret_val) ++ goto out; ++ } ++ ++ /* Try once more */ ++ ret_val = e1000e_phy_has_link_generic(hw, PHY_FORCE_LIMIT, ++ 100000, &link); ++ if (ret_val) ++ goto out; ++ } ++ ++ ret_val = e1e_rphy(hw, M88E1000_EXT_PHY_SPEC_CTRL, &phy_data); ++ if (ret_val) ++ goto out; ++ ++ /* ++ * Resetting the phy means we need to re-force TX_CLK in the ++ * Extended PHY Specific Control Register to 25MHz clock from ++ * the reset value of 2.5MHz. ++ */ ++ phy_data |= M88E1000_EPSCR_TX_CLK_25; ++ ret_val = e1e_wphy(hw, M88E1000_EXT_PHY_SPEC_CTRL, phy_data); ++ if (ret_val) ++ goto out; ++ ++ /* ++ * In addition, we must re-enable CRS on Tx for both half and full ++ * duplex. ++ */ ++ ret_val = e1e_rphy(hw, M88E1000_PHY_SPEC_CTRL, &phy_data); ++ if (ret_val) ++ goto out; ++ ++ phy_data |= M88E1000_PSCR_ASSERT_CRS_ON_TX; ++ ret_val = e1e_wphy(hw, M88E1000_PHY_SPEC_CTRL, phy_data); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000e_phy_force_speed_duplex_setup - Configure forced PHY speed/duplex ++ * @hw: pointer to the HW structure ++ * @phy_ctrl: pointer to current value of PHY_CONTROL ++ * ++ * Forces speed and duplex on the PHY by doing the following: disable flow ++ * control, force speed/duplex on the MAC, disable auto speed detection, ++ * disable auto-negotiation, configure duplex, configure speed, configure ++ * the collision distance, write configuration to CTRL register. The ++ * caller must write to the PHY_CONTROL register for these settings to ++ * take affect. ++ **/ ++void e1000e_phy_force_speed_duplex_setup(struct e1000_hw *hw, u16 *phy_ctrl) ++{ ++ struct e1000_mac_info *mac = &hw->mac; ++ u32 ctrl; ++ ++ /* Turn off flow control when forcing speed/duplex */ ++ hw->fc.current_mode = e1000_fc_none; ++ ++ /* Force speed/duplex on the mac */ ++ ctrl = er32(CTRL); ++ ctrl |= (E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX); ++ ctrl &= ~E1000_CTRL_SPD_SEL; ++ ++ /* Disable Auto Speed Detection */ ++ ctrl &= ~E1000_CTRL_ASDE; ++ ++ /* Disable autoneg on the phy */ ++ *phy_ctrl &= ~MII_CR_AUTO_NEG_EN; ++ ++ /* Forcing Full or Half Duplex? */ ++ if (mac->forced_speed_duplex & E1000_ALL_HALF_DUPLEX) { ++ ctrl &= ~E1000_CTRL_FD; ++ *phy_ctrl &= ~MII_CR_FULL_DUPLEX; ++ e_dbg("Half Duplex\n"); ++ } else { ++ ctrl |= E1000_CTRL_FD; ++ *phy_ctrl |= MII_CR_FULL_DUPLEX; ++ e_dbg("Full Duplex\n"); ++ } ++ ++ /* Forcing 10mb or 100mb? */ ++ if (mac->forced_speed_duplex & E1000_ALL_100_SPEED) { ++ ctrl |= E1000_CTRL_SPD_100; ++ *phy_ctrl |= MII_CR_SPEED_100; ++ *phy_ctrl &= ~(MII_CR_SPEED_1000 | MII_CR_SPEED_10); ++ e_dbg("Forcing 100mb\n"); ++ } else { ++ ctrl &= ~(E1000_CTRL_SPD_1000 | E1000_CTRL_SPD_100); ++ *phy_ctrl |= MII_CR_SPEED_10; ++ *phy_ctrl &= ~(MII_CR_SPEED_1000 | MII_CR_SPEED_100); ++ e_dbg("Forcing 10mb\n"); ++ } ++ ++ e1000e_config_collision_dist(hw); ++ ++ ew32(CTRL, ctrl); ++} ++ ++/** ++ * e1000e_set_d3_lplu_state - Sets low power link up state for D3 ++ * @hw: pointer to the HW structure ++ * @active: boolean used to enable/disable lplu ++ * ++ * Success returns 0, Failure returns 1 ++ * ++ * The low power link up (lplu) state is set to the power management level D3 ++ * and SmartSpeed is disabled when active is true, else clear lplu for D3 ++ * and enable Smartspeed. LPLU and Smartspeed are mutually exclusive. LPLU ++ * is used during Dx states where the power conservation is most important. ++ * During driver activity, SmartSpeed should be enabled so performance is ++ * maintained. ++ **/ ++s32 e1000e_set_d3_lplu_state(struct e1000_hw *hw, bool active) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ s32 ret_val = E1000_SUCCESS; ++ u16 data; ++ ++ if (!(hw->phy.ops.read_reg)) ++ goto out; ++ ++ ret_val = e1e_rphy(hw, IGP02E1000_PHY_POWER_MGMT, &data); ++ if (ret_val) ++ goto out; ++ ++ if (!active) { ++ data &= ~IGP02E1000_PM_D3_LPLU; ++ ret_val = e1e_wphy(hw, IGP02E1000_PHY_POWER_MGMT, ++ data); ++ if (ret_val) ++ goto out; ++ /* ++ * LPLU and SmartSpeed are mutually exclusive. LPLU is used ++ * during Dx states where the power conservation is most ++ * important. During driver activity we should enable ++ * SmartSpeed, so performance is maintained. ++ */ ++ if (phy->smart_speed == e1000_smart_speed_on) { ++ ret_val = e1e_rphy(hw, ++ IGP01E1000_PHY_PORT_CONFIG, ++ &data); ++ if (ret_val) ++ goto out; ++ ++ data |= IGP01E1000_PSCFR_SMART_SPEED; ++ ret_val = e1e_wphy(hw, ++ IGP01E1000_PHY_PORT_CONFIG, ++ data); ++ if (ret_val) ++ goto out; ++ } else if (phy->smart_speed == e1000_smart_speed_off) { ++ ret_val = e1e_rphy(hw, ++ IGP01E1000_PHY_PORT_CONFIG, ++ &data); ++ if (ret_val) ++ goto out; ++ ++ data &= ~IGP01E1000_PSCFR_SMART_SPEED; ++ ret_val = e1e_wphy(hw, ++ IGP01E1000_PHY_PORT_CONFIG, ++ data); ++ if (ret_val) ++ goto out; ++ } ++ } else if ((phy->autoneg_advertised == E1000_ALL_SPEED_DUPLEX) || ++ (phy->autoneg_advertised == E1000_ALL_NOT_GIG) || ++ (phy->autoneg_advertised == E1000_ALL_10_SPEED)) { ++ data |= IGP02E1000_PM_D3_LPLU; ++ ret_val = e1e_wphy(hw, IGP02E1000_PHY_POWER_MGMT, ++ data); ++ if (ret_val) ++ goto out; ++ ++ /* When LPLU is enabled, we should disable SmartSpeed */ ++ ret_val = e1e_rphy(hw, IGP01E1000_PHY_PORT_CONFIG, ++ &data); ++ if (ret_val) ++ goto out; ++ ++ data &= ~IGP01E1000_PSCFR_SMART_SPEED; ++ ret_val = e1e_wphy(hw, IGP01E1000_PHY_PORT_CONFIG, ++ data); ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000e_check_downshift - Checks whether a downshift in speed occurred ++ * @hw: pointer to the HW structure ++ * ++ * Success returns 0, Failure returns 1 ++ * ++ * A downshift is detected by querying the PHY link health. ++ **/ ++s32 e1000e_check_downshift(struct e1000_hw *hw) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ s32 ret_val; ++ u16 phy_data, offset, mask; ++ ++ switch (phy->type) { ++ case e1000_phy_m88: ++ case e1000_phy_gg82563: ++ case e1000_phy_bm: ++ offset = M88E1000_PHY_SPEC_STATUS; ++ mask = M88E1000_PSSR_DOWNSHIFT; ++ break; ++ case e1000_phy_igp_2: ++ case e1000_phy_igp: ++ case e1000_phy_igp_3: ++ offset = IGP01E1000_PHY_LINK_HEALTH; ++ mask = IGP01E1000_PLHR_SS_DOWNGRADE; ++ break; ++ default: ++ /* speed downshift not supported */ ++ phy->speed_downgraded = false; ++ ret_val = E1000_SUCCESS; ++ goto out; ++ } ++ ++ ret_val = e1e_rphy(hw, offset, &phy_data); ++ ++ if (!ret_val) ++ phy->speed_downgraded = (phy_data & mask) ? true : false; ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_check_polarity_m88 - Checks the polarity. ++ * @hw: pointer to the HW structure ++ * ++ * Success returns 0, Failure returns -E1000_ERR_PHY (-2) ++ * ++ * Polarity is determined based on the PHY specific status register. ++ **/ ++s32 e1000_check_polarity_m88(struct e1000_hw *hw) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ s32 ret_val; ++ u16 data; ++ ++ ret_val = e1e_rphy(hw, M88E1000_PHY_SPEC_STATUS, &data); ++ ++ if (!ret_val) ++ phy->cable_polarity = (data & M88E1000_PSSR_REV_POLARITY) ++ ? e1000_rev_polarity_reversed ++ : e1000_rev_polarity_normal; ++ ++ return ret_val; ++} ++ ++/** ++ * e1000_check_polarity_igp - Checks the polarity. ++ * @hw: pointer to the HW structure ++ * ++ * Success returns 0, Failure returns -E1000_ERR_PHY (-2) ++ * ++ * Polarity is determined based on the PHY port status register, and the ++ * current speed (since there is no polarity at 100Mbps). ++ **/ ++s32 e1000_check_polarity_igp(struct e1000_hw *hw) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ s32 ret_val; ++ u16 data, offset, mask; ++ ++ /* ++ * Polarity is determined based on the speed of ++ * our connection. ++ */ ++ ret_val = e1e_rphy(hw, IGP01E1000_PHY_PORT_STATUS, &data); ++ if (ret_val) ++ goto out; ++ ++ if ((data & IGP01E1000_PSSR_SPEED_MASK) == ++ IGP01E1000_PSSR_SPEED_1000MBPS) { ++ offset = IGP01E1000_PHY_PCS_INIT_REG; ++ mask = IGP01E1000_PHY_POLARITY_MASK; ++ } else { ++ /* ++ * This really only applies to 10Mbps since ++ * there is no polarity for 100Mbps (always 0). ++ */ ++ offset = IGP01E1000_PHY_PORT_STATUS; ++ mask = IGP01E1000_PSSR_POLARITY_REVERSED; ++ } ++ ++ ret_val = e1e_rphy(hw, offset, &data); ++ ++ if (!ret_val) ++ phy->cable_polarity = (data & mask) ++ ? e1000_rev_polarity_reversed ++ : e1000_rev_polarity_normal; ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_wait_autoneg - Wait for auto-neg completion ++ * @hw: pointer to the HW structure ++ * ++ * Waits for auto-negotiation to complete or for the auto-negotiation time ++ * limit to expire, which ever happens first. ++ **/ ++s32 e1000_wait_autoneg(struct e1000_hw *hw) ++{ ++ s32 ret_val = E1000_SUCCESS; ++ u16 i, phy_status; ++ ++ if (!(hw->phy.ops.read_reg)) ++ return E1000_SUCCESS; ++ ++ /* Break after autoneg completes or PHY_AUTO_NEG_LIMIT expires. */ ++ for (i = PHY_AUTO_NEG_LIMIT; i > 0; i--) { ++ ret_val = e1e_rphy(hw, PHY_STATUS, &phy_status); ++ if (ret_val) ++ break; ++ ret_val = e1e_rphy(hw, PHY_STATUS, &phy_status); ++ if (ret_val) ++ break; ++ if (phy_status & MII_SR_AUTONEG_COMPLETE) ++ break; ++ msleep(100); ++ } ++ ++ /* ++ * PHY_AUTO_NEG_TIME expiration doesn't guarantee auto-negotiation ++ * has completed. ++ */ ++ return ret_val; ++} ++ ++/** ++ * e1000e_phy_has_link_generic - Polls PHY for link ++ * @hw: pointer to the HW structure ++ * @iterations: number of times to poll for link ++ * @usec_interval: delay between polling attempts ++ * @success: pointer to whether polling was successful or not ++ * ++ * Polls the PHY status register for link, 'iterations' number of times. ++ **/ ++s32 e1000e_phy_has_link_generic(struct e1000_hw *hw, u32 iterations, ++ u32 usec_interval, bool *success) ++{ ++ s32 ret_val = E1000_SUCCESS; ++ u16 i, phy_status; ++ ++ if (!(hw->phy.ops.read_reg)) ++ return E1000_SUCCESS; ++ ++ for (i = 0; i < iterations; i++) { ++ /* ++ * Some PHYs require the PHY_STATUS register to be read ++ * twice due to the link bit being sticky. No harm doing ++ * it across the board. ++ */ ++ ret_val = e1e_rphy(hw, PHY_STATUS, &phy_status); ++ if (ret_val) ++ break; ++ ret_val = e1e_rphy(hw, PHY_STATUS, &phy_status); ++ if (ret_val) ++ break; ++ if (phy_status & MII_SR_LINK_STATUS) ++ break; ++ if (usec_interval >= 1000) ++ mdelay(usec_interval/1000); ++ else ++ udelay(usec_interval); ++ } ++ ++ *success = (i < iterations) ? true : false; ++ ++ return ret_val; ++} ++ ++/** ++ * e1000e_get_cable_length_m88 - Determine cable length for m88 PHY ++ * @hw: pointer to the HW structure ++ * ++ * Reads the PHY specific status register to retrieve the cable length ++ * information. The cable length is determined by averaging the minimum and ++ * maximum values to get the "average" cable length. The m88 PHY has four ++ * possible cable length values, which are: ++ * Register Value Cable Length ++ * 0 < 50 meters ++ * 1 50 - 80 meters ++ * 2 80 - 110 meters ++ * 3 110 - 140 meters ++ * 4 > 140 meters ++ **/ ++s32 e1000e_get_cable_length_m88(struct e1000_hw *hw) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ s32 ret_val; ++ u16 phy_data, index; ++ ++ ret_val = e1e_rphy(hw, M88E1000_PHY_SPEC_STATUS, &phy_data); ++ if (ret_val) ++ goto out; ++ ++ index = (phy_data & M88E1000_PSSR_CABLE_LENGTH) >> ++ M88E1000_PSSR_CABLE_LENGTH_SHIFT; ++ if (index >= M88E1000_CABLE_LENGTH_TABLE_SIZE + 1) { ++ ret_val = E1000_ERR_PHY; ++ goto out; ++ } ++ ++ phy->min_cable_length = e1000_m88_cable_length_table[index]; ++ phy->max_cable_length = e1000_m88_cable_length_table[index+1]; ++ ++ phy->cable_length = (phy->min_cable_length + phy->max_cable_length) / 2; ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000e_get_cable_length_igp_2 - Determine cable length for igp2 PHY ++ * @hw: pointer to the HW structure ++ * ++ * The automatic gain control (agc) normalizes the amplitude of the ++ * received signal, adjusting for the attenuation produced by the ++ * cable. By reading the AGC registers, which represent the ++ * combination of coarse and fine gain value, the value can be put ++ * into a lookup table to obtain the approximate cable length ++ * for each channel. ++ **/ ++s32 e1000e_get_cable_length_igp_2(struct e1000_hw *hw) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ s32 ret_val = E1000_SUCCESS; ++ u16 phy_data, i, agc_value = 0; ++ u16 cur_agc_index, max_agc_index = 0; ++ u16 min_agc_index = IGP02E1000_CABLE_LENGTH_TABLE_SIZE - 1; ++ u16 agc_reg_array[IGP02E1000_PHY_CHANNEL_NUM] = ++ {IGP02E1000_PHY_AGC_A, ++ IGP02E1000_PHY_AGC_B, ++ IGP02E1000_PHY_AGC_C, ++ IGP02E1000_PHY_AGC_D}; ++ ++ /* Read the AGC registers for all channels */ ++ for (i = 0; i < IGP02E1000_PHY_CHANNEL_NUM; i++) { ++ ret_val = e1e_rphy(hw, agc_reg_array[i], &phy_data); ++ if (ret_val) ++ goto out; ++ ++ /* ++ * Getting bits 15:9, which represent the combination of ++ * coarse and fine gain values. The result is a number ++ * that can be put into the lookup table to obtain the ++ * approximate cable length. ++ */ ++ cur_agc_index = (phy_data >> IGP02E1000_AGC_LENGTH_SHIFT) & ++ IGP02E1000_AGC_LENGTH_MASK; ++ ++ /* Array index bound check. */ ++ if ((cur_agc_index >= IGP02E1000_CABLE_LENGTH_TABLE_SIZE) || ++ (cur_agc_index == 0)) { ++ ret_val = -E1000_ERR_PHY; ++ goto out; ++ } ++ ++ /* Remove min & max AGC values from calculation. */ ++ if (e1000_igp_2_cable_length_table[min_agc_index] > ++ e1000_igp_2_cable_length_table[cur_agc_index]) ++ min_agc_index = cur_agc_index; ++ if (e1000_igp_2_cable_length_table[max_agc_index] < ++ e1000_igp_2_cable_length_table[cur_agc_index]) ++ max_agc_index = cur_agc_index; ++ ++ agc_value += e1000_igp_2_cable_length_table[cur_agc_index]; ++ } ++ ++ agc_value -= (e1000_igp_2_cable_length_table[min_agc_index] + ++ e1000_igp_2_cable_length_table[max_agc_index]); ++ agc_value /= (IGP02E1000_PHY_CHANNEL_NUM - 2); ++ ++ /* Calculate cable length with the error range of +/- 10 meters. */ ++ phy->min_cable_length = ((agc_value - IGP02E1000_AGC_RANGE) > 0) ? ++ (agc_value - IGP02E1000_AGC_RANGE) : 0; ++ phy->max_cable_length = agc_value + IGP02E1000_AGC_RANGE; ++ ++ phy->cable_length = (phy->min_cable_length + phy->max_cable_length) / 2; ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000e_get_phy_info_m88 - Retrieve PHY information ++ * @hw: pointer to the HW structure ++ * ++ * Valid for only copper links. Read the PHY status register (sticky read) ++ * to verify that link is up. Read the PHY special control register to ++ * determine the polarity and 10base-T extended distance. Read the PHY ++ * special status register to determine MDI/MDIx and current speed. If ++ * speed is 1000, then determine cable length, local and remote receiver. ++ **/ ++s32 e1000e_get_phy_info_m88(struct e1000_hw *hw) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ s32 ret_val; ++ u16 phy_data; ++ bool link; ++ ++ if (hw->phy.media_type != e1000_media_type_copper) { ++ e_dbg("Phy info is only valid for copper media\n"); ++ ret_val = -E1000_ERR_CONFIG; ++ goto out; ++ } ++ ++ ret_val = e1000e_phy_has_link_generic(hw, 1, 0, &link); ++ if (ret_val) ++ goto out; ++ ++ if (!link) { ++ e_dbg("Phy info is only valid if link is up\n"); ++ ret_val = -E1000_ERR_CONFIG; ++ goto out; ++ } ++ ++ ret_val = e1e_rphy(hw, M88E1000_PHY_SPEC_CTRL, &phy_data); ++ if (ret_val) ++ goto out; ++ ++ phy->polarity_correction = (phy_data & M88E1000_PSCR_POLARITY_REVERSAL) ++ ? true : false; ++ ++ ret_val = e1000_check_polarity_m88(hw); ++ if (ret_val) ++ goto out; ++ ++ ret_val = e1e_rphy(hw, M88E1000_PHY_SPEC_STATUS, &phy_data); ++ if (ret_val) ++ goto out; ++ ++ phy->is_mdix = (phy_data & M88E1000_PSSR_MDIX) ? true : false; ++ ++ if ((phy_data & M88E1000_PSSR_SPEED) == M88E1000_PSSR_1000MBS) { ++ ret_val = e1000_get_cable_length(hw); ++ if (ret_val) ++ goto out; ++ ++ ret_val = e1e_rphy(hw, PHY_1000T_STATUS, &phy_data); ++ if (ret_val) ++ goto out; ++ ++ phy->local_rx = (phy_data & SR_1000T_LOCAL_RX_STATUS) ++ ? e1000_1000t_rx_status_ok ++ : e1000_1000t_rx_status_not_ok; ++ ++ phy->remote_rx = (phy_data & SR_1000T_REMOTE_RX_STATUS) ++ ? e1000_1000t_rx_status_ok ++ : e1000_1000t_rx_status_not_ok; ++ } else { ++ /* Set values to "undefined" */ ++ phy->cable_length = E1000_CABLE_LENGTH_UNDEFINED; ++ phy->local_rx = e1000_1000t_rx_status_undefined; ++ phy->remote_rx = e1000_1000t_rx_status_undefined; ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000e_get_phy_info_igp - Retrieve igp PHY information ++ * @hw: pointer to the HW structure ++ * ++ * Read PHY status to determine if link is up. If link is up, then ++ * set/determine 10base-T extended distance and polarity correction. Read ++ * PHY port status to determine MDI/MDIx and speed. Based on the speed, ++ * determine on the cable length, local and remote receiver. ++ **/ ++s32 e1000e_get_phy_info_igp(struct e1000_hw *hw) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ s32 ret_val; ++ u16 data; ++ bool link; ++ ++ ret_val = e1000e_phy_has_link_generic(hw, 1, 0, &link); ++ if (ret_val) ++ goto out; ++ ++ if (!link) { ++ e_dbg("Phy info is only valid if link is up\n"); ++ ret_val = -E1000_ERR_CONFIG; ++ goto out; ++ } ++ ++ phy->polarity_correction = true; ++ ++ ret_val = e1000_check_polarity_igp(hw); ++ if (ret_val) ++ goto out; ++ ++ ret_val = e1e_rphy(hw, IGP01E1000_PHY_PORT_STATUS, &data); ++ if (ret_val) ++ goto out; ++ ++ phy->is_mdix = (data & IGP01E1000_PSSR_MDIX) ? true : false; ++ ++ if ((data & IGP01E1000_PSSR_SPEED_MASK) == ++ IGP01E1000_PSSR_SPEED_1000MBPS) { ++ ret_val = e1000_get_cable_length(hw); ++ if (ret_val) ++ goto out; ++ ++ ret_val = e1e_rphy(hw, PHY_1000T_STATUS, &data); ++ if (ret_val) ++ goto out; ++ ++ phy->local_rx = (data & SR_1000T_LOCAL_RX_STATUS) ++ ? e1000_1000t_rx_status_ok ++ : e1000_1000t_rx_status_not_ok; ++ ++ phy->remote_rx = (data & SR_1000T_REMOTE_RX_STATUS) ++ ? e1000_1000t_rx_status_ok ++ : e1000_1000t_rx_status_not_ok; ++ } else { ++ phy->cable_length = E1000_CABLE_LENGTH_UNDEFINED; ++ phy->local_rx = e1000_1000t_rx_status_undefined; ++ phy->remote_rx = e1000_1000t_rx_status_undefined; ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000e_phy_sw_reset - PHY software reset ++ * @hw: pointer to the HW structure ++ * ++ * Does a software reset of the PHY by reading the PHY control register and ++ * setting/write the control register reset bit to the PHY. ++ **/ ++s32 e1000e_phy_sw_reset(struct e1000_hw *hw) ++{ ++ s32 ret_val = E1000_SUCCESS; ++ u16 phy_ctrl; ++ ++ if (!(hw->phy.ops.read_reg)) ++ goto out; ++ ++ ret_val = e1e_rphy(hw, PHY_CONTROL, &phy_ctrl); ++ if (ret_val) ++ goto out; ++ ++ phy_ctrl |= MII_CR_RESET; ++ ret_val = e1e_wphy(hw, PHY_CONTROL, phy_ctrl); ++ if (ret_val) ++ goto out; ++ ++ udelay(1); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000e_phy_hw_reset_generic - PHY hardware reset ++ * @hw: pointer to the HW structure ++ * ++ * Verify the reset block is not blocking us from resetting. Acquire ++ * semaphore (if necessary) and read/set/write the device control reset ++ * bit in the PHY. Wait the appropriate delay time for the device to ++ * reset and release the semaphore (if necessary). ++ **/ ++s32 e1000e_phy_hw_reset_generic(struct e1000_hw *hw) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ s32 ret_val = E1000_SUCCESS; ++ u32 ctrl; ++ ++ ret_val = e1000_check_reset_block(hw); ++ if (ret_val) { ++ ret_val = E1000_SUCCESS; ++ goto out; ++ } ++ ++ ret_val = phy->ops.acquire(hw); ++ if (ret_val) ++ goto out; ++ ++ ctrl = er32(CTRL); ++ ew32(CTRL, ctrl | E1000_CTRL_PHY_RST); ++ e1e_flush(); ++ ++ udelay(phy->reset_delay_us); ++ ++ ew32(CTRL, ctrl); ++ e1e_flush(); ++ ++ udelay(150); ++ ++ phy->ops.release(hw); ++ ++ ret_val = phy->ops.get_cfg_done(hw); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000e_get_cfg_done - Generic configuration done ++ * @hw: pointer to the HW structure ++ * ++ * Generic function to wait 10 milli-seconds for configuration to complete ++ * and return success. ++ **/ ++s32 e1000e_get_cfg_done(struct e1000_hw *hw) ++{ ++ mdelay(10); ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_phy_init_script_igp3 - Inits the IGP3 PHY ++ * @hw: pointer to the HW structure ++ * ++ * Initializes a Intel Gigabit PHY3 when an EEPROM is not present. ++ **/ ++s32 e1000_phy_init_script_igp3(struct e1000_hw *hw) ++{ ++ e_dbg("Running IGP 3 PHY init script\n"); ++ ++ /* PHY init IGP 3 */ ++ /* Enable rise/fall, 10-mode work in class-A */ ++ e1e_wphy(hw, 0x2F5B, 0x9018); ++ /* Remove all caps from Replica path filter */ ++ e1e_wphy(hw, 0x2F52, 0x0000); ++ /* Bias trimming for ADC, AFE and Driver (Default) */ ++ e1e_wphy(hw, 0x2FB1, 0x8B24); ++ /* Increase Hybrid poly bias */ ++ e1e_wphy(hw, 0x2FB2, 0xF8F0); ++ /* Add 4% to Tx amplitude in Gig mode */ ++ e1e_wphy(hw, 0x2010, 0x10B0); ++ /* Disable trimming (TTT) */ ++ e1e_wphy(hw, 0x2011, 0x0000); ++ /* Poly DC correction to 94.6% + 2% for all channels */ ++ e1e_wphy(hw, 0x20DD, 0x249A); ++ /* ABS DC correction to 95.9% */ ++ e1e_wphy(hw, 0x20DE, 0x00D3); ++ /* BG temp curve trim */ ++ e1e_wphy(hw, 0x28B4, 0x04CE); ++ /* Increasing ADC OPAMP stage 1 currents to max */ ++ e1e_wphy(hw, 0x2F70, 0x29E4); ++ /* Force 1000 ( required for enabling PHY regs configuration) */ ++ e1e_wphy(hw, 0x0000, 0x0140); ++ /* Set upd_freq to 6 */ ++ e1e_wphy(hw, 0x1F30, 0x1606); ++ /* Disable NPDFE */ ++ e1e_wphy(hw, 0x1F31, 0xB814); ++ /* Disable adaptive fixed FFE (Default) */ ++ e1e_wphy(hw, 0x1F35, 0x002A); ++ /* Enable FFE hysteresis */ ++ e1e_wphy(hw, 0x1F3E, 0x0067); ++ /* Fixed FFE for short cable lengths */ ++ e1e_wphy(hw, 0x1F54, 0x0065); ++ /* Fixed FFE for medium cable lengths */ ++ e1e_wphy(hw, 0x1F55, 0x002A); ++ /* Fixed FFE for long cable lengths */ ++ e1e_wphy(hw, 0x1F56, 0x002A); ++ /* Enable Adaptive Clip Threshold */ ++ e1e_wphy(hw, 0x1F72, 0x3FB0); ++ /* AHT reset limit to 1 */ ++ e1e_wphy(hw, 0x1F76, 0xC0FF); ++ /* Set AHT master delay to 127 msec */ ++ e1e_wphy(hw, 0x1F77, 0x1DEC); ++ /* Set scan bits for AHT */ ++ e1e_wphy(hw, 0x1F78, 0xF9EF); ++ /* Set AHT Preset bits */ ++ e1e_wphy(hw, 0x1F79, 0x0210); ++ /* Change integ_factor of channel A to 3 */ ++ e1e_wphy(hw, 0x1895, 0x0003); ++ /* Change prop_factor of channels BCD to 8 */ ++ e1e_wphy(hw, 0x1796, 0x0008); ++ /* Change cg_icount + enable integbp for channels BCD */ ++ e1e_wphy(hw, 0x1798, 0xD008); ++ /* ++ * Change cg_icount + enable integbp + change prop_factor_master ++ * to 8 for channel A ++ */ ++ e1e_wphy(hw, 0x1898, 0xD918); ++ /* Disable AHT in Slave mode on channel A */ ++ e1e_wphy(hw, 0x187A, 0x0800); ++ /* ++ * Enable LPLU and disable AN to 1000 in non-D0a states, ++ * Enable SPD+B2B ++ */ ++ e1e_wphy(hw, 0x0019, 0x008D); ++ /* Enable restart AN on an1000_dis change */ ++ e1e_wphy(hw, 0x001B, 0x2080); ++ /* Enable wh_fifo read clock in 10/100 modes */ ++ e1e_wphy(hw, 0x0014, 0x0045); ++ /* Restart AN, Speed selection is 1000 */ ++ e1e_wphy(hw, 0x0000, 0x1340); ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000e_get_phy_type_from_id - Get PHY type from id ++ * @phy_id: phy_id read from the phy ++ * ++ * Returns the phy type from the id. ++ **/ ++enum e1000_phy_type e1000e_get_phy_type_from_id(u32 phy_id) ++{ ++ enum e1000_phy_type phy_type = e1000_phy_unknown; ++ ++ switch (phy_id) { ++ case M88E1000_I_PHY_ID: ++ case M88E1000_E_PHY_ID: ++ case M88E1111_I_PHY_ID: ++ case M88E1011_I_PHY_ID: ++ phy_type = e1000_phy_m88; ++ break; ++ case IGP01E1000_I_PHY_ID: /* IGP 1 & 2 share this */ ++ phy_type = e1000_phy_igp_2; ++ break; ++ case GG82563_E_PHY_ID: ++ phy_type = e1000_phy_gg82563; ++ break; ++ case IGP03E1000_E_PHY_ID: ++ phy_type = e1000_phy_igp_3; ++ break; ++ case IFE_E_PHY_ID: ++ case IFE_PLUS_E_PHY_ID: ++ case IFE_C_E_PHY_ID: ++ phy_type = e1000_phy_ife; ++ break; ++ case BME1000_E_PHY_ID: ++ case BME1000_E_PHY_ID_R2: ++ phy_type = e1000_phy_bm; ++ break; ++ default: ++ phy_type = e1000_phy_unknown; ++ break; ++ } ++ return phy_type; ++} ++ ++/** ++ * e1000e_determine_phy_address - Determines PHY address. ++ * @hw: pointer to the HW structure ++ * ++ * This uses a trial and error method to loop through possible PHY ++ * addresses. It tests each by reading the PHY ID registers and ++ * checking for a match. ++ **/ ++s32 e1000e_determine_phy_address(struct e1000_hw *hw) ++{ ++ s32 ret_val = -E1000_ERR_PHY_TYPE; ++ u32 phy_addr = 0; ++ u32 i; ++ enum e1000_phy_type phy_type = e1000_phy_unknown; ++ ++ hw->phy.id = phy_type; ++ ++ for (phy_addr = 0; phy_addr < E1000_MAX_PHY_ADDR; phy_addr++) { ++ hw->phy.addr = phy_addr; ++ i = 0; ++ ++ do { ++ e1000e_get_phy_id(hw); ++ phy_type = e1000e_get_phy_type_from_id(hw->phy.id); ++ ++ /* ++ * If phy_type is valid, break - we found our ++ * PHY address ++ */ ++ if (phy_type != e1000_phy_unknown) { ++ ret_val = E1000_SUCCESS; ++ goto out; ++ } ++ msleep(1); ++ i++; ++ } while (i < 10); ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_get_phy_addr_for_bm_page - Retrieve PHY page address ++ * @page: page to access ++ * ++ * Returns the phy address for the page requested. ++ **/ ++static u32 e1000_get_phy_addr_for_bm_page(u32 page, u32 reg) ++{ ++ u32 phy_addr = 2; ++ ++ if ((page >= 768) || (page == 0 && reg == 25) || (reg == 31)) ++ phy_addr = 1; ++ ++ return phy_addr; ++} ++ ++/** ++ * e1000e_write_phy_reg_bm - Write BM PHY register ++ * @hw: pointer to the HW structure ++ * @offset: register offset to write to ++ * @data: data to write at register offset ++ * ++ * Acquires semaphore, if necessary, then writes the data to PHY register ++ * at the offset. Release any acquired semaphores before exiting. ++ **/ ++s32 e1000e_write_phy_reg_bm(struct e1000_hw *hw, u32 offset, u16 data) ++{ ++ s32 ret_val; ++ u32 page_select = 0; ++ u32 page = offset >> IGP_PAGE_SHIFT; ++ u32 page_shift = 0; ++ ++ /* Page 800 works differently than the rest so it has its own func */ ++ if (page == BM_WUC_PAGE) { ++ ret_val = e1000_access_phy_wakeup_reg_bm(hw, offset, &data, ++ false); ++ goto out; ++ } ++ ++ ret_val = hw->phy.ops.acquire(hw); ++ if (ret_val) ++ goto out; ++ ++ hw->phy.addr = e1000_get_phy_addr_for_bm_page(page, offset); ++ ++ if (offset > MAX_PHY_MULTI_PAGE_REG) { ++ /* ++ * Page select is register 31 for phy address 1 and 22 for ++ * phy address 2 and 3. Page select is shifted only for ++ * phy address 1. ++ */ ++ if (hw->phy.addr == 1) { ++ page_shift = IGP_PAGE_SHIFT; ++ page_select = IGP01E1000_PHY_PAGE_SELECT; ++ } else { ++ page_shift = 0; ++ page_select = BM_PHY_PAGE_SELECT; ++ } ++ ++ /* Page is shifted left, PHY expects (page x 32) */ ++ ret_val = e1000e_write_phy_reg_mdic(hw, page_select, ++ (page << page_shift)); ++ if (ret_val) { ++ hw->phy.ops.release(hw); ++ goto out; ++ } ++ } ++ ++ ret_val = e1000e_write_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset, ++ data); ++ ++ hw->phy.ops.release(hw); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000e_read_phy_reg_bm - Read BM PHY register ++ * @hw: pointer to the HW structure ++ * @offset: register offset to be read ++ * @data: pointer to the read data ++ * ++ * Acquires semaphore, if necessary, then reads the PHY register at offset ++ * and storing the retrieved information in data. Release any acquired ++ * semaphores before exiting. ++ **/ ++s32 e1000e_read_phy_reg_bm(struct e1000_hw *hw, u32 offset, u16 *data) ++{ ++ s32 ret_val; ++ u32 page_select = 0; ++ u32 page = offset >> IGP_PAGE_SHIFT; ++ u32 page_shift = 0; ++ ++ /* Page 800 works differently than the rest so it has its own func */ ++ if (page == BM_WUC_PAGE) { ++ ret_val = e1000_access_phy_wakeup_reg_bm(hw, offset, data, ++ true); ++ goto out; ++ } ++ ++ ret_val = hw->phy.ops.acquire(hw); ++ if (ret_val) ++ goto out; ++ ++ hw->phy.addr = e1000_get_phy_addr_for_bm_page(page, offset); ++ ++ if (offset > MAX_PHY_MULTI_PAGE_REG) { ++ /* ++ * Page select is register 31 for phy address 1 and 22 for ++ * phy address 2 and 3. Page select is shifted only for ++ * phy address 1. ++ */ ++ if (hw->phy.addr == 1) { ++ page_shift = IGP_PAGE_SHIFT; ++ page_select = IGP01E1000_PHY_PAGE_SELECT; ++ } else { ++ page_shift = 0; ++ page_select = BM_PHY_PAGE_SELECT; ++ } ++ ++ /* Page is shifted left, PHY expects (page x 32) */ ++ ret_val = e1000e_write_phy_reg_mdic(hw, page_select, ++ (page << page_shift)); ++ if (ret_val) { ++ hw->phy.ops.release(hw); ++ goto out; ++ } ++ } ++ ++ ret_val = e1000e_read_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset, ++ data); ++ hw->phy.ops.release(hw); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000e_read_phy_reg_bm2 - Read BM PHY register ++ * @hw: pointer to the HW structure ++ * @offset: register offset to be read ++ * @data: pointer to the read data ++ * ++ * Acquires semaphore, if necessary, then reads the PHY register at offset ++ * and storing the retrieved information in data. Release any acquired ++ * semaphores before exiting. ++ **/ ++s32 e1000e_read_phy_reg_bm2(struct e1000_hw *hw, u32 offset, u16 *data) ++{ ++ s32 ret_val; ++ u16 page = (u16)(offset >> IGP_PAGE_SHIFT); ++ ++ /* Page 800 works differently than the rest so it has its own func */ ++ if (page == BM_WUC_PAGE) { ++ ret_val = e1000_access_phy_wakeup_reg_bm(hw, offset, data, ++ true); ++ goto out; ++ } ++ ++ ret_val = hw->phy.ops.acquire(hw); ++ if (ret_val) ++ goto out; ++ ++ hw->phy.addr = 1; ++ ++ if (offset > MAX_PHY_MULTI_PAGE_REG) { ++ ++ /* Page is shifted left, PHY expects (page x 32) */ ++ ret_val = e1000e_write_phy_reg_mdic(hw, BM_PHY_PAGE_SELECT, ++ page); ++ ++ if (ret_val) { ++ hw->phy.ops.release(hw); ++ goto out; ++ } ++ } ++ ++ ret_val = e1000e_read_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset, ++ data); ++ hw->phy.ops.release(hw); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000e_write_phy_reg_bm2 - Write BM PHY register ++ * @hw: pointer to the HW structure ++ * @offset: register offset to write to ++ * @data: data to write at register offset ++ * ++ * Acquires semaphore, if necessary, then writes the data to PHY register ++ * at the offset. Release any acquired semaphores before exiting. ++ **/ ++s32 e1000e_write_phy_reg_bm2(struct e1000_hw *hw, u32 offset, u16 data) ++{ ++ s32 ret_val; ++ u16 page = (u16)(offset >> IGP_PAGE_SHIFT); ++ ++ /* Page 800 works differently than the rest so it has its own func */ ++ if (page == BM_WUC_PAGE) { ++ ret_val = e1000_access_phy_wakeup_reg_bm(hw, offset, &data, ++ false); ++ goto out; ++ } ++ ++ ret_val = hw->phy.ops.acquire(hw); ++ if (ret_val) ++ goto out; ++ ++ hw->phy.addr = 1; ++ ++ if (offset > MAX_PHY_MULTI_PAGE_REG) { ++ /* Page is shifted left, PHY expects (page x 32) */ ++ ret_val = e1000e_write_phy_reg_mdic(hw, BM_PHY_PAGE_SELECT, ++ page); ++ ++ if (ret_val) { ++ hw->phy.ops.release(hw); ++ goto out; ++ } ++ } ++ ++ ret_val = e1000e_write_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset, ++ data); ++ ++ hw->phy.ops.release(hw); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_access_phy_wakeup_reg_bm - Read BM PHY wakeup register ++ * @hw: pointer to the HW structure ++ * @offset: register offset to be read or written ++ * @data: pointer to the data to read or write ++ * @read: determines if operation is read or write ++ * ++ * Acquires semaphore, if necessary, then reads the PHY register at offset ++ * and storing the retrieved information in data. Release any acquired ++ * semaphores before exiting. Note that procedure to read the wakeup ++ * registers are different. It works as such: ++ * 1) Set page 769, register 17, bit 2 = 1 ++ * 2) Set page to 800 for host (801 if we were manageability) ++ * 3) Write the address using the address opcode (0x11) ++ * 4) Read or write the data using the data opcode (0x12) ++ * 5) Restore 769_17.2 to its original value ++ **/ ++static s32 e1000_access_phy_wakeup_reg_bm(struct e1000_hw *hw, u32 offset, ++ u16 *data, bool read) ++{ ++ s32 ret_val; ++ u16 reg = BM_PHY_REG_NUM(offset); ++ u16 phy_reg = 0; ++ u8 phy_acquired = 1; ++ ++ ret_val = hw->phy.ops.acquire(hw); ++ if (ret_val) { ++ e_dbg("Could not acquire PHY\n"); ++ phy_acquired = 0; ++ goto out; ++ } ++ ++ /* All operations in this function are phy address 1 */ ++ hw->phy.addr = 1; ++ ++ /* Set page 769 */ ++ e1000e_write_phy_reg_mdic(hw, IGP01E1000_PHY_PAGE_SELECT, ++ (BM_WUC_ENABLE_PAGE << IGP_PAGE_SHIFT)); ++ ++ ret_val = e1000e_read_phy_reg_mdic(hw, BM_WUC_ENABLE_REG, &phy_reg); ++ if (ret_val) { ++ e_dbg("Could not read PHY page 769\n"); ++ goto out; ++ } ++ ++ /* First clear bit 4 to avoid a power state change */ ++ phy_reg &= ~(BM_WUC_HOST_WU_BIT); ++ ret_val = e1000e_write_phy_reg_mdic(hw, BM_WUC_ENABLE_REG, phy_reg); ++ if (ret_val) { ++ e_dbg("Could not clear PHY page 769 bit 4\n"); ++ goto out; ++ } ++ ++ /* Write bit 2 = 1, and clear bit 4 to 769_17 */ ++ ret_val = e1000e_write_phy_reg_mdic(hw, BM_WUC_ENABLE_REG, ++ phy_reg | BM_WUC_ENABLE_BIT); ++ if (ret_val) { ++ e_dbg("Could not write PHY page 769 bit 2\n"); ++ goto out; ++ } ++ ++ /* Select page 800 */ ++ ret_val = e1000e_write_phy_reg_mdic(hw, ++ IGP01E1000_PHY_PAGE_SELECT, ++ (BM_WUC_PAGE << IGP_PAGE_SHIFT)); ++ ++ /* Write the page 800 offset value using opcode 0x11 */ ++ ret_val = e1000e_write_phy_reg_mdic(hw, BM_WUC_ADDRESS_OPCODE, reg); ++ if (ret_val) { ++ e_dbg("Could not write address opcode to page 800\n"); ++ goto out; ++ } ++ ++ if (read) { ++ /* Read the page 800 value using opcode 0x12 */ ++ ret_val = e1000e_read_phy_reg_mdic(hw, BM_WUC_DATA_OPCODE, ++ data); ++ } else { ++ /* Write the page 800 value using opcode 0x12 */ ++ ret_val = e1000e_write_phy_reg_mdic(hw, BM_WUC_DATA_OPCODE, ++ *data); ++ } ++ ++ if (ret_val) { ++ e_dbg("Could not access data value from page 800\n"); ++ goto out; ++ } ++ ++ /* ++ * Restore 769_17.2 to its original value ++ * Set page 769 ++ */ ++ e1000e_write_phy_reg_mdic(hw, IGP01E1000_PHY_PAGE_SELECT, ++ (BM_WUC_ENABLE_PAGE << IGP_PAGE_SHIFT)); ++ ++ /* Clear 769_17.2 */ ++ ret_val = e1000e_write_phy_reg_mdic(hw, BM_WUC_ENABLE_REG, phy_reg); ++ if (ret_val) { ++ e_dbg("Could not clear PHY page 769 bit 2\n"); ++ goto out; ++ } ++ ++out: ++ if (phy_acquired == 1) ++ hw->phy.ops.release(hw); ++ return ret_val; ++} ++ ++/** ++ * e1000_power_up_phy_copper - Restore copper link in case of PHY power down ++ * @hw: pointer to the HW structure ++ * ++ * In the case of a PHY power down to save power, or to turn off link during a ++ * driver unload, or wake on lan is not enabled, restore the link to previous ++ * settings. ++ **/ ++void e1000_power_up_phy_copper(struct e1000_hw *hw) ++{ ++ u16 mii_reg = 0; ++ ++ /* The PHY will retain its settings across a power down/up cycle */ ++ e1e_rphy(hw, PHY_CONTROL, &mii_reg); ++ mii_reg &= ~MII_CR_POWER_DOWN; ++ e1e_wphy(hw, PHY_CONTROL, mii_reg); ++} ++ ++/** ++ * e1000_power_down_phy_copper - Restore copper link in case of PHY power down ++ * @hw: pointer to the HW structure ++ * ++ * In the case of a PHY power down to save power, or to turn off link during a ++ * driver unload, or wake on lan is not enabled, restore the link to previous ++ * settings. ++ **/ ++void e1000_power_down_phy_copper(struct e1000_hw *hw) ++{ ++ u16 mii_reg = 0; ++ ++ /* The PHY will retain its settings across a power down/up cycle */ ++ e1e_rphy(hw, PHY_CONTROL, &mii_reg); ++ mii_reg |= MII_CR_POWER_DOWN; ++ e1e_wphy(hw, PHY_CONTROL, mii_reg); ++ msleep(1); ++} +diff -r bd70f2f305c6 drivers/net/e1000e/e1000_phy.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/e1000e/e1000_phy.h Mon Jun 15 11:45:35 2009 +0100 +@@ -0,0 +1,188 @@ ++/******************************************************************************* ++ ++ Intel PRO/1000 Linux driver ++ Copyright(c) 1999 - 2009 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ Linux NICS ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++#ifndef _E1000_PHY_H_ ++#define _E1000_PHY_H_ ++ ++void e1000_init_phy_ops_generic(struct e1000_hw *hw); ++s32 e1000e_check_downshift(struct e1000_hw *hw); ++s32 e1000_check_polarity_m88(struct e1000_hw *hw); ++s32 e1000_check_polarity_igp(struct e1000_hw *hw); ++s32 e1000e_check_reset_block_generic(struct e1000_hw *hw); ++s32 e1000e_copper_link_setup_igp(struct e1000_hw *hw); ++s32 e1000e_copper_link_setup_m88(struct e1000_hw *hw); ++s32 e1000e_phy_force_speed_duplex_igp(struct e1000_hw *hw); ++s32 e1000e_phy_force_speed_duplex_m88(struct e1000_hw *hw); ++s32 e1000e_get_cable_length_m88(struct e1000_hw *hw); ++s32 e1000e_get_cable_length_igp_2(struct e1000_hw *hw); ++s32 e1000e_get_cfg_done(struct e1000_hw *hw); ++s32 e1000e_get_phy_id(struct e1000_hw *hw); ++s32 e1000e_get_phy_info_igp(struct e1000_hw *hw); ++s32 e1000e_get_phy_info_m88(struct e1000_hw *hw); ++s32 e1000e_phy_sw_reset(struct e1000_hw *hw); ++void e1000e_phy_force_speed_duplex_setup(struct e1000_hw *hw, u16 *phy_ctrl); ++s32 e1000e_phy_hw_reset_generic(struct e1000_hw *hw); ++s32 e1000e_phy_reset_dsp(struct e1000_hw *hw); ++s32 e1000e_read_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 *data); ++s32 e1000e_read_phy_reg_igp(struct e1000_hw *hw, u32 offset, u16 *data); ++s32 e1000e_read_phy_reg_m88(struct e1000_hw *hw, u32 offset, u16 *data); ++s32 e1000e_set_d3_lplu_state(struct e1000_hw *hw, bool active); ++s32 e1000e_setup_copper_link(struct e1000_hw *hw); ++s32 e1000_wait_autoneg(struct e1000_hw *hw); ++s32 e1000e_write_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 data); ++s32 e1000e_write_phy_reg_igp(struct e1000_hw *hw, u32 offset, u16 data); ++s32 e1000e_write_phy_reg_m88(struct e1000_hw *hw, u32 offset, u16 data); ++s32 e1000_phy_reset_dsp(struct e1000_hw *hw); ++s32 e1000e_phy_has_link_generic(struct e1000_hw *hw, u32 iterations, ++ u32 usec_interval, bool *success); ++s32 e1000_phy_init_script_igp3(struct e1000_hw *hw); ++enum e1000_phy_type e1000e_get_phy_type_from_id(u32 phy_id); ++s32 e1000e_determine_phy_address(struct e1000_hw *hw); ++s32 e1000e_write_phy_reg_bm(struct e1000_hw *hw, u32 offset, u16 data); ++s32 e1000e_read_phy_reg_bm(struct e1000_hw *hw, u32 offset, u16 *data); ++s32 e1000e_read_phy_reg_bm2(struct e1000_hw *hw, u32 offset, u16 *data); ++s32 e1000e_write_phy_reg_bm2(struct e1000_hw *hw, u32 offset, u16 data); ++void e1000_power_up_phy_copper(struct e1000_hw *hw); ++void e1000_power_down_phy_copper(struct e1000_hw *hw); ++s32 e1000e_read_phy_reg_mdic(struct e1000_hw *hw, u32 offset, u16 *data); ++s32 e1000e_write_phy_reg_mdic(struct e1000_hw *hw, u32 offset, u16 data); ++ ++#define E1000_MAX_PHY_ADDR 4 ++ ++/* IGP01E1000 Specific Registers */ ++#define IGP01E1000_PHY_PORT_CONFIG 0x10 /* Port Config */ ++#define IGP01E1000_PHY_PORT_STATUS 0x11 /* Status */ ++#define IGP01E1000_PHY_PORT_CTRL 0x12 /* Control */ ++#define IGP01E1000_PHY_LINK_HEALTH 0x13 /* PHY Link Health */ ++#define IGP01E1000_GMII_FIFO 0x14 /* GMII FIFO */ ++#define IGP01E1000_PHY_CHANNEL_QUALITY 0x15 /* PHY Channel Quality */ ++#define IGP02E1000_PHY_POWER_MGMT 0x19 /* Power Management */ ++#define IGP01E1000_PHY_PAGE_SELECT 0x1F /* Page Select */ ++#define BM_PHY_PAGE_SELECT 22 /* Page Select for BM */ ++#define IGP_PAGE_SHIFT 5 ++#define PHY_REG_MASK 0x1F ++ ++/* BM/HV Specific Registers */ ++#define BM_PORT_CTRL_PAGE 769 ++#define BM_PCIE_PAGE 770 ++#define BM_WUC_PAGE 800 ++#define BM_WUC_ADDRESS_OPCODE 0x11 ++#define BM_WUC_DATA_OPCODE 0x12 ++#define BM_WUC_ENABLE_PAGE BM_PORT_CTRL_PAGE ++#define BM_WUC_ENABLE_REG 17 ++#define BM_WUC_ENABLE_BIT (1 << 2) ++#define BM_WUC_HOST_WU_BIT (1 << 4) ++ ++#define PHY_UPPER_SHIFT 21 ++#define BM_PHY_REG(page, reg) \ ++ (((reg) & MAX_PHY_REG_ADDRESS) |\ ++ (((page) & 0xFFFF) << PHY_PAGE_SHIFT) |\ ++ (((reg) & ~MAX_PHY_REG_ADDRESS) << (PHY_UPPER_SHIFT - PHY_PAGE_SHIFT))) ++#define BM_PHY_REG_PAGE(offset) \ ++ ((u16)(((offset) >> PHY_PAGE_SHIFT) & 0xFFFF)) ++#define BM_PHY_REG_NUM(offset) \ ++ ((u16)(((offset) & MAX_PHY_REG_ADDRESS) |\ ++ (((offset) >> (PHY_UPPER_SHIFT - PHY_PAGE_SHIFT)) &\ ++ ~MAX_PHY_REG_ADDRESS))) ++ ++/* BM PHY Copper Specific Control 1 */ ++#define BM_CS_CTRL1 16 ++#define BM_CS_CTRL1_ENERGY_DETECT 0x0300 /* Enable Energy Detect */ ++ ++/* BM PHY Copper Specific States */ ++#define BM_CS_STATUS 17 ++#define BM_CS_STATUS_ENERGY_DETECT 0x0010 /* Energy Detect Status */ ++ ++#define IGP01E1000_PHY_PCS_INIT_REG 0x00B4 ++#define IGP01E1000_PHY_POLARITY_MASK 0x0078 ++ ++#define IGP01E1000_PSCR_AUTO_MDIX 0x1000 ++#define IGP01E1000_PSCR_FORCE_MDI_MDIX 0x2000 /* 0=MDI, 1=MDIX */ ++ ++#define IGP01E1000_PSCFR_SMART_SPEED 0x0080 ++ ++/* Enable flexible speed on link-up */ ++#define IGP01E1000_GMII_FLEX_SPD 0x0010 ++#define IGP01E1000_GMII_SPD 0x0020 /* Enable SPD */ ++ ++#define IGP02E1000_PM_SPD 0x0001 /* Smart Power Down */ ++#define IGP02E1000_PM_D0_LPLU 0x0002 /* For D0a states */ ++#define IGP02E1000_PM_D3_LPLU 0x0004 /* For all other states */ ++ ++#define IGP01E1000_PLHR_SS_DOWNGRADE 0x8000 ++ ++#define IGP01E1000_PSSR_POLARITY_REVERSED 0x0002 ++#define IGP01E1000_PSSR_MDIX 0x0008 ++#define IGP01E1000_PSSR_SPEED_MASK 0xC000 ++#define IGP01E1000_PSSR_SPEED_1000MBPS 0xC000 ++ ++#define IGP02E1000_PHY_CHANNEL_NUM 4 ++#define IGP02E1000_PHY_AGC_A 0x11B1 ++#define IGP02E1000_PHY_AGC_B 0x12B1 ++#define IGP02E1000_PHY_AGC_C 0x14B1 ++#define IGP02E1000_PHY_AGC_D 0x18B1 ++ ++#define IGP02E1000_AGC_LENGTH_SHIFT 9 /* Course - 15:13, Fine - 12:9 */ ++#define IGP02E1000_AGC_LENGTH_MASK 0x7F ++#define IGP02E1000_AGC_RANGE 15 ++ ++#define IGP03E1000_PHY_MISC_CTRL 0x1B ++#define IGP03E1000_PHY_MISC_DUPLEX_MANUAL_SET 0x1000 /* Manually Set Duplex */ ++ ++#define E1000_CABLE_LENGTH_UNDEFINED 0xFF ++ ++#define E1000_KMRNCTRLSTA_OFFSET 0x001F0000 ++#define E1000_KMRNCTRLSTA_OFFSET_SHIFT 16 ++#define E1000_KMRNCTRLSTA_REN 0x00200000 ++#define E1000_KMRNCTRLSTA_DIAG_OFFSET 0x3 /* Kumeran Diagnostic */ ++#define E1000_KMRNCTRLSTA_DIAG_NELPBK 0x1000 /* Nearend Loopback mode */ ++ ++#define IFE_PHY_EXTENDED_STATUS_CONTROL 0x10 ++#define IFE_PHY_SPECIAL_CONTROL 0x11 /* 100BaseTx PHY Special Control */ ++#define IFE_PHY_SPECIAL_CONTROL_LED 0x1B /* PHY Special and LED Control */ ++#define IFE_PHY_MDIX_CONTROL 0x1C /* MDI/MDI-X Control */ ++ ++/* IFE PHY Extended Status Control */ ++#define IFE_PESC_POLARITY_REVERSED 0x0100 ++ ++/* IFE PHY Special Control */ ++#define IFE_PSC_AUTO_POLARITY_DISABLE 0x0010 ++#define IFE_PSC_FORCE_POLARITY 0x0020 ++#define IFE_PSC_DISABLE_DYNAMIC_POWER_DOWN 0x0100 ++ ++/* IFE PHY Special Control and LED Control */ ++#define IFE_PSCL_PROBE_MODE 0x0020 ++#define IFE_PSCL_PROBE_LEDS_OFF 0x0006 /* Force LEDs 0 and 2 off */ ++#define IFE_PSCL_PROBE_LEDS_ON 0x0007 /* Force LEDs 0 and 2 on */ ++ ++/* IFE PHY MDIX Control */ ++#define IFE_PMC_MDIX_STATUS 0x0020 /* 1=MDI-X, 0=MDI */ ++#define IFE_PMC_FORCE_MDIX 0x0040 /* 1=force MDI-X, 0=force MDI */ ++#define IFE_PMC_AUTO_MDIX 0x0080 /* 1=enable auto MDI/MDI-X, 0=disable */ ++ ++#endif +diff -r bd70f2f305c6 drivers/net/e1000e/e1000_regs.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/e1000e/e1000_regs.h Mon Jun 15 11:45:35 2009 +0100 +@@ -0,0 +1,329 @@ ++/******************************************************************************* ++ ++ Intel PRO/1000 Linux driver ++ Copyright(c) 1999 - 2009 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ Linux NICS ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++#ifndef _E1000_REGS_H_ ++#define _E1000_REGS_H_ ++ ++#define E1000_CTRL 0x00000 /* Device Control - RW */ ++#define E1000_CTRL_DUP 0x00004 /* Device Control Duplicate (Shadow) - RW */ ++#define E1000_STATUS 0x00008 /* Device Status - RO */ ++#define E1000_EECD 0x00010 /* EEPROM/Flash Control - RW */ ++#define E1000_EERD 0x00014 /* EEPROM Read - RW */ ++#define E1000_CTRL_EXT 0x00018 /* Extended Device Control - RW */ ++#define E1000_FLA 0x0001C /* Flash Access - RW */ ++#define E1000_MDIC 0x00020 /* MDI Control - RW */ ++#define E1000_SCTL 0x00024 /* SerDes Control - RW */ ++#define E1000_FCAL 0x00028 /* Flow Control Address Low - RW */ ++#define E1000_FCAH 0x0002C /* Flow Control Address High -RW */ ++#define E1000_FEXT 0x0002C /* Future Extended - RW */ ++#define E1000_FEXTNVM 0x00028 /* Future Extended NVM - RW */ ++#define E1000_FCT 0x00030 /* Flow Control Type - RW */ ++#define E1000_CONNSW 0x00034 /* Copper/Fiber switch control - RW */ ++#define E1000_VET 0x00038 /* VLAN Ether Type - RW */ ++#define E1000_ICR 0x000C0 /* Interrupt Cause Read - R/clr */ ++#define E1000_ITR 0x000C4 /* Interrupt Throttling Rate - RW */ ++#define E1000_ICS 0x000C8 /* Interrupt Cause Set - WO */ ++#define E1000_IMS 0x000D0 /* Interrupt Mask Set - RW */ ++#define E1000_IMC 0x000D8 /* Interrupt Mask Clear - WO */ ++#define E1000_IAM 0x000E0 /* Interrupt Acknowledge Auto Mask */ ++#define E1000_IVAR 0x000E4 /* Interrupt Vector Allocation Register - RW */ ++#define E1000_RCTL 0x00100 /* Rx Control - RW */ ++#define E1000_FCTTV 0x00170 /* Flow Control Transmit Timer Value - RW */ ++#define E1000_TXCW 0x00178 /* Tx Configuration Word - RW */ ++#define E1000_RXCW 0x00180 /* Rx Configuration Word - RO */ ++#define E1000_PBA_ECC 0x01100 /* PBA ECC Register */ ++#define E1000_TCTL 0x00400 /* Tx Control - RW */ ++#define E1000_TCTL_EXT 0x00404 /* Extended Tx Control - RW */ ++#define E1000_TIPG 0x00410 /* Tx Inter-packet gap -RW */ ++#define E1000_TBT 0x00448 /* Tx Burst Timer - RW */ ++#define E1000_AIT 0x00458 /* Adaptive Interframe Spacing Throttle - RW */ ++#define E1000_LEDCTL 0x00E00 /* LED Control - RW */ ++#define E1000_EXTCNF_CTRL 0x00F00 /* Extended Configuration Control */ ++#define E1000_EXTCNF_SIZE 0x00F08 /* Extended Configuration Size */ ++#define E1000_PHY_CTRL 0x00F10 /* PHY Control Register in CSR */ ++#define E1000_PBA 0x01000 /* Packet Buffer Allocation - RW */ ++#define E1000_PBS 0x01008 /* Packet Buffer Size */ ++#define E1000_EEMNGCTL 0x01010 /* MNG EEprom Control */ ++#define E1000_EEARBC 0x01024 /* EEPROM Auto Read Bus Control */ ++#define E1000_FLASHT 0x01028 /* FLASH Timer Register */ ++#define E1000_EEWR 0x0102C /* EEPROM Write Register - RW */ ++#define E1000_FLSWCTL 0x01030 /* FLASH control register */ ++#define E1000_FLSWDATA 0x01034 /* FLASH data register */ ++#define E1000_FLSWCNT 0x01038 /* FLASH Access Counter */ ++#define E1000_FLOP 0x0103C /* FLASH Opcode Register */ ++#define E1000_I2CCMD 0x01028 /* SFPI2C Command Register - RW */ ++#define E1000_I2CPARAMS 0x0102C /* SFPI2C Parameters Register - RW */ ++#define E1000_WDSTP 0x01040 /* Watchdog Setup - RW */ ++#define E1000_SWDSTS 0x01044 /* SW Device Status - RW */ ++#define E1000_FRTIMER 0x01048 /* Free Running Timer - RW */ ++#define E1000_ERT 0x02008 /* Early Rx Threshold - RW */ ++#define E1000_FCRTL 0x02160 /* Flow Control Receive Threshold Low - RW */ ++#define E1000_FCRTH 0x02168 /* Flow Control Receive Threshold High - RW */ ++#define E1000_PSRCTL 0x02170 /* Packet Split Receive Control - RW */ ++#define E1000_RDFPCQ(_n) (0x02430 + (0x4 * (_n))) ++#define E1000_PBRTH 0x02458 /* PB Rx Arbitration Threshold - RW */ ++#define E1000_FCRTV 0x02460 /* Flow Control Refresh Timer Value - RW */ ++/* Split and Replication Rx Control - RW */ ++#define E1000_RDPUMB 0x025CC /* DMA Rx Descriptor uC Mailbox - RW */ ++#define E1000_RDPUAD 0x025D0 /* DMA Rx Descriptor uC Addr Command - RW */ ++#define E1000_RDPUWD 0x025D4 /* DMA Rx Descriptor uC Data Write - RW */ ++#define E1000_RDPURD 0x025D8 /* DMA Rx Descriptor uC Data Read - RW */ ++#define E1000_RDPUCTL 0x025DC /* DMA Rx Descriptor uC Control - RW */ ++#define E1000_RXCTL(_n) (0x0C014 + (0x40 * (_n))) ++#define E1000_RQDPC(_n) (0x0C030 + (0x40 * (_n))) ++#define E1000_RDTR 0x02820 /* Rx Delay Timer - RW */ ++#define E1000_RADV 0x0282C /* Rx Interrupt Absolute Delay Timer - RW */ ++/* ++ * Convenience macros ++ * ++ * Note: "_n" is the queue number of the register to be written to. ++ * ++ * Example usage: ++ * E1000_RDBAL_REG(current_rx_queue) ++ */ ++#define E1000_RDBAL(_n) ((_n) < 4 ? (0x02800 + ((_n) * 0x100)) : \ ++ (0x0C000 + ((_n) * 0x40))) ++#define E1000_RDBAH(_n) ((_n) < 4 ? (0x02804 + ((_n) * 0x100)) : \ ++ (0x0C004 + ((_n) * 0x40))) ++#define E1000_RDLEN(_n) ((_n) < 4 ? (0x02808 + ((_n) * 0x100)) : \ ++ (0x0C008 + ((_n) * 0x40))) ++#define E1000_SRRCTL(_n) ((_n) < 4 ? (0x0280C + ((_n) * 0x100)) : \ ++ (0x0C00C + ((_n) * 0x40))) ++#define E1000_RDH(_n) ((_n) < 4 ? (0x02810 + ((_n) * 0x100)) : \ ++ (0x0C010 + ((_n) * 0x40))) ++#define E1000_RDT(_n) ((_n) < 4 ? (0x02818 + ((_n) * 0x100)) : \ ++ (0x0C018 + ((_n) * 0x40))) ++#define E1000_RXDCTL(_n) ((_n) < 4 ? (0x02828 + ((_n) * 0x100)) : \ ++ (0x0C028 + ((_n) * 0x40))) ++#define E1000_TDBAL(_n) ((_n) < 4 ? (0x03800 + ((_n) * 0x100)) : \ ++ (0x0E000 + ((_n) * 0x40))) ++#define E1000_TDBAH(_n) ((_n) < 4 ? (0x03804 + ((_n) * 0x100)) : \ ++ (0x0E004 + ((_n) * 0x40))) ++#define E1000_TDLEN(_n) ((_n) < 4 ? (0x03808 + ((_n) * 0x100)) : \ ++ (0x0E008 + ((_n) * 0x40))) ++#define E1000_TDH(_n) ((_n) < 4 ? (0x03810 + ((_n) * 0x100)) : \ ++ (0x0E010 + ((_n) * 0x40))) ++#define E1000_TDT(_n) ((_n) < 4 ? (0x03818 + ((_n) * 0x100)) : \ ++ (0x0E018 + ((_n) * 0x40))) ++#define E1000_TXDCTL(_n) ((_n) < 4 ? (0x03828 + ((_n) * 0x100)) : \ ++ (0x0E028 + ((_n) * 0x40))) ++#define E1000_TARC(_n) (0x03840 + (_n << 8)) ++#define E1000_DCA_TXCTRL(_n) (0x03814 + (_n << 8)) ++#define E1000_DCA_RXCTRL(_n) (0x02814 + (_n << 8)) ++#define E1000_TDWBAL(_n) ((_n) < 4 ? (0x03838 + ((_n) * 0x100)) : \ ++ (0x0E038 + ((_n) * 0x40))) ++#define E1000_TDWBAH(_n) ((_n) < 4 ? (0x0383C + ((_n) * 0x100)) : \ ++ (0x0E03C + ((_n) * 0x40))) ++#define E1000_RSRPD 0x02C00 /* Rx Small Packet Detect - RW */ ++#define E1000_RAID 0x02C08 /* Receive Ack Interrupt Delay - RW */ ++#define E1000_TXDMAC 0x03000 /* Tx DMA Control - RW */ ++#define E1000_KABGTXD 0x03004 /* AFE Band Gap Transmit Ref Data */ ++#define E1000_PSRTYPE(_i) (0x05480 + ((_i) * 4)) ++#define E1000_RAL(_i) (((_i) <= 15) ? (0x05400 + ((_i) * 8)) : \ ++ (0x054E0 + ((_i - 16) * 8))) ++#define E1000_RAH(_i) (((_i) <= 15) ? (0x05404 + ((_i) * 8)) : \ ++ (0x054E4 + ((_i - 16) * 8))) ++#define E1000_IP4AT_REG(_i) (0x05840 + ((_i) * 8)) ++#define E1000_IP6AT_REG(_i) (0x05880 + ((_i) * 4)) ++#define E1000_WUPM_REG(_i) (0x05A00 + ((_i) * 4)) ++#define E1000_FFMT_REG(_i) (0x09000 + ((_i) * 8)) ++#define E1000_FFVT_REG(_i) (0x09800 + ((_i) * 8)) ++#define E1000_FFLT_REG(_i) (0x05F00 + ((_i) * 8)) ++#define E1000_TDFH 0x03410 /* Tx Data FIFO Head - RW */ ++#define E1000_TDFT 0x03418 /* Tx Data FIFO Tail - RW */ ++#define E1000_TDFHS 0x03420 /* Tx Data FIFO Head Saved - RW */ ++#define E1000_TDFTS 0x03428 /* Tx Data FIFO Tail Saved - RW */ ++#define E1000_TDFPC 0x03430 /* Tx Data FIFO Packet Count - RW */ ++#define E1000_TDPUMB 0x0357C /* DMA Tx Descriptor uC Mail Box - RW */ ++#define E1000_TDPUAD 0x03580 /* DMA Tx Descriptor uC Addr Command - RW */ ++#define E1000_TDPUWD 0x03584 /* DMA Tx Descriptor uC Data Write - RW */ ++#define E1000_TDPURD 0x03588 /* DMA Tx Descriptor uC Data Read - RW */ ++#define E1000_TDPUCTL 0x0358C /* DMA Tx Descriptor uC Control - RW */ ++#define E1000_DTXCTL 0x03590 /* DMA Tx Control - RW */ ++#define E1000_TIDV 0x03820 /* Tx Interrupt Delay Value - RW */ ++#define E1000_TADV 0x0382C /* Tx Interrupt Absolute Delay Val - RW */ ++#define E1000_TSPMT 0x03830 /* TCP Segmentation PAD & Min Threshold - RW */ ++#define E1000_CRCERRS 0x04000 /* CRC Error Count - R/clr */ ++#define E1000_ALGNERRC 0x04004 /* Alignment Error Count - R/clr */ ++#define E1000_SYMERRS 0x04008 /* Symbol Error Count - R/clr */ ++#define E1000_RXERRC 0x0400C /* Receive Error Count - R/clr */ ++#define E1000_MPC 0x04010 /* Missed Packet Count - R/clr */ ++#define E1000_SCC 0x04014 /* Single Collision Count - R/clr */ ++#define E1000_ECOL 0x04018 /* Excessive Collision Count - R/clr */ ++#define E1000_MCC 0x0401C /* Multiple Collision Count - R/clr */ ++#define E1000_LATECOL 0x04020 /* Late Collision Count - R/clr */ ++#define E1000_COLC 0x04028 /* Collision Count - R/clr */ ++#define E1000_DC 0x04030 /* Defer Count - R/clr */ ++#define E1000_TNCRS 0x04034 /* Tx-No CRS - R/clr */ ++#define E1000_SEC 0x04038 /* Sequence Error Count - R/clr */ ++#define E1000_CEXTERR 0x0403C /* Carrier Extension Error Count - R/clr */ ++#define E1000_RLEC 0x04040 /* Receive Length Error Count - R/clr */ ++#define E1000_XONRXC 0x04048 /* XON Rx Count - R/clr */ ++#define E1000_XONTXC 0x0404C /* XON Tx Count - R/clr */ ++#define E1000_XOFFRXC 0x04050 /* XOFF Rx Count - R/clr */ ++#define E1000_XOFFTXC 0x04054 /* XOFF Tx Count - R/clr */ ++#define E1000_FCRUC 0x04058 /* Flow Control Rx Unsupported Count- R/clr */ ++#define E1000_PRC64 0x0405C /* Packets Rx (64 bytes) - R/clr */ ++#define E1000_PRC127 0x04060 /* Packets Rx (65-127 bytes) - R/clr */ ++#define E1000_PRC255 0x04064 /* Packets Rx (128-255 bytes) - R/clr */ ++#define E1000_PRC511 0x04068 /* Packets Rx (255-511 bytes) - R/clr */ ++#define E1000_PRC1023 0x0406C /* Packets Rx (512-1023 bytes) - R/clr */ ++#define E1000_PRC1522 0x04070 /* Packets Rx (1024-1522 bytes) - R/clr */ ++#define E1000_GPRC 0x04074 /* Good Packets Rx Count - R/clr */ ++#define E1000_BPRC 0x04078 /* Broadcast Packets Rx Count - R/clr */ ++#define E1000_MPRC 0x0407C /* Multicast Packets Rx Count - R/clr */ ++#define E1000_GPTC 0x04080 /* Good Packets Tx Count - R/clr */ ++#define E1000_GORCL 0x04088 /* Good Octets Rx Count Low - R/clr */ ++#define E1000_GORCH 0x0408C /* Good Octets Rx Count High - R/clr */ ++#define E1000_GOTCL 0x04090 /* Good Octets Tx Count Low - R/clr */ ++#define E1000_GOTCH 0x04094 /* Good Octets Tx Count High - R/clr */ ++#define E1000_RNBC 0x040A0 /* Rx No Buffers Count - R/clr */ ++#define E1000_RUC 0x040A4 /* Rx Undersize Count - R/clr */ ++#define E1000_RFC 0x040A8 /* Rx Fragment Count - R/clr */ ++#define E1000_ROC 0x040AC /* Rx Oversize Count - R/clr */ ++#define E1000_RJC 0x040B0 /* Rx Jabber Count - R/clr */ ++#define E1000_MGTPRC 0x040B4 /* Management Packets Rx Count - R/clr */ ++#define E1000_MGTPDC 0x040B8 /* Management Packets Dropped Count - R/clr */ ++#define E1000_MGTPTC 0x040BC /* Management Packets Tx Count - R/clr */ ++#define E1000_TORL 0x040C0 /* Total Octets Rx Low - R/clr */ ++#define E1000_TORH 0x040C4 /* Total Octets Rx High - R/clr */ ++#define E1000_TOTL 0x040C8 /* Total Octets Tx Low - R/clr */ ++#define E1000_TOTH 0x040CC /* Total Octets Tx High - R/clr */ ++#define E1000_TPR 0x040D0 /* Total Packets Rx - R/clr */ ++#define E1000_TPT 0x040D4 /* Total Packets Tx - R/clr */ ++#define E1000_PTC64 0x040D8 /* Packets Tx (64 bytes) - R/clr */ ++#define E1000_PTC127 0x040DC /* Packets Tx (65-127 bytes) - R/clr */ ++#define E1000_PTC255 0x040E0 /* Packets Tx (128-255 bytes) - R/clr */ ++#define E1000_PTC511 0x040E4 /* Packets Tx (256-511 bytes) - R/clr */ ++#define E1000_PTC1023 0x040E8 /* Packets Tx (512-1023 bytes) - R/clr */ ++#define E1000_PTC1522 0x040EC /* Packets Tx (1024-1522 Bytes) - R/clr */ ++#define E1000_MPTC 0x040F0 /* Multicast Packets Tx Count - R/clr */ ++#define E1000_BPTC 0x040F4 /* Broadcast Packets Tx Count - R/clr */ ++#define E1000_TSCTC 0x040F8 /* TCP Segmentation Context Tx - R/clr */ ++#define E1000_TSCTFC 0x040FC /* TCP Segmentation Context Tx Fail - R/clr */ ++#define E1000_IAC 0x04100 /* Interrupt Assertion Count */ ++#define E1000_ICRXPTC 0x04104 /* Interrupt Cause Rx Pkt Timer Expire Count */ ++#define E1000_ICRXATC 0x04108 /* Interrupt Cause Rx Abs Timer Expire Count */ ++#define E1000_ICTXPTC 0x0410C /* Interrupt Cause Tx Pkt Timer Expire Count */ ++#define E1000_ICTXATC 0x04110 /* Interrupt Cause Tx Abs Timer Expire Count */ ++#define E1000_ICTXQEC 0x04118 /* Interrupt Cause Tx Queue Empty Count */ ++#define E1000_ICTXQMTC 0x0411C /* Interrupt Cause Tx Queue Min Thresh Count */ ++#define E1000_ICRXDMTC 0x04120 /* Interrupt Cause Rx Desc Min Thresh Count */ ++#define E1000_ICRXOC 0x04124 /* Interrupt Cause Receiver Overrun Count */ ++ ++#define E1000_PCS_CFG0 0x04200 /* PCS Configuration 0 - RW */ ++#define E1000_PCS_LCTL 0x04208 /* PCS Link Control - RW */ ++#define E1000_PCS_LSTAT 0x0420C /* PCS Link Status - RO */ ++#define E1000_CBTMPC 0x0402C /* Circuit Breaker Tx Packet Count */ ++#define E1000_HTDPMC 0x0403C /* Host Transmit Discarded Packets */ ++#define E1000_CBRDPC 0x04044 /* Circuit Breaker Rx Dropped Count */ ++#define E1000_CBRMPC 0x040FC /* Circuit Breaker Rx Packet Count */ ++#define E1000_RPTHC 0x04104 /* Rx Packets To Host */ ++#define E1000_HGPTC 0x04118 /* Host Good Packets Tx Count */ ++#define E1000_HTCBDPC 0x04124 /* Host Tx Circuit Breaker Dropped Count */ ++#define E1000_HGORCL 0x04128 /* Host Good Octets Received Count Low */ ++#define E1000_HGORCH 0x0412C /* Host Good Octets Received Count High */ ++#define E1000_HGOTCL 0x04130 /* Host Good Octets Transmit Count Low */ ++#define E1000_HGOTCH 0x04134 /* Host Good Octets Transmit Count High */ ++#define E1000_LENERRS 0x04138 /* Length Errors Count */ ++#define E1000_SCVPC 0x04228 /* SerDes/SGMII Code Violation Pkt Count */ ++#define E1000_HRMPC 0x0A018 /* Header Redirection Missed Packet Count */ ++#define E1000_PCS_ANADV 0x04218 /* AN advertisement - RW */ ++#define E1000_PCS_LPAB 0x0421C /* Link Partner Ability - RW */ ++#define E1000_PCS_NPTX 0x04220 /* AN Next Page Transmit - RW */ ++#define E1000_PCS_LPABNP 0x04224 /* Link Partner Ability Next Page - RW */ ++#define E1000_1GSTAT_RCV 0x04228 /* 1GSTAT Code Violation Packet Count - RW */ ++#define E1000_RXCSUM 0x05000 /* Rx Checksum Control - RW */ ++#define E1000_RLPML 0x05004 /* Rx Long Packet Max Length */ ++#define E1000_RFCTL 0x05008 /* Receive Filter Control*/ ++#define E1000_MTA 0x05200 /* Multicast Table Array - RW Array */ ++#define E1000_RA 0x05400 /* Receive Address - RW Array */ ++#define E1000_VFTA 0x05600 /* VLAN Filter Table Array - RW Array */ ++#define E1000_VT_CTL 0x0581C /* VMDq Control - RW */ ++#define E1000_VFQA0 0x0B000 /* VLAN Filter Queue Array 0 - RW Array */ ++#define E1000_VFQA1 0x0B200 /* VLAN Filter Queue Array 1 - RW Array */ ++#define E1000_WUC 0x05800 /* Wakeup Control - RW */ ++#define E1000_WUFC 0x05808 /* Wakeup Filter Control - RW */ ++#define E1000_WUS 0x05810 /* Wakeup Status - RO */ ++#define E1000_MANC 0x05820 /* Management Control - RW */ ++#define E1000_IPAV 0x05838 /* IP Address Valid - RW */ ++#define E1000_IP4AT 0x05840 /* IPv4 Address Table - RW Array */ ++#define E1000_IP6AT 0x05880 /* IPv6 Address Table - RW Array */ ++#define E1000_WUPL 0x05900 /* Wakeup Packet Length - RW */ ++#define E1000_WUPM 0x05A00 /* Wakeup Packet Memory - RO A */ ++#define E1000_PBACL 0x05B68 /* MSIx PBA Clear - Read/Write 1's to clear */ ++#define E1000_FFLT 0x05F00 /* Flexible Filter Length Table - RW Array */ ++#define E1000_HOST_IF 0x08800 /* Host Interface */ ++#define E1000_FFMT 0x09000 /* Flexible Filter Mask Table - RW Array */ ++#define E1000_FFVT 0x09800 /* Flexible Filter Value Table - RW Array */ ++ ++#define E1000_KMRNCTRLSTA 0x00034 /* MAC-PHY interface - RW */ ++#define E1000_MDPHYA 0x0003C /* PHY address - RW */ ++#define E1000_MANC2H 0x05860 /* Management Control To Host - RW */ ++#define E1000_SW_FW_SYNC 0x05B5C /* Software-Firmware Synchronization - RW */ ++#define E1000_CCMCTL 0x05B48 /* CCM Control Register */ ++#define E1000_GIOCTL 0x05B44 /* GIO Analog Control Register */ ++#define E1000_SCCTL 0x05B4C /* PCIc PLL Configuration Register */ ++#define E1000_GCR 0x05B00 /* PCI-Ex Control */ ++#define E1000_GCR2 0x05B64 /* PCI-Ex Control #2 */ ++#define E1000_GSCL_1 0x05B10 /* PCI-Ex Statistic Control #1 */ ++#define E1000_GSCL_2 0x05B14 /* PCI-Ex Statistic Control #2 */ ++#define E1000_GSCL_3 0x05B18 /* PCI-Ex Statistic Control #3 */ ++#define E1000_GSCL_4 0x05B1C /* PCI-Ex Statistic Control #4 */ ++#define E1000_FACTPS 0x05B30 /* Function Active and Power State to MNG */ ++#define E1000_SWSM 0x05B50 /* SW Semaphore */ ++#define E1000_FWSM 0x05B54 /* FW Semaphore */ ++#define E1000_DCA_ID 0x05B70 /* DCA Requester ID Information - RO */ ++#define E1000_DCA_CTRL 0x05B74 /* DCA Control - RW */ ++#define E1000_FFLT_DBG 0x05F04 /* Debug Register */ ++#define E1000_HICR 0x08F00 /* Host Interface Control */ ++ ++/* RSS registers */ ++#define E1000_CPUVEC 0x02C10 /* CPU Vector Register - RW */ ++#define E1000_MRQC 0x05818 /* Multiple Receive Control - RW */ ++#define E1000_IMIR(_i) (0x05A80 + ((_i) * 4)) /* Immediate Interrupt */ ++#define E1000_IMIREXT(_i) (0x05AA0 + ((_i) * 4)) /* Immediate Interrupt Ext*/ ++#define E1000_IMIRVP 0x05AC0 /* Immediate Interrupt Rx VLAN Priority - RW */ ++#define E1000_MSIXBM(_i) (0x01600 + ((_i) * 4)) /* MSI-X Allocation Register ++ * (_i) - RW */ ++#define E1000_MSIXTADD(_i) (0x0C000 + ((_i) * 0x10)) /* MSI-X Table entry addr ++ * low reg - RW */ ++#define E1000_MSIXTUADD(_i) (0x0C004 + ((_i) * 0x10)) /* MSI-X Table entry addr ++ * upper reg - RW */ ++#define E1000_MSIXTMSG(_i) (0x0C008 + ((_i) * 0x10)) /* MSI-X Table entry ++ * message reg - RW */ ++#define E1000_MSIXVCTRL(_i) (0x0C00C + ((_i) * 0x10)) /* MSI-X Table entry ++ * vector ctrl reg - RW */ ++#define E1000_MSIXPBA 0x0E000 /* MSI-X Pending bit array */ ++#define E1000_RETA(_i) (0x05C00 + ((_i) * 4)) /* Redirection Table - RW */ ++#define E1000_RSSRK(_i) (0x05C80 + ((_i) * 4)) /* RSS Random Key - RW */ ++#define E1000_RSSIM 0x05864 /* RSS Interrupt Mask */ ++#define E1000_RSSIR 0x05868 /* RSS Interrupt Request */ ++#define E1000_RXMTRL 0x0B634 /* Time sync Rx EtherType and Msg Type - RW */ ++#define E1000_RXUDP 0x0B638 /* Time Sync Rx UDP Port - RW */ ++#endif +diff -r bd70f2f305c6 drivers/net/e1000e/es2lan.c +--- a/drivers/net/e1000e/es2lan.c Mon Jun 15 11:43:16 2009 +0100 ++++ b/drivers/net/e1000e/es2lan.c Mon Jun 15 11:45:35 2009 +0100 +@@ -86,6 +86,9 @@ + + /* Kumeran Mode Control Register (Page 193, Register 16) */ + #define GG82563_KMCR_PASS_FALSE_CARRIER 0x0800 ++ ++/* Max number of times Kumeran read/write should be validated */ ++#define GG82563_MAX_KMRN_RETRY 0x5 + + /* Max number of times Kumeran read/write should be validated */ + #define GG82563_MAX_KMRN_RETRY 0x5 +@@ -798,7 +801,7 @@ + ret_val = e1000e_id_led_init(hw); + if (ret_val) { + hw_dbg(hw, "Error initializing identification LED\n"); +- return ret_val; ++ /* This is not fatal and we should not stop init due to this */ + } + + /* Disabling VLAN filtering */ +diff -r bd70f2f305c6 drivers/net/e1000e/ethtool.c +--- a/drivers/net/e1000e/ethtool.c Mon Jun 15 11:43:16 2009 +0100 ++++ b/drivers/net/e1000e/ethtool.c Mon Jun 15 11:45:35 2009 +0100 +@@ -1,7 +1,7 @@ + /******************************************************************************* + + Intel PRO/1000 Linux driver +- Copyright(c) 1999 - 2008 Intel Corporation. ++ Copyright(c) 1999 - 2009 Intel Corporation. + + This program is free software; you can redistribute it and/or modify it + under the terms and conditions of the GNU General Public License, +@@ -29,11 +29,18 @@ + /* ethtool support for e1000 */ + + #include ++#ifdef SIOCETHTOOL + #include + #include + #include + + #include "e1000.h" ++#ifdef NETIF_F_HW_VLAN_TX ++#include ++#endif ++#ifdef ETHTOOL_OPS_COMPAT ++#include "kcompat_ethtool.c" ++#endif + + struct e1000_stats { + char stat_string[ETH_GSTRING_LEN]; +@@ -173,11 +180,8 @@ + static u32 e1000_get_link(struct net_device *netdev) + { + struct e1000_adapter *adapter = netdev_priv(netdev); +- struct e1000_hw *hw = &adapter->hw; +- u32 status; +- +- status = er32(STATUS); +- return (status & E1000_STATUS_LU) ? 1 : 0; ++ ++ return e1000_has_link(adapter); + } + + static int e1000_set_spd_dplx(struct e1000_adapter *adapter, u16 spddplx) +@@ -249,7 +253,7 @@ + ADVERTISED_Autoneg; + ecmd->advertising = hw->phy.autoneg_advertised; + if (adapter->fc_autoneg) +- hw->fc.original_type = e1000_fc_default; ++ hw->fc.requested_mode = e1000_fc_default; + } else { + if (e1000_set_spd_dplx(adapter, ecmd->speed + ecmd->duplex)) { + clear_bit(__E1000_RESETTING, &adapter->state); +@@ -279,11 +283,11 @@ + pause->autoneg = + (adapter->fc_autoneg ? AUTONEG_ENABLE : AUTONEG_DISABLE); + +- if (hw->fc.type == e1000_fc_rx_pause) { ++ if (hw->fc.current_mode == e1000_fc_rx_pause) { + pause->rx_pause = 1; +- } else if (hw->fc.type == e1000_fc_tx_pause) { ++ } else if (hw->fc.current_mode == e1000_fc_tx_pause) { + pause->tx_pause = 1; +- } else if (hw->fc.type == e1000_fc_full) { ++ } else if (hw->fc.current_mode == e1000_fc_full) { + pause->rx_pause = 1; + pause->tx_pause = 1; + } +@@ -301,19 +305,8 @@ + while (test_and_set_bit(__E1000_RESETTING, &adapter->state)) + msleep(1); + +- if (pause->rx_pause && pause->tx_pause) +- hw->fc.type = e1000_fc_full; +- else if (pause->rx_pause && !pause->tx_pause) +- hw->fc.type = e1000_fc_rx_pause; +- else if (!pause->rx_pause && pause->tx_pause) +- hw->fc.type = e1000_fc_tx_pause; +- else if (!pause->rx_pause && !pause->tx_pause) +- hw->fc.type = e1000_fc_none; +- +- hw->fc.original_type = hw->fc.type; +- + if (adapter->fc_autoneg == AUTONEG_ENABLE) { +- hw->fc.type = e1000_fc_default; ++ hw->fc.requested_mode = e1000_fc_default; + if (netif_running(adapter->netdev)) { + e1000e_down(adapter); + e1000e_up(adapter); +@@ -321,6 +314,17 @@ + e1000e_reset(adapter); + } + } else { ++ if (pause->rx_pause && pause->tx_pause) ++ hw->fc.requested_mode = e1000_fc_full; ++ else if (pause->rx_pause && !pause->tx_pause) ++ hw->fc.requested_mode = e1000_fc_rx_pause; ++ else if (!pause->rx_pause && pause->tx_pause) ++ hw->fc.requested_mode = e1000_fc_tx_pause; ++ else if (!pause->rx_pause && !pause->tx_pause) ++ hw->fc.requested_mode = e1000_fc_none; ++ ++ hw->fc.current_mode = hw->fc.requested_mode; ++ + retval = ((hw->phy.media_type == e1000_media_type_fiber) ? + hw->mac.ops.setup_link(hw) : e1000e_force_mac_fc(hw)); + } +@@ -366,22 +370,47 @@ + return 0; + } + ++#ifdef NETIF_F_TSO + static int e1000_set_tso(struct net_device *netdev, u32 data) + { + struct e1000_adapter *adapter = netdev_priv(netdev); ++ int i; ++ struct net_device *v_netdev; + + if (data) { + netdev->features |= NETIF_F_TSO; ++#ifdef NETIF_F_TSO6 + netdev->features |= NETIF_F_TSO6; ++#endif + } else { + netdev->features &= ~NETIF_F_TSO; ++#ifdef NETIF_F_TSO6 + netdev->features &= ~NETIF_F_TSO6; ++#endif ++#ifdef NETIF_F_HW_VLAN_TX ++ /* disable TSO on all VLANs if they're present */ ++ if (!adapter->vlgrp) ++ goto tso_out; ++ for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) { ++ v_netdev = vlan_group_get_device(adapter->vlgrp, i); ++ if (!v_netdev) ++ continue; ++ ++ v_netdev->features &= ~NETIF_F_TSO; ++#ifdef NETIF_F_TSO6 ++ v_netdev->features &= ~NETIF_F_TSO6; ++#endif ++ vlan_group_set_device(adapter->vlgrp, i, v_netdev); ++ } ++#endif + } + ++tso_out: + e_info("TSO is %s\n", data ? "Enabled" : "Disabled"); + adapter->flags |= FLAG_TSO_FORCE; + return 0; + } ++#endif + + static u32 e1000_get_msglevel(struct net_device *netdev) + { +@@ -420,15 +449,15 @@ + regs_buff[1] = er32(STATUS); + + regs_buff[2] = er32(RCTL); +- regs_buff[3] = er32(RDLEN); +- regs_buff[4] = er32(RDH); +- regs_buff[5] = er32(RDT); ++ regs_buff[3] = er32(RDLEN(0)); ++ regs_buff[4] = er32(RDH(0)); ++ regs_buff[5] = er32(RDT(0)); + regs_buff[6] = er32(RDTR); + + regs_buff[7] = er32(TCTL); +- regs_buff[8] = er32(TDLEN); +- regs_buff[9] = er32(TDH); +- regs_buff[10] = er32(TDT); ++ regs_buff[8] = er32(TDLEN(0)); ++ regs_buff[9] = er32(TDH(0)); ++ regs_buff[10] = er32(TDT(0)); + regs_buff[11] = er32(TIDV); + + regs_buff[12] = adapter->hw.phy.type; /* PHY type (IGP=1, M88=0) */ +@@ -494,19 +523,20 @@ + } else { + for (i = 0; i < last_word - first_word + 1; i++) { + ret_val = e1000_read_nvm(hw, first_word + i, 1, +- &eeprom_buff[i]); +- if (ret_val) { +- /* a read error occurred, throw away the +- * result */ +- memset(eeprom_buff, 0xff, sizeof(eeprom_buff)); ++ &eeprom_buff[i]); ++ if (ret_val) + break; +- } + } + } + +- /* Device's eeprom is always little-endian, word addressable */ +- for (i = 0; i < last_word - first_word + 1; i++) +- le16_to_cpus(&eeprom_buff[i]); ++ if (ret_val) { ++ /* a read error occurred, throw away the result */ ++ memset(eeprom_buff, 0xff, sizeof(eeprom_buff)); ++ } else { ++ /* Device's eeprom is always little-endian, word addressable */ ++ for (i = 0; i < last_word - first_word + 1; i++) ++ le16_to_cpus(&eeprom_buff[i]); ++ } + + memcpy(bytes, (u8 *)eeprom_buff + (eeprom->offset & 1), eeprom->len); + kfree(eeprom_buff); +@@ -533,9 +563,6 @@ + if (eeprom->magic != (adapter->pdev->vendor | (adapter->pdev->device << 16))) + return -EFAULT; + +- if (adapter->flags & FLAG_READ_ONLY_NVM) +- return -EINVAL; +- + max_len = hw->nvm.word_size * 2; + + first_word = eeprom->offset >> 1; +@@ -558,6 +585,9 @@ + ret_val = e1000_read_nvm(hw, last_word, 1, + &eeprom_buff[last_word - first_word]); + ++ if (ret_val) ++ goto out; ++ + /* Device's eeprom is always little-endian, word addressable */ + for (i = 0; i < last_word - first_word + 1; i++) + le16_to_cpus(&eeprom_buff[i]); +@@ -570,15 +600,20 @@ + ret_val = e1000_write_nvm(hw, first_word, + last_word - first_word + 1, eeprom_buff); + ++ if (ret_val) ++ goto out; ++ + /* + * Update the checksum over the first part of the EEPROM if needed +- * and flush shadow RAM for 82573 controllers ++ * and flush shadow RAM for applicable controllers + */ +- if ((ret_val == 0) && ((first_word <= NVM_CHECKSUM_REG) || +- (hw->mac.type == e1000_82574) || +- (hw->mac.type == e1000_82573))) +- e1000e_update_nvm_checksum(hw); ++ if ((first_word <= NVM_CHECKSUM_REG) || ++ (hw->mac.type == e1000_82583) || ++ (hw->mac.type == e1000_82574) || ++ (hw->mac.type == e1000_82573)) ++ ret_val = e1000e_update_nvm_checksum(hw); + ++out: + kfree(eeprom_buff); + return ret_val; + } +@@ -588,7 +623,6 @@ + { + struct e1000_adapter *adapter = netdev_priv(netdev); + char firmware_version[32]; +- u16 eeprom_data; + + strncpy(drvinfo->driver, e1000e_driver_name, 32); + strncpy(drvinfo->version, e1000e_driver_version, 32); +@@ -597,11 +631,10 @@ + * EEPROM image version # is reported as firmware version # for + * PCI-E controllers + */ +- e1000_read_nvm(&adapter->hw, 5, 1, &eeprom_data); + sprintf(firmware_version, "%d.%d-%d", +- (eeprom_data & 0xF000) >> 12, +- (eeprom_data & 0x0FF0) >> 4, +- eeprom_data & 0x000F); ++ (adapter->eeprom_vers & 0xF000) >> 12, ++ (adapter->eeprom_vers & 0x0FF0) >> 4, ++ (adapter->eeprom_vers & 0x000F)); + + strncpy(drvinfo->fw_version, firmware_version, 32); + strncpy(drvinfo->bus_info, pci_name(adapter->pdev), 32); +@@ -727,7 +760,7 @@ + (test[pat] & write)); + val = E1000_READ_REG_ARRAY(&adapter->hw, reg, offset); + if (val != (test[pat] & write & mask)) { +- e_err("pattern test reg %04X failed: got 0x%08X " ++ e_err("Register 0x%05X pattern test failed: got 0x%08X " + "expected 0x%08X\n", reg + offset, val, + (test[pat] & write & mask)); + *data = reg; +@@ -744,7 +777,7 @@ + __ew32(&adapter->hw, reg, write & mask); + val = __er32(&adapter->hw, reg); + if ((write & mask) != (val & mask)) { +- e_err("set/check reg %04X test failed: got 0x%08X " ++ e_err("Register 0x%05X set/check test failed: got 0x%08X " + "expected 0x%08X\n", reg, (val & mask), (write & mask)); + *data = reg; + return 1; +@@ -788,6 +821,7 @@ + break; + case e1000_82573: + case e1000_82574: ++ case e1000_82583: + case e1000_ich8lan: + case e1000_ich9lan: + case e1000_ich10lan: +@@ -819,15 +853,15 @@ + } + + REG_PATTERN_TEST(E1000_RDTR, 0x0000FFFF, 0xFFFFFFFF); +- REG_PATTERN_TEST(E1000_RDBAH, 0xFFFFFFFF, 0xFFFFFFFF); +- REG_PATTERN_TEST(E1000_RDLEN, 0x000FFF80, 0x000FFFFF); +- REG_PATTERN_TEST(E1000_RDH, 0x0000FFFF, 0x0000FFFF); +- REG_PATTERN_TEST(E1000_RDT, 0x0000FFFF, 0x0000FFFF); ++ REG_PATTERN_TEST(E1000_RDBAH(0), 0xFFFFFFFF, 0xFFFFFFFF); ++ REG_PATTERN_TEST(E1000_RDLEN(0), 0x000FFF80, 0x000FFFFF); ++ REG_PATTERN_TEST(E1000_RDH(0), 0x0000FFFF, 0x0000FFFF); ++ REG_PATTERN_TEST(E1000_RDT(0), 0x0000FFFF, 0x0000FFFF); + REG_PATTERN_TEST(E1000_FCRTH, 0x0000FFF8, 0x0000FFF8); + REG_PATTERN_TEST(E1000_FCTTV, 0x0000FFFF, 0x0000FFFF); + REG_PATTERN_TEST(E1000_TIPG, 0x3FFFFFFF, 0x3FFFFFFF); +- REG_PATTERN_TEST(E1000_TDBAH, 0xFFFFFFFF, 0xFFFFFFFF); +- REG_PATTERN_TEST(E1000_TDLEN, 0x000FFF80, 0x000FFFFF); ++ REG_PATTERN_TEST(E1000_TDBAH(0), 0xFFFFFFFF, 0xFFFFFFFF); ++ REG_PATTERN_TEST(E1000_TDLEN(0), 0x000FFF80, 0x000FFFFF); + + REG_SET_AND_CHECK(E1000_RCTL, 0xFFFFFFFF, 0x00000000); + +@@ -836,10 +870,10 @@ + REG_SET_AND_CHECK(E1000_TCTL, 0xFFFFFFFF, 0x00000000); + + REG_SET_AND_CHECK(E1000_RCTL, before, 0xFFFFFFFF); +- REG_PATTERN_TEST(E1000_RDBAL, 0xFFFFFFF0, 0xFFFFFFFF); ++ REG_PATTERN_TEST(E1000_RDBAL(0), 0xFFFFFFF0, 0xFFFFFFFF); + if (!(adapter->flags & FLAG_IS_ICH)) + REG_PATTERN_TEST(E1000_TXCW, 0xC000FFFF, 0x0000FFFF); +- REG_PATTERN_TEST(E1000_TDBAL, 0xFFFFFFF0, 0xFFFFFFFF); ++ REG_PATTERN_TEST(E1000_TDBAL(0), 0xFFFFFFF0, 0xFFFFFFFF); + REG_PATTERN_TEST(E1000_TIDV, 0x0000FFFF, 0x0000FFFF); + for (i = 0; i < mac->rar_entry_count; i++) + REG_PATTERN_TEST_ARRAY(E1000_RA, ((i << 1) + 1), +@@ -865,7 +899,7 @@ + for (i = 0; i < (NVM_CHECKSUM_REG + 1); i++) { + if ((e1000_read_nvm(&adapter->hw, i, 1, &temp)) < 0) { + *data = 1; +- break; ++ return *data; + } + checksum += temp; + } +@@ -896,11 +930,14 @@ + u32 shared_int = 1; + u32 irq = adapter->pdev->irq; + int i; ++#ifdef CONFIG_E1000E_MSIX + int ret_val = 0; + int int_mode = E1000E_INT_MODE_LEGACY; ++#endif + + *data = 0; + ++#ifdef CONFIG_E1000E_MSIX + /* NOTE: we don't test MSI/MSI-X interrupts here, yet */ + if (adapter->int_mode == E1000E_INT_MODE_MSIX) { + int_mode = adapter->int_mode; +@@ -908,6 +945,9 @@ + adapter->int_mode = E1000E_INT_MODE_LEGACY; + e1000e_set_interrupt_capability(adapter); + } ++#else ++ /* NOTE: we don't test MSI interrupts here, yet */ ++#endif + /* Hook up test interrupt handler just for this test */ + if (!request_irq(irq, &e1000_test_intr, IRQF_PROBE_SHARED, netdev->name, + netdev)) { +@@ -915,8 +955,12 @@ + } else if (request_irq(irq, &e1000_test_intr, IRQF_SHARED, + netdev->name, netdev)) { + *data = 1; ++#ifdef CONFIG_E1000E_MSIX + ret_val = -1; + goto out; ++#else ++ return -1; ++#endif + } + e_info("testing %s interrupt\n", (shared_int ? "shared" : "unshared")); + +@@ -1006,6 +1050,7 @@ + /* Unhook test interrupt handler */ + free_irq(irq, netdev); + ++#ifdef CONFIG_E1000E_MSIX + out: + if (int_mode == E1000E_INT_MODE_MSIX) { + e1000e_reset_interrupt_capability(adapter); +@@ -1014,6 +1059,9 @@ + } + + return ret_val; ++#else ++ return *data; ++#endif + } + + static void e1000_free_desc_rings(struct e1000_adapter *adapter) +@@ -1097,11 +1145,11 @@ + tx_ring->next_to_use = 0; + tx_ring->next_to_clean = 0; + +- ew32(TDBAL, ((u64) tx_ring->dma & 0x00000000FFFFFFFF)); +- ew32(TDBAH, ((u64) tx_ring->dma >> 32)); +- ew32(TDLEN, tx_ring->count * sizeof(struct e1000_tx_desc)); +- ew32(TDH, 0); +- ew32(TDT, 0); ++ ew32(TDBAL(0), ((u64) tx_ring->dma & 0x00000000FFFFFFFF)); ++ ew32(TDBAH(0), ((u64) tx_ring->dma >> 32)); ++ ew32(TDLEN(0), tx_ring->count * sizeof(struct e1000_tx_desc)); ++ ew32(TDH(0), 0); ++ ew32(TDT(0), 0); + ew32(TCTL, E1000_TCTL_PSP | E1000_TCTL_EN | E1000_TCTL_MULR | + E1000_COLLISION_THRESHOLD << E1000_CT_SHIFT | + E1000_COLLISION_DISTANCE << E1000_COLD_SHIFT); +@@ -1159,11 +1207,11 @@ + + rctl = er32(RCTL); + ew32(RCTL, rctl & ~E1000_RCTL_EN); +- ew32(RDBAL, ((u64) rx_ring->dma & 0xFFFFFFFF)); +- ew32(RDBAH, ((u64) rx_ring->dma >> 32)); +- ew32(RDLEN, rx_ring->size); +- ew32(RDH, 0); +- ew32(RDT, 0); ++ ew32(RDBAL(0), ((u64) rx_ring->dma & 0xFFFFFFFF)); ++ ew32(RDBAH(0), ((u64) rx_ring->dma >> 32)); ++ ew32(RDLEN(0), rx_ring->size); ++ ew32(RDH(0), 0); ++ ew32(RDT(0), 0); + rctl = E1000_RCTL_EN | E1000_RCTL_BAM | E1000_RCTL_SZ_2048 | + E1000_RCTL_UPE | E1000_RCTL_MPE | E1000_RCTL_LPE | + E1000_RCTL_SBP | E1000_RCTL_SECRC | +@@ -1490,7 +1538,7 @@ + int ret_val = 0; + unsigned long time; + +- ew32(RDT, rx_ring->count - 1); ++ ew32(RDT(0), rx_ring->count - 1); + + /* + * Calculate the loop count based on the largest descriptor ring +@@ -1517,7 +1565,7 @@ + if (k == tx_ring->count) + k = 0; + } +- ew32(TDT, k); ++ ew32(TDT(0), k); + msleep(200); + time = jiffies; /* set the start time for the receive */ + good_cnt = 0; +@@ -1613,16 +1661,14 @@ + return *data; + } + +-static int e1000e_get_sset_count(struct net_device *netdev, int sset) ++static int e1000_get_self_test_count(struct net_device *netdev) + { +- switch (sset) { +- case ETH_SS_TEST: +- return E1000_TEST_LEN; +- case ETH_SS_STATS: +- return E1000_STATS_LEN; +- default: +- return -EOPNOTSUPP; +- } ++ return E1000_TEST_LEN; ++} ++ ++static int e1000_get_stats_count(struct net_device *netdev) ++{ ++ return E1000_STATS_LEN; + } + + static void e1000_diag_test(struct net_device *netdev, +@@ -1749,12 +1795,11 @@ + { + struct e1000_adapter *adapter = netdev_priv(netdev); + +- if (wol->wolopts & WAKE_MAGICSECURE) ++ if (!(adapter->flags & FLAG_HAS_WOL) || ++ !device_can_wakeup(&adapter->pdev->dev) || ++ (wol->wolopts & ~(WAKE_UCAST | WAKE_MCAST | WAKE_BCAST | ++ WAKE_MAGIC | WAKE_PHY | WAKE_ARP))) + return -EOPNOTSUPP; +- +- if (!(adapter->flags & FLAG_HAS_WOL) || +- !device_can_wakeup(&adapter->pdev->dev)) +- return wol->wolopts ? -EOPNOTSUPP : 0; + + /* these settings will always override what we currently have */ + adapter->wol = 0; +@@ -1804,6 +1849,7 @@ + data = INT_MAX; + + if ((hw->phy.type == e1000_phy_ife) || ++ (hw->mac.type == e1000_82583) || + (hw->mac.type == e1000_82574)) { + if (!adapter->blink_timer.function) { + init_timer(&adapter->blink_timer); +@@ -1937,18 +1983,23 @@ + .set_tx_csum = e1000_set_tx_csum, + .get_sg = ethtool_op_get_sg, + .set_sg = ethtool_op_set_sg, ++#ifdef NETIF_F_TSO + .get_tso = ethtool_op_get_tso, + .set_tso = e1000_set_tso, ++#endif + .self_test = e1000_diag_test, + .get_strings = e1000_get_strings, + .phys_id = e1000_phys_id, + .get_ethtool_stats = e1000_get_ethtool_stats, +- .get_sset_count = e1000e_get_sset_count, ++ .self_test_count = e1000_get_self_test_count, ++ .get_stats_count = e1000_get_stats_count, + .get_coalesce = e1000_get_coalesce, + .set_coalesce = e1000_set_coalesce, + }; + + void e1000e_set_ethtool_ops(struct net_device *netdev) + { +- SET_ETHTOOL_OPS(netdev, &e1000_ethtool_ops); ++ /* have to "undeclare" const on this struct to remove warnings */ ++ SET_ETHTOOL_OPS(netdev, (struct ethtool_ops *)&e1000_ethtool_ops); + } ++#endif /* SIOCETHTOOL */ +diff -r bd70f2f305c6 drivers/net/e1000e/hw.h +--- a/drivers/net/e1000e/hw.h Mon Jun 15 11:43:16 2009 +0100 ++++ b/drivers/net/e1000e/hw.h Mon Jun 15 11:45:35 2009 +0100 +@@ -1,7 +1,7 @@ + /******************************************************************************* + + Intel PRO/1000 Linux driver +- Copyright(c) 1999 - 2008 Intel Corporation. ++ Copyright(c) 1999 - 2009 Intel Corporation. + + This program is free software; you can redistribute it and/or modify it + under the terms and conditions of the GNU General Public License, +@@ -29,356 +29,78 @@ + #ifndef _E1000_HW_H_ + #define _E1000_HW_H_ + +-#include ++#include "e1000_regs.h" ++#include "e1000_defines.h" + + struct e1000_hw; +-struct e1000_adapter; + +-#include "defines.h" +- +-#define er32(reg) __er32(hw, E1000_##reg) +-#define ew32(reg,val) __ew32(hw, E1000_##reg, (val)) +-#define e1e_flush() er32(STATUS) +- +-#define E1000_WRITE_REG_ARRAY(a, reg, offset, value) \ +- (writel((value), ((a)->hw_addr + reg + ((offset) << 2)))) +- +-#define E1000_READ_REG_ARRAY(a, reg, offset) \ +- (readl((a)->hw_addr + reg + ((offset) << 2))) +- +-enum e1e_registers { +- E1000_CTRL = 0x00000, /* Device Control - RW */ +- E1000_STATUS = 0x00008, /* Device Status - RO */ +- E1000_EECD = 0x00010, /* EEPROM/Flash Control - RW */ +- E1000_EERD = 0x00014, /* EEPROM Read - RW */ +- E1000_CTRL_EXT = 0x00018, /* Extended Device Control - RW */ +- E1000_FLA = 0x0001C, /* Flash Access - RW */ +- E1000_MDIC = 0x00020, /* MDI Control - RW */ +- E1000_SCTL = 0x00024, /* SerDes Control - RW */ +- E1000_FCAL = 0x00028, /* Flow Control Address Low - RW */ +- E1000_FCAH = 0x0002C, /* Flow Control Address High -RW */ +- E1000_FEXTNVM = 0x00028, /* Future Extended NVM - RW */ +- E1000_FCT = 0x00030, /* Flow Control Type - RW */ +- E1000_VET = 0x00038, /* VLAN Ether Type - RW */ +- E1000_ICR = 0x000C0, /* Interrupt Cause Read - R/clr */ +- E1000_ITR = 0x000C4, /* Interrupt Throttling Rate - RW */ +- E1000_ICS = 0x000C8, /* Interrupt Cause Set - WO */ +- E1000_IMS = 0x000D0, /* Interrupt Mask Set - RW */ +- E1000_IMC = 0x000D8, /* Interrupt Mask Clear - WO */ +- E1000_EIAC_82574 = 0x000DC, /* Ext. Interrupt Auto Clear - RW */ +- E1000_IAM = 0x000E0, /* Interrupt Acknowledge Auto Mask */ +- E1000_IVAR = 0x000E4, /* Interrupt Vector Allocation - RW */ +- E1000_EITR_82574_BASE = 0x000E8, /* Interrupt Throttling - RW */ +-#define E1000_EITR_82574(_n) (E1000_EITR_82574_BASE + (_n << 2)) +- E1000_RCTL = 0x00100, /* Rx Control - RW */ +- E1000_FCTTV = 0x00170, /* Flow Control Transmit Timer Value - RW */ +- E1000_TXCW = 0x00178, /* Tx Configuration Word - RW */ +- E1000_RXCW = 0x00180, /* Rx Configuration Word - RO */ +- E1000_TCTL = 0x00400, /* Tx Control - RW */ +- E1000_TCTL_EXT = 0x00404, /* Extended Tx Control - RW */ +- E1000_TIPG = 0x00410, /* Tx Inter-packet gap -RW */ +- E1000_AIT = 0x00458, /* Adaptive Interframe Spacing Throttle -RW */ +- E1000_LEDCTL = 0x00E00, /* LED Control - RW */ +- E1000_EXTCNF_CTRL = 0x00F00, /* Extended Configuration Control */ +- E1000_EXTCNF_SIZE = 0x00F08, /* Extended Configuration Size */ +- E1000_PHY_CTRL = 0x00F10, /* PHY Control Register in CSR */ +- E1000_PBA = 0x01000, /* Packet Buffer Allocation - RW */ +- E1000_PBS = 0x01008, /* Packet Buffer Size */ +- E1000_EEMNGCTL = 0x01010, /* MNG EEprom Control */ +- E1000_EEWR = 0x0102C, /* EEPROM Write Register - RW */ +- E1000_FLOP = 0x0103C, /* FLASH Opcode Register */ +- E1000_PBA_ECC = 0x01100, /* PBA ECC Register */ +- E1000_ERT = 0x02008, /* Early Rx Threshold - RW */ +- E1000_FCRTL = 0x02160, /* Flow Control Receive Threshold Low - RW */ +- E1000_FCRTH = 0x02168, /* Flow Control Receive Threshold High - RW */ +- E1000_PSRCTL = 0x02170, /* Packet Split Receive Control - RW */ +- E1000_RDBAL = 0x02800, /* Rx Descriptor Base Address Low - RW */ +- E1000_RDBAH = 0x02804, /* Rx Descriptor Base Address High - RW */ +- E1000_RDLEN = 0x02808, /* Rx Descriptor Length - RW */ +- E1000_RDH = 0x02810, /* Rx Descriptor Head - RW */ +- E1000_RDT = 0x02818, /* Rx Descriptor Tail - RW */ +- E1000_RDTR = 0x02820, /* Rx Delay Timer - RW */ +- E1000_RXDCTL_BASE = 0x02828, /* Rx Descriptor Control - RW */ +-#define E1000_RXDCTL(_n) (E1000_RXDCTL_BASE + (_n << 8)) +- E1000_RADV = 0x0282C, /* RX Interrupt Absolute Delay Timer - RW */ +- +-/* Convenience macros +- * +- * Note: "_n" is the queue number of the register to be written to. +- * +- * Example usage: +- * E1000_RDBAL_REG(current_rx_queue) +- * +- */ +-#define E1000_RDBAL_REG(_n) (E1000_RDBAL + (_n << 8)) +- E1000_KABGTXD = 0x03004, /* AFE Band Gap Transmit Ref Data */ +- E1000_TDBAL = 0x03800, /* Tx Descriptor Base Address Low - RW */ +- E1000_TDBAH = 0x03804, /* Tx Descriptor Base Address High - RW */ +- E1000_TDLEN = 0x03808, /* Tx Descriptor Length - RW */ +- E1000_TDH = 0x03810, /* Tx Descriptor Head - RW */ +- E1000_TDT = 0x03818, /* Tx Descriptor Tail - RW */ +- E1000_TIDV = 0x03820, /* Tx Interrupt Delay Value - RW */ +- E1000_TXDCTL_BASE = 0x03828, /* Tx Descriptor Control - RW */ +-#define E1000_TXDCTL(_n) (E1000_TXDCTL_BASE + (_n << 8)) +- E1000_TADV = 0x0382C, /* Tx Interrupt Absolute Delay Val - RW */ +- E1000_TARC_BASE = 0x03840, /* Tx Arbitration Count (0) */ +-#define E1000_TARC(_n) (E1000_TARC_BASE + (_n << 8)) +- E1000_CRCERRS = 0x04000, /* CRC Error Count - R/clr */ +- E1000_ALGNERRC = 0x04004, /* Alignment Error Count - R/clr */ +- E1000_SYMERRS = 0x04008, /* Symbol Error Count - R/clr */ +- E1000_RXERRC = 0x0400C, /* Receive Error Count - R/clr */ +- E1000_MPC = 0x04010, /* Missed Packet Count - R/clr */ +- E1000_SCC = 0x04014, /* Single Collision Count - R/clr */ +- E1000_ECOL = 0x04018, /* Excessive Collision Count - R/clr */ +- E1000_MCC = 0x0401C, /* Multiple Collision Count - R/clr */ +- E1000_LATECOL = 0x04020, /* Late Collision Count - R/clr */ +- E1000_COLC = 0x04028, /* Collision Count - R/clr */ +- E1000_DC = 0x04030, /* Defer Count - R/clr */ +- E1000_TNCRS = 0x04034, /* Tx-No CRS - R/clr */ +- E1000_SEC = 0x04038, /* Sequence Error Count - R/clr */ +- E1000_CEXTERR = 0x0403C, /* Carrier Extension Error Count - R/clr */ +- E1000_RLEC = 0x04040, /* Receive Length Error Count - R/clr */ +- E1000_XONRXC = 0x04048, /* XON Rx Count - R/clr */ +- E1000_XONTXC = 0x0404C, /* XON Tx Count - R/clr */ +- E1000_XOFFRXC = 0x04050, /* XOFF Rx Count - R/clr */ +- E1000_XOFFTXC = 0x04054, /* XOFF Tx Count - R/clr */ +- E1000_FCRUC = 0x04058, /* Flow Control Rx Unsupported Count- R/clr */ +- E1000_PRC64 = 0x0405C, /* Packets Rx (64 bytes) - R/clr */ +- E1000_PRC127 = 0x04060, /* Packets Rx (65-127 bytes) - R/clr */ +- E1000_PRC255 = 0x04064, /* Packets Rx (128-255 bytes) - R/clr */ +- E1000_PRC511 = 0x04068, /* Packets Rx (255-511 bytes) - R/clr */ +- E1000_PRC1023 = 0x0406C, /* Packets Rx (512-1023 bytes) - R/clr */ +- E1000_PRC1522 = 0x04070, /* Packets Rx (1024-1522 bytes) - R/clr */ +- E1000_GPRC = 0x04074, /* Good Packets Rx Count - R/clr */ +- E1000_BPRC = 0x04078, /* Broadcast Packets Rx Count - R/clr */ +- E1000_MPRC = 0x0407C, /* Multicast Packets Rx Count - R/clr */ +- E1000_GPTC = 0x04080, /* Good Packets Tx Count - R/clr */ +- E1000_GORCL = 0x04088, /* Good Octets Rx Count Low - R/clr */ +- E1000_GORCH = 0x0408C, /* Good Octets Rx Count High - R/clr */ +- E1000_GOTCL = 0x04090, /* Good Octets Tx Count Low - R/clr */ +- E1000_GOTCH = 0x04094, /* Good Octets Tx Count High - R/clr */ +- E1000_RNBC = 0x040A0, /* Rx No Buffers Count - R/clr */ +- E1000_RUC = 0x040A4, /* Rx Undersize Count - R/clr */ +- E1000_RFC = 0x040A8, /* Rx Fragment Count - R/clr */ +- E1000_ROC = 0x040AC, /* Rx Oversize Count - R/clr */ +- E1000_RJC = 0x040B0, /* Rx Jabber Count - R/clr */ +- E1000_MGTPRC = 0x040B4, /* Management Packets Rx Count - R/clr */ +- E1000_MGTPDC = 0x040B8, /* Management Packets Dropped Count - R/clr */ +- E1000_MGTPTC = 0x040BC, /* Management Packets Tx Count - R/clr */ +- E1000_TORL = 0x040C0, /* Total Octets Rx Low - R/clr */ +- E1000_TORH = 0x040C4, /* Total Octets Rx High - R/clr */ +- E1000_TOTL = 0x040C8, /* Total Octets Tx Low - R/clr */ +- E1000_TOTH = 0x040CC, /* Total Octets Tx High - R/clr */ +- E1000_TPR = 0x040D0, /* Total Packets Rx - R/clr */ +- E1000_TPT = 0x040D4, /* Total Packets Tx - R/clr */ +- E1000_PTC64 = 0x040D8, /* Packets Tx (64 bytes) - R/clr */ +- E1000_PTC127 = 0x040DC, /* Packets Tx (65-127 bytes) - R/clr */ +- E1000_PTC255 = 0x040E0, /* Packets Tx (128-255 bytes) - R/clr */ +- E1000_PTC511 = 0x040E4, /* Packets Tx (256-511 bytes) - R/clr */ +- E1000_PTC1023 = 0x040E8, /* Packets Tx (512-1023 bytes) - R/clr */ +- E1000_PTC1522 = 0x040EC, /* Packets Tx (1024-1522 Bytes) - R/clr */ +- E1000_MPTC = 0x040F0, /* Multicast Packets Tx Count - R/clr */ +- E1000_BPTC = 0x040F4, /* Broadcast Packets Tx Count - R/clr */ +- E1000_TSCTC = 0x040F8, /* TCP Segmentation Context Tx - R/clr */ +- E1000_TSCTFC = 0x040FC, /* TCP Segmentation Context Tx Fail - R/clr */ +- E1000_IAC = 0x04100, /* Interrupt Assertion Count */ +- E1000_ICRXPTC = 0x04104, /* Irq Cause Rx Packet Timer Expire Count */ +- E1000_ICRXATC = 0x04108, /* Irq Cause Rx Abs Timer Expire Count */ +- E1000_ICTXPTC = 0x0410C, /* Irq Cause Tx Packet Timer Expire Count */ +- E1000_ICTXATC = 0x04110, /* Irq Cause Tx Abs Timer Expire Count */ +- E1000_ICTXQEC = 0x04118, /* Irq Cause Tx Queue Empty Count */ +- E1000_ICTXQMTC = 0x0411C, /* Irq Cause Tx Queue MinThreshold Count */ +- E1000_ICRXDMTC = 0x04120, /* Irq Cause Rx Desc MinThreshold Count */ +- E1000_ICRXOC = 0x04124, /* Irq Cause Receiver Overrun Count */ +- E1000_RXCSUM = 0x05000, /* Rx Checksum Control - RW */ +- E1000_RFCTL = 0x05008, /* Receive Filter Control */ +- E1000_MTA = 0x05200, /* Multicast Table Array - RW Array */ +- E1000_RA = 0x05400, /* Receive Address - RW Array */ +- E1000_VFTA = 0x05600, /* VLAN Filter Table Array - RW Array */ +- E1000_WUC = 0x05800, /* Wakeup Control - RW */ +- E1000_WUFC = 0x05808, /* Wakeup Filter Control - RW */ +- E1000_WUS = 0x05810, /* Wakeup Status - RO */ +- E1000_MANC = 0x05820, /* Management Control - RW */ +- E1000_FFLT = 0x05F00, /* Flexible Filter Length Table - RW Array */ +- E1000_HOST_IF = 0x08800, /* Host Interface */ +- +- E1000_KMRNCTRLSTA = 0x00034, /* MAC-PHY interface - RW */ +- E1000_MANC2H = 0x05860, /* Management Control To Host - RW */ +- E1000_SW_FW_SYNC = 0x05B5C, /* Software-Firmware Synchronization - RW */ +- E1000_GCR = 0x05B00, /* PCI-Ex Control */ +- E1000_FACTPS = 0x05B30, /* Function Active and Power State to MNG */ +- E1000_SWSM = 0x05B50, /* SW Semaphore */ +- E1000_FWSM = 0x05B54, /* FW Semaphore */ +- E1000_HICR = 0x08F00, /* Host Interface Control */ +-}; +- +-/* RSS registers */ +- +-/* IGP01E1000 Specific Registers */ +-#define IGP01E1000_PHY_PORT_CONFIG 0x10 /* Port Config */ +-#define IGP01E1000_PHY_PORT_STATUS 0x11 /* Status */ +-#define IGP01E1000_PHY_PORT_CTRL 0x12 /* Control */ +-#define IGP01E1000_PHY_LINK_HEALTH 0x13 /* PHY Link Health */ +-#define IGP02E1000_PHY_POWER_MGMT 0x19 /* Power Management */ +-#define IGP01E1000_PHY_PAGE_SELECT 0x1F /* Page Select */ +-#define BM_PHY_PAGE_SELECT 22 /* Page Select for BM */ +-#define IGP_PAGE_SHIFT 5 +-#define PHY_REG_MASK 0x1F +- +-#define BM_WUC_PAGE 800 +-#define BM_WUC_ADDRESS_OPCODE 0x11 +-#define BM_WUC_DATA_OPCODE 0x12 +-#define BM_WUC_ENABLE_PAGE 769 +-#define BM_WUC_ENABLE_REG 17 +-#define BM_WUC_ENABLE_BIT (1 << 2) +-#define BM_WUC_HOST_WU_BIT (1 << 4) +- +-#define BM_WUC PHY_REG(BM_WUC_PAGE, 1) +-#define BM_WUFC PHY_REG(BM_WUC_PAGE, 2) +-#define BM_WUS PHY_REG(BM_WUC_PAGE, 3) +- +-#define IGP01E1000_PHY_PCS_INIT_REG 0x00B4 +-#define IGP01E1000_PHY_POLARITY_MASK 0x0078 +- +-#define IGP01E1000_PSCR_AUTO_MDIX 0x1000 +-#define IGP01E1000_PSCR_FORCE_MDI_MDIX 0x2000 /* 0=MDI, 1=MDIX */ +- +-#define IGP01E1000_PSCFR_SMART_SPEED 0x0080 +- +-#define IGP02E1000_PM_SPD 0x0001 /* Smart Power Down */ +-#define IGP02E1000_PM_D0_LPLU 0x0002 /* For D0a states */ +-#define IGP02E1000_PM_D3_LPLU 0x0004 /* For all other states */ +- +-#define IGP01E1000_PLHR_SS_DOWNGRADE 0x8000 +- +-#define IGP01E1000_PSSR_POLARITY_REVERSED 0x0002 +-#define IGP01E1000_PSSR_MDIX 0x0008 +-#define IGP01E1000_PSSR_SPEED_MASK 0xC000 +-#define IGP01E1000_PSSR_SPEED_1000MBPS 0xC000 +- +-#define IGP02E1000_PHY_CHANNEL_NUM 4 +-#define IGP02E1000_PHY_AGC_A 0x11B1 +-#define IGP02E1000_PHY_AGC_B 0x12B1 +-#define IGP02E1000_PHY_AGC_C 0x14B1 +-#define IGP02E1000_PHY_AGC_D 0x18B1 +- +-#define IGP02E1000_AGC_LENGTH_SHIFT 9 /* Course - 15:13, Fine - 12:9 */ +-#define IGP02E1000_AGC_LENGTH_MASK 0x7F +-#define IGP02E1000_AGC_RANGE 15 +- +-/* manage.c */ +-#define E1000_VFTA_ENTRY_SHIFT 5 +-#define E1000_VFTA_ENTRY_MASK 0x7F +-#define E1000_VFTA_ENTRY_BIT_SHIFT_MASK 0x1F +- +-#define E1000_HICR_EN 0x01 /* Enable bit - RO */ +-/* Driver sets this bit when done to put command in RAM */ +-#define E1000_HICR_C 0x02 +-#define E1000_HICR_FW_RESET_ENABLE 0x40 +-#define E1000_HICR_FW_RESET 0x80 +- +-#define E1000_FWSM_MODE_MASK 0xE +-#define E1000_FWSM_MODE_SHIFT 1 +- +-#define E1000_MNG_IAMT_MODE 0x3 +-#define E1000_MNG_DHCP_COOKIE_LENGTH 0x10 +-#define E1000_MNG_DHCP_COOKIE_OFFSET 0x6F0 +-#define E1000_MNG_DHCP_COMMAND_TIMEOUT 10 +-#define E1000_MNG_DHCP_TX_PAYLOAD_CMD 64 +-#define E1000_MNG_DHCP_COOKIE_STATUS_PARSING 0x1 +-#define E1000_MNG_DHCP_COOKIE_STATUS_VLAN 0x2 +- +-/* nvm.c */ +-#define E1000_STM_OPCODE 0xDB00 +- +-#define E1000_KMRNCTRLSTA_OFFSET 0x001F0000 +-#define E1000_KMRNCTRLSTA_OFFSET_SHIFT 16 +-#define E1000_KMRNCTRLSTA_REN 0x00200000 +-#define E1000_KMRNCTRLSTA_DIAG_OFFSET 0x3 /* Kumeran Diagnostic */ +-#define E1000_KMRNCTRLSTA_DIAG_NELPBK 0x1000 /* Nearend Loopback mode */ +- +-#define IFE_PHY_EXTENDED_STATUS_CONTROL 0x10 +-#define IFE_PHY_SPECIAL_CONTROL 0x11 /* 100BaseTx PHY Special Control */ +-#define IFE_PHY_SPECIAL_CONTROL_LED 0x1B /* PHY Special and LED Control */ +-#define IFE_PHY_MDIX_CONTROL 0x1C /* MDI/MDI-X Control */ +- +-/* IFE PHY Extended Status Control */ +-#define IFE_PESC_POLARITY_REVERSED 0x0100 +- +-/* IFE PHY Special Control */ +-#define IFE_PSC_AUTO_POLARITY_DISABLE 0x0010 +-#define IFE_PSC_FORCE_POLARITY 0x0020 +- +-/* IFE PHY Special Control and LED Control */ +-#define IFE_PSCL_PROBE_MODE 0x0020 +-#define IFE_PSCL_PROBE_LEDS_OFF 0x0006 /* Force LEDs 0 and 2 off */ +-#define IFE_PSCL_PROBE_LEDS_ON 0x0007 /* Force LEDs 0 and 2 on */ +- +-/* IFE PHY MDIX Control */ +-#define IFE_PMC_MDIX_STATUS 0x0020 /* 1=MDI-X, 0=MDI */ +-#define IFE_PMC_FORCE_MDIX 0x0040 /* 1=force MDI-X, 0=force MDI */ +-#define IFE_PMC_AUTO_MDIX 0x0080 /* 1=enable auto MDI/MDI-X, 0=disable */ +- +-#define E1000_CABLE_LENGTH_UNDEFINED 0xFF +- +-#define E1000_DEV_ID_82571EB_COPPER 0x105E +-#define E1000_DEV_ID_82571EB_FIBER 0x105F +-#define E1000_DEV_ID_82571EB_SERDES 0x1060 +-#define E1000_DEV_ID_82571EB_QUAD_COPPER 0x10A4 +-#define E1000_DEV_ID_82571PT_QUAD_COPPER 0x10D5 +-#define E1000_DEV_ID_82571EB_QUAD_FIBER 0x10A5 +-#define E1000_DEV_ID_82571EB_QUAD_COPPER_LP 0x10BC +-#define E1000_DEV_ID_82571EB_SERDES_DUAL 0x10D9 +-#define E1000_DEV_ID_82571EB_SERDES_QUAD 0x10DA +-#define E1000_DEV_ID_82572EI_COPPER 0x107D +-#define E1000_DEV_ID_82572EI_FIBER 0x107E +-#define E1000_DEV_ID_82572EI_SERDES 0x107F +-#define E1000_DEV_ID_82572EI 0x10B9 +-#define E1000_DEV_ID_82573E 0x108B +-#define E1000_DEV_ID_82573E_IAMT 0x108C +-#define E1000_DEV_ID_82573L 0x109A +-#define E1000_DEV_ID_82574L 0x10D3 +- +-#define E1000_DEV_ID_80003ES2LAN_COPPER_DPT 0x1096 +-#define E1000_DEV_ID_80003ES2LAN_SERDES_DPT 0x1098 +-#define E1000_DEV_ID_80003ES2LAN_COPPER_SPT 0x10BA +-#define E1000_DEV_ID_80003ES2LAN_SERDES_SPT 0x10BB +- +-#define E1000_DEV_ID_ICH8_IGP_M_AMT 0x1049 +-#define E1000_DEV_ID_ICH8_IGP_AMT 0x104A +-#define E1000_DEV_ID_ICH8_IGP_C 0x104B +-#define E1000_DEV_ID_ICH8_IFE 0x104C +-#define E1000_DEV_ID_ICH8_IFE_GT 0x10C4 +-#define E1000_DEV_ID_ICH8_IFE_G 0x10C5 +-#define E1000_DEV_ID_ICH8_IGP_M 0x104D +-#define E1000_DEV_ID_ICH9_IGP_AMT 0x10BD +-#define E1000_DEV_ID_ICH9_BM 0x10E5 +-#define E1000_DEV_ID_ICH9_IGP_M_AMT 0x10F5 +-#define E1000_DEV_ID_ICH9_IGP_M 0x10BF +-#define E1000_DEV_ID_ICH9_IGP_M_V 0x10CB +-#define E1000_DEV_ID_ICH9_IGP_C 0x294C +-#define E1000_DEV_ID_ICH9_IFE 0x10C0 +-#define E1000_DEV_ID_ICH9_IFE_GT 0x10C3 +-#define E1000_DEV_ID_ICH9_IFE_G 0x10C2 +-#define E1000_DEV_ID_ICH10_R_BM_LM 0x10CC +-#define E1000_DEV_ID_ICH10_R_BM_LF 0x10CD +-#define E1000_DEV_ID_ICH10_R_BM_V 0x10CE +-#define E1000_DEV_ID_ICH10_D_BM_LM 0x10DE +-#define E1000_DEV_ID_ICH10_D_BM_LF 0x10DF +- ++#define E1000_DEV_ID_82571EB_COPPER 0x105E ++#define E1000_DEV_ID_82571EB_FIBER 0x105F ++#define E1000_DEV_ID_82571EB_SERDES 0x1060 ++#define E1000_DEV_ID_82571EB_SERDES_DUAL 0x10D9 ++#define E1000_DEV_ID_82571EB_SERDES_QUAD 0x10DA ++#define E1000_DEV_ID_82571EB_QUAD_COPPER 0x10A4 ++#define E1000_DEV_ID_82571PT_QUAD_COPPER 0x10D5 ++#define E1000_DEV_ID_82571EB_QUAD_FIBER 0x10A5 ++#define E1000_DEV_ID_82571EB_QUAD_COPPER_LP 0x10BC ++#define E1000_DEV_ID_82572EI_COPPER 0x107D ++#define E1000_DEV_ID_82572EI_FIBER 0x107E ++#define E1000_DEV_ID_82572EI_SERDES 0x107F ++#define E1000_DEV_ID_82572EI 0x10B9 ++#define E1000_DEV_ID_82573E 0x108B ++#define E1000_DEV_ID_82573E_IAMT 0x108C ++#define E1000_DEV_ID_82573L 0x109A ++#define E1000_DEV_ID_82574L 0x10D3 ++#define E1000_DEV_ID_82583V 0x150C ++#define E1000_DEV_ID_80003ES2LAN_COPPER_DPT 0x1096 ++#define E1000_DEV_ID_80003ES2LAN_SERDES_DPT 0x1098 ++#define E1000_DEV_ID_80003ES2LAN_COPPER_SPT 0x10BA ++#define E1000_DEV_ID_80003ES2LAN_SERDES_SPT 0x10BB ++#define E1000_DEV_ID_ICH8_IGP_M_AMT 0x1049 ++#define E1000_DEV_ID_ICH8_IGP_AMT 0x104A ++#define E1000_DEV_ID_ICH8_IGP_C 0x104B ++#define E1000_DEV_ID_ICH8_IFE 0x104C ++#define E1000_DEV_ID_ICH8_IFE_GT 0x10C4 ++#define E1000_DEV_ID_ICH8_IFE_G 0x10C5 ++#define E1000_DEV_ID_ICH8_IGP_M 0x104D ++#define E1000_DEV_ID_ICH9_IGP_M 0x10BF ++#define E1000_DEV_ID_ICH9_IGP_M_AMT 0x10F5 ++#define E1000_DEV_ID_ICH9_IGP_M_V 0x10CB ++#define E1000_DEV_ID_ICH9_IGP_AMT 0x10BD ++#define E1000_DEV_ID_ICH9_BM 0x10E5 ++#define E1000_DEV_ID_ICH9_IGP_C 0x294C ++#define E1000_DEV_ID_ICH9_IFE 0x10C0 ++#define E1000_DEV_ID_ICH9_IFE_GT 0x10C3 ++#define E1000_DEV_ID_ICH9_IFE_G 0x10C2 ++#define E1000_DEV_ID_ICH10_R_BM_LM 0x10CC ++#define E1000_DEV_ID_ICH10_R_BM_LF 0x10CD ++#define E1000_DEV_ID_ICH10_R_BM_V 0x10CE ++#define E1000_DEV_ID_ICH10_D_BM_LM 0x10DE ++#define E1000_DEV_ID_ICH10_D_BM_LF 0x10DF ++#define E1000_REVISION_0 0 ++#define E1000_REVISION_1 1 ++#define E1000_REVISION_2 2 ++#define E1000_REVISION_3 3 + #define E1000_REVISION_4 4 + +-#define E1000_FUNC_1 1 ++#define E1000_FUNC_0 0 ++#define E1000_FUNC_1 1 ++ ++#define E1000_ALT_MAC_ADDRESS_OFFSET_LAN0 0 ++#define E1000_ALT_MAC_ADDRESS_OFFSET_LAN1 3 + + enum e1000_mac_type { ++ e1000_undefined = 0, + e1000_82571, + e1000_82572, + e1000_82573, + e1000_82574, ++ e1000_82583, + e1000_80003es2lan, + e1000_ich8lan, + e1000_ich9lan, + e1000_ich10lan, ++ e1000_num_macs /* List is 1-based, so subtract 1 for true count. */ + }; + + enum e1000_media_type { +@@ -400,7 +122,7 @@ + enum e1000_nvm_override { + e1000_nvm_override_none = 0, + e1000_nvm_override_spi_small, +- e1000_nvm_override_spi_large ++ e1000_nvm_override_spi_large, + }; + + enum e1000_phy_type { +@@ -415,11 +137,32 @@ + e1000_phy_bm, + }; + ++enum e1000_bus_type { ++ e1000_bus_type_unknown = 0, ++ e1000_bus_type_pci, ++ e1000_bus_type_pcix, ++ e1000_bus_type_pci_express, ++ e1000_bus_type_reserved ++}; ++ ++enum e1000_bus_speed { ++ e1000_bus_speed_unknown = 0, ++ e1000_bus_speed_33, ++ e1000_bus_speed_66, ++ e1000_bus_speed_100, ++ e1000_bus_speed_120, ++ e1000_bus_speed_133, ++ e1000_bus_speed_2500, ++ e1000_bus_speed_5000, ++ e1000_bus_speed_reserved ++}; ++ + enum e1000_bus_width { + e1000_bus_width_unknown = 0, + e1000_bus_width_pcie_x1, + e1000_bus_width_pcie_x2, + e1000_bus_width_pcie_x4 = 4, ++ e1000_bus_width_pcie_x8 = 8, + e1000_bus_width_32, + e1000_bus_width_64, + e1000_bus_width_reserved +@@ -431,13 +174,13 @@ + e1000_1000t_rx_status_undefined = 0xFF + }; + +-enum e1000_rev_polarity{ ++enum e1000_rev_polarity { + e1000_rev_polarity_normal = 0, + e1000_rev_polarity_reversed, + e1000_rev_polarity_undefined = 0xFF + }; + +-enum e1000_fc_type { ++enum e1000_fc_mode { + e1000_fc_none = 0, + e1000_fc_rx_pause, + e1000_fc_tx_pause, +@@ -458,13 +201,20 @@ + e1000_smart_speed_off + }; + ++enum e1000_serdes_link_state { ++ e1000_serdes_link_down = 0, ++ e1000_serdes_link_autoneg_progress, ++ e1000_serdes_link_autoneg_complete, ++ e1000_serdes_link_forced_up ++}; ++ + /* Receive Descriptor */ + struct e1000_rx_desc { + __le64 buffer_addr; /* Address of the descriptor's data buffer */ + __le16 length; /* Length of data DMAed into data buffer */ +- __le16 csum; /* Packet checksum */ +- u8 status; /* Descriptor status */ +- u8 errors; /* Descriptor Errors */ ++ __le16 csum; /* Packet checksum */ ++ u8 status; /* Descriptor status */ ++ u8 errors; /* Descriptor Errors */ + __le16 special; + }; + +@@ -476,9 +226,9 @@ + } read; + struct { + struct { +- __le32 mrq; /* Multiple Rx Queues */ ++ __le32 mrq; /* Multiple Rx Queues */ + union { +- __le32 rss; /* RSS Hash */ ++ __le32 rss; /* RSS Hash */ + struct { + __le16 ip_id; /* IP id */ + __le16 csum; /* Packet Checksum */ +@@ -486,9 +236,9 @@ + } hi_dword; + } lower; + struct { +- __le32 status_error; /* ext status/error */ ++ __le32 status_error; /* ext status/error */ + __le16 length; +- __le16 vlan; /* VLAN tag */ ++ __le16 vlan; /* VLAN tag */ + } upper; + } wb; /* writeback */ + }; +@@ -502,9 +252,9 @@ + } read; + struct { + struct { +- __le32 mrq; /* Multiple Rx Queues */ ++ __le32 mrq; /* Multiple Rx Queues */ + union { +- __le32 rss; /* RSS Hash */ ++ __le32 rss; /* RSS Hash */ + struct { + __le16 ip_id; /* IP id */ + __le16 csum; /* Packet Checksum */ +@@ -512,13 +262,13 @@ + } hi_dword; + } lower; + struct { +- __le32 status_error; /* ext status/error */ +- __le16 length0; /* length of buffer 0 */ +- __le16 vlan; /* VLAN tag */ ++ __le32 status_error; /* ext status/error */ ++ __le16 length0; /* length of buffer 0 */ ++ __le16 vlan; /* VLAN tag */ + } middle; + struct { + __le16 header_status; +- __le16 length[3]; /* length of buffers 1-3 */ ++ __le16 length[3]; /* length of buffers 1-3 */ + } upper; + __le64 reserved; + } wb; /* writeback */ +@@ -526,20 +276,20 @@ + + /* Transmit Descriptor */ + struct e1000_tx_desc { +- __le64 buffer_addr; /* Address of the descriptor's data buffer */ ++ __le64 buffer_addr; /* Address of the descriptor's data buffer */ + union { + __le32 data; + struct { + __le16 length; /* Data buffer length */ +- u8 cso; /* Checksum offset */ +- u8 cmd; /* Descriptor control */ ++ u8 cso; /* Checksum offset */ ++ u8 cmd; /* Descriptor control */ + } flags; + } lower; + union { + __le32 data; + struct { +- u8 status; /* Descriptor status */ +- u8 css; /* Checksum start */ ++ u8 status; /* Descriptor status */ ++ u8 css; /* Checksum start */ + __le16 special; + } fields; + } upper; +@@ -550,16 +300,16 @@ + union { + __le32 ip_config; + struct { +- u8 ipcss; /* IP checksum start */ +- u8 ipcso; /* IP checksum offset */ ++ u8 ipcss; /* IP checksum start */ ++ u8 ipcso; /* IP checksum offset */ + __le16 ipcse; /* IP checksum end */ + } ip_fields; + } lower_setup; + union { + __le32 tcp_config; + struct { +- u8 tucss; /* TCP checksum start */ +- u8 tucso; /* TCP checksum offset */ ++ u8 tucss; /* TCP checksum start */ ++ u8 tucso; /* TCP checksum offset */ + __le16 tucse; /* TCP checksum end */ + } tcp_fields; + } upper_setup; +@@ -567,8 +317,8 @@ + union { + __le32 data; + struct { +- u8 status; /* Descriptor status */ +- u8 hdr_len; /* Header length */ ++ u8 status; /* Descriptor status */ ++ u8 hdr_len; /* Header length */ + __le16 mss; /* Maximum segment size */ + } fields; + } tcp_seg_setup; +@@ -588,9 +338,9 @@ + union { + __le32 data; + struct { +- u8 status; /* Descriptor status */ +- u8 popts; /* Packet Options */ +- __le16 special; /* */ ++ u8 status; /* Descriptor status */ ++ u8 popts; /* Packet Options */ ++ __le16 special; + } fields; + } upper; + }; +@@ -660,7 +410,9 @@ + u64 ictxqmtc; + u64 icrxdmtc; + u64 icrxoc; ++ u64 doosync; + }; ++ + + struct e1000_phy_stats { + u32 idle_errors; +@@ -707,13 +459,23 @@ + u8 command_data[E1000_HI_MAX_MNG_DATA_LENGTH]; + }; + +-/* Function pointers and static data for the MAC. */ ++#include "e1000_mac.h" ++#include "e1000_phy.h" ++#include "e1000_nvm.h" ++#include "e1000_manage.h" ++ + struct e1000_mac_operations { +- bool (*check_mng_mode)(struct e1000_hw *); ++ /* Function pointers for the MAC. */ ++ s32 (*init_params)(struct e1000_hw *); ++ s32 (*id_led_init)(struct e1000_hw *); ++ s32 (*blink_led)(struct e1000_hw *); + s32 (*check_for_link)(struct e1000_hw *); ++ bool (*check_mng_mode)(struct e1000_hw *hw); + s32 (*cleanup_led)(struct e1000_hw *); + void (*clear_hw_cntrs)(struct e1000_hw *); ++ void (*clear_vfta)(struct e1000_hw *); + s32 (*get_bus_info)(struct e1000_hw *); ++ void (*set_lan_id)(struct e1000_hw *); + s32 (*get_link_up_info)(struct e1000_hw *, u16 *, u16 *); + s32 (*led_on)(struct e1000_hw *); + s32 (*led_off)(struct e1000_hw *); +@@ -722,39 +484,55 @@ + s32 (*init_hw)(struct e1000_hw *); + s32 (*setup_link)(struct e1000_hw *); + s32 (*setup_physical_interface)(struct e1000_hw *); ++ s32 (*setup_led)(struct e1000_hw *); ++ void (*write_vfta)(struct e1000_hw *, u32, u32); ++ void (*mta_set)(struct e1000_hw *, u32); ++ void (*config_collision_dist)(struct e1000_hw *); ++ void (*rar_set)(struct e1000_hw *, u8*, u32); ++ s32 (*read_mac_addr)(struct e1000_hw *); ++ s32 (*validate_mdi_setting)(struct e1000_hw *); ++ s32 (*mng_host_if_write)(struct e1000_hw *, u8*, u16, u16, u8*); ++ s32 (*mng_write_cmd_header)(struct e1000_hw *hw, ++ struct e1000_host_mng_command_header*); ++ s32 (*mng_enable_host_if)(struct e1000_hw *); ++ s32 (*wait_autoneg)(struct e1000_hw *); + }; + +-/* Function pointers for the PHY. */ + struct e1000_phy_operations { +- s32 (*acquire_phy)(struct e1000_hw *); ++ s32 (*init_params)(struct e1000_hw *); ++ s32 (*acquire)(struct e1000_hw *); ++ s32 (*cfg_on_link_up)(struct e1000_hw *); ++ s32 (*check_polarity)(struct e1000_hw *); + s32 (*check_reset_block)(struct e1000_hw *); +- s32 (*commit_phy)(struct e1000_hw *); ++ s32 (*commit)(struct e1000_hw *); + s32 (*force_speed_duplex)(struct e1000_hw *); + s32 (*get_cfg_done)(struct e1000_hw *hw); + s32 (*get_cable_length)(struct e1000_hw *); +- s32 (*get_phy_info)(struct e1000_hw *); +- s32 (*read_phy_reg)(struct e1000_hw *, u32, u16 *); +- void (*release_phy)(struct e1000_hw *); +- s32 (*reset_phy)(struct e1000_hw *); ++ s32 (*get_info)(struct e1000_hw *); ++ s32 (*read_reg)(struct e1000_hw *, u32, u16 *); ++ void (*release)(struct e1000_hw *); ++ s32 (*reset)(struct e1000_hw *); + s32 (*set_d0_lplu_state)(struct e1000_hw *, bool); + s32 (*set_d3_lplu_state)(struct e1000_hw *, bool); +- s32 (*write_phy_reg)(struct e1000_hw *, u32, u16); ++ s32 (*write_reg)(struct e1000_hw *, u32, u16); ++ void (*power_up)(struct e1000_hw *); ++ void (*power_down)(struct e1000_hw *); + }; + +-/* Function pointers for the NVM. */ + struct e1000_nvm_operations { +- s32 (*acquire_nvm)(struct e1000_hw *); +- s32 (*read_nvm)(struct e1000_hw *, u16, u16, u16 *); +- void (*release_nvm)(struct e1000_hw *); +- s32 (*update_nvm)(struct e1000_hw *); ++ s32 (*init_params)(struct e1000_hw *); ++ s32 (*acquire)(struct e1000_hw *); ++ s32 (*read)(struct e1000_hw *, u16, u16, u16 *); ++ void (*release)(struct e1000_hw *); ++ void (*reload)(struct e1000_hw *); ++ s32 (*update)(struct e1000_hw *); + s32 (*valid_led_default)(struct e1000_hw *, u16 *); +- s32 (*validate_nvm)(struct e1000_hw *); +- s32 (*write_nvm)(struct e1000_hw *, u16, u16, u16 *); ++ s32 (*validate)(struct e1000_hw *); ++ s32 (*write)(struct e1000_hw *, u16, u16, u16 *); + }; + + struct e1000_mac_info { + struct e1000_mac_operations ops; +- + u8 addr[6]; + u8 perm_addr[6]; + +@@ -778,18 +556,20 @@ + + u8 forced_speed_duplex; + ++ bool adaptive_ifs; + bool arc_subsystem_valid; ++ bool asf_firmware_present; + bool autoneg; + bool autoneg_failed; + bool get_link_status; + bool in_ifs_mode; ++ enum e1000_serdes_link_state serdes_link_state; + bool serdes_has_link; + bool tx_pkt_filtering; + }; + + struct e1000_phy_info { + struct e1000_phy_operations ops; +- + enum e1000_phy_type type; + + enum e1000_1000t_rx_status local_rx; +@@ -817,13 +597,13 @@ + bool disable_polarity_correction; + bool is_mdix; + bool polarity_correction; ++ bool reset_disable; + bool speed_downgraded; + bool autoneg_wait_to_complete; + }; + + struct e1000_nvm_info { + struct e1000_nvm_operations ops; +- + enum e1000_nvm_type type; + enum e1000_nvm_override override; + +@@ -838,9 +618,12 @@ + }; + + struct e1000_bus_info { ++ enum e1000_bus_type type; ++ enum e1000_bus_speed speed; + enum e1000_bus_width width; + + u16 func; ++ u16 pci_cmd_word; + }; + + struct e1000_fc_info { +@@ -849,13 +632,12 @@ + u16 pause_time; /* Flow control pause timer */ + bool send_xon; /* Flow control send XON */ + bool strict_ieee; /* Strict IEEE mode */ +- enum e1000_fc_type type; /* Type of flow control */ +- enum e1000_fc_type original_type; ++ enum e1000_fc_mode current_mode; /* FC mode in effect */ ++ enum e1000_fc_mode requested_mode; /* FC mode requested by caller */ + }; + + struct e1000_dev_spec_82571 { + bool laa_is_present; +- bool alt_mac_addr_is_present; + }; + + struct e1000_shadow_ram { +@@ -884,20 +666,23 @@ + struct e1000_host_mng_dhcp_cookie mng_cookie; + + union { +- struct e1000_dev_spec_82571 e82571; ++ struct e1000_dev_spec_82571 _82571; + struct e1000_dev_spec_ich8lan ich8lan; + } dev_spec; ++ ++ u16 device_id; ++ u16 subsystem_vendor_id; ++ u16 subsystem_device_id; ++ u16 vendor_id; ++ ++ u8 revision_id; + }; + +-#ifdef DEBUG +-#define hw_dbg(hw, format, arg...) \ +- printk(KERN_DEBUG "%s: " format, e1000e_get_hw_dev_name(hw), ##arg) +-#else +-static inline int __attribute__ ((format (printf, 2, 3))) +-hw_dbg(struct e1000_hw *hw, const char *format, ...) +-{ +- return 0; +-} +-#endif ++#include "e1000_82571.h" ++#include "e1000_80003es2lan.h" ++#include "e1000_ich8lan.h" ++ ++/* These functions must be implemented by drivers */ ++s32 e1000_read_pcie_cap_reg(struct e1000_hw *hw, u32 reg, u16 *value); + + #endif +diff -r bd70f2f305c6 drivers/net/e1000e/ich8lan.c +--- a/drivers/net/e1000e/ich8lan.c Mon Jun 15 11:43:16 2009 +0100 ++++ b/drivers/net/e1000e/ich8lan.c Mon Jun 15 11:45:35 2009 +0100 +@@ -102,9 +102,6 @@ + + #define E1000_ICH_RAR_ENTRIES 7 + +-#define PHY_PAGE_SHIFT 5 +-#define PHY_REG(page, reg) (((page) << PHY_PAGE_SHIFT) | \ +- ((reg) & MAX_PHY_REG_ADDRESS)) + #define IGP3_KMRN_DIAG PHY_REG(770, 19) /* KMRN Diagnostic */ + #define IGP3_VR_CTRL PHY_REG(776, 18) /* Voltage Regulator Control */ + +@@ -236,6 +233,19 @@ + return ret_val; + } + ++ /* ++ * We may need to do this twice - once for IGP and if that fails, ++ * we'll set BM func pointers and try again ++ */ ++ ret_val = e1000e_determine_phy_address(hw); ++ if (ret_val) { ++ hw->phy.ops.write_phy_reg = e1000e_write_phy_reg_bm; ++ hw->phy.ops.read_phy_reg = e1000e_read_phy_reg_bm; ++ ret_val = e1000e_determine_phy_address(hw); ++ if (ret_val) ++ return ret_val; ++ } ++ + phy->id = 0; + while ((e1000_phy_unknown == e1000e_get_phy_type_from_id(phy->id)) && + (i++ < 100)) { +@@ -256,6 +266,13 @@ + case IFE_C_E_PHY_ID: + phy->type = e1000_phy_ife; + phy->autoneg_mask = E1000_ALL_NOT_GIG; ++ break; ++ case BME1000_E_PHY_ID: ++ phy->type = e1000_phy_bm; ++ phy->autoneg_mask = AUTONEG_ADVERTISE_SPEED_DEFAULT; ++ hw->phy.ops.read_phy_reg = e1000e_read_phy_reg_bm; ++ hw->phy.ops.write_phy_reg = e1000e_write_phy_reg_bm; ++ hw->phy.ops.commit_phy = e1000e_phy_sw_reset; + break; + case BME1000_E_PHY_ID: + phy->type = e1000_phy_bm; +@@ -378,9 +395,17 @@ + if (rc) + return rc; + +- if ((adapter->hw.mac.type == e1000_ich8lan) && +- (adapter->hw.phy.type == e1000_phy_igp_3)) +- adapter->flags |= FLAG_LSC_GIG_SPEED_DROP; ++ if (adapter->hw.phy.type == e1000_phy_ife) ++ adapter->flags &= ~FLAG_HAS_JUMBO_FRAMES; ++ ++ switch (adapter->hw.mac.type) { ++ case e1000_ich8lan: ++ if (adapter->hw.phy.type == e1000_phy_igp_3) ++ adapter->flags |= FLAG_LSC_GIG_SPEED_DROP; ++ break; ++ default: ++ break; ++ } + + return 0; + } +@@ -1948,7 +1973,7 @@ + ret_val = e1000e_id_led_init(hw); + if (ret_val) { + hw_dbg(hw, "Error initializing identification LED\n"); +- return ret_val; ++ /* This is not fatal and we should not stop init due to this */ + } + + /* Setup the receive address. */ +@@ -2390,6 +2415,31 @@ + } + + /** ++ * e1000e_disable_gig_wol_ich8lan - disable gig during WoL ++ * @hw: pointer to the HW structure ++ * ++ * During S0 to Sx transition, it is possible the link remains at gig ++ * instead of negotiating to a lower speed. Before going to Sx, set ++ * 'LPLU Enabled' and 'Gig Disable' to force link speed negotiation ++ * to a lower speed. ++ * ++ * Should only be called for ICH9 devices. ++ **/ ++void e1000e_disable_gig_wol_ich8lan(struct e1000_hw *hw) ++{ ++ u32 phy_ctrl; ++ ++ if (hw->mac.type == e1000_ich9lan) { ++ phy_ctrl = er32(PHY_CTRL); ++ phy_ctrl |= E1000_PHY_CTRL_D0A_LPLU | ++ E1000_PHY_CTRL_GBE_DISABLE; ++ ew32(PHY_CTRL, phy_ctrl); ++ } ++ ++ return; ++} ++ ++/** + * e1000_cleanup_led_ich8lan - Restore the default LED operation + * @hw: pointer to the HW structure + * +@@ -2433,6 +2483,113 @@ + (IFE_PSCL_PROBE_MODE | IFE_PSCL_PROBE_LEDS_OFF)); + + ew32(LEDCTL, hw->mac.ledctl_mode1); ++ return 0; ++} ++ ++/** ++ * e1000_phy_init_script_igp3 - Inits the IGP3 PHY ++ * @hw: pointer to the HW structure ++ * ++ * Initializes a Intel Gigabit PHY3 when an EEPROM is not present. ++ **/ ++static s32 e1000_phy_init_script_igp3(struct e1000_hw *hw) ++{ ++ /* PHY init IGP 3 */ ++ /* Enable rise/fall, 10-mode work in class-A */ ++ e1e_wphy(hw, 0x2F5B, 0x9018); ++ /* Remove all caps from Replica path filter */ ++ e1e_wphy(hw, 0x2F52, 0x0000); ++ /* Bias trimming for ADC, AFE and Driver (Default) */ ++ e1e_wphy(hw, 0x2FB1, 0x8B24); ++ /* Increase Hybrid poly bias */ ++ e1e_wphy(hw, 0x2FB2, 0xF8F0); ++ /* Add 4% to Tx amplitude in Gig mode */ ++ e1e_wphy(hw, 0x2010, 0x10B0); ++ /* Disable trimming (TTT) */ ++ e1e_wphy(hw, 0x2011, 0x0000); ++ /* Poly DC correction to 94.6% + 2% for all channels */ ++ e1e_wphy(hw, 0x20DD, 0x249A); ++ /* ABS DC correction to 95.9% */ ++ e1e_wphy(hw, 0x20DE, 0x00D3); ++ /* BG temp curve trim */ ++ e1e_wphy(hw, 0x28B4, 0x04CE); ++ /* Increasing ADC OPAMP stage 1 currents to max */ ++ e1e_wphy(hw, 0x2F70, 0x29E4); ++ /* Force 1000 ( required for enabling PHY regs configuration) */ ++ e1e_wphy(hw, 0x0000, 0x0140); ++ /* Set upd_freq to 6 */ ++ e1e_wphy(hw, 0x1F30, 0x1606); ++ /* Disable NPDFE */ ++ e1e_wphy(hw, 0x1F31, 0xB814); ++ /* Disable adaptive fixed FFE (Default) */ ++ e1e_wphy(hw, 0x1F35, 0x002A); ++ /* Enable FFE hysteresis */ ++ e1e_wphy(hw, 0x1F3E, 0x0067); ++ /* Fixed FFE for short cable lengths */ ++ e1e_wphy(hw, 0x1F54, 0x0065); ++ /* Fixed FFE for medium cable lengths */ ++ e1e_wphy(hw, 0x1F55, 0x002A); ++ /* Fixed FFE for long cable lengths */ ++ e1e_wphy(hw, 0x1F56, 0x002A); ++ /* Enable Adaptive Clip Threshold */ ++ e1e_wphy(hw, 0x1F72, 0x3FB0); ++ /* AHT reset limit to 1 */ ++ e1e_wphy(hw, 0x1F76, 0xC0FF); ++ /* Set AHT master delay to 127 msec */ ++ e1e_wphy(hw, 0x1F77, 0x1DEC); ++ /* Set scan bits for AHT */ ++ e1e_wphy(hw, 0x1F78, 0xF9EF); ++ /* Set AHT Preset bits */ ++ e1e_wphy(hw, 0x1F79, 0x0210); ++ /* Change integ_factor of channel A to 3 */ ++ e1e_wphy(hw, 0x1895, 0x0003); ++ /* Change prop_factor of channels BCD to 8 */ ++ e1e_wphy(hw, 0x1796, 0x0008); ++ /* Change cg_icount + enable integbp for channels BCD */ ++ e1e_wphy(hw, 0x1798, 0xD008); ++ /* ++ * Change cg_icount + enable integbp + change prop_factor_master ++ * to 8 for channel A ++ */ ++ e1e_wphy(hw, 0x1898, 0xD918); ++ /* Disable AHT in Slave mode on channel A */ ++ e1e_wphy(hw, 0x187A, 0x0800); ++ /* ++ * Enable LPLU and disable AN to 1000 in non-D0a states, ++ * Enable SPD+B2B ++ */ ++ e1e_wphy(hw, 0x0019, 0x008D); ++ /* Enable restart AN on an1000_dis change */ ++ e1e_wphy(hw, 0x001B, 0x2080); ++ /* Enable wh_fifo read clock in 10/100 modes */ ++ e1e_wphy(hw, 0x0014, 0x0045); ++ /* Restart AN, Speed selection is 1000 */ ++ e1e_wphy(hw, 0x0000, 0x1340); ++ ++ return 0; ++} ++ ++/** ++ * e1000_get_cfg_done_ich8lan - Read config done bit ++ * @hw: pointer to the HW structure ++ * ++ * Read the management control register for the config done bit for ++ * completion status. NOTE: silicon which is EEPROM-less will fail trying ++ * to read the config done bit, so an error is *ONLY* logged and returns ++ * E1000_SUCCESS. If we were to return with error, EEPROM-less silicon ++ * would not be able to be reset or change link. ++ **/ ++static s32 e1000_get_cfg_done_ich8lan(struct e1000_hw *hw) ++{ ++ ++ e1000e_get_cfg_done(hw); ++ ++ /* If EEPROM is not marked present, init the IGP 3 PHY manually */ ++ if (((er32(EECD) & E1000_EECD_PRES) == 0) && ++ (hw->phy.type == e1000_phy_igp_3)) { ++ e1000_phy_init_script_igp3(hw); ++ } ++ + return 0; + } + +diff -r bd70f2f305c6 drivers/net/e1000e/kcompat.c +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/e1000e/kcompat.c Mon Jun 15 11:45:35 2009 +0100 +@@ -0,0 +1,417 @@ ++/******************************************************************************* ++ ++ Intel PRO/1000 Linux driver ++ Copyright(c) 1999 - 2009 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ Linux NICS ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++#include "e1000.h" ++#include "kcompat.h" ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,13) ) ++ ++/**************************************/ ++/* PCI DMA MAPPING */ ++ ++#if defined(CONFIG_HIGHMEM) ++ ++#ifndef PCI_DRAM_OFFSET ++#define PCI_DRAM_OFFSET 0 ++#endif ++ ++u64 ++_kc_pci_map_page(struct pci_dev *dev, struct page *page, unsigned long offset, ++ size_t size, int direction) ++{ ++ return (((u64) (page - mem_map) << PAGE_SHIFT) + offset + ++ PCI_DRAM_OFFSET); ++} ++ ++#else /* CONFIG_HIGHMEM */ ++ ++u64 ++_kc_pci_map_page(struct pci_dev *dev, struct page *page, unsigned long offset, ++ size_t size, int direction) ++{ ++ return pci_map_single(dev, (void *)page_address(page) + offset, size, ++ direction); ++} ++ ++#endif /* CONFIG_HIGHMEM */ ++ ++void ++_kc_pci_unmap_page(struct pci_dev *dev, u64 dma_addr, size_t size, ++ int direction) ++{ ++ return pci_unmap_single(dev, dma_addr, size, direction); ++} ++ ++#endif /* 2.4.13 => 2.4.3 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,3) ) ++ ++/**************************************/ ++/* PCI DRIVER API */ ++ ++int ++_kc_pci_set_dma_mask(struct pci_dev *dev, dma_addr_t mask) ++{ ++ if (!pci_dma_supported(dev, mask)) ++ return -EIO; ++ dev->dma_mask = mask; ++ return 0; ++} ++ ++int ++_kc_pci_request_regions(struct pci_dev *dev, char *res_name) ++{ ++ int i; ++ ++ for (i = 0; i < 6; i++) { ++ if (pci_resource_len(dev, i) == 0) ++ continue; ++ ++ if (pci_resource_flags(dev, i) & IORESOURCE_IO) { ++ if (!request_region(pci_resource_start(dev, i), pci_resource_len(dev, i), res_name)) { ++ pci_release_regions(dev); ++ return -EBUSY; ++ } ++ } else if (pci_resource_flags(dev, i) & IORESOURCE_MEM) { ++ if (!request_mem_region(pci_resource_start(dev, i), pci_resource_len(dev, i), res_name)) { ++ pci_release_regions(dev); ++ return -EBUSY; ++ } ++ } ++ } ++ return 0; ++} ++ ++void ++_kc_pci_release_regions(struct pci_dev *dev) ++{ ++ int i; ++ ++ for (i = 0; i < 6; i++) { ++ if (pci_resource_len(dev, i) == 0) ++ continue; ++ ++ if (pci_resource_flags(dev, i) & IORESOURCE_IO) ++ release_region(pci_resource_start(dev, i), pci_resource_len(dev, i)); ++ ++ else if (pci_resource_flags(dev, i) & IORESOURCE_MEM) ++ release_mem_region(pci_resource_start(dev, i), pci_resource_len(dev, i)); ++ } ++} ++ ++/**************************************/ ++/* NETWORK DRIVER API */ ++ ++struct net_device * ++_kc_alloc_etherdev(int sizeof_priv) ++{ ++ struct net_device *dev; ++ int alloc_size; ++ ++ alloc_size = sizeof(*dev) + sizeof_priv + IFNAMSIZ + 31; ++ dev = kmalloc(alloc_size, GFP_KERNEL); ++ if (!dev) ++ return NULL; ++ memset(dev, 0, alloc_size); ++ ++ if (sizeof_priv) ++ dev->priv = (void *) (((unsigned long)(dev + 1) + 31) & ~31); ++ dev->name[0] = '\0'; ++ ether_setup(dev); ++ ++ return dev; ++} ++ ++int ++_kc_is_valid_ether_addr(u8 *addr) ++{ ++ const char zaddr[6] = { 0, }; ++ ++ return !(addr[0] & 1) && memcmp(addr, zaddr, 6); ++} ++ ++#endif /* 2.4.3 => 2.4.0 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,6) ) ++ ++int ++_kc_pci_set_power_state(struct pci_dev *dev, int state) ++{ ++ return 0; ++} ++ ++int ++_kc_pci_enable_wake(struct pci_dev *pdev, u32 state, int enable) ++{ ++ return 0; ++} ++ ++#endif /* 2.4.6 => 2.4.3 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) ) ++void _kc_skb_fill_page_desc(struct sk_buff *skb, int i, struct page *page, ++ int off, int size) ++{ ++ skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; ++ frag->page = page; ++ frag->page_offset = off; ++ frag->size = size; ++ skb_shinfo(skb)->nr_frags = i + 1; ++} ++ ++/* ++ * Original Copyright: ++ * find_next_bit.c: fallback find next bit implementation ++ * ++ * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. ++ * Written by David Howells (dhowells@redhat.com) ++ */ ++ ++/** ++ * find_next_bit - find the next set bit in a memory region ++ * @addr: The address to base the search on ++ * @offset: The bitnumber to start searching at ++ * @size: The maximum size to search ++ */ ++unsigned long find_next_bit(const unsigned long *addr, unsigned long size, ++ unsigned long offset) ++{ ++ const unsigned long *p = addr + BITOP_WORD(offset); ++ unsigned long result = offset & ~(BITS_PER_LONG-1); ++ unsigned long tmp; ++ ++ if (offset >= size) ++ return size; ++ size -= result; ++ offset %= BITS_PER_LONG; ++ if (offset) { ++ tmp = *(p++); ++ tmp &= (~0UL << offset); ++ if (size < BITS_PER_LONG) ++ goto found_first; ++ if (tmp) ++ goto found_middle; ++ size -= BITS_PER_LONG; ++ result += BITS_PER_LONG; ++ } ++ while (size & ~(BITS_PER_LONG-1)) { ++ if ((tmp = *(p++))) ++ goto found_middle; ++ result += BITS_PER_LONG; ++ size -= BITS_PER_LONG; ++ } ++ if (!size) ++ return result; ++ tmp = *p; ++ ++found_first: ++ tmp &= (~0UL >> (BITS_PER_LONG - size)); ++ if (tmp == 0UL) /* Are any bits set? */ ++ return result + size; /* Nope. */ ++found_middle: ++ return result + ffs(tmp); ++} ++ ++#endif /* 2.6.0 => 2.4.6 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,14) ) ++void *_kc_kzalloc(size_t size, int flags) ++{ ++ void *ret = kmalloc(size, flags); ++ if (ret) ++ memset(ret, 0, size); ++ return ret; ++} ++#endif /* <= 2.6.13 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18) ) ++struct sk_buff *_kc_netdev_alloc_skb(struct net_device *dev, ++ unsigned int length) ++{ ++ /* 16 == NET_PAD_SKB */ ++ struct sk_buff *skb; ++ skb = alloc_skb(length + 16, GFP_ATOMIC); ++ if (likely(skb != NULL)) { ++ skb_reserve(skb, 16); ++ skb->dev = dev; ++ } ++ return skb; ++} ++#endif /* <= 2.6.17 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) ) ++int _kc_pci_save_state(struct pci_dev *pdev) ++{ ++ struct net_device *netdev = pci_get_drvdata(pdev); ++ struct adapter_struct *adapter = netdev_priv(netdev); ++ int size = PCI_CONFIG_SPACE_LEN, i; ++ u16 pcie_cap_offset = pci_find_capability(pdev, PCI_CAP_ID_EXP); ++ u16 pcie_link_status; ++ ++ if (pcie_cap_offset) { ++ if (!pci_read_config_word(pdev, ++ pcie_cap_offset + PCIE_LINK_STATUS, ++ &pcie_link_status)) ++ size = PCIE_CONFIG_SPACE_LEN; ++ } ++ pci_config_space_ich8lan(); ++#ifdef HAVE_PCI_ERS ++ if (adapter->config_space == NULL) ++#else ++ WARN_ON(adapter->config_space != NULL); ++#endif ++ adapter->config_space = kmalloc(size, GFP_KERNEL); ++ if (!adapter->config_space) { ++ printk(KERN_ERR "Out of memory in pci_save_state\n"); ++ return -ENOMEM; ++ } ++ for (i = 0; i < (size / 4); i++) ++ pci_read_config_dword(pdev, i * 4, &adapter->config_space[i]); ++ return 0; ++} ++ ++void _kc_pci_restore_state(struct pci_dev * pdev) ++{ ++ struct net_device *netdev = pci_get_drvdata(pdev); ++ struct adapter_struct *adapter = netdev_priv(netdev); ++ int size = PCI_CONFIG_SPACE_LEN, i; ++ u16 pcie_cap_offset; ++ u16 pcie_link_status; ++ ++ if (adapter->config_space != NULL) { ++ pcie_cap_offset = pci_find_capability(pdev, PCI_CAP_ID_EXP); ++ if (pcie_cap_offset && ++ !pci_read_config_word(pdev, ++ pcie_cap_offset + PCIE_LINK_STATUS, ++ &pcie_link_status)) ++ size = PCIE_CONFIG_SPACE_LEN; ++ ++ pci_config_space_ich8lan(); ++ for (i = 0; i < (size / 4); i++) ++ pci_write_config_dword(pdev, i * 4, adapter->config_space[i]); ++#ifndef HAVE_PCI_ERS ++ kfree(adapter->config_space); ++ adapter->config_space = NULL; ++#endif ++ } ++} ++ ++#ifdef HAVE_PCI_ERS ++void _kc_free_netdev(struct net_device *netdev) ++{ ++ struct adapter_struct *adapter = netdev_priv(netdev); ++ ++ if (adapter->config_space != NULL) ++ kfree(adapter->config_space); ++#ifdef CONFIG_SYSFS ++ if (netdev->reg_state == NETREG_UNINITIALIZED) { ++ kfree((char *)netdev - netdev->padded); ++ } else { ++ BUG_ON(netdev->reg_state != NETREG_UNREGISTERED); ++ netdev->reg_state = NETREG_RELEASED; ++ class_device_put(&netdev->class_dev); ++ } ++#else ++ kfree((char *)netdev - netdev->padded); ++#endif ++} ++#endif ++#endif /* <= 2.6.18 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) ) ++#ifdef NAPI ++/* this function returns the true netdev of the napi struct */ ++struct net_device * napi_to_netdev(struct napi_struct *napi) ++{ ++ struct adapter_struct *adapter = container_of(napi, ++ struct adapter_struct, ++ napi); ++ return adapter->netdev; ++} ++ ++int __kc_adapter_clean(struct net_device *netdev, int *budget) ++{ ++ int work_done; ++ int work_to_do = min(*budget, netdev->quota); ++ struct adapter_struct *adapter = netdev_priv(netdev); ++ struct napi_struct *napi = &adapter->napi; ++ work_done = napi->poll(napi, work_to_do); ++ *budget -= work_done; ++ netdev->quota -= work_done; ++ return (work_done >= work_to_do) ? 1 : 0; ++} ++#endif /* NAPI */ ++#endif /* <= 2.6.24 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27) ) ++#ifdef HAVE_TX_MQ ++void _kc_netif_tx_stop_all_queues(struct net_device *netdev) ++{ ++ struct adapter_struct *adapter = netdev_priv(netdev); ++ int i; ++ ++ netif_stop_queue(netdev); ++ if (netif_is_multiqueue(netdev)) ++ for (i = 0; i < adapter->num_tx_queues; i++) ++ netif_stop_subqueue(netdev, i); ++} ++void _kc_netif_tx_wake_all_queues(struct net_device *netdev) ++{ ++ struct adapter_struct *adapter = netdev_priv(netdev); ++ int i; ++ ++ netif_wake_queue(netdev); ++ if (netif_is_multiqueue(netdev)) ++ for (i = 0; i < adapter->num_tx_queues; i++) ++ netif_wake_subqueue(netdev, i); ++} ++void _kc_netif_tx_start_all_queues(struct net_device *netdev) ++{ ++ struct adapter_struct *adapter = netdev_priv(netdev); ++ int i; ++ ++ netif_start_queue(netdev); ++ if (netif_is_multiqueue(netdev)) ++ for (i = 0; i < adapter->num_tx_queues; i++) ++ netif_start_subqueue(netdev, i); ++} ++#endif /* HAVE_TX_MQ */ ++#endif /* < 2.6.27 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29) ) ++#endif /* < 2.6.29 */ +diff -r bd70f2f305c6 drivers/net/e1000e/kcompat.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/e1000e/kcompat.h Mon Jun 15 11:45:35 2009 +0100 +@@ -0,0 +1,1653 @@ ++/******************************************************************************* ++ ++ Intel PRO/1000 Linux driver ++ Copyright(c) 1999 - 2009 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ Linux NICS ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++#ifndef _KCOMPAT_H_ ++#define _KCOMPAT_H_ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++/* NAPI enable/disable flags here */ ++#define NAPI ++#ifdef E1000E_NO_NAPI ++#undef NAPI ++#endif ++ ++#define adapter_struct e1000_adapter ++#define CONFIG_E1000E_MSIX ++ ++/* and finally set defines so that the code sees the changes */ ++#ifdef NAPI ++#ifndef CONFIG_E1000E_NAPI ++#define CONFIG_E1000E_NAPI ++#endif ++#else ++#undef CONFIG_E1000E_NAPI ++#endif /* NAPI */ ++ ++/* MSI compatibility code for all kernels and drivers */ ++#ifdef DISABLE_PCI_MSI ++#undef CONFIG_PCI_MSI ++#endif ++#ifndef CONFIG_PCI_MSI ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,8) ) ++struct msix_entry { ++ u16 vector; /* kernel uses to write allocated vector */ ++ u16 entry; /* driver uses to specify entry, OS writes */ ++}; ++#endif ++#define pci_enable_msi(a) -ENOTSUPP ++#define pci_disable_msi(a) do {} while (0) ++#define pci_enable_msix(a, b, c) -ENOTSUPP ++#define pci_disable_msix(a) do {} while (0) ++#define msi_remove_pci_irq_vectors(a) do {} while (0) ++#endif /* CONFIG_PCI_MSI */ ++#ifdef DISABLE_PM ++#undef CONFIG_PM ++#endif ++ ++#ifdef DISABLE_NET_POLL_CONTROLLER ++#undef CONFIG_NET_POLL_CONTROLLER ++#endif ++ ++#ifndef PMSG_SUSPEND ++#define PMSG_SUSPEND 3 ++#endif ++ ++/* generic boolean compatibility */ ++#undef TRUE ++#undef FALSE ++#define TRUE true ++#define FALSE false ++#ifdef GCC_VERSION ++#if ( GCC_VERSION < 3000 ) ++#define _Bool char ++#endif ++#endif ++#ifndef bool ++#define bool _Bool ++#define true 1 ++#define false 0 ++#endif ++ ++ ++#ifndef module_param ++#define module_param(v,t,p) MODULE_PARM(v, "i"); ++#endif ++ ++#ifndef DMA_64BIT_MASK ++#define DMA_64BIT_MASK 0xffffffffffffffffULL ++#endif ++ ++#ifndef DMA_32BIT_MASK ++#define DMA_32BIT_MASK 0x00000000ffffffffULL ++#endif ++ ++#ifndef PCI_CAP_ID_EXP ++#define PCI_CAP_ID_EXP 0x10 ++#endif ++ ++#ifndef PCIE_LINK_STATE_L0S ++#define PCIE_LINK_STATE_L0S 1 ++#endif ++ ++#ifndef mmiowb ++#ifdef CONFIG_IA64 ++#define mmiowb() asm volatile ("mf.a" ::: "memory") ++#else ++#define mmiowb() ++#endif ++#endif ++ ++#ifndef IRQ_HANDLED ++#define irqreturn_t void ++#define IRQ_HANDLED ++#define IRQ_NONE ++#endif ++ ++#ifndef SET_NETDEV_DEV ++#define SET_NETDEV_DEV(net, pdev) ++#endif ++ ++#ifndef HAVE_FREE_NETDEV ++#define free_netdev(x) kfree(x) ++#endif ++ ++#ifdef HAVE_POLL_CONTROLLER ++#define CONFIG_NET_POLL_CONTROLLER ++#endif ++ ++#ifndef NETDEV_TX_OK ++#define NETDEV_TX_OK 0 ++#endif ++ ++#ifndef NETDEV_TX_BUSY ++#define NETDEV_TX_BUSY 1 ++#endif ++ ++#ifndef NETDEV_TX_LOCKED ++#define NETDEV_TX_LOCKED -1 ++#endif ++ ++#ifndef SKB_DATAREF_SHIFT ++/* if we do not have the infrastructure to detect if skb_header is cloned ++ just return false in all cases */ ++#define skb_header_cloned(x) 0 ++#endif ++ ++#ifndef NETIF_F_GSO ++#define gso_size tso_size ++#define gso_segs tso_segs ++#endif ++ ++#ifndef NETIF_F_GRO ++#define vlan_gro_receive(_napi, _vlgrp, _vlan, _skb) \ ++ vlan_hwaccel_receive_skb(_skb, _vlgrp, _vlan) ++#define napi_gro_receive(_napi, _skb) netif_receive_skb(_skb) ++#endif ++ ++#ifndef CHECKSUM_PARTIAL ++#define CHECKSUM_PARTIAL CHECKSUM_HW ++#define CHECKSUM_COMPLETE CHECKSUM_HW ++#endif ++ ++#ifndef __read_mostly ++#define __read_mostly ++#endif ++ ++#ifndef HAVE_NETIF_MSG ++#define HAVE_NETIF_MSG 1 ++enum { ++ NETIF_MSG_DRV = 0x0001, ++ NETIF_MSG_PROBE = 0x0002, ++ NETIF_MSG_LINK = 0x0004, ++ NETIF_MSG_TIMER = 0x0008, ++ NETIF_MSG_IFDOWN = 0x0010, ++ NETIF_MSG_IFUP = 0x0020, ++ NETIF_MSG_RX_ERR = 0x0040, ++ NETIF_MSG_TX_ERR = 0x0080, ++ NETIF_MSG_TX_QUEUED = 0x0100, ++ NETIF_MSG_INTR = 0x0200, ++ NETIF_MSG_TX_DONE = 0x0400, ++ NETIF_MSG_RX_STATUS = 0x0800, ++ NETIF_MSG_PKTDATA = 0x1000, ++ NETIF_MSG_HW = 0x2000, ++ NETIF_MSG_WOL = 0x4000, ++}; ++ ++#else ++#define NETIF_MSG_HW 0x2000 ++#define NETIF_MSG_WOL 0x4000 ++#endif /* HAVE_NETIF_MSG */ ++ ++#ifndef MII_RESV1 ++#define MII_RESV1 0x17 /* Reserved... */ ++#endif ++ ++#ifndef unlikely ++#define unlikely(_x) _x ++#define likely(_x) _x ++#endif ++ ++#ifndef WARN_ON ++#define WARN_ON(x) ++#endif ++ ++#ifndef PCI_DEVICE ++#define PCI_DEVICE(vend,dev) \ ++ .vendor = (vend), .device = (dev), \ ++ .subvendor = PCI_ANY_ID, .subdevice = PCI_ANY_ID ++#endif ++ ++#ifndef num_online_cpus ++#define num_online_cpus() smp_num_cpus ++#endif ++ ++#ifndef _LINUX_RANDOM_H ++#include ++#endif ++ ++#ifndef DECLARE_BITMAP ++#ifndef BITS_TO_LONGS ++#define BITS_TO_LONGS(bits) (((bits)+BITS_PER_LONG-1)/BITS_PER_LONG) ++#endif ++#define DECLARE_BITMAP(name,bits) long name[BITS_TO_LONGS(bits)] ++#endif ++ ++#ifndef VLAN_HLEN ++#define VLAN_HLEN 4 ++#endif ++ ++#ifndef VLAN_ETH_HLEN ++#define VLAN_ETH_HLEN 18 ++#endif ++ ++#ifndef VLAN_ETH_FRAME_LEN ++#define VLAN_ETH_FRAME_LEN 1518 ++#endif ++ ++#ifndef DCA_GET_TAG_TWO_ARGS ++#define dca3_get_tag(a,b) dca_get_tag(b) ++#endif ++ ++ ++/*****************************************************************************/ ++/* Installations with ethtool version without eeprom, adapter id, or statistics ++ * support */ ++ ++#ifndef ETH_GSTRING_LEN ++#define ETH_GSTRING_LEN 32 ++#endif ++ ++#ifndef ETHTOOL_GSTATS ++#define ETHTOOL_GSTATS 0x1d ++#undef ethtool_drvinfo ++#define ethtool_drvinfo k_ethtool_drvinfo ++struct k_ethtool_drvinfo { ++ u32 cmd; ++ char driver[32]; ++ char version[32]; ++ char fw_version[32]; ++ char bus_info[32]; ++ char reserved1[32]; ++ char reserved2[16]; ++ u32 n_stats; ++ u32 testinfo_len; ++ u32 eedump_len; ++ u32 regdump_len; ++}; ++ ++struct ethtool_stats { ++ u32 cmd; ++ u32 n_stats; ++ u64 data[0]; ++}; ++#endif /* ETHTOOL_GSTATS */ ++ ++#ifndef ETHTOOL_PHYS_ID ++#define ETHTOOL_PHYS_ID 0x1c ++#endif /* ETHTOOL_PHYS_ID */ ++ ++#ifndef ETHTOOL_GSTRINGS ++#define ETHTOOL_GSTRINGS 0x1b ++enum ethtool_stringset { ++ ETH_SS_TEST = 0, ++ ETH_SS_STATS, ++}; ++struct ethtool_gstrings { ++ u32 cmd; /* ETHTOOL_GSTRINGS */ ++ u32 string_set; /* string set id e.c. ETH_SS_TEST, etc*/ ++ u32 len; /* number of strings in the string set */ ++ u8 data[0]; ++}; ++#endif /* ETHTOOL_GSTRINGS */ ++ ++#ifndef ETHTOOL_TEST ++#define ETHTOOL_TEST 0x1a ++enum ethtool_test_flags { ++ ETH_TEST_FL_OFFLINE = (1 << 0), ++ ETH_TEST_FL_FAILED = (1 << 1), ++}; ++struct ethtool_test { ++ u32 cmd; ++ u32 flags; ++ u32 reserved; ++ u32 len; ++ u64 data[0]; ++}; ++#endif /* ETHTOOL_TEST */ ++ ++#ifndef ETHTOOL_GEEPROM ++#define ETHTOOL_GEEPROM 0xb ++#undef ETHTOOL_GREGS ++struct ethtool_eeprom { ++ u32 cmd; ++ u32 magic; ++ u32 offset; ++ u32 len; ++ u8 data[0]; ++}; ++ ++struct ethtool_value { ++ u32 cmd; ++ u32 data; ++}; ++#endif /* ETHTOOL_GEEPROM */ ++ ++#ifndef ETHTOOL_GLINK ++#define ETHTOOL_GLINK 0xa ++#endif /* ETHTOOL_GLINK */ ++ ++#ifndef ETHTOOL_GREGS ++#define ETHTOOL_GREGS 0x00000004 /* Get NIC registers */ ++#define ethtool_regs _kc_ethtool_regs ++/* for passing big chunks of data */ ++struct _kc_ethtool_regs { ++ u32 cmd; ++ u32 version; /* driver-specific, indicates different chips/revs */ ++ u32 len; /* bytes */ ++ u8 data[0]; ++}; ++#endif /* ETHTOOL_GREGS */ ++ ++#ifndef ETHTOOL_GMSGLVL ++#define ETHTOOL_GMSGLVL 0x00000007 /* Get driver message level */ ++#endif ++#ifndef ETHTOOL_SMSGLVL ++#define ETHTOOL_SMSGLVL 0x00000008 /* Set driver msg level, priv. */ ++#endif ++#ifndef ETHTOOL_NWAY_RST ++#define ETHTOOL_NWAY_RST 0x00000009 /* Restart autonegotiation, priv */ ++#endif ++#ifndef ETHTOOL_GLINK ++#define ETHTOOL_GLINK 0x0000000a /* Get link status */ ++#endif ++#ifndef ETHTOOL_GEEPROM ++#define ETHTOOL_GEEPROM 0x0000000b /* Get EEPROM data */ ++#endif ++#ifndef ETHTOOL_SEEPROM ++#define ETHTOOL_SEEPROM 0x0000000c /* Set EEPROM data */ ++#endif ++#ifndef ETHTOOL_GCOALESCE ++#define ETHTOOL_GCOALESCE 0x0000000e /* Get coalesce config */ ++/* for configuring coalescing parameters of chip */ ++#define ethtool_coalesce _kc_ethtool_coalesce ++struct _kc_ethtool_coalesce { ++ u32 cmd; /* ETHTOOL_{G,S}COALESCE */ ++ ++ /* How many usecs to delay an RX interrupt after ++ * a packet arrives. If 0, only rx_max_coalesced_frames ++ * is used. ++ */ ++ u32 rx_coalesce_usecs; ++ ++ /* How many packets to delay an RX interrupt after ++ * a packet arrives. If 0, only rx_coalesce_usecs is ++ * used. It is illegal to set both usecs and max frames ++ * to zero as this would cause RX interrupts to never be ++ * generated. ++ */ ++ u32 rx_max_coalesced_frames; ++ ++ /* Same as above two parameters, except that these values ++ * apply while an IRQ is being serviced by the host. Not ++ * all cards support this feature and the values are ignored ++ * in that case. ++ */ ++ u32 rx_coalesce_usecs_irq; ++ u32 rx_max_coalesced_frames_irq; ++ ++ /* How many usecs to delay a TX interrupt after ++ * a packet is sent. If 0, only tx_max_coalesced_frames ++ * is used. ++ */ ++ u32 tx_coalesce_usecs; ++ ++ /* How many packets to delay a TX interrupt after ++ * a packet is sent. If 0, only tx_coalesce_usecs is ++ * used. It is illegal to set both usecs and max frames ++ * to zero as this would cause TX interrupts to never be ++ * generated. ++ */ ++ u32 tx_max_coalesced_frames; ++ ++ /* Same as above two parameters, except that these values ++ * apply while an IRQ is being serviced by the host. Not ++ * all cards support this feature and the values are ignored ++ * in that case. ++ */ ++ u32 tx_coalesce_usecs_irq; ++ u32 tx_max_coalesced_frames_irq; ++ ++ /* How many usecs to delay in-memory statistics ++ * block updates. Some drivers do not have an in-memory ++ * statistic block, and in such cases this value is ignored. ++ * This value must not be zero. ++ */ ++ u32 stats_block_coalesce_usecs; ++ ++ /* Adaptive RX/TX coalescing is an algorithm implemented by ++ * some drivers to improve latency under low packet rates and ++ * improve throughput under high packet rates. Some drivers ++ * only implement one of RX or TX adaptive coalescing. Anything ++ * not implemented by the driver causes these values to be ++ * silently ignored. ++ */ ++ u32 use_adaptive_rx_coalesce; ++ u32 use_adaptive_tx_coalesce; ++ ++ /* When the packet rate (measured in packets per second) ++ * is below pkt_rate_low, the {rx,tx}_*_low parameters are ++ * used. ++ */ ++ u32 pkt_rate_low; ++ u32 rx_coalesce_usecs_low; ++ u32 rx_max_coalesced_frames_low; ++ u32 tx_coalesce_usecs_low; ++ u32 tx_max_coalesced_frames_low; ++ ++ /* When the packet rate is below pkt_rate_high but above ++ * pkt_rate_low (both measured in packets per second) the ++ * normal {rx,tx}_* coalescing parameters are used. ++ */ ++ ++ /* When the packet rate is (measured in packets per second) ++ * is above pkt_rate_high, the {rx,tx}_*_high parameters are ++ * used. ++ */ ++ u32 pkt_rate_high; ++ u32 rx_coalesce_usecs_high; ++ u32 rx_max_coalesced_frames_high; ++ u32 tx_coalesce_usecs_high; ++ u32 tx_max_coalesced_frames_high; ++ ++ /* How often to do adaptive coalescing packet rate sampling, ++ * measured in seconds. Must not be zero. ++ */ ++ u32 rate_sample_interval; ++}; ++#endif /* ETHTOOL_GCOALESCE */ ++ ++#ifndef ETHTOOL_SCOALESCE ++#define ETHTOOL_SCOALESCE 0x0000000f /* Set coalesce config. */ ++#endif ++#ifndef ETHTOOL_GRINGPARAM ++#define ETHTOOL_GRINGPARAM 0x00000010 /* Get ring parameters */ ++/* for configuring RX/TX ring parameters */ ++#define ethtool_ringparam _kc_ethtool_ringparam ++struct _kc_ethtool_ringparam { ++ u32 cmd; /* ETHTOOL_{G,S}RINGPARAM */ ++ ++ /* Read only attributes. These indicate the maximum number ++ * of pending RX/TX ring entries the driver will allow the ++ * user to set. ++ */ ++ u32 rx_max_pending; ++ u32 rx_mini_max_pending; ++ u32 rx_jumbo_max_pending; ++ u32 tx_max_pending; ++ ++ /* Values changeable by the user. The valid values are ++ * in the range 1 to the "*_max_pending" counterpart above. ++ */ ++ u32 rx_pending; ++ u32 rx_mini_pending; ++ u32 rx_jumbo_pending; ++ u32 tx_pending; ++}; ++#endif /* ETHTOOL_GRINGPARAM */ ++ ++#ifndef ETHTOOL_SRINGPARAM ++#define ETHTOOL_SRINGPARAM 0x00000011 /* Set ring parameters, priv. */ ++#endif ++#ifndef ETHTOOL_GPAUSEPARAM ++#define ETHTOOL_GPAUSEPARAM 0x00000012 /* Get pause parameters */ ++/* for configuring link flow control parameters */ ++#define ethtool_pauseparam _kc_ethtool_pauseparam ++struct _kc_ethtool_pauseparam { ++ u32 cmd; /* ETHTOOL_{G,S}PAUSEPARAM */ ++ ++ /* If the link is being auto-negotiated (via ethtool_cmd.autoneg ++ * being true) the user may set 'autoneg' here non-zero to have the ++ * pause parameters be auto-negotiated too. In such a case, the ++ * {rx,tx}_pause values below determine what capabilities are ++ * advertised. ++ * ++ * If 'autoneg' is zero or the link is not being auto-negotiated, ++ * then {rx,tx}_pause force the driver to use/not-use pause ++ * flow control. ++ */ ++ u32 autoneg; ++ u32 rx_pause; ++ u32 tx_pause; ++}; ++#endif /* ETHTOOL_GPAUSEPARAM */ ++ ++#ifndef ETHTOOL_SPAUSEPARAM ++#define ETHTOOL_SPAUSEPARAM 0x00000013 /* Set pause parameters. */ ++#endif ++#ifndef ETHTOOL_GRXCSUM ++#define ETHTOOL_GRXCSUM 0x00000014 /* Get RX hw csum enable (ethtool_value) */ ++#endif ++#ifndef ETHTOOL_SRXCSUM ++#define ETHTOOL_SRXCSUM 0x00000015 /* Set RX hw csum enable (ethtool_value) */ ++#endif ++#ifndef ETHTOOL_GTXCSUM ++#define ETHTOOL_GTXCSUM 0x00000016 /* Get TX hw csum enable (ethtool_value) */ ++#endif ++#ifndef ETHTOOL_STXCSUM ++#define ETHTOOL_STXCSUM 0x00000017 /* Set TX hw csum enable (ethtool_value) */ ++#endif ++#ifndef ETHTOOL_GSG ++#define ETHTOOL_GSG 0x00000018 /* Get scatter-gather enable ++ * (ethtool_value) */ ++#endif ++#ifndef ETHTOOL_SSG ++#define ETHTOOL_SSG 0x00000019 /* Set scatter-gather enable ++ * (ethtool_value). */ ++#endif ++#ifndef ETHTOOL_TEST ++#define ETHTOOL_TEST 0x0000001a /* execute NIC self-test, priv. */ ++#endif ++#ifndef ETHTOOL_GSTRINGS ++#define ETHTOOL_GSTRINGS 0x0000001b /* get specified string set */ ++#endif ++#ifndef ETHTOOL_PHYS_ID ++#define ETHTOOL_PHYS_ID 0x0000001c /* identify the NIC */ ++#endif ++#ifndef ETHTOOL_GSTATS ++#define ETHTOOL_GSTATS 0x0000001d /* get NIC-specific statistics */ ++#endif ++#ifndef ETHTOOL_GTSO ++#define ETHTOOL_GTSO 0x0000001e /* Get TSO enable (ethtool_value) */ ++#endif ++#ifndef ETHTOOL_STSO ++#define ETHTOOL_STSO 0x0000001f /* Set TSO enable (ethtool_value) */ ++#endif ++ ++#ifndef ETHTOOL_BUSINFO_LEN ++#define ETHTOOL_BUSINFO_LEN 32 ++#endif ++ ++/*****************************************************************************/ ++/* 2.4.3 => 2.4.0 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,3) ) ++ ++/**************************************/ ++/* PCI DRIVER API */ ++ ++#ifndef pci_set_dma_mask ++#define pci_set_dma_mask _kc_pci_set_dma_mask ++extern int _kc_pci_set_dma_mask(struct pci_dev *dev, dma_addr_t mask); ++#endif ++ ++#ifndef pci_request_regions ++#define pci_request_regions _kc_pci_request_regions ++extern int _kc_pci_request_regions(struct pci_dev *pdev, char *res_name); ++#endif ++ ++#ifndef pci_release_regions ++#define pci_release_regions _kc_pci_release_regions ++extern void _kc_pci_release_regions(struct pci_dev *pdev); ++#endif ++ ++/**************************************/ ++/* NETWORK DRIVER API */ ++ ++#ifndef alloc_etherdev ++#define alloc_etherdev _kc_alloc_etherdev ++extern struct net_device * _kc_alloc_etherdev(int sizeof_priv); ++#endif ++ ++#ifndef is_valid_ether_addr ++#define is_valid_ether_addr _kc_is_valid_ether_addr ++extern int _kc_is_valid_ether_addr(u8 *addr); ++#endif ++ ++/**************************************/ ++/* MISCELLANEOUS */ ++ ++#ifndef INIT_TQUEUE ++#define INIT_TQUEUE(_tq, _routine, _data) \ ++ do { \ ++ INIT_LIST_HEAD(&(_tq)->list); \ ++ (_tq)->sync = 0; \ ++ (_tq)->routine = _routine; \ ++ (_tq)->data = _data; \ ++ } while (0) ++#endif ++ ++#endif /* 2.4.3 => 2.4.0 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,5) ) ++/* Generic MII registers. */ ++#define MII_BMCR 0x00 /* Basic mode control register */ ++#define MII_BMSR 0x01 /* Basic mode status register */ ++#define MII_PHYSID1 0x02 /* PHYS ID 1 */ ++#define MII_PHYSID2 0x03 /* PHYS ID 2 */ ++#define MII_ADVERTISE 0x04 /* Advertisement control reg */ ++#define MII_LPA 0x05 /* Link partner ability reg */ ++#define MII_EXPANSION 0x06 /* Expansion register */ ++/* Basic mode control register. */ ++#define BMCR_FULLDPLX 0x0100 /* Full duplex */ ++#define BMCR_ANENABLE 0x1000 /* Enable auto negotiation */ ++/* Basic mode status register. */ ++#define BMSR_ERCAP 0x0001 /* Ext-reg capability */ ++#define BMSR_ANEGCAPABLE 0x0008 /* Able to do auto-negotiation */ ++#define BMSR_10HALF 0x0800 /* Can do 10mbps, half-duplex */ ++#define BMSR_10FULL 0x1000 /* Can do 10mbps, full-duplex */ ++#define BMSR_100HALF 0x2000 /* Can do 100mbps, half-duplex */ ++#define BMSR_100FULL 0x4000 /* Can do 100mbps, full-duplex */ ++/* Advertisement control register. */ ++#define ADVERTISE_CSMA 0x0001 /* Only selector supported */ ++#define ADVERTISE_10HALF 0x0020 /* Try for 10mbps half-duplex */ ++#define ADVERTISE_10FULL 0x0040 /* Try for 10mbps full-duplex */ ++#define ADVERTISE_100HALF 0x0080 /* Try for 100mbps half-duplex */ ++#define ADVERTISE_100FULL 0x0100 /* Try for 100mbps full-duplex */ ++#define ADVERTISE_ALL (ADVERTISE_10HALF | ADVERTISE_10FULL | \ ++ ADVERTISE_100HALF | ADVERTISE_100FULL) ++/* Expansion register for auto-negotiation. */ ++#define EXPANSION_ENABLENPAGE 0x0004 /* This enables npage words */ ++#endif ++ ++/*****************************************************************************/ ++/* 2.4.6 => 2.4.3 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,6) ) ++ ++#ifndef pci_set_power_state ++#define pci_set_power_state _kc_pci_set_power_state ++extern int _kc_pci_set_power_state(struct pci_dev *dev, int state); ++#endif ++ ++#ifndef pci_enable_wake ++#define pci_enable_wake _kc_pci_enable_wake ++extern int _kc_pci_enable_wake(struct pci_dev *pdev, u32 state, int enable); ++#endif ++ ++#ifndef pci_disable_device ++#define pci_disable_device _kc_pci_disable_device ++extern void _kc_pci_disable_device(struct pci_dev *pdev); ++#endif ++ ++/* PCI PM entry point syntax changed, so don't support suspend/resume */ ++#undef CONFIG_PM ++ ++#endif /* 2.4.6 => 2.4.3 */ ++ ++#ifndef HAVE_PCI_SET_MWI ++#define pci_set_mwi(X) pci_write_config_word(X, \ ++ PCI_COMMAND, adapter->hw.bus.pci_cmd_word | \ ++ PCI_COMMAND_INVALIDATE); ++#define pci_clear_mwi(X) pci_write_config_word(X, \ ++ PCI_COMMAND, adapter->hw.bus.pci_cmd_word & \ ++ ~PCI_COMMAND_INVALIDATE); ++#endif ++ ++/*****************************************************************************/ ++/* 2.4.10 => 2.4.9 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,10) ) ++ ++/**************************************/ ++/* MODULE API */ ++ ++#ifndef MODULE_LICENSE ++ #define MODULE_LICENSE(X) ++#endif ++ ++/**************************************/ ++/* OTHER */ ++ ++#undef min ++#define min(x,y) ({ \ ++ const typeof(x) _x = (x); \ ++ const typeof(y) _y = (y); \ ++ (void) (&_x == &_y); \ ++ _x < _y ? _x : _y; }) ++ ++#undef max ++#define max(x,y) ({ \ ++ const typeof(x) _x = (x); \ ++ const typeof(y) _y = (y); \ ++ (void) (&_x == &_y); \ ++ _x > _y ? _x : _y; }) ++ ++#define min_t(type,x,y) ({ \ ++ type _x = (x); \ ++ type _y = (y); \ ++ _x < _y ? _x : _y; }) ++ ++#define max_t(type,x,y) ({ \ ++ type _x = (x); \ ++ type _y = (y); \ ++ _x > _y ? _x : _y; }) ++ ++#ifndef list_for_each_safe ++#define list_for_each_safe(pos, n, head) \ ++ for (pos = (head)->next, n = pos->next; pos != (head); \ ++ pos = n, n = pos->next) ++#endif ++ ++#endif /* 2.4.10 -> 2.4.6 */ ++ ++ ++/*****************************************************************************/ ++/* 2.4.13 => 2.4.10 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,13) ) ++ ++/**************************************/ ++/* PCI DMA MAPPING */ ++ ++#ifndef virt_to_page ++ #define virt_to_page(v) (mem_map + (virt_to_phys(v) >> PAGE_SHIFT)) ++#endif ++ ++#ifndef pci_map_page ++#define pci_map_page _kc_pci_map_page ++extern u64 _kc_pci_map_page(struct pci_dev *dev, struct page *page, unsigned long offset, size_t size, int direction); ++#endif ++ ++#ifndef pci_unmap_page ++#define pci_unmap_page _kc_pci_unmap_page ++extern void _kc_pci_unmap_page(struct pci_dev *dev, u64 dma_addr, size_t size, int direction); ++#endif ++ ++/* pci_set_dma_mask takes dma_addr_t, which is only 32-bits prior to 2.4.13 */ ++ ++#undef DMA_32BIT_MASK ++#define DMA_32BIT_MASK 0xffffffff ++#undef DMA_64BIT_MASK ++#define DMA_64BIT_MASK 0xffffffff ++ ++/**************************************/ ++/* OTHER */ ++ ++#ifndef cpu_relax ++#define cpu_relax() rep_nop() ++#endif ++ ++#endif /* 2.4.13 => 2.4.10 */ ++ ++/*****************************************************************************/ ++/* 2.4.17 => 2.4.12 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,17) ) ++ ++#ifndef __devexit_p ++ #define __devexit_p(x) &(x) ++#endif ++ ++#endif /* 2.4.17 => 2.4.13 */ ++ ++/*****************************************************************************/ ++/* 2.4.20 => 2.4.19 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,20) ) ++ ++/* we won't support NAPI on less than 2.4.20 */ ++#ifdef NAPI ++#undef CONFIG_E1000_NAPI ++#undef CONFIG_E1000E_NAPI ++#undef CONFIG_IXGB_NAPI ++#endif ++ ++#endif /* 2.4.20 => 2.4.19 */ ++/*****************************************************************************/ ++/* 2.4.22 => 2.4.17 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,22) ) ++#define pci_name(x) ((x)->slot_name) ++#endif ++ ++/*****************************************************************************/ ++/*****************************************************************************/ ++/* 2.4.23 => 2.4.22 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,23) ) ++/*****************************************************************************/ ++#ifdef NAPI ++#ifndef netif_poll_disable ++#define netif_poll_disable(x) _kc_netif_poll_disable(x) ++static inline void _kc_netif_poll_disable(struct net_device *netdev) ++{ ++ while (test_and_set_bit(__LINK_STATE_RX_SCHED, &netdev->state)) { ++ /* No hurry */ ++ current->state = TASK_INTERRUPTIBLE; ++ schedule_timeout(1); ++ } ++} ++#endif ++ ++#ifndef netif_poll_enable ++#define netif_poll_enable(x) _kc_netif_poll_enable(x) ++static inline void _kc_netif_poll_enable(struct net_device *netdev) ++{ ++ clear_bit(__LINK_STATE_RX_SCHED, &netdev->state); ++} ++#endif ++#endif /* NAPI */ ++#ifndef netif_tx_disable ++#define netif_tx_disable(x) _kc_netif_tx_disable(x) ++static inline void _kc_netif_tx_disable(struct net_device *dev) ++{ ++ spin_lock_bh(&dev->xmit_lock); ++ netif_stop_queue(dev); ++ spin_unlock_bh(&dev->xmit_lock); ++} ++#endif ++#endif /* 2.4.23 => 2.4.22 */ ++ ++/*****************************************************************************/ ++/* 2.6.4 => 2.6.0 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,25) || \ ++ ( LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) && \ ++ LINUX_VERSION_CODE < KERNEL_VERSION(2,6,4) ) ) ++#define ETHTOOL_OPS_COMPAT ++#endif /* 2.6.4 => 2.6.0 */ ++ ++/*****************************************************************************/ ++/* 2.5.71 => 2.4.x */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,5,71) ) ++#include ++#define sk_protocol protocol ++ ++#define pci_get_device pci_find_device ++#endif /* 2.5.70 => 2.4.x */ ++ ++/*****************************************************************************/ ++/* < 2.4.27 or 2.6.0 <= 2.6.5 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,27) || \ ++ ( LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) && \ ++ LINUX_VERSION_CODE < KERNEL_VERSION(2,6,5) ) ) ++ ++#ifndef netif_msg_init ++#define netif_msg_init _kc_netif_msg_init ++static inline u32 _kc_netif_msg_init(int debug_value, int default_msg_enable_bits) ++{ ++ /* use default */ ++ if (debug_value < 0 || debug_value >= (sizeof(u32) * 8)) ++ return default_msg_enable_bits; ++ if (debug_value == 0) /* no output */ ++ return 0; ++ /* set low N bits */ ++ return (1 << debug_value) -1; ++} ++#endif ++ ++#endif /* < 2.4.27 or 2.6.0 <= 2.6.5 */ ++/*****************************************************************************/ ++#if (( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,27) ) || \ ++ (( LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) ) && \ ++ ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,3) ))) ++#define netdev_priv(x) x->priv ++#endif ++ ++/*****************************************************************************/ ++/* <= 2.5.0 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) ) ++#undef pci_register_driver ++#define pci_register_driver pci_module_init ++ ++#define dev_err(__unused_dev, format, arg...) \ ++ printk(KERN_ERR "%s: " format, pci_name(adapter->pdev) , ## arg) ++#define dev_warn(__unused_dev, format, arg...) \ ++ printk(KERN_WARNING "%s: " format, pci_name(pdev) , ## arg) ++ ++/* hlist_* code - double linked lists */ ++struct hlist_head { ++ struct hlist_node *first; ++}; ++ ++struct hlist_node { ++ struct hlist_node *next, **pprev; ++}; ++ ++static inline void __hlist_del(struct hlist_node *n) ++{ ++ struct hlist_node *next = n->next; ++ struct hlist_node **pprev = n->pprev; ++ *pprev = next; ++ if (next) ++ next->pprev = pprev; ++} ++ ++static inline void hlist_del(struct hlist_node *n) ++{ ++ __hlist_del(n); ++ n->next = NULL; ++ n->pprev = NULL; ++} ++ ++static inline void hlist_add_head(struct hlist_node *n, struct hlist_head *h) ++{ ++ struct hlist_node *first = h->first; ++ n->next = first; ++ if (first) ++ first->pprev = &n->next; ++ h->first = n; ++ n->pprev = &h->first; ++} ++ ++static inline int hlist_empty(const struct hlist_head *h) ++{ ++ return !h->first; ++} ++#define HLIST_HEAD_INIT { .first = NULL } ++#define HLIST_HEAD(name) struct hlist_head name = { .first = NULL } ++#define INIT_HLIST_HEAD(ptr) ((ptr)->first = NULL) ++static inline void INIT_HLIST_NODE(struct hlist_node *h) ++{ ++ h->next = NULL; ++ h->pprev = NULL; ++} ++#define hlist_entry(ptr, type, member) container_of(ptr,type,member) ++ ++#define hlist_for_each_entry(tpos, pos, head, member) \ ++ for (pos = (head)->first; \ ++ pos && ({ prefetch(pos->next); 1;}) && \ ++ ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ ++ pos = pos->next) ++ ++#define hlist_for_each_entry_safe(tpos, pos, n, head, member) \ ++ for (pos = (head)->first; \ ++ pos && ({ n = pos->next; 1; }) && \ ++ ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ ++ pos = n) ++ ++/* we ignore GFP here */ ++#define dma_alloc_coherent(dv, sz, dma, gfp) \ ++ pci_alloc_consistent(pdev, (sz), (dma)) ++#define dma_free_coherent(dv, sz, addr, dma_addr) \ ++ pci_free_consistent(pdev, (sz), (addr), (dma_addr)) ++ ++#ifndef might_sleep ++#define might_sleep() ++#endif ++ ++#endif /* <= 2.5.0 */ ++ ++/*****************************************************************************/ ++/* 2.5.28 => 2.4.23 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,5,28) ) ++ ++static inline void _kc_synchronize_irq(void) ++{ ++ synchronize_irq(); ++} ++#undef synchronize_irq ++#define synchronize_irq(X) _kc_synchronize_irq() ++ ++#include ++#define work_struct tq_struct ++#undef INIT_WORK ++#define INIT_WORK(a,b) INIT_TQUEUE(a,(void (*)(void *))b,a) ++#undef container_of ++#define container_of list_entry ++#define schedule_work schedule_task ++#define flush_scheduled_work flush_scheduled_tasks ++#define cancel_work_sync(x) flush_scheduled_work() ++ ++#endif /* 2.5.28 => 2.4.17 */ ++ ++/*****************************************************************************/ ++/* 2.6.0 => 2.5.28 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) ) ++#define MODULE_INFO(version, _version) ++#ifndef CONFIG_E1000_DISABLE_PACKET_SPLIT ++#define CONFIG_E1000_DISABLE_PACKET_SPLIT 1 ++#endif ++#ifndef CONFIG_IGB_DISABLE_PACKET_SPLIT ++#define CONFIG_IGB_DISABLE_PACKET_SPLIT 1 ++#endif ++ ++#define pci_set_consistent_dma_mask(dev,mask) 1 ++ ++#undef dev_put ++#define dev_put(dev) __dev_put(dev) ++ ++#ifndef skb_fill_page_desc ++#define skb_fill_page_desc _kc_skb_fill_page_desc ++extern void _kc_skb_fill_page_desc(struct sk_buff *skb, int i, struct page *page, int off, int size); ++#endif ++ ++#undef ALIGN ++#define ALIGN(x,a) (((x)+(a)-1)&~((a)-1)) ++ ++#ifndef page_count ++#define page_count(p) atomic_read(&(p)->count) ++#endif ++ ++/* find_first_bit and find_next bit are not defined for most ++ * 2.4 kernels (except for the redhat 2.4.21 kernels ++ */ ++#include ++#define BITOP_WORD(nr) ((nr) / BITS_PER_LONG) ++#undef find_next_bit ++#define find_next_bit _kc_find_next_bit ++extern unsigned long _kc_find_next_bit(const unsigned long *addr, ++ unsigned long size, ++ unsigned long offset); ++#define find_first_bit(addr, size) find_next_bit((addr), (size), 0) ++ ++#endif /* 2.6.0 => 2.5.28 */ ++ ++/*****************************************************************************/ ++/* 2.6.4 => 2.6.0 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,4) ) ++#define MODULE_VERSION(_version) MODULE_INFO(version, _version) ++#endif /* 2.6.4 => 2.6.0 */ ++ ++/*****************************************************************************/ ++/* 2.6.5 => 2.6.0 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,5) ) ++#define pci_dma_sync_single_for_cpu pci_dma_sync_single ++#define pci_dma_sync_single_for_device pci_dma_sync_single_for_cpu ++#endif /* 2.6.5 => 2.6.0 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,6) ) ++/* taken from 2.6 include/linux/bitmap.h */ ++#undef bitmap_zero ++#define bitmap_zero _kc_bitmap_zero ++static inline void _kc_bitmap_zero(unsigned long *dst, int nbits) ++{ ++ if (nbits <= BITS_PER_LONG) ++ *dst = 0UL; ++ else { ++ int len = BITS_TO_LONGS(nbits) * sizeof(unsigned long); ++ memset(dst, 0, len); ++ } ++} ++#endif /* < 2.6.6 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,7) ) ++#undef if_mii ++#define if_mii _kc_if_mii ++static inline struct mii_ioctl_data *_kc_if_mii(struct ifreq *rq) ++{ ++ return (struct mii_ioctl_data *) &rq->ifr_ifru; ++} ++#endif /* < 2.6.7 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,8) ) ++#ifndef PCI_EXP_DEVCTL ++#define PCI_EXP_DEVCTL 8 ++#endif ++#ifndef PCI_EXP_DEVCTL_CERE ++#define PCI_EXP_DEVCTL_CERE 0x0001 ++#endif ++#define msleep(x) do { set_current_state(TASK_UNINTERRUPTIBLE); \ ++ schedule_timeout((x * HZ)/1000 + 2); \ ++ } while (0) ++ ++#endif /* < 2.6.8 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,9)) ++#include ++#define __iomem ++ ++#ifndef kcalloc ++#define kcalloc(n, size, flags) _kc_kzalloc(((n) * (size)), flags) ++extern void *_kc_kzalloc(size_t size, int flags); ++#endif ++#define MSEC_PER_SEC 1000L ++static inline unsigned int _kc_jiffies_to_msecs(const unsigned long j) ++{ ++#if HZ <= MSEC_PER_SEC && !(MSEC_PER_SEC % HZ) ++ return (MSEC_PER_SEC / HZ) * j; ++#elif HZ > MSEC_PER_SEC && !(HZ % MSEC_PER_SEC) ++ return (j + (HZ / MSEC_PER_SEC) - 1)/(HZ / MSEC_PER_SEC); ++#else ++ return (j * MSEC_PER_SEC) / HZ; ++#endif ++} ++static inline unsigned long _kc_msecs_to_jiffies(const unsigned int m) ++{ ++ if (m > _kc_jiffies_to_msecs(MAX_JIFFY_OFFSET)) ++ return MAX_JIFFY_OFFSET; ++#if HZ <= MSEC_PER_SEC && !(MSEC_PER_SEC % HZ) ++ return (m + (MSEC_PER_SEC / HZ) - 1) / (MSEC_PER_SEC / HZ); ++#elif HZ > MSEC_PER_SEC && !(HZ % MSEC_PER_SEC) ++ return m * (HZ / MSEC_PER_SEC); ++#else ++ return (m * HZ + MSEC_PER_SEC - 1) / MSEC_PER_SEC; ++#endif ++} ++ ++#define msleep_interruptible _kc_msleep_interruptible ++static inline unsigned long _kc_msleep_interruptible(unsigned int msecs) ++{ ++ unsigned long timeout = _kc_msecs_to_jiffies(msecs) + 1; ++ ++ while (timeout && !signal_pending(current)) { ++ __set_current_state(TASK_INTERRUPTIBLE); ++ timeout = schedule_timeout(timeout); ++ } ++ return _kc_jiffies_to_msecs(timeout); ++} ++ ++/* Basic mode control register. */ ++#define BMCR_SPEED1000 0x0040 /* MSB of Speed (1000) */ ++ ++#ifndef __le16 ++#define __le16 u16 ++#endif ++#ifndef __le32 ++#define __le32 u32 ++#endif ++#ifndef __le64 ++#define __le64 u64 ++#endif ++ ++#ifdef pci_dma_mapping_error ++#undef pci_dma_mapping_error ++#endif ++#define pci_dma_mapping_error _kc_pci_dma_mapping_error ++static inline int _kc_pci_dma_mapping_error(struct pci_dev *pdev, ++ dma_addr_t dma_addr) ++{ ++ return dma_addr == 0; ++} ++ ++#endif /* < 2.6.9 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10) ) ++#ifdef module_param_array_named ++#undef module_param_array_named ++#define module_param_array_named(name, array, type, nump, perm) \ ++ static struct kparam_array __param_arr_##name \ ++ = { ARRAY_SIZE(array), nump, param_set_##type, param_get_##type, \ ++ sizeof(array[0]), array }; \ ++ module_param_call(name, param_array_set, param_array_get, \ ++ &__param_arr_##name, perm) ++#endif /* module_param_array_named */ ++#endif /* < 2.6.10 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,11) ) ++#define PCI_D0 0 ++#define PCI_D1 1 ++#define PCI_D2 2 ++#define PCI_D3hot 3 ++#define PCI_D3cold 4 ++#define pci_choose_state(pdev,state) state ++#define PMSG_SUSPEND 3 ++#define PCI_EXP_LNKCTL 16 ++ ++#undef NETIF_F_LLTX ++ ++#ifndef ARCH_HAS_PREFETCH ++#define prefetch(X) ++#endif ++ ++#ifndef NET_IP_ALIGN ++#define NET_IP_ALIGN 2 ++#endif ++ ++#define KC_USEC_PER_SEC 1000000L ++#define usecs_to_jiffies _kc_usecs_to_jiffies ++static inline unsigned int _kc_jiffies_to_usecs(const unsigned long j) ++{ ++#if HZ <= KC_USEC_PER_SEC && !(KC_USEC_PER_SEC % HZ) ++ return (KC_USEC_PER_SEC / HZ) * j; ++#elif HZ > KC_USEC_PER_SEC && !(HZ % KC_USEC_PER_SEC) ++ return (j + (HZ / KC_USEC_PER_SEC) - 1)/(HZ / KC_USEC_PER_SEC); ++#else ++ return (j * KC_USEC_PER_SEC) / HZ; ++#endif ++} ++static inline unsigned long _kc_usecs_to_jiffies(const unsigned int m) ++{ ++ if (m > _kc_jiffies_to_usecs(MAX_JIFFY_OFFSET)) ++ return MAX_JIFFY_OFFSET; ++#if HZ <= KC_USEC_PER_SEC && !(KC_USEC_PER_SEC % HZ) ++ return (m + (KC_USEC_PER_SEC / HZ) - 1) / (KC_USEC_PER_SEC / HZ); ++#elif HZ > KC_USEC_PER_SEC && !(HZ % KC_USEC_PER_SEC) ++ return m * (HZ / KC_USEC_PER_SEC); ++#else ++ return (m * HZ + KC_USEC_PER_SEC - 1) / KC_USEC_PER_SEC; ++#endif ++} ++#endif /* < 2.6.11 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,12) ) ++#include ++#define USE_REBOOT_NOTIFIER ++ ++/* Generic MII registers. */ ++#define MII_CTRL1000 0x09 /* 1000BASE-T control */ ++#define MII_STAT1000 0x0a /* 1000BASE-T status */ ++/* Advertisement control register. */ ++#define ADVERTISE_PAUSE_CAP 0x0400 /* Try for pause */ ++#define ADVERTISE_PAUSE_ASYM 0x0800 /* Try for asymmetric pause */ ++/* 1000BASE-T Control register */ ++#define ADVERTISE_1000FULL 0x0200 /* Advertise 1000BASE-T full duplex */ ++#endif /* < 2.6.12 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,14) ) ++#define pm_message_t u32 ++#ifndef kzalloc ++#define kzalloc _kc_kzalloc ++extern void *_kc_kzalloc(size_t size, int flags); ++#endif ++ ++/* Generic MII registers. */ ++#define MII_ESTATUS 0x0f /* Extended Status */ ++/* Basic mode status register. */ ++#define BMSR_ESTATEN 0x0100 /* Extended Status in R15 */ ++/* Extended status register. */ ++#define ESTATUS_1000_TFULL 0x2000 /* Can do 1000BT Full */ ++#define ESTATUS_1000_THALF 0x1000 /* Can do 1000BT Half */ ++#endif /* < 2.6.14 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,15) ) ++#ifndef device_can_wakeup ++#define device_can_wakeup(dev) (1) ++#endif ++#ifndef device_set_wakeup_enable ++#define device_set_wakeup_enable(dev, val) do{}while(0) ++#endif ++#ifndef device_init_wakeup ++#define device_init_wakeup(dev,val) do {} while (0) ++#endif ++#endif /* < 2.6.15 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,16) ) ++#undef HAVE_PCI_ERS ++#else /* 2.6.16 and above */ ++#undef HAVE_PCI_ERS ++#define HAVE_PCI_ERS ++#endif /* < 2.6.16 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18) ) ++ ++#ifndef IRQF_PROBE_SHARED ++#ifdef SA_PROBEIRQ ++#define IRQF_PROBE_SHARED SA_PROBEIRQ ++#else ++#define IRQF_PROBE_SHARED 0 ++#endif ++#endif ++ ++#ifndef IRQF_SHARED ++#define IRQF_SHARED SA_SHIRQ ++#endif ++ ++#ifndef ARRAY_SIZE ++#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) ++#endif ++ ++#ifndef netdev_alloc_skb ++#define netdev_alloc_skb _kc_netdev_alloc_skb ++extern struct sk_buff *_kc_netdev_alloc_skb(struct net_device *dev, ++ unsigned int length); ++#endif ++ ++#ifndef skb_is_gso ++#ifdef NETIF_F_TSO ++#define skb_is_gso _kc_skb_is_gso ++static inline int _kc_skb_is_gso(const struct sk_buff *skb) ++{ ++ return skb_shinfo(skb)->gso_size; ++} ++#else ++#define skb_is_gso(a) 0 ++#endif ++#endif ++ ++#endif /* < 2.6.18 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) ) ++ ++#ifndef DIV_ROUND_UP ++#define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d)) ++#endif ++#if ( LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) ) ++#ifndef RHEL_RELEASE_CODE ++#define RHEL_RELEASE_CODE 0 ++#endif ++#ifndef RHEL_RELEASE_VERSION ++#define RHEL_RELEASE_VERSION(a,b) 0 ++#endif ++#ifndef AX_RELEASE_CODE ++#define AX_RELEASE_CODE 0 ++#endif ++#ifndef AX_RELEASE_VERSION ++#define AX_RELEASE_VERSION(a,b) 0 ++#endif ++#if (!(( RHEL_RELEASE_CODE > RHEL_RELEASE_VERSION(4,4) ) && ( RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(5,0) ) || ( RHEL_RELEASE_CODE > RHEL_RELEASE_VERSION(5,0) ) || (AX_RELEASE_CODE > AX_RELEASE_VERSION(3,0)))) ++typedef irqreturn_t (*irq_handler_t)(int, void*, struct pt_regs *); ++#endif ++#if (RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(6,0)) ++#undef CONFIG_INET_LRO ++#undef CONFIG_INET_LRO_MODULE ++#endif ++typedef irqreturn_t (*new_handler_t)(int, void*); ++static inline irqreturn_t _kc_request_irq(unsigned int irq, new_handler_t handler, unsigned long flags, const char *devname, void *dev_id) ++#else /* 2.4.x */ ++typedef void (*irq_handler_t)(int, void*, struct pt_regs *); ++typedef void (*new_handler_t)(int, void*); ++static inline int _kc_request_irq(unsigned int irq, new_handler_t handler, unsigned long flags, const char *devname, void *dev_id) ++#endif /* >= 2.5.x */ ++{ ++ irq_handler_t new_handler = (irq_handler_t) handler; ++ return request_irq(irq, new_handler, flags, devname, dev_id); ++} ++ ++#undef request_irq ++#define request_irq(irq, handler, flags, devname, dev_id) _kc_request_irq((irq), (handler), (flags), (devname), (dev_id)) ++ ++#define irq_handler_t new_handler_t ++/* pci_restore_state and pci_save_state handles MSI/PCIE from 2.6.19 */ ++#define PCIE_CONFIG_SPACE_LEN 256 ++#define PCI_CONFIG_SPACE_LEN 64 ++#define PCIE_LINK_STATUS 0x12 ++#define pci_config_space_ich8lan() { \ ++ if (adapter->flags & FLAG_IS_ICH) \ ++ size = PCIE_CONFIG_SPACE_LEN; \ ++} ++#undef pci_save_state ++extern int _kc_pci_save_state(struct pci_dev *); ++#define pci_save_state(pdev) _kc_pci_save_state(pdev) ++#undef pci_restore_state ++extern void _kc_pci_restore_state(struct pci_dev *); ++#define pci_restore_state(pdev) _kc_pci_restore_state(pdev) ++#ifdef HAVE_PCI_ERS ++#undef free_netdev ++extern void _kc_free_netdev(struct net_device *); ++#define free_netdev(netdev) _kc_free_netdev(netdev) ++#endif ++static inline int pci_enable_pcie_error_reporting(struct pci_dev *dev) ++{ ++ return 0; ++} ++#define pci_disable_pcie_error_reporting(dev) do {} while (0) ++#define pci_cleanup_aer_uncorrect_error_status(dev) do {} while (0) ++#else /* 2.6.19 */ ++#include ++#endif /* < 2.6.19 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) ) ++#if ( LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,28) ) ++#undef INIT_WORK ++#define INIT_WORK(_work, _func) \ ++do { \ ++ INIT_LIST_HEAD(&(_work)->entry); \ ++ (_work)->pending = 0; \ ++ (_work)->func = (void (*)(void *))_func; \ ++ (_work)->data = _work; \ ++ init_timer(&(_work)->timer); \ ++} while (0) ++#endif ++ ++#ifndef PCI_VDEVICE ++#define PCI_VDEVICE(ven, dev) \ ++ PCI_VENDOR_ID_##ven, (dev), \ ++ PCI_ANY_ID, PCI_ANY_ID, 0, 0 ++#endif ++ ++#ifndef round_jiffies ++#define round_jiffies(x) x ++#endif ++ ++#define csum_offset csum ++ ++#endif /* < 2.6.20 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21) ) ++#define to_net_dev(class) container_of(class, struct net_device, class_dev) ++#define NETDEV_CLASS_DEV ++#define vlan_group_get_device(vg, id) (vg->vlan_devices[id]) ++#define vlan_group_set_device(vg, id, dev) if (vg) vg->vlan_devices[id] = dev; ++#define pci_channel_offline(pdev) (pdev->error_state && \ ++ pdev->error_state != pci_channel_io_normal) ++#define pci_request_selected_regions(pdev, bars, name) \ ++ pci_request_regions(pdev, name) ++#define pci_release_selected_regions(pdev, bars) pci_release_regions(pdev); ++#endif /* < 2.6.21 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22) ) ++#define tcp_hdr(skb) (skb->h.th) ++#define tcp_hdrlen(skb) (skb->h.th->doff << 2) ++#define skb_transport_offset(skb) (skb->h.raw - skb->data) ++#define skb_transport_header(skb) (skb->h.raw) ++#define ipv6_hdr(skb) (skb->nh.ipv6h) ++#define ip_hdr(skb) (skb->nh.iph) ++#define skb_network_offset(skb) (skb->nh.raw - skb->data) ++#define skb_network_header(skb) (skb->nh.raw) ++#define skb_tail_pointer(skb) skb->tail ++#define skb_copy_to_linear_data_offset(skb, offset, from, len) \ ++ memcpy(skb->data + offset, from, len) ++#define skb_network_header_len(skb) (skb->h.raw - skb->nh.raw) ++#define pci_register_driver pci_module_init ++#define skb_mac_header(skb) skb->mac.raw ++ ++#ifdef NETIF_F_MULTI_QUEUE ++#ifndef alloc_etherdev_mq ++#define alloc_etherdev_mq(_a, _b) alloc_etherdev(_a) ++#endif ++#endif /* NETIF_F_MULTI_QUEUE */ ++ ++#ifndef ETH_FCS_LEN ++#define ETH_FCS_LEN 4 ++#endif ++#define cancel_work_sync(x) flush_scheduled_work() ++#ifndef udp_hdr ++#define udp_hdr _udp_hdr ++static inline struct udphdr *_udp_hdr(const struct sk_buff *skb) ++{ ++ return (struct udphdr *)skb_transport_header(skb); ++} ++#endif ++#endif /* < 2.6.22 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE > KERNEL_VERSION(2,6,22) ) ++#undef ETHTOOL_GPERMADDR ++#undef SET_MODULE_OWNER ++#define SET_MODULE_OWNER(dev) do { } while (0) ++#endif /* > 2.6.22 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) ) ++/* NAPI API changes in 2.6.24 break everything */ ++struct napi_struct { ++ /* used to look up the real NAPI polling routine */ ++ int (*poll)(struct napi_struct *, int); ++ struct net_device poll_dev; ++ int weight; ++}; ++#ifdef NAPI ++extern int __kc_adapter_clean(struct net_device *, int *); ++extern struct net_device * napi_to_netdev(struct napi_struct *); ++#define napi_to_poll_dev(napi) napi_to_netdev(napi) ++#define napi_enable(napi) netif_poll_enable(adapter->netdev) ++#define napi_disable(napi) netif_poll_disable(adapter->netdev) ++#define netif_napi_add(_netdev, _napi, _poll, _weight) \ ++ do { \ ++ struct napi_struct *__napi = (_napi); \ ++ _netdev->poll = &(__kc_adapter_clean); \ ++ _netdev->weight = (_weight); \ ++ __napi->poll = &(_poll); \ ++ __napi->weight = (_weight); \ ++ netif_poll_disable(_netdev); \ ++ } while (0) ++#define netif_napi_del(_a) do {} while (0) ++#define napi_schedule_prep(napi) netif_rx_schedule_prep(napi_to_netdev(napi)) ++#define napi_schedule(napi) netif_rx_schedule(napi_to_poll_dev(napi)) ++#define __napi_schedule(napi) __netif_rx_schedule(napi_to_poll_dev(napi)) ++#define napi_complete(napi) netif_rx_complete(napi_to_poll_dev(napi)) ++#else /* NAPI */ ++#define netif_napi_add(_netdev, _napi, _poll, _weight) \ ++ do { \ ++ struct napi_struct *__napi = _napi; \ ++ _netdev->poll = &(_poll); \ ++ _netdev->weight = (_weight); \ ++ __napi->poll = &(_poll); \ ++ __napi->weight = (_weight); \ ++ } while (0) ++#define netif_napi_del(_a) do {} while (0) ++#endif /* NAPI */ ++ ++#undef dev_get_by_name ++#define dev_get_by_name(_a, _b) dev_get_by_name(_b) ++#define __netif_subqueue_stopped(_a, _b) netif_subqueue_stopped(_a, _b) ++#else /* < 2.6.24 */ ++#define HAVE_NETDEV_NAPI_LIST ++#endif /* < 2.6.24 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE > KERNEL_VERSION(2,6,24) ) ++#include ++#endif /* > 2.6.24 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25) ) ++#define PM_QOS_CPU_DMA_LATENCY 1 ++ ++#if ( LINUX_VERSION_CODE > KERNEL_VERSION(2,6,18) ) ++#include ++#define PM_QOS_DEFAULT_VALUE INFINITE_LATENCY ++#define pm_qos_add_requirement(pm_qos_class, name, value) \ ++ set_acceptable_latency(name, value) ++#define pm_qos_remove_requirement(pm_qos_class, name) \ ++ remove_acceptable_latency(name) ++#define pm_qos_update_requirement(pm_qos_class, name, value) \ ++ modify_acceptable_latency(name, value) ++#else ++#define PM_QOS_DEFAULT_VALUE -1 ++#define pm_qos_add_requirement(pm_qos_class, name, value) ++#define pm_qos_remove_requirement(pm_qos_class, name) ++#define pm_qos_update_requirement(pm_qos_class, name, value) { \ ++ if (value != PM_QOS_DEFAULT_VALUE) { \ ++ printk(KERN_WARNING "%s: unable to set PM QoS requirement\n", \ ++ pci_name(adapter->pdev)); \ ++ } \ ++} ++#endif /* > 2.6.18 */ ++ ++#define pci_enable_device_mem(pdev) pci_enable_device(pdev) ++ ++#endif /* < 2.6.25 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26) ) ++#else /* < 2.6.26 */ ++#include ++#define HAVE_NETDEV_VLAN_FEATURES ++#endif /* < 2.6.26 */ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27) ) ++#if ( LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,15) ) ++#undef device_set_wakeup_enable ++#define device_set_wakeup_enable(dev, val) \ ++ do { \ ++ u16 pmc = 0; \ ++ int pm = pci_find_capability(adapter->pdev, PCI_CAP_ID_PM); \ ++ if (pm) { \ ++ pci_read_config_word(adapter->pdev, pm + PCI_PM_PMC, \ ++ &pmc); \ ++ } \ ++ (dev)->power.can_wakeup = !!(pmc >> 11); \ ++ (dev)->power.should_wakeup = (val && (pmc >> 11)); \ ++ } while (0) ++#endif /* 2.6.15 through 2.6.27 */ ++#ifndef netif_napi_del ++#define netif_napi_del(_a) do {} while (0) ++#ifdef NAPI ++#ifdef CONFIG_NETPOLL ++#undef netif_napi_del ++#define netif_napi_del(_a) list_del(&(_a)->dev_list); ++#endif ++#endif ++#endif /* netif_napi_del */ ++#ifndef pci_dma_mapping_error ++#define pci_dma_mapping_error(pdev, dma_addr) pci_dma_mapping_error(dma_addr) ++#endif ++ ++ ++#ifdef HAVE_TX_MQ ++extern void _kc_netif_tx_stop_all_queues(struct net_device *); ++extern void _kc_netif_tx_wake_all_queues(struct net_device *); ++extern void _kc_netif_tx_start_all_queues(struct net_device *); ++#define netif_tx_stop_all_queues(a) _kc_netif_tx_stop_all_queues(a) ++#define netif_tx_wake_all_queues(a) _kc_netif_tx_wake_all_queues(a) ++#define netif_tx_start_all_queues(a) _kc_netif_tx_start_all_queues(a) ++#undef netif_stop_subqueue ++#define netif_stop_subqueue(_ndev,_qi) do { \ ++ if (netif_is_multiqueue((_ndev))) \ ++ netif_stop_subqueue((_ndev), (_qi)); \ ++ else \ ++ netif_stop_queue((_ndev)); \ ++ } while (0) ++#undef netif_start_subqueue ++#define netif_start_subqueue(_ndev,_qi) do { \ ++ if (netif_is_multiqueue((_ndev))) \ ++ netif_start_subqueue((_ndev), (_qi)); \ ++ else \ ++ netif_start_queue((_ndev)); \ ++ } while (0) ++#else /* CONFIG_NETDEVICES_MULTIQUEUE */ ++#define netif_tx_stop_all_queues(a) netif_stop_queue(a) ++#define netif_tx_wake_all_queues(a) netif_wake_queue(a) ++#if ( LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,12) ) ++#define netif_tx_start_all_queues(a) netif_start_queue(a) ++#else ++#define netif_tx_start_all_queues(a) do {} while (0) ++#endif ++#define netif_stop_subqueue(_ndev,_qi) netif_stop_queue((_ndev)) ++#define netif_start_subqueue(_ndev,_qi) netif_start_queue((_ndev)) ++#endif /* CONFIG_NETDEVICES_MULTIQUEUE */ ++#ifndef NETIF_F_MULTI_QUEUE ++#define NETIF_F_MULTI_QUEUE 0 ++#define netif_is_multiqueue(a) 0 ++#define netif_wake_subqueue(a, b) ++#endif /* NETIF_F_MULTI_QUEUE */ ++#else /* < 2.6.27 */ ++#define HAVE_TX_MQ ++#define HAVE_NETDEV_SELECT_QUEUE ++#endif /* < 2.6.27 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,28) ) ++#define pci_ioremap_bar(pdev, bar) ioremap(pci_resource_start(pdev, bar), \ ++ pci_resource_len(pdev, bar)) ++#endif /* < 2.6.28 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29) ) ++#define pci_request_selected_regions_exclusive(pdev, bars, name) \ ++ pci_request_selected_regions(pdev, bars, name) ++#endif /* < 2.6.29 */ ++#endif /* _KCOMPAT_H_ */ +diff -r bd70f2f305c6 drivers/net/e1000e/kcompat_ethtool.c +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/e1000e/kcompat_ethtool.c Mon Jun 15 11:45:35 2009 +0100 +@@ -0,0 +1,1169 @@ ++/******************************************************************************* ++ ++ Intel PRO/1000 Linux driver ++ Copyright(c) 1999 - 2009 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ Linux NICS ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++/* ++ * net/core/ethtool.c - Ethtool ioctl handler ++ * Copyright (c) 2003 Matthew Wilcox ++ * ++ * This file is where we call all the ethtool_ops commands to get ++ * the information ethtool needs. We fall back to calling do_ioctl() ++ * for drivers which haven't been converted to ethtool_ops yet. ++ * ++ * It's GPL, stupid. ++ * ++ * Modification by sfeldma@pobox.com to work as backward compat ++ * solution for pre-ethtool_ops kernels. ++ * - copied struct ethtool_ops from ethtool.h ++ * - defined SET_ETHTOOL_OPS ++ * - put in some #ifndef NETIF_F_xxx wrappers ++ * - changes refs to dev->ethtool_ops to ethtool_ops ++ * - changed dev_ethtool to ethtool_ioctl ++ * - remove EXPORT_SYMBOL()s ++ * - added _kc_ prefix in built-in ethtool_op_xxx ops. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "kcompat.h" ++ ++#undef SUPPORTED_10000baseT_Full ++#define SUPPORTED_10000baseT_Full (1 << 12) ++#undef ADVERTISED_10000baseT_Full ++#define ADVERTISED_10000baseT_Full (1 << 12) ++#undef SPEED_10000 ++#define SPEED_10000 10000 ++ ++#undef ethtool_ops ++#define ethtool_ops _kc_ethtool_ops ++ ++struct _kc_ethtool_ops { ++ int (*get_settings)(struct net_device *, struct ethtool_cmd *); ++ int (*set_settings)(struct net_device *, struct ethtool_cmd *); ++ void (*get_drvinfo)(struct net_device *, struct ethtool_drvinfo *); ++ int (*get_regs_len)(struct net_device *); ++ void (*get_regs)(struct net_device *, struct ethtool_regs *, void *); ++ void (*get_wol)(struct net_device *, struct ethtool_wolinfo *); ++ int (*set_wol)(struct net_device *, struct ethtool_wolinfo *); ++ u32 (*get_msglevel)(struct net_device *); ++ void (*set_msglevel)(struct net_device *, u32); ++ int (*nway_reset)(struct net_device *); ++ u32 (*get_link)(struct net_device *); ++ int (*get_eeprom_len)(struct net_device *); ++ int (*get_eeprom)(struct net_device *, struct ethtool_eeprom *, u8 *); ++ int (*set_eeprom)(struct net_device *, struct ethtool_eeprom *, u8 *); ++ int (*get_coalesce)(struct net_device *, struct ethtool_coalesce *); ++ int (*set_coalesce)(struct net_device *, struct ethtool_coalesce *); ++ void (*get_ringparam)(struct net_device *, struct ethtool_ringparam *); ++ int (*set_ringparam)(struct net_device *, struct ethtool_ringparam *); ++ void (*get_pauseparam)(struct net_device *, ++ struct ethtool_pauseparam*); ++ int (*set_pauseparam)(struct net_device *, ++ struct ethtool_pauseparam*); ++ u32 (*get_rx_csum)(struct net_device *); ++ int (*set_rx_csum)(struct net_device *, u32); ++ u32 (*get_tx_csum)(struct net_device *); ++ int (*set_tx_csum)(struct net_device *, u32); ++ u32 (*get_sg)(struct net_device *); ++ int (*set_sg)(struct net_device *, u32); ++ u32 (*get_tso)(struct net_device *); ++ int (*set_tso)(struct net_device *, u32); ++ int (*self_test_count)(struct net_device *); ++ void (*self_test)(struct net_device *, struct ethtool_test *, u64 *); ++ void (*get_strings)(struct net_device *, u32 stringset, u8 *); ++ int (*phys_id)(struct net_device *, u32); ++ int (*get_stats_count)(struct net_device *); ++ void (*get_ethtool_stats)(struct net_device *, struct ethtool_stats *, ++ u64 *); ++} *ethtool_ops = NULL; ++ ++#undef SET_ETHTOOL_OPS ++#define SET_ETHTOOL_OPS(netdev, ops) (ethtool_ops = (ops)) ++ ++/* ++ * Some useful ethtool_ops methods that are device independent. If we find that ++ * all drivers want to do the same thing here, we can turn these into dev_() ++ * function calls. ++ */ ++ ++#undef ethtool_op_get_link ++#define ethtool_op_get_link _kc_ethtool_op_get_link ++u32 _kc_ethtool_op_get_link(struct net_device *dev) ++{ ++ return netif_carrier_ok(dev) ? 1 : 0; ++} ++ ++#undef ethtool_op_get_tx_csum ++#define ethtool_op_get_tx_csum _kc_ethtool_op_get_tx_csum ++u32 _kc_ethtool_op_get_tx_csum(struct net_device *dev) ++{ ++#ifdef NETIF_F_IP_CSUM ++ return (dev->features & NETIF_F_IP_CSUM) != 0; ++#else ++ return 0; ++#endif ++} ++ ++#undef ethtool_op_set_tx_csum ++#define ethtool_op_set_tx_csum _kc_ethtool_op_set_tx_csum ++int _kc_ethtool_op_set_tx_csum(struct net_device *dev, u32 data) ++{ ++#ifdef NETIF_F_IP_CSUM ++ if (data) ++#ifdef NETIF_F_IPV6_CSUM ++ dev->features |= (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM); ++ else ++ dev->features &= ~(NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM); ++#else ++ dev->features |= NETIF_F_IP_CSUM; ++ else ++ dev->features &= ~NETIF_F_IP_CSUM; ++#endif ++#endif ++ ++ return 0; ++} ++ ++#undef ethtool_op_get_sg ++#define ethtool_op_get_sg _kc_ethtool_op_get_sg ++u32 _kc_ethtool_op_get_sg(struct net_device *dev) ++{ ++#ifdef NETIF_F_SG ++ return (dev->features & NETIF_F_SG) != 0; ++#else ++ return 0; ++#endif ++} ++ ++#undef ethtool_op_set_sg ++#define ethtool_op_set_sg _kc_ethtool_op_set_sg ++int _kc_ethtool_op_set_sg(struct net_device *dev, u32 data) ++{ ++#ifdef NETIF_F_SG ++ if (data) ++ dev->features |= NETIF_F_SG; ++ else ++ dev->features &= ~NETIF_F_SG; ++#endif ++ ++ return 0; ++} ++ ++#undef ethtool_op_get_tso ++#define ethtool_op_get_tso _kc_ethtool_op_get_tso ++u32 _kc_ethtool_op_get_tso(struct net_device *dev) ++{ ++#ifdef NETIF_F_TSO ++ return (dev->features & NETIF_F_TSO) != 0; ++#else ++ return 0; ++#endif ++} ++ ++#undef ethtool_op_set_tso ++#define ethtool_op_set_tso _kc_ethtool_op_set_tso ++int _kc_ethtool_op_set_tso(struct net_device *dev, u32 data) ++{ ++#ifdef NETIF_F_TSO ++ if (data) ++ dev->features |= NETIF_F_TSO; ++ else ++ dev->features &= ~NETIF_F_TSO; ++#endif ++ ++ return 0; ++} ++ ++/* Handlers for each ethtool command */ ++ ++static int ethtool_get_settings(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_cmd cmd = { ETHTOOL_GSET }; ++ int err; ++ ++ if (!ethtool_ops->get_settings) ++ return -EOPNOTSUPP; ++ ++ err = ethtool_ops->get_settings(dev, &cmd); ++ if (err < 0) ++ return err; ++ ++ if (copy_to_user(useraddr, &cmd, sizeof(cmd))) ++ return -EFAULT; ++ return 0; ++} ++ ++static int ethtool_set_settings(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_cmd cmd; ++ ++ if (!ethtool_ops->set_settings) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&cmd, useraddr, sizeof(cmd))) ++ return -EFAULT; ++ ++ return ethtool_ops->set_settings(dev, &cmd); ++} ++ ++static int ethtool_get_drvinfo(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_drvinfo info; ++ struct ethtool_ops *ops = ethtool_ops; ++ ++ if (!ops->get_drvinfo) ++ return -EOPNOTSUPP; ++ ++ memset(&info, 0, sizeof(info)); ++ info.cmd = ETHTOOL_GDRVINFO; ++ ops->get_drvinfo(dev, &info); ++ ++ if (ops->self_test_count) ++ info.testinfo_len = ops->self_test_count(dev); ++ if (ops->get_stats_count) ++ info.n_stats = ops->get_stats_count(dev); ++ if (ops->get_regs_len) ++ info.regdump_len = ops->get_regs_len(dev); ++ if (ops->get_eeprom_len) ++ info.eedump_len = ops->get_eeprom_len(dev); ++ ++ if (copy_to_user(useraddr, &info, sizeof(info))) ++ return -EFAULT; ++ return 0; ++} ++ ++static int ethtool_get_regs(struct net_device *dev, char *useraddr) ++{ ++ struct ethtool_regs regs; ++ struct ethtool_ops *ops = ethtool_ops; ++ void *regbuf; ++ int reglen, ret; ++ ++ if (!ops->get_regs || !ops->get_regs_len) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(®s, useraddr, sizeof(regs))) ++ return -EFAULT; ++ ++ reglen = ops->get_regs_len(dev); ++ if (regs.len > reglen) ++ regs.len = reglen; ++ ++ regbuf = kmalloc(reglen, GFP_USER); ++ if (!regbuf) ++ return -ENOMEM; ++ ++ ops->get_regs(dev, ®s, regbuf); ++ ++ ret = -EFAULT; ++ if (copy_to_user(useraddr, ®s, sizeof(regs))) ++ goto out; ++ useraddr += offsetof(struct ethtool_regs, data); ++ if (copy_to_user(useraddr, regbuf, reglen)) ++ goto out; ++ ret = 0; ++ ++out: ++ kfree(regbuf); ++ return ret; ++} ++ ++static int ethtool_get_wol(struct net_device *dev, char *useraddr) ++{ ++ struct ethtool_wolinfo wol = { ETHTOOL_GWOL }; ++ ++ if (!ethtool_ops->get_wol) ++ return -EOPNOTSUPP; ++ ++ ethtool_ops->get_wol(dev, &wol); ++ ++ if (copy_to_user(useraddr, &wol, sizeof(wol))) ++ return -EFAULT; ++ return 0; ++} ++ ++static int ethtool_set_wol(struct net_device *dev, char *useraddr) ++{ ++ struct ethtool_wolinfo wol; ++ ++ if (!ethtool_ops->set_wol) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&wol, useraddr, sizeof(wol))) ++ return -EFAULT; ++ ++ return ethtool_ops->set_wol(dev, &wol); ++} ++ ++static int ethtool_get_msglevel(struct net_device *dev, char *useraddr) ++{ ++ struct ethtool_value edata = { ETHTOOL_GMSGLVL }; ++ ++ if (!ethtool_ops->get_msglevel) ++ return -EOPNOTSUPP; ++ ++ edata.data = ethtool_ops->get_msglevel(dev); ++ ++ if (copy_to_user(useraddr, &edata, sizeof(edata))) ++ return -EFAULT; ++ return 0; ++} ++ ++static int ethtool_set_msglevel(struct net_device *dev, char *useraddr) ++{ ++ struct ethtool_value edata; ++ ++ if (!ethtool_ops->set_msglevel) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&edata, useraddr, sizeof(edata))) ++ return -EFAULT; ++ ++ ethtool_ops->set_msglevel(dev, edata.data); ++ return 0; ++} ++ ++static int ethtool_nway_reset(struct net_device *dev) ++{ ++ if (!ethtool_ops->nway_reset) ++ return -EOPNOTSUPP; ++ ++ return ethtool_ops->nway_reset(dev); ++} ++ ++static int ethtool_get_link(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_value edata = { ETHTOOL_GLINK }; ++ ++ if (!ethtool_ops->get_link) ++ return -EOPNOTSUPP; ++ ++ edata.data = ethtool_ops->get_link(dev); ++ ++ if (copy_to_user(useraddr, &edata, sizeof(edata))) ++ return -EFAULT; ++ return 0; ++} ++ ++static int ethtool_get_eeprom(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_eeprom eeprom; ++ struct ethtool_ops *ops = ethtool_ops; ++ u8 *data; ++ int ret; ++ ++ if (!ops->get_eeprom || !ops->get_eeprom_len) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&eeprom, useraddr, sizeof(eeprom))) ++ return -EFAULT; ++ ++ /* Check for wrap and zero */ ++ if (eeprom.offset + eeprom.len <= eeprom.offset) ++ return -EINVAL; ++ ++ /* Check for exceeding total eeprom len */ ++ if (eeprom.offset + eeprom.len > ops->get_eeprom_len(dev)) ++ return -EINVAL; ++ ++ data = kmalloc(eeprom.len, GFP_USER); ++ if (!data) ++ return -ENOMEM; ++ ++ ret = -EFAULT; ++ if (copy_from_user(data, useraddr + sizeof(eeprom), eeprom.len)) ++ goto out; ++ ++ ret = ops->get_eeprom(dev, &eeprom, data); ++ if (ret) ++ goto out; ++ ++ ret = -EFAULT; ++ if (copy_to_user(useraddr, &eeprom, sizeof(eeprom))) ++ goto out; ++ if (copy_to_user(useraddr + sizeof(eeprom), data, eeprom.len)) ++ goto out; ++ ret = 0; ++ ++out: ++ kfree(data); ++ return ret; ++} ++ ++static int ethtool_set_eeprom(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_eeprom eeprom; ++ struct ethtool_ops *ops = ethtool_ops; ++ u8 *data; ++ int ret; ++ ++ if (!ops->set_eeprom || !ops->get_eeprom_len) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&eeprom, useraddr, sizeof(eeprom))) ++ return -EFAULT; ++ ++ /* Check for wrap and zero */ ++ if (eeprom.offset + eeprom.len <= eeprom.offset) ++ return -EINVAL; ++ ++ /* Check for exceeding total eeprom len */ ++ if (eeprom.offset + eeprom.len > ops->get_eeprom_len(dev)) ++ return -EINVAL; ++ ++ data = kmalloc(eeprom.len, GFP_USER); ++ if (!data) ++ return -ENOMEM; ++ ++ ret = -EFAULT; ++ if (copy_from_user(data, useraddr + sizeof(eeprom), eeprom.len)) ++ goto out; ++ ++ ret = ops->set_eeprom(dev, &eeprom, data); ++ if (ret) ++ goto out; ++ ++ if (copy_to_user(useraddr + sizeof(eeprom), data, eeprom.len)) ++ ret = -EFAULT; ++ ++out: ++ kfree(data); ++ return ret; ++} ++ ++static int ethtool_get_coalesce(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_coalesce coalesce = { ETHTOOL_GCOALESCE }; ++ ++ if (!ethtool_ops->get_coalesce) ++ return -EOPNOTSUPP; ++ ++ ethtool_ops->get_coalesce(dev, &coalesce); ++ ++ if (copy_to_user(useraddr, &coalesce, sizeof(coalesce))) ++ return -EFAULT; ++ return 0; ++} ++ ++static int ethtool_set_coalesce(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_coalesce coalesce; ++ ++ if (!ethtool_ops->get_coalesce) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&coalesce, useraddr, sizeof(coalesce))) ++ return -EFAULT; ++ ++ return ethtool_ops->set_coalesce(dev, &coalesce); ++} ++ ++static int ethtool_get_ringparam(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_ringparam ringparam = { ETHTOOL_GRINGPARAM }; ++ ++ if (!ethtool_ops->get_ringparam) ++ return -EOPNOTSUPP; ++ ++ ethtool_ops->get_ringparam(dev, &ringparam); ++ ++ if (copy_to_user(useraddr, &ringparam, sizeof(ringparam))) ++ return -EFAULT; ++ return 0; ++} ++ ++static int ethtool_set_ringparam(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_ringparam ringparam; ++ ++ if (!ethtool_ops->get_ringparam) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&ringparam, useraddr, sizeof(ringparam))) ++ return -EFAULT; ++ ++ return ethtool_ops->set_ringparam(dev, &ringparam); ++} ++ ++static int ethtool_get_pauseparam(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_pauseparam pauseparam = { ETHTOOL_GPAUSEPARAM }; ++ ++ if (!ethtool_ops->get_pauseparam) ++ return -EOPNOTSUPP; ++ ++ ethtool_ops->get_pauseparam(dev, &pauseparam); ++ ++ if (copy_to_user(useraddr, &pauseparam, sizeof(pauseparam))) ++ return -EFAULT; ++ return 0; ++} ++ ++static int ethtool_set_pauseparam(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_pauseparam pauseparam; ++ ++ if (!ethtool_ops->get_pauseparam) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&pauseparam, useraddr, sizeof(pauseparam))) ++ return -EFAULT; ++ ++ return ethtool_ops->set_pauseparam(dev, &pauseparam); ++} ++ ++static int ethtool_get_rx_csum(struct net_device *dev, char *useraddr) ++{ ++ struct ethtool_value edata = { ETHTOOL_GRXCSUM }; ++ ++ if (!ethtool_ops->get_rx_csum) ++ return -EOPNOTSUPP; ++ ++ edata.data = ethtool_ops->get_rx_csum(dev); ++ ++ if (copy_to_user(useraddr, &edata, sizeof(edata))) ++ return -EFAULT; ++ return 0; ++} ++ ++static int ethtool_set_rx_csum(struct net_device *dev, char *useraddr) ++{ ++ struct ethtool_value edata; ++ ++ if (!ethtool_ops->set_rx_csum) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&edata, useraddr, sizeof(edata))) ++ return -EFAULT; ++ ++ ethtool_ops->set_rx_csum(dev, edata.data); ++ return 0; ++} ++ ++static int ethtool_get_tx_csum(struct net_device *dev, char *useraddr) ++{ ++ struct ethtool_value edata = { ETHTOOL_GTXCSUM }; ++ ++ if (!ethtool_ops->get_tx_csum) ++ return -EOPNOTSUPP; ++ ++ edata.data = ethtool_ops->get_tx_csum(dev); ++ ++ if (copy_to_user(useraddr, &edata, sizeof(edata))) ++ return -EFAULT; ++ return 0; ++} ++ ++static int ethtool_set_tx_csum(struct net_device *dev, char *useraddr) ++{ ++ struct ethtool_value edata; ++ ++ if (!ethtool_ops->set_tx_csum) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&edata, useraddr, sizeof(edata))) ++ return -EFAULT; ++ ++ return ethtool_ops->set_tx_csum(dev, edata.data); ++} ++ ++static int ethtool_get_sg(struct net_device *dev, char *useraddr) ++{ ++ struct ethtool_value edata = { ETHTOOL_GSG }; ++ ++ if (!ethtool_ops->get_sg) ++ return -EOPNOTSUPP; ++ ++ edata.data = ethtool_ops->get_sg(dev); ++ ++ if (copy_to_user(useraddr, &edata, sizeof(edata))) ++ return -EFAULT; ++ return 0; ++} ++ ++static int ethtool_set_sg(struct net_device *dev, char *useraddr) ++{ ++ struct ethtool_value edata; ++ ++ if (!ethtool_ops->set_sg) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&edata, useraddr, sizeof(edata))) ++ return -EFAULT; ++ ++ return ethtool_ops->set_sg(dev, edata.data); ++} ++ ++static int ethtool_get_tso(struct net_device *dev, char *useraddr) ++{ ++ struct ethtool_value edata = { ETHTOOL_GTSO }; ++ ++ if (!ethtool_ops->get_tso) ++ return -EOPNOTSUPP; ++ ++ edata.data = ethtool_ops->get_tso(dev); ++ ++ if (copy_to_user(useraddr, &edata, sizeof(edata))) ++ return -EFAULT; ++ return 0; ++} ++ ++static int ethtool_set_tso(struct net_device *dev, char *useraddr) ++{ ++ struct ethtool_value edata; ++ ++ if (!ethtool_ops->set_tso) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&edata, useraddr, sizeof(edata))) ++ return -EFAULT; ++ ++ return ethtool_ops->set_tso(dev, edata.data); ++} ++ ++static int ethtool_self_test(struct net_device *dev, char *useraddr) ++{ ++ struct ethtool_test test; ++ struct ethtool_ops *ops = ethtool_ops; ++ u64 *data; ++ int ret; ++ ++ if (!ops->self_test || !ops->self_test_count) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&test, useraddr, sizeof(test))) ++ return -EFAULT; ++ ++ test.len = ops->self_test_count(dev); ++ data = kmalloc(test.len * sizeof(u64), GFP_USER); ++ if (!data) ++ return -ENOMEM; ++ ++ ops->self_test(dev, &test, data); ++ ++ ret = -EFAULT; ++ if (copy_to_user(useraddr, &test, sizeof(test))) ++ goto out; ++ useraddr += sizeof(test); ++ if (copy_to_user(useraddr, data, test.len * sizeof(u64))) ++ goto out; ++ ret = 0; ++ ++out: ++ kfree(data); ++ return ret; ++} ++ ++static int ethtool_get_strings(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_gstrings gstrings; ++ struct ethtool_ops *ops = ethtool_ops; ++ u8 *data; ++ int ret; ++ ++ if (!ops->get_strings) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&gstrings, useraddr, sizeof(gstrings))) ++ return -EFAULT; ++ ++ switch (gstrings.string_set) { ++ case ETH_SS_TEST: ++ if (!ops->self_test_count) ++ return -EOPNOTSUPP; ++ gstrings.len = ops->self_test_count(dev); ++ break; ++ case ETH_SS_STATS: ++ if (!ops->get_stats_count) ++ return -EOPNOTSUPP; ++ gstrings.len = ops->get_stats_count(dev); ++ break; ++ default: ++ return -EINVAL; ++ } ++ ++ data = kmalloc(gstrings.len * ETH_GSTRING_LEN, GFP_USER); ++ if (!data) ++ return -ENOMEM; ++ ++ ops->get_strings(dev, gstrings.string_set, data); ++ ++ ret = -EFAULT; ++ if (copy_to_user(useraddr, &gstrings, sizeof(gstrings))) ++ goto out; ++ useraddr += sizeof(gstrings); ++ if (copy_to_user(useraddr, data, gstrings.len * ETH_GSTRING_LEN)) ++ goto out; ++ ret = 0; ++ ++out: ++ kfree(data); ++ return ret; ++} ++ ++static int ethtool_phys_id(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_value id; ++ ++ if (!ethtool_ops->phys_id) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&id, useraddr, sizeof(id))) ++ return -EFAULT; ++ ++ return ethtool_ops->phys_id(dev, id.data); ++} ++ ++static int ethtool_get_stats(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_stats stats; ++ struct ethtool_ops *ops = ethtool_ops; ++ u64 *data; ++ int ret; ++ ++ if (!ops->get_ethtool_stats || !ops->get_stats_count) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&stats, useraddr, sizeof(stats))) ++ return -EFAULT; ++ ++ stats.n_stats = ops->get_stats_count(dev); ++ data = kmalloc(stats.n_stats * sizeof(u64), GFP_USER); ++ if (!data) ++ return -ENOMEM; ++ ++ ops->get_ethtool_stats(dev, &stats, data); ++ ++ ret = -EFAULT; ++ if (copy_to_user(useraddr, &stats, sizeof(stats))) ++ goto out; ++ useraddr += sizeof(stats); ++ if (copy_to_user(useraddr, data, stats.n_stats * sizeof(u64))) ++ goto out; ++ ret = 0; ++ ++out: ++ kfree(data); ++ return ret; ++} ++ ++/* The main entry point in this file. Called from net/core/dev.c */ ++ ++#define ETHTOOL_OPS_COMPAT ++int ethtool_ioctl(struct ifreq *ifr) ++{ ++ struct net_device *dev = __dev_get_by_name(ifr->ifr_name); ++ void *useraddr = (void *) ifr->ifr_data; ++ u32 ethcmd; ++ ++ /* ++ * XXX: This can be pushed down into the ethtool_* handlers that ++ * need it. Keep existing behavior for the moment. ++ */ ++ if (!capable(CAP_NET_ADMIN)) ++ return -EPERM; ++ ++ if (!dev || !netif_device_present(dev)) ++ return -ENODEV; ++ ++ if (copy_from_user(ðcmd, useraddr, sizeof (ethcmd))) ++ return -EFAULT; ++ ++ switch (ethcmd) { ++ case ETHTOOL_GSET: ++ return ethtool_get_settings(dev, useraddr); ++ case ETHTOOL_SSET: ++ return ethtool_set_settings(dev, useraddr); ++ case ETHTOOL_GDRVINFO: ++ return ethtool_get_drvinfo(dev, useraddr); ++ case ETHTOOL_GREGS: ++ return ethtool_get_regs(dev, useraddr); ++ case ETHTOOL_GWOL: ++ return ethtool_get_wol(dev, useraddr); ++ case ETHTOOL_SWOL: ++ return ethtool_set_wol(dev, useraddr); ++ case ETHTOOL_GMSGLVL: ++ return ethtool_get_msglevel(dev, useraddr); ++ case ETHTOOL_SMSGLVL: ++ return ethtool_set_msglevel(dev, useraddr); ++ case ETHTOOL_NWAY_RST: ++ return ethtool_nway_reset(dev); ++ case ETHTOOL_GLINK: ++ return ethtool_get_link(dev, useraddr); ++ case ETHTOOL_GEEPROM: ++ return ethtool_get_eeprom(dev, useraddr); ++ case ETHTOOL_SEEPROM: ++ return ethtool_set_eeprom(dev, useraddr); ++ case ETHTOOL_GCOALESCE: ++ return ethtool_get_coalesce(dev, useraddr); ++ case ETHTOOL_SCOALESCE: ++ return ethtool_set_coalesce(dev, useraddr); ++ case ETHTOOL_GRINGPARAM: ++ return ethtool_get_ringparam(dev, useraddr); ++ case ETHTOOL_SRINGPARAM: ++ return ethtool_set_ringparam(dev, useraddr); ++ case ETHTOOL_GPAUSEPARAM: ++ return ethtool_get_pauseparam(dev, useraddr); ++ case ETHTOOL_SPAUSEPARAM: ++ return ethtool_set_pauseparam(dev, useraddr); ++ case ETHTOOL_GRXCSUM: ++ return ethtool_get_rx_csum(dev, useraddr); ++ case ETHTOOL_SRXCSUM: ++ return ethtool_set_rx_csum(dev, useraddr); ++ case ETHTOOL_GTXCSUM: ++ return ethtool_get_tx_csum(dev, useraddr); ++ case ETHTOOL_STXCSUM: ++ return ethtool_set_tx_csum(dev, useraddr); ++ case ETHTOOL_GSG: ++ return ethtool_get_sg(dev, useraddr); ++ case ETHTOOL_SSG: ++ return ethtool_set_sg(dev, useraddr); ++ case ETHTOOL_GTSO: ++ return ethtool_get_tso(dev, useraddr); ++ case ETHTOOL_STSO: ++ return ethtool_set_tso(dev, useraddr); ++ case ETHTOOL_TEST: ++ return ethtool_self_test(dev, useraddr); ++ case ETHTOOL_GSTRINGS: ++ return ethtool_get_strings(dev, useraddr); ++ case ETHTOOL_PHYS_ID: ++ return ethtool_phys_id(dev, useraddr); ++ case ETHTOOL_GSTATS: ++ return ethtool_get_stats(dev, useraddr); ++ default: ++ return -EOPNOTSUPP; ++ } ++ ++ return -EOPNOTSUPP; ++} ++ ++#define mii_if_info _kc_mii_if_info ++struct _kc_mii_if_info { ++ int phy_id; ++ int advertising; ++ int phy_id_mask; ++ int reg_num_mask; ++ ++ unsigned int full_duplex : 1; /* is full duplex? */ ++ unsigned int force_media : 1; /* is autoneg. disabled? */ ++ ++ struct net_device *dev; ++ int (*mdio_read) (struct net_device *dev, int phy_id, int location); ++ void (*mdio_write) (struct net_device *dev, int phy_id, int location, int val); ++}; ++ ++struct ethtool_cmd; ++struct mii_ioctl_data; ++ ++#undef mii_link_ok ++#define mii_link_ok _kc_mii_link_ok ++#undef mii_nway_restart ++#define mii_nway_restart _kc_mii_nway_restart ++#undef mii_ethtool_gset ++#define mii_ethtool_gset _kc_mii_ethtool_gset ++#undef mii_ethtool_sset ++#define mii_ethtool_sset _kc_mii_ethtool_sset ++#undef mii_check_link ++#define mii_check_link _kc_mii_check_link ++#undef generic_mii_ioctl ++#define generic_mii_ioctl _kc_generic_mii_ioctl ++extern int _kc_mii_link_ok (struct mii_if_info *mii); ++extern int _kc_mii_nway_restart (struct mii_if_info *mii); ++extern int _kc_mii_ethtool_gset(struct mii_if_info *mii, ++ struct ethtool_cmd *ecmd); ++extern int _kc_mii_ethtool_sset(struct mii_if_info *mii, ++ struct ethtool_cmd *ecmd); ++extern void _kc_mii_check_link (struct mii_if_info *mii); ++extern int _kc_generic_mii_ioctl(struct mii_if_info *mii_if, ++ struct mii_ioctl_data *mii_data, int cmd, ++ unsigned int *duplex_changed); ++ ++ ++struct _kc_pci_dev_ext { ++ struct pci_dev *dev; ++ void *pci_drvdata; ++ struct pci_driver *driver; ++}; ++ ++struct _kc_net_dev_ext { ++ struct net_device *dev; ++ unsigned int carrier; ++}; ++ ++ ++/**************************************/ ++/* mii support */ ++ ++int _kc_mii_ethtool_gset(struct mii_if_info *mii, struct ethtool_cmd *ecmd) ++{ ++ struct net_device *dev = mii->dev; ++ u32 advert, bmcr, lpa, nego; ++ ++ ecmd->supported = ++ (SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full | ++ SUPPORTED_100baseT_Half | SUPPORTED_100baseT_Full | ++ SUPPORTED_Autoneg | SUPPORTED_TP | SUPPORTED_MII); ++ ++ /* only supports twisted-pair */ ++ ecmd->port = PORT_MII; ++ ++ /* only supports internal transceiver */ ++ ecmd->transceiver = XCVR_INTERNAL; ++ ++ /* this isn't fully supported at higher layers */ ++ ecmd->phy_address = mii->phy_id; ++ ++ ecmd->advertising = ADVERTISED_TP | ADVERTISED_MII; ++ advert = mii->mdio_read(dev, mii->phy_id, MII_ADVERTISE); ++ if (advert & ADVERTISE_10HALF) ++ ecmd->advertising |= ADVERTISED_10baseT_Half; ++ if (advert & ADVERTISE_10FULL) ++ ecmd->advertising |= ADVERTISED_10baseT_Full; ++ if (advert & ADVERTISE_100HALF) ++ ecmd->advertising |= ADVERTISED_100baseT_Half; ++ if (advert & ADVERTISE_100FULL) ++ ecmd->advertising |= ADVERTISED_100baseT_Full; ++ ++ bmcr = mii->mdio_read(dev, mii->phy_id, MII_BMCR); ++ lpa = mii->mdio_read(dev, mii->phy_id, MII_LPA); ++ if (bmcr & BMCR_ANENABLE) { ++ ecmd->advertising |= ADVERTISED_Autoneg; ++ ecmd->autoneg = AUTONEG_ENABLE; ++ ++ nego = mii_nway_result(advert & lpa); ++ if (nego == LPA_100FULL || nego == LPA_100HALF) ++ ecmd->speed = SPEED_100; ++ else ++ ecmd->speed = SPEED_10; ++ if (nego == LPA_100FULL || nego == LPA_10FULL) { ++ ecmd->duplex = DUPLEX_FULL; ++ mii->full_duplex = 1; ++ } else { ++ ecmd->duplex = DUPLEX_HALF; ++ mii->full_duplex = 0; ++ } ++ } else { ++ ecmd->autoneg = AUTONEG_DISABLE; ++ ++ ecmd->speed = (bmcr & BMCR_SPEED100) ? SPEED_100 : SPEED_10; ++ ecmd->duplex = (bmcr & BMCR_FULLDPLX) ? DUPLEX_FULL : DUPLEX_HALF; ++ } ++ ++ /* ignore maxtxpkt, maxrxpkt for now */ ++ ++ return 0; ++} ++ ++int _kc_mii_ethtool_sset(struct mii_if_info *mii, struct ethtool_cmd *ecmd) ++{ ++ struct net_device *dev = mii->dev; ++ ++ if (ecmd->speed != SPEED_10 && ecmd->speed != SPEED_100) ++ return -EINVAL; ++ if (ecmd->duplex != DUPLEX_HALF && ecmd->duplex != DUPLEX_FULL) ++ return -EINVAL; ++ if (ecmd->port != PORT_MII) ++ return -EINVAL; ++ if (ecmd->transceiver != XCVR_INTERNAL) ++ return -EINVAL; ++ if (ecmd->phy_address != mii->phy_id) ++ return -EINVAL; ++ if (ecmd->autoneg != AUTONEG_DISABLE && ecmd->autoneg != AUTONEG_ENABLE) ++ return -EINVAL; ++ ++ /* ignore supported, maxtxpkt, maxrxpkt */ ++ ++ if (ecmd->autoneg == AUTONEG_ENABLE) { ++ u32 bmcr, advert, tmp; ++ ++ if ((ecmd->advertising & (ADVERTISED_10baseT_Half | ++ ADVERTISED_10baseT_Full | ++ ADVERTISED_100baseT_Half | ++ ADVERTISED_100baseT_Full)) == 0) ++ return -EINVAL; ++ ++ /* advertise only what has been requested */ ++ advert = mii->mdio_read(dev, mii->phy_id, MII_ADVERTISE); ++ tmp = advert & ~(ADVERTISE_ALL | ADVERTISE_100BASE4); ++ if (ADVERTISED_10baseT_Half) ++ tmp |= ADVERTISE_10HALF; ++ if (ADVERTISED_10baseT_Full) ++ tmp |= ADVERTISE_10FULL; ++ if (ADVERTISED_100baseT_Half) ++ tmp |= ADVERTISE_100HALF; ++ if (ADVERTISED_100baseT_Full) ++ tmp |= ADVERTISE_100FULL; ++ if (advert != tmp) { ++ mii->mdio_write(dev, mii->phy_id, MII_ADVERTISE, tmp); ++ mii->advertising = tmp; ++ } ++ ++ /* turn on autonegotiation, and force a renegotiate */ ++ bmcr = mii->mdio_read(dev, mii->phy_id, MII_BMCR); ++ bmcr |= (BMCR_ANENABLE | BMCR_ANRESTART); ++ mii->mdio_write(dev, mii->phy_id, MII_BMCR, bmcr); ++ ++ mii->force_media = 0; ++ } else { ++ u32 bmcr, tmp; ++ ++ /* turn off auto negotiation, set speed and duplexity */ ++ bmcr = mii->mdio_read(dev, mii->phy_id, MII_BMCR); ++ tmp = bmcr & ~(BMCR_ANENABLE | BMCR_SPEED100 | BMCR_FULLDPLX); ++ if (ecmd->speed == SPEED_100) ++ tmp |= BMCR_SPEED100; ++ if (ecmd->duplex == DUPLEX_FULL) { ++ tmp |= BMCR_FULLDPLX; ++ mii->full_duplex = 1; ++ } else ++ mii->full_duplex = 0; ++ if (bmcr != tmp) ++ mii->mdio_write(dev, mii->phy_id, MII_BMCR, tmp); ++ ++ mii->force_media = 1; ++ } ++ return 0; ++} ++ ++int _kc_mii_link_ok (struct mii_if_info *mii) ++{ ++ /* first, a dummy read, needed to latch some MII phys */ ++ mii->mdio_read(mii->dev, mii->phy_id, MII_BMSR); ++ if (mii->mdio_read(mii->dev, mii->phy_id, MII_BMSR) & BMSR_LSTATUS) ++ return 1; ++ return 0; ++} ++ ++int _kc_mii_nway_restart (struct mii_if_info *mii) ++{ ++ int bmcr; ++ int r = -EINVAL; ++ ++ /* if autoneg is off, it's an error */ ++ bmcr = mii->mdio_read(mii->dev, mii->phy_id, MII_BMCR); ++ ++ if (bmcr & BMCR_ANENABLE) { ++ bmcr |= BMCR_ANRESTART; ++ mii->mdio_write(mii->dev, mii->phy_id, MII_BMCR, bmcr); ++ r = 0; ++ } ++ ++ return r; ++} ++ ++void _kc_mii_check_link (struct mii_if_info *mii) ++{ ++ int cur_link = mii_link_ok(mii); ++ int prev_link = netif_carrier_ok(mii->dev); ++ ++ if (cur_link && !prev_link) ++ netif_carrier_on(mii->dev); ++ else if (prev_link && !cur_link) ++ netif_carrier_off(mii->dev); ++} ++ ++int _kc_generic_mii_ioctl(struct mii_if_info *mii_if, ++ struct mii_ioctl_data *mii_data, int cmd, ++ unsigned int *duplex_chg_out) ++{ ++ int rc = 0; ++ unsigned int duplex_changed = 0; ++ ++ if (duplex_chg_out) ++ *duplex_chg_out = 0; ++ ++ mii_data->phy_id &= mii_if->phy_id_mask; ++ mii_data->reg_num &= mii_if->reg_num_mask; ++ ++ switch(cmd) { ++ case SIOCDEVPRIVATE: /* binary compat, remove in 2.5 */ ++ case SIOCGMIIPHY: ++ mii_data->phy_id = mii_if->phy_id; ++ /* fall through */ ++ ++ case SIOCDEVPRIVATE + 1:/* binary compat, remove in 2.5 */ ++ case SIOCGMIIREG: ++ mii_data->val_out = ++ mii_if->mdio_read(mii_if->dev, mii_data->phy_id, ++ mii_data->reg_num); ++ break; ++ ++ case SIOCDEVPRIVATE + 2:/* binary compat, remove in 2.5 */ ++ case SIOCSMIIREG: { ++ u16 val = mii_data->val_in; ++ ++ if (!capable(CAP_NET_ADMIN)) ++ return -EPERM; ++ ++ if (mii_data->phy_id == mii_if->phy_id) { ++ switch(mii_data->reg_num) { ++ case MII_BMCR: { ++ unsigned int new_duplex = 0; ++ if (val & (BMCR_RESET|BMCR_ANENABLE)) ++ mii_if->force_media = 0; ++ else ++ mii_if->force_media = 1; ++ if (mii_if->force_media && ++ (val & BMCR_FULLDPLX)) ++ new_duplex = 1; ++ if (mii_if->full_duplex != new_duplex) { ++ duplex_changed = 1; ++ mii_if->full_duplex = new_duplex; ++ } ++ break; ++ } ++ case MII_ADVERTISE: ++ mii_if->advertising = val; ++ break; ++ default: ++ /* do nothing */ ++ break; ++ } ++ } ++ ++ mii_if->mdio_write(mii_if->dev, mii_data->phy_id, ++ mii_data->reg_num, val); ++ break; ++ } ++ ++ default: ++ rc = -EOPNOTSUPP; ++ break; ++ } ++ ++ if ((rc == 0) && (duplex_chg_out) && (duplex_changed)) ++ *duplex_chg_out = 1; ++ ++ return rc; ++} ++ +diff -r bd70f2f305c6 drivers/net/e1000e/netdev.c +--- a/drivers/net/e1000e/netdev.c Mon Jun 15 11:43:16 2009 +0100 ++++ b/drivers/net/e1000e/netdev.c Mon Jun 15 11:45:35 2009 +0100 +@@ -1,7 +1,7 @@ + /******************************************************************************* + + Intel PRO/1000 Linux driver +- Copyright(c) 1999 - 2008 Intel Corporation. ++ Copyright(c) 1999 - 2009 Intel Corporation. + + This program is free software; you can redistribute it and/or modify it + under the terms and conditions of the GNU General Public License, +@@ -36,43 +36,255 @@ + #include + #include + #include ++#ifdef NETIF_F_TSO + #include ++#ifdef NETIF_F_TSO6 + #include ++#endif ++#endif + #include + #include + #include +-#include +-#include +-#include + + #include "e1000.h" + +-#define DRV_VERSION "0.3.3.3-k6" ++#ifdef CONFIG_E1000E_NAPI ++#define DRV_EXTRAVERSION "-NAPI" ++#else ++#define DRV_EXTRAVERSION ++#endif ++ ++#define DRV_VERSION "0.5.18.3" DRV_EXTRAVERSION + char e1000e_driver_name[] = "e1000e"; + const char e1000e_driver_version[] = DRV_VERSION; ++ ++static s32 e1000_get_variants_82571(struct e1000_adapter *adapter) ++{ ++ struct e1000_hw *hw = &adapter->hw; ++ static int global_quad_port_a; /* global port a indication */ ++ struct pci_dev *pdev = adapter->pdev; ++ u16 eeprom_data = 0; ++ int is_port_b = er32(STATUS) & E1000_STATUS_FUNC_1; ++ ++ /* tag quad port adapters first, it's used below */ ++ switch (pdev->device) { ++ case E1000_DEV_ID_82571EB_QUAD_COPPER: ++ case E1000_DEV_ID_82571EB_QUAD_FIBER: ++ case E1000_DEV_ID_82571EB_QUAD_COPPER_LP: ++ case E1000_DEV_ID_82571PT_QUAD_COPPER: ++ adapter->flags |= FLAG_IS_QUAD_PORT; ++ /* mark the first port */ ++ if (global_quad_port_a == 0) ++ adapter->flags |= FLAG_IS_QUAD_PORT_A; ++ /* Reset for multiple quad port adapters */ ++ global_quad_port_a++; ++ if (global_quad_port_a == 4) ++ global_quad_port_a = 0; ++ break; ++ default: ++ break; ++ } ++ ++ switch (adapter->hw.mac.type) { ++ case e1000_82571: ++ /* these dual ports don't have WoL on port B at all */ ++ if (((pdev->device == E1000_DEV_ID_82571EB_FIBER) || ++ (pdev->device == E1000_DEV_ID_82571EB_SERDES) || ++ (pdev->device == E1000_DEV_ID_82571EB_COPPER)) && ++ (is_port_b)) ++ adapter->flags &= ~FLAG_HAS_WOL; ++ /* quad ports only support WoL on port A */ ++ if (adapter->flags & FLAG_IS_QUAD_PORT && ++ (!(adapter->flags & FLAG_IS_QUAD_PORT_A))) ++ adapter->flags &= ~FLAG_HAS_WOL; ++ /* Does not support WoL on any port */ ++ if (pdev->device == E1000_DEV_ID_82571EB_SERDES_QUAD) ++ adapter->flags &= ~FLAG_HAS_WOL; ++ break; ++ ++ case e1000_82573: ++ if (pdev->device == E1000_DEV_ID_82573L) { ++ if (e1000_read_nvm(&adapter->hw, NVM_INIT_3GIO_3, 1, ++ &eeprom_data) < 0) ++ break; ++ if (!(eeprom_data & NVM_WORD1A_ASPM_MASK)) ++ adapter->flags |= FLAG_HAS_JUMBO_FRAMES; ++ } ++ break; ++ ++ default: ++ break; ++ } ++ ++ return 0; ++} ++ ++static struct e1000_info e1000_82571_info = { ++ .mac = e1000_82571, ++ .flags = FLAG_HAS_HW_VLAN_FILTER ++ | FLAG_HAS_JUMBO_FRAMES ++ | FLAG_HAS_WOL ++ | FLAG_APME_IN_CTRL3 ++ | FLAG_RX_CSUM_ENABLED ++ | FLAG_HAS_CTRLEXT_ON_LOAD ++ | FLAG_HAS_SMART_POWER_DOWN ++ | FLAG_RESET_OVERWRITES_LAA /* errata */ ++ | FLAG_TARC_SPEED_MODE_BIT /* errata */ ++ | FLAG_APME_CHECK_PORT_B, ++ .pba = 38, ++ .init_ops = e1000_init_function_pointers_82571, ++ .get_variants = e1000_get_variants_82571, ++}; ++ ++static struct e1000_info e1000_82572_info = { ++ .mac = e1000_82572, ++ .flags = FLAG_HAS_HW_VLAN_FILTER ++ | FLAG_HAS_JUMBO_FRAMES ++ | FLAG_HAS_WOL ++ | FLAG_APME_IN_CTRL3 ++ | FLAG_RX_CSUM_ENABLED ++ | FLAG_HAS_CTRLEXT_ON_LOAD ++ | FLAG_TARC_SPEED_MODE_BIT, /* errata */ ++ .pba = 38, ++ .init_ops = e1000_init_function_pointers_82571, ++ .get_variants = e1000_get_variants_82571, ++}; ++ ++static struct e1000_info e1000_82573_info = { ++ .mac = e1000_82573, ++ .flags = FLAG_HAS_HW_VLAN_FILTER ++ | FLAG_HAS_WOL ++ | FLAG_APME_IN_CTRL3 ++ | FLAG_RX_CSUM_ENABLED ++ | FLAG_HAS_SMART_POWER_DOWN ++ | FLAG_HAS_AMT ++ | FLAG_HAS_ERT ++ | FLAG_HAS_SWSM_ON_LOAD, ++ .pba = 20, ++ .init_ops = e1000_init_function_pointers_82571, ++ .get_variants = e1000_get_variants_82571, ++}; ++ ++static struct e1000_info e1000_82574_info = { ++ .mac = e1000_82574, ++ .flags = FLAG_HAS_HW_VLAN_FILTER ++#ifdef CONFIG_E1000E_MSIX ++ | FLAG_HAS_MSIX ++#endif ++ | FLAG_HAS_JUMBO_FRAMES ++ | FLAG_HAS_WOL ++ | FLAG_APME_IN_CTRL3 ++ | FLAG_RX_CSUM_ENABLED ++ | FLAG_HAS_SMART_POWER_DOWN ++ | FLAG_HAS_AMT ++ | FLAG_HAS_CTRLEXT_ON_LOAD, ++ .pba = 20, ++ .init_ops = e1000_init_function_pointers_82571, ++ .get_variants = e1000_get_variants_82571, ++}; ++ ++static struct e1000_info e1000_82583_info = { ++ .mac = e1000_82583, ++ .flags = FLAG_HAS_HW_VLAN_FILTER ++ | FLAG_HAS_WOL ++ | FLAG_APME_IN_CTRL3 ++ | FLAG_RX_CSUM_ENABLED ++ | FLAG_HAS_SMART_POWER_DOWN ++ | FLAG_HAS_AMT ++ | FLAG_HAS_CTRLEXT_ON_LOAD, ++ .pba = 20, ++ .init_ops = e1000_init_function_pointers_82571, ++ .get_variants = e1000_get_variants_82571, ++}; ++ ++static struct e1000_info e1000_es2_info = { ++ .mac = e1000_80003es2lan, ++ .flags = FLAG_HAS_HW_VLAN_FILTER ++ | FLAG_HAS_JUMBO_FRAMES ++ | FLAG_HAS_WOL ++ | FLAG_APME_IN_CTRL3 ++ | FLAG_RX_CSUM_ENABLED ++ | FLAG_HAS_CTRLEXT_ON_LOAD ++ | FLAG_RX_NEEDS_RESTART /* errata */ ++ | FLAG_TARC_SET_BIT_ZERO /* errata */ ++ | FLAG_APME_CHECK_PORT_B ++ | FLAG_DISABLE_FC_PAUSE_TIME /* errata */ ++ | FLAG_TIPG_MEDIUM_FOR_80003ESLAN, ++ .pba = 38, ++ .init_ops = e1000_init_function_pointers_80003es2lan, ++ .get_variants = NULL, ++}; ++ ++static s32 e1000_get_variants_ich8lan(struct e1000_adapter *adapter) ++{ ++ if (adapter->hw.phy.type == e1000_phy_ife) ++ adapter->flags &= ~FLAG_HAS_JUMBO_FRAMES; ++ ++ if ((adapter->hw.mac.type == e1000_ich8lan) && ++ (adapter->hw.phy.type == e1000_phy_igp_3)) ++ adapter->flags |= FLAG_LSC_GIG_SPEED_DROP; ++ ++ return 0; ++} ++ ++static struct e1000_info e1000_ich8_info = { ++ .mac = e1000_ich8lan, ++ .flags = FLAG_HAS_WOL ++ | FLAG_IS_ICH ++ | FLAG_RX_CSUM_ENABLED ++ | FLAG_HAS_CTRLEXT_ON_LOAD ++ | FLAG_HAS_AMT ++ | FLAG_HAS_FLASH ++ | FLAG_APME_IN_WUC, ++ .pba = 8, ++ .init_ops = e1000_init_function_pointers_ich8lan, ++ .get_variants = e1000_get_variants_ich8lan, ++}; ++ ++static struct e1000_info e1000_ich9_info = { ++ .mac = e1000_ich9lan, ++ .flags = FLAG_HAS_JUMBO_FRAMES ++ | FLAG_IS_ICH ++ | FLAG_HAS_WOL ++ | FLAG_RX_CSUM_ENABLED ++ | FLAG_HAS_CTRLEXT_ON_LOAD ++ | FLAG_HAS_AMT ++ | FLAG_HAS_ERT ++ | FLAG_HAS_FLASH ++ | FLAG_APME_IN_WUC, ++ .pba = 10, ++ .init_ops = e1000_init_function_pointers_ich8lan, ++ .get_variants = e1000_get_variants_ich8lan, ++}; ++ ++static struct e1000_info e1000_ich10_info = { ++ .mac = e1000_ich10lan, ++ .flags = FLAG_HAS_JUMBO_FRAMES ++ | FLAG_IS_ICH ++ | FLAG_HAS_WOL ++ | FLAG_RX_CSUM_ENABLED ++ | FLAG_HAS_CTRLEXT_ON_LOAD ++ | FLAG_HAS_AMT ++ | FLAG_HAS_ERT ++ | FLAG_HAS_FLASH ++ | FLAG_APME_IN_WUC, ++ .pba = 10, ++ .init_ops = e1000_init_function_pointers_ich8lan, ++ .get_variants = e1000_get_variants_ich8lan, ++}; + + static const struct e1000_info *e1000_info_tbl[] = { + [board_82571] = &e1000_82571_info, + [board_82572] = &e1000_82572_info, + [board_82573] = &e1000_82573_info, + [board_82574] = &e1000_82574_info, ++ [board_82583] = &e1000_82583_info, + [board_80003es2lan] = &e1000_es2_info, + [board_ich8lan] = &e1000_ich8_info, + [board_ich9lan] = &e1000_ich9_info, + [board_ich10lan] = &e1000_ich10_info, + }; + +-#ifdef DEBUG +-/** +- * e1000_get_hw_dev_name - return device name string +- * used by hardware layer to print debugging information +- **/ +-char *e1000e_get_hw_dev_name(struct e1000_hw *hw) +-{ +- return hw->adapter->netdev->name; +-} +-#endif +- + /** + * e1000_desc_unused - calculate if we have unused descriptors + **/ +@@ -98,13 +310,26 @@ + { + skb->protocol = eth_type_trans(skb, netdev); + ++#ifdef CONFIG_E1000E_NAPI + if (adapter->vlgrp && (status & E1000_RXD_STAT_VP)) + vlan_hwaccel_receive_skb(skb, adapter->vlgrp, + le16_to_cpu(vlan)); + else ++#ifdef NETIF_F_GRO ++ napi_gro_receive(&adapter->napi, skb); ++#else + netif_receive_skb(skb); ++#endif /* NETIF_F_GRO */ ++#else ++ if (adapter->vlgrp && (status & E1000_RXD_STAT_VP)) ++ vlan_hwaccel_rx(skb, adapter->vlgrp, le16_to_cpu(vlan)); ++ else ++ netif_rx(skb); ++#endif ++#ifndef NETIF_F_GRO + + netdev->last_rx = jiffies; ++#endif + } + + /** +@@ -145,8 +370,8 @@ + * Hardware complements the payload checksum, so we undo it + * and then put the value in host order for further stack use. + */ +- __sum16 sum = (__force __sum16)htons(csum); +- skb->csum = csum_unfold(~sum); ++ csum = ntohl(csum ^ 0xFFFF); ++ skb->csum = csum; + skb->ip_summed = CHECKSUM_COMPLETE; + } + adapter->hw_csum_good++; +@@ -258,7 +483,7 @@ + continue; + } + if (!ps_page->page) { +- ps_page->page = netdev_alloc_page(netdev); ++ ps_page->page = alloc_page(GFP_ATOMIC); + if (!ps_page->page) { + adapter->alloc_rx_buff_failed++; + goto no_buffers; +@@ -342,10 +567,10 @@ + } + } + ++#ifdef CONFIG_E1000E_NAPI + /** + * e1000_alloc_jumbo_rx_buffers - Replace used jumbo receive buffers + * @adapter: address of board private structure +- * @rx_ring: pointer to receive ring structure + * @cleaned_count: number of buffers to allocate this pass + **/ + +@@ -424,6 +649,7 @@ + writel(i, adapter->hw.hw_addr + rx_ring->tail); + } + } ++#endif /* CONFIG_E1000E_NAPI */ + + /** + * e1000_clean_rx_irq - Send received data up the network stack; legacy +@@ -432,11 +658,16 @@ + * the return value indicates whether actual cleaning was done, there + * is no guarantee that everything was cleaned + **/ ++#ifdef CONFIG_E1000E_NAPI + static bool e1000_clean_rx_irq(struct e1000_adapter *adapter, + int *work_done, int work_to_do) +-{ +- struct net_device *netdev = adapter->netdev; +- struct pci_dev *pdev = adapter->pdev; ++#else ++static bool e1000_clean_rx_irq(struct e1000_adapter *adapter) ++#endif ++{ ++ struct net_device *netdev = adapter->netdev; ++ struct pci_dev *pdev = adapter->pdev; ++ struct e1000_hw *hw = &adapter->hw; + struct e1000_ring *rx_ring = adapter->rx_ring; + struct e1000_rx_desc *rx_desc, *next_rxd; + struct e1000_buffer *buffer_info, *next_buffer; +@@ -454,9 +685,11 @@ + struct sk_buff *skb; + u8 status; + ++#ifdef CONFIG_E1000E_NAPI + if (*work_done >= work_to_do) + break; + (*work_done)++; ++#endif + + status = rx_desc->status; + skb = buffer_info->skb; +@@ -486,8 +719,7 @@ + * packet, also make sure the frame isn't just CRC only */ + if (!(status & E1000_RXD_STAT_EOP) || (length <= 4)) { + /* All receives must fit into a single buffer */ +- e_dbg("%s: Receive packet consumed multiple buffers\n", +- netdev->name); ++ e_dbg("Receive packet consumed multiple buffers\n"); + /* recycle */ + buffer_info->skb = skb; + goto next_desc; +@@ -498,7 +730,7 @@ + buffer_info->skb = skb; + goto next_desc; + } +- ++ + /* adjust length to remove Ethernet CRC */ + if (!(adapter->flags2 & FLAG2_CRC_STRIPPING)) + length -= 4; +@@ -611,8 +843,7 @@ + * e1000_clean_tx_irq - Reclaim resources after transmit completes + * @adapter: board private structure + * +- * the return value indicates whether actual cleaning was done, there +- * is no guarantee that everything was cleaned ++ * the return value indicates if there is more work to do (later) + **/ + static bool e1000_clean_tx_irq(struct e1000_adapter *adapter) + { +@@ -622,8 +853,7 @@ + struct e1000_tx_desc *tx_desc, *eop_desc; + struct e1000_buffer *buffer_info; + unsigned int i, eop; +- unsigned int count = 0; +- bool cleaned = 0; ++ bool cleaned = 0, retval = 1; + unsigned int total_tx_bytes = 0, total_tx_packets = 0; + + i = tx_ring->next_to_clean; +@@ -638,6 +868,7 @@ + + if (cleaned) { + struct sk_buff *skb = buffer_info->skb; ++#ifdef NETIF_F_TSO + unsigned int segs, bytecount; + segs = skb_shinfo(skb)->gso_segs ?: 1; + /* multiply data chunks by size of headers */ +@@ -645,6 +876,10 @@ + skb->len; + total_tx_packets += segs; + total_tx_bytes += bytecount; ++#else ++ total_tx_packets++; ++ total_tx_bytes += skb->len; ++#endif + } + + e1000_put_txbuf(adapter, buffer_info); +@@ -653,16 +888,21 @@ + i++; + if (i == tx_ring->count) + i = 0; ++#ifdef CONFIG_E1000E_NAPI ++ if (total_tx_packets >= tx_ring->count) { ++ retval = 0; ++ goto done_cleaning; ++ } ++#endif + } + + eop = tx_ring->buffer_info[i].next_to_watch; + eop_desc = E1000_TX_DESC(*tx_ring, eop); +-#define E1000_TX_WEIGHT 64 +- /* weight of a sort for tx, to avoid endless transmit cleanup */ +- if (count++ == E1000_TX_WEIGHT) +- break; +- } +- ++ } ++ ++#ifdef CONFIG_E1000E_NAPI ++done_cleaning: ++#endif + tx_ring->next_to_clean = i; + + #define TX_WAKE_THRESHOLD 32 +@@ -698,7 +938,7 @@ + adapter->total_tx_packets += total_tx_packets; + adapter->net_stats.tx_bytes += total_tx_bytes; + adapter->net_stats.tx_packets += total_tx_packets; +- return cleaned; ++ return retval; + } + + /** +@@ -708,9 +948,14 @@ + * the return value indicates whether actual cleaning was done, there + * is no guarantee that everything was cleaned + **/ ++#ifdef CONFIG_E1000E_NAPI + static bool e1000_clean_rx_irq_ps(struct e1000_adapter *adapter, + int *work_done, int work_to_do) +-{ ++#else ++static bool e1000_clean_rx_irq_ps(struct e1000_adapter *adapter) ++#endif ++{ ++ struct e1000_hw *hw = &adapter->hw; + union e1000_rx_desc_packet_split *rx_desc, *next_rxd; + struct net_device *netdev = adapter->netdev; + struct pci_dev *pdev = adapter->pdev; +@@ -730,9 +975,11 @@ + buffer_info = &rx_ring->buffer_info[i]; + + while (staterr & E1000_RXD_STAT_DD) { ++#ifdef CONFIG_E1000E_NAPI + if (*work_done >= work_to_do) + break; + (*work_done)++; ++#endif + skb = buffer_info->skb; + + /* in the packet split case this is header only */ +@@ -754,8 +1001,8 @@ + buffer_info->dma = 0; + + if (!(staterr & E1000_RXD_STAT_EOP)) { +- e_dbg("%s: Packet Split buffers didn't pick up the " +- "full packet\n", netdev->name); ++ e_dbg("Packet Split buffers didn't pick up the full " ++ "packet\n"); + dev_kfree_skb_irq(skb); + goto next_desc; + } +@@ -768,8 +1015,8 @@ + length = le16_to_cpu(rx_desc->wb.middle.length0); + + if (!length) { +- e_dbg("%s: Last part of the packet spanning multiple " +- "descriptors\n", netdev->name); ++ e_dbg("Last part of the packet spanning multiple " ++ "descriptors\n"); + dev_kfree_skb_irq(skb); + goto next_desc; + } +@@ -777,6 +1024,7 @@ + /* Good Receive */ + skb_put(skb, length); + ++#ifdef CONFIG_E1000E_NAPI + { + /* + * this looks ugly, but it seems compiler issues make it +@@ -816,6 +1064,7 @@ + goto copydone; + } /* if */ + } ++#endif + + for (j = 0; j < PS_PAGE_BUFFERS; j++) { + length = le16_to_cpu(rx_desc->wb.upper.length[j]); +@@ -826,17 +1075,21 @@ + pci_unmap_page(pdev, ps_page->dma, PAGE_SIZE, + PCI_DMA_FROMDEVICE); + ps_page->dma = 0; +- skb_add_rx_frag(skb, j, ps_page->page, 0, length); ++ skb_fill_page_desc(skb, j, ps_page->page, 0, length); + ps_page->page = NULL; ++ skb->len += length; ++ skb->data_len += length; ++ skb->truesize += length; + } + + /* strip the ethernet crc, problem is we're using pages now so +- * this whole operation can get a little cpu intensive +- */ ++ * this whole operation can get a little cpu intensive */ + if (!(adapter->flags2 & FLAG2_CRC_STRIPPING)) + pskb_trim(skb, skb->len - 4); + ++#ifdef CONFIG_E1000E_NAPI + copydone: ++#endif + total_rx_bytes += skb->len; + total_rx_packets++; + +@@ -879,6 +1132,7 @@ + return cleaned; + } + ++#ifdef CONFIG_E1000E_NAPI + /** + * e1000_consume_page - helper function + **/ +@@ -1059,6 +1313,7 @@ + return cleaned; + } + ++#endif /* CONFIG_E1000E_NAPI */ + /** + * e1000_clean_rx_ring - Free Rx Buffers per Queue + * @adapter: board private structure +@@ -1079,10 +1334,12 @@ + pci_unmap_single(pdev, buffer_info->dma, + adapter->rx_buffer_len, + PCI_DMA_FROMDEVICE); ++#ifdef CONFIG_E1000E_NAPI + else if (adapter->clean_rx == e1000_clean_jumbo_rx_irq) + pci_unmap_page(pdev, buffer_info->dma, + PAGE_SIZE, + PCI_DMA_FROMDEVICE); ++#endif + else if (adapter->clean_rx == e1000_clean_rx_irq_ps) + pci_unmap_single(pdev, buffer_info->dma, + adapter->rx_ps_bsize0, +@@ -1112,11 +1369,13 @@ + } + } + ++#ifdef CONFIG_E1000E_NAPI + /* there also may be some cached data from a chained receive */ + if (rx_ring->rx_skb_top) { + dev_kfree_skb(rx_ring->rx_skb_top); + rx_ring->rx_skb_top = NULL; + } ++#endif + + /* Zero out the descriptor ring */ + memset(rx_ring->desc, 0, rx_ring->size); +@@ -1136,6 +1395,9 @@ + e1000e_gig_downshift_workaround_ich8lan(&adapter->hw); + } + ++#ifndef CONFIG_E1000E_NAPI ++static void e1000_set_itr(struct e1000_adapter *adapter); ++#endif + /** + * e1000_intr_msi - Interrupt Handler + * @irq: interrupt number +@@ -1146,13 +1408,16 @@ + struct net_device *netdev = data; + struct e1000_adapter *adapter = netdev_priv(netdev); + struct e1000_hw *hw = &adapter->hw; ++#ifndef CONFIG_E1000E_NAPI ++ int i; ++#endif + u32 icr = er32(ICR); + + /* + * read ICR disables interrupts using IAM + */ + +- if (icr & (E1000_ICR_RXSEQ | E1000_ICR_LSC)) { ++ if (icr & E1000_ICR_LSC) { + hw->mac.get_link_status = 1; + /* + * ICH8 workaround-- Call gig speed drop workaround on cable +@@ -1179,13 +1444,30 @@ + mod_timer(&adapter->watchdog_timer, jiffies + 1); + } + +- if (netif_rx_schedule_prep(netdev, &adapter->napi)) { ++#ifdef CONFIG_E1000E_NAPI ++ if (napi_schedule_prep(&adapter->napi)) { + adapter->total_tx_bytes = 0; + adapter->total_tx_packets = 0; + adapter->total_rx_bytes = 0; + adapter->total_rx_packets = 0; +- __netif_rx_schedule(netdev, &adapter->napi); +- } ++ __napi_schedule(&adapter->napi); ++ } ++#else ++ adapter->total_tx_bytes = 0; ++ adapter->total_rx_bytes = 0; ++ adapter->total_tx_packets = 0; ++ adapter->total_rx_packets = 0; ++ ++ for (i = 0; i < E1000_MAX_INTR; i++) { ++ int rx_cleaned = adapter->clean_rx(adapter); ++ int tx_cleaned_complete = e1000_clean_tx_irq(adapter); ++ if (!rx_cleaned && tx_cleaned_complete) ++ break; ++ } ++ ++ if (likely(adapter->itr_setting & 3)) ++ e1000_set_itr(adapter); ++#endif /* CONFIG_E1000E_NAPI */ + + return IRQ_HANDLED; + } +@@ -1200,11 +1482,16 @@ + struct net_device *netdev = data; + struct e1000_adapter *adapter = netdev_priv(netdev); + struct e1000_hw *hw = &adapter->hw; ++#ifndef CONFIG_E1000E_NAPI ++ int i; ++ int rx_cleaned, tx_cleaned_complete; ++#endif + u32 rctl, icr = er32(ICR); + + if (!icr) + return IRQ_NONE; /* Not our interrupt */ + ++#ifdef CONFIG_E1000E_NAPI + /* + * IMS will not auto-mask if INT_ASSERTED is not set, and if it is + * not set, then the adapter didn't send an interrupt +@@ -1212,13 +1499,14 @@ + if (!(icr & E1000_ICR_INT_ASSERTED)) + return IRQ_NONE; + ++#endif /* CONFIG_E1000E_NAPI */ + /* + * Interrupt Auto-Mask...upon reading ICR, + * interrupts are masked. No need for the + * IMC write + */ + +- if (icr & (E1000_ICR_RXSEQ | E1000_ICR_LSC)) { ++ if (icr & E1000_ICR_LSC) { + hw->mac.get_link_status = 1; + /* + * ICH8 workaround-- Call gig speed drop workaround on cable +@@ -1246,17 +1534,35 @@ + mod_timer(&adapter->watchdog_timer, jiffies + 1); + } + +- if (netif_rx_schedule_prep(netdev, &adapter->napi)) { ++#ifdef CONFIG_E1000E_NAPI ++ if (napi_schedule_prep(&adapter->napi)) { + adapter->total_tx_bytes = 0; + adapter->total_tx_packets = 0; + adapter->total_rx_bytes = 0; + adapter->total_rx_packets = 0; +- __netif_rx_schedule(netdev, &adapter->napi); +- } +- +- return IRQ_HANDLED; +-} +- ++ __napi_schedule(&adapter->napi); ++ } ++#else ++ adapter->total_tx_bytes = 0; ++ adapter->total_rx_bytes = 0; ++ adapter->total_tx_packets = 0; ++ adapter->total_rx_packets = 0; ++ ++ for (i = 0; i < E1000_MAX_INTR; i++) { ++ rx_cleaned = adapter->clean_rx(adapter); ++ tx_cleaned_complete = e1000_clean_tx_irq(adapter); ++ if (!rx_cleaned && tx_cleaned_complete) ++ break; ++ } ++ ++ if (likely(adapter->itr_setting & 3)) ++ e1000_set_itr(adapter); ++#endif /* CONFIG_E1000E_NAPI */ ++ ++ return IRQ_HANDLED; ++} ++ ++#ifdef CONFIG_E1000E_MSIX + static irqreturn_t e1000_msix_other(int irq, void *data) + { + struct net_device *netdev = data; +@@ -1288,6 +1594,7 @@ + } + + ++#ifdef CONFIG_E1000E_SEPARATE_TX_HANDLER + static irqreturn_t e1000_intr_msix_tx(int irq, void *data) + { + struct net_device *netdev = data; +@@ -1306,10 +1613,15 @@ + return IRQ_HANDLED; + } + ++#endif /* CONFIG_E1000E_SEPARATE_TX_HANDLER */ + static irqreturn_t e1000_intr_msix_rx(int irq, void *data) + { + struct net_device *netdev = data; + struct e1000_adapter *adapter = netdev_priv(netdev); ++#ifndef CONFIG_E1000E_NAPI ++ int i; ++ struct e1000_hw *hw = &adapter->hw; ++#endif + + /* Write the ITR value calculated at the end of the + * previous interrupt. +@@ -1320,11 +1632,41 @@ + adapter->rx_ring->set_itr = 0; + } + +- if (netif_rx_schedule_prep(netdev, &adapter->napi)) { ++#ifdef CONFIG_E1000E_NAPI ++ if (napi_schedule_prep(&adapter->napi)) { + adapter->total_rx_bytes = 0; + adapter->total_rx_packets = 0; +- __netif_rx_schedule(netdev, &adapter->napi); +- } ++#ifndef CONFIG_E1000E_SEPARATE_TX_HANDLER ++ adapter->total_tx_bytes = 0; ++ adapter->total_tx_packets = 0; ++#endif /* CONFIG_E1000E_SEPARATE_TX_HANDLER */ ++ __napi_schedule(&adapter->napi); ++ } ++#else ++ adapter->total_rx_bytes = 0; ++ adapter->total_rx_packets = 0; ++#ifndef CONFIG_E1000E_SEPARATE_TX_HANDLER ++ adapter->total_tx_bytes = 0; ++ adapter->total_tx_packets = 0; ++#endif ++ ++ for (i = 0; i < E1000_MAX_INTR; i++) { ++ int rx_cleaned = adapter->clean_rx(adapter); ++#ifndef CONFIG_E1000E_SEPARATE_TX_HANDLER ++ int tx_cleaned_complete = e1000_clean_tx_irq(adapter); ++ if (!rx_cleaned && tx_cleaned_complete) ++#else ++ if (!rx_cleaned) ++#endif ++ goto out; ++ } ++ /* If we got here, the ring was not completely cleaned, ++ * so fire another interrupt. ++ */ ++ ew32(ICS, adapter->rx_ring->ims_val); ++ ++out: ++#endif /* CONFIG_E1000E_NAPI */ + return IRQ_HANDLED; + } + +@@ -1364,12 +1706,16 @@ + + /* Configure Tx vector */ + tx_ring->ims_val = E1000_IMS_TXQ0; ++#ifdef CONFIG_E1000E_SEPARATE_TX_HANDLER + vector++; + if (tx_ring->itr_val) + writel(1000000000 / (tx_ring->itr_val * 256), + hw->hw_addr + tx_ring->itr_register); + else + writel(1, hw->hw_addr + tx_ring->itr_register); ++#else ++ rx_ring->ims_val |= tx_ring->ims_val; ++#endif + adapter->eiac_mask |= tx_ring->ims_val; + ivar |= ((E1000_IVAR_INT_ALLOC_VALID | vector) << 8); + +@@ -1392,7 +1738,6 @@ + ctrl_ext |= E1000_CTRL_EXT_PBA_CLR; + + /* Auto-Mask Other interrupts upon ICR read */ +-#define E1000_EIAC_MASK_82574 0x01F00000 + ew32(IAM, ~E1000_EIAC_MASK_82574 | E1000_IMS_OTHER); + ctrl_ext |= E1000_CTRL_EXT_EIAME; + ew32(CTRL_EXT, ctrl_ext); +@@ -1428,7 +1773,11 @@ + switch (adapter->int_mode) { + case E1000E_INT_MODE_MSIX: + if (adapter->flags & FLAG_HAS_MSIX) { ++#ifdef CONFIG_E1000E_SEPARATE_TX_HANDLER + numvecs = 3; /* RxQ0, TxQ0 and other */ ++#else ++ numvecs = 2; /* RxQ0/TxQ0 and other */ ++#endif + adapter->msix_entries = kcalloc(numvecs, + sizeof(struct msix_entry), + GFP_KERNEL); +@@ -1478,7 +1827,11 @@ + int err = 0, vector = 0; + + if (strlen(netdev->name) < (IFNAMSIZ - 5)) +- sprintf(adapter->rx_ring->name, "%s-rx0", netdev->name); ++#ifdef CONFIG_E1000E_SEPARATE_TX_HANDLER ++ sprintf(adapter->rx_ring->name, "%s-rx-0", netdev->name); ++#else ++ sprintf(adapter->rx_ring->name, "%s-Q0", netdev->name); ++#endif + else + memcpy(adapter->rx_ring->name, netdev->name, IFNAMSIZ); + err = request_irq(adapter->msix_entries[vector].vector, +@@ -1490,8 +1843,9 @@ + adapter->rx_ring->itr_val = adapter->itr; + vector++; + ++#ifdef CONFIG_E1000E_SEPARATE_TX_HANDLER + if (strlen(netdev->name) < (IFNAMSIZ - 5)) +- sprintf(adapter->tx_ring->name, "%s-tx0", netdev->name); ++ sprintf(adapter->tx_ring->name, "%s-tx-0", netdev->name); + else + memcpy(adapter->tx_ring->name, netdev->name, IFNAMSIZ); + err = request_irq(adapter->msix_entries[vector].vector, +@@ -1503,6 +1857,7 @@ + adapter->tx_ring->itr_val = adapter->itr; + vector++; + ++#endif /* CONFIG_E1000E_SEPARATE_TX_HANDLER */ + err = request_irq(adapter->msix_entries[vector].vector, + &e1000_msix_other, 0, netdev->name, netdev); + if (err) +@@ -1514,6 +1869,7 @@ + return err; + } + ++#endif /* CONFIG_E1000E_MSIX */ + /** + * e1000_request_irq - initialize interrupts + * +@@ -1523,8 +1879,12 @@ + static int e1000_request_irq(struct e1000_adapter *adapter) + { + struct net_device *netdev = adapter->netdev; +- int err; +- ++#ifndef CONFIG_E1000E_MSIX ++ int irq_flags = IRQF_SHARED; ++#endif ++ int err; ++ ++#ifdef CONFIG_E1000E_MSIX + if (adapter->msix_entries) { + err = e1000_request_msix(adapter); + if (!err) +@@ -1549,6 +1909,27 @@ + netdev->name, netdev); + if (err) + e_err("Unable to allocate interrupt, Error: %d\n", err); ++#else ++ if (!(adapter->flags & FLAG_MSI_TEST_FAILED)) { ++ err = pci_enable_msi(adapter->pdev); ++ if (!err) { ++ adapter->flags |= FLAG_MSI_ENABLED; ++ irq_flags = 0; ++ } ++ } ++ ++ err = request_irq(adapter->pdev->irq, ++ ((adapter->flags & FLAG_MSI_ENABLED) ? ++ &e1000_intr_msi : &e1000_intr), ++ irq_flags, netdev->name, netdev); ++ if (err) { ++ if (adapter->flags & FLAG_MSI_ENABLED) { ++ pci_disable_msi(adapter->pdev); ++ adapter->flags &= ~FLAG_MSI_ENABLED; ++ } ++ e_err("Unable to allocate interrupt, Error: %d\n", err); ++ } ++#endif /* CONFIG_E1000E_MSIX */ + + return err; + } +@@ -1557,21 +1938,31 @@ + { + struct net_device *netdev = adapter->netdev; + ++#ifdef CONFIG_E1000E_MSIX + if (adapter->msix_entries) { + int vector = 0; + + free_irq(adapter->msix_entries[vector].vector, netdev); + vector++; + ++#ifdef CONFIG_E1000E_SEPARATE_TX_HANDLER + free_irq(adapter->msix_entries[vector].vector, netdev); + vector++; + ++#endif + /* Other Causes interrupt vector */ + free_irq(adapter->msix_entries[vector].vector, netdev); + return; + } + ++#endif /* CONFIG_E1000E_MSIX */ + free_irq(adapter->pdev->irq, netdev); ++#ifndef CONFIG_E1000E_MSIX ++ if (adapter->flags & FLAG_MSI_ENABLED) { ++ pci_disable_msi(adapter->pdev); ++ adapter->flags &= ~FLAG_MSI_ENABLED; ++ } ++#endif + } + + /** +@@ -1582,8 +1973,10 @@ + struct e1000_hw *hw = &adapter->hw; + + ew32(IMC, ~0); ++#ifdef CONFIG_E1000E_MSIX + if (adapter->msix_entries) + ew32(EIAC_82574, 0); ++#endif /* CONFIG_E1000E_MSIX */ + e1e_flush(); + synchronize_irq(adapter->pdev->irq); + } +@@ -1595,12 +1988,16 @@ + { + struct e1000_hw *hw = &adapter->hw; + ++#ifdef CONFIG_E1000E_MSIX + if (adapter->msix_entries) { + ew32(EIAC_82574, adapter->eiac_mask & E1000_EIAC_MASK_82574); + ew32(IMS, adapter->eiac_mask | E1000_IMS_OTHER | E1000_IMS_LSC); + } else { + ew32(IMS, IMS_ENABLE_MASK); + } ++#else ++ ew32(IMS, IMS_ENABLE_MASK); ++#endif /* CONFIG_E1000E_MSIX */ + e1e_flush(); + } + +@@ -1698,7 +2095,6 @@ + + tx_ring->next_to_use = 0; + tx_ring->next_to_clean = 0; +- spin_lock_init(&adapter->tx_queue_lock); + + return 0; + err: +@@ -1757,7 +2153,7 @@ + } + err: + vfree(rx_ring->buffer_info); +- e_err("Unable to allocate memory for the transmit descriptor ring\n"); ++ e_err("Unable to allocate memory for the receive descriptor ring\n"); + return err; + } + +@@ -1959,11 +2355,15 @@ + min(adapter->itr + (new_itr >> 2), new_itr) : + new_itr; + adapter->itr = new_itr; ++#ifdef CONFIG_E1000E_MSIX + adapter->rx_ring->itr_val = new_itr; + if (adapter->msix_entries) + adapter->rx_ring->set_itr = 1; + else + ew32(ITR, 1000000000 / (new_itr * 256)); ++#else ++ ew32(ITR, 1000000000 / (new_itr * 256)); ++#endif + } + } + +@@ -1989,61 +2389,60 @@ + return -ENOMEM; + } + +-/** +- * e1000_clean - NAPI Rx polling callback ++#ifdef CONFIG_E1000E_NAPI ++/** ++ * e1000_poll - NAPI Rx polling callback + * @napi: struct associated with this polling callback + * @budget: amount of packets driver is allowed to process this poll + **/ +-static int e1000_clean(struct napi_struct *napi, int budget) +-{ +- struct e1000_adapter *adapter = container_of(napi, struct e1000_adapter, napi); +- struct e1000_hw *hw = &adapter->hw; +- struct net_device *poll_dev = adapter->netdev; +- int tx_cleaned = 0, work_done = 0; +- +- /* Must NOT use netdev_priv macro here. */ +- adapter = poll_dev->priv; +- +- if (adapter->msix_entries && +- !(adapter->rx_ring->ims_val & adapter->tx_ring->ims_val)) +- goto clean_rx; +- +- /* +- * e1000_clean is called per-cpu. This lock protects +- * tx_ring from being cleaned by multiple cpus +- * simultaneously. A failure obtaining the lock means +- * tx_ring is currently being cleaned anyway. +- */ +- if (spin_trylock(&adapter->tx_queue_lock)) { +- tx_cleaned = e1000_clean_tx_irq(adapter); +- spin_unlock(&adapter->tx_queue_lock); +- } +- +-clean_rx: ++static int e1000_poll(struct napi_struct *napi, int budget) ++{ ++ struct e1000_adapter *adapter = container_of(napi, struct e1000_adapter, ++ napi); ++ int tx_clean_complete = 1, work_done = 0; ++#ifdef CONFIG_E1000E_MSIX ++ struct e1000_hw *hw = &adapter->hw; ++ ++ if (!adapter->msix_entries || ++ (adapter->rx_ring->ims_val & adapter->tx_ring->ims_val)) ++#endif ++ tx_clean_complete = e1000_clean_tx_irq(adapter); ++ + adapter->clean_rx(adapter, &work_done, budget); + +- if (tx_cleaned) ++ if (!tx_clean_complete) + work_done = budget; + +- /* If budget not fully consumed, exit the polling mode */ ++#ifndef HAVE_NETDEV_NAPI_LIST ++ if (!netif_running(adapter->netdev)) ++ work_done = 0; ++ ++#endif ++ /* If Tx completed and all Rx work done, exit the polling mode */ + if (work_done < budget) { ++ napi_complete(napi); + if (adapter->itr_setting & 3) + e1000_set_itr(adapter); +- netif_rx_complete(poll_dev, napi); +- if (adapter->msix_entries) +- ew32(IMS, adapter->rx_ring->ims_val); +- else +- e1000_irq_enable(adapter); ++ if (!test_bit(__E1000_DOWN, &adapter->state)) { ++#ifdef CONFIG_E1000E_MSIX ++ if (adapter->msix_entries) ++ ew32(IMS, adapter->rx_ring->ims_val); ++ else ++#endif ++ e1000_irq_enable(adapter); ++ } + } + + return work_done; + } + ++#endif /* CONFIG_E1000E_NAPI */ + static void e1000_vlan_rx_add_vid(struct net_device *netdev, u16 vid) + { + struct e1000_adapter *adapter = netdev_priv(netdev); + struct e1000_hw *hw = &adapter->hw; + u32 vfta, index; ++ struct net_device *v_netdev; + + /* don't update vlan cookie if already programmed */ + if ((adapter->hw.mng_cookie.status & +@@ -2055,6 +2454,13 @@ + vfta = E1000_READ_REG_ARRAY(hw, E1000_VFTA, index); + vfta |= (1 << (vid & 0x1F)); + e1000e_write_vfta(hw, index, vfta); ++ /* ++ * Copy feature flags from netdev to the vlan netdev for this vid. ++ * This allows things like TSO to bubble down to our vlan device. ++ */ ++ v_netdev = vlan_group_get_device(adapter->vlgrp, vid); ++ v_netdev->features |= adapter->netdev->features; ++ vlan_group_set_device(adapter->vlgrp, vid, v_netdev); + } + + static void e1000_vlan_rx_kill_vid(struct net_device *netdev, u16 vid) +@@ -2214,13 +2620,13 @@ + /* Setup the HW Tx Head and Tail descriptor pointers */ + tdba = tx_ring->dma; + tdlen = tx_ring->count * sizeof(struct e1000_tx_desc); +- ew32(TDBAL, (tdba & DMA_32BIT_MASK)); +- ew32(TDBAH, (tdba >> 32)); +- ew32(TDLEN, tdlen); +- ew32(TDH, 0); +- ew32(TDT, 0); +- tx_ring->head = E1000_TDH; +- tx_ring->tail = E1000_TDT; ++ ew32(TDBAL(0), (tdba & DMA_32BIT_MASK)); ++ ew32(TDBAH(0), (tdba >> 32)); ++ ew32(TDLEN(0), tdlen); ++ ew32(TDH(0), 0); ++ ew32(TDT(0), 0); ++ tx_ring->head = E1000_TDH(0); ++ tx_ring->tail = E1000_TDT(0); + + /* Set the default values for the Tx Inter Packet Gap timer */ + tipg = DEFAULT_82543_TIPG_IPGT_COPPER; /* 8 */ +@@ -2312,10 +2718,9 @@ + else + rctl |= E1000_RCTL_LPE; + +- /* Some systems expect that the CRC is included in SMBUS traffic. The ++ /* Some systems expect that the CRC is included in SMBUS traffic. The + * hardware strips the CRC before sending to both SMBUS (BMC) and to +- * host memory when this is enabled +- */ ++ * host memory when this is enabled */ + if (adapter->flags2 & FLAG2_CRC_STRIPPING) + rctl |= E1000_RCTL_SECRC; + +@@ -2432,10 +2837,12 @@ + sizeof(union e1000_rx_desc_packet_split); + adapter->clean_rx = e1000_clean_rx_irq_ps; + adapter->alloc_rx_buf = e1000_alloc_rx_buffers_ps; ++#ifdef CONFIG_E1000E_NAPI + } else if (adapter->netdev->mtu > ETH_FRAME_LEN + ETH_FCS_LEN) { + rdlen = rx_ring->count * sizeof(struct e1000_rx_desc); + adapter->clean_rx = e1000_clean_jumbo_rx_irq; + adapter->alloc_rx_buf = e1000_alloc_jumbo_rx_buffers; ++#endif + } else { + rdlen = rx_ring->count * sizeof(struct e1000_rx_desc); + adapter->clean_rx = e1000_clean_rx_irq; +@@ -2459,9 +2866,11 @@ + ctrl_ext = er32(CTRL_EXT); + /* Reset delay timers after every interrupt */ + ctrl_ext |= E1000_CTRL_EXT_INT_TIMER_CLR; ++#ifdef CONFIG_E1000E_NAPI + /* Auto-Mask interrupts upon ICR access */ + ctrl_ext |= E1000_CTRL_EXT_IAME; + ew32(IAM, 0xffffffff); ++#endif + ew32(CTRL_EXT, ctrl_ext); + e1e_flush(); + +@@ -2470,13 +2879,13 @@ + * the Base and Length of the Rx Descriptor Ring + */ + rdba = rx_ring->dma; +- ew32(RDBAL, (rdba & DMA_32BIT_MASK)); +- ew32(RDBAH, (rdba >> 32)); +- ew32(RDLEN, rdlen); +- ew32(RDH, 0); +- ew32(RDT, 0); +- rx_ring->head = E1000_RDH; +- rx_ring->tail = E1000_RDT; ++ ew32(RDBAL(0), (rdba & DMA_32BIT_MASK)); ++ ew32(RDBAH(0), (rdba >> 32)); ++ ew32(RDLEN(0), rdlen); ++ ew32(RDH(0), 0); ++ ew32(RDT(0), 0); ++ rx_ring->head = E1000_RDH(0); ++ rx_ring->tail = E1000_RDT(0); + + /* Enable Receive Checksum Offload for TCP and UDP */ + rxcsum = er32(RXCSUM); +@@ -2638,18 +3047,8 @@ + **/ + void e1000e_power_up_phy(struct e1000_adapter *adapter) + { +- u16 mii_reg = 0; +- +- /* Just clear the power down bit to wake the phy back up */ +- if (adapter->hw.phy.media_type == e1000_media_type_copper) { +- /* +- * According to the manual, the phy will retain its +- * settings across a power-down/up cycle +- */ +- e1e_rphy(&adapter->hw, PHY_CONTROL, &mii_reg); +- mii_reg &= ~MII_CR_POWER_DOWN; +- e1e_wphy(&adapter->hw, PHY_CONTROL, mii_reg); +- } ++ if (adapter->hw.phy.ops.power_up) ++ adapter->hw.phy.ops.power_up(&adapter->hw); + + adapter->hw.mac.ops.setup_link(&adapter->hw); + } +@@ -2657,35 +3056,17 @@ + /** + * e1000_power_down_phy - Power down the PHY + * +- * Power down the PHY so no link is implied when interface is down +- * The PHY cannot be powered down is management or WoL is active ++ * Power down the PHY so no link is implied when interface is down. ++ * The PHY cannot be powered down if management or WoL is active. + */ + static void e1000_power_down_phy(struct e1000_adapter *adapter) + { +- struct e1000_hw *hw = &adapter->hw; +- u16 mii_reg; +- + /* WoL is enabled */ + if (adapter->wol) + return; + +- /* non-copper PHY? */ +- if (adapter->hw.phy.media_type != e1000_media_type_copper) +- return; +- +- /* reset is blocked because of a SoL/IDER session */ +- if (e1000e_check_mng_mode(hw) || e1000_check_reset_block(hw)) +- return; +- +- /* manageability (AMT) is enabled */ +- if (er32(MANC) & E1000_MANC_SMBUS_EN) +- return; +- +- /* power down the PHY */ +- e1e_rphy(hw, PHY_CONTROL, &mii_reg); +- mii_reg |= MII_CR_POWER_DOWN; +- e1e_wphy(hw, PHY_CONTROL, mii_reg); +- mdelay(1); ++ if (adapter->hw.phy.ops.power_down) ++ adapter->hw.phy.ops.power_down(&adapter->hw); + } + + /** +@@ -2785,7 +3166,7 @@ + else + fc->pause_time = E1000_FC_PAUSE_TIME; + fc->send_xon = 1; +- fc->type = fc->original_type; ++ fc->current_mode = fc->requested_mode; + + /* Allow time for pending master requests to run */ + mac->ops.reset_hw(hw); +@@ -2832,9 +3213,13 @@ + + clear_bit(__E1000_DOWN, &adapter->state); + ++#ifdef CONFIG_E1000E_NAPI + napi_enable(&adapter->napi); ++#endif ++#ifdef CONFIG_E1000E_MSIX + if (adapter->msix_entries) + e1000_configure_msix(adapter); ++#endif /* CONFIG_E1000E_MSIX */ + e1000_irq_enable(adapter); + + /* fire a link change interrupt to start the watchdog */ +@@ -2869,7 +3254,9 @@ + e1e_flush(); + msleep(10); + ++#ifdef CONFIG_E1000E_NAPI + napi_disable(&adapter->napi); ++#endif + e1000_irq_disable(adapter); + + del_timer_sync(&adapter->watchdog_timer); +@@ -2880,7 +3267,9 @@ + adapter->link_speed = 0; + adapter->link_duplex = 0; + ++#ifdef HAVE_PCI_ERS + if (!pci_channel_offline(adapter->pdev)) ++#endif + e1000e_reset(adapter); + e1000_clean_tx_ring(adapter); + e1000_clean_rx_ring(adapter); +@@ -2912,18 +3301,34 @@ + static int __devinit e1000_sw_init(struct e1000_adapter *adapter) + { + struct net_device *netdev = adapter->netdev; ++ s32 rc; + + adapter->rx_buffer_len = ETH_FRAME_LEN + VLAN_HLEN + ETH_FCS_LEN; + adapter->rx_ps_bsize0 = 128; + adapter->max_frame_size = netdev->mtu + ETH_HLEN + ETH_FCS_LEN; + adapter->min_frame_size = ETH_ZLEN + ETH_FCS_LEN; + ++ /* Set various function pointers */ ++ adapter->ei->init_ops(&adapter->hw); ++ ++ rc = adapter->hw.mac.ops.init_params(&adapter->hw); ++ if (rc) ++ return rc; ++ ++ rc = adapter->hw.nvm.ops.init_params(&adapter->hw); ++ if (rc) ++ return rc; ++ ++ rc = adapter->hw.phy.ops.init_params(&adapter->hw); ++ if (rc) ++ return rc; ++ ++#ifdef CONFIG_E1000E_MSIX + e1000e_set_interrupt_capability(adapter); + ++#endif /* CONFIG_E1000E_MSIX */ + if (e1000_alloc_queues(adapter)) + return -ENOMEM; +- +- spin_lock_init(&adapter->tx_queue_lock); + + /* Explicitly disable IRQ since the NIC can be in any state. */ + e1000_irq_disable(adapter); +@@ -2944,7 +3349,7 @@ + struct e1000_hw *hw = &adapter->hw; + u32 icr = er32(ICR); + +- e_dbg("%s: icr is %08X\n", netdev->name, icr); ++ e_dbg("icr is %08X\n", icr); + if (icr & E1000_ICR_RXSEQ) { + adapter->flags &= ~FLAG_MSI_TEST_FAILED; + wmb(); +@@ -2971,7 +3376,9 @@ + + /* free the real vector and request a test handler */ + e1000_free_irq(adapter); ++#ifdef CONFIG_E1000E_MSIX + e1000e_reset_interrupt_capability(adapter); ++#endif + + /* Assume that the test fails, if it succeeds then the test + * MSI irq handler will unset this flag */ +@@ -3002,7 +3409,9 @@ + rmb(); + + if (adapter->flags & FLAG_MSI_TEST_FAILED) { ++#ifdef CONFIG_E1000E_MSIX + adapter->int_mode = E1000E_INT_MODE_LEGACY; ++#endif + err = -EIO; + e_info("MSI interrupt test failed!\n"); + } +@@ -3014,9 +3423,13 @@ + goto msi_test_failed; + + /* okay so the test worked, restore settings */ +- e_dbg("%s: MSI interrupt test succeeded!\n", netdev->name); ++ e_dbg("MSI interrupt test succeeded!\n"); + msi_test_failed: ++#ifdef CONFIG_E1000E_MSIX + e1000e_set_interrupt_capability(adapter); ++#else ++ /* restore the original vector, even if it failed */ ++#endif + e1000_request_irq(adapter); + return err; + } +@@ -3126,7 +3539,11 @@ + * ignore e1000e MSI messages, which means we need to test our MSI + * interrupt now + */ ++#ifdef CONFIG_E1000E_MSIX + if (adapter->int_mode != E1000E_INT_MODE_LEGACY) { ++#else ++ { ++#endif + err = e1000_test_msi(adapter); + if (err) { + e_err("Interrupt allocation failed\n"); +@@ -3137,7 +3554,9 @@ + /* From here on the code is the same as e1000e_up() */ + clear_bit(__E1000_DOWN, &adapter->state); + ++#ifdef CONFIG_E1000E_NAPI + napi_enable(&adapter->napi); ++#endif + + e1000_irq_enable(adapter); + +@@ -3274,7 +3693,9 @@ + void e1000e_update_stats(struct e1000_adapter *adapter) + { + struct e1000_hw *hw = &adapter->hw; +- struct pci_dev *pdev = adapter->pdev; ++#ifdef HAVE_PCI_ERS ++ struct pci_dev *pdev = adapter->pdev; ++#endif + + /* + * Prevent stats update while adapter is being reset, or if the pci +@@ -3282,8 +3703,10 @@ + */ + if (adapter->link_speed == 0) + return; ++#ifdef HAVE_PCI_ERS + if (pci_channel_offline(pdev)) + return; ++#endif + + adapter->stats.crcerrs += er32(CRCERRS); + adapter->stats.gprc += er32(GPRC); +@@ -3321,7 +3744,7 @@ + + adapter->stats.algnerrc += er32(ALGNERRC); + adapter->stats.rxerrc += er32(RXERRC); +- if (hw->mac.type != e1000_82574) ++ if ((hw->mac.type != e1000_82574) && (hw->mac.type != e1000_82583)) + adapter->stats.tncrs += er32(TNCRS); + adapter->stats.cexterr += er32(CEXTERR); + adapter->stats.tsctc += er32(TSCTC); +@@ -3362,6 +3785,7 @@ + adapter->stats.mgpdc += er32(MGTPDC); + } + ++#ifdef SIOCGMIIPHY + /** + * e1000_phy_read_status - Update the PHY register status snapshot + * @adapter: board private structure +@@ -3403,12 +3827,16 @@ + } + } + ++#endif /* SIOCGMIIPHY */ + static void e1000_print_link_info(struct e1000_adapter *adapter) + { + struct e1000_hw *hw = &adapter->hw; + u32 ctrl = er32(CTRL); + +- e_info("Link is Up %d Mbps %s, Flow Control: %s\n", ++ /* Link status message must follow this format for user tools */ ++ printk(KERN_INFO "e1000e: %s NIC Link is Up %d Mbps %s, " ++ "Flow Control: %s\n", ++ adapter->netdev->name, + adapter->link_speed, + (adapter->link_duplex == FULL_DUPLEX) ? + "Full Duplex" : "Half Duplex", +@@ -3418,7 +3846,7 @@ + ((ctrl & E1000_CTRL_TFCE) ? "TX" : "None" ))); + } + +-static bool e1000_has_link(struct e1000_adapter *adapter) ++bool e1000_has_link(struct e1000_adapter *adapter) + { + struct e1000_hw *hw = &adapter->hw; + bool link_active = 0; +@@ -3493,6 +3921,7 @@ + struct e1000_adapter, watchdog_task); + struct net_device *netdev = adapter->netdev; + struct e1000_mac_info *mac = &adapter->hw.mac; ++ struct e1000_phy_info *phy = &adapter->hw.phy; + struct e1000_ring *tx_ring = adapter->tx_ring; + struct e1000_hw *hw = &adapter->hw; + u32 link, tctl; +@@ -3511,8 +3940,10 @@ + if (link) { + if (!netif_carrier_ok(netdev)) { + bool txb2b = 1; ++#ifdef SIOCGMIIPHY + /* update snapshot of PHY registers on LSC */ + e1000_phy_read_status(adapter); ++#endif + mac->ops.get_link_up_info(&adapter->hw, + &adapter->link_speed, + &adapter->link_duplex); +@@ -3569,6 +4000,7 @@ + ew32(TARC(0), tarc0); + } + ++#ifdef NETIF_F_TSO + /* + * disable TSO for pcie and 10/100 speeds, to avoid + * some hardware issues +@@ -3579,17 +4011,22 @@ + case SPEED_100: + e_info("10/100 speed: disabling TSO\n"); + netdev->features &= ~NETIF_F_TSO; ++#ifdef NETIF_F_TSO6 + netdev->features &= ~NETIF_F_TSO6; ++#endif + break; + case SPEED_1000: + netdev->features |= NETIF_F_TSO; ++#ifdef NETIF_F_TSO6 + netdev->features |= NETIF_F_TSO6; ++#endif + break; + default: + /* oops */ + break; + } + } ++#endif + + /* + * enable transmits in the hardware, need to do this +@@ -3599,6 +4036,13 @@ + tctl |= E1000_TCTL_EN; + ew32(TCTL, tctl); + ++ /* ++ * Perform any post-link-up configuration before ++ * reporting link up. ++ */ ++ if (phy->ops.cfg_on_link_up) ++ phy->ops.cfg_on_link_up(hw); ++ + netif_carrier_on(netdev); + netif_tx_wake_all_queues(netdev); + +@@ -3610,7 +4054,9 @@ + if (netif_carrier_ok(netdev)) { + adapter->link_speed = 0; + adapter->link_duplex = 0; +- e_info("Link is Down\n"); ++ /* Link status message must follow this format */ ++ printk(KERN_INFO "e1000e: %s NIC Link is Down\n", ++ adapter->netdev->name); + netif_carrier_off(netdev); + netif_tx_stop_all_queues(netdev); + if (!test_bit(__E1000_DOWN, &adapter->state)) +@@ -3653,10 +4099,14 @@ + } + + /* Cause software interrupt to ensure Rx ring is cleaned */ ++#ifdef CONFIG_E1000E_MSIX + if (adapter->msix_entries) + ew32(ICS, adapter->rx_ring->ims_val); + else + ew32(ICS, E1000_ICS_RXDMT0); ++#else ++ ew32(ICS, E1000_ICS_RXDMT0); ++#endif + + /* Force detection of hung controller every watchdog period */ + adapter->detect_tx_hung = 1; +@@ -3684,6 +4134,7 @@ + static int e1000_tso(struct e1000_adapter *adapter, + struct sk_buff *skb) + { ++#ifdef NETIF_F_TSO + struct e1000_ring *tx_ring = adapter->tx_ring; + struct e1000_context_desc *context_desc; + struct e1000_buffer *buffer_info; +@@ -3693,68 +4144,69 @@ + u8 ipcss, ipcso, tucss, tucso, hdr_len; + int err; + +- if (skb_is_gso(skb)) { +- if (skb_header_cloned(skb)) { +- err = pskb_expand_head(skb, 0, 0, GFP_ATOMIC); +- if (err) +- return err; +- } +- +- hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb); +- mss = skb_shinfo(skb)->gso_size; +- if (skb->protocol == htons(ETH_P_IP)) { +- struct iphdr *iph = ip_hdr(skb); +- iph->tot_len = 0; +- iph->check = 0; +- tcp_hdr(skb)->check = ~csum_tcpudp_magic(iph->saddr, +- iph->daddr, 0, +- IPPROTO_TCP, +- 0); +- cmd_length = E1000_TXD_CMD_IP; +- ipcse = skb_transport_offset(skb) - 1; +- } else if (skb_shinfo(skb)->gso_type == SKB_GSO_TCPV6) { +- ipv6_hdr(skb)->payload_len = 0; +- tcp_hdr(skb)->check = +- ~csum_ipv6_magic(&ipv6_hdr(skb)->saddr, +- &ipv6_hdr(skb)->daddr, +- 0, IPPROTO_TCP, 0); +- ipcse = 0; +- } +- ipcss = skb_network_offset(skb); +- ipcso = (void *)&(ip_hdr(skb)->check) - (void *)skb->data; +- tucss = skb_transport_offset(skb); +- tucso = (void *)&(tcp_hdr(skb)->check) - (void *)skb->data; +- tucse = 0; +- +- cmd_length |= (E1000_TXD_CMD_DEXT | E1000_TXD_CMD_TSE | +- E1000_TXD_CMD_TCP | (skb->len - (hdr_len))); +- +- i = tx_ring->next_to_use; +- context_desc = E1000_CONTEXT_DESC(*tx_ring, i); +- buffer_info = &tx_ring->buffer_info[i]; +- +- context_desc->lower_setup.ip_fields.ipcss = ipcss; +- context_desc->lower_setup.ip_fields.ipcso = ipcso; +- context_desc->lower_setup.ip_fields.ipcse = cpu_to_le16(ipcse); +- context_desc->upper_setup.tcp_fields.tucss = tucss; +- context_desc->upper_setup.tcp_fields.tucso = tucso; +- context_desc->upper_setup.tcp_fields.tucse = cpu_to_le16(tucse); +- context_desc->tcp_seg_setup.fields.mss = cpu_to_le16(mss); +- context_desc->tcp_seg_setup.fields.hdr_len = hdr_len; +- context_desc->cmd_and_length = cpu_to_le32(cmd_length); +- +- buffer_info->time_stamp = jiffies; +- buffer_info->next_to_watch = i; +- +- i++; +- if (i == tx_ring->count) +- i = 0; +- tx_ring->next_to_use = i; +- +- return 1; +- } +- +- return 0; ++ if (!skb_is_gso(skb)) ++ return 0; ++ ++ if (skb_header_cloned(skb)) { ++ err = pskb_expand_head(skb, 0, 0, GFP_ATOMIC); ++ if (err) ++ return err; ++ } ++ ++ hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb); ++ mss = skb_shinfo(skb)->gso_size; ++ if (skb->protocol == htons(ETH_P_IP)) { ++ struct iphdr *iph = ip_hdr(skb); ++ iph->tot_len = 0; ++ iph->check = 0; ++ tcp_hdr(skb)->check = ~csum_tcpudp_magic(iph->saddr, iph->daddr, ++ 0, IPPROTO_TCP, 0); ++ cmd_length = E1000_TXD_CMD_IP; ++ ipcse = skb_transport_offset(skb) - 1; ++#ifdef NETIF_F_TSO6 ++ } else if (skb_shinfo(skb)->gso_type == SKB_GSO_TCPV6) { ++ ipv6_hdr(skb)->payload_len = 0; ++ tcp_hdr(skb)->check = ~csum_ipv6_magic(&ipv6_hdr(skb)->saddr, ++ &ipv6_hdr(skb)->daddr, ++ 0, IPPROTO_TCP, 0); ++ ipcse = 0; ++#endif ++ } ++ ipcss = skb_network_offset(skb); ++ ipcso = (void *)&(ip_hdr(skb)->check) - (void *)skb->data; ++ tucss = skb_transport_offset(skb); ++ tucso = (void *)&(tcp_hdr(skb)->check) - (void *)skb->data; ++ tucse = 0; ++ ++ cmd_length |= (E1000_TXD_CMD_DEXT | E1000_TXD_CMD_TSE | ++ E1000_TXD_CMD_TCP | (skb->len - (hdr_len))); ++ ++ i = tx_ring->next_to_use; ++ context_desc = E1000_CONTEXT_DESC(*tx_ring, i); ++ buffer_info = &tx_ring->buffer_info[i]; ++ ++ context_desc->lower_setup.ip_fields.ipcss = ipcss; ++ context_desc->lower_setup.ip_fields.ipcso = ipcso; ++ context_desc->lower_setup.ip_fields.ipcse = cpu_to_le16(ipcse); ++ context_desc->upper_setup.tcp_fields.tucss = tucss; ++ context_desc->upper_setup.tcp_fields.tucso = tucso; ++ context_desc->upper_setup.tcp_fields.tucse = cpu_to_le16(tucse); ++ context_desc->tcp_seg_setup.fields.mss = cpu_to_le16(mss); ++ context_desc->tcp_seg_setup.fields.hdr_len = hdr_len; ++ context_desc->cmd_and_length = cpu_to_le32(cmd_length); ++ ++ buffer_info->time_stamp = jiffies; ++ buffer_info->next_to_watch = i; ++ ++ i++; ++ if (i == tx_ring->count) ++ i = 0; ++ tx_ring->next_to_use = i; ++ ++ return 1; ++#else ++ return 0; ++#endif + } + + static bool e1000_tx_csum(struct e1000_adapter *adapter, struct sk_buff *skb) +@@ -3764,34 +4216,50 @@ + struct e1000_buffer *buffer_info; + unsigned int i; + u8 css; +- +- if (skb->ip_summed == CHECKSUM_PARTIAL) { +- css = skb_transport_offset(skb); +- +- i = tx_ring->next_to_use; +- buffer_info = &tx_ring->buffer_info[i]; +- context_desc = E1000_CONTEXT_DESC(*tx_ring, i); +- +- context_desc->lower_setup.ip_config = 0; +- context_desc->upper_setup.tcp_fields.tucss = css; +- context_desc->upper_setup.tcp_fields.tucso = +- css + skb->csum_offset; +- context_desc->upper_setup.tcp_fields.tucse = 0; +- context_desc->tcp_seg_setup.data = 0; +- context_desc->cmd_and_length = cpu_to_le32(E1000_TXD_CMD_DEXT); +- +- buffer_info->time_stamp = jiffies; +- buffer_info->next_to_watch = i; +- +- i++; +- if (i == tx_ring->count) +- i = 0; +- tx_ring->next_to_use = i; +- +- return 1; +- } +- +- return 0; ++ u32 cmd_len = E1000_TXD_CMD_DEXT; ++ ++ if (skb->ip_summed != CHECKSUM_PARTIAL) ++ return 0; ++ ++ switch (skb->protocol) { ++ case __constant_htons(ETH_P_IP): ++ if (ip_hdr(skb)->protocol == IPPROTO_TCP) ++ cmd_len |= E1000_TXD_CMD_TCP; ++ break; ++ case __constant_htons(ETH_P_IPV6): ++ /* XXX not handling all IPV6 headers */ ++ if (ipv6_hdr(skb)->nexthdr == IPPROTO_TCP) ++ cmd_len |= E1000_TXD_CMD_TCP; ++ break; ++ default: ++ if (unlikely(net_ratelimit())) ++ e_warn("checksum_partial proto=%x!\n", skb->protocol); ++ break; ++ } ++ ++ css = skb_transport_offset(skb); ++ ++ i = tx_ring->next_to_use; ++ buffer_info = &tx_ring->buffer_info[i]; ++ context_desc = E1000_CONTEXT_DESC(*tx_ring, i); ++ ++ context_desc->lower_setup.ip_config = 0; ++ context_desc->upper_setup.tcp_fields.tucss = css; ++ context_desc->upper_setup.tcp_fields.tucso = ++ css + skb->csum_offset; ++ context_desc->upper_setup.tcp_fields.tucse = 0; ++ context_desc->tcp_seg_setup.data = 0; ++ context_desc->cmd_and_length = cpu_to_le32(cmd_len); ++ ++ buffer_info->time_stamp = jiffies; ++ buffer_info->next_to_watch = i; ++ ++ i++; ++ if (i == tx_ring->count) ++ i = 0; ++ tx_ring->next_to_use = i; ++ ++ return 1; + } + + #define E1000_MAX_PER_TXD 8192 +@@ -3813,11 +4281,6 @@ + while (len) { + buffer_info = &tx_ring->buffer_info[i]; + size = min(len, max_per_txd); +- +- /* Workaround for premature desc write-backs +- * in TSO mode. Append 4-byte sentinel desc */ +- if (mss && !nr_frags && size == len && size > 8) +- size -= 4; + + buffer_info->length = size; + /* set time_stamp *before* dma to help avoid a possible race */ +@@ -3852,10 +4315,6 @@ + while (len) { + buffer_info = &tx_ring->buffer_info[i]; + size = min(len, max_per_txd); +- /* Workaround for premature desc write-backs +- * in TSO mode. Append 4-byte sentinel desc */ +- if (mss && f == (nr_frags-1) && size == len && size > 8) +- size -= 4; + + buffer_info->length = size; + buffer_info->time_stamp = jiffies; +@@ -4041,9 +4500,8 @@ + unsigned int max_txd_pwr = E1000_MAX_TXD_PWR; + unsigned int tx_flags = 0; + unsigned int len = skb->len - skb->data_len; +- unsigned long irq_flags; + unsigned int nr_frags; +- unsigned int mss; ++ unsigned int mss = 0; + int count = 0; + int tso; + unsigned int f; +@@ -4058,6 +4516,7 @@ + return NETDEV_TX_OK; + } + ++#ifdef NETIF_F_TSO + mss = skb_shinfo(skb)->gso_size; + /* + * The controller does a simple calculation to +@@ -4099,6 +4558,10 @@ + if ((mss) || (skb->ip_summed == CHECKSUM_PARTIAL)) + count++; + count++; ++#else ++ if (skb->ip_summed == CHECKSUM_PARTIAL) ++ count++; ++#endif + + count += TXD_USE_COUNT(len, max_txd_pwr); + +@@ -4110,16 +4573,12 @@ + if (adapter->hw.mac.tx_pkt_filtering) + e1000_transfer_dhcp_info(adapter, skb); + +- if (!spin_trylock_irqsave(&adapter->tx_queue_lock, irq_flags)) +- /* Collision - tell upper layer to requeue */ +- return NETDEV_TX_LOCKED; + + /* + * need: count + 2 desc gap to keep tail from touching + * head, otherwise try next time + */ + if (e1000_maybe_stop_tx(netdev, count + 2)) { +- spin_unlock_irqrestore(&adapter->tx_queue_lock, irq_flags); + return NETDEV_TX_BUSY; + } + +@@ -4133,7 +4592,6 @@ + tso = e1000_tso(adapter, skb); + if (tso < 0) { + dev_kfree_skb_any(skb); +- spin_unlock_irqrestore(&adapter->tx_queue_lock, irq_flags); + return NETDEV_TX_OK; + } + +@@ -4154,7 +4612,6 @@ + if (count < 0) { + /* handle pci_map_single() error in e1000_tx_map */ + dev_kfree_skb_any(skb); +- spin_unlock_irqrestore(&adapter->tx_queue_lock, irq_flags); + return NETDEV_TX_OK; + } + +@@ -4165,7 +4622,6 @@ + /* Make sure there is space in the ring for the next send. */ + e1000_maybe_stop_tx(netdev, MAX_SKB_FRAGS + 2); + +- spin_unlock_irqrestore(&adapter->tx_queue_lock, irq_flags); + return NETDEV_TX_OK; + } + +@@ -4226,10 +4682,6 @@ + /* Jumbo frame size limits */ + if (max_frame > ETH_FRAME_LEN + ETH_FCS_LEN) { + if (!(adapter->flags & FLAG_HAS_JUMBO_FRAMES)) { +- e_err("Jumbo Frames not supported.\n"); +- return -EINVAL; +- } +- if (adapter->hw.phy.type == e1000_phy_ife) { + e_err("Jumbo Frames not supported.\n"); + return -EINVAL; + } +@@ -4265,8 +4717,17 @@ + adapter->rx_buffer_len = 1024; + else if (max_frame <= 2048) + adapter->rx_buffer_len = 2048; ++#ifdef CONFIG_E1000E_NAPI + else + adapter->rx_buffer_len = 4096; ++#else ++ else if (max_frame <= 4096) ++ adapter->rx_buffer_len = 4096; ++ else if (max_frame <= 8192) ++ adapter->rx_buffer_len = 8192; ++ else if (max_frame <= 16384) ++ adapter->rx_buffer_len = 16384; ++#endif + + /* adjust allocation if LPE protects us, and we aren't using SBP */ + if ((max_frame == ETH_FRAME_LEN + ETH_FCS_LEN) || +@@ -4352,6 +4813,10 @@ + case SIOCGMIIREG: + case SIOCSMIIREG: + return e1000_mii_ioctl(netdev, ifr, cmd); ++#ifdef ETHTOOL_OPS_COMPAT ++ case SIOCETHTOOL: ++ return ethtool_ioctl(ifr); ++#endif + default: + return -EOPNOTSUPP; + } +@@ -4373,7 +4838,9 @@ + e1000e_down(adapter); + e1000_free_irq(adapter); + } ++#ifdef CONFIG_E1000E_MSIX + e1000e_reset_interrupt_capability(adapter); ++#endif + + retval = pci_save_state(pdev); + if (retval) +@@ -4446,7 +4913,27 @@ + + pci_disable_device(pdev); + +- pci_set_power_state(pdev, pci_choose_state(pdev, state)); ++ /* ++ * The pci-e switch on some quad port adapters will report a ++ * correctable error when the MAC transitions from D0 to D3. To ++ * prevent this we need to mask off the correctable errors on the ++ * downstream port of the pci-e switch. ++ */ ++ if (adapter->flags & FLAG_IS_QUAD_PORT) { ++ struct pci_dev *us_dev = pdev->bus->self; ++ int pos = pci_find_capability(us_dev, PCI_CAP_ID_EXP); ++ u16 devctl; ++ ++ pci_read_config_word(us_dev, pos + PCI_EXP_DEVCTL, &devctl); ++ pci_write_config_word(us_dev, pos + PCI_EXP_DEVCTL, ++ (devctl & ~PCI_EXP_DEVCTL_CERE)); ++ ++ pci_set_power_state(pdev, pci_choose_state(pdev, state)); ++ ++ pci_write_config_word(us_dev, pos + PCI_EXP_DEVCTL, devctl); ++ } else { ++ pci_set_power_state(pdev, pci_choose_state(pdev, state)); ++ } + + return 0; + } +@@ -4495,12 +4982,22 @@ + return err; + } + ++ /* AER (Advanced Error Reporting) hooks */ ++ err = pci_enable_pcie_error_reporting(pdev); ++ if (err) { ++ dev_err(&pdev->dev, "pci_enable_pcie_error_reporting failed " ++ "0x%x\n", err); ++ /* non-fatal, continue */ ++ } ++ + pci_set_master(pdev); + + pci_enable_wake(pdev, PCI_D3hot, 0); + pci_enable_wake(pdev, PCI_D3cold, 0); + ++#ifdef CONFIG_E1000E_MSIX + e1000e_set_interrupt_capability(adapter); ++#endif + if (netif_running(netdev)) { + err = e1000_request_irq(adapter); + if (err) +@@ -4530,10 +5027,37 @@ + } + #endif + ++#ifndef USE_REBOOT_NOTIFIER + static void e1000_shutdown(struct pci_dev *pdev) + { + e1000_suspend(pdev, PMSG_SUSPEND); + } ++#else ++static struct pci_driver e1000_driver; ++static int e1000_notify_reboot(struct notifier_block *nb, unsigned long event, ++ void *ptr) ++{ ++ struct pci_dev *pdev = NULL; ++ ++ switch (event) { ++ case SYS_DOWN: ++ case SYS_HALT: ++ case SYS_POWER_OFF: ++ while ((pdev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, pdev))) { ++ if (pci_dev_driver(pdev) == &e1000_driver) ++ e1000_suspend(pdev, PMSG_SUSPEND); ++ } ++ break; ++ } ++ return NOTIFY_DONE; ++} ++ ++static struct notifier_block e1000_notifier_reboot = { ++ .notifier_call = e1000_notify_reboot, ++ .next = NULL, ++ .priority = 0 ++}; ++#endif + + #ifdef CONFIG_NET_POLL_CONTROLLER + /* +@@ -4548,10 +5072,15 @@ + disable_irq(adapter->pdev->irq); + e1000_intr(adapter->pdev->irq, netdev); + ++#ifndef CONFIG_E1000E_NAPI ++ adapter->clean_rx(adapter); ++ ++#endif + enable_irq(adapter->pdev->irq); + } + #endif + ++#ifdef HAVE_PCI_ERS + /** + * e1000_io_error_detected - called when PCI error is detected + * @pdev: Pointer to PCI device +@@ -4589,24 +5118,29 @@ + struct e1000_adapter *adapter = netdev_priv(netdev); + struct e1000_hw *hw = &adapter->hw; + int err; ++ pci_ers_result_t result; + + e1000e_disable_l1aspm(pdev); + err = pci_enable_device_mem(pdev); + if (err) { + dev_err(&pdev->dev, + "Cannot re-enable PCI device after reset.\n"); +- return PCI_ERS_RESULT_DISCONNECT; +- } +- pci_set_master(pdev); +- pci_restore_state(pdev); +- +- pci_enable_wake(pdev, PCI_D3hot, 0); +- pci_enable_wake(pdev, PCI_D3cold, 0); +- +- e1000e_reset(adapter); +- ew32(WUS, ~0); +- +- return PCI_ERS_RESULT_RECOVERED; ++ result = PCI_ERS_RESULT_DISCONNECT; ++ } else { ++ pci_set_master(pdev); ++ pci_restore_state(pdev); ++ ++ pci_enable_wake(pdev, PCI_D3hot, 0); ++ pci_enable_wake(pdev, PCI_D3cold, 0); ++ ++ e1000e_reset(adapter); ++ ew32(WUS, ~0); ++ result = PCI_ERS_RESULT_RECOVERED; ++ } ++ ++ pci_cleanup_aer_uncorrect_error_status(pdev); ++ ++ return result; + } + + /** +@@ -4643,6 +5177,7 @@ + e1000_get_hw_control(adapter); + + } ++#endif /* HAVE_PCI_ERS */ + + static void e1000_print_device_info(struct e1000_adapter *adapter) + { +@@ -4656,9 +5191,9 @@ + ((hw->bus.width == e1000_bus_width_pcie_x4) ? "Width x4" : + "Width x1"), + /* MAC address */ +- netdev->dev_addr[0], netdev->dev_addr[1], +- netdev->dev_addr[2], netdev->dev_addr[3], +- netdev->dev_addr[4], netdev->dev_addr[5]); ++ netdev->dev_addr[0], netdev->dev_addr[1], ++ netdev->dev_addr[2], netdev->dev_addr[3], ++ netdev->dev_addr[4], netdev->dev_addr[5]); + e_info("Intel(R) PRO/%s Network Connection\n", + (hw->phy.type == e1000_phy_ife) ? "10/100" : "1000"); + e1000e_read_pba_num(hw, &pba_num); +@@ -4671,27 +5206,67 @@ + struct e1000_hw *hw = &adapter->hw; + int ret_val; + u16 buf = 0; ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) ) ++ struct pci_dev *pdev = adapter->pdev; ++#endif + + if (hw->mac.type != e1000_82573) + return; + + ret_val = e1000_read_nvm(hw, NVM_INIT_CONTROL2_REG, 1, &buf); +- if (!(le16_to_cpu(buf) & (1 << 0))) { ++ if (!ret_val && (!(le16_to_cpu(buf) & (1 << 0)))) { + /* Deep Smart Power Down (DSPD) */ +- e_warn("Warning: detected DSPD enabled in EEPROM\n"); ++ dev_warn(&adapter->pdev->dev, ++ "Warning: detected DSPD enabled in EEPROM\n"); + } + + ret_val = e1000_read_nvm(hw, NVM_INIT_3GIO_3, 1, &buf); +- if (le16_to_cpu(buf) & (3 << 2)) { ++ if (!ret_val && (le16_to_cpu(buf) & (3 << 2))) { + /* ASPM enable */ +- e_warn("Warning: detected ASPM enabled in EEPROM\n"); +- } +-} +- ++ dev_warn(&adapter->pdev->dev, ++ "Warning: detected ASPM enabled in EEPROM\n"); ++ } ++} ++ ++s32 e1000_read_pcie_cap_reg(struct e1000_hw *hw, u32 reg, u16 *value) ++{ ++ u16 cap_offset; ++ ++ cap_offset = pci_find_capability(hw->adapter->pdev, PCI_CAP_ID_EXP); ++ if (!cap_offset) ++ return -E1000_ERR_CONFIG; ++ ++ pci_read_config_word(hw->adapter->pdev, cap_offset + reg, value); ++ ++ return E1000_SUCCESS; ++} ++ ++#ifdef HAVE_NET_DEVICE_OPS ++static const struct net_device_ops e1000e_netdev_ops = { ++ .ndo_open = e1000_open, ++ .ndo_stop = e1000_close, ++ .ndo_start_xmit = e1000_xmit_frame, ++ .ndo_get_stats = e1000_get_stats, ++ .ndo_set_multicast_list = e1000_set_multi, ++ .ndo_set_mac_address = e1000_set_mac, ++ .ndo_change_mtu = e1000_change_mtu, ++ .ndo_do_ioctl = e1000_ioctl, ++ .ndo_tx_timeout = e1000_tx_timeout, ++ .ndo_validate_addr = eth_validate_addr, ++ ++ .ndo_vlan_rx_register = e1000_vlan_rx_register, ++ .ndo_vlan_rx_add_vid = e1000_vlan_rx_add_vid, ++ .ndo_vlan_rx_kill_vid = e1000_vlan_rx_kill_vid, ++#ifdef CONFIG_NET_POLL_CONTROLLER ++ .ndo_poll_controller = e1000_netpoll, ++#endif ++}; ++ ++#endif /* HAVE_NET_DEVICE_OPS */ + /** + * e1000_probe - Device Initialization Routine + * @pdev: PCI device information struct +- * @ent: entry in e1000_pci_tbl ++ * @ent: entry in e1000e_pci_tbl + * + * Returns 0 on success, negative on failure + * +@@ -4706,9 +5281,6 @@ + struct e1000_adapter *adapter; + struct e1000_hw *hw; + const struct e1000_info *ei = e1000_info_tbl[ent->driver_data]; +- resource_size_t mmio_start, mmio_len; +- resource_size_t flash_start, flash_len; +- + static int cards_found; + int i, err, pci_using_dac; + u16 eeprom_data = 0; +@@ -4732,27 +5304,28 @@ + err = pci_set_consistent_dma_mask(pdev, + DMA_32BIT_MASK); + if (err) { +- dev_err(&pdev->dev, "No usable DMA " +- "configuration, aborting\n"); ++ printk(KERN_ERR "%s: No usable DMA " ++ "configuration, aborting\n", ++ pci_name(pdev)); + goto err_dma; + } + } + } + +- err = pci_request_selected_regions(pdev, ++ err = pci_request_selected_regions_exclusive(pdev, + pci_select_bars(pdev, IORESOURCE_MEM), + e1000e_driver_name); + if (err) + goto err_pci_reg; + + pci_set_master(pdev); +- pci_save_state(pdev); + + err = -ENOMEM; + netdev = alloc_etherdev(sizeof(struct e1000_adapter)); + if (!netdev) + goto err_alloc_etherdev; + ++ SET_MODULE_OWNER(netdev); + SET_NETDEV_DEV(netdev, &pdev->dev); + + pci_set_drvdata(pdev, netdev); +@@ -4768,24 +5341,45 @@ + adapter->hw.mac.type = ei->mac; + adapter->msg_enable = (1 << NETIF_MSG_DRV | NETIF_MSG_PROBE) - 1; + +- mmio_start = pci_resource_start(pdev, 0); +- mmio_len = pci_resource_len(pdev, 0); ++ /* PCI config space info */ ++ hw->device_id = pdev->device; ++#ifdef HAVE_PCI_ERS ++ err = pci_save_state(pdev); ++ if (err) ++ goto err_ioremap; ++#endif + + err = -EIO; +- adapter->hw.hw_addr = ioremap(mmio_start, mmio_len); ++ adapter->hw.hw_addr = pci_ioremap_bar(pdev, 0); + if (!adapter->hw.hw_addr) + goto err_ioremap; + + if ((adapter->flags & FLAG_HAS_FLASH) && + (pci_resource_flags(pdev, 1) & IORESOURCE_MEM)) { +- flash_start = pci_resource_start(pdev, 1); +- flash_len = pci_resource_len(pdev, 1); +- adapter->hw.flash_address = ioremap(flash_start, flash_len); ++ adapter->hw.flash_address = pci_ioremap_bar(pdev, 1); + if (!adapter->hw.flash_address) + goto err_flashmap; + } + ++ adapter->bd_number = cards_found++; ++ ++ e1000e_check_options(adapter); ++ ++ /* setup adapter struct */ ++ err = e1000_sw_init(adapter); ++ if (err) ++ goto err_sw_init; ++ ++ if (ei->get_variants) { ++ err = ei->get_variants(adapter); ++ if (err) ++ goto err_hw_init; ++ } ++ + /* construct the net_device struct */ ++#ifdef HAVE_NET_DEVICE_OPS ++ netdev->netdev_ops = &e1000e_netdev_ops; ++#else + netdev->open = &e1000_open; + netdev->stop = &e1000_close; + netdev->hard_start_xmit = &e1000_xmit_frame; +@@ -4794,43 +5388,20 @@ + netdev->set_mac_address = &e1000_set_mac; + netdev->change_mtu = &e1000_change_mtu; + netdev->do_ioctl = &e1000_ioctl; +- e1000e_set_ethtool_ops(netdev); + netdev->tx_timeout = &e1000_tx_timeout; +- netdev->watchdog_timeo = 5 * HZ; +- netif_napi_add(netdev, &adapter->napi, e1000_clean, 64); + netdev->vlan_rx_register = e1000_vlan_rx_register; + netdev->vlan_rx_add_vid = e1000_vlan_rx_add_vid; + netdev->vlan_rx_kill_vid = e1000_vlan_rx_kill_vid; + #ifdef CONFIG_NET_POLL_CONTROLLER + netdev->poll_controller = e1000_netpoll; + #endif ++#endif /* HAVE_NET_DEVICE_OPS */ ++ e1000e_set_ethtool_ops(netdev); ++ netdev->watchdog_timeo = 5 * HZ; ++#ifdef CONFIG_E1000E_NAPI ++ netif_napi_add(netdev, &adapter->napi, e1000_poll, 64); ++#endif + strncpy(netdev->name, pci_name(pdev), sizeof(netdev->name) - 1); +- +- netdev->mem_start = mmio_start; +- netdev->mem_end = mmio_start + mmio_len; +- +- adapter->bd_number = cards_found++; +- +- e1000e_check_options(adapter); +- +- /* setup adapter struct */ +- err = e1000_sw_init(adapter); +- if (err) +- goto err_sw_init; +- +- err = -EIO; +- +- memcpy(&hw->mac.ops, ei->mac_ops, sizeof(hw->mac.ops)); +- memcpy(&hw->nvm.ops, ei->nvm_ops, sizeof(hw->nvm.ops)); +- memcpy(&hw->phy.ops, ei->phy_ops, sizeof(hw->phy.ops)); +- +- err = ei->get_variants(adapter); +- if (err) +- goto err_hw_init; +- +- if ((adapter->flags & FLAG_IS_ICH) && +- (adapter->flags & FLAG_READ_ONLY_NVM)) +- e1000e_write_protect_nvm_ich8lan(&adapter->hw); + + hw->mac.ops.get_bus_info(&adapter->hw); + +@@ -4854,22 +5425,16 @@ + if (adapter->flags & FLAG_HAS_HW_VLAN_FILTER) + netdev->features |= NETIF_F_HW_VLAN_FILTER; + ++#ifdef NETIF_F_TSO + netdev->features |= NETIF_F_TSO; ++#ifdef NETIF_F_TSO6 + netdev->features |= NETIF_F_TSO6; +- +- netdev->vlan_features |= NETIF_F_TSO; +- netdev->vlan_features |= NETIF_F_TSO6; +- netdev->vlan_features |= NETIF_F_HW_CSUM; +- netdev->vlan_features |= NETIF_F_SG; ++#endif ++#endif + + if (pci_using_dac) + netdev->features |= NETIF_F_HIGHDMA; + +- /* +- * We should not be using LLTX anymore, but we are still Tx faster with +- * it. +- */ +- netdev->features |= NETIF_F_LLTX; + + if (e1000e_enable_mng_pass_thru(&adapter->hw)) + adapter->flags |= FLAG_MNG_PT_ENABLED; +@@ -4901,13 +5466,17 @@ + e_err("NVM Read Error while reading MAC address\n"); + + memcpy(netdev->dev_addr, adapter->hw.mac.addr, netdev->addr_len); ++#ifdef ETHTOOL_GPERMADDR + memcpy(netdev->perm_addr, adapter->hw.mac.addr, netdev->addr_len); + + if (!is_valid_ether_addr(netdev->perm_addr)) { ++#else ++ if (!is_valid_ether_addr(netdev->dev_addr)) { ++#endif + e_err("Invalid MAC Address: %02x:%02x:%02x:%02x:%02x:%02x\n", +- netdev->perm_addr[0], netdev->perm_addr[1], +- netdev->perm_addr[2], netdev->perm_addr[3], +- netdev->perm_addr[4], netdev->perm_addr[5]); ++ netdev->dev_addr[0], netdev->dev_addr[1], ++ netdev->dev_addr[2], netdev->dev_addr[3], ++ netdev->dev_addr[4], netdev->dev_addr[5]); + err = -EIO; + goto err_eeprom; + } +@@ -4928,8 +5497,8 @@ + /* Initialize link parameters. User can change them with ethtool */ + adapter->hw.mac.autoneg = 1; + adapter->fc_autoneg = 1; +- adapter->hw.fc.original_type = e1000_fc_default; +- adapter->hw.fc.type = e1000_fc_default; ++ adapter->hw.fc.requested_mode = e1000_fc_default; ++ adapter->hw.fc.current_mode = e1000_fc_default; + adapter->hw.phy.autoneg_advertised = 0x2f; + + /* ring size defaults */ +@@ -4947,11 +5516,11 @@ + } else if (adapter->flags & FLAG_APME_IN_CTRL3) { + if (adapter->flags & FLAG_APME_CHECK_PORT_B && + (adapter->hw.bus.func == 1)) +- e1000_read_nvm(&adapter->hw, +- NVM_INIT_CONTROL3_PORT_B, 1, &eeprom_data); ++ e1000_read_nvm(&adapter->hw, NVM_INIT_CONTROL3_PORT_B, ++ 1, &eeprom_data); + else +- e1000_read_nvm(&adapter->hw, +- NVM_INIT_CONTROL3_PORT_A, 1, &eeprom_data); ++ e1000_read_nvm(&adapter->hw, NVM_INIT_CONTROL3_PORT_A, ++ 1, &eeprom_data); + } + + /* fetch WoL from EEPROM */ +@@ -4969,6 +5538,9 @@ + /* initialize the wol settings based on the eeprom settings */ + adapter->wol = adapter->eeprom_wol; + device_set_wakeup_enable(&adapter->pdev->dev, adapter->wol); ++ ++ /* save off EEPROM version number */ ++ e1000_read_nvm(&adapter->hw, 5, 1, &adapter->eeprom_vers); + + /* reset the hardware with the new settings */ + e1000e_reset(adapter); +@@ -5001,10 +5573,12 @@ + if (!e1000_check_reset_block(&adapter->hw)) + e1000_phy_hw_reset(&adapter->hw); + err_hw_init: +- + kfree(adapter->tx_ring); + kfree(adapter->rx_ring); + err_sw_init: ++#ifdef CONFIG_E1000E_MSIX ++ e1000e_reset_interrupt_capability(adapter); ++#endif /* CONFIG_E1000E_MSIX */ + if (adapter->hw.flash_address) + iounmap(adapter->hw.flash_address); + err_flashmap: +@@ -5055,7 +5629,9 @@ + if (!e1000_check_reset_block(&adapter->hw)) + e1000_phy_hw_reset(&adapter->hw); + ++#ifdef CONFIG_E1000E_MSIX + e1000e_reset_interrupt_capability(adapter); ++#endif /* CONFIG_E1000E_MSIX */ + kfree(adapter->tx_ring); + kfree(adapter->rx_ring); + +@@ -5067,17 +5643,22 @@ + + free_netdev(netdev); + ++ /* AER disable */ ++ pci_disable_pcie_error_reporting(pdev); ++ + pci_disable_device(pdev); + } + ++#ifdef HAVE_PCI_ERS + /* PCI Error Recovery (ERS) */ + static struct pci_error_handlers e1000_err_handler = { + .error_detected = e1000_io_error_detected, + .slot_reset = e1000_io_slot_reset, + .resume = e1000_io_resume, + }; +- +-static struct pci_device_id e1000_pci_tbl[] = { ++#endif ++ ++static struct pci_device_id e1000e_pci_tbl[] = { + { PCI_VDEVICE(INTEL, E1000_DEV_ID_82571EB_COPPER), board_82571 }, + { PCI_VDEVICE(INTEL, E1000_DEV_ID_82571EB_FIBER), board_82571 }, + { PCI_VDEVICE(INTEL, E1000_DEV_ID_82571EB_QUAD_COPPER), board_82571 }, +@@ -5098,6 +5679,7 @@ + { PCI_VDEVICE(INTEL, E1000_DEV_ID_82573L), board_82573 }, + + { PCI_VDEVICE(INTEL, E1000_DEV_ID_82574L), board_82574 }, ++ { PCI_VDEVICE(INTEL, E1000_DEV_ID_82583V), board_82583 }, + + { PCI_VDEVICE(INTEL, E1000_DEV_ID_80003ES2LAN_COPPER_DPT), + board_80003es2lan }, +@@ -5135,12 +5717,12 @@ + + { } /* terminate list */ + }; +-MODULE_DEVICE_TABLE(pci, e1000_pci_tbl); ++MODULE_DEVICE_TABLE(pci, e1000e_pci_tbl); + + /* PCI Device API Driver */ + static struct pci_driver e1000_driver = { + .name = e1000e_driver_name, +- .id_table = e1000_pci_tbl, ++ .id_table = e1000e_pci_tbl, + .probe = e1000_probe, + .remove = __devexit_p(e1000_remove), + #ifdef CONFIG_PM +@@ -5148,8 +5730,12 @@ + .suspend = e1000_suspend, + .resume = e1000_resume, + #endif ++#ifndef USE_REBOOT_NOTIFIER + .shutdown = e1000_shutdown, ++#endif ++#ifdef HAVE_PCI_ERS + .err_handler = &e1000_err_handler ++#endif + }; + + /** +@@ -5163,11 +5749,15 @@ + int ret; + printk(KERN_INFO "%s: Intel(R) PRO/1000 Network Driver - %s\n", + e1000e_driver_name, e1000e_driver_version); +- printk(KERN_INFO "%s: Copyright (c) 1999-2008 Intel Corporation.\n", ++ printk(KERN_INFO "%s: Copyright(c) 1999 - 2009 Intel Corporation.\n", + e1000e_driver_name); + ret = pci_register_driver(&e1000_driver); + pm_qos_add_requirement(PM_QOS_CPU_DMA_LATENCY, e1000e_driver_name, + PM_QOS_DEFAULT_VALUE); ++#ifdef USE_REBOOT_NOTIFIER ++ if (ret >= 0) ++ register_reboot_notifier(&e1000_notifier_reboot); ++#endif + + return ret; + } +@@ -5181,6 +5771,9 @@ + **/ + static void __exit e1000_exit_module(void) + { ++#ifdef USE_REBOOT_NOTIFIER ++ unregister_reboot_notifier(&e1000_notifier_reboot); ++#endif + pci_unregister_driver(&e1000_driver); + pm_qos_remove_requirement(PM_QOS_CPU_DMA_LATENCY, e1000e_driver_name); + } +@@ -5192,4 +5785,4 @@ + MODULE_LICENSE("GPL"); + MODULE_VERSION(DRV_VERSION); + +-/* e1000_main.c */ ++/* netdev.c */ +diff -r bd70f2f305c6 drivers/net/e1000e/param.c +--- a/drivers/net/e1000e/param.c Mon Jun 15 11:43:16 2009 +0100 ++++ b/drivers/net/e1000e/param.c Mon Jun 15 11:45:35 2009 +0100 +@@ -1,7 +1,7 @@ + /******************************************************************************* + + Intel PRO/1000 Linux driver +- Copyright(c) 1999 - 2008 Intel Corporation. ++ Copyright(c) 1999 - 2009 Intel Corporation. + + This program is free software; you can redistribute it and/or modify it + under the terms and conditions of the GNU General Public License, +@@ -27,7 +27,6 @@ + *******************************************************************************/ + + #include +-#include + + #include "e1000.h" + +@@ -55,12 +54,29 @@ + */ + + #define E1000_PARAM_INIT { [0 ... E1000_MAX_NIC] = OPTION_UNSET } ++#ifndef module_param_array ++/* Module Parameters are always initialized to -1, so that the driver ++ * can tell the difference between no user specified value or the ++ * user asking for the default value. ++ * The true default values are loaded in when e1000e_check_options is called. ++ * ++ * This is a GCC extension to ANSI C. ++ * See the item "Labeled Elements in Initializers" in the section ++ * "Extensions to the C Language Family" of the GCC documentation. ++ */ ++#define E1000_PARAM(X, desc) \ ++ static const int __devinitdata X[E1000_MAX_NIC+1] = E1000_PARAM_INIT; \ ++ static unsigned int num_##X; \ ++ MODULE_PARM(X, "1-" __MODULE_STRING(E1000_MAX_NIC) "i"); \ ++ MODULE_PARM_DESC(X, desc); ++#else + #define E1000_PARAM(X, desc) \ + static int __devinitdata X[E1000_MAX_NIC+1] \ + = E1000_PARAM_INIT; \ + static unsigned int num_##X; \ + module_param_array_named(X, X, int, &num_##X, 0); \ + MODULE_PARM_DESC(X, desc); ++#endif + + + /* +@@ -114,6 +130,8 @@ + #define DEFAULT_ITR 3 + #define MAX_ITR 100000 + #define MIN_ITR 100 ++ ++#ifdef CONFIG_E1000E_MSIX + /* IntMode (Interrupt Mode) + * + * Valid Range: 0 - 2 +@@ -124,6 +142,7 @@ + #define MAX_INTMODE 2 + #define MIN_INTMODE 0 + ++#endif /* CONFIG_E1000E_MSIX */ + /* + * Enable Smart Power Down of the PHY + * +@@ -141,15 +160,6 @@ + * Default Value: 1 (enabled) + */ + E1000_PARAM(KumeranLockLoss, "Enable Kumeran lock loss workaround"); +- +-/* +- * Write Protect NVM +- * +- * Valid Range: 0, 1 +- * +- * Default Value: 1 (enabled) +- */ +-E1000_PARAM(WriteProtectNVM, "Write-protect NVM [WARNING: disabling this can lead to corrupted NVM]"); + + /* + * Enable CRC Stripping +@@ -380,6 +390,7 @@ + adapter->itr = 20000; + } + } ++#ifdef CONFIG_E1000E_MSIX + { /* Interrupt Mode */ + struct e1000_option opt = { + .type = range_option, +@@ -398,6 +409,7 @@ + adapter->int_mode = opt.def; + } + } ++#endif /* CONFIG_E1000E_MSIX */ + { /* Smart Power Down */ + const struct e1000_option opt = { + .type = enable_option, +@@ -418,15 +430,17 @@ + const struct e1000_option opt = { + .type = enable_option, + .name = "CRC Stripping", +- .err = "defaulting to enabled", ++ .err = "defaulting to Enabled", + .def = OPTION_ENABLED + }; +- ++ + if (num_CrcStripping > bd) { + unsigned int crc_stripping = CrcStripping[bd]; + e1000_validate_option(&crc_stripping, &opt, adapter); + if (crc_stripping == OPTION_ENABLED) + adapter->flags2 |= FLAG2_CRC_STRIPPING; ++ } else { ++ adapter->flags2 |= FLAG2_CRC_STRIPPING; + } + } + { /* Kumeran Lock Loss Workaround */ +@@ -449,25 +463,4 @@ + opt.def); + } + } +- { /* Write-protect NVM */ +- const struct e1000_option opt = { +- .type = enable_option, +- .name = "Write-protect NVM", +- .err = "defaulting to Enabled", +- .def = OPTION_ENABLED +- }; +- +- if (adapter->flags & FLAG_IS_ICH) { +- if (num_WriteProtectNVM > bd) { +- unsigned int write_protect_nvm = WriteProtectNVM[bd]; +- e1000_validate_option(&write_protect_nvm, &opt, +- adapter); +- if (write_protect_nvm) +- adapter->flags |= FLAG_READ_ONLY_NVM; +- } else { +- if (opt.def) +- adapter->flags |= FLAG_READ_ONLY_NVM; +- } +- } +- } + } +diff -r bd70f2f305c6 drivers/net/e1000e/phy.c +--- a/drivers/net/e1000e/phy.c Mon Jun 15 11:43:16 2009 +0100 ++++ b/drivers/net/e1000e/phy.c Mon Jun 15 11:45:35 2009 +0100 +@@ -1886,11 +1886,282 @@ + case BME1000_E_PHY_ID_R2: + phy_type = e1000_phy_bm; + break; ++ case BME1000_E_PHY_ID: ++ case BME1000_E_PHY_ID_R2: ++ phy_type = e1000_phy_bm; ++ break; + default: + phy_type = e1000_phy_unknown; + break; + } + return phy_type; ++} ++ ++/** ++ * e1000e_determine_phy_address - Determines PHY address. ++ * @hw: pointer to the HW structure ++ * ++ * This uses a trial and error method to loop through possible PHY ++ * addresses. It tests each by reading the PHY ID registers and ++ * checking for a match. ++ **/ ++s32 e1000e_determine_phy_address(struct e1000_hw *hw) ++{ ++ s32 ret_val = -E1000_ERR_PHY_TYPE; ++ u32 phy_addr= 0; ++ u32 i = 0; ++ enum e1000_phy_type phy_type = e1000_phy_unknown; ++ ++ do { ++ for (phy_addr = 0; phy_addr < 4; phy_addr++) { ++ hw->phy.addr = phy_addr; ++ e1000e_get_phy_id(hw); ++ phy_type = e1000e_get_phy_type_from_id(hw->phy.id); ++ ++ /* ++ * If phy_type is valid, break - we found our ++ * PHY address ++ */ ++ if (phy_type != e1000_phy_unknown) { ++ ret_val = 0; ++ break; ++ } ++ } ++ i++; ++ } while ((ret_val != 0) && (i < 100)); ++ ++ return ret_val; ++} ++ ++/** ++ * e1000_get_phy_addr_for_bm_page - Retrieve PHY page address ++ * @page: page to access ++ * ++ * Returns the phy address for the page requested. ++ **/ ++static u32 e1000_get_phy_addr_for_bm_page(u32 page, u32 reg) ++{ ++ u32 phy_addr = 2; ++ ++ if ((page >= 768) || (page == 0 && reg == 25) || (reg == 31)) ++ phy_addr = 1; ++ ++ return phy_addr; ++} ++ ++/** ++ * e1000e_write_phy_reg_bm - Write BM PHY register ++ * @hw: pointer to the HW structure ++ * @offset: register offset to write to ++ * @data: data to write at register offset ++ * ++ * Acquires semaphore, if necessary, then writes the data to PHY register ++ * at the offset. Release any acquired semaphores before exiting. ++ **/ ++s32 e1000e_write_phy_reg_bm(struct e1000_hw *hw, u32 offset, u16 data) ++{ ++ s32 ret_val; ++ u32 page_select = 0; ++ u32 page = offset >> IGP_PAGE_SHIFT; ++ u32 page_shift = 0; ++ ++ /* Page 800 works differently than the rest so it has its own func */ ++ if (page == BM_WUC_PAGE) { ++ ret_val = e1000_access_phy_wakeup_reg_bm(hw, offset, &data, ++ FALSE); ++ goto out; ++ } ++ ++ ret_val = hw->phy.ops.acquire_phy(hw); ++ if (ret_val) ++ goto out; ++ ++ hw->phy.addr = e1000_get_phy_addr_for_bm_page(page, offset); ++ ++ if (offset > MAX_PHY_MULTI_PAGE_REG) { ++ /* ++ * Page select is register 31 for phy address 1 and 22 for ++ * phy address 2 and 3. Page select is shifted only for ++ * phy address 1. ++ */ ++ if (hw->phy.addr == 1) { ++ page_shift = IGP_PAGE_SHIFT; ++ page_select = IGP01E1000_PHY_PAGE_SELECT; ++ } else { ++ page_shift = 0; ++ page_select = BM_PHY_PAGE_SELECT; ++ } ++ ++ /* Page is shifted left, PHY expects (page x 32) */ ++ ret_val = e1000e_write_phy_reg_mdic(hw, page_select, ++ (page << page_shift)); ++ if (ret_val) { ++ hw->phy.ops.release_phy(hw); ++ goto out; ++ } ++ } ++ ++ ret_val = e1000e_write_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset, ++ data); ++ ++ hw->phy.ops.release_phy(hw); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000e_read_phy_reg_bm - Read BM PHY register ++ * @hw: pointer to the HW structure ++ * @offset: register offset to be read ++ * @data: pointer to the read data ++ * ++ * Acquires semaphore, if necessary, then reads the PHY register at offset ++ * and storing the retrieved information in data. Release any acquired ++ * semaphores before exiting. ++ **/ ++s32 e1000e_read_phy_reg_bm(struct e1000_hw *hw, u32 offset, u16 *data) ++{ ++ s32 ret_val; ++ u32 page_select = 0; ++ u32 page = offset >> IGP_PAGE_SHIFT; ++ u32 page_shift = 0; ++ ++ /* Page 800 works differently than the rest so it has its own func */ ++ if (page == BM_WUC_PAGE) { ++ ret_val = e1000_access_phy_wakeup_reg_bm(hw, offset, data, ++ TRUE); ++ goto out; ++ } ++ ++ ret_val = hw->phy.ops.acquire_phy(hw); ++ if (ret_val) ++ goto out; ++ ++ hw->phy.addr = e1000_get_phy_addr_for_bm_page(page, offset); ++ ++ if (offset > MAX_PHY_MULTI_PAGE_REG) { ++ /* ++ * Page select is register 31 for phy address 1 and 22 for ++ * phy address 2 and 3. Page select is shifted only for ++ * phy address 1. ++ */ ++ if (hw->phy.addr == 1) { ++ page_shift = IGP_PAGE_SHIFT; ++ page_select = IGP01E1000_PHY_PAGE_SELECT; ++ } else { ++ page_shift = 0; ++ page_select = BM_PHY_PAGE_SELECT; ++ } ++ ++ /* Page is shifted left, PHY expects (page x 32) */ ++ ret_val = e1000e_write_phy_reg_mdic(hw, page_select, ++ (page << page_shift)); ++ if (ret_val) { ++ hw->phy.ops.release_phy(hw); ++ goto out; ++ } ++ } ++ ++ ret_val = e1000e_read_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset, ++ data); ++ hw->phy.ops.release_phy(hw); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_access_phy_wakeup_reg_bm - Read BM PHY wakeup register ++ * @hw: pointer to the HW structure ++ * @offset: register offset to be read or written ++ * @data: pointer to the data to read or write ++ * @read: determines if operation is read or write ++ * ++ * Acquires semaphore, if necessary, then reads the PHY register at offset ++ * and storing the retrieved information in data. Release any acquired ++ * semaphores before exiting. Note that procedure to read the wakeup ++ * registers are different. It works as such: ++ * 1) Set page 769, register 17, bit 2 = 1 ++ * 2) Set page to 800 for host (801 if we were manageability) ++ * 3) Write the address using the address opcode (0x11) ++ * 4) Read or write the data using the data opcode (0x12) ++ * 5) Restore 769_17.2 to its original value ++ **/ ++static s32 e1000_access_phy_wakeup_reg_bm(struct e1000_hw *hw, u32 offset, ++ u16 *data, bool read) ++{ ++ s32 ret_val; ++ u16 reg = ((u16)offset) & PHY_REG_MASK; ++ u16 phy_reg = 0; ++ u8 phy_acquired = 1; ++ ++ ++ ret_val = hw->phy.ops.acquire_phy(hw); ++ if (ret_val) { ++ phy_acquired = 0; ++ goto out; ++ } ++ ++ /* All operations in this function are phy address 1 */ ++ hw->phy.addr = 1; ++ ++ /* Set page 769 */ ++ e1000e_write_phy_reg_mdic(hw, IGP01E1000_PHY_PAGE_SELECT, ++ (BM_WUC_ENABLE_PAGE << IGP_PAGE_SHIFT)); ++ ++ ret_val = e1000e_read_phy_reg_mdic(hw, BM_WUC_ENABLE_REG, &phy_reg); ++ if (ret_val) ++ goto out; ++ ++ /* First clear bit 4 to avoid a power state change */ ++ phy_reg &= ~(BM_WUC_HOST_WU_BIT); ++ ret_val = e1000e_write_phy_reg_mdic(hw, BM_WUC_ENABLE_REG, phy_reg); ++ if (ret_val) ++ goto out; ++ ++ /* Write bit 2 = 1, and clear bit 4 to 769_17 */ ++ ret_val = e1000e_write_phy_reg_mdic(hw, BM_WUC_ENABLE_REG, ++ phy_reg | BM_WUC_ENABLE_BIT); ++ if (ret_val) ++ goto out; ++ ++ /* Select page 800 */ ++ ret_val = e1000e_write_phy_reg_mdic(hw, IGP01E1000_PHY_PAGE_SELECT, ++ (BM_WUC_PAGE << IGP_PAGE_SHIFT)); ++ ++ /* Write the page 800 offset value using opcode 0x11 */ ++ ret_val = e1000e_write_phy_reg_mdic(hw, BM_WUC_ADDRESS_OPCODE, reg); ++ if (ret_val) ++ goto out; ++ ++ if (read) { ++ /* Read the page 800 value using opcode 0x12 */ ++ ret_val = e1000e_read_phy_reg_mdic(hw, BM_WUC_DATA_OPCODE, ++ data); ++ } else { ++ /* Read the page 800 value using opcode 0x12 */ ++ ret_val = e1000e_write_phy_reg_mdic(hw, BM_WUC_DATA_OPCODE, ++ *data); ++ } ++ ++ if (ret_val) ++ goto out; ++ ++ /* ++ * Restore 769_17.2 to its original value ++ * Set page 769 ++ */ ++ e1000e_write_phy_reg_mdic(hw, IGP01E1000_PHY_PAGE_SELECT, ++ (BM_WUC_ENABLE_PAGE << IGP_PAGE_SHIFT)); ++ ++ /* Clear 769_17.2 */ ++ ret_val = e1000e_write_phy_reg_mdic(hw, BM_WUC_ENABLE_REG, phy_reg); ++ ++out: ++ if (phy_acquired == 1) ++ hw->phy.ops.release_phy(hw); ++ return ret_val; + } + + /** diff --git a/master/enable-xen-save-restore.patch b/master/enable-xen-save-restore.patch new file mode 100644 index 0000000..a93e4b9 --- /dev/null +++ b/master/enable-xen-save-restore.patch @@ -0,0 +1,12 @@ +diff -r 74dbbc4b4b42 drivers/xen/Kconfig +--- a/drivers/xen/Kconfig Mon Jul 06 16:18:17 2009 +0100 ++++ b/drivers/xen/Kconfig Tue Jul 07 11:09:14 2009 +0100 +@@ -332,3 +332,8 @@ + If security is not a concern then you may increase performance by + saying N. + If in doubt, say yes. ++ ++config XEN_SAVE_RESTORE ++ bool ++ depends on XEN && PM ++ default y diff --git a/master/export-pci_walk_bus.patch b/master/export-pci_walk_bus.patch new file mode 100644 index 0000000..8a2f0dc --- /dev/null +++ b/master/export-pci_walk_bus.patch @@ -0,0 +1,8 @@ +diff -r ed462d2f1119 drivers/pci/bus.c +--- a/drivers/pci/bus.c Mon Jul 13 11:14:33 2009 +0100 ++++ b/drivers/pci/bus.c Mon Jul 13 11:24:06 2009 +0100 +@@ -239,3 +239,4 @@ + EXPORT_SYMBOL_GPL(pci_bus_add_device); + EXPORT_SYMBOL(pci_bus_add_devices); + EXPORT_SYMBOL(pci_enable_bridges); ++EXPORT_SYMBOL_GPL(pci_walk_bus); diff --git a/master/feature-gso-tcpv4-prefix b/master/feature-gso-tcpv4-prefix new file mode 100644 index 0000000..17d717d --- /dev/null +++ b/master/feature-gso-tcpv4-prefix @@ -0,0 +1,171 @@ +* * * + +diff -r 2e19d0030606 drivers/xen/netback/common.h +--- a/drivers/xen/netback/common.h Thu May 21 14:08:40 2009 +0100 ++++ b/drivers/xen/netback/common.h Tue Jun 02 17:41:29 2009 +0100 +@@ -82,7 +82,8 @@ + + /* Internal feature information. */ + u8 can_queue:1; /* can queue packets for receiver? */ +- u8 copying_receiver:1; /* copy packets to receiver? */ ++ u8 gso_prefix:1; /* use a prefix segment for GSO information */ ++ u8 copying_receiver:1; /* copy packets to receiver? */ + unsigned copying_rx_offset; + + /* Allow netif_be_start_xmit() to peek ahead in the rx request +diff -r 2e19d0030606 drivers/xen/netback/netback.c +--- a/drivers/xen/netback/netback.c Thu May 21 14:08:40 2009 +0100 ++++ b/drivers/xen/netback/netback.c Tue Jun 02 17:41:29 2009 +0100 +@@ -328,8 +328,12 @@ + + BUG_ON(skb->dev != dev); + ++ /* Drop the packet if the netif is not up or there is no carrier. */ ++ if (unlikely(!netif_schedulable(netif))) ++ goto drop; ++ + /* Drop the packet if the target domain has no receive buffers. */ +- if (unlikely(!netif_schedulable(netif) || netbk_queue_full(netif))) ++ if (unlikely(netbk_queue_full(netif))) + goto drop; + + /* +@@ -455,6 +459,7 @@ + /* Overflowed this request, go to the next one */ + req = RING_GET_REQUEST(&netif->rx, netif->rx.req_cons++); + meta = npo->meta + npo->meta_prod++; ++ meta->gso_size = 0; + meta->copy = 1; + meta->size = 0; + meta->id = req->id; +@@ -528,18 +533,31 @@ + int nr_frags = skb_shinfo(skb)->nr_frags; + int i; + int extra; ++ netif_rx_request_t *req; + struct netbk_rx_meta *head_meta, *meta; + int old_meta_prod; + + old_meta_prod = npo->meta_prod; + +- if (netif->copying_receiver) { +- netif_rx_request_t *req; +- ++ /* Set up a GSO prefix descriptor, if necessary */ ++ if (skb_shinfo(skb)->gso_size && netif->gso_prefix) { + req = RING_GET_REQUEST(&netif->rx, netif->rx.req_cons++); + meta = npo->meta + npo->meta_prod++; ++ meta->gso_size = skb_shinfo(skb)->gso_size; ++ meta->size = 0; ++ meta->id = req->id; ++ } ++ ++ if (netif->copying_receiver) { ++ req = RING_GET_REQUEST(&netif->rx, netif->rx.req_cons++); ++ meta = npo->meta + npo->meta_prod++; ++ ++ if (!netif->gso_prefix) ++ meta->gso_size = skb_shinfo(skb)->gso_size; ++ else ++ meta->gso_size = 0; ++ + meta->copy = 1; +- meta->gso_size = skb_shinfo(skb)->gso_size; + meta->size = 0; + meta->id = req->id; + npo->copy_off = netif->copying_rx_offset; +@@ -549,10 +567,12 @@ + npo, virt_to_page(skb->data), + skb_headlen(skb), + offset_in_page(skb->data)); +- if (skb_shinfo(skb)->gso_size) { +- /* Leave a gap for the GSO descriptor. */ ++ ++ if (skb_shinfo(skb)->gso_size && !netif->gso_prefix) { ++ /* Leave a gap for the GSO extra descriptor. */ + netif->rx.req_cons++; + } ++ + for (i = 0; i < nr_frags; i++) { + netbk_gop_frag_copy(netif, npo, + skb_shinfo(skb)->frags[i].page, +@@ -797,6 +817,20 @@ + sco = (struct skb_cb_overlay *)skb->cb; + + netif = netdev_priv(skb->dev); ++ ++ if (meta[npo.meta_cons].gso_size && netif->gso_prefix) { ++ resp = RING_GET_RESPONSE(&netif->rx, netif->rx.rsp_prod_pvt++); ++ ++ resp->flags = NETRXF_gso_prefix | NETRXF_more_data; ++ ++ resp->offset = meta[npo.meta_cons].gso_size; ++ resp->id = meta[npo.meta_cons].id; ++ resp->status = sco->meta_slots_used; ++ ++ npo.meta_cons++; ++ sco->meta_slots_used--; ++ } ++ + /* We can't rely on skb_release_data to release the + pages used by fragments for us, since it tries to + touch the pages in the fraglist. If we're in +@@ -823,21 +857,23 @@ + flags = 0; + else + flags = NETRXF_more_data; ++ + if (skb->ip_summed == CHECKSUM_PARTIAL) /* local packet? */ + flags |= NETRXF_csum_blank | NETRXF_data_validated; + else if (skb->proto_data_valid) /* remote but checksummed? */ + flags |= NETRXF_data_validated; + + if (meta[npo.meta_cons].copy) +- offset = 0; ++ offset = netif->copying_rx_offset; + else + offset = offset_in_page(skb->data); ++ + resp = make_rx_response(netif, meta[npo.meta_cons].id, + status, offset, + meta[npo.meta_cons].size, + flags); + +- if (meta[npo.meta_cons].gso_size) { ++ if (meta[npo.meta_cons].gso_size && !netif->gso_prefix) { + struct netif_extra_info *gso = + (struct netif_extra_info *) + RING_GET_RESPONSE(&netif->rx, +diff -r 2e19d0030606 drivers/xen/netback/xenbus.c +--- a/drivers/xen/netback/xenbus.c Thu May 21 14:08:40 2009 +0100 ++++ b/drivers/xen/netback/xenbus.c Tue Jun 02 17:41:29 2009 +0100 +@@ -559,6 +559,15 @@ + be->netif->dev->features |= NETIF_F_TSO; + } + ++ if (xenbus_scanf(XBT_NIL, dev->otherend, "feature-gso-tcpv4-prefix", "%d", ++ &val) < 0) ++ val = 0; ++ if (val) { ++ be->netif->features |= NETIF_F_TSO; ++ be->netif->dev->features |= NETIF_F_TSO; ++ be->netif->gso_prefix = 1; ++ } ++ + unregister_csum_offload_watch(be); + err = register_csum_offload_watch(be); + if (err) +diff -r 2e19d0030606 include/xen/interface/io/netif.h +--- a/include/xen/interface/io/netif.h Thu May 21 14:08:40 2009 +0100 ++++ b/include/xen/interface/io/netif.h Tue Jun 02 17:41:30 2009 +0100 +@@ -171,6 +171,10 @@ + #define _NETRXF_extra_info (3) + #define NETRXF_extra_info (1U<<_NETRXF_extra_info) + ++/* GSO Prefix descriptor. */ ++#define _NETRXF_gso_prefix (4) ++#define NETRXF_gso_prefix (1U<<_NETRXF_gso_prefix) ++ + struct netif_rx_response { + uint16_t id; + uint16_t offset; /* Offset in page of start of received packet */ diff --git a/master/forward-port-drivers-xen-blktap.patch b/master/forward-port-drivers-xen-blktap.patch new file mode 100644 index 0000000..5ea562b --- /dev/null +++ b/master/forward-port-drivers-xen-blktap.patch @@ -0,0 +1,171 @@ +* * * + +diff -r 54c0f88e6400 drivers/xen/blktap/blktap.c +--- a/drivers/xen/blktap/blktap.c Wed Jun 17 15:06:42 2009 +0100 ++++ b/drivers/xen/blktap/blktap.c Wed Jun 17 15:09:31 2009 +0100 +@@ -40,6 +40,7 @@ + + #include + #include ++#include + #include + #include + #include "common.h" +@@ -53,6 +54,7 @@ + #include + #include + #include ++#include + #include + + #define MAX_TAP_DEV 256 /*the maximum number of tapdisk ring devices */ +@@ -110,6 +112,7 @@ + unsigned long mode; /*current switching mode */ + int minor; /*Minor number for tapdisk device */ + pid_t pid; /*tapdisk process id */ ++ struct pid_namespace *pid_ns; /*... and its corresponding namespace */ + enum { RUNNING, CLEANSHUTDOWN } status; /*Detect a clean userspace + shutdown */ + unsigned long *idx_map; /*Record the user ring id to kern +@@ -294,16 +297,14 @@ + * BLKTAP VM OPS + */ + +-static struct page *blktap_nopage(struct vm_area_struct *vma, +- unsigned long address, +- int *type) ++static int blktap_fault(struct vm_area_struct *vma, struct vm_fault *vmf) + { + /* + * if the page has not been mapped in by the driver then return +- * NOPAGE_SIGBUS to the domain. ++ * VM_FAULT_SIGBUS to the domain. + */ + +- return NOPAGE_SIGBUS; ++ return VM_FAULT_SIGBUS; + } + + static pte_t blktap_clear_pte(struct vm_area_struct *vma, +@@ -389,7 +390,7 @@ + } + + struct vm_operations_struct blktap_vm_ops = { +- nopage: blktap_nopage, ++ fault: blktap_fault, + zap_pte: blktap_clear_pte, + }; + +@@ -482,9 +483,8 @@ + tapfds[minor] = info; + + if ((class = get_xen_class()) != NULL) +- class_device_create(class, NULL, +- MKDEV(blktap_major, minor), NULL, +- "blktap%d", minor); ++ device_create(class, NULL, MKDEV(blktap_major, minor), ++ NULL, "blktap%d", minor); + } + + out: +@@ -526,7 +526,7 @@ + return; + + if (info->pid > 0) { +- ptask = find_task_by_pid(info->pid); ++ ptask = find_task_by_pid_ns(info->pid, info->pid_ns); + if (ptask) + info->status = CLEANSHUTDOWN; + } +@@ -772,8 +772,9 @@ + { + if (info) { + info->pid = (pid_t)arg; +- DPRINTK("blktap: pid received %d\n", +- info->pid); ++ info->pid_ns = current->nsproxy->pid_ns; ++ DPRINTK("blktap: pid received %p:%d\n", ++ info->pid_ns, info->pid); + } + return 0; + } +@@ -1225,7 +1226,7 @@ + wake_up(&blkif->wq); + } + +-irqreturn_t tap_blkif_be_int(int irq, void *dev_id, struct pt_regs *regs) ++irqreturn_t tap_blkif_be_int(int irq, void *dev_id) + { + blkif_notify_work(dev_id); + return IRQ_HANDLED; +@@ -1686,9 +1687,8 @@ + * We only create the device when a request of a new device is + * made. + */ +- class_device_create(class, NULL, +- MKDEV(blktap_major, 0), NULL, +- "blktap0"); ++ device_create(class, NULL, MKDEV(blktap_major, 0), NULL, ++ "blktap0"); + } else { + /* this is bad, but not fatal */ + WPRINTK("blktap: sysfs xen_class not created\n"); +diff -r 54c0f88e6400 drivers/xen/blktap/common.h +--- a/drivers/xen/blktap/common.h Wed Jun 17 15:06:42 2009 +0100 ++++ b/drivers/xen/blktap/common.h Wed Jun 17 15:09:31 2009 +0100 +@@ -68,7 +68,7 @@ + wait_queue_head_t wq; + struct task_struct *xenblkd; + unsigned int waiting_reqs; +- request_queue_t *plug; ++ struct request_queue *plug; + + /* statistics */ + unsigned long st_print; +@@ -113,7 +113,7 @@ + + void tap_blkif_xenbus_init(void); + +-irqreturn_t tap_blkif_be_int(int irq, void *dev_id, struct pt_regs *regs); ++irqreturn_t tap_blkif_be_int(int irq, void *dev_id); + int tap_blkif_schedule(void *arg); + + int dom_to_devid(domid_t domid, int xenbus_id, blkif_t *blkif); +diff -r 54c0f88e6400 drivers/xen/blktap/interface.c +--- a/drivers/xen/blktap/interface.c Wed Jun 17 15:06:42 2009 +0100 ++++ b/drivers/xen/blktap/interface.c Wed Jun 17 15:09:31 2009 +0100 +@@ -34,7 +34,7 @@ + #include "common.h" + #include + +-static kmem_cache_t *blkif_cachep; ++static struct kmem_cache *blkif_cachep; + + blkif_t *tap_alloc_blkif(domid_t domid) + { +@@ -177,5 +177,5 @@ + void __init tap_blkif_interface_init(void) + { + blkif_cachep = kmem_cache_create("blktapif_cache", sizeof(blkif_t), +- 0, 0, NULL, NULL); ++ 0, 0, NULL); + } +diff -r 54c0f88e6400 drivers/xen/blktap/xenbus.c +--- a/drivers/xen/blktap/xenbus.c Wed Jun 17 15:06:42 2009 +0100 ++++ b/drivers/xen/blktap/xenbus.c Wed Jun 17 15:09:31 2009 +0100 +@@ -465,7 +465,6 @@ + + static struct xenbus_driver blktap = { + .name = "tap", +- .owner = THIS_MODULE, + .ids = blktap_ids, + .probe = blktap_probe, + .remove = blktap_remove, +@@ -475,5 +474,6 @@ + + void tap_blkif_xenbus_init(void) + { +- xenbus_register_backend(&blktap); ++ if (xenbus_register_backend(&blktap)) ++ BUG(); + } diff --git a/master/git-01db4957179c92fda7d9a06e49b7ae56fb7c925b.patch b/master/git-01db4957179c92fda7d9a06e49b7ae56fb7c925b.patch new file mode 100644 index 0000000..d66d4c4 --- /dev/null +++ b/master/git-01db4957179c92fda7d9a06e49b7ae56fb7c925b.patch @@ -0,0 +1,46 @@ +commit 01db4957179c92fda7d9a06e49b7ae56fb7c925b +Author: Yu Zhao +Date: Fri Mar 20 11:25:17 2009 +0800 + + PCI: document SR-IOV sysfs entries + + Reviewed-by: Randy Dunlap + Reviewed-by: Matthew Wilcox + Signed-off-by: Yu Zhao + Signed-off-by: Jesse Barnes + +diff --git a/Documentation/ABI/testing/sysfs-bus-pci b/Documentation/ABI/testing/sysfs-bus-pci +index 3d29793..d175a2a 100644 +--- a/Documentation/ABI/testing/sysfs-bus-pci ++++ b/Documentation/ABI/testing/sysfs-bus-pci +@@ -68,3 +68,30 @@ Description: + that some devices may have malformatted data. If the + underlying VPD has a writable section then the + corresponding section of this file will be writable. ++ ++What: /sys/bus/pci/devices/.../virtfnN ++Date: March 2009 ++Contact: Yu Zhao ++Description: ++ This symbolic link appears when hardware supports the SR-IOV ++ capability and the Physical Function driver has enabled it. ++ The symbolic link points to the PCI device sysfs entry of the ++ Virtual Function whose index is N (0...MaxVFs-1). ++ ++What: /sys/bus/pci/devices/.../dep_link ++Date: March 2009 ++Contact: Yu Zhao ++Description: ++ This symbolic link appears when hardware supports the SR-IOV ++ capability and the Physical Function driver has enabled it, ++ and this device has vendor specific dependencies with others. ++ The symbolic link points to the PCI device sysfs entry of ++ Physical Function this device depends on. ++ ++What: /sys/bus/pci/devices/.../physfn ++Date: March 2009 ++Contact: Yu Zhao ++Description: ++ This symbolic link appears when a device is a Virtual Function. ++ The symbolic link points to the PCI device sysfs entry of the ++ Physical Function this device associates with. diff --git a/master/git-0b400c7ed4d027e02f6231afa39852a2d48e6f25.patch b/master/git-0b400c7ed4d027e02f6231afa39852a2d48e6f25.patch new file mode 100644 index 0000000..ccc000e --- /dev/null +++ b/master/git-0b400c7ed4d027e02f6231afa39852a2d48e6f25.patch @@ -0,0 +1,70 @@ +commit 0b400c7ed4d027e02f6231afa39852a2d48e6f25 +Author: Yu Zhao +Date: Sat Nov 22 02:40:40 2008 +0800 + + PCI: export __pci_read_base() + + Export __pci_read_base() so it can be used by whole PCI subsystem. + + Signed-off-by: Yu Zhao + Signed-off-by: Jesse Barnes + +diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h +index 3923884..d881fde 100644 +--- a/drivers/pci/pci.h ++++ b/drivers/pci/pci.h +@@ -162,6 +162,15 @@ struct pci_slot_attribute { + }; + #define to_pci_slot_attr(s) container_of(s, struct pci_slot_attribute, attr) + ++enum pci_bar_type { ++ pci_bar_unknown, /* Standard PCI BAR probe */ ++ pci_bar_io, /* An io port BAR */ ++ pci_bar_mem32, /* A 32-bit memory BAR */ ++ pci_bar_mem64, /* A 64-bit memory BAR */ ++}; ++ ++extern int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type, ++ struct resource *res, unsigned int reg); + extern void pci_enable_ari(struct pci_dev *dev); + /** + * pci_ari_enabled - query ARI forwarding status +diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c +index e1cf5d5..5372d36 100644 +--- a/drivers/pci/probe.c ++++ b/drivers/pci/probe.c +@@ -135,13 +135,6 @@ static u64 pci_size(u64 base, u64 maxbase, u64 mask) + return size; + } + +-enum pci_bar_type { +- pci_bar_unknown, /* Standard PCI BAR probe */ +- pci_bar_io, /* An io port BAR */ +- pci_bar_mem32, /* A 32-bit memory BAR */ +- pci_bar_mem64, /* A 64-bit memory BAR */ +-}; +- + static inline enum pci_bar_type decode_bar(struct resource *res, u32 bar) + { + if ((bar & PCI_BASE_ADDRESS_SPACE) == PCI_BASE_ADDRESS_SPACE_IO) { +@@ -156,11 +149,16 @@ static inline enum pci_bar_type decode_bar(struct resource *res, u32 bar) + return pci_bar_mem32; + } + +-/* +- * If the type is not unknown, we assume that the lowest bit is 'enable'. +- * Returns 1 if the BAR was 64-bit and 0 if it was 32-bit. ++/** ++ * pci_read_base - read a PCI BAR ++ * @dev: the PCI device ++ * @type: type of the BAR ++ * @res: resource buffer to be filled in ++ * @pos: BAR position in the config space ++ * ++ * Returns 1 if the BAR is 64-bit, or 0 if 32-bit. + */ +-static int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type, ++int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type, + struct resource *res, unsigned int pos) + { + u32 l, sz, mask; diff --git a/master/git-14add80b5120966fe0659d61815b9e9b4b68fdc5-fixes.patch b/master/git-14add80b5120966fe0659d61815b9e9b4b68fdc5-fixes.patch new file mode 100644 index 0000000..38ee923 --- /dev/null +++ b/master/git-14add80b5120966fe0659d61815b9e9b4b68fdc5-fixes.patch @@ -0,0 +1,12 @@ +diff -r a5c375519328 drivers/pci/quirks.c +--- a/drivers/pci/quirks.c Wed Jul 08 11:36:54 2009 +0100 ++++ b/drivers/pci/quirks.c Wed Jul 08 11:36:59 2009 +0100 +@@ -59,7 +59,7 @@ + r->start = 0; + + if (i < PCI_BRIDGE_RESOURCES) { +- pci_update_resource(dev, r, i); ++ pci_update_resource(dev, i); + } + } + /* need to disable bridge's resource window, diff --git a/master/git-14add80b5120966fe0659d61815b9e9b4b68fdc5.patch b/master/git-14add80b5120966fe0659d61815b9e9b4b68fdc5.patch new file mode 100644 index 0000000..3fdcb69 --- /dev/null +++ b/master/git-14add80b5120966fe0659d61815b9e9b4b68fdc5.patch @@ -0,0 +1,74 @@ +commit 14add80b5120966fe0659d61815b9e9b4b68fdc5 +Author: Yu Zhao +Date: Sat Nov 22 02:38:52 2008 +0800 + + PCI: remove unnecessary arg of pci_update_resource() + + This cleanup removes unnecessary argument 'struct resource *res' in + pci_update_resource(), so it takes same arguments as other companion + functions (pci_assign_resource(), etc.). + + Signed-off-by: Yu Zhao + Signed-off-by: Jesse Barnes + +diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c +--- a/drivers/pci/pci.c ++++ b/drivers/pci/pci.c +@@ -379,8 +379,8 @@ + return; + } + +- for (i = 0; i < numres; i ++) +- pci_update_resource(dev, &dev->resource[i], i); ++ for (i = 0; i < numres; i++) ++ pci_update_resource(dev, i); + } + + static struct pci_platform_pm_ops *pci_platform_pm; +diff --git a/drivers/pci/setup-res.c b/drivers/pci/setup-res.c +--- a/drivers/pci/setup-res.c ++++ b/drivers/pci/setup-res.c +@@ -26,11 +26,12 @@ + #include "pci.h" + + +-void pci_update_resource(struct pci_dev *dev, struct resource *res, int resno) ++void pci_update_resource(struct pci_dev *dev, int resno) + { + struct pci_bus_region region; + u32 new, check, mask; + int reg; ++ struct resource *res = dev->resource + resno; + + /* + * Ignore resources for unimplemented BARs and unused resource slots +@@ -195,7 +196,7 @@ + (unsigned long long)res->start, + (unsigned long long)res->end); + #endif +- pci_update_resource(dev, res, resno); ++ pci_update_resource(dev, resno); + } + } + +@@ -240,7 +241,7 @@ + (unsigned long long)res->start, + (unsigned long long)res->end); + #endif +- pci_update_resource(dev, res, resno); ++ pci_update_resource(dev, resno); + } + + return ret; +diff --git a/include/linux/pci.h b/include/linux/pci.h +--- a/include/linux/pci.h ++++ b/include/linux/pci.h +@@ -644,7 +644,7 @@ + int pcie_set_readrq(struct pci_dev *dev, int rq); + int pci_reset_function(struct pci_dev *dev); + int pci_execute_reset_function(struct pci_dev *dev); +-void pci_update_resource(struct pci_dev *dev, struct resource *res, int resno); ++void pci_update_resource(struct pci_dev *dev, int resno); + int __must_check pci_assign_resource(struct pci_dev *dev, int i); + int pci_select_bars(struct pci_dev *dev, unsigned long flags); + #ifdef CONFIG_XEN diff --git a/master/git-15b49bee3a2b228370194f1b3ebc3db427cc9c94.patch b/master/git-15b49bee3a2b228370194f1b3ebc3db427cc9c94.patch new file mode 100644 index 0000000..0af65a3 --- /dev/null +++ b/master/git-15b49bee3a2b228370194f1b3ebc3db427cc9c94.patch @@ -0,0 +1,128 @@ +commit 15b49bee3a2b228370194f1b3ebc3db427cc9c94 +Author: Yu Zhao +Date: Fri Mar 20 11:25:18 2009 +0800 + + PCI: manual for SR-IOV user and driver developer + + Reviewed-by: Randy Dunlap + Reviewed-by: Matthew Wilcox + Signed-off-by: Yu Zhao + Signed-off-by: Jesse Barnes + +diff --git a/Documentation/DocBook/kernel-api.tmpl b/Documentation/DocBook/kernel-api.tmpl +index bc962cd..58c1945 100644 +--- a/Documentation/DocBook/kernel-api.tmpl ++++ b/Documentation/DocBook/kernel-api.tmpl +@@ -199,6 +199,7 @@ X!Edrivers/pci/hotplug.c + --> + !Edrivers/pci/probe.c + !Edrivers/pci/rom.c ++!Edrivers/pci/iov.c + + PCI Hotplug Support Library + !Edrivers/pci/hotplug/pci_hotplug_core.c +diff --git a/Documentation/PCI/pci-iov-howto.txt b/Documentation/PCI/pci-iov-howto.txt +new file mode 100644 +index 0000000..fc73ef5 +--- /dev/null ++++ b/Documentation/PCI/pci-iov-howto.txt +@@ -0,0 +1,99 @@ ++ PCI Express I/O Virtualization Howto ++ Copyright (C) 2009 Intel Corporation ++ Yu Zhao ++ ++ ++1. Overview ++ ++1.1 What is SR-IOV ++ ++Single Root I/O Virtualization (SR-IOV) is a PCI Express Extended ++capability which makes one physical device appear as multiple virtual ++devices. The physical device is referred to as Physical Function (PF) ++while the virtual devices are referred to as Virtual Functions (VF). ++Allocation of the VF can be dynamically controlled by the PF via ++registers encapsulated in the capability. By default, this feature is ++not enabled and the PF behaves as traditional PCIe device. Once it's ++turned on, each VF's PCI configuration space can be accessed by its own ++Bus, Device and Function Number (Routing ID). And each VF also has PCI ++Memory Space, which is used to map its register set. VF device driver ++operates on the register set so it can be functional and appear as a ++real existing PCI device. ++ ++2. User Guide ++ ++2.1 How can I enable SR-IOV capability ++ ++The device driver (PF driver) will control the enabling and disabling ++of the capability via API provided by SR-IOV core. If the hardware ++has SR-IOV capability, loading its PF driver would enable it and all ++VFs associated with the PF. ++ ++2.2 How can I use the Virtual Functions ++ ++The VF is treated as hot-plugged PCI devices in the kernel, so they ++should be able to work in the same way as real PCI devices. The VF ++requires device driver that is same as a normal PCI device's. ++ ++3. Developer Guide ++ ++3.1 SR-IOV API ++ ++To enable SR-IOV capability: ++ int pci_enable_sriov(struct pci_dev *dev, int nr_virtfn); ++ 'nr_virtfn' is number of VFs to be enabled. ++ ++To disable SR-IOV capability: ++ void pci_disable_sriov(struct pci_dev *dev); ++ ++To notify SR-IOV core of Virtual Function Migration: ++ irqreturn_t pci_sriov_migration(struct pci_dev *dev); ++ ++3.2 Usage example ++ ++Following piece of code illustrates the usage of the SR-IOV API. ++ ++static int __devinit dev_probe(struct pci_dev *dev, const struct pci_device_id *id) ++{ ++ pci_enable_sriov(dev, NR_VIRTFN); ++ ++ ... ++ ++ return 0; ++} ++ ++static void __devexit dev_remove(struct pci_dev *dev) ++{ ++ pci_disable_sriov(dev); ++ ++ ... ++} ++ ++static int dev_suspend(struct pci_dev *dev, pm_message_t state) ++{ ++ ... ++ ++ return 0; ++} ++ ++static int dev_resume(struct pci_dev *dev) ++{ ++ ... ++ ++ return 0; ++} ++ ++static void dev_shutdown(struct pci_dev *dev) ++{ ++ ... ++} ++ ++static struct pci_driver dev_driver = { ++ .name = "SR-IOV Physical Function driver", ++ .id_table = dev_id_table, ++ .probe = dev_probe, ++ .remove = __devexit_p(dev_remove), ++ .suspend = dev_suspend, ++ .resume = dev_resume, ++ .shutdown = dev_shutdown, ++}; diff --git a/master/git-1b6b8ce2ac372ea1f2065b89228ede105eb68dc5.patch b/master/git-1b6b8ce2ac372ea1f2065b89228ede105eb68dc5.patch new file mode 100644 index 0000000..ff6bbf6 --- /dev/null +++ b/master/git-1b6b8ce2ac372ea1f2065b89228ede105eb68dc5.patch @@ -0,0 +1,138 @@ +commit 1b6b8ce2ac372ea1f2065b89228ede105eb68dc5 +Author: Yu Zhao +Date: Thu Apr 9 14:57:39 2009 +0800 + + PCI: only save/restore existent registers in the PCIe capability + + PCIe 1.1 base neither requires the endpoint to implement the entire + PCIe capability structure nor specifies default values of registers + that are not implemented by the device. So we only save and restore + registers that must be implemented by different device types if the + device PCIe capability version is 1. + + PCIe 1.1 Capability Structure Expansion ECN and PCIe 2.0 requires + all registers in the PCIe capability to be either implemented or + hardwired to 0. Their PCIe capability version is 2. + + Signed-off-by: Yu Zhao + Signed-off-by: Jesse Barnes + +diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c +index 16fd0d4..34bf0fd 100644 +--- a/drivers/pci/pci.c ++++ b/drivers/pci/pci.c +@@ -681,11 +681,34 @@ EXPORT_SYMBOL(pci_choose_state); + + #define PCI_EXP_SAVE_REGS 7 + ++#define pcie_cap_has_devctl(type, flags) 1 ++#define pcie_cap_has_lnkctl(type, flags) \ ++ ((flags & PCI_EXP_FLAGS_VERS) > 1 || \ ++ (type == PCI_EXP_TYPE_ROOT_PORT || \ ++ type == PCI_EXP_TYPE_ENDPOINT || \ ++ type == PCI_EXP_TYPE_LEG_END)) ++#define pcie_cap_has_sltctl(type, flags) \ ++ ((flags & PCI_EXP_FLAGS_VERS) > 1 || \ ++ ((type == PCI_EXP_TYPE_ROOT_PORT) || \ ++ (type == PCI_EXP_TYPE_DOWNSTREAM && \ ++ (flags & PCI_EXP_FLAGS_SLOT)))) ++#define pcie_cap_has_rtctl(type, flags) \ ++ ((flags & PCI_EXP_FLAGS_VERS) > 1 || \ ++ (type == PCI_EXP_TYPE_ROOT_PORT || \ ++ type == PCI_EXP_TYPE_RC_EC)) ++#define pcie_cap_has_devctl2(type, flags) \ ++ ((flags & PCI_EXP_FLAGS_VERS) > 1) ++#define pcie_cap_has_lnkctl2(type, flags) \ ++ ((flags & PCI_EXP_FLAGS_VERS) > 1) ++#define pcie_cap_has_sltctl2(type, flags) \ ++ ((flags & PCI_EXP_FLAGS_VERS) > 1) ++ + static int pci_save_pcie_state(struct pci_dev *dev) + { + int pos, i = 0; + struct pci_cap_saved_state *save_state; + u16 *cap; ++ u16 flags; + + pos = pci_find_capability(dev, PCI_CAP_ID_EXP); + if (pos <= 0) +@@ -698,13 +721,22 @@ static int pci_save_pcie_state(struct pci_dev *dev) + } + cap = (u16 *)&save_state->data[0]; + +- pci_read_config_word(dev, pos + PCI_EXP_DEVCTL, &cap[i++]); +- pci_read_config_word(dev, pos + PCI_EXP_LNKCTL, &cap[i++]); +- pci_read_config_word(dev, pos + PCI_EXP_SLTCTL, &cap[i++]); +- pci_read_config_word(dev, pos + PCI_EXP_RTCTL, &cap[i++]); +- pci_read_config_word(dev, pos + PCI_EXP_DEVCTL2, &cap[i++]); +- pci_read_config_word(dev, pos + PCI_EXP_LNKCTL2, &cap[i++]); +- pci_read_config_word(dev, pos + PCI_EXP_SLTCTL2, &cap[i++]); ++ pci_read_config_word(dev, pos + PCI_EXP_FLAGS, &flags); ++ ++ if (pcie_cap_has_devctl(dev->pcie_type, flags)) ++ pci_read_config_word(dev, pos + PCI_EXP_DEVCTL, &cap[i++]); ++ if (pcie_cap_has_lnkctl(dev->pcie_type, flags)) ++ pci_read_config_word(dev, pos + PCI_EXP_LNKCTL, &cap[i++]); ++ if (pcie_cap_has_sltctl(dev->pcie_type, flags)) ++ pci_read_config_word(dev, pos + PCI_EXP_SLTCTL, &cap[i++]); ++ if (pcie_cap_has_rtctl(dev->pcie_type, flags)) ++ pci_read_config_word(dev, pos + PCI_EXP_RTCTL, &cap[i++]); ++ if (pcie_cap_has_devctl2(dev->pcie_type, flags)) ++ pci_read_config_word(dev, pos + PCI_EXP_DEVCTL2, &cap[i++]); ++ if (pcie_cap_has_lnkctl2(dev->pcie_type, flags)) ++ pci_read_config_word(dev, pos + PCI_EXP_LNKCTL2, &cap[i++]); ++ if (pcie_cap_has_sltctl2(dev->pcie_type, flags)) ++ pci_read_config_word(dev, pos + PCI_EXP_SLTCTL2, &cap[i++]); + + return 0; + } +@@ -714,6 +746,7 @@ static void pci_restore_pcie_state(struct pci_dev *dev) + int i = 0, pos; + struct pci_cap_saved_state *save_state; + u16 *cap; ++ u16 flags; + + save_state = pci_find_saved_cap(dev, PCI_CAP_ID_EXP); + pos = pci_find_capability(dev, PCI_CAP_ID_EXP); +@@ -721,13 +754,22 @@ static void pci_restore_pcie_state(struct pci_dev *dev) + return; + cap = (u16 *)&save_state->data[0]; + +- pci_write_config_word(dev, pos + PCI_EXP_DEVCTL, cap[i++]); +- pci_write_config_word(dev, pos + PCI_EXP_LNKCTL, cap[i++]); +- pci_write_config_word(dev, pos + PCI_EXP_SLTCTL, cap[i++]); +- pci_write_config_word(dev, pos + PCI_EXP_RTCTL, cap[i++]); +- pci_write_config_word(dev, pos + PCI_EXP_DEVCTL2, cap[i++]); +- pci_write_config_word(dev, pos + PCI_EXP_LNKCTL2, cap[i++]); +- pci_write_config_word(dev, pos + PCI_EXP_SLTCTL2, cap[i++]); ++ pci_read_config_word(dev, pos + PCI_EXP_FLAGS, &flags); ++ ++ if (pcie_cap_has_devctl(dev->pcie_type, flags)) ++ pci_write_config_word(dev, pos + PCI_EXP_DEVCTL, cap[i++]); ++ if (pcie_cap_has_lnkctl(dev->pcie_type, flags)) ++ pci_write_config_word(dev, pos + PCI_EXP_LNKCTL, cap[i++]); ++ if (pcie_cap_has_sltctl(dev->pcie_type, flags)) ++ pci_write_config_word(dev, pos + PCI_EXP_SLTCTL, cap[i++]); ++ if (pcie_cap_has_rtctl(dev->pcie_type, flags)) ++ pci_write_config_word(dev, pos + PCI_EXP_RTCTL, cap[i++]); ++ if (pcie_cap_has_devctl2(dev->pcie_type, flags)) ++ pci_write_config_word(dev, pos + PCI_EXP_DEVCTL2, cap[i++]); ++ if (pcie_cap_has_lnkctl2(dev->pcie_type, flags)) ++ pci_write_config_word(dev, pos + PCI_EXP_LNKCTL2, cap[i++]); ++ if (pcie_cap_has_sltctl2(dev->pcie_type, flags)) ++ pci_write_config_word(dev, pos + PCI_EXP_SLTCTL2, cap[i++]); + } + + +diff --git a/include/linux/pci_regs.h b/include/linux/pci_regs.h +index e4d08c1..616bf8b 100644 +--- a/include/linux/pci_regs.h ++++ b/include/linux/pci_regs.h +@@ -376,6 +376,7 @@ + #define PCI_EXP_TYPE_DOWNSTREAM 0x6 /* Downstream Port */ + #define PCI_EXP_TYPE_PCI_BRIDGE 0x7 /* PCI/PCI-X Bridge */ + #define PCI_EXP_TYPE_RC_END 0x9 /* Root Complex Integrated Endpoint */ ++#define PCI_EXP_TYPE_RC_EC 0x10 /* Root Complex Event Collector */ + #define PCI_EXP_FLAGS_SLOT 0x0100 /* Slot implemented */ + #define PCI_EXP_FLAGS_IRQ 0x3e00 /* Interrupt message number */ + #define PCI_EXP_DEVCAP 4 /* Device capabilities */ diff --git a/master/git-201de56eb22f1ff3f36804bc70cbff220b50f067.patch b/master/git-201de56eb22f1ff3f36804bc70cbff220b50f067.patch new file mode 100644 index 0000000..15db44d --- /dev/null +++ b/master/git-201de56eb22f1ff3f36804bc70cbff220b50f067.patch @@ -0,0 +1,82 @@ +commit 201de56eb22f1ff3f36804bc70cbff220b50f067 +Author: Zhao, Yu +Date: Mon Oct 13 19:49:55 2008 +0800 + + PCI: centralize the capabilities code in probe.c + + This patch centralizes the initialization and release functions of + various PCI capabilities in probe.c, which makes the introduction + of new capability support functions cleaner in the future. + + Signed-off-by: Yu Zhao + Signed-off-by: Jesse Barnes + +diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c +index 49599ac..8c158b9 100644 +--- a/drivers/pci/probe.c ++++ b/drivers/pci/probe.c +@@ -842,6 +842,11 @@ static int pci_setup_device(struct pci_dev * dev) + return 0; + } + ++static void pci_release_capabilities(struct pci_dev *dev) ++{ ++ pci_vpd_release(dev); ++} ++ + /** + * pci_release_dev - free a pci device structure when all users of it are finished. + * @dev: device that's been disconnected +@@ -854,7 +859,7 @@ static void pci_release_dev(struct device *dev) + struct pci_dev *pci_dev; + + pci_dev = to_pci_dev(dev); +- pci_vpd_release(pci_dev); ++ pci_release_capabilities(pci_dev); + kfree(pci_dev); + } + +@@ -935,8 +940,6 @@ struct pci_dev *alloc_pci_dev(void) + + INIT_LIST_HEAD(&dev->bus_list); + +- pci_msi_init_pci_dev(dev); +- + return dev; + } + EXPORT_SYMBOL(alloc_pci_dev); +@@ -1009,11 +1012,21 @@ static struct pci_dev *pci_scan_device(struct pci_bus *bus, int devfn) + return NULL; + } + +- pci_vpd_pci22_init(dev); +- + return dev; + } + ++static void pci_init_capabilities(struct pci_dev *dev) ++{ ++ /* MSI/MSI-X list */ ++ pci_msi_init_pci_dev(dev); ++ ++ /* Power Management */ ++ pci_pm_init(dev); ++ ++ /* Vital Product Data */ ++ pci_vpd_pci22_init(dev); ++} ++ + void pci_device_add(struct pci_dev *dev, struct pci_bus *bus) + { + device_initialize(&dev->dev); +@@ -1030,8 +1043,8 @@ void pci_device_add(struct pci_dev *dev, struct pci_bus *bus) + /* Fix up broken headers */ + pci_fixup_device(pci_fixup_header, dev); + +- /* Initialize power management of the device */ +- pci_pm_init(dev); ++ /* Initialize various capabilities */ ++ pci_init_capabilities(dev); + + /* + * Add the device to our list of discovered devices diff --git a/master/git-3789fa8a2e534523c896a32a9f27f78d52ad7d82.patch b/master/git-3789fa8a2e534523c896a32a9f27f78d52ad7d82.patch new file mode 100644 index 0000000..12b0fa7 --- /dev/null +++ b/master/git-3789fa8a2e534523c896a32a9f27f78d52ad7d82.patch @@ -0,0 +1,43 @@ +commit 3789fa8a2e534523c896a32a9f27f78d52ad7d82 +Author: Yu Zhao +Date: Sat Nov 22 02:41:07 2008 +0800 + + PCI: allow pci_alloc_child_bus() to handle a NULL bridge + + Allow pci_alloc_child_bus() to allocate buses without bridge devices. + Some SR-IOV devices can occupy more than one bus number, but there is no + explicit bridges because that have internal routing mechanism. + + Signed-off-by: Yu Zhao + Signed-off-by: Jesse Barnes + +diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c +index 5372d36..2ee0096 100644 +--- a/drivers/pci/probe.c ++++ b/drivers/pci/probe.c +@@ -398,12 +398,10 @@ static struct pci_bus *pci_alloc_child_bus(struct pci_bus *parent, + if (!child) + return NULL; + +- child->self = bridge; + child->parent = parent; + child->ops = parent->ops; + child->sysdata = parent->sysdata; + child->bus_flags = parent->bus_flags; +- child->bridge = get_device(&bridge->dev); + + /* initialize some portions of the bus device, but don't register it + * now as the parent is not properly set up yet. This device will get +@@ -420,6 +418,12 @@ static struct pci_bus *pci_alloc_child_bus(struct pci_bus *parent, + child->primary = parent->secondary; + child->subordinate = 0xff; + ++ if (!bridge) ++ return child; ++ ++ child->self = bridge; ++ child->bridge = get_device(&bridge->dev); ++ + /* Set up default resource pointers and names.. */ + for (i = 0; i < PCI_BRIDGE_RESOURCE_NUM; i++) { + child->resource[i] = &bridge->resource[PCI_BRIDGE_RESOURCES+i]; diff --git a/master/git-3fa16fdb48e0d83c2acf46e357548c89891df58b.patch b/master/git-3fa16fdb48e0d83c2acf46e357548c89891df58b.patch new file mode 100644 index 0000000..c5d556c --- /dev/null +++ b/master/git-3fa16fdb48e0d83c2acf46e357548c89891df58b.patch @@ -0,0 +1,101 @@ +commit 3fa16fdb48e0d83c2acf46e357548c89891df58b +Author: Yu Zhao +Date: Sat Nov 22 02:41:45 2008 +0800 + + PCI: cleanup pci_bus_add_devices() + + Cleanup pci_bus_add_devices() by negating the conditional and + continuing, rather than having a single conditional take up the whole + body. + + Signed-off-by: Yu Zhao + Signed-off-by: Jesse Barnes + +diff --git a/drivers/pci/bus.c b/drivers/pci/bus.c +index 3e1c135..1b6de1b 100644 +--- a/drivers/pci/bus.c ++++ b/drivers/pci/bus.c +@@ -71,7 +71,7 @@ pci_bus_alloc_resource(struct pci_bus *bus, struct resource *res, + } + + /** +- * add a single device ++ * pci_bus_add_device - add a single device + * @dev: device to add + * + * This adds a single pci device to the global +@@ -105,7 +105,7 @@ int pci_bus_add_device(struct pci_dev *dev) + void pci_bus_add_devices(struct pci_bus *bus) + { + struct pci_dev *dev; +- struct pci_bus *child_bus; ++ struct pci_bus *child; + int retval; + + list_for_each_entry(dev, &bus->devices, bus_list) { +@@ -120,39 +120,40 @@ void pci_bus_add_devices(struct pci_bus *bus) + list_for_each_entry(dev, &bus->devices, bus_list) { + BUG_ON(!dev->is_added); + ++ child = dev->subordinate; + /* + * If there is an unattached subordinate bus, attach + * it and then scan for unattached PCI devices. + */ +- if (dev->subordinate) { +- if (list_empty(&dev->subordinate->node)) { +- down_write(&pci_bus_sem); +- list_add_tail(&dev->subordinate->node, +- &dev->bus->children); +- up_write(&pci_bus_sem); +- } +- pci_bus_add_devices(dev->subordinate); +- +- /* register the bus with sysfs as the parent is now +- * properly registered. */ +- child_bus = dev->subordinate; +- if (child_bus->is_added) +- continue; +- child_bus->dev.parent = child_bus->bridge; +- retval = device_register(&child_bus->dev); +- if (retval) +- dev_err(&dev->dev, "Error registering pci_bus," +- " continuing...\n"); +- else { +- child_bus->is_added = 1; +- retval = device_create_file(&child_bus->dev, +- &dev_attr_cpuaffinity); +- } ++ if (!child) ++ continue; ++ if (list_empty(&child->node)) { ++ down_write(&pci_bus_sem); ++ list_add_tail(&child->node, &dev->bus->children); ++ up_write(&pci_bus_sem); ++ } ++ pci_bus_add_devices(child); ++ ++ /* ++ * register the bus with sysfs as the parent is now ++ * properly registered. ++ */ ++ if (child->is_added) ++ continue; ++ child->dev.parent = child->bridge; ++ retval = device_register(&child->dev); ++ if (retval) ++ dev_err(&dev->dev, "Error registering pci_bus," ++ " continuing...\n"); ++ else { ++ child->is_added = 1; ++ retval = device_create_file(&child->dev, ++ &dev_attr_cpuaffinity); + if (retval) + dev_err(&dev->dev, "Error creating cpuaffinity" + " file, continuing...\n"); + +- retval = device_create_file(&child_bus->dev, ++ retval = device_create_file(&child->dev, + &dev_attr_cpulistaffinity); + if (retval) + dev_err(&dev->dev, diff --git a/master/git-480b93b7837fb3cf0579a42f4953ac463a5b9e1e.patch b/master/git-480b93b7837fb3cf0579a42f4953ac463a5b9e1e.patch new file mode 100644 index 0000000..a2ca01d --- /dev/null +++ b/master/git-480b93b7837fb3cf0579a42f4953ac463a5b9e1e.patch @@ -0,0 +1,157 @@ +commit 480b93b7837fb3cf0579a42f4953ac463a5b9e1e +Author: Yu Zhao +Date: Fri Mar 20 11:25:14 2009 +0800 + + PCI: centralize device setup code + + Move the device setup stuff into pci_setup_device() which will be used + to setup the Virtual Function later. + + Reviewed-by: Matthew Wilcox + Signed-off-by: Yu Zhao + Signed-off-by: Jesse Barnes + +diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h +--- a/drivers/pci/pci.h ++++ b/drivers/pci/pci.h +@@ -153,6 +153,7 @@ + pci_bar_mem64, /* A 64-bit memory BAR */ + }; + ++extern int pci_setup_device(struct pci_dev *dev); + extern int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type, + struct resource *res, unsigned int reg); + extern int pci_resource_bar(struct pci_dev *dev, int resno, +diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c +--- a/drivers/pci/probe.c ++++ b/drivers/pci/probe.c +@@ -740,6 +740,19 @@ + dev->irq = irq; + } + ++static void set_pcie_port_type(struct pci_dev *pdev) ++{ ++ int pos; ++ u16 reg16; ++ ++ pos = pci_find_capability(pdev, PCI_CAP_ID_EXP); ++ if (!pos) ++ return; ++ pdev->is_pcie = 1; ++ pci_read_config_word(pdev, pos + PCI_EXP_FLAGS, ®16); ++ pdev->pcie_type = (reg16 & PCI_EXP_FLAGS_TYPE) >> 4; ++} ++ + #define LEGACY_IO_RESOURCE (IORESOURCE_IO | IORESOURCE_PCI_FIXED) + + /** +@@ -749,12 +762,29 @@ + * Initialize the device structure with information about the device's + * vendor,class,memory and IO-space addresses,IRQ lines etc. + * Called at initialisation of the PCI subsystem and by CardBus services. +- * Returns 0 on success and -1 if unknown type of device (not normal, bridge +- * or CardBus). ++ * Returns 0 on success and negative if unknown type of device (not normal, ++ * bridge or CardBus). + */ +-static int pci_setup_device(struct pci_dev * dev) ++int pci_setup_device(struct pci_dev *dev) + { + u32 class; ++ u8 hdr_type; ++ ++ if (pci_read_config_byte(dev, PCI_HEADER_TYPE, &hdr_type)) ++ return -EIO; ++ ++ dev->sysdata = dev->bus->sysdata; ++ dev->dev.parent = dev->bus->bridge; ++ dev->dev.bus = &pci_bus_type; ++ dev->hdr_type = hdr_type & 0x7f; ++ dev->multifunction = !!(hdr_type & 0x80); ++ dev->cfg_size = pci_cfg_space_size(dev); ++ dev->error_state = pci_channel_io_normal; ++ set_pcie_port_type(dev); ++ ++ /* Assume 32-bit PCI; let 64-bit PCI cards (which are far rarer) ++ set this higher, assuming the system even supports it. */ ++ dev->dma_mask = 0xffffffff; + + dev_set_name(&dev->dev, "%04x:%02x:%02x.%d", pci_domain_nr(dev->bus), + dev->bus->number, PCI_SLOT(dev->devfn), +@@ -774,7 +804,6 @@ + + /* Early fixups, before probing the BARs */ + pci_fixup_device(pci_fixup_early, dev); +- class = dev->class >> 8; + + switch (dev->hdr_type) { /* header type */ + case PCI_HEADER_TYPE_NORMAL: /* standard header */ +@@ -836,7 +865,7 @@ + default: /* unknown header */ + dev_err(&dev->dev, "unknown header type %02x, " + "ignoring device\n", dev->hdr_type); +- return -1; ++ return -EIO; + + bad: + dev_err(&dev->dev, "ignoring class %02x (doesn't match header " +@@ -868,19 +897,6 @@ + pci_dev = to_pci_dev(dev); + pci_release_capabilities(pci_dev); + kfree(pci_dev); +-} +- +-static void set_pcie_port_type(struct pci_dev *pdev) +-{ +- int pos; +- u16 reg16; +- +- pos = pci_find_capability(pdev, PCI_CAP_ID_EXP); +- if (!pos) +- return; +- pdev->is_pcie = 1; +- pci_read_config_word(pdev, pos + PCI_EXP_FLAGS, ®16); +- pdev->pcie_type = (reg16 & PCI_EXP_FLAGS_TYPE) >> 4; + } + + /** +@@ -958,7 +974,6 @@ + { + struct pci_dev *dev; + u32 l; +- u8 hdr_type; + int delay = 1; + + if (pci_bus_read_config_dword(bus, devfn, PCI_VENDOR_ID, &l)) +@@ -985,30 +1000,17 @@ + } + } + +- if (pci_bus_read_config_byte(bus, devfn, PCI_HEADER_TYPE, &hdr_type)) +- return NULL; +- + dev = alloc_pci_dev(); + if (!dev) + return NULL; + + dev->bus = bus; +- dev->sysdata = bus->sysdata; +- dev->dev.parent = bus->bridge; +- dev->dev.bus = &pci_bus_type; + dev->devfn = devfn; +- dev->hdr_type = hdr_type & 0x7f; +- dev->multifunction = !!(hdr_type & 0x80); + dev->vendor = l & 0xffff; + dev->device = (l >> 16) & 0xffff; + dev->cfg_size = pci_cfg_space_size(dev); +- dev->error_state = pci_channel_io_normal; +- set_pcie_port_type(dev); + +- /* Assume 32-bit PCI; let 64-bit PCI cards (which are far rarer) +- set this higher, assuming the system even supports it. */ +- dev->dma_mask = 0xffffffff; +- if (pci_setup_device(dev) < 0) { ++ if (pci_setup_device(dev)) { + kfree(dev); + return NULL; + } diff --git a/master/git-4d135dbee7b0a89e946f7ba284f2b957505a2c3a.patch b/master/git-4d135dbee7b0a89e946f7ba284f2b957505a2c3a.patch new file mode 100644 index 0000000..54eaad8 --- /dev/null +++ b/master/git-4d135dbee7b0a89e946f7ba284f2b957505a2c3a.patch @@ -0,0 +1,31 @@ +commit 4d135dbee7b0a89e946f7ba284f2b957505a2c3a +Author: Yu Zhao +Date: Wed May 20 17:11:57 2009 +0800 + + PCI: fix SR-IOV function dependency link problem + + PCIe root complex integrated endpoint does not implement ARI, so this + kind of endpoint uses 3-bit function number. The function dependency + link of the integrated endpoint should be calculated using the device + number plus the value from function dependency link register. + + Normal endpoint always implements ARI and the function dependency link + register contains 8-bit function number (i.e. `devfn' from software's + perspective). + + Signed-off-by: Yu Zhao + Signed-off-by: Jesse Barnes + +diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c +index b497daa..e87fe95 100644 +--- a/drivers/pci/iov.c ++++ b/drivers/pci/iov.c +@@ -487,6 +487,8 @@ found: + iov->self = dev; + pci_read_config_dword(dev, pos + PCI_SRIOV_CAP, &iov->cap); + pci_read_config_byte(dev, pos + PCI_SRIOV_FUNC_LINK, &iov->link); ++ if (dev->pcie_type == PCI_EXP_TYPE_RC_END) ++ iov->link = PCI_DEVFN(PCI_SLOT(dev->devfn), iov->link); + + if (pdev) + iov->dev = pci_dev_get(pdev); diff --git a/master/git-58c3a727cb73b75a9104d295f096cca12959a5a5.patch b/master/git-58c3a727cb73b75a9104d295f096cca12959a5a5.patch new file mode 100644 index 0000000..ecbca8e --- /dev/null +++ b/master/git-58c3a727cb73b75a9104d295f096cca12959a5a5.patch @@ -0,0 +1,141 @@ +commit 58c3a727cb73b75a9104d295f096cca12959a5a5 +Author: Yu Zhao +Date: Tue Oct 14 14:02:53 2008 +0800 + + PCI: support PCIe ARI capability + + This patch adds support for PCI Express Alternative Routing-ID + Interpretation (ARI) capability. + + The ARI capability extends the Function Number field of the PCI Express + Endpoint by reusing the Device Number which is otherwise hardwired to 0. + With ARI, an Endpoint can have up to 256 functions. + + Signed-off-by: Yu Zhao + Signed-off-by: Jesse Barnes + +diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c +--- a/drivers/pci/pci.c ++++ b/drivers/pci/pci.c +@@ -1306,6 +1306,38 @@ + } else { + dev->pme_support = 0; + } ++} ++ ++/** ++ * pci_enable_ari - enable ARI forwarding if hardware support it ++ * @dev: the PCI device ++ */ ++void pci_enable_ari(struct pci_dev *dev) ++{ ++ int pos; ++ u32 cap; ++ u16 ctrl; ++ ++ if (!dev->is_pcie) ++ return; ++ ++ if (dev->pcie_type != PCI_EXP_TYPE_ROOT_PORT && ++ dev->pcie_type != PCI_EXP_TYPE_DOWNSTREAM) ++ return; ++ ++ pos = pci_find_capability(dev, PCI_CAP_ID_EXP); ++ if (!pos) ++ return; ++ ++ pci_read_config_dword(dev, pos + PCI_EXP_DEVCAP2, &cap); ++ if (!(cap & PCI_EXP_DEVCAP2_ARI)) ++ return; ++ ++ pci_read_config_word(dev, pos + PCI_EXP_DEVCTL2, &ctrl); ++ ctrl |= PCI_EXP_DEVCTL2_ARI; ++ pci_write_config_word(dev, pos + PCI_EXP_DEVCTL2, ctrl); ++ ++ dev->ari_enabled = 1; + } + + int +diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h +--- a/drivers/pci/pci.h ++++ b/drivers/pci/pci.h +@@ -145,6 +145,18 @@ + }; + #define to_pci_slot_attr(s) container_of(s, struct pci_slot_attribute, attr) + ++extern void pci_enable_ari(struct pci_dev *dev); ++/** ++ * pci_ari_enabled - query ARI forwarding status ++ * @dev: the PCI device ++ * ++ * Returns 1 if ARI forwarding is enabled, or 0 if not enabled; ++ */ ++static inline int pci_ari_enabled(struct pci_dev *dev) ++{ ++ return dev->ari_enabled; ++} ++ + #ifdef CONFIG_PCI_REASSIGN + extern int is_reassigndev(struct pci_dev *dev); + extern void pci_disable_bridge_window(struct pci_dev *dev); +diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c +--- a/drivers/pci/probe.c ++++ b/drivers/pci/probe.c +@@ -1023,6 +1023,9 @@ + + /* Vital Product Data */ + pci_vpd_pci22_init(dev); ++ ++ /* Alternative Routing-ID Forwarding */ ++ pci_enable_ari(dev); + } + + void pci_device_add(struct pci_dev *dev, struct pci_bus *bus) +diff --git a/include/linux/pci.h b/include/linux/pci.h +--- a/include/linux/pci.h ++++ b/include/linux/pci.h +@@ -228,6 +228,7 @@ + unsigned int irq_reroute_variant:2; /* device needs IRQ rerouting variant */ + unsigned int msi_enabled:1; + unsigned int msix_enabled:1; ++ unsigned int ari_enabled:1; /* ARI forwarding */ + unsigned int is_managed:1; + unsigned int is_pcie:1; + pci_dev_flags_t dev_flags; +diff --git a/include/linux/pci_regs.h b/include/linux/pci_regs.h +--- a/include/linux/pci_regs.h ++++ b/include/linux/pci_regs.h +@@ -419,6 +419,10 @@ + #define PCI_EXP_RTCTL_CRSSVE 0x10 /* CRS Software Visibility Enable */ + #define PCI_EXP_RTCAP 30 /* Root Capabilities */ + #define PCI_EXP_RTSTA 32 /* Root Status */ ++#define PCI_EXP_DEVCAP2 36 /* Device Capabilities 2 */ ++#define PCI_EXP_DEVCAP2_ARI 0x20 /* Alternative Routing-ID */ ++#define PCI_EXP_DEVCTL2 40 /* Device Control 2 */ ++#define PCI_EXP_DEVCTL2_ARI 0x20 /* Alternative Routing-ID */ + + /* Extended Capabilities (PCI-X 2.0 and Express) */ + #define PCI_EXT_CAP_ID(header) (header & 0x0000ffff) +@@ -429,6 +433,7 @@ + #define PCI_EXT_CAP_ID_VC 2 + #define PCI_EXT_CAP_ID_DSN 3 + #define PCI_EXT_CAP_ID_PWR 4 ++#define PCI_EXT_CAP_ID_ARI 14 + + /* Advanced Error Reporting */ + #define PCI_ERR_UNCOR_STATUS 4 /* Uncorrectable Error Status */ +@@ -536,5 +541,14 @@ + #define HT_CAPTYPE_GEN3 0xD0 /* Generation 3 hypertransport configuration */ + #define HT_CAPTYPE_PM 0xE0 /* Hypertransport powermanagement configuration */ + ++/* Alternative Routing-ID Interpretation */ ++#define PCI_ARI_CAP 0x04 /* ARI Capability Register */ ++#define PCI_ARI_CAP_MFVC 0x0001 /* MFVC Function Groups Capability */ ++#define PCI_ARI_CAP_ACS 0x0002 /* ACS Function Groups Capability */ ++#define PCI_ARI_CAP_NFN(x) (((x) >> 8) & 0xff) /* Next Function Number */ ++#define PCI_ARI_CTRL 0x06 /* ARI Control Register */ ++#define PCI_ARI_CTRL_MFVC 0x0001 /* MFVC Function Groups Enable */ ++#define PCI_ARI_CTRL_ACS 0x0002 /* ACS Function Groups Enable */ ++#define PCI_ARI_CTRL_FG(x) (((x) >> 4) & 7) /* Function Group */ + + #endif /* LINUX_PCI_REGS_H */ diff --git a/master/git-613e7ed6f72b1a115f7ece8ce1b66cf095de1348.patch b/master/git-613e7ed6f72b1a115f7ece8ce1b66cf095de1348.patch new file mode 100644 index 0000000..179023d --- /dev/null +++ b/master/git-613e7ed6f72b1a115f7ece8ce1b66cf095de1348.patch @@ -0,0 +1,92 @@ +commit 613e7ed6f72b1a115f7ece8ce1b66cf095de1348 +Author: Yu Zhao +Date: Sat Nov 22 02:41:27 2008 +0800 + + PCI: add a new function to map BAR offsets + + Add a function to map a given resource number to a corresponding + register so drivers can get the offset and type of device specific BARs. + + Signed-off-by: Yu Zhao + Signed-off-by: Jesse Barnes + +diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c +index deeab19..7e9c0f3 100644 +--- a/drivers/pci/pci.c ++++ b/drivers/pci/pci.c +@@ -2201,6 +2201,28 @@ int pci_select_bars(struct pci_dev *dev, unsigned long flags) + return bars; + } + ++/** ++ * pci_resource_bar - get position of the BAR associated with a resource ++ * @dev: the PCI device ++ * @resno: the resource number ++ * @type: the BAR type to be filled in ++ * ++ * Returns BAR position in config space, or 0 if the BAR is invalid. ++ */ ++int pci_resource_bar(struct pci_dev *dev, int resno, enum pci_bar_type *type) ++{ ++ if (resno < PCI_ROM_RESOURCE) { ++ *type = pci_bar_unknown; ++ return PCI_BASE_ADDRESS_0 + 4 * resno; ++ } else if (resno == PCI_ROM_RESOURCE) { ++ *type = pci_bar_mem32; ++ return dev->rom_base_reg; ++ } ++ ++ dev_err(&dev->dev, "BAR: invalid resource #%d\n", resno); ++ return 0; ++} ++ + static void __devinit pci_no_domains(void) + { + #ifdef CONFIG_PCI_DOMAINS +diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h +index d881fde..c4f4a1e 100644 +--- a/drivers/pci/pci.h ++++ b/drivers/pci/pci.h +@@ -171,6 +171,8 @@ enum pci_bar_type { + + extern int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type, + struct resource *res, unsigned int reg); ++extern int pci_resource_bar(struct pci_dev *dev, int resno, ++ enum pci_bar_type *type); + extern void pci_enable_ari(struct pci_dev *dev); + /** + * pci_ari_enabled - query ARI forwarding status +diff --git a/drivers/pci/setup-res.c b/drivers/pci/setup-res.c +index 3c5203f..32e8d88 100644 +--- a/drivers/pci/setup-res.c ++++ b/drivers/pci/setup-res.c +@@ -31,6 +31,7 @@ void pci_update_resource(struct pci_dev *dev, int resno) + struct pci_bus_region region; + u32 new, check, mask; + int reg; ++ enum pci_bar_type type; + struct resource *res = dev->resource + resno; + + /* +@@ -62,17 +63,13 @@ void pci_update_resource(struct pci_dev *dev, int resno) + else + mask = (u32)PCI_BASE_ADDRESS_MEM_MASK; + +- if (resno < 6) { +- reg = PCI_BASE_ADDRESS_0 + 4 * resno; +- } else if (resno == PCI_ROM_RESOURCE) { ++ reg = pci_resource_bar(dev, resno, &type); ++ if (!reg) ++ return; ++ if (type != pci_bar_unknown) { + if (!(res->flags & IORESOURCE_ROM_ENABLE)) + return; + new |= PCI_ROM_ADDRESS_ENABLE; +- reg = dev->rom_base_reg; +- } else { +- /* Hmm, non-standard resource. */ +- +- return; /* kill uninitialised var warning */ + } + + pci_write_config_dword(dev, reg, new); diff --git a/master/git-67fd1a731ff1a990d4da7689909317756e50cb4d.patch b/master/git-67fd1a731ff1a990d4da7689909317756e50cb4d.patch new file mode 100644 index 0000000..35bc204 --- /dev/null +++ b/master/git-67fd1a731ff1a990d4da7689909317756e50cb4d.patch @@ -0,0 +1,40 @@ +commit 67fd1a731ff1a990d4da7689909317756e50cb4d +Author: Herbert Xu +Date: Mon Jan 19 16:26:44 2009 -0800 + + net: Add debug info to track down GSO checksum bug + + I'm trying to track down why people're hitting the checksum warning + in skb_gso_segment. As the problem seems to be hitting lots of + people and I can't reproduce it or locate the bug, here is a patch + to print out more details which hopefully should help us to track + this down. + + Signed-off-by: Herbert Xu + Signed-off-by: David S. Miller + +diff --git a/net/core/dev.c b/net/core/dev.c +index 8d67597..6e44c32 100644 +--- a/net/core/dev.c ++++ b/net/core/dev.c +@@ -1534,7 +1534,19 @@ struct sk_buff *skb_gso_segment(struct sk_buff *skb, int features) + skb->mac_len = skb->network_header - skb->mac_header; + __skb_pull(skb, skb->mac_len); + +- if (WARN_ON(skb->ip_summed != CHECKSUM_PARTIAL)) { ++ if (unlikely(skb->ip_summed != CHECKSUM_PARTIAL)) { ++ struct net_device *dev = skb->dev; ++ struct ethtool_drvinfo info = {}; ++ ++ if (dev && dev->ethtool_ops && dev->ethtool_ops->get_drvinfo) ++ dev->ethtool_ops->get_drvinfo(dev, &info); ++ ++ WARN(1, "%s: caps=(0x%lx, 0x%lx) len=%d data_len=%d " ++ "ip_summed=%d\n", ++ info.driver, dev ? dev->features : 0L, ++ skb->sk ? skb->sk->sk_route_caps : 0L, ++ skb->len, skb->data_len, skb->ip_summed); ++ + if (skb_header_cloned(skb) && + (err = pskb_expand_head(skb, 0, 0, GFP_ATOMIC))) + return ERR_PTR(err); diff --git a/master/git-6a49d8120021897e139641062236215aac5d220e.patch b/master/git-6a49d8120021897e139641062236215aac5d220e.patch new file mode 100644 index 0000000..4c48f91 --- /dev/null +++ b/master/git-6a49d8120021897e139641062236215aac5d220e.patch @@ -0,0 +1,36 @@ +commit 6a49d8120021897e139641062236215aac5d220e +Author: Yu Zhao +Date: Sat Nov 22 02:38:21 2008 +0800 + + PCI: enhance pci_ari_enabled() + + Change parameter of pci_ari_enabled() from 'pci_dev' to 'pci_bus'. + + ARI forwarding on the bridge mostly concerns the subordinate devices + rather than the bridge itself. So this change will make the function + easier to use. + + Signed-off-by: Yu Zhao + Signed-off-by: Jesse Barnes + +diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h +index 7242b51..3923884 100644 +--- a/drivers/pci/pci.h ++++ b/drivers/pci/pci.h +@@ -165,13 +165,13 @@ struct pci_slot_attribute { + extern void pci_enable_ari(struct pci_dev *dev); + /** + * pci_ari_enabled - query ARI forwarding status +- * @dev: the PCI device ++ * @bus: the PCI bus + * + * Returns 1 if ARI forwarding is enabled, or 0 if not enabled; + */ +-static inline int pci_ari_enabled(struct pci_dev *dev) ++static inline int pci_ari_enabled(struct pci_bus *bus) + { +- return dev->ari_enabled; ++ return bus->self && bus->self->ari_enabled; + } + + #endif /* DRIVERS_PCI_H */ diff --git a/master/git-74bb1bcc7dbbc9ddef773bf3395d7ff92aaaad2e.patch b/master/git-74bb1bcc7dbbc9ddef773bf3395d7ff92aaaad2e.patch new file mode 100644 index 0000000..c028477 --- /dev/null +++ b/master/git-74bb1bcc7dbbc9ddef773bf3395d7ff92aaaad2e.patch @@ -0,0 +1,208 @@ +commit 74bb1bcc7dbbc9ddef773bf3395d7ff92aaaad2e +Author: Yu Zhao +Date: Fri Mar 20 11:25:16 2009 +0800 + + PCI: handle SR-IOV Virtual Function Migration + + Add or remove a Virtual Function after receiving a Migrate In or Out + Request. + + Reviewed-by: Matthew Wilcox + Signed-off-by: Yu Zhao + Signed-off-by: Jesse Barnes + +diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c +--- a/drivers/pci/iov.c ++++ b/drivers/pci/iov.c +@@ -179,6 +179,97 @@ + pci_dev_put(dev); + } + ++static int sriov_migration(struct pci_dev *dev) ++{ ++ u16 status; ++ struct pci_sriov *iov = dev->sriov; ++ ++ if (!iov->nr_virtfn) ++ return 0; ++ ++ if (!(iov->cap & PCI_SRIOV_CAP_VFM)) ++ return 0; ++ ++ pci_read_config_word(dev, iov->pos + PCI_SRIOV_STATUS, &status); ++ if (!(status & PCI_SRIOV_STATUS_VFM)) ++ return 0; ++ ++ schedule_work(&iov->mtask); ++ ++ return 1; ++} ++ ++static void sriov_migration_task(struct work_struct *work) ++{ ++ int i; ++ u8 state; ++ u16 status; ++ struct pci_sriov *iov = container_of(work, struct pci_sriov, mtask); ++ ++ for (i = iov->initial; i < iov->nr_virtfn; i++) { ++ state = readb(iov->mstate + i); ++ if (state == PCI_SRIOV_VFM_MI) { ++ writeb(PCI_SRIOV_VFM_AV, iov->mstate + i); ++ state = readb(iov->mstate + i); ++ if (state == PCI_SRIOV_VFM_AV) ++ virtfn_add(iov->self, i, 1); ++ } else if (state == PCI_SRIOV_VFM_MO) { ++ virtfn_remove(iov->self, i, 1); ++ writeb(PCI_SRIOV_VFM_UA, iov->mstate + i); ++ state = readb(iov->mstate + i); ++ if (state == PCI_SRIOV_VFM_AV) ++ virtfn_add(iov->self, i, 0); ++ } ++ } ++ ++ pci_read_config_word(iov->self, iov->pos + PCI_SRIOV_STATUS, &status); ++ status &= ~PCI_SRIOV_STATUS_VFM; ++ pci_write_config_word(iov->self, iov->pos + PCI_SRIOV_STATUS, status); ++} ++ ++static int sriov_enable_migration(struct pci_dev *dev, int nr_virtfn) ++{ ++ int bir; ++ u32 table; ++ resource_size_t pa; ++ struct pci_sriov *iov = dev->sriov; ++ ++ if (nr_virtfn <= iov->initial) ++ return 0; ++ ++ pci_read_config_dword(dev, iov->pos + PCI_SRIOV_VFM, &table); ++ bir = PCI_SRIOV_VFM_BIR(table); ++ if (bir > PCI_STD_RESOURCE_END) ++ return -EIO; ++ ++ table = PCI_SRIOV_VFM_OFFSET(table); ++ if (table + nr_virtfn > pci_resource_len(dev, bir)) ++ return -EIO; ++ ++ pa = pci_resource_start(dev, bir) + table; ++ iov->mstate = ioremap(pa, nr_virtfn); ++ if (!iov->mstate) ++ return -ENOMEM; ++ ++ INIT_WORK(&iov->mtask, sriov_migration_task); ++ ++ iov->ctrl |= PCI_SRIOV_CTRL_VFM | PCI_SRIOV_CTRL_INTR; ++ pci_write_config_word(dev, iov->pos + PCI_SRIOV_CTRL, iov->ctrl); ++ ++ return 0; ++} ++ ++static void sriov_disable_migration(struct pci_dev *dev) ++{ ++ struct pci_sriov *iov = dev->sriov; ++ ++ iov->ctrl &= ~(PCI_SRIOV_CTRL_VFM | PCI_SRIOV_CTRL_INTR); ++ pci_write_config_word(dev, iov->pos + PCI_SRIOV_CTRL, iov->ctrl); ++ ++ cancel_work_sync(&iov->mtask); ++ iounmap(iov->mstate); ++} ++ + static int sriov_enable(struct pci_dev *dev, int nr_virtfn) + { + int rc; +@@ -261,6 +352,12 @@ + goto failed; + } + ++ if (iov->cap & PCI_SRIOV_CAP_VFM) { ++ rc = sriov_enable_migration(dev, nr_virtfn); ++ if (rc) ++ goto failed; ++ } ++ + kobject_uevent(&dev->dev.kobj, KOBJ_CHANGE); + iov->nr_virtfn = nr_virtfn; + +@@ -289,6 +386,9 @@ + + if (!iov->nr_virtfn) + return; ++ ++ if (iov->cap & PCI_SRIOV_CAP_VFM) ++ sriov_disable_migration(dev); + + for (i = 0; i < iov->nr_virtfn; i++) + virtfn_remove(dev, i, 0); +@@ -559,3 +659,22 @@ + sriov_disable(dev); + } + EXPORT_SYMBOL_GPL(pci_disable_sriov); ++ ++/** ++ * pci_sriov_migration - notify SR-IOV core of Virtual Function Migration ++ * @dev: the PCI device ++ * ++ * Returns IRQ_HANDLED if the IRQ is handled, or IRQ_NONE if not. ++ * ++ * Physical Function driver is responsible to register IRQ handler using ++ * VF Migration Interrupt Message Number, and call this function when the ++ * interrupt is generated by the hardware. ++ */ ++irqreturn_t pci_sriov_migration(struct pci_dev *dev) ++{ ++ if (!dev->is_physfn) ++ return IRQ_NONE; ++ ++ return sriov_migration(dev) ? IRQ_HANDLED : IRQ_NONE; ++} ++EXPORT_SYMBOL_GPL(pci_sriov_migration); +diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h +--- a/drivers/pci/pci.h ++++ b/drivers/pci/pci.h +@@ -1,3 +1,5 @@ ++#include ++ + /* Functions internal to the PCI core code */ + + extern int pci_uevent(struct device *dev, struct kobj_uevent_env *env); +@@ -194,6 +196,8 @@ + struct pci_dev *dev; /* lowest numbered PF */ + struct pci_dev *self; /* this PF */ + struct mutex lock; /* lock for VF bus */ ++ struct work_struct mtask; /* VF Migration task */ ++ u8 __iomem *mstate; /* VF Migration State Array */ + }; + + #ifdef CONFIG_PCI_IOV +diff --git a/include/linux/pci.h b/include/linux/pci.h +--- a/include/linux/pci.h ++++ b/include/linux/pci.h +@@ -51,6 +51,7 @@ + #include + #include + #include ++#include + + /* Include the ID list */ + #include +@@ -1192,6 +1193,7 @@ + #ifdef CONFIG_PCI_IOV + extern int pci_enable_sriov(struct pci_dev *dev, int nr_virtfn); + extern void pci_disable_sriov(struct pci_dev *dev); ++extern irqreturn_t pci_sriov_migration(struct pci_dev *dev); + #else + static inline int pci_enable_sriov(struct pci_dev *dev, int nr_virtfn) + { +@@ -1200,6 +1202,10 @@ + static inline void pci_disable_sriov(struct pci_dev *dev) + { + } ++static inline irqreturn_t pci_sriov_migration(struct pci_dev *dev) ++{ ++ return IRQ_NONE; ++} + #endif + + #endif /* __KERNEL__ */ diff --git a/master/git-7eb93b175d4de9438a4b0af3a94a112cb5266944.patch b/master/git-7eb93b175d4de9438a4b0af3a94a112cb5266944.patch new file mode 100644 index 0000000..41df529 --- /dev/null +++ b/master/git-7eb93b175d4de9438a4b0af3a94a112cb5266944.patch @@ -0,0 +1,77 @@ +commit 7eb93b175d4de9438a4b0af3a94a112cb5266944 +Author: Yu Zhao +Date: Fri Apr 3 15:18:11 2009 +0800 + + PCI: SR-IOV quirk for Intel 82576 NIC + + If BIOS doesn't allocate resources for the SR-IOV BARs, zero the Flash + BAR and program the SR-IOV BARs to use the old Flash Memory Space. + + Please refer to Intel 82576 Gigabit Ethernet Controller Datasheet + section 7.9.2.14.2 for details. + http://download.intel.com/design/network/datashts/82576_Datasheet.pdf + + Signed-off-by: Yu Zhao + Signed-off-by: Jesse Barnes + +diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c +--- a/drivers/pci/quirks.c ++++ b/drivers/pci/quirks.c +@@ -1763,7 +1763,56 @@ + } + DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NCR, PCI_DEVICE_ID_NCR_53C810, fixup_rev1_53c810); + +-static void pci_do_fixups(struct pci_dev *dev, struct pci_fixup *f, struct pci_fixup *end) ++#ifdef CONFIG_PCI_IOV ++ ++/* ++ * For Intel 82576 SR-IOV NIC, if BIOS doesn't allocate resources for the ++ * SR-IOV BARs, zero the Flash BAR and program the SR-IOV BARs to use the ++ * old Flash Memory Space. ++ */ ++static void __devinit quirk_i82576_sriov(struct pci_dev *dev) ++{ ++ int pos, flags; ++ u32 bar, start, size; ++ ++ if (PAGE_SIZE > 0x10000) ++ return; ++ ++ flags = pci_resource_flags(dev, 0); ++ if ((flags & PCI_BASE_ADDRESS_SPACE) != ++ PCI_BASE_ADDRESS_SPACE_MEMORY || ++ (flags & PCI_BASE_ADDRESS_MEM_TYPE_MASK) != ++ PCI_BASE_ADDRESS_MEM_TYPE_32) ++ return; ++ ++ pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_SRIOV); ++ if (!pos) ++ return; ++ ++ pci_read_config_dword(dev, pos + PCI_SRIOV_BAR, &bar); ++ if (bar & PCI_BASE_ADDRESS_MEM_MASK) ++ return; ++ ++ start = pci_resource_start(dev, 1); ++ size = pci_resource_len(dev, 1); ++ if (!start || size != 0x400000 || start & (size - 1)) ++ return; ++ ++ pci_resource_flags(dev, 1) = 0; ++ pci_write_config_dword(dev, PCI_BASE_ADDRESS_1, 0); ++ pci_write_config_dword(dev, pos + PCI_SRIOV_BAR, start); ++ pci_write_config_dword(dev, pos + PCI_SRIOV_BAR + 12, start + size / 2); ++ ++ dev_info(&dev->dev, "use Flash Memory Space for SR-IOV BARs\n"); ++} ++DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x10c9, quirk_i82576_sriov); ++DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x10e6, quirk_i82576_sriov); ++DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x10e7, quirk_i82576_sriov); ++ ++#endif /* CONFIG_PCI_IOV */ ++ ++static void pci_do_fixups(struct pci_dev *dev, struct pci_fixup *f, ++ struct pci_fixup *end) + { + while (f < end) { + if ((f->vendor == dev->vendor || f->vendor == (u16) PCI_ANY_ID) && diff --git a/master/git-8113587c2d14d3be2414190845b2e2617c0aa33b.patch b/master/git-8113587c2d14d3be2414190845b2e2617c0aa33b.patch new file mode 100644 index 0000000..b2690df --- /dev/null +++ b/master/git-8113587c2d14d3be2414190845b2e2617c0aa33b.patch @@ -0,0 +1,62 @@ +commit 8113587c2d14d3be2414190845b2e2617c0aa33b +Author: Zhao, Yu +Date: Thu Oct 23 13:15:39 2008 +0800 + + PCI: fix ARI code to be compatible with mixed ARI/non-ARI systems + + The original ARI support code has a compatibility problem with non-ARI + devices. If a device doesn't support ARI, turning on ARI forwarding on + its upper level bridge will cause undefined behavior. + + This fix turns on ARI forwarding only when the subordinate devices + support it. + + Tested-by: Suresh Siddha + Signed-off-by: Yu Zhao + Signed-off-by: Jesse Barnes + +diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c +index 533aeb5..21f2ac6 100644 +--- a/drivers/pci/pci.c ++++ b/drivers/pci/pci.c +@@ -1309,27 +1309,32 @@ void pci_enable_ari(struct pci_dev *dev) + int pos; + u32 cap; + u16 ctrl; ++ struct pci_dev *bridge; + +- if (!dev->is_pcie) ++ if (!dev->is_pcie || dev->devfn) + return; + +- if (dev->pcie_type != PCI_EXP_TYPE_ROOT_PORT && +- dev->pcie_type != PCI_EXP_TYPE_DOWNSTREAM) ++ pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ARI); ++ if (!pos) + return; + +- pos = pci_find_capability(dev, PCI_CAP_ID_EXP); ++ bridge = dev->bus->self; ++ if (!bridge || !bridge->is_pcie) ++ return; ++ ++ pos = pci_find_capability(bridge, PCI_CAP_ID_EXP); + if (!pos) + return; + +- pci_read_config_dword(dev, pos + PCI_EXP_DEVCAP2, &cap); ++ pci_read_config_dword(bridge, pos + PCI_EXP_DEVCAP2, &cap); + if (!(cap & PCI_EXP_DEVCAP2_ARI)) + return; + +- pci_read_config_word(dev, pos + PCI_EXP_DEVCTL2, &ctrl); ++ pci_read_config_word(bridge, pos + PCI_EXP_DEVCTL2, &ctrl); + ctrl |= PCI_EXP_DEVCTL2_ARI; +- pci_write_config_word(dev, pos + PCI_EXP_DEVCTL2, ctrl); ++ pci_write_config_word(bridge, pos + PCI_EXP_DEVCTL2, ctrl); + +- dev->ari_enabled = 1; ++ bridge->ari_enabled = 1; + } + + int diff --git a/master/git-876e501ab25dcd683574a5d3d56d8fe450083ed6.patch b/master/git-876e501ab25dcd683574a5d3d56d8fe450083ed6.patch new file mode 100644 index 0000000..551d881 --- /dev/null +++ b/master/git-876e501ab25dcd683574a5d3d56d8fe450083ed6.patch @@ -0,0 +1,100 @@ +commit 876e501ab25dcd683574a5d3d56d8fe450083ed6 +Author: Yu Zhao +Date: Sat Nov 22 02:42:35 2008 +0800 + + PCI: factor pci_bus_add_child() from pci_bus_add_devices() + + This patch splits a new function, pci_bus_add_child(), from + pci_bus_add_devices(). The new function can be used to register PCI + buses to the device core. + + Signed-off-by: Yu Zhao + Signed-off-by: Jesse Barnes + +diff --git a/drivers/pci/bus.c b/drivers/pci/bus.c +index 1b6de1b..52b54f0 100644 +--- a/drivers/pci/bus.c ++++ b/drivers/pci/bus.c +@@ -91,6 +91,37 @@ int pci_bus_add_device(struct pci_dev *dev) + } + + /** ++ * pci_bus_add_child - add a child bus ++ * @bus: bus to add ++ * ++ * This adds sysfs entries for a single bus ++ */ ++int pci_bus_add_child(struct pci_bus *bus) ++{ ++ int retval; ++ ++ if (bus->bridge) ++ bus->dev.parent = bus->bridge; ++ ++ retval = device_register(&bus->dev); ++ if (retval) ++ return retval; ++ ++ bus->is_added = 1; ++ ++ retval = device_create_file(&bus->dev, &dev_attr_cpuaffinity); ++ if (retval) ++ return retval; ++ ++ retval = device_create_file(&bus->dev, &dev_attr_cpulistaffinity); ++ ++ /* Create legacy_io and legacy_mem files for this bus */ ++ pci_create_legacy_files(bus); ++ ++ return retval; ++} ++ ++/** + * pci_bus_add_devices - insert newly discovered PCI devices + * @bus: bus to check for new devices + * +@@ -140,30 +171,9 @@ void pci_bus_add_devices(struct pci_bus *bus) + */ + if (child->is_added) + continue; +- child->dev.parent = child->bridge; +- retval = device_register(&child->dev); ++ retval = pci_bus_add_child(child); + if (retval) +- dev_err(&dev->dev, "Error registering pci_bus," +- " continuing...\n"); +- else { +- child->is_added = 1; +- retval = device_create_file(&child->dev, +- &dev_attr_cpuaffinity); +- if (retval) +- dev_err(&dev->dev, "Error creating cpuaffinity" +- " file, continuing...\n"); +- +- retval = device_create_file(&child->dev, +- &dev_attr_cpulistaffinity); +- if (retval) +- dev_err(&dev->dev, +- "Error creating cpulistaffinity" +- " file, continuing...\n"); +- +- /* Create legacy_io and legacy_mem files for this bus */ +- pci_create_legacy_files(child_bus); +- +- } ++ dev_err(&dev->dev, "Error adding bus, continuing\n"); + } + } + +diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h +index c4f4a1e..d1e92d8 100644 +--- a/drivers/pci/pci.h ++++ b/drivers/pci/pci.h +@@ -173,6 +173,7 @@ extern int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type, + struct resource *res, unsigned int reg); + extern int pci_resource_bar(struct pci_dev *dev, int resno, + enum pci_bar_type *type); ++extern int pci_bus_add_child(struct pci_bus *bus); + extern void pci_enable_ari(struct pci_dev *dev); + /** + * pci_ari_enabled - query ARI forwarding status diff --git a/master/git-898585172fa729513d8636257b44bd1cfd279096.patch b/master/git-898585172fa729513d8636257b44bd1cfd279096.patch new file mode 100644 index 0000000..697f845 --- /dev/null +++ b/master/git-898585172fa729513d8636257b44bd1cfd279096.patch @@ -0,0 +1,69 @@ +commit 898585172fa729513d8636257b44bd1cfd279096 +Author: Yu Zhao +Date: Mon Feb 16 02:55:47 2009 +0800 + + PCI: save and restore PCIe 2.0 registers + + PCIe 2.0 defines several new registers (Device Control 2, Link Control 2, + and Slot Control 2). Save and retore them in pci_save_pcie_state() and + pci_restore_pcie_state(). + + Signed-off-by: Yu Zhao + Signed-off-by: Jesse Barnes + +diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c +index 676bbcb..59569b8 100644 +--- a/drivers/pci/pci.c ++++ b/drivers/pci/pci.c +@@ -647,6 +647,8 @@ pci_power_t pci_choose_state(struct pci_dev *dev, pm_message_t state) + + EXPORT_SYMBOL(pci_choose_state); + ++#define PCI_EXP_SAVE_REGS 7 ++ + static int pci_save_pcie_state(struct pci_dev *dev) + { + int pos, i = 0; +@@ -668,6 +670,9 @@ static int pci_save_pcie_state(struct pci_dev *dev) + pci_read_config_word(dev, pos + PCI_EXP_LNKCTL, &cap[i++]); + pci_read_config_word(dev, pos + PCI_EXP_SLTCTL, &cap[i++]); + pci_read_config_word(dev, pos + PCI_EXP_RTCTL, &cap[i++]); ++ pci_read_config_word(dev, pos + PCI_EXP_DEVCTL2, &cap[i++]); ++ pci_read_config_word(dev, pos + PCI_EXP_LNKCTL2, &cap[i++]); ++ pci_read_config_word(dev, pos + PCI_EXP_SLTCTL2, &cap[i++]); + + return 0; + } +@@ -688,6 +693,9 @@ static void pci_restore_pcie_state(struct pci_dev *dev) + pci_write_config_word(dev, pos + PCI_EXP_LNKCTL, cap[i++]); + pci_write_config_word(dev, pos + PCI_EXP_SLTCTL, cap[i++]); + pci_write_config_word(dev, pos + PCI_EXP_RTCTL, cap[i++]); ++ pci_write_config_word(dev, pos + PCI_EXP_DEVCTL2, cap[i++]); ++ pci_write_config_word(dev, pos + PCI_EXP_LNKCTL2, cap[i++]); ++ pci_write_config_word(dev, pos + PCI_EXP_SLTCTL2, cap[i++]); + } + + +@@ -1372,7 +1380,8 @@ void pci_allocate_cap_save_buffers(struct pci_dev *dev) + { + int error; + +- error = pci_add_cap_save_buffer(dev, PCI_CAP_ID_EXP, 4 * sizeof(u16)); ++ error = pci_add_cap_save_buffer(dev, PCI_CAP_ID_EXP, ++ PCI_EXP_SAVE_REGS * sizeof(u16)); + if (error) + dev_err(&dev->dev, + "unable to preallocate PCI Express save buffer\n"); +diff --git a/include/linux/pci_regs.h b/include/linux/pci_regs.h +index d4e6638..e4d08c1 100644 +--- a/include/linux/pci_regs.h ++++ b/include/linux/pci_regs.h +@@ -488,6 +488,8 @@ + #define PCI_EXP_DEVCAP2_ARI 0x20 /* Alternative Routing-ID */ + #define PCI_EXP_DEVCTL2 40 /* Device Control 2 */ + #define PCI_EXP_DEVCTL2_ARI 0x20 /* Alternative Routing-ID */ ++#define PCI_EXP_LNKCTL2 48 /* Link Control 2 */ ++#define PCI_EXP_SLTCTL2 56 /* Slot Control 2 */ + + /* Extended Capabilities (PCI-X 2.0 and Express) */ + #define PCI_EXT_CAP_ID(header) (header & 0x0000ffff) diff --git a/master/git-8c5cdb6adc6688b9b8fd82ea4a5cf4674dabad79.patch b/master/git-8c5cdb6adc6688b9b8fd82ea4a5cf4674dabad79.patch new file mode 100644 index 0000000..ab2ba8a --- /dev/null +++ b/master/git-8c5cdb6adc6688b9b8fd82ea4a5cf4674dabad79.patch @@ -0,0 +1,91 @@ +commit 8c5cdb6adc6688b9b8fd82ea4a5cf4674dabad79 +Author: Yu Zhao +Date: Fri Mar 20 11:25:12 2009 +0800 + + PCI: restore saved SR-IOV state + + Restore the volatile registers in the SR-IOV capability after the + D3->D0 transition. + + Reviewed-by: Matthew Wilcox + Signed-off-by: Yu Zhao + Signed-off-by: Jesse Barnes + +diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c +index 66cc414..b121e47 100644 +--- a/drivers/pci/iov.c ++++ b/drivers/pci/iov.c +@@ -129,6 +129,25 @@ static void sriov_release(struct pci_dev *dev) + dev->sriov = NULL; + } + ++static void sriov_restore_state(struct pci_dev *dev) ++{ ++ int i; ++ u16 ctrl; ++ struct pci_sriov *iov = dev->sriov; ++ ++ pci_read_config_word(dev, iov->pos + PCI_SRIOV_CTRL, &ctrl); ++ if (ctrl & PCI_SRIOV_CTRL_VFE) ++ return; ++ ++ for (i = PCI_IOV_RESOURCES; i <= PCI_IOV_RESOURCE_END; i++) ++ pci_update_resource(dev, i); ++ ++ pci_write_config_dword(dev, iov->pos + PCI_SRIOV_SYS_PGSIZE, iov->pgsz); ++ pci_write_config_word(dev, iov->pos + PCI_SRIOV_CTRL, iov->ctrl); ++ if (iov->ctrl & PCI_SRIOV_CTRL_VFE) ++ msleep(100); ++} ++ + /** + * pci_iov_init - initialize the IOV capability + * @dev: the PCI device +@@ -180,3 +199,13 @@ int pci_iov_resource_bar(struct pci_dev *dev, int resno, + return dev->sriov->pos + PCI_SRIOV_BAR + + 4 * (resno - PCI_IOV_RESOURCES); + } ++ ++/** ++ * pci_restore_iov_state - restore the state of the IOV capability ++ * @dev: the PCI device ++ */ ++void pci_restore_iov_state(struct pci_dev *dev) ++{ ++ if (dev->is_physfn) ++ sriov_restore_state(dev); ++} +diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c +index 2b3201e..676bbcb 100644 +--- a/drivers/pci/pci.c ++++ b/drivers/pci/pci.c +@@ -775,6 +775,7 @@ pci_restore_state(struct pci_dev *dev) + } + pci_restore_pcix_state(dev); + pci_restore_msi_state(dev); ++ pci_restore_iov_state(dev); + + return 0; + } +diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h +index 7d5327c..fd5ea4d 100644 +--- a/drivers/pci/pci.h ++++ b/drivers/pci/pci.h +@@ -222,6 +222,7 @@ extern int pci_iov_init(struct pci_dev *dev); + extern void pci_iov_release(struct pci_dev *dev); + extern int pci_iov_resource_bar(struct pci_dev *dev, int resno, + enum pci_bar_type *type); ++extern void pci_restore_iov_state(struct pci_dev *dev); + #else + static inline int pci_iov_init(struct pci_dev *dev) + { +@@ -236,6 +237,9 @@ static inline int pci_iov_resource_bar(struct pci_dev *dev, int resno, + { + return 0; + } ++static inline void pci_restore_iov_state(struct pci_dev *dev) ++{ ++} + #endif /* CONFIG_PCI_IOV */ + + #endif /* DRIVERS_PCI_H */ diff --git a/master/git-8dd7f8036c123296fc4214f9d8810eb485570422.patch b/master/git-8dd7f8036c123296fc4214f9d8810eb485570422.patch new file mode 100644 index 0000000..791484f --- /dev/null +++ b/master/git-8dd7f8036c123296fc4214f9d8810eb485570422.patch @@ -0,0 +1,178 @@ +commit 8dd7f8036c123296fc4214f9d8810eb485570422 +Author: Sheng Yang +Date: Tue Oct 21 17:38:25 2008 +0800 + + PCI: add support for function level reset + + Sometimes, it's necessary to enable software's ability to quiesce and + reset endpoint hardware with function-level granularity, so provide + support for it. + + The patch implement Function Level Reset(FLR) feature following PCI-e + spec. And this is the first step. We would add more generic method, like + D0/D3, to allow more devices support this function. + + The patch contains two functions. pcie_reset_function() is the new + driver API, and, contains some action to quiesce a device. The other + function is a helper: pcie_execute_reset_function() just executes the + reset for a particular device function. + + Current the usage model is in KVM. Function reset is necessary for + assigning device to a guest, or moving it between partitions. + + For Function Level Reset(FLR), please refer to PCI Express spec chapter + 6.6.2. + + Signed-off-by: Sheng Yang + Signed-off-by: Matthew Wilcox + Signed-off-by: Jesse Barnes + +diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c +index aee73cf..533aeb5 100644 +--- a/drivers/pci/pci.c ++++ b/drivers/pci/pci.c +@@ -18,6 +18,7 @@ + #include + #include + #include ++#include + #include /* isa_dma_bridge_buggy */ + #include "pci.h" + +@@ -1746,6 +1747,103 @@ EXPORT_SYMBOL(pci_set_dma_seg_boundary); + #endif + + /** ++ * pci_execute_reset_function() - Reset a PCI device function ++ * @dev: Device function to reset ++ * ++ * Some devices allow an individual function to be reset without affecting ++ * other functions in the same device. The PCI device must be responsive ++ * to PCI config space in order to use this function. ++ * ++ * The device function is presumed to be unused when this function is called. ++ * Resetting the device will make the contents of PCI configuration space ++ * random, so any caller of this must be prepared to reinitialise the ++ * device including MSI, bus mastering, BARs, decoding IO and memory spaces, ++ * etc. ++ * ++ * Returns 0 if the device function was successfully reset or -ENOTTY if the ++ * device doesn't support resetting a single function. ++ */ ++int pci_execute_reset_function(struct pci_dev *dev) ++{ ++ u16 status; ++ u32 cap; ++ int exppos = pci_find_capability(dev, PCI_CAP_ID_EXP); ++ ++ if (!exppos) ++ return -ENOTTY; ++ pci_read_config_dword(dev, exppos + PCI_EXP_DEVCAP, &cap); ++ if (!(cap & PCI_EXP_DEVCAP_FLR)) ++ return -ENOTTY; ++ ++ pci_block_user_cfg_access(dev); ++ ++ /* Wait for Transaction Pending bit clean */ ++ msleep(100); ++ pci_read_config_word(dev, exppos + PCI_EXP_DEVSTA, &status); ++ if (status & PCI_EXP_DEVSTA_TRPND) { ++ dev_info(&dev->dev, "Busy after 100ms while trying to reset; " ++ "sleeping for 1 second\n"); ++ ssleep(1); ++ pci_read_config_word(dev, exppos + PCI_EXP_DEVSTA, &status); ++ if (status & PCI_EXP_DEVSTA_TRPND) ++ dev_info(&dev->dev, "Still busy after 1s; " ++ "proceeding with reset anyway\n"); ++ } ++ ++ pci_write_config_word(dev, exppos + PCI_EXP_DEVCTL, ++ PCI_EXP_DEVCTL_BCR_FLR); ++ mdelay(100); ++ ++ pci_unblock_user_cfg_access(dev); ++ return 0; ++} ++EXPORT_SYMBOL_GPL(pci_execute_reset_function); ++ ++/** ++ * pci_reset_function() - quiesce and reset a PCI device function ++ * @dev: Device function to reset ++ * ++ * Some devices allow an individual function to be reset without affecting ++ * other functions in the same device. The PCI device must be responsive ++ * to PCI config space in order to use this function. ++ * ++ * This function does not just reset the PCI portion of a device, but ++ * clears all the state associated with the device. This function differs ++ * from pci_execute_reset_function in that it saves and restores device state ++ * over the reset. ++ * ++ * Returns 0 if the device function was successfully reset or -ENOTTY if the ++ * device doesn't support resetting a single function. ++ */ ++int pci_reset_function(struct pci_dev *dev) ++{ ++ u32 cap; ++ int exppos = pci_find_capability(dev, PCI_CAP_ID_EXP); ++ int r; ++ ++ if (!exppos) ++ return -ENOTTY; ++ pci_read_config_dword(dev, exppos + PCI_EXP_DEVCAP, &cap); ++ if (!(cap & PCI_EXP_DEVCAP_FLR)) ++ return -ENOTTY; ++ ++ if (!dev->msi_enabled && !dev->msix_enabled) ++ disable_irq(dev->irq); ++ pci_save_state(dev); ++ ++ pci_write_config_word(dev, PCI_COMMAND, PCI_COMMAND_INTX_DISABLE); ++ ++ r = pci_execute_reset_function(dev); ++ ++ pci_restore_state(dev); ++ if (!dev->msi_enabled && !dev->msix_enabled) ++ enable_irq(dev->irq); ++ ++ return r; ++} ++EXPORT_SYMBOL_GPL(pci_reset_function); ++ ++/** + * pcix_get_max_mmrbc - get PCI-X maximum designed memory read byte count + * @dev: PCI device to query + * +diff --git a/include/linux/pci.h b/include/linux/pci.h +index 085187b..f6f6810 100644 +--- a/include/linux/pci.h ++++ b/include/linux/pci.h +@@ -626,6 +626,8 @@ int pcix_get_mmrbc(struct pci_dev *dev); + int pcix_set_mmrbc(struct pci_dev *dev, int mmrbc); + int pcie_get_readrq(struct pci_dev *dev); + int pcie_set_readrq(struct pci_dev *dev, int rq); ++int pci_reset_function(struct pci_dev *dev); ++int pci_execute_reset_function(struct pci_dev *dev); + void pci_update_resource(struct pci_dev *dev, struct resource *res, int resno); + int __must_check pci_assign_resource(struct pci_dev *dev, int i); + int pci_select_bars(struct pci_dev *dev, unsigned long flags); +diff --git a/include/linux/pci_regs.h b/include/linux/pci_regs.h +index eb6686b..e5effd4 100644 +--- a/include/linux/pci_regs.h ++++ b/include/linux/pci_regs.h +@@ -377,6 +377,7 @@ + #define PCI_EXP_DEVCAP_RBER 0x8000 /* Role-Based Error Reporting */ + #define PCI_EXP_DEVCAP_PWR_VAL 0x3fc0000 /* Slot Power Limit Value */ + #define PCI_EXP_DEVCAP_PWR_SCL 0xc000000 /* Slot Power Limit Scale */ ++#define PCI_EXP_DEVCAP_FLR 0x10000000 /* Function Level Reset */ + #define PCI_EXP_DEVCTL 8 /* Device Control */ + #define PCI_EXP_DEVCTL_CERE 0x0001 /* Correctable Error Reporting En. */ + #define PCI_EXP_DEVCTL_NFERE 0x0002 /* Non-Fatal Error Reporting Enable */ +@@ -389,6 +390,7 @@ + #define PCI_EXP_DEVCTL_AUX_PME 0x0400 /* Auxiliary Power PM Enable */ + #define PCI_EXP_DEVCTL_NOSNOOP_EN 0x0800 /* Enable No Snoop */ + #define PCI_EXP_DEVCTL_READRQ 0x7000 /* Max_Read_Request_Size */ ++#define PCI_EXP_DEVCTL_BCR_FLR 0x8000 /* Bridge Configuration Retry / FLR */ + #define PCI_EXP_DEVSTA 10 /* Device Status */ + #define PCI_EXP_DEVSTA_CED 0x01 /* Correctable Error Detected */ + #define PCI_EXP_DEVSTA_NFED 0x02 /* Non-Fatal Error Detected */ diff --git a/master/git-93ff68a55aa92180a765d6c51c3303f6200167a6.patch b/master/git-93ff68a55aa92180a765d6c51c3303f6200167a6.patch new file mode 100644 index 0000000..5e1316b --- /dev/null +++ b/master/git-93ff68a55aa92180a765d6c51c3303f6200167a6.patch @@ -0,0 +1,59 @@ +commit 93ff68a55aa92180a765d6c51c3303f6200167a6 +Author: Mike Travis +Date: Sat Sep 6 05:46:42 2008 -0700 + + PCI: make CPU list affinity visible + + Stephen Hemminger wrote: + > Looks like Mike created cpulistaffinty in sysfs but never completed + > the job. + + This patch hooks things up correctly, taking care to remove the new file + when the bus is destroyed. + + Signed-off-by: Stephen Hemminger + Signed-off-by: Mike Travis + Signed-off-by: Jesse Barnes + +diff --git a/drivers/pci/bus.c b/drivers/pci/bus.c +index 529d9d7..999cc40 100644 +--- a/drivers/pci/bus.c ++++ b/drivers/pci/bus.c +@@ -151,6 +151,13 @@ void pci_bus_add_devices(struct pci_bus *bus) + if (retval) + dev_err(&dev->dev, "Error creating cpuaffinity" + " file, continuing...\n"); ++ ++ retval = device_create_file(&child_bus->dev, ++ &dev_attr_cpulistaffinity); ++ if (retval) ++ dev_err(&dev->dev, ++ "Error creating cpulistaffinity" ++ " file, continuing...\n"); + } + } + } +diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h +index d807cd7..4723b12 100644 +--- a/drivers/pci/pci.h ++++ b/drivers/pci/pci.h +@@ -109,6 +109,7 @@ static inline int pci_no_d1d2(struct pci_dev *dev) + extern int pcie_mch_quirk; + extern struct device_attribute pci_dev_attrs[]; + extern struct device_attribute dev_attr_cpuaffinity; ++extern struct device_attribute dev_attr_cpulistaffinity; + + /** + * pci_match_one_device - Tell if a PCI device structure has a matching +diff --git a/drivers/pci/remove.c b/drivers/pci/remove.c +index bdc2a44..f94f6d5 100644 +--- a/drivers/pci/remove.c ++++ b/drivers/pci/remove.c +@@ -73,6 +73,7 @@ void pci_remove_bus(struct pci_bus *pci_bus) + up_write(&pci_bus_sem); + pci_remove_legacy_files(pci_bus); + device_remove_file(&pci_bus->dev, &dev_attr_cpuaffinity); ++ device_remove_file(&pci_bus->dev, &dev_attr_cpulistaffinity); + device_unregister(&pci_bus->dev); + } + EXPORT_SYMBOL(pci_remove_bus); diff --git a/master/git-a28724b0fb909d247229a70761c90bb37b13366a.patch b/master/git-a28724b0fb909d247229a70761c90bb37b13366a.patch new file mode 100644 index 0000000..fbf173c --- /dev/null +++ b/master/git-a28724b0fb909d247229a70761c90bb37b13366a.patch @@ -0,0 +1,101 @@ +commit a28724b0fb909d247229a70761c90bb37b13366a +Author: Yu Zhao +Date: Fri Mar 20 11:25:13 2009 +0800 + + PCI: reserve bus range for SR-IOV device + + Reserve the bus number range used by the Virtual Function when + pcibios_assign_all_busses() returns true. + + Reviewed-by: Matthew Wilcox + Signed-off-by: Yu Zhao + Signed-off-by: Jesse Barnes + +diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c +index b121e47..5ddfc09 100644 +--- a/drivers/pci/iov.c ++++ b/drivers/pci/iov.c +@@ -14,6 +14,18 @@ + #include "pci.h" + + ++static inline u8 virtfn_bus(struct pci_dev *dev, int id) ++{ ++ return dev->bus->number + ((dev->devfn + dev->sriov->offset + ++ dev->sriov->stride * id) >> 8); ++} ++ ++static inline u8 virtfn_devfn(struct pci_dev *dev, int id) ++{ ++ return (dev->devfn + dev->sriov->offset + ++ dev->sriov->stride * id) & 0xff; ++} ++ + static int sriov_init(struct pci_dev *dev, int pos) + { + int i; +@@ -209,3 +221,27 @@ void pci_restore_iov_state(struct pci_dev *dev) + if (dev->is_physfn) + sriov_restore_state(dev); + } ++ ++/** ++ * pci_iov_bus_range - find bus range used by Virtual Function ++ * @bus: the PCI bus ++ * ++ * Returns max number of buses (exclude current one) used by Virtual ++ * Functions. ++ */ ++int pci_iov_bus_range(struct pci_bus *bus) ++{ ++ int max = 0; ++ u8 busnr; ++ struct pci_dev *dev; ++ ++ list_for_each_entry(dev, &bus->devices, bus_list) { ++ if (!dev->is_physfn) ++ continue; ++ busnr = virtfn_bus(dev, dev->sriov->total - 1); ++ if (busnr > max) ++ max = busnr; ++ } ++ ++ return max ? max - bus->number : 0; ++} +diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h +index fd5ea4d..5c29cb2 100644 +--- a/drivers/pci/pci.h ++++ b/drivers/pci/pci.h +@@ -223,6 +223,7 @@ extern void pci_iov_release(struct pci_dev *dev); + extern int pci_iov_resource_bar(struct pci_dev *dev, int resno, + enum pci_bar_type *type); + extern void pci_restore_iov_state(struct pci_dev *dev); ++extern int pci_iov_bus_range(struct pci_bus *bus); + #else + static inline int pci_iov_init(struct pci_dev *dev) + { +@@ -240,6 +241,10 @@ static inline int pci_iov_resource_bar(struct pci_dev *dev, int resno, + static inline void pci_restore_iov_state(struct pci_dev *dev) + { + } ++static inline int pci_iov_bus_range(struct pci_bus *bus) ++{ ++ return 0; ++} + #endif /* CONFIG_PCI_IOV */ + + #endif /* DRIVERS_PCI_H */ +diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c +index 0471f6e..0ecdaea 100644 +--- a/drivers/pci/probe.c ++++ b/drivers/pci/probe.c +@@ -1085,6 +1085,9 @@ unsigned int __devinit pci_scan_child_bus(struct pci_bus *bus) + for (devfn = 0; devfn < 0x100; devfn += 8) + pci_scan_slot(bus, devfn); + ++ /* Reserve buses for SR-IOV capability. */ ++ max += pci_iov_bus_range(bus); ++ + /* + * After performing arch-dependent fixup of the bus, look behind + * all PCI-to-PCI bridges on this bus. diff --git a/master/git-bc5f5a8277cb353161454b6704b3186ebcf3a2a3.patch b/master/git-bc5f5a8277cb353161454b6704b3186ebcf3a2a3.patch new file mode 100644 index 0000000..bff5c2e --- /dev/null +++ b/master/git-bc5f5a8277cb353161454b6704b3186ebcf3a2a3.patch @@ -0,0 +1,43 @@ +commit bc5f5a8277cb353161454b6704b3186ebcf3a2a3 +Author: Yu Zhao +Date: Sat Nov 22 02:40:00 2008 +0800 + + PCI: remove unnecessary condition check in pci_restore_bars() + + Remove the unnecessary number of resources condition checks because + the pci_update_resource() will check availability of the resources. + + Signed-off-by: Yu Zhao + Signed-off-by: Jesse Barnes + +diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c +index c3ef2e7..deeab19 100644 +--- a/drivers/pci/pci.c ++++ b/drivers/pci/pci.c +@@ -376,24 +376,9 @@ pci_find_parent_resource(const struct pci_dev *dev, struct resource *res) + static void + pci_restore_bars(struct pci_dev *dev) + { +- int i, numres; +- +- switch (dev->hdr_type) { +- case PCI_HEADER_TYPE_NORMAL: +- numres = 6; +- break; +- case PCI_HEADER_TYPE_BRIDGE: +- numres = 2; +- break; +- case PCI_HEADER_TYPE_CARDBUS: +- numres = 1; +- break; +- default: +- /* Should never get here, but just in case... */ +- return; +- } ++ int i; + +- for (i = 0; i < numres; i++) ++ for (i = 0; i < PCI_BRIDGE_RESOURCES; i++) + pci_update_resource(dev, i); + } + diff --git a/master/git-d1b054da8f599905f3c18a218961dcf17f9d5f13.patch b/master/git-d1b054da8f599905f3c18a218961dcf17f9d5f13.patch new file mode 100644 index 0000000..651e0b1 --- /dev/null +++ b/master/git-d1b054da8f599905f3c18a218961dcf17f9d5f13.patch @@ -0,0 +1,417 @@ +commit d1b054da8f599905f3c18a218961dcf17f9d5f13 +Author: Yu Zhao +Date: Fri Mar 20 11:25:11 2009 +0800 + + PCI: initialize and release SR-IOV capability + + If a device has the SR-IOV capability, initialize it (set the ARI + Capable Hierarchy in the lowest numbered PF if necessary; calculate + the System Page Size for the VF MMIO, probe the VF Offset, Stride + and BARs). A lock for the VF bus allocation is also initialized if + a PF is the lowest numbered PF. + + Reviewed-by: Matthew Wilcox + Signed-off-by: Yu Zhao + Signed-off-by: Jesse Barnes + +diff --git a/drivers/pci/Kconfig b/drivers/pci/Kconfig +--- a/drivers/pci/Kconfig ++++ b/drivers/pci/Kconfig +@@ -53,3 +53,13 @@ + This allows native hypertransport devices to use interrupts. + + If unsure say Y. ++ ++config PCI_IOV ++ bool "PCI IOV support" ++ depends on PCI ++ help ++ I/O Virtualization is a PCI feature supported by some devices ++ which allows them to create virtual devices which share their ++ physical resources. ++ ++ If unsure, say N. +diff --git a/drivers/pci/Makefile b/drivers/pci/Makefile +--- a/drivers/pci/Makefile ++++ b/drivers/pci/Makefile +@@ -29,6 +29,8 @@ + + obj-$(CONFIG_INTR_REMAP) += dmar.o intr_remapping.o + ++obj-$(CONFIG_PCI_IOV) += iov.o ++ + # + # Some architectures use the generic PCI setup functions + # +diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c +new file mode 100644 +--- /dev/null ++++ b/drivers/pci/iov.c +@@ -0,0 +1,182 @@ ++/* ++ * drivers/pci/iov.c ++ * ++ * Copyright (C) 2009 Intel Corporation, Yu Zhao ++ * ++ * PCI Express I/O Virtualization (IOV) support. ++ * Single Root IOV 1.0 ++ */ ++ ++#include ++#include ++#include ++#include ++#include "pci.h" ++ ++ ++static int sriov_init(struct pci_dev *dev, int pos) ++{ ++ int i; ++ int rc; ++ int nres; ++ u32 pgsz; ++ u16 ctrl, total, offset, stride; ++ struct pci_sriov *iov; ++ struct resource *res; ++ struct pci_dev *pdev; ++ ++ if (dev->pcie_type != PCI_EXP_TYPE_RC_END && ++ dev->pcie_type != PCI_EXP_TYPE_ENDPOINT) ++ return -ENODEV; ++ ++ pci_read_config_word(dev, pos + PCI_SRIOV_CTRL, &ctrl); ++ if (ctrl & PCI_SRIOV_CTRL_VFE) { ++ pci_write_config_word(dev, pos + PCI_SRIOV_CTRL, 0); ++ ssleep(1); ++ } ++ ++ pci_read_config_word(dev, pos + PCI_SRIOV_TOTAL_VF, &total); ++ if (!total) ++ return 0; ++ ++ ctrl = 0; ++ list_for_each_entry(pdev, &dev->bus->devices, bus_list) ++ if (pdev->is_physfn) ++ goto found; ++ ++ pdev = NULL; ++ if (pci_ari_enabled(dev->bus)) ++ ctrl |= PCI_SRIOV_CTRL_ARI; ++ ++found: ++ pci_write_config_word(dev, pos + PCI_SRIOV_CTRL, ctrl); ++ pci_write_config_word(dev, pos + PCI_SRIOV_NUM_VF, total); ++ pci_read_config_word(dev, pos + PCI_SRIOV_VF_OFFSET, &offset); ++ pci_read_config_word(dev, pos + PCI_SRIOV_VF_STRIDE, &stride); ++ if (!offset || (total > 1 && !stride)) ++ return -EIO; ++ ++ pci_read_config_dword(dev, pos + PCI_SRIOV_SUP_PGSIZE, &pgsz); ++ i = PAGE_SHIFT > 12 ? PAGE_SHIFT - 12 : 0; ++ pgsz &= ~((1 << i) - 1); ++ if (!pgsz) ++ return -EIO; ++ ++ pgsz &= ~(pgsz - 1); ++ pci_write_config_dword(dev, pos + PCI_SRIOV_SYS_PGSIZE, pgsz); ++ ++ nres = 0; ++ for (i = 0; i < PCI_SRIOV_NUM_BARS; i++) { ++ res = dev->resource + PCI_IOV_RESOURCES + i; ++ i += __pci_read_base(dev, pci_bar_unknown, res, ++ pos + PCI_SRIOV_BAR + i * 4); ++ if (!res->flags) ++ continue; ++ if (resource_size(res) & (PAGE_SIZE - 1)) { ++ rc = -EIO; ++ goto failed; ++ } ++ res->end = res->start + resource_size(res) * total - 1; ++ nres++; ++ } ++ ++ iov = kzalloc(sizeof(*iov), GFP_KERNEL); ++ if (!iov) { ++ rc = -ENOMEM; ++ goto failed; ++ } ++ ++ iov->pos = pos; ++ iov->nres = nres; ++ iov->ctrl = ctrl; ++ iov->total = total; ++ iov->offset = offset; ++ iov->stride = stride; ++ iov->pgsz = pgsz; ++ iov->self = dev; ++ pci_read_config_dword(dev, pos + PCI_SRIOV_CAP, &iov->cap); ++ pci_read_config_byte(dev, pos + PCI_SRIOV_FUNC_LINK, &iov->link); ++ ++ if (pdev) ++ iov->dev = pci_dev_get(pdev); ++ else { ++ iov->dev = dev; ++ mutex_init(&iov->lock); ++ } ++ ++ dev->sriov = iov; ++ dev->is_physfn = 1; ++ ++ return 0; ++ ++failed: ++ for (i = 0; i < PCI_SRIOV_NUM_BARS; i++) { ++ res = dev->resource + PCI_IOV_RESOURCES + i; ++ res->flags = 0; ++ } ++ ++ return rc; ++} ++ ++static void sriov_release(struct pci_dev *dev) ++{ ++ if (dev == dev->sriov->dev) ++ mutex_destroy(&dev->sriov->lock); ++ else ++ pci_dev_put(dev->sriov->dev); ++ ++ kfree(dev->sriov); ++ dev->sriov = NULL; ++} ++ ++/** ++ * pci_iov_init - initialize the IOV capability ++ * @dev: the PCI device ++ * ++ * Returns 0 on success, or negative on failure. ++ */ ++int pci_iov_init(struct pci_dev *dev) ++{ ++ int pos; ++ ++ if (!dev->is_pcie) ++ return -ENODEV; ++ ++ pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_SRIOV); ++ if (pos) ++ return sriov_init(dev, pos); ++ ++ return -ENODEV; ++} ++ ++/** ++ * pci_iov_release - release resources used by the IOV capability ++ * @dev: the PCI device ++ */ ++void pci_iov_release(struct pci_dev *dev) ++{ ++ if (dev->is_physfn) ++ sriov_release(dev); ++} ++ ++/** ++ * pci_iov_resource_bar - get position of the SR-IOV BAR ++ * @dev: the PCI device ++ * @resno: the resource number ++ * @type: the BAR type to be filled in ++ * ++ * Returns position of the BAR encapsulated in the SR-IOV capability. ++ */ ++int pci_iov_resource_bar(struct pci_dev *dev, int resno, ++ enum pci_bar_type *type) ++{ ++ if (resno < PCI_IOV_RESOURCES || resno > PCI_IOV_RESOURCE_END) ++ return 0; ++ ++ BUG_ON(!dev->is_physfn); ++ ++ *type = pci_bar_unknown; ++ ++ return dev->sriov->pos + PCI_SRIOV_BAR + ++ 4 * (resno - PCI_IOV_RESOURCES); ++} +diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c +--- a/drivers/pci/pci.c ++++ b/drivers/pci/pci.c +@@ -1929,12 +1929,19 @@ + */ + int pci_resource_bar(struct pci_dev *dev, int resno, enum pci_bar_type *type) + { ++ int reg; ++ + if (resno < PCI_ROM_RESOURCE) { + *type = pci_bar_unknown; + return PCI_BASE_ADDRESS_0 + 4 * resno; + } else if (resno == PCI_ROM_RESOURCE) { + *type = pci_bar_mem32; + return dev->rom_base_reg; ++ } else if (resno < PCI_BRIDGE_RESOURCES) { ++ /* device specific resource */ ++ reg = pci_iov_resource_bar(dev, resno, type); ++ if (reg) ++ return reg; + } + + dev_err(&dev->dev, "BAR: invalid resource #%d\n", resno); +diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h +--- a/drivers/pci/pci.h ++++ b/drivers/pci/pci.h +@@ -176,3 +176,40 @@ + #else + #define is_reassigndev(dev) 0 + #endif ++ ++/* Single Root I/O Virtualization */ ++struct pci_sriov { ++ int pos; /* capability position */ ++ int nres; /* number of resources */ ++ u32 cap; /* SR-IOV Capabilities */ ++ u16 ctrl; /* SR-IOV Control */ ++ u16 total; /* total VFs associated with the PF */ ++ u16 offset; /* first VF Routing ID offset */ ++ u16 stride; /* following VF stride */ ++ u32 pgsz; /* page size for BAR alignment */ ++ u8 link; /* Function Dependency Link */ ++ struct pci_dev *dev; /* lowest numbered PF */ ++ struct pci_dev *self; /* this PF */ ++ struct mutex lock; /* lock for VF bus */ ++}; ++ ++#ifdef CONFIG_PCI_IOV ++extern int pci_iov_init(struct pci_dev *dev); ++extern void pci_iov_release(struct pci_dev *dev); ++extern int pci_iov_resource_bar(struct pci_dev *dev, int resno, ++ enum pci_bar_type *type); ++#else ++static inline int pci_iov_init(struct pci_dev *dev) ++{ ++ return -ENODEV; ++} ++static inline void pci_iov_release(struct pci_dev *dev) ++ ++{ ++} ++static inline int pci_iov_resource_bar(struct pci_dev *dev, int resno, ++ enum pci_bar_type *type) ++{ ++ return 0; ++} ++#endif /* CONFIG_PCI_IOV */ +diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c +--- a/drivers/pci/probe.c ++++ b/drivers/pci/probe.c +@@ -851,6 +851,7 @@ + static void pci_release_capabilities(struct pci_dev *dev) + { + pci_vpd_release(dev); ++ pci_iov_release(dev); + } + + /** +@@ -1028,6 +1029,9 @@ + + /* Alternative Routing-ID Forwarding */ + pci_enable_ari(dev); ++ ++ /* Single Root I/O Virtualization */ ++ pci_iov_init(dev); + } + + void pci_device_add(struct pci_dev *dev, struct pci_bus *bus) +diff --git a/include/linux/pci.h b/include/linux/pci.h +--- a/include/linux/pci.h ++++ b/include/linux/pci.h +@@ -92,6 +92,12 @@ + /* #6: expansion ROM resource */ + PCI_ROM_RESOURCE, + ++ /* device specific resources */ ++#ifdef CONFIG_PCI_IOV ++ PCI_IOV_RESOURCES, ++ PCI_IOV_RESOURCE_END = PCI_IOV_RESOURCES + PCI_SRIOV_NUM_BARS - 1, ++#endif ++ + /* resources assigned to buses behind the bridge */ + #define PCI_BRIDGE_RESOURCE_NUM 4 + +@@ -175,6 +181,7 @@ + + struct pcie_link_state; + struct pci_vpd; ++struct pci_sriov; + + /* + * The pci_dev structure is used to describe PCI devices. +@@ -254,6 +261,7 @@ + unsigned int ari_enabled:1; /* ARI forwarding */ + unsigned int is_managed:1; + unsigned int is_pcie:1; ++ unsigned int is_physfn:1; + pci_dev_flags_t dev_flags; + atomic_t enable_cnt; /* pci_enable_device has been called */ + +@@ -267,6 +275,9 @@ + struct list_head msi_list; + #endif + struct pci_vpd *vpd; ++#ifdef CONFIG_PCI_IOV ++ struct pci_sriov *sriov; /* SR-IOV capability related */ ++#endif + }; + + extern struct pci_dev *alloc_pci_dev(void); +diff --git a/include/linux/pci_regs.h b/include/linux/pci_regs.h +--- a/include/linux/pci_regs.h ++++ b/include/linux/pci_regs.h +@@ -363,6 +363,7 @@ + #define PCI_EXP_TYPE_UPSTREAM 0x5 /* Upstream Port */ + #define PCI_EXP_TYPE_DOWNSTREAM 0x6 /* Downstream Port */ + #define PCI_EXP_TYPE_PCI_BRIDGE 0x7 /* PCI/PCI-X Bridge */ ++#define PCI_EXP_TYPE_RC_END 0x9 /* Root Complex Integrated Endpoint */ + #define PCI_EXP_FLAGS_SLOT 0x0100 /* Slot implemented */ + #define PCI_EXP_FLAGS_IRQ 0x3e00 /* Interrupt message number */ + #define PCI_EXP_DEVCAP 4 /* Device capabilities */ +@@ -434,6 +435,7 @@ + #define PCI_EXT_CAP_ID_DSN 3 + #define PCI_EXT_CAP_ID_PWR 4 + #define PCI_EXT_CAP_ID_ARI 14 ++#define PCI_EXT_CAP_ID_SRIOV 16 + + /* Advanced Error Reporting */ + #define PCI_ERR_UNCOR_STATUS 4 /* Uncorrectable Error Status */ +@@ -551,4 +553,35 @@ + #define PCI_ARI_CTRL_ACS 0x0002 /* ACS Function Groups Enable */ + #define PCI_ARI_CTRL_FG(x) (((x) >> 4) & 7) /* Function Group */ + ++/* Single Root I/O Virtualization */ ++#define PCI_SRIOV_CAP 0x04 /* SR-IOV Capabilities */ ++#define PCI_SRIOV_CAP_VFM 0x01 /* VF Migration Capable */ ++#define PCI_SRIOV_CAP_INTR(x) ((x) >> 21) /* Interrupt Message Number */ ++#define PCI_SRIOV_CTRL 0x08 /* SR-IOV Control */ ++#define PCI_SRIOV_CTRL_VFE 0x01 /* VF Enable */ ++#define PCI_SRIOV_CTRL_VFM 0x02 /* VF Migration Enable */ ++#define PCI_SRIOV_CTRL_INTR 0x04 /* VF Migration Interrupt Enable */ ++#define PCI_SRIOV_CTRL_MSE 0x08 /* VF Memory Space Enable */ ++#define PCI_SRIOV_CTRL_ARI 0x10 /* ARI Capable Hierarchy */ ++#define PCI_SRIOV_STATUS 0x0a /* SR-IOV Status */ ++#define PCI_SRIOV_STATUS_VFM 0x01 /* VF Migration Status */ ++#define PCI_SRIOV_INITIAL_VF 0x0c /* Initial VFs */ ++#define PCI_SRIOV_TOTAL_VF 0x0e /* Total VFs */ ++#define PCI_SRIOV_NUM_VF 0x10 /* Number of VFs */ ++#define PCI_SRIOV_FUNC_LINK 0x12 /* Function Dependency Link */ ++#define PCI_SRIOV_VF_OFFSET 0x14 /* First VF Offset */ ++#define PCI_SRIOV_VF_STRIDE 0x16 /* Following VF Stride */ ++#define PCI_SRIOV_VF_DID 0x1a /* VF Device ID */ ++#define PCI_SRIOV_SUP_PGSIZE 0x1c /* Supported Page Sizes */ ++#define PCI_SRIOV_SYS_PGSIZE 0x20 /* System Page Size */ ++#define PCI_SRIOV_BAR 0x24 /* VF BAR0 */ ++#define PCI_SRIOV_NUM_BARS 6 /* Number of VF BARs */ ++#define PCI_SRIOV_VFM 0x3c /* VF Migration State Array Offset*/ ++#define PCI_SRIOV_VFM_BIR(x) ((x) & 7) /* State BIR */ ++#define PCI_SRIOV_VFM_OFFSET(x) ((x) & ~7) /* State Offset */ ++#define PCI_SRIOV_VFM_UA 0x0 /* Inactive.Unavailable */ ++#define PCI_SRIOV_VFM_MI 0x1 /* Dormant.MigrateIn */ ++#define PCI_SRIOV_VFM_MO 0x2 /* Active.MigrateOut */ ++#define PCI_SRIOV_VFM_AV 0x3 /* Active.Available */ ++ + #endif /* LINUX_PCI_REGS_H */ diff --git a/master/git-d3a54014e2a94bd37b7dee5e76e03f7bc4fab49a.patch b/master/git-d3a54014e2a94bd37b7dee5e76e03f7bc4fab49a.patch new file mode 100644 index 0000000..80921d3 --- /dev/null +++ b/master/git-d3a54014e2a94bd37b7dee5e76e03f7bc4fab49a.patch @@ -0,0 +1,29 @@ +commit d3a54014e2a94bd37b7dee5e76e03f7bc4fab49a +Author: Benjamin Herrenschmidt +Date: Wed Nov 12 14:38:53 2008 +1100 + + PCI: Add legacy_io/mem to all busses + + Currently, only PHBs get the legacy_* files, which makes it tricky for + userland to get access to the legacy space. This commit exposes them in + every bus, since even child buses may forward legacy cycles if + configured properly. + + Signed-off-by: Benjamin Herrenschmidt + Signed-off-by: Jesse Barnes + +diff --git a/drivers/pci/bus.c b/drivers/pci/bus.c +index 999cc40..3e1c135 100644 +--- a/drivers/pci/bus.c ++++ b/drivers/pci/bus.c +@@ -158,6 +158,10 @@ void pci_bus_add_devices(struct pci_bus *bus) + dev_err(&dev->dev, + "Error creating cpulistaffinity" + " file, continuing...\n"); ++ ++ /* Create legacy_io and legacy_mem files for this bus */ ++ pci_create_legacy_files(child_bus); ++ + } + } + } diff --git a/master/git-dd7cc44d0bcec5e9c42fe52e88dc254ae62eac8d.patch b/master/git-dd7cc44d0bcec5e9c42fe52e88dc254ae62eac8d.patch new file mode 100644 index 0000000..4d473a7 --- /dev/null +++ b/master/git-dd7cc44d0bcec5e9c42fe52e88dc254ae62eac8d.patch @@ -0,0 +1,420 @@ +commit dd7cc44d0bcec5e9c42fe52e88dc254ae62eac8d +Author: Yu Zhao +Date: Fri Mar 20 11:25:15 2009 +0800 + + PCI: add SR-IOV API for Physical Function driver + + Add or remove the Virtual Function when the SR-IOV is enabled or + disabled by the device driver. This can happen anytime rather than + only at the device probe stage. + + Reviewed-by: Matthew Wilcox + Signed-off-by: Yu Zhao + Signed-off-by: Jesse Barnes + +diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c +index 5ddfc09..d0ff8ad 100644 +--- a/drivers/pci/iov.c ++++ b/drivers/pci/iov.c +@@ -13,6 +13,7 @@ + #include + #include "pci.h" + ++#define VIRTFN_ID_LEN 16 + + static inline u8 virtfn_bus(struct pci_dev *dev, int id) + { +@@ -26,6 +27,284 @@ static inline u8 virtfn_devfn(struct pci_dev *dev, int id) + dev->sriov->stride * id) & 0xff; + } + ++static struct pci_bus *virtfn_add_bus(struct pci_bus *bus, int busnr) ++{ ++ int rc; ++ struct pci_bus *child; ++ ++ if (bus->number == busnr) ++ return bus; ++ ++ child = pci_find_bus(pci_domain_nr(bus), busnr); ++ if (child) ++ return child; ++ ++ child = pci_add_new_bus(bus, NULL, busnr); ++ if (!child) ++ return NULL; ++ ++ child->subordinate = busnr; ++ child->dev.parent = bus->bridge; ++ rc = pci_bus_add_child(child); ++ if (rc) { ++ pci_remove_bus(child); ++ return NULL; ++ } ++ ++ return child; ++} ++ ++static void virtfn_remove_bus(struct pci_bus *bus, int busnr) ++{ ++ struct pci_bus *child; ++ ++ if (bus->number == busnr) ++ return; ++ ++ child = pci_find_bus(pci_domain_nr(bus), busnr); ++ BUG_ON(!child); ++ ++ if (list_empty(&child->devices)) ++ pci_remove_bus(child); ++} ++ ++static int virtfn_add(struct pci_dev *dev, int id, int reset) ++{ ++ int i; ++ int rc; ++ u64 size; ++ char buf[VIRTFN_ID_LEN]; ++ struct pci_dev *virtfn; ++ struct resource *res; ++ struct pci_sriov *iov = dev->sriov; ++ ++ virtfn = alloc_pci_dev(); ++ if (!virtfn) ++ return -ENOMEM; ++ ++ mutex_lock(&iov->dev->sriov->lock); ++ virtfn->bus = virtfn_add_bus(dev->bus, virtfn_bus(dev, id)); ++ if (!virtfn->bus) { ++ kfree(virtfn); ++ mutex_unlock(&iov->dev->sriov->lock); ++ return -ENOMEM; ++ } ++ virtfn->devfn = virtfn_devfn(dev, id); ++ virtfn->vendor = dev->vendor; ++ pci_read_config_word(dev, iov->pos + PCI_SRIOV_VF_DID, &virtfn->device); ++ pci_setup_device(virtfn); ++ virtfn->dev.parent = dev->dev.parent; ++ ++ for (i = 0; i < PCI_SRIOV_NUM_BARS; i++) { ++ res = dev->resource + PCI_IOV_RESOURCES + i; ++ if (!res->parent) ++ continue; ++ virtfn->resource[i].name = pci_name(virtfn); ++ virtfn->resource[i].flags = res->flags; ++ size = resource_size(res); ++ do_div(size, iov->total); ++ virtfn->resource[i].start = res->start + size * id; ++ virtfn->resource[i].end = virtfn->resource[i].start + size - 1; ++ rc = request_resource(res, &virtfn->resource[i]); ++ BUG_ON(rc); ++ } ++ ++ if (reset) ++ pci_execute_reset_function(virtfn); ++ ++ pci_device_add(virtfn, virtfn->bus); ++ mutex_unlock(&iov->dev->sriov->lock); ++ ++ virtfn->physfn = pci_dev_get(dev); ++ virtfn->is_virtfn = 1; ++ ++ rc = pci_bus_add_device(virtfn); ++ if (rc) ++ goto failed1; ++ sprintf(buf, "virtfn%u", id); ++ rc = sysfs_create_link(&dev->dev.kobj, &virtfn->dev.kobj, buf); ++ if (rc) ++ goto failed1; ++ rc = sysfs_create_link(&virtfn->dev.kobj, &dev->dev.kobj, "physfn"); ++ if (rc) ++ goto failed2; ++ ++ kobject_uevent(&virtfn->dev.kobj, KOBJ_CHANGE); ++ ++ return 0; ++ ++failed2: ++ sysfs_remove_link(&dev->dev.kobj, buf); ++failed1: ++ pci_dev_put(dev); ++ mutex_lock(&iov->dev->sriov->lock); ++ pci_remove_bus_device(virtfn); ++ virtfn_remove_bus(dev->bus, virtfn_bus(dev, id)); ++ mutex_unlock(&iov->dev->sriov->lock); ++ ++ return rc; ++} ++ ++static void virtfn_remove(struct pci_dev *dev, int id, int reset) ++{ ++ char buf[VIRTFN_ID_LEN]; ++ struct pci_bus *bus; ++ struct pci_dev *virtfn; ++ struct pci_sriov *iov = dev->sriov; ++ ++ bus = pci_find_bus(pci_domain_nr(dev->bus), virtfn_bus(dev, id)); ++ if (!bus) ++ return; ++ ++ virtfn = pci_get_slot(bus, virtfn_devfn(dev, id)); ++ if (!virtfn) ++ return; ++ ++ pci_dev_put(virtfn); ++ ++ if (reset) { ++ device_release_driver(&virtfn->dev); ++ pci_execute_reset_function(virtfn); ++ } ++ ++ sprintf(buf, "virtfn%u", id); ++ sysfs_remove_link(&dev->dev.kobj, buf); ++ sysfs_remove_link(&virtfn->dev.kobj, "physfn"); ++ ++ mutex_lock(&iov->dev->sriov->lock); ++ pci_remove_bus_device(virtfn); ++ virtfn_remove_bus(dev->bus, virtfn_bus(dev, id)); ++ mutex_unlock(&iov->dev->sriov->lock); ++ ++ pci_dev_put(dev); ++} ++ ++static int sriov_enable(struct pci_dev *dev, int nr_virtfn) ++{ ++ int rc; ++ int i, j; ++ int nres; ++ u16 offset, stride, initial; ++ struct resource *res; ++ struct pci_dev *pdev; ++ struct pci_sriov *iov = dev->sriov; ++ ++ if (!nr_virtfn) ++ return 0; ++ ++ if (iov->nr_virtfn) ++ return -EINVAL; ++ ++ pci_read_config_word(dev, iov->pos + PCI_SRIOV_INITIAL_VF, &initial); ++ if (initial > iov->total || ++ (!(iov->cap & PCI_SRIOV_CAP_VFM) && (initial != iov->total))) ++ return -EIO; ++ ++ if (nr_virtfn < 0 || nr_virtfn > iov->total || ++ (!(iov->cap & PCI_SRIOV_CAP_VFM) && (nr_virtfn > initial))) ++ return -EINVAL; ++ ++ pci_write_config_word(dev, iov->pos + PCI_SRIOV_NUM_VF, nr_virtfn); ++ pci_read_config_word(dev, iov->pos + PCI_SRIOV_VF_OFFSET, &offset); ++ pci_read_config_word(dev, iov->pos + PCI_SRIOV_VF_STRIDE, &stride); ++ if (!offset || (nr_virtfn > 1 && !stride)) ++ return -EIO; ++ ++ nres = 0; ++ for (i = 0; i < PCI_SRIOV_NUM_BARS; i++) { ++ res = dev->resource + PCI_IOV_RESOURCES + i; ++ if (res->parent) ++ nres++; ++ } ++ if (nres != iov->nres) { ++ dev_err(&dev->dev, "not enough MMIO resources for SR-IOV\n"); ++ return -ENOMEM; ++ } ++ ++ iov->offset = offset; ++ iov->stride = stride; ++ ++ if (virtfn_bus(dev, nr_virtfn - 1) > dev->bus->subordinate) { ++ dev_err(&dev->dev, "SR-IOV: bus number out of range\n"); ++ return -ENOMEM; ++ } ++ ++ if (iov->link != dev->devfn) { ++ pdev = pci_get_slot(dev->bus, iov->link); ++ if (!pdev) ++ return -ENODEV; ++ ++ pci_dev_put(pdev); ++ ++ if (!pdev->is_physfn) ++ return -ENODEV; ++ ++ rc = sysfs_create_link(&dev->dev.kobj, ++ &pdev->dev.kobj, "dep_link"); ++ if (rc) ++ return rc; ++ } ++ ++ iov->ctrl |= PCI_SRIOV_CTRL_VFE | PCI_SRIOV_CTRL_MSE; ++ pci_block_user_cfg_access(dev); ++ pci_write_config_word(dev, iov->pos + PCI_SRIOV_CTRL, iov->ctrl); ++ msleep(100); ++ pci_unblock_user_cfg_access(dev); ++ ++ iov->initial = initial; ++ if (nr_virtfn < initial) ++ initial = nr_virtfn; ++ ++ for (i = 0; i < initial; i++) { ++ rc = virtfn_add(dev, i, 0); ++ if (rc) ++ goto failed; ++ } ++ ++ kobject_uevent(&dev->dev.kobj, KOBJ_CHANGE); ++ iov->nr_virtfn = nr_virtfn; ++ ++ return 0; ++ ++failed: ++ for (j = 0; j < i; j++) ++ virtfn_remove(dev, j, 0); ++ ++ iov->ctrl &= ~(PCI_SRIOV_CTRL_VFE | PCI_SRIOV_CTRL_MSE); ++ pci_block_user_cfg_access(dev); ++ pci_write_config_word(dev, iov->pos + PCI_SRIOV_CTRL, iov->ctrl); ++ ssleep(1); ++ pci_unblock_user_cfg_access(dev); ++ ++ if (iov->link != dev->devfn) ++ sysfs_remove_link(&dev->dev.kobj, "dep_link"); ++ ++ return rc; ++} ++ ++static void sriov_disable(struct pci_dev *dev) ++{ ++ int i; ++ struct pci_sriov *iov = dev->sriov; ++ ++ if (!iov->nr_virtfn) ++ return; ++ ++ for (i = 0; i < iov->nr_virtfn; i++) ++ virtfn_remove(dev, i, 0); ++ ++ iov->ctrl &= ~(PCI_SRIOV_CTRL_VFE | PCI_SRIOV_CTRL_MSE); ++ pci_block_user_cfg_access(dev); ++ pci_write_config_word(dev, iov->pos + PCI_SRIOV_CTRL, iov->ctrl); ++ ssleep(1); ++ pci_unblock_user_cfg_access(dev); ++ ++ if (iov->link != dev->devfn) ++ sysfs_remove_link(&dev->dev.kobj, "dep_link"); ++ ++ iov->nr_virtfn = 0; ++} ++ + static int sriov_init(struct pci_dev *dev, int pos) + { + int i; +@@ -132,6 +411,8 @@ failed: + + static void sriov_release(struct pci_dev *dev) + { ++ BUG_ON(dev->sriov->nr_virtfn); ++ + if (dev == dev->sriov->dev) + mutex_destroy(&dev->sriov->lock); + else +@@ -155,6 +436,7 @@ static void sriov_restore_state(struct pci_dev *dev) + pci_update_resource(dev, i); + + pci_write_config_dword(dev, iov->pos + PCI_SRIOV_SYS_PGSIZE, iov->pgsz); ++ pci_write_config_word(dev, iov->pos + PCI_SRIOV_NUM_VF, iov->nr_virtfn); + pci_write_config_word(dev, iov->pos + PCI_SRIOV_CTRL, iov->ctrl); + if (iov->ctrl & PCI_SRIOV_CTRL_VFE) + msleep(100); +@@ -245,3 +527,35 @@ int pci_iov_bus_range(struct pci_bus *bus) + + return max ? max - bus->number : 0; + } ++ ++/** ++ * pci_enable_sriov - enable the SR-IOV capability ++ * @dev: the PCI device ++ * ++ * Returns 0 on success, or negative on failure. ++ */ ++int pci_enable_sriov(struct pci_dev *dev, int nr_virtfn) ++{ ++ might_sleep(); ++ ++ if (!dev->is_physfn) ++ return -ENODEV; ++ ++ return sriov_enable(dev, nr_virtfn); ++} ++EXPORT_SYMBOL_GPL(pci_enable_sriov); ++ ++/** ++ * pci_disable_sriov - disable the SR-IOV capability ++ * @dev: the PCI device ++ */ ++void pci_disable_sriov(struct pci_dev *dev) ++{ ++ might_sleep(); ++ ++ if (!dev->is_physfn) ++ return; ++ ++ sriov_disable(dev); ++} ++EXPORT_SYMBOL_GPL(pci_disable_sriov); +diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h +index f4fc10f..0f1c7d1 100644 +--- a/drivers/pci/pci.h ++++ b/drivers/pci/pci.h +@@ -209,6 +209,8 @@ struct pci_sriov { + u32 cap; /* SR-IOV Capabilities */ + u16 ctrl; /* SR-IOV Control */ + u16 total; /* total VFs associated with the PF */ ++ u16 initial; /* initial VFs associated with the PF */ ++ u16 nr_virtfn; /* number of VFs available */ + u16 offset; /* first VF Routing ID offset */ + u16 stride; /* following VF stride */ + u32 pgsz; /* page size for BAR alignment */ +diff --git a/include/linux/pci.h b/include/linux/pci.h +index 8ce2f2d..c2e491e 100644 +--- a/include/linux/pci.h ++++ b/include/linux/pci.h +@@ -265,6 +265,7 @@ struct pci_dev { + unsigned int is_pcie:1; + unsigned int state_saved:1; + unsigned int is_physfn:1; ++ unsigned int is_virtfn:1; + pci_dev_flags_t dev_flags; + atomic_t enable_cnt; /* pci_enable_device has been called */ + +@@ -279,7 +280,10 @@ struct pci_dev { + #endif + struct pci_vpd *vpd; + #ifdef CONFIG_PCI_IOV +- struct pci_sriov *sriov; /* SR-IOV capability related */ ++ union { ++ struct pci_sriov *sriov; /* SR-IOV capability related */ ++ struct pci_dev *physfn; /* the PF this VF is associated with */ ++ }; + #endif + }; + +@@ -1212,5 +1216,18 @@ int pci_ext_cfg_avail(struct pci_dev *dev); + + void __iomem *pci_ioremap_bar(struct pci_dev *pdev, int bar); + ++#ifdef CONFIG_PCI_IOV ++extern int pci_enable_sriov(struct pci_dev *dev, int nr_virtfn); ++extern void pci_disable_sriov(struct pci_dev *dev); ++#else ++static inline int pci_enable_sriov(struct pci_dev *dev, int nr_virtfn) ++{ ++ return -ENODEV; ++} ++static inline void pci_disable_sriov(struct pci_dev *dev) ++{ ++} ++#endif ++ + #endif /* __KERNEL__ */ + #endif /* LINUX_PCI_H */ diff --git a/master/git-f19aeb1f3638b7bb4ca21eb361f004fac2bfe259.patch b/master/git-f19aeb1f3638b7bb4ca21eb361f004fac2bfe259.patch new file mode 100644 index 0000000..4c73a1a --- /dev/null +++ b/master/git-f19aeb1f3638b7bb4ca21eb361f004fac2bfe259.patch @@ -0,0 +1,287 @@ +commit f19aeb1f3638b7bb4ca21eb361f004fac2bfe259 +Author: Benjamin Herrenschmidt +Date: Fri Oct 3 19:49:32 2008 +1000 + + PCI: Add ability to mmap legacy_io on some platforms + + This adds the ability to mmap legacy IO space to the legacy_io files + in sysfs on platforms that support it. This will allow to clean up + X to use this instead of /dev/mem for legacy IO accesses such as + those performed by Int10. + + While at it I moved pci_create/remove_legacy_files() to pci-sysfs.c + where I think they belong, thus making more things statis in there + and cleaned up some spurrious prototypes in the ia64 pci.h file + + Signed-off-by: Benjamin Herrenschmidt + Signed-off-by: Jesse Barnes + +diff --git a/arch/ia64/include/asm/pci.h b/arch/ia64/include/asm/pci.h +index 0149097..ce342fb 100644 +--- a/arch/ia64/include/asm/pci.h ++++ b/arch/ia64/include/asm/pci.h +@@ -95,16 +95,8 @@ extern int pci_mmap_page_range (struct pci_dev *dev, struct vm_area_struct *vma, + enum pci_mmap_state mmap_state, int write_combine); + #define HAVE_PCI_LEGACY + extern int pci_mmap_legacy_page_range(struct pci_bus *bus, +- struct vm_area_struct *vma); +-extern ssize_t pci_read_legacy_io(struct kobject *kobj, +- struct bin_attribute *bin_attr, +- char *buf, loff_t off, size_t count); +-extern ssize_t pci_write_legacy_io(struct kobject *kobj, +- struct bin_attribute *bin_attr, +- char *buf, loff_t off, size_t count); +-extern int pci_mmap_legacy_mem(struct kobject *kobj, +- struct bin_attribute *attr, +- struct vm_area_struct *vma); ++ struct vm_area_struct *vma, ++ enum pci_mmap_state mmap_state); + + #define pci_get_legacy_mem platform_pci_get_legacy_mem + #define pci_legacy_read platform_pci_legacy_read +diff --git a/arch/ia64/pci/pci.c b/arch/ia64/pci/pci.c +index 7545037..211fcfd 100644 +--- a/arch/ia64/pci/pci.c ++++ b/arch/ia64/pci/pci.c +@@ -614,12 +614,17 @@ char *ia64_pci_get_legacy_mem(struct pci_bus *bus) + * vector to get the base address. + */ + int +-pci_mmap_legacy_page_range(struct pci_bus *bus, struct vm_area_struct *vma) ++pci_mmap_legacy_page_range(struct pci_bus *bus, struct vm_area_struct *vma, ++ enum pci_mmap_state mmap_state) + { + unsigned long size = vma->vm_end - vma->vm_start; + pgprot_t prot; + char *addr; + ++ /* We only support mmap'ing of legacy memory space */ ++ if (mmap_state != pci_mmap_mem) ++ return -ENOSYS; ++ + /* + * Avoid attribute aliasing. See Documentation/ia64/aliasing.txt + * for more details. +diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c +index 2cad6da..110022d 100644 +--- a/drivers/pci/pci-sysfs.c ++++ b/drivers/pci/pci-sysfs.c +@@ -423,7 +423,7 @@ pci_write_vpd(struct kobject *kobj, struct bin_attribute *bin_attr, + * Reads 1, 2, or 4 bytes from legacy I/O port space using an arch specific + * callback routine (pci_legacy_read). + */ +-ssize_t ++static ssize_t + pci_read_legacy_io(struct kobject *kobj, struct bin_attribute *bin_attr, + char *buf, loff_t off, size_t count) + { +@@ -448,7 +448,7 @@ pci_read_legacy_io(struct kobject *kobj, struct bin_attribute *bin_attr, + * Writes 1, 2, or 4 bytes from legacy I/O port space using an arch specific + * callback routine (pci_legacy_write). + */ +-ssize_t ++static ssize_t + pci_write_legacy_io(struct kobject *kobj, struct bin_attribute *bin_attr, + char *buf, loff_t off, size_t count) + { +@@ -468,11 +468,11 @@ pci_write_legacy_io(struct kobject *kobj, struct bin_attribute *bin_attr, + * @attr: struct bin_attribute for this file + * @vma: struct vm_area_struct passed to mmap + * +- * Uses an arch specific callback, pci_mmap_legacy_page_range, to mmap ++ * Uses an arch specific callback, pci_mmap_legacy_mem_page_range, to mmap + * legacy memory space (first meg of bus space) into application virtual + * memory space. + */ +-int ++static int + pci_mmap_legacy_mem(struct kobject *kobj, struct bin_attribute *attr, + struct vm_area_struct *vma) + { +@@ -480,7 +480,90 @@ pci_mmap_legacy_mem(struct kobject *kobj, struct bin_attribute *attr, + struct device, + kobj)); + +- return pci_mmap_legacy_page_range(bus, vma); ++ return pci_mmap_legacy_page_range(bus, vma, pci_mmap_mem); ++} ++ ++/** ++ * pci_mmap_legacy_io - map legacy PCI IO into user memory space ++ * @kobj: kobject corresponding to device to be mapped ++ * @attr: struct bin_attribute for this file ++ * @vma: struct vm_area_struct passed to mmap ++ * ++ * Uses an arch specific callback, pci_mmap_legacy_io_page_range, to mmap ++ * legacy IO space (first meg of bus space) into application virtual ++ * memory space. Returns -ENOSYS if the operation isn't supported ++ */ ++static int ++pci_mmap_legacy_io(struct kobject *kobj, struct bin_attribute *attr, ++ struct vm_area_struct *vma) ++{ ++ struct pci_bus *bus = to_pci_bus(container_of(kobj, ++ struct device, ++ kobj)); ++ ++ return pci_mmap_legacy_page_range(bus, vma, pci_mmap_io); ++} ++ ++/** ++ * pci_create_legacy_files - create legacy I/O port and memory files ++ * @b: bus to create files under ++ * ++ * Some platforms allow access to legacy I/O port and ISA memory space on ++ * a per-bus basis. This routine creates the files and ties them into ++ * their associated read, write and mmap files from pci-sysfs.c ++ * ++ * On error unwind, but don't propogate the error to the caller ++ * as it is ok to set up the PCI bus without these files. ++ */ ++void pci_create_legacy_files(struct pci_bus *b) ++{ ++ int error; ++ ++ b->legacy_io = kzalloc(sizeof(struct bin_attribute) * 2, ++ GFP_ATOMIC); ++ if (!b->legacy_io) ++ goto kzalloc_err; ++ ++ b->legacy_io->attr.name = "legacy_io"; ++ b->legacy_io->size = 0xffff; ++ b->legacy_io->attr.mode = S_IRUSR | S_IWUSR; ++ b->legacy_io->read = pci_read_legacy_io; ++ b->legacy_io->write = pci_write_legacy_io; ++ b->legacy_io->mmap = pci_mmap_legacy_io; ++ error = device_create_bin_file(&b->dev, b->legacy_io); ++ if (error) ++ goto legacy_io_err; ++ ++ /* Allocated above after the legacy_io struct */ ++ b->legacy_mem = b->legacy_io + 1; ++ b->legacy_mem->attr.name = "legacy_mem"; ++ b->legacy_mem->size = 1024*1024; ++ b->legacy_mem->attr.mode = S_IRUSR | S_IWUSR; ++ b->legacy_mem->mmap = pci_mmap_legacy_mem; ++ error = device_create_bin_file(&b->dev, b->legacy_mem); ++ if (error) ++ goto legacy_mem_err; ++ ++ return; ++ ++legacy_mem_err: ++ device_remove_bin_file(&b->dev, b->legacy_io); ++legacy_io_err: ++ kfree(b->legacy_io); ++ b->legacy_io = NULL; ++kzalloc_err: ++ printk(KERN_WARNING "pci: warning: could not create legacy I/O port " ++ "and ISA memory resources to sysfs\n"); ++ return; ++} ++ ++void pci_remove_legacy_files(struct pci_bus *b) ++{ ++ if (b->legacy_io) { ++ device_remove_bin_file(&b->dev, b->legacy_io); ++ device_remove_bin_file(&b->dev, b->legacy_mem); ++ kfree(b->legacy_io); /* both are allocated here */ ++ } + } + #endif /* HAVE_PCI_LEGACY */ + +diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h +index 39684c1..b205ab8 100644 +--- a/drivers/pci/pci.h ++++ b/drivers/pci/pci.h +@@ -82,7 +82,13 @@ static inline int pci_proc_detach_bus(struct pci_bus *bus) { return 0; } + /* Functions for PCI Hotplug drivers to use */ + extern unsigned int pci_do_scan_bus(struct pci_bus *bus); + ++#ifdef HAVE_PCI_LEGACY ++extern void pci_create_legacy_files(struct pci_bus *bus); + extern void pci_remove_legacy_files(struct pci_bus *bus); ++#else ++static inline void pci_create_legacy_files(struct pci_bus *bus) { return; } ++static inline void pci_remove_legacy_files(struct pci_bus *bus) { return; } ++#endif + + /* Lock for read/write access to pci device and bus lists */ + extern struct rw_semaphore pci_bus_sem; +diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c +index afb9f1c..aaaf0a1 100644 +--- a/drivers/pci/probe.c ++++ b/drivers/pci/probe.c +@@ -42,72 +42,6 @@ int no_pci_devices(void) + } + EXPORT_SYMBOL(no_pci_devices); + +-#ifdef HAVE_PCI_LEGACY +-/** +- * pci_create_legacy_files - create legacy I/O port and memory files +- * @b: bus to create files under +- * +- * Some platforms allow access to legacy I/O port and ISA memory space on +- * a per-bus basis. This routine creates the files and ties them into +- * their associated read, write and mmap files from pci-sysfs.c +- * +- * On error unwind, but don't propogate the error to the caller +- * as it is ok to set up the PCI bus without these files. +- */ +-static void pci_create_legacy_files(struct pci_bus *b) +-{ +- int error; +- +- b->legacy_io = kzalloc(sizeof(struct bin_attribute) * 2, +- GFP_ATOMIC); +- if (!b->legacy_io) +- goto kzalloc_err; +- +- b->legacy_io->attr.name = "legacy_io"; +- b->legacy_io->size = 0xffff; +- b->legacy_io->attr.mode = S_IRUSR | S_IWUSR; +- b->legacy_io->read = pci_read_legacy_io; +- b->legacy_io->write = pci_write_legacy_io; +- error = device_create_bin_file(&b->dev, b->legacy_io); +- if (error) +- goto legacy_io_err; +- +- /* Allocated above after the legacy_io struct */ +- b->legacy_mem = b->legacy_io + 1; +- b->legacy_mem->attr.name = "legacy_mem"; +- b->legacy_mem->size = 1024*1024; +- b->legacy_mem->attr.mode = S_IRUSR | S_IWUSR; +- b->legacy_mem->mmap = pci_mmap_legacy_mem; +- error = device_create_bin_file(&b->dev, b->legacy_mem); +- if (error) +- goto legacy_mem_err; +- +- return; +- +-legacy_mem_err: +- device_remove_bin_file(&b->dev, b->legacy_io); +-legacy_io_err: +- kfree(b->legacy_io); +- b->legacy_io = NULL; +-kzalloc_err: +- printk(KERN_WARNING "pci: warning: could not create legacy I/O port " +- "and ISA memory resources to sysfs\n"); +- return; +-} +- +-void pci_remove_legacy_files(struct pci_bus *b) +-{ +- if (b->legacy_io) { +- device_remove_bin_file(&b->dev, b->legacy_io); +- device_remove_bin_file(&b->dev, b->legacy_mem); +- kfree(b->legacy_io); /* both are allocated here */ +- } +-} +-#else /* !HAVE_PCI_LEGACY */ +-static inline void pci_create_legacy_files(struct pci_bus *bus) { return; } +-void pci_remove_legacy_files(struct pci_bus *bus) { return; } +-#endif /* HAVE_PCI_LEGACY */ +- + /* + * PCI Bus Class Devices + */ diff --git a/master/git-f79b1b146b52765ee38bfb91bb14eb850fa98017.patch b/master/git-f79b1b146b52765ee38bfb91bb14eb850fa98017.patch new file mode 100644 index 0000000..5067d6e --- /dev/null +++ b/master/git-f79b1b146b52765ee38bfb91bb14eb850fa98017.patch @@ -0,0 +1,29 @@ +commit f79b1b146b52765ee38bfb91bb14eb850fa98017 +Author: Yu Zhao +Date: Thu May 28 00:25:05 2009 +0800 + + PCI: use fixed-up device class when configuring device + + The device class may be changed after the fixup, so re-read the class + value from pci_dev when configuring the device. Otherwise some devices + such as JMicron SATA controller won't work. + + Reviewed-by: Matthew Wilcox + Reviewed-by: Grant Grundler + Tested-by: Marc Dionne + Signed-off-by: Yu Zhao + Signed-off-by: Jesse Barnes + +diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c +index e3c3e08..f1ae247 100644 +--- a/drivers/pci/probe.c ++++ b/drivers/pci/probe.c +@@ -745,6 +745,8 @@ int pci_setup_device(struct pci_dev *dev) + + /* Early fixups, before probing the BARs */ + pci_fixup_device(pci_fixup_early, dev); ++ /* device class may be changed after fixup */ ++ class = dev->class >> 8; + + switch (dev->hdr_type) { /* header type */ + case PCI_HEADER_TYPE_NORMAL: /* standard header */ diff --git a/master/git-fde09c6d8f92de0c9f75698a75f0989f2234c517.patch b/master/git-fde09c6d8f92de0c9f75698a75f0989f2234c517.patch new file mode 100644 index 0000000..6be5147 --- /dev/null +++ b/master/git-fde09c6d8f92de0c9f75698a75f0989f2234c517.patch @@ -0,0 +1,125 @@ +commit fde09c6d8f92de0c9f75698a75f0989f2234c517 +Author: Yu Zhao +Date: Sat Nov 22 02:39:32 2008 +0800 + + PCI: define PCI resource names in an 'enum' + + This patch moves all definitions of the PCI resource names to an 'enum', + and also replaces some hard-coded resource variables with symbol + names. This change eases introduction of device specific resources. + + Reviewed-by: Bjorn Helgaas + Signed-off-by: Yu Zhao + Signed-off-by: Jesse Barnes + +diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c +index d2f1354..ea54ced 100644 +--- a/drivers/pci/pci-sysfs.c ++++ b/drivers/pci/pci-sysfs.c +@@ -102,11 +102,13 @@ resource_show(struct device * dev, struct device_attribute *attr, char * buf) + struct pci_dev * pci_dev = to_pci_dev(dev); + char * str = buf; + int i; +- int max = 7; ++ int max; + resource_size_t start, end; + + if (pci_dev->subordinate) + max = DEVICE_COUNT_RESOURCE; ++ else ++ max = PCI_BRIDGE_RESOURCES; + + for (i = 0; i < max; i++) { + struct resource *res = &pci_dev->resource[i]; +diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c +index 5dcf2b6..e1cf5d5 100644 +--- a/drivers/pci/probe.c ++++ b/drivers/pci/probe.c +@@ -423,7 +423,7 @@ static struct pci_bus *pci_alloc_child_bus(struct pci_bus *parent, + child->subordinate = 0xff; + + /* Set up default resource pointers and names.. */ +- for (i = 0; i < 4; i++) { ++ for (i = 0; i < PCI_BRIDGE_RESOURCE_NUM; i++) { + child->resource[i] = &bridge->resource[PCI_BRIDGE_RESOURCES+i]; + child->resource[i]->name = child->name; + } +diff --git a/drivers/pci/proc.c b/drivers/pci/proc.c +index 7fb086d..593bb84 100644 +--- a/drivers/pci/proc.c ++++ b/drivers/pci/proc.c +@@ -361,15 +361,16 @@ static int show_device(struct seq_file *m, void *v) + dev->vendor, + dev->device, + dev->irq); +- /* Here should be 7 and not PCI_NUM_RESOURCES as we need to preserve compatibility */ +- for (i=0; i<7; i++) { ++ ++ /* only print standard and ROM resources to preserve compatibility */ ++ for (i = 0; i <= PCI_ROM_RESOURCE; i++) { + resource_size_t start, end; + pci_resource_to_user(dev, i, &dev->resource[i], &start, &end); + seq_printf(m, "\t%16llx", + (unsigned long long)(start | + (dev->resource[i].flags & PCI_REGION_FLAG_MASK))); + } +- for (i=0; i<7; i++) { ++ for (i = 0; i <= PCI_ROM_RESOURCE; i++) { + resource_size_t start, end; + pci_resource_to_user(dev, i, &dev->resource[i], &start, &end); + seq_printf(m, "\t%16llx", +diff --git a/include/linux/pci.h b/include/linux/pci.h +index c5e02f3..da1c22b 100644 +--- a/include/linux/pci.h ++++ b/include/linux/pci.h +@@ -82,7 +82,30 @@ enum pci_mmap_state { + #define PCI_DMA_FROMDEVICE 2 + #define PCI_DMA_NONE 3 + +-#define DEVICE_COUNT_RESOURCE 12 ++/* ++ * For PCI devices, the region numbers are assigned this way: ++ */ ++enum { ++ /* #0-5: standard PCI resources */ ++ PCI_STD_RESOURCES, ++ PCI_STD_RESOURCE_END = 5, ++ ++ /* #6: expansion ROM resource */ ++ PCI_ROM_RESOURCE, ++ ++ /* resources assigned to buses behind the bridge */ ++#define PCI_BRIDGE_RESOURCE_NUM 4 ++ ++ PCI_BRIDGE_RESOURCES, ++ PCI_BRIDGE_RESOURCE_END = PCI_BRIDGE_RESOURCES + ++ PCI_BRIDGE_RESOURCE_NUM - 1, ++ ++ /* total resources associated with a PCI device */ ++ PCI_NUM_RESOURCES, ++ ++ /* preserve this for compatibility */ ++ DEVICE_COUNT_RESOURCE ++}; + + typedef int __bitwise pci_power_t; + +@@ -274,18 +297,6 @@ static inline void pci_add_saved_cap(struct pci_dev *pci_dev, + hlist_add_head(&new_cap->next, &pci_dev->saved_cap_space); + } + +-/* +- * For PCI devices, the region numbers are assigned this way: +- * +- * 0-5 standard PCI regions +- * 6 expansion ROM +- * 7-10 bridges: address space assigned to buses behind the bridge +- */ +- +-#define PCI_ROM_RESOURCE 6 +-#define PCI_BRIDGE_RESOURCES 7 +-#define PCI_NUM_RESOURCES 11 +- + #ifndef PCI_BUS_NUM_RESOURCES + #define PCI_BUS_NUM_RESOURCES 16 + #endif diff --git a/master/igb-1.3.19.3.patch b/master/igb-1.3.19.3.patch new file mode 100644 index 0000000..39b932c --- /dev/null +++ b/master/igb-1.3.19.3.patch @@ -0,0 +1,23148 @@ +diff -r f5806398a14e drivers/net/igb/Makefile +--- a/drivers/net/igb/Makefile Mon Jun 15 11:45:45 2009 +0100 ++++ b/drivers/net/igb/Makefile Mon Jun 15 11:59:49 2009 +0100 +@@ -1,6 +1,6 @@ + ################################################################################ + # +-# Intel 82575 PCI-Express Ethernet Linux driver ++# Intel PRO/1000 Linux driver + # Copyright(c) 1999 - 2007 Intel Corporation. + # + # This program is free software; you can redistribute it and/or modify it +@@ -27,11 +27,16 @@ + ################################################################################ + + # +-# Makefile for the Intel(R) 82575 PCI-Express ethernet driver ++# Makefile for the Intel(R) PRO/1000 ethernet driver + # + + obj-$(CONFIG_IGB) += igb.o + +-igb-objs := igb_main.o igb_ethtool.o e1000_82575.o \ +- e1000_mac.o e1000_nvm.o e1000_phy.o ++FAMILYC = e1000_82575.c + ++CFILES = igb_main.c $(FAMILYC) e1000_mac.c e1000_nvm.c e1000_phy.c \ ++ e1000_manage.c igb_param.c igb_ethtool.c kcompat.c e1000_api.c ++ ++igb-objs := $(CFILES:.c=.o) ++ ++EXTRA_CFLAGS += -DDRIVER_IGB +diff -r f5806398a14e drivers/net/igb/e1000_82575.c +--- a/drivers/net/igb/e1000_82575.c Mon Jun 15 11:45:45 2009 +0100 ++++ b/drivers/net/igb/e1000_82575.c Mon Jun 15 11:59:49 2009 +0100 +@@ -1,7 +1,7 @@ + /******************************************************************************* + + Intel(R) Gigabit Ethernet Linux driver +- Copyright(c) 2007 - 2008 Intel Corporation. ++ Copyright(c) 2007-2009 Intel Corporation. + + This program is free software; you can redistribute it and/or modify it + under the terms and conditions of the GNU General Public License, +@@ -25,131 +25,136 @@ + + *******************************************************************************/ + +-/* e1000_82575 +- * e1000_82576 ++/* ++ * 82575EB Gigabit Network Connection ++ * 82575EB Gigabit Backplane Connection ++ * 82575GB Gigabit Network Connection ++ * 82576 Gigabit Network Connection + */ + +-#include +-#include +-#include ++#include "e1000_api.h" + +-#include "e1000_mac.h" +-#include "e1000_82575.h" ++static s32 e1000_init_phy_params_82575(struct e1000_hw *hw); ++static s32 e1000_init_nvm_params_82575(struct e1000_hw *hw); ++static s32 e1000_init_mac_params_82575(struct e1000_hw *hw); ++static s32 e1000_acquire_phy_82575(struct e1000_hw *hw); ++static void e1000_release_phy_82575(struct e1000_hw *hw); ++static s32 e1000_acquire_nvm_82575(struct e1000_hw *hw); ++static void e1000_release_nvm_82575(struct e1000_hw *hw); ++static s32 e1000_check_for_link_82575(struct e1000_hw *hw); ++static s32 e1000_get_cfg_done_82575(struct e1000_hw *hw); ++static s32 e1000_get_link_up_info_82575(struct e1000_hw *hw, u16 *speed, ++ u16 *duplex); ++static s32 e1000_init_hw_82575(struct e1000_hw *hw); ++static s32 e1000_phy_hw_reset_sgmii_82575(struct e1000_hw *hw); ++static s32 e1000_read_phy_reg_sgmii_82575(struct e1000_hw *hw, u32 offset, ++ u16 *data); ++static s32 e1000_reset_hw_82575(struct e1000_hw *hw); ++static s32 e1000_set_d0_lplu_state_82575(struct e1000_hw *hw, ++ bool active); ++static s32 e1000_setup_copper_link_82575(struct e1000_hw *hw); ++static s32 e1000_setup_fiber_serdes_link_82575(struct e1000_hw *hw); ++static s32 e1000_valid_led_default_82575(struct e1000_hw *hw, u16 *data); ++static s32 e1000_write_phy_reg_sgmii_82575(struct e1000_hw *hw, ++ u32 offset, u16 data); ++static void e1000_clear_hw_cntrs_82575(struct e1000_hw *hw); ++static s32 e1000_acquire_swfw_sync_82575(struct e1000_hw *hw, u16 mask); ++static s32 e1000_configure_pcs_link_82575(struct e1000_hw *hw); ++static s32 e1000_get_pcs_speed_and_duplex_82575(struct e1000_hw *hw, ++ u16 *speed, u16 *duplex); ++static s32 e1000_get_phy_id_82575(struct e1000_hw *hw); ++static void e1000_release_swfw_sync_82575(struct e1000_hw *hw, u16 mask); ++static bool e1000_sgmii_active_82575(struct e1000_hw *hw); ++static s32 e1000_reset_init_script_82575(struct e1000_hw *hw); ++static s32 e1000_read_mac_addr_82575(struct e1000_hw *hw); ++static void e1000_power_down_phy_copper_82575(struct e1000_hw *hw); + +-static s32 igb_get_invariants_82575(struct e1000_hw *); +-static s32 igb_acquire_phy_82575(struct e1000_hw *); +-static void igb_release_phy_82575(struct e1000_hw *); +-static s32 igb_acquire_nvm_82575(struct e1000_hw *); +-static void igb_release_nvm_82575(struct e1000_hw *); +-static s32 igb_check_for_link_82575(struct e1000_hw *); +-static s32 igb_get_cfg_done_82575(struct e1000_hw *); +-static s32 igb_init_hw_82575(struct e1000_hw *); +-static s32 igb_phy_hw_reset_sgmii_82575(struct e1000_hw *); +-static s32 igb_read_phy_reg_sgmii_82575(struct e1000_hw *, u32, u16 *); +-static s32 igb_reset_hw_82575(struct e1000_hw *); +-static s32 igb_set_d0_lplu_state_82575(struct e1000_hw *, bool); +-static s32 igb_setup_copper_link_82575(struct e1000_hw *); +-static s32 igb_setup_fiber_serdes_link_82575(struct e1000_hw *); +-static s32 igb_write_phy_reg_sgmii_82575(struct e1000_hw *, u32, u16); +-static void igb_clear_hw_cntrs_82575(struct e1000_hw *); +-static s32 igb_acquire_swfw_sync_82575(struct e1000_hw *, u16); +-static s32 igb_configure_pcs_link_82575(struct e1000_hw *); +-static s32 igb_get_pcs_speed_and_duplex_82575(struct e1000_hw *, u16 *, +- u16 *); +-static s32 igb_get_phy_id_82575(struct e1000_hw *); +-static void igb_release_swfw_sync_82575(struct e1000_hw *, u16); +-static bool igb_sgmii_active_82575(struct e1000_hw *); +-static s32 igb_reset_init_script_82575(struct e1000_hw *); +-static s32 igb_read_mac_addr_82575(struct e1000_hw *); ++static void e1000_init_rx_addrs_82575(struct e1000_hw *hw, u16 rar_count); ++static void e1000_update_mc_addr_list_82575(struct e1000_hw *hw, ++ u8 *mc_addr_list, u32 mc_addr_count, ++ u32 rar_used_count, u32 rar_count); ++void e1000_shutdown_fiber_serdes_link_82575(struct e1000_hw *hw); + +- +-struct e1000_dev_spec_82575 { +- bool sgmii_active; +-}; +- +-static s32 igb_get_invariants_82575(struct e1000_hw *hw) ++/** ++ * e1000_init_phy_params_82575 - Init PHY func ptrs. ++ * @hw: pointer to the HW structure ++ **/ ++static s32 e1000_init_phy_params_82575(struct e1000_hw *hw) + { + struct e1000_phy_info *phy = &hw->phy; +- struct e1000_nvm_info *nvm = &hw->nvm; +- struct e1000_mac_info *mac = &hw->mac; +- struct e1000_dev_spec_82575 *dev_spec; +- u32 eecd; +- s32 ret_val; +- u16 size; +- u32 ctrl_ext = 0; ++ s32 ret_val = E1000_SUCCESS; + +- switch (hw->device_id) { +- case E1000_DEV_ID_82575EB_COPPER: +- case E1000_DEV_ID_82575EB_FIBER_SERDES: +- case E1000_DEV_ID_82575GB_QUAD_COPPER: +- mac->type = e1000_82575; ++ DEBUGFUNC("e1000_init_phy_params_82575"); ++ ++ if (hw->phy.media_type != e1000_media_type_copper) { ++ phy->type = e1000_phy_none; ++ goto out; ++ } else { ++ phy->ops.power_up = e1000_power_up_phy_copper; ++ phy->ops.power_down = e1000_power_down_phy_copper_82575; ++ } ++ ++ phy->autoneg_mask = AUTONEG_ADVERTISE_SPEED_DEFAULT; ++ phy->reset_delay_us = 100; ++ ++ phy->ops.acquire = e1000_acquire_phy_82575; ++ phy->ops.check_reset_block = e1000_check_reset_block_generic; ++ phy->ops.commit = e1000_phy_sw_reset_generic; ++ phy->ops.get_cfg_done = e1000_get_cfg_done_82575; ++ phy->ops.release = e1000_release_phy_82575; ++ ++ if (e1000_sgmii_active_82575(hw)) { ++ phy->ops.reset = e1000_phy_hw_reset_sgmii_82575; ++ phy->ops.read_reg = e1000_read_phy_reg_sgmii_82575; ++ phy->ops.write_reg = e1000_write_phy_reg_sgmii_82575; ++ } else { ++ phy->ops.reset = e1000_phy_hw_reset_generic; ++ phy->ops.read_reg = e1000_read_phy_reg_igp; ++ phy->ops.write_reg = e1000_write_phy_reg_igp; ++ } ++ ++ /* Set phy->phy_addr and phy->id. */ ++ ret_val = e1000_get_phy_id_82575(hw); ++ ++ /* Verify phy id and set remaining function pointers */ ++ switch (phy->id) { ++ case M88E1111_I_PHY_ID: ++ phy->type = e1000_phy_m88; ++ phy->ops.check_polarity = e1000_check_polarity_m88; ++ phy->ops.get_info = e1000_get_phy_info_m88; ++ phy->ops.get_cable_length = e1000_get_cable_length_m88; ++ phy->ops.force_speed_duplex = e1000_phy_force_speed_duplex_m88; + break; +- case E1000_DEV_ID_82576: +- case E1000_DEV_ID_82576_FIBER: +- case E1000_DEV_ID_82576_SERDES: +- mac->type = e1000_82576; ++ case IGP03E1000_E_PHY_ID: ++ case IGP04E1000_E_PHY_ID: ++ phy->type = e1000_phy_igp_3; ++ phy->ops.check_polarity = e1000_check_polarity_igp; ++ phy->ops.get_info = e1000_get_phy_info_igp; ++ phy->ops.get_cable_length = e1000_get_cable_length_igp_2; ++ phy->ops.force_speed_duplex = e1000_phy_force_speed_duplex_igp; ++ phy->ops.set_d0_lplu_state = e1000_set_d0_lplu_state_82575; ++ phy->ops.set_d3_lplu_state = e1000_set_d3_lplu_state_generic; + break; + default: +- return -E1000_ERR_MAC_INIT; +- break; ++ ret_val = -E1000_ERR_PHY; ++ goto out; + } + +- /* MAC initialization */ +- hw->dev_spec_size = sizeof(struct e1000_dev_spec_82575); ++out: ++ return ret_val; ++} + +- /* Device-specific structure allocation */ +- hw->dev_spec = kzalloc(hw->dev_spec_size, GFP_KERNEL); ++/** ++ * e1000_init_nvm_params_82575 - Init NVM func ptrs. ++ * @hw: pointer to the HW structure ++ **/ ++static s32 e1000_init_nvm_params_82575(struct e1000_hw *hw) ++{ ++ struct e1000_nvm_info *nvm = &hw->nvm; ++ u32 eecd = E1000_READ_REG(hw, E1000_EECD); ++ u16 size; + +- if (!hw->dev_spec) +- return -ENOMEM; +- +- dev_spec = (struct e1000_dev_spec_82575 *)hw->dev_spec; +- +- /* Set media type */ +- /* +- * The 82575 uses bits 22:23 for link mode. The mode can be changed +- * based on the EEPROM. We cannot rely upon device ID. There +- * is no distinguishable difference between fiber and internal +- * SerDes mode on the 82575. There can be an external PHY attached +- * on the SGMII interface. For this, we'll set sgmii_active to true. +- */ +- phy->media_type = e1000_media_type_copper; +- dev_spec->sgmii_active = false; +- +- ctrl_ext = rd32(E1000_CTRL_EXT); +- if ((ctrl_ext & E1000_CTRL_EXT_LINK_MODE_MASK) == +- E1000_CTRL_EXT_LINK_MODE_PCIE_SERDES) { +- hw->phy.media_type = e1000_media_type_internal_serdes; +- ctrl_ext |= E1000_CTRL_I2C_ENA; +- } else if (ctrl_ext & E1000_CTRL_EXT_LINK_MODE_SGMII) { +- dev_spec->sgmii_active = true; +- ctrl_ext |= E1000_CTRL_I2C_ENA; +- } else { +- ctrl_ext &= ~E1000_CTRL_I2C_ENA; +- } +- wr32(E1000_CTRL_EXT, ctrl_ext); +- +- /* Set mta register count */ +- mac->mta_reg_count = 128; +- /* Set rar entry count */ +- mac->rar_entry_count = E1000_RAR_ENTRIES_82575; +- if (mac->type == e1000_82576) +- mac->rar_entry_count = E1000_RAR_ENTRIES_82576; +- /* Set if part includes ASF firmware */ +- mac->asf_firmware_present = true; +- /* Set if manageability features are enabled. */ +- mac->arc_subsystem_valid = +- (rd32(E1000_FWSM) & E1000_FWSM_MODE_MASK) +- ? true : false; +- +- /* physical interface link setup */ +- mac->ops.setup_physical_interface = +- (hw->phy.media_type == e1000_media_type_copper) +- ? igb_setup_copper_link_82575 +- : igb_setup_fiber_serdes_link_82575; +- +- /* NVM initialization */ +- eecd = rd32(E1000_EECD); ++ DEBUGFUNC("e1000_init_nvm_params_82575"); + + nvm->opcode_bits = 8; + nvm->delay_usec = 1; +@@ -168,10 +173,10 @@ + break; + } + +- nvm->type = e1000_nvm_eeprom_spi; ++ nvm->type = e1000_nvm_eeprom_spi; + + size = (u16)((eecd & E1000_EECD_SIZE_EX_MASK) >> +- E1000_EECD_SIZE_EX_SHIFT); ++ E1000_EECD_SIZE_EX_SHIFT); + + /* + * Added to a constant, "size" becomes the left-shift value +@@ -182,89 +187,169 @@ + /* EEPROM access above 16k is unsupported */ + if (size > 14) + size = 14; +- nvm->word_size = 1 << size; ++ nvm->word_size = 1 << size; + +- /* setup PHY parameters */ +- if (phy->media_type != e1000_media_type_copper) { +- phy->type = e1000_phy_none; +- return 0; +- } ++ /* Function Pointers */ ++ nvm->ops.acquire = e1000_acquire_nvm_82575; ++ nvm->ops.read = e1000_read_nvm_eerd; ++ nvm->ops.release = e1000_release_nvm_82575; ++ nvm->ops.update = e1000_update_nvm_checksum_generic; ++ nvm->ops.valid_led_default = e1000_valid_led_default_82575; ++ nvm->ops.validate = e1000_validate_nvm_checksum_generic; ++ nvm->ops.write = e1000_write_nvm_spi; + +- phy->autoneg_mask = AUTONEG_ADVERTISE_SPEED_DEFAULT; +- phy->reset_delay_us = 100; +- +- /* PHY function pointers */ +- if (igb_sgmii_active_82575(hw)) { +- phy->ops.reset_phy = igb_phy_hw_reset_sgmii_82575; +- phy->ops.read_phy_reg = igb_read_phy_reg_sgmii_82575; +- phy->ops.write_phy_reg = igb_write_phy_reg_sgmii_82575; +- } else { +- phy->ops.reset_phy = igb_phy_hw_reset; +- phy->ops.read_phy_reg = igb_read_phy_reg_igp; +- phy->ops.write_phy_reg = igb_write_phy_reg_igp; +- } +- +- /* Set phy->phy_addr and phy->id. */ +- ret_val = igb_get_phy_id_82575(hw); +- if (ret_val) +- return ret_val; +- +- /* Verify phy id and set remaining function pointers */ +- switch (phy->id) { +- case M88E1111_I_PHY_ID: +- phy->type = e1000_phy_m88; +- phy->ops.get_phy_info = igb_get_phy_info_m88; +- phy->ops.get_cable_length = igb_get_cable_length_m88; +- phy->ops.force_speed_duplex = igb_phy_force_speed_duplex_m88; +- break; +- case IGP03E1000_E_PHY_ID: +- phy->type = e1000_phy_igp_3; +- phy->ops.get_phy_info = igb_get_phy_info_igp; +- phy->ops.get_cable_length = igb_get_cable_length_igp_2; +- phy->ops.force_speed_duplex = igb_phy_force_speed_duplex_igp; +- phy->ops.set_d0_lplu_state = igb_set_d0_lplu_state_82575; +- phy->ops.set_d3_lplu_state = igb_set_d3_lplu_state; +- break; +- default: +- return -E1000_ERR_PHY; +- } +- +- return 0; ++ return E1000_SUCCESS; + } + + /** +- * igb_acquire_phy_82575 - Acquire rights to access PHY ++ * e1000_init_mac_params_82575 - Init MAC func ptrs. ++ * @hw: pointer to the HW structure ++ **/ ++static s32 e1000_init_mac_params_82575(struct e1000_hw *hw) ++{ ++ struct e1000_mac_info *mac = &hw->mac; ++ struct e1000_dev_spec_82575 *dev_spec = &hw->dev_spec._82575; ++ u32 ctrl_ext = 0; ++ ++ DEBUGFUNC("e1000_init_mac_params_82575"); ++ ++ /* Set media type */ ++ /* ++ * The 82575 uses bits 22:23 for link mode. The mode can be changed ++ * based on the EEPROM. We cannot rely upon device ID. There ++ * is no distinguishable difference between fiber and internal ++ * SerDes mode on the 82575. There can be an external PHY attached ++ * on the SGMII interface. For this, we'll set sgmii_active to true. ++ */ ++ hw->phy.media_type = e1000_media_type_copper; ++ dev_spec->sgmii_active = false; ++ ++ ctrl_ext = E1000_READ_REG(hw, E1000_CTRL_EXT); ++ if ((ctrl_ext & E1000_CTRL_EXT_LINK_MODE_MASK) == ++ E1000_CTRL_EXT_LINK_MODE_PCIE_SERDES) { ++ hw->phy.media_type = e1000_media_type_internal_serdes; ++ ctrl_ext |= E1000_CTRL_I2C_ENA; ++ } else if (ctrl_ext & E1000_CTRL_EXT_LINK_MODE_SGMII) { ++ dev_spec->sgmii_active = true; ++ ctrl_ext |= E1000_CTRL_I2C_ENA; ++ } else { ++ ctrl_ext &= ~E1000_CTRL_I2C_ENA; ++ } ++ E1000_WRITE_REG(hw, E1000_CTRL_EXT, ctrl_ext); ++ ++ /* Set mta register count */ ++ mac->mta_reg_count = 128; ++ /* Set rar entry count */ ++ mac->rar_entry_count = E1000_RAR_ENTRIES_82575; ++ if (mac->type == e1000_82576) ++ mac->rar_entry_count = E1000_RAR_ENTRIES_82576; ++ /* Set if part includes ASF firmware */ ++ mac->asf_firmware_present = true; ++ /* Set if manageability features are enabled. */ ++ mac->arc_subsystem_valid = ++ (E1000_READ_REG(hw, E1000_FWSM) & E1000_FWSM_MODE_MASK) ++ ? true : false; ++ ++ /* Function pointers */ ++ ++ /* bus type/speed/width */ ++ mac->ops.get_bus_info = e1000_get_bus_info_pcie_generic; ++ /* reset */ ++ mac->ops.reset_hw = e1000_reset_hw_82575; ++ /* hw initialization */ ++ mac->ops.init_hw = e1000_init_hw_82575; ++ /* link setup */ ++ mac->ops.setup_link = e1000_setup_link_generic; ++ /* physical interface link setup */ ++ mac->ops.setup_physical_interface = ++ (hw->phy.media_type == e1000_media_type_copper) ++ ? e1000_setup_copper_link_82575 ++ : e1000_setup_fiber_serdes_link_82575; ++ /* physical interface shutdown */ ++ mac->ops.shutdown_serdes = e1000_shutdown_fiber_serdes_link_82575; ++ /* check for link */ ++ mac->ops.check_for_link = e1000_check_for_link_82575; ++ /* receive address register setting */ ++ mac->ops.rar_set = e1000_rar_set_generic; ++ /* read mac address */ ++ mac->ops.read_mac_addr = e1000_read_mac_addr_82575; ++ /* multicast address update */ ++ mac->ops.update_mc_addr_list = e1000_update_mc_addr_list_82575; ++ /* writing VFTA */ ++ mac->ops.write_vfta = e1000_write_vfta_generic; ++ /* clearing VFTA */ ++ mac->ops.clear_vfta = e1000_clear_vfta_generic; ++ /* setting MTA */ ++ mac->ops.mta_set = e1000_mta_set_generic; ++ /* ID LED init */ ++ mac->ops.id_led_init = e1000_id_led_init_generic; ++ /* blink LED */ ++ mac->ops.blink_led = e1000_blink_led_generic; ++ /* setup LED */ ++ mac->ops.setup_led = e1000_setup_led_generic; ++ /* cleanup LED */ ++ mac->ops.cleanup_led = e1000_cleanup_led_generic; ++ /* turn on/off LED */ ++ mac->ops.led_on = e1000_led_on_generic; ++ mac->ops.led_off = e1000_led_off_generic; ++ /* clear hardware counters */ ++ mac->ops.clear_hw_cntrs = e1000_clear_hw_cntrs_82575; ++ /* link info */ ++ mac->ops.get_link_up_info = e1000_get_link_up_info_82575; ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_init_function_pointers_82575 - Init func ptrs. + * @hw: pointer to the HW structure + * +- * Acquire access rights to the correct PHY. This is a +- * function pointer entry point called by the api module. ++ * Called to initialize all function pointers and parameters. + **/ +-static s32 igb_acquire_phy_82575(struct e1000_hw *hw) ++void e1000_init_function_pointers_82575(struct e1000_hw *hw) ++{ ++ DEBUGFUNC("e1000_init_function_pointers_82575"); ++ ++ hw->mac.ops.init_params = e1000_init_mac_params_82575; ++ hw->nvm.ops.init_params = e1000_init_nvm_params_82575; ++ hw->phy.ops.init_params = e1000_init_phy_params_82575; ++} ++ ++/** ++ * e1000_acquire_phy_82575 - Acquire rights to access PHY ++ * @hw: pointer to the HW structure ++ * ++ * Acquire access rights to the correct PHY. ++ **/ ++static s32 e1000_acquire_phy_82575(struct e1000_hw *hw) + { + u16 mask; + ++ DEBUGFUNC("e1000_acquire_phy_82575"); ++ + mask = hw->bus.func ? E1000_SWFW_PHY1_SM : E1000_SWFW_PHY0_SM; + +- return igb_acquire_swfw_sync_82575(hw, mask); ++ return e1000_acquire_swfw_sync_82575(hw, mask); + } + + /** +- * igb_release_phy_82575 - Release rights to access PHY ++ * e1000_release_phy_82575 - Release rights to access PHY + * @hw: pointer to the HW structure + * +- * A wrapper to release access rights to the correct PHY. This is a +- * function pointer entry point called by the api module. ++ * A wrapper to release access rights to the correct PHY. + **/ +-static void igb_release_phy_82575(struct e1000_hw *hw) ++static void e1000_release_phy_82575(struct e1000_hw *hw) + { + u16 mask; + ++ DEBUGFUNC("e1000_release_phy_82575"); ++ + mask = hw->bus.func ? E1000_SWFW_PHY1_SM : E1000_SWFW_PHY0_SM; +- igb_release_swfw_sync_82575(hw, mask); ++ e1000_release_swfw_sync_82575(hw, mask); + } + + /** +- * igb_read_phy_reg_sgmii_82575 - Read PHY register using sgmii ++ * e1000_read_phy_reg_sgmii_82575 - Read PHY register using sgmii + * @hw: pointer to the HW structure + * @offset: register offset to be read + * @data: pointer to the read data +@@ -272,14 +357,16 @@ + * Reads the PHY register at offset using the serial gigabit media independent + * interface and stores the retrieved information in data. + **/ +-static s32 igb_read_phy_reg_sgmii_82575(struct e1000_hw *hw, u32 offset, +- u16 *data) ++static s32 e1000_read_phy_reg_sgmii_82575(struct e1000_hw *hw, u32 offset, ++ u16 *data) + { + struct e1000_phy_info *phy = &hw->phy; + u32 i, i2ccmd = 0; + ++ DEBUGFUNC("e1000_read_phy_reg_sgmii_82575"); ++ + if (offset > E1000_MAX_SGMII_PHY_REG_ADDR) { +- hw_dbg("PHY Address %u is out of range\n", offset); ++ DEBUGOUT1("PHY Address %u is out of range\n", offset); + return -E1000_ERR_PARAM; + } + +@@ -289,35 +376,35 @@ + * PHY to retrieve the desired data. + */ + i2ccmd = ((offset << E1000_I2CCMD_REG_ADDR_SHIFT) | +- (phy->addr << E1000_I2CCMD_PHY_ADDR_SHIFT) | +- (E1000_I2CCMD_OPCODE_READ)); ++ (phy->addr << E1000_I2CCMD_PHY_ADDR_SHIFT) | ++ (E1000_I2CCMD_OPCODE_READ)); + +- wr32(E1000_I2CCMD, i2ccmd); ++ E1000_WRITE_REG(hw, E1000_I2CCMD, i2ccmd); + + /* Poll the ready bit to see if the I2C read completed */ + for (i = 0; i < E1000_I2CCMD_PHY_TIMEOUT; i++) { +- udelay(50); +- i2ccmd = rd32(E1000_I2CCMD); ++ usec_delay(50); ++ i2ccmd = E1000_READ_REG(hw, E1000_I2CCMD); + if (i2ccmd & E1000_I2CCMD_READY) + break; + } + if (!(i2ccmd & E1000_I2CCMD_READY)) { +- hw_dbg("I2CCMD Read did not complete\n"); ++ DEBUGOUT("I2CCMD Read did not complete\n"); + return -E1000_ERR_PHY; + } + if (i2ccmd & E1000_I2CCMD_ERROR) { +- hw_dbg("I2CCMD Error bit set\n"); ++ DEBUGOUT("I2CCMD Error bit set\n"); + return -E1000_ERR_PHY; + } + + /* Need to byte-swap the 16-bit value. */ + *data = ((i2ccmd >> 8) & 0x00FF) | ((i2ccmd << 8) & 0xFF00); + +- return 0; ++ return E1000_SUCCESS; + } + + /** +- * igb_write_phy_reg_sgmii_82575 - Write PHY register using sgmii ++ * e1000_write_phy_reg_sgmii_82575 - Write PHY register using sgmii + * @hw: pointer to the HW structure + * @offset: register offset to write to + * @data: data to write at register offset +@@ -325,15 +412,17 @@ + * Writes the data to PHY register at the offset using the serial gigabit + * media independent interface. + **/ +-static s32 igb_write_phy_reg_sgmii_82575(struct e1000_hw *hw, u32 offset, +- u16 data) ++static s32 e1000_write_phy_reg_sgmii_82575(struct e1000_hw *hw, u32 offset, ++ u16 data) + { + struct e1000_phy_info *phy = &hw->phy; + u32 i, i2ccmd = 0; + u16 phy_data_swapped; + ++ DEBUGFUNC("e1000_write_phy_reg_sgmii_82575"); ++ + if (offset > E1000_MAX_SGMII_PHY_REG_ADDR) { +- hw_dbg("PHY Address %d is out of range\n", offset); ++ DEBUGOUT1("PHY Address %d is out of range\n", offset); + return -E1000_ERR_PARAM; + } + +@@ -346,43 +435,45 @@ + * PHY to retrieve the desired data. + */ + i2ccmd = ((offset << E1000_I2CCMD_REG_ADDR_SHIFT) | +- (phy->addr << E1000_I2CCMD_PHY_ADDR_SHIFT) | +- E1000_I2CCMD_OPCODE_WRITE | +- phy_data_swapped); ++ (phy->addr << E1000_I2CCMD_PHY_ADDR_SHIFT) | ++ E1000_I2CCMD_OPCODE_WRITE | ++ phy_data_swapped); + +- wr32(E1000_I2CCMD, i2ccmd); ++ E1000_WRITE_REG(hw, E1000_I2CCMD, i2ccmd); + + /* Poll the ready bit to see if the I2C read completed */ + for (i = 0; i < E1000_I2CCMD_PHY_TIMEOUT; i++) { +- udelay(50); +- i2ccmd = rd32(E1000_I2CCMD); ++ usec_delay(50); ++ i2ccmd = E1000_READ_REG(hw, E1000_I2CCMD); + if (i2ccmd & E1000_I2CCMD_READY) + break; + } + if (!(i2ccmd & E1000_I2CCMD_READY)) { +- hw_dbg("I2CCMD Write did not complete\n"); ++ DEBUGOUT("I2CCMD Write did not complete\n"); + return -E1000_ERR_PHY; + } + if (i2ccmd & E1000_I2CCMD_ERROR) { +- hw_dbg("I2CCMD Error bit set\n"); ++ DEBUGOUT("I2CCMD Error bit set\n"); + return -E1000_ERR_PHY; + } + +- return 0; ++ return E1000_SUCCESS; + } + + /** +- * igb_get_phy_id_82575 - Retrieve PHY addr and id ++ * e1000_get_phy_id_82575 - Retrieve PHY addr and id + * @hw: pointer to the HW structure + * + * Retrieves the PHY address and ID for both PHY's which do and do not use + * sgmi interface. + **/ +-static s32 igb_get_phy_id_82575(struct e1000_hw *hw) ++static s32 e1000_get_phy_id_82575(struct e1000_hw *hw) + { + struct e1000_phy_info *phy = &hw->phy; +- s32 ret_val = 0; ++ s32 ret_val = E1000_SUCCESS; + u16 phy_id; ++ ++ DEBUGFUNC("e1000_get_phy_id_82575"); + + /* + * For SGMII PHYs, we try the list of possible addresses until +@@ -391,9 +482,9 @@ + * work. The result of this function should mean phy->phy_addr + * and phy->id are set correctly. + */ +- if (!(igb_sgmii_active_82575(hw))) { ++ if (!(e1000_sgmii_active_82575(hw))) { + phy->addr = 1; +- ret_val = igb_get_phy_id(hw); ++ ret_val = e1000_get_phy_id(hw); + goto out; + } + +@@ -402,10 +493,11 @@ + * Therefore, we need to test 1-7 + */ + for (phy->addr = 1; phy->addr < 8; phy->addr++) { +- ret_val = igb_read_phy_reg_sgmii_82575(hw, PHY_ID1, &phy_id); +- if (ret_val == 0) { +- hw_dbg("Vendor ID 0x%08X read at address %u\n", +- phy_id, phy->addr); ++ ret_val = e1000_read_phy_reg_sgmii_82575(hw, PHY_ID1, &phy_id); ++ if (ret_val == E1000_SUCCESS) { ++ DEBUGOUT2("Vendor ID 0x%08X read at address %u\n", ++ phy_id, ++ phy->addr); + /* + * At the time of this writing, The M88 part is + * the only supported SGMII PHY product. +@@ -413,7 +505,8 @@ + if (phy_id == M88_VENDOR) + break; + } else { +- hw_dbg("PHY address %u was unreadable\n", phy->addr); ++ DEBUGOUT1("PHY address %u was unreadable\n", ++ phy->addr); + } + } + +@@ -424,45 +517,50 @@ + goto out; + } + +- ret_val = igb_get_phy_id(hw); ++ ret_val = e1000_get_phy_id(hw); + + out: + return ret_val; + } + + /** +- * igb_phy_hw_reset_sgmii_82575 - Performs a PHY reset ++ * e1000_phy_hw_reset_sgmii_82575 - Performs a PHY reset + * @hw: pointer to the HW structure + * + * Resets the PHY using the serial gigabit media independent interface. + **/ +-static s32 igb_phy_hw_reset_sgmii_82575(struct e1000_hw *hw) ++static s32 e1000_phy_hw_reset_sgmii_82575(struct e1000_hw *hw) + { +- s32 ret_val; ++ s32 ret_val = E1000_SUCCESS; ++ ++ DEBUGFUNC("e1000_phy_hw_reset_sgmii_82575"); + + /* + * This isn't a true "hard" reset, but is the only reset + * available to us at this time. + */ + +- hw_dbg("Soft resetting SGMII attached PHY...\n"); ++ DEBUGOUT("Soft resetting SGMII attached PHY...\n"); ++ ++ if (!(hw->phy.ops.write_reg)) ++ goto out; + + /* + * SFP documentation requires the following to configure the SPF module + * to work on SGMII. No further documentation is given. + */ +- ret_val = hw->phy.ops.write_phy_reg(hw, 0x1B, 0x8084); ++ ret_val = hw->phy.ops.write_reg(hw, 0x1B, 0x8084); + if (ret_val) + goto out; + +- ret_val = igb_phy_sw_reset(hw); ++ ret_val = hw->phy.ops.commit(hw); + + out: + return ret_val; + } + + /** +- * igb_set_d0_lplu_state_82575 - Set Low Power Linkup D0 state ++ * e1000_set_d0_lplu_state_82575 - Set Low Power Linkup D0 state + * @hw: pointer to the HW structure + * @active: true to enable LPLU, false to disable + * +@@ -474,35 +572,40 @@ + * This is a function pointer entry point only called by + * PHY setup routines. + **/ +-static s32 igb_set_d0_lplu_state_82575(struct e1000_hw *hw, bool active) ++static s32 e1000_set_d0_lplu_state_82575(struct e1000_hw *hw, bool active) + { + struct e1000_phy_info *phy = &hw->phy; +- s32 ret_val; ++ s32 ret_val = E1000_SUCCESS; + u16 data; + +- ret_val = phy->ops.read_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT, &data); ++ DEBUGFUNC("e1000_set_d0_lplu_state_82575"); ++ ++ if (!(hw->phy.ops.read_reg)) ++ goto out; ++ ++ ret_val = phy->ops.read_reg(hw, IGP02E1000_PHY_POWER_MGMT, &data); + if (ret_val) + goto out; + + if (active) { + data |= IGP02E1000_PM_D0_LPLU; +- ret_val = phy->ops.write_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT, +- data); ++ ret_val = phy->ops.write_reg(hw, IGP02E1000_PHY_POWER_MGMT, ++ data); + if (ret_val) + goto out; + + /* When LPLU is enabled, we should disable SmartSpeed */ +- ret_val = phy->ops.read_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG, +- &data); ++ ret_val = phy->ops.read_reg(hw, IGP01E1000_PHY_PORT_CONFIG, ++ &data); + data &= ~IGP01E1000_PSCFR_SMART_SPEED; +- ret_val = phy->ops.write_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG, +- data); ++ ret_val = phy->ops.write_reg(hw, IGP01E1000_PHY_PORT_CONFIG, ++ data); + if (ret_val) + goto out; + } else { + data &= ~IGP02E1000_PM_D0_LPLU; +- ret_val = phy->ops.write_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT, +- data); ++ ret_val = phy->ops.write_reg(hw, IGP02E1000_PHY_POWER_MGMT, ++ data); + /* + * LPLU and SmartSpeed are mutually exclusive. LPLU is used + * during Dx states where the power conservation is most +@@ -510,25 +613,29 @@ + * SmartSpeed, so performance is maintained. + */ + if (phy->smart_speed == e1000_smart_speed_on) { +- ret_val = phy->ops.read_phy_reg(hw, +- IGP01E1000_PHY_PORT_CONFIG, &data); ++ ret_val = phy->ops.read_reg(hw, ++ IGP01E1000_PHY_PORT_CONFIG, ++ &data); + if (ret_val) + goto out; + + data |= IGP01E1000_PSCFR_SMART_SPEED; +- ret_val = phy->ops.write_phy_reg(hw, +- IGP01E1000_PHY_PORT_CONFIG, data); ++ ret_val = phy->ops.write_reg(hw, ++ IGP01E1000_PHY_PORT_CONFIG, ++ data); + if (ret_val) + goto out; + } else if (phy->smart_speed == e1000_smart_speed_off) { +- ret_val = phy->ops.read_phy_reg(hw, +- IGP01E1000_PHY_PORT_CONFIG, &data); ++ ret_val = phy->ops.read_reg(hw, ++ IGP01E1000_PHY_PORT_CONFIG, ++ &data); + if (ret_val) + goto out; + + data &= ~IGP01E1000_PSCFR_SMART_SPEED; +- ret_val = phy->ops.write_phy_reg(hw, +- IGP01E1000_PHY_PORT_CONFIG, data); ++ ret_val = phy->ops.write_reg(hw, ++ IGP01E1000_PHY_PORT_CONFIG, ++ data); + if (ret_val) + goto out; + } +@@ -539,7 +646,7 @@ + } + + /** +- * igb_acquire_nvm_82575 - Request for access to EEPROM ++ * e1000_acquire_nvm_82575 - Request for access to EEPROM + * @hw: pointer to the HW structure + * + * Acquire the necessary semaphores for exclusive access to the EEPROM. +@@ -547,59 +654,65 @@ + * Return successful if access grant bit set, else clear the request for + * EEPROM access and return -E1000_ERR_NVM (-1). + **/ +-static s32 igb_acquire_nvm_82575(struct e1000_hw *hw) ++static s32 e1000_acquire_nvm_82575(struct e1000_hw *hw) + { + s32 ret_val; + +- ret_val = igb_acquire_swfw_sync_82575(hw, E1000_SWFW_EEP_SM); ++ DEBUGFUNC("e1000_acquire_nvm_82575"); ++ ++ ret_val = e1000_acquire_swfw_sync_82575(hw, E1000_SWFW_EEP_SM); + if (ret_val) + goto out; + +- ret_val = igb_acquire_nvm(hw); ++ ret_val = e1000_acquire_nvm_generic(hw); + + if (ret_val) +- igb_release_swfw_sync_82575(hw, E1000_SWFW_EEP_SM); ++ e1000_release_swfw_sync_82575(hw, E1000_SWFW_EEP_SM); + + out: + return ret_val; + } + + /** +- * igb_release_nvm_82575 - Release exclusive access to EEPROM ++ * e1000_release_nvm_82575 - Release exclusive access to EEPROM + * @hw: pointer to the HW structure + * + * Stop any current commands to the EEPROM and clear the EEPROM request bit, + * then release the semaphores acquired. + **/ +-static void igb_release_nvm_82575(struct e1000_hw *hw) ++static void e1000_release_nvm_82575(struct e1000_hw *hw) + { +- igb_release_nvm(hw); +- igb_release_swfw_sync_82575(hw, E1000_SWFW_EEP_SM); ++ DEBUGFUNC("e1000_release_nvm_82575"); ++ ++ e1000_release_nvm_generic(hw); ++ e1000_release_swfw_sync_82575(hw, E1000_SWFW_EEP_SM); + } + + /** +- * igb_acquire_swfw_sync_82575 - Acquire SW/FW semaphore ++ * e1000_acquire_swfw_sync_82575 - Acquire SW/FW semaphore + * @hw: pointer to the HW structure + * @mask: specifies which semaphore to acquire + * + * Acquire the SW/FW semaphore to access the PHY or NVM. The mask + * will also specify which port we're acquiring the lock for. + **/ +-static s32 igb_acquire_swfw_sync_82575(struct e1000_hw *hw, u16 mask) ++static s32 e1000_acquire_swfw_sync_82575(struct e1000_hw *hw, u16 mask) + { + u32 swfw_sync; + u32 swmask = mask; + u32 fwmask = mask << 16; +- s32 ret_val = 0; ++ s32 ret_val = E1000_SUCCESS; + s32 i = 0, timeout = 200; /* FIXME: find real value to use here */ + ++ DEBUGFUNC("e1000_acquire_swfw_sync_82575"); ++ + while (i < timeout) { +- if (igb_get_hw_semaphore(hw)) { ++ if (e1000_get_hw_semaphore_generic(hw)) { + ret_val = -E1000_ERR_SWFW_SYNC; + goto out; + } + +- swfw_sync = rd32(E1000_SW_FW_SYNC); ++ swfw_sync = E1000_READ_REG(hw, E1000_SW_FW_SYNC); + if (!(swfw_sync & (fwmask | swmask))) + break; + +@@ -607,108 +720,153 @@ + * Firmware currently using resource (fwmask) + * or other software thread using resource (swmask) + */ +- igb_put_hw_semaphore(hw); +- mdelay(5); ++ e1000_put_hw_semaphore_generic(hw); ++ msec_delay_irq(5); + i++; + } + + if (i == timeout) { +- hw_dbg("Driver can't access resource, SW_FW_SYNC timeout.\n"); ++ DEBUGOUT("Driver can't access resource, SW_FW_SYNC timeout.\n"); + ret_val = -E1000_ERR_SWFW_SYNC; + goto out; + } + + swfw_sync |= swmask; +- wr32(E1000_SW_FW_SYNC, swfw_sync); ++ E1000_WRITE_REG(hw, E1000_SW_FW_SYNC, swfw_sync); + +- igb_put_hw_semaphore(hw); ++ e1000_put_hw_semaphore_generic(hw); + + out: + return ret_val; + } + + /** +- * igb_release_swfw_sync_82575 - Release SW/FW semaphore ++ * e1000_release_swfw_sync_82575 - Release SW/FW semaphore + * @hw: pointer to the HW structure + * @mask: specifies which semaphore to acquire + * + * Release the SW/FW semaphore used to access the PHY or NVM. The mask + * will also specify which port we're releasing the lock for. + **/ +-static void igb_release_swfw_sync_82575(struct e1000_hw *hw, u16 mask) ++static void e1000_release_swfw_sync_82575(struct e1000_hw *hw, u16 mask) + { + u32 swfw_sync; + +- while (igb_get_hw_semaphore(hw) != 0); ++ DEBUGFUNC("e1000_release_swfw_sync_82575"); ++ ++ while (e1000_get_hw_semaphore_generic(hw) != E1000_SUCCESS); + /* Empty */ + +- swfw_sync = rd32(E1000_SW_FW_SYNC); ++ swfw_sync = E1000_READ_REG(hw, E1000_SW_FW_SYNC); + swfw_sync &= ~mask; +- wr32(E1000_SW_FW_SYNC, swfw_sync); ++ E1000_WRITE_REG(hw, E1000_SW_FW_SYNC, swfw_sync); + +- igb_put_hw_semaphore(hw); ++ e1000_put_hw_semaphore_generic(hw); + } + + /** +- * igb_get_cfg_done_82575 - Read config done bit ++ * e1000_get_cfg_done_82575 - Read config done bit + * @hw: pointer to the HW structure + * + * Read the management control register for the config done bit for + * completion status. NOTE: silicon which is EEPROM-less will fail trying + * to read the config done bit, so an error is *ONLY* logged and returns +- * 0. If we were to return with error, EEPROM-less silicon ++ * E1000_SUCCESS. If we were to return with error, EEPROM-less silicon + * would not be able to be reset or change link. + **/ +-static s32 igb_get_cfg_done_82575(struct e1000_hw *hw) ++static s32 e1000_get_cfg_done_82575(struct e1000_hw *hw) + { + s32 timeout = PHY_CFG_TIMEOUT; +- s32 ret_val = 0; ++ s32 ret_val = E1000_SUCCESS; + u32 mask = E1000_NVM_CFG_DONE_PORT_0; ++ ++ DEBUGFUNC("e1000_get_cfg_done_82575"); + + if (hw->bus.func == 1) + mask = E1000_NVM_CFG_DONE_PORT_1; + + while (timeout) { +- if (rd32(E1000_EEMNGCTL) & mask) ++ if (E1000_READ_REG(hw, E1000_EEMNGCTL) & mask) + break; +- msleep(1); ++ msec_delay(1); + timeout--; + } +- if (!timeout) +- hw_dbg("MNG configuration cycle has not completed.\n"); ++ if (!timeout) { ++ DEBUGOUT("MNG configuration cycle has not completed.\n"); ++ } + + /* If EEPROM is not marked present, init the PHY manually */ +- if (((rd32(E1000_EECD) & E1000_EECD_PRES) == 0) && +- (hw->phy.type == e1000_phy_igp_3)) +- igb_phy_init_script_igp3(hw); ++ if (((E1000_READ_REG(hw, E1000_EECD) & E1000_EECD_PRES) == 0) && ++ (hw->phy.type == e1000_phy_igp_3)) { ++ e1000_phy_init_script_igp3(hw); ++ } + + return ret_val; + } + + /** +- * igb_check_for_link_82575 - Check for link ++ * e1000_get_link_up_info_82575 - Get link speed/duplex info ++ * @hw: pointer to the HW structure ++ * @speed: stores the current speed ++ * @duplex: stores the current duplex ++ * ++ * This is a wrapper function, if using the serial gigabit media independent ++ * interface, use PCS to retrieve the link speed and duplex information. ++ * Otherwise, use the generic function to get the link speed and duplex info. ++ **/ ++static s32 e1000_get_link_up_info_82575(struct e1000_hw *hw, u16 *speed, ++ u16 *duplex) ++{ ++ s32 ret_val; ++ ++ DEBUGFUNC("e1000_get_link_up_info_82575"); ++ ++ if (hw->phy.media_type != e1000_media_type_copper || ++ e1000_sgmii_active_82575(hw)) { ++ ret_val = e1000_get_pcs_speed_and_duplex_82575(hw, speed, ++ duplex); ++ } else { ++ ret_val = e1000_get_speed_and_duplex_copper_generic(hw, speed, ++ duplex); ++ } ++ ++ return ret_val; ++} ++ ++/** ++ * e1000_check_for_link_82575 - Check for link + * @hw: pointer to the HW structure + * + * If sgmii is enabled, then use the pcs register to determine link, otherwise + * use the generic interface for determining link. + **/ +-static s32 igb_check_for_link_82575(struct e1000_hw *hw) ++static s32 e1000_check_for_link_82575(struct e1000_hw *hw) + { + s32 ret_val; + u16 speed, duplex; + ++ DEBUGFUNC("e1000_check_for_link_82575"); ++ + /* SGMII link check is done through the PCS register. */ + if ((hw->phy.media_type != e1000_media_type_copper) || +- (igb_sgmii_active_82575(hw))) +- ret_val = igb_get_pcs_speed_and_duplex_82575(hw, &speed, +- &duplex); +- else +- ret_val = igb_check_for_copper_link(hw); ++ (e1000_sgmii_active_82575(hw))) { ++ ret_val = e1000_get_pcs_speed_and_duplex_82575(hw, &speed, ++ &duplex); ++ /* ++ * Use this flag to determine if link needs to be checked or ++ * not. If we have link clear the flag so that we do not ++ * continue to check for link. ++ */ ++ hw->mac.get_link_status = !hw->mac.serdes_has_link; ++ } else { ++ ret_val = e1000_check_for_copper_link_generic(hw); ++ } + + return ret_val; + } ++ + /** +- * igb_get_pcs_speed_and_duplex_82575 - Retrieve current speed/duplex ++ * e1000_get_pcs_speed_and_duplex_82575 - Retrieve current speed/duplex + * @hw: pointer to the HW structure + * @speed: stores the current speed + * @duplex: stores the current duplex +@@ -716,11 +874,13 @@ + * Using the physical coding sub-layer (PCS), retrieve the current speed and + * duplex, then store the values in the pointers provided. + **/ +-static s32 igb_get_pcs_speed_and_duplex_82575(struct e1000_hw *hw, u16 *speed, +- u16 *duplex) ++static s32 e1000_get_pcs_speed_and_duplex_82575(struct e1000_hw *hw, ++ u16 *speed, u16 *duplex) + { + struct e1000_mac_info *mac = &hw->mac; + u32 pcs; ++ ++ DEBUGFUNC("e1000_get_pcs_speed_and_duplex_82575"); + + /* Set up defaults for the return values of this function */ + mac->serdes_has_link = false; +@@ -732,7 +892,7 @@ + * the status register is not accurate. The PCS status register is + * used instead. + */ +- pcs = rd32(E1000_PCS_LSTAT); ++ pcs = E1000_READ_REG(hw, E1000_PCS_LSTAT); + + /* + * The link up bit determines when link is up on autoneg. The sync ok +@@ -759,11 +919,11 @@ + } + } + +- return 0; ++ return E1000_SUCCESS; + } + + /** +- * igb_init_rx_addrs_82575 - Initialize receive address's ++ * e1000_init_rx_addrs_82575 - Initialize receive address's + * @hw: pointer to the HW structure + * @rar_count: receive address registers + * +@@ -771,7 +931,7 @@ + * register to the devices MAC address and clearing all the other receive + * address registers to 0. + **/ +-static void igb_init_rx_addrs_82575(struct e1000_hw *hw, u16 rar_count) ++static void e1000_init_rx_addrs_82575(struct e1000_hw *hw, u16 rar_count) + { + u32 i; + u8 addr[6] = {0,0,0,0,0,0}; +@@ -783,20 +943,21 @@ + * function e1000_rar_set_generic. + */ + +- hw_dbg("e1000_init_rx_addrs_82575"); ++ DEBUGFUNC("e1000_init_rx_addrs_82575"); + + /* Setup the receive address */ +- hw_dbg("Programming MAC Address into RAR[0]\n"); ++ DEBUGOUT("Programming MAC Address into RAR[0]\n"); + hw->mac.ops.rar_set(hw, hw->mac.addr, 0); + + /* Zero out the other (rar_entry_count - 1) receive addresses */ +- hw_dbg("Clearing RAR[1-%u]\n", rar_count-1); +- for (i = 1; i < rar_count; i++) ++ DEBUGOUT1("Clearing RAR[1-%u]\n", rar_count-1); ++ for (i = 1; i < rar_count; i++) { + hw->mac.ops.rar_set(hw, addr, i); ++ } + } + + /** +- * igb_update_mc_addr_list_82575 - Update Multicast addresses ++ * e1000_update_mc_addr_list_82575 - Update Multicast addresses + * @hw: pointer to the HW structure + * @mc_addr_list: array of multicast addresses to program + * @mc_addr_count: number of multicast addresses to program +@@ -808,20 +969,22 @@ + * The parameter rar_count will usually be hw->mac.rar_entry_count + * unless there are workarounds that change this. + **/ +-void igb_update_mc_addr_list_82575(struct e1000_hw *hw, +- u8 *mc_addr_list, u32 mc_addr_count, +- u32 rar_used_count, u32 rar_count) ++static void e1000_update_mc_addr_list_82575(struct e1000_hw *hw, ++ u8 *mc_addr_list, u32 mc_addr_count, ++ u32 rar_used_count, u32 rar_count) + { + u32 hash_value; + u32 i; + u8 addr[6] = {0,0,0,0,0,0}; + /* + * This function is essentially the same as that of +- * igb_update_mc_addr_list_generic. However it also takes care ++ * e1000_update_mc_addr_list_generic. However it also takes care + * of the special case where the register offset of the + * second set of RARs begins elsewhere. This is implicitly taken care by + * function e1000_rar_set_generic. + */ ++ ++ DEBUGFUNC("e1000_update_mc_addr_list_82575"); + + /* + * Load the first set of multicast addresses into the exact +@@ -830,155 +993,414 @@ + */ + for (i = rar_used_count; i < rar_count; i++) { + if (mc_addr_count) { +- igb_rar_set(hw, mc_addr_list, i); ++ e1000_rar_set_generic(hw, mc_addr_list, i); + mc_addr_count--; +- mc_addr_list += ETH_ALEN; ++ mc_addr_list += ETH_ADDR_LEN; + } else { +- igb_rar_set(hw, addr, i); ++ e1000_rar_set_generic(hw, addr, i); + } + } + + /* Clear the old settings from the MTA */ +- hw_dbg("Clearing MTA\n"); ++ DEBUGOUT("Clearing MTA\n"); + for (i = 0; i < hw->mac.mta_reg_count; i++) { +- array_wr32(E1000_MTA, i, 0); +- wrfl(); ++ E1000_WRITE_REG_ARRAY(hw, E1000_MTA, i, 0); ++ E1000_WRITE_FLUSH(hw); + } + + /* Load any remaining multicast addresses into the hash table. */ + for (; mc_addr_count > 0; mc_addr_count--) { +- hash_value = igb_hash_mc_addr(hw, mc_addr_list); +- hw_dbg("Hash value = 0x%03X\n", hash_value); +- igb_mta_set(hw, hash_value); +- mc_addr_list += ETH_ALEN; ++ hash_value = e1000_hash_mc_addr(hw, mc_addr_list); ++ DEBUGOUT1("Hash value = 0x%03X\n", hash_value); ++ hw->mac.ops.mta_set(hw, hash_value); ++ mc_addr_list += ETH_ADDR_LEN; + } + } + + /** +- * igb_shutdown_fiber_serdes_link_82575 - Remove link during power down ++ * e1000_shutdown_fiber_serdes_link_82575 - Remove link during power down + * @hw: pointer to the HW structure + * +- * In the case of fiber serdes, shut down optics and PCS on driver unload ++ * In the case of fiber serdes shut down optics and PCS on driver unload + * when management pass thru is not enabled. + **/ +-void igb_shutdown_fiber_serdes_link_82575(struct e1000_hw *hw) ++void e1000_shutdown_fiber_serdes_link_82575(struct e1000_hw *hw) + { + u32 reg; ++ u16 eeprom_data = 0; + + if (hw->mac.type != e1000_82576 || +- (hw->phy.media_type != e1000_media_type_fiber && +- hw->phy.media_type != e1000_media_type_internal_serdes)) ++ (hw->phy.media_type != e1000_media_type_fiber && ++ hw->phy.media_type != e1000_media_type_internal_serdes)) + return; + +- /* if the management interface is not enabled, then power down */ +- if (!igb_enable_mng_pass_thru(hw)) { ++ if (hw->bus.func == 0) ++ hw->nvm.ops.read(hw, NVM_INIT_CONTROL3_PORT_A, 1, &eeprom_data); ++ ++ /* ++ * If APM is not enabled in the EEPROM and management interface is ++ * not enabled, then power down. ++ */ ++ if (!(eeprom_data & E1000_NVM_APME_82575) && ++ !e1000_enable_mng_pass_thru(hw)) { + /* Disable PCS to turn off link */ +- reg = rd32(E1000_PCS_CFG0); ++ reg = E1000_READ_REG(hw, E1000_PCS_CFG0); + reg &= ~E1000_PCS_CFG_PCS_EN; +- wr32(E1000_PCS_CFG0, reg); ++ E1000_WRITE_REG(hw, E1000_PCS_CFG0, reg); + + /* shutdown the laser */ +- reg = rd32(E1000_CTRL_EXT); ++ reg = E1000_READ_REG(hw, E1000_CTRL_EXT); + reg |= E1000_CTRL_EXT_SDP7_DATA; +- wr32(E1000_CTRL_EXT, reg); ++ E1000_WRITE_REG(hw, E1000_CTRL_EXT, reg); + +- /* flush the write to verify completion */ +- wrfl(); +- msleep(1); ++ /* flush the write to verfiy completion */ ++ E1000_WRITE_FLUSH(hw); ++ msec_delay(1); + } + + return; + } + + /** +- * igb_reset_hw_82575 - Reset hardware ++ * e1000_vmdq_loopback_enable_pf- Enables VM to VM queue loopback replication ++ * @hw: pointer to the HW structure ++ **/ ++void e1000_vmdq_loopback_enable_pf(struct e1000_hw *hw) ++{ ++ u32 reg; ++ ++ reg = E1000_READ_REG(hw, E1000_DTXSWC); ++ reg |= E1000_DTXSWC_VMDQ_LOOPBACK_EN; ++ E1000_WRITE_REG(hw, E1000_DTXSWC, reg); ++} ++ ++/** ++ * e1000_vmdq_loopback_disable_pf - Disable VM to VM queue loopbk replication ++ * @hw: pointer to the HW structure ++ **/ ++void e1000_vmdq_loopback_disable_pf(struct e1000_hw *hw) ++{ ++ u32 reg; ++ ++ reg = E1000_READ_REG(hw, E1000_DTXSWC); ++ reg &= ~(E1000_DTXSWC_VMDQ_LOOPBACK_EN); ++ E1000_WRITE_REG(hw, E1000_DTXSWC, reg); ++} ++ ++/** ++ * e1000_vmdq_replication_enable_pf - Enable replication of brdcst & multicst + * @hw: pointer to the HW structure + * +- * This resets the hardware into a known state. This is a +- * function pointer entry point called by the api module. ++ * Enables replication of broadcast and multicast packets from the network ++ * to VM's which have their respective broadcast and multicast accept ++ * bits set in the VM Offload Register. This gives the PF driver per ++ * VM granularity control over which VM's get replicated broadcast traffic. + **/ +-static s32 igb_reset_hw_82575(struct e1000_hw *hw) ++void e1000_vmdq_replication_enable_pf(struct e1000_hw *hw, u32 enables) ++{ ++ u32 reg; ++ u32 i; ++ ++ for (i = 0; i < MAX_NUM_VFS; i++) { ++ if (enables & (1 << i)) { ++ reg = E1000_READ_REG(hw, E1000_VMOLR(i)); ++ reg |= (E1000_VMOLR_AUPE | ++ E1000_VMOLR_BAM | ++ E1000_VMOLR_MPME); ++ E1000_WRITE_REG(hw, E1000_VMOLR(i), reg); ++ } ++ } ++ ++ reg = E1000_READ_REG(hw, E1000_VT_CTL); ++ reg |= E1000_VT_CTL_VM_REPL_EN; ++ E1000_WRITE_REG(hw, E1000_VT_CTL, reg); ++} ++ ++/** ++ * e1000_vmdq_replication_disable_pf - Disable replication of brdcst & multicst ++ * @hw: pointer to the HW structure ++ * ++ * Disables replication of broadcast and multicast packets to the VM's. ++ **/ ++void e1000_vmdq_replication_disable_pf(struct e1000_hw *hw) ++{ ++ u32 reg; ++ ++ reg = E1000_READ_REG(hw, E1000_VT_CTL); ++ reg &= ~(E1000_VT_CTL_VM_REPL_EN); ++ E1000_WRITE_REG(hw, E1000_VT_CTL, reg); ++} ++ ++/** ++ * e1000_vmdq_enable_replication_mode_pf - Enables replication mode in the device ++ * @hw: pointer to the HW structure ++ **/ ++void e1000_vmdq_enable_replication_mode_pf(struct e1000_hw *hw) ++{ ++ u32 reg; ++ ++ reg = E1000_READ_REG(hw, E1000_VT_CTL); ++ reg |= E1000_VT_CTL_VM_REPL_EN; ++ E1000_WRITE_REG(hw, E1000_VT_CTL, reg); ++} ++ ++/** ++ * e1000_vmdq_broadcast_replication_enable_pf - Enable replication of brdcst ++ * @hw: pointer to the HW structure ++ * @enables: PoolSet Bit - if set to ALL_QUEUES, apply to all pools. ++ * ++ * Enables replication of broadcast packets from the network ++ * to VM's which have their respective broadcast accept ++ * bits set in the VM Offload Register. This gives the PF driver per ++ * VM granularity control over which VM's get replicated broadcast traffic. ++ **/ ++void e1000_vmdq_broadcast_replication_enable_pf(struct e1000_hw *hw, ++ u32 enables) ++{ ++ u32 reg; ++ u32 i; ++ ++ for (i = 0; i < MAX_NUM_VFS; i++) { ++ if ((enables == ALL_QUEUES) || (enables & (1 << i))) { ++ reg = E1000_READ_REG(hw, E1000_VMOLR(i)); ++ reg |= E1000_VMOLR_BAM; ++ E1000_WRITE_REG(hw, E1000_VMOLR(i), reg); ++ } ++ } ++} ++ ++/** ++ * e1000_vmdq_broadcast_replication_disable_pf - Disable replication ++ * of broadcast packets ++ * @hw: pointer to the HW structure ++ * @disables: PoolSet Bit - if set to ALL_QUEUES, apply to all pools. ++ * ++ * Disables replication of broadcast packets for specific pools. ++ * If bam/mpe is disabled on all pools then replication mode is ++ * turned off. ++ **/ ++void e1000_vmdq_broadcast_replication_disable_pf(struct e1000_hw *hw, ++ u32 disables) ++{ ++ u32 reg; ++ u32 i; ++ u32 oneenabled = 0; ++ ++ for (i = 0; i < MAX_NUM_VFS; i++) { ++ reg = E1000_READ_REG(hw, E1000_VMOLR(i)); ++ if ((disables == ALL_QUEUES) || (disables & (1 << i))) { ++ reg &= ~(E1000_VMOLR_BAM); ++ E1000_WRITE_REG(hw, E1000_VMOLR(i), reg); ++ } ++ if (!oneenabled && (reg & (E1000_VMOLR_AUPE | ++ E1000_VMOLR_BAM | ++ E1000_VMOLR_MPME))) ++ oneenabled = 1; ++ } ++ if (!oneenabled) { ++ reg = E1000_READ_REG(hw, E1000_VT_CTL); ++ reg &= ~(E1000_VT_CTL_VM_REPL_EN); ++ E1000_WRITE_REG(hw, E1000_VT_CTL, reg); ++ } ++} ++ ++/** ++ * e1000_vmdq_multicast_promiscuous_enable_pf - Enable promiscuous reception ++ * @hw: pointer to the HW structure ++ * @enables: PoolSet Bit - if set to ALL_QUEUES, apply to all pools. ++ * ++ * Enables promiscuous reception of multicast packets from the network ++ * to VM's which have their respective multicast promiscuous mode enable ++ * bits set in the VM Offload Register. This gives the PF driver per ++ * VM granularity control over which VM's get all multicast traffic. ++ **/ ++void e1000_vmdq_multicast_promiscuous_enable_pf(struct e1000_hw *hw, ++ u32 enables) ++{ ++ u32 reg; ++ u32 i; ++ ++ for (i = 0; i < MAX_NUM_VFS; i++) { ++ if ((enables == ALL_QUEUES) || (enables & (1 << i))) { ++ reg = E1000_READ_REG(hw, E1000_VMOLR(i)); ++ reg |= E1000_VMOLR_MPME; ++ E1000_WRITE_REG(hw, E1000_VMOLR(i), reg); ++ } ++ } ++} ++ ++/** ++ * e1000_vmdq_multicast_promiscuous_disable_pf - Disable promiscuous ++ * reception of multicast packets ++ * @hw: pointer to the HW structure ++ * @disables: PoolSet Bit - if set to ALL_QUEUES, apply to all pools. ++ * ++ * Disables promiscuous reception of multicast packets for specific pools. ++ * If bam/mpe is disabled on all pools then replication mode is ++ * turned off. ++ **/ ++void e1000_vmdq_multicast_promiscuous_disable_pf(struct e1000_hw *hw, ++ u32 disables) ++{ ++ u32 reg; ++ u32 i; ++ u32 oneenabled = 0; ++ ++ for (i = 0; i < MAX_NUM_VFS; i++) { ++ reg = E1000_READ_REG(hw, E1000_VMOLR(i)); ++ if ((disables == ALL_QUEUES) || (disables & (1 << i))) { ++ reg &= ~(E1000_VMOLR_MPME); ++ E1000_WRITE_REG(hw, E1000_VMOLR(i), reg); ++ } ++ if (!oneenabled && (reg & (E1000_VMOLR_AUPE | ++ E1000_VMOLR_BAM | ++ E1000_VMOLR_MPME))) ++ oneenabled = 1; ++ } ++ if (!oneenabled) { ++ reg = E1000_READ_REG(hw, E1000_VT_CTL); ++ reg &= ~(E1000_VT_CTL_VM_REPL_EN); ++ E1000_WRITE_REG(hw, E1000_VT_CTL, reg); ++ } ++} ++ ++/** ++ * e1000_vmdq_aupe_enable_pf - Enable acceptance of untagged packets ++ * @hw: pointer to the HW structure ++ * @enables: PoolSet Bit - if set to ALL_QUEUES, apply to all pools. ++ * ++ * Enables acceptance of packets from the network which do not have ++ * a VLAN tag but match the exact MAC filter of a given VM. ++ **/ ++void e1000_vmdq_aupe_enable_pf(struct e1000_hw *hw, u32 enables) ++{ ++ u32 reg; ++ u32 i; ++ ++ for (i = 0; i < MAX_NUM_VFS; i++) { ++ if ((enables == ALL_QUEUES) || (enables & (1 << i))) { ++ reg = E1000_READ_REG(hw, E1000_VMOLR(i)); ++ reg |= E1000_VMOLR_AUPE; ++ E1000_WRITE_REG(hw, E1000_VMOLR(i), reg); ++ } ++ } ++} ++ ++/** ++ * e1000_vmdq_aupe_disable_pf - Disable acceptance of untagged packets ++ * @hw: pointer to the HW structure ++ * @disables: PoolSet Bit - if set to ALL_QUEUES, apply to all pools. ++ * ++ * Disables acceptance of packets from the network which do not have ++ * a VLAN tag but match the exact MAC filter of a given VM. ++ **/ ++void e1000_vmdq_aupe_disable_pf(struct e1000_hw *hw, u32 disables) ++{ ++ u32 reg; ++ u32 i; ++ ++ for (i = 0; i < MAX_NUM_VFS; i++) { ++ if ((disables == ALL_QUEUES) || (disables & (1 << i))) { ++ reg = E1000_READ_REG(hw, E1000_VMOLR(i)); ++ reg &= ~E1000_VMOLR_AUPE; ++ E1000_WRITE_REG(hw, E1000_VMOLR(i), reg); ++ } ++ } ++} ++ ++/** ++ * e1000_reset_hw_82575 - Reset hardware ++ * @hw: pointer to the HW structure ++ * ++ * This resets the hardware into a known state. ++ **/ ++static s32 e1000_reset_hw_82575(struct e1000_hw *hw) + { + u32 ctrl, icr; + s32 ret_val; ++ ++ DEBUGFUNC("e1000_reset_hw_82575"); + + /* + * Prevent the PCI-E bus from sticking if there is no TLP connection + * on the last TLP read/write transaction when MAC is reset. + */ +- ret_val = igb_disable_pcie_master(hw); +- if (ret_val) +- hw_dbg("PCI-E Master disable polling has failed.\n"); ++ ret_val = e1000_disable_pcie_master_generic(hw); ++ if (ret_val) { ++ DEBUGOUT("PCI-E Master disable polling has failed.\n"); ++ } + +- hw_dbg("Masking off all interrupts\n"); +- wr32(E1000_IMC, 0xffffffff); ++ DEBUGOUT("Masking off all interrupts\n"); ++ E1000_WRITE_REG(hw, E1000_IMC, 0xffffffff); + +- wr32(E1000_RCTL, 0); +- wr32(E1000_TCTL, E1000_TCTL_PSP); +- wrfl(); ++ E1000_WRITE_REG(hw, E1000_RCTL, 0); ++ E1000_WRITE_REG(hw, E1000_TCTL, E1000_TCTL_PSP); ++ E1000_WRITE_FLUSH(hw); + +- msleep(10); ++ msec_delay(10); + +- ctrl = rd32(E1000_CTRL); ++ ctrl = E1000_READ_REG(hw, E1000_CTRL); + +- hw_dbg("Issuing a global reset to MAC\n"); +- wr32(E1000_CTRL, ctrl | E1000_CTRL_RST); ++ DEBUGOUT("Issuing a global reset to MAC\n"); ++ E1000_WRITE_REG(hw, E1000_CTRL, ctrl | E1000_CTRL_RST); + +- ret_val = igb_get_auto_rd_done(hw); ++ ret_val = e1000_get_auto_rd_done_generic(hw); + if (ret_val) { + /* + * When auto config read does not complete, do not + * return with an error. This can happen in situations + * where there is no eeprom and prevents getting link. + */ +- hw_dbg("Auto Read Done did not complete\n"); ++ DEBUGOUT("Auto Read Done did not complete\n"); + } + + /* If EEPROM is not present, run manual init scripts */ +- if ((rd32(E1000_EECD) & E1000_EECD_PRES) == 0) +- igb_reset_init_script_82575(hw); ++ if ((E1000_READ_REG(hw, E1000_EECD) & E1000_EECD_PRES) == 0) ++ e1000_reset_init_script_82575(hw); + + /* Clear any pending interrupt events. */ +- wr32(E1000_IMC, 0xffffffff); +- icr = rd32(E1000_ICR); ++ E1000_WRITE_REG(hw, E1000_IMC, 0xffffffff); ++ icr = E1000_READ_REG(hw, E1000_ICR); + +- igb_check_alt_mac_addr(hw); ++ e1000_check_alt_mac_addr_generic(hw); + + return ret_val; + } + + /** +- * igb_init_hw_82575 - Initialize hardware ++ * e1000_init_hw_82575 - Initialize hardware + * @hw: pointer to the HW structure + * + * This inits the hardware readying it for operation. + **/ +-static s32 igb_init_hw_82575(struct e1000_hw *hw) ++static s32 e1000_init_hw_82575(struct e1000_hw *hw) + { + struct e1000_mac_info *mac = &hw->mac; + s32 ret_val; + u16 i, rar_count = mac->rar_entry_count; + ++ DEBUGFUNC("e1000_init_hw_82575"); ++ + /* Initialize identification LED */ +- ret_val = igb_id_led_init(hw); ++ ret_val = mac->ops.id_led_init(hw); + if (ret_val) { +- hw_dbg("Error initializing identification LED\n"); ++ DEBUGOUT("Error initializing identification LED\n"); + /* This is not fatal and we should not stop init due to this */ + } + + /* Disabling VLAN filtering */ +- hw_dbg("Initializing the IEEE VLAN\n"); +- igb_clear_vfta(hw); ++ DEBUGOUT("Initializing the IEEE VLAN\n"); ++ mac->ops.clear_vfta(hw); + + /* Setup the receive address */ +- igb_init_rx_addrs_82575(hw, rar_count); ++ e1000_init_rx_addrs_82575(hw, rar_count); + /* Zero out the Multicast HASH table */ +- hw_dbg("Zeroing the MTA\n"); ++ DEBUGOUT("Zeroing the MTA\n"); + for (i = 0; i < mac->mta_reg_count; i++) +- array_wr32(E1000_MTA, i, 0); ++ E1000_WRITE_REG_ARRAY(hw, E1000_MTA, i, 0); + + /* Setup link and flow control */ +- ret_val = igb_setup_link(hw); ++ ret_val = mac->ops.setup_link(hw); + + /* + * Clear all of the statistics registers (clear on read). It is +@@ -986,41 +1408,43 @@ + * because the symbol error count will increment wildly if there + * is no link. + */ +- igb_clear_hw_cntrs_82575(hw); ++ e1000_clear_hw_cntrs_82575(hw); + + return ret_val; + } + + /** +- * igb_setup_copper_link_82575 - Configure copper link settings ++ * e1000_setup_copper_link_82575 - Configure copper link settings + * @hw: pointer to the HW structure + * + * Configures the link for auto-neg or forced speed and duplex. Then we check + * for link, once link is established calls to configure collision distance + * and flow control are called. + **/ +-static s32 igb_setup_copper_link_82575(struct e1000_hw *hw) ++static s32 e1000_setup_copper_link_82575(struct e1000_hw *hw) + { + u32 ctrl, led_ctrl; + s32 ret_val; + bool link; + +- ctrl = rd32(E1000_CTRL); ++ DEBUGFUNC("e1000_setup_copper_link_82575"); ++ ++ ctrl = E1000_READ_REG(hw, E1000_CTRL); + ctrl |= E1000_CTRL_SLU; + ctrl &= ~(E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX); +- wr32(E1000_CTRL, ctrl); ++ E1000_WRITE_REG(hw, E1000_CTRL, ctrl); + + switch (hw->phy.type) { + case e1000_phy_m88: +- ret_val = igb_copper_link_setup_m88(hw); ++ ret_val = e1000_copper_link_setup_m88(hw); + break; + case e1000_phy_igp_3: +- ret_val = igb_copper_link_setup_igp(hw); ++ ret_val = e1000_copper_link_setup_igp(hw); + /* Setup activity LED */ +- led_ctrl = rd32(E1000_LEDCTL); ++ led_ctrl = E1000_READ_REG(hw, E1000_LEDCTL); + led_ctrl &= IGP_ACTIVITY_LED_MASK; + led_ctrl |= (IGP_ACTIVITY_LED_ENABLE | IGP_LED3_MODE); +- wr32(E1000_LEDCTL, led_ctrl); ++ E1000_WRITE_REG(hw, E1000_LEDCTL, led_ctrl); + break; + default: + ret_val = -E1000_ERR_PHY; +@@ -1035,7 +1459,7 @@ + * Setup autoneg and flow control advertisement + * and perform autonegotiation. + */ +- ret_val = igb_copper_link_autoneg(hw); ++ ret_val = e1000_copper_link_autoneg(hw); + if (ret_val) + goto out; + } else { +@@ -1043,15 +1467,15 @@ + * PHY will be set to 10H, 10F, 100H or 100F + * depending on user settings. + */ +- hw_dbg("Forcing Speed and Duplex\n"); +- ret_val = igb_phy_force_speed_duplex(hw); ++ DEBUGOUT("Forcing Speed and Duplex\n"); ++ ret_val = hw->phy.ops.force_speed_duplex(hw); + if (ret_val) { +- hw_dbg("Error Forcing Speed and Duplex\n"); ++ DEBUGOUT("Error Forcing Speed and Duplex\n"); + goto out; + } + } + +- ret_val = igb_configure_pcs_link_82575(hw); ++ ret_val = e1000_configure_pcs_link_82575(hw); + if (ret_val) + goto out; + +@@ -1059,17 +1483,20 @@ + * Check link status. Wait up to 100 microseconds for link to become + * valid. + */ +- ret_val = igb_phy_has_link(hw, COPPER_LINK_UP_LIMIT, 10, &link); ++ ret_val = e1000_phy_has_link_generic(hw, ++ COPPER_LINK_UP_LIMIT, ++ 10, ++ &link); + if (ret_val) + goto out; + + if (link) { +- hw_dbg("Valid link established!!!\n"); ++ DEBUGOUT("Valid link established!!!\n"); + /* Config the MAC and PHY after link is up */ +- igb_config_collision_dist(hw); +- ret_val = igb_config_fc_after_link_up(hw); ++ e1000_config_collision_dist_generic(hw); ++ ret_val = e1000_config_fc_after_link_up_generic(hw); + } else { +- hw_dbg("Unable to establish link!!!\n"); ++ DEBUGOUT("Unable to establish link!!!\n"); + } + + out: +@@ -1077,14 +1504,16 @@ + } + + /** +- * igb_setup_fiber_serdes_link_82575 - Setup link for fiber/serdes ++ * e1000_setup_fiber_serdes_link_82575 - Setup link for fiber/serdes + * @hw: pointer to the HW structure + * + * Configures speed and duplex for fiber and serdes links. + **/ +-static s32 igb_setup_fiber_serdes_link_82575(struct e1000_hw *hw) ++static s32 e1000_setup_fiber_serdes_link_82575(struct e1000_hw *hw) + { + u32 reg; ++ ++ DEBUGFUNC("e1000_setup_fiber_serdes_link_82575"); + + /* + * On the 82575, SerDes loopback mode persists until it is +@@ -1092,21 +1521,28 @@ + * the register does not indicate its status. Therefore, we ensure + * loopback mode is disabled during initialization. + */ +- wr32(E1000_SCTL, E1000_SCTL_DISABLE_SERDES_LOOPBACK); ++ E1000_WRITE_REG(hw, E1000_SCTL, E1000_SCTL_DISABLE_SERDES_LOOPBACK); + + /* Force link up, set 1gb, set both sw defined pins */ +- reg = rd32(E1000_CTRL); ++ reg = E1000_READ_REG(hw, E1000_CTRL); + reg |= E1000_CTRL_SLU | + E1000_CTRL_SPD_1000 | + E1000_CTRL_FRCSPD | + E1000_CTRL_SWDPIN0 | + E1000_CTRL_SWDPIN1; +- wr32(E1000_CTRL, reg); ++ E1000_WRITE_REG(hw, E1000_CTRL, reg); ++ ++ /* Power on phy for 82576 fiber adapters */ ++ if (hw->mac.type == e1000_82576) { ++ reg = E1000_READ_REG(hw, E1000_CTRL_EXT); ++ reg &= ~E1000_CTRL_EXT_SDP7_DATA; ++ E1000_WRITE_REG(hw, E1000_CTRL_EXT, reg); ++ } + + /* Set switch control to serdes energy detect */ +- reg = rd32(E1000_CONNSW); ++ reg = E1000_READ_REG(hw, E1000_CONNSW); + reg |= E1000_CONNSW_ENRGSRC; +- wr32(E1000_CONNSW, reg); ++ E1000_WRITE_REG(hw, E1000_CONNSW, reg); + + /* + * New SerDes mode allows for forcing speed or autonegotiating speed +@@ -1114,7 +1550,7 @@ + * mode that will be compatible with older link partners and switches. + * However, both are supported by the hardware and some drivers/tools. + */ +- reg = rd32(E1000_PCS_LCTL); ++ reg = E1000_READ_REG(hw, E1000_PCS_LCTL); + + reg &= ~(E1000_PCS_LCTL_AN_ENABLE | E1000_PCS_LCTL_FLV_LINK_UP | + E1000_PCS_LCTL_FSD | E1000_PCS_LCTL_FORCE_LINK); +@@ -1125,7 +1561,7 @@ + E1000_PCS_LCTL_FDV_FULL | /* SerDes Full duplex */ + E1000_PCS_LCTL_AN_ENABLE | /* Enable Autoneg */ + E1000_PCS_LCTL_AN_RESTART; /* Restart autoneg */ +- hw_dbg("Configuring Autoneg; PCS_LCTL = 0x%08X\n", reg); ++ DEBUGOUT1("Configuring Autoneg; PCS_LCTL = 0x%08X\n", reg); + } else { + /* Set PCS register for forced speed */ + reg |= E1000_PCS_LCTL_FLV_LINK_UP | /* Force link up */ +@@ -1133,21 +1569,57 @@ + E1000_PCS_LCTL_FDV_FULL | /* SerDes Full duplex */ + E1000_PCS_LCTL_FSD | /* Force Speed */ + E1000_PCS_LCTL_FORCE_LINK; /* Force Link */ +- hw_dbg("Configuring Forced Link; PCS_LCTL = 0x%08X\n", reg); ++ DEBUGOUT1("Configuring Forced Link; PCS_LCTL = 0x%08X\n", reg); + } + + if (hw->mac.type == e1000_82576) { + reg |= E1000_PCS_LCTL_FORCE_FCTRL; +- igb_force_mac_fc(hw); ++ e1000_force_mac_fc_generic(hw); + } + +- wr32(E1000_PCS_LCTL, reg); ++ E1000_WRITE_REG(hw, E1000_PCS_LCTL, reg); + +- return 0; ++ return E1000_SUCCESS; + } + + /** +- * igb_configure_pcs_link_82575 - Configure PCS link ++ * e1000_valid_led_default_82575 - Verify a valid default LED config ++ * @hw: pointer to the HW structure ++ * @data: pointer to the NVM (EEPROM) ++ * ++ * Read the EEPROM for the current default LED configuration. If the ++ * LED configuration is not valid, set to a valid LED configuration. ++ **/ ++static s32 e1000_valid_led_default_82575(struct e1000_hw *hw, u16 *data) ++{ ++ s32 ret_val; ++ ++ DEBUGFUNC("e1000_valid_led_default_82575"); ++ ++ ret_val = hw->nvm.ops.read(hw, NVM_ID_LED_SETTINGS, 1, data); ++ if (ret_val) { ++ DEBUGOUT("NVM Read Error\n"); ++ goto out; ++ } ++ ++ if (*data == ID_LED_RESERVED_0000 || *data == ID_LED_RESERVED_FFFF) { ++ switch(hw->phy.media_type) { ++ case e1000_media_type_fiber: ++ case e1000_media_type_internal_serdes: ++ *data = ID_LED_DEFAULT_82575_SERDES; ++ break; ++ case e1000_media_type_copper: ++ default: ++ *data = ID_LED_DEFAULT; ++ break; ++ } ++ } ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_configure_pcs_link_82575 - Configure PCS link + * @hw: pointer to the HW structure + * + * Configure the physical coding sub-layer (PCS) link. The PCS link is +@@ -1155,17 +1627,19 @@ + * independent interface (sgmii) is being used. Configures the link + * for auto-negotiation or forces speed/duplex. + **/ +-static s32 igb_configure_pcs_link_82575(struct e1000_hw *hw) ++static s32 e1000_configure_pcs_link_82575(struct e1000_hw *hw) + { + struct e1000_mac_info *mac = &hw->mac; + u32 reg = 0; + ++ DEBUGFUNC("e1000_configure_pcs_link_82575"); ++ + if (hw->phy.media_type != e1000_media_type_copper || +- !(igb_sgmii_active_82575(hw))) ++ !(e1000_sgmii_active_82575(hw))) + goto out; + + /* For SGMII, we need to issue a PCS autoneg restart */ +- reg = rd32(E1000_PCS_LCTL); ++ reg = E1000_READ_REG(hw, E1000_PCS_LCTL); + + /* AN time out should be disabled for SGMII mode */ + reg &= ~(E1000_PCS_LCTL_AN_TIMEOUT); +@@ -1184,9 +1658,9 @@ + + /* Turn off bits for full duplex, speed, and autoneg */ + reg &= ~(E1000_PCS_LCTL_FSV_1000 | +- E1000_PCS_LCTL_FSV_100 | +- E1000_PCS_LCTL_FDV_FULL | +- E1000_PCS_LCTL_AN_ENABLE); ++ E1000_PCS_LCTL_FSV_100 | ++ E1000_PCS_LCTL_FDV_FULL | ++ E1000_PCS_LCTL_AN_ENABLE); + + /* Check for duplex first */ + if (mac->forced_speed_duplex & E1000_ALL_FULL_DUPLEX) +@@ -1201,157 +1675,175 @@ + E1000_PCS_LCTL_FORCE_LINK | + E1000_PCS_LCTL_FLV_LINK_UP; + +- hw_dbg("Wrote 0x%08X to PCS_LCTL to configure forced link\n", +- reg); ++ DEBUGOUT1("Wrote 0x%08X to PCS_LCTL to configure forced link\n", ++ reg); + } +- wr32(E1000_PCS_LCTL, reg); ++ E1000_WRITE_REG(hw, E1000_PCS_LCTL, reg); + + out: +- return 0; ++ return E1000_SUCCESS; + } + + /** +- * igb_sgmii_active_82575 - Return sgmii state ++ * e1000_sgmii_active_82575 - Return sgmii state + * @hw: pointer to the HW structure + * + * 82575 silicon has a serialized gigabit media independent interface (sgmii) + * which can be enabled for use in the embedded applications. Simply + * return the current state of the sgmii interface. + **/ +-static bool igb_sgmii_active_82575(struct e1000_hw *hw) ++static bool e1000_sgmii_active_82575(struct e1000_hw *hw) + { +- struct e1000_dev_spec_82575 *dev_spec; +- bool ret_val; ++ struct e1000_dev_spec_82575 *dev_spec = &hw->dev_spec._82575; + +- if (hw->mac.type != e1000_82575) { +- ret_val = false; +- goto out; +- } ++ DEBUGFUNC("e1000_sgmii_active_82575"); + +- dev_spec = (struct e1000_dev_spec_82575 *)hw->dev_spec; ++ if (hw->mac.type != e1000_82575 && hw->mac.type != e1000_82576) ++ return false; + +- ret_val = dev_spec->sgmii_active; +- +-out: +- return ret_val; ++ return dev_spec->sgmii_active; + } + + /** +- * igb_reset_init_script_82575 - Inits HW defaults after reset ++ * e1000_reset_init_script_82575 - Inits HW defaults after reset + * @hw: pointer to the HW structure + * + * Inits recommended HW defaults after a reset when there is no EEPROM + * detected. This is only for the 82575. + **/ +-static s32 igb_reset_init_script_82575(struct e1000_hw *hw) ++static s32 e1000_reset_init_script_82575(struct e1000_hw* hw) + { ++ DEBUGFUNC("e1000_reset_init_script_82575"); ++ + if (hw->mac.type == e1000_82575) { +- hw_dbg("Running reset init script for 82575\n"); ++ DEBUGOUT("Running reset init script for 82575\n"); + /* SerDes configuration via SERDESCTRL */ +- igb_write_8bit_ctrl_reg(hw, E1000_SCTL, 0x00, 0x0C); +- igb_write_8bit_ctrl_reg(hw, E1000_SCTL, 0x01, 0x78); +- igb_write_8bit_ctrl_reg(hw, E1000_SCTL, 0x1B, 0x23); +- igb_write_8bit_ctrl_reg(hw, E1000_SCTL, 0x23, 0x15); ++ e1000_write_8bit_ctrl_reg_generic(hw, E1000_SCTL, 0x00, 0x0C); ++ e1000_write_8bit_ctrl_reg_generic(hw, E1000_SCTL, 0x01, 0x78); ++ e1000_write_8bit_ctrl_reg_generic(hw, E1000_SCTL, 0x1B, 0x23); ++ e1000_write_8bit_ctrl_reg_generic(hw, E1000_SCTL, 0x23, 0x15); + + /* CCM configuration via CCMCTL register */ +- igb_write_8bit_ctrl_reg(hw, E1000_CCMCTL, 0x14, 0x00); +- igb_write_8bit_ctrl_reg(hw, E1000_CCMCTL, 0x10, 0x00); ++ e1000_write_8bit_ctrl_reg_generic(hw, E1000_CCMCTL, 0x14, 0x00); ++ e1000_write_8bit_ctrl_reg_generic(hw, E1000_CCMCTL, 0x10, 0x00); + + /* PCIe lanes configuration */ +- igb_write_8bit_ctrl_reg(hw, E1000_GIOCTL, 0x00, 0xEC); +- igb_write_8bit_ctrl_reg(hw, E1000_GIOCTL, 0x61, 0xDF); +- igb_write_8bit_ctrl_reg(hw, E1000_GIOCTL, 0x34, 0x05); +- igb_write_8bit_ctrl_reg(hw, E1000_GIOCTL, 0x2F, 0x81); ++ e1000_write_8bit_ctrl_reg_generic(hw, E1000_GIOCTL, 0x00, 0xEC); ++ e1000_write_8bit_ctrl_reg_generic(hw, E1000_GIOCTL, 0x61, 0xDF); ++ e1000_write_8bit_ctrl_reg_generic(hw, E1000_GIOCTL, 0x34, 0x05); ++ e1000_write_8bit_ctrl_reg_generic(hw, E1000_GIOCTL, 0x2F, 0x81); + + /* PCIe PLL Configuration */ +- igb_write_8bit_ctrl_reg(hw, E1000_SCCTL, 0x02, 0x47); +- igb_write_8bit_ctrl_reg(hw, E1000_SCCTL, 0x14, 0x00); +- igb_write_8bit_ctrl_reg(hw, E1000_SCCTL, 0x10, 0x00); ++ e1000_write_8bit_ctrl_reg_generic(hw, E1000_SCCTL, 0x02, 0x47); ++ e1000_write_8bit_ctrl_reg_generic(hw, E1000_SCCTL, 0x14, 0x00); ++ e1000_write_8bit_ctrl_reg_generic(hw, E1000_SCCTL, 0x10, 0x00); + } + +- return 0; ++ return E1000_SUCCESS; + } + + /** +- * igb_read_mac_addr_82575 - Read device MAC address ++ * e1000_read_mac_addr_82575 - Read device MAC address + * @hw: pointer to the HW structure + **/ +-static s32 igb_read_mac_addr_82575(struct e1000_hw *hw) ++static s32 e1000_read_mac_addr_82575(struct e1000_hw *hw) + { +- s32 ret_val = 0; ++ s32 ret_val = E1000_SUCCESS; + +- if (igb_check_alt_mac_addr(hw)) +- ret_val = igb_read_mac_addr(hw); ++ DEBUGFUNC("e1000_read_mac_addr_82575"); ++ if (e1000_check_alt_mac_addr_generic(hw)) ++ ret_val = e1000_read_mac_addr_generic(hw); + + return ret_val; + } + + /** +- * igb_clear_hw_cntrs_82575 - Clear device specific hardware counters ++ * e1000_power_down_phy_copper_82575 - Remove link during PHY power down ++ * @hw: pointer to the HW structure ++ * ++ * In the case of a PHY power down to save power, or to turn off link during a ++ * driver unload, or wake on lan is not enabled, remove the link. ++ **/ ++static void e1000_power_down_phy_copper_82575(struct e1000_hw *hw) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ struct e1000_mac_info *mac = &hw->mac; ++ ++ if (!(phy->ops.check_reset_block)) ++ return; ++ ++ /* If the management interface is not enabled, then power down */ ++ if (!(mac->ops.check_mng_mode(hw) || phy->ops.check_reset_block(hw))) ++ e1000_power_down_phy_copper(hw); ++ ++ return; ++} ++ ++/** ++ * e1000_clear_hw_cntrs_82575 - Clear device specific hardware counters + * @hw: pointer to the HW structure + * + * Clears the hardware counters by reading the counter registers. + **/ +-static void igb_clear_hw_cntrs_82575(struct e1000_hw *hw) ++static void e1000_clear_hw_cntrs_82575(struct e1000_hw *hw) + { +- u32 temp; ++ DEBUGFUNC("e1000_clear_hw_cntrs_82575"); + +- igb_clear_hw_cntrs_base(hw); ++ e1000_clear_hw_cntrs_base_generic(hw); + +- temp = rd32(E1000_PRC64); +- temp = rd32(E1000_PRC127); +- temp = rd32(E1000_PRC255); +- temp = rd32(E1000_PRC511); +- temp = rd32(E1000_PRC1023); +- temp = rd32(E1000_PRC1522); +- temp = rd32(E1000_PTC64); +- temp = rd32(E1000_PTC127); +- temp = rd32(E1000_PTC255); +- temp = rd32(E1000_PTC511); +- temp = rd32(E1000_PTC1023); +- temp = rd32(E1000_PTC1522); ++ E1000_READ_REG(hw, E1000_PRC64); ++ E1000_READ_REG(hw, E1000_PRC127); ++ E1000_READ_REG(hw, E1000_PRC255); ++ E1000_READ_REG(hw, E1000_PRC511); ++ E1000_READ_REG(hw, E1000_PRC1023); ++ E1000_READ_REG(hw, E1000_PRC1522); ++ E1000_READ_REG(hw, E1000_PTC64); ++ E1000_READ_REG(hw, E1000_PTC127); ++ E1000_READ_REG(hw, E1000_PTC255); ++ E1000_READ_REG(hw, E1000_PTC511); ++ E1000_READ_REG(hw, E1000_PTC1023); ++ E1000_READ_REG(hw, E1000_PTC1522); + +- temp = rd32(E1000_ALGNERRC); +- temp = rd32(E1000_RXERRC); +- temp = rd32(E1000_TNCRS); +- temp = rd32(E1000_CEXTERR); +- temp = rd32(E1000_TSCTC); +- temp = rd32(E1000_TSCTFC); ++ E1000_READ_REG(hw, E1000_ALGNERRC); ++ E1000_READ_REG(hw, E1000_RXERRC); ++ E1000_READ_REG(hw, E1000_TNCRS); ++ E1000_READ_REG(hw, E1000_CEXTERR); ++ E1000_READ_REG(hw, E1000_TSCTC); ++ E1000_READ_REG(hw, E1000_TSCTFC); + +- temp = rd32(E1000_MGTPRC); +- temp = rd32(E1000_MGTPDC); +- temp = rd32(E1000_MGTPTC); ++ E1000_READ_REG(hw, E1000_MGTPRC); ++ E1000_READ_REG(hw, E1000_MGTPDC); ++ E1000_READ_REG(hw, E1000_MGTPTC); + +- temp = rd32(E1000_IAC); +- temp = rd32(E1000_ICRXOC); ++ E1000_READ_REG(hw, E1000_IAC); ++ E1000_READ_REG(hw, E1000_ICRXOC); + +- temp = rd32(E1000_ICRXPTC); +- temp = rd32(E1000_ICRXATC); +- temp = rd32(E1000_ICTXPTC); +- temp = rd32(E1000_ICTXATC); +- temp = rd32(E1000_ICTXQEC); +- temp = rd32(E1000_ICTXQMTC); +- temp = rd32(E1000_ICRXDMTC); ++ E1000_READ_REG(hw, E1000_ICRXPTC); ++ E1000_READ_REG(hw, E1000_ICRXATC); ++ E1000_READ_REG(hw, E1000_ICTXPTC); ++ E1000_READ_REG(hw, E1000_ICTXATC); ++ E1000_READ_REG(hw, E1000_ICTXQEC); ++ E1000_READ_REG(hw, E1000_ICTXQMTC); ++ E1000_READ_REG(hw, E1000_ICRXDMTC); + +- temp = rd32(E1000_CBTMPC); +- temp = rd32(E1000_HTDPMC); +- temp = rd32(E1000_CBRMPC); +- temp = rd32(E1000_RPTHC); +- temp = rd32(E1000_HGPTC); +- temp = rd32(E1000_HTCBDPC); +- temp = rd32(E1000_HGORCL); +- temp = rd32(E1000_HGORCH); +- temp = rd32(E1000_HGOTCL); +- temp = rd32(E1000_HGOTCH); +- temp = rd32(E1000_LENERRS); ++ E1000_READ_REG(hw, E1000_CBTMPC); ++ E1000_READ_REG(hw, E1000_HTDPMC); ++ E1000_READ_REG(hw, E1000_CBRMPC); ++ E1000_READ_REG(hw, E1000_RPTHC); ++ E1000_READ_REG(hw, E1000_HGPTC); ++ E1000_READ_REG(hw, E1000_HTCBDPC); ++ E1000_READ_REG(hw, E1000_HGORCL); ++ E1000_READ_REG(hw, E1000_HGORCH); ++ E1000_READ_REG(hw, E1000_HGOTCL); ++ E1000_READ_REG(hw, E1000_HGOTCH); ++ E1000_READ_REG(hw, E1000_LENERRS); + + /* This register should not be read in copper configurations */ + if (hw->phy.media_type == e1000_media_type_internal_serdes) +- temp = rd32(E1000_SCVPC); ++ E1000_READ_REG(hw, E1000_SCVPC); + } +- + /** +- * igb_rx_fifo_flush_82575 - Clean rx fifo after RX enable ++ * e1000_rx_fifo_flush_82575 - Clean rx fifo after RX enable + * @hw: pointer to the HW structure + * + * After rx enable if managability is enabled then there is likely some +@@ -1359,96 +1851,68 @@ + * function clears the fifos and flushes any packets that came in as rx was + * being enabled. + **/ +-void igb_rx_fifo_flush_82575(struct e1000_hw *hw) ++void e1000_rx_fifo_flush_82575(struct e1000_hw *hw) + { + u32 rctl, rlpml, rxdctl[4], rfctl, temp_rctl, rx_enabled; + int i, ms_wait; + ++ DEBUGFUNC("e1000_rx_fifo_workaround_82575"); + if (hw->mac.type != e1000_82575 || +- !(rd32(E1000_MANC) & E1000_MANC_RCV_TCO_EN)) ++ !(E1000_READ_REG(hw, E1000_MANC) & E1000_MANC_RCV_TCO_EN)) + return; + + /* Disable all RX queues */ + for (i = 0; i < 4; i++) { +- rxdctl[i] = rd32(E1000_RXDCTL(i)); +- wr32(E1000_RXDCTL(i), +- rxdctl[i] & ~E1000_RXDCTL_QUEUE_ENABLE); ++ rxdctl[i] = E1000_READ_REG(hw, E1000_RXDCTL(i)); ++ E1000_WRITE_REG(hw, E1000_RXDCTL(i), ++ rxdctl[i] & ~E1000_RXDCTL_QUEUE_ENABLE); + } + /* Poll all queues to verify they have shut down */ + for (ms_wait = 0; ms_wait < 10; ms_wait++) { +- msleep(1); ++ msec_delay(1); + rx_enabled = 0; + for (i = 0; i < 4; i++) +- rx_enabled |= rd32(E1000_RXDCTL(i)); ++ rx_enabled |= E1000_READ_REG(hw, E1000_RXDCTL(i)); + if (!(rx_enabled & E1000_RXDCTL_QUEUE_ENABLE)) + break; + } + + if (ms_wait == 10) +- hw_dbg("Queue disable timed out after 10ms\n"); ++ DEBUGOUT("Queue disable timed out after 10ms\n"); + + /* Clear RLPML, RCTL.SBP, RFCTL.LEF, and set RCTL.LPE so that all + * incoming packets are rejected. Set enable and wait 2ms so that + * any packet that was coming in as RCTL.EN was set is flushed + */ +- rfctl = rd32(E1000_RFCTL); +- wr32(E1000_RFCTL, rfctl & ~E1000_RFCTL_LEF); ++ rfctl = E1000_READ_REG(hw, E1000_RFCTL); ++ E1000_WRITE_REG(hw, E1000_RFCTL, rfctl & ~E1000_RFCTL_LEF); + +- rlpml = rd32(E1000_RLPML); +- wr32(E1000_RLPML, 0); ++ rlpml = E1000_READ_REG(hw, E1000_RLPML); ++ E1000_WRITE_REG(hw, E1000_RLPML, 0); + +- rctl = rd32(E1000_RCTL); ++ rctl = E1000_READ_REG(hw, E1000_RCTL); + temp_rctl = rctl & ~(E1000_RCTL_EN | E1000_RCTL_SBP); + temp_rctl |= E1000_RCTL_LPE; + +- wr32(E1000_RCTL, temp_rctl); +- wr32(E1000_RCTL, temp_rctl | E1000_RCTL_EN); +- wrfl(); +- msleep(2); ++ E1000_WRITE_REG(hw, E1000_RCTL, temp_rctl); ++ E1000_WRITE_REG(hw, E1000_RCTL, temp_rctl | E1000_RCTL_EN); ++ E1000_WRITE_FLUSH(hw); ++ msec_delay(2); + + /* Enable RX queues that were previously enabled and restore our + * previous state + */ + for (i = 0; i < 4; i++) +- wr32(E1000_RXDCTL(i), rxdctl[i]); +- wr32(E1000_RCTL, rctl); +- wrfl(); ++ E1000_WRITE_REG(hw, E1000_RXDCTL(i), rxdctl[i]); ++ E1000_WRITE_REG(hw, E1000_RCTL, rctl); ++ E1000_WRITE_FLUSH(hw); + +- wr32(E1000_RLPML, rlpml); +- wr32(E1000_RFCTL, rfctl); ++ E1000_WRITE_REG(hw, E1000_RLPML, rlpml); ++ E1000_WRITE_REG(hw, E1000_RFCTL, rfctl); + + /* Flush receive errors generated by workaround */ +- rd32(E1000_ROC); +- rd32(E1000_RNBC); +- rd32(E1000_MPC); ++ E1000_READ_REG(hw, E1000_ROC); ++ E1000_READ_REG(hw, E1000_RNBC); ++ E1000_READ_REG(hw, E1000_MPC); + } + +-static struct e1000_mac_operations e1000_mac_ops_82575 = { +- .reset_hw = igb_reset_hw_82575, +- .init_hw = igb_init_hw_82575, +- .check_for_link = igb_check_for_link_82575, +- .rar_set = igb_rar_set, +- .read_mac_addr = igb_read_mac_addr_82575, +- .get_speed_and_duplex = igb_get_speed_and_duplex_copper, +-}; +- +-static struct e1000_phy_operations e1000_phy_ops_82575 = { +- .acquire_phy = igb_acquire_phy_82575, +- .get_cfg_done = igb_get_cfg_done_82575, +- .release_phy = igb_release_phy_82575, +-}; +- +-static struct e1000_nvm_operations e1000_nvm_ops_82575 = { +- .acquire_nvm = igb_acquire_nvm_82575, +- .read_nvm = igb_read_nvm_eerd, +- .release_nvm = igb_release_nvm_82575, +- .write_nvm = igb_write_nvm_spi, +-}; +- +-const struct e1000_info e1000_82575_info = { +- .get_invariants = igb_get_invariants_82575, +- .mac_ops = &e1000_mac_ops_82575, +- .phy_ops = &e1000_phy_ops_82575, +- .nvm_ops = &e1000_nvm_ops_82575, +-}; +- +diff -r f5806398a14e drivers/net/igb/e1000_82575.h +--- a/drivers/net/igb/e1000_82575.h Mon Jun 15 11:45:45 2009 +0100 ++++ b/drivers/net/igb/e1000_82575.h Mon Jun 15 11:59:49 2009 +0100 +@@ -1,7 +1,7 @@ + /******************************************************************************* + + Intel(R) Gigabit Ethernet Linux driver +- Copyright(c) 2007 - 2008 Intel Corporation. ++ Copyright(c) 2007-2009 Intel Corporation. + + This program is free software; you can redistribute it and/or modify it + under the terms and conditions of the GNU General Public License, +@@ -28,23 +28,117 @@ + #ifndef _E1000_82575_H_ + #define _E1000_82575_H_ + +-void igb_update_mc_addr_list_82575(struct e1000_hw*, u8*, u32, u32, u32); +-extern void igb_shutdown_fiber_serdes_link_82575(struct e1000_hw *hw); +-extern void igb_rx_fifo_flush_82575(struct e1000_hw *hw); +- ++#define ID_LED_DEFAULT_82575_SERDES ((ID_LED_DEF1_DEF2 << 12) | \ ++ (ID_LED_DEF1_DEF2 << 8) | \ ++ (ID_LED_DEF1_DEF2 << 4) | \ ++ (ID_LED_OFF1_ON2)) ++/* ++ * Receive Address Register Count ++ * Number of high/low register pairs in the RAR. The RAR (Receive Address ++ * Registers) holds the directed and multicast addresses that we monitor. ++ * These entries are also used for MAC-based filtering. ++ */ ++/* ++ * For 82576, there are an additional set of RARs that begin at an offset ++ * separate from the first set of RARs. ++ */ + #define E1000_RAR_ENTRIES_82575 16 + #define E1000_RAR_ENTRIES_82576 24 + ++struct e1000_adv_data_desc { ++ u64 buffer_addr; /* Address of the descriptor's data buffer */ ++ union { ++ u32 data; ++ struct { ++ u32 datalen :16; /* Data buffer length */ ++ u32 rsvd :4; ++ u32 dtyp :4; /* Descriptor type */ ++ u32 dcmd :8; /* Descriptor command */ ++ } config; ++ } lower; ++ union { ++ u32 data; ++ struct { ++ u32 status :4; /* Descriptor status */ ++ u32 idx :4; ++ u32 popts :6; /* Packet Options */ ++ u32 paylen :18; /* Payload length */ ++ } options; ++ } upper; ++}; ++ ++#define E1000_TXD_DTYP_ADV_C 0x2 /* Advanced Context Descriptor */ ++#define E1000_TXD_DTYP_ADV_D 0x3 /* Advanced Data Descriptor */ ++#define E1000_ADV_TXD_CMD_DEXT 0x20 /* Descriptor extension (0 = legacy) */ ++#define E1000_ADV_TUCMD_IPV4 0x2 /* IP Packet Type: 1=IPv4 */ ++#define E1000_ADV_TUCMD_IPV6 0x0 /* IP Packet Type: 0=IPv6 */ ++#define E1000_ADV_TUCMD_L4T_UDP 0x0 /* L4 Packet TYPE of UDP */ ++#define E1000_ADV_TUCMD_L4T_TCP 0x4 /* L4 Packet TYPE of TCP */ ++#define E1000_ADV_TUCMD_MKRREQ 0x10 /* Indicates markers are required */ ++#define E1000_ADV_DCMD_EOP 0x1 /* End of Packet */ ++#define E1000_ADV_DCMD_IFCS 0x2 /* Insert FCS (Ethernet CRC) */ ++#define E1000_ADV_DCMD_RS 0x8 /* Report Status */ ++#define E1000_ADV_DCMD_VLE 0x40 /* Add VLAN tag */ ++#define E1000_ADV_DCMD_TSE 0x80 /* TCP Seg enable */ ++/* Extended Device Control */ ++#define E1000_CTRL_EXT_NSICR 0x00000001 /* Disable Intr Clear all on read */ ++ ++struct e1000_adv_context_desc { ++ union { ++ u32 ip_config; ++ struct { ++ u32 iplen :9; ++ u32 maclen :7; ++ u32 vlan_tag :16; ++ } fields; ++ } ip_setup; ++ u32 seq_num; ++ union { ++ u64 l4_config; ++ struct { ++ u32 mkrloc :9; ++ u32 tucmd :11; ++ u32 dtyp :4; ++ u32 adv :8; ++ u32 rsvd :4; ++ u32 idx :4; ++ u32 l4len :8; ++ u32 mss :16; ++ } fields; ++ } l4_setup; ++}; ++ + /* SRRCTL bit definitions */ + #define E1000_SRRCTL_BSIZEPKT_SHIFT 10 /* Shift _right_ */ ++#define E1000_SRRCTL_BSIZEHDRSIZE_MASK 0x00000F00 + #define E1000_SRRCTL_BSIZEHDRSIZE_SHIFT 2 /* Shift _left_ */ ++#define E1000_SRRCTL_DESCTYPE_LEGACY 0x00000000 + #define E1000_SRRCTL_DESCTYPE_ADV_ONEBUF 0x02000000 ++#define E1000_SRRCTL_DESCTYPE_HDR_SPLIT 0x04000000 + #define E1000_SRRCTL_DESCTYPE_HDR_SPLIT_ALWAYS 0x0A000000 ++#define E1000_SRRCTL_DESCTYPE_HDR_REPLICATION 0x06000000 ++#define E1000_SRRCTL_DESCTYPE_HDR_REPLICATION_LARGE_PKT 0x08000000 ++#define E1000_SRRCTL_DESCTYPE_MASK 0x0E000000 ++#define E1000_SRRCTL_DROP_EN 0x80000000 ++ ++#define E1000_SRRCTL_BSIZEPKT_MASK 0x0000007F ++#define E1000_SRRCTL_BSIZEHDR_MASK 0x00003F00 ++ ++#define E1000_TX_HEAD_WB_ENABLE 0x1 ++#define E1000_TX_SEQNUM_WB_ENABLE 0x2 + + #define E1000_MRQC_ENABLE_RSS_4Q 0x00000002 ++#define E1000_MRQC_ENABLE_VMDQ 0x00000003 ++#define E1000_MRQC_ENABLE_VMDQ_RSS_2Q 0x00000005 + #define E1000_MRQC_RSS_FIELD_IPV4_UDP 0x00400000 + #define E1000_MRQC_RSS_FIELD_IPV6_UDP 0x00800000 + #define E1000_MRQC_RSS_FIELD_IPV6_UDP_EX 0x01000000 ++ ++#define E1000_VMRCTL_MIRROR_PORT_SHIFT 8 ++#define E1000_VMRCTL_MIRROR_DSTPORT_MASK (7 << E1000_VMRCTL_MIRROR_PORT_SHIFT) ++#define E1000_VMRCTL_POOL_MIRROR_ENABLE (1 << 0) ++#define E1000_VMRCTL_UPLINK_MIRROR_ENABLE (1 << 1) ++#define E1000_VMRCTL_DOWNLINK_MIRROR_ENABLE (1 << 2) + + #define E1000_EICR_TX_QUEUE ( \ + E1000_EICR_TX_QUEUE0 | \ +@@ -61,92 +155,178 @@ + #define E1000_EIMS_RX_QUEUE E1000_EICR_RX_QUEUE + #define E1000_EIMS_TX_QUEUE E1000_EICR_TX_QUEUE + ++#define EIMS_ENABLE_MASK ( \ ++ E1000_EIMS_RX_QUEUE | \ ++ E1000_EIMS_TX_QUEUE | \ ++ E1000_EIMS_TCP_TIMER | \ ++ E1000_EIMS_OTHER) ++ + /* Immediate Interrupt Rx (A.K.A. Low Latency Interrupt) */ ++#define E1000_IMIR_PORT_IM_EN 0x00010000 /* TCP port enable */ ++#define E1000_IMIR_PORT_BP 0x00020000 /* TCP port check bypass */ ++#define E1000_IMIREXT_SIZE_BP 0x00001000 /* Packet size bypass */ ++#define E1000_IMIREXT_CTRL_URG 0x00002000 /* Check URG bit in header */ ++#define E1000_IMIREXT_CTRL_ACK 0x00004000 /* Check ACK bit in header */ ++#define E1000_IMIREXT_CTRL_PSH 0x00008000 /* Check PSH bit in header */ ++#define E1000_IMIREXT_CTRL_RST 0x00010000 /* Check RST bit in header */ ++#define E1000_IMIREXT_CTRL_SYN 0x00020000 /* Check SYN bit in header */ ++#define E1000_IMIREXT_CTRL_FIN 0x00040000 /* Check FIN bit in header */ ++#define E1000_IMIREXT_CTRL_BP 0x00080000 /* Bypass check of ctrl bits */ + + /* Receive Descriptor - Advanced */ + union e1000_adv_rx_desc { + struct { +- __le64 pkt_addr; /* Packet buffer address */ +- __le64 hdr_addr; /* Header buffer address */ ++ u64 pkt_addr; /* Packet buffer address */ ++ u64 hdr_addr; /* Header buffer address */ + } read; + struct { + struct { +- struct { +- __le16 pkt_info; /* RSS type, Packet type */ +- __le16 hdr_info; /* Split Header, +- * header buffer length */ ++ union { ++ u32 data; ++ struct { ++ u16 pkt_info; /* RSS type, Packet type */ ++ u16 hdr_info; /* Split Header, ++ * header buffer length */ ++ } hs_rss; + } lo_dword; + union { +- __le32 rss; /* RSS Hash */ ++ u32 rss; /* RSS Hash */ + struct { +- __le16 ip_id; /* IP id */ +- __le16 csum; /* Packet Checksum */ ++ u16 ip_id; /* IP id */ ++ u16 csum; /* Packet Checksum */ + } csum_ip; + } hi_dword; + } lower; + struct { +- __le32 status_error; /* ext status/error */ +- __le16 length; /* Packet length */ +- __le16 vlan; /* VLAN tag */ ++ u32 status_error; /* ext status/error */ ++ u16 length; /* Packet length */ ++ u16 vlan; /* VLAN tag */ + } upper; + } wb; /* writeback */ + }; + ++#define E1000_RXDADV_RSSTYPE_MASK 0x0000F000 ++#define E1000_RXDADV_RSSTYPE_SHIFT 12 + #define E1000_RXDADV_HDRBUFLEN_MASK 0x7FE0 + #define E1000_RXDADV_HDRBUFLEN_SHIFT 5 ++#define E1000_RXDADV_SPLITHEADER_EN 0x00001000 ++#define E1000_RXDADV_SPH 0x8000 ++#define E1000_RXDADV_ERR_HBO 0x00800000 + + /* RSS Hash results */ ++#define E1000_RXDADV_RSSTYPE_NONE 0x00000000 ++#define E1000_RXDADV_RSSTYPE_IPV4_TCP 0x00000001 ++#define E1000_RXDADV_RSSTYPE_IPV4 0x00000002 ++#define E1000_RXDADV_RSSTYPE_IPV6_TCP 0x00000003 ++#define E1000_RXDADV_RSSTYPE_IPV6_EX 0x00000004 ++#define E1000_RXDADV_RSSTYPE_IPV6 0x00000005 ++#define E1000_RXDADV_RSSTYPE_IPV6_TCP_EX 0x00000006 ++#define E1000_RXDADV_RSSTYPE_IPV4_UDP 0x00000007 ++#define E1000_RXDADV_RSSTYPE_IPV6_UDP 0x00000008 ++#define E1000_RXDADV_RSSTYPE_IPV6_UDP_EX 0x00000009 + + /* RSS Packet Types as indicated in the receive descriptor */ ++#define E1000_RXDADV_PKTTYPE_NONE 0x00000000 + #define E1000_RXDADV_PKTTYPE_IPV4 0x00000010 /* IPV4 hdr present */ ++#define E1000_RXDADV_PKTTYPE_IPV4_EX 0x00000020 /* IPV4 hdr + extensions */ ++#define E1000_RXDADV_PKTTYPE_IPV6 0x00000040 /* IPV6 hdr present */ ++#define E1000_RXDADV_PKTTYPE_IPV6_EX 0x00000080 /* IPV6 hdr + extensions */ + #define E1000_RXDADV_PKTTYPE_TCP 0x00000100 /* TCP hdr present */ ++#define E1000_RXDADV_PKTTYPE_UDP 0x00000200 /* UDP hdr present */ ++#define E1000_RXDADV_PKTTYPE_SCTP 0x00000400 /* SCTP hdr present */ ++#define E1000_RXDADV_PKTTYPE_NFS 0x00000800 /* NFS hdr present */ ++ ++#define E1000_RXDADV_PKTTYPE_IPSEC_ESP 0x00001000 /* IPSec ESP */ ++#define E1000_RXDADV_PKTTYPE_IPSEC_AH 0x00002000 /* IPSec AH */ ++#define E1000_RXDADV_PKTTYPE_LINKSEC 0x00004000 /* LinkSec Encap */ ++#define E1000_RXDADV_PKTTYPE_ETQF 0x00008000 /* PKTTYPE is ETQF index */ ++#define E1000_RXDADV_PKTTYPE_ETQF_MASK 0x00000070 /* ETQF has 8 indices */ ++#define E1000_RXDADV_PKTTYPE_ETQF_SHIFT 4 /* Right-shift 4 bits */ ++ ++/* LinkSec results */ ++/* Security Processing bit Indication */ ++#define E1000_RXDADV_LNKSEC_STATUS_SECP 0x00020000 ++#define E1000_RXDADV_LNKSEC_ERROR_BIT_MASK 0x18000000 ++#define E1000_RXDADV_LNKSEC_ERROR_NO_SA_MATCH 0x08000000 ++#define E1000_RXDADV_LNKSEC_ERROR_REPLAY_ERROR 0x10000000 ++#define E1000_RXDADV_LNKSEC_ERROR_BAD_SIG 0x18000000 ++ ++#define E1000_RXDADV_IPSEC_STATUS_SECP 0x00020000 ++#define E1000_RXDADV_IPSEC_ERROR_BIT_MASK 0x18000000 ++#define E1000_RXDADV_IPSEC_ERROR_INVALID_PROTOCOL 0x08000000 ++#define E1000_RXDADV_IPSEC_ERROR_INVALID_LENGTH 0x10000000 ++#define E1000_RXDADV_IPSEC_ERROR_AUTHENTICATION_FAILED 0x18000000 + + /* Transmit Descriptor - Advanced */ + union e1000_adv_tx_desc { + struct { +- __le64 buffer_addr; /* Address of descriptor's data buf */ +- __le32 cmd_type_len; +- __le32 olinfo_status; ++ u64 buffer_addr; /* Address of descriptor's data buf */ ++ u32 cmd_type_len; ++ u32 olinfo_status; + } read; + struct { +- __le64 rsvd; /* Reserved */ +- __le32 nxtseq_seed; +- __le32 status; ++ u64 rsvd; /* Reserved */ ++ u32 nxtseq_seed; ++ u32 status; + } wb; + }; + + /* Adv Transmit Descriptor Config Masks */ + #define E1000_ADVTXD_DTYP_CTXT 0x00200000 /* Advanced Context Descriptor */ + #define E1000_ADVTXD_DTYP_DATA 0x00300000 /* Advanced Data Descriptor */ ++#define E1000_ADVTXD_DCMD_EOP 0x01000000 /* End of Packet */ + #define E1000_ADVTXD_DCMD_IFCS 0x02000000 /* Insert FCS (Ethernet CRC) */ ++#define E1000_ADVTXD_DCMD_RS 0x08000000 /* Report Status */ ++#define E1000_ADVTXD_DCMD_DDTYP_ISCSI 0x10000000 /* DDP hdr type or iSCSI */ + #define E1000_ADVTXD_DCMD_DEXT 0x20000000 /* Descriptor extension (1=Adv) */ + #define E1000_ADVTXD_DCMD_VLE 0x40000000 /* VLAN pkt enable */ + #define E1000_ADVTXD_DCMD_TSE 0x80000000 /* TCP Seg enable */ ++#define E1000_ADVTXD_MAC_LINKSEC 0x00040000 /* Apply LinkSec on packet */ ++#define E1000_ADVTXD_MAC_TSTAMP 0x00080000 /* IEEE1588 Timestamp packet */ ++#define E1000_ADVTXD_STAT_SN_CRC 0x00000002 /* NXTSEQ/SEED present in WB */ ++#define E1000_ADVTXD_IDX_SHIFT 4 /* Adv desc Index shift */ ++#define E1000_ADVTXD_POPTS_ISCO_1ST 0x00000000 /* 1st TSO of iSCSI PDU */ ++#define E1000_ADVTXD_POPTS_ISCO_MDL 0x00000800 /* Middle TSO of iSCSI PDU */ ++#define E1000_ADVTXD_POPTS_ISCO_LAST 0x00001000 /* Last TSO of iSCSI PDU */ ++#define E1000_ADVTXD_POPTS_ISCO_FULL 0x00001800 /* 1st&Last TSO-full iSCSI PDU*/ ++#define E1000_ADVTXD_POPTS_IPSEC 0x00000400 /* IPSec offload request */ + #define E1000_ADVTXD_PAYLEN_SHIFT 14 /* Adv desc PAYLEN shift */ + + /* Context descriptors */ + struct e1000_adv_tx_context_desc { +- __le32 vlan_macip_lens; +- __le32 seqnum_seed; +- __le32 type_tucmd_mlhl; +- __le32 mss_l4len_idx; ++ u32 vlan_macip_lens; ++ u32 seqnum_seed; ++ u32 type_tucmd_mlhl; ++ u32 mss_l4len_idx; + }; + + #define E1000_ADVTXD_MACLEN_SHIFT 9 /* Adv ctxt desc mac len shift */ ++#define E1000_ADVTXD_VLAN_SHIFT 16 /* Adv ctxt vlan tag shift */ + #define E1000_ADVTXD_TUCMD_IPV4 0x00000400 /* IP Packet Type: 1=IPv4 */ ++#define E1000_ADVTXD_TUCMD_IPV6 0x00000000 /* IP Packet Type: 0=IPv6 */ ++#define E1000_ADVTXD_TUCMD_L4T_UDP 0x00000000 /* L4 Packet TYPE of UDP */ + #define E1000_ADVTXD_TUCMD_L4T_TCP 0x00000800 /* L4 Packet TYPE of TCP */ ++#define E1000_ADVTXD_TUCMD_L4T_SCTP 0x00001000 /* L4 Packet TYPE of SCTP */ ++#define E1000_ADVTXD_TUCMD_IPSEC_TYPE_ESP 0x00002000 /* IPSec Type ESP */ + /* IPSec Encrypt Enable for ESP */ ++#define E1000_ADVTXD_TUCMD_IPSEC_ENCRYPT_EN 0x00004000 ++#define E1000_ADVTXD_TUCMD_MKRREQ 0x00002000 /* Req requires Markers and CRC */ + #define E1000_ADVTXD_L4LEN_SHIFT 8 /* Adv ctxt L4LEN shift */ + #define E1000_ADVTXD_MSS_SHIFT 16 /* Adv ctxt MSS shift */ + /* Adv ctxt IPSec SA IDX mask */ ++#define E1000_ADVTXD_IPSEC_SA_INDEX_MASK 0x000000FF + /* Adv ctxt IPSec ESP len mask */ ++#define E1000_ADVTXD_IPSEC_ESP_LEN_MASK 0x000000FF + + /* Additional Transmit Descriptor Control definitions */ + #define E1000_TXDCTL_QUEUE_ENABLE 0x02000000 /* Enable specific Tx Queue */ ++#define E1000_TXDCTL_SWFLSH 0x04000000 /* Tx Desc. write-back flushing */ + /* Tx Queue Arbitration Priority 0=low, 1=high */ ++#define E1000_TXDCTL_PRIORITY 0x08000000 + + /* Additional Receive Descriptor Control definitions */ + #define E1000_RXDCTL_QUEUE_ENABLE 0x02000000 /* Enable specific Rx Queue */ ++#define E1000_RXDCTL_SWFLSH 0x04000000 /* Rx Desc. write-back flushing */ + + /* Direct Cache Access (DCA) definitions */ + #define E1000_DCA_CTRL_DCA_ENABLE 0x00000000 /* DCA Enable */ +@@ -164,10 +344,89 @@ + #define E1000_DCA_TXCTRL_DESC_DCA_EN (1 << 5) /* DCA Tx Desc enable */ + #define E1000_DCA_TXCTRL_TX_WB_RO_EN (1 << 11) /* Tx Desc writeback RO bit */ + +-/* Additional DCA related definitions, note change in position of CPUID */ + #define E1000_DCA_TXCTRL_CPUID_MASK_82576 0xFF000000 /* Tx CPUID Mask */ + #define E1000_DCA_RXCTRL_CPUID_MASK_82576 0xFF000000 /* Rx CPUID Mask */ +-#define E1000_DCA_TXCTRL_CPUID_SHIFT 24 /* Tx CPUID now in the last byte */ +-#define E1000_DCA_RXCTRL_CPUID_SHIFT 24 /* Rx CPUID now in the last byte */ ++#define E1000_DCA_TXCTRL_CPUID_SHIFT_82576 24 /* Tx CPUID */ ++#define E1000_DCA_RXCTRL_CPUID_SHIFT_82576 24 /* Rx CPUID */ + +-#endif ++/* Additional interrupt register bit definitions */ ++#define E1000_ICR_LSECPNS 0x00000020 /* PN threshold - server */ ++#define E1000_IMS_LSECPNS E1000_ICR_LSECPNS /* PN threshold - server */ ++#define E1000_ICS_LSECPNS E1000_ICR_LSECPNS /* PN threshold - server */ ++ ++/* ETQF register bit definitions */ ++#define E1000_ETQF_FILTER_ENABLE (1 << 26) ++#define E1000_ETQF_IMM_INT (1 << 29) ++#define E1000_ETQF_1588 (1 << 30) ++#define E1000_ETQF_QUEUE_ENABLE (1 << 31) ++/* ++ * ETQF filter list: one static filter per filter consumer. This is ++ * to avoid filter collisions later. Add new filters ++ * here!! ++ * ++ * Current filters: ++ * EAPOL 802.1x (0x888e): Filter 0 ++ */ ++#define E1000_ETQF_FILTER_EAPOL 0 ++ ++#define E1000_NVM_APME_82575 0x0400 ++#define MAX_NUM_VFS 8 ++ ++#define E1000_DTXSWC_MAC_SPOOF_MASK 0x000000FF /* Per VF MAC spoof control */ ++#define E1000_DTXSWC_VLAN_SPOOF_MASK 0x0000FF00 /* Per VF VLAN spoof control */ ++#define E1000_DTXSWC_LLE_MASK 0x00FF0000 /* Per VF Local LB enables */ ++#define E1000_DTXSWC_VLAN_SPOOF_SHIFT 8 ++#define E1000_DTXSWC_LLE_SHIFT 16 ++#define E1000_DTXSWC_VMDQ_LOOPBACK_EN (1 << 31) /* global VF LB enable */ ++ ++/* Easy defines for setting default pool, would normally be left a zero */ ++#define E1000_VT_CTL_DEFAULT_POOL_SHIFT 7 ++#define E1000_VT_CTL_DEFAULT_POOL_MASK (0x7 << E1000_VT_CTL_DEFAULT_POOL_SHIFT) ++ ++/* Other useful VMD_CTL register defines */ ++#define E1000_VT_CTL_IGNORE_MAC (1 << 28) ++#define E1000_VT_CTL_DISABLE_DEF_POOL (1 << 29) ++#define E1000_VT_CTL_VM_REPL_EN (1 << 30) ++ ++/* Per VM Offload register setup */ ++#define E1000_VMOLR_RLPML_MASK 0x00003FFF /* Long Packet Maximum Length mask */ ++#define E1000_VMOLR_LPE 0x00010000 /* Accept Long packet */ ++#define E1000_VMOLR_RSSE 0x00020000 /* Enable RSS */ ++#define E1000_VMOLR_AUPE 0x01000000 /* Accept untagged packets */ ++#define E1000_VMOLR_ROMPE 0x02000000 /* Accept overflow multicast */ ++#define E1000_VMOLR_ROPE 0x04000000 /* Accept overflow unicast */ ++#define E1000_VMOLR_BAM 0x08000000 /* Accept Broadcast packets */ ++#define E1000_VMOLR_MPME 0x10000000 /* Multicast promiscuous mode */ ++#define E1000_VMOLR_STRVLAN 0x40000000 /* Vlan stripping enable */ ++#define E1000_VMOLR_STRCRC 0x80000000 /* CRC stripping enable */ ++ ++#define E1000_VLVF_ARRAY_SIZE 32 ++#define E1000_VLVF_VLANID_MASK 0x00000FFF ++#define E1000_VLVF_POOLSEL_SHIFT 12 ++#define E1000_VLVF_POOLSEL_MASK (0xFF << E1000_VLVF_POOLSEL_SHIFT) ++#define E1000_VLVF_LVLAN 0x00100000 ++#define E1000_VLVF_VLANID_ENABLE 0x80000000 ++ ++#define E1000_VF_INIT_TIMEOUT 200 /* Number of retries to clear RSTI */ ++ ++#define E1000_IOVCTL 0x05BBC ++#define E1000_IOVCTL_REUSE_VFQ 0x00000001 ++ ++#define ALL_QUEUES 0xFFFF ++ ++void e1000_vmdq_loopback_enable_pf(struct e1000_hw *hw); ++void e1000_vmdq_loopback_disable_pf(struct e1000_hw *hw); ++void e1000_vmdq_replication_enable_pf(struct e1000_hw *hw, u32 enables); ++void e1000_vmdq_replication_disable_pf(struct e1000_hw *hw); ++void e1000_vmdq_enable_replication_mode_pf(struct e1000_hw *hw); ++void e1000_vmdq_broadcast_replication_enable_pf(struct e1000_hw *hw, ++ u32 enables); ++void e1000_vmdq_multicast_promiscuous_enable_pf(struct e1000_hw *hw, ++ u32 enables); ++void e1000_vmdq_broadcast_replication_disable_pf(struct e1000_hw *hw, ++ u32 disables); ++void e1000_vmdq_multicast_promiscuous_disable_pf(struct e1000_hw *hw, ++ u32 disables); ++void e1000_vmdq_aupe_enable_pf(struct e1000_hw *hw, u32 enables); ++void e1000_vmdq_aupe_disable_pf(struct e1000_hw *hw, u32 disables); ++#endif /* _E1000_82575_H_ */ +diff -r f5806398a14e drivers/net/igb/e1000_api.c +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/igb/e1000_api.c Mon Jun 15 11:59:49 2009 +0100 +@@ -0,0 +1,1074 @@ ++/******************************************************************************* ++ ++ Intel(R) Gigabit Ethernet Linux driver ++ Copyright(c) 2007-2009 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++#include "e1000_api.h" ++ ++/** ++ * e1000_init_mac_params - Initialize MAC function pointers ++ * @hw: pointer to the HW structure ++ * ++ * This function initializes the function pointers for the MAC ++ * set of functions. Called by drivers or by e1000_setup_init_funcs. ++ **/ ++s32 e1000_init_mac_params(struct e1000_hw *hw) ++{ ++ s32 ret_val = E1000_SUCCESS; ++ ++ if (hw->mac.ops.init_params) { ++ ret_val = hw->mac.ops.init_params(hw); ++ if (ret_val) { ++ DEBUGOUT("MAC Initialization Error\n"); ++ goto out; ++ } ++ } else { ++ DEBUGOUT("mac.init_mac_params was NULL\n"); ++ ret_val = -E1000_ERR_CONFIG; ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_init_nvm_params - Initialize NVM function pointers ++ * @hw: pointer to the HW structure ++ * ++ * This function initializes the function pointers for the NVM ++ * set of functions. Called by drivers or by e1000_setup_init_funcs. ++ **/ ++s32 e1000_init_nvm_params(struct e1000_hw *hw) ++{ ++ s32 ret_val = E1000_SUCCESS; ++ ++ if (hw->nvm.ops.init_params) { ++ ret_val = hw->nvm.ops.init_params(hw); ++ if (ret_val) { ++ DEBUGOUT("NVM Initialization Error\n"); ++ goto out; ++ } ++ } else { ++ DEBUGOUT("nvm.init_nvm_params was NULL\n"); ++ ret_val = -E1000_ERR_CONFIG; ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_init_phy_params - Initialize PHY function pointers ++ * @hw: pointer to the HW structure ++ * ++ * This function initializes the function pointers for the PHY ++ * set of functions. Called by drivers or by e1000_setup_init_funcs. ++ **/ ++s32 e1000_init_phy_params(struct e1000_hw *hw) ++{ ++ s32 ret_val = E1000_SUCCESS; ++ ++ if (hw->phy.ops.init_params) { ++ ret_val = hw->phy.ops.init_params(hw); ++ if (ret_val) { ++ DEBUGOUT("PHY Initialization Error\n"); ++ goto out; ++ } ++ } else { ++ DEBUGOUT("phy.init_phy_params was NULL\n"); ++ ret_val = -E1000_ERR_CONFIG; ++ } ++ ++out: ++ return ret_val; ++} ++ ++ ++/** ++ * e1000_set_mac_type - Sets MAC type ++ * @hw: pointer to the HW structure ++ * ++ * This function sets the mac type of the adapter based on the ++ * device ID stored in the hw structure. ++ * MUST BE FIRST FUNCTION CALLED (explicitly or through ++ * e1000_setup_init_funcs()). ++ **/ ++s32 e1000_set_mac_type(struct e1000_hw *hw) ++{ ++ struct e1000_mac_info *mac = &hw->mac; ++ s32 ret_val = E1000_SUCCESS; ++ ++ DEBUGFUNC("e1000_set_mac_type"); ++ ++ switch (hw->device_id) { ++ case E1000_DEV_ID_82575EB_COPPER: ++ case E1000_DEV_ID_82575EB_FIBER_SERDES: ++ case E1000_DEV_ID_82575GB_QUAD_COPPER: ++ mac->type = e1000_82575; ++ break; ++ case E1000_DEV_ID_82576: ++ case E1000_DEV_ID_82576_FIBER: ++ case E1000_DEV_ID_82576_SERDES: ++ case E1000_DEV_ID_82576_QUAD_COPPER: ++ case E1000_DEV_ID_82576_NS: ++ mac->type = e1000_82576; ++ break; ++ default: ++ /* Should never have loaded on this device */ ++ ret_val = -E1000_ERR_MAC_INIT; ++ break; ++ } ++ ++ return ret_val; ++} ++ ++/** ++ * e1000_setup_init_funcs - Initializes function pointers ++ * @hw: pointer to the HW structure ++ * @init_device: true will initialize the rest of the function pointers ++ * getting the device ready for use. false will only set ++ * MAC type and the function pointers for the other init ++ * functions. Passing false will not generate any hardware ++ * reads or writes. ++ * ++ * This function must be called by a driver in order to use the rest ++ * of the 'shared' code files. Called by drivers only. ++ **/ ++s32 e1000_setup_init_funcs(struct e1000_hw *hw, bool init_device) ++{ ++ s32 ret_val; ++ ++ /* Can't do much good without knowing the MAC type. */ ++ ret_val = e1000_set_mac_type(hw); ++ if (ret_val) { ++ DEBUGOUT("ERROR: MAC type could not be set properly.\n"); ++ goto out; ++ } ++ ++ if (!hw->hw_addr) { ++ DEBUGOUT("ERROR: Registers not mapped\n"); ++ ret_val = -E1000_ERR_CONFIG; ++ goto out; ++ } ++ ++ /* ++ * Init function pointers to generic implementations. We do this first ++ * allowing a driver module to override it afterward. ++ */ ++ e1000_init_mac_ops_generic(hw); ++ e1000_init_nvm_ops_generic(hw); ++ ++ /* ++ * Set up the init function pointers. These are functions within the ++ * adapter family file that sets up function pointers for the rest of ++ * the functions in that family. ++ */ ++ switch (hw->mac.type) { ++ case e1000_82575: ++ case e1000_82576: ++ e1000_init_function_pointers_82575(hw); ++ break; ++ default: ++ DEBUGOUT("Hardware not supported\n"); ++ ret_val = -E1000_ERR_CONFIG; ++ break; ++ } ++ ++ /* ++ * Initialize the rest of the function pointers. These require some ++ * register reads/writes in some cases. ++ */ ++ if (!(ret_val) && init_device) { ++ ret_val = e1000_init_mac_params(hw); ++ if (ret_val) ++ goto out; ++ ++ ret_val = e1000_init_nvm_params(hw); ++ if (ret_val) ++ goto out; ++ ++ ret_val = e1000_init_phy_params(hw); ++ if (ret_val) ++ goto out; ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_get_bus_info - Obtain bus information for adapter ++ * @hw: pointer to the HW structure ++ * ++ * This will obtain information about the HW bus for which the ++ * adapter is attached and stores it in the hw structure. This is a ++ * function pointer entry point called by drivers. ++ **/ ++s32 e1000_get_bus_info(struct e1000_hw *hw) ++{ ++ if (hw->mac.ops.get_bus_info) ++ return hw->mac.ops.get_bus_info(hw); ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_clear_vfta - Clear VLAN filter table ++ * @hw: pointer to the HW structure ++ * ++ * This clears the VLAN filter table on the adapter. This is a function ++ * pointer entry point called by drivers. ++ **/ ++void e1000_clear_vfta(struct e1000_hw *hw) ++{ ++ if (hw->mac.ops.clear_vfta) ++ hw->mac.ops.clear_vfta(hw); ++} ++ ++/** ++ * e1000_write_vfta - Write value to VLAN filter table ++ * @hw: pointer to the HW structure ++ * @offset: the 32-bit offset in which to write the value to. ++ * @value: the 32-bit value to write at location offset. ++ * ++ * This writes a 32-bit value to a 32-bit offset in the VLAN filter ++ * table. This is a function pointer entry point called by drivers. ++ **/ ++void e1000_write_vfta(struct e1000_hw *hw, u32 offset, u32 value) ++{ ++ if (hw->mac.ops.write_vfta) ++ hw->mac.ops.write_vfta(hw, offset, value); ++} ++ ++/** ++ * e1000_update_mc_addr_list - Update Multicast addresses ++ * @hw: pointer to the HW structure ++ * @mc_addr_list: array of multicast addresses to program ++ * @mc_addr_count: number of multicast addresses to program ++ * @rar_used_count: the first RAR register free to program ++ * @rar_count: total number of supported Receive Address Registers ++ * ++ * Updates the Receive Address Registers and Multicast Table Array. ++ * The caller must have a packed mc_addr_list of multicast addresses. ++ * The parameter rar_count will usually be hw->mac.rar_entry_count ++ * unless there are workarounds that change this. Currently no func pointer ++ * exists and all implementations are handled in the generic version of this ++ * function. ++ **/ ++void e1000_update_mc_addr_list(struct e1000_hw *hw, u8 *mc_addr_list, ++ u32 mc_addr_count, u32 rar_used_count, ++ u32 rar_count) ++{ ++ if (hw->mac.ops.update_mc_addr_list) ++ hw->mac.ops.update_mc_addr_list(hw, ++ mc_addr_list, ++ mc_addr_count, ++ rar_used_count, ++ rar_count); ++} ++ ++/** ++ * e1000_force_mac_fc - Force MAC flow control ++ * @hw: pointer to the HW structure ++ * ++ * Force the MAC's flow control settings. Currently no func pointer exists ++ * and all implementations are handled in the generic version of this ++ * function. ++ **/ ++s32 e1000_force_mac_fc(struct e1000_hw *hw) ++{ ++ return e1000_force_mac_fc_generic(hw); ++} ++ ++/** ++ * e1000_check_for_link - Check/Store link connection ++ * @hw: pointer to the HW structure ++ * ++ * This checks the link condition of the adapter and stores the ++ * results in the hw->mac structure. This is a function pointer entry ++ * point called by drivers. ++ **/ ++s32 e1000_check_for_link(struct e1000_hw *hw) ++{ ++ if (hw->mac.ops.check_for_link) ++ return hw->mac.ops.check_for_link(hw); ++ ++ return -E1000_ERR_CONFIG; ++} ++ ++/** ++ * e1000_check_mng_mode - Check management mode ++ * @hw: pointer to the HW structure ++ * ++ * This checks if the adapter has manageability enabled. ++ * This is a function pointer entry point called by drivers. ++ **/ ++bool e1000_check_mng_mode(struct e1000_hw *hw) ++{ ++ if (hw->mac.ops.check_mng_mode) ++ return hw->mac.ops.check_mng_mode(hw); ++ ++ return false; ++} ++ ++/** ++ * e1000_mng_write_dhcp_info - Writes DHCP info to host interface ++ * @hw: pointer to the HW structure ++ * @buffer: pointer to the host interface ++ * @length: size of the buffer ++ * ++ * Writes the DHCP information to the host interface. ++ **/ ++s32 e1000_mng_write_dhcp_info(struct e1000_hw *hw, u8 *buffer, u16 length) ++{ ++ return e1000_mng_write_dhcp_info_generic(hw, buffer, length); ++} ++ ++/** ++ * e1000_reset_hw - Reset hardware ++ * @hw: pointer to the HW structure ++ * ++ * This resets the hardware into a known state. This is a function pointer ++ * entry point called by drivers. ++ **/ ++s32 e1000_reset_hw(struct e1000_hw *hw) ++{ ++ if (hw->mac.ops.reset_hw) ++ return hw->mac.ops.reset_hw(hw); ++ ++ return -E1000_ERR_CONFIG; ++} ++ ++/** ++ * e1000_init_hw - Initialize hardware ++ * @hw: pointer to the HW structure ++ * ++ * This inits the hardware readying it for operation. This is a function ++ * pointer entry point called by drivers. ++ **/ ++s32 e1000_init_hw(struct e1000_hw *hw) ++{ ++ if (hw->mac.ops.init_hw) ++ return hw->mac.ops.init_hw(hw); ++ ++ return -E1000_ERR_CONFIG; ++} ++ ++/** ++ * e1000_setup_link - Configures link and flow control ++ * @hw: pointer to the HW structure ++ * ++ * This configures link and flow control settings for the adapter. This ++ * is a function pointer entry point called by drivers. While modules can ++ * also call this, they probably call their own version of this function. ++ **/ ++s32 e1000_setup_link(struct e1000_hw *hw) ++{ ++ if (hw->mac.ops.setup_link) ++ return hw->mac.ops.setup_link(hw); ++ ++ return -E1000_ERR_CONFIG; ++} ++ ++/** ++ * e1000_get_speed_and_duplex - Returns current speed and duplex ++ * @hw: pointer to the HW structure ++ * @speed: pointer to a 16-bit value to store the speed ++ * @duplex: pointer to a 16-bit value to store the duplex. ++ * ++ * This returns the speed and duplex of the adapter in the two 'out' ++ * variables passed in. This is a function pointer entry point called ++ * by drivers. ++ **/ ++s32 e1000_get_speed_and_duplex(struct e1000_hw *hw, u16 *speed, u16 *duplex) ++{ ++ if (hw->mac.ops.get_link_up_info) ++ return hw->mac.ops.get_link_up_info(hw, speed, duplex); ++ ++ return -E1000_ERR_CONFIG; ++} ++ ++/** ++ * e1000_setup_led - Configures SW controllable LED ++ * @hw: pointer to the HW structure ++ * ++ * This prepares the SW controllable LED for use and saves the current state ++ * of the LED so it can be later restored. This is a function pointer entry ++ * point called by drivers. ++ **/ ++s32 e1000_setup_led(struct e1000_hw *hw) ++{ ++ if (hw->mac.ops.setup_led) ++ return hw->mac.ops.setup_led(hw); ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_cleanup_led - Restores SW controllable LED ++ * @hw: pointer to the HW structure ++ * ++ * This restores the SW controllable LED to the value saved off by ++ * e1000_setup_led. This is a function pointer entry point called by drivers. ++ **/ ++s32 e1000_cleanup_led(struct e1000_hw *hw) ++{ ++ if (hw->mac.ops.cleanup_led) ++ return hw->mac.ops.cleanup_led(hw); ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_blink_led - Blink SW controllable LED ++ * @hw: pointer to the HW structure ++ * ++ * This starts the adapter LED blinking. Request the LED to be setup first ++ * and cleaned up after. This is a function pointer entry point called by ++ * drivers. ++ **/ ++s32 e1000_blink_led(struct e1000_hw *hw) ++{ ++ if (hw->mac.ops.blink_led) ++ return hw->mac.ops.blink_led(hw); ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_id_led_init - store LED configurations in SW ++ * @hw: pointer to the HW structure ++ * ++ * Initializes the LED config in SW. This is a function pointer entry point ++ * called by drivers. ++ **/ ++s32 e1000_id_led_init(struct e1000_hw *hw) ++{ ++ if (hw->mac.ops.id_led_init) ++ return hw->mac.ops.id_led_init(hw); ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_led_on - Turn on SW controllable LED ++ * @hw: pointer to the HW structure ++ * ++ * Turns the SW defined LED on. This is a function pointer entry point ++ * called by drivers. ++ **/ ++s32 e1000_led_on(struct e1000_hw *hw) ++{ ++ if (hw->mac.ops.led_on) ++ return hw->mac.ops.led_on(hw); ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_led_off - Turn off SW controllable LED ++ * @hw: pointer to the HW structure ++ * ++ * Turns the SW defined LED off. This is a function pointer entry point ++ * called by drivers. ++ **/ ++s32 e1000_led_off(struct e1000_hw *hw) ++{ ++ if (hw->mac.ops.led_off) ++ return hw->mac.ops.led_off(hw); ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_reset_adaptive - Reset adaptive IFS ++ * @hw: pointer to the HW structure ++ * ++ * Resets the adaptive IFS. Currently no func pointer exists and all ++ * implementations are handled in the generic version of this function. ++ **/ ++void e1000_reset_adaptive(struct e1000_hw *hw) ++{ ++ e1000_reset_adaptive_generic(hw); ++} ++ ++/** ++ * e1000_update_adaptive - Update adaptive IFS ++ * @hw: pointer to the HW structure ++ * ++ * Updates adapter IFS. Currently no func pointer exists and all ++ * implementations are handled in the generic version of this function. ++ **/ ++void e1000_update_adaptive(struct e1000_hw *hw) ++{ ++ e1000_update_adaptive_generic(hw); ++} ++ ++/** ++ * e1000_disable_pcie_master - Disable PCI-Express master access ++ * @hw: pointer to the HW structure ++ * ++ * Disables PCI-Express master access and verifies there are no pending ++ * requests. Currently no func pointer exists and all implementations are ++ * handled in the generic version of this function. ++ **/ ++s32 e1000_disable_pcie_master(struct e1000_hw *hw) ++{ ++ return e1000_disable_pcie_master_generic(hw); ++} ++ ++/** ++ * e1000_config_collision_dist - Configure collision distance ++ * @hw: pointer to the HW structure ++ * ++ * Configures the collision distance to the default value and is used ++ * during link setup. ++ **/ ++void e1000_config_collision_dist(struct e1000_hw *hw) ++{ ++ if (hw->mac.ops.config_collision_dist) ++ hw->mac.ops.config_collision_dist(hw); ++} ++ ++/** ++ * e1000_rar_set - Sets a receive address register ++ * @hw: pointer to the HW structure ++ * @addr: address to set the RAR to ++ * @index: the RAR to set ++ * ++ * Sets a Receive Address Register (RAR) to the specified address. ++ **/ ++void e1000_rar_set(struct e1000_hw *hw, u8 *addr, u32 index) ++{ ++ if (hw->mac.ops.rar_set) ++ hw->mac.ops.rar_set(hw, addr, index); ++} ++ ++/** ++ * e1000_validate_mdi_setting - Ensures valid MDI/MDIX SW state ++ * @hw: pointer to the HW structure ++ * ++ * Ensures that the MDI/MDIX SW state is valid. ++ **/ ++s32 e1000_validate_mdi_setting(struct e1000_hw *hw) ++{ ++ if (hw->mac.ops.validate_mdi_setting) ++ return hw->mac.ops.validate_mdi_setting(hw); ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_mta_set - Sets multicast table bit ++ * @hw: pointer to the HW structure ++ * @hash_value: Multicast hash value. ++ * ++ * This sets the bit in the multicast table corresponding to the ++ * hash value. This is a function pointer entry point called by drivers. ++ **/ ++void e1000_mta_set(struct e1000_hw *hw, u32 hash_value) ++{ ++ if (hw->mac.ops.mta_set) ++ hw->mac.ops.mta_set(hw, hash_value); ++} ++ ++/** ++ * e1000_hash_mc_addr - Determines address location in multicast table ++ * @hw: pointer to the HW structure ++ * @mc_addr: Multicast address to hash. ++ * ++ * This hashes an address to determine its location in the multicast ++ * table. Currently no func pointer exists and all implementations ++ * are handled in the generic version of this function. ++ **/ ++u32 e1000_hash_mc_addr(struct e1000_hw *hw, u8 *mc_addr) ++{ ++ return e1000_hash_mc_addr_generic(hw, mc_addr); ++} ++ ++/** ++ * e1000_enable_tx_pkt_filtering - Enable packet filtering on TX ++ * @hw: pointer to the HW structure ++ * ++ * Enables packet filtering on transmit packets if manageability is enabled ++ * and host interface is enabled. ++ * Currently no func pointer exists and all implementations are handled in the ++ * generic version of this function. ++ **/ ++bool e1000_enable_tx_pkt_filtering(struct e1000_hw *hw) ++{ ++ return e1000_enable_tx_pkt_filtering_generic(hw); ++} ++ ++/** ++ * e1000_mng_host_if_write - Writes to the manageability host interface ++ * @hw: pointer to the HW structure ++ * @buffer: pointer to the host interface buffer ++ * @length: size of the buffer ++ * @offset: location in the buffer to write to ++ * @sum: sum of the data (not checksum) ++ * ++ * This function writes the buffer content at the offset given on the host if. ++ * It also does alignment considerations to do the writes in most efficient ++ * way. Also fills up the sum of the buffer in *buffer parameter. ++ **/ ++s32 e1000_mng_host_if_write(struct e1000_hw * hw, u8 *buffer, u16 length, ++ u16 offset, u8 *sum) ++{ ++ if (hw->mac.ops.mng_host_if_write) ++ return hw->mac.ops.mng_host_if_write(hw, buffer, length, ++ offset, sum); ++ ++ return E1000_NOT_IMPLEMENTED; ++} ++ ++/** ++ * e1000_mng_write_cmd_header - Writes manageability command header ++ * @hw: pointer to the HW structure ++ * @hdr: pointer to the host interface command header ++ * ++ * Writes the command header after does the checksum calculation. ++ **/ ++s32 e1000_mng_write_cmd_header(struct e1000_hw *hw, ++ struct e1000_host_mng_command_header *hdr) ++{ ++ if (hw->mac.ops.mng_write_cmd_header) ++ return hw->mac.ops.mng_write_cmd_header(hw, hdr); ++ ++ return E1000_NOT_IMPLEMENTED; ++} ++ ++/** ++ * e1000_mng_enable_host_if - Checks host interface is enabled ++ * @hw: pointer to the HW structure ++ * ++ * Returns E1000_success upon success, else E1000_ERR_HOST_INTERFACE_COMMAND ++ * ++ * This function checks whether the HOST IF is enabled for command operation ++ * and also checks whether the previous command is completed. It busy waits ++ * in case of previous command is not completed. ++ **/ ++s32 e1000_mng_enable_host_if(struct e1000_hw * hw) ++{ ++ if (hw->mac.ops.mng_enable_host_if) ++ return hw->mac.ops.mng_enable_host_if(hw); ++ ++ return E1000_NOT_IMPLEMENTED; ++} ++ ++/** ++ * e1000_wait_autoneg - Waits for autonegotiation completion ++ * @hw: pointer to the HW structure ++ * ++ * Waits for autoneg to complete. Currently no func pointer exists and all ++ * implementations are handled in the generic version of this function. ++ **/ ++s32 e1000_wait_autoneg(struct e1000_hw *hw) ++{ ++ if (hw->mac.ops.wait_autoneg) ++ return hw->mac.ops.wait_autoneg(hw); ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_check_reset_block - Verifies PHY can be reset ++ * @hw: pointer to the HW structure ++ * ++ * Checks if the PHY is in a state that can be reset or if manageability ++ * has it tied up. This is a function pointer entry point called by drivers. ++ **/ ++s32 e1000_check_reset_block(struct e1000_hw *hw) ++{ ++ if (hw->phy.ops.check_reset_block) ++ return hw->phy.ops.check_reset_block(hw); ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_read_phy_reg - Reads PHY register ++ * @hw: pointer to the HW structure ++ * @offset: the register to read ++ * @data: the buffer to store the 16-bit read. ++ * ++ * Reads the PHY register and returns the value in data. ++ * This is a function pointer entry point called by drivers. ++ **/ ++s32 e1000_read_phy_reg(struct e1000_hw *hw, u32 offset, u16 *data) ++{ ++ if (hw->phy.ops.read_reg) ++ return hw->phy.ops.read_reg(hw, offset, data); ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_write_phy_reg - Writes PHY register ++ * @hw: pointer to the HW structure ++ * @offset: the register to write ++ * @data: the value to write. ++ * ++ * Writes the PHY register at offset with the value in data. ++ * This is a function pointer entry point called by drivers. ++ **/ ++s32 e1000_write_phy_reg(struct e1000_hw *hw, u32 offset, u16 data) ++{ ++ if (hw->phy.ops.write_reg) ++ return hw->phy.ops.write_reg(hw, offset, data); ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_release_phy - Generic release PHY ++ * @hw: pointer to the HW structure ++ * ++ * Return if silicon family does not require a semaphore when accessing the ++ * PHY. ++ **/ ++void e1000_release_phy(struct e1000_hw *hw) ++{ ++ if (hw->phy.ops.release) ++ hw->phy.ops.release(hw); ++} ++ ++/** ++ * e1000_acquire_phy - Generic acquire PHY ++ * @hw: pointer to the HW structure ++ * ++ * Return success if silicon family does not require a semaphore when ++ * accessing the PHY. ++ **/ ++s32 e1000_acquire_phy(struct e1000_hw *hw) ++{ ++ if (hw->phy.ops.acquire) ++ return hw->phy.ops.acquire(hw); ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_read_kmrn_reg - Reads register using Kumeran interface ++ * @hw: pointer to the HW structure ++ * @offset: the register to read ++ * @data: the location to store the 16-bit value read. ++ * ++ * Reads a register out of the Kumeran interface. Currently no func pointer ++ * exists and all implementations are handled in the generic version of ++ * this function. ++ **/ ++s32 e1000_read_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 *data) ++{ ++ return e1000_read_kmrn_reg_generic(hw, offset, data); ++} ++ ++/** ++ * e1000_write_kmrn_reg - Writes register using Kumeran interface ++ * @hw: pointer to the HW structure ++ * @offset: the register to write ++ * @data: the value to write. ++ * ++ * Writes a register to the Kumeran interface. Currently no func pointer ++ * exists and all implementations are handled in the generic version of ++ * this function. ++ **/ ++s32 e1000_write_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 data) ++{ ++ return e1000_write_kmrn_reg_generic(hw, offset, data); ++} ++ ++/** ++ * e1000_get_cable_length - Retrieves cable length estimation ++ * @hw: pointer to the HW structure ++ * ++ * This function estimates the cable length and stores them in ++ * hw->phy.min_length and hw->phy.max_length. This is a function pointer ++ * entry point called by drivers. ++ **/ ++s32 e1000_get_cable_length(struct e1000_hw *hw) ++{ ++ if (hw->phy.ops.get_cable_length) ++ return hw->phy.ops.get_cable_length(hw); ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_get_phy_info - Retrieves PHY information from registers ++ * @hw: pointer to the HW structure ++ * ++ * This function gets some information from various PHY registers and ++ * populates hw->phy values with it. This is a function pointer entry ++ * point called by drivers. ++ **/ ++s32 e1000_get_phy_info(struct e1000_hw *hw) ++{ ++ if (hw->phy.ops.get_info) ++ return hw->phy.ops.get_info(hw); ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_phy_hw_reset - Hard PHY reset ++ * @hw: pointer to the HW structure ++ * ++ * Performs a hard PHY reset. This is a function pointer entry point called ++ * by drivers. ++ **/ ++s32 e1000_phy_hw_reset(struct e1000_hw *hw) ++{ ++ if (hw->phy.ops.reset) ++ return hw->phy.ops.reset(hw); ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_phy_commit - Soft PHY reset ++ * @hw: pointer to the HW structure ++ * ++ * Performs a soft PHY reset on those that apply. This is a function pointer ++ * entry point called by drivers. ++ **/ ++s32 e1000_phy_commit(struct e1000_hw *hw) ++{ ++ if (hw->phy.ops.commit) ++ return hw->phy.ops.commit(hw); ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_set_d0_lplu_state - Sets low power link up state for D0 ++ * @hw: pointer to the HW structure ++ * @active: boolean used to enable/disable lplu ++ * ++ * Success returns 0, Failure returns 1 ++ * ++ * The low power link up (lplu) state is set to the power management level D0 ++ * and SmartSpeed is disabled when active is true, else clear lplu for D0 ++ * and enable Smartspeed. LPLU and Smartspeed are mutually exclusive. LPLU ++ * is used during Dx states where the power conservation is most important. ++ * During driver activity, SmartSpeed should be enabled so performance is ++ * maintained. This is a function pointer entry point called by drivers. ++ **/ ++s32 e1000_set_d0_lplu_state(struct e1000_hw *hw, bool active) ++{ ++ if (hw->phy.ops.set_d0_lplu_state) ++ return hw->phy.ops.set_d0_lplu_state(hw, active); ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_set_d3_lplu_state - Sets low power link up state for D3 ++ * @hw: pointer to the HW structure ++ * @active: boolean used to enable/disable lplu ++ * ++ * Success returns 0, Failure returns 1 ++ * ++ * The low power link up (lplu) state is set to the power management level D3 ++ * and SmartSpeed is disabled when active is true, else clear lplu for D3 ++ * and enable Smartspeed. LPLU and Smartspeed are mutually exclusive. LPLU ++ * is used during Dx states where the power conservation is most important. ++ * During driver activity, SmartSpeed should be enabled so performance is ++ * maintained. This is a function pointer entry point called by drivers. ++ **/ ++s32 e1000_set_d3_lplu_state(struct e1000_hw *hw, bool active) ++{ ++ if (hw->phy.ops.set_d3_lplu_state) ++ return hw->phy.ops.set_d3_lplu_state(hw, active); ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_read_mac_addr - Reads MAC address ++ * @hw: pointer to the HW structure ++ * ++ * Reads the MAC address out of the adapter and stores it in the HW structure. ++ * Currently no func pointer exists and all implementations are handled in the ++ * generic version of this function. ++ **/ ++s32 e1000_read_mac_addr(struct e1000_hw *hw) ++{ ++ if (hw->mac.ops.read_mac_addr) ++ return hw->mac.ops.read_mac_addr(hw); ++ ++ return e1000_read_mac_addr_generic(hw); ++} ++ ++/** ++ * e1000_read_pba_num - Read device part number ++ * @hw: pointer to the HW structure ++ * @pba_num: pointer to device part number ++ * ++ * Reads the product board assembly (PBA) number from the EEPROM and stores ++ * the value in pba_num. ++ * Currently no func pointer exists and all implementations are handled in the ++ * generic version of this function. ++ **/ ++s32 e1000_read_pba_num(struct e1000_hw *hw, u32 *pba_num) ++{ ++ return e1000_read_pba_num_generic(hw, pba_num); ++} ++ ++/** ++ * e1000_validate_nvm_checksum - Verifies NVM (EEPROM) checksum ++ * @hw: pointer to the HW structure ++ * ++ * Validates the NVM checksum is correct. This is a function pointer entry ++ * point called by drivers. ++ **/ ++s32 e1000_validate_nvm_checksum(struct e1000_hw *hw) ++{ ++ if (hw->nvm.ops.validate) ++ return hw->nvm.ops.validate(hw); ++ ++ return -E1000_ERR_CONFIG; ++} ++ ++/** ++ * e1000_update_nvm_checksum - Updates NVM (EEPROM) checksum ++ * @hw: pointer to the HW structure ++ * ++ * Updates the NVM checksum. Currently no func pointer exists and all ++ * implementations are handled in the generic version of this function. ++ **/ ++s32 e1000_update_nvm_checksum(struct e1000_hw *hw) ++{ ++ if (hw->nvm.ops.update) ++ return hw->nvm.ops.update(hw); ++ ++ return -E1000_ERR_CONFIG; ++} ++ ++/** ++ * e1000_reload_nvm - Reloads EEPROM ++ * @hw: pointer to the HW structure ++ * ++ * Reloads the EEPROM by setting the "Reinitialize from EEPROM" bit in the ++ * extended control register. ++ **/ ++void e1000_reload_nvm(struct e1000_hw *hw) ++{ ++ if (hw->nvm.ops.reload) ++ hw->nvm.ops.reload(hw); ++} ++ ++/** ++ * e1000_read_nvm - Reads NVM (EEPROM) ++ * @hw: pointer to the HW structure ++ * @offset: the word offset to read ++ * @words: number of 16-bit words to read ++ * @data: pointer to the properly sized buffer for the data. ++ * ++ * Reads 16-bit chunks of data from the NVM (EEPROM). This is a function ++ * pointer entry point called by drivers. ++ **/ ++s32 e1000_read_nvm(struct e1000_hw *hw, u16 offset, u16 words, u16 *data) ++{ ++ if (hw->nvm.ops.read) ++ return hw->nvm.ops.read(hw, offset, words, data); ++ ++ return -E1000_ERR_CONFIG; ++} ++ ++/** ++ * e1000_write_nvm - Writes to NVM (EEPROM) ++ * @hw: pointer to the HW structure ++ * @offset: the word offset to read ++ * @words: number of 16-bit words to write ++ * @data: pointer to the properly sized buffer for the data. ++ * ++ * Writes 16-bit chunks of data to the NVM (EEPROM). This is a function ++ * pointer entry point called by drivers. ++ **/ ++s32 e1000_write_nvm(struct e1000_hw *hw, u16 offset, u16 words, u16 *data) ++{ ++ if (hw->nvm.ops.write) ++ return hw->nvm.ops.write(hw, offset, words, data); ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_write_8bit_ctrl_reg - Writes 8bit Control register ++ * @hw: pointer to the HW structure ++ * @reg: 32bit register offset ++ * @offset: the register to write ++ * @data: the value to write. ++ * ++ * Writes the PHY register at offset with the value in data. ++ * This is a function pointer entry point called by drivers. ++ **/ ++s32 e1000_write_8bit_ctrl_reg(struct e1000_hw *hw, u32 reg, u32 offset, ++ u8 data) ++{ ++ return e1000_write_8bit_ctrl_reg_generic(hw, reg, offset, data); ++} ++ ++/** ++ * e1000_power_up_phy - Restores link in case of PHY power down ++ * @hw: pointer to the HW structure ++ * ++ * The phy may be powered down to save power, to turn off link when the ++ * driver is unloaded, or wake on lan is not enabled (among others). ++ **/ ++void e1000_power_up_phy(struct e1000_hw *hw) ++{ ++ if (hw->phy.ops.power_up) ++ hw->phy.ops.power_up(hw); ++ ++ e1000_setup_link(hw); ++} ++ ++/** ++ * e1000_power_down_phy - Power down PHY ++ * @hw: pointer to the HW structure ++ * ++ * The phy may be powered down to save power, to turn off link when the ++ * driver is unloaded, or wake on lan is not enabled (among others). ++ **/ ++void e1000_power_down_phy(struct e1000_hw *hw) ++{ ++ if (hw->phy.ops.power_down) ++ hw->phy.ops.power_down(hw); ++} ++ ++/** ++ * e1000_shutdown_fiber_serdes_link - Remove link during power down ++ * @hw: pointer to the HW structure ++ * ++ * Shutdown the optics and PCS on driver unload. ++ **/ ++void e1000_shutdown_fiber_serdes_link(struct e1000_hw *hw) ++{ ++ if (hw->mac.ops.shutdown_serdes) ++ hw->mac.ops.shutdown_serdes(hw); ++} ++ +diff -r f5806398a14e drivers/net/igb/e1000_api.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/igb/e1000_api.h Mon Jun 15 11:59:49 2009 +0100 +@@ -0,0 +1,147 @@ ++/******************************************************************************* ++ ++ Intel(R) Gigabit Ethernet Linux driver ++ Copyright(c) 2007-2009 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++#ifndef _E1000_API_H_ ++#define _E1000_API_H_ ++ ++#include "e1000_hw.h" ++ ++extern void e1000_init_function_pointers_82575(struct e1000_hw *hw); ++extern void e1000_rx_fifo_flush_82575(struct e1000_hw *hw); ++extern void e1000_init_function_pointers_vf(struct e1000_hw *hw); ++extern void e1000_shutdown_fiber_serdes_link(struct e1000_hw *hw); ++ ++s32 e1000_set_mac_type(struct e1000_hw *hw); ++s32 e1000_setup_init_funcs(struct e1000_hw *hw, bool init_device); ++s32 e1000_init_mac_params(struct e1000_hw *hw); ++s32 e1000_init_nvm_params(struct e1000_hw *hw); ++s32 e1000_init_phy_params(struct e1000_hw *hw); ++s32 e1000_get_bus_info(struct e1000_hw *hw); ++void e1000_clear_vfta(struct e1000_hw *hw); ++void e1000_write_vfta(struct e1000_hw *hw, u32 offset, u32 value); ++s32 e1000_force_mac_fc(struct e1000_hw *hw); ++s32 e1000_check_for_link(struct e1000_hw *hw); ++s32 e1000_reset_hw(struct e1000_hw *hw); ++s32 e1000_init_hw(struct e1000_hw *hw); ++s32 e1000_setup_link(struct e1000_hw *hw); ++s32 e1000_get_speed_and_duplex(struct e1000_hw *hw, u16 *speed, ++ u16 *duplex); ++s32 e1000_disable_pcie_master(struct e1000_hw *hw); ++void e1000_config_collision_dist(struct e1000_hw *hw); ++void e1000_rar_set(struct e1000_hw *hw, u8 *addr, u32 index); ++void e1000_mta_set(struct e1000_hw *hw, u32 hash_value); ++u32 e1000_hash_mc_addr(struct e1000_hw *hw, u8 *mc_addr); ++void e1000_update_mc_addr_list(struct e1000_hw *hw, ++ u8 *mc_addr_list, u32 mc_addr_count, ++ u32 rar_used_count, u32 rar_count); ++s32 e1000_setup_led(struct e1000_hw *hw); ++s32 e1000_cleanup_led(struct e1000_hw *hw); ++s32 e1000_check_reset_block(struct e1000_hw *hw); ++s32 e1000_blink_led(struct e1000_hw *hw); ++s32 e1000_led_on(struct e1000_hw *hw); ++s32 e1000_led_off(struct e1000_hw *hw); ++s32 e1000_id_led_init(struct e1000_hw *hw); ++void e1000_reset_adaptive(struct e1000_hw *hw); ++void e1000_update_adaptive(struct e1000_hw *hw); ++s32 e1000_get_cable_length(struct e1000_hw *hw); ++s32 e1000_validate_mdi_setting(struct e1000_hw *hw); ++s32 e1000_read_phy_reg(struct e1000_hw *hw, u32 offset, u16 *data); ++s32 e1000_write_phy_reg(struct e1000_hw *hw, u32 offset, u16 data); ++s32 e1000_write_8bit_ctrl_reg(struct e1000_hw *hw, u32 reg, ++ u32 offset, u8 data); ++s32 e1000_get_phy_info(struct e1000_hw *hw); ++void e1000_release_phy(struct e1000_hw *hw); ++s32 e1000_acquire_phy(struct e1000_hw *hw); ++s32 e1000_phy_hw_reset(struct e1000_hw *hw); ++s32 e1000_phy_commit(struct e1000_hw *hw); ++void e1000_power_up_phy(struct e1000_hw *hw); ++void e1000_power_down_phy(struct e1000_hw *hw); ++s32 e1000_read_mac_addr(struct e1000_hw *hw); ++s32 e1000_read_pba_num(struct e1000_hw *hw, u32 *part_num); ++void e1000_reload_nvm(struct e1000_hw *hw); ++s32 e1000_update_nvm_checksum(struct e1000_hw *hw); ++s32 e1000_validate_nvm_checksum(struct e1000_hw *hw); ++s32 e1000_read_nvm(struct e1000_hw *hw, u16 offset, u16 words, u16 *data); ++s32 e1000_read_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 *data); ++s32 e1000_write_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 data); ++s32 e1000_write_nvm(struct e1000_hw *hw, u16 offset, u16 words, ++ u16 *data); ++s32 e1000_wait_autoneg(struct e1000_hw *hw); ++s32 e1000_set_d3_lplu_state(struct e1000_hw *hw, bool active); ++s32 e1000_set_d0_lplu_state(struct e1000_hw *hw, bool active); ++bool e1000_check_mng_mode(struct e1000_hw *hw); ++bool e1000_enable_tx_pkt_filtering(struct e1000_hw *hw); ++s32 e1000_mng_enable_host_if(struct e1000_hw *hw); ++s32 e1000_mng_host_if_write(struct e1000_hw *hw, ++ u8 *buffer, u16 length, u16 offset, u8 *sum); ++s32 e1000_mng_write_cmd_header(struct e1000_hw *hw, ++ struct e1000_host_mng_command_header *hdr); ++s32 e1000_mng_write_dhcp_info(struct e1000_hw * hw, ++ u8 *buffer, u16 length); ++ ++/* ++ * TBI_ACCEPT macro definition: ++ * ++ * This macro requires: ++ * adapter = a pointer to struct e1000_hw ++ * status = the 8 bit status field of the Rx descriptor with EOP set ++ * error = the 8 bit error field of the Rx descriptor with EOP set ++ * length = the sum of all the length fields of the Rx descriptors that ++ * make up the current frame ++ * last_byte = the last byte of the frame DMAed by the hardware ++ * max_frame_length = the maximum frame length we want to accept. ++ * min_frame_length = the minimum frame length we want to accept. ++ * ++ * This macro is a conditional that should be used in the interrupt ++ * handler's Rx processing routine when RxErrors have been detected. ++ * ++ * Typical use: ++ * ... ++ * if (TBI_ACCEPT) { ++ * accept_frame = true; ++ * e1000_tbi_adjust_stats(adapter, MacAddress); ++ * frame_length--; ++ * } else { ++ * accept_frame = false; ++ * } ++ * ... ++ */ ++ ++/* The carrier extension symbol, as received by the NIC. */ ++#define CARRIER_EXTENSION 0x0F ++ ++#define TBI_ACCEPT(a, status, errors, length, last_byte, min_frame_size, max_frame_size) \ ++ (e1000_tbi_sbp_enabled_82543(a) && \ ++ (((errors) & E1000_RXD_ERR_FRAME_ERR_MASK) == E1000_RXD_ERR_CE) && \ ++ ((last_byte) == CARRIER_EXTENSION) && \ ++ (((status) & E1000_RXD_STAT_VP) ? \ ++ (((length) > (min_frame_size - VLAN_TAG_SIZE)) && \ ++ ((length) <= (max_frame_size + 1))) : \ ++ (((length) > min_frame_size) && \ ++ ((length) <= (max_frame_size + VLAN_TAG_SIZE + 1))))) ++ ++#endif +diff -r f5806398a14e drivers/net/igb/e1000_defines.h +--- a/drivers/net/igb/e1000_defines.h Mon Jun 15 11:45:45 2009 +0100 ++++ b/drivers/net/igb/e1000_defines.h Mon Jun 15 11:59:49 2009 +0100 +@@ -1,7 +1,7 @@ + /******************************************************************************* + + Intel(R) Gigabit Ethernet Linux driver +- Copyright(c) 2007 - 2008 Intel Corporation. ++ Copyright(c) 2007-2009 Intel Corporation. + + This program is free software; you can redistribute it and/or modify it + under the terms and conditions of the GNU General Public License, +@@ -34,7 +34,14 @@ + + /* Definitions for power management and wakeup registers */ + /* Wake Up Control */ ++#define E1000_WUC_APME 0x00000001 /* APM Enable */ + #define E1000_WUC_PME_EN 0x00000002 /* PME Enable */ ++#define E1000_WUC_PME_STATUS 0x00000004 /* PME Status */ ++#define E1000_WUC_APMPME 0x00000008 /* Assert PME on APM Wakeup */ ++#define E1000_WUC_LSCWE 0x00000010 /* Link Status wake up enable */ ++#define E1000_WUC_LSCWO 0x00000020 /* Link Status wake up override */ ++#define E1000_WUC_SPM 0x80000000 /* Enable SPM */ ++#define E1000_WUC_PHY_WAKE 0x00000100 /* if PHY supports wakeup */ + + /* Wake Up Filter Control */ + #define E1000_WUFC_LNKC 0x00000001 /* Link Status Change Wakeup Enable */ +@@ -45,56 +52,122 @@ + #define E1000_WUFC_ARP 0x00000020 /* ARP Request Packet Wakeup Enable */ + #define E1000_WUFC_IPV4 0x00000040 /* Directed IPv4 Packet Wakeup Enable */ + #define E1000_WUFC_IPV6 0x00000080 /* Directed IPv6 Packet Wakeup Enable */ ++#define E1000_WUFC_IGNORE_TCO 0x00008000 /* Ignore WakeOn TCO packets */ + #define E1000_WUFC_FLX0 0x00010000 /* Flexible Filter 0 Enable */ + #define E1000_WUFC_FLX1 0x00020000 /* Flexible Filter 1 Enable */ + #define E1000_WUFC_FLX2 0x00040000 /* Flexible Filter 2 Enable */ + #define E1000_WUFC_FLX3 0x00080000 /* Flexible Filter 3 Enable */ +-#define E1000_WUFC_FLX_FILTERS 0x000F0000 /* Mask for the 4 flexible filters */ ++#define E1000_WUFC_FLX4 0x00100000 /* Flexible Filter 4 Enable */ ++#define E1000_WUFC_FLX5 0x00200000 /* Flexible Filter 5 Enable */ ++#define E1000_WUFC_ALL_FILTERS 0x000F00FF /* Mask for all wakeup filters */ ++#define E1000_WUFC_FLX_OFFSET 16 /* Offset to the Flexible Filters bits */ ++#define E1000_WUFC_FLX_FILTERS 0x000F0000 /*Mask for the 4 flexible filters */ ++/* ++ * For 82576 to utilize Extended filter masks in addition to ++ * existing (filter) masks ++ */ ++#define E1000_WUFC_EXT_FLX_FILTERS 0x00300000 /* Ext. FLX filter mask */ + + /* Wake Up Status */ ++#define E1000_WUS_LNKC E1000_WUFC_LNKC ++#define E1000_WUS_MAG E1000_WUFC_MAG ++#define E1000_WUS_EX E1000_WUFC_EX ++#define E1000_WUS_MC E1000_WUFC_MC ++#define E1000_WUS_BC E1000_WUFC_BC ++#define E1000_WUS_ARP E1000_WUFC_ARP ++#define E1000_WUS_IPV4 E1000_WUFC_IPV4 ++#define E1000_WUS_IPV6 E1000_WUFC_IPV6 ++#define E1000_WUS_FLX0 E1000_WUFC_FLX0 ++#define E1000_WUS_FLX1 E1000_WUFC_FLX1 ++#define E1000_WUS_FLX2 E1000_WUFC_FLX2 ++#define E1000_WUS_FLX3 E1000_WUFC_FLX3 ++#define E1000_WUS_FLX_FILTERS E1000_WUFC_FLX_FILTERS + + /* Wake Up Packet Length */ ++#define E1000_WUPL_LENGTH_MASK 0x0FFF /* Only the lower 12 bits are valid */ + + /* Four Flexible Filters are supported */ + #define E1000_FLEXIBLE_FILTER_COUNT_MAX 4 ++/* Two Extended Flexible Filters are supported (82576) */ ++#define E1000_EXT_FLEXIBLE_FILTER_COUNT_MAX 2 ++#define E1000_FHFT_LENGTH_OFFSET 0xFC /* Length byte in FHFT */ ++#define E1000_FHFT_LENGTH_MASK 0x0FF /* Length in lower byte */ + + /* Each Flexible Filter is at most 128 (0x80) bytes in length */ + #define E1000_FLEXIBLE_FILTER_SIZE_MAX 128 + ++#define E1000_FFLT_SIZE E1000_FLEXIBLE_FILTER_COUNT_MAX ++#define E1000_FFMT_SIZE E1000_FLEXIBLE_FILTER_SIZE_MAX ++#define E1000_FFVT_SIZE E1000_FLEXIBLE_FILTER_SIZE_MAX + + /* Extended Device Control */ ++#define E1000_CTRL_EXT_GPI0_EN 0x00000001 /* Maps SDP4 to GPI0 */ + #define E1000_CTRL_EXT_GPI1_EN 0x00000002 /* Maps SDP5 to GPI1 */ +-#define E1000_CTRL_EXT_SDP4_DATA 0x00000010 /* Value of SW Defineable Pin 4 */ +-#define E1000_CTRL_EXT_SDP5_DATA 0x00000020 /* Value of SW Defineable Pin 5 */ +-#define E1000_CTRL_EXT_SDP7_DATA 0x00000080 /* Value of SW Defineable Pin 7 */ ++#define E1000_CTRL_EXT_PHYINT_EN E1000_CTRL_EXT_GPI1_EN ++#define E1000_CTRL_EXT_GPI2_EN 0x00000004 /* Maps SDP6 to GPI2 */ ++#define E1000_CTRL_EXT_GPI3_EN 0x00000008 /* Maps SDP7 to GPI3 */ ++/* Reserved (bits 4,5) in >= 82575 */ ++#define E1000_CTRL_EXT_SDP4_DATA 0x00000010 /* Value of SW Definable Pin 4 */ ++#define E1000_CTRL_EXT_SDP5_DATA 0x00000020 /* Value of SW Definable Pin 5 */ ++#define E1000_CTRL_EXT_PHY_INT E1000_CTRL_EXT_SDP5_DATA ++#define E1000_CTRL_EXT_SDP6_DATA 0x00000040 /* Value of SW Definable Pin 6 */ ++#define E1000_CTRL_EXT_SDP7_DATA 0x00000080 /* Value of SW Definable Pin 7 */ ++/* SDP 4/5 (bits 8,9) are reserved in >= 82575 */ + #define E1000_CTRL_EXT_SDP4_DIR 0x00000100 /* Direction of SDP4 0=in 1=out */ ++#define E1000_CTRL_EXT_SDP5_DIR 0x00000200 /* Direction of SDP5 0=in 1=out */ ++#define E1000_CTRL_EXT_SDP6_DIR 0x00000400 /* Direction of SDP6 0=in 1=out */ ++#define E1000_CTRL_EXT_SDP7_DIR 0x00000800 /* Direction of SDP7 0=in 1=out */ ++#define E1000_CTRL_EXT_ASDCHK 0x00001000 /* Initiate an ASD sequence */ + #define E1000_CTRL_EXT_EE_RST 0x00002000 /* Reinitialize from EEPROM */ ++#define E1000_CTRL_EXT_IPS 0x00004000 /* Invert Power State */ ++/* Physical Func Reset Done Indication */ ++#define E1000_CTRL_EXT_PFRSTD 0x00004000 ++#define E1000_CTRL_EXT_SPD_BYPS 0x00008000 /* Speed Select Bypass */ ++#define E1000_CTRL_EXT_RO_DIS 0x00020000 /* Relaxed Ordering disable */ ++#define E1000_CTRL_EXT_DMA_DYN_CLK_EN 0x00080000 /* DMA Dynamic Clock Gating */ + #define E1000_CTRL_EXT_LINK_MODE_MASK 0x00C00000 ++#define E1000_CTRL_EXT_LINK_MODE_GMII 0x00000000 ++#define E1000_CTRL_EXT_LINK_MODE_TBI 0x00C00000 ++#define E1000_CTRL_EXT_LINK_MODE_KMRN 0x00000000 + #define E1000_CTRL_EXT_LINK_MODE_PCIE_SERDES 0x00C00000 ++#define E1000_CTRL_EXT_LINK_MODE_PCIX_SERDES 0x00800000 + #define E1000_CTRL_EXT_LINK_MODE_SGMII 0x00800000 + #define E1000_CTRL_EXT_EIAME 0x01000000 + #define E1000_CTRL_EXT_IRCA 0x00000001 +-/* Interrupt delay cancellation */ +-/* Driver loaded bit for FW */ +-#define E1000_CTRL_EXT_DRV_LOAD 0x10000000 +-/* Interrupt acknowledge Auto-mask */ +-/* Clear Interrupt timers after IMS clear */ +-/* packet buffer parity error detection enabled */ +-/* descriptor FIFO parity error detection enable */ ++#define E1000_CTRL_EXT_WR_WMARK_MASK 0x03000000 ++#define E1000_CTRL_EXT_WR_WMARK_256 0x00000000 ++#define E1000_CTRL_EXT_WR_WMARK_320 0x01000000 ++#define E1000_CTRL_EXT_WR_WMARK_384 0x02000000 ++#define E1000_CTRL_EXT_WR_WMARK_448 0x03000000 ++#define E1000_CTRL_EXT_CANC 0x04000000 /* Int delay cancellation */ ++#define E1000_CTRL_EXT_DRV_LOAD 0x10000000 /* Driver loaded bit for FW */ ++/* IAME enable bit (27) was removed in >= 82575 */ ++#define E1000_CTRL_EXT_IAME 0x08000000 /* Int acknowledge Auto-mask */ ++#define E1000_CTRL_EXT_INT_TIMER_CLR 0x20000000 /* Clear Interrupt timers ++ * after IMS clear */ ++#define E1000_CRTL_EXT_PB_PAREN 0x01000000 /* packet buffer parity error ++ * detection enabled */ ++#define E1000_CTRL_EXT_DF_PAREN 0x02000000 /* descriptor FIFO parity ++ * error detection enable */ ++#define E1000_CTRL_EXT_GHOST_PAREN 0x40000000 + #define E1000_CTRL_EXT_PBA_CLR 0x80000000 /* PBA Clear */ + #define E1000_I2CCMD_REG_ADDR_SHIFT 16 ++#define E1000_I2CCMD_REG_ADDR 0x00FF0000 + #define E1000_I2CCMD_PHY_ADDR_SHIFT 24 ++#define E1000_I2CCMD_PHY_ADDR 0x07000000 + #define E1000_I2CCMD_OPCODE_READ 0x08000000 + #define E1000_I2CCMD_OPCODE_WRITE 0x00000000 ++#define E1000_I2CCMD_RESET 0x10000000 + #define E1000_I2CCMD_READY 0x20000000 ++#define E1000_I2CCMD_INTERRUPT_ENA 0x40000000 + #define E1000_I2CCMD_ERROR 0x80000000 + #define E1000_MAX_SGMII_PHY_REG_ADDR 255 + #define E1000_I2CCMD_PHY_TIMEOUT 200 +-#define E1000_IVAR_VALID 0x80 +-#define E1000_GPIE_NSICR 0x00000001 +-#define E1000_GPIE_MSIX_MODE 0x00000010 +-#define E1000_GPIE_EIAME 0x40000000 +-#define E1000_GPIE_PBA 0x80000000 ++#define E1000_IVAR_VALID 0x80 ++#define E1000_GPIE_NSICR 0x00000001 ++#define E1000_GPIE_MSIX_MODE 0x00000010 ++#define E1000_GPIE_EIAME 0x40000000 ++#define E1000_GPIE_PBA 0x80000000 + + /* Receive Descriptor bit definitions */ + #define E1000_RXD_STAT_DD 0x01 /* Descriptor Done */ +@@ -103,13 +176,25 @@ + #define E1000_RXD_STAT_VP 0x08 /* IEEE VLAN Packet */ + #define E1000_RXD_STAT_UDPCS 0x10 /* UDP xsum calculated */ + #define E1000_RXD_STAT_TCPCS 0x20 /* TCP xsum calculated */ ++#define E1000_RXD_STAT_IPCS 0x40 /* IP xsum calculated */ ++#define E1000_RXD_STAT_PIF 0x80 /* passed in-exact filter */ ++#define E1000_RXD_STAT_CRCV 0x100 /* Speculative CRC Valid */ ++#define E1000_RXD_STAT_IPIDV 0x200 /* IP identification valid */ ++#define E1000_RXD_STAT_UDPV 0x400 /* Valid UDP checksum */ + #define E1000_RXD_STAT_DYNINT 0x800 /* Pkt caused INT via DYNINT */ ++#define E1000_RXD_STAT_ACK 0x8000 /* ACK Packet indication */ + #define E1000_RXD_ERR_CE 0x01 /* CRC Error */ + #define E1000_RXD_ERR_SE 0x02 /* Symbol Error */ + #define E1000_RXD_ERR_SEQ 0x04 /* Sequence Error */ + #define E1000_RXD_ERR_CXE 0x10 /* Carrier Extension Error */ ++#define E1000_RXD_ERR_TCPE 0x20 /* TCP/UDP Checksum Error */ ++#define E1000_RXD_ERR_IPE 0x40 /* IP Checksum Error */ + #define E1000_RXD_ERR_RXE 0x80 /* Rx Data Error */ + #define E1000_RXD_SPC_VLAN_MASK 0x0FFF /* VLAN ID is in lower 12 bits */ ++#define E1000_RXD_SPC_PRI_MASK 0xE000 /* Priority is in upper 3 bits */ ++#define E1000_RXD_SPC_PRI_SHIFT 13 ++#define E1000_RXD_SPC_CFI_MASK 0x1000 /* CFI is bit 12 */ ++#define E1000_RXD_SPC_CFI_SHIFT 12 + + #define E1000_RXDEXT_STATERR_CE 0x01000000 + #define E1000_RXDEXT_STATERR_SE 0x02000000 +@@ -135,28 +220,58 @@ + E1000_RXDEXT_STATERR_CXE | \ + E1000_RXDEXT_STATERR_RXE) + ++#define E1000_MRQC_ENABLE_MASK 0x00000007 ++#define E1000_MRQC_ENABLE_RSS_2Q 0x00000001 ++#define E1000_MRQC_ENABLE_RSS_INT 0x00000004 ++#define E1000_MRQC_RSS_FIELD_MASK 0xFFFF0000 + #define E1000_MRQC_RSS_FIELD_IPV4_TCP 0x00010000 + #define E1000_MRQC_RSS_FIELD_IPV4 0x00020000 + #define E1000_MRQC_RSS_FIELD_IPV6_TCP_EX 0x00040000 ++#define E1000_MRQC_RSS_FIELD_IPV6_EX 0x00080000 + #define E1000_MRQC_RSS_FIELD_IPV6 0x00100000 + #define E1000_MRQC_RSS_FIELD_IPV6_TCP 0x00200000 + ++#define E1000_RXDPS_HDRSTAT_HDRSP 0x00008000 ++#define E1000_RXDPS_HDRSTAT_HDRLEN_MASK 0x000003FF + + /* Management Control */ + #define E1000_MANC_SMBUS_EN 0x00000001 /* SMBus Enabled - RO */ + #define E1000_MANC_ASF_EN 0x00000002 /* ASF Enabled - RO */ ++#define E1000_MANC_R_ON_FORCE 0x00000004 /* Reset on Force TCO - RO */ ++#define E1000_MANC_RMCP_EN 0x00000100 /* Enable RCMP 026Fh Filtering */ ++#define E1000_MANC_0298_EN 0x00000200 /* Enable RCMP 0298h Filtering */ ++#define E1000_MANC_IPV4_EN 0x00000400 /* Enable IPv4 */ ++#define E1000_MANC_IPV6_EN 0x00000800 /* Enable IPv6 */ ++#define E1000_MANC_SNAP_EN 0x00001000 /* Accept LLC/SNAP */ + #define E1000_MANC_ARP_EN 0x00002000 /* Enable ARP Request Filtering */ + /* Enable Neighbor Discovery Filtering */ ++#define E1000_MANC_NEIGHBOR_EN 0x00004000 ++#define E1000_MANC_ARP_RES_EN 0x00008000 /* Enable ARP response Filtering */ ++#define E1000_MANC_TCO_RESET 0x00010000 /* TCO Reset Occurred */ + #define E1000_MANC_RCV_TCO_EN 0x00020000 /* Receive TCO Packets Enabled */ ++#define E1000_MANC_REPORT_STATUS 0x00040000 /* Status Reporting Enabled */ ++#define E1000_MANC_RCV_ALL 0x00080000 /* Receive All Enabled */ + #define E1000_MANC_BLK_PHY_RST_ON_IDE 0x00040000 /* Block phy resets */ + /* Enable MAC address filtering */ + #define E1000_MANC_EN_MAC_ADDR_FILTER 0x00100000 + /* Enable MNG packets to host memory */ + #define E1000_MANC_EN_MNG2HOST 0x00200000 + /* Enable IP address filtering */ ++#define E1000_MANC_EN_IP_ADDR_FILTER 0x00400000 ++#define E1000_MANC_EN_XSUM_FILTER 0x00800000 /* Enable checksum filtering */ ++#define E1000_MANC_BR_EN 0x01000000 /* Enable broadcast filtering */ ++#define E1000_MANC_SMB_REQ 0x01000000 /* SMBus Request */ ++#define E1000_MANC_SMB_GNT 0x02000000 /* SMBus Grant */ ++#define E1000_MANC_SMB_CLK_IN 0x04000000 /* SMBus Clock In */ ++#define E1000_MANC_SMB_DATA_IN 0x08000000 /* SMBus Data In */ ++#define E1000_MANC_SMB_DATA_OUT 0x10000000 /* SMBus Data Out */ ++#define E1000_MANC_SMB_CLK_OUT 0x20000000 /* SMBus Clock Out */ + ++#define E1000_MANC_SMB_DATA_OUT_SHIFT 28 /* SMBus Data Out Shift */ ++#define E1000_MANC_SMB_CLK_OUT_SHIFT 29 /* SMBus Clock Out Shift */ + + /* Receive Control */ ++#define E1000_RCTL_RST 0x00000001 /* Software reset */ + #define E1000_RCTL_EN 0x00000002 /* enable */ + #define E1000_RCTL_SBP 0x00000004 /* store bad packet */ + #define E1000_RCTL_UPE 0x00000008 /* unicast promiscuous enable */ +@@ -164,9 +279,19 @@ + #define E1000_RCTL_LPE 0x00000020 /* long packet enable */ + #define E1000_RCTL_LBM_NO 0x00000000 /* no loopback mode */ + #define E1000_RCTL_LBM_MAC 0x00000040 /* MAC loopback mode */ ++#define E1000_RCTL_LBM_SLP 0x00000080 /* serial link loopback mode */ + #define E1000_RCTL_LBM_TCVR 0x000000C0 /* tcvr loopback mode */ ++#define E1000_RCTL_DTYP_MASK 0x00000C00 /* Descriptor type mask */ ++#define E1000_RCTL_DTYP_PS 0x00000400 /* Packet Split descriptor */ + #define E1000_RCTL_RDMTS_HALF 0x00000000 /* rx desc min threshold size */ ++#define E1000_RCTL_RDMTS_QUAT 0x00000100 /* rx desc min threshold size */ ++#define E1000_RCTL_RDMTS_EIGTH 0x00000200 /* rx desc min threshold size */ + #define E1000_RCTL_MO_SHIFT 12 /* multicast offset shift */ ++#define E1000_RCTL_MO_0 0x00000000 /* multicast offset 11:0 */ ++#define E1000_RCTL_MO_1 0x00001000 /* multicast offset 12:1 */ ++#define E1000_RCTL_MO_2 0x00002000 /* multicast offset 13:2 */ ++#define E1000_RCTL_MO_3 0x00003000 /* multicast offset 15:4 */ ++#define E1000_RCTL_MDR 0x00004000 /* multicast desc ring 0 */ + #define E1000_RCTL_BAM 0x00008000 /* broadcast enable */ + /* these buffer sizes are valid if E1000_RCTL_BSEX is 0 */ + #define E1000_RCTL_SZ_2048 0x00000000 /* rx buffer size 2048 */ +@@ -179,8 +304,13 @@ + #define E1000_RCTL_SZ_4096 0x00030000 /* rx buffer size 4096 */ + #define E1000_RCTL_VFE 0x00040000 /* vlan filter enable */ + #define E1000_RCTL_CFIEN 0x00080000 /* canonical form enable */ ++#define E1000_RCTL_CFI 0x00100000 /* canonical form indicator */ ++#define E1000_RCTL_DPF 0x00400000 /* discard pause frames */ ++#define E1000_RCTL_PMCF 0x00800000 /* pass MAC control frames */ + #define E1000_RCTL_BSEX 0x02000000 /* Buffer size extension */ + #define E1000_RCTL_SECRC 0x04000000 /* Strip Ethernet CRC */ ++#define E1000_RCTL_FLXBUF_MASK 0x78000000 /* Flexible buffer size */ ++#define E1000_RCTL_FLXBUF_SHIFT 27 /* Flexible buffer shift */ + + /* + * Use byte values for the following shift parameters +@@ -213,77 +343,138 @@ + #define E1000_SWFW_EEP_SM 0x1 + #define E1000_SWFW_PHY0_SM 0x2 + #define E1000_SWFW_PHY1_SM 0x4 ++#define E1000_SWFW_CSR_SM 0x8 + + /* FACTPS Definitions */ ++#define E1000_FACTPS_LFS 0x40000000 /* LAN Function Select */ + /* Device Control */ + #define E1000_CTRL_FD 0x00000001 /* Full duplex.0=half; 1=full */ ++#define E1000_CTRL_BEM 0x00000002 /* Endian Mode.0=little,1=big */ ++#define E1000_CTRL_PRIOR 0x00000004 /* Priority on PCI. 0=rx,1=fair */ + #define E1000_CTRL_GIO_MASTER_DISABLE 0x00000004 /*Blocks new Master requests */ + #define E1000_CTRL_LRST 0x00000008 /* Link reset. 0=normal,1=reset */ ++#define E1000_CTRL_TME 0x00000010 /* Test mode. 0=normal,1=test */ ++#define E1000_CTRL_SLE 0x00000020 /* Serial Link on 0=dis,1=en */ + #define E1000_CTRL_ASDE 0x00000020 /* Auto-speed detect enable */ + #define E1000_CTRL_SLU 0x00000040 /* Set link up (Force Link) */ + #define E1000_CTRL_ILOS 0x00000080 /* Invert Loss-Of Signal */ + #define E1000_CTRL_SPD_SEL 0x00000300 /* Speed Select Mask */ ++#define E1000_CTRL_SPD_10 0x00000000 /* Force 10Mb */ + #define E1000_CTRL_SPD_100 0x00000100 /* Force 100Mb */ + #define E1000_CTRL_SPD_1000 0x00000200 /* Force 1Gb */ ++#define E1000_CTRL_BEM32 0x00000400 /* Big Endian 32 mode */ + #define E1000_CTRL_FRCSPD 0x00000800 /* Force Speed */ + #define E1000_CTRL_FRCDPX 0x00001000 /* Force Duplex */ +-/* Defined polarity of Dock/Undock indication in SDP[0] */ +-/* Reset both PHY ports, through PHYRST_N pin */ +-/* enable link status from external LINK_0 and LINK_1 pins */ ++#define E1000_CTRL_D_UD_EN 0x00002000 /* Dock/Undock enable */ ++#define E1000_CTRL_D_UD_POLARITY 0x00004000 /* Defined polarity of Dock/Undock ++ * indication in SDP[0] */ ++#define E1000_CTRL_FORCE_PHY_RESET 0x00008000 /* Reset both PHY ports, through ++ * PHYRST_N pin */ ++#define E1000_CTRL_EXT_LINK_EN 0x00010000 /* enable link status from external ++ * LINK_0 and LINK_1 pins */ + #define E1000_CTRL_SWDPIN0 0x00040000 /* SWDPIN 0 value */ + #define E1000_CTRL_SWDPIN1 0x00080000 /* SWDPIN 1 value */ + #define E1000_CTRL_SWDPIN2 0x00100000 /* SWDPIN 2 value */ ++#define E1000_CTRL_ADVD3WUC 0x00100000 /* D3 WUC */ + #define E1000_CTRL_SWDPIN3 0x00200000 /* SWDPIN 3 value */ + #define E1000_CTRL_SWDPIO0 0x00400000 /* SWDPIN 0 Input or output */ ++#define E1000_CTRL_SWDPIO1 0x00800000 /* SWDPIN 1 input or output */ + #define E1000_CTRL_SWDPIO2 0x01000000 /* SWDPIN 2 input or output */ + #define E1000_CTRL_SWDPIO3 0x02000000 /* SWDPIN 3 input or output */ + #define E1000_CTRL_RST 0x04000000 /* Global reset */ + #define E1000_CTRL_RFCE 0x08000000 /* Receive Flow Control enable */ + #define E1000_CTRL_TFCE 0x10000000 /* Transmit flow control enable */ ++#define E1000_CTRL_RTE 0x20000000 /* Routing tag enable */ + #define E1000_CTRL_VME 0x40000000 /* IEEE VLAN mode enable */ + #define E1000_CTRL_PHY_RST 0x80000000 /* PHY Reset */ +-/* Initiate an interrupt to manageability engine */ ++#define E1000_CTRL_SW2FW_INT 0x02000000 /* Initiate an interrupt to ME */ + #define E1000_CTRL_I2C_ENA 0x02000000 /* I2C enable */ + +-/* Bit definitions for the Management Data IO (MDIO) and Management Data ++/* ++ * Bit definitions for the Management Data IO (MDIO) and Management Data + * Clock (MDC) pins in the Device Control Register. + */ ++#define E1000_CTRL_PHY_RESET_DIR E1000_CTRL_SWDPIO0 ++#define E1000_CTRL_PHY_RESET E1000_CTRL_SWDPIN0 ++#define E1000_CTRL_MDIO_DIR E1000_CTRL_SWDPIO2 ++#define E1000_CTRL_MDIO E1000_CTRL_SWDPIN2 ++#define E1000_CTRL_MDC_DIR E1000_CTRL_SWDPIO3 ++#define E1000_CTRL_MDC E1000_CTRL_SWDPIN3 ++#define E1000_CTRL_PHY_RESET_DIR4 E1000_CTRL_EXT_SDP4_DIR ++#define E1000_CTRL_PHY_RESET4 E1000_CTRL_EXT_SDP4_DATA + + #define E1000_CONNSW_ENRGSRC 0x4 + #define E1000_PCS_CFG_PCS_EN 8 + #define E1000_PCS_LCTL_FLV_LINK_UP 1 ++#define E1000_PCS_LCTL_FSV_10 0 + #define E1000_PCS_LCTL_FSV_100 2 + #define E1000_PCS_LCTL_FSV_1000 4 + #define E1000_PCS_LCTL_FDV_FULL 8 + #define E1000_PCS_LCTL_FSD 0x10 + #define E1000_PCS_LCTL_FORCE_LINK 0x20 ++#define E1000_PCS_LCTL_LOW_LINK_LATCH 0x40 + #define E1000_PCS_LCTL_FORCE_FCTRL 0x80 + #define E1000_PCS_LCTL_AN_ENABLE 0x10000 + #define E1000_PCS_LCTL_AN_RESTART 0x20000 + #define E1000_PCS_LCTL_AN_TIMEOUT 0x40000 ++#define E1000_PCS_LCTL_AN_SGMII_BYPASS 0x80000 ++#define E1000_PCS_LCTL_AN_SGMII_TRIGGER 0x100000 ++#define E1000_PCS_LCTL_FAST_LINK_TIMER 0x1000000 ++#define E1000_PCS_LCTL_LINK_OK_FIX 0x2000000 ++#define E1000_PCS_LCTL_CRS_ON_NI 0x4000000 + #define E1000_ENABLE_SERDES_LOOPBACK 0x0410 + + #define E1000_PCS_LSTS_LINK_OK 1 ++#define E1000_PCS_LSTS_SPEED_10 0 + #define E1000_PCS_LSTS_SPEED_100 2 + #define E1000_PCS_LSTS_SPEED_1000 4 + #define E1000_PCS_LSTS_DUPLEX_FULL 8 + #define E1000_PCS_LSTS_SYNK_OK 0x10 ++#define E1000_PCS_LSTS_AN_COMPLETE 0x10000 ++#define E1000_PCS_LSTS_AN_PAGE_RX 0x20000 ++#define E1000_PCS_LSTS_AN_TIMED_OUT 0x40000 ++#define E1000_PCS_LSTS_AN_REMOTE_FAULT 0x80000 ++#define E1000_PCS_LSTS_AN_ERROR_RWS 0x100000 + + /* Device Status */ + #define E1000_STATUS_FD 0x00000001 /* Full duplex.0=half,1=full */ + #define E1000_STATUS_LU 0x00000002 /* Link up.0=no,1=link */ + #define E1000_STATUS_FUNC_MASK 0x0000000C /* PCI Function Mask */ + #define E1000_STATUS_FUNC_SHIFT 2 ++#define E1000_STATUS_FUNC_0 0x00000000 /* Function 0 */ + #define E1000_STATUS_FUNC_1 0x00000004 /* Function 1 */ + #define E1000_STATUS_TXOFF 0x00000010 /* transmission paused */ ++#define E1000_STATUS_TBIMODE 0x00000020 /* TBI mode */ ++#define E1000_STATUS_SPEED_MASK 0x000000C0 ++#define E1000_STATUS_SPEED_10 0x00000000 /* Speed 10Mb/s */ + #define E1000_STATUS_SPEED_100 0x00000040 /* Speed 100Mb/s */ + #define E1000_STATUS_SPEED_1000 0x00000080 /* Speed 1000Mb/s */ +-/* Change in Dock/Undock state. Clear on write '0'. */ +-/* Status of Master requests. */ +-#define E1000_STATUS_GIO_MASTER_ENABLE 0x00080000 +-/* BMC external code execution disabled */ ++#define E1000_STATUS_LAN_INIT_DONE 0x00000200 /* Lan Init Completion by NVM */ ++#define E1000_STATUS_ASDV 0x00000300 /* Auto speed detect value */ ++#define E1000_STATUS_DOCK_CI 0x00000800 /* Change in Dock/Undock state. ++ * Clear on write '0'. */ ++#define E1000_STATUS_GIO_MASTER_ENABLE 0x00080000 /* Master request status */ ++#define E1000_STATUS_MTXCKOK 0x00000400 /* MTX clock running OK */ ++#define E1000_STATUS_PCI66 0x00000800 /* In 66Mhz slot */ ++#define E1000_STATUS_BUS64 0x00001000 /* In 64 bit slot */ ++#define E1000_STATUS_PCIX_MODE 0x00002000 /* PCI-X mode */ ++#define E1000_STATUS_PCIX_SPEED 0x0000C000 /* PCI-X bus speed */ ++#define E1000_STATUS_BMC_SKU_0 0x00100000 /* BMC USB redirect disabled */ ++#define E1000_STATUS_BMC_SKU_1 0x00200000 /* BMC SRAM disabled */ ++#define E1000_STATUS_BMC_SKU_2 0x00400000 /* BMC SDRAM disabled */ ++#define E1000_STATUS_BMC_CRYPTO 0x00800000 /* BMC crypto disabled */ ++#define E1000_STATUS_BMC_LITE 0x01000000 /* BMC external code execution ++ * disabled */ ++#define E1000_STATUS_RGMII_ENABLE 0x02000000 /* RGMII disabled */ ++#define E1000_STATUS_FUSE_8 0x04000000 ++#define E1000_STATUS_FUSE_9 0x08000000 ++#define E1000_STATUS_SERDES0_DIS 0x10000000 /* SERDES disabled on port 0 */ ++#define E1000_STATUS_SERDES1_DIS 0x20000000 /* SERDES disabled on port 1 */ + +-/* Constants used to intrepret the masked PCI-X bus speed. */ ++/* Constants used to interpret the masked PCI-X bus speed. */ ++#define E1000_STATUS_PCIX_SPEED_66 0x00000000 /* PCI-X bus speed 50-66 MHz */ ++#define E1000_STATUS_PCIX_SPEED_100 0x00004000 /* PCI-X bus speed 66-100 MHz */ ++#define E1000_STATUS_PCIX_SPEED_133 0x00008000 /* PCI-X bus speed 100-133 MHz */ + + #define SPEED_10 10 + #define SPEED_100 100 +@@ -291,6 +482,7 @@ + #define HALF_DUPLEX 1 + #define FULL_DUPLEX 2 + ++#define PHY_FORCE_TIME 20 + + #define ADVERTISE_10_HALF 0x0001 + #define ADVERTISE_10_FULL 0x0002 +@@ -300,56 +492,127 @@ + #define ADVERTISE_1000_FULL 0x0020 + + /* 1000/H is not supported, nor spec-compliant. */ +-#define E1000_ALL_SPEED_DUPLEX (ADVERTISE_10_HALF | ADVERTISE_10_FULL | \ +- ADVERTISE_100_HALF | ADVERTISE_100_FULL | \ +- ADVERTISE_1000_FULL) +-#define E1000_ALL_NOT_GIG (ADVERTISE_10_HALF | ADVERTISE_10_FULL | \ +- ADVERTISE_100_HALF | ADVERTISE_100_FULL) ++#define E1000_ALL_SPEED_DUPLEX (ADVERTISE_10_HALF | ADVERTISE_10_FULL | \ ++ ADVERTISE_100_HALF | ADVERTISE_100_FULL | \ ++ ADVERTISE_1000_FULL) ++#define E1000_ALL_NOT_GIG (ADVERTISE_10_HALF | ADVERTISE_10_FULL | \ ++ ADVERTISE_100_HALF | ADVERTISE_100_FULL) + #define E1000_ALL_100_SPEED (ADVERTISE_100_HALF | ADVERTISE_100_FULL) +-#define E1000_ALL_10_SPEED (ADVERTISE_10_HALF | ADVERTISE_10_FULL) +-#define E1000_ALL_FULL_DUPLEX (ADVERTISE_10_FULL | ADVERTISE_100_FULL | \ +- ADVERTISE_1000_FULL) +-#define E1000_ALL_HALF_DUPLEX (ADVERTISE_10_HALF | ADVERTISE_100_HALF) ++#define E1000_ALL_10_SPEED (ADVERTISE_10_HALF | ADVERTISE_10_FULL) ++#define E1000_ALL_FULL_DUPLEX (ADVERTISE_10_FULL | ADVERTISE_100_FULL | \ ++ ADVERTISE_1000_FULL) ++#define E1000_ALL_HALF_DUPLEX (ADVERTISE_10_HALF | ADVERTISE_100_HALF) + + #define AUTONEG_ADVERTISE_SPEED_DEFAULT E1000_ALL_SPEED_DUPLEX + + /* LED Control */ + #define E1000_LEDCTL_LED0_MODE_MASK 0x0000000F + #define E1000_LEDCTL_LED0_MODE_SHIFT 0 ++#define E1000_LEDCTL_LED0_BLINK_RATE 0x00000020 + #define E1000_LEDCTL_LED0_IVRT 0x00000040 + #define E1000_LEDCTL_LED0_BLINK 0x00000080 ++#define E1000_LEDCTL_LED1_MODE_MASK 0x00000F00 ++#define E1000_LEDCTL_LED1_MODE_SHIFT 8 ++#define E1000_LEDCTL_LED1_BLINK_RATE 0x00002000 ++#define E1000_LEDCTL_LED1_IVRT 0x00004000 ++#define E1000_LEDCTL_LED1_BLINK 0x00008000 ++#define E1000_LEDCTL_LED2_MODE_MASK 0x000F0000 ++#define E1000_LEDCTL_LED2_MODE_SHIFT 16 ++#define E1000_LEDCTL_LED2_BLINK_RATE 0x00200000 ++#define E1000_LEDCTL_LED2_IVRT 0x00400000 ++#define E1000_LEDCTL_LED2_BLINK 0x00800000 ++#define E1000_LEDCTL_LED3_MODE_MASK 0x0F000000 ++#define E1000_LEDCTL_LED3_MODE_SHIFT 24 ++#define E1000_LEDCTL_LED3_BLINK_RATE 0x20000000 ++#define E1000_LEDCTL_LED3_IVRT 0x40000000 ++#define E1000_LEDCTL_LED3_BLINK 0x80000000 + ++#define E1000_LEDCTL_MODE_LINK_10_1000 0x0 ++#define E1000_LEDCTL_MODE_LINK_100_1000 0x1 ++#define E1000_LEDCTL_MODE_LINK_UP 0x2 ++#define E1000_LEDCTL_MODE_ACTIVITY 0x3 ++#define E1000_LEDCTL_MODE_LINK_ACTIVITY 0x4 ++#define E1000_LEDCTL_MODE_LINK_10 0x5 ++#define E1000_LEDCTL_MODE_LINK_100 0x6 ++#define E1000_LEDCTL_MODE_LINK_1000 0x7 ++#define E1000_LEDCTL_MODE_PCIX_MODE 0x8 ++#define E1000_LEDCTL_MODE_FULL_DUPLEX 0x9 ++#define E1000_LEDCTL_MODE_COLLISION 0xA ++#define E1000_LEDCTL_MODE_BUS_SPEED 0xB ++#define E1000_LEDCTL_MODE_BUS_SIZE 0xC ++#define E1000_LEDCTL_MODE_PAUSED 0xD + #define E1000_LEDCTL_MODE_LED_ON 0xE + #define E1000_LEDCTL_MODE_LED_OFF 0xF + + /* Transmit Descriptor bit definitions */ ++#define E1000_TXD_DTYP_D 0x00100000 /* Data Descriptor */ ++#define E1000_TXD_DTYP_C 0x00000000 /* Context Descriptor */ ++#define E1000_TXD_POPTS_SHIFT 8 /* POPTS shift */ + #define E1000_TXD_POPTS_IXSM 0x01 /* Insert IP checksum */ + #define E1000_TXD_POPTS_TXSM 0x02 /* Insert TCP/UDP checksum */ + #define E1000_TXD_CMD_EOP 0x01000000 /* End of Packet */ + #define E1000_TXD_CMD_IFCS 0x02000000 /* Insert FCS (Ethernet CRC) */ ++#define E1000_TXD_CMD_IC 0x04000000 /* Insert Checksum */ + #define E1000_TXD_CMD_RS 0x08000000 /* Report Status */ ++#define E1000_TXD_CMD_RPS 0x10000000 /* Report Packet Sent */ + #define E1000_TXD_CMD_DEXT 0x20000000 /* Descriptor extension (0 = legacy) */ ++#define E1000_TXD_CMD_VLE 0x40000000 /* Add VLAN tag */ ++#define E1000_TXD_CMD_IDE 0x80000000 /* Enable Tidv register */ ++#define E1000_TXD_STAT_DD 0x00000001 /* Descriptor Done */ ++#define E1000_TXD_STAT_EC 0x00000002 /* Excess Collisions */ ++#define E1000_TXD_STAT_LC 0x00000004 /* Late Collisions */ ++#define E1000_TXD_STAT_TU 0x00000008 /* Transmit underrun */ ++#define E1000_TXD_CMD_TCP 0x01000000 /* TCP packet */ ++#define E1000_TXD_CMD_IP 0x02000000 /* IP packet */ ++#define E1000_TXD_CMD_TSE 0x04000000 /* TCP Seg enable */ ++#define E1000_TXD_STAT_TC 0x00000004 /* Tx Underrun */ + /* Extended desc bits for Linksec and timesync */ + + /* Transmit Control */ ++#define E1000_TCTL_RST 0x00000001 /* software reset */ + #define E1000_TCTL_EN 0x00000002 /* enable tx */ ++#define E1000_TCTL_BCE 0x00000004 /* busy check enable */ + #define E1000_TCTL_PSP 0x00000008 /* pad short packets */ + #define E1000_TCTL_CT 0x00000ff0 /* collision threshold */ + #define E1000_TCTL_COLD 0x003ff000 /* collision distance */ ++#define E1000_TCTL_SWXOFF 0x00400000 /* SW Xoff transmission */ ++#define E1000_TCTL_PBE 0x00800000 /* Packet Burst Enable */ + #define E1000_TCTL_RTLC 0x01000000 /* Re-transmit on late collision */ ++#define E1000_TCTL_NRTU 0x02000000 /* No Re-transmit on underrun */ ++#define E1000_TCTL_MULR 0x10000000 /* Multiple request support */ + + /* Transmit Arbitration Count */ ++#define E1000_TARC0_ENABLE 0x00000400 /* Enable Tx Queue 0 */ + + /* SerDes Control */ + #define E1000_SCTL_DISABLE_SERDES_LOOPBACK 0x0400 + + /* Receive Checksum Control */ ++#define E1000_RXCSUM_PCSS_MASK 0x000000FF /* Packet Checksum Start */ ++#define E1000_RXCSUM_IPOFL 0x00000100 /* IPv4 checksum offload */ + #define E1000_RXCSUM_TUOFL 0x00000200 /* TCP / UDP checksum offload */ ++#define E1000_RXCSUM_IPV6OFL 0x00000400 /* IPv6 checksum offload */ ++#define E1000_RXCSUM_CRCOFL 0x00000800 /* CRC32 offload enable */ + #define E1000_RXCSUM_IPPCSE 0x00001000 /* IP payload checksum enable */ + #define E1000_RXCSUM_PCSD 0x00002000 /* packet checksum disabled */ + + /* Header split receive */ +-#define E1000_RFCTL_LEF 0x00040000 ++#define E1000_RFCTL_ISCSI_DIS 0x00000001 ++#define E1000_RFCTL_ISCSI_DWC_MASK 0x0000003E ++#define E1000_RFCTL_ISCSI_DWC_SHIFT 1 ++#define E1000_RFCTL_NFSW_DIS 0x00000040 ++#define E1000_RFCTL_NFSR_DIS 0x00000080 ++#define E1000_RFCTL_NFS_VER_MASK 0x00000300 ++#define E1000_RFCTL_NFS_VER_SHIFT 8 ++#define E1000_RFCTL_IPV6_DIS 0x00000400 ++#define E1000_RFCTL_IPV6_XSUM_DIS 0x00000800 ++#define E1000_RFCTL_ACK_DIS 0x00001000 ++#define E1000_RFCTL_ACKD_DIS 0x00002000 ++#define E1000_RFCTL_IPFRSP_DIS 0x00004000 ++#define E1000_RFCTL_EXTEN 0x00008000 ++#define E1000_RFCTL_IPV6_EX_DIS 0x00010000 ++#define E1000_RFCTL_NEW_IPV6_EXT_DIS 0x00020000 ++#define E1000_RFCTL_LEF 0x00040000 + + /* Collision related configuration parameters */ + #define E1000_COLLISION_THRESHOLD 15 +@@ -357,19 +620,66 @@ + #define E1000_COLLISION_DISTANCE 63 + #define E1000_COLD_SHIFT 12 + ++/* Default values for the transmit IPG register */ ++#define DEFAULT_82543_TIPG_IPGT_FIBER 9 ++#define DEFAULT_82543_TIPG_IPGT_COPPER 8 ++ ++#define E1000_TIPG_IPGT_MASK 0x000003FF ++#define E1000_TIPG_IPGR1_MASK 0x000FFC00 ++#define E1000_TIPG_IPGR2_MASK 0x3FF00000 ++ ++#define DEFAULT_82543_TIPG_IPGR1 8 ++#define E1000_TIPG_IPGR1_SHIFT 10 ++ ++#define DEFAULT_82543_TIPG_IPGR2 6 ++#define DEFAULT_80003ES2LAN_TIPG_IPGR2 7 ++#define E1000_TIPG_IPGR2_SHIFT 20 ++ + /* Ethertype field values */ + #define ETHERNET_IEEE_VLAN_TYPE 0x8100 /* 802.3ac packet */ + ++#define ETHERNET_FCS_SIZE 4 + #define MAX_JUMBO_FRAME_SIZE 0x3F00 + + /* Extended Configuration Control and Size */ ++#define E1000_EXTCNF_CTRL_MDIO_SW_OWNERSHIP 0x00000020 ++#define E1000_EXTCNF_CTRL_LCD_WRITE_ENABLE 0x00000001 ++#define E1000_EXTCNF_CTRL_SWFLAG 0x00000020 ++#define E1000_EXTCNF_SIZE_EXT_PCIE_LENGTH_MASK 0x00FF0000 ++#define E1000_EXTCNF_SIZE_EXT_PCIE_LENGTH_SHIFT 16 ++#define E1000_EXTCNF_CTRL_EXT_CNF_POINTER_MASK 0x0FFF0000 ++#define E1000_EXTCNF_CTRL_EXT_CNF_POINTER_SHIFT 16 ++ ++#define E1000_PHY_CTRL_SPD_EN 0x00000001 ++#define E1000_PHY_CTRL_D0A_LPLU 0x00000002 ++#define E1000_PHY_CTRL_NOND0A_LPLU 0x00000004 ++#define E1000_PHY_CTRL_NOND0A_GBE_DISABLE 0x00000008 + #define E1000_PHY_CTRL_GBE_DISABLE 0x00000040 + ++#define E1000_KABGTXD_BGSQLBIAS 0x00050000 ++ + /* PBA constants */ +-#define E1000_PBA_16K 0x0010 /* 16KB, default TX allocation */ ++#define E1000_PBA_6K 0x0006 /* 6KB */ ++#define E1000_PBA_8K 0x0008 /* 8KB */ ++#define E1000_PBA_12K 0x000C /* 12KB */ ++#define E1000_PBA_14K 0x000E /* 14KB */ ++#define E1000_PBA_16K 0x0010 /* 16KB */ ++#define E1000_PBA_18K 0x0012 ++#define E1000_PBA_20K 0x0014 ++#define E1000_PBA_22K 0x0016 + #define E1000_PBA_24K 0x0018 ++#define E1000_PBA_26K 0x001A ++#define E1000_PBA_30K 0x001E ++#define E1000_PBA_32K 0x0020 + #define E1000_PBA_34K 0x0022 ++#define E1000_PBA_35K 0x0023 ++#define E1000_PBA_38K 0x0026 ++#define E1000_PBA_40K 0x0028 ++#define E1000_PBA_48K 0x0030 /* 48KB */ + #define E1000_PBA_64K 0x0040 /* 64KB */ ++ ++#define E1000_PBS_16K E1000_PBA_16K ++#define E1000_PBS_24K E1000_PBA_24K + + #define IFS_MAX 80 + #define IFS_MIN 40 +@@ -380,6 +690,8 @@ + /* SW Semaphore Register */ + #define E1000_SWSM_SMBI 0x00000001 /* Driver Semaphore bit */ + #define E1000_SWSM_SWESMBI 0x00000002 /* FW Semaphore bit */ ++#define E1000_SWSM_WMNG 0x00000004 /* Wake MNG Clock */ ++#define E1000_SWSM_DRV_LOAD 0x00000008 /* Driver Loaded Bit */ + + /* Interrupt Cause Read */ + #define E1000_ICR_TXDW 0x00000001 /* Transmit desc written back */ +@@ -389,6 +701,7 @@ + #define E1000_ICR_RXDMT0 0x00000010 /* rx desc min. threshold (0) */ + #define E1000_ICR_RXO 0x00000040 /* rx overrun */ + #define E1000_ICR_RXT0 0x00000080 /* rx timer intr (ring 0) */ ++#define E1000_ICR_VMMB 0x00000100 /* VM MB event */ + #define E1000_ICR_MDAC 0x00000200 /* MDIO access complete */ + #define E1000_ICR_RXCFG 0x00000400 /* Rx /c/ ordered set */ + #define E1000_ICR_GPI_EN0 0x00000800 /* GP Int 0 */ +@@ -400,24 +713,22 @@ + #define E1000_ICR_ACK 0x00020000 /* Receive Ack frame */ + #define E1000_ICR_MNG 0x00040000 /* Manageability event */ + #define E1000_ICR_DOCK 0x00080000 /* Dock/Undock */ +-/* If this bit asserted, the driver should claim the interrupt */ +-#define E1000_ICR_INT_ASSERTED 0x80000000 +-/* queue 0 Rx descriptor FIFO parity error */ +-#define E1000_ICR_RXD_FIFO_PAR0 0x00100000 +-/* queue 0 Tx descriptor FIFO parity error */ +-#define E1000_ICR_TXD_FIFO_PAR0 0x00200000 +-/* host arb read buffer parity error */ +-#define E1000_ICR_HOST_ARB_PAR 0x00400000 ++#define E1000_ICR_INT_ASSERTED 0x80000000 /* If this bit asserted, the driver ++ * should claim the interrupt */ ++#define E1000_ICR_RXD_FIFO_PAR0 0x00100000 /* Q0 Rx desc FIFO parity error */ ++#define E1000_ICR_TXD_FIFO_PAR0 0x00200000 /* Q0 Tx desc FIFO parity error */ ++#define E1000_ICR_HOST_ARB_PAR 0x00400000 /* host arb read buffer parity err */ + #define E1000_ICR_PB_PAR 0x00800000 /* packet buffer parity error */ +-/* queue 1 Rx descriptor FIFO parity error */ +-#define E1000_ICR_RXD_FIFO_PAR1 0x01000000 +-/* queue 1 Tx descriptor FIFO parity error */ +-#define E1000_ICR_TXD_FIFO_PAR1 0x02000000 +-/* FW changed the status of DISSW bit in the FWSM */ +-#define E1000_ICR_DSW 0x00000020 +-/* LAN connected device generates an interrupt */ +-#define E1000_ICR_PHYINT 0x00001000 +-#define E1000_ICR_EPRST 0x00100000 /* ME handware reset occurs */ ++#define E1000_ICR_RXD_FIFO_PAR1 0x01000000 /* Q1 Rx desc FIFO parity error */ ++#define E1000_ICR_TXD_FIFO_PAR1 0x02000000 /* Q1 Tx desc FIFO parity error */ ++#define E1000_ICR_ALL_PARITY 0x03F00000 /* all parity error bits */ ++#define E1000_ICR_DSW 0x00000020 /* FW changed the status of DISSW ++ * bit in the FWSM */ ++#define E1000_ICR_PHYINT 0x00001000 /* LAN connected device generates ++ * an interrupt */ ++#define E1000_ICR_DOUTSYNC 0x10000000 /* NIC DMA out of sync */ ++#define E1000_ICR_EPRST 0x00100000 /* ME hardware reset occurs */ ++ + + /* Extended Interrupt Cause Read */ + #define E1000_EICR_RX_QUEUE0 0x00000001 /* Rx Queue 0 Interrupt */ +@@ -431,6 +742,20 @@ + #define E1000_EICR_TCP_TIMER 0x40000000 /* TCP Timer */ + #define E1000_EICR_OTHER 0x80000000 /* Interrupt Cause Active */ + /* TCP Timer */ ++#define E1000_TCPTIMER_KS 0x00000100 /* KickStart */ ++#define E1000_TCPTIMER_COUNT_ENABLE 0x00000200 /* Count Enable */ ++#define E1000_TCPTIMER_COUNT_FINISH 0x00000400 /* Count finish */ ++#define E1000_TCPTIMER_LOOP 0x00000800 /* Loop */ ++ ++/* ++ * This defines the bits that are set in the Interrupt Mask ++ * Set/Read Register. Each bit is documented below: ++ * o RXDMT0 = Receive Descriptor Minimum Threshold hit (ring 0) ++ * o RXSEQ = Receive Sequence Error ++ */ ++#define POLL_IMS_ENABLE_MASK ( \ ++ E1000_IMS_RXDMT0 | \ ++ E1000_IMS_RXSEQ) + + /* + * This defines the bits that are set in the Interrupt Mask +@@ -450,23 +775,113 @@ + + /* Interrupt Mask Set */ + #define E1000_IMS_TXDW E1000_ICR_TXDW /* Transmit desc written back */ ++#define E1000_IMS_TXQE E1000_ICR_TXQE /* Transmit Queue empty */ + #define E1000_IMS_LSC E1000_ICR_LSC /* Link Status Change */ ++#define E1000_IMS_VMMB E1000_ICR_VMMB /* Mail box activity */ + #define E1000_IMS_RXSEQ E1000_ICR_RXSEQ /* rx sequence error */ + #define E1000_IMS_RXDMT0 E1000_ICR_RXDMT0 /* rx desc min. threshold */ ++#define E1000_IMS_RXO E1000_ICR_RXO /* rx overrun */ + #define E1000_IMS_RXT0 E1000_ICR_RXT0 /* rx timer intr */ ++#define E1000_IMS_MDAC E1000_ICR_MDAC /* MDIO access complete */ ++#define E1000_IMS_RXCFG E1000_ICR_RXCFG /* Rx /c/ ordered set */ ++#define E1000_IMS_GPI_EN0 E1000_ICR_GPI_EN0 /* GP Int 0 */ ++#define E1000_IMS_GPI_EN1 E1000_ICR_GPI_EN1 /* GP Int 1 */ ++#define E1000_IMS_GPI_EN2 E1000_ICR_GPI_EN2 /* GP Int 2 */ ++#define E1000_IMS_GPI_EN3 E1000_ICR_GPI_EN3 /* GP Int 3 */ ++#define E1000_IMS_TXD_LOW E1000_ICR_TXD_LOW ++#define E1000_IMS_SRPD E1000_ICR_SRPD ++#define E1000_IMS_ACK E1000_ICR_ACK /* Receive Ack frame */ ++#define E1000_IMS_MNG E1000_ICR_MNG /* Manageability event */ ++#define E1000_IMS_DOCK E1000_ICR_DOCK /* Dock/Undock */ ++#define E1000_IMS_RXD_FIFO_PAR0 E1000_ICR_RXD_FIFO_PAR0 /* Q0 Rx desc FIFO ++ * parity error */ ++#define E1000_IMS_TXD_FIFO_PAR0 E1000_ICR_TXD_FIFO_PAR0 /* Q0 Tx desc FIFO ++ * parity error */ ++#define E1000_IMS_HOST_ARB_PAR E1000_ICR_HOST_ARB_PAR /* host arb read buffer ++ * parity error */ ++#define E1000_IMS_PB_PAR E1000_ICR_PB_PAR /* packet buffer parity ++ * error */ ++#define E1000_IMS_RXD_FIFO_PAR1 E1000_ICR_RXD_FIFO_PAR1 /* Q1 Rx desc FIFO ++ * parity error */ ++#define E1000_IMS_TXD_FIFO_PAR1 E1000_ICR_TXD_FIFO_PAR1 /* Q1 Tx desc FIFO ++ * parity error */ ++#define E1000_IMS_DSW E1000_ICR_DSW ++#define E1000_IMS_PHYINT E1000_ICR_PHYINT ++#define E1000_IMS_DOUTSYNC E1000_ICR_DOUTSYNC /* NIC DMA out of sync */ ++#define E1000_IMS_EPRST E1000_ICR_EPRST + + /* Extended Interrupt Mask Set */ ++#define E1000_EIMS_RX_QUEUE0 E1000_EICR_RX_QUEUE0 /* Rx Queue 0 Interrupt */ ++#define E1000_EIMS_RX_QUEUE1 E1000_EICR_RX_QUEUE1 /* Rx Queue 1 Interrupt */ ++#define E1000_EIMS_RX_QUEUE2 E1000_EICR_RX_QUEUE2 /* Rx Queue 2 Interrupt */ ++#define E1000_EIMS_RX_QUEUE3 E1000_EICR_RX_QUEUE3 /* Rx Queue 3 Interrupt */ ++#define E1000_EIMS_TX_QUEUE0 E1000_EICR_TX_QUEUE0 /* Tx Queue 0 Interrupt */ ++#define E1000_EIMS_TX_QUEUE1 E1000_EICR_TX_QUEUE1 /* Tx Queue 1 Interrupt */ ++#define E1000_EIMS_TX_QUEUE2 E1000_EICR_TX_QUEUE2 /* Tx Queue 2 Interrupt */ ++#define E1000_EIMS_TX_QUEUE3 E1000_EICR_TX_QUEUE3 /* Tx Queue 3 Interrupt */ + #define E1000_EIMS_TCP_TIMER E1000_EICR_TCP_TIMER /* TCP Timer */ + #define E1000_EIMS_OTHER E1000_EICR_OTHER /* Interrupt Cause Active */ + + /* Interrupt Cause Set */ ++#define E1000_ICS_TXDW E1000_ICR_TXDW /* Transmit desc written back */ ++#define E1000_ICS_TXQE E1000_ICR_TXQE /* Transmit Queue empty */ + #define E1000_ICS_LSC E1000_ICR_LSC /* Link Status Change */ ++#define E1000_ICS_RXSEQ E1000_ICR_RXSEQ /* rx sequence error */ + #define E1000_ICS_RXDMT0 E1000_ICR_RXDMT0 /* rx desc min. threshold */ ++#define E1000_ICS_RXO E1000_ICR_RXO /* rx overrun */ ++#define E1000_ICS_RXT0 E1000_ICR_RXT0 /* rx timer intr */ ++#define E1000_ICS_MDAC E1000_ICR_MDAC /* MDIO access complete */ ++#define E1000_ICS_RXCFG E1000_ICR_RXCFG /* Rx /c/ ordered set */ ++#define E1000_ICS_GPI_EN0 E1000_ICR_GPI_EN0 /* GP Int 0 */ ++#define E1000_ICS_GPI_EN1 E1000_ICR_GPI_EN1 /* GP Int 1 */ ++#define E1000_ICS_GPI_EN2 E1000_ICR_GPI_EN2 /* GP Int 2 */ ++#define E1000_ICS_GPI_EN3 E1000_ICR_GPI_EN3 /* GP Int 3 */ ++#define E1000_ICS_TXD_LOW E1000_ICR_TXD_LOW ++#define E1000_ICS_SRPD E1000_ICR_SRPD ++#define E1000_ICS_ACK E1000_ICR_ACK /* Receive Ack frame */ ++#define E1000_ICS_MNG E1000_ICR_MNG /* Manageability event */ ++#define E1000_ICS_DOCK E1000_ICR_DOCK /* Dock/Undock */ ++#define E1000_ICS_RXD_FIFO_PAR0 E1000_ICR_RXD_FIFO_PAR0 /* Q0 Rx desc FIFO ++ * parity error */ ++#define E1000_ICS_TXD_FIFO_PAR0 E1000_ICR_TXD_FIFO_PAR0 /* Q0 Tx desc FIFO ++ * parity error */ ++#define E1000_ICS_HOST_ARB_PAR E1000_ICR_HOST_ARB_PAR /* host arb read buffer ++ * parity error */ ++#define E1000_ICS_PB_PAR E1000_ICR_PB_PAR /* packet buffer parity ++ * error */ ++#define E1000_ICS_RXD_FIFO_PAR1 E1000_ICR_RXD_FIFO_PAR1 /* Q1 Rx desc FIFO ++ * parity error */ ++#define E1000_ICS_TXD_FIFO_PAR1 E1000_ICR_TXD_FIFO_PAR1 /* Q1 Tx desc FIFO ++ * parity error */ ++#define E1000_ICS_DSW E1000_ICR_DSW ++#define E1000_ICS_DOUTSYNC E1000_ICR_DOUTSYNC /* NIC DMA out of sync */ ++#define E1000_ICS_PHYINT E1000_ICR_PHYINT ++#define E1000_ICS_EPRST E1000_ICR_EPRST + + /* Extended Interrupt Cause Set */ ++#define E1000_EICS_RX_QUEUE0 E1000_EICR_RX_QUEUE0 /* Rx Queue 0 Interrupt */ ++#define E1000_EICS_RX_QUEUE1 E1000_EICR_RX_QUEUE1 /* Rx Queue 1 Interrupt */ ++#define E1000_EICS_RX_QUEUE2 E1000_EICR_RX_QUEUE2 /* Rx Queue 2 Interrupt */ ++#define E1000_EICS_RX_QUEUE3 E1000_EICR_RX_QUEUE3 /* Rx Queue 3 Interrupt */ ++#define E1000_EICS_TX_QUEUE0 E1000_EICR_TX_QUEUE0 /* Tx Queue 0 Interrupt */ ++#define E1000_EICS_TX_QUEUE1 E1000_EICR_TX_QUEUE1 /* Tx Queue 1 Interrupt */ ++#define E1000_EICS_TX_QUEUE2 E1000_EICR_TX_QUEUE2 /* Tx Queue 2 Interrupt */ ++#define E1000_EICS_TX_QUEUE3 E1000_EICR_TX_QUEUE3 /* Tx Queue 3 Interrupt */ ++#define E1000_EICS_TCP_TIMER E1000_EICR_TCP_TIMER /* TCP Timer */ ++#define E1000_EICS_OTHER E1000_EICR_OTHER /* Interrupt Cause Active */ ++ ++#define E1000_EITR_ITR_INT_MASK 0x0000FFFF + + /* Transmit Descriptor Control */ ++#define E1000_TXDCTL_PTHRESH 0x0000003F /* TXDCTL Prefetch Threshold */ ++#define E1000_TXDCTL_HTHRESH 0x00003F00 /* TXDCTL Host Threshold */ ++#define E1000_TXDCTL_WTHRESH 0x003F0000 /* TXDCTL Writeback Threshold */ ++#define E1000_TXDCTL_GRAN 0x01000000 /* TXDCTL Granularity */ ++#define E1000_TXDCTL_LWTHRESH 0xFE000000 /* TXDCTL Low Threshold */ ++#define E1000_TXDCTL_FULL_TX_DESC_WB 0x01010000 /* GRAN=1, WTHRESH=1 */ ++#define E1000_TXDCTL_MAX_TX_DESC_PREFETCH 0x0100001F /* GRAN=1, PTHRESH=31 */ + /* Enable the counting of descriptors still to be processed. */ ++#define E1000_TXDCTL_COUNT_DESC 0x00400000 + + /* Flow Control Constants */ + #define FLOW_CONTROL_ADDRESS_LOW 0x00C28001 +@@ -485,22 +900,31 @@ + * (RAR[15]) for our directed address used by controllers with + * manageability enabled, allowing us room for 15 multicast addresses. + */ ++#define E1000_RAR_ENTRIES 15 + #define E1000_RAH_AV 0x80000000 /* Receive descriptor valid */ ++#define E1000_RAL_MAC_ADDR_LEN 4 ++#define E1000_RAH_MAC_ADDR_LEN 2 ++#define E1000_RAH_POOL_MASK 0x03FC0000 ++#define E1000_RAH_POOL_1 0x00040000 + + /* Error Codes */ ++#define E1000_SUCCESS 0 + #define E1000_ERR_NVM 1 + #define E1000_ERR_PHY 2 + #define E1000_ERR_CONFIG 3 + #define E1000_ERR_PARAM 4 + #define E1000_ERR_MAC_INIT 5 ++#define E1000_ERR_PHY_TYPE 6 + #define E1000_ERR_RESET 9 + #define E1000_ERR_MASTER_REQUESTS_PENDING 10 + #define E1000_ERR_HOST_INTERFACE_COMMAND 11 + #define E1000_BLK_PHY_RESET 12 + #define E1000_ERR_SWFW_SYNC 13 + #define E1000_NOT_IMPLEMENTED 14 ++#define E1000_ERR_MBX 15 + + /* Loop limit on how long we wait for auto-negotiation to complete */ ++#define FIBER_LINK_UP_LIMIT 50 + #define COPPER_LINK_UP_LIMIT 10 + #define PHY_AUTO_NEG_LIMIT 45 + #define PHY_FORCE_LIMIT 20 +@@ -509,16 +933,36 @@ + /* Number of milliseconds we wait for PHY configuration done after MAC reset */ + #define PHY_CFG_TIMEOUT 100 + /* Number of 2 milliseconds we wait for acquiring MDIO ownership. */ ++#define MDIO_OWNERSHIP_TIMEOUT 10 + /* Number of milliseconds for NVM auto read done after MAC reset. */ + #define AUTO_READ_DONE_TIMEOUT 10 + + /* Flow Control */ ++#define E1000_FCRTH_RTH 0x0000FFF8 /* Mask Bits[15:3] for RTH */ ++#define E1000_FCRTH_XFCE 0x80000000 /* External Flow Control Enable */ ++#define E1000_FCRTL_RTL 0x0000FFF8 /* Mask Bits[15:3] for RTL */ + #define E1000_FCRTL_XONE 0x80000000 /* Enable XON frame transmission */ + + /* Transmit Configuration Word */ ++#define E1000_TXCW_FD 0x00000020 /* TXCW full duplex */ ++#define E1000_TXCW_HD 0x00000040 /* TXCW half duplex */ ++#define E1000_TXCW_PAUSE 0x00000080 /* TXCW sym pause request */ ++#define E1000_TXCW_ASM_DIR 0x00000100 /* TXCW astm pause direction */ ++#define E1000_TXCW_PAUSE_MASK 0x00000180 /* TXCW pause request mask */ ++#define E1000_TXCW_RF 0x00003000 /* TXCW remote fault */ ++#define E1000_TXCW_NP 0x00008000 /* TXCW next page */ ++#define E1000_TXCW_CW 0x0000ffff /* TxConfigWord mask */ ++#define E1000_TXCW_TXC 0x40000000 /* Transmit Config control */ + #define E1000_TXCW_ANE 0x80000000 /* Auto-neg enable */ + + /* Receive Configuration Word */ ++#define E1000_RXCW_CW 0x0000ffff /* RxConfigWord mask */ ++#define E1000_RXCW_NC 0x04000000 /* Receive config no carrier */ ++#define E1000_RXCW_IV 0x08000000 /* Receive config invalid */ ++#define E1000_RXCW_CC 0x10000000 /* Receive config change */ ++#define E1000_RXCW_C 0x20000000 /* Receive config */ ++#define E1000_RXCW_SYNCH 0x40000000 /* Receive config synch */ ++#define E1000_RXCW_ANC 0x80000000 /* Auto-neg complete */ + + /* PCI Express Control */ + #define E1000_GCR_RXD_NO_SNOOP 0x00000001 +@@ -529,17 +973,21 @@ + #define E1000_GCR_TXDSCR_NO_SNOOP 0x00000020 + + #define PCIE_NO_SNOOP_ALL (E1000_GCR_RXD_NO_SNOOP | \ +- E1000_GCR_RXDSCW_NO_SNOOP | \ +- E1000_GCR_RXDSCR_NO_SNOOP | \ +- E1000_GCR_TXD_NO_SNOOP | \ +- E1000_GCR_TXDSCW_NO_SNOOP | \ +- E1000_GCR_TXDSCR_NO_SNOOP) ++ E1000_GCR_RXDSCW_NO_SNOOP | \ ++ E1000_GCR_RXDSCR_NO_SNOOP | \ ++ E1000_GCR_TXD_NO_SNOOP | \ ++ E1000_GCR_TXDSCW_NO_SNOOP | \ ++ E1000_GCR_TXDSCR_NO_SNOOP) + + /* PHY Control Register */ ++#define MII_CR_SPEED_SELECT_MSB 0x0040 /* bits 6,13: 10=1000, 01=100, 00=10 */ ++#define MII_CR_COLL_TEST_ENABLE 0x0080 /* Collision test enable */ + #define MII_CR_FULL_DUPLEX 0x0100 /* FDX =1, half duplex =0 */ + #define MII_CR_RESTART_AUTO_NEG 0x0200 /* Restart auto negotiation */ ++#define MII_CR_ISOLATE 0x0400 /* Isolate PHY from MII */ + #define MII_CR_POWER_DOWN 0x0800 /* Power down */ + #define MII_CR_AUTO_NEG_EN 0x1000 /* Auto Neg Enable */ ++#define MII_CR_SPEED_SELECT_LSB 0x2000 /* bits 6,13: 10=1000, 01=100, 00=10 */ + #define MII_CR_LOOPBACK 0x4000 /* 0 = normal, 1 = loopback */ + #define MII_CR_RESET 0x8000 /* 0 = normal, 1 = PHY reset */ + #define MII_CR_SPEED_1000 0x0040 +@@ -547,35 +995,81 @@ + #define MII_CR_SPEED_10 0x0000 + + /* PHY Status Register */ ++#define MII_SR_EXTENDED_CAPS 0x0001 /* Extended register capabilities */ ++#define MII_SR_JABBER_DETECT 0x0002 /* Jabber Detected */ + #define MII_SR_LINK_STATUS 0x0004 /* Link Status 1 = link */ ++#define MII_SR_AUTONEG_CAPS 0x0008 /* Auto Neg Capable */ ++#define MII_SR_REMOTE_FAULT 0x0010 /* Remote Fault Detect */ + #define MII_SR_AUTONEG_COMPLETE 0x0020 /* Auto Neg Complete */ ++#define MII_SR_PREAMBLE_SUPPRESS 0x0040 /* Preamble may be suppressed */ ++#define MII_SR_EXTENDED_STATUS 0x0100 /* Ext. status info in Reg 0x0F */ ++#define MII_SR_100T2_HD_CAPS 0x0200 /* 100T2 Half Duplex Capable */ ++#define MII_SR_100T2_FD_CAPS 0x0400 /* 100T2 Full Duplex Capable */ ++#define MII_SR_10T_HD_CAPS 0x0800 /* 10T Half Duplex Capable */ ++#define MII_SR_10T_FD_CAPS 0x1000 /* 10T Full Duplex Capable */ ++#define MII_SR_100X_HD_CAPS 0x2000 /* 100X Half Duplex Capable */ ++#define MII_SR_100X_FD_CAPS 0x4000 /* 100X Full Duplex Capable */ ++#define MII_SR_100T4_CAPS 0x8000 /* 100T4 Capable */ + + /* Autoneg Advertisement Register */ ++#define NWAY_AR_SELECTOR_FIELD 0x0001 /* indicates IEEE 802.3 CSMA/CD */ + #define NWAY_AR_10T_HD_CAPS 0x0020 /* 10T Half Duplex Capable */ + #define NWAY_AR_10T_FD_CAPS 0x0040 /* 10T Full Duplex Capable */ + #define NWAY_AR_100TX_HD_CAPS 0x0080 /* 100TX Half Duplex Capable */ + #define NWAY_AR_100TX_FD_CAPS 0x0100 /* 100TX Full Duplex Capable */ ++#define NWAY_AR_100T4_CAPS 0x0200 /* 100T4 Capable */ + #define NWAY_AR_PAUSE 0x0400 /* Pause operation desired */ + #define NWAY_AR_ASM_DIR 0x0800 /* Asymmetric Pause Direction bit */ ++#define NWAY_AR_REMOTE_FAULT 0x2000 /* Remote Fault detected */ ++#define NWAY_AR_NEXT_PAGE 0x8000 /* Next Page ability supported */ + + /* Link Partner Ability Register (Base Page) */ ++#define NWAY_LPAR_SELECTOR_FIELD 0x0000 /* LP protocol selector field */ ++#define NWAY_LPAR_10T_HD_CAPS 0x0020 /* LP is 10T Half Duplex Capable */ ++#define NWAY_LPAR_10T_FD_CAPS 0x0040 /* LP is 10T Full Duplex Capable */ ++#define NWAY_LPAR_100TX_HD_CAPS 0x0080 /* LP is 100TX Half Duplex Capable */ ++#define NWAY_LPAR_100TX_FD_CAPS 0x0100 /* LP is 100TX Full Duplex Capable */ ++#define NWAY_LPAR_100T4_CAPS 0x0200 /* LP is 100T4 Capable */ + #define NWAY_LPAR_PAUSE 0x0400 /* LP Pause operation desired */ + #define NWAY_LPAR_ASM_DIR 0x0800 /* LP Asymmetric Pause Direction bit */ ++#define NWAY_LPAR_REMOTE_FAULT 0x2000 /* LP has detected Remote Fault */ ++#define NWAY_LPAR_ACKNOWLEDGE 0x4000 /* LP has rx'd link code word */ ++#define NWAY_LPAR_NEXT_PAGE 0x8000 /* Next Page ability supported */ + + /* Autoneg Expansion Register */ ++#define NWAY_ER_LP_NWAY_CAPS 0x0001 /* LP has Auto Neg Capability */ ++#define NWAY_ER_PAGE_RXD 0x0002 /* LP is 10T Half Duplex Capable */ ++#define NWAY_ER_NEXT_PAGE_CAPS 0x0004 /* LP is 10T Full Duplex Capable */ ++#define NWAY_ER_LP_NEXT_PAGE_CAPS 0x0008 /* LP is 100TX Half Duplex Capable */ ++#define NWAY_ER_PAR_DETECT_FAULT 0x0010 /* LP is 100TX Full Duplex Capable */ + + /* 1000BASE-T Control Register */ ++#define CR_1000T_ASYM_PAUSE 0x0080 /* Advertise asymmetric pause bit */ + #define CR_1000T_HD_CAPS 0x0100 /* Advertise 1000T HD capability */ + #define CR_1000T_FD_CAPS 0x0200 /* Advertise 1000T FD capability */ ++#define CR_1000T_REPEATER_DTE 0x0400 /* 1=Repeater/switch device port */ ++ /* 0=DTE device */ + #define CR_1000T_MS_VALUE 0x0800 /* 1=Configure PHY as Master */ +- /* 0=Configure PHY as Slave */ ++ /* 0=Configure PHY as Slave */ + #define CR_1000T_MS_ENABLE 0x1000 /* 1=Master/Slave manual config value */ +- /* 0=Automatic Master/Slave config */ ++ /* 0=Automatic Master/Slave config */ ++#define CR_1000T_TEST_MODE_NORMAL 0x0000 /* Normal Operation */ ++#define CR_1000T_TEST_MODE_1 0x2000 /* Transmit Waveform test */ ++#define CR_1000T_TEST_MODE_2 0x4000 /* Master Transmit Jitter test */ ++#define CR_1000T_TEST_MODE_3 0x6000 /* Slave Transmit Jitter test */ ++#define CR_1000T_TEST_MODE_4 0x8000 /* Transmitter Distortion test */ + + /* 1000BASE-T Status Register */ ++#define SR_1000T_IDLE_ERROR_CNT 0x00FF /* Num idle errors since last read */ ++#define SR_1000T_ASYM_PAUSE_DIR 0x0100 /* LP asymmetric pause direction bit */ ++#define SR_1000T_LP_HD_CAPS 0x0400 /* LP is 1000T HD capable */ ++#define SR_1000T_LP_FD_CAPS 0x0800 /* LP is 1000T FD capable */ + #define SR_1000T_REMOTE_RX_STATUS 0x1000 /* Remote receiver OK */ + #define SR_1000T_LOCAL_RX_STATUS 0x2000 /* Local receiver OK */ ++#define SR_1000T_MS_CONFIG_RES 0x4000 /* 1=Local Tx is Master, 0=Slave */ ++#define SR_1000T_MS_CONFIG_FAULT 0x8000 /* Master/Slave config fault */ + ++#define SR_1000T_PHY_EXCESSIVE_IDLE_ERR_COUNT 5 + + /* PHY 1000 MII Register/Bit Definitions */ + /* PHY Registers defined by IEEE */ +@@ -585,36 +1079,68 @@ + #define PHY_ID2 0x03 /* Phy Id Reg (word 2) */ + #define PHY_AUTONEG_ADV 0x04 /* Autoneg Advertisement */ + #define PHY_LP_ABILITY 0x05 /* Link Partner Ability (Base Page) */ ++#define PHY_AUTONEG_EXP 0x06 /* Autoneg Expansion Reg */ ++#define PHY_NEXT_PAGE_TX 0x07 /* Next Page Tx */ ++#define PHY_LP_NEXT_PAGE 0x08 /* Link Partner Next Page */ + #define PHY_1000T_CTRL 0x09 /* 1000Base-T Control Reg */ + #define PHY_1000T_STATUS 0x0A /* 1000Base-T Status Reg */ ++#define PHY_EXT_STATUS 0x0F /* Extended Status Reg */ + + /* NVM Control */ + #define E1000_EECD_SK 0x00000001 /* NVM Clock */ + #define E1000_EECD_CS 0x00000002 /* NVM Chip Select */ + #define E1000_EECD_DI 0x00000004 /* NVM Data In */ + #define E1000_EECD_DO 0x00000008 /* NVM Data Out */ ++#define E1000_EECD_FWE_MASK 0x00000030 ++#define E1000_EECD_FWE_DIS 0x00000010 /* Disable FLASH writes */ ++#define E1000_EECD_FWE_EN 0x00000020 /* Enable FLASH writes */ ++#define E1000_EECD_FWE_SHIFT 4 + #define E1000_EECD_REQ 0x00000040 /* NVM Access Request */ + #define E1000_EECD_GNT 0x00000080 /* NVM Access Grant */ + #define E1000_EECD_PRES 0x00000100 /* NVM Present */ ++#define E1000_EECD_SIZE 0x00000200 /* NVM Size (0=64 word 1=256 word) */ + /* NVM Addressing bits based on type 0=small, 1=large */ + #define E1000_EECD_ADDR_BITS 0x00000400 ++#define E1000_EECD_TYPE 0x00002000 /* NVM Type (1-SPI, 0-Microwire) */ + #define E1000_NVM_GRANT_ATTEMPTS 1000 /* NVM # attempts to gain grant */ + #define E1000_EECD_AUTO_RD 0x00000200 /* NVM Auto Read done */ + #define E1000_EECD_SIZE_EX_MASK 0x00007800 /* NVM Size */ + #define E1000_EECD_SIZE_EX_SHIFT 11 ++#define E1000_EECD_NVADDS 0x00018000 /* NVM Address Size */ ++#define E1000_EECD_SELSHAD 0x00020000 /* Select Shadow RAM */ ++#define E1000_EECD_INITSRAM 0x00040000 /* Initialize Shadow RAM */ ++#define E1000_EECD_FLUPD 0x00080000 /* Update FLASH */ ++#define E1000_EECD_AUPDEN 0x00100000 /* Enable Autonomous FLASH update */ ++#define E1000_EECD_SHADV 0x00200000 /* Shadow RAM Data Valid */ ++#define E1000_EECD_SEC1VAL 0x00400000 /* Sector One Valid */ ++#define E1000_EECD_SECVAL_SHIFT 22 ++#define E1000_EECD_SEC1VAL_VALID_MASK (E1000_EECD_AUTO_RD | E1000_EECD_PRES) + +-/* Offset to data in NVM read/write registers */ +-#define E1000_NVM_RW_REG_DATA 16 ++#define E1000_NVM_SWDPIN0 0x0001 /* SWDPIN 0 NVM Value */ ++#define E1000_NVM_LED_LOGIC 0x0020 /* Led Logic Word */ ++#define E1000_NVM_RW_REG_DATA 16 /* Offset to data in NVM read/write regs */ + #define E1000_NVM_RW_REG_DONE 2 /* Offset to READ/WRITE done bit */ + #define E1000_NVM_RW_REG_START 1 /* Start operation */ + #define E1000_NVM_RW_ADDR_SHIFT 2 /* Shift to the address bits */ ++#define E1000_NVM_POLL_WRITE 1 /* Flag for polling for write complete */ + #define E1000_NVM_POLL_READ 0 /* Flag for polling for read complete */ ++#define E1000_FLASH_UPDATES 2000 + + /* NVM Word Offsets */ ++#define NVM_COMPAT 0x0003 + #define NVM_ID_LED_SETTINGS 0x0004 +-/* For SERDES output amplitude adjustment. */ ++#define NVM_VERSION 0x0005 ++#define NVM_SERDES_AMPLITUDE 0x0006 /* SERDES output amplitude */ ++#define NVM_PHY_CLASS_WORD 0x0007 ++#define NVM_INIT_CONTROL1_REG 0x000A + #define NVM_INIT_CONTROL2_REG 0x000F ++#define NVM_SWDEF_PINS_CTRL_PORT_1 0x0010 ++#define NVM_INIT_CONTROL3_PORT_B 0x0014 ++#define NVM_INIT_3GIO_3 0x001A ++#define NVM_SWDEF_PINS_CTRL_PORT_0 0x0020 + #define NVM_INIT_CONTROL3_PORT_A 0x0024 ++#define NVM_CFG 0x0012 ++#define NVM_FLASH_VERSION 0x0032 + #define NVM_ALT_MAC_ADDR_PTR 0x0037 + #define NVM_CHECKSUM_REG 0x003F + +@@ -623,36 +1149,53 @@ + + /* Mask bits for fields in Word 0x0f of the NVM */ + #define NVM_WORD0F_PAUSE_MASK 0x3000 ++#define NVM_WORD0F_PAUSE 0x1000 + #define NVM_WORD0F_ASM_DIR 0x2000 ++#define NVM_WORD0F_ANE 0x0800 ++#define NVM_WORD0F_SWPDIO_EXT_MASK 0x00F0 ++#define NVM_WORD0F_LPLU 0x0001 + + /* Mask bits for fields in Word 0x1a of the NVM */ ++#define NVM_WORD1A_ASPM_MASK 0x000C + + /* For checksumming, the sum of all words in the NVM should equal 0xBABA. */ + #define NVM_SUM 0xBABA + ++#define NVM_MAC_ADDR_OFFSET 0 + #define NVM_PBA_OFFSET_0 8 + #define NVM_PBA_OFFSET_1 9 ++#define NVM_RESERVED_WORD 0xFFFF ++#define NVM_PHY_CLASS_A 0x8000 ++#define NVM_SERDES_AMPLITUDE_MASK 0x000F ++#define NVM_SIZE_MASK 0x1C00 ++#define NVM_SIZE_SHIFT 10 + #define NVM_WORD_SIZE_BASE_SHIFT 6 +- +-/* NVM Commands - Microwire */ ++#define NVM_SWDPIO_EXT_SHIFT 4 + + /* NVM Commands - SPI */ + #define NVM_MAX_RETRY_SPI 5000 /* Max wait of 5ms, for RDY signal */ ++#define NVM_READ_OPCODE_SPI 0x03 /* NVM read opcode */ + #define NVM_WRITE_OPCODE_SPI 0x02 /* NVM write opcode */ + #define NVM_A8_OPCODE_SPI 0x08 /* opcode bit-3 = address bit-8 */ + #define NVM_WREN_OPCODE_SPI 0x06 /* NVM set Write Enable latch */ ++#define NVM_WRDI_OPCODE_SPI 0x04 /* NVM reset Write Enable latch */ + #define NVM_RDSR_OPCODE_SPI 0x05 /* NVM read Status register */ ++#define NVM_WRSR_OPCODE_SPI 0x01 /* NVM write Status register */ + + /* SPI NVM Status Register */ + #define NVM_STATUS_RDY_SPI 0x01 ++#define NVM_STATUS_WEN_SPI 0x02 ++#define NVM_STATUS_BP0_SPI 0x04 ++#define NVM_STATUS_BP1_SPI 0x08 ++#define NVM_STATUS_WPEN_SPI 0x80 + + /* Word definitions for ID LED Settings */ + #define ID_LED_RESERVED_0000 0x0000 + #define ID_LED_RESERVED_FFFF 0xFFFF + #define ID_LED_DEFAULT ((ID_LED_OFF1_ON2 << 12) | \ +- (ID_LED_OFF1_OFF2 << 8) | \ +- (ID_LED_DEF1_DEF2 << 4) | \ +- (ID_LED_DEF1_DEF2)) ++ (ID_LED_OFF1_OFF2 << 8) | \ ++ (ID_LED_DEF1_DEF2 << 4) | \ ++ (ID_LED_DEF1_DEF2)) + #define ID_LED_DEF1_DEF2 0x1 + #define ID_LED_DEF1_ON2 0x2 + #define ID_LED_DEF1_OFF2 0x3 +@@ -675,6 +1218,10 @@ + #define PCIE_LINK_WIDTH_MASK 0x3F0 + #define PCIE_LINK_WIDTH_SHIFT 4 + ++#ifndef ETH_ADDR_LEN ++#define ETH_ADDR_LEN 6 ++#endif ++ + #define PHY_REVISION_MASK 0xFFFFFFF0 + #define MAX_PHY_REG_ADDRESS 0x1F /* 5 bit address bus (0-0x1F) */ + #define MAX_PHY_MULTI_PAGE_REG 0xF +@@ -684,23 +1231,42 @@ + * I = Integrated + * E = External + */ ++#define M88E1000_E_PHY_ID 0x01410C50 ++#define M88E1000_I_PHY_ID 0x01410C30 ++#define M88E1011_I_PHY_ID 0x01410C20 ++#define IGP01E1000_I_PHY_ID 0x02A80380 ++#define M88E1011_I_REV_4 0x04 + #define M88E1111_I_PHY_ID 0x01410CC0 ++#define GG82563_E_PHY_ID 0x01410CA0 + #define IGP03E1000_E_PHY_ID 0x02A80390 ++#define IFE_E_PHY_ID 0x02A80330 ++#define IFE_PLUS_E_PHY_ID 0x02A80320 ++#define IFE_C_E_PHY_ID 0x02A80310 ++#define IGP04E1000_E_PHY_ID 0x02A80391 + #define M88_VENDOR 0x0141 + + /* M88E1000 Specific Registers */ + #define M88E1000_PHY_SPEC_CTRL 0x10 /* PHY Specific Control Register */ + #define M88E1000_PHY_SPEC_STATUS 0x11 /* PHY Specific Status Register */ ++#define M88E1000_INT_ENABLE 0x12 /* Interrupt Enable Register */ ++#define M88E1000_INT_STATUS 0x13 /* Interrupt Status Register */ + #define M88E1000_EXT_PHY_SPEC_CTRL 0x14 /* Extended PHY Specific Control */ ++#define M88E1000_RX_ERR_CNTR 0x15 /* Receive Error Counter */ + ++#define M88E1000_PHY_EXT_CTRL 0x1A /* PHY extend control register */ + #define M88E1000_PHY_PAGE_SELECT 0x1D /* Reg 29 for page number setting */ + #define M88E1000_PHY_GEN_CONTROL 0x1E /* Its meaning depends on reg 29 */ ++#define M88E1000_PHY_VCO_REG_BIT8 0x100 /* Bits 8 & 11 are adjusted for */ ++#define M88E1000_PHY_VCO_REG_BIT11 0x800 /* improved BER performance */ + + /* M88E1000 PHY Specific Control Register */ ++#define M88E1000_PSCR_JABBER_DISABLE 0x0001 /* 1=Jabber Function disabled */ + #define M88E1000_PSCR_POLARITY_REVERSAL 0x0002 /* 1=Polarity Reversal enabled */ ++#define M88E1000_PSCR_SQE_TEST 0x0004 /* 1=SQE Test enabled */ + /* 1=CLK125 low, 0=CLK125 toggling */ ++#define M88E1000_PSCR_CLK125_DISABLE 0x0010 + #define M88E1000_PSCR_MDI_MANUAL_MODE 0x0000 /* MDI Crossover Mode bits 6:5 */ +- /* Manual MDI configuration */ ++ /* Manual MDI configuration */ + #define M88E1000_PSCR_MDIX_MANUAL_MODE 0x0020 /* Manual MDIX configuration */ + /* 1000BASE-T: Auto crossover, 100BASE-TX/10BASE-T: MDI Mode */ + #define M88E1000_PSCR_AUTO_X_1000T 0x0040 +@@ -710,10 +1276,15 @@ + * 1=Enable Extended 10BASE-T distance (Lower 10BASE-T Rx Threshold + * 0=Normal 10BASE-T Rx Threshold + */ ++#define M88E1000_PSCR_EN_10BT_EXT_DIST 0x0080 + /* 1=5-bit interface in 100BASE-TX, 0=MII interface in 100BASE-TX */ ++#define M88E1000_PSCR_MII_5BIT_ENABLE 0x0100 ++#define M88E1000_PSCR_SCRAMBLER_DISABLE 0x0200 /* 1=Scrambler disable */ ++#define M88E1000_PSCR_FORCE_LINK_GOOD 0x0400 /* 1=Force link good */ + #define M88E1000_PSCR_ASSERT_CRS_ON_TX 0x0800 /* 1=Assert CRS on Transmit */ + + /* M88E1000 PHY Specific Status Register */ ++#define M88E1000_PSSR_JABBER 0x0001 /* 1=Jabber */ + #define M88E1000_PSSR_REV_POLARITY 0x0002 /* 1=Polarity reversed */ + #define M88E1000_PSSR_DOWNSHIFT 0x0020 /* 1=Downshifted */ + #define M88E1000_PSSR_MDIX 0x0040 /* 1=MDIX; 0=MDI */ +@@ -725,42 +1296,143 @@ + * 4 = >140M + */ + #define M88E1000_PSSR_CABLE_LENGTH 0x0380 ++#define M88E1000_PSSR_LINK 0x0400 /* 1=Link up, 0=Link down */ ++#define M88E1000_PSSR_SPD_DPLX_RESOLVED 0x0800 /* 1=Speed & Duplex resolved */ ++#define M88E1000_PSSR_PAGE_RCVD 0x1000 /* 1=Page received */ ++#define M88E1000_PSSR_DPLX 0x2000 /* 1=Duplex 0=Half Duplex */ + #define M88E1000_PSSR_SPEED 0xC000 /* Speed, bits 14:15 */ ++#define M88E1000_PSSR_10MBS 0x0000 /* 00=10Mbs */ ++#define M88E1000_PSSR_100MBS 0x4000 /* 01=100Mbs */ + #define M88E1000_PSSR_1000MBS 0x8000 /* 10=1000Mbs */ + + #define M88E1000_PSSR_CABLE_LENGTH_SHIFT 7 + + /* M88E1000 Extended PHY Specific Control Register */ ++#define M88E1000_EPSCR_FIBER_LOOPBACK 0x4000 /* 1=Fiber loopback */ + /* + * 1 = Lost lock detect enabled. + * Will assert lost lock and bring + * link down if idle not seen + * within 1ms in 1000BASE-T + */ ++#define M88E1000_EPSCR_DOWN_NO_IDLE 0x8000 + /* + * Number of times we will attempt to autonegotiate before downshifting if we + * are the master + */ + #define M88E1000_EPSCR_MASTER_DOWNSHIFT_MASK 0x0C00 + #define M88E1000_EPSCR_MASTER_DOWNSHIFT_1X 0x0000 ++#define M88E1000_EPSCR_MASTER_DOWNSHIFT_2X 0x0400 ++#define M88E1000_EPSCR_MASTER_DOWNSHIFT_3X 0x0800 ++#define M88E1000_EPSCR_MASTER_DOWNSHIFT_4X 0x0C00 + /* + * Number of times we will attempt to autonegotiate before downshifting if we + * are the slave + */ + #define M88E1000_EPSCR_SLAVE_DOWNSHIFT_MASK 0x0300 ++#define M88E1000_EPSCR_SLAVE_DOWNSHIFT_DIS 0x0000 + #define M88E1000_EPSCR_SLAVE_DOWNSHIFT_1X 0x0100 ++#define M88E1000_EPSCR_SLAVE_DOWNSHIFT_2X 0x0200 ++#define M88E1000_EPSCR_SLAVE_DOWNSHIFT_3X 0x0300 ++#define M88E1000_EPSCR_TX_CLK_2_5 0x0060 /* 2.5 MHz TX_CLK */ + #define M88E1000_EPSCR_TX_CLK_25 0x0070 /* 25 MHz TX_CLK */ ++#define M88E1000_EPSCR_TX_CLK_0 0x0000 /* NO TX_CLK */ + + /* M88EC018 Rev 2 specific DownShift settings */ + #define M88EC018_EPSCR_DOWNSHIFT_COUNTER_MASK 0x0E00 ++#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_1X 0x0000 ++#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_2X 0x0200 ++#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_3X 0x0400 ++#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_4X 0x0600 + #define M88EC018_EPSCR_DOWNSHIFT_COUNTER_5X 0x0800 ++#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_6X 0x0A00 ++#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_7X 0x0C00 ++#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_8X 0x0E00 ++ ++/* ++ * Bits... ++ * 15-5: page ++ * 4-0: register offset ++ */ ++#define GG82563_PAGE_SHIFT 5 ++#define GG82563_REG(page, reg) \ ++ (((page) << GG82563_PAGE_SHIFT) | ((reg) & MAX_PHY_REG_ADDRESS)) ++#define GG82563_MIN_ALT_REG 30 ++ ++/* GG82563 Specific Registers */ ++#define GG82563_PHY_SPEC_CTRL \ ++ GG82563_REG(0, 16) /* PHY Specific Control */ ++#define GG82563_PHY_SPEC_STATUS \ ++ GG82563_REG(0, 17) /* PHY Specific Status */ ++#define GG82563_PHY_INT_ENABLE \ ++ GG82563_REG(0, 18) /* Interrupt Enable */ ++#define GG82563_PHY_SPEC_STATUS_2 \ ++ GG82563_REG(0, 19) /* PHY Specific Status 2 */ ++#define GG82563_PHY_RX_ERR_CNTR \ ++ GG82563_REG(0, 21) /* Receive Error Counter */ ++#define GG82563_PHY_PAGE_SELECT \ ++ GG82563_REG(0, 22) /* Page Select */ ++#define GG82563_PHY_SPEC_CTRL_2 \ ++ GG82563_REG(0, 26) /* PHY Specific Control 2 */ ++#define GG82563_PHY_PAGE_SELECT_ALT \ ++ GG82563_REG(0, 29) /* Alternate Page Select */ ++#define GG82563_PHY_TEST_CLK_CTRL \ ++ GG82563_REG(0, 30) /* Test Clock Control (use reg. 29 to select) */ ++ ++#define GG82563_PHY_MAC_SPEC_CTRL \ ++ GG82563_REG(2, 21) /* MAC Specific Control Register */ ++#define GG82563_PHY_MAC_SPEC_CTRL_2 \ ++ GG82563_REG(2, 26) /* MAC Specific Control 2 */ ++ ++#define GG82563_PHY_DSP_DISTANCE \ ++ GG82563_REG(5, 26) /* DSP Distance */ ++ ++/* Page 193 - Port Control Registers */ ++#define GG82563_PHY_KMRN_MODE_CTRL \ ++ GG82563_REG(193, 16) /* Kumeran Mode Control */ ++#define GG82563_PHY_PORT_RESET \ ++ GG82563_REG(193, 17) /* Port Reset */ ++#define GG82563_PHY_REVISION_ID \ ++ GG82563_REG(193, 18) /* Revision ID */ ++#define GG82563_PHY_DEVICE_ID \ ++ GG82563_REG(193, 19) /* Device ID */ ++#define GG82563_PHY_PWR_MGMT_CTRL \ ++ GG82563_REG(193, 20) /* Power Management Control */ ++#define GG82563_PHY_RATE_ADAPT_CTRL \ ++ GG82563_REG(193, 25) /* Rate Adaptation Control */ ++ ++/* Page 194 - KMRN Registers */ ++#define GG82563_PHY_KMRN_FIFO_CTRL_STAT \ ++ GG82563_REG(194, 16) /* FIFO's Control/Status */ ++#define GG82563_PHY_KMRN_CTRL \ ++ GG82563_REG(194, 17) /* Control */ ++#define GG82563_PHY_INBAND_CTRL \ ++ GG82563_REG(194, 18) /* Inband Control */ ++#define GG82563_PHY_KMRN_DIAGNOSTIC \ ++ GG82563_REG(194, 19) /* Diagnostic */ ++#define GG82563_PHY_ACK_TIMEOUTS \ ++ GG82563_REG(194, 20) /* Acknowledge Timeouts */ ++#define GG82563_PHY_ADV_ABILITY \ ++ GG82563_REG(194, 21) /* Advertised Ability */ ++#define GG82563_PHY_LINK_PARTNER_ADV_ABILITY \ ++ GG82563_REG(194, 23) /* Link Partner Advertised Ability */ ++#define GG82563_PHY_ADV_NEXT_PAGE \ ++ GG82563_REG(194, 24) /* Advertised Next Page */ ++#define GG82563_PHY_LINK_PARTNER_ADV_NEXT_PAGE \ ++ GG82563_REG(194, 25) /* Link Partner Advertised Next page */ ++#define GG82563_PHY_KMRN_MISC \ ++ GG82563_REG(194, 26) /* Misc. */ + + /* MDI Control */ ++#define E1000_MDIC_DATA_MASK 0x0000FFFF ++#define E1000_MDIC_REG_MASK 0x001F0000 + #define E1000_MDIC_REG_SHIFT 16 ++#define E1000_MDIC_PHY_MASK 0x03E00000 + #define E1000_MDIC_PHY_SHIFT 21 + #define E1000_MDIC_OP_WRITE 0x04000000 + #define E1000_MDIC_OP_READ 0x08000000 + #define E1000_MDIC_READY 0x10000000 ++#define E1000_MDIC_INT_EN 0x20000000 + #define E1000_MDIC_ERROR 0x40000000 + + /* SerDes Control */ +@@ -768,4 +1440,28 @@ + #define E1000_GEN_CTL_ADDRESS_SHIFT 8 + #define E1000_GEN_POLL_TIMEOUT 640 + +-#endif ++/* LinkSec register fields */ ++#define E1000_LSECTXCAP_SUM_MASK 0x00FF0000 ++#define E1000_LSECTXCAP_SUM_SHIFT 16 ++#define E1000_LSECRXCAP_SUM_MASK 0x00FF0000 ++#define E1000_LSECRXCAP_SUM_SHIFT 16 ++ ++#define E1000_LSECTXCTRL_EN_MASK 0x00000003 ++#define E1000_LSECTXCTRL_DISABLE 0x0 ++#define E1000_LSECTXCTRL_AUTH 0x1 ++#define E1000_LSECTXCTRL_AUTH_ENCRYPT 0x2 ++#define E1000_LSECTXCTRL_AISCI 0x00000020 ++#define E1000_LSECTXCTRL_PNTHRSH_MASK 0xFFFFFF00 ++#define E1000_LSECTXCTRL_RSV_MASK 0x000000D8 ++ ++#define E1000_LSECRXCTRL_EN_MASK 0x0000000C ++#define E1000_LSECRXCTRL_EN_SHIFT 2 ++#define E1000_LSECRXCTRL_DISABLE 0x0 ++#define E1000_LSECRXCTRL_CHECK 0x1 ++#define E1000_LSECRXCTRL_STRICT 0x2 ++#define E1000_LSECRXCTRL_DROP 0x3 ++#define E1000_LSECRXCTRL_PLSH 0x00000040 ++#define E1000_LSECRXCTRL_RP 0x00000080 ++#define E1000_LSECRXCTRL_RSV_MASK 0xFFFFFF33 ++ ++#endif /* _E1000_DEFINES_H_ */ +diff -r f5806398a14e drivers/net/igb/e1000_hw.h +--- a/drivers/net/igb/e1000_hw.h Mon Jun 15 11:45:45 2009 +0100 ++++ b/drivers/net/igb/e1000_hw.h Mon Jun 15 11:59:49 2009 +0100 +@@ -1,7 +1,7 @@ + /******************************************************************************* + + Intel(R) Gigabit Ethernet Linux driver +- Copyright(c) 2007 Intel Corporation. ++ Copyright(c) 2007-2009 Intel Corporation. + + This program is free software; you can redistribute it and/or modify it + under the terms and conditions of the GNU General Public License, +@@ -28,11 +28,7 @@ + #ifndef _E1000_HW_H_ + #define _E1000_HW_H_ + +-#include +-#include +-#include +- +-#include "e1000_mac.h" ++#include "e1000_osdep.h" + #include "e1000_regs.h" + #include "e1000_defines.h" + +@@ -41,14 +37,22 @@ + #define E1000_DEV_ID_82576 0x10C9 + #define E1000_DEV_ID_82576_FIBER 0x10E6 + #define E1000_DEV_ID_82576_SERDES 0x10E7 ++#define E1000_DEV_ID_82576_QUAD_COPPER 0x10E8 ++#define E1000_DEV_ID_82576_NS 0x150A + #define E1000_DEV_ID_82575EB_COPPER 0x10A7 + #define E1000_DEV_ID_82575EB_FIBER_SERDES 0x10A9 + #define E1000_DEV_ID_82575GB_QUAD_COPPER 0x10D6 +- ++#define E1000_REVISION_0 0 ++#define E1000_REVISION_1 1 + #define E1000_REVISION_2 2 ++#define E1000_REVISION_3 3 + #define E1000_REVISION_4 4 + ++#define E1000_FUNC_0 0 + #define E1000_FUNC_1 1 ++ ++#define E1000_ALT_MAC_ADDRESS_OFFSET_LAN0 0 ++#define E1000_ALT_MAC_ADDRESS_OFFSET_LAN1 3 + + enum e1000_mac_type { + e1000_undefined = 0, +@@ -69,7 +73,6 @@ + e1000_nvm_unknown = 0, + e1000_nvm_none, + e1000_nvm_eeprom_spi, +- e1000_nvm_eeprom_microwire, + e1000_nvm_flash_hw, + e1000_nvm_flash_sw + }; +@@ -78,8 +81,6 @@ + e1000_nvm_override_none = 0, + e1000_nvm_override_spi_small, + e1000_nvm_override_spi_large, +- e1000_nvm_override_microwire_small, +- e1000_nvm_override_microwire_large + }; + + enum e1000_phy_type { +@@ -91,6 +92,7 @@ + e1000_phy_gg82563, + e1000_phy_igp_3, + e1000_phy_ife, ++ e1000_phy_vf, + }; + + enum e1000_bus_type { +@@ -136,7 +138,7 @@ + e1000_rev_polarity_undefined = 0xFF + }; + +-enum e1000_fc_type { ++enum e1000_fc_mode { + e1000_fc_none = 0, + e1000_fc_rx_pause, + e1000_fc_tx_pause, +@@ -144,14 +146,33 @@ + e1000_fc_default = 0xFF + }; + ++enum e1000_ms_type { ++ e1000_ms_hw_default = 0, ++ e1000_ms_force_master, ++ e1000_ms_force_slave, ++ e1000_ms_auto ++}; ++ ++enum e1000_smart_speed { ++ e1000_smart_speed_default = 0, ++ e1000_smart_speed_on, ++ e1000_smart_speed_off ++}; ++ ++enum e1000_serdes_link_state { ++ e1000_serdes_link_down = 0, ++ e1000_serdes_link_autoneg_progress, ++ e1000_serdes_link_autoneg_complete, ++ e1000_serdes_link_forced_up ++}; + + /* Receive Descriptor */ + struct e1000_rx_desc { + __le64 buffer_addr; /* Address of the descriptor's data buffer */ + __le16 length; /* Length of data DMAed into data buffer */ + __le16 csum; /* Packet checksum */ +- u8 status; /* Descriptor status */ +- u8 errors; /* Descriptor Errors */ ++ u8 status; /* Descriptor status */ ++ u8 errors; /* Descriptor Errors */ + __le16 special; + }; + +@@ -163,9 +184,9 @@ + } read; + struct { + struct { +- __le32 mrq; /* Multiple Rx Queues */ ++ __le32 mrq; /* Multiple Rx Queues */ + union { +- __le32 rss; /* RSS Hash */ ++ __le32 rss; /* RSS Hash */ + struct { + __le16 ip_id; /* IP id */ + __le16 csum; /* Packet Checksum */ +@@ -173,9 +194,9 @@ + } hi_dword; + } lower; + struct { +- __le32 status_error; /* ext status/error */ ++ __le32 status_error; /* ext status/error */ + __le16 length; +- __le16 vlan; /* VLAN tag */ ++ __le16 vlan; /* VLAN tag */ + } upper; + } wb; /* writeback */ + }; +@@ -189,9 +210,9 @@ + } read; + struct { + struct { +- __le32 mrq; /* Multiple Rx Queues */ ++ __le32 mrq; /* Multiple Rx Queues */ + union { +- __le32 rss; /* RSS Hash */ ++ __le32 rss; /* RSS Hash */ + struct { + __le16 ip_id; /* IP id */ + __le16 csum; /* Packet Checksum */ +@@ -199,13 +220,13 @@ + } hi_dword; + } lower; + struct { +- __le32 status_error; /* ext status/error */ +- __le16 length0; /* length of buffer 0 */ +- __le16 vlan; /* VLAN tag */ ++ __le32 status_error; /* ext status/error */ ++ __le16 length0; /* length of buffer 0 */ ++ __le16 vlan; /* VLAN tag */ + } middle; + struct { + __le16 header_status; +- __le16 length[3]; /* length of buffers 1-3 */ ++ __le16 length[3]; /* length of buffers 1-3 */ + } upper; + __le64 reserved; + } wb; /* writeback */ +@@ -213,20 +234,20 @@ + + /* Transmit Descriptor */ + struct e1000_tx_desc { +- __le64 buffer_addr; /* Address of the descriptor's data buffer */ ++ __le64 buffer_addr; /* Address of the descriptor's data buffer */ + union { + __le32 data; + struct { + __le16 length; /* Data buffer length */ +- u8 cso; /* Checksum offset */ +- u8 cmd; /* Descriptor control */ ++ u8 cso; /* Checksum offset */ ++ u8 cmd; /* Descriptor control */ + } flags; + } lower; + union { + __le32 data; + struct { +- u8 status; /* Descriptor status */ +- u8 css; /* Checksum start */ ++ u8 status; /* Descriptor status */ ++ u8 css; /* Checksum start */ + __le16 special; + } fields; + } upper; +@@ -237,16 +258,16 @@ + union { + __le32 ip_config; + struct { +- u8 ipcss; /* IP checksum start */ +- u8 ipcso; /* IP checksum offset */ ++ u8 ipcss; /* IP checksum start */ ++ u8 ipcso; /* IP checksum offset */ + __le16 ipcse; /* IP checksum end */ + } ip_fields; + } lower_setup; + union { + __le32 tcp_config; + struct { +- u8 tucss; /* TCP checksum start */ +- u8 tucso; /* TCP checksum offset */ ++ u8 tucss; /* TCP checksum start */ ++ u8 tucso; /* TCP checksum offset */ + __le16 tucse; /* TCP checksum end */ + } tcp_fields; + } upper_setup; +@@ -254,8 +275,8 @@ + union { + __le32 data; + struct { +- u8 status; /* Descriptor status */ +- u8 hdr_len; /* Header length */ ++ u8 status; /* Descriptor status */ ++ u8 hdr_len; /* Header length */ + __le16 mss; /* Maximum segment size */ + } fields; + } tcp_seg_setup; +@@ -275,8 +296,8 @@ + union { + __le32 data; + struct { +- u8 status; /* Descriptor status */ +- u8 popts; /* Packet Options */ ++ u8 status; /* Descriptor status */ ++ u8 popts; /* Packet Options */ + __le16 special; + } fields; + } upper; +@@ -359,7 +380,9 @@ + u64 lenerrs; + u64 scvpc; + u64 hrmpc; ++ u64 doosync; + }; ++ + + struct e1000_phy_stats { + u32 idle_errors; +@@ -409,52 +432,77 @@ + #include "e1000_mac.h" + #include "e1000_phy.h" + #include "e1000_nvm.h" ++#include "e1000_manage.h" + + struct e1000_mac_operations { ++ /* Function pointers for the MAC. */ ++ s32 (*init_params)(struct e1000_hw *); ++ s32 (*id_led_init)(struct e1000_hw *); ++ s32 (*blink_led)(struct e1000_hw *); + s32 (*check_for_link)(struct e1000_hw *); ++ bool (*check_mng_mode)(struct e1000_hw *hw); ++ s32 (*cleanup_led)(struct e1000_hw *); ++ void (*clear_hw_cntrs)(struct e1000_hw *); ++ void (*clear_vfta)(struct e1000_hw *); ++ s32 (*get_bus_info)(struct e1000_hw *); ++ void (*set_lan_id)(struct e1000_hw *); ++ s32 (*get_link_up_info)(struct e1000_hw *, u16 *, u16 *); ++ s32 (*led_on)(struct e1000_hw *); ++ s32 (*led_off)(struct e1000_hw *); ++ void (*update_mc_addr_list)(struct e1000_hw *, u8 *, u32, u32, u32); + s32 (*reset_hw)(struct e1000_hw *); + s32 (*init_hw)(struct e1000_hw *); +- bool (*check_mng_mode)(struct e1000_hw *); ++ void (*shutdown_serdes)(struct e1000_hw *); ++ s32 (*setup_link)(struct e1000_hw *); + s32 (*setup_physical_interface)(struct e1000_hw *); +- void (*rar_set)(struct e1000_hw *, u8 *, u32); ++ s32 (*setup_led)(struct e1000_hw *); ++ void (*write_vfta)(struct e1000_hw *, u32, u32); ++ void (*mta_set)(struct e1000_hw *, u32); ++ void (*config_collision_dist)(struct e1000_hw *); ++ void (*rar_set)(struct e1000_hw *, u8*, u32); + s32 (*read_mac_addr)(struct e1000_hw *); +- s32 (*get_speed_and_duplex)(struct e1000_hw *, u16 *, u16 *); ++ s32 (*validate_mdi_setting)(struct e1000_hw *); ++ s32 (*mng_host_if_write)(struct e1000_hw *, u8*, u16, u16, u8*); ++ s32 (*mng_write_cmd_header)(struct e1000_hw *hw, ++ struct e1000_host_mng_command_header*); ++ s32 (*mng_enable_host_if)(struct e1000_hw *); ++ s32 (*wait_autoneg)(struct e1000_hw *); + }; + + struct e1000_phy_operations { +- s32 (*acquire_phy)(struct e1000_hw *); ++ s32 (*init_params)(struct e1000_hw *); ++ s32 (*acquire)(struct e1000_hw *); ++ s32 (*check_polarity)(struct e1000_hw *); + s32 (*check_reset_block)(struct e1000_hw *); ++ s32 (*commit)(struct e1000_hw *); + s32 (*force_speed_duplex)(struct e1000_hw *); + s32 (*get_cfg_done)(struct e1000_hw *hw); + s32 (*get_cable_length)(struct e1000_hw *); +- s32 (*get_phy_info)(struct e1000_hw *); +- s32 (*read_phy_reg)(struct e1000_hw *, u32, u16 *); +- void (*release_phy)(struct e1000_hw *); +- s32 (*reset_phy)(struct e1000_hw *); ++ s32 (*get_info)(struct e1000_hw *); ++ s32 (*read_reg)(struct e1000_hw *, u32, u16 *); ++ void (*release)(struct e1000_hw *); ++ s32 (*reset)(struct e1000_hw *); + s32 (*set_d0_lplu_state)(struct e1000_hw *, bool); + s32 (*set_d3_lplu_state)(struct e1000_hw *, bool); +- s32 (*write_phy_reg)(struct e1000_hw *, u32, u16); ++ s32 (*write_reg)(struct e1000_hw *, u32, u16); ++ void (*power_up)(struct e1000_hw *); ++ void (*power_down)(struct e1000_hw *); + }; + + struct e1000_nvm_operations { +- s32 (*acquire_nvm)(struct e1000_hw *); +- s32 (*read_nvm)(struct e1000_hw *, u16, u16, u16 *); +- void (*release_nvm)(struct e1000_hw *); +- s32 (*write_nvm)(struct e1000_hw *, u16, u16, u16 *); ++ s32 (*init_params)(struct e1000_hw *); ++ s32 (*acquire)(struct e1000_hw *); ++ s32 (*read)(struct e1000_hw *, u16, u16, u16 *); ++ void (*release)(struct e1000_hw *); ++ void (*reload)(struct e1000_hw *); ++ s32 (*update)(struct e1000_hw *); ++ s32 (*valid_led_default)(struct e1000_hw *, u16 *); ++ s32 (*validate)(struct e1000_hw *); ++ s32 (*write)(struct e1000_hw *, u16, u16, u16 *); + }; +- +-struct e1000_info { +- s32 (*get_invariants)(struct e1000_hw *); +- struct e1000_mac_operations *mac_ops; +- struct e1000_phy_operations *phy_ops; +- struct e1000_nvm_operations *nvm_ops; +-}; +- +-extern const struct e1000_info e1000_82575_info; + + struct e1000_mac_info { + struct e1000_mac_operations ops; +- + u8 addr[6]; + u8 perm_addr[6]; + +@@ -483,19 +531,15 @@ + bool asf_firmware_present; + bool autoneg; + bool autoneg_failed; +- bool disable_av; +- bool disable_hw_init_bits; + bool get_link_status; +- bool ifs_params_forced; + bool in_ifs_mode; +- bool report_tx_early; ++ enum e1000_serdes_link_state serdes_link_state; + bool serdes_has_link; + bool tx_pkt_filtering; + }; + + struct e1000_phy_info { + struct e1000_phy_operations ops; +- + enum e1000_phy_type type; + + enum e1000_1000t_rx_status local_rx; +@@ -530,7 +574,6 @@ + + struct e1000_nvm_info { + struct e1000_nvm_operations ops; +- + enum e1000_nvm_type type; + enum e1000_nvm_override override; + +@@ -549,25 +592,31 @@ + enum e1000_bus_speed speed; + enum e1000_bus_width width; + +- u32 snoop; +- + u16 func; + u16 pci_cmd_word; + }; + + struct e1000_fc_info { +- u32 high_water; /* Flow control high-water mark */ +- u32 low_water; /* Flow control low-water mark */ +- u16 pause_time; /* Flow control pause timer */ +- bool send_xon; /* Flow control send XON */ +- bool strict_ieee; /* Strict IEEE mode */ +- enum e1000_fc_type type; /* Type of flow control */ +- enum e1000_fc_type original_type; ++ u32 high_water; /* Flow control high-water mark */ ++ u32 low_water; /* Flow control low-water mark */ ++ u16 pause_time; /* Flow control pause timer */ ++ bool send_xon; /* Flow control send XON */ ++ bool strict_ieee; /* Strict IEEE mode */ ++ enum e1000_fc_mode current_mode; /* FC mode in effect */ ++ enum e1000_fc_mode requested_mode; /* FC mode requested by caller */ ++}; ++ ++struct e1000_dev_spec_82575 { ++ bool sgmii_active; ++}; ++ ++struct e1000_dev_spec_vf { ++ u32 vf_number; ++ u32 v2p_mailbox; + }; + + struct e1000_hw { + void *back; +- void *dev_spec; + + u8 __iomem *hw_addr; + u8 __iomem *flash_address; +@@ -580,7 +629,10 @@ + struct e1000_bus_info bus; + struct e1000_host_mng_dhcp_cookie mng_cookie; + +- u32 dev_spec_size; ++ union { ++ struct e1000_dev_spec_82575 _82575; ++ struct e1000_dev_spec_vf vf; ++ } dev_spec; + + u16 device_id; + u16 subsystem_vendor_id; +@@ -590,12 +642,9 @@ + u8 revision_id; + }; + +-#ifdef DEBUG +-extern char *igb_get_hw_dev_name(struct e1000_hw *hw); +-#define hw_dbg(format, arg...) \ +- printk(KERN_DEBUG "%s: " format, igb_get_hw_dev_name(hw), ##arg) +-#else +-#define hw_dbg(format, arg...) +-#endif ++#include "e1000_82575.h" ++ ++/* These functions must be implemented by drivers */ ++s32 e1000_read_pcie_cap_reg(struct e1000_hw *hw, u32 reg, u16 *value); + + #endif +diff -r f5806398a14e drivers/net/igb/e1000_mac.c +--- a/drivers/net/igb/e1000_mac.c Mon Jun 15 11:45:45 2009 +0100 ++++ b/drivers/net/igb/e1000_mac.c Mon Jun 15 11:59:49 2009 +0100 +@@ -1,7 +1,7 @@ + /******************************************************************************* + + Intel(R) Gigabit Ethernet Linux driver +- Copyright(c) 2007 Intel Corporation. ++ Copyright(c) 2007-2009 Intel Corporation. + + This program is free software; you can redistribute it and/or modify it + under the terms and conditions of the GNU General Public License, +@@ -25,111 +25,131 @@ + + *******************************************************************************/ + +-#include +-#include +-#include +-#include ++#include "e1000_api.h" + +-#include "e1000_mac.h" +- +-#include "igb.h" +- +-static s32 igb_set_default_fc(struct e1000_hw *hw); +-static s32 igb_set_fc_watermarks(struct e1000_hw *hw); ++static s32 e1000_set_default_fc_generic(struct e1000_hw *hw); ++static s32 e1000_commit_fc_settings_generic(struct e1000_hw *hw); ++static s32 e1000_poll_fiber_serdes_link_generic(struct e1000_hw *hw); ++static s32 e1000_validate_mdi_setting_generic(struct e1000_hw *hw); ++static void e1000_set_lan_id_multi_port_pcie(struct e1000_hw *hw); + + /** +- * igb_remove_device - Free device specific structure ++ * e1000_init_mac_ops_generic - Initialize MAC function pointers + * @hw: pointer to the HW structure + * +- * If a device specific structure was allocated, this function will +- * free it. ++ * Setups up the function pointers to no-op functions + **/ +-void igb_remove_device(struct e1000_hw *hw) ++void e1000_init_mac_ops_generic(struct e1000_hw *hw) + { +- /* Freeing the dev_spec member of e1000_hw structure */ +- kfree(hw->dev_spec); +-} ++ struct e1000_mac_info *mac = &hw->mac; ++ DEBUGFUNC("e1000_init_mac_ops_generic"); + +-static void igb_read_pci_cfg(struct e1000_hw *hw, u32 reg, u16 *value) +-{ +- struct igb_adapter *adapter = hw->back; +- +- pci_read_config_word(adapter->pdev, reg, value); +-} +- +-static s32 igb_read_pcie_cap_reg(struct e1000_hw *hw, u32 reg, u16 *value) +-{ +- struct igb_adapter *adapter = hw->back; +- u16 cap_offset; +- +- cap_offset = pci_find_capability(adapter->pdev, PCI_CAP_ID_EXP); +- if (!cap_offset) +- return -E1000_ERR_CONFIG; +- +- pci_read_config_word(adapter->pdev, cap_offset + reg, value); +- +- return 0; ++ /* General Setup */ ++ mac->ops.set_lan_id = e1000_set_lan_id_multi_port_pcie; ++ mac->ops.read_mac_addr = e1000_read_mac_addr_generic; ++ mac->ops.config_collision_dist = e1000_config_collision_dist_generic; ++ /* LINK */ ++ mac->ops.wait_autoneg = e1000_wait_autoneg_generic; ++ /* Management */ ++ mac->ops.mng_host_if_write = e1000_mng_host_if_write_generic; ++ mac->ops.mng_write_cmd_header = e1000_mng_write_cmd_header_generic; ++ mac->ops.mng_enable_host_if = e1000_mng_enable_host_if_generic; ++ /* VLAN, MC, etc. */ ++ mac->ops.rar_set = e1000_rar_set_generic; ++ mac->ops.validate_mdi_setting = e1000_validate_mdi_setting_generic; + } + + /** +- * igb_get_bus_info_pcie - Get PCIe bus information ++ * e1000_get_bus_info_pcie_generic - Get PCIe bus information + * @hw: pointer to the HW structure + * + * Determines and stores the system bus information for a particular + * network interface. The following bus information is determined and stored: + * bus speed, bus width, type (PCIe), and PCIe function. + **/ +-s32 igb_get_bus_info_pcie(struct e1000_hw *hw) ++s32 e1000_get_bus_info_pcie_generic(struct e1000_hw *hw) + { ++ struct e1000_mac_info *mac = &hw->mac; + struct e1000_bus_info *bus = &hw->bus; ++ + s32 ret_val; +- u32 status; +- u16 pcie_link_status, pci_header_type; ++ u16 pcie_link_status; ++ ++ DEBUGFUNC("e1000_get_bus_info_pcie_generic"); + + bus->type = e1000_bus_type_pci_express; + bus->speed = e1000_bus_speed_2500; + +- ret_val = igb_read_pcie_cap_reg(hw, +- PCIE_LINK_STATUS, +- &pcie_link_status); ++ ret_val = e1000_read_pcie_cap_reg(hw, ++ PCIE_LINK_STATUS, ++ &pcie_link_status); + if (ret_val) + bus->width = e1000_bus_width_unknown; + else + bus->width = (enum e1000_bus_width)((pcie_link_status & +- PCIE_LINK_WIDTH_MASK) >> +- PCIE_LINK_WIDTH_SHIFT); ++ PCIE_LINK_WIDTH_MASK) >> ++ PCIE_LINK_WIDTH_SHIFT); + +- igb_read_pci_cfg(hw, PCI_HEADER_TYPE_REGISTER, &pci_header_type); +- if (pci_header_type & PCI_HEADER_TYPE_MULTIFUNC) { +- status = rd32(E1000_STATUS); +- bus->func = (status & E1000_STATUS_FUNC_MASK) +- >> E1000_STATUS_FUNC_SHIFT; +- } else { +- bus->func = 0; +- } ++ mac->ops.set_lan_id(hw); + +- return 0; ++ return E1000_SUCCESS; + } + + /** +- * igb_clear_vfta - Clear VLAN filter table ++ * e1000_set_lan_id_multi_port_pcie - Set LAN id for PCIe multiple port devices ++ * ++ * @hw: pointer to the HW structure ++ * ++ * Determines the LAN function id by reading memory-mapped registers ++ * and swaps the port value if requested. ++ **/ ++static void e1000_set_lan_id_multi_port_pcie(struct e1000_hw *hw) ++{ ++ struct e1000_bus_info *bus = &hw->bus; ++ u32 reg; ++ ++ /* ++ * The status register reports the correct function number ++ * for the device regardless of function swap state. ++ */ ++ reg = E1000_READ_REG(hw, E1000_STATUS); ++ bus->func = (reg & E1000_STATUS_FUNC_MASK) >> E1000_STATUS_FUNC_SHIFT; ++} ++ ++/** ++ * e1000_set_lan_id_single_port - Set LAN id for a single port device ++ * @hw: pointer to the HW structure ++ * ++ * Sets the LAN function id to zero for a single port device. ++ **/ ++void e1000_set_lan_id_single_port(struct e1000_hw *hw) ++{ ++ struct e1000_bus_info *bus = &hw->bus; ++ ++ bus->func = 0; ++} ++ ++/** ++ * e1000_clear_vfta_generic - Clear VLAN filter table + * @hw: pointer to the HW structure + * + * Clears the register array which contains the VLAN filter table by + * setting all the values to 0. + **/ +-void igb_clear_vfta(struct e1000_hw *hw) ++void e1000_clear_vfta_generic(struct e1000_hw *hw) + { + u32 offset; + ++ DEBUGFUNC("e1000_clear_vfta_generic"); ++ + for (offset = 0; offset < E1000_VLAN_FILTER_TBL_SIZE; offset++) { +- array_wr32(E1000_VFTA, offset, 0); +- wrfl(); ++ E1000_WRITE_REG_ARRAY(hw, E1000_VFTA, offset, 0); ++ E1000_WRITE_FLUSH(hw); + } + } + + /** +- * igb_write_vfta - Write value to VLAN filter table ++ * e1000_write_vfta_generic - Write value to VLAN filter table + * @hw: pointer to the HW structure + * @offset: register offset in VLAN filter table + * @value: register value written to VLAN filter table +@@ -137,34 +157,65 @@ + * Writes value at the given offset in the register array which stores + * the VLAN filter table. + **/ +-void igb_write_vfta(struct e1000_hw *hw, u32 offset, u32 value) ++void e1000_write_vfta_generic(struct e1000_hw *hw, u32 offset, u32 value) + { +- array_wr32(E1000_VFTA, offset, value); +- wrfl(); ++ DEBUGFUNC("e1000_write_vfta_generic"); ++ ++ E1000_WRITE_REG_ARRAY(hw, E1000_VFTA, offset, value); ++ E1000_WRITE_FLUSH(hw); + } + + /** +- * igb_check_alt_mac_addr - Check for alternate MAC addr ++ * e1000_init_rx_addrs_generic - Initialize receive address's ++ * @hw: pointer to the HW structure ++ * @rar_count: receive address registers ++ * ++ * Setups the receive address registers by setting the base receive address ++ * register to the devices MAC address and clearing all the other receive ++ * address registers to 0. ++ **/ ++void e1000_init_rx_addrs_generic(struct e1000_hw *hw, u16 rar_count) ++{ ++ u32 i; ++ u8 mac_addr[ETH_ADDR_LEN] = {0}; ++ ++ DEBUGFUNC("e1000_init_rx_addrs_generic"); ++ ++ /* Setup the receive address */ ++ DEBUGOUT("Programming MAC Address into RAR[0]\n"); ++ ++ hw->mac.ops.rar_set(hw, hw->mac.addr, 0); ++ ++ /* Zero out the other (rar_entry_count - 1) receive addresses */ ++ DEBUGOUT1("Clearing RAR[1-%u]\n", rar_count-1); ++ for (i = 1; i < rar_count; i++) ++ hw->mac.ops.rar_set(hw, mac_addr, i); ++} ++ ++/** ++ * e1000_check_alt_mac_addr_generic - Check for alternate MAC addr + * @hw: pointer to the HW structure + * + * Checks the nvm for an alternate MAC address. An alternate MAC address + * can be setup by pre-boot software and must be treated like a permanent + * address and must override the actual permanent MAC address. If an +- * alternate MAC address is fopund it is saved in the hw struct and +- * prgrammed into RAR0 and the cuntion returns success, otherwise the +- * fucntion returns an error. ++ * alternate MAC address is found it is saved in the hw struct and ++ * programmed into RAR0 and the function returns success, otherwise the ++ * function returns an error. + **/ +-s32 igb_check_alt_mac_addr(struct e1000_hw *hw) ++s32 e1000_check_alt_mac_addr_generic(struct e1000_hw *hw) + { + u32 i; +- s32 ret_val = 0; ++ s32 ret_val = E1000_SUCCESS; + u16 offset, nvm_alt_mac_addr_offset, nvm_data; +- u8 alt_mac_addr[ETH_ALEN]; ++ u8 alt_mac_addr[ETH_ADDR_LEN]; + +- ret_val = hw->nvm.ops.read_nvm(hw, NVM_ALT_MAC_ADDR_PTR, 1, +- &nvm_alt_mac_addr_offset); ++ DEBUGFUNC("e1000_check_alt_mac_addr_generic"); ++ ++ ret_val = hw->nvm.ops.read(hw, NVM_ALT_MAC_ADDR_PTR, 1, ++ &nvm_alt_mac_addr_offset); + if (ret_val) { +- hw_dbg("NVM Read Error\n"); ++ DEBUGOUT("NVM Read Error\n"); + goto out; + } + +@@ -174,13 +225,12 @@ + } + + if (hw->bus.func == E1000_FUNC_1) +- nvm_alt_mac_addr_offset += ETH_ALEN/sizeof(u16); +- +- for (i = 0; i < ETH_ALEN; i += 2) { ++ nvm_alt_mac_addr_offset += E1000_ALT_MAC_ADDRESS_OFFSET_LAN1; ++ for (i = 0; i < ETH_ADDR_LEN; i += 2) { + offset = nvm_alt_mac_addr_offset + (i >> 1); +- ret_val = hw->nvm.ops.read_nvm(hw, offset, 1, &nvm_data); ++ ret_val = hw->nvm.ops.read(hw, offset, 1, &nvm_data); + if (ret_val) { +- hw_dbg("NVM Read Error\n"); ++ DEBUGOUT("NVM Read Error\n"); + goto out; + } + +@@ -194,7 +244,7 @@ + goto out; + } + +- for (i = 0; i < ETH_ALEN; i++) ++ for (i = 0; i < ETH_ADDR_LEN; i++) + hw->mac.addr[i] = hw->mac.perm_addr[i] = alt_mac_addr[i]; + + hw->mac.ops.rar_set(hw, hw->mac.perm_addr, 0); +@@ -204,7 +254,7 @@ + } + + /** +- * igb_rar_set - Set receive address register ++ * e1000_rar_set_generic - Set receive address register + * @hw: pointer to the HW structure + * @addr: pointer to the receive address + * @index: receive address array register +@@ -212,29 +262,39 @@ + * Sets the receive address array register at index to the address passed + * in by addr. + **/ +-void igb_rar_set(struct e1000_hw *hw, u8 *addr, u32 index) ++void e1000_rar_set_generic(struct e1000_hw *hw, u8 *addr, u32 index) + { + u32 rar_low, rar_high; ++ ++ DEBUGFUNC("e1000_rar_set_generic"); + + /* + * HW expects these in little endian so we reverse the byte order + * from network order (big endian) to little endian + */ + rar_low = ((u32) addr[0] | +- ((u32) addr[1] << 8) | +- ((u32) addr[2] << 16) | ((u32) addr[3] << 24)); ++ ((u32) addr[1] << 8) | ++ ((u32) addr[2] << 16) | ((u32) addr[3] << 24)); + + rar_high = ((u32) addr[4] | ((u32) addr[5] << 8)); + +- if (!hw->mac.disable_av) ++ /* If MAC address zero, no need to set the AV bit */ ++ if (rar_low || rar_high) + rar_high |= E1000_RAH_AV; + +- array_wr32(E1000_RA, (index << 1), rar_low); +- array_wr32(E1000_RA, ((index << 1) + 1), rar_high); ++ /* ++ * Some bridges will combine consecutive 32-bit writes into ++ * a single burst write, which will malfunction on some parts. ++ * The flushes avoid this. ++ */ ++ E1000_WRITE_REG(hw, E1000_RAL(index), rar_low); ++ E1000_WRITE_FLUSH(hw); ++ E1000_WRITE_REG(hw, E1000_RAH(index), rar_high); ++ E1000_WRITE_FLUSH(hw); + } + + /** +- * igb_mta_set - Set multicast filter table address ++ * e1000_mta_set_generic - Set multicast filter table address + * @hw: pointer to the HW structure + * @hash_value: determines the MTA register and bit to set + * +@@ -243,10 +303,11 @@ + * current value is read, the new bit is OR'd in and the new value is + * written back into the register. + **/ +-void igb_mta_set(struct e1000_hw *hw, u32 hash_value) ++void e1000_mta_set_generic(struct e1000_hw *hw, u32 hash_value) + { + u32 hash_bit, hash_reg, mta; + ++ DEBUGFUNC("e1000_mta_set_generic"); + /* + * The MTA is a register array of 32-bit registers. It is + * treated like an array of (32*mta_reg_count) bits. We want to +@@ -260,27 +321,83 @@ + hash_reg = (hash_value >> 5) & (hw->mac.mta_reg_count - 1); + hash_bit = hash_value & 0x1F; + +- mta = array_rd32(E1000_MTA, hash_reg); ++ mta = E1000_READ_REG_ARRAY(hw, E1000_MTA, hash_reg); + + mta |= (1 << hash_bit); + +- array_wr32(E1000_MTA, hash_reg, mta); +- wrfl(); ++ E1000_WRITE_REG_ARRAY(hw, E1000_MTA, hash_reg, mta); ++ E1000_WRITE_FLUSH(hw); + } + + /** +- * igb_hash_mc_addr - Generate a multicast hash value ++ * e1000_update_mc_addr_list_generic - Update Multicast addresses ++ * @hw: pointer to the HW structure ++ * @mc_addr_list: array of multicast addresses to program ++ * @mc_addr_count: number of multicast addresses to program ++ * @rar_used_count: the first RAR register free to program ++ * @rar_count: total number of supported Receive Address Registers ++ * ++ * Updates the Receive Address Registers and Multicast Table Array. ++ * The caller must have a packed mc_addr_list of multicast addresses. ++ * The parameter rar_count will usually be hw->mac.rar_entry_count ++ * unless there are workarounds that change this. ++ **/ ++void e1000_update_mc_addr_list_generic(struct e1000_hw *hw, ++ u8 *mc_addr_list, u32 mc_addr_count, ++ u32 rar_used_count, u32 rar_count) ++{ ++ u32 hash_value; ++ u32 i; ++ u8 mac_addr[ETH_ADDR_LEN] = {0}; ++ ++ DEBUGFUNC("e1000_update_mc_addr_list_generic"); ++ ++ /* ++ * Load the first set of multicast addresses into the exact ++ * filters (RAR). If there are not enough to fill the RAR ++ * array, clear the filters. ++ */ ++ for (i = rar_used_count; i < rar_count; i++) { ++ if (mc_addr_count) { ++ hw->mac.ops.rar_set(hw, mc_addr_list, i); ++ mc_addr_count--; ++ mc_addr_list += ETH_ADDR_LEN; ++ } else { ++ hw->mac.ops.rar_set(hw, mac_addr, i); ++ } ++ } ++ ++ /* Clear the old settings from the MTA */ ++ DEBUGOUT("Clearing MTA\n"); ++ for (i = 0; i < hw->mac.mta_reg_count; i++) { ++ E1000_WRITE_REG_ARRAY(hw, E1000_MTA, i, 0); ++ E1000_WRITE_FLUSH(hw); ++ } ++ ++ /* Load any remaining multicast addresses into the hash table. */ ++ for (; mc_addr_count > 0; mc_addr_count--) { ++ hash_value = e1000_hash_mc_addr_generic(hw, mc_addr_list); ++ DEBUGOUT1("Hash value = 0x%03X\n", hash_value); ++ hw->mac.ops.mta_set(hw, hash_value); ++ mc_addr_list += ETH_ADDR_LEN; ++ } ++} ++ ++/** ++ * e1000_hash_mc_addr_generic - Generate a multicast hash value + * @hw: pointer to the HW structure + * @mc_addr: pointer to a multicast address + * + * Generates a multicast address hash value which is used to determine + * the multicast filter table array address and new table value. See +- * igb_mta_set() ++ * e1000_mta_set_generic() + **/ +-u32 igb_hash_mc_addr(struct e1000_hw *hw, u8 *mc_addr) ++u32 e1000_hash_mc_addr_generic(struct e1000_hw *hw, u8 *mc_addr) + { + u32 hash_value, hash_mask; + u8 bit_shift = 0; ++ ++ DEBUGFUNC("e1000_hash_mc_addr_generic"); + + /* Register count multiplied by bits per register */ + hash_mask = (hw->mac.mta_reg_count * 32) - 1; +@@ -334,73 +451,75 @@ + } + + hash_value = hash_mask & (((mc_addr[4] >> (8 - bit_shift)) | +- (((u16) mc_addr[5]) << bit_shift))); ++ (((u16) mc_addr[5]) << bit_shift))); + + return hash_value; + } + + /** +- * igb_clear_hw_cntrs_base - Clear base hardware counters ++ * e1000_clear_hw_cntrs_base_generic - Clear base hardware counters + * @hw: pointer to the HW structure + * + * Clears the base hardware counters by reading the counter registers. + **/ +-void igb_clear_hw_cntrs_base(struct e1000_hw *hw) ++void e1000_clear_hw_cntrs_base_generic(struct e1000_hw *hw) + { +- u32 temp; ++ DEBUGFUNC("e1000_clear_hw_cntrs_base_generic"); + +- temp = rd32(E1000_CRCERRS); +- temp = rd32(E1000_SYMERRS); +- temp = rd32(E1000_MPC); +- temp = rd32(E1000_SCC); +- temp = rd32(E1000_ECOL); +- temp = rd32(E1000_MCC); +- temp = rd32(E1000_LATECOL); +- temp = rd32(E1000_COLC); +- temp = rd32(E1000_DC); +- temp = rd32(E1000_SEC); +- temp = rd32(E1000_RLEC); +- temp = rd32(E1000_XONRXC); +- temp = rd32(E1000_XONTXC); +- temp = rd32(E1000_XOFFRXC); +- temp = rd32(E1000_XOFFTXC); +- temp = rd32(E1000_FCRUC); +- temp = rd32(E1000_GPRC); +- temp = rd32(E1000_BPRC); +- temp = rd32(E1000_MPRC); +- temp = rd32(E1000_GPTC); +- temp = rd32(E1000_GORCL); +- temp = rd32(E1000_GORCH); +- temp = rd32(E1000_GOTCL); +- temp = rd32(E1000_GOTCH); +- temp = rd32(E1000_RNBC); +- temp = rd32(E1000_RUC); +- temp = rd32(E1000_RFC); +- temp = rd32(E1000_ROC); +- temp = rd32(E1000_RJC); +- temp = rd32(E1000_TORL); +- temp = rd32(E1000_TORH); +- temp = rd32(E1000_TOTL); +- temp = rd32(E1000_TOTH); +- temp = rd32(E1000_TPR); +- temp = rd32(E1000_TPT); +- temp = rd32(E1000_MPTC); +- temp = rd32(E1000_BPTC); ++ E1000_READ_REG(hw, E1000_CRCERRS); ++ E1000_READ_REG(hw, E1000_SYMERRS); ++ E1000_READ_REG(hw, E1000_MPC); ++ E1000_READ_REG(hw, E1000_SCC); ++ E1000_READ_REG(hw, E1000_ECOL); ++ E1000_READ_REG(hw, E1000_MCC); ++ E1000_READ_REG(hw, E1000_LATECOL); ++ E1000_READ_REG(hw, E1000_COLC); ++ E1000_READ_REG(hw, E1000_DC); ++ E1000_READ_REG(hw, E1000_SEC); ++ E1000_READ_REG(hw, E1000_RLEC); ++ E1000_READ_REG(hw, E1000_XONRXC); ++ E1000_READ_REG(hw, E1000_XONTXC); ++ E1000_READ_REG(hw, E1000_XOFFRXC); ++ E1000_READ_REG(hw, E1000_XOFFTXC); ++ E1000_READ_REG(hw, E1000_FCRUC); ++ E1000_READ_REG(hw, E1000_GPRC); ++ E1000_READ_REG(hw, E1000_BPRC); ++ E1000_READ_REG(hw, E1000_MPRC); ++ E1000_READ_REG(hw, E1000_GPTC); ++ E1000_READ_REG(hw, E1000_GORCL); ++ E1000_READ_REG(hw, E1000_GORCH); ++ E1000_READ_REG(hw, E1000_GOTCL); ++ E1000_READ_REG(hw, E1000_GOTCH); ++ E1000_READ_REG(hw, E1000_RNBC); ++ E1000_READ_REG(hw, E1000_RUC); ++ E1000_READ_REG(hw, E1000_RFC); ++ E1000_READ_REG(hw, E1000_ROC); ++ E1000_READ_REG(hw, E1000_RJC); ++ E1000_READ_REG(hw, E1000_TORL); ++ E1000_READ_REG(hw, E1000_TORH); ++ E1000_READ_REG(hw, E1000_TOTL); ++ E1000_READ_REG(hw, E1000_TOTH); ++ E1000_READ_REG(hw, E1000_TPR); ++ E1000_READ_REG(hw, E1000_TPT); ++ E1000_READ_REG(hw, E1000_MPTC); ++ E1000_READ_REG(hw, E1000_BPTC); + } + + /** +- * igb_check_for_copper_link - Check for link (Copper) ++ * e1000_check_for_copper_link_generic - Check for link (Copper) + * @hw: pointer to the HW structure + * + * Checks to see of the link status of the hardware has changed. If a + * change in link status has been detected, then we read the PHY registers + * to get the current speed/duplex if link exists. + **/ +-s32 igb_check_for_copper_link(struct e1000_hw *hw) ++s32 e1000_check_for_copper_link_generic(struct e1000_hw *hw) + { + struct e1000_mac_info *mac = &hw->mac; + s32 ret_val; + bool link; ++ ++ DEBUGFUNC("e1000_check_for_copper_link"); + + /* + * We only want to go out to the PHY registers to see if Auto-Neg +@@ -409,7 +528,7 @@ + * Change or Rx Sequence Error interrupt. + */ + if (!mac->get_link_status) { +- ret_val = 0; ++ ret_val = E1000_SUCCESS; + goto out; + } + +@@ -418,7 +537,7 @@ + * link. If so, then we want to get the current speed/duplex + * of the PHY. + */ +- ret_val = igb_phy_has_link(hw, 1, 0, &link); ++ ret_val = e1000_phy_has_link_generic(hw, 1, 0, &link); + if (ret_val) + goto out; + +@@ -431,7 +550,7 @@ + * Check if there was DownShift, must be checked + * immediately after link-up + */ +- igb_check_downshift(hw); ++ e1000_check_downshift_generic(hw); + + /* + * If we are forcing speed/duplex, then we simply return since +@@ -447,7 +566,7 @@ + * of MAC speed/duplex configuration. So we only need to + * configure Collision Distance in the MAC. + */ +- igb_config_collision_dist(hw); ++ e1000_config_collision_dist_generic(hw); + + /* + * Configure Flow Control now that Auto-Neg has completed. +@@ -455,16 +574,198 @@ + * settings because we may have had to re-autoneg with a + * different link partner. + */ +- ret_val = igb_config_fc_after_link_up(hw); ++ ret_val = e1000_config_fc_after_link_up_generic(hw); + if (ret_val) +- hw_dbg("Error configuring flow control\n"); ++ DEBUGOUT("Error configuring flow control\n"); + + out: + return ret_val; + } + + /** +- * igb_setup_link - Setup flow control and link settings ++ * e1000_check_for_fiber_link_generic - Check for link (Fiber) ++ * @hw: pointer to the HW structure ++ * ++ * Checks for link up on the hardware. If link is not up and we have ++ * a signal, then we need to force link up. ++ **/ ++s32 e1000_check_for_fiber_link_generic(struct e1000_hw *hw) ++{ ++ struct e1000_mac_info *mac = &hw->mac; ++ u32 rxcw; ++ u32 ctrl; ++ u32 status; ++ s32 ret_val = E1000_SUCCESS; ++ ++ DEBUGFUNC("e1000_check_for_fiber_link_generic"); ++ ++ ctrl = E1000_READ_REG(hw, E1000_CTRL); ++ status = E1000_READ_REG(hw, E1000_STATUS); ++ rxcw = E1000_READ_REG(hw, E1000_RXCW); ++ ++ /* ++ * If we don't have link (auto-negotiation failed or link partner ++ * cannot auto-negotiate), the cable is plugged in (we have signal), ++ * and our link partner is not trying to auto-negotiate with us (we ++ * are receiving idles or data), we need to force link up. We also ++ * need to give auto-negotiation time to complete, in case the cable ++ * was just plugged in. The autoneg_failed flag does this. ++ */ ++ /* (ctrl & E1000_CTRL_SWDPIN1) == 1 == have signal */ ++ if ((ctrl & E1000_CTRL_SWDPIN1) && (!(status & E1000_STATUS_LU)) && ++ (!(rxcw & E1000_RXCW_C))) { ++ if (mac->autoneg_failed == 0) { ++ mac->autoneg_failed = 1; ++ goto out; ++ } ++ DEBUGOUT("NOT RXing /C/, disable AutoNeg and force link.\n"); ++ ++ /* Disable auto-negotiation in the TXCW register */ ++ E1000_WRITE_REG(hw, E1000_TXCW, (mac->txcw & ~E1000_TXCW_ANE)); ++ ++ /* Force link-up and also force full-duplex. */ ++ ctrl = E1000_READ_REG(hw, E1000_CTRL); ++ ctrl |= (E1000_CTRL_SLU | E1000_CTRL_FD); ++ E1000_WRITE_REG(hw, E1000_CTRL, ctrl); ++ ++ /* Configure Flow Control after forcing link up. */ ++ ret_val = e1000_config_fc_after_link_up_generic(hw); ++ if (ret_val) { ++ DEBUGOUT("Error configuring flow control\n"); ++ goto out; ++ } ++ } else if ((ctrl & E1000_CTRL_SLU) && (rxcw & E1000_RXCW_C)) { ++ /* ++ * If we are forcing link and we are receiving /C/ ordered ++ * sets, re-enable auto-negotiation in the TXCW register ++ * and disable forced link in the Device Control register ++ * in an attempt to auto-negotiate with our link partner. ++ */ ++ DEBUGOUT("RXing /C/, enable AutoNeg and stop forcing link.\n"); ++ E1000_WRITE_REG(hw, E1000_TXCW, mac->txcw); ++ E1000_WRITE_REG(hw, E1000_CTRL, (ctrl & ~E1000_CTRL_SLU)); ++ ++ mac->serdes_has_link = true; ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_check_for_serdes_link_generic - Check for link (Serdes) ++ * @hw: pointer to the HW structure ++ * ++ * Checks for link up on the hardware. If link is not up and we have ++ * a signal, then we need to force link up. ++ **/ ++s32 e1000_check_for_serdes_link_generic(struct e1000_hw *hw) ++{ ++ struct e1000_mac_info *mac = &hw->mac; ++ u32 rxcw; ++ u32 ctrl; ++ u32 status; ++ s32 ret_val = E1000_SUCCESS; ++ ++ DEBUGFUNC("e1000_check_for_serdes_link_generic"); ++ ++ ctrl = E1000_READ_REG(hw, E1000_CTRL); ++ status = E1000_READ_REG(hw, E1000_STATUS); ++ rxcw = E1000_READ_REG(hw, E1000_RXCW); ++ ++ /* ++ * If we don't have link (auto-negotiation failed or link partner ++ * cannot auto-negotiate), and our link partner is not trying to ++ * auto-negotiate with us (we are receiving idles or data), ++ * we need to force link up. We also need to give auto-negotiation ++ * time to complete. ++ */ ++ /* (ctrl & E1000_CTRL_SWDPIN1) == 1 == have signal */ ++ if ((!(status & E1000_STATUS_LU)) && (!(rxcw & E1000_RXCW_C))) { ++ if (mac->autoneg_failed == 0) { ++ mac->autoneg_failed = 1; ++ goto out; ++ } ++ DEBUGOUT("NOT RXing /C/, disable AutoNeg and force link.\n"); ++ ++ /* Disable auto-negotiation in the TXCW register */ ++ E1000_WRITE_REG(hw, E1000_TXCW, (mac->txcw & ~E1000_TXCW_ANE)); ++ ++ /* Force link-up and also force full-duplex. */ ++ ctrl = E1000_READ_REG(hw, E1000_CTRL); ++ ctrl |= (E1000_CTRL_SLU | E1000_CTRL_FD); ++ E1000_WRITE_REG(hw, E1000_CTRL, ctrl); ++ ++ /* Configure Flow Control after forcing link up. */ ++ ret_val = e1000_config_fc_after_link_up_generic(hw); ++ if (ret_val) { ++ DEBUGOUT("Error configuring flow control\n"); ++ goto out; ++ } ++ } else if ((ctrl & E1000_CTRL_SLU) && (rxcw & E1000_RXCW_C)) { ++ /* ++ * If we are forcing link and we are receiving /C/ ordered ++ * sets, re-enable auto-negotiation in the TXCW register ++ * and disable forced link in the Device Control register ++ * in an attempt to auto-negotiate with our link partner. ++ */ ++ DEBUGOUT("RXing /C/, enable AutoNeg and stop forcing link.\n"); ++ E1000_WRITE_REG(hw, E1000_TXCW, mac->txcw); ++ E1000_WRITE_REG(hw, E1000_CTRL, (ctrl & ~E1000_CTRL_SLU)); ++ ++ mac->serdes_has_link = true; ++ } else if (!(E1000_TXCW_ANE & E1000_READ_REG(hw, E1000_TXCW))) { ++ /* ++ * If we force link for non-auto-negotiation switch, check ++ * link status based on MAC synchronization for internal ++ * serdes media type. ++ */ ++ /* SYNCH bit and IV bit are sticky. */ ++ usec_delay(10); ++ rxcw = E1000_READ_REG(hw, E1000_RXCW); ++ if (rxcw & E1000_RXCW_SYNCH) { ++ if (!(rxcw & E1000_RXCW_IV)) { ++ mac->serdes_has_link = true; ++ DEBUGOUT("SERDES: Link up - forced.\n"); ++ } ++ } else { ++ mac->serdes_has_link = false; ++ DEBUGOUT("SERDES: Link down - force failed.\n"); ++ } ++ } ++ ++ if (E1000_TXCW_ANE & E1000_READ_REG(hw, E1000_TXCW)) { ++ status = E1000_READ_REG(hw, E1000_STATUS); ++ if (status & E1000_STATUS_LU) { ++ /* SYNCH bit and IV bit are sticky, so reread rxcw. */ ++ usec_delay(10); ++ rxcw = E1000_READ_REG(hw, E1000_RXCW); ++ if (rxcw & E1000_RXCW_SYNCH) { ++ if (!(rxcw & E1000_RXCW_IV)) { ++ mac->serdes_has_link = true; ++ DEBUGOUT("SERDES: Link up - autoneg " ++ "completed sucessfully.\n"); ++ } else { ++ mac->serdes_has_link = false; ++ DEBUGOUT("SERDES: Link down - invalid" ++ "codewords detected in autoneg.\n"); ++ } ++ } else { ++ mac->serdes_has_link = false; ++ DEBUGOUT("SERDES: Link down - no sync.\n"); ++ } ++ } else { ++ mac->serdes_has_link = false; ++ DEBUGOUT("SERDES: Link down - autoneg failed\n"); ++ } ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_setup_link_generic - Setup flow control and link settings + * @hw: pointer to the HW structure + * + * Determines which flow control settings to use, then configures flow +@@ -473,29 +774,38 @@ + * should be established. Assumes the hardware has previously been reset + * and the transmitter and receiver are not enabled. + **/ +-s32 igb_setup_link(struct e1000_hw *hw) ++s32 e1000_setup_link_generic(struct e1000_hw *hw) + { +- s32 ret_val = 0; ++ s32 ret_val = E1000_SUCCESS; ++ ++ DEBUGFUNC("e1000_setup_link_generic"); + + /* + * In the case of the phy reset being blocked, we already have a link. + * We do not need to set it up again. + */ +- if (igb_check_reset_block(hw)) +- goto out; +- +- ret_val = igb_set_default_fc(hw); +- if (ret_val) +- goto out; ++ if (hw->phy.ops.check_reset_block) ++ if (hw->phy.ops.check_reset_block(hw)) ++ goto out; + + /* +- * We want to save off the original Flow Control configuration just +- * in case we get disconnected and then reconnected into a different +- * hub or switch with different Flow Control capabilities. ++ * If requested flow control is set to default, set flow control ++ * based on the EEPROM flow control settings. + */ +- hw->fc.original_type = hw->fc.type; ++ if (hw->fc.requested_mode == e1000_fc_default) { ++ ret_val = e1000_set_default_fc_generic(hw); ++ if (ret_val) ++ goto out; ++ } + +- hw_dbg("After fix-ups FlowControl is now = %x\n", hw->fc.type); ++ /* ++ * Save off the requested flow control mode for use later. Depending ++ * on the link partner's capabilities, we may or may not use this mode. ++ */ ++ hw->fc.current_mode = hw->fc.requested_mode; ++ ++ DEBUGOUT1("After fix-ups FlowControl is now = %x\n", ++ hw->fc.current_mode); + + /* Call the necessary media_type subroutine to configure the link. */ + ret_val = hw->mac.ops.setup_physical_interface(hw); +@@ -508,52 +818,238 @@ + * control is disabled, because it does not hurt anything to + * initialize these registers. + */ +- hw_dbg("Initializing the Flow Control address, type and timer regs\n"); +- wr32(E1000_FCT, FLOW_CONTROL_TYPE); +- wr32(E1000_FCAH, FLOW_CONTROL_ADDRESS_HIGH); +- wr32(E1000_FCAL, FLOW_CONTROL_ADDRESS_LOW); ++ DEBUGOUT("Initializing the Flow Control address, type and timer regs\n"); ++ E1000_WRITE_REG(hw, E1000_FCT, FLOW_CONTROL_TYPE); ++ E1000_WRITE_REG(hw, E1000_FCAH, FLOW_CONTROL_ADDRESS_HIGH); ++ E1000_WRITE_REG(hw, E1000_FCAL, FLOW_CONTROL_ADDRESS_LOW); + +- wr32(E1000_FCTTV, hw->fc.pause_time); ++ E1000_WRITE_REG(hw, E1000_FCTTV, hw->fc.pause_time); + +- ret_val = igb_set_fc_watermarks(hw); ++ ret_val = e1000_set_fc_watermarks_generic(hw); + + out: + return ret_val; + } + + /** +- * igb_config_collision_dist - Configure collision distance ++ * e1000_setup_fiber_serdes_link_generic - Setup link for fiber/serdes ++ * @hw: pointer to the HW structure ++ * ++ * Configures collision distance and flow control for fiber and serdes ++ * links. Upon successful setup, poll for link. ++ **/ ++s32 e1000_setup_fiber_serdes_link_generic(struct e1000_hw *hw) ++{ ++ u32 ctrl; ++ s32 ret_val = E1000_SUCCESS; ++ ++ DEBUGFUNC("e1000_setup_fiber_serdes_link_generic"); ++ ++ ctrl = E1000_READ_REG(hw, E1000_CTRL); ++ ++ /* Take the link out of reset */ ++ ctrl &= ~E1000_CTRL_LRST; ++ ++ e1000_config_collision_dist_generic(hw); ++ ++ ret_val = e1000_commit_fc_settings_generic(hw); ++ if (ret_val) ++ goto out; ++ ++ /* ++ * Since auto-negotiation is enabled, take the link out of reset (the ++ * link will be in reset, because we previously reset the chip). This ++ * will restart auto-negotiation. If auto-negotiation is successful ++ * then the link-up status bit will be set and the flow control enable ++ * bits (RFCE and TFCE) will be set according to their negotiated value. ++ */ ++ DEBUGOUT("Auto-negotiation enabled\n"); ++ ++ E1000_WRITE_REG(hw, E1000_CTRL, ctrl); ++ E1000_WRITE_FLUSH(hw); ++ msec_delay(1); ++ ++ /* ++ * For these adapters, the SW definable pin 1 is set when the optics ++ * detect a signal. If we have a signal, then poll for a "Link-Up" ++ * indication. ++ */ ++ if (hw->phy.media_type == e1000_media_type_internal_serdes || ++ (E1000_READ_REG(hw, E1000_CTRL) & E1000_CTRL_SWDPIN1)) { ++ ret_val = e1000_poll_fiber_serdes_link_generic(hw); ++ } else { ++ DEBUGOUT("No signal detected\n"); ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_config_collision_dist_generic - Configure collision distance + * @hw: pointer to the HW structure + * + * Configures the collision distance to the default value and is used + * during link setup. Currently no func pointer exists and all + * implementations are handled in the generic version of this function. + **/ +-void igb_config_collision_dist(struct e1000_hw *hw) ++void e1000_config_collision_dist_generic(struct e1000_hw *hw) + { + u32 tctl; + +- tctl = rd32(E1000_TCTL); ++ DEBUGFUNC("e1000_config_collision_dist_generic"); ++ ++ tctl = E1000_READ_REG(hw, E1000_TCTL); + + tctl &= ~E1000_TCTL_COLD; + tctl |= E1000_COLLISION_DISTANCE << E1000_COLD_SHIFT; + +- wr32(E1000_TCTL, tctl); +- wrfl(); ++ E1000_WRITE_REG(hw, E1000_TCTL, tctl); ++ E1000_WRITE_FLUSH(hw); + } + + /** +- * igb_set_fc_watermarks - Set flow control high/low watermarks ++ * e1000_poll_fiber_serdes_link_generic - Poll for link up ++ * @hw: pointer to the HW structure ++ * ++ * Polls for link up by reading the status register, if link fails to come ++ * up with auto-negotiation, then the link is forced if a signal is detected. ++ **/ ++static s32 e1000_poll_fiber_serdes_link_generic(struct e1000_hw *hw) ++{ ++ struct e1000_mac_info *mac = &hw->mac; ++ u32 i, status; ++ s32 ret_val = E1000_SUCCESS; ++ ++ DEBUGFUNC("e1000_poll_fiber_serdes_link_generic"); ++ ++ /* ++ * If we have a signal (the cable is plugged in, or assumed true for ++ * serdes media) then poll for a "Link-Up" indication in the Device ++ * Status Register. Time-out if a link isn't seen in 500 milliseconds ++ * seconds (Auto-negotiation should complete in less than 500 ++ * milliseconds even if the other end is doing it in SW). ++ */ ++ for (i = 0; i < FIBER_LINK_UP_LIMIT; i++) { ++ msec_delay(10); ++ status = E1000_READ_REG(hw, E1000_STATUS); ++ if (status & E1000_STATUS_LU) ++ break; ++ } ++ if (i == FIBER_LINK_UP_LIMIT) { ++ DEBUGOUT("Never got a valid link from auto-neg!!!\n"); ++ mac->autoneg_failed = 1; ++ /* ++ * AutoNeg failed to achieve a link, so we'll call ++ * mac->check_for_link. This routine will force the ++ * link up if we detect a signal. This will allow us to ++ * communicate with non-autonegotiating link partners. ++ */ ++ ret_val = hw->mac.ops.check_for_link(hw); ++ if (ret_val) { ++ DEBUGOUT("Error while checking for link\n"); ++ goto out; ++ } ++ mac->autoneg_failed = 0; ++ } else { ++ mac->autoneg_failed = 0; ++ DEBUGOUT("Valid Link Found\n"); ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_commit_fc_settings_generic - Configure flow control ++ * @hw: pointer to the HW structure ++ * ++ * Write the flow control settings to the Transmit Config Word Register (TXCW) ++ * base on the flow control settings in e1000_mac_info. ++ **/ ++static s32 e1000_commit_fc_settings_generic(struct e1000_hw *hw) ++{ ++ struct e1000_mac_info *mac = &hw->mac; ++ u32 txcw; ++ s32 ret_val = E1000_SUCCESS; ++ ++ DEBUGFUNC("e1000_commit_fc_settings_generic"); ++ ++ /* ++ * Check for a software override of the flow control settings, and ++ * setup the device accordingly. If auto-negotiation is enabled, then ++ * software will have to set the "PAUSE" bits to the correct value in ++ * the Transmit Config Word Register (TXCW) and re-start auto- ++ * negotiation. However, if auto-negotiation is disabled, then ++ * software will have to manually configure the two flow control enable ++ * bits in the CTRL register. ++ * ++ * The possible values of the "fc" parameter are: ++ * 0: Flow control is completely disabled ++ * 1: Rx flow control is enabled (we can receive pause frames, ++ * but not send pause frames). ++ * 2: Tx flow control is enabled (we can send pause frames but we ++ * do not support receiving pause frames). ++ * 3: Both Rx and Tx flow control (symmetric) are enabled. ++ */ ++ switch (hw->fc.current_mode) { ++ case e1000_fc_none: ++ /* Flow control completely disabled by a software over-ride. */ ++ txcw = (E1000_TXCW_ANE | E1000_TXCW_FD); ++ break; ++ case e1000_fc_rx_pause: ++ /* ++ * Rx Flow control is enabled and Tx Flow control is disabled ++ * by a software over-ride. Since there really isn't a way to ++ * advertise that we are capable of Rx Pause ONLY, we will ++ * advertise that we support both symmetric and asymmetric RX ++ * PAUSE. Later, we will disable the adapter's ability to send ++ * PAUSE frames. ++ */ ++ txcw = (E1000_TXCW_ANE | E1000_TXCW_FD | E1000_TXCW_PAUSE_MASK); ++ break; ++ case e1000_fc_tx_pause: ++ /* ++ * Tx Flow control is enabled, and Rx Flow control is disabled, ++ * by a software over-ride. ++ */ ++ txcw = (E1000_TXCW_ANE | E1000_TXCW_FD | E1000_TXCW_ASM_DIR); ++ break; ++ case e1000_fc_full: ++ /* ++ * Flow control (both Rx and Tx) is enabled by a software ++ * over-ride. ++ */ ++ txcw = (E1000_TXCW_ANE | E1000_TXCW_FD | E1000_TXCW_PAUSE_MASK); ++ break; ++ default: ++ DEBUGOUT("Flow control param set incorrectly\n"); ++ ret_val = -E1000_ERR_CONFIG; ++ goto out; ++ break; ++ } ++ ++ E1000_WRITE_REG(hw, E1000_TXCW, txcw); ++ mac->txcw = txcw; ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_set_fc_watermarks_generic - Set flow control high/low watermarks + * @hw: pointer to the HW structure + * + * Sets the flow control high/low threshold (watermark) registers. If + * flow control XON frame transmission is enabled, then set XON frame +- * tansmission as well. ++ * transmission as well. + **/ +-static s32 igb_set_fc_watermarks(struct e1000_hw *hw) ++s32 e1000_set_fc_watermarks_generic(struct e1000_hw *hw) + { +- s32 ret_val = 0; ++ s32 ret_val = E1000_SUCCESS; + u32 fcrtl = 0, fcrth = 0; ++ ++ DEBUGFUNC("e1000_set_fc_watermarks_generic"); + + /* + * Set the flow control receive threshold registers. Normally, +@@ -562,7 +1058,7 @@ + * ability to transmit pause frames is not enabled, then these + * registers will be set to 0. + */ +- if (hw->fc.type & e1000_fc_tx_pause) { ++ if (hw->fc.current_mode & e1000_fc_tx_pause) { + /* + * We need to set up the Receive Threshold high and low water + * marks as well as (optionally) enabling the transmission of +@@ -574,23 +1070,25 @@ + + fcrth = hw->fc.high_water; + } +- wr32(E1000_FCRTL, fcrtl); +- wr32(E1000_FCRTH, fcrth); ++ E1000_WRITE_REG(hw, E1000_FCRTL, fcrtl); ++ E1000_WRITE_REG(hw, E1000_FCRTH, fcrth); + + return ret_val; + } + + /** +- * igb_set_default_fc - Set flow control default values ++ * e1000_set_default_fc_generic - Set flow control default values + * @hw: pointer to the HW structure + * + * Read the EEPROM for the default values for flow control and store the + * values. + **/ +-static s32 igb_set_default_fc(struct e1000_hw *hw) ++static s32 e1000_set_default_fc_generic(struct e1000_hw *hw) + { +- s32 ret_val = 0; ++ s32 ret_val = E1000_SUCCESS; + u16 nvm_data; ++ ++ DEBUGFUNC("e1000_set_default_fc_generic"); + + /* + * Read and store word 0x0F of the EEPROM. This word contains bits +@@ -601,28 +1099,27 @@ + * control setting, then the variable hw->fc will + * be initialized based on a value in the EEPROM. + */ +- ret_val = hw->nvm.ops.read_nvm(hw, NVM_INIT_CONTROL2_REG, 1, +- &nvm_data); ++ ret_val = hw->nvm.ops.read(hw, NVM_INIT_CONTROL2_REG, 1, &nvm_data); + + if (ret_val) { +- hw_dbg("NVM Read Error\n"); ++ DEBUGOUT("NVM Read Error\n"); + goto out; + } + + if ((nvm_data & NVM_WORD0F_PAUSE_MASK) == 0) +- hw->fc.type = e1000_fc_none; ++ hw->fc.requested_mode = e1000_fc_none; + else if ((nvm_data & NVM_WORD0F_PAUSE_MASK) == + NVM_WORD0F_ASM_DIR) +- hw->fc.type = e1000_fc_tx_pause; ++ hw->fc.requested_mode = e1000_fc_tx_pause; + else +- hw->fc.type = e1000_fc_full; ++ hw->fc.requested_mode = e1000_fc_full; + + out: + return ret_val; + } + + /** +- * igb_force_mac_fc - Force the MAC's flow control settings ++ * e1000_force_mac_fc_generic - Force the MAC's flow control settings + * @hw: pointer to the HW structure + * + * Force the MAC's flow control settings. Sets the TFCE and RFCE bits in the +@@ -631,12 +1128,14 @@ + * autonegotiation is managed by the PHY rather than the MAC. Software must + * also configure these bits when link is forced on a fiber connection. + **/ +-s32 igb_force_mac_fc(struct e1000_hw *hw) ++s32 e1000_force_mac_fc_generic(struct e1000_hw *hw) + { + u32 ctrl; +- s32 ret_val = 0; ++ s32 ret_val = E1000_SUCCESS; + +- ctrl = rd32(E1000_CTRL); ++ DEBUGFUNC("e1000_force_mac_fc_generic"); ++ ++ ctrl = E1000_READ_REG(hw, E1000_CTRL); + + /* + * Because we didn't get link via the internal auto-negotiation +@@ -645,7 +1144,7 @@ + * receive flow control. + * + * The "Case" statement below enables/disable flow control +- * according to the "hw->fc.type" parameter. ++ * according to the "hw->fc.current_mode" parameter. + * + * The possible values of the "fc" parameter are: + * 0: Flow control is completely disabled +@@ -653,12 +1152,12 @@ + * frames but not send pause frames). + * 2: Tx flow control is enabled (we can send pause frames + * frames but we do not receive pause frames). +- * 3: Both Rx and TX flow control (symmetric) is enabled. ++ * 3: Both Rx and Tx flow control (symmetric) is enabled. + * other: No other values should be possible at this point. + */ +- hw_dbg("hw->fc.type = %u\n", hw->fc.type); ++ DEBUGOUT1("hw->fc.current_mode = %u\n", hw->fc.current_mode); + +- switch (hw->fc.type) { ++ switch (hw->fc.current_mode) { + case e1000_fc_none: + ctrl &= (~(E1000_CTRL_TFCE | E1000_CTRL_RFCE)); + break; +@@ -674,19 +1173,19 @@ + ctrl |= (E1000_CTRL_TFCE | E1000_CTRL_RFCE); + break; + default: +- hw_dbg("Flow control param set incorrectly\n"); ++ DEBUGOUT("Flow control param set incorrectly\n"); + ret_val = -E1000_ERR_CONFIG; + goto out; + } + +- wr32(E1000_CTRL, ctrl); ++ E1000_WRITE_REG(hw, E1000_CTRL, ctrl); + + out: + return ret_val; + } + + /** +- * igb_config_fc_after_link_up - Configures flow control after link ++ * e1000_config_fc_after_link_up_generic - Configures flow control after link + * @hw: pointer to the HW structure + * + * Checks the status of auto-negotiation after link up to ensure that the +@@ -695,12 +1194,14 @@ + * and did not fail, then we configure flow control based on our link + * partner. + **/ +-s32 igb_config_fc_after_link_up(struct e1000_hw *hw) ++s32 e1000_config_fc_after_link_up_generic(struct e1000_hw *hw) + { + struct e1000_mac_info *mac = &hw->mac; +- s32 ret_val = 0; ++ s32 ret_val = E1000_SUCCESS; + u16 mii_status_reg, mii_nway_adv_reg, mii_nway_lp_ability_reg; + u16 speed, duplex; ++ ++ DEBUGFUNC("e1000_config_fc_after_link_up_generic"); + + /* + * Check for the case where we have fiber media and auto-neg failed +@@ -710,14 +1211,14 @@ + if (mac->autoneg_failed) { + if (hw->phy.media_type == e1000_media_type_fiber || + hw->phy.media_type == e1000_media_type_internal_serdes) +- ret_val = igb_force_mac_fc(hw); ++ ret_val = e1000_force_mac_fc_generic(hw); + } else { + if (hw->phy.media_type == e1000_media_type_copper) +- ret_val = igb_force_mac_fc(hw); ++ ret_val = e1000_force_mac_fc_generic(hw); + } + + if (ret_val) { +- hw_dbg("Error forcing flow control settings\n"); ++ DEBUGOUT("Error forcing flow control settings\n"); + goto out; + } + +@@ -733,18 +1234,16 @@ + * has completed. We read this twice because this reg has + * some "sticky" (latched) bits. + */ +- ret_val = hw->phy.ops.read_phy_reg(hw, PHY_STATUS, +- &mii_status_reg); ++ ret_val = hw->phy.ops.read_reg(hw, PHY_STATUS, &mii_status_reg); + if (ret_val) + goto out; +- ret_val = hw->phy.ops.read_phy_reg(hw, PHY_STATUS, +- &mii_status_reg); ++ ret_val = hw->phy.ops.read_reg(hw, PHY_STATUS, &mii_status_reg); + if (ret_val) + goto out; + + if (!(mii_status_reg & MII_SR_AUTONEG_COMPLETE)) { +- hw_dbg("Copper PHY and Auto Neg " +- "has not completed.\n"); ++ DEBUGOUT("Copper PHY and Auto Neg " ++ "has not completed.\n"); + goto out; + } + +@@ -755,12 +1254,12 @@ + * Page Ability Register (Address 5) to determine how + * flow control was negotiated. + */ +- ret_val = hw->phy.ops.read_phy_reg(hw, PHY_AUTONEG_ADV, +- &mii_nway_adv_reg); ++ ret_val = hw->phy.ops.read_reg(hw, PHY_AUTONEG_ADV, ++ &mii_nway_adv_reg); + if (ret_val) + goto out; +- ret_val = hw->phy.ops.read_phy_reg(hw, PHY_LP_ABILITY, +- &mii_nway_lp_ability_reg); ++ ret_val = hw->phy.ops.read_reg(hw, PHY_LP_ABILITY, ++ &mii_nway_lp_ability_reg); + if (ret_val) + goto out; + +@@ -801,19 +1300,19 @@ + if ((mii_nway_adv_reg & NWAY_AR_PAUSE) && + (mii_nway_lp_ability_reg & NWAY_LPAR_PAUSE)) { + /* +- * Now we need to check if the user selected RX ONLY ++ * Now we need to check if the user selected Rx ONLY + * of pause frames. In this case, we had to advertise + * FULL flow control because we could not advertise RX + * ONLY. Hence, we must now check to see if we need to + * turn OFF the TRANSMISSION of PAUSE frames. + */ +- if (hw->fc.original_type == e1000_fc_full) { +- hw->fc.type = e1000_fc_full; +- hw_dbg("Flow Control = FULL.\r\n"); ++ if (hw->fc.requested_mode == e1000_fc_full) { ++ hw->fc.current_mode = e1000_fc_full; ++ DEBUGOUT("Flow Control = FULL.\r\n"); + } else { +- hw->fc.type = e1000_fc_rx_pause; +- hw_dbg("Flow Control = " +- "RX PAUSE frames only.\r\n"); ++ hw->fc.current_mode = e1000_fc_rx_pause; ++ DEBUGOUT("Flow Control = " ++ "RX PAUSE frames only.\r\n"); + } + } + /* +@@ -825,11 +1324,11 @@ + * 0 | 1 | 1 | 1 | e1000_fc_tx_pause + */ + else if (!(mii_nway_adv_reg & NWAY_AR_PAUSE) && +- (mii_nway_adv_reg & NWAY_AR_ASM_DIR) && +- (mii_nway_lp_ability_reg & NWAY_LPAR_PAUSE) && +- (mii_nway_lp_ability_reg & NWAY_LPAR_ASM_DIR)) { +- hw->fc.type = e1000_fc_tx_pause; +- hw_dbg("Flow Control = TX PAUSE frames only.\r\n"); ++ (mii_nway_adv_reg & NWAY_AR_ASM_DIR) && ++ (mii_nway_lp_ability_reg & NWAY_LPAR_PAUSE) && ++ (mii_nway_lp_ability_reg & NWAY_LPAR_ASM_DIR)) { ++ hw->fc.current_mode = e1000_fc_tx_pause; ++ DEBUGOUT("Flow Control = TX PAUSE frames only.\r\n"); + } + /* + * For transmitting PAUSE frames ONLY. +@@ -840,41 +1339,18 @@ + * 1 | 1 | 0 | 1 | e1000_fc_rx_pause + */ + else if ((mii_nway_adv_reg & NWAY_AR_PAUSE) && +- (mii_nway_adv_reg & NWAY_AR_ASM_DIR) && +- !(mii_nway_lp_ability_reg & NWAY_LPAR_PAUSE) && +- (mii_nway_lp_ability_reg & NWAY_LPAR_ASM_DIR)) { +- hw->fc.type = e1000_fc_rx_pause; +- hw_dbg("Flow Control = RX PAUSE frames only.\r\n"); +- } +- /* +- * Per the IEEE spec, at this point flow control should be +- * disabled. However, we want to consider that we could +- * be connected to a legacy switch that doesn't advertise +- * desired flow control, but can be forced on the link +- * partner. So if we advertised no flow control, that is +- * what we will resolve to. If we advertised some kind of +- * receive capability (Rx Pause Only or Full Flow Control) +- * and the link partner advertised none, we will configure +- * ourselves to enable Rx Flow Control only. We can do +- * this safely for two reasons: If the link partner really +- * didn't want flow control enabled, and we enable Rx, no +- * harm done since we won't be receiving any PAUSE frames +- * anyway. If the intent on the link partner was to have +- * flow control enabled, then by us enabling RX only, we +- * can at least receive pause frames and process them. +- * This is a good idea because in most cases, since we are +- * predominantly a server NIC, more times than not we will +- * be asked to delay transmission of packets than asking +- * our link partner to pause transmission of frames. +- */ +- else if ((hw->fc.original_type == e1000_fc_none || +- hw->fc.original_type == e1000_fc_tx_pause) || +- hw->fc.strict_ieee) { +- hw->fc.type = e1000_fc_none; +- hw_dbg("Flow Control = NONE.\r\n"); ++ (mii_nway_adv_reg & NWAY_AR_ASM_DIR) && ++ !(mii_nway_lp_ability_reg & NWAY_LPAR_PAUSE) && ++ (mii_nway_lp_ability_reg & NWAY_LPAR_ASM_DIR)) { ++ hw->fc.current_mode = e1000_fc_rx_pause; ++ DEBUGOUT("Flow Control = RX PAUSE frames only.\r\n"); + } else { +- hw->fc.type = e1000_fc_rx_pause; +- hw_dbg("Flow Control = RX PAUSE frames only.\r\n"); ++ /* ++ * Per the IEEE spec, at this point flow control ++ * should be disabled. ++ */ ++ hw->fc.current_mode = e1000_fc_none; ++ DEBUGOUT("Flow Control = NONE.\r\n"); + } + + /* +@@ -882,22 +1358,22 @@ + * negotiated to HALF DUPLEX, flow control should not be + * enabled per IEEE 802.3 spec. + */ +- ret_val = hw->mac.ops.get_speed_and_duplex(hw, &speed, &duplex); ++ ret_val = mac->ops.get_link_up_info(hw, &speed, &duplex); + if (ret_val) { +- hw_dbg("Error getting link speed and duplex\n"); ++ DEBUGOUT("Error getting link speed and duplex\n"); + goto out; + } + + if (duplex == HALF_DUPLEX) +- hw->fc.type = e1000_fc_none; ++ hw->fc.current_mode = e1000_fc_none; + + /* + * Now we call a subroutine to actually force the MAC + * controller to use the correct flow control settings. + */ +- ret_val = igb_force_mac_fc(hw); ++ ret_val = e1000_force_mac_fc_generic(hw); + if (ret_val) { +- hw_dbg("Error forcing flow control settings\n"); ++ DEBUGOUT("Error forcing flow control settings\n"); + goto out; + } + } +@@ -907,7 +1383,7 @@ + } + + /** +- * igb_get_speed_and_duplex_copper - Retreive current speed/duplex ++ * e1000_get_speed_and_duplex_copper_generic - Retrieve current speed/duplex + * @hw: pointer to the HW structure + * @speed: stores the current speed + * @duplex: stores the current duplex +@@ -915,79 +1391,103 @@ + * Read the status register for the current speed/duplex and store the current + * speed and duplex for copper connections. + **/ +-s32 igb_get_speed_and_duplex_copper(struct e1000_hw *hw, u16 *speed, +- u16 *duplex) ++s32 e1000_get_speed_and_duplex_copper_generic(struct e1000_hw *hw, u16 *speed, ++ u16 *duplex) + { + u32 status; + +- status = rd32(E1000_STATUS); ++ DEBUGFUNC("e1000_get_speed_and_duplex_copper_generic"); ++ ++ status = E1000_READ_REG(hw, E1000_STATUS); + if (status & E1000_STATUS_SPEED_1000) { + *speed = SPEED_1000; +- hw_dbg("1000 Mbs, "); ++ DEBUGOUT("1000 Mbs, "); + } else if (status & E1000_STATUS_SPEED_100) { + *speed = SPEED_100; +- hw_dbg("100 Mbs, "); ++ DEBUGOUT("100 Mbs, "); + } else { + *speed = SPEED_10; +- hw_dbg("10 Mbs, "); ++ DEBUGOUT("10 Mbs, "); + } + + if (status & E1000_STATUS_FD) { + *duplex = FULL_DUPLEX; +- hw_dbg("Full Duplex\n"); ++ DEBUGOUT("Full Duplex\n"); + } else { + *duplex = HALF_DUPLEX; +- hw_dbg("Half Duplex\n"); ++ DEBUGOUT("Half Duplex\n"); + } + +- return 0; ++ return E1000_SUCCESS; + } + + /** +- * igb_get_hw_semaphore - Acquire hardware semaphore ++ * e1000_get_speed_and_duplex_fiber_generic - Retrieve current speed/duplex ++ * @hw: pointer to the HW structure ++ * @speed: stores the current speed ++ * @duplex: stores the current duplex ++ * ++ * Sets the speed and duplex to gigabit full duplex (the only possible option) ++ * for fiber/serdes links. ++ **/ ++s32 e1000_get_speed_and_duplex_fiber_serdes_generic(struct e1000_hw *hw, ++ u16 *speed, u16 *duplex) ++{ ++ DEBUGFUNC("e1000_get_speed_and_duplex_fiber_serdes_generic"); ++ ++ *speed = SPEED_1000; ++ *duplex = FULL_DUPLEX; ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_get_hw_semaphore_generic - Acquire hardware semaphore + * @hw: pointer to the HW structure + * + * Acquire the HW semaphore to access the PHY or NVM + **/ +-s32 igb_get_hw_semaphore(struct e1000_hw *hw) ++s32 e1000_get_hw_semaphore_generic(struct e1000_hw *hw) + { + u32 swsm; +- s32 ret_val = 0; ++ s32 ret_val = E1000_SUCCESS; + s32 timeout = hw->nvm.word_size + 1; + s32 i = 0; + ++ DEBUGFUNC("e1000_get_hw_semaphore_generic"); ++ + /* Get the SW semaphore */ + while (i < timeout) { +- swsm = rd32(E1000_SWSM); ++ swsm = E1000_READ_REG(hw, E1000_SWSM); + if (!(swsm & E1000_SWSM_SMBI)) + break; + +- udelay(50); ++ usec_delay(50); + i++; + } + + if (i == timeout) { +- hw_dbg("Driver can't access device - SMBI bit is set.\n"); ++ DEBUGOUT("Driver can't access device - SMBI bit is set.\n"); + ret_val = -E1000_ERR_NVM; + goto out; + } + + /* Get the FW semaphore. */ + for (i = 0; i < timeout; i++) { +- swsm = rd32(E1000_SWSM); +- wr32(E1000_SWSM, swsm | E1000_SWSM_SWESMBI); ++ swsm = E1000_READ_REG(hw, E1000_SWSM); ++ E1000_WRITE_REG(hw, E1000_SWSM, swsm | E1000_SWSM_SWESMBI); + + /* Semaphore acquired if bit latched */ +- if (rd32(E1000_SWSM) & E1000_SWSM_SWESMBI) ++ if (E1000_READ_REG(hw, E1000_SWSM) & E1000_SWSM_SWESMBI) + break; + +- udelay(50); ++ usec_delay(50); + } + + if (i == timeout) { + /* Release semaphores */ +- igb_put_hw_semaphore(hw); +- hw_dbg("Driver can't access the NVM\n"); ++ e1000_put_hw_semaphore_generic(hw); ++ DEBUGOUT("Driver can't access the NVM\n"); + ret_val = -E1000_ERR_NVM; + goto out; + } +@@ -997,43 +1497,46 @@ + } + + /** +- * igb_put_hw_semaphore - Release hardware semaphore ++ * e1000_put_hw_semaphore_generic - Release hardware semaphore + * @hw: pointer to the HW structure + * + * Release hardware semaphore used to access the PHY or NVM + **/ +-void igb_put_hw_semaphore(struct e1000_hw *hw) ++void e1000_put_hw_semaphore_generic(struct e1000_hw *hw) + { + u32 swsm; + +- swsm = rd32(E1000_SWSM); ++ DEBUGFUNC("e1000_put_hw_semaphore_generic"); ++ ++ swsm = E1000_READ_REG(hw, E1000_SWSM); + + swsm &= ~(E1000_SWSM_SMBI | E1000_SWSM_SWESMBI); + +- wr32(E1000_SWSM, swsm); ++ E1000_WRITE_REG(hw, E1000_SWSM, swsm); + } + + /** +- * igb_get_auto_rd_done - Check for auto read completion ++ * e1000_get_auto_rd_done_generic - Check for auto read completion + * @hw: pointer to the HW structure + * + * Check EEPROM for Auto Read done bit. + **/ +-s32 igb_get_auto_rd_done(struct e1000_hw *hw) ++s32 e1000_get_auto_rd_done_generic(struct e1000_hw *hw) + { + s32 i = 0; +- s32 ret_val = 0; ++ s32 ret_val = E1000_SUCCESS; + ++ DEBUGFUNC("e1000_get_auto_rd_done_generic"); + + while (i < AUTO_READ_DONE_TIMEOUT) { +- if (rd32(E1000_EECD) & E1000_EECD_AUTO_RD) ++ if (E1000_READ_REG(hw, E1000_EECD) & E1000_EECD_AUTO_RD) + break; +- msleep(1); ++ msec_delay(1); + i++; + } + + if (i == AUTO_READ_DONE_TIMEOUT) { +- hw_dbg("Auto read by HW from NVM has not completed.\n"); ++ DEBUGOUT("Auto read by HW from NVM has not completed.\n"); + ret_val = -E1000_ERR_RESET; + goto out; + } +@@ -1043,20 +1546,22 @@ + } + + /** +- * igb_valid_led_default - Verify a valid default LED config ++ * e1000_valid_led_default_generic - Verify a valid default LED config + * @hw: pointer to the HW structure + * @data: pointer to the NVM (EEPROM) + * + * Read the EEPROM for the current default LED configuration. If the + * LED configuration is not valid, set to a valid LED configuration. + **/ +-static s32 igb_valid_led_default(struct e1000_hw *hw, u16 *data) ++s32 e1000_valid_led_default_generic(struct e1000_hw *hw, u16 *data) + { + s32 ret_val; + +- ret_val = hw->nvm.ops.read_nvm(hw, NVM_ID_LED_SETTINGS, 1, data); ++ DEBUGFUNC("e1000_valid_led_default_generic"); ++ ++ ret_val = hw->nvm.ops.read(hw, NVM_ID_LED_SETTINGS, 1, data); + if (ret_val) { +- hw_dbg("NVM Read Error\n"); ++ DEBUGOUT("NVM Read Error\n"); + goto out; + } + +@@ -1068,11 +1573,11 @@ + } + + /** +- * igb_id_led_init - ++ * e1000_id_led_init_generic - + * @hw: pointer to the HW structure + * + **/ +-s32 igb_id_led_init(struct e1000_hw *hw) ++s32 e1000_id_led_init_generic(struct e1000_hw *hw) + { + struct e1000_mac_info *mac = &hw->mac; + s32 ret_val; +@@ -1082,11 +1587,13 @@ + u16 data, i, temp; + const u16 led_mask = 0x0F; + +- ret_val = igb_valid_led_default(hw, &data); ++ DEBUGFUNC("e1000_id_led_init_generic"); ++ ++ ret_val = hw->nvm.ops.valid_led_default(hw, &data); + if (ret_val) + goto out; + +- mac->ledctl_default = rd32(E1000_LEDCTL); ++ mac->ledctl_default = E1000_READ_REG(hw, E1000_LEDCTL); + mac->ledctl_mode1 = mac->ledctl_default; + mac->ledctl_mode2 = mac->ledctl_default; + +@@ -1133,28 +1640,78 @@ + } + + /** +- * igb_cleanup_led - Set LED config to default operation ++ * e1000_setup_led_generic - Configures SW controllable LED ++ * @hw: pointer to the HW structure ++ * ++ * This prepares the SW controllable LED for use and saves the current state ++ * of the LED so it can be later restored. ++ **/ ++s32 e1000_setup_led_generic(struct e1000_hw *hw) ++{ ++ u32 ledctl; ++ s32 ret_val = E1000_SUCCESS; ++ ++ DEBUGFUNC("e1000_setup_led_generic"); ++ ++ if (hw->mac.ops.setup_led != e1000_setup_led_generic) { ++ ret_val = -E1000_ERR_CONFIG; ++ goto out; ++ } ++ ++ if (hw->phy.media_type == e1000_media_type_fiber) { ++ ledctl = E1000_READ_REG(hw, E1000_LEDCTL); ++ hw->mac.ledctl_default = ledctl; ++ /* Turn off LED0 */ ++ ledctl &= ~(E1000_LEDCTL_LED0_IVRT | ++ E1000_LEDCTL_LED0_BLINK | ++ E1000_LEDCTL_LED0_MODE_MASK); ++ ledctl |= (E1000_LEDCTL_MODE_LED_OFF << ++ E1000_LEDCTL_LED0_MODE_SHIFT); ++ E1000_WRITE_REG(hw, E1000_LEDCTL, ledctl); ++ } else if (hw->phy.media_type == e1000_media_type_copper) { ++ E1000_WRITE_REG(hw, E1000_LEDCTL, hw->mac.ledctl_mode1); ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_cleanup_led_generic - Set LED config to default operation + * @hw: pointer to the HW structure + * + * Remove the current LED configuration and set the LED configuration + * to the default value, saved from the EEPROM. + **/ +-s32 igb_cleanup_led(struct e1000_hw *hw) ++s32 e1000_cleanup_led_generic(struct e1000_hw *hw) + { +- wr32(E1000_LEDCTL, hw->mac.ledctl_default); +- return 0; ++ s32 ret_val = E1000_SUCCESS; ++ ++ DEBUGFUNC("e1000_cleanup_led_generic"); ++ ++ if (hw->mac.ops.cleanup_led != e1000_cleanup_led_generic) { ++ ret_val = -E1000_ERR_CONFIG; ++ goto out; ++ } ++ ++ E1000_WRITE_REG(hw, E1000_LEDCTL, hw->mac.ledctl_default); ++ ++out: ++ return ret_val; + } + + /** +- * igb_blink_led - Blink LED ++ * e1000_blink_led_generic - Blink LED + * @hw: pointer to the HW structure + * +- * Blink the led's which are set to be on. ++ * Blink the LEDs which are set to be on. + **/ +-s32 igb_blink_led(struct e1000_hw *hw) ++s32 e1000_blink_led_generic(struct e1000_hw *hw) + { + u32 ledctl_blink = 0; + u32 i; ++ ++ DEBUGFUNC("e1000_blink_led_generic"); + + if (hw->phy.media_type == e1000_media_type_fiber) { + /* always blink LED0 for PCI-E fiber */ +@@ -1170,75 +1727,134 @@ + if (((hw->mac.ledctl_mode2 >> (i * 8)) & 0xFF) == + E1000_LEDCTL_MODE_LED_ON) + ledctl_blink |= (E1000_LEDCTL_LED0_BLINK << +- (i * 8)); ++ (i * 8)); + } + +- wr32(E1000_LEDCTL, ledctl_blink); ++ E1000_WRITE_REG(hw, E1000_LEDCTL, ledctl_blink); + +- return 0; ++ return E1000_SUCCESS; + } + + /** +- * igb_led_off - Turn LED off ++ * e1000_led_on_generic - Turn LED on + * @hw: pointer to the HW structure + * +- * Turn LED off. ++ * Turn LED on. + **/ +-s32 igb_led_off(struct e1000_hw *hw) ++s32 e1000_led_on_generic(struct e1000_hw *hw) + { + u32 ctrl; + ++ DEBUGFUNC("e1000_led_on_generic"); ++ + switch (hw->phy.media_type) { + case e1000_media_type_fiber: +- ctrl = rd32(E1000_CTRL); +- ctrl |= E1000_CTRL_SWDPIN0; ++ ctrl = E1000_READ_REG(hw, E1000_CTRL); ++ ctrl &= ~E1000_CTRL_SWDPIN0; + ctrl |= E1000_CTRL_SWDPIO0; +- wr32(E1000_CTRL, ctrl); ++ E1000_WRITE_REG(hw, E1000_CTRL, ctrl); + break; + case e1000_media_type_copper: +- wr32(E1000_LEDCTL, hw->mac.ledctl_mode1); ++ E1000_WRITE_REG(hw, E1000_LEDCTL, hw->mac.ledctl_mode2); + break; + default: + break; + } + +- return 0; ++ return E1000_SUCCESS; + } + + /** +- * igb_disable_pcie_master - Disables PCI-express master access ++ * e1000_led_off_generic - Turn LED off + * @hw: pointer to the HW structure + * +- * Returns 0 (0) if successful, else returns -10 +- * (-E1000_ERR_MASTER_REQUESTS_PENDING) if master disable bit has not casued ++ * Turn LED off. ++ **/ ++s32 e1000_led_off_generic(struct e1000_hw *hw) ++{ ++ u32 ctrl; ++ ++ DEBUGFUNC("e1000_led_off_generic"); ++ ++ switch (hw->phy.media_type) { ++ case e1000_media_type_fiber: ++ ctrl = E1000_READ_REG(hw, E1000_CTRL); ++ ctrl |= E1000_CTRL_SWDPIN0; ++ ctrl |= E1000_CTRL_SWDPIO0; ++ E1000_WRITE_REG(hw, E1000_CTRL, ctrl); ++ break; ++ case e1000_media_type_copper: ++ E1000_WRITE_REG(hw, E1000_LEDCTL, hw->mac.ledctl_mode1); ++ break; ++ default: ++ break; ++ } ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_set_pcie_no_snoop_generic - Set PCI-express capabilities ++ * @hw: pointer to the HW structure ++ * @no_snoop: bitmap of snoop events ++ * ++ * Set the PCI-express register to snoop for events enabled in 'no_snoop'. ++ **/ ++void e1000_set_pcie_no_snoop_generic(struct e1000_hw *hw, u32 no_snoop) ++{ ++ u32 gcr; ++ ++ DEBUGFUNC("e1000_set_pcie_no_snoop_generic"); ++ ++ if (hw->bus.type != e1000_bus_type_pci_express) ++ goto out; ++ ++ if (no_snoop) { ++ gcr = E1000_READ_REG(hw, E1000_GCR); ++ gcr &= ~(PCIE_NO_SNOOP_ALL); ++ gcr |= no_snoop; ++ E1000_WRITE_REG(hw, E1000_GCR, gcr); ++ } ++out: ++ return; ++} ++ ++/** ++ * e1000_disable_pcie_master_generic - Disables PCI-express master access ++ * @hw: pointer to the HW structure ++ * ++ * Returns 0 (E1000_SUCCESS) if successful, else returns -10 ++ * (-E1000_ERR_MASTER_REQUESTS_PENDING) if master disable bit has not caused + * the master requests to be disabled. + * + * Disables PCI-Express master access and verifies there are no pending + * requests. + **/ +-s32 igb_disable_pcie_master(struct e1000_hw *hw) ++s32 e1000_disable_pcie_master_generic(struct e1000_hw *hw) + { + u32 ctrl; + s32 timeout = MASTER_DISABLE_TIMEOUT; +- s32 ret_val = 0; ++ s32 ret_val = E1000_SUCCESS; ++ ++ DEBUGFUNC("e1000_disable_pcie_master_generic"); + + if (hw->bus.type != e1000_bus_type_pci_express) + goto out; + +- ctrl = rd32(E1000_CTRL); ++ ctrl = E1000_READ_REG(hw, E1000_CTRL); + ctrl |= E1000_CTRL_GIO_MASTER_DISABLE; +- wr32(E1000_CTRL, ctrl); ++ E1000_WRITE_REG(hw, E1000_CTRL, ctrl); + + while (timeout) { +- if (!(rd32(E1000_STATUS) & ++ if (!(E1000_READ_REG(hw, E1000_STATUS) & + E1000_STATUS_GIO_MASTER_ENABLE)) + break; +- udelay(100); ++ usec_delay(100); + timeout--; + } + + if (!timeout) { +- hw_dbg("Master requests are pending.\n"); ++ DEBUGOUT("Master requests are pending.\n"); + ret_val = -E1000_ERR_MASTER_REQUESTS_PENDING; + goto out; + } +@@ -1248,47 +1864,49 @@ + } + + /** +- * igb_reset_adaptive - Reset Adaptive Interframe Spacing ++ * e1000_reset_adaptive_generic - Reset Adaptive Interframe Spacing + * @hw: pointer to the HW structure + * + * Reset the Adaptive Interframe Spacing throttle to default values. + **/ +-void igb_reset_adaptive(struct e1000_hw *hw) ++void e1000_reset_adaptive_generic(struct e1000_hw *hw) + { + struct e1000_mac_info *mac = &hw->mac; + ++ DEBUGFUNC("e1000_reset_adaptive_generic"); ++ + if (!mac->adaptive_ifs) { +- hw_dbg("Not in Adaptive IFS mode!\n"); ++ DEBUGOUT("Not in Adaptive IFS mode!\n"); + goto out; + } + +- if (!mac->ifs_params_forced) { +- mac->current_ifs_val = 0; +- mac->ifs_min_val = IFS_MIN; +- mac->ifs_max_val = IFS_MAX; +- mac->ifs_step_size = IFS_STEP; +- mac->ifs_ratio = IFS_RATIO; +- } ++ mac->current_ifs_val = 0; ++ mac->ifs_min_val = IFS_MIN; ++ mac->ifs_max_val = IFS_MAX; ++ mac->ifs_step_size = IFS_STEP; ++ mac->ifs_ratio = IFS_RATIO; + + mac->in_ifs_mode = false; +- wr32(E1000_AIT, 0); ++ E1000_WRITE_REG(hw, E1000_AIT, 0); + out: + return; + } + + /** +- * igb_update_adaptive - Update Adaptive Interframe Spacing ++ * e1000_update_adaptive_generic - Update Adaptive Interframe Spacing + * @hw: pointer to the HW structure + * + * Update the Adaptive Interframe Spacing Throttle value based on the + * time between transmitted packets and time between collisions. + **/ +-void igb_update_adaptive(struct e1000_hw *hw) ++void e1000_update_adaptive_generic(struct e1000_hw *hw) + { + struct e1000_mac_info *mac = &hw->mac; + ++ DEBUGFUNC("e1000_update_adaptive_generic"); ++ + if (!mac->adaptive_ifs) { +- hw_dbg("Not in Adaptive IFS mode!\n"); ++ DEBUGOUT("Not in Adaptive IFS mode!\n"); + goto out; + } + +@@ -1301,8 +1919,7 @@ + else + mac->current_ifs_val += + mac->ifs_step_size; +- wr32(E1000_AIT, +- mac->current_ifs_val); ++ E1000_WRITE_REG(hw, E1000_AIT, mac->current_ifs_val); + } + } + } else { +@@ -1310,7 +1927,7 @@ + (mac->tx_packet_delta <= MIN_NUM_XMITS)) { + mac->current_ifs_val = 0; + mac->in_ifs_mode = false; +- wr32(E1000_AIT, 0); ++ E1000_WRITE_REG(hw, E1000_AIT, 0); + } + } + out: +@@ -1318,18 +1935,20 @@ + } + + /** +- * igb_validate_mdi_setting - Verify MDI/MDIx settings ++ * e1000_validate_mdi_setting_generic - Verify MDI/MDIx settings + * @hw: pointer to the HW structure + * +- * Verify that when not using auto-negotitation that MDI/MDIx is correctly ++ * Verify that when not using auto-negotiation that MDI/MDIx is correctly + * set, which is forced to MDI mode only. + **/ +-s32 igb_validate_mdi_setting(struct e1000_hw *hw) ++s32 e1000_validate_mdi_setting_generic(struct e1000_hw *hw) + { +- s32 ret_val = 0; ++ s32 ret_val = E1000_SUCCESS; ++ ++ DEBUGFUNC("e1000_validate_mdi_setting_generic"); + + if (!hw->mac.autoneg && (hw->phy.mdix == 0 || hw->phy.mdix == 3)) { +- hw_dbg("Invalid MDI setting detected\n"); ++ DEBUGOUT("Invalid MDI setting detected\n"); + hw->phy.mdix = 1; + ret_val = -E1000_ERR_CONFIG; + goto out; +@@ -1340,7 +1959,7 @@ + } + + /** +- * igb_write_8bit_ctrl_reg - Write a 8bit CTRL register ++ * e1000_write_8bit_ctrl_reg_generic - Write a 8bit CTRL register + * @hw: pointer to the HW structure + * @reg: 32bit register offset such as E1000_SCTL + * @offset: register offset to write to +@@ -1350,25 +1969,27 @@ + * and they all have the format address << 8 | data and bit 31 is polled for + * completion. + **/ +-s32 igb_write_8bit_ctrl_reg(struct e1000_hw *hw, u32 reg, +- u32 offset, u8 data) ++s32 e1000_write_8bit_ctrl_reg_generic(struct e1000_hw *hw, u32 reg, ++ u32 offset, u8 data) + { + u32 i, regvalue = 0; +- s32 ret_val = 0; ++ s32 ret_val = E1000_SUCCESS; ++ ++ DEBUGFUNC("e1000_write_8bit_ctrl_reg_generic"); + + /* Set up the address and data */ + regvalue = ((u32)data) | (offset << E1000_GEN_CTL_ADDRESS_SHIFT); +- wr32(reg, regvalue); ++ E1000_WRITE_REG(hw, reg, regvalue); + + /* Poll the ready bit to see if the MDI read completed */ + for (i = 0; i < E1000_GEN_POLL_TIMEOUT; i++) { +- udelay(5); +- regvalue = rd32(reg); ++ usec_delay(5); ++ regvalue = E1000_READ_REG(hw, reg); + if (regvalue & E1000_GEN_CTL_READY) + break; + } + if (!(regvalue & E1000_GEN_CTL_READY)) { +- hw_dbg("Reg %08x did not indicate ready\n", reg); ++ DEBUGOUT1("Reg %08x did not indicate ready\n", reg); + ret_val = -E1000_ERR_PHY; + goto out; + } +@@ -1376,46 +1997,3 @@ + out: + return ret_val; + } +- +-/** +- * igb_enable_mng_pass_thru - Enable processing of ARP's +- * @hw: pointer to the HW structure +- * +- * Verifies the hardware needs to allow ARPs to be processed by the host. +- **/ +-bool igb_enable_mng_pass_thru(struct e1000_hw *hw) +-{ +- u32 manc; +- u32 fwsm, factps; +- bool ret_val = false; +- +- if (!hw->mac.asf_firmware_present) +- goto out; +- +- manc = rd32(E1000_MANC); +- +- if (!(manc & E1000_MANC_RCV_TCO_EN) || +- !(manc & E1000_MANC_EN_MAC_ADDR_FILTER)) +- goto out; +- +- if (hw->mac.arc_subsystem_valid) { +- fwsm = rd32(E1000_FWSM); +- factps = rd32(E1000_FACTPS); +- +- if (!(factps & E1000_FACTPS_MNGCG) && +- ((fwsm & E1000_FWSM_MODE_MASK) == +- (e1000_mng_mode_pt << E1000_FWSM_MODE_SHIFT))) { +- ret_val = true; +- goto out; +- } +- } else { +- if ((manc & E1000_MANC_SMBUS_EN) && +- !(manc & E1000_MANC_ASF_EN)) { +- ret_val = true; +- goto out; +- } +- } +- +-out: +- return ret_val; +-} +diff -r f5806398a14e drivers/net/igb/e1000_mac.h +--- a/drivers/net/igb/e1000_mac.h Mon Jun 15 11:45:45 2009 +0100 ++++ b/drivers/net/igb/e1000_mac.h Mon Jun 15 11:59:49 2009 +0100 +@@ -1,7 +1,7 @@ + /******************************************************************************* + + Intel(R) Gigabit Ethernet Linux driver +- Copyright(c) 2007 Intel Corporation. ++ Copyright(c) 2007-2009 Intel Corporation. + + This program is free software; you can redistribute it and/or modify it + under the terms and conditions of the GNU General Public License, +@@ -28,69 +28,54 @@ + #ifndef _E1000_MAC_H_ + #define _E1000_MAC_H_ + +-#include "e1000_hw.h" +- +-#include "e1000_phy.h" +-#include "e1000_nvm.h" +-#include "e1000_defines.h" +- + /* + * Functions that should not be called directly from drivers but can be used + * by other files in this 'shared code' + */ +-s32 igb_blink_led(struct e1000_hw *hw); +-s32 igb_check_for_copper_link(struct e1000_hw *hw); +-s32 igb_cleanup_led(struct e1000_hw *hw); +-s32 igb_config_fc_after_link_up(struct e1000_hw *hw); +-s32 igb_disable_pcie_master(struct e1000_hw *hw); +-s32 igb_force_mac_fc(struct e1000_hw *hw); +-s32 igb_get_auto_rd_done(struct e1000_hw *hw); +-s32 igb_get_bus_info_pcie(struct e1000_hw *hw); +-s32 igb_get_hw_semaphore(struct e1000_hw *hw); +-s32 igb_get_speed_and_duplex_copper(struct e1000_hw *hw, u16 *speed, +- u16 *duplex); +-s32 igb_id_led_init(struct e1000_hw *hw); +-s32 igb_led_off(struct e1000_hw *hw); +-s32 igb_setup_link(struct e1000_hw *hw); +-s32 igb_validate_mdi_setting(struct e1000_hw *hw); +-s32 igb_write_8bit_ctrl_reg(struct e1000_hw *hw, u32 reg, +- u32 offset, u8 data); ++void e1000_init_mac_ops_generic(struct e1000_hw *hw); ++s32 e1000_blink_led_generic(struct e1000_hw *hw); ++s32 e1000_check_for_copper_link_generic(struct e1000_hw *hw); ++s32 e1000_check_for_fiber_link_generic(struct e1000_hw *hw); ++s32 e1000_check_for_serdes_link_generic(struct e1000_hw *hw); ++s32 e1000_cleanup_led_generic(struct e1000_hw *hw); ++s32 e1000_config_fc_after_link_up_generic(struct e1000_hw *hw); ++s32 e1000_disable_pcie_master_generic(struct e1000_hw *hw); ++s32 e1000_force_mac_fc_generic(struct e1000_hw *hw); ++s32 e1000_get_auto_rd_done_generic(struct e1000_hw *hw); ++s32 e1000_get_bus_info_pcie_generic(struct e1000_hw *hw); ++void e1000_set_lan_id_single_port(struct e1000_hw *hw); ++s32 e1000_get_hw_semaphore_generic(struct e1000_hw *hw); ++s32 e1000_get_speed_and_duplex_copper_generic(struct e1000_hw *hw, u16 *speed, ++ u16 *duplex); ++s32 e1000_get_speed_and_duplex_fiber_serdes_generic(struct e1000_hw *hw, ++ u16 *speed, u16 *duplex); ++s32 e1000_id_led_init_generic(struct e1000_hw *hw); ++s32 e1000_led_on_generic(struct e1000_hw *hw); ++s32 e1000_led_off_generic(struct e1000_hw *hw); ++void e1000_update_mc_addr_list_generic(struct e1000_hw *hw, ++ u8 *mc_addr_list, u32 mc_addr_count, ++ u32 rar_used_count, u32 rar_count); ++s32 e1000_set_fc_watermarks_generic(struct e1000_hw *hw); ++s32 e1000_setup_fiber_serdes_link_generic(struct e1000_hw *hw); ++s32 e1000_setup_led_generic(struct e1000_hw *hw); ++s32 e1000_setup_link_generic(struct e1000_hw *hw); ++s32 e1000_write_8bit_ctrl_reg_generic(struct e1000_hw *hw, u32 reg, ++ u32 offset, u8 data); + +-void igb_clear_hw_cntrs_base(struct e1000_hw *hw); +-void igb_clear_vfta(struct e1000_hw *hw); +-void igb_config_collision_dist(struct e1000_hw *hw); +-void igb_mta_set(struct e1000_hw *hw, u32 hash_value); +-void igb_put_hw_semaphore(struct e1000_hw *hw); +-void igb_rar_set(struct e1000_hw *hw, u8 *addr, u32 index); +-s32 igb_check_alt_mac_addr(struct e1000_hw *hw); +-void igb_remove_device(struct e1000_hw *hw); +-void igb_reset_adaptive(struct e1000_hw *hw); +-void igb_update_adaptive(struct e1000_hw *hw); +-void igb_write_vfta(struct e1000_hw *hw, u32 offset, u32 value); ++u32 e1000_hash_mc_addr_generic(struct e1000_hw *hw, u8 *mc_addr); + +-bool igb_enable_mng_pass_thru(struct e1000_hw *hw); +- +-enum e1000_mng_mode { +- e1000_mng_mode_none = 0, +- e1000_mng_mode_asf, +- e1000_mng_mode_pt, +- e1000_mng_mode_ipmi, +- e1000_mng_mode_host_if_only +-}; +- +-#define E1000_FACTPS_MNGCG 0x20000000 +- +-#define E1000_FWSM_MODE_MASK 0xE +-#define E1000_FWSM_MODE_SHIFT 1 +- +-#define E1000_MNG_DHCP_COMMAND_TIMEOUT 10 +-#define E1000_MNG_DHCP_COOKIE_STATUS_VLAN 0x2 +- +-#define E1000_HICR_EN 0x01 /* Enable bit - RO */ +-/* Driver sets this bit when done to put command in RAM */ +-#define E1000_HICR_C 0x02 +- +-extern void e1000_init_function_pointers_82575(struct e1000_hw *hw); +-extern u32 igb_hash_mc_addr(struct e1000_hw *hw, u8 *mc_addr); ++void e1000_clear_hw_cntrs_base_generic(struct e1000_hw *hw); ++void e1000_clear_vfta_generic(struct e1000_hw *hw); ++void e1000_config_collision_dist_generic(struct e1000_hw *hw); ++void e1000_init_rx_addrs_generic(struct e1000_hw *hw, u16 rar_count); ++void e1000_mta_set_generic(struct e1000_hw *hw, u32 hash_value); ++void e1000_pcix_mmrbc_workaround_generic(struct e1000_hw *hw); ++void e1000_put_hw_semaphore_generic(struct e1000_hw *hw); ++void e1000_rar_set_generic(struct e1000_hw *hw, u8 *addr, u32 index); ++s32 e1000_check_alt_mac_addr_generic(struct e1000_hw *hw); ++void e1000_reset_adaptive_generic(struct e1000_hw *hw); ++void e1000_set_pcie_no_snoop_generic(struct e1000_hw *hw, u32 no_snoop); ++void e1000_update_adaptive_generic(struct e1000_hw *hw); ++void e1000_write_vfta_generic(struct e1000_hw *hw, u32 offset, u32 value); + + #endif +diff -r f5806398a14e drivers/net/igb/e1000_manage.c +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/igb/e1000_manage.c Mon Jun 15 11:59:49 2009 +0100 +@@ -0,0 +1,383 @@ ++/******************************************************************************* ++ ++ Intel(R) Gigabit Ethernet Linux driver ++ Copyright(c) 2007-2009 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++#include "e1000_api.h" ++ ++static u8 e1000_calculate_checksum(u8 *buffer, u32 length); ++ ++/** ++ * e1000_calculate_checksum - Calculate checksum for buffer ++ * @buffer: pointer to EEPROM ++ * @length: size of EEPROM to calculate a checksum for ++ * ++ * Calculates the checksum for some buffer on a specified length. The ++ * checksum calculated is returned. ++ **/ ++static u8 e1000_calculate_checksum(u8 *buffer, u32 length) ++{ ++ u32 i; ++ u8 sum = 0; ++ ++ DEBUGFUNC("e1000_calculate_checksum"); ++ ++ if (!buffer) ++ return 0; ++ ++ for (i = 0; i < length; i++) ++ sum += buffer[i]; ++ ++ return (u8) (0 - sum); ++} ++ ++/** ++ * e1000_mng_enable_host_if_generic - Checks host interface is enabled ++ * @hw: pointer to the HW structure ++ * ++ * Returns E1000_success upon success, else E1000_ERR_HOST_INTERFACE_COMMAND ++ * ++ * This function checks whether the HOST IF is enabled for command operation ++ * and also checks whether the previous command is completed. It busy waits ++ * in case of previous command is not completed. ++ **/ ++s32 e1000_mng_enable_host_if_generic(struct e1000_hw *hw) ++{ ++ u32 hicr; ++ s32 ret_val = E1000_SUCCESS; ++ u8 i; ++ ++ DEBUGFUNC("e1000_mng_enable_host_if_generic"); ++ ++ /* Check that the host interface is enabled. */ ++ hicr = E1000_READ_REG(hw, E1000_HICR); ++ if ((hicr & E1000_HICR_EN) == 0) { ++ DEBUGOUT("E1000_HOST_EN bit disabled.\n"); ++ ret_val = -E1000_ERR_HOST_INTERFACE_COMMAND; ++ goto out; ++ } ++ /* check the previous command is completed */ ++ for (i = 0; i < E1000_MNG_DHCP_COMMAND_TIMEOUT; i++) { ++ hicr = E1000_READ_REG(hw, E1000_HICR); ++ if (!(hicr & E1000_HICR_C)) ++ break; ++ msec_delay_irq(1); ++ } ++ ++ if (i == E1000_MNG_DHCP_COMMAND_TIMEOUT) { ++ DEBUGOUT("Previous command timeout failed .\n"); ++ ret_val = -E1000_ERR_HOST_INTERFACE_COMMAND; ++ goto out; ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_check_mng_mode_generic - Generic check management mode ++ * @hw: pointer to the HW structure ++ * ++ * Reads the firmware semaphore register and returns true (>0) if ++ * manageability is enabled, else false (0). ++ **/ ++bool e1000_check_mng_mode_generic(struct e1000_hw *hw) ++{ ++ u32 fwsm; ++ ++ DEBUGFUNC("e1000_check_mng_mode_generic"); ++ ++ fwsm = E1000_READ_REG(hw, E1000_FWSM); ++ ++ return (fwsm & E1000_FWSM_MODE_MASK) == ++ (E1000_MNG_IAMT_MODE << E1000_FWSM_MODE_SHIFT); ++} ++ ++/** ++ * e1000_enable_tx_pkt_filtering_generic - Enable packet filtering on TX ++ * @hw: pointer to the HW structure ++ * ++ * Enables packet filtering on transmit packets if manageability is enabled ++ * and host interface is enabled. ++ **/ ++bool e1000_enable_tx_pkt_filtering_generic(struct e1000_hw *hw) ++{ ++ struct e1000_host_mng_dhcp_cookie *hdr = &hw->mng_cookie; ++ u32 *buffer = (u32 *)&hw->mng_cookie; ++ u32 offset; ++ s32 ret_val, hdr_csum, csum; ++ u8 i, len; ++ bool tx_filter = true; ++ ++ DEBUGFUNC("e1000_enable_tx_pkt_filtering_generic"); ++ ++ /* No manageability, no filtering */ ++ if (!hw->mac.ops.check_mng_mode(hw)) { ++ tx_filter = false; ++ goto out; ++ } ++ ++ /* ++ * If we can't read from the host interface for whatever ++ * reason, disable filtering. ++ */ ++ ret_val = hw->mac.ops.mng_enable_host_if(hw); ++ if (ret_val != E1000_SUCCESS) { ++ tx_filter = false; ++ goto out; ++ } ++ ++ /* Read in the header. Length and offset are in dwords. */ ++ len = E1000_MNG_DHCP_COOKIE_LENGTH >> 2; ++ offset = E1000_MNG_DHCP_COOKIE_OFFSET >> 2; ++ for (i = 0; i < len; i++) { ++ *(buffer + i) = E1000_READ_REG_ARRAY_DWORD(hw, ++ E1000_HOST_IF, ++ offset + i); ++ } ++ hdr_csum = hdr->checksum; ++ hdr->checksum = 0; ++ csum = e1000_calculate_checksum((u8 *)hdr, ++ E1000_MNG_DHCP_COOKIE_LENGTH); ++ /* ++ * If either the checksums or signature don't match, then ++ * the cookie area isn't considered valid, in which case we ++ * take the safe route of assuming Tx filtering is enabled. ++ */ ++ if (hdr_csum != csum) ++ goto out; ++ if (hdr->signature != E1000_IAMT_SIGNATURE) ++ goto out; ++ ++ /* Cookie area is valid, make the final check for filtering. */ ++ if (!(hdr->status & E1000_MNG_DHCP_COOKIE_STATUS_PARSING)) ++ tx_filter = false; ++ ++out: ++ hw->mac.tx_pkt_filtering = tx_filter; ++ return tx_filter; ++} ++ ++/** ++ * e1000_mng_write_dhcp_info_generic - Writes DHCP info to host interface ++ * @hw: pointer to the HW structure ++ * @buffer: pointer to the host interface ++ * @length: size of the buffer ++ * ++ * Writes the DHCP information to the host interface. ++ **/ ++s32 e1000_mng_write_dhcp_info_generic(struct e1000_hw *hw, u8 *buffer, ++ u16 length) ++{ ++ struct e1000_host_mng_command_header hdr; ++ s32 ret_val; ++ u32 hicr; ++ ++ DEBUGFUNC("e1000_mng_write_dhcp_info_generic"); ++ ++ hdr.command_id = E1000_MNG_DHCP_TX_PAYLOAD_CMD; ++ hdr.command_length = length; ++ hdr.reserved1 = 0; ++ hdr.reserved2 = 0; ++ hdr.checksum = 0; ++ ++ /* Enable the host interface */ ++ ret_val = hw->mac.ops.mng_enable_host_if(hw); ++ if (ret_val) ++ goto out; ++ ++ /* Populate the host interface with the contents of "buffer". */ ++ ret_val = hw->mac.ops.mng_host_if_write(hw, buffer, length, ++ sizeof(hdr), &(hdr.checksum)); ++ if (ret_val) ++ goto out; ++ ++ /* Write the manageability command header */ ++ ret_val = hw->mac.ops.mng_write_cmd_header(hw, &hdr); ++ if (ret_val) ++ goto out; ++ ++ /* Tell the ARC a new command is pending. */ ++ hicr = E1000_READ_REG(hw, E1000_HICR); ++ E1000_WRITE_REG(hw, E1000_HICR, hicr | E1000_HICR_C); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_mng_write_cmd_header_generic - Writes manageability command header ++ * @hw: pointer to the HW structure ++ * @hdr: pointer to the host interface command header ++ * ++ * Writes the command header after does the checksum calculation. ++ **/ ++s32 e1000_mng_write_cmd_header_generic(struct e1000_hw *hw, ++ struct e1000_host_mng_command_header *hdr) ++{ ++ u16 i, length = sizeof(struct e1000_host_mng_command_header); ++ ++ DEBUGFUNC("e1000_mng_write_cmd_header_generic"); ++ ++ /* Write the whole command header structure with new checksum. */ ++ ++ hdr->checksum = e1000_calculate_checksum((u8 *)hdr, length); ++ ++ length >>= 2; ++ /* Write the relevant command block into the ram area. */ ++ for (i = 0; i < length; i++) { ++ E1000_WRITE_REG_ARRAY_DWORD(hw, E1000_HOST_IF, i, ++ *((u32 *) hdr + i)); ++ E1000_WRITE_FLUSH(hw); ++ } ++ ++ return E1000_SUCCESS; ++} ++ ++/** ++ * e1000_mng_host_if_write_generic - Write to the manageability host interface ++ * @hw: pointer to the HW structure ++ * @buffer: pointer to the host interface buffer ++ * @length: size of the buffer ++ * @offset: location in the buffer to write to ++ * @sum: sum of the data (not checksum) ++ * ++ * This function writes the buffer content at the offset given on the host if. ++ * It also does alignment considerations to do the writes in most efficient ++ * way. Also fills up the sum of the buffer in *buffer parameter. ++ **/ ++s32 e1000_mng_host_if_write_generic(struct e1000_hw *hw, u8 *buffer, ++ u16 length, u16 offset, u8 *sum) ++{ ++ u8 *tmp; ++ u8 *bufptr = buffer; ++ u32 data = 0; ++ s32 ret_val = E1000_SUCCESS; ++ u16 remaining, i, j, prev_bytes; ++ ++ DEBUGFUNC("e1000_mng_host_if_write_generic"); ++ ++ /* sum = only sum of the data and it is not checksum */ ++ ++ if (length == 0 || offset + length > E1000_HI_MAX_MNG_DATA_LENGTH) { ++ ret_val = -E1000_ERR_PARAM; ++ goto out; ++ } ++ ++ tmp = (u8 *)&data; ++ prev_bytes = offset & 0x3; ++ offset >>= 2; ++ ++ if (prev_bytes) { ++ data = E1000_READ_REG_ARRAY_DWORD(hw, E1000_HOST_IF, offset); ++ for (j = prev_bytes; j < sizeof(u32); j++) { ++ *(tmp + j) = *bufptr++; ++ *sum += *(tmp + j); ++ } ++ E1000_WRITE_REG_ARRAY_DWORD(hw, E1000_HOST_IF, offset, data); ++ length -= j - prev_bytes; ++ offset++; ++ } ++ ++ remaining = length & 0x3; ++ length -= remaining; ++ ++ /* Calculate length in DWORDs */ ++ length >>= 2; ++ ++ /* ++ * The device driver writes the relevant command block into the ++ * ram area. ++ */ ++ for (i = 0; i < length; i++) { ++ for (j = 0; j < sizeof(u32); j++) { ++ *(tmp + j) = *bufptr++; ++ *sum += *(tmp + j); ++ } ++ ++ E1000_WRITE_REG_ARRAY_DWORD(hw, E1000_HOST_IF, offset + i, ++ data); ++ } ++ if (remaining) { ++ for (j = 0; j < sizeof(u32); j++) { ++ if (j < remaining) ++ *(tmp + j) = *bufptr++; ++ else ++ *(tmp + j) = 0; ++ ++ *sum += *(tmp + j); ++ } ++ E1000_WRITE_REG_ARRAY_DWORD(hw, E1000_HOST_IF, offset + i, data); ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_enable_mng_pass_thru - Enable processing of ARP's ++ * @hw: pointer to the HW structure ++ * ++ * Verifies the hardware needs to allow ARPs to be processed by the host. ++ **/ ++bool e1000_enable_mng_pass_thru(struct e1000_hw *hw) ++{ ++ u32 manc; ++ u32 fwsm, factps; ++ bool ret_val = false; ++ ++ DEBUGFUNC("e1000_enable_mng_pass_thru"); ++ ++ if (!hw->mac.asf_firmware_present) ++ goto out; ++ ++ manc = E1000_READ_REG(hw, E1000_MANC); ++ ++ if (!(manc & E1000_MANC_RCV_TCO_EN) || ++ !(manc & E1000_MANC_EN_MAC_ADDR_FILTER)) ++ goto out; ++ ++ if (hw->mac.arc_subsystem_valid) { ++ fwsm = E1000_READ_REG(hw, E1000_FWSM); ++ factps = E1000_READ_REG(hw, E1000_FACTPS); ++ ++ if (!(factps & E1000_FACTPS_MNGCG) && ++ ((fwsm & E1000_FWSM_MODE_MASK) == ++ (e1000_mng_mode_pt << E1000_FWSM_MODE_SHIFT))) { ++ ret_val = true; ++ goto out; ++ } ++ } else { ++ if ((manc & E1000_MANC_SMBUS_EN) && ++ !(manc & E1000_MANC_ASF_EN)) { ++ ret_val = true; ++ goto out; ++ } ++ } ++ ++out: ++ return ret_val; ++} ++ +diff -r f5806398a14e drivers/net/igb/e1000_manage.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/igb/e1000_manage.h Mon Jun 15 11:59:49 2009 +0100 +@@ -0,0 +1,81 @@ ++/******************************************************************************* ++ ++ Intel(R) Gigabit Ethernet Linux driver ++ Copyright(c) 2007-2009 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++#ifndef _E1000_MANAGE_H_ ++#define _E1000_MANAGE_H_ ++ ++bool e1000_check_mng_mode_generic(struct e1000_hw *hw); ++bool e1000_enable_tx_pkt_filtering_generic(struct e1000_hw *hw); ++s32 e1000_mng_enable_host_if_generic(struct e1000_hw *hw); ++s32 e1000_mng_host_if_write_generic(struct e1000_hw *hw, u8 *buffer, ++ u16 length, u16 offset, u8 *sum); ++s32 e1000_mng_write_cmd_header_generic(struct e1000_hw *hw, ++ struct e1000_host_mng_command_header *hdr); ++s32 e1000_mng_write_dhcp_info_generic(struct e1000_hw *hw, ++ u8 *buffer, u16 length); ++bool e1000_enable_mng_pass_thru(struct e1000_hw *hw); ++ ++enum e1000_mng_mode { ++ e1000_mng_mode_none = 0, ++ e1000_mng_mode_asf, ++ e1000_mng_mode_pt, ++ e1000_mng_mode_ipmi, ++ e1000_mng_mode_host_if_only ++}; ++ ++#define E1000_FACTPS_MNGCG 0x20000000 ++ ++#define E1000_FWSM_MODE_MASK 0xE ++#define E1000_FWSM_MODE_SHIFT 1 ++ ++#define E1000_MNG_IAMT_MODE 0x3 ++#define E1000_MNG_DHCP_COOKIE_LENGTH 0x10 ++#define E1000_MNG_DHCP_COOKIE_OFFSET 0x6F0 ++#define E1000_MNG_DHCP_COMMAND_TIMEOUT 10 ++#define E1000_MNG_DHCP_TX_PAYLOAD_CMD 64 ++#define E1000_MNG_DHCP_COOKIE_STATUS_PARSING 0x1 ++#define E1000_MNG_DHCP_COOKIE_STATUS_VLAN 0x2 ++ ++#define E1000_VFTA_ENTRY_SHIFT 5 ++#define E1000_VFTA_ENTRY_MASK 0x7F ++#define E1000_VFTA_ENTRY_BIT_SHIFT_MASK 0x1F ++ ++#define E1000_HI_MAX_BLOCK_BYTE_LENGTH 1792 /* Num of bytes in range */ ++#define E1000_HI_MAX_BLOCK_DWORD_LENGTH 448 /* Num of dwords in range */ ++#define E1000_HI_COMMAND_TIMEOUT 500 /* Process HI command limit */ ++ ++#define E1000_HICR_EN 0x01 /* Enable bit - RO */ ++/* Driver sets this bit when done to put command in RAM */ ++#define E1000_HICR_C 0x02 ++#define E1000_HICR_SV 0x04 /* Status Validity */ ++#define E1000_HICR_FW_RESET_ENABLE 0x40 ++#define E1000_HICR_FW_RESET 0x80 ++ ++/* Intel(R) Active Management Technology signature */ ++#define E1000_IAMT_SIGNATURE 0x544D4149 ++ ++#endif +diff -r f5806398a14e drivers/net/igb/e1000_nvm.c +--- a/drivers/net/igb/e1000_nvm.c Mon Jun 15 11:45:45 2009 +0100 ++++ b/drivers/net/igb/e1000_nvm.c Mon Jun 15 11:59:49 2009 +0100 +@@ -1,7 +1,7 @@ + /******************************************************************************* + + Intel(R) Gigabit Ethernet Linux driver +- Copyright(c) 2007 Intel Corporation. ++ Copyright(c) 2007-2009 Intel Corporation. + + This program is free software; you can redistribute it and/or modify it + under the terms and conditions of the GNU General Public License, +@@ -25,44 +25,58 @@ + + *******************************************************************************/ + +-#include +-#include ++#include "e1000_api.h" + +-#include "e1000_mac.h" +-#include "e1000_nvm.h" ++static void e1000_stop_nvm(struct e1000_hw *hw); ++static void e1000_reload_nvm_generic(struct e1000_hw *hw); + + /** +- * igb_raise_eec_clk - Raise EEPROM clock ++ * e1000_init_nvm_ops_generic - Initialize NVM function pointers ++ * @hw: pointer to the HW structure ++ * ++ * Setups up the function pointers to no-op functions ++ **/ ++void e1000_init_nvm_ops_generic(struct e1000_hw *hw) ++{ ++ struct e1000_nvm_info *nvm = &hw->nvm; ++ DEBUGFUNC("e1000_init_nvm_ops_generic"); ++ ++ /* Initialize function pointers */ ++ nvm->ops.reload = e1000_reload_nvm_generic; ++} ++ ++/** ++ * e1000_raise_eec_clk - Raise EEPROM clock + * @hw: pointer to the HW structure + * @eecd: pointer to the EEPROM + * + * Enable/Raise the EEPROM clock bit. + **/ +-static void igb_raise_eec_clk(struct e1000_hw *hw, u32 *eecd) ++static void e1000_raise_eec_clk(struct e1000_hw *hw, u32 *eecd) + { + *eecd = *eecd | E1000_EECD_SK; +- wr32(E1000_EECD, *eecd); +- wrfl(); +- udelay(hw->nvm.delay_usec); ++ E1000_WRITE_REG(hw, E1000_EECD, *eecd); ++ E1000_WRITE_FLUSH(hw); ++ usec_delay(hw->nvm.delay_usec); + } + + /** +- * igb_lower_eec_clk - Lower EEPROM clock ++ * e1000_lower_eec_clk - Lower EEPROM clock + * @hw: pointer to the HW structure + * @eecd: pointer to the EEPROM + * + * Clear/Lower the EEPROM clock bit. + **/ +-static void igb_lower_eec_clk(struct e1000_hw *hw, u32 *eecd) ++static void e1000_lower_eec_clk(struct e1000_hw *hw, u32 *eecd) + { + *eecd = *eecd & ~E1000_EECD_SK; +- wr32(E1000_EECD, *eecd); +- wrfl(); +- udelay(hw->nvm.delay_usec); ++ E1000_WRITE_REG(hw, E1000_EECD, *eecd); ++ E1000_WRITE_FLUSH(hw); ++ usec_delay(hw->nvm.delay_usec); + } + + /** +- * igb_shift_out_eec_bits - Shift data bits our to the EEPROM ++ * e1000_shift_out_eec_bits - Shift data bits our to the EEPROM + * @hw: pointer to the HW structure + * @data: data to send to the EEPROM + * @count: number of bits to shift out +@@ -71,16 +85,16 @@ + * "data" parameter will be shifted out to the EEPROM one bit at a time. + * In order to do this, "data" must be broken down into bits. + **/ +-static void igb_shift_out_eec_bits(struct e1000_hw *hw, u16 data, u16 count) ++static void e1000_shift_out_eec_bits(struct e1000_hw *hw, u16 data, u16 count) + { + struct e1000_nvm_info *nvm = &hw->nvm; +- u32 eecd = rd32(E1000_EECD); ++ u32 eecd = E1000_READ_REG(hw, E1000_EECD); + u32 mask; + ++ DEBUGFUNC("e1000_shift_out_eec_bits"); ++ + mask = 0x01 << (count - 1); +- if (nvm->type == e1000_nvm_eeprom_microwire) +- eecd &= ~E1000_EECD_DO; +- else if (nvm->type == e1000_nvm_eeprom_spi) ++ if (nvm->type == e1000_nvm_eeprom_spi) + eecd |= E1000_EECD_DO; + + do { +@@ -89,23 +103,23 @@ + if (data & mask) + eecd |= E1000_EECD_DI; + +- wr32(E1000_EECD, eecd); +- wrfl(); ++ E1000_WRITE_REG(hw, E1000_EECD, eecd); ++ E1000_WRITE_FLUSH(hw); + +- udelay(nvm->delay_usec); ++ usec_delay(nvm->delay_usec); + +- igb_raise_eec_clk(hw, &eecd); +- igb_lower_eec_clk(hw, &eecd); ++ e1000_raise_eec_clk(hw, &eecd); ++ e1000_lower_eec_clk(hw, &eecd); + + mask >>= 1; + } while (mask); + + eecd &= ~E1000_EECD_DI; +- wr32(E1000_EECD, eecd); ++ E1000_WRITE_REG(hw, E1000_EECD, eecd); + } + + /** +- * igb_shift_in_eec_bits - Shift data bits in from the EEPROM ++ * e1000_shift_in_eec_bits - Shift data bits in from the EEPROM + * @hw: pointer to the HW structure + * @count: number of bits to shift in + * +@@ -115,94 +129,99 @@ + * "DO" bit. During this "shifting in" process the data in "DI" bit should + * always be clear. + **/ +-static u16 igb_shift_in_eec_bits(struct e1000_hw *hw, u16 count) ++static u16 e1000_shift_in_eec_bits(struct e1000_hw *hw, u16 count) + { + u32 eecd; + u32 i; + u16 data; + +- eecd = rd32(E1000_EECD); ++ DEBUGFUNC("e1000_shift_in_eec_bits"); ++ ++ eecd = E1000_READ_REG(hw, E1000_EECD); + + eecd &= ~(E1000_EECD_DO | E1000_EECD_DI); + data = 0; + + for (i = 0; i < count; i++) { + data <<= 1; +- igb_raise_eec_clk(hw, &eecd); ++ e1000_raise_eec_clk(hw, &eecd); + +- eecd = rd32(E1000_EECD); ++ eecd = E1000_READ_REG(hw, E1000_EECD); + + eecd &= ~E1000_EECD_DI; + if (eecd & E1000_EECD_DO) + data |= 1; + +- igb_lower_eec_clk(hw, &eecd); ++ e1000_lower_eec_clk(hw, &eecd); + } + + return data; + } + + /** +- * igb_poll_eerd_eewr_done - Poll for EEPROM read/write completion ++ * e1000_poll_eerd_eewr_done - Poll for EEPROM read/write completion + * @hw: pointer to the HW structure + * @ee_reg: EEPROM flag for polling + * + * Polls the EEPROM status bit for either read or write completion based + * upon the value of 'ee_reg'. + **/ +-static s32 igb_poll_eerd_eewr_done(struct e1000_hw *hw, int ee_reg) ++s32 e1000_poll_eerd_eewr_done(struct e1000_hw *hw, int ee_reg) + { + u32 attempts = 100000; + u32 i, reg = 0; + s32 ret_val = -E1000_ERR_NVM; + ++ DEBUGFUNC("e1000_poll_eerd_eewr_done"); ++ + for (i = 0; i < attempts; i++) { + if (ee_reg == E1000_NVM_POLL_READ) +- reg = rd32(E1000_EERD); ++ reg = E1000_READ_REG(hw, E1000_EERD); + else +- reg = rd32(E1000_EEWR); ++ reg = E1000_READ_REG(hw, E1000_EEWR); + + if (reg & E1000_NVM_RW_REG_DONE) { +- ret_val = 0; ++ ret_val = E1000_SUCCESS; + break; + } + +- udelay(5); ++ usec_delay(5); + } + + return ret_val; + } + + /** +- * igb_acquire_nvm - Generic request for access to EEPROM ++ * e1000_acquire_nvm_generic - Generic request for access to EEPROM + * @hw: pointer to the HW structure + * + * Set the EEPROM access request bit and wait for EEPROM access grant bit. + * Return successful if access grant bit set, else clear the request for + * EEPROM access and return -E1000_ERR_NVM (-1). + **/ +-s32 igb_acquire_nvm(struct e1000_hw *hw) ++s32 e1000_acquire_nvm_generic(struct e1000_hw *hw) + { +- u32 eecd = rd32(E1000_EECD); ++ u32 eecd = E1000_READ_REG(hw, E1000_EECD); + s32 timeout = E1000_NVM_GRANT_ATTEMPTS; +- s32 ret_val = 0; ++ s32 ret_val = E1000_SUCCESS; + ++ DEBUGFUNC("e1000_acquire_nvm_generic"); + +- wr32(E1000_EECD, eecd | E1000_EECD_REQ); +- eecd = rd32(E1000_EECD); ++ E1000_WRITE_REG(hw, E1000_EECD, eecd | E1000_EECD_REQ); ++ eecd = E1000_READ_REG(hw, E1000_EECD); + + while (timeout) { + if (eecd & E1000_EECD_GNT) + break; +- udelay(5); +- eecd = rd32(E1000_EECD); ++ usec_delay(5); ++ eecd = E1000_READ_REG(hw, E1000_EECD); + timeout--; + } + + if (!timeout) { + eecd &= ~E1000_EECD_REQ; +- wr32(E1000_EECD, eecd); +- hw_dbg("Could not acquire NVM grant\n"); ++ E1000_WRITE_REG(hw, E1000_EECD, eecd); ++ DEBUGOUT("Could not acquire NVM grant\n"); + ret_val = -E1000_ERR_NVM; + } + +@@ -210,41 +229,28 @@ + } + + /** +- * igb_standby_nvm - Return EEPROM to standby state ++ * e1000_standby_nvm - Return EEPROM to standby state + * @hw: pointer to the HW structure + * + * Return the EEPROM to a standby state. + **/ +-static void igb_standby_nvm(struct e1000_hw *hw) ++static void e1000_standby_nvm(struct e1000_hw *hw) + { + struct e1000_nvm_info *nvm = &hw->nvm; +- u32 eecd = rd32(E1000_EECD); ++ u32 eecd = E1000_READ_REG(hw, E1000_EECD); + +- if (nvm->type == e1000_nvm_eeprom_microwire) { +- eecd &= ~(E1000_EECD_CS | E1000_EECD_SK); +- wr32(E1000_EECD, eecd); +- wrfl(); +- udelay(nvm->delay_usec); ++ DEBUGFUNC("e1000_standby_nvm"); + +- igb_raise_eec_clk(hw, &eecd); +- +- /* Select EEPROM */ +- eecd |= E1000_EECD_CS; +- wr32(E1000_EECD, eecd); +- wrfl(); +- udelay(nvm->delay_usec); +- +- igb_lower_eec_clk(hw, &eecd); +- } else if (nvm->type == e1000_nvm_eeprom_spi) { ++ if (nvm->type == e1000_nvm_eeprom_spi) { + /* Toggle CS to flush commands */ + eecd |= E1000_EECD_CS; +- wr32(E1000_EECD, eecd); +- wrfl(); +- udelay(nvm->delay_usec); ++ E1000_WRITE_REG(hw, E1000_EECD, eecd); ++ E1000_WRITE_FLUSH(hw); ++ usec_delay(nvm->delay_usec); + eecd &= ~E1000_EECD_CS; +- wr32(E1000_EECD, eecd); +- wrfl(); +- udelay(nvm->delay_usec); ++ E1000_WRITE_REG(hw, E1000_EECD, eecd); ++ E1000_WRITE_FLUSH(hw); ++ usec_delay(nvm->delay_usec); + } + } + +@@ -258,64 +264,56 @@ + { + u32 eecd; + +- eecd = rd32(E1000_EECD); ++ DEBUGFUNC("e1000_stop_nvm"); ++ ++ eecd = E1000_READ_REG(hw, E1000_EECD); + if (hw->nvm.type == e1000_nvm_eeprom_spi) { + /* Pull CS high */ + eecd |= E1000_EECD_CS; +- igb_lower_eec_clk(hw, &eecd); +- } else if (hw->nvm.type == e1000_nvm_eeprom_microwire) { +- /* CS on Microcwire is active-high */ +- eecd &= ~(E1000_EECD_CS | E1000_EECD_DI); +- wr32(E1000_EECD, eecd); +- igb_raise_eec_clk(hw, &eecd); +- igb_lower_eec_clk(hw, &eecd); ++ e1000_lower_eec_clk(hw, &eecd); + } + } + + /** +- * igb_release_nvm - Release exclusive access to EEPROM ++ * e1000_release_nvm_generic - Release exclusive access to EEPROM + * @hw: pointer to the HW structure + * + * Stop any current commands to the EEPROM and clear the EEPROM request bit. + **/ +-void igb_release_nvm(struct e1000_hw *hw) ++void e1000_release_nvm_generic(struct e1000_hw *hw) + { + u32 eecd; + ++ DEBUGFUNC("e1000_release_nvm_generic"); ++ + e1000_stop_nvm(hw); + +- eecd = rd32(E1000_EECD); ++ eecd = E1000_READ_REG(hw, E1000_EECD); + eecd &= ~E1000_EECD_REQ; +- wr32(E1000_EECD, eecd); ++ E1000_WRITE_REG(hw, E1000_EECD, eecd); + } + + /** +- * igb_ready_nvm_eeprom - Prepares EEPROM for read/write ++ * e1000_ready_nvm_eeprom - Prepares EEPROM for read/write + * @hw: pointer to the HW structure + * + * Setups the EEPROM for reading and writing. + **/ +-static s32 igb_ready_nvm_eeprom(struct e1000_hw *hw) ++static s32 e1000_ready_nvm_eeprom(struct e1000_hw *hw) + { + struct e1000_nvm_info *nvm = &hw->nvm; +- u32 eecd = rd32(E1000_EECD); +- s32 ret_val = 0; ++ u32 eecd = E1000_READ_REG(hw, E1000_EECD); ++ s32 ret_val = E1000_SUCCESS; + u16 timeout = 0; + u8 spi_stat_reg; + ++ DEBUGFUNC("e1000_ready_nvm_eeprom"); + +- if (nvm->type == e1000_nvm_eeprom_microwire) { +- /* Clear SK and DI */ +- eecd &= ~(E1000_EECD_DI | E1000_EECD_SK); +- wr32(E1000_EECD, eecd); +- /* Set CS */ +- eecd |= E1000_EECD_CS; +- wr32(E1000_EECD, eecd); +- } else if (nvm->type == e1000_nvm_eeprom_spi) { ++ if (nvm->type == e1000_nvm_eeprom_spi) { + /* Clear SK and CS */ + eecd &= ~(E1000_EECD_CS | E1000_EECD_SK); +- wr32(E1000_EECD, eecd); +- udelay(1); ++ E1000_WRITE_REG(hw, E1000_EECD, eecd); ++ usec_delay(1); + timeout = NVM_MAX_RETRY_SPI; + + /* +@@ -325,19 +323,19 @@ + * not cleared within 'timeout', then error out. + */ + while (timeout) { +- igb_shift_out_eec_bits(hw, NVM_RDSR_OPCODE_SPI, +- hw->nvm.opcode_bits); +- spi_stat_reg = (u8)igb_shift_in_eec_bits(hw, 8); ++ e1000_shift_out_eec_bits(hw, NVM_RDSR_OPCODE_SPI, ++ hw->nvm.opcode_bits); ++ spi_stat_reg = (u8)e1000_shift_in_eec_bits(hw, 8); + if (!(spi_stat_reg & NVM_STATUS_RDY_SPI)) + break; + +- udelay(5); +- igb_standby_nvm(hw); ++ usec_delay(5); ++ e1000_standby_nvm(hw); + timeout--; + } + + if (!timeout) { +- hw_dbg("SPI NVM Status error\n"); ++ DEBUGOUT("SPI NVM Status error\n"); + ret_val = -E1000_ERR_NVM; + goto out; + } +@@ -348,7 +346,7 @@ + } + + /** +- * igb_read_nvm_eerd - Reads EEPROM using EERD register ++ * e1000_read_nvm_eerd - Reads EEPROM using EERD register + * @hw: pointer to the HW structure + * @offset: offset of word in the EEPROM to read + * @words: number of words to read +@@ -356,19 +354,21 @@ + * + * Reads a 16 bit word from the EEPROM using the EERD register. + **/ +-s32 igb_read_nvm_eerd(struct e1000_hw *hw, u16 offset, u16 words, u16 *data) ++s32 e1000_read_nvm_eerd(struct e1000_hw *hw, u16 offset, u16 words, u16 *data) + { + struct e1000_nvm_info *nvm = &hw->nvm; + u32 i, eerd = 0; +- s32 ret_val = 0; ++ s32 ret_val = E1000_SUCCESS; ++ ++ DEBUGFUNC("e1000_read_nvm_eerd"); + + /* + * A check for invalid values: offset too large, too many words, +- * and not enough words. ++ * too many words for the offset, and not enough words. + */ + if ((offset >= nvm->word_size) || (words > (nvm->word_size - offset)) || + (words == 0)) { +- hw_dbg("nvm parameter(s) out of bounds\n"); ++ DEBUGOUT("nvm parameter(s) out of bounds\n"); + ret_val = -E1000_ERR_NVM; + goto out; + } +@@ -377,13 +377,13 @@ + eerd = ((offset+i) << E1000_NVM_RW_ADDR_SHIFT) + + E1000_NVM_RW_REG_START; + +- wr32(E1000_EERD, eerd); +- ret_val = igb_poll_eerd_eewr_done(hw, E1000_NVM_POLL_READ); ++ E1000_WRITE_REG(hw, E1000_EERD, eerd); ++ ret_val = e1000_poll_eerd_eewr_done(hw, E1000_NVM_POLL_READ); + if (ret_val) + break; + +- data[i] = (rd32(E1000_EERD) >> +- E1000_NVM_RW_REG_DATA); ++ data[i] = (E1000_READ_REG(hw, E1000_EERD) >> ++ E1000_NVM_RW_REG_DATA); + } + + out: +@@ -391,7 +391,7 @@ + } + + /** +- * igb_write_nvm_spi - Write to EEPROM using SPI ++ * e1000_write_nvm_spi - Write to EEPROM using SPI + * @hw: pointer to the HW structure + * @offset: offset within the EEPROM to be written to + * @words: number of words to write +@@ -400,13 +400,15 @@ + * Writes data to EEPROM at offset using SPI interface. + * + * If e1000_update_nvm_checksum is not called after this function , the +- * EEPROM will most likley contain an invalid checksum. ++ * EEPROM will most likely contain an invalid checksum. + **/ +-s32 igb_write_nvm_spi(struct e1000_hw *hw, u16 offset, u16 words, u16 *data) ++s32 e1000_write_nvm_spi(struct e1000_hw *hw, u16 offset, u16 words, u16 *data) + { + struct e1000_nvm_info *nvm = &hw->nvm; + s32 ret_val; + u16 widx = 0; ++ ++ DEBUGFUNC("e1000_write_nvm_spi"); + + /* + * A check for invalid values: offset too large, too many words, +@@ -414,31 +416,29 @@ + */ + if ((offset >= nvm->word_size) || (words > (nvm->word_size - offset)) || + (words == 0)) { +- hw_dbg("nvm parameter(s) out of bounds\n"); ++ DEBUGOUT("nvm parameter(s) out of bounds\n"); + ret_val = -E1000_ERR_NVM; + goto out; + } + +- ret_val = hw->nvm.ops.acquire_nvm(hw); ++ ret_val = nvm->ops.acquire(hw); + if (ret_val) + goto out; +- +- msleep(10); + + while (widx < words) { + u8 write_opcode = NVM_WRITE_OPCODE_SPI; + +- ret_val = igb_ready_nvm_eeprom(hw); ++ ret_val = e1000_ready_nvm_eeprom(hw); + if (ret_val) + goto release; + +- igb_standby_nvm(hw); ++ e1000_standby_nvm(hw); + + /* Send the WRITE ENABLE command (8 bit opcode) */ +- igb_shift_out_eec_bits(hw, NVM_WREN_OPCODE_SPI, +- nvm->opcode_bits); ++ e1000_shift_out_eec_bits(hw, NVM_WREN_OPCODE_SPI, ++ nvm->opcode_bits); + +- igb_standby_nvm(hw); ++ e1000_standby_nvm(hw); + + /* + * Some SPI eeproms use the 8th address bit embedded in the +@@ -448,122 +448,120 @@ + write_opcode |= NVM_A8_OPCODE_SPI; + + /* Send the Write command (8-bit opcode + addr) */ +- igb_shift_out_eec_bits(hw, write_opcode, nvm->opcode_bits); +- igb_shift_out_eec_bits(hw, (u16)((offset + widx) * 2), +- nvm->address_bits); ++ e1000_shift_out_eec_bits(hw, write_opcode, nvm->opcode_bits); ++ e1000_shift_out_eec_bits(hw, (u16)((offset + widx) * 2), ++ nvm->address_bits); + + /* Loop to allow for up to whole page write of eeprom */ + while (widx < words) { + u16 word_out = data[widx]; + word_out = (word_out >> 8) | (word_out << 8); +- igb_shift_out_eec_bits(hw, word_out, 16); ++ e1000_shift_out_eec_bits(hw, word_out, 16); + widx++; + + if ((((offset + widx) * 2) % nvm->page_size) == 0) { +- igb_standby_nvm(hw); ++ e1000_standby_nvm(hw); + break; + } + } + } + +- msleep(10); ++ msec_delay(10); + release: +- hw->nvm.ops.release_nvm(hw); ++ nvm->ops.release(hw); + + out: + return ret_val; + } + + /** +- * igb_read_part_num - Read device part number ++ * e1000_read_pba_num_generic - Read device part number + * @hw: pointer to the HW structure +- * @part_num: pointer to device part number ++ * @pba_num: pointer to device part number + * + * Reads the product board assembly (PBA) number from the EEPROM and stores +- * the value in part_num. ++ * the value in pba_num. + **/ +-s32 igb_read_part_num(struct e1000_hw *hw, u32 *part_num) ++s32 e1000_read_pba_num_generic(struct e1000_hw *hw, u32 *pba_num) + { + s32 ret_val; + u16 nvm_data; + +- ret_val = hw->nvm.ops.read_nvm(hw, NVM_PBA_OFFSET_0, 1, &nvm_data); ++ DEBUGFUNC("e1000_read_pba_num_generic"); ++ ++ ret_val = hw->nvm.ops.read(hw, NVM_PBA_OFFSET_0, 1, &nvm_data); + if (ret_val) { +- hw_dbg("NVM Read Error\n"); ++ DEBUGOUT("NVM Read Error\n"); + goto out; + } +- *part_num = (u32)(nvm_data << 16); ++ *pba_num = (u32)(nvm_data << 16); + +- ret_val = hw->nvm.ops.read_nvm(hw, NVM_PBA_OFFSET_1, 1, &nvm_data); ++ ret_val = hw->nvm.ops.read(hw, NVM_PBA_OFFSET_1, 1, &nvm_data); + if (ret_val) { +- hw_dbg("NVM Read Error\n"); ++ DEBUGOUT("NVM Read Error\n"); + goto out; + } +- *part_num |= nvm_data; ++ *pba_num |= nvm_data; + + out: + return ret_val; + } + + /** +- * igb_read_mac_addr - Read device MAC address ++ * e1000_read_mac_addr_generic - Read device MAC address + * @hw: pointer to the HW structure + * + * Reads the device MAC address from the EEPROM and stores the value. + * Since devices with two ports use the same EEPROM, we increment the + * last bit in the MAC address for the second port. + **/ +-s32 igb_read_mac_addr(struct e1000_hw *hw) ++s32 e1000_read_mac_addr_generic(struct e1000_hw *hw) + { +- s32 ret_val = 0; +- u16 offset, nvm_data, i; ++ u32 rar_high; ++ u32 rar_low; ++ u16 i; + +- for (i = 0; i < ETH_ALEN; i += 2) { +- offset = i >> 1; +- ret_val = hw->nvm.ops.read_nvm(hw, offset, 1, &nvm_data); +- if (ret_val) { +- hw_dbg("NVM Read Error\n"); +- goto out; +- } +- hw->mac.perm_addr[i] = (u8)(nvm_data & 0xFF); +- hw->mac.perm_addr[i+1] = (u8)(nvm_data >> 8); +- } ++ rar_high = E1000_READ_REG(hw, E1000_RAH(0)); ++ rar_low = E1000_READ_REG(hw, E1000_RAL(0)); + +- /* Flip last bit of mac address if we're on second port */ +- if (hw->bus.func == E1000_FUNC_1) +- hw->mac.perm_addr[5] ^= 1; ++ for (i = 0; i < E1000_RAL_MAC_ADDR_LEN; i++) ++ hw->mac.perm_addr[i] = (u8)(rar_low >> (i*8)); + +- for (i = 0; i < ETH_ALEN; i++) ++ for (i = 0; i < E1000_RAH_MAC_ADDR_LEN; i++) ++ hw->mac.perm_addr[i+4] = (u8)(rar_high >> (i*8)); ++ ++ for (i = 0; i < ETH_ADDR_LEN; i++) + hw->mac.addr[i] = hw->mac.perm_addr[i]; + +-out: +- return ret_val; ++ return E1000_SUCCESS; + } + + /** +- * igb_validate_nvm_checksum - Validate EEPROM checksum ++ * e1000_validate_nvm_checksum_generic - Validate EEPROM checksum + * @hw: pointer to the HW structure + * + * Calculates the EEPROM checksum by reading/adding each word of the EEPROM + * and then verifies that the sum of the EEPROM is equal to 0xBABA. + **/ +-s32 igb_validate_nvm_checksum(struct e1000_hw *hw) ++s32 e1000_validate_nvm_checksum_generic(struct e1000_hw *hw) + { +- s32 ret_val = 0; ++ s32 ret_val = E1000_SUCCESS; + u16 checksum = 0; + u16 i, nvm_data; + ++ DEBUGFUNC("e1000_validate_nvm_checksum_generic"); ++ + for (i = 0; i < (NVM_CHECKSUM_REG + 1); i++) { +- ret_val = hw->nvm.ops.read_nvm(hw, i, 1, &nvm_data); ++ ret_val = hw->nvm.ops.read(hw, i, 1, &nvm_data); + if (ret_val) { +- hw_dbg("NVM Read Error\n"); ++ DEBUGOUT("NVM Read Error\n"); + goto out; + } + checksum += nvm_data; + } + + if (checksum != (u16) NVM_SUM) { +- hw_dbg("NVM Checksum Invalid\n"); ++ DEBUGOUT("NVM Checksum Invalid\n"); + ret_val = -E1000_ERR_NVM; + goto out; + } +@@ -573,33 +571,55 @@ + } + + /** +- * igb_update_nvm_checksum - Update EEPROM checksum ++ * e1000_update_nvm_checksum_generic - Update EEPROM checksum + * @hw: pointer to the HW structure + * + * Updates the EEPROM checksum by reading/adding each word of the EEPROM + * up to the checksum. Then calculates the EEPROM checksum and writes the + * value to the EEPROM. + **/ +-s32 igb_update_nvm_checksum(struct e1000_hw *hw) ++s32 e1000_update_nvm_checksum_generic(struct e1000_hw *hw) + { + s32 ret_val; + u16 checksum = 0; + u16 i, nvm_data; + ++ DEBUGFUNC("e1000_update_nvm_checksum"); ++ + for (i = 0; i < NVM_CHECKSUM_REG; i++) { +- ret_val = hw->nvm.ops.read_nvm(hw, i, 1, &nvm_data); ++ ret_val = hw->nvm.ops.read(hw, i, 1, &nvm_data); + if (ret_val) { +- hw_dbg("NVM Read Error while updating checksum.\n"); ++ DEBUGOUT("NVM Read Error while updating checksum.\n"); + goto out; + } + checksum += nvm_data; + } + checksum = (u16) NVM_SUM - checksum; +- ret_val = hw->nvm.ops.write_nvm(hw, NVM_CHECKSUM_REG, 1, &checksum); ++ ret_val = hw->nvm.ops.write(hw, NVM_CHECKSUM_REG, 1, &checksum); + if (ret_val) +- hw_dbg("NVM Write Error while updating checksum.\n"); ++ DEBUGOUT("NVM Write Error while updating checksum.\n"); + + out: + return ret_val; + } + ++/** ++ * e1000_reload_nvm_generic - Reloads EEPROM ++ * @hw: pointer to the HW structure ++ * ++ * Reloads the EEPROM by setting the "Reinitialize from EEPROM" bit in the ++ * extended control register. ++ **/ ++static void e1000_reload_nvm_generic(struct e1000_hw *hw) ++{ ++ u32 ctrl_ext; ++ ++ DEBUGFUNC("e1000_reload_nvm_generic"); ++ ++ usec_delay(10); ++ ctrl_ext = E1000_READ_REG(hw, E1000_CTRL_EXT); ++ ctrl_ext |= E1000_CTRL_EXT_EE_RST; ++ E1000_WRITE_REG(hw, E1000_CTRL_EXT, ctrl_ext); ++ E1000_WRITE_FLUSH(hw); ++} ++ +diff -r f5806398a14e drivers/net/igb/e1000_nvm.h +--- a/drivers/net/igb/e1000_nvm.h Mon Jun 15 11:45:45 2009 +0100 ++++ b/drivers/net/igb/e1000_nvm.h Mon Jun 15 11:59:49 2009 +0100 +@@ -1,7 +1,7 @@ + /******************************************************************************* + + Intel(R) Gigabit Ethernet Linux driver +- Copyright(c) 2007 Intel Corporation. ++ Copyright(c) 2007-2009 Intel Corporation. + + This program is free software; you can redistribute it and/or modify it + under the terms and conditions of the GNU General Public License, +@@ -28,13 +28,23 @@ + #ifndef _E1000_NVM_H_ + #define _E1000_NVM_H_ + +-s32 igb_acquire_nvm(struct e1000_hw *hw); +-void igb_release_nvm(struct e1000_hw *hw); +-s32 igb_read_mac_addr(struct e1000_hw *hw); +-s32 igb_read_part_num(struct e1000_hw *hw, u32 *part_num); +-s32 igb_read_nvm_eerd(struct e1000_hw *hw, u16 offset, u16 words, u16 *data); +-s32 igb_write_nvm_spi(struct e1000_hw *hw, u16 offset, u16 words, u16 *data); +-s32 igb_validate_nvm_checksum(struct e1000_hw *hw); +-s32 igb_update_nvm_checksum(struct e1000_hw *hw); ++void e1000_init_nvm_ops_generic(struct e1000_hw *hw); ++s32 e1000_acquire_nvm_generic(struct e1000_hw *hw); ++ ++s32 e1000_poll_eerd_eewr_done(struct e1000_hw *hw, int ee_reg); ++s32 e1000_read_mac_addr_generic(struct e1000_hw *hw); ++s32 e1000_read_pba_num_generic(struct e1000_hw *hw, u32 *pba_num); ++s32 e1000_read_nvm_eerd(struct e1000_hw *hw, u16 offset, u16 words, ++ u16 *data); ++s32 e1000_valid_led_default_generic(struct e1000_hw *hw, u16 *data); ++s32 e1000_validate_nvm_checksum_generic(struct e1000_hw *hw); ++s32 e1000_write_nvm_eewr(struct e1000_hw *hw, u16 offset, ++ u16 words, u16 *data); ++s32 e1000_write_nvm_spi(struct e1000_hw *hw, u16 offset, u16 words, ++ u16 *data); ++s32 e1000_update_nvm_checksum_generic(struct e1000_hw *hw); ++void e1000_release_nvm_generic(struct e1000_hw *hw); ++ ++#define E1000_STM_OPCODE 0xDB00 + + #endif +diff -r f5806398a14e drivers/net/igb/e1000_osdep.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/igb/e1000_osdep.h Mon Jun 15 11:59:49 2009 +0100 +@@ -0,0 +1,121 @@ ++/******************************************************************************* ++ ++ Intel(R) Gigabit Ethernet Linux driver ++ Copyright(c) 2007-2009 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++ ++/* glue for the OS independent part of e1000 ++ * includes register access macros ++ */ ++ ++#ifndef _E1000_OSDEP_H_ ++#define _E1000_OSDEP_H_ ++ ++#include ++#include ++#include ++#include ++#include ++#include "kcompat.h" ++ ++#define usec_delay(x) udelay(x) ++#ifndef msec_delay ++#define msec_delay(x) do { if (in_interrupt()) { \ ++ /* Don't mdelay in interrupt context! */ \ ++ BUG(); \ ++ } else { \ ++ msleep(x); \ ++ } } while (0) ++ ++/* Some workarounds require millisecond delays and are run during interrupt ++ * context. Most notably, when establishing link, the phy may need tweaking ++ * but cannot process phy register reads/writes faster than millisecond ++ * intervals...and we establish link due to a "link status change" interrupt. ++ */ ++#define msec_delay_irq(x) mdelay(x) ++#endif ++ ++#define PCI_COMMAND_REGISTER PCI_COMMAND ++#define CMD_MEM_WRT_INVALIDATE PCI_COMMAND_INVALIDATE ++#define ETH_ADDR_LEN ETH_ALEN ++ ++#ifdef __BIG_ENDIAN ++#define E1000_BIG_ENDIAN __BIG_ENDIAN ++#endif ++ ++ ++#define DEBUGOUT(S) ++#define DEBUGOUT1(S, A...) ++ ++#define DEBUGFUNC(F) DEBUGOUT(F "\n") ++#define DEBUGOUT2 DEBUGOUT1 ++#define DEBUGOUT3 DEBUGOUT2 ++#define DEBUGOUT7 DEBUGOUT3 ++ ++#define E1000_REGISTER(a, reg) reg ++ ++#define E1000_WRITE_REG(a, reg, value) ( \ ++ writel((value), ((a)->hw_addr + E1000_REGISTER(a, reg)))) ++ ++#define E1000_READ_REG(a, reg) (readl((a)->hw_addr + E1000_REGISTER(a, reg))) ++ ++#define E1000_WRITE_REG_ARRAY(a, reg, offset, value) ( \ ++ writel((value), ((a)->hw_addr + E1000_REGISTER(a, reg) + ((offset) << 2)))) ++ ++#define E1000_READ_REG_ARRAY(a, reg, offset) ( \ ++ readl((a)->hw_addr + E1000_REGISTER(a, reg) + ((offset) << 2))) ++ ++#define E1000_READ_REG_ARRAY_DWORD E1000_READ_REG_ARRAY ++#define E1000_WRITE_REG_ARRAY_DWORD E1000_WRITE_REG_ARRAY ++ ++#define E1000_WRITE_REG_ARRAY_WORD(a, reg, offset, value) ( \ ++ writew((value), ((a)->hw_addr + E1000_REGISTER(a, reg) + ((offset) << 1)))) ++ ++#define E1000_READ_REG_ARRAY_WORD(a, reg, offset) ( \ ++ readw((a)->hw_addr + E1000_REGISTER(a, reg) + ((offset) << 1))) ++ ++#define E1000_WRITE_REG_ARRAY_BYTE(a, reg, offset, value) ( \ ++ writeb((value), ((a)->hw_addr + E1000_REGISTER(a, reg) + (offset)))) ++ ++#define E1000_READ_REG_ARRAY_BYTE(a, reg, offset) ( \ ++ readb((a)->hw_addr + E1000_REGISTER(a, reg) + (offset))) ++ ++#define E1000_WRITE_REG_IO(a, reg, offset) do { \ ++ outl(reg, ((a)->io_base)); \ ++ outl(offset, ((a)->io_base + 4)); } while (0) ++ ++#define E1000_WRITE_FLUSH(a) E1000_READ_REG(a, E1000_STATUS) ++ ++#define E1000_WRITE_FLASH_REG(a, reg, value) ( \ ++ writel((value), ((a)->flash_address + reg))) ++ ++#define E1000_WRITE_FLASH_REG16(a, reg, value) ( \ ++ writew((value), ((a)->flash_address + reg))) ++ ++#define E1000_READ_FLASH_REG(a, reg) (readl((a)->flash_address + reg)) ++ ++#define E1000_READ_FLASH_REG16(a, reg) (readw((a)->flash_address + reg)) ++ ++#endif /* _E1000_OSDEP_H_ */ +diff -r f5806398a14e drivers/net/igb/e1000_phy.c +--- a/drivers/net/igb/e1000_phy.c Mon Jun 15 11:45:45 2009 +0100 ++++ b/drivers/net/igb/e1000_phy.c Mon Jun 15 11:59:49 2009 +0100 +@@ -1,7 +1,7 @@ + /******************************************************************************* + + Intel(R) Gigabit Ethernet Linux driver +- Copyright(c) 2007 Intel Corporation. ++ Copyright(c) 2007-2009 Intel Corporation. + + This program is free software; you can redistribute it and/or modify it + under the terms and conditions of the GNU General Public License, +@@ -25,27 +25,15 @@ + + *******************************************************************************/ + +-#include +-#include ++#include "e1000_api.h" + +-#include "e1000_mac.h" +-#include "e1000_phy.h" +- +-static s32 igb_get_phy_cfg_done(struct e1000_hw *hw); +-static void igb_release_phy(struct e1000_hw *hw); +-static s32 igb_acquire_phy(struct e1000_hw *hw); +-static s32 igb_phy_reset_dsp(struct e1000_hw *hw); +-static s32 igb_phy_setup_autoneg(struct e1000_hw *hw); +-static void igb_phy_force_speed_duplex_setup(struct e1000_hw *hw, +- u16 *phy_ctrl); +-static s32 igb_wait_autoneg(struct e1000_hw *hw); +- ++static s32 e1000_phy_setup_autoneg(struct e1000_hw *hw); + /* Cable length tables */ + static const u16 e1000_m88_cable_length_table[] = + { 0, 50, 80, 110, 140, 140, E1000_CABLE_LENGTH_UNDEFINED }; + #define M88E1000_CABLE_LENGTH_TABLE_SIZE \ +- (sizeof(e1000_m88_cable_length_table) / \ +- sizeof(e1000_m88_cable_length_table[0])) ++ (sizeof(e1000_m88_cable_length_table) / \ ++ sizeof(e1000_m88_cable_length_table[0])) + + static const u16 e1000_igp_2_cable_length_table[] = + { 0, 0, 0, 0, 0, 0, 0, 0, 3, 5, 8, 11, 13, 16, 18, 21, +@@ -57,47 +45,54 @@ + 83, 89, 95, 100, 105, 109, 113, 116, 119, 122, 124, + 104, 109, 114, 118, 121, 124}; + #define IGP02E1000_CABLE_LENGTH_TABLE_SIZE \ +- (sizeof(e1000_igp_2_cable_length_table) / \ +- sizeof(e1000_igp_2_cable_length_table[0])) ++ (sizeof(e1000_igp_2_cable_length_table) / \ ++ sizeof(e1000_igp_2_cable_length_table[0])) + + /** +- * igb_check_reset_block - Check if PHY reset is blocked ++ * e1000_check_reset_block_generic - Check if PHY reset is blocked + * @hw: pointer to the HW structure + * + * Read the PHY management control register and check whether a PHY reset +- * is blocked. If a reset is not blocked return 0, otherwise ++ * is blocked. If a reset is not blocked return E1000_SUCCESS, otherwise + * return E1000_BLK_PHY_RESET (12). + **/ +-s32 igb_check_reset_block(struct e1000_hw *hw) ++s32 e1000_check_reset_block_generic(struct e1000_hw *hw) + { + u32 manc; + +- manc = rd32(E1000_MANC); ++ DEBUGFUNC("e1000_check_reset_block"); ++ ++ manc = E1000_READ_REG(hw, E1000_MANC); + + return (manc & E1000_MANC_BLK_PHY_RST_ON_IDE) ? +- E1000_BLK_PHY_RESET : 0; ++ E1000_BLK_PHY_RESET : E1000_SUCCESS; + } + + /** +- * igb_get_phy_id - Retrieve the PHY ID and revision ++ * e1000_get_phy_id - Retrieve the PHY ID and revision + * @hw: pointer to the HW structure + * + * Reads the PHY registers and stores the PHY ID and possibly the PHY + * revision in the hardware structure. + **/ +-s32 igb_get_phy_id(struct e1000_hw *hw) ++s32 e1000_get_phy_id(struct e1000_hw *hw) + { + struct e1000_phy_info *phy = &hw->phy; +- s32 ret_val = 0; ++ s32 ret_val = E1000_SUCCESS; + u16 phy_id; + +- ret_val = hw->phy.ops.read_phy_reg(hw, PHY_ID1, &phy_id); ++ DEBUGFUNC("e1000_get_phy_id"); ++ ++ if (!(phy->ops.read_reg)) ++ goto out; ++ ++ ret_val = phy->ops.read_reg(hw, PHY_ID1, &phy_id); + if (ret_val) + goto out; + + phy->id = (u32)(phy_id << 16); +- udelay(20); +- ret_val = hw->phy.ops.read_phy_reg(hw, PHY_ID2, &phy_id); ++ usec_delay(20); ++ ret_val = phy->ops.read_reg(hw, PHY_ID2, &phy_id); + if (ret_val) + goto out; + +@@ -109,45 +104,46 @@ + } + + /** +- * igb_phy_reset_dsp - Reset PHY DSP ++ * e1000_phy_reset_dsp_generic - Reset PHY DSP + * @hw: pointer to the HW structure + * + * Reset the digital signal processor. + **/ +-static s32 igb_phy_reset_dsp(struct e1000_hw *hw) ++s32 e1000_phy_reset_dsp_generic(struct e1000_hw *hw) + { +- s32 ret_val; ++ s32 ret_val = E1000_SUCCESS; + +- ret_val = hw->phy.ops.write_phy_reg(hw, M88E1000_PHY_GEN_CONTROL, 0xC1); ++ DEBUGFUNC("e1000_phy_reset_dsp_generic"); ++ ++ if (!(hw->phy.ops.write_reg)) ++ goto out; ++ ++ ret_val = hw->phy.ops.write_reg(hw, M88E1000_PHY_GEN_CONTROL, 0xC1); + if (ret_val) + goto out; + +- ret_val = hw->phy.ops.write_phy_reg(hw, M88E1000_PHY_GEN_CONTROL, 0); ++ ret_val = hw->phy.ops.write_reg(hw, M88E1000_PHY_GEN_CONTROL, 0); + + out: + return ret_val; + } + + /** +- * igb_read_phy_reg_mdic - Read MDI control register ++ * e1000_read_phy_reg_mdic - Read MDI control register + * @hw: pointer to the HW structure + * @offset: register offset to be read + * @data: pointer to the read data + * +- * Reads the MDI control regsiter in the PHY at offset and stores the ++ * Reads the MDI control register in the PHY at offset and stores the + * information read to data. + **/ +-static s32 igb_read_phy_reg_mdic(struct e1000_hw *hw, u32 offset, u16 *data) ++s32 e1000_read_phy_reg_mdic(struct e1000_hw *hw, u32 offset, u16 *data) + { + struct e1000_phy_info *phy = &hw->phy; + u32 i, mdic = 0; +- s32 ret_val = 0; ++ s32 ret_val = E1000_SUCCESS; + +- if (offset > MAX_PHY_REG_ADDRESS) { +- hw_dbg("PHY Address %d is out of range\n", offset); +- ret_val = -E1000_ERR_PARAM; +- goto out; +- } ++ DEBUGFUNC("e1000_read_phy_reg_mdic"); + + /* + * Set up Op-code, Phy Address, and register offset in the MDI +@@ -155,10 +151,10 @@ + * PHY to retrieve the desired data. + */ + mdic = ((offset << E1000_MDIC_REG_SHIFT) | +- (phy->addr << E1000_MDIC_PHY_SHIFT) | +- (E1000_MDIC_OP_READ)); ++ (phy->addr << E1000_MDIC_PHY_SHIFT) | ++ (E1000_MDIC_OP_READ)); + +- wr32(E1000_MDIC, mdic); ++ E1000_WRITE_REG(hw, E1000_MDIC, mdic); + + /* + * Poll the ready bit to see if the MDI read completed +@@ -166,18 +162,18 @@ + * the lower time out + */ + for (i = 0; i < (E1000_GEN_POLL_TIMEOUT * 3); i++) { +- udelay(50); +- mdic = rd32(E1000_MDIC); ++ usec_delay(50); ++ mdic = E1000_READ_REG(hw, E1000_MDIC); + if (mdic & E1000_MDIC_READY) + break; + } + if (!(mdic & E1000_MDIC_READY)) { +- hw_dbg("MDI Read did not complete\n"); ++ DEBUGOUT("MDI Read did not complete\n"); + ret_val = -E1000_ERR_PHY; + goto out; + } + if (mdic & E1000_MDIC_ERROR) { +- hw_dbg("MDI Error\n"); ++ DEBUGOUT("MDI Error\n"); + ret_val = -E1000_ERR_PHY; + goto out; + } +@@ -188,24 +184,20 @@ + } + + /** +- * igb_write_phy_reg_mdic - Write MDI control register ++ * e1000_write_phy_reg_mdic - Write MDI control register + * @hw: pointer to the HW structure + * @offset: register offset to write to + * @data: data to write to register at offset + * + * Writes data to MDI control register in the PHY at offset. + **/ +-static s32 igb_write_phy_reg_mdic(struct e1000_hw *hw, u32 offset, u16 data) ++s32 e1000_write_phy_reg_mdic(struct e1000_hw *hw, u32 offset, u16 data) + { + struct e1000_phy_info *phy = &hw->phy; + u32 i, mdic = 0; +- s32 ret_val = 0; ++ s32 ret_val = E1000_SUCCESS; + +- if (offset > MAX_PHY_REG_ADDRESS) { +- hw_dbg("PHY Address %d is out of range\n", offset); +- ret_val = -E1000_ERR_PARAM; +- goto out; +- } ++ DEBUGFUNC("e1000_write_phy_reg_mdic"); + + /* + * Set up Op-code, Phy Address, and register offset in the MDI +@@ -213,11 +205,11 @@ + * PHY to retrieve the desired data. + */ + mdic = (((u32)data) | +- (offset << E1000_MDIC_REG_SHIFT) | +- (phy->addr << E1000_MDIC_PHY_SHIFT) | +- (E1000_MDIC_OP_WRITE)); ++ (offset << E1000_MDIC_REG_SHIFT) | ++ (phy->addr << E1000_MDIC_PHY_SHIFT) | ++ (E1000_MDIC_OP_WRITE)); + +- wr32(E1000_MDIC, mdic); ++ E1000_WRITE_REG(hw, E1000_MDIC, mdic); + + /* + * Poll the ready bit to see if the MDI read completed +@@ -225,18 +217,18 @@ + * the lower time out + */ + for (i = 0; i < (E1000_GEN_POLL_TIMEOUT * 3); i++) { +- udelay(50); +- mdic = rd32(E1000_MDIC); ++ usec_delay(50); ++ mdic = E1000_READ_REG(hw, E1000_MDIC); + if (mdic & E1000_MDIC_READY) + break; + } + if (!(mdic & E1000_MDIC_READY)) { +- hw_dbg("MDI Write did not complete\n"); ++ DEBUGOUT("MDI Write did not complete\n"); + ret_val = -E1000_ERR_PHY; + goto out; + } + if (mdic & E1000_MDIC_ERROR) { +- hw_dbg("MDI Error\n"); ++ DEBUGOUT("MDI Error\n"); + ret_val = -E1000_ERR_PHY; + goto out; + } +@@ -246,7 +238,7 @@ + } + + /** +- * igb_read_phy_reg_igp - Read igp PHY register ++ * e1000_read_phy_reg_m88 - Read m88 PHY register + * @hw: pointer to the HW structure + * @offset: register offset to be read + * @data: pointer to the read data +@@ -255,36 +247,30 @@ + * and storing the retrieved information in data. Release any acquired + * semaphores before exiting. + **/ +-s32 igb_read_phy_reg_igp(struct e1000_hw *hw, u32 offset, u16 *data) ++s32 e1000_read_phy_reg_m88(struct e1000_hw *hw, u32 offset, u16 *data) + { +- s32 ret_val; ++ s32 ret_val = E1000_SUCCESS; + +- ret_val = igb_acquire_phy(hw); ++ DEBUGFUNC("e1000_read_phy_reg_m88"); ++ ++ if (!(hw->phy.ops.acquire)) ++ goto out; ++ ++ ret_val = hw->phy.ops.acquire(hw); + if (ret_val) + goto out; + +- if (offset > MAX_PHY_MULTI_PAGE_REG) { +- ret_val = igb_write_phy_reg_mdic(hw, +- IGP01E1000_PHY_PAGE_SELECT, +- (u16)offset); +- if (ret_val) { +- igb_release_phy(hw); +- goto out; +- } +- } ++ ret_val = e1000_read_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset, ++ data); + +- ret_val = igb_read_phy_reg_mdic(hw, +- MAX_PHY_REG_ADDRESS & offset, +- data); +- +- igb_release_phy(hw); ++ hw->phy.ops.release(hw); + + out: + return ret_val; + } + + /** +- * igb_write_phy_reg_igp - Write igp PHY register ++ * e1000_write_phy_reg_m88 - Write m88 PHY register + * @hw: pointer to the HW structure + * @offset: register offset to write to + * @data: data to write at register offset +@@ -292,55 +278,207 @@ + * Acquires semaphore, if necessary, then writes the data to PHY register + * at the offset. Release any acquired semaphores before exiting. + **/ +-s32 igb_write_phy_reg_igp(struct e1000_hw *hw, u32 offset, u16 data) ++s32 e1000_write_phy_reg_m88(struct e1000_hw *hw, u32 offset, u16 data) + { +- s32 ret_val; ++ s32 ret_val = E1000_SUCCESS; + +- ret_val = igb_acquire_phy(hw); ++ DEBUGFUNC("e1000_write_phy_reg_m88"); ++ ++ if (!(hw->phy.ops.acquire)) ++ goto out; ++ ++ ret_val = hw->phy.ops.acquire(hw); + if (ret_val) + goto out; + +- if (offset > MAX_PHY_MULTI_PAGE_REG) { +- ret_val = igb_write_phy_reg_mdic(hw, +- IGP01E1000_PHY_PAGE_SELECT, +- (u16)offset); +- if (ret_val) { +- igb_release_phy(hw); +- goto out; +- } +- } ++ ret_val = e1000_write_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset, ++ data); + +- ret_val = igb_write_phy_reg_mdic(hw, +- MAX_PHY_REG_ADDRESS & offset, +- data); +- +- igb_release_phy(hw); ++ hw->phy.ops.release(hw); + + out: + return ret_val; + } + + /** +- * igb_copper_link_setup_m88 - Setup m88 PHY's for copper link ++ * e1000_read_phy_reg_igp - Read igp PHY register ++ * @hw: pointer to the HW structure ++ * @offset: register offset to be read ++ * @data: pointer to the read data ++ * ++ * Acquires semaphore, if necessary, then reads the PHY register at offset ++ * and storing the retrieved information in data. Release any acquired ++ * semaphores before exiting. ++ **/ ++s32 e1000_read_phy_reg_igp(struct e1000_hw *hw, u32 offset, u16 *data) ++{ ++ s32 ret_val = E1000_SUCCESS; ++ ++ DEBUGFUNC("e1000_read_phy_reg_igp"); ++ ++ if (!(hw->phy.ops.acquire)) ++ goto out; ++ ++ ret_val = hw->phy.ops.acquire(hw); ++ if (ret_val) ++ goto out; ++ ++ if (offset > MAX_PHY_MULTI_PAGE_REG) { ++ ret_val = e1000_write_phy_reg_mdic(hw, ++ IGP01E1000_PHY_PAGE_SELECT, ++ (u16)offset); ++ if (ret_val) { ++ hw->phy.ops.release(hw); ++ goto out; ++ } ++ } ++ ++ ret_val = e1000_read_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset, ++ data); ++ ++ hw->phy.ops.release(hw); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_write_phy_reg_igp - Write igp PHY register ++ * @hw: pointer to the HW structure ++ * @offset: register offset to write to ++ * @data: data to write at register offset ++ * ++ * Acquires semaphore, if necessary, then writes the data to PHY register ++ * at the offset. Release any acquired semaphores before exiting. ++ **/ ++s32 e1000_write_phy_reg_igp(struct e1000_hw *hw, u32 offset, u16 data) ++{ ++ s32 ret_val = E1000_SUCCESS; ++ ++ DEBUGFUNC("e1000_write_phy_reg_igp"); ++ ++ if (!(hw->phy.ops.acquire)) ++ goto out; ++ ++ ret_val = hw->phy.ops.acquire(hw); ++ if (ret_val) ++ goto out; ++ ++ if (offset > MAX_PHY_MULTI_PAGE_REG) { ++ ret_val = e1000_write_phy_reg_mdic(hw, ++ IGP01E1000_PHY_PAGE_SELECT, ++ (u16)offset); ++ if (ret_val) { ++ hw->phy.ops.release(hw); ++ goto out; ++ } ++ } ++ ++ ret_val = e1000_write_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset, ++ data); ++ ++ hw->phy.ops.release(hw); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_read_kmrn_reg_generic - Read kumeran register ++ * @hw: pointer to the HW structure ++ * @offset: register offset to be read ++ * @data: pointer to the read data ++ * ++ * Acquires semaphore, if necessary. Then reads the PHY register at offset ++ * using the kumeran interface. The information retrieved is stored in data. ++ * Release any acquired semaphores before exiting. ++ **/ ++s32 e1000_read_kmrn_reg_generic(struct e1000_hw *hw, u32 offset, u16 *data) ++{ ++ u32 kmrnctrlsta; ++ s32 ret_val = E1000_SUCCESS; ++ ++ DEBUGFUNC("e1000_read_kmrn_reg_generic"); ++ ++ if (!(hw->phy.ops.acquire)) ++ goto out; ++ ++ ret_val = hw->phy.ops.acquire(hw); ++ if (ret_val) ++ goto out; ++ ++ kmrnctrlsta = ((offset << E1000_KMRNCTRLSTA_OFFSET_SHIFT) & ++ E1000_KMRNCTRLSTA_OFFSET) | E1000_KMRNCTRLSTA_REN; ++ E1000_WRITE_REG(hw, E1000_KMRNCTRLSTA, kmrnctrlsta); ++ ++ usec_delay(2); ++ ++ kmrnctrlsta = E1000_READ_REG(hw, E1000_KMRNCTRLSTA); ++ *data = (u16)kmrnctrlsta; ++ ++ hw->phy.ops.release(hw); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_write_kmrn_reg_generic - Write kumeran register ++ * @hw: pointer to the HW structure ++ * @offset: register offset to write to ++ * @data: data to write at register offset ++ * ++ * Acquires semaphore, if necessary. Then write the data to PHY register ++ * at the offset using the kumeran interface. Release any acquired semaphores ++ * before exiting. ++ **/ ++s32 e1000_write_kmrn_reg_generic(struct e1000_hw *hw, u32 offset, u16 data) ++{ ++ u32 kmrnctrlsta; ++ s32 ret_val = E1000_SUCCESS; ++ ++ DEBUGFUNC("e1000_write_kmrn_reg_generic"); ++ ++ if (!(hw->phy.ops.acquire)) ++ goto out; ++ ++ ret_val = hw->phy.ops.acquire(hw); ++ if (ret_val) ++ goto out; ++ ++ kmrnctrlsta = ((offset << E1000_KMRNCTRLSTA_OFFSET_SHIFT) & ++ E1000_KMRNCTRLSTA_OFFSET) | data; ++ E1000_WRITE_REG(hw, E1000_KMRNCTRLSTA, kmrnctrlsta); ++ ++ usec_delay(2); ++ hw->phy.ops.release(hw); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_copper_link_setup_m88 - Setup m88 PHY's for copper link + * @hw: pointer to the HW structure + * + * Sets up MDI/MDI-X and polarity for m88 PHY's. If necessary, transmit clock + * and downshift values are set also. + **/ +-s32 igb_copper_link_setup_m88(struct e1000_hw *hw) ++s32 e1000_copper_link_setup_m88(struct e1000_hw *hw) + { + struct e1000_phy_info *phy = &hw->phy; + s32 ret_val; + u16 phy_data; + ++ DEBUGFUNC("e1000_copper_link_setup_m88"); ++ + if (phy->reset_disable) { +- ret_val = 0; ++ ret_val = E1000_SUCCESS; + goto out; + } + + /* Enable CRS on TX. This must be set for half-duplex operation. */ +- ret_val = hw->phy.ops.read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, +- &phy_data); ++ ret_val = phy->ops.read_reg(hw, M88E1000_PHY_SPEC_CTRL, &phy_data); + if (ret_val) + goto out; + +@@ -383,8 +521,7 @@ + if (phy->disable_polarity_correction == 1) + phy_data |= M88E1000_PSCR_POLARITY_REVERSAL; + +- ret_val = hw->phy.ops.write_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, +- phy_data); ++ ret_val = phy->ops.write_reg(hw, M88E1000_PHY_SPEC_CTRL, phy_data); + if (ret_val) + goto out; + +@@ -393,9 +530,8 @@ + * Force TX_CLK in the Extended PHY Specific Control Register + * to 25MHz clock. + */ +- ret_val = hw->phy.ops.read_phy_reg(hw, +- M88E1000_EXT_PHY_SPEC_CTRL, +- &phy_data); ++ ret_val = phy->ops.read_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL, ++ &phy_data); + if (ret_val) + goto out; + +@@ -409,21 +545,20 @@ + } else { + /* Configure Master and Slave downshift values */ + phy_data &= ~(M88E1000_EPSCR_MASTER_DOWNSHIFT_MASK | +- M88E1000_EPSCR_SLAVE_DOWNSHIFT_MASK); ++ M88E1000_EPSCR_SLAVE_DOWNSHIFT_MASK); + phy_data |= (M88E1000_EPSCR_MASTER_DOWNSHIFT_1X | +- M88E1000_EPSCR_SLAVE_DOWNSHIFT_1X); ++ M88E1000_EPSCR_SLAVE_DOWNSHIFT_1X); + } +- ret_val = hw->phy.ops.write_phy_reg(hw, +- M88E1000_EXT_PHY_SPEC_CTRL, +- phy_data); ++ ret_val = phy->ops.write_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL, ++ phy_data); + if (ret_val) + goto out; + } + + /* Commit the changes. */ +- ret_val = igb_phy_sw_reset(hw); ++ ret_val = phy->ops.commit(hw); + if (ret_val) { +- hw_dbg("Error committing the PHY changes\n"); ++ DEBUGOUT("Error committing the PHY changes\n"); + goto out; + } + +@@ -432,31 +567,36 @@ + } + + /** +- * igb_copper_link_setup_igp - Setup igp PHY's for copper link ++ * e1000_copper_link_setup_igp - Setup igp PHY's for copper link + * @hw: pointer to the HW structure + * + * Sets up LPLU, MDI/MDI-X, polarity, Smartspeed and Master/Slave config for + * igp PHY's. + **/ +-s32 igb_copper_link_setup_igp(struct e1000_hw *hw) ++s32 e1000_copper_link_setup_igp(struct e1000_hw *hw) + { + struct e1000_phy_info *phy = &hw->phy; + s32 ret_val; + u16 data; + ++ DEBUGFUNC("e1000_copper_link_setup_igp"); ++ + if (phy->reset_disable) { +- ret_val = 0; ++ ret_val = E1000_SUCCESS; + goto out; + } + +- ret_val = hw->phy.ops.reset_phy(hw); ++ ret_val = hw->phy.ops.reset(hw); + if (ret_val) { +- hw_dbg("Error resetting the PHY.\n"); ++ DEBUGOUT("Error resetting the PHY.\n"); + goto out; + } + +- /* Wait 15ms for MAC to configure PHY from NVM settings. */ +- msleep(15); ++ /* ++ * Wait 100ms for MAC to configure PHY from NVM settings, to avoid ++ * timeout issues when LFS is enabled. ++ */ ++ msec_delay(100); + + /* + * The NVM settings will configure LPLU in D3 for +@@ -464,22 +604,23 @@ + */ + if (phy->type == e1000_phy_igp) { + /* disable lplu d3 during driver init */ +- if (hw->phy.ops.set_d3_lplu_state) +- ret_val = hw->phy.ops.set_d3_lplu_state(hw, false); ++ ret_val = hw->phy.ops.set_d3_lplu_state(hw, false); + if (ret_val) { +- hw_dbg("Error Disabling LPLU D3\n"); ++ DEBUGOUT("Error Disabling LPLU D3\n"); + goto out; + } + } + + /* disable lplu d0 during driver init */ +- ret_val = hw->phy.ops.set_d0_lplu_state(hw, false); +- if (ret_val) { +- hw_dbg("Error Disabling LPLU D0\n"); +- goto out; ++ if (hw->phy.ops.set_d0_lplu_state) { ++ ret_val = hw->phy.ops.set_d0_lplu_state(hw, false); ++ if (ret_val) { ++ DEBUGOUT("Error Disabling LPLU D0\n"); ++ goto out; ++ } + } + /* Configure mdi-mdix settings */ +- ret_val = hw->phy.ops.read_phy_reg(hw, IGP01E1000_PHY_PORT_CTRL, &data); ++ ret_val = phy->ops.read_reg(hw, IGP01E1000_PHY_PORT_CTRL, &data); + if (ret_val) + goto out; + +@@ -497,7 +638,7 @@ + data |= IGP01E1000_PSCR_AUTO_MDIX; + break; + } +- ret_val = hw->phy.ops.write_phy_reg(hw, IGP01E1000_PHY_PORT_CTRL, data); ++ ret_val = phy->ops.write_reg(hw, IGP01E1000_PHY_PORT_CTRL, data); + if (ret_val) + goto out; + +@@ -510,33 +651,31 @@ + */ + if (phy->autoneg_advertised == ADVERTISE_1000_FULL) { + /* Disable SmartSpeed */ +- ret_val = hw->phy.ops.read_phy_reg(hw, +- IGP01E1000_PHY_PORT_CONFIG, +- &data); ++ ret_val = phy->ops.read_reg(hw, ++ IGP01E1000_PHY_PORT_CONFIG, ++ &data); + if (ret_val) + goto out; + + data &= ~IGP01E1000_PSCFR_SMART_SPEED; +- ret_val = hw->phy.ops.write_phy_reg(hw, +- IGP01E1000_PHY_PORT_CONFIG, +- data); ++ ret_val = phy->ops.write_reg(hw, ++ IGP01E1000_PHY_PORT_CONFIG, ++ data); + if (ret_val) + goto out; + + /* Set auto Master/Slave resolution process */ +- ret_val = hw->phy.ops.read_phy_reg(hw, PHY_1000T_CTRL, +- &data); ++ ret_val = phy->ops.read_reg(hw, PHY_1000T_CTRL, &data); + if (ret_val) + goto out; + + data &= ~CR_1000T_MS_ENABLE; +- ret_val = hw->phy.ops.write_phy_reg(hw, PHY_1000T_CTRL, +- data); ++ ret_val = phy->ops.write_reg(hw, PHY_1000T_CTRL, data); + if (ret_val) + goto out; + } + +- ret_val = hw->phy.ops.read_phy_reg(hw, PHY_1000T_CTRL, &data); ++ ret_val = phy->ops.read_reg(hw, PHY_1000T_CTRL, &data); + if (ret_val) + goto out; + +@@ -560,7 +699,7 @@ + default: + break; + } +- ret_val = hw->phy.ops.write_phy_reg(hw, PHY_1000T_CTRL, data); ++ ret_val = phy->ops.write_reg(hw, PHY_1000T_CTRL, data); + if (ret_val) + goto out; + } +@@ -570,7 +709,7 @@ + } + + /** +- * igb_copper_link_autoneg - Setup/Enable autoneg for copper link ++ * e1000_copper_link_autoneg - Setup/Enable autoneg for copper link + * @hw: pointer to the HW structure + * + * Performs initial bounds checking on autoneg advertisement parameter, then +@@ -578,11 +717,13 @@ + * and restart the negotiation process between the link partner. If + * autoneg_wait_to_complete, then wait for autoneg to complete before exiting. + **/ +-s32 igb_copper_link_autoneg(struct e1000_hw *hw) ++s32 e1000_copper_link_autoneg(struct e1000_hw *hw) + { + struct e1000_phy_info *phy = &hw->phy; + s32 ret_val; + u16 phy_ctrl; ++ ++ DEBUGFUNC("e1000_copper_link_autoneg"); + + /* + * Perform some bounds checking on the autoneg advertisement +@@ -597,24 +738,24 @@ + if (phy->autoneg_advertised == 0) + phy->autoneg_advertised = phy->autoneg_mask; + +- hw_dbg("Reconfiguring auto-neg advertisement params\n"); +- ret_val = igb_phy_setup_autoneg(hw); ++ DEBUGOUT("Reconfiguring auto-neg advertisement params\n"); ++ ret_val = e1000_phy_setup_autoneg(hw); + if (ret_val) { +- hw_dbg("Error Setting up Auto-Negotiation\n"); ++ DEBUGOUT("Error Setting up Auto-Negotiation\n"); + goto out; + } +- hw_dbg("Restarting Auto-Neg\n"); ++ DEBUGOUT("Restarting Auto-Neg\n"); + + /* + * Restart auto-negotiation by setting the Auto Neg Enable bit and + * the Auto Neg Restart bit in the PHY control register. + */ +- ret_val = hw->phy.ops.read_phy_reg(hw, PHY_CONTROL, &phy_ctrl); ++ ret_val = phy->ops.read_reg(hw, PHY_CONTROL, &phy_ctrl); + if (ret_val) + goto out; + + phy_ctrl |= (MII_CR_AUTO_NEG_EN | MII_CR_RESTART_AUTO_NEG); +- ret_val = hw->phy.ops.write_phy_reg(hw, PHY_CONTROL, phy_ctrl); ++ ret_val = phy->ops.write_reg(hw, PHY_CONTROL, phy_ctrl); + if (ret_val) + goto out; + +@@ -623,10 +764,10 @@ + * check at a later time (for example, callback routine). + */ + if (phy->autoneg_wait_to_complete) { +- ret_val = igb_wait_autoneg(hw); ++ ret_val = hw->mac.ops.wait_autoneg(hw); + if (ret_val) { +- hw_dbg("Error while waiting for " +- "autoneg to complete\n"); ++ DEBUGOUT("Error while waiting for " ++ "autoneg to complete\n"); + goto out; + } + } +@@ -638,7 +779,7 @@ + } + + /** +- * igb_phy_setup_autoneg - Configure PHY for auto-negotiation ++ * e1000_phy_setup_autoneg - Configure PHY for auto-negotiation + * @hw: pointer to the HW structure + * + * Reads the MII auto-neg advertisement register and/or the 1000T control +@@ -646,26 +787,26 @@ + * return successful. Otherwise, setup advertisement and flow control to + * the appropriate values for the wanted auto-negotiation. + **/ +-static s32 igb_phy_setup_autoneg(struct e1000_hw *hw) ++static s32 e1000_phy_setup_autoneg(struct e1000_hw *hw) + { + struct e1000_phy_info *phy = &hw->phy; + s32 ret_val; + u16 mii_autoneg_adv_reg; + u16 mii_1000t_ctrl_reg = 0; + ++ DEBUGFUNC("e1000_phy_setup_autoneg"); ++ + phy->autoneg_advertised &= phy->autoneg_mask; + + /* Read the MII Auto-Neg Advertisement Register (Address 4). */ +- ret_val = hw->phy.ops.read_phy_reg(hw, PHY_AUTONEG_ADV, +- &mii_autoneg_adv_reg); ++ ret_val = phy->ops.read_reg(hw, PHY_AUTONEG_ADV, &mii_autoneg_adv_reg); + if (ret_val) + goto out; + + if (phy->autoneg_mask & ADVERTISE_1000_FULL) { + /* Read the MII 1000Base-T Control Register (Address 9). */ +- ret_val = hw->phy.ops.read_phy_reg(hw, +- PHY_1000T_CTRL, +- &mii_1000t_ctrl_reg); ++ ret_val = phy->ops.read_reg(hw, PHY_1000T_CTRL, ++ &mii_1000t_ctrl_reg); + if (ret_val) + goto out; + } +@@ -684,44 +825,44 @@ + * the 1000Base-T Control Register (Address 9). + */ + mii_autoneg_adv_reg &= ~(NWAY_AR_100TX_FD_CAPS | +- NWAY_AR_100TX_HD_CAPS | +- NWAY_AR_10T_FD_CAPS | +- NWAY_AR_10T_HD_CAPS); ++ NWAY_AR_100TX_HD_CAPS | ++ NWAY_AR_10T_FD_CAPS | ++ NWAY_AR_10T_HD_CAPS); + mii_1000t_ctrl_reg &= ~(CR_1000T_HD_CAPS | CR_1000T_FD_CAPS); + +- hw_dbg("autoneg_advertised %x\n", phy->autoneg_advertised); ++ DEBUGOUT1("autoneg_advertised %x\n", phy->autoneg_advertised); + + /* Do we want to advertise 10 Mb Half Duplex? */ + if (phy->autoneg_advertised & ADVERTISE_10_HALF) { +- hw_dbg("Advertise 10mb Half duplex\n"); ++ DEBUGOUT("Advertise 10mb Half duplex\n"); + mii_autoneg_adv_reg |= NWAY_AR_10T_HD_CAPS; + } + + /* Do we want to advertise 10 Mb Full Duplex? */ + if (phy->autoneg_advertised & ADVERTISE_10_FULL) { +- hw_dbg("Advertise 10mb Full duplex\n"); ++ DEBUGOUT("Advertise 10mb Full duplex\n"); + mii_autoneg_adv_reg |= NWAY_AR_10T_FD_CAPS; + } + + /* Do we want to advertise 100 Mb Half Duplex? */ + if (phy->autoneg_advertised & ADVERTISE_100_HALF) { +- hw_dbg("Advertise 100mb Half duplex\n"); ++ DEBUGOUT("Advertise 100mb Half duplex\n"); + mii_autoneg_adv_reg |= NWAY_AR_100TX_HD_CAPS; + } + + /* Do we want to advertise 100 Mb Full Duplex? */ + if (phy->autoneg_advertised & ADVERTISE_100_FULL) { +- hw_dbg("Advertise 100mb Full duplex\n"); ++ DEBUGOUT("Advertise 100mb Full duplex\n"); + mii_autoneg_adv_reg |= NWAY_AR_100TX_FD_CAPS; + } + + /* We do not allow the Phy to advertise 1000 Mb Half Duplex */ + if (phy->autoneg_advertised & ADVERTISE_1000_HALF) +- hw_dbg("Advertise 1000mb Half duplex request denied!\n"); ++ DEBUGOUT("Advertise 1000mb Half duplex request denied!\n"); + + /* Do we want to advertise 1000 Mb Full Duplex? */ + if (phy->autoneg_advertised & ADVERTISE_1000_FULL) { +- hw_dbg("Advertise 1000mb Full duplex\n"); ++ DEBUGOUT("Advertise 1000mb Full duplex\n"); + mii_1000t_ctrl_reg |= CR_1000T_FD_CAPS; + } + +@@ -739,26 +880,26 @@ + * but not send pause frames). + * 2: Tx flow control is enabled (we can send pause frames + * but we do not support receiving pause frames). +- * 3: Both Rx and TX flow control (symmetric) are enabled. ++ * 3: Both Rx and Tx flow control (symmetric) are enabled. + * other: No software override. The flow control configuration + * in the EEPROM is used. + */ +- switch (hw->fc.type) { ++ switch (hw->fc.current_mode) { + case e1000_fc_none: + /* +- * Flow control (RX & TX) is completely disabled by a ++ * Flow control (Rx & Tx) is completely disabled by a + * software over-ride. + */ + mii_autoneg_adv_reg &= ~(NWAY_AR_ASM_DIR | NWAY_AR_PAUSE); + break; + case e1000_fc_rx_pause: + /* +- * RX Flow control is enabled, and TX Flow control is ++ * Rx Flow control is enabled, and Tx Flow control is + * disabled, by a software over-ride. + * + * Since there really isn't a way to advertise that we are +- * capable of RX Pause ONLY, we will advertise that we +- * support both symmetric and asymmetric RX PAUSE. Later ++ * capable of Rx Pause ONLY, we will advertise that we ++ * support both symmetric and asymmetric Rx PAUSE. Later + * (in e1000_config_fc_after_link_up) we will disable the + * hw's ability to send PAUSE frames. + */ +@@ -766,7 +907,7 @@ + break; + case e1000_fc_tx_pause: + /* +- * TX Flow control is enabled, and RX Flow control is ++ * Tx Flow control is enabled, and Rx Flow control is + * disabled, by a software over-ride. + */ + mii_autoneg_adv_reg |= NWAY_AR_ASM_DIR; +@@ -774,28 +915,27 @@ + break; + case e1000_fc_full: + /* +- * Flow control (both RX and TX) is enabled by a software ++ * Flow control (both Rx and Tx) is enabled by a software + * over-ride. + */ + mii_autoneg_adv_reg |= (NWAY_AR_ASM_DIR | NWAY_AR_PAUSE); + break; + default: +- hw_dbg("Flow control param set incorrectly\n"); ++ DEBUGOUT("Flow control param set incorrectly\n"); + ret_val = -E1000_ERR_CONFIG; + goto out; + } + +- ret_val = hw->phy.ops.write_phy_reg(hw, PHY_AUTONEG_ADV, +- mii_autoneg_adv_reg); ++ ret_val = phy->ops.write_reg(hw, PHY_AUTONEG_ADV, mii_autoneg_adv_reg); + if (ret_val) + goto out; + +- hw_dbg("Auto-Neg Advertising %x\n", mii_autoneg_adv_reg); ++ DEBUGOUT1("Auto-Neg Advertising %x\n", mii_autoneg_adv_reg); + + if (phy->autoneg_mask & ADVERTISE_1000_FULL) { +- ret_val = hw->phy.ops.write_phy_reg(hw, +- PHY_1000T_CTRL, +- mii_1000t_ctrl_reg); ++ ret_val = phy->ops.write_reg(hw, ++ PHY_1000T_CTRL, ++ mii_1000t_ctrl_reg); + if (ret_val) + goto out; + } +@@ -805,27 +945,89 @@ + } + + /** +- * igb_phy_force_speed_duplex_igp - Force speed/duplex for igp PHY ++ * e1000_setup_copper_link_generic - Configure copper link settings ++ * @hw: pointer to the HW structure ++ * ++ * Calls the appropriate function to configure the link for auto-neg or forced ++ * speed and duplex. Then we check for link, once link is established calls ++ * to configure collision distance and flow control are called. If link is ++ * not established, we return -E1000_ERR_PHY (-2). ++ **/ ++s32 e1000_setup_copper_link_generic(struct e1000_hw *hw) ++{ ++ s32 ret_val; ++ bool link; ++ ++ DEBUGFUNC("e1000_setup_copper_link_generic"); ++ ++ if (hw->mac.autoneg) { ++ /* ++ * Setup autoneg and flow control advertisement and perform ++ * autonegotiation. ++ */ ++ ret_val = e1000_copper_link_autoneg(hw); ++ if (ret_val) ++ goto out; ++ } else { ++ /* ++ * PHY will be set to 10H, 10F, 100H or 100F ++ * depending on user settings. ++ */ ++ DEBUGOUT("Forcing Speed and Duplex\n"); ++ ret_val = hw->phy.ops.force_speed_duplex(hw); ++ if (ret_val) { ++ DEBUGOUT("Error Forcing Speed and Duplex\n"); ++ goto out; ++ } ++ } ++ ++ /* ++ * Check link status. Wait up to 100 microseconds for link to become ++ * valid. ++ */ ++ ret_val = e1000_phy_has_link_generic(hw, ++ COPPER_LINK_UP_LIMIT, ++ 10, ++ &link); ++ if (ret_val) ++ goto out; ++ ++ if (link) { ++ DEBUGOUT("Valid link established!!!\n"); ++ e1000_config_collision_dist_generic(hw); ++ ret_val = e1000_config_fc_after_link_up_generic(hw); ++ } else { ++ DEBUGOUT("Unable to establish link!!!\n"); ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_phy_force_speed_duplex_igp - Force speed/duplex for igp PHY + * @hw: pointer to the HW structure + * + * Calls the PHY setup function to force speed and duplex. Clears the + * auto-crossover to force MDI manually. Waits for link and returns + * successful if link up is successful, else -E1000_ERR_PHY (-2). + **/ +-s32 igb_phy_force_speed_duplex_igp(struct e1000_hw *hw) ++s32 e1000_phy_force_speed_duplex_igp(struct e1000_hw *hw) + { + struct e1000_phy_info *phy = &hw->phy; + s32 ret_val; + u16 phy_data; + bool link; + +- ret_val = hw->phy.ops.read_phy_reg(hw, PHY_CONTROL, &phy_data); ++ DEBUGFUNC("e1000_phy_force_speed_duplex_igp"); ++ ++ ret_val = phy->ops.read_reg(hw, PHY_CONTROL, &phy_data); + if (ret_val) + goto out; + +- igb_phy_force_speed_duplex_setup(hw, &phy_data); ++ e1000_phy_force_speed_duplex_setup(hw, &phy_data); + +- ret_val = hw->phy.ops.write_phy_reg(hw, PHY_CONTROL, phy_data); ++ ret_val = phy->ops.write_reg(hw, PHY_CONTROL, phy_data); + if (ret_val) + goto out; + +@@ -833,41 +1035,39 @@ + * Clear Auto-Crossover to force MDI manually. IGP requires MDI + * forced whenever speed and duplex are forced. + */ +- ret_val = hw->phy.ops.read_phy_reg(hw, IGP01E1000_PHY_PORT_CTRL, +- &phy_data); ++ ret_val = phy->ops.read_reg(hw, IGP01E1000_PHY_PORT_CTRL, &phy_data); + if (ret_val) + goto out; + + phy_data &= ~IGP01E1000_PSCR_AUTO_MDIX; + phy_data &= ~IGP01E1000_PSCR_FORCE_MDI_MDIX; + +- ret_val = hw->phy.ops.write_phy_reg(hw, IGP01E1000_PHY_PORT_CTRL, +- phy_data); ++ ret_val = phy->ops.write_reg(hw, IGP01E1000_PHY_PORT_CTRL, phy_data); + if (ret_val) + goto out; + +- hw_dbg("IGP PSCR: %X\n", phy_data); ++ DEBUGOUT1("IGP PSCR: %X\n", phy_data); + +- udelay(1); ++ usec_delay(1); + + if (phy->autoneg_wait_to_complete) { +- hw_dbg("Waiting for forced speed/duplex link on IGP phy.\n"); ++ DEBUGOUT("Waiting for forced speed/duplex link on IGP phy.\n"); + +- ret_val = igb_phy_has_link(hw, +- PHY_FORCE_LIMIT, +- 100000, +- &link); ++ ret_val = e1000_phy_has_link_generic(hw, ++ PHY_FORCE_LIMIT, ++ 100000, ++ &link); + if (ret_val) + goto out; + + if (!link) +- hw_dbg("Link taking longer than expected.\n"); ++ DEBUGOUT("Link taking longer than expected.\n"); + + /* Try once more */ +- ret_val = igb_phy_has_link(hw, +- PHY_FORCE_LIMIT, +- 100000, +- &link); ++ ret_val = e1000_phy_has_link_generic(hw, ++ PHY_FORCE_LIMIT, ++ 100000, ++ &link); + if (ret_val) + goto out; + } +@@ -877,61 +1077,59 @@ + } + + /** +- * igb_phy_force_speed_duplex_m88 - Force speed/duplex for m88 PHY ++ * e1000_phy_force_speed_duplex_m88 - Force speed/duplex for m88 PHY + * @hw: pointer to the HW structure + * + * Calls the PHY setup function to force speed and duplex. Clears the + * auto-crossover to force MDI manually. Resets the PHY to commit the + * changes. If time expires while waiting for link up, we reset the DSP. +- * After reset, TX_CLK and CRS on TX must be set. Return successful upon ++ * After reset, TX_CLK and CRS on Tx must be set. Return successful upon + * successful completion, else return corresponding error code. + **/ +-s32 igb_phy_force_speed_duplex_m88(struct e1000_hw *hw) ++s32 e1000_phy_force_speed_duplex_m88(struct e1000_hw *hw) + { + struct e1000_phy_info *phy = &hw->phy; + s32 ret_val; + u16 phy_data; + bool link; + ++ DEBUGFUNC("e1000_phy_force_speed_duplex_m88"); ++ + /* + * Clear Auto-Crossover to force MDI manually. M88E1000 requires MDI + * forced whenever speed and duplex are forced. + */ +- ret_val = hw->phy.ops.read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, +- &phy_data); ++ ret_val = phy->ops.read_reg(hw, M88E1000_PHY_SPEC_CTRL, &phy_data); + if (ret_val) + goto out; + + phy_data &= ~M88E1000_PSCR_AUTO_X_MODE; +- ret_val = hw->phy.ops.write_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, +- phy_data); ++ ret_val = phy->ops.write_reg(hw, M88E1000_PHY_SPEC_CTRL, phy_data); + if (ret_val) + goto out; + +- hw_dbg("M88E1000 PSCR: %X\n", phy_data); ++ DEBUGOUT1("M88E1000 PSCR: %X\n", phy_data); + +- ret_val = hw->phy.ops.read_phy_reg(hw, PHY_CONTROL, &phy_data); ++ ret_val = phy->ops.read_reg(hw, PHY_CONTROL, &phy_data); + if (ret_val) + goto out; + +- igb_phy_force_speed_duplex_setup(hw, &phy_data); ++ e1000_phy_force_speed_duplex_setup(hw, &phy_data); + +- /* Reset the phy to commit changes. */ +- phy_data |= MII_CR_RESET; +- +- ret_val = hw->phy.ops.write_phy_reg(hw, PHY_CONTROL, phy_data); ++ ret_val = phy->ops.write_reg(hw, PHY_CONTROL, phy_data); + if (ret_val) + goto out; + +- udelay(1); ++ /* Reset the phy to commit changes. */ ++ ret_val = hw->phy.ops.commit(hw); ++ if (ret_val) ++ goto out; + + if (phy->autoneg_wait_to_complete) { +- hw_dbg("Waiting for forced speed/duplex link on M88 phy.\n"); ++ DEBUGOUT("Waiting for forced speed/duplex link on M88 phy.\n"); + +- ret_val = igb_phy_has_link(hw, +- PHY_FORCE_LIMIT, +- 100000, +- &link); ++ ret_val = e1000_phy_has_link_generic(hw, PHY_FORCE_LIMIT, ++ 100000, &link); + if (ret_val) + goto out; + +@@ -940,25 +1138,24 @@ + * We didn't get link. + * Reset the DSP and cross our fingers. + */ +- ret_val = hw->phy.ops.write_phy_reg(hw, +- M88E1000_PHY_PAGE_SELECT, +- 0x001d); ++ ret_val = phy->ops.write_reg(hw, ++ M88E1000_PHY_PAGE_SELECT, ++ 0x001d); + if (ret_val) + goto out; +- ret_val = igb_phy_reset_dsp(hw); ++ ret_val = e1000_phy_reset_dsp_generic(hw); + if (ret_val) + goto out; + } + + /* Try once more */ +- ret_val = igb_phy_has_link(hw, PHY_FORCE_LIMIT, +- 100000, &link); ++ ret_val = e1000_phy_has_link_generic(hw, PHY_FORCE_LIMIT, ++ 100000, &link); + if (ret_val) + goto out; + } + +- ret_val = hw->phy.ops.read_phy_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL, +- &phy_data); ++ ret_val = phy->ops.read_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL, &phy_data); + if (ret_val) + goto out; + +@@ -968,8 +1165,7 @@ + * the reset value of 2.5MHz. + */ + phy_data |= M88E1000_EPSCR_TX_CLK_25; +- ret_val = hw->phy.ops.write_phy_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL, +- phy_data); ++ ret_val = phy->ops.write_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL, phy_data); + if (ret_val) + goto out; + +@@ -977,21 +1173,19 @@ + * In addition, we must re-enable CRS on Tx for both half and full + * duplex. + */ +- ret_val = hw->phy.ops.read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, +- &phy_data); ++ ret_val = phy->ops.read_reg(hw, M88E1000_PHY_SPEC_CTRL, &phy_data); + if (ret_val) + goto out; + + phy_data |= M88E1000_PSCR_ASSERT_CRS_ON_TX; +- ret_val = hw->phy.ops.write_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, +- phy_data); ++ ret_val = phy->ops.write_reg(hw, M88E1000_PHY_SPEC_CTRL, phy_data); + + out: + return ret_val; + } + + /** +- * igb_phy_force_speed_duplex_setup - Configure forced PHY speed/duplex ++ * e1000_phy_force_speed_duplex_setup - Configure forced PHY speed/duplex + * @hw: pointer to the HW structure + * @phy_ctrl: pointer to current value of PHY_CONTROL + * +@@ -1002,17 +1196,18 @@ + * caller must write to the PHY_CONTROL register for these settings to + * take affect. + **/ +-static void igb_phy_force_speed_duplex_setup(struct e1000_hw *hw, +- u16 *phy_ctrl) ++void e1000_phy_force_speed_duplex_setup(struct e1000_hw *hw, u16 *phy_ctrl) + { + struct e1000_mac_info *mac = &hw->mac; + u32 ctrl; + ++ DEBUGFUNC("e1000_phy_force_speed_duplex_setup"); ++ + /* Turn off flow control when forcing speed/duplex */ +- hw->fc.type = e1000_fc_none; ++ hw->fc.current_mode = e1000_fc_none; + + /* Force speed/duplex on the mac */ +- ctrl = rd32(E1000_CTRL); ++ ctrl = E1000_READ_REG(hw, E1000_CTRL); + ctrl |= (E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX); + ctrl &= ~E1000_CTRL_SPD_SEL; + +@@ -1026,11 +1221,11 @@ + if (mac->forced_speed_duplex & E1000_ALL_HALF_DUPLEX) { + ctrl &= ~E1000_CTRL_FD; + *phy_ctrl &= ~MII_CR_FULL_DUPLEX; +- hw_dbg("Half Duplex\n"); ++ DEBUGOUT("Half Duplex\n"); + } else { + ctrl |= E1000_CTRL_FD; + *phy_ctrl |= MII_CR_FULL_DUPLEX; +- hw_dbg("Full Duplex\n"); ++ DEBUGOUT("Full Duplex\n"); + } + + /* Forcing 10mb or 100mb? */ +@@ -1038,21 +1233,21 @@ + ctrl |= E1000_CTRL_SPD_100; + *phy_ctrl |= MII_CR_SPEED_100; + *phy_ctrl &= ~(MII_CR_SPEED_1000 | MII_CR_SPEED_10); +- hw_dbg("Forcing 100mb\n"); ++ DEBUGOUT("Forcing 100mb\n"); + } else { + ctrl &= ~(E1000_CTRL_SPD_1000 | E1000_CTRL_SPD_100); + *phy_ctrl |= MII_CR_SPEED_10; + *phy_ctrl &= ~(MII_CR_SPEED_1000 | MII_CR_SPEED_100); +- hw_dbg("Forcing 10mb\n"); ++ DEBUGOUT("Forcing 10mb\n"); + } + +- igb_config_collision_dist(hw); ++ e1000_config_collision_dist_generic(hw); + +- wr32(E1000_CTRL, ctrl); ++ E1000_WRITE_REG(hw, E1000_CTRL, ctrl); + } + + /** +- * igb_set_d3_lplu_state - Sets low power link up state for D3 ++ * e1000_set_d3_lplu_state_generic - Sets low power link up state for D3 + * @hw: pointer to the HW structure + * @active: boolean used to enable/disable lplu + * +@@ -1065,22 +1260,25 @@ + * During driver activity, SmartSpeed should be enabled so performance is + * maintained. + **/ +-s32 igb_set_d3_lplu_state(struct e1000_hw *hw, bool active) ++s32 e1000_set_d3_lplu_state_generic(struct e1000_hw *hw, bool active) + { + struct e1000_phy_info *phy = &hw->phy; +- s32 ret_val; ++ s32 ret_val = E1000_SUCCESS; + u16 data; + +- ret_val = hw->phy.ops.read_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT, +- &data); ++ DEBUGFUNC("e1000_set_d3_lplu_state_generic"); ++ ++ if (!(hw->phy.ops.read_reg)) ++ goto out; ++ ++ ret_val = phy->ops.read_reg(hw, IGP02E1000_PHY_POWER_MGMT, &data); + if (ret_val) + goto out; + + if (!active) { + data &= ~IGP02E1000_PM_D3_LPLU; +- ret_val = hw->phy.ops.write_phy_reg(hw, +- IGP02E1000_PHY_POWER_MGMT, +- data); ++ ret_val = phy->ops.write_reg(hw, IGP02E1000_PHY_POWER_MGMT, ++ data); + if (ret_val) + goto out; + /* +@@ -1090,53 +1288,50 @@ + * SmartSpeed, so performance is maintained. + */ + if (phy->smart_speed == e1000_smart_speed_on) { +- ret_val = hw->phy.ops.read_phy_reg(hw, +- IGP01E1000_PHY_PORT_CONFIG, +- &data); ++ ret_val = phy->ops.read_reg(hw, ++ IGP01E1000_PHY_PORT_CONFIG, ++ &data); + if (ret_val) + goto out; + + data |= IGP01E1000_PSCFR_SMART_SPEED; +- ret_val = hw->phy.ops.write_phy_reg(hw, +- IGP01E1000_PHY_PORT_CONFIG, +- data); ++ ret_val = phy->ops.write_reg(hw, ++ IGP01E1000_PHY_PORT_CONFIG, ++ data); + if (ret_val) + goto out; + } else if (phy->smart_speed == e1000_smart_speed_off) { +- ret_val = hw->phy.ops.read_phy_reg(hw, +- IGP01E1000_PHY_PORT_CONFIG, +- &data); ++ ret_val = phy->ops.read_reg(hw, ++ IGP01E1000_PHY_PORT_CONFIG, ++ &data); + if (ret_val) + goto out; + + data &= ~IGP01E1000_PSCFR_SMART_SPEED; +- ret_val = hw->phy.ops.write_phy_reg(hw, +- IGP01E1000_PHY_PORT_CONFIG, +- data); ++ ret_val = phy->ops.write_reg(hw, ++ IGP01E1000_PHY_PORT_CONFIG, ++ data); + if (ret_val) + goto out; + } + } else if ((phy->autoneg_advertised == E1000_ALL_SPEED_DUPLEX) || +- (phy->autoneg_advertised == E1000_ALL_NOT_GIG) || +- (phy->autoneg_advertised == E1000_ALL_10_SPEED)) { ++ (phy->autoneg_advertised == E1000_ALL_NOT_GIG) || ++ (phy->autoneg_advertised == E1000_ALL_10_SPEED)) { + data |= IGP02E1000_PM_D3_LPLU; +- ret_val = hw->phy.ops.write_phy_reg(hw, +- IGP02E1000_PHY_POWER_MGMT, +- data); ++ ret_val = phy->ops.write_reg(hw, IGP02E1000_PHY_POWER_MGMT, ++ data); + if (ret_val) + goto out; + + /* When LPLU is enabled, we should disable SmartSpeed */ +- ret_val = hw->phy.ops.read_phy_reg(hw, +- IGP01E1000_PHY_PORT_CONFIG, +- &data); ++ ret_val = phy->ops.read_reg(hw, IGP01E1000_PHY_PORT_CONFIG, ++ &data); + if (ret_val) + goto out; + + data &= ~IGP01E1000_PSCFR_SMART_SPEED; +- ret_val = hw->phy.ops.write_phy_reg(hw, +- IGP01E1000_PHY_PORT_CONFIG, +- data); ++ ret_val = phy->ops.write_reg(hw, IGP01E1000_PHY_PORT_CONFIG, ++ data); + } + + out: +@@ -1144,18 +1339,20 @@ + } + + /** +- * igb_check_downshift - Checks whether a downshift in speed occured ++ * e1000_check_downshift_generic - Checks whether a downshift in speed occurred + * @hw: pointer to the HW structure + * + * Success returns 0, Failure returns 1 + * + * A downshift is detected by querying the PHY link health. + **/ +-s32 igb_check_downshift(struct e1000_hw *hw) ++s32 e1000_check_downshift_generic(struct e1000_hw *hw) + { + struct e1000_phy_info *phy = &hw->phy; + s32 ret_val; + u16 phy_data, offset, mask; ++ ++ DEBUGFUNC("e1000_check_downshift_generic"); + + switch (phy->type) { + case e1000_phy_m88: +@@ -1172,11 +1369,11 @@ + default: + /* speed downshift not supported */ + phy->speed_downgraded = false; +- ret_val = 0; ++ ret_val = E1000_SUCCESS; + goto out; + } + +- ret_val = hw->phy.ops.read_phy_reg(hw, offset, &phy_data); ++ ret_val = phy->ops.read_reg(hw, offset, &phy_data); + + if (!ret_val) + phy->speed_downgraded = (phy_data & mask) ? true : false; +@@ -1186,31 +1383,33 @@ + } + + /** +- * igb_check_polarity_m88 - Checks the polarity. ++ * e1000_check_polarity_m88 - Checks the polarity. + * @hw: pointer to the HW structure + * + * Success returns 0, Failure returns -E1000_ERR_PHY (-2) + * + * Polarity is determined based on the PHY specific status register. + **/ +-static s32 igb_check_polarity_m88(struct e1000_hw *hw) ++s32 e1000_check_polarity_m88(struct e1000_hw *hw) + { + struct e1000_phy_info *phy = &hw->phy; + s32 ret_val; + u16 data; + +- ret_val = hw->phy.ops.read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS, &data); ++ DEBUGFUNC("e1000_check_polarity_m88"); ++ ++ ret_val = phy->ops.read_reg(hw, M88E1000_PHY_SPEC_STATUS, &data); + + if (!ret_val) + phy->cable_polarity = (data & M88E1000_PSSR_REV_POLARITY) +- ? e1000_rev_polarity_reversed +- : e1000_rev_polarity_normal; ++ ? e1000_rev_polarity_reversed ++ : e1000_rev_polarity_normal; + + return ret_val; + } + + /** +- * igb_check_polarity_igp - Checks the polarity. ++ * e1000_check_polarity_igp - Checks the polarity. + * @hw: pointer to the HW structure + * + * Success returns 0, Failure returns -E1000_ERR_PHY (-2) +@@ -1218,18 +1417,19 @@ + * Polarity is determined based on the PHY port status register, and the + * current speed (since there is no polarity at 100Mbps). + **/ +-static s32 igb_check_polarity_igp(struct e1000_hw *hw) ++s32 e1000_check_polarity_igp(struct e1000_hw *hw) + { + struct e1000_phy_info *phy = &hw->phy; + s32 ret_val; + u16 data, offset, mask; + ++ DEBUGFUNC("e1000_check_polarity_igp"); ++ + /* + * Polarity is determined based on the speed of + * our connection. + */ +- ret_val = hw->phy.ops.read_phy_reg(hw, IGP01E1000_PHY_PORT_STATUS, +- &data); ++ ret_val = phy->ops.read_reg(hw, IGP01E1000_PHY_PORT_STATUS, &data); + if (ret_val) + goto out; + +@@ -1246,40 +1446,45 @@ + mask = IGP01E1000_PSSR_POLARITY_REVERSED; + } + +- ret_val = hw->phy.ops.read_phy_reg(hw, offset, &data); ++ ret_val = phy->ops.read_reg(hw, offset, &data); + + if (!ret_val) + phy->cable_polarity = (data & mask) +- ? e1000_rev_polarity_reversed +- : e1000_rev_polarity_normal; ++ ? e1000_rev_polarity_reversed ++ : e1000_rev_polarity_normal; + + out: + return ret_val; + } + + /** +- * igb_wait_autoneg - Wait for auto-neg compeletion ++ * e1000_wait_autoneg_generic - Wait for auto-neg completion + * @hw: pointer to the HW structure + * + * Waits for auto-negotiation to complete or for the auto-negotiation time + * limit to expire, which ever happens first. + **/ +-static s32 igb_wait_autoneg(struct e1000_hw *hw) ++s32 e1000_wait_autoneg_generic(struct e1000_hw *hw) + { +- s32 ret_val = 0; ++ s32 ret_val = E1000_SUCCESS; + u16 i, phy_status; ++ ++ DEBUGFUNC("e1000_wait_autoneg_generic"); ++ ++ if (!(hw->phy.ops.read_reg)) ++ return E1000_SUCCESS; + + /* Break after autoneg completes or PHY_AUTO_NEG_LIMIT expires. */ + for (i = PHY_AUTO_NEG_LIMIT; i > 0; i--) { +- ret_val = hw->phy.ops.read_phy_reg(hw, PHY_STATUS, &phy_status); ++ ret_val = hw->phy.ops.read_reg(hw, PHY_STATUS, &phy_status); + if (ret_val) + break; +- ret_val = hw->phy.ops.read_phy_reg(hw, PHY_STATUS, &phy_status); ++ ret_val = hw->phy.ops.read_reg(hw, PHY_STATUS, &phy_status); + if (ret_val) + break; + if (phy_status & MII_SR_AUTONEG_COMPLETE) + break; +- msleep(100); ++ msec_delay(100); + } + + /* +@@ -1290,7 +1495,7 @@ + } + + /** +- * igb_phy_has_link - Polls PHY for link ++ * e1000_phy_has_link_generic - Polls PHY for link + * @hw: pointer to the HW structure + * @iterations: number of times to poll for link + * @usec_interval: delay between polling attempts +@@ -1298,11 +1503,16 @@ + * + * Polls the PHY status register for link, 'iterations' number of times. + **/ +-s32 igb_phy_has_link(struct e1000_hw *hw, u32 iterations, +- u32 usec_interval, bool *success) ++s32 e1000_phy_has_link_generic(struct e1000_hw *hw, u32 iterations, ++ u32 usec_interval, bool *success) + { +- s32 ret_val = 0; ++ s32 ret_val = E1000_SUCCESS; + u16 i, phy_status; ++ ++ DEBUGFUNC("e1000_phy_has_link_generic"); ++ ++ if (!(hw->phy.ops.read_reg)) ++ return E1000_SUCCESS; + + for (i = 0; i < iterations; i++) { + /* +@@ -1310,18 +1520,18 @@ + * twice due to the link bit being sticky. No harm doing + * it across the board. + */ +- ret_val = hw->phy.ops.read_phy_reg(hw, PHY_STATUS, &phy_status); ++ ret_val = hw->phy.ops.read_reg(hw, PHY_STATUS, &phy_status); + if (ret_val) + break; +- ret_val = hw->phy.ops.read_phy_reg(hw, PHY_STATUS, &phy_status); ++ ret_val = hw->phy.ops.read_reg(hw, PHY_STATUS, &phy_status); + if (ret_val) + break; + if (phy_status & MII_SR_LINK_STATUS) + break; + if (usec_interval >= 1000) +- mdelay(usec_interval/1000); ++ msec_delay_irq(usec_interval/1000); + else +- udelay(usec_interval); ++ usec_delay(usec_interval); + } + + *success = (i < iterations) ? true : false; +@@ -1330,7 +1540,7 @@ + } + + /** +- * igb_get_cable_length_m88 - Determine cable length for m88 PHY ++ * e1000_get_cable_length_m88 - Determine cable length for m88 PHY + * @hw: pointer to the HW structure + * + * Reads the PHY specific status register to retrieve the cable length +@@ -1344,19 +1554,25 @@ + * 3 110 - 140 meters + * 4 > 140 meters + **/ +-s32 igb_get_cable_length_m88(struct e1000_hw *hw) ++s32 e1000_get_cable_length_m88(struct e1000_hw *hw) + { + struct e1000_phy_info *phy = &hw->phy; + s32 ret_val; + u16 phy_data, index; + +- ret_val = hw->phy.ops.read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS, +- &phy_data); ++ DEBUGFUNC("e1000_get_cable_length_m88"); ++ ++ ret_val = phy->ops.read_reg(hw, M88E1000_PHY_SPEC_STATUS, &phy_data); + if (ret_val) + goto out; + + index = (phy_data & M88E1000_PSSR_CABLE_LENGTH) >> +- M88E1000_PSSR_CABLE_LENGTH_SHIFT; ++ M88E1000_PSSR_CABLE_LENGTH_SHIFT; ++ if (index >= M88E1000_CABLE_LENGTH_TABLE_SIZE + 1) { ++ ret_val = E1000_ERR_PHY; ++ goto out; ++ } ++ + phy->min_cable_length = e1000_m88_cable_length_table[index]; + phy->max_cable_length = e1000_m88_cable_length_table[index+1]; + +@@ -1367,44 +1583,45 @@ + } + + /** +- * igb_get_cable_length_igp_2 - Determine cable length for igp2 PHY ++ * e1000_get_cable_length_igp_2 - Determine cable length for igp2 PHY + * @hw: pointer to the HW structure + * + * The automatic gain control (agc) normalizes the amplitude of the + * received signal, adjusting for the attenuation produced by the +- * cable. By reading the AGC registers, which reperesent the +- * cobination of course and fine gain value, the value can be put ++ * cable. By reading the AGC registers, which represent the ++ * combination of coarse and fine gain value, the value can be put + * into a lookup table to obtain the approximate cable length + * for each channel. + **/ +-s32 igb_get_cable_length_igp_2(struct e1000_hw *hw) ++s32 e1000_get_cable_length_igp_2(struct e1000_hw *hw) + { + struct e1000_phy_info *phy = &hw->phy; +- s32 ret_val = 0; ++ s32 ret_val = E1000_SUCCESS; + u16 phy_data, i, agc_value = 0; + u16 cur_agc_index, max_agc_index = 0; + u16 min_agc_index = IGP02E1000_CABLE_LENGTH_TABLE_SIZE - 1; + u16 agc_reg_array[IGP02E1000_PHY_CHANNEL_NUM] = +- {IGP02E1000_PHY_AGC_A, +- IGP02E1000_PHY_AGC_B, +- IGP02E1000_PHY_AGC_C, +- IGP02E1000_PHY_AGC_D}; ++ {IGP02E1000_PHY_AGC_A, ++ IGP02E1000_PHY_AGC_B, ++ IGP02E1000_PHY_AGC_C, ++ IGP02E1000_PHY_AGC_D}; ++ ++ DEBUGFUNC("e1000_get_cable_length_igp_2"); + + /* Read the AGC registers for all channels */ + for (i = 0; i < IGP02E1000_PHY_CHANNEL_NUM; i++) { +- ret_val = hw->phy.ops.read_phy_reg(hw, agc_reg_array[i], +- &phy_data); ++ ret_val = phy->ops.read_reg(hw, agc_reg_array[i], &phy_data); + if (ret_val) + goto out; + + /* + * Getting bits 15:9, which represent the combination of +- * course and fine gain values. The result is a number ++ * coarse and fine gain values. The result is a number + * that can be put into the lookup table to obtain the + * approximate cable length. + */ + cur_agc_index = (phy_data >> IGP02E1000_AGC_LENGTH_SHIFT) & +- IGP02E1000_AGC_LENGTH_MASK; ++ IGP02E1000_AGC_LENGTH_MASK; + + /* Array index bound check. */ + if ((cur_agc_index >= IGP02E1000_CABLE_LENGTH_TABLE_SIZE) || +@@ -1425,12 +1642,12 @@ + } + + agc_value -= (e1000_igp_2_cable_length_table[min_agc_index] + +- e1000_igp_2_cable_length_table[max_agc_index]); ++ e1000_igp_2_cable_length_table[max_agc_index]); + agc_value /= (IGP02E1000_PHY_CHANNEL_NUM - 2); + + /* Calculate cable length with the error range of +/- 10 meters. */ + phy->min_cable_length = ((agc_value - IGP02E1000_AGC_RANGE) > 0) ? +- (agc_value - IGP02E1000_AGC_RANGE) : 0; ++ (agc_value - IGP02E1000_AGC_RANGE) : 0; + phy->max_cable_length = agc_value + IGP02E1000_AGC_RANGE; + + phy->cable_length = (phy->min_cable_length + phy->max_cable_length) / 2; +@@ -1440,7 +1657,7 @@ + } + + /** +- * igb_get_phy_info_m88 - Retrieve PHY information ++ * e1000_get_phy_info_m88 - Retrieve PHY information + * @hw: pointer to the HW structure + * + * Valid for only copper links. Read the PHY status register (sticky read) +@@ -1449,44 +1666,43 @@ + * special status register to determine MDI/MDIx and current speed. If + * speed is 1000, then determine cable length, local and remote receiver. + **/ +-s32 igb_get_phy_info_m88(struct e1000_hw *hw) ++s32 e1000_get_phy_info_m88(struct e1000_hw *hw) + { + struct e1000_phy_info *phy = &hw->phy; + s32 ret_val; + u16 phy_data; + bool link; + ++ DEBUGFUNC("e1000_get_phy_info_m88"); ++ + if (hw->phy.media_type != e1000_media_type_copper) { +- hw_dbg("Phy info is only valid for copper media\n"); ++ DEBUGOUT("Phy info is only valid for copper media\n"); + ret_val = -E1000_ERR_CONFIG; + goto out; + } + +- ret_val = igb_phy_has_link(hw, 1, 0, &link); ++ ret_val = e1000_phy_has_link_generic(hw, 1, 0, &link); + if (ret_val) + goto out; + + if (!link) { +- hw_dbg("Phy info is only valid if link is up\n"); ++ DEBUGOUT("Phy info is only valid if link is up\n"); + ret_val = -E1000_ERR_CONFIG; + goto out; + } + +- ret_val = hw->phy.ops.read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, +- &phy_data); ++ ret_val = phy->ops.read_reg(hw, M88E1000_PHY_SPEC_CTRL, &phy_data); + if (ret_val) + goto out; + + phy->polarity_correction = (phy_data & M88E1000_PSCR_POLARITY_REVERSAL) +- ? true +- : false; ++ ? true : false; + +- ret_val = igb_check_polarity_m88(hw); ++ ret_val = e1000_check_polarity_m88(hw); + if (ret_val) + goto out; + +- ret_val = hw->phy.ops.read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS, +- &phy_data); ++ ret_val = phy->ops.read_reg(hw, M88E1000_PHY_SPEC_STATUS, &phy_data); + if (ret_val) + goto out; + +@@ -1497,18 +1713,17 @@ + if (ret_val) + goto out; + +- ret_val = hw->phy.ops.read_phy_reg(hw, PHY_1000T_STATUS, +- &phy_data); ++ ret_val = phy->ops.read_reg(hw, PHY_1000T_STATUS, &phy_data); + if (ret_val) + goto out; + + phy->local_rx = (phy_data & SR_1000T_LOCAL_RX_STATUS) +- ? e1000_1000t_rx_status_ok +- : e1000_1000t_rx_status_not_ok; ++ ? e1000_1000t_rx_status_ok ++ : e1000_1000t_rx_status_not_ok; + + phy->remote_rx = (phy_data & SR_1000T_REMOTE_RX_STATUS) +- ? e1000_1000t_rx_status_ok +- : e1000_1000t_rx_status_not_ok; ++ ? e1000_1000t_rx_status_ok ++ : e1000_1000t_rx_status_not_ok; + } else { + /* Set values to "undefined" */ + phy->cable_length = E1000_CABLE_LENGTH_UNDEFINED; +@@ -1521,7 +1736,7 @@ + } + + /** +- * igb_get_phy_info_igp - Retrieve igp PHY information ++ * e1000_get_phy_info_igp - Retrieve igp PHY information + * @hw: pointer to the HW structure + * + * Read PHY status to determine if link is up. If link is up, then +@@ -1529,31 +1744,32 @@ + * PHY port status to determine MDI/MDIx and speed. Based on the speed, + * determine on the cable length, local and remote receiver. + **/ +-s32 igb_get_phy_info_igp(struct e1000_hw *hw) ++s32 e1000_get_phy_info_igp(struct e1000_hw *hw) + { + struct e1000_phy_info *phy = &hw->phy; + s32 ret_val; + u16 data; + bool link; + +- ret_val = igb_phy_has_link(hw, 1, 0, &link); ++ DEBUGFUNC("e1000_get_phy_info_igp"); ++ ++ ret_val = e1000_phy_has_link_generic(hw, 1, 0, &link); + if (ret_val) + goto out; + + if (!link) { +- hw_dbg("Phy info is only valid if link is up\n"); ++ DEBUGOUT("Phy info is only valid if link is up\n"); + ret_val = -E1000_ERR_CONFIG; + goto out; + } + + phy->polarity_correction = true; + +- ret_val = igb_check_polarity_igp(hw); ++ ret_val = e1000_check_polarity_igp(hw); + if (ret_val) + goto out; + +- ret_val = hw->phy.ops.read_phy_reg(hw, IGP01E1000_PHY_PORT_STATUS, +- &data); ++ ret_val = phy->ops.read_reg(hw, IGP01E1000_PHY_PORT_STATUS, &data); + if (ret_val) + goto out; + +@@ -1565,18 +1781,17 @@ + if (ret_val) + goto out; + +- ret_val = hw->phy.ops.read_phy_reg(hw, PHY_1000T_STATUS, +- &data); ++ ret_val = phy->ops.read_reg(hw, PHY_1000T_STATUS, &data); + if (ret_val) + goto out; + + phy->local_rx = (data & SR_1000T_LOCAL_RX_STATUS) +- ? e1000_1000t_rx_status_ok +- : e1000_1000t_rx_status_not_ok; ++ ? e1000_1000t_rx_status_ok ++ : e1000_1000t_rx_status_not_ok; + + phy->remote_rx = (data & SR_1000T_REMOTE_RX_STATUS) +- ? e1000_1000t_rx_status_ok +- : e1000_1000t_rx_status_not_ok; ++ ? e1000_1000t_rx_status_ok ++ : e1000_1000t_rx_status_not_ok; + } else { + phy->cable_length = E1000_CABLE_LENGTH_UNDEFINED; + phy->local_rx = e1000_1000t_rx_status_undefined; +@@ -1588,218 +1803,297 @@ + } + + /** +- * igb_phy_sw_reset - PHY software reset ++ * e1000_phy_sw_reset_generic - PHY software reset + * @hw: pointer to the HW structure + * + * Does a software reset of the PHY by reading the PHY control register and + * setting/write the control register reset bit to the PHY. + **/ +-s32 igb_phy_sw_reset(struct e1000_hw *hw) ++s32 e1000_phy_sw_reset_generic(struct e1000_hw *hw) + { +- s32 ret_val; ++ s32 ret_val = E1000_SUCCESS; + u16 phy_ctrl; + +- ret_val = hw->phy.ops.read_phy_reg(hw, PHY_CONTROL, &phy_ctrl); ++ DEBUGFUNC("e1000_phy_sw_reset_generic"); ++ ++ if (!(hw->phy.ops.read_reg)) ++ goto out; ++ ++ ret_val = hw->phy.ops.read_reg(hw, PHY_CONTROL, &phy_ctrl); + if (ret_val) + goto out; + + phy_ctrl |= MII_CR_RESET; +- ret_val = hw->phy.ops.write_phy_reg(hw, PHY_CONTROL, phy_ctrl); ++ ret_val = hw->phy.ops.write_reg(hw, PHY_CONTROL, phy_ctrl); + if (ret_val) + goto out; + +- udelay(1); ++ usec_delay(1); + + out: + return ret_val; + } + + /** +- * igb_phy_hw_reset - PHY hardware reset ++ * e1000_phy_hw_reset_generic - PHY hardware reset + * @hw: pointer to the HW structure + * + * Verify the reset block is not blocking us from resetting. Acquire + * semaphore (if necessary) and read/set/write the device control reset + * bit in the PHY. Wait the appropriate delay time for the device to +- * reset and relase the semaphore (if necessary). ++ * reset and release the semaphore (if necessary). + **/ +-s32 igb_phy_hw_reset(struct e1000_hw *hw) ++s32 e1000_phy_hw_reset_generic(struct e1000_hw *hw) + { + struct e1000_phy_info *phy = &hw->phy; +- s32 ret_val; ++ s32 ret_val = E1000_SUCCESS; + u32 ctrl; + +- ret_val = igb_check_reset_block(hw); ++ DEBUGFUNC("e1000_phy_hw_reset_generic"); ++ ++ ret_val = phy->ops.check_reset_block(hw); + if (ret_val) { +- ret_val = 0; ++ ret_val = E1000_SUCCESS; + goto out; + } + +- ret_val = igb_acquire_phy(hw); ++ ret_val = phy->ops.acquire(hw); + if (ret_val) + goto out; + +- ctrl = rd32(E1000_CTRL); +- wr32(E1000_CTRL, ctrl | E1000_CTRL_PHY_RST); +- wrfl(); ++ ctrl = E1000_READ_REG(hw, E1000_CTRL); ++ E1000_WRITE_REG(hw, E1000_CTRL, ctrl | E1000_CTRL_PHY_RST); ++ E1000_WRITE_FLUSH(hw); + +- udelay(phy->reset_delay_us); ++ usec_delay(phy->reset_delay_us); + +- wr32(E1000_CTRL, ctrl); +- wrfl(); ++ E1000_WRITE_REG(hw, E1000_CTRL, ctrl); ++ E1000_WRITE_FLUSH(hw); + +- udelay(150); ++ usec_delay(150); + +- igb_release_phy(hw); ++ phy->ops.release(hw); + +- ret_val = igb_get_phy_cfg_done(hw); ++ ret_val = phy->ops.get_cfg_done(hw); + + out: + return ret_val; + } + +-/* Internal function pointers */ +- + /** +- * igb_get_phy_cfg_done - Generic PHY configuration done ++ * e1000_get_cfg_done_generic - Generic configuration done + * @hw: pointer to the HW structure + * +- * Return success if silicon family did not implement a family specific +- * get_cfg_done function. ++ * Generic function to wait 10 milli-seconds for configuration to complete ++ * and return success. + **/ +-static s32 igb_get_phy_cfg_done(struct e1000_hw *hw) ++s32 e1000_get_cfg_done_generic(struct e1000_hw *hw) + { +- if (hw->phy.ops.get_cfg_done) +- return hw->phy.ops.get_cfg_done(hw); ++ DEBUGFUNC("e1000_get_cfg_done_generic"); + +- return 0; ++ msec_delay_irq(10); ++ ++ return E1000_SUCCESS; + } + + /** +- * igb_release_phy - Generic release PHY +- * @hw: pointer to the HW structure +- * +- * Return if silicon family does not require a semaphore when accessing the +- * PHY. +- **/ +-static void igb_release_phy(struct e1000_hw *hw) +-{ +- if (hw->phy.ops.release_phy) +- hw->phy.ops.release_phy(hw); +-} +- +-/** +- * igb_acquire_phy - Generic acquire PHY +- * @hw: pointer to the HW structure +- * +- * Return success if silicon family does not require a semaphore when +- * accessing the PHY. +- **/ +-static s32 igb_acquire_phy(struct e1000_hw *hw) +-{ +- if (hw->phy.ops.acquire_phy) +- return hw->phy.ops.acquire_phy(hw); +- +- return 0; +-} +- +-/** +- * igb_phy_force_speed_duplex - Generic force PHY speed/duplex +- * @hw: pointer to the HW structure +- * +- * When the silicon family has not implemented a forced speed/duplex +- * function for the PHY, simply return 0. +- **/ +-s32 igb_phy_force_speed_duplex(struct e1000_hw *hw) +-{ +- if (hw->phy.ops.force_speed_duplex) +- return hw->phy.ops.force_speed_duplex(hw); +- +- return 0; +-} +- +-/** +- * igb_phy_init_script_igp3 - Inits the IGP3 PHY ++ * e1000_phy_init_script_igp3 - Inits the IGP3 PHY + * @hw: pointer to the HW structure + * + * Initializes a Intel Gigabit PHY3 when an EEPROM is not present. + **/ +-s32 igb_phy_init_script_igp3(struct e1000_hw *hw) ++s32 e1000_phy_init_script_igp3(struct e1000_hw *hw) + { +- hw_dbg("Running IGP 3 PHY init script\n"); ++ DEBUGOUT("Running IGP 3 PHY init script\n"); + + /* PHY init IGP 3 */ + /* Enable rise/fall, 10-mode work in class-A */ +- hw->phy.ops.write_phy_reg(hw, 0x2F5B, 0x9018); ++ hw->phy.ops.write_reg(hw, 0x2F5B, 0x9018); + /* Remove all caps from Replica path filter */ +- hw->phy.ops.write_phy_reg(hw, 0x2F52, 0x0000); ++ hw->phy.ops.write_reg(hw, 0x2F52, 0x0000); + /* Bias trimming for ADC, AFE and Driver (Default) */ +- hw->phy.ops.write_phy_reg(hw, 0x2FB1, 0x8B24); ++ hw->phy.ops.write_reg(hw, 0x2FB1, 0x8B24); + /* Increase Hybrid poly bias */ +- hw->phy.ops.write_phy_reg(hw, 0x2FB2, 0xF8F0); +- /* Add 4% to TX amplitude in Giga mode */ +- hw->phy.ops.write_phy_reg(hw, 0x2010, 0x10B0); ++ hw->phy.ops.write_reg(hw, 0x2FB2, 0xF8F0); ++ /* Add 4% to Tx amplitude in Gig mode */ ++ hw->phy.ops.write_reg(hw, 0x2010, 0x10B0); + /* Disable trimming (TTT) */ +- hw->phy.ops.write_phy_reg(hw, 0x2011, 0x0000); ++ hw->phy.ops.write_reg(hw, 0x2011, 0x0000); + /* Poly DC correction to 94.6% + 2% for all channels */ +- hw->phy.ops.write_phy_reg(hw, 0x20DD, 0x249A); ++ hw->phy.ops.write_reg(hw, 0x20DD, 0x249A); + /* ABS DC correction to 95.9% */ +- hw->phy.ops.write_phy_reg(hw, 0x20DE, 0x00D3); ++ hw->phy.ops.write_reg(hw, 0x20DE, 0x00D3); + /* BG temp curve trim */ +- hw->phy.ops.write_phy_reg(hw, 0x28B4, 0x04CE); ++ hw->phy.ops.write_reg(hw, 0x28B4, 0x04CE); + /* Increasing ADC OPAMP stage 1 currents to max */ +- hw->phy.ops.write_phy_reg(hw, 0x2F70, 0x29E4); ++ hw->phy.ops.write_reg(hw, 0x2F70, 0x29E4); + /* Force 1000 ( required for enabling PHY regs configuration) */ +- hw->phy.ops.write_phy_reg(hw, 0x0000, 0x0140); ++ hw->phy.ops.write_reg(hw, 0x0000, 0x0140); + /* Set upd_freq to 6 */ +- hw->phy.ops.write_phy_reg(hw, 0x1F30, 0x1606); ++ hw->phy.ops.write_reg(hw, 0x1F30, 0x1606); + /* Disable NPDFE */ +- hw->phy.ops.write_phy_reg(hw, 0x1F31, 0xB814); ++ hw->phy.ops.write_reg(hw, 0x1F31, 0xB814); + /* Disable adaptive fixed FFE (Default) */ +- hw->phy.ops.write_phy_reg(hw, 0x1F35, 0x002A); ++ hw->phy.ops.write_reg(hw, 0x1F35, 0x002A); + /* Enable FFE hysteresis */ +- hw->phy.ops.write_phy_reg(hw, 0x1F3E, 0x0067); ++ hw->phy.ops.write_reg(hw, 0x1F3E, 0x0067); + /* Fixed FFE for short cable lengths */ +- hw->phy.ops.write_phy_reg(hw, 0x1F54, 0x0065); ++ hw->phy.ops.write_reg(hw, 0x1F54, 0x0065); + /* Fixed FFE for medium cable lengths */ +- hw->phy.ops.write_phy_reg(hw, 0x1F55, 0x002A); ++ hw->phy.ops.write_reg(hw, 0x1F55, 0x002A); + /* Fixed FFE for long cable lengths */ +- hw->phy.ops.write_phy_reg(hw, 0x1F56, 0x002A); ++ hw->phy.ops.write_reg(hw, 0x1F56, 0x002A); + /* Enable Adaptive Clip Threshold */ +- hw->phy.ops.write_phy_reg(hw, 0x1F72, 0x3FB0); ++ hw->phy.ops.write_reg(hw, 0x1F72, 0x3FB0); + /* AHT reset limit to 1 */ +- hw->phy.ops.write_phy_reg(hw, 0x1F76, 0xC0FF); ++ hw->phy.ops.write_reg(hw, 0x1F76, 0xC0FF); + /* Set AHT master delay to 127 msec */ +- hw->phy.ops.write_phy_reg(hw, 0x1F77, 0x1DEC); ++ hw->phy.ops.write_reg(hw, 0x1F77, 0x1DEC); + /* Set scan bits for AHT */ +- hw->phy.ops.write_phy_reg(hw, 0x1F78, 0xF9EF); ++ hw->phy.ops.write_reg(hw, 0x1F78, 0xF9EF); + /* Set AHT Preset bits */ +- hw->phy.ops.write_phy_reg(hw, 0x1F79, 0x0210); ++ hw->phy.ops.write_reg(hw, 0x1F79, 0x0210); + /* Change integ_factor of channel A to 3 */ +- hw->phy.ops.write_phy_reg(hw, 0x1895, 0x0003); ++ hw->phy.ops.write_reg(hw, 0x1895, 0x0003); + /* Change prop_factor of channels BCD to 8 */ +- hw->phy.ops.write_phy_reg(hw, 0x1796, 0x0008); ++ hw->phy.ops.write_reg(hw, 0x1796, 0x0008); + /* Change cg_icount + enable integbp for channels BCD */ +- hw->phy.ops.write_phy_reg(hw, 0x1798, 0xD008); ++ hw->phy.ops.write_reg(hw, 0x1798, 0xD008); + /* + * Change cg_icount + enable integbp + change prop_factor_master + * to 8 for channel A + */ +- hw->phy.ops.write_phy_reg(hw, 0x1898, 0xD918); ++ hw->phy.ops.write_reg(hw, 0x1898, 0xD918); + /* Disable AHT in Slave mode on channel A */ +- hw->phy.ops.write_phy_reg(hw, 0x187A, 0x0800); ++ hw->phy.ops.write_reg(hw, 0x187A, 0x0800); + /* + * Enable LPLU and disable AN to 1000 in non-D0a states, + * Enable SPD+B2B + */ +- hw->phy.ops.write_phy_reg(hw, 0x0019, 0x008D); ++ hw->phy.ops.write_reg(hw, 0x0019, 0x008D); + /* Enable restart AN on an1000_dis change */ +- hw->phy.ops.write_phy_reg(hw, 0x001B, 0x2080); ++ hw->phy.ops.write_reg(hw, 0x001B, 0x2080); + /* Enable wh_fifo read clock in 10/100 modes */ +- hw->phy.ops.write_phy_reg(hw, 0x0014, 0x0045); ++ hw->phy.ops.write_reg(hw, 0x0014, 0x0045); + /* Restart AN, Speed selection is 1000 */ +- hw->phy.ops.write_phy_reg(hw, 0x0000, 0x1340); ++ hw->phy.ops.write_reg(hw, 0x0000, 0x1340); + +- return 0; ++ return E1000_SUCCESS; + } + ++/** ++ * e1000_get_phy_type_from_id - Get PHY type from id ++ * @phy_id: phy_id read from the phy ++ * ++ * Returns the phy type from the id. ++ **/ ++enum e1000_phy_type e1000_get_phy_type_from_id(u32 phy_id) ++{ ++ enum e1000_phy_type phy_type = e1000_phy_unknown; ++ ++ switch (phy_id) { ++ case M88E1000_I_PHY_ID: ++ case M88E1000_E_PHY_ID: ++ case M88E1111_I_PHY_ID: ++ case M88E1011_I_PHY_ID: ++ phy_type = e1000_phy_m88; ++ break; ++ case IGP01E1000_I_PHY_ID: /* IGP 1 & 2 share this */ ++ phy_type = e1000_phy_igp_2; ++ break; ++ case GG82563_E_PHY_ID: ++ phy_type = e1000_phy_gg82563; ++ break; ++ case IGP03E1000_E_PHY_ID: ++ phy_type = e1000_phy_igp_3; ++ break; ++ case IFE_E_PHY_ID: ++ case IFE_PLUS_E_PHY_ID: ++ case IFE_C_E_PHY_ID: ++ phy_type = e1000_phy_ife; ++ break; ++ default: ++ phy_type = e1000_phy_unknown; ++ break; ++ } ++ return phy_type; ++} ++ ++/** ++ * e1000_determine_phy_address - Determines PHY address. ++ * @hw: pointer to the HW structure ++ * ++ * This uses a trial and error method to loop through possible PHY ++ * addresses. It tests each by reading the PHY ID registers and ++ * checking for a match. ++ **/ ++s32 e1000_determine_phy_address(struct e1000_hw *hw) ++{ ++ s32 ret_val = -E1000_ERR_PHY_TYPE; ++ u32 phy_addr = 0; ++ u32 i; ++ enum e1000_phy_type phy_type = e1000_phy_unknown; ++ ++ hw->phy.id = phy_type; ++ ++ for (phy_addr = 0; phy_addr < E1000_MAX_PHY_ADDR; phy_addr++) { ++ hw->phy.addr = phy_addr; ++ i = 0; ++ ++ do { ++ e1000_get_phy_id(hw); ++ phy_type = e1000_get_phy_type_from_id(hw->phy.id); ++ ++ /* ++ * If phy_type is valid, break - we found our ++ * PHY address ++ */ ++ if (phy_type != e1000_phy_unknown) { ++ ret_val = E1000_SUCCESS; ++ goto out; ++ } ++ msec_delay(1); ++ i++; ++ } while (i < 10); ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * e1000_power_up_phy_copper - Restore copper link in case of PHY power down ++ * @hw: pointer to the HW structure ++ * ++ * In the case of a PHY power down to save power, or to turn off link during a ++ * driver unload, or wake on lan is not enabled, restore the link to previous ++ * settings. ++ **/ ++void e1000_power_up_phy_copper(struct e1000_hw *hw) ++{ ++ u16 mii_reg = 0; ++ ++ /* The PHY will retain its settings across a power down/up cycle */ ++ hw->phy.ops.read_reg(hw, PHY_CONTROL, &mii_reg); ++ mii_reg &= ~MII_CR_POWER_DOWN; ++ hw->phy.ops.write_reg(hw, PHY_CONTROL, mii_reg); ++} ++ ++/** ++ * e1000_power_down_phy_copper - Restore copper link in case of PHY power down ++ * @hw: pointer to the HW structure ++ * ++ * In the case of a PHY power down to save power, or to turn off link during a ++ * driver unload, or wake on lan is not enabled, restore the link to previous ++ * settings. ++ **/ ++void e1000_power_down_phy_copper(struct e1000_hw *hw) ++{ ++ u16 mii_reg = 0; ++ ++ /* The PHY will retain its settings across a power down/up cycle */ ++ hw->phy.ops.read_reg(hw, PHY_CONTROL, &mii_reg); ++ mii_reg |= MII_CR_POWER_DOWN; ++ hw->phy.ops.write_reg(hw, PHY_CONTROL, mii_reg); ++ msec_delay(1); ++} +diff -r f5806398a14e drivers/net/igb/e1000_phy.h +--- a/drivers/net/igb/e1000_phy.h Mon Jun 15 11:45:45 2009 +0100 ++++ b/drivers/net/igb/e1000_phy.h Mon Jun 15 11:59:49 2009 +0100 +@@ -1,7 +1,7 @@ + /******************************************************************************* + + Intel(R) Gigabit Ethernet Linux driver +- Copyright(c) 2007 Intel Corporation. ++ Copyright(c) 2007-2009 Intel Corporation. + + This program is free software; you can redistribute it and/or modify it + under the terms and conditions of the GNU General Public License, +@@ -28,71 +28,126 @@ + #ifndef _E1000_PHY_H_ + #define _E1000_PHY_H_ + +-enum e1000_ms_type { +- e1000_ms_hw_default = 0, +- e1000_ms_force_master, +- e1000_ms_force_slave, +- e1000_ms_auto +-}; ++void e1000_init_phy_ops_generic(struct e1000_hw *hw); ++s32 e1000_check_downshift_generic(struct e1000_hw *hw); ++s32 e1000_check_polarity_m88(struct e1000_hw *hw); ++s32 e1000_check_polarity_igp(struct e1000_hw *hw); ++s32 e1000_check_reset_block_generic(struct e1000_hw *hw); ++s32 e1000_copper_link_autoneg(struct e1000_hw *hw); ++s32 e1000_copper_link_setup_igp(struct e1000_hw *hw); ++s32 e1000_copper_link_setup_m88(struct e1000_hw *hw); ++s32 e1000_phy_force_speed_duplex_igp(struct e1000_hw *hw); ++s32 e1000_phy_force_speed_duplex_m88(struct e1000_hw *hw); ++s32 e1000_get_cable_length_m88(struct e1000_hw *hw); ++s32 e1000_get_cable_length_igp_2(struct e1000_hw *hw); ++s32 e1000_get_cfg_done_generic(struct e1000_hw *hw); ++s32 e1000_get_phy_id(struct e1000_hw *hw); ++s32 e1000_get_phy_info_igp(struct e1000_hw *hw); ++s32 e1000_get_phy_info_m88(struct e1000_hw *hw); ++s32 e1000_phy_sw_reset_generic(struct e1000_hw *hw); ++void e1000_phy_force_speed_duplex_setup(struct e1000_hw *hw, u16 *phy_ctrl); ++s32 e1000_phy_hw_reset_generic(struct e1000_hw *hw); ++s32 e1000_phy_reset_dsp_generic(struct e1000_hw *hw); ++s32 e1000_read_kmrn_reg_generic(struct e1000_hw *hw, u32 offset, u16 *data); ++s32 e1000_read_phy_reg_igp(struct e1000_hw *hw, u32 offset, u16 *data); ++s32 e1000_read_phy_reg_m88(struct e1000_hw *hw, u32 offset, u16 *data); ++s32 e1000_set_d3_lplu_state_generic(struct e1000_hw *hw, bool active); ++s32 e1000_setup_copper_link_generic(struct e1000_hw *hw); ++s32 e1000_wait_autoneg_generic(struct e1000_hw *hw); ++s32 e1000_write_kmrn_reg_generic(struct e1000_hw *hw, u32 offset, u16 data); ++s32 e1000_write_phy_reg_igp(struct e1000_hw *hw, u32 offset, u16 data); ++s32 e1000_write_phy_reg_m88(struct e1000_hw *hw, u32 offset, u16 data); ++s32 e1000_phy_reset_dsp(struct e1000_hw *hw); ++s32 e1000_phy_has_link_generic(struct e1000_hw *hw, u32 iterations, ++ u32 usec_interval, bool *success); ++s32 e1000_phy_init_script_igp3(struct e1000_hw *hw); ++enum e1000_phy_type e1000_get_phy_type_from_id(u32 phy_id); ++s32 e1000_determine_phy_address(struct e1000_hw *hw); ++void e1000_power_up_phy_copper(struct e1000_hw *hw); ++void e1000_power_down_phy_copper(struct e1000_hw *hw); ++s32 e1000_read_phy_reg_mdic(struct e1000_hw *hw, u32 offset, u16 *data); ++s32 e1000_write_phy_reg_mdic(struct e1000_hw *hw, u32 offset, u16 data); + +-enum e1000_smart_speed { +- e1000_smart_speed_default = 0, +- e1000_smart_speed_on, +- e1000_smart_speed_off +-}; +- +-s32 igb_check_downshift(struct e1000_hw *hw); +-s32 igb_check_reset_block(struct e1000_hw *hw); +-s32 igb_copper_link_autoneg(struct e1000_hw *hw); +-s32 igb_phy_force_speed_duplex(struct e1000_hw *hw); +-s32 igb_copper_link_setup_igp(struct e1000_hw *hw); +-s32 igb_copper_link_setup_m88(struct e1000_hw *hw); +-s32 igb_phy_force_speed_duplex_igp(struct e1000_hw *hw); +-s32 igb_phy_force_speed_duplex_m88(struct e1000_hw *hw); +-s32 igb_get_cable_length_m88(struct e1000_hw *hw); +-s32 igb_get_cable_length_igp_2(struct e1000_hw *hw); +-s32 igb_get_phy_id(struct e1000_hw *hw); +-s32 igb_get_phy_info_igp(struct e1000_hw *hw); +-s32 igb_get_phy_info_m88(struct e1000_hw *hw); +-s32 igb_phy_sw_reset(struct e1000_hw *hw); +-s32 igb_phy_hw_reset(struct e1000_hw *hw); +-s32 igb_read_phy_reg_igp(struct e1000_hw *hw, u32 offset, u16 *data); +-s32 igb_set_d3_lplu_state(struct e1000_hw *hw, bool active); +-s32 igb_write_phy_reg_igp(struct e1000_hw *hw, u32 offset, u16 data); +-s32 igb_phy_has_link(struct e1000_hw *hw, u32 iterations, +- u32 usec_interval, bool *success); +-s32 igb_phy_init_script_igp3(struct e1000_hw *hw); ++#define E1000_MAX_PHY_ADDR 4 + + /* IGP01E1000 Specific Registers */ + #define IGP01E1000_PHY_PORT_CONFIG 0x10 /* Port Config */ + #define IGP01E1000_PHY_PORT_STATUS 0x11 /* Status */ + #define IGP01E1000_PHY_PORT_CTRL 0x12 /* Control */ + #define IGP01E1000_PHY_LINK_HEALTH 0x13 /* PHY Link Health */ ++#define IGP01E1000_GMII_FIFO 0x14 /* GMII FIFO */ ++#define IGP01E1000_PHY_CHANNEL_QUALITY 0x15 /* PHY Channel Quality */ + #define IGP02E1000_PHY_POWER_MGMT 0x19 /* Power Management */ + #define IGP01E1000_PHY_PAGE_SELECT 0x1F /* Page Select */ ++#define BM_PHY_PAGE_SELECT 22 /* Page Select for BM */ ++#define IGP_PAGE_SHIFT 5 ++#define PHY_REG_MASK 0x1F ++ + #define IGP01E1000_PHY_PCS_INIT_REG 0x00B4 + #define IGP01E1000_PHY_POLARITY_MASK 0x0078 ++ + #define IGP01E1000_PSCR_AUTO_MDIX 0x1000 + #define IGP01E1000_PSCR_FORCE_MDI_MDIX 0x2000 /* 0=MDI, 1=MDIX */ ++ + #define IGP01E1000_PSCFR_SMART_SPEED 0x0080 + + /* Enable flexible speed on link-up */ ++#define IGP01E1000_GMII_FLEX_SPD 0x0010 ++#define IGP01E1000_GMII_SPD 0x0020 /* Enable SPD */ ++ ++#define IGP02E1000_PM_SPD 0x0001 /* Smart Power Down */ + #define IGP02E1000_PM_D0_LPLU 0x0002 /* For D0a states */ + #define IGP02E1000_PM_D3_LPLU 0x0004 /* For all other states */ ++ + #define IGP01E1000_PLHR_SS_DOWNGRADE 0x8000 ++ + #define IGP01E1000_PSSR_POLARITY_REVERSED 0x0002 + #define IGP01E1000_PSSR_MDIX 0x0008 + #define IGP01E1000_PSSR_SPEED_MASK 0xC000 + #define IGP01E1000_PSSR_SPEED_1000MBPS 0xC000 ++ + #define IGP02E1000_PHY_CHANNEL_NUM 4 + #define IGP02E1000_PHY_AGC_A 0x11B1 + #define IGP02E1000_PHY_AGC_B 0x12B1 + #define IGP02E1000_PHY_AGC_C 0x14B1 + #define IGP02E1000_PHY_AGC_D 0x18B1 ++ + #define IGP02E1000_AGC_LENGTH_SHIFT 9 /* Course - 15:13, Fine - 12:9 */ + #define IGP02E1000_AGC_LENGTH_MASK 0x7F + #define IGP02E1000_AGC_RANGE 15 + ++#define IGP03E1000_PHY_MISC_CTRL 0x1B ++#define IGP03E1000_PHY_MISC_DUPLEX_MANUAL_SET 0x1000 /* Manually Set Duplex */ ++ + #define E1000_CABLE_LENGTH_UNDEFINED 0xFF + ++#define E1000_KMRNCTRLSTA_OFFSET 0x001F0000 ++#define E1000_KMRNCTRLSTA_OFFSET_SHIFT 16 ++#define E1000_KMRNCTRLSTA_REN 0x00200000 ++#define E1000_KMRNCTRLSTA_DIAG_OFFSET 0x3 /* Kumeran Diagnostic */ ++#define E1000_KMRNCTRLSTA_DIAG_NELPBK 0x1000 /* Nearend Loopback mode */ ++ ++#define IFE_PHY_EXTENDED_STATUS_CONTROL 0x10 ++#define IFE_PHY_SPECIAL_CONTROL 0x11 /* 100BaseTx PHY Special Control */ ++#define IFE_PHY_SPECIAL_CONTROL_LED 0x1B /* PHY Special and LED Control */ ++#define IFE_PHY_MDIX_CONTROL 0x1C /* MDI/MDI-X Control */ ++ ++/* IFE PHY Extended Status Control */ ++#define IFE_PESC_POLARITY_REVERSED 0x0100 ++ ++/* IFE PHY Special Control */ ++#define IFE_PSC_AUTO_POLARITY_DISABLE 0x0010 ++#define IFE_PSC_FORCE_POLARITY 0x0020 ++#define IFE_PSC_DISABLE_DYNAMIC_POWER_DOWN 0x0100 ++ ++/* IFE PHY Special Control and LED Control */ ++#define IFE_PSCL_PROBE_MODE 0x0020 ++#define IFE_PSCL_PROBE_LEDS_OFF 0x0006 /* Force LEDs 0 and 2 off */ ++#define IFE_PSCL_PROBE_LEDS_ON 0x0007 /* Force LEDs 0 and 2 on */ ++ ++/* IFE PHY MDIX Control */ ++#define IFE_PMC_MDIX_STATUS 0x0020 /* 1=MDI-X, 0=MDI */ ++#define IFE_PMC_FORCE_MDIX 0x0040 /* 1=force MDI-X, 0=force MDI */ ++#define IFE_PMC_AUTO_MDIX 0x0080 /* 1=enable auto MDI/MDI-X, 0=disable */ ++ + #endif +diff -r f5806398a14e drivers/net/igb/e1000_regs.h +--- a/drivers/net/igb/e1000_regs.h Mon Jun 15 11:45:45 2009 +0100 ++++ b/drivers/net/igb/e1000_regs.h Mon Jun 15 11:59:49 2009 +0100 +@@ -1,7 +1,7 @@ + /******************************************************************************* + + Intel(R) Gigabit Ethernet Linux driver +- Copyright(c) 2007 Intel Corporation. ++ Copyright(c) 2007-2009 Intel Corporation. + + This program is free software; you can redistribute it and/or modify it + under the terms and conditions of the GNU General Public License, +@@ -29,14 +29,18 @@ + #define _E1000_REGS_H_ + + #define E1000_CTRL 0x00000 /* Device Control - RW */ ++#define E1000_CTRL_DUP 0x00004 /* Device Control Duplicate (Shadow) - RW */ + #define E1000_STATUS 0x00008 /* Device Status - RO */ + #define E1000_EECD 0x00010 /* EEPROM/Flash Control - RW */ + #define E1000_EERD 0x00014 /* EEPROM Read - RW */ + #define E1000_CTRL_EXT 0x00018 /* Extended Device Control - RW */ ++#define E1000_FLA 0x0001C /* Flash Access - RW */ + #define E1000_MDIC 0x00020 /* MDI Control - RW */ + #define E1000_SCTL 0x00024 /* SerDes Control - RW */ + #define E1000_FCAL 0x00028 /* Flow Control Address Low - RW */ + #define E1000_FCAH 0x0002C /* Flow Control Address High -RW */ ++#define E1000_FEXT 0x0002C /* Future Extended - RW */ ++#define E1000_FEXTNVM 0x00028 /* Future Extended NVM - RW */ + #define E1000_FCT 0x00030 /* Flow Control Type - RW */ + #define E1000_CONNSW 0x00034 /* Copper/Fiber switch control - RW */ + #define E1000_VET 0x00038 /* VLAN Ether Type - RW */ +@@ -46,9 +50,10 @@ + #define E1000_IMS 0x000D0 /* Interrupt Mask Set - RW */ + #define E1000_IMC 0x000D8 /* Interrupt Mask Clear - WO */ + #define E1000_IAM 0x000E0 /* Interrupt Acknowledge Auto Mask */ +-#define E1000_RCTL 0x00100 /* RX Control - RW */ ++#define E1000_RCTL 0x00100 /* Rx Control - RW */ + #define E1000_FCTTV 0x00170 /* Flow Control Transmit Timer Value - RW */ +-#define E1000_TXCW 0x00178 /* TX Configuration Word - RW */ ++#define E1000_TXCW 0x00178 /* Tx Configuration Word - RW */ ++#define E1000_RXCW 0x00180 /* Rx Configuration Word - RO */ + #define E1000_EICR 0x01580 /* Ext. Interrupt Cause Read - R/clr */ + #define E1000_EITR(_n) (0x01680 + (0x4 * (_n))) + #define E1000_EICS 0x01520 /* Ext. Interrupt Cause Set - W0 */ +@@ -59,23 +64,59 @@ + #define E1000_GPIE 0x01514 /* General Purpose Interrupt Enable - RW */ + #define E1000_IVAR0 0x01700 /* Interrupt Vector Allocation (array) - RW */ + #define E1000_IVAR_MISC 0x01740 /* IVAR for "other" causes - RW */ +-#define E1000_TCTL 0x00400 /* TX Control - RW */ +-#define E1000_TCTL_EXT 0x00404 /* Extended TX Control - RW */ +-#define E1000_TIPG 0x00410 /* TX Inter-packet gap -RW */ ++#define E1000_TCTL 0x00400 /* Tx Control - RW */ ++#define E1000_TCTL_EXT 0x00404 /* Extended Tx Control - RW */ ++#define E1000_TIPG 0x00410 /* Tx Inter-packet gap -RW */ ++#define E1000_TBT 0x00448 /* Tx Burst Timer - RW */ + #define E1000_AIT 0x00458 /* Adaptive Interframe Spacing Throttle - RW */ + #define E1000_LEDCTL 0x00E00 /* LED Control - RW */ ++#define E1000_EXTCNF_CTRL 0x00F00 /* Extended Configuration Control */ ++#define E1000_EXTCNF_SIZE 0x00F08 /* Extended Configuration Size */ ++#define E1000_PHY_CTRL 0x00F10 /* PHY Control Register in CSR */ + #define E1000_PBA 0x01000 /* Packet Buffer Allocation - RW */ + #define E1000_PBS 0x01008 /* Packet Buffer Size */ + #define E1000_EEMNGCTL 0x01010 /* MNG EEprom Control */ ++#define E1000_EEARBC 0x01024 /* EEPROM Auto Read Bus Control */ ++#define E1000_FLASHT 0x01028 /* FLASH Timer Register */ + #define E1000_EEWR 0x0102C /* EEPROM Write Register - RW */ ++#define E1000_FLSWCTL 0x01030 /* FLASH control register */ ++#define E1000_FLSWDATA 0x01034 /* FLASH data register */ ++#define E1000_FLSWCNT 0x01038 /* FLASH Access Counter */ ++#define E1000_FLOP 0x0103C /* FLASH Opcode Register */ + #define E1000_I2CCMD 0x01028 /* SFPI2C Command Register - RW */ ++#define E1000_I2CPARAMS 0x0102C /* SFPI2C Parameters Register - RW */ ++#define E1000_WDSTP 0x01040 /* Watchdog Setup - RW */ ++#define E1000_SWDSTS 0x01044 /* SW Device Status - RW */ + #define E1000_FRTIMER 0x01048 /* Free Running Timer - RW */ + #define E1000_TCPTIMER 0x0104C /* TCP Timer - RW */ ++#define E1000_VPDDIAG 0x01060 /* VPD Diagnostic - RO */ ++#define E1000_ICR_V2 0x01500 /* Interrupt Cause - new location - RC */ ++#define E1000_ICS_V2 0x01504 /* Interrupt Cause Set - new location - WO */ ++#define E1000_IMS_V2 0x01508 /* Interrupt Mask Set/Read - new location - RW */ ++#define E1000_IMC_V2 0x0150C /* Interrupt Mask Clear - new location - WO */ ++#define E1000_IAM_V2 0x01510 /* Interrupt Ack Auto Mask - new location - RW */ ++#define E1000_ERT 0x02008 /* Early Rx Threshold - RW */ + #define E1000_FCRTL 0x02160 /* Flow Control Receive Threshold Low - RW */ + #define E1000_FCRTH 0x02168 /* Flow Control Receive Threshold High - RW */ ++#define E1000_PSRCTL 0x02170 /* Packet Split Receive Control - RW */ + #define E1000_RDFPCQ(_n) (0x02430 + (0x4 * (_n))) ++#define E1000_PBRTH 0x02458 /* PB Rx Arbitration Threshold - RW */ + #define E1000_FCRTV 0x02460 /* Flow Control Refresh Timer Value - RW */ +-/* Split and Replication RX Control - RW */ ++/* Split and Replication Rx Control - RW */ ++#define E1000_RDPUMB 0x025CC /* DMA Rx Descriptor uC Mailbox - RW */ ++#define E1000_RDPUAD 0x025D0 /* DMA Rx Descriptor uC Addr Command - RW */ ++#define E1000_RDPUWD 0x025D4 /* DMA Rx Descriptor uC Data Write - RW */ ++#define E1000_RDPURD 0x025D8 /* DMA Rx Descriptor uC Data Read - RW */ ++#define E1000_RDPUCTL 0x025DC /* DMA Rx Descriptor uC Control - RW */ ++#define E1000_PBDIAG 0x02458 /* Packet Buffer Diagnostic - RW */ ++#define E1000_RXPBS 0x02404 /* Rx Packet Buffer Size - RW */ ++#define E1000_RXCTL(_n) (0x0C014 + (0x40 * (_n))) ++#define E1000_RQDPC(_n) (0x0C030 + (0x40 * (_n))) ++#define E1000_TXCTL(_n) (0x0E014 + (0x40 * (_n))) ++#define E1000_RXCTL(_n) (0x0C014 + (0x40 * (_n))) ++#define E1000_RQDPC(_n) (0x0C030 + (0x40 * (_n))) ++#define E1000_RDTR 0x02820 /* Rx Delay Timer - RW */ ++#define E1000_RADV 0x0282C /* Rx Interrupt Absolute Delay Timer - RW */ + /* + * Convenience macros + * +@@ -84,44 +125,74 @@ + * Example usage: + * E1000_RDBAL_REG(current_rx_queue) + */ +-#define E1000_RDBAL(_n) ((_n) < 4 ? (0x02800 + ((_n) * 0x100)) \ +- : (0x0C000 + ((_n) * 0x40))) +-#define E1000_RDBAH(_n) ((_n) < 4 ? (0x02804 + ((_n) * 0x100)) \ +- : (0x0C004 + ((_n) * 0x40))) +-#define E1000_RDLEN(_n) ((_n) < 4 ? (0x02808 + ((_n) * 0x100)) \ +- : (0x0C008 + ((_n) * 0x40))) +-#define E1000_SRRCTL(_n) ((_n) < 4 ? (0x0280C + ((_n) * 0x100)) \ +- : (0x0C00C + ((_n) * 0x40))) +-#define E1000_RDH(_n) ((_n) < 4 ? (0x02810 + ((_n) * 0x100)) \ +- : (0x0C010 + ((_n) * 0x40))) +-#define E1000_RDT(_n) ((_n) < 4 ? (0x02818 + ((_n) * 0x100)) \ +- : (0x0C018 + ((_n) * 0x40))) +-#define E1000_RXDCTL(_n) ((_n) < 4 ? (0x02828 + ((_n) * 0x100)) \ +- : (0x0C028 + ((_n) * 0x40))) +-#define E1000_TDBAL(_n) ((_n) < 4 ? (0x03800 + ((_n) * 0x100)) \ +- : (0x0E000 + ((_n) * 0x40))) +-#define E1000_TDBAH(_n) ((_n) < 4 ? (0x03804 + ((_n) * 0x100)) \ +- : (0x0E004 + ((_n) * 0x40))) +-#define E1000_TDLEN(_n) ((_n) < 4 ? (0x03808 + ((_n) * 0x100)) \ +- : (0x0E008 + ((_n) * 0x40))) +-#define E1000_TDH(_n) ((_n) < 4 ? (0x03810 + ((_n) * 0x100)) \ +- : (0x0E010 + ((_n) * 0x40))) +-#define E1000_TDT(_n) ((_n) < 4 ? (0x03818 + ((_n) * 0x100)) \ +- : (0x0E018 + ((_n) * 0x40))) +-#define E1000_TXDCTL(_n) ((_n) < 4 ? (0x03828 + ((_n) * 0x100)) \ +- : (0x0E028 + ((_n) * 0x40))) +-#define E1000_TARC(_n) (0x03840 + (_n << 8)) ++#define E1000_RDBAL(_n) ((_n) < 4 ? (0x02800 + ((_n) * 0x100)) : \ ++ (0x0C000 + ((_n) * 0x40))) ++#define E1000_RDBAH(_n) ((_n) < 4 ? (0x02804 + ((_n) * 0x100)) : \ ++ (0x0C004 + ((_n) * 0x40))) ++#define E1000_RDLEN(_n) ((_n) < 4 ? (0x02808 + ((_n) * 0x100)) : \ ++ (0x0C008 + ((_n) * 0x40))) ++#define E1000_SRRCTL(_n) ((_n) < 4 ? (0x0280C + ((_n) * 0x100)) : \ ++ (0x0C00C + ((_n) * 0x40))) ++#define E1000_RDH(_n) ((_n) < 4 ? (0x02810 + ((_n) * 0x100)) : \ ++ (0x0C010 + ((_n) * 0x40))) ++#define E1000_RDT(_n) ((_n) < 4 ? (0x02818 + ((_n) * 0x100)) : \ ++ (0x0C018 + ((_n) * 0x40))) ++#define E1000_RXDCTL(_n) ((_n) < 4 ? (0x02828 + ((_n) * 0x100)) : \ ++ (0x0C028 + ((_n) * 0x40))) ++#define E1000_TDBAL(_n) ((_n) < 4 ? (0x03800 + ((_n) * 0x100)) : \ ++ (0x0E000 + ((_n) * 0x40))) ++#define E1000_TDBAH(_n) ((_n) < 4 ? (0x03804 + ((_n) * 0x100)) : \ ++ (0x0E004 + ((_n) * 0x40))) ++#define E1000_TDLEN(_n) ((_n) < 4 ? (0x03808 + ((_n) * 0x100)) : \ ++ (0x0E008 + ((_n) * 0x40))) ++#define E1000_TDH(_n) ((_n) < 4 ? (0x03810 + ((_n) * 0x100)) : \ ++ (0x0E010 + ((_n) * 0x40))) ++#define E1000_TDT(_n) ((_n) < 4 ? (0x03818 + ((_n) * 0x100)) : \ ++ (0x0E018 + ((_n) * 0x40))) ++#define E1000_TXDCTL(_n) ((_n) < 4 ? (0x03828 + ((_n) * 0x100)) : \ ++ (0x0E028 + ((_n) * 0x40))) ++#define E1000_TARC(_n) (0x03840 + (_n << 8)) + #define E1000_DCA_TXCTRL(_n) (0x03814 + (_n << 8)) + #define E1000_DCA_RXCTRL(_n) (0x02814 + (_n << 8)) +-#define E1000_TDWBAL(_n) ((_n) < 4 ? (0x03838 + ((_n) * 0x100)) \ +- : (0x0E038 + ((_n) * 0x40))) +-#define E1000_TDWBAH(_n) ((_n) < 4 ? (0x0383C + ((_n) * 0x100)) \ +- : (0x0E03C + ((_n) * 0x40))) +-#define E1000_TDFH 0x03410 /* TX Data FIFO Head - RW */ +-#define E1000_TDFT 0x03418 /* TX Data FIFO Tail - RW */ +-#define E1000_TDFHS 0x03420 /* TX Data FIFO Head Saved - RW */ +-#define E1000_TDFPC 0x03430 /* TX Data FIFO Packet Count - RW */ +-#define E1000_DTXCTL 0x03590 /* DMA TX Control - RW */ ++#define E1000_TDWBAL(_n) ((_n) < 4 ? (0x03838 + ((_n) * 0x100)) : \ ++ (0x0E038 + ((_n) * 0x40))) ++#define E1000_TDWBAH(_n) ((_n) < 4 ? (0x0383C + ((_n) * 0x100)) : \ ++ (0x0E03C + ((_n) * 0x40))) ++#define E1000_RSRPD 0x02C00 /* Rx Small Packet Detect - RW */ ++#define E1000_RAID 0x02C08 /* Receive Ack Interrupt Delay - RW */ ++#define E1000_TXDMAC 0x03000 /* Tx DMA Control - RW */ ++#define E1000_KABGTXD 0x03004 /* AFE Band Gap Transmit Ref Data */ ++#define E1000_PSRTYPE(_i) (0x05480 + ((_i) * 4)) ++#define E1000_RAL(_i) (((_i) <= 15) ? (0x05400 + ((_i) * 8)) : \ ++ (0x054E0 + ((_i - 16) * 8))) ++#define E1000_RAH(_i) (((_i) <= 15) ? (0x05404 + ((_i) * 8)) : \ ++ (0x054E4 + ((_i - 16) * 8))) ++#define E1000_IP4AT_REG(_i) (0x05840 + ((_i) * 8)) ++#define E1000_IP6AT_REG(_i) (0x05880 + ((_i) * 4)) ++#define E1000_WUPM_REG(_i) (0x05A00 + ((_i) * 4)) ++#define E1000_FFMT_REG(_i) (0x09000 + ((_i) * 8)) ++#define E1000_FFVT_REG(_i) (0x09800 + ((_i) * 8)) ++#define E1000_FFLT_REG(_i) (0x05F00 + ((_i) * 8)) ++#define E1000_PBSLAC 0x03100 /* Packet Buffer Slave Access Control */ ++#define E1000_PBSLAD(_n) (0x03110 + (0x4 * (_n))) /* Packet Buffer DWORD (_n) */ ++#define E1000_TXPBS 0x03404 /* Tx Packet Buffer Size - RW */ ++#define E1000_TDFH 0x03410 /* Tx Data FIFO Head - RW */ ++#define E1000_TDFT 0x03418 /* Tx Data FIFO Tail - RW */ ++#define E1000_TDFHS 0x03420 /* Tx Data FIFO Head Saved - RW */ ++#define E1000_TDFTS 0x03428 /* Tx Data FIFO Tail Saved - RW */ ++#define E1000_TDFPC 0x03430 /* Tx Data FIFO Packet Count - RW */ ++#define E1000_TDPUMB 0x0357C /* DMA Tx Descriptor uC Mail Box - RW */ ++#define E1000_TDPUAD 0x03580 /* DMA Tx Descriptor uC Addr Command - RW */ ++#define E1000_TDPUWD 0x03584 /* DMA Tx Descriptor uC Data Write - RW */ ++#define E1000_TDPURD 0x03588 /* DMA Tx Descriptor uC Data Read - RW */ ++#define E1000_TDPUCTL 0x0358C /* DMA Tx Descriptor uC Control - RW */ ++#define E1000_DTXCTL 0x03590 /* DMA Tx Control - RW */ ++#define E1000_DTXTCPFLGL 0x0359C /* DMA Tx Control flag low - RW */ ++#define E1000_DTXTCPFLGH 0x035A0 /* DMA Tx Control flag high - RW */ ++#define E1000_DTXMXSZRQ 0x03540 /* DMA Tx Max Total Allow Size Requests - RW */ ++#define E1000_TIDV 0x03820 /* Tx Interrupt Delay Value - RW */ ++#define E1000_TADV 0x0382C /* Tx Interrupt Absolute Delay Val - RW */ ++#define E1000_TSPMT 0x03830 /* TCP Segmentation PAD & Min Threshold - RW */ + #define E1000_CRCERRS 0x04000 /* CRC Error Count - R/clr */ + #define E1000_ALGNERRC 0x04004 /* Alignment Error Count - R/clr */ + #define E1000_SYMERRS 0x04008 /* Symbol Error Count - R/clr */ +@@ -133,142 +204,265 @@ + #define E1000_LATECOL 0x04020 /* Late Collision Count - R/clr */ + #define E1000_COLC 0x04028 /* Collision Count - R/clr */ + #define E1000_DC 0x04030 /* Defer Count - R/clr */ +-#define E1000_TNCRS 0x04034 /* TX-No CRS - R/clr */ ++#define E1000_TNCRS 0x04034 /* Tx-No CRS - R/clr */ + #define E1000_SEC 0x04038 /* Sequence Error Count - R/clr */ + #define E1000_CEXTERR 0x0403C /* Carrier Extension Error Count - R/clr */ + #define E1000_RLEC 0x04040 /* Receive Length Error Count - R/clr */ +-#define E1000_XONRXC 0x04048 /* XON RX Count - R/clr */ +-#define E1000_XONTXC 0x0404C /* XON TX Count - R/clr */ +-#define E1000_XOFFRXC 0x04050 /* XOFF RX Count - R/clr */ +-#define E1000_XOFFTXC 0x04054 /* XOFF TX Count - R/clr */ +-#define E1000_FCRUC 0x04058 /* Flow Control RX Unsupported Count- R/clr */ +-#define E1000_PRC64 0x0405C /* Packets RX (64 bytes) - R/clr */ +-#define E1000_PRC127 0x04060 /* Packets RX (65-127 bytes) - R/clr */ +-#define E1000_PRC255 0x04064 /* Packets RX (128-255 bytes) - R/clr */ +-#define E1000_PRC511 0x04068 /* Packets RX (255-511 bytes) - R/clr */ +-#define E1000_PRC1023 0x0406C /* Packets RX (512-1023 bytes) - R/clr */ +-#define E1000_PRC1522 0x04070 /* Packets RX (1024-1522 bytes) - R/clr */ +-#define E1000_GPRC 0x04074 /* Good Packets RX Count - R/clr */ +-#define E1000_BPRC 0x04078 /* Broadcast Packets RX Count - R/clr */ +-#define E1000_MPRC 0x0407C /* Multicast Packets RX Count - R/clr */ +-#define E1000_GPTC 0x04080 /* Good Packets TX Count - R/clr */ +-#define E1000_GORCL 0x04088 /* Good Octets RX Count Low - R/clr */ +-#define E1000_GORCH 0x0408C /* Good Octets RX Count High - R/clr */ +-#define E1000_GOTCL 0x04090 /* Good Octets TX Count Low - R/clr */ +-#define E1000_GOTCH 0x04094 /* Good Octets TX Count High - R/clr */ +-#define E1000_RNBC 0x040A0 /* RX No Buffers Count - R/clr */ +-#define E1000_RUC 0x040A4 /* RX Undersize Count - R/clr */ +-#define E1000_RFC 0x040A8 /* RX Fragment Count - R/clr */ +-#define E1000_ROC 0x040AC /* RX Oversize Count - R/clr */ +-#define E1000_RJC 0x040B0 /* RX Jabber Count - R/clr */ +-#define E1000_MGTPRC 0x040B4 /* Management Packets RX Count - R/clr */ ++#define E1000_XONRXC 0x04048 /* XON Rx Count - R/clr */ ++#define E1000_XONTXC 0x0404C /* XON Tx Count - R/clr */ ++#define E1000_XOFFRXC 0x04050 /* XOFF Rx Count - R/clr */ ++#define E1000_XOFFTXC 0x04054 /* XOFF Tx Count - R/clr */ ++#define E1000_FCRUC 0x04058 /* Flow Control Rx Unsupported Count- R/clr */ ++#define E1000_PRC64 0x0405C /* Packets Rx (64 bytes) - R/clr */ ++#define E1000_PRC127 0x04060 /* Packets Rx (65-127 bytes) - R/clr */ ++#define E1000_PRC255 0x04064 /* Packets Rx (128-255 bytes) - R/clr */ ++#define E1000_PRC511 0x04068 /* Packets Rx (255-511 bytes) - R/clr */ ++#define E1000_PRC1023 0x0406C /* Packets Rx (512-1023 bytes) - R/clr */ ++#define E1000_PRC1522 0x04070 /* Packets Rx (1024-1522 bytes) - R/clr */ ++#define E1000_GPRC 0x04074 /* Good Packets Rx Count - R/clr */ ++#define E1000_BPRC 0x04078 /* Broadcast Packets Rx Count - R/clr */ ++#define E1000_MPRC 0x0407C /* Multicast Packets Rx Count - R/clr */ ++#define E1000_GPTC 0x04080 /* Good Packets Tx Count - R/clr */ ++#define E1000_GORCL 0x04088 /* Good Octets Rx Count Low - R/clr */ ++#define E1000_GORCH 0x0408C /* Good Octets Rx Count High - R/clr */ ++#define E1000_GOTCL 0x04090 /* Good Octets Tx Count Low - R/clr */ ++#define E1000_GOTCH 0x04094 /* Good Octets Tx Count High - R/clr */ ++#define E1000_RNBC 0x040A0 /* Rx No Buffers Count - R/clr */ ++#define E1000_RUC 0x040A4 /* Rx Undersize Count - R/clr */ ++#define E1000_RFC 0x040A8 /* Rx Fragment Count - R/clr */ ++#define E1000_ROC 0x040AC /* Rx Oversize Count - R/clr */ ++#define E1000_RJC 0x040B0 /* Rx Jabber Count - R/clr */ ++#define E1000_MGTPRC 0x040B4 /* Management Packets Rx Count - R/clr */ + #define E1000_MGTPDC 0x040B8 /* Management Packets Dropped Count - R/clr */ +-#define E1000_MGTPTC 0x040BC /* Management Packets TX Count - R/clr */ +-#define E1000_TORL 0x040C0 /* Total Octets RX Low - R/clr */ +-#define E1000_TORH 0x040C4 /* Total Octets RX High - R/clr */ +-#define E1000_TOTL 0x040C8 /* Total Octets TX Low - R/clr */ +-#define E1000_TOTH 0x040CC /* Total Octets TX High - R/clr */ +-#define E1000_TPR 0x040D0 /* Total Packets RX - R/clr */ +-#define E1000_TPT 0x040D4 /* Total Packets TX - R/clr */ +-#define E1000_PTC64 0x040D8 /* Packets TX (64 bytes) - R/clr */ +-#define E1000_PTC127 0x040DC /* Packets TX (65-127 bytes) - R/clr */ +-#define E1000_PTC255 0x040E0 /* Packets TX (128-255 bytes) - R/clr */ +-#define E1000_PTC511 0x040E4 /* Packets TX (256-511 bytes) - R/clr */ +-#define E1000_PTC1023 0x040E8 /* Packets TX (512-1023 bytes) - R/clr */ +-#define E1000_PTC1522 0x040EC /* Packets TX (1024-1522 Bytes) - R/clr */ +-#define E1000_MPTC 0x040F0 /* Multicast Packets TX Count - R/clr */ +-#define E1000_BPTC 0x040F4 /* Broadcast Packets TX Count - R/clr */ +-#define E1000_TSCTC 0x040F8 /* TCP Segmentation Context TX - R/clr */ +-#define E1000_TSCTFC 0x040FC /* TCP Segmentation Context TX Fail - R/clr */ ++#define E1000_MGTPTC 0x040BC /* Management Packets Tx Count - R/clr */ ++#define E1000_TORL 0x040C0 /* Total Octets Rx Low - R/clr */ ++#define E1000_TORH 0x040C4 /* Total Octets Rx High - R/clr */ ++#define E1000_TOTL 0x040C8 /* Total Octets Tx Low - R/clr */ ++#define E1000_TOTH 0x040CC /* Total Octets Tx High - R/clr */ ++#define E1000_TPR 0x040D0 /* Total Packets Rx - R/clr */ ++#define E1000_TPT 0x040D4 /* Total Packets Tx - R/clr */ ++#define E1000_PTC64 0x040D8 /* Packets Tx (64 bytes) - R/clr */ ++#define E1000_PTC127 0x040DC /* Packets Tx (65-127 bytes) - R/clr */ ++#define E1000_PTC255 0x040E0 /* Packets Tx (128-255 bytes) - R/clr */ ++#define E1000_PTC511 0x040E4 /* Packets Tx (256-511 bytes) - R/clr */ ++#define E1000_PTC1023 0x040E8 /* Packets Tx (512-1023 bytes) - R/clr */ ++#define E1000_PTC1522 0x040EC /* Packets Tx (1024-1522 Bytes) - R/clr */ ++#define E1000_MPTC 0x040F0 /* Multicast Packets Tx Count - R/clr */ ++#define E1000_BPTC 0x040F4 /* Broadcast Packets Tx Count - R/clr */ ++#define E1000_TSCTC 0x040F8 /* TCP Segmentation Context Tx - R/clr */ ++#define E1000_TSCTFC 0x040FC /* TCP Segmentation Context Tx Fail - R/clr */ + #define E1000_IAC 0x04100 /* Interrupt Assertion Count */ +-/* Interrupt Cause Rx Packet Timer Expire Count */ +-#define E1000_ICRXPTC 0x04104 +-/* Interrupt Cause Rx Absolute Timer Expire Count */ +-#define E1000_ICRXATC 0x04108 +-/* Interrupt Cause Tx Packet Timer Expire Count */ +-#define E1000_ICTXPTC 0x0410C +-/* Interrupt Cause Tx Absolute Timer Expire Count */ +-#define E1000_ICTXATC 0x04110 +-/* Interrupt Cause Tx Queue Empty Count */ +-#define E1000_ICTXQEC 0x04118 +-/* Interrupt Cause Tx Queue Minimum Threshold Count */ +-#define E1000_ICTXQMTC 0x0411C +-/* Interrupt Cause Rx Descriptor Minimum Threshold Count */ +-#define E1000_ICRXDMTC 0x04120 ++#define E1000_ICRXPTC 0x04104 /* Interrupt Cause Rx Pkt Timer Expire Count */ ++#define E1000_ICRXATC 0x04108 /* Interrupt Cause Rx Abs Timer Expire Count */ ++#define E1000_ICTXPTC 0x0410C /* Interrupt Cause Tx Pkt Timer Expire Count */ ++#define E1000_ICTXATC 0x04110 /* Interrupt Cause Tx Abs Timer Expire Count */ ++#define E1000_ICTXQEC 0x04118 /* Interrupt Cause Tx Queue Empty Count */ ++#define E1000_ICTXQMTC 0x0411C /* Interrupt Cause Tx Queue Min Thresh Count */ ++#define E1000_ICRXDMTC 0x04120 /* Interrupt Cause Rx Desc Min Thresh Count */ + #define E1000_ICRXOC 0x04124 /* Interrupt Cause Receiver Overrun Count */ ++ ++#define E1000_LSECTXUT 0x04300 /* LinkSec Tx Untagged Packet Count - OutPktsUntagged */ ++#define E1000_LSECTXPKTE 0x04304 /* LinkSec Encrypted Tx Packets Count - OutPktsEncrypted */ ++#define E1000_LSECTXPKTP 0x04308 /* LinkSec Protected Tx Packet Count - OutPktsProtected */ ++#define E1000_LSECTXOCTE 0x0430C /* LinkSec Encrypted Tx Octets Count - OutOctetsEncrypted */ ++#define E1000_LSECTXOCTP 0x04310 /* LinkSec Protected Tx Octets Count - OutOctetsProtected */ ++#define E1000_LSECRXUT 0x04314 /* LinkSec Untagged non-Strict Rx Packet Count - InPktsUntagged/InPktsNoTag */ ++#define E1000_LSECRXOCTD 0x0431C /* LinkSec Rx Octets Decrypted Count - InOctetsDecrypted */ ++#define E1000_LSECRXOCTV 0x04320 /* LinkSec Rx Octets Validated - InOctetsValidated */ ++#define E1000_LSECRXBAD 0x04324 /* LinkSec Rx Bad Tag - InPktsBadTag */ ++#define E1000_LSECRXNOSCI 0x04328 /* LinkSec Rx Packet No SCI Count - InPktsNoSci */ ++#define E1000_LSECRXUNSCI 0x0432C /* LinkSec Rx Packet Unknown SCI Count - InPktsUnknownSci */ ++#define E1000_LSECRXUNCH 0x04330 /* LinkSec Rx Unchecked Packets Count - InPktsUnchecked */ ++#define E1000_LSECRXDELAY 0x04340 /* LinkSec Rx Delayed Packet Count - InPktsDelayed */ ++#define E1000_LSECRXLATE 0x04350 /* LinkSec Rx Late Packets Count - InPktsLate */ ++#define E1000_LSECRXOK(_n) (0x04360 + (0x04 * (_n))) /* LinkSec Rx Packet OK Count - InPktsOk */ ++#define E1000_LSECRXINV(_n) (0x04380 + (0x04 * (_n))) /* LinkSec Rx Invalid Count - InPktsInvalid */ ++#define E1000_LSECRXNV(_n) (0x043A0 + (0x04 * (_n))) /* LinkSec Rx Not Valid Count - InPktsNotValid */ ++#define E1000_LSECRXUNSA 0x043C0 /* LinkSec Rx Unused SA Count - InPktsUnusedSa */ ++#define E1000_LSECRXNUSA 0x043D0 /* LinkSec Rx Not Using SA Count - InPktsNotUsingSa */ ++#define E1000_LSECTXCAP 0x0B000 /* LinkSec Tx Capabilities Register - RO */ ++#define E1000_LSECRXCAP 0x0B300 /* LinkSec Rx Capabilities Register - RO */ ++#define E1000_LSECTXCTRL 0x0B004 /* LinkSec Tx Control - RW */ ++#define E1000_LSECRXCTRL 0x0B304 /* LinkSec Rx Control - RW */ ++#define E1000_LSECTXSCL 0x0B008 /* LinkSec Tx SCI Low - RW */ ++#define E1000_LSECTXSCH 0x0B00C /* LinkSec Tx SCI High - RW */ ++#define E1000_LSECTXSA 0x0B010 /* LinkSec Tx SA0 - RW */ ++#define E1000_LSECTXPN0 0x0B018 /* LinkSec Tx SA PN 0 - RW */ ++#define E1000_LSECTXPN1 0x0B01C /* LinkSec Tx SA PN 1 - RW */ ++#define E1000_LSECRXSCL 0x0B3D0 /* LinkSec Rx SCI Low - RW */ ++#define E1000_LSECRXSCH 0x0B3E0 /* LinkSec Rx SCI High - RW */ ++#define E1000_LSECTXKEY0(_n) (0x0B020 + (0x04 * (_n))) /* LinkSec Tx 128-bit Key 0 - WO */ ++#define E1000_LSECTXKEY1(_n) (0x0B030 + (0x04 * (_n))) /* LinkSec Tx 128-bit Key 1 - WO */ ++#define E1000_LSECRXSA(_n) (0x0B310 + (0x04 * (_n))) /* LinkSec Rx SAs - RW */ ++#define E1000_LSECRXPN(_n) (0x0B330 + (0x04 * (_n))) /* LinkSec Rx SAs - RW */ ++/* ++ * LinkSec Rx Keys - where _n is the SA no. and _m the 4 dwords of the 128 bit ++ * key - RW. ++ */ ++#define E1000_LSECRXKEY(_n, _m) (0x0B350 + (0x10 * (_n)) + (0x04 * (_m))) ++ ++#define E1000_SSVPC 0x041A0 /* Switch Security Violation Packet Count */ ++#define E1000_IPSCTRL 0xB430 /* IpSec Control Register */ ++#define E1000_IPSRXCMD 0x0B408 /* IPSec Rx Command Register - RW */ ++#define E1000_IPSRXIDX 0x0B400 /* IPSec Rx Index - RW */ ++#define E1000_IPSRXIPADDR(_n) (0x0B420+ (0x04 * (_n))) /* IPSec Rx IPv4/v6 Address - RW */ ++#define E1000_IPSRXKEY(_n) (0x0B410 + (0x04 * (_n))) /* IPSec Rx 128-bit Key - RW */ ++#define E1000_IPSRXSALT 0x0B404 /* IPSec Rx Salt - RW */ ++#define E1000_IPSRXSPI 0x0B40C /* IPSec Rx SPI - RW */ ++#define E1000_IPSTXKEY(_n) (0x0B460 + (0x04 * (_n))) /* IPSec Tx 128-bit Key - RW */ ++#define E1000_IPSTXSALT 0x0B454 /* IPSec Tx Salt - RW */ ++#define E1000_IPSTXIDX 0x0B450 /* IPSec Tx SA IDX - RW */ + #define E1000_PCS_CFG0 0x04200 /* PCS Configuration 0 - RW */ + #define E1000_PCS_LCTL 0x04208 /* PCS Link Control - RW */ + #define E1000_PCS_LSTAT 0x0420C /* PCS Link Status - RO */ +-#define E1000_CBTMPC 0x0402C /* Circuit Breaker TX Packet Count */ ++#define E1000_CBTMPC 0x0402C /* Circuit Breaker Tx Packet Count */ + #define E1000_HTDPMC 0x0403C /* Host Transmit Discarded Packets */ +-#define E1000_CBRMPC 0x040FC /* Circuit Breaker RX Packet Count */ ++#define E1000_CBRDPC 0x04044 /* Circuit Breaker Rx Dropped Count */ ++#define E1000_CBRMPC 0x040FC /* Circuit Breaker Rx Packet Count */ + #define E1000_RPTHC 0x04104 /* Rx Packets To Host */ +-#define E1000_HGPTC 0x04118 /* Host Good Packets TX Count */ +-#define E1000_HTCBDPC 0x04124 /* Host TX Circuit Breaker Dropped Count */ ++#define E1000_HGPTC 0x04118 /* Host Good Packets Tx Count */ ++#define E1000_HTCBDPC 0x04124 /* Host Tx Circuit Breaker Dropped Count */ + #define E1000_HGORCL 0x04128 /* Host Good Octets Received Count Low */ + #define E1000_HGORCH 0x0412C /* Host Good Octets Received Count High */ + #define E1000_HGOTCL 0x04130 /* Host Good Octets Transmit Count Low */ + #define E1000_HGOTCH 0x04134 /* Host Good Octets Transmit Count High */ + #define E1000_LENERRS 0x04138 /* Length Errors Count */ + #define E1000_SCVPC 0x04228 /* SerDes/SGMII Code Violation Pkt Count */ ++#define E1000_HRMPC 0x0A018 /* Header Redirection Missed Packet Count */ + #define E1000_PCS_ANADV 0x04218 /* AN advertisement - RW */ + #define E1000_PCS_LPAB 0x0421C /* Link Partner Ability - RW */ + #define E1000_PCS_NPTX 0x04220 /* AN Next Page Transmit - RW */ + #define E1000_PCS_LPABNP 0x04224 /* Link Partner Ability Next Page - RW */ +-#define E1000_RXCSUM 0x05000 /* RX Checksum Control - RW */ +-#define E1000_RLPML 0x05004 /* RX Long Packet Max Length */ ++#define E1000_1GSTAT_RCV 0x04228 /* 1GSTAT Code Violation Packet Count - RW */ ++#define E1000_RXCSUM 0x05000 /* Rx Checksum Control - RW */ ++#define E1000_RLPML 0x05004 /* Rx Long Packet Max Length */ + #define E1000_RFCTL 0x05008 /* Receive Filter Control*/ + #define E1000_MTA 0x05200 /* Multicast Table Array - RW Array */ + #define E1000_RA 0x05400 /* Receive Address - RW Array */ + #define E1000_RA2 0x054E0 /* 2nd half of receive address array - RW Array */ + #define E1000_VFTA 0x05600 /* VLAN Filter Table Array - RW Array */ +-#define E1000_VMD_CTL 0x0581C /* VMDq Control - RW */ ++#define E1000_VT_CTL 0x0581C /* VMDq Control - RW */ ++#define E1000_VFQA0 0x0B000 /* VLAN Filter Queue Array 0 - RW Array */ ++#define E1000_VFQA1 0x0B200 /* VLAN Filter Queue Array 1 - RW Array */ + #define E1000_WUC 0x05800 /* Wakeup Control - RW */ + #define E1000_WUFC 0x05808 /* Wakeup Filter Control - RW */ + #define E1000_WUS 0x05810 /* Wakeup Status - RO */ + #define E1000_MANC 0x05820 /* Management Control - RW */ + #define E1000_IPAV 0x05838 /* IP Address Valid - RW */ ++#define E1000_IP4AT 0x05840 /* IPv4 Address Table - RW Array */ ++#define E1000_IP6AT 0x05880 /* IPv6 Address Table - RW Array */ + #define E1000_WUPL 0x05900 /* Wakeup Packet Length - RW */ ++#define E1000_WUPM 0x05A00 /* Wakeup Packet Memory - RO A */ ++#define E1000_PBACL 0x05B68 /* MSIx PBA Clear - Read/Write 1's to clear */ ++#define E1000_FFLT 0x05F00 /* Flexible Filter Length Table - RW Array */ + #define E1000_HOST_IF 0x08800 /* Host Interface */ ++#define E1000_FFMT 0x09000 /* Flexible Filter Mask Table - RW Array */ ++#define E1000_FFVT 0x09800 /* Flexible Filter Value Table - RW Array */ ++#define E1000_FHFT(_n) (0x09000 + (_n * 0x100)) /* Flexible Host Filter Table */ ++#define E1000_FHFT_EXT(_n) (0x09A00 + (_n * 0x100)) /* Ext Flexible Host Filter Table */ + ++ ++#define E1000_KMRNCTRLSTA 0x00034 /* MAC-PHY interface - RW */ ++#define E1000_MDPHYA 0x0003C /* PHY address - RW */ + #define E1000_MANC2H 0x05860 /* Management Control To Host - RW */ + #define E1000_SW_FW_SYNC 0x05B5C /* Software-Firmware Synchronization - RW */ + #define E1000_CCMCTL 0x05B48 /* CCM Control Register */ + #define E1000_GIOCTL 0x05B44 /* GIO Analog Control Register */ + #define E1000_SCCTL 0x05B4C /* PCIc PLL Configuration Register */ ++#define E1000_GCR 0x05B00 /* PCI-Ex Control */ ++#define E1000_GCR2 0x05B64 /* PCI-Ex Control #2 */ ++#define E1000_GSCL_1 0x05B10 /* PCI-Ex Statistic Control #1 */ ++#define E1000_GSCL_2 0x05B14 /* PCI-Ex Statistic Control #2 */ ++#define E1000_GSCL_3 0x05B18 /* PCI-Ex Statistic Control #3 */ ++#define E1000_GSCL_4 0x05B1C /* PCI-Ex Statistic Control #4 */ + #define E1000_FACTPS 0x05B30 /* Function Active and Power State to MNG */ + #define E1000_SWSM 0x05B50 /* SW Semaphore */ + #define E1000_FWSM 0x05B54 /* FW Semaphore */ + #define E1000_DCA_ID 0x05B70 /* DCA Requester ID Information - RO */ + #define E1000_DCA_CTRL 0x05B74 /* DCA Control - RW */ +-#define E1000_HICR 0x08F00 /* Host Inteface Control */ ++#define E1000_FFLT_DBG 0x05F04 /* Debug Register */ ++#define E1000_HICR 0x08F00 /* Host Interface Control */ + + /* RSS registers */ ++#define E1000_CPUVEC 0x02C10 /* CPU Vector Register - RW */ + #define E1000_MRQC 0x05818 /* Multiple Receive Control - RW */ + #define E1000_IMIR(_i) (0x05A80 + ((_i) * 4)) /* Immediate Interrupt */ + #define E1000_IMIREXT(_i) (0x05AA0 + ((_i) * 4)) /* Immediate Interrupt Ext*/ +-#define E1000_IMIRVP 0x05AC0 /* Immediate Interrupt RX VLAN Priority - RW */ +-/* MSI-X Allocation Register (_i) - RW */ +-#define E1000_MSIXBM(_i) (0x01600 + ((_i) * 4)) +-/* MSI-X Table entry addr low reg 0 - RW */ +-#define E1000_MSIXTADD(_i) (0x0C000 + ((_i) * 0x10)) +-/* MSI-X Table entry addr upper reg 0 - RW */ +-#define E1000_MSIXTUADD(_i) (0x0C004 + ((_i) * 0x10)) +-/* MSI-X Table entry message reg 0 - RW */ +-#define E1000_MSIXTMSG(_i) (0x0C008 + ((_i) * 0x10)) +-/* MSI-X Table entry vector ctrl reg 0 - RW */ +-#define E1000_MSIXVCTRL(_i) (0x0C00C + ((_i) * 0x10)) +-/* Redirection Table - RW Array */ +-#define E1000_RETA(_i) (0x05C00 + ((_i) * 4)) +-#define E1000_RSSRK(_i) (0x05C80 + ((_i) * 4)) /* RSS Random Key - RW Array */ ++#define E1000_IMIRVP 0x05AC0 /* Immediate Interrupt Rx VLAN Priority - RW */ ++#define E1000_MSIXBM(_i) (0x01600 + ((_i) * 4)) /* MSI-X Allocation Register ++ * (_i) - RW */ ++#define E1000_MSIXTADD(_i) (0x0C000 + ((_i) * 0x10)) /* MSI-X Table entry addr ++ * low reg - RW */ ++#define E1000_MSIXTUADD(_i) (0x0C004 + ((_i) * 0x10)) /* MSI-X Table entry addr ++ * upper reg - RW */ ++#define E1000_MSIXTMSG(_i) (0x0C008 + ((_i) * 0x10)) /* MSI-X Table entry ++ * message reg - RW */ ++#define E1000_MSIXVCTRL(_i) (0x0C00C + ((_i) * 0x10)) /* MSI-X Table entry ++ * vector ctrl reg - RW */ ++#define E1000_MSIXPBA 0x0E000 /* MSI-X Pending bit array */ ++#define E1000_RETA(_i) (0x05C00 + ((_i) * 4)) /* Redirection Table - RW */ ++#define E1000_RSSRK(_i) (0x05C80 + ((_i) * 4)) /* RSS Random Key - RW */ ++#define E1000_RSSIM 0x05864 /* RSS Interrupt Mask */ ++#define E1000_RSSIR 0x05868 /* RSS Interrupt Request */ ++/* VT Registers */ ++#define E1000_SWPBS 0x03004 /* Switch Packet Buffer Size - RW */ ++#define E1000_MBVFICR 0x00C80 /* Mailbox VF Cause - RWC */ ++#define E1000_MBVFIMR 0x00C84 /* Mailbox VF int Mask - RW */ ++#define E1000_VFLRE 0x00C88 /* VF Register Events - RWC */ ++#define E1000_VFRE 0x00C8C /* VF Receive Enables */ ++#define E1000_VFTE 0x00C90 /* VF Transmit Enables */ ++#define E1000_QDE 0x02408 /* Queue Drop Enable - RW */ ++#define E1000_DTXSWC 0x03500 /* DMA Tx Switch Control - RW */ ++#define E1000_RPLOLR 0x05AF0 /* Replication Offload - RW */ ++#define E1000_UTA 0x0A000 /* Unicast Table Array - RW */ ++#define E1000_IOVTCL 0x05BBC /* IOV Control Register */ ++#define E1000_VMRCTL 0X05D80 /* Virtual Mirror Rule Control */ ++/* These act per VF so an array friendly macro is used */ ++#define E1000_V2PMAILBOX(_n) (0x00C40 + (4 * (_n))) ++#define E1000_P2VMAILBOX(_n) (0x00C00 + (4 * (_n))) ++#define E1000_VMBMEM(_n) (0x00800 + (64 * (_n))) ++#define E1000_VFVMBMEM(_n) (0x00800 + (_n)) ++#define E1000_VMOLR(_n) (0x05AD0 + (4 * (_n))) ++#define E1000_VLVF(_n) (0x05D00 + (4 * (_n))) /* VLAN Virtual Machine ++ * Filter - RW */ + +-#define wr32(reg, value) (writel(value, hw->hw_addr + reg)) +-#define rd32(reg) (readl(hw->hw_addr + reg)) +-#define wrfl() ((void)rd32(E1000_STATUS)) ++/* Filtering Registers */ ++#define E1000_SAQF(_n) (0x05980 + (4 * (_n))) /* Source Address Queue Fltr */ ++#define E1000_DAQF(_n) (0x059A0 + (4 * (_n))) /* Dest Address Queue Fltr */ ++#define E1000_SPQF(_n) (0x059C0 + (4 * (_n))) /* Source Port Queue Fltr */ ++#define E1000_FTQF(_n) (0x059E0 + (4 * (_n))) /* 5-tuple Queue Fltr */ ++#define E1000_SYNQF(_n) (0x055FC + (4 * (_n))) /* SYN Packet Queue Fltr */ ++#define E1000_ETQF(_n) (0x05CB0 + (4 * (_n))) /* EType Queue Fltr */ + +-#define array_wr32(reg, offset, value) \ +- (writel(value, hw->hw_addr + reg + ((offset) << 2))) +-#define array_rd32(reg, offset) \ +- (readl(hw->hw_addr + reg + ((offset) << 2))) ++#define E1000_RTTDCS 0x3600 /* Reedtown Tx Desc plane control and status */ ++#define E1000_RTTPCS 0x3474 /* Reedtown Tx Packet Plane control and status */ ++#define E1000_RTRPCS 0x2474 /* Rx packet plane control and status */ ++#define E1000_RTRUP2TC 0x05AC4 /* Rx User Priority to Traffic Class */ ++#define E1000_RTTUP2TC 0x0418 /* Transmit User Priority to Traffic Class */ ++#define E1000_RTTDTCRC(_n) (0x3610 + ((_n) * 4)) /* Tx Desc plane TC Rate-scheduler config */ ++#define E1000_RTTPTCRC(_n) (0x3480 + ((_n) * 4)) /* Tx Packet plane TC Rate-Scheduler Config */ ++#define E1000_RTRPTCRC(_n) (0x2480 + ((_n) * 4)) /* Rx Packet plane TC Rate-Scheduler Config */ ++#define E1000_RTTDTCRS(_n) (0x3630 + ((_n) * 4)) /* Tx Desc Plane TC Rate-Scheduler Status */ ++#define E1000_RTTDTCRM(_n) (0x3650 + ((_n) * 4)) /* Tx Desc Plane TC Rate-Scheduler MMW */ ++#define E1000_RTTPTCRS(_n) (0x34A0 + ((_n) * 4)) /* Tx Packet plane TC Rate-Scheduler Status */ ++#define E1000_RTTPTCRM(_n) (0x34C0 + ((_n) * 4)) /* Tx Packet plane TC Rate-scheduler MMW */ ++#define E1000_RTRPTCRS(_n) (0x24A0 + ((_n) * 4)) /* Rx Packet plane TC Rate-Scheduler Status */ ++#define E1000_RTRPTCRM(_n) (0x24C0 + ((_n) * 4)) /* Rx Packet plane TC Rate-Scheduler MMW */ ++#define E1000_RTTDVMRM(_n) (0x3670 + ((_n) * 4)) /* Tx Desc plane VM Rate-Scheduler MMW*/ ++#define E1000_RTTBCNRM(_n) (0x3690 + ((_n) * 4)) /* Tx BCN Rate-Scheduler MMW */ ++#define E1000_RTTDQSEL 0x3604 /* Tx Desc Plane Queue Select */ ++#define E1000_RTTDVMRC 0x3608 /* Tx Desc Plane VM Rate-Scheduler Config */ ++#define E1000_RTTDVMRS 0x360C /* Tx Desc Plane VM Rate-Scheduler Status */ ++#define E1000_RTTBCNRC 0x36B0 /* Tx BCN Rate-Scheduler Config */ ++#define E1000_RTTBCNRS 0x36B4 /* Tx BCN Rate-Scheduler Status */ ++#define E1000_RTTBCNCR 0xB200 /* Tx BCN Control Register */ ++#define E1000_RTTBCNTG 0x35A4 /* Tx BCN Tagging */ ++#define E1000_RTTBCNCP 0xB208 /* Tx BCN Congestion point */ ++#define E1000_RTRBCNCR 0xB20C /* Rx BCN Control Register */ ++#define E1000_RTTBCNRD 0x36B8 /* Tx BCN Rate Drift */ ++#define E1000_PFCTOP 0x1080 /* Priority Flow Control Type and Opcode */ ++#define E1000_RTTBCNIDX 0xB204 /* Tx BCN Congestion Point */ ++#define E1000_RTTBCNACH 0x0B214 /* Tx BCN Control High */ ++#define E1000_RTTBCNACL 0x0B210 /* Tx BCN Control Low */ + + #endif +diff -r f5806398a14e drivers/net/igb/igb.h +--- a/drivers/net/igb/igb.h Mon Jun 15 11:45:45 2009 +0100 ++++ b/drivers/net/igb/igb.h Mon Jun 15 11:59:49 2009 +0100 +@@ -1,7 +1,7 @@ + /******************************************************************************* + + Intel(R) Gigabit Ethernet Linux driver +- Copyright(c) 2007 Intel Corporation. ++ Copyright(c) 2007-2009 Intel Corporation. + + This program is free software; you can redistribute it and/or modify it + under the terms and conditions of the GNU General Public License, +@@ -31,30 +31,57 @@ + #ifndef _IGB_H_ + #define _IGB_H_ + +-#include "e1000_mac.h" +-#include "e1000_82575.h" ++#include ++#include ++#include ++ ++#ifdef SIOCETHTOOL ++#include ++#endif + + struct igb_adapter; + +-#ifdef CONFIG_IGB_LRO +-#include +-#define MAX_LRO_AGGR 32 +-#define MAX_LRO_DESCRIPTORS 8 ++#if defined(CONFIG_DCA) || defined(CONFIG_DCA_MODULE) ++#define IGB_DCA ++#endif ++#ifdef IGB_DCA ++#include + #endif + ++#ifdef IGB_LRO ++#undef IGB_LRO ++#ifdef NETIF_F_LRO ++#if defined(CONFIG_INET_LRO) || defined(CONFIG_INET_LRO_MODULE) ++#include ++#define MAX_LRO_DESCRIPTORS 8 ++#define IGB_LRO ++#endif ++#endif ++#endif /* IGB_LRO */ ++ ++#include "kcompat.h" ++ ++#include "e1000_api.h" ++#include "e1000_82575.h" ++ ++#define IGB_ERR(args...) printk(KERN_ERR "igb: " args) ++ ++#define PFX "igb: " ++#define DPRINTK(nlevel, klevel, fmt, args...) \ ++ (void)((NETIF_MSG_##nlevel & adapter->msg_enable) && \ ++ printk(KERN_##klevel PFX "%s: %s: " fmt, adapter->netdev->name, \ ++ __FUNCTION__ , ## args)) ++ + /* Interrupt defines */ +-#define IGB_MAX_TX_CLEAN 72 ++#define IGB_START_ITR 648 /* ~6000 ints/sec */ + +-#define IGB_MIN_DYN_ITR 3000 +-#define IGB_MAX_DYN_ITR 96000 ++/* Interrupt modes, as used by the IntMode paramter */ ++#define IGB_INT_MODE_LEGACY 0 ++#define IGB_INT_MODE_MSI 1 ++#define IGB_INT_MODE_MSIX_1Q 2 ++#define IGB_INT_MODE_MSIX_MQ 3 + +-/* ((1000000000ns / (6000ints/s * 1024ns)) << 2 = 648 */ +-#define IGB_START_ITR 648 +- +-#define IGB_DYN_ITR_PACKET_THRESHOLD 2 +-#define IGB_DYN_ITR_LENGTH_LOW 200 +-#define IGB_DYN_ITR_LENGTH_HIGH 1000 +- ++#define HW_PERF + /* TX/RX descriptor defines */ + #define IGB_DEFAULT_TXD 256 + #define IGB_MIN_TXD 80 +@@ -64,13 +91,18 @@ + #define IGB_MIN_RXD 80 + #define IGB_MAX_RXD 4096 + +-#define IGB_DEFAULT_ITR 3 /* dynamic */ +-#define IGB_MAX_ITR_USECS 10000 +-#define IGB_MIN_ITR_USECS 10 ++#define IGB_MIN_ITR_USECS 10 /* 100k irq/sec */ ++#define IGB_MAX_ITR_USECS 10000 /* 100 irq/sec */ + + /* Transmit and receive queues */ ++#ifndef CONFIG_IGB_SEPARATE_TX_HANDLER ++#define IGB_MAX_RX_QUEUES (hw->mac.type > e1000_82575 ? 8 : 4) ++#define IGB_ABS_MAX_TX_QUEUES 8 ++#else /* CONFIG_IGB_SEPARATE_TX_HANDLER */ + #define IGB_MAX_RX_QUEUES 4 +-#define IGB_MAX_TX_QUEUES 4 ++#define IGB_ABS_MAX_TX_QUEUES 4 ++#endif /* CONFIG_IGB_SEPARATE_TX_HANDLER */ ++#define IGB_MAX_TX_QUEUES IGB_MAX_RX_QUEUES + + /* RX descriptor control thresholds. + * PTHRESH - MAC will consider prefetch if it has fewer than this number of +@@ -101,10 +133,14 @@ + #define IGB_RXBUFFER_16384 16384 + + /* Packet Buffer allocations */ ++#define IGB_PBA_BYTES_SHIFT 0xA ++#define IGB_TX_HEAD_ADDR_SHIFT 7 ++#define IGB_PBA_TX_MASK 0xFFFF0000 + ++#define IGB_FC_PAUSE_TIME 0x0680 /* 858 usec */ + + /* How many Tx Descriptors do we need to call netif_wake_queue ? */ +-#define IGB_TX_QUEUE_WAKE 16 ++#define IGB_TX_QUEUE_WAKE 32 + /* How many Rx Buffers do we bundle into one write to the hardware ? */ + #define IGB_RX_BUFFER_WRITE 16 /* Must be power of 2 */ + +@@ -127,14 +163,18 @@ + /* TX */ + struct { + unsigned long time_stamp; +- u32 length; ++ u16 length; ++ u16 next_to_watch; + }; ++ ++#ifndef CONFIG_IGB_DISABLE_PACKET_SPLIT + /* RX */ + struct { + struct page *page; + u64 page_dma; + unsigned int page_offset; + }; ++#endif + }; + }; + +@@ -160,10 +200,13 @@ + u16 itr_register; + u16 cpu; + +- int queue_index; ++ u16 queue_index; ++ u16 reg_idx; ++ + unsigned int total_bytes; + unsigned int total_packets; + ++ char name[IFNAMSIZ + 9]; + union { + /* TX */ + struct { +@@ -176,15 +219,14 @@ + struct napi_struct napi; + int set_itr; + struct igb_ring *buddy; +-#ifdef CONFIG_IGB_LRO ++#ifdef IGB_LRO + struct net_lro_mgr lro_mgr; + bool lro_used; + #endif + }; + }; ++}; + +- char name[IFNAMSIZ + 5]; +-}; + + #define IGB_DESC_UNUSED(R) \ + ((((R)->next_to_clean > (R)->next_to_use) ? 0 : (R)->count) + \ +@@ -200,6 +242,7 @@ + #define E1000_TX_DESC(R, i) E1000_GET_DESC(R, i, e1000_tx_desc) + #define E1000_RX_DESC(R, i) E1000_GET_DESC(R, i, e1000_rx_desc) + ++#define MAX_MSIX_COUNT 10 + /* board specific private data structure */ + + struct igb_adapter { +@@ -213,6 +256,7 @@ + u32 en_mng_pt; + u16 link_speed; + u16 link_duplex; ++ + unsigned int total_tx_bytes; + unsigned int total_tx_packets; + unsigned int total_rx_bytes; +@@ -227,18 +271,16 @@ + struct work_struct watchdog_task; + bool fc_autoneg; + u8 tx_timeout_factor; ++#ifdef ETHTOOL_PHYS_ID + struct timer_list blink_timer; + unsigned long led_status; ++#endif + + /* TX */ + struct igb_ring *tx_ring; /* One per active queue */ + unsigned int restart_queue; + unsigned long tx_queue_len; + u32 txd_cmd; +- u32 gotc; +- u64 gotc_old; +- u64 tpt_old; +- u64 colc_old; + u32 tx_timeout_count; + + /* RX */ +@@ -248,18 +290,14 @@ + + u64 hw_csum_err; + u64 hw_csum_good; +- u64 rx_hdr_split; + u32 alloc_rx_buff_failed; + bool rx_csum; +- u32 gorc; +- u64 gorc_old; + u16 rx_ps_hdr_size; + u32 max_frame_size; + u32 min_frame_size; + + /* OS defined structs */ + struct net_device *netdev; +- struct napi_struct napi; + struct pci_dev *pdev; + struct net_device_stats net_stats; + +@@ -269,26 +307,29 @@ + struct e1000_phy_info phy_info; + struct e1000_phy_stats phy_stats; + ++#ifdef ETHTOOL_TEST + u32 test_icr; + struct igb_ring test_tx_ring; + struct igb_ring test_rx_ring; ++#endif ++ + + int msg_enable; + struct msix_entry *msix_entries; ++ int int_mode; + u32 eims_enable_mask; + u32 eims_other; +- +- /* to not mess up cache alignment, always add to the bottom */ ++ u32 lli_port; ++ u32 lli_size; ++ u64 lli_int; + unsigned long state; + unsigned int flags; + u32 eeprom_wol; +- +- /* for ioport free */ +- int bars; +- int need_ioport; +- +- struct igb_ring *multi_tx_table[IGB_MAX_TX_QUEUES]; +-#ifdef CONFIG_IGB_LRO ++ u32 *config_space; ++#ifdef HAVE_TX_MQ ++ struct igb_ring *multi_tx_table[IGB_ABS_MAX_TX_QUEUES]; ++#endif /* HAVE_TX_MQ */ ++#ifdef IGB_LRO + unsigned int lro_max_aggr; + unsigned int lro_aggregated; + unsigned int lro_flushed; +@@ -298,10 +339,12 @@ + unsigned int rx_ring_count; + }; + ++ + #define IGB_FLAG_HAS_MSI (1 << 0) + #define IGB_FLAG_MSI_ENABLE (1 << 1) + #define IGB_FLAG_HAS_DCA (1 << 2) + #define IGB_FLAG_DCA_ENABLED (1 << 3) ++#define IGB_FLAG_LLI_PUSH (1 << 4) + #define IGB_FLAG_IN_NETPOLL (1 << 5) + #define IGB_FLAG_QUAD_PORT_A (1 << 6) + #define IGB_FLAG_NEED_CTX_IDX (1 << 7) +@@ -312,14 +355,9 @@ + __IGB_DOWN + }; + +-enum igb_boards { +- board_82575, +-}; +- + extern char igb_driver_name[]; + extern char igb_driver_version[]; + +-extern char *igb_get_hw_dev_name(struct e1000_hw *hw); + extern int igb_up(struct igb_adapter *); + extern void igb_down(struct igb_adapter *); + extern void igb_reinit_locked(struct igb_adapter *); +@@ -331,5 +369,9 @@ + extern void igb_free_rx_resources(struct igb_ring *); + extern void igb_update_stats(struct igb_adapter *); + extern void igb_set_ethtool_ops(struct net_device *); ++extern void igb_check_options(struct igb_adapter *); ++#ifdef ETHTOOL_OPS_COMPAT ++extern int ethtool_ioctl(struct ifreq *); ++#endif + + #endif /* _IGB_H_ */ +diff -r f5806398a14e drivers/net/igb/igb_ethtool.c +--- a/drivers/net/igb/igb_ethtool.c Mon Jun 15 11:45:45 2009 +0100 ++++ b/drivers/net/igb/igb_ethtool.c Mon Jun 15 11:59:49 2009 +0100 +@@ -1,7 +1,7 @@ + /******************************************************************************* + + Intel(R) Gigabit Ethernet Linux driver +- Copyright(c) 2007 Intel Corporation. ++ Copyright(c) 2007-2009 Intel Corporation. + + This program is free software; you can redistribute it and/or modify it + under the terms and conditions of the GNU General Public License, +@@ -27,23 +27,28 @@ + + /* ethtool support for igb */ + ++#include + #include +-#include +-#include +-#include +-#include +-#include ++ ++#ifdef SIOCETHTOOL + #include + + #include "igb.h" ++#include "igb_regtest.h" ++#include + ++#ifdef ETHTOOL_OPS_COMPAT ++#include "kcompat_ethtool.c" ++#endif ++ ++#ifdef ETHTOOL_GSTATS + struct igb_stats { + char stat_string[ETH_GSTRING_LEN]; + int sizeof_stat; + int stat_offset; + }; + +-#define IGB_STAT(m) FIELD_SIZEOF(struct igb_adapter, m), \ ++#define IGB_STAT(m) sizeof(((struct igb_adapter *)0)->m), \ + offsetof(struct igb_adapter, m) + static const struct igb_stats igb_gstrings_stats[] = { + { "rx_packets", IGB_STAT(stats.gprc) }, +@@ -88,12 +93,13 @@ + { "rx_long_byte_count", IGB_STAT(stats.gorc) }, + { "rx_csum_offload_good", IGB_STAT(hw_csum_good) }, + { "rx_csum_offload_errors", IGB_STAT(hw_csum_err) }, +- { "rx_header_split", IGB_STAT(rx_hdr_split) }, ++ { "tx_dma_out_of_sync", IGB_STAT(stats.doosync) }, ++ { "low_latency_interrupt", IGB_STAT(lli_int)}, + { "alloc_rx_buff_failed", IGB_STAT(alloc_rx_buff_failed) }, + { "tx_smbus", IGB_STAT(stats.mgptc) }, + { "rx_smbus", IGB_STAT(stats.mgprc) }, + { "dropped_smbus", IGB_STAT(stats.mgpdc) }, +-#ifdef CONFIG_IGB_LRO ++#ifdef IGB_LRO + { "lro_aggregated", IGB_STAT(lro_aggregated) }, + { "lro_flushed", IGB_STAT(lro_flushed) }, + { "lro_no_desc", IGB_STAT(lro_no_desc) }, +@@ -101,33 +107,37 @@ + }; + + #define IGB_QUEUE_STATS_LEN \ +- ((((struct igb_adapter *)netdev->priv)->num_rx_queues + \ +- ((struct igb_adapter *)netdev->priv)->num_tx_queues) * \ ++ ((((struct igb_adapter *)netdev_priv(netdev))->num_rx_queues + \ ++ ((struct igb_adapter *)netdev_priv(netdev))->num_tx_queues) * \ + (sizeof(struct igb_queue_stats) / sizeof(u64))) + #define IGB_GLOBAL_STATS_LEN \ + sizeof(igb_gstrings_stats) / sizeof(struct igb_stats) + #define IGB_STATS_LEN (IGB_GLOBAL_STATS_LEN + IGB_QUEUE_STATS_LEN) ++#endif /* ETHTOOL_GSTATS */ ++#ifdef ETHTOOL_TEST + static const char igb_gstrings_test[][ETH_GSTRING_LEN] = { + "Register test (offline)", "Eeprom test (offline)", + "Interrupt test (offline)", "Loopback test (offline)", + "Link test (on/offline)" + }; + #define IGB_TEST_LEN sizeof(igb_gstrings_test) / ETH_GSTRING_LEN ++#endif /* ETHTOOL_TEST */ + + static int igb_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd) + { + struct igb_adapter *adapter = netdev_priv(netdev); + struct e1000_hw *hw = &adapter->hw; ++ u32 status; + + if (hw->phy.media_type == e1000_media_type_copper) { + + ecmd->supported = (SUPPORTED_10baseT_Half | +- SUPPORTED_10baseT_Full | +- SUPPORTED_100baseT_Half | +- SUPPORTED_100baseT_Full | +- SUPPORTED_1000baseT_Full| +- SUPPORTED_Autoneg | +- SUPPORTED_TP); ++ SUPPORTED_10baseT_Full | ++ SUPPORTED_100baseT_Half | ++ SUPPORTED_100baseT_Full | ++ SUPPORTED_1000baseT_Full| ++ SUPPORTED_Autoneg | ++ SUPPORTED_TP); + ecmd->advertising = ADVERTISED_TP; + + if (hw->mac.autoneg == 1) { +@@ -152,17 +162,20 @@ + + ecmd->transceiver = XCVR_INTERNAL; + +- if (rd32(E1000_STATUS) & E1000_STATUS_LU) { ++ status = E1000_READ_REG(hw, E1000_STATUS); + +- adapter->hw.mac.ops.get_speed_and_duplex(hw, +- &adapter->link_speed, +- &adapter->link_duplex); +- ecmd->speed = adapter->link_speed; ++ if (status & E1000_STATUS_LU) { + +- /* unfortunately FULL_DUPLEX != DUPLEX_FULL +- * and HALF_DUPLEX != DUPLEX_HALF */ ++ if ((status & E1000_STATUS_SPEED_1000) || ++ hw->phy.media_type != e1000_media_type_copper) ++ ecmd->speed = SPEED_1000; ++ else if (status & E1000_STATUS_SPEED_100) ++ ecmd->speed = SPEED_100; ++ else ++ ecmd->speed = SPEED_10; + +- if (adapter->link_duplex == FULL_DUPLEX) ++ if ((status & E1000_STATUS_FD) || ++ hw->phy.media_type != e1000_media_type_copper) + ecmd->duplex = DUPLEX_FULL; + else + ecmd->duplex = DUPLEX_HALF; +@@ -183,9 +196,9 @@ + + /* When SoL/IDER sessions are active, autoneg/speed/duplex + * cannot be changed */ +- if (igb_check_reset_block(hw)) { +- dev_err(&adapter->pdev->dev, "Cannot change link " +- "characteristics when SoL/IDER is active.\n"); ++ if (e1000_check_reset_block(hw)) { ++ DPRINTK(DRV, ERR, "Cannot change link characteristics " ++ "when SoL/IDER is active.\n"); + return -EINVAL; + } + +@@ -196,21 +209,23 @@ + hw->mac.autoneg = 1; + if (hw->phy.media_type == e1000_media_type_fiber) + hw->phy.autoneg_advertised = ADVERTISED_1000baseT_Full | +- ADVERTISED_FIBRE | +- ADVERTISED_Autoneg; ++ ADVERTISED_FIBRE | ++ ADVERTISED_Autoneg; + else + hw->phy.autoneg_advertised = ecmd->advertising | +- ADVERTISED_TP | +- ADVERTISED_Autoneg; ++ ADVERTISED_TP | ++ ADVERTISED_Autoneg; + ecmd->advertising = hw->phy.autoneg_advertised; +- } else ++ if (adapter->fc_autoneg) ++ hw->fc.requested_mode = e1000_fc_default; ++ } else { + if (igb_set_spd_dplx(adapter, ecmd->speed + ecmd->duplex)) { + clear_bit(__IGB_RESETTING, &adapter->state); + return -EINVAL; + } ++ } + + /* reset the link */ +- + if (netif_running(adapter->netdev)) { + igb_down(adapter); + igb_up(adapter); +@@ -222,7 +237,7 @@ + } + + static void igb_get_pauseparam(struct net_device *netdev, +- struct ethtool_pauseparam *pause) ++ struct ethtool_pauseparam *pause) + { + struct igb_adapter *adapter = netdev_priv(netdev); + struct e1000_hw *hw = &adapter->hw; +@@ -230,18 +245,18 @@ + pause->autoneg = + (adapter->fc_autoneg ? AUTONEG_ENABLE : AUTONEG_DISABLE); + +- if (hw->fc.type == e1000_fc_rx_pause) ++ if (hw->fc.current_mode == e1000_fc_rx_pause) + pause->rx_pause = 1; +- else if (hw->fc.type == e1000_fc_tx_pause) ++ else if (hw->fc.current_mode == e1000_fc_tx_pause) + pause->tx_pause = 1; +- else if (hw->fc.type == e1000_fc_full) { ++ else if (hw->fc.current_mode == e1000_fc_full) { + pause->rx_pause = 1; + pause->tx_pause = 1; + } + } + + static int igb_set_pauseparam(struct net_device *netdev, +- struct ethtool_pauseparam *pause) ++ struct ethtool_pauseparam *pause) + { + struct igb_adapter *adapter = netdev_priv(netdev); + struct e1000_hw *hw = &adapter->hw; +@@ -252,26 +267,29 @@ + while (test_and_set_bit(__IGB_RESETTING, &adapter->state)) + msleep(1); + +- if (pause->rx_pause && pause->tx_pause) +- hw->fc.type = e1000_fc_full; +- else if (pause->rx_pause && !pause->tx_pause) +- hw->fc.type = e1000_fc_rx_pause; +- else if (!pause->rx_pause && pause->tx_pause) +- hw->fc.type = e1000_fc_tx_pause; +- else if (!pause->rx_pause && !pause->tx_pause) +- hw->fc.type = e1000_fc_none; +- +- hw->fc.original_type = hw->fc.type; +- + if (adapter->fc_autoneg == AUTONEG_ENABLE) { ++ hw->fc.requested_mode = e1000_fc_default; + if (netif_running(adapter->netdev)) { + igb_down(adapter); + igb_up(adapter); +- } else ++ } else { + igb_reset(adapter); +- } else +- retval = ((hw->phy.media_type == e1000_media_type_fiber) ? +- igb_setup_link(hw) : igb_force_mac_fc(hw)); ++ } ++ } else { ++ if (pause->rx_pause && pause->tx_pause) ++ hw->fc.requested_mode = e1000_fc_full; ++ else if (pause->rx_pause && !pause->tx_pause) ++ hw->fc.requested_mode = e1000_fc_rx_pause; ++ else if (!pause->rx_pause && pause->tx_pause) ++ hw->fc.requested_mode = e1000_fc_tx_pause; ++ else if (!pause->rx_pause && !pause->tx_pause) ++ hw->fc.requested_mode = e1000_fc_none; ++ ++ hw->fc.current_mode = hw->fc.requested_mode; ++ ++ retval = ((hw->phy.media_type == e1000_media_type_copper) ? ++ e1000_force_mac_fc(hw) : hw->mac.ops.setup_link(hw)); ++ } + + clear_bit(__IGB_RESETTING, &adapter->state); + return retval; +@@ -293,37 +311,63 @@ + + static u32 igb_get_tx_csum(struct net_device *netdev) + { +- return (netdev->features & NETIF_F_HW_CSUM) != 0; ++ return (netdev->features & NETIF_F_IP_CSUM) != 0; + } + + static int igb_set_tx_csum(struct net_device *netdev, u32 data) + { + if (data) +- netdev->features |= NETIF_F_HW_CSUM; ++#ifdef NETIF_F_IPV6_CSUM ++ netdev->features |= (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM); + else +- netdev->features &= ~NETIF_F_HW_CSUM; ++ netdev->features &= ~(NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM); ++#else ++ netdev->features |= NETIF_F_IP_CSUM; ++ else ++ netdev->features &= ~NETIF_F_IP_CSUM; ++#endif + + return 0; + } + ++#ifdef NETIF_F_TSO + static int igb_set_tso(struct net_device *netdev, u32 data) + { + struct igb_adapter *adapter = netdev_priv(netdev); ++ int i; ++ struct net_device *v_netdev; + +- if (data) ++ if (data) { + netdev->features |= NETIF_F_TSO; +- else ++#ifdef NETIF_F_TSO6 ++ netdev->features |= NETIF_F_TSO6; ++#endif ++ } else { + netdev->features &= ~NETIF_F_TSO; ++#ifdef NETIF_F_TSO6 ++ netdev->features &= ~NETIF_F_TSO6; ++#endif ++ /* disable TSO on all VLANs if they're present */ ++ if (!adapter->vlgrp) ++ goto tso_out; ++ for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) { ++ v_netdev = vlan_group_get_device(adapter->vlgrp, i); ++ if (!v_netdev) ++ continue; + +- if (data) +- netdev->features |= NETIF_F_TSO6; +- else +- netdev->features &= ~NETIF_F_TSO6; ++ v_netdev->features &= ~NETIF_F_TSO; ++#ifdef NETIF_F_TSO6 ++ v_netdev->features &= ~NETIF_F_TSO6; ++#endif ++ vlan_group_set_device(adapter->vlgrp, i, v_netdev); ++ } ++ } + +- dev_info(&adapter->pdev->dev, "TSO is %s\n", +- data ? "Enabled" : "Disabled"); ++tso_out: ++ DPRINTK(PROBE, INFO, "TSO is %s\n", data ? "Enabled" : "Disabled"); + return 0; + } ++#endif /* NETIF_F_TSO */ + + static u32 igb_get_msglevel(struct net_device *netdev) + { +@@ -344,7 +388,7 @@ + } + + static void igb_get_regs(struct net_device *netdev, +- struct ethtool_regs *regs, void *p) ++ struct ethtool_regs *regs, void *p) + { + struct igb_adapter *adapter = netdev_priv(netdev); + struct e1000_hw *hw = &adapter->hw; +@@ -356,78 +400,78 @@ + regs->version = (1 << 24) | (hw->revision_id << 16) | hw->device_id; + + /* General Registers */ +- regs_buff[0] = rd32(E1000_CTRL); +- regs_buff[1] = rd32(E1000_STATUS); +- regs_buff[2] = rd32(E1000_CTRL_EXT); +- regs_buff[3] = rd32(E1000_MDIC); +- regs_buff[4] = rd32(E1000_SCTL); +- regs_buff[5] = rd32(E1000_CONNSW); +- regs_buff[6] = rd32(E1000_VET); +- regs_buff[7] = rd32(E1000_LEDCTL); +- regs_buff[8] = rd32(E1000_PBA); +- regs_buff[9] = rd32(E1000_PBS); +- regs_buff[10] = rd32(E1000_FRTIMER); +- regs_buff[11] = rd32(E1000_TCPTIMER); ++ regs_buff[0] = E1000_READ_REG(hw, E1000_CTRL); ++ regs_buff[1] = E1000_READ_REG(hw, E1000_STATUS); ++ regs_buff[2] = E1000_READ_REG(hw, E1000_CTRL_EXT); ++ regs_buff[3] = E1000_READ_REG(hw, E1000_MDIC); ++ regs_buff[4] = E1000_READ_REG(hw, E1000_SCTL); ++ regs_buff[5] = E1000_READ_REG(hw, E1000_CONNSW); ++ regs_buff[6] = E1000_READ_REG(hw, E1000_VET); ++ regs_buff[7] = E1000_READ_REG(hw, E1000_LEDCTL); ++ regs_buff[8] = E1000_READ_REG(hw, E1000_PBA); ++ regs_buff[9] = E1000_READ_REG(hw, E1000_PBS); ++ regs_buff[10] = E1000_READ_REG(hw, E1000_FRTIMER); ++ regs_buff[11] = E1000_READ_REG(hw, E1000_TCPTIMER); + + /* NVM Register */ +- regs_buff[12] = rd32(E1000_EECD); ++ regs_buff[12] = E1000_READ_REG(hw, E1000_EECD); + + /* Interrupt */ + /* Reading EICS for EICR because they read the + * same but EICS does not clear on read */ +- regs_buff[13] = rd32(E1000_EICS); +- regs_buff[14] = rd32(E1000_EICS); +- regs_buff[15] = rd32(E1000_EIMS); +- regs_buff[16] = rd32(E1000_EIMC); +- regs_buff[17] = rd32(E1000_EIAC); +- regs_buff[18] = rd32(E1000_EIAM); ++ regs_buff[13] = E1000_READ_REG(hw, E1000_EICS); ++ regs_buff[14] = E1000_READ_REG(hw, E1000_EICS); ++ regs_buff[15] = E1000_READ_REG(hw, E1000_EIMS); ++ regs_buff[16] = E1000_READ_REG(hw, E1000_EIMC); ++ regs_buff[17] = E1000_READ_REG(hw, E1000_EIAC); ++ regs_buff[18] = E1000_READ_REG(hw, E1000_EIAM); + /* Reading ICS for ICR because they read the + * same but ICS does not clear on read */ +- regs_buff[19] = rd32(E1000_ICS); +- regs_buff[20] = rd32(E1000_ICS); +- regs_buff[21] = rd32(E1000_IMS); +- regs_buff[22] = rd32(E1000_IMC); +- regs_buff[23] = rd32(E1000_IAC); +- regs_buff[24] = rd32(E1000_IAM); +- regs_buff[25] = rd32(E1000_IMIRVP); ++ regs_buff[19] = E1000_READ_REG(hw, E1000_ICS); ++ regs_buff[20] = E1000_READ_REG(hw, E1000_ICS); ++ regs_buff[21] = E1000_READ_REG(hw, E1000_IMS); ++ regs_buff[22] = E1000_READ_REG(hw, E1000_IMC); ++ regs_buff[23] = E1000_READ_REG(hw, E1000_IAC); ++ regs_buff[24] = E1000_READ_REG(hw, E1000_IAM); ++ regs_buff[25] = E1000_READ_REG(hw, E1000_IMIRVP); + + /* Flow Control */ +- regs_buff[26] = rd32(E1000_FCAL); +- regs_buff[27] = rd32(E1000_FCAH); +- regs_buff[28] = rd32(E1000_FCTTV); +- regs_buff[29] = rd32(E1000_FCRTL); +- regs_buff[30] = rd32(E1000_FCRTH); +- regs_buff[31] = rd32(E1000_FCRTV); ++ regs_buff[26] = E1000_READ_REG(hw, E1000_FCAL); ++ regs_buff[27] = E1000_READ_REG(hw, E1000_FCAH); ++ regs_buff[28] = E1000_READ_REG(hw, E1000_FCTTV); ++ regs_buff[29] = E1000_READ_REG(hw, E1000_FCRTL); ++ regs_buff[30] = E1000_READ_REG(hw, E1000_FCRTH); ++ regs_buff[31] = E1000_READ_REG(hw, E1000_FCRTV); + + /* Receive */ +- regs_buff[32] = rd32(E1000_RCTL); +- regs_buff[33] = rd32(E1000_RXCSUM); +- regs_buff[34] = rd32(E1000_RLPML); +- regs_buff[35] = rd32(E1000_RFCTL); +- regs_buff[36] = rd32(E1000_MRQC); +- regs_buff[37] = rd32(E1000_VMD_CTL); ++ regs_buff[32] = E1000_READ_REG(hw, E1000_RCTL); ++ regs_buff[33] = E1000_READ_REG(hw, E1000_RXCSUM); ++ regs_buff[34] = E1000_READ_REG(hw, E1000_RLPML); ++ regs_buff[35] = E1000_READ_REG(hw, E1000_RFCTL); ++ regs_buff[36] = E1000_READ_REG(hw, E1000_MRQC); ++ regs_buff[37] = E1000_READ_REG(hw, E1000_VT_CTL); + + /* Transmit */ +- regs_buff[38] = rd32(E1000_TCTL); +- regs_buff[39] = rd32(E1000_TCTL_EXT); +- regs_buff[40] = rd32(E1000_TIPG); +- regs_buff[41] = rd32(E1000_DTXCTL); ++ regs_buff[38] = E1000_READ_REG(hw, E1000_TCTL); ++ regs_buff[39] = E1000_READ_REG(hw, E1000_TCTL_EXT); ++ regs_buff[40] = E1000_READ_REG(hw, E1000_TIPG); ++ regs_buff[41] = E1000_READ_REG(hw, E1000_DTXCTL); + + /* Wake Up */ +- regs_buff[42] = rd32(E1000_WUC); +- regs_buff[43] = rd32(E1000_WUFC); +- regs_buff[44] = rd32(E1000_WUS); +- regs_buff[45] = rd32(E1000_IPAV); +- regs_buff[46] = rd32(E1000_WUPL); ++ regs_buff[42] = E1000_READ_REG(hw, E1000_WUC); ++ regs_buff[43] = E1000_READ_REG(hw, E1000_WUFC); ++ regs_buff[44] = E1000_READ_REG(hw, E1000_WUS); ++ regs_buff[45] = E1000_READ_REG(hw, E1000_IPAV); ++ regs_buff[46] = E1000_READ_REG(hw, E1000_WUPL); + + /* MAC */ +- regs_buff[47] = rd32(E1000_PCS_CFG0); +- regs_buff[48] = rd32(E1000_PCS_LCTL); +- regs_buff[49] = rd32(E1000_PCS_LSTAT); +- regs_buff[50] = rd32(E1000_PCS_ANADV); +- regs_buff[51] = rd32(E1000_PCS_LPAB); +- regs_buff[52] = rd32(E1000_PCS_NPTX); +- regs_buff[53] = rd32(E1000_PCS_LPABNP); ++ regs_buff[47] = E1000_READ_REG(hw, E1000_PCS_CFG0); ++ regs_buff[48] = E1000_READ_REG(hw, E1000_PCS_LCTL); ++ regs_buff[49] = E1000_READ_REG(hw, E1000_PCS_LSTAT); ++ regs_buff[50] = E1000_READ_REG(hw, E1000_PCS_ANADV); ++ regs_buff[51] = E1000_READ_REG(hw, E1000_PCS_LPAB); ++ regs_buff[52] = E1000_READ_REG(hw, E1000_PCS_NPTX); ++ regs_buff[53] = E1000_READ_REG(hw, E1000_PCS_LPABNP); + + /* Statistics */ + regs_buff[54] = adapter->stats.crcerrs; +@@ -492,81 +536,70 @@ + regs_buff[119] = adapter->stats.scvpc; + regs_buff[120] = adapter->stats.hrmpc; + +- /* These should probably be added to e1000_regs.h instead */ +- #define E1000_PSRTYPE_REG(_i) (0x05480 + ((_i) * 4)) +- #define E1000_RAL(_i) (0x05400 + ((_i) * 8)) +- #define E1000_RAH(_i) (0x05404 + ((_i) * 8)) +- #define E1000_IP4AT_REG(_i) (0x05840 + ((_i) * 8)) +- #define E1000_IP6AT_REG(_i) (0x05880 + ((_i) * 4)) +- #define E1000_WUPM_REG(_i) (0x05A00 + ((_i) * 4)) +- #define E1000_FFMT_REG(_i) (0x09000 + ((_i) * 8)) +- #define E1000_FFVT_REG(_i) (0x09800 + ((_i) * 8)) +- #define E1000_FFLT_REG(_i) (0x05F00 + ((_i) * 8)) ++ for (i = 0; i < 4; i++) ++ regs_buff[121 + i] = E1000_READ_REG(hw, E1000_SRRCTL(i)); ++ for (i = 0; i < 4; i++) ++ regs_buff[125 + i] = E1000_READ_REG(hw, E1000_PSRTYPE(i)); ++ for (i = 0; i < 4; i++) ++ regs_buff[129 + i] = E1000_READ_REG(hw, E1000_RDBAL(i)); ++ for (i = 0; i < 4; i++) ++ regs_buff[133 + i] = E1000_READ_REG(hw, E1000_RDBAH(i)); ++ for (i = 0; i < 4; i++) ++ regs_buff[137 + i] = E1000_READ_REG(hw, E1000_RDLEN(i)); ++ for (i = 0; i < 4; i++) ++ regs_buff[141 + i] = E1000_READ_REG(hw, E1000_RDH(i)); ++ for (i = 0; i < 4; i++) ++ regs_buff[145 + i] = E1000_READ_REG(hw, E1000_RDT(i)); ++ for (i = 0; i < 4; i++) ++ regs_buff[149 + i] = E1000_READ_REG(hw, E1000_RXDCTL(i)); ++ ++ for (i = 0; i < 10; i++) ++ regs_buff[153 + i] = E1000_READ_REG(hw, E1000_EITR(i)); ++ for (i = 0; i < 8; i++) ++ regs_buff[163 + i] = E1000_READ_REG(hw, E1000_IMIR(i)); ++ for (i = 0; i < 8; i++) ++ regs_buff[171 + i] = E1000_READ_REG(hw, E1000_IMIREXT(i)); ++ for (i = 0; i < 16; i++) ++ regs_buff[179 + i] = E1000_READ_REG(hw, E1000_RAL(i)); ++ for (i = 0; i < 16; i++) ++ regs_buff[195 + i] = E1000_READ_REG(hw, E1000_RAH(i)); + + for (i = 0; i < 4; i++) +- regs_buff[121 + i] = rd32(E1000_SRRCTL(i)); ++ regs_buff[211 + i] = E1000_READ_REG(hw, E1000_TDBAL(i)); + for (i = 0; i < 4; i++) +- regs_buff[125 + i] = rd32(E1000_PSRTYPE_REG(i)); ++ regs_buff[215 + i] = E1000_READ_REG(hw, E1000_TDBAH(i)); + for (i = 0; i < 4; i++) +- regs_buff[129 + i] = rd32(E1000_RDBAL(i)); ++ regs_buff[219 + i] = E1000_READ_REG(hw, E1000_TDLEN(i)); + for (i = 0; i < 4; i++) +- regs_buff[133 + i] = rd32(E1000_RDBAH(i)); ++ regs_buff[223 + i] = E1000_READ_REG(hw, E1000_TDH(i)); + for (i = 0; i < 4; i++) +- regs_buff[137 + i] = rd32(E1000_RDLEN(i)); ++ regs_buff[227 + i] = E1000_READ_REG(hw, E1000_TDT(i)); + for (i = 0; i < 4; i++) +- regs_buff[141 + i] = rd32(E1000_RDH(i)); ++ regs_buff[231 + i] = E1000_READ_REG(hw, E1000_TXDCTL(i)); + for (i = 0; i < 4; i++) +- regs_buff[145 + i] = rd32(E1000_RDT(i)); ++ regs_buff[235 + i] = E1000_READ_REG(hw, E1000_TDWBAL(i)); + for (i = 0; i < 4; i++) +- regs_buff[149 + i] = rd32(E1000_RXDCTL(i)); +- +- for (i = 0; i < 10; i++) +- regs_buff[153 + i] = rd32(E1000_EITR(i)); +- for (i = 0; i < 8; i++) +- regs_buff[163 + i] = rd32(E1000_IMIR(i)); +- for (i = 0; i < 8; i++) +- regs_buff[171 + i] = rd32(E1000_IMIREXT(i)); +- for (i = 0; i < 16; i++) +- regs_buff[179 + i] = rd32(E1000_RAL(i)); +- for (i = 0; i < 16; i++) +- regs_buff[195 + i] = rd32(E1000_RAH(i)); ++ regs_buff[239 + i] = E1000_READ_REG(hw, E1000_TDWBAH(i)); ++ for (i = 0; i < 4; i++) ++ regs_buff[243 + i] = E1000_READ_REG(hw, E1000_DCA_TXCTRL(i)); + + for (i = 0; i < 4; i++) +- regs_buff[211 + i] = rd32(E1000_TDBAL(i)); ++ regs_buff[247 + i] = E1000_READ_REG(hw, E1000_IP4AT_REG(i)); + for (i = 0; i < 4; i++) +- regs_buff[215 + i] = rd32(E1000_TDBAH(i)); ++ regs_buff[251 + i] = E1000_READ_REG(hw, E1000_IP6AT_REG(i)); ++ for (i = 0; i < 32; i++) ++ regs_buff[255 + i] = E1000_READ_REG(hw, E1000_WUPM_REG(i)); ++ for (i = 0; i < 128; i++) ++ regs_buff[287 + i] = E1000_READ_REG(hw, E1000_FFMT_REG(i)); ++ for (i = 0; i < 128; i++) ++ regs_buff[415 + i] = E1000_READ_REG(hw, E1000_FFVT_REG(i)); + for (i = 0; i < 4; i++) +- regs_buff[219 + i] = rd32(E1000_TDLEN(i)); +- for (i = 0; i < 4; i++) +- regs_buff[223 + i] = rd32(E1000_TDH(i)); +- for (i = 0; i < 4; i++) +- regs_buff[227 + i] = rd32(E1000_TDT(i)); +- for (i = 0; i < 4; i++) +- regs_buff[231 + i] = rd32(E1000_TXDCTL(i)); +- for (i = 0; i < 4; i++) +- regs_buff[235 + i] = rd32(E1000_TDWBAL(i)); +- for (i = 0; i < 4; i++) +- regs_buff[239 + i] = rd32(E1000_TDWBAH(i)); +- for (i = 0; i < 4; i++) +- regs_buff[243 + i] = rd32(E1000_DCA_TXCTRL(i)); ++ regs_buff[543 + i] = E1000_READ_REG(hw, E1000_FFLT_REG(i)); + +- for (i = 0; i < 4; i++) +- regs_buff[247 + i] = rd32(E1000_IP4AT_REG(i)); +- for (i = 0; i < 4; i++) +- regs_buff[251 + i] = rd32(E1000_IP6AT_REG(i)); +- for (i = 0; i < 32; i++) +- regs_buff[255 + i] = rd32(E1000_WUPM_REG(i)); +- for (i = 0; i < 128; i++) +- regs_buff[287 + i] = rd32(E1000_FFMT_REG(i)); +- for (i = 0; i < 128; i++) +- regs_buff[415 + i] = rd32(E1000_FFVT_REG(i)); +- for (i = 0; i < 4; i++) +- regs_buff[543 + i] = rd32(E1000_FFLT_REG(i)); +- +- regs_buff[547] = rd32(E1000_TDFH); +- regs_buff[548] = rd32(E1000_TDFT); +- regs_buff[549] = rd32(E1000_TDFHS); +- regs_buff[550] = rd32(E1000_TDFPC); ++ regs_buff[547] = E1000_READ_REG(hw, E1000_TDFH); ++ regs_buff[548] = E1000_READ_REG(hw, E1000_TDFT); ++ regs_buff[549] = E1000_READ_REG(hw, E1000_TDFHS); ++ regs_buff[550] = E1000_READ_REG(hw, E1000_TDFPC); + + } + +@@ -577,7 +610,7 @@ + } + + static int igb_get_eeprom(struct net_device *netdev, +- struct ethtool_eeprom *eeprom, u8 *bytes) ++ struct ethtool_eeprom *eeprom, u8 *bytes) + { + struct igb_adapter *adapter = netdev_priv(netdev); + struct e1000_hw *hw = &adapter->hw; +@@ -600,13 +633,13 @@ + return -ENOMEM; + + if (hw->nvm.type == e1000_nvm_eeprom_spi) +- ret_val = hw->nvm.ops.read_nvm(hw, first_word, +- last_word - first_word + 1, +- eeprom_buff); ++ ret_val = e1000_read_nvm(hw, first_word, ++ last_word - first_word + 1, ++ eeprom_buff); + else { + for (i = 0; i < last_word - first_word + 1; i++) { +- ret_val = hw->nvm.ops.read_nvm(hw, first_word + i, 1, +- &eeprom_buff[i]); ++ ret_val = e1000_read_nvm(hw, first_word + i, 1, ++ &eeprom_buff[i]); + if (ret_val) + break; + } +@@ -624,7 +657,7 @@ + } + + static int igb_set_eeprom(struct net_device *netdev, +- struct ethtool_eeprom *eeprom, u8 *bytes) ++ struct ethtool_eeprom *eeprom, u8 *bytes) + { + struct igb_adapter *adapter = netdev_priv(netdev); + struct e1000_hw *hw = &adapter->hw; +@@ -652,15 +685,15 @@ + if (eeprom->offset & 1) { + /* need read/modify/write of first changed EEPROM word */ + /* only the second byte of the word is being modified */ +- ret_val = hw->nvm.ops.read_nvm(hw, first_word, 1, ++ ret_val = e1000_read_nvm(hw, first_word, 1, + &eeprom_buff[0]); + ptr++; + } + if (((eeprom->offset + eeprom->len) & 1) && (ret_val == 0)) { + /* need read/modify/write of last changed EEPROM word */ + /* only the first byte of the word is being modified */ +- ret_val = hw->nvm.ops.read_nvm(hw, last_word, 1, +- &eeprom_buff[last_word - first_word]); ++ ret_val = e1000_read_nvm(hw, last_word, 1, ++ &eeprom_buff[last_word - first_word]); + } + + /* Device's eeprom is always little-endian, word addressable */ +@@ -672,20 +705,20 @@ + for (i = 0; i < last_word - first_word + 1; i++) + eeprom_buff[i] = cpu_to_le16(eeprom_buff[i]); + +- ret_val = hw->nvm.ops.write_nvm(hw, first_word, +- last_word - first_word + 1, eeprom_buff); ++ ret_val = e1000_write_nvm(hw, first_word, ++ last_word - first_word + 1, eeprom_buff); + + /* Update the checksum over the first part of the EEPROM if needed + * and flush shadow RAM for 82573 controllers */ + if ((ret_val == 0) && ((first_word <= NVM_CHECKSUM_REG))) +- igb_update_nvm_checksum(hw); ++ e1000_update_nvm_checksum(hw); + + kfree(eeprom_buff); + return ret_val; + } + + static void igb_get_drvinfo(struct net_device *netdev, +- struct ethtool_drvinfo *drvinfo) ++ struct ethtool_drvinfo *drvinfo) + { + struct igb_adapter *adapter = netdev_priv(netdev); + char firmware_version[32]; +@@ -696,7 +729,7 @@ + + /* EEPROM image version # is reported as firmware version # for + * 82575 controllers */ +- adapter->hw.nvm.ops.read_nvm(&adapter->hw, 5, 1, &eeprom_data); ++ e1000_read_nvm(&adapter->hw, 5, 1, &eeprom_data); + sprintf(firmware_version, "%d.%d-%d", + (eeprom_data & 0xF000) >> 12, + (eeprom_data & 0x0FF0) >> 4, +@@ -711,7 +744,7 @@ + } + + static void igb_get_ringparam(struct net_device *netdev, +- struct ethtool_ringparam *ring) ++ struct ethtool_ringparam *ring) + { + struct igb_adapter *adapter = netdev_priv(netdev); + +@@ -726,7 +759,7 @@ + } + + static int igb_set_ringparam(struct net_device *netdev, +- struct ethtool_ringparam *ring) ++ struct ethtool_ringparam *ring) + { + struct igb_adapter *adapter = netdev_priv(netdev); + struct igb_ring *temp_ring; +@@ -829,148 +862,56 @@ + return err; + } + +-/* ethtool register test data */ +-struct igb_reg_test { +- u16 reg; +- u16 reg_offset; +- u16 array_len; +- u16 test_type; +- u32 mask; +- u32 write; +-}; +- +-/* In the hardware, registers are laid out either singly, in arrays +- * spaced 0x100 bytes apart, or in contiguous tables. We assume +- * most tests take place on arrays or single registers (handled +- * as a single-element array) and special-case the tables. +- * Table tests are always pattern tests. +- * +- * We also make provision for some required setup steps by specifying +- * registers to be written without any read-back testing. +- */ +- +-#define PATTERN_TEST 1 +-#define SET_READ_TEST 2 +-#define WRITE_NO_TEST 3 +-#define TABLE32_TEST 4 +-#define TABLE64_TEST_LO 5 +-#define TABLE64_TEST_HI 6 +- +-/* 82576 reg test */ +-static struct igb_reg_test reg_test_82576[] = { +- { E1000_FCAL, 0x100, 1, PATTERN_TEST, 0xFFFFFFFF, 0xFFFFFFFF }, +- { E1000_FCAH, 0x100, 1, PATTERN_TEST, 0x0000FFFF, 0xFFFFFFFF }, +- { E1000_FCT, 0x100, 1, PATTERN_TEST, 0x0000FFFF, 0xFFFFFFFF }, +- { E1000_VET, 0x100, 1, PATTERN_TEST, 0xFFFFFFFF, 0xFFFFFFFF }, +- { E1000_RDBAL(0), 0x100, 4, PATTERN_TEST, 0xFFFFFF80, 0xFFFFFFFF }, +- { E1000_RDBAH(0), 0x100, 4, PATTERN_TEST, 0xFFFFFFFF, 0xFFFFFFFF }, +- { E1000_RDLEN(0), 0x100, 4, PATTERN_TEST, 0x000FFFF0, 0x000FFFFF }, +- { E1000_RDBAL(4), 0x40, 8, PATTERN_TEST, 0xFFFFFF80, 0xFFFFFFFF }, +- { E1000_RDBAH(4), 0x40, 8, PATTERN_TEST, 0xFFFFFFFF, 0xFFFFFFFF }, +- { E1000_RDLEN(4), 0x40, 8, PATTERN_TEST, 0x000FFFF0, 0x000FFFFF }, +- /* Enable all four RX queues before testing. */ +- { E1000_RXDCTL(0), 0x100, 1, WRITE_NO_TEST, 0, E1000_RXDCTL_QUEUE_ENABLE }, +- /* RDH is read-only for 82576, only test RDT. */ +- { E1000_RDT(0), 0x100, 4, PATTERN_TEST, 0x0000FFFF, 0x0000FFFF }, +- { E1000_RXDCTL(0), 0x100, 4, WRITE_NO_TEST, 0, 0 }, +- { E1000_FCRTH, 0x100, 1, PATTERN_TEST, 0x0000FFF0, 0x0000FFF0 }, +- { E1000_FCTTV, 0x100, 1, PATTERN_TEST, 0x0000FFFF, 0x0000FFFF }, +- { E1000_TIPG, 0x100, 1, PATTERN_TEST, 0x3FFFFFFF, 0x3FFFFFFF }, +- { E1000_TDBAL(0), 0x100, 4, PATTERN_TEST, 0xFFFFFF80, 0xFFFFFFFF }, +- { E1000_TDBAH(0), 0x100, 4, PATTERN_TEST, 0xFFFFFFFF, 0xFFFFFFFF }, +- { E1000_TDLEN(0), 0x100, 4, PATTERN_TEST, 0x000FFFF0, 0x000FFFFF }, +- { E1000_TDBAL(4), 0x40, 8, PATTERN_TEST, 0xFFFFFF80, 0xFFFFFFFF }, +- { E1000_TDBAH(4), 0x40, 8, PATTERN_TEST, 0xFFFFFFFF, 0xFFFFFFFF }, +- { E1000_TDLEN(4), 0x40, 8, PATTERN_TEST, 0x000FFFF0, 0x000FFFFF }, +- { E1000_RCTL, 0x100, 1, SET_READ_TEST, 0xFFFFFFFF, 0x00000000 }, +- { E1000_RCTL, 0x100, 1, SET_READ_TEST, 0x04CFB0FE, 0x003FFFFB }, +- { E1000_RCTL, 0x100, 1, SET_READ_TEST, 0x04CFB0FE, 0xFFFFFFFF }, +- { E1000_TCTL, 0x100, 1, SET_READ_TEST, 0xFFFFFFFF, 0x00000000 }, +- { E1000_RA, 0, 16, TABLE64_TEST_LO, 0xFFFFFFFF, 0xFFFFFFFF }, +- { E1000_RA, 0, 16, TABLE64_TEST_HI, 0x83FFFFFF, 0xFFFFFFFF }, +- { E1000_RA2, 0, 8, TABLE64_TEST_LO, 0xFFFFFFFF, 0xFFFFFFFF }, +- { E1000_RA2, 0, 8, TABLE64_TEST_HI, 0x83FFFFFF, 0xFFFFFFFF }, +- { E1000_MTA, 0, 128,TABLE32_TEST, 0xFFFFFFFF, 0xFFFFFFFF }, +- { 0, 0, 0, 0 } +-}; +- +-/* 82575 register test */ +-static struct igb_reg_test reg_test_82575[] = { +- { E1000_FCAL, 0x100, 1, PATTERN_TEST, 0xFFFFFFFF, 0xFFFFFFFF }, +- { E1000_FCAH, 0x100, 1, PATTERN_TEST, 0x0000FFFF, 0xFFFFFFFF }, +- { E1000_FCT, 0x100, 1, PATTERN_TEST, 0x0000FFFF, 0xFFFFFFFF }, +- { E1000_VET, 0x100, 1, PATTERN_TEST, 0xFFFFFFFF, 0xFFFFFFFF }, +- { E1000_RDBAL(0), 0x100, 4, PATTERN_TEST, 0xFFFFFF80, 0xFFFFFFFF }, +- { E1000_RDBAH(0), 0x100, 4, PATTERN_TEST, 0xFFFFFFFF, 0xFFFFFFFF }, +- { E1000_RDLEN(0), 0x100, 4, PATTERN_TEST, 0x000FFF80, 0x000FFFFF }, +- /* Enable all four RX queues before testing. */ +- { E1000_RXDCTL(0), 0x100, 4, WRITE_NO_TEST, 0, E1000_RXDCTL_QUEUE_ENABLE }, +- /* RDH is read-only for 82575, only test RDT. */ +- { E1000_RDT(0), 0x100, 4, PATTERN_TEST, 0x0000FFFF, 0x0000FFFF }, +- { E1000_RXDCTL(0), 0x100, 4, WRITE_NO_TEST, 0, 0 }, +- { E1000_FCRTH, 0x100, 1, PATTERN_TEST, 0x0000FFF0, 0x0000FFF0 }, +- { E1000_FCTTV, 0x100, 1, PATTERN_TEST, 0x0000FFFF, 0x0000FFFF }, +- { E1000_TIPG, 0x100, 1, PATTERN_TEST, 0x3FFFFFFF, 0x3FFFFFFF }, +- { E1000_TDBAL(0), 0x100, 4, PATTERN_TEST, 0xFFFFFF80, 0xFFFFFFFF }, +- { E1000_TDBAH(0), 0x100, 4, PATTERN_TEST, 0xFFFFFFFF, 0xFFFFFFFF }, +- { E1000_TDLEN(0), 0x100, 4, PATTERN_TEST, 0x000FFF80, 0x000FFFFF }, +- { E1000_RCTL, 0x100, 1, SET_READ_TEST, 0xFFFFFFFF, 0x00000000 }, +- { E1000_RCTL, 0x100, 1, SET_READ_TEST, 0x04CFB3FE, 0x003FFFFB }, +- { E1000_RCTL, 0x100, 1, SET_READ_TEST, 0x04CFB3FE, 0xFFFFFFFF }, +- { E1000_TCTL, 0x100, 1, SET_READ_TEST, 0xFFFFFFFF, 0x00000000 }, +- { E1000_TXCW, 0x100, 1, PATTERN_TEST, 0xC000FFFF, 0x0000FFFF }, +- { E1000_RA, 0, 16, TABLE64_TEST_LO, 0xFFFFFFFF, 0xFFFFFFFF }, +- { E1000_RA, 0, 16, TABLE64_TEST_HI, 0x800FFFFF, 0xFFFFFFFF }, +- { E1000_MTA, 0, 128, TABLE32_TEST, 0xFFFFFFFF, 0xFFFFFFFF }, +- { 0, 0, 0, 0 } +-}; +- + static bool reg_pattern_test(struct igb_adapter *adapter, u64 *data, + int reg, u32 mask, u32 write) + { ++ struct e1000_hw *hw = &adapter->hw; + u32 pat, val; +- u32 _test[] = ++ static const u32 _test[] = + {0x5A5A5A5A, 0xA5A5A5A5, 0x00000000, 0xFFFFFFFF}; + for (pat = 0; pat < ARRAY_SIZE(_test); pat++) { +- writel((_test[pat] & write), (adapter->hw.hw_addr + reg)); +- val = readl(adapter->hw.hw_addr + reg); ++ E1000_WRITE_REG(hw, reg, (_test[pat] & write)); ++ val = E1000_READ_REG(hw, reg); + if (val != (_test[pat] & write & mask)) { +- dev_err(&adapter->pdev->dev, "pattern test reg %04X " +- "failed: got 0x%08X expected 0x%08X\n", +- reg, val, (_test[pat] & write & mask)); +- *data = reg; ++ DPRINTK(DRV, ERR, "pattern test reg %04X failed: got " ++ "0x%08X expected 0x%08X\n", ++ E1000_REGISTER(hw, reg), val, ++ (_test[pat] & write & mask)); ++ *data = E1000_REGISTER(hw, reg); + return 1; + } + } ++ + return 0; + } + + static bool reg_set_and_check(struct igb_adapter *adapter, u64 *data, + int reg, u32 mask, u32 write) + { ++ struct e1000_hw *hw = &adapter->hw; + u32 val; +- writel((write & mask), (adapter->hw.hw_addr + reg)); +- val = readl(adapter->hw.hw_addr + reg); ++ E1000_WRITE_REG(hw, reg, write & mask); ++ val = E1000_READ_REG(hw, reg); + if ((write & mask) != (val & mask)) { +- dev_err(&adapter->pdev->dev, "set/check reg %04X test failed:" +- " got 0x%08X expected 0x%08X\n", reg, +- (val & mask), (write & mask)); +- *data = reg; ++ DPRINTK(DRV, ERR, "set/check reg %04X test failed: got 0x%08X " ++ "expected 0x%08X\n", reg, (val & mask), (write & mask)); ++ *data = E1000_REGISTER(hw, reg); + return 1; + } ++ + return 0; + } + +-#define REG_PATTERN_TEST(reg, mask, write) \ +- do { \ +- if (reg_pattern_test(adapter, data, reg, mask, write)) \ +- return 1; \ ++#define REG_PATTERN_TEST(reg, mask, write) \ ++ do { \ ++ if (reg_pattern_test(adapter, data, reg, mask, write)) \ ++ return 1; \ + } while (0) + +-#define REG_SET_AND_CHECK(reg, mask, write) \ +- do { \ +- if (reg_set_and_check(adapter, data, reg, mask, write)) \ +- return 1; \ ++#define REG_SET_AND_CHECK(reg, mask, write) \ ++ do { \ ++ if (reg_set_and_check(adapter, data, reg, mask, write)) \ ++ return 1; \ + } while (0) + + static int igb_reg_test(struct igb_adapter *adapter, u64 *data) +@@ -980,14 +921,14 @@ + u32 value, before, after; + u32 i, toggle; + +- toggle = 0x7FFFF3FF; +- + switch (adapter->hw.mac.type) { + case e1000_82576: + test = reg_test_82576; ++ toggle = 0x7FFFF3FF; + break; + default: + test = reg_test_82575; ++ toggle = 0x7FFFF3FF; + break; + } + +@@ -996,18 +937,18 @@ + * tests. Some bits are read-only, some toggle, and some + * are writable on newer MACs. + */ +- before = rd32(E1000_STATUS); +- value = (rd32(E1000_STATUS) & toggle); +- wr32(E1000_STATUS, toggle); +- after = rd32(E1000_STATUS) & toggle; ++ before = E1000_READ_REG(hw, E1000_STATUS); ++ value = (E1000_READ_REG(hw, E1000_STATUS) & toggle); ++ E1000_WRITE_REG(hw, E1000_STATUS, toggle); ++ after = E1000_READ_REG(hw, E1000_STATUS) & toggle; + if (value != after) { +- dev_err(&adapter->pdev->dev, "failed STATUS register test " +- "got: 0x%08X expected: 0x%08X\n", after, value); ++ DPRINTK(DRV, ERR, "failed STATUS register test got: " ++ "0x%08X expected: 0x%08X\n", after, value); + *data = 1; + return 1; + } + /* restore previous status */ +- wr32(E1000_STATUS, before); ++ E1000_WRITE_REG(hw, E1000_STATUS, before); + + /* Perform the remainder of the register test, looping through + * the test table until we either fail or reach the null entry. +@@ -1016,19 +957,21 @@ + for (i = 0; i < test->array_len; i++) { + switch (test->test_type) { + case PATTERN_TEST: +- REG_PATTERN_TEST(test->reg + (i * test->reg_offset), ++ REG_PATTERN_TEST(test->reg + ++ (i * test->reg_offset), + test->mask, + test->write); + break; + case SET_READ_TEST: +- REG_SET_AND_CHECK(test->reg + (i * test->reg_offset), ++ REG_SET_AND_CHECK(test->reg + ++ (i * test->reg_offset), + test->mask, + test->write); + break; + case WRITE_NO_TEST: + writel(test->write, +- (adapter->hw.hw_addr + test->reg) +- + (i * test->reg_offset)); ++ (adapter->hw.hw_addr + test->reg) ++ + (i * test->reg_offset)); + break; + case TABLE32_TEST: + REG_PATTERN_TEST(test->reg + (i * 4), +@@ -1063,8 +1006,7 @@ + *data = 0; + /* Read and add up the contents of the EEPROM */ + for (i = 0; i < (NVM_CHECKSUM_REG + 1); i++) { +- if ((adapter->hw.nvm.ops.read_nvm(&adapter->hw, i, 1, &temp)) +- < 0) { ++ if ((e1000_read_nvm(&adapter->hw, i, 1, &temp)) < 0) { + *data = 1; + break; + } +@@ -1084,7 +1026,7 @@ + struct igb_adapter *adapter = netdev_priv(netdev); + struct e1000_hw *hw = &adapter->hw; + +- adapter->test_icr |= rd32(E1000_ICR); ++ adapter->test_icr |= E1000_READ_REG(hw, E1000_ICR); + + return IRQ_HANDLED; + } +@@ -1093,40 +1035,58 @@ + { + struct e1000_hw *hw = &adapter->hw; + struct net_device *netdev = adapter->netdev; +- u32 mask, i = 0, shared_int = true; ++ u32 mask, ics_mask, i=0, shared_int = TRUE; + u32 irq = adapter->pdev->irq; + + *data = 0; + + /* Hook up test interrupt handler just for this test */ +- if (adapter->msix_entries) { ++ if (adapter->msix_entries) + /* NOTE: we don't test MSI-X interrupts here, yet */ + return 0; +- } else if (adapter->flags & IGB_FLAG_HAS_MSI) { +- shared_int = false; ++ ++ if (adapter->flags & IGB_FLAG_HAS_MSI) { ++ shared_int = FALSE; + if (request_irq(irq, &igb_test_intr, 0, netdev->name, netdev)) { + *data = 1; + return -1; + } + } else if (!request_irq(irq, &igb_test_intr, IRQF_PROBE_SHARED, +- netdev->name, netdev)) { +- shared_int = false; +- } else if (request_irq(irq, &igb_test_intr, IRQF_SHARED, +- netdev->name, netdev)) { ++ netdev->name, netdev)) { ++ shared_int = FALSE; ++ } ++ else if (request_irq(irq, &igb_test_intr, IRQF_SHARED, ++ netdev->name, netdev)) { + *data = 1; + return -1; + } +- dev_info(&adapter->pdev->dev, "testing %s interrupt\n", +- (shared_int ? "shared" : "unshared")); ++ DPRINTK(HW, INFO, "testing %s interrupt\n", ++ (shared_int ? "shared" : "unshared")); + + /* Disable all the interrupts */ +- wr32(E1000_IMC, 0xFFFFFFFF); ++ E1000_WRITE_REG(hw, E1000_IMC, ~0); + msleep(10); + ++ /* Define all writable bits for ICS */ ++ switch(hw->mac.type) { ++ case e1000_82575: ++ ics_mask = 0x37F47EDD; ++ break; ++ case e1000_82576: ++ ics_mask = 0x77D4FBFD; ++ break; ++ default: ++ ics_mask = 0x7FFFFFFF; ++ break; ++ } ++ + /* Test each interrupt */ +- for (; i < 10; i++) { ++ for (; i < 31; i++) { + /* Interrupt to test */ + mask = 1 << i; ++ ++ if (!(mask & ics_mask)) ++ continue; + + if (!shared_int) { + /* Disable the interrupt to be reported in +@@ -1136,8 +1096,12 @@ + * test failed. + */ + adapter->test_icr = 0; +- wr32(E1000_IMC, ~mask & 0x00007FFF); +- wr32(E1000_ICS, ~mask & 0x00007FFF); ++ ++ /* Flush any pending interrupts */ ++ E1000_WRITE_REG(hw, E1000_ICR, ~0); ++ ++ E1000_WRITE_REG(hw, E1000_IMC, mask); ++ E1000_WRITE_REG(hw, E1000_ICS, mask); + msleep(10); + + if (adapter->test_icr & mask) { +@@ -1153,8 +1117,12 @@ + * test failed. + */ + adapter->test_icr = 0; +- wr32(E1000_IMS, mask); +- wr32(E1000_ICS, mask); ++ ++ /* Flush any pending interrupts */ ++ E1000_WRITE_REG(hw, E1000_ICR, ~0); ++ ++ E1000_WRITE_REG(hw, E1000_IMS, mask); ++ E1000_WRITE_REG(hw, E1000_ICS, mask); + msleep(10); + + if (!(adapter->test_icr & mask)) { +@@ -1170,11 +1138,15 @@ + * test failed. + */ + adapter->test_icr = 0; +- wr32(E1000_IMC, ~mask & 0x00007FFF); +- wr32(E1000_ICS, ~mask & 0x00007FFF); ++ ++ /* Flush any pending interrupts */ ++ E1000_WRITE_REG(hw, E1000_ICR, ~0); ++ ++ E1000_WRITE_REG(hw, E1000_IMC, ~mask); ++ E1000_WRITE_REG(hw, E1000_ICS, ~mask); + msleep(10); + +- if (adapter->test_icr) { ++ if (adapter->test_icr & mask) { + *data = 5; + break; + } +@@ -1182,7 +1154,7 @@ + } + + /* Disable all the interrupts */ +- wr32(E1000_IMC, 0xFFFFFFFF); ++ E1000_WRITE_REG(hw, E1000_IMC, ~0); + msleep(10); + + /* Unhook test interrupt handler */ +@@ -1203,7 +1175,7 @@ + struct igb_buffer *buf = &(tx_ring->buffer_info[i]); + if (buf->dma) + pci_unmap_single(pdev, buf->dma, buf->length, +- PCI_DMA_TODEVICE); ++ PCI_DMA_TODEVICE); + if (buf->skb) + dev_kfree_skb(buf->skb); + } +@@ -1214,8 +1186,8 @@ + struct igb_buffer *buf = &(rx_ring->buffer_info[i]); + if (buf->dma) + pci_unmap_single(pdev, buf->dma, +- IGB_RXBUFFER_2048, +- PCI_DMA_FROMDEVICE); ++ IGB_RXBUFFER_2048, ++ PCI_DMA_FROMDEVICE); + if (buf->skb) + dev_kfree_skb(buf->skb); + } +@@ -1223,12 +1195,12 @@ + + if (tx_ring->desc) { + pci_free_consistent(pdev, tx_ring->size, tx_ring->desc, +- tx_ring->dma); ++ tx_ring->dma); + tx_ring->desc = NULL; + } + if (rx_ring->desc) { + pci_free_consistent(pdev, rx_ring->size, rx_ring->desc, +- rx_ring->dma); ++ rx_ring->dma); + rx_ring->desc = NULL; + } + +@@ -1246,7 +1218,7 @@ + struct igb_ring *tx_ring = &adapter->test_tx_ring; + struct igb_ring *rx_ring = &adapter->test_rx_ring; + struct pci_dev *pdev = adapter->pdev; +- u32 rctl; ++ u32 rctl , rxdctl, txdctl; + int i, ret_val; + + /* Setup Tx descriptor ring and Tx buffers */ +@@ -1254,32 +1226,33 @@ + if (!tx_ring->count) + tx_ring->count = IGB_DEFAULT_TXD; + +- tx_ring->buffer_info = kcalloc(tx_ring->count, +- sizeof(struct igb_buffer), +- GFP_KERNEL); +- if (!tx_ring->buffer_info) { ++ if (!(tx_ring->buffer_info = kcalloc(tx_ring->count, ++ sizeof(struct igb_buffer), ++ GFP_KERNEL))) { + ret_val = 1; + goto err_nomem; + } + + tx_ring->size = tx_ring->count * sizeof(struct e1000_tx_desc); + tx_ring->size = ALIGN(tx_ring->size, 4096); +- tx_ring->desc = pci_alloc_consistent(pdev, tx_ring->size, +- &tx_ring->dma); +- if (!tx_ring->desc) { ++ if (!(tx_ring->desc = pci_alloc_consistent(pdev, tx_ring->size, ++ &tx_ring->dma))) { + ret_val = 2; + goto err_nomem; + } + tx_ring->next_to_use = tx_ring->next_to_clean = 0; + +- wr32(E1000_TDBAL(0), ++ E1000_WRITE_REG(hw, E1000_TDBAL(0), + ((u64) tx_ring->dma & 0x00000000FFFFFFFF)); +- wr32(E1000_TDBAH(0), ((u64) tx_ring->dma >> 32)); +- wr32(E1000_TDLEN(0), ++ E1000_WRITE_REG(hw, E1000_TDBAH(0), ((u64) tx_ring->dma >> 32)); ++ E1000_WRITE_REG(hw, E1000_TDLEN(0), + tx_ring->count * sizeof(struct e1000_tx_desc)); +- wr32(E1000_TDH(0), 0); +- wr32(E1000_TDT(0), 0); +- wr32(E1000_TCTL, ++ E1000_WRITE_REG(hw, E1000_TDH(0), 0); ++ E1000_WRITE_REG(hw, E1000_TDT(0), 0); ++ txdctl = E1000_READ_REG(hw, E1000_TXDCTL(0)); ++ txdctl |= E1000_TXDCTL_QUEUE_ENABLE; ++ E1000_WRITE_REG(hw, E1000_TXDCTL(0), txdctl); ++ E1000_WRITE_REG(hw, E1000_TCTL, + E1000_TCTL_PSP | E1000_TCTL_EN | + E1000_COLLISION_THRESHOLD << E1000_CT_SHIFT | + E1000_COLLISION_DISTANCE << E1000_COLD_SHIFT); +@@ -1289,8 +1262,7 @@ + struct sk_buff *skb; + unsigned int size = 1024; + +- skb = alloc_skb(size, GFP_KERNEL); +- if (!skb) { ++ if (!(skb = alloc_skb(size, GFP_KERNEL))) { + ret_val = 3; + goto err_nomem; + } +@@ -1313,44 +1285,45 @@ + if (!rx_ring->count) + rx_ring->count = IGB_DEFAULT_RXD; + +- rx_ring->buffer_info = kcalloc(rx_ring->count, +- sizeof(struct igb_buffer), +- GFP_KERNEL); +- if (!rx_ring->buffer_info) { ++ if (!(rx_ring->buffer_info = kcalloc(rx_ring->count, ++ sizeof(struct igb_buffer), ++ GFP_KERNEL))) { + ret_val = 4; + goto err_nomem; + } + + rx_ring->size = rx_ring->count * sizeof(struct e1000_rx_desc); +- rx_ring->desc = pci_alloc_consistent(pdev, rx_ring->size, +- &rx_ring->dma); +- if (!rx_ring->desc) { ++ if (!(rx_ring->desc = pci_alloc_consistent(pdev, rx_ring->size, ++ &rx_ring->dma))) { + ret_val = 5; + goto err_nomem; + } + rx_ring->next_to_use = rx_ring->next_to_clean = 0; + +- rctl = rd32(E1000_RCTL); +- wr32(E1000_RCTL, rctl & ~E1000_RCTL_EN); +- wr32(E1000_RDBAL(0), ++ rctl = E1000_READ_REG(hw, E1000_RCTL); ++ E1000_WRITE_REG(hw, E1000_RCTL, rctl & ~E1000_RCTL_EN); ++ E1000_WRITE_REG(hw, E1000_RDBAL(0), + ((u64) rx_ring->dma & 0xFFFFFFFF)); +- wr32(E1000_RDBAH(0), +- ((u64) rx_ring->dma >> 32)); +- wr32(E1000_RDLEN(0), rx_ring->size); +- wr32(E1000_RDH(0), 0); +- wr32(E1000_RDT(0), 0); ++ E1000_WRITE_REG(hw, E1000_RDBAH(0), ((u64) rx_ring->dma >> 32)); ++ E1000_WRITE_REG(hw, E1000_RDLEN(0), rx_ring->size); ++ E1000_WRITE_REG(hw, E1000_RDH(0), 0); ++ E1000_WRITE_REG(hw, E1000_RDT(0), 0); ++ rxdctl = E1000_READ_REG(hw, E1000_RXDCTL(0)); ++ rxdctl |= E1000_RXDCTL_QUEUE_ENABLE; ++ E1000_WRITE_REG(hw, E1000_RXDCTL(0), rxdctl); ++ rctl &= ~(E1000_RCTL_LBM_TCVR | E1000_RCTL_LBM_MAC); + rctl = E1000_RCTL_EN | E1000_RCTL_BAM | E1000_RCTL_SZ_2048 | +- E1000_RCTL_LBM_NO | E1000_RCTL_RDMTS_HALF | +- (adapter->hw.mac.mc_filter_type << E1000_RCTL_MO_SHIFT); +- wr32(E1000_RCTL, rctl); +- wr32(E1000_SRRCTL(0), 0); ++ E1000_RCTL_RDMTS_HALF | ++ (hw->mac.mc_filter_type << E1000_RCTL_MO_SHIFT); ++ E1000_WRITE_REG(hw, E1000_RCTL, rctl); ++ E1000_WRITE_REG(hw, E1000_SRRCTL(0), 0); + + for (i = 0; i < rx_ring->count; i++) { + struct e1000_rx_desc *rx_desc = E1000_RX_DESC(*rx_ring, i); + struct sk_buff *skb; + + skb = alloc_skb(IGB_RXBUFFER_2048 + NET_IP_ALIGN, +- GFP_KERNEL); ++ GFP_KERNEL); + if (!skb) { + ret_val = 6; + goto err_nomem; +@@ -1373,13 +1346,11 @@ + + static void igb_phy_disable_receiver(struct igb_adapter *adapter) + { +- struct e1000_hw *hw = &adapter->hw; +- + /* Write out to PHY registers 29 and 30 to disable the Receiver. */ +- hw->phy.ops.write_phy_reg(hw, 29, 0x001F); +- hw->phy.ops.write_phy_reg(hw, 30, 0x8FFC); +- hw->phy.ops.write_phy_reg(hw, 29, 0x001A); +- hw->phy.ops.write_phy_reg(hw, 30, 0x8FF0); ++ e1000_write_phy_reg(&adapter->hw, 29, 0x001F); ++ e1000_write_phy_reg(&adapter->hw, 30, 0x8FFC); ++ e1000_write_phy_reg(&adapter->hw, 29, 0x001A); ++ e1000_write_phy_reg(&adapter->hw, 30, 0x8FF0); + } + + static int igb_integrated_phy_loopback(struct igb_adapter *adapter) +@@ -1388,24 +1359,24 @@ + u32 ctrl_reg = 0; + u32 stat_reg = 0; + +- hw->mac.autoneg = false; ++ hw->mac.autoneg = FALSE; + + if (hw->phy.type == e1000_phy_m88) { + /* Auto-MDI/MDIX Off */ +- hw->phy.ops.write_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, 0x0808); ++ e1000_write_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, 0x0808); + /* reset to update Auto-MDI/MDIX */ +- hw->phy.ops.write_phy_reg(hw, PHY_CONTROL, 0x9140); ++ e1000_write_phy_reg(hw, PHY_CONTROL, 0x9140); + /* autoneg off */ +- hw->phy.ops.write_phy_reg(hw, PHY_CONTROL, 0x8140); ++ e1000_write_phy_reg(hw, PHY_CONTROL, 0x8140); + } + +- ctrl_reg = rd32(E1000_CTRL); ++ ctrl_reg = E1000_READ_REG(hw, E1000_CTRL); + + /* force 1000, set loopback */ +- hw->phy.ops.write_phy_reg(hw, PHY_CONTROL, 0x4140); ++ e1000_write_phy_reg(hw, PHY_CONTROL, 0x4140); + + /* Now set up the MAC to the same speed/duplex as the PHY. */ +- ctrl_reg = rd32(E1000_CTRL); ++ ctrl_reg = E1000_READ_REG(hw, E1000_CTRL); + ctrl_reg &= ~E1000_CTRL_SPD_SEL; /* Clear the speed sel bits */ + ctrl_reg |= (E1000_CTRL_FRCSPD | /* Set the Force Speed Bit */ + E1000_CTRL_FRCDPX | /* Set the Force Duplex Bit */ +@@ -1418,12 +1389,12 @@ + else { + /* Set the ILOS bit on the fiber Nic if half duplex link is + * detected. */ +- stat_reg = rd32(E1000_STATUS); ++ stat_reg = E1000_READ_REG(hw, E1000_STATUS); + if ((stat_reg & E1000_STATUS_FD) == 0) + ctrl_reg |= (E1000_CTRL_ILOS | E1000_CTRL_SLU); + } + +- wr32(E1000_CTRL, ctrl_reg); ++ E1000_WRITE_REG(hw, E1000_CTRL, ctrl_reg); + + /* Disable the receiver on the PHY so when a cable is plugged in, the + * PHY does not begin to autoneg when a cable is reconnected to the NIC. +@@ -1448,39 +1419,41 @@ + + if (hw->phy.media_type == e1000_media_type_fiber || + hw->phy.media_type == e1000_media_type_internal_serdes) { +- reg = rd32(E1000_RCTL); ++ ++ reg = E1000_READ_REG(hw, E1000_RCTL); + reg |= E1000_RCTL_LBM_TCVR; +- wr32(E1000_RCTL, reg); ++ E1000_WRITE_REG(hw, E1000_RCTL, reg); + +- wr32(E1000_SCTL, E1000_ENABLE_SERDES_LOOPBACK); ++ E1000_WRITE_REG(hw, E1000_SCTL, E1000_ENABLE_SERDES_LOOPBACK); + +- reg = rd32(E1000_CTRL); ++ reg = E1000_READ_REG(hw, E1000_CTRL); + reg &= ~(E1000_CTRL_RFCE | + E1000_CTRL_TFCE | + E1000_CTRL_LRST); + reg |= E1000_CTRL_SLU | +- E1000_CTRL_FD; +- wr32(E1000_CTRL, reg); ++ E1000_CTRL_FD; ++ E1000_WRITE_REG(hw, E1000_CTRL, reg); + + /* Unset switch control to serdes energy detect */ +- reg = rd32(E1000_CONNSW); ++ reg = E1000_READ_REG(hw, E1000_CONNSW); + reg &= ~E1000_CONNSW_ENRGSRC; +- wr32(E1000_CONNSW, reg); ++ E1000_WRITE_REG(hw, E1000_CONNSW, reg); + + /* Set PCS register for forced speed */ +- reg = rd32(E1000_PCS_LCTL); ++ reg = E1000_READ_REG(hw, E1000_PCS_LCTL); + reg &= ~E1000_PCS_LCTL_AN_ENABLE; /* Disable Autoneg*/ + reg |= E1000_PCS_LCTL_FLV_LINK_UP | /* Force link up */ + E1000_PCS_LCTL_FSV_1000 | /* Force 1000 */ + E1000_PCS_LCTL_FDV_FULL | /* SerDes Full duplex */ + E1000_PCS_LCTL_FSD | /* Force Speed */ + E1000_PCS_LCTL_FORCE_LINK; /* Force Link */ +- wr32(E1000_PCS_LCTL, reg); ++ E1000_WRITE_REG(hw, E1000_PCS_LCTL, reg); + + return 0; +- } else if (hw->phy.media_type == e1000_media_type_copper) { ++ } ++ ++ if (hw->phy.media_type == e1000_media_type_copper) + return igb_set_phy_loopback(adapter); +- } + + return 7; + } +@@ -1491,21 +1464,21 @@ + u32 rctl; + u16 phy_reg; + +- rctl = rd32(E1000_RCTL); ++ rctl = E1000_READ_REG(hw, E1000_RCTL); + rctl &= ~(E1000_RCTL_LBM_TCVR | E1000_RCTL_LBM_MAC); +- wr32(E1000_RCTL, rctl); ++ E1000_WRITE_REG(hw, E1000_RCTL, rctl); + +- hw->mac.autoneg = true; +- hw->phy.ops.read_phy_reg(hw, PHY_CONTROL, &phy_reg); ++ hw->mac.autoneg = TRUE; ++ e1000_read_phy_reg(hw, PHY_CONTROL, &phy_reg); + if (phy_reg & MII_CR_LOOPBACK) { + phy_reg &= ~MII_CR_LOOPBACK; +- hw->phy.ops.write_phy_reg(hw, PHY_CONTROL, phy_reg); +- igb_phy_sw_reset(hw); ++ e1000_write_phy_reg(hw, PHY_CONTROL, phy_reg); ++ e1000_phy_commit(hw); + } + } + + static void igb_create_lbtest_frame(struct sk_buff *skb, +- unsigned int frame_size) ++ unsigned int frame_size) + { + memset(skb->data, 0xFF, frame_size); + frame_size &= ~1; +@@ -1517,10 +1490,12 @@ + static int igb_check_lbtest_frame(struct sk_buff *skb, unsigned int frame_size) + { + frame_size &= ~1; +- if (*(skb->data + 3) == 0xFF) ++ if (*(skb->data + 3) == 0xFF) { + if ((*(skb->data + frame_size / 2 + 10) == 0xBE) && +- (*(skb->data + frame_size / 2 + 12) == 0xAF)) ++ (*(skb->data + frame_size / 2 + 12) == 0xAF)) { + return 0; ++ } ++ } + return 13; + } + +@@ -1530,11 +1505,10 @@ + struct igb_ring *tx_ring = &adapter->test_tx_ring; + struct igb_ring *rx_ring = &adapter->test_rx_ring; + struct pci_dev *pdev = adapter->pdev; +- int i, j, k, l, lc, good_cnt; +- int ret_val = 0; ++ int i, j, k, l, lc, good_cnt, ret_val=0; + unsigned long time; + +- wr32(E1000_RDT(0), rx_ring->count - 1); ++ E1000_WRITE_REG(hw, E1000_RDT(0), rx_ring->count - 1); + + /* Calculate the loop count based on the largest descriptor ring + * The idea is to wrap the largest ring a number of times using 64 +@@ -1550,32 +1524,29 @@ + for (j = 0; j <= lc; j++) { /* loop count loop */ + for (i = 0; i < 64; i++) { /* send the packets */ + igb_create_lbtest_frame(tx_ring->buffer_info[k].skb, +- 1024); ++ 1024); + pci_dma_sync_single_for_device(pdev, + tx_ring->buffer_info[k].dma, + tx_ring->buffer_info[k].length, + PCI_DMA_TODEVICE); +- k++; +- if (k == tx_ring->count) +- k = 0; ++ if (unlikely(++k == tx_ring->count)) k = 0; + } +- wr32(E1000_TDT(0), k); ++ E1000_WRITE_REG(hw, E1000_TDT(0), k); + msleep(200); ++ + time = jiffies; /* set the start time for the receive */ + good_cnt = 0; + do { /* receive the sent packets */ + pci_dma_sync_single_for_cpu(pdev, +- rx_ring->buffer_info[l].dma, +- IGB_RXBUFFER_2048, +- PCI_DMA_FROMDEVICE); ++ rx_ring->buffer_info[l].dma, ++ IGB_RXBUFFER_2048, ++ PCI_DMA_FROMDEVICE); + + ret_val = igb_check_lbtest_frame( +- rx_ring->buffer_info[l].skb, 1024); ++ rx_ring->buffer_info[l].skb, 1024); + if (!ret_val) + good_cnt++; +- l++; +- if (l == rx_ring->count) +- l = 0; ++ if (unlikely(++l == rx_ring->count)) l = 0; + /* time + 20 msecs (200 msecs on 2.4) is more than + * enough time to complete the receives, if it's + * exceeded, break and error off +@@ -1597,10 +1568,9 @@ + { + /* PHY loopback cannot be performed if SoL/IDER + * sessions are active */ +- if (igb_check_reset_block(&adapter->hw)) { +- dev_err(&adapter->pdev->dev, +- "Cannot do PHY loopback test " +- "when SoL/IDER is active.\n"); ++ if (e1000_check_reset_block(&adapter->hw)) { ++ DPRINTK(DRV, ERR, "Cannot do PHY loopback test " ++ "when SoL/IDER is active.\n"); + *data = 0; + goto out; + } +@@ -1623,34 +1593,38 @@ + { + struct e1000_hw *hw = &adapter->hw; + *data = 0; +- if (hw->phy.media_type == e1000_media_type_internal_serdes) { ++ if (adapter->hw.phy.media_type == e1000_media_type_internal_serdes) { + int i = 0; +- hw->mac.serdes_has_link = false; ++ adapter->hw.mac.serdes_has_link = FALSE; + + /* On some blade server designs, link establishment + * could take as long as 2-3 minutes */ + do { +- hw->mac.ops.check_for_link(&adapter->hw); +- if (hw->mac.serdes_has_link) ++ e1000_check_for_link(&adapter->hw); ++ if (adapter->hw.mac.serdes_has_link) + return *data; + msleep(20); + } while (i++ < 3750); + + *data = 1; + } else { +- hw->mac.ops.check_for_link(&adapter->hw); +- if (hw->mac.autoneg) ++ e1000_check_for_link(&adapter->hw); ++ if (adapter->hw.mac.autoneg) + msleep(4000); + +- if (!(rd32(E1000_STATUS) & +- E1000_STATUS_LU)) ++ if (!(E1000_READ_REG(hw, E1000_STATUS) & E1000_STATUS_LU)) + *data = 1; + } + return *data; + } + ++static int igb_diag_test_count(struct net_device *netdev) ++{ ++ return IGB_TEST_LEN; ++} ++ + static void igb_diag_test(struct net_device *netdev, +- struct ethtool_test *eth_test, u64 *data) ++ struct ethtool_test *eth_test, u64 *data) + { + struct igb_adapter *adapter = netdev_priv(netdev); + u16 autoneg_advertised; +@@ -1666,7 +1640,7 @@ + forced_speed_duplex = adapter->hw.mac.forced_speed_duplex; + autoneg = adapter->hw.mac.autoneg; + +- dev_info(&adapter->pdev->dev, "offline testing starting\n"); ++ DPRINTK(HW, INFO, "offline testing starting\n"); + + /* Link test performed before hardware reset so autoneg doesn't + * interfere with test result */ +@@ -1700,15 +1674,15 @@ + adapter->hw.mac.autoneg = autoneg; + + /* force this routine to wait until autoneg complete/timeout */ +- adapter->hw.phy.autoneg_wait_to_complete = true; ++ adapter->hw.phy.autoneg_wait_to_complete = TRUE; + igb_reset(adapter); +- adapter->hw.phy.autoneg_wait_to_complete = false; ++ adapter->hw.phy.autoneg_wait_to_complete = FALSE; + + clear_bit(__IGB_TESTING, &adapter->state); + if (if_running) + dev_open(netdev); + } else { +- dev_info(&adapter->pdev->dev, "online testing starting\n"); ++ DPRINTK(HW, INFO, "online testing starting\n"); + /* Online tests */ + if (igb_link_test(adapter, &data[4])) + eth_test->flags |= ETH_TEST_FL_FAILED; +@@ -1725,7 +1699,7 @@ + } + + static int igb_wol_exclusion(struct igb_adapter *adapter, +- struct ethtool_wolinfo *wol) ++ struct ethtool_wolinfo *wol) + { + struct e1000_hw *hw = &adapter->hw; + int retval = 1; /* fail by default */ +@@ -1739,7 +1713,16 @@ + case E1000_DEV_ID_82576_FIBER: + case E1000_DEV_ID_82576_SERDES: + /* Wake events not supported on port B */ +- if (rd32(E1000_STATUS) & E1000_STATUS_FUNC_1) { ++ if (E1000_READ_REG(hw, E1000_STATUS) & E1000_STATUS_FUNC_1) { ++ wol->supported = 0; ++ break; ++ } ++ /* return success for non excluded adapter ports */ ++ retval = 0; ++ break; ++ case E1000_DEV_ID_82576_QUAD_COPPER: ++ /* quad port adapters only support WoL on port A */ ++ if (!(adapter->flags & IGB_FLAG_QUAD_PORT_A)) { + wol->supported = 0; + break; + } +@@ -1750,7 +1733,7 @@ + /* dual port cards only support WoL on port A from now on + * unless it was enabled in the eeprom for port B + * so exclude FUNC_1 ports from having WoL enabled */ +- if (rd32(E1000_STATUS) & E1000_STATUS_FUNC_1 && ++ if (E1000_READ_REG(hw, E1000_STATUS) & E1000_STATUS_FUNC_1 && + !adapter->eeprom_wol) { + wol->supported = 0; + break; +@@ -1767,7 +1750,7 @@ + struct igb_adapter *adapter = netdev_priv(netdev); + + wol->supported = WAKE_UCAST | WAKE_MCAST | +- WAKE_BCAST | WAKE_MAGIC; ++ WAKE_BCAST | WAKE_MAGIC; + wol->wolopts = 0; + + /* this function will set ->supported = 0 and return 1 if wol is not +@@ -1802,8 +1785,7 @@ + if (wol->wolopts & (WAKE_PHY | WAKE_ARP | WAKE_MAGICSECURE)) + return -EOPNOTSUPP; + +- if (igb_wol_exclusion(adapter, wol) || +- !device_can_wakeup(&adapter->pdev->dev)) ++ if (igb_wol_exclusion(adapter, wol)) + return wol->wolopts ? -EOPNOTSUPP : 0; + + switch (hw->device_id) { +@@ -1842,12 +1824,12 @@ + if (!data || data > (u32)(MAX_SCHEDULE_TIMEOUT / HZ)) + data = (u32)(MAX_SCHEDULE_TIMEOUT / HZ); + +- igb_blink_led(hw); ++ e1000_blink_led(hw); + msleep_interruptible(data * 1000); + +- igb_led_off(hw); ++ e1000_led_off(hw); + clear_bit(IGB_LED_ON, &adapter->led_status); +- igb_cleanup_led(hw); ++ e1000_cleanup_led(hw); + + return 0; + } +@@ -1867,15 +1849,16 @@ + + /* convert to rate of irq's per second */ + if (ec->rx_coalesce_usecs && ec->rx_coalesce_usecs <= 3) { ++ adapter->itr = IGB_START_ITR; + adapter->itr_setting = ec->rx_coalesce_usecs; +- adapter->itr = IGB_START_ITR; + } else { +- adapter->itr_setting = ec->rx_coalesce_usecs << 2; +- adapter->itr = adapter->itr_setting; ++ adapter->itr = ec->rx_coalesce_usecs << 2; ++ adapter->itr_setting = adapter->itr; + } + + for (i = 0; i < adapter->num_rx_queues; i++) +- wr32(adapter->rx_ring[i].itr_register, adapter->itr); ++ writel(adapter->itr, ++ hw->hw_addr + adapter->rx_ring[i].itr_register); + + return 0; + } +@@ -1893,7 +1876,6 @@ + return 0; + } + +- + static int igb_nway_reset(struct net_device *netdev) + { + struct igb_adapter *adapter = netdev_priv(netdev); +@@ -1902,27 +1884,20 @@ + return 0; + } + +-static int igb_get_sset_count(struct net_device *netdev, int sset) ++static int igb_get_stats_count(struct net_device *netdev) + { +- switch (sset) { +- case ETH_SS_STATS: +- return IGB_STATS_LEN; +- case ETH_SS_TEST: +- return IGB_TEST_LEN; +- default: +- return -ENOTSUPP; +- } ++ return IGB_STATS_LEN; + } + + static void igb_get_ethtool_stats(struct net_device *netdev, +- struct ethtool_stats *stats, u64 *data) ++ struct ethtool_stats *stats, u64 *data) + { + struct igb_adapter *adapter = netdev_priv(netdev); + u64 *queue_stat; + int stat_count = sizeof(struct igb_queue_stats) / sizeof(u64); + int j; + int i; +-#ifdef CONFIG_IGB_LRO ++#ifdef IGB_LRO + int aggregated = 0, flushed = 0, no_desc = 0; + + for (i = 0; i < adapter->num_rx_queues; i++) { +@@ -1936,6 +1911,7 @@ + #endif + + igb_update_stats(adapter); ++ + for (i = 0; i < IGB_GLOBAL_STATS_LEN; i++) { + char *p = (char *)adapter+igb_gstrings_stats[i].stat_offset; + data[i] = (igb_gstrings_stats[i].sizeof_stat == +@@ -2016,18 +1992,24 @@ + .set_tx_csum = igb_set_tx_csum, + .get_sg = ethtool_op_get_sg, + .set_sg = ethtool_op_set_sg, ++#ifdef NETIF_F_TSO + .get_tso = ethtool_op_get_tso, + .set_tso = igb_set_tso, ++#endif ++ .self_test_count = igb_diag_test_count, + .self_test = igb_diag_test, + .get_strings = igb_get_strings, + .phys_id = igb_phys_id, +- .get_sset_count = igb_get_sset_count, ++ .get_stats_count = igb_get_stats_count, + .get_ethtool_stats = igb_get_ethtool_stats, ++#ifdef ETHTOOL_GPERMADDR ++ .get_perm_addr = ethtool_op_get_perm_addr, ++#endif + .get_coalesce = igb_get_coalesce, + .set_coalesce = igb_set_coalesce, + #ifdef NETIF_F_LRO +- .get_flags = ethtool_op_get_flags, +- .set_flags = ethtool_op_set_flags, ++ .get_flags = ethtool_op_get_flags, ++ .set_flags = ethtool_op_set_flags, + #endif + }; + +@@ -2035,3 +2017,4 @@ + { + SET_ETHTOOL_OPS(netdev, &igb_ethtool_ops); + } ++#endif /* SIOCETHTOOL */ +diff -r f5806398a14e drivers/net/igb/igb_main.c +--- a/drivers/net/igb/igb_main.c Mon Jun 15 11:45:45 2009 +0100 ++++ b/drivers/net/igb/igb_main.c Mon Jun 15 11:59:49 2009 +0100 +@@ -1,7 +1,7 @@ + /******************************************************************************* + + Intel(R) Gigabit Ethernet Linux driver +- Copyright(c) 2007 Intel Corporation. ++ Copyright(c) 2007-2009 Intel Corporation. + + This program is free software; you can redistribute it and/or modify it + under the terms and conditions of the GNU General Public License, +@@ -31,39 +31,45 @@ + #include + #include + #include ++#include ++#ifdef NETIF_F_TSO ++#include ++#ifdef NETIF_F_TSO6 + #include +-#include + #include ++#endif ++#endif ++#ifdef SIOCGMIIPHY + #include ++#endif ++#ifdef SIOCETHTOOL + #include ++#endif + #include +-#include +-#include +-#include +-#include +-#ifdef CONFIG_DCA +-#include +-#endif ++ + #include "igb.h" + +-#define DRV_VERSION "1.2.45-k2" ++#define DRV_DEBUG ++#define DRV_HW_PERF ++#define VERSION_SUFFIX ++ ++#define DRV_VERSION "1.3.19.3" VERSION_SUFFIX DRV_DEBUG DRV_HW_PERF ++ + char igb_driver_name[] = "igb"; + char igb_driver_version[] = DRV_VERSION; + static const char igb_driver_string[] = +- "Intel(R) Gigabit Ethernet Network Driver"; +-static const char igb_copyright[] = "Copyright (c) 2008 Intel Corporation."; +- +-static const struct e1000_info *igb_info_tbl[] = { +- [board_82575] = &e1000_82575_info, +-}; ++ "Intel(R) Gigabit Ethernet Network Driver"; ++static const char igb_copyright[] = "Copyright (c) 2007-2008 Intel Corporation."; + + static struct pci_device_id igb_pci_tbl[] = { +- { PCI_VDEVICE(INTEL, E1000_DEV_ID_82576), board_82575 }, +- { PCI_VDEVICE(INTEL, E1000_DEV_ID_82576_FIBER), board_82575 }, +- { PCI_VDEVICE(INTEL, E1000_DEV_ID_82576_SERDES), board_82575 }, +- { PCI_VDEVICE(INTEL, E1000_DEV_ID_82575EB_COPPER), board_82575 }, +- { PCI_VDEVICE(INTEL, E1000_DEV_ID_82575EB_FIBER_SERDES), board_82575 }, +- { PCI_VDEVICE(INTEL, E1000_DEV_ID_82575GB_QUAD_COPPER), board_82575 }, ++ { PCI_VDEVICE(INTEL, E1000_DEV_ID_82576) }, ++ { PCI_VDEVICE(INTEL, E1000_DEV_ID_82576_NS) }, ++ { PCI_VDEVICE(INTEL, E1000_DEV_ID_82576_FIBER) }, ++ { PCI_VDEVICE(INTEL, E1000_DEV_ID_82576_SERDES) }, ++ { PCI_VDEVICE(INTEL, E1000_DEV_ID_82576_QUAD_COPPER) }, ++ { PCI_VDEVICE(INTEL, E1000_DEV_ID_82575EB_COPPER) }, ++ { PCI_VDEVICE(INTEL, E1000_DEV_ID_82575EB_FIBER_SERDES) }, ++ { PCI_VDEVICE(INTEL, E1000_DEV_ID_82575GB_QUAD_COPPER) }, + /* required last entry */ + {0, } + }; +@@ -93,7 +99,7 @@ + static void igb_watchdog(unsigned long); + static void igb_watchdog_task(struct work_struct *); + static int igb_xmit_frame_ring_adv(struct sk_buff *, struct net_device *, +- struct igb_ring *); ++ struct igb_ring *); + static int igb_xmit_frame_adv(struct sk_buff *skb, struct net_device *); + static struct net_device_stats *igb_get_stats(struct net_device *); + static int igb_change_mtu(struct net_device *, int); +@@ -102,18 +108,19 @@ + static irqreturn_t igb_intr_msi(int irq, void *); + static irqreturn_t igb_msix_other(int irq, void *); + static irqreturn_t igb_msix_rx(int irq, void *); ++#ifdef CONFIG_IGB_SEPARATE_TX_HANDLER + static irqreturn_t igb_msix_tx(int irq, void *); +-static int igb_clean_rx_ring_msix(struct napi_struct *, int); +-#ifdef CONFIG_DCA ++#endif ++#ifdef IGB_DCA + static void igb_update_rx_dca(struct igb_ring *); + static void igb_update_tx_dca(struct igb_ring *); + static void igb_setup_dca(struct igb_adapter *); +-#endif /* CONFIG_DCA */ ++#endif /* IGB_DCA */ + static bool igb_clean_tx_irq(struct igb_ring *); + static int igb_poll(struct napi_struct *, int); + static bool igb_clean_rx_irq_adv(struct igb_ring *, int *, int); + static void igb_alloc_rx_buffers_adv(struct igb_ring *, int); +-#ifdef CONFIG_IGB_LRO ++#ifdef IGB_LRO + static int igb_get_skb_hdr(struct sk_buff *skb, void **, void **, u64 *, void *); + #endif + static int igb_ioctl(struct net_device *, struct ifreq *, int cmd); +@@ -128,8 +135,17 @@ + #ifdef CONFIG_PM + static int igb_resume(struct pci_dev *); + #endif ++#ifndef USE_REBOOT_NOTIFIER + static void igb_shutdown(struct pci_dev *); +-#ifdef CONFIG_DCA ++#else ++static int igb_notify_reboot(struct notifier_block *, unsigned long, void *); ++static struct notifier_block igb_notifier_reboot = { ++ .notifier_call = igb_notify_reboot, ++ .next = NULL, ++ .priority = 0 ++}; ++#endif ++#ifdef IGB_DCA + static int igb_notify_dca(struct notifier_block *, unsigned long, void *); + static struct notifier_block dca_notifier = { + .notifier_call = igb_notify_dca, +@@ -140,11 +156,12 @@ + + #ifdef CONFIG_NET_POLL_CONTROLLER + /* for netdump / net console */ +-static void igb_netpoll(struct net_device *); +-#endif +- ++static void igb_netpoll (struct net_device *); ++#endif ++ ++#ifdef HAVE_PCI_ERS + static pci_ers_result_t igb_io_error_detected(struct pci_dev *, +- pci_channel_state_t); ++ pci_channel_state_t); + static pci_ers_result_t igb_io_slot_reset(struct pci_dev *); + static void igb_io_resume(struct pci_dev *); + +@@ -153,6 +170,7 @@ + .slot_reset = igb_io_slot_reset, + .resume = igb_io_resume, + }; ++#endif + + + static struct pci_driver igb_driver = { +@@ -165,28 +183,22 @@ + .suspend = igb_suspend, + .resume = igb_resume, + #endif ++#ifndef USE_REBOOT_NOTIFIER + .shutdown = igb_shutdown, +- .err_handler = &igb_err_handler +-}; +- +-static int global_quad_port_a; /* global quad port a indication */ ++#endif ++#ifdef HAVE_PCI_ERS ++ .err_handler = &igb_err_handler, ++#endif ++}; + + MODULE_AUTHOR("Intel Corporation, "); + MODULE_DESCRIPTION("Intel(R) Gigabit Ethernet Network Driver"); + MODULE_LICENSE("GPL"); + MODULE_VERSION(DRV_VERSION); + +-#ifdef DEBUG +-/** +- * igb_get_hw_dev_name - return device name string +- * used by hardware layer to print debugging information +- **/ +-char *igb_get_hw_dev_name(struct e1000_hw *hw) +-{ +- struct igb_adapter *adapter = hw->back; +- return adapter->netdev->name; +-} +-#endif ++static int debug = NETIF_MSG_DRV | NETIF_MSG_PROBE; ++module_param(debug, int, 0); ++MODULE_PARM_DESC(debug, "Debug level (0=none, ..., 16=all)"); + + /** + * igb_init_module - Driver Registration Routine +@@ -202,11 +214,14 @@ + + printk(KERN_INFO "%s\n", igb_copyright); + +- global_quad_port_a = 0; +- ++#ifdef IGB_DCA ++ dca_register_notify(&dca_notifier); ++#endif + ret = pci_register_driver(&igb_driver); +-#ifdef CONFIG_DCA +- dca_register_notify(&dca_notifier); ++#ifdef USE_REBOOT_NOTIFIER ++ if (ret >= 0) { ++ register_reboot_notifier(&igb_notifier_reboot); ++ } + #endif + return ret; + } +@@ -221,13 +236,52 @@ + **/ + static void __exit igb_exit_module(void) + { +-#ifdef CONFIG_DCA ++#ifdef IGB_DCA + dca_unregister_notify(&dca_notifier); + #endif ++#ifdef USE_REBOOT_NOTIFIER ++ unregister_reboot_notifier(&igb_notifier_reboot); ++#endif + pci_unregister_driver(&igb_driver); + } + + module_exit(igb_exit_module); ++ ++/** ++ * igb_cache_ring_register - Descriptor ring to register mapping ++ * @adapter: board private structure to initialize ++ * ++ * Once we know the feature-set enabled for the device, we'll cache ++ * the register offset the descriptor ring is assigned to. ++ **/ ++static void igb_cache_ring_register(struct igb_adapter *adapter) ++{ ++ int i; ++ u32 rbase_offset = 0; ++ ++ switch (adapter->hw.mac.type) { ++ case e1000_82576: ++ /* The queues are allocated for virtualization such that VF 0 ++ * is allocated queues 0 and 8, VF 1 queues 1 and 9, etc. ++ * In order to avoid collision we start at the first free queue ++ * and continue consuming queues in the same sequence ++ */ ++ for (i = 0; i < adapter->num_rx_queues; i++) ++ adapter->rx_ring[i].reg_idx = rbase_offset + ++ ((i & 0x1) << 3) + (i >> 1); ++ for (i = 0; i < adapter->num_tx_queues; i++) ++ adapter->tx_ring[i].reg_idx = rbase_offset + ++ ((i & 0x1) << 3) + (i >> 1); ++ break; ++ case e1000_82575: ++ default: ++ for (i = 0; i < adapter->num_rx_queues; i++) ++ adapter->rx_ring[i].reg_idx = i; ++ for (i = 0; i < adapter->num_tx_queues; i++) ++ adapter->tx_ring[i].reg_idx = i; ++ break; ++ } ++} + + /** + * igb_alloc_queues - Allocate memory for all rings +@@ -241,16 +295,14 @@ + int i; + + adapter->tx_ring = kcalloc(adapter->num_tx_queues, +- sizeof(struct igb_ring), GFP_KERNEL); ++ sizeof(struct igb_ring), GFP_KERNEL); + if (!adapter->tx_ring) +- return -ENOMEM; ++ goto err; + + adapter->rx_ring = kcalloc(adapter->num_rx_queues, +- sizeof(struct igb_ring), GFP_KERNEL); +- if (!adapter->rx_ring) { +- kfree(adapter->tx_ring); +- return -ENOMEM; +- } ++ sizeof(struct igb_ring), GFP_KERNEL); ++ if (!adapter->rx_ring) ++ goto err; + + adapter->rx_ring->buddy = adapter->tx_ring; + +@@ -266,27 +318,71 @@ + ring->adapter = adapter; + ring->queue_index = i; + ring->itr_register = E1000_ITR; +- + /* set a default napi handler for each rx_ring */ + netif_napi_add(adapter->netdev, &ring->napi, igb_poll, 64); + } +- return 0; +-} +- +-static void igb_free_queues(struct igb_adapter *adapter) +-{ +- int i; +- +- for (i = 0; i < adapter->num_rx_queues; i++) +- netif_napi_del(&adapter->rx_ring[i].napi); +- ++ ++ igb_cache_ring_register(adapter); ++ ++ return E1000_SUCCESS; ++ ++err: + kfree(adapter->tx_ring); + kfree(adapter->rx_ring); ++ ++ return -ENOMEM; ++} ++ ++static void igb_free_queues(struct igb_adapter *adapter) ++{ ++ int i; ++ ++ for (i = 0; i < adapter->num_rx_queues; i++) ++ netif_napi_del(&adapter->rx_ring[i].napi); ++ ++ kfree(adapter->tx_ring); ++ kfree(adapter->rx_ring); ++} ++ ++static void igb_configure_lli(struct igb_adapter *adapter) ++{ ++ struct e1000_hw *hw = &adapter->hw; ++ u16 port; ++ ++ /* LLI should only be enabled for MSI-X or MSI interrupts */ ++ if (!adapter->msix_entries && !(adapter->flags & IGB_FLAG_HAS_MSI)) ++ return; ++ ++ if (adapter->lli_port) { ++ /* use filter 0 for port */ ++ port = ntohs((u16)adapter->lli_port); ++ E1000_WRITE_REG(hw, E1000_IMIR(0), ++ (port | E1000_IMIR_PORT_IM_EN)); ++ E1000_WRITE_REG(hw, E1000_IMIREXT(0), ++ (E1000_IMIREXT_SIZE_BP | E1000_IMIREXT_CTRL_BP)); ++ } ++ ++ if (adapter->flags & IGB_FLAG_LLI_PUSH) { ++ /* use filter 1 for push flag */ ++ E1000_WRITE_REG(hw, E1000_IMIR(1), ++ (E1000_IMIR_PORT_BP | E1000_IMIR_PORT_IM_EN)); ++ E1000_WRITE_REG(hw, E1000_IMIREXT(1), ++ (E1000_IMIREXT_SIZE_BP | E1000_IMIREXT_CTRL_PSH)); ++ } ++ ++ if (adapter->lli_size) { ++ /* use filter 2 for size */ ++ E1000_WRITE_REG(hw, E1000_IMIR(2), ++ (E1000_IMIR_PORT_BP | E1000_IMIR_PORT_IM_EN)); ++ E1000_WRITE_REG(hw, E1000_IMIREXT(2), ++ (adapter->lli_size | E1000_IMIREXT_CTRL_BP)); ++ } ++ + } + + #define IGB_N0_QUEUE -1 + static void igb_assign_vector(struct igb_adapter *adapter, int rx_queue, +- int tx_queue, int msix_vector) ++ int tx_queue, int msix_vector) + { + u32 msixbm = 0; + struct e1000_hw *hw = &adapter->hw; +@@ -305,44 +401,44 @@ + if (tx_queue > IGB_N0_QUEUE) { + msixbm |= E1000_EICR_TX_QUEUE0 << tx_queue; + adapter->tx_ring[tx_queue].eims_value = +- E1000_EICR_TX_QUEUE0 << tx_queue; +- } +- array_wr32(E1000_MSIXBM(0), msix_vector, msixbm); +- break; +- case e1000_82576: +- /* The 82576 uses a table-based method for assigning vectors. ++ E1000_EICR_TX_QUEUE0 << tx_queue; ++ } ++ E1000_WRITE_REG_ARRAY(hw, E1000_MSIXBM(0), msix_vector, msixbm); ++ break; ++ case e1000_82576: ++ /* 82576 uses a table-based method for assigning vectors. + Each queue has a single entry in the table to which we write + a vector number along with a "valid" bit. Sadly, the layout + of the table is somewhat counterintuitive. */ + if (rx_queue > IGB_N0_QUEUE) { +- index = (rx_queue & 0x7); +- ivar = array_rd32(E1000_IVAR0, index); +- if (rx_queue < 8) { ++ index = (rx_queue >> 1); ++ ivar = E1000_READ_REG_ARRAY(hw, E1000_IVAR0, index); ++ if (rx_queue & 0x1) { ++ /* vector goes into third byte of register */ ++ ivar = ivar & 0xFF00FFFF; ++ ivar |= (msix_vector | E1000_IVAR_VALID) << 16; ++ } else { + /* vector goes into low byte of register */ + ivar = ivar & 0xFFFFFF00; + ivar |= msix_vector | E1000_IVAR_VALID; ++ } ++ adapter->rx_ring[rx_queue].eims_value= 1 << msix_vector; ++ E1000_WRITE_REG_ARRAY(hw, E1000_IVAR0, index, ivar); ++ } ++ if (tx_queue > IGB_N0_QUEUE) { ++ index = (tx_queue >> 1); ++ ivar = E1000_READ_REG_ARRAY(hw, E1000_IVAR0, index); ++ if (tx_queue & 0x1) { ++ /* vector goes into high byte of register */ ++ ivar = ivar & 0x00FFFFFF; ++ ivar |= (msix_vector | E1000_IVAR_VALID) << 24; + } else { +- /* vector goes into third byte of register */ +- ivar = ivar & 0xFF00FFFF; +- ivar |= (msix_vector | E1000_IVAR_VALID) << 16; +- } +- adapter->rx_ring[rx_queue].eims_value= 1 << msix_vector; +- array_wr32(E1000_IVAR0, index, ivar); +- } +- if (tx_queue > IGB_N0_QUEUE) { +- index = (tx_queue & 0x7); +- ivar = array_rd32(E1000_IVAR0, index); +- if (tx_queue < 8) { + /* vector goes into second byte of register */ + ivar = ivar & 0xFFFF00FF; + ivar |= (msix_vector | E1000_IVAR_VALID) << 8; +- } else { +- /* vector goes into high byte of register */ +- ivar = ivar & 0x00FFFFFF; +- ivar |= (msix_vector | E1000_IVAR_VALID) << 24; + } + adapter->tx_ring[tx_queue].eims_value= 1 << msix_vector; +- array_wr32(E1000_IVAR0, index, ivar); ++ E1000_WRITE_REG_ARRAY(hw, E1000_IVAR0, index, ivar); + } + break; + default: +@@ -367,10 +463,11 @@ + if (hw->mac.type == e1000_82576) + /* Turn on MSI-X capability first, or our settings + * won't stick. And it will take days to debug. */ +- wr32(E1000_GPIE, E1000_GPIE_MSIX_MODE | +- E1000_GPIE_PBA | E1000_GPIE_EIAME | ++ E1000_WRITE_REG(hw, E1000_GPIE, E1000_GPIE_MSIX_MODE | ++ E1000_GPIE_PBA | E1000_GPIE_EIAME | + E1000_GPIE_NSICR); + ++#ifdef CONFIG_IGB_SEPARATE_TX_HANDLER + for (i = 0; i < adapter->num_tx_queues; i++) { + struct igb_ring *tx_ring = &adapter->tx_ring[i]; + igb_assign_vector(adapter, IGB_N0_QUEUE, i, vector++); +@@ -394,14 +491,33 @@ + writel(1, hw->hw_addr + rx_ring->itr_register); + } + ++#else ++ for (i = 0; i < adapter->num_rx_queues; i++) { ++ struct igb_ring *rx_ring = &adapter->rx_ring[i]; ++ if (i < adapter->num_tx_queues) { ++ igb_assign_vector(adapter, i, i, vector++); ++ rx_ring->buddy = &adapter->tx_ring[i]; ++ rx_ring->eims_value |= adapter->tx_ring[i].eims_value; ++ } else { ++ igb_assign_vector(adapter, i, IGB_N0_QUEUE, vector++); ++ } ++ adapter->eims_enable_mask |= rx_ring->eims_value; ++ if (rx_ring->itr_val) ++ writel(rx_ring->itr_val, ++ hw->hw_addr + rx_ring->itr_register); ++ else ++ writel(1, hw->hw_addr + rx_ring->itr_register); ++ } ++ ++#endif + + /* set vector for other causes, i.e. link changes */ + switch (hw->mac.type) { + case e1000_82575: +- array_wr32(E1000_MSIXBM(0), vector++, +- E1000_EIMS_OTHER); +- +- tmp = rd32(E1000_CTRL_EXT); ++ E1000_WRITE_REG_ARRAY(hw, E1000_MSIXBM(0), vector++, ++ E1000_EIMS_OTHER); ++ ++ tmp = E1000_READ_REG(hw, E1000_CTRL_EXT); + /* enable MSI-X PBA support*/ + tmp |= E1000_CTRL_EXT_PBA_CLR; + +@@ -409,7 +525,7 @@ + tmp |= E1000_CTRL_EXT_EIAME; + tmp |= E1000_CTRL_EXT_IRCA; + +- wr32(E1000_CTRL_EXT, tmp); ++ E1000_WRITE_REG(hw, E1000_CTRL_EXT, tmp); + adapter->eims_enable_mask |= E1000_EIMS_OTHER; + adapter->eims_other = E1000_EIMS_OTHER; + +@@ -417,7 +533,7 @@ + + case e1000_82576: + tmp = (vector++ | E1000_IVAR_VALID) << 8; +- wr32(E1000_IVAR_MISC, tmp); ++ E1000_WRITE_REG(hw, E1000_IVAR_MISC, tmp); + + adapter->eims_enable_mask = (1 << (vector)) - 1; + adapter->eims_other = 1 << (vector - 1); +@@ -426,7 +542,7 @@ + /* do nothing, since nothing else supports MSI-X */ + break; + } /* switch (hw->mac.type) */ +- wrfl(); ++ E1000_WRITE_FLUSH(hw); + } + + /** +@@ -440,41 +556,42 @@ + struct net_device *netdev = adapter->netdev; + int i, err = 0, vector = 0; + +- vector = 0; +- ++#ifdef CONFIG_IGB_SEPARATE_TX_HANDLER + for (i = 0; i < adapter->num_tx_queues; i++) { + struct igb_ring *ring = &(adapter->tx_ring[i]); +- sprintf(ring->name, "%s-tx%d", netdev->name, i); ++ sprintf(ring->name, "%s-tx-%d", netdev->name, i); + err = request_irq(adapter->msix_entries[vector].vector, +- &igb_msix_tx, 0, ring->name, +- &(adapter->tx_ring[i])); ++ &igb_msix_tx, 0, ring->name, ++ &(adapter->tx_ring[i])); + if (err) + goto out; +- ring->itr_register = E1000_EITR(0) + (vector << 2); +- ring->itr_val = 976; /* ~4000 ints/sec */ ++ ring->itr_register = E1000_EITR(vector); ++ ring->itr_val = 1952; /* ~2000 ints/sec */ + vector++; + } ++#endif + for (i = 0; i < adapter->num_rx_queues; i++) { + struct igb_ring *ring = &(adapter->rx_ring[i]); + if (strlen(netdev->name) < (IFNAMSIZ - 5)) +- sprintf(ring->name, "%s-rx%d", netdev->name, i); ++#ifdef CONFIG_IGB_SEPARATE_TX_HANDLER ++ sprintf(ring->name, "%s-rx-%d", netdev->name, i); ++#else ++ sprintf(ring->name, "%s-TxRx-%d", netdev->name, i); ++#endif + else + memcpy(ring->name, netdev->name, IFNAMSIZ); + err = request_irq(adapter->msix_entries[vector].vector, +- &igb_msix_rx, 0, ring->name, +- &(adapter->rx_ring[i])); ++ &igb_msix_rx, 0, ring->name, ++ &(adapter->rx_ring[i])); + if (err) + goto out; +- ring->itr_register = E1000_EITR(0) + (vector << 2); ++ ring->itr_register = E1000_EITR(vector); + ring->itr_val = adapter->itr; +- /* overwrite the poll routine for MSIX, we've already done +- * netif_napi_add */ +- ring->napi.poll = &igb_clean_rx_ring_msix; + vector++; + } + + err = request_irq(adapter->msix_entries[vector].vector, +- &igb_msix_other, 0, netdev->name, netdev); ++ &igb_msix_other, 0, netdev->name, netdev); + if (err) + goto out; + +@@ -506,33 +623,67 @@ + { + int err; + int numvecs, i; +- +- numvecs = adapter->num_tx_queues + adapter->num_rx_queues + 1; +- adapter->msix_entries = kcalloc(numvecs, sizeof(struct msix_entry), +- GFP_KERNEL); +- if (!adapter->msix_entries) +- goto msi_only; +- +- for (i = 0; i < numvecs; i++) +- adapter->msix_entries[i].entry = i; +- +- err = pci_enable_msix(adapter->pdev, +- adapter->msix_entries, +- numvecs); +- if (err == 0) +- goto out; +- +- igb_reset_interrupt_capability(adapter); +- +- /* If we can't do MSI-X, try MSI */ +-msi_only: +- adapter->num_rx_queues = 1; ++#ifndef CONFIG_IGB_SEPARATE_TX_HANDLER ++ struct e1000_hw *hw = &adapter->hw; ++#endif ++ ++ /* Number of supported queues. */ ++ adapter->num_rx_queues = min_t(u32, IGB_MAX_RX_QUEUES, num_online_cpus()); ++#ifdef HAVE_TX_MQ ++ adapter->num_tx_queues = min_t(u32, IGB_MAX_TX_QUEUES, num_online_cpus()); ++#else + adapter->num_tx_queues = 1; +- if (!pci_enable_msi(adapter->pdev)) +- adapter->flags |= IGB_FLAG_HAS_MSI; +-out: ++#endif ++ ++ switch (adapter->int_mode) { ++ case IGB_INT_MODE_MSIX_1Q: ++ adapter->num_rx_queues = 1; ++ adapter->num_tx_queues = 1; ++ case IGB_INT_MODE_MSIX_MQ: ++#ifdef CONFIG_IGB_SEPARATE_TX_HANDLER ++ numvecs = adapter->num_tx_queues + adapter->num_rx_queues + 1; ++#else ++ numvecs = adapter->num_rx_queues + 1; ++#endif ++ adapter->msix_entries = kcalloc(numvecs, ++ sizeof(struct msix_entry), ++ GFP_KERNEL); ++ if (adapter->msix_entries) { ++ for (i=0; i < numvecs; i++) ++ adapter->msix_entries[i].entry = i; ++ ++ err = pci_enable_msix(adapter->pdev, ++ adapter->msix_entries, numvecs); ++ if (err == 0) ++ break; ++ } ++ /* MSI-X failed, so fall through and try MSI */ ++ DPRINTK(PROBE, WARNING, "Failed to initialize MSI-X interrupts." ++ " Falling back to MSI interrupts.\n"); ++ igb_reset_interrupt_capability(adapter); ++ case IGB_INT_MODE_MSI: ++ if (!pci_enable_msi(adapter->pdev)) ++ adapter->flags |= IGB_FLAG_HAS_MSI; ++ else ++ DPRINTK(PROBE, WARNING, "Failed to initialize MSI " ++ "interrupts. Falling back to legacy interrupts.\n"); ++ /* Fall through */ ++ case IGB_INT_MODE_LEGACY: ++ adapter->num_rx_queues = 1; ++ adapter->num_tx_queues = 1; ++ /* Don't do anything; this is system default */ ++ break; ++ } ++ ++#ifdef HAVE_TX_MQ + /* Notify the stack of the (possibly) reduced Tx Queue count. */ ++#ifdef CONFIG_NETDEVICES_MULTIQUEUE ++ adapter->netdev->egress_subqueue_count = adapter->num_tx_queues; ++#else + adapter->netdev->real_num_tx_queues = adapter->num_tx_queues; ++#endif ++#endif ++ + return; + } + +@@ -563,33 +714,35 @@ + } else { + switch (hw->mac.type) { + case e1000_82575: +- wr32(E1000_MSIXBM(0), +- (E1000_EICR_RX_QUEUE0 | E1000_EIMS_OTHER)); ++ E1000_WRITE_REG(hw, E1000_MSIXBM(0), ++ (E1000_EICR_RX_QUEUE0 | ++ E1000_EIMS_OTHER)); + break; + case e1000_82576: +- wr32(E1000_IVAR0, E1000_IVAR_VALID); ++ E1000_WRITE_REG(hw, E1000_IVAR0, E1000_IVAR_VALID); + break; + default: + break; + } + } +- + if (adapter->flags & IGB_FLAG_HAS_MSI) { + err = request_irq(adapter->pdev->irq, &igb_intr_msi, 0, +- netdev->name, netdev); ++ netdev->name, netdev); + if (!err) + goto request_done; ++ + /* fall back to legacy interrupts */ + igb_reset_interrupt_capability(adapter); + adapter->flags &= ~IGB_FLAG_HAS_MSI; + } + + err = request_irq(adapter->pdev->irq, &igb_intr, IRQF_SHARED, +- netdev->name, netdev); +- +- if (err) +- dev_err(&adapter->pdev->dev, "Error %d getting interrupt\n", +- err); ++ netdev->name, netdev); ++ ++ if (err) { ++ DPRINTK(PROBE, ERR, "Error %d getting interrupt\n", err); ++ goto request_done; ++ } + + request_done: + return err; +@@ -602,9 +755,11 @@ + if (adapter->msix_entries) { + int vector = 0, i; + ++#ifdef CONFIG_IGB_SEPARATE_TX_HANDLER + for (i = 0; i < adapter->num_tx_queues; i++) + free_irq(adapter->msix_entries[vector++].vector, + &(adapter->tx_ring[i])); ++#endif + for (i = 0; i < adapter->num_rx_queues; i++) + free_irq(adapter->msix_entries[vector++].vector, + &(adapter->rx_ring[i])); +@@ -625,14 +780,15 @@ + struct e1000_hw *hw = &adapter->hw; + + if (adapter->msix_entries) { +- wr32(E1000_EIAM, 0); +- wr32(E1000_EIMC, ~0); +- wr32(E1000_EIAC, 0); +- } +- +- wr32(E1000_IAM, 0); +- wr32(E1000_IMC, ~0); +- wrfl(); ++ E1000_WRITE_REG(hw, E1000_EIAM, 0); ++ E1000_WRITE_REG(hw, E1000_EIMC, ~0); ++ E1000_WRITE_REG(hw, E1000_EIAC, 0); ++ } ++ ++ E1000_WRITE_REG(hw, E1000_IAM, 0); ++ E1000_WRITE_REG(hw, E1000_IMC, ~0); ++ E1000_WRITE_FLUSH(hw); ++ + synchronize_irq(adapter->pdev->irq); + } + +@@ -645,13 +801,14 @@ + struct e1000_hw *hw = &adapter->hw; + + if (adapter->msix_entries) { +- wr32(E1000_EIAC, adapter->eims_enable_mask); +- wr32(E1000_EIAM, adapter->eims_enable_mask); +- wr32(E1000_EIMS, adapter->eims_enable_mask); +- wr32(E1000_IMS, E1000_IMS_LSC); +- } else { +- wr32(E1000_IMS, IMS_ENABLE_MASK); +- wr32(E1000_IAM, IMS_ENABLE_MASK); ++ E1000_WRITE_REG(hw, E1000_EIAC, adapter->eims_enable_mask); ++ E1000_WRITE_REG(hw, E1000_EIAM, adapter->eims_enable_mask); ++ E1000_WRITE_REG(hw, E1000_EIMS, adapter->eims_enable_mask); ++ E1000_WRITE_REG(hw, E1000_IMS, E1000_IMS_LSC | ++ E1000_IMS_DOUTSYNC); ++ } else { ++ E1000_WRITE_REG(hw, E1000_IMS, IMS_ENABLE_MASK); ++ E1000_WRITE_REG(hw, E1000_IAM, IMS_ENABLE_MASK); + } + } + +@@ -693,11 +850,10 @@ + u32 ctrl_ext; + + /* Let firmware take over control of h/w */ +- ctrl_ext = rd32(E1000_CTRL_EXT); +- wr32(E1000_CTRL_EXT, +- ctrl_ext & ~E1000_CTRL_EXT_DRV_LOAD); +-} +- ++ ctrl_ext = E1000_READ_REG(hw, E1000_CTRL_EXT); ++ E1000_WRITE_REG(hw, E1000_CTRL_EXT, ++ ctrl_ext & ~E1000_CTRL_EXT_DRV_LOAD); ++} + + /** + * igb_get_hw_control - get control of the h/w from f/w +@@ -714,9 +870,9 @@ + u32 ctrl_ext; + + /* Let firmware know the driver has taken over */ +- ctrl_ext = rd32(E1000_CTRL_EXT); +- wr32(E1000_CTRL_EXT, +- ctrl_ext | E1000_CTRL_EXT_DRV_LOAD); ++ ctrl_ext = E1000_READ_REG(hw, E1000_CTRL_EXT); ++ E1000_WRITE_REG(hw, E1000_CTRL_EXT, ++ ctrl_ext | E1000_CTRL_EXT_DRV_LOAD); + } + + /** +@@ -737,8 +893,14 @@ + igb_setup_rctl(adapter); + igb_configure_rx(adapter); + +- igb_rx_fifo_flush_82575(&adapter->hw); +- ++ e1000_rx_fifo_flush_82575(&adapter->hw); ++#ifdef CONFIG_NETDEVICES_MULTIQUEUE ++ if (adapter->num_tx_queues > 1) ++ netdev->features |= NETIF_F_MULTI_QUEUE; ++ else ++ netdev->features &= ~NETIF_F_MULTI_QUEUE; ++ ++#endif + /* call IGB_DESC_UNUSED which always leaves + * at least 1 descriptor unused to make sure + * next_to_use != next_to_clean */ +@@ -756,7 +918,6 @@ + * igb_up - Open the interface and prepare it to handle traffic + * @adapter: board private structure + **/ +- + int igb_up(struct igb_adapter *adapter) + { + struct e1000_hw *hw = &adapter->hw; +@@ -772,19 +933,21 @@ + if (adapter->msix_entries) + igb_configure_msix(adapter); + ++ igb_configure_lli(adapter); ++ + /* Clear any pending interrupts. */ +- rd32(E1000_ICR); ++ E1000_READ_REG(hw, E1000_ICR); + igb_irq_enable(adapter); + + /* Fire a link change interrupt to start the watchdog. */ +- wr32(E1000_ICS, E1000_ICS_LSC); ++ E1000_WRITE_REG(hw, E1000_ICS, E1000_ICS_LSC); + return 0; + } + + void igb_down(struct igb_adapter *adapter) + { +- struct e1000_hw *hw = &adapter->hw; +- struct net_device *netdev = adapter->netdev; ++ struct net_device *netdev = adapter->netdev; ++ struct e1000_hw *hw = &adapter->hw; + u32 tctl, rctl; + int i; + +@@ -793,18 +956,18 @@ + set_bit(__IGB_DOWN, &adapter->state); + + /* disable receives in the hardware */ +- rctl = rd32(E1000_RCTL); +- wr32(E1000_RCTL, rctl & ~E1000_RCTL_EN); ++ rctl = E1000_READ_REG(hw, E1000_RCTL); ++ E1000_WRITE_REG(hw, E1000_RCTL, rctl & ~E1000_RCTL_EN); + /* flush and sleep below */ + + netif_tx_stop_all_queues(netdev); + + /* disable transmits in the hardware */ +- tctl = rd32(E1000_TCTL); ++ tctl = E1000_READ_REG(hw, E1000_TCTL); + tctl &= ~E1000_TCTL_EN; +- wr32(E1000_TCTL, tctl); ++ E1000_WRITE_REG(hw, E1000_TCTL, tctl); + /* flush both disables and wait for them to finish */ +- wrfl(); ++ E1000_WRITE_FLUSH(hw); + msleep(10); + + for (i = 0; i < adapter->num_rx_queues; i++) +@@ -817,13 +980,41 @@ + + netdev->tx_queue_len = adapter->tx_queue_len; + netif_carrier_off(netdev); ++ ++ /* record the stats before reset*/ ++ igb_update_stats(adapter); ++ + adapter->link_speed = 0; + adapter->link_duplex = 0; + ++#ifdef IGB_DCA ++ if (adapter->flags & IGB_FLAG_DCA_ENABLED) { ++ adapter->flags &= ~IGB_FLAG_DCA_ENABLED; ++ dca_remove_requester(&adapter->pdev->dev); ++ } ++ ++#endif ++#ifdef HAVE_PCI_ERS + if (!pci_channel_offline(adapter->pdev)) + igb_reset(adapter); ++#else ++ igb_reset(adapter); ++#endif + igb_clean_all_tx_rings(adapter); + igb_clean_all_rx_rings(adapter); ++#ifdef IGB_DCA ++ ++ /* since we reset the hardware DCA settings were cleared */ ++ if (adapter->flags & IGB_FLAG_HAS_DCA) { ++ if (dca_add_requester(&adapter->pdev->dev) == E1000_SUCCESS) { ++ adapter->flags |= IGB_FLAG_DCA_ENABLED; ++ /* always use CB2 mode, difference is masked ++ * in the CB driver */ ++ E1000_WRITE_REG(hw, E1000_DCA_CTRL, 2); ++ igb_setup_dca(adapter); ++ } ++ } ++#endif + } + + void igb_reinit_locked(struct igb_adapter *adapter) +@@ -847,17 +1038,20 @@ + /* Repartition Pba for greater than 9k mtu + * To take effect CTRL.RST is required. + */ +- if (mac->type != e1000_82576) { +- pba = E1000_PBA_34K; +- } +- else { ++ switch (mac->type) { ++ case e1000_82576: + pba = E1000_PBA_64K; ++ break; ++ case e1000_82575: ++ default: ++ pba = E1000_PBA_34K; ++ break; + } + + if ((adapter->max_frame_size > ETH_FRAME_LEN + ETH_FCS_LEN) && + (mac->type < e1000_82576)) { + /* adjust PBA for jumbo frames */ +- wr32(E1000_PBA, pba); ++ E1000_WRITE_REG(hw, E1000_PBA, pba); + + /* To maintain wire speed transmits, the Tx FIFO should be + * large enough to accommodate two full transmit packets, +@@ -865,7 +1059,7 @@ + * the Rx FIFO should be large enough to accommodate at least + * one full receive packet and is similarly rounded up and + * expressed in KB. */ +- pba = rd32(E1000_PBA); ++ pba = E1000_READ_REG(hw, E1000_PBA); + /* upper 16 bits has Tx packet buffer allocation size in KB */ + tx_space = pba >> 16; + /* lower 16 bits has Rx packet buffer allocation size in KB */ +@@ -873,8 +1067,8 @@ + /* the tx fifo also stores 16 bytes of information about the tx + * but don't include ethernet FCS because hardware appends it */ + min_tx_space = (adapter->max_frame_size + +- sizeof(struct e1000_tx_desc) - +- ETH_FCS_LEN) * 2; ++ sizeof(struct e1000_tx_desc) - ++ ETH_FCS_LEN) * 2; + min_tx_space = ALIGN(min_tx_space, 1024); + min_tx_space >>= 10; + /* software strips receive CRC, so leave room for it */ +@@ -894,7 +1088,7 @@ + if (pba < min_rx_space) + pba = min_rx_space; + } +- wr32(E1000_PBA, pba); ++ E1000_WRITE_REG(hw, E1000_PBA, pba); + } + + /* flow control settings */ +@@ -915,39 +1109,43 @@ + } + fc->pause_time = 0xFFFF; + fc->send_xon = 1; +- fc->type = fc->original_type; ++ fc->current_mode = fc->requested_mode; + + /* Allow time for pending master requests to run */ +- adapter->hw.mac.ops.reset_hw(&adapter->hw); +- wr32(E1000_WUC, 0); +- +- if (adapter->hw.mac.ops.init_hw(&adapter->hw)) +- dev_err(&adapter->pdev->dev, "Hardware Error\n"); ++ e1000_reset_hw(hw); ++ E1000_WRITE_REG(hw, E1000_WUC, 0); ++ ++ if (e1000_init_hw(hw)) ++ DPRINTK(PROBE, ERR, "Hardware Error\n"); + + igb_update_mng_vlan(adapter); + + /* Enable h/w to recognize an 802.1Q VLAN Ethernet packet */ +- wr32(E1000_VET, ETHERNET_IEEE_VLAN_TYPE); +- +- igb_reset_adaptive(&adapter->hw); +- if (adapter->hw.phy.ops.get_phy_info) +- adapter->hw.phy.ops.get_phy_info(&adapter->hw); +-} +- +-/** +- * igb_is_need_ioport - determine if an adapter needs ioport resources or not +- * @pdev: PCI device information struct +- * +- * Returns true if an adapter needs ioport resources +- **/ +-static int igb_is_need_ioport(struct pci_dev *pdev) +-{ +- switch (pdev->device) { +- /* Currently there are no adapters that need ioport resources */ +- default: +- return false; +- } +-} ++ E1000_WRITE_REG(hw, E1000_VET, ETHERNET_IEEE_VLAN_TYPE); ++ ++ e1000_get_phy_info(hw); ++} ++ ++#ifdef HAVE_NET_DEVICE_OPS ++static const struct net_device_ops igb_netdev_ops = { ++ .ndo_open = igb_open, ++ .ndo_stop = igb_close, ++ .ndo_start_xmit = igb_xmit_frame_adv, ++ .ndo_get_stats = igb_get_stats, ++ .ndo_set_multicast_list = igb_set_multi, ++ .ndo_set_mac_address = igb_set_mac, ++ .ndo_change_mtu = igb_change_mtu, ++ .ndo_do_ioctl = igb_ioctl, ++ .ndo_tx_timeout = igb_tx_timeout, ++ .ndo_validate_addr = eth_validate_addr, ++ .ndo_vlan_rx_register = igb_vlan_rx_register, ++ .ndo_vlan_rx_add_vid = igb_vlan_rx_add_vid, ++ .ndo_vlan_rx_kill_vid = igb_vlan_rx_kill_vid, ++#ifdef CONFIG_NET_POLL_CONTROLLER ++ .ndo_poll_controller = igb_netpoll, ++#endif ++}; ++#endif /* HAVE_NET_DEVICE_OPS */ + + /** + * igb_probe - Device Initialization Routine +@@ -961,28 +1159,19 @@ + * and a hardware reset occur. + **/ + static int __devinit igb_probe(struct pci_dev *pdev, +- const struct pci_device_id *ent) ++ const struct pci_device_id *ent) + { + struct net_device *netdev; + struct igb_adapter *adapter; + struct e1000_hw *hw; +- const struct e1000_info *ei = igb_info_tbl[ent->driver_data]; +- unsigned long mmio_start, mmio_len; +- int i, err, pci_using_dac; +- u16 eeprom_data = 0; ++ struct pci_dev *us_dev; ++ int i, err, pci_using_dac, pos; ++ u16 eeprom_data = 0, state = 0; + u16 eeprom_apme_mask = IGB_EEPROM_APME; +- u32 part_num; +- int bars, need_ioport; +- +- /* do not allocate ioport bars when not needed */ +- need_ioport = igb_is_need_ioport(pdev); +- if (need_ioport) { +- bars = pci_select_bars(pdev, IORESOURCE_MEM | IORESOURCE_IO); +- err = pci_enable_device(pdev); +- } else { +- bars = pci_select_bars(pdev, IORESOURCE_MEM); +- err = pci_enable_device_mem(pdev); +- } ++ static int cards_found = 0; ++ static int global_quad_port_a = 0; /* global quad port a indication */ ++ ++ err = pci_enable_device_mem(pdev); + if (err) + return err; + +@@ -997,25 +1186,55 @@ + if (err) { + err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK); + if (err) { +- dev_err(&pdev->dev, "No usable DMA " +- "configuration, aborting\n"); ++ IGB_ERR("No usable DMA configuration, " ++ "aborting\n"); + goto err_dma; + } + } + } + +- err = pci_request_selected_regions(pdev, bars, igb_driver_name); ++ /* 82575 requires that the pci-e link partner disable the L0s state */ ++ switch (pdev->device) { ++ case E1000_DEV_ID_82575EB_COPPER: ++ case E1000_DEV_ID_82575EB_FIBER_SERDES: ++ case E1000_DEV_ID_82575GB_QUAD_COPPER: ++ us_dev = pdev->bus->self; ++ if (!us_dev) ++ break; ++ pos = pci_find_capability(us_dev, PCI_CAP_ID_EXP); ++ if (pos) { ++ pci_read_config_word(us_dev, pos + PCI_EXP_LNKCTL, &state); ++ state &= ~PCIE_LINK_STATE_L0S; ++ pci_write_config_word(us_dev, pos + PCI_EXP_LNKCTL, state); ++ printk(KERN_INFO "Disabling ASPM L0s upstream switch " ++ "port %x:%x.%x\n", us_dev->bus->number, ++ PCI_SLOT(us_dev->devfn), PCI_FUNC(us_dev->devfn)); ++ } ++ default: ++ break; ++ } ++ ++ err = pci_request_selected_regions(pdev, ++ pci_select_bars(pdev, ++ IORESOURCE_MEM), ++ igb_driver_name); + if (err) + goto err_pci_reg; + ++ pci_enable_pcie_error_reporting(pdev); ++ + pci_set_master(pdev); +- pci_save_state(pdev); + + err = -ENOMEM; +- netdev = alloc_etherdev_mq(sizeof(struct igb_adapter), IGB_MAX_TX_QUEUES); ++#ifdef HAVE_TX_MQ ++ netdev = alloc_etherdev_mq(sizeof(struct igb_adapter), IGB_ABS_MAX_TX_QUEUES); ++#else ++ netdev = alloc_etherdev(sizeof(struct igb_adapter)); ++#endif /* HAVE_TX_MQ */ + if (!netdev) + goto err_alloc_etherdev; + ++ SET_MODULE_OWNER(netdev); + SET_NETDEV_DEV(netdev, &pdev->dev); + + pci_set_drvdata(pdev, netdev); +@@ -1024,18 +1243,23 @@ + adapter->pdev = pdev; + hw = &adapter->hw; + hw->back = adapter; +- adapter->msg_enable = NETIF_MSG_DRV | NETIF_MSG_PROBE; +- adapter->bars = bars; +- adapter->need_ioport = need_ioport; +- +- mmio_start = pci_resource_start(pdev, 0); +- mmio_len = pci_resource_len(pdev, 0); +- ++ adapter->msg_enable = (1 << debug) - 1; ++ ++#ifdef HAVE_PCI_ERS ++ err = pci_save_state(pdev); ++ if (err) ++ goto err_ioremap; ++#endif + err = -EIO; +- adapter->hw.hw_addr = ioremap(mmio_start, mmio_len); +- if (!adapter->hw.hw_addr) ++ hw->hw_addr = ioremap(pci_resource_start(pdev, 0), ++ pci_resource_len(pdev, 0)); ++ if (!hw->hw_addr) + goto err_ioremap; + ++ ++#ifdef HAVE_NET_DEVICE_OPS ++ netdev->netdev_ops = &igb_netdev_ops; ++#else /* HAVE_NET_DEVICE_OPS */ + netdev->open = &igb_open; + netdev->stop = &igb_close; + netdev->get_stats = &igb_get_stats; +@@ -1043,9 +1267,9 @@ + netdev->set_mac_address = &igb_set_mac; + netdev->change_mtu = &igb_change_mtu; + netdev->do_ioctl = &igb_ioctl; +- igb_set_ethtool_ops(netdev); ++#ifdef HAVE_TX_TIMEOUT + netdev->tx_timeout = &igb_tx_timeout; +- netdev->watchdog_timeo = 5 * HZ; ++#endif + netdev->vlan_rx_register = igb_vlan_rx_register; + netdev->vlan_rx_add_vid = igb_vlan_rx_add_vid; + netdev->vlan_rx_kill_vid = igb_vlan_rx_kill_vid; +@@ -1053,39 +1277,30 @@ + netdev->poll_controller = igb_netpoll; + #endif + netdev->hard_start_xmit = &igb_xmit_frame_adv; ++#endif /* HAVE_NET_DEVICE_OPS */ ++ igb_set_ethtool_ops(netdev); ++#ifdef HAVE_TX_TIMEOUT ++ netdev->watchdog_timeo = 5 * HZ; ++#endif + + strncpy(netdev->name, pci_name(pdev), sizeof(netdev->name) - 1); + +- netdev->mem_start = mmio_start; +- netdev->mem_end = mmio_start + mmio_len; +- +- /* PCI config space info */ +- hw->vendor_id = pdev->vendor; +- hw->device_id = pdev->device; +- hw->revision_id = pdev->revision; +- hw->subsystem_vendor_id = pdev->subsystem_vendor; +- hw->subsystem_device_id = pdev->subsystem_device; ++ adapter->bd_number = cards_found; ++ ++ igb_check_options(adapter); + + /* setup the private structure */ +- hw->back = adapter; +- /* Copy the default MAC, PHY and NVM function pointers */ +- memcpy(&hw->mac.ops, ei->mac_ops, sizeof(hw->mac.ops)); +- memcpy(&hw->phy.ops, ei->phy_ops, sizeof(hw->phy.ops)); +- memcpy(&hw->nvm.ops, ei->nvm_ops, sizeof(hw->nvm.ops)); +- /* Initialize skew-specific constants */ +- err = ei->get_invariants(hw); +- if (err) +- goto err_hw_init; +- + err = igb_sw_init(adapter); + if (err) + goto err_sw_init; + +- igb_get_bus_info_pcie(hw); ++ e1000_get_bus_info(hw); + + /* set flags */ + switch (hw->mac.type) { + case e1000_82576: ++ adapter->flags |= IGB_FLAG_HAS_DCA; ++ break; + case e1000_82575: + adapter->flags |= IGB_FLAG_HAS_DCA; + adapter->flags |= IGB_FLAG_NEED_CTX_IDX; +@@ -1094,64 +1309,79 @@ + break; + } + +- hw->phy.autoneg_wait_to_complete = false; +- hw->mac.adaptive_ifs = true; ++ hw->phy.autoneg_wait_to_complete = FALSE; ++ hw->mac.adaptive_ifs = FALSE; + + /* Copper options */ + if (hw->phy.media_type == e1000_media_type_copper) { + hw->phy.mdix = AUTO_ALL_MODES; +- hw->phy.disable_polarity_correction = false; ++ hw->phy.disable_polarity_correction = FALSE; + hw->phy.ms_type = e1000_ms_hw_default; + } + +- if (igb_check_reset_block(hw)) +- dev_info(&pdev->dev, +- "PHY reset is blocked due to SOL/IDER session.\n"); ++ if (e1000_check_reset_block(hw)) ++ DPRINTK(PROBE, INFO, ++ "PHY reset is blocked due to SOL/IDER session.\n"); + + netdev->features = NETIF_F_SG | +- NETIF_F_HW_CSUM | ++ NETIF_F_IP_CSUM | + NETIF_F_HW_VLAN_TX | + NETIF_F_HW_VLAN_RX | + NETIF_F_HW_VLAN_FILTER; + ++#ifdef NETIF_F_IPV6_CSUM ++ netdev->features |= NETIF_F_IPV6_CSUM; ++#endif ++#ifdef NETIF_F_TSO + netdev->features |= NETIF_F_TSO; ++#ifdef NETIF_F_TSO6 + netdev->features |= NETIF_F_TSO6; +- +-#ifdef CONFIG_IGB_LRO ++#endif ++#endif /* NETIF_F_TSO */ ++ ++#ifdef IGB_LRO + netdev->features |= NETIF_F_LRO; + #endif +- ++#ifdef NETIF_F_GRO ++ netdev->features |= NETIF_F_GRO; ++#endif ++ ++#ifdef HAVE_NETDEV_VLAN_FEATURES + netdev->vlan_features |= NETIF_F_TSO; + netdev->vlan_features |= NETIF_F_TSO6; +- netdev->vlan_features |= NETIF_F_HW_CSUM; ++ netdev->vlan_features |= NETIF_F_IP_CSUM; ++ netdev->vlan_features |= NETIF_F_IPV6_CSUM; + netdev->vlan_features |= NETIF_F_SG; + ++#endif + if (pci_using_dac) + netdev->features |= NETIF_F_HIGHDMA; + +- netdev->features |= NETIF_F_LLTX; +- adapter->en_mng_pt = igb_enable_mng_pass_thru(&adapter->hw); ++ adapter->en_mng_pt = e1000_enable_mng_pass_thru(hw); + + /* before reading the NVM, reset the controller to put the device in a + * known good starting state */ +- hw->mac.ops.reset_hw(hw); ++ e1000_reset_hw(hw); + + /* make sure the NVM is good */ +- if (igb_validate_nvm_checksum(hw) < 0) { +- dev_err(&pdev->dev, "The NVM Checksum Is Not Valid\n"); ++ if (e1000_validate_nvm_checksum(hw) < 0) { ++ DPRINTK(PROBE, ERR, "The NVM Checksum Is Not Valid\n"); + err = -EIO; + goto err_eeprom; + } + + /* copy the MAC address out of the NVM */ +- if (hw->mac.ops.read_mac_addr(hw)) +- dev_err(&pdev->dev, "NVM Read Error\n"); +- ++ if (e1000_read_mac_addr(hw)) ++ DPRINTK(PROBE, ERR, "NVM Read Error\n"); + memcpy(netdev->dev_addr, hw->mac.addr, netdev->addr_len); ++#ifdef ETHTOOL_GPERMADDR + memcpy(netdev->perm_addr, hw->mac.addr, netdev->addr_len); + + if (!is_valid_ether_addr(netdev->perm_addr)) { +- dev_err(&pdev->dev, "Invalid MAC Address\n"); ++#else ++ if (!is_valid_ether_addr(netdev->dev_addr)) { ++#endif ++ DPRINTK(PROBE, ERR, "Invalid MAC Address\n"); + err = -EIO; + goto err_eeprom; + } +@@ -1167,25 +1397,15 @@ + INIT_WORK(&adapter->reset_task, igb_reset_task); + INIT_WORK(&adapter->watchdog_task, igb_watchdog_task); + +- /* Initialize link & ring properties that are user-changeable */ +- adapter->tx_ring->count = 256; +- for (i = 0; i < adapter->num_tx_queues; i++) +- adapter->tx_ring[i].count = adapter->tx_ring->count; +- adapter->rx_ring->count = 256; +- for (i = 0; i < adapter->num_rx_queues; i++) +- adapter->rx_ring[i].count = adapter->rx_ring->count; +- ++ /* Initialize link properties that are user-changeable */ + adapter->fc_autoneg = true; + hw->mac.autoneg = true; + hw->phy.autoneg_advertised = 0x2f; + +- hw->fc.original_type = e1000_fc_default; +- hw->fc.type = e1000_fc_default; +- +- adapter->itr_setting = 3; +- adapter->itr = IGB_START_ITR; +- +- igb_validate_mdi_setting(hw); ++ hw->fc.requested_mode = e1000_fc_default; ++ hw->fc.current_mode = e1000_fc_default; ++ ++ e1000_validate_mdi_setting(hw); + + adapter->rx_csum = 1; + +@@ -1193,10 +1413,10 @@ + * enable the ACPI Magic Packet filter + */ + +- if (hw->bus.func == 0 || +- hw->device_id == E1000_DEV_ID_82575EB_COPPER) +- hw->nvm.ops.read_nvm(hw, NVM_INIT_CONTROL3_PORT_A, 1, +- &eeprom_data); ++ if (hw->bus.func == 0) ++ e1000_read_nvm(hw, NVM_INIT_CONTROL3_PORT_A, 1, &eeprom_data); ++ else if (hw->bus.func == 1) ++ e1000_read_nvm(hw, NVM_INIT_CONTROL3_PORT_B, 1, &eeprom_data); + + if (eeprom_data & eeprom_apme_mask) + adapter->eeprom_wol |= E1000_WUFC_MAG; +@@ -1213,8 +1433,18 @@ + case E1000_DEV_ID_82576_SERDES: + /* Wake events only supported on port A for dual fiber + * regardless of eeprom setting */ +- if (rd32(E1000_STATUS) & E1000_STATUS_FUNC_1) ++ if (E1000_READ_REG(hw, E1000_STATUS) & E1000_STATUS_FUNC_1) + adapter->eeprom_wol = 0; ++ break; ++ case E1000_DEV_ID_82576_QUAD_COPPER: ++ /* if quad port adapter, disable WoL on all but port A */ ++ if (global_quad_port_a != 0) ++ adapter->eeprom_wol = 0; ++ else ++ adapter->flags |= IGB_FLAG_QUAD_PORT_A; ++ /* Reset for multiple quad port adapters */ ++ if (++global_quad_port_a == 4) ++ global_quad_port_a = 0; + break; + } + +@@ -1238,61 +1468,56 @@ + if (err) + goto err_register; + +-#ifdef CONFIG_DCA ++#ifdef IGB_DCA + if ((adapter->flags & IGB_FLAG_HAS_DCA) && +- (dca_add_requester(&pdev->dev) == 0)) { ++ (dca_add_requester(&pdev->dev) == E1000_SUCCESS)) { + adapter->flags |= IGB_FLAG_DCA_ENABLED; +- dev_info(&pdev->dev, "DCA enabled\n"); ++ DPRINTK(PROBE, INFO, "DCA enabled\n"); + /* Always use CB2 mode, difference is masked + * in the CB driver. */ +- wr32(E1000_DCA_CTRL, 2); ++ E1000_WRITE_REG(hw, E1000_DCA_CTRL, 2); + igb_setup_dca(adapter); + } + #endif + +- dev_info(&pdev->dev, "Intel(R) Gigabit Ethernet Network Connection\n"); ++ DPRINTK(PROBE, INFO, "Intel(R) Gigabit Ethernet Network Connection\n"); + /* print bus type/speed/width info */ +- dev_info(&pdev->dev, +- "%s: (PCIe:%s:%s) %02x:%02x:%02x:%02x:%02x:%02x\n", +- netdev->name, +- ((hw->bus.speed == e1000_bus_speed_2500) +- ? "2.5Gb/s" : "unknown"), +- ((hw->bus.width == e1000_bus_width_pcie_x4) +- ? "Width x4" : (hw->bus.width == e1000_bus_width_pcie_x1) +- ? "Width x1" : "unknown"), +- netdev->dev_addr[0], netdev->dev_addr[1], netdev->dev_addr[2], +- netdev->dev_addr[3], netdev->dev_addr[4], netdev->dev_addr[5]); +- +- igb_read_part_num(hw, &part_num); +- dev_info(&pdev->dev, "%s: PBA No: %06x-%03x\n", netdev->name, +- (part_num >> 8), (part_num & 0xff)); +- +- dev_info(&pdev->dev, +- "Using %s interrupts. %d rx queue(s), %d tx queue(s)\n", +- adapter->msix_entries ? "MSI-X" : +- (adapter->flags & IGB_FLAG_HAS_MSI) ? "MSI" : "legacy", +- adapter->num_rx_queues, adapter->num_tx_queues); +- ++ DPRINTK(PROBE, INFO, "(PCIe:%s:%s) ", ++ ((hw->bus.speed == e1000_bus_speed_2500) ? "2.5Gb/s" : "unknown"), ++ ((hw->bus.width == e1000_bus_width_pcie_x4) ? "Width x4" : ++ (hw->bus.width == e1000_bus_width_pcie_x1) ? "Width x1" : ++ "unknown")); ++ ++ for (i = 0; i < 6; i++) ++ printk("%2.2x%c", netdev->dev_addr[i], i == 5 ? '\n' : ':'); ++ ++ DPRINTK(PROBE, INFO, ++ "Using %s interrupts. %d rx queue(s), %d tx queue(s)\n", ++ adapter->msix_entries ? "MSI-X" : ++ adapter->flags & IGB_FLAG_HAS_MSI ? "MSI" : ++ "legacy", ++ adapter->num_rx_queues, adapter->num_tx_queues); ++ ++ cards_found++; + return 0; + + err_register: + igb_release_hw_control(adapter); + err_eeprom: +- if (!igb_check_reset_block(hw)) +- hw->phy.ops.reset_phy(hw); ++ if (!e1000_check_reset_block(hw)) ++ e1000_phy_hw_reset(hw); + + if (hw->flash_address) + iounmap(hw->flash_address); + +- igb_remove_device(hw); + igb_free_queues(adapter); + err_sw_init: +-err_hw_init: + iounmap(hw->hw_addr); + err_ioremap: + free_netdev(netdev); + err_alloc_etherdev: +- pci_release_selected_regions(pdev, bars); ++ pci_release_selected_regions(pdev, ++ pci_select_bars(pdev, IORESOURCE_MEM)); + err_pci_reg: + err_dma: + pci_disable_device(pdev); +@@ -1312,9 +1537,7 @@ + { + struct net_device *netdev = pci_get_drvdata(pdev); + struct igb_adapter *adapter = netdev_priv(netdev); +-#ifdef CONFIG_DCA +- struct e1000_hw *hw = &adapter->hw; +-#endif ++ struct e1000_hw *hw = &adapter->hw; + + /* flush_scheduled work may reschedule our watchdog task, so + * explicitly disable watchdog tasks from being rescheduled */ +@@ -1324,12 +1547,13 @@ + + flush_scheduled_work(); + +-#ifdef CONFIG_DCA ++ ++#ifdef IGB_DCA + if (adapter->flags & IGB_FLAG_DCA_ENABLED) { +- dev_info(&pdev->dev, "DCA disabled\n"); ++ DPRINTK(PROBE, INFO, "DCA disabled\n"); + dca_remove_requester(&pdev->dev); + adapter->flags &= ~IGB_FLAG_DCA_ENABLED; +- wr32(E1000_DCA_CTRL, 1); ++ E1000_WRITE_REG(hw, E1000_DCA_CTRL, 1); + } + #endif + +@@ -1339,21 +1563,22 @@ + + unregister_netdev(netdev); + +- if (adapter->hw.phy.ops.reset_phy && +- !igb_check_reset_block(&adapter->hw)) +- adapter->hw.phy.ops.reset_phy(&adapter->hw); +- +- igb_remove_device(&adapter->hw); ++ if (!e1000_check_reset_block(hw)) ++ e1000_phy_hw_reset(hw); ++ + igb_reset_interrupt_capability(adapter); + + igb_free_queues(adapter); + +- iounmap(adapter->hw.hw_addr); +- if (adapter->hw.flash_address) ++ iounmap(hw->hw_addr); ++ if (hw->flash_address) + iounmap(adapter->hw.flash_address); +- pci_release_selected_regions(pdev, adapter->bars); ++ pci_release_selected_regions(pdev, ++ pci_select_bars(pdev, IORESOURCE_MEM)); + + free_netdev(netdev); ++ ++ pci_disable_pcie_error_reporting(pdev); + + pci_disable_device(pdev); + } +@@ -1371,6 +1596,15 @@ + struct e1000_hw *hw = &adapter->hw; + struct net_device *netdev = adapter->netdev; + struct pci_dev *pdev = adapter->pdev; ++ ++ /* PCI config space info */ ++ ++ hw->vendor_id = pdev->vendor; ++ hw->device_id = pdev->device; ++ hw->subsystem_vendor_id = pdev->subsystem_vendor; ++ hw->subsystem_device_id = pdev->subsystem_device; ++ ++ pci_read_config_byte(pdev, PCI_REVISION_ID, &hw->revision_id); + + pci_read_config_word(pdev, PCI_COMMAND, &hw->bus.pci_cmd_word); + +@@ -1381,17 +1615,18 @@ + adapter->max_frame_size = netdev->mtu + ETH_HLEN + ETH_FCS_LEN; + adapter->min_frame_size = ETH_ZLEN + ETH_FCS_LEN; + +- /* Number of supported queues. */ +- /* Having more queues than CPUs doesn't make sense. */ +- adapter->num_rx_queues = min((u32)IGB_MAX_RX_QUEUES, (u32)num_online_cpus()); +- adapter->num_tx_queues = min(IGB_MAX_TX_QUEUES, num_online_cpus()); ++ /* Initialize the hardware-specific values */ ++ if (e1000_setup_init_funcs(hw, TRUE)) { ++ DPRINTK(PROBE, ERR, "Hardware Initialization Failure\n"); ++ return -EIO; ++ } + + /* This call may decrease the number of queues depending on + * interrupt mode. */ + igb_set_interrupt_capability(adapter); + + if (igb_alloc_queues(adapter)) { +- dev_err(&pdev->dev, "Unable to allocate memory for queues\n"); ++ DPRINTK(PROBE, ERR, "Unable to allocate memory for queues\n"); + return -ENOMEM; + } + +@@ -1457,18 +1692,19 @@ + + for (i = 0; i < adapter->num_rx_queues; i++) + napi_enable(&adapter->rx_ring[i].napi); ++ igb_configure_lli(adapter); + + /* Clear any pending interrupts. */ +- rd32(E1000_ICR); ++ E1000_READ_REG(hw, E1000_ICR); + + igb_irq_enable(adapter); + + netif_tx_start_all_queues(netdev); + + /* Fire a link status change interrupt to start the watchdog. */ +- wr32(E1000_ICS, E1000_ICS_LSC); +- +- return 0; ++ E1000_WRITE_REG(hw, E1000_ICS, E1000_ICS_LSC); ++ ++ return E1000_SUCCESS; + + err_req_irq: + igb_release_hw_control(adapter); +@@ -1523,9 +1759,8 @@ + * + * Return 0 on success, negative on failure + **/ +- + int igb_setup_tx_resources(struct igb_adapter *adapter, +- struct igb_ring *tx_ring) ++ struct igb_ring *tx_ring) + { + struct pci_dev *pdev = adapter->pdev; + int size; +@@ -1537,12 +1772,11 @@ + memset(tx_ring->buffer_info, 0, size); + + /* round up to nearest 4K */ +- tx_ring->size = tx_ring->count * sizeof(struct e1000_tx_desc) +- + sizeof(u32); ++ tx_ring->size = tx_ring->count * sizeof(struct e1000_tx_desc); + tx_ring->size = ALIGN(tx_ring->size, 4096); + + tx_ring->desc = pci_alloc_consistent(pdev, tx_ring->size, +- &tx_ring->dma); ++ &tx_ring->dma); + + if (!tx_ring->desc) + goto err; +@@ -1554,8 +1788,8 @@ + + err: + vfree(tx_ring->buffer_info); +- dev_err(&adapter->pdev->dev, +- "Unable to allocate memory for the transmit descriptor ring\n"); ++ DPRINTK(PROBE, ERR, "Unable to allocate memory for the transmit " ++ "descriptor ring\n"); + return -ENOMEM; + } + +@@ -1569,12 +1803,14 @@ + static int igb_setup_all_tx_resources(struct igb_adapter *adapter) + { + int i, err = 0; ++#ifdef HAVE_TX_MQ + int r_idx; ++#endif + + for (i = 0; i < adapter->num_tx_queues; i++) { + err = igb_setup_tx_resources(adapter, &adapter->tx_ring[i]); + if (err) { +- dev_err(&adapter->pdev->dev, ++ DPRINTK(PROBE, ERR, + "Allocation for Tx Queue %u failed\n", i); + for (i--; i >= 0; i--) + igb_free_tx_resources(&adapter->tx_ring[i]); +@@ -1582,10 +1818,12 @@ + } + } + +- for (i = 0; i < IGB_MAX_TX_QUEUES; i++) { ++#ifdef HAVE_TX_MQ ++ for (i = 0; i < IGB_ABS_MAX_TX_QUEUES; i++) { + r_idx = i % adapter->num_tx_queues; + adapter->multi_tx_table[i] = &adapter->tx_ring[r_idx]; +- } ++ } ++#endif + return err; + } + +@@ -1597,57 +1835,51 @@ + **/ + static void igb_configure_tx(struct igb_adapter *adapter) + { +- u64 tdba, tdwba; ++ u64 tdba; + struct e1000_hw *hw = &adapter->hw; + u32 tctl; + u32 txdctl, txctrl; +- int i; +- +- for (i = 0; i < adapter->num_tx_queues; i++) { +- struct igb_ring *ring = &(adapter->tx_ring[i]); +- +- wr32(E1000_TDLEN(i), +- ring->count * sizeof(struct e1000_tx_desc)); ++ int i, j; ++ ++ for (i = 0; i < adapter->num_tx_queues; i++) { ++ struct igb_ring *ring = &adapter->tx_ring[i]; ++ j = ring->reg_idx; ++ ++ E1000_WRITE_REG(hw, E1000_TDLEN(j), ++ ring->count * sizeof(struct e1000_tx_desc)); + tdba = ring->dma; +- wr32(E1000_TDBAL(i), +- tdba & 0x00000000ffffffffULL); +- wr32(E1000_TDBAH(i), tdba >> 32); +- +- tdwba = ring->dma + ring->count * sizeof(struct e1000_tx_desc); +- tdwba |= 1; /* enable head wb */ +- wr32(E1000_TDWBAL(i), +- tdwba & 0x00000000ffffffffULL); +- wr32(E1000_TDWBAH(i), tdwba >> 32); +- +- ring->head = E1000_TDH(i); +- ring->tail = E1000_TDT(i); ++ E1000_WRITE_REG(hw, E1000_TDBAL(j), ++ tdba & 0x00000000ffffffffULL); ++ E1000_WRITE_REG(hw, E1000_TDBAH(j), tdba >> 32); ++ ++ ring->head = E1000_TDH(j); ++ ring->tail = E1000_TDT(j); + writel(0, hw->hw_addr + ring->tail); + writel(0, hw->hw_addr + ring->head); +- txdctl = rd32(E1000_TXDCTL(i)); ++ txdctl = E1000_READ_REG(hw, E1000_TXDCTL(j)); + txdctl |= E1000_TXDCTL_QUEUE_ENABLE; +- wr32(E1000_TXDCTL(i), txdctl); ++ E1000_WRITE_REG(hw, E1000_TXDCTL(j), txdctl); + + /* Turn off Relaxed Ordering on head write-backs. The + * writebacks MUST be delivered in order or it will + * completely screw up our bookeeping. + */ +- txctrl = rd32(E1000_DCA_TXCTRL(i)); ++ txctrl = E1000_READ_REG(hw, E1000_DCA_TXCTRL(j)); + txctrl &= ~E1000_DCA_TXCTRL_TX_WB_RO_EN; +- wr32(E1000_DCA_TXCTRL(i), txctrl); +- } +- +- ++ E1000_WRITE_REG(hw, E1000_DCA_TXCTRL(j), txctrl); ++ } + + /* Use the default values for the Tx Inter Packet Gap (IPG) timer */ + ++ + /* Program the Transmit Control Register */ + +- tctl = rd32(E1000_TCTL); ++ tctl = E1000_READ_REG(hw, E1000_TCTL); + tctl &= ~E1000_TCTL_CT; + tctl |= E1000_TCTL_PSP | E1000_TCTL_RTLC | + (E1000_COLLISION_THRESHOLD << E1000_CT_SHIFT); + +- igb_config_collision_dist(hw); ++ e1000_config_collision_dist(hw); + + /* Setup Transmit Descriptor Settings for eop descriptor */ + adapter->txd_cmd = E1000_TXD_CMD_EOP | E1000_TXD_CMD_RS; +@@ -1655,7 +1887,7 @@ + /* Enable transmits */ + tctl |= E1000_TCTL_EN; + +- wr32(E1000_TCTL, tctl); ++ E1000_WRITE_REG(hw, E1000_TCTL, tctl); + } + + /** +@@ -1665,20 +1897,19 @@ + * + * Returns 0 on success, negative on failure + **/ +- + int igb_setup_rx_resources(struct igb_adapter *adapter, +- struct igb_ring *rx_ring) ++ struct igb_ring *rx_ring) + { + struct pci_dev *pdev = adapter->pdev; + int size, desc_len; + +-#ifdef CONFIG_IGB_LRO ++#ifdef IGB_LRO + size = sizeof(struct net_lro_desc) * MAX_LRO_DESCRIPTORS; + rx_ring->lro_mgr.lro_arr = vmalloc(size); + if (!rx_ring->lro_mgr.lro_arr) + goto err; + memset(rx_ring->lro_mgr.lro_arr, 0, size); +-#endif ++#endif /* IGB_LRO */ + + size = sizeof(struct igb_buffer) * rx_ring->count; + rx_ring->buffer_info = vmalloc(size); +@@ -1693,7 +1924,7 @@ + rx_ring->size = ALIGN(rx_ring->size, 4096); + + rx_ring->desc = pci_alloc_consistent(pdev, rx_ring->size, +- &rx_ring->dma); ++ &rx_ring->dma); + + if (!rx_ring->desc) + goto err; +@@ -1706,19 +1937,20 @@ + return 0; + + err: +-#ifdef CONFIG_IGB_LRO ++#ifdef IGB_LRO + vfree(rx_ring->lro_mgr.lro_arr); + rx_ring->lro_mgr.lro_arr = NULL; + #endif + vfree(rx_ring->buffer_info); +- dev_err(&adapter->pdev->dev, "Unable to allocate memory for " +- "the receive descriptor ring\n"); ++ rx_ring->buffer_info = NULL; ++ DPRINTK(PROBE, ERR, "Unable to allocate memory for the receive " ++ "descriptor ring\n"); + return -ENOMEM; + } + + /** + * igb_setup_all_rx_resources - wrapper to allocate Rx resources +- * (Descriptors) for all queues ++ * (Descriptors) for all queues + * @adapter: board private structure + * + * Return 0 on success, negative on failure +@@ -1730,7 +1962,7 @@ + for (i = 0; i < adapter->num_rx_queues; i++) { + err = igb_setup_rx_resources(adapter, &adapter->rx_ring[i]); + if (err) { +- dev_err(&adapter->pdev->dev, ++ DPRINTK(PROBE, ERR, + "Allocation for Rx Queue %u failed\n", i); + for (i--; i >= 0; i--) + igb_free_rx_resources(&adapter->rx_ring[i]); +@@ -1750,57 +1982,45 @@ + struct e1000_hw *hw = &adapter->hw; + u32 rctl; + u32 srrctl = 0; +- int i; +- +- rctl = rd32(E1000_RCTL); ++ int i, j; ++ ++ rctl = E1000_READ_REG(hw, E1000_RCTL); + + rctl &= ~(3 << E1000_RCTL_MO_SHIFT); +- +- rctl |= E1000_RCTL_EN | E1000_RCTL_BAM | +- E1000_RCTL_LBM_NO | E1000_RCTL_RDMTS_HALF | +- (adapter->hw.mac.mc_filter_type << E1000_RCTL_MO_SHIFT); ++ rctl &= ~(E1000_RCTL_LBM_TCVR | E1000_RCTL_LBM_MAC); ++ ++ rctl |= E1000_RCTL_EN | E1000_RCTL_BAM | E1000_RCTL_RDMTS_HALF | ++ (hw->mac.mc_filter_type << E1000_RCTL_MO_SHIFT); + + /* + * enable stripping of CRC. It's unlikely this will break BMC + * redirection as it did with e1000. Newer features require + * that the HW strips the CRC. +- */ ++ */ + rctl |= E1000_RCTL_SECRC; + +- rctl &= ~E1000_RCTL_SBP; +- +- if (adapter->netdev->mtu <= ETH_DATA_LEN) +- rctl &= ~E1000_RCTL_LPE; +- else +- rctl |= E1000_RCTL_LPE; +- if (adapter->rx_buffer_len <= IGB_RXBUFFER_2048) { +- /* Setup buffer sizes */ +- rctl &= ~E1000_RCTL_SZ_4096; +- rctl |= E1000_RCTL_BSEX; +- switch (adapter->rx_buffer_len) { +- case IGB_RXBUFFER_256: +- rctl |= E1000_RCTL_SZ_256; +- rctl &= ~E1000_RCTL_BSEX; +- break; +- case IGB_RXBUFFER_512: +- rctl |= E1000_RCTL_SZ_512; +- rctl &= ~E1000_RCTL_BSEX; +- break; +- case IGB_RXBUFFER_1024: +- rctl |= E1000_RCTL_SZ_1024; +- rctl &= ~E1000_RCTL_BSEX; +- break; +- case IGB_RXBUFFER_2048: +- default: +- rctl |= E1000_RCTL_SZ_2048; +- rctl &= ~E1000_RCTL_BSEX; +- break; +- } +- } else { +- rctl &= ~E1000_RCTL_BSEX; +- srrctl = adapter->rx_buffer_len >> E1000_SRRCTL_BSIZEPKT_SHIFT; +- } +- ++ ++ /* disable store bad packets and clear size bits. */ ++ rctl &= ~(E1000_RCTL_SBP | E1000_RCTL_SZ_256); ++ ++ /* enable LPE to prevent packets larger than max_frame_size */ ++ rctl |= E1000_RCTL_LPE; ++ ++ /* Setup buffer sizes */ ++ switch (adapter->rx_buffer_len) { ++ case IGB_RXBUFFER_256: ++ rctl |= E1000_RCTL_SZ_256; ++ break; ++ case IGB_RXBUFFER_512: ++ rctl |= E1000_RCTL_SZ_512; ++ break; ++ default: ++ srrctl = ALIGN(adapter->rx_buffer_len, 1024) ++ >> E1000_SRRCTL_BSIZEPKT_SHIFT; ++ break; ++ } ++ ++#ifndef CONFIG_IGB_DISABLE_PACKET_SPLIT + /* 82575 and greater support packet-split where the protocol + * header is placed in skb->data and the packet data is + * placed in pages hanging off of skb_shinfo(skb)->nr_frags. +@@ -1810,20 +2030,41 @@ + */ + /* allocations using alloc_page take too long for regular MTU + * so only enable packet split for jumbo frames */ +- if (rctl & E1000_RCTL_LPE) { ++ if (adapter->netdev->mtu > ETH_DATA_LEN) { + adapter->rx_ps_hdr_size = IGB_RXBUFFER_128; + srrctl |= adapter->rx_ps_hdr_size << +- E1000_SRRCTL_BSIZEHDRSIZE_SHIFT; ++ E1000_SRRCTL_BSIZEHDRSIZE_SHIFT; + srrctl |= E1000_SRRCTL_DESCTYPE_HDR_SPLIT_ALWAYS; + } else { ++#endif /* CONFIG_IGB_DISABLE_PACKET_SPLIT */ + adapter->rx_ps_hdr_size = 0; + srrctl |= E1000_SRRCTL_DESCTYPE_ADV_ONEBUF; +- } +- +- for (i = 0; i < adapter->num_rx_queues; i++) +- wr32(E1000_SRRCTL(i), srrctl); +- +- wr32(E1000_RCTL, rctl); ++#ifndef CONFIG_IGB_DISABLE_PACKET_SPLIT ++ } ++#endif /* CONFIG_IGB_DISABLE_PACKET_SPLIT */ ++ ++ for (i = 0; i < adapter->num_rx_queues; i++) { ++ j = adapter->rx_ring[i].reg_idx; ++ E1000_WRITE_REG(hw, E1000_SRRCTL(j), srrctl); ++ } ++ ++ E1000_WRITE_REG(hw, E1000_RCTL, rctl); ++} ++ ++/** ++ * igb_set_rlpml - set receive large packet maximum length ++ * @adapter: board private structure ++ * ++ * Configure the maximum size of packets that will be received ++ */ ++static void igb_set_rlpml(struct igb_adapter *adapter) ++{ ++ int max_frame_size = adapter->max_frame_size; ++ struct e1000_hw *hw = &adapter->hw; ++ ++ if (adapter->vlgrp) ++ max_frame_size += VLAN_TAG_SIZE; ++ E1000_WRITE_REG(hw, E1000_RLPML, max_frame_size); + } + + /** +@@ -1838,43 +2079,44 @@ + struct e1000_hw *hw = &adapter->hw; + u32 rctl, rxcsum; + u32 rxdctl; +- int i; ++ int i, j; + + /* disable receives while setting up the descriptors */ +- rctl = rd32(E1000_RCTL); +- wr32(E1000_RCTL, rctl & ~E1000_RCTL_EN); +- wrfl(); ++ rctl = E1000_READ_REG(hw, E1000_RCTL); ++ E1000_WRITE_REG(hw, E1000_RCTL, rctl & ~E1000_RCTL_EN); ++ E1000_WRITE_FLUSH(hw); + mdelay(10); + + if (adapter->itr_setting > 3) +- wr32(E1000_ITR, adapter->itr); ++ E1000_WRITE_REG(hw, E1000_ITR, adapter->itr); + + /* Setup the HW Rx Head and Tail Descriptor Pointers and + * the Base and Length of the Rx Descriptor Ring */ +- for (i = 0; i < adapter->num_rx_queues; i++) { +- struct igb_ring *ring = &(adapter->rx_ring[i]); ++ for (i = 0; i < adapter->num_rx_queues; i++) { ++ struct igb_ring *ring = &adapter->rx_ring[i]; ++ j = ring->reg_idx; + rdba = ring->dma; +- wr32(E1000_RDBAL(i), +- rdba & 0x00000000ffffffffULL); +- wr32(E1000_RDBAH(i), rdba >> 32); +- wr32(E1000_RDLEN(i), +- ring->count * sizeof(union e1000_adv_rx_desc)); +- +- ring->head = E1000_RDH(i); +- ring->tail = E1000_RDT(i); ++ E1000_WRITE_REG(hw, E1000_RDBAL(j), ++ rdba & 0x00000000ffffffffULL); ++ E1000_WRITE_REG(hw, E1000_RDBAH(j), rdba >> 32); ++ E1000_WRITE_REG(hw, E1000_RDLEN(j), ++ ring->count * sizeof(union e1000_adv_rx_desc)); ++ ++ ring->head = E1000_RDH(j); ++ ring->tail = E1000_RDT(j); + writel(0, hw->hw_addr + ring->tail); + writel(0, hw->hw_addr + ring->head); + +- rxdctl = rd32(E1000_RXDCTL(i)); ++ rxdctl = E1000_READ_REG(hw, E1000_RXDCTL(j)); + rxdctl |= E1000_RXDCTL_QUEUE_ENABLE; + rxdctl &= 0xFFF00000; + rxdctl |= IGB_RX_PTHRESH; + rxdctl |= IGB_RX_HTHRESH << 8; + rxdctl |= IGB_RX_WTHRESH << 16; +- wr32(E1000_RXDCTL(i), rxdctl); +-#ifdef CONFIG_IGB_LRO ++ E1000_WRITE_REG(hw, E1000_RXDCTL(j), rxdctl); ++#ifdef IGB_LRO + /* Intitial LRO Settings */ +- ring->lro_mgr.max_aggr = MAX_LRO_AGGR; ++ ring->lro_mgr.max_aggr = adapter->lro_max_aggr; + ring->lro_mgr.max_desc = MAX_LRO_DESCRIPTORS; + ring->lro_mgr.get_skb_header = igb_get_skb_hdr; + ring->lro_mgr.features = LRO_F_NAPI | LRO_F_EXTRACT_VLAN_ID; +@@ -1885,7 +2127,12 @@ + } + + if (adapter->num_rx_queues > 1) { +- u32 random[10]; ++ static const u8 rsshash[40] = { ++ 0x6d, 0x5a, 0x56, 0xda, 0x25, 0x5b, 0x0e, 0xc2, ++ 0x41, 0x67, 0x25, 0x3d, 0x43, 0xa3, 0x8f, 0xb0, ++ 0xd0, 0xca, 0x2b, 0xcb, 0xae, 0x7b, 0x30, 0xb4, ++ 0x77, 0xcb, 0x2d, 0xa3, 0x80, 0x30, 0xf2, 0x0c, ++ 0x6a, 0x42, 0xb7, 0x3b, 0xbe, 0xac, 0x01, 0xfa }; + u32 mrqc; + u32 j, shift; + union e1000_reta { +@@ -1893,15 +2140,13 @@ + u8 bytes[4]; + } reta; + +- get_random_bytes(&random[0], 40); +- + if (hw->mac.type >= e1000_82576) + shift = 0; + else + shift = 6; + for (j = 0; j < (32 * 4); j++) { + reta.bytes[j & 3] = +- (j % adapter->num_rx_queues) << shift; ++ adapter->rx_ring[(j % adapter->num_rx_queues)].reg_idx << shift; + if ((j & 3) == 3) + writel(reta.dword, + hw->hw_addr + E1000_RETA(0) + (j & ~3)); +@@ -1909,8 +2154,13 @@ + mrqc = E1000_MRQC_ENABLE_RSS_4Q; + + /* Fill out hash function seeds */ +- for (j = 0; j < 10; j++) +- array_wr32(E1000_RSSRK(0), j, random[j]); ++ for (j = 0; j < 10; j++) { ++ u32 rsskey = rsshash[(j * 4)]; ++ rsskey |= rsshash[(j * 4) + 1] << 8; ++ rsskey |= rsshash[(j * 4) + 2] << 16; ++ rsskey |= rsshash[(j * 4) + 3] << 24; ++ E1000_WRITE_REG_ARRAY(hw, E1000_RSSRK(0), j, rsskey); ++ } + + mrqc |= (E1000_MRQC_RSS_FIELD_IPV4 | + E1000_MRQC_RSS_FIELD_IPV4_TCP); +@@ -1922,44 +2172,33 @@ + E1000_MRQC_RSS_FIELD_IPV6_TCP_EX); + + +- wr32(E1000_MRQC, mrqc); ++ E1000_WRITE_REG(hw, E1000_MRQC, mrqc); + + /* Multiqueue and raw packet checksumming are mutually + * exclusive. Note that this not the same as TCP/IP + * checksumming, which works fine. */ +- rxcsum = rd32(E1000_RXCSUM); ++ rxcsum = E1000_READ_REG(hw, E1000_RXCSUM); + rxcsum |= E1000_RXCSUM_PCSD; +- wr32(E1000_RXCSUM, rxcsum); ++ E1000_WRITE_REG(hw, E1000_RXCSUM, rxcsum); + } else { + /* Enable Receive Checksum Offload for TCP and UDP */ +- rxcsum = rd32(E1000_RXCSUM); +- if (adapter->rx_csum) { +- rxcsum |= E1000_RXCSUM_TUOFL; +- +- /* Enable IPv4 payload checksum for UDP fragments +- * Must be used in conjunction with packet-split. */ +- if (adapter->rx_ps_hdr_size) +- rxcsum |= E1000_RXCSUM_IPPCSE; +- } else { ++ rxcsum = E1000_READ_REG(hw, E1000_RXCSUM); ++ if (adapter->rx_csum) ++ rxcsum |= E1000_RXCSUM_TUOFL | E1000_RXCSUM_IPPCSE; ++ else + rxcsum &= ~E1000_RXCSUM_TUOFL; + /* don't need to clear IPPCSE as it defaults to 0 */ +- } +- wr32(E1000_RXCSUM, rxcsum); +- } +- +- if (adapter->vlgrp) +- wr32(E1000_RLPML, +- adapter->max_frame_size + VLAN_TAG_SIZE); +- else +- wr32(E1000_RLPML, adapter->max_frame_size); ++ E1000_WRITE_REG(hw, E1000_RXCSUM, rxcsum); ++ } ++ ++ igb_set_rlpml(adapter); + + /* Enable Receives */ +- wr32(E1000_RCTL, rctl); ++ E1000_WRITE_REG(hw, E1000_RCTL, rctl); + } + + /** + * igb_free_tx_resources - Free Tx Resources per Queue +- * @adapter: board private structure + * @tx_ring: Tx descriptor ring for a specific queue + * + * Free all transmit software resources +@@ -1993,7 +2232,7 @@ + } + + static void igb_unmap_and_free_tx_resource(struct igb_adapter *adapter, +- struct igb_buffer *buffer_info) ++ struct igb_buffer *buffer_info) + { + if (buffer_info->dma) { + pci_unmap_page(adapter->pdev, +@@ -2007,12 +2246,12 @@ + buffer_info->skb = NULL; + } + buffer_info->time_stamp = 0; ++ buffer_info->next_to_watch = 0; + /* buffer_info must be completely set up in the transmit path */ + } + + /** + * igb_clean_tx_ring - Free Tx Buffers +- * @adapter: board private structure + * @tx_ring: ring to be cleaned + **/ + static void igb_clean_tx_ring(struct igb_ring *tx_ring) +@@ -2059,7 +2298,6 @@ + + /** + * igb_free_rx_resources - Free Rx Resources +- * @adapter: board private structure + * @rx_ring: ring to clean the resources from + * + * Free all receive software resources +@@ -2073,10 +2311,10 @@ + vfree(rx_ring->buffer_info); + rx_ring->buffer_info = NULL; + +-#ifdef CONFIG_IGB_LRO ++#ifdef IGB_LRO + vfree(rx_ring->lro_mgr.lro_arr); + rx_ring->lro_mgr.lro_arr = NULL; +-#endif ++#endif /* IGB_LRO */ + + pci_free_consistent(pdev, rx_ring->size, rx_ring->desc, rx_ring->dma); + +@@ -2099,7 +2337,6 @@ + + /** + * igb_clean_rx_ring - Free Rx Buffers per Queue +- * @adapter: board private structure + * @rx_ring: ring to free buffers from + **/ + static void igb_clean_rx_ring(struct igb_ring *rx_ring) +@@ -2118,12 +2355,12 @@ + if (buffer_info->dma) { + if (adapter->rx_ps_hdr_size) + pci_unmap_single(pdev, buffer_info->dma, +- adapter->rx_ps_hdr_size, +- PCI_DMA_FROMDEVICE); ++ adapter->rx_ps_hdr_size, ++ PCI_DMA_FROMDEVICE); + else + pci_unmap_single(pdev, buffer_info->dma, +- adapter->rx_buffer_len, +- PCI_DMA_FROMDEVICE); ++ adapter->rx_buffer_len, ++ PCI_DMA_FROMDEVICE); + buffer_info->dma = 0; + } + +@@ -2131,16 +2368,18 @@ + dev_kfree_skb(buffer_info->skb); + buffer_info->skb = NULL; + } ++#ifndef CONFIG_IGB_DISABLE_PACKET_SPLIT + if (buffer_info->page) { + if (buffer_info->page_dma) + pci_unmap_page(pdev, buffer_info->page_dma, +- PAGE_SIZE / 2, +- PCI_DMA_FROMDEVICE); ++ PAGE_SIZE / 2, ++ PCI_DMA_FROMDEVICE); + put_page(buffer_info->page); + buffer_info->page = NULL; + buffer_info->page_dma = 0; + buffer_info->page_offset = 0; + } ++#endif + } + + size = sizeof(struct igb_buffer) * rx_ring->count; +@@ -2178,15 +2417,16 @@ + static int igb_set_mac(struct net_device *netdev, void *p) + { + struct igb_adapter *adapter = netdev_priv(netdev); ++ struct e1000_hw *hw = &adapter->hw; + struct sockaddr *addr = p; + + if (!is_valid_ether_addr(addr->sa_data)) + return -EADDRNOTAVAIL; + + memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len); +- memcpy(adapter->hw.mac.addr, addr->sa_data, netdev->addr_len); +- +- adapter->hw.mac.ops.rar_set(&adapter->hw, adapter->hw.mac.addr, 0); ++ memcpy(hw->mac.addr, addr->sa_data, netdev->addr_len); ++ ++ e1000_rar_set(hw, hw->mac.addr, 0); + + return 0; + } +@@ -2212,7 +2452,7 @@ + + /* Check for Promiscuous and All Multicast modes */ + +- rctl = rd32(E1000_RCTL); ++ rctl = E1000_READ_REG(hw, E1000_RCTL); + + if (netdev->flags & IFF_PROMISC) { + rctl |= (E1000_RCTL_UPE | E1000_RCTL_MPE); +@@ -2225,12 +2465,12 @@ + rctl &= ~(E1000_RCTL_UPE | E1000_RCTL_MPE); + rctl |= E1000_RCTL_VFE; + } +- wr32(E1000_RCTL, rctl); ++ E1000_WRITE_REG(hw, E1000_RCTL, rctl); + + if (!netdev->mc_count) { + /* nothing to program, so clear mc list */ +- igb_update_mc_addr_list_82575(hw, NULL, 0, 1, +- mac->rar_entry_count); ++ e1000_update_mc_addr_list(hw, NULL, 0, 1, ++ mac->rar_entry_count); + return; + } + +@@ -2247,8 +2487,7 @@ + memcpy(mta_list + (i*ETH_ALEN), mc_ptr->dmi_addr, ETH_ALEN); + mc_ptr = mc_ptr->next; + } +- igb_update_mc_addr_list_82575(hw, mta_list, i, 1, +- mac->rar_entry_count); ++ e1000_update_mc_addr_list(hw, mta_list, i, 1, mac->rar_entry_count); + kfree(mta_list); + } + +@@ -2257,8 +2496,48 @@ + static void igb_update_phy_info(unsigned long data) + { + struct igb_adapter *adapter = (struct igb_adapter *) data; +- if (adapter->hw.phy.ops.get_phy_info) +- adapter->hw.phy.ops.get_phy_info(&adapter->hw); ++ e1000_get_phy_info(&adapter->hw); ++} ++ ++/** ++ * igb_has_link - check shared code for link and determine up/down ++ * @adapter: pointer to driver private info ++ **/ ++static bool igb_has_link(struct igb_adapter *adapter) ++{ ++ struct e1000_hw *hw = &adapter->hw; ++ bool link_active = FALSE; ++ s32 ret_val = 0; ++ ++ /* get_link_status is set on LSC (link status) interrupt or ++ * rx sequence error interrupt. get_link_status will stay ++ * false until the e1000_check_for_link establishes link ++ * for copper adapters ONLY ++ */ ++ switch (hw->phy.media_type) { ++ case e1000_media_type_copper: ++ if (hw->mac.get_link_status) { ++ ret_val = e1000_check_for_link(hw); ++ link_active = !hw->mac.get_link_status; ++ } else { ++ link_active = TRUE; ++ } ++ break; ++ case e1000_media_type_fiber: ++ ret_val = e1000_check_for_link(hw); ++ link_active = !!(E1000_READ_REG(hw, E1000_STATUS) & ++ E1000_STATUS_LU); ++ break; ++ case e1000_media_type_internal_serdes: ++ ret_val = e1000_check_for_link(hw); ++ link_active = hw->mac.serdes_has_link; ++ break; ++ default: ++ case e1000_media_type_unknown: ++ break; ++ } ++ ++ return link_active; + } + + /** +@@ -2275,54 +2554,32 @@ + static void igb_watchdog_task(struct work_struct *work) + { + struct igb_adapter *adapter = container_of(work, +- struct igb_adapter, watchdog_task); +- struct e1000_hw *hw = &adapter->hw; +- ++ struct igb_adapter, watchdog_task); ++ struct e1000_hw *hw = &adapter->hw; + struct net_device *netdev = adapter->netdev; + struct igb_ring *tx_ring = adapter->tx_ring; +- struct e1000_mac_info *mac = &adapter->hw.mac; + u32 link; + u32 eics = 0; +- s32 ret_val; +- int i; +- +- if ((netif_carrier_ok(netdev)) && +- (rd32(E1000_STATUS) & E1000_STATUS_LU)) +- goto link_up; +- +- ret_val = hw->mac.ops.check_for_link(&adapter->hw); +- if ((ret_val == E1000_ERR_PHY) && +- (hw->phy.type == e1000_phy_igp_3) && +- (rd32(E1000_CTRL) & +- E1000_PHY_CTRL_GBE_DISABLE)) +- dev_info(&adapter->pdev->dev, +- "Gigabit has been disabled, downgrading speed\n"); +- +- if ((hw->phy.media_type == e1000_media_type_internal_serdes) && +- !(rd32(E1000_TXCW) & E1000_TXCW_ANE)) +- link = mac->serdes_has_link; +- else +- link = rd32(E1000_STATUS) & +- E1000_STATUS_LU; ++ int i; ++ ++ link = igb_has_link(adapter); + + if (link) { + if (!netif_carrier_ok(netdev)) { + u32 ctrl; +- hw->mac.ops.get_speed_and_duplex(&adapter->hw, +- &adapter->link_speed, +- &adapter->link_duplex); +- +- ctrl = rd32(E1000_CTRL); +- dev_info(&adapter->pdev->dev, +- "NIC Link is Up %d Mbps %s, " +- "Flow Control: %s\n", +- adapter->link_speed, +- adapter->link_duplex == FULL_DUPLEX ? +- "Full Duplex" : "Half Duplex", +- ((ctrl & E1000_CTRL_TFCE) && (ctrl & +- E1000_CTRL_RFCE)) ? "RX/TX" : ((ctrl & +- E1000_CTRL_RFCE) ? "RX" : ((ctrl & +- E1000_CTRL_TFCE) ? "TX" : "None"))); ++ e1000_get_speed_and_duplex(hw, &adapter->link_speed, ++ &adapter->link_duplex); ++ ++ ctrl = E1000_READ_REG(hw, E1000_CTRL); ++ DPRINTK(LINK, INFO, "NIC Link is Up %d Mbps %s, " ++ "Flow Control: %s\n", ++ adapter->link_speed, ++ adapter->link_duplex == FULL_DUPLEX ? ++ "Full Duplex" : "Half Duplex", ++ ((ctrl & E1000_CTRL_TFCE) && (ctrl & ++ E1000_CTRL_RFCE)) ? "RX/TX" : ((ctrl & ++ E1000_CTRL_RFCE) ? "RX" : ((ctrl & ++ E1000_CTRL_TFCE) ? "TX" : "None"))); + + /* tweak tx_queue_len according to speed/duplex and + * adjust the timeout factor */ +@@ -2342,6 +2599,7 @@ + netif_carrier_on(netdev); + netif_tx_wake_all_queues(netdev); + ++ /* link state has changed, schedule phy info update */ + if (!test_bit(__IGB_DOWN, &adapter->state)) + mod_timer(&adapter->phy_info_timer, + round_jiffies(jiffies + 2 * HZ)); +@@ -2350,29 +2608,18 @@ + if (netif_carrier_ok(netdev)) { + adapter->link_speed = 0; + adapter->link_duplex = 0; +- dev_info(&adapter->pdev->dev, "NIC Link is Down\n"); ++ DPRINTK(LINK, INFO, "NIC Link is Down\n"); + netif_carrier_off(netdev); + netif_tx_stop_all_queues(netdev); ++ ++ /* link state has changed, schedule phy info update */ + if (!test_bit(__IGB_DOWN, &adapter->state)) + mod_timer(&adapter->phy_info_timer, + round_jiffies(jiffies + 2 * HZ)); + } + } + +-link_up: + igb_update_stats(adapter); +- +- mac->tx_packet_delta = adapter->stats.tpt - adapter->tpt_old; +- adapter->tpt_old = adapter->stats.tpt; +- mac->collision_delta = adapter->stats.colc - adapter->colc_old; +- adapter->colc_old = adapter->stats.colc; +- +- adapter->gorc = adapter->stats.gorc - adapter->gorc_old; +- adapter->gorc_old = adapter->stats.gorc; +- adapter->gotc = adapter->stats.gotc - adapter->gotc_old; +- adapter->gotc_old = adapter->stats.gotc; +- +- igb_update_adaptive(&adapter->hw); + + if (!netif_carrier_ok(netdev)) { + if (IGB_DESC_UNUSED(tx_ring) + 1 < tx_ring->count) { +@@ -2389,18 +2636,18 @@ + if (adapter->msix_entries) { + for (i = 0; i < adapter->num_rx_queues; i++) + eics |= adapter->rx_ring[i].eims_value; +- wr32(E1000_EICS, eics); +- } else { +- wr32(E1000_ICS, E1000_ICS_RXDMT0); ++ E1000_WRITE_REG(hw, E1000_EICS, eics); ++ } else { ++ E1000_WRITE_REG(hw, E1000_ICS, E1000_ICS_RXDMT0); + } + + /* Force detection of hung controller every watchdog period */ +- tx_ring->detect_tx_hung = true; ++ tx_ring->detect_tx_hung = TRUE; + + /* Reset the timer */ + if (!test_bit(__IGB_DOWN, &adapter->state)) + mod_timer(&adapter->watchdog_timer, +- round_jiffies(jiffies + 2 * HZ)); ++ round_jiffies(jiffies + 2 * HZ)); + } + + enum latency_range { +@@ -2444,6 +2691,12 @@ + goto set_itr_val; + } + avg_wire_size = rx_ring->total_bytes / rx_ring->total_packets; ++#ifndef CONFIG_IGB_SEPARATE_TX_HANDLER ++ if (rx_ring->buddy && rx_ring->buddy->total_packets) ++ avg_wire_size = max(avg_wire_size, ++ (int)(rx_ring->buddy->total_bytes / ++ rx_ring->buddy->total_packets)); ++#endif + + /* Add 24 bytes to size to account for CRC, preamble, and gap */ + avg_wire_size += 24; +@@ -2465,6 +2718,12 @@ + clear_counts: + rx_ring->total_bytes = 0; + rx_ring->total_packets = 0; ++#ifndef CONFIG_IGB_SEPARATE_TX_HANDLER ++ if (rx_ring->buddy) { ++ rx_ring->buddy->total_bytes = 0; ++ rx_ring->buddy->total_packets = 0; ++ } ++#endif + } + + /** +@@ -2486,7 +2745,7 @@ + * @bytes: the number of bytes during this measurement interval + **/ + static unsigned int igb_update_itr(struct igb_adapter *adapter, u16 itr_setting, +- int packets, int bytes) ++ int packets, int bytes) + { + unsigned int retval = itr_setting; + +@@ -2521,7 +2780,7 @@ + if (bytes > 25000) { + if (packets > 35) + retval = low_latency; +- } else if (bytes < 6000) { ++ } else if (bytes < 1500) { + retval = low_latency; + } + break; +@@ -2544,24 +2803,22 @@ + } + + adapter->rx_itr = igb_update_itr(adapter, +- adapter->rx_itr, +- adapter->rx_ring->total_packets, +- adapter->rx_ring->total_bytes); ++ adapter->rx_itr, ++ adapter->rx_ring->total_packets, ++ adapter->rx_ring->total_bytes); + + if (adapter->rx_ring->buddy) { + adapter->tx_itr = igb_update_itr(adapter, +- adapter->tx_itr, +- adapter->tx_ring->total_packets, +- adapter->tx_ring->total_bytes); +- ++ adapter->tx_itr, ++ adapter->tx_ring->total_packets, ++ adapter->tx_ring->total_bytes); + current_itr = max(adapter->rx_itr, adapter->tx_itr); + } else { + current_itr = adapter->rx_itr; + } + + /* conservative mode (itr 3) eliminates the lowest_latency setting */ +- if (adapter->itr_setting == 3 && +- current_itr == lowest_latency) ++ if (adapter->itr_setting == 3 && current_itr == lowest_latency) + current_itr = low_latency; + + switch (current_itr) { +@@ -2592,8 +2849,8 @@ + * by adding intermediate steps when interrupt rate is + * increasing */ + new_itr = new_itr > adapter->itr ? +- min(adapter->itr + (new_itr >> 2), new_itr) : +- new_itr; ++ min(adapter->itr + (new_itr >> 2), new_itr) : ++ new_itr; + /* Don't write the value here; it resets the adapter's + * internal timer, and causes us to delay far longer than + * we should between interrupts. Instead, we write the ITR +@@ -2613,13 +2870,14 @@ + #define IGB_TX_FLAGS_VLAN 0x00000002 + #define IGB_TX_FLAGS_TSO 0x00000004 + #define IGB_TX_FLAGS_IPV4 0x00000008 +-#define IGB_TX_FLAGS_VLAN_MASK 0xffff0000 +-#define IGB_TX_FLAGS_VLAN_SHIFT 16 ++#define IGB_TX_FLAGS_VLAN_MASK 0xffff0000 ++#define IGB_TX_FLAGS_VLAN_SHIFT 16 + + static inline int igb_tso_adv(struct igb_adapter *adapter, +- struct igb_ring *tx_ring, +- struct sk_buff *skb, u32 tx_flags, u8 *hdr_len) +-{ ++ struct igb_ring *tx_ring, ++ struct sk_buff *skb, u32 tx_flags, u8 *hdr_len) ++{ ++#ifdef NETIF_F_TSO + struct e1000_adv_tx_context_desc *context_desc; + unsigned int i; + int err; +@@ -2645,11 +2903,13 @@ + iph->daddr, 0, + IPPROTO_TCP, + 0); ++#ifdef NETIF_F_TSO6 + } else if (skb_shinfo(skb)->gso_type == SKB_GSO_TCPV6) { + ipv6_hdr(skb)->payload_len = 0; + tcp_hdr(skb)->check = ~csum_ipv6_magic(&ipv6_hdr(skb)->saddr, + &ipv6_hdr(skb)->daddr, + 0, IPPROTO_TCP, 0); ++#endif + } + + i = tx_ring->next_to_use; +@@ -2678,7 +2938,7 @@ + mss_l4len_idx = (skb_shinfo(skb)->gso_size << E1000_ADVTXD_MSS_SHIFT); + mss_l4len_idx |= (l4len << E1000_ADVTXD_L4LEN_SHIFT); + +- /* Context index must be unique per ring. */ ++ /* For 82575, context index must be unique per ring. */ + if (adapter->flags & IGB_FLAG_NEED_CTX_IDX) + mss_l4len_idx |= tx_ring->queue_index << 4; + +@@ -2686,6 +2946,7 @@ + context_desc->seqnum_seed = 0; + + buffer_info->time_stamp = jiffies; ++ buffer_info->next_to_watch = i; + buffer_info->dma = 0; + i++; + if (i == tx_ring->count) +@@ -2693,12 +2954,15 @@ + + tx_ring->next_to_use = i; + +- return true; ++ return TRUE; ++#else ++ return FALSE; ++#endif /* NETIF_F_TSO */ + } + + static inline bool igb_tx_csum_adv(struct igb_adapter *adapter, +- struct igb_ring *tx_ring, +- struct sk_buff *skb, u32 tx_flags) ++ struct igb_ring *tx_ring, ++ struct sk_buff *skb, u32 tx_flags) + { + struct e1000_adv_tx_context_desc *context_desc; + unsigned int i; +@@ -2713,6 +2977,7 @@ + + if (tx_flags & IGB_TX_FLAGS_VLAN) + info |= (tx_flags & IGB_TX_FLAGS_VLAN_MASK); ++ + info |= (skb_network_offset(skb) << E1000_ADVTXD_MACLEN_SHIFT); + if (skb->ip_summed == CHECKSUM_PARTIAL) + info |= skb_network_header_len(skb); +@@ -2728,16 +2993,19 @@ + if (ip_hdr(skb)->protocol == IPPROTO_TCP) + tu_cmd |= E1000_ADVTXD_TUCMD_L4T_TCP; + break; ++#ifdef NETIF_F_IPV6_CSUM + case __constant_htons(ETH_P_IPV6): + /* XXX what about other V6 headers?? */ + if (ipv6_hdr(skb)->nexthdr == IPPROTO_TCP) + tu_cmd |= E1000_ADVTXD_TUCMD_L4T_TCP; + break; ++#endif + default: +- if (unlikely(net_ratelimit())) +- dev_warn(&adapter->pdev->dev, +- "partial checksum but proto=%x!\n", +- skb->protocol); ++ if (unlikely(net_ratelimit())) { ++ DPRINTK(PROBE, WARNING, ++ "partial checksum but proto=%x!\n", ++ skb->protocol); ++ } + break; + } + } +@@ -2747,8 +3015,11 @@ + if (adapter->flags & IGB_FLAG_NEED_CTX_IDX) + context_desc->mss_l4len_idx = + cpu_to_le32(tx_ring->queue_index << 4); ++ else ++ context_desc->mss_l4len_idx = 0; + + buffer_info->time_stamp = jiffies; ++ buffer_info->next_to_watch = i; + buffer_info->dma = 0; + + i++; +@@ -2756,19 +3027,17 @@ + i = 0; + tx_ring->next_to_use = i; + +- return true; +- } +- +- +- return false; ++ return TRUE; ++ } ++ return FALSE; + } + + #define IGB_MAX_TXD_PWR 16 + #define IGB_MAX_DATA_PER_TXD (1<length = len; + /* set time_stamp *before* dma to help avoid a possible race */ + buffer_info->time_stamp = jiffies; ++ buffer_info->next_to_watch = i; + buffer_info->dma = pci_map_single(adapter->pdev, skb->data, len, +- PCI_DMA_TODEVICE); ++ PCI_DMA_TODEVICE); + count++; + i++; + if (i == tx_ring->count) +@@ -2799,11 +3069,12 @@ + BUG_ON(len >= IGB_MAX_DATA_PER_TXD); + buffer_info->length = len; + buffer_info->time_stamp = jiffies; ++ buffer_info->next_to_watch = i; + buffer_info->dma = pci_map_page(adapter->pdev, +- frag->page, +- frag->page_offset, +- len, +- PCI_DMA_TODEVICE); ++ frag->page, ++ frag->page_offset, ++ len, ++ PCI_DMA_TODEVICE); + + count++; + i++; +@@ -2811,16 +3082,17 @@ + i = 0; + } + +- i = (i == 0) ? tx_ring->count - 1 : i - 1; ++ i = ((i == 0) ? tx_ring->count - 1 : i - 1); + tx_ring->buffer_info[i].skb = skb; ++ tx_ring->buffer_info[first].next_to_watch = i; + + return count; + } + + static inline void igb_tx_queue_adv(struct igb_adapter *adapter, +- struct igb_ring *tx_ring, +- int tx_flags, int count, u32 paylen, +- u8 hdr_len) ++ struct igb_ring *tx_ring, ++ int tx_flags, int count, u32 paylen, ++ u8 hdr_len) + { + union e1000_adv_tx_desc *tx_desc = NULL; + struct igb_buffer *buffer_info; +@@ -2828,7 +3100,7 @@ + unsigned int i; + + cmd_type_len = (E1000_ADVTXD_DTYP_DATA | E1000_ADVTXD_DCMD_IFCS | +- E1000_ADVTXD_DCMD_DEXT); ++ E1000_ADVTXD_DCMD_DEXT); + + if (tx_flags & IGB_TX_FLAGS_VLAN) + cmd_type_len |= E1000_ADVTXD_DCMD_VLE; +@@ -2882,11 +3154,14 @@ + } + + static int __igb_maybe_stop_tx(struct net_device *netdev, +- struct igb_ring *tx_ring, int size) +-{ +- struct igb_adapter *adapter = netdev_priv(netdev); +- +- netif_stop_subqueue(netdev, tx_ring->queue_index); ++ struct igb_ring *tx_ring, int size) ++{ ++ struct igb_adapter *adapter = netdev_priv(netdev); ++ ++ if (netif_is_multiqueue(netdev)) ++ netif_stop_subqueue(netdev, tx_ring->queue_index); ++ else ++ netif_stop_queue(netdev); + + /* Herbert's original patch had: + * smp_mb__after_netif_stop_queue(); +@@ -2899,13 +3174,16 @@ + return -EBUSY; + + /* A reprieve! */ +- netif_wake_subqueue(netdev, tx_ring->queue_index); ++ if (netif_is_multiqueue(netdev)) ++ netif_wake_subqueue(netdev, tx_ring->queue_index); ++ else ++ netif_wake_queue(netdev); + ++adapter->restart_queue; + return 0; + } + + static int igb_maybe_stop_tx(struct net_device *netdev, +- struct igb_ring *tx_ring, int size) ++ struct igb_ring *tx_ring, int size) + { + if (IGB_DESC_UNUSED(tx_ring) >= size) + return 0; +@@ -2915,10 +3193,11 @@ + #define TXD_USE_COUNT(S) (((S) >> (IGB_MAX_TXD_PWR)) + 1) + + static int igb_xmit_frame_ring_adv(struct sk_buff *skb, +- struct net_device *netdev, +- struct igb_ring *tx_ring) +-{ +- struct igb_adapter *adapter = netdev_priv(netdev); ++ struct net_device *netdev, ++ struct igb_ring *tx_ring) ++{ ++ struct igb_adapter *adapter = netdev_priv(netdev); ++ unsigned int first; + unsigned int tx_flags = 0; + unsigned int len; + u8 hdr_len = 0; +@@ -2945,7 +3224,6 @@ + /* this is a hard error */ + return NETDEV_TX_BUSY; + } +- skb_orphan(skb); + + if (adapter->vlgrp && vlan_tx_tag_present(skb)) { + tx_flags |= IGB_TX_FLAGS_VLAN; +@@ -2955,8 +3233,11 @@ + if (skb->protocol == htons(ETH_P_IP)) + tx_flags |= IGB_TX_FLAGS_IPV4; + ++ first = tx_ring->next_to_use; ++#ifdef NETIF_F_TSO + tso = skb_is_gso(skb) ? igb_tso_adv(adapter, tx_ring, skb, tx_flags, +- &hdr_len) : 0; ++ &hdr_len) : 0; ++#endif + + if (tso < 0) { + dev_kfree_skb_any(skb); +@@ -2965,13 +3246,13 @@ + + if (tso) + tx_flags |= IGB_TX_FLAGS_TSO; +- else if (igb_tx_csum_adv(adapter, tx_ring, skb, tx_flags)) +- if (skb->ip_summed == CHECKSUM_PARTIAL) +- tx_flags |= IGB_TX_FLAGS_CSUM; ++ else if (igb_tx_csum_adv(adapter, tx_ring, skb, tx_flags) && ++ (skb->ip_summed == CHECKSUM_PARTIAL)) ++ tx_flags |= IGB_TX_FLAGS_CSUM; + + igb_tx_queue_adv(adapter, tx_ring, tx_flags, +- igb_tx_map_adv(adapter, tx_ring, skb), +- skb->len, hdr_len); ++ igb_tx_map_adv(adapter, tx_ring, skb, first), ++ skb->len, hdr_len); + + netdev->trans_start = jiffies; + +@@ -2986,9 +3267,13 @@ + struct igb_adapter *adapter = netdev_priv(netdev); + struct igb_ring *tx_ring; + ++#ifdef HAVE_TX_MQ + int r_idx = 0; +- r_idx = skb->queue_mapping & (IGB_MAX_TX_QUEUES - 1); ++ r_idx = skb->queue_mapping & (IGB_ABS_MAX_TX_QUEUES - 1); + tx_ring = adapter->multi_tx_table[r_idx]; ++#else ++ tx_ring = &adapter->tx_ring[0]; ++#endif + + /* This goes back to the question of how to logically map a tx queue + * to a flow. Right now, performance is impacted slightly negatively +@@ -3009,8 +3294,8 @@ + /* Do the reset outside of interrupt context */ + adapter->tx_timeout_count++; + schedule_work(&adapter->reset_task); +- wr32(E1000_EICS, adapter->eims_enable_mask & +- ~(E1000_EIMS_TCP_TIMER | E1000_EIMS_OTHER)); ++ E1000_WRITE_REG(hw, E1000_EICS, ++ (adapter->eims_enable_mask & ~adapter->eims_other)); + } + + static void igb_reset_task(struct work_struct *work) +@@ -3028,8 +3313,7 @@ + * Returns the address of the device statistics structure. + * The statistics are actually updated from the timer callback. + **/ +-static struct net_device_stats * +-igb_get_stats(struct net_device *netdev) ++static struct net_device_stats * igb_get_stats(struct net_device *netdev) + { + struct igb_adapter *adapter = netdev_priv(netdev); + +@@ -3049,20 +3333,20 @@ + struct igb_adapter *adapter = netdev_priv(netdev); + int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN; + +- if ((max_frame < ETH_ZLEN + ETH_FCS_LEN) || +- (max_frame > MAX_JUMBO_FRAME_SIZE)) { +- dev_err(&adapter->pdev->dev, "Invalid MTU setting\n"); ++ if ((new_mtu < 68) || (max_frame > MAX_JUMBO_FRAME_SIZE)) { ++ DPRINTK(PROBE, ERR, "Invalid MTU setting\n"); + return -EINVAL; + } + + #define MAX_STD_JUMBO_FRAME_SIZE 9234 + if (max_frame > MAX_STD_JUMBO_FRAME_SIZE) { +- dev_err(&adapter->pdev->dev, "MTU > 9216 not supported.\n"); ++ DPRINTK(PROBE, ERR, "MTU > 9216 not supported.\n"); + return -EINVAL; + } + + while (test_and_set_bit(__IGB_RESETTING, &adapter->state)) + msleep(1); ++ + /* igb_down has a dependency on max_frame_size */ + adapter->max_frame_size = max_frame; + if (netif_running(netdev)) +@@ -3082,19 +3366,28 @@ + adapter->rx_buffer_len = IGB_RXBUFFER_1024; + else if (max_frame <= IGB_RXBUFFER_2048) + adapter->rx_buffer_len = IGB_RXBUFFER_2048; ++#ifndef CONFIG_IGB_DISABLE_PACKET_SPLIT + else + #if (PAGE_SIZE / 2) > IGB_RXBUFFER_16384 + adapter->rx_buffer_len = IGB_RXBUFFER_16384; + #else + adapter->rx_buffer_len = PAGE_SIZE / 2; ++#endif ++#else ++ else if (max_frame <= IGB_RXBUFFER_4096) ++ adapter->rx_buffer_len = IGB_RXBUFFER_4096; ++ else if (max_frame <= IGB_RXBUFFER_8192) ++ adapter->rx_buffer_len = IGB_RXBUFFER_8192; ++ else if (max_frame <= IGB_RXBUFFER_16384) ++ adapter->rx_buffer_len = IGB_RXBUFFER_16384; + #endif + /* adjust allocation if LPE protects us, and we aren't using SBP */ + if ((max_frame == ETH_FRAME_LEN + ETH_FCS_LEN) || + (max_frame == MAXIMUM_ETHERNET_VLAN_SIZE)) + adapter->rx_buffer_len = MAXIMUM_ETHERNET_VLAN_SIZE; + +- dev_info(&adapter->pdev->dev, "changing MTU from %d to %d\n", +- netdev->mtu, new_mtu); ++ DPRINTK(PROBE, INFO, "changing MTU from %d to %d\n", ++ netdev->mtu, new_mtu); + netdev->mtu = new_mtu; + + if (netif_running(netdev)) +@@ -3115,7 +3408,9 @@ + void igb_update_stats(struct igb_adapter *adapter) + { + struct e1000_hw *hw = &adapter->hw; +- struct pci_dev *pdev = adapter->pdev; ++#ifdef HAVE_PCI_ERS ++ struct pci_dev *pdev = adapter->pdev; ++#endif + u16 phy_tmp; + + #define PHY_IDLE_ERROR_COUNT_MASK 0x00FF +@@ -3126,81 +3421,79 @@ + */ + if (adapter->link_speed == 0) + return; ++#ifdef HAVE_PCI_ERS + if (pci_channel_offline(pdev)) + return; +- +- adapter->stats.crcerrs += rd32(E1000_CRCERRS); +- adapter->stats.gprc += rd32(E1000_GPRC); +- adapter->stats.gorc += rd32(E1000_GORCL); +- rd32(E1000_GORCH); /* clear GORCL */ +- adapter->stats.bprc += rd32(E1000_BPRC); +- adapter->stats.mprc += rd32(E1000_MPRC); +- adapter->stats.roc += rd32(E1000_ROC); +- +- adapter->stats.prc64 += rd32(E1000_PRC64); +- adapter->stats.prc127 += rd32(E1000_PRC127); +- adapter->stats.prc255 += rd32(E1000_PRC255); +- adapter->stats.prc511 += rd32(E1000_PRC511); +- adapter->stats.prc1023 += rd32(E1000_PRC1023); +- adapter->stats.prc1522 += rd32(E1000_PRC1522); +- adapter->stats.symerrs += rd32(E1000_SYMERRS); +- adapter->stats.sec += rd32(E1000_SEC); +- +- adapter->stats.mpc += rd32(E1000_MPC); +- adapter->stats.scc += rd32(E1000_SCC); +- adapter->stats.ecol += rd32(E1000_ECOL); +- adapter->stats.mcc += rd32(E1000_MCC); +- adapter->stats.latecol += rd32(E1000_LATECOL); +- adapter->stats.dc += rd32(E1000_DC); +- adapter->stats.rlec += rd32(E1000_RLEC); +- adapter->stats.xonrxc += rd32(E1000_XONRXC); +- adapter->stats.xontxc += rd32(E1000_XONTXC); +- adapter->stats.xoffrxc += rd32(E1000_XOFFRXC); +- adapter->stats.xofftxc += rd32(E1000_XOFFTXC); +- adapter->stats.fcruc += rd32(E1000_FCRUC); +- adapter->stats.gptc += rd32(E1000_GPTC); +- adapter->stats.gotc += rd32(E1000_GOTCL); +- rd32(E1000_GOTCH); /* clear GOTCL */ +- adapter->stats.rnbc += rd32(E1000_RNBC); +- adapter->stats.ruc += rd32(E1000_RUC); +- adapter->stats.rfc += rd32(E1000_RFC); +- adapter->stats.rjc += rd32(E1000_RJC); +- adapter->stats.tor += rd32(E1000_TORH); +- adapter->stats.tot += rd32(E1000_TOTH); +- adapter->stats.tpr += rd32(E1000_TPR); +- +- adapter->stats.ptc64 += rd32(E1000_PTC64); +- adapter->stats.ptc127 += rd32(E1000_PTC127); +- adapter->stats.ptc255 += rd32(E1000_PTC255); +- adapter->stats.ptc511 += rd32(E1000_PTC511); +- adapter->stats.ptc1023 += rd32(E1000_PTC1023); +- adapter->stats.ptc1522 += rd32(E1000_PTC1522); +- +- adapter->stats.mptc += rd32(E1000_MPTC); +- adapter->stats.bptc += rd32(E1000_BPTC); +- +- /* used for adaptive IFS */ +- +- hw->mac.tx_packet_delta = rd32(E1000_TPT); +- adapter->stats.tpt += hw->mac.tx_packet_delta; +- hw->mac.collision_delta = rd32(E1000_COLC); +- adapter->stats.colc += hw->mac.collision_delta; +- +- adapter->stats.algnerrc += rd32(E1000_ALGNERRC); +- adapter->stats.rxerrc += rd32(E1000_RXERRC); +- adapter->stats.tncrs += rd32(E1000_TNCRS); +- adapter->stats.tsctc += rd32(E1000_TSCTC); +- adapter->stats.tsctfc += rd32(E1000_TSCTFC); +- +- adapter->stats.iac += rd32(E1000_IAC); +- adapter->stats.icrxoc += rd32(E1000_ICRXOC); +- adapter->stats.icrxptc += rd32(E1000_ICRXPTC); +- adapter->stats.icrxatc += rd32(E1000_ICRXATC); +- adapter->stats.ictxptc += rd32(E1000_ICTXPTC); +- adapter->stats.ictxatc += rd32(E1000_ICTXATC); +- adapter->stats.ictxqec += rd32(E1000_ICTXQEC); +- adapter->stats.ictxqmtc += rd32(E1000_ICTXQMTC); +- adapter->stats.icrxdmtc += rd32(E1000_ICRXDMTC); ++#endif ++ ++ adapter->stats.crcerrs += E1000_READ_REG(hw, E1000_CRCERRS); ++ adapter->stats.gprc += E1000_READ_REG(hw, E1000_GPRC); ++ adapter->stats.gorc += E1000_READ_REG(hw, E1000_GORCL); ++ E1000_READ_REG(hw, E1000_GORCH); /* clear GORCL */ ++ adapter->stats.bprc += E1000_READ_REG(hw, E1000_BPRC); ++ adapter->stats.mprc += E1000_READ_REG(hw, E1000_MPRC); ++ adapter->stats.roc += E1000_READ_REG(hw, E1000_ROC); ++ ++ adapter->stats.prc64 += E1000_READ_REG(hw, E1000_PRC64); ++ adapter->stats.prc127 += E1000_READ_REG(hw, E1000_PRC127); ++ adapter->stats.prc255 += E1000_READ_REG(hw, E1000_PRC255); ++ adapter->stats.prc511 += E1000_READ_REG(hw, E1000_PRC511); ++ adapter->stats.prc1023 += E1000_READ_REG(hw, E1000_PRC1023); ++ adapter->stats.prc1522 += E1000_READ_REG(hw, E1000_PRC1522); ++ adapter->stats.symerrs += E1000_READ_REG(hw, E1000_SYMERRS); ++ adapter->stats.sec += E1000_READ_REG(hw, E1000_SEC); ++ ++ adapter->stats.mpc += E1000_READ_REG(hw, E1000_MPC); ++ adapter->stats.scc += E1000_READ_REG(hw, E1000_SCC); ++ adapter->stats.ecol += E1000_READ_REG(hw, E1000_ECOL); ++ adapter->stats.mcc += E1000_READ_REG(hw, E1000_MCC); ++ adapter->stats.latecol += E1000_READ_REG(hw, E1000_LATECOL); ++ adapter->stats.dc += E1000_READ_REG(hw, E1000_DC); ++ adapter->stats.rlec += E1000_READ_REG(hw, E1000_RLEC); ++ adapter->stats.xonrxc += E1000_READ_REG(hw, E1000_XONRXC); ++ adapter->stats.xontxc += E1000_READ_REG(hw, E1000_XONTXC); ++ adapter->stats.xoffrxc += E1000_READ_REG(hw, E1000_XOFFRXC); ++ adapter->stats.xofftxc += E1000_READ_REG(hw, E1000_XOFFTXC); ++ adapter->stats.fcruc += E1000_READ_REG(hw, E1000_FCRUC); ++ adapter->stats.gptc += E1000_READ_REG(hw, E1000_GPTC); ++ adapter->stats.gotc += E1000_READ_REG(hw, E1000_GOTCL); ++ E1000_READ_REG(hw, E1000_GOTCH); /* clear GOTCL */ ++ adapter->stats.rnbc += E1000_READ_REG(hw, E1000_RNBC); ++ adapter->stats.ruc += E1000_READ_REG(hw, E1000_RUC); ++ adapter->stats.rfc += E1000_READ_REG(hw, E1000_RFC); ++ adapter->stats.rjc += E1000_READ_REG(hw, E1000_RJC); ++ adapter->stats.tor += E1000_READ_REG(hw, E1000_TORH); ++ adapter->stats.tot += E1000_READ_REG(hw, E1000_TOTH); ++ adapter->stats.tpr += E1000_READ_REG(hw, E1000_TPR); ++ ++ adapter->stats.ptc64 += E1000_READ_REG(hw, E1000_PTC64); ++ adapter->stats.ptc127 += E1000_READ_REG(hw, E1000_PTC127); ++ adapter->stats.ptc255 += E1000_READ_REG(hw, E1000_PTC255); ++ adapter->stats.ptc511 += E1000_READ_REG(hw, E1000_PTC511); ++ adapter->stats.ptc1023 += E1000_READ_REG(hw, E1000_PTC1023); ++ adapter->stats.ptc1522 += E1000_READ_REG(hw, E1000_PTC1522); ++ ++ adapter->stats.mptc += E1000_READ_REG(hw, E1000_MPTC); ++ adapter->stats.bptc += E1000_READ_REG(hw, E1000_BPTC); ++ ++ adapter->stats.tpt += E1000_READ_REG(hw, E1000_TPT); ++ adapter->stats.colc += E1000_READ_REG(hw, E1000_COLC); ++ ++ adapter->stats.algnerrc += E1000_READ_REG(hw, E1000_ALGNERRC); ++ adapter->stats.rxerrc += E1000_READ_REG(hw, E1000_RXERRC); ++ adapter->stats.tncrs += E1000_READ_REG(hw, E1000_TNCRS); ++ adapter->stats.tsctc += E1000_READ_REG(hw, E1000_TSCTC); ++ adapter->stats.tsctfc += E1000_READ_REG(hw, E1000_TSCTFC); ++ ++ adapter->stats.iac += E1000_READ_REG(hw, E1000_IAC); ++ adapter->stats.icrxoc += E1000_READ_REG(hw, E1000_ICRXOC); ++ adapter->stats.icrxptc += E1000_READ_REG(hw, E1000_ICRXPTC); ++ adapter->stats.icrxatc += E1000_READ_REG(hw, E1000_ICRXATC); ++ adapter->stats.ictxptc += E1000_READ_REG(hw, E1000_ICTXPTC); ++ adapter->stats.ictxatc += E1000_READ_REG(hw, E1000_ICTXATC); ++ adapter->stats.ictxqec += E1000_READ_REG(hw, E1000_ICTXQEC); ++ adapter->stats.ictxqmtc += E1000_READ_REG(hw, E1000_ICTXQMTC); ++ adapter->stats.icrxdmtc += E1000_READ_REG(hw, E1000_ICRXDMTC); + + /* Fill out the OS statistics structure */ + adapter->net_stats.multicast = adapter->stats.mprc; +@@ -3215,14 +3508,14 @@ + adapter->stats.ruc + adapter->stats.roc + + adapter->stats.cexterr; + adapter->net_stats.rx_length_errors = adapter->stats.ruc + +- adapter->stats.roc; ++ adapter->stats.roc; + adapter->net_stats.rx_crc_errors = adapter->stats.crcerrs; + adapter->net_stats.rx_frame_errors = adapter->stats.algnerrc; + adapter->net_stats.rx_missed_errors = adapter->stats.mpc; + + /* Tx Errors */ + adapter->net_stats.tx_errors = adapter->stats.ecol + +- adapter->stats.latecol; ++ adapter->stats.latecol; + adapter->net_stats.tx_aborted_errors = adapter->stats.ecol; + adapter->net_stats.tx_window_errors = adapter->stats.latecol; + adapter->net_stats.tx_carrier_errors = adapter->stats.tncrs; +@@ -3232,52 +3525,57 @@ + /* Phy Stats */ + if (hw->phy.media_type == e1000_media_type_copper) { + if ((adapter->link_speed == SPEED_1000) && +- (!hw->phy.ops.read_phy_reg(hw, PHY_1000T_STATUS, +- &phy_tmp))) { ++ (!e1000_read_phy_reg(hw, PHY_1000T_STATUS, &phy_tmp))) { + phy_tmp &= PHY_IDLE_ERROR_COUNT_MASK; + adapter->phy_stats.idle_errors += phy_tmp; + } + } + + /* Management Stats */ +- adapter->stats.mgptc += rd32(E1000_MGTPTC); +- adapter->stats.mgprc += rd32(E1000_MGTPRC); +- adapter->stats.mgpdc += rd32(E1000_MGTPDC); +-} +- ++ adapter->stats.mgptc += E1000_READ_REG(hw, E1000_MGTPTC); ++ adapter->stats.mgprc += E1000_READ_REG(hw, E1000_MGTPRC); ++ adapter->stats.mgpdc += E1000_READ_REG(hw, E1000_MGTPDC); ++} + + static irqreturn_t igb_msix_other(int irq, void *data) + { + struct net_device *netdev = data; + struct igb_adapter *adapter = netdev_priv(netdev); + struct e1000_hw *hw = &adapter->hw; +- u32 icr = rd32(E1000_ICR); ++ u32 icr = E1000_READ_REG(hw, E1000_ICR); + + /* reading ICR causes bit 31 of EICR to be cleared */ ++ ++ if (icr & E1000_ICR_DOUTSYNC) { ++ /* HW is reporting DMA is out of sync */ ++ adapter->stats.doosync++; ++ } + if (!(icr & E1000_ICR_LSC)) + goto no_link_interrupt; + hw->mac.get_link_status = 1; + /* guard against interrupt when we're going down */ + if (!test_bit(__IGB_DOWN, &adapter->state)) + mod_timer(&adapter->watchdog_timer, jiffies + 1); +- ++ + no_link_interrupt: +- wr32(E1000_IMS, E1000_IMS_LSC); +- wr32(E1000_EIMS, adapter->eims_other); +- +- return IRQ_HANDLED; +-} +- ++ E1000_WRITE_REG(hw, E1000_IMS, E1000_IMS_LSC | E1000_IMS_DOUTSYNC); ++ E1000_WRITE_REG(hw, E1000_EIMS, adapter->eims_other); ++ ++ return IRQ_HANDLED; ++} ++ ++#ifdef CONFIG_IGB_SEPARATE_TX_HANDLER + static irqreturn_t igb_msix_tx(int irq, void *data) + { + struct igb_ring *tx_ring = data; + struct igb_adapter *adapter = tx_ring->adapter; + struct e1000_hw *hw = &adapter->hw; + +-#ifdef CONFIG_DCA ++#ifdef IGB_DCA + if (adapter->flags & IGB_FLAG_DCA_ENABLED) + igb_update_tx_dca(tx_ring); + #endif ++ + tx_ring->total_bytes = 0; + tx_ring->total_packets = 0; + +@@ -3285,27 +3583,26 @@ + * EICS */ + if (!igb_clean_tx_irq(tx_ring)) + /* Ring was not completely cleaned, so fire another interrupt */ +- wr32(E1000_EICS, tx_ring->eims_value); +- else +- wr32(E1000_EIMS, tx_ring->eims_value); +- +- return IRQ_HANDLED; +-} +- ++ E1000_WRITE_REG(hw, E1000_EICS, tx_ring->eims_value); ++ else ++ E1000_WRITE_REG(hw, E1000_EIMS, tx_ring->eims_value); ++ ++ return IRQ_HANDLED; ++} ++ ++#endif /* CONFIG_IGB_SEPARATE_TX_HANDLER */ + static void igb_write_itr(struct igb_ring *ring) + { + struct e1000_hw *hw = &ring->adapter->hw; +- if ((ring->adapter->itr_setting & 3) && ring->set_itr) { ++ if (ring->set_itr) { + switch (hw->mac.type) { + case e1000_82576: +- wr32(ring->itr_register, +- ring->itr_val | +- 0x80000000); ++ E1000_WRITE_REG(hw, ring->itr_register, ring->itr_val | ++ 0x80000000); + break; + default: +- wr32(ring->itr_register, +- ring->itr_val | +- (ring->itr_val << 16)); ++ E1000_WRITE_REG(hw, ring->itr_register, ring->itr_val | ++ (ring->itr_val << 16)); + break; + } + ring->set_itr = 0; +@@ -3315,47 +3612,40 @@ + static irqreturn_t igb_msix_rx(int irq, void *data) + { + struct igb_ring *rx_ring = data; +- struct igb_adapter *adapter = rx_ring->adapter; + + /* Write the ITR value calculated at the end of the + * previous interrupt. + */ +- + igb_write_itr(rx_ring); + +- if (netif_rx_schedule_prep(adapter->netdev, &rx_ring->napi)) +- __netif_rx_schedule(adapter->netdev, &rx_ring->napi); +- +-#ifdef CONFIG_DCA +- if (adapter->flags & IGB_FLAG_DCA_ENABLED) +- igb_update_rx_dca(rx_ring); +-#endif +- return IRQ_HANDLED; +-} +- +-#ifdef CONFIG_DCA ++ if (napi_schedule_prep(&rx_ring->napi)) ++ __napi_schedule(&rx_ring->napi); ++ return IRQ_HANDLED; ++} ++ ++#ifdef IGB_DCA + static void igb_update_rx_dca(struct igb_ring *rx_ring) + { + u32 dca_rxctrl; + struct igb_adapter *adapter = rx_ring->adapter; + struct e1000_hw *hw = &adapter->hw; + int cpu = get_cpu(); +- int q = rx_ring - adapter->rx_ring; ++ int q = rx_ring->reg_idx; + + if (rx_ring->cpu != cpu) { +- dca_rxctrl = rd32(E1000_DCA_RXCTRL(q)); ++ dca_rxctrl = E1000_READ_REG(hw, E1000_DCA_RXCTRL(q)); + if (hw->mac.type == e1000_82576) { + dca_rxctrl &= ~E1000_DCA_RXCTRL_CPUID_MASK_82576; +- dca_rxctrl |= dca_get_tag(cpu) << +- E1000_DCA_RXCTRL_CPUID_SHIFT; ++ dca_rxctrl |= dca3_get_tag(&adapter->pdev->dev, cpu) << ++ E1000_DCA_RXCTRL_CPUID_SHIFT_82576; + } else { + dca_rxctrl &= ~E1000_DCA_RXCTRL_CPUID_MASK; +- dca_rxctrl |= dca_get_tag(cpu); ++ dca_rxctrl |= dca3_get_tag(&adapter->pdev->dev, cpu); + } + dca_rxctrl |= E1000_DCA_RXCTRL_DESC_DCA_EN; + dca_rxctrl |= E1000_DCA_RXCTRL_HEAD_DCA_EN; + dca_rxctrl |= E1000_DCA_RXCTRL_DATA_DCA_EN; +- wr32(E1000_DCA_RXCTRL(q), dca_rxctrl); ++ E1000_WRITE_REG(hw, E1000_DCA_RXCTRL(q), dca_rxctrl); + rx_ring->cpu = cpu; + } + put_cpu(); +@@ -3367,20 +3657,20 @@ + struct igb_adapter *adapter = tx_ring->adapter; + struct e1000_hw *hw = &adapter->hw; + int cpu = get_cpu(); +- int q = tx_ring - adapter->tx_ring; ++ int q = tx_ring->reg_idx; + + if (tx_ring->cpu != cpu) { +- dca_txctrl = rd32(E1000_DCA_TXCTRL(q)); ++ dca_txctrl = E1000_READ_REG(hw, E1000_DCA_TXCTRL(q)); + if (hw->mac.type == e1000_82576) { + dca_txctrl &= ~E1000_DCA_TXCTRL_CPUID_MASK_82576; +- dca_txctrl |= dca_get_tag(cpu) << +- E1000_DCA_TXCTRL_CPUID_SHIFT; ++ dca_txctrl |= dca3_get_tag(&adapter->pdev->dev, cpu) << ++ E1000_DCA_TXCTRL_CPUID_SHIFT_82576; + } else { + dca_txctrl &= ~E1000_DCA_TXCTRL_CPUID_MASK; +- dca_txctrl |= dca_get_tag(cpu); ++ dca_txctrl |= dca3_get_tag(&adapter->pdev->dev, cpu); + } + dca_txctrl |= E1000_DCA_TXCTRL_DESC_DCA_EN; +- wr32(E1000_DCA_TXCTRL(q), dca_txctrl); ++ E1000_WRITE_REG(hw, E1000_DCA_TXCTRL(q), dca_txctrl); + tx_ring->cpu = cpu; + } + put_cpu(); +@@ -3418,12 +3708,12 @@ + /* if already enabled, don't do it again */ + if (adapter->flags & IGB_FLAG_DCA_ENABLED) + break; +- adapter->flags |= IGB_FLAG_DCA_ENABLED; +- /* Always use CB2 mode, difference is masked +- * in the CB driver. */ +- wr32(E1000_DCA_CTRL, 2); +- if (dca_add_requester(dev) == 0) { +- dev_info(&adapter->pdev->dev, "DCA enabled\n"); ++ if (dca_add_requester(dev) == E1000_SUCCESS) { ++ adapter->flags |= IGB_FLAG_DCA_ENABLED; ++ /* Always use CB2 mode, difference is masked ++ * in the CB driver. */ ++ E1000_WRITE_REG(hw, E1000_DCA_CTRL, 2); ++ DPRINTK(PROBE, INFO, "DCA enabled\n"); + igb_setup_dca(adapter); + break; + } +@@ -3433,14 +3723,14 @@ + /* without this a class_device is left + * hanging around in the sysfs model */ + dca_remove_requester(dev); +- dev_info(&adapter->pdev->dev, "DCA disabled\n"); ++ DPRINTK(PROBE, INFO, "DCA disabled\n"); + adapter->flags &= ~IGB_FLAG_DCA_ENABLED; +- wr32(E1000_DCA_CTRL, 1); ++ E1000_WRITE_REG(hw, E1000_DCA_CTRL, 1); + } + break; + } + out: +- return 0; ++ return E1000_SUCCESS; + } + + static int igb_notify_dca(struct notifier_block *nb, unsigned long event, +@@ -3453,7 +3743,7 @@ + + return ret_val ? NOTIFY_BAD : NOTIFY_DONE; + } +-#endif /* CONFIG_DCA */ ++#endif /* IGB_DCA */ + + /** + * igb_intr_msi - Interrupt Handler +@@ -3466,9 +3756,14 @@ + struct igb_adapter *adapter = netdev_priv(netdev); + struct e1000_hw *hw = &adapter->hw; + /* read ICR disables interrupts using IAM */ +- u32 icr = rd32(E1000_ICR); ++ u32 icr = E1000_READ_REG(hw, E1000_ICR); + + igb_write_itr(adapter->rx_ring); ++ ++ if (icr & E1000_ICR_DOUTSYNC) { ++ /* HW is reporting DMA is out of sync */ ++ adapter->stats.doosync++; ++ } + + if (icr & (E1000_ICR_RXSEQ | E1000_ICR_LSC)) { + hw->mac.get_link_status = 1; +@@ -3476,13 +3771,13 @@ + mod_timer(&adapter->watchdog_timer, jiffies + 1); + } + +- netif_rx_schedule(netdev, &adapter->rx_ring[0].napi); +- +- return IRQ_HANDLED; +-} +- +-/** +- * igb_intr - Interrupt Handler ++ napi_schedule(&adapter->rx_ring[0].napi); ++ ++ return IRQ_HANDLED; ++} ++ ++/** ++ * igb_intr - Legacy Interrupt Handler + * @irq: interrupt number + * @data: pointer to a network interface device structure + **/ +@@ -3493,8 +3788,7 @@ + struct e1000_hw *hw = &adapter->hw; + /* Interrupt Auto-Mask...upon reading ICR, interrupts are masked. No + * need for the IMC write */ +- u32 icr = rd32(E1000_ICR); +- u32 eicr = 0; ++ u32 icr = E1000_READ_REG(hw, E1000_ICR); + if (!icr) + return IRQ_NONE; /* Not our interrupt */ + +@@ -3505,7 +3799,10 @@ + if (!(icr & E1000_ICR_INT_ASSERTED)) + return IRQ_NONE; + +- eicr = rd32(E1000_EICR); ++ if (icr & E1000_ICR_DOUTSYNC) { ++ /* HW is reporting DMA is out of sync */ ++ adapter->stats.doosync++; ++ } + + if (icr & (E1000_ICR_RXSEQ | E1000_ICR_LSC)) { + hw->mac.get_link_status = 1; +@@ -3514,9 +3811,29 @@ + mod_timer(&adapter->watchdog_timer, jiffies + 1); + } + +- netif_rx_schedule(netdev, &adapter->rx_ring[0].napi); +- +- return IRQ_HANDLED; ++ napi_schedule(&adapter->rx_ring[0].napi); ++ ++ return IRQ_HANDLED; ++} ++ ++static inline void igb_rx_irq_enable(struct igb_ring *rx_ring) ++{ ++ struct igb_adapter *adapter = rx_ring->adapter; ++ struct e1000_hw *hw = &adapter->hw; ++ ++ if (adapter->itr_setting & 3) { ++ if (adapter->num_rx_queues == 1) ++ igb_set_itr(adapter); ++ else ++ igb_update_ring_itr(rx_ring); ++ } ++ ++ if (!test_bit(__IGB_DOWN, &adapter->state)) { ++ if (adapter->msix_entries) ++ E1000_WRITE_REG(hw, E1000_EIMS, rx_ring->eims_value); ++ else ++ igb_irq_enable(adapter); ++ } + } + + /** +@@ -3527,195 +3844,156 @@ + static int igb_poll(struct napi_struct *napi, int budget) + { + struct igb_ring *rx_ring = container_of(napi, struct igb_ring, napi); +- struct igb_adapter *adapter = rx_ring->adapter; +- struct net_device *netdev = adapter->netdev; +- int tx_clean_complete, work_done = 0; +- +- /* this poll routine only supports one tx and one rx queue */ +-#ifdef CONFIG_DCA +- if (adapter->flags & IGB_FLAG_DCA_ENABLED) +- igb_update_tx_dca(&adapter->tx_ring[0]); +-#endif +- tx_clean_complete = igb_clean_tx_irq(&adapter->tx_ring[0]); +- +-#ifdef CONFIG_DCA +- if (adapter->flags & IGB_FLAG_DCA_ENABLED) +- igb_update_rx_dca(&adapter->rx_ring[0]); +-#endif +- igb_clean_rx_irq_adv(&adapter->rx_ring[0], &work_done, budget); +- +- /* If no Tx and not enough Rx work done, exit the polling mode */ +- if ((tx_clean_complete && (work_done < budget)) || +- !netif_running(netdev)) { +- if (adapter->itr_setting & 3) +- igb_set_itr(adapter); +- netif_rx_complete(netdev, napi); +- if (!test_bit(__IGB_DOWN, &adapter->state)) +- igb_irq_enable(adapter); +- return 0; +- } +- +- return 1; +-} +- +-static int igb_clean_rx_ring_msix(struct napi_struct *napi, int budget) +-{ +- struct igb_ring *rx_ring = container_of(napi, struct igb_ring, napi); +- struct igb_adapter *adapter = rx_ring->adapter; +- struct e1000_hw *hw = &adapter->hw; +- struct net_device *netdev = adapter->netdev; +- int work_done = 0; +- +- /* Keep link state information with original netdev */ +- if (!netif_carrier_ok(netdev)) +- goto quit_polling; +- +-#ifdef CONFIG_DCA +- if (adapter->flags & IGB_FLAG_DCA_ENABLED) ++ int tx_clean_complete = 1, work_done = 0; ++ ++ if (rx_ring->buddy) { ++#ifdef IGB_DCA ++ if (rx_ring->adapter->flags & IGB_FLAG_DCA_ENABLED) ++ igb_update_tx_dca(rx_ring->buddy); ++#endif ++ tx_clean_complete = igb_clean_tx_irq(rx_ring->buddy); ++ } ++ ++#ifdef IGB_DCA ++ if (rx_ring->adapter->flags & IGB_FLAG_DCA_ENABLED) + igb_update_rx_dca(rx_ring); ++ + #endif + igb_clean_rx_irq_adv(rx_ring, &work_done, budget); + +- ++ if (!tx_clean_complete) ++ work_done = budget; ++ ++#ifndef HAVE_NETDEV_NAPI_LIST ++ /* if netdev is disabled we need to stop polling */ ++ if (!netif_running(rx_ring->adapter->netdev)) ++ work_done = 0; ++ ++#endif + /* If not enough Rx work done, exit the polling mode */ +- if ((work_done == 0) || !netif_running(netdev)) { +-quit_polling: +- netif_rx_complete(netdev, napi); +- +- if (adapter->itr_setting & 3) { +- if (adapter->num_rx_queues == 1) +- igb_set_itr(adapter); +- else +- igb_update_ring_itr(rx_ring); +- } +- +- if (!test_bit(__IGB_DOWN, &adapter->state)) +- wr32(E1000_EIMS, rx_ring->eims_value); +- +- return 0; +- } +- +- return 1; +-} +- +-static inline u32 get_head(struct igb_ring *tx_ring) +-{ +- void *end = (struct e1000_tx_desc *)tx_ring->desc + tx_ring->count; +- return le32_to_cpu(*(volatile __le32 *)end); ++ if (work_done < budget) { ++ napi_complete(napi); ++ igb_rx_irq_enable(rx_ring); ++ } ++ ++ return work_done; + } + + /** + * igb_clean_tx_irq - Reclaim resources after transmit completes + * @adapter: board private structure +- * returns true if ring is completely cleaned ++ * returns TRUE if ring is completely cleaned + **/ + static bool igb_clean_tx_irq(struct igb_ring *tx_ring) + { + struct igb_adapter *adapter = tx_ring->adapter; +- struct e1000_hw *hw = &adapter->hw; +- struct net_device *netdev = adapter->netdev; +- struct e1000_tx_desc *tx_desc; ++ struct net_device *netdev = adapter->netdev; ++ struct e1000_hw *hw = &adapter->hw; + struct igb_buffer *buffer_info; + struct sk_buff *skb; +- unsigned int i; +- u32 head, oldhead; +- unsigned int count = 0; ++ union e1000_adv_tx_desc *tx_desc, *eop_desc; ++ unsigned int total_bytes = 0, total_packets = 0; ++ unsigned int i, eop, count = 0; + bool cleaned = false; +- bool retval = true; +- unsigned int total_bytes = 0, total_packets = 0; +- +- rmb(); +- head = get_head(tx_ring); ++ + i = tx_ring->next_to_clean; +- while (1) { +- while (i != head) { +- cleaned = true; +- tx_desc = E1000_TX_DESC(*tx_ring, i); ++ eop = tx_ring->buffer_info[i].next_to_watch; ++ eop_desc = E1000_TX_DESC_ADV(*tx_ring, eop); ++ ++ while ((eop_desc->wb.status & cpu_to_le32(E1000_TXD_STAT_DD)) && ++ (count < tx_ring->count)) { ++ for (cleaned = false; !cleaned; count++) { ++ tx_desc = E1000_TX_DESC_ADV(*tx_ring, i); + buffer_info = &tx_ring->buffer_info[i]; ++ cleaned = (i == eop); + skb = buffer_info->skb; + + if (skb) { ++#ifdef NETIF_F_TSO + unsigned int segs, bytecount; + /* gso_segs is currently only valid for tcp */ + segs = skb_shinfo(skb)->gso_segs ?: 1; + /* multiply data chunks by size of headers */ + bytecount = ((segs - 1) * skb_headlen(skb)) + +- skb->len; ++ skb->len; + total_packets += segs; + total_bytes += bytecount; ++#else ++ total_packets++; ++ total_bytes += skb->len; ++#endif + } + + igb_unmap_and_free_tx_resource(adapter, buffer_info); +- tx_desc->upper.data = 0; ++ tx_desc->wb.status = 0; + + i++; + if (i == tx_ring->count) + i = 0; +- +- count++; +- if (count == IGB_MAX_TX_CLEAN) { +- retval = false; +- goto done_cleaning; +- } +- } +- oldhead = head; +- rmb(); +- head = get_head(tx_ring); +- if (head == oldhead) +- goto done_cleaning; +- } /* while (1) */ +- +-done_cleaning: ++ } ++ eop = tx_ring->buffer_info[i].next_to_watch; ++ eop_desc = E1000_TX_DESC_ADV(*tx_ring, eop); ++ } ++ + tx_ring->next_to_clean = i; + +- if (unlikely(cleaned && +- netif_carrier_ok(netdev) && +- IGB_DESC_UNUSED(tx_ring) >= IGB_TX_QUEUE_WAKE)) { ++ if (unlikely(count && ++ netif_carrier_ok(netdev) && ++ IGB_DESC_UNUSED(tx_ring) >= IGB_TX_QUEUE_WAKE)) { + /* Make sure that anybody stopping the queue after this + * sees the new next_to_clean. + */ + smp_mb(); ++#ifdef HAVE_TX_MQ + if (__netif_subqueue_stopped(netdev, tx_ring->queue_index) && + !(test_bit(__IGB_DOWN, &adapter->state))) { + netif_wake_subqueue(netdev, tx_ring->queue_index); + ++adapter->restart_queue; + } ++#endif ++ if (netif_queue_stopped(netdev) && ++ !(test_bit(__IGB_DOWN, &adapter->state))) { ++ netif_wake_queue(netdev); ++ ++adapter->restart_queue; ++ } + } + + if (tx_ring->detect_tx_hung) { + /* Detect a transmit hang in hardware, this serializes the + * check with the clearing of time_stamp and movement of i */ +- tx_ring->detect_tx_hung = false; ++ tx_ring->detect_tx_hung = FALSE; + if (tx_ring->buffer_info[i].time_stamp && + time_after(jiffies, tx_ring->buffer_info[i].time_stamp + +- (adapter->tx_timeout_factor * HZ)) +- && !(rd32(E1000_STATUS) & +- E1000_STATUS_TXOFF)) { +- +- tx_desc = E1000_TX_DESC(*tx_ring, i); ++ (adapter->tx_timeout_factor * HZ)) ++ && !(E1000_READ_REG(hw, E1000_STATUS) & ++ E1000_STATUS_TXOFF)) { ++ + /* detected Tx unit hang */ +- dev_err(&adapter->pdev->dev, +- "Detected Tx Unit Hang\n" +- " Tx Queue <%d>\n" +- " TDH <%x>\n" +- " TDT <%x>\n" +- " next_to_use <%x>\n" +- " next_to_clean <%x>\n" +- " head (WB) <%x>\n" +- "buffer_info[next_to_clean]\n" +- " time_stamp <%lx>\n" +- " jiffies <%lx>\n" +- " desc.status <%x>\n", ++ DPRINTK(DRV, ERR, "Detected Tx Unit Hang\n" ++ " Tx Queue <%d>\n" ++ " TDH <%x>\n" ++ " TDT <%x>\n" ++ " next_to_use <%x>\n" ++ " next_to_clean <%x>\n" ++ "buffer_info[next_to_clean]\n" ++ " time_stamp <%lx>\n" ++ " next_to_watch <%x>\n" ++ " jiffies <%lx>\n" ++ " desc.status <%x>\n", + tx_ring->queue_index, +- readl(adapter->hw.hw_addr + tx_ring->head), +- readl(adapter->hw.hw_addr + tx_ring->tail), ++ readl(hw->hw_addr + tx_ring->head), ++ readl(hw->hw_addr + tx_ring->tail), + tx_ring->next_to_use, + tx_ring->next_to_clean, +- head, +- tx_ring->buffer_info[i].time_stamp, ++ tx_ring->buffer_info[eop].time_stamp, ++ eop, + jiffies, +- tx_desc->upper.fields.status); +- netif_stop_subqueue(netdev, tx_ring->queue_index); ++ eop_desc->wb.status); ++ if (netif_is_multiqueue(netdev)) ++ netif_stop_subqueue(netdev, ++ tx_ring->queue_index); ++ else ++ netif_stop_queue(netdev); + } + } + tx_ring->total_bytes += total_bytes; +@@ -3724,10 +4002,10 @@ + tx_ring->tx_stats.packets += total_packets; + adapter->net_stats.tx_bytes += total_bytes; + adapter->net_stats.tx_packets += total_packets; +- return retval; +-} +- +-#ifdef CONFIG_IGB_LRO ++ return (count < tx_ring->count); ++} ++ ++#ifdef IGB_LRO + /** + * igb_get_skb_hdr - helper function for LRO header processing + * @skb: pointer to sk_buff to be added to LRO packet +@@ -3740,7 +4018,7 @@ + u64 *hdr_flags, void *priv) + { + union e1000_adv_rx_desc *rx_desc = priv; +- u16 pkt_type = rx_desc->wb.lower.lo_dword.pkt_info & ++ u16 pkt_type = rx_desc->wb.lower.lo_dword.hs_rss.pkt_info & + (E1000_RXDADV_PKTTYPE_IPV4 | E1000_RXDADV_PKTTYPE_TCP); + + /* Verify that this is a valid IPv4 TCP packet */ +@@ -3758,13 +4036,13 @@ + return 0; + + } +-#endif /* CONFIG_IGB_LRO */ ++#endif /* IGB_LRO */ + + /** + * igb_receive_skb - helper function to handle rx indications + * @ring: pointer to receive ring receving this packet + * @status: descriptor status field as written by hardware +- * @vlan: descriptor vlan field as written by hardware (no le/be conversion) ++ * @rx_desc: receive descriptor containing vlan and type information. + * @skb: pointer to sk_buff to be indicated to stack + **/ + static void igb_receive_skb(struct igb_ring *ring, u8 status, +@@ -3774,33 +4052,33 @@ + struct igb_adapter * adapter = ring->adapter; + bool vlan_extracted = (adapter->vlgrp && (status & E1000_RXD_STAT_VP)); + +-#ifdef CONFIG_IGB_LRO ++#ifdef IGB_LRO + if (adapter->netdev->features & NETIF_F_LRO && + skb->ip_summed == CHECKSUM_UNNECESSARY) { + if (vlan_extracted) + lro_vlan_hwaccel_receive_skb(&ring->lro_mgr, skb, +- adapter->vlgrp, +- le16_to_cpu(rx_desc->wb.upper.vlan), +- rx_desc); ++ adapter->vlgrp, ++ le16_to_cpu(rx_desc->wb.upper.vlan), ++ rx_desc); + else + lro_receive_skb(&ring->lro_mgr,skb, rx_desc); +- ring->lro_used = 1; ++ ring->lro_used = TRUE; + } else { + #endif + if (vlan_extracted) +- vlan_hwaccel_receive_skb(skb, adapter->vlgrp, +- le16_to_cpu(rx_desc->wb.upper.vlan)); +- else +- +- netif_receive_skb(skb); +-#ifdef CONFIG_IGB_LRO +- } +-#endif +-} +- ++ vlan_gro_receive(&ring->napi, adapter->vlgrp, ++ le16_to_cpu(rx_desc->wb.upper.vlan), ++ skb); ++ else ++ ++ napi_gro_receive(&ring->napi, skb); ++#ifdef IGB_LRO ++ } ++#endif ++} + + static inline void igb_rx_checksum_adv(struct igb_adapter *adapter, +- u32 status_err, struct sk_buff *skb) ++ u32 status_err, struct sk_buff *skb) + { + skb->ip_summed = CHECKSUM_NONE; + +@@ -3822,7 +4100,7 @@ + } + + static bool igb_clean_rx_irq_adv(struct igb_ring *rx_ring, +- int *work_done, int budget) ++ int *work_done, int budget) + { + struct igb_adapter *adapter = rx_ring->adapter; + struct net_device *netdev = adapter->netdev; +@@ -3830,13 +4108,18 @@ + union e1000_adv_rx_desc *rx_desc , *next_rxd; + struct igb_buffer *buffer_info , *next_buffer; + struct sk_buff *skb; +- unsigned int i; +- u32 length, hlen, staterr; +- bool cleaned = false; ++ bool cleaned = FALSE; + int cleaned_count = 0; + unsigned int total_bytes = 0, total_packets = 0; ++ unsigned int i; ++#ifndef CONFIG_IGB_DISABLE_PACKET_SPLIT ++ u32 length, hlen, staterr; ++#else ++ u32 length, staterr; ++#endif + + i = rx_ring->next_to_clean; ++ buffer_info = &rx_ring->buffer_info[i]; + rx_desc = E1000_RX_DESC_ADV(*rx_ring, i); + staterr = le32_to_cpu(rx_desc->wb.upper.status_error); + +@@ -3844,25 +4127,32 @@ + if (*work_done >= budget) + break; + (*work_done)++; +- buffer_info = &rx_ring->buffer_info[i]; +- +- /* HW will not DMA in data larger than the given buffer, even +- * if it parses the (NFS, of course) header to be larger. In +- * that case, it fills the header buffer and spills the rest +- * into the page. +- */ +- hlen = (le16_to_cpu(rx_desc->wb.lower.lo_dword.hdr_info) & +- E1000_RXDADV_HDRBUFLEN_MASK) >> E1000_RXDADV_HDRBUFLEN_SHIFT; +- if (hlen > adapter->rx_ps_hdr_size) +- hlen = adapter->rx_ps_hdr_size; +- +- length = le16_to_cpu(rx_desc->wb.upper.length); +- cleaned = true; +- cleaned_count++; ++ ++ if (staterr & E1000_RXD_STAT_DYNINT) ++ adapter->lli_int++; + + skb = buffer_info->skb; + prefetch(skb->data - NET_IP_ALIGN); + buffer_info->skb = NULL; ++ ++ i++; ++ if (i == rx_ring->count) ++ i = 0; ++ next_rxd = E1000_RX_DESC_ADV(*rx_ring, i); ++ prefetch(next_rxd); ++ next_buffer = &rx_ring->buffer_info[i]; ++ ++ length = le16_to_cpu(rx_desc->wb.upper.length); ++ cleaned = TRUE; ++ cleaned_count++; ++ ++#ifdef CONFIG_IGB_DISABLE_PACKET_SPLIT ++ pci_unmap_single(pdev, buffer_info->dma, ++ adapter->rx_buffer_len + ++ NET_IP_ALIGN, ++ PCI_DMA_FROMDEVICE); ++ skb_put(skb, length); ++#else + if (!adapter->rx_ps_hdr_size) { + pci_unmap_single(pdev, buffer_info->dma, + adapter->rx_buffer_len + +@@ -3872,44 +4162,54 @@ + goto send_up; + } + ++ /* HW will not DMA in data larger than the given buffer, even ++ * if it parses the (NFS, of course) header to be larger. In ++ * that case, it fills the header buffer and spills the rest ++ * into the page. ++ */ ++ hlen = (le16_to_cpu(rx_desc->wb.lower.lo_dword.hs_rss.hdr_info) & ++ E1000_RXDADV_HDRBUFLEN_MASK) >> E1000_RXDADV_HDRBUFLEN_SHIFT; ++ if (hlen > adapter->rx_ps_hdr_size) ++ hlen = adapter->rx_ps_hdr_size; ++ + if (!skb_shinfo(skb)->nr_frags) { + pci_unmap_single(pdev, buffer_info->dma, +- adapter->rx_ps_hdr_size + +- NET_IP_ALIGN, ++ adapter->rx_ps_hdr_size + NET_IP_ALIGN, + PCI_DMA_FROMDEVICE); + skb_put(skb, hlen); + } + + if (length) { + pci_unmap_page(pdev, buffer_info->page_dma, +- PAGE_SIZE / 2, PCI_DMA_FROMDEVICE); ++ PAGE_SIZE / 2, PCI_DMA_FROMDEVICE); + buffer_info->page_dma = 0; + +- skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags++, +- buffer_info->page, +- buffer_info->page_offset, +- length); ++ skb_fill_page_desc(skb, skb_shinfo(skb)->nr_frags++, ++ buffer_info->page, ++ buffer_info->page_offset, ++ length); + + if ((adapter->rx_buffer_len > (PAGE_SIZE / 2)) || + (page_count(buffer_info->page) != 1)) + buffer_info->page = NULL; + else + get_page(buffer_info->page); ++ ++ skb->len += length; ++ skb->data_len += length; ++ ++ skb->truesize += length; ++ } ++ ++ if (!(staterr & E1000_RXD_STAT_EOP)) { ++ buffer_info->skb = next_buffer->skb; ++ buffer_info->dma = next_buffer->dma; ++ next_buffer->skb = skb; ++ next_buffer->dma = 0; ++ goto next_desc; + } + send_up: +- i++; +- if (i == rx_ring->count) +- i = 0; +- next_rxd = E1000_RX_DESC_ADV(*rx_ring, i); +- prefetch(next_rxd); +- next_buffer = &rx_ring->buffer_info[i]; +- +- if (!(staterr & E1000_RXD_STAT_EOP)) { +- buffer_info->skb = xchg(&next_buffer->skb, skb); +- buffer_info->dma = xchg(&next_buffer->dma, 0); +- goto next_desc; +- } +- ++#endif /* CONFIG_IGB_DISABLE_PACKET_SPLIT */ + if (staterr & E1000_RXDEXT_ERR_FRAME_ERR_MASK) { + dev_kfree_skb_irq(skb); + goto next_desc; +@@ -3938,17 +4238,16 @@ + /* use prefetched values */ + rx_desc = next_rxd; + buffer_info = next_buffer; +- + staterr = le32_to_cpu(rx_desc->wb.upper.status_error); + } + + rx_ring->next_to_clean = i; + cleaned_count = IGB_DESC_UNUSED(rx_ring); + +-#ifdef CONFIG_IGB_LRO ++#ifdef IGB_LRO + if (rx_ring->lro_used) { + lro_flush_all(&rx_ring->lro_mgr); +- rx_ring->lro_used = 0; ++ rx_ring->lro_used = FALSE; + } + #endif + +@@ -3964,13 +4263,12 @@ + return cleaned; + } + +- + /** + * igb_alloc_rx_buffers_adv - Replace used receive buffers; packet split + * @adapter: address of board private structure + **/ + static void igb_alloc_rx_buffers_adv(struct igb_ring *rx_ring, +- int cleaned_count) ++ int cleaned_count) + { + struct igb_adapter *adapter = rx_ring->adapter; + struct net_device *netdev = adapter->netdev; +@@ -3979,16 +4277,28 @@ + struct igb_buffer *buffer_info; + struct sk_buff *skb; + unsigned int i; ++ int bufsz; + + i = rx_ring->next_to_use; + buffer_info = &rx_ring->buffer_info[i]; + ++#ifndef CONFIG_IGB_DISABLE_PACKET_SPLIT ++ if (adapter->rx_ps_hdr_size) ++ bufsz = adapter->rx_ps_hdr_size; ++ else ++ bufsz = adapter->rx_buffer_len; ++ bufsz += NET_IP_ALIGN; ++#else ++ bufsz = adapter->rx_buffer_len + NET_IP_ALIGN; ++#endif /* CONFIG_IGB_DISABLE_PACKET_SPLIT */ ++ + while (cleaned_count--) { + rx_desc = E1000_RX_DESC_ADV(*rx_ring, i); + ++#ifndef CONFIG_IGB_DISABLE_PACKET_SPLIT + if (adapter->rx_ps_hdr_size && !buffer_info->page_dma) { + if (!buffer_info->page) { +- buffer_info->page = netdev_alloc_page(netdev); ++ buffer_info->page = alloc_page(GFP_ATOMIC); + if (!buffer_info->page) { + adapter->alloc_rx_buff_failed++; + goto no_buffers; +@@ -3998,23 +4308,15 @@ + buffer_info->page_offset ^= PAGE_SIZE / 2; + } + buffer_info->page_dma = +- pci_map_page(pdev, +- buffer_info->page, +- buffer_info->page_offset, +- PAGE_SIZE / 2, +- PCI_DMA_FROMDEVICE); +- } ++ pci_map_page(pdev, buffer_info->page, ++ buffer_info->page_offset, ++ PAGE_SIZE / 2, ++ PCI_DMA_FROMDEVICE); ++ } ++#endif /* CONFIG_IGB_DISABLE_PACKET_SPLIT */ + + if (!buffer_info->skb) { +- int bufsz; +- +- if (adapter->rx_ps_hdr_size) +- bufsz = adapter->rx_ps_hdr_size; +- else +- bufsz = adapter->rx_buffer_len; +- bufsz += NET_IP_ALIGN; + skb = netdev_alloc_skb(netdev, bufsz); +- + if (!skb) { + adapter->alloc_rx_buff_failed++; + goto no_buffers; +@@ -4028,17 +4330,20 @@ + + buffer_info->skb = skb; + buffer_info->dma = pci_map_single(pdev, skb->data, +- bufsz, +- PCI_DMA_FROMDEVICE); +- ++ bufsz, ++ PCI_DMA_FROMDEVICE); + } + /* Refresh the desc even if buffer_addrs didn't change because + * each write-back erases this info. */ ++#ifndef CONFIG_IGB_DISABLE_PACKET_SPLIT + if (adapter->rx_ps_hdr_size) { + rx_desc->read.pkt_addr = + cpu_to_le64(buffer_info->page_dma); + rx_desc->read.hdr_addr = cpu_to_le64(buffer_info->dma); + } else { ++#else ++ { ++#endif /* CONFIG_IGB_DISABLE_PACKET_SPLIT */ + rx_desc->read.pkt_addr = + cpu_to_le64(buffer_info->dma); + rx_desc->read.hdr_addr = 0; +@@ -4067,6 +4372,7 @@ + } + } + ++#ifdef SIOCGMIIPHY + /** + * igb_mii_ioctl - + * @netdev: +@@ -4088,18 +4394,18 @@ + case SIOCGMIIREG: + if (!capable(CAP_NET_ADMIN)) + return -EPERM; +- if (adapter->hw.phy.ops.read_phy_reg(&adapter->hw, +- data->reg_num +- & 0x1F, &data->val_out)) ++ if (e1000_read_phy_reg(&adapter->hw, data->reg_num & 0x1F, ++ &data->val_out)) + return -EIO; + break; + case SIOCSMIIREG: + default: + return -EOPNOTSUPP; + } +- return 0; +-} +- ++ return E1000_SUCCESS; ++} ++ ++#endif + /** + * igb_ioctl - + * @netdev: +@@ -4109,17 +4415,37 @@ + static int igb_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd) + { + switch (cmd) { ++#ifdef SIOCGMIIPHY + case SIOCGMIIPHY: + case SIOCGMIIREG: + case SIOCSMIIREG: + return igb_mii_ioctl(netdev, ifr, cmd); ++#endif ++#ifdef ETHTOOL_OPS_COMPAT ++ case SIOCETHTOOL: ++ return ethtool_ioctl(ifr); ++#endif + default: + return -EOPNOTSUPP; + } + } + ++s32 e1000_read_pcie_cap_reg(struct e1000_hw *hw, u32 reg, u16 *value) ++{ ++ struct igb_adapter *adapter = hw->back; ++ u16 cap_offset; ++ ++ cap_offset = pci_find_capability(adapter->pdev, PCI_CAP_ID_EXP); ++ if (!cap_offset) ++ return -E1000_ERR_CONFIG; ++ ++ pci_read_config_word(adapter->pdev, cap_offset + reg, value); ++ ++ return E1000_SUCCESS; ++} ++ + static void igb_vlan_rx_register(struct net_device *netdev, +- struct vlan_group *grp) ++ struct vlan_group *grp) + { + struct igb_adapter *adapter = netdev_priv(netdev); + struct e1000_hw *hw = &adapter->hw; +@@ -4130,30 +4456,28 @@ + + if (grp) { + /* enable VLAN tag insert/strip */ +- ctrl = rd32(E1000_CTRL); ++ ctrl = E1000_READ_REG(hw, E1000_CTRL); + ctrl |= E1000_CTRL_VME; +- wr32(E1000_CTRL, ctrl); +- +- /* enable VLAN receive filtering */ +- rctl = rd32(E1000_RCTL); ++ E1000_WRITE_REG(hw, E1000_CTRL, ctrl); ++ ++ /* Disable CFI check */ ++ rctl = E1000_READ_REG(hw, E1000_RCTL); + rctl &= ~E1000_RCTL_CFIEN; +- wr32(E1000_RCTL, rctl); ++ E1000_WRITE_REG(hw, E1000_RCTL, rctl); + igb_update_mng_vlan(adapter); +- wr32(E1000_RLPML, +- adapter->max_frame_size + VLAN_TAG_SIZE); + } else { + /* disable VLAN tag insert/strip */ +- ctrl = rd32(E1000_CTRL); ++ ctrl = E1000_READ_REG(hw, E1000_CTRL); + ctrl &= ~E1000_CTRL_VME; +- wr32(E1000_CTRL, ctrl); ++ E1000_WRITE_REG(hw, E1000_CTRL, ctrl); + + if (adapter->mng_vlan_id != (u16)IGB_MNG_VLAN_NONE) { + igb_vlan_rx_kill_vid(netdev, adapter->mng_vlan_id); + adapter->mng_vlan_id = IGB_MNG_VLAN_NONE; + } +- wr32(E1000_RLPML, +- adapter->max_frame_size); +- } ++ } ++ ++ igb_set_rlpml(adapter); + + if (!test_bit(__IGB_DOWN, &adapter->state)) + igb_irq_enable(adapter); +@@ -4164,16 +4488,27 @@ + struct igb_adapter *adapter = netdev_priv(netdev); + struct e1000_hw *hw = &adapter->hw; + u32 vfta, index; +- +- if ((adapter->hw.mng_cookie.status & ++#ifndef HAVE_NETDEV_VLAN_FEATURES ++ struct net_device *v_netdev; ++#endif ++ ++ if ((hw->mng_cookie.status & + E1000_MNG_DHCP_COOKIE_STATUS_VLAN) && + (vid == adapter->mng_vlan_id)) + return; + /* add VID to filter table */ + index = (vid >> 5) & 0x7F; +- vfta = array_rd32(E1000_VFTA, index); ++ vfta = E1000_READ_REG_ARRAY(hw, E1000_VFTA, index); + vfta |= (1 << (vid & 0x1F)); +- igb_write_vfta(&adapter->hw, index, vfta); ++ e1000_write_vfta(hw, index, vfta); ++#ifndef HAVE_NETDEV_VLAN_FEATURES ++ /* Copy feature flags from netdev to the vlan netdev for this vid. ++ * This allows things like TSO to bubble down to our vlan device. ++ */ ++ v_netdev = vlan_group_get_device(adapter->vlgrp, vid); ++ v_netdev->features |= adapter->netdev->features; ++ vlan_group_set_device(adapter->vlgrp, vid, v_netdev); ++#endif + } + + static void igb_vlan_rx_kill_vid(struct net_device *netdev, u16 vid) +@@ -4198,9 +4533,9 @@ + + /* remove VID from filter table */ + index = (vid >> 5) & 0x7F; +- vfta = array_rd32(E1000_VFTA, index); ++ vfta = E1000_READ_REG_ARRAY(hw, E1000_VFTA, index); + vfta &= ~(1 << (vid & 0x1F)); +- igb_write_vfta(&adapter->hw, index, vfta); ++ e1000_write_vfta(hw, index, vfta); + } + + static void igb_restore_vlan(struct igb_adapter *adapter) +@@ -4226,8 +4561,7 @@ + /* Fiber NICs only allow 1000 gbps Full duplex */ + if ((adapter->hw.phy.media_type == e1000_media_type_fiber) && + spddplx != (SPEED_1000 + DUPLEX_FULL)) { +- dev_err(&adapter->pdev->dev, +- "Unsupported Speed/Duplex configuration\n"); ++ DPRINTK(PROBE, ERR, "Unsupported Speed/Duplex configuration\n"); + return -EINVAL; + } + +@@ -4250,14 +4584,32 @@ + break; + case SPEED_1000 + DUPLEX_HALF: /* not supported */ + default: +- dev_err(&adapter->pdev->dev, +- "Unsupported Speed/Duplex configuration\n"); ++ DPRINTK(PROBE, ERR, "Unsupported Speed/Duplex configuration\n"); + return -EINVAL; + } + return 0; + } + +- ++#ifdef USE_REBOOT_NOTIFIER ++/* only want to do this for 2.4 kernels? */ ++static int igb_notify_reboot(struct notifier_block *nb, unsigned long event, ++ void *p) ++{ ++ struct pci_dev *pdev = NULL; ++ ++ switch (event) { ++ case SYS_DOWN: ++ case SYS_HALT: ++ case SYS_POWER_OFF: ++ while ((pdev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, pdev))) { ++ if (pci_dev_driver(pdev) == &igb_driver) ++ igb_suspend(pdev, PMSG_SUSPEND); ++ } ++ } ++ return NOTIFY_DONE; ++} ++ ++#endif + static int igb_suspend(struct pci_dev *pdev, pm_message_t state) + { + struct net_device *netdev = pci_get_drvdata(pdev); +@@ -4284,7 +4636,7 @@ + return retval; + #endif + +- status = rd32(E1000_STATUS); ++ status = E1000_READ_REG(hw, E1000_STATUS); + if (status & E1000_STATUS_LU) + wufc &= ~E1000_WUFC_LNKC; + +@@ -4294,27 +4646,27 @@ + + /* turn on all-multi mode if wake on multicast is enabled */ + if (wufc & E1000_WUFC_MC) { +- rctl = rd32(E1000_RCTL); ++ rctl = E1000_READ_REG(hw, E1000_RCTL); + rctl |= E1000_RCTL_MPE; +- wr32(E1000_RCTL, rctl); +- } +- +- ctrl = rd32(E1000_CTRL); ++ E1000_WRITE_REG(hw, E1000_RCTL, rctl); ++ } ++ ++ ctrl = E1000_READ_REG(hw, E1000_CTRL); + /* advertise wake from D3Cold */ + #define E1000_CTRL_ADVD3WUC 0x00100000 + /* phy power management enable */ + #define E1000_CTRL_EN_PHY_PWR_MGMT 0x00200000 + ctrl |= E1000_CTRL_ADVD3WUC; +- wr32(E1000_CTRL, ctrl); ++ E1000_WRITE_REG(hw, E1000_CTRL, ctrl); + + /* Allow time for pending master requests to run */ +- igb_disable_pcie_master(&adapter->hw); +- +- wr32(E1000_WUC, E1000_WUC_PME_EN); +- wr32(E1000_WUFC, wufc); +- } else { +- wr32(E1000_WUC, 0); +- wr32(E1000_WUFC, 0); ++ e1000_disable_pcie_master(hw); ++ ++ E1000_WRITE_REG(hw, E1000_WUC, E1000_WUC_PME_EN); ++ E1000_WRITE_REG(hw, E1000_WUFC, wufc); ++ } else { ++ E1000_WRITE_REG(hw, E1000_WUC, 0); ++ E1000_WRITE_REG(hw, E1000_WUFC, 0); + } + + /* make sure adapter isn't asleep if manageability/wol is enabled */ +@@ -4322,7 +4674,7 @@ + pci_enable_wake(pdev, PCI_D3hot, 1); + pci_enable_wake(pdev, PCI_D3cold, 1); + } else { +- igb_shutdown_fiber_serdes_link_82575(hw); ++ e1000_shutdown_fiber_serdes_link(hw); + pci_enable_wake(pdev, PCI_D3hot, 0); + pci_enable_wake(pdev, PCI_D3cold, 0); + } +@@ -4348,14 +4700,10 @@ + + pci_set_power_state(pdev, PCI_D0); + pci_restore_state(pdev); +- +- if (adapter->need_ioport) +- err = pci_enable_device(pdev); +- else +- err = pci_enable_device_mem(pdev); ++ err = pci_enable_device_mem(pdev); + if (err) { +- dev_err(&pdev->dev, +- "igb: Cannot enable PCI device from suspend\n"); ++ dev_err(&pdev->dev, "igb: Cannot enable PCI device " ++ "from suspend\n"); + return err; + } + pci_set_master(pdev); +@@ -4366,14 +4714,19 @@ + igb_set_interrupt_capability(adapter); + + if (igb_alloc_queues(adapter)) { +- dev_err(&pdev->dev, "Unable to allocate memory for queues\n"); ++ DPRINTK(PROBE, ERR, "Unable to allocate memory for queues\n"); + return -ENOMEM; + } + + /* e1000_power_up_phy(adapter); */ + + igb_reset(adapter); +- wr32(E1000_WUS, ~0); ++ ++ /* let the f/w know that the h/w is now under the control of the ++ * driver. */ ++ igb_get_hw_control(adapter); ++ ++ E1000_WRITE_REG(hw, E1000_WUS, ~0); + + if (netif_running(netdev)) { + err = igb_open(netdev); +@@ -4383,19 +4736,17 @@ + + netif_device_attach(netdev); + +- /* let the f/w know that the h/w is now under the control of the +- * driver. */ +- igb_get_hw_control(adapter); +- +- return 0; +-} +-#endif +- ++ return 0; ++} ++#endif ++ ++#ifndef USE_REBOOT_NOTIFIER + static void igb_shutdown(struct pci_dev *pdev) + { + igb_suspend(pdev, PMSG_SUSPEND); + } + ++#endif + #ifdef CONFIG_NET_POLL_CONTROLLER + /* + * Polling 'interrupt' - used by things like netconsole to send skbs +@@ -4405,25 +4756,33 @@ + static void igb_netpoll(struct net_device *netdev) + { + struct igb_adapter *adapter = netdev_priv(netdev); +- int i; +- int work_done = 0; +- +- igb_irq_disable(adapter); +- adapter->flags |= IGB_FLAG_IN_NETPOLL; +- +- for (i = 0; i < adapter->num_tx_queues; i++) +- igb_clean_tx_irq(&adapter->tx_ring[i]); +- +- for (i = 0; i < adapter->num_rx_queues; i++) +- igb_clean_rx_irq_adv(&adapter->rx_ring[i], +- &work_done, +- adapter->rx_ring[i].napi.weight); +- +- adapter->flags &= ~IGB_FLAG_IN_NETPOLL; +- igb_irq_enable(adapter); ++ struct e1000_hw *hw = &adapter->hw; ++ int i; ++ ++ if (!adapter->msix_entries) { ++ igb_irq_disable(adapter); ++ napi_schedule(&adapter->rx_ring[0].napi); ++ return; ++ } ++ ++#ifdef CONFIG_IGB_SEPARATE_TX_HANDLER ++ for (i = 0; i < adapter->num_tx_queues; i++) { ++ struct igb_ring *tx_ring = &adapter->tx_ring[i]; ++ E1000_WRITE_REG(hw, E1000_EIMC, tx_ring->eims_value); ++ igb_clean_tx_irq(tx_ring); ++ E1000_WRITE_REG(hw, E1000_EIMS, tx_ring->eims_value); ++ } ++ ++#endif ++ for (i = 0; i < adapter->num_rx_queues; i++) { ++ struct igb_ring *rx_ring = &adapter->rx_ring[i]; ++ E1000_WRITE_REG(hw, E1000_EIMC, rx_ring->eims_value); ++ napi_schedule(&rx_ring->napi); ++ } + } + #endif /* CONFIG_NET_POLL_CONTROLLER */ + ++#ifdef HAVE_PCI_ERS + /** + * igb_io_error_detected - called when PCI error is detected + * @pdev: Pointer to PCI device +@@ -4433,7 +4792,7 @@ + * this device has been detected. + */ + static pci_ers_result_t igb_io_error_detected(struct pci_dev *pdev, +- pci_channel_state_t state) ++ pci_channel_state_t state) + { + struct net_device *netdev = pci_get_drvdata(pdev); + struct igb_adapter *adapter = netdev_priv(netdev); +@@ -4460,27 +4819,27 @@ + struct net_device *netdev = pci_get_drvdata(pdev); + struct igb_adapter *adapter = netdev_priv(netdev); + struct e1000_hw *hw = &adapter->hw; +- int err; +- +- if (adapter->need_ioport) +- err = pci_enable_device(pdev); +- else +- err = pci_enable_device_mem(pdev); +- if (err) { ++ pci_ers_result_t result; ++ ++ if (pci_enable_device_mem(pdev)) { + dev_err(&pdev->dev, + "Cannot re-enable PCI device after reset.\n"); +- return PCI_ERS_RESULT_DISCONNECT; +- } +- pci_set_master(pdev); +- pci_restore_state(pdev); +- +- pci_enable_wake(pdev, PCI_D3hot, 0); +- pci_enable_wake(pdev, PCI_D3cold, 0); +- +- igb_reset(adapter); +- wr32(E1000_WUS, ~0); +- +- return PCI_ERS_RESULT_RECOVERED; ++ result = PCI_ERS_RESULT_DISCONNECT; ++ } else { ++ pci_set_master(pdev); ++ pci_restore_state(pdev); ++ ++ pci_enable_wake(pdev, PCI_D3hot, 0); ++ pci_enable_wake(pdev, PCI_D3cold, 0); ++ ++ igb_reset(adapter); ++ E1000_WRITE_REG(hw, E1000_WUS, ~0); ++ result = PCI_ERS_RESULT_RECOVERED; ++ } ++ ++ pci_cleanup_aer_uncorrect_error_status(pdev); ++ ++ return result; + } + + /** +@@ -4508,7 +4867,7 @@ + /* let the f/w know that the h/w is now under the control of the + * driver. */ + igb_get_hw_control(adapter); +- +-} +- ++} ++ ++#endif /* HAVE_PCI_ERS */ + /* igb_main.c */ +diff -r f5806398a14e drivers/net/igb/igb_param.c +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/igb/igb_param.c Mon Jun 15 11:59:50 2009 +0100 +@@ -0,0 +1,408 @@ ++/******************************************************************************* ++ ++ Intel(R) Gigabit Ethernet Linux driver ++ Copyright(c) 2007-2009 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++ ++#include ++ ++#include "igb.h" ++ ++/* This is the only thing that needs to be changed to adjust the ++ * maximum number of ports that the driver can manage. ++ */ ++ ++#define IGB_MAX_NIC 32 ++ ++#define OPTION_UNSET -1 ++#define OPTION_DISABLED 0 ++#define OPTION_ENABLED 1 ++ ++/* All parameters are treated the same, as an integer array of values. ++ * This macro just reduces the need to repeat the same declaration code ++ * over and over (plus this helps to avoid typo bugs). ++ */ ++ ++#define IGB_PARAM_INIT { [0 ... IGB_MAX_NIC] = OPTION_UNSET } ++#ifndef module_param_array ++/* Module Parameters are always initialized to -1, so that the driver ++ * can tell the difference between no user specified value or the ++ * user asking for the default value. ++ * The true default values are loaded in when igb_check_options is called. ++ * ++ * This is a GCC extension to ANSI C. ++ * See the item "Labeled Elements in Initializers" in the section ++ * "Extensions to the C Language Family" of the GCC documentation. ++ */ ++ ++#define IGB_PARAM(X, desc) \ ++ static const int __devinitdata X[IGB_MAX_NIC+1] = IGB_PARAM_INIT; \ ++ MODULE_PARM(X, "1-" __MODULE_STRING(IGB_MAX_NIC) "i"); \ ++ MODULE_PARM_DESC(X, desc); ++#else ++#define IGB_PARAM(X, desc) \ ++ static int __devinitdata X[IGB_MAX_NIC+1] = IGB_PARAM_INIT; \ ++ static unsigned int num_##X = 0; \ ++ module_param_array_named(X, X, int, &num_##X, 0); \ ++ MODULE_PARM_DESC(X, desc); ++#endif ++ ++/* Interrupt Throttle Rate (interrupts/sec) ++ * ++ * Valid Range: 100-100000 (0=off, 1=dynamic, 3=dynamic conservative) ++ */ ++IGB_PARAM(InterruptThrottleRate, "Interrupt Throttling Rate"); ++#define DEFAULT_ITR 3 ++#define MAX_ITR 100000 ++#define MIN_ITR 120 ++/* IntMode (Interrupt Mode) ++ * ++ * Valid Range: 0 - 3 ++ * ++ * Default Value: 2 (MSI-X single queue) ++ */ ++IGB_PARAM(IntMode, "Interrupt Mode"); ++#define MAX_INTMODE 3 ++#define MIN_INTMODE 0 ++ ++/* LLIPort (Low Latency Interrupt TCP Port) ++ * ++ * Valid Range: 0 - 65535 ++ * ++ * Default Value: 0 (disabled) ++ */ ++IGB_PARAM(LLIPort, "Low Latency Interrupt TCP Port"); ++ ++#define DEFAULT_LLIPORT 0 ++#define MAX_LLIPORT 0xFFFF ++#define MIN_LLIPORT 0 ++ ++/* LLIPush (Low Latency Interrupt on TCP Push flag) ++ * ++ * Valid Range: 0, 1 ++ * ++ * Default Value: 0 (disabled) ++ */ ++IGB_PARAM(LLIPush, "Low Latency Interrupt on TCP Push flag"); ++ ++#define DEFAULT_LLIPUSH 0 ++#define MAX_LLIPUSH 1 ++#define MIN_LLIPUSH 0 ++ ++/* LLISize (Low Latency Interrupt on Packet Size) ++ * ++ * Valid Range: 0 - 1500 ++ * ++ * Default Value: 0 (disabled) ++ */ ++IGB_PARAM(LLISize, "Low Latency Interrupt on Packet Size"); ++ ++#define DEFAULT_LLISIZE 0 ++#define MAX_LLISIZE 1500 ++#define MIN_LLISIZE 0 ++ ++#ifdef IGB_LRO ++/* LROAggr (Large Receive Offload) ++ * ++ * Valid Range: 2 - 44 ++ * ++ * Default Value: 32 ++ */ ++IGB_PARAM(LROAggr, "LRO - Maximum packets to aggregate"); ++ ++#define DEFAULT_LRO_AGGR 32 ++#define MAX_LRO_AGGR 44 ++#define MIN_LRO_AGGR 2 ++#endif ++ ++struct igb_option { ++ enum { enable_option, range_option, list_option } type; ++ const char *name; ++ const char *err; ++ int def; ++ union { ++ struct { /* range_option info */ ++ int min; ++ int max; ++ } r; ++ struct { /* list_option info */ ++ int nr; ++ struct igb_opt_list { int i; char *str; } *p; ++ } l; ++ } arg; ++}; ++ ++static int __devinit igb_validate_option(unsigned int *value, ++ struct igb_option *opt, ++ struct igb_adapter *adapter) ++{ ++ if (*value == OPTION_UNSET) { ++ *value = opt->def; ++ return 0; ++ } ++ ++ switch (opt->type) { ++ case enable_option: ++ switch (*value) { ++ case OPTION_ENABLED: ++ DPRINTK(PROBE, INFO, "%s Enabled\n", opt->name); ++ return 0; ++ case OPTION_DISABLED: ++ DPRINTK(PROBE, INFO, "%s Disabled\n", opt->name); ++ return 0; ++ } ++ break; ++ case range_option: ++ if (*value >= opt->arg.r.min && *value <= opt->arg.r.max) { ++ DPRINTK(PROBE, INFO, ++ "%s set to %d\n", opt->name, *value); ++ return 0; ++ } ++ break; ++ case list_option: { ++ int i; ++ struct igb_opt_list *ent; ++ ++ for (i = 0; i < opt->arg.l.nr; i++) { ++ ent = &opt->arg.l.p[i]; ++ if (*value == ent->i) { ++ if (ent->str[0] != '\0') ++ DPRINTK(PROBE, INFO, "%s\n", ent->str); ++ return 0; ++ } ++ } ++ } ++ break; ++ default: ++ BUG(); ++ } ++ ++ DPRINTK(PROBE, INFO, "Invalid %s value specified (%d) %s\n", ++ opt->name, *value, opt->err); ++ *value = opt->def; ++ return -1; ++} ++ ++/** ++ * igb_check_options - Range Checking for Command Line Parameters ++ * @adapter: board private structure ++ * ++ * This routine checks all command line parameters for valid user ++ * input. If an invalid value is given, or if no user specified ++ * value exists, a default value is used. The final value is stored ++ * in a variable in the adapter structure. ++ **/ ++ ++void __devinit igb_check_options(struct igb_adapter *adapter) ++{ ++ int bd = adapter->bd_number; ++ ++ if (bd >= IGB_MAX_NIC) { ++ DPRINTK(PROBE, NOTICE, ++ "Warning: no configuration for board #%d\n", bd); ++ DPRINTK(PROBE, NOTICE, "Using defaults for all values\n"); ++#ifndef module_param_array ++ bd = IGB_MAX_NIC; ++#endif ++ } ++ ++ { /* Interrupt Throttling Rate */ ++ struct igb_option opt = { ++ .type = range_option, ++ .name = "Interrupt Throttling Rate (ints/sec)", ++ .err = "using default of " __MODULE_STRING(DEFAULT_ITR), ++ .def = DEFAULT_ITR, ++ .arg = { .r = { .min = MIN_ITR, ++ .max = MAX_ITR }} ++ }; ++ ++#ifdef module_param_array ++ if (num_InterruptThrottleRate > bd) { ++#endif ++ adapter->itr = InterruptThrottleRate[bd]; ++ switch (adapter->itr) { ++ case 0: ++ DPRINTK(PROBE, INFO, "%s turned off\n", ++ opt.name); ++ break; ++ case 1: ++ DPRINTK(PROBE, INFO, "%s set to dynamic mode\n", ++ opt.name); ++ adapter->itr_setting = adapter->itr; ++ adapter->itr = IGB_START_ITR; ++ break; ++ case 3: ++ DPRINTK(PROBE, INFO, ++ "%s set to dynamic conservative mode\n", ++ opt.name); ++ adapter->itr_setting = adapter->itr; ++ adapter->itr = IGB_START_ITR; ++ break; ++ default: ++ igb_validate_option(&adapter->itr, &opt, ++ adapter); ++ /* save the setting, because the dynamic bits change itr */ ++ /* in case of invalid user value, default to conservative mode, ++ * else need to clear the lower two bits because they are ++ * used as control */ ++ if (adapter->itr == 3) { ++ adapter->itr_setting = adapter->itr; ++ adapter->itr = IGB_START_ITR; ++ } ++ else { ++ adapter->itr = 1000000000 / (adapter->itr * 256); ++ adapter->itr_setting = adapter->itr & ~3; ++ } ++ break; ++ } ++#ifdef module_param_array ++ } else { ++ adapter->itr_setting = opt.def; ++ adapter->itr = 8000; ++ } ++#endif ++ } ++ { /* Interrupt Mode */ ++ struct igb_option opt = { ++ .type = range_option, ++ .name = "Interrupt Mode", ++ .err = "defaulting to 2 (MSI-X single queue)", ++ .def = IGB_INT_MODE_MSIX_1Q, ++ .arg = { .r = { .min = MIN_INTMODE, ++ .max = MAX_INTMODE }} ++ }; ++ ++#ifdef module_param_array ++ if (num_IntMode > bd) { ++#endif ++ unsigned int int_mode = IntMode[bd]; ++ igb_validate_option(&int_mode, &opt, adapter); ++ adapter->int_mode = int_mode; ++#ifdef module_param_array ++ } else { ++ adapter->int_mode = opt.def; ++ } ++#endif ++ } ++ { /* Low Latency Interrupt TCP Port */ ++ struct igb_option opt = { ++ .type = range_option, ++ .name = "Low Latency Interrupt TCP Port", ++ .err = "using default of " __MODULE_STRING(DEFAULT_LLIPORT), ++ .def = DEFAULT_LLIPORT, ++ .arg = { .r = { .min = MIN_LLIPORT, ++ .max = MAX_LLIPORT }} ++ }; ++ ++#ifdef module_param_array ++ if (num_LLIPort > bd) { ++#endif ++ adapter->lli_port = LLIPort[bd]; ++ if (adapter->lli_port) { ++ igb_validate_option(&adapter->lli_port, &opt, ++ adapter); ++ } else { ++ DPRINTK(PROBE, INFO, "%s turned off\n", ++ opt.name); ++ } ++#ifdef module_param_array ++ } else { ++ adapter->lli_port = opt.def; ++ } ++#endif ++ } ++ { /* Low Latency Interrupt on Packet Size */ ++ struct igb_option opt = { ++ .type = range_option, ++ .name = "Low Latency Interrupt on Packet Size", ++ .err = "using default of " __MODULE_STRING(DEFAULT_LLISIZE), ++ .def = DEFAULT_LLISIZE, ++ .arg = { .r = { .min = MIN_LLISIZE, ++ .max = MAX_LLISIZE }} ++ }; ++ ++#ifdef module_param_array ++ if (num_LLISize > bd) { ++#endif ++ adapter->lli_size = LLISize[bd]; ++ if (adapter->lli_size) { ++ igb_validate_option(&adapter->lli_size, &opt, ++ adapter); ++ } else { ++ DPRINTK(PROBE, INFO, "%s turned off\n", ++ opt.name); ++ } ++#ifdef module_param_array ++ } else { ++ adapter->lli_size = opt.def; ++ } ++#endif ++ } ++ { /* Low Latency Interrupt on TCP Push flag */ ++ struct igb_option opt = { ++ .type = enable_option, ++ .name = "Low Latency Interrupt on TCP Push flag", ++ .err = "defaulting to Disabled", ++ .def = OPTION_DISABLED ++ }; ++ ++#ifdef module_param_array ++ if (num_LLIPush > bd) { ++#endif ++ unsigned int lli_push = LLIPush[bd]; ++ igb_validate_option(&lli_push, &opt, adapter); ++ adapter->flags |= lli_push ? IGB_FLAG_LLI_PUSH : 0; ++#ifdef module_param_array ++ } else { ++ adapter->flags |= opt.def ? IGB_FLAG_LLI_PUSH : 0; ++ } ++#endif ++ } ++#ifdef IGB_LRO ++ { /* Large Receive Offload - Maximum packets to aggregate */ ++ struct igb_option opt = { ++ .type = range_option, ++ .name = "LRO - Maximum packets to aggregate", ++ .err = "using default of " __MODULE_STRING(DEFAULT_LRO_AGGR), ++ .def = DEFAULT_LRO_AGGR, ++ .arg = { .r = { .min = MIN_LRO_AGGR, ++ .max = MAX_LRO_AGGR }} ++ }; ++ ++#ifdef module_param_array ++ if (num_LROAggr > bd) { ++#endif ++ adapter->lro_max_aggr = LROAggr[bd]; ++ igb_validate_option(&adapter->lro_max_aggr, &opt, adapter); ++ ++#ifdef module_param_array ++ } else { ++ adapter->lro_max_aggr = opt.def; ++ } ++#endif ++ } ++#endif /* IGB_LRO */ ++} ++ +diff -r f5806398a14e drivers/net/igb/igb_regtest.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/igb/igb_regtest.h Mon Jun 15 11:59:50 2009 +0100 +@@ -0,0 +1,135 @@ ++/******************************************************************************* ++ ++ Intel(R) Gigabit Ethernet Linux driver ++ Copyright(c) 2007-2009 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++/* ethtool register test data */ ++struct igb_reg_test { ++ u16 reg; ++ u16 reg_offset; ++ u16 array_len; ++ u16 test_type; ++ u32 mask; ++ u32 write; ++}; ++ ++/* In the hardware, registers are laid out either singly, in arrays ++ * spaced 0x100 bytes apart, or in contiguous tables. We assume ++ * most tests take place on arrays or single registers (handled ++ * as a single-element array) and special-case the tables. ++ * Table tests are always pattern tests. ++ * ++ * We also make provision for some required setup steps by specifying ++ * registers to be written without any read-back testing. ++ */ ++ ++#define PATTERN_TEST 1 ++#define SET_READ_TEST 2 ++#define WRITE_NO_TEST 3 ++#define TABLE32_TEST 4 ++#define TABLE64_TEST_LO 5 ++#define TABLE64_TEST_HI 6 ++ ++/* 82576 reg test */ ++static struct igb_reg_test reg_test_82576[] = { ++ { E1000_FCAL, 0x100, 1, PATTERN_TEST, 0xFFFFFFFF, 0xFFFFFFFF }, ++ { E1000_FCAH, 0x100, 1, PATTERN_TEST, 0x0000FFFF, 0xFFFFFFFF }, ++ { E1000_FCT, 0x100, 1, PATTERN_TEST, 0x0000FFFF, 0xFFFFFFFF }, ++ { E1000_VET, 0x100, 1, PATTERN_TEST, 0xFFFFFFFF, 0xFFFFFFFF }, ++ { E1000_RDBAL(0), 0x100, 4, PATTERN_TEST, 0xFFFFFF80, 0xFFFFFFFF }, ++ { E1000_RDBAH(0), 0x100, 4, PATTERN_TEST, 0xFFFFFFFF, 0xFFFFFFFF }, ++ { E1000_RDLEN(0), 0x100, 4, PATTERN_TEST, 0x000FFFF0, 0x000FFFFF }, ++ { E1000_RDBAL(4), 0x40, 12, PATTERN_TEST, 0xFFFFFF80, 0xFFFFFFFF }, ++ { E1000_RDBAH(4), 0x40, 12, PATTERN_TEST, 0xFFFFFFFF, 0xFFFFFFFF }, ++ { E1000_RDLEN(4), 0x40, 12, PATTERN_TEST, 0x000FFFF0, 0x000FFFFF }, ++ /* Enable all queues before testing. */ ++ { E1000_RXDCTL(0), 0x100, 4, WRITE_NO_TEST, 0, E1000_RXDCTL_QUEUE_ENABLE }, ++ { E1000_RXDCTL(4), 0x40, 12, WRITE_NO_TEST, 0, E1000_RXDCTL_QUEUE_ENABLE }, ++ /* RDH is read-only for 82576, only test RDT. */ ++ { E1000_RDT(0), 0x100, 4, PATTERN_TEST, 0x0000FFFF, 0x0000FFFF }, ++ { E1000_RDT(4), 0x40, 12, PATTERN_TEST, 0x0000FFFF, 0x0000FFFF }, ++ { E1000_RXDCTL(0), 0x100, 4, WRITE_NO_TEST, 0, 0 }, ++ { E1000_RXDCTL(4), 0x40, 12, WRITE_NO_TEST, 0, 0 }, ++ { E1000_FCRTH, 0x100, 1, PATTERN_TEST, 0x0000FFF0, 0x0000FFF0 }, ++ { E1000_FCTTV, 0x100, 1, PATTERN_TEST, 0x0000FFFF, 0x0000FFFF }, ++ { E1000_TIPG, 0x100, 1, PATTERN_TEST, 0x3FFFFFFF, 0x3FFFFFFF }, ++ { E1000_TDBAL(0), 0x100, 4, PATTERN_TEST, 0xFFFFFF80, 0xFFFFFFFF }, ++ { E1000_TDBAH(0), 0x100, 4, PATTERN_TEST, 0xFFFFFFFF, 0xFFFFFFFF }, ++ { E1000_TDLEN(0), 0x100, 4, PATTERN_TEST, 0x000FFFF0, 0x000FFFFF }, ++ { E1000_TDBAL(4), 0x40, 12, PATTERN_TEST, 0xFFFFFF80, 0xFFFFFFFF }, ++ { E1000_TDBAH(4), 0x40, 12, PATTERN_TEST, 0xFFFFFFFF, 0xFFFFFFFF }, ++ { E1000_TDLEN(4), 0x40, 12, PATTERN_TEST, 0x000FFFF0, 0x000FFFFF }, ++ { E1000_RCTL, 0x100, 1, SET_READ_TEST, 0xFFFFFFFF, 0x00000000 }, ++ { E1000_RCTL, 0x100, 1, SET_READ_TEST, 0x04CFB0FE, 0x003FFFFB }, ++ { E1000_RCTL, 0x100, 1, SET_READ_TEST, 0x04CFB0FE, 0xFFFFFFFF }, ++ { E1000_TCTL, 0x100, 1, SET_READ_TEST, 0xFFFFFFFF, 0x00000000 }, ++ { E1000_RA, 0, 16, TABLE64_TEST_LO, ++ 0xFFFFFFFF, 0xFFFFFFFF }, ++ { E1000_RA, 0, 16, TABLE64_TEST_HI, ++ 0x83FFFFFF, 0xFFFFFFFF }, ++ { E1000_RA2, 0, 8, TABLE64_TEST_LO, ++ 0xFFFFFFFF, 0xFFFFFFFF }, ++ { E1000_RA2, 0, 8, TABLE64_TEST_HI, ++ 0x83FFFFFF, 0xFFFFFFFF }, ++ { E1000_MTA, 0, 128,TABLE32_TEST, ++ 0xFFFFFFFF, 0xFFFFFFFF }, ++ { 0, 0, 0, 0 } ++}; ++ ++/* 82575 register test */ ++static struct igb_reg_test reg_test_82575[] = { ++ { E1000_FCAL, 0x100, 1, PATTERN_TEST, 0xFFFFFFFF, 0xFFFFFFFF }, ++ { E1000_FCAH, 0x100, 1, PATTERN_TEST, 0x0000FFFF, 0xFFFFFFFF }, ++ { E1000_FCT, 0x100, 1, PATTERN_TEST, 0x0000FFFF, 0xFFFFFFFF }, ++ { E1000_VET, 0x100, 1, PATTERN_TEST, 0xFFFFFFFF, 0xFFFFFFFF }, ++ { E1000_RDBAL(0), 0x100, 4, PATTERN_TEST, 0xFFFFFF80, 0xFFFFFFFF }, ++ { E1000_RDBAH(0), 0x100, 4, PATTERN_TEST, 0xFFFFFFFF, 0xFFFFFFFF }, ++ { E1000_RDLEN(0), 0x100, 4, PATTERN_TEST, 0x000FFF80, 0x000FFFFF }, ++ /* Enable all four RX queues before testing. */ ++ { E1000_RXDCTL(0), 0x100, 4, WRITE_NO_TEST, 0, E1000_RXDCTL_QUEUE_ENABLE }, ++ /* RDH is read-only for 82575, only test RDT. */ ++ { E1000_RDT(0), 0x100, 4, PATTERN_TEST, 0x0000FFFF, 0x0000FFFF }, ++ { E1000_RXDCTL(0), 0x100, 4, WRITE_NO_TEST, 0, 0 }, ++ { E1000_FCRTH, 0x100, 1, PATTERN_TEST, 0x0000FFF0, 0x0000FFF0 }, ++ { E1000_FCTTV, 0x100, 1, PATTERN_TEST, 0x0000FFFF, 0x0000FFFF }, ++ { E1000_TIPG, 0x100, 1, PATTERN_TEST, 0x3FFFFFFF, 0x3FFFFFFF }, ++ { E1000_TDBAL(0), 0x100, 4, PATTERN_TEST, 0xFFFFFF80, 0xFFFFFFFF }, ++ { E1000_TDBAH(0), 0x100, 4, PATTERN_TEST, 0xFFFFFFFF, 0xFFFFFFFF }, ++ { E1000_TDLEN(0), 0x100, 4, PATTERN_TEST, 0x000FFF80, 0x000FFFFF }, ++ { E1000_RCTL, 0x100, 1, SET_READ_TEST, 0xFFFFFFFF, 0x00000000 }, ++ { E1000_RCTL, 0x100, 1, SET_READ_TEST, 0x04CFB3FE, 0x003FFFFB }, ++ { E1000_RCTL, 0x100, 1, SET_READ_TEST, 0x04CFB3FE, 0xFFFFFFFF }, ++ { E1000_TCTL, 0x100, 1, SET_READ_TEST, 0xFFFFFFFF, 0x00000000 }, ++ { E1000_TXCW, 0x100, 1, PATTERN_TEST, 0xC000FFFF, 0x0000FFFF }, ++ { E1000_RA, 0, 16, TABLE64_TEST_LO, ++ 0xFFFFFFFF, 0xFFFFFFFF }, ++ { E1000_RA, 0, 16, TABLE64_TEST_HI, ++ 0x800FFFFF, 0xFFFFFFFF }, ++ { E1000_MTA, 0, 128, TABLE32_TEST, ++ 0xFFFFFFFF, 0xFFFFFFFF }, ++ { 0, 0, 0, 0 } ++}; ++ ++ +diff -r f5806398a14e drivers/net/igb/kcompat.c +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/igb/kcompat.c Mon Jun 15 11:59:50 2009 +0100 +@@ -0,0 +1,424 @@ ++/******************************************************************************* ++ ++ Intel(R) Gigabit Ethernet Linux driver ++ Copyright(c) 2007-2009 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++#include "igb.h" ++#include "kcompat.h" ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,13) ) ++ ++/**************************************/ ++/* PCI DMA MAPPING */ ++ ++#if defined(CONFIG_HIGHMEM) ++ ++#ifndef PCI_DRAM_OFFSET ++#define PCI_DRAM_OFFSET 0 ++#endif ++ ++u64 ++_kc_pci_map_page(struct pci_dev *dev, struct page *page, unsigned long offset, ++ size_t size, int direction) ++{ ++ return (((u64) (page - mem_map) << PAGE_SHIFT) + offset + ++ PCI_DRAM_OFFSET); ++} ++ ++#else /* CONFIG_HIGHMEM */ ++ ++u64 ++_kc_pci_map_page(struct pci_dev *dev, struct page *page, unsigned long offset, ++ size_t size, int direction) ++{ ++ return pci_map_single(dev, (void *)page_address(page) + offset, size, ++ direction); ++} ++ ++#endif /* CONFIG_HIGHMEM */ ++ ++void ++_kc_pci_unmap_page(struct pci_dev *dev, u64 dma_addr, size_t size, ++ int direction) ++{ ++ return pci_unmap_single(dev, dma_addr, size, direction); ++} ++ ++#endif /* 2.4.13 => 2.4.3 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,3) ) ++ ++/**************************************/ ++/* PCI DRIVER API */ ++ ++int ++_kc_pci_set_dma_mask(struct pci_dev *dev, dma_addr_t mask) ++{ ++ if (!pci_dma_supported(dev, mask)) ++ return -EIO; ++ dev->dma_mask = mask; ++ return 0; ++} ++ ++int ++_kc_pci_request_regions(struct pci_dev *dev, char *res_name) ++{ ++ int i; ++ ++ for (i = 0; i < 6; i++) { ++ if (pci_resource_len(dev, i) == 0) ++ continue; ++ ++ if (pci_resource_flags(dev, i) & IORESOURCE_IO) { ++ if (!request_region(pci_resource_start(dev, i), pci_resource_len(dev, i), res_name)) { ++ pci_release_regions(dev); ++ return -EBUSY; ++ } ++ } else if (pci_resource_flags(dev, i) & IORESOURCE_MEM) { ++ if (!request_mem_region(pci_resource_start(dev, i), pci_resource_len(dev, i), res_name)) { ++ pci_release_regions(dev); ++ return -EBUSY; ++ } ++ } ++ } ++ return 0; ++} ++ ++void ++_kc_pci_release_regions(struct pci_dev *dev) ++{ ++ int i; ++ ++ for (i = 0; i < 6; i++) { ++ if (pci_resource_len(dev, i) == 0) ++ continue; ++ ++ if (pci_resource_flags(dev, i) & IORESOURCE_IO) ++ release_region(pci_resource_start(dev, i), pci_resource_len(dev, i)); ++ ++ else if (pci_resource_flags(dev, i) & IORESOURCE_MEM) ++ release_mem_region(pci_resource_start(dev, i), pci_resource_len(dev, i)); ++ } ++} ++ ++/**************************************/ ++/* NETWORK DRIVER API */ ++ ++struct net_device * ++_kc_alloc_etherdev(int sizeof_priv) ++{ ++ struct net_device *dev; ++ int alloc_size; ++ ++ alloc_size = sizeof(*dev) + sizeof_priv + IFNAMSIZ + 31; ++ dev = kmalloc(alloc_size, GFP_KERNEL); ++ if (!dev) ++ return NULL; ++ memset(dev, 0, alloc_size); ++ ++ if (sizeof_priv) ++ dev->priv = (void *) (((unsigned long)(dev + 1) + 31) & ~31); ++ dev->name[0] = '\0'; ++ ether_setup(dev); ++ ++ return dev; ++} ++ ++int ++_kc_is_valid_ether_addr(u8 *addr) ++{ ++ const char zaddr[6] = { 0, }; ++ ++ return !(addr[0] & 1) && memcmp(addr, zaddr, 6); ++} ++ ++#endif /* 2.4.3 => 2.4.0 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,6) ) ++ ++int ++_kc_pci_set_power_state(struct pci_dev *dev, int state) ++{ ++ return 0; ++} ++ ++int ++_kc_pci_enable_wake(struct pci_dev *pdev, u32 state, int enable) ++{ ++ return 0; ++} ++ ++#endif /* 2.4.6 => 2.4.3 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) ) ++void _kc_skb_fill_page_desc(struct sk_buff *skb, int i, struct page *page, ++ int off, int size) ++{ ++ skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; ++ frag->page = page; ++ frag->page_offset = off; ++ frag->size = size; ++ skb_shinfo(skb)->nr_frags = i + 1; ++} ++ ++/* ++ * Original Copyright: ++ * find_next_bit.c: fallback find next bit implementation ++ * ++ * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. ++ * Written by David Howells (dhowells@redhat.com) ++ */ ++ ++/** ++ * find_next_bit - find the next set bit in a memory region ++ * @addr: The address to base the search on ++ * @offset: The bitnumber to start searching at ++ * @size: The maximum size to search ++ */ ++unsigned long find_next_bit(const unsigned long *addr, unsigned long size, ++ unsigned long offset) ++{ ++ const unsigned long *p = addr + BITOP_WORD(offset); ++ unsigned long result = offset & ~(BITS_PER_LONG-1); ++ unsigned long tmp; ++ ++ if (offset >= size) ++ return size; ++ size -= result; ++ offset %= BITS_PER_LONG; ++ if (offset) { ++ tmp = *(p++); ++ tmp &= (~0UL << offset); ++ if (size < BITS_PER_LONG) ++ goto found_first; ++ if (tmp) ++ goto found_middle; ++ size -= BITS_PER_LONG; ++ result += BITS_PER_LONG; ++ } ++ while (size & ~(BITS_PER_LONG-1)) { ++ if ((tmp = *(p++))) ++ goto found_middle; ++ result += BITS_PER_LONG; ++ size -= BITS_PER_LONG; ++ } ++ if (!size) ++ return result; ++ tmp = *p; ++ ++found_first: ++ tmp &= (~0UL >> (BITS_PER_LONG - size)); ++ if (tmp == 0UL) /* Are any bits set? */ ++ return result + size; /* Nope. */ ++found_middle: ++ return result + ffs(tmp); ++} ++ ++#endif /* 2.6.0 => 2.4.6 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,14) ) ++void *_kc_kzalloc(size_t size, int flags) ++{ ++ void *ret = kmalloc(size, flags); ++ if (ret) ++ memset(ret, 0, size); ++ return ret; ++} ++#endif /* <= 2.6.13 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18) ) ++struct sk_buff *_kc_netdev_alloc_skb(struct net_device *dev, ++ unsigned int length) ++{ ++ /* 16 == NET_PAD_SKB */ ++ struct sk_buff *skb; ++ skb = alloc_skb(length + 16, GFP_ATOMIC); ++ if (likely(skb != NULL)) { ++ skb_reserve(skb, 16); ++ skb->dev = dev; ++ } ++ return skb; ++} ++#endif /* <= 2.6.17 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) ) ++int _kc_pci_save_state(struct pci_dev *pdev) ++{ ++ struct net_device *netdev = pci_get_drvdata(pdev); ++ struct adapter_struct *adapter = netdev_priv(netdev); ++ int size = PCI_CONFIG_SPACE_LEN, i; ++ u16 pcie_cap_offset = pci_find_capability(pdev, PCI_CAP_ID_EXP); ++ u16 pcie_link_status; ++ ++ if (pcie_cap_offset) { ++ if (!pci_read_config_word(pdev, ++ pcie_cap_offset + PCIE_LINK_STATUS, ++ &pcie_link_status)) ++ size = PCIE_CONFIG_SPACE_LEN; ++ } ++ pci_config_space_ich8lan(); ++#ifdef HAVE_PCI_ERS ++ if (adapter->config_space == NULL) ++#else ++ WARN_ON(adapter->config_space != NULL); ++#endif ++ adapter->config_space = kmalloc(size, GFP_KERNEL); ++ if (!adapter->config_space) { ++ printk(KERN_ERR "Out of memory in pci_save_state\n"); ++ return -ENOMEM; ++ } ++ for (i = 0; i < (size / 4); i++) ++ pci_read_config_dword(pdev, i * 4, &adapter->config_space[i]); ++ return 0; ++} ++ ++void _kc_pci_restore_state(struct pci_dev * pdev) ++{ ++ struct net_device *netdev = pci_get_drvdata(pdev); ++ struct adapter_struct *adapter = netdev_priv(netdev); ++ int size = PCI_CONFIG_SPACE_LEN, i; ++ u16 pcie_cap_offset; ++ u16 pcie_link_status; ++ ++ if (adapter->config_space != NULL) { ++ pcie_cap_offset = pci_find_capability(pdev, PCI_CAP_ID_EXP); ++ if (pcie_cap_offset && ++ !pci_read_config_word(pdev, ++ pcie_cap_offset + PCIE_LINK_STATUS, ++ &pcie_link_status)) ++ size = PCIE_CONFIG_SPACE_LEN; ++ ++ pci_config_space_ich8lan(); ++ for (i = 0; i < (size / 4); i++) ++ pci_write_config_dword(pdev, i * 4, adapter->config_space[i]); ++#ifndef HAVE_PCI_ERS ++ kfree(adapter->config_space); ++ adapter->config_space = NULL; ++#endif ++ } ++} ++ ++#ifdef HAVE_PCI_ERS ++void _kc_free_netdev(struct net_device *netdev) ++{ ++ struct adapter_struct *adapter = netdev_priv(netdev); ++ ++ if (adapter->config_space != NULL) ++ kfree(adapter->config_space); ++#ifdef CONFIG_SYSFS ++ if (netdev->reg_state == NETREG_UNINITIALIZED) { ++ kfree((char *)netdev - netdev->padded); ++ } else { ++ BUG_ON(netdev->reg_state != NETREG_UNREGISTERED); ++ netdev->reg_state = NETREG_RELEASED; ++ class_device_put(&netdev->class_dev); ++ } ++#else ++ kfree((char *)netdev - netdev->padded); ++#endif ++} ++#endif ++#endif /* <= 2.6.18 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) ) ++#ifdef NAPI ++/* this function returns the true netdev of the napi struct */ ++struct net_device * napi_to_netdev(struct napi_struct *napi) ++{ ++ struct adapter_q_vector *q_vector = container_of(napi, ++ struct adapter_q_vector, ++ napi); ++ struct adapter_struct *adapter = q_vector->adapter; ++ ++ return adapter->netdev; ++} ++ ++int _kc_napi_schedule_prep(struct napi_struct *napi) ++{ ++ return (netif_running(napi_to_netdev(napi)) && ++ netif_rx_schedule_prep(napi_to_poll_dev(napi))); ++} ++ ++int __kc_adapter_clean(struct net_device *netdev, int *budget) ++{ ++ int work_done; ++ int work_to_do = min(*budget, netdev->quota); ++ /* kcompat.h netif_napi_add puts napi struct in "fake netdev->priv" */ ++ struct napi_struct *napi = netdev->priv; ++ work_done = napi->poll(napi, work_to_do); ++ *budget -= work_done; ++ netdev->quota -= work_done; ++ return (work_done >= work_to_do) ? 1 : 0; ++} ++#endif /* NAPI */ ++#endif /* <= 2.6.24 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27) ) ++#ifdef HAVE_TX_MQ ++void _kc_netif_tx_stop_all_queues(struct net_device *netdev) ++{ ++ struct adapter_struct *adapter = netdev_priv(netdev); ++ int i; ++ ++ netif_stop_queue(netdev); ++ if (netif_is_multiqueue(netdev)) ++ for (i = 0; i < adapter->num_tx_queues; i++) ++ netif_stop_subqueue(netdev, i); ++} ++void _kc_netif_tx_wake_all_queues(struct net_device *netdev) ++{ ++ struct adapter_struct *adapter = netdev_priv(netdev); ++ int i; ++ ++ netif_wake_queue(netdev); ++ if (netif_is_multiqueue(netdev)) ++ for (i = 0; i < adapter->num_tx_queues; i++) ++ netif_wake_subqueue(netdev, i); ++} ++void _kc_netif_tx_start_all_queues(struct net_device *netdev) ++{ ++ struct adapter_struct *adapter = netdev_priv(netdev); ++ int i; ++ ++ netif_start_queue(netdev); ++ if (netif_is_multiqueue(netdev)) ++ for (i = 0; i < adapter->num_tx_queues; i++) ++ netif_start_subqueue(netdev, i); ++} ++#endif /* HAVE_TX_MQ */ ++#endif /* < 2.6.27 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29) ) ++#endif /* < 2.6.29 */ +diff -r f5806398a14e drivers/net/igb/kcompat.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/igb/kcompat.h Mon Jun 15 11:59:50 2009 +0100 +@@ -0,0 +1,1682 @@ ++/******************************************************************************* ++ ++ Intel(R) Gigabit Ethernet Linux driver ++ Copyright(c) 2007-2009 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++#ifndef _KCOMPAT_H_ ++#define _KCOMPAT_H_ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++/* NAPI enable/disable flags here */ ++#define NAPI ++ ++#define adapter_struct igb_adapter ++#define adapter_q_vector igb_ring ++#define NAPI ++ ++/* and finally set defines so that the code sees the changes */ ++#ifdef NAPI ++#else ++#endif /* NAPI */ ++ ++/* packet split disable/enable */ ++#ifdef DISABLE_PACKET_SPLIT ++#undef CONFIG_E1000_DISABLE_PACKET_SPLIT ++#define CONFIG_E1000_DISABLE_PACKET_SPLIT ++#undef CONFIG_IGB_DISABLE_PACKET_SPLIT ++#define CONFIG_IGB_DISABLE_PACKET_SPLIT ++#endif ++ ++/* MSI compatibility code for all kernels and drivers */ ++#ifdef DISABLE_PCI_MSI ++#undef CONFIG_PCI_MSI ++#endif ++#ifndef CONFIG_PCI_MSI ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,8) ) ++struct msix_entry { ++ u16 vector; /* kernel uses to write allocated vector */ ++ u16 entry; /* driver uses to specify entry, OS writes */ ++}; ++#endif ++#define pci_enable_msi(a) -ENOTSUPP ++#define pci_disable_msi(a) do {} while (0) ++#define pci_enable_msix(a, b, c) -ENOTSUPP ++#define pci_disable_msix(a) do {} while (0) ++#define msi_remove_pci_irq_vectors(a) do {} while (0) ++#endif /* CONFIG_PCI_MSI */ ++#ifdef DISABLE_PM ++#undef CONFIG_PM ++#endif ++ ++#ifdef DISABLE_NET_POLL_CONTROLLER ++#undef CONFIG_NET_POLL_CONTROLLER ++#endif ++ ++#ifndef PMSG_SUSPEND ++#define PMSG_SUSPEND 3 ++#endif ++ ++/* generic boolean compatibility */ ++#undef TRUE ++#undef FALSE ++#define TRUE true ++#define FALSE false ++#ifdef GCC_VERSION ++#if ( GCC_VERSION < 3000 ) ++#define _Bool char ++#endif ++#endif ++#ifndef bool ++#define bool _Bool ++#define true 1 ++#define false 0 ++#endif ++ ++ ++#ifndef module_param ++#define module_param(v,t,p) MODULE_PARM(v, "i"); ++#endif ++ ++#ifndef DMA_64BIT_MASK ++#define DMA_64BIT_MASK 0xffffffffffffffffULL ++#endif ++ ++#ifndef DMA_32BIT_MASK ++#define DMA_32BIT_MASK 0x00000000ffffffffULL ++#endif ++ ++#ifndef PCI_CAP_ID_EXP ++#define PCI_CAP_ID_EXP 0x10 ++#endif ++ ++#ifndef PCIE_LINK_STATE_L0S ++#define PCIE_LINK_STATE_L0S 1 ++#endif ++ ++#ifndef mmiowb ++#ifdef CONFIG_IA64 ++#define mmiowb() asm volatile ("mf.a" ::: "memory") ++#else ++#define mmiowb() ++#endif ++#endif ++ ++#ifndef IRQ_HANDLED ++#define irqreturn_t void ++#define IRQ_HANDLED ++#define IRQ_NONE ++#endif ++ ++#ifndef SET_NETDEV_DEV ++#define SET_NETDEV_DEV(net, pdev) ++#endif ++ ++#ifndef HAVE_FREE_NETDEV ++#define free_netdev(x) kfree(x) ++#endif ++ ++#ifdef HAVE_POLL_CONTROLLER ++#define CONFIG_NET_POLL_CONTROLLER ++#endif ++ ++#ifndef NETDEV_TX_OK ++#define NETDEV_TX_OK 0 ++#endif ++ ++#ifndef NETDEV_TX_BUSY ++#define NETDEV_TX_BUSY 1 ++#endif ++ ++#ifndef NETDEV_TX_LOCKED ++#define NETDEV_TX_LOCKED -1 ++#endif ++ ++#ifndef SKB_DATAREF_SHIFT ++/* if we do not have the infrastructure to detect if skb_header is cloned ++ just return false in all cases */ ++#define skb_header_cloned(x) 0 ++#endif ++ ++#ifndef NETIF_F_GSO ++#define gso_size tso_size ++#define gso_segs tso_segs ++#endif ++ ++#ifndef NETIF_F_GRO ++#define vlan_gro_receive(_napi, _vlgrp, _vlan, _skb) \ ++ vlan_hwaccel_receive_skb(_skb, _vlgrp, _vlan) ++#define napi_gro_receive(_napi, _skb) netif_receive_skb(_skb) ++#endif ++ ++#ifndef CHECKSUM_PARTIAL ++#define CHECKSUM_PARTIAL CHECKSUM_HW ++#define CHECKSUM_COMPLETE CHECKSUM_HW ++#endif ++ ++#ifndef __read_mostly ++#define __read_mostly ++#endif ++ ++#ifndef HAVE_NETIF_MSG ++#define HAVE_NETIF_MSG 1 ++enum { ++ NETIF_MSG_DRV = 0x0001, ++ NETIF_MSG_PROBE = 0x0002, ++ NETIF_MSG_LINK = 0x0004, ++ NETIF_MSG_TIMER = 0x0008, ++ NETIF_MSG_IFDOWN = 0x0010, ++ NETIF_MSG_IFUP = 0x0020, ++ NETIF_MSG_RX_ERR = 0x0040, ++ NETIF_MSG_TX_ERR = 0x0080, ++ NETIF_MSG_TX_QUEUED = 0x0100, ++ NETIF_MSG_INTR = 0x0200, ++ NETIF_MSG_TX_DONE = 0x0400, ++ NETIF_MSG_RX_STATUS = 0x0800, ++ NETIF_MSG_PKTDATA = 0x1000, ++ NETIF_MSG_HW = 0x2000, ++ NETIF_MSG_WOL = 0x4000, ++}; ++ ++#else ++#define NETIF_MSG_HW 0x2000 ++#define NETIF_MSG_WOL 0x4000 ++#endif /* HAVE_NETIF_MSG */ ++ ++#ifndef MII_RESV1 ++#define MII_RESV1 0x17 /* Reserved... */ ++#endif ++ ++#ifndef unlikely ++#define unlikely(_x) _x ++#define likely(_x) _x ++#endif ++ ++#ifndef WARN_ON ++#define WARN_ON(x) ++#endif ++ ++#ifndef PCI_DEVICE ++#define PCI_DEVICE(vend,dev) \ ++ .vendor = (vend), .device = (dev), \ ++ .subvendor = PCI_ANY_ID, .subdevice = PCI_ANY_ID ++#endif ++ ++#ifndef num_online_cpus ++#define num_online_cpus() smp_num_cpus ++#endif ++ ++#ifndef _LINUX_RANDOM_H ++#include ++#endif ++ ++#ifndef DECLARE_BITMAP ++#ifndef BITS_TO_LONGS ++#define BITS_TO_LONGS(bits) (((bits)+BITS_PER_LONG-1)/BITS_PER_LONG) ++#endif ++#define DECLARE_BITMAP(name,bits) long name[BITS_TO_LONGS(bits)] ++#endif ++ ++#ifndef VLAN_HLEN ++#define VLAN_HLEN 4 ++#endif ++ ++#ifndef VLAN_ETH_HLEN ++#define VLAN_ETH_HLEN 18 ++#endif ++ ++#ifndef VLAN_ETH_FRAME_LEN ++#define VLAN_ETH_FRAME_LEN 1518 ++#endif ++ ++#ifndef DCA_GET_TAG_TWO_ARGS ++#define dca3_get_tag(a,b) dca_get_tag(b) ++#endif ++ ++ ++/*****************************************************************************/ ++/* Installations with ethtool version without eeprom, adapter id, or statistics ++ * support */ ++ ++#ifndef ETH_GSTRING_LEN ++#define ETH_GSTRING_LEN 32 ++#endif ++ ++#ifndef ETHTOOL_GSTATS ++#define ETHTOOL_GSTATS 0x1d ++#undef ethtool_drvinfo ++#define ethtool_drvinfo k_ethtool_drvinfo ++struct k_ethtool_drvinfo { ++ u32 cmd; ++ char driver[32]; ++ char version[32]; ++ char fw_version[32]; ++ char bus_info[32]; ++ char reserved1[32]; ++ char reserved2[16]; ++ u32 n_stats; ++ u32 testinfo_len; ++ u32 eedump_len; ++ u32 regdump_len; ++}; ++ ++struct ethtool_stats { ++ u32 cmd; ++ u32 n_stats; ++ u64 data[0]; ++}; ++#endif /* ETHTOOL_GSTATS */ ++ ++#ifndef ETHTOOL_PHYS_ID ++#define ETHTOOL_PHYS_ID 0x1c ++#endif /* ETHTOOL_PHYS_ID */ ++ ++#ifndef ETHTOOL_GSTRINGS ++#define ETHTOOL_GSTRINGS 0x1b ++enum ethtool_stringset { ++ ETH_SS_TEST = 0, ++ ETH_SS_STATS, ++}; ++struct ethtool_gstrings { ++ u32 cmd; /* ETHTOOL_GSTRINGS */ ++ u32 string_set; /* string set id e.c. ETH_SS_TEST, etc*/ ++ u32 len; /* number of strings in the string set */ ++ u8 data[0]; ++}; ++#endif /* ETHTOOL_GSTRINGS */ ++ ++#ifndef ETHTOOL_TEST ++#define ETHTOOL_TEST 0x1a ++enum ethtool_test_flags { ++ ETH_TEST_FL_OFFLINE = (1 << 0), ++ ETH_TEST_FL_FAILED = (1 << 1), ++}; ++struct ethtool_test { ++ u32 cmd; ++ u32 flags; ++ u32 reserved; ++ u32 len; ++ u64 data[0]; ++}; ++#endif /* ETHTOOL_TEST */ ++ ++#ifndef ETHTOOL_GEEPROM ++#define ETHTOOL_GEEPROM 0xb ++#undef ETHTOOL_GREGS ++struct ethtool_eeprom { ++ u32 cmd; ++ u32 magic; ++ u32 offset; ++ u32 len; ++ u8 data[0]; ++}; ++ ++struct ethtool_value { ++ u32 cmd; ++ u32 data; ++}; ++#endif /* ETHTOOL_GEEPROM */ ++ ++#ifndef ETHTOOL_GLINK ++#define ETHTOOL_GLINK 0xa ++#endif /* ETHTOOL_GLINK */ ++ ++#ifndef ETHTOOL_GREGS ++#define ETHTOOL_GREGS 0x00000004 /* Get NIC registers */ ++#define ethtool_regs _kc_ethtool_regs ++/* for passing big chunks of data */ ++struct _kc_ethtool_regs { ++ u32 cmd; ++ u32 version; /* driver-specific, indicates different chips/revs */ ++ u32 len; /* bytes */ ++ u8 data[0]; ++}; ++#endif /* ETHTOOL_GREGS */ ++ ++#ifndef ETHTOOL_GMSGLVL ++#define ETHTOOL_GMSGLVL 0x00000007 /* Get driver message level */ ++#endif ++#ifndef ETHTOOL_SMSGLVL ++#define ETHTOOL_SMSGLVL 0x00000008 /* Set driver msg level, priv. */ ++#endif ++#ifndef ETHTOOL_NWAY_RST ++#define ETHTOOL_NWAY_RST 0x00000009 /* Restart autonegotiation, priv */ ++#endif ++#ifndef ETHTOOL_GLINK ++#define ETHTOOL_GLINK 0x0000000a /* Get link status */ ++#endif ++#ifndef ETHTOOL_GEEPROM ++#define ETHTOOL_GEEPROM 0x0000000b /* Get EEPROM data */ ++#endif ++#ifndef ETHTOOL_SEEPROM ++#define ETHTOOL_SEEPROM 0x0000000c /* Set EEPROM data */ ++#endif ++#ifndef ETHTOOL_GCOALESCE ++#define ETHTOOL_GCOALESCE 0x0000000e /* Get coalesce config */ ++/* for configuring coalescing parameters of chip */ ++#define ethtool_coalesce _kc_ethtool_coalesce ++struct _kc_ethtool_coalesce { ++ u32 cmd; /* ETHTOOL_{G,S}COALESCE */ ++ ++ /* How many usecs to delay an RX interrupt after ++ * a packet arrives. If 0, only rx_max_coalesced_frames ++ * is used. ++ */ ++ u32 rx_coalesce_usecs; ++ ++ /* How many packets to delay an RX interrupt after ++ * a packet arrives. If 0, only rx_coalesce_usecs is ++ * used. It is illegal to set both usecs and max frames ++ * to zero as this would cause RX interrupts to never be ++ * generated. ++ */ ++ u32 rx_max_coalesced_frames; ++ ++ /* Same as above two parameters, except that these values ++ * apply while an IRQ is being serviced by the host. Not ++ * all cards support this feature and the values are ignored ++ * in that case. ++ */ ++ u32 rx_coalesce_usecs_irq; ++ u32 rx_max_coalesced_frames_irq; ++ ++ /* How many usecs to delay a TX interrupt after ++ * a packet is sent. If 0, only tx_max_coalesced_frames ++ * is used. ++ */ ++ u32 tx_coalesce_usecs; ++ ++ /* How many packets to delay a TX interrupt after ++ * a packet is sent. If 0, only tx_coalesce_usecs is ++ * used. It is illegal to set both usecs and max frames ++ * to zero as this would cause TX interrupts to never be ++ * generated. ++ */ ++ u32 tx_max_coalesced_frames; ++ ++ /* Same as above two parameters, except that these values ++ * apply while an IRQ is being serviced by the host. Not ++ * all cards support this feature and the values are ignored ++ * in that case. ++ */ ++ u32 tx_coalesce_usecs_irq; ++ u32 tx_max_coalesced_frames_irq; ++ ++ /* How many usecs to delay in-memory statistics ++ * block updates. Some drivers do not have an in-memory ++ * statistic block, and in such cases this value is ignored. ++ * This value must not be zero. ++ */ ++ u32 stats_block_coalesce_usecs; ++ ++ /* Adaptive RX/TX coalescing is an algorithm implemented by ++ * some drivers to improve latency under low packet rates and ++ * improve throughput under high packet rates. Some drivers ++ * only implement one of RX or TX adaptive coalescing. Anything ++ * not implemented by the driver causes these values to be ++ * silently ignored. ++ */ ++ u32 use_adaptive_rx_coalesce; ++ u32 use_adaptive_tx_coalesce; ++ ++ /* When the packet rate (measured in packets per second) ++ * is below pkt_rate_low, the {rx,tx}_*_low parameters are ++ * used. ++ */ ++ u32 pkt_rate_low; ++ u32 rx_coalesce_usecs_low; ++ u32 rx_max_coalesced_frames_low; ++ u32 tx_coalesce_usecs_low; ++ u32 tx_max_coalesced_frames_low; ++ ++ /* When the packet rate is below pkt_rate_high but above ++ * pkt_rate_low (both measured in packets per second) the ++ * normal {rx,tx}_* coalescing parameters are used. ++ */ ++ ++ /* When the packet rate is (measured in packets per second) ++ * is above pkt_rate_high, the {rx,tx}_*_high parameters are ++ * used. ++ */ ++ u32 pkt_rate_high; ++ u32 rx_coalesce_usecs_high; ++ u32 rx_max_coalesced_frames_high; ++ u32 tx_coalesce_usecs_high; ++ u32 tx_max_coalesced_frames_high; ++ ++ /* How often to do adaptive coalescing packet rate sampling, ++ * measured in seconds. Must not be zero. ++ */ ++ u32 rate_sample_interval; ++}; ++#endif /* ETHTOOL_GCOALESCE */ ++ ++#ifndef ETHTOOL_SCOALESCE ++#define ETHTOOL_SCOALESCE 0x0000000f /* Set coalesce config. */ ++#endif ++#ifndef ETHTOOL_GRINGPARAM ++#define ETHTOOL_GRINGPARAM 0x00000010 /* Get ring parameters */ ++/* for configuring RX/TX ring parameters */ ++#define ethtool_ringparam _kc_ethtool_ringparam ++struct _kc_ethtool_ringparam { ++ u32 cmd; /* ETHTOOL_{G,S}RINGPARAM */ ++ ++ /* Read only attributes. These indicate the maximum number ++ * of pending RX/TX ring entries the driver will allow the ++ * user to set. ++ */ ++ u32 rx_max_pending; ++ u32 rx_mini_max_pending; ++ u32 rx_jumbo_max_pending; ++ u32 tx_max_pending; ++ ++ /* Values changeable by the user. The valid values are ++ * in the range 1 to the "*_max_pending" counterpart above. ++ */ ++ u32 rx_pending; ++ u32 rx_mini_pending; ++ u32 rx_jumbo_pending; ++ u32 tx_pending; ++}; ++#endif /* ETHTOOL_GRINGPARAM */ ++ ++#ifndef ETHTOOL_SRINGPARAM ++#define ETHTOOL_SRINGPARAM 0x00000011 /* Set ring parameters, priv. */ ++#endif ++#ifndef ETHTOOL_GPAUSEPARAM ++#define ETHTOOL_GPAUSEPARAM 0x00000012 /* Get pause parameters */ ++/* for configuring link flow control parameters */ ++#define ethtool_pauseparam _kc_ethtool_pauseparam ++struct _kc_ethtool_pauseparam { ++ u32 cmd; /* ETHTOOL_{G,S}PAUSEPARAM */ ++ ++ /* If the link is being auto-negotiated (via ethtool_cmd.autoneg ++ * being true) the user may set 'autoneg' here non-zero to have the ++ * pause parameters be auto-negotiated too. In such a case, the ++ * {rx,tx}_pause values below determine what capabilities are ++ * advertised. ++ * ++ * If 'autoneg' is zero or the link is not being auto-negotiated, ++ * then {rx,tx}_pause force the driver to use/not-use pause ++ * flow control. ++ */ ++ u32 autoneg; ++ u32 rx_pause; ++ u32 tx_pause; ++}; ++#endif /* ETHTOOL_GPAUSEPARAM */ ++ ++#ifndef ETHTOOL_SPAUSEPARAM ++#define ETHTOOL_SPAUSEPARAM 0x00000013 /* Set pause parameters. */ ++#endif ++#ifndef ETHTOOL_GRXCSUM ++#define ETHTOOL_GRXCSUM 0x00000014 /* Get RX hw csum enable (ethtool_value) */ ++#endif ++#ifndef ETHTOOL_SRXCSUM ++#define ETHTOOL_SRXCSUM 0x00000015 /* Set RX hw csum enable (ethtool_value) */ ++#endif ++#ifndef ETHTOOL_GTXCSUM ++#define ETHTOOL_GTXCSUM 0x00000016 /* Get TX hw csum enable (ethtool_value) */ ++#endif ++#ifndef ETHTOOL_STXCSUM ++#define ETHTOOL_STXCSUM 0x00000017 /* Set TX hw csum enable (ethtool_value) */ ++#endif ++#ifndef ETHTOOL_GSG ++#define ETHTOOL_GSG 0x00000018 /* Get scatter-gather enable ++ * (ethtool_value) */ ++#endif ++#ifndef ETHTOOL_SSG ++#define ETHTOOL_SSG 0x00000019 /* Set scatter-gather enable ++ * (ethtool_value). */ ++#endif ++#ifndef ETHTOOL_TEST ++#define ETHTOOL_TEST 0x0000001a /* execute NIC self-test, priv. */ ++#endif ++#ifndef ETHTOOL_GSTRINGS ++#define ETHTOOL_GSTRINGS 0x0000001b /* get specified string set */ ++#endif ++#ifndef ETHTOOL_PHYS_ID ++#define ETHTOOL_PHYS_ID 0x0000001c /* identify the NIC */ ++#endif ++#ifndef ETHTOOL_GSTATS ++#define ETHTOOL_GSTATS 0x0000001d /* get NIC-specific statistics */ ++#endif ++#ifndef ETHTOOL_GTSO ++#define ETHTOOL_GTSO 0x0000001e /* Get TSO enable (ethtool_value) */ ++#endif ++#ifndef ETHTOOL_STSO ++#define ETHTOOL_STSO 0x0000001f /* Set TSO enable (ethtool_value) */ ++#endif ++ ++#ifndef ETHTOOL_BUSINFO_LEN ++#define ETHTOOL_BUSINFO_LEN 32 ++#endif ++ ++/*****************************************************************************/ ++/* 2.4.3 => 2.4.0 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,3) ) ++ ++/**************************************/ ++/* PCI DRIVER API */ ++ ++#ifndef pci_set_dma_mask ++#define pci_set_dma_mask _kc_pci_set_dma_mask ++extern int _kc_pci_set_dma_mask(struct pci_dev *dev, dma_addr_t mask); ++#endif ++ ++#ifndef pci_request_regions ++#define pci_request_regions _kc_pci_request_regions ++extern int _kc_pci_request_regions(struct pci_dev *pdev, char *res_name); ++#endif ++ ++#ifndef pci_release_regions ++#define pci_release_regions _kc_pci_release_regions ++extern void _kc_pci_release_regions(struct pci_dev *pdev); ++#endif ++ ++/**************************************/ ++/* NETWORK DRIVER API */ ++ ++#ifndef alloc_etherdev ++#define alloc_etherdev _kc_alloc_etherdev ++extern struct net_device * _kc_alloc_etherdev(int sizeof_priv); ++#endif ++ ++#ifndef is_valid_ether_addr ++#define is_valid_ether_addr _kc_is_valid_ether_addr ++extern int _kc_is_valid_ether_addr(u8 *addr); ++#endif ++ ++/**************************************/ ++/* MISCELLANEOUS */ ++ ++#ifndef INIT_TQUEUE ++#define INIT_TQUEUE(_tq, _routine, _data) \ ++ do { \ ++ INIT_LIST_HEAD(&(_tq)->list); \ ++ (_tq)->sync = 0; \ ++ (_tq)->routine = _routine; \ ++ (_tq)->data = _data; \ ++ } while (0) ++#endif ++ ++#endif /* 2.4.3 => 2.4.0 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,5) ) ++/* Generic MII registers. */ ++#define MII_BMCR 0x00 /* Basic mode control register */ ++#define MII_BMSR 0x01 /* Basic mode status register */ ++#define MII_PHYSID1 0x02 /* PHYS ID 1 */ ++#define MII_PHYSID2 0x03 /* PHYS ID 2 */ ++#define MII_ADVERTISE 0x04 /* Advertisement control reg */ ++#define MII_LPA 0x05 /* Link partner ability reg */ ++#define MII_EXPANSION 0x06 /* Expansion register */ ++/* Basic mode control register. */ ++#define BMCR_FULLDPLX 0x0100 /* Full duplex */ ++#define BMCR_ANENABLE 0x1000 /* Enable auto negotiation */ ++/* Basic mode status register. */ ++#define BMSR_ERCAP 0x0001 /* Ext-reg capability */ ++#define BMSR_ANEGCAPABLE 0x0008 /* Able to do auto-negotiation */ ++#define BMSR_10HALF 0x0800 /* Can do 10mbps, half-duplex */ ++#define BMSR_10FULL 0x1000 /* Can do 10mbps, full-duplex */ ++#define BMSR_100HALF 0x2000 /* Can do 100mbps, half-duplex */ ++#define BMSR_100FULL 0x4000 /* Can do 100mbps, full-duplex */ ++/* Advertisement control register. */ ++#define ADVERTISE_CSMA 0x0001 /* Only selector supported */ ++#define ADVERTISE_10HALF 0x0020 /* Try for 10mbps half-duplex */ ++#define ADVERTISE_10FULL 0x0040 /* Try for 10mbps full-duplex */ ++#define ADVERTISE_100HALF 0x0080 /* Try for 100mbps half-duplex */ ++#define ADVERTISE_100FULL 0x0100 /* Try for 100mbps full-duplex */ ++#define ADVERTISE_ALL (ADVERTISE_10HALF | ADVERTISE_10FULL | \ ++ ADVERTISE_100HALF | ADVERTISE_100FULL) ++/* Expansion register for auto-negotiation. */ ++#define EXPANSION_ENABLENPAGE 0x0004 /* This enables npage words */ ++#endif ++ ++/*****************************************************************************/ ++/* 2.4.6 => 2.4.3 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,6) ) ++ ++#ifndef pci_set_power_state ++#define pci_set_power_state _kc_pci_set_power_state ++extern int _kc_pci_set_power_state(struct pci_dev *dev, int state); ++#endif ++ ++#ifndef pci_enable_wake ++#define pci_enable_wake _kc_pci_enable_wake ++extern int _kc_pci_enable_wake(struct pci_dev *pdev, u32 state, int enable); ++#endif ++ ++#ifndef pci_disable_device ++#define pci_disable_device _kc_pci_disable_device ++extern void _kc_pci_disable_device(struct pci_dev *pdev); ++#endif ++ ++/* PCI PM entry point syntax changed, so don't support suspend/resume */ ++#undef CONFIG_PM ++ ++#endif /* 2.4.6 => 2.4.3 */ ++ ++#ifndef HAVE_PCI_SET_MWI ++#define pci_set_mwi(X) pci_write_config_word(X, \ ++ PCI_COMMAND, adapter->hw.bus.pci_cmd_word | \ ++ PCI_COMMAND_INVALIDATE); ++#define pci_clear_mwi(X) pci_write_config_word(X, \ ++ PCI_COMMAND, adapter->hw.bus.pci_cmd_word & \ ++ ~PCI_COMMAND_INVALIDATE); ++#endif ++ ++/*****************************************************************************/ ++/* 2.4.10 => 2.4.9 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,10) ) ++ ++/**************************************/ ++/* MODULE API */ ++ ++#ifndef MODULE_LICENSE ++ #define MODULE_LICENSE(X) ++#endif ++ ++/**************************************/ ++/* OTHER */ ++ ++#undef min ++#define min(x,y) ({ \ ++ const typeof(x) _x = (x); \ ++ const typeof(y) _y = (y); \ ++ (void) (&_x == &_y); \ ++ _x < _y ? _x : _y; }) ++ ++#undef max ++#define max(x,y) ({ \ ++ const typeof(x) _x = (x); \ ++ const typeof(y) _y = (y); \ ++ (void) (&_x == &_y); \ ++ _x > _y ? _x : _y; }) ++ ++#define min_t(type,x,y) ({ \ ++ type _x = (x); \ ++ type _y = (y); \ ++ _x < _y ? _x : _y; }) ++ ++#define max_t(type,x,y) ({ \ ++ type _x = (x); \ ++ type _y = (y); \ ++ _x > _y ? _x : _y; }) ++ ++#ifndef list_for_each_safe ++#define list_for_each_safe(pos, n, head) \ ++ for (pos = (head)->next, n = pos->next; pos != (head); \ ++ pos = n, n = pos->next) ++#endif ++ ++#endif /* 2.4.10 -> 2.4.6 */ ++ ++ ++/*****************************************************************************/ ++/* 2.4.13 => 2.4.10 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,13) ) ++ ++/**************************************/ ++/* PCI DMA MAPPING */ ++ ++#ifndef virt_to_page ++ #define virt_to_page(v) (mem_map + (virt_to_phys(v) >> PAGE_SHIFT)) ++#endif ++ ++#ifndef pci_map_page ++#define pci_map_page _kc_pci_map_page ++extern u64 _kc_pci_map_page(struct pci_dev *dev, struct page *page, unsigned long offset, size_t size, int direction); ++#endif ++ ++#ifndef pci_unmap_page ++#define pci_unmap_page _kc_pci_unmap_page ++extern void _kc_pci_unmap_page(struct pci_dev *dev, u64 dma_addr, size_t size, int direction); ++#endif ++ ++/* pci_set_dma_mask takes dma_addr_t, which is only 32-bits prior to 2.4.13 */ ++ ++#undef DMA_32BIT_MASK ++#define DMA_32BIT_MASK 0xffffffff ++#undef DMA_64BIT_MASK ++#define DMA_64BIT_MASK 0xffffffff ++ ++/**************************************/ ++/* OTHER */ ++ ++#ifndef cpu_relax ++#define cpu_relax() rep_nop() ++#endif ++ ++#endif /* 2.4.13 => 2.4.10 */ ++ ++/*****************************************************************************/ ++/* 2.4.17 => 2.4.12 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,17) ) ++ ++#ifndef __devexit_p ++ #define __devexit_p(x) &(x) ++#endif ++ ++#endif /* 2.4.17 => 2.4.13 */ ++ ++/*****************************************************************************/ ++/* 2.4.20 => 2.4.19 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,20) ) ++ ++/* we won't support NAPI on less than 2.4.20 */ ++#ifdef NAPI ++#undef CONFIG_E1000_NAPI ++#undef CONFIG_E1000E_NAPI ++#undef CONFIG_IXGB_NAPI ++#endif ++ ++#endif /* 2.4.20 => 2.4.19 */ ++/*****************************************************************************/ ++/* 2.4.22 => 2.4.17 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,22) ) ++#define pci_name(x) ((x)->slot_name) ++#endif ++ ++/*****************************************************************************/ ++/*****************************************************************************/ ++/* 2.4.23 => 2.4.22 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,23) ) ++/*****************************************************************************/ ++#ifdef NAPI ++#ifndef netif_poll_disable ++#define netif_poll_disable(x) _kc_netif_poll_disable(x) ++static inline void _kc_netif_poll_disable(struct net_device *netdev) ++{ ++ while (test_and_set_bit(__LINK_STATE_RX_SCHED, &netdev->state)) { ++ /* No hurry */ ++ current->state = TASK_INTERRUPTIBLE; ++ schedule_timeout(1); ++ } ++} ++#endif ++ ++#ifndef netif_poll_enable ++#define netif_poll_enable(x) _kc_netif_poll_enable(x) ++static inline void _kc_netif_poll_enable(struct net_device *netdev) ++{ ++ clear_bit(__LINK_STATE_RX_SCHED, &netdev->state); ++} ++#endif ++#endif /* NAPI */ ++#ifndef netif_tx_disable ++#define netif_tx_disable(x) _kc_netif_tx_disable(x) ++static inline void _kc_netif_tx_disable(struct net_device *dev) ++{ ++ spin_lock_bh(&dev->xmit_lock); ++ netif_stop_queue(dev); ++ spin_unlock_bh(&dev->xmit_lock); ++} ++#endif ++#endif /* 2.4.23 => 2.4.22 */ ++ ++/*****************************************************************************/ ++/* 2.6.4 => 2.6.0 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,25) || \ ++ ( LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) && \ ++ LINUX_VERSION_CODE < KERNEL_VERSION(2,6,4) ) ) ++#define ETHTOOL_OPS_COMPAT ++#endif /* 2.6.4 => 2.6.0 */ ++ ++/*****************************************************************************/ ++/* 2.5.71 => 2.4.x */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,5,71) ) ++#include ++#define sk_protocol protocol ++ ++#define pci_get_device pci_find_device ++#endif /* 2.5.70 => 2.4.x */ ++ ++/*****************************************************************************/ ++/* < 2.4.27 or 2.6.0 <= 2.6.5 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,27) || \ ++ ( LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) && \ ++ LINUX_VERSION_CODE < KERNEL_VERSION(2,6,5) ) ) ++ ++#ifndef netif_msg_init ++#define netif_msg_init _kc_netif_msg_init ++static inline u32 _kc_netif_msg_init(int debug_value, int default_msg_enable_bits) ++{ ++ /* use default */ ++ if (debug_value < 0 || debug_value >= (sizeof(u32) * 8)) ++ return default_msg_enable_bits; ++ if (debug_value == 0) /* no output */ ++ return 0; ++ /* set low N bits */ ++ return (1 << debug_value) -1; ++} ++#endif ++ ++#endif /* < 2.4.27 or 2.6.0 <= 2.6.5 */ ++/*****************************************************************************/ ++#if (( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,27) ) || \ ++ (( LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) ) && \ ++ ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,3) ))) ++#define netdev_priv(x) x->priv ++#endif ++ ++/*****************************************************************************/ ++/* <= 2.5.0 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) ) ++#undef pci_register_driver ++#define pci_register_driver pci_module_init ++ ++#define dev_err(__unused_dev, format, arg...) \ ++ printk(KERN_ERR "%s: " format, pci_name(adapter->pdev) , ## arg) ++#define dev_warn(__unused_dev, format, arg...) \ ++ printk(KERN_WARNING "%s: " format, pci_name(pdev) , ## arg) ++ ++/* hlist_* code - double linked lists */ ++struct hlist_head { ++ struct hlist_node *first; ++}; ++ ++struct hlist_node { ++ struct hlist_node *next, **pprev; ++}; ++ ++static inline void __hlist_del(struct hlist_node *n) ++{ ++ struct hlist_node *next = n->next; ++ struct hlist_node **pprev = n->pprev; ++ *pprev = next; ++ if (next) ++ next->pprev = pprev; ++} ++ ++static inline void hlist_del(struct hlist_node *n) ++{ ++ __hlist_del(n); ++ n->next = NULL; ++ n->pprev = NULL; ++} ++ ++static inline void hlist_add_head(struct hlist_node *n, struct hlist_head *h) ++{ ++ struct hlist_node *first = h->first; ++ n->next = first; ++ if (first) ++ first->pprev = &n->next; ++ h->first = n; ++ n->pprev = &h->first; ++} ++ ++static inline int hlist_empty(const struct hlist_head *h) ++{ ++ return !h->first; ++} ++#define HLIST_HEAD_INIT { .first = NULL } ++#define HLIST_HEAD(name) struct hlist_head name = { .first = NULL } ++#define INIT_HLIST_HEAD(ptr) ((ptr)->first = NULL) ++static inline void INIT_HLIST_NODE(struct hlist_node *h) ++{ ++ h->next = NULL; ++ h->pprev = NULL; ++} ++#define hlist_entry(ptr, type, member) container_of(ptr,type,member) ++ ++#define hlist_for_each_entry(tpos, pos, head, member) \ ++ for (pos = (head)->first; \ ++ pos && ({ prefetch(pos->next); 1;}) && \ ++ ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ ++ pos = pos->next) ++ ++#define hlist_for_each_entry_safe(tpos, pos, n, head, member) \ ++ for (pos = (head)->first; \ ++ pos && ({ n = pos->next; 1; }) && \ ++ ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ ++ pos = n) ++ ++/* we ignore GFP here */ ++#define dma_alloc_coherent(dv, sz, dma, gfp) \ ++ pci_alloc_consistent(pdev, (sz), (dma)) ++#define dma_free_coherent(dv, sz, addr, dma_addr) \ ++ pci_free_consistent(pdev, (sz), (addr), (dma_addr)) ++ ++#ifndef might_sleep ++#define might_sleep() ++#endif ++ ++#endif /* <= 2.5.0 */ ++ ++/*****************************************************************************/ ++/* 2.5.28 => 2.4.23 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,5,28) ) ++ ++static inline void _kc_synchronize_irq(void) ++{ ++ synchronize_irq(); ++} ++#undef synchronize_irq ++#define synchronize_irq(X) _kc_synchronize_irq() ++ ++#include ++#define work_struct tq_struct ++#undef INIT_WORK ++#define INIT_WORK(a,b) INIT_TQUEUE(a,(void (*)(void *))b,a) ++#undef container_of ++#define container_of list_entry ++#define schedule_work schedule_task ++#define flush_scheduled_work flush_scheduled_tasks ++#define cancel_work_sync(x) flush_scheduled_work() ++ ++#endif /* 2.5.28 => 2.4.17 */ ++ ++/*****************************************************************************/ ++/* 2.6.0 => 2.5.28 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) ) ++#define MODULE_INFO(version, _version) ++#ifndef CONFIG_E1000_DISABLE_PACKET_SPLIT ++#define CONFIG_E1000_DISABLE_PACKET_SPLIT 1 ++#endif ++#ifndef CONFIG_IGB_DISABLE_PACKET_SPLIT ++#define CONFIG_IGB_DISABLE_PACKET_SPLIT 1 ++#endif ++ ++#define pci_set_consistent_dma_mask(dev,mask) 1 ++ ++#undef dev_put ++#define dev_put(dev) __dev_put(dev) ++ ++#ifndef skb_fill_page_desc ++#define skb_fill_page_desc _kc_skb_fill_page_desc ++extern void _kc_skb_fill_page_desc(struct sk_buff *skb, int i, struct page *page, int off, int size); ++#endif ++ ++#undef ALIGN ++#define ALIGN(x,a) (((x)+(a)-1)&~((a)-1)) ++ ++#ifndef page_count ++#define page_count(p) atomic_read(&(p)->count) ++#endif ++ ++/* find_first_bit and find_next bit are not defined for most ++ * 2.4 kernels (except for the redhat 2.4.21 kernels ++ */ ++#include ++#define BITOP_WORD(nr) ((nr) / BITS_PER_LONG) ++#undef find_next_bit ++#define find_next_bit _kc_find_next_bit ++extern unsigned long _kc_find_next_bit(const unsigned long *addr, ++ unsigned long size, ++ unsigned long offset); ++#define find_first_bit(addr, size) find_next_bit((addr), (size), 0) ++ ++#endif /* 2.6.0 => 2.5.28 */ ++ ++/*****************************************************************************/ ++/* 2.6.4 => 2.6.0 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,4) ) ++#define MODULE_VERSION(_version) MODULE_INFO(version, _version) ++#endif /* 2.6.4 => 2.6.0 */ ++ ++/*****************************************************************************/ ++/* 2.6.5 => 2.6.0 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,5) ) ++#define pci_dma_sync_single_for_cpu pci_dma_sync_single ++#define pci_dma_sync_single_for_device pci_dma_sync_single_for_cpu ++#endif /* 2.6.5 => 2.6.0 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,6) ) ++/* taken from 2.6 include/linux/bitmap.h */ ++#undef bitmap_zero ++#define bitmap_zero _kc_bitmap_zero ++static inline void _kc_bitmap_zero(unsigned long *dst, int nbits) ++{ ++ if (nbits <= BITS_PER_LONG) ++ *dst = 0UL; ++ else { ++ int len = BITS_TO_LONGS(nbits) * sizeof(unsigned long); ++ memset(dst, 0, len); ++ } ++} ++#endif /* < 2.6.6 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,7) ) ++#undef if_mii ++#define if_mii _kc_if_mii ++static inline struct mii_ioctl_data *_kc_if_mii(struct ifreq *rq) ++{ ++ return (struct mii_ioctl_data *) &rq->ifr_ifru; ++} ++#endif /* < 2.6.7 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,8) ) ++#ifndef PCI_EXP_DEVCTL ++#define PCI_EXP_DEVCTL 8 ++#endif ++#ifndef PCI_EXP_DEVCTL_CERE ++#define PCI_EXP_DEVCTL_CERE 0x0001 ++#endif ++#define msleep(x) do { set_current_state(TASK_UNINTERRUPTIBLE); \ ++ schedule_timeout((x * HZ)/1000 + 2); \ ++ } while (0) ++ ++#endif /* < 2.6.8 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,9)) ++#include ++#define __iomem ++ ++#ifndef kcalloc ++#define kcalloc(n, size, flags) _kc_kzalloc(((n) * (size)), flags) ++extern void *_kc_kzalloc(size_t size, int flags); ++#endif ++#define MSEC_PER_SEC 1000L ++static inline unsigned int _kc_jiffies_to_msecs(const unsigned long j) ++{ ++#if HZ <= MSEC_PER_SEC && !(MSEC_PER_SEC % HZ) ++ return (MSEC_PER_SEC / HZ) * j; ++#elif HZ > MSEC_PER_SEC && !(HZ % MSEC_PER_SEC) ++ return (j + (HZ / MSEC_PER_SEC) - 1)/(HZ / MSEC_PER_SEC); ++#else ++ return (j * MSEC_PER_SEC) / HZ; ++#endif ++} ++static inline unsigned long _kc_msecs_to_jiffies(const unsigned int m) ++{ ++ if (m > _kc_jiffies_to_msecs(MAX_JIFFY_OFFSET)) ++ return MAX_JIFFY_OFFSET; ++#if HZ <= MSEC_PER_SEC && !(MSEC_PER_SEC % HZ) ++ return (m + (MSEC_PER_SEC / HZ) - 1) / (MSEC_PER_SEC / HZ); ++#elif HZ > MSEC_PER_SEC && !(HZ % MSEC_PER_SEC) ++ return m * (HZ / MSEC_PER_SEC); ++#else ++ return (m * HZ + MSEC_PER_SEC - 1) / MSEC_PER_SEC; ++#endif ++} ++ ++#define msleep_interruptible _kc_msleep_interruptible ++static inline unsigned long _kc_msleep_interruptible(unsigned int msecs) ++{ ++ unsigned long timeout = _kc_msecs_to_jiffies(msecs) + 1; ++ ++ while (timeout && !signal_pending(current)) { ++ __set_current_state(TASK_INTERRUPTIBLE); ++ timeout = schedule_timeout(timeout); ++ } ++ return _kc_jiffies_to_msecs(timeout); ++} ++ ++/* Basic mode control register. */ ++#define BMCR_SPEED1000 0x0040 /* MSB of Speed (1000) */ ++ ++#ifndef __le16 ++#define __le16 u16 ++#endif ++#ifndef __le32 ++#define __le32 u32 ++#endif ++#ifndef __le64 ++#define __le64 u64 ++#endif ++ ++#ifdef pci_dma_mapping_error ++#undef pci_dma_mapping_error ++#endif ++#define pci_dma_mapping_error _kc_pci_dma_mapping_error ++static inline int _kc_pci_dma_mapping_error(struct pci_dev *pdev, ++ dma_addr_t dma_addr) ++{ ++ return dma_addr == 0; ++} ++ ++#endif /* < 2.6.9 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10) ) ++#ifdef module_param_array_named ++#undef module_param_array_named ++#define module_param_array_named(name, array, type, nump, perm) \ ++ static struct kparam_array __param_arr_##name \ ++ = { ARRAY_SIZE(array), nump, param_set_##type, param_get_##type, \ ++ sizeof(array[0]), array }; \ ++ module_param_call(name, param_array_set, param_array_get, \ ++ &__param_arr_##name, perm) ++#endif /* module_param_array_named */ ++#endif /* < 2.6.10 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,11) ) ++#define PCI_D0 0 ++#define PCI_D1 1 ++#define PCI_D2 2 ++#define PCI_D3hot 3 ++#define PCI_D3cold 4 ++#define pci_choose_state(pdev,state) state ++#define PMSG_SUSPEND 3 ++#define PCI_EXP_LNKCTL 16 ++ ++#undef NETIF_F_LLTX ++ ++#ifndef ARCH_HAS_PREFETCH ++#define prefetch(X) ++#endif ++ ++#ifndef NET_IP_ALIGN ++#define NET_IP_ALIGN 2 ++#endif ++ ++#define KC_USEC_PER_SEC 1000000L ++#define usecs_to_jiffies _kc_usecs_to_jiffies ++static inline unsigned int _kc_jiffies_to_usecs(const unsigned long j) ++{ ++#if HZ <= KC_USEC_PER_SEC && !(KC_USEC_PER_SEC % HZ) ++ return (KC_USEC_PER_SEC / HZ) * j; ++#elif HZ > KC_USEC_PER_SEC && !(HZ % KC_USEC_PER_SEC) ++ return (j + (HZ / KC_USEC_PER_SEC) - 1)/(HZ / KC_USEC_PER_SEC); ++#else ++ return (j * KC_USEC_PER_SEC) / HZ; ++#endif ++} ++static inline unsigned long _kc_usecs_to_jiffies(const unsigned int m) ++{ ++ if (m > _kc_jiffies_to_usecs(MAX_JIFFY_OFFSET)) ++ return MAX_JIFFY_OFFSET; ++#if HZ <= KC_USEC_PER_SEC && !(KC_USEC_PER_SEC % HZ) ++ return (m + (KC_USEC_PER_SEC / HZ) - 1) / (KC_USEC_PER_SEC / HZ); ++#elif HZ > KC_USEC_PER_SEC && !(HZ % KC_USEC_PER_SEC) ++ return m * (HZ / KC_USEC_PER_SEC); ++#else ++ return (m * HZ + KC_USEC_PER_SEC - 1) / KC_USEC_PER_SEC; ++#endif ++} ++#endif /* < 2.6.11 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,12) ) ++#include ++#define USE_REBOOT_NOTIFIER ++ ++/* Generic MII registers. */ ++#define MII_CTRL1000 0x09 /* 1000BASE-T control */ ++#define MII_STAT1000 0x0a /* 1000BASE-T status */ ++/* Advertisement control register. */ ++#define ADVERTISE_PAUSE_CAP 0x0400 /* Try for pause */ ++#define ADVERTISE_PAUSE_ASYM 0x0800 /* Try for asymmetric pause */ ++/* 1000BASE-T Control register */ ++#define ADVERTISE_1000FULL 0x0200 /* Advertise 1000BASE-T full duplex */ ++#endif /* < 2.6.12 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,14) ) ++#define pm_message_t u32 ++#ifndef kzalloc ++#define kzalloc _kc_kzalloc ++extern void *_kc_kzalloc(size_t size, int flags); ++#endif ++ ++/* Generic MII registers. */ ++#define MII_ESTATUS 0x0f /* Extended Status */ ++/* Basic mode status register. */ ++#define BMSR_ESTATEN 0x0100 /* Extended Status in R15 */ ++/* Extended status register. */ ++#define ESTATUS_1000_TFULL 0x2000 /* Can do 1000BT Full */ ++#define ESTATUS_1000_THALF 0x1000 /* Can do 1000BT Half */ ++#endif /* < 2.6.14 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,15) ) ++#ifndef device_can_wakeup ++#define device_can_wakeup(dev) (1) ++#endif ++#ifndef device_set_wakeup_enable ++#define device_set_wakeup_enable(dev, val) do{}while(0) ++#endif ++#ifndef device_init_wakeup ++#define device_init_wakeup(dev,val) do {} while (0) ++#endif ++#endif /* < 2.6.15 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,16) ) ++#undef HAVE_PCI_ERS ++#else /* 2.6.16 and above */ ++#undef HAVE_PCI_ERS ++#define HAVE_PCI_ERS ++#endif /* < 2.6.16 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18) ) ++ ++#ifndef IRQF_PROBE_SHARED ++#ifdef SA_PROBEIRQ ++#define IRQF_PROBE_SHARED SA_PROBEIRQ ++#else ++#define IRQF_PROBE_SHARED 0 ++#endif ++#endif ++ ++#ifndef IRQF_SHARED ++#define IRQF_SHARED SA_SHIRQ ++#endif ++ ++#ifndef ARRAY_SIZE ++#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) ++#endif ++ ++#ifndef netdev_alloc_skb ++#define netdev_alloc_skb _kc_netdev_alloc_skb ++extern struct sk_buff *_kc_netdev_alloc_skb(struct net_device *dev, ++ unsigned int length); ++#endif ++ ++#ifndef skb_is_gso ++#ifdef NETIF_F_TSO ++#define skb_is_gso _kc_skb_is_gso ++static inline int _kc_skb_is_gso(const struct sk_buff *skb) ++{ ++ return skb_shinfo(skb)->gso_size; ++} ++#else ++#define skb_is_gso(a) 0 ++#endif ++#endif ++ ++#endif /* < 2.6.18 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) ) ++ ++#ifndef DIV_ROUND_UP ++#define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d)) ++#endif ++#if ( LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) ) ++#ifndef RHEL_RELEASE_CODE ++#define RHEL_RELEASE_CODE 0 ++#endif ++#ifndef RHEL_RELEASE_VERSION ++#define RHEL_RELEASE_VERSION(a,b) 0 ++#endif ++#ifndef AX_RELEASE_CODE ++#define AX_RELEASE_CODE 0 ++#endif ++#ifndef AX_RELEASE_VERSION ++#define AX_RELEASE_VERSION(a,b) 0 ++#endif ++#if (!(( RHEL_RELEASE_CODE > RHEL_RELEASE_VERSION(4,4) ) && ( RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(5,0) ) || ( RHEL_RELEASE_CODE > RHEL_RELEASE_VERSION(5,0) ) || (AX_RELEASE_CODE > AX_RELEASE_VERSION(3,0)))) ++typedef irqreturn_t (*irq_handler_t)(int, void*, struct pt_regs *); ++#endif ++#if (RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(6,0)) ++#undef CONFIG_INET_LRO ++#undef CONFIG_INET_LRO_MODULE ++#endif ++typedef irqreturn_t (*new_handler_t)(int, void*); ++static inline irqreturn_t _kc_request_irq(unsigned int irq, new_handler_t handler, unsigned long flags, const char *devname, void *dev_id) ++#else /* 2.4.x */ ++typedef void (*irq_handler_t)(int, void*, struct pt_regs *); ++typedef void (*new_handler_t)(int, void*); ++static inline int _kc_request_irq(unsigned int irq, new_handler_t handler, unsigned long flags, const char *devname, void *dev_id) ++#endif /* >= 2.5.x */ ++{ ++ irq_handler_t new_handler = (irq_handler_t) handler; ++ return request_irq(irq, new_handler, flags, devname, dev_id); ++} ++ ++#undef request_irq ++#define request_irq(irq, handler, flags, devname, dev_id) _kc_request_irq((irq), (handler), (flags), (devname), (dev_id)) ++ ++#define irq_handler_t new_handler_t ++/* pci_restore_state and pci_save_state handles MSI/PCIE from 2.6.19 */ ++#define PCIE_CONFIG_SPACE_LEN 256 ++#define PCI_CONFIG_SPACE_LEN 64 ++#define PCIE_LINK_STATUS 0x12 ++#define pci_config_space_ich8lan() do {} while(0) ++#undef pci_save_state ++extern int _kc_pci_save_state(struct pci_dev *); ++#define pci_save_state(pdev) _kc_pci_save_state(pdev) ++#undef pci_restore_state ++extern void _kc_pci_restore_state(struct pci_dev *); ++#define pci_restore_state(pdev) _kc_pci_restore_state(pdev) ++#ifdef HAVE_PCI_ERS ++#undef free_netdev ++extern void _kc_free_netdev(struct net_device *); ++#define free_netdev(netdev) _kc_free_netdev(netdev) ++#endif ++static inline int pci_enable_pcie_error_reporting(struct pci_dev *dev) ++{ ++ return 0; ++} ++#define pci_disable_pcie_error_reporting(dev) do {} while (0) ++#define pci_cleanup_aer_uncorrect_error_status(dev) do {} while (0) ++#else /* 2.6.19 */ ++#include ++#endif /* < 2.6.19 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) ) ++#if ( LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,28) ) ++#undef INIT_WORK ++#define INIT_WORK(_work, _func) \ ++do { \ ++ INIT_LIST_HEAD(&(_work)->entry); \ ++ (_work)->pending = 0; \ ++ (_work)->func = (void (*)(void *))_func; \ ++ (_work)->data = _work; \ ++ init_timer(&(_work)->timer); \ ++} while (0) ++#endif ++ ++#ifndef PCI_VDEVICE ++#define PCI_VDEVICE(ven, dev) \ ++ PCI_VENDOR_ID_##ven, (dev), \ ++ PCI_ANY_ID, PCI_ANY_ID, 0, 0 ++#endif ++ ++#ifndef round_jiffies ++#define round_jiffies(x) x ++#endif ++ ++#define csum_offset csum ++ ++#endif /* < 2.6.20 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21) ) ++#define to_net_dev(class) container_of(class, struct net_device, class_dev) ++#define NETDEV_CLASS_DEV ++#define vlan_group_get_device(vg, id) (vg->vlan_devices[id]) ++#define vlan_group_set_device(vg, id, dev) if (vg) vg->vlan_devices[id] = dev; ++#define pci_channel_offline(pdev) (pdev->error_state && \ ++ pdev->error_state != pci_channel_io_normal) ++#define pci_request_selected_regions(pdev, bars, name) \ ++ pci_request_regions(pdev, name) ++#define pci_release_selected_regions(pdev, bars) pci_release_regions(pdev); ++#endif /* < 2.6.21 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22) ) ++#define tcp_hdr(skb) (skb->h.th) ++#define tcp_hdrlen(skb) (skb->h.th->doff << 2) ++#define skb_transport_offset(skb) (skb->h.raw - skb->data) ++#define skb_transport_header(skb) (skb->h.raw) ++#define ipv6_hdr(skb) (skb->nh.ipv6h) ++#define ip_hdr(skb) (skb->nh.iph) ++#define skb_network_offset(skb) (skb->nh.raw - skb->data) ++#define skb_network_header(skb) (skb->nh.raw) ++#define skb_tail_pointer(skb) skb->tail ++#define skb_copy_to_linear_data_offset(skb, offset, from, len) \ ++ memcpy(skb->data + offset, from, len) ++#define skb_network_header_len(skb) (skb->h.raw - skb->nh.raw) ++#define pci_register_driver pci_module_init ++#define skb_mac_header(skb) skb->mac.raw ++ ++#ifdef NETIF_F_MULTI_QUEUE ++#ifndef alloc_etherdev_mq ++#define alloc_etherdev_mq(_a, _b) alloc_etherdev(_a) ++#endif ++#endif /* NETIF_F_MULTI_QUEUE */ ++ ++#ifndef ETH_FCS_LEN ++#define ETH_FCS_LEN 4 ++#endif ++#define cancel_work_sync(x) flush_scheduled_work() ++#ifndef udp_hdr ++#define udp_hdr _udp_hdr ++static inline struct udphdr *_udp_hdr(const struct sk_buff *skb) ++{ ++ return (struct udphdr *)skb_transport_header(skb); ++} ++#endif ++#endif /* < 2.6.22 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE > KERNEL_VERSION(2,6,22) ) ++#undef ETHTOOL_GPERMADDR ++#undef SET_MODULE_OWNER ++#define SET_MODULE_OWNER(dev) do { } while (0) ++#endif /* > 2.6.22 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) ) ++/* NAPI API changes in 2.6.24 break everything */ ++struct napi_struct { ++ /* used to look up the real NAPI polling routine */ ++ int (*poll)(struct napi_struct *, int); ++ struct net_device poll_dev; ++ int weight; ++}; ++#ifdef NAPI ++extern int __kc_adapter_clean(struct net_device *, int *); ++extern struct net_device * napi_to_netdev(struct napi_struct *); ++#define napi_to_poll_dev(_napi) &(_napi)->poll_dev ++#define napi_enable(napi) do { \ ++ /* abuse if_port as a counter */ \ ++ if (!adapter->netdev->if_port) { \ ++ netif_poll_enable(adapter->netdev); \ ++ } \ ++ ++adapter->netdev->if_port; \ ++ netif_poll_enable(&(napi)->poll_dev); \ ++ } while (0) ++#define napi_disable(_napi) do { \ ++ netif_poll_disable(&(_napi)->poll_dev); \ ++ --adapter->netdev->if_port; \ ++ if (!adapter->netdev->if_port) \ ++ netif_poll_disable(adapter->netdev); \ ++ } while (0) ++ ++#define netif_napi_add(_netdev, _napi, _poll, _weight) \ ++ do { \ ++ struct napi_struct *__napi = (_napi); \ ++ __napi->poll_dev.poll = &(__kc_adapter_clean); \ ++ __napi->poll_dev.priv = (_napi); \ ++ __napi->poll_dev.weight = (_weight); \ ++ dev_hold(&__napi->poll_dev); \ ++ set_bit(__LINK_STATE_START, &__napi->poll_dev.state);\ ++ _netdev->poll = &(__kc_adapter_clean); \ ++ _netdev->weight = (_weight); \ ++ __napi->poll = &(_poll); \ ++ __napi->weight = (_weight); \ ++ set_bit(__LINK_STATE_RX_SCHED, &(_netdev)->state); \ ++ set_bit(__LINK_STATE_RX_SCHED, &__napi->poll_dev.state); \ ++ } while (0) ++#define netif_napi_del(_napi) \ ++ do { \ ++ WARN_ON(!test_bit(__LINK_STATE_RX_SCHED, &(_napi)->poll_dev.state)); \ ++ dev_put(&(_napi)->poll_dev); \ ++ memset(&(_napi)->poll_dev, 0, sizeof(struct napi_struct));\ ++ } while (0) ++extern int _kc_napi_schedule_prep(struct napi_struct *napi); ++#define napi_schedule_prep _kc_napi_schedule_prep ++#define napi_schedule(napi) netif_rx_schedule(napi_to_poll_dev(napi)) ++#define __napi_schedule(napi) __netif_rx_schedule(napi_to_poll_dev(napi)) ++#define napi_complete(napi) netif_rx_complete(napi_to_poll_dev(napi)) ++#else /* NAPI */ ++#define netif_napi_add(_netdev, _napi, _poll, _weight) \ ++ do { \ ++ struct napi_struct *__napi = _napi; \ ++ _netdev->poll = &(_poll); \ ++ _netdev->weight = (_weight); \ ++ __napi->poll = &(_poll); \ ++ __napi->weight = (_weight); \ ++ } while (0) ++#define netif_napi_del(_a) do {} while (0) ++#endif /* NAPI */ ++ ++#undef dev_get_by_name ++#define dev_get_by_name(_a, _b) dev_get_by_name(_b) ++#define __netif_subqueue_stopped(_a, _b) netif_subqueue_stopped(_a, _b) ++#else /* < 2.6.24 */ ++#define HAVE_NETDEV_NAPI_LIST ++#endif /* < 2.6.24 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE > KERNEL_VERSION(2,6,24) ) ++#include ++#endif /* > 2.6.24 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25) ) ++#define PM_QOS_CPU_DMA_LATENCY 1 ++ ++#if ( LINUX_VERSION_CODE > KERNEL_VERSION(2,6,18) ) ++#include ++#define PM_QOS_DEFAULT_VALUE INFINITE_LATENCY ++#define pm_qos_add_requirement(pm_qos_class, name, value) \ ++ set_acceptable_latency(name, value) ++#define pm_qos_remove_requirement(pm_qos_class, name) \ ++ remove_acceptable_latency(name) ++#define pm_qos_update_requirement(pm_qos_class, name, value) \ ++ modify_acceptable_latency(name, value) ++#else ++#define PM_QOS_DEFAULT_VALUE -1 ++#define pm_qos_add_requirement(pm_qos_class, name, value) ++#define pm_qos_remove_requirement(pm_qos_class, name) ++#define pm_qos_update_requirement(pm_qos_class, name, value) { \ ++ if (value != PM_QOS_DEFAULT_VALUE) { \ ++ printk(KERN_WARNING "%s: unable to set PM QoS requirement\n", \ ++ pci_name(adapter->pdev)); \ ++ } \ ++} ++#endif /* > 2.6.18 */ ++ ++#define pci_enable_device_mem(pdev) pci_enable_device(pdev) ++ ++#endif /* < 2.6.25 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26) ) ++#else /* < 2.6.26 */ ++#include ++#define HAVE_NETDEV_VLAN_FEATURES ++#endif /* < 2.6.26 */ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27) ) ++#if ( LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,15) ) ++#undef device_set_wakeup_enable ++#define device_set_wakeup_enable(dev, val) \ ++ do { \ ++ u16 pmc = 0; \ ++ int pm = pci_find_capability(adapter->pdev, PCI_CAP_ID_PM); \ ++ if (pm) { \ ++ pci_read_config_word(adapter->pdev, pm + PCI_PM_PMC, \ ++ &pmc); \ ++ } \ ++ (dev)->power.can_wakeup = !!(pmc >> 11); \ ++ (dev)->power.should_wakeup = (val && (pmc >> 11)); \ ++ } while (0) ++#endif /* 2.6.15 through 2.6.27 */ ++#ifndef netif_napi_del ++#define netif_napi_del(_a) do {} while (0) ++#ifdef NAPI ++#ifdef CONFIG_NETPOLL ++#undef netif_napi_del ++#define netif_napi_del(_a) list_del(&(_a)->dev_list); ++#endif ++#endif ++#endif /* netif_napi_del */ ++#ifndef pci_dma_mapping_error ++#define pci_dma_mapping_error(pdev, dma_addr) pci_dma_mapping_error(dma_addr) ++#endif ++ ++#ifdef CONFIG_NETDEVICES_MULTIQUEUE ++#define HAVE_TX_MQ ++#endif ++ ++#ifdef HAVE_TX_MQ ++extern void _kc_netif_tx_stop_all_queues(struct net_device *); ++extern void _kc_netif_tx_wake_all_queues(struct net_device *); ++extern void _kc_netif_tx_start_all_queues(struct net_device *); ++#define netif_tx_stop_all_queues(a) _kc_netif_tx_stop_all_queues(a) ++#define netif_tx_wake_all_queues(a) _kc_netif_tx_wake_all_queues(a) ++#define netif_tx_start_all_queues(a) _kc_netif_tx_start_all_queues(a) ++#undef netif_stop_subqueue ++#define netif_stop_subqueue(_ndev,_qi) do { \ ++ if (netif_is_multiqueue((_ndev))) \ ++ netif_stop_subqueue((_ndev), (_qi)); \ ++ else \ ++ netif_stop_queue((_ndev)); \ ++ } while (0) ++#undef netif_start_subqueue ++#define netif_start_subqueue(_ndev,_qi) do { \ ++ if (netif_is_multiqueue((_ndev))) \ ++ netif_start_subqueue((_ndev), (_qi)); \ ++ else \ ++ netif_start_queue((_ndev)); \ ++ } while (0) ++#else /* CONFIG_NETDEVICES_MULTIQUEUE */ ++#define netif_tx_stop_all_queues(a) netif_stop_queue(a) ++#define netif_tx_wake_all_queues(a) netif_wake_queue(a) ++#if ( LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,12) ) ++#define netif_tx_start_all_queues(a) netif_start_queue(a) ++#else ++#define netif_tx_start_all_queues(a) do {} while (0) ++#endif ++#define netif_stop_subqueue(_ndev,_qi) netif_stop_queue((_ndev)) ++#define netif_start_subqueue(_ndev,_qi) netif_start_queue((_ndev)) ++#endif /* CONFIG_NETDEVICES_MULTIQUEUE */ ++#ifndef NETIF_F_MULTI_QUEUE ++#define NETIF_F_MULTI_QUEUE 0 ++#define netif_is_multiqueue(a) 0 ++#define netif_wake_subqueue(a, b) ++#endif /* NETIF_F_MULTI_QUEUE */ ++#else /* < 2.6.27 */ ++#define HAVE_TX_MQ ++#define HAVE_NETDEV_SELECT_QUEUE ++#endif /* < 2.6.27 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,28) ) ++#define pci_ioremap_bar(pdev, bar) ioremap(pci_resource_start(pdev, bar), \ ++ pci_resource_len(pdev, bar)) ++#endif /* < 2.6.28 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29) ) ++#define pci_request_selected_regions_exclusive(pdev, bars, name) \ ++ pci_request_selected_regions(pdev, bars, name) ++#ifdef CONFIG_FCOE ++#undef CONFIG_FCOE ++#endif /* CONFIG_FCOE */ ++#endif /* < 2.6.29 */ ++#endif /* _KCOMPAT_H_ */ +diff -r f5806398a14e drivers/net/igb/kcompat_ethtool.c +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/igb/kcompat_ethtool.c Mon Jun 15 11:59:50 2009 +0100 +@@ -0,0 +1,1168 @@ ++/******************************************************************************* ++ ++ Intel(R) Gigabit Ethernet Linux driver ++ Copyright(c) 2007-2009 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++/* ++ * net/core/ethtool.c - Ethtool ioctl handler ++ * Copyright (c) 2003 Matthew Wilcox ++ * ++ * This file is where we call all the ethtool_ops commands to get ++ * the information ethtool needs. We fall back to calling do_ioctl() ++ * for drivers which haven't been converted to ethtool_ops yet. ++ * ++ * It's GPL, stupid. ++ * ++ * Modification by sfeldma@pobox.com to work as backward compat ++ * solution for pre-ethtool_ops kernels. ++ * - copied struct ethtool_ops from ethtool.h ++ * - defined SET_ETHTOOL_OPS ++ * - put in some #ifndef NETIF_F_xxx wrappers ++ * - changes refs to dev->ethtool_ops to ethtool_ops ++ * - changed dev_ethtool to ethtool_ioctl ++ * - remove EXPORT_SYMBOL()s ++ * - added _kc_ prefix in built-in ethtool_op_xxx ops. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "kcompat.h" ++ ++#undef SUPPORTED_10000baseT_Full ++#define SUPPORTED_10000baseT_Full (1 << 12) ++#undef ADVERTISED_10000baseT_Full ++#define ADVERTISED_10000baseT_Full (1 << 12) ++#undef SPEED_10000 ++#define SPEED_10000 10000 ++ ++#undef ethtool_ops ++#define ethtool_ops _kc_ethtool_ops ++ ++struct _kc_ethtool_ops { ++ int (*get_settings)(struct net_device *, struct ethtool_cmd *); ++ int (*set_settings)(struct net_device *, struct ethtool_cmd *); ++ void (*get_drvinfo)(struct net_device *, struct ethtool_drvinfo *); ++ int (*get_regs_len)(struct net_device *); ++ void (*get_regs)(struct net_device *, struct ethtool_regs *, void *); ++ void (*get_wol)(struct net_device *, struct ethtool_wolinfo *); ++ int (*set_wol)(struct net_device *, struct ethtool_wolinfo *); ++ u32 (*get_msglevel)(struct net_device *); ++ void (*set_msglevel)(struct net_device *, u32); ++ int (*nway_reset)(struct net_device *); ++ u32 (*get_link)(struct net_device *); ++ int (*get_eeprom_len)(struct net_device *); ++ int (*get_eeprom)(struct net_device *, struct ethtool_eeprom *, u8 *); ++ int (*set_eeprom)(struct net_device *, struct ethtool_eeprom *, u8 *); ++ int (*get_coalesce)(struct net_device *, struct ethtool_coalesce *); ++ int (*set_coalesce)(struct net_device *, struct ethtool_coalesce *); ++ void (*get_ringparam)(struct net_device *, struct ethtool_ringparam *); ++ int (*set_ringparam)(struct net_device *, struct ethtool_ringparam *); ++ void (*get_pauseparam)(struct net_device *, ++ struct ethtool_pauseparam*); ++ int (*set_pauseparam)(struct net_device *, ++ struct ethtool_pauseparam*); ++ u32 (*get_rx_csum)(struct net_device *); ++ int (*set_rx_csum)(struct net_device *, u32); ++ u32 (*get_tx_csum)(struct net_device *); ++ int (*set_tx_csum)(struct net_device *, u32); ++ u32 (*get_sg)(struct net_device *); ++ int (*set_sg)(struct net_device *, u32); ++ u32 (*get_tso)(struct net_device *); ++ int (*set_tso)(struct net_device *, u32); ++ int (*self_test_count)(struct net_device *); ++ void (*self_test)(struct net_device *, struct ethtool_test *, u64 *); ++ void (*get_strings)(struct net_device *, u32 stringset, u8 *); ++ int (*phys_id)(struct net_device *, u32); ++ int (*get_stats_count)(struct net_device *); ++ void (*get_ethtool_stats)(struct net_device *, struct ethtool_stats *, ++ u64 *); ++} *ethtool_ops = NULL; ++ ++#undef SET_ETHTOOL_OPS ++#define SET_ETHTOOL_OPS(netdev, ops) (ethtool_ops = (ops)) ++ ++/* ++ * Some useful ethtool_ops methods that are device independent. If we find that ++ * all drivers want to do the same thing here, we can turn these into dev_() ++ * function calls. ++ */ ++ ++#undef ethtool_op_get_link ++#define ethtool_op_get_link _kc_ethtool_op_get_link ++u32 _kc_ethtool_op_get_link(struct net_device *dev) ++{ ++ return netif_carrier_ok(dev) ? 1 : 0; ++} ++ ++#undef ethtool_op_get_tx_csum ++#define ethtool_op_get_tx_csum _kc_ethtool_op_get_tx_csum ++u32 _kc_ethtool_op_get_tx_csum(struct net_device *dev) ++{ ++#ifdef NETIF_F_IP_CSUM ++ return (dev->features & NETIF_F_IP_CSUM) != 0; ++#else ++ return 0; ++#endif ++} ++ ++#undef ethtool_op_set_tx_csum ++#define ethtool_op_set_tx_csum _kc_ethtool_op_set_tx_csum ++int _kc_ethtool_op_set_tx_csum(struct net_device *dev, u32 data) ++{ ++#ifdef NETIF_F_IP_CSUM ++ if (data) ++#ifdef NETIF_F_IPV6_CSUM ++ dev->features |= (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM); ++ else ++ dev->features &= ~(NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM); ++#else ++ dev->features |= NETIF_F_IP_CSUM; ++ else ++ dev->features &= ~NETIF_F_IP_CSUM; ++#endif ++#endif ++ ++ return 0; ++} ++ ++#undef ethtool_op_get_sg ++#define ethtool_op_get_sg _kc_ethtool_op_get_sg ++u32 _kc_ethtool_op_get_sg(struct net_device *dev) ++{ ++#ifdef NETIF_F_SG ++ return (dev->features & NETIF_F_SG) != 0; ++#else ++ return 0; ++#endif ++} ++ ++#undef ethtool_op_set_sg ++#define ethtool_op_set_sg _kc_ethtool_op_set_sg ++int _kc_ethtool_op_set_sg(struct net_device *dev, u32 data) ++{ ++#ifdef NETIF_F_SG ++ if (data) ++ dev->features |= NETIF_F_SG; ++ else ++ dev->features &= ~NETIF_F_SG; ++#endif ++ ++ return 0; ++} ++ ++#undef ethtool_op_get_tso ++#define ethtool_op_get_tso _kc_ethtool_op_get_tso ++u32 _kc_ethtool_op_get_tso(struct net_device *dev) ++{ ++#ifdef NETIF_F_TSO ++ return (dev->features & NETIF_F_TSO) != 0; ++#else ++ return 0; ++#endif ++} ++ ++#undef ethtool_op_set_tso ++#define ethtool_op_set_tso _kc_ethtool_op_set_tso ++int _kc_ethtool_op_set_tso(struct net_device *dev, u32 data) ++{ ++#ifdef NETIF_F_TSO ++ if (data) ++ dev->features |= NETIF_F_TSO; ++ else ++ dev->features &= ~NETIF_F_TSO; ++#endif ++ ++ return 0; ++} ++ ++/* Handlers for each ethtool command */ ++ ++static int ethtool_get_settings(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_cmd cmd = { ETHTOOL_GSET }; ++ int err; ++ ++ if (!ethtool_ops->get_settings) ++ return -EOPNOTSUPP; ++ ++ err = ethtool_ops->get_settings(dev, &cmd); ++ if (err < 0) ++ return err; ++ ++ if (copy_to_user(useraddr, &cmd, sizeof(cmd))) ++ return -EFAULT; ++ return 0; ++} ++ ++static int ethtool_set_settings(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_cmd cmd; ++ ++ if (!ethtool_ops->set_settings) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&cmd, useraddr, sizeof(cmd))) ++ return -EFAULT; ++ ++ return ethtool_ops->set_settings(dev, &cmd); ++} ++ ++static int ethtool_get_drvinfo(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_drvinfo info; ++ struct ethtool_ops *ops = ethtool_ops; ++ ++ if (!ops->get_drvinfo) ++ return -EOPNOTSUPP; ++ ++ memset(&info, 0, sizeof(info)); ++ info.cmd = ETHTOOL_GDRVINFO; ++ ops->get_drvinfo(dev, &info); ++ ++ if (ops->self_test_count) ++ info.testinfo_len = ops->self_test_count(dev); ++ if (ops->get_stats_count) ++ info.n_stats = ops->get_stats_count(dev); ++ if (ops->get_regs_len) ++ info.regdump_len = ops->get_regs_len(dev); ++ if (ops->get_eeprom_len) ++ info.eedump_len = ops->get_eeprom_len(dev); ++ ++ if (copy_to_user(useraddr, &info, sizeof(info))) ++ return -EFAULT; ++ return 0; ++} ++ ++static int ethtool_get_regs(struct net_device *dev, char *useraddr) ++{ ++ struct ethtool_regs regs; ++ struct ethtool_ops *ops = ethtool_ops; ++ void *regbuf; ++ int reglen, ret; ++ ++ if (!ops->get_regs || !ops->get_regs_len) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(®s, useraddr, sizeof(regs))) ++ return -EFAULT; ++ ++ reglen = ops->get_regs_len(dev); ++ if (regs.len > reglen) ++ regs.len = reglen; ++ ++ regbuf = kmalloc(reglen, GFP_USER); ++ if (!regbuf) ++ return -ENOMEM; ++ ++ ops->get_regs(dev, ®s, regbuf); ++ ++ ret = -EFAULT; ++ if (copy_to_user(useraddr, ®s, sizeof(regs))) ++ goto out; ++ useraddr += offsetof(struct ethtool_regs, data); ++ if (copy_to_user(useraddr, regbuf, reglen)) ++ goto out; ++ ret = 0; ++ ++out: ++ kfree(regbuf); ++ return ret; ++} ++ ++static int ethtool_get_wol(struct net_device *dev, char *useraddr) ++{ ++ struct ethtool_wolinfo wol = { ETHTOOL_GWOL }; ++ ++ if (!ethtool_ops->get_wol) ++ return -EOPNOTSUPP; ++ ++ ethtool_ops->get_wol(dev, &wol); ++ ++ if (copy_to_user(useraddr, &wol, sizeof(wol))) ++ return -EFAULT; ++ return 0; ++} ++ ++static int ethtool_set_wol(struct net_device *dev, char *useraddr) ++{ ++ struct ethtool_wolinfo wol; ++ ++ if (!ethtool_ops->set_wol) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&wol, useraddr, sizeof(wol))) ++ return -EFAULT; ++ ++ return ethtool_ops->set_wol(dev, &wol); ++} ++ ++static int ethtool_get_msglevel(struct net_device *dev, char *useraddr) ++{ ++ struct ethtool_value edata = { ETHTOOL_GMSGLVL }; ++ ++ if (!ethtool_ops->get_msglevel) ++ return -EOPNOTSUPP; ++ ++ edata.data = ethtool_ops->get_msglevel(dev); ++ ++ if (copy_to_user(useraddr, &edata, sizeof(edata))) ++ return -EFAULT; ++ return 0; ++} ++ ++static int ethtool_set_msglevel(struct net_device *dev, char *useraddr) ++{ ++ struct ethtool_value edata; ++ ++ if (!ethtool_ops->set_msglevel) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&edata, useraddr, sizeof(edata))) ++ return -EFAULT; ++ ++ ethtool_ops->set_msglevel(dev, edata.data); ++ return 0; ++} ++ ++static int ethtool_nway_reset(struct net_device *dev) ++{ ++ if (!ethtool_ops->nway_reset) ++ return -EOPNOTSUPP; ++ ++ return ethtool_ops->nway_reset(dev); ++} ++ ++static int ethtool_get_link(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_value edata = { ETHTOOL_GLINK }; ++ ++ if (!ethtool_ops->get_link) ++ return -EOPNOTSUPP; ++ ++ edata.data = ethtool_ops->get_link(dev); ++ ++ if (copy_to_user(useraddr, &edata, sizeof(edata))) ++ return -EFAULT; ++ return 0; ++} ++ ++static int ethtool_get_eeprom(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_eeprom eeprom; ++ struct ethtool_ops *ops = ethtool_ops; ++ u8 *data; ++ int ret; ++ ++ if (!ops->get_eeprom || !ops->get_eeprom_len) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&eeprom, useraddr, sizeof(eeprom))) ++ return -EFAULT; ++ ++ /* Check for wrap and zero */ ++ if (eeprom.offset + eeprom.len <= eeprom.offset) ++ return -EINVAL; ++ ++ /* Check for exceeding total eeprom len */ ++ if (eeprom.offset + eeprom.len > ops->get_eeprom_len(dev)) ++ return -EINVAL; ++ ++ data = kmalloc(eeprom.len, GFP_USER); ++ if (!data) ++ return -ENOMEM; ++ ++ ret = -EFAULT; ++ if (copy_from_user(data, useraddr + sizeof(eeprom), eeprom.len)) ++ goto out; ++ ++ ret = ops->get_eeprom(dev, &eeprom, data); ++ if (ret) ++ goto out; ++ ++ ret = -EFAULT; ++ if (copy_to_user(useraddr, &eeprom, sizeof(eeprom))) ++ goto out; ++ if (copy_to_user(useraddr + sizeof(eeprom), data, eeprom.len)) ++ goto out; ++ ret = 0; ++ ++out: ++ kfree(data); ++ return ret; ++} ++ ++static int ethtool_set_eeprom(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_eeprom eeprom; ++ struct ethtool_ops *ops = ethtool_ops; ++ u8 *data; ++ int ret; ++ ++ if (!ops->set_eeprom || !ops->get_eeprom_len) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&eeprom, useraddr, sizeof(eeprom))) ++ return -EFAULT; ++ ++ /* Check for wrap and zero */ ++ if (eeprom.offset + eeprom.len <= eeprom.offset) ++ return -EINVAL; ++ ++ /* Check for exceeding total eeprom len */ ++ if (eeprom.offset + eeprom.len > ops->get_eeprom_len(dev)) ++ return -EINVAL; ++ ++ data = kmalloc(eeprom.len, GFP_USER); ++ if (!data) ++ return -ENOMEM; ++ ++ ret = -EFAULT; ++ if (copy_from_user(data, useraddr + sizeof(eeprom), eeprom.len)) ++ goto out; ++ ++ ret = ops->set_eeprom(dev, &eeprom, data); ++ if (ret) ++ goto out; ++ ++ if (copy_to_user(useraddr + sizeof(eeprom), data, eeprom.len)) ++ ret = -EFAULT; ++ ++out: ++ kfree(data); ++ return ret; ++} ++ ++static int ethtool_get_coalesce(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_coalesce coalesce = { ETHTOOL_GCOALESCE }; ++ ++ if (!ethtool_ops->get_coalesce) ++ return -EOPNOTSUPP; ++ ++ ethtool_ops->get_coalesce(dev, &coalesce); ++ ++ if (copy_to_user(useraddr, &coalesce, sizeof(coalesce))) ++ return -EFAULT; ++ return 0; ++} ++ ++static int ethtool_set_coalesce(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_coalesce coalesce; ++ ++ if (!ethtool_ops->get_coalesce) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&coalesce, useraddr, sizeof(coalesce))) ++ return -EFAULT; ++ ++ return ethtool_ops->set_coalesce(dev, &coalesce); ++} ++ ++static int ethtool_get_ringparam(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_ringparam ringparam = { ETHTOOL_GRINGPARAM }; ++ ++ if (!ethtool_ops->get_ringparam) ++ return -EOPNOTSUPP; ++ ++ ethtool_ops->get_ringparam(dev, &ringparam); ++ ++ if (copy_to_user(useraddr, &ringparam, sizeof(ringparam))) ++ return -EFAULT; ++ return 0; ++} ++ ++static int ethtool_set_ringparam(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_ringparam ringparam; ++ ++ if (!ethtool_ops->get_ringparam) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&ringparam, useraddr, sizeof(ringparam))) ++ return -EFAULT; ++ ++ return ethtool_ops->set_ringparam(dev, &ringparam); ++} ++ ++static int ethtool_get_pauseparam(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_pauseparam pauseparam = { ETHTOOL_GPAUSEPARAM }; ++ ++ if (!ethtool_ops->get_pauseparam) ++ return -EOPNOTSUPP; ++ ++ ethtool_ops->get_pauseparam(dev, &pauseparam); ++ ++ if (copy_to_user(useraddr, &pauseparam, sizeof(pauseparam))) ++ return -EFAULT; ++ return 0; ++} ++ ++static int ethtool_set_pauseparam(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_pauseparam pauseparam; ++ ++ if (!ethtool_ops->get_pauseparam) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&pauseparam, useraddr, sizeof(pauseparam))) ++ return -EFAULT; ++ ++ return ethtool_ops->set_pauseparam(dev, &pauseparam); ++} ++ ++static int ethtool_get_rx_csum(struct net_device *dev, char *useraddr) ++{ ++ struct ethtool_value edata = { ETHTOOL_GRXCSUM }; ++ ++ if (!ethtool_ops->get_rx_csum) ++ return -EOPNOTSUPP; ++ ++ edata.data = ethtool_ops->get_rx_csum(dev); ++ ++ if (copy_to_user(useraddr, &edata, sizeof(edata))) ++ return -EFAULT; ++ return 0; ++} ++ ++static int ethtool_set_rx_csum(struct net_device *dev, char *useraddr) ++{ ++ struct ethtool_value edata; ++ ++ if (!ethtool_ops->set_rx_csum) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&edata, useraddr, sizeof(edata))) ++ return -EFAULT; ++ ++ ethtool_ops->set_rx_csum(dev, edata.data); ++ return 0; ++} ++ ++static int ethtool_get_tx_csum(struct net_device *dev, char *useraddr) ++{ ++ struct ethtool_value edata = { ETHTOOL_GTXCSUM }; ++ ++ if (!ethtool_ops->get_tx_csum) ++ return -EOPNOTSUPP; ++ ++ edata.data = ethtool_ops->get_tx_csum(dev); ++ ++ if (copy_to_user(useraddr, &edata, sizeof(edata))) ++ return -EFAULT; ++ return 0; ++} ++ ++static int ethtool_set_tx_csum(struct net_device *dev, char *useraddr) ++{ ++ struct ethtool_value edata; ++ ++ if (!ethtool_ops->set_tx_csum) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&edata, useraddr, sizeof(edata))) ++ return -EFAULT; ++ ++ return ethtool_ops->set_tx_csum(dev, edata.data); ++} ++ ++static int ethtool_get_sg(struct net_device *dev, char *useraddr) ++{ ++ struct ethtool_value edata = { ETHTOOL_GSG }; ++ ++ if (!ethtool_ops->get_sg) ++ return -EOPNOTSUPP; ++ ++ edata.data = ethtool_ops->get_sg(dev); ++ ++ if (copy_to_user(useraddr, &edata, sizeof(edata))) ++ return -EFAULT; ++ return 0; ++} ++ ++static int ethtool_set_sg(struct net_device *dev, char *useraddr) ++{ ++ struct ethtool_value edata; ++ ++ if (!ethtool_ops->set_sg) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&edata, useraddr, sizeof(edata))) ++ return -EFAULT; ++ ++ return ethtool_ops->set_sg(dev, edata.data); ++} ++ ++static int ethtool_get_tso(struct net_device *dev, char *useraddr) ++{ ++ struct ethtool_value edata = { ETHTOOL_GTSO }; ++ ++ if (!ethtool_ops->get_tso) ++ return -EOPNOTSUPP; ++ ++ edata.data = ethtool_ops->get_tso(dev); ++ ++ if (copy_to_user(useraddr, &edata, sizeof(edata))) ++ return -EFAULT; ++ return 0; ++} ++ ++static int ethtool_set_tso(struct net_device *dev, char *useraddr) ++{ ++ struct ethtool_value edata; ++ ++ if (!ethtool_ops->set_tso) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&edata, useraddr, sizeof(edata))) ++ return -EFAULT; ++ ++ return ethtool_ops->set_tso(dev, edata.data); ++} ++ ++static int ethtool_self_test(struct net_device *dev, char *useraddr) ++{ ++ struct ethtool_test test; ++ struct ethtool_ops *ops = ethtool_ops; ++ u64 *data; ++ int ret; ++ ++ if (!ops->self_test || !ops->self_test_count) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&test, useraddr, sizeof(test))) ++ return -EFAULT; ++ ++ test.len = ops->self_test_count(dev); ++ data = kmalloc(test.len * sizeof(u64), GFP_USER); ++ if (!data) ++ return -ENOMEM; ++ ++ ops->self_test(dev, &test, data); ++ ++ ret = -EFAULT; ++ if (copy_to_user(useraddr, &test, sizeof(test))) ++ goto out; ++ useraddr += sizeof(test); ++ if (copy_to_user(useraddr, data, test.len * sizeof(u64))) ++ goto out; ++ ret = 0; ++ ++out: ++ kfree(data); ++ return ret; ++} ++ ++static int ethtool_get_strings(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_gstrings gstrings; ++ struct ethtool_ops *ops = ethtool_ops; ++ u8 *data; ++ int ret; ++ ++ if (!ops->get_strings) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&gstrings, useraddr, sizeof(gstrings))) ++ return -EFAULT; ++ ++ switch (gstrings.string_set) { ++ case ETH_SS_TEST: ++ if (!ops->self_test_count) ++ return -EOPNOTSUPP; ++ gstrings.len = ops->self_test_count(dev); ++ break; ++ case ETH_SS_STATS: ++ if (!ops->get_stats_count) ++ return -EOPNOTSUPP; ++ gstrings.len = ops->get_stats_count(dev); ++ break; ++ default: ++ return -EINVAL; ++ } ++ ++ data = kmalloc(gstrings.len * ETH_GSTRING_LEN, GFP_USER); ++ if (!data) ++ return -ENOMEM; ++ ++ ops->get_strings(dev, gstrings.string_set, data); ++ ++ ret = -EFAULT; ++ if (copy_to_user(useraddr, &gstrings, sizeof(gstrings))) ++ goto out; ++ useraddr += sizeof(gstrings); ++ if (copy_to_user(useraddr, data, gstrings.len * ETH_GSTRING_LEN)) ++ goto out; ++ ret = 0; ++ ++out: ++ kfree(data); ++ return ret; ++} ++ ++static int ethtool_phys_id(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_value id; ++ ++ if (!ethtool_ops->phys_id) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&id, useraddr, sizeof(id))) ++ return -EFAULT; ++ ++ return ethtool_ops->phys_id(dev, id.data); ++} ++ ++static int ethtool_get_stats(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_stats stats; ++ struct ethtool_ops *ops = ethtool_ops; ++ u64 *data; ++ int ret; ++ ++ if (!ops->get_ethtool_stats || !ops->get_stats_count) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&stats, useraddr, sizeof(stats))) ++ return -EFAULT; ++ ++ stats.n_stats = ops->get_stats_count(dev); ++ data = kmalloc(stats.n_stats * sizeof(u64), GFP_USER); ++ if (!data) ++ return -ENOMEM; ++ ++ ops->get_ethtool_stats(dev, &stats, data); ++ ++ ret = -EFAULT; ++ if (copy_to_user(useraddr, &stats, sizeof(stats))) ++ goto out; ++ useraddr += sizeof(stats); ++ if (copy_to_user(useraddr, data, stats.n_stats * sizeof(u64))) ++ goto out; ++ ret = 0; ++ ++out: ++ kfree(data); ++ return ret; ++} ++ ++/* The main entry point in this file. Called from net/core/dev.c */ ++ ++#define ETHTOOL_OPS_COMPAT ++int ethtool_ioctl(struct ifreq *ifr) ++{ ++ struct net_device *dev = __dev_get_by_name(ifr->ifr_name); ++ void *useraddr = (void *) ifr->ifr_data; ++ u32 ethcmd; ++ ++ /* ++ * XXX: This can be pushed down into the ethtool_* handlers that ++ * need it. Keep existing behavior for the moment. ++ */ ++ if (!capable(CAP_NET_ADMIN)) ++ return -EPERM; ++ ++ if (!dev || !netif_device_present(dev)) ++ return -ENODEV; ++ ++ if (copy_from_user(ðcmd, useraddr, sizeof (ethcmd))) ++ return -EFAULT; ++ ++ switch (ethcmd) { ++ case ETHTOOL_GSET: ++ return ethtool_get_settings(dev, useraddr); ++ case ETHTOOL_SSET: ++ return ethtool_set_settings(dev, useraddr); ++ case ETHTOOL_GDRVINFO: ++ return ethtool_get_drvinfo(dev, useraddr); ++ case ETHTOOL_GREGS: ++ return ethtool_get_regs(dev, useraddr); ++ case ETHTOOL_GWOL: ++ return ethtool_get_wol(dev, useraddr); ++ case ETHTOOL_SWOL: ++ return ethtool_set_wol(dev, useraddr); ++ case ETHTOOL_GMSGLVL: ++ return ethtool_get_msglevel(dev, useraddr); ++ case ETHTOOL_SMSGLVL: ++ return ethtool_set_msglevel(dev, useraddr); ++ case ETHTOOL_NWAY_RST: ++ return ethtool_nway_reset(dev); ++ case ETHTOOL_GLINK: ++ return ethtool_get_link(dev, useraddr); ++ case ETHTOOL_GEEPROM: ++ return ethtool_get_eeprom(dev, useraddr); ++ case ETHTOOL_SEEPROM: ++ return ethtool_set_eeprom(dev, useraddr); ++ case ETHTOOL_GCOALESCE: ++ return ethtool_get_coalesce(dev, useraddr); ++ case ETHTOOL_SCOALESCE: ++ return ethtool_set_coalesce(dev, useraddr); ++ case ETHTOOL_GRINGPARAM: ++ return ethtool_get_ringparam(dev, useraddr); ++ case ETHTOOL_SRINGPARAM: ++ return ethtool_set_ringparam(dev, useraddr); ++ case ETHTOOL_GPAUSEPARAM: ++ return ethtool_get_pauseparam(dev, useraddr); ++ case ETHTOOL_SPAUSEPARAM: ++ return ethtool_set_pauseparam(dev, useraddr); ++ case ETHTOOL_GRXCSUM: ++ return ethtool_get_rx_csum(dev, useraddr); ++ case ETHTOOL_SRXCSUM: ++ return ethtool_set_rx_csum(dev, useraddr); ++ case ETHTOOL_GTXCSUM: ++ return ethtool_get_tx_csum(dev, useraddr); ++ case ETHTOOL_STXCSUM: ++ return ethtool_set_tx_csum(dev, useraddr); ++ case ETHTOOL_GSG: ++ return ethtool_get_sg(dev, useraddr); ++ case ETHTOOL_SSG: ++ return ethtool_set_sg(dev, useraddr); ++ case ETHTOOL_GTSO: ++ return ethtool_get_tso(dev, useraddr); ++ case ETHTOOL_STSO: ++ return ethtool_set_tso(dev, useraddr); ++ case ETHTOOL_TEST: ++ return ethtool_self_test(dev, useraddr); ++ case ETHTOOL_GSTRINGS: ++ return ethtool_get_strings(dev, useraddr); ++ case ETHTOOL_PHYS_ID: ++ return ethtool_phys_id(dev, useraddr); ++ case ETHTOOL_GSTATS: ++ return ethtool_get_stats(dev, useraddr); ++ default: ++ return -EOPNOTSUPP; ++ } ++ ++ return -EOPNOTSUPP; ++} ++ ++#define mii_if_info _kc_mii_if_info ++struct _kc_mii_if_info { ++ int phy_id; ++ int advertising; ++ int phy_id_mask; ++ int reg_num_mask; ++ ++ unsigned int full_duplex : 1; /* is full duplex? */ ++ unsigned int force_media : 1; /* is autoneg. disabled? */ ++ ++ struct net_device *dev; ++ int (*mdio_read) (struct net_device *dev, int phy_id, int location); ++ void (*mdio_write) (struct net_device *dev, int phy_id, int location, int val); ++}; ++ ++struct ethtool_cmd; ++struct mii_ioctl_data; ++ ++#undef mii_link_ok ++#define mii_link_ok _kc_mii_link_ok ++#undef mii_nway_restart ++#define mii_nway_restart _kc_mii_nway_restart ++#undef mii_ethtool_gset ++#define mii_ethtool_gset _kc_mii_ethtool_gset ++#undef mii_ethtool_sset ++#define mii_ethtool_sset _kc_mii_ethtool_sset ++#undef mii_check_link ++#define mii_check_link _kc_mii_check_link ++#undef generic_mii_ioctl ++#define generic_mii_ioctl _kc_generic_mii_ioctl ++extern int _kc_mii_link_ok (struct mii_if_info *mii); ++extern int _kc_mii_nway_restart (struct mii_if_info *mii); ++extern int _kc_mii_ethtool_gset(struct mii_if_info *mii, ++ struct ethtool_cmd *ecmd); ++extern int _kc_mii_ethtool_sset(struct mii_if_info *mii, ++ struct ethtool_cmd *ecmd); ++extern void _kc_mii_check_link (struct mii_if_info *mii); ++extern int _kc_generic_mii_ioctl(struct mii_if_info *mii_if, ++ struct mii_ioctl_data *mii_data, int cmd, ++ unsigned int *duplex_changed); ++ ++ ++struct _kc_pci_dev_ext { ++ struct pci_dev *dev; ++ void *pci_drvdata; ++ struct pci_driver *driver; ++}; ++ ++struct _kc_net_dev_ext { ++ struct net_device *dev; ++ unsigned int carrier; ++}; ++ ++ ++/**************************************/ ++/* mii support */ ++ ++int _kc_mii_ethtool_gset(struct mii_if_info *mii, struct ethtool_cmd *ecmd) ++{ ++ struct net_device *dev = mii->dev; ++ u32 advert, bmcr, lpa, nego; ++ ++ ecmd->supported = ++ (SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full | ++ SUPPORTED_100baseT_Half | SUPPORTED_100baseT_Full | ++ SUPPORTED_Autoneg | SUPPORTED_TP | SUPPORTED_MII); ++ ++ /* only supports twisted-pair */ ++ ecmd->port = PORT_MII; ++ ++ /* only supports internal transceiver */ ++ ecmd->transceiver = XCVR_INTERNAL; ++ ++ /* this isn't fully supported at higher layers */ ++ ecmd->phy_address = mii->phy_id; ++ ++ ecmd->advertising = ADVERTISED_TP | ADVERTISED_MII; ++ advert = mii->mdio_read(dev, mii->phy_id, MII_ADVERTISE); ++ if (advert & ADVERTISE_10HALF) ++ ecmd->advertising |= ADVERTISED_10baseT_Half; ++ if (advert & ADVERTISE_10FULL) ++ ecmd->advertising |= ADVERTISED_10baseT_Full; ++ if (advert & ADVERTISE_100HALF) ++ ecmd->advertising |= ADVERTISED_100baseT_Half; ++ if (advert & ADVERTISE_100FULL) ++ ecmd->advertising |= ADVERTISED_100baseT_Full; ++ ++ bmcr = mii->mdio_read(dev, mii->phy_id, MII_BMCR); ++ lpa = mii->mdio_read(dev, mii->phy_id, MII_LPA); ++ if (bmcr & BMCR_ANENABLE) { ++ ecmd->advertising |= ADVERTISED_Autoneg; ++ ecmd->autoneg = AUTONEG_ENABLE; ++ ++ nego = mii_nway_result(advert & lpa); ++ if (nego == LPA_100FULL || nego == LPA_100HALF) ++ ecmd->speed = SPEED_100; ++ else ++ ecmd->speed = SPEED_10; ++ if (nego == LPA_100FULL || nego == LPA_10FULL) { ++ ecmd->duplex = DUPLEX_FULL; ++ mii->full_duplex = 1; ++ } else { ++ ecmd->duplex = DUPLEX_HALF; ++ mii->full_duplex = 0; ++ } ++ } else { ++ ecmd->autoneg = AUTONEG_DISABLE; ++ ++ ecmd->speed = (bmcr & BMCR_SPEED100) ? SPEED_100 : SPEED_10; ++ ecmd->duplex = (bmcr & BMCR_FULLDPLX) ? DUPLEX_FULL : DUPLEX_HALF; ++ } ++ ++ /* ignore maxtxpkt, maxrxpkt for now */ ++ ++ return 0; ++} ++ ++int _kc_mii_ethtool_sset(struct mii_if_info *mii, struct ethtool_cmd *ecmd) ++{ ++ struct net_device *dev = mii->dev; ++ ++ if (ecmd->speed != SPEED_10 && ecmd->speed != SPEED_100) ++ return -EINVAL; ++ if (ecmd->duplex != DUPLEX_HALF && ecmd->duplex != DUPLEX_FULL) ++ return -EINVAL; ++ if (ecmd->port != PORT_MII) ++ return -EINVAL; ++ if (ecmd->transceiver != XCVR_INTERNAL) ++ return -EINVAL; ++ if (ecmd->phy_address != mii->phy_id) ++ return -EINVAL; ++ if (ecmd->autoneg != AUTONEG_DISABLE && ecmd->autoneg != AUTONEG_ENABLE) ++ return -EINVAL; ++ ++ /* ignore supported, maxtxpkt, maxrxpkt */ ++ ++ if (ecmd->autoneg == AUTONEG_ENABLE) { ++ u32 bmcr, advert, tmp; ++ ++ if ((ecmd->advertising & (ADVERTISED_10baseT_Half | ++ ADVERTISED_10baseT_Full | ++ ADVERTISED_100baseT_Half | ++ ADVERTISED_100baseT_Full)) == 0) ++ return -EINVAL; ++ ++ /* advertise only what has been requested */ ++ advert = mii->mdio_read(dev, mii->phy_id, MII_ADVERTISE); ++ tmp = advert & ~(ADVERTISE_ALL | ADVERTISE_100BASE4); ++ if (ADVERTISED_10baseT_Half) ++ tmp |= ADVERTISE_10HALF; ++ if (ADVERTISED_10baseT_Full) ++ tmp |= ADVERTISE_10FULL; ++ if (ADVERTISED_100baseT_Half) ++ tmp |= ADVERTISE_100HALF; ++ if (ADVERTISED_100baseT_Full) ++ tmp |= ADVERTISE_100FULL; ++ if (advert != tmp) { ++ mii->mdio_write(dev, mii->phy_id, MII_ADVERTISE, tmp); ++ mii->advertising = tmp; ++ } ++ ++ /* turn on autonegotiation, and force a renegotiate */ ++ bmcr = mii->mdio_read(dev, mii->phy_id, MII_BMCR); ++ bmcr |= (BMCR_ANENABLE | BMCR_ANRESTART); ++ mii->mdio_write(dev, mii->phy_id, MII_BMCR, bmcr); ++ ++ mii->force_media = 0; ++ } else { ++ u32 bmcr, tmp; ++ ++ /* turn off auto negotiation, set speed and duplexity */ ++ bmcr = mii->mdio_read(dev, mii->phy_id, MII_BMCR); ++ tmp = bmcr & ~(BMCR_ANENABLE | BMCR_SPEED100 | BMCR_FULLDPLX); ++ if (ecmd->speed == SPEED_100) ++ tmp |= BMCR_SPEED100; ++ if (ecmd->duplex == DUPLEX_FULL) { ++ tmp |= BMCR_FULLDPLX; ++ mii->full_duplex = 1; ++ } else ++ mii->full_duplex = 0; ++ if (bmcr != tmp) ++ mii->mdio_write(dev, mii->phy_id, MII_BMCR, tmp); ++ ++ mii->force_media = 1; ++ } ++ return 0; ++} ++ ++int _kc_mii_link_ok (struct mii_if_info *mii) ++{ ++ /* first, a dummy read, needed to latch some MII phys */ ++ mii->mdio_read(mii->dev, mii->phy_id, MII_BMSR); ++ if (mii->mdio_read(mii->dev, mii->phy_id, MII_BMSR) & BMSR_LSTATUS) ++ return 1; ++ return 0; ++} ++ ++int _kc_mii_nway_restart (struct mii_if_info *mii) ++{ ++ int bmcr; ++ int r = -EINVAL; ++ ++ /* if autoneg is off, it's an error */ ++ bmcr = mii->mdio_read(mii->dev, mii->phy_id, MII_BMCR); ++ ++ if (bmcr & BMCR_ANENABLE) { ++ bmcr |= BMCR_ANRESTART; ++ mii->mdio_write(mii->dev, mii->phy_id, MII_BMCR, bmcr); ++ r = 0; ++ } ++ ++ return r; ++} ++ ++void _kc_mii_check_link (struct mii_if_info *mii) ++{ ++ int cur_link = mii_link_ok(mii); ++ int prev_link = netif_carrier_ok(mii->dev); ++ ++ if (cur_link && !prev_link) ++ netif_carrier_on(mii->dev); ++ else if (prev_link && !cur_link) ++ netif_carrier_off(mii->dev); ++} ++ ++int _kc_generic_mii_ioctl(struct mii_if_info *mii_if, ++ struct mii_ioctl_data *mii_data, int cmd, ++ unsigned int *duplex_chg_out) ++{ ++ int rc = 0; ++ unsigned int duplex_changed = 0; ++ ++ if (duplex_chg_out) ++ *duplex_chg_out = 0; ++ ++ mii_data->phy_id &= mii_if->phy_id_mask; ++ mii_data->reg_num &= mii_if->reg_num_mask; ++ ++ switch(cmd) { ++ case SIOCDEVPRIVATE: /* binary compat, remove in 2.5 */ ++ case SIOCGMIIPHY: ++ mii_data->phy_id = mii_if->phy_id; ++ /* fall through */ ++ ++ case SIOCDEVPRIVATE + 1:/* binary compat, remove in 2.5 */ ++ case SIOCGMIIREG: ++ mii_data->val_out = ++ mii_if->mdio_read(mii_if->dev, mii_data->phy_id, ++ mii_data->reg_num); ++ break; ++ ++ case SIOCDEVPRIVATE + 2:/* binary compat, remove in 2.5 */ ++ case SIOCSMIIREG: { ++ u16 val = mii_data->val_in; ++ ++ if (!capable(CAP_NET_ADMIN)) ++ return -EPERM; ++ ++ if (mii_data->phy_id == mii_if->phy_id) { ++ switch(mii_data->reg_num) { ++ case MII_BMCR: { ++ unsigned int new_duplex = 0; ++ if (val & (BMCR_RESET|BMCR_ANENABLE)) ++ mii_if->force_media = 0; ++ else ++ mii_if->force_media = 1; ++ if (mii_if->force_media && ++ (val & BMCR_FULLDPLX)) ++ new_duplex = 1; ++ if (mii_if->full_duplex != new_duplex) { ++ duplex_changed = 1; ++ mii_if->full_duplex = new_duplex; ++ } ++ break; ++ } ++ case MII_ADVERTISE: ++ mii_if->advertising = val; ++ break; ++ default: ++ /* do nothing */ ++ break; ++ } ++ } ++ ++ mii_if->mdio_write(mii_if->dev, mii_data->phy_id, ++ mii_data->reg_num, val); ++ break; ++ } ++ ++ default: ++ rc = -EOPNOTSUPP; ++ break; ++ } ++ ++ if ((rc == 0) && (duplex_chg_out) && (duplex_changed)) ++ *duplex_chg_out = 1; ++ ++ return rc; ++} ++ diff --git a/master/increase-nr-dynirq b/master/increase-nr-dynirq new file mode 100644 index 0000000..ba23cd7 --- /dev/null +++ b/master/increase-nr-dynirq @@ -0,0 +1,12 @@ +diff -r 29c808922149 include/asm-x86/mach-xen/asm/irq_vectors.h +--- a/include/asm-x86/mach-xen/asm/irq_vectors.h Wed Jun 17 11:23:13 2009 +0100 ++++ b/include/asm-x86/mach-xen/asm/irq_vectors.h Wed Jun 17 11:27:48 2009 +0100 +@@ -44,7 +44,7 @@ + #endif + + #define DYNIRQ_BASE (PIRQ_BASE + NR_PIRQS) +-#define NR_DYNIRQS 256 ++#define NR_DYNIRQS 768 + + #define NR_IRQS (NR_PIRQS + NR_DYNIRQS) + #define NR_IRQ_VECTORS NR_IRQS diff --git a/master/intel-net-driver-kcompat.patch b/master/intel-net-driver-kcompat.patch index 5c2e29f..83ca72b 100644 --- a/master/intel-net-driver-kcompat.patch +++ b/master/intel-net-driver-kcompat.patch @@ -1,7 +1,7 @@ -diff -r ebcf85eb69e0 drivers/net/e1000/kcompat.h ---- a/drivers/net/e1000/kcompat.h Tue Feb 10 10:23:44 2009 +0000 -+++ b/drivers/net/e1000/kcompat.h Tue Feb 10 10:25:04 2009 +0000 -@@ -1407,9 +1407,9 @@ +diff -r 64a037056e9d drivers/net/e1000/kcompat.h +--- a/drivers/net/e1000/kcompat.h Mon Jun 15 12:06:27 2009 +0100 ++++ b/drivers/net/e1000/kcompat.h Mon Jun 15 13:38:57 2009 +0100 +@@ -1361,9 +1361,9 @@ #ifndef AX_RELEASE_VERSION #define AX_RELEASE_VERSION(a,b) 0 #endif @@ -11,13 +11,13 @@ diff -r ebcf85eb69e0 drivers/net/e1000/kcompat.h +//#if (!(( RHEL_RELEASE_CODE > RHEL_RELEASE_VERSION(4,4) ) && ( RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(5,0) ) || ( RHEL_RELEASE_CODE > RHEL_RELEASE_VERSION(5,0) ) || (AX_RELEASE_CODE > AX_RELEASE_VERSION(3,0)))) +//typedef irqreturn_t (*irq_handler_t)(int, void*, struct pt_regs *); +//#endif - typedef irqreturn_t (*new_handler_t)(int, void*); - static inline irqreturn_t _kc_request_irq(unsigned int irq, new_handler_t handler, unsigned long flags, const char *devname, void *dev_id) - #else /* 2.4.x */ -diff -r ebcf85eb69e0 drivers/net/e1000e/kcompat.h ---- a/drivers/net/e1000e/kcompat.h Tue Feb 10 10:23:44 2009 +0000 -+++ b/drivers/net/e1000e/kcompat.h Tue Feb 10 10:25:04 2009 +0000 -@@ -1365,9 +1365,9 @@ + #if (RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(6,0)) + #undef CONFIG_INET_LRO + #undef CONFIG_INET_LRO_MODULE +diff -r 64a037056e9d drivers/net/e1000e/kcompat.h +--- a/drivers/net/e1000e/kcompat.h Mon Jun 15 12:06:27 2009 +0100 ++++ b/drivers/net/e1000e/kcompat.h Mon Jun 15 13:38:57 2009 +0100 +@@ -1343,9 +1343,9 @@ #ifndef AX_RELEASE_VERSION #define AX_RELEASE_VERSION(a,b) 0 #endif @@ -27,13 +27,13 @@ diff -r ebcf85eb69e0 drivers/net/e1000e/kcompat.h +//#if (!(( RHEL_RELEASE_CODE > RHEL_RELEASE_VERSION(4,4) ) && ( RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(5,0) ) || ( RHEL_RELEASE_CODE > RHEL_RELEASE_VERSION(5,0) ) || (AX_RELEASE_CODE > AX_RELEASE_VERSION(3,0)))) +//typedef irqreturn_t (*irq_handler_t)(int, void*, struct pt_regs *); +//#endif - typedef irqreturn_t (*new_handler_t)(int, void*); - static inline irqreturn_t _kc_request_irq(unsigned int irq, new_handler_t handler, unsigned long flags, const char *devname, void *dev_id) - #else /* 2.4.x */ -diff -r ebcf85eb69e0 drivers/net/igb/kcompat.h ---- a/drivers/net/igb/kcompat.h Tue Feb 10 10:23:44 2009 +0000 -+++ b/drivers/net/igb/kcompat.h Tue Feb 10 10:25:04 2009 +0000 -@@ -1345,9 +1345,9 @@ + #if (RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(6,0)) + #undef CONFIG_INET_LRO + #undef CONFIG_INET_LRO_MODULE +diff -r 64a037056e9d drivers/net/igb/kcompat.h +--- a/drivers/net/igb/kcompat.h Mon Jun 15 12:06:27 2009 +0100 ++++ b/drivers/net/igb/kcompat.h Mon Jun 15 13:38:57 2009 +0100 +@@ -1344,9 +1344,9 @@ #ifndef AX_RELEASE_VERSION #define AX_RELEASE_VERSION(a,b) 0 #endif @@ -43,12 +43,12 @@ diff -r ebcf85eb69e0 drivers/net/igb/kcompat.h +//#if (!(( RHEL_RELEASE_CODE > RHEL_RELEASE_VERSION(4,4) ) && ( RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(5,0) ) || ( RHEL_RELEASE_CODE > RHEL_RELEASE_VERSION(5,0) ) || (AX_RELEASE_CODE > AX_RELEASE_VERSION(3,0)))) +//typedef irqreturn_t (*irq_handler_t)(int, void*, struct pt_regs *); +//#endif - typedef irqreturn_t (*new_handler_t)(int, void*); - static inline irqreturn_t _kc_request_irq(unsigned int irq, new_handler_t handler, unsigned long flags, const char *devname, void *dev_id) - #else /* 2.4.x */ -diff -r ebcf85eb69e0 drivers/net/ixgb/kcompat.h ---- a/drivers/net/ixgb/kcompat.h Tue Feb 10 10:23:44 2009 +0000 -+++ b/drivers/net/ixgb/kcompat.h Tue Feb 10 10:25:04 2009 +0000 + #if (RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(6,0)) + #undef CONFIG_INET_LRO + #undef CONFIG_INET_LRO_MODULE +diff -r 64a037056e9d drivers/net/ixgb/kcompat.h +--- a/drivers/net/ixgb/kcompat.h Mon Jun 15 12:06:27 2009 +0100 ++++ b/drivers/net/ixgb/kcompat.h Mon Jun 15 13:38:57 2009 +0100 @@ -1359,9 +1359,9 @@ #ifndef RHEL_RELEASE_VERSION #define RHEL_RELEASE_VERSION(a,b) 0 @@ -62,10 +62,10 @@ diff -r ebcf85eb69e0 drivers/net/ixgb/kcompat.h typedef irqreturn_t (*new_handler_t)(int, void*); static inline irqreturn_t _kc_request_irq(unsigned int irq, new_handler_t handler, unsigned long flags, const char *devname, void *dev_id) #else /* 2.4.x */ -diff -r ebcf85eb69e0 drivers/net/ixgbe/kcompat.h ---- a/drivers/net/ixgbe/kcompat.h Tue Feb 10 10:23:44 2009 +0000 -+++ b/drivers/net/ixgbe/kcompat.h Tue Feb 10 10:25:04 2009 +0000 -@@ -1426,9 +1426,9 @@ +diff -r 64a037056e9d drivers/net/ixgbe/kcompat.h +--- a/drivers/net/ixgbe/kcompat.h Mon Jun 15 12:06:27 2009 +0100 ++++ b/drivers/net/ixgbe/kcompat.h Mon Jun 15 13:38:57 2009 +0100 +@@ -1373,9 +1373,9 @@ #ifndef AX_RELEASE_VERSION #define AX_RELEASE_VERSION(a,b) 0 #endif @@ -75,6 +75,6 @@ diff -r ebcf85eb69e0 drivers/net/ixgbe/kcompat.h +//#if (!(( RHEL_RELEASE_CODE > RHEL_RELEASE_VERSION(4,4) ) && ( RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(5,0) ) || ( RHEL_RELEASE_CODE > RHEL_RELEASE_VERSION(5,0) ) || (AX_RELEASE_CODE > AX_RELEASE_VERSION(3,0)))) +//typedef irqreturn_t (*irq_handler_t)(int, void*, struct pt_regs *); +//#endif - #if (RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(5,0)) + #if (RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(6,0)) #undef CONFIG_INET_LRO #undef CONFIG_INET_LRO_MODULE diff --git a/master/ixgbe-2.0.34.3.patch b/master/ixgbe-2.0.34.3.patch new file mode 100644 index 0000000..18d9d0f --- /dev/null +++ b/master/ixgbe-2.0.34.3.patch @@ -0,0 +1,26561 @@ +diff -r 3e5bbd731d89 drivers/net/Kconfig +--- a/drivers/net/Kconfig Mon Jun 15 12:00:22 2009 +0100 ++++ b/drivers/net/Kconfig Mon Jun 15 12:06:28 2009 +0100 +@@ -2417,16 +2417,6 @@ + + If in doubt, say N. + +-config IXGBE_DCB +- bool "Data Center Bridging (DCB) Support" +- default n +- depends on IXGBE && DCB +- ---help--- +- Say Y here if you want to use Data Center Bridging (DCB) in the +- driver. +- +- If unsure, say N. +- + config IXGB + tristate "Intel(R) PRO/10GbE support" + depends on PCI +diff -r 3e5bbd731d89 drivers/net/ixgbe/Makefile +--- a/drivers/net/ixgbe/Makefile Mon Jun 15 12:00:22 2009 +0100 ++++ b/drivers/net/ixgbe/Makefile Mon Jun 15 12:06:28 2009 +0100 +@@ -32,7 +32,11 @@ + + obj-$(CONFIG_IXGBE) += ixgbe.o + +-ixgbe-objs := ixgbe_main.o ixgbe_common.o ixgbe_ethtool.o \ +- ixgbe_82598.o ixgbe_phy.o ++CFILES = ixgbe_main.c ixgbe_common.c ixgbe_api.c ixgbe_param.c \ ++ ixgbe_ethtool.c kcompat.c ixgbe_82598.c ixgbe_82599.c \ ++ ixgbe_dcb.c ixgbe_dcb_nl.c ixgbe_dcb_82598.c ixgbe_dcb_82599.c \ ++ ixgbe_phy.c ixgbe_sysfs.c + +-ixgbe-$(CONFIG_IXGBE_DCB) += ixgbe_dcb.o ixgbe_dcb_82598.o ixgbe_dcb_nl.o ++ixgbe-objs := $(CFILES:.c=.o) ++ ++EXTRA_CFLAGS += -DDRIVER_IXGBE -DIXGBE_NO_LRO +diff -r 3e5bbd731d89 drivers/net/ixgbe/ixgbe.h +--- a/drivers/net/ixgbe/ixgbe.h Mon Jun 15 12:00:22 2009 +0100 ++++ b/drivers/net/ixgbe/ixgbe.h Mon Jun 15 12:06:28 2009 +0100 +@@ -1,7 +1,7 @@ + /******************************************************************************* + + Intel 10 Gigabit PCI Express Linux driver +- Copyright(c) 1999 - 2008 Intel Corporation. ++ Copyright(c) 1999 - 2009 Intel Corporation. + + This program is free software; you can redistribute it and/or modify it + under the terms and conditions of the GNU General Public License, +@@ -28,23 +28,33 @@ + #ifndef _IXGBE_H_ + #define _IXGBE_H_ + +-#include ++#ifndef IXGBE_NO_LRO ++#include ++#endif ++ + #include + #include ++#include + +-#ifdef CONFIG_IXGBE_LRO +-#include +-#define IXGBE_MAX_LRO_AGGREGATE 32 +-#define IXGBE_MAX_LRO_DESCRIPTORS 8 ++#ifdef SIOCETHTOOL ++#include ++#endif ++#ifdef NETIF_F_HW_VLAN_TX ++#include ++#endif ++#if defined(CONFIG_DCA) || defined(CONFIG_DCA_MODULE) ++#define IXGBE_DCA ++#include ++ + #endif + +-#include "ixgbe_type.h" +-#include "ixgbe_common.h" + #include "ixgbe_dcb.h" + +-#if defined(CONFIG_DCA) || defined(CONFIG_DCA_MODULE) +-#include +-#endif ++ ++#include "kcompat.h" ++ ++ ++#include "ixgbe_api.h" + + #define PFX "ixgbe: " + #define DPRINTK(nlevel, klevel, fmt, args...) \ +@@ -60,6 +70,7 @@ + #define IXGBE_DEFAULT_RXD 1024 + #define IXGBE_MAX_RXD 4096 + #define IXGBE_MIN_RXD 64 ++ + + /* flow control */ + #define IXGBE_DEFAULT_FCRTL 0x10000 +@@ -77,11 +88,18 @@ + #define IXGBE_RXBUFFER_128 128 /* Used for packet split */ + #define IXGBE_RXBUFFER_256 256 /* Used for packet split */ + #define IXGBE_RXBUFFER_2048 2048 +-#define IXGBE_MAX_RXBUFFER 16384 /* largest size for a single descriptor */ ++#define IXGBE_RXBUFFER_4096 4096 ++#define IXGBE_RXBUFFER_8192 8192 ++#define IXGBE_MAX_RXBUFFER 16384 /* largest size for single descriptor */ + + #define IXGBE_RX_HDR_SIZE IXGBE_RXBUFFER_256 + +-#define MAXIMUM_ETHERNET_VLAN_SIZE (ETH_FRAME_LEN + ETH_FCS_LEN + VLAN_HLEN) ++#define MAXIMUM_ETHERNET_VLAN_SIZE (VLAN_ETH_FRAME_LEN + ETH_FCS_LEN) ++ ++#if defined(IXGBE_DCB) || defined(IXGBE_RSS) || \ ++ defined(IXGBE_VMDQ) ++#define IXGBE_MQ ++#endif + + /* How many Rx Buffers do we bundle into one write to the hardware ? */ + #define IXGBE_RX_BUFFER_WRITE 16 /* Must be power of 2 */ +@@ -90,10 +108,50 @@ + #define IXGBE_TX_FLAGS_VLAN (u32)(1 << 1) + #define IXGBE_TX_FLAGS_TSO (u32)(1 << 2) + #define IXGBE_TX_FLAGS_IPV4 (u32)(1 << 3) ++#define IXGBE_TX_FLAGS_FCOE (u32)(1 << 4) ++#define IXGBE_TX_FLAGS_FSO (u32)(1 << 5) + #define IXGBE_TX_FLAGS_VLAN_MASK 0xffff0000 + #define IXGBE_TX_FLAGS_VLAN_PRIO_MASK 0x0000e000 + #define IXGBE_TX_FLAGS_VLAN_SHIFT 16 + ++#ifndef IXGBE_NO_LRO ++#define IXGBE_LRO_MAX 32 /*Maximum number of LRO descriptors*/ ++#define IXGBE_LRO_GLOBAL 10 ++ ++struct ixgbe_lro_stats { ++ u32 flushed; ++ u32 coal; ++ u32 recycled; ++}; ++ ++struct ixgbe_lro_desc { ++ struct hlist_node lro_node; ++ struct sk_buff *skb; ++ u32 source_ip; ++ u32 dest_ip; ++ u16 source_port; ++ u16 dest_port; ++ u16 vlan_tag; ++ u16 len; ++ u32 next_seq; ++ u32 ack_seq; ++ u16 window; ++ u16 mss; ++ u16 opt_bytes; ++ u16 psh:1; ++ u32 tsval; ++ u32 tsecr; ++ u32 append_cnt; ++}; ++ ++struct ixgbe_lro_list { ++ struct hlist_head active; ++ struct hlist_head free; ++ int active_cnt; ++ struct ixgbe_lro_stats stats; ++}; ++ ++#endif /* IXGBE_NO_LRO */ + /* wrapper around a pointer to a socket buffer, + * so a DMA handle can be stored along with the buffer */ + struct ixgbe_tx_buffer { +@@ -119,17 +177,18 @@ + + struct ixgbe_ring { + void *desc; /* descriptor ring memory */ +- dma_addr_t dma; /* phys. address of descriptor ring */ +- unsigned int size; /* length in bytes */ +- unsigned int count; /* amount of descriptors */ +- unsigned int next_to_use; +- unsigned int next_to_clean; +- +- int queue_index; /* needed for multiqueue queue management */ + union { + struct ixgbe_tx_buffer *tx_buffer_info; + struct ixgbe_rx_buffer *rx_buffer_info; + }; ++ u8 atr_sample_rate; ++ u8 atr_count; ++ u16 count; /* amount of descriptors */ ++ u16 rx_buf_len; ++ u16 next_to_use; ++ u16 next_to_clean; ++ ++ u8 queue_index; /* needed for multiqueue queue management */ + + u16 head; + u16 tail; +@@ -137,44 +196,46 @@ + unsigned int total_bytes; + unsigned int total_packets; + +- u16 reg_idx; /* holds the special value that gets the hardware register +- * offset associated with this ring, which is different +- * for DCB and RSS modes */ +- + #if defined(CONFIG_DCA) || defined(CONFIG_DCA_MODULE) + /* cpu for tx queue */ + int cpu; + #endif +-#ifdef CONFIG_IXGBE_LRO +- struct net_lro_mgr lro_mgr; +- bool lro_used; +-#endif ++ u16 work_limit; /* max work per interrupt */ ++ u16 reg_idx; /* holds the special value that gets the ++ * hardware register offset associated ++ * with this ring, which is different ++ * for DCB and RSS modes */ ++ + struct ixgbe_queue_stats stats; +- u16 v_idx; /* maps directly to the index for this ring in the hardware +- * vector array, can also be used for finding the bit in EICR +- * and friends that represents the vector for this ring */ +- +- +- u16 work_limit; /* max work per interrupt */ +- u16 rx_buf_len; ++ unsigned long reinit_state; ++ u64 rsc_count; /* stat for coalesced packets */ ++ unsigned int size; /* length in bytes */ ++ dma_addr_t dma; /* phys. address of descriptor ring */ + }; + +-#define RING_F_DCB 0 +-#define RING_F_VMDQ 1 +-#define RING_F_RSS 2 ++enum ixgbe_ring_f_enum { ++ RING_F_NONE = 0, ++ RING_F_DCB, ++ RING_F_VMDQ, ++ RING_F_RSS, ++ RING_F_FDIR, ++ RING_F_ARRAY_SIZE /* must be last in enum set */ ++}; ++ + #define IXGBE_MAX_DCB_INDICES 8 + #define IXGBE_MAX_RSS_INDICES 16 +-#define IXGBE_MAX_VMDQ_INDICES 16 ++#define IXGBE_MAX_VMDQ_INDICES 64 ++#define IXGBE_MAX_FDIR_INDICES 64 + struct ixgbe_ring_feature { + int indices; + int mask; + }; + +-#define MAX_RX_QUEUES 64 +-#define MAX_TX_QUEUES 32 ++#define MAX_RX_QUEUES 128 ++#define MAX_TX_QUEUES 128 + + #define MAX_RX_PACKET_BUFFERS ((adapter->flags & IXGBE_FLAG_DCB_ENABLED) \ +- ? 8 : 1) ++ ? 8 : 1) + #define MAX_TX_PACKET_BUFFERS MAX_RX_PACKET_BUFFERS + + /* MAX_MSIX_Q_VECTORS of these are allocated, +@@ -182,7 +243,12 @@ + */ + struct ixgbe_q_vector { + struct ixgbe_adapter *adapter; ++ unsigned int v_idx; /* index of q_vector within array, also used for ++ * finding the bit in EICR and friends that ++ * represents the vector for this ring */ ++#ifdef CONFIG_IXGBE_NAPI + struct napi_struct napi; ++#endif + DECLARE_BITMAP(rxr_idx, MAX_RX_QUEUES); /* Rx ring indices */ + DECLARE_BITMAP(txr_idx, MAX_TX_QUEUES); /* Tx ring indices */ + u8 rxr_count; /* Rx ring count assigned to this vector */ +@@ -190,13 +256,19 @@ + u8 tx_itr; + u8 rx_itr; + u32 eitr; ++#ifndef IXGBE_NO_LRO ++ struct ixgbe_lro_list *lrolist; /* LRO list for queue vector*/ ++#endif ++ char name[IFNAMSIZ + 9]; + }; + ++ + /* Helper macros to switch between ints/sec and what the register uses. +- * And yes, it's the same math going both ways. ++ * And yes, it's the same math going both ways. The lowest value ++ * supported by all of the ixgbe hardware is 8. + */ + #define EITR_INTS_PER_SEC_TO_REG(_eitr) \ +- ((_eitr) ? (1000000000 / ((_eitr) * 256)) : 0) ++ ((_eitr) ? (1000000000 / ((_eitr) * 256)) : 8) + #define EITR_REG_TO_INTS_PER_SEC EITR_INTS_PER_SEC_TO_REG + + #define IXGBE_DESC_UNUSED(R) \ +@@ -209,28 +281,50 @@ + (&(((union ixgbe_adv_tx_desc *)((R).desc))[i])) + #define IXGBE_TX_CTXTDESC_ADV(R, i) \ + (&(((struct ixgbe_adv_tx_context_desc *)((R).desc))[i])) ++#define IXGBE_GET_DESC(R, i, type) (&(((struct type *)((R).desc))[i])) ++#define IXGBE_TX_DESC(R, i) IXGBE_GET_DESC(R, i, ixgbe_legacy_tx_desc) ++#define IXGBE_RX_DESC(R, i) IXGBE_GET_DESC(R, i, ixgbe_legacy_rx_desc) + + #define IXGBE_MAX_JUMBO_FRAME_SIZE 16128 + ++#ifdef IXGBE_TCP_TIMER ++#define TCP_TIMER_VECTOR 1 ++#else ++#define TCP_TIMER_VECTOR 0 ++#endif + #define OTHER_VECTOR 1 +-#define NON_Q_VECTORS (OTHER_VECTOR) ++#define NON_Q_VECTORS (OTHER_VECTOR + TCP_TIMER_VECTOR) + +-#define MAX_MSIX_Q_VECTORS 16 ++#define IXGBE_MAX_MSIX_VECTORS_82599 64 ++#define IXGBE_MAX_MSIX_Q_VECTORS_82599 64 ++#define IXGBE_MAX_MSIX_Q_VECTORS_82598 16 ++#define IXGBE_MAX_MSIX_VECTORS_82598 18 ++ ++/* ++ * Only for array allocations in our adapter struct. On 82598, there will be ++ * unused entries in the array, but that's not a big deal. Also, in 82599, ++ * we can actually assign 64 queue vectors based on our extended-extended ++ * interrupt registers. This is different than 82598, which is limited to 16. ++ */ ++#define MAX_MSIX_Q_VECTORS IXGBE_MAX_MSIX_Q_VECTORS_82599 ++#define MAX_MSIX_COUNT IXGBE_MAX_MSIX_VECTORS_82599 ++ + #define MIN_MSIX_Q_VECTORS 2 +-#define MAX_MSIX_COUNT (MAX_MSIX_Q_VECTORS + NON_Q_VECTORS) + #define MIN_MSIX_COUNT (MIN_MSIX_Q_VECTORS + NON_Q_VECTORS) + + /* board specific private data structure */ + struct ixgbe_adapter { + struct timer_list watchdog_timer; ++#ifdef NETIF_F_HW_VLAN_TX + struct vlan_group *vlgrp; ++#endif + u16 bd_number; + struct work_struct reset_task; +- struct ixgbe_q_vector q_vector[MAX_MSIX_Q_VECTORS]; +- char name[MAX_MSIX_COUNT][IFNAMSIZ + 5]; ++ struct ixgbe_q_vector *q_vector[MAX_MSIX_Q_VECTORS]; + struct ixgbe_dcb_config dcb_cfg; + struct ixgbe_dcb_config temp_dcb_cfg; + u8 dcb_set_bitmap; ++ enum ixgbe_fc_mode last_lfc_mode; + + /* Interrupt Throttle Rate */ + u32 itr_setting; +@@ -251,14 +345,24 @@ + /* RX */ + struct ixgbe_ring *rx_ring; /* One per active queue */ + int num_rx_queues; ++ int num_rx_pools; /* == num_rx_queues in 82598 */ ++ int num_rx_queues_per_pool; /* 1 if 82598, can be many if 82599 */ + u64 hw_csum_rx_error; ++ u64 hw_rx_no_dma_resources; + u64 hw_csum_rx_good; + u64 non_eop_descs; ++#ifndef CONFIG_IXGBE_NAPI ++ u64 rx_dropped_backlog; /* count drops from rx intr handler */ ++#endif + int num_msix_vectors; +- struct ixgbe_ring_feature ring_feature[3]; ++ int max_msix_q_vectors; /* true count of q_vectors for device */ ++ struct ixgbe_ring_feature ring_feature[RING_F_ARRAY_SIZE]; + struct msix_entry *msix_entries; ++#ifdef IXGBE_TCP_TIMER ++ irqreturn_t (*msix_handlers[MAX_MSIX_COUNT])(int irq, void *data, ++ struct pt_regs *regs); ++#endif + +- u64 rx_hdr_split; + u32 alloc_rx_page_failed; + u32 alloc_rx_buff_failed; + +@@ -271,14 +375,19 @@ + #define IXGBE_FLAG_MSI_ENABLED (u32)(1 << 2) + #define IXGBE_FLAG_MSIX_CAPABLE (u32)(1 << 3) + #define IXGBE_FLAG_MSIX_ENABLED (u32)(1 << 4) ++#ifndef IXGBE_NO_LLI ++#define IXGBE_FLAG_LLI_PUSH (u32)(1 << 5) ++#endif + #define IXGBE_FLAG_RX_1BUF_CAPABLE (u32)(1 << 6) + #define IXGBE_FLAG_RX_PS_CAPABLE (u32)(1 << 7) + #define IXGBE_FLAG_RX_PS_ENABLED (u32)(1 << 8) + #define IXGBE_FLAG_IN_NETPOLL (u32)(1 << 9) + #define IXGBE_FLAG_DCA_ENABLED (u32)(1 << 10) + #define IXGBE_FLAG_DCA_CAPABLE (u32)(1 << 11) +-#define IXGBE_FLAG_IMIR_ENABLED (u32)(1 << 12) ++#define IXGBE_FLAG_DCA_ENABLED_DATA (u32)(1 << 12) + #define IXGBE_FLAG_MQ_CAPABLE (u32)(1 << 13) ++#define IXGBE_FLAG_DCB_ENABLED (u32)(1 << 14) ++#define IXGBE_FLAG_DCB_CAPABLE (u32)(1 << 15) + #define IXGBE_FLAG_RSS_ENABLED (u32)(1 << 16) + #define IXGBE_FLAG_RSS_CAPABLE (u32)(1 << 17) + #define IXGBE_FLAG_VMDQ_CAPABLE (u32)(1 << 18) +@@ -286,8 +395,19 @@ + #define IXGBE_FLAG_FAN_FAIL_CAPABLE (u32)(1 << 20) + #define IXGBE_FLAG_NEED_LINK_UPDATE (u32)(1 << 22) + #define IXGBE_FLAG_IN_WATCHDOG_TASK (u32)(1 << 23) +-#define IXGBE_FLAG_DCB_ENABLED (u32)(1 << 24) +- ++#define IXGBE_FLAG_IN_SFP_LINK_TASK (u32)(1 << 24) ++#define IXGBE_FLAG_IN_SFP_MOD_TASK (u32)(1 << 25) ++#define IXGBE_FLAG_FDIR_HASH_CAPABLE (u32)(1 << 26) ++#define IXGBE_FLAG_FDIR_PERFECT_CAPABLE (u32)(1 << 27) ++ u32 flags2; ++#ifndef IXGBE_NO_HW_RSC ++#define IXGBE_FLAG2_RSC_CAPABLE (u32)(1) ++#define IXGBE_FLAG2_RSC_ENABLED (u32)(1 << 1) ++#endif /* IXGBE_NO_HW_RSC */ ++#ifndef IXGBE_NO_LRO ++#define IXGBE_FLAG2_SWLRO_ENABLED (u32)(1 << 2) ++#endif /* IXGBE_NO_LRO */ ++#define IXGBE_FLAG2_VMDQ_DEFAULT_OVERRIDE (u32)(1 << 3) + /* default to trying for four seconds */ + #define IXGBE_TRY_LINK_TIMEOUT (4 * HZ) + +@@ -295,22 +415,33 @@ + struct net_device *netdev; + struct pci_dev *pdev; + struct net_device_stats net_stats; ++#ifndef IXGBE_NO_LRO ++ struct ixgbe_lro_stats lro_stats; ++#endif ++ ++#ifdef ETHTOOL_TEST ++ u32 test_icr; ++ struct ixgbe_ring test_tx_ring; ++ struct ixgbe_ring test_rx_ring; ++#endif + + /* structs defined in ixgbe_hw.h */ + struct ixgbe_hw hw; + u16 msg_enable; + struct ixgbe_hw_stats stats; +- ++#ifndef IXGBE_NO_LLI ++ u32 lli_port; ++ u32 lli_size; ++ u64 lli_int; ++ u32 lli_etype; ++ u32 lli_vlan_pri; ++#endif /* IXGBE_NO_LLI */ + /* Interrupt Throttle Rate */ + u32 eitr_param; + + unsigned long state; ++ u32 *config_space; + u64 tx_busy; +-#ifndef IXGBE_NO_INET_LRO +- u64 lro_aggregated; +- u64 lro_flushed; +- u64 lro_no_desc; +-#endif + unsigned int tx_ring_count; + unsigned int rx_ring_count; + +@@ -321,28 +452,43 @@ + struct work_struct watchdog_task; + struct work_struct sfp_task; + struct timer_list sfp_timer; ++ struct work_struct multispeed_fiber_task; ++ struct work_struct sfp_config_module_task; ++ u64 flm; ++ u32 fdir_pballoc; ++ u32 atr_sample_rate; ++ spinlock_t fdir_perfect_lock; ++ struct work_struct fdir_reinit_task; ++ u64 rsc_count; ++ u32 wol; ++ u16 eeprom_version; ++ bool netdev_registered; ++ char lsc_int_name[IFNAMSIZ + 9]; ++#ifdef IXGBE_TCP_TIMER ++ char tcp_timer_name[IFNAMSIZ + 9]; ++#endif + }; + + enum ixbge_state_t { + __IXGBE_TESTING, + __IXGBE_RESETTING, + __IXGBE_DOWN, ++ __IXGBE_FDIR_INIT_DONE, + __IXGBE_SFP_MODULE_NOT_FOUND + }; + +-enum ixgbe_boards { +- board_82598, +-}; +- +-extern struct ixgbe_info ixgbe_82598_info; +-#ifdef CONFIG_DCBNL ++#ifdef CONFIG_DCB + extern struct dcbnl_rtnl_ops dcbnl_ops; + extern int ixgbe_copy_dcb_cfg(struct ixgbe_dcb_config *src_dcb_cfg, + struct ixgbe_dcb_config *dst_dcb_cfg, int tc_max); + #endif + ++/* needed by ixgbe_main.c */ ++extern int ixgbe_validate_mac_addr(u8 *mc_addr); ++extern void ixgbe_check_options(struct ixgbe_adapter *adapter); ++extern void ixgbe_assign_netdev_ops(struct net_device *netdev); + +- ++/* needed by ixgbe_ethtool.c */ + extern char ixgbe_driver_name[]; + extern const char ixgbe_driver_version[]; + +@@ -351,13 +497,21 @@ + extern void ixgbe_reinit_locked(struct ixgbe_adapter *adapter); + extern void ixgbe_reset(struct ixgbe_adapter *adapter); + extern void ixgbe_set_ethtool_ops(struct net_device *netdev); +-extern int ixgbe_setup_rx_resources(struct ixgbe_adapter *, struct ixgbe_ring *); +-extern int ixgbe_setup_tx_resources(struct ixgbe_adapter *, struct ixgbe_ring *); +-extern void ixgbe_free_rx_resources(struct ixgbe_adapter *, struct ixgbe_ring *); +-extern void ixgbe_free_tx_resources(struct ixgbe_adapter *, struct ixgbe_ring *); ++extern int ixgbe_setup_rx_resources(struct ixgbe_adapter *,struct ixgbe_ring *); ++extern int ixgbe_setup_tx_resources(struct ixgbe_adapter *,struct ixgbe_ring *); ++extern void ixgbe_free_rx_resources(struct ixgbe_adapter *,struct ixgbe_ring *); ++extern void ixgbe_free_tx_resources(struct ixgbe_adapter *,struct ixgbe_ring *); + extern void ixgbe_update_stats(struct ixgbe_adapter *adapter); +-extern void ixgbe_reset_interrupt_capability(struct ixgbe_adapter *adapter); + extern int ixgbe_init_interrupt_scheme(struct ixgbe_adapter *adapter); +-void ixgbe_napi_add_all(struct ixgbe_adapter *adapter); +-void ixgbe_napi_del_all(struct ixgbe_adapter *adapter); ++extern void ixgbe_clear_interrupt_scheme(struct ixgbe_adapter *adapter); ++extern bool ixgbe_is_ixgbe(struct pci_dev *pcidev); ++ ++#ifdef ETHTOOL_OPS_COMPAT ++extern int ethtool_ioctl(struct ifreq *ifr); ++ ++#endif ++extern int ixgbe_dcb_netlink_register(void); ++extern int ixgbe_dcb_netlink_unregister(void); ++ ++ + #endif /* _IXGBE_H_ */ +diff -r 3e5bbd731d89 drivers/net/ixgbe/ixgbe_82598.c +--- a/drivers/net/ixgbe/ixgbe_82598.c Mon Jun 15 12:00:22 2009 +0100 ++++ b/drivers/net/ixgbe/ixgbe_82598.c Mon Jun 15 12:06:28 2009 +0100 +@@ -1,7 +1,7 @@ + /******************************************************************************* + + Intel 10 Gigabit PCI Express Linux driver +- Copyright(c) 1999 - 2008 Intel Corporation. ++ Copyright(c) 1999 - 2009 Intel Corporation. + + This program is free software; you can redistribute it and/or modify it + under the terms and conditions of the GNU General Public License, +@@ -25,44 +25,165 @@ + + *******************************************************************************/ + +-#include +-#include +-#include +- +-#include "ixgbe.h" ++#include "ixgbe_type.h" ++#include "ixgbe_api.h" ++#include "ixgbe_common.h" + #include "ixgbe_phy.h" + +-#define IXGBE_82598_MAX_TX_QUEUES 32 +-#define IXGBE_82598_MAX_RX_QUEUES 64 +-#define IXGBE_82598_RAR_ENTRIES 16 +-#define IXGBE_82598_MC_TBL_SIZE 128 +-#define IXGBE_82598_VFT_TBL_SIZE 128 +- +-static s32 ixgbe_get_copper_link_capabilities_82598(struct ixgbe_hw *hw, ++u32 ixgbe_get_pcie_msix_count_82598(struct ixgbe_hw *hw); ++s32 ixgbe_init_ops_82598(struct ixgbe_hw *hw); ++static s32 ixgbe_get_link_capabilities_82598(struct ixgbe_hw *hw, + ixgbe_link_speed *speed, + bool *autoneg); ++static enum ixgbe_media_type ixgbe_get_media_type_82598(struct ixgbe_hw *hw); ++s32 ixgbe_fc_enable_82598(struct ixgbe_hw *hw, s32 packetbuf_num); ++static s32 ixgbe_setup_mac_link_82598(struct ixgbe_hw *hw); ++static s32 ixgbe_check_mac_link_82598(struct ixgbe_hw *hw, ++ ixgbe_link_speed *speed, bool *link_up, ++ bool link_up_wait_to_complete); ++static s32 ixgbe_setup_mac_link_speed_82598(struct ixgbe_hw *hw, ++ ixgbe_link_speed speed, ++ bool autoneg, ++ bool autoneg_wait_to_complete); + static s32 ixgbe_setup_copper_link_82598(struct ixgbe_hw *hw); + static s32 ixgbe_setup_copper_link_speed_82598(struct ixgbe_hw *hw, + ixgbe_link_speed speed, + bool autoneg, + bool autoneg_wait_to_complete); +-static s32 ixgbe_read_i2c_eeprom_82598(struct ixgbe_hw *hw, u8 byte_offset, +- u8 *eeprom_data); ++static s32 ixgbe_reset_hw_82598(struct ixgbe_hw *hw); ++s32 ixgbe_set_vmdq_82598(struct ixgbe_hw *hw, u32 rar, u32 vmdq); ++static s32 ixgbe_clear_vmdq_82598(struct ixgbe_hw *hw, u32 rar, u32 vmdq); ++s32 ixgbe_set_vfta_82598(struct ixgbe_hw *hw, u32 vlan, ++ u32 vind, bool vlan_on); ++static s32 ixgbe_clear_vfta_82598(struct ixgbe_hw *hw); ++s32 ixgbe_read_analog_reg8_82598(struct ixgbe_hw *hw, u32 reg, u8 *val); ++s32 ixgbe_write_analog_reg8_82598(struct ixgbe_hw *hw, u32 reg, u8 val); ++s32 ixgbe_read_i2c_eeprom_82598(struct ixgbe_hw *hw, u8 byte_offset, ++ u8 *eeprom_data); ++u32 ixgbe_get_supported_physical_layer_82598(struct ixgbe_hw *hw); ++s32 ixgbe_init_phy_ops_82598(struct ixgbe_hw *hw); ++void ixgbe_set_lan_id_multi_port_pcie_82598(struct ixgbe_hw *hw); ++ + + /** +- */ +-static s32 ixgbe_get_invariants_82598(struct ixgbe_hw *hw) ++ * ixgbe_get_pcie_msix_count_82598 - Gets MSI-X vector count ++ * @hw: pointer to hardware structure ++ * ++ * Read PCIe configuration space, and get the MSI-X vector count from ++ * the capabilities table. ++ **/ ++u32 ixgbe_get_pcie_msix_count_82598(struct ixgbe_hw *hw) ++{ ++ u32 msix_count = 18; ++ ++ if (hw->mac.msix_vectors_from_pcie) { ++ msix_count = IXGBE_READ_PCIE_WORD(hw, ++ IXGBE_PCIE_MSIX_82598_CAPS); ++ msix_count &= IXGBE_PCIE_MSIX_TBL_SZ_MASK; ++ ++ /* MSI-X count is zero-based in HW, so increment to give ++ * proper value */ ++ msix_count++; ++ } ++ return msix_count; ++} ++ ++/** ++ * ixgbe_init_ops_82598 - Inits func ptrs and MAC type ++ * @hw: pointer to hardware structure ++ * ++ * Initialize the function pointers and assign the MAC type for 82598. ++ * Does not touch the hardware. ++ **/ ++s32 ixgbe_init_ops_82598(struct ixgbe_hw *hw) ++{ ++ struct ixgbe_mac_info *mac = &hw->mac; ++ struct ixgbe_phy_info *phy = &hw->phy; ++ s32 ret_val; ++ ++ ret_val = ixgbe_init_phy_ops_generic(hw); ++ ret_val = ixgbe_init_ops_generic(hw); ++ ++ /* PHY */ ++ phy->ops.init = &ixgbe_init_phy_ops_82598; ++ ++ /* MAC */ ++ mac->ops.reset_hw = &ixgbe_reset_hw_82598; ++ mac->ops.get_media_type = &ixgbe_get_media_type_82598; ++ mac->ops.get_supported_physical_layer = ++ &ixgbe_get_supported_physical_layer_82598; ++ mac->ops.read_analog_reg8 = &ixgbe_read_analog_reg8_82598; ++ mac->ops.write_analog_reg8 = &ixgbe_write_analog_reg8_82598; ++ mac->ops.set_lan_id = &ixgbe_set_lan_id_multi_port_pcie_82598; ++ ++ /* RAR, Multicast, VLAN */ ++ mac->ops.set_vmdq = &ixgbe_set_vmdq_82598; ++ mac->ops.clear_vmdq = &ixgbe_clear_vmdq_82598; ++ mac->ops.set_vfta = &ixgbe_set_vfta_82598; ++ mac->ops.clear_vfta = &ixgbe_clear_vfta_82598; ++ ++ /* Flow Control */ ++ mac->ops.fc_enable = &ixgbe_fc_enable_82598; ++ ++ mac->mcft_size = 128; ++ mac->vft_size = 128; ++ mac->num_rar_entries = 16; ++ mac->max_tx_queues = 32; ++ mac->max_rx_queues = 64; ++ mac->max_msix_vectors = ixgbe_get_pcie_msix_count_82598(hw); ++ ++ /* SFP+ Module */ ++ phy->ops.read_i2c_eeprom = &ixgbe_read_i2c_eeprom_82598; ++ ++ /* Link */ ++ mac->ops.check_link = &ixgbe_check_mac_link_82598; ++ mac->ops.setup_link = &ixgbe_setup_mac_link_82598; ++ mac->ops.setup_link_speed = &ixgbe_setup_mac_link_speed_82598; ++ mac->ops.get_link_capabilities = ++ &ixgbe_get_link_capabilities_82598; ++ ++ return ret_val; ++} ++ ++/** ++ * ixgbe_init_phy_ops_82598 - PHY/SFP specific init ++ * @hw: pointer to hardware structure ++ * ++ * Initialize any function pointers that were not able to be ++ * set during init_shared_code because the PHY/SFP type was ++ * not known. Perform the SFP init if necessary. ++ * ++ **/ ++s32 ixgbe_init_phy_ops_82598(struct ixgbe_hw *hw) + { + struct ixgbe_mac_info *mac = &hw->mac; + struct ixgbe_phy_info *phy = &hw->phy; + s32 ret_val = 0; + u16 list_offset, data_offset; + +- /* Call PHY identify routine to get the phy type */ +- ixgbe_identify_phy_generic(hw); + +- /* PHY Init */ +- switch (phy->type) { ++ /* Identify the PHY */ ++ phy->ops.identify(hw); ++ ++ /* Overwrite the link function pointers if copper PHY */ ++ if (mac->ops.get_media_type(hw) == ixgbe_media_type_copper) { ++ mac->ops.setup_link = &ixgbe_setup_copper_link_82598; ++ mac->ops.setup_link_speed = ++ &ixgbe_setup_copper_link_speed_82598; ++ mac->ops.get_link_capabilities = ++ &ixgbe_get_copper_link_capabilities_generic; ++ } ++ ++ switch (hw->phy.type) { ++ case ixgbe_phy_tn: ++ phy->ops.check_link = &ixgbe_check_phy_link_tnx; ++ phy->ops.get_firmware_version = ++ &ixgbe_get_phy_firmware_version_tnx; ++ break; ++ case ixgbe_phy_aq: ++ phy->ops.get_firmware_version = ++ &ixgbe_get_phy_firmware_version_aq; ++ break; + case ixgbe_phy_nl: + phy->ops.reset = &ixgbe_reset_phy_nl; + +@@ -77,35 +198,16 @@ + + /* Check to see if SFP+ module is supported */ + ret_val = ixgbe_get_sfp_init_sequence_offsets(hw, +- &list_offset, +- &data_offset); ++ &list_offset, ++ &data_offset); + if (ret_val != 0) { + ret_val = IXGBE_ERR_SFP_NOT_SUPPORTED; + goto out; + } + break; +- case ixgbe_phy_tn: +- phy->ops.check_link = &ixgbe_check_phy_link_tnx; +- phy->ops.get_firmware_version = +- &ixgbe_get_phy_firmware_version_tnx; +- break; + default: + break; + } +- +- if (mac->ops.get_media_type(hw) == ixgbe_media_type_copper) { +- mac->ops.setup_link = &ixgbe_setup_copper_link_82598; +- mac->ops.setup_link_speed = +- &ixgbe_setup_copper_link_speed_82598; +- mac->ops.get_link_capabilities = +- &ixgbe_get_copper_link_capabilities_82598; +- } +- +- mac->mcft_size = IXGBE_82598_MC_TBL_SIZE; +- mac->vft_size = IXGBE_82598_VFT_TBL_SIZE; +- mac->num_rar_entries = IXGBE_82598_RAR_ENTRIES; +- mac->max_rx_queues = IXGBE_82598_MAX_RX_QUEUES; +- mac->max_tx_queues = IXGBE_82598_MAX_TX_QUEUES; + + out: + return ret_val; +@@ -124,18 +226,19 @@ + bool *autoneg) + { + s32 status = 0; +- s32 autoc_reg; ++ u32 autoc = 0; + +- autoc_reg = IXGBE_READ_REG(hw, IXGBE_AUTOC); ++ /* ++ * Determine link capabilities based on the stored value of AUTOC, ++ * which represents EEPROM defaults. If AUTOC value has not been ++ * stored, use the current register value. ++ */ ++ if (hw->mac.orig_link_settings_stored) ++ autoc = hw->mac.orig_autoc; ++ else ++ autoc = IXGBE_READ_REG(hw, IXGBE_AUTOC); + +- if (hw->mac.link_settings_loaded) { +- autoc_reg &= ~IXGBE_AUTOC_LMS_ATTACH_TYPE; +- autoc_reg &= ~IXGBE_AUTOC_LMS_MASK; +- autoc_reg |= hw->mac.link_attach_type; +- autoc_reg |= hw->mac.link_mode_select; +- } +- +- switch (autoc_reg & IXGBE_AUTOC_LMS_MASK) { ++ switch (autoc & IXGBE_AUTOC_LMS_MASK) { + case IXGBE_AUTOC_LMS_1G_LINK_NO_AN: + *speed = IXGBE_LINK_SPEED_1GB_FULL; + *autoneg = false; +@@ -154,9 +257,9 @@ + case IXGBE_AUTOC_LMS_KX4_AN: + case IXGBE_AUTOC_LMS_KX4_AN_1G_AN: + *speed = IXGBE_LINK_SPEED_UNKNOWN; +- if (autoc_reg & IXGBE_AUTOC_KX4_SUPP) ++ if (autoc & IXGBE_AUTOC_KX4_SUPP) + *speed |= IXGBE_LINK_SPEED_10GB_FULL; +- if (autoc_reg & IXGBE_AUTOC_KX_SUPP) ++ if (autoc & IXGBE_AUTOC_KX_SUPP) + *speed |= IXGBE_LINK_SPEED_1GB_FULL; + *autoneg = true; + break; +@@ -164,38 +267,6 @@ + default: + status = IXGBE_ERR_LINK_SETUP; + break; +- } +- +- return status; +-} +- +-/** +- * ixgbe_get_copper_link_capabilities_82598 - Determines link capabilities +- * @hw: pointer to hardware structure +- * @speed: pointer to link speed +- * @autoneg: boolean auto-negotiation value +- * +- * Determines the link capabilities by reading the AUTOC register. +- **/ +-s32 ixgbe_get_copper_link_capabilities_82598(struct ixgbe_hw *hw, +- ixgbe_link_speed *speed, +- bool *autoneg) +-{ +- s32 status = IXGBE_ERR_LINK_SETUP; +- u16 speed_ability; +- +- *speed = 0; +- *autoneg = true; +- +- status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_SPEED_ABILITY, +- IXGBE_MDIO_PMA_PMD_DEV_TYPE, +- &speed_ability); +- +- if (status == 0) { +- if (speed_ability & IXGBE_MDIO_PHY_SPEED_10G) +- *speed |= IXGBE_LINK_SPEED_10GB_FULL; +- if (speed_ability & IXGBE_MDIO_PHY_SPEED_1G) +- *speed |= IXGBE_LINK_SPEED_1GB_FULL; + } + + return status; +@@ -211,8 +282,21 @@ + { + enum ixgbe_media_type media_type; + ++ /* Detect if there is a copper PHY attached. */ ++ if (hw->phy.type == ixgbe_phy_cu_unknown || ++ hw->phy.type == ixgbe_phy_tn || ++ hw->phy.type == ixgbe_phy_aq) { ++ media_type = ixgbe_media_type_copper; ++ goto out; ++ } ++ + /* Media type for I82598 is based on device ID */ + switch (hw->device_id) { ++ case IXGBE_DEV_ID_82598: ++ case IXGBE_DEV_ID_82598_BX: ++ /* Default device ID is mezzanine card KX/KX4 */ ++ media_type = ixgbe_media_type_backplane; ++ break; + case IXGBE_DEV_ID_82598AF_DUAL_PORT: + case IXGBE_DEV_ID_82598AF_SINGLE_PORT: + case IXGBE_DEV_ID_82598EB_CX4: +@@ -230,109 +314,102 @@ + media_type = ixgbe_media_type_unknown; + break; + } +- ++out: + return media_type; + } + + /** +- * ixgbe_setup_fc_82598 - Configure flow control settings ++ * ixgbe_fc_enable_82598 - Enable flow control + * @hw: pointer to hardware structure + * @packetbuf_num: packet buffer number (0-7) + * +- * Configures the flow control settings based on SW configuration. This +- * function is used for 802.3x flow control configuration only. ++ * Enable flow control according to the current settings. + **/ +-s32 ixgbe_setup_fc_82598(struct ixgbe_hw *hw, s32 packetbuf_num) ++s32 ixgbe_fc_enable_82598(struct ixgbe_hw *hw, s32 packetbuf_num) + { +- u32 frctl_reg; ++ s32 ret_val = 0; ++ u32 fctrl_reg; + u32 rmcs_reg; ++ u32 reg; + +- if (packetbuf_num < 0 || packetbuf_num > 7) { +- hw_dbg(hw, "Invalid packet buffer number [%d], expected range is" +- " 0-7\n", packetbuf_num); +- } ++#ifdef CONFIG_DCB ++ if (hw->fc.requested_mode == ixgbe_fc_pfc) ++ goto out; + +- frctl_reg = IXGBE_READ_REG(hw, IXGBE_FCTRL); +- frctl_reg &= ~(IXGBE_FCTRL_RFCE | IXGBE_FCTRL_RPFCE); ++#endif /* CONFIG_DCB */ ++ /* Negotiate the fc mode to use */ ++ ret_val = ixgbe_fc_autoneg(hw); ++ if (ret_val) ++ goto out; ++ ++ /* Disable any previous flow control settings */ ++ fctrl_reg = IXGBE_READ_REG(hw, IXGBE_FCTRL); ++ fctrl_reg &= ~(IXGBE_FCTRL_RFCE | IXGBE_FCTRL_RPFCE); + + rmcs_reg = IXGBE_READ_REG(hw, IXGBE_RMCS); + rmcs_reg &= ~(IXGBE_RMCS_TFCE_PRIORITY | IXGBE_RMCS_TFCE_802_3X); + + /* +- * 10 gig parts do not have a word in the EEPROM to determine the +- * default flow control setting, so we explicitly set it to full. +- */ +- if (hw->fc.type == ixgbe_fc_default) +- hw->fc.type = ixgbe_fc_full; +- +- /* +- * We want to save off the original Flow Control configuration just in +- * case we get disconnected and then reconnected into a different hub +- * or switch with different Flow Control capabilities. +- */ +- hw->fc.original_type = hw->fc.type; +- +- /* +- * The possible values of the "flow_control" parameter are: ++ * The possible values of fc.current_mode are: + * 0: Flow control is completely disabled +- * 1: Rx flow control is enabled (we can receive pause frames but not +- * send pause frames). +- * 2: Tx flow control is enabled (we can send pause frames but we do not +- * support receiving pause frames) ++ * 1: Rx flow control is enabled (we can receive pause frames, ++ * but not send pause frames). ++ * 2: Tx flow control is enabled (we can send pause frames but ++ * we do not support receiving pause frames). + * 3: Both Rx and Tx flow control (symmetric) are enabled. ++#ifdef CONFIG_DCB ++ * 4: Priority Flow Control is enabled. ++#endif + * other: Invalid. + */ +- switch (hw->fc.type) { ++ switch (hw->fc.current_mode) { + case ixgbe_fc_none: ++ /* Flow control is disabled by software override or autoneg. ++ * The code below will actually disable it in the HW. ++ */ + break; + case ixgbe_fc_rx_pause: + /* +- * Rx Flow control is enabled, +- * and Tx Flow control is disabled. ++ * Rx Flow control is enabled and Tx Flow control is ++ * disabled by software override. Since there really ++ * isn't a way to advertise that we are capable of RX ++ * Pause ONLY, we will advertise that we support both ++ * symmetric and asymmetric Rx PAUSE. Later, we will ++ * disable the adapter's ability to send PAUSE frames. + */ +- frctl_reg |= IXGBE_FCTRL_RFCE; ++ fctrl_reg |= IXGBE_FCTRL_RFCE; + break; + case ixgbe_fc_tx_pause: + /* +- * Tx Flow control is enabled, and Rx Flow control is disabled, +- * by a software over-ride. ++ * Tx Flow control is enabled, and Rx Flow control is ++ * disabled by software override. + */ + rmcs_reg |= IXGBE_RMCS_TFCE_802_3X; + break; + case ixgbe_fc_full: +- /* +- * Flow control (both Rx and Tx) is enabled by a software +- * over-ride. +- */ +- frctl_reg |= IXGBE_FCTRL_RFCE; ++ /* Flow control (both Rx and Tx) is enabled by SW override. */ ++ fctrl_reg |= IXGBE_FCTRL_RFCE; + rmcs_reg |= IXGBE_RMCS_TFCE_802_3X; + break; ++#ifdef CONFIG_DCB ++ case ixgbe_fc_pfc: ++ goto out; ++ break; ++#endif /* CONFIG_DCB */ + default: +- /* We should never get here. The value should be 0-3. */ + hw_dbg(hw, "Flow control param set incorrectly\n"); ++ ret_val = -IXGBE_ERR_CONFIG; ++ goto out; + break; + } + +- /* Enable 802.3x based flow control settings. */ +- IXGBE_WRITE_REG(hw, IXGBE_FCTRL, frctl_reg); ++ /* Set 802.3x based flow control settings. */ ++ fctrl_reg |= IXGBE_FCTRL_DPF; ++ IXGBE_WRITE_REG(hw, IXGBE_FCTRL, fctrl_reg); + IXGBE_WRITE_REG(hw, IXGBE_RMCS, rmcs_reg); + +- /* +- * Check for invalid software configuration, zeros are completely +- * invalid for all parameters used past this point, and if we enable +- * flow control with zero water marks, we blast flow control packets. +- */ +- if (!hw->fc.low_water || !hw->fc.high_water || !hw->fc.pause_time) { +- hw_dbg(hw, "Flow control structure initialized incorrectly\n"); +- return IXGBE_ERR_INVALID_LINK_SETTINGS; +- } +- +- /* +- * We need to set up the Receive Threshold high and low water +- * marks as well as (optionally) enabling the transmission of +- * XON frames. +- */ +- if (hw->fc.type & ixgbe_fc_tx_pause) { ++ /* Set up and enable Rx high/low water mark thresholds, enable XON. */ ++ if (hw->fc.current_mode & ixgbe_fc_tx_pause) { + if (hw->fc.send_xon) { + IXGBE_WRITE_REG(hw, IXGBE_FCRTL(packetbuf_num), + (hw->fc.low_water | IXGBE_FCRTL_XONE)); +@@ -340,14 +417,23 @@ + IXGBE_WRITE_REG(hw, IXGBE_FCRTL(packetbuf_num), + hw->fc.low_water); + } ++ + IXGBE_WRITE_REG(hw, IXGBE_FCRTH(packetbuf_num), +- (hw->fc.high_water)|IXGBE_FCRTH_FCEN); ++ (hw->fc.high_water | IXGBE_FCRTH_FCEN)); + } + +- IXGBE_WRITE_REG(hw, IXGBE_FCTTV(0), hw->fc.pause_time); ++ /* Configure pause time (2 TCs per register) */ ++ reg = IXGBE_READ_REG(hw, IXGBE_FCTTV(packetbuf_num / 2)); ++ if ((packetbuf_num & 1) == 0) ++ reg = (reg & 0xFFFF0000) | hw->fc.pause_time; ++ else ++ reg = (reg & 0x0000FFFF) | (hw->fc.pause_time << 16); ++ IXGBE_WRITE_REG(hw, IXGBE_FCTTV(packetbuf_num / 2), reg); ++ + IXGBE_WRITE_REG(hw, IXGBE_FCRTV, (hw->fc.pause_time >> 1)); + +- return 0; ++out: ++ return ret_val; + } + + /** +@@ -364,27 +450,17 @@ + u32 i; + s32 status = 0; + ++ /* Restart link */ + autoc_reg = IXGBE_READ_REG(hw, IXGBE_AUTOC); +- +- if (hw->mac.link_settings_loaded) { +- autoc_reg &= ~IXGBE_AUTOC_LMS_ATTACH_TYPE; +- autoc_reg &= ~IXGBE_AUTOC_LMS_MASK; +- autoc_reg |= hw->mac.link_attach_type; +- autoc_reg |= hw->mac.link_mode_select; +- +- IXGBE_WRITE_REG(hw, IXGBE_AUTOC, autoc_reg); +- IXGBE_WRITE_FLUSH(hw); +- msleep(50); +- } +- +- /* Restart link */ + autoc_reg |= IXGBE_AUTOC_AN_RESTART; + IXGBE_WRITE_REG(hw, IXGBE_AUTOC, autoc_reg); + + /* Only poll for autoneg to complete if specified to do so */ + if (hw->phy.autoneg_wait_to_complete) { +- if (hw->mac.link_mode_select == IXGBE_AUTOC_LMS_KX4_AN || +- hw->mac.link_mode_select == IXGBE_AUTOC_LMS_KX4_AN_1G_AN) { ++ if ((autoc_reg & IXGBE_AUTOC_LMS_MASK) == ++ IXGBE_AUTOC_LMS_KX4_AN || ++ (autoc_reg & IXGBE_AUTOC_LMS_MASK) == ++ IXGBE_AUTOC_LMS_KX4_AN_1G_AN) { + links_reg = 0; /* Just in case Autoneg time = 0 */ + for (i = 0; i < IXGBE_AUTO_NEG_TIME; i++) { + links_reg = IXGBE_READ_REG(hw, IXGBE_LINKS); +@@ -398,14 +474,6 @@ + } + } + } +- +- /* +- * We want to save off the original Flow Control configuration just in +- * case we get disconnected and then reconnected into a different hub +- * or switch with different Flow Control capabilities. +- */ +- hw->fc.original_type = hw->fc.type; +- ixgbe_setup_fc_82598(hw, 0); + + /* Add delay to filter out noises during initial link setup */ + msleep(50); +@@ -431,16 +499,16 @@ + u16 link_reg, adapt_comp_reg; + + /* +- * SERDES PHY requires us to read link status from register 0xC79F. +- * Bit 0 set indicates link is up/ready; clear indicates link down. +- * OxC00C is read to check that the XAUI lanes are active. Bit 0 +- * clear indicates active; set indicates inactive. ++ * SERDES PHY requires us to read link status from undocumented ++ * register 0xC79F. Bit 0 set indicates link is up/ready; clear ++ * indicates link down. OxC00C is read to check that the XAUI lanes ++ * are active. Bit 0 clear indicates active; set indicates inactive. + */ + if (hw->phy.type == ixgbe_phy_nl) { + hw->phy.ops.read_reg(hw, 0xC79F, IXGBE_TWINAX_DEV, &link_reg); + hw->phy.ops.read_reg(hw, 0xC79F, IXGBE_TWINAX_DEV, &link_reg); + hw->phy.ops.read_reg(hw, 0xC00C, IXGBE_TWINAX_DEV, +- &adapt_comp_reg); ++ &adapt_comp_reg); + if (link_up_wait_to_complete) { + for (i = 0; i < IXGBE_LINK_UP_TIME; i++) { + if ((link_reg & 1) && +@@ -452,11 +520,11 @@ + } + msleep(100); + hw->phy.ops.read_reg(hw, 0xC79F, +- IXGBE_TWINAX_DEV, +- &link_reg); ++ IXGBE_TWINAX_DEV, ++ &link_reg); + hw->phy.ops.read_reg(hw, 0xC00C, +- IXGBE_TWINAX_DEV, +- &adapt_comp_reg); ++ IXGBE_TWINAX_DEV, ++ &adapt_comp_reg); + } + } else { + if ((link_reg & 1) && +@@ -494,52 +562,62 @@ + else + *speed = IXGBE_LINK_SPEED_1GB_FULL; + ++ /* if link is down, zero out the current_mode */ ++ if (*link_up == false) { ++ hw->fc.current_mode = ixgbe_fc_none; ++ hw->fc.fc_was_autonegged = false; ++ } + out: + return 0; + } +- + + /** + * ixgbe_setup_mac_link_speed_82598 - Set MAC link speed + * @hw: pointer to hardware structure + * @speed: new link speed +- * @autoneg: true if auto-negotiation enabled +- * @autoneg_wait_to_complete: true if waiting is needed to complete ++ * @autoneg: true if autonegotiation enabled ++ * @autoneg_wait_to_complete: true when waiting for completion is needed + * + * Set the link speed in the AUTOC register and restarts link. + **/ + static s32 ixgbe_setup_mac_link_speed_82598(struct ixgbe_hw *hw, +- ixgbe_link_speed speed, bool autoneg, +- bool autoneg_wait_to_complete) ++ ixgbe_link_speed speed, bool autoneg, ++ bool autoneg_wait_to_complete) + { +- s32 status = 0; ++ s32 status = 0; ++ ixgbe_link_speed link_capabilities = IXGBE_LINK_SPEED_UNKNOWN; ++ u32 curr_autoc = IXGBE_READ_REG(hw, IXGBE_AUTOC); ++ u32 autoc = curr_autoc; ++ u32 link_mode = autoc & IXGBE_AUTOC_LMS_MASK; + +- /* If speed is 10G, then check for CX4 or XAUI. */ +- if ((speed == IXGBE_LINK_SPEED_10GB_FULL) && +- (!(hw->mac.link_attach_type & IXGBE_AUTOC_10G_KX4))) { +- hw->mac.link_mode_select = IXGBE_AUTOC_LMS_10G_LINK_NO_AN; +- } else if ((speed == IXGBE_LINK_SPEED_1GB_FULL) && (!autoneg)) { +- hw->mac.link_mode_select = IXGBE_AUTOC_LMS_1G_LINK_NO_AN; +- } else if (autoneg) { +- /* BX mode - Autonegotiate 1G */ +- if (!(hw->mac.link_attach_type & IXGBE_AUTOC_1G_PMA_PMD)) +- hw->mac.link_mode_select = IXGBE_AUTOC_LMS_1G_AN; +- else /* KX/KX4 mode */ +- hw->mac.link_mode_select = IXGBE_AUTOC_LMS_KX4_AN_1G_AN; +- } else { ++ /* Check to see if speed passed in is supported. */ ++ ixgbe_get_link_capabilities(hw, &link_capabilities, &autoneg); ++ speed &= link_capabilities; ++ ++ if (speed == IXGBE_LINK_SPEED_UNKNOWN) + status = IXGBE_ERR_LINK_SETUP; ++ ++ /* Set KX4/KX support according to speed requested */ ++ else if (link_mode == IXGBE_AUTOC_LMS_KX4_AN || ++ link_mode == IXGBE_AUTOC_LMS_KX4_AN_1G_AN) { ++ autoc &= ~IXGBE_AUTOC_KX4_KX_SUPP_MASK; ++ if (speed & IXGBE_LINK_SPEED_10GB_FULL) ++ autoc |= IXGBE_AUTOC_KX4_SUPP; ++ if (speed & IXGBE_LINK_SPEED_1GB_FULL) ++ autoc |= IXGBE_AUTOC_KX_SUPP; ++ if (autoc != curr_autoc) ++ IXGBE_WRITE_REG(hw, IXGBE_AUTOC, autoc); + } + + if (status == 0) { + hw->phy.autoneg_wait_to_complete = autoneg_wait_to_complete; + +- hw->mac.link_settings_loaded = true; + /* + * Setup and restart the link based on the new values in + * ixgbe_hw This will write the AUTOC register based on the new + * stored values + */ +- ixgbe_setup_mac_link_82598(hw); ++ status = ixgbe_setup_mac_link_82598(hw); + } + + return status; +@@ -561,10 +639,6 @@ + + /* Restart autonegotiation on PHY */ + status = hw->phy.ops.setup_link(hw); +- +- /* Set MAC to KX/KX4 autoneg, which defaults to Parallel detection */ +- hw->mac.link_attach_type = (IXGBE_AUTOC_10G_KX4 | IXGBE_AUTOC_1G_KX); +- hw->mac.link_mode_select = IXGBE_AUTOC_LMS_KX4_AN; + + /* Set up MAC */ + ixgbe_setup_mac_link_82598(hw); +@@ -591,11 +665,6 @@ + /* Setup the PHY according to input speed */ + status = hw->phy.ops.setup_link_speed(hw, speed, autoneg, + autoneg_wait_to_complete); +- +- /* Set MAC to KX/KX4 autoneg, which defaults to Parallel detection */ +- hw->mac.link_attach_type = (IXGBE_AUTOC_10G_KX4 | IXGBE_AUTOC_1G_KX); +- hw->mac.link_mode_select = IXGBE_AUTOC_LMS_KX4_AN; +- + /* Set up MAC */ + ixgbe_setup_mac_link_82598(hw); + +@@ -613,6 +682,7 @@ + static s32 ixgbe_reset_hw_82598(struct ixgbe_hw *hw) + { + s32 status = 0; ++ s32 phy_status = 0; + u32 ctrl; + u32 gheccr; + u32 i; +@@ -656,14 +726,26 @@ + } + + /* Reset PHY */ +- if (hw->phy.reset_disable == false) ++ if (hw->phy.reset_disable == false) { ++ /* PHY ops must be identified and initialized prior to reset */ ++ ++ /* Init PHY and function pointers, perform SFP setup */ ++ phy_status = hw->phy.ops.init(hw); ++ if (phy_status == IXGBE_ERR_SFP_NOT_SUPPORTED) ++ goto reset_hw_out; ++ else if (phy_status == IXGBE_ERR_SFP_NOT_PRESENT) ++ goto no_phy_reset; ++ + hw->phy.ops.reset(hw); ++ } + ++no_phy_reset: + /* + * Prevent the PCI-E bus from from hanging by disabling PCI-E master + * access and verify no pending requests before reset + */ +- if (ixgbe_disable_pcie_master(hw) != 0) { ++ status = ixgbe_disable_pcie_master(hw); ++ if (status != 0) { + status = IXGBE_ERR_MASTER_REQUESTS_PENDING; + hw_dbg(hw, "PCI-E Master disable polling has failed.\n"); + } +@@ -695,29 +777,31 @@ + IXGBE_WRITE_REG(hw, IXGBE_GHECCR, gheccr); + + /* +- * AUTOC register which stores link settings gets cleared +- * and reloaded from EEPROM after reset. We need to restore +- * our stored value from init in case SW changed the attach +- * type or speed. If this is the first time and link settings +- * have not been stored, store default settings from AUTOC. ++ * Store the original AUTOC value if it has not been ++ * stored off yet. Otherwise restore the stored original ++ * AUTOC value since the reset operation sets back to deaults. + */ + autoc = IXGBE_READ_REG(hw, IXGBE_AUTOC); +- if (hw->mac.link_settings_loaded) { +- autoc &= ~(IXGBE_AUTOC_LMS_ATTACH_TYPE); +- autoc &= ~(IXGBE_AUTOC_LMS_MASK); +- autoc |= hw->mac.link_attach_type; +- autoc |= hw->mac.link_mode_select; +- IXGBE_WRITE_REG(hw, IXGBE_AUTOC, autoc); +- } else { +- hw->mac.link_attach_type = +- (autoc & IXGBE_AUTOC_LMS_ATTACH_TYPE); +- hw->mac.link_mode_select = (autoc & IXGBE_AUTOC_LMS_MASK); +- hw->mac.link_settings_loaded = true; +- } ++ if (hw->mac.orig_link_settings_stored == false) { ++ hw->mac.orig_autoc = autoc; ++ hw->mac.orig_link_settings_stored = true; ++ } else if (autoc != hw->mac.orig_autoc) ++ IXGBE_WRITE_REG(hw, IXGBE_AUTOC, hw->mac.orig_autoc); + + /* Store the permanent mac address */ + hw->mac.ops.get_mac_addr(hw, hw->mac.perm_addr); + ++ /* ++ * Store MAC address from RAR0, clear receive address registers, and ++ * clear the multicast table ++ */ ++ hw->mac.ops.init_rx_addrs(hw); ++ ++ ++ ++reset_hw_out: ++ if (phy_status != 0) ++ status = phy_status; + return status; + } + +@@ -749,6 +833,7 @@ + u32 rar_high; + u32 rar_entries = hw->mac.num_rar_entries; + ++ + if (rar < rar_entries) { + rar_high = IXGBE_READ_REG(hw, IXGBE_RAH(rar)); + if (rar_high & IXGBE_RAH_VIND_MASK) { +@@ -772,7 +857,7 @@ + * Turn on/off specified VLAN in the VLAN filter table. + **/ + s32 ixgbe_set_vfta_82598(struct ixgbe_hw *hw, u32 vlan, u32 vind, +- bool vlan_on) ++ bool vlan_on) + { + u32 regindex; + u32 bitindex; +@@ -833,61 +918,6 @@ + } + + /** +- * ixgbe_blink_led_start_82598 - Blink LED based on index. +- * @hw: pointer to hardware structure +- * @index: led number to blink +- **/ +-static s32 ixgbe_blink_led_start_82598(struct ixgbe_hw *hw, u32 index) +-{ +- ixgbe_link_speed speed = 0; +- bool link_up = 0; +- u32 autoc_reg = IXGBE_READ_REG(hw, IXGBE_AUTOC); +- u32 led_reg = IXGBE_READ_REG(hw, IXGBE_LEDCTL); +- +- /* +- * Link must be up to auto-blink the LEDs on the 82598EB MAC; +- * force it if link is down. +- */ +- hw->mac.ops.check_link(hw, &speed, &link_up, false); +- +- if (!link_up) { +- autoc_reg |= IXGBE_AUTOC_FLU; +- IXGBE_WRITE_REG(hw, IXGBE_AUTOC, autoc_reg); +- msleep(10); +- } +- +- led_reg &= ~IXGBE_LED_MODE_MASK(index); +- led_reg |= IXGBE_LED_BLINK(index); +- IXGBE_WRITE_REG(hw, IXGBE_LEDCTL, led_reg); +- IXGBE_WRITE_FLUSH(hw); +- +- return 0; +-} +- +-/** +- * ixgbe_blink_led_stop_82598 - Stop blinking LED based on index. +- * @hw: pointer to hardware structure +- * @index: led number to stop blinking +- **/ +-static s32 ixgbe_blink_led_stop_82598(struct ixgbe_hw *hw, u32 index) +-{ +- u32 autoc_reg = IXGBE_READ_REG(hw, IXGBE_AUTOC); +- u32 led_reg = IXGBE_READ_REG(hw, IXGBE_LEDCTL); +- +- autoc_reg &= ~IXGBE_AUTOC_FLU; +- autoc_reg |= IXGBE_AUTOC_AN_RESTART; +- IXGBE_WRITE_REG(hw, IXGBE_AUTOC, autoc_reg); +- +- led_reg &= ~IXGBE_LED_MODE_MASK(index); +- led_reg &= ~IXGBE_LED_BLINK(index); +- led_reg |= IXGBE_LED_LINK_ACTIVE << IXGBE_LED_MODE_SHIFT(index); +- IXGBE_WRITE_REG(hw, IXGBE_LEDCTL, led_reg); +- IXGBE_WRITE_FLUSH(hw); +- +- return 0; +-} +- +-/** + * ixgbe_read_analog_reg8_82598 - Reads 8 bit Atlas analog register + * @hw: pointer to hardware structure + * @reg: analog register to read +@@ -930,16 +960,15 @@ + } + + /** +- * ixgbe_read_i2c_eeprom_82598 - Reads 8 bit EEPROM word of an SFP+ module +- * over I2C interface through an intermediate phy. ++ * ixgbe_read_i2c_eeprom_82598 - Reads 8 bit word over I2C interface. + * @hw: pointer to hardware structure + * @byte_offset: EEPROM byte offset to read + * @eeprom_data: value read + * +- * Performs byte read operation to SFP module's EEPROM over I2C interface. ++ * Performs 8 byte read operation to SFP module's EEPROM over I2C interface. + **/ + s32 ixgbe_read_i2c_eeprom_82598(struct ixgbe_hw *hw, u8 byte_offset, +- u8 *eeprom_data) ++ u8 *eeprom_data) + { + s32 status = 0; + u16 sfp_addr = 0; +@@ -949,23 +978,23 @@ + + if (hw->phy.type == ixgbe_phy_nl) { + /* +- * phy SDA/SCL registers are at addresses 0xC30A to ++ * NetLogic phy SDA/SCL registers are at addresses 0xC30A to + * 0xC30D. These registers are used to talk to the SFP+ + * module's EEPROM through the SDA/SCL (I2C) interface. + */ + sfp_addr = (IXGBE_I2C_EEPROM_DEV_ADDR << 8) + byte_offset; + sfp_addr = (sfp_addr | IXGBE_I2C_EEPROM_READ_MASK); + hw->phy.ops.write_reg(hw, +- IXGBE_MDIO_PMA_PMD_SDA_SCL_ADDR, +- IXGBE_MDIO_PMA_PMD_DEV_TYPE, +- sfp_addr); ++ IXGBE_MDIO_PMA_PMD_SDA_SCL_ADDR, ++ IXGBE_MDIO_PMA_PMD_DEV_TYPE, ++ sfp_addr); + + /* Poll status */ + for (i = 0; i < 100; i++) { + hw->phy.ops.read_reg(hw, +- IXGBE_MDIO_PMA_PMD_SDA_SCL_STAT, +- IXGBE_MDIO_PMA_PMD_DEV_TYPE, +- &sfp_stat); ++ IXGBE_MDIO_PMA_PMD_SDA_SCL_STAT, ++ IXGBE_MDIO_PMA_PMD_DEV_TYPE, ++ &sfp_stat); + sfp_stat = sfp_stat & IXGBE_I2C_EEPROM_STATUS_MASK; + if (sfp_stat != IXGBE_I2C_EEPROM_STATUS_IN_PROGRESS) + break; +@@ -980,7 +1009,7 @@ + + /* Read data */ + hw->phy.ops.read_reg(hw, IXGBE_MDIO_PMA_PMD_SDA_SCL_DATA, +- IXGBE_MDIO_PMA_PMD_DEV_TYPE, &sfp_data); ++ IXGBE_MDIO_PMA_PMD_DEV_TYPE, &sfp_data); + + *eeprom_data = (u8)(sfp_data >> 8); + } else { +@@ -998,27 +1027,59 @@ + * + * Determines physical layer capabilities of the current configuration. + **/ +-s32 ixgbe_get_supported_physical_layer_82598(struct ixgbe_hw *hw) ++u32 ixgbe_get_supported_physical_layer_82598(struct ixgbe_hw *hw) + { +- s32 physical_layer = IXGBE_PHYSICAL_LAYER_UNKNOWN; ++ u32 physical_layer = IXGBE_PHYSICAL_LAYER_UNKNOWN; ++ u32 autoc = IXGBE_READ_REG(hw, IXGBE_AUTOC); ++ u32 pma_pmd_10g = autoc & IXGBE_AUTOC_10G_PMA_PMD_MASK; ++ u32 pma_pmd_1g = autoc & IXGBE_AUTOC_1G_PMA_PMD_MASK; ++ u16 ext_ability = 0; + +- switch (hw->device_id) { +- case IXGBE_DEV_ID_82598EB_CX4: +- case IXGBE_DEV_ID_82598_CX4_DUAL_PORT: +- physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_CX4; ++ hw->phy.ops.identify(hw); ++ ++ /* Copper PHY must be checked before AUTOC LMS to determine correct ++ * physical layer because 10GBase-T PHYs use LMS = KX4/KX */ ++ if (hw->phy.type == ixgbe_phy_tn || ++ hw->phy.type == ixgbe_phy_cu_unknown) { ++ hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_EXT_ABILITY, ++ IXGBE_MDIO_PMA_PMD_DEV_TYPE, &ext_ability); ++ if (ext_ability & IXGBE_MDIO_PHY_10GBASET_ABILITY) ++ physical_layer |= IXGBE_PHYSICAL_LAYER_10GBASE_T; ++ if (ext_ability & IXGBE_MDIO_PHY_1000BASET_ABILITY) ++ physical_layer |= IXGBE_PHYSICAL_LAYER_1000BASE_T; ++ if (ext_ability & IXGBE_MDIO_PHY_100BASETX_ABILITY) ++ physical_layer |= IXGBE_PHYSICAL_LAYER_100BASE_TX; ++ goto out; ++ } ++ ++ switch (autoc & IXGBE_AUTOC_LMS_MASK) { ++ case IXGBE_AUTOC_LMS_1G_AN: ++ case IXGBE_AUTOC_LMS_1G_LINK_NO_AN: ++ if (pma_pmd_1g == IXGBE_AUTOC_1G_KX) ++ physical_layer = IXGBE_PHYSICAL_LAYER_1000BASE_KX; ++ else ++ physical_layer = IXGBE_PHYSICAL_LAYER_1000BASE_BX; + break; +- case IXGBE_DEV_ID_82598_DA_DUAL_PORT: +- physical_layer = IXGBE_PHYSICAL_LAYER_SFP_PLUS_CU; ++ case IXGBE_AUTOC_LMS_10G_LINK_NO_AN: ++ if (pma_pmd_10g == IXGBE_AUTOC_10G_CX4) ++ physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_CX4; ++ else if (pma_pmd_10g == IXGBE_AUTOC_10G_KX4) ++ physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_KX4; ++ else /* XAUI */ ++ physical_layer = IXGBE_PHYSICAL_LAYER_UNKNOWN; + break; +- case IXGBE_DEV_ID_82598AF_DUAL_PORT: +- case IXGBE_DEV_ID_82598AF_SINGLE_PORT: +- case IXGBE_DEV_ID_82598_SR_DUAL_PORT_EM: +- physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_SR; ++ case IXGBE_AUTOC_LMS_KX4_AN: ++ case IXGBE_AUTOC_LMS_KX4_AN_1G_AN: ++ if (autoc & IXGBE_AUTOC_KX_SUPP) ++ physical_layer |= IXGBE_PHYSICAL_LAYER_1000BASE_KX; ++ if (autoc & IXGBE_AUTOC_KX4_SUPP) ++ physical_layer |= IXGBE_PHYSICAL_LAYER_10GBASE_KX4; + break; +- case IXGBE_DEV_ID_82598EB_XF_LR: +- physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_LR; ++ default: + break; +- case IXGBE_DEV_ID_82598EB_SFP_LOM: ++ } ++ ++ if (hw->phy.type == ixgbe_phy_nl) { + hw->phy.ops.identify_sfp(hw); + + switch (hw->phy.sfp_type) { +@@ -1035,76 +1096,57 @@ + physical_layer = IXGBE_PHYSICAL_LAYER_UNKNOWN; + break; + } ++ } ++ ++ switch (hw->device_id) { ++ case IXGBE_DEV_ID_82598_DA_DUAL_PORT: ++ physical_layer = IXGBE_PHYSICAL_LAYER_SFP_PLUS_CU; + break; +- case IXGBE_DEV_ID_82598AT: +- physical_layer = (IXGBE_PHYSICAL_LAYER_10GBASE_T | +- IXGBE_PHYSICAL_LAYER_1000BASE_T); ++ case IXGBE_DEV_ID_82598AF_DUAL_PORT: ++ case IXGBE_DEV_ID_82598AF_SINGLE_PORT: ++ case IXGBE_DEV_ID_82598_SR_DUAL_PORT_EM: ++ physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_SR; + break; +- ++ case IXGBE_DEV_ID_82598EB_XF_LR: ++ physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_LR; ++ break; + default: +- physical_layer = IXGBE_PHYSICAL_LAYER_UNKNOWN; + break; + } + ++out: + return physical_layer; + } + +-static struct ixgbe_mac_operations mac_ops_82598 = { +- .init_hw = &ixgbe_init_hw_generic, +- .reset_hw = &ixgbe_reset_hw_82598, +- .start_hw = &ixgbe_start_hw_generic, +- .clear_hw_cntrs = &ixgbe_clear_hw_cntrs_generic, +- .get_media_type = &ixgbe_get_media_type_82598, +- .get_supported_physical_layer = &ixgbe_get_supported_physical_layer_82598, +- .get_mac_addr = &ixgbe_get_mac_addr_generic, +- .stop_adapter = &ixgbe_stop_adapter_generic, +- .read_analog_reg8 = &ixgbe_read_analog_reg8_82598, +- .write_analog_reg8 = &ixgbe_write_analog_reg8_82598, +- .setup_link = &ixgbe_setup_mac_link_82598, +- .setup_link_speed = &ixgbe_setup_mac_link_speed_82598, +- .check_link = &ixgbe_check_mac_link_82598, +- .get_link_capabilities = &ixgbe_get_link_capabilities_82598, +- .led_on = &ixgbe_led_on_generic, +- .led_off = &ixgbe_led_off_generic, +- .blink_led_start = &ixgbe_blink_led_start_82598, +- .blink_led_stop = &ixgbe_blink_led_stop_82598, +- .set_rar = &ixgbe_set_rar_generic, +- .clear_rar = &ixgbe_clear_rar_generic, +- .set_vmdq = &ixgbe_set_vmdq_82598, +- .clear_vmdq = &ixgbe_clear_vmdq_82598, +- .init_rx_addrs = &ixgbe_init_rx_addrs_generic, +- .update_uc_addr_list = &ixgbe_update_uc_addr_list_generic, +- .update_mc_addr_list = &ixgbe_update_mc_addr_list_generic, +- .enable_mc = &ixgbe_enable_mc_generic, +- .disable_mc = &ixgbe_disable_mc_generic, +- .clear_vfta = &ixgbe_clear_vfta_82598, +- .set_vfta = &ixgbe_set_vfta_82598, +- .setup_fc = &ixgbe_setup_fc_82598, +-}; ++/** ++ * ixgbe_set_lan_id_multi_port_pcie_82598 - Set LAN id for PCIe multiple ++ * port devices. ++ * @hw: pointer to the HW structure ++ * ++ * Calls common function and corrects issue with some single port devices ++ * that enable LAN1 but not LAN0. ++ **/ ++void ixgbe_set_lan_id_multi_port_pcie_82598(struct ixgbe_hw *hw) ++{ ++ struct ixgbe_bus_info *bus = &hw->bus; ++ u16 pci_gen, pci_ctrl2; + +-static struct ixgbe_eeprom_operations eeprom_ops_82598 = { +- .init_params = &ixgbe_init_eeprom_params_generic, +- .read = &ixgbe_read_eeprom_generic, +- .validate_checksum = &ixgbe_validate_eeprom_checksum_generic, +- .update_checksum = &ixgbe_update_eeprom_checksum_generic, +-}; ++ ixgbe_set_lan_id_multi_port_pcie(hw); + +-static struct ixgbe_phy_operations phy_ops_82598 = { +- .identify = &ixgbe_identify_phy_generic, +- .identify_sfp = &ixgbe_identify_sfp_module_generic, +- .reset = &ixgbe_reset_phy_generic, +- .read_reg = &ixgbe_read_phy_reg_generic, +- .write_reg = &ixgbe_write_phy_reg_generic, +- .setup_link = &ixgbe_setup_phy_link_generic, +- .setup_link_speed = &ixgbe_setup_phy_link_speed_generic, +- .read_i2c_eeprom = &ixgbe_read_i2c_eeprom_82598, +-}; ++ /* check if LAN0 is disabled */ ++ hw->eeprom.ops.read(hw, IXGBE_PCIE_GENERAL_PTR, &pci_gen); ++ if ((pci_gen != 0) && (pci_gen != 0xFFFF)) { + +-struct ixgbe_info ixgbe_82598_info = { +- .mac = ixgbe_mac_82598EB, +- .get_invariants = &ixgbe_get_invariants_82598, +- .mac_ops = &mac_ops_82598, +- .eeprom_ops = &eeprom_ops_82598, +- .phy_ops = &phy_ops_82598, +-}; ++ hw->eeprom.ops.read(hw, pci_gen + IXGBE_PCIE_CTRL2, &pci_ctrl2); + ++ /* if LAN0 is completely disabled force function to 0 */ ++ if ((pci_ctrl2 & IXGBE_PCIE_CTRL2_LAN_DISABLE) && ++ !(pci_ctrl2 & IXGBE_PCIE_CTRL2_DISABLE_SELECT) && ++ !(pci_ctrl2 & IXGBE_PCIE_CTRL2_DUMMY_ENABLE)) { ++ ++ bus->func = 0; ++ } ++ } ++} ++ ++ +diff -r 3e5bbd731d89 drivers/net/ixgbe/ixgbe_82599.c +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/ixgbe/ixgbe_82599.c Mon Jun 15 12:06:28 2009 +0100 +@@ -0,0 +1,2626 @@ ++/******************************************************************************* ++ ++ Intel 10 Gigabit PCI Express Linux driver ++ Copyright(c) 1999 - 2009 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++#include "ixgbe_type.h" ++#include "ixgbe_api.h" ++#include "ixgbe_common.h" ++#include "ixgbe_phy.h" ++ ++u32 ixgbe_get_pcie_msix_count_82599(struct ixgbe_hw *hw); ++s32 ixgbe_init_ops_82599(struct ixgbe_hw *hw); ++s32 ixgbe_get_link_capabilities_82599(struct ixgbe_hw *hw, ++ ixgbe_link_speed *speed, ++ bool *autoneg); ++enum ixgbe_media_type ixgbe_get_media_type_82599(struct ixgbe_hw *hw); ++s32 ixgbe_setup_mac_link_multispeed_fiber(struct ixgbe_hw *hw); ++s32 ixgbe_setup_mac_link_speed_multispeed_fiber(struct ixgbe_hw *hw, ++ ixgbe_link_speed speed, bool autoneg, ++ bool autoneg_wait_to_complete); ++s32 ixgbe_setup_mac_link_82599(struct ixgbe_hw *hw); ++s32 ixgbe_check_mac_link_82599(struct ixgbe_hw *hw, ++ ixgbe_link_speed *speed, ++ bool *link_up, bool link_up_wait_to_complete); ++s32 ixgbe_setup_mac_link_speed_82599(struct ixgbe_hw *hw, ++ ixgbe_link_speed speed, ++ bool autoneg, ++ bool autoneg_wait_to_complete); ++static s32 ixgbe_setup_copper_link_82599(struct ixgbe_hw *hw); ++static s32 ixgbe_setup_copper_link_speed_82599(struct ixgbe_hw *hw, ++ ixgbe_link_speed speed, ++ bool autoneg, ++ bool autoneg_wait_to_complete); ++s32 ixgbe_setup_sfp_modules_82599(struct ixgbe_hw *hw); ++void ixgbe_init_mac_link_ops_82599(struct ixgbe_hw *hw); ++s32 ixgbe_reset_hw_82599(struct ixgbe_hw *hw); ++s32 ixgbe_set_vmdq_82599(struct ixgbe_hw *hw, u32 rar, u32 vmdq); ++s32 ixgbe_clear_vmdq_82599(struct ixgbe_hw *hw, u32 rar, u32 vmdq); ++s32 ixgbe_insert_mac_addr_82599(struct ixgbe_hw *hw, u8 *addr, u32 vmdq); ++s32 ixgbe_set_vfta_82599(struct ixgbe_hw *hw, u32 vlan, ++ u32 vind, bool vlan_on); ++s32 ixgbe_clear_vfta_82599(struct ixgbe_hw *hw); ++s32 ixgbe_init_uta_tables_82599(struct ixgbe_hw *hw); ++s32 ixgbe_read_analog_reg8_82599(struct ixgbe_hw *hw, u32 reg, u8 *val); ++s32 ixgbe_write_analog_reg8_82599(struct ixgbe_hw *hw, u32 reg, u8 val); ++s32 ixgbe_start_hw_rev_1_82599(struct ixgbe_hw *hw); ++s32 ixgbe_identify_phy_82599(struct ixgbe_hw *hw); ++s32 ixgbe_init_phy_ops_82599(struct ixgbe_hw *hw); ++u32 ixgbe_get_supported_physical_layer_82599(struct ixgbe_hw *hw); ++s32 ixgbe_enable_rx_dma_82599(struct ixgbe_hw *hw, u32 regval); ++s32 ixgbe_get_san_mac_addr_offset_82599(struct ixgbe_hw *hw, ++ u16 *san_mac_offset); ++s32 ixgbe_get_san_mac_addr_82599(struct ixgbe_hw *hw, u8 *san_mac_addr); ++s32 ixgbe_set_san_mac_addr_82599(struct ixgbe_hw *hw, u8 *san_mac_addr); ++s32 ixgbe_get_device_caps_82599(struct ixgbe_hw *hw, u16 *device_caps); ++static s32 ixgbe_verify_fw_version_82599(struct ixgbe_hw *hw); ++ ++ ++void ixgbe_init_mac_link_ops_82599(struct ixgbe_hw *hw) ++{ ++ struct ixgbe_mac_info *mac = &hw->mac; ++ ++ if (hw->phy.multispeed_fiber) { ++ /* Set up dual speed SFP+ support */ ++ mac->ops.setup_link = ++ &ixgbe_setup_mac_link_multispeed_fiber; ++ mac->ops.setup_link_speed = ++ &ixgbe_setup_mac_link_speed_multispeed_fiber; ++ } else { ++ mac->ops.setup_link = ++ &ixgbe_setup_mac_link_82599; ++ mac->ops.setup_link_speed = ++ &ixgbe_setup_mac_link_speed_82599; ++ } ++} ++ ++/** ++ * ixgbe_init_phy_ops_82599 - PHY/SFP specific init ++ * @hw: pointer to hardware structure ++ * ++ * Initialize any function pointers that were not able to be ++ * set during init_shared_code because the PHY/SFP type was ++ * not known. Perform the SFP init if necessary. ++ * ++ **/ ++s32 ixgbe_init_phy_ops_82599(struct ixgbe_hw *hw) ++{ ++ struct ixgbe_mac_info *mac = &hw->mac; ++ struct ixgbe_phy_info *phy = &hw->phy; ++ s32 ret_val = 0; ++ ++ /* Identify the PHY or SFP module */ ++ ret_val = phy->ops.identify(hw); ++ if (ret_val == IXGBE_ERR_SFP_NOT_SUPPORTED) ++ goto init_phy_ops_out; ++ ++ /* Setup function pointers based on detected SFP module and speeds */ ++ ixgbe_init_mac_link_ops_82599(hw); ++ if (hw->phy.sfp_type != ixgbe_sfp_type_unknown) ++ hw->phy.ops.reset = NULL; ++ ++ /* If copper media, overwrite with copper function pointers */ ++ if (mac->ops.get_media_type(hw) == ixgbe_media_type_copper) { ++ mac->ops.setup_link = &ixgbe_setup_copper_link_82599; ++ mac->ops.setup_link_speed = ++ &ixgbe_setup_copper_link_speed_82599; ++ mac->ops.get_link_capabilities = ++ &ixgbe_get_copper_link_capabilities_generic; ++ } ++ ++ /* Set necessary function pointers based on phy type */ ++ switch (hw->phy.type) { ++ case ixgbe_phy_tn: ++ phy->ops.check_link = &ixgbe_check_phy_link_tnx; ++ phy->ops.get_firmware_version = ++ &ixgbe_get_phy_firmware_version_tnx; ++ break; ++ case ixgbe_phy_aq: ++ phy->ops.get_firmware_version = ++ &ixgbe_get_phy_firmware_version_aq; ++ break; ++ default: ++ break; ++ } ++init_phy_ops_out: ++ return ret_val; ++} ++ ++s32 ixgbe_setup_sfp_modules_82599(struct ixgbe_hw *hw) ++{ ++ s32 ret_val = 0; ++ u16 list_offset, data_offset, data_value; ++ ++ if (hw->phy.sfp_type != ixgbe_sfp_type_unknown) { ++ ixgbe_init_mac_link_ops_82599(hw); ++ ++ hw->phy.ops.reset = NULL; ++ ++ ret_val = ixgbe_get_sfp_init_sequence_offsets(hw, &list_offset, ++ &data_offset); ++ if (ret_val != 0) ++ goto setup_sfp_out; ++ ++ /* PHY config will finish before releasing the semaphore */ ++ ret_val = ixgbe_acquire_swfw_sync(hw, IXGBE_GSSR_MAC_CSR_SM); ++ if (ret_val != 0) { ++ ret_val = IXGBE_ERR_SWFW_SYNC; ++ goto setup_sfp_out; ++ } ++ ++ hw->eeprom.ops.read(hw, ++data_offset, &data_value); ++ while (data_value != 0xffff) { ++ IXGBE_WRITE_REG(hw, IXGBE_CORECTL, data_value); ++ IXGBE_WRITE_FLUSH(hw); ++ hw->eeprom.ops.read(hw, ++data_offset, &data_value); ++ } ++ /* Now restart DSP by setting Restart_AN */ ++ IXGBE_WRITE_REG(hw, IXGBE_AUTOC, ++ (IXGBE_READ_REG(hw, IXGBE_AUTOC) | IXGBE_AUTOC_AN_RESTART)); ++ ++ /* Release the semaphore */ ++ ixgbe_release_swfw_sync(hw, IXGBE_GSSR_MAC_CSR_SM); ++ /* Delay obtaining semaphore again to allow FW access */ ++ msleep(hw->eeprom.semaphore_delay); ++ } ++ ++setup_sfp_out: ++ return ret_val; ++} ++ ++/** ++ * ixgbe_get_pcie_msix_count_82599 - Gets MSI-X vector count ++ * @hw: pointer to hardware structure ++ * ++ * Read PCIe configuration space, and get the MSI-X vector count from ++ * the capabilities table. ++ **/ ++u32 ixgbe_get_pcie_msix_count_82599(struct ixgbe_hw *hw) ++{ ++ u32 msix_count = 64; ++ ++ if (hw->mac.msix_vectors_from_pcie) { ++ msix_count = IXGBE_READ_PCIE_WORD(hw, ++ IXGBE_PCIE_MSIX_82599_CAPS); ++ msix_count &= IXGBE_PCIE_MSIX_TBL_SZ_MASK; ++ ++ /* MSI-X count is zero-based in HW, so increment to give ++ * proper value */ ++ msix_count++; ++ } ++ ++ return msix_count; ++} ++ ++/** ++ * ixgbe_init_ops_82599 - Inits func ptrs and MAC type ++ * @hw: pointer to hardware structure ++ * ++ * Initialize the function pointers and assign the MAC type for 82599. ++ * Does not touch the hardware. ++ **/ ++ ++s32 ixgbe_init_ops_82599(struct ixgbe_hw *hw) ++{ ++ struct ixgbe_mac_info *mac = &hw->mac; ++ struct ixgbe_phy_info *phy = &hw->phy; ++ s32 ret_val; ++ ++ ret_val = ixgbe_init_phy_ops_generic(hw); ++ ret_val = ixgbe_init_ops_generic(hw); ++ ++ /* PHY */ ++ phy->ops.identify = &ixgbe_identify_phy_82599; ++ phy->ops.init = &ixgbe_init_phy_ops_82599; ++ ++ /* MAC */ ++ mac->ops.reset_hw = &ixgbe_reset_hw_82599; ++ mac->ops.get_media_type = &ixgbe_get_media_type_82599; ++ mac->ops.get_supported_physical_layer = ++ &ixgbe_get_supported_physical_layer_82599; ++ mac->ops.enable_rx_dma = &ixgbe_enable_rx_dma_82599; ++ mac->ops.read_analog_reg8 = &ixgbe_read_analog_reg8_82599; ++ mac->ops.write_analog_reg8 = &ixgbe_write_analog_reg8_82599; ++ mac->ops.start_hw = &ixgbe_start_hw_rev_1_82599; ++ mac->ops.get_san_mac_addr = &ixgbe_get_san_mac_addr_82599; ++ mac->ops.set_san_mac_addr = &ixgbe_set_san_mac_addr_82599; ++ mac->ops.get_device_caps = &ixgbe_get_device_caps_82599; ++ ++ /* RAR, Multicast, VLAN */ ++ mac->ops.set_vmdq = &ixgbe_set_vmdq_82599; ++ mac->ops.clear_vmdq = &ixgbe_clear_vmdq_82599; ++ mac->ops.insert_mac_addr = &ixgbe_insert_mac_addr_82599; ++ mac->rar_highwater = 1; ++ mac->ops.set_vfta = &ixgbe_set_vfta_82599; ++ mac->ops.clear_vfta = &ixgbe_clear_vfta_82599; ++ mac->ops.init_uta_tables = &ixgbe_init_uta_tables_82599; ++ mac->ops.setup_sfp = &ixgbe_setup_sfp_modules_82599; ++ ++ /* Link */ ++ mac->ops.get_link_capabilities = &ixgbe_get_link_capabilities_82599; ++ mac->ops.check_link = &ixgbe_check_mac_link_82599; ++ ixgbe_init_mac_link_ops_82599(hw); ++ ++ mac->mcft_size = 128; ++ mac->vft_size = 128; ++ mac->num_rar_entries = 128; ++ mac->max_tx_queues = 128; ++ mac->max_rx_queues = 128; ++ mac->max_msix_vectors = ixgbe_get_pcie_msix_count_82599(hw); ++ ++ ++ return ret_val; ++} ++ ++/** ++ * ixgbe_get_link_capabilities_82599 - Determines link capabilities ++ * @hw: pointer to hardware structure ++ * @speed: pointer to link speed ++ * @negotiation: true when autoneg or autotry is enabled ++ * ++ * Determines the link capabilities by reading the AUTOC register. ++ **/ ++s32 ixgbe_get_link_capabilities_82599(struct ixgbe_hw *hw, ++ ixgbe_link_speed *speed, ++ bool *negotiation) ++{ ++ s32 status = 0; ++ u32 autoc = 0; ++ ++ /* ++ * Determine link capabilities based on the stored value of AUTOC, ++ * which represents EEPROM defaults. If AUTOC value has not ++ * been stored, use the current register values. ++ */ ++ if (hw->mac.orig_link_settings_stored) ++ autoc = hw->mac.orig_autoc; ++ else ++ autoc = IXGBE_READ_REG(hw, IXGBE_AUTOC); ++ ++ switch (autoc & IXGBE_AUTOC_LMS_MASK) { ++ case IXGBE_AUTOC_LMS_1G_LINK_NO_AN: ++ *speed = IXGBE_LINK_SPEED_1GB_FULL; ++ *negotiation = false; ++ break; ++ ++ case IXGBE_AUTOC_LMS_10G_LINK_NO_AN: ++ *speed = IXGBE_LINK_SPEED_10GB_FULL; ++ *negotiation = false; ++ break; ++ ++ case IXGBE_AUTOC_LMS_1G_AN: ++ *speed = IXGBE_LINK_SPEED_1GB_FULL; ++ *negotiation = true; ++ break; ++ ++ case IXGBE_AUTOC_LMS_10G_SERIAL: ++ *speed = IXGBE_LINK_SPEED_10GB_FULL; ++ *negotiation = false; ++ break; ++ ++ case IXGBE_AUTOC_LMS_KX4_KX_KR: ++ case IXGBE_AUTOC_LMS_KX4_KX_KR_1G_AN: ++ *speed = IXGBE_LINK_SPEED_UNKNOWN; ++ if (autoc & IXGBE_AUTOC_KR_SUPP) ++ *speed |= IXGBE_LINK_SPEED_10GB_FULL; ++ if (autoc & IXGBE_AUTOC_KX4_SUPP) ++ *speed |= IXGBE_LINK_SPEED_10GB_FULL; ++ if (autoc & IXGBE_AUTOC_KX_SUPP) ++ *speed |= IXGBE_LINK_SPEED_1GB_FULL; ++ *negotiation = true; ++ break; ++ ++ case IXGBE_AUTOC_LMS_KX4_KX_KR_SGMII: ++ *speed = IXGBE_LINK_SPEED_100_FULL; ++ if (autoc & IXGBE_AUTOC_KR_SUPP) ++ *speed |= IXGBE_LINK_SPEED_10GB_FULL; ++ if (autoc & IXGBE_AUTOC_KX4_SUPP) ++ *speed |= IXGBE_LINK_SPEED_10GB_FULL; ++ if (autoc & IXGBE_AUTOC_KX_SUPP) ++ *speed |= IXGBE_LINK_SPEED_1GB_FULL; ++ *negotiation = true; ++ break; ++ ++ case IXGBE_AUTOC_LMS_SGMII_1G_100M: ++ *speed = IXGBE_LINK_SPEED_1GB_FULL | IXGBE_LINK_SPEED_100_FULL; ++ *negotiation = false; ++ break; ++ ++ default: ++ status = IXGBE_ERR_LINK_SETUP; ++ goto out; ++ break; ++ } ++ ++ if (hw->phy.multispeed_fiber) { ++ *speed |= IXGBE_LINK_SPEED_10GB_FULL | ++ IXGBE_LINK_SPEED_1GB_FULL; ++ *negotiation = true; ++ } ++ ++out: ++ return status; ++} ++ ++/** ++ * ixgbe_get_media_type_82599 - Get media type ++ * @hw: pointer to hardware structure ++ * ++ * Returns the media type (fiber, copper, backplane) ++ **/ ++enum ixgbe_media_type ixgbe_get_media_type_82599(struct ixgbe_hw *hw) ++{ ++ enum ixgbe_media_type media_type; ++ ++ /* Detect if there is a copper PHY attached. */ ++ if (hw->phy.type == ixgbe_phy_cu_unknown || ++ hw->phy.type == ixgbe_phy_tn || ++ hw->phy.type == ixgbe_phy_aq) { ++ media_type = ixgbe_media_type_copper; ++ goto out; ++ } ++ ++ switch (hw->device_id) { ++ case IXGBE_DEV_ID_82599_KX4: ++ case IXGBE_DEV_ID_82599_XAUI_LOM: ++ /* Default device ID is mezzanine card KX/KX4 */ ++ media_type = ixgbe_media_type_backplane; ++ break; ++ case IXGBE_DEV_ID_82599_SFP: ++ media_type = ixgbe_media_type_fiber; ++ break; ++ default: ++ media_type = ixgbe_media_type_unknown; ++ break; ++ } ++out: ++ return media_type; ++} ++ ++/** ++ * ixgbe_setup_mac_link_82599 - Setup MAC link settings ++ * @hw: pointer to hardware structure ++ * ++ * Configures link settings based on values in the ixgbe_hw struct. ++ * Restarts the link. Performs autonegotiation if needed. ++ **/ ++s32 ixgbe_setup_mac_link_82599(struct ixgbe_hw *hw) ++{ ++ u32 autoc_reg; ++ u32 links_reg; ++ u32 i; ++ s32 status = 0; ++ ++ ++ /* Restart link */ ++ autoc_reg = IXGBE_READ_REG(hw, IXGBE_AUTOC); ++ autoc_reg |= IXGBE_AUTOC_AN_RESTART; ++ IXGBE_WRITE_REG(hw, IXGBE_AUTOC, autoc_reg); ++ ++ /* Only poll for autoneg to complete if specified to do so */ ++ if (hw->phy.autoneg_wait_to_complete) { ++ if ((autoc_reg & IXGBE_AUTOC_LMS_MASK) == ++ IXGBE_AUTOC_LMS_KX4_KX_KR || ++ (autoc_reg & IXGBE_AUTOC_LMS_MASK) == ++ IXGBE_AUTOC_LMS_KX4_KX_KR_1G_AN ++ || (autoc_reg & IXGBE_AUTOC_LMS_MASK) == ++ IXGBE_AUTOC_LMS_KX4_KX_KR_SGMII) { ++ links_reg = 0; /* Just in case Autoneg time = 0 */ ++ for (i = 0; i < IXGBE_AUTO_NEG_TIME; i++) { ++ links_reg = IXGBE_READ_REG(hw, IXGBE_LINKS); ++ if (links_reg & IXGBE_LINKS_KX_AN_COMP) ++ break; ++ msleep(100); ++ } ++ if (!(links_reg & IXGBE_LINKS_KX_AN_COMP)) { ++ status = IXGBE_ERR_AUTONEG_NOT_COMPLETE; ++ hw_dbg(hw, "Autoneg did not complete.\n"); ++ } ++ } ++ } ++ ++ /* Add delay to filter out noises during initial link setup */ ++ msleep(50); ++ ++ return status; ++} ++ ++/** ++ * ixgbe_setup_mac_link_multispeed_fiber - Setup MAC link settings ++ * @hw: pointer to hardware structure ++ * ++ * Configures link settings based on values in the ixgbe_hw struct. ++ * Restarts the link for multi-speed fiber at 1G speed, if link ++ * fails at 10G. ++ * Performs autonegotiation if needed. ++ **/ ++s32 ixgbe_setup_mac_link_multispeed_fiber(struct ixgbe_hw *hw) ++{ ++ s32 status = 0; ++ ixgbe_link_speed link_speed = IXGBE_LINK_SPEED_82599_AUTONEG; ++ status = ixgbe_setup_mac_link_speed_multispeed_fiber(hw, ++ link_speed, true, true); ++ return status; ++} ++ ++/** ++ * ixgbe_setup_mac_link_speed_multispeed_fiber - Set MAC link speed ++ * @hw: pointer to hardware structure ++ * @speed: new link speed ++ * @autoneg: true if autonegotiation enabled ++ * @autoneg_wait_to_complete: true when waiting for completion is needed ++ * ++ * Set the link speed in the AUTOC register and restarts link. ++ **/ ++s32 ixgbe_setup_mac_link_speed_multispeed_fiber(struct ixgbe_hw *hw, ++ ixgbe_link_speed speed, bool autoneg, ++ bool autoneg_wait_to_complete) ++{ ++ s32 status = 0; ++ ixgbe_link_speed link_speed; ++ ixgbe_link_speed highest_link_speed = IXGBE_LINK_SPEED_UNKNOWN; ++ u32 speedcnt = 0; ++ u32 esdp_reg = IXGBE_READ_REG(hw, IXGBE_ESDP); ++ u32 i = 0; ++ bool link_up = false; ++ bool negotiation; ++ ++ /* Mask off requested but non-supported speeds */ ++ status = ixgbe_get_link_capabilities(hw, &link_speed, &negotiation); ++ if (status != 0) ++ goto out; ++ ++ speed &= link_speed; ++ ++ /* Set autoneg_advertised value based on input link speed */ ++ hw->phy.autoneg_advertised = 0; ++ ++ if (speed & IXGBE_LINK_SPEED_10GB_FULL) ++ hw->phy.autoneg_advertised |= IXGBE_LINK_SPEED_10GB_FULL; ++ ++ if (speed & IXGBE_LINK_SPEED_1GB_FULL) ++ hw->phy.autoneg_advertised |= IXGBE_LINK_SPEED_1GB_FULL; ++ ++ /* ++ * When the driver changes the link speeds that it can support, ++ * it sets autotry_restart to true to indicate that we need to ++ * initiate a new autotry session with the link partner. To do ++ * so, we set the speed then disable and re-enable the tx laser, to ++ * alert the link partner that it also needs to restart autotry on its ++ * end. This is consistent with true clause 37 autoneg, which also ++ * involves a loss of signal. ++ */ ++ ++ /* ++ * Try each speed one by one, highest priority first. We do this in ++ * software because 10gb fiber doesn't support speed autonegotiation. ++ */ ++ if (speed & IXGBE_LINK_SPEED_10GB_FULL) { ++ speedcnt++; ++ highest_link_speed = IXGBE_LINK_SPEED_10GB_FULL; ++ ++ /* If we already have link at this speed, just jump out */ ++ status = ixgbe_check_link(hw, &link_speed, &link_up, false); ++ if (status != 0) ++ goto out; ++ ++ if ((link_speed == IXGBE_LINK_SPEED_10GB_FULL) && link_up) ++ goto out; ++ ++ /* Set the module link speed */ ++ esdp_reg |= (IXGBE_ESDP_SDP5_DIR | IXGBE_ESDP_SDP5); ++ IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp_reg); ++ ++ /* Allow module to change analog characteristics (1G->10G) */ ++ msleep(40); ++ ++ status = ixgbe_setup_mac_link_speed_82599( ++ hw, IXGBE_LINK_SPEED_10GB_FULL, autoneg, ++ autoneg_wait_to_complete); ++ if (status != 0) ++ goto out; ++ ++ /* Flap the tx laser if it has not already been done */ ++ if (hw->mac.autotry_restart) { ++ /* Disable tx laser; allow 100us to go dark per spec */ ++ esdp_reg |= IXGBE_ESDP_SDP3; ++ IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp_reg); ++ udelay(100); ++ ++ /* Enable tx laser; allow 2ms to light up per spec */ ++ esdp_reg &= ~IXGBE_ESDP_SDP3; ++ IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp_reg); ++ msleep(2); ++ ++ hw->mac.autotry_restart = false; ++ } ++ ++ /* The controller may take up to 500ms at 10g to acquire link */ ++ for (i = 0; i < 5; i++) { ++ /* Wait for the link partner to also set speed */ ++ msleep(100); ++ ++ /* If we have link, just jump out */ ++ status = ixgbe_check_link(hw, &link_speed, ++ &link_up, false); ++ if (status != 0) ++ goto out; ++ ++ if (link_up) ++ goto out; ++ } ++ } ++ ++ if (speed & IXGBE_LINK_SPEED_1GB_FULL) { ++ speedcnt++; ++ if (highest_link_speed == IXGBE_LINK_SPEED_UNKNOWN) ++ highest_link_speed = IXGBE_LINK_SPEED_1GB_FULL; ++ ++ /* If we already have link at this speed, just jump out */ ++ status = ixgbe_check_link(hw, &link_speed, &link_up, false); ++ if (status != 0) ++ goto out; ++ ++ if ((link_speed == IXGBE_LINK_SPEED_1GB_FULL) && link_up) ++ goto out; ++ ++ /* Set the module link speed */ ++ esdp_reg &= ~IXGBE_ESDP_SDP5; ++ esdp_reg |= IXGBE_ESDP_SDP5_DIR; ++ IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp_reg); ++ ++ /* Allow module to change analog characteristics (10G->1G) */ ++ msleep(40); ++ ++ status = ixgbe_setup_mac_link_speed_82599( ++ hw, IXGBE_LINK_SPEED_1GB_FULL, autoneg, ++ autoneg_wait_to_complete); ++ if (status != 0) ++ goto out; ++ ++ /* Flap the tx laser if it has not already been done */ ++ if (hw->mac.autotry_restart) { ++ /* Disable tx laser; allow 100us to go dark per spec */ ++ esdp_reg |= IXGBE_ESDP_SDP3; ++ IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp_reg); ++ udelay(100); ++ ++ /* Enable tx laser; allow 2ms to light up per spec */ ++ esdp_reg &= ~IXGBE_ESDP_SDP3; ++ IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp_reg); ++ msleep(2); ++ ++ hw->mac.autotry_restart = false; ++ } ++ ++ /* Wait for the link partner to also set speed */ ++ msleep(100); ++ ++ /* If we have link, just jump out */ ++ status = ixgbe_check_link(hw, &link_speed, &link_up, false); ++ if (status != 0) ++ goto out; ++ ++ if (link_up) ++ goto out; ++ } ++ ++ /* ++ * We didn't get link. Configure back to the highest speed we tried, ++ * (if there was more than one). We call ourselves back with just the ++ * single highest speed that the user requested. ++ */ ++ if (speedcnt > 1) ++ status = ixgbe_setup_mac_link_speed_multispeed_fiber(hw, ++ highest_link_speed, autoneg, autoneg_wait_to_complete); ++ ++out: ++ return status; ++} ++ ++/** ++ * ixgbe_check_mac_link_82599 - Determine link and speed status ++ * @hw: pointer to hardware structure ++ * @speed: pointer to link speed ++ * @link_up: true when link is up ++ * @link_up_wait_to_complete: bool used to wait for link up or not ++ * ++ * Reads the links register to determine if link is up and the current speed ++ **/ ++s32 ixgbe_check_mac_link_82599(struct ixgbe_hw *hw, ixgbe_link_speed *speed, ++ bool *link_up, bool link_up_wait_to_complete) ++{ ++ u32 links_reg; ++ u32 i; ++ ++ links_reg = IXGBE_READ_REG(hw, IXGBE_LINKS); ++ if (link_up_wait_to_complete) { ++ for (i = 0; i < IXGBE_LINK_UP_TIME; i++) { ++ if (links_reg & IXGBE_LINKS_UP) { ++ *link_up = true; ++ break; ++ } else { ++ *link_up = false; ++ } ++ msleep(100); ++ links_reg = IXGBE_READ_REG(hw, IXGBE_LINKS); ++ } ++ } else { ++ if (links_reg & IXGBE_LINKS_UP) ++ *link_up = true; ++ else ++ *link_up = false; ++ } ++ ++ if ((links_reg & IXGBE_LINKS_SPEED_82599) == ++ IXGBE_LINKS_SPEED_10G_82599) ++ *speed = IXGBE_LINK_SPEED_10GB_FULL; ++ else if ((links_reg & IXGBE_LINKS_SPEED_82599) == ++ IXGBE_LINKS_SPEED_1G_82599) ++ *speed = IXGBE_LINK_SPEED_1GB_FULL; ++ else ++ *speed = IXGBE_LINK_SPEED_100_FULL; ++ ++ /* if link is down, zero out the current_mode */ ++ if (*link_up == false) { ++ hw->fc.current_mode = ixgbe_fc_none; ++ hw->fc.fc_was_autonegged = false; ++ } ++ ++ return 0; ++} ++ ++/** ++ * ixgbe_setup_mac_link_speed_82599 - Set MAC link speed ++ * @hw: pointer to hardware structure ++ * @speed: new link speed ++ * @autoneg: true if autonegotiation enabled ++ * @autoneg_wait_to_complete: true when waiting for completion is needed ++ * ++ * Set the link speed in the AUTOC register and restarts link. ++ **/ ++s32 ixgbe_setup_mac_link_speed_82599(struct ixgbe_hw *hw, ++ ixgbe_link_speed speed, bool autoneg, ++ bool autoneg_wait_to_complete) ++{ ++ s32 status = 0; ++ u32 autoc = IXGBE_READ_REG(hw, IXGBE_AUTOC); ++ u32 autoc2 = IXGBE_READ_REG(hw, IXGBE_AUTOC2); ++ u32 start_autoc = autoc; ++ u32 orig_autoc = 0; ++ u32 link_mode = autoc & IXGBE_AUTOC_LMS_MASK; ++ u32 pma_pmd_1g = autoc & IXGBE_AUTOC_1G_PMA_PMD_MASK; ++ u32 pma_pmd_10g_serial = autoc2 & IXGBE_AUTOC2_10G_SERIAL_PMA_PMD_MASK; ++ u32 links_reg; ++ u32 i; ++ ixgbe_link_speed link_capabilities = IXGBE_LINK_SPEED_UNKNOWN; ++ ++ /* Check to see if speed passed in is supported. */ ++ status = ixgbe_get_link_capabilities(hw, &link_capabilities, &autoneg); ++ if (status != 0) ++ goto out; ++ ++ speed &= link_capabilities; ++ ++ if (speed == IXGBE_LINK_SPEED_UNKNOWN) { ++ status = IXGBE_ERR_LINK_SETUP; ++ goto out; ++ } ++ ++ /* Use stored value (EEPROM defaults) of AUTOC to find KR/KX4 support*/ ++ if (hw->mac.orig_link_settings_stored) ++ orig_autoc = hw->mac.orig_autoc; ++ else ++ orig_autoc = autoc; ++ ++ if (link_mode == IXGBE_AUTOC_LMS_KX4_KX_KR || ++ link_mode == IXGBE_AUTOC_LMS_KX4_KX_KR_1G_AN || ++ link_mode == IXGBE_AUTOC_LMS_KX4_KX_KR_SGMII) { ++ /* Set KX4/KX/KR support according to speed requested */ ++ autoc &= ~(IXGBE_AUTOC_KX4_KX_SUPP_MASK | IXGBE_AUTOC_KR_SUPP); ++ if (speed & IXGBE_LINK_SPEED_10GB_FULL) ++ if (orig_autoc & IXGBE_AUTOC_KX4_SUPP) ++ autoc |= IXGBE_AUTOC_KX4_SUPP; ++ if (orig_autoc & IXGBE_AUTOC_KR_SUPP) ++ autoc |= IXGBE_AUTOC_KR_SUPP; ++ if (speed & IXGBE_LINK_SPEED_1GB_FULL) ++ autoc |= IXGBE_AUTOC_KX_SUPP; ++ } else if ((pma_pmd_1g == IXGBE_AUTOC_1G_SFI) && ++ (link_mode == IXGBE_AUTOC_LMS_1G_LINK_NO_AN || ++ link_mode == IXGBE_AUTOC_LMS_1G_AN)) { ++ /* Switch from 1G SFI to 10G SFI if requested */ ++ if ((speed == IXGBE_LINK_SPEED_10GB_FULL) && ++ (pma_pmd_10g_serial == IXGBE_AUTOC2_10G_SFI)) { ++ autoc &= ~IXGBE_AUTOC_LMS_MASK; ++ autoc |= IXGBE_AUTOC_LMS_10G_SERIAL; ++ } ++ } else if ((pma_pmd_10g_serial == IXGBE_AUTOC2_10G_SFI) && ++ (link_mode == IXGBE_AUTOC_LMS_10G_SERIAL)) { ++ /* Switch from 10G SFI to 1G SFI if requested */ ++ if ((speed == IXGBE_LINK_SPEED_1GB_FULL) && ++ (pma_pmd_1g == IXGBE_AUTOC_1G_SFI)) { ++ autoc &= ~IXGBE_AUTOC_LMS_MASK; ++ if (autoneg) ++ autoc |= IXGBE_AUTOC_LMS_1G_AN; ++ else ++ autoc |= IXGBE_AUTOC_LMS_1G_LINK_NO_AN; ++ } ++ } ++ ++ if (autoc != start_autoc) { ++ ++ /* Restart link */ ++ autoc |= IXGBE_AUTOC_AN_RESTART; ++ IXGBE_WRITE_REG(hw, IXGBE_AUTOC, autoc); ++ ++ /* Only poll for autoneg to complete if specified to do so */ ++ if (autoneg_wait_to_complete) { ++ if (link_mode == IXGBE_AUTOC_LMS_KX4_KX_KR || ++ link_mode == IXGBE_AUTOC_LMS_KX4_KX_KR_1G_AN || ++ link_mode == IXGBE_AUTOC_LMS_KX4_KX_KR_SGMII) { ++ links_reg = 0; /*Just in case Autoneg time=0*/ ++ for (i = 0; i < IXGBE_AUTO_NEG_TIME; i++) { ++ links_reg = ++ IXGBE_READ_REG(hw, IXGBE_LINKS); ++ if (links_reg & IXGBE_LINKS_KX_AN_COMP) ++ break; ++ msleep(100); ++ } ++ if (!(links_reg & IXGBE_LINKS_KX_AN_COMP)) { ++ status = ++ IXGBE_ERR_AUTONEG_NOT_COMPLETE; ++ hw_dbg(hw, "Autoneg did not complete.\n"); ++ } ++ } ++ } ++ ++ /* Add delay to filter out noises during initial link setup */ ++ msleep(50); ++ } ++ ++out: ++ return status; ++} ++ ++/** ++ * ixgbe_setup_copper_link_82599 - Setup copper link settings ++ * @hw: pointer to hardware structure ++ * ++ * Restarts the link on PHY and then MAC. Performs autonegotiation if needed. ++ **/ ++static s32 ixgbe_setup_copper_link_82599(struct ixgbe_hw *hw) ++{ ++ s32 status; ++ ++ /* Restart autonegotiation on PHY */ ++ status = hw->phy.ops.setup_link(hw); ++ ++ /* Set up MAC */ ++ ixgbe_setup_mac_link_82599(hw); ++ ++ return status; ++} ++ ++/** ++ * ixgbe_setup_copper_link_speed_82599 - Set the PHY autoneg advertised field ++ * @hw: pointer to hardware structure ++ * @speed: new link speed ++ * @autoneg: true if autonegotiation enabled ++ * @autoneg_wait_to_complete: true if waiting is needed to complete ++ * ++ * Restarts link on PHY and MAC based on settings passed in. ++ **/ ++static s32 ixgbe_setup_copper_link_speed_82599(struct ixgbe_hw *hw, ++ ixgbe_link_speed speed, ++ bool autoneg, ++ bool autoneg_wait_to_complete) ++{ ++ s32 status; ++ ++ /* Setup the PHY according to input speed */ ++ status = hw->phy.ops.setup_link_speed(hw, speed, autoneg, ++ autoneg_wait_to_complete); ++ /* Set up MAC */ ++ ixgbe_setup_mac_link_82599(hw); ++ ++ return status; ++} ++/** ++ * ixgbe_reset_hw_82599 - Perform hardware reset ++ * @hw: pointer to hardware structure ++ * ++ * Resets the hardware by resetting the transmit and receive units, masks ++ * and clears all interrupts, perform a PHY reset, and perform a link (MAC) ++ * reset. ++ **/ ++s32 ixgbe_reset_hw_82599(struct ixgbe_hw *hw) ++{ ++ s32 status = 0; ++ u32 ctrl, ctrl_ext; ++ u32 i; ++ u32 autoc; ++ u32 autoc2; ++ ++ /* Call adapter stop to disable tx/rx and clear interrupts */ ++ hw->mac.ops.stop_adapter(hw); ++ ++ /* PHY ops must be identified and initialized prior to reset */ ++ ++ /* Identify PHY and related function pointers */ ++ status = hw->phy.ops.init(hw); ++ ++ if (status == IXGBE_ERR_SFP_NOT_SUPPORTED) ++ goto reset_hw_out; ++ ++ ++ /* Setup SFP module if there is one present. */ ++ if (hw->phy.sfp_setup_needed) { ++ status = hw->mac.ops.setup_sfp(hw); ++ hw->phy.sfp_setup_needed = false; ++ } ++ ++ if (status == IXGBE_ERR_SFP_NOT_SUPPORTED) ++ goto reset_hw_out; ++ ++ /* Reset PHY */ ++ if (hw->phy.reset_disable == false && hw->phy.ops.reset != NULL) ++ hw->phy.ops.reset(hw); ++ ++ /* ++ * Prevent the PCI-E bus from from hanging by disabling PCI-E master ++ * access and verify no pending requests before reset ++ */ ++ status = ixgbe_disable_pcie_master(hw); ++ if (status != 0) { ++ status = IXGBE_ERR_MASTER_REQUESTS_PENDING; ++ hw_dbg(hw, "PCI-E Master disable polling has failed.\n"); ++ } ++ ++ /* ++ * Issue global reset to the MAC. This needs to be a SW reset. ++ * If link reset is used, it might reset the MAC when mng is using it ++ */ ++ ctrl = IXGBE_READ_REG(hw, IXGBE_CTRL); ++ IXGBE_WRITE_REG(hw, IXGBE_CTRL, (ctrl | IXGBE_CTRL_RST)); ++ IXGBE_WRITE_FLUSH(hw); ++ ++ /* Poll for reset bit to self-clear indicating reset is complete */ ++ for (i = 0; i < 10; i++) { ++ udelay(1); ++ ctrl = IXGBE_READ_REG(hw, IXGBE_CTRL); ++ if (!(ctrl & IXGBE_CTRL_RST)) ++ break; ++ } ++ if (ctrl & IXGBE_CTRL_RST) { ++ status = IXGBE_ERR_RESET_FAILED; ++ hw_dbg(hw, "Reset polling failed to complete.\n"); ++ } ++ /* Clear PF Reset Done bit so PF/VF Mail Ops can work */ ++ ctrl_ext = IXGBE_READ_REG(hw, IXGBE_CTRL_EXT); ++ ctrl_ext |= IXGBE_CTRL_EXT_PFRSTD; ++ IXGBE_WRITE_REG(hw, IXGBE_CTRL_EXT, ctrl_ext); ++ ++ msleep(50); ++ ++ ++ ++ /* ++ * Store the original AUTOC/AUTOC2 values if they have not been ++ * stored off yet. Otherwise restore the stored original ++ * values since the reset operation sets back to defaults. ++ */ ++ autoc = IXGBE_READ_REG(hw, IXGBE_AUTOC); ++ autoc2 = IXGBE_READ_REG(hw, IXGBE_AUTOC2); ++ if (hw->mac.orig_link_settings_stored == false) { ++ hw->mac.orig_autoc = autoc; ++ hw->mac.orig_autoc2 = autoc2; ++ hw->mac.orig_link_settings_stored = true; ++ } else { ++ if (autoc != hw->mac.orig_autoc) ++ IXGBE_WRITE_REG(hw, IXGBE_AUTOC, (hw->mac.orig_autoc | ++ IXGBE_AUTOC_AN_RESTART)); ++ ++ if ((autoc2 & IXGBE_AUTOC2_UPPER_MASK) != ++ (hw->mac.orig_autoc2 & IXGBE_AUTOC2_UPPER_MASK)) { ++ autoc2 &= ~IXGBE_AUTOC2_UPPER_MASK; ++ autoc2 |= (hw->mac.orig_autoc2 & ++ IXGBE_AUTOC2_UPPER_MASK); ++ IXGBE_WRITE_REG(hw, IXGBE_AUTOC2, autoc2); ++ } ++ } ++ ++ /* Store the permanent mac address */ ++ hw->mac.ops.get_mac_addr(hw, hw->mac.perm_addr); ++ ++ /* ++ * Store MAC address from RAR0, clear receive address registers, and ++ * clear the multicast table. Also reset num_rar_entries to 128, ++ * since we modify this value when programming the SAN MAC address. ++ */ ++ hw->mac.num_rar_entries = 128; ++ hw->mac.ops.init_rx_addrs(hw); ++ ++ ++ ++ /* Store the permanent SAN mac address */ ++ hw->mac.ops.get_san_mac_addr(hw, hw->mac.san_addr); ++ ++ /* Add the SAN MAC address to the RAR only if it's a valid address */ ++ if (ixgbe_validate_mac_addr(hw->mac.san_addr) == 0) { ++ hw->mac.ops.set_rar(hw, hw->mac.num_rar_entries - 1, ++ hw->mac.san_addr, 0, IXGBE_RAH_AV); ++ ++ /* Reserve the last RAR for the SAN MAC address */ ++ hw->mac.num_rar_entries--; ++ } ++ ++reset_hw_out: ++ return status; ++} ++ ++/** ++ * ixgbe_insert_mac_addr_82599 - Find a RAR for this mac address ++ * @hw: pointer to hardware structure ++ * @addr: Address to put into receive address register ++ * @vmdq: VMDq pool to assign ++ * ++ * Puts an ethernet address into a receive address register, or ++ * finds the rar that it is aleady in; adds to the pool list ++ **/ ++s32 ixgbe_insert_mac_addr_82599(struct ixgbe_hw *hw, u8 *addr, u32 vmdq) ++{ ++ static const u32 NO_EMPTY_RAR_FOUND = 0xFFFFFFFF; ++ u32 first_empty_rar = NO_EMPTY_RAR_FOUND; ++ u32 rar; ++ u32 rar_low, rar_high; ++ u32 addr_low, addr_high; ++ ++ /* swap bytes for HW little endian */ ++ addr_low = addr[0] | (addr[1] << 8) ++ | (addr[2] << 16) ++ | (addr[3] << 24); ++ addr_high = addr[4] | (addr[5] << 8); ++ ++ /* ++ * Either find the mac_id in rar or find the first empty space. ++ * rar_highwater points to just after the highest currently used ++ * rar in order to shorten the search. It grows when we add a new ++ * rar to the top. ++ */ ++ for (rar = 0; rar < hw->mac.rar_highwater; rar++) { ++ rar_high = IXGBE_READ_REG(hw, IXGBE_RAH(rar)); ++ ++ if (((IXGBE_RAH_AV & rar_high) == 0) ++ && first_empty_rar == NO_EMPTY_RAR_FOUND) { ++ first_empty_rar = rar; ++ } else if ((rar_high & 0xFFFF) == addr_high) { ++ rar_low = IXGBE_READ_REG(hw, IXGBE_RAL(rar)); ++ if (rar_low == addr_low) ++ break; /* found it already in the rars */ ++ } ++ } ++ ++ if (rar < hw->mac.rar_highwater) { ++ /* already there so just add to the pool bits */ ++ ixgbe_set_vmdq(hw, rar, vmdq); ++ } else if (first_empty_rar != NO_EMPTY_RAR_FOUND) { ++ /* stick it into first empty RAR slot we found */ ++ rar = first_empty_rar; ++ ixgbe_set_rar(hw, rar, addr, vmdq, IXGBE_RAH_AV); ++ } else if (rar == hw->mac.rar_highwater) { ++ /* add it to the top of the list and inc the highwater mark */ ++ ixgbe_set_rar(hw, rar, addr, vmdq, IXGBE_RAH_AV); ++ hw->mac.rar_highwater++; ++ } else if (rar >= hw->mac.num_rar_entries) { ++ return IXGBE_ERR_INVALID_MAC_ADDR; ++ } ++ ++ /* ++ * If we found rar[0], make sure the default pool bit (we use pool 0) ++ * remains cleared to be sure default pool packets will get delivered ++ */ ++ if (rar == 0) ++ ixgbe_clear_vmdq(hw, rar, 0); ++ ++ return rar; ++} ++ ++/** ++ * ixgbe_clear_vmdq_82599 - Disassociate a VMDq pool index from a rx address ++ * @hw: pointer to hardware struct ++ * @rar: receive address register index to disassociate ++ * @vmdq: VMDq pool index to remove from the rar ++ **/ ++s32 ixgbe_clear_vmdq_82599(struct ixgbe_hw *hw, u32 rar, u32 vmdq) ++{ ++ u32 mpsar_lo, mpsar_hi; ++ u32 rar_entries = hw->mac.num_rar_entries; ++ ++ if (rar < rar_entries) { ++ mpsar_lo = IXGBE_READ_REG(hw, IXGBE_MPSAR_LO(rar)); ++ mpsar_hi = IXGBE_READ_REG(hw, IXGBE_MPSAR_HI(rar)); ++ ++ if (!mpsar_lo && !mpsar_hi) ++ goto done; ++ ++ if (vmdq == IXGBE_CLEAR_VMDQ_ALL) { ++ if (mpsar_lo) { ++ IXGBE_WRITE_REG(hw, IXGBE_MPSAR_LO(rar), 0); ++ mpsar_lo = 0; ++ } ++ if (mpsar_hi) { ++ IXGBE_WRITE_REG(hw, IXGBE_MPSAR_HI(rar), 0); ++ mpsar_hi = 0; ++ } ++ } else if (vmdq < 32) { ++ mpsar_lo &= ~(1 << vmdq); ++ IXGBE_WRITE_REG(hw, IXGBE_MPSAR_LO(rar), mpsar_lo); ++ } else { ++ mpsar_hi &= ~(1 << (vmdq - 32)); ++ IXGBE_WRITE_REG(hw, IXGBE_MPSAR_HI(rar), mpsar_hi); ++ } ++ ++ /* was that the last pool using this rar? */ ++ if (mpsar_lo == 0 && mpsar_hi == 0 && rar != 0) ++ hw->mac.ops.clear_rar(hw, rar); ++ } else { ++ hw_dbg(hw, "RAR index %d is out of range.\n", rar); ++ } ++ ++done: ++ return 0; ++} ++ ++/** ++ * ixgbe_set_vmdq_82599 - Associate a VMDq pool index with a rx address ++ * @hw: pointer to hardware struct ++ * @rar: receive address register index to associate with a VMDq index ++ * @vmdq: VMDq pool index ++ **/ ++s32 ixgbe_set_vmdq_82599(struct ixgbe_hw *hw, u32 rar, u32 vmdq) ++{ ++ u32 mpsar; ++ u32 rar_entries = hw->mac.num_rar_entries; ++ ++ if (rar < rar_entries) { ++ if (vmdq < 32) { ++ mpsar = IXGBE_READ_REG(hw, IXGBE_MPSAR_LO(rar)); ++ mpsar |= 1 << vmdq; ++ IXGBE_WRITE_REG(hw, IXGBE_MPSAR_LO(rar), mpsar); ++ } else { ++ mpsar = IXGBE_READ_REG(hw, IXGBE_MPSAR_HI(rar)); ++ mpsar |= 1 << (vmdq - 32); ++ IXGBE_WRITE_REG(hw, IXGBE_MPSAR_HI(rar), mpsar); ++ } ++ } else { ++ hw_dbg(hw, "RAR index %d is out of range.\n", rar); ++ } ++ return 0; ++} ++ ++/** ++ * ixgbe_set_vfta_82599 - Set VLAN filter table ++ * @hw: pointer to hardware structure ++ * @vlan: VLAN id to write to VLAN filter ++ * @vind: VMDq output index that maps queue to VLAN id in VFVFB ++ * @vlan_on: boolean flag to turn on/off VLAN in VFVF ++ * ++ * Turn on/off specified VLAN in the VLAN filter table. ++ **/ ++s32 ixgbe_set_vfta_82599(struct ixgbe_hw *hw, u32 vlan, u32 vind, ++ bool vlan_on) ++{ ++ u32 regindex; ++ u32 bitindex; ++ u32 bits; ++ u32 first_empty_slot; ++ ++ if (vlan > 4095) ++ return IXGBE_ERR_PARAM; ++ ++ /* ++ * this is a 2 part operation - first the VFTA, then the ++ * VLVF and VLVFB if vind is set ++ */ ++ ++ /* Part 1 ++ * The VFTA is a bitstring made up of 128 32-bit registers ++ * that enable the particular VLAN id, much like the MTA: ++ * bits[11-5]: which register ++ * bits[4-0]: which bit in the register ++ */ ++ regindex = (vlan >> 5) & 0x7F; ++ bitindex = vlan & 0x1F; ++ bits = IXGBE_READ_REG(hw, IXGBE_VFTA(regindex)); ++ if (vlan_on) ++ bits |= (1 << bitindex); ++ else ++ bits &= ~(1 << bitindex); ++ IXGBE_WRITE_REG(hw, IXGBE_VFTA(regindex), bits); ++ ++ ++ /* Part 2 ++ * If the vind is set ++ * Either vlan_on ++ * make sure the vlan is in VLVF ++ * set the vind bit in the matching VLVFB ++ * Or !vlan_on ++ * clear the pool bit and possibly the vind ++ */ ++ if (vind) { ++ /* find the vlanid or the first empty slot */ ++ first_empty_slot = 0; ++ ++ for (regindex = 1; regindex < IXGBE_VLVF_ENTRIES; regindex++) { ++ bits = IXGBE_READ_REG(hw, IXGBE_VLVF(regindex)); ++ if (!bits && !first_empty_slot) ++ first_empty_slot = regindex; ++ else if ((bits & 0x0FFF) == vlan) ++ break; ++ } ++ ++ if (regindex >= IXGBE_VLVF_ENTRIES) { ++ if (first_empty_slot) ++ regindex = first_empty_slot; ++ else { ++ hw_dbg(hw, "No space in VLVF.\n"); ++ goto out; ++ } ++ } ++ ++ ++ if (vlan_on) { ++ /* set the pool bit */ ++ if (vind < 32) { ++ bits = ++ IXGBE_READ_REG(hw, IXGBE_VLVFB(regindex*2)); ++ bits |= (1 << vind); ++ IXGBE_WRITE_REG(hw, ++ IXGBE_VLVFB(regindex*2), bits); ++ } else { ++ bits = IXGBE_READ_REG(hw, ++ IXGBE_VLVFB((regindex*2)+1)); ++ bits |= (1 << vind); ++ IXGBE_WRITE_REG(hw, ++ IXGBE_VLVFB((regindex*2)+1), bits); ++ } ++ } else { ++ /* clear the pool bit */ ++ if (vind < 32) { ++ bits = IXGBE_READ_REG(hw, ++ IXGBE_VLVFB(regindex*2)); ++ bits &= ~(1 << vind); ++ IXGBE_WRITE_REG(hw, ++ IXGBE_VLVFB(regindex*2), bits); ++ bits |= IXGBE_READ_REG(hw, ++ IXGBE_VLVFB((regindex*2)+1)); ++ } else { ++ bits = IXGBE_READ_REG(hw, ++ IXGBE_VLVFB((regindex*2)+1)); ++ bits &= ~(1 << vind); ++ IXGBE_WRITE_REG(hw, ++ IXGBE_VLVFB((regindex*2)+1), bits); ++ bits |= IXGBE_READ_REG(hw, ++ IXGBE_VLVFB(regindex*2)); ++ } ++ } ++ ++ if (bits) ++ IXGBE_WRITE_REG(hw, IXGBE_VLVF(regindex), ++ (IXGBE_VLVF_VIEN | vlan)); ++ else ++ IXGBE_WRITE_REG(hw, IXGBE_VLVF(regindex), 0); ++ } ++ ++out: ++ return 0; ++} ++ ++/** ++ * ixgbe_clear_vfta_82599 - Clear VLAN filter table ++ * @hw: pointer to hardware structure ++ * ++ * Clears the VLAN filer table, and the VMDq index associated with the filter ++ **/ ++s32 ixgbe_clear_vfta_82599(struct ixgbe_hw *hw) ++{ ++ u32 offset; ++ ++ for (offset = 0; offset < hw->mac.vft_size; offset++) ++ IXGBE_WRITE_REG(hw, IXGBE_VFTA(offset), 0); ++ ++ for (offset = 0; offset < IXGBE_VLVF_ENTRIES; offset++) { ++ IXGBE_WRITE_REG(hw, IXGBE_VLVF(offset), 0); ++ IXGBE_WRITE_REG(hw, IXGBE_VLVFB(offset*2), 0); ++ IXGBE_WRITE_REG(hw, IXGBE_VLVFB((offset*2)+1), 0); ++ } ++ ++ return 0; ++} ++ ++/** ++ * ixgbe_init_uta_tables_82599 - Initialize the Unicast Table Array ++ * @hw: pointer to hardware structure ++ **/ ++s32 ixgbe_init_uta_tables_82599(struct ixgbe_hw *hw) ++{ ++ int i; ++ hw_dbg(hw, " Clearing UTA\n"); ++ ++ for (i = 0; i < 128; i++) ++ IXGBE_WRITE_REG(hw, IXGBE_UTA(i), 0); ++ ++ return 0; ++} ++ ++/** ++ * ixgbe_reinit_fdir_tables_82599 - Reinitialize Flow Director tables. ++ * @hw: pointer to hardware structure ++ **/ ++s32 ixgbe_reinit_fdir_tables_82599(struct ixgbe_hw *hw) ++{ ++ int i; ++ u32 fdirctrl = IXGBE_READ_REG(hw, IXGBE_FDIRCTRL); ++ fdirctrl &= ~IXGBE_FDIRCTRL_INIT_DONE; ++ ++ /* ++ * Before starting reinitialization process, ++ * FDIRCMD.CMD must be zero. ++ */ ++ for (i = 0; i < IXGBE_FDIRCMD_CMD_POLL; i++) { ++ if (!(IXGBE_READ_REG(hw, IXGBE_FDIRCMD) & ++ IXGBE_FDIRCMD_CMD_MASK)) ++ break; ++ udelay(10); ++ } ++ if (i >= IXGBE_FDIRCMD_CMD_POLL) { ++ hw_dbg(hw, "Flow Director previous command isn't complete, " ++ "aborting table re-initialization. \n"); ++ return IXGBE_ERR_FDIR_REINIT_FAILED; ++ } ++ ++ IXGBE_WRITE_REG(hw, IXGBE_FDIRFREE, 0); ++ IXGBE_WRITE_FLUSH(hw); ++ /* ++ * 82599 adapters flow director init flow cannot be restarted, ++ * Workaround 82599 silicon errata by performing the following steps ++ * before re-writing the FDIRCTRL control register with the same value. ++ * - write 1 to bit 8 of FDIRCMD register & ++ * - write 0 to bit 8 of FDIRCMD register ++ */ ++ IXGBE_WRITE_REG(hw, IXGBE_FDIRCMD, ++ (IXGBE_READ_REG(hw, IXGBE_FDIRCMD) | ++ IXGBE_FDIRCMD_CLEARHT)); ++ IXGBE_WRITE_FLUSH(hw); ++ IXGBE_WRITE_REG(hw, IXGBE_FDIRCMD, ++ (IXGBE_READ_REG(hw, IXGBE_FDIRCMD) & ++ ~IXGBE_FDIRCMD_CLEARHT)); ++ IXGBE_WRITE_FLUSH(hw); ++ /* ++ * Clear FDIR Hash register to clear any leftover hashes ++ * waiting to be programmed. ++ */ ++ IXGBE_WRITE_REG(hw, IXGBE_FDIRHASH, 0x00); ++ IXGBE_WRITE_FLUSH(hw); ++ ++ IXGBE_WRITE_REG(hw, IXGBE_FDIRCTRL, fdirctrl); ++ IXGBE_WRITE_FLUSH(hw); ++ ++ /* Poll init-done after we write FDIRCTRL register */ ++ for (i = 0; i < IXGBE_FDIR_INIT_DONE_POLL; i++) { ++ if (IXGBE_READ_REG(hw, IXGBE_FDIRCTRL) & ++ IXGBE_FDIRCTRL_INIT_DONE) ++ break; ++ udelay(10); ++ } ++ if (i >= IXGBE_FDIR_INIT_DONE_POLL) { ++ hw_dbg(hw, "Flow Director Signature poll time exceeded!\n"); ++ return IXGBE_ERR_FDIR_REINIT_FAILED; ++ } ++ ++ /* Clear FDIR statistics registers (read to clear) */ ++ IXGBE_READ_REG(hw, IXGBE_FDIRUSTAT); ++ IXGBE_READ_REG(hw, IXGBE_FDIRFSTAT); ++ IXGBE_READ_REG(hw, IXGBE_FDIRMATCH); ++ IXGBE_READ_REG(hw, IXGBE_FDIRMISS); ++ IXGBE_READ_REG(hw, IXGBE_FDIRLEN); ++ ++ return 0; ++} ++ ++/** ++ * ixgbe_init_fdir_signature_82599 - Initialize Flow Director signature filters ++ * @hw: pointer to hardware structure ++ * @pballoc: which mode to allocate filters with ++ **/ ++s32 ixgbe_init_fdir_signature_82599(struct ixgbe_hw *hw, u32 pballoc) ++{ ++ u32 fdirctrl = 0; ++ u32 pbsize; ++ int i; ++ ++ /* ++ * Before enabling Flow Director, the Rx Packet Buffer size ++ * must be reduced. The new value is the current size minus ++ * flow director memory usage size. ++ */ ++ pbsize = (1 << (IXGBE_FDIR_PBALLOC_SIZE_SHIFT + pballoc)); ++ IXGBE_WRITE_REG(hw, IXGBE_RXPBSIZE(0), ++ (IXGBE_READ_REG(hw, IXGBE_RXPBSIZE(0)) - pbsize)); ++ ++ /* ++ * The defaults in the HW for RX PB 1-7 are not zero and so should be ++ * intialized to zero for non DCB mode otherwise actual total RX PB ++ * would be bigger than programmed and filter space would run into ++ * the PB 0 region. ++ */ ++ for (i = 1; i < 8; i++) ++ IXGBE_WRITE_REG(hw, IXGBE_RXPBSIZE(i), 0); ++ ++ /* Send interrupt when 64 filters are left */ ++ fdirctrl |= 4 << IXGBE_FDIRCTRL_FULL_THRESH_SHIFT; ++ ++ /* Set the maximum length per hash bucket to 0xA filters */ ++ fdirctrl |= 0xA << IXGBE_FDIRCTRL_MAX_LENGTH_SHIFT; ++ ++ switch (pballoc) { ++ case IXGBE_FDIR_PBALLOC_64K: ++ /* 8k - 1 signature filters */ ++ fdirctrl |= IXGBE_FDIRCTRL_PBALLOC_64K; ++ break; ++ case IXGBE_FDIR_PBALLOC_128K: ++ /* 16k - 1 signature filters */ ++ fdirctrl |= IXGBE_FDIRCTRL_PBALLOC_128K; ++ break; ++ case IXGBE_FDIR_PBALLOC_256K: ++ /* 32k - 1 signature filters */ ++ fdirctrl |= IXGBE_FDIRCTRL_PBALLOC_256K; ++ break; ++ default: ++ /* bad value */ ++ return IXGBE_ERR_CONFIG; ++ }; ++ ++ /* Move the flexible bytes to use the ethertype - shift 6 words */ ++ fdirctrl |= (0x6 << IXGBE_FDIRCTRL_FLEX_SHIFT); ++ ++ ++ /* Prime the keys for hashing */ ++ IXGBE_WRITE_REG(hw, IXGBE_FDIRHKEY, ++ IXGBE_HTONL(IXGBE_ATR_BUCKET_HASH_KEY)); ++ IXGBE_WRITE_REG(hw, IXGBE_FDIRSKEY, ++ IXGBE_HTONL(IXGBE_ATR_SIGNATURE_HASH_KEY)); ++ ++ /* ++ * Poll init-done after we write the register. Estimated times: ++ * 10G: PBALLOC = 11b, timing is 60us ++ * 1G: PBALLOC = 11b, timing is 600us ++ * 100M: PBALLOC = 11b, timing is 6ms ++ * ++ * Multiple these timings by 4 if under full Rx load ++ * ++ * So we'll poll for IXGBE_FDIR_INIT_DONE_POLL times, sleeping for ++ * 1 msec per poll time. If we're at line rate and drop to 100M, then ++ * this might not finish in our poll time, but we can live with that ++ * for now. ++ */ ++ IXGBE_WRITE_REG(hw, IXGBE_FDIRCTRL, fdirctrl); ++ IXGBE_WRITE_FLUSH(hw); ++ for (i = 0; i < IXGBE_FDIR_INIT_DONE_POLL; i++) { ++ if (IXGBE_READ_REG(hw, IXGBE_FDIRCTRL) & ++ IXGBE_FDIRCTRL_INIT_DONE) ++ break; ++ msleep(1); ++ } ++ if (i >= IXGBE_FDIR_INIT_DONE_POLL) ++ hw_dbg(hw, "Flow Director Signature poll time exceeded!\n"); ++ ++ return 0; ++} ++ ++/** ++ * ixgbe_init_fdir_perfect_82599 - Initialize Flow Director perfect filters ++ * @hw: pointer to hardware structure ++ * @pballoc: which mode to allocate filters with ++ **/ ++s32 ixgbe_init_fdir_perfect_82599(struct ixgbe_hw *hw, u32 pballoc) ++{ ++ u32 fdirctrl = 0; ++ u32 pbsize; ++ int i; ++ ++ /* ++ * Before enabling Flow Director, the Rx Packet Buffer size ++ * must be reduced. The new value is the current size minus ++ * flow director memory usage size. ++ */ ++ ++ pbsize = (1 << (IXGBE_FDIR_PBALLOC_SIZE_SHIFT + pballoc)); ++ IXGBE_WRITE_REG(hw, IXGBE_RXPBSIZE(0), ++ (IXGBE_READ_REG(hw, IXGBE_RXPBSIZE(0)) - pbsize)); ++ ++ /* ++ * The defaults in the HW for RX PB 1-7 are not zero and so should be ++ * intialized to zero for non DCB mode otherwise actual total RX PB ++ * would be bigger than programmed and filter space would run into ++ * the PB 0 region. ++ */ ++ for (i = 1; i < 8; i++) ++ IXGBE_WRITE_REG(hw, IXGBE_RXPBSIZE(i), 0); ++ ++ /* Send interrupt when 64 filters are left */ ++ fdirctrl |= 4 << IXGBE_FDIRCTRL_FULL_THRESH_SHIFT; ++ ++ switch (pballoc) { ++ case IXGBE_FDIR_PBALLOC_64K: ++ /* 2k - 1 perfect filters */ ++ fdirctrl |= IXGBE_FDIRCTRL_PBALLOC_64K; ++ break; ++ case IXGBE_FDIR_PBALLOC_128K: ++ /* 4k - 1 perfect filters */ ++ fdirctrl |= IXGBE_FDIRCTRL_PBALLOC_128K; ++ break; ++ case IXGBE_FDIR_PBALLOC_256K: ++ /* 8k - 1 perfect filters */ ++ fdirctrl |= IXGBE_FDIRCTRL_PBALLOC_256K; ++ break; ++ default: ++ /* bad value */ ++ return IXGBE_ERR_CONFIG; ++ }; ++ ++ /* Turn perfect match filtering on */ ++ fdirctrl |= IXGBE_FDIRCTRL_PERFECT_MATCH; ++ fdirctrl |= IXGBE_FDIRCTRL_REPORT_STATUS; ++ ++ /* Move the flexible bytes to use the ethertype - shift 6 words */ ++ fdirctrl |= (0x6 << IXGBE_FDIRCTRL_FLEX_SHIFT); ++ ++ /* Prime the keys for hashing */ ++ IXGBE_WRITE_REG(hw, IXGBE_FDIRHKEY, ++ IXGBE_HTONL(IXGBE_ATR_BUCKET_HASH_KEY)); ++ IXGBE_WRITE_REG(hw, IXGBE_FDIRSKEY, ++ IXGBE_HTONL(IXGBE_ATR_SIGNATURE_HASH_KEY)); ++ ++ /* ++ * Poll init-done after we write the register. Estimated times: ++ * 10G: PBALLOC = 11b, timing is 60us ++ * 1G: PBALLOC = 11b, timing is 600us ++ * 100M: PBALLOC = 11b, timing is 6ms ++ * ++ * Multiple these timings by 4 if under full Rx load ++ * ++ * So we'll poll for IXGBE_FDIR_INIT_DONE_POLL times, sleeping for ++ * 1 msec per poll time. If we're at line rate and drop to 100M, then ++ * this might not finish in our poll time, but we can live with that ++ * for now. ++ */ ++ ++ /* Set the maximum length per hash bucket to 0xA filters */ ++ fdirctrl |= (0xA << IXGBE_FDIRCTRL_MAX_LENGTH_SHIFT); ++ ++ IXGBE_WRITE_REG(hw, IXGBE_FDIRCTRL, fdirctrl); ++ IXGBE_WRITE_FLUSH(hw); ++ for (i = 0; i < IXGBE_FDIR_INIT_DONE_POLL; i++) { ++ if (IXGBE_READ_REG(hw, IXGBE_FDIRCTRL) & ++ IXGBE_FDIRCTRL_INIT_DONE) ++ break; ++ msleep(1); ++ } ++ if (i >= IXGBE_FDIR_INIT_DONE_POLL) ++ hw_dbg(hw, "Flow Director Perfect poll time exceeded!\n"); ++ ++ return 0; ++} ++ ++ ++/** ++ * ixgbe_atr_compute_hash_82599 - Compute the hashes for SW ATR ++ * @stream: input bitstream to compute the hash on ++ * @key: 32-bit hash key ++ **/ ++u16 ixgbe_atr_compute_hash_82599(struct ixgbe_atr_input *atr_input, u32 key) ++{ ++ /* ++ * The algorithm is as follows: ++ * Hash[15:0] = Sum { S[n] x K[n+16] }, n = 0...350 ++ * where Sum {A[n]}, n = 0...n is bitwise XOR of A[0], A[1]...A[n] ++ * and A[n] x B[n] is bitwise AND between same length strings ++ * ++ * K[n] is 16 bits, defined as: ++ * for n modulo 32 >= 15, K[n] = K[n % 32 : (n % 32) - 15] ++ * for n modulo 32 < 15, K[n] = ++ * K[(n % 32:0) | (31:31 - (14 - (n % 32)))] ++ * ++ * S[n] is 16 bits, defined as: ++ * for n >= 15, S[n] = S[n:n - 15] ++ * for n < 15, S[n] = S[(n:0) | (350:350 - (14 - n))] ++ * ++ * To simplify for programming, the algorithm is implemented ++ * in software this way: ++ * ++ * Key[31:0], Stream[335:0] ++ * ++ * tmp_key[11 * 32 - 1:0] = 11{Key[31:0] = key concatenated 11 times ++ * int_key[350:0] = tmp_key[351:1] ++ * int_stream[365:0] = Stream[14:0] | Stream[335:0] | Stream[335:321] ++ * ++ * hash[15:0] = 0; ++ * for (i = 0; i < 351; i++) { ++ * if (int_key[i]) ++ * hash ^= int_stream[(i + 15):i]; ++ * } ++ */ ++ ++ union { ++ u64 fill[6]; ++ u32 key[11]; ++ u8 key_stream[44]; ++ } tmp_key; ++ ++ u8 *stream = (u8 *)atr_input; ++ u8 int_key[44]; /* upper-most bit unused */ ++ u8 hash_str[46]; /* upper-most 2 bits unused */ ++ u16 hash_result = 0; ++ int i, j, k, h; ++ ++ /* ++ * Initialize the fill member to prevent warnings ++ * on some compilers ++ */ ++ tmp_key.fill[0] = 0; ++ ++ /* First load the temporary key stream */ ++ for (i = 0; i < 6; i++) { ++ u64 fillkey = ((u64)key << 32) | key; ++ tmp_key.fill[i] = fillkey; ++ } ++ ++ /* ++ * Set the interim key for the hashing. Bit 352 is unused, so we must ++ * shift and compensate when building the key. ++ */ ++ ++ int_key[0] = tmp_key.key_stream[0] >> 1; ++ for (i = 1, j = 0; i < 44; i++) { ++ unsigned int this_key = tmp_key.key_stream[j] << 7; ++ j++; ++ int_key[i] = (u8)(this_key | (tmp_key.key_stream[j] >> 1)); ++ } ++ ++ /* ++ * Set the interim bit string for the hashing. Bits 368 and 367 are ++ * unused, so shift and compensate when building the string. ++ */ ++ hash_str[0] = (stream[40] & 0x7f) >> 1; ++ for (i = 1, j = 40; i < 46; i++) { ++ unsigned int this_str = stream[j] << 7; ++ j++; ++ if (j > 41) ++ j = 0; ++ hash_str[i] = (u8)(this_str | (stream[j] >> 1)); ++ } ++ ++ /* ++ * Now compute the hash. i is the index into hash_str, j is into our ++ * key stream, k is counting the number of bits, and h interates within ++ * each byte. ++ */ ++ for (i = 45, j = 43, k = 0; k < 351 && i >= 2 && j >= 0; i--, j--) { ++ for (h = 0; h < 8 && k < 351; h++, k++) { ++ if (int_key[j] & (1 << h)) { ++ /* ++ * Key bit is set, XOR in the current 16-bit ++ * string. Example of processing: ++ * h = 0, ++ * tmp = (hash_str[i - 2] & 0 << 16) | ++ * (hash_str[i - 1] & 0xff << 8) | ++ * (hash_str[i] & 0xff >> 0) ++ * So tmp = hash_str[15 + k:k], since the ++ * i + 2 clause rolls off the 16-bit value ++ * h = 7, ++ * tmp = (hash_str[i - 2] & 0x7f << 9) | ++ * (hash_str[i - 1] & 0xff << 1) | ++ * (hash_str[i] & 0x80 >> 7) ++ */ ++ int tmp = (hash_str[i] >> h); ++ tmp |= (hash_str[i - 1] << (8 - h)); ++ tmp |= (int)(hash_str[i - 2] & ((1 << h) - 1)) ++ << (16 - h); ++ hash_result ^= (u16)tmp; ++ } ++ } ++ } ++ ++ return hash_result; ++} ++ ++/** ++ * ixgbe_atr_set_vlan_id_82599 - Sets the VLAN id in the ATR input stream ++ * @input: input stream to modify ++ * @vlan: the VLAN id to load ++ **/ ++s32 ixgbe_atr_set_vlan_id_82599(struct ixgbe_atr_input *input, u16 vlan) ++{ ++ input->byte_stream[IXGBE_ATR_VLAN_OFFSET + 1] = vlan >> 8; ++ input->byte_stream[IXGBE_ATR_VLAN_OFFSET] = vlan & 0xff; ++ ++ return 0; ++} ++ ++/** ++ * ixgbe_atr_set_src_ipv4_82599 - Sets the source IPv4 address ++ * @input: input stream to modify ++ * @src_addr: the IP address to load ++ **/ ++s32 ixgbe_atr_set_src_ipv4_82599(struct ixgbe_atr_input *input, u32 src_addr) ++{ ++ input->byte_stream[IXGBE_ATR_SRC_IPV4_OFFSET + 3] = src_addr >> 24; ++ input->byte_stream[IXGBE_ATR_SRC_IPV4_OFFSET + 2] = ++ (src_addr >> 16) & 0xff; ++ input->byte_stream[IXGBE_ATR_SRC_IPV4_OFFSET + 1] = ++ (src_addr >> 8) & 0xff; ++ input->byte_stream[IXGBE_ATR_SRC_IPV4_OFFSET] = src_addr & 0xff; ++ ++ return 0; ++} ++ ++/** ++ * ixgbe_atr_set_dst_ipv4_82599 - Sets the destination IPv4 address ++ * @input: input stream to modify ++ * @dst_addr: the IP address to load ++ **/ ++s32 ixgbe_atr_set_dst_ipv4_82599(struct ixgbe_atr_input *input, u32 dst_addr) ++{ ++ input->byte_stream[IXGBE_ATR_DST_IPV4_OFFSET + 3] = dst_addr >> 24; ++ input->byte_stream[IXGBE_ATR_DST_IPV4_OFFSET + 2] = ++ (dst_addr >> 16) & 0xff; ++ input->byte_stream[IXGBE_ATR_DST_IPV4_OFFSET + 1] = ++ (dst_addr >> 8) & 0xff; ++ input->byte_stream[IXGBE_ATR_DST_IPV4_OFFSET] = dst_addr & 0xff; ++ ++ return 0; ++} ++ ++/** ++ * ixgbe_atr_set_src_ipv6_82599 - Sets the source IPv6 address ++ * @input: input stream to modify ++ * @src_addr_1: the first 4 bytes of the IP address to load ++ * @src_addr_2: the second 4 bytes of the IP address to load ++ * @src_addr_3: the third 4 bytes of the IP address to load ++ * @src_addr_4: the fourth 4 bytes of the IP address to load ++ **/ ++s32 ixgbe_atr_set_src_ipv6_82599(struct ixgbe_atr_input *input, ++ u32 src_addr_1, u32 src_addr_2, ++ u32 src_addr_3, u32 src_addr_4) ++{ ++ input->byte_stream[IXGBE_ATR_SRC_IPV6_OFFSET] = src_addr_4 & 0xff; ++ input->byte_stream[IXGBE_ATR_SRC_IPV6_OFFSET + 1] = ++ (src_addr_4 >> 8) & 0xff; ++ input->byte_stream[IXGBE_ATR_SRC_IPV6_OFFSET + 2] = ++ (src_addr_4 >> 16) & 0xff; ++ input->byte_stream[IXGBE_ATR_SRC_IPV6_OFFSET + 3] = src_addr_4 >> 24; ++ ++ input->byte_stream[IXGBE_ATR_SRC_IPV6_OFFSET + 4] = src_addr_3 & 0xff; ++ input->byte_stream[IXGBE_ATR_SRC_IPV6_OFFSET + 5] = ++ (src_addr_3 >> 8) & 0xff; ++ input->byte_stream[IXGBE_ATR_SRC_IPV6_OFFSET + 6] = ++ (src_addr_3 >> 16) & 0xff; ++ input->byte_stream[IXGBE_ATR_SRC_IPV6_OFFSET + 7] = src_addr_3 >> 24; ++ ++ input->byte_stream[IXGBE_ATR_SRC_IPV6_OFFSET + 8] = src_addr_2 & 0xff; ++ input->byte_stream[IXGBE_ATR_SRC_IPV6_OFFSET + 9] = ++ (src_addr_2 >> 8) & 0xff; ++ input->byte_stream[IXGBE_ATR_SRC_IPV6_OFFSET + 10] = ++ (src_addr_2 >> 16) & 0xff; ++ input->byte_stream[IXGBE_ATR_SRC_IPV6_OFFSET + 11] = src_addr_2 >> 24; ++ ++ input->byte_stream[IXGBE_ATR_SRC_IPV6_OFFSET + 12] = src_addr_1 & 0xff; ++ input->byte_stream[IXGBE_ATR_SRC_IPV6_OFFSET + 13] = ++ (src_addr_1 >> 8) & 0xff; ++ input->byte_stream[IXGBE_ATR_SRC_IPV6_OFFSET + 14] = ++ (src_addr_1 >> 16) & 0xff; ++ input->byte_stream[IXGBE_ATR_SRC_IPV6_OFFSET + 15] = src_addr_1 >> 24; ++ ++ return 0; ++} ++ ++/** ++ * ixgbe_atr_set_dst_ipv6_82599 - Sets the destination IPv6 address ++ * @input: input stream to modify ++ * @dst_addr_1: the first 4 bytes of the IP address to load ++ * @dst_addr_2: the second 4 bytes of the IP address to load ++ * @dst_addr_3: the third 4 bytes of the IP address to load ++ * @dst_addr_4: the fourth 4 bytes of the IP address to load ++ **/ ++s32 ixgbe_atr_set_dst_ipv6_82599(struct ixgbe_atr_input *input, ++ u32 dst_addr_1, u32 dst_addr_2, ++ u32 dst_addr_3, u32 dst_addr_4) ++{ ++ input->byte_stream[IXGBE_ATR_DST_IPV6_OFFSET] = dst_addr_4 & 0xff; ++ input->byte_stream[IXGBE_ATR_DST_IPV6_OFFSET + 1] = ++ (dst_addr_4 >> 8) & 0xff; ++ input->byte_stream[IXGBE_ATR_DST_IPV6_OFFSET + 2] = ++ (dst_addr_4 >> 16) & 0xff; ++ input->byte_stream[IXGBE_ATR_DST_IPV6_OFFSET + 3] = dst_addr_4 >> 24; ++ ++ input->byte_stream[IXGBE_ATR_DST_IPV6_OFFSET + 4] = dst_addr_3 & 0xff; ++ input->byte_stream[IXGBE_ATR_DST_IPV6_OFFSET + 5] = ++ (dst_addr_3 >> 8) & 0xff; ++ input->byte_stream[IXGBE_ATR_DST_IPV6_OFFSET + 6] = ++ (dst_addr_3 >> 16) & 0xff; ++ input->byte_stream[IXGBE_ATR_DST_IPV6_OFFSET + 7] = dst_addr_3 >> 24; ++ ++ input->byte_stream[IXGBE_ATR_DST_IPV6_OFFSET + 8] = dst_addr_2 & 0xff; ++ input->byte_stream[IXGBE_ATR_DST_IPV6_OFFSET + 9] = ++ (dst_addr_2 >> 8) & 0xff; ++ input->byte_stream[IXGBE_ATR_DST_IPV6_OFFSET + 10] = ++ (dst_addr_2 >> 16) & 0xff; ++ input->byte_stream[IXGBE_ATR_DST_IPV6_OFFSET + 11] = dst_addr_2 >> 24; ++ ++ input->byte_stream[IXGBE_ATR_DST_IPV6_OFFSET + 12] = dst_addr_1 & 0xff; ++ input->byte_stream[IXGBE_ATR_DST_IPV6_OFFSET + 13] = ++ (dst_addr_1 >> 8) & 0xff; ++ input->byte_stream[IXGBE_ATR_DST_IPV6_OFFSET + 14] = ++ (dst_addr_1 >> 16) & 0xff; ++ input->byte_stream[IXGBE_ATR_DST_IPV6_OFFSET + 15] = dst_addr_1 >> 24; ++ ++ return 0; ++} ++ ++/** ++ * ixgbe_atr_set_src_port_82599 - Sets the source port ++ * @input: input stream to modify ++ * @src_port: the source port to load ++ **/ ++s32 ixgbe_atr_set_src_port_82599(struct ixgbe_atr_input *input, u16 src_port) ++{ ++ input->byte_stream[IXGBE_ATR_SRC_PORT_OFFSET + 1] = src_port >> 8; ++ input->byte_stream[IXGBE_ATR_SRC_PORT_OFFSET] = src_port & 0xff; ++ ++ return 0; ++} ++ ++/** ++ * ixgbe_atr_set_dst_port_82599 - Sets the destination port ++ * @input: input stream to modify ++ * @dst_port: the destination port to load ++ **/ ++s32 ixgbe_atr_set_dst_port_82599(struct ixgbe_atr_input *input, u16 dst_port) ++{ ++ input->byte_stream[IXGBE_ATR_DST_PORT_OFFSET + 1] = dst_port >> 8; ++ input->byte_stream[IXGBE_ATR_DST_PORT_OFFSET] = dst_port & 0xff; ++ ++ return 0; ++} ++ ++/** ++ * ixgbe_atr_set_flex_byte_82599 - Sets the flexible bytes ++ * @input: input stream to modify ++ * @flex_bytes: the flexible bytes to load ++ **/ ++s32 ixgbe_atr_set_flex_byte_82599(struct ixgbe_atr_input *input, u16 flex_byte) ++{ ++ input->byte_stream[IXGBE_ATR_FLEX_BYTE_OFFSET + 1] = flex_byte >> 8; ++ input->byte_stream[IXGBE_ATR_FLEX_BYTE_OFFSET] = flex_byte & 0xff; ++ ++ return 0; ++} ++ ++/** ++ * ixgbe_atr_set_vm_pool_82599 - Sets the Virtual Machine pool ++ * @input: input stream to modify ++ * @vm_pool: the Virtual Machine pool to load ++ **/ ++s32 ixgbe_atr_set_vm_pool_82599(struct ixgbe_atr_input *input, u8 vm_pool) ++{ ++ input->byte_stream[IXGBE_ATR_VM_POOL_OFFSET] = vm_pool; ++ ++ return 0; ++} ++ ++/** ++ * ixgbe_atr_set_l4type_82599 - Sets the layer 4 packet type ++ * @input: input stream to modify ++ * @l4type: the layer 4 type value to load ++ **/ ++s32 ixgbe_atr_set_l4type_82599(struct ixgbe_atr_input *input, u8 l4type) ++{ ++ input->byte_stream[IXGBE_ATR_L4TYPE_OFFSET] = l4type; ++ ++ return 0; ++} ++ ++/** ++ * ixgbe_atr_get_vlan_id_82599 - Gets the VLAN id from the ATR input stream ++ * @input: input stream to search ++ * @vlan: the VLAN id to load ++ **/ ++s32 ixgbe_atr_get_vlan_id_82599(struct ixgbe_atr_input *input, u16 *vlan) ++{ ++ *vlan = input->byte_stream[IXGBE_ATR_VLAN_OFFSET]; ++ *vlan |= input->byte_stream[IXGBE_ATR_VLAN_OFFSET + 1] << 8; ++ ++ return 0; ++} ++ ++/** ++ * ixgbe_atr_get_src_ipv4_82599 - Gets the source IPv4 address ++ * @input: input stream to search ++ * @src_addr: the IP address to load ++ **/ ++s32 ixgbe_atr_get_src_ipv4_82599(struct ixgbe_atr_input *input, u32 *src_addr) ++{ ++ *src_addr = input->byte_stream[IXGBE_ATR_SRC_IPV4_OFFSET]; ++ *src_addr |= input->byte_stream[IXGBE_ATR_SRC_IPV4_OFFSET + 1] << 8; ++ *src_addr |= input->byte_stream[IXGBE_ATR_SRC_IPV4_OFFSET + 2] << 16; ++ *src_addr |= input->byte_stream[IXGBE_ATR_SRC_IPV4_OFFSET + 3] << 24; ++ ++ return 0; ++} ++ ++/** ++ * ixgbe_atr_get_dst_ipv4_82599 - Gets the destination IPv4 address ++ * @input: input stream to search ++ * @dst_addr: the IP address to load ++ **/ ++s32 ixgbe_atr_get_dst_ipv4_82599(struct ixgbe_atr_input *input, u32 *dst_addr) ++{ ++ *dst_addr = input->byte_stream[IXGBE_ATR_DST_IPV4_OFFSET]; ++ *dst_addr |= input->byte_stream[IXGBE_ATR_DST_IPV4_OFFSET + 1] << 8; ++ *dst_addr |= input->byte_stream[IXGBE_ATR_DST_IPV4_OFFSET + 2] << 16; ++ *dst_addr |= input->byte_stream[IXGBE_ATR_DST_IPV4_OFFSET + 3] << 24; ++ ++ return 0; ++} ++ ++/** ++ * ixgbe_atr_get_src_ipv6_82599 - Gets the source IPv6 address ++ * @input: input stream to search ++ * @src_addr_1: the first 4 bytes of the IP address to load ++ * @src_addr_2: the second 4 bytes of the IP address to load ++ * @src_addr_3: the third 4 bytes of the IP address to load ++ * @src_addr_4: the fourth 4 bytes of the IP address to load ++ **/ ++s32 ixgbe_atr_get_src_ipv6_82599(struct ixgbe_atr_input *input, ++ u32 *src_addr_1, u32 *src_addr_2, ++ u32 *src_addr_3, u32 *src_addr_4) ++{ ++ *src_addr_1 = input->byte_stream[IXGBE_ATR_SRC_IPV6_OFFSET + 12]; ++ *src_addr_1 = input->byte_stream[IXGBE_ATR_SRC_IPV6_OFFSET + 13] << 8; ++ *src_addr_1 = input->byte_stream[IXGBE_ATR_SRC_IPV6_OFFSET + 14] << 16; ++ *src_addr_1 = input->byte_stream[IXGBE_ATR_SRC_IPV6_OFFSET + 15] << 24; ++ ++ *src_addr_2 = input->byte_stream[IXGBE_ATR_SRC_IPV6_OFFSET + 8]; ++ *src_addr_2 = input->byte_stream[IXGBE_ATR_SRC_IPV6_OFFSET + 9] << 8; ++ *src_addr_2 = input->byte_stream[IXGBE_ATR_SRC_IPV6_OFFSET + 10] << 16; ++ *src_addr_2 = input->byte_stream[IXGBE_ATR_SRC_IPV6_OFFSET + 11] << 24; ++ ++ *src_addr_3 = input->byte_stream[IXGBE_ATR_SRC_IPV6_OFFSET + 4]; ++ *src_addr_3 = input->byte_stream[IXGBE_ATR_SRC_IPV6_OFFSET + 5] << 8; ++ *src_addr_3 = input->byte_stream[IXGBE_ATR_SRC_IPV6_OFFSET + 6] << 16; ++ *src_addr_3 = input->byte_stream[IXGBE_ATR_SRC_IPV6_OFFSET + 7] << 24; ++ ++ *src_addr_4 = input->byte_stream[IXGBE_ATR_SRC_IPV6_OFFSET]; ++ *src_addr_4 = input->byte_stream[IXGBE_ATR_SRC_IPV6_OFFSET + 1] << 8; ++ *src_addr_4 = input->byte_stream[IXGBE_ATR_SRC_IPV6_OFFSET + 2] << 16; ++ *src_addr_4 = input->byte_stream[IXGBE_ATR_SRC_IPV6_OFFSET + 3] << 24; ++ ++ return 0; ++} ++ ++/** ++ * ixgbe_atr_get_dst_ipv6_82599 - Gets the destination IPv6 address ++ * @input: input stream to search ++ * @dst_addr_1: the first 4 bytes of the IP address to load ++ * @dst_addr_2: the second 4 bytes of the IP address to load ++ * @dst_addr_3: the third 4 bytes of the IP address to load ++ * @dst_addr_4: the fourth 4 bytes of the IP address to load ++ **/ ++s32 ixgbe_atr_get_dst_ipv6_82599(struct ixgbe_atr_input *input, ++ u32 *dst_addr_1, u32 *dst_addr_2, ++ u32 *dst_addr_3, u32 *dst_addr_4) ++{ ++ *dst_addr_1 = input->byte_stream[IXGBE_ATR_DST_IPV6_OFFSET + 12]; ++ *dst_addr_1 = input->byte_stream[IXGBE_ATR_DST_IPV6_OFFSET + 13] << 8; ++ *dst_addr_1 = input->byte_stream[IXGBE_ATR_DST_IPV6_OFFSET + 14] << 16; ++ *dst_addr_1 = input->byte_stream[IXGBE_ATR_DST_IPV6_OFFSET + 15] << 24; ++ ++ *dst_addr_2 = input->byte_stream[IXGBE_ATR_DST_IPV6_OFFSET + 8]; ++ *dst_addr_2 = input->byte_stream[IXGBE_ATR_DST_IPV6_OFFSET + 9] << 8; ++ *dst_addr_2 = input->byte_stream[IXGBE_ATR_DST_IPV6_OFFSET + 10] << 16; ++ *dst_addr_2 = input->byte_stream[IXGBE_ATR_DST_IPV6_OFFSET + 11] << 24; ++ ++ *dst_addr_3 = input->byte_stream[IXGBE_ATR_DST_IPV6_OFFSET + 4]; ++ *dst_addr_3 = input->byte_stream[IXGBE_ATR_DST_IPV6_OFFSET + 5] << 8; ++ *dst_addr_3 = input->byte_stream[IXGBE_ATR_DST_IPV6_OFFSET + 6] << 16; ++ *dst_addr_3 = input->byte_stream[IXGBE_ATR_DST_IPV6_OFFSET + 7] << 24; ++ ++ *dst_addr_4 = input->byte_stream[IXGBE_ATR_DST_IPV6_OFFSET]; ++ *dst_addr_4 = input->byte_stream[IXGBE_ATR_DST_IPV6_OFFSET + 1] << 8; ++ *dst_addr_4 = input->byte_stream[IXGBE_ATR_DST_IPV6_OFFSET + 2] << 16; ++ *dst_addr_4 = input->byte_stream[IXGBE_ATR_DST_IPV6_OFFSET + 3] << 24; ++ ++ return 0; ++} ++ ++/** ++ * ixgbe_atr_get_src_port_82599 - Gets the source port ++ * @input: input stream to modify ++ * @src_port: the source port to load ++ * ++ * Even though the input is given in big-endian, the FDIRPORT registers ++ * expect the ports to be programmed in little-endian. Hence the need to swap ++ * endianness when retrieving the data. This can be confusing since the ++ * internal hash engine expects it to be big-endian. ++ **/ ++s32 ixgbe_atr_get_src_port_82599(struct ixgbe_atr_input *input, u16 *src_port) ++{ ++ *src_port = input->byte_stream[IXGBE_ATR_SRC_PORT_OFFSET] << 8; ++ *src_port |= input->byte_stream[IXGBE_ATR_SRC_PORT_OFFSET + 1]; ++ ++ return 0; ++} ++ ++/** ++ * ixgbe_atr_get_dst_port_82599 - Gets the destination port ++ * @input: input stream to modify ++ * @dst_port: the destination port to load ++ * ++ * Even though the input is given in big-endian, the FDIRPORT registers ++ * expect the ports to be programmed in little-endian. Hence the need to swap ++ * endianness when retrieving the data. This can be confusing since the ++ * internal hash engine expects it to be big-endian. ++ **/ ++s32 ixgbe_atr_get_dst_port_82599(struct ixgbe_atr_input *input, u16 *dst_port) ++{ ++ *dst_port = input->byte_stream[IXGBE_ATR_DST_PORT_OFFSET] << 8; ++ *dst_port |= input->byte_stream[IXGBE_ATR_DST_PORT_OFFSET + 1]; ++ ++ return 0; ++} ++ ++/** ++ * ixgbe_atr_get_flex_byte_82599 - Gets the flexible bytes ++ * @input: input stream to modify ++ * @flex_bytes: the flexible bytes to load ++ **/ ++s32 ixgbe_atr_get_flex_byte_82599(struct ixgbe_atr_input *input, u16 *flex_byte) ++{ ++ *flex_byte = input->byte_stream[IXGBE_ATR_FLEX_BYTE_OFFSET]; ++ *flex_byte |= input->byte_stream[IXGBE_ATR_FLEX_BYTE_OFFSET + 1] << 8; ++ ++ return 0; ++} ++ ++/** ++ * ixgbe_atr_get_vm_pool_82599 - Gets the Virtual Machine pool ++ * @input: input stream to modify ++ * @vm_pool: the Virtual Machine pool to load ++ **/ ++s32 ixgbe_atr_get_vm_pool_82599(struct ixgbe_atr_input *input, u8 *vm_pool) ++{ ++ *vm_pool = input->byte_stream[IXGBE_ATR_VM_POOL_OFFSET]; ++ ++ return 0; ++} ++ ++/** ++ * ixgbe_atr_get_l4type_82599 - Gets the layer 4 packet type ++ * @input: input stream to modify ++ * @l4type: the layer 4 type value to load ++ **/ ++s32 ixgbe_atr_get_l4type_82599(struct ixgbe_atr_input *input, u8 *l4type) ++{ ++ *l4type = input->byte_stream[IXGBE_ATR_L4TYPE_OFFSET]; ++ ++ return 0; ++} ++ ++/** ++ * ixgbe_atr_add_signature_filter_82599 - Adds a signature hash filter ++ * @hw: pointer to hardware structure ++ * @stream: input bitstream ++ * @queue: queue index to direct traffic to ++ **/ ++s32 ixgbe_fdir_add_signature_filter_82599(struct ixgbe_hw *hw, ++ struct ixgbe_atr_input *input, ++ u8 queue) ++{ ++ u64 fdirhashcmd; ++ u64 fdircmd; ++ u32 fdirhash; ++ u16 bucket_hash, sig_hash; ++ u8 l4type; ++ ++ bucket_hash = ixgbe_atr_compute_hash_82599(input, ++ IXGBE_ATR_BUCKET_HASH_KEY); ++ ++ /* bucket_hash is only 15 bits */ ++ bucket_hash &= IXGBE_ATR_HASH_MASK; ++ ++ sig_hash = ixgbe_atr_compute_hash_82599(input, ++ IXGBE_ATR_SIGNATURE_HASH_KEY); ++ ++ /* Get the l4type in order to program FDIRCMD properly */ ++ /* lowest 2 bits are FDIRCMD.L4TYPE, third lowest bit is FDIRCMD.IPV6 */ ++ ixgbe_atr_get_l4type_82599(input, &l4type); ++ ++ /* ++ * The lower 32-bits of fdirhashcmd is for FDIRHASH, the upper 32-bits ++ * is for FDIRCMD. Then do a 64-bit register write from FDIRHASH. ++ */ ++ fdirhash = sig_hash << IXGBE_FDIRHASH_SIG_SW_INDEX_SHIFT | bucket_hash; ++ ++ fdircmd = (IXGBE_FDIRCMD_CMD_ADD_FLOW | IXGBE_FDIRCMD_FILTER_UPDATE | ++ IXGBE_FDIRCMD_LAST | IXGBE_FDIRCMD_QUEUE_EN); ++ ++ switch (l4type & IXGBE_ATR_L4TYPE_MASK) { ++ case IXGBE_ATR_L4TYPE_TCP: ++ fdircmd |= IXGBE_FDIRCMD_L4TYPE_TCP; ++ break; ++ case IXGBE_ATR_L4TYPE_UDP: ++ fdircmd |= IXGBE_FDIRCMD_L4TYPE_UDP; ++ break; ++ case IXGBE_ATR_L4TYPE_SCTP: ++ fdircmd |= IXGBE_FDIRCMD_L4TYPE_SCTP; ++ break; ++ default: ++ hw_dbg(hw, " Error on l4type input\n"); ++ return IXGBE_ERR_CONFIG; ++ } ++ ++ if (l4type & IXGBE_ATR_L4TYPE_IPV6_MASK) ++ fdircmd |= IXGBE_FDIRCMD_IPV6; ++ ++ fdircmd |= ((u64)queue << IXGBE_FDIRCMD_RX_QUEUE_SHIFT); ++ fdirhashcmd = ((fdircmd << 32) | fdirhash); ++ ++ hw_dbg(hw, "Tx Queue=%x hash=%x\n", queue, fdirhash & 0x7FFF7FFF); ++ IXGBE_WRITE_REG64(hw, IXGBE_FDIRHASH, fdirhashcmd); ++ ++ return 0; ++} ++ ++/** ++ * ixgbe_fdir_add_perfect_filter_82599 - Adds a perfect filter ++ * @hw: pointer to hardware structure ++ * @input: input bitstream ++ * @queue: queue index to direct traffic to ++ * ++ * Note that the caller to this function must lock before calling, since the ++ * hardware writes must be protected from one another. ++ **/ ++s32 ixgbe_fdir_add_perfect_filter_82599(struct ixgbe_hw *hw, ++ struct ixgbe_atr_input *input, ++ u16 soft_id, ++ u8 queue) ++{ ++ u32 fdircmd = 0; ++ u32 fdirhash; ++ u32 src_ipv4, dst_ipv4; ++ u32 src_ipv6_1, src_ipv6_2, src_ipv6_3, src_ipv6_4; ++ u16 src_port, dst_port, vlan_id, flex_bytes; ++ u16 bucket_hash; ++ u8 l4type; ++ ++ /* Get our input values */ ++ ixgbe_atr_get_l4type_82599(input, &l4type); ++ ++ /* ++ * Check l4type formatting, and bail out before we touch the hardware ++ * if there's a configuration issue ++ */ ++ switch (l4type & IXGBE_ATR_L4TYPE_MASK) { ++ case IXGBE_ATR_L4TYPE_TCP: ++ fdircmd |= IXGBE_FDIRCMD_L4TYPE_TCP; ++ break; ++ case IXGBE_ATR_L4TYPE_UDP: ++ fdircmd |= IXGBE_FDIRCMD_L4TYPE_UDP; ++ break; ++ case IXGBE_ATR_L4TYPE_SCTP: ++ fdircmd |= IXGBE_FDIRCMD_L4TYPE_SCTP; ++ break; ++ default: ++ hw_dbg(hw, " Error on l4type input\n"); ++ return IXGBE_ERR_CONFIG; ++ } ++ ++ bucket_hash = ixgbe_atr_compute_hash_82599(input, ++ IXGBE_ATR_BUCKET_HASH_KEY); ++ ++ /* bucket_hash is only 15 bits */ ++ bucket_hash &= IXGBE_ATR_HASH_MASK; ++ ++ ixgbe_atr_get_vlan_id_82599(input, &vlan_id); ++ ixgbe_atr_get_src_port_82599(input, &src_port); ++ ixgbe_atr_get_dst_port_82599(input, &dst_port); ++ ixgbe_atr_get_flex_byte_82599(input, &flex_bytes); ++ ++ fdirhash = soft_id << IXGBE_FDIRHASH_SIG_SW_INDEX_SHIFT | bucket_hash; ++ ++ /* Now figure out if we're IPv4 or IPv6 */ ++ if (l4type & IXGBE_ATR_L4TYPE_IPV6_MASK) { ++ /* IPv6 */ ++ ixgbe_atr_get_src_ipv6_82599(input, &src_ipv6_1, &src_ipv6_2, ++ &src_ipv6_3, &src_ipv6_4); ++ ++ IXGBE_WRITE_REG(hw, IXGBE_FDIRSIPv6(0), src_ipv6_1); ++ IXGBE_WRITE_REG(hw, IXGBE_FDIRSIPv6(1), src_ipv6_2); ++ IXGBE_WRITE_REG(hw, IXGBE_FDIRSIPv6(2), src_ipv6_3); ++ /* The last 4 bytes is the same register as IPv4 */ ++ IXGBE_WRITE_REG(hw, IXGBE_FDIRIPSA, src_ipv6_4); ++ ++ fdircmd |= IXGBE_FDIRCMD_IPV6; ++ fdircmd |= IXGBE_FDIRCMD_IPv6DMATCH; ++ } else { ++ /* IPv4 */ ++ ixgbe_atr_get_src_ipv4_82599(input, &src_ipv4); ++ IXGBE_WRITE_REG(hw, IXGBE_FDIRIPSA, src_ipv4); ++ ++ } ++ ++ ixgbe_atr_get_dst_ipv4_82599(input, &dst_ipv4); ++ IXGBE_WRITE_REG(hw, IXGBE_FDIRIPDA, dst_ipv4); ++ ++ IXGBE_WRITE_REG(hw, IXGBE_FDIRVLAN, (vlan_id | ++ (flex_bytes << IXGBE_FDIRVLAN_FLEX_SHIFT))); ++ IXGBE_WRITE_REG(hw, IXGBE_FDIRPORT, (src_port | ++ (dst_port << IXGBE_FDIRPORT_DESTINATION_SHIFT))); ++ ++ fdircmd |= IXGBE_FDIRCMD_CMD_ADD_FLOW; ++ fdircmd |= IXGBE_FDIRCMD_FILTER_UPDATE; ++ fdircmd |= IXGBE_FDIRCMD_LAST; ++ fdircmd |= IXGBE_FDIRCMD_QUEUE_EN; ++ fdircmd |= queue << IXGBE_FDIRCMD_RX_QUEUE_SHIFT; ++ ++ IXGBE_WRITE_REG(hw, IXGBE_FDIRHASH, fdirhash); ++ IXGBE_WRITE_REG(hw, IXGBE_FDIRCMD, fdircmd); ++ ++ return 0; ++} ++ ++/** ++ * ixgbe_read_analog_reg8_82599 - Reads 8 bit Omer analog register ++ * @hw: pointer to hardware structure ++ * @reg: analog register to read ++ * @val: read value ++ * ++ * Performs read operation to Omer analog register specified. ++ **/ ++s32 ixgbe_read_analog_reg8_82599(struct ixgbe_hw *hw, u32 reg, u8 *val) ++{ ++ u32 core_ctl; ++ ++ IXGBE_WRITE_REG(hw, IXGBE_CORECTL, IXGBE_CORECTL_WRITE_CMD | ++ (reg << 8)); ++ IXGBE_WRITE_FLUSH(hw); ++ udelay(10); ++ core_ctl = IXGBE_READ_REG(hw, IXGBE_CORECTL); ++ *val = (u8)core_ctl; ++ ++ return 0; ++} ++ ++/** ++ * ixgbe_write_analog_reg8_82599 - Writes 8 bit Omer analog register ++ * @hw: pointer to hardware structure ++ * @reg: atlas register to write ++ * @val: value to write ++ * ++ * Performs write operation to Omer analog register specified. ++ **/ ++s32 ixgbe_write_analog_reg8_82599(struct ixgbe_hw *hw, u32 reg, u8 val) ++{ ++ u32 core_ctl; ++ ++ core_ctl = (reg << 8) | val; ++ IXGBE_WRITE_REG(hw, IXGBE_CORECTL, core_ctl); ++ IXGBE_WRITE_FLUSH(hw); ++ udelay(10); ++ ++ return 0; ++} ++ ++/** ++ * ixgbe_start_hw_rev_1_82599 - Prepare hardware for Tx/Rx ++ * @hw: pointer to hardware structure ++ * ++ * Starts the hardware using the generic start_hw function. ++ * Then performs revision-specific operations: ++ * Clears the rate limiter registers. ++ **/ ++s32 ixgbe_start_hw_rev_1_82599(struct ixgbe_hw *hw) ++{ ++ u32 q_num; ++ s32 ret_val = 0; ++ ++ ret_val = ixgbe_start_hw_generic(hw); ++ ++ /* Clear the rate limiters */ ++ for (q_num = 0; q_num < hw->mac.max_tx_queues; q_num++) { ++ IXGBE_WRITE_REG(hw, IXGBE_RTTDQSEL, q_num); ++ IXGBE_WRITE_REG(hw, IXGBE_RTTBCNRC, 0); ++ } ++ IXGBE_WRITE_FLUSH(hw); ++ ++ /* We need to run link autotry after the driver loads */ ++ hw->mac.autotry_restart = true; ++ ++ if (ret_val == 0) ++ ret_val = ixgbe_verify_fw_version_82599(hw); ++ return ret_val; ++} ++ ++/** ++ * ixgbe_identify_phy_82599 - Get physical layer module ++ * @hw: pointer to hardware structure ++ * ++ * Determines the physical layer module found on the current adapter. ++ * If PHY already detected, maintains current PHY type in hw struct, ++ * otherwise executes the PHY detection routine. ++ **/ ++s32 ixgbe_identify_phy_82599(struct ixgbe_hw *hw) ++{ ++ s32 status = IXGBE_ERR_PHY_ADDR_INVALID; ++ ++ /* Detect PHY if not unknown - returns success if already detected. */ ++ status = ixgbe_identify_phy_generic(hw); ++ if (status != 0) ++ status = ixgbe_identify_sfp_module_generic(hw); ++ /* Set PHY type none if no PHY detected */ ++ if (hw->phy.type == ixgbe_phy_unknown) { ++ hw->phy.type = ixgbe_phy_none; ++ status = 0; ++ } ++ ++ /* Return error if SFP module has been detected but is not supported */ ++ if (hw->phy.type == ixgbe_phy_sfp_unsupported) ++ status = IXGBE_ERR_SFP_NOT_SUPPORTED; ++ ++ return status; ++} ++ ++/** ++ * ixgbe_get_supported_physical_layer_82599 - Returns physical layer type ++ * @hw: pointer to hardware structure ++ * ++ * Determines physical layer capabilities of the current configuration. ++ **/ ++u32 ixgbe_get_supported_physical_layer_82599(struct ixgbe_hw *hw) ++{ ++ u32 physical_layer = IXGBE_PHYSICAL_LAYER_UNKNOWN; ++ u32 autoc = IXGBE_READ_REG(hw, IXGBE_AUTOC); ++ u32 autoc2 = IXGBE_READ_REG(hw, IXGBE_AUTOC2); ++ u32 pma_pmd_10g_serial = autoc2 & IXGBE_AUTOC2_10G_SERIAL_PMA_PMD_MASK; ++ u32 pma_pmd_10g_parallel = autoc & IXGBE_AUTOC_10G_PMA_PMD_MASK; ++ u32 pma_pmd_1g = autoc & IXGBE_AUTOC_1G_PMA_PMD_MASK; ++ u16 ext_ability = 0; ++ u8 comp_codes_10g = 0; ++ ++ hw->phy.ops.identify(hw); ++ ++ if (hw->phy.type == ixgbe_phy_tn || ++ hw->phy.type == ixgbe_phy_aq || ++ hw->phy.type == ixgbe_phy_cu_unknown) { ++ hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_EXT_ABILITY, ++ IXGBE_MDIO_PMA_PMD_DEV_TYPE, &ext_ability); ++ if (ext_ability & IXGBE_MDIO_PHY_10GBASET_ABILITY) ++ physical_layer |= IXGBE_PHYSICAL_LAYER_10GBASE_T; ++ if (ext_ability & IXGBE_MDIO_PHY_1000BASET_ABILITY) ++ physical_layer |= IXGBE_PHYSICAL_LAYER_1000BASE_T; ++ if (ext_ability & IXGBE_MDIO_PHY_100BASETX_ABILITY) ++ physical_layer |= IXGBE_PHYSICAL_LAYER_100BASE_TX; ++ goto out; ++ } ++ ++ switch (autoc & IXGBE_AUTOC_LMS_MASK) { ++ case IXGBE_AUTOC_LMS_1G_AN: ++ case IXGBE_AUTOC_LMS_1G_LINK_NO_AN: ++ if (pma_pmd_1g == IXGBE_AUTOC_1G_KX_BX) { ++ physical_layer = IXGBE_PHYSICAL_LAYER_1000BASE_KX | ++ IXGBE_PHYSICAL_LAYER_1000BASE_BX; ++ goto out; ++ } else ++ /* SFI mode so read SFP module */ ++ goto sfp_check; ++ break; ++ case IXGBE_AUTOC_LMS_10G_LINK_NO_AN: ++ if (pma_pmd_10g_parallel == IXGBE_AUTOC_10G_CX4) ++ physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_CX4; ++ else if (pma_pmd_10g_parallel == IXGBE_AUTOC_10G_KX4) ++ physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_KX4; ++ else if (pma_pmd_10g_parallel == IXGBE_AUTOC_10G_XAUI) ++ physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_XAUI; ++ goto out; ++ break; ++ case IXGBE_AUTOC_LMS_10G_SERIAL: ++ if (pma_pmd_10g_serial == IXGBE_AUTOC2_10G_KR) { ++ physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_KR; ++ goto out; ++ } else if (pma_pmd_10g_serial == IXGBE_AUTOC2_10G_SFI) ++ goto sfp_check; ++ break; ++ case IXGBE_AUTOC_LMS_KX4_KX_KR: ++ case IXGBE_AUTOC_LMS_KX4_KX_KR_1G_AN: ++ if (autoc & IXGBE_AUTOC_KX_SUPP) ++ physical_layer |= IXGBE_PHYSICAL_LAYER_1000BASE_KX; ++ if (autoc & IXGBE_AUTOC_KX4_SUPP) ++ physical_layer |= IXGBE_PHYSICAL_LAYER_10GBASE_KX4; ++ if (autoc & IXGBE_AUTOC_KR_SUPP) ++ physical_layer |= IXGBE_PHYSICAL_LAYER_10GBASE_KR; ++ goto out; ++ break; ++ default: ++ goto out; ++ break; ++ } ++ ++sfp_check: ++ /* SFP check must be done last since DA modules are sometimes used to ++ * test KR mode - we need to id KR mode correctly before SFP module. ++ * Call identify_sfp because the pluggable module may have changed */ ++ hw->phy.ops.identify_sfp(hw); ++ if (hw->phy.sfp_type == ixgbe_sfp_type_not_present) ++ goto out; ++ ++ switch (hw->phy.type) { ++ case ixgbe_phy_tw_tyco: ++ case ixgbe_phy_tw_unknown: ++ physical_layer = IXGBE_PHYSICAL_LAYER_SFP_PLUS_CU; ++ break; ++ case ixgbe_phy_sfp_avago: ++ case ixgbe_phy_sfp_ftl: ++ case ixgbe_phy_sfp_intel: ++ case ixgbe_phy_sfp_unknown: ++ hw->phy.ops.read_i2c_eeprom(hw, ++ IXGBE_SFF_10GBE_COMP_CODES, &comp_codes_10g); ++ if (comp_codes_10g & IXGBE_SFF_10GBASESR_CAPABLE) ++ physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_SR; ++ else if (comp_codes_10g & IXGBE_SFF_10GBASELR_CAPABLE) ++ physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_LR; ++ break; ++ default: ++ break; ++ } ++ ++out: ++ return physical_layer; ++} ++ ++/** ++ * ixgbe_enable_rx_dma_82599 - Enable the Rx DMA unit on 82599 ++ * @hw: pointer to hardware structure ++ * @regval: register value to write to RXCTRL ++ * ++ * Enables the Rx DMA unit for 82599 ++ **/ ++s32 ixgbe_enable_rx_dma_82599(struct ixgbe_hw *hw, u32 regval) ++{ ++#define IXGBE_MAX_SECRX_POLL 30 ++ int i; ++ int secrxreg; ++ ++ /* ++ * Workaround for 82599 silicon errata when enabling the Rx datapath. ++ * If traffic is incoming before we enable the Rx unit, it could hang ++ * the Rx DMA unit. Therefore, make sure the security engine is ++ * completely disabled prior to enabling the Rx unit. ++ */ ++ secrxreg = IXGBE_READ_REG(hw, IXGBE_SECRXCTRL); ++ secrxreg |= IXGBE_SECRXCTRL_RX_DIS; ++ IXGBE_WRITE_REG(hw, IXGBE_SECRXCTRL, secrxreg); ++ for (i = 0; i < IXGBE_MAX_SECRX_POLL; i++) { ++ secrxreg = IXGBE_READ_REG(hw, IXGBE_SECRXSTAT); ++ if (secrxreg & IXGBE_SECRXSTAT_SECRX_RDY) ++ break; ++ else ++ /* Use interrupt-safe sleep just in case */ ++ udelay(10); ++ } ++ ++ /* For informational purposes only */ ++ if (i >= IXGBE_MAX_SECRX_POLL) ++ hw_dbg(hw, "Rx unit being enabled before security " ++ "path fully disabled. Continuing with init.\n"); ++ ++ IXGBE_WRITE_REG(hw, IXGBE_RXCTRL, regval); ++ secrxreg = IXGBE_READ_REG(hw, IXGBE_SECRXCTRL); ++ secrxreg &= ~IXGBE_SECRXCTRL_RX_DIS; ++ IXGBE_WRITE_REG(hw, IXGBE_SECRXCTRL, secrxreg); ++ IXGBE_WRITE_FLUSH(hw); ++ ++ return 0; ++} ++ ++/** ++ * ixgbe_get_device_caps_82599 - Get additional device capabilities ++ * @hw: pointer to hardware structure ++ * @device_caps: the EEPROM word with the extra device capabilities ++ * ++ * This function will read the EEPROM location for the device capabilities, ++ * and return the word through device_caps. ++ **/ ++s32 ixgbe_get_device_caps_82599(struct ixgbe_hw *hw, u16 *device_caps) ++{ ++ hw->eeprom.ops.read(hw, IXGBE_DEVICE_CAPS, device_caps); ++ ++ return 0; ++} ++ ++/** ++ * ixgbe_get_san_mac_addr_offset_82599 - SAN MAC address offset for 82599 ++ * @hw: pointer to hardware structure ++ * @san_mac_offset: SAN MAC address offset ++ * ++ * This function will read the EEPROM location for the SAN MAC address ++ * pointer, and returns the value at that location. This is used in both ++ * get and set mac_addr routines. ++ **/ ++s32 ixgbe_get_san_mac_addr_offset_82599(struct ixgbe_hw *hw, ++ u16 *san_mac_offset) ++{ ++ /* ++ * First read the EEPROM pointer to see if the MAC addresses are ++ * available. ++ */ ++ hw->eeprom.ops.read(hw, IXGBE_SAN_MAC_ADDR_PTR, san_mac_offset); ++ ++ return 0; ++} ++ ++/** ++ * ixgbe_get_san_mac_addr_82599 - SAN MAC address retrieval for 82599 ++ * @hw: pointer to hardware structure ++ * @san_mac_addr: SAN MAC address ++ * ++ * Reads the SAN MAC address from the EEPROM, if it's available. This is ++ * per-port, so set_lan_id() must be called before reading the addresses. ++ * set_lan_id() is called by identify_sfp(), but this cannot be relied ++ * upon for non-SFP connections, so we must call it here. ++ **/ ++s32 ixgbe_get_san_mac_addr_82599(struct ixgbe_hw *hw, u8 *san_mac_addr) ++{ ++ u16 san_mac_data, san_mac_offset; ++ u8 i; ++ ++ /* ++ * First read the EEPROM pointer to see if the MAC addresses are ++ * available. If they're not, no point in calling set_lan_id() here. ++ */ ++ ixgbe_get_san_mac_addr_offset_82599(hw, &san_mac_offset); ++ ++ if ((san_mac_offset == 0) || (san_mac_offset == 0xFFFF)) { ++ /* ++ * No addresses available in this EEPROM. It's not an ++ * error though, so just wipe the local address and return. ++ */ ++ for (i = 0; i < 6; i++) ++ san_mac_addr[i] = 0xFF; ++ ++ goto san_mac_addr_out; ++ } ++ ++ /* make sure we know which port we need to program */ ++ hw->mac.ops.set_lan_id(hw); ++ /* apply the port offset to the address offset */ ++ (hw->bus.func) ? (san_mac_offset += IXGBE_SAN_MAC_ADDR_PORT1_OFFSET) : ++ (san_mac_offset += IXGBE_SAN_MAC_ADDR_PORT0_OFFSET); ++ for (i = 0; i < 3; i++) { ++ hw->eeprom.ops.read(hw, san_mac_offset, &san_mac_data); ++ san_mac_addr[i * 2] = (u8)(san_mac_data); ++ san_mac_addr[i * 2 + 1] = (u8)(san_mac_data >> 8); ++ san_mac_offset++; ++ } ++ ++san_mac_addr_out: ++ return 0; ++} ++ ++/** ++ * ixgbe_set_san_mac_addr_82599 - Write the SAN MAC address to the EEPROM ++ * @hw: pointer to hardware structure ++ * @san_mac_addr: SAN MAC address ++ * ++ * Write a SAN MAC address to the EEPROM. ++ **/ ++s32 ixgbe_set_san_mac_addr_82599(struct ixgbe_hw *hw, u8 *san_mac_addr) ++{ ++ s32 status = 0; ++ u16 san_mac_data, san_mac_offset; ++ u8 i; ++ ++ /* Look for SAN mac address pointer. If not defined, return */ ++ ixgbe_get_san_mac_addr_offset_82599(hw, &san_mac_offset); ++ ++ if ((san_mac_offset == 0) || (san_mac_offset == 0xFFFF)) { ++ status = IXGBE_ERR_NO_SAN_ADDR_PTR; ++ goto san_mac_addr_out; ++ } ++ ++ /* Make sure we know which port we need to write */ ++ hw->mac.ops.set_lan_id(hw); ++ /* Apply the port offset to the address offset */ ++ (hw->bus.func) ? (san_mac_offset += IXGBE_SAN_MAC_ADDR_PORT1_OFFSET) : ++ (san_mac_offset += IXGBE_SAN_MAC_ADDR_PORT0_OFFSET); ++ ++ for (i = 0; i < 3; i++) { ++ san_mac_data = (u16)((u16)(san_mac_addr[i * 2 + 1]) << 8); ++ san_mac_data |= (u16)(san_mac_addr[i * 2]); ++ hw->eeprom.ops.write(hw, san_mac_offset, san_mac_data); ++ san_mac_offset++; ++ } ++ ++san_mac_addr_out: ++ return status; ++} ++ ++/** ++ * ixgbe_verify_fw_version_82599 - verify fw version for 82599 ++ * @hw: pointer to hardware structure ++ * ++ * Verifies that installed the firmware version is 0.6 or higher ++ * for SFI devices. All 82599 SFI devices should have version 0.6 or higher. ++ * ++ * Returns IXGBE_ERR_EEPROM_VERSION if the FW is not present or ++ * if the FW version is not supported. ++ **/ ++static s32 ixgbe_verify_fw_version_82599(struct ixgbe_hw *hw) ++{ ++ s32 status = IXGBE_ERR_EEPROM_VERSION; ++ u16 fw_offset, fw_ptp_cfg_offset; ++ u16 fw_version = 0; ++ ++ /* firmware check is only necessary for SFI devices */ ++ if (hw->phy.media_type != ixgbe_media_type_fiber) { ++ status = 0; ++ goto fw_version_out; ++ } ++ ++ /* get the offset to the Firmware Module block */ ++ hw->eeprom.ops.read(hw, IXGBE_FW_PTR, &fw_offset); ++ ++ if ((fw_offset == 0) || (fw_offset == 0xFFFF)) ++ goto fw_version_out; ++ ++ /* get the offset to the Pass Through Patch Configuration block */ ++ hw->eeprom.ops.read(hw, (fw_offset + ++ IXGBE_FW_PASSTHROUGH_PATCH_CONFIG_PTR), ++ &fw_ptp_cfg_offset); ++ ++ if ((fw_ptp_cfg_offset == 0) || (fw_ptp_cfg_offset == 0xFFFF)) ++ goto fw_version_out; ++ ++ /* get the firmware version */ ++ hw->eeprom.ops.read(hw, (fw_ptp_cfg_offset + ++ IXGBE_FW_PATCH_VERSION_4), ++ &fw_version); ++ ++ if (fw_version > 0x5) ++ status = 0; ++ ++fw_version_out: ++ return status; ++} +diff -r 3e5bbd731d89 drivers/net/ixgbe/ixgbe_api.c +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/ixgbe/ixgbe_api.c Mon Jun 15 12:06:28 2009 +0100 +@@ -0,0 +1,957 @@ ++/******************************************************************************* ++ ++ Intel 10 Gigabit PCI Express Linux driver ++ Copyright(c) 1999 - 2009 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++#include "ixgbe_api.h" ++#include "ixgbe_common.h" ++ ++extern s32 ixgbe_init_ops_82598(struct ixgbe_hw *hw); ++extern s32 ixgbe_init_ops_82599(struct ixgbe_hw *hw); ++ ++/** ++ * ixgbe_init_shared_code - Initialize the shared code ++ * @hw: pointer to hardware structure ++ * ++ * This will assign function pointers and assign the MAC type and PHY code. ++ * Does not touch the hardware. This function must be called prior to any ++ * other function in the shared code. The ixgbe_hw structure should be ++ * memset to 0 prior to calling this function. The following fields in ++ * hw structure should be filled in prior to calling this function: ++ * hw_addr, back, device_id, vendor_id, subsystem_device_id, ++ * subsystem_vendor_id, and revision_id ++ **/ ++s32 ixgbe_init_shared_code(struct ixgbe_hw *hw) ++{ ++ s32 status; ++ ++ /* ++ * Set the mac type ++ */ ++ ixgbe_set_mac_type(hw); ++ ++ switch (hw->mac.type) { ++ case ixgbe_mac_82598EB: ++ status = ixgbe_init_ops_82598(hw); ++ break; ++ case ixgbe_mac_82599EB: ++ status = ixgbe_init_ops_82599(hw); ++ break; ++ default: ++ status = IXGBE_ERR_DEVICE_NOT_SUPPORTED; ++ break; ++ } ++ ++ return status; ++} ++ ++/** ++ * ixgbe_set_mac_type - Sets MAC type ++ * @hw: pointer to the HW structure ++ * ++ * This function sets the mac type of the adapter based on the ++ * vendor ID and device ID stored in the hw structure. ++ **/ ++s32 ixgbe_set_mac_type(struct ixgbe_hw *hw) ++{ ++ s32 ret_val = 0; ++ ++ if (hw->vendor_id == IXGBE_INTEL_VENDOR_ID) { ++ switch (hw->device_id) { ++ case IXGBE_DEV_ID_82598: ++ case IXGBE_DEV_ID_82598_BX: ++ case IXGBE_DEV_ID_82598AF_SINGLE_PORT: ++ case IXGBE_DEV_ID_82598AF_DUAL_PORT: ++ case IXGBE_DEV_ID_82598AT: ++ case IXGBE_DEV_ID_82598EB_CX4: ++ case IXGBE_DEV_ID_82598_CX4_DUAL_PORT: ++ case IXGBE_DEV_ID_82598_DA_DUAL_PORT: ++ case IXGBE_DEV_ID_82598_SR_DUAL_PORT_EM: ++ case IXGBE_DEV_ID_82598EB_XF_LR: ++ case IXGBE_DEV_ID_82598EB_SFP_LOM: ++ hw->mac.type = ixgbe_mac_82598EB; ++ break; ++ case IXGBE_DEV_ID_82599_KX4: ++ case IXGBE_DEV_ID_82599_XAUI_LOM: ++ case IXGBE_DEV_ID_82599_SFP: ++ hw->mac.type = ixgbe_mac_82599EB; ++ break; ++ default: ++ ret_val = IXGBE_ERR_DEVICE_NOT_SUPPORTED; ++ break; ++ } ++ } else { ++ ret_val = IXGBE_ERR_DEVICE_NOT_SUPPORTED; ++ } ++ ++ hw_dbg(hw, "ixgbe_set_mac_type found mac: %d, returns: %d\n", ++ hw->mac.type, ret_val); ++ return ret_val; ++} ++ ++/** ++ * ixgbe_init_hw - Initialize the hardware ++ * @hw: pointer to hardware structure ++ * ++ * Initialize the hardware by resetting and then starting the hardware ++ **/ ++s32 ixgbe_init_hw(struct ixgbe_hw *hw) ++{ ++ return ixgbe_call_func(hw, hw->mac.ops.init_hw, (hw), ++ IXGBE_NOT_IMPLEMENTED); ++} ++ ++/** ++ * ixgbe_reset_hw - Performs a hardware reset ++ * @hw: pointer to hardware structure ++ * ++ * Resets the hardware by resetting the transmit and receive units, masks and ++ * clears all interrupts, performs a PHY reset, and performs a MAC reset ++ **/ ++s32 ixgbe_reset_hw(struct ixgbe_hw *hw) ++{ ++ return ixgbe_call_func(hw, hw->mac.ops.reset_hw, (hw), ++ IXGBE_NOT_IMPLEMENTED); ++} ++ ++/** ++ * ixgbe_start_hw - Prepares hardware for Rx/Tx ++ * @hw: pointer to hardware structure ++ * ++ * Starts the hardware by filling the bus info structure and media type, ++ * clears all on chip counters, initializes receive address registers, ++ * multicast table, VLAN filter table, calls routine to setup link and ++ * flow control settings, and leaves transmit and receive units disabled ++ * and uninitialized. ++ **/ ++s32 ixgbe_start_hw(struct ixgbe_hw *hw) ++{ ++ return ixgbe_call_func(hw, hw->mac.ops.start_hw, (hw), ++ IXGBE_NOT_IMPLEMENTED); ++} ++ ++/** ++ * ixgbe_clear_hw_cntrs - Clear hardware counters ++ * @hw: pointer to hardware structure ++ * ++ * Clears all hardware statistics counters by reading them from the hardware ++ * Statistics counters are clear on read. ++ **/ ++s32 ixgbe_clear_hw_cntrs(struct ixgbe_hw *hw) ++{ ++ return ixgbe_call_func(hw, hw->mac.ops.clear_hw_cntrs, (hw), ++ IXGBE_NOT_IMPLEMENTED); ++} ++ ++/** ++ * ixgbe_get_media_type - Get media type ++ * @hw: pointer to hardware structure ++ * ++ * Returns the media type (fiber, copper, backplane) ++ **/ ++enum ixgbe_media_type ixgbe_get_media_type(struct ixgbe_hw *hw) ++{ ++ return ixgbe_call_func(hw, hw->mac.ops.get_media_type, (hw), ++ ixgbe_media_type_unknown); ++} ++ ++/** ++ * ixgbe_get_mac_addr - Get MAC address ++ * @hw: pointer to hardware structure ++ * @mac_addr: Adapter MAC address ++ * ++ * Reads the adapter's MAC address from the first Receive Address Register ++ * (RAR0) A reset of the adapter must have been performed prior to calling ++ * this function in order for the MAC address to have been loaded from the ++ * EEPROM into RAR0 ++ **/ ++s32 ixgbe_get_mac_addr(struct ixgbe_hw *hw, u8 *mac_addr) ++{ ++ return ixgbe_call_func(hw, hw->mac.ops.get_mac_addr, ++ (hw, mac_addr), IXGBE_NOT_IMPLEMENTED); ++} ++ ++/** ++ * ixgbe_get_san_mac_addr - Get SAN MAC address ++ * @hw: pointer to hardware structure ++ * @san_mac_addr: SAN MAC address ++ * ++ * Reads the SAN MAC address from the EEPROM, if it's available. This is ++ * per-port, so set_lan_id() must be called before reading the addresses. ++ **/ ++s32 ixgbe_get_san_mac_addr(struct ixgbe_hw *hw, u8 *san_mac_addr) ++{ ++ return ixgbe_call_func(hw, hw->mac.ops.get_san_mac_addr, ++ (hw, san_mac_addr), IXGBE_NOT_IMPLEMENTED); ++} ++ ++/** ++ * ixgbe_set_san_mac_addr - Write a SAN MAC address ++ * @hw: pointer to hardware structure ++ * @san_mac_addr: SAN MAC address ++ * ++ * Writes A SAN MAC address to the EEPROM. ++ **/ ++s32 ixgbe_set_san_mac_addr(struct ixgbe_hw *hw, u8 *san_mac_addr) ++{ ++ return ixgbe_call_func(hw, hw->mac.ops.set_san_mac_addr, ++ (hw, san_mac_addr), IXGBE_NOT_IMPLEMENTED); ++} ++ ++/** ++ * ixgbe_get_device_caps - Get additional device capabilities ++ * @hw: pointer to hardware structure ++ * @device_caps: the EEPROM word for device capabilities ++ * ++ * Reads the extra device capabilities from the EEPROM ++ **/ ++s32 ixgbe_get_device_caps(struct ixgbe_hw *hw, u16 *device_caps) ++{ ++ return ixgbe_call_func(hw, hw->mac.ops.get_device_caps, ++ (hw, device_caps), IXGBE_NOT_IMPLEMENTED); ++} ++ ++/** ++ * ixgbe_get_bus_info - Set PCI bus info ++ * @hw: pointer to hardware structure ++ * ++ * Sets the PCI bus info (speed, width, type) within the ixgbe_hw structure ++ **/ ++s32 ixgbe_get_bus_info(struct ixgbe_hw *hw) ++{ ++ return ixgbe_call_func(hw, hw->mac.ops.get_bus_info, (hw), ++ IXGBE_NOT_IMPLEMENTED); ++} ++ ++/** ++ * ixgbe_get_num_of_tx_queues - Get Tx queues ++ * @hw: pointer to hardware structure ++ * ++ * Returns the number of transmit queues for the given adapter. ++ **/ ++u32 ixgbe_get_num_of_tx_queues(struct ixgbe_hw *hw) ++{ ++ return hw->mac.max_tx_queues; ++} ++ ++/** ++ * ixgbe_get_num_of_rx_queues - Get Rx queues ++ * @hw: pointer to hardware structure ++ * ++ * Returns the number of receive queues for the given adapter. ++ **/ ++u32 ixgbe_get_num_of_rx_queues(struct ixgbe_hw *hw) ++{ ++ return hw->mac.max_rx_queues; ++} ++ ++/** ++ * ixgbe_stop_adapter - Disable Rx/Tx units ++ * @hw: pointer to hardware structure ++ * ++ * Sets the adapter_stopped flag within ixgbe_hw struct. Clears interrupts, ++ * disables transmit and receive units. The adapter_stopped flag is used by ++ * the shared code and drivers to determine if the adapter is in a stopped ++ * state and should not touch the hardware. ++ **/ ++s32 ixgbe_stop_adapter(struct ixgbe_hw *hw) ++{ ++ return ixgbe_call_func(hw, hw->mac.ops.stop_adapter, (hw), ++ IXGBE_NOT_IMPLEMENTED); ++} ++ ++/** ++ * ixgbe_read_pba_num - Reads part number from EEPROM ++ * @hw: pointer to hardware structure ++ * @pba_num: stores the part number from the EEPROM ++ * ++ * Reads the part number from the EEPROM. ++ **/ ++s32 ixgbe_read_pba_num(struct ixgbe_hw *hw, u32 *pba_num) ++{ ++ return ixgbe_read_pba_num_generic(hw, pba_num); ++} ++ ++/** ++ * ixgbe_identify_phy - Get PHY type ++ * @hw: pointer to hardware structure ++ * ++ * Determines the physical layer module found on the current adapter. ++ **/ ++s32 ixgbe_identify_phy(struct ixgbe_hw *hw) ++{ ++ s32 status = 0; ++ ++ if (hw->phy.type == ixgbe_phy_unknown) { ++ status = ixgbe_call_func(hw, ++ hw->phy.ops.identify, ++ (hw), ++ IXGBE_NOT_IMPLEMENTED); ++ } ++ ++ return status; ++} ++ ++/** ++ * ixgbe_reset_phy - Perform a PHY reset ++ * @hw: pointer to hardware structure ++ **/ ++s32 ixgbe_reset_phy(struct ixgbe_hw *hw) ++{ ++ s32 status = 0; ++ ++ if (hw->phy.type == ixgbe_phy_unknown) { ++ if (ixgbe_identify_phy(hw) != 0) ++ status = IXGBE_ERR_PHY; ++ } ++ ++ if (status == 0) { ++ status = ixgbe_call_func(hw, hw->phy.ops.reset, (hw), ++ IXGBE_NOT_IMPLEMENTED); ++ } ++ return status; ++} ++ ++/** ++ * ixgbe_get_phy_firmware_version - ++ * @hw: pointer to hardware structure ++ * @firmware_version: pointer to firmware version ++ **/ ++s32 ixgbe_get_phy_firmware_version(struct ixgbe_hw *hw, u16 *firmware_version) ++{ ++ s32 status = 0; ++ ++ status = ixgbe_call_func(hw, hw->phy.ops.get_firmware_version, ++ (hw, firmware_version), ++ IXGBE_NOT_IMPLEMENTED); ++ return status; ++} ++ ++/** ++ * ixgbe_read_phy_reg - Read PHY register ++ * @hw: pointer to hardware structure ++ * @reg_addr: 32 bit address of PHY register to read ++ * @phy_data: Pointer to read data from PHY register ++ * ++ * Reads a value from a specified PHY register ++ **/ ++s32 ixgbe_read_phy_reg(struct ixgbe_hw *hw, u32 reg_addr, u32 device_type, ++ u16 *phy_data) ++{ ++ if (hw->phy.id == 0) ++ ixgbe_identify_phy(hw); ++ ++ return ixgbe_call_func(hw, hw->phy.ops.read_reg, (hw, reg_addr, ++ device_type, phy_data), IXGBE_NOT_IMPLEMENTED); ++} ++ ++/** ++ * ixgbe_write_phy_reg - Write PHY register ++ * @hw: pointer to hardware structure ++ * @reg_addr: 32 bit PHY register to write ++ * @phy_data: Data to write to the PHY register ++ * ++ * Writes a value to specified PHY register ++ **/ ++s32 ixgbe_write_phy_reg(struct ixgbe_hw *hw, u32 reg_addr, u32 device_type, ++ u16 phy_data) ++{ ++ if (hw->phy.id == 0) ++ ixgbe_identify_phy(hw); ++ ++ return ixgbe_call_func(hw, hw->phy.ops.write_reg, (hw, reg_addr, ++ device_type, phy_data), IXGBE_NOT_IMPLEMENTED); ++} ++ ++/** ++ * ixgbe_setup_phy_link - Restart PHY autoneg ++ * @hw: pointer to hardware structure ++ * ++ * Restart autonegotiation and PHY and waits for completion. ++ **/ ++s32 ixgbe_setup_phy_link(struct ixgbe_hw *hw) ++{ ++ return ixgbe_call_func(hw, hw->phy.ops.setup_link, (hw), ++ IXGBE_NOT_IMPLEMENTED); ++} ++ ++/** ++ * ixgbe_check_phy_link - Determine link and speed status ++ * @hw: pointer to hardware structure ++ * ++ * Reads a PHY register to determine if link is up and the current speed for ++ * the PHY. ++ **/ ++s32 ixgbe_check_phy_link(struct ixgbe_hw *hw, ixgbe_link_speed *speed, ++ bool *link_up) ++{ ++ return ixgbe_call_func(hw, hw->phy.ops.check_link, (hw, speed, ++ link_up), IXGBE_NOT_IMPLEMENTED); ++} ++ ++/** ++ * ixgbe_setup_phy_link_speed - Set auto advertise ++ * @hw: pointer to hardware structure ++ * @speed: new link speed ++ * @autoneg: true if autonegotiation enabled ++ * ++ * Sets the auto advertised capabilities ++ **/ ++s32 ixgbe_setup_phy_link_speed(struct ixgbe_hw *hw, ixgbe_link_speed speed, ++ bool autoneg, ++ bool autoneg_wait_to_complete) ++{ ++ return ixgbe_call_func(hw, hw->phy.ops.setup_link_speed, (hw, speed, ++ autoneg, autoneg_wait_to_complete), ++ IXGBE_NOT_IMPLEMENTED); ++} ++ ++/** ++ * ixgbe_setup_link - Configure link settings ++ * @hw: pointer to hardware structure ++ * ++ * Configures link settings based on values in the ixgbe_hw struct. ++ * Restarts the link. Performs autonegotiation if needed. ++ **/ ++s32 ixgbe_setup_link(struct ixgbe_hw *hw) ++{ ++ return ixgbe_call_func(hw, hw->mac.ops.setup_link, (hw), ++ IXGBE_NOT_IMPLEMENTED); ++} ++ ++/** ++ * ixgbe_check_link - Get link and speed status ++ * @hw: pointer to hardware structure ++ * ++ * Reads the links register to determine if link is up and the current speed ++ **/ ++s32 ixgbe_check_link(struct ixgbe_hw *hw, ixgbe_link_speed *speed, ++ bool *link_up, bool link_up_wait_to_complete) ++{ ++ return ixgbe_call_func(hw, hw->mac.ops.check_link, (hw, speed, ++ link_up, link_up_wait_to_complete), ++ IXGBE_NOT_IMPLEMENTED); ++} ++ ++/** ++ * ixgbe_setup_link_speed - Set link speed ++ * @hw: pointer to hardware structure ++ * @speed: new link speed ++ * @autoneg: true if autonegotiation enabled ++ * ++ * Set the link speed and restarts the link. ++ **/ ++s32 ixgbe_setup_link_speed(struct ixgbe_hw *hw, ixgbe_link_speed speed, ++ bool autoneg, ++ bool autoneg_wait_to_complete) ++{ ++ return ixgbe_call_func(hw, hw->mac.ops.setup_link_speed, (hw, speed, ++ autoneg, autoneg_wait_to_complete), ++ IXGBE_NOT_IMPLEMENTED); ++} ++ ++/** ++ * ixgbe_get_link_capabilities - Returns link capabilities ++ * @hw: pointer to hardware structure ++ * ++ * Determines the link capabilities of the current configuration. ++ **/ ++s32 ixgbe_get_link_capabilities(struct ixgbe_hw *hw, ixgbe_link_speed *speed, ++ bool *autoneg) ++{ ++ return ixgbe_call_func(hw, hw->mac.ops.get_link_capabilities, (hw, ++ speed, autoneg), IXGBE_NOT_IMPLEMENTED); ++} ++ ++/** ++ * ixgbe_led_on - Turn on LEDs ++ * @hw: pointer to hardware structure ++ * @index: led number to turn on ++ * ++ * Turns on the software controllable LEDs. ++ **/ ++s32 ixgbe_led_on(struct ixgbe_hw *hw, u32 index) ++{ ++ return ixgbe_call_func(hw, hw->mac.ops.led_on, (hw, index), ++ IXGBE_NOT_IMPLEMENTED); ++} ++ ++/** ++ * ixgbe_led_off - Turn off LEDs ++ * @hw: pointer to hardware structure ++ * @index: led number to turn off ++ * ++ * Turns off the software controllable LEDs. ++ **/ ++s32 ixgbe_led_off(struct ixgbe_hw *hw, u32 index) ++{ ++ return ixgbe_call_func(hw, hw->mac.ops.led_off, (hw, index), ++ IXGBE_NOT_IMPLEMENTED); ++} ++ ++/** ++ * ixgbe_blink_led_start - Blink LEDs ++ * @hw: pointer to hardware structure ++ * @index: led number to blink ++ * ++ * Blink LED based on index. ++ **/ ++s32 ixgbe_blink_led_start(struct ixgbe_hw *hw, u32 index) ++{ ++ return ixgbe_call_func(hw, hw->mac.ops.blink_led_start, (hw, index), ++ IXGBE_NOT_IMPLEMENTED); ++} ++ ++/** ++ * ixgbe_blink_led_stop - Stop blinking LEDs ++ * @hw: pointer to hardware structure ++ * ++ * Stop blinking LED based on index. ++ **/ ++s32 ixgbe_blink_led_stop(struct ixgbe_hw *hw, u32 index) ++{ ++ return ixgbe_call_func(hw, hw->mac.ops.blink_led_stop, (hw, index), ++ IXGBE_NOT_IMPLEMENTED); ++} ++ ++/** ++ * ixgbe_init_eeprom_params - Initialize EEPROM parameters ++ * @hw: pointer to hardware structure ++ * ++ * Initializes the EEPROM parameters ixgbe_eeprom_info within the ++ * ixgbe_hw struct in order to set up EEPROM access. ++ **/ ++s32 ixgbe_init_eeprom_params(struct ixgbe_hw *hw) ++{ ++ return ixgbe_call_func(hw, hw->eeprom.ops.init_params, (hw), ++ IXGBE_NOT_IMPLEMENTED); ++} ++ ++ ++/** ++ * ixgbe_write_eeprom - Write word to EEPROM ++ * @hw: pointer to hardware structure ++ * @offset: offset within the EEPROM to be written to ++ * @data: 16 bit word to be written to the EEPROM ++ * ++ * Writes 16 bit value to EEPROM. If ixgbe_eeprom_update_checksum is not ++ * called after this function, the EEPROM will most likely contain an ++ * invalid checksum. ++ **/ ++s32 ixgbe_write_eeprom(struct ixgbe_hw *hw, u16 offset, u16 data) ++{ ++ return ixgbe_call_func(hw, hw->eeprom.ops.write, (hw, offset, data), ++ IXGBE_NOT_IMPLEMENTED); ++} ++ ++/** ++ * ixgbe_read_eeprom - Read word from EEPROM ++ * @hw: pointer to hardware structure ++ * @offset: offset within the EEPROM to be read ++ * @data: read 16 bit value from EEPROM ++ * ++ * Reads 16 bit value from EEPROM ++ **/ ++s32 ixgbe_read_eeprom(struct ixgbe_hw *hw, u16 offset, u16 *data) ++{ ++ return ixgbe_call_func(hw, hw->eeprom.ops.read, (hw, offset, data), ++ IXGBE_NOT_IMPLEMENTED); ++} ++ ++/** ++ * ixgbe_validate_eeprom_checksum - Validate EEPROM checksum ++ * @hw: pointer to hardware structure ++ * @checksum_val: calculated checksum ++ * ++ * Performs checksum calculation and validates the EEPROM checksum ++ **/ ++s32 ixgbe_validate_eeprom_checksum(struct ixgbe_hw *hw, u16 *checksum_val) ++{ ++ return ixgbe_call_func(hw, hw->eeprom.ops.validate_checksum, ++ (hw, checksum_val), IXGBE_NOT_IMPLEMENTED); ++} ++ ++/** ++ * ixgbe_eeprom_update_checksum - Updates the EEPROM checksum ++ * @hw: pointer to hardware structure ++ **/ ++s32 ixgbe_update_eeprom_checksum(struct ixgbe_hw *hw) ++{ ++ return ixgbe_call_func(hw, hw->eeprom.ops.update_checksum, (hw), ++ IXGBE_NOT_IMPLEMENTED); ++} ++ ++/** ++ * ixgbe_insert_mac_addr - Find a RAR for this mac address ++ * @hw: pointer to hardware structure ++ * @addr: Address to put into receive address register ++ * @vmdq: VMDq pool to assign ++ * ++ * Puts an ethernet address into a receive address register, or ++ * finds the rar that it is aleady in; adds to the pool list ++ **/ ++s32 ixgbe_insert_mac_addr(struct ixgbe_hw *hw, u8 *addr, u32 vmdq) ++{ ++ return ixgbe_call_func(hw, hw->mac.ops.insert_mac_addr, ++ (hw, addr, vmdq), ++ IXGBE_NOT_IMPLEMENTED); ++} ++ ++/** ++ * ixgbe_set_rar - Set Rx address register ++ * @hw: pointer to hardware structure ++ * @index: Receive address register to write ++ * @addr: Address to put into receive address register ++ * @vmdq: VMDq "set" ++ * @enable_addr: set flag that address is active ++ * ++ * Puts an ethernet address into a receive address register. ++ **/ ++s32 ixgbe_set_rar(struct ixgbe_hw *hw, u32 index, u8 *addr, u32 vmdq, ++ u32 enable_addr) ++{ ++ return ixgbe_call_func(hw, hw->mac.ops.set_rar, (hw, index, addr, vmdq, ++ enable_addr), IXGBE_NOT_IMPLEMENTED); ++} ++ ++/** ++ * ixgbe_clear_rar - Clear Rx address register ++ * @hw: pointer to hardware structure ++ * @index: Receive address register to write ++ * ++ * Puts an ethernet address into a receive address register. ++ **/ ++s32 ixgbe_clear_rar(struct ixgbe_hw *hw, u32 index) ++{ ++ return ixgbe_call_func(hw, hw->mac.ops.clear_rar, (hw, index), ++ IXGBE_NOT_IMPLEMENTED); ++} ++ ++/** ++ * ixgbe_set_vmdq - Associate a VMDq index with a receive address ++ * @hw: pointer to hardware structure ++ * @rar: receive address register index to associate with VMDq index ++ * @vmdq: VMDq set or pool index ++ **/ ++s32 ixgbe_set_vmdq(struct ixgbe_hw *hw, u32 rar, u32 vmdq) ++{ ++ return ixgbe_call_func(hw, hw->mac.ops.set_vmdq, (hw, rar, vmdq), ++ IXGBE_NOT_IMPLEMENTED); ++} ++ ++/** ++ * ixgbe_clear_vmdq - Disassociate a VMDq index from a receive address ++ * @hw: pointer to hardware structure ++ * @rar: receive address register index to disassociate with VMDq index ++ * @vmdq: VMDq set or pool index ++ **/ ++s32 ixgbe_clear_vmdq(struct ixgbe_hw *hw, u32 rar, u32 vmdq) ++{ ++ return ixgbe_call_func(hw, hw->mac.ops.clear_vmdq, (hw, rar, vmdq), ++ IXGBE_NOT_IMPLEMENTED); ++} ++ ++/** ++ * ixgbe_init_rx_addrs - Initializes receive address filters. ++ * @hw: pointer to hardware structure ++ * ++ * Places the MAC address in receive address register 0 and clears the rest ++ * of the receive address registers. Clears the multicast table. Assumes ++ * the receiver is in reset when the routine is called. ++ **/ ++s32 ixgbe_init_rx_addrs(struct ixgbe_hw *hw) ++{ ++ return ixgbe_call_func(hw, hw->mac.ops.init_rx_addrs, (hw), ++ IXGBE_NOT_IMPLEMENTED); ++} ++ ++/** ++ * ixgbe_get_num_rx_addrs - Returns the number of RAR entries. ++ * @hw: pointer to hardware structure ++ **/ ++u32 ixgbe_get_num_rx_addrs(struct ixgbe_hw *hw) ++{ ++ return hw->mac.num_rar_entries; ++} ++ ++/** ++ * ixgbe_update_uc_addr_list - Updates the MAC's list of secondary addresses ++ * @hw: pointer to hardware structure ++ * @addr_list: the list of new multicast addresses ++ * @addr_count: number of addresses ++ * @func: iterator function to walk the multicast address list ++ * ++ * The given list replaces any existing list. Clears the secondary addrs from ++ * receive address registers. Uses unused receive address registers for the ++ * first secondary addresses, and falls back to promiscuous mode as needed. ++ **/ ++s32 ixgbe_update_uc_addr_list(struct ixgbe_hw *hw, u8 *addr_list, ++ u32 addr_count, ixgbe_mc_addr_itr func) ++{ ++ return ixgbe_call_func(hw, hw->mac.ops.update_uc_addr_list, (hw, ++ addr_list, addr_count, func), ++ IXGBE_NOT_IMPLEMENTED); ++} ++ ++/** ++ * ixgbe_update_mc_addr_list - Updates the MAC's list of multicast addresses ++ * @hw: pointer to hardware structure ++ * @mc_addr_list: the list of new multicast addresses ++ * @mc_addr_count: number of addresses ++ * @func: iterator function to walk the multicast address list ++ * ++ * The given list replaces any existing list. Clears the MC addrs from receive ++ * address registers and the multicast table. Uses unused receive address ++ * registers for the first multicast addresses, and hashes the rest into the ++ * multicast table. ++ **/ ++s32 ixgbe_update_mc_addr_list(struct ixgbe_hw *hw, u8 *mc_addr_list, ++ u32 mc_addr_count, ixgbe_mc_addr_itr func) ++{ ++ return ixgbe_call_func(hw, hw->mac.ops.update_mc_addr_list, (hw, ++ mc_addr_list, mc_addr_count, func), ++ IXGBE_NOT_IMPLEMENTED); ++} ++ ++/** ++ * ixgbe_enable_mc - Enable multicast address in RAR ++ * @hw: pointer to hardware structure ++ * ++ * Enables multicast address in RAR and the use of the multicast hash table. ++ **/ ++s32 ixgbe_enable_mc(struct ixgbe_hw *hw) ++{ ++ return ixgbe_call_func(hw, hw->mac.ops.enable_mc, (hw), ++ IXGBE_NOT_IMPLEMENTED); ++} ++ ++/** ++ * ixgbe_disable_mc - Disable multicast address in RAR ++ * @hw: pointer to hardware structure ++ * ++ * Disables multicast address in RAR and the use of the multicast hash table. ++ **/ ++s32 ixgbe_disable_mc(struct ixgbe_hw *hw) ++{ ++ return ixgbe_call_func(hw, hw->mac.ops.disable_mc, (hw), ++ IXGBE_NOT_IMPLEMENTED); ++} ++ ++/** ++ * ixgbe_clear_vfta - Clear VLAN filter table ++ * @hw: pointer to hardware structure ++ * ++ * Clears the VLAN filer table, and the VMDq index associated with the filter ++ **/ ++s32 ixgbe_clear_vfta(struct ixgbe_hw *hw) ++{ ++ return ixgbe_call_func(hw, hw->mac.ops.clear_vfta, (hw), ++ IXGBE_NOT_IMPLEMENTED); ++} ++ ++/** ++ * ixgbe_set_vfta - Set VLAN filter table ++ * @hw: pointer to hardware structure ++ * @vlan: VLAN id to write to VLAN filter ++ * @vind: VMDq output index that maps queue to VLAN id in VFTA ++ * @vlan_on: boolean flag to turn on/off VLAN in VFTA ++ * ++ * Turn on/off specified VLAN in the VLAN filter table. ++ **/ ++s32 ixgbe_set_vfta(struct ixgbe_hw *hw, u32 vlan, u32 vind, bool vlan_on) ++{ ++ return ixgbe_call_func(hw, hw->mac.ops.set_vfta, (hw, vlan, vind, ++ vlan_on), IXGBE_NOT_IMPLEMENTED); ++} ++ ++/** ++ * ixgbe_fc_enable - Enable flow control ++ * @hw: pointer to hardware structure ++ * @packetbuf_num: packet buffer number (0-7) ++ * ++ * Configures the flow control settings based on SW configuration. ++ **/ ++s32 ixgbe_fc_enable(struct ixgbe_hw *hw, s32 packetbuf_num) ++{ ++ return ixgbe_call_func(hw, hw->mac.ops.fc_enable, (hw, packetbuf_num), ++ IXGBE_NOT_IMPLEMENTED); ++} ++ ++/** ++ * ixgbe_read_analog_reg8 - Reads 8 bit analog register ++ * @hw: pointer to hardware structure ++ * @reg: analog register to read ++ * @val: read value ++ * ++ * Performs write operation to analog register specified. ++ **/ ++s32 ixgbe_read_analog_reg8(struct ixgbe_hw *hw, u32 reg, u8 *val) ++{ ++ return ixgbe_call_func(hw, hw->mac.ops.read_analog_reg8, (hw, reg, ++ val), IXGBE_NOT_IMPLEMENTED); ++} ++ ++/** ++ * ixgbe_write_analog_reg8 - Writes 8 bit analog register ++ * @hw: pointer to hardware structure ++ * @reg: analog register to write ++ * @val: value to write ++ * ++ * Performs write operation to Atlas analog register specified. ++ **/ ++s32 ixgbe_write_analog_reg8(struct ixgbe_hw *hw, u32 reg, u8 val) ++{ ++ return ixgbe_call_func(hw, hw->mac.ops.write_analog_reg8, (hw, reg, ++ val), IXGBE_NOT_IMPLEMENTED); ++} ++ ++/** ++ * ixgbe_init_uta_tables - Initializes Unicast Table Arrays. ++ * @hw: pointer to hardware structure ++ * ++ * Initializes the Unicast Table Arrays to zero on device load. This ++ * is part of the Rx init addr execution path. ++ **/ ++s32 ixgbe_init_uta_tables(struct ixgbe_hw *hw) ++{ ++ return ixgbe_call_func(hw, hw->mac.ops.init_uta_tables, (hw), ++ IXGBE_NOT_IMPLEMENTED); ++} ++ ++/** ++ * ixgbe_read_i2c_byte - Reads 8 bit word over I2C at specified device address ++ * @hw: pointer to hardware structure ++ * @byte_offset: byte offset to read ++ * @data: value read ++ * ++ * Performs byte read operation to SFP module's EEPROM over I2C interface. ++ **/ ++s32 ixgbe_read_i2c_byte(struct ixgbe_hw *hw, u8 byte_offset, u8 dev_addr, ++ u8 *data) ++{ ++ return ixgbe_call_func(hw, hw->phy.ops.read_i2c_byte, (hw, byte_offset, ++ dev_addr, data), IXGBE_NOT_IMPLEMENTED); ++} ++ ++/** ++ * ixgbe_write_i2c_byte - Writes 8 bit word over I2C ++ * @hw: pointer to hardware structure ++ * @byte_offset: byte offset to write ++ * @data: value to write ++ * ++ * Performs byte write operation to SFP module's EEPROM over I2C interface ++ * at a specified device address. ++ **/ ++s32 ixgbe_write_i2c_byte(struct ixgbe_hw *hw, u8 byte_offset, u8 dev_addr, ++ u8 data) ++{ ++ return ixgbe_call_func(hw, hw->phy.ops.write_i2c_byte, (hw, byte_offset, ++ dev_addr, data), IXGBE_NOT_IMPLEMENTED); ++} ++ ++/** ++ * ixgbe_write_i2c_eeprom - Writes 8 bit EEPROM word over I2C interface ++ * @hw: pointer to hardware structure ++ * @byte_offset: EEPROM byte offset to write ++ * @eeprom_data: value to write ++ * ++ * Performs byte write operation to SFP module's EEPROM over I2C interface. ++ **/ ++s32 ixgbe_write_i2c_eeprom(struct ixgbe_hw *hw, ++ u8 byte_offset, u8 eeprom_data) ++{ ++ return ixgbe_call_func(hw, hw->phy.ops.write_i2c_eeprom, ++ (hw, byte_offset, eeprom_data), ++ IXGBE_NOT_IMPLEMENTED); ++} ++ ++/** ++ * ixgbe_read_i2c_eeprom - Reads 8 bit EEPROM word over I2C interface ++ * @hw: pointer to hardware structure ++ * @byte_offset: EEPROM byte offset to read ++ * @eeprom_data: value read ++ * ++ * Performs byte read operation to SFP module's EEPROM over I2C interface. ++ **/ ++s32 ixgbe_read_i2c_eeprom(struct ixgbe_hw *hw, u8 byte_offset, u8 *eeprom_data) ++{ ++ return ixgbe_call_func(hw, hw->phy.ops.read_i2c_eeprom, ++ (hw, byte_offset, eeprom_data), ++ IXGBE_NOT_IMPLEMENTED); ++} ++ ++/** ++ * ixgbe_get_supported_physical_layer - Returns physical layer type ++ * @hw: pointer to hardware structure ++ * ++ * Determines physical layer capabilities of the current configuration. ++ **/ ++u32 ixgbe_get_supported_physical_layer(struct ixgbe_hw *hw) ++{ ++ return ixgbe_call_func(hw, hw->mac.ops.get_supported_physical_layer, ++ (hw), IXGBE_PHYSICAL_LAYER_UNKNOWN); ++} ++ ++/** ++ * ixgbe_enable_rx_dma - Enables Rx DMA unit, dependant on device specifics ++ * @hw: pointer to hardware structure ++ * @regval: bitfield to write to the Rx DMA register ++ * ++ * Enables the Rx DMA unit of the device. ++ **/ ++s32 ixgbe_enable_rx_dma(struct ixgbe_hw *hw, u32 regval) ++{ ++ return ixgbe_call_func(hw, hw->mac.ops.enable_rx_dma, ++ (hw, regval), IXGBE_NOT_IMPLEMENTED); ++} ++ ++/** ++ * ixgbe_acquire_swfw_semaphore - Acquire SWFW semaphore ++ * @hw: pointer to hardware structure ++ * @mask: Mask to specify which semaphore to acquire ++ * ++ * Acquires the SWFW semaphore through SW_FW_SYNC register for the specified ++ * function (CSR, PHY0, PHY1, EEPROM, Flash) ++ **/ ++s32 ixgbe_acquire_swfw_semaphore(struct ixgbe_hw *hw, u16 mask) ++{ ++ return ixgbe_call_func(hw, hw->mac.ops.acquire_swfw_sync, ++ (hw, mask), IXGBE_NOT_IMPLEMENTED); ++} ++ ++/** ++ * ixgbe_release_swfw_semaphore - Release SWFW semaphore ++ * @hw: pointer to hardware structure ++ * @mask: Mask to specify which semaphore to release ++ * ++ * Releases the SWFW semaphore through SW_FW_SYNC register for the specified ++ * function (CSR, PHY0, PHY1, EEPROM, Flash) ++ **/ ++void ixgbe_release_swfw_semaphore(struct ixgbe_hw *hw, u16 mask) ++{ ++ if (hw->mac.ops.release_swfw_sync) ++ hw->mac.ops.release_swfw_sync(hw, mask); ++} ++ +diff -r 3e5bbd731d89 drivers/net/ixgbe/ixgbe_api.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/ixgbe/ixgbe_api.h Mon Jun 15 12:06:28 2009 +0100 +@@ -0,0 +1,162 @@ ++/******************************************************************************* ++ ++ Intel 10 Gigabit PCI Express Linux driver ++ Copyright(c) 1999 - 2009 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++#ifndef _IXGBE_API_H_ ++#define _IXGBE_API_H_ ++ ++#include "ixgbe_type.h" ++ ++s32 ixgbe_init_shared_code(struct ixgbe_hw *hw); ++ ++s32 ixgbe_set_mac_type(struct ixgbe_hw *hw); ++s32 ixgbe_init_hw(struct ixgbe_hw *hw); ++s32 ixgbe_reset_hw(struct ixgbe_hw *hw); ++s32 ixgbe_start_hw(struct ixgbe_hw *hw); ++s32 ixgbe_clear_hw_cntrs(struct ixgbe_hw *hw); ++enum ixgbe_media_type ixgbe_get_media_type(struct ixgbe_hw *hw); ++s32 ixgbe_get_mac_addr(struct ixgbe_hw *hw, u8 *mac_addr); ++s32 ixgbe_get_bus_info(struct ixgbe_hw *hw); ++u32 ixgbe_get_num_of_tx_queues(struct ixgbe_hw *hw); ++u32 ixgbe_get_num_of_rx_queues(struct ixgbe_hw *hw); ++s32 ixgbe_stop_adapter(struct ixgbe_hw *hw); ++s32 ixgbe_read_pba_num(struct ixgbe_hw *hw, u32 *pba_num); ++ ++s32 ixgbe_identify_phy(struct ixgbe_hw *hw); ++s32 ixgbe_reset_phy(struct ixgbe_hw *hw); ++s32 ixgbe_read_phy_reg(struct ixgbe_hw *hw, u32 reg_addr, u32 device_type, ++ u16 *phy_data); ++s32 ixgbe_write_phy_reg(struct ixgbe_hw *hw, u32 reg_addr, u32 device_type, ++ u16 phy_data); ++ ++s32 ixgbe_setup_phy_link(struct ixgbe_hw *hw); ++s32 ixgbe_check_phy_link(struct ixgbe_hw *hw, ++ ixgbe_link_speed *speed, ++ bool *link_up); ++s32 ixgbe_setup_phy_link_speed(struct ixgbe_hw *hw, ++ ixgbe_link_speed speed, ++ bool autoneg, ++ bool autoneg_wait_to_complete); ++s32 ixgbe_setup_link(struct ixgbe_hw *hw); ++s32 ixgbe_setup_link_speed(struct ixgbe_hw *hw, ixgbe_link_speed speed, ++ bool autoneg, bool autoneg_wait_to_complete); ++s32 ixgbe_check_link(struct ixgbe_hw *hw, ixgbe_link_speed *speed, ++ bool *link_up, bool link_up_wait_to_complete); ++s32 ixgbe_get_link_capabilities(struct ixgbe_hw *hw, ixgbe_link_speed *speed, ++ bool *autoneg); ++s32 ixgbe_led_on(struct ixgbe_hw *hw, u32 index); ++s32 ixgbe_led_off(struct ixgbe_hw *hw, u32 index); ++s32 ixgbe_blink_led_start(struct ixgbe_hw *hw, u32 index); ++s32 ixgbe_blink_led_stop(struct ixgbe_hw *hw, u32 index); ++ ++s32 ixgbe_init_eeprom_params(struct ixgbe_hw *hw); ++s32 ixgbe_write_eeprom(struct ixgbe_hw *hw, u16 offset, u16 data); ++s32 ixgbe_read_eeprom(struct ixgbe_hw *hw, u16 offset, u16 *data); ++s32 ixgbe_validate_eeprom_checksum(struct ixgbe_hw *hw, u16 *checksum_val); ++s32 ixgbe_update_eeprom_checksum(struct ixgbe_hw *hw); ++ ++s32 ixgbe_insert_mac_addr(struct ixgbe_hw *hw, u8 *addr, u32 vmdq); ++s32 ixgbe_set_rar(struct ixgbe_hw *hw, u32 index, u8 *addr, u32 vmdq, ++ u32 enable_addr); ++s32 ixgbe_clear_rar(struct ixgbe_hw *hw, u32 index); ++s32 ixgbe_set_vmdq(struct ixgbe_hw *hw, u32 rar, u32 vmdq); ++s32 ixgbe_clear_vmdq(struct ixgbe_hw *hw, u32 rar, u32 vmdq); ++s32 ixgbe_init_rx_addrs(struct ixgbe_hw *hw); ++u32 ixgbe_get_num_rx_addrs(struct ixgbe_hw *hw); ++s32 ixgbe_update_uc_addr_list(struct ixgbe_hw *hw, u8 *addr_list, ++ u32 addr_count, ixgbe_mc_addr_itr func); ++s32 ixgbe_update_mc_addr_list(struct ixgbe_hw *hw, u8 *mc_addr_list, ++ u32 mc_addr_count, ixgbe_mc_addr_itr func); ++s32 ixgbe_enable_mc(struct ixgbe_hw *hw); ++s32 ixgbe_disable_mc(struct ixgbe_hw *hw); ++s32 ixgbe_clear_vfta(struct ixgbe_hw *hw); ++s32 ixgbe_set_vfta(struct ixgbe_hw *hw, u32 vlan, ++ u32 vind, bool vlan_on); ++ ++s32 ixgbe_fc_enable(struct ixgbe_hw *hw, s32 packetbuf_num); ++ ++void ixgbe_set_mta(struct ixgbe_hw *hw, u8 *mc_addr); ++s32 ixgbe_get_phy_firmware_version(struct ixgbe_hw *hw, ++ u16 *firmware_version); ++s32 ixgbe_read_analog_reg8(struct ixgbe_hw *hw, u32 reg, u8 *val); ++s32 ixgbe_write_analog_reg8(struct ixgbe_hw *hw, u32 reg, u8 val); ++s32 ixgbe_init_uta_tables(struct ixgbe_hw *hw); ++s32 ixgbe_read_i2c_eeprom(struct ixgbe_hw *hw, u8 byte_offset, u8 *eeprom_data); ++u32 ixgbe_get_supported_physical_layer(struct ixgbe_hw *hw); ++s32 ixgbe_enable_rx_dma(struct ixgbe_hw *hw, u32 regval); ++s32 ixgbe_reinit_fdir_tables_82599(struct ixgbe_hw *hw); ++s32 ixgbe_init_fdir_signature_82599(struct ixgbe_hw *hw, u32 pballoc); ++s32 ixgbe_init_fdir_perfect_82599(struct ixgbe_hw *hw, u32 pballoc); ++s32 ixgbe_fdir_add_signature_filter_82599(struct ixgbe_hw *hw, ++ struct ixgbe_atr_input *input, ++ u8 queue); ++s32 ixgbe_fdir_add_perfect_filter_82599(struct ixgbe_hw *hw, ++ struct ixgbe_atr_input *input, ++ u16 soft_id, ++ u8 queue); ++u16 ixgbe_atr_compute_hash_82599(struct ixgbe_atr_input *input, u32 key); ++s32 ixgbe_atr_set_vlan_id_82599(struct ixgbe_atr_input *input, u16 vlan_id); ++s32 ixgbe_atr_set_src_ipv4_82599(struct ixgbe_atr_input *input, u32 src_addr); ++s32 ixgbe_atr_set_dst_ipv4_82599(struct ixgbe_atr_input *input, u32 dst_addr); ++s32 ixgbe_atr_set_src_ipv6_82599(struct ixgbe_atr_input *input, u32 src_addr_1, ++ u32 src_addr_2, u32 src_addr_3, ++ u32 src_addr_4); ++s32 ixgbe_atr_set_dst_ipv6_82599(struct ixgbe_atr_input *input, u32 dst_addr_1, ++ u32 dst_addr_2, u32 dst_addr_3, ++ u32 dst_addr_4); ++s32 ixgbe_atr_set_src_port_82599(struct ixgbe_atr_input *input, u16 src_port); ++s32 ixgbe_atr_set_dst_port_82599(struct ixgbe_atr_input *input, u16 dst_port); ++s32 ixgbe_atr_set_flex_byte_82599(struct ixgbe_atr_input *input, u16 flex_byte); ++s32 ixgbe_atr_set_vm_pool_82599(struct ixgbe_atr_input *input, u8 vm_pool); ++s32 ixgbe_atr_set_l4type_82599(struct ixgbe_atr_input *input, u8 l4type); ++s32 ixgbe_atr_get_vlan_id_82599(struct ixgbe_atr_input *input, u16 *vlan_id); ++s32 ixgbe_atr_get_src_ipv4_82599(struct ixgbe_atr_input *input, u32 *src_addr); ++s32 ixgbe_atr_get_dst_ipv4_82599(struct ixgbe_atr_input *input, u32 *dst_addr); ++s32 ixgbe_atr_get_src_ipv6_82599(struct ixgbe_atr_input *input, u32 *src_addr_1, ++ u32 *src_addr_2, u32 *src_addr_3, ++ u32 *src_addr_4); ++s32 ixgbe_atr_get_dst_ipv6_82599(struct ixgbe_atr_input *input, u32 *dst_addr_1, ++ u32 *dst_addr_2, u32 *dst_addr_3, ++ u32 *dst_addr_4); ++s32 ixgbe_atr_get_src_port_82599(struct ixgbe_atr_input *input, u16 *src_port); ++s32 ixgbe_atr_get_dst_port_82599(struct ixgbe_atr_input *input, u16 *dst_port); ++s32 ixgbe_atr_get_flex_byte_82599(struct ixgbe_atr_input *input, ++ u16 *flex_byte); ++s32 ixgbe_atr_get_vm_pool_82599(struct ixgbe_atr_input *input, u8 *vm_pool); ++s32 ixgbe_atr_get_l4type_82599(struct ixgbe_atr_input *input, u8 *l4type); ++s32 ixgbe_read_i2c_byte(struct ixgbe_hw *hw, u8 byte_offset, u8 dev_addr, ++ u8 *data); ++s32 ixgbe_write_i2c_byte(struct ixgbe_hw *hw, u8 byte_offset, u8 dev_addr, ++ u8 data); ++s32 ixgbe_write_i2c_eeprom(struct ixgbe_hw *hw, u8 byte_offset, u8 eeprom_data); ++s32 ixgbe_get_san_mac_addr(struct ixgbe_hw *hw, u8 *san_mac_addr); ++s32 ixgbe_set_san_mac_addr(struct ixgbe_hw *hw, u8 *san_mac_addr); ++s32 ixgbe_get_device_caps(struct ixgbe_hw *hw, u16 *device_caps); ++s32 ixgbe_acquire_swfw_semaphore(struct ixgbe_hw *hw, u16 mask); ++void ixgbe_release_swfw_semaphore(struct ixgbe_hw *hw, u16 mask); ++ ++ ++#endif /* _IXGBE_API_H_ */ +diff -r 3e5bbd731d89 drivers/net/ixgbe/ixgbe_common.c +--- a/drivers/net/ixgbe/ixgbe_common.c Mon Jun 15 12:00:22 2009 +0100 ++++ b/drivers/net/ixgbe/ixgbe_common.c Mon Jun 15 12:06:28 2009 +0100 +@@ -1,7 +1,7 @@ + /******************************************************************************* + + Intel 10 Gigabit PCI Express Linux driver +- Copyright(c) 1999 - 2008 Intel Corporation. ++ Copyright(c) 1999 - 2009 Intel Corporation. + + This program is free software; you can redistribute it and/or modify it + under the terms and conditions of the GNU General Public License, +@@ -25,12 +25,8 @@ + + *******************************************************************************/ + +-#include +-#include +-#include +- + #include "ixgbe_common.h" +-#include "ixgbe_phy.h" ++#include "ixgbe_api.h" + + static s32 ixgbe_poll_eeprom_eerd_done(struct ixgbe_hw *hw); + static s32 ixgbe_acquire_eeprom(struct ixgbe_hw *hw); +@@ -46,11 +42,79 @@ + static void ixgbe_release_eeprom(struct ixgbe_hw *hw); + static u16 ixgbe_calc_eeprom_checksum(struct ixgbe_hw *hw); + +-static void ixgbe_enable_rar(struct ixgbe_hw *hw, u32 index); +-static void ixgbe_disable_rar(struct ixgbe_hw *hw, u32 index); + static s32 ixgbe_mta_vector(struct ixgbe_hw *hw, u8 *mc_addr); +-static void ixgbe_add_mc_addr(struct ixgbe_hw *hw, u8 *mc_addr); +-static void ixgbe_add_uc_addr(struct ixgbe_hw *hw, u8 *addr, u32 vmdq); ++ ++/** ++ * ixgbe_init_ops_generic - Inits function ptrs ++ * @hw: pointer to the hardware structure ++ * ++ * Initialize the function pointers. ++ **/ ++s32 ixgbe_init_ops_generic(struct ixgbe_hw *hw) ++{ ++ struct ixgbe_eeprom_info *eeprom = &hw->eeprom; ++ struct ixgbe_mac_info *mac = &hw->mac; ++ u32 eec = IXGBE_READ_REG(hw, IXGBE_EEC); ++ ++ /* EEPROM */ ++ eeprom->ops.init_params = &ixgbe_init_eeprom_params_generic; ++ /* If EEPROM is valid (bit 8 = 1), use EERD otherwise use bit bang */ ++ if (eec & (1 << 8)) ++ eeprom->ops.read = &ixgbe_read_eeprom_generic; ++ else ++ eeprom->ops.read = &ixgbe_read_eeprom_bit_bang_generic; ++ eeprom->ops.write = &ixgbe_write_eeprom_generic; ++ eeprom->ops.validate_checksum = ++ &ixgbe_validate_eeprom_checksum_generic; ++ eeprom->ops.update_checksum = &ixgbe_update_eeprom_checksum_generic; ++ ++ /* MAC */ ++ mac->ops.init_hw = &ixgbe_init_hw_generic; ++ mac->ops.reset_hw = NULL; ++ mac->ops.start_hw = &ixgbe_start_hw_generic; ++ mac->ops.clear_hw_cntrs = &ixgbe_clear_hw_cntrs_generic; ++ mac->ops.get_media_type = NULL; ++ mac->ops.get_supported_physical_layer = NULL; ++ mac->ops.enable_rx_dma = &ixgbe_enable_rx_dma_generic; ++ mac->ops.get_mac_addr = &ixgbe_get_mac_addr_generic; ++ mac->ops.stop_adapter = &ixgbe_stop_adapter_generic; ++ mac->ops.get_bus_info = &ixgbe_get_bus_info_generic; ++ mac->ops.set_lan_id = &ixgbe_set_lan_id_multi_port_pcie; ++ mac->ops.acquire_swfw_sync = &ixgbe_acquire_swfw_sync; ++ mac->ops.release_swfw_sync = &ixgbe_release_swfw_sync; ++ ++ /* LEDs */ ++ mac->ops.led_on = &ixgbe_led_on_generic; ++ mac->ops.led_off = &ixgbe_led_off_generic; ++ mac->ops.blink_led_start = &ixgbe_blink_led_start_generic; ++ mac->ops.blink_led_stop = &ixgbe_blink_led_stop_generic; ++ ++ /* RAR, Multicast, VLAN */ ++ mac->ops.set_rar = &ixgbe_set_rar_generic; ++ mac->ops.clear_rar = &ixgbe_clear_rar_generic; ++ mac->ops.insert_mac_addr = NULL; ++ mac->ops.set_vmdq = NULL; ++ mac->ops.clear_vmdq = NULL; ++ mac->ops.init_rx_addrs = &ixgbe_init_rx_addrs_generic; ++ mac->ops.update_uc_addr_list = &ixgbe_update_uc_addr_list_generic; ++ mac->ops.update_mc_addr_list = &ixgbe_update_mc_addr_list_generic; ++ mac->ops.enable_mc = &ixgbe_enable_mc_generic; ++ mac->ops.disable_mc = &ixgbe_disable_mc_generic; ++ mac->ops.clear_vfta = NULL; ++ mac->ops.set_vfta = NULL; ++ mac->ops.init_uta_tables = NULL; ++ ++ /* Flow Control */ ++ mac->ops.fc_enable = &ixgbe_fc_enable_generic; ++ ++ /* Link */ ++ mac->ops.get_link_capabilities = NULL; ++ mac->ops.setup_link = NULL; ++ mac->ops.setup_link_speed = NULL; ++ mac->ops.check_link = NULL; ++ ++ return 0; ++} + + /** + * ixgbe_start_hw_generic - Prepare hardware for Tx/Rx +@@ -64,24 +128,15 @@ + s32 ixgbe_start_hw_generic(struct ixgbe_hw *hw) + { + u32 ctrl_ext; ++ s32 ret_val = 0; + + /* Set the media type */ + hw->phy.media_type = hw->mac.ops.get_media_type(hw); + +- /* Identify the PHY */ +- hw->phy.ops.identify(hw); +- +- /* +- * Store MAC address from RAR0, clear receive address registers, and +- * clear the multicast table +- */ +- hw->mac.ops.init_rx_addrs(hw); ++ /* PHY ops initialization must be done in reset_hw() */ + + /* Clear the VLAN filter table */ + hw->mac.ops.clear_vfta(hw); +- +- /* Set up link */ +- hw->mac.ops.setup_link(hw); + + /* Clear statistics registers */ + hw->mac.ops.clear_hw_cntrs(hw); +@@ -92,10 +147,13 @@ + IXGBE_WRITE_REG(hw, IXGBE_CTRL_EXT, ctrl_ext); + IXGBE_WRITE_FLUSH(hw); + ++ /* Setup flow control */ ++ ixgbe_setup_fc(hw, 0); ++ + /* Clear adapter stopped flag */ + hw->adapter_stopped = false; + +- return 0; ++ return ret_val; + } + + /** +@@ -110,13 +168,17 @@ + **/ + s32 ixgbe_init_hw_generic(struct ixgbe_hw *hw) + { ++ s32 status = 0; ++ + /* Reset the hardware */ +- hw->mac.ops.reset_hw(hw); ++ status = hw->mac.ops.reset_hw(hw); + +- /* Start the HW */ +- hw->mac.ops.start_hw(hw); ++ if (status == 0) { ++ /* Start the HW */ ++ status = hw->mac.ops.start_hw(hw); ++ } + +- return 0; ++ return status; + } + + /** +@@ -141,17 +203,29 @@ + IXGBE_READ_REG(hw, IXGBE_MRFC); + IXGBE_READ_REG(hw, IXGBE_RLEC); + IXGBE_READ_REG(hw, IXGBE_LXONTXC); +- IXGBE_READ_REG(hw, IXGBE_LXONRXC); + IXGBE_READ_REG(hw, IXGBE_LXOFFTXC); +- IXGBE_READ_REG(hw, IXGBE_LXOFFRXC); ++ if (hw->mac.type >= ixgbe_mac_82599EB) { ++ IXGBE_READ_REG(hw, IXGBE_LXONRXCNT); ++ IXGBE_READ_REG(hw, IXGBE_LXOFFRXCNT); ++ } else { ++ IXGBE_READ_REG(hw, IXGBE_LXONRXC); ++ IXGBE_READ_REG(hw, IXGBE_LXOFFRXC); ++ } + + for (i = 0; i < 8; i++) { + IXGBE_READ_REG(hw, IXGBE_PXONTXC(i)); +- IXGBE_READ_REG(hw, IXGBE_PXONRXC(i)); + IXGBE_READ_REG(hw, IXGBE_PXOFFTXC(i)); +- IXGBE_READ_REG(hw, IXGBE_PXOFFRXC(i)); ++ if (hw->mac.type >= ixgbe_mac_82599EB) { ++ IXGBE_READ_REG(hw, IXGBE_PXONRXCNT(i)); ++ IXGBE_READ_REG(hw, IXGBE_PXOFFRXCNT(i)); ++ } else { ++ IXGBE_READ_REG(hw, IXGBE_PXONRXC(i)); ++ IXGBE_READ_REG(hw, IXGBE_PXOFFRXC(i)); ++ } + } +- ++ if (hw->mac.type >= ixgbe_mac_82599EB) ++ for (i = 0; i < 8; i++) ++ IXGBE_READ_REG(hw, IXGBE_PXON2OFFCNT(i)); + IXGBE_READ_REG(hw, IXGBE_PRC64); + IXGBE_READ_REG(hw, IXGBE_PRC127); + IXGBE_READ_REG(hw, IXGBE_PRC255); +@@ -251,6 +325,79 @@ + mac_addr[i+4] = (u8)(rar_high >> (i*8)); + + return 0; ++} ++ ++/** ++ * ixgbe_get_bus_info_generic - Generic set PCI bus info ++ * @hw: pointer to hardware structure ++ * ++ * Sets the PCI bus info (speed, width, type) within the ixgbe_hw structure ++ **/ ++s32 ixgbe_get_bus_info_generic(struct ixgbe_hw *hw) ++{ ++ struct ixgbe_mac_info *mac = &hw->mac; ++ u16 link_status; ++ ++ hw->bus.type = ixgbe_bus_type_pci_express; ++ ++ /* Get the negotiated link width and speed from PCI config space */ ++ link_status = IXGBE_READ_PCIE_WORD(hw, IXGBE_PCI_LINK_STATUS); ++ ++ switch (link_status & IXGBE_PCI_LINK_WIDTH) { ++ case IXGBE_PCI_LINK_WIDTH_1: ++ hw->bus.width = ixgbe_bus_width_pcie_x1; ++ break; ++ case IXGBE_PCI_LINK_WIDTH_2: ++ hw->bus.width = ixgbe_bus_width_pcie_x2; ++ break; ++ case IXGBE_PCI_LINK_WIDTH_4: ++ hw->bus.width = ixgbe_bus_width_pcie_x4; ++ break; ++ case IXGBE_PCI_LINK_WIDTH_8: ++ hw->bus.width = ixgbe_bus_width_pcie_x8; ++ break; ++ default: ++ hw->bus.width = ixgbe_bus_width_unknown; ++ break; ++ } ++ ++ switch (link_status & IXGBE_PCI_LINK_SPEED) { ++ case IXGBE_PCI_LINK_SPEED_2500: ++ hw->bus.speed = ixgbe_bus_speed_2500; ++ break; ++ case IXGBE_PCI_LINK_SPEED_5000: ++ hw->bus.speed = ixgbe_bus_speed_5000; ++ break; ++ default: ++ hw->bus.speed = ixgbe_bus_speed_unknown; ++ break; ++ } ++ ++ mac->ops.set_lan_id(hw); ++ ++ return 0; ++} ++ ++/** ++ * ixgbe_set_lan_id_multi_port_pcie - Set LAN id for PCIe multiple port devices ++ * @hw: pointer to the HW structure ++ * ++ * Determines the LAN function id by reading memory-mapped registers ++ * and swaps the port value if requested. ++ **/ ++void ixgbe_set_lan_id_multi_port_pcie(struct ixgbe_hw *hw) ++{ ++ struct ixgbe_bus_info *bus = &hw->bus; ++ u32 reg; ++ ++ reg = IXGBE_READ_REG(hw, IXGBE_STATUS); ++ bus->func = (reg & IXGBE_STATUS_LAN_ID) >> IXGBE_STATUS_LAN_ID_SHIFT; ++ bus->lan_id = bus->func; ++ ++ /* check for a port swap */ ++ reg = IXGBE_READ_REG(hw, IXGBE_FACTPS); ++ if (reg & IXGBE_FACTPS_LFS) ++ bus->func ^= 0x1; + } + + /** +@@ -375,9 +522,9 @@ + * change if a future EEPROM is not SPI. + */ + eeprom_size = (u16)((eec & IXGBE_EEC_SIZE) >> +- IXGBE_EEC_SIZE_SHIFT); ++ IXGBE_EEC_SIZE_SHIFT); + eeprom->word_size = 1 << (eeprom_size + +- IXGBE_EEPROM_WORD_SIZE_SHIFT); ++ IXGBE_EEPROM_WORD_SIZE_SHIFT); + } + + if (eec & IXGBE_EEC_ADDR_SIZE) +@@ -385,11 +532,77 @@ + else + eeprom->address_bits = 8; + hw_dbg(hw, "Eeprom params: type = %d, size = %d, address bits: " +- "%d\n", eeprom->type, eeprom->word_size, +- eeprom->address_bits); ++ "%d\n", eeprom->type, eeprom->word_size, ++ eeprom->address_bits); + } + + return 0; ++} ++ ++/** ++ * ixgbe_write_eeprom_generic - Writes 16 bit value to EEPROM ++ * @hw: pointer to hardware structure ++ * @offset: offset within the EEPROM to be written to ++ * @data: 16 bit word to be written to the EEPROM ++ * ++ * If ixgbe_eeprom_update_checksum is not called after this function, the ++ * EEPROM will most likely contain an invalid checksum. ++ **/ ++s32 ixgbe_write_eeprom_generic(struct ixgbe_hw *hw, u16 offset, u16 data) ++{ ++ s32 status; ++ u8 write_opcode = IXGBE_EEPROM_WRITE_OPCODE_SPI; ++ ++ hw->eeprom.ops.init_params(hw); ++ ++ if (offset >= hw->eeprom.word_size) { ++ status = IXGBE_ERR_EEPROM; ++ goto out; ++ } ++ ++ /* Prepare the EEPROM for writing */ ++ status = ixgbe_acquire_eeprom(hw); ++ ++ if (status == 0) { ++ if (ixgbe_ready_eeprom(hw) != 0) { ++ ixgbe_release_eeprom(hw); ++ status = IXGBE_ERR_EEPROM; ++ } ++ } ++ ++ if (status == 0) { ++ ixgbe_standby_eeprom(hw); ++ ++ /* Send the WRITE ENABLE command (8 bit opcode ) */ ++ ixgbe_shift_out_eeprom_bits(hw, IXGBE_EEPROM_WREN_OPCODE_SPI, ++ IXGBE_EEPROM_OPCODE_BITS); ++ ++ ixgbe_standby_eeprom(hw); ++ ++ /* ++ * Some SPI eeproms use the 8th address bit embedded in the ++ * opcode ++ */ ++ if ((hw->eeprom.address_bits == 8) && (offset >= 128)) ++ write_opcode |= IXGBE_EEPROM_A8_OPCODE_SPI; ++ ++ /* Send the Write command (8-bit opcode + addr) */ ++ ixgbe_shift_out_eeprom_bits(hw, write_opcode, ++ IXGBE_EEPROM_OPCODE_BITS); ++ ixgbe_shift_out_eeprom_bits(hw, (u16)(offset*2), ++ hw->eeprom.address_bits); ++ ++ /* Send the data */ ++ data = (data >> 8) | (data << 8); ++ ixgbe_shift_out_eeprom_bits(hw, data, 16); ++ ixgbe_standby_eeprom(hw); ++ ++ /* Done with writing - release the EEPROM */ ++ ixgbe_release_eeprom(hw); ++ } ++ ++out: ++ return status; + } + + /** +@@ -572,12 +785,9 @@ + static s32 ixgbe_get_eeprom_semaphore(struct ixgbe_hw *hw) + { + s32 status = IXGBE_ERR_EEPROM; +- u32 timeout; ++ u32 timeout = 2000; + u32 i; + u32 swsm; +- +- /* Set timeout value based on size of EEPROM */ +- timeout = hw->eeprom.word_size + 1; + + /* Get SMBI software semaphore between device drivers first */ + for (i = 0; i < timeout; i++) { +@@ -590,7 +800,7 @@ + status = 0; + break; + } +- msleep(1); ++ udelay(50); + } + + /* Now get the semaphore between SW/FW through the SWESMBI bit */ +@@ -618,11 +828,14 @@ + * was not granted because we don't have access to the EEPROM + */ + if (i >= timeout) { +- hw_dbg(hw, "Driver can't access the Eeprom - Semaphore " +- "not granted.\n"); ++ hw_dbg(hw, "SWESMBI Software EEPROM semaphore " ++ "not granted.\n"); + ixgbe_release_eeprom_semaphore(hw); + status = IXGBE_ERR_EEPROM; + } ++ } else { ++ hw_dbg(hw, "Software semaphore SMBI between device drivers " ++ "not granted.\n"); + } + + return status; +@@ -855,6 +1068,9 @@ + IXGBE_WRITE_REG(hw, IXGBE_EEC, eec); + + ixgbe_release_swfw_sync(hw, IXGBE_GSSR_EEP_SM); ++ ++ /* Delay before attempt to obtain semaphore again to allow FW access */ ++ msleep(hw->eeprom.semaphore_delay); + } + + /** +@@ -964,7 +1180,7 @@ + if (status == 0) { + checksum = ixgbe_calc_eeprom_checksum(hw); + status = hw->eeprom.ops.write(hw, IXGBE_EEPROM_CHECKSUM, +- checksum); ++ checksum); + } else { + hw_dbg(hw, "EEPROM read failed\n"); + } +@@ -983,16 +1199,19 @@ + s32 status = 0; + + /* Make sure it is not a multicast address */ +- if (IXGBE_IS_MULTICAST(mac_addr)) ++ if (IXGBE_IS_MULTICAST(mac_addr)) { ++ hw_dbg(hw, "MAC address is multicast\n"); + status = IXGBE_ERR_INVALID_MAC_ADDR; + /* Not a broadcast address */ +- else if (IXGBE_IS_BROADCAST(mac_addr)) ++ } else if (IXGBE_IS_BROADCAST(mac_addr)) { ++ hw_dbg(hw, "MAC address is broadcast\n"); + status = IXGBE_ERR_INVALID_MAC_ADDR; + /* Reject the zero address */ +- else if (mac_addr[0] == 0 && mac_addr[1] == 0 && mac_addr[2] == 0 && +- mac_addr[3] == 0 && mac_addr[4] == 0 && mac_addr[5] == 0) ++ } else if (mac_addr[0] == 0 && mac_addr[1] == 0 && mac_addr[2] == 0 && ++ mac_addr[3] == 0 && mac_addr[4] == 0 && mac_addr[5] == 0) { ++ hw_dbg(hw, "MAC address is all zeros\n"); + status = IXGBE_ERR_INVALID_MAC_ADDR; +- ++ } + return status; + } + +@@ -1081,38 +1300,6 @@ + } + + /** +- * ixgbe_enable_rar - Enable Rx address register +- * @hw: pointer to hardware structure +- * @index: index into the RAR table +- * +- * Enables the select receive address register. +- **/ +-static void ixgbe_enable_rar(struct ixgbe_hw *hw, u32 index) +-{ +- u32 rar_high; +- +- rar_high = IXGBE_READ_REG(hw, IXGBE_RAH(index)); +- rar_high |= IXGBE_RAH_AV; +- IXGBE_WRITE_REG(hw, IXGBE_RAH(index), rar_high); +-} +- +-/** +- * ixgbe_disable_rar - Disable Rx address register +- * @hw: pointer to hardware structure +- * @index: index into the RAR table +- * +- * Disables the select receive address register. +- **/ +-static void ixgbe_disable_rar(struct ixgbe_hw *hw, u32 index) +-{ +- u32 rar_high; +- +- rar_high = IXGBE_READ_REG(hw, IXGBE_RAH(index)); +- rar_high &= (~IXGBE_RAH_AV); +- IXGBE_WRITE_REG(hw, IXGBE_RAH(index), rar_high); +-} +- +-/** + * ixgbe_init_rx_addrs_generic - Initializes receive address filters. + * @hw: pointer to hardware structure + * +@@ -1136,18 +1323,18 @@ + hw->mac.ops.get_mac_addr(hw, hw->mac.addr); + + hw_dbg(hw, " Keeping Current RAR0 Addr =%.2X %.2X %.2X ", +- hw->mac.addr[0], hw->mac.addr[1], +- hw->mac.addr[2]); ++ hw->mac.addr[0], hw->mac.addr[1], ++ hw->mac.addr[2]); + hw_dbg(hw, "%.2X %.2X %.2X\n", hw->mac.addr[3], +- hw->mac.addr[4], hw->mac.addr[5]); ++ hw->mac.addr[4], hw->mac.addr[5]); + } else { + /* Setup the receive address. */ + hw_dbg(hw, "Overriding MAC Address in RAR[0]\n"); + hw_dbg(hw, " New MAC Addr =%.2X %.2X %.2X ", +- hw->mac.addr[0], hw->mac.addr[1], +- hw->mac.addr[2]); ++ hw->mac.addr[0], hw->mac.addr[1], ++ hw->mac.addr[2]); + hw_dbg(hw, "%.2X %.2X %.2X\n", hw->mac.addr[3], +- hw->mac.addr[4], hw->mac.addr[5]); ++ hw->mac.addr[4], hw->mac.addr[5]); + + hw->mac.ops.set_rar(hw, 0, hw->mac.addr, 0, IXGBE_RAH_AV); + } +@@ -1163,7 +1350,6 @@ + } + + /* Clear the MTA */ +- hw->addr_ctrl.mc_addr_in_rar_count = 0; + hw->addr_ctrl.mta_in_use = 0; + IXGBE_WRITE_REG(hw, IXGBE_MCSTCTRL, hw->mac.mc_filter_type); + +@@ -1171,8 +1357,7 @@ + for (i = 0; i < hw->mac.mcft_size; i++) + IXGBE_WRITE_REG(hw, IXGBE_MTA(i), 0); + +- if (hw->mac.ops.init_uta_tables) +- hw->mac.ops.init_uta_tables(hw); ++ ixgbe_init_uta_tables(hw); + + return 0; + } +@@ -1184,7 +1369,7 @@ + * + * Adds it to unused receive address register or goes into promiscuous mode. + **/ +-static void ixgbe_add_uc_addr(struct ixgbe_hw *hw, u8 *addr, u32 vmdq) ++void ixgbe_add_uc_addr(struct ixgbe_hw *hw, u8 *addr, u32 vmdq) + { + u32 rar_entries = hw->mac.num_rar_entries; + u32 rar; +@@ -1197,8 +1382,7 @@ + * else put the controller into promiscuous mode + */ + if (hw->addr_ctrl.rar_used_count < rar_entries) { +- rar = hw->addr_ctrl.rar_used_count - +- hw->addr_ctrl.mc_addr_in_rar_count; ++ rar = hw->addr_ctrl.rar_used_count; + hw->mac.ops.set_rar(hw, rar, addr, vmdq, IXGBE_RAH_AV); + hw_dbg(hw, "Added a secondary address to RAR[%d]\n", rar); + hw->addr_ctrl.rar_used_count++; +@@ -1224,7 +1408,7 @@ + * manually putting the device into promiscuous mode. + **/ + s32 ixgbe_update_uc_addr_list_generic(struct ixgbe_hw *hw, u8 *addr_list, +- u32 addr_count, ixgbe_mc_addr_itr next) ++ u32 addr_count, ixgbe_mc_addr_itr next) + { + u8 *addr; + u32 i; +@@ -1237,14 +1421,13 @@ + * Clear accounting of old secondary address list, + * don't count RAR[0] + */ +- uc_addr_in_use = hw->addr_ctrl.rar_used_count - +- hw->addr_ctrl.mc_addr_in_rar_count - 1; ++ uc_addr_in_use = hw->addr_ctrl.rar_used_count - 1; + hw->addr_ctrl.rar_used_count -= uc_addr_in_use; + hw->addr_ctrl.overflow_promisc = 0; + + /* Zero out the other receive addresses */ +- hw_dbg(hw, "Clearing RAR[1-%d]\n", uc_addr_in_use); +- for (i = 1; i <= uc_addr_in_use; i++) { ++ hw_dbg(hw, "Clearing RAR[1-%d]\n", hw->addr_ctrl.rar_used_count); ++ for (i = 1; i <= hw->addr_ctrl.rar_used_count; i++) { + IXGBE_WRITE_REG(hw, IXGBE_RAL(i), 0); + IXGBE_WRITE_REG(hw, IXGBE_RAH(i), 0); + } +@@ -1324,7 +1507,7 @@ + * + * Sets the bit-vector in the multicast table. + **/ +-static void ixgbe_set_mta(struct ixgbe_hw *hw, u8 *mc_addr) ++void ixgbe_set_mta(struct ixgbe_hw *hw, u8 *mc_addr) + { + u32 vector; + u32 vector_bit; +@@ -1353,40 +1536,6 @@ + } + + /** +- * ixgbe_add_mc_addr - Adds a multicast address. +- * @hw: pointer to hardware structure +- * @mc_addr: new multicast address +- * +- * Adds it to unused receive address register or to the multicast table. +- **/ +-static void ixgbe_add_mc_addr(struct ixgbe_hw *hw, u8 *mc_addr) +-{ +- u32 rar_entries = hw->mac.num_rar_entries; +- u32 rar; +- +- hw_dbg(hw, " MC Addr =%.2X %.2X %.2X %.2X %.2X %.2X\n", +- mc_addr[0], mc_addr[1], mc_addr[2], +- mc_addr[3], mc_addr[4], mc_addr[5]); +- +- /* +- * Place this multicast address in the RAR if there is room, +- * else put it in the MTA +- */ +- if (hw->addr_ctrl.rar_used_count < rar_entries) { +- /* use RAR from the end up for multicast */ +- rar = rar_entries - hw->addr_ctrl.mc_addr_in_rar_count - 1; +- hw->mac.ops.set_rar(hw, rar, mc_addr, 0, IXGBE_RAH_AV); +- hw_dbg(hw, "Added a multicast address to RAR[%d]\n", rar); +- hw->addr_ctrl.rar_used_count++; +- hw->addr_ctrl.mc_addr_in_rar_count++; +- } else { +- ixgbe_set_mta(hw, mc_addr); +- } +- +- hw_dbg(hw, "ixgbe_add_mc_addr Complete\n"); +-} +- +-/** + * ixgbe_update_mc_addr_list_generic - Updates MAC list of multicast addresses + * @hw: pointer to hardware structure + * @mc_addr_list: the list of new multicast addresses +@@ -1402,7 +1551,6 @@ + u32 mc_addr_count, ixgbe_mc_addr_itr next) + { + u32 i; +- u32 rar_entries = hw->mac.num_rar_entries; + u32 vmdq; + + /* +@@ -1410,17 +1558,7 @@ + * use. + */ + hw->addr_ctrl.num_mc_addrs = mc_addr_count; +- hw->addr_ctrl.rar_used_count -= hw->addr_ctrl.mc_addr_in_rar_count; +- hw->addr_ctrl.mc_addr_in_rar_count = 0; + hw->addr_ctrl.mta_in_use = 0; +- +- /* Zero out the other receive addresses. */ +- hw_dbg(hw, "Clearing RAR[%d-%d]\n", hw->addr_ctrl.rar_used_count, +- rar_entries - 1); +- for (i = hw->addr_ctrl.rar_used_count; i < rar_entries; i++) { +- IXGBE_WRITE_REG(hw, IXGBE_RAL(i), 0); +- IXGBE_WRITE_REG(hw, IXGBE_RAH(i), 0); +- } + + /* Clear the MTA */ + hw_dbg(hw, " Clearing MTA\n"); +@@ -1430,7 +1568,7 @@ + /* Add the new addresses */ + for (i = 0; i < mc_addr_count; i++) { + hw_dbg(hw, " Adding the multicast addresses:\n"); +- ixgbe_add_mc_addr(hw, next(hw, &mc_addr_list, &vmdq)); ++ ixgbe_set_mta(hw, next(hw, &mc_addr_list, &vmdq)); + } + + /* Enable mta */ +@@ -1450,14 +1588,7 @@ + **/ + s32 ixgbe_enable_mc_generic(struct ixgbe_hw *hw) + { +- u32 i; +- u32 rar_entries = hw->mac.num_rar_entries; + struct ixgbe_addr_filter_info *a = &hw->addr_ctrl; +- +- if (a->mc_addr_in_rar_count > 0) +- for (i = (rar_entries - a->mc_addr_in_rar_count); +- i < rar_entries; i++) +- ixgbe_enable_rar(hw, i); + + if (a->mta_in_use > 0) + IXGBE_WRITE_REG(hw, IXGBE_MCSTCTRL, IXGBE_MCSTCTRL_MFE | +@@ -1474,19 +1605,368 @@ + **/ + s32 ixgbe_disable_mc_generic(struct ixgbe_hw *hw) + { +- u32 i; +- u32 rar_entries = hw->mac.num_rar_entries; + struct ixgbe_addr_filter_info *a = &hw->addr_ctrl; +- +- if (a->mc_addr_in_rar_count > 0) +- for (i = (rar_entries - a->mc_addr_in_rar_count); +- i < rar_entries; i++) +- ixgbe_disable_rar(hw, i); + + if (a->mta_in_use > 0) + IXGBE_WRITE_REG(hw, IXGBE_MCSTCTRL, hw->mac.mc_filter_type); + + return 0; ++} ++ ++/** ++ * ixgbe_fc_enable_generic - Enable flow control ++ * @hw: pointer to hardware structure ++ * @packetbuf_num: packet buffer number (0-7) ++ * ++ * Enable flow control according to the current settings. ++ **/ ++s32 ixgbe_fc_enable_generic(struct ixgbe_hw *hw, s32 packetbuf_num) ++{ ++ s32 ret_val = 0; ++ u32 mflcn_reg, fccfg_reg; ++ u32 reg; ++ u32 rx_pba_size; ++ ++#ifdef CONFIG_DCB ++ if (hw->fc.requested_mode == ixgbe_fc_pfc) ++ goto out; ++ ++#endif /* CONFIG_DCB */ ++ /* Negotiate the fc mode to use */ ++ ret_val = ixgbe_fc_autoneg(hw); ++ if (ret_val) ++ goto out; ++ ++ /* Disable any previous flow control settings */ ++ mflcn_reg = IXGBE_READ_REG(hw, IXGBE_MFLCN); ++ mflcn_reg &= ~(IXGBE_MFLCN_RFCE | IXGBE_MFLCN_RPFCE); ++ ++ fccfg_reg = IXGBE_READ_REG(hw, IXGBE_FCCFG); ++ fccfg_reg &= ~(IXGBE_FCCFG_TFCE_802_3X | IXGBE_FCCFG_TFCE_PRIORITY); ++ ++ /* ++ * The possible values of fc.current_mode are: ++ * 0: Flow control is completely disabled ++ * 1: Rx flow control is enabled (we can receive pause frames, ++ * but not send pause frames). ++ * 2: Tx flow control is enabled (we can send pause frames but ++ * we do not support receiving pause frames). ++ * 3: Both Rx and Tx flow control (symmetric) are enabled. ++#ifdef CONFIG_DCB ++ * 4: Priority Flow Control is enabled. ++#endif ++ * other: Invalid. ++ */ ++ switch (hw->fc.current_mode) { ++ case ixgbe_fc_none: ++ /* Flow control is disabled by software override or autoneg. ++ * The code below will actually disable it in the HW. ++ */ ++ break; ++ case ixgbe_fc_rx_pause: ++ /* ++ * Rx Flow control is enabled and Tx Flow control is ++ * disabled by software override. Since there really ++ * isn't a way to advertise that we are capable of RX ++ * Pause ONLY, we will advertise that we support both ++ * symmetric and asymmetric Rx PAUSE. Later, we will ++ * disable the adapter's ability to send PAUSE frames. ++ */ ++ mflcn_reg |= IXGBE_MFLCN_RFCE; ++ break; ++ case ixgbe_fc_tx_pause: ++ /* ++ * Tx Flow control is enabled, and Rx Flow control is ++ * disabled by software override. ++ */ ++ fccfg_reg |= IXGBE_FCCFG_TFCE_802_3X; ++ break; ++ case ixgbe_fc_full: ++ /* Flow control (both Rx and Tx) is enabled by SW override. */ ++ mflcn_reg |= IXGBE_MFLCN_RFCE; ++ fccfg_reg |= IXGBE_FCCFG_TFCE_802_3X; ++ break; ++#ifdef CONFIG_DCB ++ case ixgbe_fc_pfc: ++ goto out; ++ break; ++#endif /* CONFIG_DCB */ ++ default: ++ hw_dbg(hw, "Flow control param set incorrectly\n"); ++ ret_val = -IXGBE_ERR_CONFIG; ++ goto out; ++ break; ++ } ++ ++ /* Set 802.3x based flow control settings. */ ++ mflcn_reg |= IXGBE_MFLCN_DPF; ++ IXGBE_WRITE_REG(hw, IXGBE_MFLCN, mflcn_reg); ++ IXGBE_WRITE_REG(hw, IXGBE_FCCFG, fccfg_reg); ++ ++ reg = IXGBE_READ_REG(hw, IXGBE_MTQC); ++ /* Thresholds are different for link flow control when in DCB mode */ ++ if (reg & IXGBE_MTQC_RT_ENA) { ++ rx_pba_size = IXGBE_READ_REG(hw, IXGBE_RXPBSIZE(packetbuf_num)); ++ ++ /* Always disable XON for LFC when in DCB mode */ ++ reg = (rx_pba_size >> 5) & 0xFFE0; ++ IXGBE_WRITE_REG(hw, IXGBE_FCRTL_82599(packetbuf_num), reg); ++ ++ reg = (rx_pba_size >> 2) & 0xFFE0; ++ if (hw->fc.current_mode & ixgbe_fc_tx_pause) ++ reg |= IXGBE_FCRTH_FCEN; ++ IXGBE_WRITE_REG(hw, IXGBE_FCRTH_82599(packetbuf_num), reg); ++ } else { ++ /* Set up and enable Rx high/low water mark thresholds, ++ * enable XON. */ ++ if (hw->fc.current_mode & ixgbe_fc_tx_pause) { ++ if (hw->fc.send_xon) { ++ IXGBE_WRITE_REG(hw, ++ IXGBE_FCRTL_82599(packetbuf_num), ++ (hw->fc.low_water | ++ IXGBE_FCRTL_XONE)); ++ } else { ++ IXGBE_WRITE_REG(hw, ++ IXGBE_FCRTL_82599(packetbuf_num), ++ hw->fc.low_water); ++ } ++ ++ IXGBE_WRITE_REG(hw, IXGBE_FCRTH_82599(packetbuf_num), ++ (hw->fc.high_water | IXGBE_FCRTH_FCEN)); ++ } ++ } ++ ++ /* Configure pause time (2 TCs per register) */ ++ reg = IXGBE_READ_REG(hw, IXGBE_FCTTV(packetbuf_num / 2)); ++ if ((packetbuf_num & 1) == 0) ++ reg = (reg & 0xFFFF0000) | hw->fc.pause_time; ++ else ++ reg = (reg & 0x0000FFFF) | (hw->fc.pause_time << 16); ++ IXGBE_WRITE_REG(hw, IXGBE_FCTTV(packetbuf_num / 2), reg); ++ ++ IXGBE_WRITE_REG(hw, IXGBE_FCRTV, (hw->fc.pause_time >> 1)); ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * ixgbe_fc_autoneg - Configure flow control ++ * @hw: pointer to hardware structure ++ * ++ * Compares our advertised flow control capabilities to those advertised by ++ * our link partner, and determines the proper flow control mode to use. ++ **/ ++s32 ixgbe_fc_autoneg(struct ixgbe_hw *hw) ++{ ++ s32 ret_val = 0; ++ ixgbe_link_speed speed; ++ u32 pcs_anadv_reg, pcs_lpab_reg, linkstat; ++ bool link_up; ++ ++ /* ++ * AN should have completed when the cable was plugged in. ++ * Look for reasons to bail out. Bail out if: ++ * - FC autoneg is disabled, or if ++ * - we don't have multispeed fiber, or if ++ * - we're not running at 1G, or if ++ * - link is not up, or if ++ * - link is up but AN did not complete, or if ++ * - link is up and AN completed but timed out ++ * ++ * Since we're being called from an LSC, link is already know to be up. ++ * So use link_up_wait_to_complete=false. ++ */ ++ hw->mac.ops.check_link(hw, &speed, &link_up, false); ++ linkstat = IXGBE_READ_REG(hw, IXGBE_PCS1GLSTA); ++ ++ if (hw->fc.disable_fc_autoneg || ++ !hw->phy.multispeed_fiber || ++ (speed != IXGBE_LINK_SPEED_1GB_FULL) || ++ !link_up || ++ ((linkstat & IXGBE_PCS1GLSTA_AN_COMPLETE) == 0) || ++ ((linkstat & IXGBE_PCS1GLSTA_AN_TIMED_OUT) == 1)) { ++ hw->fc.fc_was_autonegged = false; ++ hw->fc.current_mode = hw->fc.requested_mode; ++ hw_dbg(hw, "Autoneg FC was skipped.\n"); ++ goto out; ++ } ++ ++ /* ++ * Read the AN advertisement and LP ability registers and resolve ++ * local flow control settings accordingly ++ */ ++ pcs_anadv_reg = IXGBE_READ_REG(hw, IXGBE_PCS1GANA); ++ pcs_lpab_reg = IXGBE_READ_REG(hw, IXGBE_PCS1GANLP); ++ if ((pcs_anadv_reg & IXGBE_PCS1GANA_SYM_PAUSE) && ++ (pcs_lpab_reg & IXGBE_PCS1GANA_SYM_PAUSE)) { ++ /* ++ * Now we need to check if the user selected Rx ONLY ++ * of pause frames. In this case, we had to advertise ++ * FULL flow control because we could not advertise RX ++ * ONLY. Hence, we must now check to see if we need to ++ * turn OFF the TRANSMISSION of PAUSE frames. ++ */ ++ if (hw->fc.requested_mode == ixgbe_fc_full) { ++ hw->fc.current_mode = ixgbe_fc_full; ++ hw_dbg(hw, "Flow Control = FULL.\n"); ++ } else { ++ hw->fc.current_mode = ixgbe_fc_rx_pause; ++ hw_dbg(hw, "Flow Control = RX PAUSE frames only.\n"); ++ } ++ } else if (!(pcs_anadv_reg & IXGBE_PCS1GANA_SYM_PAUSE) && ++ (pcs_anadv_reg & IXGBE_PCS1GANA_ASM_PAUSE) && ++ (pcs_lpab_reg & IXGBE_PCS1GANA_SYM_PAUSE) && ++ (pcs_lpab_reg & IXGBE_PCS1GANA_ASM_PAUSE)) { ++ hw->fc.current_mode = ixgbe_fc_tx_pause; ++ hw_dbg(hw, "Flow Control = TX PAUSE frames only.\n"); ++ } else if ((pcs_anadv_reg & IXGBE_PCS1GANA_SYM_PAUSE) && ++ (pcs_anadv_reg & IXGBE_PCS1GANA_ASM_PAUSE) && ++ !(pcs_lpab_reg & IXGBE_PCS1GANA_SYM_PAUSE) && ++ (pcs_lpab_reg & IXGBE_PCS1GANA_ASM_PAUSE)) { ++ hw->fc.current_mode = ixgbe_fc_rx_pause; ++ hw_dbg(hw, "Flow Control = RX PAUSE frames only.\n"); ++ } else { ++ hw->fc.current_mode = ixgbe_fc_none; ++ hw_dbg(hw, "Flow Control = NONE.\n"); ++ } ++ ++ /* Record that current_mode is the result of a successful autoneg */ ++ hw->fc.fc_was_autonegged = true; ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * ixgbe_setup_fc - Set up flow control ++ * @hw: pointer to hardware structure ++ * ++ * Called at init time to set up flow control. ++ **/ ++s32 ixgbe_setup_fc(struct ixgbe_hw *hw, s32 packetbuf_num) ++{ ++ s32 ret_val = 0; ++ u32 reg; ++ ++#ifdef CONFIG_DCB ++ if (hw->fc.requested_mode == ixgbe_fc_pfc) { ++ hw->fc.current_mode = hw->fc.requested_mode; ++ goto out; ++ } ++ ++#endif /* CONFIG_DCB */ ++ ++ /* Validate the packetbuf configuration */ ++ if (packetbuf_num < 0 || packetbuf_num > 7) { ++ hw_dbg(hw, "Invalid packet buffer number [%d], expected range is" ++ " 0-7\n", packetbuf_num); ++ ret_val = IXGBE_ERR_INVALID_LINK_SETTINGS; ++ goto out; ++ } ++ ++ /* ++ * Validate the water mark configuration. Zero water marks are invalid ++ * because it causes the controller to just blast out fc packets. ++ */ ++ if (!hw->fc.low_water || !hw->fc.high_water || !hw->fc.pause_time) { ++ hw_dbg(hw, "Invalid water mark configuration\n"); ++ ret_val = IXGBE_ERR_INVALID_LINK_SETTINGS; ++ goto out; ++ } ++ ++ /* ++ * Validate the requested mode. Strict IEEE mode does not allow ++ * ixgbe_fc_rx_pause because it will cause us to fail at UNH. ++ */ ++ if (hw->fc.strict_ieee && hw->fc.requested_mode == ixgbe_fc_rx_pause) { ++ hw_dbg(hw, "ixgbe_fc_rx_pause not valid in strict IEEE mode\n"); ++ ret_val = IXGBE_ERR_INVALID_LINK_SETTINGS; ++ goto out; ++ } ++ ++ /* ++ * 10gig parts do not have a word in the EEPROM to determine the ++ * default flow control setting, so we explicitly set it to full. ++ */ ++ if (hw->fc.requested_mode == ixgbe_fc_default) ++ hw->fc.requested_mode = ixgbe_fc_full; ++ ++ /* ++ * Set up the 1G flow control advertisement registers so the HW will be ++ * able to do fc autoneg once the cable is plugged in. If we end up ++ * using 10g instead, this is harmless. ++ */ ++ reg = IXGBE_READ_REG(hw, IXGBE_PCS1GANA); ++ ++ /* ++ * The possible values of fc.requested_mode are: ++ * 0: Flow control is completely disabled ++ * 1: Rx flow control is enabled (we can receive pause frames, ++ * but not send pause frames). ++ * 2: Tx flow control is enabled (we can send pause frames but ++ * we do not support receiving pause frames). ++ * 3: Both Rx and Tx flow control (symmetric) are enabled. ++#ifdef CONFIG_DCB ++ * 4: Priority Flow Control is enabled. ++#endif ++ * other: Invalid. ++ */ ++ switch (hw->fc.requested_mode) { ++ case ixgbe_fc_none: ++ /* Flow control completely disabled by software override. */ ++ reg &= ~(IXGBE_PCS1GANA_SYM_PAUSE | IXGBE_PCS1GANA_ASM_PAUSE); ++ break; ++ case ixgbe_fc_rx_pause: ++ /* ++ * Rx Flow control is enabled and Tx Flow control is ++ * disabled by software override. Since there really ++ * isn't a way to advertise that we are capable of RX ++ * Pause ONLY, we will advertise that we support both ++ * symmetric and asymmetric Rx PAUSE. Later, we will ++ * disable the adapter's ability to send PAUSE frames. ++ */ ++ reg |= (IXGBE_PCS1GANA_SYM_PAUSE | IXGBE_PCS1GANA_ASM_PAUSE); ++ break; ++ case ixgbe_fc_tx_pause: ++ /* ++ * Tx Flow control is enabled, and Rx Flow control is ++ * disabled by software override. ++ */ ++ reg |= (IXGBE_PCS1GANA_ASM_PAUSE); ++ reg &= ~(IXGBE_PCS1GANA_SYM_PAUSE); ++ break; ++ case ixgbe_fc_full: ++ /* Flow control (both Rx and Tx) is enabled by SW override. */ ++ reg |= (IXGBE_PCS1GANA_SYM_PAUSE | IXGBE_PCS1GANA_ASM_PAUSE); ++ break; ++#ifdef CONFIG_DCB ++ case ixgbe_fc_pfc: ++ goto out; ++ break; ++#endif /* CONFIG_DCB */ ++ default: ++ hw_dbg(hw, "Flow control param set incorrectly\n"); ++ ret_val = -IXGBE_ERR_CONFIG; ++ goto out; ++ break; ++ } ++ ++ IXGBE_WRITE_REG(hw, IXGBE_PCS1GANA, reg); ++ reg = IXGBE_READ_REG(hw, IXGBE_PCS1GLCTL); ++ ++ /* Enable and restart autoneg to inform the link partner */ ++ reg |= IXGBE_PCS1GLCTL_AN_ENABLE | IXGBE_PCS1GLCTL_AN_RESTART; ++ ++ /* Disable AN timeout */ ++ if (hw->fc.strict_ieee) ++ reg &= ~IXGBE_PCS1GLCTL_AN_1G_TIMEOUT_EN; ++ ++ IXGBE_WRITE_REG(hw, IXGBE_PCS1GLCTL, reg); ++ hw_dbg(hw, "Set up FC; PCS1GLCTL = 0x%08X\n", reg); ++ ++out: ++ return ret_val; + } + + /** +@@ -1547,6 +2027,10 @@ + s32 timeout = 200; + + while (timeout) { ++ /* ++ * SW EEPROM semaphore bit is used for access to all ++ * SW_FW_SYNC/GSSR bits (not just EEPROM) ++ */ + if (ixgbe_get_eeprom_semaphore(hw)) + return -IXGBE_ERR_SWFW_SYNC; + +@@ -1564,7 +2048,7 @@ + } + + if (!timeout) { +- hw_dbg(hw, "Driver can't access resource, GSSR timeout.\n"); ++ hw_dbg(hw, "Driver can't access resource, SW_FW_SYNC timeout.\n"); + return -IXGBE_ERR_SWFW_SYNC; + } + +@@ -1597,3 +2081,75 @@ + ixgbe_release_eeprom_semaphore(hw); + } + ++/** ++ * ixgbe_enable_rx_dma_generic - Enable the Rx DMA unit ++ * @hw: pointer to hardware structure ++ * @regval: register value to write to RXCTRL ++ * ++ * Enables the Rx DMA unit ++ **/ ++s32 ixgbe_enable_rx_dma_generic(struct ixgbe_hw *hw, u32 regval) ++{ ++ IXGBE_WRITE_REG(hw, IXGBE_RXCTRL, regval); ++ ++ return 0; ++} ++ ++/** ++ * ixgbe_blink_led_start_generic - Blink LED based on index. ++ * @hw: pointer to hardware structure ++ * @index: led number to blink ++ **/ ++s32 ixgbe_blink_led_start_generic(struct ixgbe_hw *hw, u32 index) ++{ ++ ixgbe_link_speed speed = 0; ++ bool link_up = 0; ++ u32 autoc_reg = IXGBE_READ_REG(hw, IXGBE_AUTOC); ++ u32 led_reg = IXGBE_READ_REG(hw, IXGBE_LEDCTL); ++ ++ /* ++ * Link must be up to auto-blink the LEDs; ++ * Force it if link is down. ++ */ ++ hw->mac.ops.check_link(hw, &speed, &link_up, false); ++ ++ if (!link_up) { ++ ++ autoc_reg |= IXGBE_AUTOC_AN_RESTART; ++ autoc_reg |= IXGBE_AUTOC_FLU; ++ IXGBE_WRITE_REG(hw, IXGBE_AUTOC, autoc_reg); ++ msleep(10); ++ } ++ ++ led_reg &= ~IXGBE_LED_MODE_MASK(index); ++ led_reg |= IXGBE_LED_BLINK(index); ++ IXGBE_WRITE_REG(hw, IXGBE_LEDCTL, led_reg); ++ IXGBE_WRITE_FLUSH(hw); ++ ++ return 0; ++} ++ ++/** ++ * ixgbe_blink_led_stop_generic - Stop blinking LED based on index. ++ * @hw: pointer to hardware structure ++ * @index: led number to stop blinking ++ **/ ++s32 ixgbe_blink_led_stop_generic(struct ixgbe_hw *hw, u32 index) ++{ ++ u32 autoc_reg = IXGBE_READ_REG(hw, IXGBE_AUTOC); ++ u32 led_reg = IXGBE_READ_REG(hw, IXGBE_LEDCTL); ++ ++ ++ autoc_reg &= ~IXGBE_AUTOC_FLU; ++ autoc_reg |= IXGBE_AUTOC_AN_RESTART; ++ IXGBE_WRITE_REG(hw, IXGBE_AUTOC, autoc_reg); ++ ++ led_reg &= ~IXGBE_LED_MODE_MASK(index); ++ led_reg &= ~IXGBE_LED_BLINK(index); ++ led_reg |= IXGBE_LED_LINK_ACTIVE << IXGBE_LED_MODE_SHIFT(index); ++ IXGBE_WRITE_REG(hw, IXGBE_LEDCTL, led_reg); ++ IXGBE_WRITE_FLUSH(hw); ++ ++ return 0; ++} ++ +diff -r 3e5bbd731d89 drivers/net/ixgbe/ixgbe_common.h +--- a/drivers/net/ixgbe/ixgbe_common.h Mon Jun 15 12:00:22 2009 +0100 ++++ b/drivers/net/ixgbe/ixgbe_common.h Mon Jun 15 12:06:28 2009 +0100 +@@ -1,7 +1,7 @@ + /******************************************************************************* + + Intel 10 Gigabit PCI Express Linux driver +- Copyright(c) 1999 - 2008 Intel Corporation. ++ Copyright(c) 1999 - 2009 Intel Corporation. + + This program is free software; you can redistribute it and/or modify it + under the terms and conditions of the GNU General Public License, +@@ -37,12 +37,14 @@ + s32 ixgbe_read_pba_num_generic(struct ixgbe_hw *hw, u32 *pba_num); + s32 ixgbe_get_mac_addr_generic(struct ixgbe_hw *hw, u8 *mac_addr); + s32 ixgbe_get_bus_info_generic(struct ixgbe_hw *hw); ++void ixgbe_set_lan_id_multi_port_pcie(struct ixgbe_hw *hw); + s32 ixgbe_stop_adapter_generic(struct ixgbe_hw *hw); + + s32 ixgbe_led_on_generic(struct ixgbe_hw *hw, u32 index); + s32 ixgbe_led_off_generic(struct ixgbe_hw *hw, u32 index); + + s32 ixgbe_init_eeprom_params_generic(struct ixgbe_hw *hw); ++s32 ixgbe_write_eeprom_generic(struct ixgbe_hw *hw, u16 offset, u16 data); + s32 ixgbe_read_eeprom_generic(struct ixgbe_hw *hw, u16 offset, u16 *data); + s32 ixgbe_read_eeprom_bit_bang_generic(struct ixgbe_hw *hw, u16 offset, + u16 *data); +@@ -59,8 +61,14 @@ + ixgbe_mc_addr_itr func); + s32 ixgbe_update_uc_addr_list_generic(struct ixgbe_hw *hw, u8 *addr_list, + u32 addr_count, ixgbe_mc_addr_itr func); ++void ixgbe_add_uc_addr(struct ixgbe_hw *hw, u8 *addr, u32 vmdq); + s32 ixgbe_enable_mc_generic(struct ixgbe_hw *hw); + s32 ixgbe_disable_mc_generic(struct ixgbe_hw *hw); ++s32 ixgbe_enable_rx_dma_generic(struct ixgbe_hw *hw, u32 regval); ++ ++s32 ixgbe_setup_fc(struct ixgbe_hw *hw, s32 packetbuf_num); ++s32 ixgbe_fc_enable_generic(struct ixgbe_hw *hw, s32 packtetbuf_num); ++s32 ixgbe_fc_autoneg(struct ixgbe_hw *hw); + + s32 ixgbe_validate_mac_addr(u8 *mac_addr); + s32 ixgbe_acquire_swfw_sync(struct ixgbe_hw *hw, u16 mask); +@@ -69,28 +77,7 @@ + + s32 ixgbe_read_analog_reg8_generic(struct ixgbe_hw *hw, u32 reg, u8 *val); + s32 ixgbe_write_analog_reg8_generic(struct ixgbe_hw *hw, u32 reg, u8 val); +- +-#define IXGBE_WRITE_REG(a, reg, value) writel((value), ((a)->hw_addr + (reg))) +- +-#define IXGBE_READ_REG(a, reg) readl((a)->hw_addr + (reg)) +- +-#define IXGBE_WRITE_REG_ARRAY(a, reg, offset, value) (\ +- writel((value), ((a)->hw_addr + (reg) + ((offset) << 2)))) +- +-#define IXGBE_READ_REG_ARRAY(a, reg, offset) (\ +- readl((a)->hw_addr + (reg) + ((offset) << 2))) +- +-#define IXGBE_WRITE_FLUSH(a) IXGBE_READ_REG(a, IXGBE_STATUS) +- +-#ifdef DEBUG +-#define hw_dbg(hw, format, arg...) \ +-printk(KERN_DEBUG, "%s: " format, ixgbe_get_hw_dev_name(hw), ##arg); +-#else +-static inline int __attribute__ ((format (printf, 2, 3))) +-hw_dbg(struct ixgbe_hw *hw, const char *format, ...) +-{ +- return 0; +-} +-#endif ++s32 ixgbe_blink_led_start_generic(struct ixgbe_hw *hw, u32 index); ++s32 ixgbe_blink_led_stop_generic(struct ixgbe_hw *hw, u32 index); + + #endif /* IXGBE_COMMON */ +diff -r 3e5bbd731d89 drivers/net/ixgbe/ixgbe_dcb.c +--- a/drivers/net/ixgbe/ixgbe_dcb.c Mon Jun 15 12:00:22 2009 +0100 ++++ b/drivers/net/ixgbe/ixgbe_dcb.c Mon Jun 15 12:06:28 2009 +0100 +@@ -1,7 +1,7 @@ + /******************************************************************************* + + Intel 10 Gigabit PCI Express Linux driver +- Copyright(c) 1999 - 2007 Intel Corporation. ++ Copyright(c) 1999 - 2009 Intel Corporation. + + This program is free software; you can redistribute it and/or modify it + under the terms and conditions of the GNU General Public License, +@@ -20,17 +20,16 @@ + the file called "COPYING". + + Contact Information: +- Linux NICS + e1000-devel Mailing List + Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 + + *******************************************************************************/ + + +-#include "ixgbe.h" + #include "ixgbe_type.h" + #include "ixgbe_dcb.h" + #include "ixgbe_dcb_82598.h" ++#include "ixgbe_dcb_82599.h" + + /** + * ixgbe_dcb_config - Struct containing DCB settings. +@@ -108,7 +107,7 @@ + goto err_config; + } + } else if (bw_sum[i][j] != BW_PERCENT && +- bw_sum[i][j] != 0) { ++ bw_sum[i][j] != 0) { + ret_val = DCB_ERR_TC_BW; + goto err_config; + } +@@ -120,7 +119,12 @@ + } + } + ++ return DCB_SUCCESS; ++ + err_config: ++ hw_dbg(hw, "DCB error code %d while checking %s settings.\n", ++ ret_val, (j == DCB_TX_CONFIG) ? "Tx" : "Rx"); ++ + return ret_val; + } + +@@ -134,7 +138,7 @@ + * ixgbe_dcb_check_config(). + */ + s32 ixgbe_dcb_calculate_tc_credits(struct ixgbe_dcb_config *dcb_config, +- u8 direction) ++ u8 direction) + { + struct tc_bw_alloc *p; + s32 ret_val = 0; +@@ -186,12 +190,11 @@ + * credit may not be enough to send out a TSO + * packet in descriptor plane arbitration. + */ +- if (credit_max && +- (credit_max < MINIMUM_CREDIT_FOR_TSO)) ++ if (credit_max && (credit_max < MINIMUM_CREDIT_FOR_TSO)) + credit_max = MINIMUM_CREDIT_FOR_TSO; + + dcb_config->tc_config[i].desc_credits_max = +- (u16)credit_max; ++ (u16)credit_max; + } + + p->data_credits_max = (u16)credit_max; +@@ -210,28 +213,32 @@ + * This function returns the status data for each of the Traffic Classes in use. + */ + s32 ixgbe_dcb_get_tc_stats(struct ixgbe_hw *hw, struct ixgbe_hw_stats *stats, +- u8 tc_count) ++ u8 tc_count) + { + s32 ret = 0; + if (hw->mac.type == ixgbe_mac_82598EB) + ret = ixgbe_dcb_get_tc_stats_82598(hw, stats, tc_count); ++ else if (hw->mac.type == ixgbe_mac_82599EB) ++ ret = ixgbe_dcb_get_tc_stats_82599(hw, stats, tc_count); + return ret; + } + + /** + * ixgbe_dcb_get_pfc_stats - Returns CBFC status of each traffic class +- * hw - pointer to hardware structure +- * stats - pointer to statistics structure +- * tc_count - Number of elements in bwg_array. ++ * @hw: pointer to hardware structure ++ * @stats: pointer to statistics structure ++ * @tc_count: Number of elements in bwg_array. + * + * This function returns the CBFC status data for each of the Traffic Classes. + */ + s32 ixgbe_dcb_get_pfc_stats(struct ixgbe_hw *hw, struct ixgbe_hw_stats *stats, +- u8 tc_count) ++ u8 tc_count) + { + s32 ret = 0; + if (hw->mac.type == ixgbe_mac_82598EB) + ret = ixgbe_dcb_get_pfc_stats_82598(hw, stats, tc_count); ++ else if (hw->mac.type == ixgbe_mac_82599EB) ++ ret = ixgbe_dcb_get_pfc_stats_82599(hw, stats, tc_count); + return ret; + } + +@@ -243,11 +250,13 @@ + * Configure Rx Data Arbiter and credits for each traffic class. + */ + s32 ixgbe_dcb_config_rx_arbiter(struct ixgbe_hw *hw, +- struct ixgbe_dcb_config *dcb_config) ++ struct ixgbe_dcb_config *dcb_config) + { + s32 ret = 0; + if (hw->mac.type == ixgbe_mac_82598EB) + ret = ixgbe_dcb_config_rx_arbiter_82598(hw, dcb_config); ++ else if (hw->mac.type == ixgbe_mac_82599EB) ++ ret = ixgbe_dcb_config_rx_arbiter_82599(hw, dcb_config); + return ret; + } + +@@ -259,11 +268,13 @@ + * Configure Tx Descriptor Arbiter and credits for each traffic class. + */ + s32 ixgbe_dcb_config_tx_desc_arbiter(struct ixgbe_hw *hw, +- struct ixgbe_dcb_config *dcb_config) ++ struct ixgbe_dcb_config *dcb_config) + { + s32 ret = 0; + if (hw->mac.type == ixgbe_mac_82598EB) + ret = ixgbe_dcb_config_tx_desc_arbiter_82598(hw, dcb_config); ++ else if (hw->mac.type == ixgbe_mac_82599EB) ++ ret = ixgbe_dcb_config_tx_desc_arbiter_82599(hw, dcb_config); + return ret; + } + +@@ -275,11 +286,13 @@ + * Configure Tx Data Arbiter and credits for each traffic class. + */ + s32 ixgbe_dcb_config_tx_data_arbiter(struct ixgbe_hw *hw, +- struct ixgbe_dcb_config *dcb_config) ++ struct ixgbe_dcb_config *dcb_config) + { + s32 ret = 0; + if (hw->mac.type == ixgbe_mac_82598EB) + ret = ixgbe_dcb_config_tx_data_arbiter_82598(hw, dcb_config); ++ else if (hw->mac.type == ixgbe_mac_82599EB) ++ ret = ixgbe_dcb_config_tx_data_arbiter_82599(hw, dcb_config); + return ret; + } + +@@ -291,11 +304,13 @@ + * Configure Priority Flow Control for each traffic class. + */ + s32 ixgbe_dcb_config_pfc(struct ixgbe_hw *hw, +- struct ixgbe_dcb_config *dcb_config) ++ struct ixgbe_dcb_config *dcb_config) + { + s32 ret = 0; + if (hw->mac.type == ixgbe_mac_82598EB) + ret = ixgbe_dcb_config_pfc_82598(hw, dcb_config); ++ else if (hw->mac.type == ixgbe_mac_82599EB) ++ ret = ixgbe_dcb_config_pfc_82599(hw, dcb_config); + return ret; + } + +@@ -311,6 +326,8 @@ + s32 ret = 0; + if (hw->mac.type == ixgbe_mac_82598EB) + ret = ixgbe_dcb_config_tc_stats_82598(hw); ++ else if (hw->mac.type == ixgbe_mac_82599EB) ++ ret = ixgbe_dcb_config_tc_stats_82599(hw); + return ret; + } + +@@ -322,11 +339,12 @@ + * Configure dcb settings and enable dcb mode. + */ + s32 ixgbe_dcb_hw_config(struct ixgbe_hw *hw, +- struct ixgbe_dcb_config *dcb_config) ++ struct ixgbe_dcb_config *dcb_config) + { + s32 ret = 0; + if (hw->mac.type == ixgbe_mac_82598EB) + ret = ixgbe_dcb_hw_config_82598(hw, dcb_config); ++ else if (hw->mac.type == ixgbe_mac_82599EB) ++ ret = ixgbe_dcb_hw_config_82599(hw, dcb_config); + return ret; + } +- +diff -r 3e5bbd731d89 drivers/net/ixgbe/ixgbe_dcb.h +--- a/drivers/net/ixgbe/ixgbe_dcb.h Mon Jun 15 12:00:22 2009 +0100 ++++ b/drivers/net/ixgbe/ixgbe_dcb.h Mon Jun 15 12:06:28 2009 +0100 +@@ -1,7 +1,7 @@ + /******************************************************************************* + + Intel 10 Gigabit PCI Express Linux driver +- Copyright(c) 1999 - 2007 Intel Corporation. ++ Copyright(c) 1999 - 2009 Intel Corporation. + + This program is free software; you can redistribute it and/or modify it + under the terms and conditions of the GNU General Public License, +@@ -20,7 +20,6 @@ + the file called "COPYING". + + Contact Information: +- Linux NICS + e1000-devel Mailing List + Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 + +@@ -75,15 +74,35 @@ + prio_link + }; + ++/* DCB capability definitions */ ++#define IXGBE_DCB_PG_SUPPORT 0x00000001 ++#define IXGBE_DCB_PFC_SUPPORT 0x00000002 ++#define IXGBE_DCB_BCN_SUPPORT 0x00000004 ++#define IXGBE_DCB_UP2TC_SUPPORT 0x00000008 ++#define IXGBE_DCB_GSP_SUPPORT 0x00000010 ++ ++#define IXGBE_DCB_8_TC_SUPPORT 0x80 ++ ++struct dcb_support { ++ /* DCB capabilities */ ++ u32 capabilities; ++ ++ /* Each bit represents a number of TCs configurable in the hw. ++ * If 8 traffic classes can be configured, the value is 0x80. ++ */ ++ u8 traffic_classes; ++ u8 pfc_traffic_classes; ++}; ++ + /* Traffic class bandwidth allocation per direction */ + struct tc_bw_alloc { +- u8 bwg_id; /* Bandwidth Group (BWG) ID */ +- u8 bwg_percent; /* % of BWG's bandwidth */ +- u8 link_percent; /* % of link bandwidth */ +- u8 up_to_tc_bitmap; /* User Priority to Traffic Class mapping */ ++ u8 bwg_id; /* Bandwidth Group (BWG) ID */ ++ u8 bwg_percent; /* % of BWG's bandwidth */ ++ u8 link_percent; /* % of link bandwidth */ ++ u8 up_to_tc_bitmap; /* User Priority to Traffic Class mapping */ + u16 data_credits_refill; /* Credit refill amount in 64B granularity */ +- u16 data_credits_max; /* Max credits for a configured packet buffer +- * in 64B granularity.*/ ++ u16 data_credits_max; /* Max credits for a configured packet buffer ++ * in 64B granularity.*/ + enum strict_prio_type prio_type; /* Link or Group Strict Priority */ + }; + +@@ -108,37 +127,17 @@ + pba_80_48 /* PBA[0-3] each use 80KB, PBA[4-7] each use 48KB */ + }; + +-/* +- * This structure contains many values encoded as fixed-point +- * numbers, meaning that some of bits are dedicated to the +- * magnitude and others to the fraction part. In the comments +- * this is shown as f=n, where n is the number of fraction bits. +- * These fraction bits are always the low-order bits. The size +- * of the magnitude is not specified. +- */ +-struct bcn_config { +- u32 rp_admin_mode[MAX_TRAFFIC_CLASS]; /* BCN enabled, per TC */ +- u32 bcna_option[2]; /* BCNA Port + MAC Addr */ +- u32 rp_w; /* Derivative Weight, f=3 */ +- u32 rp_gi; /* Increase Gain, f=12 */ +- u32 rp_gd; /* Decrease Gain, f=12 */ +- u32 rp_ru; /* Rate Unit */ +- u32 rp_alpha; /* Max Decrease Factor, f=12 */ +- u32 rp_beta; /* Max Increase Factor, f=12 */ +- u32 rp_ri; /* Initial Rate */ +- u32 rp_td; /* Drift Interval Timer */ +- u32 rp_rd; /* Drift Increase */ +- u32 rp_tmax; /* Severe Congestion Backoff Timer Range */ +- u32 rp_rmin; /* Severe Congestion Restart Rate */ +- u32 rp_wrtt; /* RTT Moving Average Weight */ ++struct dcb_num_tcs { ++ u8 pg_tcs; ++ u8 pfc_tcs; + }; + + struct ixgbe_dcb_config { +- struct bcn_config bcn; +- + struct tc_configuration tc_config[MAX_TRAFFIC_CLASS]; ++ struct dcb_support support; ++ struct dcb_num_tcs num_tcs; + u8 bw_percentage[2][MAX_BW_GROUP]; /* One each for Tx/Rx */ +- ++ bool pfc_mode_enable; + bool round_robin_enable; + + enum dcb_rx_pba_cfg rx_pba_cfg; +@@ -154,36 +153,41 @@ + + /* DCB credits calculation */ + s32 ixgbe_dcb_calculate_tc_credits(struct ixgbe_dcb_config *config, +- u8 direction); ++ u8 direction); + + /* DCB PFC functions */ + s32 ixgbe_dcb_config_pfc(struct ixgbe_hw *hw, +- struct ixgbe_dcb_config *dcb_config); ++ struct ixgbe_dcb_config *dcb_config); + s32 ixgbe_dcb_get_pfc_stats(struct ixgbe_hw *hw, struct ixgbe_hw_stats *stats, +- u8 tc_count); ++ u8 tc_count); + + /* DCB traffic class stats */ + s32 ixgbe_dcb_config_tc_stats(struct ixgbe_hw *); + s32 ixgbe_dcb_get_tc_stats(struct ixgbe_hw *hw, struct ixgbe_hw_stats *stats, +- u8 tc_count); ++ u8 tc_count); + + /* DCB config arbiters */ + s32 ixgbe_dcb_config_tx_desc_arbiter(struct ixgbe_hw *hw, +- struct ixgbe_dcb_config *dcb_config); ++ struct ixgbe_dcb_config *dcb_config); + s32 ixgbe_dcb_config_tx_data_arbiter(struct ixgbe_hw *hw, +- struct ixgbe_dcb_config *dcb_config); ++ struct ixgbe_dcb_config *dcb_config); + s32 ixgbe_dcb_config_rx_arbiter(struct ixgbe_hw *hw, +- struct ixgbe_dcb_config *dcb_config); ++ struct ixgbe_dcb_config *dcb_config); + + /* DCB hw initialization */ + s32 ixgbe_dcb_hw_config(struct ixgbe_hw *hw, struct ixgbe_dcb_config *config); + ++ + /* DCB definitions for credit calculation */ + #define MAX_CREDIT_REFILL 511 /* 0x1FF * 64B = 32704B */ + #define MINIMUM_CREDIT_REFILL 5 /* 5*64B = 320B */ +-#define MINIMUM_CREDIT_FOR_JUMBO 145 /* 145= UpperBound((9*1024+54)/64B) for 9KB jumbo frame */ +-#define DCB_MAX_TSO_SIZE (32*1024) /* MAX TSO packet size supported in DCB mode */ +-#define MINIMUM_CREDIT_FOR_TSO (DCB_MAX_TSO_SIZE/64 + 1) /* 513 for 32KB TSO packet */ +-#define MAX_CREDIT 4095 /* Maximum credit supported: 256KB * 1204 / 64B */ ++#define MINIMUM_CREDIT_FOR_JUMBO 145 /* 145 = UpperBound((9*1024+54)/64B) ++ * for 9KB jumbo frame */ ++#define DCB_MAX_TSO_SIZE 32*1024 /* MAX TSO packet size supported ++ * in DCB mode */ ++#define MINIMUM_CREDIT_FOR_TSO (DCB_MAX_TSO_SIZE/64 + 1) /* 513 for 32KB TSO ++ * packet */ ++#define MAX_CREDIT 4095 /* Maximum credit supported: ++ * 256KB * 1204 / 64B */ + + #endif /* _DCB_CONFIG_H */ +diff -r 3e5bbd731d89 drivers/net/ixgbe/ixgbe_dcb_82598.c +--- a/drivers/net/ixgbe/ixgbe_dcb_82598.c Mon Jun 15 12:00:22 2009 +0100 ++++ b/drivers/net/ixgbe/ixgbe_dcb_82598.c Mon Jun 15 12:06:28 2009 +0100 +@@ -1,7 +1,7 @@ + /******************************************************************************* + + Intel 10 Gigabit PCI Express Linux driver +- Copyright(c) 1999 - 2007 Intel Corporation. ++ Copyright(c) 1999 - 2009 Intel Corporation. + + This program is free software; you can redistribute it and/or modify it + under the terms and conditions of the GNU General Public License, +@@ -20,13 +20,12 @@ + the file called "COPYING". + + Contact Information: +- Linux NICS + e1000-devel Mailing List + Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 + + *******************************************************************************/ + +-#include "ixgbe.h" ++ + #include "ixgbe_type.h" + #include "ixgbe_dcb.h" + #include "ixgbe_dcb_82598.h" +@@ -40,14 +39,13 @@ + * This function returns the status data for each of the Traffic Classes in use. + */ + s32 ixgbe_dcb_get_tc_stats_82598(struct ixgbe_hw *hw, +- struct ixgbe_hw_stats *stats, +- u8 tc_count) ++ struct ixgbe_hw_stats *stats, ++ u8 tc_count) + { + int tc; + + if (tc_count > MAX_TRAFFIC_CLASS) + return DCB_ERR_PARAM; +- + /* Statistics pertaining to each traffic class */ + for (tc = 0; tc < tc_count; tc++) { + /* Transmitted Packets */ +@@ -58,6 +56,14 @@ + stats->qprc[tc] += IXGBE_READ_REG(hw, IXGBE_QPRC(tc)); + /* Received Bytes */ + stats->qbrc[tc] += IXGBE_READ_REG(hw, IXGBE_QBRC(tc)); ++ ++#if 0 ++ /* Can we get rid of these?? Consequently, getting rid ++ * of the tc_stats structure. ++ */ ++ tc_stats_array[up]->in_overflow_discards = 0; ++ tc_stats_array[up]->out_overflow_discards = 0; ++#endif + } + + return 0; +@@ -72,14 +78,13 @@ + * This function returns the CBFC status data for each of the Traffic Classes. + */ + s32 ixgbe_dcb_get_pfc_stats_82598(struct ixgbe_hw *hw, +- struct ixgbe_hw_stats *stats, +- u8 tc_count) ++ struct ixgbe_hw_stats *stats, ++ u8 tc_count) + { + int tc; + + if (tc_count > MAX_TRAFFIC_CLASS) + return DCB_ERR_PARAM; +- + for (tc = 0; tc < tc_count; tc++) { + /* Priority XOFF Transmitted */ + stats->pxofftxc[tc] += IXGBE_READ_REG(hw, IXGBE_PXOFFTXC(tc)); +@@ -98,7 +103,7 @@ + * Configure packet buffers for DCB mode. + */ + s32 ixgbe_dcb_config_packet_buffers_82598(struct ixgbe_hw *hw, +- struct ixgbe_dcb_config *dcb_config) ++ struct ixgbe_dcb_config *dcb_config) + { + s32 ret_val = 0; + u32 value = IXGBE_RXPBSIZE_64KB; +@@ -122,7 +127,7 @@ + /* Setup Tx packet buffer sizes */ + for (i = 0; i < IXGBE_MAX_PACKET_BUFFERS; i++) { + IXGBE_WRITE_REG(hw, IXGBE_TXPBSIZE(i), +- IXGBE_TXPBSIZE_40KB); ++ IXGBE_TXPBSIZE_40KB); + } + break; + } +@@ -138,7 +143,7 @@ + * Configure Rx Data Arbiter and credits for each traffic class. + */ + s32 ixgbe_dcb_config_rx_arbiter_82598(struct ixgbe_hw *hw, +- struct ixgbe_dcb_config *dcb_config) ++ struct ixgbe_dcb_config *dcb_config) + { + struct tc_bw_alloc *p; + u32 reg = 0; +@@ -195,7 +200,7 @@ + * Configure Tx Descriptor Arbiter and credits for each traffic class. + */ + s32 ixgbe_dcb_config_tx_desc_arbiter_82598(struct ixgbe_hw *hw, +- struct ixgbe_dcb_config *dcb_config) ++ struct ixgbe_dcb_config *dcb_config) + { + struct tc_bw_alloc *p; + u32 reg, max_credits; +@@ -243,7 +248,7 @@ + * Configure Tx Data Arbiter and credits for each traffic class. + */ + s32 ixgbe_dcb_config_tx_data_arbiter_82598(struct ixgbe_hw *hw, +- struct ixgbe_dcb_config *dcb_config) ++ struct ixgbe_dcb_config *dcb_config) + { + struct tc_bw_alloc *p; + u32 reg; +@@ -289,16 +294,18 @@ + * Configure Priority Flow Control for each traffic class. + */ + s32 ixgbe_dcb_config_pfc_82598(struct ixgbe_hw *hw, +- struct ixgbe_dcb_config *dcb_config) ++ struct ixgbe_dcb_config *dcb_config) + { + u32 reg, rx_pba_size; + u8 i; ++ ++ if (!dcb_config->pfc_mode_enable) ++ goto out; + + /* Enable Transmit Priority Flow Control */ + reg = IXGBE_READ_REG(hw, IXGBE_RMCS); + reg &= ~IXGBE_RMCS_TFCE_802_3X; + /* correct the reporting of our flow control status */ +- hw->fc.type = ixgbe_fc_none; + reg |= IXGBE_RMCS_TFCE_PRIORITY; + IXGBE_WRITE_REG(hw, IXGBE_RMCS, reg); + +@@ -317,7 +324,7 @@ + rx_pba_size = IXGBE_RXPBSIZE_64KB; + } else { + rx_pba_size = (i < 4) ? IXGBE_RXPBSIZE_80KB +- : IXGBE_RXPBSIZE_48KB; ++ : IXGBE_RXPBSIZE_48KB; + } + + reg = ((rx_pba_size >> 5) & 0xFFF0); +@@ -342,6 +349,7 @@ + /* Configure flow control refresh threshold value */ + IXGBE_WRITE_REG(hw, IXGBE_FCRTV, 0x3400); + ++out: + return 0; + } + +@@ -367,7 +375,7 @@ + reg |= ((0x1010101) * j); + IXGBE_WRITE_REG(hw, IXGBE_RQSMR(i + 1), reg); + } +- /* Transmit Queues stats setting - 4 queues per statistics reg */ ++ /* Transmit Queues stats setting - 4 queues per statistics reg*/ + for (i = 0; i < 8; i++) { + reg = IXGBE_READ_REG(hw, IXGBE_TQSMR(i)); + reg |= ((0x1010101) * i); +@@ -385,8 +393,10 @@ + * Configure dcb settings and enable dcb mode. + */ + s32 ixgbe_dcb_hw_config_82598(struct ixgbe_hw *hw, +- struct ixgbe_dcb_config *dcb_config) ++ struct ixgbe_dcb_config *dcb_config) + { ++ u32 pap = 0; ++ + ixgbe_dcb_config_packet_buffers_82598(hw, dcb_config); + ixgbe_dcb_config_rx_arbiter_82598(hw, dcb_config); + ixgbe_dcb_config_tx_desc_arbiter_82598(hw, dcb_config); +@@ -394,5 +404,13 @@ + ixgbe_dcb_config_pfc_82598(hw, dcb_config); + ixgbe_dcb_config_tc_stats_82598(hw); + ++ /* TODO: For DCB SV purpose only, ++ * remove it before product release */ ++ if (dcb_config->link_speed > 0 && dcb_config->link_speed <= 9) { ++ pap = IXGBE_READ_REG(hw, IXGBE_PAP); ++ pap |= (dcb_config->link_speed << 16); ++ IXGBE_WRITE_REG(hw, IXGBE_PAP, pap); ++ } ++ + return 0; + } +diff -r 3e5bbd731d89 drivers/net/ixgbe/ixgbe_dcb_82598.h +--- a/drivers/net/ixgbe/ixgbe_dcb_82598.h Mon Jun 15 12:00:22 2009 +0100 ++++ b/drivers/net/ixgbe/ixgbe_dcb_82598.h Mon Jun 15 12:06:28 2009 +0100 +@@ -1,7 +1,7 @@ + /******************************************************************************* + + Intel 10 Gigabit PCI Express Linux driver +- Copyright(c) 1999 - 2007 Intel Corporation. ++ Copyright(c) 1999 - 2009 Intel Corporation. + + This program is free software; you can redistribute it and/or modify it + under the terms and conditions of the GNU General Public License, +@@ -20,7 +20,6 @@ + the file called "COPYING". + + Contact Information: +- Linux NICS + e1000-devel Mailing List + Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 + +@@ -32,7 +31,8 @@ + /* DCB register definitions */ + + #define IXGBE_DPMCS_MTSOS_SHIFT 16 +-#define IXGBE_DPMCS_TDPAC 0x00000001 /* 0 Round Robin, 1 DFP - Deficit Fixed Priority */ ++#define IXGBE_DPMCS_TDPAC 0x00000001 /* 0 Round Robin, ++ * 1 DFP - Deficit Fixed Priority */ + #define IXGBE_DPMCS_TRM 0x00000010 /* Transmit Recycle Mode */ + #define IXGBE_DPMCS_ARBDIS 0x00000040 /* DCB arbiter disable */ + #define IXGBE_DPMCS_TSOEF 0x00080000 /* TSO Expand Factor: 0=x4, 1=x2 */ +@@ -42,8 +42,10 @@ + #define IXGBE_RT2CR_MCL_SHIFT 12 /* Offset to Max Credit Limit setting */ + #define IXGBE_RT2CR_LSP 0x80000000 /* LSP enable bit */ + +-#define IXGBE_RDRXCTL_MPBEN 0x00000010 /* DMA config for multiple packet buffers enable */ +-#define IXGBE_RDRXCTL_MCEN 0x00000040 /* DMA config for multiple cores (RSS) enable */ ++#define IXGBE_RDRXCTL_MPBEN 0x00000010 /* DMA config for multiple packet ++ * buffers enable */ ++#define IXGBE_RDRXCTL_MCEN 0x00000040 /* DMA config for multiple cores ++ * (RSS) enable */ + + #define IXGBE_TDTQ2TCCR_MCL_SHIFT 12 + #define IXGBE_TDTQ2TCCR_BWG_SHIFT 9 +@@ -55,7 +57,8 @@ + #define IXGBE_TDPT2TCCR_GSP 0x40000000 + #define IXGBE_TDPT2TCCR_LSP 0x80000000 + +-#define IXGBE_PDPMCS_TPPAC 0x00000020 /* 0 Round Robin, 1 for DFP - Deficit Fixed Priority */ ++#define IXGBE_PDPMCS_TPPAC 0x00000020 /* 0 Round Robin, ++ * 1 DFP - Deficit Fixed Priority */ + #define IXGBE_PDPMCS_ARBDIS 0x00000040 /* Arbiter disable */ + #define IXGBE_PDPMCS_TRM 0x00000100 /* Transmit Recycle Mode enable */ + +@@ -66,33 +69,31 @@ + #define IXGBE_RXPBSIZE_64KB 0x00010000 /* 64KB Packet Buffer */ + #define IXGBE_RXPBSIZE_80KB 0x00014000 /* 80KB Packet Buffer */ + +-#define IXGBE_RDRXCTL_RDMTS_1_2 0x00000000 +- + /* DCB hardware-specific driver APIs */ + + /* DCB PFC functions */ + s32 ixgbe_dcb_config_pfc_82598(struct ixgbe_hw *hw, +- struct ixgbe_dcb_config *dcb_config); ++ struct ixgbe_dcb_config *dcb_config); + s32 ixgbe_dcb_get_pfc_stats_82598(struct ixgbe_hw *hw, +- struct ixgbe_hw_stats *stats, +- u8 tc_count); ++ struct ixgbe_hw_stats *stats, ++ u8 tc_count); + + /* DCB traffic class stats */ + s32 ixgbe_dcb_config_tc_stats_82598(struct ixgbe_hw *hw); + s32 ixgbe_dcb_get_tc_stats_82598(struct ixgbe_hw *hw, +- struct ixgbe_hw_stats *stats, +- u8 tc_count); ++ struct ixgbe_hw_stats *stats, ++ u8 tc_count); + + /* DCB config arbiters */ + s32 ixgbe_dcb_config_tx_desc_arbiter_82598(struct ixgbe_hw *hw, +- struct ixgbe_dcb_config *dcb_config); ++ struct ixgbe_dcb_config *dcb_config); + s32 ixgbe_dcb_config_tx_data_arbiter_82598(struct ixgbe_hw *hw, +- struct ixgbe_dcb_config *dcb_config); ++ struct ixgbe_dcb_config *dcb_config); + s32 ixgbe_dcb_config_rx_arbiter_82598(struct ixgbe_hw *hw, +- struct ixgbe_dcb_config *dcb_config); ++ struct ixgbe_dcb_config *dcb_config); + + /* DCB hw initialization */ + s32 ixgbe_dcb_hw_config_82598(struct ixgbe_hw *hw, +- struct ixgbe_dcb_config *config); ++ struct ixgbe_dcb_config *config); + + #endif /* _DCB_82598_CONFIG_H */ +diff -r 3e5bbd731d89 drivers/net/ixgbe/ixgbe_dcb_82599.c +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/ixgbe/ixgbe_dcb_82599.c Mon Jun 15 12:06:28 2009 +0100 +@@ -0,0 +1,508 @@ ++/******************************************************************************* ++ ++ Intel 10 Gigabit PCI Express Linux driver ++ Copyright(c) 1999 - 2009 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++ ++#include "ixgbe_type.h" ++#include "ixgbe_dcb.h" ++#include "ixgbe_dcb_82599.h" ++ ++/** ++ * ixgbe_dcb_get_tc_stats_82599 - Returns status for each traffic class ++ * @hw: pointer to hardware structure ++ * @stats: pointer to statistics structure ++ * @tc_count: Number of elements in bwg_array. ++ * ++ * This function returns the status data for each of the Traffic Classes in use. ++ */ ++s32 ixgbe_dcb_get_tc_stats_82599(struct ixgbe_hw *hw, ++ struct ixgbe_hw_stats *stats, ++ u8 tc_count) ++{ ++ int tc; ++ ++ if (tc_count > MAX_TRAFFIC_CLASS) ++ return DCB_ERR_PARAM; ++ /* Statistics pertaining to each traffic class */ ++ for (tc = 0; tc < tc_count; tc++) { ++ /* Transmitted Packets */ ++ stats->qptc[tc] += IXGBE_READ_REG(hw, IXGBE_QPTC(tc)); ++ /* Transmitted Bytes */ ++ stats->qbtc[tc] += IXGBE_READ_REG(hw, IXGBE_QBTC(tc)); ++ /* Received Packets */ ++ stats->qprc[tc] += IXGBE_READ_REG(hw, IXGBE_QPRC(tc)); ++ /* Received Bytes */ ++ stats->qbrc[tc] += IXGBE_READ_REG(hw, IXGBE_QBRC(tc)); ++ ++#if 0 ++ /* Can we get rid of these?? Consequently, getting rid ++ * of the tc_stats structure. ++ */ ++ tc_stats_array[up]->in_overflow_discards = 0; ++ tc_stats_array[up]->out_overflow_discards = 0; ++#endif ++ } ++ ++ return 0; ++} ++ ++/** ++ * ixgbe_dcb_get_pfc_stats_82599 - Return CBFC status data ++ * @hw: pointer to hardware structure ++ * @stats: pointer to statistics structure ++ * @tc_count: Number of elements in bwg_array. ++ * ++ * This function returns the CBFC status data for each of the Traffic Classes. ++ */ ++s32 ixgbe_dcb_get_pfc_stats_82599(struct ixgbe_hw *hw, ++ struct ixgbe_hw_stats *stats, ++ u8 tc_count) ++{ ++ int tc; ++ ++ if (tc_count > MAX_TRAFFIC_CLASS) ++ return DCB_ERR_PARAM; ++ for (tc = 0; tc < tc_count; tc++) { ++ /* Priority XOFF Transmitted */ ++ stats->pxofftxc[tc] += IXGBE_READ_REG(hw, IXGBE_PXOFFTXC(tc)); ++ /* Priority XOFF Received */ ++ stats->pxoffrxc[tc] += IXGBE_READ_REG(hw, IXGBE_PXOFFRXCNT(tc)); ++ } ++ ++ return 0; ++} ++ ++/** ++ * ixgbe_dcb_config_packet_buffers_82599 - Configure DCB packet buffers ++ * @hw: pointer to hardware structure ++ * @dcb_config: pointer to ixgbe_dcb_config structure ++ * ++ * Configure packet buffers for DCB mode. ++ */ ++s32 ixgbe_dcb_config_packet_buffers_82599(struct ixgbe_hw *hw, ++ struct ixgbe_dcb_config *dcb_config) ++{ ++ s32 ret_val = 0; ++ u32 value = IXGBE_RXPBSIZE_64KB; ++ u8 i = 0; ++ ++ /* Setup Rx packet buffer sizes */ ++ switch (dcb_config->rx_pba_cfg) { ++ case pba_80_48: ++ /* Setup the first four at 80KB */ ++ value = IXGBE_RXPBSIZE_80KB; ++ for (; i < 4; i++) ++ IXGBE_WRITE_REG(hw, IXGBE_RXPBSIZE(i), value); ++ /* Setup the last four at 48KB...don't re-init i */ ++ value = IXGBE_RXPBSIZE_48KB; ++ /* Fall Through */ ++ case pba_equal: ++ default: ++ for (; i < IXGBE_MAX_PACKET_BUFFERS; i++) ++ IXGBE_WRITE_REG(hw, IXGBE_RXPBSIZE(i), value); ++ ++ /* Setup Tx packet buffer sizes */ ++ for (i = 0; i < IXGBE_MAX_PACKET_BUFFERS; i++) { ++ IXGBE_WRITE_REG(hw, IXGBE_TXPBSIZE(i), ++ IXGBE_TXPBSIZE_20KB); ++ IXGBE_WRITE_REG(hw, IXGBE_TXPBTHRESH(i), ++ IXGBE_TXPBTHRESH_DCB); ++ } ++ break; ++ } ++ ++ return ret_val; ++} ++ ++/** ++ * ixgbe_dcb_config_rx_arbiter_82599 - Config Rx Data arbiter ++ * @hw: pointer to hardware structure ++ * @dcb_config: pointer to ixgbe_dcb_config structure ++ * ++ * Configure Rx Packet Arbiter and credits for each traffic class. ++ */ ++s32 ixgbe_dcb_config_rx_arbiter_82599(struct ixgbe_hw *hw, ++ struct ixgbe_dcb_config *dcb_config) ++{ ++ struct tc_bw_alloc *p; ++ u32 reg = 0; ++ u32 credit_refill = 0; ++ u32 credit_max = 0; ++ u8 i = 0; ++ ++ /* ++ * Disable the arbiter before changing parameters ++ * (always enable recycle mode; WSP) ++ */ ++ reg = IXGBE_RTRPCS_RRM | IXGBE_RTRPCS_RAC | IXGBE_RTRPCS_ARBDIS; ++ IXGBE_WRITE_REG(hw, IXGBE_RTRPCS, reg); ++ ++ /* Map all traffic classes to their UP, 1 to 1 */ ++ reg = 0; ++ for (i = 0; i < MAX_TRAFFIC_CLASS; i++) ++ reg |= (i << (i * IXGBE_RTRUP2TC_UP_SHIFT)); ++ IXGBE_WRITE_REG(hw, IXGBE_RTRUP2TC, reg); ++ ++ /* Configure traffic class credits and priority */ ++ for (i = 0; i < MAX_TRAFFIC_CLASS; i++) { ++ p = &dcb_config->tc_config[i].path[DCB_RX_CONFIG]; ++ ++ credit_refill = p->data_credits_refill; ++ credit_max = p->data_credits_max; ++ reg = credit_refill | (credit_max << IXGBE_RTRPT4C_MCL_SHIFT); ++ ++ reg |= (u32)(p->bwg_id) << IXGBE_RTRPT4C_BWG_SHIFT; ++ ++ if (p->prio_type == prio_link) ++ reg |= IXGBE_RTRPT4C_LSP; ++ ++ IXGBE_WRITE_REG(hw, IXGBE_RTRPT4C(i), reg); ++ } ++ ++ /* ++ * Configure Rx packet plane (recycle mode; WSP) and ++ * enable arbiter ++ */ ++ reg = IXGBE_RTRPCS_RRM | IXGBE_RTRPCS_RAC; ++ IXGBE_WRITE_REG(hw, IXGBE_RTRPCS, reg); ++ ++ return 0; ++} ++ ++/** ++ * ixgbe_dcb_config_tx_desc_arbiter_82599 - Config Tx Desc. arbiter ++ * @hw: pointer to hardware structure ++ * @dcb_config: pointer to ixgbe_dcb_config structure ++ * ++ * Configure Tx Descriptor Arbiter and credits for each traffic class. ++ */ ++s32 ixgbe_dcb_config_tx_desc_arbiter_82599(struct ixgbe_hw *hw, ++ struct ixgbe_dcb_config *dcb_config) ++{ ++ struct tc_bw_alloc *p; ++ u32 reg, max_credits; ++ u8 i; ++ ++ /* ++ * Disable the arbiter before changing parameters ++ * (always enable recycle mode; WSP) ++ */ ++ reg = IXGBE_RTTDCS_TDPAC | IXGBE_RTTDCS_TDRM | IXGBE_RTTDCS_ARBDIS; ++ IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, reg); ++ ++ /* Clear the per-Tx queue credits; we use per-TC instead */ ++ for (i = 0; i < 128; i++) { ++ IXGBE_WRITE_REG(hw, IXGBE_RTTDQSEL, i); ++ IXGBE_WRITE_REG(hw, IXGBE_RTTDT1C, 0); ++ } ++ ++ /* Configure traffic class credits and priority */ ++ for (i = 0; i < MAX_TRAFFIC_CLASS; i++) { ++ p = &dcb_config->tc_config[i].path[DCB_TX_CONFIG]; ++ max_credits = dcb_config->tc_config[i].desc_credits_max; ++ reg = max_credits << IXGBE_RTTDT2C_MCL_SHIFT; ++ reg |= p->data_credits_refill; ++ reg |= (u32)(p->bwg_id) << IXGBE_RTTDT2C_BWG_SHIFT; ++ ++ if (p->prio_type == prio_group) ++ reg |= IXGBE_RTTDT2C_GSP; ++ ++ if (p->prio_type == prio_link) ++ reg |= IXGBE_RTTDT2C_LSP; ++ ++ IXGBE_WRITE_REG(hw, IXGBE_RTTDT2C(i), reg); ++ } ++ ++ /* ++ * Configure Tx descriptor plane (recycle mode; WSP) and ++ * enable arbiter ++ */ ++ reg = IXGBE_RTTDCS_TDPAC | IXGBE_RTTDCS_TDRM; ++ IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, reg); ++ ++ return 0; ++} ++ ++/** ++ * ixgbe_dcb_config_tx_data_arbiter_82599 - Config Tx Data arbiter ++ * @hw: pointer to hardware structure ++ * @dcb_config: pointer to ixgbe_dcb_config structure ++ * ++ * Configure Tx Packet Arbiter and credits for each traffic class. ++ */ ++s32 ixgbe_dcb_config_tx_data_arbiter_82599(struct ixgbe_hw *hw, ++ struct ixgbe_dcb_config *dcb_config) ++{ ++ struct tc_bw_alloc *p; ++ u32 reg; ++ u8 i; ++ ++ /* ++ * Disable the arbiter before changing parameters ++ * (always enable recycle mode; SP; arb delay) ++ */ ++ reg = IXGBE_RTTPCS_TPPAC | IXGBE_RTTPCS_TPRM | ++ (IXGBE_RTTPCS_ARBD_DCB << IXGBE_RTTPCS_ARBD_SHIFT) | ++ IXGBE_RTTPCS_ARBDIS; ++ IXGBE_WRITE_REG(hw, IXGBE_RTTPCS, reg); ++ ++ /* Map all traffic classes to their UP, 1 to 1 */ ++ reg = 0; ++ for (i = 0; i < MAX_TRAFFIC_CLASS; i++) ++ reg |= (i << (i * IXGBE_RTTUP2TC_UP_SHIFT)); ++ IXGBE_WRITE_REG(hw, IXGBE_RTTUP2TC, reg); ++ ++ /* Configure traffic class credits and priority */ ++ for (i = 0; i < MAX_TRAFFIC_CLASS; i++) { ++ p = &dcb_config->tc_config[i].path[DCB_TX_CONFIG]; ++ reg = p->data_credits_refill; ++ reg |= (u32)(p->data_credits_max) << IXGBE_RTTPT2C_MCL_SHIFT; ++ reg |= (u32)(p->bwg_id) << IXGBE_RTTPT2C_BWG_SHIFT; ++ ++ if (p->prio_type == prio_group) ++ reg |= IXGBE_RTTPT2C_GSP; ++ ++ if (p->prio_type == prio_link) ++ reg |= IXGBE_RTTPT2C_LSP; ++ ++ IXGBE_WRITE_REG(hw, IXGBE_RTTPT2C(i), reg); ++ } ++ ++ /* ++ * Configure Tx packet plane (recycle mode; SP; arb delay) and ++ * enable arbiter ++ */ ++ reg = IXGBE_RTTPCS_TPPAC | IXGBE_RTTPCS_TPRM | ++ (IXGBE_RTTPCS_ARBD_DCB << IXGBE_RTTPCS_ARBD_SHIFT); ++ IXGBE_WRITE_REG(hw, IXGBE_RTTPCS, reg); ++ ++ return 0; ++} ++ ++/** ++ * ixgbe_dcb_config_pfc_82599 - Configure priority flow control ++ * @hw: pointer to hardware structure ++ * @dcb_config: pointer to ixgbe_dcb_config structure ++ * ++ * Configure Priority Flow Control (PFC) for each traffic class. ++ */ ++s32 ixgbe_dcb_config_pfc_82599(struct ixgbe_hw *hw, ++ struct ixgbe_dcb_config *dcb_config) ++{ ++ u32 i, reg, rx_pba_size; ++ ++ /* If PFC is disabled globally then fall back to LFC. */ ++ if (!dcb_config->pfc_mode_enable) { ++ for (i = 0; i < MAX_TRAFFIC_CLASS; i++) ++ hw->mac.ops.fc_enable(hw, i); ++ goto out; ++ } ++ ++ /* Configure PFC Tx thresholds per TC */ ++ for (i = 0; i < MAX_TRAFFIC_CLASS; i++) { ++ if (dcb_config->rx_pba_cfg == pba_equal) ++ rx_pba_size = IXGBE_RXPBSIZE_64KB; ++ else ++ rx_pba_size = (i < 4) ? IXGBE_RXPBSIZE_80KB ++ : IXGBE_RXPBSIZE_48KB; ++ ++ reg = ((rx_pba_size >> 5) & 0xFFE0); ++ if (dcb_config->tc_config[i].dcb_pfc == pfc_enabled_full || ++ dcb_config->tc_config[i].dcb_pfc == pfc_enabled_tx) ++ reg |= IXGBE_FCRTL_XONE; ++ IXGBE_WRITE_REG(hw, IXGBE_FCRTL_82599(i), reg); ++ ++ reg = ((rx_pba_size >> 2) & 0xFFE0); ++ if (dcb_config->tc_config[i].dcb_pfc == pfc_enabled_full || ++ dcb_config->tc_config[i].dcb_pfc == pfc_enabled_tx) ++ reg |= IXGBE_FCRTH_FCEN; ++ IXGBE_WRITE_REG(hw, IXGBE_FCRTH_82599(i), reg); ++ } ++ ++ /* Configure pause time (2 TCs per register) */ ++ reg = hw->fc.pause_time | (hw->fc.pause_time << 16); ++ for (i = 0; i < (MAX_TRAFFIC_CLASS / 2); i++) ++ IXGBE_WRITE_REG(hw, IXGBE_FCTTV(i), reg); ++ ++ /* Configure flow control refresh threshold value */ ++ IXGBE_WRITE_REG(hw, IXGBE_FCRTV, hw->fc.pause_time / 2); ++ ++ /* Enable Transmit PFC */ ++ reg = IXGBE_FCCFG_TFCE_PRIORITY; ++ IXGBE_WRITE_REG(hw, IXGBE_FCCFG, reg); ++ ++ /* ++ * Enable Receive PFC ++ * We will always honor XOFF frames we receive when ++ * we are in PFC mode. ++ */ ++ reg = IXGBE_READ_REG(hw, IXGBE_MFLCN); ++ reg &= ~IXGBE_MFLCN_RFCE; ++ reg |= IXGBE_MFLCN_RPFCE; ++ IXGBE_WRITE_REG(hw, IXGBE_MFLCN, reg); ++out: ++ return 0; ++} ++ ++/** ++ * ixgbe_dcb_config_tc_stats_82599 - Config traffic class statistics ++ * @hw: pointer to hardware structure ++ * ++ * Configure queue statistics registers, all queues belonging to same traffic ++ * class uses a single set of queue statistics counters. ++ */ ++s32 ixgbe_dcb_config_tc_stats_82599(struct ixgbe_hw *hw) ++{ ++ u32 reg = 0; ++ u8 i = 0; ++ ++ /* ++ * Receive Queues stats setting ++ * 32 RQSMR registers, each configuring 4 queues. ++ * Set all 16 queues of each TC to the same stat ++ * with TC 'n' going to stat 'n'. ++ */ ++ for (i = 0; i < 32; i++) { ++ reg = 0x01010101 * (i / 4); ++ IXGBE_WRITE_REG(hw, IXGBE_RQSMR(i), reg); ++ } ++ /* ++ * Transmit Queues stats setting ++ * 32 TQSM registers, each controlling 4 queues. ++ * Set all queues of each TC to the same stat ++ * with TC 'n' going to stat 'n'. ++ * Tx queues are allocated non-uniformly to TCs: ++ * 32, 32, 16, 16, 8, 8, 8, 8. ++ */ ++ for (i = 0; i < 32; i++) { ++ if (i < 8) ++ reg = 0x00000000; ++ else if (i < 16) ++ reg = 0x01010101; ++ else if (i < 20) ++ reg = 0x02020202; ++ else if (i < 24) ++ reg = 0x03030303; ++ else if (i < 26) ++ reg = 0x04040404; ++ else if (i < 28) ++ reg = 0x05050505; ++ else if (i < 30) ++ reg = 0x06060606; ++ else ++ reg = 0x07070707; ++ IXGBE_WRITE_REG(hw, IXGBE_TQSM(i), reg); ++ } ++ ++ return 0; ++} ++ ++/** ++ * ixgbe_dcb_config_82599 - Configure general DCB parameters ++ * @hw: pointer to hardware structure ++ * @dcb_config: pointer to ixgbe_dcb_config structure ++ * ++ * Configure general DCB parameters. ++ */ ++s32 ixgbe_dcb_config_82599(struct ixgbe_hw *hw) ++{ ++ u32 reg; ++ u32 q; ++ ++ /* Disable the Tx desc arbiter so that MTQC can be changed */ ++ reg = IXGBE_READ_REG(hw, IXGBE_RTTDCS); ++ reg |= IXGBE_RTTDCS_ARBDIS; ++ IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, reg); ++ ++ /* Enable DCB for Rx with 8 TCs */ ++ reg = IXGBE_READ_REG(hw, IXGBE_MRQC); ++ switch (reg & IXGBE_MRQC_MRQE_MASK) { ++ case 0: ++ case IXGBE_MRQC_RT4TCEN: ++ /* RSS disabled cases */ ++ reg = (reg & ~IXGBE_MRQC_MRQE_MASK) | IXGBE_MRQC_RT8TCEN; ++ break; ++ case IXGBE_MRQC_RSSEN: ++ case IXGBE_MRQC_RTRSS4TCEN: ++ /* RSS enabled cases */ ++ reg = (reg & ~IXGBE_MRQC_MRQE_MASK) | IXGBE_MRQC_RTRSS8TCEN; ++ break; ++ default: ++ /* Unsupported value, assume stale data, overwrite no RSS */ ++ reg = (reg & ~IXGBE_MRQC_MRQE_MASK) | IXGBE_MRQC_RT8TCEN; ++ } ++ IXGBE_WRITE_REG(hw, IXGBE_MRQC, reg); ++ ++ /* Enable DCB for Tx with 8 TCs */ ++ reg = IXGBE_MTQC_RT_ENA | IXGBE_MTQC_8TC_8TQ; ++ IXGBE_WRITE_REG(hw, IXGBE_MTQC, reg); ++ ++ /* Disable drop for all queues */ ++ for (q=0; q < 128; q++) { ++ IXGBE_WRITE_REG(hw, IXGBE_QDE, q << IXGBE_QDE_IDX_SHIFT); ++ } ++ ++ /* Enable the Tx desc arbiter */ ++ reg = IXGBE_READ_REG(hw, IXGBE_RTTDCS); ++ reg &= ~IXGBE_RTTDCS_ARBDIS; ++ IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, reg); ++ ++ return 0; ++} ++ ++/** ++ * ixgbe_dcb_hw_config_82599 - Configure and enable DCB ++ * @hw: pointer to hardware structure ++ * @dcb_config: pointer to ixgbe_dcb_config structure ++ * ++ * Configure dcb settings and enable dcb mode. ++ */ ++s32 ixgbe_dcb_hw_config_82599(struct ixgbe_hw *hw, ++ struct ixgbe_dcb_config *dcb_config) ++{ ++ u32 pap = 0; ++ ++ ixgbe_dcb_config_packet_buffers_82599(hw, dcb_config); ++ ixgbe_dcb_config_82599(hw); ++ ixgbe_dcb_config_rx_arbiter_82599(hw, dcb_config); ++ ixgbe_dcb_config_tx_desc_arbiter_82599(hw, dcb_config); ++ ixgbe_dcb_config_tx_data_arbiter_82599(hw, dcb_config); ++ ixgbe_dcb_config_pfc_82599(hw, dcb_config); ++ ixgbe_dcb_config_tc_stats_82599(hw); ++ ++ /* ++ * TODO: For DCB SV purpose only, ++ * remove it before product release ++ */ ++ if (dcb_config->link_speed > 0 && dcb_config->link_speed <= 9) { ++ pap = IXGBE_READ_REG(hw, IXGBE_PAP); ++ pap |= (dcb_config->link_speed << 16); ++ IXGBE_WRITE_REG(hw, IXGBE_PAP, pap); ++ } ++ ++ return 0; ++} ++ +diff -r 3e5bbd731d89 drivers/net/ixgbe/ixgbe_dcb_82599.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/ixgbe/ixgbe_dcb_82599.h Mon Jun 15 12:06:28 2009 +0100 +@@ -0,0 +1,125 @@ ++/******************************************************************************* ++ ++ Intel 10 Gigabit PCI Express Linux driver ++ Copyright(c) 1999 - 2009 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++#ifndef _DCB_82599_CONFIG_H_ ++#define _DCB_82599_CONFIG_H_ ++ ++/* DCB register definitions */ ++#define IXGBE_RTTDCS_TDPAC 0x00000001 /* 0 Round Robin, ++ * 1 WSP - Weighted Strict Priority ++ */ ++#define IXGBE_RTTDCS_VMPAC 0x00000002 /* 0 Round Robin, ++ * 1 WRR - Weighted Round Robin ++ */ ++#define IXGBE_RTTDCS_TDRM 0x00000010 /* Transmit Recycle Mode */ ++#define IXGBE_RTTDCS_BDPM 0x00400000 /* Bypass Data Pipe - must clear! */ ++#define IXGBE_RTTDCS_BPBFSM 0x00800000 /* Bypass PB Free Space - must ++ * clear! ++ */ ++#define IXGBE_RTTDCS_SPEED_CHG 0x80000000 /* Link speed change */ ++ ++/* Receive UP2TC mapping */ ++#define IXGBE_RTRUP2TC_UP_SHIFT 3 ++/* Transmit UP2TC mapping */ ++#define IXGBE_RTTUP2TC_UP_SHIFT 3 ++ ++#define IXGBE_RTRPT4C_MCL_SHIFT 12 /* Offset to Max Credit Limit setting */ ++#define IXGBE_RTRPT4C_BWG_SHIFT 9 /* Offset to BWG index */ ++#define IXGBE_RTRPT4C_GSP 0x40000000 /* GSP enable bit */ ++#define IXGBE_RTRPT4C_LSP 0x80000000 /* LSP enable bit */ ++ ++#define IXGBE_RDRXCTL_MPBEN 0x00000010 /* DMA config for multiple packet ++ * buffers enable ++ */ ++#define IXGBE_RDRXCTL_MCEN 0x00000040 /* DMA config for multiple cores ++ * (RSS) enable ++ */ ++ ++/* RTRPCS Bit Masks */ ++#define IXGBE_RTRPCS_RRM 0x00000002 /* Receive Recycle Mode enable */ ++/* Receive Arbitration Control: 0 Round Robin, 1 DFP */ ++#define IXGBE_RTRPCS_RAC 0x00000004 ++#define IXGBE_RTRPCS_ARBDIS 0x00000040 /* Arbitration disable bit */ ++ ++/* RTTDT2C Bit Masks */ ++#define IXGBE_RTTDT2C_MCL_SHIFT 12 ++#define IXGBE_RTTDT2C_BWG_SHIFT 9 ++#define IXGBE_RTTDT2C_GSP 0x40000000 ++#define IXGBE_RTTDT2C_LSP 0x80000000 ++ ++#define IXGBE_RTTPT2C_MCL_SHIFT 12 ++#define IXGBE_RTTPT2C_BWG_SHIFT 9 ++#define IXGBE_RTTPT2C_GSP 0x40000000 ++#define IXGBE_RTTPT2C_LSP 0x80000000 ++ ++/* RTTPCS Bit Masks */ ++#define IXGBE_RTTPCS_TPPAC 0x00000020 /* 0 Round Robin, ++ * 1 SP - Strict Priority ++ */ ++#define IXGBE_RTTPCS_ARBDIS 0x00000040 /* Arbiter disable */ ++#define IXGBE_RTTPCS_TPRM 0x00000100 /* Transmit Recycle Mode enable */ ++#define IXGBE_RTTPCS_ARBD_SHIFT 22 ++#define IXGBE_RTTPCS_ARBD_DCB 0x4 /* Arbitration delay in DCB mode */ ++ ++#define IXGBE_TXPBSIZE_20KB 0x00005000 /* 20KB Packet Buffer */ ++#define IXGBE_TXPBSIZE_40KB 0x0000A000 /* 40KB Packet Buffer */ ++#define IXGBE_RXPBSIZE_48KB 0x0000C000 /* 48KB Packet Buffer */ ++#define IXGBE_RXPBSIZE_64KB 0x00010000 /* 64KB Packet Buffer */ ++#define IXGBE_RXPBSIZE_80KB 0x00014000 /* 80KB Packet Buffer */ ++#define IXGBE_RXPBSIZE_128KB 0x00020000 /* 128KB Packet Buffer */ ++ ++#define IXGBE_TXPBTHRESH_DCB 0xA /* THRESH value for DCB mode */ ++ ++ ++/* DCB hardware-specific driver APIs */ ++ ++/* DCB PFC functions */ ++s32 ixgbe_dcb_config_pfc_82599(struct ixgbe_hw *hw, ++ struct ixgbe_dcb_config *dcb_config); ++s32 ixgbe_dcb_get_pfc_stats_82599(struct ixgbe_hw *hw, ++ struct ixgbe_hw_stats *stats, ++ u8 tc_count); ++ ++/* DCB traffic class stats */ ++s32 ixgbe_dcb_config_tc_stats_82599(struct ixgbe_hw *hw); ++s32 ixgbe_dcb_get_tc_stats_82599(struct ixgbe_hw *hw, ++ struct ixgbe_hw_stats *stats, ++ u8 tc_count); ++ ++/* DCB config arbiters */ ++s32 ixgbe_dcb_config_tx_desc_arbiter_82599(struct ixgbe_hw *hw, ++ struct ixgbe_dcb_config *dcb_config); ++s32 ixgbe_dcb_config_tx_data_arbiter_82599(struct ixgbe_hw *hw, ++ struct ixgbe_dcb_config *dcb_config); ++s32 ixgbe_dcb_config_rx_arbiter_82599(struct ixgbe_hw *hw, ++ struct ixgbe_dcb_config *dcb_config); ++ ++/* DCB hw initialization */ ++s32 ixgbe_dcb_hw_config_82599(struct ixgbe_hw *hw, ++ struct ixgbe_dcb_config *config); ++ ++#endif /* _DCB_82599_CONFIG_H */ +diff -r 3e5bbd731d89 drivers/net/ixgbe/ixgbe_dcb_nl.c +--- a/drivers/net/ixgbe/ixgbe_dcb_nl.c Mon Jun 15 12:00:22 2009 +0100 ++++ b/drivers/net/ixgbe/ixgbe_dcb_nl.c Mon Jun 15 12:06:28 2009 +0100 +@@ -1,7 +1,7 @@ + /******************************************************************************* + + Intel 10 Gigabit PCI Express Linux driver +- Copyright(c) 1999 - 2008 Intel Corporation. ++ Copyright(c) 1999 - 2009 Intel Corporation. + + This program is free software; you can redistribute it and/or modify it + under the terms and conditions of the GNU General Public License, +@@ -20,22 +20,256 @@ + the file called "COPYING". + + Contact Information: +- Linux NICS + e1000-devel Mailing List + Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 + + *******************************************************************************/ + + #include "ixgbe.h" ++ ++#ifdef CONFIG_DCB + #include ++#include "ixgbe_dcb_82598.h" ++#include "ixgbe_dcb_82599.h" ++#else ++#include ++#include ++#include ++#include ++#endif + + /* Callbacks for DCB netlink in the kernel */ +-#define BIT_DCB_MODE 0x01 +-#define BIT_PFC 0x02 +-#define BIT_PG_RX 0x04 +-#define BIT_PG_TX 0x08 +-#define BIT_BCN 0x10 ++#define BIT_DCB_MODE 0x01 ++#define BIT_PFC 0x02 ++#define BIT_PG_RX 0x04 ++#define BIT_PG_TX 0x08 ++#define BIT_RESETLINK 0x40 ++#define BIT_LINKSPEED 0x80 + ++/* Responses for the DCB_C_SET_ALL command */ ++#define DCB_HW_CHG_RST 0 /* DCB configuration changed with reset */ ++#define DCB_NO_HW_CHG 1 /* DCB configuration did not change */ ++#define DCB_HW_CHG 2 /* DCB configuration changed, no reset */ ++ ++#ifndef CONFIG_DCB ++/* DCB configuration commands */ ++enum { ++ DCB_C_UNDEFINED, ++ DCB_C_GSTATE, ++ DCB_C_SSTATE, ++ DCB_C_PG_STATS, ++ DCB_C_PGTX_GCFG, ++ DCB_C_PGTX_SCFG, ++ DCB_C_PGRX_GCFG, ++ DCB_C_PGRX_SCFG, ++ DCB_C_PFC_GCFG, ++ DCB_C_PFC_SCFG, ++ DCB_C_PFC_STATS, ++ DCB_C_GLINK_SPD, ++ DCB_C_SLINK_SPD, ++ DCB_C_SET_ALL, ++ DCB_C_GPERM_HWADDR, ++ __DCB_C_ENUM_MAX, ++}; ++ ++#define IXGBE_DCB_C_MAX (__DCB_C_ENUM_MAX - 1) ++ ++/* DCB configuration attributes */ ++enum { ++ DCB_A_UNDEFINED = 0, ++ DCB_A_IFNAME, ++ DCB_A_STATE, ++ DCB_A_PFC_STATS, ++ DCB_A_PFC_CFG, ++ DCB_A_PG_STATS, ++ DCB_A_PG_CFG, ++ DCB_A_LINK_SPD, ++ DCB_A_SET_ALL, ++ DCB_A_PERM_HWADDR, ++ __DCB_A_ENUM_MAX, ++}; ++ ++#define IXGBE_DCB_A_MAX (__DCB_A_ENUM_MAX - 1) ++ ++/* PERM HWADDR attributes */ ++enum { ++ PERM_HW_A_UNDEFINED, ++ PERM_HW_A_0, ++ PERM_HW_A_1, ++ PERM_HW_A_2, ++ PERM_HW_A_3, ++ PERM_HW_A_4, ++ PERM_HW_A_5, ++ PERM_HW_A_ALL, ++ __PERM_HW_A_ENUM_MAX, ++}; ++ ++#define IXGBE_DCB_PERM_HW_A_MAX (__PERM_HW_A_ENUM_MAX - 1) ++ ++/* PFC configuration attributes */ ++enum { ++ PFC_A_UP_UNDEFINED, ++ PFC_A_UP_0, ++ PFC_A_UP_1, ++ PFC_A_UP_2, ++ PFC_A_UP_3, ++ PFC_A_UP_4, ++ PFC_A_UP_5, ++ PFC_A_UP_6, ++ PFC_A_UP_7, ++ PFC_A_UP_MAX, /* Used as an iterator cap */ ++ PFC_A_UP_ALL, ++ __PFC_A_UP_ENUM_MAX, ++}; ++ ++#define IXGBE_DCB_PFC_A_UP_MAX (__PFC_A_UP_ENUM_MAX - 1) ++ ++/* Priority Group Traffic Class and Bandwidth Group ++ * configuration attributes ++ */ ++enum { ++ PG_A_UNDEFINED, ++ PG_A_TC_0, ++ PG_A_TC_1, ++ PG_A_TC_2, ++ PG_A_TC_3, ++ PG_A_TC_4, ++ PG_A_TC_5, ++ PG_A_TC_6, ++ PG_A_TC_7, ++ PG_A_TC_MAX, /* Used as an iterator cap */ ++ PG_A_TC_ALL, ++ PG_A_BWG_0, ++ PG_A_BWG_1, ++ PG_A_BWG_2, ++ PG_A_BWG_3, ++ PG_A_BWG_4, ++ PG_A_BWG_5, ++ PG_A_BWG_6, ++ PG_A_BWG_7, ++ PG_A_BWG_MAX, /* Used as an iterator cap */ ++ PG_A_BWG_ALL, ++ __PG_A_ENUM_MAX, ++}; ++ ++#define IXGBE_DCB_PG_A_MAX (__PG_A_ENUM_MAX - 1) ++ ++enum { ++ TC_A_PARAM_UNDEFINED, ++ TC_A_PARAM_STRICT_PRIO, ++ TC_A_PARAM_BW_GROUP_ID, ++ TC_A_PARAM_BW_PCT_IN_GROUP, ++ TC_A_PARAM_UP_MAPPING, ++ TC_A_PARAM_MAX, /* Used as an iterator cap */ ++ TC_A_PARAM_ALL, ++ __TC_A_PARAM_ENUM_MAX, ++}; ++ ++#define IXGBE_DCB_TC_A_PARAM_MAX (__TC_A_PARAM_ENUM_MAX - 1) ++ ++#define DCB_PROTO_VERSION 0x1 ++#define is_pci_device(dev) ((dev)->bus == &pci_bus_type) ++ ++static struct genl_family dcb_family = { ++ .id = GENL_ID_GENERATE, ++ .hdrsize = 0, ++ .name = "IXGBE_DCB", ++ .version = DCB_PROTO_VERSION, ++ .maxattr = IXGBE_DCB_A_MAX, ++}; ++ ++/* DCB NETLINK attributes policy */ ++static struct nla_policy dcb_genl_policy[IXGBE_DCB_A_MAX + 1] = { ++ [DCB_A_IFNAME] = {.type = NLA_STRING, .len = IFNAMSIZ - 1}, ++ [DCB_A_STATE] = {.type = NLA_U8}, ++ [DCB_A_PG_CFG] = {.type = NLA_NESTED}, ++ [DCB_A_PFC_CFG] = {.type = NLA_NESTED}, ++ [DCB_A_PFC_STATS] = {.type = NLA_NESTED}, ++ [DCB_A_PG_STATS] = {.type = NLA_NESTED}, ++ [DCB_A_LINK_SPD] = {.type = NLA_U8}, ++ [DCB_A_SET_ALL] = {.type = NLA_U8}, ++ [DCB_A_PERM_HWADDR] = {.type = NLA_NESTED}, ++}; ++ ++/* DCB_A_PERM_HWADDR nested attributes... an array. */ ++static struct nla_policy dcb_perm_hwaddr_nest[IXGBE_DCB_PERM_HW_A_MAX + 1] = { ++ [PERM_HW_A_0] = {.type = NLA_U8}, ++ [PERM_HW_A_1] = {.type = NLA_U8}, ++ [PERM_HW_A_2] = {.type = NLA_U8}, ++ [PERM_HW_A_3] = {.type = NLA_U8}, ++ [PERM_HW_A_4] = {.type = NLA_U8}, ++ [PERM_HW_A_5] = {.type = NLA_U8}, ++ [PERM_HW_A_ALL] = {.type = NLA_FLAG}, ++}; ++ ++/* DCB_A_PFC_CFG nested attributes...like an array. */ ++static struct nla_policy dcb_pfc_up_nest[IXGBE_DCB_PFC_A_UP_MAX + 1] = { ++ [PFC_A_UP_0] = {.type = NLA_U8}, ++ [PFC_A_UP_1] = {.type = NLA_U8}, ++ [PFC_A_UP_2] = {.type = NLA_U8}, ++ [PFC_A_UP_3] = {.type = NLA_U8}, ++ [PFC_A_UP_4] = {.type = NLA_U8}, ++ [PFC_A_UP_5] = {.type = NLA_U8}, ++ [PFC_A_UP_6] = {.type = NLA_U8}, ++ [PFC_A_UP_7] = {.type = NLA_U8}, ++ [PFC_A_UP_ALL] = {.type = NLA_FLAG}, ++}; ++ ++/* DCB_A_PG_CFG nested attributes...like a struct. */ ++static struct nla_policy dcb_pg_nest[IXGBE_DCB_PG_A_MAX + 1] = { ++ [PG_A_TC_0] = {.type = NLA_NESTED}, ++ [PG_A_TC_1] = {.type = NLA_NESTED}, ++ [PG_A_TC_2] = {.type = NLA_NESTED}, ++ [PG_A_TC_3] = {.type = NLA_NESTED}, ++ [PG_A_TC_4] = {.type = NLA_NESTED}, ++ [PG_A_TC_5] = {.type = NLA_NESTED}, ++ [PG_A_TC_6] = {.type = NLA_NESTED}, ++ [PG_A_TC_7] = {.type = NLA_NESTED}, ++ [PG_A_TC_ALL] = {.type = NLA_NESTED}, ++ [PG_A_BWG_0] = {.type = NLA_U8}, ++ [PG_A_BWG_1] = {.type = NLA_U8}, ++ [PG_A_BWG_2] = {.type = NLA_U8}, ++ [PG_A_BWG_3] = {.type = NLA_U8}, ++ [PG_A_BWG_4] = {.type = NLA_U8}, ++ [PG_A_BWG_5] = {.type = NLA_U8}, ++ [PG_A_BWG_6] = {.type = NLA_U8}, ++ [PG_A_BWG_7] = {.type = NLA_U8}, ++ [PG_A_BWG_ALL]= {.type = NLA_FLAG}, ++}; ++ ++/* TC_A_CLASS_X nested attributes. */ ++static struct nla_policy dcb_tc_param_nest[IXGBE_DCB_TC_A_PARAM_MAX + 1] = { ++ [TC_A_PARAM_STRICT_PRIO] = {.type = NLA_U8}, ++ [TC_A_PARAM_BW_GROUP_ID] = {.type = NLA_U8}, ++ [TC_A_PARAM_BW_PCT_IN_GROUP] = {.type = NLA_U8}, ++ [TC_A_PARAM_UP_MAPPING] = {.type = NLA_U8}, ++ [TC_A_PARAM_ALL] = {.type = NLA_FLAG}, ++}; ++ ++static int ixgbe_dcb_check_adapter(struct net_device *netdev) ++{ ++ struct device *busdev; ++ struct pci_dev *pcidev; ++ ++ busdev = netdev->dev.parent; ++ if (!busdev) ++ return -EINVAL; ++ ++ if (!is_pci_device(busdev)) ++ return -EINVAL; ++ ++ pcidev = to_pci_dev(busdev); ++ if (!pcidev) ++ return -EINVAL; ++ ++ if (ixgbe_is_ixgbe(pcidev)) ++ return 0; ++ else ++ return -EINVAL; ++} ++#endif ++ ++#ifdef CONFIG_DCB + int ixgbe_copy_dcb_cfg(struct ixgbe_dcb_config *src_dcb_cfg, + struct ixgbe_dcb_config *dst_dcb_cfg, int tc_max) + { +@@ -88,29 +322,100 @@ + dst_dcb_cfg->tc_config[i - DCB_PFC_UP_ATTR_0].dcb_pfc = + src_dcb_cfg->tc_config[i - DCB_PFC_UP_ATTR_0].dcb_pfc; + } ++ dst_dcb_cfg->pfc_mode_enable = src_dcb_cfg->pfc_mode_enable; + +- for (i = DCB_BCN_ATTR_RP_0; i < DCB_BCN_ATTR_RP_ALL; i++) { +- dst_dcb_cfg->bcn.rp_admin_mode[i - DCB_BCN_ATTR_RP_0] = +- src_dcb_cfg->bcn.rp_admin_mode[i - DCB_BCN_ATTR_RP_0]; ++ return 0; ++} ++#else ++static int ixgbe_copy_dcb_cfg(struct ixgbe_dcb_config *src_dcb_cfg, ++ struct ixgbe_dcb_config *dst_dcb_cfg, int tc_max) ++{ ++ struct tc_configuration *src_tc_cfg = NULL; ++ struct tc_configuration *dst_tc_cfg = NULL; ++ int i; ++ ++ if (!src_dcb_cfg || !dst_dcb_cfg) ++ return -EINVAL; ++ ++ dst_dcb_cfg->link_speed = src_dcb_cfg->link_speed; ++ ++ for (i = PG_A_TC_0; i < tc_max + PG_A_TC_0; i++) { ++ src_tc_cfg = &src_dcb_cfg->tc_config[i - PG_A_TC_0]; ++ dst_tc_cfg = &dst_dcb_cfg->tc_config[i - PG_A_TC_0]; ++ ++ dst_tc_cfg->path[DCB_TX_CONFIG].prio_type = ++ src_tc_cfg->path[DCB_TX_CONFIG].prio_type; ++ ++ dst_tc_cfg->path[DCB_TX_CONFIG].bwg_id = ++ src_tc_cfg->path[DCB_TX_CONFIG].bwg_id; ++ ++ dst_tc_cfg->path[DCB_TX_CONFIG].bwg_percent = ++ src_tc_cfg->path[DCB_TX_CONFIG].bwg_percent; ++ ++ dst_tc_cfg->path[DCB_TX_CONFIG].up_to_tc_bitmap = ++ src_tc_cfg->path[DCB_TX_CONFIG].up_to_tc_bitmap; ++ ++ dst_tc_cfg->path[DCB_RX_CONFIG].prio_type = ++ src_tc_cfg->path[DCB_RX_CONFIG].prio_type; ++ ++ dst_tc_cfg->path[DCB_RX_CONFIG].bwg_id = ++ src_tc_cfg->path[DCB_RX_CONFIG].bwg_id; ++ ++ dst_tc_cfg->path[DCB_RX_CONFIG].bwg_percent = ++ src_tc_cfg->path[DCB_RX_CONFIG].bwg_percent; ++ ++ dst_tc_cfg->path[DCB_RX_CONFIG].up_to_tc_bitmap = ++ src_tc_cfg->path[DCB_RX_CONFIG].up_to_tc_bitmap; + } +- dst_dcb_cfg->bcn.bcna_option[0] = src_dcb_cfg->bcn.bcna_option[0]; +- dst_dcb_cfg->bcn.bcna_option[1] = src_dcb_cfg->bcn.bcna_option[1]; +- dst_dcb_cfg->bcn.rp_alpha = src_dcb_cfg->bcn.rp_alpha; +- dst_dcb_cfg->bcn.rp_beta = src_dcb_cfg->bcn.rp_beta; +- dst_dcb_cfg->bcn.rp_gd = src_dcb_cfg->bcn.rp_gd; +- dst_dcb_cfg->bcn.rp_gi = src_dcb_cfg->bcn.rp_gi; +- dst_dcb_cfg->bcn.rp_tmax = src_dcb_cfg->bcn.rp_tmax; +- dst_dcb_cfg->bcn.rp_td = src_dcb_cfg->bcn.rp_td; +- dst_dcb_cfg->bcn.rp_rmin = src_dcb_cfg->bcn.rp_rmin; +- dst_dcb_cfg->bcn.rp_w = src_dcb_cfg->bcn.rp_w; +- dst_dcb_cfg->bcn.rp_rd = src_dcb_cfg->bcn.rp_rd; +- dst_dcb_cfg->bcn.rp_ru = src_dcb_cfg->bcn.rp_ru; +- dst_dcb_cfg->bcn.rp_wrtt = src_dcb_cfg->bcn.rp_wrtt; +- dst_dcb_cfg->bcn.rp_ri = src_dcb_cfg->bcn.rp_ri; ++ ++ for (i = PG_A_BWG_0; i < PG_A_BWG_MAX; i++) { ++ dst_dcb_cfg->bw_percentage[DCB_TX_CONFIG][i - PG_A_BWG_0] = ++ src_dcb_cfg->bw_percentage[DCB_TX_CONFIG][i - PG_A_BWG_0]; ++ dst_dcb_cfg->bw_percentage[DCB_RX_CONFIG][i - PG_A_BWG_0] = ++ src_dcb_cfg->bw_percentage[DCB_RX_CONFIG][i - PG_A_BWG_0]; ++ } ++ ++ for (i = PFC_A_UP_0; i < PFC_A_UP_MAX; i++) { ++ dst_dcb_cfg->tc_config[i - PFC_A_UP_0].dcb_pfc = ++ src_dcb_cfg->tc_config[i - PFC_A_UP_0].dcb_pfc; ++ } + + return 0; + } + ++static int ixgbe_nl_reply(u8 value, u8 cmd, u8 attr, struct genl_info *info) ++{ ++ struct sk_buff *dcb_skb = NULL; ++ void *data; ++ int ret; ++ ++ dcb_skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); ++ if (!dcb_skb) ++ return -EINVAL; ++ ++ data = genlmsg_put_reply(dcb_skb, info, &dcb_family, 0, cmd); ++ if (!data) ++ goto err; ++ ++ ret = nla_put_u8(dcb_skb, attr, value); ++ if (ret) ++ goto err; ++ ++ /* end the message, assign the nlmsg_len. */ ++ genlmsg_end(dcb_skb, data); ++ ret = genlmsg_reply(dcb_skb, info); ++ if (ret) ++ goto err; ++ ++ return 0; ++ ++err: ++ kfree(dcb_skb); ++ return -EINVAL; ++} ++#endif ++ ++#ifdef CONFIG_DCB + static u8 ixgbe_dcbnl_get_state(struct net_device *netdev) + { + struct ixgbe_adapter *adapter = netdev_priv(netdev); +@@ -120,79 +425,400 @@ + return !!(adapter->flags & IXGBE_FLAG_DCB_ENABLED); + } + +-static u16 ixgbe_dcb_select_queue(struct net_device *dev, struct sk_buff *skb) +-{ +- /* All traffic should default to class 0 */ +- return 0; +-} +- + static u8 ixgbe_dcbnl_set_state(struct net_device *netdev, u8 state) + { ++ u8 err = 0; + struct ixgbe_adapter *adapter = netdev_priv(netdev); + + DPRINTK(DRV, INFO, "Set DCB Admin Mode.\n"); + + if (state > 0) { + /* Turn on DCB */ +- if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) { +- return 0; +- } ++ if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) ++ goto out; + + if (!(adapter->flags & IXGBE_FLAG_MSIX_ENABLED)) { +- DPRINTK(DRV, ERR, "Enable Failed, needs MSI-X\n"); +- return 1; +- } ++ DPRINTK(DRV, ERR, "Enable failed, needs MSI-X\n"); ++ err = 1; ++ goto out; ++ } + + if (netif_running(netdev)) ++#ifdef HAVE_NET_DEVICE_OPS ++ netdev->netdev_ops->ndo_stop(netdev); ++#else + netdev->stop(netdev); +- ixgbe_reset_interrupt_capability(adapter); +- ixgbe_napi_del_all(adapter); +- kfree(adapter->tx_ring); +- kfree(adapter->rx_ring); +- adapter->tx_ring = NULL; +- adapter->rx_ring = NULL; +- netdev->select_queue = &ixgbe_dcb_select_queue; +- ++#endif ++ ixgbe_clear_interrupt_scheme(adapter); ++ if (adapter->hw.mac.type == ixgbe_mac_82598EB) { ++ adapter->last_lfc_mode = adapter->hw.fc.current_mode; ++ adapter->hw.fc.requested_mode = ixgbe_fc_none; ++ } + adapter->flags &= ~IXGBE_FLAG_RSS_ENABLED; ++ if (adapter->hw.mac.type == ixgbe_mac_82599EB) { ++ DPRINTK(DRV, INFO, "DCB enabled, " ++ "disabling Flow Director\n"); ++ adapter->flags &= ~IXGBE_FLAG_FDIR_HASH_CAPABLE; ++ adapter->flags &= ~IXGBE_FLAG_FDIR_PERFECT_CAPABLE; ++ } + adapter->flags |= IXGBE_FLAG_DCB_ENABLED; + ixgbe_init_interrupt_scheme(adapter); +- ixgbe_napi_add_all(adapter); + if (netif_running(netdev)) ++#ifdef HAVE_NET_DEVICE_OPS ++ netdev->netdev_ops->ndo_open(netdev); ++#else + netdev->open(netdev); ++#endif + } else { + /* Turn off DCB */ + if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) { + if (netif_running(netdev)) ++#ifdef HAVE_NET_DEVICE_OPS ++ netdev->netdev_ops->ndo_stop(netdev); ++#else + netdev->stop(netdev); +- ixgbe_reset_interrupt_capability(adapter); +- ixgbe_napi_del_all(adapter); +- kfree(adapter->tx_ring); +- kfree(adapter->rx_ring); +- adapter->tx_ring = NULL; +- adapter->rx_ring = NULL; +- netdev->select_queue = NULL; +- ++#endif ++ ixgbe_clear_interrupt_scheme(adapter); ++ adapter->hw.fc.requested_mode = adapter->last_lfc_mode; ++ adapter->temp_dcb_cfg.pfc_mode_enable = false; ++ adapter->dcb_cfg.pfc_mode_enable = false; + adapter->flags &= ~IXGBE_FLAG_DCB_ENABLED; + adapter->flags |= IXGBE_FLAG_RSS_ENABLED; + ixgbe_init_interrupt_scheme(adapter); +- ixgbe_napi_add_all(adapter); + if (netif_running(netdev)) ++#ifdef HAVE_NET_DEVICE_OPS ++ netdev->netdev_ops->ndo_open(netdev); ++#else + netdev->open(netdev); ++#endif + } + } +- return 0; ++out: ++ return err; ++} ++#else ++static int ixgbe_dcb_gstate(struct sk_buff *skb, struct genl_info *info) ++{ ++ int ret = -ENOMEM; ++ struct net_device *netdev = NULL; ++ struct ixgbe_adapter *adapter = NULL; ++ ++ if (!info->attrs[DCB_A_IFNAME]) ++ return -EINVAL; ++ ++ netdev = dev_get_by_name(&init_net, ++ nla_data(info->attrs[DCB_A_IFNAME])); ++ if (!netdev) ++ return -EINVAL; ++ ++ ret = ixgbe_dcb_check_adapter(netdev); ++ if (ret) ++ goto err_out; ++ else ++ adapter = netdev_priv(netdev); ++ ++ ret = ixgbe_nl_reply(!!(adapter->flags & IXGBE_FLAG_DCB_ENABLED), ++ DCB_C_GSTATE, DCB_A_STATE, info); ++ if (ret) ++ goto err_out; ++ ++ DPRINTK(DRV, INFO, "Get DCB Admin Mode.\n"); ++ ++err_out: ++ dev_put(netdev); ++ return ret; + } + ++static int ixgbe_dcb_sstate(struct sk_buff *skb, struct genl_info *info) ++{ ++ struct net_device *netdev = NULL; ++ struct ixgbe_adapter *adapter = NULL; ++ int ret = -EINVAL; ++ u8 value; ++ ++ if (!info->attrs[DCB_A_IFNAME] || !info->attrs[DCB_A_STATE]) ++ goto err; ++ ++ netdev = dev_get_by_name(&init_net, ++ nla_data(info->attrs[DCB_A_IFNAME])); ++ if (!netdev) ++ goto err; ++ ++ ret = ixgbe_dcb_check_adapter(netdev); ++ if (ret) ++ goto err_out; ++ else ++ adapter = netdev_priv(netdev); ++ ++ value = nla_get_u8(info->attrs[DCB_A_STATE]); ++ if ((value & 1) != value) { ++ DPRINTK(DRV, INFO, "Value is not 1 or 0, it is %d.\n", value); ++ } else { ++ switch (value) { ++ case 0: ++ if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) { ++ if (netdev->flags & IFF_UP) ++#ifdef HAVE_NET_DEVICE_OPS ++ netdev->netdev_ops->ndo_stop(netdev); ++#else ++ netdev->stop(netdev); ++#endif ++ ixgbe_clear_interrupt_scheme(adapter); ++ ++ adapter->flags &= ~IXGBE_FLAG_DCB_ENABLED; ++ if (adapter->flags & IXGBE_FLAG_RSS_CAPABLE) ++ adapter->flags |= ++ IXGBE_FLAG_RSS_ENABLED; ++ ixgbe_init_interrupt_scheme(adapter); ++ ixgbe_reset(adapter); ++ if (netdev->flags & IFF_UP) ++#ifdef HAVE_NET_DEVICE_OPS ++ netdev->netdev_ops->ndo_open(netdev); ++#else ++ netdev->open(netdev); ++#endif ++ break; ++ } else { ++ /* Nothing to do, already off */ ++ goto out; ++ } ++ case 1: ++ if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) { ++ /* Nothing to do, already on */ ++ goto out; ++ } else if (!(adapter->flags & IXGBE_FLAG_DCB_CAPABLE)) { ++ DPRINTK(DRV, ERR, "Enable failed. Make sure " ++ "the driver can enable MSI-X.\n"); ++ ret = -EINVAL; ++ goto err_out; ++ } else { ++ if (netdev->flags & IFF_UP) ++#ifdef HAVE_NET_DEVICE_OPS ++ netdev->netdev_ops->ndo_stop(netdev); ++#else ++ netdev->stop(netdev); ++#endif ++ ixgbe_clear_interrupt_scheme(adapter); ++ ++ adapter->flags &= ~IXGBE_FLAG_RSS_ENABLED; ++ adapter->flags |= IXGBE_FLAG_DCB_ENABLED; ++ adapter->dcb_cfg.support.capabilities = ++ (IXGBE_DCB_PG_SUPPORT | IXGBE_DCB_PFC_SUPPORT | ++ IXGBE_DCB_GSP_SUPPORT); ++ if (adapter->hw.mac.type == ixgbe_mac_82599EB) { ++ DPRINTK(DRV, INFO, "DCB enabled, " ++ "disabling Flow Director\n"); ++ adapter->flags &= ++ ~IXGBE_FLAG_FDIR_HASH_CAPABLE; ++ adapter->flags &= ++ ~IXGBE_FLAG_FDIR_PERFECT_CAPABLE; ++ adapter->dcb_cfg.support.capabilities |= ++ IXGBE_DCB_UP2TC_SUPPORT; ++ } ++ adapter->ring_feature[RING_F_DCB].indices = 8; ++ ixgbe_init_interrupt_scheme(adapter); ++ ixgbe_reset(adapter); ++ if (netdev->flags & IFF_UP) ++#ifdef HAVE_NET_DEVICE_OPS ++ netdev->netdev_ops->ndo_open(netdev); ++#else ++ netdev->open(netdev); ++#endif ++ break; ++ } ++ } ++ } ++ ++out: ++ ret = ixgbe_nl_reply(0, DCB_C_SSTATE, DCB_A_STATE, info); ++ if (ret) ++ goto err_out; ++ ++ DPRINTK(DRV, INFO, "Set DCB Admin Mode.\n"); ++ ++err_out: ++ dev_put(netdev); ++err: ++ return ret; ++} ++ ++static int ixgbe_dcb_glink_spd(struct sk_buff *skb, struct genl_info *info) ++{ ++ int ret = -ENOMEM; ++ struct net_device *netdev = NULL; ++ struct ixgbe_adapter *adapter = NULL; ++ ++ if (!info->attrs[DCB_A_IFNAME]) ++ return -EINVAL; ++ ++ netdev = dev_get_by_name(&init_net, ++ nla_data(info->attrs[DCB_A_IFNAME])); ++ if (!netdev) ++ return -EINVAL; ++ ++ ret = ixgbe_dcb_check_adapter(netdev); ++ if (ret) ++ goto err_out; ++ else ++ adapter = netdev_priv(netdev); ++ ++ ret = ixgbe_nl_reply(adapter->dcb_cfg.link_speed & 0xff, ++ DCB_C_GLINK_SPD, DCB_A_LINK_SPD, info); ++ if (ret) ++ goto err_out; ++ ++ DPRINTK(DRV, INFO, "Get DCB Link Speed.\n"); ++ ++err_out: ++ dev_put(netdev); ++ return ret; ++} ++ ++static int ixgbe_dcb_slink_spd(struct sk_buff *skb, struct genl_info *info) ++{ ++ struct net_device *netdev = NULL; ++ struct ixgbe_adapter *adapter = NULL; ++ int ret = -EINVAL; ++ u8 value; ++ ++ if (!info->attrs[DCB_A_IFNAME] || !info->attrs[DCB_A_LINK_SPD]) ++ goto err; ++ ++ netdev = dev_get_by_name(&init_net, ++ nla_data(info->attrs[DCB_A_IFNAME])); ++ if (!netdev) ++ goto err; ++ ++ ret = ixgbe_dcb_check_adapter(netdev); ++ if (ret) ++ goto err_out; ++ else ++ adapter = netdev_priv(netdev); ++ ++ value = nla_get_u8(info->attrs[DCB_A_LINK_SPD]); ++ if (value > 9) { ++ DPRINTK(DRV, ERR, "Value is not 0 thru 9, it is %d.\n", value); ++ } else { ++ if (!adapter->dcb_set_bitmap && ++ ixgbe_copy_dcb_cfg(&adapter->dcb_cfg, &adapter->temp_dcb_cfg, ++ adapter->ring_feature[RING_F_DCB].indices)) { ++ ret = -EINVAL; ++ goto err_out; ++ } ++ ++ adapter->temp_dcb_cfg.link_speed = value; ++ adapter->dcb_set_bitmap |= BIT_LINKSPEED; ++ } ++ ++ ret = ixgbe_nl_reply(0, DCB_C_SLINK_SPD, DCB_A_LINK_SPD, info); ++ if (ret) ++ goto err_out; ++ ++ DPRINTK(DRV, INFO, "Set DCB Link Speed to %d.\n", value); ++ ++err_out: ++ dev_put(netdev); ++err: ++ return ret; ++} ++#endif ++ ++#ifdef CONFIG_DCB + static void ixgbe_dcbnl_get_perm_hw_addr(struct net_device *netdev, + u8 *perm_addr) + { + struct ixgbe_adapter *adapter = netdev_priv(netdev); +- int i; ++ int i, j; + + for (i = 0; i < netdev->addr_len; i++) + perm_addr[i] = adapter->hw.mac.perm_addr[i]; ++ ++ if (adapter->hw.mac.type == ixgbe_mac_82599EB) { ++ for (j = 0; j < netdev->addr_len; j++, i++) ++ perm_addr[i] = adapter->hw.mac.san_addr[j]; ++ } + } ++#else ++static int ixgbe_dcb_gperm_hwaddr(struct sk_buff *skb, struct genl_info *info) ++{ ++ void *data; ++ struct sk_buff *dcb_skb = NULL; ++ struct nlattr *tb[IXGBE_DCB_PERM_HW_A_MAX + 1], *nest; ++ struct net_device *netdev = NULL; ++ struct ixgbe_adapter *adapter = NULL; ++ struct ixgbe_hw *hw = NULL; ++ int ret = -ENOMEM; ++ int i; + ++ if (!info->attrs[DCB_A_IFNAME] || !info->attrs[DCB_A_PERM_HWADDR]) ++ return -EINVAL; ++ ++ netdev = dev_get_by_name(&init_net, ++ nla_data(info->attrs[DCB_A_IFNAME])); ++ if (!netdev) ++ return -EINVAL; ++ ++ ret = ixgbe_dcb_check_adapter(netdev); ++ if (ret) ++ goto err_out; ++ else ++ adapter = netdev_priv(netdev); ++ ++ hw = &adapter->hw; ++ ++ ret = nla_parse_nested(tb, IXGBE_DCB_PERM_HW_A_MAX, ++ info->attrs[DCB_A_PERM_HWADDR], ++ dcb_perm_hwaddr_nest); ++ if (ret) ++ goto err; ++ ++ dcb_skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); ++ if (!dcb_skb) ++ goto err; ++ ++ data = genlmsg_put_reply(dcb_skb, info, &dcb_family, 0, ++ DCB_C_GPERM_HWADDR); ++ if (!data) ++ goto err; ++ ++ nest = nla_nest_start(dcb_skb, DCB_A_PERM_HWADDR); ++ if (!nest) ++ goto err; ++ ++ for (i = 0; i < netdev->addr_len; i++) { ++ if (!tb[i+PERM_HW_A_0] && !tb[PERM_HW_A_ALL]) ++ goto err; ++ ++ ret = nla_put_u8(dcb_skb, DCB_A_PERM_HWADDR, ++ hw->mac.perm_addr[i]); ++ ++ if (ret) { ++ nla_nest_cancel(dcb_skb, nest); ++ goto err; ++ } ++ } ++ ++ nla_nest_end(dcb_skb, nest); ++ ++ genlmsg_end(dcb_skb, data); ++ ++ ret = genlmsg_reply(dcb_skb, info); ++ if (ret) ++ goto err; ++ ++ dev_put(netdev); ++ return 0; ++ ++err: ++ DPRINTK(DRV, ERR, "Error in get permanent hwaddr.\n"); ++ kfree(dcb_skb); ++err_out: ++ dev_put(netdev); ++ return ret; ++} ++#endif ++ ++#ifdef CONFIG_DCB + static void ixgbe_dcbnl_set_pg_tc_cfg_tx(struct net_device *netdev, int tc, + u8 prio, u8 bwg_id, u8 bw_pct, + u8 up_map) +@@ -217,8 +843,10 @@ + (adapter->temp_dcb_cfg.tc_config[tc].path[0].bwg_percent != + adapter->dcb_cfg.tc_config[tc].path[0].bwg_percent) || + (adapter->temp_dcb_cfg.tc_config[tc].path[0].up_to_tc_bitmap != +- adapter->dcb_cfg.tc_config[tc].path[0].up_to_tc_bitmap)) ++ adapter->dcb_cfg.tc_config[tc].path[0].up_to_tc_bitmap)) { + adapter->dcb_set_bitmap |= BIT_PG_TX; ++ adapter->dcb_set_bitmap |= BIT_RESETLINK; ++ } + } + + static void ixgbe_dcbnl_set_pg_bwg_cfg_tx(struct net_device *netdev, int bwg_id, +@@ -229,8 +857,10 @@ + adapter->temp_dcb_cfg.bw_percentage[0][bwg_id] = bw_pct; + + if (adapter->temp_dcb_cfg.bw_percentage[0][bwg_id] != +- adapter->dcb_cfg.bw_percentage[0][bwg_id]) ++ adapter->dcb_cfg.bw_percentage[0][bwg_id]) { + adapter->dcb_set_bitmap |= BIT_PG_RX; ++ adapter->dcb_set_bitmap |= BIT_RESETLINK; ++ } + } + + static void ixgbe_dcbnl_set_pg_tc_cfg_rx(struct net_device *netdev, int tc, +@@ -257,8 +887,10 @@ + (adapter->temp_dcb_cfg.tc_config[tc].path[1].bwg_percent != + adapter->dcb_cfg.tc_config[tc].path[1].bwg_percent) || + (adapter->temp_dcb_cfg.tc_config[tc].path[1].up_to_tc_bitmap != +- adapter->dcb_cfg.tc_config[tc].path[1].up_to_tc_bitmap)) ++ adapter->dcb_cfg.tc_config[tc].path[1].up_to_tc_bitmap)) { + adapter->dcb_set_bitmap |= BIT_PG_RX; ++ adapter->dcb_set_bitmap |= BIT_RESETLINK; ++ } + } + + static void ixgbe_dcbnl_set_pg_bwg_cfg_rx(struct net_device *netdev, int bwg_id, +@@ -269,8 +901,10 @@ + adapter->temp_dcb_cfg.bw_percentage[1][bwg_id] = bw_pct; + + if (adapter->temp_dcb_cfg.bw_percentage[1][bwg_id] != +- adapter->dcb_cfg.bw_percentage[1][bwg_id]) ++ adapter->dcb_cfg.bw_percentage[1][bwg_id]) { + adapter->dcb_set_bitmap |= BIT_PG_RX; ++ adapter->dcb_set_bitmap |= BIT_RESETLINK; ++ } + } + + static void ixgbe_dcbnl_get_pg_tc_cfg_tx(struct net_device *netdev, int tc, +@@ -312,7 +946,278 @@ + + *bw_pct = adapter->dcb_cfg.bw_percentage[1][bwg_id]; + } ++#else ++static int ixgbe_dcb_pg_scfg(struct sk_buff *skb, struct genl_info *info, ++ int dir) ++{ ++ struct net_device *netdev = NULL; ++ struct ixgbe_adapter *adapter = NULL; ++ struct tc_configuration *tc_config = NULL; ++ struct tc_configuration *tc_tmpcfg = NULL; ++ struct nlattr *pg_tb[IXGBE_DCB_PG_A_MAX + 1]; ++ struct nlattr *param_tb[IXGBE_DCB_TC_A_PARAM_MAX + 1]; ++ int i, ret, tc_max; ++ u8 value; ++ u8 changed = 0; + ++ if (!info->attrs[DCB_A_IFNAME] || !info->attrs[DCB_A_PG_CFG]) ++ return -EINVAL; ++ ++ netdev = dev_get_by_name(&init_net, ++ nla_data(info->attrs[DCB_A_IFNAME])); ++ if (!netdev) ++ return -EINVAL; ++ ++ ret = ixgbe_dcb_check_adapter(netdev); ++ if (ret) ++ goto err; ++ else ++ adapter = netdev_priv(netdev); ++ ++ ret = nla_parse_nested(pg_tb, IXGBE_DCB_PG_A_MAX, ++ info->attrs[DCB_A_PG_CFG], dcb_pg_nest); ++ if (ret) ++ goto err; ++ ++ if (!adapter->dcb_set_bitmap && ++ ixgbe_copy_dcb_cfg(&adapter->dcb_cfg, &adapter->temp_dcb_cfg, ++ adapter->ring_feature[RING_F_DCB].indices)) ++ goto err; ++ ++ tc_max = adapter->ring_feature[RING_F_DCB].indices; ++ for (i = PG_A_TC_0; i < tc_max + PG_A_TC_0; i++) { ++ if (!pg_tb[i]) ++ continue; ++ ++ ret = nla_parse_nested(param_tb, IXGBE_DCB_TC_A_PARAM_MAX, ++ pg_tb[i], dcb_tc_param_nest); ++ if (ret) ++ goto err; ++ ++ tc_config = &adapter->dcb_cfg.tc_config[i - PG_A_TC_0]; ++ tc_tmpcfg = &adapter->temp_dcb_cfg.tc_config[i - PG_A_TC_0]; ++ if (param_tb[TC_A_PARAM_STRICT_PRIO]) { ++ value = nla_get_u8(param_tb[TC_A_PARAM_STRICT_PRIO]); ++ tc_tmpcfg->path[dir].prio_type = value; ++ if (tc_tmpcfg->path[dir].prio_type != ++ tc_config->path[dir].prio_type) ++ changed = 1; ++ } ++ if (param_tb[TC_A_PARAM_BW_GROUP_ID]) { ++ value = nla_get_u8(param_tb[TC_A_PARAM_BW_GROUP_ID]); ++ tc_tmpcfg->path[dir].bwg_id = value; ++ if (tc_tmpcfg->path[dir].bwg_id != ++ tc_config->path[dir].bwg_id) ++ changed = 1; ++ } ++ if (param_tb[TC_A_PARAM_BW_PCT_IN_GROUP]) { ++ value = nla_get_u8(param_tb[TC_A_PARAM_BW_PCT_IN_GROUP]); ++ tc_tmpcfg->path[dir].bwg_percent = value; ++ if (tc_tmpcfg->path[dir].bwg_percent != ++ tc_config->path[dir].bwg_percent) ++ changed = 1; ++ } ++ if (param_tb[TC_A_PARAM_UP_MAPPING]) { ++ value = nla_get_u8(param_tb[TC_A_PARAM_UP_MAPPING]); ++ tc_tmpcfg->path[dir].up_to_tc_bitmap = value; ++ if (tc_tmpcfg->path[dir].up_to_tc_bitmap != ++ tc_config->path[dir].up_to_tc_bitmap) ++ changed = 1; ++ } ++ } ++ ++ for (i = PG_A_BWG_0; i < PG_A_BWG_MAX; i++) { ++ if (!pg_tb[i]) ++ continue; ++ ++ value = nla_get_u8(pg_tb[i]); ++ adapter->temp_dcb_cfg.bw_percentage[dir][i-PG_A_BWG_0] = value; ++ ++ if (adapter->temp_dcb_cfg.bw_percentage[dir][i-PG_A_BWG_0] != ++ adapter->dcb_cfg.bw_percentage[dir][i-PG_A_BWG_0]) ++ changed = 1; ++ } ++ ++ adapter->temp_dcb_cfg.round_robin_enable = false; ++ ++ if (changed) { ++ if (dir == DCB_TX_CONFIG) ++ adapter->dcb_set_bitmap |= BIT_PG_TX; ++ else ++ adapter->dcb_set_bitmap |= BIT_PG_RX; ++ adapter->dcb_set_bitmap |= BIT_RESETLINK; ++ ++ DPRINTK(DRV, INFO, "Set DCB PG\n"); ++ } else { ++ DPRINTK(DRV, INFO, "Set DCB PG - no changes\n"); ++ } ++ ++ ret = ixgbe_nl_reply(0, (dir? DCB_C_PGRX_SCFG : DCB_C_PGTX_SCFG), ++ DCB_A_PG_CFG, info); ++ if (ret) ++ goto err; ++ ++err: ++ dev_put(netdev); ++ return ret; ++} ++ ++static int ixgbe_dcb_pgtx_scfg(struct sk_buff *skb, struct genl_info *info) ++{ ++ return ixgbe_dcb_pg_scfg(skb, info, DCB_TX_CONFIG); ++} ++ ++static int ixgbe_dcb_pgrx_scfg(struct sk_buff *skb, struct genl_info *info) ++{ ++ return ixgbe_dcb_pg_scfg(skb, info, DCB_RX_CONFIG); ++} ++ ++static int ixgbe_dcb_pg_gcfg(struct sk_buff *skb, struct genl_info *info, ++ int dir) ++{ ++ void *data; ++ struct sk_buff *dcb_skb = NULL; ++ struct nlattr *pg_nest, *param_nest, *tb; ++ struct nlattr *pg_tb[IXGBE_DCB_PG_A_MAX + 1]; ++ struct nlattr *param_tb[IXGBE_DCB_TC_A_PARAM_MAX + 1]; ++ struct net_device *netdev = NULL; ++ struct ixgbe_adapter *adapter = NULL; ++ struct tc_configuration *tc_config = NULL; ++ struct tc_bw_alloc *tc = NULL; ++ int ret = -ENOMEM; ++ int i, tc_max; ++ ++ if (!info->attrs[DCB_A_IFNAME] || !info->attrs[DCB_A_PG_CFG]) ++ return -EINVAL; ++ ++ netdev = dev_get_by_name(&init_net, ++ nla_data(info->attrs[DCB_A_IFNAME])); ++ if (!netdev) ++ return -EINVAL; ++ ++ ret = ixgbe_dcb_check_adapter(netdev); ++ if (ret) ++ goto err_out; ++ else ++ adapter = netdev_priv(netdev); ++ ++ ret = nla_parse_nested(pg_tb, IXGBE_DCB_PG_A_MAX, ++ info->attrs[DCB_A_PG_CFG], dcb_pg_nest); ++ if (ret) ++ goto err; ++ ++ dcb_skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); ++ if (!dcb_skb) ++ goto err; ++ ++ data = genlmsg_put_reply(dcb_skb, info, &dcb_family, 0, ++ (dir) ? DCB_C_PGRX_GCFG : DCB_C_PGTX_GCFG); ++ ++ if (!data) ++ goto err; ++ ++ pg_nest = nla_nest_start(dcb_skb, DCB_A_PG_CFG); ++ if (!pg_nest) ++ goto err; ++ ++ tc_max = adapter->ring_feature[RING_F_DCB].indices; ++ for (i = PG_A_TC_0; i < tc_max + PG_A_TC_0; i++) { ++ if (!pg_tb[i] && !pg_tb[PG_A_TC_ALL]) ++ continue; ++ ++ if (pg_tb[PG_A_TC_ALL]) ++ tb = pg_tb[PG_A_TC_ALL]; ++ else ++ tb = pg_tb[i]; ++ ret = nla_parse_nested(param_tb, IXGBE_DCB_TC_A_PARAM_MAX, ++ tb, dcb_tc_param_nest); ++ if (ret) ++ goto err_pg; ++ ++ param_nest = nla_nest_start(dcb_skb, i); ++ if (!param_nest) ++ goto err_pg; ++ ++ tc_config = &adapter->dcb_cfg.tc_config[i - PG_A_TC_0]; ++ tc = &adapter->dcb_cfg.tc_config[i - PG_A_TC_0].path[dir]; ++ ++ if (param_tb[TC_A_PARAM_STRICT_PRIO] || ++ param_tb[TC_A_PARAM_ALL]) { ++ ret = nla_put_u8(dcb_skb, TC_A_PARAM_STRICT_PRIO, ++ tc->prio_type); ++ if (ret) ++ goto err_param; ++ } ++ if (param_tb[TC_A_PARAM_BW_GROUP_ID] || ++ param_tb[TC_A_PARAM_ALL]) { ++ ret = nla_put_u8(dcb_skb, TC_A_PARAM_BW_GROUP_ID, ++ tc->bwg_id); ++ if (ret) ++ goto err_param; ++ } ++ if (param_tb[TC_A_PARAM_BW_PCT_IN_GROUP] || ++ param_tb[TC_A_PARAM_ALL]) { ++ ret = nla_put_u8(dcb_skb, TC_A_PARAM_BW_PCT_IN_GROUP, ++ tc->bwg_percent); ++ if (ret) ++ goto err_param; ++ } ++ if (param_tb[TC_A_PARAM_UP_MAPPING] || ++ param_tb[TC_A_PARAM_ALL]) { ++ ret = nla_put_u8(dcb_skb, TC_A_PARAM_UP_MAPPING, ++ tc->up_to_tc_bitmap); ++ if (ret) ++ goto err_param; ++ } ++ nla_nest_end(dcb_skb, param_nest); ++ } ++ ++ for (i = PG_A_BWG_0; i < PG_A_BWG_MAX; i++) { ++ if (!pg_tb[i] && !pg_tb[PG_A_BWG_ALL]) ++ continue; ++ ++ ret = nla_put_u8(dcb_skb, i, ++ adapter->dcb_cfg.bw_percentage[dir][i-PG_A_BWG_0]); ++ ++ if (ret) ++ goto err_pg; ++ } ++ ++ nla_nest_end(dcb_skb, pg_nest); ++ ++ genlmsg_end(dcb_skb, data); ++ ret = genlmsg_reply(dcb_skb, info); ++ if (ret) ++ goto err; ++ ++ DPRINTK(DRV, INFO, "Get PG %s Attributes.\n", dir?"RX":"TX"); ++ dev_put(netdev); ++ return 0; ++ ++err_param: ++ DPRINTK(DRV, ERR, "Error in get pg %s.\n", dir?"rx":"tx"); ++ nla_nest_cancel(dcb_skb, param_nest); ++err_pg: ++ nla_nest_cancel(dcb_skb, pg_nest); ++err: ++ kfree(dcb_skb); ++err_out: ++ dev_put(netdev); ++ return ret; ++} ++ ++static int ixgbe_dcb_pgtx_gcfg(struct sk_buff *skb, struct genl_info *info) ++{ ++ return ixgbe_dcb_pg_gcfg(skb, info, DCB_TX_CONFIG); ++} ++ ++static int ixgbe_dcb_pgrx_gcfg(struct sk_buff *skb, struct genl_info *info) ++{ ++ return ixgbe_dcb_pg_gcfg(skb, info, DCB_RX_CONFIG); ++} ++#endif ++ ++#ifdef CONFIG_DCB + static void ixgbe_dcbnl_set_pfc_cfg(struct net_device *netdev, int priority, + u8 setting) + { +@@ -320,8 +1225,9 @@ + + adapter->temp_dcb_cfg.tc_config[priority].dcb_pfc = setting; + if (adapter->temp_dcb_cfg.tc_config[priority].dcb_pfc != +- adapter->dcb_cfg.tc_config[priority].dcb_pfc) ++ adapter->dcb_cfg.tc_config[priority].dcb_pfc) { + adapter->dcb_set_bitmap |= BIT_PFC; ++ } + } + + static void ixgbe_dcbnl_get_pfc_cfg(struct net_device *netdev, int priority, +@@ -331,37 +1237,282 @@ + + *setting = adapter->dcb_cfg.tc_config[priority].dcb_pfc; + } ++#else ++static int ixgbe_dcb_spfccfg(struct sk_buff *skb, struct genl_info *info) ++{ ++ struct nlattr *tb[IXGBE_DCB_PFC_A_UP_MAX + 1]; ++ struct net_device *netdev = NULL; ++ struct ixgbe_adapter *adapter = NULL; ++ int i, ret = -ENOMEM; ++ u8 setting; ++ u8 changed = 0; + ++ netdev = dev_get_by_name(&init_net, ++ nla_data(info->attrs[DCB_A_IFNAME])); ++ if (!netdev) ++ return -EINVAL; ++ ++ adapter = netdev_priv(netdev); ++ ++ if (!info->attrs[DCB_A_IFNAME] || !info->attrs[DCB_A_PFC_CFG]) { ++ DPRINTK(DRV, INFO, "set pfc: ifname:%d pfc_cfg:%d\n", ++ !info->attrs[DCB_A_IFNAME], ++ !info->attrs[DCB_A_PFC_CFG]); ++ return -EINVAL; ++ } ++ ++ ret = ixgbe_dcb_check_adapter(netdev); ++ if (ret) ++ goto err; ++ else ++ adapter = netdev_priv(netdev); ++ ++ ret = nla_parse_nested(tb, IXGBE_DCB_PFC_A_UP_MAX, ++ info->attrs[DCB_A_PFC_CFG], ++ dcb_pfc_up_nest); ++ if (ret) ++ goto err; ++ ++ if (!adapter->dcb_set_bitmap && ++ ixgbe_copy_dcb_cfg(&adapter->dcb_cfg, &adapter->temp_dcb_cfg, ++ adapter->ring_feature[RING_F_DCB].indices)) { ++ ret = -EINVAL; ++ goto err; ++ } ++ ++ for (i = PFC_A_UP_0; i < PFC_A_UP_MAX; i++) { ++ if (!tb[i]) ++ continue; ++ ++ setting = nla_get_u8(tb[i]); ++ adapter->temp_dcb_cfg.tc_config[i-PFC_A_UP_0].dcb_pfc = setting; ++ ++ if (adapter->temp_dcb_cfg.tc_config[i-PFC_A_UP_0].dcb_pfc != ++ adapter->dcb_cfg.tc_config[i-PFC_A_UP_0].dcb_pfc) ++ changed = 1; ++ } ++ ++ if (changed) { ++ adapter->dcb_set_bitmap |= BIT_PFC; ++ DPRINTK(DRV, INFO, "Set DCB PFC\n"); ++ } else { ++ DPRINTK(DRV, INFO, "Set DCB PFC - no changes\n"); ++ } ++ ++ ret = ixgbe_nl_reply(0, DCB_C_PFC_SCFG, DCB_A_PFC_CFG, info); ++ if (ret) ++ goto err; ++ ++err: ++ dev_put(netdev); ++ return ret; ++} ++ ++static int ixgbe_dcb_gpfccfg(struct sk_buff *skb, struct genl_info *info) ++{ ++ void *data; ++ struct sk_buff *dcb_skb = NULL; ++ struct nlattr *tb[IXGBE_DCB_PFC_A_UP_MAX + 1], *nest; ++ struct net_device *netdev = NULL; ++ struct ixgbe_adapter *adapter = NULL; ++ int ret = -ENOMEM; ++ int i; ++ ++ if (!info->attrs[DCB_A_IFNAME] || !info->attrs[DCB_A_PFC_CFG]) ++ return -EINVAL; ++ ++ netdev = dev_get_by_name(&init_net, ++ nla_data(info->attrs[DCB_A_IFNAME])); ++ if (!netdev) ++ return -EINVAL; ++ ++ ret = ixgbe_dcb_check_adapter(netdev); ++ if (ret) ++ goto err_out; ++ else ++ adapter = netdev_priv(netdev); ++ ++ ret = nla_parse_nested(tb, IXGBE_DCB_PFC_A_UP_MAX, ++ info->attrs[DCB_A_PFC_CFG], dcb_pfc_up_nest); ++ if (ret) ++ goto err; ++ ++ dcb_skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); ++ if (!dcb_skb) ++ goto err; ++ ++ data = genlmsg_put_reply(dcb_skb, info, &dcb_family, 0, ++ DCB_C_PFC_GCFG); ++ if (!data) ++ goto err; ++ ++ nest = nla_nest_start(dcb_skb, DCB_A_PFC_CFG); ++ if (!nest) ++ goto err; ++ ++ for (i = PFC_A_UP_0; i < PFC_A_UP_MAX; i++) { ++ if (!tb[i] && !tb[PFC_A_UP_ALL]) ++ continue; ++ ++ ret = nla_put_u8(dcb_skb, i, ++ adapter->dcb_cfg.tc_config[i-PFC_A_UP_0].dcb_pfc); ++ if (ret) { ++ nla_nest_cancel(dcb_skb, nest); ++ goto err; ++ } ++ } ++ ++ nla_nest_end(dcb_skb, nest); ++ ++ genlmsg_end(dcb_skb, data); ++ ++ ret = genlmsg_reply(dcb_skb, info); ++ if (ret) ++ goto err; ++ ++ DPRINTK(DRV, INFO, "Get PFC CFG.\n"); ++ dev_put(netdev); ++ return 0; ++ ++err: ++ DPRINTK(DRV, ERR, "Error in get pfc stats.\n"); ++ kfree(dcb_skb); ++err_out: ++ dev_put(netdev); ++ return ret; ++} ++#endif ++ ++#ifdef CONFIG_DCB + static u8 ixgbe_dcbnl_set_all(struct net_device *netdev) + { + struct ixgbe_adapter *adapter = netdev_priv(netdev); + int ret; + +- adapter->dcb_set_bitmap &= ~BIT_BCN; /* no set for BCN */ + if (!adapter->dcb_set_bitmap) +- return 1; ++ return DCB_NO_HW_CHG; + +- while (test_and_set_bit(__IXGBE_RESETTING, &adapter->state)) +- msleep(1); ++ /* Only take down the adapter if the configuration change ++ * requires a reset. ++ */ ++ if (adapter->dcb_set_bitmap & BIT_RESETLINK) { ++ while (test_and_set_bit(__IXGBE_RESETTING, &adapter->state)) ++ msleep(1); + +- if (netif_running(netdev)) +- ixgbe_down(adapter); ++ if (netif_running(netdev)) ++ ixgbe_down(adapter); ++ } + + ret = ixgbe_copy_dcb_cfg(&adapter->temp_dcb_cfg, &adapter->dcb_cfg, + adapter->ring_feature[RING_F_DCB].indices); + if (ret) { +- clear_bit(__IXGBE_RESETTING, &adapter->state); +- return ret; ++ if (adapter->dcb_set_bitmap & BIT_RESETLINK) ++ clear_bit(__IXGBE_RESETTING, &adapter->state); ++ return DCB_NO_HW_CHG; + } + +- if (netif_running(netdev)) +- ixgbe_up(adapter); ++ if (adapter->dcb_cfg.pfc_mode_enable) { ++ if ((adapter->hw.mac.type != ixgbe_mac_82598EB) && ++ (adapter->hw.fc.current_mode != ixgbe_fc_pfc)) ++ adapter->last_lfc_mode = adapter->hw.fc.current_mode; ++ adapter->hw.fc.requested_mode = ixgbe_fc_pfc; ++ } else { ++ if (adapter->hw.mac.type != ixgbe_mac_82598EB) ++ adapter->hw.fc.requested_mode = adapter->last_lfc_mode; ++ else ++ adapter->hw.fc.requested_mode = ixgbe_fc_none; ++ } + ++ if (adapter->dcb_set_bitmap & BIT_RESETLINK) { ++ if (netif_running(netdev)) ++ ixgbe_up(adapter); ++ ret = DCB_HW_CHG_RST; ++ } else if (adapter->dcb_set_bitmap & BIT_PFC) { ++ if (adapter->hw.mac.type == ixgbe_mac_82598EB) ++ ixgbe_dcb_config_pfc_82598(&adapter->hw, ++ &adapter->dcb_cfg); ++ else if (adapter->hw.mac.type == ixgbe_mac_82599EB) ++ ixgbe_dcb_config_pfc_82599(&adapter->hw, ++ &adapter->dcb_cfg); ++ ret = DCB_HW_CHG; ++ } ++ if (adapter->dcb_cfg.pfc_mode_enable) ++ adapter->hw.fc.current_mode = ixgbe_fc_pfc; ++ ++ if (adapter->dcb_set_bitmap & BIT_RESETLINK) ++ clear_bit(__IXGBE_RESETTING, &adapter->state); + adapter->dcb_set_bitmap = 0x00; +- clear_bit(__IXGBE_RESETTING, &adapter->state); + return ret; + } ++#else ++static int ixgbe_dcb_set_all(struct sk_buff *skb, struct genl_info *info) ++{ ++ struct net_device *netdev = NULL; ++ struct ixgbe_adapter *adapter = NULL; ++ int ret = -ENOMEM; ++ u8 value; ++ u8 retval = 0; + ++ if (!info->attrs[DCB_A_IFNAME] || !info->attrs[DCB_A_SET_ALL]) ++ goto err; ++ ++ netdev = dev_get_by_name(&init_net, ++ nla_data(info->attrs[DCB_A_IFNAME])); ++ if (!netdev) ++ goto err; ++ ++ ret = ixgbe_dcb_check_adapter(netdev); ++ if (ret) ++ goto err_out; ++ else ++ adapter = netdev_priv(netdev); ++ ++ if (!(adapter->flags & IXGBE_FLAG_DCA_CAPABLE)) { ++ ret = -EINVAL; ++ goto err_out; ++ } ++ ++ value = nla_get_u8(info->attrs[DCB_A_SET_ALL]); ++ if ((value & 1) != value) { ++ DPRINTK(DRV, INFO, "Value is not 1 or 0, it is %d.\n", value); ++ } else { ++ if (!adapter->dcb_set_bitmap) { ++ retval = 1; ++ goto out; ++ } ++ ++ while (test_and_set_bit(__IXGBE_RESETTING, &adapter->state)) ++ msleep(1); ++ ++ ret = ixgbe_copy_dcb_cfg(&adapter->temp_dcb_cfg, ++ &adapter->dcb_cfg, ++ adapter->ring_feature[RING_F_DCB].indices); ++ if (ret) { ++ clear_bit(__IXGBE_RESETTING, &adapter->state); ++ goto err_out; ++ } ++ ++ ixgbe_down(adapter); ++ ixgbe_up(adapter); ++ adapter->dcb_set_bitmap = 0x00; ++ clear_bit(__IXGBE_RESETTING, &adapter->state); ++ } ++ ++out: ++ ret = ixgbe_nl_reply(retval, DCB_C_SET_ALL, DCB_A_SET_ALL, info); ++ if (ret) ++ goto err_out; ++ ++ DPRINTK(DRV, INFO, "Set all pfc pg and link speed configuration.\n"); ++ ++err_out: ++ dev_put(netdev); ++err: ++ return ret; ++} ++#endif ++ ++#ifdef CONFIG_DCB + static u8 ixgbe_dcbnl_getcap(struct net_device *netdev, int capid, u8 *cap) + { + struct ixgbe_adapter *adapter = netdev_priv(netdev); +@@ -386,9 +1537,6 @@ + break; + case DCB_CAP_ATTR_GSP: + *cap = true; +- break; +- case DCB_CAP_ATTR_BCN: +- *cap = false; + break; + default: + rval = -EINVAL; +@@ -434,183 +1582,25 @@ + { + struct ixgbe_adapter *adapter = netdev_priv(netdev); + +- return !!(adapter->flags & IXGBE_FLAG_DCB_ENABLED); ++ return adapter->dcb_cfg.pfc_mode_enable; + } + + static void ixgbe_dcbnl_setpfcstate(struct net_device *netdev, u8 state) + { ++ struct ixgbe_adapter *adapter = netdev_priv(netdev); ++ ++ DPRINTK(DRV, INFO, "Setting PFC state to %d.\n", state); ++ adapter->temp_dcb_cfg.pfc_mode_enable = state; ++ if (adapter->temp_dcb_cfg.pfc_mode_enable != ++ adapter->dcb_cfg.pfc_mode_enable) ++ adapter->dcb_set_bitmap |= BIT_PFC; + return; + } + +-static void ixgbe_dcbnl_getbcnrp(struct net_device *netdev, int priority, +- u8 *setting) +-{ +- struct ixgbe_adapter *adapter = netdev_priv(netdev); ++#else ++#endif + +- *setting = adapter->dcb_cfg.bcn.rp_admin_mode[priority]; +-} +- +- +-static void ixgbe_dcbnl_getbcncfg(struct net_device *netdev, int enum_index, +- u32 *setting) +-{ +- struct ixgbe_adapter *adapter = netdev_priv(netdev); +- +- switch (enum_index) { +- case DCB_BCN_ATTR_BCNA_0: +- *setting = adapter->dcb_cfg.bcn.bcna_option[0]; +- break; +- case DCB_BCN_ATTR_BCNA_1: +- *setting = adapter->dcb_cfg.bcn.bcna_option[1]; +- break; +- case DCB_BCN_ATTR_ALPHA: +- *setting = adapter->dcb_cfg.bcn.rp_alpha; +- break; +- case DCB_BCN_ATTR_BETA: +- *setting = adapter->dcb_cfg.bcn.rp_beta; +- break; +- case DCB_BCN_ATTR_GD: +- *setting = adapter->dcb_cfg.bcn.rp_gd; +- break; +- case DCB_BCN_ATTR_GI: +- *setting = adapter->dcb_cfg.bcn.rp_gi; +- break; +- case DCB_BCN_ATTR_TMAX: +- *setting = adapter->dcb_cfg.bcn.rp_tmax; +- break; +- case DCB_BCN_ATTR_TD: +- *setting = adapter->dcb_cfg.bcn.rp_td; +- break; +- case DCB_BCN_ATTR_RMIN: +- *setting = adapter->dcb_cfg.bcn.rp_rmin; +- break; +- case DCB_BCN_ATTR_W: +- *setting = adapter->dcb_cfg.bcn.rp_w; +- break; +- case DCB_BCN_ATTR_RD: +- *setting = adapter->dcb_cfg.bcn.rp_rd; +- break; +- case DCB_BCN_ATTR_RU: +- *setting = adapter->dcb_cfg.bcn.rp_ru; +- break; +- case DCB_BCN_ATTR_WRTT: +- *setting = adapter->dcb_cfg.bcn.rp_wrtt; +- break; +- case DCB_BCN_ATTR_RI: +- *setting = adapter->dcb_cfg.bcn.rp_ri; +- break; +- default: +- *setting = -1; +- } +-} +- +-static void ixgbe_dcbnl_setbcnrp(struct net_device *netdev, int priority, +- u8 setting) +-{ +- struct ixgbe_adapter *adapter = netdev_priv(netdev); +- +- adapter->temp_dcb_cfg.bcn.rp_admin_mode[priority] = setting; +- +- if (adapter->temp_dcb_cfg.bcn.rp_admin_mode[priority] != +- adapter->dcb_cfg.bcn.rp_admin_mode[priority]) +- adapter->dcb_set_bitmap |= BIT_BCN; +-} +- +-static void ixgbe_dcbnl_setbcncfg(struct net_device *netdev, int enum_index, +- u32 setting) +-{ +- struct ixgbe_adapter *adapter = netdev_priv(netdev); +- +- switch (enum_index) { +- case DCB_BCN_ATTR_BCNA_0: +- adapter->temp_dcb_cfg.bcn.bcna_option[0] = setting; +- if (adapter->temp_dcb_cfg.bcn.bcna_option[0] != +- adapter->dcb_cfg.bcn.bcna_option[0]) +- adapter->dcb_set_bitmap |= BIT_BCN; +- break; +- case DCB_BCN_ATTR_BCNA_1: +- adapter->temp_dcb_cfg.bcn.bcna_option[1] = setting; +- if (adapter->temp_dcb_cfg.bcn.bcna_option[1] != +- adapter->dcb_cfg.bcn.bcna_option[1]) +- adapter->dcb_set_bitmap |= BIT_BCN; +- break; +- case DCB_BCN_ATTR_ALPHA: +- adapter->temp_dcb_cfg.bcn.rp_alpha = setting; +- if (adapter->temp_dcb_cfg.bcn.rp_alpha != +- adapter->dcb_cfg.bcn.rp_alpha) +- adapter->dcb_set_bitmap |= BIT_BCN; +- break; +- case DCB_BCN_ATTR_BETA: +- adapter->temp_dcb_cfg.bcn.rp_beta = setting; +- if (adapter->temp_dcb_cfg.bcn.rp_beta != +- adapter->dcb_cfg.bcn.rp_beta) +- adapter->dcb_set_bitmap |= BIT_BCN; +- break; +- case DCB_BCN_ATTR_GD: +- adapter->temp_dcb_cfg.bcn.rp_gd = setting; +- if (adapter->temp_dcb_cfg.bcn.rp_gd != +- adapter->dcb_cfg.bcn.rp_gd) +- adapter->dcb_set_bitmap |= BIT_BCN; +- break; +- case DCB_BCN_ATTR_GI: +- adapter->temp_dcb_cfg.bcn.rp_gi = setting; +- if (adapter->temp_dcb_cfg.bcn.rp_gi != +- adapter->dcb_cfg.bcn.rp_gi) +- adapter->dcb_set_bitmap |= BIT_BCN; +- break; +- case DCB_BCN_ATTR_TMAX: +- adapter->temp_dcb_cfg.bcn.rp_tmax = setting; +- if (adapter->temp_dcb_cfg.bcn.rp_tmax != +- adapter->dcb_cfg.bcn.rp_tmax) +- adapter->dcb_set_bitmap |= BIT_BCN; +- break; +- case DCB_BCN_ATTR_TD: +- adapter->temp_dcb_cfg.bcn.rp_td = setting; +- if (adapter->temp_dcb_cfg.bcn.rp_td != +- adapter->dcb_cfg.bcn.rp_td) +- adapter->dcb_set_bitmap |= BIT_BCN; +- break; +- case DCB_BCN_ATTR_RMIN: +- adapter->temp_dcb_cfg.bcn.rp_rmin = setting; +- if (adapter->temp_dcb_cfg.bcn.rp_rmin != +- adapter->dcb_cfg.bcn.rp_rmin) +- adapter->dcb_set_bitmap |= BIT_BCN; +- break; +- case DCB_BCN_ATTR_W: +- adapter->temp_dcb_cfg.bcn.rp_w = setting; +- if (adapter->temp_dcb_cfg.bcn.rp_w != +- adapter->dcb_cfg.bcn.rp_w) +- adapter->dcb_set_bitmap |= BIT_BCN; +- break; +- case DCB_BCN_ATTR_RD: +- adapter->temp_dcb_cfg.bcn.rp_rd = setting; +- if (adapter->temp_dcb_cfg.bcn.rp_rd != +- adapter->dcb_cfg.bcn.rp_rd) +- adapter->dcb_set_bitmap |= BIT_BCN; +- break; +- case DCB_BCN_ATTR_RU: +- adapter->temp_dcb_cfg.bcn.rp_ru = setting; +- if (adapter->temp_dcb_cfg.bcn.rp_ru != +- adapter->dcb_cfg.bcn.rp_ru) +- adapter->dcb_set_bitmap |= BIT_BCN; +- break; +- case DCB_BCN_ATTR_WRTT: +- adapter->temp_dcb_cfg.bcn.rp_wrtt = setting; +- if (adapter->temp_dcb_cfg.bcn.rp_wrtt != +- adapter->dcb_cfg.bcn.rp_wrtt) +- adapter->dcb_set_bitmap |= BIT_BCN; +- break; +- case DCB_BCN_ATTR_RI: +- adapter->temp_dcb_cfg.bcn.rp_ri = setting; +- if (adapter->temp_dcb_cfg.bcn.rp_ri != +- adapter->dcb_cfg.bcn.rp_ri) +- adapter->dcb_set_bitmap |= BIT_BCN; +- break; +- default: +- break; +- } +-} +- ++#ifdef CONFIG_DCB + struct dcbnl_rtnl_ops dcbnl_ops = { + .getstate = ixgbe_dcbnl_get_state, + .setstate = ixgbe_dcbnl_set_state, +@@ -631,9 +1621,200 @@ + .setnumtcs = ixgbe_dcbnl_setnumtcs, + .getpfcstate = ixgbe_dcbnl_getpfcstate, + .setpfcstate = ixgbe_dcbnl_setpfcstate, +- .getbcncfg = ixgbe_dcbnl_getbcncfg, +- .getbcnrp = ixgbe_dcbnl_getbcnrp, +- .setbcncfg = ixgbe_dcbnl_setbcncfg, +- .setbcnrp = ixgbe_dcbnl_setbcnrp ++}; ++#else ++/* DCB Generic NETLINK command Definitions */ ++/* Get DCB Admin Mode */ ++static struct genl_ops ixgbe_dcb_genl_c_gstate = { ++ .cmd = DCB_C_GSTATE, ++ .flags = GENL_ADMIN_PERM, ++ .policy = dcb_genl_policy, ++ .doit = ixgbe_dcb_gstate, ++ .dumpit = NULL, + }; + ++/* Set DCB Admin Mode */ ++static struct genl_ops ixgbe_dcb_genl_c_sstate = { ++ .cmd = DCB_C_SSTATE, ++ .flags = GENL_ADMIN_PERM, ++ .policy = dcb_genl_policy, ++ .doit = ixgbe_dcb_sstate, ++ .dumpit = NULL, ++}; ++ ++/* Set TX Traffic Attributes */ ++static struct genl_ops ixgbe_dcb_genl_c_spgtx = { ++ .cmd = DCB_C_PGTX_SCFG, ++ .flags = GENL_ADMIN_PERM, ++ .policy = dcb_genl_policy, ++ .doit = ixgbe_dcb_pgtx_scfg, ++ .dumpit = NULL, ++}; ++ ++/* Set RX Traffic Attributes */ ++static struct genl_ops ixgbe_dcb_genl_c_spgrx = { ++ .cmd = DCB_C_PGRX_SCFG, ++ .flags = GENL_ADMIN_PERM, ++ .policy = dcb_genl_policy, ++ .doit = ixgbe_dcb_pgrx_scfg, ++ .dumpit = NULL, ++}; ++ ++/* Set PFC CFG */ ++static struct genl_ops ixgbe_dcb_genl_c_spfc = { ++ .cmd = DCB_C_PFC_SCFG, ++ .flags = GENL_ADMIN_PERM, ++ .policy = dcb_genl_policy, ++ .doit = ixgbe_dcb_spfccfg, ++ .dumpit = NULL, ++}; ++ ++/* Get TX Traffic Attributes */ ++static struct genl_ops ixgbe_dcb_genl_c_gpgtx = { ++ .cmd = DCB_C_PGTX_GCFG, ++ .flags = GENL_ADMIN_PERM, ++ .policy = dcb_genl_policy, ++ .doit = ixgbe_dcb_pgtx_gcfg, ++ .dumpit = NULL, ++}; ++ ++/* Get RX Traffic Attributes */ ++static struct genl_ops ixgbe_dcb_genl_c_gpgrx = { ++ .cmd = DCB_C_PGRX_GCFG, ++ .flags = GENL_ADMIN_PERM, ++ .policy = dcb_genl_policy, ++ .doit = ixgbe_dcb_pgrx_gcfg, ++ .dumpit = NULL, ++}; ++ ++/* Get PFC CFG */ ++static struct genl_ops ixgbe_dcb_genl_c_gpfc = { ++ .cmd = DCB_C_PFC_GCFG, ++ .flags = GENL_ADMIN_PERM, ++ .policy = dcb_genl_policy, ++ .doit = ixgbe_dcb_gpfccfg, ++ .dumpit = NULL, ++}; ++ ++ ++/* Get Link Speed setting */ ++static struct genl_ops ixgbe_dcb_genl_c_glink_spd = { ++ .cmd = DCB_C_GLINK_SPD, ++ .flags = GENL_ADMIN_PERM, ++ .policy = dcb_genl_policy, ++ .doit = ixgbe_dcb_glink_spd, ++ .dumpit = NULL, ++}; ++ ++/* Set Link Speed setting */ ++static struct genl_ops ixgbe_dcb_genl_c_slink_spd = { ++ .cmd = DCB_C_SLINK_SPD, ++ .flags = GENL_ADMIN_PERM, ++ .policy = dcb_genl_policy, ++ .doit = ixgbe_dcb_slink_spd, ++ .dumpit = NULL, ++}; ++ ++/* Set all "set" feature */ ++static struct genl_ops ixgbe_dcb_genl_c_set_all= { ++ .cmd = DCB_C_SET_ALL, ++ .flags = GENL_ADMIN_PERM, ++ .policy = dcb_genl_policy, ++ .doit = ixgbe_dcb_set_all, ++ .dumpit = NULL, ++}; ++ ++/* Get permanent HW address */ ++static struct genl_ops ixgbe_dcb_genl_c_gperm_hwaddr = { ++ .cmd = DCB_C_GPERM_HWADDR, ++ .flags = GENL_ADMIN_PERM, ++ .policy = dcb_genl_policy, ++ .doit = ixgbe_dcb_gperm_hwaddr, ++ .dumpit = NULL, ++}; ++ ++/** ++ * ixgbe_dcb_netlink_register - Initialize the NETLINK communication channel ++ * ++ * Description: ++ * Call out to the DCB components so they can register their families and ++ * commands with Generic NETLINK mechanism. Return zero on success and ++ * non-zero on failure. ++ * ++ */ ++int ixgbe_dcb_netlink_register(void) ++{ ++ int ret = 1; ++ ++ /* consider writing as: ++ * ret = genl_register_family(aaa) ++ * || genl_register_ops(bbb, bbb) ++ * || genl_register_ops(ccc, ccc); ++ * if (ret) ++ * goto err; ++ */ ++ ret = genl_register_family(&dcb_family); ++ if (ret) ++ return ret; ++ ++ ret = genl_register_ops(&dcb_family, &ixgbe_dcb_genl_c_gstate); ++ if (ret) ++ goto err; ++ ++ ret = genl_register_ops(&dcb_family, &ixgbe_dcb_genl_c_sstate); ++ if (ret) ++ goto err; ++ ++ ret = genl_register_ops(&dcb_family, &ixgbe_dcb_genl_c_spgtx); ++ if (ret) ++ goto err; ++ ++ ret = genl_register_ops(&dcb_family, &ixgbe_dcb_genl_c_spgrx); ++ if (ret) ++ goto err; ++ ++ ret = genl_register_ops(&dcb_family, &ixgbe_dcb_genl_c_spfc); ++ if (ret) ++ goto err; ++ ++ ret = genl_register_ops(&dcb_family, &ixgbe_dcb_genl_c_gpfc); ++ if (ret) ++ goto err; ++ ++ ret = genl_register_ops(&dcb_family, &ixgbe_dcb_genl_c_gpgtx); ++ if (ret) ++ goto err; ++ ++ ret = genl_register_ops(&dcb_family, &ixgbe_dcb_genl_c_gpgrx); ++ if (ret) ++ goto err; ++ ++ ++ ret = genl_register_ops(&dcb_family, &ixgbe_dcb_genl_c_glink_spd); ++ if (ret) ++ goto err; ++ ++ ret = genl_register_ops(&dcb_family, &ixgbe_dcb_genl_c_slink_spd); ++ if (ret) ++ goto err; ++ ++ ret = genl_register_ops(&dcb_family, &ixgbe_dcb_genl_c_set_all); ++ if (ret) ++ goto err; ++ ++ ret = genl_register_ops(&dcb_family, &ixgbe_dcb_genl_c_gperm_hwaddr); ++ if (ret) ++ goto err; ++ ++ return 0; ++ ++err: ++ genl_unregister_family(&dcb_family); ++ return ret; ++} ++ ++int ixgbe_dcb_netlink_unregister(void) ++{ ++ return genl_unregister_family(&dcb_family); ++} ++#endif +diff -r 3e5bbd731d89 drivers/net/ixgbe/ixgbe_ethtool.c +--- a/drivers/net/ixgbe/ixgbe_ethtool.c Mon Jun 15 12:00:22 2009 +0100 ++++ b/drivers/net/ixgbe/ixgbe_ethtool.c Mon Jun 15 12:06:28 2009 +0100 +@@ -1,7 +1,7 @@ + /******************************************************************************* + + Intel 10 Gigabit PCI Express Linux driver +- Copyright(c) 1999 - 2008 Intel Corporation. ++ Copyright(c) 1999 - 2009 Intel Corporation. + + This program is free software; you can redistribute it and/or modify it + under the terms and conditions of the GNU General Public License, +@@ -33,13 +33,21 @@ + #include + #include + #include +-#include ++#ifdef SIOCETHTOOL ++#include + + #include "ixgbe.h" + ++#ifndef ETH_GSTRING_LEN ++#define ETH_GSTRING_LEN 32 ++#endif + + #define IXGBE_ALL_RAR_ENTRIES 16 + ++#ifdef ETHTOOL_OPS_COMPAT ++#include "kcompat_ethtool.c" ++#endif ++#ifdef ETHTOOL_GSTATS + struct ixgbe_stats { + char stat_string[ETH_GSTRING_LEN]; + int sizeof_stat; +@@ -47,7 +55,7 @@ + }; + + #define IXGBE_STAT(m) sizeof(((struct ixgbe_adapter *)0)->m), \ +- offsetof(struct ixgbe_adapter, m) ++ offsetof(struct ixgbe_adapter, m) + static struct ixgbe_stats ixgbe_gstrings_stats[] = { + {"rx_packets", IXGBE_STAT(net_stats.rx_packets)}, + {"tx_packets", IXGBE_STAT(net_stats.tx_packets)}, +@@ -59,6 +67,9 @@ + {"rx_errors", IXGBE_STAT(net_stats.rx_errors)}, + {"tx_errors", IXGBE_STAT(net_stats.tx_errors)}, + {"rx_dropped", IXGBE_STAT(net_stats.rx_dropped)}, ++#ifndef CONFIG_IXGBE_NAPI ++ {"rx_dropped_backlog", IXGBE_STAT(rx_dropped_backlog)}, ++#endif + {"tx_dropped", IXGBE_STAT(net_stats.tx_dropped)}, + {"multicast", IXGBE_STAT(net_stats.multicast)}, + {"broadcast", IXGBE_STAT(stats.bprc)}, +@@ -77,8 +88,12 @@ + {"tx_restart_queue", IXGBE_STAT(restart_queue)}, + {"rx_long_length_errors", IXGBE_STAT(stats.roc)}, + {"rx_short_length_errors", IXGBE_STAT(stats.ruc)}, ++#ifdef NETIF_F_TSO + {"tx_tcp4_seg_ctxt", IXGBE_STAT(hw_tso_ctxt)}, ++#ifdef NETIF_F_TSO6 + {"tx_tcp6_seg_ctxt", IXGBE_STAT(hw_tso6_ctxt)}, ++#endif ++#endif + {"tx_flow_control_xon", IXGBE_STAT(stats.lxontxc)}, + {"rx_flow_control_xon", IXGBE_STAT(stats.lxonrxc)}, + {"tx_flow_control_xoff", IXGBE_STAT(stats.lxofftxc)}, +@@ -86,31 +101,48 @@ + {"rx_csum_offload_good", IXGBE_STAT(hw_csum_rx_good)}, + {"rx_csum_offload_errors", IXGBE_STAT(hw_csum_rx_error)}, + {"tx_csum_offload_ctxt", IXGBE_STAT(hw_csum_tx_good)}, +- {"rx_header_split", IXGBE_STAT(rx_hdr_split)}, ++#ifndef IXGBE_NO_LLI ++ {"low_latency_interrupt", IXGBE_STAT(lli_int)}, ++#endif + {"alloc_rx_page_failed", IXGBE_STAT(alloc_rx_page_failed)}, + {"alloc_rx_buff_failed", IXGBE_STAT(alloc_rx_buff_failed)}, +-#ifdef CONFIG_IXGBE_LRO +- {"lro_aggregated", IXGBE_STAT(lro_aggregated)}, +- {"lro_flushed", IXGBE_STAT(lro_flushed)}, ++#ifndef IXGBE_NO_LRO ++ {"lro_aggregated", IXGBE_STAT(lro_stats.coal)}, ++ {"lro_flushed", IXGBE_STAT(lro_stats.flushed)}, ++ {"lro_recycled", IXGBE_STAT(lro_stats.recycled)}, ++#endif /* IXGBE_NO_LRO */ ++ {"rx_no_dma_resources", IXGBE_STAT(hw_rx_no_dma_resources)}, ++#ifndef IXGBE_NO_HW_RSC ++ {"hw_rsc_count", IXGBE_STAT(rsc_count)}, + #endif ++ {"rx_flm", IXGBE_STAT(flm)}, ++ {"fdir_match", IXGBE_STAT(stats.fdirmatch)}, ++ {"fdir_miss", IXGBE_STAT(stats.fdirmiss)}, + }; + + #define IXGBE_QUEUE_STATS_LEN \ +- ((((struct ixgbe_adapter *)netdev->priv)->num_tx_queues + \ +- ((struct ixgbe_adapter *)netdev->priv)->num_rx_queues) * \ +- (sizeof(struct ixgbe_queue_stats) / sizeof(u64))) +-#define IXGBE_GLOBAL_STATS_LEN ARRAY_SIZE(ixgbe_gstrings_stats) ++ ((((struct ixgbe_adapter *)netdev_priv(netdev))->num_tx_queues + \ ++ ((struct ixgbe_adapter *)netdev_priv(netdev))->num_rx_queues) * \ ++ (sizeof(struct ixgbe_queue_stats) / sizeof(u64))) + #define IXGBE_PB_STATS_LEN ( \ +- (((struct ixgbe_adapter *)netdev->priv)->flags & \ +- IXGBE_FLAG_DCB_ENABLED) ? \ +- (sizeof(((struct ixgbe_adapter *)0)->stats.pxonrxc) + \ +- sizeof(((struct ixgbe_adapter *)0)->stats.pxontxc) + \ +- sizeof(((struct ixgbe_adapter *)0)->stats.pxoffrxc) + \ +- sizeof(((struct ixgbe_adapter *)0)->stats.pxofftxc)) \ +- / sizeof(u64) : 0) +-#define IXGBE_STATS_LEN (IXGBE_GLOBAL_STATS_LEN + \ +- IXGBE_PB_STATS_LEN + \ +- IXGBE_QUEUE_STATS_LEN) ++ (((struct ixgbe_adapter *)netdev_priv(netdev))->flags & \ ++ IXGBE_FLAG_DCB_ENABLED) ? \ ++ (sizeof(((struct ixgbe_adapter *)0)->stats.pxonrxc) + \ ++ sizeof(((struct ixgbe_adapter *)0)->stats.pxontxc) + \ ++ sizeof(((struct ixgbe_adapter *)0)->stats.pxoffrxc) + \ ++ sizeof(((struct ixgbe_adapter *)0)->stats.pxofftxc)) \ ++ / sizeof(u64) : 0) ++#define IXGBE_STATS_LEN (IXGBE_GLOBAL_STATS_LEN + IXGBE_PB_STATS_LEN + IXGBE_QUEUE_STATS_LEN) ++#define IXGBE_GLOBAL_STATS_LEN ARRAY_SIZE(ixgbe_gstrings_stats) ++#endif /* ETHTOOL_GSTATS */ ++#ifdef ETHTOOL_TEST ++static const char ixgbe_gstrings_test[][ETH_GSTRING_LEN] = { ++ "Register test (offline)", "Eeprom test (offline)", ++ "Interrupt test (offline)", "Loopback test (offline)", ++ "Link test (on/offline)" ++}; ++#define IXGBE_TEST_LEN sizeof(ixgbe_gstrings_test) / ETH_GSTRING_LEN ++#endif /* ETHTOOL_TEST */ + + static int ixgbe_get_settings(struct net_device *netdev, + struct ethtool_cmd *ecmd) +@@ -123,17 +155,55 @@ + ecmd->supported = SUPPORTED_10000baseT_Full; + ecmd->autoneg = AUTONEG_ENABLE; + ecmd->transceiver = XCVR_EXTERNAL; +- if (hw->phy.media_type == ixgbe_media_type_copper) { ++ if ((hw->phy.media_type == ixgbe_media_type_copper) || ++ (hw->mac.type == ixgbe_mac_82599EB)) { + ecmd->supported |= (SUPPORTED_1000baseT_Full | +- SUPPORTED_TP | SUPPORTED_Autoneg); ++ SUPPORTED_Autoneg); + +- ecmd->advertising = (ADVERTISED_TP | ADVERTISED_Autoneg); ++ ecmd->advertising = ADVERTISED_Autoneg; + if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_10GB_FULL) + ecmd->advertising |= ADVERTISED_10000baseT_Full; + if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_1GB_FULL) + ecmd->advertising |= ADVERTISED_1000baseT_Full; ++ /* ++ * It's possible that phy.autoneg_advertised may not be ++ * set yet. If so display what the default would be - ++ * both 1G and 10G supported. ++ */ ++ if (!(ecmd->advertising & (ADVERTISED_1000baseT_Full | ++ ADVERTISED_10000baseT_Full))) ++ ecmd->advertising |= (ADVERTISED_10000baseT_Full | ++ ADVERTISED_1000baseT_Full); + +- ecmd->port = PORT_TP; ++ if (hw->phy.media_type == ixgbe_media_type_copper) { ++ ecmd->supported |= SUPPORTED_TP; ++ ecmd->advertising |= ADVERTISED_TP; ++ ecmd->port = PORT_TP; ++ } else { ++ ecmd->supported |= SUPPORTED_FIBRE; ++ ecmd->advertising |= ADVERTISED_FIBRE; ++ ecmd->port = PORT_FIBRE; ++ } ++ } else if (hw->phy.media_type == ixgbe_media_type_backplane) { ++ /* Set as FIBRE until SERDES defined in kernel */ ++ switch (hw->device_id) { ++ case IXGBE_DEV_ID_82598: ++ ecmd->supported |= (SUPPORTED_1000baseT_Full | ++ SUPPORTED_FIBRE); ++ ecmd->advertising = (ADVERTISED_10000baseT_Full | ++ ADVERTISED_1000baseT_Full | ++ ADVERTISED_FIBRE); ++ ecmd->port = PORT_FIBRE; ++ break; ++ case IXGBE_DEV_ID_82598_BX: ++ ecmd->supported = (SUPPORTED_1000baseT_Full | ++ SUPPORTED_FIBRE); ++ ecmd->advertising = (ADVERTISED_1000baseT_Full | ++ ADVERTISED_FIBRE); ++ ecmd->port = PORT_FIBRE; ++ ecmd->autoneg = AUTONEG_DISABLE; ++ break; ++ } + } else { + ecmd->supported |= SUPPORTED_FIBRE; + ecmd->advertising = (ADVERTISED_10000baseT_Full | +@@ -142,7 +212,17 @@ + ecmd->autoneg = AUTONEG_DISABLE; + } + +- hw->mac.ops.check_link(hw, &link_speed, &link_up, false); ++ if (!in_interrupt()) { ++ hw->mac.ops.check_link(hw, &link_speed, &link_up, false); ++ } else { ++ /* ++ * this case is a special workaround for RHEL5 bonding ++ * that calls this routine from interrupt context ++ */ ++ link_speed = adapter->link_speed; ++ link_up = adapter->link_up; ++ } ++ + if (link_up) { + ecmd->speed = (link_speed == IXGBE_LINK_SPEED_10GB_FULL) ? + SPEED_10000 : SPEED_1000; +@@ -161,16 +241,10 @@ + struct ixgbe_adapter *adapter = netdev_priv(netdev); + struct ixgbe_hw *hw = &adapter->hw; + u32 advertised, old; +- s32 err; ++ s32 err = 0; + +- switch (hw->phy.media_type) { +- case ixgbe_media_type_fiber: +- if ((ecmd->autoneg == AUTONEG_ENABLE) || +- (ecmd->speed + ecmd->duplex != SPEED_10000 + DUPLEX_FULL)) +- return -EINVAL; +- /* in this case we currently only support 10Gb/FULL */ +- break; +- case ixgbe_media_type_copper: ++ if ((hw->phy.media_type == ixgbe_media_type_copper) || ++ (hw->mac.type == ixgbe_mac_82599EB)) { + /* 10000/copper and 1000/copper must autoneg + * this function does not support any duplex forcing, but can + * limit the advertising of the adapter to only 10000 or 1000 */ +@@ -186,20 +260,23 @@ + advertised |= IXGBE_LINK_SPEED_1GB_FULL; + + if (old == advertised) +- break; ++ return err; + /* this sets the link speed and restarts auto-neg */ ++ hw->mac.autotry_restart = true; + err = hw->mac.ops.setup_link_speed(hw, advertised, true, true); + if (err) { + DPRINTK(PROBE, INFO, + "setup link failed with code %d\n", err); + hw->mac.ops.setup_link_speed(hw, old, true, true); + } +- break; +- default: +- break; ++ } else { ++ /* in this case we currently only support 10Gb/FULL */ ++ if ((ecmd->autoneg == AUTONEG_ENABLE) || ++ (ecmd->speed + ecmd->duplex != SPEED_10000 + DUPLEX_FULL)) ++ return -EINVAL; + } + +- return 0; ++ return err; + } + + static void ixgbe_get_pauseparam(struct net_device *netdev, +@@ -208,13 +285,29 @@ + struct ixgbe_adapter *adapter = netdev_priv(netdev); + struct ixgbe_hw *hw = &adapter->hw; + +- pause->autoneg = (hw->fc.type == ixgbe_fc_full ? 1 : 0); ++ /* ++ * Flow Control Autoneg isn't on if ++ * - we didn't ask for it OR ++ * - it failed, we know this by tx & rx being off ++ */ ++ if (hw->fc.disable_fc_autoneg || (hw->fc.current_mode == ixgbe_fc_none)) ++ pause->autoneg = 0; ++ else ++ pause->autoneg = 1; + +- if (hw->fc.type == ixgbe_fc_rx_pause) { ++#ifdef CONFIG_DCB ++ if (hw->fc.current_mode == ixgbe_fc_pfc) { ++ pause->rx_pause = 0; ++ pause->tx_pause = 0; ++ return; ++ } ++#endif ++ ++ if (hw->fc.current_mode == ixgbe_fc_rx_pause) { + pause->rx_pause = 1; +- } else if (hw->fc.type == ixgbe_fc_tx_pause) { ++ } else if (hw->fc.current_mode == ixgbe_fc_tx_pause) { + pause->tx_pause = 1; +- } else if (hw->fc.type == ixgbe_fc_full) { ++ } else if (hw->fc.current_mode == ixgbe_fc_full) { + pause->rx_pause = 1; + pause->tx_pause = 1; + } +@@ -225,25 +318,41 @@ + { + struct ixgbe_adapter *adapter = netdev_priv(netdev); + struct ixgbe_hw *hw = &adapter->hw; ++ struct ixgbe_fc_info fc; + +- if ((pause->autoneg == AUTONEG_ENABLE) || +- (pause->rx_pause && pause->tx_pause)) +- hw->fc.type = ixgbe_fc_full; ++ if (adapter->dcb_cfg.pfc_mode_enable || ++ ((hw->mac.type == ixgbe_mac_82598EB) && ++ (adapter->flags & IXGBE_FLAG_DCB_ENABLED))) ++ return -EINVAL; ++ ++ fc = hw->fc; ++ ++ if (pause->autoneg != AUTONEG_ENABLE) ++ fc.disable_fc_autoneg = true; ++ else ++ fc.disable_fc_autoneg = false; ++ ++ if (pause->rx_pause && pause->tx_pause) ++ fc.requested_mode = ixgbe_fc_full; + else if (pause->rx_pause && !pause->tx_pause) +- hw->fc.type = ixgbe_fc_rx_pause; ++ fc.requested_mode = ixgbe_fc_rx_pause; + else if (!pause->rx_pause && pause->tx_pause) +- hw->fc.type = ixgbe_fc_tx_pause; ++ fc.requested_mode = ixgbe_fc_tx_pause; + else if (!pause->rx_pause && !pause->tx_pause) +- hw->fc.type = ixgbe_fc_none; ++ fc.requested_mode = ixgbe_fc_none; + else + return -EINVAL; + +- hw->fc.original_type = hw->fc.type; ++ adapter->last_lfc_mode = fc.requested_mode; + +- if (netif_running(netdev)) +- ixgbe_reinit_locked(adapter); +- else +- ixgbe_reset(adapter); ++ /* if the thing changed then we'll update and use new autoneg */ ++ if (memcmp(&fc, &hw->fc, sizeof(struct ixgbe_fc_info))) { ++ hw->fc = fc; ++ if (netif_running(netdev)) ++ ixgbe_reinit_locked(adapter); ++ else ++ ixgbe_reset(adapter); ++ } + + return 0; + } +@@ -278,26 +387,62 @@ + static int ixgbe_set_tx_csum(struct net_device *netdev, u32 data) + { + if (data) ++#ifdef NETIF_F_IPV6_CSUM + netdev->features |= (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM); + else + netdev->features &= ~(NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM); ++#else ++ netdev->features |= NETIF_F_IP_CSUM; ++ else ++ netdev->features &= ~NETIF_F_IP_CSUM; ++#endif + + return 0; + } + ++#ifdef NETIF_F_TSO + static int ixgbe_set_tso(struct net_device *netdev, u32 data) + { ++#ifndef HAVE_NETDEV_VLAN_FEATURES ++ struct ixgbe_adapter *adapter = netdev_priv(netdev); ++#endif /* HAVE_NETDEV_VLAN_FEATURES */ + if (data) { + netdev->features |= NETIF_F_TSO; ++#ifdef NETIF_F_TSO6 + netdev->features |= NETIF_F_TSO6; ++#endif + } else { + netif_tx_stop_all_queues(netdev); + netdev->features &= ~NETIF_F_TSO; ++#ifdef NETIF_F_TSO6 + netdev->features &= ~NETIF_F_TSO6; ++#endif ++#ifndef HAVE_NETDEV_VLAN_FEATURES ++#ifdef NETIF_F_HW_VLAN_TX ++ /* disable TSO on all VLANs if they're present */ ++ if (adapter->vlgrp) { ++ int i; ++ struct net_device *v_netdev; ++ for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) { ++ v_netdev = ++ vlan_group_get_device(adapter->vlgrp, i); ++ if (v_netdev) { ++ v_netdev->features &= ~NETIF_F_TSO; ++#ifdef NETIF_F_TSO6 ++ v_netdev->features &= ~NETIF_F_TSO6; ++#endif ++ vlan_group_set_device(adapter->vlgrp, i, ++ v_netdev); ++ } ++ } ++ } ++#endif ++#endif /* HAVE_NETDEV_VLAN_FEATURES */ + netif_tx_start_all_queues(netdev); + } + return 0; + } ++#endif /* NETIF_F_TSO */ + + static u32 ixgbe_get_msglevel(struct net_device *netdev) + { +@@ -319,8 +464,8 @@ + + #define IXGBE_GET_STAT(_A_, _R_) _A_->stats._R_ + +-static void ixgbe_get_regs(struct net_device *netdev, +- struct ethtool_regs *regs, void *p) ++static void ixgbe_get_regs(struct net_device *netdev, struct ethtool_regs *regs, ++ void *p) + { + struct ixgbe_adapter *adapter = netdev_priv(netdev); + struct ixgbe_hw *hw = &adapter->hw; +@@ -376,9 +521,15 @@ + regs_buff[33] = IXGBE_READ_REG(hw, IXGBE_FCTTV(2)); + regs_buff[34] = IXGBE_READ_REG(hw, IXGBE_FCTTV(3)); + for (i = 0; i < 8; i++) +- regs_buff[35 + i] = IXGBE_READ_REG(hw, IXGBE_FCRTL(i)); ++ if (hw->mac.type == ixgbe_mac_82599EB) ++ regs_buff[35 + i] = IXGBE_READ_REG(hw, IXGBE_FCRTL_82599(i)); ++ else ++ regs_buff[35 + i] = IXGBE_READ_REG(hw, IXGBE_FCRTL(i)); + for (i = 0; i < 8; i++) +- regs_buff[43 + i] = IXGBE_READ_REG(hw, IXGBE_FCRTH(i)); ++ if (hw->mac.type == ixgbe_mac_82599EB) ++ regs_buff[43 + i] = IXGBE_READ_REG(hw, IXGBE_FCRTH_82599(i)); ++ else ++ regs_buff[43 + i] = IXGBE_READ_REG(hw, IXGBE_FCRTH(i)); + regs_buff[51] = IXGBE_READ_REG(hw, IXGBE_FCRTV); + regs_buff[52] = IXGBE_READ_REG(hw, IXGBE_TFCS); + +@@ -458,8 +609,9 @@ + regs_buff[825] = IXGBE_READ_REG(hw, IXGBE_IP6AT); + regs_buff[826] = IXGBE_READ_REG(hw, IXGBE_WUPL); + regs_buff[827] = IXGBE_READ_REG(hw, IXGBE_WUPM); +- regs_buff[828] = IXGBE_READ_REG(hw, IXGBE_FHFT); ++ regs_buff[828] = IXGBE_READ_REG(hw, IXGBE_FHFT(0)); + ++ /* DCB */ + regs_buff[829] = IXGBE_READ_REG(hw, IXGBE_RMCS); + regs_buff[830] = IXGBE_READ_REG(hw, IXGBE_DPMCS); + regs_buff[831] = IXGBE_READ_REG(hw, IXGBE_PDPMCS); +@@ -644,8 +796,8 @@ + return -ENOMEM; + + for (i = 0; i < eeprom_len; i++) { +- if ((ret_val = hw->eeprom.ops.read(hw, first_word + i, +- &eeprom_buff[i]))) ++ if ((ret_val = ixgbe_read_eeprom(hw, first_word + i, ++ &eeprom_buff[i]))) + break; + } + +@@ -659,16 +811,79 @@ + return ret_val; + } + ++static int ixgbe_set_eeprom(struct net_device *netdev, ++ struct ethtool_eeprom *eeprom, u8 *bytes) ++{ ++ struct ixgbe_adapter *adapter = netdev_priv(netdev); ++ struct ixgbe_hw *hw = &adapter->hw; ++ u16 *eeprom_buff; ++ void *ptr; ++ int max_len, first_word, last_word, ret_val = 0; ++ u16 i; ++ ++ if (eeprom->len == 0) ++ return -EOPNOTSUPP; ++ ++ if (eeprom->magic != (hw->vendor_id | (hw->device_id << 16))) ++ return -EFAULT; ++ ++ max_len = hw->eeprom.word_size * 2; ++ ++ first_word = eeprom->offset >> 1; ++ last_word = (eeprom->offset + eeprom->len - 1) >> 1; ++ eeprom_buff = kmalloc(max_len, GFP_KERNEL); ++ if (!eeprom_buff) ++ return -ENOMEM; ++ ++ ptr = (void *)eeprom_buff; ++ ++ if (eeprom->offset & 1) { ++ /* need read/modify/write of first changed EEPROM word */ ++ /* only the second byte of the word is being modified */ ++ ret_val = ixgbe_read_eeprom(hw, first_word, &eeprom_buff[0]); ++ ptr++; ++ } ++ if (((eeprom->offset + eeprom->len) & 1) && (ret_val == 0)) { ++ /* need read/modify/write of last changed EEPROM word */ ++ /* only the first byte of the word is being modified */ ++ ret_val = ixgbe_read_eeprom(hw, last_word, ++ &eeprom_buff[last_word - first_word]); ++ } ++ ++ /* Device's eeprom is always little-endian, word addressable */ ++ for (i = 0; i < last_word - first_word + 1; i++) ++ le16_to_cpus(&eeprom_buff[i]); ++ ++ memcpy(ptr, bytes, eeprom->len); ++ ++ for (i = 0; i <= (last_word - first_word); i++) ++ ret_val |= ixgbe_write_eeprom(hw, first_word + i, eeprom_buff[i]); ++ ++ /* Update the checksum */ ++ ixgbe_update_eeprom_checksum(hw); ++ ++ kfree(eeprom_buff); ++ return ret_val; ++} ++ + static void ixgbe_get_drvinfo(struct net_device *netdev, + struct ethtool_drvinfo *drvinfo) + { + struct ixgbe_adapter *adapter = netdev_priv(netdev); ++ char firmware_version[32]; + + strncpy(drvinfo->driver, ixgbe_driver_name, 32); + strncpy(drvinfo->version, ixgbe_driver_version, 32); +- strncpy(drvinfo->fw_version, "N/A", 32); ++ ++ sprintf(firmware_version, "%d.%d-%d", ++ (adapter->eeprom_version & 0xF000) >> 12, ++ (adapter->eeprom_version & 0x0FF0) >> 4, ++ adapter->eeprom_version & 0x000F); ++ ++ strncpy(drvinfo->fw_version, firmware_version, 32); + strncpy(drvinfo->bus_info, pci_name(adapter->pdev), 32); + drvinfo->n_stats = IXGBE_STATS_LEN; ++ drvinfo->testinfo_len = IXGBE_TEST_LEN; + drvinfo->regdump_len = ixgbe_get_regs_len(netdev); + } + +@@ -693,9 +908,10 @@ + struct ethtool_ringparam *ring) + { + struct ixgbe_adapter *adapter = netdev_priv(netdev); +- struct ixgbe_ring *temp_ring; ++ struct ixgbe_ring *temp_tx_ring, *temp_rx_ring; + int i, err; + u32 new_rx_count, new_tx_count; ++ bool need_update = false; + + if ((ring->rx_mini_pending) || (ring->rx_jumbo_pending)) + return -EINVAL; +@@ -714,96 +930,99 @@ + return 0; + } + +- if (adapter->num_tx_queues > adapter->num_rx_queues) +- temp_ring = vmalloc(adapter->num_tx_queues * +- sizeof(struct ixgbe_ring)); +- else +- temp_ring = vmalloc(adapter->num_rx_queues * +- sizeof(struct ixgbe_ring)); +- if (!temp_ring) +- return -ENOMEM; +- + while (test_and_set_bit(__IXGBE_RESETTING, &adapter->state)) + msleep(1); + +- if (netif_running(netdev)) +- ixgbe_down(adapter); ++ temp_tx_ring = kcalloc(adapter->num_tx_queues, ++ sizeof(struct ixgbe_ring), GFP_KERNEL); ++ if (!temp_tx_ring) { ++ err = -ENOMEM; ++ goto err_setup; ++ } + +- /* +- * We can't just free everything and then setup again, +- * because the ISRs in MSI-X mode get passed pointers +- * to the tx and rx ring structs. +- */ +- if (new_tx_count != adapter->tx_ring->count) { +- memcpy(temp_ring, adapter->tx_ring, ++ if (new_tx_count != adapter->tx_ring_count) { ++ memcpy(temp_tx_ring, adapter->tx_ring, + adapter->num_tx_queues * sizeof(struct ixgbe_ring)); +- + for (i = 0; i < adapter->num_tx_queues; i++) { +- temp_ring[i].count = new_tx_count; +- err = ixgbe_setup_tx_resources(adapter, &temp_ring[i]); ++ temp_tx_ring[i].count = new_tx_count; ++ err = ixgbe_setup_tx_resources(adapter, ++ &temp_tx_ring[i]); + if (err) { + while (i) { + i--; + ixgbe_free_tx_resources(adapter, +- &temp_ring[i]); ++ &temp_tx_ring[i]); + } + goto err_setup; + } + } +- +- for (i = 0; i < adapter->num_tx_queues; i++) +- ixgbe_free_tx_resources(adapter, &adapter->tx_ring[i]); +- +- memcpy(adapter->tx_ring, temp_ring, +- adapter->num_tx_queues * sizeof(struct ixgbe_ring)); +- +- adapter->tx_ring_count = new_tx_count; ++ need_update = true; + } + +- if (new_rx_count != adapter->rx_ring->count) { +- memcpy(temp_ring, adapter->rx_ring, ++ temp_rx_ring = kcalloc(adapter->num_rx_queues, ++ sizeof(struct ixgbe_ring), GFP_KERNEL); ++ if ((!temp_rx_ring) && (need_update)) { ++ for (i = 0; i < adapter->num_tx_queues; i++) ++ ixgbe_free_tx_resources(adapter, &temp_tx_ring[i]); ++ kfree(temp_tx_ring); ++ err = -ENOMEM; ++ goto err_setup; ++ } ++ ++ if (new_rx_count != adapter->rx_ring_count) { ++ memcpy(temp_rx_ring, adapter->rx_ring, + adapter->num_rx_queues * sizeof(struct ixgbe_ring)); +- + for (i = 0; i < adapter->num_rx_queues; i++) { +- temp_ring[i].count = new_rx_count; +- err = ixgbe_setup_rx_resources(adapter, &temp_ring[i]); ++ temp_rx_ring[i].count = new_rx_count; ++ err = ixgbe_setup_rx_resources(adapter, ++ &temp_rx_ring[i]); + if (err) { + while (i) { + i--; + ixgbe_free_rx_resources(adapter, +- &temp_ring[i]); ++ &temp_rx_ring[i]); + } + goto err_setup; + } + } ++ need_update = true; ++ } + +- for (i = 0; i < adapter->num_rx_queues; i++) +- ixgbe_free_rx_resources(adapter, &adapter->rx_ring[i]); ++ /* if rings need to be updated, here's the place to do it in one shot */ ++ if (need_update) { ++ if (netif_running(netdev)) ++ ixgbe_down(adapter); + +- memcpy(adapter->rx_ring, temp_ring, +- adapter->num_rx_queues * sizeof(struct ixgbe_ring)); ++ /* tx */ ++ if (new_tx_count != adapter->tx_ring_count) { ++ kfree(adapter->tx_ring); ++ adapter->tx_ring = temp_tx_ring; ++ temp_tx_ring = NULL; ++ adapter->tx_ring_count = new_tx_count; ++ } + +- adapter->rx_ring_count = new_rx_count; ++ /* rx */ ++ if (new_rx_count != adapter->rx_ring_count) { ++ kfree(adapter->rx_ring); ++ adapter->rx_ring = temp_rx_ring; ++ temp_rx_ring = NULL; ++ adapter->rx_ring_count = new_rx_count; ++ } + } + + /* success! */ + err = 0; +-err_setup: + if (netif_running(netdev)) + ixgbe_up(adapter); + ++err_setup: + clear_bit(__IXGBE_RESETTING, &adapter->state); + return err; + } + +-static int ixgbe_get_sset_count(struct net_device *netdev, int sset) ++static int ixgbe_get_stats_count(struct net_device *netdev) + { +- switch (sset) { +- case ETH_SS_STATS: +- return IXGBE_STATS_LEN; +- default: +- return -EOPNOTSUPP; +- } ++ return IXGBE_STATS_LEN; + } + + static void ixgbe_get_ethtool_stats(struct net_device *netdev, +@@ -814,18 +1033,6 @@ + int stat_count = sizeof(struct ixgbe_queue_stats) / sizeof(u64); + int j, k; + int i; +- +-#ifdef CONFIG_IXGBE_LRO +- u64 aggregated = 0, flushed = 0, no_desc = 0; +- for (i = 0; i < adapter->num_rx_queues; i++) { +- aggregated += adapter->rx_ring[i].lro_mgr.stats.aggregated; +- flushed += adapter->rx_ring[i].lro_mgr.stats.flushed; +- no_desc += adapter->rx_ring[i].lro_mgr.stats.no_desc; +- } +- adapter->lro_aggregated = aggregated; +- adapter->lro_flushed = flushed; +- adapter->lro_no_desc = no_desc; +-#endif + + ixgbe_update_stats(adapter); + for (i = 0; i < IXGBE_GLOBAL_STATS_LEN; i++) { +@@ -865,6 +1072,10 @@ + int i; + + switch (stringset) { ++ case ETH_SS_TEST: ++ memcpy(data, *ixgbe_gstrings_test, ++ IXGBE_TEST_LEN * ETH_GSTRING_LEN); ++ break; + case ETH_SS_STATS: + for (i = 0; i < IXGBE_GLOBAL_STATS_LEN; i++) { + memcpy(p, ixgbe_gstrings_stats[i].stat_string, +@@ -897,19 +1108,904 @@ + p += ETH_GSTRING_LEN; + } + } +- /* BUG_ON(p - data != IXGBE_STATS_LEN * ETH_GSTRING_LEN); */ ++/* BUG_ON(p - data != IXGBE_STATS_LEN * ETH_GSTRING_LEN); */ + break; + } + } + ++static int ixgbe_link_test(struct ixgbe_adapter *adapter, u64 *data) ++{ ++ struct ixgbe_hw *hw = &adapter->hw; ++ bool link_up; ++ u32 link_speed = 0; ++ *data = 0; ++ ++ hw->mac.ops.check_link(hw, &link_speed, &link_up, true); ++ if (link_up) ++ return *data; ++ else ++ *data = 1; ++ return *data; ++} ++ ++/* ethtool register test data */ ++struct ixgbe_reg_test { ++ u16 reg; ++ u8 array_len; ++ u8 test_type; ++ u32 mask; ++ u32 write; ++}; ++ ++/* In the hardware, registers are laid out either singly, in arrays ++ * spaced 0x40 bytes apart, or in contiguous tables. We assume ++ * most tests take place on arrays or single registers (handled ++ * as a single-element array) and special-case the tables. ++ * Table tests are always pattern tests. ++ * ++ * We also make provision for some required setup steps by specifying ++ * registers to be written without any read-back testing. ++ */ ++ ++#define PATTERN_TEST 1 ++#define SET_READ_TEST 2 ++#define WRITE_NO_TEST 3 ++#define TABLE32_TEST 4 ++#define TABLE64_TEST_LO 5 ++#define TABLE64_TEST_HI 6 ++ ++/* default 82599 register test */ ++static struct ixgbe_reg_test reg_test_82599[] = { ++ { IXGBE_FCRTL_82599(0), 1, PATTERN_TEST, 0x8007FFF0, 0x8007FFF0 }, ++ { IXGBE_FCRTH_82599(0), 1, PATTERN_TEST, 0x8007FFF0, 0x8007FFF0 }, ++ { IXGBE_PFCTOP, 1, PATTERN_TEST, 0xFFFFFFFF, 0xFFFFFFFF }, ++ { IXGBE_VLNCTRL, 1, PATTERN_TEST, 0x00000000, 0x00000000 }, ++ { IXGBE_RDBAL(0), 4, PATTERN_TEST, 0xFFFFFF80, 0xFFFFFF80 }, ++ { IXGBE_RDBAH(0), 4, PATTERN_TEST, 0xFFFFFFFF, 0xFFFFFFFF }, ++ { IXGBE_RDLEN(0), 4, PATTERN_TEST, 0x000FFF80, 0x000FFFFF }, ++ { IXGBE_RXDCTL(0), 4, WRITE_NO_TEST, 0, IXGBE_RXDCTL_ENABLE }, ++ { IXGBE_RDT(0), 4, PATTERN_TEST, 0x0000FFFF, 0x0000FFFF }, ++ { IXGBE_RXDCTL(0), 4, WRITE_NO_TEST, 0, 0 }, ++ { IXGBE_FCRTH(0), 1, PATTERN_TEST, 0x8007FFF0, 0x8007FFF0 }, ++ { IXGBE_FCTTV(0), 1, PATTERN_TEST, 0xFFFFFFFF, 0xFFFFFFFF }, ++ { IXGBE_TDBAL(0), 4, PATTERN_TEST, 0xFFFFFF80, 0xFFFFFFFF }, ++ { IXGBE_TDBAH(0), 4, PATTERN_TEST, 0xFFFFFFFF, 0xFFFFFFFF }, ++ { IXGBE_TDLEN(0), 4, PATTERN_TEST, 0x000FFF80, 0x000FFF80 }, ++ { IXGBE_RXCTRL, 1, SET_READ_TEST, 0x00000001, 0x00000001 }, ++ { IXGBE_RAL(0), 16, TABLE64_TEST_LO, 0xFFFFFFFF, 0xFFFFFFFF }, ++ { IXGBE_RAL(0), 16, TABLE64_TEST_HI, 0x8001FFFF, 0x800CFFFF }, ++ { IXGBE_MTA(0), 128, TABLE32_TEST, 0xFFFFFFFF, 0xFFFFFFFF }, ++ { 0, 0, 0, 0 } ++}; ++ ++/* default 82598 register test */ ++static struct ixgbe_reg_test reg_test_82598[] = { ++ { IXGBE_FCRTL(0), 1, PATTERN_TEST, 0x8007FFF0, 0x8007FFF0 }, ++ { IXGBE_FCRTH(0), 1, PATTERN_TEST, 0x8007FFF0, 0x8007FFF0 }, ++ { IXGBE_PFCTOP, 1, PATTERN_TEST, 0xFFFFFFFF, 0xFFFFFFFF }, ++ { IXGBE_VLNCTRL, 1, PATTERN_TEST, 0x00000000, 0x00000000 }, ++ { IXGBE_RDBAL(0), 4, PATTERN_TEST, 0xFFFFFF80, 0xFFFFFFFF }, ++ { IXGBE_RDBAH(0), 4, PATTERN_TEST, 0xFFFFFFFF, 0xFFFFFFFF }, ++ { IXGBE_RDLEN(0), 4, PATTERN_TEST, 0x000FFF80, 0x000FFFFF }, ++ /* Enable all four RX queues before testing. */ ++ { IXGBE_RXDCTL(0), 4, WRITE_NO_TEST, 0, IXGBE_RXDCTL_ENABLE }, ++ /* RDH is read-only for 82598, only test RDT. */ ++ { IXGBE_RDT(0), 4, PATTERN_TEST, 0x0000FFFF, 0x0000FFFF }, ++ { IXGBE_RXDCTL(0), 4, WRITE_NO_TEST, 0, 0 }, ++ { IXGBE_FCRTH(0), 1, PATTERN_TEST, 0x8007FFF0, 0x8007FFF0 }, ++ { IXGBE_FCTTV(0), 1, PATTERN_TEST, 0xFFFFFFFF, 0xFFFFFFFF }, ++ { IXGBE_TIPG, 1, PATTERN_TEST, 0x000000FF, 0x000000FF }, ++ { IXGBE_TDBAL(0), 4, PATTERN_TEST, 0xFFFFFF80, 0xFFFFFFFF }, ++ { IXGBE_TDBAH(0), 4, PATTERN_TEST, 0xFFFFFFFF, 0xFFFFFFFF }, ++ { IXGBE_TDLEN(0), 4, PATTERN_TEST, 0x000FFF80, 0x000FFFFF }, ++ { IXGBE_RXCTRL, 1, SET_READ_TEST, 0x00000003, 0x00000003 }, ++ { IXGBE_DTXCTL, 1, SET_READ_TEST, 0x00000005, 0x00000005 }, ++ { IXGBE_RAL(0), 16, TABLE64_TEST_LO, 0xFFFFFFFF, 0xFFFFFFFF }, ++ { IXGBE_RAL(0), 16, TABLE64_TEST_HI, 0x800CFFFF, 0x800CFFFF }, ++ { IXGBE_MTA(0), 128, TABLE32_TEST, 0xFFFFFFFF, 0xFFFFFFFF }, ++ { 0, 0, 0, 0 } ++}; ++ ++#define REG_PATTERN_TEST(R, M, W) \ ++{ \ ++ u32 pat, val, before; \ ++ const u32 _test[] = {0x5A5A5A5A, 0xA5A5A5A5, 0x00000000, 0xFFFFFFFF}; \ ++ for (pat = 0; pat < ARRAY_SIZE(_test); pat++) { \ ++ before = readl(adapter->hw.hw_addr + R); \ ++ writel((_test[pat] & W), (adapter->hw.hw_addr + R)); \ ++ val = readl(adapter->hw.hw_addr + R); \ ++ if (val != (_test[pat] & W & M)) { \ ++ DPRINTK(DRV, ERR, "pattern test reg %04X failed: got "\ ++ "0x%08X expected 0x%08X\n", \ ++ R, val, (_test[pat] & W & M)); \ ++ *data = R; \ ++ writel(before, adapter->hw.hw_addr + R); \ ++ return 1; \ ++ } \ ++ writel(before, adapter->hw.hw_addr + R); \ ++ } \ ++} ++ ++#define REG_SET_AND_CHECK(R, M, W) \ ++{ \ ++ u32 val, before; \ ++ before = readl(adapter->hw.hw_addr + R); \ ++ writel((W & M), (adapter->hw.hw_addr + R)); \ ++ val = readl(adapter->hw.hw_addr + R); \ ++ if ((W & M) != (val & M)) { \ ++ DPRINTK(DRV, ERR, "set/check reg %04X test failed: got 0x%08X "\ ++ "expected 0x%08X\n", R, (val & M), (W & M)); \ ++ *data = R; \ ++ writel(before, (adapter->hw.hw_addr + R)); \ ++ return 1; \ ++ } \ ++ writel(before, (adapter->hw.hw_addr + R)); \ ++} ++ ++static int ixgbe_reg_test(struct ixgbe_adapter *adapter, u64 *data) ++{ ++ struct ixgbe_reg_test *test; ++ u32 value, before, after; ++ u32 i, toggle; ++ ++ if (adapter->hw.mac.type == ixgbe_mac_82599EB) { ++ toggle = 0x7FFFF30F; ++ test = reg_test_82599; ++ } else { ++ toggle = 0x7FFFF3FF; ++ test = reg_test_82598; ++ } ++ ++ /* ++ * Because the status register is such a special case, ++ * we handle it separately from the rest of the register ++ * tests. Some bits are read-only, some toggle, and some ++ * are writeable on newer MACs. ++ */ ++ before = IXGBE_READ_REG(&adapter->hw, IXGBE_STATUS); ++ value = (IXGBE_READ_REG(&adapter->hw, IXGBE_STATUS) & toggle); ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_STATUS, toggle); ++ after = IXGBE_READ_REG(&adapter->hw, IXGBE_STATUS) & toggle; ++ if (value != after) { ++ DPRINTK(DRV, ERR, "failed STATUS register test got: " ++ "0x%08X expected: 0x%08X\n", after, value); ++ *data = 1; ++ return 1; ++ } ++ /* restore previous status */ ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_STATUS, before); ++ ++ /* ++ * Perform the remainder of the register test, looping through ++ * the test table until we either fail or reach the null entry. ++ */ ++ while (test->reg) { ++ for (i = 0; i < test->array_len; i++) { ++ switch (test->test_type) { ++ case PATTERN_TEST: ++ REG_PATTERN_TEST(test->reg + (i * 0x40), ++ test->mask, ++ test->write); ++ break; ++ case SET_READ_TEST: ++ REG_SET_AND_CHECK(test->reg + (i * 0x40), ++ test->mask, ++ test->write); ++ break; ++ case WRITE_NO_TEST: ++ writel(test->write, ++ (adapter->hw.hw_addr + test->reg) ++ + (i * 0x40)); ++ break; ++ case TABLE32_TEST: ++ REG_PATTERN_TEST(test->reg + (i * 4), ++ test->mask, ++ test->write); ++ break; ++ case TABLE64_TEST_LO: ++ REG_PATTERN_TEST(test->reg + (i * 8), ++ test->mask, ++ test->write); ++ break; ++ case TABLE64_TEST_HI: ++ REG_PATTERN_TEST((test->reg + 4) + (i * 8), ++ test->mask, ++ test->write); ++ break; ++ } ++ } ++ test++; ++ } ++ ++ *data = 0; ++ return 0; ++} ++ ++static int ixgbe_eeprom_test(struct ixgbe_adapter *adapter, u64 *data) ++{ ++ if (ixgbe_validate_eeprom_checksum(&adapter->hw, NULL)) ++ *data = 1; ++ else ++ *data = 0; ++ return *data; ++} ++ ++static irqreturn_t ixgbe_test_intr(int irq, void *data) ++{ ++ struct net_device *netdev = (struct net_device *) data; ++ struct ixgbe_adapter *adapter = netdev_priv(netdev); ++ ++ adapter->test_icr |= IXGBE_READ_REG(&adapter->hw, IXGBE_EICR); ++ ++ return IRQ_HANDLED; ++} ++ ++static int ixgbe_intr_test(struct ixgbe_adapter *adapter, u64 *data) ++{ ++ struct net_device *netdev = adapter->netdev; ++ u32 mask, i = 0, shared_int = true; ++ u32 irq = adapter->pdev->irq; ++ ++ *data = 0; ++ ++ /* Hook up test interrupt handler just for this test */ ++ if (adapter->msix_entries) { ++ /* NOTE: we don't test MSI-X interrupts here, yet */ ++ return 0; ++ } else if (adapter->flags & IXGBE_FLAG_MSI_ENABLED) { ++ shared_int = false; ++ if (request_irq(irq, &ixgbe_test_intr, 0, netdev->name, ++ netdev)) { ++ *data = 1; ++ return -1; ++ } ++ } else if (!request_irq(irq, &ixgbe_test_intr, IRQF_PROBE_SHARED, ++ netdev->name, netdev)) { ++ shared_int = false; ++ } else if (request_irq(irq, &ixgbe_test_intr, IRQF_SHARED, ++ netdev->name, netdev)) { ++ *data = 1; ++ return -1; ++ } ++ DPRINTK(HW, INFO, "testing %s interrupt\n", ++ (shared_int ? "shared" : "unshared")); ++ ++ /* Disable all the interrupts */ ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, 0xFFFFFFFF); ++ msleep(10); ++ ++ /* Test each interrupt */ ++ for (; i < 10; i++) { ++ /* Interrupt to test */ ++ mask = 1 << i; ++ ++ if (!shared_int) { ++ /* ++ * Disable the interrupts to be reported in ++ * the cause register and then force the same ++ * interrupt and see if one gets posted. If ++ * an interrupt was posted to the bus, the ++ * test failed. ++ */ ++ adapter->test_icr = 0; ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, ++ ~mask & 0x00007FFF); ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_EICS, ++ ~mask & 0x00007FFF); ++ msleep(10); ++ ++ if (adapter->test_icr & mask) { ++ *data = 3; ++ break; ++ } ++ } ++ ++ /* ++ * Enable the interrupt to be reported in the cause ++ * register and then force the same interrupt and see ++ * if one gets posted. If an interrupt was not posted ++ * to the bus, the test failed. ++ */ ++ adapter->test_icr = 0; ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMS, mask); ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_EICS, mask); ++ msleep(10); ++ ++ if (!(adapter->test_icr &mask)) { ++ *data = 4; ++ break; ++ } ++ ++ if (!shared_int) { ++ /* ++ * Disable the other interrupts to be reported in ++ * the cause register and then force the other ++ * interrupts and see if any get posted. If ++ * an interrupt was posted to the bus, the ++ * test failed. ++ */ ++ adapter->test_icr = 0; ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, ++ ~mask & 0x00007FFF); ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_EICS, ++ ~mask & 0x00007FFF); ++ msleep(10); ++ ++ if (adapter->test_icr) { ++ *data = 5; ++ break; ++ } ++ } ++ } ++ ++ /* Disable all the interrupts */ ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, 0xFFFFFFFF); ++ msleep(10); ++ ++ /* Unhook test interrupt handler */ ++ free_irq(irq, netdev); ++ ++ return *data; ++} ++ ++static void ixgbe_free_desc_rings(struct ixgbe_adapter *adapter) ++{ ++ struct ixgbe_ring *tx_ring = &adapter->test_tx_ring; ++ struct ixgbe_ring *rx_ring = &adapter->test_rx_ring; ++ struct ixgbe_hw *hw = &adapter->hw; ++ struct pci_dev *pdev = adapter->pdev; ++ u32 reg_ctl; ++ int i; ++ ++ /* shut down the DMA engines now so they can be reinitialized later */ ++ ++ /* first Rx */ ++ reg_ctl = IXGBE_READ_REG(hw, IXGBE_RXCTRL); ++ reg_ctl &= ~IXGBE_RXCTRL_RXEN; ++ IXGBE_WRITE_REG(hw, IXGBE_RXCTRL, reg_ctl); ++ reg_ctl = IXGBE_READ_REG(hw, IXGBE_RXDCTL(0)); ++ reg_ctl &= ~IXGBE_RXDCTL_ENABLE; ++ IXGBE_WRITE_REG(hw, IXGBE_RXDCTL(0), reg_ctl); ++ ++ /* now Tx */ ++ reg_ctl = IXGBE_READ_REG(hw, IXGBE_TXDCTL(0)); ++ reg_ctl &= ~IXGBE_TXDCTL_ENABLE; ++ IXGBE_WRITE_REG(hw, IXGBE_TXDCTL(0), reg_ctl); ++ if (hw->mac.type == ixgbe_mac_82599EB) { ++ reg_ctl = IXGBE_READ_REG(hw, IXGBE_DMATXCTL); ++ reg_ctl &= ~IXGBE_DMATXCTL_TE; ++ IXGBE_WRITE_REG(hw, IXGBE_DMATXCTL, reg_ctl); ++ } ++ ++ ixgbe_reset(adapter); ++ ++ if (tx_ring->desc && tx_ring->tx_buffer_info) { ++ for (i = 0; i < tx_ring->count; i++) { ++ struct ixgbe_tx_buffer *buf = ++ &(tx_ring->tx_buffer_info[i]); ++ if (buf->dma) { ++ pci_unmap_single(pdev, buf->dma, buf->length, ++ PCI_DMA_TODEVICE); ++ buf->dma = 0; ++ } ++ if (buf->skb) ++ dev_kfree_skb(buf->skb); ++ } ++ } ++ ++ if (rx_ring->desc && rx_ring->rx_buffer_info) { ++ for (i = 0; i < rx_ring->count; i++) { ++ struct ixgbe_rx_buffer *buf = ++ &(rx_ring->rx_buffer_info[i]); ++ if (buf->dma) { ++ pci_unmap_single(pdev, buf->dma, ++ IXGBE_RXBUFFER_2048, ++ PCI_DMA_FROMDEVICE); ++ buf->dma = 0; ++ } ++ if (buf->skb) ++ dev_kfree_skb(buf->skb); ++ } ++ } ++ ++ if (tx_ring->desc) { ++ pci_free_consistent(pdev, tx_ring->size, tx_ring->desc, ++ tx_ring->dma); ++ tx_ring->desc = NULL; ++ } ++ if (rx_ring->desc) { ++ pci_free_consistent(pdev, rx_ring->size, rx_ring->desc, ++ rx_ring->dma); ++ rx_ring->desc = NULL; ++ } ++ ++ kfree(tx_ring->tx_buffer_info); ++ tx_ring->tx_buffer_info = NULL; ++ kfree(rx_ring->rx_buffer_info); ++ rx_ring->rx_buffer_info = NULL; ++ ++ return; ++} ++ ++static int ixgbe_setup_desc_rings(struct ixgbe_adapter *adapter) ++{ ++ struct ixgbe_ring *tx_ring = &adapter->test_tx_ring; ++ struct ixgbe_ring *rx_ring = &adapter->test_rx_ring; ++ struct pci_dev *pdev = adapter->pdev; ++ u32 rctl, reg_data; ++ int i, ret_val; ++ ++ /* Setup Tx descriptor ring and Tx buffers */ ++ ++ if (!tx_ring->count) ++ tx_ring->count = IXGBE_DEFAULT_TXD; ++ ++ tx_ring->tx_buffer_info = kcalloc(tx_ring->count, ++ sizeof(struct ixgbe_tx_buffer), ++ GFP_KERNEL); ++ if (!(tx_ring->tx_buffer_info)) { ++ ret_val = 1; ++ goto err_nomem; ++ } ++ ++ tx_ring->size = tx_ring->count * sizeof(struct ixgbe_legacy_tx_desc); ++ tx_ring->size = ALIGN(tx_ring->size, 4096); ++ if (!(tx_ring->desc = pci_alloc_consistent(pdev, tx_ring->size, ++ &tx_ring->dma))) { ++ ret_val = 2; ++ goto err_nomem; ++ } ++ tx_ring->next_to_use = tx_ring->next_to_clean = 0; ++ ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_TDBAL(0), ++ ((u64) tx_ring->dma & 0x00000000FFFFFFFF)); ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_TDBAH(0), ++ ((u64) tx_ring->dma >> 32)); ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_TDLEN(0), ++ tx_ring->count * sizeof(struct ixgbe_legacy_tx_desc)); ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_TDH(0), 0); ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_TDT(0), 0); ++ ++ reg_data = IXGBE_READ_REG(&adapter->hw, IXGBE_HLREG0); ++ reg_data |= IXGBE_HLREG0_TXPADEN; ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_HLREG0, reg_data); ++ ++ if (adapter->hw.mac.type == ixgbe_mac_82599EB) { ++ reg_data = IXGBE_READ_REG(&adapter->hw, IXGBE_DMATXCTL); ++ reg_data |= IXGBE_DMATXCTL_TE; ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_DMATXCTL, reg_data); ++ } ++ reg_data = IXGBE_READ_REG(&adapter->hw, IXGBE_TXDCTL(0)); ++ reg_data |= IXGBE_TXDCTL_ENABLE; ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_TXDCTL(0), reg_data); ++ ++ for (i = 0; i < tx_ring->count; i++) { ++ struct ixgbe_legacy_tx_desc *desc = IXGBE_TX_DESC(*tx_ring, i); ++ struct sk_buff *skb; ++ unsigned int size = 1024; ++ ++ skb = alloc_skb(size, GFP_KERNEL); ++ if (!skb) { ++ ret_val = 3; ++ goto err_nomem; ++ } ++ skb_put(skb, size); ++ tx_ring->tx_buffer_info[i].skb = skb; ++ tx_ring->tx_buffer_info[i].length = skb->len; ++ tx_ring->tx_buffer_info[i].dma = ++ pci_map_single(pdev, skb->data, skb->len, ++ PCI_DMA_TODEVICE); ++ desc->buffer_addr = cpu_to_le64(tx_ring->tx_buffer_info[i].dma); ++ desc->lower.data = cpu_to_le32(skb->len); ++ desc->lower.data |= cpu_to_le32(IXGBE_TXD_CMD_EOP | ++ IXGBE_TXD_CMD_IFCS | ++ IXGBE_TXD_CMD_RS); ++ desc->upper.data = 0; ++ } ++ ++ /* Setup Rx Descriptor ring and Rx buffers */ ++ ++ if (!rx_ring->count) ++ rx_ring->count = IXGBE_DEFAULT_RXD; ++ ++ rx_ring->rx_buffer_info = kcalloc(rx_ring->count, ++ sizeof(struct ixgbe_rx_buffer), ++ GFP_KERNEL); ++ if (!(rx_ring->rx_buffer_info)) { ++ ret_val = 4; ++ goto err_nomem; ++ } ++ ++ rx_ring->size = rx_ring->count * sizeof(struct ixgbe_legacy_rx_desc); ++ rx_ring->size = ALIGN(rx_ring->size, 4096); ++ if (!(rx_ring->desc = pci_alloc_consistent(pdev, rx_ring->size, ++ &rx_ring->dma))) { ++ ret_val = 5; ++ goto err_nomem; ++ } ++ rx_ring->next_to_use = rx_ring->next_to_clean = 0; ++ ++ rctl = IXGBE_READ_REG(&adapter->hw, IXGBE_RXCTRL); ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_RXCTRL, rctl & ~IXGBE_RXCTRL_RXEN); ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_RDBAL(0), ++ ((u64)rx_ring->dma & 0xFFFFFFFF)); ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_RDBAH(0), ++ ((u64) rx_ring->dma >> 32)); ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_RDLEN(0), rx_ring->size); ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_RDH(0), 0); ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_RDT(0), 0); ++ ++ reg_data = IXGBE_READ_REG(&adapter->hw, IXGBE_FCTRL); ++ reg_data |= IXGBE_FCTRL_BAM | IXGBE_FCTRL_SBP | IXGBE_FCTRL_MPE; ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCTRL, reg_data); ++ ++ reg_data = IXGBE_READ_REG(&adapter->hw, IXGBE_HLREG0); ++ reg_data &= ~IXGBE_HLREG0_LPBK; ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_HLREG0, reg_data); ++ ++ reg_data = IXGBE_READ_REG(&adapter->hw, IXGBE_RDRXCTL); ++#define IXGBE_RDRXCTL_RDMTS_MASK 0x00000003 /* Receive Descriptor Minimum ++ Threshold Size mask */ ++ reg_data &= ~IXGBE_RDRXCTL_RDMTS_MASK; ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_RDRXCTL, reg_data); ++ ++ reg_data = IXGBE_READ_REG(&adapter->hw, IXGBE_MCSTCTRL); ++#define IXGBE_MCSTCTRL_MO_MASK 0x00000003 /* Multicast Offset mask */ ++ reg_data &= ~IXGBE_MCSTCTRL_MO_MASK; ++ reg_data |= adapter->hw.mac.mc_filter_type; ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_MCSTCTRL, reg_data); ++ ++ reg_data = IXGBE_READ_REG(&adapter->hw, IXGBE_RXDCTL(0)); ++ reg_data |= IXGBE_RXDCTL_ENABLE; ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_RXDCTL(0), reg_data); ++ if (adapter->hw.mac.type == ixgbe_mac_82599EB) { ++ int j = adapter->rx_ring[0].reg_idx; ++ u32 k; ++ for (k = 0; k < 10; k++) { ++ if (IXGBE_READ_REG(&adapter->hw, ++ IXGBE_RXDCTL(j)) & IXGBE_RXDCTL_ENABLE) ++ break; ++ else ++ msleep(1); ++ } ++ } ++ ++ rctl |= IXGBE_RXCTRL_RXEN | IXGBE_RXCTRL_DMBYPS; ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_RXCTRL, rctl); ++ ++ for (i = 0; i < rx_ring->count; i++) { ++ struct ixgbe_legacy_rx_desc *rx_desc = ++ IXGBE_RX_DESC(*rx_ring, i); ++ struct sk_buff *skb; ++ ++ skb = alloc_skb(IXGBE_RXBUFFER_2048 + NET_IP_ALIGN, GFP_KERNEL); ++ if (!skb) { ++ ret_val = 6; ++ goto err_nomem; ++ } ++ skb_reserve(skb, NET_IP_ALIGN); ++ rx_ring->rx_buffer_info[i].skb = skb; ++ rx_ring->rx_buffer_info[i].dma = ++ pci_map_single(pdev, skb->data, IXGBE_RXBUFFER_2048, ++ PCI_DMA_FROMDEVICE); ++ rx_desc->buffer_addr = ++ cpu_to_le64(rx_ring->rx_buffer_info[i].dma); ++ memset(skb->data, 0x00, skb->len); ++ } ++ ++ return 0; ++ ++err_nomem: ++ ixgbe_free_desc_rings(adapter); ++ return ret_val; ++} ++ ++static int ixgbe_setup_loopback_test(struct ixgbe_adapter *adapter) ++{ ++ struct ixgbe_hw *hw = &adapter->hw; ++ u32 reg_data; ++ ++ /* right now we only support MAC loopback in the driver */ ++ ++ /* Setup MAC loopback */ ++ reg_data = IXGBE_READ_REG(&adapter->hw, IXGBE_HLREG0); ++ reg_data |= IXGBE_HLREG0_LPBK; ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_HLREG0, reg_data); ++ ++ reg_data = IXGBE_READ_REG(&adapter->hw, IXGBE_AUTOC); ++ reg_data &= ~IXGBE_AUTOC_LMS_MASK; ++ reg_data |= IXGBE_AUTOC_LMS_10G_LINK_NO_AN | IXGBE_AUTOC_FLU; ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_AUTOC, reg_data); ++ ++ /* Disable Atlas Tx lanes; re-enabled in reset path */ ++ if (hw->mac.type == ixgbe_mac_82598EB) { ++ u8 atlas; ++ ++ ixgbe_read_analog_reg8(&adapter->hw, ++ IXGBE_ATLAS_PDN_LPBK, &atlas); ++ atlas |= IXGBE_ATLAS_PDN_TX_REG_EN; ++ ixgbe_write_analog_reg8(&adapter->hw, ++ IXGBE_ATLAS_PDN_LPBK, atlas); ++ ++ ixgbe_read_analog_reg8(&adapter->hw, ++ IXGBE_ATLAS_PDN_10G, &atlas); ++ atlas |= IXGBE_ATLAS_PDN_TX_10G_QL_ALL; ++ ixgbe_write_analog_reg8(&adapter->hw, ++ IXGBE_ATLAS_PDN_10G, atlas); ++ ++ ixgbe_read_analog_reg8(&adapter->hw, ++ IXGBE_ATLAS_PDN_1G, &atlas); ++ atlas |= IXGBE_ATLAS_PDN_TX_1G_QL_ALL; ++ ixgbe_write_analog_reg8(&adapter->hw, ++ IXGBE_ATLAS_PDN_1G, atlas); ++ ++ ixgbe_read_analog_reg8(&adapter->hw, ++ IXGBE_ATLAS_PDN_AN, &atlas); ++ atlas |= IXGBE_ATLAS_PDN_TX_AN_QL_ALL; ++ ixgbe_write_analog_reg8(&adapter->hw, ++ IXGBE_ATLAS_PDN_AN, atlas); ++ } ++ ++ return 0; ++} ++ ++static void ixgbe_loopback_cleanup(struct ixgbe_adapter *adapter) ++{ ++ u32 reg_data; ++ ++ reg_data = IXGBE_READ_REG(&adapter->hw, IXGBE_HLREG0); ++ reg_data &= ~IXGBE_HLREG0_LPBK; ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_HLREG0, reg_data); ++} ++ ++static void ixgbe_create_lbtest_frame(struct sk_buff *skb, ++ unsigned int frame_size) ++{ ++ memset(skb->data, 0xFF, frame_size); ++ frame_size &= ~1; ++ memset(&skb->data[frame_size / 2], 0xAA, frame_size / 2 - 1); ++ memset(&skb->data[frame_size / 2 + 10], 0xBE, 1); ++ memset(&skb->data[frame_size / 2 + 12], 0xAF, 1); ++} ++ ++static int ixgbe_check_lbtest_frame(struct sk_buff *skb, ++ unsigned int frame_size) ++{ ++ frame_size &= ~1; ++ if (*(skb->data + 3) == 0xFF) { ++ if ((*(skb->data + frame_size / 2 + 10) == 0xBE) && ++ (*(skb->data + frame_size / 2 + 12) == 0xAF)) { ++ return 0; ++ } ++ } ++ return 13; ++} ++ ++static int ixgbe_run_loopback_test(struct ixgbe_adapter *adapter) ++{ ++ struct ixgbe_ring *tx_ring = &adapter->test_tx_ring; ++ struct ixgbe_ring *rx_ring = &adapter->test_rx_ring; ++ struct pci_dev *pdev = adapter->pdev; ++ int i, j, k, l, lc, good_cnt, ret_val = 0; ++ unsigned long time; ++ ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_RDT(0), rx_ring->count - 1); ++ ++ /* ++ * Calculate the loop count based on the largest descriptor ring ++ * The idea is to wrap the largest ring a number of times using 64 ++ * send/receive pairs during each loop ++ */ ++ ++ if (rx_ring->count <= tx_ring->count) ++ lc = ((tx_ring->count / 64) * 2) + 1; ++ else ++ lc = ((rx_ring->count / 64) * 2) + 1; ++ ++ k = l = 0; ++ for (j = 0; j <= lc; j++) { ++ for (i = 0; i < 64; i++) { ++ ixgbe_create_lbtest_frame( ++ tx_ring->tx_buffer_info[k].skb, ++ 1024); ++ pci_dma_sync_single_for_device(pdev, ++ tx_ring->tx_buffer_info[k].dma, ++ tx_ring->tx_buffer_info[k].length, ++ PCI_DMA_TODEVICE); ++ if (unlikely(++k == tx_ring->count)) ++ k = 0; ++ } ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_TDT(0), k); ++ msleep(200); ++ /* set the start time for the receive */ ++ time = jiffies; ++ good_cnt = 0; ++ do { ++ /* receive the sent packets */ ++ pci_dma_sync_single_for_cpu(pdev, ++ rx_ring->rx_buffer_info[l].dma, ++ IXGBE_RXBUFFER_2048, ++ PCI_DMA_FROMDEVICE); ++ ret_val = ixgbe_check_lbtest_frame( ++ rx_ring->rx_buffer_info[l].skb, 1024); ++ if (!ret_val) ++ good_cnt++; ++ if (++l == rx_ring->count) ++ l = 0; ++ /* ++ * time + 20 msecs (200 msecs on 2.4) is more than ++ * enough time to complete the receives, if it's ++ * exceeded, break and error off ++ */ ++ } while (good_cnt < 64 && jiffies < (time + 20)); ++ if (good_cnt != 64) { ++ /* ret_val is the same as mis-compare */ ++ ret_val = 13; ++ break; ++ } ++ if (jiffies >= (time + 20)) { ++ /* Error code for time out error */ ++ ret_val = 14; ++ break; ++ } ++ } ++ ++ return ret_val; ++} ++ ++static int ixgbe_loopback_test(struct ixgbe_adapter *adapter, u64 *data) ++{ ++ *data = ixgbe_setup_desc_rings(adapter); ++ if (*data) ++ goto out; ++ *data = ixgbe_setup_loopback_test(adapter); ++ if (*data) ++ goto err_loopback; ++ *data = ixgbe_run_loopback_test(adapter); ++ ixgbe_loopback_cleanup(adapter); ++ ++err_loopback: ++ ixgbe_free_desc_rings(adapter); ++out: ++ return *data; ++} ++ ++static int ixgbe_diag_test_count(struct net_device *netdev) ++{ ++ return IXGBE_TEST_LEN; ++} ++ ++static void ixgbe_diag_test(struct net_device *netdev, ++ struct ethtool_test *eth_test, u64 *data) ++{ ++ struct ixgbe_adapter *adapter = netdev_priv(netdev); ++ bool if_running = netif_running(netdev); ++ ++ set_bit(__IXGBE_TESTING, &adapter->state); ++ if (eth_test->flags == ETH_TEST_FL_OFFLINE) { ++ /* Offline tests */ ++ ++ DPRINTK(HW, INFO, "offline testing starting\n"); ++ ++ /* Link test performed before hardware reset so autoneg doesn't ++ * interfere with test result */ ++ if (ixgbe_link_test(adapter, &data[4])) ++ eth_test->flags |= ETH_TEST_FL_FAILED; ++ ++ if (if_running) ++ /* indicate we're in test mode */ ++ dev_close(netdev); ++ else ++ ixgbe_reset(adapter); ++ ++ DPRINTK(HW, INFO, "register testing starting\n"); ++ if (ixgbe_reg_test(adapter, &data[0])) ++ eth_test->flags |= ETH_TEST_FL_FAILED; ++ ++ ixgbe_reset(adapter); ++ DPRINTK(HW, INFO, "eeprom testing starting\n"); ++ if (ixgbe_eeprom_test(adapter, &data[1])) ++ eth_test->flags |= ETH_TEST_FL_FAILED; ++ ++ ixgbe_reset(adapter); ++ DPRINTK(HW, INFO, "interrupt testing starting\n"); ++ if (ixgbe_intr_test(adapter, &data[2])) ++ eth_test->flags |= ETH_TEST_FL_FAILED; ++ ++ ixgbe_reset(adapter); ++ DPRINTK(HW, INFO, "loopback testing starting\n"); ++ if (ixgbe_loopback_test(adapter, &data[3])) ++ eth_test->flags |= ETH_TEST_FL_FAILED; ++ ++ ixgbe_reset(adapter); ++ ++ clear_bit(__IXGBE_TESTING, &adapter->state); ++ if (if_running) ++ dev_open(netdev); ++ } else { ++ DPRINTK(HW, INFO, "online testing starting\n"); ++ /* Online tests */ ++ if (ixgbe_link_test(adapter, &data[4])) ++ eth_test->flags |= ETH_TEST_FL_FAILED; ++ ++ /* Online tests aren't run; pass by default */ ++ data[0] = 0; ++ data[1] = 0; ++ data[2] = 0; ++ data[3] = 0; ++ ++ clear_bit(__IXGBE_TESTING, &adapter->state); ++ } ++ msleep_interruptible(4 * 1000); ++} ++ ++static int ixgbe_wol_exclusion(struct ixgbe_adapter *adapter, ++ struct ethtool_wolinfo *wol) ++{ ++ struct ixgbe_hw *hw = &adapter->hw; ++ int retval = 1; ++ ++ switch(hw->device_id) { ++ case IXGBE_DEV_ID_82599_KX4: ++ retval = 0; ++ break; ++ default: ++ wol->supported = 0; ++ retval = 0; ++ } ++ ++ return retval; ++} + + static void ixgbe_get_wol(struct net_device *netdev, + struct ethtool_wolinfo *wol) + { +- wol->supported = 0; ++ struct ixgbe_adapter *adapter = netdev_priv(netdev); ++ ++ wol->supported = WAKE_UCAST | WAKE_MCAST | ++ WAKE_BCAST | WAKE_MAGIC; + wol->wolopts = 0; + ++ if (ixgbe_wol_exclusion(adapter, wol) || ++ !device_can_wakeup(&adapter->pdev->dev)) ++ return; ++ ++ if (adapter->wol & IXGBE_WUFC_EX) ++ wol->wolopts |= WAKE_UCAST; ++ if (adapter->wol & IXGBE_WUFC_MC) ++ wol->wolopts |= WAKE_MCAST; ++ if (adapter->wol & IXGBE_WUFC_BC) ++ wol->wolopts |= WAKE_BCAST; ++ if (adapter->wol & IXGBE_WUFC_MAG) ++ wol->wolopts |= WAKE_MAGIC; ++ + return; ++} ++ ++static int ixgbe_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol) ++{ ++ struct ixgbe_adapter *adapter = netdev_priv(netdev); ++ ++ if (wol->wolopts & (WAKE_PHY | WAKE_ARP | WAKE_MAGICSECURE)) ++ return -EOPNOTSUPP; ++ ++ if (ixgbe_wol_exclusion(adapter, wol)) ++ return wol->wolopts ? -EOPNOTSUPP : 0; ++ ++ adapter->wol = 0; ++ ++ if (wol->wolopts & WAKE_UCAST) ++ adapter->wol |= IXGBE_WUFC_EX; ++ if (wol->wolopts & WAKE_MCAST) ++ adapter->wol |= IXGBE_WUFC_MC; ++ if (wol->wolopts & WAKE_BCAST) ++ adapter->wol |= IXGBE_WUFC_BC; ++ if (wol->wolopts & WAKE_MAGIC) ++ adapter->wol |= IXGBE_WUFC_MAG; ++ ++ device_set_wakeup_enable(&adapter->pdev->dev, adapter->wol); ++ ++ return 0; + } + + static int ixgbe_nway_reset(struct net_device *netdev) +@@ -925,17 +2021,16 @@ + static int ixgbe_phys_id(struct net_device *netdev, u32 data) + { + struct ixgbe_adapter *adapter = netdev_priv(netdev); +- struct ixgbe_hw *hw = &adapter->hw; +- u32 led_reg = IXGBE_READ_REG(hw, IXGBE_LEDCTL); ++ u32 led_reg = IXGBE_READ_REG(&adapter->hw, IXGBE_LEDCTL); + u32 i; + + if (!data || data > 300) + data = 300; + + for (i = 0; i < (data * 1000); i += 400) { +- hw->mac.ops.led_on(hw, IXGBE_LED_ON); ++ ixgbe_led_on(&adapter->hw, IXGBE_LED_ON); + msleep_interruptible(200); +- hw->mac.ops.led_off(hw, IXGBE_LED_ON); ++ ixgbe_led_off(&adapter->hw, IXGBE_LED_ON); + msleep_interruptible(200); + } + +@@ -951,6 +2046,9 @@ + struct ixgbe_adapter *adapter = netdev_priv(netdev); + + ec->tx_max_coalesced_frames_irq = adapter->tx_ring[0].work_limit; ++#ifndef CONFIG_IXGBE_NAPI ++ ec->rx_max_coalesced_frames_irq = adapter->rx_ring[0].work_limit; ++#endif + + /* only valid if in constant ITR mode */ + switch (adapter->itr_setting) { +@@ -970,61 +2068,110 @@ + return 0; + } + ++extern void ixgbe_write_eitr(struct ixgbe_q_vector *q_vector); ++ + static int ixgbe_set_coalesce(struct net_device *netdev, + struct ethtool_coalesce *ec) + { + struct ixgbe_adapter *adapter = netdev_priv(netdev); +- struct ixgbe_hw *hw = &adapter->hw; + int i; + + if (ec->tx_max_coalesced_frames_irq) + adapter->tx_ring[0].work_limit = ec->tx_max_coalesced_frames_irq; + ++#ifndef CONFIG_IXGBE_NAPI ++ if (ec->rx_max_coalesced_frames_irq) ++ adapter->rx_ring[0].work_limit = ec->rx_max_coalesced_frames_irq; ++ ++#endif + if (ec->rx_coalesce_usecs > 1) { ++ /* check the limits */ ++ if ((1000000/ec->rx_coalesce_usecs > IXGBE_MAX_INT_RATE) || ++ (1000000/ec->rx_coalesce_usecs < IXGBE_MIN_INT_RATE)) ++ return -EINVAL; ++ + /* store the value in ints/second */ + adapter->eitr_param = 1000000/ec->rx_coalesce_usecs; + + /* static value of interrupt rate */ + adapter->itr_setting = adapter->eitr_param; +- /* clear the lower bit */ ++ /* clear the lower bit as its used for dynamic state */ + adapter->itr_setting &= ~1; + } else if (ec->rx_coalesce_usecs == 1) { + /* 1 means dynamic mode */ + adapter->eitr_param = 20000; + adapter->itr_setting = 1; + } else { +- /* any other value means disable eitr, which is best +- * served by setting the interrupt rate very high */ +- adapter->eitr_param = 3000000; ++ /* ++ * any other value means disable eitr, which is best ++ * served by setting the interrupt rate very high ++ */ ++ adapter->eitr_param = IXGBE_MAX_INT_RATE; + adapter->itr_setting = 0; + } + + for (i = 0; i < adapter->num_msix_vectors - NON_Q_VECTORS; i++) { +- struct ixgbe_q_vector *q_vector = &adapter->q_vector[i]; ++ struct ixgbe_q_vector *q_vector = adapter->q_vector[i]; + if (q_vector->txr_count && !q_vector->rxr_count) ++ /* tx vector gets half the rate */ + q_vector->eitr = (adapter->eitr_param >> 1); +- else ++ else if (q_vector->rxr_count) + /* rx only or mixed */ + q_vector->eitr = adapter->eitr_param; +- IXGBE_WRITE_REG(hw, IXGBE_EITR(i), +- EITR_INTS_PER_SEC_TO_REG(q_vector->eitr)); ++ ixgbe_write_eitr(q_vector); + } + + return 0; + } + ++#ifdef ETHTOOL_GFLAGS ++static int ixgbe_set_flags(struct net_device *netdev, u32 data) ++{ ++#if !defined(IXGBE_NO_HW_RSC) || !defined(IXGBE_NO_LRO) ++ struct ixgbe_adapter *adapter = netdev_priv(netdev); ++#endif ++ ethtool_op_set_flags(netdev, data); + +-static const struct ethtool_ops ixgbe_ethtool_ops = { ++#ifndef IXGBE_NO_HW_RSC ++ /* if state changes we need to update adapter->flags and reset */ ++ if (adapter->flags2 & IXGBE_FLAG2_RSC_CAPABLE) { ++ /* cast both to bool and verify if they are set the same */ ++ if ((!!(data & ETH_FLAG_LRO)) != ++ (!!(adapter->flags2 & IXGBE_FLAG2_RSC_ENABLED))) { ++ adapter->flags2 ^= IXGBE_FLAG2_RSC_ENABLED; ++ if (netif_running(netdev)) ++ ixgbe_reinit_locked(adapter); ++ else ++ ixgbe_reset(adapter); ++ } ++ return 0; ++ } ++#endif /* IXGBE_NO_HW_RSC */ ++#ifndef IXGBE_NO_LRO ++ /* cast both to bool and verify if they are set the same */ ++ if ((!!(data & ETH_FLAG_LRO)) != ++ (!!(adapter->flags2 & IXGBE_FLAG2_SWLRO_ENABLED))) ++ adapter->flags2 ^= IXGBE_FLAG2_SWLRO_ENABLED; ++ ++#endif /* IXGBE_NO_LRO */ ++ return 0; ++ ++} ++ ++#endif /* ETHTOOL_GFLAGS */ ++static struct ethtool_ops ixgbe_ethtool_ops = { + .get_settings = ixgbe_get_settings, + .set_settings = ixgbe_set_settings, + .get_drvinfo = ixgbe_get_drvinfo, + .get_regs_len = ixgbe_get_regs_len, + .get_regs = ixgbe_get_regs, + .get_wol = ixgbe_get_wol, ++ .set_wol = ixgbe_set_wol, + .nway_reset = ixgbe_nway_reset, + .get_link = ethtool_op_get_link, + .get_eeprom_len = ixgbe_get_eeprom_len, + .get_eeprom = ixgbe_get_eeprom, ++ .set_eeprom = ixgbe_set_eeprom, + .get_ringparam = ixgbe_get_ringparam, + .set_ringparam = ixgbe_set_ringparam, + .get_pauseparam = ixgbe_get_pauseparam, +@@ -1037,19 +2184,29 @@ + .set_sg = ethtool_op_set_sg, + .get_msglevel = ixgbe_get_msglevel, + .set_msglevel = ixgbe_set_msglevel, ++#ifdef NETIF_F_TSO + .get_tso = ethtool_op_get_tso, + .set_tso = ixgbe_set_tso, ++#endif ++ .self_test_count = ixgbe_diag_test_count, ++ .self_test = ixgbe_diag_test, + .get_strings = ixgbe_get_strings, + .phys_id = ixgbe_phys_id, +- .get_sset_count = ixgbe_get_sset_count, ++ .get_stats_count = ixgbe_get_stats_count, + .get_ethtool_stats = ixgbe_get_ethtool_stats, ++#ifdef ETHTOOL_GPERMADDR ++ .get_perm_addr = ethtool_op_get_perm_addr, ++#endif + .get_coalesce = ixgbe_get_coalesce, + .set_coalesce = ixgbe_set_coalesce, ++#ifdef ETHTOOL_GFLAGS + .get_flags = ethtool_op_get_flags, +- .set_flags = ethtool_op_set_flags, ++ .set_flags = ixgbe_set_flags, ++#endif + }; + + void ixgbe_set_ethtool_ops(struct net_device *netdev) + { + SET_ETHTOOL_OPS(netdev, &ixgbe_ethtool_ops); + } ++#endif /* SIOCETHTOOL */ +diff -r 3e5bbd731d89 drivers/net/ixgbe/ixgbe_main.c +--- a/drivers/net/ixgbe/ixgbe_main.c Mon Jun 15 12:00:22 2009 +0100 ++++ b/drivers/net/ixgbe/ixgbe_main.c Mon Jun 15 12:06:28 2009 +0100 +@@ -1,7 +1,7 @@ + /******************************************************************************* + + Intel 10 Gigabit PCI Express Linux driver +- Copyright(c) 1999 - 2008 Intel Corporation. ++ Copyright(c) 1999 - 2009 Intel Corporation. + + This program is free software; you can redistribute it and/or modify it + under the terms and conditions of the GNU General Public License, +@@ -25,6 +25,10 @@ + + *******************************************************************************/ + ++ ++/****************************************************************************** ++ Copyright (c)2006 - 2007 Myricom, Inc. for some LRO specific code ++******************************************************************************/ + #include + #include + #include +@@ -35,26 +39,38 @@ + #include + #include + #include ++#ifdef NETIF_F_TSO + #include ++#ifdef NETIF_F_TSO6 + #include ++#endif ++#endif ++#ifdef SIOCETHTOOL + #include ++#endif ++#ifdef NETIF_F_HW_VLAN_TX + #include ++#endif ++ + + #include "ixgbe.h" +-#include "ixgbe_common.h" + + char ixgbe_driver_name[] = "ixgbe"; + static const char ixgbe_driver_string[] = +- "Intel(R) 10 Gigabit PCI Express Network Driver"; +- +-#define DRV_VERSION "1.3.30-k2" ++ "Intel(R) 10 Gigabit PCI Express Network Driver"; ++#define DRV_HW_PERF ++ ++#ifndef CONFIG_IXGBE_NAPI ++#define DRIVERNAPI ++#else ++#define DRIVERNAPI "-NAPI" ++#endif ++ ++#define FPGA ++ ++#define DRV_VERSION "2.0.34.3" DRIVERNAPI DRV_HW_PERF FPGA + const char ixgbe_driver_version[] = DRV_VERSION; +-static char ixgbe_copyright[] = "Copyright (c) 1999-2007 Intel Corporation."; +- +-static const struct ixgbe_info *ixgbe_info_tbl[] = { +- [board_82598] = &ixgbe_82598_info, +-}; +- ++static char ixgbe_copyright[] = "Copyright (c) 1999-2009 Intel Corporation."; + /* ixgbe_pci_tbl - PCI Device ID Table + * + * Wildcard entries (PCI_ANY_ID) should come last +@@ -64,25 +80,20 @@ + * Class, Class Mask, private data (not used) } + */ + static struct pci_device_id ixgbe_pci_tbl[] = { +- {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82598AF_DUAL_PORT), +- board_82598 }, +- {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82598AF_SINGLE_PORT), +- board_82598 }, +- {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82598AT), +- board_82598 }, +- {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82598EB_CX4), +- board_82598 }, +- {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82598_CX4_DUAL_PORT), +- board_82598 }, +- {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82598_DA_DUAL_PORT), +- board_82598 }, +- {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82598_SR_DUAL_PORT_EM), +- board_82598 }, +- {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82598EB_XF_LR), +- board_82598 }, +- {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82598EB_SFP_LOM), +- board_82598 }, +- ++ {PCI_DEVICE(PCI_VENDOR_ID_INTEL, IXGBE_DEV_ID_82598)}, ++ {PCI_DEVICE(PCI_VENDOR_ID_INTEL, IXGBE_DEV_ID_82598_BX)}, ++ {PCI_DEVICE(PCI_VENDOR_ID_INTEL, IXGBE_DEV_ID_82598AF_DUAL_PORT)}, ++ {PCI_DEVICE(PCI_VENDOR_ID_INTEL, IXGBE_DEV_ID_82598AF_SINGLE_PORT)}, ++ {PCI_DEVICE(PCI_VENDOR_ID_INTEL, IXGBE_DEV_ID_82598AT)}, ++ {PCI_DEVICE(PCI_VENDOR_ID_INTEL, IXGBE_DEV_ID_82598EB_CX4)}, ++ {PCI_DEVICE(PCI_VENDOR_ID_INTEL, IXGBE_DEV_ID_82598_CX4_DUAL_PORT)}, ++ {PCI_DEVICE(PCI_VENDOR_ID_INTEL, IXGBE_DEV_ID_82598_DA_DUAL_PORT)}, ++ {PCI_DEVICE(PCI_VENDOR_ID_INTEL, IXGBE_DEV_ID_82598_SR_DUAL_PORT_EM)}, ++ {PCI_DEVICE(PCI_VENDOR_ID_INTEL, IXGBE_DEV_ID_82598EB_XF_LR)}, ++ {PCI_DEVICE(PCI_VENDOR_ID_INTEL, IXGBE_DEV_ID_82598EB_SFP_LOM)}, ++ {PCI_DEVICE(PCI_VENDOR_ID_INTEL, IXGBE_DEV_ID_82599_KX4)}, ++ {PCI_DEVICE(PCI_VENDOR_ID_INTEL, IXGBE_DEV_ID_82599_XAUI_LOM)}, ++ {PCI_DEVICE(PCI_VENDOR_ID_INTEL, IXGBE_DEV_ID_82599_SFP)}, + /* required last entry */ + {0, } + }; +@@ -96,8 +107,8 @@ + .next = NULL, + .priority = 0 + }; +-#endif +- ++ ++#endif + MODULE_AUTHOR("Intel Corporation, "); + MODULE_DESCRIPTION("Intel(R) 10 Gigabit PCI Express Network Driver"); + MODULE_LICENSE("GPL"); +@@ -125,17 +136,69 @@ + ctrl_ext | IXGBE_CTRL_EXT_DRV_LOAD); + } + +-static void ixgbe_set_ivar(struct ixgbe_adapter *adapter, u16 int_alloc_entry, +- u8 msix_vector) ++/* ++ * ixgbe_set_ivar - set the IVAR registers, mapping interrupt causes to vectors ++ * @adapter: pointer to adapter struct ++ * @direction: 0 for Rx, 1 for Tx, -1 for other causes ++ * @queue: queue to map the corresponding interrupt to ++ * @msix_vector: the vector to map to the corresponding queue ++ * ++ */ ++static void ixgbe_set_ivar(struct ixgbe_adapter *adapter, s8 direction, ++ u8 queue, u8 msix_vector) + { + u32 ivar, index; +- +- msix_vector |= IXGBE_IVAR_ALLOC_VAL; +- index = (int_alloc_entry >> 2) & 0x1F; +- ivar = IXGBE_READ_REG(&adapter->hw, IXGBE_IVAR(index)); +- ivar &= ~(0xFF << (8 * (int_alloc_entry & 0x3))); +- ivar |= (msix_vector << (8 * (int_alloc_entry & 0x3))); +- IXGBE_WRITE_REG(&adapter->hw, IXGBE_IVAR(index), ivar); ++ struct ixgbe_hw *hw = &adapter->hw; ++ switch (hw->mac.type) { ++ case ixgbe_mac_82598EB: ++ msix_vector |= IXGBE_IVAR_ALLOC_VAL; ++ if (direction == -1) ++ direction = 0; ++ index = (((direction * 64) + queue) >> 2) & 0x1F; ++ ivar = IXGBE_READ_REG(hw, IXGBE_IVAR(index)); ++ ivar &= ~(0xFF << (8 * (queue & 0x3))); ++ ivar |= (msix_vector << (8 * (queue & 0x3))); ++ IXGBE_WRITE_REG(hw, IXGBE_IVAR(index), ivar); ++ break; ++ case ixgbe_mac_82599EB: ++ if (direction == -1) { ++ /* other causes */ ++ msix_vector |= IXGBE_IVAR_ALLOC_VAL; ++ index = ((queue & 1) * 8); ++ ivar = IXGBE_READ_REG(&adapter->hw, IXGBE_IVAR_MISC); ++ ivar &= ~(0xFF << index); ++ ivar |= (msix_vector << index); ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_IVAR_MISC, ivar); ++ break; ++ } else { ++ /* tx or rx causes */ ++ msix_vector |= IXGBE_IVAR_ALLOC_VAL; ++ index = ((16 * (queue & 1)) + (8 * direction)); ++ ivar = IXGBE_READ_REG(hw, IXGBE_IVAR(queue >> 1)); ++ ivar &= ~(0xFF << index); ++ ivar |= (msix_vector << index); ++ IXGBE_WRITE_REG(hw, IXGBE_IVAR(queue >> 1), ivar); ++ break; ++ } ++ default: ++ break; ++ } ++} ++ ++static inline void ixgbe_irq_rearm_queues(struct ixgbe_adapter *adapter, ++ u64 qmask) ++{ ++ u32 mask; ++ ++ if (adapter->hw.mac.type == ixgbe_mac_82598EB) { ++ mask = (IXGBE_EIMS_RTX_QUEUE & qmask); ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_EICS, mask); ++ } else { ++ mask = (qmask & 0xFFFFFFFF); ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_EICS_EX(0), mask); ++ mask = (qmask >> 32); ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_EICS_EX(1), mask); ++ } + } + + static void ixgbe_unmap_and_free_tx_resource(struct ixgbe_adapter *adapter, +@@ -191,48 +254,52 @@ + return false; + } + +-#define IXGBE_MAX_TXD_PWR 14 +-#define IXGBE_MAX_DATA_PER_TXD (1 << IXGBE_MAX_TXD_PWR) ++#define IXGBE_MAX_TXD_PWR 14 ++#define IXGBE_MAX_DATA_PER_TXD (1 << IXGBE_MAX_TXD_PWR) + + /* Tx Descriptors needed, worst case */ + #define TXD_USE_COUNT(S) (((S) >> IXGBE_MAX_TXD_PWR) + \ + (((S) & (IXGBE_MAX_DATA_PER_TXD - 1)) ? 1 : 0)) ++#ifdef MAX_SKB_FRAGS + #define DESC_NEEDED (TXD_USE_COUNT(IXGBE_MAX_DATA_PER_TXD) /* skb->data */ + \ +- MAX_SKB_FRAGS * TXD_USE_COUNT(PAGE_SIZE) + 1) /* for context */ +- +-#define GET_TX_HEAD_FROM_RING(ring) (\ +- *(volatile u32 *) \ +- ((union ixgbe_adv_tx_desc *)(ring)->desc + (ring)->count)) ++ MAX_SKB_FRAGS * TXD_USE_COUNT(PAGE_SIZE) + 1) /* for context */ ++#else ++#define DESC_NEEDED TXD_USE_COUNT(IXGBE_MAX_DATA_PER_TXD) ++#endif ++ + static void ixgbe_tx_timeout(struct net_device *netdev); + + /** + * ixgbe_clean_tx_irq - Reclaim resources after transmit completes +- * @adapter: board private structure ++ * @q_vector: structure containing interrupt and ring information + * @tx_ring: tx ring to clean + **/ +-static bool ixgbe_clean_tx_irq(struct ixgbe_adapter *adapter, ++static bool ixgbe_clean_tx_irq(struct ixgbe_q_vector *q_vector, + struct ixgbe_ring *tx_ring) + { +- union ixgbe_adv_tx_desc *tx_desc; ++ struct ixgbe_adapter *adapter = q_vector->adapter; ++ struct net_device *netdev = adapter->netdev; ++ union ixgbe_adv_tx_desc *tx_desc, *eop_desc; + struct ixgbe_tx_buffer *tx_buffer_info; +- struct net_device *netdev = adapter->netdev; +- struct sk_buff *skb; +- unsigned int i; +- u32 head, oldhead; +- unsigned int count = 0; ++ unsigned int i, eop, count = 0; + unsigned int total_bytes = 0, total_packets = 0; + +- rmb(); +- head = GET_TX_HEAD_FROM_RING(tx_ring); +- head = le32_to_cpu(head); + i = tx_ring->next_to_clean; +- while (1) { +- while (i != head) { ++ eop = tx_ring->tx_buffer_info[i].next_to_watch; ++ eop_desc = IXGBE_TX_DESC_ADV(*tx_ring, eop); ++ ++ while ((eop_desc->wb.status & cpu_to_le32(IXGBE_TXD_STAT_DD)) && ++ (count < tx_ring->work_limit)) { ++ bool cleaned = false; ++ for ( ; !cleaned; count++) { ++ struct sk_buff *skb; + tx_desc = IXGBE_TX_DESC_ADV(*tx_ring, i); + tx_buffer_info = &tx_ring->tx_buffer_info[i]; ++ cleaned = (i == eop); + skb = tx_buffer_info->skb; + +- if (skb) { ++ if (cleaned && skb) { ++#ifdef NETIF_F_TSO + unsigned int segs, bytecount; + + /* gso_segs is currently only valid for tcp */ +@@ -242,28 +309,26 @@ + skb->len; + total_packets += segs; + total_bytes += bytecount; ++#else ++ total_packets++; ++ total_bytes += skb->len; ++#endif + } + + ixgbe_unmap_and_free_tx_resource(adapter, + tx_buffer_info); ++ ++ tx_desc->wb.status = 0; + + i++; + if (i == tx_ring->count) + i = 0; +- +- count++; +- if (count == tx_ring->count) +- goto done_cleaning; +- } +- oldhead = head; +- rmb(); +- head = GET_TX_HEAD_FROM_RING(tx_ring); +- head = le32_to_cpu(head); +- if (head == oldhead) +- goto done_cleaning; +- } /* while (1) */ +- +-done_cleaning: ++ } ++ ++ eop = tx_ring->tx_buffer_info[i].next_to_watch; ++ eop_desc = IXGBE_TX_DESC_ADV(*tx_ring, eop); ++ } ++ + tx_ring->next_to_clean = i; + + #define TX_WAKE_THRESHOLD (DESC_NEEDED * 2) +@@ -273,11 +338,19 @@ + * sees the new next_to_clean. + */ + smp_mb(); ++#ifdef HAVE_TX_MQ + if (__netif_subqueue_stopped(netdev, tx_ring->queue_index) && + !test_bit(__IXGBE_DOWN, &adapter->state)) { + netif_wake_subqueue(netdev, tx_ring->queue_index); + ++adapter->restart_queue; + } ++#else ++ if (netif_queue_stopped(netdev) && ++ !test_bit(__IXGBE_DOWN, &adapter->state)) { ++ netif_wake_queue(netdev); ++ ++adapter->restart_queue; ++ } ++#endif + } + + if (adapter->detect_tx_hung) { +@@ -290,18 +363,20 @@ + } + } + ++#ifndef CONFIG_IXGBE_NAPI + /* re-arm the interrupt */ +- if ((total_packets >= tx_ring->work_limit) || +- (count == tx_ring->count)) +- IXGBE_WRITE_REG(&adapter->hw, IXGBE_EICS, tx_ring->v_idx); +- ++ if ((count >= tx_ring->work_limit) && ++ (!test_bit(__IXGBE_DOWN, &adapter->state))) ++ ixgbe_irq_rearm_queues(adapter, ((u64)1 << q_vector->v_idx)); ++ ++#endif + tx_ring->total_bytes += total_bytes; + tx_ring->total_packets += total_packets; ++ tx_ring->stats.packets += total_packets; + tx_ring->stats.bytes += total_bytes; +- tx_ring->stats.packets += total_packets; + adapter->net_stats.tx_bytes += total_bytes; + adapter->net_stats.tx_packets += total_packets; +- return (total_packets ? true : false); ++ return (count < tx_ring->work_limit); + } + + #if defined(CONFIG_DCA) || defined(CONFIG_DCA_MODULE) +@@ -311,17 +386,34 @@ + u32 rxctrl; + int cpu = get_cpu(); + int q = rx_ring - adapter->rx_ring; ++ struct ixgbe_hw *hw = &adapter->hw; + + if (rx_ring->cpu != cpu) { +- rxctrl = IXGBE_READ_REG(&adapter->hw, IXGBE_DCA_RXCTRL(q)); +- rxctrl &= ~IXGBE_DCA_RXCTRL_CPUID_MASK; +- rxctrl |= dca3_get_tag(&adapter->pdev->dev, cpu); ++ rxctrl = IXGBE_READ_REG(hw, IXGBE_DCA_RXCTRL(q)); ++ if (hw->mac.type == ixgbe_mac_82598EB) { ++ rxctrl &= ~IXGBE_DCA_RXCTRL_CPUID_MASK; ++ rxctrl |= dca3_get_tag(&adapter->pdev->dev, cpu); ++ } else if (hw->mac.type == ixgbe_mac_82599EB) { ++ rxctrl &= ~IXGBE_DCA_RXCTRL_CPUID_MASK_82599; ++ rxctrl |= (dca3_get_tag(&adapter->pdev->dev, cpu) << ++ IXGBE_DCA_RXCTRL_CPUID_SHIFT_82599); ++ } + rxctrl |= IXGBE_DCA_RXCTRL_DESC_DCA_EN; + rxctrl |= IXGBE_DCA_RXCTRL_HEAD_DCA_EN; +- IXGBE_WRITE_REG(&adapter->hw, IXGBE_DCA_RXCTRL(q), rxctrl); ++ if (adapter->flags & IXGBE_FLAG_DCA_ENABLED_DATA) { ++ /* just do the header data when in Packet Split mode */ ++ if (adapter->flags & IXGBE_FLAG_RX_PS_ENABLED) ++ rxctrl |= IXGBE_DCA_RXCTRL_HEAD_DCA_EN; ++ else ++ rxctrl |= IXGBE_DCA_RXCTRL_DATA_DCA_EN; ++ } ++ rxctrl &= ~(IXGBE_DCA_RXCTRL_DESC_RRO_EN); ++ rxctrl &= ~(IXGBE_DCA_RXCTRL_DESC_WRO_EN | ++ IXGBE_DCA_RXCTRL_DESC_HSRO_EN); ++ IXGBE_WRITE_REG(hw, IXGBE_DCA_RXCTRL(q), rxctrl); + rx_ring->cpu = cpu; + } +- put_cpu(); ++ put_cpu_no_resched(); + } + + static void ixgbe_update_tx_dca(struct ixgbe_adapter *adapter, +@@ -330,13 +422,23 @@ + u32 txctrl; + int cpu = get_cpu(); + int q = tx_ring - adapter->tx_ring; ++ struct ixgbe_hw *hw = &adapter->hw; + + if (tx_ring->cpu != cpu) { +- txctrl = IXGBE_READ_REG(&adapter->hw, IXGBE_DCA_TXCTRL(q)); +- txctrl &= ~IXGBE_DCA_TXCTRL_CPUID_MASK; +- txctrl |= dca3_get_tag(&adapter->pdev->dev, cpu); +- txctrl |= IXGBE_DCA_TXCTRL_DESC_DCA_EN; +- IXGBE_WRITE_REG(&adapter->hw, IXGBE_DCA_TXCTRL(q), txctrl); ++ if (hw->mac.type == ixgbe_mac_82598EB) { ++ txctrl = IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL(q)); ++ txctrl &= ~IXGBE_DCA_TXCTRL_CPUID_MASK; ++ txctrl |= dca3_get_tag(&adapter->pdev->dev, cpu); ++ txctrl |= IXGBE_DCA_TXCTRL_DESC_DCA_EN; ++ IXGBE_WRITE_REG(hw, IXGBE_DCA_TXCTRL(q), txctrl); ++ } else if (hw->mac.type == ixgbe_mac_82599EB) { ++ txctrl = IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL_82599(q)); ++ txctrl &= ~IXGBE_DCA_TXCTRL_CPUID_MASK_82599; ++ txctrl |= (dca3_get_tag(&adapter->pdev->dev, cpu) << ++ IXGBE_DCA_TXCTRL_CPUID_SHIFT_82599); ++ txctrl |= IXGBE_DCA_TXCTRL_DESC_DCA_EN; ++ IXGBE_WRITE_REG(hw, IXGBE_DCA_TXCTRL_82599(q), txctrl); ++ } + tx_ring->cpu = cpu; + } + put_cpu(); +@@ -348,6 +450,9 @@ + + if (!(adapter->flags & IXGBE_FLAG_DCA_ENABLED)) + return; ++ ++ /* Always use CB2 mode, difference is masked in the CB driver. */ ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_DCA_CTRL, 2); + + for (i = 0; i < adapter->num_tx_queues; i++) { + adapter->tx_ring[i].cpu = -1; +@@ -370,9 +475,6 @@ + /* if we're already enabled, don't do it again */ + if (adapter->flags & IXGBE_FLAG_DCA_ENABLED) + break; +- /* Always use CB2 mode, difference is masked +- * in the CB driver. */ +- IXGBE_WRITE_REG(&adapter->hw, IXGBE_DCA_CTRL, 2); + if (dca_add_requester(dev) == 0) { + adapter->flags |= IXGBE_FLAG_DCA_ENABLED; + ixgbe_setup_dca(adapter); +@@ -394,57 +496,60 @@ + #endif /* CONFIG_DCA or CONFIG_DCA_MODULE */ + /** + * ixgbe_receive_skb - Send a completed packet up the stack +- * @adapter: board private structure ++ * @q_vector: structure containing interrupt and ring information + * @skb: packet to send up +- * @status: hardware indication of status of receive +- * @rx_ring: rx descriptor ring (for a specific queue) to setup +- * @rx_desc: rx descriptor +- **/ +-static void ixgbe_receive_skb(struct ixgbe_adapter *adapter, +- struct sk_buff *skb, u8 status, +- struct ixgbe_ring *ring, +- union ixgbe_adv_rx_desc *rx_desc) +-{ +- bool is_vlan = (status & IXGBE_RXD_STAT_VP); +- u16 tag = le16_to_cpu(rx_desc->wb.upper.vlan); +- +-#ifdef CONFIG_IXGBE_LRO +- if (adapter->netdev->features & NETIF_F_LRO && +- skb->ip_summed == CHECKSUM_UNNECESSARY) { +- if (adapter->vlgrp && is_vlan && (tag != 0)) +- lro_vlan_hwaccel_receive_skb(&ring->lro_mgr, skb, +- adapter->vlgrp, tag, +- rx_desc); +- else +- lro_receive_skb(&ring->lro_mgr, skb, rx_desc); +- ring->lro_used = true; +- } else { +-#endif ++ * @vlan_tag: vlan tag for packet ++ **/ ++static void ixgbe_receive_skb(struct ixgbe_q_vector *q_vector, ++ struct sk_buff *skb, u16 vlan_tag) ++{ ++ struct ixgbe_adapter *adapter = q_vector->adapter; ++ int ret; ++ ++#ifdef CONFIG_IXGBE_NAPI + if (!(adapter->flags & IXGBE_FLAG_IN_NETPOLL)) { +- if (adapter->vlgrp && is_vlan && (tag != 0)) +- vlan_hwaccel_receive_skb(skb, adapter->vlgrp, tag); ++#ifdef NETIF_F_HW_VLAN_TX ++ if (adapter->vlgrp && vlan_tag) ++ vlan_gro_receive(&q_vector->napi, ++ adapter->vlgrp, ++ vlan_tag, skb); + else +- netif_receive_skb(skb); +- } else { +- if (adapter->vlgrp && is_vlan && (tag != 0)) +- vlan_hwaccel_rx(skb, adapter->vlgrp, tag); ++ napi_gro_receive(&q_vector->napi, skb); ++#else ++ napi_gro_receive(&q_vector->napi, skb); ++#endif ++ } else { ++#endif /* CONFIG_IXGBE_NAPI */ ++ ++#ifdef NETIF_F_HW_VLAN_TX ++ if (adapter->vlgrp && vlan_tag) ++ ret = vlan_hwaccel_rx(skb, adapter->vlgrp, ++ vlan_tag); + else +- netif_rx(skb); +- } +-#ifdef CONFIG_IXGBE_LRO +- } +-#endif ++ ret = netif_rx(skb); ++#else ++ ret = netif_rx(skb); ++#endif ++#ifndef CONFIG_IXGBE_NAPI ++ if (ret == NET_RX_DROP) ++ adapter->rx_dropped_backlog++; ++#endif ++#ifdef CONFIG_IXGBE_NAPI ++ } ++#endif /* CONFIG_IXGBE_NAPI */ + } + + /** + * ixgbe_rx_checksum - indicate in skb if hw indicated a good cksum + * @adapter: address of board private structure +- * @status_err: hardware indication of status of receive ++ * @rx_desc: current Rx descriptor being processed + * @skb: skb currently being received and modified + **/ + static inline void ixgbe_rx_checksum(struct ixgbe_adapter *adapter, +- u32 status_err, struct sk_buff *skb) +-{ ++ union ixgbe_adv_rx_desc *rx_desc, ++ struct sk_buff *skb) ++{ ++ u32 status_err = le32_to_cpu(rx_desc->wb.upper.status_error); + skb->ip_summed = CHECKSUM_NONE; + + /* Rx csum disabled */ +@@ -471,6 +576,19 @@ + adapter->hw_csum_rx_good++; + } + ++static inline void ixgbe_release_rx_desc(struct ixgbe_hw *hw, ++ struct ixgbe_ring *rx_ring, u32 val) ++{ ++ /* ++ * Force memory writes to complete before letting h/w ++ * know there are new descriptors to fetch. (Only ++ * applicable for weak-ordered memory model archs, ++ * such as IA-64). ++ */ ++ wmb(); ++ writel(val, hw->hw_addr + rx_ring->tail); ++} ++ + /** + * ixgbe_alloc_rx_buffers - Replace used receive buffers; packet split + * @adapter: address of board private structure +@@ -480,7 +598,6 @@ + int cleaned_count) + { + struct pci_dev *pdev = adapter->pdev; +- struct net_device *netdev = adapter->netdev; + union ixgbe_adv_rx_desc *rx_desc; + struct ixgbe_rx_buffer *bi; + unsigned int i; +@@ -495,7 +612,7 @@ + if (!bi->page_dma && + (adapter->flags & IXGBE_FLAG_RX_PS_ENABLED)) { + if (!bi->page) { +- bi->page = netdev_alloc_page(netdev); ++ bi->page = alloc_page(GFP_ATOMIC); + if (!bi->page) { + adapter->alloc_rx_page_failed++; + goto no_buffers; +@@ -529,9 +646,12 @@ + skb_reserve(skb, NET_IP_ALIGN); + + bi->skb = skb; +- bi->dma = pci_map_single(pdev, skb->data, bufsz, ++ } ++ ++ if (!bi->dma) ++ bi->dma = pci_map_single(pdev, bi->skb->data, rx_ring->rx_buf_len, + PCI_DMA_FROMDEVICE); +- } ++ + /* Refresh the desc even if buffer_addrs didn't change because + * each write-back erases this info. */ + if (adapter->flags & IXGBE_FLAG_RX_PS_ENABLED) { +@@ -553,14 +673,7 @@ + if (i-- == 0) + i = (rx_ring->count - 1); + +- /* +- * Force memory writes to complete before letting h/w +- * know there are new descriptors to fetch. (Only +- * applicable for weak-ordered memory model archs, +- * such as IA-64). +- */ +- wmb(); +- writel(i, adapter->hw.hw_addr + rx_ring->tail); ++ ixgbe_release_rx_desc(&adapter->hw, rx_ring, i); + } + } + +@@ -569,24 +682,428 @@ + return rx_desc->wb.lower.lo_dword.hs_rss.hdr_info; + } + +-static inline u16 ixgbe_get_pkt_info(union ixgbe_adv_rx_desc *rx_desc) +-{ +- return rx_desc->wb.lower.lo_dword.hs_rss.pkt_info; +-} +- +-static bool ixgbe_clean_rx_irq(struct ixgbe_adapter *adapter, ++#if !defined(IXGBE_NO_LRO) || !defined(IXGBE_NO_HW_RSC) ++/** ++ * ixgbe_transform_rsc_queue - change rsc queue into a full packet ++ * @skb: pointer to the last skb in the rsc queue ++ * ++ * This function changes a queue full of hw rsc buffers into a completed ++ * packet. It uses the ->prev pointers to find the first packet and then ++ * turns it into the frag list owner. ++ **/ ++static inline struct sk_buff *ixgbe_transform_rsc_queue(struct sk_buff *skb) ++{ ++ unsigned int frag_list_size = 0; ++ ++ while (skb->prev) { ++ struct sk_buff *prev = skb->prev; ++ frag_list_size += skb->len; ++ skb->prev = NULL; ++ skb = prev; ++ } ++ ++ skb_shinfo(skb)->frag_list = skb->next; ++ skb->next = NULL; ++ skb->len += frag_list_size; ++ skb->data_len += frag_list_size; ++ skb->truesize += frag_list_size; ++ return skb; ++} ++ ++#endif /* !IXGBE_NO_LRO || !IXGBE_NO_HW_RSC */ ++#ifndef IXGBE_NO_LRO ++/** ++ * ixgbe_can_lro - returns true if packet is TCP/IPV4 and LRO is enabled ++ * @adapter: board private structure ++ * @rx_desc: pointer to the rx descriptor ++ * ++ **/ ++static inline bool ixgbe_can_lro(struct ixgbe_adapter *adapter, ++ union ixgbe_adv_rx_desc *rx_desc) ++{ ++ u16 pkt_info = rx_desc->wb.lower.lo_dword.hs_rss.pkt_info; ++ ++ return (adapter->flags2 & IXGBE_FLAG2_SWLRO_ENABLED) && ++ !(adapter->netdev->flags & IFF_PROMISC) && ++ (pkt_info & IXGBE_RXDADV_PKTTYPE_IPV4) && ++ (pkt_info & IXGBE_RXDADV_PKTTYPE_TCP); ++} ++ ++/** ++ * ixgbe_lro_flush - Indicate packets to upper layer. ++ * ++ * Update IP and TCP header part of head skb if more than one ++ * skb's chained and indicate packets to upper layer. ++ **/ ++static void ixgbe_lro_flush(struct ixgbe_q_vector *q_vector, ++ struct ixgbe_lro_desc *lrod) ++{ ++ struct ixgbe_lro_list *lrolist = q_vector->lrolist; ++ struct iphdr *iph; ++ struct tcphdr *th; ++ struct sk_buff *skb; ++ u32 *ts_ptr; ++ ++ hlist_del(&lrod->lro_node); ++ lrolist->active_cnt--; ++ ++ skb = lrod->skb; ++ lrod->skb = NULL; ++ ++ if (lrod->append_cnt) { ++ /* take the lro queue and convert to skb format */ ++ skb = ixgbe_transform_rsc_queue(skb); ++ ++ /* incorporate ip header and re-calculate checksum */ ++ iph = (struct iphdr *)skb->data; ++ iph->tot_len = ntohs(skb->len); ++ iph->check = 0; ++ iph->check = ip_fast_csum((unsigned char *)iph, iph->ihl); ++ ++ /* incorporate the latest ack into the tcp header */ ++ th = (struct tcphdr *) ((char *)skb->data + sizeof(*iph)); ++ th->ack_seq = lrod->ack_seq; ++ th->psh = lrod->psh; ++ th->window = lrod->window; ++ th->check = 0; ++ ++ /* incorporate latest timestamp into the tcp header */ ++ if (lrod->opt_bytes) { ++ ts_ptr = (u32 *)(th + 1); ++ ts_ptr[1] = htonl(lrod->tsval); ++ ts_ptr[2] = lrod->tsecr; ++ } ++ } ++ ++#ifdef NETIF_F_TSO ++ skb_shinfo(skb)->gso_size = lrod->mss; ++#endif ++ ixgbe_receive_skb(q_vector, skb, lrod->vlan_tag); ++ lrolist->stats.flushed++; ++ ++ ++ hlist_add_head(&lrod->lro_node, &lrolist->free); ++} ++ ++static void ixgbe_lro_flush_all(struct ixgbe_q_vector *q_vector) ++{ ++ struct ixgbe_lro_desc *lrod; ++ struct hlist_node *node, *node2; ++ struct ixgbe_lro_list *lrolist = q_vector->lrolist; ++ ++ hlist_for_each_entry_safe(lrod, node, node2, &lrolist->active, lro_node) ++ ixgbe_lro_flush(q_vector, lrod); ++} ++ ++/* ++ * ixgbe_lro_header_ok - Main LRO function. ++ **/ ++static u16 ixgbe_lro_header_ok(struct sk_buff *new_skb, struct iphdr *iph, ++ struct tcphdr *th) ++{ ++ int opt_bytes, tcp_data_len; ++ u32 *ts_ptr = NULL; ++ ++ /* If we see CE codepoint in IP header, packet is not mergeable */ ++ if (INET_ECN_is_ce(ipv4_get_dsfield(iph))) ++ return -1; ++ ++ /* ensure there are no options */ ++ if ((iph->ihl << 2) != sizeof(*iph)) ++ return -1; ++ ++ /* .. and the packet is not fragmented */ ++ if (iph->frag_off & htons(IP_MF|IP_OFFSET)) ++ return -1; ++ ++ /* ensure no bits set besides ack or psh */ ++ if (th->fin || th->syn || th->rst || ++ th->urg || th->ece || th->cwr || !th->ack) ++ return -1; ++ ++ /* ensure that the checksum is valid */ ++ if (new_skb->ip_summed != CHECKSUM_UNNECESSARY) ++ return -1; ++ ++ /* ++ * check for timestamps. Since the only option we handle are timestamps, ++ * we only have to handle the simple case of aligned timestamps ++ */ ++ ++ opt_bytes = (th->doff << 2) - sizeof(*th); ++ if (opt_bytes != 0) { ++ ts_ptr = (u32 *)(th + 1); ++ if ((opt_bytes != TCPOLEN_TSTAMP_ALIGNED) || ++ (*ts_ptr != ntohl((TCPOPT_NOP << 24) | ++ (TCPOPT_NOP << 16) | (TCPOPT_TIMESTAMP << 8) | ++ TCPOLEN_TIMESTAMP))) { ++ return -1; ++ } ++ } ++ ++ tcp_data_len = ntohs(iph->tot_len) - (th->doff << 2) - sizeof(*iph); ++ ++ return tcp_data_len; ++} ++ ++/** ++ * ixgbe_lro_queue - if able, queue skb into lro chain ++ * @q_vector: structure containing interrupt and ring information ++ * @new_skb: pointer to current skb being checked ++ * @tag: vlan tag for skb ++ * ++ * Checks whether the skb given is eligible for LRO and if that's ++ * fine chains it to the existing lro_skb based on flowid. If an LRO for ++ * the flow doesn't exist create one. ++ **/ ++static struct sk_buff *ixgbe_lro_queue(struct ixgbe_q_vector *q_vector, ++ struct sk_buff *new_skb, ++ u16 tag) ++{ ++ struct sk_buff *lro_skb; ++ struct ixgbe_lro_desc *lrod; ++ struct hlist_node *node; ++ struct skb_shared_info *new_skb_info = skb_shinfo(new_skb); ++ struct ixgbe_lro_list *lrolist = q_vector->lrolist; ++ struct iphdr *iph = (struct iphdr *)new_skb->data; ++ struct tcphdr *th = (struct tcphdr *)(iph + 1); ++ int tcp_data_len = ixgbe_lro_header_ok(new_skb, iph, th); ++ u16 opt_bytes = (th->doff << 2) - sizeof(*th); ++ u32 *ts_ptr = (opt_bytes ? (u32 *)(th + 1) : NULL); ++ u32 seq = ntohl(th->seq); ++ ++ /* ++ * we have a packet that might be eligible for LRO, ++ * so see if it matches anything we might expect ++ */ ++ hlist_for_each_entry(lrod, node, &lrolist->active, lro_node) { ++ if (lrod->source_port != th->source || ++ lrod->dest_port != th->dest || ++ lrod->source_ip != iph->saddr || ++ lrod->dest_ip != iph->daddr || ++ lrod->vlan_tag != tag) ++ continue; ++ ++ /* malformed header, or resultant packet would be too large */ ++ if (tcp_data_len < 0 || (tcp_data_len + lrod->len) > 65535) { ++ ixgbe_lro_flush(q_vector, lrod); ++ break; ++ } ++ ++ /* out of order packet */ ++ if (seq != lrod->next_seq) { ++ ixgbe_lro_flush(q_vector, lrod); ++ tcp_data_len = -1; ++ break; ++ } ++ ++ if (lrod->opt_bytes || opt_bytes) { ++ u32 tsval = ntohl(*(ts_ptr + 1)); ++ /* make sure timestamp values are increasing */ ++ if (opt_bytes != lrod->opt_bytes || ++ lrod->tsval > tsval || *(ts_ptr + 2) == 0) { ++ ixgbe_lro_flush(q_vector, lrod); ++ tcp_data_len = -1; ++ break; ++ } ++ ++ lrod->tsval = tsval; ++ lrod->tsecr = *(ts_ptr + 2); ++ } ++ ++ /* remove any padding from the end of the skb */ ++ __pskb_trim(new_skb, ntohs(iph->tot_len)); ++ /* Remove IP and TCP header*/ ++ skb_pull(new_skb, ntohs(iph->tot_len) - tcp_data_len); ++ ++ lrod->next_seq += tcp_data_len; ++ lrod->ack_seq = th->ack_seq; ++ lrod->window = th->window; ++ lrod->len += tcp_data_len; ++ lrod->psh |= th->psh; ++ lrod->append_cnt++; ++ lrolist->stats.coal++; ++ ++ if (tcp_data_len > lrod->mss) ++ lrod->mss = tcp_data_len; ++ ++ lro_skb = lrod->skb; ++ ++ /* if header is empty pull pages into current skb */ ++ if (!skb_headlen(new_skb) && ++ ((skb_shinfo(lro_skb)->nr_frags + ++ skb_shinfo(new_skb)->nr_frags) <= MAX_SKB_FRAGS )) { ++ struct skb_shared_info *lro_skb_info = skb_shinfo(lro_skb); ++ ++ /* copy frags into the last skb */ ++ memcpy(lro_skb_info->frags + lro_skb_info->nr_frags, ++ new_skb_info->frags, ++ new_skb_info->nr_frags * sizeof(skb_frag_t)); ++ ++ lro_skb_info->nr_frags += new_skb_info->nr_frags; ++ lro_skb->len += tcp_data_len; ++ lro_skb->data_len += tcp_data_len; ++ lro_skb->truesize += tcp_data_len; ++ ++ new_skb_info->nr_frags = 0; ++ new_skb->truesize -= tcp_data_len; ++ new_skb->len = new_skb->data_len = 0; ++ } else if (tcp_data_len) { ++ /* Chain this new skb in frag_list */ ++ new_skb->prev = lro_skb; ++ lro_skb->next = new_skb; ++ lrod->skb = new_skb ; ++ } ++ ++ if (lrod->psh) ++ ixgbe_lro_flush(q_vector, lrod); ++ ++ /* return the skb if it is empty for recycling */ ++ if (!new_skb->len) { ++ new_skb->data = skb_mac_header(new_skb); ++ __pskb_trim(new_skb, 0); ++ new_skb->protocol = 0; ++ lrolist->stats.recycled++; ++ return new_skb; ++ } ++ ++ return NULL; ++ } ++ ++ /* start a new packet */ ++ if (tcp_data_len > 0 && !hlist_empty(&lrolist->free) && !th->psh) { ++ lrod = hlist_entry(lrolist->free.first, struct ixgbe_lro_desc, ++ lro_node); ++ ++ lrod->skb = new_skb; ++ lrod->source_ip = iph->saddr; ++ lrod->dest_ip = iph->daddr; ++ lrod->source_port = th->source; ++ lrod->dest_port = th->dest; ++ lrod->vlan_tag = tag; ++ lrod->len = new_skb->len; ++ lrod->next_seq = seq + tcp_data_len; ++ lrod->ack_seq = th->ack_seq; ++ lrod->window = th->window; ++ lrod->mss = tcp_data_len; ++ lrod->opt_bytes = opt_bytes; ++ lrod->psh = 0; ++ lrod->append_cnt = 0; ++ ++ /* record timestamp if it is present */ ++ if (opt_bytes) { ++ lrod->tsval = ntohl(*(ts_ptr + 1)); ++ lrod->tsecr = *(ts_ptr + 2); ++ } ++ /* remove first packet from freelist.. */ ++ hlist_del(&lrod->lro_node); ++ /* .. and insert at the front of the active list */ ++ hlist_add_head(&lrod->lro_node, &lrolist->active); ++ lrolist->active_cnt++; ++ lrolist->stats.coal++; ++ return NULL; ++ } ++ ++ /* packet not handled by any of the above, pass it to the stack */ ++ ixgbe_receive_skb(q_vector, new_skb, tag); ++ return NULL; ++} ++ ++static void ixgbe_lro_ring_exit(struct ixgbe_lro_list *lrolist) ++{ ++ struct hlist_node *node, *node2; ++ struct ixgbe_lro_desc *lrod; ++ ++ hlist_for_each_entry_safe(lrod, node, node2, &lrolist->active, ++ lro_node) { ++ hlist_del(&lrod->lro_node); ++ kfree(lrod); ++ } ++ ++ hlist_for_each_entry_safe(lrod, node, node2, &lrolist->free, ++ lro_node) { ++ hlist_del(&lrod->lro_node); ++ kfree(lrod); ++ } ++} ++ ++static void ixgbe_lro_ring_init(struct ixgbe_lro_list *lrolist) ++{ ++ int j, bytes; ++ struct ixgbe_lro_desc *lrod; ++ ++ bytes = sizeof(struct ixgbe_lro_desc); ++ ++ INIT_HLIST_HEAD(&lrolist->free); ++ INIT_HLIST_HEAD(&lrolist->active); ++ ++ for (j = 0; j < IXGBE_LRO_MAX; j++) { ++ lrod = kzalloc(bytes, GFP_KERNEL); ++ if (lrod != NULL) { ++ INIT_HLIST_NODE(&lrod->lro_node); ++ hlist_add_head(&lrod->lro_node, &lrolist->free); ++ } ++ } ++} ++ ++#endif /* IXGBE_NO_LRO */ ++ ++#ifndef IXGBE_NO_HW_RSC ++static inline u32 ixgbe_get_rsc_count(union ixgbe_adv_rx_desc *rx_desc) ++{ ++ return (le32_to_cpu(rx_desc->wb.lower.lo_dword.data) & ++ IXGBE_RXDADV_RSCCNT_MASK) >> ++ IXGBE_RXDADV_RSCCNT_SHIFT; ++} ++ ++#endif /* IXGBE_NO_HW_RSC */ ++ ++static void ixgbe_rx_status_indication(u32 staterr, ++ struct ixgbe_adapter *adapter) ++{ ++ switch (adapter->hw.mac.type) { ++ case ixgbe_mac_82599EB: ++ if (staterr & IXGBE_RXD_STAT_FLM) ++ adapter->flm++; ++#ifndef IXGBE_NO_LLI ++ if (staterr & IXGBE_RXD_STAT_DYNINT) ++ adapter->lli_int++; ++#endif /* IXGBE_NO_LLI */ ++ break; ++ case ixgbe_mac_82598EB: ++#ifndef IXGBE_NO_LLI ++ if (staterr & IXGBE_RXD_STAT_DYNINT) ++ adapter->lli_int++; ++#endif /* IXGBE_NO_LLI */ ++ break; ++ default: ++ break; ++ } ++} ++ ++#ifdef CONFIG_IXGBE_NAPI ++static bool ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector, + struct ixgbe_ring *rx_ring, + int *work_done, int work_to_do) +-{ ++#else ++static bool ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector, ++ struct ixgbe_ring *rx_ring) ++#endif ++{ ++ struct ixgbe_adapter *adapter = q_vector->adapter; + struct pci_dev *pdev = adapter->pdev; + union ixgbe_adv_rx_desc *rx_desc, *next_rxd; + struct ixgbe_rx_buffer *rx_buffer_info, *next_buffer; + struct sk_buff *skb; +- unsigned int i; ++ unsigned int i, rsc_count = 0; + u32 len, staterr; +- u16 hdr_info; ++ u16 hdr_info, vlan_tag; + bool cleaned = false; + int cleaned_count = 0; ++#ifndef CONFIG_IXGBE_NAPI ++ int work_to_do = rx_ring->work_limit, local_work_done = 0; ++ int *work_done = &local_work_done; ++#endif + unsigned int total_rx_bytes = 0, total_rx_packets = 0; + + i = rx_ring->next_to_clean; +@@ -604,24 +1121,23 @@ + hdr_info = le16_to_cpu(ixgbe_get_hdr_info(rx_desc)); + len = (hdr_info & IXGBE_RXDADV_HDRBUFLEN_MASK) >> + IXGBE_RXDADV_HDRBUFLEN_SHIFT; +- if (hdr_info & IXGBE_RXDADV_SPH) +- adapter->rx_hdr_split++; + if (len > IXGBE_RX_HDR_SIZE) + len = IXGBE_RX_HDR_SIZE; + upper_len = le16_to_cpu(rx_desc->wb.upper.length); + } else { + len = le16_to_cpu(rx_desc->wb.upper.length); + } +- + cleaned = true; + skb = rx_buffer_info->skb; + prefetch(skb->data - NET_IP_ALIGN); + rx_buffer_info->skb = NULL; + +- if (len && !skb_shinfo(skb)->nr_frags) { ++ /* if this is a skb from previous receive dma will be 0 */ ++ if (rx_buffer_info->dma) { + pci_unmap_single(pdev, rx_buffer_info->dma, +- rx_ring->rx_buf_len + NET_IP_ALIGN, ++ rx_ring->rx_buf_len, + PCI_DMA_FROMDEVICE); ++ rx_buffer_info->dma = 0; + skb_put(skb, len); + } + +@@ -629,53 +1145,90 @@ + pci_unmap_page(pdev, rx_buffer_info->page_dma, + PAGE_SIZE / 2, PCI_DMA_FROMDEVICE); + rx_buffer_info->page_dma = 0; +- skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, +- rx_buffer_info->page, +- rx_buffer_info->page_offset, +- upper_len); +- +- if ((rx_ring->rx_buf_len > (PAGE_SIZE / 2)) || +- (page_count(rx_buffer_info->page) != 1)) ++ skb_fill_page_desc(skb, skb_shinfo(skb)->nr_frags, ++ rx_buffer_info->page, ++ rx_buffer_info->page_offset, ++ upper_len); ++ ++ if (page_count(rx_buffer_info->page) != 1) + rx_buffer_info->page = NULL; + else + get_page(rx_buffer_info->page); + ++ skb->len += upper_len; ++ skb->data_len += upper_len; ++ skb->truesize += upper_len; + } + + i++; + if (i == rx_ring->count) + i = 0; +- next_buffer = &rx_ring->rx_buffer_info[i]; + + next_rxd = IXGBE_RX_DESC_ADV(*rx_ring, i); + prefetch(next_rxd); +- + cleaned_count++; ++ ++#ifndef IXGBE_NO_HW_RSC ++ if (adapter->flags2 & IXGBE_FLAG2_RSC_CAPABLE) ++ rsc_count = ixgbe_get_rsc_count(rx_desc); ++ ++#endif ++ if (rsc_count) { ++ u32 nextp = (staterr & IXGBE_RXDADV_NEXTP_MASK) >> ++ IXGBE_RXDADV_NEXTP_SHIFT; ++ next_buffer = &rx_ring->rx_buffer_info[nextp]; ++ rx_ring->rsc_count += (rsc_count - 1); ++ } else { ++ next_buffer = &rx_ring->rx_buffer_info[i]; ++ } ++ + if (staterr & IXGBE_RXD_STAT_EOP) { ++ ixgbe_rx_status_indication(staterr, adapter); ++#ifndef IXGBE_NO_HW_RSC ++ if (skb->prev) ++ skb = ixgbe_transform_rsc_queue(skb); ++#endif + rx_ring->stats.packets++; + rx_ring->stats.bytes += skb->len; + } else { +- rx_buffer_info->skb = next_buffer->skb; +- rx_buffer_info->dma = next_buffer->dma; +- next_buffer->skb = skb; +- next_buffer->dma = 0; ++ if (adapter->flags & IXGBE_FLAG_RX_PS_ENABLED) { ++ rx_buffer_info->skb = next_buffer->skb; ++ rx_buffer_info->dma = next_buffer->dma; ++ next_buffer->skb = skb; ++ next_buffer->dma = 0; ++ } else { ++ skb->next = next_buffer->skb; ++ skb->next->prev = skb; ++ } + adapter->non_eop_descs++; + goto next_desc; + } + +- if (staterr & IXGBE_RXDADV_ERR_FRAME_ERR_MASK) { +- dev_kfree_skb_irq(skb); ++ /* ERR_MASK will only have valid bits if EOP set */ ++ if (unlikely(staterr & IXGBE_RXDADV_ERR_FRAME_ERR_MASK)) { ++ /* trim packet back to size 0 and recycle it */ ++ __pskb_trim(skb, 0); ++ rx_buffer_info->skb = skb; + goto next_desc; + } + +- ixgbe_rx_checksum(adapter, staterr, skb); ++ ixgbe_rx_checksum(adapter, rx_desc, skb); + + /* probably a little skewed due to removing CRC */ + total_rx_bytes += skb->len; + total_rx_packets++; + + skb->protocol = eth_type_trans(skb, adapter->netdev); +- ixgbe_receive_skb(adapter, skb, staterr, rx_ring, rx_desc); ++ vlan_tag = ((staterr & IXGBE_RXD_STAT_VP) ? ++ le16_to_cpu(rx_desc->wb.upper.vlan) : 0); ++ ++#ifndef IXGBE_NO_LRO ++ if (ixgbe_can_lro(adapter, rx_desc)) ++ rx_buffer_info->skb = ixgbe_lro_queue(q_vector, skb, vlan_tag); ++ else ++#endif ++ ixgbe_receive_skb(q_vector, skb, vlan_tag); ++ + adapter->netdev->last_rx = jiffies; + + next_desc: +@@ -689,18 +1242,15 @@ + + /* use prefetched values */ + rx_desc = next_rxd; +- rx_buffer_info = next_buffer; ++ rx_buffer_info = &rx_ring->rx_buffer_info[i]; + + staterr = le32_to_cpu(rx_desc->wb.upper.status_error); + } + +-#ifdef CONFIG_IXGBE_LRO +- if (rx_ring->lro_used) { +- lro_flush_all(&rx_ring->lro_mgr); +- rx_ring->lro_used = false; +- } +-#endif +- ++#ifndef IXGBE_NO_LRO ++ if (adapter->flags2 & IXGBE_FLAG2_SWLRO_ENABLED) ++ ixgbe_lro_flush_all(q_vector); ++#endif /* IXGBE_NO_LRO */ + rx_ring->next_to_clean = i; + cleaned_count = IXGBE_DESC_UNUSED(rx_ring); + +@@ -712,10 +1262,46 @@ + adapter->net_stats.rx_bytes += total_rx_bytes; + adapter->net_stats.rx_packets += total_rx_packets; + ++#ifndef CONFIG_IXGBE_NAPI ++ /* re-arm the interrupt if we had to bail early and have more work */ ++ if ((*work_done >= work_to_do) && ++ (!test_bit(__IXGBE_DOWN, &adapter->state))) ++ ixgbe_irq_rearm_queues(adapter, ((u64)1 << q_vector->v_idx)); ++#endif + return cleaned; + } + ++/** ++ * ixgbe_write_eitr - write EITR register in hardware specific way ++ * @q_vector: structure containing interrupt and ring information ++ * ++ * This function is made to be called by ethtool and by the driver ++ * when it needs to update EITR registers at runtime. Hardware ++ * specific quirks/differences are taken care of here. ++ */ ++void ixgbe_write_eitr(struct ixgbe_q_vector *q_vector) ++{ ++ struct ixgbe_adapter *adapter = q_vector->adapter; ++ struct ixgbe_hw *hw = &adapter->hw; ++ int v_idx = q_vector->v_idx; ++ u32 itr_reg = EITR_INTS_PER_SEC_TO_REG(q_vector->eitr); ++ ++ if (adapter->hw.mac.type == ixgbe_mac_82598EB) { ++ /* must write high and low 16 bits to reset counter */ ++ itr_reg |= (itr_reg << 16); ++ } else if (adapter->hw.mac.type == ixgbe_mac_82599EB) { ++ /* ++ * set the WDIS bit to not clear the timer bits and cause an ++ * immediate assertion of the interrupt ++ */ ++ itr_reg |= IXGBE_EITR_CNT_WDIS; ++ } ++ IXGBE_WRITE_REG(hw, IXGBE_EITR(v_idx), itr_reg); ++} ++ ++#ifdef CONFIG_IXGBE_NAPI + static int ixgbe_clean_rxonly(struct napi_struct *, int); ++#endif + /** + * ixgbe_configure_msix - Configure MSI-X hardware + * @adapter: board private structure +@@ -731,18 +1317,19 @@ + + q_vectors = adapter->num_msix_vectors - NON_Q_VECTORS; + +- /* Populate the IVAR table and set the ITR values to the ++ /* ++ * Populate the IVAR table and set the ITR values to the + * corresponding register. + */ + for (v_idx = 0; v_idx < q_vectors; v_idx++) { +- q_vector = &adapter->q_vector[v_idx]; ++ q_vector = adapter->q_vector[v_idx]; + /* XXX for_each_bit(...) */ + r_idx = find_first_bit(q_vector->rxr_idx, + adapter->num_rx_queues); + + for (i = 0; i < q_vector->rxr_count; i++) { + j = adapter->rx_ring[r_idx].reg_idx; +- ixgbe_set_ivar(adapter, IXGBE_IVAR_RX_QUEUE(j), v_idx); ++ ixgbe_set_ivar(adapter, 0, j, v_idx); + r_idx = find_next_bit(q_vector->rxr_idx, + adapter->num_rx_queues, + r_idx + 1); +@@ -752,7 +1339,7 @@ + + for (i = 0; i < q_vector->txr_count; i++) { + j = adapter->tx_ring[r_idx].reg_idx; +- ixgbe_set_ivar(adapter, IXGBE_IVAR_TX_QUEUE(j), v_idx); ++ ixgbe_set_ivar(adapter, 1, j, v_idx); + r_idx = find_next_bit(q_vector->txr_idx, + adapter->num_tx_queues, + r_idx + 1); +@@ -761,16 +1348,22 @@ + /* if this is a tx only vector halve the interrupt rate */ + if (q_vector->txr_count && !q_vector->rxr_count) + q_vector->eitr = (adapter->eitr_param >> 1); +- else ++ else if (q_vector->rxr_count) + /* rx only */ + q_vector->eitr = adapter->eitr_param; + +- IXGBE_WRITE_REG(&adapter->hw, IXGBE_EITR(v_idx), +- EITR_INTS_PER_SEC_TO_REG(q_vector->eitr)); +- } +- +- ixgbe_set_ivar(adapter, IXGBE_IVAR_OTHER_CAUSES_INDEX, v_idx); ++ ixgbe_write_eitr(q_vector); ++ } ++ ++ if (adapter->hw.mac.type == ixgbe_mac_82598EB) ++ ixgbe_set_ivar(adapter, -1, IXGBE_IVAR_OTHER_CAUSES_INDEX, ++ v_idx); ++ else if (adapter->hw.mac.type == ixgbe_mac_82599EB) ++ ixgbe_set_ivar(adapter, -1, 1, v_idx); + IXGBE_WRITE_REG(&adapter->hw, IXGBE_EITR(v_idx), 1950); ++#ifdef IXGBE_TCP_TIMER ++ ixgbe_set_ivar(adapter, -1, 0, ++v_idx); ++#endif /* IXGBE_TCP_TIMER */ + + /* set up to autoclear timer, and the vectors */ + mask = IXGBE_EIMS_ENABLE_MASK; +@@ -826,18 +1419,22 @@ + + switch (itr_setting) { + case lowest_latency: +- if (bytes_perint > adapter->eitr_low) ++ if (bytes_perint > adapter->eitr_low) { + retval = low_latency; ++ } + break; + case low_latency: +- if (bytes_perint > adapter->eitr_high) ++ if (bytes_perint > adapter->eitr_high) { + retval = bulk_latency; +- else if (bytes_perint <= adapter->eitr_low) ++ } ++ else if (bytes_perint <= adapter->eitr_low) { + retval = lowest_latency; ++ } + break; + case bulk_latency: +- if (bytes_perint <= adapter->eitr_high) ++ if (bytes_perint <= adapter->eitr_high) { + retval = low_latency; ++ } + break; + } + +@@ -848,12 +1445,10 @@ + static void ixgbe_set_itr_msix(struct ixgbe_q_vector *q_vector) + { + struct ixgbe_adapter *adapter = q_vector->adapter; +- struct ixgbe_hw *hw = &adapter->hw; + u32 new_itr; + u8 current_itr, ret_itr; +- int i, r_idx, v_idx = ((void *)q_vector - (void *)(adapter->q_vector)) / +- sizeof(struct ixgbe_q_vector); +- struct ixgbe_ring *rx_ring, *tx_ring; ++ int i, r_idx; ++ struct ixgbe_ring *rx_ring = NULL, *tx_ring = NULL; + + r_idx = find_first_bit(q_vector->txr_idx, adapter->num_tx_queues); + for (i = 0; i < q_vector->txr_count; i++) { +@@ -902,15 +1497,14 @@ + } + + if (new_itr != q_vector->eitr) { +- u32 itr_reg; ++ + /* do an exponential smoothing */ + new_itr = ((q_vector->eitr * 90)/100) + ((new_itr * 10)/100); ++ ++ /* save the algorithm value here */ + q_vector->eitr = new_itr; +- itr_reg = EITR_INTS_PER_SEC_TO_REG(new_itr); +- /* must write high and low 16 bits to reset counter */ +- DPRINTK(TX_ERR, DEBUG, "writing eitr(%d): %08X\n", v_idx, +- itr_reg); +- IXGBE_WRITE_REG(hw, IXGBE_EITR(v_idx), itr_reg | (itr_reg)<<16); ++ ++ ixgbe_write_eitr(q_vector); + } + + return; +@@ -925,6 +1519,26 @@ + DPRINTK(PROBE, CRIT, "Fan has stopped, replace the adapter\n"); + /* write to clear the interrupt */ + IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_GPI_SDP1); ++ } ++} ++ ++static void ixgbe_check_sfp_event(struct ixgbe_adapter *adapter, u32 eicr) ++{ ++ struct ixgbe_hw *hw = &adapter->hw; ++ ++ if (eicr & IXGBE_EICR_GPI_SDP1) { ++ /* Clear the interrupt */ ++ IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_GPI_SDP1); ++ if (!test_bit(__IXGBE_DOWN, &adapter->state)) ++ schedule_work(&adapter->multispeed_fiber_task); ++ } else if (eicr & IXGBE_EICR_GPI_SDP2) { ++ /* Clear the interrupt */ ++ IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_GPI_SDP2); ++ if (!test_bit(__IXGBE_DOWN, &adapter->state)) ++ schedule_work(&adapter->sfp_config_module_task); ++ } else { ++ /* Interrupt isn't for us... */ ++ return; + } + } + +@@ -946,17 +1560,116 @@ + struct net_device *netdev = data; + struct ixgbe_adapter *adapter = netdev_priv(netdev); + struct ixgbe_hw *hw = &adapter->hw; +- u32 eicr = IXGBE_READ_REG(hw, IXGBE_EICR); ++ u32 eicr; ++ ++ /* ++ * Workaround of Silicon errata on 82598. Use clear-by-write ++ * instead of clear-by-read to clear EICR , reading EICS gives the ++ * value of EICR without read-clear of EICR ++ */ ++ eicr = IXGBE_READ_REG(hw, IXGBE_EICS); ++ IXGBE_WRITE_REG(hw, IXGBE_EICR, eicr); + + if (eicr & IXGBE_EICR_LSC) + ixgbe_check_lsc(adapter); + ++ if (hw->mac.type == ixgbe_mac_82599EB) { ++ if (eicr & IXGBE_EICR_ECC) { ++ DPRINTK(LINK, INFO, "Received unrecoverable ECC Err, " ++ "please reboot\n"); ++ IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_ECC); ++ } ++ /* Handle Flow Director Full threshold interrupt */ ++ if (eicr & IXGBE_EICR_FLOW_DIR) { ++ int i; ++ IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_FLOW_DIR); ++ /* Disable transmits before FDIR Re-initialization */ ++ netif_tx_stop_all_queues(netdev); ++ for (i = 0; i < adapter->num_tx_queues; i++) { ++ struct ixgbe_ring *tx_ring = ++ &adapter->tx_ring[i]; ++ if (test_and_clear_bit(__IXGBE_FDIR_INIT_DONE, ++ &tx_ring->reinit_state)) ++ schedule_work(&adapter->fdir_reinit_task); ++ } ++ } ++ } ++ + ixgbe_check_fan_failure(adapter, eicr); + ++ if (hw->mac.type == ixgbe_mac_82599EB) ++ ixgbe_check_sfp_event(adapter, eicr); ++ ++ /* re-enable the original interrupt state, no lsc, no queues */ + if (!test_bit(__IXGBE_DOWN, &adapter->state)) +- IXGBE_WRITE_REG(hw, IXGBE_EIMS, IXGBE_EIMS_OTHER); ++ IXGBE_WRITE_REG(hw, IXGBE_EIMS, eicr & ++ ~(IXGBE_EIMS_LSC | IXGBE_EIMS_RTX_QUEUE)); + + return IRQ_HANDLED; ++} ++ ++#ifdef IXGBE_TCP_TIMER ++static irqreturn_t ixgbe_msix_pba(int irq, void *data) ++{ ++ struct net_device *netdev = data; ++ struct ixgbe_adapter *adapter = netdev_priv(netdev); ++ int i; ++ ++ u32 pba = readl(adapter->msix_addr + IXGBE_MSIXPBA); ++ for (i = 0; i < MAX_MSIX_COUNT; i++) { ++ if (pba & (1 << i)) ++ adapter->msix_handlers[i](irq, data, regs); ++ else ++ adapter->pba_zero[i]++; ++ } ++ ++ adapter->msix_pba++; ++ return IRQ_HANDLED; ++} ++ ++static irqreturn_t ixgbe_msix_tcp_timer(int irq, void *data) ++{ ++ struct net_device *netdev = data; ++ struct ixgbe_adapter *adapter = netdev_priv(netdev); ++ ++ adapter->msix_tcp_timer++; ++ ++ return IRQ_HANDLED; ++} ++ ++#endif /* IXGBE_TCP_TIMER */ ++static inline void ixgbe_irq_enable_queues(struct ixgbe_adapter *adapter, ++ u64 qmask) ++{ ++ u32 mask; ++ ++ if (adapter->hw.mac.type == ixgbe_mac_82598EB) { ++ mask = (IXGBE_EIMS_RTX_QUEUE & qmask); ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMS, mask); ++ } else { ++ mask = (qmask & 0xFFFFFFFF); ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMS_EX(0), mask); ++ mask = (qmask >> 32); ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMS_EX(1), mask); ++ } ++ /* skip the flush */ ++} ++ ++static inline void ixgbe_irq_disable_queues(struct ixgbe_adapter *adapter, ++ u64 qmask) ++{ ++ u32 mask; ++ ++ if (adapter->hw.mac.type == ixgbe_mac_82598EB) { ++ mask = (IXGBE_EIMS_RTX_QUEUE & qmask); ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, mask); ++ } else { ++ mask = (qmask & 0xFFFFFFFF); ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC_EX(0), mask); ++ mask = (qmask >> 32); ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC_EX(1), mask); ++ } ++ /* skip the flush */ + } + + static irqreturn_t ixgbe_msix_clean_tx(int irq, void *data) +@@ -972,16 +1685,30 @@ + r_idx = find_first_bit(q_vector->txr_idx, adapter->num_tx_queues); + for (i = 0; i < q_vector->txr_count; i++) { + tx_ring = &(adapter->tx_ring[r_idx]); ++ tx_ring->total_bytes = 0; ++ tx_ring->total_packets = 0; ++#ifndef CONFIG_IXGBE_NAPI ++ ixgbe_clean_tx_irq(q_vector, tx_ring); + #if defined(CONFIG_DCA) || defined(CONFIG_DCA_MODULE) + if (adapter->flags & IXGBE_FLAG_DCA_ENABLED) + ixgbe_update_tx_dca(adapter, tx_ring); + #endif +- tx_ring->total_bytes = 0; +- tx_ring->total_packets = 0; +- ixgbe_clean_tx_irq(adapter, tx_ring); ++#endif + r_idx = find_next_bit(q_vector->txr_idx, adapter->num_tx_queues, + r_idx + 1); + } ++ ++#ifdef CONFIG_IXGBE_NAPI ++ /* disable interrupts on this vector only */ ++ ixgbe_irq_disable_queues(adapter, ((u64)1 << q_vector->v_idx)); ++ napi_schedule(&q_vector->napi); ++#endif ++ /* ++ * possibly later we can enable tx auto-adjustment if necessary ++ * ++ if (adapter->itr_setting & 1) ++ ixgbe_set_itr_msix(q_vector); ++ */ + + return IRQ_HANDLED; + } +@@ -1000,10 +1727,25 @@ + int i; + + r_idx = find_first_bit(q_vector->rxr_idx, adapter->num_rx_queues); +- for (i = 0; i < q_vector->rxr_count; i++) { ++ for (i = 0; i < q_vector->rxr_count; i++) { + rx_ring = &(adapter->rx_ring[r_idx]); + rx_ring->total_bytes = 0; + rx_ring->total_packets = 0; ++#ifndef CONFIG_IXGBE_NAPI ++ ixgbe_clean_rx_irq(q_vector, rx_ring); ++ ++#if defined(CONFIG_DCA) || defined(CONFIG_DCA_MODULE) ++ if (adapter->flags & IXGBE_FLAG_DCA_ENABLED) ++ ixgbe_update_rx_dca(adapter, rx_ring); ++ ++#endif ++ r_idx = find_next_bit(q_vector->rxr_idx, adapter->num_rx_queues, ++ r_idx + 1); ++ } ++ ++ if (adapter->itr_setting & 1) ++ ixgbe_set_itr_msix(q_vector); ++#else + r_idx = find_next_bit(q_vector->rxr_idx, adapter->num_rx_queues, + r_idx + 1); + } +@@ -1011,23 +1753,74 @@ + if (!q_vector->rxr_count) + return IRQ_HANDLED; + ++ /* disable interrupts on this vector only */ ++ ixgbe_irq_disable_queues(adapter, ((u64)1 << q_vector->v_idx)); ++ napi_schedule(&q_vector->napi); ++#endif ++ ++ return IRQ_HANDLED; ++} ++ ++static irqreturn_t ixgbe_msix_clean_many(int irq, void *data) ++{ ++ struct ixgbe_q_vector *q_vector = data; ++ struct ixgbe_adapter *adapter = q_vector->adapter; ++ struct ixgbe_ring *ring; ++ int r_idx; ++ int i; ++ ++ if (!q_vector->txr_count && !q_vector->rxr_count) ++ return IRQ_HANDLED; ++ ++ r_idx = find_first_bit(q_vector->txr_idx, adapter->num_tx_queues); ++ for (i = 0; i < q_vector->txr_count; i++) { ++ ring = &(adapter->tx_ring[r_idx]); ++ ring->total_bytes = 0; ++ ring->total_packets = 0; ++#ifndef CONFIG_IXGBE_NAPI ++ ixgbe_clean_tx_irq(q_vector, ring); ++#if defined(CONFIG_DCA) || defined(CONFIG_DCA_MODULE) ++ if (adapter->flags & IXGBE_FLAG_DCA_ENABLED) ++ ixgbe_update_tx_dca(adapter, ring); ++#endif ++#endif ++ r_idx = find_next_bit(q_vector->txr_idx, adapter->num_tx_queues, ++ r_idx + 1); ++ } ++ + r_idx = find_first_bit(q_vector->rxr_idx, adapter->num_rx_queues); +- rx_ring = &(adapter->rx_ring[r_idx]); ++ for (i = 0; i < q_vector->rxr_count; i++) { ++ ring = &(adapter->rx_ring[r_idx]); ++ ring->total_bytes = 0; ++ ring->total_packets = 0; ++#ifndef CONFIG_IXGBE_NAPI ++ ixgbe_clean_rx_irq(q_vector, ring); ++ ++#if defined(CONFIG_DCA) || defined(CONFIG_DCA_MODULE) ++ if (adapter->flags & IXGBE_FLAG_DCA_ENABLED) ++ ixgbe_update_rx_dca(adapter, ring); ++ ++#endif ++ r_idx = find_next_bit(q_vector->rxr_idx, adapter->num_rx_queues, ++ r_idx + 1); ++ } ++ ++ if (adapter->itr_setting & 1) ++ ixgbe_set_itr_msix(q_vector); ++#else ++ r_idx = find_next_bit(q_vector->rxr_idx, adapter->num_rx_queues, ++ r_idx + 1); ++ } ++ + /* disable interrupts on this vector only */ +- IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, rx_ring->v_idx); +- netif_rx_schedule(adapter->netdev, &q_vector->napi); ++ ixgbe_irq_disable_queues(adapter, ((u64)1 << q_vector->v_idx)); ++ napi_schedule(&q_vector->napi); ++#endif + + return IRQ_HANDLED; + } + +-static irqreturn_t ixgbe_msix_clean_many(int irq, void *data) +-{ +- ixgbe_msix_clean_rx(irq, data); +- ixgbe_msix_clean_tx(irq, data); +- +- return IRQ_HANDLED; +-} +- ++#ifdef CONFIG_IXGBE_NAPI + /** + * ixgbe_clean_rxonly - msix (aka one shot) rx clean routine + * @napi: napi struct with our devices info in it +@@ -1052,37 +1845,54 @@ + ixgbe_update_rx_dca(adapter, rx_ring); + #endif + +- ixgbe_clean_rx_irq(adapter, rx_ring, &work_done, budget); +- ++ ixgbe_clean_rx_irq(q_vector, rx_ring, &work_done, budget); ++ ++#ifndef HAVE_NETDEV_NAPI_LIST ++ if (!netif_running(adapter->netdev)) ++ work_done = 0; ++ ++#endif + /* If all Rx work done, exit the polling mode */ + if (work_done < budget) { +- netif_rx_complete(adapter->netdev, napi); +- if (adapter->itr_setting & 3) ++ napi_complete(napi); ++ if (adapter->itr_setting & 1) + ixgbe_set_itr_msix(q_vector); + if (!test_bit(__IXGBE_DOWN, &adapter->state)) +- IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMS, rx_ring->v_idx); ++ ixgbe_irq_enable_queues(adapter, ((u64)1 << q_vector->v_idx)); + } + + return work_done; + } + + /** +- * ixgbe_clean_rxonly_many - msix (aka one shot) rx clean routine ++ * ixgbe_clean_rxtx_many - msix (aka one shot) rx clean routine + * @napi: napi struct with our devices info in it + * @budget: amount of work driver is allowed to do this pass, in packets + * + * This function will clean more than one rx queue associated with a + * q_vector. + **/ +-static int ixgbe_clean_rxonly_many(struct napi_struct *napi, int budget) ++static int ixgbe_clean_rxtx_many(struct napi_struct *napi, int budget) + { + struct ixgbe_q_vector *q_vector = + container_of(napi, struct ixgbe_q_vector, napi); + struct ixgbe_adapter *adapter = q_vector->adapter; +- struct ixgbe_ring *rx_ring = NULL; ++ struct ixgbe_ring *ring = NULL; + int work_done = 0, i; + long r_idx; +- u16 enable_mask = 0; ++ bool tx_clean_complete = true; ++ ++ r_idx = find_first_bit(q_vector->txr_idx, adapter->num_tx_queues); ++ for (i = 0; i < q_vector->txr_count; i++) { ++ ring = &(adapter->tx_ring[r_idx]); ++#if defined(CONFIG_DCA) || defined(CONFIG_DCA_MODULE) ++ if (adapter->flags & IXGBE_FLAG_DCA_ENABLED) ++ ixgbe_update_tx_dca(adapter, ring); ++#endif ++ tx_clean_complete &= ixgbe_clean_tx_irq(q_vector, ring); ++ r_idx = find_next_bit(q_vector->txr_idx, adapter->num_tx_queues, ++ r_idx + 1); ++ } + + /* attempt to distribute budget to each queue fairly, but don't allow + * the budget to go below 1 because we'll exit polling */ +@@ -1090,53 +1900,102 @@ + budget = max(budget, 1); + r_idx = find_first_bit(q_vector->rxr_idx, adapter->num_rx_queues); + for (i = 0; i < q_vector->rxr_count; i++) { +- rx_ring = &(adapter->rx_ring[r_idx]); ++ ring = &(adapter->rx_ring[r_idx]); + #if defined(CONFIG_DCA) || defined(CONFIG_DCA_MODULE) + if (adapter->flags & IXGBE_FLAG_DCA_ENABLED) +- ixgbe_update_rx_dca(adapter, rx_ring); +-#endif +- ixgbe_clean_rx_irq(adapter, rx_ring, &work_done, budget); +- enable_mask |= rx_ring->v_idx; ++ ixgbe_update_rx_dca(adapter, ring); ++#endif ++ ixgbe_clean_rx_irq(q_vector, ring, &work_done, budget); + r_idx = find_next_bit(q_vector->rxr_idx, adapter->num_rx_queues, + r_idx + 1); + } + +- r_idx = find_first_bit(q_vector->rxr_idx, adapter->num_rx_queues); +- rx_ring = &(adapter->rx_ring[r_idx]); ++ if (!tx_clean_complete) ++ work_done = budget; ++ ++#ifndef HAVE_NETDEV_NAPI_LIST ++ if (!netif_running(adapter->netdev)) ++ work_done = 0; ++ ++#endif + /* If all Rx work done, exit the polling mode */ + if (work_done < budget) { +- netif_rx_complete(adapter->netdev, napi); +- if (adapter->itr_setting & 3) ++ napi_complete(napi); ++ if (adapter->itr_setting & 1) + ixgbe_set_itr_msix(q_vector); + if (!test_bit(__IXGBE_DOWN, &adapter->state)) +- IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMS, enable_mask); +- return 0; ++ ixgbe_irq_enable_queues(adapter, ((u64)1 << q_vector->v_idx)); + } + + return work_done; + } ++ ++/** ++ * ixgbe_clean_txonly - msix (aka one shot) tx clean routine ++ * @napi: napi struct with our devices info in it ++ * @budget: amount of work driver is allowed to do this pass, in packets ++ * ++ * This function is optimized for cleaning one queue only on a single ++ * q_vector!!! ++ **/ ++static int ixgbe_clean_txonly(struct napi_struct *napi, int budget) ++{ ++ struct ixgbe_q_vector *q_vector = ++ container_of(napi, struct ixgbe_q_vector, napi); ++ struct ixgbe_adapter *adapter = q_vector->adapter; ++ struct ixgbe_ring *tx_ring = NULL; ++ int work_done = 0; ++ long r_idx; ++ ++ r_idx = find_first_bit(q_vector->txr_idx, adapter->num_tx_queues); ++ tx_ring = &(adapter->tx_ring[r_idx]); ++#if defined(CONFIG_DCA) || defined(CONFIG_DCA_MODULE) ++ if (adapter->flags & IXGBE_FLAG_DCA_ENABLED) ++ ixgbe_update_tx_dca(adapter, tx_ring); ++#endif ++ ++ if (!ixgbe_clean_tx_irq(q_vector, tx_ring)) ++ work_done = budget; ++ ++#ifndef HAVE_NETDEV_NAPI_LIST ++ if (!netif_running(adapter->netdev)) ++ work_done = 0; ++ ++#endif ++ /* If all Rx work done, exit the polling mode */ ++ if (work_done < budget) { ++ napi_complete(napi); ++ if (adapter->itr_setting & 1) ++ ixgbe_set_itr_msix(q_vector); ++ if (!test_bit(__IXGBE_DOWN, &adapter->state)) ++ ixgbe_irq_enable_queues(adapter, ((u64)1 << q_vector->v_idx)); ++ } ++ ++ return work_done; ++} ++ ++#endif /* CONFIG_IXGBE_NAPI */ + static inline void map_vector_to_rxq(struct ixgbe_adapter *a, int v_idx, + int r_idx) + { +- a->q_vector[v_idx].adapter = a; +- set_bit(r_idx, a->q_vector[v_idx].rxr_idx); +- a->q_vector[v_idx].rxr_count++; +- a->rx_ring[r_idx].v_idx = 1 << v_idx; ++ struct ixgbe_q_vector *q_vector = a->q_vector[v_idx]; ++ ++ set_bit(r_idx, q_vector->rxr_idx); ++ q_vector->rxr_count++; + } + + static inline void map_vector_to_txq(struct ixgbe_adapter *a, int v_idx, +- int r_idx) +-{ +- a->q_vector[v_idx].adapter = a; +- set_bit(r_idx, a->q_vector[v_idx].txr_idx); +- a->q_vector[v_idx].txr_count++; +- a->tx_ring[r_idx].v_idx = 1 << v_idx; ++ int t_idx) ++{ ++ struct ixgbe_q_vector *q_vector = a->q_vector[v_idx]; ++ ++ set_bit(t_idx, q_vector->txr_idx); ++ q_vector->txr_count++; + } + + /** + * ixgbe_map_rings_to_vectors - Maps descriptor rings to vectors + * @adapter: board private structure to initialize +- * @vectors: allotted vector count for descriptor rings + * + * This function maps descriptor rings to the queue-specific vectors + * we were allotted through the MSI-X enabling code. Ideally, we'd have +@@ -1144,9 +2003,9 @@ + * group the rings as "efficiently" as possible. You would add new + * mapping configurations in here. + **/ +-static int ixgbe_map_rings_to_vectors(struct ixgbe_adapter *adapter, +- int vectors) +-{ ++static int ixgbe_map_rings_to_vectors(struct ixgbe_adapter *adapter) ++{ ++ int q_vectors; + int v_start = 0; + int rxr_idx = 0, txr_idx = 0; + int rxr_remaining = adapter->num_rx_queues; +@@ -1159,17 +2018,18 @@ + if (!(adapter->flags & IXGBE_FLAG_MSIX_ENABLED)) + goto out; + ++ q_vectors = adapter->num_msix_vectors - NON_Q_VECTORS; ++ + /* + * The ideal configuration... + * We have enough vectors to map one per queue. + */ +- if (vectors == adapter->num_rx_queues + adapter->num_tx_queues) { ++ if (q_vectors == adapter->num_rx_queues + adapter->num_tx_queues) { + for (; rxr_idx < rxr_remaining; v_start++, rxr_idx++) + map_vector_to_rxq(adapter, v_start, rxr_idx); + + for (; txr_idx < txr_remaining; v_start++, txr_idx++) + map_vector_to_txq(adapter, v_start, txr_idx); +- + goto out; + } + +@@ -1179,16 +2039,16 @@ + * multiple queues per vector. + */ + /* Re-adjusting *qpv takes care of the remainder. */ +- for (i = v_start; i < vectors; i++) { +- rqpv = DIV_ROUND_UP(rxr_remaining, vectors - i); ++ for (i = v_start; i < q_vectors; i++) { ++ rqpv = DIV_ROUND_UP(rxr_remaining, q_vectors - i); + for (j = 0; j < rqpv; j++) { + map_vector_to_rxq(adapter, i, rxr_idx); + rxr_idx++; + rxr_remaining--; + } + } +- for (i = v_start; i < vectors; i++) { +- tqpv = DIV_ROUND_UP(txr_remaining, vectors - i); ++ for (i = v_start; i < q_vectors; i++) { ++ tqpv = DIV_ROUND_UP(txr_remaining, q_vectors - i); + for (j = 0; j < tqpv; j++) { + map_vector_to_txq(adapter, i, txr_idx); + txr_idx++; +@@ -1212,27 +2072,36 @@ + struct net_device *netdev = adapter->netdev; + irqreturn_t (*handler)(int, void *); + int i, vector, q_vectors, err; ++ int ri = 0, ti = 0; + + /* Decrement for Other and TCP Timer vectors */ + q_vectors = adapter->num_msix_vectors - NON_Q_VECTORS; + +- /* Map the Tx/Rx rings to the vectors we were allotted. */ +- err = ixgbe_map_rings_to_vectors(adapter, q_vectors); +- if (err) +- goto out; +- +-#define SET_HANDLER(_v) ((!(_v)->rxr_count) ? &ixgbe_msix_clean_tx : \ +- (!(_v)->txr_count) ? &ixgbe_msix_clean_rx : \ +- &ixgbe_msix_clean_many) ++#define SET_HANDLER(_v) (((_v)->rxr_count && (_v)->txr_count) \ ++ ? &ixgbe_msix_clean_many : \ ++ (_v)->rxr_count ? &ixgbe_msix_clean_rx : \ ++ (_v)->txr_count ? &ixgbe_msix_clean_tx : \ ++ NULL) + for (vector = 0; vector < q_vectors; vector++) { +- handler = SET_HANDLER(&adapter->q_vector[vector]); +- sprintf(adapter->name[vector], "%s:v%d-%s", +- netdev->name, vector, +- (handler == &ixgbe_msix_clean_rx) ? "Rx" : +- ((handler == &ixgbe_msix_clean_tx) ? "Tx" : "TxRx")); ++ struct ixgbe_q_vector *q_vector = adapter->q_vector[vector]; ++ handler = SET_HANDLER(q_vector); ++ ++ if (handler == &ixgbe_msix_clean_rx) { ++ sprintf(q_vector->name, "%s-%s-%d", ++ netdev->name, "rx", ri++); ++ } else if (handler == &ixgbe_msix_clean_tx) { ++ sprintf(q_vector->name, "%s-%s-%d", ++ netdev->name, "tx", ti++); ++ } else if (handler == &ixgbe_msix_clean_many) { ++ sprintf(q_vector->name, "%s-%s-%d", ++ netdev->name, "TxRx", vector); ++ } else { ++ /* skip this unused q_vector */ ++ continue; ++ } + err = request_irq(adapter->msix_entries[vector].vector, +- handler, 0, adapter->name[vector], +- &(adapter->q_vector[vector])); ++ handler, 0, q_vector->name, ++ q_vector); + if (err) { + DPRINTK(PROBE, ERR, + "request_irq failed for MSIX interrupt " +@@ -1241,33 +2110,46 @@ + } + } + +- sprintf(adapter->name[vector], "%s:lsc", netdev->name); ++ sprintf(adapter->lsc_int_name, "%s:lsc", netdev->name); + err = request_irq(adapter->msix_entries[vector].vector, +- &ixgbe_msix_lsc, 0, adapter->name[vector], netdev); ++ &ixgbe_msix_lsc, 0, adapter->lsc_int_name, netdev); + if (err) { + DPRINTK(PROBE, ERR, +- "request_irq for msix_lsc failed: %d\n", err); ++ "request_irq for msix_lsc failed: %d\n", err); + goto free_queue_irqs; + } + ++#ifdef IXGBE_TCP_TIMER ++ vector++; ++ sprintf(adapter->tcp_timer_name, "%s:timer", netdev->name); ++ err = request_irq(adapter->msix_entries[vector].vector, ++ &ixgbe_msix_tcp_timer, 0, adapter->tcp_timer_name, ++ netdev); ++ if (err) { ++ DPRINTK(PROBE, ERR, ++ "request_irq for msix_tcp_timer failed: %d\n", err); ++ /* Free "Other" interrupt */ ++ free_irq(adapter->msix_entries[--vector].vector, netdev); ++ goto free_queue_irqs; ++ } ++ ++#endif + return 0; + + free_queue_irqs: + for (i = vector - 1; i >= 0; i--) + free_irq(adapter->msix_entries[--vector].vector, +- &(adapter->q_vector[i])); ++ adapter->q_vector[i]); + adapter->flags &= ~IXGBE_FLAG_MSIX_ENABLED; + pci_disable_msix(adapter->pdev); + kfree(adapter->msix_entries); + adapter->msix_entries = NULL; +-out: + return err; + } + + static void ixgbe_set_itr(struct ixgbe_adapter *adapter) + { +- struct ixgbe_hw *hw = &adapter->hw; +- struct ixgbe_q_vector *q_vector = adapter->q_vector; ++ struct ixgbe_q_vector *q_vector = adapter->q_vector[0]; + u8 current_itr; + u32 new_itr = q_vector->eitr; + struct ixgbe_ring *rx_ring = &adapter->rx_ring[0]; +@@ -1300,58 +2182,135 @@ + } + + if (new_itr != q_vector->eitr) { +- u32 itr_reg; ++ + /* do an exponential smoothing */ + new_itr = ((q_vector->eitr * 90)/100) + ((new_itr * 10)/100); ++ ++ /* save the algorithm value here */ + q_vector->eitr = new_itr; +- itr_reg = EITR_INTS_PER_SEC_TO_REG(new_itr); +- /* must write high and low 16 bits to reset counter */ +- IXGBE_WRITE_REG(hw, IXGBE_EITR(0), itr_reg | (itr_reg)<<16); ++ ++ ixgbe_write_eitr(q_vector); + } + + return; + } + +-static inline void ixgbe_irq_enable(struct ixgbe_adapter *adapter); ++/** ++ * ixgbe_irq_enable - Enable default interrupt generation settings ++ * @adapter: board private structure ++ **/ ++static inline void ixgbe_irq_enable(struct ixgbe_adapter *adapter, bool queues, bool flush) ++{ ++ u32 mask; ++ u64 qmask; ++ ++ mask = (IXGBE_EIMS_ENABLE_MASK & ~IXGBE_EIMS_RTX_QUEUE); ++ qmask = ~0; ++ ++ /* don't reenable LSC while waiting for link */ ++ if (adapter->flags & IXGBE_FLAG_NEED_LINK_UPDATE) ++ mask &= ~IXGBE_EIMS_LSC; ++ if (adapter->flags & IXGBE_FLAG_FAN_FAIL_CAPABLE) ++ mask |= IXGBE_EIMS_GPI_SDP1; ++ if (adapter->hw.mac.type == ixgbe_mac_82599EB) { ++ mask |= IXGBE_EIMS_ECC; ++ mask |= IXGBE_EIMS_GPI_SDP1; ++ mask |= IXGBE_EIMS_GPI_SDP2; ++ } ++ if (adapter->flags & IXGBE_FLAG_FDIR_HASH_CAPABLE || ++ adapter->flags & IXGBE_FLAG_FDIR_PERFECT_CAPABLE) ++ mask |= IXGBE_EIMS_FLOW_DIR; ++ ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMS, mask); ++ if (queues) ++ ixgbe_irq_enable_queues(adapter, qmask); ++ if (flush) ++ IXGBE_WRITE_FLUSH(&adapter->hw); ++} + + /** + * ixgbe_intr - legacy mode Interrupt Handler + * @irq: interrupt number + * @data: pointer to a network interface device structure +- * @pt_regs: CPU registers structure + **/ + static irqreturn_t ixgbe_intr(int irq, void *data) + { + struct net_device *netdev = data; + struct ixgbe_adapter *adapter = netdev_priv(netdev); + struct ixgbe_hw *hw = &adapter->hw; ++ struct ixgbe_q_vector *q_vector = adapter->q_vector[0]; + u32 eicr; ++ ++ /* ++ * Workaround of Silicon errata on 82598. Mask the interrupt ++ * before the read of EICR. ++ */ ++ IXGBE_WRITE_REG(hw, IXGBE_EIMC, IXGBE_IRQ_CLEAR_MASK); + + /* for NAPI, using EIAM to auto-mask tx/rx interrupt bits on read + * therefore no explict interrupt disable is necessary */ + eicr = IXGBE_READ_REG(hw, IXGBE_EICR); + if (!eicr) { +- /* shared interrupt alert! ++ /* ++ * shared interrupt alert! + * make sure interrupts are enabled because the read will +- * have disabled interrupts due to EIAM */ +- ixgbe_irq_enable(adapter); +- return IRQ_NONE; /* Not our interrupt */ ++ * have disabled interrupts due to EIAM ++ * finish the workaround of silicon errata on 82598. Unmask ++ * the interrupt that we masked before the EICR read. ++ */ ++ if (!test_bit(__IXGBE_DOWN, &adapter->state)) ++ ixgbe_irq_enable(adapter, true, true); ++ return IRQ_NONE; /* Not our interrupt */ + } + + if (eicr & IXGBE_EICR_LSC) + ixgbe_check_lsc(adapter); + ++ if (hw->mac.type == ixgbe_mac_82599EB) { ++ if (eicr & IXGBE_EICR_ECC) ++ DPRINTK(LINK, INFO, "Received unrecoverable ECC Err, " ++ "please reboot\n"); ++ ixgbe_check_sfp_event(adapter, eicr); ++ } ++ + ixgbe_check_fan_failure(adapter, eicr); + +- if (netif_rx_schedule_prep(netdev, &adapter->q_vector[0].napi)) { ++#ifdef CONFIG_IXGBE_NAPI ++ if (napi_schedule_prep(&(q_vector->napi))) { + adapter->tx_ring[0].total_packets = 0; + adapter->tx_ring[0].total_bytes = 0; + adapter->rx_ring[0].total_packets = 0; + adapter->rx_ring[0].total_bytes = 0; + /* would disable interrupts here but EIAM disabled it */ +- __netif_rx_schedule(netdev, &adapter->q_vector[0].napi); +- } +- ++ __napi_schedule(&(q_vector->napi)); ++ } ++ ++ /* ++ * re-enable link(maybe) and non-queue interrupts, no flush. ++ * ixgbe_poll will re-enable the queue interrupts ++ */ ++ if (!test_bit(__IXGBE_DOWN, &adapter->state)) ++ ixgbe_irq_enable(adapter, false, false); ++#else ++ adapter->tx_ring[0].total_packets = 0; ++ adapter->tx_ring[0].total_bytes = 0; ++ adapter->rx_ring[0].total_packets = 0; ++ adapter->rx_ring[0].total_bytes = 0; ++ ixgbe_clean_tx_irq(q_vector, adapter->tx_ring); ++ ixgbe_clean_rx_irq(q_vector, adapter->rx_ring); ++ ++ /* dynamically adjust throttle */ ++ if (adapter->itr_setting & 1) ++ ixgbe_set_itr(adapter); ++ ++ /* ++ * Workaround of Silicon errata on 82598. Unmask ++ * the interrupt that we masked before the EICR read ++ * no flush of the re-enable is necessary here ++ */ ++ if (!test_bit(__IXGBE_DOWN, &adapter->state)) ++ ixgbe_irq_enable(adapter, true, false); ++#endif + return IRQ_HANDLED; + } + +@@ -1360,11 +2319,12 @@ + int i, q_vectors = adapter->num_msix_vectors - NON_Q_VECTORS; + + for (i = 0; i < q_vectors; i++) { +- struct ixgbe_q_vector *q_vector = &adapter->q_vector[i]; ++ struct ixgbe_q_vector *q_vector = adapter->q_vector[i]; + bitmap_zero(q_vector->rxr_idx, MAX_RX_QUEUES); + bitmap_zero(q_vector->txr_idx, MAX_TX_QUEUES); + q_vector->rxr_count = 0; + q_vector->txr_count = 0; ++ q_vector->eitr = adapter->eitr_param; + } + } + +@@ -1406,12 +2366,16 @@ + q_vectors = adapter->num_msix_vectors; + + i = q_vectors - 1; ++#ifdef IXGBE_TCP_TIMER + free_irq(adapter->msix_entries[i].vector, netdev); +- + i--; ++#endif ++ free_irq(adapter->msix_entries[i].vector, netdev); ++ i--; ++ + for (; i >= 0; i--) { + free_irq(adapter->msix_entries[i].vector, +- &(adapter->q_vector[i])); ++ adapter->q_vector[i]); + } + + ixgbe_reset_q_vectors(adapter); +@@ -1426,7 +2390,13 @@ + **/ + static inline void ixgbe_irq_disable(struct ixgbe_adapter *adapter) + { +- IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, ~0); ++ if (adapter->hw.mac.type == ixgbe_mac_82598EB) { ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, ~0); ++ } else { ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, 0xFFFF0000); ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC_EX(0), ~0); ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC_EX(1), ~0); ++ } + IXGBE_WRITE_FLUSH(&adapter->hw); + if (adapter->flags & IXGBE_FLAG_MSIX_ENABLED) { + int i; +@@ -1438,20 +2408,6 @@ + } + + /** +- * ixgbe_irq_enable - Enable default interrupt generation settings +- * @adapter: board private structure +- **/ +-static inline void ixgbe_irq_enable(struct ixgbe_adapter *adapter) +-{ +- u32 mask; +- mask = IXGBE_EIMS_ENABLE_MASK; +- if (adapter->flags & IXGBE_FLAG_FAN_FAIL_CAPABLE) +- mask |= IXGBE_EIMS_GPI_SDP1; +- IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMS, mask); +- IXGBE_WRITE_FLUSH(&adapter->hw); +-} +- +-/** + * ixgbe_configure_msi_and_legacy - Initialize PIN (INTA...) and MSI interrupts + * + **/ +@@ -1462,8 +2418,8 @@ + IXGBE_WRITE_REG(hw, IXGBE_EITR(0), + EITR_INTS_PER_SEC_TO_REG(adapter->eitr_param)); + +- ixgbe_set_ivar(adapter, IXGBE_IVAR_RX_QUEUE(0), 0); +- ixgbe_set_ivar(adapter, IXGBE_IVAR_TX_QUEUE(0), 0); ++ ixgbe_set_ivar(adapter, 0, 0, 0); ++ ixgbe_set_ivar(adapter, 1, 0, 0); + + map_vector_to_rxq(adapter, 0, 0); + map_vector_to_txq(adapter, 0, 0); +@@ -1479,7 +2435,7 @@ + **/ + static void ixgbe_configure_tx(struct ixgbe_adapter *adapter) + { +- u64 tdba, tdwba; ++ u64 tdba; + struct ixgbe_hw *hw = &adapter->hw; + u32 i, j, tdlen, txctrl; + +@@ -1492,11 +2448,6 @@ + IXGBE_WRITE_REG(hw, IXGBE_TDBAL(j), + (tdba & DMA_32BIT_MASK)); + IXGBE_WRITE_REG(hw, IXGBE_TDBAH(j), (tdba >> 32)); +- tdwba = ring->dma + +- (ring->count * sizeof(union ixgbe_adv_tx_desc)); +- tdwba |= IXGBE_TDWBAL_HEAD_WB_ENABLE; +- IXGBE_WRITE_REG(hw, IXGBE_TDWBAL(j), tdwba & DMA_32BIT_MASK); +- IXGBE_WRITE_REG(hw, IXGBE_TDWBAH(j), (tdwba >> 32)); + IXGBE_WRITE_REG(hw, IXGBE_TDLEN(j), tdlen); + IXGBE_WRITE_REG(hw, IXGBE_TDH(j), 0); + IXGBE_WRITE_REG(hw, IXGBE_TDT(j), 0); +@@ -1509,6 +2460,39 @@ + txctrl &= ~IXGBE_DCA_TXCTRL_TX_WB_RO_EN; + IXGBE_WRITE_REG(hw, IXGBE_DCA_TXCTRL(j), txctrl); + } ++ ++ if (hw->mac.type == ixgbe_mac_82599EB) { ++ u32 rttdcs; ++ ++ /* disable the arbiter while setting MTQC */ ++ rttdcs = IXGBE_READ_REG(hw, IXGBE_RTTDCS); ++ rttdcs |= IXGBE_RTTDCS_ARBDIS; ++ IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, rttdcs); ++ ++ /* set transmit pool layout */ ++ switch (adapter->flags & ++ (IXGBE_FLAG_VMDQ_ENABLED | IXGBE_FLAG_DCB_ENABLED)) ++ { ++ ++ case (IXGBE_FLAG_VMDQ_ENABLED): ++ IXGBE_WRITE_REG(hw, IXGBE_MTQC, ++ (IXGBE_MTQC_VT_ENA | IXGBE_MTQC_64VF)); ++ break; ++ ++ case (IXGBE_FLAG_DCB_ENABLED): ++ IXGBE_WRITE_REG(hw, IXGBE_MTQC, ++ (IXGBE_MTQC_RT_ENA | IXGBE_MTQC_8TC_8TQ)); ++ break; ++ ++ default: ++ IXGBE_WRITE_REG(hw, IXGBE_MTQC, IXGBE_MTQC_64Q_1PB); ++ break; ++ } ++ ++ /* re-eable the arbiter */ ++ rttdcs &= ~IXGBE_RTTDCS_ARBDIS; ++ IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, rttdcs); ++ } + } + + #define IXGBE_SRRCTL_BSIZEHDRSIZE_SHIFT 2 +@@ -1517,15 +2501,42 @@ + { + struct ixgbe_ring *rx_ring; + u32 srrctl; +- int queue0; ++ int queue0 = 0; + unsigned long mask; +- +- /* we must program one srrctl register per RSS queue since we +- * have enabled RDRXCTL.MVMEN +- */ +- mask = (unsigned long)adapter->ring_feature[RING_F_RSS].mask; +- queue0 = index & mask; +- index = index & mask; ++ struct ixgbe_ring_feature *feature = adapter->ring_feature; ++ ++ if (adapter->hw.mac.type == ixgbe_mac_82599EB) { ++ if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) { ++ int dcb_i = feature[RING_F_DCB].indices; ++ if (dcb_i == 8) ++ queue0 = index >> 4; ++ else if (dcb_i == 4) ++ queue0 = index >> 5; ++ else ++ DPRINTK(PROBE, ERR, "Invalid DCB configuration"); ++ } else { ++ queue0 = index; ++ } ++ } else { ++ /* program one srrctl register per VMDq index */ ++ if (adapter->flags & IXGBE_FLAG_VMDQ_ENABLED) { ++ long shift, len; ++ mask = (unsigned long) feature[RING_F_VMDQ].mask; ++ len = sizeof(feature[RING_F_VMDQ].mask) * 8; ++ shift = find_first_bit(&mask, len); ++ queue0 = (index & mask); ++ index = (index & mask) >> shift; ++ } else { ++ /* ++ * if VMDq is not active we must program one srrctl ++ * register per RSS queue since we have enabled ++ * RDRXCTL.MVMEN ++ */ ++ mask = (unsigned long) feature[RING_F_RSS].mask; ++ queue0 = index & mask; ++ index = index & mask; ++ } ++ } + + rx_ring = &adapter->rx_ring[queue0]; + +@@ -1534,63 +2545,62 @@ + srrctl &= ~IXGBE_SRRCTL_BSIZEHDR_MASK; + srrctl &= ~IXGBE_SRRCTL_BSIZEPKT_MASK; + ++ srrctl |= (IXGBE_RX_HDR_SIZE << IXGBE_SRRCTL_BSIZEHDRSIZE_SHIFT) & ++ IXGBE_SRRCTL_BSIZEHDR_MASK; ++ + if (adapter->flags & IXGBE_FLAG_RX_PS_ENABLED) { +- u16 bufsz = IXGBE_RXBUFFER_2048; +- /* grow the amount we can receive on large page machines */ +- if (bufsz < (PAGE_SIZE / 2)) +- bufsz = (PAGE_SIZE / 2); +- /* cap the bufsz at our largest descriptor size */ +- bufsz = min((u16)IXGBE_MAX_RXBUFFER, bufsz); +- +- srrctl |= bufsz >> IXGBE_SRRCTL_BSIZEPKT_SHIFT; ++#if (PAGE_SIZE / 2) > IXGBE_MAX_RXBUFFER ++ srrctl |= IXGBE_MAX_RXBUFFER >> IXGBE_SRRCTL_BSIZEPKT_SHIFT; ++#else ++ srrctl |= (PAGE_SIZE / 2) >> IXGBE_SRRCTL_BSIZEPKT_SHIFT; ++#endif + srrctl |= IXGBE_SRRCTL_DESCTYPE_HDR_SPLIT_ALWAYS; +- srrctl |= ((IXGBE_RX_HDR_SIZE << +- IXGBE_SRRCTL_BSIZEHDRSIZE_SHIFT) & +- IXGBE_SRRCTL_BSIZEHDR_MASK); +- } else { ++ } else { ++ srrctl |= ALIGN(rx_ring->rx_buf_len, 1024) >> ++ IXGBE_SRRCTL_BSIZEPKT_SHIFT; + srrctl |= IXGBE_SRRCTL_DESCTYPE_ADV_ONEBUF; +- +- if (rx_ring->rx_buf_len == MAXIMUM_ETHERNET_VLAN_SIZE) +- srrctl |= IXGBE_RXBUFFER_2048 >> +- IXGBE_SRRCTL_BSIZEPKT_SHIFT; ++ } ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_SRRCTL(index), srrctl); ++} ++ ++ ++static u32 ixgbe_setup_mrqc(struct ixgbe_adapter *adapter) ++{ ++ u32 mrqc = 0; ++ int mask; ++ ++ if (!(adapter->hw.mac.type == ixgbe_mac_82599EB)) ++ return mrqc; ++ ++ mask = adapter->flags & (IXGBE_FLAG_RSS_ENABLED ++ | IXGBE_FLAG_DCB_ENABLED ++ | IXGBE_FLAG_VMDQ_ENABLED ++ ); ++ ++ switch (mask) { ++ case (IXGBE_FLAG_RSS_ENABLED): ++ mrqc = IXGBE_MRQC_RSSEN; ++ break; ++ case (IXGBE_FLAG_VMDQ_ENABLED): ++ mrqc = IXGBE_MRQC_VMDQEN; ++ break; ++ case (IXGBE_FLAG_RSS_ENABLED | IXGBE_FLAG_VMDQ_ENABLED): ++ if (adapter->ring_feature[RING_F_RSS].indices == 4) ++ mrqc = IXGBE_MRQC_VMDQRSS32EN; ++ else if (adapter->ring_feature[RING_F_RSS].indices == 2) ++ mrqc = IXGBE_MRQC_VMDQRSS64EN; + else +- srrctl |= rx_ring->rx_buf_len >> +- IXGBE_SRRCTL_BSIZEPKT_SHIFT; +- } +- IXGBE_WRITE_REG(&adapter->hw, IXGBE_SRRCTL(index), srrctl); +-} +- +-#ifdef CONFIG_IXGBE_LRO +-/** +- * ixgbe_get_skb_hdr - helper function for LRO header processing +- * @skb: pointer to sk_buff to be added to LRO packet +- * @iphdr: pointer to ip header structure +- * @tcph: pointer to tcp header structure +- * @hdr_flags: pointer to header flags +- * @priv: private data +- **/ +-static int ixgbe_get_skb_hdr(struct sk_buff *skb, void **iphdr, void **tcph, +- u64 *hdr_flags, void *priv) +-{ +- union ixgbe_adv_rx_desc *rx_desc = priv; +- +- /* Verify that this is a valid IPv4 TCP packet */ +- if (!((ixgbe_get_pkt_info(rx_desc) & IXGBE_RXDADV_PKTTYPE_IPV4) && +- (ixgbe_get_pkt_info(rx_desc) & IXGBE_RXDADV_PKTTYPE_TCP))) +- return -1; +- +- /* Set network headers */ +- skb_reset_network_header(skb); +- skb_set_transport_header(skb, ip_hdrlen(skb)); +- *iphdr = ip_hdr(skb); +- *tcph = tcp_hdr(skb); +- *hdr_flags = LRO_IPV4 | LRO_TCP; +- return 0; +-} +- +-#endif /* CONFIG_IXGBE_LRO */ +-#define PAGE_USE_COUNT(S) (((S) >> PAGE_SHIFT) + \ +- (((S) & (PAGE_SIZE - 1)) ? 1 : 0)) ++ mrqc = IXGBE_MRQC_VMDQEN; ++ break; ++ case (IXGBE_FLAG_DCB_ENABLED): ++ mrqc = IXGBE_MRQC_RT8TCEN; ++ break; ++ default: ++ break; ++ } ++ ++ return mrqc; ++} + + /** + * ixgbe_configure_rx - Configure 8259x Receive Unit after Reset +@@ -1610,19 +2620,47 @@ + 0xA54F2BEC, 0xEA49AF7C, 0xE214AD3D, 0xB855AABE, + 0x6A3E67EA, 0x14364D17, 0x3BED200D}; + u32 fctrl, hlreg0; +- u32 pages; +- u32 reta = 0, mrqc; ++ u32 reta = 0, mrqc = 0; ++ u32 vmdctl; ++ int pool; + u32 rdrxctl; ++#ifndef IXGBE_NO_HW_RSC ++ u32 rscctrl; ++#endif /* IXGBE_NO_HW_RSC */ + int rx_buf_len; + + /* Decide whether to use packet split mode or not */ +- adapter->flags |= IXGBE_FLAG_RX_PS_ENABLED; ++ if (netdev->mtu > ETH_DATA_LEN) { ++ if (adapter->flags & IXGBE_FLAG_RX_PS_CAPABLE) ++ adapter->flags |= IXGBE_FLAG_RX_PS_ENABLED; ++ else ++ adapter->flags &= ~IXGBE_FLAG_RX_PS_ENABLED; ++ } else { ++ if (adapter->flags & IXGBE_FLAG_RX_1BUF_CAPABLE) { ++ adapter->flags &= ~IXGBE_FLAG_RX_PS_ENABLED; ++ } else ++ adapter->flags |= IXGBE_FLAG_RX_PS_ENABLED; ++ } + + /* Set the RX buffer length according to the mode */ + if (adapter->flags & IXGBE_FLAG_RX_PS_ENABLED) { + rx_buf_len = IXGBE_RX_HDR_SIZE; +- } else { ++ if (hw->mac.type == ixgbe_mac_82599EB) { ++ /* PSRTYPE must be initialized in 82599 */ ++ u32 psrtype = IXGBE_PSRTYPE_TCPHDR | ++ IXGBE_PSRTYPE_UDPHDR | ++ IXGBE_PSRTYPE_IPV4HDR | ++ IXGBE_PSRTYPE_IPV6HDR | ++ IXGBE_PSRTYPE_L2HDR; ++ IXGBE_WRITE_REG(hw, IXGBE_PSRTYPE(0), psrtype); ++ } ++ } else { ++#ifndef IXGBE_NO_HW_RSC ++ if (!(adapter->flags2 & IXGBE_FLAG2_RSC_ENABLED) && ++ (netdev->mtu <= ETH_DATA_LEN)) ++#else + if (netdev->mtu <= ETH_DATA_LEN) ++#endif /* IXGBE_NO_HW_RSC */ + rx_buf_len = MAXIMUM_ETHERNET_VLAN_SIZE; + else + rx_buf_len = ALIGN(max_frame, 1024); +@@ -1631,6 +2669,7 @@ + fctrl = IXGBE_READ_REG(&adapter->hw, IXGBE_FCTRL); + fctrl |= IXGBE_FCTRL_BAM; + fctrl |= IXGBE_FCTRL_DPF; /* discard pause frames when FC enabled */ ++ fctrl |= IXGBE_FCTRL_PMCF; + IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCTRL, fctrl); + + hlreg0 = IXGBE_READ_REG(hw, IXGBE_HLREG0); +@@ -1640,15 +2679,37 @@ + hlreg0 |= IXGBE_HLREG0_JUMBOEN; + IXGBE_WRITE_REG(hw, IXGBE_HLREG0, hlreg0); + +- pages = PAGE_USE_COUNT(adapter->netdev->mtu); +- +- rdlen = adapter->rx_ring[0].count * sizeof(union ixgbe_adv_rx_desc); + /* disable receives while setting up the descriptors */ + rxctrl = IXGBE_READ_REG(hw, IXGBE_RXCTRL); + IXGBE_WRITE_REG(hw, IXGBE_RXCTRL, rxctrl & ~IXGBE_RXCTRL_RXEN); + +- /* Setup the HW Rx Head and Tail Descriptor Pointers and +- * the Base and Length of the Rx Descriptor Ring */ ++ if ((adapter->flags & IXGBE_FLAG_VMDQ_ENABLED) && ++ (hw->mac.type == ixgbe_mac_82599EB)) { ++ int pool; ++ for (pool = 0; pool < adapter->num_rx_pools; pool++) { ++ u32 vmolr; ++ ++ if (adapter->flags & IXGBE_FLAG_RSS_ENABLED) { ++ u32 psrtype = IXGBE_READ_REG(hw, IXGBE_PSRTYPE(pool)); ++ psrtype |= (adapter->num_rx_queues_per_pool << 29); ++ IXGBE_WRITE_REG(hw, IXGBE_PSRTYPE(pool), psrtype); ++ } ++ ++ /* ++ * accept untagged packets until a vlan tag ++ * is specifically set for the VMDQ queue/pool ++ */ ++ vmolr = IXGBE_READ_REG(hw, IXGBE_VMOLR(pool)); ++ vmolr |= IXGBE_VMOLR_AUPE; ++ IXGBE_WRITE_REG(hw, IXGBE_VMOLR(pool), vmolr); ++ } ++ } ++ ++ rdlen = adapter->rx_ring[0].count * sizeof(union ixgbe_adv_rx_desc); ++ /* ++ * Setup the HW Rx Head and Tail Descriptor Pointers and ++ * the Base and Length of the Rx Descriptor Ring ++ */ + for (i = 0; i < adapter->num_rx_queues; i++) { + rdba = adapter->rx_ring[i].dma; + j = adapter->rx_ring[i].reg_idx; +@@ -1660,38 +2721,49 @@ + adapter->rx_ring[i].head = IXGBE_RDH(j); + adapter->rx_ring[i].tail = IXGBE_RDT(j); + adapter->rx_ring[i].rx_buf_len = rx_buf_len; +-#ifdef CONFIG_IXGBE_LRO +- /* Intitial LRO Settings */ +- adapter->rx_ring[i].lro_mgr.max_aggr = IXGBE_MAX_LRO_AGGREGATE; +- adapter->rx_ring[i].lro_mgr.max_desc = IXGBE_MAX_LRO_DESCRIPTORS; +- adapter->rx_ring[i].lro_mgr.get_skb_header = ixgbe_get_skb_hdr; +- adapter->rx_ring[i].lro_mgr.features = LRO_F_EXTRACT_VLAN_ID; +- if (!(adapter->flags & IXGBE_FLAG_IN_NETPOLL)) +- adapter->rx_ring[i].lro_mgr.features |= LRO_F_NAPI; +- adapter->rx_ring[i].lro_mgr.dev = adapter->netdev; +- adapter->rx_ring[i].lro_mgr.ip_summed = CHECKSUM_UNNECESSARY; +- adapter->rx_ring[i].lro_mgr.ip_summed_aggr = CHECKSUM_UNNECESSARY; +-#endif + + ixgbe_configure_srrctl(adapter, j); + } + +- /* +- * For VMDq support of different descriptor types or +- * buffer sizes through the use of multiple SRRCTL +- * registers, RDRXCTL.MVMEN must be set to 1 +- * +- * also, the manual doesn't mention it clearly but DCA hints +- * will only use queue 0's tags unless this bit is set. Side +- * effects of setting this bit are only that SRRCTL must be +- * fully programmed [0..15] +- */ +- if (adapter->flags & +- (IXGBE_FLAG_RSS_ENABLED | IXGBE_FLAG_VMDQ_ENABLED)) { ++ if (hw->mac.type == ixgbe_mac_82598EB) { ++ /* ++ * For VMDq support of different descriptor types or ++ * buffer sizes through the use of multiple SRRCTL ++ * registers, RDRXCTL.MVMEN must be set to 1 ++ * ++ * also, the manual doesn't mention it clearly but DCA hints ++ * will only use queue 0's tags unless this bit is set. Side ++ * effects of setting this bit are only that SRRCTL must be ++ * fully programmed [0..15] ++ */ + rdrxctl = IXGBE_READ_REG(hw, IXGBE_RDRXCTL); + rdrxctl |= IXGBE_RDRXCTL_MVMEN; + IXGBE_WRITE_REG(hw, IXGBE_RDRXCTL, rdrxctl); + } ++ ++ if (adapter->flags & IXGBE_FLAG_VMDQ_ENABLED) { ++ u32 vt_reg; ++ u32 vt_reg_bits; ++ if (hw->mac.type == ixgbe_mac_82599EB) { ++ vt_reg = IXGBE_VT_CTL; ++ vt_reg_bits = IXGBE_VMD_CTL_VMDQ_EN ++ | IXGBE_VT_CTL_REPLEN; ++ } else { ++ vt_reg = IXGBE_VMD_CTL; ++ vt_reg_bits = IXGBE_VMD_CTL_VMDQ_EN; ++ } ++ vmdctl = IXGBE_READ_REG(hw, vt_reg); ++ IXGBE_WRITE_REG(hw, vt_reg, vmdctl | vt_reg_bits); ++ IXGBE_WRITE_REG(hw, IXGBE_MRQC, 0); ++ ++ IXGBE_WRITE_REG(hw, IXGBE_VFRE(0), 0xFFFFFFFF); ++ IXGBE_WRITE_REG(hw, IXGBE_VFRE(1), 0xFFFFFFFF); ++ IXGBE_WRITE_REG(hw, IXGBE_VFTE(0), 0xFFFFFFFF); ++ IXGBE_WRITE_REG(hw, IXGBE_VFTE(1), 0xFFFFFFFF); ++ } ++ ++ /* Program MRQC for the distribution of queues */ ++ mrqc = ixgbe_setup_mrqc(adapter); + + if (adapter->flags & IXGBE_FLAG_RSS_ENABLED) { + /* Fill out redirection table */ +@@ -1709,19 +2781,17 @@ + for (i = 0; i < 10; i++) + IXGBE_WRITE_REG(hw, IXGBE_RSSRK(i), seed[i]); + +- mrqc = IXGBE_MRQC_RSSEN ++ if (hw->mac.type == ixgbe_mac_82598EB) ++ mrqc |= IXGBE_MRQC_RSSEN; + /* Perform hash on these packet types */ +- | IXGBE_MRQC_RSS_FIELD_IPV4 +- | IXGBE_MRQC_RSS_FIELD_IPV4_TCP +- | IXGBE_MRQC_RSS_FIELD_IPV4_UDP +- | IXGBE_MRQC_RSS_FIELD_IPV6_EX_TCP +- | IXGBE_MRQC_RSS_FIELD_IPV6_EX +- | IXGBE_MRQC_RSS_FIELD_IPV6 +- | IXGBE_MRQC_RSS_FIELD_IPV6_TCP +- | IXGBE_MRQC_RSS_FIELD_IPV6_UDP +- | IXGBE_MRQC_RSS_FIELD_IPV6_EX_UDP; +- IXGBE_WRITE_REG(hw, IXGBE_MRQC, mrqc); +- } ++ mrqc |= IXGBE_MRQC_RSS_FIELD_IPV4 ++ | IXGBE_MRQC_RSS_FIELD_IPV4_TCP ++ | IXGBE_MRQC_RSS_FIELD_IPV4_UDP ++ | IXGBE_MRQC_RSS_FIELD_IPV6 ++ | IXGBE_MRQC_RSS_FIELD_IPV6_TCP ++ | IXGBE_MRQC_RSS_FIELD_IPV6_UDP; ++ } ++ IXGBE_WRITE_REG(hw, IXGBE_MRQC, mrqc); + + rxcsum = IXGBE_READ_REG(hw, IXGBE_RXCSUM); + +@@ -1738,53 +2808,148 @@ + } + + IXGBE_WRITE_REG(hw, IXGBE_RXCSUM, rxcsum); +-} +- ++ ++ if (hw->mac.type == ixgbe_mac_82599EB) { ++ rdrxctl = IXGBE_READ_REG(hw, IXGBE_RDRXCTL); ++#ifndef IXGBE_NO_HW_RSC ++ if (adapter->flags2 & IXGBE_FLAG2_RSC_ENABLED) ++ rdrxctl &= ~IXGBE_RDRXCTL_RSCFRSTSIZE; ++#endif /* IXGBE_NO_HW_RSC */ ++ rdrxctl |= IXGBE_RDRXCTL_CRCSTRIP; ++ IXGBE_WRITE_REG(hw, IXGBE_RDRXCTL, rdrxctl); ++ } ++ ++#ifndef IXGBE_NO_HW_RSC ++ if (adapter->flags2 & IXGBE_FLAG2_RSC_ENABLED) { ++ /* Enable 82599 HW RSC */ ++ for (i = 0; i < adapter->num_rx_queues; i++) { ++ j = adapter->rx_ring[i].reg_idx; ++ rscctrl = IXGBE_READ_REG(hw, IXGBE_RSCCTL(j)); ++ rscctrl |= IXGBE_RSCCTL_RSCEN; ++ /* ++ * we must limit the number of descriptors so that ++ * the total size of max desc * buf_len is not greater ++ * than 65535 ++ */ ++ if (adapter->flags & IXGBE_FLAG_RX_PS_ENABLED) { ++#if (MAX_SKB_FRAGS > 16) ++ rscctrl |= IXGBE_RSCCTL_MAXDESC_16; ++#elif (MAX_SKB_FRAGS > 8) ++ rscctrl |= IXGBE_RSCCTL_MAXDESC_8; ++#elif (MAX_SKB_FRAGS > 4) ++ rscctrl |= IXGBE_RSCCTL_MAXDESC_4; ++#else ++ rscctrl |= IXGBE_RSCCTL_MAXDESC_1; ++#endif ++ } else { ++ if (rx_buf_len < IXGBE_RXBUFFER_4096) ++ rscctrl |= IXGBE_RSCCTL_MAXDESC_16; ++ else if (rx_buf_len < IXGBE_RXBUFFER_8192) ++ rscctrl |= IXGBE_RSCCTL_MAXDESC_8; ++ else ++ rscctrl |= IXGBE_RSCCTL_MAXDESC_4; ++ } ++ ++ if (adapter->num_rx_queues_per_pool == 1) ++ pool = j / 2; ++ else ++ pool = j / adapter->num_rx_queues_per_pool; ++ ++ if (adapter->flags & IXGBE_FLAG_VMDQ_ENABLED) ++ IXGBE_WRITE_REG(hw, IXGBE_PSRTYPE(pool), ++ (IXGBE_READ_REG(hw, IXGBE_PSRTYPE(pool)) | ++ IXGBE_PSRTYPE_TCPHDR)); ++ ++ IXGBE_WRITE_REG(hw, IXGBE_RSCCTL(j), rscctrl); ++ ++ } ++ /* Enable TCP header recognition in PSRTYPE */ ++ IXGBE_WRITE_REG(hw, IXGBE_PSRTYPE(0), ++ (IXGBE_READ_REG(hw, IXGBE_PSRTYPE(0)) | ++ IXGBE_PSRTYPE_TCPHDR)); ++ ++ /* Disable RSC for ACK packets */ ++ IXGBE_WRITE_REG(hw, IXGBE_RSCDBU, ++ (IXGBE_RSCDBU_RSCACKDIS | IXGBE_READ_REG(hw, IXGBE_RSCDBU))); ++ } ++#endif /* IXGBE_NO_HW_RSC */ ++} ++ ++#ifdef NETIF_F_HW_VLAN_TX + static void ixgbe_vlan_rx_register(struct net_device *netdev, + struct vlan_group *grp) + { + struct ixgbe_adapter *adapter = netdev_priv(netdev); + u32 ctrl; ++ int i, j; + + if (!test_bit(__IXGBE_DOWN, &adapter->state)) + ixgbe_irq_disable(adapter); + adapter->vlgrp = grp; + +- /* +- * For a DCB driver, always enable VLAN tag stripping so we can +- * still receive traffic from a DCB-enabled host even if we're +- * not in DCB mode. +- */ +- ctrl = IXGBE_READ_REG(&adapter->hw, IXGBE_VLNCTRL); +- ctrl |= IXGBE_VLNCTRL_VME; +- ctrl &= ~IXGBE_VLNCTRL_CFIEN; +- IXGBE_WRITE_REG(&adapter->hw, IXGBE_VLNCTRL, ctrl); +- +- if (grp) { ++ if (adapter->hw.mac.type == ixgbe_mac_82598EB) { ++ /* always enable VLAN tag insert/strip */ ++ ctrl = IXGBE_READ_REG(&adapter->hw, IXGBE_VLNCTRL); ++ ctrl |= IXGBE_VLNCTRL_VME | IXGBE_VLNCTRL_VFE; ++ ctrl &= ~IXGBE_VLNCTRL_CFIEN; ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_VLNCTRL, ctrl); ++ } else if (adapter->hw.mac.type == ixgbe_mac_82599EB) { + /* enable VLAN tag insert/strip */ + ctrl = IXGBE_READ_REG(&adapter->hw, IXGBE_VLNCTRL); +- ctrl |= IXGBE_VLNCTRL_VME; ++ ctrl |= IXGBE_VLNCTRL_VFE; + ctrl &= ~IXGBE_VLNCTRL_CFIEN; + IXGBE_WRITE_REG(&adapter->hw, IXGBE_VLNCTRL, ctrl); ++ for (i = 0; i < adapter->num_rx_queues; i++) { ++ j = adapter->rx_ring[i].reg_idx; ++ ctrl = IXGBE_READ_REG(&adapter->hw, IXGBE_RXDCTL(j)); ++ ctrl |= IXGBE_RXDCTL_VME; ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_RXDCTL(j), ctrl); ++ } + } + + if (!test_bit(__IXGBE_DOWN, &adapter->state)) +- ixgbe_irq_enable(adapter); ++ ixgbe_irq_enable(adapter, true, true); + } + + static void ixgbe_vlan_rx_add_vid(struct net_device *netdev, u16 vid) + { + struct ixgbe_adapter *adapter = netdev_priv(netdev); + struct ixgbe_hw *hw = &adapter->hw; ++ int i; ++#ifndef HAVE_NETDEV_VLAN_FEATURES ++ struct net_device *v_netdev; ++#endif /* HAVE_NETDEV_VLAN_FEATURES */ + + /* add VID to filter table */ +- hw->mac.ops.set_vfta(&adapter->hw, vid, 0, true); ++ if (hw->mac.ops.set_vfta) { ++ hw->mac.ops.set_vfta(hw, vid, 0, true); ++ if ((adapter->flags & IXGBE_FLAG_VMDQ_ENABLED) && ++ (adapter->hw.mac.type == ixgbe_mac_82599EB)) { ++ /* enable vlan id for all pools */ ++ for (i = 1; i < adapter->num_rx_pools; i++) ++ hw->mac.ops.set_vfta(hw, vid, i, true); ++ } ++ } ++#ifndef HAVE_NETDEV_VLAN_FEATURES ++ /* ++ * Copy feature flags from netdev to the vlan netdev for this vid. ++ * This allows things like TSO to bubble down to our vlan device. ++ */ ++ v_netdev = vlan_group_get_device(adapter->vlgrp, vid); ++ v_netdev->features |= adapter->netdev->features; ++ vlan_group_set_device(adapter->vlgrp, vid, v_netdev); ++#endif /* HAVE_NETDEV_VLAN_FEATURES */ + } + + static void ixgbe_vlan_rx_kill_vid(struct net_device *netdev, u16 vid) + { + struct ixgbe_adapter *adapter = netdev_priv(netdev); + struct ixgbe_hw *hw = &adapter->hw; ++ int i; ++ ++ /* User is not allowed to remove vlan ID 0 */ ++ if (!vid) ++ return; + + if (!test_bit(__IXGBE_DOWN, &adapter->state)) + ixgbe_irq_disable(adapter); +@@ -1792,15 +2957,28 @@ + vlan_group_set_device(adapter->vlgrp, vid, NULL); + + if (!test_bit(__IXGBE_DOWN, &adapter->state)) +- ixgbe_irq_enable(adapter); +- ++ ixgbe_irq_enable(adapter, true, true); + /* remove VID from filter table */ +- hw->mac.ops.set_vfta(&adapter->hw, vid, 0, false); ++ if (hw->mac.ops.set_vfta) { ++ hw->mac.ops.set_vfta(hw, vid, 0, false); ++ if ((adapter->flags & IXGBE_FLAG_VMDQ_ENABLED) && ++ (adapter->hw.mac.type == ixgbe_mac_82599EB)) { ++ /* remove vlan id from all pools */ ++ for (i = 1; i < adapter->num_rx_pools; i++) ++ hw->mac.ops.set_vfta(hw, vid, i, false); ++ } ++ } + } + + static void ixgbe_restore_vlan(struct ixgbe_adapter *adapter) + { ++ struct ixgbe_hw *hw = &adapter->hw; ++ + ixgbe_vlan_rx_register(adapter->netdev, adapter->vlgrp); ++ ++ /* add vlan ID 0 so we always accept priority-tagged traffic */ ++ if (hw->mac.ops.set_vfta) ++ hw->mac.ops.set_vfta(hw, 0, 0, true); + + if (adapter->vlgrp) { + u16 vid; +@@ -1812,10 +2990,12 @@ + } + } + ++#endif + static u8 *ixgbe_addr_list_itr(struct ixgbe_hw *hw, u8 **mc_addr_ptr, u32 *vmdq) + { + struct dev_mc_list *mc_ptr; + u8 *addr = *mc_addr_ptr; ++ + *vmdq = 0; + + mc_ptr = container_of(addr, struct dev_mc_list, dmi_addr[0]); +@@ -1862,28 +3042,34 @@ + } + vlnctrl |= IXGBE_VLNCTRL_VFE; + hw->addr_ctrl.user_set_promisc = 0; ++ fctrl &= ~(IXGBE_FCTRL_UPE | IXGBE_FCTRL_MPE); + } + + IXGBE_WRITE_REG(hw, IXGBE_FCTRL, fctrl); + IXGBE_WRITE_REG(hw, IXGBE_VLNCTRL, vlnctrl); + ++#ifdef HAVE_SET_RX_MODE + /* reprogram secondary unicast list */ + addr_count = netdev->uc_count; + if (addr_count) + addr_list = netdev->uc_list->dmi_addr; +- hw->mac.ops.update_uc_addr_list(hw, addr_list, addr_count, +- ixgbe_addr_list_itr); +- ++ if (hw->mac.ops.update_uc_addr_list) ++ hw->mac.ops.update_uc_addr_list(hw, addr_list, addr_count, ++ ixgbe_addr_list_itr); ++ ++#endif + /* reprogram multicast list */ + addr_count = netdev->mc_count; + if (addr_count) + addr_list = netdev->mc_list->dmi_addr; +- hw->mac.ops.update_mc_addr_list(hw, addr_list, addr_count, +- ixgbe_addr_list_itr); ++ if (hw->mac.ops.update_mc_addr_list) ++ hw->mac.ops.update_mc_addr_list(hw, addr_list, addr_count, ++ ixgbe_addr_list_itr); + } + + static void ixgbe_napi_enable_all(struct ixgbe_adapter *adapter) + { ++#ifdef CONFIG_IXGBE_NAPI + int q_idx; + struct ixgbe_q_vector *q_vector; + int q_vectors = adapter->num_msix_vectors - NON_Q_VECTORS; +@@ -1894,20 +3080,25 @@ + + for (q_idx = 0; q_idx < q_vectors; q_idx++) { + struct napi_struct *napi; +- q_vector = &adapter->q_vector[q_idx]; +- if (!q_vector->rxr_count) +- continue; ++ q_vector = adapter->q_vector[q_idx]; + napi = &q_vector->napi; +- if ((adapter->flags & IXGBE_FLAG_MSIX_ENABLED) && +- (q_vector->rxr_count > 1)) +- napi->poll = &ixgbe_clean_rxonly_many; ++ if (adapter->flags & IXGBE_FLAG_MSIX_ENABLED) { ++ if (!q_vector->rxr_count || !q_vector->txr_count) { ++ if (q_vector->txr_count == 1) ++ napi->poll = &ixgbe_clean_txonly; ++ else if (q_vector->rxr_count == 1) ++ napi->poll = &ixgbe_clean_rxonly; ++ } ++ } + + napi_enable(napi); + } ++#endif /* CONFIG_IXGBE_NAPI */ + } + + static void ixgbe_napi_disable_all(struct ixgbe_adapter *adapter) + { ++#ifdef CONFIG_IXGBE_NAPI + int q_idx; + struct ixgbe_q_vector *q_vector; + int q_vectors = adapter->num_msix_vectors - NON_Q_VECTORS; +@@ -1917,14 +3108,12 @@ + q_vectors = 1; + + for (q_idx = 0; q_idx < q_vectors; q_idx++) { +- q_vector = &adapter->q_vector[q_idx]; +- if (!q_vector->rxr_count) +- continue; ++ q_vector = adapter->q_vector[q_idx]; + napi_disable(&q_vector->napi); + } +-} +- +-#ifdef CONFIG_IXGBE_DCB ++#endif ++} ++ + /* + * ixgbe_configure_dcb - Configure DCB hardware + * @adapter: ixgbe adapter struct +@@ -1937,11 +3126,18 @@ + { + struct ixgbe_hw *hw = &adapter->hw; + u32 txdctl, vlnctrl; ++ s32 err; + int i, j; + +- ixgbe_dcb_check_config(&adapter->dcb_cfg); +- ixgbe_dcb_calculate_tc_credits(&adapter->dcb_cfg, DCB_TX_CONFIG); +- ixgbe_dcb_calculate_tc_credits(&adapter->dcb_cfg, DCB_RX_CONFIG); ++ err = ixgbe_dcb_check_config(&adapter->dcb_cfg); ++ if (err) ++ DPRINTK(DRV, ERR, "err in dcb_check_config\n"); ++ err = ixgbe_dcb_calculate_tc_credits(&adapter->dcb_cfg, DCB_TX_CONFIG); ++ if (err) ++ DPRINTK(DRV, ERR, "err in dcb_calculate_tc_credits (TX)\n"); ++ err = ixgbe_dcb_calculate_tc_credits(&adapter->dcb_cfg, DCB_RX_CONFIG); ++ if (err) ++ DPRINTK(DRV, ERR, "err in dcb_calculate_tc_credits (RX)\n"); + + /* reconfigure the hardware */ + ixgbe_dcb_hw_config(&adapter->hw, &adapter->dcb_cfg); +@@ -1955,38 +3151,249 @@ + } + /* Enable VLAN tag insert/strip */ + vlnctrl = IXGBE_READ_REG(hw, IXGBE_VLNCTRL); +- vlnctrl |= IXGBE_VLNCTRL_VME | IXGBE_VLNCTRL_VFE; +- vlnctrl &= ~IXGBE_VLNCTRL_CFIEN; +- IXGBE_WRITE_REG(hw, IXGBE_VLNCTRL, vlnctrl); +- hw->mac.ops.set_vfta(&adapter->hw, 0, 0, true); +-} +-#endif /* CONFIG_IXGBE_DCB */ +- ++ if (hw->mac.type == ixgbe_mac_82598EB) { ++ vlnctrl |= IXGBE_VLNCTRL_VME | IXGBE_VLNCTRL_VFE; ++ vlnctrl &= ~IXGBE_VLNCTRL_CFIEN; ++ IXGBE_WRITE_REG(hw, IXGBE_VLNCTRL, vlnctrl); ++ } else if (hw->mac.type == ixgbe_mac_82599EB) { ++ vlnctrl |= IXGBE_VLNCTRL_VFE; ++ vlnctrl &= ~IXGBE_VLNCTRL_CFIEN; ++ IXGBE_WRITE_REG(hw, IXGBE_VLNCTRL, vlnctrl); ++ for (i = 0; i < adapter->num_rx_queues; i++) { ++ j = adapter->rx_ring[i].reg_idx; ++ vlnctrl = IXGBE_READ_REG(hw, IXGBE_RXDCTL(j)); ++ vlnctrl |= IXGBE_RXDCTL_VME; ++ IXGBE_WRITE_REG(hw, IXGBE_RXDCTL(j), vlnctrl); ++ } ++ } ++ if (hw->mac.ops.set_vfta) ++ hw->mac.ops.set_vfta(hw, 0, 0, true); ++} ++ ++#ifndef IXGBE_NO_LLI ++static void ixgbe_configure_lli_82599(struct ixgbe_adapter *adapter) ++{ ++ u16 port; ++ ++ if (adapter->lli_etype) { ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_L34T_IMIR(0), ++ (IXGBE_IMIR_LLI_EN_82599 | IXGBE_IMIR_SIZE_BP_82599 | ++ IXGBE_IMIR_CTRL_BP_82599)); ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_ETQS(0), IXGBE_ETQS_LLI); ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_ETQF(0), ++ (adapter->lli_etype | IXGBE_ETQF_FILTER_EN)); ++ } ++ ++ if (adapter->lli_port) { ++ port = ntohs((u16)adapter->lli_port); ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_L34T_IMIR(0), ++ (IXGBE_IMIR_LLI_EN_82599 | IXGBE_IMIR_SIZE_BP_82599 | ++ IXGBE_IMIR_CTRL_BP_82599)); ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_FTQF(0), ++ (IXGBE_FTQF_POOL_MASK_EN | ++ (IXGBE_FTQF_PRIORITY_MASK << ++ IXGBE_FTQF_PRIORITY_SHIFT) | ++ (IXGBE_FTQF_DEST_PORT_MASK << ++ IXGBE_FTQF_5TUPLE_MASK_SHIFT))); ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_SDPQF(0), (port << 16)); ++ } ++ ++ if (adapter->flags & IXGBE_FLAG_LLI_PUSH) { ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_L34T_IMIR(0), ++ (IXGBE_IMIR_LLI_EN_82599 | IXGBE_IMIR_SIZE_BP_82599 | ++ IXGBE_IMIR_CTRL_PSH_82599 | IXGBE_IMIR_CTRL_SYN_82599 | ++ IXGBE_IMIR_CTRL_URG_82599 | IXGBE_IMIR_CTRL_ACK_82599 | ++ IXGBE_IMIR_CTRL_RST_82599 | IXGBE_IMIR_CTRL_FIN_82599)); ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_FTQF(0), ++ (IXGBE_FTQF_POOL_MASK_EN | ++ (IXGBE_FTQF_PRIORITY_MASK << ++ IXGBE_FTQF_PRIORITY_SHIFT) | ++ (IXGBE_FTQF_5TUPLE_MASK_MASK << ++ IXGBE_FTQF_5TUPLE_MASK_SHIFT))); ++ ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_LLITHRESH, 0xfc000000); ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_SYNQF, 0x80000100); ++ } ++ ++ if (adapter->lli_size) { ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_L34T_IMIR(0), ++ (IXGBE_IMIR_LLI_EN_82599 | IXGBE_IMIR_CTRL_BP_82599)); ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_LLITHRESH, adapter->lli_size); ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_FTQF(0), ++ (IXGBE_FTQF_POOL_MASK_EN | ++ (IXGBE_FTQF_PRIORITY_MASK << ++ IXGBE_FTQF_PRIORITY_SHIFT) | ++ (IXGBE_FTQF_5TUPLE_MASK_MASK << ++ IXGBE_FTQF_5TUPLE_MASK_SHIFT))); ++ } ++ ++ if (adapter->lli_vlan_pri) { ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_IMIRVP, ++ (IXGBE_IMIRVP_PRIORITY_EN | adapter->lli_vlan_pri)); ++ } ++} ++ ++static void ixgbe_configure_lli(struct ixgbe_adapter *adapter) ++{ ++ u16 port; ++ ++ if (adapter->lli_port) { ++ /* use filter 0 for port */ ++ port = ntohs((u16)adapter->lli_port); ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_IMIR(0), ++ (port | IXGBE_IMIR_PORT_IM_EN)); ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_IMIREXT(0), ++ (IXGBE_IMIREXT_SIZE_BP | ++ IXGBE_IMIREXT_CTRL_BP)); ++ } ++ ++ if (adapter->flags & IXGBE_FLAG_LLI_PUSH) { ++ /* use filter 1 for push flag */ ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_IMIR(1), ++ (IXGBE_IMIR_PORT_BP | IXGBE_IMIR_PORT_IM_EN)); ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_IMIREXT(1), ++ (IXGBE_IMIREXT_SIZE_BP | ++ IXGBE_IMIREXT_CTRL_PSH)); ++ } ++ ++ if (adapter->lli_size) { ++ /* use filter 2 for size */ ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_IMIR(2), ++ (IXGBE_IMIR_PORT_BP | IXGBE_IMIR_PORT_IM_EN)); ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_IMIREXT(2), ++ (adapter->lli_size | IXGBE_IMIREXT_CTRL_BP)); ++ } ++} ++ ++#endif /* IXGBE_NO_LLI */ + static void ixgbe_configure(struct ixgbe_adapter *adapter) + { + struct net_device *netdev = adapter->netdev; + int i; ++ struct ixgbe_hw *hw = &adapter->hw; + + ixgbe_set_rx_mode(netdev); + ++#ifdef NETIF_F_HW_VLAN_TX + ixgbe_restore_vlan(adapter); +-#ifdef CONFIG_IXGBE_DCB ++#endif + if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) { + netif_set_gso_max_size(netdev, 32768); + ixgbe_configure_dcb(adapter); + } else { + netif_set_gso_max_size(netdev, 65536); + } +-#else +- netif_set_gso_max_size(netdev, 65536); +-#endif /* CONFIG_IXGBE_DCB */ +- ++ ++ if (adapter->flags & IXGBE_FLAG_FDIR_HASH_CAPABLE) ++ ixgbe_init_fdir_signature_82599(hw, adapter->fdir_pballoc); ++ else if (adapter->flags & IXGBE_FLAG_FDIR_PERFECT_CAPABLE) ++ ixgbe_init_fdir_perfect_82599(hw, adapter->fdir_pballoc); + + ixgbe_configure_tx(adapter); + ixgbe_configure_rx(adapter); +- for (i = 0; i < adapter->num_rx_queues; i++) +- ixgbe_alloc_rx_buffers(adapter, &adapter->rx_ring[i], +- (adapter->rx_ring[i].count - 1)); ++ for (i = 0; i < adapter->num_rx_queues; i++) { ++ struct ixgbe_ring *ring = &adapter->rx_ring[i]; ++ ixgbe_alloc_rx_buffers(adapter, ring, IXGBE_DESC_UNUSED(ring)); ++ } ++} ++ ++static inline bool ixgbe_is_sfp(struct ixgbe_hw *hw) ++{ ++ switch (hw->phy.type) { ++ case ixgbe_phy_sfp_avago: ++ case ixgbe_phy_sfp_ftl: ++ case ixgbe_phy_sfp_intel: ++ case ixgbe_phy_sfp_unknown: ++ case ixgbe_phy_tw_tyco: ++ case ixgbe_phy_tw_unknown: ++ return true; ++ default: ++ return false; ++ } ++} ++ ++/** ++ * ixgbe_sfp_link_config - set up SFP+ link ++ * @adapter: pointer to private adapter struct ++ **/ ++static void ixgbe_sfp_link_config(struct ixgbe_adapter *adapter) ++{ ++ struct ixgbe_hw *hw = &adapter->hw; ++ ++ if (hw->phy.multispeed_fiber) { ++ /* ++ * In multispeed fiber setups, the device may not have ++ * had a physical connection when the driver loaded. ++ * If that's the case, the initial link configuration ++ * couldn't get the MAC into 10G or 1G mode, so we'll ++ * never have a link status change interrupt fire. ++ * We need to try and force an autonegotiation ++ * session, then bring up link. ++ */ ++ hw->mac.ops.setup_sfp(hw); ++ if (!(adapter->flags & IXGBE_FLAG_IN_SFP_LINK_TASK)) ++ schedule_work(&adapter->multispeed_fiber_task); ++ } else { ++ /* ++ * Direct Attach Cu and non-multispeed fiber modules ++ * still need to be configured properly prior to ++ * attempting link. ++ */ ++ if (!(adapter->flags & IXGBE_FLAG_IN_SFP_MOD_TASK)) ++ schedule_work(&adapter->sfp_config_module_task); ++ } ++} ++ ++/** ++ * ixgbe_non_sfp_link_config - set up non-SFP+ link ++ * @hw: pointer to private hardware struct ++ * ++ * Returns 0 on success, negative on failure ++ **/ ++static int ixgbe_non_sfp_link_config(struct ixgbe_hw *hw) ++{ ++ u32 autoneg; ++ bool link_up = false; ++ u32 ret = IXGBE_ERR_LINK_SETUP; ++ ++ if (hw->mac.ops.check_link) ++ ret = hw->mac.ops.check_link(hw, &autoneg, &link_up, false); ++ ++ if (ret) ++ goto link_cfg_out; ++ ++ if (hw->mac.ops.get_link_capabilities) ++ ret = hw->mac.ops.get_link_capabilities(hw, &autoneg, ++ &hw->mac.autoneg); ++ if (ret) ++ goto link_cfg_out; ++ ++ if (hw->mac.ops.setup_link_speed) ++ ret = hw->mac.ops.setup_link_speed(hw, autoneg, true, link_up); ++link_cfg_out: ++ return ret; ++} ++ ++#define IXGBE_MAX_RX_DESC_POLL 10 ++static inline void ixgbe_rx_desc_queue_enable(struct ixgbe_adapter *adapter, ++ int rxr) ++{ ++ int j = adapter->rx_ring[rxr].reg_idx; ++ int k; ++ ++ for (k = 0; k < IXGBE_MAX_RX_DESC_POLL; k++) { ++ if (IXGBE_READ_REG(&adapter->hw, ++ IXGBE_RXDCTL(j)) & IXGBE_RXDCTL_ENABLE) ++ break; ++ else ++ msleep(1); ++ } ++ if (k >= IXGBE_MAX_RX_DESC_POLL) { ++ DPRINTK(DRV, ERR, "RXDCTL.ENABLE on Rx queue %d " ++ "not set within the polling period\n", rxr); ++ } ++ ixgbe_release_rx_desc(&adapter->hw, &adapter->rx_ring[rxr], ++ (adapter->rx_ring[rxr].count - 1)); + } + + static int ixgbe_up_complete(struct ixgbe_adapter *adapter) +@@ -1994,12 +3401,23 @@ + struct net_device *netdev = adapter->netdev; + struct ixgbe_hw *hw = &adapter->hw; + int i, j = 0; ++ int num_rx_rings = adapter->num_rx_queues; + int max_frame = netdev->mtu + ETH_HLEN + ETH_FCS_LEN; ++ int err; ++#ifdef IXGBE_TCP_TIMER ++ u32 tcp_timer; ++#endif + u32 txdctl, rxdctl, mhadd; ++ u32 dmatxctl; + u32 gpie; + + ixgbe_get_hw_control(adapter); + ++#ifdef CONFIG_NETDEVICES_MULTIQUEUE ++ if (adapter->num_tx_queues > 1) ++ netdev->features |= NETIF_F_MULTI_QUEUE; ++ ++#endif + if ((adapter->flags & IXGBE_FLAG_MSIX_ENABLED) || + (adapter->flags & IXGBE_FLAG_MSI_ENABLED)) { + if (adapter->flags & IXGBE_FLAG_MSIX_ENABLED) { +@@ -2012,21 +3430,40 @@ + /* XXX: to interrupt immediately for EICS writes, enable this */ + /* gpie |= IXGBE_GPIE_EIMEN; */ + IXGBE_WRITE_REG(hw, IXGBE_GPIE, gpie); +- } +- ++#ifdef IXGBE_TCP_TIMER ++ ++ tcp_timer = IXGBE_READ_REG(hw, IXGBE_TCPTIMER); ++ tcp_timer |= IXGBE_TCPTIMER_DURATION_MASK; ++ tcp_timer |= (IXGBE_TCPTIMER_KS | ++ IXGBE_TCPTIMER_COUNT_ENABLE | ++ IXGBE_TCPTIMER_LOOP); ++ IXGBE_WRITE_REG(hw, IXGBE_TCPTIMER, tcp_timer); ++ tcp_timer = IXGBE_READ_REG(hw, IXGBE_TCPTIMER); ++#endif ++ } ++ ++#ifdef CONFIG_IXGBE_NAPI + if (!(adapter->flags & IXGBE_FLAG_MSIX_ENABLED)) { + /* legacy interrupts, use EIAM to auto-mask when reading EICR, + * specifically only auto mask tx and rx interrupts */ + IXGBE_WRITE_REG(hw, IXGBE_EIAM, IXGBE_EICS_RTX_QUEUE); + } + +- /* Enable fan failure interrupt if media type is copper */ ++#endif ++ /* Enable fan failure interrupt */ + if (adapter->flags & IXGBE_FLAG_FAN_FAIL_CAPABLE) { + gpie = IXGBE_READ_REG(hw, IXGBE_GPIE); + gpie |= IXGBE_SDP1_GPIEN; + IXGBE_WRITE_REG(hw, IXGBE_GPIE, gpie); + } + ++ if (hw->mac.type == ixgbe_mac_82599EB) { ++ gpie = IXGBE_READ_REG(hw, IXGBE_GPIE); ++ gpie |= IXGBE_SDP1_GPIEN; ++ gpie |= IXGBE_SDP2_GPIEN; ++ IXGBE_WRITE_REG(hw, IXGBE_GPIE, gpie); ++ } ++ + mhadd = IXGBE_READ_REG(hw, IXGBE_MHADD); + if (max_frame != (mhadd >> IXGBE_MHADD_MFS_SHIFT)) { + mhadd &= ~IXGBE_MHADD_MFS_MASK; +@@ -2040,11 +3477,24 @@ + txdctl = IXGBE_READ_REG(hw, IXGBE_TXDCTL(j)); + /* enable WTHRESH=8 descriptors, to encourage burst writeback */ + txdctl |= (8 << 16); ++ IXGBE_WRITE_REG(hw, IXGBE_TXDCTL(j), txdctl); ++ } ++ ++ if (hw->mac.type == ixgbe_mac_82599EB) { ++ /* DMATXCTL.EN must be set after all Tx queue config is done */ ++ dmatxctl = IXGBE_READ_REG(hw, IXGBE_DMATXCTL); ++ dmatxctl |= IXGBE_DMATXCTL_TE; ++ IXGBE_WRITE_REG(hw, IXGBE_DMATXCTL, dmatxctl); ++ } ++ ++ for (i = 0; i < adapter->num_tx_queues; i++) { ++ j = adapter->tx_ring[i].reg_idx; ++ txdctl = IXGBE_READ_REG(hw, IXGBE_TXDCTL(j)); + txdctl |= IXGBE_TXDCTL_ENABLE; + IXGBE_WRITE_REG(hw, IXGBE_TXDCTL(j), txdctl); + } + +- for (i = 0; i < adapter->num_rx_queues; i++) { ++ for (i = 0; i < num_rx_rings; i++) { + j = adapter->rx_ring[i].reg_idx; + rxdctl = IXGBE_READ_REG(hw, IXGBE_RXDCTL(j)); + /* enable PTHRESH=32 descriptors (half the internal cache) +@@ -2053,30 +3503,69 @@ + rxdctl |= 0x0020; + rxdctl |= IXGBE_RXDCTL_ENABLE; + IXGBE_WRITE_REG(hw, IXGBE_RXDCTL(j), rxdctl); ++ if (hw->mac.type == ixgbe_mac_82599EB) ++ ixgbe_rx_desc_queue_enable(adapter, i); + } + /* enable all receives */ + rxdctl = IXGBE_READ_REG(hw, IXGBE_RXCTRL); +- rxdctl |= (IXGBE_RXCTRL_DMBYPS | IXGBE_RXCTRL_RXEN); +- IXGBE_WRITE_REG(hw, IXGBE_RXCTRL, rxdctl); ++ if (hw->mac.type == ixgbe_mac_82598EB) ++ rxdctl |= (IXGBE_RXCTRL_DMBYPS | IXGBE_RXCTRL_RXEN); ++ else ++ rxdctl |= IXGBE_RXCTRL_RXEN; ++ ixgbe_enable_rx_dma(hw, rxdctl); + + if (adapter->flags & IXGBE_FLAG_MSIX_ENABLED) + ixgbe_configure_msix(adapter); + else + ixgbe_configure_msi_and_legacy(adapter); +- ++#ifndef IXGBE_NO_LLI ++ /* lli should only be enabled with MSI-X and MSI */ ++ if (adapter->flags & IXGBE_FLAG_MSI_ENABLED || ++ adapter->flags & IXGBE_FLAG_MSIX_ENABLED) { ++ if (adapter->hw.mac.type == ixgbe_mac_82599EB) ++ ixgbe_configure_lli_82599(adapter); ++ else ++ ixgbe_configure_lli(adapter); ++ } ++ ++#endif + clear_bit(__IXGBE_DOWN, &adapter->state); + ixgbe_napi_enable_all(adapter); + +- /* clear any pending interrupts, may auto mask */ +- IXGBE_READ_REG(hw, IXGBE_EICR); +- +- ixgbe_irq_enable(adapter); ++ /* ++ * For hot-pluggable SFP+ devices, a new SFP+ module may have ++ * arrived before interrupts were enabled. We need to kick off ++ * the SFP+ module setup first, then try to bring up link. ++ * If we're not hot-pluggable SFP+, we just need to configure link ++ * and bring it up. ++ */ ++ err = hw->phy.ops.identify_sfp(hw); ++ if (err == IXGBE_ERR_SFP_NOT_SUPPORTED) { ++ DPRINTK(PROBE, ERR, "failed to load because an " ++ "unsupported SFP+ module type was detected.\n"); ++ ixgbe_down(adapter); ++ return err; ++ } ++ ++ if (ixgbe_is_sfp(hw)) { ++ ixgbe_sfp_link_config(adapter); ++ } else { ++ err = ixgbe_non_sfp_link_config(hw); ++ if (err) ++ DPRINTK(PROBE, ERR, "link_config FAILED %d\n", err); ++ } ++ ++ /* enable transmits */ ++ netif_tx_start_all_queues(netdev); + + /* bring the link up in the watchdog, this could race with our first + * link up interrupt but shouldn't be a problem */ + adapter->flags |= IXGBE_FLAG_NEED_LINK_UPDATE; + adapter->link_check_timeout = jiffies; + mod_timer(&adapter->watchdog_timer, jiffies); ++ for (i = 0; i < adapter->num_tx_queues; i++) ++ set_bit(__IXGBE_FDIR_INIT_DONE, ++ &(adapter->tx_ring[i].reinit_state)); + return 0; + } + +@@ -2092,21 +3581,48 @@ + + int ixgbe_up(struct ixgbe_adapter *adapter) + { +- /* hardware has been reset, we need to reload some things */ ++ int err; ++ struct ixgbe_hw *hw = &adapter->hw; ++ + ixgbe_configure(adapter); + +- return ixgbe_up_complete(adapter); ++ err = ixgbe_up_complete(adapter); ++ ++ /* clear any pending interrupts, may auto mask */ ++ IXGBE_READ_REG(hw, IXGBE_EICR); ++ ixgbe_irq_enable(adapter, true, true); ++ ++ return err; + } + + void ixgbe_reset(struct ixgbe_adapter *adapter) + { + struct ixgbe_hw *hw = &adapter->hw; +- if (hw->mac.ops.init_hw(hw)) +- dev_err(&adapter->pdev->dev, "Hardware Error\n"); ++ int err; ++ ++ err = hw->mac.ops.init_hw(hw); ++ switch (err) { ++ case 0: ++ case IXGBE_ERR_SFP_NOT_PRESENT: ++ break; ++ case IXGBE_ERR_MASTER_REQUESTS_PENDING: ++ DPRINTK(HW, INFO, "master disable timed out\n"); ++ break; ++ case IXGBE_ERR_EEPROM_VERSION: ++ /* We are running on a pre-production device, log a warning */ ++ DPRINTK(PROBE, INFO, "This device is a pre-production adapter/" ++ "LOM. Please be aware there may be issues associated " ++ "with your hardware. If you are experiencing problems " ++ "please contact your Intel or hardware representative " ++ "who provided you with this hardware.\n"); ++ break; ++ default: ++ DPRINTK(PROBE, ERR, "Hardware Error: %d\n", err); ++ } + + /* reprogram the RAR[0] in case user changed it. */ +- hw->mac.ops.set_rar(hw, 0, hw->mac.addr, 0, IXGBE_RAH_AV); +- ++ if (hw->mac.ops.set_rar) ++ hw->mac.ops.set_rar(hw, 0, hw->mac.addr, 0, IXGBE_RAH_AV); + } + + /** +@@ -2134,8 +3650,13 @@ + rx_buffer_info->dma = 0; + } + if (rx_buffer_info->skb) { +- dev_kfree_skb(rx_buffer_info->skb); ++ struct sk_buff *skb = rx_buffer_info->skb; + rx_buffer_info->skb = NULL; ++ do { ++ struct sk_buff *this = skb; ++ skb = skb->prev; ++ dev_kfree_skb(this); ++ } while (skb); + } + if (!rx_buffer_info->page) + continue; +@@ -2156,8 +3677,10 @@ + rx_ring->next_to_clean = 0; + rx_ring->next_to_use = 0; + +- writel(0, adapter->hw.hw_addr + rx_ring->head); +- writel(0, adapter->hw.hw_addr + rx_ring->tail); ++ if (rx_ring->head) ++ writel(0, adapter->hw.hw_addr + rx_ring->head); ++ if (rx_ring->tail) ++ writel(0, adapter->hw.hw_addr + rx_ring->tail); + } + + /** +@@ -2182,14 +3705,15 @@ + size = sizeof(struct ixgbe_tx_buffer) * tx_ring->count; + memset(tx_ring->tx_buffer_info, 0, size); + +- /* Zero out the descriptor ring */ + memset(tx_ring->desc, 0, tx_ring->size); + + tx_ring->next_to_use = 0; + tx_ring->next_to_clean = 0; + +- writel(0, adapter->hw.hw_addr + tx_ring->head); +- writel(0, adapter->hw.hw_addr + tx_ring->tail); ++ if (tx_ring->head) ++ writel(0, adapter->hw.hw_addr + tx_ring->head); ++ if (tx_ring->tail) ++ writel(0, adapter->hw.hw_addr + tx_ring->tail); + } + + /** +@@ -2243,7 +3767,14 @@ + ixgbe_napi_disable_all(adapter); + + del_timer_sync(&adapter->watchdog_timer); +- cancel_work_sync(&adapter->watchdog_task); ++ /* can't call flush scheduled work here because it can deadlock ++ * if linkwatch_event tries to acquire the rtnl_lock which we are ++ * holding */ ++ while (adapter->flags & IXGBE_FLAG_IN_WATCHDOG_TASK) ++ msleep(1); ++ if (adapter->flags & IXGBE_FLAG_FDIR_HASH_CAPABLE || ++ adapter->flags & IXGBE_FLAG_FDIR_PERFECT_CAPABLE) ++ cancel_work_sync(&adapter->fdir_reinit_task); + + /* disable transmits in the hardware now that interrupts are off */ + for (i = 0; i < adapter->num_tx_queues; i++) { +@@ -2252,6 +3783,11 @@ + IXGBE_WRITE_REG(hw, IXGBE_TXDCTL(j), + (txdctl & ~IXGBE_TXDCTL_ENABLE)); + } ++ /* Disable the Tx DMA engine on 82599 */ ++ if (hw->mac.type == ixgbe_mac_82599EB) ++ IXGBE_WRITE_REG(hw, IXGBE_DMATXCTL, ++ (IXGBE_READ_REG(hw, IXGBE_DMATXCTL) & ++ ~IXGBE_DMATXCTL_TE)); + + netif_carrier_off(netdev); + +@@ -2262,23 +3798,20 @@ + } + + #endif ++#ifdef HAVE_PCI_ERS + if (!pci_channel_offline(adapter->pdev)) ++#endif + ixgbe_reset(adapter); + ixgbe_clean_all_tx_rings(adapter); + ixgbe_clean_all_rx_rings(adapter); + + #if defined(CONFIG_DCA) || defined(CONFIG_DCA_MODULE) + /* since we reset the hardware DCA settings were cleared */ +- if (dca_add_requester(&adapter->pdev->dev) == 0) { +- adapter->flags |= IXGBE_FLAG_DCA_ENABLED; +- /* always use CB2 mode, difference is masked +- * in the CB driver */ +- IXGBE_WRITE_REG(hw, IXGBE_DCA_CTRL, 2); +- ixgbe_setup_dca(adapter); +- } +-#endif +-} +- ++ ixgbe_setup_dca(adapter); ++#endif ++} ++ ++#ifdef CONFIG_IXGBE_NAPI + /** + * ixgbe_poll - NAPI Rx polling callback + * @napi: structure for representing this polling device +@@ -2288,10 +3821,10 @@ + **/ + static int ixgbe_poll(struct napi_struct *napi, int budget) + { +- struct ixgbe_q_vector *q_vector = container_of(napi, +- struct ixgbe_q_vector, napi); +- struct ixgbe_adapter *adapter = q_vector->adapter; +- int tx_cleaned, work_done = 0; ++ struct ixgbe_q_vector *q_vector = ++ container_of(napi, struct ixgbe_q_vector, napi); ++ struct ixgbe_adapter *adapter = q_vector->adapter; ++ int tx_clean_complete, work_done = 0; + + #if defined(CONFIG_DCA) || defined(CONFIG_DCA_MODULE) + if (adapter->flags & IXGBE_FLAG_DCA_ENABLED) { +@@ -2300,23 +3833,29 @@ + } + #endif + +- tx_cleaned = ixgbe_clean_tx_irq(adapter, adapter->tx_ring); +- ixgbe_clean_rx_irq(adapter, adapter->rx_ring, &work_done, budget); +- +- if (tx_cleaned) ++ tx_clean_complete = ixgbe_clean_tx_irq(q_vector, adapter->tx_ring); ++ ixgbe_clean_rx_irq(q_vector, adapter->rx_ring, &work_done, budget); ++ ++ if (!tx_clean_complete) + work_done = budget; + +- /* If budget not fully consumed, exit the polling mode */ ++#ifndef HAVE_NETDEV_NAPI_LIST ++ if (!netif_running(adapter->netdev)) ++ work_done = 0; ++ ++#endif ++ /* If no Tx and not enough Rx work done, exit the polling mode */ + if (work_done < budget) { +- netif_rx_complete(adapter->netdev, napi); +- if (adapter->itr_setting & 3) ++ napi_complete(napi); ++ if (adapter->itr_setting & 1) + ixgbe_set_itr(adapter); + if (!test_bit(__IXGBE_DOWN, &adapter->state)) +- ixgbe_irq_enable(adapter); ++ ixgbe_irq_enable_queues(adapter, IXGBE_EIMS_RTX_QUEUE); + } + return work_done; + } + ++#endif /* CONFIG_IXGBE_NAPI */ + /** + * ixgbe_tx_timeout - Respond to a Tx Hang + * @netdev: network interface device structure +@@ -2344,68 +3883,197 @@ + ixgbe_reinit_locked(adapter); + } + ++ ++/** ++ * ixgbe_set_dcb_queues: Allocate queues for a DCB-enabled device ++ * @adapter: board private structure to initialize ++ * ++ * When DCB (Data Center Bridging) is enabled, allocate queues for ++ * each traffic class. If multiqueue isn't availabe, then abort DCB ++ * initialization. ++ * ++ **/ ++static inline bool ixgbe_set_dcb_queues(struct ixgbe_adapter *adapter) ++{ ++ bool ret = false; ++ struct ixgbe_ring_feature *f = &adapter->ring_feature[RING_F_DCB]; ++ ++ if (!(adapter->flags & IXGBE_FLAG_DCB_ENABLED)) ++ return ret; ++ ++#ifdef HAVE_TX_MQ ++ f->mask = 0x7 << 3; ++ adapter->num_rx_queues = f->indices; ++ adapter->num_tx_queues = f->indices; ++ ret = true; ++#else ++ DPRINTK(DRV, INFO, "Kernel has no multiqueue support, disabling DCB\n"); ++ f->mask = 0; ++ f->indices = 0; ++#endif ++ ++ return ret; ++} ++ ++/** ++ * ixgbe_set_vmdq_queues: Allocate queues for VMDq devices ++ * @adapter: board private structure to initialize ++ * ++ * When VMDq (Virtual Machine Devices queue) is enabled, allocate queues ++ * and VM pools where appropriate. If RSS is available, then also try and ++ * enable RSS and map accordingly. ++ * ++ **/ ++static inline bool ixgbe_set_vmdq_queues(struct ixgbe_adapter *adapter) ++{ ++ int vmdq_i = adapter->ring_feature[RING_F_VMDQ].indices; ++ int vmdq_m = 0; ++ int rss_i = adapter->ring_feature[RING_F_RSS].indices; ++ int rss_m = adapter->ring_feature[RING_F_RSS].mask; ++ unsigned long i; ++ int rss_shift; ++ bool ret = false; ++ ++ switch (adapter->flags & ++ (IXGBE_FLAG_RSS_ENABLED | IXGBE_FLAG_VMDQ_ENABLED)) { ++ ++ case (IXGBE_FLAG_RSS_ENABLED | IXGBE_FLAG_VMDQ_ENABLED): ++ if (adapter->hw.mac.type == ixgbe_mac_82599EB) { ++ vmdq_i = min(IXGBE_MAX_VMDQ_INDICES, vmdq_i); ++ if (vmdq_i > 32) ++ rss_i = 2; ++ else ++ rss_i = 4; ++ i = rss_i; ++ rss_shift = find_first_bit(&i, sizeof(i) * 8); ++ rss_m = (rss_i - 1); ++ vmdq_m = ((IXGBE_MAX_VMDQ_INDICES - 1) << ++ rss_shift) & (MAX_RX_QUEUES - 1); ++ } ++ adapter->num_rx_queues = vmdq_i * rss_i; ++ adapter->num_tx_queues = min(MAX_TX_QUEUES, vmdq_i * rss_i); ++ ret = true; ++ break; ++ ++ case (IXGBE_FLAG_VMDQ_ENABLED): ++ if (adapter->hw.mac.type == ixgbe_mac_82599EB) ++ vmdq_m = (IXGBE_MAX_VMDQ_INDICES - 1) << 1; ++ else ++ vmdq_m = (IXGBE_MAX_VMDQ_INDICES - 1); ++ adapter->num_rx_queues = vmdq_i; ++ adapter->num_tx_queues = vmdq_i; ++ ret = true; ++ break; ++ ++ default: ++ ret = false; ++ goto vmdq_queues_out; ++ } ++ ++ if (adapter->flags & IXGBE_FLAG_VMDQ_ENABLED) { ++ adapter->num_rx_pools = vmdq_i; ++ adapter->num_rx_queues_per_pool = adapter->num_rx_queues / ++ vmdq_i; ++ } else { ++ adapter->num_rx_pools = adapter->num_rx_queues; ++ adapter->num_rx_queues_per_pool = 1; ++ } ++ /* save the mask for later use */ ++ adapter->ring_feature[RING_F_VMDQ].mask = vmdq_m; ++vmdq_queues_out: ++ return ret; ++} ++ ++/** ++ * ixgbe_set_rss_queues: Allocate queues for RSS ++ * @adapter: board private structure to initialize ++ * ++ * This is our "base" multiqueue mode. RSS (Receive Side Scaling) will try ++ * to allocate one Rx queue per CPU, and if available, one Tx queue per CPU. ++ * ++ **/ ++static inline bool ixgbe_set_rss_queues(struct ixgbe_adapter *adapter) ++{ ++ bool ret = false; ++ struct ixgbe_ring_feature *f = &adapter->ring_feature[RING_F_RSS]; ++ ++ if (adapter->flags & IXGBE_FLAG_RSS_ENABLED) { ++ f->mask = 0xF; ++ adapter->num_rx_queues = f->indices; ++#ifdef HAVE_TX_MQ ++ adapter->num_tx_queues = f->indices; ++#endif ++ ret = true; ++ } ++ ++ return ret; ++} ++ ++/** ++ * ixgbe_set_fdir_queues: Allocate queues for Flow Director ++ * @adapter: board private structure to initialize ++ * ++ * Flow Director is an advanced Rx filter, attempting to get Rx flows back ++ * to the original CPU that initiated the Tx session. This runs in addition ++ * to RSS, so if a packet doesn't match an FDIR filter, we can still spread the ++ * Rx load across CPUs using RSS. ++ * ++ **/ ++static bool inline ixgbe_set_fdir_queues(struct ixgbe_adapter *adapter) ++{ ++ bool ret = false; ++ struct ixgbe_ring_feature *f_fdir = &adapter->ring_feature[RING_F_FDIR]; ++ ++ f_fdir->indices = min((int)num_online_cpus(), f_fdir->indices); ++ f_fdir->mask = 0; ++ ++ /* Flow Director must have RSS enabled */ ++ if (adapter->flags & IXGBE_FLAG_RSS_ENABLED && ++ ((adapter->flags & IXGBE_FLAG_FDIR_HASH_CAPABLE || ++ (adapter->flags & IXGBE_FLAG_FDIR_PERFECT_CAPABLE)))) { ++ adapter->num_rx_queues = f_fdir->indices; ++#ifdef HAVE_TX_MQ ++ adapter->num_tx_queues = f_fdir->indices; ++#endif ++ ret = true; ++ } else { ++ adapter->flags &= ~IXGBE_FLAG_FDIR_HASH_CAPABLE; ++ adapter->flags &= ~IXGBE_FLAG_FDIR_PERFECT_CAPABLE; ++ } ++ return ret; ++} ++ ++/* ++ * ixgbe_set_num_queues: Allocate queues for device, feature dependant ++ * @adapter: board private structure to initialize ++ * ++ * This is the top level queue allocation routine. The order here is very ++ * important, starting with the "most" number of features turned on at once, ++ * and ending with the smallest set of features. This way large combinations ++ * can be allocated if they're turned on, and smaller combinations are the ++ * fallthrough conditions. ++ * ++ **/ + static void ixgbe_set_num_queues(struct ixgbe_adapter *adapter) + { +- int nrq = 1, ntq = 1; +- int feature_mask = 0, rss_i, rss_m; +- int dcb_i, dcb_m; +- +- /* Number of supported queues */ +- switch (adapter->hw.mac.type) { +- case ixgbe_mac_82598EB: +- dcb_i = adapter->ring_feature[RING_F_DCB].indices; +- dcb_m = 0; +- rss_i = adapter->ring_feature[RING_F_RSS].indices; +- rss_m = 0; +- feature_mask |= IXGBE_FLAG_RSS_ENABLED; +- feature_mask |= IXGBE_FLAG_DCB_ENABLED; +- +- switch (adapter->flags & feature_mask) { +- case (IXGBE_FLAG_RSS_ENABLED | IXGBE_FLAG_DCB_ENABLED): +- dcb_m = 0x7 << 3; +- rss_i = min(8, rss_i); +- rss_m = 0x7; +- nrq = dcb_i * rss_i; +- ntq = min(MAX_TX_QUEUES, dcb_i * rss_i); +- break; +- case (IXGBE_FLAG_DCB_ENABLED): +- dcb_m = 0x7 << 3; +- nrq = dcb_i; +- ntq = dcb_i; +- break; +- case (IXGBE_FLAG_RSS_ENABLED): +- rss_m = 0xF; +- nrq = rss_i; +- ntq = rss_i; +- break; +- case 0: +- default: +- dcb_i = 0; +- dcb_m = 0; +- rss_i = 0; +- rss_m = 0; +- nrq = 1; +- ntq = 1; +- break; +- } +- +- /* Sanity check, we should never have zero queues */ +- nrq = (nrq ?:1); +- ntq = (ntq ?:1); +- +- adapter->ring_feature[RING_F_DCB].indices = dcb_i; +- adapter->ring_feature[RING_F_DCB].mask = dcb_m; +- adapter->ring_feature[RING_F_RSS].indices = rss_i; +- adapter->ring_feature[RING_F_RSS].mask = rss_m; +- break; +- default: +- nrq = 1; +- ntq = 1; +- break; +- } +- +- adapter->num_rx_queues = nrq; +- adapter->num_tx_queues = ntq; ++ /* Start with base case */ ++ adapter->num_rx_queues = 1; ++ adapter->num_tx_queues = 1; ++ adapter->num_rx_pools = adapter->num_rx_queues; ++ adapter->num_rx_queues_per_pool = 1; ++ ++ if (ixgbe_set_vmdq_queues(adapter)) ++ return; ++ ++ if (ixgbe_set_dcb_queues(adapter)) ++ return; ++ ++ if (ixgbe_set_fdir_queues(adapter)) ++ return; ++ ++ ++ if (ixgbe_set_rss_queues(adapter)) ++ return; + } + + static void ixgbe_acquire_msix_vectors(struct ixgbe_adapter *adapter, +@@ -2446,76 +4114,221 @@ + adapter->flags &= ~IXGBE_FLAG_MSIX_ENABLED; + kfree(adapter->msix_entries); + adapter->msix_entries = NULL; +- adapter->flags &= ~IXGBE_FLAG_DCB_ENABLED; +- adapter->flags &= ~IXGBE_FLAG_RSS_ENABLED; +- ixgbe_set_num_queues(adapter); + } else { + adapter->flags |= IXGBE_FLAG_MSIX_ENABLED; /* Woot! */ +- adapter->num_msix_vectors = vectors; +- } +-} +- +-/** +- * ixgbe_cache_ring_register - Descriptor ring to register mapping +- * @adapter: board private structure to initialize +- * +- * Once we know the feature-set enabled for the device, we'll cache +- * the register offset the descriptor ring is assigned to. +- **/ +-static void __devinit ixgbe_cache_ring_register(struct ixgbe_adapter *adapter) +-{ +- int feature_mask = 0, rss_i; +- int i, txr_idx, rxr_idx; +- int dcb_i; +- +- /* Number of supported queues */ +- switch (adapter->hw.mac.type) { +- case ixgbe_mac_82598EB: +- dcb_i = adapter->ring_feature[RING_F_DCB].indices; +- rss_i = adapter->ring_feature[RING_F_RSS].indices; +- txr_idx = 0; +- rxr_idx = 0; +- feature_mask |= IXGBE_FLAG_DCB_ENABLED; +- feature_mask |= IXGBE_FLAG_RSS_ENABLED; +- switch (adapter->flags & feature_mask) { +- case (IXGBE_FLAG_RSS_ENABLED | IXGBE_FLAG_DCB_ENABLED): +- for (i = 0; i < dcb_i; i++) { +- int j; +- /* Rx first */ +- for (j = 0; j < adapter->num_rx_queues; j++) { +- adapter->rx_ring[rxr_idx].reg_idx = +- i << 3 | j; +- rxr_idx++; +- } +- /* Tx now */ +- for (j = 0; j < adapter->num_tx_queues; j++) { +- adapter->tx_ring[txr_idx].reg_idx = +- i << 2 | (j >> 1); +- if (j & 1) +- txr_idx++; +- } +- } +- case (IXGBE_FLAG_DCB_ENABLED): +- /* the number of queues is assumed to be symmetric */ +- for (i = 0; i < dcb_i; i++) { +- adapter->rx_ring[i].reg_idx = i << 3; +- adapter->tx_ring[i].reg_idx = i << 2; +- } +- break; +- case (IXGBE_FLAG_RSS_ENABLED): ++ /* ++ * Adjust for only the vectors we'll use, which is minimum ++ * of max_msix_q_vectors + NON_Q_VECTORS, or the number of ++ * vectors we were allocated. ++ */ ++ adapter->num_msix_vectors = min(vectors, ++ adapter->max_msix_q_vectors + NON_Q_VECTORS); ++ } ++} ++ ++/** ++ * ixgbe_cache_ring_rss - Descriptor ring to register mapping for RSS ++ * @adapter: board private structure to initialize ++ * ++ * Cache the descriptor ring offsets for RSS to the assigned rings. ++ * ++ **/ ++static inline bool ixgbe_cache_ring_rss(struct ixgbe_adapter *adapter) ++{ ++ int i; ++ ++ if (!(adapter->flags & IXGBE_FLAG_RSS_ENABLED)) ++ return false; ++ ++ for (i = 0; i < adapter->num_rx_queues; i++) ++ adapter->rx_ring[i].reg_idx = i; ++ for (i = 0; i < adapter->num_tx_queues; i++) ++ adapter->tx_ring[i].reg_idx = i; ++ ++ return true; ++} ++ ++/** ++ * ixgbe_cache_ring_dcb - Descriptor ring to register mapping for DCB ++ * @adapter: board private structure to initialize ++ * ++ * Cache the descriptor ring offsets for DCB to the assigned rings. ++ * ++ **/ ++static inline bool ixgbe_cache_ring_dcb(struct ixgbe_adapter *adapter) ++{ ++ int i; ++ bool ret = false; ++ int dcb_i = adapter->ring_feature[RING_F_DCB].indices; ++ ++ if (!(adapter->flags & IXGBE_FLAG_DCB_ENABLED)) ++ return false; ++ ++ /* the number of queues is assumed to be symmetric */ ++ if (adapter->hw.mac.type == ixgbe_mac_82598EB) { ++ for (i = 0; i < dcb_i; i++) { ++ adapter->rx_ring[i].reg_idx = i << 3; ++ adapter->tx_ring[i].reg_idx = i << 2; ++ } ++ ret = true; ++ } else if (adapter->hw.mac.type == ixgbe_mac_82599EB) { ++ if (dcb_i == 8) { ++ /* ++ * Tx TC0 starts at: descriptor queue 0 ++ * Tx TC1 starts at: descriptor queue 32 ++ * Tx TC2 starts at: descriptor queue 64 ++ * Tx TC3 starts at: descriptor queue 80 ++ * Tx TC4 starts at: descriptor queue 96 ++ * Tx TC5 starts at: descriptor queue 104 ++ * Tx TC6 starts at: descriptor queue 112 ++ * Tx TC7 starts at: descriptor queue 120 ++ * ++ * Rx TC0-TC7 are offset by 16 queues each ++ */ ++ for (i = 0; i < 3; i++) { ++ adapter->tx_ring[i].reg_idx = i << 5; ++ adapter->rx_ring[i].reg_idx = i << 4; ++ } ++ for ( ; i < 5; i++) { ++ adapter->tx_ring[i].reg_idx = ((i + 2) << 4); ++ adapter->rx_ring[i].reg_idx = i << 4; ++ } ++ for ( ; i < dcb_i; i++) { ++ adapter->tx_ring[i].reg_idx = ((i + 8) << 3); ++ adapter->rx_ring[i].reg_idx = i << 4; ++ } ++ ret = true; ++ } else if (dcb_i == 4) { ++ /* ++ * Tx TC0 starts at: descriptor queue 0 ++ * Tx TC1 starts at: descriptor queue 64 ++ * Tx TC2 starts at: descriptor queue 96 ++ * Tx TC3 starts at: descriptor queue 112 ++ * ++ * Rx TC0-TC3 are offset by 32 queues each ++ */ ++ adapter->tx_ring[0].reg_idx = 0; ++ adapter->tx_ring[1].reg_idx = 64; ++ adapter->tx_ring[2].reg_idx = 96; ++ adapter->tx_ring[3].reg_idx = 112; ++ for (i = 0 ; i < dcb_i; i++) ++ adapter->rx_ring[i].reg_idx = i << 5; ++ ret = true; ++ } ++ } ++ ++ return ret; ++} ++ ++/** ++ * ixgbe_cache_ring_vmdq - Descriptor ring to register mapping for VMDq ++ * @adapter: board private structure to initialize ++ * ++ * Cache the descriptor ring offsets for VMDq to the assigned rings. It ++ * will also try to cache the proper offsets if RSS is enabled along with ++ * VMDq. ++ * ++ **/ ++static inline bool ixgbe_cache_ring_vmdq(struct ixgbe_adapter *adapter) ++{ ++ int i; ++ bool ret = false; ++ ++ switch (adapter->flags & ++ (IXGBE_FLAG_RSS_ENABLED | IXGBE_FLAG_VMDQ_ENABLED)) { ++ ++ case (IXGBE_FLAG_RSS_ENABLED | IXGBE_FLAG_VMDQ_ENABLED): ++ if (adapter->hw.mac.type == ixgbe_mac_82599EB) { ++ /* since the # of rss queues per vmdq pool is ++ * limited to either 2 or 4, there is no index ++ * skipping and we can set them up with no ++ * funky mapping ++ */ + for (i = 0; i < adapter->num_rx_queues; i++) + adapter->rx_ring[i].reg_idx = i; + for (i = 0; i < adapter->num_tx_queues; i++) + adapter->tx_ring[i].reg_idx = i; +- break; +- case 0: +- default: +- break; +- } +- break; +- default: +- break; +- } ++ ret = true; ++ } ++ break; ++ ++ case (IXGBE_FLAG_VMDQ_ENABLED): ++ if (adapter->hw.mac.type == ixgbe_mac_82598EB) { ++ for (i = 0; i < adapter->num_rx_queues; i++) ++ adapter->rx_ring[i].reg_idx = i; ++ for (i = 0; i < adapter->num_tx_queues; i++) ++ adapter->tx_ring[i].reg_idx = i; ++ ret = true; ++ } else if (adapter->hw.mac.type == ixgbe_mac_82599EB) { ++ /* even without rss, there are 2 queues per ++ * pool, the odd numbered ones are unused. ++ */ ++ for (i = 0; i < adapter->num_rx_queues; i++) ++ adapter->rx_ring[i].reg_idx = i * 2; ++ for (i = 0; i < adapter->num_tx_queues; i++) ++ adapter->tx_ring[i].reg_idx = i * 2; ++ ret = true; ++ } ++ break; ++ } ++ ++ return ret; ++} ++ ++/** ++ * ixgbe_cache_ring_fdir - Descriptor ring to register mapping for Flow Director ++ * @adapter: board private structure to initialize ++ * ++ * Cache the descriptor ring offsets for Flow Director to the assigned rings. ++ * ++ **/ ++static bool inline ixgbe_cache_ring_fdir(struct ixgbe_adapter *adapter) ++{ ++ int i; ++ bool ret = false; ++ ++ if (adapter->flags & IXGBE_FLAG_RSS_ENABLED && ++ ((adapter->flags & IXGBE_FLAG_FDIR_HASH_CAPABLE) || ++ (adapter->flags & IXGBE_FLAG_FDIR_PERFECT_CAPABLE))) { ++ for (i = 0; i < adapter->num_rx_queues; i++) ++ adapter->rx_ring[i].reg_idx = i; ++ for (i = 0; i < adapter->num_tx_queues; i++) ++ adapter->tx_ring[i].reg_idx = i; ++ ret = true; ++ } ++ ++ return ret; ++} ++ ++/** ++ * ixgbe_cache_ring_register - Descriptor ring to register mapping ++ * @adapter: board private structure to initialize ++ * ++ * Once we know the feature-set enabled for the device, we'll cache ++ * the register offset the descriptor ring is assigned to. ++ * ++ * Note, the order the various feature calls is important. It must start with ++ * the "most" features enabled at the same time, then trickle down to the ++ * least amount of features turned on at once. ++ **/ ++static void ixgbe_cache_ring_register(struct ixgbe_adapter *adapter) ++{ ++ /* start with default case */ ++ adapter->rx_ring[0].reg_idx = 0; ++ adapter->tx_ring[0].reg_idx = 0; ++ ++ if (ixgbe_cache_ring_vmdq(adapter)) ++ return; ++ ++ if (ixgbe_cache_ring_dcb(adapter)) ++ return; ++ ++ if (ixgbe_cache_ring_fdir(adapter)) ++ return; ++ ++ if (ixgbe_cache_ring_rss(adapter)) ++ return; ++ + } + + /** +@@ -2537,12 +4350,15 @@ + + adapter->rx_ring = kcalloc(adapter->num_rx_queues, + sizeof(struct ixgbe_ring), GFP_KERNEL); ++ + if (!adapter->rx_ring) + goto err_rx_ring_allocation; + + for (i = 0; i < adapter->num_tx_queues; i++) { + adapter->tx_ring[i].count = adapter->tx_ring_count; + adapter->tx_ring[i].queue_index = i; ++ adapter->tx_ring[i].atr_sample_rate = adapter->atr_sample_rate; ++ adapter->tx_ring[i].atr_count = 0; + } + + for (i = 0; i < adapter->num_rx_queues; i++) { +@@ -2569,8 +4385,12 @@ + **/ + static int ixgbe_set_interrupt_capability(struct ixgbe_adapter *adapter) + { ++ struct ixgbe_hw *hw = &adapter->hw; + int err = 0; + int vector, v_budget; ++ ++ if (!(adapter->flags & IXGBE_FLAG_MSIX_CAPABLE)) ++ goto try_msi; + + /* + * It's easy to be greedy for MSI-X vectors, but it really +@@ -2583,60 +4403,177 @@ + + /* + * At the same time, hardware can only support a maximum of +- * MAX_MSIX_COUNT vectors. With features such as RSS and VMDq, +- * we can easily reach upwards of 64 Rx descriptor queues and +- * 32 Tx queues. Thus, we cap it off in those rare cases where +- * the cpu count also exceeds our vector limit. +- */ +- v_budget = min(v_budget, MAX_MSIX_COUNT); ++ * hw.mac->max_msix_vectors vectors. With features ++ * such as RSS and VMDq, we can easily surpass the number of Rx and Tx ++ * descriptor queues supported by our device. Thus, we cap it off in ++ * those rare cases where the cpu count also exceeds our vector limit. ++ */ ++ v_budget = min(v_budget, (int)hw->mac.max_msix_vectors); + + /* A failure in MSI-X entry allocation isn't fatal, but it does + * mean we disable MSI-X capabilities of the adapter. */ + adapter->msix_entries = kcalloc(v_budget, + sizeof(struct msix_entry), GFP_KERNEL); +- if (!adapter->msix_entries) { +- adapter->flags &= ~IXGBE_FLAG_DCB_ENABLED; +- adapter->flags &= ~IXGBE_FLAG_RSS_ENABLED; +- ixgbe_set_num_queues(adapter); +- kfree(adapter->tx_ring); +- kfree(adapter->rx_ring); +- err = ixgbe_alloc_queues(adapter); +- if (err) { +- DPRINTK(PROBE, ERR, "Unable to allocate memory " +- "for queues\n"); ++ if (adapter->msix_entries) { ++ for (vector = 0; vector < v_budget; vector++) ++ adapter->msix_entries[vector].entry = vector; ++ ++ ixgbe_acquire_msix_vectors(adapter, v_budget); ++ ++ if (adapter->flags & IXGBE_FLAG_MSIX_ENABLED) + goto out; +- } +- +- goto try_msi; +- } +- +- for (vector = 0; vector < v_budget; vector++) +- adapter->msix_entries[vector].entry = vector; +- +- ixgbe_acquire_msix_vectors(adapter, v_budget); +- +- if (adapter->flags & IXGBE_FLAG_MSIX_ENABLED) ++ ++ } ++ ++ adapter->flags &= ~IXGBE_FLAG_DCB_ENABLED; ++ adapter->flags &= ~IXGBE_FLAG_DCB_CAPABLE; ++ adapter->flags &= ~IXGBE_FLAG_FDIR_HASH_CAPABLE; ++ adapter->flags &= ~IXGBE_FLAG_FDIR_PERFECT_CAPABLE; ++ adapter->atr_sample_rate = 0; ++ adapter->flags &= ~IXGBE_FLAG_VMDQ_ENABLED; ++ adapter->flags &= ~IXGBE_FLAG_RSS_ENABLED; ++ ixgbe_set_num_queues(adapter); ++ ++try_msi: ++ if (!(adapter->flags & IXGBE_FLAG_MSI_CAPABLE)) + goto out; + +-try_msi: + err = pci_enable_msi(adapter->pdev); + if (!err) { + adapter->flags |= IXGBE_FLAG_MSI_ENABLED; + } else { + DPRINTK(HW, DEBUG, "Unable to allocate MSI interrupt, " +- "falling back to legacy. Error: %d\n", err); ++ "falling back to legacy. Error: %d\n", err); + /* reset err */ + err = 0; + } + + out: ++#ifdef HAVE_TX_MQ + /* Notify the stack of the (possibly) reduced Tx Queue count. */ ++#ifdef CONFIG_NETDEVICES_MULTIQUEUE ++ adapter->netdev->egress_subqueue_count = adapter->num_tx_queues; ++#else + adapter->netdev->real_num_tx_queues = adapter->num_tx_queues; +- +- return err; +-} +- +-void ixgbe_reset_interrupt_capability(struct ixgbe_adapter *adapter) ++#endif ++#endif /* HAVE_TX_MQ */ ++ return err; ++} ++ ++/** ++ * ixgbe_alloc_q_vectors - Allocate memory for interrupt vectors ++ * @adapter: board private structure to initialize ++ * ++ * We allocate one q_vector per queue interrupt. If allocation fails we ++ * return -ENOMEM. ++ **/ ++static int ixgbe_alloc_q_vectors(struct ixgbe_adapter *adapter) ++{ ++ int v_idx, num_q_vectors; ++ struct ixgbe_q_vector *q_vector; ++ int rx_vectors; ++#ifdef CONFIG_IXGBE_NAPI ++ int (*poll)(struct napi_struct *, int); ++#endif ++ ++ if (adapter->flags & IXGBE_FLAG_MSIX_ENABLED) { ++ num_q_vectors = adapter->num_msix_vectors - NON_Q_VECTORS; ++ rx_vectors = adapter->num_rx_queues; ++#ifdef CONFIG_IXGBE_NAPI ++ poll = &ixgbe_clean_rxtx_many; ++#endif ++ } else { ++ num_q_vectors = 1; ++ rx_vectors = 1; ++#ifdef CONFIG_IXGBE_NAPI ++ poll = &ixgbe_poll; ++#endif ++ } ++ ++ for (v_idx = 0; v_idx < num_q_vectors; v_idx++) { ++ q_vector = kzalloc(sizeof(struct ixgbe_q_vector), GFP_KERNEL); ++ if (!q_vector) ++ goto err_out; ++ q_vector->adapter = adapter; ++ q_vector->eitr = adapter->eitr_param; ++ q_vector->v_idx = v_idx; ++#ifndef IXGBE_NO_LRO ++ if (v_idx < rx_vectors) { ++ int size = sizeof(struct ixgbe_lro_list); ++ q_vector->lrolist = vmalloc(size); ++ if (!q_vector->lrolist) { ++ kfree(q_vector); ++ goto err_out; ++ } ++ memset(q_vector->lrolist, 0, size); ++ ixgbe_lro_ring_init(q_vector->lrolist); ++ } ++#endif ++#ifdef CONFIG_IXGBE_NAPI ++ netif_napi_add(adapter->netdev, &q_vector->napi, (*poll), 64); ++#endif ++ adapter->q_vector[v_idx] = q_vector; ++ } ++ ++ return 0; ++ ++err_out: ++ while (v_idx) { ++ v_idx--; ++ q_vector = adapter->q_vector[v_idx]; ++#ifdef CONFIG_IXGBE_NAPI ++ netif_napi_del(&q_vector->napi); ++#endif ++#ifndef IXGBE_NO_LRO ++ if (q_vector->lrolist) { ++ ixgbe_lro_ring_exit(q_vector->lrolist); ++ vfree(q_vector->lrolist); ++ q_vector->lrolist = NULL; ++ } ++#endif ++ kfree(q_vector); ++ adapter->q_vector[v_idx] = NULL; ++ } ++ return -ENOMEM; ++} ++ ++/** ++ * ixgbe_free_q_vectors - Free memory allocated for interrupt vectors ++ * @adapter: board private structure to initialize ++ * ++ * This function frees the memory allocated to the q_vectors. In addition if ++ * NAPI is enabled it will delete any references to the NAPI struct prior ++ * to freeing the q_vector. ++ **/ ++static void ixgbe_free_q_vectors(struct ixgbe_adapter *adapter) ++{ ++ int v_idx, num_q_vectors; ++ ++ if (adapter->flags & IXGBE_FLAG_MSIX_ENABLED) { ++ num_q_vectors = adapter->num_msix_vectors - NON_Q_VECTORS; ++ } else { ++ num_q_vectors = 1; ++ } ++ ++ for (v_idx = 0; v_idx < num_q_vectors; v_idx++) { ++ struct ixgbe_q_vector *q_vector = adapter->q_vector[v_idx]; ++ ++ adapter->q_vector[v_idx] = NULL; ++#ifdef CONFIG_IXGBE_NAPI ++ netif_napi_del(&q_vector->napi); ++#endif ++#ifndef IXGBE_NO_LRO ++ if (q_vector->lrolist) { ++ ixgbe_lro_ring_exit(q_vector->lrolist); ++ vfree(q_vector->lrolist); ++ q_vector->lrolist = NULL; ++ } ++#endif ++ kfree(q_vector); ++ } ++} ++ ++static void ixgbe_reset_interrupt_capability(struct ixgbe_adapter *adapter) + { + if (adapter->flags & IXGBE_FLAG_MSIX_ENABLED) { + adapter->flags &= ~IXGBE_FLAG_MSIX_ENABLED; +@@ -2667,32 +4604,57 @@ + /* Number of supported queues */ + ixgbe_set_num_queues(adapter); + ++ err = ixgbe_set_interrupt_capability(adapter); ++ if (err) { ++ DPRINTK(PROBE, ERR, "Unable to setup interrupt capabilities\n"); ++ goto err_set_interrupt; ++ } ++ ++ err = ixgbe_alloc_q_vectors(adapter); ++ if (err) { ++ DPRINTK(PROBE, ERR, "Unable to allocate memory for queue " ++ "vectors\n"); ++ goto err_alloc_q_vectors; ++ } ++ + err = ixgbe_alloc_queues(adapter); + if (err) { + DPRINTK(PROBE, ERR, "Unable to allocate memory for queues\n"); + goto err_alloc_queues; + } + +- err = ixgbe_set_interrupt_capability(adapter); +- if (err) { +- DPRINTK(PROBE, ERR, "Unable to setup interrupt capabilities\n"); +- goto err_set_interrupt; +- } +- + DPRINTK(DRV, INFO, "Multiqueue %s: Rx Queue count = %u, " +- "Tx Queue count = %u\n", ++ "Tx Queue count = %u\n", + (adapter->num_rx_queues > 1) ? "Enabled" : + "Disabled", adapter->num_rx_queues, adapter->num_tx_queues); + + set_bit(__IXGBE_DOWN, &adapter->state); + + return 0; +- ++err_alloc_queues: ++ ixgbe_free_q_vectors(adapter); ++err_alloc_q_vectors: ++ ixgbe_reset_interrupt_capability(adapter); + err_set_interrupt: ++ return err; ++} ++ ++/** ++ * ixgbe_clear_interrupt_scheme - Clear the current interrupt scheme settings ++ * @adapter: board private structure to clear interrupt scheme on ++ * ++ * We go through and clear interrupt specific resources and reset the structure ++ * to pre-load conditions ++ **/ ++void ixgbe_clear_interrupt_scheme(struct ixgbe_adapter *adapter) ++{ + kfree(adapter->tx_ring); + kfree(adapter->rx_ring); +-err_alloc_queues: +- return err; ++ adapter->tx_ring = NULL; ++ adapter->rx_ring = NULL; ++ ++ ixgbe_free_q_vectors(adapter); ++ ixgbe_reset_interrupt_capability(adapter); + } + + /** +@@ -2715,25 +4677,26 @@ + static void ixgbe_sfp_task(struct work_struct *work) + { + struct ixgbe_adapter *adapter = container_of(work, +- struct ixgbe_adapter, +- sfp_task); ++ struct ixgbe_adapter, ++ sfp_task); + struct ixgbe_hw *hw = &adapter->hw; + + if ((hw->phy.type == ixgbe_phy_nl) && + (hw->phy.sfp_type == ixgbe_sfp_type_not_present)) { + s32 ret = hw->phy.ops.identify_sfp(hw); +- if (ret) ++ if (ret && ret != IXGBE_ERR_SFP_NOT_SUPPORTED) + goto reschedule; + ret = hw->phy.ops.reset(hw); + if (ret == IXGBE_ERR_SFP_NOT_SUPPORTED) { + DPRINTK(PROBE, ERR, "failed to initialize because an " +- "unsupported SFP+ module type was detected.\n" +- "Reload the driver after installing a " +- "supported module.\n"); ++ "unsupported SFP+ module type was detected.\n" ++ "Reload the driver after installing a " ++ "supported module.\n"); + unregister_netdev(adapter->netdev); ++ adapter->netdev_registered = false; + } else { + DPRINTK(PROBE, INFO, "detected SFP+: %d\n", +- hw->phy.sfp_type); ++ hw->phy.sfp_type); + } + /* don't need this routine any more */ + clear_bit(__IXGBE_SFP_MODULE_NOT_FOUND, &adapter->state); +@@ -2742,7 +4705,7 @@ + reschedule: + if (test_bit(__IXGBE_SFP_MODULE_NOT_FOUND, &adapter->state)) + mod_timer(&adapter->sfp_timer, +- round_jiffies(jiffies + (2 * HZ))); ++ round_jiffies(jiffies + (2 * HZ))); + } + + /** +@@ -2757,62 +4720,102 @@ + { + struct ixgbe_hw *hw = &adapter->hw; + struct pci_dev *pdev = adapter->pdev; +- unsigned int rss; +-#ifdef CONFIG_IXGBE_DCB +- int j; +- struct tc_configuration *tc; +-#endif /* CONFIG_IXGBE_DCB */ ++ int err; + + /* PCI config space info */ + + hw->vendor_id = pdev->vendor; + hw->device_id = pdev->device; +- hw->revision_id = pdev->revision; ++ pci_read_config_byte(pdev, PCI_REVISION_ID, &hw->revision_id); + hw->subsystem_vendor_id = pdev->subsystem_vendor; + hw->subsystem_device_id = pdev->subsystem_device; + ++ err = ixgbe_init_shared_code(hw); ++ if (err) { ++ DPRINTK(PROBE, ERR, "init_shared_code failed: %d\n", err); ++ goto out; ++ } ++ + /* Set capability flags */ +- rss = min(IXGBE_MAX_RSS_INDICES, (int)num_online_cpus()); +- adapter->ring_feature[RING_F_RSS].indices = rss; +- adapter->flags |= IXGBE_FLAG_RSS_ENABLED; +- if (hw->mac.ops.get_media_type && +- (hw->mac.ops.get_media_type(hw) == ixgbe_media_type_copper)) +- adapter->flags |= IXGBE_FLAG_FAN_FAIL_CAPABLE; +- adapter->ring_feature[RING_F_DCB].indices = IXGBE_MAX_DCB_INDICES; +- +-#ifdef CONFIG_IXGBE_DCB +- /* Configure DCB traffic classes */ +- for (j = 0; j < MAX_TRAFFIC_CLASS; j++) { +- tc = &adapter->dcb_cfg.tc_config[j]; +- tc->path[DCB_TX_CONFIG].bwg_id = 0; +- tc->path[DCB_TX_CONFIG].bwg_percent = 12 + (j & 1); +- tc->path[DCB_RX_CONFIG].bwg_id = 0; +- tc->path[DCB_RX_CONFIG].bwg_percent = 12 + (j & 1); +- tc->dcb_pfc = pfc_disabled; +- } +- adapter->dcb_cfg.bw_percentage[DCB_TX_CONFIG][0] = 100; +- adapter->dcb_cfg.bw_percentage[DCB_RX_CONFIG][0] = 100; +- adapter->dcb_cfg.rx_pba_cfg = pba_equal; +- adapter->dcb_cfg.round_robin_enable = false; +- adapter->dcb_set_bitmap = 0x00; ++ switch (hw->mac.type) { ++ case ixgbe_mac_82598EB: ++ if (hw->device_id == IXGBE_DEV_ID_82598AT) ++ adapter->flags |= IXGBE_FLAG_FAN_FAIL_CAPABLE; ++ adapter->flags |= IXGBE_FLAG_DCA_CAPABLE; ++ adapter->flags |= IXGBE_FLAG_MSI_CAPABLE; ++ adapter->flags |= IXGBE_FLAG_MSIX_CAPABLE; ++ if (adapter->flags & IXGBE_FLAG_MSIX_CAPABLE) ++ adapter->flags |= IXGBE_FLAG_MQ_CAPABLE; ++ if (adapter->flags & IXGBE_FLAG_MQ_CAPABLE) ++ adapter->flags |= IXGBE_FLAG_DCB_CAPABLE; ++#ifdef IXGBE_RSS ++ if (adapter->flags & IXGBE_FLAG_MQ_CAPABLE) ++ adapter->flags |= IXGBE_FLAG_RSS_CAPABLE; ++#endif ++ if (adapter->flags & IXGBE_FLAG_MQ_CAPABLE) ++ adapter->flags |= IXGBE_FLAG_VMDQ_CAPABLE; ++#ifndef IXGBE_NO_HW_RSC ++ adapter->flags2 &= ~IXGBE_FLAG2_RSC_CAPABLE; ++#endif ++ adapter->max_msix_q_vectors = IXGBE_MAX_MSIX_Q_VECTORS_82598; ++ break; ++ case ixgbe_mac_82599EB: ++#ifndef IXGBE_NO_HW_RSC ++ adapter->flags2 |= IXGBE_FLAG2_RSC_CAPABLE; ++#endif ++ adapter->flags |= IXGBE_FLAG_DCA_CAPABLE; ++ adapter->flags |= IXGBE_FLAG_MSI_CAPABLE; ++ adapter->flags |= IXGBE_FLAG_MSIX_CAPABLE; ++ if (adapter->flags & IXGBE_FLAG_MSIX_CAPABLE) ++ adapter->flags |= IXGBE_FLAG_MQ_CAPABLE; ++ if (adapter->flags & IXGBE_FLAG_MQ_CAPABLE) ++ adapter->flags |= IXGBE_FLAG_DCB_CAPABLE; ++#ifdef IXGBE_RSS ++ if (adapter->flags & IXGBE_FLAG_MQ_CAPABLE) ++ adapter->flags |= IXGBE_FLAG_RSS_CAPABLE; ++#endif ++ if (adapter->flags & IXGBE_FLAG_MQ_CAPABLE) ++ adapter->flags |= IXGBE_FLAG_VMDQ_CAPABLE; ++ adapter->max_msix_q_vectors = IXGBE_MAX_MSIX_Q_VECTORS_82599; ++ break; ++ default: ++ break; ++ } ++ ++ /* Default DCB settings, if applicable */ ++ adapter->ring_feature[RING_F_DCB].indices = 8; ++ if (adapter->flags & IXGBE_FLAG_DCB_CAPABLE) { ++ int j; ++ struct tc_configuration *tc; ++ for (j = 0; j < MAX_TRAFFIC_CLASS; j++) { ++ tc = &adapter->dcb_cfg.tc_config[j]; ++ tc->path[DCB_TX_CONFIG].bwg_id = 0; ++ tc->path[DCB_TX_CONFIG].bwg_percent = 12 + (j & 1); ++ tc->path[DCB_RX_CONFIG].bwg_id = 0; ++ tc->path[DCB_RX_CONFIG].bwg_percent = 12 + (j & 1); ++ tc->dcb_pfc = pfc_disabled; ++ } ++ adapter->dcb_cfg.bw_percentage[DCB_TX_CONFIG][0] = 100; ++ adapter->dcb_cfg.bw_percentage[DCB_RX_CONFIG][0] = 100; ++ adapter->dcb_cfg.rx_pba_cfg = pba_equal; ++ adapter->dcb_cfg.pfc_mode_enable = false; ++ adapter->dcb_cfg.round_robin_enable = false; ++ adapter->dcb_set_bitmap = 0x00; ++ } ++#ifdef CONFIG_DCB + ixgbe_copy_dcb_cfg(&adapter->dcb_cfg, &adapter->temp_dcb_cfg, + adapter->ring_feature[RING_F_DCB].indices); +-#endif /* CONFIG_IXGBE_DCB */ ++#endif + + /* default flow control settings */ +- hw->fc.original_type = ixgbe_fc_none; +- hw->fc.type = ixgbe_fc_none; ++ hw->fc.requested_mode = ixgbe_fc_full; ++ hw->fc.current_mode = ixgbe_fc_full; /* init for ethtool output */ ++ adapter->last_lfc_mode = hw->fc.current_mode; + hw->fc.high_water = IXGBE_DEFAULT_FCRTH; + hw->fc.low_water = IXGBE_DEFAULT_FCRTL; + hw->fc.pause_time = IXGBE_DEFAULT_FCPAUSE; + hw->fc.send_xon = true; +- +- /* select 10G link by default */ +- hw->mac.link_mode_select = IXGBE_AUTOC_LMS_10G_LINK_NO_AN; +- +- /* enable itr by default in dynamic mode */ +- adapter->itr_setting = 1; +- adapter->eitr_param = 20000; ++ hw->fc.disable_fc_autoneg = false; + + /* set defaults for eitr in MegaBytes */ + adapter->eitr_low = 10; +@@ -2822,18 +4825,12 @@ + adapter->tx_ring_count = IXGBE_DEFAULT_TXD; + adapter->rx_ring_count = IXGBE_DEFAULT_RXD; + +- /* initialize eeprom parameters */ +- if (ixgbe_init_eeprom_params_generic(hw)) { +- dev_err(&pdev->dev, "EEPROM initialization failed\n"); +- return -EIO; +- } +- + /* enable rx csum by default */ + adapter->flags |= IXGBE_FLAG_RX_CSUM_ENABLED; + + set_bit(__IXGBE_DOWN, &adapter->state); +- +- return 0; ++out: ++ return err; + } + + /** +@@ -2856,8 +4853,7 @@ + memset(tx_ring->tx_buffer_info, 0, size); + + /* round up to nearest 4K */ +- tx_ring->size = tx_ring->count * sizeof(union ixgbe_adv_tx_desc) + +- sizeof(u32); ++ tx_ring->size = tx_ring->count * sizeof(union ixgbe_adv_tx_desc); + tx_ring->size = ALIGN(tx_ring->size, 4096); + + tx_ring->desc = pci_alloc_consistent(pdev, tx_ring->size, +@@ -2899,7 +4895,6 @@ + DPRINTK(PROBE, ERR, "Allocation for Tx Queue %u failed\n", i); + break; + } +- + return err; + } + +@@ -2916,18 +4911,12 @@ + struct pci_dev *pdev = adapter->pdev; + int size; + +-#ifdef CONFIG_IXGBE_LRO +- size = sizeof(struct net_lro_desc) * IXGBE_MAX_LRO_DESCRIPTORS; +- rx_ring->lro_mgr.lro_arr = vmalloc(size); +- if (!rx_ring->lro_mgr.lro_arr) +- return -ENOMEM; +- memset(rx_ring->lro_mgr.lro_arr, 0, size); +-#endif + size = sizeof(struct ixgbe_rx_buffer) * rx_ring->count; + rx_ring->rx_buffer_info = vmalloc(size); + if (!rx_ring->rx_buffer_info) { + DPRINTK(PROBE, ERR, +- "vmalloc allocation failed for the rx desc ring\n"); ++ "Unable to vmalloc buffer memory for " ++ "the receive descriptor ring\n"); + goto alloc_failed; + } + memset(rx_ring->rx_buffer_info, 0, size); +@@ -2940,21 +4929,21 @@ + + if (!rx_ring->desc) { + DPRINTK(PROBE, ERR, +- "Memory allocation failed for the rx desc ring\n"); ++ "Unable to allocate memory for " ++ "the receive descriptor ring\n"); + vfree(rx_ring->rx_buffer_info); ++ rx_ring->rx_buffer_info = NULL; + goto alloc_failed; + } + + rx_ring->next_to_clean = 0; + rx_ring->next_to_use = 0; +- +- return 0; +- ++#ifndef CONFIG_IXGBE_NAPI ++ rx_ring->work_limit = rx_ring->count / 2; ++#endif ++ ++ return 0; + alloc_failed: +-#ifdef CONFIG_IXGBE_LRO +- vfree(rx_ring->lro_mgr.lro_arr); +- rx_ring->lro_mgr.lro_arr = NULL; +-#endif + return -ENOMEM; + } + +@@ -2968,7 +4957,6 @@ + * + * Return 0 on success, negative on failure + **/ +- + static int ixgbe_setup_all_rx_resources(struct ixgbe_adapter *adapter) + { + int i, err = 0; +@@ -2980,7 +4968,6 @@ + DPRINTK(PROBE, ERR, "Allocation for Rx Queue %u failed\n", i); + break; + } +- + return err; + } + +@@ -3017,7 +5004,8 @@ + int i; + + for (i = 0; i < adapter->num_tx_queues; i++) +- ixgbe_free_tx_resources(adapter, &adapter->tx_ring[i]); ++ if (adapter->tx_ring[i].desc) ++ ixgbe_free_tx_resources(adapter, &adapter->tx_ring[i]); + } + + /** +@@ -3032,11 +5020,6 @@ + { + struct pci_dev *pdev = adapter->pdev; + +-#ifdef CONFIG_IXGBE_LRO +- vfree(rx_ring->lro_mgr.lro_arr); +- rx_ring->lro_mgr.lro_arr = NULL; +-#endif +- + ixgbe_clean_rx_ring(adapter, rx_ring); + + vfree(rx_ring->rx_buffer_info); +@@ -3058,7 +5041,8 @@ + int i; + + for (i = 0; i < adapter->num_rx_queues; i++) +- ixgbe_free_rx_resources(adapter, &adapter->rx_ring[i]); ++ if (adapter->rx_ring[i].desc) ++ ixgbe_free_rx_resources(adapter, &adapter->rx_ring[i]); + } + + /** +@@ -3103,6 +5087,7 @@ + static int ixgbe_open(struct net_device *netdev) + { + struct ixgbe_adapter *adapter = netdev_priv(netdev); ++ struct ixgbe_hw *hw = &adapter->hw; + int err; + + /* disallow open during test */ +@@ -3121,26 +5106,48 @@ + + ixgbe_configure(adapter); + ++ /* ++ * Map the Tx/Rx rings to the vectors we were allotted. ++ * if request_irq will be called in this function map_rings ++ * must be called *before* up_complete ++ */ ++ ixgbe_map_rings_to_vectors(adapter); ++ ++ err = ixgbe_up_complete(adapter); ++ if (err) ++ goto err_setup_rx; ++ ++ /* clear any pending interrupts, may auto mask */ ++ IXGBE_READ_REG(hw, IXGBE_EICR); ++ + err = ixgbe_request_irq(adapter); + if (err) + goto err_req_irq; + +- err = ixgbe_up_complete(adapter); +- if (err) +- goto err_up; +- +- netif_tx_start_all_queues(netdev); +- +- return 0; +- +-err_up: ++ ixgbe_irq_enable(adapter, true, true); ++ ++ /* ++ * If this adapter has a fan, check to see if we had a failure ++ * before we enabled the interrupt. ++ */ ++ if (adapter->flags & IXGBE_FLAG_FAN_FAIL_CAPABLE) { ++ u32 esdp = IXGBE_READ_REG(hw, IXGBE_ESDP); ++ if (esdp & IXGBE_ESDP_SDP1) ++ DPRINTK(DRV, CRIT, ++ "Fan has stopped, replace the adapter\n"); ++ } ++ ++ ++ return 0; ++ ++err_req_irq: ++ ixgbe_down(adapter); + ixgbe_release_hw_control(adapter); + ixgbe_free_irq(adapter); +-err_req_irq: ++err_setup_rx: + ixgbe_free_all_rx_resources(adapter); +-err_setup_rx: ++err_setup_tx: + ixgbe_free_all_tx_resources(adapter); +-err_setup_tx: + ixgbe_reset(adapter); + + return err; +@@ -3172,49 +5179,6 @@ + return 0; + } + +-/** +- * ixgbe_napi_add_all - prep napi structs for use +- * @adapter: private struct +- * helper function to napi_add each possible q_vector->napi +- */ +-void ixgbe_napi_add_all(struct ixgbe_adapter *adapter) +-{ +- int q_idx, q_vectors; +- int (*poll)(struct napi_struct *, int); +- +- if (adapter->flags & IXGBE_FLAG_MSIX_ENABLED) { +- poll = &ixgbe_clean_rxonly; +- /* Only enable as many vectors as we have rx queues. */ +- q_vectors = adapter->num_rx_queues; +- } else { +- poll = &ixgbe_poll; +- /* only one q_vector for legacy modes */ +- q_vectors = 1; +- } +- +- for (q_idx = 0; q_idx < q_vectors; q_idx++) { +- struct ixgbe_q_vector *q_vector = &adapter->q_vector[q_idx]; +- netif_napi_add(adapter->netdev, &q_vector->napi, (*poll), 64); +- } +-} +- +-void ixgbe_napi_del_all(struct ixgbe_adapter *adapter) +-{ +- int q_idx; +- int q_vectors = adapter->num_msix_vectors - NON_Q_VECTORS; +- +- /* legacy and MSI only use one vector */ +- if (!(adapter->flags & IXGBE_FLAG_MSIX_ENABLED)) +- q_vectors = 1; +- +- for (q_idx = 0; q_idx < q_vectors; q_idx++) { +- struct ixgbe_q_vector *q_vector = &adapter->q_vector[q_idx]; +- if (!q_vector->rxr_count) +- continue; +- netif_napi_del(&q_vector->napi); +- } +-} +- + #ifdef CONFIG_PM + static int ixgbe_resume(struct pci_dev *pdev) + { +@@ -3227,23 +5191,23 @@ + err = pci_enable_device(pdev); + if (err) { + printk(KERN_ERR "ixgbe: Cannot enable PCI device from " +- "suspend\n"); ++ "suspend\n"); + return err; + } + pci_set_master(pdev); + +- pci_enable_wake(pdev, PCI_D3hot, 0); +- pci_enable_wake(pdev, PCI_D3cold, 0); ++ pci_wake_from_d3(pdev, false); + + err = ixgbe_init_interrupt_scheme(adapter); + if (err) { + printk(KERN_ERR "ixgbe: Cannot initialize interrupts for " +- "device\n"); ++ "device\n"); + return err; + } + +- ixgbe_napi_add_all(adapter); + ixgbe_reset(adapter); ++ ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_WUS, ~0); + + if (netif_running(netdev)) { + err = ixgbe_open(adapter->netdev); +@@ -3255,12 +5219,14 @@ + + return 0; + } +- + #endif /* CONFIG_PM */ +-static int ixgbe_suspend(struct pci_dev *pdev, pm_message_t state) ++static int __ixgbe_shutdown(struct pci_dev *pdev, bool *enable_wake) + { + struct net_device *netdev = pci_get_drvdata(pdev); + struct ixgbe_adapter *adapter = netdev_priv(netdev); ++ struct ixgbe_hw *hw = &adapter->hw; ++ u32 ctrl, fctrl; ++ u32 wufc = adapter->wol; + #ifdef CONFIG_PM + int retval = 0; + #endif +@@ -3273,34 +5239,84 @@ + ixgbe_free_all_tx_resources(adapter); + ixgbe_free_all_rx_resources(adapter); + } +- ixgbe_reset_interrupt_capability(adapter); +- ixgbe_napi_del_all(adapter); +- kfree(adapter->tx_ring); +- kfree(adapter->rx_ring); ++ ++ ixgbe_clear_interrupt_scheme(adapter); + + #ifdef CONFIG_PM + retval = pci_save_state(pdev); + if (retval) + return retval; +-#endif +- +- pci_enable_wake(pdev, PCI_D3hot, 0); +- pci_enable_wake(pdev, PCI_D3cold, 0); ++ ++#endif ++ if (wufc) { ++ ixgbe_set_rx_mode(netdev); ++ ++ /* turn on all-multi mode if wake on multicast is enabled */ ++ if (wufc & IXGBE_WUFC_MC) { ++ fctrl = IXGBE_READ_REG(hw, IXGBE_FCTRL); ++ fctrl |= IXGBE_FCTRL_MPE; ++ IXGBE_WRITE_REG(hw, IXGBE_FCTRL, fctrl); ++ } ++ ++ ctrl = IXGBE_READ_REG(hw, IXGBE_CTRL); ++ ctrl |= IXGBE_CTRL_GIO_DIS; ++ IXGBE_WRITE_REG(hw, IXGBE_CTRL, ctrl); ++ ++ IXGBE_WRITE_REG(hw, IXGBE_WUFC, wufc); ++ } else { ++ IXGBE_WRITE_REG(hw, IXGBE_WUC, 0); ++ IXGBE_WRITE_REG(hw, IXGBE_WUFC, 0); ++ } ++ ++ if (wufc && hw->mac.type == ixgbe_mac_82599EB) ++ pci_wake_from_d3(pdev, true); ++ else ++ pci_wake_from_d3(pdev, false); ++ ++ *enable_wake = !!wufc; + + ixgbe_release_hw_control(adapter); + + pci_disable_device(pdev); + +- pci_set_power_state(pdev, pci_choose_state(pdev, state)); +- +- return 0; +-} +- ++ return 0; ++} ++ ++#ifdef CONFIG_PM ++static int ixgbe_suspend(struct pci_dev *pdev, pm_message_t state) ++{ ++ int retval; ++ bool wake; ++ ++ retval = __ixgbe_shutdown(pdev, &wake); ++ if (retval) ++ return retval; ++ ++ if (wake) { ++ pci_prepare_to_sleep(pdev); ++ } else { ++ pci_wake_from_d3(pdev, false); ++ pci_set_power_state(pdev, PCI_D3hot); ++ } ++ ++ return 0; ++} ++#endif /* CONFIG_PM */ ++ ++#ifndef USE_REBOOT_NOTIFIER + static void ixgbe_shutdown(struct pci_dev *pdev) + { +- ixgbe_suspend(pdev, PMSG_SUSPEND); +-} +- ++ bool wake; ++ ++ __ixgbe_shutdown(pdev, &wake); ++ ++ if (system_state == SYSTEM_POWER_OFF) { ++ pci_wake_from_d3(pdev, wake); ++ pci_set_power_state(pdev, PCI_D3hot); ++ } ++} ++ ++#endif + /** + * ixgbe_update_stats - Update the board statistics counters. + * @adapter: board private structure +@@ -3310,7 +5326,37 @@ + struct ixgbe_hw *hw = &adapter->hw; + u64 total_mpc = 0; + u32 i, missed_rx = 0, mpc, bprc, lxon, lxoff, xon_off_tot; +- ++#ifndef IXGBE_NO_LRO ++ u32 flushed = 0, coal = 0, recycled = 0; ++ int num_q_vectors = 1; ++ ++ if (adapter->flags & IXGBE_FLAG_MSIX_ENABLED) ++ num_q_vectors = adapter->num_msix_vectors - NON_Q_VECTORS; ++#endif ++ ++ if (hw->mac.type == ixgbe_mac_82599EB) { ++ u64 rsc_count = 0; ++ for (i = 0; i < 16; i++) ++ adapter->hw_rx_no_dma_resources += IXGBE_READ_REG(hw, IXGBE_QPRDC(i)); ++ for (i = 0; i < adapter->num_rx_queues; i++) ++ rsc_count += adapter->rx_ring[i].rsc_count; ++ adapter->rsc_count = rsc_count; ++ } ++ ++#ifndef IXGBE_NO_LRO ++ for (i = 0; i < num_q_vectors; i++) { ++ struct ixgbe_q_vector *q_vector = adapter->q_vector[i]; ++ if (!q_vector || !q_vector->lrolist) ++ continue; ++ flushed += q_vector->lrolist->stats.flushed; ++ coal += q_vector->lrolist->stats.coal; ++ recycled += q_vector->lrolist->stats.recycled; ++ } ++ adapter->lro_stats.flushed = flushed; ++ adapter->lro_stats.coal = coal; ++ adapter->lro_stats.recycled = recycled; ++ ++#endif + adapter->stats.crcerrs += IXGBE_READ_REG(hw, IXGBE_CRCERRS); + for (i = 0; i < 8; i++) { + /* for packet buffers not used, the register should read 0 */ +@@ -3318,32 +5364,52 @@ + missed_rx += mpc; + adapter->stats.mpc[i] += mpc; + total_mpc += adapter->stats.mpc[i]; +- adapter->stats.rnbc[i] += IXGBE_READ_REG(hw, IXGBE_RNBC(i)); ++ if (hw->mac.type == ixgbe_mac_82598EB) ++ adapter->stats.rnbc[i] += IXGBE_READ_REG(hw, IXGBE_RNBC(i)); + adapter->stats.qptc[i] += IXGBE_READ_REG(hw, IXGBE_QPTC(i)); + adapter->stats.qbtc[i] += IXGBE_READ_REG(hw, IXGBE_QBTC(i)); + adapter->stats.qprc[i] += IXGBE_READ_REG(hw, IXGBE_QPRC(i)); + adapter->stats.qbrc[i] += IXGBE_READ_REG(hw, IXGBE_QBRC(i)); +- adapter->stats.pxonrxc[i] += IXGBE_READ_REG(hw, +- IXGBE_PXONRXC(i)); +- adapter->stats.pxontxc[i] += IXGBE_READ_REG(hw, +- IXGBE_PXONTXC(i)); +- adapter->stats.pxoffrxc[i] += IXGBE_READ_REG(hw, +- IXGBE_PXOFFRXC(i)); +- adapter->stats.pxofftxc[i] += IXGBE_READ_REG(hw, +- IXGBE_PXOFFTXC(i)); ++ if (hw->mac.type == ixgbe_mac_82599EB) { ++ adapter->stats.pxonrxc[i] += IXGBE_READ_REG(hw, ++ IXGBE_PXONRXCNT(i)); ++ adapter->stats.pxoffrxc[i] += IXGBE_READ_REG(hw, ++ IXGBE_PXOFFRXCNT(i)); ++ } else { ++ adapter->stats.pxonrxc[i] += IXGBE_READ_REG(hw, ++ IXGBE_PXONRXC(i)); ++ adapter->stats.pxoffrxc[i] += IXGBE_READ_REG(hw, ++ IXGBE_PXOFFRXC(i)); ++ } + } + adapter->stats.gprc += IXGBE_READ_REG(hw, IXGBE_GPRC); + /* work around hardware counting issue */ + adapter->stats.gprc -= missed_rx; + + /* 82598 hardware only has a 32 bit counter in the high register */ +- adapter->stats.gorc += IXGBE_READ_REG(hw, IXGBE_GORCH); +- adapter->stats.gotc += IXGBE_READ_REG(hw, IXGBE_GOTCH); +- adapter->stats.tor += IXGBE_READ_REG(hw, IXGBE_TORH); ++ if (hw->mac.type == ixgbe_mac_82599EB) { ++ adapter->stats.gorc += IXGBE_READ_REG(hw, IXGBE_GORCL); ++ IXGBE_READ_REG(hw, IXGBE_GORCH); /* to clear */ ++ adapter->stats.gotc += IXGBE_READ_REG(hw, IXGBE_GOTCL); ++ IXGBE_READ_REG(hw, IXGBE_GOTCH); /* to clear */ ++ adapter->stats.tor += IXGBE_READ_REG(hw, IXGBE_TORL); ++ IXGBE_READ_REG(hw, IXGBE_TORH); /* to clear */ ++ adapter->stats.lxonrxc += IXGBE_READ_REG(hw, IXGBE_LXONRXCNT); ++ adapter->stats.lxoffrxc += IXGBE_READ_REG(hw, IXGBE_LXOFFRXCNT); ++ adapter->stats.fdirmatch += IXGBE_READ_REG(hw, IXGBE_FDIRMATCH); ++ adapter->stats.fdirmiss += IXGBE_READ_REG(hw, IXGBE_FDIRMISS); ++ } else { ++ adapter->stats.lxonrxc += IXGBE_READ_REG(hw, IXGBE_LXONRXC); ++ adapter->stats.lxoffrxc += IXGBE_READ_REG(hw, IXGBE_LXOFFRXC); ++ adapter->stats.gorc += IXGBE_READ_REG(hw, IXGBE_GORCH); ++ adapter->stats.gotc += IXGBE_READ_REG(hw, IXGBE_GOTCH); ++ adapter->stats.tor += IXGBE_READ_REG(hw, IXGBE_TORH); ++ } + bprc = IXGBE_READ_REG(hw, IXGBE_BPRC); + adapter->stats.bprc += bprc; + adapter->stats.mprc += IXGBE_READ_REG(hw, IXGBE_MPRC); +- adapter->stats.mprc -= bprc; ++ if (hw->mac.type == ixgbe_mac_82598EB) ++ adapter->stats.mprc -= bprc; + adapter->stats.roc += IXGBE_READ_REG(hw, IXGBE_ROC); + adapter->stats.prc64 += IXGBE_READ_REG(hw, IXGBE_PRC64); + adapter->stats.prc127 += IXGBE_READ_REG(hw, IXGBE_PRC127); +@@ -3352,8 +5418,6 @@ + adapter->stats.prc1023 += IXGBE_READ_REG(hw, IXGBE_PRC1023); + adapter->stats.prc1522 += IXGBE_READ_REG(hw, IXGBE_PRC1522); + adapter->stats.rlec += IXGBE_READ_REG(hw, IXGBE_RLEC); +- adapter->stats.lxonrxc += IXGBE_READ_REG(hw, IXGBE_LXONRXC); +- adapter->stats.lxoffrxc += IXGBE_READ_REG(hw, IXGBE_LXOFFRXC); + lxon = IXGBE_READ_REG(hw, IXGBE_LXONTXC); + adapter->stats.lxontxc += lxon; + lxoff = IXGBE_READ_REG(hw, IXGBE_LXOFFTXC); +@@ -3401,28 +5465,132 @@ + { + struct ixgbe_adapter *adapter = (struct ixgbe_adapter *)data; + struct ixgbe_hw *hw = &adapter->hw; +- +- /* Do the watchdog outside of interrupt context due to the lovely +- * delays that some of the newer hardware requires */ +- if (!test_bit(__IXGBE_DOWN, &adapter->state)) { +- /* Cause software interrupt to ensure rx rings are cleaned */ +- if (adapter->flags & IXGBE_FLAG_MSIX_ENABLED) { +- u32 eics = +- (1 << (adapter->num_msix_vectors - NON_Q_VECTORS)) - 1; +- IXGBE_WRITE_REG(hw, IXGBE_EICS, eics); +- } else { +- /* For legacy and MSI interrupts don't set any bits that +- * are enabled for EIAM, because this operation would +- * set *both* EIMS and EICS for any bit in EIAM */ +- IXGBE_WRITE_REG(hw, IXGBE_EICS, +- (IXGBE_EICS_TCP_TIMER | IXGBE_EICS_OTHER)); +- } +- /* Reset the timer */ +- mod_timer(&adapter->watchdog_timer, +- round_jiffies(jiffies + 2 * HZ)); +- } +- ++ u64 eics = 0; ++ int i; ++ ++ /* ++ * Do the watchdog outside of interrupt context due to the lovely ++ * delays that some of the newer hardware requires ++ */ ++ ++ if (test_bit(__IXGBE_DOWN, &adapter->state)) ++ goto watchdog_short_circuit; ++ ++ ++ if (!(adapter->flags & IXGBE_FLAG_MSIX_ENABLED)) { ++ /* ++ * for legacy and MSI interrupts don't set any bits ++ * that are enabled for EIAM, because this operation ++ * would set *both* EIMS and EICS for any bit in EIAM ++ */ ++ IXGBE_WRITE_REG(hw, IXGBE_EICS, ++ (IXGBE_EICS_TCP_TIMER | IXGBE_EICS_OTHER)); ++ goto watchdog_reschedule; ++ } ++ ++ /* get one bit for every active tx/rx interrupt vector */ ++ for (i = 0; i < adapter->num_msix_vectors - NON_Q_VECTORS; i++) { ++ struct ixgbe_q_vector *qv = adapter->q_vector[i]; ++ if (qv->rxr_count || qv->txr_count) ++ eics |= ((u64)1 << i); ++ } ++ ++ /* Cause software interrupt to ensure rings are cleaned */ ++ ixgbe_irq_rearm_queues(adapter, eics); ++ ++watchdog_reschedule: ++ /* Reset the timer */ ++ mod_timer(&adapter->watchdog_timer, round_jiffies(jiffies + 2 * HZ)); ++ ++watchdog_short_circuit: + schedule_work(&adapter->watchdog_task); ++} ++ ++/** ++ * ixgbe_multispeed_fiber_task - worker thread to configure multispeed fiber ++ * @work: pointer to work_struct containing our data ++ **/ ++static void ixgbe_multispeed_fiber_task(struct work_struct *work) ++{ ++ struct ixgbe_adapter *adapter = container_of(work, ++ struct ixgbe_adapter, ++ multispeed_fiber_task); ++ struct ixgbe_hw *hw = &adapter->hw; ++ u32 autoneg; ++ ++ adapter->flags |= IXGBE_FLAG_IN_SFP_LINK_TASK; ++ if (hw->mac.ops.get_link_capabilities) ++ hw->mac.ops.get_link_capabilities(hw, &autoneg, ++ &hw->mac.autoneg); ++ if (hw->mac.ops.setup_link_speed) ++ hw->mac.ops.setup_link_speed(hw, autoneg, true, true); ++ adapter->flags |= IXGBE_FLAG_NEED_LINK_UPDATE; ++ adapter->flags &= ~IXGBE_FLAG_IN_SFP_LINK_TASK; ++} ++ ++/** ++ * ixgbe_sfp_config_module_task - worker thread to configure a new SFP+ module ++ * @work: pointer to work_struct containing our data ++ **/ ++static void ixgbe_sfp_config_module_task(struct work_struct *work) ++{ ++ struct ixgbe_adapter *adapter = container_of(work, ++ struct ixgbe_adapter, ++ sfp_config_module_task); ++ struct ixgbe_hw *hw = &adapter->hw; ++ u32 err; ++ ++ adapter->flags |= IXGBE_FLAG_IN_SFP_MOD_TASK; ++ err = hw->phy.ops.identify_sfp(hw); ++ if (err == IXGBE_ERR_SFP_NOT_SUPPORTED) { ++ DPRINTK(PROBE, ERR, "failed to load because an " ++ "unsupported SFP+ module type was detected.\n"); ++ unregister_netdev(adapter->netdev); ++ adapter->netdev_registered = false; ++ return; ++ } ++ /* ++ * A module may be identified correctly, but the EEPROM may not have ++ * support for that module. setup_sfp() will fail in that case, so ++ * we should not allow that module to load. ++ */ ++ err = hw->mac.ops.setup_sfp(hw); ++ if (err == IXGBE_ERR_SFP_NOT_SUPPORTED) { ++ DPRINTK(PROBE, ERR, "failed to load because an " ++ "unsupported SFP+ module type was detected.\n"); ++ unregister_netdev(adapter->netdev); ++ adapter->netdev_registered = false; ++ return; ++ } ++ ++ if (!(adapter->flags & IXGBE_FLAG_IN_SFP_LINK_TASK)) ++ /* This will also work for DA Twinax connections */ ++ schedule_work(&adapter->multispeed_fiber_task); ++ adapter->flags &= ~IXGBE_FLAG_IN_SFP_MOD_TASK; ++} ++ ++/** ++ * ixgbe_fdir_reinit_task - worker thread to reinit FDIR filter table ++ * @work: pointer to work_struct containing our data ++ **/ ++static void ixgbe_fdir_reinit_task(struct work_struct *work) ++{ ++ struct ixgbe_adapter *adapter = container_of(work, ++ struct ixgbe_adapter, ++ fdir_reinit_task); ++ struct ixgbe_hw *hw = &adapter->hw; ++ int i; ++ ++ if (ixgbe_reinit_fdir_tables_82599(hw) == 0) { ++ for (i = 0; i < adapter->num_tx_queues; i++) ++ set_bit(__IXGBE_FDIR_INIT_DONE, ++ &(adapter->tx_ring[i].reinit_state)); ++ } else { ++ DPRINTK(PROBE, ERR, "failed to finish FDIR re-initialization, " ++ "ignored adding FDIR ATR filters \n"); ++ } ++ /* Done FDIR Re-initialization, enable transmits */ ++ netif_tx_start_all_queues(adapter->netdev); + } + + /** +@@ -3438,16 +5606,34 @@ + struct ixgbe_hw *hw = &adapter->hw; + u32 link_speed = adapter->link_speed; + bool link_up = adapter->link_up; ++ int i; ++ struct ixgbe_ring *tx_ring; ++ int some_tx_pending = 0; + + adapter->flags |= IXGBE_FLAG_IN_WATCHDOG_TASK; + + if (adapter->flags & IXGBE_FLAG_NEED_LINK_UPDATE) { +- hw->mac.ops.check_link(hw, &link_speed, &link_up, false); ++ if (hw->mac.ops.check_link) { ++ hw->mac.ops.check_link(hw, &link_speed, &link_up, false); ++ } else { ++ /* always assume link is up, if no check link function */ ++ link_speed = IXGBE_LINK_SPEED_10GB_FULL; ++ link_up = true; ++ } ++ if (link_up) { ++ if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) { ++ for (i = 0; i < MAX_TRAFFIC_CLASS; i++) ++ hw->mac.ops.fc_enable(hw, i); ++ } else { ++ hw->mac.ops.fc_enable(hw, 0); ++ } ++ } ++ + if (link_up || + time_after(jiffies, (adapter->link_check_timeout + + IXGBE_TRY_LINK_TIMEOUT))) { ++ adapter->flags &= ~IXGBE_FLAG_NEED_LINK_UPDATE; + IXGBE_WRITE_REG(hw, IXGBE_EIMS, IXGBE_EIMC_LSC); +- adapter->flags &= ~IXGBE_FLAG_NEED_LINK_UPDATE; + } + adapter->link_up = link_up; + adapter->link_speed = link_speed; +@@ -3455,19 +5641,28 @@ + + if (link_up) { + if (!netif_carrier_ok(netdev)) { +- u32 frctl = IXGBE_READ_REG(hw, IXGBE_FCTRL); +- u32 rmcs = IXGBE_READ_REG(hw, IXGBE_RMCS); +-#define FLOW_RX (frctl & IXGBE_FCTRL_RFCE) +-#define FLOW_TX (rmcs & IXGBE_RMCS_TFCE_802_3X) ++ bool flow_rx, flow_tx; ++ ++ if (hw->mac.type == ixgbe_mac_82599EB) { ++ u32 mflcn = IXGBE_READ_REG(hw, IXGBE_MFLCN); ++ u32 fccfg = IXGBE_READ_REG(hw, IXGBE_FCCFG); ++ flow_rx = (mflcn & IXGBE_MFLCN_RFCE); ++ flow_tx = (fccfg & IXGBE_FCCFG_TFCE_802_3X); ++ } else { ++ u32 frctl = IXGBE_READ_REG(hw, IXGBE_FCTRL); ++ u32 rmcs = IXGBE_READ_REG(hw, IXGBE_RMCS); ++ flow_rx = (frctl & IXGBE_FCTRL_RFCE); ++ flow_tx = (rmcs & IXGBE_RMCS_TFCE_802_3X); ++ } + DPRINTK(LINK, INFO, "NIC Link is Up %s, " + "Flow Control: %s\n", + (link_speed == IXGBE_LINK_SPEED_10GB_FULL ? + "10 Gbps" : + (link_speed == IXGBE_LINK_SPEED_1GB_FULL ? + "1 Gbps" : "unknown speed")), +- ((FLOW_RX && FLOW_TX) ? "RX/TX" : +- (FLOW_RX ? "RX" : +- (FLOW_TX ? "TX" : "None")))); ++ ((flow_rx && flow_tx) ? "RX/TX" : ++ (flow_rx ? "RX" : ++ (flow_tx ? "TX" : "None")))); + + netif_carrier_on(netdev); + netif_tx_wake_all_queues(netdev); +@@ -3485,14 +5680,39 @@ + } + } + ++ if (!netif_carrier_ok(netdev)) { ++ for (i = 0; i < adapter->num_tx_queues; i++) { ++ tx_ring = &adapter->tx_ring[i]; ++ if (tx_ring->next_to_use != tx_ring->next_to_clean) { ++ some_tx_pending = 1; ++ break; ++ } ++ } ++ ++ if (some_tx_pending) { ++ /* We've lost link, so the controller stops DMA, ++ * but we've got queued Tx work that's never going ++ * to get done, so reset controller to flush Tx. ++ * (Do the reset outside of interrupt context). ++ */ ++ schedule_work(&adapter->reset_task); ++ } ++ } ++ + ixgbe_update_stats(adapter); + adapter->flags &= ~IXGBE_FLAG_IN_WATCHDOG_TASK; +-} +- +-static int ixgbe_tso(struct ixgbe_adapter *adapter, +- struct ixgbe_ring *tx_ring, struct sk_buff *skb, +- u32 tx_flags, u8 *hdr_len) +-{ ++ ++ if (adapter->flags & IXGBE_FLAG_NEED_LINK_UPDATE) { ++ /* poll faster when waiting for link */ ++ mod_timer(&adapter->watchdog_timer, jiffies + (HZ/10)); ++ } ++ ++} ++ ++static int ixgbe_tso(struct ixgbe_adapter *adapter, struct ixgbe_ring *tx_ring, ++ struct sk_buff *skb, u32 tx_flags, u8 *hdr_len) ++{ ++#ifdef NETIF_F_TSO + struct ixgbe_adv_tx_context_desc *context_desc; + unsigned int i; + int err; +@@ -3518,6 +5738,7 @@ + IPPROTO_TCP, + 0); + adapter->hw_tso_ctxt++; ++#ifdef NETIF_F_TSO6 + } else if (skb_shinfo(skb)->gso_type == SKB_GSO_TCPV6) { + ipv6_hdr(skb)->payload_len = 0; + tcp_hdr(skb)->check = +@@ -3525,6 +5746,7 @@ + &ipv6_hdr(skb)->daddr, + 0, IPPROTO_TCP, 0); + adapter->hw_tso6_ctxt++; ++#endif + } + + i = tx_ring->next_to_use; +@@ -3535,20 +5757,20 @@ + /* VLAN MACLEN IPLEN */ + if (tx_flags & IXGBE_TX_FLAGS_VLAN) + vlan_macip_lens |= +- (tx_flags & IXGBE_TX_FLAGS_VLAN_MASK); ++ (tx_flags & IXGBE_TX_FLAGS_VLAN_MASK); + vlan_macip_lens |= ((skb_network_offset(skb)) << + IXGBE_ADVTXD_MACLEN_SHIFT); + *hdr_len += skb_network_offset(skb); + vlan_macip_lens |= +- (skb_transport_header(skb) - skb_network_header(skb)); ++ (skb_transport_header(skb) - skb_network_header(skb)); + *hdr_len += +- (skb_transport_header(skb) - skb_network_header(skb)); ++ (skb_transport_header(skb) - skb_network_header(skb)); + context_desc->vlan_macip_lens = cpu_to_le32(vlan_macip_lens); + context_desc->seqnum_seed = 0; + + /* ADV DTYP TUCMD MKRLOC/ISCSIHEDLEN */ + type_tucmd_mlhl = (IXGBE_TXD_CMD_DEXT | +- IXGBE_ADVTXD_DTYP_CTXT); ++ IXGBE_ADVTXD_DTYP_CTXT); + + if (skb->protocol == htons(ETH_P_IP)) + type_tucmd_mlhl |= IXGBE_ADVTXD_TUCMD_IPV4; +@@ -3557,7 +5779,7 @@ + + /* MSS L4LEN IDX */ + mss_l4len_idx = +- (skb_shinfo(skb)->gso_size << IXGBE_ADVTXD_MSS_SHIFT); ++ (skb_shinfo(skb)->gso_size << IXGBE_ADVTXD_MSS_SHIFT); + mss_l4len_idx |= (l4len << IXGBE_ADVTXD_L4LEN_SHIFT); + /* use index 1 for TSO */ + mss_l4len_idx |= (1 << IXGBE_ADVTXD_IDX_SHIFT); +@@ -3573,6 +5795,8 @@ + + return true; + } ++ ++#endif + return false; + } + +@@ -3592,8 +5816,8 @@ + context_desc = IXGBE_TX_CTXTDESC_ADV(*tx_ring, i); + + if (tx_flags & IXGBE_TX_FLAGS_VLAN) +- vlan_macip_lens |= +- (tx_flags & IXGBE_TX_FLAGS_VLAN_MASK); ++ vlan_macip_lens |= (tx_flags & ++ IXGBE_TX_FLAGS_VLAN_MASK); + vlan_macip_lens |= (skb_network_offset(skb) << + IXGBE_ADVTXD_MACLEN_SHIFT); + if (skb->ip_summed == CHECKSUM_PARTIAL) +@@ -3612,14 +5836,16 @@ + type_tucmd_mlhl |= IXGBE_ADVTXD_TUCMD_IPV4; + if (ip_hdr(skb)->protocol == IPPROTO_TCP) + type_tucmd_mlhl |= +- IXGBE_ADVTXD_TUCMD_L4T_TCP; ++ IXGBE_ADVTXD_TUCMD_L4T_TCP; + break; ++#ifdef NETIF_F_IPV6_CSUM + case __constant_htons(ETH_P_IPV6): + /* XXX what about other V6 headers?? */ + if (ipv6_hdr(skb)->nexthdr == IPPROTO_TCP) + type_tucmd_mlhl |= +- IXGBE_ADVTXD_TUCMD_L4T_TCP; ++ IXGBE_ADVTXD_TUCMD_L4T_TCP; + break; ++#endif + default: + if (unlikely(net_ratelimit())) { + DPRINTK(PROBE, WARNING, +@@ -3651,21 +5877,24 @@ + + static int ixgbe_tx_map(struct ixgbe_adapter *adapter, + struct ixgbe_ring *tx_ring, +- struct sk_buff *skb, unsigned int first) ++ struct sk_buff *skb, u32 tx_flags, ++ unsigned int first) + { + struct ixgbe_tx_buffer *tx_buffer_info; +- unsigned int len = skb->len; ++ unsigned int len; ++ unsigned int total = skb->len; + unsigned int offset = 0, size, count = 0, i; ++#ifdef MAX_SKB_FRAGS + unsigned int nr_frags = skb_shinfo(skb)->nr_frags; + unsigned int f; +- +- len -= skb->data_len; ++#endif + + i = tx_ring->next_to_use; + ++ len = min(skb_headlen(skb), total); + while (len) { + tx_buffer_info = &tx_ring->tx_buffer_info[i]; +- size = min(len, (uint)IXGBE_MAX_DATA_PER_TXD); ++ size = min(len, (unsigned int)IXGBE_MAX_DATA_PER_TXD); + + tx_buffer_info->length = size; + tx_buffer_info->dma = pci_map_single(adapter->pdev, +@@ -3675,6 +5904,7 @@ + tx_buffer_info->next_to_watch = i; + + len -= size; ++ total -= size; + offset += size; + count++; + i++; +@@ -3682,16 +5912,17 @@ + i = 0; + } + ++#ifdef MAX_SKB_FRAGS + for (f = 0; f < nr_frags; f++) { + struct skb_frag_struct *frag; + + frag = &skb_shinfo(skb)->frags[f]; +- len = frag->size; ++ len = min( (unsigned int)frag->size, total); + offset = frag->page_offset; + + while (len) { + tx_buffer_info = &tx_ring->tx_buffer_info[i]; +- size = min(len, (uint)IXGBE_MAX_DATA_PER_TXD); ++ size = min(len, (unsigned int)IXGBE_MAX_DATA_PER_TXD); + + tx_buffer_info->length = size; + tx_buffer_info->dma = pci_map_page(adapter->pdev, +@@ -3703,13 +5934,17 @@ + tx_buffer_info->next_to_watch = i; + + len -= size; ++ total -= size; + offset += size; + count++; + i++; + if (i == tx_ring->count) + i = 0; + } +- } ++ if (total == 0) ++ break; ++ } ++#endif + if (i == 0) + i = tx_ring->count - 1; + else +@@ -3721,13 +5956,14 @@ + } + + static void ixgbe_tx_queue(struct ixgbe_adapter *adapter, +- struct ixgbe_ring *tx_ring, +- int tx_flags, int count, u32 paylen, u8 hdr_len) ++ struct ixgbe_ring *tx_ring, int tx_flags, ++ int count, u32 paylen, u8 hdr_len) + { + union ixgbe_adv_tx_desc *tx_desc = NULL; + struct ixgbe_tx_buffer *tx_buffer_info; + u32 olinfo_status = 0, cmd_type_len = 0; + unsigned int i; ++ + u32 txd_cmd = IXGBE_TXD_CMD_EOP | IXGBE_TXD_CMD_RS | IXGBE_TXD_CMD_IFCS; + + cmd_type_len |= IXGBE_ADVTXD_DTYP_DATA; +@@ -3752,7 +5988,6 @@ + } else if (tx_flags & IXGBE_TX_FLAGS_CSUM) + olinfo_status |= IXGBE_TXD_POPTS_TXSM << + IXGBE_ADVTXD_POPTS_SHIFT; +- + olinfo_status |= ((paylen - hdr_len) << IXGBE_ADVTXD_PAYLEN_SHIFT); + + i = tx_ring->next_to_use; +@@ -3761,7 +5996,7 @@ + tx_desc = IXGBE_TX_DESC_ADV(*tx_ring, i); + tx_desc->read.buffer_addr = cpu_to_le64(tx_buffer_info->dma); + tx_desc->read.cmd_type_len = +- cpu_to_le32(cmd_type_len | tx_buffer_info->length); ++ cpu_to_le32(cmd_type_len | tx_buffer_info->length); + tx_desc->read.olinfo_status = cpu_to_le32(olinfo_status); + i++; + if (i == tx_ring->count) +@@ -3780,6 +6015,58 @@ + + tx_ring->next_to_use = i; + writel(i, adapter->hw.hw_addr + tx_ring->tail); ++} ++ ++static void ixgbe_atr(struct ixgbe_adapter *adapter, struct sk_buff *skb, ++ int queue, u32 tx_flags) ++{ ++ /* Right now, we support IPv4 only */ ++ struct ixgbe_atr_input atr_input; ++ struct tcphdr *th; ++ struct udphdr *uh; ++ struct iphdr *iph = ip_hdr(skb); ++ struct ethhdr *eth = (struct ethhdr *)skb->data; ++ u16 vlan_id, src_port, dst_port, flex_bytes; ++ u32 src_ipv4_addr, dst_ipv4_addr; ++ u8 l4type = 0; ++ ++ /* check if we're UDP or TCP */ ++ if (iph->protocol == IPPROTO_TCP) { ++ th = tcp_hdr(skb); ++ src_port = th->source; ++ dst_port = th->dest; ++ l4type |= IXGBE_ATR_L4TYPE_TCP; ++ /* l4type IPv4 type is 0, no need to assign */ ++ } else if(iph->protocol == IPPROTO_UDP) { ++ uh = udp_hdr(skb); ++ src_port = uh->source; ++ dst_port = uh->dest; ++ l4type |= IXGBE_ATR_L4TYPE_UDP; ++ /* l4type IPv4 type is 0, no need to assign */ ++ } else { ++ /* Unsupported L4 header, just bail here */ ++ return; ++ } ++ ++ memset(&atr_input, 0, sizeof(struct ixgbe_atr_input)); ++ ++ vlan_id = (tx_flags & IXGBE_TX_FLAGS_VLAN_MASK) >> ++ IXGBE_TX_FLAGS_VLAN_SHIFT; ++ src_ipv4_addr = iph->saddr; ++ dst_ipv4_addr = iph->daddr; ++ flex_bytes = eth->h_proto; ++ ++ ixgbe_atr_set_vlan_id_82599(&atr_input, vlan_id); ++ ixgbe_atr_set_src_port_82599(&atr_input, dst_port); ++ ixgbe_atr_set_dst_port_82599(&atr_input, src_port); ++ ixgbe_atr_set_flex_byte_82599(&atr_input, flex_bytes); ++ ixgbe_atr_set_l4type_82599(&atr_input, l4type); ++ /* src and dst are inverted, think how the receiver sees them */ ++ ixgbe_atr_set_src_ipv4_82599(&atr_input, dst_ipv4_addr); ++ ixgbe_atr_set_dst_ipv4_82599(&atr_input, src_ipv4_addr); ++ ++ /* This assumes the Rx queue and Tx queue are bound to the same CPU */ ++ ixgbe_fdir_add_signature_filter_82599(&adapter->hw, &atr_input, queue); + } + + static int __ixgbe_maybe_stop_tx(struct net_device *netdev, +@@ -3805,7 +6092,7 @@ + } + + static int ixgbe_maybe_stop_tx(struct net_device *netdev, +- struct ixgbe_ring *tx_ring, int size) ++ struct ixgbe_ring *tx_ring, int size) + { + if (likely(IXGBE_DESC_UNUSED(tx_ring) >= size)) + return 0; +@@ -3821,42 +6108,53 @@ + u8 hdr_len = 0; + int r_idx = 0, tso; + int count = 0; ++ ++#ifdef MAX_SKB_FRAGS + unsigned int f; +- +- r_idx = (adapter->num_tx_queues - 1) & skb->queue_mapping; ++#endif ++#ifdef HAVE_TX_MQ ++ r_idx = skb->queue_mapping; ++#endif + tx_ring = &adapter->tx_ring[r_idx]; + ++#ifdef NETIF_F_HW_VLAN_TX + if (adapter->vlgrp && vlan_tx_tag_present(skb)) { + tx_flags |= vlan_tx_tag_get(skb); ++#ifdef HAVE_TX_MQ + if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) { + tx_flags &= ~IXGBE_TX_FLAGS_VLAN_PRIO_MASK; + tx_flags |= (skb->queue_mapping << 13); + } ++#endif + tx_flags <<= IXGBE_TX_FLAGS_VLAN_SHIFT; + tx_flags |= IXGBE_TX_FLAGS_VLAN; ++#ifdef HAVE_TX_MQ + } else if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) { + tx_flags |= (skb->queue_mapping << 13); + tx_flags <<= IXGBE_TX_FLAGS_VLAN_SHIFT; + tx_flags |= IXGBE_TX_FLAGS_VLAN; +- } +- /* three things can cause us to need a context descriptor */ ++#endif ++ } ++#endif ++ /* four things can cause us to need a context descriptor */ + if (skb_is_gso(skb) || + (skb->ip_summed == CHECKSUM_PARTIAL) || + (tx_flags & IXGBE_TX_FLAGS_VLAN)) + count++; +- + count += TXD_USE_COUNT(skb_headlen(skb)); ++#ifdef MAX_SKB_FRAGS + for (f = 0; f < skb_shinfo(skb)->nr_frags; f++) + count += TXD_USE_COUNT(skb_shinfo(skb)->frags[f].size); + ++#endif + if (ixgbe_maybe_stop_tx(netdev, tx_ring, count)) { + adapter->tx_busy++; + return NETDEV_TX_BUSY; + } + ++ first = tx_ring->next_to_use; + if (skb->protocol == htons(ETH_P_IP)) + tx_flags |= IXGBE_TX_FLAGS_IPV4; +- first = tx_ring->next_to_use; + tso = ixgbe_tso(adapter, tx_ring, skb, tx_flags, &hdr_len); + if (tso < 0) { + dev_kfree_skb_any(skb); +@@ -3866,12 +6164,21 @@ + if (tso) + tx_flags |= IXGBE_TX_FLAGS_TSO; + else if (ixgbe_tx_csum(adapter, tx_ring, skb, tx_flags) && +- (skb->ip_summed == CHECKSUM_PARTIAL)) ++ (skb->ip_summed == CHECKSUM_PARTIAL)) + tx_flags |= IXGBE_TX_FLAGS_CSUM; + ++ /* add the ATR filter if ATR is on */ ++ if (tx_ring->atr_sample_rate) { ++ ++tx_ring->atr_count; ++ if ((tx_ring->atr_count >= tx_ring->atr_sample_rate) && ++ test_bit(__IXGBE_FDIR_INIT_DONE, &tx_ring->reinit_state)) { ++ ixgbe_atr(adapter, skb, tx_ring->queue_index, tx_flags); ++ tx_ring->atr_count = 0; ++ } ++ } + ixgbe_tx_queue(adapter, tx_ring, tx_flags, +- ixgbe_tx_map(adapter, tx_ring, skb, first), +- skb->len, hdr_len); ++ ixgbe_tx_map(adapter, tx_ring, skb, tx_flags, first), ++ skb->len, hdr_len); + + netdev->trans_start = jiffies; + +@@ -3914,11 +6221,74 @@ + memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len); + memcpy(hw->mac.addr, addr->sa_data, netdev->addr_len); + +- hw->mac.ops.set_rar(hw, 0, hw->mac.addr, 0, IXGBE_RAH_AV); +- +- return 0; +-} +- ++ if (hw->mac.ops.set_rar) ++ hw->mac.ops.set_rar(hw, 0, hw->mac.addr, 0, IXGBE_RAH_AV); ++ ++ return 0; ++} ++ ++#if defined(HAVE_NETDEV_STORAGE_ADDRESS) && defined(NETDEV_HW_ADDR_T_SAN) ++/** ++ * ixgbe_add_sanmac_netdev - Add the SAN MAC address to the corresponding ++ * netdev->dev_addr_list ++ * @netdev: network interface device structure ++ * ++ * Returns non-zero on failure ++ **/ ++static int ixgbe_add_sanmac_netdev(struct net_device *dev) ++{ ++ int err = 0; ++ struct ixgbe_adapter *adapter = netdev_priv(dev); ++ struct ixgbe_mac_info *mac = &adapter->hw.mac; ++ ++ if (is_valid_ether_addr(mac->san_addr)) { ++ rtnl_lock(); ++ err = dev_addr_add(dev, mac->san_addr, NETDEV_HW_ADDR_T_SAN); ++ rtnl_unlock(); ++ } ++ return err; ++} ++ ++/** ++ * ixgbe_del_sanmac_netdev - Removes the SAN MAC address to the corresponding ++ * netdev->dev_addr_list ++ * @netdev: network interface device structure ++ * ++ * Returns non-zero on failure ++ **/ ++static int ixgbe_del_sanmac_netdev(struct net_device *dev) ++{ ++ int err = 0; ++ struct ixgbe_adapter *adapter = netdev_priv(dev); ++ struct ixgbe_mac_info *mac = &adapter->hw.mac; ++ ++ if (is_valid_ether_addr(mac->san_addr)) { ++ rtnl_lock(); ++ err = dev_addr_del(dev, mac->san_addr, NETDEV_HW_ADDR_T_SAN); ++ rtnl_unlock(); ++ } ++ return err; ++} ++ ++#endif /* (HAVE_NETDEV_STORAGE_ADDRESS) && defined(NETDEV_HW_ADDR_T_SAN) */ ++#ifdef ETHTOOL_OPS_COMPAT ++/** ++ * ixgbe_ioctl - ++ * @netdev: ++ * @ifreq: ++ * @cmd: ++ **/ ++static int ixgbe_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd) ++{ ++ switch (cmd) { ++ case SIOCETHTOOL: ++ return ethtool_ioctl(ifr); ++ default: ++ return -EOPNOTSUPP; ++ } ++} ++ ++#endif + #ifdef CONFIG_NET_POLL_CONTROLLER + /* + * Polling 'interrupt' - used by things like netconsole to send skbs +@@ -3929,32 +6299,93 @@ + { + struct ixgbe_adapter *adapter = netdev_priv(netdev); + +- disable_irq(adapter->pdev->irq); ++ /* XXX is disable_irq the right thing to do here instead? */ ++ ixgbe_irq_disable(adapter); + adapter->flags |= IXGBE_FLAG_IN_NETPOLL; + ixgbe_intr(adapter->pdev->irq, netdev); + adapter->flags &= ~IXGBE_FLAG_IN_NETPOLL; +- enable_irq(adapter->pdev->irq); +-} +-#endif +- +-/** +- * ixgbe_link_config - set up initial link with default speed and duplex +- * @hw: pointer to private hardware struct +- * +- * Returns 0 on success, negative on failure +- **/ +-static int ixgbe_link_config(struct ixgbe_hw *hw) +-{ +- u32 autoneg = IXGBE_LINK_SPEED_10GB_FULL; +- +- /* must always autoneg for both 1G and 10G link */ +- hw->mac.autoneg = true; +- +- if ((hw->mac.type == ixgbe_mac_82598EB) && +- (hw->phy.media_type == ixgbe_media_type_copper)) +- autoneg = IXGBE_LINK_SPEED_82598_AUTONEG; +- +- return hw->mac.ops.setup_link_speed(hw, autoneg, true, true); ++ ixgbe_irq_enable(adapter, true, true); ++} ++ ++#endif ++#ifdef HAVE_NETDEV_SELECT_QUEUE ++static u16 ixgbe_select_queue(struct net_device *dev, struct sk_buff *skb) ++{ ++ struct ixgbe_adapter *adapter = netdev_priv(dev); ++ ++ if (adapter->flags & IXGBE_FLAG_FDIR_HASH_CAPABLE) ++ return smp_processor_id(); ++ ++ if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) ++ return 0; /* all untagged traffic should default to TC 0 */ ++ ++ return skb_tx_hash(dev, skb); ++} ++ ++#endif /* HAVE_NETDEV_SELECT_QUEUE */ ++#ifdef HAVE_NET_DEVICE_OPS ++static const struct net_device_ops ixgbe_netdev_ops = { ++ .ndo_open = &ixgbe_open, ++ .ndo_stop = &ixgbe_close, ++ .ndo_start_xmit = &ixgbe_xmit_frame, ++ .ndo_get_stats = &ixgbe_get_stats, ++ .ndo_set_rx_mode = &ixgbe_set_rx_mode, ++ .ndo_set_multicast_list = &ixgbe_set_rx_mode, ++ .ndo_validate_addr = eth_validate_addr, ++ .ndo_set_mac_address = &ixgbe_set_mac, ++ .ndo_change_mtu = &ixgbe_change_mtu, ++#ifdef ETHTOOL_OPS_COMPAT ++ .ndo_do_ioctl = &ixgbe_ioctl, ++#endif ++ .ndo_tx_timeout = &ixgbe_tx_timeout, ++ .ndo_vlan_rx_register = &ixgbe_vlan_rx_register, ++ .ndo_vlan_rx_add_vid = &ixgbe_vlan_rx_add_vid, ++ .ndo_vlan_rx_kill_vid = &ixgbe_vlan_rx_kill_vid, ++#ifdef CONFIG_NET_POLL_CONTROLLER ++ .ndo_poll_controller = &ixgbe_netpoll, ++#endif ++ .ndo_select_queue = &ixgbe_select_queue, ++}; ++ ++#endif /* HAVE_NET_DEVICE_OPS */ ++ ++void ixgbe_assign_netdev_ops(struct net_device *dev) ++{ ++ struct ixgbe_adapter *adapter; ++ adapter = netdev_priv(dev); ++#ifdef HAVE_NET_DEVICE_OPS ++ dev->netdev_ops = &ixgbe_netdev_ops; ++#else /* HAVE_NET_DEVICE_OPS */ ++ dev->open = &ixgbe_open; ++ dev->stop = &ixgbe_close; ++ dev->hard_start_xmit = &ixgbe_xmit_frame; ++ dev->get_stats = &ixgbe_get_stats; ++#ifdef HAVE_SET_RX_MODE ++ dev->set_rx_mode = &ixgbe_set_rx_mode; ++#endif ++ dev->set_multicast_list = &ixgbe_set_rx_mode; ++ dev->set_mac_address = &ixgbe_set_mac; ++ dev->change_mtu = &ixgbe_change_mtu; ++#ifdef ETHTOOL_OPS_COMPAT ++ dev->do_ioctl = &ixgbe_ioctl; ++#endif ++#ifdef HAVE_TX_TIMEOUT ++ dev->tx_timeout = &ixgbe_tx_timeout; ++#endif ++#ifdef NETIF_F_HW_VLAN_TX ++ dev->vlan_rx_register = &ixgbe_vlan_rx_register; ++ dev->vlan_rx_add_vid = &ixgbe_vlan_rx_add_vid; ++ dev->vlan_rx_kill_vid = &ixgbe_vlan_rx_kill_vid; ++#endif ++#ifdef CONFIG_NET_POLL_CONTROLLER ++ dev->poll_controller = &ixgbe_netpoll; ++#endif ++#ifdef HAVE_NETDEV_SELECT_QUEUE ++ dev->select_queue = &ixgbe_select_queue; ++#endif /* HAVE_NETDEV_SELECT_QUEUE */ ++#endif /* HAVE_NET_DEVICE_OPS */ ++ ixgbe_set_ethtool_ops(dev); ++ dev->watchdog_timeo = 5 * HZ; + } + + /** +@@ -3973,12 +6404,10 @@ + { + struct net_device *netdev; + struct ixgbe_adapter *adapter = NULL; +- struct ixgbe_hw *hw; +- const struct ixgbe_info *ii = ixgbe_info_tbl[ent->driver_data]; ++ struct ixgbe_hw *hw = NULL; + static int cards_found; + int i, err, pci_using_dac; +- u16 link_status, link_speed, link_width; +- u32 part_num, eec; ++ u32 part_num; + + err = pci_enable_device(pdev); + if (err) +@@ -4006,10 +6435,35 @@ + goto err_pci_reg; + } + ++ /* ++ * Workaround of Silicon errata on 82598. Disable LOs in the PCI switch ++ * port to which the 82598 is connected to prevent duplicate ++ * completions caused by LOs. We need the mac type so that we only ++ * do this on 82598 devices, ixgbe_set_mac_type does this for us if ++ * we set it's device ID. ++ */ ++ hw = vmalloc(sizeof(struct ixgbe_hw)); ++ if (!hw) { ++ printk(KERN_INFO "Unable to allocate memory for LOs fix " ++ "- not checked\n"); ++ } else { ++ hw->vendor_id = pdev->vendor; ++ hw->device_id = pdev->device; ++ ixgbe_set_mac_type(hw); ++ if (hw->mac.type == ixgbe_mac_82598EB) ++ pci_disable_link_state(pdev, PCIE_LINK_STATE_L0S); ++ vfree(hw); ++ } ++ ++ pci_enable_pcie_error_reporting(pdev); ++ + pci_set_master(pdev); +- pci_save_state(pdev); +- ++ ++#ifdef HAVE_TX_MQ + netdev = alloc_etherdev_mq(sizeof(struct ixgbe_adapter), MAX_TX_QUEUES); ++#else ++ netdev = alloc_etherdev(sizeof(struct ixgbe_adapter)); ++#endif + if (!netdev) { + err = -ENOMEM; + goto err_alloc_etherdev; +@@ -4026,6 +6480,14 @@ + hw->back = adapter; + adapter->msg_enable = (1 << DEFAULT_DEBUG_LEVEL_SHIFT) - 1; + ++#ifdef HAVE_PCI_ERS ++ /* ++ * call save state here in standalone driver because it relies on ++ * adapter struct to exist, and needs to call netdev_priv ++ */ ++ pci_save_state(pdev); ++ ++#endif + hw->hw_addr = ioremap(pci_resource_start(pdev, 0), + pci_resource_len(pdev, 0)); + if (!hw->hw_addr) { +@@ -4038,120 +6500,173 @@ + continue; + } + +- netdev->open = &ixgbe_open; +- netdev->stop = &ixgbe_close; +- netdev->hard_start_xmit = &ixgbe_xmit_frame; +- netdev->get_stats = &ixgbe_get_stats; +- netdev->set_rx_mode = &ixgbe_set_rx_mode; +- netdev->set_multicast_list = &ixgbe_set_rx_mode; +- netdev->set_mac_address = &ixgbe_set_mac; +- netdev->change_mtu = &ixgbe_change_mtu; +- ixgbe_set_ethtool_ops(netdev); +- netdev->tx_timeout = &ixgbe_tx_timeout; +- netdev->watchdog_timeo = 5 * HZ; +- netdev->vlan_rx_register = ixgbe_vlan_rx_register; +- netdev->vlan_rx_add_vid = ixgbe_vlan_rx_add_vid; +- netdev->vlan_rx_kill_vid = ixgbe_vlan_rx_kill_vid; +-#ifdef CONFIG_NET_POLL_CONTROLLER +- netdev->poll_controller = ixgbe_netpoll; +-#endif ++ ixgbe_assign_netdev_ops(netdev); ++ + strcpy(netdev->name, pci_name(pdev)); + + adapter->bd_number = cards_found; + +- /* Setup hw api */ +- memcpy(&hw->mac.ops, ii->mac_ops, sizeof(hw->mac.ops)); +- hw->mac.type = ii->mac; +- +- /* EEPROM */ +- memcpy(&hw->eeprom.ops, ii->eeprom_ops, sizeof(hw->eeprom.ops)); +- eec = IXGBE_READ_REG(hw, IXGBE_EEC); +- /* If EEPROM is valid (bit 8 = 1), use default otherwise use bit bang */ +- if (!(eec & (1 << 8))) +- hw->eeprom.ops.read = &ixgbe_read_eeprom_bit_bang_generic; +- +- /* PHY */ +- memcpy(&hw->phy.ops, ii->phy_ops, sizeof(hw->phy.ops)); +- hw->phy.sfp_type = ixgbe_sfp_type_unknown; +- +- /* set up this timer and work struct before calling get_invariants +- * which might start the timer */ ++#ifdef IXGBE_TCP_TIMER ++ adapter->msix_addr = ioremap(pci_resource_start(pdev, 3), ++ pci_resource_len(pdev, 3)); ++ if (!adapter->msix_addr) { ++ err = -EIO; ++ printk("Error in ioremap of BAR3\n"); ++ goto err_map_msix; ++ } ++ ++#endif ++ /* set up this timer and work struct before calling sw_init which ++ * might start the timer */ + init_timer(&adapter->sfp_timer); + adapter->sfp_timer.function = &ixgbe_sfp_timer; + adapter->sfp_timer.data = (unsigned long) adapter; + + INIT_WORK(&adapter->sfp_task, ixgbe_sfp_task); + +- err = ii->get_invariants(hw); +- if (err == IXGBE_ERR_SFP_NOT_PRESENT) { +- /* start a kernel thread to watch for a module to arrive */ ++ /* multispeed fiber has its own tasklet, called from GPI SDP1 context */ ++ INIT_WORK(&adapter->multispeed_fiber_task, ixgbe_multispeed_fiber_task); ++ ++ /* a new SFP+ module arrival, called from GPI SDP2 context */ ++ INIT_WORK(&adapter->sfp_config_module_task, ++ ixgbe_sfp_config_module_task); ++ ++ /* setup the private structure */ ++ err = ixgbe_sw_init(adapter); ++ if (err) ++ goto err_sw_init; ++ ++ /* ++ * If we have a fan, this is as early we know, warn if we ++ * have had a failure. ++ */ ++ if (adapter->flags & IXGBE_FLAG_FAN_FAIL_CAPABLE) { ++ u32 esdp = IXGBE_READ_REG(hw, IXGBE_ESDP); ++ if (esdp & IXGBE_ESDP_SDP1) ++ DPRINTK(PROBE, CRIT, ++ "Fan has stopped, replace the adapter\n"); ++ } ++ ++ /* reset_hw fills in the perm_addr as well */ ++ err = hw->mac.ops.reset_hw(hw); ++ if (err == IXGBE_ERR_SFP_NOT_PRESENT && ++ hw->mac.type == ixgbe_mac_82598EB) { ++ /* ++ * Start a kernel thread to watch for a module to arrive. ++ * Only do this for 82598, since 82599 will generate interrupts ++ * on module arrival. ++ */ + set_bit(__IXGBE_SFP_MODULE_NOT_FOUND, &adapter->state); + mod_timer(&adapter->sfp_timer, +- round_jiffies(jiffies + (2 * HZ))); ++ round_jiffies(jiffies + (2 * HZ))); + err = 0; + } else if (err == IXGBE_ERR_SFP_NOT_SUPPORTED) { + DPRINTK(PROBE, ERR, "failed to load because an " +- "unsupported SFP+ module type was detected.\n"); +- goto err_hw_init; ++ "unsupported SFP+ module type was detected.\n"); ++ goto err_sw_init; + } else if (err) { +- goto err_hw_init; +- } +- +- /* setup the private structure */ +- err = ixgbe_sw_init(adapter); +- if (err) ++ DPRINTK(PROBE, ERR, "HW Init failed: %d\n", err); + goto err_sw_init; +- +- /* reset_hw fills in the perm_addr as well */ +- err = hw->mac.ops.reset_hw(hw); +- if (err) { +- dev_err(&adapter->pdev->dev, "HW Init failed: %d\n", err); +- goto err_sw_init; +- } +- ++ } ++ ++ /* check_options must be called before setup_link_speed to set up ++ * hw->fc completely ++ */ ++ ixgbe_check_options(adapter); ++ ++#ifdef MAX_SKB_FRAGS ++#ifdef NETIF_F_HW_VLAN_TX + netdev->features = NETIF_F_SG | +- NETIF_F_IP_CSUM | +- NETIF_F_HW_VLAN_TX | +- NETIF_F_HW_VLAN_RX | +- NETIF_F_HW_VLAN_FILTER; +- ++ NETIF_F_IP_CSUM | ++ NETIF_F_HW_VLAN_TX | ++ NETIF_F_HW_VLAN_RX | ++ NETIF_F_HW_VLAN_FILTER; ++ ++#else ++ netdev->features = NETIF_F_SG | NETIF_F_IP_CSUM; ++ ++#endif ++#ifdef NETIF_F_IPV6_CSUM + netdev->features |= NETIF_F_IPV6_CSUM; ++#endif ++#ifdef NETIF_F_TSO + netdev->features |= NETIF_F_TSO; ++#ifdef NETIF_F_TSO6 + netdev->features |= NETIF_F_TSO6; +-#ifdef CONFIG_IXGBE_LRO +- netdev->features |= NETIF_F_LRO; +-#endif +- ++#endif /* NETIF_F_TSO6 */ ++#endif /* NETIF_F_TSO */ ++#ifdef NETIF_F_GRO ++ netdev->features |= NETIF_F_GRO; ++#endif /* NETIF_F_GRO */ ++ if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) ++ adapter->flags &= ~IXGBE_FLAG_RSS_ENABLED; ++ if (adapter->flags & IXGBE_FLAG_VMDQ_ENABLED) ++ adapter->flags &= ~(IXGBE_FLAG_FDIR_HASH_CAPABLE ++ | IXGBE_FLAG_FDIR_PERFECT_CAPABLE); ++#ifndef IXGBE_NO_HW_RSC ++ if (adapter->flags2 & IXGBE_FLAG2_RSC_CAPABLE) { ++#ifdef NETIF_F_LRO ++ netdev->features |= NETIF_F_LRO; ++#endif ++#ifndef IXGBE_NO_LRO ++ adapter->flags2 &= ~IXGBE_FLAG2_SWLRO_ENABLED; ++#endif ++ adapter->flags2 |= IXGBE_FLAG2_RSC_ENABLED; ++ } else { ++#endif ++#ifndef IXGBE_NO_LRO ++#ifdef NETIF_F_LRO ++ netdev->features |= NETIF_F_LRO; ++#endif ++ adapter->flags2 |= IXGBE_FLAG2_SWLRO_ENABLED; ++#endif ++#ifndef IXGBE_NO_HW_RSC ++ adapter->flags2 &= ~IXGBE_FLAG2_RSC_ENABLED; ++ } ++#endif ++#ifdef HAVE_NETDEV_VLAN_FEATURES ++#ifdef NETIF_F_TSO + netdev->vlan_features |= NETIF_F_TSO; ++#ifdef NETIF_F_TSO6 + netdev->vlan_features |= NETIF_F_TSO6; ++#endif /* NETIF_F_TSO6 */ ++#endif /* NETIF_F_TSO */ + netdev->vlan_features |= NETIF_F_IP_CSUM; + netdev->vlan_features |= NETIF_F_SG; + +- if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) +- adapter->flags &= ~IXGBE_FLAG_RSS_ENABLED; +- +-#ifdef CONFIG_IXGBE_DCB ++#endif /* HAVE_NETDEV_VLAN_FEATURES */ ++#ifdef CONFIG_DCB + netdev->dcbnl_ops = &dcbnl_ops; +-#endif /* CONFIG_IXGBE_DCB */ ++#endif + + if (pci_using_dac) + netdev->features |= NETIF_F_HIGHDMA; + ++#endif /* MAX_SKB_FRAGS */ + /* make sure the EEPROM is good */ +- if (hw->eeprom.ops.validate_checksum(hw, NULL) < 0) { +- dev_err(&pdev->dev, "The EEPROM Checksum Is Not Valid\n"); ++ if (hw->eeprom.ops.validate_checksum && ++ (hw->eeprom.ops.validate_checksum(hw, NULL) < 0)) { ++ DPRINTK(PROBE, ERR, "The EEPROM Checksum Is Not Valid\n"); + err = -EIO; +- goto err_eeprom; ++ goto err_sw_init; + } + + memcpy(netdev->dev_addr, hw->mac.perm_addr, netdev->addr_len); ++#ifdef ETHTOOL_GPERMADDR + memcpy(netdev->perm_addr, hw->mac.perm_addr, netdev->addr_len); + + if (ixgbe_validate_mac_addr(netdev->perm_addr)) { +- dev_err(&pdev->dev, "invalid MAC address\n"); ++ DPRINTK(PROBE, INFO, "invalid MAC address\n"); + err = -EIO; +- goto err_eeprom; +- } ++ goto err_sw_init; ++ } ++#else ++ if (ixgbe_validate_mac_addr(netdev->dev_addr)) { ++ DPRINTK(PROBE, INFO, "invalid MAC address\n"); ++ err = -EIO; ++ goto err_sw_init; ++ } ++#endif + + init_timer(&adapter->watchdog_timer); + adapter->watchdog_timer.function = &ixgbe_watchdog; +@@ -4164,78 +6679,132 @@ + if (err) + goto err_sw_init; + +- /* print bus type/speed/width info */ +- pci_read_config_word(pdev, IXGBE_PCI_LINK_STATUS, &link_status); +- link_speed = link_status & IXGBE_PCI_LINK_SPEED; +- link_width = link_status & IXGBE_PCI_LINK_WIDTH; +- dev_info(&pdev->dev, "(PCI Express:%s:%s) " +- "%02x:%02x:%02x:%02x:%02x:%02x\n", +- ((link_speed == IXGBE_PCI_LINK_SPEED_5000) ? "5.0Gb/s" : +- (link_speed == IXGBE_PCI_LINK_SPEED_2500) ? "2.5Gb/s" : +- "Unknown"), +- ((link_width == IXGBE_PCI_LINK_WIDTH_8) ? "Width x8" : +- (link_width == IXGBE_PCI_LINK_WIDTH_4) ? "Width x4" : +- (link_width == IXGBE_PCI_LINK_WIDTH_2) ? "Width x2" : +- (link_width == IXGBE_PCI_LINK_WIDTH_1) ? "Width x1" : +- "Unknown"), +- netdev->dev_addr[0], netdev->dev_addr[1], netdev->dev_addr[2], +- netdev->dev_addr[3], netdev->dev_addr[4], netdev->dev_addr[5]); +- ixgbe_read_pba_num_generic(hw, &part_num); +- dev_info(&pdev->dev, "MAC: %d, PHY: %d, PBA No: %06x-%03x\n", +- hw->mac.type, hw->phy.type, +- (part_num >> 8), (part_num & 0xff)); +- +- if (link_width <= IXGBE_PCI_LINK_WIDTH_4) { +- dev_warn(&pdev->dev, "PCI-Express bandwidth available for " +- "this card is not sufficient for optimal " +- "performance.\n"); +- dev_warn(&pdev->dev, "For optimal performance a x8 " +- "PCI-Express slot is required.\n"); +- } ++ switch (pdev->device) { ++ case IXGBE_DEV_ID_82599_KX4: ++ adapter->wol = (IXGBE_WUFC_MAG | IXGBE_WUFC_EX | ++ IXGBE_WUFC_MC | IXGBE_WUFC_BC); ++ /* Enable ACPI wakeup in GRC */ ++ IXGBE_WRITE_REG(hw, IXGBE_GRC, ++ (IXGBE_READ_REG(hw, IXGBE_GRC) & ~IXGBE_GRC_APME)); ++ break; ++ default: ++ adapter->wol = 0; ++ break; ++ } ++ device_init_wakeup(&adapter->pdev->dev, true); ++ device_set_wakeup_enable(&adapter->pdev->dev, adapter->wol); ++ ++ /* save off EEPROM version number */ ++ ixgbe_read_eeprom(hw, 0x29, &adapter->eeprom_version); + + /* reset the hardware with the new settings */ +- hw->mac.ops.start_hw(hw); +- +- /* link_config depends on start_hw being called at least once */ +- err = ixgbe_link_config(hw); +- if (err) { +- dev_err(&pdev->dev, "setup_link_speed FAILED %d\n", err); +- goto err_register; +- } ++ err = hw->mac.ops.start_hw(hw); ++ if (err == IXGBE_ERR_EEPROM_VERSION) { ++ /* We are running on a pre-production device, log a warning */ ++ DPRINTK(PROBE, INFO, "This device is a pre-production adapter/" ++ "LOM. Please be aware there may be issues associated " ++ "with your hardware. If you are experiencing problems " ++ "please contact your Intel or hardware representative " ++ "who provided you with this hardware.\n"); ++ } ++ /* pick up the PCI bus settings for reporting later */ ++ if (hw->mac.ops.get_bus_info) ++ hw->mac.ops.get_bus_info(hw); ++ + + netif_carrier_off(netdev); + netif_tx_stop_all_queues(netdev); + +- ixgbe_napi_add_all(adapter); ++ if (adapter->flags & IXGBE_FLAG_FDIR_HASH_CAPABLE || ++ adapter->flags & IXGBE_FLAG_FDIR_PERFECT_CAPABLE) ++ INIT_WORK(&adapter->fdir_reinit_task, ixgbe_fdir_reinit_task); + + strcpy(netdev->name, "eth%d"); + err = register_netdev(netdev); + if (err) + goto err_register; + +-#if defined(CONFIG_DCA) || defined(CONFIG_DCA_MODULE) +- if (dca_add_requester(&pdev->dev) == 0) { +- adapter->flags |= IXGBE_FLAG_DCA_ENABLED; +- /* always use CB2 mode, difference is masked +- * in the CB driver */ +- IXGBE_WRITE_REG(hw, IXGBE_DCA_CTRL, 2); +- ixgbe_setup_dca(adapter); +- } +-#endif +- +- dev_info(&pdev->dev, "Intel(R) 10 Gigabit Network Connection\n"); ++ adapter->netdev_registered = true; ++#if defined(CONFIG_DCA) || defined(CONFIG_DCA_MODULE) ++ if (adapter->flags & IXGBE_FLAG_DCA_CAPABLE) { ++ err = dca_add_requester(&pdev->dev); ++ if (err == 0) { ++ adapter->flags |= IXGBE_FLAG_DCA_ENABLED; ++ ixgbe_setup_dca(adapter); ++ } else { ++ DPRINTK(PROBE, INFO, "DCA registration failed: %d\n", ++ err); ++ } ++ } ++ ++#endif ++ /* print all messages at the end so that we use our eth%d name */ ++ /* print bus type/speed/width info */ ++ DPRINTK(PROBE, INFO, "(PCI Express:%s:%s) ", ++ ((hw->bus.speed == ixgbe_bus_speed_5000) ? "5.0Gb/s": ++ (hw->bus.speed == ixgbe_bus_speed_2500) ? "2.5Gb/s":"Unknown"), ++ (hw->bus.width == ixgbe_bus_width_pcie_x8) ? "Width x8" : ++ (hw->bus.width == ixgbe_bus_width_pcie_x4) ? "Width x4" : ++ (hw->bus.width == ixgbe_bus_width_pcie_x1) ? "Width x1" : ++ ("Unknown")); ++ ++ /* print the MAC address */ ++ for (i = 0; i < 6; i++) ++ printk("%2.2x%c", netdev->dev_addr[i], i == 5 ? '\n' : ':'); ++ ++ ixgbe_read_pba_num(hw, &part_num); ++ if (ixgbe_is_sfp(hw) && hw->phy.sfp_type != ixgbe_sfp_type_not_present) ++ DPRINTK(PROBE, INFO, "MAC: %d, PHY: %d, SFP+: %d, PBA No: %06x-%03x\n", ++ hw->mac.type, hw->phy.type, hw->phy.sfp_type, ++ (part_num >> 8), (part_num & 0xff)); ++ else ++ DPRINTK(PROBE, INFO, "MAC: %d, PHY: %d, PBA No: %06x-%03x\n", ++ hw->mac.type, hw->phy.type, ++ (part_num >> 8), (part_num & 0xff)); ++ ++ if (hw->bus.width <= ixgbe_bus_width_pcie_x4) { ++ DPRINTK(PROBE, WARNING, "PCI-Express bandwidth available for " ++ "this card is not sufficient for optimal " ++ "performance.\n"); ++ DPRINTK(PROBE, WARNING, "For optimal performance a x8 " ++ "PCI-Express slot is required.\n"); ++ } ++ ++#ifndef IXGBE_NO_LRO ++ if (adapter->flags2 & IXGBE_FLAG2_SWLRO_ENABLED) ++ DPRINTK(PROBE, INFO, "Internal LRO is enabled \n"); ++ else ++ DPRINTK(PROBE, INFO, "LRO is disabled \n"); ++#endif ++#ifndef IXGBE_NO_HW_RSC ++ if (adapter->flags2 & IXGBE_FLAG2_RSC_CAPABLE) ++ DPRINTK(PROBE, INFO, "HW RSC is enabled \n"); ++#endif ++#if defined(HAVE_NETDEV_STORAGE_ADDRESS) && defined(NETDEV_HW_ADDR_T_SAN) ++ /* add san mac addr to netdev */ ++ ixgbe_add_sanmac_netdev(netdev); ++ ++#endif /* (HAVE_NETDEV_STORAGE_ADDRESS) && (NETDEV_HW_ADDR_T_SAN) */ ++ DPRINTK(PROBE, INFO, "Intel(R) 10 Gigabit Network Connection\n"); + cards_found++; + return 0; + + err_register: ++ if (adapter->flags & IXGBE_FLAG_FDIR_HASH_CAPABLE || ++ adapter->flags & IXGBE_FLAG_FDIR_PERFECT_CAPABLE) ++ cancel_work_sync(&adapter->fdir_reinit_task); ++ ixgbe_clear_interrupt_scheme(adapter); + ixgbe_release_hw_control(adapter); +-err_hw_init: + err_sw_init: +- ixgbe_reset_interrupt_capability(adapter); +-err_eeprom: + clear_bit(__IXGBE_SFP_MODULE_NOT_FOUND, &adapter->state); + del_timer_sync(&adapter->sfp_timer); + cancel_work_sync(&adapter->sfp_task); ++ cancel_work_sync(&adapter->multispeed_fiber_task); ++ cancel_work_sync(&adapter->sfp_config_module_task); ++#ifdef IXGBE_TCP_TIMER ++ iounmap(adapter->msix_addr); ++err_map_msix: ++#endif + iounmap(hw->hw_addr); + err_ioremap: + free_netdev(netdev); +@@ -4262,13 +6831,20 @@ + struct ixgbe_adapter *adapter = netdev_priv(netdev); + + set_bit(__IXGBE_DOWN, &adapter->state); +- /* clear the module not found bit to make sure the worker won't +- * reschedule */ ++ /* ++ * clear the module not found bit to make sure the worker won't ++ * reschedule ++ */ + clear_bit(__IXGBE_SFP_MODULE_NOT_FOUND, &adapter->state); + del_timer_sync(&adapter->watchdog_timer); + del_timer_sync(&adapter->sfp_timer); + cancel_work_sync(&adapter->watchdog_task); + cancel_work_sync(&adapter->sfp_task); ++ if (adapter->flags & IXGBE_FLAG_FDIR_HASH_CAPABLE || ++ adapter->flags & IXGBE_FLAG_FDIR_PERFECT_CAPABLE) ++ cancel_work_sync(&adapter->fdir_reinit_task); ++ cancel_work_sync(&adapter->multispeed_fiber_task); ++ cancel_work_sync(&adapter->sfp_config_module_task); + flush_scheduled_work(); + + #if defined(CONFIG_DCA) || defined(CONFIG_DCA_MODULE) +@@ -4279,26 +6855,50 @@ + } + + #endif +- if (netdev->reg_state == NETREG_REGISTERED) ++#if defined(HAVE_NETDEV_STORAGE_ADDRESS) && defined(NETDEV_HW_ADDR_T_SAN) ++ /* remove the added san mac */ ++ ixgbe_del_sanmac_netdev(netdev); ++ ++#endif /* (HAVE_NETDEV_STORAGE_ADDRESS) && (NETDEV_HW_ADDR_T_SAN) */ ++ if (adapter->netdev_registered) { + unregister_netdev(netdev); +- +- ixgbe_reset_interrupt_capability(adapter); +- ++ adapter->netdev_registered = false; ++ } ++ ++ ixgbe_clear_interrupt_scheme(adapter); + ixgbe_release_hw_control(adapter); + ++#ifdef IXGBE_TCP_TIMER ++ iounmap(adapter->msix_addr); ++#endif + iounmap(adapter->hw.hw_addr); + pci_release_regions(pdev); + + DPRINTK(PROBE, INFO, "complete\n"); +- ixgbe_napi_del_all(adapter); +- kfree(adapter->tx_ring); +- kfree(adapter->rx_ring); +- + free_netdev(netdev); + ++ pci_disable_pcie_error_reporting(pdev); ++ + pci_disable_device(pdev); + } + ++u16 ixgbe_read_pci_cfg_word(struct ixgbe_hw *hw, u32 reg) ++{ ++ u16 value; ++ struct ixgbe_adapter *adapter = hw->back; ++ ++ pci_read_config_word(adapter->pdev, reg, &value); ++ return value; ++} ++ ++void ixgbe_write_pci_cfg_word(struct ixgbe_hw *hw, u32 reg, u16 value) ++{ ++ struct ixgbe_adapter *adapter = hw->back; ++ ++ pci_write_config_word(adapter->pdev, reg, value); ++} ++ ++#ifdef HAVE_PCI_ERS + /** + * ixgbe_io_error_detected - called when PCI error is detected + * @pdev: Pointer to PCI device +@@ -4311,7 +6911,7 @@ + pci_channel_state_t state) + { + struct net_device *netdev = pci_get_drvdata(pdev); +- struct ixgbe_adapter *adapter = netdev->priv; ++ struct ixgbe_adapter *adapter = netdev_priv(netdev); + + netif_device_detach(netdev); + +@@ -4332,22 +6932,27 @@ + static pci_ers_result_t ixgbe_io_slot_reset(struct pci_dev *pdev) + { + struct net_device *netdev = pci_get_drvdata(pdev); +- struct ixgbe_adapter *adapter = netdev->priv; ++ struct ixgbe_adapter *adapter = netdev_priv(netdev); ++ pci_ers_result_t result; + + if (pci_enable_device(pdev)) { + DPRINTK(PROBE, ERR, +- "Cannot re-enable PCI device after reset.\n"); +- return PCI_ERS_RESULT_DISCONNECT; +- } +- pci_set_master(pdev); +- pci_restore_state(pdev); +- +- pci_enable_wake(pdev, PCI_D3hot, 0); +- pci_enable_wake(pdev, PCI_D3cold, 0); +- +- ixgbe_reset(adapter); +- +- return PCI_ERS_RESULT_RECOVERED; ++ "Cannot re-enable PCI device after reset.\n"); ++ result = PCI_ERS_RESULT_DISCONNECT; ++ } else { ++ pci_set_master(pdev); ++ pci_restore_state(pdev); ++ ++ pci_wake_from_d3(pdev, false); ++ ++ ixgbe_reset(adapter); ++ IXGBE_WRITE_REG(&adapter->hw, IXGBE_WUS, ~0); ++ result = PCI_ERS_RESULT_RECOVERED; ++ } ++ ++ pci_cleanup_aer_uncorrect_error_status(pdev); ++ ++ return result; + } + + /** +@@ -4360,7 +6965,7 @@ + static void ixgbe_io_resume(struct pci_dev *pdev) + { + struct net_device *netdev = pci_get_drvdata(pdev); +- struct ixgbe_adapter *adapter = netdev->priv; ++ struct ixgbe_adapter *adapter = netdev_priv(netdev); + + if (netif_running(netdev)) { + if (ixgbe_up(adapter)) { +@@ -4378,6 +6983,7 @@ + .resume = ixgbe_io_resume, + }; + ++#endif + static struct pci_driver ixgbe_driver = { + .name = ixgbe_driver_name, + .id_table = ixgbe_pci_tbl, +@@ -4387,9 +6993,21 @@ + .suspend = ixgbe_suspend, + .resume = ixgbe_resume, + #endif ++#ifndef USE_REBOOT_NOTIFIER + .shutdown = ixgbe_shutdown, ++#endif ++#ifdef HAVE_PCI_ERS + .err_handler = &ixgbe_err_handler ++#endif + }; ++ ++bool ixgbe_is_ixgbe(struct pci_dev *pcidev) ++{ ++ if (pci_dev_driver(pcidev) != &ixgbe_driver) ++ return false; ++ else ++ return true; ++} + + /** + * ixgbe_init_module - Driver Registration Routine +@@ -4399,16 +7017,21 @@ + **/ + static int __init ixgbe_init_module(void) + { +- printk(KERN_INFO "%s: %s - version %s\n", ixgbe_driver_name, +- ixgbe_driver_string, ixgbe_driver_version); +- +- printk(KERN_INFO "%s: %s\n", ixgbe_driver_name, ixgbe_copyright); +- ++ int ret; ++ printk(KERN_INFO "ixgbe: %s - version %s\n", ixgbe_driver_string, ++ ixgbe_driver_version); ++ ++ printk(KERN_INFO "%s\n", ixgbe_copyright); ++ ++#ifndef CONFIG_DCB ++ ixgbe_dcb_netlink_register(); ++#endif + #if defined(CONFIG_DCA) || defined(CONFIG_DCA_MODULE) + dca_register_notify(&dca_notifier); + + #endif +- return pci_register_driver(&ixgbe_driver); ++ ret = pci_register_driver(&ixgbe_driver); ++ return ret; + } + + module_init(ixgbe_init_module); +@@ -4424,6 +7047,9 @@ + #if defined(CONFIG_DCA) || defined(CONFIG_DCA_MODULE) + dca_unregister_notify(&dca_notifier); + #endif ++#ifndef CONFIG_DCB ++ ixgbe_dcb_netlink_unregister(); ++#endif + pci_unregister_driver(&ixgbe_driver); + } + +@@ -4439,7 +7065,7 @@ + return ret_val ? NOTIFY_BAD : NOTIFY_DONE; + } + #endif /* CONFIG_DCA or CONFIG_DCA_MODULE */ +- + module_exit(ixgbe_exit_module); + + /* ixgbe_main.c */ ++ +diff -r 3e5bbd731d89 drivers/net/ixgbe/ixgbe_osdep.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/ixgbe/ixgbe_osdep.h Mon Jun 15 12:06:28 2009 +0100 +@@ -0,0 +1,107 @@ ++/******************************************************************************* ++ ++ Intel 10 Gigabit PCI Express Linux driver ++ Copyright(c) 1999 - 2009 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++ ++/* glue for the OS independent part of ixgbe ++ * includes register access macros ++ */ ++ ++#ifndef _IXGBE_OSDEP_H_ ++#define _IXGBE_OSDEP_H_ ++ ++#include ++#include ++#include ++#include ++#include ++#include "kcompat.h" ++ ++ ++#ifndef msleep ++#define msleep(x) do { if(in_interrupt()) { \ ++ /* Don't mdelay in interrupt context! */ \ ++ BUG(); \ ++ } else { \ ++ msleep(x); \ ++ } } while (0) ++ ++#endif ++ ++#undef ASSERT ++ ++#ifdef DBG ++#define hw_dbg(hw, S, A...) printk(KERN_DEBUG S, ## A) ++#else ++#define hw_dbg(hw, S, A...) do {} while (0) ++#endif ++ ++#ifdef DBG ++#define IXGBE_WRITE_REG(a, reg, value) do {\ ++ switch (reg) { \ ++ case IXGBE_EIMS: \ ++ case IXGBE_EIMC: \ ++ case IXGBE_EIAM: \ ++ case IXGBE_EIAC: \ ++ case IXGBE_EICR: \ ++ case IXGBE_EICS: \ ++ printk("%s: Reg - 0x%05X, value - 0x%08X\n", __FUNCTION__, \ ++ reg, (u32)(value)); \ ++ default: \ ++ break; \ ++ } \ ++ writel((value), ((a)->hw_addr + (reg))); \ ++} while (0) ++#else ++#define IXGBE_WRITE_REG(a, reg, value) writel((value), ((a)->hw_addr + (reg))) ++#endif ++ ++#define IXGBE_READ_REG(a, reg) readl((a)->hw_addr + (reg)) ++ ++#define IXGBE_WRITE_REG_ARRAY(a, reg, offset, value) ( \ ++ writel((value), ((a)->hw_addr + (reg) + ((offset) << 2)))) ++ ++#define IXGBE_READ_REG_ARRAY(a, reg, offset) ( \ ++ readl((a)->hw_addr + (reg) + ((offset) << 2))) ++ ++#ifndef writeq ++#define writeq(val, addr) writel((u32) (val), addr); \ ++ writel((u32) (val >> 32), (addr + 4)); ++#endif ++ ++#define IXGBE_WRITE_REG64(a, reg, value) writeq((value), ((a)->hw_addr + (reg))) ++ ++#define IXGBE_WRITE_FLUSH(a) IXGBE_READ_REG(a, IXGBE_STATUS) ++struct ixgbe_hw; ++extern u16 ixgbe_read_pci_cfg_word(struct ixgbe_hw *hw, u32 reg); ++extern void ixgbe_write_pci_cfg_word(struct ixgbe_hw *hw, u32 reg, u16 value); ++#define IXGBE_READ_PCIE_WORD ixgbe_read_pci_cfg_word ++#define IXGBE_WRITE_PCIE_WORD ixgbe_write_pci_cfg_word ++#define IXGBE_EEPROM_GRANT_ATTEMPS 100 ++#define IXGBE_HTONL(_i) htonl(_i) ++#define IXGBE_HTONS(_i) htons(_i) ++ ++#endif /* _IXGBE_OSDEP_H_ */ +diff -r 3e5bbd731d89 drivers/net/ixgbe/ixgbe_param.c +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/ixgbe/ixgbe_param.c Mon Jun 15 12:06:28 2009 +0100 +@@ -0,0 +1,1030 @@ ++/******************************************************************************* ++ ++ Intel 10 Gigabit PCI Express Linux driver ++ Copyright(c) 1999 - 2009 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++#include ++#include ++ ++#include "ixgbe.h" ++ ++/* This is the only thing that needs to be changed to adjust the ++ * maximum number of ports that the driver can manage. ++ */ ++ ++#define IXGBE_MAX_NIC 8 ++ ++#define OPTION_UNSET -1 ++#define OPTION_DISABLED 0 ++#define OPTION_ENABLED 1 ++ ++/* All parameters are treated the same, as an integer array of values. ++ * This macro just reduces the need to repeat the same declaration code ++ * over and over (plus this helps to avoid typo bugs). ++ */ ++ ++#define IXGBE_PARAM_INIT { [0 ... IXGBE_MAX_NIC] = OPTION_UNSET } ++#ifndef module_param_array ++/* Module Parameters are always initialized to -1, so that the driver ++ * can tell the difference between no user specified value or the ++ * user asking for the default value. ++ * The true default values are loaded in when ixgbe_check_options is called. ++ * ++ * This is a GCC extension to ANSI C. ++ * See the item "Labeled Elements in Initializers" in the section ++ * "Extensions to the C Language Family" of the GCC documentation. ++ */ ++ ++#define IXGBE_PARAM(X, desc) \ ++ static const int __devinitdata X[IXGBE_MAX_NIC+1] = IXGBE_PARAM_INIT; \ ++ MODULE_PARM(X, "1-" __MODULE_STRING(IXGBE_MAX_NIC) "i"); \ ++ MODULE_PARM_DESC(X, desc); ++#else ++#define IXGBE_PARAM(X, desc) \ ++ static int __devinitdata X[IXGBE_MAX_NIC+1] = IXGBE_PARAM_INIT; \ ++ static unsigned int num_##X; \ ++ module_param_array_named(X, X, int, &num_##X, 0); \ ++ MODULE_PARM_DESC(X, desc); ++#endif ++ ++/* Interrupt Type ++ * ++ * Valid Range: 0-2 ++ * - 0 - Legacy Interrupt ++ * - 1 - MSI Interrupt ++ * - 2 - MSI-X Interrupt(s) ++ * ++ * Default Value: 2 ++ */ ++IXGBE_PARAM(InterruptType, "Change Interrupt Mode (0=Legacy, 1=MSI, 2=MSI-X), default 2"); ++#define IXGBE_INT_LEGACY 0 ++#define IXGBE_INT_MSI 1 ++#define IXGBE_INT_MSIX 2 ++#define IXGBE_DEFAULT_INT IXGBE_INT_MSIX ++ ++/* MQ - Multiple Queue enable/disable ++ * ++ * Valid Range: 0, 1 ++ * - 0 - disables MQ ++ * - 1 - enables MQ ++ * ++ * Default Value: 1 ++ */ ++ ++IXGBE_PARAM(MQ, "Disable or enable Multiple Queues, default 1"); ++ ++#if defined(CONFIG_DCA) || defined(CONFIG_DCA_MODULE) ++/* DCA - Direct Cache Access (DCA) Control ++ * ++ * This option allows the device to hint to DCA enabled processors ++ * which CPU should have its cache warmed with the data being ++ * transferred over PCIe. This can increase performance by reducing ++ * cache misses. ixgbe hardware supports DCA for: ++ * tx descriptor writeback ++ * rx descriptor writeback ++ * rx data ++ * rx data header only (in packet split mode) ++ * ++ * enabling option 2 can cause cache thrash in some tests, particularly ++ * if the CPU is completely utilized ++ * ++ * Valid Range: 0 - 2 ++ * - 0 - disables DCA ++ * - 1 - enables DCA ++ * - 2 - enables DCA with rx data included ++ * ++ * Default Value: 2 ++ */ ++ ++#define IXGBE_MAX_DCA 2 ++ ++IXGBE_PARAM(DCA, "Disable or enable Direct Cache Access, 0=disabled, 1=descriptor only, 2=descriptor and data"); ++ ++#endif ++/* RSS - Receive-Side Scaling (RSS) Descriptor Queues ++ * ++ * Valid Range: 0-16 ++ * - 0 - disables RSS ++ * - 1 - enables RSS and sets the Desc. Q's to min(16, num_online_cpus()). ++ * - 2-16 - enables RSS and sets the Desc. Q's to the specified value. ++ * ++ * Default Value: 1 ++ */ ++ ++IXGBE_PARAM(RSS, "Number of Receive-Side Scaling Descriptor Queues, default 1=number of cpus"); ++ ++/* VMDQ - Virtual Machine Device Queues (VMDQ) ++ * ++ * Valid Range: 1-16 ++ * - 1 Disables VMDQ by allocating only a single queue. ++ * - 2-16 - enables VMDQ and sets the Desc. Q's to the specified value. ++ * ++ * Default Value: 1 ++ */ ++ ++IXGBE_PARAM(VMDQ, "Number of Virtual Machine Device Queues: 0/1 = disable (default), 2-16 enable"); ++ ++/* Interrupt Throttle Rate (interrupts/sec) ++ * ++ * Valid Range: 956-488281 (0=off, 1=dynamic) ++ * ++ * Default Value: 8000 ++ */ ++#define DEFAULT_ITR 8000 ++IXGBE_PARAM(InterruptThrottleRate, "Maximum interrupts per second, per vector, (956-488281), default 8000"); ++#define MAX_ITR IXGBE_MAX_INT_RATE ++#define MIN_ITR IXGBE_MIN_INT_RATE ++ ++#ifndef IXGBE_NO_LLI ++/* LLIPort (Low Latency Interrupt TCP Port) ++ * ++ * Valid Range: 0 - 65535 ++ * ++ * Default Value: 0 (disabled) ++ */ ++IXGBE_PARAM(LLIPort, "Low Latency Interrupt TCP Port (0-65535)"); ++ ++#define DEFAULT_LLIPORT 0 ++#define MAX_LLIPORT 0xFFFF ++#define MIN_LLIPORT 0 ++ ++/* LLIPush (Low Latency Interrupt on TCP Push flag) ++ * ++ * Valid Range: 0,1 ++ * ++ * Default Value: 0 (disabled) ++ */ ++IXGBE_PARAM(LLIPush, "Low Latency Interrupt on TCP Push flag (0,1)"); ++ ++#define DEFAULT_LLIPUSH 0 ++#define MAX_LLIPUSH 1 ++#define MIN_LLIPUSH 0 ++ ++/* LLISize (Low Latency Interrupt on Packet Size) ++ * ++ * Valid Range: 0 - 1500 ++ * ++ * Default Value: 0 (disabled) ++ */ ++IXGBE_PARAM(LLISize, "Low Latency Interrupt on Packet Size (0-1500)"); ++ ++#define DEFAULT_LLISIZE 0 ++#define MAX_LLISIZE 1500 ++#define MIN_LLISIZE 0 ++ ++/* LLIEType (Low Latency Interrupt Ethernet Type) ++ * ++ * Valid Range: 0 - 0x8fff ++ * ++ * Default Value: 0 (disabled) ++ */ ++IXGBE_PARAM(LLIEType, "Low Latency Interrupt Ethernet Protocol Type"); ++ ++#define DEFAULT_LLIETYPE 0 ++#define MAX_LLIETYPE 0x8fff ++#define MIN_LLIETYPE 0 ++ ++/* LLIVLANP (Low Latency Interrupt on VLAN priority threshold) ++ * ++ * Valid Range: 0 - 7 ++ * ++ * Default Value: 0 (disabled) ++ */ ++IXGBE_PARAM(LLIVLANP, "Low Latency Interrupt on VLAN priority threshold"); ++ ++#define DEFAULT_LLIVLANP 0 ++#define MAX_LLIVLANP 7 ++#define MIN_LLIVLANP 0 ++ ++#endif /* IXGBE_NO_LLI */ ++/* Rx buffer mode ++ * ++ * Valid Range: 0-2 0 = 1buf_mode_always, 1 = ps_mode_always and 2 = optimal ++ * ++ * Default Value: 2 ++ */ ++IXGBE_PARAM(RxBufferMode, "0=1 descriptor per packet,\n" ++ "\t\t\t1=use packet split, multiple descriptors per jumbo frame\n" ++ "\t\t\t2 (default)=use 1buf mode for 1500 mtu, packet split for jumbo"); ++ ++#define IXGBE_RXBUFMODE_1BUF_ALWAYS 0 ++#define IXGBE_RXBUFMODE_PS_ALWAYS 1 ++#define IXGBE_RXBUFMODE_OPTIMAL 2 ++#define IXGBE_DEFAULT_RXBUFMODE IXGBE_RXBUFMODE_OPTIMAL ++ ++/* Flow Director filtering mode ++ * ++ * Valid Range: 0-2 0 = off, 1 = Hashing (ATR), and 2 = perfect filters ++ * ++ * Default Value: 1 (ATR) ++ */ ++IXGBE_PARAM(FdirMode, "Flow Director filtering modes:\n" ++ "\t\t\t0 = Filtering off\n" ++ "\t\t\t1 = Signature Hashing filters (SW ATR)\n" ++ "\t\t\t2 = Perfect Filters"); ++ ++#define IXGBE_FDIR_FILTER_OFF 0 ++#define IXGBE_FDIR_FILTER_HASH 1 ++#define IXGBE_FDIR_FILTER_PERFECT 2 ++#define IXGBE_DEFAULT_FDIR_FILTER IXGBE_FDIR_FILTER_HASH ++ ++/* Flow Director packet buffer allocation level ++ * ++ * Valid Range: 0-2 0 = 8k hash/2k perfect, 1 = 16k hash/4k perfect, ++ * 2 = 32k hash/8k perfect ++ * ++ * Default Value: 0 ++ */ ++IXGBE_PARAM(FdirPballoc, "Flow Director packet buffer allocation level:\n" ++ "\t\t\t0 = 8k hash filters or 2k perfect filters\n" ++ "\t\t\t1 = 16k hash filters or 4k perfect filters\n" ++ "\t\t\t2 = 32k hash filters or 8k perfect filters"); ++ ++#define IXGBE_FDIR_PBALLOC_64K 0 ++#define IXGBE_FDIR_PBALLOC_128K 1 ++#define IXGBE_FDIR_PBALLOC_256K 2 ++#define IXGBE_DEFAULT_FDIR_PBALLOC IXGBE_FDIR_PBALLOC_64K ++ ++/* Software ATR packet sample rate ++ * ++ * Valid Range: 0-100 0 = off, 1-100 = rate of Tx packet inspection ++ * ++ * Default Value: 20 ++ */ ++IXGBE_PARAM(AtrSampleRate, "Software ATR Tx packet sample rate"); ++ ++#define IXGBE_MAX_ATR_SAMPLE_RATE 100 ++#define IXGBE_MIN_ATR_SAMPLE_RATE 1 ++#define IXGBE_ATR_SAMPLE_RATE_OFF 0 ++#define IXGBE_DEFAULT_ATR_SAMPLE_RATE 20 ++ ++struct ixgbe_option { ++ enum { enable_option, range_option, list_option } type; ++ const char *name; ++ const char *err; ++ int def; ++ union { ++ struct { /* range_option info */ ++ int min; ++ int max; ++ } r; ++ struct { /* list_option info */ ++ int nr; ++ const struct ixgbe_opt_list { ++ int i; ++ char *str; ++ } *p; ++ } l; ++ } arg; ++}; ++ ++static int __devinit ixgbe_validate_option(unsigned int *value, ++ struct ixgbe_option *opt) ++{ ++ if (*value == OPTION_UNSET) { ++ *value = opt->def; ++ return 0; ++ } ++ ++ switch (opt->type) { ++ case enable_option: ++ switch (*value) { ++ case OPTION_ENABLED: ++ printk(KERN_INFO "ixgbe: %s Enabled\n", opt->name); ++ return 0; ++ case OPTION_DISABLED: ++ printk(KERN_INFO "ixgbe: %s Disabled\n", opt->name); ++ return 0; ++ } ++ break; ++ case range_option: ++ if (*value >= opt->arg.r.min && *value <= opt->arg.r.max) { ++ printk(KERN_INFO "ixgbe: %s set to %d\n", opt->name, *value); ++ return 0; ++ } ++ break; ++ case list_option: { ++ int i; ++ const struct ixgbe_opt_list *ent; ++ ++ for (i = 0; i < opt->arg.l.nr; i++) { ++ ent = &opt->arg.l.p[i]; ++ if (*value == ent->i) { ++ if (ent->str[0] != '\0') ++ printk(KERN_INFO "%s\n", ent->str); ++ return 0; ++ } ++ } ++ } ++ break; ++ default: ++ BUG(); ++ } ++ ++ printk(KERN_INFO "ixgbe: Invalid %s specified (%d), %s\n", ++ opt->name, *value, opt->err); ++ *value = opt->def; ++ return -1; ++} ++ ++#define LIST_LEN(l) (sizeof(l) / sizeof(l[0])) ++ ++/** ++ * ixgbe_check_options - Range Checking for Command Line Parameters ++ * @adapter: board private structure ++ * ++ * This routine checks all command line parameters for valid user ++ * input. If an invalid value is given, or if no user specified ++ * value exists, a default value is used. The final value is stored ++ * in a variable in the adapter structure. ++ **/ ++void __devinit ixgbe_check_options(struct ixgbe_adapter *adapter) ++{ ++ int bd = adapter->bd_number; ++ u32 *aflags = &adapter->flags; ++ struct ixgbe_ring_feature *feature = adapter->ring_feature; ++ ++ if (bd >= IXGBE_MAX_NIC) { ++ printk(KERN_NOTICE ++ "Warning: no configuration for board #%d\n", bd); ++ printk(KERN_NOTICE "Using defaults for all values\n"); ++#ifndef module_param_array ++ bd = IXGBE_MAX_NIC; ++#endif ++ } ++ ++ { /* Interrupt Type */ ++ unsigned int i_type; ++ static struct ixgbe_option opt = { ++ .type = range_option, ++ .name = "Interrupt Type", ++ .err = ++ "using default of "__MODULE_STRING(IXGBE_DEFAULT_INT), ++ .def = IXGBE_DEFAULT_INT, ++ .arg = { .r = { .min = IXGBE_INT_LEGACY, ++ .max = IXGBE_INT_MSIX}} ++ }; ++ ++#ifdef module_param_array ++ if (num_InterruptType > bd) { ++#endif ++ i_type = InterruptType[bd]; ++ ixgbe_validate_option(&i_type, &opt); ++ switch (i_type) { ++ case IXGBE_INT_MSIX: ++ if (!(*aflags & IXGBE_FLAG_MSIX_CAPABLE)) ++ printk(KERN_INFO ++ "Ignoring MSI-X setting; " ++ "support unavailable\n"); ++ break; ++ case IXGBE_INT_MSI: ++ if (!(*aflags & IXGBE_FLAG_MSI_CAPABLE)) { ++ printk(KERN_INFO ++ "Ignoring MSI setting; " ++ "support unavailable\n"); ++ } else { ++ *aflags &= ~IXGBE_FLAG_MSIX_CAPABLE; ++ *aflags &= ~IXGBE_FLAG_DCB_CAPABLE; ++ } ++ break; ++ case IXGBE_INT_LEGACY: ++ default: ++ *aflags &= ~IXGBE_FLAG_MSIX_CAPABLE; ++ *aflags &= ~IXGBE_FLAG_MSI_CAPABLE; ++ *aflags &= ~IXGBE_FLAG_DCB_CAPABLE; ++ break; ++ } ++#ifdef module_param_array ++ } else { ++ *aflags |= IXGBE_FLAG_MSIX_CAPABLE; ++ *aflags |= IXGBE_FLAG_MSI_CAPABLE; ++ } ++#endif ++ } ++ { /* Multiple Queue Support */ ++ static struct ixgbe_option opt = { ++ .type = enable_option, ++ .name = "Multiple Queue Support", ++ .err = "defaulting to Enabled", ++ .def = OPTION_ENABLED ++ }; ++ ++#ifdef module_param_array ++ if (num_MQ > bd) { ++#endif ++ unsigned int mq = MQ[bd]; ++ ixgbe_validate_option(&mq, &opt); ++ if (mq) ++ *aflags |= IXGBE_FLAG_MQ_CAPABLE; ++ else ++ *aflags &= ~IXGBE_FLAG_MQ_CAPABLE; ++#ifdef module_param_array ++ } else { ++ if (opt.def == OPTION_ENABLED) ++ *aflags |= IXGBE_FLAG_MQ_CAPABLE; ++ else ++ *aflags &= ~IXGBE_FLAG_MQ_CAPABLE; ++ } ++#endif ++ /* Check Interoperability */ ++ if ((*aflags & IXGBE_FLAG_MQ_CAPABLE) && ++ !(*aflags & IXGBE_FLAG_MSIX_CAPABLE)) { ++ DPRINTK(PROBE, INFO, ++ "Multiple queues are not supported while MSI-X " ++ "is disabled. Disabling Multiple Queues.\n"); ++ *aflags &= ~IXGBE_FLAG_MQ_CAPABLE; ++ } ++ } ++#if defined(CONFIG_DCA) || defined(CONFIG_DCA_MODULE) ++ { /* Direct Cache Access (DCA) */ ++ static struct ixgbe_option opt = { ++ .type = range_option, ++ .name = "Direct Cache Access (DCA)", ++ .err = "defaulting to Enabled", ++ .def = IXGBE_MAX_DCA, ++ .arg = { .r = { .min = OPTION_DISABLED, ++ .max = IXGBE_MAX_DCA}} ++ }; ++ unsigned int dca = opt.def; ++ ++#ifdef module_param_array ++ if (num_DCA > bd) { ++#endif ++ dca = DCA[bd]; ++ ixgbe_validate_option(&dca, &opt); ++ if (!dca) ++ *aflags &= ~IXGBE_FLAG_DCA_CAPABLE; ++ ++ /* Check Interoperability */ ++ if (!(*aflags & IXGBE_FLAG_DCA_CAPABLE)) { ++ DPRINTK(PROBE, INFO, "DCA is disabled\n"); ++ *aflags &= ~IXGBE_FLAG_DCA_ENABLED; ++ } ++ ++ if (dca == IXGBE_MAX_DCA) { ++ DPRINTK(PROBE, INFO, ++ "DCA enabled for rx data\n"); ++ adapter->flags |= IXGBE_FLAG_DCA_ENABLED_DATA; ++ } ++#ifdef module_param_array ++ } else { ++ /* make sure to clear the capability flag if the ++ * option is disabled by default above */ ++ if (opt.def == OPTION_DISABLED) ++ *aflags &= ~IXGBE_FLAG_DCA_CAPABLE; ++ } ++#endif ++ if (dca == IXGBE_MAX_DCA) ++ adapter->flags |= IXGBE_FLAG_DCA_ENABLED_DATA; ++ } ++#endif /* CONFIG_DCA or CONFIG_DCA_MODULE */ ++ { /* Receive-Side Scaling (RSS) */ ++ static struct ixgbe_option opt = { ++ .type = range_option, ++ .name = "Receive-Side Scaling (RSS)", ++ .err = "using default.", ++ .def = OPTION_ENABLED, ++ .arg = { .r = { .min = OPTION_DISABLED, ++ .max = IXGBE_MAX_RSS_INDICES}} ++ }; ++ unsigned int rss = RSS[bd]; ++ ++#ifdef module_param_array ++ if (num_RSS > bd) { ++#endif ++ switch (rss) { ++ case 1: ++ /* ++ * Base it off num_online_cpus() with ++ * a hardware limit cap. ++ */ ++ rss = min(IXGBE_MAX_RSS_INDICES, ++ (int)num_online_cpus()); ++ break; ++ default: ++ ixgbe_validate_option(&rss, &opt); ++ break; ++ } ++ feature[RING_F_RSS].indices = rss; ++ if (rss) ++ *aflags |= IXGBE_FLAG_RSS_ENABLED; ++ else ++ *aflags &= ~IXGBE_FLAG_RSS_ENABLED; ++#ifdef module_param_array ++ } else { ++ if (opt.def == OPTION_DISABLED) { ++ *aflags &= ~IXGBE_FLAG_RSS_ENABLED; ++ } else { ++ rss = min(IXGBE_MAX_RSS_INDICES, ++ (int)num_online_cpus()); ++ feature[RING_F_RSS].indices = rss; ++ if (rss) ++ *aflags |= IXGBE_FLAG_RSS_ENABLED; ++ else ++ *aflags &= ~IXGBE_FLAG_RSS_ENABLED; ++ } ++ } ++#endif ++ /* Check Interoperability */ ++ if (*aflags & IXGBE_FLAG_RSS_ENABLED) { ++ if (!(*aflags & IXGBE_FLAG_RSS_CAPABLE)) { ++ DPRINTK(PROBE, INFO, ++ "RSS is not supported on this " ++ "hardware. Disabling RSS.\n"); ++ *aflags &= ~IXGBE_FLAG_RSS_ENABLED; ++ feature[RING_F_RSS].indices = 0; ++ } else if (!(*aflags & IXGBE_FLAG_MQ_CAPABLE)) { ++ DPRINTK(PROBE, INFO, ++ "RSS is not supported while multiple " ++ "queues are disabled. " ++ "Disabling RSS.\n"); ++ *aflags &= ~IXGBE_FLAG_RSS_ENABLED; ++ *aflags &= ~IXGBE_FLAG_DCB_CAPABLE; ++ feature[RING_F_RSS].indices = 0; ++ } ++ } ++ } ++ { /* Virtual Machine Device Queues (VMDQ) */ ++ static struct ixgbe_option opt = { ++ .type = range_option, ++ .name = "Virtual Machine Device Queues (VMDQ)", ++ .err = "defaulting to Disabled", ++ .def = OPTION_DISABLED, ++ .arg = { .r = { .min = OPTION_DISABLED, ++ .max = IXGBE_MAX_VMDQ_INDICES}} ++ }; ++ ++#ifdef module_param_array ++ if (num_VMDQ > bd) { ++#endif ++ unsigned int vmdq = VMDQ[bd]; ++ ixgbe_validate_option(&vmdq, &opt); ++ feature[RING_F_VMDQ].indices = vmdq; ++ adapter->flags2 |= IXGBE_FLAG2_VMDQ_DEFAULT_OVERRIDE; ++ /* zero or one both mean disabled from our driver's ++ * perspective */ ++ if (vmdq > 1) ++ *aflags |= IXGBE_FLAG_VMDQ_ENABLED; ++ else ++ *aflags &= ~IXGBE_FLAG_VMDQ_ENABLED; ++#ifdef module_param_array ++ } else { ++ if (opt.def == OPTION_DISABLED) { ++ *aflags &= ~IXGBE_FLAG_VMDQ_ENABLED; ++ } else { ++ feature[RING_F_VMDQ].indices = 8; ++ *aflags |= IXGBE_FLAG_VMDQ_ENABLED; ++ } ++ } ++#endif ++ /* Check Interoperability */ ++ if (*aflags & IXGBE_FLAG_VMDQ_ENABLED) { ++ if (!(*aflags & IXGBE_FLAG_VMDQ_CAPABLE)) { ++ DPRINTK(PROBE, INFO, ++ "VMDQ is not supported on this " ++ "hardware. Disabling VMDQ.\n"); ++ *aflags &= ~IXGBE_FLAG_VMDQ_ENABLED; ++ feature[RING_F_VMDQ].indices = 0; ++ } else if (!(*aflags & IXGBE_FLAG_MQ_CAPABLE)) { ++ DPRINTK(PROBE, INFO, ++ "VMDQ is not supported while multiple " ++ "queues are disabled. " ++ "Disabling VMDQ.\n"); ++ *aflags &= ~IXGBE_FLAG_VMDQ_ENABLED; ++ feature[RING_F_VMDQ].indices = 0; ++ } ++ if (adapter->hw.mac.type == ixgbe_mac_82598EB) { ++ /* for now, disable RSS when using VMDQ mode */ ++ *aflags &= ~IXGBE_FLAG_RSS_CAPABLE; ++ *aflags &= ~IXGBE_FLAG_RSS_ENABLED; ++ } else if (adapter->hw.mac.type == ixgbe_mac_82599EB) { ++ if (feature[RING_F_RSS].indices > 2 ++ && feature[RING_F_VMDQ].indices > 32) ++ feature[RING_F_RSS].indices = 2; ++ else if (feature[RING_F_RSS].indices != 0) ++ feature[RING_F_RSS].indices = 4; ++ } ++ } ++ } ++ { /* Interrupt Throttling Rate */ ++ static struct ixgbe_option opt = { ++ .type = range_option, ++ .name = "Interrupt Throttling Rate (ints/sec)", ++ .err = "using default of "__MODULE_STRING(DEFAULT_ITR), ++ .def = DEFAULT_ITR, ++ .arg = { .r = { .min = MIN_ITR, ++ .max = MAX_ITR }} ++ }; ++ ++#ifdef module_param_array ++ if (num_InterruptThrottleRate > bd) { ++#endif ++ u32 eitr = InterruptThrottleRate[bd]; ++ switch (eitr) { ++ case 0: ++ DPRINTK(PROBE, INFO, "%s turned off\n", ++ opt.name); ++ /* ++ * zero is a special value, we don't want to ++ * turn off ITR completely, just set it to an ++ * insane interrupt rate ++ */ ++ adapter->eitr_param = IXGBE_MAX_INT_RATE; ++ adapter->itr_setting = 0; ++ break; ++ case 1: ++ DPRINTK(PROBE, INFO, "dynamic interrupt " ++ "throttling enabled\n"); ++ adapter->eitr_param = 20000; ++ adapter->itr_setting = 1; ++ break; ++ default: ++ ixgbe_validate_option(&eitr, &opt); ++ adapter->eitr_param = eitr; ++ /* the first bit is used as control */ ++ adapter->itr_setting = eitr & ~1; ++ break; ++ } ++#ifdef module_param_array ++ } else { ++ adapter->eitr_param = DEFAULT_ITR; ++ adapter->itr_setting = DEFAULT_ITR; ++ } ++#endif ++ } ++#ifndef IXGBE_NO_LLI ++ { /* Low Latency Interrupt TCP Port*/ ++ static struct ixgbe_option opt = { ++ .type = range_option, ++ .name = "Low Latency Interrupt TCP Port", ++ .err = "using default of " ++ __MODULE_STRING(DEFAULT_LLIPORT), ++ .def = DEFAULT_LLIPORT, ++ .arg = { .r = { .min = MIN_LLIPORT, ++ .max = MAX_LLIPORT }} ++ }; ++ ++#ifdef module_param_array ++ if (num_LLIPort > bd) { ++#endif ++ adapter->lli_port = LLIPort[bd]; ++ if (adapter->lli_port) { ++ ixgbe_validate_option(&adapter->lli_port, &opt); ++ } else { ++ DPRINTK(PROBE, INFO, "%s turned off\n", ++ opt.name); ++ } ++#ifdef module_param_array ++ } else { ++ adapter->lli_port = opt.def; ++ } ++#endif ++ } ++ { /* Low Latency Interrupt on Packet Size */ ++ static struct ixgbe_option opt = { ++ .type = range_option, ++ .name = "Low Latency Interrupt on Packet Size", ++ .err = "using default of " ++ __MODULE_STRING(DEFAULT_LLISIZE), ++ .def = DEFAULT_LLISIZE, ++ .arg = { .r = { .min = MIN_LLISIZE, ++ .max = MAX_LLISIZE }} ++ }; ++ ++#ifdef module_param_array ++ if (num_LLISize > bd) { ++#endif ++ adapter->lli_size = LLISize[bd]; ++ if (adapter->lli_size) { ++ ixgbe_validate_option(&adapter->lli_size, &opt); ++ } else { ++ DPRINTK(PROBE, INFO, "%s turned off\n", ++ opt.name); ++ } ++#ifdef module_param_array ++ } else { ++ adapter->lli_size = opt.def; ++ } ++#endif ++ } ++ { /*Low Latency Interrupt on TCP Push flag*/ ++ static struct ixgbe_option opt = { ++ .type = enable_option, ++ .name = "Low Latency Interrupt on TCP Push flag", ++ .err = "defaulting to Disabled", ++ .def = OPTION_DISABLED ++ }; ++ ++#ifdef module_param_array ++ if (num_LLIPush > bd) { ++#endif ++ unsigned int lli_push = LLIPush[bd]; ++ ixgbe_validate_option(&lli_push, &opt); ++ if (lli_push) ++ *aflags |= IXGBE_FLAG_LLI_PUSH; ++ else ++ *aflags &= ~IXGBE_FLAG_LLI_PUSH; ++#ifdef module_param_array ++ } else { ++ if (opt.def == OPTION_ENABLED) ++ *aflags |= IXGBE_FLAG_LLI_PUSH; ++ else ++ *aflags &= ~IXGBE_FLAG_LLI_PUSH; ++ } ++#endif ++ } ++ { /* Low Latency Interrupt EtherType*/ ++ static struct ixgbe_option opt = { ++ .type = range_option, ++ .name = "Low Latency Interrupt on Ethernet Protocol Type", ++ .err = "using default of " ++ __MODULE_STRING(DEFAULT_LLIETYPE), ++ .def = DEFAULT_LLIETYPE, ++ .arg = { .r = { .min = MIN_LLIETYPE, ++ .max = MAX_LLIETYPE }} ++ }; ++ ++#ifdef module_param_array ++ if (num_LLIEType > bd) { ++#endif ++ adapter->lli_etype = LLIEType[bd]; ++ if (adapter->lli_etype) { ++ ixgbe_validate_option(&adapter->lli_etype, &opt); ++ } else { ++ DPRINTK(PROBE, INFO, "%s turned off\n", ++ opt.name); ++ } ++#ifdef module_param_array ++ } else { ++ adapter->lli_etype = opt.def; ++ } ++#endif ++ } ++ { /* LLI VLAN Priority */ ++ static struct ixgbe_option opt = { ++ .type = range_option, ++ .name = "Low Latency Interrupt on VLAN priority threashold", ++ .err = "using default of " ++ __MODULE_STRING(DEFAULT_LLIVLANP), ++ .def = DEFAULT_LLIVLANP, ++ .arg = { .r = { .min = MIN_LLIVLANP, ++ .max = MAX_LLIVLANP }} ++ }; ++ ++#ifdef module_param_array ++ if (num_LLIVLANP > bd) { ++#endif ++ adapter->lli_vlan_pri = LLIVLANP[bd]; ++ if (adapter->lli_vlan_pri) { ++ ixgbe_validate_option(&adapter->lli_vlan_pri, &opt); ++ } else { ++ DPRINTK(PROBE, INFO, "%s turned off\n", ++ opt.name); ++ } ++#ifdef module_param_array ++ } else { ++ adapter->lli_vlan_pri = opt.def; ++ } ++#endif ++ } ++#endif /* IXGBE_NO_LLI */ ++ { /* Rx buffer mode */ ++ unsigned int rx_buf_mode; ++ static struct ixgbe_option opt = { ++ .type = range_option, ++ .name = "Rx buffer mode", ++ .err = "using default of " ++ __MODULE_STRING(IXGBE_DEFAULT_RXBUFMODE), ++ .def = IXGBE_DEFAULT_RXBUFMODE, ++ .arg = {.r = {.min = IXGBE_RXBUFMODE_1BUF_ALWAYS, ++ .max = IXGBE_RXBUFMODE_OPTIMAL}} ++ }; ++ ++#ifdef module_param_array ++ if (num_RxBufferMode > bd) { ++#endif ++ rx_buf_mode = RxBufferMode[bd]; ++ ixgbe_validate_option(&rx_buf_mode, &opt); ++ switch (rx_buf_mode) { ++ case IXGBE_RXBUFMODE_OPTIMAL: ++ *aflags |= IXGBE_FLAG_RX_1BUF_CAPABLE; ++ *aflags |= IXGBE_FLAG_RX_PS_CAPABLE; ++ break; ++ case IXGBE_RXBUFMODE_PS_ALWAYS: ++ *aflags |= IXGBE_FLAG_RX_PS_CAPABLE; ++ break; ++ case IXGBE_RXBUFMODE_1BUF_ALWAYS: ++ *aflags |= IXGBE_FLAG_RX_1BUF_CAPABLE; ++ default: ++ break; ++ } ++#ifdef module_param_array ++ } else { ++ *aflags |= IXGBE_FLAG_RX_1BUF_CAPABLE; ++ *aflags |= IXGBE_FLAG_RX_PS_CAPABLE; ++ } ++#endif ++ } ++ { /* Flow Director filtering mode */ ++ unsigned int fdir_filter_mode; ++ static struct ixgbe_option opt = { ++ .type = range_option, ++ .name = "Flow Director filtering mode", ++ .err = "using default of " ++ __MODULE_STRING(IXGBE_DEFAULT_FDIR_FILTER), ++ .def = IXGBE_DEFAULT_FDIR_FILTER, ++ .arg = {.r = {.min = IXGBE_FDIR_FILTER_OFF, ++ .max = IXGBE_FDIR_FILTER_PERFECT}} ++ }; ++ ++ *aflags &= ~IXGBE_FLAG_FDIR_HASH_CAPABLE; ++ *aflags &= ~IXGBE_FLAG_FDIR_PERFECT_CAPABLE; ++ if (adapter->hw.mac.type == ixgbe_mac_82598EB) ++ goto no_flow_director; ++#ifdef module_param_array ++ if (num_FdirMode > bd) { ++#endif ++#ifdef HAVE_TX_MQ ++ fdir_filter_mode = FdirMode[bd]; ++#else ++ fdir_filter_mode = IXGBE_FDIR_FILTER_OFF; ++#endif /* HAVE_TX_MQ */ ++ ixgbe_validate_option(&fdir_filter_mode, &opt); ++ ++ switch (fdir_filter_mode) { ++ case IXGBE_FDIR_FILTER_OFF: ++ DPRINTK(PROBE, INFO, "Flow Director disabled\n"); ++ break; ++ case IXGBE_FDIR_FILTER_HASH: ++ *aflags |= IXGBE_FLAG_FDIR_HASH_CAPABLE; ++ *aflags &= ~IXGBE_FLAG_FDIR_PERFECT_CAPABLE; ++ feature[RING_F_FDIR].indices = ++ IXGBE_MAX_FDIR_INDICES; ++ DPRINTK(PROBE, INFO, ++ "Flow Director hash filtering enabled\n"); ++ break; ++ case IXGBE_FDIR_FILTER_PERFECT: ++ *aflags &= ~IXGBE_FLAG_FDIR_HASH_CAPABLE; ++ *aflags |= IXGBE_FLAG_FDIR_PERFECT_CAPABLE; ++ feature[RING_F_FDIR].indices = ++ IXGBE_MAX_FDIR_INDICES; ++ spin_lock_init(&adapter->fdir_perfect_lock); ++ DPRINTK(PROBE, INFO, ++ "Flow Director perfect filtering enabled\n"); ++ break; ++ default: ++ break; ++ } ++#ifdef module_param_array ++ } else { ++#ifdef HAVE_TX_MQ ++ *aflags |= IXGBE_FLAG_FDIR_HASH_CAPABLE; ++ feature[RING_F_FDIR].indices = IXGBE_MAX_FDIR_INDICES; ++ DPRINTK(PROBE, INFO, ++ "Flow Director hash filtering enabled\n"); ++#else ++ *aflags &= ~IXGBE_FLAG_FDIR_HASH_CAPABLE; ++ *aflags &= ~IXGBE_FLAG_FDIR_PERFECT_CAPABLE; ++ feature[RING_F_FDIR].indices = 0; ++ DPRINTK(PROBE, INFO, ++ "Flow Director hash filtering disabled\n"); ++#endif /* HAVE_TX_MQ */ ++ } ++ /* Check interoperability */ ++ if ((*aflags & IXGBE_FLAG_FDIR_HASH_CAPABLE) || ++ (*aflags & IXGBE_FLAG_FDIR_PERFECT_CAPABLE)) { ++ if (!(*aflags & IXGBE_FLAG_MQ_CAPABLE)) { ++ DPRINTK(PROBE, INFO, ++ "Flow Director is not supported " ++ "while multiple queues are disabled. " ++ "Disabling Flow Director\n"); ++ *aflags &= ~IXGBE_FLAG_FDIR_HASH_CAPABLE; ++ *aflags &= ~IXGBE_FLAG_FDIR_PERFECT_CAPABLE; ++ } ++ } ++#endif ++no_flow_director: ++ /* empty code line with semi-colon */ ; ++ } ++ { /* Flow Director packet buffer allocation */ ++ unsigned int fdir_pballoc_mode; ++ static struct ixgbe_option opt = { ++ .type = range_option, ++ .name = "Flow Director packet buffer allocation", ++ .err = "using default of " ++ __MODULE_STRING(IXGBE_DEFAULT_FDIR_PBALLOC), ++ .def = IXGBE_DEFAULT_FDIR_PBALLOC, ++ .arg = {.r = {.min = IXGBE_FDIR_PBALLOC_64K, ++ .max = IXGBE_FDIR_PBALLOC_256K}} ++ }; ++ ++ if ((adapter->hw.mac.type == ixgbe_mac_82598EB) || ++ (!(*aflags & (IXGBE_FLAG_FDIR_HASH_CAPABLE | ++ IXGBE_FLAG_FDIR_PERFECT_CAPABLE)))) ++ goto no_fdir_pballoc; ++#ifdef module_param_array ++ if (num_FdirPballoc > bd) { ++#endif ++ char pstring[10]; ++ fdir_pballoc_mode = FdirPballoc[bd]; ++ ixgbe_validate_option(&fdir_pballoc_mode, &opt); ++ switch (fdir_pballoc_mode) { ++ case IXGBE_FDIR_PBALLOC_64K: ++ adapter->fdir_pballoc = IXGBE_FDIR_PBALLOC_64K; ++ sprintf(pstring, "64kB"); ++ break; ++ case IXGBE_FDIR_PBALLOC_128K: ++ adapter->fdir_pballoc = IXGBE_FDIR_PBALLOC_128K; ++ sprintf(pstring, "128kB"); ++ break; ++ case IXGBE_FDIR_PBALLOC_256K: ++ adapter->fdir_pballoc = IXGBE_FDIR_PBALLOC_256K; ++ sprintf(pstring, "256kB"); ++ break; ++ default: ++ break; ++ } ++ DPRINTK(PROBE, INFO, ++ "Flow Director allocated %s of packet buffer\n", ++ pstring); ++ ++#ifdef module_param_array ++ } else { ++ adapter->fdir_pballoc = opt.def; ++ DPRINTK(PROBE, INFO, ++ "Flow Director allocated 64kB of packet buffer\n"); ++ ++ } ++#endif ++no_fdir_pballoc: ++ /* empty code line with semi-colon */ ; ++ } ++ { /* Flow Director ATR Tx sample packet rate */ ++ static struct ixgbe_option opt = { ++ .type = range_option, ++ .name = "Software ATR Tx packet sample rate", ++ .err = "using default of " ++ __MODULE_STRING(IXGBE_DEFAULT_ATR_SAMPLE_RATE), ++ .def = IXGBE_DEFAULT_ATR_SAMPLE_RATE, ++ .arg = {.r = {.min = IXGBE_ATR_SAMPLE_RATE_OFF, ++ .max = IXGBE_MAX_ATR_SAMPLE_RATE}} ++ }; ++ static const char atr_string[] = ++ "ATR Tx Packet sample rate set to"; ++ ++ adapter->atr_sample_rate = IXGBE_ATR_SAMPLE_RATE_OFF; ++ if (adapter->hw.mac.type == ixgbe_mac_82598EB) ++ goto no_fdir_sample; ++ ++ /* no sample rate for perfect filtering */ ++ if (*aflags & IXGBE_FLAG_FDIR_PERFECT_CAPABLE) ++ goto no_fdir_sample; ++#ifdef module_param_array ++ if (num_AtrSampleRate > bd) { ++#endif ++ /* Only enable the sample rate if hashing (ATR) is on */ ++ if (*aflags & IXGBE_FLAG_FDIR_HASH_CAPABLE) ++ adapter->atr_sample_rate = AtrSampleRate[bd]; ++ ++ if (adapter->atr_sample_rate) { ++ ixgbe_validate_option(&adapter->atr_sample_rate, ++ &opt); ++ DPRINTK(PROBE, INFO, "%s %d\n", atr_string, ++ adapter->atr_sample_rate); ++ } ++#ifdef module_param_array ++ } else { ++ /* Only enable the sample rate if hashing (ATR) is on */ ++ if (*aflags & IXGBE_FLAG_FDIR_HASH_CAPABLE) ++ adapter->atr_sample_rate = opt.def; ++ ++ DPRINTK(PROBE, INFO, "%s default of %d\n", atr_string, ++ adapter->atr_sample_rate); ++ } ++#endif ++no_fdir_sample: ++ /* empty code line with semi-colon */ ; ++ } ++} +diff -r 3e5bbd731d89 drivers/net/ixgbe/ixgbe_phy.c +--- a/drivers/net/ixgbe/ixgbe_phy.c Mon Jun 15 12:00:22 2009 +0100 ++++ b/drivers/net/ixgbe/ixgbe_phy.c Mon Jun 15 12:06:28 2009 +0100 +@@ -1,7 +1,7 @@ + /******************************************************************************* + + Intel 10 Gigabit PCI Express Linux driver +- Copyright(c) 1999 - 2008 Intel Corporation. ++ Copyright(c) 1999 - 2009 Intel Corporation. + + This program is free software; you can redistribute it and/or modify it + under the terms and conditions of the GNU General Public License, +@@ -25,16 +25,52 @@ + + *******************************************************************************/ + +-#include +-#include +-#include +- ++#include "ixgbe_api.h" + #include "ixgbe_common.h" + #include "ixgbe_phy.h" + +-static bool ixgbe_validate_phy_addr(struct ixgbe_hw *hw, u32 phy_addr); +-static enum ixgbe_phy_type ixgbe_get_phy_type_from_id(u32 phy_id); +-static s32 ixgbe_get_phy_id(struct ixgbe_hw *hw); ++static void ixgbe_i2c_start(struct ixgbe_hw *hw); ++static void ixgbe_i2c_stop(struct ixgbe_hw *hw); ++static s32 ixgbe_clock_in_i2c_byte(struct ixgbe_hw *hw, u8 *data); ++static s32 ixgbe_clock_out_i2c_byte(struct ixgbe_hw *hw, u8 data); ++static s32 ixgbe_get_i2c_ack(struct ixgbe_hw *hw); ++static s32 ixgbe_clock_in_i2c_bit(struct ixgbe_hw *hw, bool *data); ++static s32 ixgbe_clock_out_i2c_bit(struct ixgbe_hw *hw, bool data); ++static s32 ixgbe_raise_i2c_clk(struct ixgbe_hw *hw, u32 *i2cctl); ++static void ixgbe_lower_i2c_clk(struct ixgbe_hw *hw, u32 *i2cctl); ++static s32 ixgbe_set_i2c_data(struct ixgbe_hw *hw, u32 *i2cctl, bool data); ++static bool ixgbe_get_i2c_data(u32 *i2cctl); ++void ixgbe_i2c_bus_clear(struct ixgbe_hw *hw); ++ ++/** ++ * ixgbe_init_phy_ops_generic - Inits PHY function ptrs ++ * @hw: pointer to the hardware structure ++ * ++ * Initialize the function pointers. ++ **/ ++s32 ixgbe_init_phy_ops_generic(struct ixgbe_hw *hw) ++{ ++ struct ixgbe_phy_info *phy = &hw->phy; ++ ++ /* PHY */ ++ phy->ops.identify = &ixgbe_identify_phy_generic; ++ phy->ops.reset = &ixgbe_reset_phy_generic; ++ phy->ops.read_reg = &ixgbe_read_phy_reg_generic; ++ phy->ops.write_reg = &ixgbe_write_phy_reg_generic; ++ phy->ops.setup_link = &ixgbe_setup_phy_link_generic; ++ phy->ops.setup_link_speed = &ixgbe_setup_phy_link_speed_generic; ++ phy->ops.check_link = NULL; ++ phy->ops.get_firmware_version = NULL; ++ phy->ops.read_i2c_byte = &ixgbe_read_i2c_byte_generic; ++ phy->ops.write_i2c_byte = &ixgbe_write_i2c_byte_generic; ++ phy->ops.read_i2c_eeprom = &ixgbe_read_i2c_eeprom_generic; ++ phy->ops.write_i2c_eeprom = &ixgbe_write_i2c_eeprom_generic; ++ phy->ops.i2c_bus_clear = &ixgbe_i2c_bus_clear; ++ phy->ops.identify_sfp = &ixgbe_identify_sfp_module_generic; ++ phy->sfp_type = ixgbe_sfp_type_unknown; ++ ++ return 0; ++} + + /** + * ixgbe_identify_phy_generic - Get physical layer module +@@ -46,6 +82,7 @@ + { + s32 status = IXGBE_ERR_PHY_ADDR_INVALID; + u32 phy_addr; ++ u16 ext_ability = 0; + + if (hw->phy.type == ixgbe_phy_unknown) { + for (phy_addr = 0; phy_addr < IXGBE_MAX_PHY_ADDR; phy_addr++) { +@@ -54,10 +91,29 @@ + ixgbe_get_phy_id(hw); + hw->phy.type = + ixgbe_get_phy_type_from_id(hw->phy.id); ++ ++ if (hw->phy.type == ixgbe_phy_unknown) { ++ hw->phy.ops.read_reg(hw, ++ IXGBE_MDIO_PHY_EXT_ABILITY, ++ IXGBE_MDIO_PMA_PMD_DEV_TYPE, ++ &ext_ability); ++ if (ext_ability & ++ IXGBE_MDIO_PHY_10GBASET_ABILITY || ++ ext_ability & ++ IXGBE_MDIO_PHY_1000BASET_ABILITY) ++ hw->phy.type = ++ ixgbe_phy_cu_unknown; ++ else ++ hw->phy.type = ++ ixgbe_phy_generic; ++ } ++ + status = 0; + break; + } + } ++ if (status != 0) ++ hw->phy.addr = 0; + } else { + status = 0; + } +@@ -70,7 +126,7 @@ + * @hw: pointer to hardware structure + * + **/ +-static bool ixgbe_validate_phy_addr(struct ixgbe_hw *hw, u32 phy_addr) ++bool ixgbe_validate_phy_addr(struct ixgbe_hw *hw, u32 phy_addr) + { + u16 phy_id = 0; + bool valid = false; +@@ -90,7 +146,7 @@ + * @hw: pointer to hardware structure + * + **/ +-static s32 ixgbe_get_phy_id(struct ixgbe_hw *hw) ++s32 ixgbe_get_phy_id(struct ixgbe_hw *hw) + { + u32 status; + u16 phy_id_high = 0; +@@ -116,13 +172,16 @@ + * @hw: pointer to hardware structure + * + **/ +-static enum ixgbe_phy_type ixgbe_get_phy_type_from_id(u32 phy_id) ++enum ixgbe_phy_type ixgbe_get_phy_type_from_id(u32 phy_id) + { + enum ixgbe_phy_type phy_type; + + switch (phy_id) { + case TN1010_PHY_ID: + phy_type = ixgbe_phy_tn; ++ break; ++ case AQ1002_PHY_ID: ++ phy_type = ixgbe_phy_aq; + break; + case QT2022_PHY_ID: + phy_type = ixgbe_phy_qt; +@@ -135,6 +194,7 @@ + break; + } + ++ hw_dbg(hw, "phy type found is %d\n", phy_type); + return phy_type; + } + +@@ -144,13 +204,40 @@ + **/ + s32 ixgbe_reset_phy_generic(struct ixgbe_hw *hw) + { ++ u32 i; ++ u16 ctrl = 0; ++ s32 status = 0; ++ ++ if (hw->phy.type == ixgbe_phy_unknown) ++ status = ixgbe_identify_phy_generic(hw); ++ ++ if (status != 0 || hw->phy.type == ixgbe_phy_none) ++ goto out; ++ + /* + * Perform soft PHY reset to the PHY_XS. + * This will cause a soft reset to the PHY + */ +- return hw->phy.ops.write_reg(hw, IXGBE_MDIO_PHY_XS_CONTROL, +- IXGBE_MDIO_PHY_XS_DEV_TYPE, +- IXGBE_MDIO_PHY_XS_RESET); ++ hw->phy.ops.write_reg(hw, IXGBE_MDIO_PHY_XS_CONTROL, ++ IXGBE_MDIO_PHY_XS_DEV_TYPE, ++ IXGBE_MDIO_PHY_XS_RESET); ++ ++ /* Poll for reset bit to self-clear indicating reset is complete */ ++ for (i = 0; i < 500; i++) { ++ msleep(1); ++ hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_XS_CONTROL, ++ IXGBE_MDIO_PHY_XS_DEV_TYPE, &ctrl); ++ if (!(ctrl & IXGBE_MDIO_PHY_XS_RESET)) ++ break; ++ } ++ ++ if (ctrl & IXGBE_MDIO_PHY_XS_RESET) { ++ status = IXGBE_ERR_RESET_FAILED; ++ hw_dbg(hw, "PHY reset polling failed to complete.\n"); ++ } ++ ++out: ++ return status; + } + + /** +@@ -350,7 +437,7 @@ + **/ + s32 ixgbe_setup_phy_link_generic(struct ixgbe_hw *hw) + { +- s32 status = IXGBE_NOT_IMPLEMENTED; ++ s32 status = 0; + u32 time_out; + u32 max_time_out = 10; + u16 autoneg_reg = IXGBE_MII_AUTONEG_REG; +@@ -391,7 +478,6 @@ + + autoneg_reg &= IXGBE_MII_AUTONEG_COMPLETE; + if (autoneg_reg == IXGBE_MII_AUTONEG_COMPLETE) { +- status = 0; + break; + } + } +@@ -426,6 +512,9 @@ + if (speed & IXGBE_LINK_SPEED_1GB_FULL) + hw->phy.autoneg_advertised |= IXGBE_LINK_SPEED_1GB_FULL; + ++ if (speed & IXGBE_LINK_SPEED_100_FULL) ++ hw->phy.autoneg_advertised |= IXGBE_LINK_SPEED_100_FULL; ++ + /* Setup link based on the new speed settings */ + hw->phy.ops.setup_link(hw); + +@@ -433,258 +522,37 @@ + } + + /** +- * ixgbe_reset_phy_nl - Performs a PHY reset ++ * ixgbe_get_copper_link_capabilities_generic - Determines link capabilities + * @hw: pointer to hardware structure ++ * @speed: pointer to link speed ++ * @autoneg: boolean auto-negotiation value ++ * ++ * Determines the link capabilities by reading the AUTOC register. + **/ +-s32 ixgbe_reset_phy_nl(struct ixgbe_hw *hw) ++s32 ixgbe_get_copper_link_capabilities_generic(struct ixgbe_hw *hw, ++ ixgbe_link_speed *speed, ++ bool *autoneg) + { +- u16 phy_offset, control, eword, edata, block_crc; +- bool end_data = false; +- u16 list_offset, data_offset; +- u16 phy_data = 0; +- s32 ret_val = 0; +- u32 i; ++ s32 status = IXGBE_ERR_LINK_SETUP; ++ u16 speed_ability; + +- hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_XS_CONTROL, +- IXGBE_MDIO_PHY_XS_DEV_TYPE, &phy_data); ++ *speed = 0; ++ *autoneg = true; + +- /* reset the PHY and poll for completion */ +- hw->phy.ops.write_reg(hw, IXGBE_MDIO_PHY_XS_CONTROL, +- IXGBE_MDIO_PHY_XS_DEV_TYPE, +- (phy_data | IXGBE_MDIO_PHY_XS_RESET)); ++ status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_SPEED_ABILITY, ++ IXGBE_MDIO_PMA_PMD_DEV_TYPE, ++ &speed_ability); + +- for (i = 0; i < 100; i++) { +- hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_XS_CONTROL, +- IXGBE_MDIO_PHY_XS_DEV_TYPE, &phy_data); +- if ((phy_data & IXGBE_MDIO_PHY_XS_RESET) == 0) +- break; +- msleep(10); ++ if (status == 0) { ++ if (speed_ability & IXGBE_MDIO_PHY_SPEED_10G) ++ *speed |= IXGBE_LINK_SPEED_10GB_FULL; ++ if (speed_ability & IXGBE_MDIO_PHY_SPEED_1G) ++ *speed |= IXGBE_LINK_SPEED_1GB_FULL; ++ if (speed_ability & IXGBE_MDIO_PHY_SPEED_100M) ++ *speed |= IXGBE_LINK_SPEED_100_FULL; + } + +- if ((phy_data & IXGBE_MDIO_PHY_XS_RESET) != 0) { +- hw_dbg(hw, "PHY reset did not complete.\n"); +- ret_val = IXGBE_ERR_PHY; +- goto out; +- } +- +- /* Get init offsets */ +- ret_val = ixgbe_get_sfp_init_sequence_offsets(hw, &list_offset, +- &data_offset); +- if (ret_val != 0) +- goto out; +- +- ret_val = hw->eeprom.ops.read(hw, data_offset, &block_crc); +- data_offset++; +- while (!end_data) { +- /* +- * Read control word from PHY init contents offset +- */ +- ret_val = hw->eeprom.ops.read(hw, data_offset, &eword); +- control = (eword & IXGBE_CONTROL_MASK_NL) >> +- IXGBE_CONTROL_SHIFT_NL; +- edata = eword & IXGBE_DATA_MASK_NL; +- switch (control) { +- case IXGBE_DELAY_NL: +- data_offset++; +- hw_dbg(hw, "DELAY: %d MS\n", edata); +- msleep(edata); +- break; +- case IXGBE_DATA_NL: +- hw_dbg(hw, "DATA: \n"); +- data_offset++; +- hw->eeprom.ops.read(hw, data_offset++, +- &phy_offset); +- for (i = 0; i < edata; i++) { +- hw->eeprom.ops.read(hw, data_offset, &eword); +- hw->phy.ops.write_reg(hw, phy_offset, +- IXGBE_TWINAX_DEV, eword); +- hw_dbg(hw, "Wrote %4.4x to %4.4x\n", eword, +- phy_offset); +- data_offset++; +- phy_offset++; +- } +- break; +- case IXGBE_CONTROL_NL: +- data_offset++; +- hw_dbg(hw, "CONTROL: \n"); +- if (edata == IXGBE_CONTROL_EOL_NL) { +- hw_dbg(hw, "EOL\n"); +- end_data = true; +- } else if (edata == IXGBE_CONTROL_SOL_NL) { +- hw_dbg(hw, "SOL\n"); +- } else { +- hw_dbg(hw, "Bad control value\n"); +- ret_val = IXGBE_ERR_PHY; +- goto out; +- } +- break; +- default: +- hw_dbg(hw, "Bad control type\n"); +- ret_val = IXGBE_ERR_PHY; +- goto out; +- } +- } +- +-out: +- return ret_val; +-} +- +-/** +- * ixgbe_identify_sfp_module_generic - Identifies SFP module and assigns +- * the PHY type. +- * @hw: pointer to hardware structure +- * +- * Searches for and identifies the SFP module. Assigns appropriate PHY type. +- **/ +-s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw) +-{ +- s32 status = IXGBE_ERR_PHY_ADDR_INVALID; +- u32 vendor_oui = 0; +- u8 identifier = 0; +- u8 comp_codes_1g = 0; +- u8 comp_codes_10g = 0; +- u8 oui_bytes[4] = {0, 0, 0, 0}; +- u8 transmission_media = 0; +- +- status = hw->phy.ops.read_i2c_eeprom(hw, IXGBE_SFF_IDENTIFIER, +- &identifier); +- +- if (status == IXGBE_ERR_SFP_NOT_PRESENT) { +- hw->phy.sfp_type = ixgbe_sfp_type_not_present; +- goto out; +- } +- +- if (identifier == IXGBE_SFF_IDENTIFIER_SFP) { +- hw->phy.ops.read_i2c_eeprom(hw, IXGBE_SFF_1GBE_COMP_CODES, +- &comp_codes_1g); +- hw->phy.ops.read_i2c_eeprom(hw, IXGBE_SFF_10GBE_COMP_CODES, +- &comp_codes_10g); +- hw->phy.ops.read_i2c_eeprom(hw, IXGBE_SFF_TRANSMISSION_MEDIA, +- &transmission_media); +- +- /* ID Module +- * ============ +- * 0 SFP_DA_CU +- * 1 SFP_SR +- * 2 SFP_LR +- */ +- if (transmission_media & IXGBE_SFF_TWIN_AX_CAPABLE) +- hw->phy.sfp_type = ixgbe_sfp_type_da_cu; +- else if (comp_codes_10g & IXGBE_SFF_10GBASESR_CAPABLE) +- hw->phy.sfp_type = ixgbe_sfp_type_sr; +- else if (comp_codes_10g & IXGBE_SFF_10GBASELR_CAPABLE) +- hw->phy.sfp_type = ixgbe_sfp_type_lr; +- else +- hw->phy.sfp_type = ixgbe_sfp_type_unknown; +- +- /* Determine PHY vendor */ +- if (hw->phy.type == ixgbe_phy_unknown) { +- hw->phy.id = identifier; +- hw->phy.ops.read_i2c_eeprom(hw, +- IXGBE_SFF_VENDOR_OUI_BYTE0, +- &oui_bytes[0]); +- hw->phy.ops.read_i2c_eeprom(hw, +- IXGBE_SFF_VENDOR_OUI_BYTE1, +- &oui_bytes[1]); +- hw->phy.ops.read_i2c_eeprom(hw, +- IXGBE_SFF_VENDOR_OUI_BYTE2, +- &oui_bytes[2]); +- +- vendor_oui = +- ((oui_bytes[0] << IXGBE_SFF_VENDOR_OUI_BYTE0_SHIFT) | +- (oui_bytes[1] << IXGBE_SFF_VENDOR_OUI_BYTE1_SHIFT) | +- (oui_bytes[2] << IXGBE_SFF_VENDOR_OUI_BYTE2_SHIFT)); +- +- switch (vendor_oui) { +- case IXGBE_SFF_VENDOR_OUI_TYCO: +- if (transmission_media & +- IXGBE_SFF_TWIN_AX_CAPABLE) +- hw->phy.type = ixgbe_phy_tw_tyco; +- break; +- case IXGBE_SFF_VENDOR_OUI_FTL: +- hw->phy.type = ixgbe_phy_sfp_ftl; +- break; +- case IXGBE_SFF_VENDOR_OUI_AVAGO: +- hw->phy.type = ixgbe_phy_sfp_avago; +- break; +- default: +- if (transmission_media & +- IXGBE_SFF_TWIN_AX_CAPABLE) +- hw->phy.type = ixgbe_phy_tw_unknown; +- else +- hw->phy.type = ixgbe_phy_sfp_unknown; +- break; +- } +- } +- status = 0; +- } +- +-out: + return status; +-} +- +-/** +- * ixgbe_get_sfp_init_sequence_offsets - Checks the MAC's EEPROM to see +- * if it supports a given SFP+ module type, if so it returns the offsets to the +- * phy init sequence block. +- * @hw: pointer to hardware structure +- * @list_offset: offset to the SFP ID list +- * @data_offset: offset to the SFP data block +- **/ +-s32 ixgbe_get_sfp_init_sequence_offsets(struct ixgbe_hw *hw, +- u16 *list_offset, +- u16 *data_offset) +-{ +- u16 sfp_id; +- +- if (hw->phy.sfp_type == ixgbe_sfp_type_unknown) +- return IXGBE_ERR_SFP_NOT_SUPPORTED; +- +- if (hw->phy.sfp_type == ixgbe_sfp_type_not_present) +- return IXGBE_ERR_SFP_NOT_PRESENT; +- +- if ((hw->device_id == IXGBE_DEV_ID_82598_SR_DUAL_PORT_EM) && +- (hw->phy.sfp_type == ixgbe_sfp_type_da_cu)) +- return IXGBE_ERR_SFP_NOT_SUPPORTED; +- +- /* Read offset to PHY init contents */ +- hw->eeprom.ops.read(hw, IXGBE_PHY_INIT_OFFSET_NL, list_offset); +- +- if ((!*list_offset) || (*list_offset == 0xFFFF)) +- return IXGBE_ERR_PHY; +- +- /* Shift offset to first ID word */ +- (*list_offset)++; +- +- /* +- * Find the matching SFP ID in the EEPROM +- * and program the init sequence +- */ +- hw->eeprom.ops.read(hw, *list_offset, &sfp_id); +- +- while (sfp_id != IXGBE_PHY_INIT_END_NL) { +- if (sfp_id == hw->phy.sfp_type) { +- (*list_offset)++; +- hw->eeprom.ops.read(hw, *list_offset, data_offset); +- if ((!*data_offset) || (*data_offset == 0xFFFF)) { +- hw_dbg(hw, "SFP+ module not supported\n"); +- return IXGBE_ERR_SFP_NOT_SUPPORTED; +- } else { +- break; +- } +- } else { +- (*list_offset) += 2; +- if (hw->eeprom.ops.read(hw, *list_offset, &sfp_id)) +- return IXGBE_ERR_PHY; +- } +- } +- +- if (sfp_id == IXGBE_PHY_INIT_END_NL) { +- hw_dbg(hw, "No matching SFP+ module found\n"); +- return IXGBE_ERR_SFP_NOT_SUPPORTED; +- } +- +- return 0; + } + + /** +@@ -752,3 +620,894 @@ + return status; + } + ++ ++/** ++ * ixgbe_get_phy_firmware_version_aq - Gets the PHY Firmware Version ++ * @hw: pointer to hardware structure ++ * @firmware_version: pointer to the PHY Firmware Version ++ **/ ++s32 ixgbe_get_phy_firmware_version_aq(struct ixgbe_hw *hw, ++ u16 *firmware_version) ++{ ++ s32 status = 0; ++ ++ status = hw->phy.ops.read_reg(hw, AQ_FW_REV, ++ IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, ++ firmware_version); ++ ++ return status; ++} ++ ++/** ++ * ixgbe_reset_phy_nl - Performs a PHY reset ++ * @hw: pointer to hardware structure ++ **/ ++s32 ixgbe_reset_phy_nl(struct ixgbe_hw *hw) ++{ ++ u16 phy_offset, control, eword, edata, block_crc; ++ bool end_data = false; ++ u16 list_offset, data_offset; ++ u16 phy_data = 0; ++ s32 ret_val = 0; ++ u32 i; ++ ++ hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_XS_CONTROL, ++ IXGBE_MDIO_PHY_XS_DEV_TYPE, &phy_data); ++ ++ /* reset the PHY and poll for completion */ ++ hw->phy.ops.write_reg(hw, IXGBE_MDIO_PHY_XS_CONTROL, ++ IXGBE_MDIO_PHY_XS_DEV_TYPE, ++ (phy_data | IXGBE_MDIO_PHY_XS_RESET)); ++ ++ for (i = 0; i < 100; i++) { ++ hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_XS_CONTROL, ++ IXGBE_MDIO_PHY_XS_DEV_TYPE, &phy_data); ++ if ((phy_data & IXGBE_MDIO_PHY_XS_RESET) == 0) ++ break; ++ msleep(10); ++ } ++ ++ if ((phy_data & IXGBE_MDIO_PHY_XS_RESET) != 0) { ++ hw_dbg(hw, "PHY reset did not complete.\n"); ++ ret_val = IXGBE_ERR_PHY; ++ goto out; ++ } ++ ++ /* Get init offsets */ ++ ret_val = ixgbe_get_sfp_init_sequence_offsets(hw, &list_offset, ++ &data_offset); ++ if (ret_val != 0) ++ goto out; ++ ++ ret_val = hw->eeprom.ops.read(hw, data_offset, &block_crc); ++ data_offset++; ++ while (!end_data) { ++ /* ++ * Read control word from PHY init contents offset ++ */ ++ ret_val = hw->eeprom.ops.read(hw, data_offset, &eword); ++ control = (eword & IXGBE_CONTROL_MASK_NL) >> ++ IXGBE_CONTROL_SHIFT_NL; ++ edata = eword & IXGBE_DATA_MASK_NL; ++ switch (control) { ++ case IXGBE_DELAY_NL: ++ data_offset++; ++ hw_dbg(hw, "DELAY: %d MS\n", edata); ++ msleep(edata); ++ break; ++ case IXGBE_DATA_NL: ++ hw_dbg(hw, "DATA: \n"); ++ data_offset++; ++ hw->eeprom.ops.read(hw, data_offset++, ++ &phy_offset); ++ for (i = 0; i < edata; i++) { ++ hw->eeprom.ops.read(hw, data_offset, &eword); ++ hw->phy.ops.write_reg(hw, phy_offset, ++ IXGBE_TWINAX_DEV, eword); ++ hw_dbg(hw, "Wrote %4.4x to %4.4x\n", eword, ++ phy_offset); ++ data_offset++; ++ phy_offset++; ++ } ++ break; ++ case IXGBE_CONTROL_NL: ++ data_offset++; ++ hw_dbg(hw, "CONTROL: \n"); ++ if (edata == IXGBE_CONTROL_EOL_NL) { ++ hw_dbg(hw, "EOL\n"); ++ end_data = true; ++ } else if (edata == IXGBE_CONTROL_SOL_NL) { ++ hw_dbg(hw, "SOL\n"); ++ } else { ++ hw_dbg(hw, "Bad control value\n"); ++ ret_val = IXGBE_ERR_PHY; ++ goto out; ++ } ++ break; ++ default: ++ hw_dbg(hw, "Bad control type\n"); ++ ret_val = IXGBE_ERR_PHY; ++ goto out; ++ } ++ } ++ ++out: ++ return ret_val; ++} ++ ++/** ++ * ixgbe_identify_sfp_module_generic - Identifies SFP modules ++ * @hw: pointer to hardware structure ++ * ++ * Searches for and identifies the SFP module and assigns appropriate PHY type. ++ **/ ++s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw) ++{ ++ s32 status = IXGBE_ERR_PHY_ADDR_INVALID; ++ u32 vendor_oui = 0; ++ enum ixgbe_sfp_type stored_sfp_type = hw->phy.sfp_type; ++ u8 identifier = 0; ++ u8 comp_codes_1g = 0; ++ u8 comp_codes_10g = 0; ++ u8 oui_bytes[3] = {0, 0, 0}; ++ u8 cable_tech = 0; ++ u16 enforce_sfp = 0; ++ ++ if (hw->mac.ops.get_media_type(hw) != ixgbe_media_type_fiber) { ++ hw->phy.sfp_type = ixgbe_sfp_type_not_present; ++ status = IXGBE_ERR_SFP_NOT_PRESENT; ++ goto out; ++ } ++ ++ status = hw->phy.ops.read_i2c_eeprom(hw, IXGBE_SFF_IDENTIFIER, ++ &identifier); ++ ++ if (status == IXGBE_ERR_SFP_NOT_PRESENT || status == IXGBE_ERR_I2C) { ++ status = IXGBE_ERR_SFP_NOT_PRESENT; ++ hw->phy.sfp_type = ixgbe_sfp_type_not_present; ++ if (hw->phy.type != ixgbe_phy_nl) { ++ hw->phy.id = 0; ++ hw->phy.type = ixgbe_phy_unknown; ++ } ++ goto out; ++ } ++ ++ /* LAN ID is needed for sfp_type determination */ ++ hw->mac.ops.set_lan_id(hw); ++ ++ if (identifier == IXGBE_SFF_IDENTIFIER_SFP) { ++ hw->phy.ops.read_i2c_eeprom(hw, IXGBE_SFF_1GBE_COMP_CODES, ++ &comp_codes_1g); ++ hw->phy.ops.read_i2c_eeprom(hw, IXGBE_SFF_10GBE_COMP_CODES, ++ &comp_codes_10g); ++ hw->phy.ops.read_i2c_eeprom(hw, IXGBE_SFF_CABLE_TECHNOLOGY, ++ &cable_tech); ++ ++ /* ID Module ++ * ========= ++ * 0 SFP_DA_CU ++ * 1 SFP_SR ++ * 2 SFP_LR ++ * 3 SFP_DA_CORE0 - 82599-specific ++ * 4 SFP_DA_CORE1 - 82599-specific ++ * 5 SFP_SR/LR_CORE0 - 82599-specific ++ * 6 SFP_SR/LR_CORE1 - 82599-specific ++ */ ++ if (hw->mac.type == ixgbe_mac_82598EB) { ++ if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE) ++ hw->phy.sfp_type = ixgbe_sfp_type_da_cu; ++ else if (comp_codes_10g & IXGBE_SFF_10GBASESR_CAPABLE) ++ hw->phy.sfp_type = ixgbe_sfp_type_sr; ++ else if (comp_codes_10g & IXGBE_SFF_10GBASELR_CAPABLE) ++ hw->phy.sfp_type = ixgbe_sfp_type_lr; ++ else ++ hw->phy.sfp_type = ixgbe_sfp_type_unknown; ++ } else if (hw->mac.type == ixgbe_mac_82599EB) { ++ if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE) ++ if (hw->bus.lan_id == 0) ++ hw->phy.sfp_type = ++ ixgbe_sfp_type_da_cu_core0; ++ else ++ hw->phy.sfp_type = ++ ixgbe_sfp_type_da_cu_core1; ++ else if (comp_codes_10g & IXGBE_SFF_10GBASESR_CAPABLE) ++ if (hw->bus.lan_id == 0) ++ hw->phy.sfp_type = ++ ixgbe_sfp_type_srlr_core0; ++ else ++ hw->phy.sfp_type = ++ ixgbe_sfp_type_srlr_core1; ++ else if (comp_codes_10g & IXGBE_SFF_10GBASELR_CAPABLE) ++ if (hw->bus.lan_id == 0) ++ hw->phy.sfp_type = ++ ixgbe_sfp_type_srlr_core0; ++ else ++ hw->phy.sfp_type = ++ ixgbe_sfp_type_srlr_core1; ++ else ++ hw->phy.sfp_type = ixgbe_sfp_type_unknown; ++ } ++ ++ if (hw->phy.sfp_type != stored_sfp_type) ++ hw->phy.sfp_setup_needed = true; ++ ++ /* Determine if the SFP+ PHY is dual speed or not. */ ++ hw->phy.multispeed_fiber = false; ++ if (((comp_codes_1g & IXGBE_SFF_1GBASESX_CAPABLE) && ++ (comp_codes_10g & IXGBE_SFF_10GBASESR_CAPABLE)) || ++ ((comp_codes_1g & IXGBE_SFF_1GBASELX_CAPABLE) && ++ (comp_codes_10g & IXGBE_SFF_10GBASELR_CAPABLE))) ++ hw->phy.multispeed_fiber = true; ++ /* Determine PHY vendor */ ++ if (hw->phy.type != ixgbe_phy_nl) { ++ hw->phy.id = identifier; ++ hw->phy.ops.read_i2c_eeprom(hw, ++ IXGBE_SFF_VENDOR_OUI_BYTE0, ++ &oui_bytes[0]); ++ hw->phy.ops.read_i2c_eeprom(hw, ++ IXGBE_SFF_VENDOR_OUI_BYTE1, ++ &oui_bytes[1]); ++ hw->phy.ops.read_i2c_eeprom(hw, ++ IXGBE_SFF_VENDOR_OUI_BYTE2, ++ &oui_bytes[2]); ++ ++ vendor_oui = ++ ((oui_bytes[0] << IXGBE_SFF_VENDOR_OUI_BYTE0_SHIFT) | ++ (oui_bytes[1] << IXGBE_SFF_VENDOR_OUI_BYTE1_SHIFT) | ++ (oui_bytes[2] << IXGBE_SFF_VENDOR_OUI_BYTE2_SHIFT)); ++ ++ switch (vendor_oui) { ++ case IXGBE_SFF_VENDOR_OUI_TYCO: ++ if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE) ++ hw->phy.type = ixgbe_phy_tw_tyco; ++ break; ++ case IXGBE_SFF_VENDOR_OUI_FTL: ++ hw->phy.type = ixgbe_phy_sfp_ftl; ++ break; ++ case IXGBE_SFF_VENDOR_OUI_AVAGO: ++ hw->phy.type = ixgbe_phy_sfp_avago; ++ break; ++ case IXGBE_SFF_VENDOR_OUI_INTEL: ++ hw->phy.type = ixgbe_phy_sfp_intel; ++ break; ++ default: ++ if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE) ++ hw->phy.type = ixgbe_phy_tw_unknown; ++ else ++ hw->phy.type = ixgbe_phy_sfp_unknown; ++ break; ++ } ++ } ++ ++ /* All passive DA cables are supported */ ++ if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE) { ++ status = 0; ++ goto out; ++ } ++ ++ /* 1G SFP modules are not supported */ ++ if (comp_codes_10g == 0) { ++ hw->phy.type = ixgbe_phy_sfp_unsupported; ++ status = IXGBE_ERR_SFP_NOT_SUPPORTED; ++ goto out; ++ } ++ ++ /* Anything else 82598-based is supported */ ++ if (hw->mac.type == ixgbe_mac_82598EB) { ++ status = 0; ++ goto out; ++ } ++ ++ ixgbe_get_device_caps(hw, &enforce_sfp); ++ if (!(enforce_sfp & IXGBE_DEVICE_CAPS_ALLOW_ANY_SFP)) { ++ /* Make sure we're a supported PHY type */ ++ if (hw->phy.type == ixgbe_phy_sfp_intel) { ++ status = 0; ++ } else { ++ hw_dbg(hw, "SFP+ module not supported\n"); ++ hw->phy.type = ixgbe_phy_sfp_unsupported; ++ status = IXGBE_ERR_SFP_NOT_SUPPORTED; ++ } ++ } else { ++ status = 0; ++ } ++ } ++ ++out: ++ return status; ++} ++ ++/** ++ * ixgbe_get_sfp_init_sequence_offsets - Provides offset of PHY init sequence ++ * @hw: pointer to hardware structure ++ * @list_offset: offset to the SFP ID list ++ * @data_offset: offset to the SFP data block ++ * ++ * Checks the MAC's EEPROM to see if it supports a given SFP+ module type, if ++ * so it returns the offsets to the phy init sequence block. ++ **/ ++s32 ixgbe_get_sfp_init_sequence_offsets(struct ixgbe_hw *hw, ++ u16 *list_offset, ++ u16 *data_offset) ++{ ++ u16 sfp_id; ++ ++ if (hw->phy.sfp_type == ixgbe_sfp_type_unknown) ++ return IXGBE_ERR_SFP_NOT_SUPPORTED; ++ ++ if (hw->phy.sfp_type == ixgbe_sfp_type_not_present) ++ return IXGBE_ERR_SFP_NOT_PRESENT; ++ ++ if ((hw->device_id == IXGBE_DEV_ID_82598_SR_DUAL_PORT_EM) && ++ (hw->phy.sfp_type == ixgbe_sfp_type_da_cu)) ++ return IXGBE_ERR_SFP_NOT_SUPPORTED; ++ ++ /* Read offset to PHY init contents */ ++ hw->eeprom.ops.read(hw, IXGBE_PHY_INIT_OFFSET_NL, list_offset); ++ ++ if ((!*list_offset) || (*list_offset == 0xFFFF)) ++ return IXGBE_ERR_SFP_NO_INIT_SEQ_PRESENT; ++ ++ /* Shift offset to first ID word */ ++ (*list_offset)++; ++ ++ /* ++ * Find the matching SFP ID in the EEPROM ++ * and program the init sequence ++ */ ++ hw->eeprom.ops.read(hw, *list_offset, &sfp_id); ++ ++ while (sfp_id != IXGBE_PHY_INIT_END_NL) { ++ if (sfp_id == hw->phy.sfp_type) { ++ (*list_offset)++; ++ hw->eeprom.ops.read(hw, *list_offset, data_offset); ++ if ((!*data_offset) || (*data_offset == 0xFFFF)) { ++ hw_dbg(hw, "SFP+ module not supported\n"); ++ return IXGBE_ERR_SFP_NOT_SUPPORTED; ++ } else { ++ break; ++ } ++ } else { ++ (*list_offset) += 2; ++ if (hw->eeprom.ops.read(hw, *list_offset, &sfp_id)) ++ return IXGBE_ERR_PHY; ++ } ++ } ++ ++ if (sfp_id == IXGBE_PHY_INIT_END_NL) { ++ hw_dbg(hw, "No matching SFP+ module found\n"); ++ return IXGBE_ERR_SFP_NOT_SUPPORTED; ++ } ++ ++ return 0; ++} ++ ++/** ++ * ixgbe_read_i2c_eeprom_generic - Reads 8 bit EEPROM word over I2C interface ++ * @hw: pointer to hardware structure ++ * @byte_offset: EEPROM byte offset to read ++ * @eeprom_data: value read ++ * ++ * Performs byte read operation to SFP module's EEPROM over I2C interface. ++ **/ ++s32 ixgbe_read_i2c_eeprom_generic(struct ixgbe_hw *hw, u8 byte_offset, ++ u8 *eeprom_data) ++{ ++ return hw->phy.ops.read_i2c_byte(hw, byte_offset, ++ IXGBE_I2C_EEPROM_DEV_ADDR, ++ eeprom_data); ++} ++ ++/** ++ * ixgbe_write_i2c_eeprom_generic - Writes 8 bit EEPROM word over I2C interface ++ * @hw: pointer to hardware structure ++ * @byte_offset: EEPROM byte offset to write ++ * @eeprom_data: value to write ++ * ++ * Performs byte write operation to SFP module's EEPROM over I2C interface. ++ **/ ++s32 ixgbe_write_i2c_eeprom_generic(struct ixgbe_hw *hw, u8 byte_offset, ++ u8 eeprom_data) ++{ ++ return hw->phy.ops.write_i2c_byte(hw, byte_offset, ++ IXGBE_I2C_EEPROM_DEV_ADDR, ++ eeprom_data); ++} ++ ++/** ++ * ixgbe_read_i2c_byte_generic - Reads 8 bit word over I2C ++ * @hw: pointer to hardware structure ++ * @byte_offset: byte offset to read ++ * @data: value read ++ * ++ * Performs byte read operation to SFP module's EEPROM over I2C interface at ++ * a specified deivce address. ++ **/ ++s32 ixgbe_read_i2c_byte_generic(struct ixgbe_hw *hw, u8 byte_offset, ++ u8 dev_addr, u8 *data) ++{ ++ s32 status = 0; ++ u32 max_retry = 10; ++ u32 retry = 0; ++ u16 swfw_mask = 0; ++ bool nack = 1; ++ ++ if (IXGBE_READ_REG(hw, IXGBE_STATUS) & IXGBE_STATUS_LAN_ID_1) ++ swfw_mask = IXGBE_GSSR_PHY1_SM; ++ else ++ swfw_mask = IXGBE_GSSR_PHY0_SM; ++ ++ ++ do { ++ if (ixgbe_acquire_swfw_sync(hw, swfw_mask) != 0) { ++ status = IXGBE_ERR_SWFW_SYNC; ++ goto read_byte_out; ++ } ++ ++ ixgbe_i2c_start(hw); ++ ++ /* Device Address and write indication */ ++ status = ixgbe_clock_out_i2c_byte(hw, dev_addr); ++ if (status != 0) ++ goto fail; ++ ++ status = ixgbe_get_i2c_ack(hw); ++ if (status != 0) ++ goto fail; ++ ++ status = ixgbe_clock_out_i2c_byte(hw, byte_offset); ++ if (status != 0) ++ goto fail; ++ ++ status = ixgbe_get_i2c_ack(hw); ++ if (status != 0) ++ goto fail; ++ ++ ixgbe_i2c_start(hw); ++ ++ /* Device Address and read indication */ ++ status = ixgbe_clock_out_i2c_byte(hw, (dev_addr | 0x1)); ++ if (status != 0) ++ goto fail; ++ ++ status = ixgbe_get_i2c_ack(hw); ++ if (status != 0) ++ goto fail; ++ ++ status = ixgbe_clock_in_i2c_byte(hw, data); ++ if (status != 0) ++ goto fail; ++ ++ status = ixgbe_clock_out_i2c_bit(hw, nack); ++ if (status != 0) ++ goto fail; ++ ++ ixgbe_i2c_stop(hw); ++ break; ++ ++fail: ++ ixgbe_release_swfw_sync(hw, swfw_mask); ++ msleep(100); ++ ixgbe_i2c_bus_clear(hw); ++ retry++; ++ if (retry < max_retry) ++ hw_dbg(hw, "I2C byte read error - Retrying.\n"); ++ else ++ hw_dbg(hw, "I2C byte read error.\n"); ++ ++ } while (retry < max_retry); ++ ++ ixgbe_release_swfw_sync(hw, swfw_mask); ++ ++read_byte_out: ++ return status; ++} ++ ++/** ++ * ixgbe_write_i2c_byte_generic - Writes 8 bit word over I2C ++ * @hw: pointer to hardware structure ++ * @byte_offset: byte offset to write ++ * @data: value to write ++ * ++ * Performs byte write operation to SFP module's EEPROM over I2C interface at ++ * a specified device address. ++ **/ ++s32 ixgbe_write_i2c_byte_generic(struct ixgbe_hw *hw, u8 byte_offset, ++ u8 dev_addr, u8 data) ++{ ++ s32 status = 0; ++ u32 max_retry = 1; ++ u32 retry = 0; ++ u16 swfw_mask = 0; ++ ++ if (IXGBE_READ_REG(hw, IXGBE_STATUS) & IXGBE_STATUS_LAN_ID_1) ++ swfw_mask = IXGBE_GSSR_PHY1_SM; ++ else ++ swfw_mask = IXGBE_GSSR_PHY0_SM; ++ ++ if (ixgbe_acquire_swfw_sync(hw, swfw_mask) != 0) { ++ status = IXGBE_ERR_SWFW_SYNC; ++ goto write_byte_out; ++ } ++ ++ do { ++ ixgbe_i2c_start(hw); ++ ++ status = ixgbe_clock_out_i2c_byte(hw, dev_addr); ++ if (status != 0) ++ goto fail; ++ ++ status = ixgbe_get_i2c_ack(hw); ++ if (status != 0) ++ goto fail; ++ ++ status = ixgbe_clock_out_i2c_byte(hw, byte_offset); ++ if (status != 0) ++ goto fail; ++ ++ status = ixgbe_get_i2c_ack(hw); ++ if (status != 0) ++ goto fail; ++ ++ status = ixgbe_clock_out_i2c_byte(hw, data); ++ if (status != 0) ++ goto fail; ++ ++ status = ixgbe_get_i2c_ack(hw); ++ if (status != 0) ++ goto fail; ++ ++ ixgbe_i2c_stop(hw); ++ break; ++ ++fail: ++ ixgbe_i2c_bus_clear(hw); ++ retry++; ++ if (retry < max_retry) ++ hw_dbg(hw, "I2C byte write error - Retrying.\n"); ++ else ++ hw_dbg(hw, "I2C byte write error.\n"); ++ } while (retry < max_retry); ++ ++ ixgbe_release_swfw_sync(hw, swfw_mask); ++ ++write_byte_out: ++ return status; ++} ++ ++/** ++ * ixgbe_i2c_start - Sets I2C start condition ++ * @hw: pointer to hardware structure ++ * ++ * Sets I2C start condition (High -> Low on SDA while SCL is High) ++ **/ ++static void ixgbe_i2c_start(struct ixgbe_hw *hw) ++{ ++ u32 i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL); ++ ++ /* Start condition must begin with data and clock high */ ++ ixgbe_set_i2c_data(hw, &i2cctl, 1); ++ ixgbe_raise_i2c_clk(hw, &i2cctl); ++ ++ /* Setup time for start condition (4.7us) */ ++ udelay(IXGBE_I2C_T_SU_STA); ++ ++ ixgbe_set_i2c_data(hw, &i2cctl, 0); ++ ++ /* Hold time for start condition (4us) */ ++ udelay(IXGBE_I2C_T_HD_STA); ++ ++ ixgbe_lower_i2c_clk(hw, &i2cctl); ++ ++ /* Minimum low period of clock is 4.7 us */ ++ udelay(IXGBE_I2C_T_LOW); ++ ++} ++ ++/** ++ * ixgbe_i2c_stop - Sets I2C stop condition ++ * @hw: pointer to hardware structure ++ * ++ * Sets I2C stop condition (Low -> High on SDA while SCL is High) ++ **/ ++static void ixgbe_i2c_stop(struct ixgbe_hw *hw) ++{ ++ u32 i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL); ++ ++ /* Stop condition must begin with data low and clock high */ ++ ixgbe_set_i2c_data(hw, &i2cctl, 0); ++ ixgbe_raise_i2c_clk(hw, &i2cctl); ++ ++ /* Setup time for stop condition (4us) */ ++ udelay(IXGBE_I2C_T_SU_STO); ++ ++ ixgbe_set_i2c_data(hw, &i2cctl, 1); ++ ++ /* bus free time between stop and start (4.7us)*/ ++ udelay(IXGBE_I2C_T_BUF); ++} ++ ++/** ++ * ixgbe_clock_in_i2c_byte - Clocks in one byte via I2C ++ * @hw: pointer to hardware structure ++ * @data: data byte to clock in ++ * ++ * Clocks in one byte data via I2C data/clock ++ **/ ++static s32 ixgbe_clock_in_i2c_byte(struct ixgbe_hw *hw, u8 *data) ++{ ++ s32 status = 0; ++ s32 i; ++ bool bit = 0; ++ ++ for (i = 7; i >= 0; i--) { ++ status = ixgbe_clock_in_i2c_bit(hw, &bit); ++ *data |= bit<= 0; i--) { ++ bit = (data >> i) & 0x1; ++ status = ixgbe_clock_out_i2c_bit(hw, bit); ++ ++ if (status != 0) ++ break; ++ } ++ ++ /* Release SDA line (set high) */ ++ i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL); ++ i2cctl |= IXGBE_I2C_DATA_OUT; ++ IXGBE_WRITE_REG(hw, IXGBE_I2CCTL, i2cctl); ++ ++ return status; ++} ++ ++/** ++ * ixgbe_get_i2c_ack - Polls for I2C ACK ++ * @hw: pointer to hardware structure ++ * ++ * Clocks in/out one bit via I2C data/clock ++ **/ ++static s32 ixgbe_get_i2c_ack(struct ixgbe_hw *hw) ++{ ++ s32 status; ++ u32 i = 0; ++ u32 i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL); ++ u32 timeout = 10; ++ bool ack = 1; ++ ++ status = ixgbe_raise_i2c_clk(hw, &i2cctl); ++ ++ if (status != 0) ++ goto out; ++ ++ /* Minimum high period of clock is 4us */ ++ udelay(IXGBE_I2C_T_HIGH); ++ ++ /* Poll for ACK. Note that ACK in I2C spec is ++ * transition from 1 to 0 */ ++ for (i = 0; i < timeout; i++) { ++ i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL); ++ ack = ixgbe_get_i2c_data(&i2cctl); ++ ++ udelay(1); ++ if (ack == 0) ++ break; ++ } ++ ++ if (ack == 1) { ++ hw_dbg(hw, "I2C ack was not received.\n"); ++ status = IXGBE_ERR_I2C; ++ } ++ ++ ixgbe_lower_i2c_clk(hw, &i2cctl); ++ ++ /* Minimum low period of clock is 4.7 us */ ++ udelay(IXGBE_I2C_T_LOW); ++ ++out: ++ return status; ++} ++ ++/** ++ * ixgbe_clock_in_i2c_bit - Clocks in one bit via I2C data/clock ++ * @hw: pointer to hardware structure ++ * @data: read data value ++ * ++ * Clocks in one bit via I2C data/clock ++ **/ ++static s32 ixgbe_clock_in_i2c_bit(struct ixgbe_hw *hw, bool *data) ++{ ++ s32 status; ++ u32 i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL); ++ ++ status = ixgbe_raise_i2c_clk(hw, &i2cctl); ++ ++ /* Minimum high period of clock is 4us */ ++ udelay(IXGBE_I2C_T_HIGH); ++ ++ i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL); ++ *data = ixgbe_get_i2c_data(&i2cctl); ++ ++ ixgbe_lower_i2c_clk(hw, &i2cctl); ++ ++ /* Minimum low period of clock is 4.7 us */ ++ udelay(IXGBE_I2C_T_LOW); ++ ++ return status; ++} ++ ++/** ++ * ixgbe_clock_out_i2c_bit - Clocks in/out one bit via I2C data/clock ++ * @hw: pointer to hardware structure ++ * @data: data value to write ++ * ++ * Clocks out one bit via I2C data/clock ++ **/ ++static s32 ixgbe_clock_out_i2c_bit(struct ixgbe_hw *hw, bool data) ++{ ++ s32 status; ++ u32 i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL); ++ ++ status = ixgbe_set_i2c_data(hw, &i2cctl, data); ++ if (status == 0) { ++ status = ixgbe_raise_i2c_clk(hw, &i2cctl); ++ ++ /* Minimum high period of clock is 4us */ ++ udelay(IXGBE_I2C_T_HIGH); ++ ++ ixgbe_lower_i2c_clk(hw, &i2cctl); ++ ++ /* Minimum low period of clock is 4.7 us. ++ * This also takes care of the data hold time. ++ */ ++ udelay(IXGBE_I2C_T_LOW); ++ } else { ++ status = IXGBE_ERR_I2C; ++ hw_dbg(hw, "I2C data was not set to %X\n", data); ++ } ++ ++ return status; ++} ++/** ++ * ixgbe_raise_i2c_clk - Raises the I2C SCL clock ++ * @hw: pointer to hardware structure ++ * @i2cctl: Current value of I2CCTL register ++ * ++ * Raises the I2C clock line '0'->'1' ++ **/ ++static s32 ixgbe_raise_i2c_clk(struct ixgbe_hw *hw, u32 *i2cctl) ++{ ++ s32 status = 0; ++ ++ *i2cctl |= IXGBE_I2C_CLK_OUT; ++ ++ IXGBE_WRITE_REG(hw, IXGBE_I2CCTL, *i2cctl); ++ ++ /* SCL rise time (1000ns) */ ++ udelay(IXGBE_I2C_T_RISE); ++ ++ return status; ++} ++ ++/** ++ * ixgbe_lower_i2c_clk - Lowers the I2C SCL clock ++ * @hw: pointer to hardware structure ++ * @i2cctl: Current value of I2CCTL register ++ * ++ * Lowers the I2C clock line '1'->'0' ++ **/ ++static void ixgbe_lower_i2c_clk(struct ixgbe_hw *hw, u32 *i2cctl) ++{ ++ ++ *i2cctl &= ~IXGBE_I2C_CLK_OUT; ++ ++ IXGBE_WRITE_REG(hw, IXGBE_I2CCTL, *i2cctl); ++ ++ /* SCL fall time (300ns) */ ++ udelay(IXGBE_I2C_T_FALL); ++} ++ ++/** ++ * ixgbe_set_i2c_data - Sets the I2C data bit ++ * @hw: pointer to hardware structure ++ * @i2cctl: Current value of I2CCTL register ++ * @data: I2C data value (0 or 1) to set ++ * ++ * Sets the I2C data bit ++ **/ ++static s32 ixgbe_set_i2c_data(struct ixgbe_hw *hw, u32 *i2cctl, bool data) ++{ ++ s32 status = 0; ++ ++ if (data) ++ *i2cctl |= IXGBE_I2C_DATA_OUT; ++ else ++ *i2cctl &= ~IXGBE_I2C_DATA_OUT; ++ ++ IXGBE_WRITE_REG(hw, IXGBE_I2CCTL, *i2cctl); ++ ++ /* Data rise/fall (1000ns/300ns) and set-up time (250ns) */ ++ udelay(IXGBE_I2C_T_RISE + IXGBE_I2C_T_FALL + IXGBE_I2C_T_SU_DATA); ++ ++ /* Verify data was set correctly */ ++ *i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL); ++ if (data != ixgbe_get_i2c_data(i2cctl)) { ++ status = IXGBE_ERR_I2C; ++ hw_dbg(hw, "Error - I2C data was not set to %X.\n", data); ++ } ++ ++ return status; ++} ++ ++/** ++ * ixgbe_get_i2c_data - Reads the I2C SDA data bit ++ * @hw: pointer to hardware structure ++ * @i2cctl: Current value of I2CCTL register ++ * ++ * Returns the I2C data bit value ++ **/ ++static bool ixgbe_get_i2c_data(u32 *i2cctl) ++{ ++ bool data; ++ ++ if (*i2cctl & IXGBE_I2C_DATA_IN) ++ data = 1; ++ else ++ data = 0; ++ ++ return data; ++} ++ ++/** ++ * ixgbe_i2c_bus_clear - Clears the I2C bus ++ * @hw: pointer to hardware structure ++ * ++ * Clears the I2C bus by sending nine clock pulses. ++ * Used when data line is stuck low. ++ **/ ++void ixgbe_i2c_bus_clear(struct ixgbe_hw *hw) ++{ ++ u32 i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL); ++ u32 i; ++ ++ ixgbe_i2c_start(hw); ++ ++ ixgbe_set_i2c_data(hw, &i2cctl, 1); ++ ++ for (i = 0; i < 9; i++) { ++ ixgbe_raise_i2c_clk(hw, &i2cctl); ++ ++ /* Min high period of clock is 4us */ ++ udelay(IXGBE_I2C_T_HIGH); ++ ++ ixgbe_lower_i2c_clk(hw, &i2cctl); ++ ++ /* Min low period of clock is 4.7us*/ ++ udelay(IXGBE_I2C_T_LOW); ++ } ++ ++ ixgbe_i2c_start(hw); ++ ++ /* Put the i2c bus back to default state */ ++ ixgbe_i2c_stop(hw); ++} +diff -r 3e5bbd731d89 drivers/net/ixgbe/ixgbe_phy.h +--- a/drivers/net/ixgbe/ixgbe_phy.h Mon Jun 15 12:00:22 2009 +0100 ++++ b/drivers/net/ixgbe/ixgbe_phy.h Mon Jun 15 12:06:28 2009 +0100 +@@ -1,7 +1,7 @@ + /******************************************************************************* + + Intel 10 Gigabit PCI Express Linux driver +- Copyright(c) 1999 - 2008 Intel Corporation. ++ Copyright(c) 1999 - 2009 Intel Corporation. + + This program is free software; you can redistribute it and/or modify it + under the terms and conditions of the GNU General Public License, +@@ -39,11 +39,12 @@ + #define IXGBE_SFF_VENDOR_OUI_BYTE2 0x27 + #define IXGBE_SFF_1GBE_COMP_CODES 0x6 + #define IXGBE_SFF_10GBE_COMP_CODES 0x3 +-#define IXGBE_SFF_TRANSMISSION_MEDIA 0x9 ++#define IXGBE_SFF_CABLE_TECHNOLOGY 0x8 + + /* Bitmasks */ +-#define IXGBE_SFF_TWIN_AX_CAPABLE 0x80 ++#define IXGBE_SFF_DA_PASSIVE_CABLE 0x4 + #define IXGBE_SFF_1GBASESX_CAPABLE 0x1 ++#define IXGBE_SFF_1GBASELX_CAPABLE 0x2 + #define IXGBE_SFF_10GBASESR_CAPABLE 0x10 + #define IXGBE_SFF_10GBASELR_CAPABLE 0x20 + #define IXGBE_I2C_EEPROM_READ_MASK 0x100 +@@ -54,14 +55,15 @@ + #define IXGBE_I2C_EEPROM_STATUS_IN_PROGRESS 0x3 + + /* Bit-shift macros */ +-#define IXGBE_SFF_VENDOR_OUI_BYTE0_SHIFT 12 +-#define IXGBE_SFF_VENDOR_OUI_BYTE1_SHIFT 8 +-#define IXGBE_SFF_VENDOR_OUI_BYTE2_SHIFT 4 ++#define IXGBE_SFF_VENDOR_OUI_BYTE0_SHIFT 24 ++#define IXGBE_SFF_VENDOR_OUI_BYTE1_SHIFT 16 ++#define IXGBE_SFF_VENDOR_OUI_BYTE2_SHIFT 8 + + /* Vendor OUIs: format of OUI is 0x[byte0][byte1][byte2][00] */ + #define IXGBE_SFF_VENDOR_OUI_TYCO 0x00407600 + #define IXGBE_SFF_VENDOR_OUI_FTL 0x00906500 + #define IXGBE_SFF_VENDOR_OUI_AVAGO 0x00176A00 ++#define IXGBE_SFF_VENDOR_OUI_INTEL 0x001B2100 + + /* I2C SDA and SCL timing parameters for standard mode */ + #define IXGBE_I2C_T_HD_STA 4 +@@ -77,6 +79,9 @@ + + + s32 ixgbe_init_phy_ops_generic(struct ixgbe_hw *hw); ++bool ixgbe_validate_phy_addr(struct ixgbe_hw *hw, u32 phy_addr); ++enum ixgbe_phy_type ixgbe_get_phy_type_from_id(u32 phy_id); ++s32 ixgbe_get_phy_id(struct ixgbe_hw *hw); + s32 ixgbe_identify_phy_generic(struct ixgbe_hw *hw); + s32 ixgbe_reset_phy_generic(struct ixgbe_hw *hw); + s32 ixgbe_read_phy_reg_generic(struct ixgbe_hw *hw, u32 reg_addr, +@@ -88,6 +93,9 @@ + ixgbe_link_speed speed, + bool autoneg, + bool autoneg_wait_to_complete); ++s32 ixgbe_get_copper_link_capabilities_generic(struct ixgbe_hw *hw, ++ ixgbe_link_speed *speed, ++ bool *autoneg); + + /* PHY specific */ + s32 ixgbe_check_phy_link_tnx(struct ixgbe_hw *hw, +@@ -95,11 +103,20 @@ + bool *link_up); + s32 ixgbe_get_phy_firmware_version_tnx(struct ixgbe_hw *hw, + u16 *firmware_version); ++s32 ixgbe_get_phy_firmware_version_aq(struct ixgbe_hw *hw, ++ u16 *firmware_version); + +-/* PHY specific */ + s32 ixgbe_reset_phy_nl(struct ixgbe_hw *hw); + s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw); + s32 ixgbe_get_sfp_init_sequence_offsets(struct ixgbe_hw *hw, +- u16 *list_offset, +- u16 *data_offset); ++ u16 *list_offset, ++ u16 *data_offset); ++s32 ixgbe_read_i2c_byte_generic(struct ixgbe_hw *hw, u8 byte_offset, ++ u8 dev_addr, u8 *data); ++s32 ixgbe_write_i2c_byte_generic(struct ixgbe_hw *hw, u8 byte_offset, ++ u8 dev_addr, u8 data); ++s32 ixgbe_read_i2c_eeprom_generic(struct ixgbe_hw *hw, u8 byte_offset, ++ u8 *eeprom_data); ++s32 ixgbe_write_i2c_eeprom_generic(struct ixgbe_hw *hw, u8 byte_offset, ++ u8 eeprom_data); + #endif /* _IXGBE_PHY_H_ */ +diff -r 3e5bbd731d89 drivers/net/ixgbe/ixgbe_sysfs.c +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/ixgbe/ixgbe_sysfs.c Mon Jun 15 12:06:28 2009 +0100 +@@ -0,0 +1,77 @@ ++/******************************************************************************* ++ ++ Intel 10 Gigabit PCI Express Linux driver ++ Copyright(c) 1999 - 2008 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++#include ++#include ++#include ++#include "ixgbe.h" ++ ++/* Ethernet payload size for FCoE to be able to carry full sized FC Frames ++ * 14 byte FCoE header + 24 byte FC header + 2112 max payload + 4 byte CRC ++ * + 4 byte FCoE trailing encapsulation = 2158 ++ * This is the Ethernet payload, replacing the default of 1500, and does ++ * not include Ethernet headers, VLAN tags, or Ethernet CRC. ++ */ ++#define IXGBE_FCOE_MTU 2158 ++ ++static ssize_t ixgbe_show_fcoe_mtu(struct device *dev, struct device_attribute *attr, char *buf) ++{ ++ return sprintf(buf, "%d\n", IXGBE_FCOE_MTU); ++} ++ ++static struct device_attribute ixgbe_attrs[] = { ++ __ATTR(fcoe-mtu, S_IRUGO, ixgbe_show_fcoe_mtu, NULL), ++}; ++ ++int ixgbe_sysfs_create(struct ixgbe_adapter *adapter) ++{ ++ struct net_device *netdev = adapter->netdev; ++ int err; ++ int i; ++ ++ for (i = 0 ; i < ARRAY_SIZE(ixgbe_attrs); i++) { ++ err = device_create_file(&netdev->dev, &ixgbe_attrs[i]); ++ if (err) ++ goto fail; ++ } ++ return 0; ++ ++fail: ++ while (i-- >= 0) ++ device_remove_file(&netdev->dev, &ixgbe_attrs[i]); ++ return err; ++} ++ ++void ixgbe_sysfs_remove(struct ixgbe_adapter *adapter) ++{ ++ struct net_device *netdev = adapter->netdev; ++ int i; ++ ++ for (i = 0 ; i < ARRAY_SIZE(ixgbe_attrs); i++) ++ device_remove_file(&netdev->dev, &ixgbe_attrs[i]); ++} ++ +diff -r 3e5bbd731d89 drivers/net/ixgbe/ixgbe_type.h +--- a/drivers/net/ixgbe/ixgbe_type.h Mon Jun 15 12:00:22 2009 +0100 ++++ b/drivers/net/ixgbe/ixgbe_type.h Mon Jun 15 12:06:28 2009 +0100 +@@ -1,7 +1,7 @@ + /******************************************************************************* + + Intel 10 Gigabit PCI Express Linux driver +- Copyright(c) 1999 - 2008 Intel Corporation. ++ Copyright(c) 1999 - 2009 Intel Corporation. + + This program is free software; you can redistribute it and/or modify it + under the terms and conditions of the GNU General Public License, +@@ -28,21 +28,27 @@ + #ifndef _IXGBE_TYPE_H_ + #define _IXGBE_TYPE_H_ + +-#include ++#include "ixgbe_osdep.h" ++ + + /* Vendor ID */ + #define IXGBE_INTEL_VENDOR_ID 0x8086 + + /* Device IDs */ ++#define IXGBE_DEV_ID_82598 0x10B6 ++#define IXGBE_DEV_ID_82598_BX 0x1508 + #define IXGBE_DEV_ID_82598AF_DUAL_PORT 0x10C6 + #define IXGBE_DEV_ID_82598AF_SINGLE_PORT 0x10C7 ++#define IXGBE_DEV_ID_82598AT 0x10C8 + #define IXGBE_DEV_ID_82598EB_SFP_LOM 0x10DB +-#define IXGBE_DEV_ID_82598AT 0x10C8 + #define IXGBE_DEV_ID_82598EB_CX4 0x10DD + #define IXGBE_DEV_ID_82598_CX4_DUAL_PORT 0x10EC + #define IXGBE_DEV_ID_82598_DA_DUAL_PORT 0x10F1 + #define IXGBE_DEV_ID_82598_SR_DUAL_PORT_EM 0x10E1 + #define IXGBE_DEV_ID_82598EB_XF_LR 0x10F4 ++#define IXGBE_DEV_ID_82599_KX4 0x10F7 ++#define IXGBE_DEV_ID_82599_SFP 0x10FB ++#define IXGBE_DEV_ID_82599_XAUI_LOM 0x10FC + + /* General Registers */ + #define IXGBE_CTRL 0x00000 +@@ -50,9 +56,12 @@ + #define IXGBE_CTRL_EXT 0x00018 + #define IXGBE_ESDP 0x00020 + #define IXGBE_EODSDP 0x00028 ++#define IXGBE_I2CCTL 0x00028 + #define IXGBE_LEDCTL 0x00200 + #define IXGBE_FRTIMER 0x00048 + #define IXGBE_TCPTIMER 0x0004C ++#define IXGBE_CORESPARE 0x00600 ++#define IXGBE_EXVET 0x05078 + + /* NVM Registers */ + #define IXGBE_EEC 0x10010 +@@ -66,6 +75,19 @@ + #define IXGBE_FLOP 0x1013C + #define IXGBE_GRC 0x10200 + ++/* General Receive Control */ ++#define IXGBE_GRC_MNG 0x00000001 /* Manageability Enable */ ++#define IXGBE_GRC_APME 0x00000002 /* Advanced Power Management Enable */ ++ ++#define IXGBE_VPDDIAG0 0x10204 ++#define IXGBE_VPDDIAG1 0x10208 ++ ++/* I2CCTL Bit Masks */ ++#define IXGBE_I2C_CLK_IN 0x00000001 ++#define IXGBE_I2C_CLK_OUT 0x00000002 ++#define IXGBE_I2C_DATA_IN 0x00000004 ++#define IXGBE_I2C_DATA_OUT 0x00000008 ++ + /* Interrupt Registers */ + #define IXGBE_EICR 0x00800 + #define IXGBE_EICS 0x00808 +@@ -73,28 +95,66 @@ + #define IXGBE_EIMC 0x00888 + #define IXGBE_EIAC 0x00810 + #define IXGBE_EIAM 0x00890 +-#define IXGBE_EITR(_i) (((_i) <= 23) ? (0x00820 + ((_i) * 4)) : (0x012300 + ((_i) * 4))) ++#define IXGBE_EICS_EX(_i) (0x00A90 + (_i) * 4) ++#define IXGBE_EIMS_EX(_i) (0x00AA0 + (_i) * 4) ++#define IXGBE_EIMC_EX(_i) (0x00AB0 + (_i) * 4) ++#define IXGBE_EIAM_EX(_i) (0x00AD0 + (_i) * 4) ++/* 82599 EITR is only 12 bits, with the lower 3 always zero */ ++/* ++ * 82598 EITR is 16 bits but set the limits based on the max ++ * supported by all ixgbe hardware ++ */ ++#define IXGBE_MAX_INT_RATE 488281 ++#define IXGBE_MIN_INT_RATE 956 ++#define IXGBE_MAX_EITR 0x00000FF8 ++#define IXGBE_MIN_EITR 8 ++#define IXGBE_EITR(_i) (((_i) <= 23) ? (0x00820 + ((_i) * 4)) : \ ++ (0x012300 + (((_i) - 24) * 4))) ++#define IXGBE_EITR_ITR_INT_MASK 0x00000FF8 ++#define IXGBE_EITR_LLI_MOD 0x00008000 ++#define IXGBE_EITR_CNT_WDIS 0x80000000 + #define IXGBE_IVAR(_i) (0x00900 + ((_i) * 4)) /* 24 at 0x900-0x960 */ ++#define IXGBE_IVAR_MISC 0x00A00 /* misc MSI-X interrupt causes */ ++#define IXGBE_EITRSEL 0x00894 + #define IXGBE_MSIXT 0x00000 /* MSI-X Table. 0x0000 - 0x01C */ + #define IXGBE_MSIXPBA 0x02000 /* MSI-X Pending bit array */ + #define IXGBE_PBACL(_i) (((_i) == 0) ? (0x11068) : (0x110C0 + ((_i) * 4))) + #define IXGBE_GPIE 0x00898 + + /* Flow Control Registers */ ++#define IXGBE_FCADBUL 0x03210 ++#define IXGBE_FCADBUH 0x03214 ++#define IXGBE_FCAMACL 0x04328 ++#define IXGBE_FCAMACH 0x0432C ++#define IXGBE_FCRTH_82599(_i) (0x03260 + ((_i) * 4)) /* 8 of these (0-7) */ ++#define IXGBE_FCRTL_82599(_i) (0x03220 + ((_i) * 4)) /* 8 of these (0-7) */ + #define IXGBE_PFCTOP 0x03008 + #define IXGBE_FCTTV(_i) (0x03200 + ((_i) * 4)) /* 4 of these (0-3) */ + #define IXGBE_FCRTL(_i) (0x03220 + ((_i) * 8)) /* 8 of these (0-7) */ + #define IXGBE_FCRTH(_i) (0x03260 + ((_i) * 8)) /* 8 of these (0-7) */ + #define IXGBE_FCRTV 0x032A0 ++#define IXGBE_FCCFG 0x03D00 + #define IXGBE_TFCS 0x0CE00 + + /* Receive DMA Registers */ +-#define IXGBE_RDBAL(_i) (((_i) < 64) ? (0x01000 + ((_i) * 0x40)) : (0x0D000 + ((_i - 64) * 0x40))) +-#define IXGBE_RDBAH(_i) (((_i) < 64) ? (0x01004 + ((_i) * 0x40)) : (0x0D004 + ((_i - 64) * 0x40))) +-#define IXGBE_RDLEN(_i) (((_i) < 64) ? (0x01008 + ((_i) * 0x40)) : (0x0D008 + ((_i - 64) * 0x40))) +-#define IXGBE_RDH(_i) (((_i) < 64) ? (0x01010 + ((_i) * 0x40)) : (0x0D010 + ((_i - 64) * 0x40))) +-#define IXGBE_RDT(_i) (((_i) < 64) ? (0x01018 + ((_i) * 0x40)) : (0x0D018 + ((_i - 64) * 0x40))) +-#define IXGBE_RXDCTL(_i) (((_i) < 64) ? (0x01028 + ((_i) * 0x40)) : (0x0D028 + ((_i - 64) * 0x40))) ++#define IXGBE_RDBAL(_i) (((_i) < 64) ? (0x01000 + ((_i) * 0x40)) : \ ++ (0x0D000 + ((_i - 64) * 0x40))) ++#define IXGBE_RDBAH(_i) (((_i) < 64) ? (0x01004 + ((_i) * 0x40)) : \ ++ (0x0D004 + ((_i - 64) * 0x40))) ++#define IXGBE_RDLEN(_i) (((_i) < 64) ? (0x01008 + ((_i) * 0x40)) : \ ++ (0x0D008 + ((_i - 64) * 0x40))) ++#define IXGBE_RDH(_i) (((_i) < 64) ? (0x01010 + ((_i) * 0x40)) : \ ++ (0x0D010 + ((_i - 64) * 0x40))) ++#define IXGBE_RDT(_i) (((_i) < 64) ? (0x01018 + ((_i) * 0x40)) : \ ++ (0x0D018 + ((_i - 64) * 0x40))) ++#define IXGBE_RXDCTL(_i) (((_i) < 64) ? (0x01028 + ((_i) * 0x40)) : \ ++ (0x0D028 + ((_i - 64) * 0x40))) ++#define IXGBE_RSCCTL(_i) (((_i) < 64) ? (0x0102C + ((_i) * 0x40)) : \ ++ (0x0D02C + ((_i - 64) * 0x40))) ++#define IXGBE_RSCDBU 0x03028 ++#define IXGBE_RDDCC 0x02F20 ++#define IXGBE_RXMEMWRAP 0x03190 ++#define IXGBE_STARCTRL 0x03024 + /* + * Split and Replication Receive Control Registers + * 00-15 : 0x02100 + n*4 +@@ -114,6 +174,7 @@ + (((_i) < 64) ? (0x0100C + ((_i) * 0x40)) : \ + (0x0D00C + ((_i - 64) * 0x40)))) + #define IXGBE_RDRXCTL 0x02F00 ++#define IXGBE_RDRXCTL_RSC_PUSH 0x80 + #define IXGBE_RXPBSIZE(_i) (0x03C00 + ((_i) * 4)) + /* 8 of these 0x03C00 - 0x03C1C */ + #define IXGBE_RXCTRL 0x03000 +@@ -127,10 +188,15 @@ + #define IXGBE_DRECCCTL_DISABLE 0 + /* Multicast Table Array - 128 entries */ + #define IXGBE_MTA(_i) (0x05200 + ((_i) * 4)) +-#define IXGBE_RAL(_i) (((_i) <= 15) ? (0x05400 + ((_i) * 8)) : (0x0A200 + ((_i) * 8))) +-#define IXGBE_RAH(_i) (((_i) <= 15) ? (0x05404 + ((_i) * 8)) : (0x0A204 + ((_i) * 8))) ++#define IXGBE_RAL(_i) (((_i) <= 15) ? (0x05400 + ((_i) * 8)) : \ ++ (0x0A200 + ((_i) * 8))) ++#define IXGBE_RAH(_i) (((_i) <= 15) ? (0x05404 + ((_i) * 8)) : \ ++ (0x0A204 + ((_i) * 8))) ++#define IXGBE_MPSAR_LO(_i) (0x0A600 + ((_i) * 8)) ++#define IXGBE_MPSAR_HI(_i) (0x0A604 + ((_i) * 8)) + /* Packet split receive type */ +-#define IXGBE_PSRTYPE(_i) (((_i) <= 15) ? (0x05480 + ((_i) * 4)) : (0x0EA00 + ((_i) * 4))) ++#define IXGBE_PSRTYPE(_i) (((_i) <= 15) ? (0x05480 + ((_i) * 4)) : \ ++ (0x0EA00 + ((_i) * 4))) + /* array of 4096 1-bit vlan filters */ + #define IXGBE_VFTA(_i) (0x0A000 + ((_i) * 4)) + /*array of 4096 4-bit vlan vmdq indices */ +@@ -139,6 +205,28 @@ + #define IXGBE_VLNCTRL 0x05088 + #define IXGBE_MCSTCTRL 0x05090 + #define IXGBE_MRQC 0x05818 ++#define IXGBE_SAQF(_i) (0x0E000 + ((_i) * 4)) /* Source Address Queue Filter */ ++#define IXGBE_DAQF(_i) (0x0E200 + ((_i) * 4)) /* Dest. Address Queue Filter */ ++#define IXGBE_SDPQF(_i) (0x0E400 + ((_i) * 4)) /* Src Dest. Addr Queue Filter */ ++#define IXGBE_FTQF(_i) (0x0E600 + ((_i) * 4)) /* Five Tuple Queue Filter */ ++#define IXGBE_ETQF(_i) (0x05128 + ((_i) * 4)) /* EType Queue Filter */ ++#define IXGBE_ETQS(_i) (0x0EC00 + ((_i) * 4)) /* EType Queue Select */ ++#define IXGBE_SYNQF 0x0EC30 /* SYN Packet Queue Filter */ ++#define IXGBE_RQTC 0x0EC70 ++#define IXGBE_MTQC 0x08120 ++#define IXGBE_VLVF(_i) (0x0F100 + ((_i) * 4)) /* 64 of these (0-63) */ ++#define IXGBE_VLVFB(_i) (0x0F200 + ((_i) * 4)) /* 128 of these (0-127) */ ++#define IXGBE_VT_CTL 0x051B0 ++#define IXGBE_VFRE(_i) (0x051E0 + ((_i) * 4)) ++#define IXGBE_VFTE(_i) (0x08110 + ((_i) * 4)) ++#define IXGBE_QDE 0x2F04 ++#define IXGBE_VMOLR(_i) (0x0F000 + ((_i) * 4)) /* 64 total */ ++#define IXGBE_UTA(_i) (0x0F400 + ((_i) * 4)) ++#define IXGBE_VMRCTL(_i) (0x0F600 + ((_i) * 4)) ++#define IXGBE_VMRVLAN(_i) (0x0F610 + ((_i) * 4)) ++#define IXGBE_VMRVM(_i) (0x0F630 + ((_i) * 4)) ++#define IXGBE_L34T_IMIR(_i) (0x0E800 + ((_i) * 4)) /*128 of these (0-127)*/ ++#define IXGBE_LLITHRESH 0x0EC90 + #define IXGBE_IMIR(_i) (0x05A80 + ((_i) * 4)) /* 8 of these (0-7) */ + #define IXGBE_IMIREXT(_i) (0x05AA0 + ((_i) * 4)) /* 8 of these (0-7) */ + #define IXGBE_IMIRVP 0x05AC0 +@@ -146,6 +234,33 @@ + #define IXGBE_RETA(_i) (0x05C00 + ((_i) * 4)) /* 32 of these (0-31) */ + #define IXGBE_RSSRK(_i) (0x05C80 + ((_i) * 4)) /* 10 of these (0-9) */ + ++/* Flow Director registers */ ++#define IXGBE_FDIRCTRL 0x0EE00 ++#define IXGBE_FDIRHKEY 0x0EE68 ++#define IXGBE_FDIRSKEY 0x0EE6C ++#define IXGBE_FDIRDIP4M 0x0EE3C ++#define IXGBE_FDIRSIP4M 0x0EE40 ++#define IXGBE_FDIRTCPM 0x0EE44 ++#define IXGBE_FDIRUDPM 0x0EE48 ++#define IXGBE_FDIRIP6M 0x0EE74 ++#define IXGBE_FDIRM 0x0EE70 ++ ++/* Flow Director Stats registers */ ++#define IXGBE_FDIRFREE 0x0EE38 ++#define IXGBE_FDIRLEN 0x0EE4C ++#define IXGBE_FDIRUSTAT 0x0EE50 ++#define IXGBE_FDIRFSTAT 0x0EE54 ++#define IXGBE_FDIRMATCH 0x0EE58 ++#define IXGBE_FDIRMISS 0x0EE5C ++ ++/* Flow Director Programming registers */ ++#define IXGBE_FDIRSIPv6(_i) (0x0EE0C + ((_i) * 4)) /* 3 of these (0-2) */ ++#define IXGBE_FDIRIPSA 0x0EE18 ++#define IXGBE_FDIRIPDA 0x0EE1C ++#define IXGBE_FDIRPORT 0x0EE20 ++#define IXGBE_FDIRVLAN 0x0EE24 ++#define IXGBE_FDIRHASH 0x0EE28 ++#define IXGBE_FDIRCMD 0x0EE2C + + /* Transmit DMA registers */ + #define IXGBE_TDBAL(_i) (0x06000 + ((_i) * 0x40)) /* 32 of these (0-31)*/ +@@ -158,7 +273,23 @@ + #define IXGBE_TDWBAH(_i) (0x0603C + ((_i) * 0x40)) + #define IXGBE_DTXCTL 0x07E00 + ++#define IXGBE_DMATXCTL 0x04A80 ++#define IXGBE_PFDTXGSWC 0x08220 ++#define IXGBE_DTXMXSZRQ 0x08100 ++#define IXGBE_DTXTCPFLGL 0x04A88 ++#define IXGBE_DTXTCPFLGH 0x04A8C ++#define IXGBE_LBDRPEN 0x0CA00 ++#define IXGBE_TXPBTHRESH(_i) (0x04950 + ((_i) * 4)) /* 8 of these 0 - 7 */ ++ ++#define IXGBE_DMATXCTL_TE 0x1 /* Transmit Enable */ ++#define IXGBE_DMATXCTL_NS 0x2 /* No Snoop LSO hdr buffer */ ++#define IXGBE_DMATXCTL_GDV 0x8 /* Global Double VLAN */ ++#define IXGBE_DMATXCTL_VT_SHIFT 16 /* VLAN EtherType */ ++ ++#define IXGBE_PFDTXGSWC_VT_LBEN 0x1 /* Local L2 VT switch enable */ + #define IXGBE_DCA_TXCTRL(_i) (0x07200 + ((_i) * 4)) /* 16 of these (0-15) */ ++/* Tx DCA Control register : 128 of these (0-127) */ ++#define IXGBE_DCA_TXCTRL_82599(_i) (0x0600C + ((_i) * 0x40)) + #define IXGBE_TIPG 0x0CB00 + #define IXGBE_TXPBSIZE(_i) (0x0CC00 + ((_i) * 4)) /* 8 of these */ + #define IXGBE_MNGTXMAP 0x0CD10 +@@ -175,9 +306,69 @@ + + #define IXGBE_WUPL 0x05900 + #define IXGBE_WUPM 0x05A00 /* wake up pkt memory 0x5A00-0x5A7C */ +-#define IXGBE_FHFT 0x09000 /* Flex host filter table 9000-93FC */ ++#define IXGBE_FHFT(_n) (0x09000 + (_n * 0x100)) /* Flex host filter table */ ++#define IXGBE_FHFT_EXT(_n) (0x09800 + (_n * 0x100)) /* Ext Flexible Host ++ * Filter Table */ + +-/* Music registers */ ++#define IXGBE_FLEXIBLE_FILTER_COUNT_MAX 4 ++#define IXGBE_EXT_FLEXIBLE_FILTER_COUNT_MAX 2 ++ ++/* Each Flexible Filter is at most 128 (0x80) bytes in length */ ++#define IXGBE_FLEXIBLE_FILTER_SIZE_MAX 128 ++#define IXGBE_FHFT_LENGTH_OFFSET 0xFC /* Length byte in FHFT */ ++#define IXGBE_FHFT_LENGTH_MASK 0x0FF /* Length in lower byte */ ++ ++/* Definitions for power management and wakeup registers */ ++/* Wake Up Control */ ++#define IXGBE_WUC_PME_EN 0x00000002 /* PME Enable */ ++#define IXGBE_WUC_PME_STATUS 0x00000004 /* PME Status */ ++#define IXGBE_WUC_ADVD3WUC 0x00000010 /* D3Cold wake up cap. enable*/ ++ ++/* Wake Up Filter Control */ ++#define IXGBE_WUFC_LNKC 0x00000001 /* Link Status Change Wakeup Enable */ ++#define IXGBE_WUFC_MAG 0x00000002 /* Magic Packet Wakeup Enable */ ++#define IXGBE_WUFC_EX 0x00000004 /* Directed Exact Wakeup Enable */ ++#define IXGBE_WUFC_MC 0x00000008 /* Directed Multicast Wakeup Enable */ ++#define IXGBE_WUFC_BC 0x00000010 /* Broadcast Wakeup Enable */ ++#define IXGBE_WUFC_ARP 0x00000020 /* ARP Request Packet Wakeup Enable */ ++#define IXGBE_WUFC_IPV4 0x00000040 /* Directed IPv4 Packet Wakeup Enable */ ++#define IXGBE_WUFC_IPV6 0x00000080 /* Directed IPv6 Packet Wakeup Enable */ ++#define IXGBE_WUFC_MNG 0x00000100 /* Directed Mgmt Packet Wakeup Enable */ ++ ++#define IXGBE_WUFC_IGNORE_TCO 0x00008000 /* Ignore WakeOn TCO packets */ ++#define IXGBE_WUFC_FLX0 0x00010000 /* Flexible Filter 0 Enable */ ++#define IXGBE_WUFC_FLX1 0x00020000 /* Flexible Filter 1 Enable */ ++#define IXGBE_WUFC_FLX2 0x00040000 /* Flexible Filter 2 Enable */ ++#define IXGBE_WUFC_FLX3 0x00080000 /* Flexible Filter 3 Enable */ ++#define IXGBE_WUFC_FLX4 0x00100000 /* Flexible Filter 4 Enable */ ++#define IXGBE_WUFC_FLX5 0x00200000 /* Flexible Filter 5 Enable */ ++#define IXGBE_WUFC_FLX_FILTERS 0x000F0000 /* Mask for 4 flex filters */ ++#define IXGBE_WUFC_EXT_FLX_FILTERS 0x00300000 /* Mask for Ext. flex filters */ ++#define IXGBE_WUFC_ALL_FILTERS 0x003F00FF /* Mask for all 6 wakeup filters*/ ++#define IXGBE_WUFC_FLX_OFFSET 16 /* Offset to the Flexible Filters bits */ ++ ++/* Wake Up Status */ ++#define IXGBE_WUS_LNKC IXGBE_WUFC_LNKC ++#define IXGBE_WUS_MAG IXGBE_WUFC_MAG ++#define IXGBE_WUS_EX IXGBE_WUFC_EX ++#define IXGBE_WUS_MC IXGBE_WUFC_MC ++#define IXGBE_WUS_BC IXGBE_WUFC_BC ++#define IXGBE_WUS_ARP IXGBE_WUFC_ARP ++#define IXGBE_WUS_IPV4 IXGBE_WUFC_IPV4 ++#define IXGBE_WUS_IPV6 IXGBE_WUFC_IPV6 ++#define IXGBE_WUS_MNG IXGBE_WUFC_MNG ++#define IXGBE_WUS_FLX0 IXGBE_WUFC_FLX0 ++#define IXGBE_WUS_FLX1 IXGBE_WUFC_FLX1 ++#define IXGBE_WUS_FLX2 IXGBE_WUFC_FLX2 ++#define IXGBE_WUS_FLX3 IXGBE_WUFC_FLX3 ++#define IXGBE_WUS_FLX4 IXGBE_WUFC_FLX4 ++#define IXGBE_WUS_FLX5 IXGBE_WUFC_FLX5 ++#define IXGBE_WUS_FLX_FILTERS IXGBE_WUFC_FLX_FILTERS ++ ++/* Wake Up Packet Length */ ++#define IXGBE_WUPL_LENGTH_MASK 0xFFFF ++ ++/* DCB registers */ + #define IXGBE_RMCS 0x03D00 + #define IXGBE_DPMCS 0x07F40 + #define IXGBE_PDPMCS 0x0CD00 +@@ -190,6 +381,181 @@ + #define IXGBE_TDPT2TCSR(_i) (0x0CD40 + ((_i) * 4)) /* 8 of these (0-7) */ + + ++/* Security Control Registers */ ++#define IXGBE_SECTXCTRL 0x08800 ++#define IXGBE_SECTXSTAT 0x08804 ++#define IXGBE_SECTXBUFFAF 0x08808 ++#define IXGBE_SECTXMINIFG 0x08810 ++#define IXGBE_SECTXSTAT 0x08804 ++#define IXGBE_SECRXCTRL 0x08D00 ++#define IXGBE_SECRXSTAT 0x08D04 ++ ++/* Security Bit Fields and Masks */ ++#define IXGBE_SECTXCTRL_SECTX_DIS 0x00000001 ++#define IXGBE_SECTXCTRL_TX_DIS 0x00000002 ++#define IXGBE_SECTXCTRL_STORE_FORWARD 0x00000004 ++ ++#define IXGBE_SECTXSTAT_SECTX_RDY 0x00000001 ++#define IXGBE_SECTXSTAT_ECC_TXERR 0x00000002 ++ ++#define IXGBE_SECRXCTRL_SECRX_DIS 0x00000001 ++#define IXGBE_SECRXCTRL_RX_DIS 0x00000002 ++ ++#define IXGBE_SECRXSTAT_SECRX_RDY 0x00000001 ++#define IXGBE_SECRXSTAT_ECC_RXERR 0x00000002 ++ ++/* LinkSec (MacSec) Registers */ ++#define IXGBE_LSECTXCAP 0x08A00 ++#define IXGBE_LSECRXCAP 0x08F00 ++#define IXGBE_LSECTXCTRL 0x08A04 ++#define IXGBE_LSECTXSCL 0x08A08 /* SCI Low */ ++#define IXGBE_LSECTXSCH 0x08A0C /* SCI High */ ++#define IXGBE_LSECTXSA 0x08A10 ++#define IXGBE_LSECTXPN0 0x08A14 ++#define IXGBE_LSECTXPN1 0x08A18 ++#define IXGBE_LSECTXKEY0(_n) (0x08A1C + (4 * (_n))) /* 4 of these (0-3) */ ++#define IXGBE_LSECTXKEY1(_n) (0x08A2C + (4 * (_n))) /* 4 of these (0-3) */ ++#define IXGBE_LSECRXCTRL 0x08F04 ++#define IXGBE_LSECRXSCL 0x08F08 ++#define IXGBE_LSECRXSCH 0x08F0C ++#define IXGBE_LSECRXSA(_i) (0x08F10 + (4 * (_i))) /* 2 of these (0-1) */ ++#define IXGBE_LSECRXPN(_i) (0x08F18 + (4 * (_i))) /* 2 of these (0-1) */ ++#define IXGBE_LSECRXKEY(_n, _m) (0x08F20 + ((0x10 * (_n)) + (4 * (_m)))) ++#define IXGBE_LSECTXUT 0x08A3C /* OutPktsUntagged */ ++#define IXGBE_LSECTXPKTE 0x08A40 /* OutPktsEncrypted */ ++#define IXGBE_LSECTXPKTP 0x08A44 /* OutPktsProtected */ ++#define IXGBE_LSECTXOCTE 0x08A48 /* OutOctetsEncrypted */ ++#define IXGBE_LSECTXOCTP 0x08A4C /* OutOctetsProtected */ ++#define IXGBE_LSECRXUT 0x08F40 /* InPktsUntagged/InPktsNoTag */ ++#define IXGBE_LSECRXOCTD 0x08F44 /* InOctetsDecrypted */ ++#define IXGBE_LSECRXOCTV 0x08F48 /* InOctetsValidated */ ++#define IXGBE_LSECRXBAD 0x08F4C /* InPktsBadTag */ ++#define IXGBE_LSECRXNOSCI 0x08F50 /* InPktsNoSci */ ++#define IXGBE_LSECRXUNSCI 0x08F54 /* InPktsUnknownSci */ ++#define IXGBE_LSECRXUNCH 0x08F58 /* InPktsUnchecked */ ++#define IXGBE_LSECRXDELAY 0x08F5C /* InPktsDelayed */ ++#define IXGBE_LSECRXLATE 0x08F60 /* InPktsLate */ ++#define IXGBE_LSECRXOK(_n) (0x08F64 + (0x04 * (_n))) /* InPktsOk */ ++#define IXGBE_LSECRXINV(_n) (0x08F6C + (0x04 * (_n))) /* InPktsInvalid */ ++#define IXGBE_LSECRXNV(_n) (0x08F74 + (0x04 * (_n))) /* InPktsNotValid */ ++#define IXGBE_LSECRXUNSA 0x08F7C /* InPktsUnusedSa */ ++#define IXGBE_LSECRXNUSA 0x08F80 /* InPktsNotUsingSa */ ++ ++/* LinkSec (MacSec) Bit Fields and Masks */ ++#define IXGBE_LSECTXCAP_SUM_MASK 0x00FF0000 ++#define IXGBE_LSECTXCAP_SUM_SHIFT 16 ++#define IXGBE_LSECRXCAP_SUM_MASK 0x00FF0000 ++#define IXGBE_LSECRXCAP_SUM_SHIFT 16 ++ ++#define IXGBE_LSECTXCTRL_EN_MASK 0x00000003 ++#define IXGBE_LSECTXCTRL_DISABLE 0x0 ++#define IXGBE_LSECTXCTRL_AUTH 0x1 ++#define IXGBE_LSECTXCTRL_AUTH_ENCRYPT 0x2 ++#define IXGBE_LSECTXCTRL_AISCI 0x00000020 ++#define IXGBE_LSECTXCTRL_PNTHRSH_MASK 0xFFFFFF00 ++#define IXGBE_LSECTXCTRL_RSV_MASK 0x000000D8 ++ ++#define IXGBE_LSECRXCTRL_EN_MASK 0x0000000C ++#define IXGBE_LSECRXCTRL_EN_SHIFT 2 ++#define IXGBE_LSECRXCTRL_DISABLE 0x0 ++#define IXGBE_LSECRXCTRL_CHECK 0x1 ++#define IXGBE_LSECRXCTRL_STRICT 0x2 ++#define IXGBE_LSECRXCTRL_DROP 0x3 ++#define IXGBE_LSECRXCTRL_PLSH 0x00000040 ++#define IXGBE_LSECRXCTRL_RP 0x00000080 ++#define IXGBE_LSECRXCTRL_RSV_MASK 0xFFFFFF33 ++ ++/* IpSec Registers */ ++#define IXGBE_IPSTXIDX 0x08900 ++#define IXGBE_IPSTXSALT 0x08904 ++#define IXGBE_IPSTXKEY(_i) (0x08908 + (4 * (_i))) /* 4 of these (0-3) */ ++#define IXGBE_IPSRXIDX 0x08E00 ++#define IXGBE_IPSRXIPADDR(_i) (0x08E04 + (4 * (_i))) /* 4 of these (0-3) */ ++#define IXGBE_IPSRXSPI 0x08E14 ++#define IXGBE_IPSRXIPIDX 0x08E18 ++#define IXGBE_IPSRXKEY(_i) (0x08E1C + (4 * (_i))) /* 4 of these (0-3) */ ++#define IXGBE_IPSRXSALT 0x08E2C ++#define IXGBE_IPSRXMOD 0x08E30 ++ ++#define IXGBE_SECTXCTRL_STORE_FORWARD_ENABLE 0x4 ++ ++/* DCB registers */ ++#define IXGBE_RTRPCS 0x02430 ++#define IXGBE_RTTDCS 0x04900 ++#define IXGBE_RTTDCS_ARBDIS 0x00000040 /* DCB arbiter disable */ ++#define IXGBE_RTTPCS 0x0CD00 ++#define IXGBE_RTRUP2TC 0x03020 ++#define IXGBE_RTTUP2TC 0x0C800 ++#define IXGBE_RTRPT4C(_i) (0x02140 + ((_i) * 4)) /* 8 of these (0-7) */ ++#define IXGBE_RTRPT4S(_i) (0x02160 + ((_i) * 4)) /* 8 of these (0-7) */ ++#define IXGBE_RTTDT2C(_i) (0x04910 + ((_i) * 4)) /* 8 of these (0-7) */ ++#define IXGBE_RTTDT2S(_i) (0x04930 + ((_i) * 4)) /* 8 of these (0-7) */ ++#define IXGBE_RTTPT2C(_i) (0x0CD20 + ((_i) * 4)) /* 8 of these (0-7) */ ++#define IXGBE_RTTPT2S(_i) (0x0CD40 + ((_i) * 4)) /* 8 of these (0-7) */ ++#define IXGBE_RTTDQSEL 0x04904 ++#define IXGBE_RTTDT1C 0x04908 ++#define IXGBE_RTTDT1S 0x0490C ++#define IXGBE_RTTDTECC 0x04990 ++#define IXGBE_RTTDTECC_NO_BCN 0x00000100 ++ ++#define IXGBE_RTTBCNRC 0x04984 ++ ++ ++/* FCoE DMA Context Registers */ ++#define IXGBE_FCPTRL 0x02410 /* FC User Desc. PTR Low */ ++#define IXGBE_FCPTRH 0x02414 /* FC USer Desc. PTR High */ ++#define IXGBE_FCBUFF 0x02418 /* FC Buffer Control */ ++#define IXGBE_FCDMARW 0x02420 /* FC Receive DMA RW */ ++#define IXGBE_FCINVST0 0x03FC0 /* FC Invalid DMA Context Status Reg 0 */ ++#define IXGBE_FCINVST(_i) (IXGBE_FCINVST0 + ((_i) * 4)) ++#define IXGBE_FCBUFF_VALID (1 << 0) /* DMA Context Valid */ ++#define IXGBE_FCBUFF_BUFFSIZE (3 << 3) /* User Buffer Size */ ++#define IXGBE_FCBUFF_WRCONTX (1 << 7) /* 0: Initiator, 1: Target */ ++#define IXGBE_FCBUFF_BUFFCNT 0x0000ff00 /* Number of User Buffers */ ++#define IXGBE_FCBUFF_OFFSET 0xffff0000 /* User Buffer Offset */ ++#define IXGBE_FCBUFF_BUFFSIZE_SHIFT 3 ++#define IXGBE_FCBUFF_BUFFCNT_SHIFT 8 ++#define IXGBE_FCBUFF_OFFSET_SHIFT 16 ++#define IXGBE_FCDMARW_WE (1 << 14) /* Write enable */ ++#define IXGBE_FCDMARW_RE (1 << 15) /* Read enable */ ++#define IXGBE_FCDMARW_FCOESEL 0x000001ff /* FC X_ID: 11 bits */ ++#define IXGBE_FCDMARW_LASTSIZE 0xffff0000 /* Last User Buffer Size */ ++#define IXGBE_FCDMARW_LASTSIZE_SHIFT 16 ++/* FCoE SOF/EOF */ ++#define IXGBE_TEOFF 0x04A94 /* Tx FC EOF */ ++#define IXGBE_TSOFF 0x04A98 /* Tx FC SOF */ ++#define IXGBE_REOFF 0x05158 /* Rx FC EOF */ ++#define IXGBE_RSOFF 0x051F8 /* Rx FC SOF */ ++/* FCoE Filter Context Registers */ ++#define IXGBE_FCFLT 0x05108 /* FC FLT Context */ ++#define IXGBE_FCFLTRW 0x05110 /* FC Filter RW Control */ ++#define IXGBE_FCPARAM 0x051d8 /* FC Offset Parameter */ ++#define IXGBE_FCFLT_VALID (1 << 0) /* Filter Context Valid */ ++#define IXGBE_FCFLT_FIRST (1 << 1) /* Filter First */ ++#define IXGBE_FCFLT_SEQID 0x00ff0000 /* Sequence ID */ ++#define IXGBE_FCFLT_SEQCNT 0xff000000 /* Sequence Count */ ++#define IXGBE_FCFLTRW_RVALDT (1 << 13) /* Fast Re-Validation */ ++#define IXGBE_FCFLTRW_WE (1 << 14) /* Write Enable */ ++#define IXGBE_FCFLTRW_RE (1 << 15) /* Read Enable */ ++/* FCoE Receive Control */ ++#define IXGBE_FCRXCTRL 0x05100 /* FC Receive Control */ ++#define IXGBE_FCRXCTRL_FCOELLI (1 << 0) /* Low latency interrupt */ ++#define IXGBE_FCRXCTRL_SAVBAD (1 << 1) /* Save Bad Frames */ ++#define IXGBE_FCRXCTRL_FRSTRDH (1 << 2) /* EN 1st Read Header */ ++#define IXGBE_FCRXCTRL_LASTSEQH (1 << 3) /* EN Last Header in Seq */ ++#define IXGBE_FCRXCTRL_ALLH (1 << 4) /* EN All Headers */ ++#define IXGBE_FCRXCTRL_FRSTSEQH (1 << 5) /* EN 1st Seq. Header */ ++#define IXGBE_FCRXCTRL_ICRC (1 << 6) /* Ignore Bad FC CRC */ ++#define IXGBE_FCRXCTRL_FCCRCBO (1 << 7) /* FC CRC Byte Ordering */ ++#define IXGBE_FCRXCTRL_FCOEVER 0x00000f00 /* FCoE Version: 4 bits */ ++#define IXGBE_FCRXCTRL_FCOEVER_SHIFT 8 ++/* FCoE Redirection */ ++#define IXGBE_FCRECTL 0x0ED00 /* FC Redirection Control */ ++#define IXGBE_FCRETA0 0x0ED10 /* FC Redirection Table 0 */ ++#define IXGBE_FCRETA(_i) (IXGBE_FCRETA0 + ((_i) * 4)) /* FCoE Redir */ ++#define IXGBE_FCRECTL_ENA 0x1 /* FCoE Redir Table Enable */ ++#define IXGBE_FCRETA_SIZE 8 /* Max entries in FCRETA */ ++#define IXGBE_FCRETA_ENTRY_MASK 0x0000007f /* 7 bits for the queue index */ + + /* Stats registers */ + #define IXGBE_CRCERRS 0x04000 +@@ -204,6 +570,11 @@ + #define IXGBE_LXONRXC 0x0CF60 + #define IXGBE_LXOFFTXC 0x03F68 + #define IXGBE_LXOFFRXC 0x0CF68 ++#define IXGBE_LXONRXCNT 0x041A4 ++#define IXGBE_LXOFFRXCNT 0x041A8 ++#define IXGBE_PXONRXCNT(_i) (0x04140 + ((_i) * 4)) /* 8 of these */ ++#define IXGBE_PXOFFRXCNT(_i) (0x04160 + ((_i) * 4)) /* 8 of these */ ++#define IXGBE_PXON2OFFCNT(_i) (0x03240 + ((_i) * 4)) /* 8 of these */ + #define IXGBE_PXONTXC(_i) (0x03F00 + ((_i) * 4)) /* 8 of these 3F00-3F1C*/ + #define IXGBE_PXONRXC(_i) (0x0CF00 + ((_i) * 4)) /* 8 of these CF00-CF1C*/ + #define IXGBE_PXOFFTXC(_i) (0x03F20 + ((_i) * 4)) /* 8 of these 3F20-3F3C*/ +@@ -243,14 +614,29 @@ + #define IXGBE_MPTC 0x040F0 + #define IXGBE_BPTC 0x040F4 + #define IXGBE_XEC 0x04120 ++#define IXGBE_SSVPC 0x08780 + +-#define IXGBE_RQSMR(_i) (0x02300 + ((_i) * 4)) /* 16 of these */ +-#define IXGBE_TQSMR(_i) (((_i) <= 7) ? (0x07300 + ((_i) * 4)) : (0x08600 + ((_i) * 4))) ++#define IXGBE_RQSMR(_i) (0x02300 + ((_i) * 4)) ++#define IXGBE_TQSMR(_i) (((_i) <= 7) ? (0x07300 + ((_i) * 4)) : \ ++ (0x08600 + ((_i) * 4))) ++#define IXGBE_TQSM(_i) (0x08600 + ((_i) * 4)) + + #define IXGBE_QPRC(_i) (0x01030 + ((_i) * 0x40)) /* 16 of these */ + #define IXGBE_QPTC(_i) (0x06030 + ((_i) * 0x40)) /* 16 of these */ + #define IXGBE_QBRC(_i) (0x01034 + ((_i) * 0x40)) /* 16 of these */ + #define IXGBE_QBTC(_i) (0x06034 + ((_i) * 0x40)) /* 16 of these */ ++#define IXGBE_QPRDC(_i) (0x01430 + ((_i) * 0x40)) /* 16 of these */ ++#define IXGBE_QBTC_L(_i) (0x08700 + ((_i) * 0x8)) /* 16 of these */ ++#define IXGBE_QBTC_H(_i) (0x08704 + ((_i) * 0x8)) /* 16 of these */ ++#define IXGBE_FCCRC 0x05118 /* Count of Good Eth CRC w/ Bad FC CRC */ ++#define IXGBE_FCOERPDC 0x0241C /* FCoE Rx Packets Dropped Count */ ++#define IXGBE_FCLAST 0x02424 /* FCoE Last Error Count */ ++#define IXGBE_FCOEPRC 0x02428 /* Number of FCoE Packets Received */ ++#define IXGBE_FCOEDWRC 0x0242C /* Number of FCoE DWords Received */ ++#define IXGBE_FCOEPTC 0x08784 /* Number of FCoE Packets Transmitted */ ++#define IXGBE_FCOEDWTC 0x08788 /* Number of FCoE DWords Transmitted */ ++#define IXGBE_FCCRC_CNT_MASK 0x0000FFFF /* CRC_CNT: bit 0 - 15 */ ++#define IXGBE_FCLAST_CNT_MASK 0x0000FFFF /* Last_CNT: bit 0 - 15 */ + + /* Management */ + #define IXGBE_MAVTV(_i) (0x05010 + ((_i) * 4)) /* 8 of these (0-7) */ +@@ -263,6 +649,9 @@ + #define IXGBE_MMAL(_i) (0x05910 + ((_i) * 8)) /* 4 of these (0-3) */ + #define IXGBE_MMAH(_i) (0x05914 + ((_i) * 8)) /* 4 of these (0-3) */ + #define IXGBE_FTFT 0x09400 /* 0x9400-0x97FC */ ++#define IXGBE_METF(_i) (0x05190 + ((_i) * 4)) /* 4 of these (0-3) */ ++#define IXGBE_MDEF_EXT(_i) (0x05160 + ((_i) * 4)) /* 8 of these (0-7) */ ++#define IXGBE_LSWFW 0x15014 + + /* ARC Subsystem registers */ + #define IXGBE_HICR 0x15F00 +@@ -295,16 +684,65 @@ + #define IXGBE_DCA_ID 0x11070 + #define IXGBE_DCA_CTRL 0x11074 + ++/* PCI-E registers 82599-Specific */ ++#define IXGBE_GCR_EXT 0x11050 ++#define IXGBE_GSCL_5_82599 0x11030 ++#define IXGBE_GSCL_6_82599 0x11034 ++#define IXGBE_GSCL_7_82599 0x11038 ++#define IXGBE_GSCL_8_82599 0x1103C ++#define IXGBE_PHYADR_82599 0x11040 ++#define IXGBE_PHYDAT_82599 0x11044 ++#define IXGBE_PHYCTL_82599 0x11048 ++#define IXGBE_PBACLR_82599 0x11068 ++#define IXGBE_CIAA_82599 0x11088 ++#define IXGBE_CIAD_82599 0x1108C ++#define IXGBE_PCIE_DIAG_0_82599 0x11090 ++#define IXGBE_PCIE_DIAG_1_82599 0x11094 ++#define IXGBE_PCIE_DIAG_2_82599 0x11098 ++#define IXGBE_PCIE_DIAG_3_82599 0x1109C ++#define IXGBE_PCIE_DIAG_4_82599 0x110A0 ++#define IXGBE_PCIE_DIAG_5_82599 0x110A4 ++#define IXGBE_PCIE_DIAG_6_82599 0x110A8 ++#define IXGBE_PCIE_DIAG_7_82599 0x110C0 ++#define IXGBE_INTRPT_CSR_82599 0x110B0 ++#define IXGBE_INTRPT_MASK_82599 0x110B8 ++#define IXGBE_CDQ_MBR_82599 0x110B4 ++#define IXGBE_MISC_REG_82599 0x110F0 ++#define IXGBE_ECC_CTRL_0_82599 0x11100 ++#define IXGBE_ECC_CTRL_1_82599 0x11104 ++#define IXGBE_ECC_STATUS_82599 0x110E0 ++#define IXGBE_BAR_CTRL_82599 0x110F4 ++ ++/* Time Sync Registers */ ++#define IXGBE_TSYNCRXCTL 0x05188 /* Rx Time Sync Control register - RW */ ++#define IXGBE_TSYNCTXCTL 0x08C00 /* Tx Time Sync Control register - RW */ ++#define IXGBE_RXSTMPL 0x051E8 /* Rx timestamp Low - RO */ ++#define IXGBE_RXSTMPH 0x051A4 /* Rx timestamp High - RO */ ++#define IXGBE_RXSATRL 0x051A0 /* Rx timestamp attribute low - RO */ ++#define IXGBE_RXSATRH 0x051A8 /* Rx timestamp attribute high - RO */ ++#define IXGBE_RXMTRL 0x05120 /* RX message type register low - RW */ ++#define IXGBE_TXSTMPL 0x08C04 /* Tx timestamp value Low - RO */ ++#define IXGBE_TXSTMPH 0x08C08 /* Tx timestamp value High - RO */ ++#define IXGBE_SYSTIML 0x08C0C /* System time register Low - RO */ ++#define IXGBE_SYSTIMH 0x08C10 /* System time register High - RO */ ++#define IXGBE_TIMINCA 0x08C14 /* Increment attributes register - RW */ ++#define IXGBE_RXUDP 0x08C1C /* Time Sync Rx UDP Port - RW */ ++ + /* Diagnostic Registers */ + #define IXGBE_RDSTATCTL 0x02C20 + #define IXGBE_RDSTAT(_i) (0x02C00 + ((_i) * 4)) /* 0x02C00-0x02C1C */ + #define IXGBE_RDHMPN 0x02F08 + #define IXGBE_RIC_DW(_i) (0x02F10 + ((_i) * 4)) + #define IXGBE_RDPROBE 0x02F20 ++#define IXGBE_RDMAM 0x02F30 ++#define IXGBE_RDMAD 0x02F34 + #define IXGBE_TDSTATCTL 0x07C20 + #define IXGBE_TDSTAT(_i) (0x07C00 + ((_i) * 4)) /* 0x07C00 - 0x07C1C */ + #define IXGBE_TDHMPN 0x07F08 ++#define IXGBE_TDHMPN2 0x082FC ++#define IXGBE_TXDESCIC 0x082CC + #define IXGBE_TIC_DW(_i) (0x07F10 + ((_i) * 4)) ++#define IXGBE_TIC_DW2(_i) (0x082B0 + ((_i) * 4)) + #define IXGBE_TDPROBE 0x07F20 + #define IXGBE_TXBUFCTRL 0x0C600 + #define IXGBE_TXBUFDATA0 0x0C610 +@@ -332,6 +770,10 @@ + #define IXGBE_TXDATARDPTR(_i) (0x0C720 + ((_i) * 4)) /* 8 of these C720-C72C*/ + #define IXGBE_TXDESCRDPTR(_i) (0x0C730 + ((_i) * 4)) /* 8 of these C730-C73C*/ + #define IXGBE_PCIEECCCTL 0x1106C ++#define IXGBE_PCIEECCCTL0 0x11100 ++#define IXGBE_PCIEECCCTL1 0x11104 ++#define IXGBE_RXDBUECC 0x03F70 ++#define IXGBE_TXDBUECC 0x0CF70 + #define IXGBE_PBTXECC 0x0C300 + #define IXGBE_PBRXECC 0x03300 + #define IXGBE_GHECCR 0x110B0 +@@ -357,24 +799,74 @@ + #define IXGBE_MSRWD 0x04260 + #define IXGBE_MLADD 0x04264 + #define IXGBE_MHADD 0x04268 ++#define IXGBE_MAXFRS 0x04268 + #define IXGBE_TREG 0x0426C + #define IXGBE_PCSS1 0x04288 + #define IXGBE_PCSS2 0x0428C + #define IXGBE_XPCSS 0x04290 ++#define IXGBE_MFLCN 0x04294 + #define IXGBE_SERDESC 0x04298 + #define IXGBE_MACS 0x0429C + #define IXGBE_AUTOC 0x042A0 + #define IXGBE_LINKS 0x042A4 ++#define IXGBE_LINKS2 0x04324 + #define IXGBE_AUTOC2 0x042A8 + #define IXGBE_AUTOC3 0x042AC + #define IXGBE_ANLP1 0x042B0 + #define IXGBE_ANLP2 0x042B4 + #define IXGBE_ATLASCTL 0x04800 ++#define IXGBE_MMNGC 0x042D0 ++#define IXGBE_ANLPNP1 0x042D4 ++#define IXGBE_ANLPNP2 0x042D8 ++#define IXGBE_KRPCSFC 0x042E0 ++#define IXGBE_KRPCSS 0x042E4 ++#define IXGBE_FECS1 0x042E8 ++#define IXGBE_FECS2 0x042EC ++#define IXGBE_SMADARCTL 0x14F10 ++#define IXGBE_MPVC 0x04318 ++#define IXGBE_SGMIIC 0x04314 ++ ++/* Omer CORECTL */ ++#define IXGBE_CORECTL 0x014F00 ++/* BARCTRL */ ++#define IXGBE_BARCTRL 0x110F4 ++#define IXGBE_BARCTRL_FLSIZE 0x0700 ++#define IXGBE_BARCTRL_CSRSIZE 0x2000 ++ ++/* RSCCTL Bit Masks */ ++#define IXGBE_RSCCTL_RSCEN 0x01 ++#define IXGBE_RSCCTL_MAXDESC_1 0x00 ++#define IXGBE_RSCCTL_MAXDESC_4 0x04 ++#define IXGBE_RSCCTL_MAXDESC_8 0x08 ++#define IXGBE_RSCCTL_MAXDESC_16 0x0C ++ ++/* RSCDBU Bit Masks */ ++#define IXGBE_RSCDBU_RSCSMALDIS_MASK 0x0000007F ++#define IXGBE_RSCDBU_RSCACKDIS 0x00000080 + + /* RDRXCTL Bit Masks */ + #define IXGBE_RDRXCTL_RDMTS_1_2 0x00000000 /* Rx Desc Min Threshold Size */ ++#define IXGBE_RDRXCTL_CRCSTRIP 0x00000002 /* CRC Strip */ + #define IXGBE_RDRXCTL_MVMEN 0x00000020 + #define IXGBE_RDRXCTL_DMAIDONE 0x00000008 /* DMA init cycle done */ ++#define IXGBE_RDRXCTL_AGGDIS 0x00010000 /* Aggregation disable */ ++#define IXGBE_RDRXCTL_RSCFRSTSIZE 0x003E0000 /* RSC First packet size */ ++#define IXGBE_RDRXCTL_RSCLLIDIS 0x00800000 /* Disable RSC compl on LLI */ ++ ++/* RQTC Bit Masks and Shifts */ ++#define IXGBE_RQTC_SHIFT_TC(_i) ((_i) * 4) ++#define IXGBE_RQTC_TC0_MASK (0x7 << 0) ++#define IXGBE_RQTC_TC1_MASK (0x7 << 4) ++#define IXGBE_RQTC_TC2_MASK (0x7 << 8) ++#define IXGBE_RQTC_TC3_MASK (0x7 << 12) ++#define IXGBE_RQTC_TC4_MASK (0x7 << 16) ++#define IXGBE_RQTC_TC5_MASK (0x7 << 20) ++#define IXGBE_RQTC_TC6_MASK (0x7 << 24) ++#define IXGBE_RQTC_TC7_MASK (0x7 << 28) ++ ++/* PSRTYPE.RQPL Bit masks and shift */ ++#define IXGBE_PSRTYPE_RQPL_MASK 0x7 ++#define IXGBE_PSRTYPE_RQPL_SHIFT 29 + + /* CTRL Bit Masks */ + #define IXGBE_CTRL_GIO_DIS 0x00000004 /* Global IO Master Disable bit */ +@@ -389,6 +881,7 @@ + #define IXGBE_MHADD_MFS_SHIFT 16 + + /* Extended Device Control */ ++#define IXGBE_CTRL_EXT_PFRSTD 0x00004000 /* Physical Function Reset Done */ + #define IXGBE_CTRL_EXT_NS_DIS 0x00010000 /* No Snoop disable */ + #define IXGBE_CTRL_EXT_RO_DIS 0x00020000 /* Relaxed Ordering disable */ + #define IXGBE_CTRL_EXT_DRV_LOAD 0x10000000 /* Driver loaded bit for FW */ +@@ -401,11 +894,18 @@ + #define IXGBE_DCA_CTRL_DCA_MODE_CB2 0x02 /* DCA Mode CB2 */ + + #define IXGBE_DCA_RXCTRL_CPUID_MASK 0x0000001F /* Rx CPUID Mask */ ++#define IXGBE_DCA_RXCTRL_CPUID_MASK_82599 0xFF000000 /* Rx CPUID Mask */ ++#define IXGBE_DCA_RXCTRL_CPUID_SHIFT_82599 24 /* Rx CPUID Shift */ + #define IXGBE_DCA_RXCTRL_DESC_DCA_EN (1 << 5) /* DCA Rx Desc enable */ + #define IXGBE_DCA_RXCTRL_HEAD_DCA_EN (1 << 6) /* DCA Rx Desc header enable */ + #define IXGBE_DCA_RXCTRL_DATA_DCA_EN (1 << 7) /* DCA Rx Desc payload enable */ ++#define IXGBE_DCA_RXCTRL_DESC_RRO_EN (1 << 9) /* DCA Rx rd Desc Relax Order */ ++#define IXGBE_DCA_RXCTRL_DESC_WRO_EN (1 << 13) /* DCA Rx wr Desc Relax Order */ ++#define IXGBE_DCA_RXCTRL_DESC_HSRO_EN (1 << 15) /* DCA Rx Split Header RO */ + + #define IXGBE_DCA_TXCTRL_CPUID_MASK 0x0000001F /* Tx CPUID Mask */ ++#define IXGBE_DCA_TXCTRL_CPUID_MASK_82599 0xFF000000 /* Tx CPUID Mask */ ++#define IXGBE_DCA_TXCTRL_CPUID_SHIFT_82599 24 /* Tx CPUID Shift */ + #define IXGBE_DCA_TXCTRL_DESC_DCA_EN (1 << 5) /* DCA Tx Desc enable */ + #define IXGBE_DCA_TXCTRL_TX_WB_RO_EN (1 << 11) /* Tx Desc writeback RO bit */ + #define IXGBE_DCA_MAX_QUEUES_82598 16 /* DCA regs only on 16 queues */ +@@ -449,6 +949,8 @@ + #define IXGBE_ATLAS_PDN_TX_1G_QL_ALL 0xF0 + #define IXGBE_ATLAS_PDN_TX_AN_QL_ALL 0xF0 + ++/* Omer bit masks */ ++#define IXGBE_CORECTL_WRITE_CMD 0x00010000 + + /* Device Type definitions for new protocol MDIO commands */ + #define IXGBE_MDIO_PMA_PMD_DEV_TYPE 0x1 +@@ -476,8 +978,13 @@ + #define IXGBE_MDIO_PHY_SPEED_ABILITY 0x4 /* Speed Ability Reg */ + #define IXGBE_MDIO_PHY_SPEED_10G 0x0001 /* 10G capable */ + #define IXGBE_MDIO_PHY_SPEED_1G 0x0010 /* 1G capable */ ++#define IXGBE_MDIO_PHY_SPEED_100M 0x0020 /* 100M capable */ ++#define IXGBE_MDIO_PHY_EXT_ABILITY 0xB /* Ext Ability Reg */ ++#define IXGBE_MDIO_PHY_10GBASET_ABILITY 0x0004 /* 10GBaseT capable */ ++#define IXGBE_MDIO_PHY_1000BASET_ABILITY 0x0020 /* 1000BaseT capable */ ++#define IXGBE_MDIO_PHY_100BASETX_ABILITY 0x0080 /* 100BaseTX capable */ + +-#define IXGBE_MDIO_PMA_PMD_SDA_SCL_ADDR 0xC30A /* PHY_XS SDA/SCL Address Reg */ ++#define IXGBE_MDIO_PMA_PMD_SDA_SCL_ADDR 0xC30A /* PHY_XS SDA/SCL Addr Reg */ + #define IXGBE_MDIO_PMA_PMD_SDA_SCL_DATA 0xC30B /* PHY_XS SDA/SCL Data Reg */ + #define IXGBE_MDIO_PMA_PMD_SDA_SCL_STAT 0xC30C /* PHY_XS SDA/SCL Status Reg */ + +@@ -495,11 +1002,14 @@ + /* PHY IDs*/ + #define TN1010_PHY_ID 0x00A19410 + #define TNX_FW_REV 0xB ++#define AQ1002_PHY_ID 0x03A1B420 ++#define AQ_FW_REV 0x20 + #define QT2022_PHY_ID 0x0043A400 + #define ATH_PHY_ID 0x03429050 + + /* PHY Types */ + #define IXGBE_M88E1145_E_PHY_ID 0x01410CD0 ++ + /* Special PHY Init Routine */ + #define IXGBE_PHY_INIT_OFFSET_NL 0x002B + #define IXGBE_PHY_INIT_END_NL 0xFFFF +@@ -515,11 +1025,17 @@ + /* General purpose Interrupt Enable */ + #define IXGBE_SDP0_GPIEN 0x00000001 /* SDP0 */ + #define IXGBE_SDP1_GPIEN 0x00000002 /* SDP1 */ ++#define IXGBE_SDP2_GPIEN 0x00000004 /* SDP2 */ + #define IXGBE_GPIE_MSIX_MODE 0x00000010 /* MSI-X mode */ + #define IXGBE_GPIE_OCD 0x00000020 /* Other Clear Disable */ + #define IXGBE_GPIE_EIMEN 0x00000040 /* Immediate Interrupt Enable */ + #define IXGBE_GPIE_EIAME 0x40000000 + #define IXGBE_GPIE_PBA_SUPPORT 0x80000000 ++#define IXGBE_GPIE_RSC_DELAY_SHIFT 11 ++#define IXGBE_GPIE_VTMODE_MASK 0x0000C000 /* VT Mode Mask */ ++#define IXGBE_GPIE_VTMODE_16 0x00004000 /* 16 VFs 8 queues per VF */ ++#define IXGBE_GPIE_VTMODE_32 0x00008000 /* 32 VFs 4 queues per VF */ ++#define IXGBE_GPIE_VTMODE_64 0x0000C000 /* 64 VFs 2 queues per VF */ + + /* Transmit Flow Control status */ + #define IXGBE_TFCS_TXOFF 0x00000001 +@@ -560,6 +1076,25 @@ + #define IXGBE_VMD_CTL_VMDQ_EN 0x00000001 + #define IXGBE_VMD_CTL_VMDQ_FILTER 0x00000002 + ++/* VT_CTL bitmasks */ ++#define IXGBE_VT_CTL_DIS_DEFPL 0x20000000 /* disable default pool */ ++#define IXGBE_VT_CTL_REPLEN 0x40000000 /* replication enabled */ ++#define IXGBE_VT_CTL_VT_ENABLE 0x00000001 /* Enable VT Mode */ ++#define IXGBE_VT_CTL_POOL_SHIFT 7 ++#define IXGBE_VT_CTL_POOL_MASK (0x3F << IXGBE_VT_CTL_POOL_SHIFT) ++ ++/* VMOLR bitmasks */ ++#define IXGBE_VMOLR_AUPE 0x01000000 /* accept untagged packets */ ++#define IXGBE_VMOLR_ROMPE 0x02000000 /* accept packets in MTA tbl */ ++#define IXGBE_VMOLR_ROPE 0x04000000 /* accept packets in UC tbl */ ++#define IXGBE_VMOLR_BAM 0x08000000 /* accept broadcast packets */ ++#define IXGBE_VMOLR_MPE 0x10000000 /* multicast promiscuous */ ++ ++/* VFRE bitmask */ ++#define IXGBE_VFRE_ENABLE_ALL 0xFFFFFFFF ++ ++#define IXGBE_VF_INIT_TIMEOUT 200 /* Number of retries to clear RSTI */ ++ + /* RDHMPN and TDHMPN bitmasks */ + #define IXGBE_RDHMPN_RDICADDR 0x007FF800 + #define IXGBE_RDHMPN_RDICRDREQ 0x00800000 +@@ -568,13 +1103,48 @@ + #define IXGBE_TDHMPN_TDICRDREQ 0x00800000 + #define IXGBE_TDHMPN_TDICADDR_SHIFT 11 + ++#define IXGBE_RDMAM_MEM_SEL_SHIFT 13 ++#define IXGBE_RDMAM_DWORD_SHIFT 9 ++#define IXGBE_RDMAM_DESC_COMP_FIFO 1 ++#define IXGBE_RDMAM_DFC_CMD_FIFO 2 ++#define IXGBE_RDMAM_RSC_HEADER_ADDR 3 ++#define IXGBE_RDMAM_TCN_STATUS_RAM 4 ++#define IXGBE_RDMAM_WB_COLL_FIFO 5 ++#define IXGBE_RDMAM_QSC_CNT_RAM 6 ++#define IXGBE_RDMAM_QSC_FCOE_RAM 7 ++#define IXGBE_RDMAM_QSC_QUEUE_CNT 8 ++#define IXGBE_RDMAM_QSC_QUEUE_RAM 0xA ++#define IXGBE_RDMAM_QSC_RSC_RAM 0xB ++#define IXGBE_RDMAM_DESC_COM_FIFO_RANGE 135 ++#define IXGBE_RDMAM_DESC_COM_FIFO_COUNT 4 ++#define IXGBE_RDMAM_DFC_CMD_FIFO_RANGE 48 ++#define IXGBE_RDMAM_DFC_CMD_FIFO_COUNT 7 ++#define IXGBE_RDMAM_RSC_HEADER_ADDR_RANGE 32 ++#define IXGBE_RDMAM_RSC_HEADER_ADDR_COUNT 4 ++#define IXGBE_RDMAM_TCN_STATUS_RAM_RANGE 256 ++#define IXGBE_RDMAM_TCN_STATUS_RAM_COUNT 9 ++#define IXGBE_RDMAM_WB_COLL_FIFO_RANGE 8 ++#define IXGBE_RDMAM_WB_COLL_FIFO_COUNT 4 ++#define IXGBE_RDMAM_QSC_CNT_RAM_RANGE 64 ++#define IXGBE_RDMAM_QSC_CNT_RAM_COUNT 4 ++#define IXGBE_RDMAM_QSC_FCOE_RAM_RANGE 512 ++#define IXGBE_RDMAM_QSC_FCOE_RAM_COUNT 5 ++#define IXGBE_RDMAM_QSC_QUEUE_CNT_RANGE 32 ++#define IXGBE_RDMAM_QSC_QUEUE_CNT_COUNT 4 ++#define IXGBE_RDMAM_QSC_QUEUE_RAM_RANGE 128 ++#define IXGBE_RDMAM_QSC_QUEUE_RAM_COUNT 8 ++#define IXGBE_RDMAM_QSC_RSC_RAM_RANGE 32 ++#define IXGBE_RDMAM_QSC_RSC_RAM_COUNT 8 ++ ++#define IXGBE_TXDESCIC_READY 0x80000000 ++ + /* Receive Checksum Control */ + #define IXGBE_RXCSUM_IPPCSE 0x00001000 /* IP payload checksum enable */ + #define IXGBE_RXCSUM_PCSD 0x00002000 /* packet checksum disabled */ + + /* FCRTL Bit Masks */ +-#define IXGBE_FCRTL_XONE 0x80000000 /* bit 31, XON enable */ +-#define IXGBE_FCRTH_FCEN 0x80000000 /* Rx Flow control enable */ ++#define IXGBE_FCRTL_XONE 0x80000000 /* XON enable */ ++#define IXGBE_FCRTH_FCEN 0x80000000 /* Packet buffer fc enable */ + + /* PAP bit masks*/ + #define IXGBE_PAP_TXPAUSECNT_MASK 0x0000FFFF /* Pause counter mask */ +@@ -584,19 +1154,29 @@ + /* Receive Arbitration Control: 0 Round Robin, 1 DFP */ + #define IXGBE_RMCS_RAC 0x00000004 + #define IXGBE_RMCS_DFP IXGBE_RMCS_RAC /* Deficit Fixed Priority ena */ +-#define IXGBE_RMCS_TFCE_802_3X 0x00000008 /* Tx Priority flow control ena */ +-#define IXGBE_RMCS_TFCE_PRIORITY 0x00000010 /* Tx Priority flow control ena */ ++#define IXGBE_RMCS_TFCE_802_3X 0x00000008 /* Tx Priority FC ena */ ++#define IXGBE_RMCS_TFCE_PRIORITY 0x00000010 /* Tx Priority FC ena */ + #define IXGBE_RMCS_ARBDIS 0x00000040 /* Arbitration disable bit */ + ++/* FCCFG Bit Masks */ ++#define IXGBE_FCCFG_TFCE_802_3X 0x00000008 /* Tx link FC enable */ ++#define IXGBE_FCCFG_TFCE_PRIORITY 0x00000010 /* Tx priority FC enable */ + + /* Interrupt register bitmasks */ + + /* Extended Interrupt Cause Read */ + #define IXGBE_EICR_RTX_QUEUE 0x0000FFFF /* RTx Queue Interrupt */ ++#define IXGBE_EICR_FLOW_DIR 0x00010000 /* FDir Exception */ ++#define IXGBE_EICR_RX_MISS 0x00020000 /* Packet Buffer Overrun */ ++#define IXGBE_EICR_PCI 0x00040000 /* PCI Exception */ ++#define IXGBE_EICR_MAILBOX 0x00080000 /* VF to PF Mailbox Interrupt */ + #define IXGBE_EICR_LSC 0x00100000 /* Link Status Change */ ++#define IXGBE_EICR_LINKSEC 0x00200000 /* PN Threshold */ + #define IXGBE_EICR_MNG 0x00400000 /* Manageability Event Interrupt */ + #define IXGBE_EICR_GPI_SDP0 0x01000000 /* Gen Purpose Interrupt on SDP0 */ + #define IXGBE_EICR_GPI_SDP1 0x02000000 /* Gen Purpose Interrupt on SDP1 */ ++#define IXGBE_EICR_GPI_SDP2 0x04000000 /* Gen Purpose Interrupt on SDP2 */ ++#define IXGBE_EICR_ECC 0x10000000 /* ECC Error */ + #define IXGBE_EICR_PBUR 0x10000000 /* Packet Buffer Handler Error */ + #define IXGBE_EICR_DHER 0x20000000 /* Descriptor Handler Error */ + #define IXGBE_EICR_TCP_TIMER 0x40000000 /* TCP Timer */ +@@ -604,10 +1184,16 @@ + + /* Extended Interrupt Cause Set */ + #define IXGBE_EICS_RTX_QUEUE IXGBE_EICR_RTX_QUEUE /* RTx Queue Interrupt */ ++#define IXGBE_EICS_FLOW_DIR IXGBE_EICR_FLOW_DIR /* FDir Exception */ ++#define IXGBE_EICS_RX_MISS IXGBE_EICR_RX_MISS /* Pkt Buffer Overrun */ ++#define IXGBE_EICS_PCI IXGBE_EICR_PCI /* PCI Exception */ ++#define IXGBE_EICS_MAILBOX IXGBE_EICR_MAILBOX /* VF to PF Mailbox Int */ + #define IXGBE_EICS_LSC IXGBE_EICR_LSC /* Link Status Change */ + #define IXGBE_EICS_MNG IXGBE_EICR_MNG /* MNG Event Interrupt */ + #define IXGBE_EICS_GPI_SDP0 IXGBE_EICR_GPI_SDP0 /* SDP0 Gen Purpose Int */ + #define IXGBE_EICS_GPI_SDP1 IXGBE_EICR_GPI_SDP1 /* SDP1 Gen Purpose Int */ ++#define IXGBE_EICS_GPI_SDP2 IXGBE_EICR_GPI_SDP2 /* SDP2 Gen Purpose Int */ ++#define IXGBE_EICS_ECC IXGBE_EICR_ECC /* ECC Error */ + #define IXGBE_EICS_PBUR IXGBE_EICR_PBUR /* Pkt Buf Handler Err */ + #define IXGBE_EICS_DHER IXGBE_EICR_DHER /* Desc Handler Error */ + #define IXGBE_EICS_TCP_TIMER IXGBE_EICR_TCP_TIMER /* TCP Timer */ +@@ -615,10 +1201,16 @@ + + /* Extended Interrupt Mask Set */ + #define IXGBE_EIMS_RTX_QUEUE IXGBE_EICR_RTX_QUEUE /* RTx Queue Interrupt */ ++#define IXGBE_EIMS_FLOW_DIR IXGBE_EICR_FLOW_DIR /* FDir Exception */ ++#define IXGBE_EIMS_RX_MISS IXGBE_EICR_RX_MISS /* Packet Buffer Overrun */ ++#define IXGBE_EIMS_PCI IXGBE_EICR_PCI /* PCI Exception */ ++#define IXGBE_EIMS_MAILBOX IXGBE_EICR_MAILBOX /* VF to PF Mailbox Int */ + #define IXGBE_EIMS_LSC IXGBE_EICR_LSC /* Link Status Change */ + #define IXGBE_EIMS_MNG IXGBE_EICR_MNG /* MNG Event Interrupt */ + #define IXGBE_EIMS_GPI_SDP0 IXGBE_EICR_GPI_SDP0 /* SDP0 Gen Purpose Int */ + #define IXGBE_EIMS_GPI_SDP1 IXGBE_EICR_GPI_SDP1 /* SDP1 Gen Purpose Int */ ++#define IXGBE_EIMS_GPI_SDP2 IXGBE_EICR_GPI_SDP2 /* SDP2 Gen Purpose Int */ ++#define IXGBE_EIMS_ECC IXGBE_EICR_ECC /* ECC Error */ + #define IXGBE_EIMS_PBUR IXGBE_EICR_PBUR /* Pkt Buf Handler Err */ + #define IXGBE_EIMS_DHER IXGBE_EICR_DHER /* Descr Handler Error */ + #define IXGBE_EIMS_TCP_TIMER IXGBE_EICR_TCP_TIMER /* TCP Timer */ +@@ -626,10 +1218,16 @@ + + /* Extended Interrupt Mask Clear */ + #define IXGBE_EIMC_RTX_QUEUE IXGBE_EICR_RTX_QUEUE /* RTx Queue Interrupt */ ++#define IXGBE_EIMC_FLOW_DIR IXGBE_EICR_FLOW_DIR /* FDir Exception */ ++#define IXGBE_EIMC_RX_MISS IXGBE_EICR_RX_MISS /* Packet Buffer Overrun */ ++#define IXGBE_EIMC_PCI IXGBE_EICR_PCI /* PCI Exception */ ++#define IXGBE_EIMC_MAILBOX IXGBE_EICR_MAILBOX /* VF to PF Mailbox Int */ + #define IXGBE_EIMC_LSC IXGBE_EICR_LSC /* Link Status Change */ + #define IXGBE_EIMC_MNG IXGBE_EICR_MNG /* MNG Event Interrupt */ + #define IXGBE_EIMC_GPI_SDP0 IXGBE_EICR_GPI_SDP0 /* SDP0 Gen Purpose Int */ + #define IXGBE_EIMC_GPI_SDP1 IXGBE_EICR_GPI_SDP1 /* SDP1 Gen Purpose Int */ ++#define IXGBE_EIMC_GPI_SDP2 IXGBE_EICR_GPI_SDP2 /* SDP2 Gen Purpose Int */ ++#define IXGBE_EIMC_ECC IXGBE_EICR_ECC /* ECC Error */ + #define IXGBE_EIMC_PBUR IXGBE_EICR_PBUR /* Pkt Buf Handler Err */ + #define IXGBE_EIMC_DHER IXGBE_EICR_DHER /* Desc Handler Err */ + #define IXGBE_EIMC_TCP_TIMER IXGBE_EICR_TCP_TIMER /* TCP Timer */ +@@ -652,12 +1250,45 @@ + #define IXGBE_IMIREXT_CTRL_SYN 0x00020000 /* Check SYN bit in header */ + #define IXGBE_IMIREXT_CTRL_FIN 0x00040000 /* Check FIN bit in header */ + #define IXGBE_IMIREXT_CTRL_BP 0x00080000 /* Bypass check of control bits */ ++#define IXGBE_IMIR_SIZE_BP_82599 0x00001000 /* Packet size bypass */ ++#define IXGBE_IMIR_CTRL_URG_82599 0x00002000 /* Check URG bit in header */ ++#define IXGBE_IMIR_CTRL_ACK_82599 0x00004000 /* Check ACK bit in header */ ++#define IXGBE_IMIR_CTRL_PSH_82599 0x00008000 /* Check PSH bit in header */ ++#define IXGBE_IMIR_CTRL_RST_82599 0x00010000 /* Check RST bit in header */ ++#define IXGBE_IMIR_CTRL_SYN_82599 0x00020000 /* Check SYN bit in header */ ++#define IXGBE_IMIR_CTRL_FIN_82599 0x00040000 /* Check FIN bit in header */ ++#define IXGBE_IMIR_CTRL_BP_82599 0x00080000 /* Bypass check of control bits */ ++#define IXGBE_IMIR_LLI_EN_82599 0x00100000 /* Enables low latency Int */ ++#define IXGBE_IMIR_RX_QUEUE_MASK_82599 0x0000007F /* Rx Queue Mask */ ++#define IXGBE_IMIR_RX_QUEUE_SHIFT_82599 21 /* Rx Queue Shift */ ++#define IXGBE_IMIRVP_PRIORITY_MASK 0x00000007 /* VLAN priority mask */ ++#define IXGBE_IMIRVP_PRIORITY_EN 0x00000008 /* VLAN priority enable */ ++ ++#define IXGBE_MAX_FTQF_FILTERS 128 ++#define IXGBE_FTQF_PROTOCOL_MASK 0x00000003 ++#define IXGBE_FTQF_PROTOCOL_TCP 0x00000000 ++#define IXGBE_FTQF_PROTOCOL_UDP 0x00000001 ++#define IXGBE_FTQF_PROTOCOL_SCTP 2 ++#define IXGBE_FTQF_PRIORITY_MASK 0x00000007 ++#define IXGBE_FTQF_PRIORITY_SHIFT 2 ++#define IXGBE_FTQF_POOL_MASK 0x0000003F ++#define IXGBE_FTQF_POOL_SHIFT 8 ++#define IXGBE_FTQF_5TUPLE_MASK_MASK 0x0000001F ++#define IXGBE_FTQF_5TUPLE_MASK_SHIFT 25 ++#define IXGBE_FTQF_SOURCE_ADDR_MASK 0x1E ++#define IXGBE_FTQF_DEST_ADDR_MASK 0x1D ++#define IXGBE_FTQF_SOURCE_PORT_MASK 0x1B ++#define IXGBE_FTQF_DEST_PORT_MASK 0x17 ++#define IXGBE_FTQF_PROTOCOL_COMP_MASK 0x0F ++#define IXGBE_FTQF_POOL_MASK_EN 0x40000000 ++#define IXGBE_FTQF_QUEUE_ENABLE 0x80000000 + + /* Interrupt clear mask */ + #define IXGBE_IRQ_CLEAR_MASK 0xFFFFFFFF + + /* Interrupt Vector Allocation Registers */ + #define IXGBE_IVAR_REG_NUM 25 ++#define IXGBE_IVAR_REG_NUM_82599 64 + #define IXGBE_IVAR_TXRX_ENTRY 96 + #define IXGBE_IVAR_RX_ENTRY 64 + #define IXGBE_IVAR_RX_QUEUE(_i) (0 + (_i)) +@@ -671,6 +1302,32 @@ + + #define IXGBE_IVAR_ALLOC_VAL 0x80 /* Interrupt Allocation valid */ + ++/* ETYPE Queue Filter/Select Bit Masks */ ++#define IXGBE_MAX_ETQF_FILTERS 8 ++#define IXGBE_ETQF_FCOE 0x08000000 /* bit 27 */ ++#define IXGBE_ETQF_BCN 0x10000000 /* bit 28 */ ++#define IXGBE_ETQF_1588 0x40000000 /* bit 30 */ ++#define IXGBE_ETQF_FILTER_EN 0x80000000 /* bit 31 */ ++#define IXGBE_ETQF_POOL_ENABLE (1 << 26) /* bit 26 */ ++ ++#define IXGBE_ETQS_RX_QUEUE 0x007F0000 /* bits 22:16 */ ++#define IXGBE_ETQS_RX_QUEUE_SHIFT 16 ++#define IXGBE_ETQS_LLI 0x20000000 /* bit 29 */ ++#define IXGBE_ETQS_QUEUE_EN 0x80000000 /* bit 31 */ ++ ++/* ++ * ETQF filter list: one static filter per filter consumer. This is ++ * to avoid filter collisions later. Add new filters ++ * here!! ++ * ++ * Current filters: ++ * EAPOL 802.1x (0x888e): Filter 0 ++ * FCoE (0x8906): Filter 2 ++ * 1588 (0x88f7): Filter 3 ++ */ ++#define IXGBE_ETQF_FILTER_EAPOL 0 ++#define IXGBE_ETQF_FILTER_FCOE 2 ++#define IXGBE_ETQF_FILTER_1588 3 + /* VLAN Control Bit Masks */ + #define IXGBE_VLNCTRL_VET 0x0000FFFF /* bits 0-15 */ + #define IXGBE_VLNCTRL_CFI 0x10000000 /* bit 28 */ +@@ -678,21 +1335,30 @@ + #define IXGBE_VLNCTRL_VFE 0x40000000 /* bit 30 */ + #define IXGBE_VLNCTRL_VME 0x80000000 /* bit 31 */ + ++/* VLAN pool filtering masks */ ++#define IXGBE_VLVF_VIEN 0x80000000 /* filter is valid */ ++#define IXGBE_VLVF_ENTRIES 64 + + #define IXGBE_ETHERNET_IEEE_VLAN_TYPE 0x8100 /* 802.1q protocol */ + + /* STATUS Bit Masks */ +-#define IXGBE_STATUS_LAN_ID 0x0000000C /* LAN ID */ +-#define IXGBE_STATUS_GIO 0x00080000 /* GIO Master Enable Status */ ++#define IXGBE_STATUS_LAN_ID 0x0000000C /* LAN ID */ ++#define IXGBE_STATUS_LAN_ID_SHIFT 2 /* LAN ID Shift*/ ++#define IXGBE_STATUS_GIO 0x00080000 /* GIO Master Enable Status */ + + #define IXGBE_STATUS_LAN_ID_0 0x00000000 /* LAN ID 0 */ + #define IXGBE_STATUS_LAN_ID_1 0x00000004 /* LAN ID 1 */ + + /* ESDP Bit Masks */ +-#define IXGBE_ESDP_SDP4 0x00000001 /* SDP4 Data Value */ +-#define IXGBE_ESDP_SDP5 0x00000002 /* SDP5 Data Value */ ++#define IXGBE_ESDP_SDP0 0x00000001 /* SDP0 Data Value */ ++#define IXGBE_ESDP_SDP1 0x00000002 /* SDP1 Data Value */ ++#define IXGBE_ESDP_SDP2 0x00000004 /* SDP2 Data Value */ ++#define IXGBE_ESDP_SDP3 0x00000008 /* SDP3 Data Value */ ++#define IXGBE_ESDP_SDP4 0x00000010 /* SDP4 Data Value */ ++#define IXGBE_ESDP_SDP5 0x00000020 /* SDP5 Data Value */ ++#define IXGBE_ESDP_SDP6 0x00000040 /* SDP6 Data Value */ + #define IXGBE_ESDP_SDP4_DIR 0x00000004 /* SDP4 IO direction */ +-#define IXGBE_ESDP_SDP5_DIR 0x00000008 /* SDP5 IO direction */ ++#define IXGBE_ESDP_SDP5_DIR 0x00002000 /* SDP5 IO direction */ + + /* LEDCTL Bit Masks */ + #define IXGBE_LED_IVRT_BASE 0x00000040 +@@ -715,6 +1381,7 @@ + #define IXGBE_LED_OFF 0xF + + /* AUTOC Bit Masks */ ++#define IXGBE_AUTOC_KX4_KX_SUPP_MASK 0xC0000000 + #define IXGBE_AUTOC_KX4_SUPP 0x80000000 + #define IXGBE_AUTOC_KX_SUPP 0x40000000 + #define IXGBE_AUTOC_PAUSE 0x30000000 +@@ -723,9 +1390,17 @@ + #define IXGBE_AUTOC_AN_RX_LOOSE 0x01000000 + #define IXGBE_AUTOC_AN_RX_DRIFT 0x00800000 + #define IXGBE_AUTOC_AN_RX_ALIGN 0x007C0000 ++#define IXGBE_AUTOC_FECA 0x00040000 ++#define IXGBE_AUTOC_FECR 0x00020000 ++#define IXGBE_AUTOC_KR_SUPP 0x00010000 + #define IXGBE_AUTOC_AN_RESTART 0x00001000 + #define IXGBE_AUTOC_FLU 0x00000001 + #define IXGBE_AUTOC_LMS_SHIFT 13 ++#define IXGBE_AUTOC_LMS_10G_SERIAL (0x3 << IXGBE_AUTOC_LMS_SHIFT) ++#define IXGBE_AUTOC_LMS_KX4_KX_KR (0x4 << IXGBE_AUTOC_LMS_SHIFT) ++#define IXGBE_AUTOC_LMS_SGMII_1G_100M (0x5 << IXGBE_AUTOC_LMS_SHIFT) ++#define IXGBE_AUTOC_LMS_KX4_KX_KR_1G_AN (0x6 << IXGBE_AUTOC_LMS_SHIFT) ++#define IXGBE_AUTOC_LMS_KX4_KX_KR_SGMII (0x7 << IXGBE_AUTOC_LMS_SHIFT) + #define IXGBE_AUTOC_LMS_MASK (0x7 << IXGBE_AUTOC_LMS_SHIFT) + #define IXGBE_AUTOC_LMS_1G_LINK_NO_AN (0x0 << IXGBE_AUTOC_LMS_SHIFT) + #define IXGBE_AUTOC_LMS_10G_LINK_NO_AN (0x1 << IXGBE_AUTOC_LMS_SHIFT) +@@ -734,15 +1409,24 @@ + #define IXGBE_AUTOC_LMS_KX4_AN_1G_AN (0x6 << IXGBE_AUTOC_LMS_SHIFT) + #define IXGBE_AUTOC_LMS_ATTACH_TYPE (0x7 << IXGBE_AUTOC_10G_PMA_PMD_SHIFT) + +-#define IXGBE_AUTOC_1G_PMA_PMD 0x00000200 +-#define IXGBE_AUTOC_10G_PMA_PMD 0x00000180 +-#define IXGBE_AUTOC_10G_PMA_PMD_SHIFT 7 +-#define IXGBE_AUTOC_1G_PMA_PMD_SHIFT 9 ++#define IXGBE_AUTOC_1G_PMA_PMD_MASK 0x00000200 ++#define IXGBE_AUTOC_1G_PMA_PMD_SHIFT 9 ++#define IXGBE_AUTOC_10G_PMA_PMD_MASK 0x00000180 ++#define IXGBE_AUTOC_10G_PMA_PMD_SHIFT 7 + #define IXGBE_AUTOC_10G_XAUI (0x0 << IXGBE_AUTOC_10G_PMA_PMD_SHIFT) + #define IXGBE_AUTOC_10G_KX4 (0x1 << IXGBE_AUTOC_10G_PMA_PMD_SHIFT) + #define IXGBE_AUTOC_10G_CX4 (0x2 << IXGBE_AUTOC_10G_PMA_PMD_SHIFT) + #define IXGBE_AUTOC_1G_BX (0x0 << IXGBE_AUTOC_1G_PMA_PMD_SHIFT) + #define IXGBE_AUTOC_1G_KX (0x1 << IXGBE_AUTOC_1G_PMA_PMD_SHIFT) ++#define IXGBE_AUTOC_1G_SFI (0x0 << IXGBE_AUTOC_1G_PMA_PMD_SHIFT) ++#define IXGBE_AUTOC_1G_KX_BX (0x1 << IXGBE_AUTOC_1G_PMA_PMD_SHIFT) ++ ++#define IXGBE_AUTOC2_UPPER_MASK 0xFFFF0000 ++#define IXGBE_AUTOC2_10G_SERIAL_PMA_PMD_MASK 0x00030000 ++#define IXGBE_AUTOC2_10G_SERIAL_PMA_PMD_SHIFT 16 ++#define IXGBE_AUTOC2_10G_KR (0x0 << IXGBE_AUTOC2_10G_SERIAL_PMA_PMD_SHIFT) ++#define IXGBE_AUTOC2_10G_XFI (0x1 << IXGBE_AUTOC2_10G_SERIAL_PMA_PMD_SHIFT) ++#define IXGBE_AUTOC2_10G_SFI (0x2 << IXGBE_AUTOC2_10G_SERIAL_PMA_PMD_SHIFT) + + /* LINKS Bit Masks */ + #define IXGBE_LINKS_KX_AN_COMP 0x80000000 +@@ -752,6 +1436,7 @@ + #define IXGBE_LINKS_RX_MODE 0x06000000 + #define IXGBE_LINKS_TX_MODE 0x01800000 + #define IXGBE_LINKS_XGXS_EN 0x00400000 ++#define IXGBE_LINKS_SGMII_EN 0x02000000 + #define IXGBE_LINKS_PCS_1G_EN 0x00200000 + #define IXGBE_LINKS_1G_AN_EN 0x00100000 + #define IXGBE_LINKS_KX_AN_IDLE 0x00080000 +@@ -761,8 +1446,32 @@ + #define IXGBE_LINKS_TL_FAULT 0x00001000 + #define IXGBE_LINKS_SIGNAL 0x00000F00 + ++#define IXGBE_LINKS_SPEED_82599 0x30000000 ++#define IXGBE_LINKS_SPEED_10G_82599 0x30000000 ++#define IXGBE_LINKS_SPEED_1G_82599 0x20000000 ++#define IXGBE_LINKS_SPEED_100_82599 0x10000000 + #define IXGBE_LINK_UP_TIME 90 /* 9.0 Seconds */ + #define IXGBE_AUTO_NEG_TIME 45 /* 4.5 Seconds */ ++ ++/* PCS1GLSTA Bit Masks */ ++#define IXGBE_PCS1GLSTA_LINK_OK 1 ++#define IXGBE_PCS1GLSTA_SYNK_OK 0x10 ++#define IXGBE_PCS1GLSTA_AN_COMPLETE 0x10000 ++#define IXGBE_PCS1GLSTA_AN_PAGE_RX 0x20000 ++#define IXGBE_PCS1GLSTA_AN_TIMED_OUT 0x40000 ++#define IXGBE_PCS1GLSTA_AN_REMOTE_FAULT 0x80000 ++#define IXGBE_PCS1GLSTA_AN_ERROR_RWS 0x100000 ++ ++#define IXGBE_PCS1GANA_SYM_PAUSE 0x80 ++#define IXGBE_PCS1GANA_ASM_PAUSE 0x100 ++ ++/* PCS1GLCTL Bit Masks */ ++#define IXGBE_PCS1GLCTL_AN_1G_TIMEOUT_EN 0x00040000 /* PCS 1G autoneg to en */ ++#define IXGBE_PCS1GLCTL_FLV_LINK_UP 1 ++#define IXGBE_PCS1GLCTL_FORCE_LINK 0x20 ++#define IXGBE_PCS1GLCTL_LOW_LINK_LATCH 0x40 ++#define IXGBE_PCS1GLCTL_AN_ENABLE 0x10000 ++#define IXGBE_PCS1GLCTL_AN_RESTART 0x20000 + + /* SW Semaphore Register bitmasks */ + #define IXGBE_SWSM_SMBI 0x00000001 /* Driver Semaphore bit */ +@@ -815,6 +1524,14 @@ + #define IXGBE_FW_PTR 0x0F + #define IXGBE_PBANUM0_PTR 0x15 + #define IXGBE_PBANUM1_PTR 0x16 ++#define IXGBE_SAN_MAC_ADDR_PTR 0x28 ++#define IXGBE_DEVICE_CAPS 0x2C ++#define IXGBE_SERIAL_NUMBER_MAC_ADDR 0x11 ++#define IXGBE_PCIE_MSIX_82599_CAPS 0x72 ++#define IXGBE_PCIE_MSIX_82598_CAPS 0x62 ++ ++/* MSI-X capability fields masks */ ++#define IXGBE_PCIE_MSIX_TBL_SZ_MASK 0x7FF + + /* Legacy EEPROM word offsets */ + #define IXGBE_ISCSI_BOOT_CAPS 0x0033 +@@ -853,6 +1570,18 @@ + #define IXGBE_EERD_ATTEMPTS 100000 + #endif + ++#define IXGBE_PCIE_CTRL2 0x5 /* PCIe Control 2 Offset */ ++#define IXGBE_PCIE_CTRL2_DUMMY_ENABLE 0x8 /* Dummy Function Enable */ ++#define IXGBE_PCIE_CTRL2_LAN_DISABLE 0x2 /* LAN PCI Disable */ ++#define IXGBE_PCIE_CTRL2_DISABLE_SELECT 0x1 /* LAN Disable Select */ ++ ++#define IXGBE_SAN_MAC_ADDR_PORT0_OFFSET 0x0 ++#define IXGBE_SAN_MAC_ADDR_PORT1_OFFSET 0x3 ++#define IXGBE_DEVICE_CAPS_ALLOW_ANY_SFP 0x1 ++#define IXGBE_DEVICE_CAPS_FCOE_OFFLOADS 0x2 ++#define IXGBE_FW_PASSTHROUGH_PATCH_CONFIG_PTR 0x4 ++#define IXGBE_FW_PATCH_VERSION_4 0x7 ++ + /* PCI Bus Info */ + #define IXGBE_PCI_LINK_STATUS 0xB2 + #define IXGBE_PCI_LINK_WIDTH 0x3F0 +@@ -863,6 +1592,8 @@ + #define IXGBE_PCI_LINK_SPEED 0xF + #define IXGBE_PCI_LINK_SPEED_2500 0x1 + #define IXGBE_PCI_LINK_SPEED_5000 0x2 ++#define IXGBE_PCI_HEADER_TYPE_REGISTER 0x0E ++#define IXGBE_PCI_HEADER_TYPE_MULTIFUNC 0x80 + + /* Number of 100 microseconds we wait for PCI Express master disable */ + #define IXGBE_PCI_MASTER_DISABLE_TIMEOUT 800 +@@ -915,6 +1646,7 @@ + #define IXGBE_RXCTRL_RXEN 0x00000001 /* Enable Receiver */ + #define IXGBE_RXCTRL_DMBYPS 0x00000002 /* Descriptor Monitor Bypass */ + #define IXGBE_RXDCTL_ENABLE 0x02000000 /* Enable specific Rx Queue */ ++#define IXGBE_RXDCTL_VME 0x40000000 /* VLAN mode enable */ + + #define IXGBE_FCTRL_SBP 0x00000002 /* Store Bad Packet */ + #define IXGBE_FCTRL_MPE 0x00000100 /* Multicast Promiscuous Ena*/ +@@ -925,9 +1657,23 @@ + /* Receive Priority Flow Control Enable */ + #define IXGBE_FCTRL_RPFCE 0x00004000 + #define IXGBE_FCTRL_RFCE 0x00008000 /* Receive Flow Control Ena */ ++#define IXGBE_MFLCN_PMCF 0x00000001 /* Pass MAC Control Frames */ ++#define IXGBE_MFLCN_DPF 0x00000002 /* Discard Pause Frame */ ++#define IXGBE_MFLCN_RPFCE 0x00000004 /* Receive Priority FC Enable */ ++#define IXGBE_MFLCN_RFCE 0x00000008 /* Receive FC Enable */ + + /* Multiple Receive Queue Control */ + #define IXGBE_MRQC_RSSEN 0x00000001 /* RSS Enable */ ++#define IXGBE_MRQC_MRQE_MASK 0xF /* Bits 3:0 */ ++#define IXGBE_MRQC_RT8TCEN 0x00000002 /* 8 TC no RSS */ ++#define IXGBE_MRQC_RT4TCEN 0x00000003 /* 4 TC no RSS */ ++#define IXGBE_MRQC_RTRSS8TCEN 0x00000004 /* 8 TC w/ RSS */ ++#define IXGBE_MRQC_RTRSS4TCEN 0x00000005 /* 4 TC w/ RSS */ ++#define IXGBE_MRQC_VMDQEN 0x00000008 /* VMDq2 64 pools no RSS */ ++#define IXGBE_MRQC_VMDQRSS32EN 0x0000000A /* VMDq2 32 pools w/ RSS */ ++#define IXGBE_MRQC_VMDQRSS64EN 0x0000000B /* VMDq2 64 pools w/ RSS */ ++#define IXGBE_MRQC_VMDQRT8TCEN 0x0000000C /* VMDq2/RT 16 pool 8 TC */ ++#define IXGBE_MRQC_VMDQRT4TCEN 0x0000000D /* VMDq2/RT 32 pool 4 TC */ + #define IXGBE_MRQC_RSS_FIELD_MASK 0xFFFF0000 + #define IXGBE_MRQC_RSS_FIELD_IPV4_TCP 0x00010000 + #define IXGBE_MRQC_RSS_FIELD_IPV4 0x00020000 +@@ -938,6 +1684,12 @@ + #define IXGBE_MRQC_RSS_FIELD_IPV4_UDP 0x00400000 + #define IXGBE_MRQC_RSS_FIELD_IPV6_UDP 0x00800000 + #define IXGBE_MRQC_RSS_FIELD_IPV6_EX_UDP 0x01000000 ++#define IXGBE_MRQC_L3L4TXSWEN 0x00008000 ++ ++/* Queue Drop Enable */ ++#define IXGBE_QDE_ENABLE 0x00000001 ++#define IXGBE_QDE_IDX_MASK 0x00007F00 ++#define IXGBE_QDE_IDX_SHIFT 8 + + #define IXGBE_TXD_POPTS_IXSM 0x01 /* Insert IP checksum */ + #define IXGBE_TXD_POPTS_TXSM 0x02 /* Insert TCP/UDP checksum */ +@@ -949,10 +1701,26 @@ + #define IXGBE_TXD_CMD_VLE 0x40000000 /* Add VLAN tag */ + #define IXGBE_TXD_STAT_DD 0x00000001 /* Descriptor Done */ + ++#define IXGBE_RXDADV_IPSEC_STATUS_SECP 0x00020000 ++#define IXGBE_RXDADV_IPSEC_ERROR_INVALID_PROTOCOL 0x08000000 ++#define IXGBE_RXDADV_IPSEC_ERROR_INVALID_LENGTH 0x10000000 ++#define IXGBE_RXDADV_IPSEC_ERROR_AUTH_FAILED 0x18000000 ++#define IXGBE_RXDADV_IPSEC_ERROR_BIT_MASK 0x18000000 ++/* Multiple Transmit Queue Command Register */ ++#define IXGBE_MTQC_RT_ENA 0x1 /* DCB Enable */ ++#define IXGBE_MTQC_VT_ENA 0x2 /* VMDQ2 Enable */ ++#define IXGBE_MTQC_64Q_1PB 0x0 /* 64 queues 1 pack buffer */ ++#define IXGBE_MTQC_32VF 0x8 /* 4 TX Queues per pool w/32VF's */ ++#define IXGBE_MTQC_64VF 0x4 /* 2 TX Queues per pool w/64VF's */ ++#define IXGBE_MTQC_8TC_8TQ 0xC /* 8 TC if RT_ENA or 8 TQ if VT_ENA */ ++ + /* Receive Descriptor bit definitions */ + #define IXGBE_RXD_STAT_DD 0x01 /* Descriptor Done */ + #define IXGBE_RXD_STAT_EOP 0x02 /* End of Packet */ ++#define IXGBE_RXD_STAT_FLM 0x04 /* FDir Match */ + #define IXGBE_RXD_STAT_VP 0x08 /* IEEE VLAN Packet */ ++#define IXGBE_RXDADV_NEXTP_MASK 0x000FFFF0 /* Next Descriptor Index */ ++#define IXGBE_RXDADV_NEXTP_SHIFT 0x00000004 + #define IXGBE_RXD_STAT_UDPCS 0x10 /* UDP xsum calculated */ + #define IXGBE_RXD_STAT_L4CS 0x20 /* L4 xsum calculated */ + #define IXGBE_RXD_STAT_IPCS 0x40 /* IP xsum calculated */ +@@ -961,6 +1729,10 @@ + #define IXGBE_RXD_STAT_VEXT 0x200 /* 1st VLAN found */ + #define IXGBE_RXD_STAT_UDPV 0x400 /* Valid UDP checksum */ + #define IXGBE_RXD_STAT_DYNINT 0x800 /* Pkt caused INT via DYNINT */ ++#define IXGBE_RXD_STAT_LLINT 0x800 /* Pkt caused Low Latency Interrupt */ ++#define IXGBE_RXD_STAT_TS 0x10000 /* Time Stamp */ ++#define IXGBE_RXD_STAT_SECP 0x20000 /* Security Processing */ ++#define IXGBE_RXD_STAT_LB 0x40000 /* Loopback Status */ + #define IXGBE_RXD_STAT_ACK 0x8000 /* ACK Packet indication */ + #define IXGBE_RXD_ERR_CE 0x01 /* CRC Error */ + #define IXGBE_RXD_ERR_LE 0x02 /* Length Error */ +@@ -969,6 +1741,13 @@ + #define IXGBE_RXD_ERR_USE 0x20 /* Undersize Error */ + #define IXGBE_RXD_ERR_TCPE 0x40 /* TCP/UDP Checksum Error */ + #define IXGBE_RXD_ERR_IPE 0x80 /* IP Checksum Error */ ++#define IXGBE_RXDADV_ERR_MASK 0xfff00000 /* RDESC.ERRORS mask */ ++#define IXGBE_RXDADV_ERR_SHIFT 20 /* RDESC.ERRORS shift */ ++#define IXGBE_RXDADV_ERR_FCEOFE 0x80000000 /* FCoEFe/IPE */ ++#define IXGBE_RXDADV_ERR_FCERR 0x00700000 /* FCERR/FDIRERR */ ++#define IXGBE_RXDADV_ERR_FDIR_LEN 0x00100000 /* FDIR Length error */ ++#define IXGBE_RXDADV_ERR_FDIR_DROP 0x00200000 /* FDIR Drop error */ ++#define IXGBE_RXDADV_ERR_FDIR_COLL 0x00400000 /* FDIR Collision error */ + #define IXGBE_RXDADV_ERR_HBO 0x00800000 /*Header Buffer Overflow */ + #define IXGBE_RXDADV_ERR_CE 0x01000000 /* CRC Error */ + #define IXGBE_RXDADV_ERR_LE 0x02000000 /* Length Error */ +@@ -983,9 +1762,30 @@ + #define IXGBE_RXD_CFI_MASK 0x1000 /* CFI is bit 12 */ + #define IXGBE_RXD_CFI_SHIFT 12 + ++#define IXGBE_RXDADV_STAT_DD IXGBE_RXD_STAT_DD /* Done */ ++#define IXGBE_RXDADV_STAT_EOP IXGBE_RXD_STAT_EOP /* End of Packet */ ++#define IXGBE_RXDADV_STAT_FLM IXGBE_RXD_STAT_FLM /* FDir Match */ ++#define IXGBE_RXDADV_STAT_VP IXGBE_RXD_STAT_VP /* IEEE VLAN Pkt */ ++#define IXGBE_RXDADV_STAT_MASK 0x000fffff /* Stat/NEXTP: bit 0-19 */ ++#define IXGBE_RXDADV_STAT_FCEOFS 0x00000040 /* FCoE EOF/SOF Stat */ ++#define IXGBE_RXDADV_STAT_FCSTAT 0x00000030 /* FCoE Pkt Stat */ ++#define IXGBE_RXDADV_STAT_FCSTAT_NOMTCH 0x00000000 /* 00: No Ctxt Match */ ++#define IXGBE_RXDADV_STAT_FCSTAT_NODDP 0x00000010 /* 01: Ctxt w/o DDP */ ++#define IXGBE_RXDADV_STAT_FCSTAT_FCPRSP 0x00000020 /* 10: Recv. FCP_RSP */ ++#define IXGBE_RXDADV_STAT_FCSTAT_DDP 0x00000030 /* 11: Ctxt w/ DDP */ ++ ++/* PSRTYPE bit definitions */ ++#define IXGBE_PSRTYPE_TCPHDR 0x00000010 ++#define IXGBE_PSRTYPE_UDPHDR 0x00000020 ++#define IXGBE_PSRTYPE_IPV4HDR 0x00000100 ++#define IXGBE_PSRTYPE_IPV6HDR 0x00000200 ++#define IXGBE_PSRTYPE_L2HDR 0x00001000 + + /* SRRCTL bit definitions */ + #define IXGBE_SRRCTL_BSIZEPKT_SHIFT 10 /* so many KBs */ ++#define IXGBE_SRRCTL_RDMTS_SHIFT 22 ++#define IXGBE_SRRCTL_RDMTS_MASK 0x01C00000 ++#define IXGBE_SRRCTL_DROP_EN 0x10000000 + #define IXGBE_SRRCTL_BSIZEPKT_MASK 0x0000007F + #define IXGBE_SRRCTL_BSIZEHDR_MASK 0x00003F00 + #define IXGBE_SRRCTL_DESCTYPE_LEGACY 0x00000000 +@@ -1000,7 +1800,10 @@ + + #define IXGBE_RXDADV_RSSTYPE_MASK 0x0000000F + #define IXGBE_RXDADV_PKTTYPE_MASK 0x0000FFF0 ++#define IXGBE_RXDADV_PKTTYPE_MASK_EX 0x0001FFF0 + #define IXGBE_RXDADV_HDRBUFLEN_MASK 0x00007FE0 ++#define IXGBE_RXDADV_RSCCNT_MASK 0x001E0000 ++#define IXGBE_RXDADV_RSCCNT_SHIFT 17 + #define IXGBE_RXDADV_HDRBUFLEN_SHIFT 5 + #define IXGBE_RXDADV_SPLITHEADER_EN 0x00001000 + #define IXGBE_RXDADV_SPH 0x8000 +@@ -1027,6 +1830,20 @@ + #define IXGBE_RXDADV_PKTTYPE_UDP 0x00000200 /* UDP hdr present */ + #define IXGBE_RXDADV_PKTTYPE_SCTP 0x00000400 /* SCTP hdr present */ + #define IXGBE_RXDADV_PKTTYPE_NFS 0x00000800 /* NFS hdr present */ ++#define IXGBE_RXDADV_PKTTYPE_IPSEC_ESP 0x00001000 /* IPSec ESP */ ++#define IXGBE_RXDADV_PKTTYPE_IPSEC_AH 0x00002000 /* IPSec AH */ ++#define IXGBE_RXDADV_PKTTYPE_LINKSEC 0x00004000 /* LinkSec Encap */ ++#define IXGBE_RXDADV_PKTTYPE_ETQF 0x00008000 /* PKTTYPE is ETQF index */ ++#define IXGBE_RXDADV_PKTTYPE_ETQF_MASK 0x00000070 /* ETQF has 8 indices */ ++#define IXGBE_RXDADV_PKTTYPE_ETQF_SHIFT 4 /* Right-shift 4 bits */ ++ ++/* Security Processing bit Indication */ ++#define IXGBE_RXDADV_LNKSEC_STATUS_SECP 0x00020000 ++#define IXGBE_RXDADV_LNKSEC_ERROR_NO_SA_MATCH 0x08000000 ++#define IXGBE_RXDADV_LNKSEC_ERROR_REPLAY_ERROR 0x10000000 ++#define IXGBE_RXDADV_LNKSEC_ERROR_BIT_MASK 0x18000000 ++#define IXGBE_RXDADV_LNKSEC_ERROR_BAD_SIG 0x18000000 ++ + /* Masks to determine if packets should be dropped due to frame errors */ + #define IXGBE_RXD_ERR_FRAME_ERR_MASK ( \ + IXGBE_RXD_ERR_CE | \ +@@ -1056,6 +1873,105 @@ + #define IXGBE_RX_DESC_SPECIAL_PRI_SHIFT 0x000D /* Priority in upper 3 of 16 */ + #define IXGBE_TX_DESC_SPECIAL_PRI_SHIFT IXGBE_RX_DESC_SPECIAL_PRI_SHIFT + ++/* SR-IOV specific macros */ ++#define IXGBE_MBVFICR_INDEX(vf_number) (vf_number >> 4) ++#define IXGBE_MBVFICR(_i) (0x00710 + (_i * 4)) ++#define IXGBE_VFLRE(_i) (((_i & 1) ? 0x001C0 : 0x00600)) ++#define IXGBE_VFLREC(_i) (0x00700 + (_i * 4)) ++ ++/* Little Endian defines */ ++#ifndef __le16 ++#define __le16 u16 ++#endif ++#ifndef __le32 ++#define __le32 u32 ++#endif ++#ifndef __le64 ++#define __le64 u64 ++ ++#endif ++#ifndef __be16 ++/* Big Endian defines */ ++#define __be16 u16 ++#define __be32 u32 ++#define __be64 u64 ++ ++#endif ++enum ixgbe_fdir_pballoc_type { ++ IXGBE_FDIR_PBALLOC_64K = 0, ++ IXGBE_FDIR_PBALLOC_128K, ++ IXGBE_FDIR_PBALLOC_256K, ++}; ++#define IXGBE_FDIR_PBALLOC_SIZE_SHIFT 16 ++ ++/* Flow Director register values */ ++#define IXGBE_FDIRCTRL_PBALLOC_64K 0x00000001 ++#define IXGBE_FDIRCTRL_PBALLOC_128K 0x00000002 ++#define IXGBE_FDIRCTRL_PBALLOC_256K 0x00000003 ++#define IXGBE_FDIRCTRL_INIT_DONE 0x00000008 ++#define IXGBE_FDIRCTRL_PERFECT_MATCH 0x00000010 ++#define IXGBE_FDIRCTRL_REPORT_STATUS 0x00000020 ++#define IXGBE_FDIRCTRL_REPORT_STATUS_ALWAYS 0x00000080 ++#define IXGBE_FDIRCTRL_DROP_Q_SHIFT 8 ++#define IXGBE_FDIRCTRL_FLEX_SHIFT 16 ++#define IXGBE_FDIRCTRL_SEARCHLIM 0x00800000 ++#define IXGBE_FDIRCTRL_MAX_LENGTH_SHIFT 24 ++#define IXGBE_FDIRCTRL_FULL_THRESH_MASK 0xF0000000 ++#define IXGBE_FDIRCTRL_FULL_THRESH_SHIFT 28 ++ ++#define IXGBE_FDIRTCPM_DPORTM_SHIFT 16 ++#define IXGBE_FDIRUDPM_DPORTM_SHIFT 16 ++#define IXGBE_FDIRIP6M_DIPM_SHIFT 16 ++#define IXGBE_FDIRM_VLANID 0x00000001 ++#define IXGBE_FDIRM_VLANP 0x00000002 ++#define IXGBE_FDIRM_POOL 0x00000004 ++#define IXGBE_FDIRM_L3P 0x00000008 ++#define IXGBE_FDIRM_L4P 0x00000010 ++#define IXGBE_FDIRM_FLEX 0x00000020 ++#define IXGBE_FDIRM_DIPv6 0x00000040 ++ ++#define IXGBE_FDIRFREE_FREE_MASK 0xFFFF ++#define IXGBE_FDIRFREE_FREE_SHIFT 0 ++#define IXGBE_FDIRFREE_COLL_MASK 0x7FFF0000 ++#define IXGBE_FDIRFREE_COLL_SHIFT 16 ++#define IXGBE_FDIRLEN_MAXLEN_MASK 0x3F ++#define IXGBE_FDIRLEN_MAXLEN_SHIFT 0 ++#define IXGBE_FDIRLEN_MAXHASH_MASK 0x7FFF0000 ++#define IXGBE_FDIRLEN_MAXHASH_SHIFT 16 ++#define IXGBE_FDIRUSTAT_ADD_MASK 0xFFFF ++#define IXGBE_FDIRUSTAT_ADD_SHIFT 0 ++#define IXGBE_FDIRUSTAT_REMOVE_MASK 0xFFFF0000 ++#define IXGBE_FDIRUSTAT_REMOVE_SHIFT 16 ++#define IXGBE_FDIRFSTAT_FADD_MASK 0x00FF ++#define IXGBE_FDIRFSTAT_FADD_SHIFT 0 ++#define IXGBE_FDIRFSTAT_FREMOVE_MASK 0xFF00 ++#define IXGBE_FDIRFSTAT_FREMOVE_SHIFT 8 ++#define IXGBE_FDIRPORT_DESTINATION_SHIFT 16 ++#define IXGBE_FDIRVLAN_FLEX_SHIFT 16 ++#define IXGBE_FDIRHASH_BUCKET_VALID_SHIFT 15 ++#define IXGBE_FDIRHASH_SIG_SW_INDEX_SHIFT 16 ++ ++#define IXGBE_FDIRCMD_CMD_MASK 0x00000003 ++#define IXGBE_FDIRCMD_CMD_ADD_FLOW 0x00000001 ++#define IXGBE_FDIRCMD_CMD_REMOVE_FLOW 0x00000002 ++#define IXGBE_FDIRCMD_CMD_QUERY_REM_FILT 0x00000003 ++#define IXGBE_FDIRCMD_CMD_QUERY_REM_HASH 0x00000007 ++#define IXGBE_FDIRCMD_FILTER_UPDATE 0x00000008 ++#define IXGBE_FDIRCMD_IPv6DMATCH 0x00000010 ++#define IXGBE_FDIRCMD_L4TYPE_UDP 0x00000020 ++#define IXGBE_FDIRCMD_L4TYPE_TCP 0x00000040 ++#define IXGBE_FDIRCMD_L4TYPE_SCTP 0x00000060 ++#define IXGBE_FDIRCMD_IPV6 0x00000080 ++#define IXGBE_FDIRCMD_CLEARHT 0x00000100 ++#define IXGBE_FDIRCMD_DROP 0x00000200 ++#define IXGBE_FDIRCMD_INT 0x00000400 ++#define IXGBE_FDIRCMD_LAST 0x00000800 ++#define IXGBE_FDIRCMD_COLLISION 0x00001000 ++#define IXGBE_FDIRCMD_QUEUE_EN 0x00008000 ++#define IXGBE_FDIRCMD_RX_QUEUE_SHIFT 16 ++#define IXGBE_FDIRCMD_VT_POOL_SHIFT 24 ++#define IXGBE_FDIR_INIT_DONE_POLL 10 ++#define IXGBE_FDIRCMD_CMD_POLL 10 + + /* Transmit Descriptor - Legacy */ + struct ixgbe_legacy_tx_desc { +@@ -1143,6 +2059,9 @@ + + /* Adv Transmit Descriptor Config Masks */ + #define IXGBE_ADVTXD_DTALEN_MASK 0x0000FFFF /* Data buf length(bytes) */ ++#define IXGBE_ADVTXD_MAC_LINKSEC 0x00040000 /* Insert LinkSec */ ++#define IXGBE_ADVTXD_IPSEC_SA_INDEX_MASK 0x000003FF /* IPSec SA index */ ++#define IXGBE_ADVTXD_IPSEC_ESP_LEN_MASK 0x000001FF /* IPSec ESP length */ + #define IXGBE_ADVTXD_DTYP_MASK 0x00F00000 /* DTYP mask */ + #define IXGBE_ADVTXD_DTYP_CTXT 0x00200000 /* Advanced Context Desc */ + #define IXGBE_ADVTXD_DTYP_DATA 0x00300000 /* Advanced Data Descriptor */ +@@ -1177,6 +2096,19 @@ + #define IXGBE_ADVTXD_TUCMD_L4T_TCP 0x00000800 /* L4 Packet TYPE of TCP */ + #define IXGBE_ADVTXD_TUCMD_L4T_SCTP 0x00001000 /* L4 Packet TYPE of SCTP */ + #define IXGBE_ADVTXD_TUCMD_MKRREQ 0x00002000 /*Req requires Markers and CRC*/ ++#define IXGBE_ADVTXD_POPTS_IPSEC 0x00000400 /* IPSec offload request */ ++#define IXGBE_ADVTXD_TUCMD_IPSEC_TYPE_ESP 0x00002000 /* IPSec Type ESP */ ++#define IXGBE_ADVTXD_TUCMD_IPSEC_ENCRYPT_EN 0x00004000/* ESP Encrypt Enable */ ++#define IXGBE_ADVTXT_TUCMD_FCOE 0x00008000 /* FCoE Frame Type */ ++#define IXGBE_ADVTXD_FCOEF_EOF_MASK (0x3 << 10) /* FC EOF index */ ++#define IXGBE_ADVTXD_FCOEF_SOF ((1 << 2) << 10) /* FC SOF index */ ++#define IXGBE_ADVTXD_FCOEF_PARINC ((1 << 3) << 10) /* Rel_Off in F_CTL */ ++#define IXGBE_ADVTXD_FCOEF_ORIE ((1 << 4) << 10) /* Orientation: End */ ++#define IXGBE_ADVTXD_FCOEF_ORIS ((1 << 5) << 10) /* Orientation: Start */ ++#define IXGBE_ADVTXD_FCOEF_EOF_N (0x0 << 10) /* 00: EOFn */ ++#define IXGBE_ADVTXD_FCOEF_EOF_T (0x1 << 10) /* 01: EOFt */ ++#define IXGBE_ADVTXD_FCOEF_EOF_NI (0x2 << 10) /* 10: EOFni */ ++#define IXGBE_ADVTXD_FCOEF_EOF_A (0x3 << 10) /* 11: EOFa */ + #define IXGBE_ADVTXD_L4LEN_SHIFT 8 /* Adv ctxt L4LEN shift */ + #define IXGBE_ADVTXD_MSS_SHIFT 16 /* Adv ctxt MSS shift */ + +@@ -1190,13 +2122,17 @@ + #define IXGBE_LINK_SPEED_10GB_FULL 0x0080 + #define IXGBE_LINK_SPEED_82598_AUTONEG (IXGBE_LINK_SPEED_1GB_FULL | \ + IXGBE_LINK_SPEED_10GB_FULL) ++#define IXGBE_LINK_SPEED_82599_AUTONEG (IXGBE_LINK_SPEED_100_FULL | \ ++ IXGBE_LINK_SPEED_1GB_FULL | \ ++ IXGBE_LINK_SPEED_10GB_FULL) ++ + + /* Physical layer type */ + typedef u32 ixgbe_physical_layer; + #define IXGBE_PHYSICAL_LAYER_UNKNOWN 0 + #define IXGBE_PHYSICAL_LAYER_10GBASE_T 0x0001 + #define IXGBE_PHYSICAL_LAYER_1000BASE_T 0x0002 +-#define IXGBE_PHYSICAL_LAYER_100BASE_T 0x0004 ++#define IXGBE_PHYSICAL_LAYER_100BASE_TX 0x0004 + #define IXGBE_PHYSICAL_LAYER_SFP_PLUS_CU 0x0008 + #define IXGBE_PHYSICAL_LAYER_10GBASE_LR 0x0010 + #define IXGBE_PHYSICAL_LAYER_10GBASE_LRM 0x0020 +@@ -1205,7 +2141,47 @@ + #define IXGBE_PHYSICAL_LAYER_10GBASE_CX4 0x0100 + #define IXGBE_PHYSICAL_LAYER_1000BASE_KX 0x0200 + #define IXGBE_PHYSICAL_LAYER_1000BASE_BX 0x0400 ++#define IXGBE_PHYSICAL_LAYER_10GBASE_KR 0x0800 ++#define IXGBE_PHYSICAL_LAYER_10GBASE_XAUI 0x1000 + ++/* Software ATR hash keys */ ++#define IXGBE_ATR_BUCKET_HASH_KEY 0xE214AD3D ++#define IXGBE_ATR_SIGNATURE_HASH_KEY 0x14364D17 ++ ++/* Software ATR input stream offsets and masks */ ++#define IXGBE_ATR_VLAN_OFFSET 0 ++#define IXGBE_ATR_SRC_IPV6_OFFSET 2 ++#define IXGBE_ATR_SRC_IPV4_OFFSET 14 ++#define IXGBE_ATR_DST_IPV6_OFFSET 18 ++#define IXGBE_ATR_DST_IPV4_OFFSET 30 ++#define IXGBE_ATR_SRC_PORT_OFFSET 34 ++#define IXGBE_ATR_DST_PORT_OFFSET 36 ++#define IXGBE_ATR_FLEX_BYTE_OFFSET 38 ++#define IXGBE_ATR_VM_POOL_OFFSET 40 ++#define IXGBE_ATR_L4TYPE_OFFSET 41 ++ ++#define IXGBE_ATR_L4TYPE_MASK 0x3 ++#define IXGBE_ATR_L4TYPE_IPV6_MASK 0x4 ++#define IXGBE_ATR_L4TYPE_UDP 0x1 ++#define IXGBE_ATR_L4TYPE_TCP 0x2 ++#define IXGBE_ATR_L4TYPE_SCTP 0x3 ++#define IXGBE_ATR_HASH_MASK 0x7fff ++ ++/* Flow Director ATR input struct. */ ++struct ixgbe_atr_input { ++ /* Byte layout in order, all values with MSB first: ++ * ++ * vlan_id - 2 bytes ++ * src_ip - 16 bytes ++ * dst_ip - 16 bytes ++ * src_port - 2 bytes ++ * dst_port - 2 bytes ++ * flex_bytes - 2 bytes ++ * vm_pool - 1 byte ++ * l4type - 1 byte ++ */ ++ u8 byte_stream[42]; ++}; + + enum ixgbe_eeprom_type { + ixgbe_eeprom_uninitialized = 0, +@@ -1216,12 +2192,16 @@ + enum ixgbe_mac_type { + ixgbe_mac_unknown = 0, + ixgbe_mac_82598EB, ++ ixgbe_mac_82599EB, + ixgbe_num_macs + }; + + enum ixgbe_phy_type { + ixgbe_phy_unknown = 0, ++ ixgbe_phy_none, + ixgbe_phy_tn, ++ ixgbe_phy_aq, ++ ixgbe_phy_cu_unknown, + ixgbe_phy_qt, + ixgbe_phy_xaui, + ixgbe_phy_nl, +@@ -1230,6 +2210,8 @@ + ixgbe_phy_sfp_avago, + ixgbe_phy_sfp_ftl, + ixgbe_phy_sfp_unknown, ++ ixgbe_phy_sfp_intel, ++ ixgbe_phy_sfp_unsupported, /*Enforce bit set with unsupported module*/ + ixgbe_phy_generic + }; + +@@ -1241,11 +2223,19 @@ + * 0 SFP_DA_CU + * 1 SFP_SR + * 2 SFP_LR ++ * 3 SFP_DA_CU_CORE0 - 82599-specific ++ * 4 SFP_DA_CU_CORE1 - 82599-specific ++ * 5 SFP_SR/LR_CORE0 - 82599-specific ++ * 6 SFP_SR/LR_CORE1 - 82599-specific + */ + enum ixgbe_sfp_type { + ixgbe_sfp_type_da_cu = 0, + ixgbe_sfp_type_sr = 1, + ixgbe_sfp_type_lr = 2, ++ ixgbe_sfp_type_da_cu_core0 = 3, ++ ixgbe_sfp_type_da_cu_core1 = 4, ++ ixgbe_sfp_type_srlr_core0 = 5, ++ ixgbe_sfp_type_srlr_core1 = 6, + ixgbe_sfp_type_not_present = 0xFFFE, + ixgbe_sfp_type_unknown = 0xFFFF + }; +@@ -1259,21 +2249,67 @@ + }; + + /* Flow Control Settings */ +-enum ixgbe_fc_type { ++enum ixgbe_fc_mode { + ixgbe_fc_none = 0, + ixgbe_fc_rx_pause, + ixgbe_fc_tx_pause, + ixgbe_fc_full, ++#ifdef CONFIG_DCB ++ ixgbe_fc_pfc, ++#endif + ixgbe_fc_default ++}; ++ ++/* PCI bus types */ ++enum ixgbe_bus_type { ++ ixgbe_bus_type_unknown = 0, ++ ixgbe_bus_type_pci, ++ ixgbe_bus_type_pcix, ++ ixgbe_bus_type_pci_express, ++ ixgbe_bus_type_reserved ++}; ++ ++/* PCI bus speeds */ ++enum ixgbe_bus_speed { ++ ixgbe_bus_speed_unknown = 0, ++ ixgbe_bus_speed_33, ++ ixgbe_bus_speed_66, ++ ixgbe_bus_speed_100, ++ ixgbe_bus_speed_120, ++ ixgbe_bus_speed_133, ++ ixgbe_bus_speed_2500, ++ ixgbe_bus_speed_5000, ++ ixgbe_bus_speed_reserved ++}; ++ ++/* PCI bus widths */ ++enum ixgbe_bus_width { ++ ixgbe_bus_width_unknown = 0, ++ ixgbe_bus_width_pcie_x1, ++ ixgbe_bus_width_pcie_x2, ++ ixgbe_bus_width_pcie_x4 = 4, ++ ixgbe_bus_width_pcie_x8 = 8, ++ ixgbe_bus_width_32, ++ ixgbe_bus_width_64, ++ ixgbe_bus_width_reserved + }; + + struct ixgbe_addr_filter_info { + u32 num_mc_addrs; + u32 rar_used_count; +- u32 mc_addr_in_rar_count; + u32 mta_in_use; + u32 overflow_promisc; + bool user_set_promisc; ++}; ++ ++/* Bus parameters */ ++struct ixgbe_bus_info { ++ enum ixgbe_bus_speed speed; ++ enum ixgbe_bus_width width; ++ enum ixgbe_bus_type type; ++ ++ u16 func; ++ u16 lan_id; + }; + + /* Flow control parameters */ +@@ -1283,8 +2319,10 @@ + u16 pause_time; /* Flow Control Pause timer */ + bool send_xon; /* Flow control send XON */ + bool strict_ieee; /* Strict IEEE mode */ +- enum ixgbe_fc_type type; /* Type of flow control */ +- enum ixgbe_fc_type original_type; ++ bool disable_fc_autoneg; /* Do not autonegotiate FC */ ++ bool fc_was_autonegged; /* Is current_mode the result of autonegging? */ ++ enum ixgbe_fc_mode current_mode; /* FC mode in effect */ ++ enum ixgbe_fc_mode requested_mode; /* FC mode requested by caller */ + }; + + /* Statistics counters collected by the MAC */ +@@ -1344,6 +2382,21 @@ + u64 qptc[16]; + u64 qbrc[16]; + u64 qbtc[16]; ++ u64 qprdc[16]; ++ u64 pxon2offc[8]; ++ u64 fdirustat_add; ++ u64 fdirustat_remove; ++ u64 fdirfstat_fadd; ++ u64 fdirfstat_fremove; ++ u64 fdirmatch; ++ u64 fdirmiss; ++ u64 fccrc; ++ u64 fclast; ++ u64 fcoerpdc; ++ u64 fcoeprc; ++ u64 fcoeptc; ++ u64 fcoedwrc; ++ u64 fcoedwtc; + }; + + /* forward declaration */ +@@ -1368,12 +2421,20 @@ + s32 (*start_hw)(struct ixgbe_hw *); + s32 (*clear_hw_cntrs)(struct ixgbe_hw *); + enum ixgbe_media_type (*get_media_type)(struct ixgbe_hw *); +- s32 (*get_supported_physical_layer)(struct ixgbe_hw *); ++ u32 (*get_supported_physical_layer)(struct ixgbe_hw *); + s32 (*get_mac_addr)(struct ixgbe_hw *, u8 *); ++ s32 (*get_san_mac_addr)(struct ixgbe_hw *, u8 *); ++ s32 (*set_san_mac_addr)(struct ixgbe_hw *, u8 *); ++ s32 (*get_device_caps)(struct ixgbe_hw *, u16 *); + s32 (*stop_adapter)(struct ixgbe_hw *); + s32 (*get_bus_info)(struct ixgbe_hw *); ++ void (*set_lan_id)(struct ixgbe_hw *); + s32 (*read_analog_reg8)(struct ixgbe_hw*, u32, u8*); + s32 (*write_analog_reg8)(struct ixgbe_hw*, u32, u8); ++ s32 (*setup_sfp)(struct ixgbe_hw *); ++ s32 (*enable_rx_dma)(struct ixgbe_hw *, u32); ++ s32 (*acquire_swfw_sync)(struct ixgbe_hw *, u16); ++ void (*release_swfw_sync)(struct ixgbe_hw *, u16); + + /* Link */ + s32 (*setup_link)(struct ixgbe_hw *); +@@ -1392,6 +2453,7 @@ + /* RAR, Multicast, VLAN */ + s32 (*set_rar)(struct ixgbe_hw *, u32, u8 *, u32, u32); + s32 (*clear_rar)(struct ixgbe_hw *, u32); ++ s32 (*insert_mac_addr)(struct ixgbe_hw *, u8 *, u32); + s32 (*set_vmdq)(struct ixgbe_hw *, u32, u32); + s32 (*clear_vmdq)(struct ixgbe_hw *, u32, u32); + s32 (*init_rx_addrs)(struct ixgbe_hw *); +@@ -1406,12 +2468,13 @@ + s32 (*init_uta_tables)(struct ixgbe_hw *); + + /* Flow Control */ +- s32 (*setup_fc)(struct ixgbe_hw *, s32); ++ s32 (*fc_enable)(struct ixgbe_hw *, s32); + }; + + struct ixgbe_phy_operations { + s32 (*identify)(struct ixgbe_hw *); + s32 (*identify_sfp)(struct ixgbe_hw *); ++ s32 (*init)(struct ixgbe_hw *); + s32 (*reset)(struct ixgbe_hw *); + s32 (*read_reg)(struct ixgbe_hw *, u32, u32, u16 *); + s32 (*write_reg)(struct ixgbe_hw *, u32, u32, u16); +@@ -1424,12 +2487,13 @@ + s32 (*write_i2c_byte)(struct ixgbe_hw *, u8, u8, u8); + s32 (*read_i2c_eeprom)(struct ixgbe_hw *, u8 , u8 *); + s32 (*write_i2c_eeprom)(struct ixgbe_hw *, u8, u8); ++ void (*i2c_bus_clear)(struct ixgbe_hw *); + }; + + struct ixgbe_eeprom_info { + struct ixgbe_eeprom_operations ops; + enum ixgbe_eeprom_type type; +- u32 semaphore_delay; ++ u32 semaphore_delay; + u16 word_size; + u16 address_bits; + }; +@@ -1439,17 +2503,22 @@ + enum ixgbe_mac_type type; + u8 addr[IXGBE_ETH_LENGTH_OF_ADDRESS]; + u8 perm_addr[IXGBE_ETH_LENGTH_OF_ADDRESS]; ++ u8 san_addr[IXGBE_ETH_LENGTH_OF_ADDRESS]; + s32 mc_filter_type; + u32 mcft_size; + u32 vft_size; + u32 num_rar_entries; ++ u32 rar_highwater; + u32 max_tx_queues; + u32 max_rx_queues; +- u32 link_attach_type; +- u32 link_mode_select; +- bool link_settings_loaded; ++ u32 max_msix_vectors; ++ bool msix_vectors_from_pcie; ++ u32 orig_autoc; ++ u32 orig_autoc2; ++ bool orig_link_settings_stored; + bool autoneg; +- bool autoneg_failed; ++ bool autoneg_succeeded; ++ bool autotry_restart; + }; + + struct ixgbe_phy_info { +@@ -1458,36 +2527,34 @@ + u32 addr; + u32 id; + enum ixgbe_sfp_type sfp_type; ++ bool sfp_setup_needed; + u32 revision; + enum ixgbe_media_type media_type; + bool reset_disable; + ixgbe_autoneg_advertised autoneg_advertised; + bool autoneg_wait_to_complete; ++ bool multispeed_fiber; + }; + + struct ixgbe_hw { +- u8 __iomem *hw_addr; +- void *back; +- struct ixgbe_mac_info mac; +- struct ixgbe_addr_filter_info addr_ctrl; +- struct ixgbe_fc_info fc; +- struct ixgbe_phy_info phy; +- struct ixgbe_eeprom_info eeprom; +- u16 device_id; +- u16 vendor_id; +- u16 subsystem_device_id; +- u16 subsystem_vendor_id; +- u8 revision_id; +- bool adapter_stopped; ++ u8 __iomem *hw_addr; ++ void *back; ++ struct ixgbe_mac_info mac; ++ struct ixgbe_addr_filter_info addr_ctrl; ++ struct ixgbe_fc_info fc; ++ struct ixgbe_phy_info phy; ++ struct ixgbe_eeprom_info eeprom; ++ struct ixgbe_bus_info bus; ++ u16 device_id; ++ u16 vendor_id; ++ u16 subsystem_device_id; ++ u16 subsystem_vendor_id; ++ u8 revision_id; ++ bool adapter_stopped; + }; + +-struct ixgbe_info { +- enum ixgbe_mac_type mac; +- s32 (*get_invariants)(struct ixgbe_hw *); +- struct ixgbe_mac_operations *mac_ops; +- struct ixgbe_eeprom_operations *eeprom_ops; +- struct ixgbe_phy_operations *phy_ops; +-}; ++#define ixgbe_call_func(hw, func, params, error) \ ++ (func != NULL) ? func params : error + + + /* Error Codes */ +@@ -1511,6 +2578,11 @@ + #define IXGBE_ERR_I2C -18 + #define IXGBE_ERR_SFP_NOT_SUPPORTED -19 + #define IXGBE_ERR_SFP_NOT_PRESENT -20 ++#define IXGBE_ERR_SFP_NO_INIT_SEQ_PRESENT -21 ++#define IXGBE_ERR_NO_SAN_ADDR_PTR -22 ++#define IXGBE_ERR_FDIR_REINIT_FAILED -23 ++#define IXGBE_ERR_EEPROM_VERSION -24 + #define IXGBE_NOT_IMPLEMENTED 0x7FFFFFFF + ++ + #endif /* _IXGBE_TYPE_H_ */ +diff -r 3e5bbd731d89 drivers/net/ixgbe/kcompat.c +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/ixgbe/kcompat.c Mon Jun 15 12:06:28 2009 +0100 +@@ -0,0 +1,573 @@ ++/******************************************************************************* ++ ++ Intel 10 Gigabit PCI Express Linux driver ++ Copyright(c) 1999 - 2009 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++#include "ixgbe.h" ++#include "kcompat.h" ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,21) ) ++struct sk_buff * ++_kc_skb_pad(struct sk_buff *skb, int pad) ++{ ++ struct sk_buff *nskb; ++ ++ /* If the skbuff is non linear tailroom is always zero.. */ ++ if(skb_tailroom(skb) >= pad) ++ { ++ memset(skb->data+skb->len, 0, pad); ++ return skb; ++ } ++ ++ nskb = skb_copy_expand(skb, skb_headroom(skb), skb_tailroom(skb) + pad, GFP_ATOMIC); ++ kfree_skb(skb); ++ if(nskb) ++ memset(nskb->data+nskb->len, 0, pad); ++ return nskb; ++} ++#endif /* < 2.4.21 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,13) ) ++ ++/**************************************/ ++/* PCI DMA MAPPING */ ++ ++#if defined(CONFIG_HIGHMEM) ++ ++#ifndef PCI_DRAM_OFFSET ++#define PCI_DRAM_OFFSET 0 ++#endif ++ ++u64 ++_kc_pci_map_page(struct pci_dev *dev, struct page *page, unsigned long offset, ++ size_t size, int direction) ++{ ++ return (((u64) (page - mem_map) << PAGE_SHIFT) + offset + ++ PCI_DRAM_OFFSET); ++} ++ ++#else /* CONFIG_HIGHMEM */ ++ ++u64 ++_kc_pci_map_page(struct pci_dev *dev, struct page *page, unsigned long offset, ++ size_t size, int direction) ++{ ++ return pci_map_single(dev, (void *)page_address(page) + offset, size, ++ direction); ++} ++ ++#endif /* CONFIG_HIGHMEM */ ++ ++void ++_kc_pci_unmap_page(struct pci_dev *dev, u64 dma_addr, size_t size, ++ int direction) ++{ ++ return pci_unmap_single(dev, dma_addr, size, direction); ++} ++ ++#endif /* 2.4.13 => 2.4.3 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,3) ) ++ ++/**************************************/ ++/* PCI DRIVER API */ ++ ++int ++_kc_pci_set_dma_mask(struct pci_dev *dev, dma_addr_t mask) ++{ ++ if (!pci_dma_supported(dev, mask)) ++ return -EIO; ++ dev->dma_mask = mask; ++ return 0; ++} ++ ++int ++_kc_pci_request_regions(struct pci_dev *dev, char *res_name) ++{ ++ int i; ++ ++ for (i = 0; i < 6; i++) { ++ if (pci_resource_len(dev, i) == 0) ++ continue; ++ ++ if (pci_resource_flags(dev, i) & IORESOURCE_IO) { ++ if (!request_region(pci_resource_start(dev, i), pci_resource_len(dev, i), res_name)) { ++ pci_release_regions(dev); ++ return -EBUSY; ++ } ++ } else if (pci_resource_flags(dev, i) & IORESOURCE_MEM) { ++ if (!request_mem_region(pci_resource_start(dev, i), pci_resource_len(dev, i), res_name)) { ++ pci_release_regions(dev); ++ return -EBUSY; ++ } ++ } ++ } ++ return 0; ++} ++ ++void ++_kc_pci_release_regions(struct pci_dev *dev) ++{ ++ int i; ++ ++ for (i = 0; i < 6; i++) { ++ if (pci_resource_len(dev, i) == 0) ++ continue; ++ ++ if (pci_resource_flags(dev, i) & IORESOURCE_IO) ++ release_region(pci_resource_start(dev, i), pci_resource_len(dev, i)); ++ ++ else if (pci_resource_flags(dev, i) & IORESOURCE_MEM) ++ release_mem_region(pci_resource_start(dev, i), pci_resource_len(dev, i)); ++ } ++} ++ ++/**************************************/ ++/* NETWORK DRIVER API */ ++ ++struct net_device * ++_kc_alloc_etherdev(int sizeof_priv) ++{ ++ struct net_device *dev; ++ int alloc_size; ++ ++ alloc_size = sizeof(*dev) + sizeof_priv + IFNAMSIZ + 31; ++ dev = kmalloc(alloc_size, GFP_KERNEL); ++ if (!dev) ++ return NULL; ++ memset(dev, 0, alloc_size); ++ ++ if (sizeof_priv) ++ dev->priv = (void *) (((unsigned long)(dev + 1) + 31) & ~31); ++ dev->name[0] = '\0'; ++ ether_setup(dev); ++ ++ return dev; ++} ++ ++int ++_kc_is_valid_ether_addr(u8 *addr) ++{ ++ const char zaddr[6] = { 0, }; ++ ++ return !(addr[0] & 1) && memcmp(addr, zaddr, 6); ++} ++ ++#endif /* 2.4.3 => 2.4.0 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,6) ) ++ ++int ++_kc_pci_set_power_state(struct pci_dev *dev, int state) ++{ ++ return 0; ++} ++ ++int ++_kc_pci_enable_wake(struct pci_dev *pdev, u32 state, int enable) ++{ ++ return 0; ++} ++ ++#endif /* 2.4.6 => 2.4.3 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) ) ++void _kc_skb_fill_page_desc(struct sk_buff *skb, int i, struct page *page, ++ int off, int size) ++{ ++ skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; ++ frag->page = page; ++ frag->page_offset = off; ++ frag->size = size; ++ skb_shinfo(skb)->nr_frags = i + 1; ++} ++ ++/* ++ * Original Copyright: ++ * find_next_bit.c: fallback find next bit implementation ++ * ++ * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. ++ * Written by David Howells (dhowells@redhat.com) ++ */ ++ ++/** ++ * find_next_bit - find the next set bit in a memory region ++ * @addr: The address to base the search on ++ * @offset: The bitnumber to start searching at ++ * @size: The maximum size to search ++ */ ++unsigned long find_next_bit(const unsigned long *addr, unsigned long size, ++ unsigned long offset) ++{ ++ const unsigned long *p = addr + BITOP_WORD(offset); ++ unsigned long result = offset & ~(BITS_PER_LONG-1); ++ unsigned long tmp; ++ ++ if (offset >= size) ++ return size; ++ size -= result; ++ offset %= BITS_PER_LONG; ++ if (offset) { ++ tmp = *(p++); ++ tmp &= (~0UL << offset); ++ if (size < BITS_PER_LONG) ++ goto found_first; ++ if (tmp) ++ goto found_middle; ++ size -= BITS_PER_LONG; ++ result += BITS_PER_LONG; ++ } ++ while (size & ~(BITS_PER_LONG-1)) { ++ if ((tmp = *(p++))) ++ goto found_middle; ++ result += BITS_PER_LONG; ++ size -= BITS_PER_LONG; ++ } ++ if (!size) ++ return result; ++ tmp = *p; ++ ++found_first: ++ tmp &= (~0UL >> (BITS_PER_LONG - size)); ++ if (tmp == 0UL) /* Are any bits set? */ ++ return result + size; /* Nope. */ ++found_middle: ++ return result + ffs(tmp); ++} ++ ++#endif /* 2.6.0 => 2.4.6 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,14) ) ++void *_kc_kzalloc(size_t size, int flags) ++{ ++ void *ret = kmalloc(size, flags); ++ if (ret) ++ memset(ret, 0, size); ++ return ret; ++} ++#endif /* <= 2.6.13 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18) ) ++struct sk_buff *_kc_netdev_alloc_skb(struct net_device *dev, ++ unsigned int length) ++{ ++ /* 16 == NET_PAD_SKB */ ++ struct sk_buff *skb; ++ skb = alloc_skb(length + 16, GFP_ATOMIC); ++ if (likely(skb != NULL)) { ++ skb_reserve(skb, 16); ++ skb->dev = dev; ++ } ++ return skb; ++} ++#endif /* <= 2.6.17 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) ) ++int _kc_pci_save_state(struct pci_dev *pdev) ++{ ++ struct net_device *netdev = pci_get_drvdata(pdev); ++ struct adapter_struct *adapter = netdev_priv(netdev); ++ int size = PCI_CONFIG_SPACE_LEN, i; ++ u16 pcie_cap_offset = pci_find_capability(pdev, PCI_CAP_ID_EXP); ++ u16 pcie_link_status; ++ ++ if (pcie_cap_offset) { ++ if (!pci_read_config_word(pdev, ++ pcie_cap_offset + PCIE_LINK_STATUS, ++ &pcie_link_status)) ++ size = PCIE_CONFIG_SPACE_LEN; ++ } ++ pci_config_space_ich8lan(); ++#ifdef HAVE_PCI_ERS ++ if (adapter->config_space == NULL) ++#else ++ WARN_ON(adapter->config_space != NULL); ++#endif ++ adapter->config_space = kmalloc(size, GFP_KERNEL); ++ if (!adapter->config_space) { ++ printk(KERN_ERR "Out of memory in pci_save_state\n"); ++ return -ENOMEM; ++ } ++ for (i = 0; i < (size / 4); i++) ++ pci_read_config_dword(pdev, i * 4, &adapter->config_space[i]); ++ return 0; ++} ++ ++void _kc_pci_restore_state(struct pci_dev * pdev) ++{ ++ struct net_device *netdev = pci_get_drvdata(pdev); ++ struct adapter_struct *adapter = netdev_priv(netdev); ++ int size = PCI_CONFIG_SPACE_LEN, i; ++ u16 pcie_cap_offset; ++ u16 pcie_link_status; ++ ++ if (adapter->config_space != NULL) { ++ pcie_cap_offset = pci_find_capability(pdev, PCI_CAP_ID_EXP); ++ if (pcie_cap_offset && ++ !pci_read_config_word(pdev, ++ pcie_cap_offset + PCIE_LINK_STATUS, ++ &pcie_link_status)) ++ size = PCIE_CONFIG_SPACE_LEN; ++ ++ pci_config_space_ich8lan(); ++ for (i = 0; i < (size / 4); i++) ++ pci_write_config_dword(pdev, i * 4, adapter->config_space[i]); ++#ifndef HAVE_PCI_ERS ++ kfree(adapter->config_space); ++ adapter->config_space = NULL; ++#endif ++ } ++} ++ ++#ifdef HAVE_PCI_ERS ++void _kc_free_netdev(struct net_device *netdev) ++{ ++ struct adapter_struct *adapter = netdev_priv(netdev); ++ ++ if (adapter->config_space != NULL) ++ kfree(adapter->config_space); ++#ifdef CONFIG_SYSFS ++ if (netdev->reg_state == NETREG_UNINITIALIZED) { ++ kfree((char *)netdev - netdev->padded); ++ } else { ++ BUG_ON(netdev->reg_state != NETREG_UNREGISTERED); ++ netdev->reg_state = NETREG_RELEASED; ++ class_device_put(&netdev->class_dev); ++ } ++#else ++ kfree((char *)netdev - netdev->padded); ++#endif ++} ++#endif ++#endif /* <= 2.6.18 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23) ) ++ ++int ixgbe_dcb_netlink_register() ++{ ++ return 0; ++} ++ ++int ixgbe_dcb_netlink_unregister() ++{ ++ return 0; ++} ++#endif /* < 2.6.23 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) ) ++#ifdef NAPI ++/* this function returns the true netdev of the napi struct */ ++struct net_device * napi_to_netdev(struct napi_struct *napi) ++{ ++ struct adapter_q_vector *q_vector = container_of(napi, ++ struct adapter_q_vector, ++ napi); ++ struct adapter_struct *adapter = q_vector->adapter; ++ ++ return adapter->netdev; ++} ++ ++int _kc_napi_schedule_prep(struct napi_struct *napi) ++{ ++ return (netif_running(napi_to_netdev(napi)) && ++ netif_rx_schedule_prep(napi_to_poll_dev(napi))); ++} ++ ++int __kc_adapter_clean(struct net_device *netdev, int *budget) ++{ ++ int work_done; ++ int work_to_do = min(*budget, netdev->quota); ++ /* kcompat.h netif_napi_add puts napi struct in "fake netdev->priv" */ ++ struct napi_struct *napi = netdev->priv; ++ work_done = napi->poll(napi, work_to_do); ++ *budget -= work_done; ++ netdev->quota -= work_done; ++ return (work_done >= work_to_do) ? 1 : 0; ++} ++#endif /* NAPI */ ++#endif /* <= 2.6.24 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27) ) ++#ifdef HAVE_TX_MQ ++void _kc_netif_tx_stop_all_queues(struct net_device *netdev) ++{ ++ struct adapter_struct *adapter = netdev_priv(netdev); ++ int i; ++ ++ netif_stop_queue(netdev); ++ if (netif_is_multiqueue(netdev)) ++ for (i = 0; i < adapter->num_tx_queues; i++) ++ netif_stop_subqueue(netdev, i); ++} ++void _kc_netif_tx_wake_all_queues(struct net_device *netdev) ++{ ++ struct adapter_struct *adapter = netdev_priv(netdev); ++ int i; ++ ++ netif_wake_queue(netdev); ++ if (netif_is_multiqueue(netdev)) ++ for (i = 0; i < adapter->num_tx_queues; i++) ++ netif_wake_subqueue(netdev, i); ++} ++void _kc_netif_tx_start_all_queues(struct net_device *netdev) ++{ ++ struct adapter_struct *adapter = netdev_priv(netdev); ++ int i; ++ ++ netif_start_queue(netdev); ++ if (netif_is_multiqueue(netdev)) ++ for (i = 0; i < adapter->num_tx_queues; i++) ++ netif_start_subqueue(netdev, i); ++} ++#endif /* HAVE_TX_MQ */ ++#endif /* < 2.6.27 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,28) ) ++ ++int ++_kc_pci_prepare_to_sleep(struct pci_dev *dev) ++{ ++ pci_power_t target_state; ++ int error; ++ ++ target_state = pci_choose_state(dev, PMSG_SUSPEND); ++ ++ pci_enable_wake(dev, target_state, true); ++ ++ error = pci_set_power_state(dev, target_state); ++ ++ if (error) ++ pci_enable_wake(dev, target_state, false); ++ ++ return error; ++} ++ ++int ++_kc_pci_wake_from_d3(struct pci_dev *dev, bool enable) ++{ ++ int err; ++ ++ err = pci_enable_wake(dev, PCI_D3cold, enable); ++ if (err) ++ goto out; ++ ++ err = pci_enable_wake(dev, PCI_D3hot, enable); ++ ++out: ++ return err; ++} ++#endif /* < 2.6.28 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29) ) ++void _kc_pci_disable_link_state(struct pci_dev *pdev, int state) ++{ ++ struct pci_dev *parent = pdev->bus->self; ++ u16 link_state; ++ int pos; ++ ++ if (!parent) ++ return; ++ ++ pos = pci_find_capability(parent, PCI_CAP_ID_EXP); ++ if (pos) { ++ pci_read_config_word(parent, pos + PCI_EXP_LNKCTL, &link_state); ++ link_state &= ~state; ++ pci_write_config_word(parent, pos + PCI_EXP_LNKCTL, link_state); ++ } ++} ++#endif /* < 2.6.29 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30) ) ++#ifdef HAVE_NETDEV_SELECT_QUEUE ++#include ++u32 _kc_simple_tx_hashrnd; ++u32 _kc_simple_tx_hashrnd_initialized = 0; ++ ++u16 _kc_skb_tx_hash(struct net_device *dev, struct sk_buff *skb) ++{ ++ u32 addr1, addr2, ports; ++ u32 hash, ihl; ++ u8 ip_proto = 0; ++ ++ if (unlikely(!_kc_simple_tx_hashrnd_initialized)) { ++ get_random_bytes(&_kc_simple_tx_hashrnd, 4); ++ _kc_simple_tx_hashrnd_initialized = 1; ++ } ++ ++ switch (skb->protocol) { ++ case htons(ETH_P_IP): ++ if (!(ip_hdr(skb)->frag_off & htons(IP_MF | IP_OFFSET))) ++ ip_proto = ip_hdr(skb)->protocol; ++ addr1 = ip_hdr(skb)->saddr; ++ addr2 = ip_hdr(skb)->daddr; ++ ihl = ip_hdr(skb)->ihl; ++ break; ++ case htons(ETH_P_IPV6): ++ ip_proto = ipv6_hdr(skb)->nexthdr; ++ addr1 = ipv6_hdr(skb)->saddr.s6_addr32[3]; ++ addr2 = ipv6_hdr(skb)->daddr.s6_addr32[3]; ++ ihl = (40 >> 2); ++ break; ++ default: ++ return 0; ++ } ++ ++ ++ switch (ip_proto) { ++ case IPPROTO_TCP: ++ case IPPROTO_UDP: ++ case IPPROTO_DCCP: ++ case IPPROTO_ESP: ++ case IPPROTO_AH: ++ case IPPROTO_SCTP: ++ case IPPROTO_UDPLITE: ++ ports = *((u32 *) (skb_network_header(skb) + (ihl * 4))); ++ break; ++ ++ default: ++ ports = 0; ++ break; ++ } ++ ++ hash = jhash_3words(addr1, addr2, ports, _kc_simple_tx_hashrnd); ++ ++ return (u16) (((u64) hash * dev->real_num_tx_queues) >> 32); ++} ++#endif /* HAVE_NETDEV_SELECT_QUEUE */ ++#endif /* < 2.6.30 */ +diff -r 3e5bbd731d89 drivers/net/ixgbe/kcompat.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/ixgbe/kcompat.h Mon Jun 15 12:06:28 2009 +0100 +@@ -0,0 +1,1764 @@ ++/******************************************************************************* ++ ++ Intel 10 Gigabit PCI Express Linux driver ++ Copyright(c) 1999 - 2009 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++#ifndef _KCOMPAT_H_ ++#define _KCOMPAT_H_ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++/* NAPI enable/disable flags here */ ++/* enable NAPI for ixgbe by default */ ++#undef CONFIG_IXGBE_NAPI ++#define CONFIG_IXGBE_NAPI ++#define NAPI ++#ifdef CONFIG_IXGBE_NAPI ++#undef NAPI ++#define NAPI ++#endif /* CONFIG_IXGBE_NAPI */ ++#ifdef IXGBE_NAPI ++#undef NAPI ++#define NAPI ++#endif /* IXGBE_NAPI */ ++#ifdef IXGBE_NO_NAPI ++#undef NAPI ++#endif /* IXGBE_NO_NAPI */ ++ ++#define adapter_struct ixgbe_adapter ++#define adapter_q_vector ixgbe_q_vector ++ ++/* and finally set defines so that the code sees the changes */ ++#ifdef NAPI ++#ifndef CONFIG_IXGBE_NAPI ++#define CONFIG_IXGBE_NAPI ++#endif ++#else ++#undef CONFIG_IXGBE_NAPI ++#endif /* NAPI */ ++ ++/* MSI compatibility code for all kernels and drivers */ ++#ifdef DISABLE_PCI_MSI ++#undef CONFIG_PCI_MSI ++#endif ++#ifndef CONFIG_PCI_MSI ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,8) ) ++struct msix_entry { ++ u16 vector; /* kernel uses to write allocated vector */ ++ u16 entry; /* driver uses to specify entry, OS writes */ ++}; ++#endif ++#define pci_enable_msi(a) -ENOTSUPP ++#define pci_disable_msi(a) do {} while (0) ++#define pci_enable_msix(a, b, c) -ENOTSUPP ++#define pci_disable_msix(a) do {} while (0) ++#define msi_remove_pci_irq_vectors(a) do {} while (0) ++#endif /* CONFIG_PCI_MSI */ ++#ifdef DISABLE_PM ++#undef CONFIG_PM ++#endif ++ ++#ifdef DISABLE_NET_POLL_CONTROLLER ++#undef CONFIG_NET_POLL_CONTROLLER ++#endif ++ ++#ifndef PMSG_SUSPEND ++#define PMSG_SUSPEND 3 ++#endif ++ ++/* generic boolean compatibility */ ++#undef TRUE ++#undef FALSE ++#define TRUE true ++#define FALSE false ++#ifdef GCC_VERSION ++#if ( GCC_VERSION < 3000 ) ++#define _Bool char ++#endif ++#else ++#define _Bool char ++#endif ++#ifndef bool ++#define bool _Bool ++#define true 1 ++#define false 0 ++#endif ++ ++ ++#ifndef module_param ++#define module_param(v,t,p) MODULE_PARM(v, "i"); ++#endif ++ ++#ifndef DMA_64BIT_MASK ++#define DMA_64BIT_MASK 0xffffffffffffffffULL ++#endif ++ ++#ifndef DMA_32BIT_MASK ++#define DMA_32BIT_MASK 0x00000000ffffffffULL ++#endif ++ ++#ifndef PCI_CAP_ID_EXP ++#define PCI_CAP_ID_EXP 0x10 ++#endif ++ ++#ifndef PCIE_LINK_STATE_L0S ++#define PCIE_LINK_STATE_L0S 1 ++#endif ++ ++#ifndef mmiowb ++#ifdef CONFIG_IA64 ++#define mmiowb() asm volatile ("mf.a" ::: "memory") ++#else ++#define mmiowb() ++#endif ++#endif ++ ++#ifndef SET_NETDEV_DEV ++#define SET_NETDEV_DEV(net, pdev) ++#endif ++ ++#ifndef HAVE_FREE_NETDEV ++#define free_netdev(x) kfree(x) ++#endif ++ ++#ifdef HAVE_POLL_CONTROLLER ++#define CONFIG_NET_POLL_CONTROLLER ++#endif ++ ++#ifndef NETDEV_TX_OK ++#define NETDEV_TX_OK 0 ++#endif ++ ++#ifndef NETDEV_TX_BUSY ++#define NETDEV_TX_BUSY 1 ++#endif ++ ++#ifndef NETDEV_TX_LOCKED ++#define NETDEV_TX_LOCKED -1 ++#endif ++ ++#ifndef SKB_DATAREF_SHIFT ++/* if we do not have the infrastructure to detect if skb_header is cloned ++ just return false in all cases */ ++#define skb_header_cloned(x) 0 ++#endif ++ ++#ifndef NETIF_F_GSO ++#define gso_size tso_size ++#define gso_segs tso_segs ++#endif ++ ++#ifndef NETIF_F_GRO ++#define vlan_gro_receive(_napi, _vlgrp, _vlan, _skb) \ ++ vlan_hwaccel_receive_skb(_skb, _vlgrp, _vlan) ++#define napi_gro_receive(_napi, _skb) netif_receive_skb(_skb) ++#endif ++ ++#ifndef CHECKSUM_PARTIAL ++#define CHECKSUM_PARTIAL CHECKSUM_HW ++#define CHECKSUM_COMPLETE CHECKSUM_HW ++#endif ++ ++#ifndef __read_mostly ++#define __read_mostly ++#endif ++ ++#ifndef HAVE_NETIF_MSG ++#define HAVE_NETIF_MSG 1 ++enum { ++ NETIF_MSG_DRV = 0x0001, ++ NETIF_MSG_PROBE = 0x0002, ++ NETIF_MSG_LINK = 0x0004, ++ NETIF_MSG_TIMER = 0x0008, ++ NETIF_MSG_IFDOWN = 0x0010, ++ NETIF_MSG_IFUP = 0x0020, ++ NETIF_MSG_RX_ERR = 0x0040, ++ NETIF_MSG_TX_ERR = 0x0080, ++ NETIF_MSG_TX_QUEUED = 0x0100, ++ NETIF_MSG_INTR = 0x0200, ++ NETIF_MSG_TX_DONE = 0x0400, ++ NETIF_MSG_RX_STATUS = 0x0800, ++ NETIF_MSG_PKTDATA = 0x1000, ++ NETIF_MSG_HW = 0x2000, ++ NETIF_MSG_WOL = 0x4000, ++}; ++ ++#else ++#define NETIF_MSG_HW 0x2000 ++#define NETIF_MSG_WOL 0x4000 ++#endif /* HAVE_NETIF_MSG */ ++ ++#ifndef MII_RESV1 ++#define MII_RESV1 0x17 /* Reserved... */ ++#endif ++ ++#ifndef unlikely ++#define unlikely(_x) _x ++#define likely(_x) _x ++#endif ++ ++#ifndef WARN_ON ++#define WARN_ON(x) ++#endif ++ ++#ifndef PCI_DEVICE ++#define PCI_DEVICE(vend,dev) \ ++ .vendor = (vend), .device = (dev), \ ++ .subvendor = PCI_ANY_ID, .subdevice = PCI_ANY_ID ++#endif ++ ++#ifndef num_online_cpus ++#define num_online_cpus() smp_num_cpus ++#endif ++ ++#ifndef _LINUX_RANDOM_H ++#include ++#endif ++ ++#ifndef DECLARE_BITMAP ++#ifndef BITS_TO_LONGS ++#define BITS_TO_LONGS(bits) (((bits)+BITS_PER_LONG-1)/BITS_PER_LONG) ++#endif ++#define DECLARE_BITMAP(name,bits) long name[BITS_TO_LONGS(bits)] ++#endif ++ ++#ifndef VLAN_HLEN ++#define VLAN_HLEN 4 ++#endif ++ ++#ifndef VLAN_ETH_HLEN ++#define VLAN_ETH_HLEN 18 ++#endif ++ ++#ifndef VLAN_ETH_FRAME_LEN ++#define VLAN_ETH_FRAME_LEN 1518 ++#endif ++ ++#ifndef DCA_GET_TAG_TWO_ARGS ++#define dca3_get_tag(a,b) dca_get_tag(b) ++#endif ++ ++ ++/*****************************************************************************/ ++/* Installations with ethtool version without eeprom, adapter id, or statistics ++ * support */ ++ ++#ifndef ETH_GSTRING_LEN ++#define ETH_GSTRING_LEN 32 ++#endif ++ ++#ifndef ETHTOOL_GSTATS ++#define ETHTOOL_GSTATS 0x1d ++#undef ethtool_drvinfo ++#define ethtool_drvinfo k_ethtool_drvinfo ++struct k_ethtool_drvinfo { ++ u32 cmd; ++ char driver[32]; ++ char version[32]; ++ char fw_version[32]; ++ char bus_info[32]; ++ char reserved1[32]; ++ char reserved2[16]; ++ u32 n_stats; ++ u32 testinfo_len; ++ u32 eedump_len; ++ u32 regdump_len; ++}; ++ ++struct ethtool_stats { ++ u32 cmd; ++ u32 n_stats; ++ u64 data[0]; ++}; ++#endif /* ETHTOOL_GSTATS */ ++ ++#ifndef ETHTOOL_PHYS_ID ++#define ETHTOOL_PHYS_ID 0x1c ++#endif /* ETHTOOL_PHYS_ID */ ++ ++#ifndef ETHTOOL_GSTRINGS ++#define ETHTOOL_GSTRINGS 0x1b ++enum ethtool_stringset { ++ ETH_SS_TEST = 0, ++ ETH_SS_STATS, ++}; ++struct ethtool_gstrings { ++ u32 cmd; /* ETHTOOL_GSTRINGS */ ++ u32 string_set; /* string set id e.c. ETH_SS_TEST, etc*/ ++ u32 len; /* number of strings in the string set */ ++ u8 data[0]; ++}; ++#endif /* ETHTOOL_GSTRINGS */ ++ ++#ifndef ETHTOOL_TEST ++#define ETHTOOL_TEST 0x1a ++enum ethtool_test_flags { ++ ETH_TEST_FL_OFFLINE = (1 << 0), ++ ETH_TEST_FL_FAILED = (1 << 1), ++}; ++struct ethtool_test { ++ u32 cmd; ++ u32 flags; ++ u32 reserved; ++ u32 len; ++ u64 data[0]; ++}; ++#endif /* ETHTOOL_TEST */ ++ ++#ifndef ETHTOOL_GEEPROM ++#define ETHTOOL_GEEPROM 0xb ++#undef ETHTOOL_GREGS ++struct ethtool_eeprom { ++ u32 cmd; ++ u32 magic; ++ u32 offset; ++ u32 len; ++ u8 data[0]; ++}; ++ ++struct ethtool_value { ++ u32 cmd; ++ u32 data; ++}; ++#endif /* ETHTOOL_GEEPROM */ ++ ++#ifndef ETHTOOL_GLINK ++#define ETHTOOL_GLINK 0xa ++#endif /* ETHTOOL_GLINK */ ++ ++#ifndef ETHTOOL_GREGS ++#define ETHTOOL_GREGS 0x00000004 /* Get NIC registers */ ++#define ethtool_regs _kc_ethtool_regs ++/* for passing big chunks of data */ ++struct _kc_ethtool_regs { ++ u32 cmd; ++ u32 version; /* driver-specific, indicates different chips/revs */ ++ u32 len; /* bytes */ ++ u8 data[0]; ++}; ++#endif /* ETHTOOL_GREGS */ ++ ++#ifndef ETHTOOL_GMSGLVL ++#define ETHTOOL_GMSGLVL 0x00000007 /* Get driver message level */ ++#endif ++#ifndef ETHTOOL_SMSGLVL ++#define ETHTOOL_SMSGLVL 0x00000008 /* Set driver msg level, priv. */ ++#endif ++#ifndef ETHTOOL_NWAY_RST ++#define ETHTOOL_NWAY_RST 0x00000009 /* Restart autonegotiation, priv */ ++#endif ++#ifndef ETHTOOL_GLINK ++#define ETHTOOL_GLINK 0x0000000a /* Get link status */ ++#endif ++#ifndef ETHTOOL_GEEPROM ++#define ETHTOOL_GEEPROM 0x0000000b /* Get EEPROM data */ ++#endif ++#ifndef ETHTOOL_SEEPROM ++#define ETHTOOL_SEEPROM 0x0000000c /* Set EEPROM data */ ++#endif ++#ifndef ETHTOOL_GCOALESCE ++#define ETHTOOL_GCOALESCE 0x0000000e /* Get coalesce config */ ++/* for configuring coalescing parameters of chip */ ++#define ethtool_coalesce _kc_ethtool_coalesce ++struct _kc_ethtool_coalesce { ++ u32 cmd; /* ETHTOOL_{G,S}COALESCE */ ++ ++ /* How many usecs to delay an RX interrupt after ++ * a packet arrives. If 0, only rx_max_coalesced_frames ++ * is used. ++ */ ++ u32 rx_coalesce_usecs; ++ ++ /* How many packets to delay an RX interrupt after ++ * a packet arrives. If 0, only rx_coalesce_usecs is ++ * used. It is illegal to set both usecs and max frames ++ * to zero as this would cause RX interrupts to never be ++ * generated. ++ */ ++ u32 rx_max_coalesced_frames; ++ ++ /* Same as above two parameters, except that these values ++ * apply while an IRQ is being serviced by the host. Not ++ * all cards support this feature and the values are ignored ++ * in that case. ++ */ ++ u32 rx_coalesce_usecs_irq; ++ u32 rx_max_coalesced_frames_irq; ++ ++ /* How many usecs to delay a TX interrupt after ++ * a packet is sent. If 0, only tx_max_coalesced_frames ++ * is used. ++ */ ++ u32 tx_coalesce_usecs; ++ ++ /* How many packets to delay a TX interrupt after ++ * a packet is sent. If 0, only tx_coalesce_usecs is ++ * used. It is illegal to set both usecs and max frames ++ * to zero as this would cause TX interrupts to never be ++ * generated. ++ */ ++ u32 tx_max_coalesced_frames; ++ ++ /* Same as above two parameters, except that these values ++ * apply while an IRQ is being serviced by the host. Not ++ * all cards support this feature and the values are ignored ++ * in that case. ++ */ ++ u32 tx_coalesce_usecs_irq; ++ u32 tx_max_coalesced_frames_irq; ++ ++ /* How many usecs to delay in-memory statistics ++ * block updates. Some drivers do not have an in-memory ++ * statistic block, and in such cases this value is ignored. ++ * This value must not be zero. ++ */ ++ u32 stats_block_coalesce_usecs; ++ ++ /* Adaptive RX/TX coalescing is an algorithm implemented by ++ * some drivers to improve latency under low packet rates and ++ * improve throughput under high packet rates. Some drivers ++ * only implement one of RX or TX adaptive coalescing. Anything ++ * not implemented by the driver causes these values to be ++ * silently ignored. ++ */ ++ u32 use_adaptive_rx_coalesce; ++ u32 use_adaptive_tx_coalesce; ++ ++ /* When the packet rate (measured in packets per second) ++ * is below pkt_rate_low, the {rx,tx}_*_low parameters are ++ * used. ++ */ ++ u32 pkt_rate_low; ++ u32 rx_coalesce_usecs_low; ++ u32 rx_max_coalesced_frames_low; ++ u32 tx_coalesce_usecs_low; ++ u32 tx_max_coalesced_frames_low; ++ ++ /* When the packet rate is below pkt_rate_high but above ++ * pkt_rate_low (both measured in packets per second) the ++ * normal {rx,tx}_* coalescing parameters are used. ++ */ ++ ++ /* When the packet rate is (measured in packets per second) ++ * is above pkt_rate_high, the {rx,tx}_*_high parameters are ++ * used. ++ */ ++ u32 pkt_rate_high; ++ u32 rx_coalesce_usecs_high; ++ u32 rx_max_coalesced_frames_high; ++ u32 tx_coalesce_usecs_high; ++ u32 tx_max_coalesced_frames_high; ++ ++ /* How often to do adaptive coalescing packet rate sampling, ++ * measured in seconds. Must not be zero. ++ */ ++ u32 rate_sample_interval; ++}; ++#endif /* ETHTOOL_GCOALESCE */ ++ ++#ifndef ETHTOOL_SCOALESCE ++#define ETHTOOL_SCOALESCE 0x0000000f /* Set coalesce config. */ ++#endif ++#ifndef ETHTOOL_GRINGPARAM ++#define ETHTOOL_GRINGPARAM 0x00000010 /* Get ring parameters */ ++/* for configuring RX/TX ring parameters */ ++#define ethtool_ringparam _kc_ethtool_ringparam ++struct _kc_ethtool_ringparam { ++ u32 cmd; /* ETHTOOL_{G,S}RINGPARAM */ ++ ++ /* Read only attributes. These indicate the maximum number ++ * of pending RX/TX ring entries the driver will allow the ++ * user to set. ++ */ ++ u32 rx_max_pending; ++ u32 rx_mini_max_pending; ++ u32 rx_jumbo_max_pending; ++ u32 tx_max_pending; ++ ++ /* Values changeable by the user. The valid values are ++ * in the range 1 to the "*_max_pending" counterpart above. ++ */ ++ u32 rx_pending; ++ u32 rx_mini_pending; ++ u32 rx_jumbo_pending; ++ u32 tx_pending; ++}; ++#endif /* ETHTOOL_GRINGPARAM */ ++ ++#ifndef ETHTOOL_SRINGPARAM ++#define ETHTOOL_SRINGPARAM 0x00000011 /* Set ring parameters, priv. */ ++#endif ++#ifndef ETHTOOL_GPAUSEPARAM ++#define ETHTOOL_GPAUSEPARAM 0x00000012 /* Get pause parameters */ ++/* for configuring link flow control parameters */ ++#define ethtool_pauseparam _kc_ethtool_pauseparam ++struct _kc_ethtool_pauseparam { ++ u32 cmd; /* ETHTOOL_{G,S}PAUSEPARAM */ ++ ++ /* If the link is being auto-negotiated (via ethtool_cmd.autoneg ++ * being true) the user may set 'autoneg' here non-zero to have the ++ * pause parameters be auto-negotiated too. In such a case, the ++ * {rx,tx}_pause values below determine what capabilities are ++ * advertised. ++ * ++ * If 'autoneg' is zero or the link is not being auto-negotiated, ++ * then {rx,tx}_pause force the driver to use/not-use pause ++ * flow control. ++ */ ++ u32 autoneg; ++ u32 rx_pause; ++ u32 tx_pause; ++}; ++#endif /* ETHTOOL_GPAUSEPARAM */ ++ ++#ifndef ETHTOOL_SPAUSEPARAM ++#define ETHTOOL_SPAUSEPARAM 0x00000013 /* Set pause parameters. */ ++#endif ++#ifndef ETHTOOL_GRXCSUM ++#define ETHTOOL_GRXCSUM 0x00000014 /* Get RX hw csum enable (ethtool_value) */ ++#endif ++#ifndef ETHTOOL_SRXCSUM ++#define ETHTOOL_SRXCSUM 0x00000015 /* Set RX hw csum enable (ethtool_value) */ ++#endif ++#ifndef ETHTOOL_GTXCSUM ++#define ETHTOOL_GTXCSUM 0x00000016 /* Get TX hw csum enable (ethtool_value) */ ++#endif ++#ifndef ETHTOOL_STXCSUM ++#define ETHTOOL_STXCSUM 0x00000017 /* Set TX hw csum enable (ethtool_value) */ ++#endif ++#ifndef ETHTOOL_GSG ++#define ETHTOOL_GSG 0x00000018 /* Get scatter-gather enable ++ * (ethtool_value) */ ++#endif ++#ifndef ETHTOOL_SSG ++#define ETHTOOL_SSG 0x00000019 /* Set scatter-gather enable ++ * (ethtool_value). */ ++#endif ++#ifndef ETHTOOL_TEST ++#define ETHTOOL_TEST 0x0000001a /* execute NIC self-test, priv. */ ++#endif ++#ifndef ETHTOOL_GSTRINGS ++#define ETHTOOL_GSTRINGS 0x0000001b /* get specified string set */ ++#endif ++#ifndef ETHTOOL_PHYS_ID ++#define ETHTOOL_PHYS_ID 0x0000001c /* identify the NIC */ ++#endif ++#ifndef ETHTOOL_GSTATS ++#define ETHTOOL_GSTATS 0x0000001d /* get NIC-specific statistics */ ++#endif ++#ifndef ETHTOOL_GTSO ++#define ETHTOOL_GTSO 0x0000001e /* Get TSO enable (ethtool_value) */ ++#endif ++#ifndef ETHTOOL_STSO ++#define ETHTOOL_STSO 0x0000001f /* Set TSO enable (ethtool_value) */ ++#endif ++ ++#ifndef ETHTOOL_BUSINFO_LEN ++#define ETHTOOL_BUSINFO_LEN 32 ++#endif ++ ++/*****************************************************************************/ ++/* 2.4.3 => 2.4.0 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,3) ) ++ ++/**************************************/ ++/* PCI DRIVER API */ ++ ++#ifndef pci_set_dma_mask ++#define pci_set_dma_mask _kc_pci_set_dma_mask ++extern int _kc_pci_set_dma_mask(struct pci_dev *dev, dma_addr_t mask); ++#endif ++ ++#ifndef pci_request_regions ++#define pci_request_regions _kc_pci_request_regions ++extern int _kc_pci_request_regions(struct pci_dev *pdev, char *res_name); ++#endif ++ ++#ifndef pci_release_regions ++#define pci_release_regions _kc_pci_release_regions ++extern void _kc_pci_release_regions(struct pci_dev *pdev); ++#endif ++ ++/**************************************/ ++/* NETWORK DRIVER API */ ++ ++#ifndef alloc_etherdev ++#define alloc_etherdev _kc_alloc_etherdev ++extern struct net_device * _kc_alloc_etherdev(int sizeof_priv); ++#endif ++ ++#ifndef is_valid_ether_addr ++#define is_valid_ether_addr _kc_is_valid_ether_addr ++extern int _kc_is_valid_ether_addr(u8 *addr); ++#endif ++ ++/**************************************/ ++/* MISCELLANEOUS */ ++ ++#ifndef INIT_TQUEUE ++#define INIT_TQUEUE(_tq, _routine, _data) \ ++ do { \ ++ INIT_LIST_HEAD(&(_tq)->list); \ ++ (_tq)->sync = 0; \ ++ (_tq)->routine = _routine; \ ++ (_tq)->data = _data; \ ++ } while (0) ++#endif ++ ++#endif /* 2.4.3 => 2.4.0 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,5) ) ++/* Generic MII registers. */ ++#define MII_BMCR 0x00 /* Basic mode control register */ ++#define MII_BMSR 0x01 /* Basic mode status register */ ++#define MII_PHYSID1 0x02 /* PHYS ID 1 */ ++#define MII_PHYSID2 0x03 /* PHYS ID 2 */ ++#define MII_ADVERTISE 0x04 /* Advertisement control reg */ ++#define MII_LPA 0x05 /* Link partner ability reg */ ++#define MII_EXPANSION 0x06 /* Expansion register */ ++/* Basic mode control register. */ ++#define BMCR_FULLDPLX 0x0100 /* Full duplex */ ++#define BMCR_ANENABLE 0x1000 /* Enable auto negotiation */ ++/* Basic mode status register. */ ++#define BMSR_ERCAP 0x0001 /* Ext-reg capability */ ++#define BMSR_ANEGCAPABLE 0x0008 /* Able to do auto-negotiation */ ++#define BMSR_10HALF 0x0800 /* Can do 10mbps, half-duplex */ ++#define BMSR_10FULL 0x1000 /* Can do 10mbps, full-duplex */ ++#define BMSR_100HALF 0x2000 /* Can do 100mbps, half-duplex */ ++#define BMSR_100FULL 0x4000 /* Can do 100mbps, full-duplex */ ++/* Advertisement control register. */ ++#define ADVERTISE_CSMA 0x0001 /* Only selector supported */ ++#define ADVERTISE_10HALF 0x0020 /* Try for 10mbps half-duplex */ ++#define ADVERTISE_10FULL 0x0040 /* Try for 10mbps full-duplex */ ++#define ADVERTISE_100HALF 0x0080 /* Try for 100mbps half-duplex */ ++#define ADVERTISE_100FULL 0x0100 /* Try for 100mbps full-duplex */ ++#define ADVERTISE_ALL (ADVERTISE_10HALF | ADVERTISE_10FULL | \ ++ ADVERTISE_100HALF | ADVERTISE_100FULL) ++/* Expansion register for auto-negotiation. */ ++#define EXPANSION_ENABLENPAGE 0x0004 /* This enables npage words */ ++#endif ++ ++/*****************************************************************************/ ++/* 2.4.6 => 2.4.3 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,6) ) ++ ++#ifndef pci_set_power_state ++#define pci_set_power_state _kc_pci_set_power_state ++extern int _kc_pci_set_power_state(struct pci_dev *dev, int state); ++#endif ++ ++#ifndef pci_enable_wake ++#define pci_enable_wake _kc_pci_enable_wake ++extern int _kc_pci_enable_wake(struct pci_dev *pdev, u32 state, int enable); ++#endif ++ ++#ifndef pci_disable_device ++#define pci_disable_device _kc_pci_disable_device ++extern void _kc_pci_disable_device(struct pci_dev *pdev); ++#endif ++ ++/* PCI PM entry point syntax changed, so don't support suspend/resume */ ++#undef CONFIG_PM ++ ++#endif /* 2.4.6 => 2.4.3 */ ++ ++#ifndef HAVE_PCI_SET_MWI ++#define pci_set_mwi(X) pci_write_config_word(X, \ ++ PCI_COMMAND, adapter->hw.bus.pci_cmd_word | \ ++ PCI_COMMAND_INVALIDATE); ++#define pci_clear_mwi(X) pci_write_config_word(X, \ ++ PCI_COMMAND, adapter->hw.bus.pci_cmd_word & \ ++ ~PCI_COMMAND_INVALIDATE); ++#endif ++ ++/*****************************************************************************/ ++/* 2.4.10 => 2.4.9 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,10) ) ++ ++/**************************************/ ++/* MODULE API */ ++ ++#ifndef MODULE_LICENSE ++ #define MODULE_LICENSE(X) ++#endif ++ ++/**************************************/ ++/* OTHER */ ++ ++#undef min ++#define min(x,y) ({ \ ++ const typeof(x) _x = (x); \ ++ const typeof(y) _y = (y); \ ++ (void) (&_x == &_y); \ ++ _x < _y ? _x : _y; }) ++ ++#undef max ++#define max(x,y) ({ \ ++ const typeof(x) _x = (x); \ ++ const typeof(y) _y = (y); \ ++ (void) (&_x == &_y); \ ++ _x > _y ? _x : _y; }) ++ ++#define min_t(type,x,y) ({ \ ++ type _x = (x); \ ++ type _y = (y); \ ++ _x < _y ? _x : _y; }) ++ ++#define max_t(type,x,y) ({ \ ++ type _x = (x); \ ++ type _y = (y); \ ++ _x > _y ? _x : _y; }) ++ ++#ifndef list_for_each_safe ++#define list_for_each_safe(pos, n, head) \ ++ for (pos = (head)->next, n = pos->next; pos != (head); \ ++ pos = n, n = pos->next) ++#endif ++ ++#endif /* 2.4.10 -> 2.4.6 */ ++ ++ ++/*****************************************************************************/ ++/* 2.4.13 => 2.4.10 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,13) ) ++ ++/**************************************/ ++/* PCI DMA MAPPING */ ++ ++#ifndef virt_to_page ++ #define virt_to_page(v) (mem_map + (virt_to_phys(v) >> PAGE_SHIFT)) ++#endif ++ ++#ifndef pci_map_page ++#define pci_map_page _kc_pci_map_page ++extern u64 _kc_pci_map_page(struct pci_dev *dev, struct page *page, unsigned long offset, size_t size, int direction); ++#endif ++ ++#ifndef pci_unmap_page ++#define pci_unmap_page _kc_pci_unmap_page ++extern void _kc_pci_unmap_page(struct pci_dev *dev, u64 dma_addr, size_t size, int direction); ++#endif ++ ++/* pci_set_dma_mask takes dma_addr_t, which is only 32-bits prior to 2.4.13 */ ++ ++#undef DMA_32BIT_MASK ++#define DMA_32BIT_MASK 0xffffffff ++#undef DMA_64BIT_MASK ++#define DMA_64BIT_MASK 0xffffffff ++ ++/**************************************/ ++/* OTHER */ ++ ++#ifndef cpu_relax ++#define cpu_relax() rep_nop() ++#endif ++ ++#endif /* 2.4.13 => 2.4.10 */ ++ ++/*****************************************************************************/ ++/* 2.4.17 => 2.4.12 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,17) ) ++ ++#ifndef __devexit_p ++ #define __devexit_p(x) &(x) ++#endif ++ ++#endif /* 2.4.17 => 2.4.13 */ ++ ++/*****************************************************************************/ ++/* 2.4.20 => 2.4.19 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,20) ) ++ ++/* we won't support NAPI on less than 2.4.20 */ ++#ifdef NAPI ++#undef NAPI ++#undef CONFIG_IXGBE_NAPI ++#endif ++ ++#endif /* 2.4.20 => 2.4.19 */ ++ ++/*****************************************************************************/ ++/* < 2.4.21 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,21) ) ++#define skb_pad(x,y) _kc_skb_pad(x, y) ++struct sk_buff * _kc_skb_pad(struct sk_buff *skb, int pad); ++#endif /* < 2.4.21 */ ++ ++/*****************************************************************************/ ++/* 2.4.22 => 2.4.17 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,22) ) ++#define pci_name(x) ((x)->slot_name) ++#endif ++ ++/*****************************************************************************/ ++/* 2.4.22 => 2.4.17 */ ++ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,22) ) ++#ifndef IXGBE_NO_LRO ++/* Don't enable LRO for these legacy kernels */ ++#define IXGBE_NO_LRO ++#endif ++#endif ++ ++/*****************************************************************************/ ++/*****************************************************************************/ ++/* 2.4.23 => 2.4.22 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,23) ) ++/*****************************************************************************/ ++#ifdef NAPI ++#ifndef netif_poll_disable ++#define netif_poll_disable(x) _kc_netif_poll_disable(x) ++static inline void _kc_netif_poll_disable(struct net_device *netdev) ++{ ++ while (test_and_set_bit(__LINK_STATE_RX_SCHED, &netdev->state)) { ++ /* No hurry */ ++ current->state = TASK_INTERRUPTIBLE; ++ schedule_timeout(1); ++ } ++} ++#endif ++ ++#ifndef netif_poll_enable ++#define netif_poll_enable(x) _kc_netif_poll_enable(x) ++static inline void _kc_netif_poll_enable(struct net_device *netdev) ++{ ++ clear_bit(__LINK_STATE_RX_SCHED, &netdev->state); ++} ++#endif ++#endif /* NAPI */ ++#ifndef netif_tx_disable ++#define netif_tx_disable(x) _kc_netif_tx_disable(x) ++static inline void _kc_netif_tx_disable(struct net_device *dev) ++{ ++ spin_lock_bh(&dev->xmit_lock); ++ netif_stop_queue(dev); ++ spin_unlock_bh(&dev->xmit_lock); ++} ++#endif ++#endif /* 2.4.23 => 2.4.22 */ ++ ++/*****************************************************************************/ ++/* 2.6.4 => 2.6.0 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,25) || \ ++ ( LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) && \ ++ LINUX_VERSION_CODE < KERNEL_VERSION(2,6,4) ) ) ++#define ETHTOOL_OPS_COMPAT ++#endif /* 2.6.4 => 2.6.0 */ ++ ++/*****************************************************************************/ ++/* 2.5.71 => 2.4.x */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,5,71) ) ++#define sk_protocol protocol ++#define pci_get_device pci_find_device ++#endif /* 2.5.70 => 2.4.x */ ++ ++/*****************************************************************************/ ++/* < 2.4.27 or 2.6.0 <= 2.6.5 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,27) || \ ++ ( LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) && \ ++ LINUX_VERSION_CODE < KERNEL_VERSION(2,6,5) ) ) ++ ++#ifndef netif_msg_init ++#define netif_msg_init _kc_netif_msg_init ++static inline u32 _kc_netif_msg_init(int debug_value, int default_msg_enable_bits) ++{ ++ /* use default */ ++ if (debug_value < 0 || debug_value >= (sizeof(u32) * 8)) ++ return default_msg_enable_bits; ++ if (debug_value == 0) /* no output */ ++ return 0; ++ /* set low N bits */ ++ return (1 << debug_value) -1; ++} ++#endif ++ ++#endif /* < 2.4.27 or 2.6.0 <= 2.6.5 */ ++/*****************************************************************************/ ++#if (( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,27) ) || \ ++ (( LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) ) && \ ++ ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,3) ))) ++#define netdev_priv(x) x->priv ++#endif ++ ++/*****************************************************************************/ ++/* <= 2.5.0 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) ) ++#undef pci_register_driver ++#define pci_register_driver pci_module_init ++ ++#define dev_err(__unused_dev, format, arg...) \ ++ printk(KERN_ERR "%s: " format, pci_name(adapter->pdev) , ## arg) ++#define dev_warn(__unused_dev, format, arg...) \ ++ printk(KERN_WARNING "%s: " format, pci_name(pdev) , ## arg) ++ ++/* hlist_* code - double linked lists */ ++struct hlist_head { ++ struct hlist_node *first; ++}; ++ ++struct hlist_node { ++ struct hlist_node *next, **pprev; ++}; ++ ++static inline void __hlist_del(struct hlist_node *n) ++{ ++ struct hlist_node *next = n->next; ++ struct hlist_node **pprev = n->pprev; ++ *pprev = next; ++ if (next) ++ next->pprev = pprev; ++} ++ ++static inline void hlist_del(struct hlist_node *n) ++{ ++ __hlist_del(n); ++ n->next = NULL; ++ n->pprev = NULL; ++} ++ ++static inline void hlist_add_head(struct hlist_node *n, struct hlist_head *h) ++{ ++ struct hlist_node *first = h->first; ++ n->next = first; ++ if (first) ++ first->pprev = &n->next; ++ h->first = n; ++ n->pprev = &h->first; ++} ++ ++static inline int hlist_empty(const struct hlist_head *h) ++{ ++ return !h->first; ++} ++#define HLIST_HEAD_INIT { .first = NULL } ++#define HLIST_HEAD(name) struct hlist_head name = { .first = NULL } ++#define INIT_HLIST_HEAD(ptr) ((ptr)->first = NULL) ++static inline void INIT_HLIST_NODE(struct hlist_node *h) ++{ ++ h->next = NULL; ++ h->pprev = NULL; ++} ++#define hlist_entry(ptr, type, member) container_of(ptr,type,member) ++ ++#define hlist_for_each_entry(tpos, pos, head, member) \ ++ for (pos = (head)->first; \ ++ pos && ({ prefetch(pos->next); 1;}) && \ ++ ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ ++ pos = pos->next) ++ ++#define hlist_for_each_entry_safe(tpos, pos, n, head, member) \ ++ for (pos = (head)->first; \ ++ pos && ({ n = pos->next; 1; }) && \ ++ ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ ++ pos = n) ++ ++/* we ignore GFP here */ ++#define dma_alloc_coherent(dv, sz, dma, gfp) \ ++ pci_alloc_consistent(pdev, (sz), (dma)) ++#define dma_free_coherent(dv, sz, addr, dma_addr) \ ++ pci_free_consistent(pdev, (sz), (addr), (dma_addr)) ++ ++#ifndef might_sleep ++#define might_sleep() ++#endif ++ ++#endif /* <= 2.5.0 */ ++ ++/*****************************************************************************/ ++/* 2.5.28 => 2.4.23 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,5,28) ) ++ ++static inline void _kc_synchronize_irq(void) ++{ ++ synchronize_irq(); ++} ++#undef synchronize_irq ++#define synchronize_irq(X) _kc_synchronize_irq() ++ ++#include ++#define work_struct tq_struct ++#undef INIT_WORK ++#define INIT_WORK(a,b) INIT_TQUEUE(a,(void (*)(void *))b,a) ++#undef container_of ++#define container_of list_entry ++#define schedule_work schedule_task ++#define flush_scheduled_work flush_scheduled_tasks ++#define cancel_work_sync(x) flush_scheduled_work() ++ ++#endif /* 2.5.28 => 2.4.17 */ ++ ++/*****************************************************************************/ ++/* 2.6.0 => 2.5.28 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) ) ++#define MODULE_INFO(version, _version) ++#ifndef CONFIG_E1000_DISABLE_PACKET_SPLIT ++#define CONFIG_E1000_DISABLE_PACKET_SPLIT 1 ++#endif ++#define CONFIG_IGB_DISABLE_PACKET_SPLIT 1 ++ ++#define pci_set_consistent_dma_mask(dev,mask) 1 ++ ++#undef dev_put ++#define dev_put(dev) __dev_put(dev) ++ ++#ifndef skb_fill_page_desc ++#define skb_fill_page_desc _kc_skb_fill_page_desc ++extern void _kc_skb_fill_page_desc(struct sk_buff *skb, int i, struct page *page, int off, int size); ++#endif ++ ++#undef ALIGN ++#define ALIGN(x,a) (((x)+(a)-1)&~((a)-1)) ++ ++#ifndef page_count ++#define page_count(p) atomic_read(&(p)->count) ++#endif ++ ++/* find_first_bit and find_next bit are not defined for most ++ * 2.4 kernels (except for the redhat 2.4.21 kernels ++ */ ++#include ++#define BITOP_WORD(nr) ((nr) / BITS_PER_LONG) ++#undef find_next_bit ++#define find_next_bit _kc_find_next_bit ++extern unsigned long _kc_find_next_bit(const unsigned long *addr, ++ unsigned long size, ++ unsigned long offset); ++#define find_first_bit(addr, size) find_next_bit((addr), (size), 0) ++ ++#endif /* 2.6.0 => 2.5.28 */ ++ ++/*****************************************************************************/ ++/* 2.6.4 => 2.6.0 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,4) ) ++#define MODULE_VERSION(_version) MODULE_INFO(version, _version) ++#endif /* 2.6.4 => 2.6.0 */ ++ ++/*****************************************************************************/ ++/* 2.6.5 => 2.6.0 */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,5) ) ++#define pci_dma_sync_single_for_cpu pci_dma_sync_single ++#define pci_dma_sync_single_for_device pci_dma_sync_single_for_cpu ++#endif /* 2.6.5 => 2.6.0 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,6) ) ++/* taken from 2.6 include/linux/bitmap.h */ ++#undef bitmap_zero ++#define bitmap_zero _kc_bitmap_zero ++static inline void _kc_bitmap_zero(unsigned long *dst, int nbits) ++{ ++ if (nbits <= BITS_PER_LONG) ++ *dst = 0UL; ++ else { ++ int len = BITS_TO_LONGS(nbits) * sizeof(unsigned long); ++ memset(dst, 0, len); ++ } ++} ++#endif /* < 2.6.6 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,7) ) ++#undef if_mii ++#define if_mii _kc_if_mii ++static inline struct mii_ioctl_data *_kc_if_mii(struct ifreq *rq) ++{ ++ return (struct mii_ioctl_data *) &rq->ifr_ifru; ++} ++#endif /* < 2.6.7 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,8) ) ++#ifndef PCI_EXP_DEVCTL ++#define PCI_EXP_DEVCTL 8 ++#endif ++#ifndef PCI_EXP_DEVCTL_CERE ++#define PCI_EXP_DEVCTL_CERE 0x0001 ++#endif ++#define msleep(x) do { set_current_state(TASK_UNINTERRUPTIBLE); \ ++ schedule_timeout((x * HZ)/1000 + 2); \ ++ } while (0) ++ ++#endif /* < 2.6.8 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,9)) ++#include ++#define __iomem ++ ++#ifndef kcalloc ++#define kcalloc(n, size, flags) _kc_kzalloc(((n) * (size)), flags) ++extern void *_kc_kzalloc(size_t size, int flags); ++#endif ++#define MSEC_PER_SEC 1000L ++static inline unsigned int _kc_jiffies_to_msecs(const unsigned long j) ++{ ++#if HZ <= MSEC_PER_SEC && !(MSEC_PER_SEC % HZ) ++ return (MSEC_PER_SEC / HZ) * j; ++#elif HZ > MSEC_PER_SEC && !(HZ % MSEC_PER_SEC) ++ return (j + (HZ / MSEC_PER_SEC) - 1)/(HZ / MSEC_PER_SEC); ++#else ++ return (j * MSEC_PER_SEC) / HZ; ++#endif ++} ++static inline unsigned long _kc_msecs_to_jiffies(const unsigned int m) ++{ ++ if (m > _kc_jiffies_to_msecs(MAX_JIFFY_OFFSET)) ++ return MAX_JIFFY_OFFSET; ++#if HZ <= MSEC_PER_SEC && !(MSEC_PER_SEC % HZ) ++ return (m + (MSEC_PER_SEC / HZ) - 1) / (MSEC_PER_SEC / HZ); ++#elif HZ > MSEC_PER_SEC && !(HZ % MSEC_PER_SEC) ++ return m * (HZ / MSEC_PER_SEC); ++#else ++ return (m * HZ + MSEC_PER_SEC - 1) / MSEC_PER_SEC; ++#endif ++} ++ ++#define msleep_interruptible _kc_msleep_interruptible ++static inline unsigned long _kc_msleep_interruptible(unsigned int msecs) ++{ ++ unsigned long timeout = _kc_msecs_to_jiffies(msecs) + 1; ++ ++ while (timeout && !signal_pending(current)) { ++ __set_current_state(TASK_INTERRUPTIBLE); ++ timeout = schedule_timeout(timeout); ++ } ++ return _kc_jiffies_to_msecs(timeout); ++} ++ ++/* Basic mode control register. */ ++#define BMCR_SPEED1000 0x0040 /* MSB of Speed (1000) */ ++ ++#ifndef __le16 ++#define __le16 u16 ++#endif ++#ifndef __le32 ++#define __le32 u32 ++#endif ++#ifndef __le64 ++#define __le64 u64 ++#endif ++ ++#ifdef pci_dma_mapping_error ++#undef pci_dma_mapping_error ++#endif ++#define pci_dma_mapping_error _kc_pci_dma_mapping_error ++static inline int _kc_pci_dma_mapping_error(struct pci_dev *pdev, ++ dma_addr_t dma_addr) ++{ ++ return dma_addr == 0; ++} ++ ++#endif /* < 2.6.9 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10) ) ++#ifdef module_param_array_named ++#undef module_param_array_named ++#define module_param_array_named(name, array, type, nump, perm) \ ++ static struct kparam_array __param_arr_##name \ ++ = { ARRAY_SIZE(array), nump, param_set_##type, param_get_##type, \ ++ sizeof(array[0]), array }; \ ++ module_param_call(name, param_array_set, param_array_get, \ ++ &__param_arr_##name, perm) ++#endif /* module_param_array_named */ ++#endif /* < 2.6.10 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,11) ) ++#define PCI_D0 0 ++#define PCI_D1 1 ++#define PCI_D2 2 ++#define PCI_D3hot 3 ++#define PCI_D3cold 4 ++typedef int pci_power_t; ++#define pci_choose_state(pdev,state) state ++#define PMSG_SUSPEND 3 ++#define PCI_EXP_LNKCTL 16 ++ ++#undef NETIF_F_LLTX ++ ++#ifndef ARCH_HAS_PREFETCH ++#define prefetch(X) ++#endif ++ ++#ifndef NET_IP_ALIGN ++#define NET_IP_ALIGN 2 ++#endif ++ ++#define KC_USEC_PER_SEC 1000000L ++#define usecs_to_jiffies _kc_usecs_to_jiffies ++static inline unsigned int _kc_jiffies_to_usecs(const unsigned long j) ++{ ++#if HZ <= KC_USEC_PER_SEC && !(KC_USEC_PER_SEC % HZ) ++ return (KC_USEC_PER_SEC / HZ) * j; ++#elif HZ > KC_USEC_PER_SEC && !(HZ % KC_USEC_PER_SEC) ++ return (j + (HZ / KC_USEC_PER_SEC) - 1)/(HZ / KC_USEC_PER_SEC); ++#else ++ return (j * KC_USEC_PER_SEC) / HZ; ++#endif ++} ++static inline unsigned long _kc_usecs_to_jiffies(const unsigned int m) ++{ ++ if (m > _kc_jiffies_to_usecs(MAX_JIFFY_OFFSET)) ++ return MAX_JIFFY_OFFSET; ++#if HZ <= KC_USEC_PER_SEC && !(KC_USEC_PER_SEC % HZ) ++ return (m + (KC_USEC_PER_SEC / HZ) - 1) / (KC_USEC_PER_SEC / HZ); ++#elif HZ > KC_USEC_PER_SEC && !(HZ % KC_USEC_PER_SEC) ++ return m * (HZ / KC_USEC_PER_SEC); ++#else ++ return (m * HZ + KC_USEC_PER_SEC - 1) / KC_USEC_PER_SEC; ++#endif ++} ++#endif /* < 2.6.11 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,12) ) ++#include ++#define USE_REBOOT_NOTIFIER ++ ++/* Generic MII registers. */ ++#define MII_CTRL1000 0x09 /* 1000BASE-T control */ ++#define MII_STAT1000 0x0a /* 1000BASE-T status */ ++/* Advertisement control register. */ ++#define ADVERTISE_PAUSE_CAP 0x0400 /* Try for pause */ ++#define ADVERTISE_PAUSE_ASYM 0x0800 /* Try for asymmetric pause */ ++/* 1000BASE-T Control register */ ++#define ADVERTISE_1000FULL 0x0200 /* Advertise 1000BASE-T full duplex */ ++#endif /* < 2.6.12 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,14) ) ++#define pm_message_t u32 ++#ifndef kzalloc ++#define kzalloc _kc_kzalloc ++extern void *_kc_kzalloc(size_t size, int flags); ++#endif ++ ++/* Generic MII registers. */ ++#define MII_ESTATUS 0x0f /* Extended Status */ ++/* Basic mode status register. */ ++#define BMSR_ESTATEN 0x0100 /* Extended Status in R15 */ ++/* Extended status register. */ ++#define ESTATUS_1000_TFULL 0x2000 /* Can do 1000BT Full */ ++#define ESTATUS_1000_THALF 0x1000 /* Can do 1000BT Half */ ++#endif /* < 2.6.14 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,15) ) ++#ifndef device_can_wakeup ++#define device_can_wakeup(dev) (1) ++#endif ++#ifndef device_set_wakeup_enable ++#define device_set_wakeup_enable(dev, val) do{}while(0) ++#endif ++#ifndef device_init_wakeup ++#define device_init_wakeup(dev,val) do {} while (0) ++#endif ++#endif /* < 2.6.15 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,16) ) ++#define DEFINE_MUTEX(x) DECLARE_MUTEX(x) ++#define mutex_lock(x) down_interruptible(x) ++#define mutex_unlock(x) up(x) ++ ++#undef HAVE_PCI_ERS ++#else /* 2.6.16 and above */ ++#undef HAVE_PCI_ERS ++#define HAVE_PCI_ERS ++#endif /* < 2.6.16 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18) ) ++ ++#ifndef IRQ_HANDLED ++#define irqreturn_t void ++#define IRQ_HANDLED ++#define IRQ_NONE ++#endif ++ ++#ifndef IRQF_PROBE_SHARED ++#ifdef SA_PROBEIRQ ++#define IRQF_PROBE_SHARED SA_PROBEIRQ ++#else ++#define IRQF_PROBE_SHARED 0 ++#endif ++#endif ++ ++#ifndef IRQF_SHARED ++#define IRQF_SHARED SA_SHIRQ ++#endif ++ ++#ifndef ARRAY_SIZE ++#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) ++#endif ++ ++#ifndef netdev_alloc_skb ++#define netdev_alloc_skb _kc_netdev_alloc_skb ++extern struct sk_buff *_kc_netdev_alloc_skb(struct net_device *dev, ++ unsigned int length); ++#endif ++ ++#ifndef skb_is_gso ++#ifdef NETIF_F_TSO ++#define skb_is_gso _kc_skb_is_gso ++static inline int _kc_skb_is_gso(const struct sk_buff *skb) ++{ ++ return skb_shinfo(skb)->gso_size; ++} ++#else ++#define skb_is_gso(a) 0 ++#endif ++#endif ++ ++#endif /* < 2.6.18 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) ) ++ ++#ifndef DIV_ROUND_UP ++#define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d)) ++#endif ++#if ( LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) ) ++#ifndef RHEL_RELEASE_CODE ++#define RHEL_RELEASE_CODE 0 ++#endif ++#ifndef RHEL_RELEASE_VERSION ++#define RHEL_RELEASE_VERSION(a,b) 0 ++#endif ++#ifndef AX_RELEASE_CODE ++#define AX_RELEASE_CODE 0 ++#endif ++#ifndef AX_RELEASE_VERSION ++#define AX_RELEASE_VERSION(a,b) 0 ++#endif ++#if (!(( RHEL_RELEASE_CODE > RHEL_RELEASE_VERSION(4,4) ) && ( RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(5,0) ) || ( RHEL_RELEASE_CODE > RHEL_RELEASE_VERSION(5,0) ) || (AX_RELEASE_CODE > AX_RELEASE_VERSION(3,0)))) ++typedef irqreturn_t (*irq_handler_t)(int, void*, struct pt_regs *); ++#endif ++#if (RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(6,0)) ++#undef CONFIG_INET_LRO ++#undef CONFIG_INET_LRO_MODULE ++#endif ++typedef irqreturn_t (*new_handler_t)(int, void*); ++static inline irqreturn_t _kc_request_irq(unsigned int irq, new_handler_t handler, unsigned long flags, const char *devname, void *dev_id) ++#else /* 2.4.x */ ++typedef void (*irq_handler_t)(int, void*, struct pt_regs *); ++typedef void (*new_handler_t)(int, void*); ++static inline int _kc_request_irq(unsigned int irq, new_handler_t handler, unsigned long flags, const char *devname, void *dev_id) ++#endif /* >= 2.5.x */ ++{ ++ irq_handler_t new_handler = (irq_handler_t) handler; ++ return request_irq(irq, new_handler, flags, devname, dev_id); ++} ++ ++#undef request_irq ++#define request_irq(irq, handler, flags, devname, dev_id) _kc_request_irq((irq), (handler), (flags), (devname), (dev_id)) ++ ++#define irq_handler_t new_handler_t ++/* pci_restore_state and pci_save_state handles MSI/PCIE from 2.6.19 */ ++#define PCIE_CONFIG_SPACE_LEN 256 ++#define PCI_CONFIG_SPACE_LEN 64 ++#define PCIE_LINK_STATUS 0x12 ++#define pci_config_space_ich8lan() do {} while(0) ++#undef pci_save_state ++extern int _kc_pci_save_state(struct pci_dev *); ++#define pci_save_state(pdev) _kc_pci_save_state(pdev) ++#undef pci_restore_state ++extern void _kc_pci_restore_state(struct pci_dev *); ++#define pci_restore_state(pdev) _kc_pci_restore_state(pdev) ++#ifdef HAVE_PCI_ERS ++#undef free_netdev ++extern void _kc_free_netdev(struct net_device *); ++#define free_netdev(netdev) _kc_free_netdev(netdev) ++#endif ++static inline int pci_enable_pcie_error_reporting(struct pci_dev *dev) ++{ ++ return 0; ++} ++#define pci_disable_pcie_error_reporting(dev) do {} while (0) ++#define pci_cleanup_aer_uncorrect_error_status(dev) do {} while (0) ++#else /* 2.6.19 */ ++#include ++#endif /* < 2.6.19 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) ) ++#if ( LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,28) ) ++#undef INIT_WORK ++#define INIT_WORK(_work, _func) \ ++do { \ ++ INIT_LIST_HEAD(&(_work)->entry); \ ++ (_work)->pending = 0; \ ++ (_work)->func = (void (*)(void *))_func; \ ++ (_work)->data = _work; \ ++ init_timer(&(_work)->timer); \ ++} while (0) ++#endif ++ ++#ifndef PCI_VDEVICE ++#define PCI_VDEVICE(ven, dev) \ ++ PCI_VENDOR_ID_##ven, (dev), \ ++ PCI_ANY_ID, PCI_ANY_ID, 0, 0 ++#endif ++ ++#ifndef round_jiffies ++#define round_jiffies(x) x ++#endif ++ ++#define csum_offset csum ++ ++#endif /* < 2.6.20 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21) ) ++#define to_net_dev(class) container_of(class, struct net_device, class_dev) ++#define NETDEV_CLASS_DEV ++#define vlan_group_get_device(vg, id) (vg->vlan_devices[id]) ++#define vlan_group_set_device(vg, id, dev) if (vg) vg->vlan_devices[id] = dev; ++#define pci_channel_offline(pdev) (pdev->error_state && \ ++ pdev->error_state != pci_channel_io_normal) ++#define pci_request_selected_regions(pdev, bars, name) \ ++ pci_request_regions(pdev, name) ++#define pci_release_selected_regions(pdev, bars) pci_release_regions(pdev); ++#endif /* < 2.6.21 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22) ) ++#define tcp_hdr(skb) (skb->h.th) ++#define tcp_hdrlen(skb) (skb->h.th->doff << 2) ++#define skb_transport_offset(skb) (skb->h.raw - skb->data) ++#define skb_transport_header(skb) (skb->h.raw) ++#define ipv6_hdr(skb) (skb->nh.ipv6h) ++#define ip_hdr(skb) (skb->nh.iph) ++#define skb_network_offset(skb) (skb->nh.raw - skb->data) ++#define skb_network_header(skb) (skb->nh.raw) ++#define skb_tail_pointer(skb) skb->tail ++#define skb_copy_to_linear_data_offset(skb, offset, from, len) \ ++ memcpy(skb->data + offset, from, len) ++#define skb_network_header_len(skb) (skb->h.raw - skb->nh.raw) ++#define pci_register_driver pci_module_init ++#define skb_mac_header(skb) skb->mac.raw ++ ++#ifdef NETIF_F_MULTI_QUEUE ++#ifndef alloc_etherdev_mq ++#define alloc_etherdev_mq(_a, _b) alloc_etherdev(_a) ++#endif ++#endif /* NETIF_F_MULTI_QUEUE */ ++ ++#ifndef ETH_FCS_LEN ++#define ETH_FCS_LEN 4 ++#endif ++#define cancel_work_sync(x) flush_scheduled_work() ++#ifndef udp_hdr ++#define udp_hdr _udp_hdr ++static inline struct udphdr *_udp_hdr(const struct sk_buff *skb) ++{ ++ return (struct udphdr *)skb_transport_header(skb); ++} ++#endif ++#endif /* < 2.6.22 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE > KERNEL_VERSION(2,6,22) ) ++#undef ETHTOOL_GPERMADDR ++#endif /* > 2.6.22 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23) ) ++#define netif_subqueue_stopped(_a, _b) 0 ++#endif /* < 2.6.23 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) ) ++/* NAPI API changes in 2.6.24 break everything */ ++struct napi_struct { ++ /* used to look up the real NAPI polling routine */ ++ int (*poll)(struct napi_struct *, int); ++ struct net_device poll_dev; ++ int weight; ++}; ++#ifdef NAPI ++extern int __kc_adapter_clean(struct net_device *, int *); ++extern struct net_device * napi_to_netdev(struct napi_struct *); ++#define napi_to_poll_dev(_napi) &(_napi)->poll_dev ++#define napi_enable(napi) do { \ ++ /* abuse if_port as a counter */ \ ++ if (!adapter->netdev->if_port) { \ ++ netif_poll_enable(adapter->netdev); \ ++ } \ ++ ++adapter->netdev->if_port; \ ++ netif_poll_enable(&(napi)->poll_dev); \ ++ } while (0) ++#define napi_disable(_napi) do { \ ++ netif_poll_disable(&(_napi)->poll_dev); \ ++ --adapter->netdev->if_port; \ ++ if (!adapter->netdev->if_port) \ ++ netif_poll_disable(adapter->netdev); \ ++ } while (0) ++ ++#define netif_napi_add(_netdev, _napi, _poll, _weight) \ ++ do { \ ++ struct napi_struct *__napi = (_napi); \ ++ __napi->poll_dev.poll = &(__kc_adapter_clean); \ ++ __napi->poll_dev.priv = (_napi); \ ++ __napi->poll_dev.weight = (_weight); \ ++ dev_hold(&__napi->poll_dev); \ ++ set_bit(__LINK_STATE_START, &__napi->poll_dev.state);\ ++ _netdev->poll = &(__kc_adapter_clean); \ ++ _netdev->weight = (_weight); \ ++ __napi->poll = &(_poll); \ ++ __napi->weight = (_weight); \ ++ set_bit(__LINK_STATE_RX_SCHED, &(_netdev)->state); \ ++ set_bit(__LINK_STATE_RX_SCHED, &__napi->poll_dev.state); \ ++ } while (0) ++#define netif_napi_del(_napi) \ ++ do { \ ++ WARN_ON(!test_bit(__LINK_STATE_RX_SCHED, &(_napi)->poll_dev.state)); \ ++ dev_put(&(_napi)->poll_dev); \ ++ memset(&(_napi)->poll_dev, 0, sizeof(struct napi_struct));\ ++ } while (0) ++extern int _kc_napi_schedule_prep(struct napi_struct *napi); ++#define napi_schedule_prep _kc_napi_schedule_prep ++#define napi_schedule(napi) netif_rx_schedule(napi_to_poll_dev(napi)) ++#define __napi_schedule(napi) __netif_rx_schedule(napi_to_poll_dev(napi)) ++#define napi_complete(napi) netif_rx_complete(napi_to_poll_dev(napi)) ++#else /* NAPI */ ++#define netif_napi_add(_netdev, _napi, _poll, _weight) \ ++ do { \ ++ struct napi_struct *__napi = _napi; \ ++ _netdev->poll = &(_poll); \ ++ _netdev->weight = (_weight); \ ++ __napi->poll = &(_poll); \ ++ __napi->weight = (_weight); \ ++ } while (0) ++#define netif_napi_del(_a) do {} while (0) ++#endif /* NAPI */ ++ ++#undef dev_get_by_name ++#define dev_get_by_name(_a, _b) dev_get_by_name(_b) ++#define __netif_subqueue_stopped(_a, _b) netif_subqueue_stopped(_a, _b) ++#define DMA_BIT_MASK(n) (((n) == 64) ? ~0ULL : ((1ULL<<(n))-1)) ++#else /* < 2.6.24 */ ++#define HAVE_NETDEV_NAPI_LIST ++#endif /* < 2.6.24 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE > KERNEL_VERSION(2,6,24) ) ++#include ++#endif /* > 2.6.24 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25) ) ++#define PM_QOS_CPU_DMA_LATENCY 1 ++ ++#if ( LINUX_VERSION_CODE > KERNEL_VERSION(2,6,18) ) ++#include ++#define PM_QOS_DEFAULT_VALUE INFINITE_LATENCY ++#define pm_qos_add_requirement(pm_qos_class, name, value) \ ++ set_acceptable_latency(name, value) ++#define pm_qos_remove_requirement(pm_qos_class, name) \ ++ remove_acceptable_latency(name) ++#define pm_qos_update_requirement(pm_qos_class, name, value) \ ++ modify_acceptable_latency(name, value) ++#else ++#define PM_QOS_DEFAULT_VALUE -1 ++#define pm_qos_add_requirement(pm_qos_class, name, value) ++#define pm_qos_remove_requirement(pm_qos_class, name) ++#define pm_qos_update_requirement(pm_qos_class, name, value) { \ ++ if (value != PM_QOS_DEFAULT_VALUE) { \ ++ printk(KERN_WARNING "%s: unable to set PM QoS requirement\n", \ ++ pci_name(adapter->pdev)); \ ++ } \ ++} ++#endif /* > 2.6.18 */ ++ ++#define pci_enable_device_mem(pdev) pci_enable_device(pdev) ++ ++#endif /* < 2.6.25 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26) ) ++#ifdef NETIF_F_TSO ++#ifdef NETIF_F_TSO6 ++#define netif_set_gso_max_size(_netdev, size) \ ++ do { \ ++ if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) { \ ++ _netdev->features &= ~NETIF_F_TSO; \ ++ _netdev->features &= ~NETIF_F_TSO6; \ ++ } else { \ ++ _netdev->features |= NETIF_F_TSO; \ ++ _netdev->features |= NETIF_F_TSO6; \ ++ } \ ++ } while (0) ++#else /* NETIF_F_TSO6 */ ++#define netif_set_gso_max_size(_netdev, size) \ ++ do { \ ++ if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) \ ++ _netdev->features &= ~NETIF_F_TSO; \ ++ else \ ++ _netdev->features |= NETIF_F_TSO; \ ++ } while (0) ++#endif /* NETIF_F_TSO6 */ ++#else ++#define netif_set_gso_max_size(_netdev, size) do {} while (0) ++#endif /* NETIF_F_TSO */ ++#else /* < 2.6.26 */ ++#include ++#define HAVE_NETDEV_VLAN_FEATURES ++#endif /* < 2.6.26 */ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27) ) ++#if ( LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,15) ) ++#if (((LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)) && defined(CONFIG_PM)) || ((LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)) && defined(CONFIG_PM_SLEEP))) ++#undef device_set_wakeup_enable ++#define device_set_wakeup_enable(dev, val) \ ++ do { \ ++ u16 pmc = 0; \ ++ int pm = pci_find_capability(adapter->pdev, PCI_CAP_ID_PM); \ ++ if (pm) { \ ++ pci_read_config_word(adapter->pdev, pm + PCI_PM_PMC, \ ++ &pmc); \ ++ } \ ++ (dev)->power.can_wakeup = !!(pmc >> 11); \ ++ (dev)->power.should_wakeup = (val && (pmc >> 11)); \ ++ } while (0) ++#endif /* 2.6.15-2.6.22 and CONFIG_PM or 2.6.23-2.6.25 and CONFIG_PM_SLEEP */ ++#endif /* 2.6.15 through 2.6.27 */ ++#ifndef netif_napi_del ++#define netif_napi_del(_a) do {} while (0) ++#ifdef NAPI ++#ifdef CONFIG_NETPOLL ++#undef netif_napi_del ++#define netif_napi_del(_a) list_del(&(_a)->dev_list); ++#endif ++#endif ++#endif /* netif_napi_del */ ++#ifndef pci_dma_mapping_error ++#define pci_dma_mapping_error(pdev, dma_addr) pci_dma_mapping_error(dma_addr) ++#endif ++ ++#ifdef CONFIG_NETDEVICES_MULTIQUEUE ++#define HAVE_TX_MQ ++#endif ++ ++#ifdef HAVE_TX_MQ ++extern void _kc_netif_tx_stop_all_queues(struct net_device *); ++extern void _kc_netif_tx_wake_all_queues(struct net_device *); ++extern void _kc_netif_tx_start_all_queues(struct net_device *); ++#define netif_tx_stop_all_queues(a) _kc_netif_tx_stop_all_queues(a) ++#define netif_tx_wake_all_queues(a) _kc_netif_tx_wake_all_queues(a) ++#define netif_tx_start_all_queues(a) _kc_netif_tx_start_all_queues(a) ++#undef netif_stop_subqueue ++#define netif_stop_subqueue(_ndev,_qi) do { \ ++ if (netif_is_multiqueue((_ndev))) \ ++ netif_stop_subqueue((_ndev), (_qi)); \ ++ else \ ++ netif_stop_queue((_ndev)); \ ++ } while (0) ++#undef netif_start_subqueue ++#define netif_start_subqueue(_ndev,_qi) do { \ ++ if (netif_is_multiqueue((_ndev))) \ ++ netif_start_subqueue((_ndev), (_qi)); \ ++ else \ ++ netif_start_queue((_ndev)); \ ++ } while (0) ++#else /* HAVE_TX_MQ */ ++#define netif_tx_stop_all_queues(a) netif_stop_queue(a) ++#define netif_tx_wake_all_queues(a) netif_wake_queue(a) ++#if ( LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,12) ) ++#define netif_tx_start_all_queues(a) netif_start_queue(a) ++#else ++#define netif_tx_start_all_queues(a) do {} while (0) ++#endif ++#define netif_stop_subqueue(_ndev,_qi) netif_stop_queue((_ndev)) ++#define netif_start_subqueue(_ndev,_qi) netif_start_queue((_ndev)) ++#endif /* HAVE_TX_MQ */ ++#ifndef NETIF_F_MULTI_QUEUE ++#define NETIF_F_MULTI_QUEUE 0 ++#define netif_is_multiqueue(a) 0 ++#define netif_wake_subqueue(a, b) ++#endif /* NETIF_F_MULTI_QUEUE */ ++#else /* < 2.6.27 */ ++#define HAVE_TX_MQ ++#define HAVE_NETDEV_SELECT_QUEUE ++#endif /* < 2.6.27 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,28) ) ++#define pci_ioremap_bar(pdev, bar) ioremap(pci_resource_start(pdev, bar), \ ++ pci_resource_len(pdev, bar)) ++#define pci_wake_from_d3 _kc_pci_wake_from_d3 ++#define pci_prepare_to_sleep _kc_pci_prepare_to_sleep ++extern int _kc_pci_wake_from_d3(struct pci_dev *dev, bool enable); ++extern int _kc_pci_prepare_to_sleep(struct pci_dev *dev); ++#endif /* < 2.6.28 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29) ) ++#define pci_request_selected_regions_exclusive(pdev, bars, name) \ ++ pci_request_selected_regions(pdev, bars, name) ++extern void _kc_pci_disable_link_state(struct pci_dev *dev, int state); ++#define pci_disable_link_state(p, s) _kc_pci_disable_link_state(p, s) ++#else /* < 2.6.29 */ ++#ifdef CONFIG_DCB ++#define HAVE_PFC_MODE_ENABLE ++#endif /* CONFIG_DCB */ ++#endif /* < 2.6.29 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30) ) ++extern u16 _kc_skb_tx_hash(struct net_device *dev, struct sk_buff *skb); ++#define skb_tx_hash(n, s) _kc_skb_tx_hash(n, s) ++#else ++#define HAVE_ASPM_QUIRKS ++#endif /* < 2.6.30 */ ++ ++/*****************************************************************************/ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,31) ) ++#else ++#ifndef HAVE_NETDEV_STORAGE_ADDRESS ++#define HAVE_NETDEV_STORAGE_ADDRESS ++#endif ++#endif /* < 2.6.31 */ ++#endif /* _KCOMPAT_H_ */ +diff -r 3e5bbd731d89 drivers/net/ixgbe/kcompat_ethtool.c +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/ixgbe/kcompat_ethtool.c Mon Jun 15 12:06:28 2009 +0100 +@@ -0,0 +1,1168 @@ ++/******************************************************************************* ++ ++ Intel 10 Gigabit PCI Express Linux driver ++ Copyright(c) 1999 - 2009 Intel Corporation. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms and conditions of the GNU General Public License, ++ version 2, as published by the Free Software Foundation. ++ ++ This program is distributed in the hope it will be 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., ++ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ The full GNU General Public License is included in this distribution in ++ the file called "COPYING". ++ ++ Contact Information: ++ e1000-devel Mailing List ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++/* ++ * net/core/ethtool.c - Ethtool ioctl handler ++ * Copyright (c) 2003 Matthew Wilcox ++ * ++ * This file is where we call all the ethtool_ops commands to get ++ * the information ethtool needs. We fall back to calling do_ioctl() ++ * for drivers which haven't been converted to ethtool_ops yet. ++ * ++ * It's GPL, stupid. ++ * ++ * Modification by sfeldma@pobox.com to work as backward compat ++ * solution for pre-ethtool_ops kernels. ++ * - copied struct ethtool_ops from ethtool.h ++ * - defined SET_ETHTOOL_OPS ++ * - put in some #ifndef NETIF_F_xxx wrappers ++ * - changes refs to dev->ethtool_ops to ethtool_ops ++ * - changed dev_ethtool to ethtool_ioctl ++ * - remove EXPORT_SYMBOL()s ++ * - added _kc_ prefix in built-in ethtool_op_xxx ops. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "kcompat.h" ++ ++#undef SUPPORTED_10000baseT_Full ++#define SUPPORTED_10000baseT_Full (1 << 12) ++#undef ADVERTISED_10000baseT_Full ++#define ADVERTISED_10000baseT_Full (1 << 12) ++#undef SPEED_10000 ++#define SPEED_10000 10000 ++ ++#undef ethtool_ops ++#define ethtool_ops _kc_ethtool_ops ++ ++struct _kc_ethtool_ops { ++ int (*get_settings)(struct net_device *, struct ethtool_cmd *); ++ int (*set_settings)(struct net_device *, struct ethtool_cmd *); ++ void (*get_drvinfo)(struct net_device *, struct ethtool_drvinfo *); ++ int (*get_regs_len)(struct net_device *); ++ void (*get_regs)(struct net_device *, struct ethtool_regs *, void *); ++ void (*get_wol)(struct net_device *, struct ethtool_wolinfo *); ++ int (*set_wol)(struct net_device *, struct ethtool_wolinfo *); ++ u32 (*get_msglevel)(struct net_device *); ++ void (*set_msglevel)(struct net_device *, u32); ++ int (*nway_reset)(struct net_device *); ++ u32 (*get_link)(struct net_device *); ++ int (*get_eeprom_len)(struct net_device *); ++ int (*get_eeprom)(struct net_device *, struct ethtool_eeprom *, u8 *); ++ int (*set_eeprom)(struct net_device *, struct ethtool_eeprom *, u8 *); ++ int (*get_coalesce)(struct net_device *, struct ethtool_coalesce *); ++ int (*set_coalesce)(struct net_device *, struct ethtool_coalesce *); ++ void (*get_ringparam)(struct net_device *, struct ethtool_ringparam *); ++ int (*set_ringparam)(struct net_device *, struct ethtool_ringparam *); ++ void (*get_pauseparam)(struct net_device *, ++ struct ethtool_pauseparam*); ++ int (*set_pauseparam)(struct net_device *, ++ struct ethtool_pauseparam*); ++ u32 (*get_rx_csum)(struct net_device *); ++ int (*set_rx_csum)(struct net_device *, u32); ++ u32 (*get_tx_csum)(struct net_device *); ++ int (*set_tx_csum)(struct net_device *, u32); ++ u32 (*get_sg)(struct net_device *); ++ int (*set_sg)(struct net_device *, u32); ++ u32 (*get_tso)(struct net_device *); ++ int (*set_tso)(struct net_device *, u32); ++ int (*self_test_count)(struct net_device *); ++ void (*self_test)(struct net_device *, struct ethtool_test *, u64 *); ++ void (*get_strings)(struct net_device *, u32 stringset, u8 *); ++ int (*phys_id)(struct net_device *, u32); ++ int (*get_stats_count)(struct net_device *); ++ void (*get_ethtool_stats)(struct net_device *, struct ethtool_stats *, ++ u64 *); ++} *ethtool_ops = NULL; ++ ++#undef SET_ETHTOOL_OPS ++#define SET_ETHTOOL_OPS(netdev, ops) (ethtool_ops = (ops)) ++ ++/* ++ * Some useful ethtool_ops methods that are device independent. If we find that ++ * all drivers want to do the same thing here, we can turn these into dev_() ++ * function calls. ++ */ ++ ++#undef ethtool_op_get_link ++#define ethtool_op_get_link _kc_ethtool_op_get_link ++u32 _kc_ethtool_op_get_link(struct net_device *dev) ++{ ++ return netif_carrier_ok(dev) ? 1 : 0; ++} ++ ++#undef ethtool_op_get_tx_csum ++#define ethtool_op_get_tx_csum _kc_ethtool_op_get_tx_csum ++u32 _kc_ethtool_op_get_tx_csum(struct net_device *dev) ++{ ++#ifdef NETIF_F_IP_CSUM ++ return (dev->features & NETIF_F_IP_CSUM) != 0; ++#else ++ return 0; ++#endif ++} ++ ++#undef ethtool_op_set_tx_csum ++#define ethtool_op_set_tx_csum _kc_ethtool_op_set_tx_csum ++int _kc_ethtool_op_set_tx_csum(struct net_device *dev, u32 data) ++{ ++#ifdef NETIF_F_IP_CSUM ++ if (data) ++#ifdef NETIF_F_IPV6_CSUM ++ dev->features |= (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM); ++ else ++ dev->features &= ~(NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM); ++#else ++ dev->features |= NETIF_F_IP_CSUM; ++ else ++ dev->features &= ~NETIF_F_IP_CSUM; ++#endif ++#endif ++ ++ return 0; ++} ++ ++#undef ethtool_op_get_sg ++#define ethtool_op_get_sg _kc_ethtool_op_get_sg ++u32 _kc_ethtool_op_get_sg(struct net_device *dev) ++{ ++#ifdef NETIF_F_SG ++ return (dev->features & NETIF_F_SG) != 0; ++#else ++ return 0; ++#endif ++} ++ ++#undef ethtool_op_set_sg ++#define ethtool_op_set_sg _kc_ethtool_op_set_sg ++int _kc_ethtool_op_set_sg(struct net_device *dev, u32 data) ++{ ++#ifdef NETIF_F_SG ++ if (data) ++ dev->features |= NETIF_F_SG; ++ else ++ dev->features &= ~NETIF_F_SG; ++#endif ++ ++ return 0; ++} ++ ++#undef ethtool_op_get_tso ++#define ethtool_op_get_tso _kc_ethtool_op_get_tso ++u32 _kc_ethtool_op_get_tso(struct net_device *dev) ++{ ++#ifdef NETIF_F_TSO ++ return (dev->features & NETIF_F_TSO) != 0; ++#else ++ return 0; ++#endif ++} ++ ++#undef ethtool_op_set_tso ++#define ethtool_op_set_tso _kc_ethtool_op_set_tso ++int _kc_ethtool_op_set_tso(struct net_device *dev, u32 data) ++{ ++#ifdef NETIF_F_TSO ++ if (data) ++ dev->features |= NETIF_F_TSO; ++ else ++ dev->features &= ~NETIF_F_TSO; ++#endif ++ ++ return 0; ++} ++ ++/* Handlers for each ethtool command */ ++ ++static int ethtool_get_settings(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_cmd cmd = { ETHTOOL_GSET }; ++ int err; ++ ++ if (!ethtool_ops->get_settings) ++ return -EOPNOTSUPP; ++ ++ err = ethtool_ops->get_settings(dev, &cmd); ++ if (err < 0) ++ return err; ++ ++ if (copy_to_user(useraddr, &cmd, sizeof(cmd))) ++ return -EFAULT; ++ return 0; ++} ++ ++static int ethtool_set_settings(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_cmd cmd; ++ ++ if (!ethtool_ops->set_settings) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&cmd, useraddr, sizeof(cmd))) ++ return -EFAULT; ++ ++ return ethtool_ops->set_settings(dev, &cmd); ++} ++ ++static int ethtool_get_drvinfo(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_drvinfo info; ++ struct ethtool_ops *ops = ethtool_ops; ++ ++ if (!ops->get_drvinfo) ++ return -EOPNOTSUPP; ++ ++ memset(&info, 0, sizeof(info)); ++ info.cmd = ETHTOOL_GDRVINFO; ++ ops->get_drvinfo(dev, &info); ++ ++ if (ops->self_test_count) ++ info.testinfo_len = ops->self_test_count(dev); ++ if (ops->get_stats_count) ++ info.n_stats = ops->get_stats_count(dev); ++ if (ops->get_regs_len) ++ info.regdump_len = ops->get_regs_len(dev); ++ if (ops->get_eeprom_len) ++ info.eedump_len = ops->get_eeprom_len(dev); ++ ++ if (copy_to_user(useraddr, &info, sizeof(info))) ++ return -EFAULT; ++ return 0; ++} ++ ++static int ethtool_get_regs(struct net_device *dev, char *useraddr) ++{ ++ struct ethtool_regs regs; ++ struct ethtool_ops *ops = ethtool_ops; ++ void *regbuf; ++ int reglen, ret; ++ ++ if (!ops->get_regs || !ops->get_regs_len) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(®s, useraddr, sizeof(regs))) ++ return -EFAULT; ++ ++ reglen = ops->get_regs_len(dev); ++ if (regs.len > reglen) ++ regs.len = reglen; ++ ++ regbuf = kmalloc(reglen, GFP_USER); ++ if (!regbuf) ++ return -ENOMEM; ++ ++ ops->get_regs(dev, ®s, regbuf); ++ ++ ret = -EFAULT; ++ if (copy_to_user(useraddr, ®s, sizeof(regs))) ++ goto out; ++ useraddr += offsetof(struct ethtool_regs, data); ++ if (copy_to_user(useraddr, regbuf, reglen)) ++ goto out; ++ ret = 0; ++ ++out: ++ kfree(regbuf); ++ return ret; ++} ++ ++static int ethtool_get_wol(struct net_device *dev, char *useraddr) ++{ ++ struct ethtool_wolinfo wol = { ETHTOOL_GWOL }; ++ ++ if (!ethtool_ops->get_wol) ++ return -EOPNOTSUPP; ++ ++ ethtool_ops->get_wol(dev, &wol); ++ ++ if (copy_to_user(useraddr, &wol, sizeof(wol))) ++ return -EFAULT; ++ return 0; ++} ++ ++static int ethtool_set_wol(struct net_device *dev, char *useraddr) ++{ ++ struct ethtool_wolinfo wol; ++ ++ if (!ethtool_ops->set_wol) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&wol, useraddr, sizeof(wol))) ++ return -EFAULT; ++ ++ return ethtool_ops->set_wol(dev, &wol); ++} ++ ++static int ethtool_get_msglevel(struct net_device *dev, char *useraddr) ++{ ++ struct ethtool_value edata = { ETHTOOL_GMSGLVL }; ++ ++ if (!ethtool_ops->get_msglevel) ++ return -EOPNOTSUPP; ++ ++ edata.data = ethtool_ops->get_msglevel(dev); ++ ++ if (copy_to_user(useraddr, &edata, sizeof(edata))) ++ return -EFAULT; ++ return 0; ++} ++ ++static int ethtool_set_msglevel(struct net_device *dev, char *useraddr) ++{ ++ struct ethtool_value edata; ++ ++ if (!ethtool_ops->set_msglevel) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&edata, useraddr, sizeof(edata))) ++ return -EFAULT; ++ ++ ethtool_ops->set_msglevel(dev, edata.data); ++ return 0; ++} ++ ++static int ethtool_nway_reset(struct net_device *dev) ++{ ++ if (!ethtool_ops->nway_reset) ++ return -EOPNOTSUPP; ++ ++ return ethtool_ops->nway_reset(dev); ++} ++ ++static int ethtool_get_link(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_value edata = { ETHTOOL_GLINK }; ++ ++ if (!ethtool_ops->get_link) ++ return -EOPNOTSUPP; ++ ++ edata.data = ethtool_ops->get_link(dev); ++ ++ if (copy_to_user(useraddr, &edata, sizeof(edata))) ++ return -EFAULT; ++ return 0; ++} ++ ++static int ethtool_get_eeprom(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_eeprom eeprom; ++ struct ethtool_ops *ops = ethtool_ops; ++ u8 *data; ++ int ret; ++ ++ if (!ops->get_eeprom || !ops->get_eeprom_len) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&eeprom, useraddr, sizeof(eeprom))) ++ return -EFAULT; ++ ++ /* Check for wrap and zero */ ++ if (eeprom.offset + eeprom.len <= eeprom.offset) ++ return -EINVAL; ++ ++ /* Check for exceeding total eeprom len */ ++ if (eeprom.offset + eeprom.len > ops->get_eeprom_len(dev)) ++ return -EINVAL; ++ ++ data = kmalloc(eeprom.len, GFP_USER); ++ if (!data) ++ return -ENOMEM; ++ ++ ret = -EFAULT; ++ if (copy_from_user(data, useraddr + sizeof(eeprom), eeprom.len)) ++ goto out; ++ ++ ret = ops->get_eeprom(dev, &eeprom, data); ++ if (ret) ++ goto out; ++ ++ ret = -EFAULT; ++ if (copy_to_user(useraddr, &eeprom, sizeof(eeprom))) ++ goto out; ++ if (copy_to_user(useraddr + sizeof(eeprom), data, eeprom.len)) ++ goto out; ++ ret = 0; ++ ++out: ++ kfree(data); ++ return ret; ++} ++ ++static int ethtool_set_eeprom(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_eeprom eeprom; ++ struct ethtool_ops *ops = ethtool_ops; ++ u8 *data; ++ int ret; ++ ++ if (!ops->set_eeprom || !ops->get_eeprom_len) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&eeprom, useraddr, sizeof(eeprom))) ++ return -EFAULT; ++ ++ /* Check for wrap and zero */ ++ if (eeprom.offset + eeprom.len <= eeprom.offset) ++ return -EINVAL; ++ ++ /* Check for exceeding total eeprom len */ ++ if (eeprom.offset + eeprom.len > ops->get_eeprom_len(dev)) ++ return -EINVAL; ++ ++ data = kmalloc(eeprom.len, GFP_USER); ++ if (!data) ++ return -ENOMEM; ++ ++ ret = -EFAULT; ++ if (copy_from_user(data, useraddr + sizeof(eeprom), eeprom.len)) ++ goto out; ++ ++ ret = ops->set_eeprom(dev, &eeprom, data); ++ if (ret) ++ goto out; ++ ++ if (copy_to_user(useraddr + sizeof(eeprom), data, eeprom.len)) ++ ret = -EFAULT; ++ ++out: ++ kfree(data); ++ return ret; ++} ++ ++static int ethtool_get_coalesce(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_coalesce coalesce = { ETHTOOL_GCOALESCE }; ++ ++ if (!ethtool_ops->get_coalesce) ++ return -EOPNOTSUPP; ++ ++ ethtool_ops->get_coalesce(dev, &coalesce); ++ ++ if (copy_to_user(useraddr, &coalesce, sizeof(coalesce))) ++ return -EFAULT; ++ return 0; ++} ++ ++static int ethtool_set_coalesce(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_coalesce coalesce; ++ ++ if (!ethtool_ops->get_coalesce) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&coalesce, useraddr, sizeof(coalesce))) ++ return -EFAULT; ++ ++ return ethtool_ops->set_coalesce(dev, &coalesce); ++} ++ ++static int ethtool_get_ringparam(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_ringparam ringparam = { ETHTOOL_GRINGPARAM }; ++ ++ if (!ethtool_ops->get_ringparam) ++ return -EOPNOTSUPP; ++ ++ ethtool_ops->get_ringparam(dev, &ringparam); ++ ++ if (copy_to_user(useraddr, &ringparam, sizeof(ringparam))) ++ return -EFAULT; ++ return 0; ++} ++ ++static int ethtool_set_ringparam(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_ringparam ringparam; ++ ++ if (!ethtool_ops->get_ringparam) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&ringparam, useraddr, sizeof(ringparam))) ++ return -EFAULT; ++ ++ return ethtool_ops->set_ringparam(dev, &ringparam); ++} ++ ++static int ethtool_get_pauseparam(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_pauseparam pauseparam = { ETHTOOL_GPAUSEPARAM }; ++ ++ if (!ethtool_ops->get_pauseparam) ++ return -EOPNOTSUPP; ++ ++ ethtool_ops->get_pauseparam(dev, &pauseparam); ++ ++ if (copy_to_user(useraddr, &pauseparam, sizeof(pauseparam))) ++ return -EFAULT; ++ return 0; ++} ++ ++static int ethtool_set_pauseparam(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_pauseparam pauseparam; ++ ++ if (!ethtool_ops->get_pauseparam) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&pauseparam, useraddr, sizeof(pauseparam))) ++ return -EFAULT; ++ ++ return ethtool_ops->set_pauseparam(dev, &pauseparam); ++} ++ ++static int ethtool_get_rx_csum(struct net_device *dev, char *useraddr) ++{ ++ struct ethtool_value edata = { ETHTOOL_GRXCSUM }; ++ ++ if (!ethtool_ops->get_rx_csum) ++ return -EOPNOTSUPP; ++ ++ edata.data = ethtool_ops->get_rx_csum(dev); ++ ++ if (copy_to_user(useraddr, &edata, sizeof(edata))) ++ return -EFAULT; ++ return 0; ++} ++ ++static int ethtool_set_rx_csum(struct net_device *dev, char *useraddr) ++{ ++ struct ethtool_value edata; ++ ++ if (!ethtool_ops->set_rx_csum) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&edata, useraddr, sizeof(edata))) ++ return -EFAULT; ++ ++ ethtool_ops->set_rx_csum(dev, edata.data); ++ return 0; ++} ++ ++static int ethtool_get_tx_csum(struct net_device *dev, char *useraddr) ++{ ++ struct ethtool_value edata = { ETHTOOL_GTXCSUM }; ++ ++ if (!ethtool_ops->get_tx_csum) ++ return -EOPNOTSUPP; ++ ++ edata.data = ethtool_ops->get_tx_csum(dev); ++ ++ if (copy_to_user(useraddr, &edata, sizeof(edata))) ++ return -EFAULT; ++ return 0; ++} ++ ++static int ethtool_set_tx_csum(struct net_device *dev, char *useraddr) ++{ ++ struct ethtool_value edata; ++ ++ if (!ethtool_ops->set_tx_csum) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&edata, useraddr, sizeof(edata))) ++ return -EFAULT; ++ ++ return ethtool_ops->set_tx_csum(dev, edata.data); ++} ++ ++static int ethtool_get_sg(struct net_device *dev, char *useraddr) ++{ ++ struct ethtool_value edata = { ETHTOOL_GSG }; ++ ++ if (!ethtool_ops->get_sg) ++ return -EOPNOTSUPP; ++ ++ edata.data = ethtool_ops->get_sg(dev); ++ ++ if (copy_to_user(useraddr, &edata, sizeof(edata))) ++ return -EFAULT; ++ return 0; ++} ++ ++static int ethtool_set_sg(struct net_device *dev, char *useraddr) ++{ ++ struct ethtool_value edata; ++ ++ if (!ethtool_ops->set_sg) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&edata, useraddr, sizeof(edata))) ++ return -EFAULT; ++ ++ return ethtool_ops->set_sg(dev, edata.data); ++} ++ ++static int ethtool_get_tso(struct net_device *dev, char *useraddr) ++{ ++ struct ethtool_value edata = { ETHTOOL_GTSO }; ++ ++ if (!ethtool_ops->get_tso) ++ return -EOPNOTSUPP; ++ ++ edata.data = ethtool_ops->get_tso(dev); ++ ++ if (copy_to_user(useraddr, &edata, sizeof(edata))) ++ return -EFAULT; ++ return 0; ++} ++ ++static int ethtool_set_tso(struct net_device *dev, char *useraddr) ++{ ++ struct ethtool_value edata; ++ ++ if (!ethtool_ops->set_tso) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&edata, useraddr, sizeof(edata))) ++ return -EFAULT; ++ ++ return ethtool_ops->set_tso(dev, edata.data); ++} ++ ++static int ethtool_self_test(struct net_device *dev, char *useraddr) ++{ ++ struct ethtool_test test; ++ struct ethtool_ops *ops = ethtool_ops; ++ u64 *data; ++ int ret; ++ ++ if (!ops->self_test || !ops->self_test_count) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&test, useraddr, sizeof(test))) ++ return -EFAULT; ++ ++ test.len = ops->self_test_count(dev); ++ data = kmalloc(test.len * sizeof(u64), GFP_USER); ++ if (!data) ++ return -ENOMEM; ++ ++ ops->self_test(dev, &test, data); ++ ++ ret = -EFAULT; ++ if (copy_to_user(useraddr, &test, sizeof(test))) ++ goto out; ++ useraddr += sizeof(test); ++ if (copy_to_user(useraddr, data, test.len * sizeof(u64))) ++ goto out; ++ ret = 0; ++ ++out: ++ kfree(data); ++ return ret; ++} ++ ++static int ethtool_get_strings(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_gstrings gstrings; ++ struct ethtool_ops *ops = ethtool_ops; ++ u8 *data; ++ int ret; ++ ++ if (!ops->get_strings) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&gstrings, useraddr, sizeof(gstrings))) ++ return -EFAULT; ++ ++ switch (gstrings.string_set) { ++ case ETH_SS_TEST: ++ if (!ops->self_test_count) ++ return -EOPNOTSUPP; ++ gstrings.len = ops->self_test_count(dev); ++ break; ++ case ETH_SS_STATS: ++ if (!ops->get_stats_count) ++ return -EOPNOTSUPP; ++ gstrings.len = ops->get_stats_count(dev); ++ break; ++ default: ++ return -EINVAL; ++ } ++ ++ data = kmalloc(gstrings.len * ETH_GSTRING_LEN, GFP_USER); ++ if (!data) ++ return -ENOMEM; ++ ++ ops->get_strings(dev, gstrings.string_set, data); ++ ++ ret = -EFAULT; ++ if (copy_to_user(useraddr, &gstrings, sizeof(gstrings))) ++ goto out; ++ useraddr += sizeof(gstrings); ++ if (copy_to_user(useraddr, data, gstrings.len * ETH_GSTRING_LEN)) ++ goto out; ++ ret = 0; ++ ++out: ++ kfree(data); ++ return ret; ++} ++ ++static int ethtool_phys_id(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_value id; ++ ++ if (!ethtool_ops->phys_id) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&id, useraddr, sizeof(id))) ++ return -EFAULT; ++ ++ return ethtool_ops->phys_id(dev, id.data); ++} ++ ++static int ethtool_get_stats(struct net_device *dev, void *useraddr) ++{ ++ struct ethtool_stats stats; ++ struct ethtool_ops *ops = ethtool_ops; ++ u64 *data; ++ int ret; ++ ++ if (!ops->get_ethtool_stats || !ops->get_stats_count) ++ return -EOPNOTSUPP; ++ ++ if (copy_from_user(&stats, useraddr, sizeof(stats))) ++ return -EFAULT; ++ ++ stats.n_stats = ops->get_stats_count(dev); ++ data = kmalloc(stats.n_stats * sizeof(u64), GFP_USER); ++ if (!data) ++ return -ENOMEM; ++ ++ ops->get_ethtool_stats(dev, &stats, data); ++ ++ ret = -EFAULT; ++ if (copy_to_user(useraddr, &stats, sizeof(stats))) ++ goto out; ++ useraddr += sizeof(stats); ++ if (copy_to_user(useraddr, data, stats.n_stats * sizeof(u64))) ++ goto out; ++ ret = 0; ++ ++out: ++ kfree(data); ++ return ret; ++} ++ ++/* The main entry point in this file. Called from net/core/dev.c */ ++ ++#define ETHTOOL_OPS_COMPAT ++int ethtool_ioctl(struct ifreq *ifr) ++{ ++ struct net_device *dev = __dev_get_by_name(ifr->ifr_name); ++ void *useraddr = (void *) ifr->ifr_data; ++ u32 ethcmd; ++ ++ /* ++ * XXX: This can be pushed down into the ethtool_* handlers that ++ * need it. Keep existing behavior for the moment. ++ */ ++ if (!capable(CAP_NET_ADMIN)) ++ return -EPERM; ++ ++ if (!dev || !netif_device_present(dev)) ++ return -ENODEV; ++ ++ if (copy_from_user(ðcmd, useraddr, sizeof (ethcmd))) ++ return -EFAULT; ++ ++ switch (ethcmd) { ++ case ETHTOOL_GSET: ++ return ethtool_get_settings(dev, useraddr); ++ case ETHTOOL_SSET: ++ return ethtool_set_settings(dev, useraddr); ++ case ETHTOOL_GDRVINFO: ++ return ethtool_get_drvinfo(dev, useraddr); ++ case ETHTOOL_GREGS: ++ return ethtool_get_regs(dev, useraddr); ++ case ETHTOOL_GWOL: ++ return ethtool_get_wol(dev, useraddr); ++ case ETHTOOL_SWOL: ++ return ethtool_set_wol(dev, useraddr); ++ case ETHTOOL_GMSGLVL: ++ return ethtool_get_msglevel(dev, useraddr); ++ case ETHTOOL_SMSGLVL: ++ return ethtool_set_msglevel(dev, useraddr); ++ case ETHTOOL_NWAY_RST: ++ return ethtool_nway_reset(dev); ++ case ETHTOOL_GLINK: ++ return ethtool_get_link(dev, useraddr); ++ case ETHTOOL_GEEPROM: ++ return ethtool_get_eeprom(dev, useraddr); ++ case ETHTOOL_SEEPROM: ++ return ethtool_set_eeprom(dev, useraddr); ++ case ETHTOOL_GCOALESCE: ++ return ethtool_get_coalesce(dev, useraddr); ++ case ETHTOOL_SCOALESCE: ++ return ethtool_set_coalesce(dev, useraddr); ++ case ETHTOOL_GRINGPARAM: ++ return ethtool_get_ringparam(dev, useraddr); ++ case ETHTOOL_SRINGPARAM: ++ return ethtool_set_ringparam(dev, useraddr); ++ case ETHTOOL_GPAUSEPARAM: ++ return ethtool_get_pauseparam(dev, useraddr); ++ case ETHTOOL_SPAUSEPARAM: ++ return ethtool_set_pauseparam(dev, useraddr); ++ case ETHTOOL_GRXCSUM: ++ return ethtool_get_rx_csum(dev, useraddr); ++ case ETHTOOL_SRXCSUM: ++ return ethtool_set_rx_csum(dev, useraddr); ++ case ETHTOOL_GTXCSUM: ++ return ethtool_get_tx_csum(dev, useraddr); ++ case ETHTOOL_STXCSUM: ++ return ethtool_set_tx_csum(dev, useraddr); ++ case ETHTOOL_GSG: ++ return ethtool_get_sg(dev, useraddr); ++ case ETHTOOL_SSG: ++ return ethtool_set_sg(dev, useraddr); ++ case ETHTOOL_GTSO: ++ return ethtool_get_tso(dev, useraddr); ++ case ETHTOOL_STSO: ++ return ethtool_set_tso(dev, useraddr); ++ case ETHTOOL_TEST: ++ return ethtool_self_test(dev, useraddr); ++ case ETHTOOL_GSTRINGS: ++ return ethtool_get_strings(dev, useraddr); ++ case ETHTOOL_PHYS_ID: ++ return ethtool_phys_id(dev, useraddr); ++ case ETHTOOL_GSTATS: ++ return ethtool_get_stats(dev, useraddr); ++ default: ++ return -EOPNOTSUPP; ++ } ++ ++ return -EOPNOTSUPP; ++} ++ ++#define mii_if_info _kc_mii_if_info ++struct _kc_mii_if_info { ++ int phy_id; ++ int advertising; ++ int phy_id_mask; ++ int reg_num_mask; ++ ++ unsigned int full_duplex : 1; /* is full duplex? */ ++ unsigned int force_media : 1; /* is autoneg. disabled? */ ++ ++ struct net_device *dev; ++ int (*mdio_read) (struct net_device *dev, int phy_id, int location); ++ void (*mdio_write) (struct net_device *dev, int phy_id, int location, int val); ++}; ++ ++struct ethtool_cmd; ++struct mii_ioctl_data; ++ ++#undef mii_link_ok ++#define mii_link_ok _kc_mii_link_ok ++#undef mii_nway_restart ++#define mii_nway_restart _kc_mii_nway_restart ++#undef mii_ethtool_gset ++#define mii_ethtool_gset _kc_mii_ethtool_gset ++#undef mii_ethtool_sset ++#define mii_ethtool_sset _kc_mii_ethtool_sset ++#undef mii_check_link ++#define mii_check_link _kc_mii_check_link ++#undef generic_mii_ioctl ++#define generic_mii_ioctl _kc_generic_mii_ioctl ++extern int _kc_mii_link_ok (struct mii_if_info *mii); ++extern int _kc_mii_nway_restart (struct mii_if_info *mii); ++extern int _kc_mii_ethtool_gset(struct mii_if_info *mii, ++ struct ethtool_cmd *ecmd); ++extern int _kc_mii_ethtool_sset(struct mii_if_info *mii, ++ struct ethtool_cmd *ecmd); ++extern void _kc_mii_check_link (struct mii_if_info *mii); ++extern int _kc_generic_mii_ioctl(struct mii_if_info *mii_if, ++ struct mii_ioctl_data *mii_data, int cmd, ++ unsigned int *duplex_changed); ++ ++ ++struct _kc_pci_dev_ext { ++ struct pci_dev *dev; ++ void *pci_drvdata; ++ struct pci_driver *driver; ++}; ++ ++struct _kc_net_dev_ext { ++ struct net_device *dev; ++ unsigned int carrier; ++}; ++ ++ ++/**************************************/ ++/* mii support */ ++ ++int _kc_mii_ethtool_gset(struct mii_if_info *mii, struct ethtool_cmd *ecmd) ++{ ++ struct net_device *dev = mii->dev; ++ u32 advert, bmcr, lpa, nego; ++ ++ ecmd->supported = ++ (SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full | ++ SUPPORTED_100baseT_Half | SUPPORTED_100baseT_Full | ++ SUPPORTED_Autoneg | SUPPORTED_TP | SUPPORTED_MII); ++ ++ /* only supports twisted-pair */ ++ ecmd->port = PORT_MII; ++ ++ /* only supports internal transceiver */ ++ ecmd->transceiver = XCVR_INTERNAL; ++ ++ /* this isn't fully supported at higher layers */ ++ ecmd->phy_address = mii->phy_id; ++ ++ ecmd->advertising = ADVERTISED_TP | ADVERTISED_MII; ++ advert = mii->mdio_read(dev, mii->phy_id, MII_ADVERTISE); ++ if (advert & ADVERTISE_10HALF) ++ ecmd->advertising |= ADVERTISED_10baseT_Half; ++ if (advert & ADVERTISE_10FULL) ++ ecmd->advertising |= ADVERTISED_10baseT_Full; ++ if (advert & ADVERTISE_100HALF) ++ ecmd->advertising |= ADVERTISED_100baseT_Half; ++ if (advert & ADVERTISE_100FULL) ++ ecmd->advertising |= ADVERTISED_100baseT_Full; ++ ++ bmcr = mii->mdio_read(dev, mii->phy_id, MII_BMCR); ++ lpa = mii->mdio_read(dev, mii->phy_id, MII_LPA); ++ if (bmcr & BMCR_ANENABLE) { ++ ecmd->advertising |= ADVERTISED_Autoneg; ++ ecmd->autoneg = AUTONEG_ENABLE; ++ ++ nego = mii_nway_result(advert & lpa); ++ if (nego == LPA_100FULL || nego == LPA_100HALF) ++ ecmd->speed = SPEED_100; ++ else ++ ecmd->speed = SPEED_10; ++ if (nego == LPA_100FULL || nego == LPA_10FULL) { ++ ecmd->duplex = DUPLEX_FULL; ++ mii->full_duplex = 1; ++ } else { ++ ecmd->duplex = DUPLEX_HALF; ++ mii->full_duplex = 0; ++ } ++ } else { ++ ecmd->autoneg = AUTONEG_DISABLE; ++ ++ ecmd->speed = (bmcr & BMCR_SPEED100) ? SPEED_100 : SPEED_10; ++ ecmd->duplex = (bmcr & BMCR_FULLDPLX) ? DUPLEX_FULL : DUPLEX_HALF; ++ } ++ ++ /* ignore maxtxpkt, maxrxpkt for now */ ++ ++ return 0; ++} ++ ++int _kc_mii_ethtool_sset(struct mii_if_info *mii, struct ethtool_cmd *ecmd) ++{ ++ struct net_device *dev = mii->dev; ++ ++ if (ecmd->speed != SPEED_10 && ecmd->speed != SPEED_100) ++ return -EINVAL; ++ if (ecmd->duplex != DUPLEX_HALF && ecmd->duplex != DUPLEX_FULL) ++ return -EINVAL; ++ if (ecmd->port != PORT_MII) ++ return -EINVAL; ++ if (ecmd->transceiver != XCVR_INTERNAL) ++ return -EINVAL; ++ if (ecmd->phy_address != mii->phy_id) ++ return -EINVAL; ++ if (ecmd->autoneg != AUTONEG_DISABLE && ecmd->autoneg != AUTONEG_ENABLE) ++ return -EINVAL; ++ ++ /* ignore supported, maxtxpkt, maxrxpkt */ ++ ++ if (ecmd->autoneg == AUTONEG_ENABLE) { ++ u32 bmcr, advert, tmp; ++ ++ if ((ecmd->advertising & (ADVERTISED_10baseT_Half | ++ ADVERTISED_10baseT_Full | ++ ADVERTISED_100baseT_Half | ++ ADVERTISED_100baseT_Full)) == 0) ++ return -EINVAL; ++ ++ /* advertise only what has been requested */ ++ advert = mii->mdio_read(dev, mii->phy_id, MII_ADVERTISE); ++ tmp = advert & ~(ADVERTISE_ALL | ADVERTISE_100BASE4); ++ if (ADVERTISED_10baseT_Half) ++ tmp |= ADVERTISE_10HALF; ++ if (ADVERTISED_10baseT_Full) ++ tmp |= ADVERTISE_10FULL; ++ if (ADVERTISED_100baseT_Half) ++ tmp |= ADVERTISE_100HALF; ++ if (ADVERTISED_100baseT_Full) ++ tmp |= ADVERTISE_100FULL; ++ if (advert != tmp) { ++ mii->mdio_write(dev, mii->phy_id, MII_ADVERTISE, tmp); ++ mii->advertising = tmp; ++ } ++ ++ /* turn on autonegotiation, and force a renegotiate */ ++ bmcr = mii->mdio_read(dev, mii->phy_id, MII_BMCR); ++ bmcr |= (BMCR_ANENABLE | BMCR_ANRESTART); ++ mii->mdio_write(dev, mii->phy_id, MII_BMCR, bmcr); ++ ++ mii->force_media = 0; ++ } else { ++ u32 bmcr, tmp; ++ ++ /* turn off auto negotiation, set speed and duplexity */ ++ bmcr = mii->mdio_read(dev, mii->phy_id, MII_BMCR); ++ tmp = bmcr & ~(BMCR_ANENABLE | BMCR_SPEED100 | BMCR_FULLDPLX); ++ if (ecmd->speed == SPEED_100) ++ tmp |= BMCR_SPEED100; ++ if (ecmd->duplex == DUPLEX_FULL) { ++ tmp |= BMCR_FULLDPLX; ++ mii->full_duplex = 1; ++ } else ++ mii->full_duplex = 0; ++ if (bmcr != tmp) ++ mii->mdio_write(dev, mii->phy_id, MII_BMCR, tmp); ++ ++ mii->force_media = 1; ++ } ++ return 0; ++} ++ ++int _kc_mii_link_ok (struct mii_if_info *mii) ++{ ++ /* first, a dummy read, needed to latch some MII phys */ ++ mii->mdio_read(mii->dev, mii->phy_id, MII_BMSR); ++ if (mii->mdio_read(mii->dev, mii->phy_id, MII_BMSR) & BMSR_LSTATUS) ++ return 1; ++ return 0; ++} ++ ++int _kc_mii_nway_restart (struct mii_if_info *mii) ++{ ++ int bmcr; ++ int r = -EINVAL; ++ ++ /* if autoneg is off, it's an error */ ++ bmcr = mii->mdio_read(mii->dev, mii->phy_id, MII_BMCR); ++ ++ if (bmcr & BMCR_ANENABLE) { ++ bmcr |= BMCR_ANRESTART; ++ mii->mdio_write(mii->dev, mii->phy_id, MII_BMCR, bmcr); ++ r = 0; ++ } ++ ++ return r; ++} ++ ++void _kc_mii_check_link (struct mii_if_info *mii) ++{ ++ int cur_link = mii_link_ok(mii); ++ int prev_link = netif_carrier_ok(mii->dev); ++ ++ if (cur_link && !prev_link) ++ netif_carrier_on(mii->dev); ++ else if (prev_link && !cur_link) ++ netif_carrier_off(mii->dev); ++} ++ ++int _kc_generic_mii_ioctl(struct mii_if_info *mii_if, ++ struct mii_ioctl_data *mii_data, int cmd, ++ unsigned int *duplex_chg_out) ++{ ++ int rc = 0; ++ unsigned int duplex_changed = 0; ++ ++ if (duplex_chg_out) ++ *duplex_chg_out = 0; ++ ++ mii_data->phy_id &= mii_if->phy_id_mask; ++ mii_data->reg_num &= mii_if->reg_num_mask; ++ ++ switch(cmd) { ++ case SIOCDEVPRIVATE: /* binary compat, remove in 2.5 */ ++ case SIOCGMIIPHY: ++ mii_data->phy_id = mii_if->phy_id; ++ /* fall through */ ++ ++ case SIOCDEVPRIVATE + 1:/* binary compat, remove in 2.5 */ ++ case SIOCGMIIREG: ++ mii_data->val_out = ++ mii_if->mdio_read(mii_if->dev, mii_data->phy_id, ++ mii_data->reg_num); ++ break; ++ ++ case SIOCDEVPRIVATE + 2:/* binary compat, remove in 2.5 */ ++ case SIOCSMIIREG: { ++ u16 val = mii_data->val_in; ++ ++ if (!capable(CAP_NET_ADMIN)) ++ return -EPERM; ++ ++ if (mii_data->phy_id == mii_if->phy_id) { ++ switch(mii_data->reg_num) { ++ case MII_BMCR: { ++ unsigned int new_duplex = 0; ++ if (val & (BMCR_RESET|BMCR_ANENABLE)) ++ mii_if->force_media = 0; ++ else ++ mii_if->force_media = 1; ++ if (mii_if->force_media && ++ (val & BMCR_FULLDPLX)) ++ new_duplex = 1; ++ if (mii_if->full_duplex != new_duplex) { ++ duplex_changed = 1; ++ mii_if->full_duplex = new_duplex; ++ } ++ break; ++ } ++ case MII_ADVERTISE: ++ mii_if->advertising = val; ++ break; ++ default: ++ /* do nothing */ ++ break; ++ } ++ } ++ ++ mii_if->mdio_write(mii_if->dev, mii_data->phy_id, ++ mii_data->reg_num, val); ++ break; ++ } ++ ++ default: ++ rc = -EOPNOTSUPP; ++ break; ++ } ++ ++ if ((rc == 0) && (duplex_chg_out) && (duplex_changed)) ++ *duplex_chg_out = 1; ++ ++ return rc; ++} ++ diff --git a/master/kernel-configuration b/master/kernel-configuration index 3e7d2b8..58d3ebf 100644 --- a/master/kernel-configuration +++ b/master/kernel-configuration @@ -1,6 +1,6 @@ -diff -r 5e428261bbe7 buildconfigs/conf.linux-kdump/kdump +diff -r dc440f671899 buildconfigs/conf.linux-kdump/kdump --- /dev/null Thu Jan 01 00:00:00 1970 +0000 -+++ b/buildconfigs/conf.linux-kdump/kdump Thu Jun 04 15:14:24 2009 +0100 ++++ b/buildconfigs/conf.linux-kdump/kdump Wed Jul 08 11:03:49 2009 +0100 @@ -0,0 +1,107 @@ +# CONFIG_NO_HZ is not set +# CONFIG_HIGH_RES_TIMERS is not set @@ -109,10 +109,10 @@ diff -r 5e428261bbe7 buildconfigs/conf.linux-kdump/kdump +# CONFIG_KALLSYMS_ALL is not set +# CONFIG_DEBUG_INFO is not set +# CONFIG_KDB is not set -diff -r 5e428261bbe7 buildconfigs/linux-defconfig_utility_x86_32 +diff -r dc440f671899 buildconfigs/linux-defconfig_utility_x86_32 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 -+++ b/buildconfigs/linux-defconfig_utility_x86_32 Thu Jun 04 15:14:24 2009 +0100 -@@ -0,0 +1,1022 @@ ++++ b/buildconfigs/linux-defconfig_utility_x86_32 Wed Jul 08 11:03:49 2009 +0100 +@@ -0,0 +1,1021 @@ +# +# Automatically generated make config: don't edit +# Linux kernel version: 2.6.27.19 @@ -765,7 +765,6 @@ diff -r 5e428261bbe7 buildconfigs/linux-defconfig_utility_x86_32 +# CONFIG_XEN_GRANT_DEV is not set +CONFIG_XEN_DISABLE_SERIAL=y +CONFIG_XEN_SYSFS=y -+CONFIG_XEN_NR_GUEST_DEVICES=702 +# CONFIG_XEN_COMPAT_030002_AND_LATER is not set +# CONFIG_XEN_COMPAT_030004_AND_LATER is not set +# CONFIG_XEN_COMPAT_030100_AND_LATER is not set @@ -1135,14 +1134,14 @@ diff -r 5e428261bbe7 buildconfigs/linux-defconfig_utility_x86_32 +CONFIG_HAS_IOMEM=y +CONFIG_HAS_IOPORT=y +CONFIG_HAS_DMA=y -diff -r 5e428261bbe7 buildconfigs/linux-defconfig_xen_x86_32 +diff -r dc440f671899 buildconfigs/linux-defconfig_xen_x86_32 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 -+++ b/buildconfigs/linux-defconfig_xen_x86_32 Thu Jun 04 15:14:24 2009 +0100 -@@ -0,0 +1,2627 @@ ++++ b/buildconfigs/linux-defconfig_xen_x86_32 Wed Jul 08 11:03:49 2009 +0100 +@@ -0,0 +1,2640 @@ +# +# Automatically generated make config: don't edit -+# Linux kernel version: 2.6.27.19-5.1 -+# Fri May 15 16:20:40 2009 ++# Linux kernel version: 2.6.27.23-0.1.1 ++# Wed Jul 8 11:01:59 2009 +# +# CONFIG_64BIT is not set +CONFIG_X86_32=y @@ -1301,7 +1300,7 @@ diff -r 5e428261bbe7 buildconfigs/linux-defconfig_xen_x86_32 +# CONFIG_DEFAULT_NOOP is not set +CONFIG_DEFAULT_IOSCHED="cfq" +CONFIG_CLASSIC_RCU=y -+# CONFIG_FREEZER is not set ++CONFIG_FREEZER=y + +# +# Processor type and features @@ -1319,6 +1318,7 @@ diff -r 5e428261bbe7 buildconfigs/linux-defconfig_xen_x86_32 +# CONFIG_X86_VSMP is not set +# CONFIG_X86_RDC321X is not set +CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y ++CONFIG_XEN_SAVE_RESTORE=y +# CONFIG_M386 is not set +# CONFIG_M486 is not set +# CONFIG_M586 is not set @@ -1420,8 +1420,11 @@ diff -r 5e428261bbe7 buildconfigs/linux-defconfig_xen_x86_32 +# +CONFIG_PM=y +# CONFIG_PM_DEBUG is not set ++CONFIG_PM_SLEEP_SMP=y ++CONFIG_PM_SLEEP=y +# CONFIG_SUSPEND is not set +CONFIG_ACPI=y ++CONFIG_ACPI_SLEEP=y +# CONFIG_ACPI_PROCFS is not set +# CONFIG_ACPI_PROCFS_POWER is not set +CONFIG_ACPI_SYSFS_POWER=y @@ -1447,6 +1450,7 @@ diff -r 5e428261bbe7 buildconfigs/linux-defconfig_xen_x86_32 +CONFIG_ACPI_SYSTEM=y +CONFIG_ACPI_CONTAINER=m +CONFIG_ACPI_SBS=m ++CONFIG_ACPI_PV_SLEEP=y +CONFIG_PROCESSOR_EXTERNAL_CONTROL=y + +# @@ -1474,6 +1478,7 @@ diff -r 5e428261bbe7 buildconfigs/linux-defconfig_xen_x86_32 +CONFIG_PCI_REASSIGN=y +CONFIG_PCI_LEGACY=y +# CONFIG_PCI_DEBUG is not set ++CONFIG_PCI_IOV=y +CONFIG_ISA_DMA_API=y +CONFIG_SCx200=m +# CONFIG_SCx200HR_TIMER is not set @@ -1706,6 +1711,7 @@ diff -r 5e428261bbe7 buildconfigs/linux-defconfig_xen_x86_32 +# CONFIG_ATM is not set +CONFIG_STP=m +CONFIG_BRIDGE=m ++CONFIG_VSWITCH=m +CONFIG_VLAN_8021Q=m +# CONFIG_VLAN_8021Q_GVRP is not set +# CONFIG_DECNET is not set @@ -1996,7 +2002,7 @@ diff -r 5e428261bbe7 buildconfigs/linux-defconfig_xen_x86_32 +# CONFIG_SCSI_SRP_ATTRS is not set +CONFIG_SCSI_LOWLEVEL=y +CONFIG_ISCSI_TCP=m -+CONFIG_SCSI_CXGB3_ISCSI=m ++# CONFIG_SCSI_CXGB3_ISCSI is not set +CONFIG_BLK_DEV_3W_XXXX_RAID=m +CONFIG_SCSI_3W_9XXX=m +CONFIG_SCSI_ACARD=m @@ -2024,6 +2030,9 @@ diff -r 5e428261bbe7 buildconfigs/linux-defconfig_xen_x86_32 +CONFIG_MEGARAID_MAILBOX=m +CONFIG_MEGARAID_LEGACY=m +CONFIG_MEGARAID_SAS=m ++CONFIG_SCSI_MPT2SAS=m ++CONFIG_SCSI_MPT2SAS_MAX_SGE=128 ++# CONFIG_SCSI_MPT2SAS_LOGGING is not set +# CONFIG_SCSI_HPTIOP is not set +# CONFIG_SCSI_BUSLOGIC is not set +# CONFIG_LIBFC is not set @@ -2051,16 +2060,20 @@ diff -r 5e428261bbe7 buildconfigs/linux-defconfig_xen_x86_32 +CONFIG_SCSI_SYM53C8XX_MMIO=y +# CONFIG_SCSI_IPR is not set +CONFIG_SCSI_QLOGIC_1280=m -+# CONFIG_SCSI_QLA_FC is not set -+# CONFIG_SCSI_QLA_ISCSI is not set -+# CONFIG_SCSI_LPFC is not set ++CONFIG_SCSI_QLA_FC=m ++CONFIG_SCSI_QLA_ISCSI=m ++CONFIG_SCSI_LPFC=m +CONFIG_SCSI_DC395x=m +CONFIG_SCSI_DC390T=m +CONFIG_SCSI_NSP32=m +# CONFIG_SCSI_DEBUG is not set +CONFIG_SCSI_SRP=m +# CONFIG_SCSI_LOWLEVEL_PCMCIA is not set -+# CONFIG_SCSI_DH is not set ++CONFIG_SCSI_DH=m ++CONFIG_SCSI_DH_RDAC=m ++CONFIG_SCSI_DH_HP_SW=m ++CONFIG_SCSI_DH_EMC=m ++# CONFIG_SCSI_DH_ALUA is not set +# CONFIG_SCSI_BNX2_ISCSI is not set +CONFIG_ATA=m +# CONFIG_ATA_NONSTANDARD is not set @@ -2193,7 +2206,7 @@ diff -r 5e428261bbe7 buildconfigs/linux-defconfig_xen_x86_32 +# CONFIG_MACVLAN is not set +CONFIG_EQUALIZER=m +CONFIG_TUN=m -+# CONFIG_VETH is not set ++CONFIG_VETH=m +CONFIG_NET_SB1000=m +# CONFIG_ARCNET is not set +CONFIG_PHYLIB=m @@ -2510,7 +2523,7 @@ diff -r 5e428261bbe7 buildconfigs/linux-defconfig_xen_x86_32 +CONFIG_IPMI_HANDLER=m +# CONFIG_IPMI_PANIC_EVENT is not set +CONFIG_IPMI_DEVICE_INTERFACE=m -+CONFIG_IPMI_SI=m ++# CONFIG_IPMI_SI is not set +CONFIG_IPMI_WATCHDOG=m +CONFIG_IPMI_POWEROFF=m +CONFIG_HW_RANDOM=y @@ -2693,8 +2706,8 @@ diff -r 5e428261bbe7 buildconfigs/linux-defconfig_xen_x86_32 +CONFIG_SENSORS_GL518SM=m +CONFIG_SENSORS_GL520SM=m +CONFIG_SENSORS_CORETEMP=m -+CONFIG_SENSORS_IBMAEM=m -+CONFIG_SENSORS_IBMPEX=m ++# CONFIG_SENSORS_IBMAEM is not set ++# CONFIG_SENSORS_IBMPEX is not set +CONFIG_SENSORS_IT87=m +CONFIG_SENSORS_LM63=m +CONFIG_SENSORS_LM70=m @@ -3304,7 +3317,6 @@ diff -r 5e428261bbe7 buildconfigs/linux-defconfig_xen_x86_32 +CONFIG_XEN_KEYBOARD=y +CONFIG_XEN_DISABLE_SERIAL=y +CONFIG_XEN_SYSFS=y -+CONFIG_XEN_NR_GUEST_DEVICES=702 +# CONFIG_XEN_COMPAT_030002_AND_LATER is not set +# CONFIG_XEN_COMPAT_030004_AND_LATER is not set +# CONFIG_XEN_COMPAT_030100_AND_LATER is not set @@ -3766,14 +3778,14 @@ diff -r 5e428261bbe7 buildconfigs/linux-defconfig_xen_x86_32 +CONFIG_HAS_IOPORT=y +CONFIG_HAS_DMA=y +CONFIG_CHECK_SIGNATURE=y -diff -r 5e428261bbe7 buildconfigs/linux-defconfig_xen_x86_64 +diff -r dc440f671899 buildconfigs/linux-defconfig_xen_x86_64 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 -+++ b/buildconfigs/linux-defconfig_xen_x86_64 Thu Jun 04 15:14:24 2009 +0100 -@@ -0,0 +1,2576 @@ ++++ b/buildconfigs/linux-defconfig_xen_x86_64 Wed Jul 08 11:03:49 2009 +0100 +@@ -0,0 +1,2589 @@ +# +# Automatically generated make config: don't edit -+# Linux kernel version: 2.6.27.19-5.1 -+# Thu Jun 4 14:43:28 2009 ++# Linux kernel version: 2.6.27.23-0.1.1 ++# Wed Jul 1 10:56:50 2009 +# +CONFIG_64BIT=y +# CONFIG_X86_32 is not set @@ -3931,7 +3943,7 @@ diff -r 5e428261bbe7 buildconfigs/linux-defconfig_xen_x86_64 +# CONFIG_DEFAULT_NOOP is not set +CONFIG_DEFAULT_IOSCHED="cfq" +CONFIG_CLASSIC_RCU=y -+# CONFIG_FREEZER is not set ++CONFIG_FREEZER=y + +# +# Processor type and features @@ -3947,6 +3959,7 @@ diff -r 5e428261bbe7 buildconfigs/linux-defconfig_xen_x86_64 +# CONFIG_X86_GENERICARCH is not set +CONFIG_X86_64_XEN=y +# CONFIG_X86_VSMP is not set ++CONFIG_XEN_SAVE_RESTORE=y +# CONFIG_M386 is not set +# CONFIG_M486 is not set +# CONFIG_M586 is not set @@ -4035,8 +4048,11 @@ diff -r 5e428261bbe7 buildconfigs/linux-defconfig_xen_x86_64 +# +CONFIG_PM=y +# CONFIG_PM_DEBUG is not set ++CONFIG_PM_SLEEP_SMP=y ++CONFIG_PM_SLEEP=y +# CONFIG_SUSPEND is not set +CONFIG_ACPI=y ++CONFIG_ACPI_SLEEP=y +# CONFIG_ACPI_PROCFS is not set +# CONFIG_ACPI_PROCFS_POWER is not set +CONFIG_ACPI_SYSFS_POWER=y @@ -4062,6 +4078,7 @@ diff -r 5e428261bbe7 buildconfigs/linux-defconfig_xen_x86_64 +CONFIG_ACPI_SYSTEM=y +CONFIG_ACPI_CONTAINER=m +CONFIG_ACPI_SBS=m ++CONFIG_ACPI_PV_SLEEP=y +CONFIG_PROCESSOR_EXTERNAL_CONTROL=y + +# @@ -4083,6 +4100,7 @@ diff -r 5e428261bbe7 buildconfigs/linux-defconfig_xen_x86_64 +CONFIG_PCI_REASSIGN=y +CONFIG_PCI_LEGACY=y +# CONFIG_PCI_DEBUG is not set ++CONFIG_PCI_IOV=y +CONFIG_ISA_DMA_API=y +CONFIG_K8_NB=y +CONFIG_PCCARD=m @@ -4317,6 +4335,7 @@ diff -r 5e428261bbe7 buildconfigs/linux-defconfig_xen_x86_64 +# CONFIG_ATM is not set +CONFIG_STP=m +CONFIG_BRIDGE=m ++CONFIG_VSWITCH=m +CONFIG_VLAN_8021Q=m +# CONFIG_VLAN_8021Q_GVRP is not set +# CONFIG_DECNET is not set @@ -4605,7 +4624,7 @@ diff -r 5e428261bbe7 buildconfigs/linux-defconfig_xen_x86_64 +# CONFIG_SCSI_SRP_ATTRS is not set +CONFIG_SCSI_LOWLEVEL=y +CONFIG_ISCSI_TCP=m -+CONFIG_SCSI_CXGB3_ISCSI=m ++# CONFIG_SCSI_CXGB3_ISCSI is not set +CONFIG_BLK_DEV_3W_XXXX_RAID=m +CONFIG_SCSI_3W_9XXX=m +CONFIG_SCSI_ACARD=m @@ -4633,6 +4652,9 @@ diff -r 5e428261bbe7 buildconfigs/linux-defconfig_xen_x86_64 +CONFIG_MEGARAID_MAILBOX=m +CONFIG_MEGARAID_LEGACY=m +CONFIG_MEGARAID_SAS=m ++CONFIG_SCSI_MPT2SAS=m ++CONFIG_SCSI_MPT2SAS_MAX_SGE=128 ++# CONFIG_SCSI_MPT2SAS_LOGGING is not set +# CONFIG_SCSI_HPTIOP is not set +# CONFIG_SCSI_BUSLOGIC is not set +# CONFIG_LIBFC is not set @@ -4660,15 +4682,19 @@ diff -r 5e428261bbe7 buildconfigs/linux-defconfig_xen_x86_64 +CONFIG_SCSI_SYM53C8XX_MMIO=y +# CONFIG_SCSI_IPR is not set +CONFIG_SCSI_QLOGIC_1280=m -+# CONFIG_SCSI_QLA_FC is not set -+# CONFIG_SCSI_QLA_ISCSI is not set -+# CONFIG_SCSI_LPFC is not set ++CONFIG_SCSI_QLA_FC=m ++CONFIG_SCSI_QLA_ISCSI=m ++CONFIG_SCSI_LPFC=m +CONFIG_SCSI_DC395x=m +CONFIG_SCSI_DC390T=m +# CONFIG_SCSI_DEBUG is not set +CONFIG_SCSI_SRP=m +# CONFIG_SCSI_LOWLEVEL_PCMCIA is not set -+# CONFIG_SCSI_DH is not set ++CONFIG_SCSI_DH=m ++CONFIG_SCSI_DH_RDAC=m ++CONFIG_SCSI_DH_HP_SW=m ++CONFIG_SCSI_DH_EMC=m ++# CONFIG_SCSI_DH_ALUA is not set +# CONFIG_SCSI_BNX2_ISCSI is not set +CONFIG_ATA=m +# CONFIG_ATA_NONSTANDARD is not set @@ -4799,7 +4825,7 @@ diff -r 5e428261bbe7 buildconfigs/linux-defconfig_xen_x86_64 +# CONFIG_MACVLAN is not set +CONFIG_EQUALIZER=m +CONFIG_TUN=m -+# CONFIG_VETH is not set ++CONFIG_VETH=m +CONFIG_NET_SB1000=m +# CONFIG_ARCNET is not set +CONFIG_PHYLIB=m @@ -5115,7 +5141,7 @@ diff -r 5e428261bbe7 buildconfigs/linux-defconfig_xen_x86_64 +CONFIG_IPMI_HANDLER=m +# CONFIG_IPMI_PANIC_EVENT is not set +CONFIG_IPMI_DEVICE_INTERFACE=m -+CONFIG_IPMI_SI=m ++# CONFIG_IPMI_SI is not set +CONFIG_IPMI_WATCHDOG=m +CONFIG_IPMI_POWEROFF=m +CONFIG_HW_RANDOM=y @@ -5289,8 +5315,8 @@ diff -r 5e428261bbe7 buildconfigs/linux-defconfig_xen_x86_64 +CONFIG_SENSORS_GL518SM=m +CONFIG_SENSORS_GL520SM=m +CONFIG_SENSORS_CORETEMP=m -+CONFIG_SENSORS_IBMAEM=m -+CONFIG_SENSORS_IBMPEX=m ++# CONFIG_SENSORS_IBMAEM is not set ++# CONFIG_SENSORS_IBMPEX is not set +CONFIG_SENSORS_IT87=m +CONFIG_SENSORS_LM63=m +CONFIG_SENSORS_LM70=m @@ -5888,7 +5914,6 @@ diff -r 5e428261bbe7 buildconfigs/linux-defconfig_xen_x86_64 +CONFIG_XEN_KEYBOARD=y +CONFIG_XEN_DISABLE_SERIAL=y +CONFIG_XEN_SYSFS=y -+CONFIG_XEN_NR_GUEST_DEVICES=702 +# CONFIG_XEN_COMPAT_030002_AND_LATER is not set +# CONFIG_XEN_COMPAT_030004_AND_LATER is not set +# CONFIG_XEN_COMPAT_030100_AND_LATER is not set diff --git a/master/linux-2.6.18-xen.hg-734.412b24a36929 b/master/linux-2.6.18-xen.hg-734.412b24a36929 new file mode 100644 index 0000000..83f4e9b --- /dev/null +++ b/master/linux-2.6.18-xen.hg-734.412b24a36929 @@ -0,0 +1,945 @@ +# HG changeset patch +# User Keir Fraser +# Date 1227524694 0 +# Node ID 412b24a36929b7cbedc793b4aad06b334bea021b +# Parent 5888ffa4b252f11749b3fde82eeb5ab68bb2e537 +pciback: error handler for PCIE_AER. + +This patch is the main implementation for enabling PCIE_AER handling, +adding related pci error handler in pciback and pcifront. + +When a device sends a PCIE error message to the root port, it will +trigger an interrupt. The irq handler will then collect roor error +status register, then schedule a work to process the error based on +the error type. + +If the error is non-correctable error (fatal or non-fatal), AER +service driver will call the callback funtions of the endpoint's +driver. For bridge, it will broadcast the error to the downstream +ports. Pciback error handler will be called accordingly. Pciback then +ask pcifront help to call the end-device driver for finally completing +the related pci error handling jobs. + +Signed-off-by: Jiang Yunhong +Signed-off-by: Ke Liping + +diff -r 1ad9450a8b97 drivers/xen/pciback/controller.c +--- a/drivers/xen/pciback/controller.c Wed Jun 17 16:57:05 2009 +0100 ++++ b/drivers/xen/pciback/controller.c Wed Jun 17 17:16:21 2009 +0100 +@@ -406,3 +406,38 @@ + kfree(dev_data); + pdev->pci_dev_data = NULL; + } ++ ++int pciback_get_pcifront_dev(struct pci_dev *pcidev, ++ struct pciback_device *pdev, ++ unsigned int *domain, unsigned int *bus, unsigned int *devfn) ++{ ++ struct controller_dev_data *dev_data = pdev->pci_dev_data; ++ struct controller_dev_entry *dev_entry; ++ struct controller_list_entry *cntrl_entry; ++ unsigned long flags; ++ int found = 0; ++ spin_lock_irqsave(&dev_data->lock, flags); ++ ++ list_for_each_entry(cntrl_entry, &dev_data->list, list) { ++ list_for_each_entry(dev_entry, &cntrl_entry->dev_list, list) { ++ if ( (dev_entry->dev->bus->number == ++ pcidev->bus->number) && ++ (dev_entry->dev->devfn == ++ pcidev->devfn) && ++ (pci_domain_nr(dev_entry->dev->bus) == ++ pci_domain_nr(pcidev->bus))) ++ { ++ found = 1; ++ *domain = cntrl_entry->domain; ++ *bus = cntrl_entry->bus; ++ *devfn = dev_entry->devfn; ++ goto out; ++ } ++ } ++ } ++out: ++ spin_unlock_irqrestore(&dev_data->lock, flags); ++ return found; ++ ++} ++ +diff -r 1ad9450a8b97 drivers/xen/pciback/passthrough.c +--- a/drivers/xen/pciback/passthrough.c Wed Jun 17 16:57:05 2009 +0100 ++++ b/drivers/xen/pciback/passthrough.c Wed Jun 17 17:16:21 2009 +0100 +@@ -164,3 +164,13 @@ + kfree(dev_data); + pdev->pci_dev_data = NULL; + } ++ ++int pciback_get_pcifront_dev(struct pci_dev *pcidev, struct pciback_device *pdev, ++ unsigned int *domain, unsigned int *bus, unsigned int *devfn) ++ ++{ ++ *domain = pci_domain_nr(pcidev->bus); ++ *bus = pcidev->bus->number; ++ *devfn = pcidev->devfn; ++ return 1; ++} +diff -r 1ad9450a8b97 drivers/xen/pciback/pci_stub.c +--- a/drivers/xen/pciback/pci_stub.c Wed Jun 17 16:57:05 2009 +0100 ++++ b/drivers/xen/pciback/pci_stub.c Wed Jun 17 17:16:21 2009 +0100 +@@ -6,15 +6,24 @@ + */ + #include + #include ++#include + #include + #include + #include ++#include ++#include + #include ++#include + #include "pciback.h" + #include "conf_space.h" + #include "conf_space_quirks.h" + + static char *pci_devs_to_hide = NULL; ++wait_queue_head_t aer_wait_queue; ++/*Add sem for sync AER handling and pciback remove/reconfigue ops, ++* We want to avoid in middle of AER ops, pciback devices is being removed ++*/ ++static DECLARE_RWSEM(pcistub_sem); + module_param_named(hide, pci_devs_to_hide, charp, 0444); + + struct pcistub_device_id { +@@ -207,6 +216,10 @@ + + spin_unlock_irqrestore(&pcistub_devices_lock, flags); + ++ /*hold this lock for avoiding breaking link between ++ * pcistub and pciback when AER is in processing ++ */ ++ down_write(&pcistub_sem); + /* Cleanup our device + * (so it's ready for the next domain) + */ +@@ -219,6 +232,7 @@ + spin_unlock_irqrestore(&found_psdev->lock, flags); + + pcistub_device_put(found_psdev); ++ up_write(&pcistub_sem); + } + + static int __devinit pcistub_match_one(struct pci_dev *dev, +@@ -279,6 +293,8 @@ + pci_set_drvdata(dev, dev_data); + + dev_dbg(&dev->dev, "initializing config\n"); ++ ++ init_waitqueue_head(&aer_wait_queue); + err = pciback_config_init_dev(dev); + if (err) + goto out; +@@ -477,6 +493,308 @@ + {0,}, + }; + ++static void kill_domain_by_device(struct pcistub_device *psdev) ++{ ++ struct xenbus_transaction xbt; ++ int err; ++ char nodename[1024]; ++ ++ if (!psdev) ++ dev_err(&psdev->dev->dev, ++ "device is NULL when do AER recovery/kill_domain\n"); ++ sprintf(nodename, "/local/domain/0/backend/pci/%d/0", ++ psdev->pdev->xdev->otherend_id); ++ nodename[strlen(nodename)] = '\0'; ++ ++again: ++ err = xenbus_transaction_start(&xbt); ++ if (err) ++ { ++ dev_err(&psdev->dev->dev, ++ "error %d when start xenbus transaction\n", err); ++ return; ++ } ++ /*PV AER handlers will set this flag*/ ++ xenbus_printf(xbt, nodename, "aerState" , "aerfail" ); ++ err = xenbus_transaction_end(xbt, 0); ++ if (err) ++ { ++ if (err == -EAGAIN) ++ goto again; ++ dev_err(&psdev->dev->dev, ++ "error %d when end xenbus transaction\n", err); ++ return; ++ } ++} ++ ++/* For each aer recovery step error_detected, mmio_enabled, etc, front_end and ++ * backend need to have cooperation. In pciback, those steps will do similar ++ * jobs: send service request and waiting for front_end response. ++*/ ++static pci_ers_result_t common_process(struct pcistub_device *psdev, ++ pci_channel_state_t state, int aer_cmd, pci_ers_result_t result) ++{ ++ pci_ers_result_t res = result; ++ struct xen_pcie_aer_op *aer_op; ++ int ret; ++ ++ /*with PV AER drivers*/ ++ aer_op = &(psdev->pdev->sh_info->aer_op); ++ aer_op->cmd = aer_cmd ; ++ /*useful for error_detected callback*/ ++ aer_op->err = state; ++ /*pcifront_end BDF*/ ++ ret = pciback_get_pcifront_dev(psdev->dev, psdev->pdev, ++ &aer_op->domain, &aer_op->bus, &aer_op->devfn); ++ if (!ret) { ++ dev_err(&psdev->dev->dev, ++ "pciback: failed to get pcifront device\n"); ++ return PCI_ERS_RESULT_NONE; ++ } ++ wmb(); ++ ++ dev_dbg(&psdev->dev->dev, ++ "pciback: aer_op %x dom %x bus %x devfn %x\n", ++ aer_cmd, aer_op->domain, aer_op->bus, aer_op->devfn); ++ /*local flag to mark there's aer request, pciback callback will use this ++ * flag to judge whether we need to check pci-front give aer service ++ * ack signal ++ */ ++ set_bit(_PCIB_op_pending, (unsigned long *)&psdev->pdev->flags); ++ ++ /*It is possible that a pcifront conf_read_write ops request invokes ++ * the callback which cause the spurious execution of wake_up. ++ * Yet it is harmless and better than a spinlock here ++ */ ++ set_bit(_XEN_PCIB_active, ++ (unsigned long *)&psdev->pdev->sh_info->flags); ++ wmb(); ++ notify_remote_via_irq(psdev->pdev->evtchn_irq); ++ ++ ret = wait_event_timeout(aer_wait_queue, !(test_bit(_XEN_PCIB_active, ++ (unsigned long *)&psdev->pdev->sh_info->flags)), 300*HZ); ++ ++ if (!ret) { ++ if (test_bit(_XEN_PCIB_active, ++ (unsigned long *)&psdev->pdev->sh_info->flags)) { ++ dev_err(&psdev->dev->dev, ++ "pcifront aer process not responding!\n"); ++ clear_bit(_XEN_PCIB_active, ++ (unsigned long *)&psdev->pdev->sh_info->flags); ++ aer_op->err = PCI_ERS_RESULT_NONE; ++ return res; ++ } ++ } ++ clear_bit(_PCIB_op_pending, (unsigned long *)&psdev->pdev->flags); ++ ++ if ( test_bit( _XEN_PCIF_active, ++ (unsigned long*)&psdev->pdev->sh_info->flags)) { ++ dev_dbg(&psdev->dev->dev, ++ "schedule pci_conf service in pciback \n"); ++ test_and_schedule_op(psdev->pdev); ++ } ++ ++ res = (pci_ers_result_t)aer_op->err; ++ return res; ++} ++ ++/* ++* pciback_slot_reset: it will send the slot_reset request to pcifront in case ++* of the device driver could provide this service, and then wait for pcifront ++* ack. ++* @dev: pointer to PCI devices ++* return value is used by aer_core do_recovery policy ++*/ ++static pci_ers_result_t pciback_slot_reset(struct pci_dev *dev) ++{ ++ struct pcistub_device *psdev; ++ pci_ers_result_t result; ++ ++ result = PCI_ERS_RESULT_RECOVERED; ++ dev_dbg(&dev->dev, "pciback_slot_reset(bus:%x,devfn:%x)\n", ++ dev->bus->number, dev->devfn); ++ ++ down_write(&pcistub_sem); ++ psdev = pcistub_device_find(pci_domain_nr(dev->bus), ++ dev->bus->number, ++ PCI_SLOT(dev->devfn), ++ PCI_FUNC(dev->devfn)); ++ if ( !psdev || !psdev->pdev || !psdev->pdev->sh_info ) ++ { ++ dev_err(&dev->dev, ++ "pciback device is not found/in use/connected!\n"); ++ goto end; ++ } ++ if ( !test_bit(_XEN_PCIB_AERHANDLER, ++ (unsigned long *)&psdev->pdev->sh_info->flags) ) { ++ dev_err(&dev->dev, ++ "guest with no AER driver should have been killed\n"); ++ goto release; ++ } ++ result = common_process(psdev, 1, XEN_PCI_OP_aer_slotreset, result); ++ ++ if (result == PCI_ERS_RESULT_NONE || ++ result == PCI_ERS_RESULT_DISCONNECT) { ++ dev_dbg(&dev->dev, ++ "No AER slot_reset service or disconnected!\n"); ++ kill_domain_by_device(psdev); ++ } ++release: ++ pcistub_device_put(psdev); ++end: ++ up_write(&pcistub_sem); ++ return result; ++ ++} ++ ++ ++/*pciback_mmio_enabled: it will send the mmio_enabled request to pcifront ++* in case of the device driver could provide this service, and then wait ++* for pcifront ack. ++* @dev: pointer to PCI devices ++* return value is used by aer_core do_recovery policy ++*/ ++ ++static pci_ers_result_t pciback_mmio_enabled(struct pci_dev *dev) ++{ ++ struct pcistub_device *psdev; ++ pci_ers_result_t result; ++ ++ result = PCI_ERS_RESULT_RECOVERED; ++ dev_dbg(&dev->dev, "pciback_mmio_enabled(bus:%x,devfn:%x)\n", ++ dev->bus->number, dev->devfn); ++ ++ down_write(&pcistub_sem); ++ psdev = pcistub_device_find(pci_domain_nr(dev->bus), ++ dev->bus->number, ++ PCI_SLOT(dev->devfn), ++ PCI_FUNC(dev->devfn)); ++ if ( !psdev || !psdev->pdev || !psdev->pdev->sh_info) ++ { ++ dev_err(&dev->dev, ++ "pciback device is not found/in use/connected!\n"); ++ goto end; ++ } ++ if ( !test_bit(_XEN_PCIB_AERHANDLER, ++ (unsigned long *)&psdev->pdev->sh_info->flags) ) { ++ dev_err(&dev->dev, ++ "guest with no AER driver should have been killed\n"); ++ goto release; ++ } ++ result = common_process(psdev, 1, XEN_PCI_OP_aer_mmio, result); ++ ++ if (result == PCI_ERS_RESULT_NONE || ++ result == PCI_ERS_RESULT_DISCONNECT) { ++ dev_dbg(&dev->dev, ++ "No AER mmio_enabled service or disconnected!\n"); ++ kill_domain_by_device(psdev); ++ } ++release: ++ pcistub_device_put(psdev); ++end: ++ up_write(&pcistub_sem); ++ return result; ++} ++ ++/*pciback_error_detected: it will send the error_detected request to pcifront ++* in case of the device driver could provide this service, and then wait ++* for pcifront ack. ++* @dev: pointer to PCI devices ++* @error: the current PCI connection state ++* return value is used by aer_core do_recovery policy ++*/ ++ ++static pci_ers_result_t pciback_error_detected(struct pci_dev *dev, ++ pci_channel_state_t error) ++{ ++ struct pcistub_device *psdev; ++ pci_ers_result_t result; ++ ++ result = PCI_ERS_RESULT_CAN_RECOVER; ++ dev_dbg(&dev->dev, "pciback_error_detected(bus:%x,devfn:%x)\n", ++ dev->bus->number, dev->devfn); ++ ++ down_write(&pcistub_sem); ++ psdev = pcistub_device_find(pci_domain_nr(dev->bus), ++ dev->bus->number, ++ PCI_SLOT(dev->devfn), ++ PCI_FUNC(dev->devfn)); ++ if ( !psdev || !psdev->pdev || !psdev->pdev->sh_info) ++ { ++ dev_err(&dev->dev, ++ "pciback device is not found/in use/connected!\n"); ++ goto end; ++ } ++ /*Guest owns the device yet no aer handler regiested, kill guest*/ ++ if ( !test_bit(_XEN_PCIB_AERHANDLER, ++ (unsigned long *)&psdev->pdev->sh_info->flags) ) { ++ dev_dbg(&dev->dev, "guest may have no aer driver, kill it\n"); ++ kill_domain_by_device(psdev); ++ goto release; ++ } ++ result = common_process(psdev, error, XEN_PCI_OP_aer_detected, result); ++ ++ if (result == PCI_ERS_RESULT_NONE || ++ result == PCI_ERS_RESULT_DISCONNECT) { ++ dev_dbg(&dev->dev, ++ "No AER error_detected service or disconnected!\n"); ++ kill_domain_by_device(psdev); ++ } ++release: ++ pcistub_device_put(psdev); ++end: ++ up_write(&pcistub_sem); ++ return result; ++} ++ ++/*pciback_error_resume: it will send the error_resume request to pcifront ++* in case of the device driver could provide this service, and then wait ++* for pcifront ack. ++* @dev: pointer to PCI devices ++*/ ++ ++static void pciback_error_resume(struct pci_dev *dev) ++{ ++ struct pcistub_device *psdev; ++ ++ dev_dbg(&dev->dev, "pciback_error_resume(bus:%x,devfn:%x)\n", ++ dev->bus->number, dev->devfn); ++ ++ down_write(&pcistub_sem); ++ psdev = pcistub_device_find(pci_domain_nr(dev->bus), ++ dev->bus->number, ++ PCI_SLOT(dev->devfn), ++ PCI_FUNC(dev->devfn)); ++ if ( !psdev || !psdev->pdev || !psdev->pdev->sh_info) ++ { ++ dev_err(&dev->dev, ++ "pciback device is not found/in use/connected!\n"); ++ goto end; ++ } ++ ++ if ( !test_bit(_XEN_PCIB_AERHANDLER, ++ (unsigned long *)&psdev->pdev->sh_info->flags) ) { ++ dev_err(&dev->dev, ++ "guest with no AER driver should have been killed\n"); ++ kill_domain_by_device(psdev); ++ goto release; ++ } ++ common_process(psdev, 1, XEN_PCI_OP_aer_resume, PCI_ERS_RESULT_RECOVERED); ++release: ++ pcistub_device_put(psdev); ++end: ++ up_write(&pcistub_sem); ++ return; ++} ++ ++/*add pciback AER handling*/ ++static struct pci_error_handlers pciback_error_handler = { ++ .error_detected = pciback_error_detected, ++ .mmio_enabled = pciback_mmio_enabled, ++ .slot_reset = pciback_slot_reset, ++ .resume = pciback_error_resume, ++}; ++ + /* + * Note: There is no MODULE_DEVICE_TABLE entry here because this isn't + * for a normal device. I don't want it to be loaded automatically. +@@ -487,6 +805,7 @@ + .id_table = pcistub_ids, + .probe = pcistub_probe, + .remove = pcistub_remove, ++ .err_handler = &pciback_error_handler, + }; + + static inline int str_to_slot(const char *buf, int *domain, int *bus, +diff -r 1ad9450a8b97 drivers/xen/pciback/pciback.h +--- a/drivers/xen/pciback/pciback.h Wed Jun 17 16:57:05 2009 +0100 ++++ b/drivers/xen/pciback/pciback.h Wed Jun 17 17:16:21 2009 +0100 +@@ -22,6 +22,8 @@ + + #define _PDEVF_op_active (0) + #define PDEVF_op_active (1<<(_PDEVF_op_active)) ++#define _PCIB_op_pending (1) ++#define PCIB_op_pending (1<<(_PCIB_op_pending)) + + struct pciback_device { + void *pci_dev_data; +@@ -81,6 +83,16 @@ + struct pci_dev *pciback_get_pci_dev(struct pciback_device *pdev, + unsigned int domain, unsigned int bus, + unsigned int devfn); ++ ++/** ++* Add for domain0 PCIE-AER handling. Get guest domain/bus/devfn in pciback ++* before sending aer request to pcifront, so that guest could identify ++* device, coopearte with pciback to finish aer recovery job if device driver ++* has the capability ++*/ ++ ++int pciback_get_pcifront_dev(struct pci_dev *pcidev, struct pciback_device *pdev, ++ unsigned int *domain, unsigned int *bus, unsigned int *devfn); + int pciback_init_devices(struct pciback_device *pdev); + int pciback_publish_pci_roots(struct pciback_device *pdev, + publish_pci_root_cb cb); +@@ -108,4 +120,7 @@ + struct pci_dev *dev, struct xen_pci_op *op); + #endif + extern int verbose_request; ++ ++void test_and_schedule_op(struct pciback_device *pdev); + #endif ++ +diff -r 1ad9450a8b97 drivers/xen/pciback/pciback_ops.c +--- a/drivers/xen/pciback/pciback_ops.c Wed Jun 17 16:57:05 2009 +0100 ++++ b/drivers/xen/pciback/pciback_ops.c Wed Jun 17 17:16:21 2009 +0100 +@@ -4,6 +4,7 @@ + * Author: Ryan Wilson + */ + #include ++#include + #include + #include + #include "pciback.h" +@@ -37,14 +38,29 @@ + } + } + } +- +-static inline void test_and_schedule_op(struct pciback_device *pdev) ++extern wait_queue_head_t aer_wait_queue; ++extern struct workqueue_struct *pciback_wq; ++/* ++* Now the same evtchn is used for both pcifront conf_read_write request ++* as well as pcie aer front end ack. We use a new work_queue to schedule ++* pciback conf_read_write service for avoiding confict with aer_core ++* do_recovery job which also use the system default work_queue ++*/ ++void test_and_schedule_op(struct pciback_device *pdev) + { + /* Check that frontend is requesting an operation and that we are not + * already processing a request */ + if (test_bit(_XEN_PCIF_active, (unsigned long *)&pdev->sh_info->flags) + && !test_and_set_bit(_PDEVF_op_active, &pdev->flags)) +- schedule_work(&pdev->op_work); ++ { ++ queue_work(pciback_wq, &pdev->op_work); ++ } ++ /*_XEN_PCIB_active should have been cleared by pcifront. And also make ++ sure pciback is waiting for ack by checking _PCIB_op_pending*/ ++ if (!test_bit(_XEN_PCIB_active,(unsigned long *)&pdev->sh_info->flags) ++ &&test_bit(_PCIB_op_pending, &pdev->flags)) { ++ wake_up(&aer_wait_queue); ++ } + } + + /* Performing the configuration space reads/writes must not be done in atomic +@@ -103,7 +119,8 @@ + smp_mb__after_clear_bit(); /* /before/ final check for work */ + + /* Check to see if the driver domain tried to start another request in +- * between clearing _XEN_PCIF_active and clearing _PDEVF_op_active. */ ++ * between clearing _XEN_PCIF_active and clearing _PDEVF_op_active. ++ */ + test_and_schedule_op(pdev); + } + +diff -r 1ad9450a8b97 drivers/xen/pciback/slot.c +--- a/drivers/xen/pciback/slot.c Wed Jun 17 16:57:05 2009 +0100 ++++ b/drivers/xen/pciback/slot.c Wed Jun 17 17:16:21 2009 +0100 +@@ -155,3 +155,33 @@ + kfree(slot_dev); + pdev->pci_dev_data = NULL; + } ++ ++int pciback_get_pcifront_dev(struct pci_dev *pcidev, struct pciback_device *pdev, ++ unsigned int *domain, unsigned int *bus, unsigned int *devfn) ++{ ++ int slot, busnr; ++ struct slot_dev_data *slot_dev = pdev->pci_dev_data; ++ struct pci_dev *dev; ++ int found = 0; ++ unsigned long flags; ++ ++ spin_lock_irqsave(&slot_dev->lock, flags); ++ ++ for (busnr = 0; busnr < PCI_BUS_NBR; bus++) ++ for (slot = 0; slot < PCI_SLOT_MAX; slot++) { ++ dev = slot_dev->slots[busnr][slot]; ++ if (dev && dev->bus->number == pcidev->bus->number ++ && dev->devfn == pcidev->devfn ++ && pci_domain_nr(dev->bus) == pci_domain_nr(pcidev->bus)) { ++ found = 1; ++ *domain = 0; ++ *bus = busnr; ++ *devfn = PCI_DEVFN(slot,0); ++ goto out; ++ } ++ } ++out: ++ spin_unlock_irqrestore(&slot_dev->lock, flags); ++ return found; ++ ++} +diff -r 1ad9450a8b97 drivers/xen/pciback/vpci.c +--- a/drivers/xen/pciback/vpci.c Wed Jun 17 16:57:05 2009 +0100 ++++ b/drivers/xen/pciback/vpci.c Wed Jun 17 17:16:21 2009 +0100 +@@ -210,3 +210,33 @@ + kfree(vpci_dev); + pdev->pci_dev_data = NULL; + } ++ ++int pciback_get_pcifront_dev(struct pci_dev *pcidev, struct pciback_device *pdev, ++ unsigned int *domain, unsigned int *bus, unsigned int *devfn) ++{ ++ struct pci_dev_entry *entry; ++ struct pci_dev *dev = NULL; ++ struct vpci_dev_data *vpci_dev = pdev->pci_dev_data; ++ unsigned long flags; ++ int found = 0, slot; ++ ++ spin_lock_irqsave(&vpci_dev->lock, flags); ++ for (slot = 0; slot < PCI_SLOT_MAX; slot++) { ++ list_for_each_entry(entry, ++ &vpci_dev->dev_list[slot], ++ list) { ++ dev = entry->dev; ++ if (dev && dev->bus->number == pcidev->bus->number ++ && pci_domain_nr(dev->bus) == pci_domain_nr(pcidev->bus) ++ && dev->devfn == pcidev->devfn) ++ { ++ found = 1; ++ *domain = 0; ++ *bus = 0; ++ *devfn = PCI_DEVFN(slot, PCI_FUNC(pcidev->devfn)); ++ } ++ } ++ } ++ spin_unlock_irqrestore(&vpci_dev->lock, flags); ++ return found; ++} +diff -r 1ad9450a8b97 drivers/xen/pciback/xenbus.c +--- a/drivers/xen/pciback/xenbus.c Wed Jun 17 16:57:05 2009 +0100 ++++ b/drivers/xen/pciback/xenbus.c Wed Jun 17 17:16:21 2009 +0100 +@@ -12,6 +12,7 @@ + #include "pciback.h" + + #define INVALID_EVTCHN_IRQ (-1) ++struct workqueue_struct *pciback_wq; + + static struct pciback_device *alloc_pdev(struct xenbus_device *xdev) + { +@@ -692,11 +693,17 @@ + { + if (!is_running_on_xen()) + return -ENODEV; +- ++ pciback_wq = create_workqueue("pciback_workqueue"); ++ if (!pciback_wq) { ++ printk(KERN_ERR "pciback_xenbus_register: create" ++ "pciback_workqueue failed\n"); ++ return -EFAULT; ++ } + return xenbus_register_backend(&xenbus_pciback_driver); + } + + void __exit pciback_xenbus_unregister(void) + { ++ destroy_workqueue(pciback_wq); + xenbus_unregister_driver(&xenbus_pciback_driver); + } +diff -r 1ad9450a8b97 drivers/xen/pcifront/pci_op.c +--- a/drivers/xen/pcifront/pci_op.c Wed Jun 17 16:57:05 2009 +0100 ++++ b/drivers/xen/pcifront/pci_op.c Wed Jun 17 17:16:21 2009 +0100 +@@ -8,6 +8,7 @@ + #include + #include + #include ++#include + #include + #include + #include "pcifront.h" +@@ -153,6 +154,15 @@ + return errno; + } + ++static inline void schedule_pcifront_aer_op(struct pcifront_device *pdev) ++{ ++ if (test_bit(_XEN_PCIB_active, (unsigned long *)&pdev->sh_info->flags) ++ && !test_and_set_bit(_PDEVB_op_active, &pdev->flags)) { ++ dev_dbg(&pdev->xdev->dev, "schedule aer frontend job\n"); ++ schedule_work(&pdev->op_work); ++ } ++} ++ + static int do_pci_op(struct pcifront_device *pdev, struct xen_pci_op *op) + { + int err = 0; +@@ -197,6 +207,18 @@ + err = XEN_PCI_ERR_dev_not_found; + goto out; + } ++ } ++ ++ /* ++ * We might lose backend service request since we ++ * reuse same evtchn with pci_conf backend response. So re-schedule ++ * aer pcifront service. ++ */ ++ if (test_bit(_XEN_PCIB_active, ++ (unsigned long*)&pdev->sh_info->flags)) { ++ dev_err(&pdev->xdev->dev, ++ "schedule aer pcifront service\n"); ++ schedule_pcifront_aer_op(pdev); + } + + memcpy(op, active_op, sizeof(struct xen_pci_op)); +@@ -555,3 +577,96 @@ + kfree(bus_entry); + } + } ++ ++static pci_ers_result_t pcifront_common_process( int cmd, struct pcifront_device *pdev, ++ pci_channel_state_t state) ++{ ++ pci_ers_result_t result; ++ struct pci_driver *pdrv; ++ int bus = pdev->sh_info->aer_op.bus; ++ int devfn = pdev->sh_info->aer_op.devfn; ++ struct pci_dev *pcidev; ++ int flag = 0; ++ ++ dev_dbg(&pdev->xdev->dev, ++ "pcifront AER process: cmd %x (bus:%x, devfn%x)", ++ cmd, bus, devfn); ++ result = PCI_ERS_RESULT_NONE; ++ ++ pcidev = pci_get_bus_and_slot(bus, devfn); ++ if (!pcidev || !pcidev->driver){ ++ dev_err(&pcidev->dev, ++ "device or driver is NULL\n"); ++ return result; ++ } ++ pdrv = pcidev->driver; ++ ++ if (get_driver(&pdrv->driver)) { ++ if (pdrv->err_handler && pdrv->err_handler->error_detected) { ++ dev_dbg(&pcidev->dev, ++ "trying to call AER service\n"); ++ if (pcidev) { ++ flag = 1; ++ switch(cmd) { ++ case XEN_PCI_OP_aer_detected: ++ result = pdrv->err_handler->error_detected(pcidev, state); ++ break; ++ case XEN_PCI_OP_aer_mmio: ++ result = pdrv->err_handler->mmio_enabled(pcidev); ++ break; ++ case XEN_PCI_OP_aer_slotreset: ++ result = pdrv->err_handler->slot_reset(pcidev); ++ break; ++ case XEN_PCI_OP_aer_resume: ++ pdrv->err_handler->resume(pcidev); ++ break; ++ default: ++ dev_err(&pdev->xdev->dev, ++ "bad request in aer recovery operation!\n"); ++ ++ } ++ } ++ } ++ put_driver(&pdrv->driver); ++ } ++ if (!flag) ++ result = PCI_ERS_RESULT_NONE; ++ ++ return result; ++} ++ ++ ++void pcifront_do_aer(struct work_struct *arg) ++{ ++ struct pcifront_device *pdev = container_of(arg, struct pcifront_device, op_work); ++ int cmd = pdev->sh_info->aer_op.cmd; ++ pci_channel_state_t state = ++ (pci_channel_state_t)pdev->sh_info->aer_op.err; ++ ++ /*If a pci_conf op is in progress, ++ we have to wait until it is done before service aer op*/ ++ dev_dbg(&pdev->xdev->dev, ++ "pcifront service aer bus %x devfn %x\n", pdev->sh_info->aer_op.bus, ++ pdev->sh_info->aer_op.devfn); ++ ++ pdev->sh_info->aer_op.err = pcifront_common_process(cmd, pdev, state); ++ ++ wmb(); ++ clear_bit(_XEN_PCIB_active, (unsigned long*)&pdev->sh_info->flags); ++ notify_remote_via_evtchn(pdev->evtchn); ++ ++ /*in case of we lost an aer request in four lines time_window*/ ++ smp_mb__before_clear_bit(); ++ clear_bit( _PDEVB_op_active, &pdev->flags); ++ smp_mb__after_clear_bit(); ++ ++ schedule_pcifront_aer_op(pdev); ++ ++} ++ ++irqreturn_t pcifront_handler_aer(int irq, void *dev) ++{ ++ struct pcifront_device *pdev = dev; ++ schedule_pcifront_aer_op(pdev); ++ return IRQ_HANDLED; ++} +diff -r 1ad9450a8b97 drivers/xen/pcifront/pcifront.h +--- a/drivers/xen/pcifront/pcifront.h Wed Jun 17 16:57:05 2009 +0100 ++++ b/drivers/xen/pcifront/pcifront.h Wed Jun 17 17:16:21 2009 +0100 +@@ -10,12 +10,18 @@ + #include + #include + #include ++#include + #include ++#include ++#include + + struct pci_bus_entry { + struct list_head list; + struct pci_bus *bus; + }; ++ ++#define _PDEVB_op_active (0) ++#define PDEVB_op_active (1 << (_PDEVB_op_active)) + + struct pcifront_device { + struct xenbus_device *xdev; +@@ -28,6 +34,9 @@ + /* Lock this when doing any operations in sh_info */ + spinlock_t sh_info_lock; + struct xen_pci_sharedinfo *sh_info; ++ struct work_struct op_work; ++ unsigned long flags; ++ + }; + + int pcifront_connect(struct pcifront_device *pdev); +@@ -39,4 +48,8 @@ + unsigned int domain, unsigned int bus); + void pcifront_free_roots(struct pcifront_device *pdev); + ++void pcifront_do_aer(struct work_struct *arg); ++ ++irqreturn_t pcifront_handler_aer(int irq, void *dev); ++ + #endif /* __XEN_PCIFRONT_H__ */ +diff -r 1ad9450a8b97 drivers/xen/pcifront/xenbus.c +--- a/drivers/xen/pcifront/xenbus.c Wed Jun 17 16:57:05 2009 +0100 ++++ b/drivers/xen/pcifront/xenbus.c Wed Jun 17 17:16:21 2009 +0100 +@@ -7,6 +7,7 @@ + #include + #include + #include ++#include + #include + #include "pcifront.h" + +@@ -30,6 +31,9 @@ + } + pdev->sh_info->flags = 0; + ++ /*Flag for registering PV AER handler*/ ++ set_bit(_XEN_PCIB_AERHANDLER, (void*)&pdev->sh_info->flags); ++ + xdev->dev.driver_data = pdev; + pdev->xdev = xdev; + +@@ -40,6 +44,8 @@ + + pdev->evtchn = INVALID_EVTCHN; + pdev->gnt_ref = INVALID_GRANT_REF; ++ ++ INIT_WORK(&pdev->op_work, pcifront_do_aer); + + dev_dbg(&xdev->dev, "Allocated pdev @ 0x%p pdev->sh_info @ 0x%p\n", + pdev, pdev->sh_info); +@@ -52,6 +58,10 @@ + dev_dbg(&pdev->xdev->dev, "freeing pdev @ 0x%p\n", pdev); + + pcifront_free_roots(pdev); ++ ++ /*For PCIE_AER error handling job*/ ++ flush_scheduled_work(); ++ unbind_from_irqhandler(pdev->evtchn, pdev); + + if (pdev->evtchn != INVALID_EVTCHN) + xenbus_free_evtchn(pdev->xdev, pdev->evtchn); +@@ -79,6 +89,9 @@ + err = xenbus_alloc_evtchn(pdev->xdev, &pdev->evtchn); + if (err) + goto out; ++ ++ bind_caller_port_to_irqhandler(pdev->evtchn, pcifront_handler_aer, ++ IRQF_SAMPLE_RANDOM, "pcifront", pdev); + + do_publish: + err = xenbus_transaction_start(&trans); +diff -r 1ad9450a8b97 include/xen/interface/io/pciif.h +--- a/include/xen/interface/io/pciif.h Wed Jun 17 16:57:05 2009 +0100 ++++ b/include/xen/interface/io/pciif.h Wed Jun 17 17:16:21 2009 +0100 +@@ -30,14 +30,22 @@ + /* xen_pci_sharedinfo flags */ + #define _XEN_PCIF_active (0) + #define XEN_PCIF_active (1<<_XEN_PCI_active) ++#define _XEN_PCIB_AERHANDLER (1) ++#define XEN_PCIB_AERHANDLER (1<<_XEN_PCIB_AERHANDLER) ++#define _XEN_PCIB_active (2) ++#define XEN_PCIB_active (1<<_XEN_PCIB_active) + + /* xen_pci_op commands */ +-#define XEN_PCI_OP_conf_read (0) +-#define XEN_PCI_OP_conf_write (1) +-#define XEN_PCI_OP_enable_msi (2) +-#define XEN_PCI_OP_disable_msi (3) +-#define XEN_PCI_OP_enable_msix (4) +-#define XEN_PCI_OP_disable_msix (5) ++#define XEN_PCI_OP_conf_read (0) ++#define XEN_PCI_OP_conf_write (1) ++#define XEN_PCI_OP_enable_msi (2) ++#define XEN_PCI_OP_disable_msi (3) ++#define XEN_PCI_OP_enable_msix (4) ++#define XEN_PCI_OP_disable_msix (5) ++#define XEN_PCI_OP_aer_detected (6) ++#define XEN_PCI_OP_aer_resume (7) ++#define XEN_PCI_OP_aer_mmio (8) ++#define XEN_PCI_OP_aer_slotreset (9) + + /* xen_pci_op error numbers */ + #define XEN_PCI_ERR_success (0) +@@ -82,10 +90,25 @@ + struct xen_msix_entry msix_entries[SH_INFO_MAX_VEC]; + }; + ++/*used for pcie aer handling*/ ++struct xen_pcie_aer_op ++{ ++ ++ /* IN: what action to perform: XEN_PCI_OP_* */ ++ uint32_t cmd; ++ /*IN/OUT: return aer_op result or carry error_detected state as input*/ ++ int32_t err; ++ ++ /* IN: which device to touch */ ++ uint32_t domain; /* PCI Domain/Segment*/ ++ uint32_t bus; ++ uint32_t devfn; ++}; + struct xen_pci_sharedinfo { + /* flags - XEN_PCIF_* */ + uint32_t flags; + struct xen_pci_op op; ++ struct xen_pcie_aer_op aer_op; + }; + + #endif /* __XEN_PCI_COMMON_H__ */ diff --git a/master/linux-2.6.18-xen.hg-767.78d81e85e8cd b/master/linux-2.6.18-xen.hg-767.78d81e85e8cd new file mode 100644 index 0000000..bf1c991 --- /dev/null +++ b/master/linux-2.6.18-xen.hg-767.78d81e85e8cd @@ -0,0 +1,32 @@ +# HG changeset patch +# User Keir Fraser +# Date 1231152848 0 +# Node ID 78d81e85e8cd8a0a26bc9b760c67d435341f43f8 +# Parent 2fdc121e9b5d76464b3efd47d711c58253ef6348 +Bind PCI back driver to PCI device specified by "guestdev=". + +This patch binds PCI back driver to PCI device specified by +"guestdev=" boot parameter. + +Signed-off-by: Yuji Shimada + +diff -r 2fdc121e9b5d -r 78d81e85e8cd drivers/xen/pciback/pci_stub.c +--- a/drivers/xen/pciback/pci_stub.c Mon Jan 05 10:53:44 2009 +0000 ++++ b/drivers/xen/pciback/pci_stub.c Mon Jan 05 10:54:08 2009 +0000 +@@ -427,6 +427,16 @@ + + dev_info(&dev->dev, "seizing device\n"); + err = pcistub_seize(dev); ++#ifdef CONFIG_PCI_GUESTDEV ++ } else if (dev->hdr_type == PCI_HEADER_TYPE_NORMAL) { ++ if (!pci_is_guestdev(dev)) { ++ err = -ENODEV; ++ goto out; ++ } ++ ++ dev_info(&dev->dev, "seizing device\n"); ++ err = pcistub_seize(dev); ++#endif /* CONFIG_PCI_GUESTDEV */ + } else + /* Didn't find the device */ + err = -ENODEV; diff --git a/master/linux-2.6.18-xen.hg-778.0fadef4d5c46 b/master/linux-2.6.18-xen.hg-778.0fadef4d5c46 new file mode 100644 index 0000000..daaf55e --- /dev/null +++ b/master/linux-2.6.18-xen.hg-778.0fadef4d5c46 @@ -0,0 +1,31 @@ +# HG changeset patch +# User Keir Fraser +# Date 1232382317 0 +# Node ID 0fadef4d5c46ca1579c46e2f55d2f3a165db2a08 +# Parent d490aa798cc4efffca3f0dc4bbe41efa9d84e248 +pciback: Global 'permissive' module parameter. + +Signed-off-by: Keir Fraser + +diff -r d490aa798cc4 -r 0fadef4d5c46 drivers/xen/pciback/conf_space.c +--- a/drivers/xen/pciback/conf_space.c Wed Jan 14 14:04:07 2009 +0000 ++++ b/drivers/xen/pciback/conf_space.c Mon Jan 19 16:25:17 2009 +0000 +@@ -14,6 +14,9 @@ + #include "pciback.h" + #include "conf_space.h" + #include "conf_space_quirks.h" ++ ++static int permissive; ++module_param(permissive, bool, 0644); + + #define DEFINE_PCI_CONFIG(op,size,type) \ + int pciback_##op##_config_##size \ +@@ -255,7 +258,7 @@ + * This means that some fields may still be read-only because + * they have entries in the config_field list that intercept + * the write and do nothing. */ +- if (dev_data->permissive) { ++ if (dev_data->permissive || permissive) { + switch (size) { + case 1: + err = pci_write_config_byte(dev, offset, diff --git a/master/linux-2.6.18-xen.hg-792.db9857bb0320 b/master/linux-2.6.18-xen.hg-792.db9857bb0320 new file mode 100644 index 0000000..d05a401 --- /dev/null +++ b/master/linux-2.6.18-xen.hg-792.db9857bb0320 @@ -0,0 +1,106 @@ +# HG changeset patch +# User Keir Fraser +# Date 1233847486 0 +# Node ID db9857bb03203fd02405fa446b9a63cd268be2b6 +# Parent 4f998fd102e24daa471482730d1a3ff68faa1ad6 +netback: add ethtool stat to track copied skbs. + +Copied skbs should be rare but we have no way of verifying that. + +Signed-off-by: Ian Campbell + +diff -r 4f998fd102e2 -r db9857bb0320 drivers/xen/netback/common.h +--- a/drivers/xen/netback/common.h Wed Feb 04 12:26:00 2009 +0000 ++++ b/drivers/xen/netback/common.h Thu Feb 05 15:24:46 2009 +0000 +@@ -94,6 +94,9 @@ + /* Enforce draining of the transmit queue. */ + struct timer_list tx_queue_timeout; + ++ /* Statistics */ ++ int nr_copied_skbs; ++ + /* Miscellaneous private stuff. */ + struct list_head list; /* scheduling list */ + atomic_t refcnt; +diff -r 4f998fd102e2 -r db9857bb0320 drivers/xen/netback/interface.c +--- a/drivers/xen/netback/interface.c Wed Feb 04 12:26:00 2009 +0000 ++++ b/drivers/xen/netback/interface.c Thu Feb 05 15:24:46 2009 +0000 +@@ -116,8 +116,51 @@ + return ethtool_op_set_tso(dev, data); + } + ++static void netbk_get_drvinfo(struct net_device *dev, ++ struct ethtool_drvinfo *info) ++{ ++ strcpy(info->driver, "netbk"); ++} ++ ++static const struct netif_stat { ++ char name[ETH_GSTRING_LEN]; ++ u16 offset; ++} netbk_stats[] = { ++ { "copied_skbs", offsetof(netif_t, nr_copied_skbs) }, ++}; ++ ++static int netbk_get_stats_count(struct net_device *dev) ++{ ++ return ARRAY_SIZE(netbk_stats); ++} ++ ++static void netbk_get_ethtool_stats(struct net_device *dev, ++ struct ethtool_stats *stats, u64 * data) ++{ ++ void *netif = netdev_priv(dev); ++ int i; ++ ++ for (i = 0; i < ARRAY_SIZE(netbk_stats); i++) ++ data[i] = *(int *)(netif + netbk_stats[i].offset); ++} ++ ++static void netbk_get_strings(struct net_device *dev, u32 stringset, u8 * data) ++{ ++ int i; ++ ++ switch (stringset) { ++ case ETH_SS_STATS: ++ for (i = 0; i < ARRAY_SIZE(netbk_stats); i++) ++ memcpy(data + i * ETH_GSTRING_LEN, ++ netbk_stats[i].name, ETH_GSTRING_LEN); ++ break; ++ } ++} ++ + static struct ethtool_ops network_ethtool_ops = + { ++ .get_drvinfo = netbk_get_drvinfo, ++ + .get_tx_csum = ethtool_op_get_tx_csum, + .set_tx_csum = ethtool_op_set_tx_csum, + .get_sg = ethtool_op_get_sg, +@@ -125,6 +168,10 @@ + .get_tso = ethtool_op_get_tso, + .set_tso = netbk_set_tso, + .get_link = ethtool_op_get_link, ++ ++ .get_stats_count = netbk_get_stats_count, ++ .get_ethtool_stats = netbk_get_ethtool_stats, ++ .get_strings = netbk_get_strings, + }; + + netif_t *netif_alloc(domid_t domid, unsigned int handle) +diff -r 4f998fd102e2 -r db9857bb0320 drivers/xen/netback/netback.c +--- a/drivers/xen/netback/netback.c Wed Feb 04 12:26:00 2009 +0000 ++++ b/drivers/xen/netback/netback.c Thu Feb 05 15:24:46 2009 +0000 +@@ -914,7 +914,11 @@ + if (time_after(inuse->alloc_time + HZ / 2, jiffies)) + break; + +- switch (copy_pending_req(inuse - pending_inuse)) { ++ pending_idx = inuse - pending_inuse; ++ ++ pending_tx_info[pending_idx].netif->nr_copied_skbs++; ++ ++ switch (copy_pending_req(pending_idx)) { + case 0: + list_move_tail(&inuse->list, &list); + continue; diff --git a/master/linux-2.6.18-xen.hg-793.3aa9b8a7876b b/master/linux-2.6.18-xen.hg-793.3aa9b8a7876b new file mode 100644 index 0000000..0dc8d0b --- /dev/null +++ b/master/linux-2.6.18-xen.hg-793.3aa9b8a7876b @@ -0,0 +1,45 @@ +# HG changeset patch +# User Keir Fraser +# Date 1233921716 0 +# Node ID 3aa9b8a7876b7f2ed7ad9663edb460e4710c22da +# Parent db9857bb03203fd02405fa446b9a63cd268be2b6 +netback: make queue length parameter writeable in sysfs + +Any changes will only take effect for newly created VIFs. + +Also hook up the vif devices to their parent and publish bus info via +ethtool. + +Signed-off-by: Ian Campbell + +diff -r 9abfe8f9d934 drivers/xen/netback/interface.c +--- a/drivers/xen/netback/interface.c Thu Feb 05 15:24:46 2009 +0000 ++++ b/drivers/xen/netback/interface.c Wed Jun 17 10:39:02 2009 +0100 +@@ -49,7 +49,7 @@ + * blocked. + */ + static unsigned long netbk_queue_length = 32; +-module_param_named(queue_length, netbk_queue_length, ulong, 0); ++module_param_named(queue_length, netbk_queue_length, ulong, 0644); + + static void __netif_up(netif_t *netif) + { +@@ -120,6 +120,7 @@ + struct ethtool_drvinfo *info) + { + strcpy(info->driver, "netbk"); ++ strcpy(info->bus_info, dev->dev.parent->bus_id); + } + + static const struct netif_stat { +diff -r 9abfe8f9d934 drivers/xen/netback/xenbus.c +--- a/drivers/xen/netback/xenbus.c Thu Feb 05 15:24:46 2009 +0000 ++++ b/drivers/xen/netback/xenbus.c Wed Jun 17 10:39:02 2009 +0100 +@@ -188,6 +188,7 @@ + xenbus_dev_fatal(dev, err, "reading handle"); + return; + } ++ SET_NETDEV_DEV(be->netif->dev, &dev->dev); + + be->netif = netif_alloc(dev->otherend_id, handle); + if (IS_ERR(be->netif)) { diff --git a/master/linux-2.6.18-xen.hg-820.8b86d11a6eb3 b/master/linux-2.6.18-xen.hg-820.8b86d11a6eb3 new file mode 100644 index 0000000..1b88189 --- /dev/null +++ b/master/linux-2.6.18-xen.hg-820.8b86d11a6eb3 @@ -0,0 +1,56 @@ +# HG changeset patch +# User Keir Fraser +# Date 1237299711 0 +# Node ID 8b86d11a6eb39550304ab118dcade4902927a1c8 +# Parent e8a9f8910a3f113759906e493eaa211e2c43cd85 +netback: parent sysfs device should be set before registering. + +Signed-off-by: Ian Campbell + +diff -r 2fa5b0a6ad20 drivers/xen/netback/common.h +--- a/drivers/xen/netback/common.h Fri Feb 06 12:01:56 2009 +0000 ++++ b/drivers/xen/netback/common.h Wed Jun 17 10:52:30 2009 +0100 +@@ -182,7 +182,7 @@ + + void netif_disconnect(netif_t *netif); + +-netif_t *netif_alloc(domid_t domid, unsigned int handle); ++netif_t *netif_alloc(struct device *parent, domid_t domid, unsigned int handle); + int netif_map(netif_t *netif, unsigned long tx_ring_ref, + unsigned long rx_ring_ref, unsigned int evtchn); + +diff -r 2fa5b0a6ad20 drivers/xen/netback/interface.c +--- a/drivers/xen/netback/interface.c Fri Feb 06 12:01:56 2009 +0000 ++++ b/drivers/xen/netback/interface.c Wed Jun 17 10:52:30 2009 +0100 +@@ -175,7 +175,7 @@ + .get_strings = netbk_get_strings, + }; + +-netif_t *netif_alloc(domid_t domid, unsigned int handle) ++netif_t *netif_alloc(struct device *parent, domid_t domid, unsigned int handle) + { + int err = 0; + struct net_device *dev; +@@ -188,6 +188,8 @@ + DPRINTK("Could not create netif: out of memory\n"); + return ERR_PTR(-ENOMEM); + } ++ ++ SET_NETDEV_DEV(dev, parent); + + netif = netdev_priv(dev); + memset(netif, 0, sizeof(*netif)); +diff -r 2fa5b0a6ad20 drivers/xen/netback/xenbus.c +--- a/drivers/xen/netback/xenbus.c Fri Feb 06 12:01:56 2009 +0000 ++++ b/drivers/xen/netback/xenbus.c Wed Jun 17 10:52:30 2009 +0100 +@@ -188,9 +188,8 @@ + xenbus_dev_fatal(dev, err, "reading handle"); + return; + } +- SET_NETDEV_DEV(be->netif->dev, &dev->dev); + +- be->netif = netif_alloc(dev->otherend_id, handle); ++ be->netif = netif_alloc(&dev->dev, dev->otherend_id, handle); + if (IS_ERR(be->netif)) { + err = PTR_ERR(be->netif); + be->netif = NULL; diff --git a/master/linux-2.6.18-xen.hg-832.c0f2f398aa3c b/master/linux-2.6.18-xen.hg-832.c0f2f398aa3c index 90708d5..db46fd8 100644 --- a/master/linux-2.6.18-xen.hg-832.c0f2f398aa3c +++ b/master/linux-2.6.18-xen.hg-832.c0f2f398aa3c @@ -17,23 +17,14 @@ in PV domU. Signed-off-by: Tim Deegan -diff -r c1f0373ff44e -r c0f2f398aa3c arch/x86/kernel/time_32-xen.c ---- a/arch/x86/kernel/time_32-xen.c Wed Mar 18 11:45:30 2009 +0000 -+++ b/arch/x86/kernel/time_32-xen.c Wed Mar 18 11:51:05 2009 +0000 -@@ -286,8 +286,6 @@ - - set_normalized_timespec(&xtime, xtime_sec, xtime_nsec); - set_normalized_timespec(&wall_to_monotonic, wtm_sec, wtm_nsec); -- -- ntp_clear(); - } - - static void update_wallclock(void) -@@ -496,6 +494,7 @@ - __normalize_time(&sec, &nsec); - __update_wallclock(sec, nsec); +diff -r 6e8c076e0b41 arch/x86/kernel/time_32-xen.c +--- a/arch/x86/kernel/time_32-xen.c Tue Jun 16 16:13:51 2009 +0100 ++++ b/arch/x86/kernel/time_32-xen.c Tue Jun 16 16:16:10 2009 +0100 +@@ -512,6 +512,7 @@ + printk(" %d: %lld\n", i, + per_cpu(processed_system_time, i)); } + ntp_clear(); - /* Reset monotonic gettimeofday() timeval. */ - spin_lock(&monotonic_lock); + /* System-wide jiffy work. */ + if (delta >= NS_PER_TICK) { diff --git a/master/linux-2.6.27.23-0.1.1.patch b/master/linux-2.6.27.23-0.1.1.patch new file mode 100644 index 0000000..11e0418 --- /dev/null +++ b/master/linux-2.6.27.23-0.1.1.patch @@ -0,0 +1,28497 @@ +diff -urN linux-2.6.27.19-5.1/arch/arm/mach-rpc/riscpc.c linux-2.6.27.23-0.1.1/arch/arm/mach-rpc/riscpc.c +--- linux-2.6.27.19-5.1/arch/arm/mach-rpc/riscpc.c 2009-06-16 13:53:28.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/arm/mach-rpc/riscpc.c 2009-06-16 13:39:53.000000000 +0100 +@@ -18,6 +18,7 @@ + #include + #include + #include ++#include + + #include + #include +@@ -201,8 +202,13 @@ + &pata_device, + }; + ++static struct i2c_board_info i2c_rtc = { ++ I2C_BOARD_INFO("pcf8583", 0x50) ++}; ++ + static int __init rpc_init(void) + { ++ i2c_register_board_info(0, &i2c_rtc, 1); + return platform_add_devices(devs, ARRAY_SIZE(devs)); + } + +diff -urN linux-2.6.27.19-5.1/arch/ia64/include/asm/mmzone.h linux-2.6.27.23-0.1.1/arch/ia64/include/asm/mmzone.h +--- linux-2.6.27.19-5.1/arch/ia64/include/asm/mmzone.h 2009-06-16 13:53:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/ia64/include/asm/mmzone.h 2009-06-16 13:40:03.000000000 +0100 +@@ -31,10 +31,6 @@ + #endif + } + +-#ifdef CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID +-extern int early_pfn_to_nid(unsigned long pfn); +-#endif +- + #ifdef CONFIG_IA64_DIG /* DIG systems are small */ + # define MAX_PHYSNODE_ID 8 + # define NR_NODE_MEMBLKS (MAX_NUMNODES * 8) +diff -urN linux-2.6.27.19-5.1/arch/ia64/Kconfig linux-2.6.27.23-0.1.1/arch/ia64/Kconfig +--- linux-2.6.27.19-5.1/arch/ia64/Kconfig 2009-06-16 13:53:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/ia64/Kconfig 2009-06-16 13:40:03.000000000 +0100 +@@ -446,8 +446,7 @@ + default y if VIRTUAL_MEM_MAP + + config HAVE_ARCH_EARLY_PFN_TO_NID +- def_bool y +- depends on NEED_MULTIPLE_NODES ++ def_bool NUMA && SPARSEMEM + + config HAVE_ARCH_NODEDATA_EXTENSION + def_bool y +diff -urN linux-2.6.27.19-5.1/arch/ia64/kernel/acpi.c linux-2.6.27.23-0.1.1/arch/ia64/kernel/acpi.c +--- linux-2.6.27.19-5.1/arch/ia64/kernel/acpi.c 2009-06-16 13:53:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/ia64/kernel/acpi.c 2009-06-16 13:40:03.000000000 +0100 +@@ -430,22 +430,24 @@ + static struct acpi_table_slit __initdata *slit_table; + cpumask_t early_cpu_possible_map = CPU_MASK_NONE; + +-static int get_processor_proximity_domain(struct acpi_srat_cpu_affinity *pa) ++static int __init ++get_processor_proximity_domain(struct acpi_srat_cpu_affinity *pa) + { + int pxm; + + pxm = pa->proximity_domain_lo; +- if (ia64_platform_is("sn2")) ++ if (ia64_platform_is("sn2") || acpi_srat_revision >= 2) + pxm += pa->proximity_domain_hi[0] << 8; + return pxm; + } + +-static int get_memory_proximity_domain(struct acpi_srat_mem_affinity *ma) ++static int __init ++get_memory_proximity_domain(struct acpi_srat_mem_affinity *ma) + { + int pxm; + + pxm = ma->proximity_domain; +- if (!ia64_platform_is("sn2")) ++ if (!ia64_platform_is("sn2") && acpi_srat_revision <= 1) + pxm &= 0xff; + + return pxm; +diff -urN linux-2.6.27.19-5.1/arch/ia64/kernel/smp.c linux-2.6.27.23-0.1.1/arch/ia64/kernel/smp.c +--- linux-2.6.27.19-5.1/arch/ia64/kernel/smp.c 2009-06-16 13:53:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/ia64/kernel/smp.c 2009-06-16 13:40:03.000000000 +0100 +@@ -314,15 +314,12 @@ + return; + } + ++ smp_call_function_mask(mm->cpu_vm_mask, ++ (void (*)(void *))local_finish_flush_tlb_mm, mm, 1); ++ local_irq_disable(); ++ local_finish_flush_tlb_mm(mm); ++ local_irq_enable(); + preempt_enable(); +- /* +- * We could optimize this further by using mm->cpu_vm_mask to track which CPUs +- * have been running in the address space. It's not clear that this is worth the +- * trouble though: to avoid races, we have to raise the IPI on the target CPU +- * anyhow, and once a CPU is interrupted, the cost of local_flush_tlb_all() is +- * rather trivial. +- */ +- on_each_cpu((void (*)(void *))local_finish_flush_tlb_mm, mm, 1); + } + + void arch_send_call_function_single_ipi(int cpu) +diff -urN linux-2.6.27.19-5.1/arch/ia64/mm/numa.c linux-2.6.27.23-0.1.1/arch/ia64/mm/numa.c +--- linux-2.6.27.19-5.1/arch/ia64/mm/numa.c 2009-06-16 13:53:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/ia64/mm/numa.c 2009-06-16 13:40:03.000000000 +0100 +@@ -58,7 +58,7 @@ + * SPARSEMEM to allocate the SPARSEMEM sectionmap on the NUMA node where + * the section resides. + */ +-int early_pfn_to_nid(unsigned long pfn) ++int __meminit __early_pfn_to_nid(unsigned long pfn) + { + int i, section = pfn >> PFN_SECTION_SHIFT, ssec, esec; + +@@ -70,7 +70,7 @@ + return node_memblk[i].nid; + } + +- return 0; ++ return -1; + } + + #ifdef CONFIG_MEMORY_HOTPLUG +diff -urN linux-2.6.27.19-5.1/arch/mips/Kconfig linux-2.6.27.23-0.1.1/arch/mips/Kconfig +--- linux-2.6.27.19-5.1/arch/mips/Kconfig 2009-06-16 13:53:46.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/mips/Kconfig 2009-06-16 13:40:03.000000000 +0100 +@@ -1293,6 +1293,7 @@ + config 64BIT + bool "64-bit kernel" + depends on CPU_SUPPORTS_64BIT_KERNEL && SYS_SUPPORTS_64BIT_KERNEL ++ select HAVE_SYSCALL_WRAPPERS + help + Select this option if you want to build a 64-bit kernel. + +diff -urN linux-2.6.27.19-5.1/arch/mips/kernel/linux32.c linux-2.6.27.23-0.1.1/arch/mips/kernel/linux32.c +--- linux-2.6.27.19-5.1/arch/mips/kernel/linux32.c 2009-06-16 13:53:47.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/mips/kernel/linux32.c 2009-06-16 13:40:08.000000000 +0100 +@@ -32,6 +32,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -98,9 +99,9 @@ + return copy_to_user(statbuf, &tmp, sizeof(tmp)) ? -EFAULT : 0; + } + +-asmlinkage unsigned long +-sys32_mmap2(unsigned long addr, unsigned long len, unsigned long prot, +- unsigned long flags, unsigned long fd, unsigned long pgoff) ++SYSCALL_DEFINE6(32_mmap2, unsigned long, addr, unsigned long, len, ++ unsigned long, prot, unsigned long, flags, unsigned long, fd, ++ unsigned long, pgoff) + { + struct file * file = NULL; + unsigned long error; +@@ -156,14 +157,14 @@ + int rlim_max; + }; + +-asmlinkage long sys32_truncate64(const char __user * path, +- unsigned long __dummy, int a2, int a3) ++SYSCALL_DEFINE4(32_truncate64, const char __user *, path, ++ unsigned long, __dummy, unsigned long, a2, unsigned long, a3) + { + return sys_truncate(path, merge_64(a2, a3)); + } + +-asmlinkage long sys32_ftruncate64(unsigned int fd, unsigned long __dummy, +- int a2, int a3) ++SYSCALL_DEFINE4(32_ftruncate64, unsigned long, fd, unsigned long, __dummy, ++ unsigned long, a2, unsigned long, a3) + { + return sys_ftruncate(fd, merge_64(a2, a3)); + } +@@ -234,9 +235,9 @@ + return do_sys_settimeofday(tv ? &kts : NULL, tz ? &ktz : NULL); + } + +-asmlinkage int sys32_llseek(unsigned int fd, unsigned int offset_high, +- unsigned int offset_low, loff_t __user * result, +- unsigned int origin) ++SYSCALL_DEFINE5(32_llseek, unsigned int, fd, unsigned int, offset_high, ++ unsigned int, offset_low, loff_t __user *, result, ++ unsigned int, origin) + { + return sys_llseek(fd, offset_high, offset_low, result, origin); + } +@@ -245,20 +246,20 @@ + lseek back to original location. They fail just like lseek does on + non-seekable files. */ + +-asmlinkage ssize_t sys32_pread(unsigned int fd, char __user * buf, +- size_t count, u32 unused, u64 a4, u64 a5) ++SYSCALL_DEFINE6(32_pread, unsigned long, fd, char __user *, buf, size_t, count, ++ unsigned long, unused, unsigned long, a4, unsigned long, a5) + { + return sys_pread64(fd, buf, count, merge_64(a4, a5)); + } + +-asmlinkage ssize_t sys32_pwrite(unsigned int fd, const char __user * buf, +- size_t count, u32 unused, u64 a4, u64 a5) ++SYSCALL_DEFINE6(32_pwrite, unsigned int, fd, const char __user *, buf, ++ size_t, count, u32, unused, u64, a4, u64, a5) + { + return sys_pwrite64(fd, buf, count, merge_64(a4, a5)); + } + +-asmlinkage int sys32_sched_rr_get_interval(compat_pid_t pid, +- struct compat_timespec __user *interval) ++SYSCALL_DEFINE2(32_sched_rr_get_interval, compat_pid_t, pid, ++ struct compat_timespec __user *, interval) + { + struct timespec t; + int ret; +@@ -275,8 +276,8 @@ + + #ifdef CONFIG_SYSVIPC + +-asmlinkage long +-sys32_ipc(u32 call, int first, int second, int third, u32 ptr, u32 fifth) ++SYSCALL_DEFINE6(32_ipc, u32, call, long, first, long, second, long, third, ++ unsigned long, ptr, unsigned long, fifth) + { + int version, err; + +@@ -334,8 +335,8 @@ + + #else + +-asmlinkage long +-sys32_ipc(u32 call, int first, int second, int third, u32 ptr, u32 fifth) ++SYSCALL_DEFINE6(32_ipc, u32, call, int, first, int, second, int, third, ++ u32, ptr, u32, fifth) + { + return -ENOSYS; + } +@@ -343,7 +344,7 @@ + #endif /* CONFIG_SYSVIPC */ + + #ifdef CONFIG_MIPS32_N32 +-asmlinkage long sysn32_semctl(int semid, int semnum, int cmd, u32 arg) ++SYSCALL_DEFINE4(n32_semctl, int, semid, int, semnum, int, cmd, u32, arg) + { + /* compat_sys_semctl expects a pointer to union semun */ + u32 __user *uptr = compat_alloc_user_space(sizeof(u32)); +@@ -352,13 +353,14 @@ + return compat_sys_semctl(semid, semnum, cmd, uptr); + } + +-asmlinkage long sysn32_msgsnd(int msqid, u32 msgp, unsigned msgsz, int msgflg) ++SYSCALL_DEFINE4(n32_msgsnd, int, msqid, u32, msgp, unsigned int, msgsz, ++ int, msgflg) + { + return compat_sys_msgsnd(msqid, msgsz, msgflg, compat_ptr(msgp)); + } + +-asmlinkage long sysn32_msgrcv(int msqid, u32 msgp, size_t msgsz, int msgtyp, +- int msgflg) ++SYSCALL_DEFINE5(n32_msgrcv, int, msqid, u32, msgp, size_t, msgsz, ++ int, msgtyp, int, msgflg) + { + return compat_sys_msgrcv(msqid, msgsz, msgtyp, msgflg, IPC_64, + compat_ptr(msgp)); +@@ -378,7 +380,7 @@ + + #ifdef CONFIG_SYSCTL_SYSCALL + +-asmlinkage long sys32_sysctl(struct sysctl_args32 __user *args) ++SYSCALL_DEFINE1(32_sysctl, struct sysctl_args32 __user *, args) + { + struct sysctl_args32 tmp; + int error; +@@ -417,9 +419,16 @@ + return error; + } + ++#else ++ ++SYSCALL_DEFINE1(32_sysctl, struct sysctl_args32 __user *, args) ++{ ++ return -ENOSYS; ++} ++ + #endif /* CONFIG_SYSCTL_SYSCALL */ + +-asmlinkage long sys32_newuname(struct new_utsname __user * name) ++SYSCALL_DEFINE1(32_newuname, struct new_utsname __user *, name) + { + int ret = 0; + +@@ -435,7 +444,7 @@ + return ret; + } + +-asmlinkage int sys32_personality(unsigned long personality) ++SYSCALL_DEFINE1(32_personality, unsigned long, personality) + { + int ret; + personality &= 0xffffffff; +@@ -458,7 +467,7 @@ + + extern asmlinkage long sys_ustat(dev_t dev, struct ustat __user * ubuf); + +-asmlinkage int sys32_ustat(dev_t dev, struct ustat32 __user * ubuf32) ++SYSCALL_DEFINE2(32_ustat, dev_t, dev, struct ustat32 __user *, ubuf32) + { + int err; + struct ustat tmp; +@@ -482,8 +491,8 @@ + return err; + } + +-asmlinkage int sys32_sendfile(int out_fd, int in_fd, compat_off_t __user *offset, +- s32 count) ++SYSCALL_DEFINE4(32_sendfile, long, out_fd, long, in_fd, ++ compat_off_t __user *, offset, s32, count) + { + mm_segment_t old_fs = get_fs(); + int ret; +diff -urN linux-2.6.27.19-5.1/arch/mips/kernel/scall32-o32.S linux-2.6.27.23-0.1.1/arch/mips/kernel/scall32-o32.S +--- linux-2.6.27.19-5.1/arch/mips/kernel/scall32-o32.S 2009-06-16 13:53:47.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/mips/kernel/scall32-o32.S 2009-06-16 13:40:08.000000000 +0100 +@@ -402,7 +402,7 @@ + sys sys_swapon 2 + sys sys_reboot 3 + sys sys_old_readdir 3 +- sys old_mmap 6 /* 4090 */ ++ sys sys_mips_mmap 6 /* 4090 */ + sys sys_munmap 2 + sys sys_truncate 2 + sys sys_ftruncate 2 +@@ -522,7 +522,7 @@ + sys sys_sendfile 4 + sys sys_ni_syscall 0 + sys sys_ni_syscall 0 +- sys sys_mmap2 6 /* 4210 */ ++ sys sys_mips_mmap2 6 /* 4210 */ + sys sys_truncate64 4 + sys sys_ftruncate64 4 + sys sys_stat64 2 +diff -urN linux-2.6.27.19-5.1/arch/mips/kernel/scall64-64.S linux-2.6.27.23-0.1.1/arch/mips/kernel/scall64-64.S +--- linux-2.6.27.19-5.1/arch/mips/kernel/scall64-64.S 2009-06-16 13:53:47.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/mips/kernel/scall64-64.S 2009-06-16 13:40:08.000000000 +0100 +@@ -207,7 +207,7 @@ + PTR sys_newlstat + PTR sys_poll + PTR sys_lseek +- PTR old_mmap ++ PTR sys_mips_mmap + PTR sys_mprotect /* 5010 */ + PTR sys_munmap + PTR sys_brk +diff -urN linux-2.6.27.19-5.1/arch/mips/kernel/scall64-n32.S linux-2.6.27.23-0.1.1/arch/mips/kernel/scall64-n32.S +--- linux-2.6.27.19-5.1/arch/mips/kernel/scall64-n32.S 2009-06-16 13:53:47.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/mips/kernel/scall64-n32.S 2009-06-16 13:40:08.000000000 +0100 +@@ -129,12 +129,12 @@ + PTR sys_newlstat + PTR sys_poll + PTR sys_lseek +- PTR old_mmap ++ PTR sys_mips_mmap + PTR sys_mprotect /* 6010 */ + PTR sys_munmap + PTR sys_brk +- PTR sys32_rt_sigaction +- PTR sys32_rt_sigprocmask ++ PTR sys_32_rt_sigaction ++ PTR sys_32_rt_sigprocmask + PTR compat_sys_ioctl /* 6015 */ + PTR sys_pread64 + PTR sys_pwrite64 +@@ -159,7 +159,7 @@ + PTR compat_sys_setitimer + PTR sys_alarm + PTR sys_getpid +- PTR sys32_sendfile ++ PTR sys_32_sendfile + PTR sys_socket /* 6040 */ + PTR sys_connect + PTR sys_accept +@@ -181,14 +181,14 @@ + PTR sys_exit + PTR compat_sys_wait4 + PTR sys_kill /* 6060 */ +- PTR sys32_newuname ++ PTR sys_32_newuname + PTR sys_semget + PTR sys_semop +- PTR sysn32_semctl ++ PTR sys_n32_semctl + PTR sys_shmdt /* 6065 */ + PTR sys_msgget +- PTR sysn32_msgsnd +- PTR sysn32_msgrcv ++ PTR sys_n32_msgsnd ++ PTR sys_n32_msgrcv + PTR compat_sys_msgctl + PTR compat_sys_fcntl /* 6070 */ + PTR sys_flock +@@ -245,15 +245,15 @@ + PTR sys_getsid + PTR sys_capget + PTR sys_capset +- PTR sys32_rt_sigpending /* 6125 */ ++ PTR sys_32_rt_sigpending /* 6125 */ + PTR compat_sys_rt_sigtimedwait +- PTR sys32_rt_sigqueueinfo ++ PTR sys_32_rt_sigqueueinfo + PTR sysn32_rt_sigsuspend + PTR sys32_sigaltstack + PTR compat_sys_utime /* 6130 */ + PTR sys_mknod +- PTR sys32_personality +- PTR sys32_ustat ++ PTR sys_32_personality ++ PTR sys_32_ustat + PTR compat_sys_statfs + PTR compat_sys_fstatfs /* 6135 */ + PTR sys_sysfs +@@ -265,14 +265,14 @@ + PTR sys_sched_getscheduler + PTR sys_sched_get_priority_max + PTR sys_sched_get_priority_min +- PTR sys32_sched_rr_get_interval /* 6145 */ ++ PTR sys_32_sched_rr_get_interval /* 6145 */ + PTR sys_mlock + PTR sys_munlock + PTR sys_mlockall + PTR sys_munlockall + PTR sys_vhangup /* 6150 */ + PTR sys_pivot_root +- PTR sys32_sysctl ++ PTR sys_32_sysctl + PTR sys_prctl + PTR compat_sys_adjtimex + PTR compat_sys_setrlimit /* 6155 */ +diff -urN linux-2.6.27.19-5.1/arch/mips/kernel/scall64-o32.S linux-2.6.27.23-0.1.1/arch/mips/kernel/scall64-o32.S +--- linux-2.6.27.19-5.1/arch/mips/kernel/scall64-o32.S 2009-06-16 13:53:47.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/mips/kernel/scall64-o32.S 2009-06-16 13:40:08.000000000 +0100 +@@ -267,12 +267,12 @@ + PTR sys_olduname + PTR sys_umask /* 4060 */ + PTR sys_chroot +- PTR sys32_ustat ++ PTR sys_32_ustat + PTR sys_dup2 + PTR sys_getppid + PTR sys_getpgrp /* 4065 */ + PTR sys_setsid +- PTR sys32_sigaction ++ PTR sys_32_sigaction + PTR sys_sgetmask + PTR sys_ssetmask + PTR sys_setreuid /* 4070 */ +@@ -295,7 +295,7 @@ + PTR sys_swapon + PTR sys_reboot + PTR compat_sys_old_readdir +- PTR old_mmap /* 4090 */ ++ PTR sys_mips_mmap /* 4090 */ + PTR sys_munmap + PTR sys_truncate + PTR sys_ftruncate +@@ -322,12 +322,12 @@ + PTR compat_sys_wait4 + PTR sys_swapoff /* 4115 */ + PTR compat_sys_sysinfo +- PTR sys32_ipc ++ PTR sys_32_ipc + PTR sys_fsync + PTR sys32_sigreturn + PTR sys32_clone /* 4120 */ + PTR sys_setdomainname +- PTR sys32_newuname ++ PTR sys_32_newuname + PTR sys_ni_syscall /* sys_modify_ldt */ + PTR compat_sys_adjtimex + PTR sys_mprotect /* 4125 */ +@@ -341,11 +341,11 @@ + PTR sys_fchdir + PTR sys_bdflush + PTR sys_sysfs /* 4135 */ +- PTR sys32_personality ++ PTR sys_32_personality + PTR sys_ni_syscall /* for afs_syscall */ + PTR sys_setfsuid + PTR sys_setfsgid +- PTR sys32_llseek /* 4140 */ ++ PTR sys_32_llseek /* 4140 */ + PTR compat_sys_getdents + PTR compat_sys_select + PTR sys_flock +@@ -358,7 +358,7 @@ + PTR sys_ni_syscall /* 4150 */ + PTR sys_getsid + PTR sys_fdatasync +- PTR sys32_sysctl ++ PTR sys_32_sysctl + PTR sys_mlock + PTR sys_munlock /* 4155 */ + PTR sys_mlockall +@@ -370,7 +370,7 @@ + PTR sys_sched_yield + PTR sys_sched_get_priority_max + PTR sys_sched_get_priority_min +- PTR sys32_sched_rr_get_interval /* 4165 */ ++ PTR sys_32_sched_rr_get_interval /* 4165 */ + PTR compat_sys_nanosleep + PTR sys_mremap + PTR sys_accept +@@ -399,25 +399,25 @@ + PTR sys_getresgid + PTR sys_prctl + PTR sys32_rt_sigreturn +- PTR sys32_rt_sigaction +- PTR sys32_rt_sigprocmask /* 4195 */ +- PTR sys32_rt_sigpending ++ PTR sys_32_rt_sigaction ++ PTR sys_32_rt_sigprocmask /* 4195 */ ++ PTR sys_32_rt_sigpending + PTR compat_sys_rt_sigtimedwait +- PTR sys32_rt_sigqueueinfo ++ PTR sys_32_rt_sigqueueinfo + PTR sys32_rt_sigsuspend +- PTR sys32_pread /* 4200 */ +- PTR sys32_pwrite ++ PTR sys_32_pread /* 4200 */ ++ PTR sys_32_pwrite + PTR sys_chown + PTR sys_getcwd + PTR sys_capget + PTR sys_capset /* 4205 */ + PTR sys32_sigaltstack +- PTR sys32_sendfile ++ PTR sys_32_sendfile + PTR sys_ni_syscall + PTR sys_ni_syscall +- PTR sys32_mmap2 /* 4210 */ +- PTR sys32_truncate64 +- PTR sys32_ftruncate64 ++ PTR sys_mips_mmap2 /* 4210 */ ++ PTR sys_32_truncate64 ++ PTR sys_32_ftruncate64 + PTR sys_newstat + PTR sys_newlstat + PTR sys_newfstat /* 4215 */ +@@ -483,7 +483,7 @@ + PTR compat_sys_mq_notify /* 4275 */ + PTR compat_sys_mq_getsetattr + PTR sys_ni_syscall /* sys_vserver */ +- PTR sys32_waitid ++ PTR sys_32_waitid + PTR sys_ni_syscall /* available, was setaltroot */ + PTR sys_add_key /* 4280 */ + PTR sys_request_key +diff -urN linux-2.6.27.19-5.1/arch/mips/kernel/signal32.c linux-2.6.27.23-0.1.1/arch/mips/kernel/signal32.c +--- linux-2.6.27.19-5.1/arch/mips/kernel/signal32.c 2009-06-16 13:53:47.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/mips/kernel/signal32.c 2009-06-16 13:40:08.000000000 +0100 +@@ -349,8 +349,8 @@ + return -ERESTARTNOHAND; + } + +-asmlinkage int sys32_sigaction(int sig, const struct sigaction32 __user *act, +- struct sigaction32 __user *oact) ++SYSCALL_DEFINE3(32_sigaction, long, sig, const struct sigaction32 __user *, act, ++ struct sigaction32 __user *, oact) + { + struct k_sigaction new_ka, old_ka; + int ret; +@@ -692,9 +692,9 @@ + .restart = __NR_O32_restart_syscall + }; + +-asmlinkage int sys32_rt_sigaction(int sig, const struct sigaction32 __user *act, +- struct sigaction32 __user *oact, +- unsigned int sigsetsize) ++SYSCALL_DEFINE4(32_rt_sigaction, int, sig, ++ const struct sigaction32 __user *, act, ++ struct sigaction32 __user *, oact, unsigned int, sigsetsize) + { + struct k_sigaction new_sa, old_sa; + int ret = -EINVAL; +@@ -736,8 +736,8 @@ + return ret; + } + +-asmlinkage int sys32_rt_sigprocmask(int how, compat_sigset_t __user *set, +- compat_sigset_t __user *oset, unsigned int sigsetsize) ++SYSCALL_DEFINE4(32_rt_sigprocmask, int, how, compat_sigset_t __user *, set, ++ compat_sigset_t __user *, oset, unsigned int, sigsetsize) + { + sigset_t old_set, new_set; + int ret; +@@ -758,8 +758,8 @@ + return ret; + } + +-asmlinkage int sys32_rt_sigpending(compat_sigset_t __user *uset, +- unsigned int sigsetsize) ++SYSCALL_DEFINE2(32_rt_sigpending, compat_sigset_t __user *, uset, ++ unsigned int, sigsetsize) + { + int ret; + sigset_t set; +@@ -775,7 +775,8 @@ + return ret; + } + +-asmlinkage int sys32_rt_sigqueueinfo(int pid, int sig, compat_siginfo_t __user *uinfo) ++SYSCALL_DEFINE3(32_rt_sigqueueinfo, int, pid, int, sig, ++ compat_siginfo_t __user *, uinfo) + { + siginfo_t info; + int ret; +@@ -790,10 +791,9 @@ + return ret; + } + +-asmlinkage long +-sys32_waitid(int which, compat_pid_t pid, +- compat_siginfo_t __user *uinfo, int options, +- struct compat_rusage __user *uru) ++SYSCALL_DEFINE5(32_waitid, int, which, compat_pid_t, pid, ++ compat_siginfo_t __user *, uinfo, int, options, ++ struct compat_rusage __user *, uru) + { + siginfo_t info; + struct rusage ru; +diff -urN linux-2.6.27.19-5.1/arch/mips/kernel/signal.c linux-2.6.27.23-0.1.1/arch/mips/kernel/signal.c +--- linux-2.6.27.19-5.1/arch/mips/kernel/signal.c 2009-06-16 13:53:47.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/mips/kernel/signal.c 2009-06-16 13:40:08.000000000 +0100 +@@ -19,6 +19,7 @@ + #include + #include + #include ++#include + #include + #include + +@@ -339,8 +340,8 @@ + } + + #ifdef CONFIG_TRAD_SIGNALS +-asmlinkage int sys_sigaction(int sig, const struct sigaction __user *act, +- struct sigaction __user *oact) ++SYSCALL_DEFINE3(sigaction, int, sig, const struct sigaction __user *, act, ++ struct sigaction __user *, oact) + { + struct k_sigaction new_ka, old_ka; + int ret; +diff -urN linux-2.6.27.19-5.1/arch/mips/kernel/syscall.c linux-2.6.27.23-0.1.1/arch/mips/kernel/syscall.c +--- linux-2.6.27.19-5.1/arch/mips/kernel/syscall.c 2009-06-16 13:53:47.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/mips/kernel/syscall.c 2009-06-16 13:40:08.000000000 +0100 +@@ -153,9 +153,9 @@ + return error; + } + +-asmlinkage unsigned long +-old_mmap(unsigned long addr, unsigned long len, int prot, +- int flags, int fd, off_t offset) ++SYSCALL_DEFINE6(mips_mmap, unsigned long, addr, unsigned long, len, ++ unsigned long, prot, unsigned long, flags, unsigned long, ++ fd, off_t, offset) + { + unsigned long result; + +@@ -169,9 +169,9 @@ + return result; + } + +-asmlinkage unsigned long +-sys_mmap2(unsigned long addr, unsigned long len, unsigned long prot, +- unsigned long flags, unsigned long fd, unsigned long pgoff) ++SYSCALL_DEFINE6(mips_mmap2, unsigned long, addr, unsigned long, len, ++ unsigned long, prot, unsigned long, flags, unsigned long, fd, ++ unsigned long, pgoff) + { + if (pgoff & (~PAGE_MASK >> 12)) + return -EINVAL; +@@ -241,7 +241,7 @@ + /* + * Compacrapability ... + */ +-asmlinkage int sys_uname(struct old_utsname __user * name) ++SYSCALL_DEFINE1(uname, struct old_utsname __user *, name) + { + if (name && !copy_to_user(name, utsname(), sizeof (*name))) + return 0; +@@ -251,7 +251,7 @@ + /* + * Compacrapability ... + */ +-asmlinkage int sys_olduname(struct oldold_utsname __user * name) ++SYSCALL_DEFINE1(olduname, struct oldold_utsname __user *, name) + { + int error; + +@@ -280,7 +280,7 @@ + return error; + } + +-asmlinkage int sys_set_thread_area(unsigned long addr) ++SYSCALL_DEFINE1(set_thread_area, unsigned long, addr) + { + struct thread_info *ti = task_thread_info(current); + +@@ -291,7 +291,7 @@ + return 0; + } + +-asmlinkage int _sys_sysmips(int cmd, long arg1, int arg2, int arg3) ++asmlinkage int _sys_sysmips(long cmd, long arg1, long arg2, long arg3) + { + switch (cmd) { + case MIPS_ATOMIC_SET: +@@ -326,8 +326,8 @@ + * + * This is really horribly ugly. + */ +-asmlinkage int sys_ipc(unsigned int call, int first, int second, +- unsigned long third, void __user *ptr, long fifth) ++SYSCALL_DEFINE6(ipc, unsigned int, call, int, first, int, second, ++ unsigned long, third, void __user *, ptr, long, fifth) + { + int version, ret; + +@@ -412,7 +412,7 @@ + /* + * No implemented yet ... + */ +-asmlinkage int sys_cachectl(char *addr, int nbytes, int op) ++SYSCALL_DEFINE3(cachectl, char *, addr, int, nbytes, int, op) + { + return -ENOSYS; + } +diff -urN linux-2.6.27.19-5.1/arch/mips/mm/cache.c linux-2.6.27.23-0.1.1/arch/mips/mm/cache.c +--- linux-2.6.27.19-5.1/arch/mips/mm/cache.c 2009-06-16 13:53:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/mips/mm/cache.c 2009-06-16 13:40:03.000000000 +0100 +@@ -13,6 +13,7 @@ + #include + #include + #include ++#include + #include + + #include +@@ -58,8 +59,8 @@ + * We could optimize the case where the cache argument is not BCACHE but + * that seems very atypical use ... + */ +-asmlinkage int sys_cacheflush(unsigned long addr, +- unsigned long bytes, unsigned int cache) ++SYSCALL_DEFINE3(cacheflush, unsigned long, addr, unsigned long, bytes, ++ unsigned int, cache) + { + if (bytes == 0) + return 0; +diff -urN linux-2.6.27.19-5.1/arch/powerpc/include/asm/compat.h linux-2.6.27.23-0.1.1/arch/powerpc/include/asm/compat.h +--- linux-2.6.27.19-5.1/arch/powerpc/include/asm/compat.h 2009-06-16 13:54:04.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/powerpc/include/asm/compat.h 2009-06-16 13:40:23.000000000 +0100 +@@ -210,5 +210,10 @@ + compat_ulong_t __unused6; + }; + ++static inline int is_compat_task(void) ++{ ++ return test_thread_flag(TIF_32BIT); ++} ++ + #endif /* __KERNEL__ */ + #endif /* _ASM_POWERPC_COMPAT_H */ +diff -urN linux-2.6.27.19-5.1/arch/powerpc/include/asm/futex.h linux-2.6.27.23-0.1.1/arch/powerpc/include/asm/futex.h +--- linux-2.6.27.19-5.1/arch/powerpc/include/asm/futex.h 2009-06-16 13:54:10.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/powerpc/include/asm/futex.h 2009-06-16 13:40:23.000000000 +0100 +@@ -27,7 +27,7 @@ + PPC_LONG "1b,4b,2b,4b\n" \ + ".previous" \ + : "=&r" (oldval), "=&r" (ret) \ +- : "b" (uaddr), "i" (-EFAULT), "1" (oparg) \ ++ : "b" (uaddr), "i" (-EFAULT), "r" (oparg) \ + : "cr0", "memory") + + static inline int futex_atomic_op_inuser (int encoded_op, int __user *uaddr) +@@ -47,19 +47,19 @@ + + switch (op) { + case FUTEX_OP_SET: +- __futex_atomic_op("", ret, oldval, uaddr, oparg); ++ __futex_atomic_op("mr %1,%4\n", ret, oldval, uaddr, oparg); + break; + case FUTEX_OP_ADD: +- __futex_atomic_op("add %1,%0,%1\n", ret, oldval, uaddr, oparg); ++ __futex_atomic_op("add %1,%0,%4\n", ret, oldval, uaddr, oparg); + break; + case FUTEX_OP_OR: +- __futex_atomic_op("or %1,%0,%1\n", ret, oldval, uaddr, oparg); ++ __futex_atomic_op("or %1,%0,%4\n", ret, oldval, uaddr, oparg); + break; + case FUTEX_OP_ANDN: +- __futex_atomic_op("andc %1,%0,%1\n", ret, oldval, uaddr, oparg); ++ __futex_atomic_op("andc %1,%0,%4\n", ret, oldval, uaddr, oparg); + break; + case FUTEX_OP_XOR: +- __futex_atomic_op("xor %1,%0,%1\n", ret, oldval, uaddr, oparg); ++ __futex_atomic_op("xor %1,%0,%4\n", ret, oldval, uaddr, oparg); + break; + default: + ret = -ENOSYS; +diff -urN linux-2.6.27.19-5.1/arch/powerpc/include/asm/processor.h linux-2.6.27.23-0.1.1/arch/powerpc/include/asm/processor.h +--- linux-2.6.27.19-5.1/arch/powerpc/include/asm/processor.h 2009-06-16 13:54:04.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/powerpc/include/asm/processor.h 2009-06-16 13:40:22.000000000 +0100 +@@ -309,6 +309,25 @@ + #define HAVE_ARCH_PICK_MMAP_LAYOUT + #endif + ++#ifdef CONFIG_PPC64 ++static inline unsigned long get_clean_sp(struct pt_regs *regs, int is_32) ++{ ++ unsigned long sp; ++ ++ if (is_32) ++ sp = regs->gpr[1] & 0x0ffffffffUL; ++ else ++ sp = regs->gpr[1]; ++ ++ return sp; ++} ++#else ++static inline unsigned long get_clean_sp(struct pt_regs *regs, int is_32) ++{ ++ return regs->gpr[1]; ++} ++#endif ++ + #endif /* __KERNEL__ */ + #endif /* __ASSEMBLY__ */ + #endif /* _ASM_POWERPC_PROCESSOR_H */ +diff -urN linux-2.6.27.19-5.1/arch/powerpc/include/asm/seccomp.h linux-2.6.27.23-0.1.1/arch/powerpc/include/asm/seccomp.h +--- linux-2.6.27.19-5.1/arch/powerpc/include/asm/seccomp.h 2009-06-16 13:54:10.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/powerpc/include/asm/seccomp.h 2009-06-16 13:40:23.000000000 +0100 +@@ -1,10 +1,6 @@ + #ifndef _ASM_POWERPC_SECCOMP_H + #define _ASM_POWERPC_SECCOMP_H + +-#ifdef __KERNEL__ +-#include +-#endif +- + #include + + #define __NR_seccomp_read __NR_read +diff -urN linux-2.6.27.19-5.1/arch/powerpc/kernel/ptrace32.c linux-2.6.27.23-0.1.1/arch/powerpc/kernel/ptrace32.c +--- linux-2.6.27.19-5.1/arch/powerpc/kernel/ptrace32.c 2009-06-16 13:54:04.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/powerpc/kernel/ptrace32.c 2009-06-16 13:40:17.000000000 +0100 +@@ -70,7 +70,8 @@ + /* Macros to workout the correct index for the FPR in the thread struct */ + #define FPRNUMBER(i) (((i) - PT_FPR0) >> 1) + #define FPRHALF(i) (((i) - PT_FPR0) & 1) +-#define FPRINDEX(i) TS_FPRWIDTH * FPRNUMBER(i) + FPRHALF(i) ++#define FPRINDEX(i) TS_FPRWIDTH * FPRNUMBER(i) * 2 + FPRHALF(i) ++#define FPRINDEX_3264(i) (TS_FPRWIDTH * ((i) - PT_FPR0)) + + static int compat_ptrace_getsiginfo(struct task_struct *child, compat_siginfo_t __user *data) + { +@@ -192,8 +193,9 @@ + CHECK_FULL_REGS(child->thread.regs); + if (numReg >= PT_FPR0) { + flush_fp_to_thread(child); +- tmp = ((unsigned long int *)child->thread.fpr) +- [FPRINDEX(numReg)]; ++ /* get 64 bit FPR */ ++ tmp = ((u64 *)child->thread.fpr) ++ [FPRINDEX_3264(numReg)]; + } else { /* register within PT_REGS struct */ + tmp = ptrace_get_reg(child, numReg); + } +@@ -286,8 +288,13 @@ + freg = (freg & 0xfffffffful) | (data << 32); + ret = ptrace_put_reg(child, numReg, freg); + } else { ++ u64 *tmp; + flush_fp_to_thread(child); +- ((unsigned int *)child->thread.regs)[index] = data; ++ /* get 64 bit FPR ... */ ++ tmp = &(((u64 *)child->thread.fpr) ++ [FPRINDEX_3264(numReg)]); ++ /* ... write the 32 bit part we want */ ++ ((u32 *)tmp)[index % 2] = data; + ret = 0; + } + break; +diff -urN linux-2.6.27.19-5.1/arch/powerpc/kernel/signal_32.c linux-2.6.27.23-0.1.1/arch/powerpc/kernel/signal_32.c +--- linux-2.6.27.19-5.1/arch/powerpc/kernel/signal_32.c 2009-06-16 13:54:04.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/powerpc/kernel/signal_32.c 2009-06-16 13:40:17.000000000 +0100 +@@ -836,7 +836,7 @@ + + /* Set up Signal Frame */ + /* Put a Real Time Context onto stack */ +- rt_sf = get_sigframe(ka, regs, sizeof(*rt_sf)); ++ rt_sf = get_sigframe(ka, regs, sizeof(*rt_sf), 1); + addr = rt_sf; + if (unlikely(rt_sf == NULL)) + goto badframe; +@@ -1178,7 +1178,7 @@ + unsigned long newsp = 0; + + /* Set up Signal Frame */ +- frame = get_sigframe(ka, regs, sizeof(*frame)); ++ frame = get_sigframe(ka, regs, sizeof(*frame), 1); + if (unlikely(frame == NULL)) + goto badframe; + sc = (struct sigcontext __user *) &frame->sctx; +diff -urN linux-2.6.27.19-5.1/arch/powerpc/kernel/signal_64.c linux-2.6.27.23-0.1.1/arch/powerpc/kernel/signal_64.c +--- linux-2.6.27.19-5.1/arch/powerpc/kernel/signal_64.c 2009-06-16 13:54:04.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/powerpc/kernel/signal_64.c 2009-06-16 13:40:17.000000000 +0100 +@@ -404,7 +404,7 @@ + unsigned long newsp = 0; + long err = 0; + +- frame = get_sigframe(ka, regs, sizeof(*frame)); ++ frame = get_sigframe(ka, regs, sizeof(*frame), 0); + if (unlikely(frame == NULL)) + goto badframe; + +diff -urN linux-2.6.27.19-5.1/arch/powerpc/kernel/signal.c linux-2.6.27.23-0.1.1/arch/powerpc/kernel/signal.c +--- linux-2.6.27.19-5.1/arch/powerpc/kernel/signal.c 2009-06-16 13:54:04.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/powerpc/kernel/signal.c 2009-06-16 13:40:17.000000000 +0100 +@@ -26,12 +26,12 @@ + * Allocate space for the signal frame + */ + void __user * get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, +- size_t frame_size) ++ size_t frame_size, int is_32) + { + unsigned long oldsp, newsp; + + /* Default to using normal stack */ +- oldsp = regs->gpr[1]; ++ oldsp = get_clean_sp(regs, is_32); + + /* Check for alt stack */ + if ((ka->sa.sa_flags & SA_ONSTACK) && +diff -urN linux-2.6.27.19-5.1/arch/powerpc/kernel/signal.h linux-2.6.27.23-0.1.1/arch/powerpc/kernel/signal.h +--- linux-2.6.27.19-5.1/arch/powerpc/kernel/signal.h 2009-06-16 13:54:04.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/powerpc/kernel/signal.h 2009-06-16 13:40:17.000000000 +0100 +@@ -13,7 +13,7 @@ + #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) + + extern void __user * get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, +- size_t frame_size); ++ size_t frame_size, int is_32); + extern void restore_sigmask(sigset_t *set); + + extern int handle_signal32(unsigned long sig, struct k_sigaction *ka, +diff -urN linux-2.6.27.19-5.1/arch/powerpc/platforms/pseries/xics.c linux-2.6.27.23-0.1.1/arch/powerpc/platforms/pseries/xics.c +--- linux-2.6.27.19-5.1/arch/powerpc/platforms/pseries/xics.c 2009-06-16 13:54:04.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/powerpc/platforms/pseries/xics.c 2009-06-16 13:40:17.000000000 +0100 +@@ -335,32 +335,61 @@ + lpar_xirr_info_set((0xff << 24) | irq); + } + +-static inline unsigned int xics_remap_irq(unsigned int vec) ++static inline unsigned int xics_xirr_vector(unsigned int xirr) + { +- unsigned int irq; ++ /* ++ * The top byte is the old cppr, to be restored on EOI. ++ * The remaining 24 bits are the vector. ++ */ ++ return xirr & 0x00ffffff; ++} + +- vec &= 0x00ffffff; ++static void xics_mask_unknown_vec(unsigned int vec) ++{ ++ printk(KERN_ERR "Interrupt %u (real) is invalid, disabling it.\n", vec); ++ xics_mask_real_irq(vec); ++} ++ ++static unsigned int xics_get_irq_direct(void) ++{ ++ unsigned int xirr = direct_xirr_info_get(); ++ unsigned int vec = xics_xirr_vector(xirr); ++ unsigned int irq; + + if (vec == XICS_IRQ_SPURIOUS) + return NO_IRQ; ++ + irq = irq_radix_revmap(xics_host, vec); + if (likely(irq != NO_IRQ)) + return irq; + +- printk(KERN_ERR "Interrupt %u (real) is invalid," +- " disabling it.\n", vec); +- xics_mask_real_irq(vec); +- return NO_IRQ; +-} ++ /* We don't have a linux mapping, so have rtas mask it. */ ++ xics_mask_unknown_vec(vec); + +-static unsigned int xics_get_irq_direct(void) +-{ +- return xics_remap_irq(direct_xirr_info_get()); ++ /* We might learn about it later, so EOI it */ ++ direct_xirr_info_set(xirr); ++ return NO_IRQ; + } + + static unsigned int xics_get_irq_lpar(void) + { +- return xics_remap_irq(lpar_xirr_info_get()); ++ unsigned int xirr = lpar_xirr_info_get(); ++ unsigned int vec = xics_xirr_vector(xirr); ++ unsigned int irq; ++ ++ if (vec == XICS_IRQ_SPURIOUS) ++ return NO_IRQ; ++ ++ irq = irq_radix_revmap(xics_host, vec); ++ if (likely(irq != NO_IRQ)) ++ return irq; ++ ++ /* We don't have a linux mapping, so have RTAS mask it. */ ++ xics_mask_unknown_vec(vec); ++ ++ /* We might learn about it later, so EOI it */ ++ lpar_xirr_info_set(xirr); ++ return NO_IRQ; + } + + #ifdef CONFIG_SMP +diff -urN linux-2.6.27.19-5.1/arch/powerpc/sysdev/fsl_soc.c linux-2.6.27.23-0.1.1/arch/powerpc/sysdev/fsl_soc.c +--- linux-2.6.27.19-5.1/arch/powerpc/sysdev/fsl_soc.c 2009-06-16 13:54:04.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/powerpc/sysdev/fsl_soc.c 2009-06-16 13:40:17.000000000 +0100 +@@ -255,7 +255,7 @@ + gfar_mdio_of_init_one(np); + + /* try the deprecated version */ +- for_each_compatible_node(np, "mdio", "gianfar"); ++ for_each_compatible_node(np, "mdio", "gianfar") + gfar_mdio_of_init_one(np); + + return 0; +diff -urN linux-2.6.27.19-5.1/arch/s390/appldata/appldata_base.c linux-2.6.27.23-0.1.1/arch/s390/appldata/appldata_base.c +--- linux-2.6.27.19-5.1/arch/s390/appldata/appldata_base.c 2009-06-16 13:53:47.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/s390/appldata/appldata_base.c 2009-06-16 13:40:08.000000000 +0100 +@@ -97,7 +97,7 @@ + /* + * Ops list + */ +-static DEFINE_SPINLOCK(appldata_ops_lock); ++static DEFINE_MUTEX(appldata_ops_mutex); + static LIST_HEAD(appldata_ops_list); + + +@@ -128,14 +128,14 @@ + + i = 0; + get_online_cpus(); +- spin_lock(&appldata_ops_lock); ++ mutex_lock(&appldata_ops_mutex); + list_for_each(lh, &appldata_ops_list) { + ops = list_entry(lh, struct appldata_ops, list); + if (ops->active == 1) { + ops->callback(ops->data); + } + } +- spin_unlock(&appldata_ops_lock); ++ mutex_unlock(&appldata_ops_mutex); + put_online_cpus(); + } + +@@ -337,7 +337,7 @@ + struct list_head *lh; + + found = 0; +- spin_lock(&appldata_ops_lock); ++ mutex_lock(&appldata_ops_mutex); + list_for_each(lh, &appldata_ops_list) { + tmp_ops = list_entry(lh, struct appldata_ops, list); + if (&tmp_ops->ctl_table[2] == ctl) { +@@ -345,15 +345,15 @@ + } + } + if (!found) { +- spin_unlock(&appldata_ops_lock); ++ mutex_unlock(&appldata_ops_mutex); + return -ENODEV; + } + ops = ctl->data; + if (!try_module_get(ops->owner)) { // protect this function +- spin_unlock(&appldata_ops_lock); ++ mutex_unlock(&appldata_ops_mutex); + return -ENODEV; + } +- spin_unlock(&appldata_ops_lock); ++ mutex_unlock(&appldata_ops_mutex); + + if (!*lenp || *ppos) { + *lenp = 0; +@@ -377,11 +377,11 @@ + return -EFAULT; + } + +- spin_lock(&appldata_ops_lock); ++ mutex_lock(&appldata_ops_mutex); + if ((buf[0] == '1') && (ops->active == 0)) { + // protect work queue callback + if (!try_module_get(ops->owner)) { +- spin_unlock(&appldata_ops_lock); ++ mutex_unlock(&appldata_ops_mutex); + module_put(ops->owner); + return -ENODEV; + } +@@ -406,7 +406,7 @@ + "failed with rc=%d\n", ops->name, rc); + module_put(ops->owner); + } +- spin_unlock(&appldata_ops_lock); ++ mutex_unlock(&appldata_ops_mutex); + out: + *lenp = len; + *ppos += len; +@@ -432,9 +432,9 @@ + if (!ops->ctl_table) + return -ENOMEM; + +- spin_lock(&appldata_ops_lock); ++ mutex_lock(&appldata_ops_mutex); + list_add(&ops->list, &appldata_ops_list); +- spin_unlock(&appldata_ops_lock); ++ mutex_unlock(&appldata_ops_mutex); + + ops->ctl_table[0].procname = appldata_proc_name; + ops->ctl_table[0].maxlen = 0; +@@ -451,9 +451,9 @@ + goto out; + return 0; + out: +- spin_lock(&appldata_ops_lock); ++ mutex_lock(&appldata_ops_mutex); + list_del(&ops->list); +- spin_unlock(&appldata_ops_lock); ++ mutex_unlock(&appldata_ops_mutex); + kfree(ops->ctl_table); + return -ENOMEM; + } +@@ -465,9 +465,9 @@ + */ + void appldata_unregister_ops(struct appldata_ops *ops) + { +- spin_lock(&appldata_ops_lock); ++ mutex_lock(&appldata_ops_mutex); + list_del(&ops->list); +- spin_unlock(&appldata_ops_lock); ++ mutex_unlock(&appldata_ops_mutex); + unregister_sysctl_table(ops->sysctl_header); + kfree(ops->ctl_table); + } +@@ -478,13 +478,22 @@ + + static void __cpuinit appldata_online_cpu(int cpu) + { ++ u64 per_cpu_interval; ++ + init_virt_timer(&per_cpu(appldata_timer, cpu)); + per_cpu(appldata_timer, cpu).function = appldata_timer_function; + per_cpu(appldata_timer, cpu).data = (unsigned long) + &appldata_work; + atomic_inc(&appldata_expire_count); + spin_lock(&appldata_timer_lock); +- __appldata_vtimer_setup(APPLDATA_MOD_TIMER); ++ if (appldata_timer_active) { ++ per_cpu_interval = (u64) (appldata_interval * 1000 / ++ num_online_cpus()) * TOD_MICRO; ++ per_cpu(appldata_timer, cpu).expires = per_cpu_interval; ++ smp_call_function_single(cpu, add_virt_timer_periodic, ++ &per_cpu(appldata_timer, cpu), 1); ++ __appldata_vtimer_setup(APPLDATA_MOD_TIMER); ++ } + spin_unlock(&appldata_timer_lock); + } + +diff -urN linux-2.6.27.19-5.1/arch/s390/appldata/appldata_mem.c linux-2.6.27.23-0.1.1/arch/s390/appldata/appldata_mem.c +--- linux-2.6.27.19-5.1/arch/s390/appldata/appldata_mem.c 2009-06-16 13:53:47.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/s390/appldata/appldata_mem.c 2009-06-16 13:40:08.000000000 +0100 +@@ -78,7 +78,7 @@ + { + /* + * don't put large structures on the stack, we are +- * serialized through the appldata_ops_lock and can use static ++ * serialized through the appldata_ops_mutex and can use static + */ + static struct sysinfo val; + unsigned long ev[NR_VM_EVENT_ITEMS]; +diff -urN linux-2.6.27.19-5.1/arch/s390/include/asm/cio.h linux-2.6.27.23-0.1.1/arch/s390/include/asm/cio.h +--- linux-2.6.27.19-5.1/arch/s390/include/asm/cio.h 2009-06-16 13:53:47.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/s390/include/asm/cio.h 2009-06-16 13:40:08.000000000 +0100 +@@ -456,6 +456,8 @@ + #define CIO_OPER 0x0004 + /* Sick revalidation of device. */ + #define CIO_REVALIDATE 0x0008 ++/* Device did not respond in time. */ ++#define CIO_BOXED 0x0010 + + /** + * struct ccw_dev_id - unique identifier for ccw devices +diff -urN linux-2.6.27.19-5.1/arch/s390/include/asm/mman.h linux-2.6.27.23-0.1.1/arch/s390/include/asm/mman.h +--- linux-2.6.27.19-5.1/arch/s390/include/asm/mman.h 2009-06-16 13:53:47.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/s390/include/asm/mman.h 2009-06-16 13:40:08.000000000 +0100 +@@ -22,4 +22,9 @@ + #define MCL_CURRENT 1 /* lock all current mappings */ + #define MCL_FUTURE 2 /* lock all future mappings */ + ++#if defined(__KERNEL__) && !defined(__ASSEMBLY__) && defined(CONFIG_64BIT) ++int s390_mmap_check(unsigned long addr, unsigned long len); ++#define arch_mmap_check(addr,len,flags) s390_mmap_check(addr,len) ++#endif ++ + #endif /* __S390_MMAN_H__ */ +diff -urN linux-2.6.27.19-5.1/arch/s390/include/asm/processor.h linux-2.6.27.23-0.1.1/arch/s390/include/asm/processor.h +--- linux-2.6.27.19-5.1/arch/s390/include/asm/processor.h 2009-06-16 13:53:47.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/s390/include/asm/processor.h 2009-06-16 13:40:08.000000000 +0100 +@@ -60,7 +60,7 @@ + extern int get_cpu_capability(unsigned int *); + + /* +- * User space process size: 2GB for 31 bit, 4TB for 64 bit. ++ * User space process size: 2GB for 31 bit, 4TB or 8PT for 64 bit. + */ + #ifndef __s390x__ + +@@ -69,8 +69,7 @@ + + #else /* __s390x__ */ + +-#define TASK_SIZE_OF(tsk) (test_tsk_thread_flag(tsk,TIF_31BIT) ? \ +- (1UL << 31) : (1UL << 53)) ++#define TASK_SIZE_OF(tsk) ((tsk)->mm->context.asce_limit) + #define TASK_UNMAPPED_BASE (test_thread_flag(TIF_31BIT) ? \ + (1UL << 30) : (1UL << 41)) + #define TASK_SIZE TASK_SIZE_OF(current) +diff -urN linux-2.6.27.19-5.1/arch/s390/kernel/time.c linux-2.6.27.23-0.1.1/arch/s390/kernel/time.c +--- linux-2.6.27.19-5.1/arch/s390/kernel/time.c 2009-06-16 13:53:47.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/s390/kernel/time.c 2009-06-16 13:40:08.000000000 +0100 +@@ -383,20 +383,6 @@ + static int etr_port1_online; + static int etr_steai_available; + +-static int __init early_parse_etr(char *p) +-{ +- if (strncmp(p, "off", 3) == 0) +- etr_port0_online = etr_port1_online = 0; +- else if (strncmp(p, "port0", 5) == 0) +- etr_port0_online = 1; +- else if (strncmp(p, "port1", 5) == 0) +- etr_port1_online = 1; +- else if (strncmp(p, "on", 2) == 0) +- etr_port0_online = etr_port1_online = 1; +- return 0; +-} +-early_param("etr", early_parse_etr); +- + enum etr_event { + ETR_EVENT_PORT0_CHANGE, + ETR_EVENT_PORT1_CHANGE, +@@ -1178,7 +1164,7 @@ + return count; + } + +-static SYSDEV_ATTR(online, 0600, etr_online_show, etr_online_store); ++static SYSDEV_ATTR(online, 0400, etr_online_show, etr_online_store); + + static ssize_t etr_stepping_control_show(struct sys_device *dev, + struct sysdev_attribute *attr, +@@ -1377,16 +1363,6 @@ + static DEFINE_MUTEX(stp_work_mutex); + static DECLARE_WORK(stp_work, stp_work_fn); + +-static int __init early_parse_stp(char *p) +-{ +- if (strncmp(p, "off", 3) == 0) +- stp_online = 0; +- else if (strncmp(p, "on", 2) == 0) +- stp_online = 1; +- return 0; +-} +-early_param("stp", early_parse_stp); +- + /* + * Reset STP attachment. + */ +@@ -1665,7 +1641,7 @@ + * stp/online but attr_online already exists in this file .. + */ + static struct sysdev_class_attribute attr_stp_online = { +- .attr = { .name = "online", .mode = 0600 }, ++ .attr = { .name = "online", .mode = 0400 }, + .show = stp_online_show, + .store = stp_online_store, + }; +diff -urN linux-2.6.27.19-5.1/arch/s390/lib/div64.c linux-2.6.27.23-0.1.1/arch/s390/lib/div64.c +--- linux-2.6.27.19-5.1/arch/s390/lib/div64.c 2009-06-16 13:53:47.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/s390/lib/div64.c 2009-06-16 13:40:08.000000000 +0100 +@@ -61,7 +61,7 @@ + " clr %0,%3\n" + " jl 0f\n" + " slr %0,%3\n" +- " alr %1,%2\n" ++ " ahi %1,1\n" + "0:\n" + : "+d" (reg2), "+d" (reg3), "=d" (tmp) + : "d" (base), "2" (1UL) : "cc" ); +diff -urN linux-2.6.27.19-5.1/arch/s390/lib/uaccess_pt.c linux-2.6.27.23-0.1.1/arch/s390/lib/uaccess_pt.c +--- linux-2.6.27.19-5.1/arch/s390/lib/uaccess_pt.c 2009-06-16 13:53:47.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/s390/lib/uaccess_pt.c 2009-06-16 13:40:08.000000000 +0100 +@@ -43,9 +43,8 @@ + int ret = -EFAULT; + int fault; + +- if (in_atomic() || segment_eq(get_fs(), KERNEL_DS)) ++ if (in_atomic()) + return ret; +- + down_read(&mm->mmap_sem); + vma = find_vma(mm, address); + if (unlikely(!vma)) +@@ -110,8 +109,6 @@ + pte_t *pte; + void *from, *to; + +- if (segment_eq(get_fs(), KERNEL_DS)) +- mm = &init_mm; + done = 0; + retry: + spin_lock(&mm->page_table_lock); +@@ -122,8 +119,6 @@ + goto fault; + + pfn = pte_pfn(*pte); +- if (!pfn_valid(pfn)) +- goto out; + + offset = uaddr & (PAGE_SIZE - 1); + size = min(n - done, PAGE_SIZE - offset); +@@ -138,7 +133,6 @@ + done += size; + uaddr += size; + } while (done < n); +-out: + spin_unlock(&mm->page_table_lock); + return n - done; + fault: +@@ -166,9 +160,6 @@ + goto fault; + + pfn = pte_pfn(*pte); +- if (!pfn_valid(pfn)) +- goto out; +- + ret = (pfn << PAGE_SHIFT) + (uaddr & (PAGE_SIZE - 1)); + out: + return ret; +@@ -185,6 +176,10 @@ + { + size_t rc; + ++ if (segment_eq(get_fs(), KERNEL_DS)) { ++ memcpy(to, (void __kernel __force *) from, n); ++ return 0; ++ } + rc = __user_copy_pt((unsigned long) from, to, n, 0); + if (unlikely(rc)) + memset(to + n - rc, 0, rc); +@@ -193,6 +188,10 @@ + + size_t copy_to_user_pt(size_t n, void __user *to, const void *from) + { ++ if (segment_eq(get_fs(), KERNEL_DS)) { ++ memcpy((void __kernel __force *) to, from, n); ++ return 0; ++ } + return __user_copy_pt((unsigned long) to, (void *) from, n, 1); + } + +@@ -200,6 +199,10 @@ + { + long done, size, ret; + ++ if (segment_eq(get_fs(), KERNEL_DS)) { ++ memset((void __kernel __force *) to, 0, n); ++ return 0; ++ } + done = 0; + do { + if (n - done > PAGE_SIZE) +@@ -225,7 +228,7 @@ + size_t len_str; + + if (segment_eq(get_fs(), KERNEL_DS)) +- mm = &init_mm; ++ return strnlen((const char __kernel __force *) src, count) + 1; + done = 0; + retry: + spin_lock(&mm->page_table_lock); +@@ -235,11 +238,6 @@ + goto fault; + + pfn = pte_pfn(*pte); +- if (!pfn_valid(pfn)) { +- done = -1; +- goto out; +- } +- + offset = uaddr & (PAGE_SIZE-1); + addr = (char *)(pfn << PAGE_SHIFT) + offset; + len = min(count - done, PAGE_SIZE - offset); +@@ -247,7 +245,6 @@ + done += len_str; + uaddr += len_str; + } while ((len_str == len) && (done < count)); +-out: + spin_unlock(&mm->page_table_lock); + return done + 1; + fault: +@@ -267,6 +264,13 @@ + return -EFAULT; + if (n > count) + n = count; ++ if (segment_eq(get_fs(), KERNEL_DS)) { ++ memcpy(dst, (const char __kernel __force *) src, n); ++ if (dst[n-1] == '\0') ++ return n-1; ++ else ++ return n; ++ } + if (__user_copy_pt((unsigned long) src, dst, n, 0)) + return -EFAULT; + if (dst[n-1] == '\0') +@@ -286,8 +290,10 @@ + pte_t *pte_from, *pte_to; + int write_user; + +- if (segment_eq(get_fs(), KERNEL_DS)) +- mm = &init_mm; ++ if (segment_eq(get_fs(), KERNEL_DS)) { ++ memcpy((void __force *) to, (void __force *) from, n); ++ return 0; ++ } + done = 0; + retry: + spin_lock(&mm->page_table_lock); +@@ -307,12 +313,7 @@ + } + + pfn_from = pte_pfn(*pte_from); +- if (!pfn_valid(pfn_from)) +- goto out; + pfn_to = pte_pfn(*pte_to); +- if (!pfn_valid(pfn_to)) +- goto out; +- + offset_from = uaddr_from & (PAGE_SIZE-1); + offset_to = uaddr_from & (PAGE_SIZE-1); + offset_max = max(offset_from, offset_to); +@@ -324,7 +325,6 @@ + uaddr_from += size; + uaddr_to += size; + } while (done < n); +-out: + spin_unlock(&mm->page_table_lock); + return n - done; + fault: +diff -urN linux-2.6.27.19-5.1/arch/s390/mm/mmap.c linux-2.6.27.23-0.1.1/arch/s390/mm/mmap.c +--- linux-2.6.27.19-5.1/arch/s390/mm/mmap.c 2009-06-16 13:53:47.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/s390/mm/mmap.c 2009-06-16 13:40:08.000000000 +0100 +@@ -35,7 +35,7 @@ + * Leave an at least ~128 MB hole. + */ + #define MIN_GAP (128*1024*1024) +-#define MAX_GAP (TASK_SIZE/6*5) ++#define MAX_GAP (STACK_TOP/6*5) + + static inline unsigned long mmap_base(void) + { +@@ -46,7 +46,7 @@ + else if (gap > MAX_GAP) + gap = MAX_GAP; + +- return TASK_SIZE - (gap & PAGE_MASK); ++ return STACK_TOP - (gap & PAGE_MASK); + } + + static inline int mmap_is_legacy(void) +@@ -89,42 +89,58 @@ + + #else + ++int s390_mmap_check(unsigned long addr, unsigned long len) ++{ ++ if (!test_thread_flag(TIF_31BIT) && ++ len >= TASK_SIZE && TASK_SIZE < (1UL << 53)) ++ return crst_table_upgrade(current->mm, 1UL << 53); ++ return 0; ++} ++ + static unsigned long + s390_get_unmapped_area(struct file *filp, unsigned long addr, + unsigned long len, unsigned long pgoff, unsigned long flags) + { + struct mm_struct *mm = current->mm; ++ unsigned long area; + int rc; + +- addr = arch_get_unmapped_area(filp, addr, len, pgoff, flags); +- if (addr & ~PAGE_MASK) +- return addr; +- if (unlikely(mm->context.asce_limit < addr + len)) { +- rc = crst_table_upgrade(mm, addr + len); ++ area = arch_get_unmapped_area(filp, addr, len, pgoff, flags); ++ if (!(area & ~PAGE_MASK)) ++ return area; ++ if (area == -ENOMEM && ++ !test_thread_flag(TIF_31BIT) && TASK_SIZE < (1UL << 53)) { ++ /* Upgrade the page table to 4 levels and retry. */ ++ rc = crst_table_upgrade(mm, 1UL << 53); + if (rc) + return (unsigned long) rc; ++ area = arch_get_unmapped_area(filp, addr, len, pgoff, flags); + } +- return addr; ++ return area; + } + + static unsigned long +-s390_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, ++s390_get_unmapped_area_topdown(struct file *filp, const unsigned long addr, + const unsigned long len, const unsigned long pgoff, + const unsigned long flags) + { + struct mm_struct *mm = current->mm; +- unsigned long addr = addr0; ++ unsigned long area; + int rc; + +- addr = arch_get_unmapped_area_topdown(filp, addr, len, pgoff, flags); +- if (addr & ~PAGE_MASK) +- return addr; +- if (unlikely(mm->context.asce_limit < addr + len)) { +- rc = crst_table_upgrade(mm, addr + len); ++ area = arch_get_unmapped_area_topdown(filp, addr, len, pgoff, flags); ++ if (!(area & ~PAGE_MASK)) ++ return area; ++ if (area == -ENOMEM && ++ !test_thread_flag(TIF_31BIT) && TASK_SIZE < (1UL << 53)) { ++ /* Upgrade the page table to 4 levels and retry. */ ++ rc = crst_table_upgrade(mm, 1UL << 53); + if (rc) + return (unsigned long) rc; ++ area = arch_get_unmapped_area_topdown(filp, addr, len, ++ pgoff, flags); + } +- return addr; ++ return area; + } + /* + * This function, called very early during the creation of a new +diff -urN linux-2.6.27.19-5.1/arch/s390/mm/pgtable.c linux-2.6.27.23-0.1.1/arch/s390/mm/pgtable.c +--- linux-2.6.27.19-5.1/arch/s390/mm/pgtable.c 2009-06-16 13:53:47.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/s390/mm/pgtable.c 2009-06-16 13:40:08.000000000 +0100 +@@ -117,6 +117,7 @@ + crst_table_init(table, entry); + pgd_populate(mm, (pgd_t *) table, (pud_t *) pgd); + mm->pgd = (pgd_t *) table; ++ mm->task_size = mm->context.asce_limit; + table = NULL; + } + spin_unlock(&mm->page_table_lock); +@@ -154,6 +155,7 @@ + BUG(); + } + mm->pgd = (pgd_t *) (pgd_val(*pgd) & _REGION_ENTRY_ORIGIN); ++ mm->task_size = mm->context.asce_limit; + crst_table_free(mm, (unsigned long *) pgd); + } + update_mm(mm, current); +diff -urN linux-2.6.27.19-5.1/arch/sparc/include/asm/compat.h linux-2.6.27.23-0.1.1/arch/sparc/include/asm/compat.h +--- linux-2.6.27.19-5.1/arch/sparc/include/asm/compat.h 2009-06-16 13:53:52.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/sparc/include/asm/compat.h 2009-06-16 13:40:13.000000000 +0100 +@@ -240,4 +240,9 @@ + unsigned int __unused2; + }; + ++static inline int is_compat_task(void) ++{ ++ return test_thread_flag(TIF_32BIT); ++} ++ + #endif /* _ASM_SPARC64_COMPAT_H */ +diff -urN linux-2.6.27.19-5.1/arch/sparc/include/asm/ptrace_32.h linux-2.6.27.23-0.1.1/arch/sparc/include/asm/ptrace_32.h +--- linux-2.6.27.19-5.1/arch/sparc/include/asm/ptrace_32.h 2009-06-16 13:53:52.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/sparc/include/asm/ptrace_32.h 2009-06-16 13:40:13.000000000 +0100 +@@ -62,6 +62,8 @@ + + #ifdef __KERNEL__ + ++#include ++ + static inline bool pt_regs_is_syscall(struct pt_regs *regs) + { + return (regs->psr & PSR_SYSCALL); +@@ -72,6 +74,14 @@ + return (regs->psr &= ~PSR_SYSCALL); + } + ++#define arch_ptrace_stop_needed(exit_code, info) \ ++({ flush_user_windows(); \ ++ current_thread_info()->w_saved != 0; \ ++}) ++ ++#define arch_ptrace_stop(exit_code, info) \ ++ synchronize_user_stack() ++ + #define user_mode(regs) (!((regs)->psr & PSR_PS)) + #define instruction_pointer(regs) ((regs)->pc) + #define user_stack_pointer(regs) ((regs)->u_regs[UREG_FP]) +diff -urN linux-2.6.27.19-5.1/arch/sparc/include/asm/ptrace_64.h linux-2.6.27.23-0.1.1/arch/sparc/include/asm/ptrace_64.h +--- linux-2.6.27.19-5.1/arch/sparc/include/asm/ptrace_64.h 2009-06-16 13:53:52.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/sparc/include/asm/ptrace_64.h 2009-06-16 13:40:13.000000000 +0100 +@@ -113,6 +113,8 @@ + + #ifdef __KERNEL__ + ++#include ++ + static inline int pt_regs_trap_type(struct pt_regs *regs) + { + return regs->magic & 0x1ff; +@@ -128,6 +130,14 @@ + return (regs->tstate &= ~TSTATE_SYSCALL); + } + ++#define arch_ptrace_stop_needed(exit_code, info) \ ++({ flush_user_windows(); \ ++ get_thread_wsaved() != 0; \ ++}) ++ ++#define arch_ptrace_stop(exit_code, info) \ ++ synchronize_user_stack() ++ + struct global_reg_snapshot { + unsigned long tstate; + unsigned long tpc; +diff -urN linux-2.6.27.19-5.1/arch/sparc/include/asm/seccomp.h linux-2.6.27.23-0.1.1/arch/sparc/include/asm/seccomp.h +--- linux-2.6.27.19-5.1/arch/sparc/include/asm/seccomp.h 2009-06-16 13:53:52.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/sparc/include/asm/seccomp.h 2009-06-16 13:40:13.000000000 +0100 +@@ -1,11 +1,5 @@ + #ifndef _ASM_SECCOMP_H + +-#include /* already defines TIF_32BIT */ +- +-#ifndef TIF_32BIT +-#error "unexpected TIF_32BIT on sparc64" +-#endif +- + #include + + #define __NR_seccomp_read __NR_read +diff -urN linux-2.6.27.19-5.1/arch/sparc64/kernel/traps.c linux-2.6.27.23-0.1.1/arch/sparc64/kernel/traps.c +--- linux-2.6.27.19-5.1/arch/sparc64/kernel/traps.c 2009-06-16 13:53:58.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/sparc64/kernel/traps.c 2009-06-16 13:40:13.000000000 +0100 +@@ -1,6 +1,6 @@ + /* arch/sparc64/kernel/traps.c + * +- * Copyright (C) 1995,1997,2008 David S. Miller (davem@davemloft.net) ++ * Copyright (C) 1995,1997,2008,2009 David S. Miller (davem@davemloft.net) + * Copyright (C) 1997,1999,2000 Jakub Jelinek (jakub@redhat.com) + */ + +@@ -262,6 +262,21 @@ + return; + + if (regs->tstate & TSTATE_PRIV) { ++ /* Test if this comes from uaccess places. */ ++ const struct exception_table_entry *entry; ++ ++ entry = search_exception_tables(regs->tpc); ++ if (entry) { ++ /* Ouch, somebody is trying VM hole tricks on us... */ ++#ifdef DEBUG_EXCEPTIONS ++ printk("Exception: PC<%016lx> faddr\n", regs->tpc); ++ printk("EX_TABLE: insn<%016lx> fixup<%016lx>\n", ++ regs->tpc, entry->fixup); ++#endif ++ regs->tpc = entry->fixup; ++ regs->tnpc = regs->tpc + 4; ++ return; ++ } + printk("sun4v_data_access_exception: ADDR[%016lx] " + "CTX[%04x] TYPE[%04x], going.\n", + addr, ctx, type); +diff -urN linux-2.6.27.19-5.1/arch/x86/boot/memory.c linux-2.6.27.23-0.1.1/arch/x86/boot/memory.c +--- linux-2.6.27.19-5.1/arch/x86/boot/memory.c 2009-06-16 13:53:34.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/x86/boot/memory.c 2009-06-16 13:39:58.000000000 +0100 +@@ -27,13 +27,14 @@ + do { + size = sizeof(struct e820entry); + +- /* Important: %edx is clobbered by some BIOSes, +- so it must be either used for the error output ++ /* Important: %edx and %esi are clobbered by some BIOSes, ++ so they must be either used for the error output + or explicitly marked clobbered. */ + asm("int $0x15; setc %0" + : "=d" (err), "+b" (next), "=a" (id), "+c" (size), + "=m" (*desc) +- : "D" (desc), "d" (SMAP), "a" (0xe820)); ++ : "D" (desc), "d" (SMAP), "a" (0xe820) ++ : "esi"); + + /* BIOSes which terminate the chain with CF = 1 as opposed + to %ebx = 0 don't always report the SMAP signature on +diff -urN linux-2.6.27.19-5.1/arch/x86/ia32/ia32entry.S linux-2.6.27.23-0.1.1/arch/x86/ia32/ia32entry.S +--- linux-2.6.27.19-5.1/arch/x86/ia32/ia32entry.S 2009-06-16 13:53:34.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/x86/ia32/ia32entry.S 2009-06-16 13:39:58.000000000 +0100 +@@ -424,9 +424,9 @@ + orl $TS_COMPAT,TI_status(%r10) + testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%r10) + jnz ia32_tracesys +-ia32_do_syscall: + cmpl $(IA32_NR_syscalls-1),%eax +- ja int_ret_from_sys_call /* ia32_tracesys has set RAX(%rsp) */ ++ ja ia32_badsys ++ia32_do_call: + IA32_ARG_FIXUP + call *ia32_sys_call_table(,%rax,8) # xxx: rip relative + ia32_sysret: +@@ -441,7 +441,9 @@ + call syscall_trace_enter + LOAD_ARGS32 ARGOFFSET /* reload args from stack in case ptrace changed it */ + RESTORE_REST +- jmp ia32_do_syscall ++ cmpl $(IA32_NR_syscalls-1),%eax ++ ja int_ret_from_sys_call /* ia32_tracesys has set RAX(%rsp) */ ++ jmp ia32_do_call + END(ia32_syscall) + + ia32_badsys: +diff -urN linux-2.6.27.19-5.1/arch/x86/ia32/ia32entry-xen.S linux-2.6.27.23-0.1.1/arch/x86/ia32/ia32entry-xen.S +--- linux-2.6.27.19-5.1/arch/x86/ia32/ia32entry-xen.S 2009-06-16 13:53:34.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/x86/ia32/ia32entry-xen.S 2009-06-16 13:39:58.000000000 +0100 +@@ -373,9 +373,9 @@ + orl $TS_COMPAT,TI_status(%r10) + testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%r10) + jnz ia32_tracesys +-ia32_do_syscall: + cmpl $(IA32_NR_syscalls-1),%eax +- ja int_ret_from_sys_call /* ia32_tracesys has set RAX(%rsp) */ ++ ja ia32_badsys ++ia32_do_call: + IA32_ARG_FIXUP + call *ia32_sys_call_table(,%rax,8) # xxx: rip relative + ia32_sysret: +@@ -390,7 +390,9 @@ + call syscall_trace_enter + LOAD_ARGS32 ARGOFFSET /* reload args from stack in case ptrace changed it */ + RESTORE_REST +- jmp ia32_do_syscall ++ cmpl $(IA32_NR_syscalls-1),%eax ++ ja int_ret_from_sys_call /* ia32_tracesys has set RAX(%rsp) */ ++ jmp ia32_do_call + END(ia32_syscall) + + ia32_badsys: +diff -urN linux-2.6.27.19-5.1/arch/x86/kdb/kdba_bt.c linux-2.6.27.23-0.1.1/arch/x86/kdb/kdba_bt.c +--- linux-2.6.27.19-5.1/arch/x86/kdb/kdba_bt.c 2009-06-16 13:53:34.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/x86/kdb/kdba_bt.c 2009-06-16 13:39:58.000000000 +0100 +@@ -416,34 +416,29 @@ + NS_MEM("ia32_ptregs_common", partial_pt_regs_plus_1, 0), + NS_MEM("ia32_sysret", partial_pt_regs, 0), + NS_MEM("int_careful", partial_pt_regs, 0), ++ NS_MEM("ia32_badarg", partial_pt_regs, 0), + NS_MEM("int_restore_rest", full_pt_regs, 0), + NS_MEM("int_signal", full_pt_regs, 0), + NS_MEM("int_very_careful", partial_pt_regs, 0), +- NS_MEM("int_with_check", partial_pt_regs, 0), + #ifdef CONFIG_TRACE_IRQFLAGS + NS_MEM("paranoid_exit0", full_pt_regs, 0), + #endif /* CONFIG_TRACE_IRQFLAGS */ + NS_MEM("paranoid_exit1", full_pt_regs, 0), + NS_MEM("ptregscall_common", partial_pt_regs_plus_1, 0), +- NS_MEM("restore_norax", partial_pt_regs, 0), +- NS_MEM("restore", partial_pt_regs, 0), + NS_MEM("ret_from_intr", partial_pt_regs_plus_2, 0), + NS_MEM("stub32_clone", partial_pt_regs_plus_1, 0), + NS_MEM("stub32_execve", partial_pt_regs_plus_1, 0), + NS_MEM("stub32_fork", partial_pt_regs_plus_1, 0), + NS_MEM("stub32_iopl", partial_pt_regs_plus_1, 0), + NS_MEM("stub32_rt_sigreturn", partial_pt_regs_plus_1, 0), +- NS_MEM("stub32_rt_sigsuspend", partial_pt_regs_plus_1, 0), + NS_MEM("stub32_sigaltstack", partial_pt_regs_plus_1, 0), + NS_MEM("stub32_sigreturn", partial_pt_regs_plus_1, 0), +- NS_MEM("stub32_sigsuspend", partial_pt_regs_plus_1, 0), + NS_MEM("stub32_vfork", partial_pt_regs_plus_1, 0), + NS_MEM("stub_clone", partial_pt_regs_plus_1, 0), + NS_MEM("stub_execve", partial_pt_regs_plus_1, 0), + NS_MEM("stub_fork", partial_pt_regs_plus_1, 0), + NS_MEM("stub_iopl", partial_pt_regs_plus_1, 0), + NS_MEM("stub_rt_sigreturn", partial_pt_regs_plus_1, 0), +- NS_MEM("stub_rt_sigsuspend", partial_pt_regs_plus_1, 0), + NS_MEM("stub_sigaltstack", partial_pt_regs_plus_1, 0), + NS_MEM("stub_vfork", partial_pt_regs_plus_1, 0), + +@@ -464,6 +459,17 @@ + BB_SKIP(RAX) | BB_SKIP(RCX)), + NS_MEM("ia32_badsys", partial_pt_regs, 0), + ++#ifdef CONFIG_AUDITSYSCALL ++ NS_MEM_FROM("int_with_check", "sysexit_audit", partial_pt_regs, ++ BB_SKIP(R8) | BB_SKIP(R9) | BB_SKIP(R10) | BB_SKIP(R11) | ++ BB_SKIP(RAX)), ++ NS_MEM_FROM("int_with_check", "ia32_cstar_target", partial_pt_regs, ++ BB_SKIP(R8) | BB_SKIP(R9) | BB_SKIP(R10) | BB_SKIP(R11) | ++ BB_SKIP(RAX) | BB_SKIP(RCX)), ++#endif ++ NS_MEM("int_with_check", no_memory, 0), ++ ++ + /* Various bits of code branch to int_ret_from_sys_call, with slightly + * different missing values in pt_regs. + */ +@@ -540,11 +546,11 @@ + + NS_REG("bad_put_user", + all_regs, +- BB_SKIP(RAX) | BB_SKIP(RCX) | BB_SKIP(R8)), ++ BB_SKIP(RBX)), + + NS_REG("bad_get_user", + all_regs, +- BB_SKIP(RAX) | BB_SKIP(RCX) | BB_SKIP(R8)), ++ BB_SKIP(RAX) | BB_SKIP(RDX)), + + NS_REG("bad_to_user", + all_regs, +@@ -585,11 +591,17 @@ + "rff_action", + "rff_trace", + /* system_call */ ++ "system_call_after_swapgs", ++ "system_call_fastpath", + "ret_from_sys_call", + "sysret_check", + "sysret_careful", + "sysret_signal", + "badsys", ++#ifdef CONFIG_AUDITSYSCALL ++ "auditsys", ++ "sysret_audit", ++#endif + "tracesys", + "int_ret_from_sys_call", + "int_with_check", +@@ -635,11 +647,22 @@ + "bad_gs", + /* ia32_sysenter_target */ + "sysenter_do_call", ++ "sysenter_dispatch", ++ "sysexit_from_sys_call", ++#ifdef CONFIG_AUDITSYSCALL ++ "sysenter_auditsys", ++ "sysexit_audit", ++#endif + "sysenter_tracesys", + /* ia32_cstar_target */ + "cstar_do_call", ++ "cstar_dispatch", ++ "sysretl_from_sys_call", ++#ifdef CONFIG_AUDITSYSCALL ++ "cstar_auditsys", ++ "sysretl_audit", ++#endif + "cstar_tracesys", +- "ia32_badarg", + /* ia32_syscall */ + "ia32_do_syscall", + "ia32_sysret", +@@ -660,7 +683,7 @@ + /* relocate_kernel */ + "relocate_new_kernel", + #endif /* CONFIG_KEXEC */ +-#ifdef CONFIG_XEN ++#ifdef CONFIG_PARAVIRT_XEN + /* arch/i386/xen/xen-asm.S */ + "xen_irq_enable_direct_end", + "xen_irq_disable_direct_end", +@@ -1805,6 +1828,7 @@ + BBOU_RSRDWSWD, /* 15 */ + /* opcode specific entries */ + BBOU_ADD, ++ BBOU_AND, + BBOU_CALL, + BBOU_CBW, + BBOU_CMOV, +@@ -1896,7 +1920,7 @@ + bb_opcode_usage_all[] = { + {3, BBOU_RSRDWD, "adc"}, + {3, BBOU_ADD, "add"}, +- {3, BBOU_RSRDWD, "and"}, ++ {3, BBOU_AND, "and"}, + {3, BBOU_RSWD, "bsf"}, + {3, BBOU_RSWD, "bsr"}, + {5, BBOU_RSWS, "bswap"}, +@@ -2952,6 +2976,12 @@ + (strcmp(bb_func_name, "ptregscall_common") == 0 || + strcmp(bb_func_name, "ia32_ptregs_common") == 0)))) + continue; ++ /* The put_user and save_paranoid functions are special. ++ * %rbx gets clobbered */ ++ if (expect == BBRG_RBX && ++ (strncmp(bb_func_name, "__put_user_", 11) == 0 || ++ strcmp(bb_func_name, "save_paranoid") == 0)) ++ continue; + kdb_printf("%s: Expected %s, got %s", + __FUNCTION__, + bbrg_name[expect], bbrg_name[actual]); +@@ -3449,6 +3479,17 @@ + usage = BBOU_RSRDWD; + } + break; ++ case BBOU_AND: ++ /* Special case when trying to round the stack pointer ++ * to achieve byte alignment ++ */ ++ if (dst->reg && dst->base_rc == BBRG_RSP && ++ src->immediate && strncmp(bb_func_name, "efi_call", 8) == 0) { ++ usage = BBOU_NOP; ++ } else { ++ usage = BBOU_RSRDWD; ++ } ++ break; + case BBOU_CALL: + /* Invalidate the scratch registers. Functions sync_regs and + * save_v86_state are special, their return value is the new +@@ -4716,7 +4757,7 @@ + #ifdef CONFIG_MATH_EMULATION + " CONFIG_MATH_EMULATION" + #endif +-#ifdef CONFIG_XEN ++#ifdef CONFIG_PARAVIRT_XEN + " CONFIG_XEN" + #endif + #ifdef CONFIG_DEBUG_INFO +diff -urN linux-2.6.27.19-5.1/arch/x86/kdb/kdba_support.c linux-2.6.27.23-0.1.1/arch/x86/kdb/kdba_support.c +--- linux-2.6.27.19-5.1/arch/x86/kdb/kdba_support.c 2009-06-16 13:53:34.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/x86/kdb/kdba_support.c 2009-06-16 13:39:58.000000000 +0100 +@@ -49,7 +49,7 @@ + + void kdba_kdump_shutdown_slave(struct pt_regs *regs) + { +-#ifndef CONFIG_XEN ++#ifndef CONFIG_PARAVIRT_XEN + halt_current_cpu(regs); + #endif /* CONFIG_XEN */ + } +diff -urN linux-2.6.27.19-5.1/arch/x86/kernel/apic_64.c linux-2.6.27.23-0.1.1/arch/x86/kernel/apic_64.c +--- linux-2.6.27.19-5.1/arch/x86/kernel/apic_64.c 2009-06-16 13:53:34.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/x86/kernel/apic_64.c 2009-06-16 13:39:58.000000000 +0100 +@@ -929,6 +929,18 @@ + } + } + ++int x2apic_enabled(void) ++{ ++ int msr, msr2; ++ if (!cpu_has_x2apic) ++ return 0; ++ ++ rdmsr(MSR_IA32_APICBASE, msr, msr2); ++ if (msr & X2APIC_ENABLE) ++ return 1; ++ return 0; ++} ++ + void __init enable_IR_x2apic(void) + { + #ifdef CONFIG_INTR_REMAP +diff -urN linux-2.6.27.19-5.1/arch/x86/kernel/cpu/common_64-xen.c linux-2.6.27.23-0.1.1/arch/x86/kernel/cpu/common_64-xen.c +--- linux-2.6.27.19-5.1/arch/x86/kernel/cpu/common_64-xen.c 2009-06-16 13:53:34.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/x86/kernel/cpu/common_64-xen.c 2009-06-16 13:39:58.000000000 +0100 +@@ -609,7 +609,7 @@ + #ifdef CONFIG_IA32_EMULATION + syscall32_cpu_init(); + #else +- static /*const*/ struct callback_register __cpuinitdata cstar = { ++ static const struct callback_register __cpuinitconst cstar = { + .type = CALLBACKTYPE_syscall32, + .address = (unsigned long)ignore_sysret + }; +diff -urN linux-2.6.27.19-5.1/arch/x86/kernel/cpu/intel_64.c linux-2.6.27.23-0.1.1/arch/x86/kernel/cpu/intel_64.c +--- linux-2.6.27.19-5.1/arch/x86/kernel/cpu/intel_64.c 2009-06-16 13:53:34.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/x86/kernel/cpu/intel_64.c 2009-06-16 13:39:58.000000000 +0100 +@@ -9,6 +9,19 @@ + + static void __cpuinit early_init_intel(struct cpuinfo_x86 *c) + { ++ /* Unmask CPUID levels if masked: */ ++ if (c->x86 == 6 && c->x86_model >= 15) { ++ u64 misc_enable; ++ ++ rdmsrl(MSR_IA32_MISC_ENABLE, misc_enable); ++ ++ if (misc_enable & MSR_IA32_MISC_ENABLE_LIMIT_CPUID) { ++ misc_enable &= ~MSR_IA32_MISC_ENABLE_LIMIT_CPUID; ++ wrmsrl(MSR_IA32_MISC_ENABLE, misc_enable); ++ c->cpuid_level = cpuid_eax(0); ++ } ++ } ++ + if ((c->x86 == 0xf && c->x86_model >= 0x03) || + (c->x86 == 0x6 && c->x86_model >= 0x0e)) + set_cpu_cap(c, X86_FEATURE_CONSTANT_TSC); +diff -urN linux-2.6.27.19-5.1/arch/x86/kernel/cpu/intel.c linux-2.6.27.23-0.1.1/arch/x86/kernel/cpu/intel.c +--- linux-2.6.27.19-5.1/arch/x86/kernel/cpu/intel.c 2009-06-16 13:53:34.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/x86/kernel/cpu/intel.c 2009-06-16 13:39:58.000000000 +0100 +@@ -32,6 +32,19 @@ + + static void __cpuinit early_init_intel(struct cpuinfo_x86 *c) + { ++ /* Unmask CPUID levels if masked: */ ++ if (c->x86 == 6 && c->x86_model >= 15) { ++ u64 misc_enable; ++ ++ rdmsrl(MSR_IA32_MISC_ENABLE, misc_enable); ++ ++ if (misc_enable & MSR_IA32_MISC_ENABLE_LIMIT_CPUID) { ++ misc_enable &= ~MSR_IA32_MISC_ENABLE_LIMIT_CPUID; ++ wrmsrl(MSR_IA32_MISC_ENABLE, misc_enable); ++ c->cpuid_level = cpuid_eax(0); ++ } ++ } ++ + /* Netburst reports 64 bytes clflush size, but does IO in 128 bytes */ + if (c->x86 == 15 && c->x86_cache_alignment == 64) + c->x86_cache_alignment = 128; +diff -urN linux-2.6.27.19-5.1/arch/x86/kernel/cpu/mtrr/generic.c linux-2.6.27.23-0.1.1/arch/x86/kernel/cpu/mtrr/generic.c +--- linux-2.6.27.19-5.1/arch/x86/kernel/cpu/mtrr/generic.c 2009-06-16 13:53:34.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/x86/kernel/cpu/mtrr/generic.c 2009-06-16 13:39:58.000000000 +0100 +@@ -45,6 +45,32 @@ + static int mtrr_show; + module_param_named(show, mtrr_show, bool, 0); + ++/** ++ * BIOS is expected to clear MtrrFixDramModEn bit, see for example ++ * "BIOS and Kernel Developer's Guide for the AMD Athlon 64 and AMD ++ * Opteron Processors" (26094 Rev. 3.30 February 2006), section ++ * "13.2.1.2 SYSCFG Register": "The MtrrFixDramModEn bit should be set ++ * to 1 during BIOS initalization of the fixed MTRRs, then cleared to ++ * 0 for operation." ++ */ ++static inline void k8_check_syscfg_dram_mod_en(void) ++{ ++ u32 lo, hi; ++ ++ if (!((boot_cpu_data.x86_vendor == X86_VENDOR_AMD) && ++ (boot_cpu_data.x86 >= 0x0f))) ++ return; ++ ++ rdmsr(MSR_K8_SYSCFG, lo, hi); ++ if (lo & K8_MTRRFIXRANGE_DRAM_MODIFY) { ++ printk(KERN_ERR "MTRR: CPU %u: SYSCFG[MtrrFixDramModEn]" ++ " not cleared by BIOS, clearing this bit\n", ++ smp_processor_id()); ++ lo &= ~K8_MTRRFIXRANGE_DRAM_MODIFY; ++ mtrr_wrmsr(MSR_K8_SYSCFG, lo, hi); ++ } ++} ++ + /* + * Returns the effective MTRR type for the region + * Error returns: +@@ -178,6 +204,8 @@ + unsigned int *p = (unsigned int *) frs; + int i; + ++ k8_check_syscfg_dram_mod_en(); ++ + rdmsr(MTRRfix64K_00000_MSR, p[0], p[1]); + + for (i = 0; i < 2; i++) +@@ -312,27 +340,10 @@ + } + + /** +- * Enable and allow read/write of extended fixed-range MTRR bits on K8 CPUs +- * see AMD publication no. 24593, chapter 3.2.1 for more information +- */ +-static inline void k8_enable_fixed_iorrs(void) +-{ +- unsigned lo, hi; +- +- rdmsr(MSR_K8_SYSCFG, lo, hi); +- mtrr_wrmsr(MSR_K8_SYSCFG, lo +- | K8_MTRRFIXRANGE_DRAM_ENABLE +- | K8_MTRRFIXRANGE_DRAM_MODIFY, hi); +-} +- +-/** + * set_fixed_range - checks & updates a fixed-range MTRR if it differs from the value it should have + * @msr: MSR address of the MTTR which should be checked and updated + * @changed: pointer which indicates whether the MTRR needed to be changed + * @msrwords: pointer to the MSR values which the MSR should have +- * +- * If K8 extentions are wanted, update the K8 SYSCFG MSR also. +- * See AMD publication no. 24593, chapter 7.8.1, page 233 for more information. + */ + static void set_fixed_range(int msr, bool *changed, unsigned int *msrwords) + { +@@ -341,10 +352,6 @@ + rdmsr(msr, lo, hi); + + if (lo != msrwords[0] || hi != msrwords[1]) { +- if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD && +- (boot_cpu_data.x86 >= 0x0f && boot_cpu_data.x86 <= 0x11) && +- ((msrwords[0] | msrwords[1]) & K8_MTRR_RDMEM_WRMEM_MASK)) +- k8_enable_fixed_iorrs(); + mtrr_wrmsr(msr, msrwords[0], msrwords[1]); + *changed = true; + } +@@ -428,6 +435,8 @@ + bool changed = false; + int block=-1, range; + ++ k8_check_syscfg_dram_mod_en(); ++ + while (fixed_range_blocks[++block].ranges) + for (range=0; range < fixed_range_blocks[block].ranges; range++) + set_fixed_range(fixed_range_blocks[block].base_msr + range, +diff -urN linux-2.6.27.19-5.1/arch/x86/kernel/cpu/mtrr/main.c linux-2.6.27.23-0.1.1/arch/x86/kernel/cpu/mtrr/main.c +--- linux-2.6.27.19-5.1/arch/x86/kernel/cpu/mtrr/main.c 2009-06-16 13:53:34.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/x86/kernel/cpu/mtrr/main.c 2009-06-16 13:39:58.000000000 +0100 +@@ -1496,8 +1496,7 @@ + + /* kvm/qemu doesn't have mtrr set right, don't trim them all */ + if (!highest_pfn) { +- WARN(!kvm_para_available(), KERN_WARNING +- "WARNING: strange, CPU MTRRs all blank?\n"); ++ printk(KERN_INFO "CPU MTRRs all blank - virtualized system.\n"); + return 0; + } + +diff -urN linux-2.6.27.19-5.1/arch/x86/kernel/crash.c linux-2.6.27.23-0.1.1/arch/x86/kernel/crash.c +--- linux-2.6.27.19-5.1/arch/x86/kernel/crash.c 2009-06-16 13:53:34.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/x86/kernel/crash.c 2009-06-16 13:39:58.000000000 +0100 +@@ -29,7 +29,6 @@ + + #include + +-#ifndef CONFIG_XEN + /* This keeps a track of which one is crashing cpu. */ + static int crashing_cpu; + +@@ -191,7 +190,6 @@ + #endif /* CONFIG_KDB_KDUMP */ + + #endif /* defined(CONFIG_SMP) && defined(CONFIG_X86_LOCAL_APIC) */ +-#endif /* CONFIG_XEN */ + + void native_machine_crash_shutdown(struct pt_regs *regs) + { +@@ -206,7 +204,6 @@ + /* The kernel is broken so disable interrupts */ + local_irq_disable(); + +-#ifndef CONFIG_XEN + /* Make a note of crashing cpu. Will be used in NMI callback.*/ + crashing_cpu = safe_smp_processor_id(); + nmi_shootdown_cpus(); +@@ -214,7 +211,6 @@ + #if defined(CONFIG_X86_IO_APIC) + disable_IO_APIC(); + #endif +-#endif /* CONFIG_XEN */ + #ifdef CONFIG_HPET_TIMER + hpet_disable(); + #endif +@@ -228,14 +224,14 @@ + + /* Make a note of crashing cpu. Will be used in NMI callback.*/ + crashing_cpu = safe_smp_processor_id(); +-#ifndef CONFIG_XEN ++#ifndef CONFIG_PARAVIRT_XEN + nmi_shootdown_cpus_init(); + #endif /* CONFIG_XEN */ + } + + void machine_crash_shutdown_end(struct pt_regs *regs) + { +-#ifndef CONFIG_XEN ++#ifndef CONFIG_PARAVIRT_XEN + wait_other_cpus(); + + local_irq_disable(); +diff -urN linux-2.6.27.19-5.1/arch/x86/kernel/e820-xen.c linux-2.6.27.23-0.1.1/arch/x86/kernel/e820-xen.c +--- linux-2.6.27.19-5.1/arch/x86/kernel/e820-xen.c 2009-06-16 13:53:34.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/x86/kernel/e820-xen.c 2009-06-16 13:39:58.000000000 +0100 +@@ -43,9 +43,11 @@ + * next kernel with full memory. + */ + struct e820map __initdata e820; ++#ifndef CONFIG_XEN + struct e820map e820_saved; +-#ifdef CONFIG_XEN ++#else + static struct e820map machine_e820; ++#define e820_saved machine_e820 + #endif + + /* For PCI or other memory-mapped resources */ +@@ -443,7 +445,7 @@ + u64 size, unsigned old_type, + unsigned new_type) + { +- int i; ++ unsigned int i, x; + u64 real_updated_size = 0; + + BUG_ON(old_type == new_type); +@@ -451,7 +453,7 @@ + if (size > (ULLONG_MAX - start)) + size = ULLONG_MAX - start; + +- for (i = 0; i < e820.nr_map; i++) { ++ for (i = 0; i < e820x->nr_map; i++) { + struct e820entry *ei = &e820x->map[i]; + u64 final_start, final_end; + if (ei->type != old_type) +@@ -468,14 +470,23 @@ + final_end = min(start + size, ei->addr + ei->size); + if (final_start >= final_end) + continue; +- e820_add_region(final_start, final_end - final_start, +- new_type); ++ ++ x = e820x->nr_map; ++ if (x == ARRAY_SIZE(e820x->map)) { ++ printk(KERN_ERR "Too many memory map entries!\n"); ++ break; ++ } ++ e820x->map[x].addr = final_start; ++ e820x->map[x].size = final_end - final_start; ++ e820x->map[x].type = new_type; ++ e820x->nr_map++; ++ + real_updated_size += final_end - final_start; + +- ei->size -= final_end - final_start; + if (ei->addr < final_start) + continue; + ei->addr = final_end; ++ ei->size -= final_end - final_start; + } + return real_updated_size; + } +@@ -489,6 +500,12 @@ + static u64 __init e820_update_range_saved(u64 start, u64 size, + unsigned old_type, unsigned new_type) + { ++#ifdef CONFIG_XEN ++ if (is_initial_xendomain()) ++ return e820_update_range_map(&machine_e820, ++ phys_to_machine(start), size, ++ old_type, new_type); ++#endif + return e820_update_range_map(&e820_saved, start, size, old_type, + new_type); + } +@@ -620,7 +637,7 @@ + "address range\n" + KERN_ERR "PCI: Unassigned devices with 32bit resource " + "registers may break!\n"); +- found = e820_search_gap(&gapstart, &gapsize, MAX_GAP_END, 0); ++ found = e820_search_gap(&gapstart, &gapsize, MAX_GAP_END, 0); + BUG_ON(!found); + } + #endif +@@ -1050,8 +1067,8 @@ + continue; + return addr; + } +- return -1UL; + ++ return -1ULL; + } + + /* +@@ -1062,15 +1079,71 @@ + u64 size = 0; + u64 addr; + u64 start; ++#ifdef CONFIG_XEN ++ unsigned int order = get_order(sizet); + +- start = startt; +- while (size < sizet) ++ if (is_initial_xendomain()) { ++ sizet = PAGE_SIZE << order; ++ if (align < PAGE_SIZE) ++ align = PAGE_SIZE; ++ } ++#endif ++ for (start = startt; ; start += size) { + start = find_e820_area_size(start, &size, align); ++ if (!(start + 1)) ++ return 0; ++ if (size >= sizet) ++ break; ++ } + +- if (size < sizet) ++#ifdef CONFIG_X86_32 ++ if (start >= MAXMEM) ++ return 0; ++ if (start + size > MAXMEM) ++ size = MAXMEM - start; ++#endif ++#ifdef CONFIG_XEN ++ if ((start >> PAGE_SHIFT) >= xen_start_info->nr_pages) + return 0; ++ if (PFN_UP(start + size) > xen_start_info->nr_pages) ++ size = ((u64)xen_start_info->nr_pages << PAGE_SHIFT) - start; ++#endif + + addr = round_down(start + size - sizet, align); ++ if (addr < start) ++ return 0; ++#ifdef CONFIG_XEN ++ if (is_initial_xendomain()) { ++ int rc; ++ unsigned long max_initmap_pfn; ++ ++ max_initmap_pfn = ALIGN(PFN_UP(__pa(xen_start_info->pt_base)) ++ + xen_start_info->nr_pt_frames ++ + 1 + (1 << (19 - PAGE_SHIFT)), ++ 1UL << (22 - PAGE_SHIFT)); ++#ifdef CONFIG_X86_32 ++ if ((addr >> PAGE_SHIFT) ++ < max(max_initmap_pfn, max_pfn_mapped)) ++ rc = xen_create_contiguous_region((unsigned long) ++ __va(addr), ++ order, 32); ++#else ++ if ((addr >> PAGE_SHIFT) < max_pfn_mapped) ++ rc = xen_create_contiguous_region((unsigned long) ++ __va(addr), ++ order, 32); ++ else if ((addr >> PAGE_SHIFT) < max_initmap_pfn) ++ rc = xen_create_contiguous_region(__START_KERNEL_map ++ + addr, ++ order, 32); ++#endif ++ else ++ rc = early_create_contiguous_region(addr >> PAGE_SHIFT, ++ order, 32); ++ if (rc) ++ return 0; ++ } ++#endif + e820_update_range(addr, sizet, E820_RAM, E820_RESERVED); + e820_update_range_saved(addr, sizet, E820_RAM, E820_RESERVED); + printk(KERN_INFO "update e820 for early_reserve_e820\n"); +@@ -1354,7 +1427,7 @@ + struct resource *res; + u64 end; + +- res = alloc_bootmem_low(sizeof(struct resource) * e820.nr_map); ++ res = alloc_bootmem(sizeof(struct resource) * e820.nr_map); + for (i = 0; i < e820.nr_map; i++) { + end = e820.map[i].addr + e820.map[i].size - 1; + #ifndef CONFIG_RESOURCES_64BIT +@@ -1472,8 +1545,7 @@ + if (HYPERVISOR_memory_op(XENMEM_machine_memory_map, &memmap)) + BUG(); + machine_e820.nr_map = memmap.nr_entries; +- } else +- machine_e820 = e820; ++ } + #endif + + return "Xen"; +@@ -1484,7 +1556,10 @@ + char *who; + + who = memory_setup(); +- memcpy(&e820_saved, &e820, sizeof(struct e820map)); ++#ifdef CONFIG_XEN ++ if (!is_initial_xendomain()) ++#endif ++ memcpy(&e820_saved, &e820, sizeof(struct e820map)); + printk(KERN_INFO "Xen-provided physical RAM map:\n"); + e820_print_map(who); + } +diff -urN linux-2.6.27.19-5.1/arch/x86/kernel/entry_32-xen.S linux-2.6.27.23-0.1.1/arch/x86/kernel/entry_32-xen.S +--- linux-2.6.27.19-5.1/arch/x86/kernel/entry_32-xen.S 2009-06-16 13:53:34.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/x86/kernel/entry_32-xen.S 2009-06-16 13:39:58.000000000 +0100 +@@ -565,8 +565,8 @@ + .previous + 14: __DISABLE_INTERRUPTS + TRACE_IRQS_OFF +- jmp 11f + ecrit: /**** END OF CRITICAL REGION ****/ ++ jmp .Ldo_upcall + + CFI_RESTORE_STATE + hypervisor_iret: +@@ -833,17 +833,25 @@ + pushl %eax + CFI_ADJUST_CFA_OFFSET 4 + SAVE_ALL ++ movl PT_CS(%esp),%ecx + movl PT_EIP(%esp),%eax ++ andl $SEGMENT_RPL_MASK,%ecx ++ cmpl $USER_RPL,%ecx ++ jae .Ldo_upcall + cmpl $scrit,%eax +- jb 11f ++ jb 0f + cmpl $ecrit,%eax + jb critical_region_fixup ++0: ++#ifdef CONFIG_XEN_SUPERVISOR_MODE_KERNEL + cmpl $sysexit_scrit,%eax +- jb 11f ++ jb .Ldo_upcall + cmpl $sysexit_ecrit,%eax +- ja 11f ++ ja .Ldo_upcall + addl $PT_OLDESP,%esp # Remove eflags...ebx from stack frame. +-11: push %esp ++#endif ++.Ldo_upcall: ++ push %esp + CFI_ADJUST_CFA_OFFSET 4 + call evtchn_do_upcall + add $4,%esp +@@ -859,40 +867,36 @@ + # provides the number of bytes which have already been popped from the + # interrupted stack frame. + critical_region_fixup: +- movzbl critical_fixup_table-scrit(%eax),%ecx # %eax contains num bytes popped +- cmpb $0xff,%cl # 0xff => vcpu_info critical region +- jne 15f +- xorl %ecx,%ecx +-15: leal (%esp,%ecx),%esi # %esi points at end of src region ++ movsbl critical_fixup_table-scrit(%eax),%ecx # %ecx contains num slots popped ++ testl %ecx,%ecx ++ leal (%esp,%ecx,4),%esi # %esi points at end of src region + leal PT_OLDESP(%esp),%edi # %edi points at end of dst region +- shrl $2,%ecx # convert words to bytes +- je 17f # skip loop if nothing to copy ++ jle 17f # skip loop if nothing to copy + 16: subl $4,%esi # pre-decrementing copy loop + subl $4,%edi + movl (%esi),%eax + movl %eax,(%edi) + loop 16b + 17: movl %edi,%esp # final %edi is top of merged stack +- jmp 11b ++ jmp .Ldo_upcall + + .section .rodata,"a" + critical_fixup_table: +- .byte 0xff,0xff,0xff # testb $0xff,(%esi) = __TEST_PENDING +- .byte 0xff,0xff # jnz 14f +- .byte 0x00 # pop %ebx +- .byte 0x04 # pop %ecx +- .byte 0x08 # pop %edx +- .byte 0x0c # pop %esi +- .byte 0x10 # pop %edi +- .byte 0x14 # pop %ebp +- .byte 0x18 # pop %eax +- .byte 0x1c # pop %ds +- .byte 0x20 # pop %es +- .byte 0x24,0x24 # pop %fs +- .byte 0x28,0x28,0x28 # add $4,%esp +- .byte 0x2c # iret +- .byte 0xff,0xff,0xff,0xff # movb $1,1(%esi) +- .byte 0x00,0x00 # jmp 11b ++ .byte -1,-1,-1 # testb $0xff,(%esi) = __TEST_PENDING ++ .byte -1,-1 # jnz 14f ++ .byte 0 # pop %ebx ++ .byte 1 # pop %ecx ++ .byte 2 # pop %edx ++ .byte 3 # pop %esi ++ .byte 4 # pop %edi ++ .byte 5 # pop %ebp ++ .byte 6 # pop %eax ++ .byte 7 # pop %ds ++ .byte 8 # pop %es ++ .byte 9,9 # pop %fs ++ .byte 10,10,10 # add $4,%esp ++ .byte 11 # iret ++ .byte -1,-1,-1,-1 # movb $1,1(%esi) = __DISABLE_INTERRUPTS + .previous + + # Hypervisor uses this for application faults while it executes. +diff -urN linux-2.6.27.19-5.1/arch/x86/kernel/entry_64.S linux-2.6.27.23-0.1.1/arch/x86/kernel/entry_64.S +--- linux-2.6.27.19-5.1/arch/x86/kernel/entry_64.S 2009-06-16 13:53:34.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/x86/kernel/entry_64.S 2009-06-16 13:39:58.000000000 +0100 +@@ -1088,7 +1088,6 @@ + andl %edi,%edx + jnz retint_careful + jmp retint_swapgs +- CFI_ENDPROC + + error_kernelspace: + incl %ebx +@@ -1106,6 +1105,7 @@ + cmpq $gs_change,RIP(%rsp) + je error_swapgs + jmp error_sti ++ CFI_ENDPROC + KPROBE_END(error_entry) + + /* Reload gs selector with exception handling */ +diff -urN linux-2.6.27.19-5.1/arch/x86/kernel/fixup.c linux-2.6.27.23-0.1.1/arch/x86/kernel/fixup.c +--- linux-2.6.27.19-5.1/arch/x86/kernel/fixup.c 2009-06-16 13:53:34.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/x86/kernel/fixup.c 2009-06-16 13:39:58.000000000 +0100 +@@ -33,6 +33,7 @@ + #include + #include + #include ++#include + + #define DP(_f, _args...) printk(KERN_ALERT " " _f "\n" , ## _args ) + +diff -urN linux-2.6.27.19-5.1/arch/x86/kernel/genapic_64.c linux-2.6.27.23-0.1.1/arch/x86/kernel/genapic_64.c +--- linux-2.6.27.19-5.1/arch/x86/kernel/genapic_64.c 2009-06-16 13:53:34.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/x86/kernel/genapic_64.c 2009-06-16 13:39:58.000000000 +0100 +@@ -48,6 +48,16 @@ + genapic = &apic_flat; + } + ++ if (x2apic && (genapic != &apic_x2apic_phys && ++ genapic != &apic_x2apic_uv_x && ++ genapic != &apic_x2apic_cluster)) { ++ if (x2apic_phys) ++ genapic = &apic_x2apic_phys; ++ else ++ genapic = &apic_x2apic_cluster; ++ printk(KERN_INFO "Setting APIC routing to %s\n", genapic->name); ++ } ++ + if (genapic == &apic_flat) { + if (max_physical_apicid >= 8) + genapic = &apic_physflat; +diff -urN linux-2.6.27.19-5.1/arch/x86/kernel/genapic_xen_64.c linux-2.6.27.23-0.1.1/arch/x86/kernel/genapic_xen_64.c +--- linux-2.6.27.19-5.1/arch/x86/kernel/genapic_xen_64.c 2009-06-16 13:53:34.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/x86/kernel/genapic_xen_64.c 2009-06-16 13:39:58.000000000 +0100 +@@ -26,7 +26,11 @@ + + static inline void __send_IPI_one(unsigned int cpu, int vector) + { ++#ifdef CONFIG_SMP + notify_remote_via_ipi(vector, cpu); ++#else ++ BUG(); ++#endif + } + + static void xen_send_IPI_shortcut(unsigned int shortcut, +diff -urN linux-2.6.27.19-5.1/arch/x86/kernel/genx2apic_cluster.c linux-2.6.27.23-0.1.1/arch/x86/kernel/genx2apic_cluster.c +--- linux-2.6.27.19-5.1/arch/x86/kernel/genx2apic_cluster.c 2009-06-16 13:53:34.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/x86/kernel/genx2apic_cluster.c 2009-06-16 13:39:58.000000000 +0100 +@@ -14,10 +14,7 @@ + + static int x2apic_acpi_madt_oem_check(char *oem_id, char *oem_table_id) + { +- if (cpu_has_x2apic) +- return 1; +- +- return 0; ++ return x2apic_enabled(); + } + + /* Start with all IRQs pointing to boot CPU. IRQ balancing will shift them. */ +diff -urN linux-2.6.27.19-5.1/arch/x86/kernel/genx2apic_phys.c linux-2.6.27.23-0.1.1/arch/x86/kernel/genx2apic_phys.c +--- linux-2.6.27.19-5.1/arch/x86/kernel/genx2apic_phys.c 2009-06-16 13:53:34.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/x86/kernel/genx2apic_phys.c 2009-06-16 13:39:58.000000000 +0100 +@@ -12,7 +12,7 @@ + + DEFINE_PER_CPU(int, x2apic_extra_bits); + +-static int x2apic_phys; ++int x2apic_phys; + + static int set_x2apic_phys_mode(char *arg) + { +@@ -23,10 +23,10 @@ + + static int x2apic_acpi_madt_oem_check(char *oem_id, char *oem_table_id) + { +- if (cpu_has_x2apic && x2apic_phys) +- return 1; +- +- return 0; ++ if (x2apic_phys) ++ return x2apic_enabled(); ++ else ++ return 0; + } + + /* Start with all IRQs pointing to boot CPU. IRQ balancing will shift them. */ +diff -urN linux-2.6.27.19-5.1/arch/x86/kernel/head_64.S linux-2.6.27.23-0.1.1/arch/x86/kernel/head_64.S +--- linux-2.6.27.19-5.1/arch/x86/kernel/head_64.S 2009-06-16 13:53:34.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/x86/kernel/head_64.S 2009-06-16 13:39:58.000000000 +0100 +@@ -280,6 +280,8 @@ + + ENTRY(early_idt_handler) + #ifdef CONFIG_EARLY_PRINTK ++#include ++#include + cmpl $2,early_recursion_flag(%rip) + jz 1f + incl early_recursion_flag(%rip) +@@ -295,6 +297,16 @@ + testl $0x27d00,%eax + je 0f + popq %r8 # get error code ++ ++ CFI_STARTPROC simple ++ CFI_SIGNAL_FRAME ++ CFI_DEF_CFA rsp, SS+8-RIP ++# CFI_REL_OFFSET ss, SS-RIP ++ CFI_REL_OFFSET rsp, RSP-RIP ++# CFI_REL_OFFSET rflags, EFLAGS-RIP ++# CFI_REL_OFFSET cs, CS-RIP ++ CFI_REL_OFFSET rip, RIP-RIP ++ + 0: movq 0(%rsp),%rcx # get ip + movq 8(%rsp),%rdx # get cs + xorl %eax,%eax +@@ -308,6 +320,7 @@ + movq 0(%rsp),%rsi # get rip again + call __print_symbol + #endif ++ CFI_ENDPROC + #endif /* EARLY_PRINTK */ + 1: hlt + jmp 1b +diff -urN linux-2.6.27.19-5.1/arch/x86/kernel/head64-xen.c linux-2.6.27.23-0.1.1/arch/x86/kernel/head64-xen.c +--- linux-2.6.27.19-5.1/arch/x86/kernel/head64-xen.c 2009-06-16 13:53:34.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/x86/kernel/head64-xen.c 2009-06-16 13:39:58.000000000 +0100 +@@ -171,6 +171,14 @@ + + (xen_start_info->nr_pt_frames << PAGE_SHIFT), + "Xen provided"); + ++ if (xen_feature(XENFEAT_auto_translated_physmap)) ++ xen_start_info->mfn_list = ~0UL; ++ else if (xen_start_info->mfn_list < __START_KERNEL_map) ++ reserve_early(xen_start_info->first_p2m_pfn << PAGE_SHIFT, ++ (xen_start_info->first_p2m_pfn ++ + xen_start_info->nr_p2m_frames) << PAGE_SHIFT, ++ "INITP2M"); ++ + /* + * At this point everything still needed from the boot loader + * or BIOS or kernel text should be early reserved or marked not +diff -urN linux-2.6.27.19-5.1/arch/x86/kernel/head_64-xen.S linux-2.6.27.23-0.1.1/arch/x86/kernel/head_64-xen.S +--- linux-2.6.27.19-5.1/arch/x86/kernel/head_64-xen.S 2009-06-16 13:53:34.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/x86/kernel/head_64-xen.S 2009-06-16 13:39:58.000000000 +0100 +@@ -18,6 +18,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -135,6 +136,7 @@ + ELFNOTE(Xen, XEN_ELFNOTE_ENTRY, .quad startup_64) + ELFNOTE(Xen, XEN_ELFNOTE_HYPERCALL_PAGE, .quad hypercall_page) + ELFNOTE(Xen, XEN_ELFNOTE_L1_MFN_VALID, .quad _PAGE_PRESENT, _PAGE_PRESENT) ++ ELFNOTE(Xen, XEN_ELFNOTE_INIT_P2M, .quad VMEMMAP_START) + ELFNOTE(Xen, XEN_ELFNOTE_FEATURES, .asciz "writable_page_tables|writable_descriptor_tables|auto_translated_physmap|pae_pgdir_above_4gb|supervisor_mode_kernel") + ELFNOTE(Xen, XEN_ELFNOTE_LOADER, .asciz "generic") + ELFNOTE(Xen, XEN_ELFNOTE_SUSPEND_CANCEL, .long 1) +diff -urN linux-2.6.27.19-5.1/arch/x86/kernel/io_apic_32-xen.c linux-2.6.27.23-0.1.1/arch/x86/kernel/io_apic_32-xen.c +--- linux-2.6.27.19-5.1/arch/x86/kernel/io_apic_32-xen.c 2009-06-16 13:53:34.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/x86/kernel/io_apic_32-xen.c 2009-06-16 13:39:58.000000000 +0100 +@@ -1233,7 +1233,7 @@ + + BUG_ON((unsigned)irq >= NR_IRQ_VECTORS); + +- if (irq < PIRQ_BASE || irq - PIRQ_BASE > NR_PIRQS) ++ if (irq < PIRQ_BASE || irq - PIRQ_BASE >= NR_PIRQS) + return -EINVAL; + + if (irq_vector[irq] > 0) +diff -urN linux-2.6.27.19-5.1/arch/x86/kernel/io_apic_64.c linux-2.6.27.23-0.1.1/arch/x86/kernel/io_apic_64.c +--- linux-2.6.27.19-5.1/arch/x86/kernel/io_apic_64.c 2009-06-16 13:53:34.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/x86/kernel/io_apic_64.c 2009-06-16 13:39:58.000000000 +0100 +@@ -2067,7 +2067,7 @@ + setup_timer_IRQ0_pin(apic1, pin1, cfg->vector); + } + unmask_IO_APIC_irq(0); +- if (!no_timer_check && timer_irq_works()) { ++ if (no_timer_check || timer_irq_works()) { + if (nmi_watchdog == NMI_IO_APIC) { + setup_nmi(); + enable_8259A_irq(0); +diff -urN linux-2.6.27.19-5.1/arch/x86/kernel/io_apic_64-xen.c linux-2.6.27.23-0.1.1/arch/x86/kernel/io_apic_64-xen.c +--- linux-2.6.27.19-5.1/arch/x86/kernel/io_apic_64-xen.c 2009-06-16 13:53:34.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/x86/kernel/io_apic_64-xen.c 2009-06-16 13:39:58.000000000 +0100 +@@ -758,7 +758,7 @@ + + BUG_ON((unsigned)irq >= NR_IRQS); + +- if (irq < PIRQ_BASE || irq - PIRQ_BASE > NR_PIRQS) ++ if (irq < PIRQ_BASE || irq - PIRQ_BASE >= NR_PIRQS) + return -EINVAL; + + cfg = &irq_cfg[irq]; +@@ -1739,7 +1739,7 @@ + setup_timer_IRQ0_pin(apic1, pin1, cfg->vector); + } + unmask_IO_APIC_irq(0); +- if (!no_timer_check && timer_irq_works()) { ++ if (no_timer_check || timer_irq_works()) { + if (nmi_watchdog == NMI_IO_APIC) { + setup_nmi(); + enable_8259A_irq(0); +diff -urN linux-2.6.27.19-5.1/arch/x86/kernel/machine_kexec_32.c linux-2.6.27.23-0.1.1/arch/x86/kernel/machine_kexec_32.c +--- linux-2.6.27.19-5.1/arch/x86/kernel/machine_kexec_32.c 2009-06-16 13:53:34.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/x86/kernel/machine_kexec_32.c 2009-06-16 13:39:58.000000000 +0100 +@@ -68,6 +68,8 @@ + xki->page_list[PA_PTE_0] = __ma(kexec_pte0); + xki->page_list[PA_PTE_1] = __ma(kexec_pte1); + ++ if (image->type == KEXEC_TYPE_DEFAULT) ++ xki->page_list[PA_SWAP_PAGE] = page_to_phys(image->swap_page); + } + + int __init machine_kexec_setup_resources(struct resource *hypervisor, +diff -urN linux-2.6.27.19-5.1/arch/x86/kernel/Makefile linux-2.6.27.23-0.1.1/arch/x86/kernel/Makefile +--- linux-2.6.27.19-5.1/arch/x86/kernel/Makefile 2009-06-16 13:53:34.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/x86/kernel/Makefile 2009-06-16 13:39:58.000000000 +0100 +@@ -124,7 +124,7 @@ + time_64-$(CONFIG_XEN) += time_32.o + endif + +-disabled-obj-$(CONFIG_XEN) := %_uv.o early-quirks.o genapic_flat_64.o \ ++disabled-obj-$(CONFIG_XEN) := %_uv.o crash.o early-quirks.o genapic_flat_64.o \ + genx2apic_%.o hpet.o i8253.o i8259.o irqinit_$(BITS).o \ + pci-swiotlb_64.o reboot.o smpboot.o tlb_$(BITS).o tsc.o tsc_sync.o \ + uv_%.o vsmp_64.o +diff -urN linux-2.6.27.19-5.1/arch/x86/kernel/mpparse-xen.c linux-2.6.27.23-0.1.1/arch/x86/kernel/mpparse-xen.c +--- linux-2.6.27.19-5.1/arch/x86/kernel/mpparse-xen.c 2009-06-16 13:53:34.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/x86/kernel/mpparse-xen.c 2009-06-16 13:39:58.000000000 +0100 +@@ -34,6 +34,11 @@ + #include + #endif + ++static void *_bus_to_virt(unsigned long ma) ++{ ++ return is_ISA_range(ma, ma) ? isa_bus_to_virt(ma) : bus_to_virt(ma); ++} ++ + /* + * Checksum an MP configuration block. + */ +@@ -48,9 +53,9 @@ + return sum & 0xFF; + } + +-#ifndef CONFIG_XEN + static void __init MP_processor_info(struct mpc_config_processor *m) + { ++#ifndef CONFIG_XEN + int apicid; + char *bootup_cpu = ""; + +@@ -71,13 +76,10 @@ + + printk(KERN_INFO "Processor #%d%s\n", m->mpc_apicid, bootup_cpu); + generic_processor_info(apicid, m->mpc_apicver); +-} +-#else +-static void __init MP_processor_info(struct mpc_config_processor *m) +-{ ++#else /* CONFIG_XEN */ + num_processors++; ++#endif + } +-#endif /* CONFIG_XEN */ + + #ifdef CONFIG_X86_IO_APIC + static void __init MP_bus_info(struct mpc_config_bus *m) +@@ -649,7 +651,7 @@ + * Read the physical hardware table. Anything here will + * override the defaults. + */ +- if (!smp_read_mpc(isa_bus_to_virt(mpf->mpf_physptr), early)) { ++ if (!smp_read_mpc(_bus_to_virt(mpf->mpf_physptr), early)) { + #ifdef CONFIG_X86_LOCAL_APIC + smp_found_config = 0; + #endif +@@ -706,7 +708,7 @@ + static int __init smp_scan_config(unsigned long base, unsigned long length, + unsigned reserve) + { +- unsigned int *bp = isa_bus_to_virt(base); ++ unsigned int *bp = _bus_to_virt(base); + struct intel_mp_floating *mpf; + + apic_printk(APIC_VERBOSE, "Scan SMP from %p for %ld bytes.\n", +@@ -754,7 +756,7 @@ + } + #else + printk(KERN_INFO "found SMP MP-table at [%p] %08lx\n", +- mpf, ((void *)bp - isa_bus_to_virt(base)) + base); ++ mpf, ((void *)bp - _bus_to_virt(base)) + base); + #endif + return 1; + } +@@ -774,7 +776,6 @@ + if (x86_quirks->mach_find_smp_config(reserve)) + return; + } +- + /* + * FIXME: Linux assumes you have 640K of base ram.. + * this continues the error... +@@ -907,12 +908,12 @@ + struct mpc_config_intsrc *m = + (struct mpc_config_intsrc *)mpt; + +- printk(KERN_INFO "OLD "); ++ apic_printk(APIC_VERBOSE, "OLD "); + print_MP_intsrc_info(m); + i = get_MP_intsrc_index(m); + if (i > 0) { + assign_to_mpc_intsrc(&mp_irqs[i], m); +- printk(KERN_INFO "NEW "); ++ apic_printk(APIC_VERBOSE, "NEW "); + print_mp_irq_info(&mp_irqs[i]); + } else if (!i) { + /* legacy, do nothing */ +@@ -960,7 +961,7 @@ + continue; + + if (nr_m_spare > 0) { +- printk(KERN_INFO "*NEW* found "); ++ apic_printk(APIC_VERBOSE, "*NEW* found\n"); + nr_m_spare--; + assign_to_mpc_intsrc(&mp_irqs[i], m_spare[nr_m_spare]); + m_spare[nr_m_spare] = NULL; +@@ -1014,7 +1015,7 @@ + alloc_mptable = 1; + if (!p) + return 0; +- mpc_new_length = PAGE_SIZE << get_order(memparse(p, &p)); ++ mpc_new_length = memparse(p, &p); + return 0; + } + early_param("alloc_mptable", parse_alloc_mptable_opt); +@@ -1022,12 +1023,11 @@ + void __init early_reserve_e820_mpc_new(void) + { + if (enable_update_mptable && alloc_mptable) { +- u64 startt = PAGE_SIZE; ++ u64 startt = 0; + #ifdef CONFIG_X86_TRAMPOLINE + startt = TRAMPOLINE_BASE; + #endif +- mpc_new_phys = early_reserve_e820(startt, mpc_new_length, +- mpc_new_length); ++ mpc_new_phys = early_reserve_e820(startt, mpc_new_length, 4); + } + } + +@@ -1055,12 +1055,12 @@ + if (!mpf->mpf_physptr) + return 0; + +- mpc = isa_bus_to_virt(mpf->mpf_physptr); ++ mpc = _bus_to_virt(mpf->mpf_physptr); + + if (!smp_check_mpc(mpc, oem, str)) + return 0; + +- printk(KERN_INFO "mpf: %lx\n", virt_to_phys(mpf)); ++ printk(KERN_INFO "mpf: %lx\n", (long)arbitrary_virt_to_machine(mpf)); + printk(KERN_INFO "mpf_physptr: %x\n", mpf->mpf_physptr); + + if (mpc_new_phys && mpc->mpc_length > mpc_new_length) { +@@ -1084,9 +1084,6 @@ + } else { + maddr_t mpc_new_bus; + +- if (xen_create_contiguous_region((unsigned long)phys_to_virt(mpc_new_phys), +- get_order(mpc_new_length), 32)) +- BUG(); + mpc_new_bus = phys_to_machine(mpc_new_phys); + mpf->mpf_physptr = mpc_new_bus; + mpc_new = phys_to_virt(mpc_new_phys); +diff -urN linux-2.6.27.19-5.1/arch/x86/kernel/pci-dma.c linux-2.6.27.23-0.1.1/arch/x86/kernel/pci-dma.c +--- linux-2.6.27.19-5.1/arch/x86/kernel/pci-dma.c 2009-06-16 13:53:34.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/x86/kernel/pci-dma.c 2009-06-16 13:39:58.000000000 +0100 +@@ -175,7 +175,7 @@ + if (!strncmp(p, "allowdac", 8)) + forbid_dac = 0; + if (!strncmp(p, "nodac", 5)) +- forbid_dac = -1; ++ forbid_dac = 1; + if (!strncmp(p, "usedac", 6)) { + forbid_dac = -1; + return 1; +@@ -415,4 +415,18 @@ + } + } + DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_ANY_ID, via_no_dac); ++ ++/* ++ * MCP51 PCI bridge corrupts data for DAC. Disable it. Reported in ++ * bnc#463829. ++ */ ++static __devinit void mcp51_no_dac(struct pci_dev *dev) ++{ ++ if (forbid_dac == 0) { ++ printk(KERN_INFO ++ "PCI: MCP51 PCI bridge detected. Disabling DAC.\n"); ++ forbid_dac = 1; ++ } ++} ++DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_NVIDIA, 0x026f, mcp51_no_dac); + #endif +diff -urN linux-2.6.27.19-5.1/arch/x86/kernel/pci-dma-xen.c linux-2.6.27.23-0.1.1/arch/x86/kernel/pci-dma-xen.c +--- linux-2.6.27.19-5.1/arch/x86/kernel/pci-dma-xen.c 2009-06-16 13:53:34.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/x86/kernel/pci-dma-xen.c 2009-06-16 13:39:58.000000000 +0100 +@@ -198,7 +198,7 @@ + if (!strncmp(p, "allowdac", 8)) + forbid_dac = 0; + if (!strncmp(p, "nodac", 5)) +- forbid_dac = -1; ++ forbid_dac = 1; + if (!strncmp(p, "usedac", 6)) { + forbid_dac = -1; + return 1; +@@ -482,4 +482,18 @@ + } + } + DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_ANY_ID, via_no_dac); ++ ++/* ++ * MCP51 PCI bridge corrupts data for DAC. Disable it. Reported in ++ * bnc#463829. ++ */ ++static __devinit void mcp51_no_dac(struct pci_dev *dev) ++{ ++ if (forbid_dac == 0) { ++ printk(KERN_INFO ++ "PCI: MCP51 PCI bridge detected. Disabling DAC.\n"); ++ forbid_dac = 1; ++ } ++} ++DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_NVIDIA, 0x026f, mcp51_no_dac); + #endif +diff -urN linux-2.6.27.19-5.1/arch/x86/kernel/ptrace.c linux-2.6.27.23-0.1.1/arch/x86/kernel/ptrace.c +--- linux-2.6.27.19-5.1/arch/x86/kernel/ptrace.c 2009-06-16 13:53:34.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/x86/kernel/ptrace.c 2009-06-16 13:39:58.000000000 +0100 +@@ -1380,7 +1380,7 @@ + #ifdef CONFIG_X86_32 + # define IS_IA32 1 + #elif defined CONFIG_IA32_EMULATION +-# define IS_IA32 test_thread_flag(TIF_IA32) ++# define IS_IA32 is_compat_task() + #else + # define IS_IA32 0 + #endif +diff -urN linux-2.6.27.19-5.1/arch/x86/kernel/reboot.c linux-2.6.27.23-0.1.1/arch/x86/kernel/reboot.c +--- linux-2.6.27.19-5.1/arch/x86/kernel/reboot.c 2009-06-16 13:53:34.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/x86/kernel/reboot.c 2009-06-16 13:39:58.000000000 +0100 +@@ -196,6 +196,14 @@ + DMI_MATCH(DMI_PRODUCT_NAME, "HP Compaq"), + }, + }, ++ { /* Handle problems with rebooting on Dell XPS710 */ ++ .callback = set_bios_reboot, ++ .ident = "Dell XPS710", ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), ++ DMI_MATCH(DMI_PRODUCT_NAME, "Dell XPS710"), ++ }, ++ }, + { } + }; + +diff -urN linux-2.6.27.19-5.1/arch/x86/kernel/setup.c linux-2.6.27.23-0.1.1/arch/x86/kernel/setup.c +--- linux-2.6.27.19-5.1/arch/x86/kernel/setup.c 2009-06-16 13:53:34.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/x86/kernel/setup.c 2009-06-16 13:39:58.000000000 +0100 +@@ -731,6 +731,9 @@ + + finish_e820_parsing(); + ++ if (efi_enabled) ++ efi_init(); ++ + dmi_scan_machine(); + + dmi_check_system(bad_bios_dmi_table); +@@ -744,8 +747,6 @@ + insert_resource(&iomem_resource, &data_resource); + insert_resource(&iomem_resource, &bss_resource); + +- if (efi_enabled) +- efi_init(); + + #ifdef CONFIG_X86_32 + if (ppro_with_ram_bug()) { +diff -urN linux-2.6.27.19-5.1/arch/x86/kernel/setup_percpu-xen.c linux-2.6.27.23-0.1.1/arch/x86/kernel/setup_percpu-xen.c +--- linux-2.6.27.19-5.1/arch/x86/kernel/setup_percpu-xen.c 2009-06-16 13:53:34.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/x86/kernel/setup_percpu-xen.c 2009-06-16 13:39:58.000000000 +0100 +@@ -211,7 +211,7 @@ + } + + /* allocate the map */ +- map = alloc_bootmem_low(nr_node_ids * sizeof(cpumask_t)); ++ map = alloc_bootmem(nr_node_ids * sizeof(cpumask_t)); + + pr_debug(KERN_DEBUG "Node to cpumask map at %p for %d nodes\n", + map, nr_node_ids); +diff -urN linux-2.6.27.19-5.1/arch/x86/kernel/setup-xen.c linux-2.6.27.23-0.1.1/arch/x86/kernel/setup-xen.c +--- linux-2.6.27.19-5.1/arch/x86/kernel/setup-xen.c 2009-06-16 13:53:34.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/x86/kernel/setup-xen.c 2009-06-16 13:39:58.000000000 +0100 +@@ -914,21 +914,6 @@ + #endif + + /* max_pfn_mapped is updated here */ +-#ifdef CONFIG_X86_64_XEN +- /* +- * Due to the way initial table space gets calculated on Xen, we have +- * to call init_memory_mapping() with the larger end address first. +- */ +- if (max_pfn > max_low_pfn) +- max_pfn_mapped = init_memory_mapping(1UL<<32, +- max_pfn< max_low_pfn) +- /* can we preserve max_low_pfn ?*/ +- max_low_pfn = max_pfn; +- else +- max_pfn_mapped = max_low_pfn_mapped; +-#else + max_low_pfn_mapped = init_memory_mapping(0, max_low_pfn<nr_pages - max_pfn; + + set_xen_guest_handle(reservation.extent_start, +- ((unsigned long *)xen_start_info->mfn_list) + max_pfn); ++ phys_to_machine_mapping + max_pfn); + reservation.nr_extents = difference; + ret = HYPERVISOR_memory_op(XENMEM_decrease_reservation, + &reservation); +@@ -1055,14 +1039,86 @@ + phys_to_machine_mapping = alloc_bootmem_pages( + max_pfn * sizeof(unsigned long)); + memcpy(phys_to_machine_mapping, +- (unsigned long *)xen_start_info->mfn_list, ++ __va(__pa(xen_start_info->mfn_list)), + p2m_pages * sizeof(unsigned long)); + memset(phys_to_machine_mapping + p2m_pages, ~0, + (max_pfn - p2m_pages) * sizeof(unsigned long)); +- free_bootmem( +- __pa(xen_start_info->mfn_list), +- PFN_PHYS(PFN_UP(xen_start_info->nr_pages * +- sizeof(unsigned long)))); ++ ++#ifdef CONFIG_X86_64 ++ if (xen_start_info->mfn_list == VMEMMAP_START) { ++ /* ++ * Since it is well isolated we can (and since it is ++ * perhaps large we should) also free the page tables ++ * mapping the initial P->M table. ++ */ ++ unsigned long va = VMEMMAP_START, pa; ++ pgd_t *pgd = pgd_offset_k(va); ++ pud_t *pud_page = pud_offset(pgd, 0); ++ ++ BUILD_BUG_ON(VMEMMAP_START & ~PGDIR_MASK); ++ xen_l4_entry_update(pgd, __pgd(0)); ++ for(;;) { ++ pud_t *pud = pud_page + pud_index(va); ++ ++ if (pud_none(*pud)) ++ va += PUD_SIZE; ++ else if (pud_large(*pud)) { ++ pa = pud_val(*pud) & PHYSICAL_PAGE_MASK; ++ make_pages_writable(__va(pa), ++ PUD_SIZE >> PAGE_SHIFT, ++ XENFEAT_writable_page_tables); ++ free_bootmem(pa, PUD_SIZE); ++ va += PUD_SIZE; ++ } else { ++ pmd_t *pmd = pmd_offset(pud, va); ++ ++ if (pmd_large(*pmd)) { ++ pa = pmd_val(*pmd) & PHYSICAL_PAGE_MASK; ++ make_pages_writable(__va(pa), ++ PMD_SIZE >> PAGE_SHIFT, ++ XENFEAT_writable_page_tables); ++ free_bootmem(pa, PMD_SIZE); ++ } else if (!pmd_none(*pmd)) { ++ pte_t *pte = pte_offset_kernel(pmd, va); ++ ++ for (i = 0; i < PTRS_PER_PTE; ++i) { ++ if (pte_none(pte[i])) ++ break; ++ pa = pte_pfn(pte[i]) << PAGE_SHIFT; ++ make_page_writable(__va(pa), ++ XENFEAT_writable_page_tables); ++ free_bootmem(pa, PAGE_SIZE); ++ } ++ ClearPagePinned(virt_to_page(pte)); ++ make_page_writable(pte, ++ XENFEAT_writable_page_tables); ++ free_bootmem(__pa(pte), PAGE_SIZE); ++ } ++ va += PMD_SIZE; ++ if (pmd_index(va)) ++ continue; ++ ClearPagePinned(virt_to_page(pmd)); ++ make_page_writable(pmd, ++ XENFEAT_writable_page_tables); ++ free_bootmem(__pa((unsigned long)pmd ++ & PAGE_MASK), ++ PAGE_SIZE); ++ } ++ if (!pud_index(va)) ++ break; ++ } ++ ClearPagePinned(virt_to_page(pud_page)); ++ make_page_writable(pud_page, ++ XENFEAT_writable_page_tables); ++ free_bootmem(__pa((unsigned long)pud_page & PAGE_MASK), ++ PAGE_SIZE); ++ } else if (!WARN_ON(xen_start_info->mfn_list ++ < __START_KERNEL_map)) ++#endif ++ free_bootmem(__pa(xen_start_info->mfn_list), ++ PFN_PHYS(PFN_UP(xen_start_info->nr_pages * ++ sizeof(unsigned long)))); ++ + + /* + * Initialise the list of the frames that specify the list of +diff -urN linux-2.6.27.19-5.1/arch/x86/kernel/time_32-xen.c linux-2.6.27.23-0.1.1/arch/x86/kernel/time_32-xen.c +--- linux-2.6.27.19-5.1/arch/x86/kernel/time_32-xen.c 2009-06-16 13:53:34.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/x86/kernel/time_32-xen.c 2009-06-16 13:39:58.000000000 +0100 +@@ -253,8 +253,6 @@ + + set_normalized_timespec(&xtime, xtime_sec, xtime_nsec); + set_normalized_timespec(&wall_to_monotonic, wtm_sec, wtm_nsec); +- +- ntp_clear(); + } + + static void update_wallclock(void) +diff -urN linux-2.6.27.19-5.1/arch/x86/kernel/uv_sysfs.c linux-2.6.27.23-0.1.1/arch/x86/kernel/uv_sysfs.c +--- linux-2.6.27.19-5.1/arch/x86/kernel/uv_sysfs.c 2009-06-16 13:53:34.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/x86/kernel/uv_sysfs.c 2009-06-16 13:39:58.000000000 +0100 +@@ -21,6 +21,7 @@ + + #include + #include ++#include + + struct kobject *sgi_uv_kobj; + +@@ -47,6 +48,9 @@ + { + unsigned long ret; + ++ if (!is_uv_system()) ++ return -ENODEV; ++ + if (!sgi_uv_kobj) + sgi_uv_kobj = kobject_create_and_add("sgi_uv", firmware_kobj); + if (!sgi_uv_kobj) { +diff -urN linux-2.6.27.19-5.1/arch/x86/kernel/vmiclock_32.c linux-2.6.27.23-0.1.1/arch/x86/kernel/vmiclock_32.c +--- linux-2.6.27.19-5.1/arch/x86/kernel/vmiclock_32.c 2009-06-16 13:53:34.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/x86/kernel/vmiclock_32.c 2009-06-16 13:39:58.000000000 +0100 +@@ -280,10 +280,13 @@ + #endif + + /** vmi clocksource */ ++static struct clocksource clocksource_vmi; + + static cycle_t read_real_cycles(void) + { +- return vmi_timer_ops.get_cycle_counter(VMI_CYCLES_REAL); ++ cycle_t ret = (cycle_t)vmi_timer_ops.get_cycle_counter(VMI_CYCLES_REAL); ++ return ret >= clocksource_vmi.cycle_last ? ++ ret : clocksource_vmi.cycle_last; + } + + static struct clocksource clocksource_vmi = { +diff -urN linux-2.6.27.19-5.1/arch/x86/kvm/vmx.c linux-2.6.27.23-0.1.1/arch/x86/kvm/vmx.c +--- linux-2.6.27.19-5.1/arch/x86/kvm/vmx.c 2009-06-16 13:53:34.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/x86/kvm/vmx.c 2009-06-16 13:39:58.000000000 +0100 +@@ -898,11 +898,11 @@ + int ret = 0; + + switch (msr_index) { +-#ifdef CONFIG_X86_64 + case MSR_EFER: + vmx_load_host_state(vmx); + ret = kvm_set_msr_common(vcpu, msr_index, data); + break; ++#ifdef CONFIG_X86_64 + case MSR_FS_BASE: + vmcs_writel(GUEST_FS_BASE, data); + break; +diff -urN linux-2.6.27.19-5.1/arch/x86/mm/fault-xen.c linux-2.6.27.23-0.1.1/arch/x86/mm/fault-xen.c +--- linux-2.6.27.19-5.1/arch/x86/mm/fault-xen.c 2009-06-16 13:53:34.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/x86/mm/fault-xen.c 2009-06-16 13:39:58.000000000 +0100 +@@ -631,8 +631,6 @@ + + si_code = SEGV_MAPERR; + +- if (notify_page_fault(regs)) +- return; + if (unlikely(kmmio_fault(regs, address))) + return; + +@@ -659,7 +657,6 @@ + if (address >= hypervisor_virt_start) + goto bad_area_nosemaphore; + #elif defined(CONFIG_X86_64_XEN) +- /* Faults in hypervisor area are never spurious. */ + if (address >= HYPERVISOR_VIRT_START + && address < HYPERVISOR_VIRT_END) + goto bad_area_nosemaphore; +@@ -672,6 +669,9 @@ + if (spurious_fault(address, error_code)) + return; + ++ /* kprobes don't want to hook the spurious faults. */ ++ if (notify_page_fault(regs)) ++ return; + /* + * Don't take the mm semaphore here. If we fixup a prefetch + * fault we could otherwise deadlock. +@@ -679,6 +679,9 @@ + goto bad_area_nosemaphore; + } + ++ /* kprobes don't want to hook the spurious faults. */ ++ if (notify_page_fault(regs)) ++ return; + + #ifdef CONFIG_X86_32 + /* It's safe to allow irq's after cr2 has been saved and the vmalloc +diff -urN linux-2.6.27.19-5.1/arch/x86/mm/hypervisor.c linux-2.6.27.23-0.1.1/arch/x86/mm/hypervisor.c +--- linux-2.6.27.19-5.1/arch/x86/mm/hypervisor.c 2009-06-16 13:53:34.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/x86/mm/hypervisor.c 2009-06-16 13:39:58.000000000 +0100 +@@ -80,12 +80,12 @@ + BUG(); + } + +-int xen_multicall_flush(bool ret_last) { ++static int _xen_multicall_flush(bool ret_last) { + struct lazy_mmu *lazy = &__get_cpu_var(lazy_mmu); + multicall_entry_t *mc = lazy->mc; + unsigned int count = lazy->nr_mc; + +- if (!count || !use_lazy_mmu_mode()) ++ if (!count) + return 0; + + lazy->nr_mc = 0; +@@ -113,6 +113,12 @@ + + return 0; + } ++ ++int xen_multicall_flush(bool force) { ++ if (force || use_lazy_mmu_mode()) ++ _xen_multicall_flush(false); ++ return 0; ++} + EXPORT_SYMBOL(xen_multicall_flush); + + int xen_multi_update_va_mapping(unsigned long va, pte_t pte, +@@ -131,7 +137,7 @@ + #endif + + if (unlikely(lazy->nr_mc == NR_MC)) +- xen_multicall_flush(false); ++ _xen_multicall_flush(false); + + mc = lazy->mc + lazy->nr_mc++; + mc->op = __HYPERVISOR_update_va_mapping; +@@ -170,7 +176,7 @@ + merge = lazy->nr_mc && !commit + && mmu_may_merge(mc - 1, __HYPERVISOR_mmu_update, domid); + if (unlikely(lazy->nr_mc == NR_MC) && !merge) { +- xen_multicall_flush(false); ++ _xen_multicall_flush(false); + mc = lazy->mc; + commit = count > NR_MMU || success_count; + } +@@ -208,7 +214,7 @@ + break; + } + +- return commit ? xen_multicall_flush(true) : 0; ++ return commit ? _xen_multicall_flush(true) : 0; + } + + int xen_multi_mmuext_op(struct mmuext_op *src, unsigned int count, +@@ -292,7 +298,7 @@ + merge = lazy->nr_mc && !commit + && mmu_may_merge(mc - 1, __HYPERVISOR_mmuext_op, domid); + if (unlikely(lazy->nr_mc == NR_MC) && !merge) { +- xen_multicall_flush(false); ++ _xen_multicall_flush(false); + mc = lazy->mc; + commit = count > NR_MMUEXT || success_count; + } +@@ -339,7 +345,7 @@ + break; + } + +- return commit ? xen_multicall_flush(true) : 0; ++ return commit ? _xen_multicall_flush(true) : 0; + } + + void xen_l1_entry_update(pte_t *ptr, pte_t val) +@@ -587,6 +593,9 @@ + unsigned long frame, flags; + unsigned int i; + int rc, success; ++#ifdef CONFIG_64BIT ++ pte_t *ptep = NULL; ++#endif + struct xen_memory_exchange exchange = { + .in = { + .nr_extents = 1UL << order, +@@ -612,6 +621,27 @@ + if (unlikely(order > MAX_CONTIG_ORDER)) + return -ENOMEM; + ++#ifdef CONFIG_64BIT ++ if (unlikely(vstart > PAGE_OFFSET + MAXMEM)) { ++ unsigned int level; ++ ++ if (vstart < __START_KERNEL_map ++ || vstart + (PAGE_SIZE << order) > (unsigned long)_end) ++ return -EINVAL; ++ ptep = lookup_address((unsigned long)__va(__pa(vstart)), ++ &level); ++ if (ptep && pte_none(*ptep)) ++ ptep = NULL; ++ if (vstart < __START_KERNEL && ptep) ++ return -EINVAL; ++ if (order > MAX_CONTIG_ORDER - 1) ++ return -ENOMEM; ++ } ++#else ++ if (unlikely(vstart + (PAGE_SIZE << order) > (unsigned long)high_memory)) ++ return -EINVAL; ++#endif ++ + set_xen_guest_handle(exchange.in.extent_start, in_frames); + set_xen_guest_handle(exchange.out.extent_start, &out_frame); + +@@ -624,9 +654,19 @@ + in_frames[i] = pfn_to_mfn((__pa(vstart) >> PAGE_SHIFT) + i); + MULTI_update_va_mapping(cr_mcl + i, vstart + (i*PAGE_SIZE), + __pte_ma(0), 0); ++#ifdef CONFIG_64BIT ++ if (ptep) ++ MULTI_update_va_mapping(cr_mcl + i + (1U << order), ++ (unsigned long)__va(__pa(vstart)) + (i*PAGE_SIZE), ++ __pte_ma(0), 0); ++#endif + set_phys_to_machine((__pa(vstart)>>PAGE_SHIFT)+i, + INVALID_P2M_ENTRY); + } ++#ifdef CONFIG_64BIT ++ if (ptep) ++ i += i; ++#endif + if (HYPERVISOR_multicall_check(cr_mcl, i, NULL)) + BUG(); + +@@ -660,9 +700,18 @@ + frame = success ? (out_frame + i) : in_frames[i]; + MULTI_update_va_mapping(cr_mcl + i, vstart + (i*PAGE_SIZE), + pfn_pte_ma(frame, PAGE_KERNEL), 0); ++#ifdef CONFIG_64BIT ++ if (ptep) ++ MULTI_update_va_mapping(cr_mcl + i + (1U << order), ++ (unsigned long)__va(__pa(vstart)) + (i*PAGE_SIZE), ++ pfn_pte_ma(frame, PAGE_KERNEL_RO), 0); ++#endif + set_phys_to_machine((__pa(vstart)>>PAGE_SHIFT)+i, frame); + } +- ++#ifdef CONFIG_64BIT ++ if (ptep) ++ i += i; ++#endif + cr_mcl[i - 1].args[MULTI_UVMFLAGS_INDEX] = order + ? UVMF_TLB_FLUSH|UVMF_ALL + : UVMF_INVLPG|UVMF_ALL; +@@ -834,6 +883,72 @@ + } + EXPORT_SYMBOL_GPL(xen_destroy_contiguous_region); + ++int __init early_create_contiguous_region(unsigned long pfn, ++ unsigned int order, ++ unsigned int address_bits) ++{ ++ unsigned long *in_frames = discontig_frames, out_frame = pfn; ++ unsigned int i; ++ int rc, success; ++ struct xen_memory_exchange exchange = { ++ .in = { ++ .nr_extents = 1UL << order, ++ .extent_order = 0, ++ .domid = DOMID_SELF ++ }, ++ .out = { ++ .nr_extents = 1, ++ .extent_order = order, ++ .address_bits = address_bits, ++ .domid = DOMID_SELF ++ } ++ }; ++ ++ if (xen_feature(XENFEAT_auto_translated_physmap)) ++ return 0; ++ ++ if (unlikely(order > MAX_CONTIG_ORDER)) ++ return -ENOMEM; ++ ++ for (i = 0; i < (1U << order); ++i) { ++ in_frames[i] = pfn_to_mfn(pfn + i); ++ set_phys_to_machine(pfn + i, INVALID_P2M_ENTRY); ++ } ++ ++ set_xen_guest_handle(exchange.in.extent_start, in_frames); ++ set_xen_guest_handle(exchange.out.extent_start, &out_frame); ++ ++ rc = HYPERVISOR_memory_op(XENMEM_exchange, &exchange); ++ success = (exchange.nr_exchanged == (1UL << order)); ++ BUG_ON(!success && (exchange.nr_exchanged || !rc)); ++ BUG_ON(success && rc); ++#if CONFIG_XEN_COMPAT <= 0x030002 ++ if (unlikely(rc == -ENOSYS)) { ++ /* Compatibility when XENMEM_exchange is unavailable. */ ++ if (HYPERVISOR_memory_op(XENMEM_decrease_reservation, ++ &exchange.in) != (1UL << order)) ++ BUG(); ++ success = (HYPERVISOR_memory_op(XENMEM_populate_physmap, ++ &exchange.out) == 1); ++ if (!success) { ++ for (i = 0; i < (1U << order); ++i) ++ in_frames[i] = pfn + i; ++ if (HYPERVISOR_memory_op(XENMEM_populate_physmap, ++ &exchange.in) != (1UL << order)) ++ BUG(); ++ } ++ } ++#endif ++ ++ for (i = 0; i < (1U << order); ++i, ++out_frame) { ++ if (!success) ++ out_frame = in_frames[i]; ++ set_phys_to_machine(pfn + i, out_frame); ++ } ++ ++ return success ? 0 : -ENOMEM; ++} ++ + static void undo_limit_pages(struct page *pages, unsigned int order) + { + BUG_ON(xen_feature(XENFEAT_auto_translated_physmap)); +diff -urN linux-2.6.27.19-5.1/arch/x86/mm/init_32-xen.c linux-2.6.27.23-0.1.1/arch/x86/mm/init_32-xen.c +--- linux-2.6.27.19-5.1/arch/x86/mm/init_32-xen.c 2009-06-16 13:53:34.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/x86/mm/init_32-xen.c 2009-06-16 13:39:58.000000000 +0100 +@@ -743,8 +743,8 @@ + */ + bootmap_size = bootmem_bootmap_pages(end_pfn)<nr_pages)<pt_base) >> PAGE_SHIFT) + + xen_start_info->nr_pt_frames; +- unsigned long start = start_pfn, va; ++ unsigned long start = start_pfn, va = (unsigned long)&_text; + pgd_t *pgd; + pud_t *pud; + pmd_t *pmd; + pte_t *pte; + +- /* Kill mapping of low 1MB. */ +- for (va = PAGE_OFFSET; va < (unsigned long)&_text; va += PAGE_SIZE) +- if (HYPERVISOR_update_va_mapping(va, __pte_ma(0), 0)) +- BUG(); +- + /* Ensure init mappings cover kernel text/data and initial tables. */ + while (va < PAGE_OFFSET + (start_pfn << PAGE_SHIFT) + tables_space) { + pgd = pgd_offset_k(va); +diff -urN linux-2.6.27.19-5.1/arch/x86/mm/init_64-xen.c linux-2.6.27.23-0.1.1/arch/x86/mm/init_64-xen.c +--- linux-2.6.27.19-5.1/arch/x86/mm/init_64-xen.c 2009-06-16 13:53:34.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/x86/mm/init_64-xen.c 2009-06-16 13:39:58.000000000 +0100 +@@ -157,6 +157,17 @@ + static unsigned long __meminitdata table_cur; + static unsigned long __meminitdata table_top; + ++static __init unsigned long get_table_cur(void) ++{ ++ BUG_ON(!table_cur); ++ if (xen_start_info->mfn_list < __START_KERNEL_map ++ && table_cur == xen_start_info->first_p2m_pfn) { ++ table_cur += xen_start_info->nr_p2m_frames; ++ table_top += xen_start_info->nr_p2m_frames; ++ } ++ return table_cur++; ++} ++ + /* + * NOTE: This function is marked __ref because it calls __init function + * (alloc_bootmem_pages). It's safe to do it ONLY when after_bootmem == 0. +@@ -168,8 +179,7 @@ + if (after_bootmem) + ptr = (void *) get_zeroed_page(GFP_ATOMIC); + else if (table_cur < table_top) { +- ptr = __va(table_cur << PAGE_SHIFT); +- table_cur++; ++ ptr = __va(get_table_cur() << PAGE_SHIFT); + memset(ptr, 0, PAGE_SIZE); + } else + ptr = alloc_bootmem_pages(PAGE_SIZE); +@@ -322,39 +332,67 @@ + } + #endif + +-static __meminit void *alloc_static_page(unsigned long *phys) ++static __ref void *alloc_low_page(unsigned long *phys) + { +- unsigned long va = (table_cur << PAGE_SHIFT) + __START_KERNEL_map; ++ unsigned long pfn; ++ void *adr; + + if (after_bootmem) { +- void *adr = (void *)get_zeroed_page(GFP_ATOMIC); ++ adr = (void *)get_zeroed_page(GFP_ATOMIC); + *phys = __pa(adr); + + return adr; + } + +- BUG_ON(!table_cur); +- *phys = table_cur++ << PAGE_SHIFT; +- return memset((void *)va, 0, PAGE_SIZE); ++ pfn = get_table_cur(); ++ if (pfn >= table_top) ++ panic("alloc_low_page: ran out of memory"); ++ ++ adr = early_ioremap(pfn_to_mfn(pfn) * PAGE_SIZE, PAGE_SIZE); ++ memset(adr, 0, PAGE_SIZE); ++ *phys = pfn * PAGE_SIZE; ++ return adr; + } + +-#define unmap_low_page(p) ((void)(p)) ++static __ref void unmap_low_page(void *adr) ++{ ++ if (after_bootmem) ++ return; ++ ++ early_iounmap(adr, PAGE_SIZE); ++} + + static inline int __meminit make_readonly(unsigned long paddr) + { + extern char __vsyscall_0; + int readonly = 0; + +- /* Make new page tables read-only. */ ++ /* Make new page tables read-only on the first pass. */ + if (!xen_feature(XENFEAT_writable_page_tables) +- && (paddr >= (table_start << PAGE_SHIFT)) +- && (paddr < (table_top << PAGE_SHIFT))) +- readonly = 1; ++ && !max_pfn_mapped ++ && (paddr >= (table_start << PAGE_SHIFT))) { ++ unsigned long top = table_top; ++ ++ /* Account for the range get_table_cur() skips. */ ++ if (xen_start_info->mfn_list < __START_KERNEL_map ++ && table_cur <= xen_start_info->first_p2m_pfn ++ && top > xen_start_info->first_p2m_pfn) ++ top += xen_start_info->nr_p2m_frames; ++ if (paddr < (top << PAGE_SHIFT)) ++ readonly = 1; ++ } + /* Make old page tables read-only. */ + if (!xen_feature(XENFEAT_writable_page_tables) + && (paddr >= (xen_start_info->pt_base - __START_KERNEL_map)) + && (paddr < (table_cur << PAGE_SHIFT))) + readonly = 1; ++ /* Make P->M table (and its page tables) read-only. */ ++ if (!xen_feature(XENFEAT_writable_page_tables) ++ && xen_start_info->mfn_list < __START_KERNEL_map ++ && paddr >= (xen_start_info->first_p2m_pfn << PAGE_SHIFT) ++ && paddr < (xen_start_info->first_p2m_pfn ++ + xen_start_info->nr_p2m_frames) << PAGE_SHIFT) ++ readonly = 1; + + /* + * No need for writable mapping of kernel image. This also ensures that +@@ -412,7 +450,7 @@ + { + pte_t *pte = (pte_t *)pmd_page_vaddr(*pmd); + +- BUG_ON(!after_bootmem); ++ BUG_ON(!max_pfn_mapped); + return phys_pte_init(pte, address, end); + } + +@@ -457,12 +495,14 @@ + continue; + } + +- pte = alloc_static_page(&pte_phys); ++ pte = alloc_low_page(&pte_phys); + last_map_addr = phys_pte_init(pte, address, end); + unmap_low_page(pte); + + if (!after_bootmem) { +- early_make_page_readonly(pte, XENFEAT_writable_page_tables); ++ if (max_pfn_mapped) ++ make_page_readonly(__va(pte_phys), ++ XENFEAT_writable_page_tables); + *pmd = __pmd(pte_phys | _PAGE_TABLE); + } else { + spin_lock(&init_mm.page_table_lock); +@@ -481,7 +521,7 @@ + pmd_t *pmd = pmd_offset(pud, 0); + unsigned long last_map_addr; + +- BUG_ON(!after_bootmem); ++ BUG_ON(!max_pfn_mapped); + last_map_addr = phys_pmd_init(pmd, address, end, page_size_mask); + __flush_tlb_all(); + return last_map_addr; +@@ -520,12 +560,14 @@ + continue; + } + +- pmd = alloc_static_page(&pmd_phys); ++ pmd = alloc_low_page(&pmd_phys); + last_map_addr = phys_pmd_init(pmd, addr, end, page_size_mask); + unmap_low_page(pmd); + + if (!after_bootmem) { +- early_make_page_readonly(pmd, XENFEAT_writable_page_tables); ++ if (max_pfn_mapped) ++ make_page_readonly(__va(pmd_phys), ++ XENFEAT_writable_page_tables); + if (page_size_mask & (1 << PG_LEVEL_NUM)) + xen_l3_entry_update(pud, __pud(pmd_phys | _PAGE_TABLE)); + else +@@ -548,13 +590,7 @@ + { + pud_t *pud; + +- if (!after_bootmem) { +- unsigned long addr = __pgd_val(*pgd), *page; +- +- addr_to_page(addr, page); +- pud = (pud_t *)page; +- } else +- pud = (pud_t *)pgd_page_vaddr(*pgd); ++ pud = (pud_t *)pgd_page_vaddr(*pgd); + + return phys_pud_init(pud, addr, end, page_size_mask | (1 << PG_LEVEL_NUM)); + } +@@ -604,6 +640,12 @@ + __pud(__pa_symbol(level2_kernel_pgt) | _PAGE_TABLE); + memcpy(level2_kernel_pgt, page, PAGE_SIZE); + ++ /* Copy the initial P->M table mappings if necessary. */ ++ addr = pgd_index(xen_start_info->mfn_list); ++ if (addr < pgd_index(__START_KERNEL_map)) ++ init_level4_pgt[addr] = ++ ((pgd_t *)xen_start_info->pt_base)[addr]; ++ + /* Do an early initialization of the fixmap area. */ + addr = __fix_to_virt(FIX_EARLYCON_MEM_BASE); + level3_kernel_pgt[pud_index(addr)] = +@@ -628,73 +670,6 @@ + xen_pgd_pin(init_level4_pgt); + } + +-static void __init extend_init_mapping(unsigned long tables_space) +-{ +- unsigned long va = __START_KERNEL_map; +- unsigned long start = table_cur; +- unsigned long phys, addr, *pte_page; +- pmd_t *pmd; +- pte_t *pte, new_pte; +- unsigned long *page = (unsigned long *)init_level4_pgt; +- +- addr = page[pgd_index(va)]; +- addr_to_page(addr, page); +- addr = page[pud_index(va)]; +- addr_to_page(addr, page); +- +- /* Kill mapping of low 1MB. */ +- while (va < (unsigned long)&_text) { +- if (HYPERVISOR_update_va_mapping(va, __pte_ma(0), 0)) +- BUG(); +- va += PAGE_SIZE; +- } +- +- /* Ensure init mappings cover kernel text/data and initial tables. */ +- while (va < (__START_KERNEL_map +- + (table_cur << PAGE_SHIFT) +- + tables_space)) { +- if (!pmd_index(va) && !pte_index(va)) { +- page = (unsigned long *)init_level4_pgt; +- addr = page[pgd_index(va)]; +- addr_to_page(addr, page); +- addr = page[pud_index(va)]; +- addr_to_page(addr, page); +- } +- pmd = (pmd_t *)&page[pmd_index(va)]; +- if (pmd_none(*pmd)) { +- pte_page = alloc_static_page(&phys); +- early_make_page_readonly( +- pte_page, XENFEAT_writable_page_tables); +- set_pmd(pmd, __pmd(phys | _KERNPG_TABLE)); +- } else { +- addr = page[pmd_index(va)]; +- addr_to_page(addr, pte_page); +- } +- pte = (pte_t *)&pte_page[pte_index(va)]; +- if (pte_none(*pte)) { +- new_pte = pfn_pte( +- (va - __START_KERNEL_map) >> PAGE_SHIFT, +- __pgprot(_KERNPG_TABLE)); +- xen_l1_entry_update(pte, new_pte); +- } +- va += PAGE_SIZE; +- } +- +- /* Finally, blow away any spurious initial mappings. */ +- while (1) { +- pmd = (pmd_t *)&page[pmd_index(va)]; +- if (pmd_none(*pmd)) +- break; +- if (HYPERVISOR_update_va_mapping(va, __pte_ma(0), 0)) +- BUG(); +- va += PAGE_SIZE; +- } +- +- if (table_cur > start) +- reserve_early(start << PAGE_SHIFT, +- table_cur << PAGE_SHIFT, "INITMAP"); +-} +- + static void __init find_early_table_space(unsigned long end, int use_pse, + int use_gbpages) + { +@@ -708,49 +683,62 @@ + ptes = (end + PAGE_SIZE - 1) >> PAGE_SHIFT; + tables += round_up(ptes * sizeof(pte_t), PAGE_SIZE); + +- table_cur = (__pa(xen_start_info->pt_base) >> PAGE_SHIFT) + +- xen_start_info->nr_pt_frames; +- +- extend_init_mapping(tables); ++ if (!table_top) { ++ table_start = (__pa(xen_start_info->pt_base) >> PAGE_SHIFT) + ++ xen_start_info->nr_pt_frames; ++ table_cur = table_start; ++ } else { ++ /* ++ * [table_start, table_top) gets passed to reserve_early(), ++ * so we must not use table_cur here, despite continuing ++ * to allocate from there. table_cur possibly being below ++ * table_start is otoh not a problem. ++ */ ++ table_start = table_top; ++ } + +- table_start = table_cur; +- table_top = table_start + (tables >> PAGE_SHIFT); ++ table_top = table_cur + (tables >> PAGE_SHIFT); + + printk(KERN_DEBUG "kernel direct mapping tables up to %lx @ %lx-%lx\n", +- end, table_start << PAGE_SHIFT, table_top << PAGE_SHIFT); ++ end, table_cur << PAGE_SHIFT, table_top << PAGE_SHIFT); + } + +-static void __init xen_finish_init_mapping(bool reserve) ++static void __init xen_finish_init_mapping(void) + { + unsigned long i, start, end; ++ struct mmuext_op mmuext; + + /* Re-vector virtual addresses pointing into the initial + mapping to the just-established permanent ones. */ + xen_start_info = __va(__pa(xen_start_info)); + xen_start_info->pt_base = (unsigned long) + __va(__pa(xen_start_info->pt_base)); +- if (!xen_feature(XENFEAT_auto_translated_physmap)) { ++ if (!xen_feature(XENFEAT_auto_translated_physmap) ++ && xen_start_info->mfn_list >= __START_KERNEL_map) + phys_to_machine_mapping = + __va(__pa(xen_start_info->mfn_list)); +- xen_start_info->mfn_list = (unsigned long) +- phys_to_machine_mapping; +- } + if (xen_start_info->mod_start) + xen_start_info->mod_start = (unsigned long) + __va(__pa(xen_start_info->mod_start)); + +- /* Destroy the Xen-created mappings beyond the kernel image as +- * well as the temporary mappings created above. Prevents +- * overlap with modules area (if init mapping is very big). +- */ ++ /* Unpin the no longer used Xen provided page tables. */ ++ mmuext.cmd = MMUEXT_UNPIN_TABLE; ++ mmuext.arg1.mfn = pfn_to_mfn(__pa(xen_start_info->pt_base) ++ >> PAGE_SHIFT); ++ if (HYPERVISOR_mmuext_op(&mmuext, 1, NULL, DOMID_SELF)) ++ BUG(); ++ ++ /* Destroy the Xen-created mappings beyond the kernel image. */ + start = PAGE_ALIGN((unsigned long)_end); +- end = __START_KERNEL_map + (table_top << PAGE_SHIFT); ++ end = __START_KERNEL_map + (table_start << PAGE_SHIFT); + for (; start < end; start += PAGE_SIZE) + if (HYPERVISOR_update_va_mapping(start, __pte_ma(0), 0)) + BUG(); + + /* Allocate pte's for initial fixmaps from 'table_cur' allocator. */ +- start = table_cur; ++ start = table_top; ++ WARN(table_cur != start, "start=%lx cur=%lx top=%lx\n", ++ table_start, table_cur, start); + table_top = ~0UL; + + /* Switch to the real shared_info page, and clear the dummy page. */ +@@ -768,11 +756,7 @@ + << PAGE_SHIFT, + PAGE_KERNEL_RO); + +- /* Disable the 'table_cur' allocator. */ +- table_top = table_cur; +- if (reserve && table_cur > start) +- reserve_early(start << PAGE_SHIFT, +- table_cur << PAGE_SHIFT, "FIXMAP"); ++ table_top = max(table_cur, start); + } + + static void __init init_gbpages(void) +@@ -810,13 +794,15 @@ + continue; + } + +- pud = alloc_static_page(&pud_phys); ++ pud = alloc_low_page(&pud_phys); + last_map_addr = phys_pud_init(pud, __pa(start), __pa(next), + page_size_mask); + unmap_low_page(pud); + + if(!after_bootmem) { +- early_make_page_readonly(pud, XENFEAT_writable_page_tables); ++ if (max_pfn_mapped) ++ make_page_readonly(__va(pud_phys), ++ XENFEAT_writable_page_tables); + xen_l4_entry_update(pgd, __pgd(pud_phys | _PAGE_TABLE)); + } else { + spin_lock(&init_mm.page_table_lock); +@@ -864,7 +850,7 @@ + unsigned long last_map_addr = 0; + unsigned long page_size_mask = 0; + unsigned long start_pfn, end_pfn; +- bool first = !table_start; ++ + struct map_range mr[NR_RANGE_MR]; + int nr_range, i; + int use_pse, use_gbpages; +@@ -955,25 +941,63 @@ + (mr[i].page_size_mask & (1< table_top); +- if (start < (table_start << PAGE_SHIFT)) { +- WARN_ON(table_cur != table_top); +- xen_finish_init_mapping(!first); +- } ++ if (!start) ++ xen_finish_init_mapping(); ++ else if (table_cur < table_top) ++ /* Disable the 'table_cur' allocator. */ ++ table_top = table_cur; + + __flush_tlb_all(); + +- if (first && table_top > table_start) ++ if (!after_bootmem && table_top > table_start) { ++ if (xen_start_info->mfn_list < __START_KERNEL_map ++ && table_start <= xen_start_info->first_p2m_pfn ++ && table_top > xen_start_info->first_p2m_pfn) { ++ reserve_early(table_start << PAGE_SHIFT, ++ xen_start_info->first_p2m_pfn ++ << PAGE_SHIFT, ++ "PGTABLE"); ++ table_start = xen_start_info->first_p2m_pfn ++ + xen_start_info->nr_p2m_frames; ++ } + reserve_early(table_start << PAGE_SHIFT, + table_top << PAGE_SHIFT, "PGTABLE"); ++ } + + printk(KERN_INFO "last_map_addr: %lx end: %lx\n", + last_map_addr, end); +diff -urN linux-2.6.27.19-5.1/arch/x86/mm/ioremap-xen.c linux-2.6.27.23-0.1.1/arch/x86/mm/ioremap-xen.c +--- linux-2.6.27.19-5.1/arch/x86/mm/ioremap-xen.c 2009-06-16 13:53:34.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/x86/mm/ioremap-xen.c 2009-06-16 13:39:58.000000000 +0100 +@@ -103,8 +103,8 @@ + * Fill in the machine address: PTE ptr is done later by + * apply_to_page_range(). + */ +- v->val = __pte_val(pte_mkspecial(pfn_pte_ma(mfn, prot))) +- | _PAGE_IO; ++ pgprot_val(prot) |= _PAGE_IO; ++ v->val = __pte_val(pte_mkspecial(pfn_pte_ma(mfn, prot))); + + mfn++; + address += PAGE_SIZE; +diff -urN linux-2.6.27.19-5.1/arch/x86/mm/numa_64.c linux-2.6.27.23-0.1.1/arch/x86/mm/numa_64.c +--- linux-2.6.27.19-5.1/arch/x86/mm/numa_64.c 2009-06-16 13:53:34.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/x86/mm/numa_64.c 2009-06-16 13:39:58.000000000 +0100 +@@ -145,7 +145,7 @@ + return shift; + } + +-int early_pfn_to_nid(unsigned long pfn) ++int __meminit __early_pfn_to_nid(unsigned long pfn) + { + return phys_to_nid(pfn << PAGE_SHIFT); + } +diff -urN linux-2.6.27.19-5.1/arch/x86/mm/pageattr.c linux-2.6.27.23-0.1.1/arch/x86/mm/pageattr.c +--- linux-2.6.27.19-5.1/arch/x86/mm/pageattr.c 2009-06-16 13:53:34.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/x86/mm/pageattr.c 2009-06-16 13:39:58.000000000 +0100 +@@ -557,18 +557,13 @@ + #endif + + /* +- * Install the new, split up pagetable. Important details here: ++ * Install the new, split up pagetable. + * +- * On Intel the NX bit of all levels must be cleared to make a +- * page executable. See section 4.13.2 of Intel 64 and IA-32 +- * Architectures Software Developer's Manual). +- * +- * Mark the entry present. The current mapping might be +- * set to not present, which we preserved above. ++ * We use the standard kernel pagetable protections for the new ++ * pagetable protections, the actual ptes set above control the ++ * primary protection behavior: + */ +- ref_prot = pte_pgprot(pte_mkexec(pte_clrhuge(*kpte))); +- pgprot_val(ref_prot) |= _PAGE_PRESENT; +- __set_pmd_pte(kpte, address, mk_pte(base, ref_prot)); ++ __set_pmd_pte(kpte, address, mk_pte(base, __pgprot(_KERNPG_TABLE))); + base = NULL; + + out_unlock: +diff -urN linux-2.6.27.19-5.1/arch/x86/mm/pageattr-xen.c linux-2.6.27.23-0.1.1/arch/x86/mm/pageattr-xen.c +--- linux-2.6.27.19-5.1/arch/x86/mm/pageattr-xen.c 2009-06-16 13:53:34.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/x86/mm/pageattr-xen.c 2009-06-16 13:39:58.000000000 +0100 +@@ -573,21 +573,17 @@ + set_pte(&pbase[i], pfn_pte_ma(mfn, ref_prot)); + + /* +- * Install the new, split up pagetable. Important details here: ++ * Install the new, split up pagetable. + * +- * On Intel the NX bit of all levels must be cleared to make a +- * page executable. See section 4.13.2 of Intel 64 and IA-32 +- * Architectures Software Developer's Manual). +- * +- * Mark the entry present. The current mapping might be +- * set to not present, which we preserved above. ++ * We use the standard kernel pagetable protections for the new ++ * pagetable protections, the actual ptes set above control the ++ * primary protection behavior: + */ +- if (HYPERVISOR_update_va_mapping((unsigned long)pbase, ++ if (!xen_feature(XENFEAT_writable_page_tables) && ++ HYPERVISOR_update_va_mapping((unsigned long)pbase, + mk_pte(base, PAGE_KERNEL_RO), 0)) + BUG(); +- ref_prot = pte_pgprot(pte_mkexec(pte_clrhuge(*kpte))); +- pgprot_val(ref_prot) |= _PAGE_PRESENT; +- __set_pmd_pte(kpte, address, level, mk_pte(base, ref_prot)); ++ __set_pmd_pte(kpte, address, level, mk_pte(base, __pgprot(_KERNPG_TABLE))); + base = NULL; + + out_unlock: +@@ -642,6 +638,15 @@ + unsigned int level; + pte_t *kpte, old_pte; + ++ /* ++ * If we're called with lazy mmu updates enabled, the ++ * in-memory pte state may be stale. Flush pending updates to ++ * bring them up to date. ++ * ++ arch_flush_lazy_mmu_mode();*/ ++ if (arch_use_lazy_mmu_mode()) ++ xen_multicall_flush(true); ++ + repeat: + kpte = lookup_address(address, &level); + if (!kpte) +@@ -860,6 +865,14 @@ + else + cpa_flush_all(cache); + ++ /* ++ * If we've been called with lazy mmu updates enabled, then ++ * make sure that everything gets flushed out before we ++ * return. ++ * ++ arch_flush_lazy_mmu_mode();*/ ++ WARN_ON_ONCE(arch_use_lazy_mmu_mode() && !irq_count()); ++ + out: + cpa_fill_pool(NULL); + +@@ -878,6 +891,51 @@ + return change_page_attr_set_clr(addr, numpages, __pgprot(0), mask, 0); + } + ++#ifdef CONFIG_XEN ++static void _free_memtype(u64 pstart, u64 pend) ++{ ++ u64 pa = pstart &= __PHYSICAL_MASK; ++ u64 ma = phys_to_machine(pa); ++ ++ while ((pa += PAGE_SIZE) < pend) { ++ if (phys_to_machine(pa) != ma + (pa - pstart)) { ++ free_memtype(ma, ma + (pa - pstart)); ++ pstart = pa; ++ ma = phys_to_machine(pa); ++ } ++ } ++ free_memtype(ma, ma + (pend - pstart)); ++} ++#define free_memtype _free_memtype ++ ++static int _reserve_memtype(u64 pstart, u64 pend, unsigned long req_type) ++{ ++ u64 pcur = pstart &= __PHYSICAL_MASK, pa = pcur; ++ u64 ma = phys_to_machine(pa); ++ int rc = 0; ++ ++ while ((pa += PAGE_SIZE) < pend) { ++ if (phys_to_machine(pa) != ma + (pa - pcur)) { ++ rc = reserve_memtype(ma, ma + (pa - pcur), ++ req_type, NULL); ++ if (rc) ++ break; ++ pcur = pa; ++ ma = phys_to_machine(pa); ++ } ++ } ++ if (likely(!rc)) ++ rc = reserve_memtype(ma, ma + (pend - pcur), req_type, NULL); ++ ++ if (unlikely(!rc) && pstart < pcur) ++ _free_memtype(pstart, pcur); ++ ++ return rc; ++} ++#define reserve_memtype(s, e, r, n) \ ++ _reserve_memtype(s, e, BUILD_BUG_ON_ZERO(n) ?: (r)) ++#endif ++ + int _set_memory_uc(unsigned long addr, int numpages) + { + /* +@@ -1193,7 +1251,7 @@ + + pte = lookup_address(va, &level); + BUG_ON(!pte || level != PG_LEVEL_4K); +- if (HYPERVISOR_update_va_mapping(va, pte_mkwrite(*pte), 0)) ++ if (HYPERVISOR_update_va_mapping(va, pte_mkwrite(*pte), UVMF_INVLPG)) + BUG(); + if (in_secondary_range(va)) { + unsigned long pfn = pte_pfn(*pte); +diff -urN linux-2.6.27.19-5.1/arch/x86/mm/pgtable_32-xen.c linux-2.6.27.23-0.1.1/arch/x86/mm/pgtable_32-xen.c +--- linux-2.6.27.19-5.1/arch/x86/mm/pgtable_32-xen.c 2009-06-16 13:53:34.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/x86/mm/pgtable_32-xen.c 2009-06-16 13:39:58.000000000 +0100 +@@ -188,6 +188,6 @@ + pte = lookup_address((unsigned long)va, &level); + BUG_ON(!pte || level != PG_LEVEL_4K || !pte_present(*pte)); + rc = HYPERVISOR_update_va_mapping( +- (unsigned long)va, pte_mkwrite(*pte), 0); ++ (unsigned long)va, pte_mkwrite(*pte), UVMF_INVLPG); + BUG_ON(rc); + } +diff -urN linux-2.6.27.19-5.1/arch/x86/mm/pgtable-xen.c linux-2.6.27.23-0.1.1/arch/x86/mm/pgtable-xen.c +--- linux-2.6.27.19-5.1/arch/x86/mm/pgtable-xen.c 2009-06-16 13:53:34.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/x86/mm/pgtable-xen.c 2009-06-16 13:39:58.000000000 +0100 +@@ -323,7 +323,7 @@ + if (PTRS_PER_PUD > 1) /* not folded */ + SetPagePinned(virt_to_page(pud)); + for (u = 0; u < PTRS_PER_PUD; u++, pud++) { +- if (!pud_present(*pud)) ++ if (!pud_present(*pud) || pud_large(*pud)) + continue; + pmd = pmd_offset(pud, 0); + if (PTRS_PER_PMD > 1) /* not folded */ +@@ -334,7 +334,7 @@ + && m >= pmd_index(HYPERVISOR_VIRT_START)) + continue; + #endif +- if (!pmd_present(*pmd)) ++ if (!pmd_present(*pmd) || pmd_large(*pmd)) + continue; + SetPagePinned(pmd_page(*pmd)); + } +@@ -581,8 +581,10 @@ + { + int i; + ++#ifdef CONFIG_X86_PAE + if (contig) + xen_destroy_contiguous_region((unsigned long)mm->pgd, 0); ++#endif + + for(i = 0; i < PREALLOCATED_PMDS; i++) + if (pmds[i]) +@@ -632,8 +634,10 @@ + } + } + ++#ifdef CONFIG_X86_PAE + if (!xen_feature(XENFEAT_pae_pgdir_above_4gb)) + xen_destroy_contiguous_region((unsigned long)pgdp, 0); ++#endif + } + + static void pgd_prepopulate_pmd(struct mm_struct *mm, pgd_t *pgd, pmd_t *pmds[]) +diff -urN linux-2.6.27.19-5.1/arch/x86/mm/srat_64.c linux-2.6.27.23-0.1.1/arch/x86/mm/srat_64.c +--- linux-2.6.27.19-5.1/arch/x86/mm/srat_64.c 2009-06-16 13:53:34.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/x86/mm/srat_64.c 2009-06-16 13:39:58.000000000 +0100 +@@ -131,6 +131,8 @@ + if ((pa->flags & ACPI_SRAT_CPU_ENABLED) == 0) + return; + pxm = pa->proximity_domain_lo; ++ if (acpi_srat_revision >= 2) ++ pxm |= *((unsigned int*)pa->proximity_domain_hi) << 8; + node = setup_node(pxm); + if (node < 0) { + printk(KERN_ERR "SRAT: Too many proximity domains %x\n", pxm); +@@ -241,6 +243,8 @@ + start = ma->base_address; + end = start + ma->length; + pxm = ma->proximity_domain; ++ if (acpi_srat_revision <= 1) ++ pxm &= 0xff; + node = setup_node(pxm); + if (node < 0) { + printk(KERN_ERR "SRAT: Too many proximity domains.\n"); +diff -urN linux-2.6.27.19-5.1/arch/x86/pci/i386.c linux-2.6.27.23-0.1.1/arch/x86/pci/i386.c +--- linux-2.6.27.19-5.1/arch/x86/pci/i386.c 2009-06-16 13:53:34.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/x86/pci/i386.c 2009-06-16 13:39:58.000000000 +0100 +@@ -326,6 +326,9 @@ + return -EINVAL; + } + flags = new_flags; ++ vma->vm_page_prot = __pgprot( ++ (pgprot_val(vma->vm_page_prot) & ~_PAGE_CACHE_MASK) | ++ flags); + } + + #ifndef CONFIG_XEN +diff -urN linux-2.6.27.19-5.1/arch/x86/pci/mmconfig-shared.c linux-2.6.27.23-0.1.1/arch/x86/pci/mmconfig-shared.c +--- linux-2.6.27.19-5.1/arch/x86/pci/mmconfig-shared.c 2009-06-16 13:53:34.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/x86/pci/mmconfig-shared.c 2009-06-16 13:39:58.000000000 +0100 +@@ -255,7 +255,7 @@ + if (!fixmem32) + return AE_OK; + if ((mcfg_res->start >= fixmem32->address) && +- (mcfg_res->end < (fixmem32->address + ++ (mcfg_res->end <= (fixmem32->address + + fixmem32->address_length))) { + mcfg_res->flags = 1; + return AE_CTRL_TERMINATE; +@@ -272,7 +272,7 @@ + return AE_OK; + + if ((mcfg_res->start >= address.minimum) && +- (mcfg_res->end < (address.minimum + address.address_length))) { ++ (mcfg_res->end <= (address.minimum + address.address_length))) { + mcfg_res->flags = 1; + return AE_CTRL_TERMINATE; + } +@@ -319,7 +319,7 @@ + u64 old_size = size; + int valid = 0; + +- while (!is_reserved(addr, addr + size - 1, E820_RESERVED)) { ++ while (!is_reserved(addr, addr + size, E820_RESERVED)) { + size >>= 1; + if (size < (16UL<<20)) + break; +diff -urN linux-2.6.27.19-5.1/arch/x86/vdso/vdso32-setup-xen.c linux-2.6.27.23-0.1.1/arch/x86/vdso/vdso32-setup-xen.c +--- linux-2.6.27.19-5.1/arch/x86/vdso/vdso32-setup-xen.c 2009-06-16 13:53:34.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/x86/vdso/vdso32-setup-xen.c 2009-06-16 13:39:58.000000000 +0100 +@@ -204,11 +204,11 @@ + + void __cpuinit syscall32_cpu_init(void) + { +- static /*const*/ struct callback_register __cpuinitdata cstar = { ++ static const struct callback_register __cpuinitconst cstar = { + .type = CALLBACKTYPE_syscall32, + .address = (unsigned long)ia32_cstar_target + }; +- static /*const*/ struct callback_register __cpuinitdata sysenter = { ++ static const struct callback_register __cpuinitconst sysenter = { + .type = CALLBACKTYPE_sysenter, + .address = (unsigned long)ia32_sysenter_target + }; +@@ -231,7 +231,7 @@ + #define vdso32_syscall() (boot_cpu_has(X86_FEATURE_SYSCALL32)) + + extern asmlinkage void ia32pv_cstar_target(void); +-static /*const*/ struct callback_register __cpuinitdata cstar = { ++static const struct callback_register __cpuinitconst cstar = { + .type = CALLBACKTYPE_syscall32, + .address = { __KERNEL_CS, (unsigned long)ia32pv_cstar_target }, + }; +diff -urN linux-2.6.27.19-5.1/arch/x86/xen/enlighten.c linux-2.6.27.23-0.1.1/arch/x86/xen/enlighten.c +--- linux-2.6.27.19-5.1/arch/x86/xen/enlighten.c 2009-06-16 13:53:34.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/arch/x86/xen/enlighten.c 2009-06-16 13:39:58.000000000 +0100 +@@ -1745,6 +1745,9 @@ + possible map and a non-dummy shared_info. */ + per_cpu(xen_vcpu, 0) = &HYPERVISOR_shared_info->vcpu_info[0]; + ++ local_irq_disable(); ++ early_boot_irqs_off(); ++ + xen_raw_console_write("mapping kernel into physical memory\n"); + pgd = xen_setup_kernel_pagetable(pgd, xen_start_info->nr_pages); + +diff -urN linux-2.6.27.19-5.1/block/blk-timeout.c linux-2.6.27.23-0.1.1/block/blk-timeout.c +--- linux-2.6.27.19-5.1/block/blk-timeout.c 2009-06-16 13:54:10.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/block/blk-timeout.c 2009-06-16 13:40:23.000000000 +0100 +@@ -145,6 +145,8 @@ + * blk_abort_queue -- Abort all request on given queue + * @queue: pointer to queue + * ++ * We have to use list_splice() here as blk_abort_request() ++ * might add requests back on the timeout list. + */ + void blk_abort_queue(struct request_queue *q) + { +@@ -161,6 +163,9 @@ + list_for_each_entry_safe(rq, tmp, &list, timeout_list) + blk_abort_request(rq); + ++ /* Add remaining requests back on the list */ ++ list_splice(&list, &q->timeout_list); ++ + spin_unlock_irqrestore(q->queue_lock, flags); + + } +diff -urN linux-2.6.27.19-5.1/Documentation/kmsg/s390/zfcp linux-2.6.27.23-0.1.1/Documentation/kmsg/s390/zfcp +--- linux-2.6.27.19-5.1/Documentation/kmsg/s390/zfcp 2009-06-16 13:55:02.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/Documentation/kmsg/s390/zfcp 2009-06-16 13:41:09.000000000 +0100 +@@ -100,6 +100,21 @@ + */ + + /*? ++ * Text: "%s: The FCP device did not respond within the specified time\n" ++ * Severity: Warning ++ * Parameter: ++ * @1: bus ID of the zfcp device ++ * Description: ++ * The common I/O layer waited for a response from the FCP adapter but ++ * no response was received within the specified time limit. This might ++ * indicate a hardware problem. ++ * User action: ++ * Consult your hardware administrator. If this problem persists, ++ * gather Linux debug data, collect the FCP adapter hardware logs, and ++ * report the problem to your support organization. ++ */ ++ ++/*? + * Text: "%s: Registering the FCP device with the SCSI stack failed\n" + * Severity: Error + * Parameter: +diff -urN linux-2.6.27.19-5.1/Documentation/sound/alsa/ALSA-Configuration.txt linux-2.6.27.23-0.1.1/Documentation/sound/alsa/ALSA-Configuration.txt +--- linux-2.6.27.19-5.1/Documentation/sound/alsa/ALSA-Configuration.txt 2009-06-16 13:55:08.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/Documentation/sound/alsa/ALSA-Configuration.txt 2009-06-16 13:41:09.000000000 +0100 +@@ -1016,6 +1016,8 @@ + Conexant 5051 + laptop Basic Laptop config (default) + hp HP Spartan laptop ++ hp-dv6736 HP dv6736 ++ lenovo-x200 Lenovo X200 laptop + + STAC9200 + ref Reference board +diff -urN linux-2.6.27.19-5.1/drivers/acpi/ec.c linux-2.6.27.23-0.1.1/drivers/acpi/ec.c +--- linux-2.6.27.19-5.1/drivers/acpi/ec.c 2009-06-16 13:54:32.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/acpi/ec.c 2009-06-16 13:40:39.000000000 +0100 +@@ -761,9 +761,10 @@ + struct acpi_namespace_node *node = handle; + struct acpi_ec *ec = context; + int value = 0; +- if (sscanf(node->name.ascii, "_Q%x", &value) == 1) { ++ ++ if (sscanf(node->name.ascii, "_Q%2x", &value) == 1) + acpi_ec_add_query_handler(ec, value, handle, NULL, NULL); +- } ++ + return AE_OK; + } + +@@ -971,9 +972,9 @@ + + int __init acpi_ec_ecdt_probe(void) + { +- int ret; + acpi_status status; + struct acpi_table_ecdt *ecdt_ptr; ++ acpi_handle dummy; + + boot_ec = make_acpi_ec(); + if (!boot_ec) +@@ -999,30 +1000,31 @@ + boot_ec->gpe = ecdt_ptr->gpe; + boot_ec->handle = ACPI_ROOT_OBJECT; + acpi_get_handle(ACPI_ROOT_OBJECT, ecdt_ptr->id, &boot_ec->handle); +- } else { +- /* This workaround is needed only on some broken machines, +- * which require early EC, but fail to provide ECDT */ +- acpi_handle x; +- printk(KERN_DEBUG PREFIX "Look up EC in DSDT\n"); +- status = acpi_get_devices(ec_device_ids[0].id, ec_parse_device, +- boot_ec, NULL); +- /* Check that acpi_get_devices actually find something */ +- if (ACPI_FAILURE(status) || !boot_ec->handle) +- goto error; +- /* We really need to limit this workaround, the only ASUS, +- * which needs it, has fake EC._INI method, so use it as flag. +- * Keep boot_ec struct as it will be needed soon. +- */ +- if (ACPI_FAILURE(acpi_get_handle(boot_ec->handle, "_INI", &x))) +- return -ENODEV; ++ /* Add some basic check against completely broken table */ ++ if (boot_ec->data_addr != boot_ec->command_addr) ++ goto install; ++ /* fall through */ + } +- +- ret = ec_install_handlers(boot_ec); +- if (!ret) { ++ /* This workaround is needed only on some broken machines, ++ * which require early EC, but fail to provide ECDT */ ++ printk(KERN_DEBUG PREFIX "Look up EC in DSDT\n"); ++ status = acpi_get_devices(ec_device_ids[0].id, ec_parse_device, ++ boot_ec, NULL); ++ /* Check that acpi_get_devices actually find something */ ++ if (ACPI_FAILURE(status) || !boot_ec->handle) ++ goto error; ++ /* We really need to limit this workaround, the only ASUS, ++ * which needs it, has fake EC._INI method, so use it as flag. ++ * Keep boot_ec struct as it will be needed soon. ++ */ ++ if (ACPI_FAILURE(acpi_get_handle(boot_ec->handle, "_INI", &dummy))) ++ return -ENODEV; ++install: ++ if (!ec_install_handlers(boot_ec)) { + first_ec = boot_ec; + return 0; + } +- error: ++error: + kfree(boot_ec); + boot_ec = NULL; + return -ENODEV; +diff -urN linux-2.6.27.19-5.1/drivers/acpi/numa.c linux-2.6.27.23-0.1.1/drivers/acpi/numa.c +--- linux-2.6.27.19-5.1/drivers/acpi/numa.c 2009-06-16 13:54:32.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/acpi/numa.c 2009-06-16 13:40:39.000000000 +0100 +@@ -43,6 +43,8 @@ + static int node_to_pxm_map[MAX_NUMNODES] + = { [0 ... MAX_NUMNODES - 1] = PXM_INVAL }; + ++unsigned char acpi_srat_revision __initdata; ++ + int pxm_to_node(int pxm) + { + if (pxm < 0) +@@ -225,6 +227,7 @@ + return -EINVAL; + + srat = (struct acpi_table_srat *)table; ++ acpi_srat_revision = srat->header.revision; + + return 0; + } +diff -urN linux-2.6.27.19-5.1/drivers/acpi/processor_extcntl.c linux-2.6.27.23-0.1.1/drivers/acpi/processor_extcntl.c +--- linux-2.6.27.19-5.1/drivers/acpi/processor_extcntl.c 2009-06-16 13:54:32.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/acpi/processor_extcntl.c 2009-06-16 13:40:39.000000000 +0100 +@@ -66,7 +66,7 @@ + + status = acpi_os_write_port(acpi_gbl_FADT.smi_command, + acpi_gbl_FADT.pstate_control, 8); +- if (ACPI_FAILURE(status)) ++ if (ACPI_FAILURE(status)) + return status; + + is_done = 1; +@@ -163,7 +163,7 @@ + * Existing ACPI module does parse performance states at some point, + * when acpi-cpufreq driver is loaded which however is something + * we'd like to disable to avoid confliction with external control +- * logic. So we have to collect raw performance information here ++ * logic. So we have to collect raw performance information here + * when ACPI processor object is found and started. + */ + static int processor_extcntl_get_performance(struct acpi_processor *pr) +@@ -189,7 +189,7 @@ + * Well, here we need retrieve performance dependency information + * from _PSD object. The reason why existing interface is not used + * is due to the reason that existing interface sticks to Linux cpu +- * id to construct some bitmap, however we want to split ACPI ++ * id to construct some bitmap, however we want to split ACPI + * processor objects from Linux cpu id logic. For example, even + * when Linux is configured as UP, we still want to parse all ACPI + * processor objects to external logic. In this case, it's preferred +diff -urN linux-2.6.27.19-5.1/drivers/acpi/resources/rscreate.c linux-2.6.27.23-0.1.1/drivers/acpi/resources/rscreate.c +--- linux-2.6.27.19-5.1/drivers/acpi/resources/rscreate.c 2009-06-16 13:54:32.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/acpi/resources/rscreate.c 2009-06-16 13:40:39.000000000 +0100 +@@ -191,8 +191,6 @@ + user_prt = ACPI_CAST_PTR(struct acpi_pci_routing_table, buffer); + + for (index = 0; index < number_of_elements; index++) { +- int source_name_index = 2; +- int source_index_index = 3; + + /* + * Point user_prt past this current structure +@@ -261,27 +259,6 @@ + return_ACPI_STATUS(AE_BAD_DATA); + } + +- /* +- * If BIOS erroneously reversed the _PRT source_name and source_index, +- * then reverse them back. +- */ +- if (ACPI_GET_OBJECT_TYPE(sub_object_list[3]) != +- ACPI_TYPE_INTEGER) { +- if (acpi_gbl_enable_interpreter_slack) { +- source_name_index = 3; +- source_index_index = 2; +- printk(KERN_WARNING +- "ACPI: Handling Garbled _PRT entry\n"); +- } else { +- ACPI_ERROR((AE_INFO, +- "(PRT[%X].source_index) Need Integer, found %s", +- index, +- acpi_ut_get_object_type_name +- (sub_object_list[3]))); +- return_ACPI_STATUS(AE_BAD_DATA); +- } +- } +- + user_prt->pin = (u32) obj_desc->integer.value; + + /* +@@ -305,7 +282,7 @@ + * 3) Third subobject: Dereference the PRT.source_name + * The name may be unresolved (slack mode), so allow a null object + */ +- obj_desc = sub_object_list[source_name_index]; ++ obj_desc = sub_object_list[2]; + if (obj_desc) { + switch (ACPI_GET_OBJECT_TYPE(obj_desc)) { + case ACPI_TYPE_LOCAL_REFERENCE: +@@ -380,7 +357,7 @@ + + /* 4) Fourth subobject: Dereference the PRT.source_index */ + +- obj_desc = sub_object_list[source_index_index]; ++ obj_desc = sub_object_list[3]; + if (ACPI_GET_OBJECT_TYPE(obj_desc) != ACPI_TYPE_INTEGER) { + ACPI_ERROR((AE_INFO, + "(PRT[%X].SourceIndex) Need Integer, found %s", +diff -urN linux-2.6.27.19-5.1/drivers/ata/ahci.c linux-2.6.27.23-0.1.1/drivers/ata/ahci.c +--- linux-2.6.27.19-5.1/drivers/ata/ahci.c 2009-06-16 13:54:17.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/ata/ahci.c 2009-06-16 13:40:23.000000000 +0100 +@@ -62,6 +62,7 @@ + static ssize_t ahci_transmit_led_message(struct ata_port *ap, u32 state, + ssize_t size); + #define MAX_SLOTS 8 ++#define MAX_RETRY 15 + + enum { + AHCI_PCI_BAR = 5, +@@ -1095,6 +1096,8 @@ + struct ahci_port_priv *pp = ap->private_data; + struct ata_link *link; + struct ahci_em_priv *emp; ++ ssize_t rc; ++ int i; + + /* enable FIS reception */ + ahci_start_fis_rx(ap); +@@ -1106,7 +1109,17 @@ + if (ap->flags & ATA_FLAG_EM) { + ata_port_for_each_link(link, ap) { + emp = &pp->em_priv[link->pmp]; +- ahci_transmit_led_message(ap, emp->led_state, 4); ++ ++ /* EM Transmit bit maybe busy during init */ ++ for (i = 0; i < MAX_RETRY; i++) { ++ rc = ahci_transmit_led_message(ap, ++ emp->led_state, ++ 4); ++ if (rc == -EBUSY) ++ udelay(100); ++ else ++ break; ++ } + } + } + +@@ -1308,7 +1321,7 @@ + em_ctl = readl(mmio + HOST_EM_CTL); + if (em_ctl & EM_CTL_TM) { + spin_unlock_irqrestore(ap->lock, flags); +- return -EINVAL; ++ return -EBUSY; + } + + /* +@@ -1325,7 +1338,7 @@ + writel(message[1], mmio + hpriv->em_loc+4); + + /* save off new led state for port/slot */ +- emp->led_state = message[1]; ++ emp->led_state = state; + + /* + * tell hardware to transmit the message +diff -urN linux-2.6.27.19-5.1/drivers/ata/ata_piix.c linux-2.6.27.23-0.1.1/drivers/ata/ata_piix.c +--- linux-2.6.27.19-5.1/drivers/ata/ata_piix.c 2009-06-16 13:54:17.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/ata/ata_piix.c 2009-06-16 13:40:23.000000000 +0100 +@@ -1104,6 +1104,13 @@ + DMI_MATCH(DMI_PRODUCT_NAME, "PORTEGE M500"), + }, + }, ++ { ++ .ident = "VGN-BX297XP", ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), ++ DMI_MATCH(DMI_PRODUCT_NAME, "VGN-BX297XP"), ++ }, ++ }, + + { } /* terminate list */ + }; +@@ -1347,19 +1354,57 @@ + return map; + } + ++static bool piix_no_sidpr(struct ata_host *host) ++{ ++ struct pci_dev *pdev = to_pci_dev(host->dev); ++ ++ /* ++ * Samsung DB-P70 only has three ATA ports exposed and ++ * curiously the unconnected first port reports link online ++ * while not responding to SRST protocol causing excessive ++ * detection delay. ++ * ++ * Unfortunately, the system doesn't carry enough DMI ++ * information to identify the machine but does have subsystem ++ * vendor and device set. As it's unclear whether the ++ * subsystem vendor/device is used only for this specific ++ * board, the port can't be disabled solely with the ++ * information; however, turning off SIDPR access works around ++ * the problem. Turn it off. ++ * ++ * This problem is reported in bnc#441240. ++ * ++ * https://bugzilla.novell.com/show_bug.cgi?id=441420 ++ */ ++ if (pdev->vendor == PCI_VENDOR_ID_INTEL && pdev->device == 0x2920 && ++ pdev->subsystem_vendor == PCI_VENDOR_ID_SAMSUNG && ++ pdev->subsystem_device == 0xb049) { ++ dev_printk(KERN_WARNING, host->dev, ++ "Samsung DB-P70 detected, disabling SIDPR\n"); ++ return true; ++ } ++ ++ return false; ++} ++ + static int __devinit piix_init_sidpr(struct ata_host *host) + { + struct pci_dev *pdev = to_pci_dev(host->dev); + struct piix_host_priv *hpriv = host->private_data; + struct ata_link *link0 = &host->ports[0]->link; + u32 scontrol; +- int i, rc; ++ int i; ++ int rc; + + /* check for availability */ + for (i = 0; i < 4; i++) + if (hpriv->map[i] == IDE) + return 0; + ++ /* is it blacklisted? */ ++ if (piix_no_sidpr(host)) ++ return 0; ++ + if (!(host->ports[0]->flags & PIIX_FLAG_SIDPR)) + return 0; + +diff -urN linux-2.6.27.19-5.1/drivers/ata/libata-core.c linux-2.6.27.23-0.1.1/drivers/ata/libata-core.c +--- linux-2.6.27.19-5.1/drivers/ata/libata-core.c 2009-06-16 13:54:17.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/ata/libata-core.c 2009-06-16 13:40:23.000000000 +0100 +@@ -1251,14 +1251,16 @@ + { + if (ata_id_has_lba(id)) { + if (ata_id_has_lba48(id)) +- return ata_id_u64(id, 100); ++ return ata_id_u64(id, ATA_ID_LBA_CAPACITY_2); + else +- return ata_id_u32(id, 60); ++ return ata_id_u32(id, ATA_ID_LBA_CAPACITY); + } else { + if (ata_id_current_chs_valid(id)) +- return ata_id_u32(id, 57); ++ return id[ATA_ID_CUR_CYLS] * id[ATA_ID_CUR_HEADS] * ++ id[ATA_ID_CUR_SECTORS]; + else +- return id[1] * id[3] * id[6]; ++ return id[ATA_ID_CYLS] * id[ATA_ID_HEADS] * ++ id[ATA_ID_SECTORS]; + } + } + +diff -urN linux-2.6.27.19-5.1/drivers/ata/libata-eh.c linux-2.6.27.23-0.1.1/drivers/ata/libata-eh.c +--- linux-2.6.27.19-5.1/drivers/ata/libata-eh.c 2009-06-16 13:54:17.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/ata/libata-eh.c 2009-06-16 13:40:23.000000000 +0100 +@@ -2327,11 +2327,14 @@ + } + + /* prereset() might have cleared ATA_EH_RESET. If so, +- * bang classes and return. ++ * bang classes, thaw and return. + */ + if (reset && !(ehc->i.action & ATA_EH_RESET)) { + ata_link_for_each_dev(dev, link) + classes[dev->devno] = ATA_DEV_NONE; ++ if ((ap->pflags & ATA_PFLAG_FROZEN) && ++ ata_is_host_link(link)) ++ ata_eh_thaw_port(ap); + rc = 0; + goto out; + } +@@ -3156,6 +3159,8 @@ + */ + static void ata_eh_handle_port_resume(struct ata_port *ap) + { ++ struct ata_link *link; ++ struct ata_device *dev; + unsigned long flags; + int rc = 0; + +@@ -3170,6 +3175,17 @@ + + WARN_ON(!(ap->pflags & ATA_PFLAG_SUSPENDED)); + ++ /* ++ * Error timestamps are in jiffies which doesn't run while ++ * suspended and PHY events during resume isn't too uncommon. ++ * When the two are combined, it can lead to unnecessary speed ++ * downs if the machine is suspended and resumed repeatedly. ++ * Clear error history. ++ */ ++ ata_port_for_each_link(link, ap) ++ ata_link_for_each_dev(dev, link) ++ ata_ering_clear(&dev->ering); ++ + ata_acpi_set_state(ap, PMSG_ON); + + if (ap->ops->port_resume) +diff -urN linux-2.6.27.19-5.1/drivers/ata/pata_hpt37x.c linux-2.6.27.23-0.1.1/drivers/ata/pata_hpt37x.c +--- linux-2.6.27.19-5.1/drivers/ata/pata_hpt37x.c 2009-06-16 13:54:17.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/ata/pata_hpt37x.c 2009-06-16 13:40:23.000000000 +0100 +@@ -8,7 +8,7 @@ + * Copyright (C) 1999-2003 Andre Hedrick + * Portions Copyright (C) 2001 Sun Microsystems, Inc. + * Portions Copyright (C) 2003 Red Hat Inc +- * Portions Copyright (C) 2005-2007 MontaVista Software, Inc. ++ * Portions Copyright (C) 2005-2009 MontaVista Software, Inc. + * + * TODO + * Look into engine reset on timeout errors. Should not be required. +@@ -24,7 +24,7 @@ + #include + + #define DRV_NAME "pata_hpt37x" +-#define DRV_VERSION "0.6.11" ++#define DRV_VERSION "0.6.12" + + struct hpt_clock { + u8 xfer_speed; +@@ -445,23 +445,6 @@ + } + + /** +- * hpt370_bmdma_start - DMA engine begin +- * @qc: ATA command +- * +- * The 370 and 370A want us to reset the DMA engine each time we +- * use it. The 372 and later are fine. +- */ +- +-static void hpt370_bmdma_start(struct ata_queued_cmd *qc) +-{ +- struct ata_port *ap = qc->ap; +- struct pci_dev *pdev = to_pci_dev(ap->host->dev); +- pci_write_config_byte(pdev, 0x50 + 4 * ap->port_no, 0x37); +- udelay(10); +- ata_bmdma_start(qc); +-} +- +-/** + * hpt370_bmdma_end - DMA engine stop + * @qc: ATA command + * +@@ -598,7 +581,6 @@ + static struct ata_port_operations hpt370_port_ops = { + .inherits = &ata_bmdma_port_ops, + +- .bmdma_start = hpt370_bmdma_start, + .bmdma_stop = hpt370_bmdma_stop, + + .mode_filter = hpt370_filter, +diff -urN linux-2.6.27.19-5.1/drivers/atm/fore200e.c linux-2.6.27.23-0.1.1/drivers/atm/fore200e.c +--- linux-2.6.27.19-5.1/drivers/atm/fore200e.c 2009-06-16 13:54:17.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/atm/fore200e.c 2009-06-16 13:40:24.000000000 +0100 +@@ -2578,8 +2578,8 @@ + return err; + + sprintf(buf, "%s%s", fore200e->bus->proc_name, FW_EXT); +- if (request_firmware(&firmware, buf, device) == 1) { +- printk(FORE200E "missing %s firmware image\n", fore200e->bus->model_name); ++ if ((err = request_firmware(&firmware, buf, device)) < 0) { ++ printk(FORE200E "problem loading firmware image %s\n", fore200e->bus->model_name); + return err; + } + +diff -urN linux-2.6.27.19-5.1/drivers/base/cpu.c linux-2.6.27.23-0.1.1/drivers/base/cpu.c +--- linux-2.6.27.19-5.1/drivers/base/cpu.c 2009-06-16 13:54:32.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/base/cpu.c 2009-06-16 13:40:39.000000000 +0100 +@@ -78,7 +78,7 @@ + } + #endif /* CONFIG_HOTPLUG_CPU */ + +-#ifdef CONFIG_KEXEC ++#if defined(CONFIG_KEXEC) && !defined(CONFIG_XEN) + #include + + static ssize_t show_crash_notes(struct sys_device *dev, struct sysdev_attribute *attr, +@@ -173,7 +173,7 @@ + if (!error) + register_cpu_under_node(num, cpu_to_node(num)); + +-#ifdef CONFIG_KEXEC ++#if defined(CONFIG_KEXEC) && !defined(CONFIG_XEN) + if (!error) + error = sysdev_create_file(&cpu->sysdev, &attr_crash_notes); + #endif +diff -urN linux-2.6.27.19-5.1/drivers/block/aoe/aoe.h linux-2.6.27.23-0.1.1/drivers/block/aoe/aoe.h +--- linux-2.6.27.19-5.1/drivers/block/aoe/aoe.h 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/block/aoe/aoe.h 2009-06-16 13:40:47.000000000 +0100 +@@ -18,6 +18,7 @@ + enum { + AOECMD_ATA, + AOECMD_CFG, ++ AOECMD_VEND_MIN = 0xf0, + + AOEFL_RSP = (1<<3), + AOEFL_ERR = (1<<2), +diff -urN linux-2.6.27.19-5.1/drivers/block/aoe/aoenet.c linux-2.6.27.23-0.1.1/drivers/block/aoe/aoenet.c +--- linux-2.6.27.19-5.1/drivers/block/aoe/aoenet.c 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/block/aoe/aoenet.c 2009-06-16 13:40:47.000000000 +0100 +@@ -154,6 +154,8 @@ + aoecmd_cfg_rsp(skb); + break; + default: ++ if (h->cmd >= AOECMD_VEND_MIN) ++ break; /* don't complain about vendor commands */ + printk(KERN_INFO "aoe: unknown cmd %d\n", h->cmd); + } + exit: +diff -urN linux-2.6.27.19-5.1/drivers/block/loop.c linux-2.6.27.23-0.1.1/drivers/block/loop.c +--- linux-2.6.27.19-5.1/drivers/block/loop.c 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/block/loop.c 2009-06-16 13:40:47.000000000 +0100 +@@ -203,38 +203,6 @@ + return lo->transfer(lo, cmd, rpage, roffs, lpage, loffs, size, rblock); + } + +-/* +- * This is best effort. We really wouldn't know what to do with a returned +- * error. This code is taken from the implementation of fsync. +- */ +-static int sync_file(struct file * file, int full_sync) +-{ +- struct address_space *mapping; +- int ret; +- +- if (!file->f_op || !file->f_op->fsync) +- return -EOPNOTSUPP; +- +- mapping = file->f_mapping; +- +- ret = filemap_fdatawrite(mapping); +- if (!ret) { +- int ret2; +- /* +- * We need to protect against concurrent writers, +- * which could cause livelocks in fsync_buffers_list +- */ +- if (full_sync) +- ret = file->f_op->fsync(file, file->f_dentry, 1); +- +- ret2 = filemap_fdatawait(mapping); +- if (!ret) +- ret = ret2; +- } +- +- return ret; +-} +- + /** + * do_lo_send_aops - helper for writing data to a loop device + * +@@ -246,18 +214,11 @@ + { + struct file *file = lo->lo_backing_file; /* kudos to NFsckingS */ + struct address_space *mapping = file->f_mapping; +- struct inode *inode = file->f_dentry->d_inode; + pgoff_t index; + unsigned offset, bv_offs; + int len, ret; +- unsigned long old_blocks; + + mutex_lock(&mapping->host->i_mutex); +- +- spin_lock(&inode->i_lock); +- old_blocks = inode->i_blocks; +- spin_unlock(&inode->i_lock); +- + index = pos >> PAGE_CACHE_SHIFT; + offset = pos & ((pgoff_t)PAGE_CACHE_SIZE - 1); + bv_offs = bvec->bv_offset; +@@ -300,15 +261,6 @@ + pos += copied; + } + ret = 0; +- +- if (file->f_flags & O_SYNC) { +- int full_sync = 0; +- spin_lock(&inode->i_lock); +- if (inode->i_blocks > old_blocks) +- full_sync = 1; +- spin_unlock(&inode->i_lock); +- ret = sync_file(file, full_sync); +- } + out: + mutex_unlock(&mapping->host->i_mutex); + return ret; +@@ -523,24 +475,12 @@ + { + loff_t pos; + int ret; +- int sync = bio_sync(bio); +- int barrier = bio_barrier(bio); +- +- if (barrier) { +- ret = sync_file(lo->lo_backing_file, 1); +- if (unlikely(ret)) +- return ret; +- } + + pos = ((loff_t) bio->bi_sector << 9) + lo->lo_offset; + if (bio_rw(bio) == WRITE) + ret = lo_send(lo, bio, lo->lo_blocksize, pos); + else + ret = lo_receive(lo, bio, lo->lo_blocksize, pos); +- +- if ((barrier || sync) && !ret) +- ret = sync_file(lo->lo_backing_file, 1); +- + return ret; + } + +@@ -817,9 +757,6 @@ + if (!(file->f_mode & FMODE_WRITE)) + lo_flags |= LO_FLAGS_READ_ONLY; + +- if ((file->f_flags & O_SYNC) && (!file->f_op || !file->f_op->fsync)) +- return -EINVAL; +- + error = -EINVAL; + if (S_ISREG(inode->i_mode) || S_ISBLK(inode->i_mode)) { + const struct address_space_operations *aops = mapping->a_ops; +diff -urN linux-2.6.27.19-5.1/drivers/block/xen-blkfront.c linux-2.6.27.23-0.1.1/drivers/block/xen-blkfront.c +--- linux-2.6.27.19-5.1/drivers/block/xen-blkfront.c 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/block/xen-blkfront.c 2009-06-16 13:40:47.000000000 +0100 +@@ -40,6 +40,7 @@ + #include + #include + #include ++#include + + #include + #include +@@ -82,6 +83,7 @@ + enum blkif_state connected; + int ring_ref; + struct blkif_front_ring ring; ++ struct scatterlist sg[BLKIF_MAX_SEGMENTS_PER_REQUEST]; + unsigned int evtchn, irq; + struct request_queue *rq; + struct work_struct work; +@@ -203,12 +205,11 @@ + struct blkfront_info *info = req->rq_disk->private_data; + unsigned long buffer_mfn; + struct blkif_request *ring_req; +- struct req_iterator iter; +- struct bio_vec *bvec; + unsigned long id; + unsigned int fsect, lsect; +- int ref; ++ int i, ref; + grant_ref_t gref_head; ++ struct scatterlist *sg; + + if (unlikely(info->connected != BLKIF_STATE_CONNECTED)) + return 1; +@@ -237,12 +238,13 @@ + if (blk_barrier_rq(req)) + ring_req->operation = BLKIF_OP_WRITE_BARRIER; + +- ring_req->nr_segments = 0; +- rq_for_each_segment(bvec, req, iter) { +- BUG_ON(ring_req->nr_segments == BLKIF_MAX_SEGMENTS_PER_REQUEST); +- buffer_mfn = pfn_to_mfn(page_to_pfn(bvec->bv_page)); +- fsect = bvec->bv_offset >> 9; +- lsect = fsect + (bvec->bv_len >> 9) - 1; ++ ring_req->nr_segments = blk_rq_map_sg(req->q, req, info->sg); ++ BUG_ON(ring_req->nr_segments > BLKIF_MAX_SEGMENTS_PER_REQUEST); ++ ++ for_each_sg(info->sg, sg, ring_req->nr_segments, i) { ++ buffer_mfn = pfn_to_mfn(page_to_pfn(sg_page(sg))); ++ fsect = sg->offset >> 9; ++ lsect = fsect + (sg->length >> 9) - 1; + /* install a grant reference. */ + ref = gnttab_claim_grant_reference(&gref_head); + BUG_ON(ref == -ENOSPC); +@@ -253,16 +255,12 @@ + buffer_mfn, + rq_data_dir(req) ); + +- info->shadow[id].frame[ring_req->nr_segments] = +- mfn_to_pfn(buffer_mfn); +- +- ring_req->seg[ring_req->nr_segments] = ++ info->shadow[id].frame[i] = mfn_to_pfn(buffer_mfn); ++ ring_req->seg[i] = + (struct blkif_request_segment) { + .gref = ref, + .first_sect = fsect, + .last_sect = lsect }; +- +- ring_req->nr_segments++; + } + + info->ring.req_prod_pvt++; +@@ -592,6 +590,8 @@ + SHARED_RING_INIT(sring); + FRONT_RING_INIT(&info->ring, sring, PAGE_SIZE); + ++ sg_init_table(info->sg, BLKIF_MAX_SEGMENTS_PER_REQUEST); ++ + err = xenbus_grant_ring(dev, virt_to_mfn(info->ring.sring)); + if (err < 0) { + free_page((unsigned long)sring); +diff -urN linux-2.6.27.19-5.1/drivers/char/agp/generic.c linux-2.6.27.23-0.1.1/drivers/char/agp/generic.c +--- linux-2.6.27.19-5.1/drivers/char/agp/generic.c 2009-06-16 13:54:32.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/char/agp/generic.c 2009-06-16 13:40:39.000000000 +0100 +@@ -1207,7 +1207,7 @@ + { + struct page * page; + +- page = alloc_page(GFP_KERNEL | GFP_DMA32); ++ page = alloc_page(GFP_KERNEL | GFP_DMA32 | __GFP_ZERO); + if (page == NULL) + return NULL; + +diff -urN linux-2.6.27.19-5.1/drivers/char/agp/intel-agp.c linux-2.6.27.23-0.1.1/drivers/char/agp/intel-agp.c +--- linux-2.6.27.19-5.1/drivers/char/agp/intel-agp.c 2009-06-16 13:54:32.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/char/agp/intel-agp.c 2009-06-16 13:40:39.000000000 +0100 +@@ -650,13 +650,15 @@ + break; + } + } +- if (gtt_entries > 0) ++ if (gtt_entries > 0) { + dev_info(&agp_bridge->dev->dev, "detected %dK %s memory\n", + gtt_entries / KB(1), local ? "local" : "stolen"); +- else ++ gtt_entries /= KB(4); ++ } else { + dev_info(&agp_bridge->dev->dev, + "no pre-allocated video memory detected\n"); +- gtt_entries /= KB(4); ++ gtt_entries = 0; ++ } + + intel_private.gtt_entries = gtt_entries; + } +diff -urN linux-2.6.27.19-5.1/drivers/char/hw_random/virtio-rng.c linux-2.6.27.23-0.1.1/drivers/char/hw_random/virtio-rng.c +--- linux-2.6.27.19-5.1/drivers/char/hw_random/virtio-rng.c 2009-06-16 13:54:33.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/char/hw_random/virtio-rng.c 2009-06-16 13:40:39.000000000 +0100 +@@ -37,9 +37,9 @@ + { + int len; + +- /* We never get spurious callbacks. */ ++ /* We can get spurious callbacks, e.g. shared IRQs + virtio_pci. */ + if (!vq->vq_ops->get_buf(vq, &len)) +- BUG(); ++ return; + + data_left = len / sizeof(random_data[0]); + complete(&have_data); +diff -urN linux-2.6.27.19-5.1/drivers/char/raw.c linux-2.6.27.23-0.1.1/drivers/char/raw.c +--- linux-2.6.27.19-5.1/drivers/char/raw.c 2009-06-16 13:54:32.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/char/raw.c 2009-06-16 13:40:39.000000000 +0100 +@@ -96,6 +96,7 @@ + blkdev_put(bdev); + out: + mutex_unlock(&raw_mutex); ++ unlock_kernel(); + return err; + } + +diff -urN linux-2.6.27.19-5.1/drivers/crypto/ixp4xx_crypto.c linux-2.6.27.23-0.1.1/drivers/crypto/ixp4xx_crypto.c +--- linux-2.6.27.19-5.1/drivers/crypto/ixp4xx_crypto.c 2009-06-16 13:54:54.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/crypto/ixp4xx_crypto.c 2009-06-16 13:41:02.000000000 +0100 +@@ -101,6 +101,7 @@ + u32 phys_addr; + u32 __reserved[4]; + struct buffer_desc *next; ++ enum dma_data_direction dir; + }; + + struct crypt_ctl { +@@ -132,14 +133,10 @@ + struct ablk_ctx { + struct buffer_desc *src; + struct buffer_desc *dst; +- unsigned src_nents; +- unsigned dst_nents; + }; + + struct aead_ctx { + struct buffer_desc *buffer; +- unsigned short assoc_nents; +- unsigned short src_nents; + struct scatterlist ivlist; + /* used when the hmac is not on one sg entry */ + u8 *hmac_virt; +@@ -312,7 +309,7 @@ + } + } + +-static void free_buf_chain(struct buffer_desc *buf, u32 phys) ++static void free_buf_chain(struct device *dev, struct buffer_desc *buf,u32 phys) + { + while (buf) { + struct buffer_desc *buf1; +@@ -320,6 +317,7 @@ + + buf1 = buf->next; + phys1 = buf->phys_next; ++ dma_unmap_single(dev, buf->phys_next, buf->buf_len, buf->dir); + dma_pool_free(buffer_pool, buf, phys); + buf = buf1; + phys = phys1; +@@ -348,7 +346,6 @@ + struct crypt_ctl *crypt; + struct ixp_ctx *ctx; + int failed; +- enum dma_data_direction src_direction = DMA_BIDIRECTIONAL; + + failed = phys & 0x1 ? -EBADMSG : 0; + phys &= ~0x3; +@@ -358,13 +355,8 @@ + case CTL_FLAG_PERFORM_AEAD: { + struct aead_request *req = crypt->data.aead_req; + struct aead_ctx *req_ctx = aead_request_ctx(req); +- dma_unmap_sg(dev, req->assoc, req_ctx->assoc_nents, +- DMA_TO_DEVICE); +- dma_unmap_sg(dev, &req_ctx->ivlist, 1, DMA_BIDIRECTIONAL); +- dma_unmap_sg(dev, req->src, req_ctx->src_nents, +- DMA_BIDIRECTIONAL); + +- free_buf_chain(req_ctx->buffer, crypt->src_buf); ++ free_buf_chain(dev, req_ctx->buffer, crypt->src_buf); + if (req_ctx->hmac_virt) { + finish_scattered_hmac(crypt); + } +@@ -374,16 +366,11 @@ + case CTL_FLAG_PERFORM_ABLK: { + struct ablkcipher_request *req = crypt->data.ablk_req; + struct ablk_ctx *req_ctx = ablkcipher_request_ctx(req); +- int nents; ++ + if (req_ctx->dst) { +- nents = req_ctx->dst_nents; +- dma_unmap_sg(dev, req->dst, nents, DMA_FROM_DEVICE); +- free_buf_chain(req_ctx->dst, crypt->dst_buf); +- src_direction = DMA_TO_DEVICE; +- } +- nents = req_ctx->src_nents; +- dma_unmap_sg(dev, req->src, nents, src_direction); +- free_buf_chain(req_ctx->src, crypt->src_buf); ++ free_buf_chain(dev, req_ctx->dst, crypt->dst_buf); ++ } ++ free_buf_chain(dev, req_ctx->src, crypt->src_buf); + req->base.complete(&req->base, failed); + break; + } +@@ -748,56 +735,35 @@ + return 0; + } + +-static int count_sg(struct scatterlist *sg, int nbytes) +-{ +- int i; +- for (i = 0; nbytes > 0; i++, sg = sg_next(sg)) +- nbytes -= sg->length; +- return i; +-} +- +-static struct buffer_desc *chainup_buffers(struct scatterlist *sg, +- unsigned nbytes, struct buffer_desc *buf, gfp_t flags) ++static struct buffer_desc *chainup_buffers(struct device *dev, ++ struct scatterlist *sg, unsigned nbytes, ++ struct buffer_desc *buf, gfp_t flags, ++ enum dma_data_direction dir) + { +- int nents = 0; +- +- while (nbytes > 0) { ++ for (;nbytes > 0; sg = scatterwalk_sg_next(sg)) { ++ unsigned len = min(nbytes, sg->length); + struct buffer_desc *next_buf; + u32 next_buf_phys; +- unsigned len = min(nbytes, sg_dma_len(sg)); ++ void *ptr; + +- nents++; + nbytes -= len; +- if (!buf->phys_addr) { +- buf->phys_addr = sg_dma_address(sg); +- buf->buf_len = len; +- buf->next = NULL; +- buf->phys_next = 0; +- goto next; +- } +- /* Two consecutive chunks on one page may be handled by the old +- * buffer descriptor, increased by the length of the new one +- */ +- if (sg_dma_address(sg) == buf->phys_addr + buf->buf_len) { +- buf->buf_len += len; +- goto next; +- } ++ ptr = page_address(sg_page(sg)) + sg->offset; + next_buf = dma_pool_alloc(buffer_pool, flags, &next_buf_phys); +- if (!next_buf) +- return NULL; ++ if (!next_buf) { ++ buf = NULL; ++ break; ++ } ++ sg_dma_address(sg) = dma_map_single(dev, ptr, len, dir); + buf->next = next_buf; + buf->phys_next = next_buf_phys; +- + buf = next_buf; +- buf->next = NULL; +- buf->phys_next = 0; ++ + buf->phys_addr = sg_dma_address(sg); + buf->buf_len = len; +-next: +- if (nbytes > 0) { +- sg = sg_next(sg); +- } ++ buf->dir = dir; + } ++ buf->next = NULL; ++ buf->phys_next = 0; + return buf; + } + +@@ -858,12 +824,12 @@ + struct crypto_ablkcipher *tfm = crypto_ablkcipher_reqtfm(req); + struct ixp_ctx *ctx = crypto_ablkcipher_ctx(tfm); + unsigned ivsize = crypto_ablkcipher_ivsize(tfm); +- int ret = -ENOMEM; + struct ix_sa_dir *dir; + struct crypt_ctl *crypt; +- unsigned int nbytes = req->nbytes, nents; ++ unsigned int nbytes = req->nbytes; + enum dma_data_direction src_direction = DMA_BIDIRECTIONAL; + struct ablk_ctx *req_ctx = ablkcipher_request_ctx(req); ++ struct buffer_desc src_hook; + gfp_t flags = req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP ? + GFP_KERNEL : GFP_ATOMIC; + +@@ -876,7 +842,7 @@ + + crypt = get_crypt_desc(); + if (!crypt) +- return ret; ++ return -ENOMEM; + + crypt->data.ablk_req = req; + crypt->crypto_ctx = dir->npe_ctx_phys; +@@ -889,53 +855,41 @@ + BUG_ON(ivsize && !req->info); + memcpy(crypt->iv, req->info, ivsize); + if (req->src != req->dst) { ++ struct buffer_desc dst_hook; + crypt->mode |= NPE_OP_NOT_IN_PLACE; +- nents = count_sg(req->dst, nbytes); + /* This was never tested by Intel + * for more than one dst buffer, I think. */ +- BUG_ON(nents != 1); +- req_ctx->dst_nents = nents; +- dma_map_sg(dev, req->dst, nents, DMA_FROM_DEVICE); +- req_ctx->dst = dma_pool_alloc(buffer_pool, flags,&crypt->dst_buf); +- if (!req_ctx->dst) +- goto unmap_sg_dest; +- req_ctx->dst->phys_addr = 0; +- if (!chainup_buffers(req->dst, nbytes, req_ctx->dst, flags)) ++ BUG_ON(req->dst->length < nbytes); ++ req_ctx->dst = NULL; ++ if (!chainup_buffers(dev, req->dst, nbytes, &dst_hook, ++ flags, DMA_FROM_DEVICE)) + goto free_buf_dest; + src_direction = DMA_TO_DEVICE; ++ req_ctx->dst = dst_hook.next; ++ crypt->dst_buf = dst_hook.phys_next; + } else { + req_ctx->dst = NULL; +- req_ctx->dst_nents = 0; + } +- nents = count_sg(req->src, nbytes); +- req_ctx->src_nents = nents; +- dma_map_sg(dev, req->src, nents, src_direction); +- +- req_ctx->src = dma_pool_alloc(buffer_pool, flags, &crypt->src_buf); +- if (!req_ctx->src) +- goto unmap_sg_src; +- req_ctx->src->phys_addr = 0; +- if (!chainup_buffers(req->src, nbytes, req_ctx->src, flags)) ++ req_ctx->src = NULL; ++ if (!chainup_buffers(dev, req->src, nbytes, &src_hook, ++ flags, src_direction)) + goto free_buf_src; + ++ req_ctx->src = src_hook.next; ++ crypt->src_buf = src_hook.phys_next; + crypt->ctl_flags |= CTL_FLAG_PERFORM_ABLK; + qmgr_put_entry(SEND_QID, crypt_virt2phys(crypt)); + BUG_ON(qmgr_stat_overflow(SEND_QID)); + return -EINPROGRESS; + + free_buf_src: +- free_buf_chain(req_ctx->src, crypt->src_buf); +-unmap_sg_src: +- dma_unmap_sg(dev, req->src, req_ctx->src_nents, src_direction); ++ free_buf_chain(dev, req_ctx->src, crypt->src_buf); + free_buf_dest: + if (req->src != req->dst) { +- free_buf_chain(req_ctx->dst, crypt->dst_buf); +-unmap_sg_dest: +- dma_unmap_sg(dev, req->src, req_ctx->dst_nents, +- DMA_FROM_DEVICE); ++ free_buf_chain(dev, req_ctx->dst, crypt->dst_buf); + } + crypt->ctl_flags = CTL_FLAG_UNUSED; +- return ret; ++ return -ENOMEM; + } + + static int ablk_encrypt(struct ablkcipher_request *req) +@@ -983,7 +937,7 @@ + break; + + offset += sg->length; +- sg = sg_next(sg); ++ sg = scatterwalk_sg_next(sg); + } + return (start + nbytes > offset + sg->length); + } +@@ -995,11 +949,10 @@ + struct ixp_ctx *ctx = crypto_aead_ctx(tfm); + unsigned ivsize = crypto_aead_ivsize(tfm); + unsigned authsize = crypto_aead_authsize(tfm); +- int ret = -ENOMEM; + struct ix_sa_dir *dir; + struct crypt_ctl *crypt; +- unsigned int cryptlen, nents; +- struct buffer_desc *buf; ++ unsigned int cryptlen; ++ struct buffer_desc *buf, src_hook; + struct aead_ctx *req_ctx = aead_request_ctx(req); + gfp_t flags = req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP ? + GFP_KERNEL : GFP_ATOMIC; +@@ -1020,7 +973,7 @@ + } + crypt = get_crypt_desc(); + if (!crypt) +- return ret; ++ return -ENOMEM; + + crypt->data.aead_req = req; + crypt->crypto_ctx = dir->npe_ctx_phys; +@@ -1039,31 +992,27 @@ + BUG(); /* -ENOTSUP because of my lazyness */ + } + +- req_ctx->buffer = dma_pool_alloc(buffer_pool, flags, &crypt->src_buf); +- if (!req_ctx->buffer) +- goto out; +- req_ctx->buffer->phys_addr = 0; + /* ASSOC data */ +- nents = count_sg(req->assoc, req->assoclen); +- req_ctx->assoc_nents = nents; +- dma_map_sg(dev, req->assoc, nents, DMA_TO_DEVICE); +- buf = chainup_buffers(req->assoc, req->assoclen, req_ctx->buffer,flags); ++ buf = chainup_buffers(dev, req->assoc, req->assoclen, &src_hook, ++ flags, DMA_TO_DEVICE); ++ req_ctx->buffer = src_hook.next; ++ crypt->src_buf = src_hook.phys_next; + if (!buf) +- goto unmap_sg_assoc; ++ goto out; + /* IV */ + sg_init_table(&req_ctx->ivlist, 1); + sg_set_buf(&req_ctx->ivlist, iv, ivsize); +- dma_map_sg(dev, &req_ctx->ivlist, 1, DMA_BIDIRECTIONAL); +- buf = chainup_buffers(&req_ctx->ivlist, ivsize, buf, flags); ++ buf = chainup_buffers(dev, &req_ctx->ivlist, ivsize, buf, flags, ++ DMA_BIDIRECTIONAL); + if (!buf) +- goto unmap_sg_iv; ++ goto free_chain; + if (unlikely(hmac_inconsistent(req->src, cryptlen, authsize))) { + /* The 12 hmac bytes are scattered, + * we need to copy them into a safe buffer */ + req_ctx->hmac_virt = dma_pool_alloc(buffer_pool, flags, + &crypt->icv_rev_aes); + if (unlikely(!req_ctx->hmac_virt)) +- goto unmap_sg_iv; ++ goto free_chain; + if (!encrypt) { + scatterwalk_map_and_copy(req_ctx->hmac_virt, + req->src, cryptlen, authsize, 0); +@@ -1073,33 +1022,28 @@ + req_ctx->hmac_virt = NULL; + } + /* Crypt */ +- nents = count_sg(req->src, cryptlen + authsize); +- req_ctx->src_nents = nents; +- dma_map_sg(dev, req->src, nents, DMA_BIDIRECTIONAL); +- buf = chainup_buffers(req->src, cryptlen + authsize, buf, flags); ++ buf = chainup_buffers(dev, req->src, cryptlen + authsize, buf, flags, ++ DMA_BIDIRECTIONAL); + if (!buf) +- goto unmap_sg_src; ++ goto free_hmac_virt; + if (!req_ctx->hmac_virt) { + crypt->icv_rev_aes = buf->phys_addr + buf->buf_len - authsize; + } ++ + crypt->ctl_flags |= CTL_FLAG_PERFORM_AEAD; + qmgr_put_entry(SEND_QID, crypt_virt2phys(crypt)); + BUG_ON(qmgr_stat_overflow(SEND_QID)); + return -EINPROGRESS; +-unmap_sg_src: +- dma_unmap_sg(dev, req->src, req_ctx->src_nents, DMA_BIDIRECTIONAL); ++free_hmac_virt: + if (req_ctx->hmac_virt) { + dma_pool_free(buffer_pool, req_ctx->hmac_virt, + crypt->icv_rev_aes); + } +-unmap_sg_iv: +- dma_unmap_sg(dev, &req_ctx->ivlist, 1, DMA_BIDIRECTIONAL); +-unmap_sg_assoc: +- dma_unmap_sg(dev, req->assoc, req_ctx->assoc_nents, DMA_TO_DEVICE); +- free_buf_chain(req_ctx->buffer, crypt->src_buf); ++free_chain: ++ free_buf_chain(dev, req_ctx->buffer, crypt->src_buf); + out: + crypt->ctl_flags = CTL_FLAG_UNUSED; +- return ret; ++ return -ENOMEM; + } + + static int aead_setup(struct crypto_aead *tfm, unsigned int authsize) +diff -urN linux-2.6.27.19-5.1/drivers/gpu/drm/i915/i915_drv.h linux-2.6.27.23-0.1.1/drivers/gpu/drm/i915/i915_drv.h +--- linux-2.6.27.19-5.1/drivers/gpu/drm/i915/i915_drv.h 2009-06-16 13:54:17.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/gpu/drm/i915/i915_drv.h 2009-06-16 13:40:29.000000000 +0100 +@@ -1115,7 +1115,8 @@ + (dev)->pci_device == 0x2A42 || \ + (dev)->pci_device == 0x2E02 || \ + (dev)->pci_device == 0x2E12 || \ +- (dev)->pci_device == 0x2E22) ++ (dev)->pci_device == 0x2E22 || \ ++ (dev)->pci_device == 0x2E32) + + #define IS_I965GM(dev) ((dev)->pci_device == 0x2A02) + +@@ -1123,7 +1124,8 @@ + + #define IS_G4X(dev) ((dev)->pci_device == 0x2E02 || \ + (dev)->pci_device == 0x2E12 || \ +- (dev)->pci_device == 0x2E22) ++ (dev)->pci_device == 0x2E22 || \ ++ (dev)->pci_device == 0x2E32) + + #define IS_G33(dev) ((dev)->pci_device == 0x29C2 || \ + (dev)->pci_device == 0x29B2 || \ +diff -urN linux-2.6.27.19-5.1/drivers/hwmon/f71882fg.c linux-2.6.27.23-0.1.1/drivers/hwmon/f71882fg.c +--- linux-2.6.27.19-5.1/drivers/hwmon/f71882fg.c 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/hwmon/f71882fg.c 2009-06-16 13:40:47.000000000 +0100 +@@ -838,7 +838,7 @@ + + devid = superio_inw(sioaddr, SIO_REG_MANID); + if (devid != SIO_FINTEK_ID) { +- printk(KERN_INFO DRVNAME ": Not a Fintek device\n"); ++ pr_debug(DRVNAME ": Not a Fintek device\n"); + goto exit; + } + +diff -urN linux-2.6.27.19-5.1/drivers/hwmon/it87.c linux-2.6.27.23-0.1.1/drivers/hwmon/it87.c +--- linux-2.6.27.19-5.1/drivers/hwmon/it87.c 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/hwmon/it87.c 2009-06-16 13:40:47.000000000 +0100 +@@ -208,7 +208,7 @@ + + #define TEMP_TO_REG(val) (SENSORS_LIMIT(((val)<0?(((val)-500)/1000):\ + ((val)+500)/1000),-128,127)) +-#define TEMP_FROM_REG(val) (((val)>0x80?(val)-0x100:(val))*1000) ++#define TEMP_FROM_REG(val) ((val) * 1000) + + #define PWM_TO_REG(val) ((val) >> 1) + #define PWM_FROM_REG(val) (((val)&0x7f) << 1) +@@ -262,9 +262,9 @@ + u8 has_fan; /* Bitfield, fans enabled */ + u16 fan[5]; /* Register values, possibly combined */ + u16 fan_min[5]; /* Register values, possibly combined */ +- u8 temp[3]; /* Register value */ +- u8 temp_high[3]; /* Register value */ +- u8 temp_low[3]; /* Register value */ ++ s8 temp[3]; /* Register value */ ++ s8 temp_high[3]; /* Register value */ ++ s8 temp_low[3]; /* Register value */ + u8 sensor; /* Register value */ + u8 fan_div[3]; /* Register encoding, shifted right */ + u8 vid; /* Register encoding, combined */ +diff -urN linux-2.6.27.19-5.1/drivers/i2c/busses/i2c-acorn.c linux-2.6.27.23-0.1.1/drivers/i2c/busses/i2c-acorn.c +--- linux-2.6.27.19-5.1/drivers/i2c/busses/i2c-acorn.c 2009-06-16 13:54:17.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/i2c/busses/i2c-acorn.c 2009-06-16 13:40:24.000000000 +0100 +@@ -84,6 +84,7 @@ + + static struct i2c_adapter ioc_ops = { + .id = I2C_HW_B_IOC, ++ .nr = 0, + .algo_data = &ioc_data, + }; + +@@ -91,7 +92,7 @@ + { + force_ones = FORCE_ONES | SCL | SDA; + +- return i2c_bit_add_bus(&ioc_ops); ++ return i2c_bit_add_numbered_bus(&ioc_ops); + } + + module_init(i2c_ioc_init); +diff -urN linux-2.6.27.19-5.1/drivers/i2c/busses/i2c-amd8111.c linux-2.6.27.23-0.1.1/drivers/i2c/busses/i2c-amd8111.c +--- linux-2.6.27.19-5.1/drivers/i2c/busses/i2c-amd8111.c 2009-06-16 13:54:17.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/i2c/busses/i2c-amd8111.c 2009-06-16 13:40:24.000000000 +0100 +@@ -72,7 +72,7 @@ + { + int timeout = 500; + +- while (timeout-- && (inb(smbus->base + AMD_EC_SC) & AMD_EC_SC_IBF)) ++ while ((inb(smbus->base + AMD_EC_SC) & AMD_EC_SC_IBF) && --timeout) + udelay(1); + + if (!timeout) { +@@ -88,7 +88,7 @@ + { + int timeout = 500; + +- while (timeout-- && (~inb(smbus->base + AMD_EC_SC) & AMD_EC_SC_OBF)) ++ while ((~inb(smbus->base + AMD_EC_SC) & AMD_EC_SC_OBF) && --timeout) + udelay(1); + + if (!timeout) { +diff -urN linux-2.6.27.19-5.1/drivers/i2c/busses/i2c-pxa.c linux-2.6.27.23-0.1.1/drivers/i2c/busses/i2c-pxa.c +--- linux-2.6.27.19-5.1/drivers/i2c/busses/i2c-pxa.c 2009-06-16 13:54:17.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/i2c/busses/i2c-pxa.c 2009-06-16 13:40:24.000000000 +0100 +@@ -604,7 +604,7 @@ + + i2c_pxa_start_message(i2c); + +- while (timeout-- && i2c->msg_num > 0) { ++ while (i2c->msg_num > 0 && --timeout) { + i2c_pxa_handler(0, i2c); + udelay(10); + } +diff -urN linux-2.6.27.19-5.1/drivers/i2c/i2c-core.c linux-2.6.27.23-0.1.1/drivers/i2c/i2c-core.c +--- linux-2.6.27.19-5.1/drivers/i2c/i2c-core.c 2009-06-16 13:54:17.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/i2c/i2c-core.c 2009-06-16 13:40:24.000000000 +0100 +@@ -1795,7 +1795,8 @@ + case I2C_SMBUS_QUICK: + msg[0].len = 0; + /* Special case: The read/write field is used as data */ +- msg[0].flags = flags | (read_write==I2C_SMBUS_READ)?I2C_M_RD:0; ++ msg[0].flags = flags | (read_write == I2C_SMBUS_READ ? ++ I2C_M_RD : 0); + num = 1; + break; + case I2C_SMBUS_BYTE: +diff -urN linux-2.6.27.19-5.1/drivers/ide/ide-iops.c linux-2.6.27.23-0.1.1/drivers/ide/ide-iops.c +--- linux-2.6.27.19-5.1/drivers/ide/ide-iops.c 2009-06-16 13:54:17.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/ide/ide-iops.c 2009-06-16 13:40:30.000000000 +0100 +@@ -325,6 +325,8 @@ + u8 io_32bit = drive->io_32bit; + u8 mmio = (hwif->host_flags & IDE_HFLAG_MMIO) ? 1 : 0; + ++ len++; ++ + if (io_32bit) { + unsigned long uninitialized_var(flags); + +diff -urN linux-2.6.27.19-5.1/drivers/ide/pci/hpt366.c linux-2.6.27.23-0.1.1/drivers/ide/pci/hpt366.c +--- linux-2.6.27.19-5.1/drivers/ide/pci/hpt366.c 2009-06-16 13:54:17.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/ide/pci/hpt366.c 2009-06-16 13:40:30.000000000 +0100 +@@ -114,6 +114,8 @@ + * the register setting lists into the table indexed by the clock selected + * - set the correct hwif->ultra_mask for each individual chip + * - add Ultra and MW DMA mode filtering for the HPT37[24] based SATA cards ++ * - stop resetting HPT370's state machine before each DMA transfer as that has ++ * caused more harm than good + * Sergei Shtylyov, or + */ + +@@ -134,7 +136,7 @@ + #define DRV_NAME "hpt366" + + /* various tuning parameters */ +-#define HPT_RESET_STATE_ENGINE ++#undef HPT_RESET_STATE_ENGINE + #undef HPT_DELAY_INTERRUPT + #define HPT_SERIALIZE_IO 0 + +diff -urN linux-2.6.27.19-5.1/drivers/infiniband/hw/ehca/ehca_main.c linux-2.6.27.23-0.1.1/drivers/infiniband/hw/ehca/ehca_main.c +--- linux-2.6.27.19-5.1/drivers/infiniband/hw/ehca/ehca_main.c 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/infiniband/hw/ehca/ehca_main.c 2009-06-16 13:40:47.000000000 +0100 +@@ -52,7 +52,7 @@ + #include "ehca_tools.h" + #include "hcp_if.h" + +-#define HCAD_VERSION "0026" ++#define HCAD_VERSION "0027" + + MODULE_LICENSE("Dual BSD/GPL"); + MODULE_AUTHOR("Christoph Raisch "); +diff -urN linux-2.6.27.19-5.1/drivers/infiniband/hw/ehca/ehca_qp.c linux-2.6.27.23-0.1.1/drivers/infiniband/hw/ehca/ehca_qp.c +--- linux-2.6.27.19-5.1/drivers/infiniband/hw/ehca/ehca_qp.c 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/infiniband/hw/ehca/ehca_qp.c 2009-06-16 13:40:47.000000000 +0100 +@@ -457,7 +457,7 @@ + ib_device); + struct ib_ucontext *context = NULL; + u64 h_ret; +- int is_llqp = 0, has_srq = 0; ++ int is_llqp = 0, has_srq = 0, is_user = 0; + int qp_type, max_send_sge, max_recv_sge, ret; + + /* h_call's out parameters */ +@@ -599,9 +599,6 @@ + } + } + +- if (pd->uobject && udata) +- context = pd->uobject->context; +- + my_qp = kmem_cache_zalloc(qp_cache, GFP_KERNEL); + if (!my_qp) { + ehca_err(pd->device, "pd=%p not enough memory to alloc qp", pd); +@@ -609,6 +606,11 @@ + return ERR_PTR(-ENOMEM); + } + ++ if (pd->uobject && udata) { ++ is_user = 1; ++ context = pd->uobject->context; ++ } ++ + atomic_set(&my_qp->nr_events, 0); + init_waitqueue_head(&my_qp->wait_completion); + spin_lock_init(&my_qp->spinlock_s); +@@ -697,7 +699,7 @@ + (parms.squeue.is_small || parms.rqueue.is_small); + } + +- h_ret = hipz_h_alloc_resource_qp(shca->ipz_hca_handle, &parms); ++ h_ret = hipz_h_alloc_resource_qp(shca->ipz_hca_handle, &parms, is_user); + if (h_ret != H_SUCCESS) { + ehca_err(pd->device, "h_alloc_resource_qp() failed h_ret=%li", + h_ret); +@@ -759,18 +761,20 @@ + goto create_qp_exit2; + } + +- my_qp->sq_map.entries = my_qp->ipz_squeue.queue_length / +- my_qp->ipz_squeue.qe_size; +- my_qp->sq_map.map = vmalloc(my_qp->sq_map.entries * +- sizeof(struct ehca_qmap_entry)); +- if (!my_qp->sq_map.map) { +- ehca_err(pd->device, "Couldn't allocate squeue " +- "map ret=%i", ret); +- goto create_qp_exit3; +- } +- INIT_LIST_HEAD(&my_qp->sq_err_node); +- /* to avoid the generation of bogus flush CQEs */ +- reset_queue_map(&my_qp->sq_map); ++ if (!is_user) { ++ my_qp->sq_map.entries = my_qp->ipz_squeue.queue_length / ++ my_qp->ipz_squeue.qe_size; ++ my_qp->sq_map.map = vmalloc(my_qp->sq_map.entries * ++ sizeof(struct ehca_qmap_entry)); ++ if (!my_qp->sq_map.map) { ++ ehca_err(pd->device, "Couldn't allocate squeue " ++ "map ret=%i", ret); ++ goto create_qp_exit3; ++ } ++ INIT_LIST_HEAD(&my_qp->sq_err_node); ++ /* to avoid the generation of bogus flush CQEs */ ++ reset_queue_map(&my_qp->sq_map); ++ } + } + + if (HAS_RQ(my_qp)) { +@@ -782,20 +786,21 @@ + "and pages ret=%i", ret); + goto create_qp_exit4; + } +- +- my_qp->rq_map.entries = my_qp->ipz_rqueue.queue_length / +- my_qp->ipz_rqueue.qe_size; +- my_qp->rq_map.map = vmalloc(my_qp->rq_map.entries * +- sizeof(struct ehca_qmap_entry)); +- if (!my_qp->rq_map.map) { +- ehca_err(pd->device, "Couldn't allocate squeue " +- "map ret=%i", ret); +- goto create_qp_exit5; ++ if (!is_user) { ++ my_qp->rq_map.entries = my_qp->ipz_rqueue.queue_length / ++ my_qp->ipz_rqueue.qe_size; ++ my_qp->rq_map.map = vmalloc(my_qp->rq_map.entries * ++ sizeof(struct ehca_qmap_entry)); ++ if (!my_qp->rq_map.map) { ++ ehca_err(pd->device, "Couldn't allocate squeue " ++ "map ret=%i", ret); ++ goto create_qp_exit5; ++ } ++ INIT_LIST_HEAD(&my_qp->rq_err_node); ++ /* to avoid the generation of bogus flush CQEs */ ++ reset_queue_map(&my_qp->rq_map); + } +- INIT_LIST_HEAD(&my_qp->rq_err_node); +- /* to avoid the generation of bogus flush CQEs */ +- reset_queue_map(&my_qp->rq_map); +- } else if (init_attr->srq) { ++ } else if (init_attr->srq && !is_user) { + /* this is a base QP, use the queue map of the SRQ */ + my_qp->rq_map = my_srq->rq_map; + INIT_LIST_HEAD(&my_qp->rq_err_node); +@@ -908,7 +913,7 @@ + kfree(my_qp->mod_qp_parm); + + create_qp_exit6: +- if (HAS_RQ(my_qp)) ++ if (HAS_RQ(my_qp) && !is_user) + vfree(my_qp->rq_map.map); + + create_qp_exit5: +@@ -916,7 +921,7 @@ + ipz_queue_dtor(my_pd, &my_qp->ipz_rqueue); + + create_qp_exit4: +- if (HAS_SQ(my_qp)) ++ if (HAS_SQ(my_qp) && !is_user) + vfree(my_qp->sq_map.map); + + create_qp_exit3: +@@ -1224,6 +1229,7 @@ + u64 update_mask; + u64 h_ret; + int bad_wqe_cnt = 0; ++ int is_user = 0; + int squeue_locked = 0; + unsigned long flags = 0; + +@@ -1246,6 +1252,8 @@ + ret = ehca2ib_return_code(h_ret); + goto modify_qp_exit1; + } ++ if (ibqp->uobject) ++ is_user = 1; + + qp_cur_state = ehca2ib_qp_state(mqpcb->qp_state); + +@@ -1708,7 +1716,8 @@ + goto modify_qp_exit2; + } + } +- if ((qp_new_state == IB_QPS_ERR) && (qp_cur_state != IB_QPS_ERR)) { ++ if ((qp_new_state == IB_QPS_ERR) && (qp_cur_state != IB_QPS_ERR) ++ && !is_user) { + ret = check_for_left_cqes(my_qp, shca); + if (ret) + goto modify_qp_exit2; +@@ -1718,16 +1727,17 @@ + ipz_qeit_reset(&my_qp->ipz_rqueue); + ipz_qeit_reset(&my_qp->ipz_squeue); + +- if (qp_cur_state == IB_QPS_ERR) { ++ if (qp_cur_state == IB_QPS_ERR && !is_user) { + del_from_err_list(my_qp->send_cq, &my_qp->sq_err_node); + + if (HAS_RQ(my_qp)) + del_from_err_list(my_qp->recv_cq, + &my_qp->rq_err_node); + } +- reset_queue_map(&my_qp->sq_map); ++ if (!is_user) ++ reset_queue_map(&my_qp->sq_map); + +- if (HAS_RQ(my_qp)) ++ if (HAS_RQ(my_qp) && !is_user) + reset_queue_map(&my_qp->rq_map); + } + +@@ -2118,10 +2128,12 @@ + int ret; + u64 h_ret; + u8 port_num; ++ int is_user = 0; + enum ib_qp_type qp_type; + unsigned long flags; + + if (uobject) { ++ is_user = 1; + if (my_qp->mm_count_galpa || + my_qp->mm_count_rqueue || my_qp->mm_count_squeue) { + ehca_err(dev, "Resources still referenced in " +@@ -2148,10 +2160,10 @@ + * SRQs will never get into an error list and do not have a recv_cq, + * so we need to skip them here. + */ +- if (HAS_RQ(my_qp) && !IS_SRQ(my_qp)) ++ if (HAS_RQ(my_qp) && !IS_SRQ(my_qp) && !is_user) + del_from_err_list(my_qp->recv_cq, &my_qp->rq_err_node); + +- if (HAS_SQ(my_qp)) ++ if (HAS_SQ(my_qp) && !is_user) + del_from_err_list(my_qp->send_cq, &my_qp->sq_err_node); + + /* now wait until all pending events have completed */ +@@ -2189,13 +2201,13 @@ + + if (HAS_RQ(my_qp)) { + ipz_queue_dtor(my_pd, &my_qp->ipz_rqueue); +- +- vfree(my_qp->rq_map.map); ++ if (!is_user) ++ vfree(my_qp->rq_map.map); + } + if (HAS_SQ(my_qp)) { + ipz_queue_dtor(my_pd, &my_qp->ipz_squeue); +- +- vfree(my_qp->sq_map.map); ++ if (!is_user) ++ vfree(my_qp->sq_map.map); + } + kmem_cache_free(qp_cache, my_qp); + atomic_dec(&shca->num_qps); +diff -urN linux-2.6.27.19-5.1/drivers/infiniband/hw/ehca/hcp_if.c linux-2.6.27.23-0.1.1/drivers/infiniband/hw/ehca/hcp_if.c +--- linux-2.6.27.19-5.1/drivers/infiniband/hw/ehca/hcp_if.c 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/infiniband/hw/ehca/hcp_if.c 2009-06-16 13:40:47.000000000 +0100 +@@ -284,7 +284,7 @@ + param->act_pages = (u32)outs[4]; + + if (ret == H_SUCCESS) +- hcp_galpas_ctor(&cq->galpas, outs[5], outs[6]); ++ hcp_galpas_ctor(&cq->galpas, 0, outs[5], outs[6]); + + if (ret == H_NOT_ENOUGH_RESOURCES) + ehca_gen_err("Not enough resources. ret=%li", ret); +@@ -293,7 +293,7 @@ + } + + u64 hipz_h_alloc_resource_qp(const struct ipz_adapter_handle adapter_handle, +- struct ehca_alloc_qp_parms *parms) ++ struct ehca_alloc_qp_parms *parms, int is_user) + { + u64 ret; + u64 allocate_controls, max_r10_reg, r11, r12; +@@ -359,7 +359,7 @@ + (u32)EHCA_BMASK_GET(H_ALL_RES_QP_RQUEUE_SIZE_PAGES, outs[4]); + + if (ret == H_SUCCESS) +- hcp_galpas_ctor(&parms->galpas, outs[6], outs[6]); ++ hcp_galpas_ctor(&parms->galpas, is_user, outs[6], outs[6]); + + if (ret == H_NOT_ENOUGH_RESOURCES) + ehca_gen_err("Not enough resources. ret=%li", ret); +diff -urN linux-2.6.27.19-5.1/drivers/infiniband/hw/ehca/hcp_if.h linux-2.6.27.23-0.1.1/drivers/infiniband/hw/ehca/hcp_if.h +--- linux-2.6.27.19-5.1/drivers/infiniband/hw/ehca/hcp_if.h 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/infiniband/hw/ehca/hcp_if.h 2009-06-16 13:40:47.000000000 +0100 +@@ -78,7 +78,7 @@ + * initialize resources, create empty QPPTs (2 rings). + */ + u64 hipz_h_alloc_resource_qp(const struct ipz_adapter_handle adapter_handle, +- struct ehca_alloc_qp_parms *parms); ++ struct ehca_alloc_qp_parms *parms, int is_user); + + u64 hipz_h_query_port(const struct ipz_adapter_handle adapter_handle, + const u8 port_id, +diff -urN linux-2.6.27.19-5.1/drivers/infiniband/hw/ehca/hcp_phyp.c linux-2.6.27.23-0.1.1/drivers/infiniband/hw/ehca/hcp_phyp.c +--- linux-2.6.27.19-5.1/drivers/infiniband/hw/ehca/hcp_phyp.c 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/infiniband/hw/ehca/hcp_phyp.c 2009-06-16 13:40:47.000000000 +0100 +@@ -54,12 +54,15 @@ + return 0; + } + +-int hcp_galpas_ctor(struct h_galpas *galpas, ++int hcp_galpas_ctor(struct h_galpas *galpas, int is_user, + u64 paddr_kernel, u64 paddr_user) + { +- int ret = hcall_map_page(paddr_kernel, &galpas->kernel.fw_handle); +- if (ret) +- return ret; ++ if (!is_user) { ++ int ret = hcall_map_page(paddr_kernel, &galpas->kernel.fw_handle); ++ if (ret) ++ return ret; ++ } else ++ galpas->kernel.fw_handle = NULL; + + galpas->user.fw_handle = paddr_user; + +diff -urN linux-2.6.27.19-5.1/drivers/infiniband/hw/ehca/hcp_phyp.h linux-2.6.27.23-0.1.1/drivers/infiniband/hw/ehca/hcp_phyp.h +--- linux-2.6.27.19-5.1/drivers/infiniband/hw/ehca/hcp_phyp.h 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/infiniband/hw/ehca/hcp_phyp.h 2009-06-16 13:40:47.000000000 +0100 +@@ -78,7 +78,7 @@ + *(volatile u64 __force *)addr = value; + } + +-int hcp_galpas_ctor(struct h_galpas *galpas, ++int hcp_galpas_ctor(struct h_galpas *galpas, int is_user, + u64 paddr_kernel, u64 paddr_user); + + int hcp_galpas_dtor(struct h_galpas *galpas); +diff -urN linux-2.6.27.19-5.1/drivers/infiniband/hw/ehca/ipz_pt_fn.c linux-2.6.27.23-0.1.1/drivers/infiniband/hw/ehca/ipz_pt_fn.c +--- linux-2.6.27.19-5.1/drivers/infiniband/hw/ehca/ipz_pt_fn.c 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/infiniband/hw/ehca/ipz_pt_fn.c 2009-06-16 13:40:47.000000000 +0100 +@@ -220,10 +220,13 @@ + queue->small_page = NULL; + + /* allocate queue page pointers */ +- queue->queue_pages = vmalloc(nr_of_pages * sizeof(void *)); ++ queue->queue_pages = kmalloc(nr_of_pages * sizeof(void *), GFP_KERNEL); + if (!queue->queue_pages) { +- ehca_gen_err("Couldn't allocate queue page list"); +- return 0; ++ queue->queue_pages = vmalloc(nr_of_pages * sizeof(void *)); ++ if (!queue->queue_pages) { ++ ehca_gen_err("Couldn't allocate queue page list"); ++ return 0; ++ } + } + memset(queue->queue_pages, 0, nr_of_pages * sizeof(void *)); + +@@ -240,7 +243,10 @@ + ipz_queue_ctor_exit0: + ehca_gen_err("Couldn't alloc pages queue=%p " + "nr_of_pages=%x", queue, nr_of_pages); +- vfree(queue->queue_pages); ++ if (is_vmalloc_addr(queue->queue_pages)) ++ vfree(queue->queue_pages); ++ else ++ kfree(queue->queue_pages); + + return 0; + } +@@ -262,7 +268,10 @@ + free_page((unsigned long)queue->queue_pages[i]); + } + +- vfree(queue->queue_pages); ++ if (is_vmalloc_addr(queue->queue_pages)) ++ vfree(queue->queue_pages); ++ else ++ kfree(queue->queue_pages); + + return 1; + } +diff -urN linux-2.6.27.19-5.1/drivers/infiniband/hw/ipath/ipath_verbs.c linux-2.6.27.23-0.1.1/drivers/infiniband/hw/ipath/ipath_verbs.c +--- linux-2.6.27.19-5.1/drivers/infiniband/hw/ipath/ipath_verbs.c 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/infiniband/hw/ipath/ipath_verbs.c 2009-06-16 13:40:47.000000000 +0100 +@@ -340,9 +340,16 @@ + int acc; + int ret; + unsigned long flags; ++ struct ipath_devdata *dd = to_idev(qp->ibqp.device)->dd; + + spin_lock_irqsave(&qp->s_lock, flags); + ++ if (qp->ibqp.qp_type != IB_QPT_SMI && ++ !(dd->ipath_flags & IPATH_LINKACTIVE)) { ++ ret = -ENETDOWN; ++ goto bail; ++ } ++ + /* Check that state is OK to post send. */ + if (unlikely(!(ib_ipath_state_ops[qp->state] & IPATH_POST_SEND_OK))) + goto bail_inval; +diff -urN linux-2.6.27.19-5.1/drivers/infiniband/hw/nes/nes_cm.c linux-2.6.27.23-0.1.1/drivers/infiniband/hw/nes/nes_cm.c +--- linux-2.6.27.19-5.1/drivers/infiniband/hw/nes/nes_cm.c 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/infiniband/hw/nes/nes_cm.c 2009-06-16 13:40:47.000000000 +0100 +@@ -2474,12 +2474,14 @@ + int ret = 0; + struct nes_vnic *nesvnic; + struct nes_device *nesdev; ++ struct nes_ib_device *nesibdev; + + nesvnic = to_nesvnic(nesqp->ibqp.device); + if (!nesvnic) + return -EINVAL; + + nesdev = nesvnic->nesdev; ++ nesibdev = nesvnic->nesibdev; + + nes_debug(NES_DBG_CM, "netdev refcnt = %u.\n", + atomic_read(&nesvnic->netdev->refcnt)); +@@ -2491,6 +2493,8 @@ + } else { + /* Need to free the Last Streaming Mode Message */ + if (nesqp->ietf_frame) { ++ if (nesqp->lsmm_mr) ++ nesibdev->ibdev.dereg_mr(nesqp->lsmm_mr); + pci_free_consistent(nesdev->pcidev, + nesqp->private_data_len+sizeof(struct ietf_mpa_frame), + nesqp->ietf_frame, nesqp->ietf_frame_pbase); +@@ -2524,6 +2528,10 @@ + struct iw_cm_event cm_event; + struct nes_hw_qp_wqe *wqe; + struct nes_v4_quad nes_quad; ++ struct nes_ib_device *nesibdev; ++ struct ib_mr *ibmr = NULL; ++ struct ib_phys_buf ibphysbuf; ++ struct nes_pd *nespd; + u32 crc_value; + int ret; + +@@ -2584,6 +2592,26 @@ + if (cm_id->remote_addr.sin_addr.s_addr != + cm_id->local_addr.sin_addr.s_addr) { + u64temp = (unsigned long)nesqp; ++ nesibdev = nesvnic->nesibdev; ++ nespd = nesqp->nespd; ++ ibphysbuf.addr = nesqp->ietf_frame_pbase; ++ ibphysbuf.size = conn_param->private_data_len + ++ sizeof(struct ietf_mpa_frame); ++ ibmr = nesibdev->ibdev.reg_phys_mr((struct ib_pd *)nespd, ++ &ibphysbuf, 1, ++ IB_ACCESS_LOCAL_WRITE, ++ (u64 *)&nesqp->ietf_frame); ++ if (!ibmr) { ++ nes_debug(NES_DBG_CM, "Unable to register memory region" ++ "for lSMM for cm_node = %p \n", ++ cm_node); ++ return -ENOMEM; ++ } ++ ++ ibmr->pd = &nespd->ibpd; ++ ibmr->device = nespd->ibpd.device; ++ nesqp->lsmm_mr = ibmr; ++ + u64temp |= NES_SW_CONTEXT_ALIGN>>1; + set_wqe_64bit_value(wqe->wqe_words, + NES_IWARP_SQ_WQE_COMP_CTX_LOW_IDX, +@@ -2594,14 +2622,13 @@ + wqe->wqe_words[NES_IWARP_SQ_WQE_TOTAL_PAYLOAD_IDX] = + cpu_to_le32(conn_param->private_data_len + + sizeof(struct ietf_mpa_frame)); +- wqe->wqe_words[NES_IWARP_SQ_WQE_FRAG0_LOW_IDX] = +- cpu_to_le32((u32)nesqp->ietf_frame_pbase); +- wqe->wqe_words[NES_IWARP_SQ_WQE_FRAG0_HIGH_IDX] = +- cpu_to_le32((u32)((u64)nesqp->ietf_frame_pbase >> 32)); ++ set_wqe_64bit_value(wqe->wqe_words, ++ NES_IWARP_SQ_WQE_FRAG0_LOW_IDX, ++ (u64)nesqp->ietf_frame); + wqe->wqe_words[NES_IWARP_SQ_WQE_LENGTH0_IDX] = + cpu_to_le32(conn_param->private_data_len + + sizeof(struct ietf_mpa_frame)); +- wqe->wqe_words[NES_IWARP_SQ_WQE_STAG0_IDX] = 0; ++ wqe->wqe_words[NES_IWARP_SQ_WQE_STAG0_IDX] = ibmr->lkey; + + nesqp->nesqp_context->ird_ord_sizes |= + cpu_to_le32(NES_QPCONTEXT_ORDIRD_LSMM_PRESENT | +diff -urN linux-2.6.27.19-5.1/drivers/infiniband/hw/nes/nes_verbs.c linux-2.6.27.23-0.1.1/drivers/infiniband/hw/nes/nes_verbs.c +--- linux-2.6.27.19-5.1/drivers/infiniband/hw/nes/nes_verbs.c 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/infiniband/hw/nes/nes_verbs.c 2009-06-16 13:40:47.000000000 +0100 +@@ -1338,8 +1338,10 @@ + NES_QPCONTEXT_MISC_RQ_SIZE_SHIFT); + nesqp->nesqp_context->misc |= cpu_to_le32((u32)nesqp->hwqp.sq_encoded_size << + NES_QPCONTEXT_MISC_SQ_SIZE_SHIFT); ++ if (!udata) { + nesqp->nesqp_context->misc |= cpu_to_le32(NES_QPCONTEXT_MISC_PRIV_EN); + nesqp->nesqp_context->misc |= cpu_to_le32(NES_QPCONTEXT_MISC_FAST_REGISTER_EN); ++ } + nesqp->nesqp_context->cqs = cpu_to_le32(nesqp->nesscq->hw_cq.cq_number + + ((u32)nesqp->nesrcq->hw_cq.cq_number << 16)); + u64temp = (u64)nesqp->hwqp.sq_pbase; +diff -urN linux-2.6.27.19-5.1/drivers/infiniband/hw/nes/nes_verbs.h linux-2.6.27.23-0.1.1/drivers/infiniband/hw/nes/nes_verbs.h +--- linux-2.6.27.19-5.1/drivers/infiniband/hw/nes/nes_verbs.h 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/infiniband/hw/nes/nes_verbs.h 2009-06-16 13:40:47.000000000 +0100 +@@ -134,6 +134,7 @@ + struct ietf_mpa_frame *ietf_frame; + dma_addr_t ietf_frame_pbase; + wait_queue_head_t state_waitq; ++ struct ib_mr *lsmm_mr; + unsigned long socket; + struct nes_hw_qp hwqp; + struct work_struct work; +diff -urN linux-2.6.27.19-5.1/drivers/isdn/gigaset/bas-gigaset.c linux-2.6.27.23-0.1.1/drivers/isdn/gigaset/bas-gigaset.c +--- linux-2.6.27.19-5.1/drivers/isdn/gigaset/bas-gigaset.c 2009-06-16 13:54:33.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/isdn/gigaset/bas-gigaset.c 2009-06-16 13:40:39.000000000 +0100 +@@ -46,6 +46,9 @@ + /* length limit according to Siemens 3070usb-protokoll.doc ch. 2.1 */ + #define IF_WRITEBUF 264 + ++/* interrupt pipe message size according to ibid. ch. 2.2 */ ++#define IP_MSGSIZE 3 ++ + /* Values for the Gigaset 307x */ + #define USB_GIGA_VENDOR_ID 0x0681 + #define USB_3070_PRODUCT_ID 0x0001 +@@ -110,7 +113,7 @@ + unsigned char *rcvbuf; /* AT reply receive buffer */ + + struct urb *urb_int_in; /* URB for interrupt pipe */ +- unsigned char int_in_buf[3]; ++ unsigned char *int_in_buf; + + spinlock_t lock; /* locks all following */ + int basstate; /* bitmap (BS_*) */ +@@ -657,7 +660,7 @@ + } + + /* drop incomplete packets even if the missing bytes wouldn't matter */ +- if (unlikely(urb->actual_length < 3)) { ++ if (unlikely(urb->actual_length < IP_MSGSIZE)) { + dev_warn(cs->dev, "incomplete interrupt packet (%d bytes)\n", + urb->actual_length); + goto resubmit; +@@ -2127,6 +2130,7 @@ + static void gigaset_freecshw(struct cardstate *cs) + { + /* timers, URBs and rcvbuf are disposed of in disconnect */ ++ kfree(cs->hw.bas->int_in_buf); + kfree(cs->hw.bas); + cs->hw.bas = NULL; + } +@@ -2232,6 +2236,12 @@ + } + hostif = interface->cur_altsetting; + } ++ ucs->int_in_buf = kmalloc(IP_MSGSIZE, GFP_KERNEL); ++ if (!ucs->int_in_buf) { ++ kfree(ucs); ++ pr_err("out of memory\n"); ++ return 0; ++ } + + /* Reject application specific interfaces + */ +@@ -2290,7 +2300,7 @@ + usb_fill_int_urb(ucs->urb_int_in, udev, + usb_rcvintpipe(udev, + (endpoint->bEndpointAddress) & 0x0f), +- ucs->int_in_buf, 3, read_int_callback, cs, ++ ucs->int_in_buf, IP_MSGSIZE, read_int_callback, cs, + endpoint->bInterval); + if ((rc = usb_submit_urb(ucs->urb_int_in, GFP_KERNEL)) != 0) { + dev_err(cs->dev, "could not submit interrupt URB: %s\n", +diff -urN linux-2.6.27.19-5.1/drivers/md/dm.c linux-2.6.27.23-0.1.1/drivers/md/dm.c +--- linux-2.6.27.19-5.1/drivers/md/dm.c 2009-06-16 13:54:17.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/md/dm.c 2009-06-16 13:40:23.000000000 +0100 +@@ -1801,6 +1801,7 @@ + md->queue->backing_dev_info.congested_fn = dm_any_congested; + md->queue->backing_dev_info.congested_data = md; + blk_queue_make_request(md->queue, dm_request); ++ blk_queue_ordered(md->queue, QUEUE_ORDERED_DRAIN, NULL); + blk_queue_bounce_limit(md->queue, BLK_BOUNCE_ANY); + md->queue->unplug_fn = dm_unplug_all; + blk_queue_merge_bvec(md->queue, dm_merge_bvec); +@@ -1948,12 +1949,15 @@ + md->map = t; + dm_table_set_restrictions(t, q); + dm_table_set_integrity(t, md); +- if (!(dm_table_get_mode(t) & FMODE_WRITE)) { +- set_disk_ro(md->disk, 1); +- } else { ++ write_unlock_irqrestore(&md->map_lock, flags); ++ ++ dm_get_table(md); ++ if (dm_table_get_mode(md->map) & FMODE_WRITE) { + set_disk_ro(md->disk, 0); ++ } else { ++ set_disk_ro(md->disk, 1); + } +- write_unlock_irqrestore(&md->map_lock, flags); ++ dm_table_put(md->map); + + return 0; + } +diff -urN linux-2.6.27.19-5.1/drivers/md/dm-crypt.c linux-2.6.27.23-0.1.1/drivers/md/dm-crypt.c +--- linux-2.6.27.19-5.1/drivers/md/dm-crypt.c 2009-06-16 13:54:17.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/md/dm-crypt.c 2009-06-16 13:40:23.000000000 +0100 +@@ -59,6 +59,7 @@ + }; + + struct dm_crypt_request { ++ struct convert_context *ctx; + struct scatterlist sg_in; + struct scatterlist sg_out; + }; +@@ -336,6 +337,18 @@ + atomic_set(&ctx->pending, 1); + } + ++static struct dm_crypt_request *dmreq_of_req(struct crypt_config *cc, ++ struct ablkcipher_request *req) ++{ ++ return (struct dm_crypt_request *)((char *)req + cc->dmreq_start); ++} ++ ++static struct ablkcipher_request *req_of_dmreq(struct crypt_config *cc, ++ struct dm_crypt_request *dmreq) ++{ ++ return (struct ablkcipher_request *)((char *)dmreq - cc->dmreq_start); ++} ++ + static int crypt_convert_block(struct crypt_config *cc, + struct convert_context *ctx, + struct ablkcipher_request *req) +@@ -346,10 +359,11 @@ + u8 *iv; + int r = 0; + +- dmreq = (struct dm_crypt_request *)((char *)req + cc->dmreq_start); ++ dmreq = dmreq_of_req(cc, req); + iv = (u8 *)ALIGN((unsigned long)(dmreq + 1), + crypto_ablkcipher_alignmask(cc->tfm) + 1); + ++ dmreq->ctx = ctx; + sg_init_table(&dmreq->sg_in, 1); + sg_set_page(&dmreq->sg_in, bv_in->bv_page, 1 << SECTOR_SHIFT, + bv_in->bv_offset + ctx->offset_in); +@@ -396,8 +410,9 @@ + cc->req = mempool_alloc(cc->req_pool, GFP_NOIO); + ablkcipher_request_set_tfm(cc->req, cc->tfm); + ablkcipher_request_set_callback(cc->req, CRYPTO_TFM_REQ_MAY_BACKLOG | +- CRYPTO_TFM_REQ_MAY_SLEEP, +- kcryptd_async_done, ctx); ++ CRYPTO_TFM_REQ_MAY_SLEEP, ++ kcryptd_async_done, ++ dmreq_of_req(cc, cc->req)); + } + + /* +@@ -757,7 +772,8 @@ + static void kcryptd_async_done(struct crypto_async_request *async_req, + int error) + { +- struct convert_context *ctx = async_req->data; ++ struct dm_crypt_request *dmreq = async_req->data; ++ struct convert_context *ctx = dmreq->ctx; + struct dm_crypt_io *io = container_of(ctx, struct dm_crypt_io, ctx); + struct crypt_config *cc = io->target->private; + +@@ -766,7 +782,7 @@ + return; + } + +- mempool_free(ablkcipher_request_cast(async_req), cc->req_pool); ++ mempool_free(req_of_dmreq(cc, dmreq), cc->req_pool); + + if (!atomic_dec_and_test(&ctx->pending)) + return; +diff -urN linux-2.6.27.19-5.1/drivers/md/dm-io.c linux-2.6.27.23-0.1.1/drivers/md/dm-io.c +--- linux-2.6.27.19-5.1/drivers/md/dm-io.c 2009-06-16 13:54:17.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/md/dm-io.c 2009-06-16 13:40:23.000000000 +0100 +@@ -292,6 +292,8 @@ + (PAGE_SIZE >> SECTOR_SHIFT)); + num_bvecs = 1 + min_t(int, bio_get_nr_vecs(where->bdev), + num_bvecs); ++ if (unlikely(num_bvecs > BIO_MAX_PAGES)) ++ num_bvecs = BIO_MAX_PAGES; + bio = bio_alloc_bioset(GFP_NOIO, num_bvecs, io->client->bios); + bio->bi_sector = where->sector + (where->count - remaining); + bio->bi_bdev = where->bdev; +diff -urN linux-2.6.27.19-5.1/drivers/md/dm-ioctl.c linux-2.6.27.23-0.1.1/drivers/md/dm-ioctl.c +--- linux-2.6.27.19-5.1/drivers/md/dm-ioctl.c 2009-06-16 13:54:17.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/md/dm-ioctl.c 2009-06-16 13:40:23.000000000 +0100 +@@ -704,7 +704,8 @@ + char *new_name = (char *) param + param->data_start; + + if (new_name < param->data || +- invalid_str(new_name, (void *) param + param_size)) { ++ invalid_str(new_name, (void *) param + param_size) || ++ strlen(new_name) > DM_NAME_LEN - 1) { + DMWARN("Invalid new logical volume name supplied."); + return -EINVAL; + } +diff -urN linux-2.6.27.19-5.1/drivers/md/dm-mpath.c linux-2.6.27.23-0.1.1/drivers/md/dm-mpath.c +--- linux-2.6.27.19-5.1/drivers/md/dm-mpath.c 2009-06-16 13:54:17.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/md/dm-mpath.c 2009-06-16 13:40:23.000000000 +0100 +@@ -462,6 +462,9 @@ + m->pg_init_count++; + m->pg_init_required = 0; + list_for_each_entry(tmp, &pgpath->pg->pgpaths, list) { ++ /* Skip disabled paths */ ++ if (!tmp->path.dev) ++ continue; + queue_work(kmpath_handlerd, &tmp->activate_path); + m->pg_init_in_progress++; + } +@@ -641,9 +644,6 @@ + dm_put_device(ti, p->path.dev); + goto bad; + } +- } else { +- /* Play safe and detach hardware handler */ +- scsi_dh_detach(q); + } + } + +@@ -1112,9 +1112,8 @@ + return limit_reached; + } + +-static void pg_init_done(struct dm_path *path, int errors) ++static void pg_init_done(struct pgpath *pgpath, int errors) + { +- struct pgpath *pgpath = path_to_pgpath(path); + struct priority_group *pg = pgpath->pg; + struct multipath *m = pg->m; + unsigned long flags; +@@ -1128,8 +1127,8 @@ + errors = 0; + break; + } +- DMERR("Cannot failover device because scsi_dh_%s was not " +- "loaded.", m->hw_handler_name); ++ DMERR("Cannot failover device %s because scsi_dh_%s was not " ++ "loaded.", pgpath->path.pdev, m->hw_handler_name); + /* + * Fail path for now, so we do not ping pong + */ +@@ -1142,6 +1141,10 @@ + */ + bypass_pg(m, pg, 1); + break; ++ case SCSI_DH_DEV_OFFLINED: ++ DMWARN("Device %s offlined.", pgpath->path.pdev); ++ errors = 0; ++ break; + /* TODO: For SCSI_DH_RETRY we should wait a couple seconds */ + case SCSI_DH_RETRY: + case SCSI_DH_IMM_RETRY: +@@ -1161,7 +1164,8 @@ + + spin_lock_irqsave(&m->lock, flags); + if (errors) { +- DMERR("Could not failover device. Error %d.", errors); ++ DMERR("Could not failover device %s. Error %d.", ++ pgpath->path.pdev, errors); + m->current_pgpath = NULL; + m->current_pg = NULL; + } else if (!m->pg_init_required) { +@@ -1183,7 +1187,10 @@ + + if (pgpath->path.dev) + ret = scsi_dh_activate(bdev_get_queue(pgpath->path.dev->bdev)); +- pg_init_done(&pgpath->path, ret); ++ else ++ DMWARN("Activate offlined path %s", pgpath->path.pdev); ++ ++ pg_init_done(pgpath, ret); + } + + /* +diff -urN linux-2.6.27.19-5.1/drivers/md/dm-table.c linux-2.6.27.23-0.1.1/drivers/md/dm-table.c +--- linux-2.6.27.19-5.1/drivers/md/dm-table.c 2009-06-16 13:54:17.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/md/dm-table.c 2009-06-16 13:40:23.000000000 +0100 +@@ -411,31 +411,33 @@ + } + + /* +- * This upgrades the mode on an already open dm_dev. Being ++ * This upgrades the mode on an already open dm_dev, being + * careful to leave things as they were if we fail to reopen the +- * device. ++ * device and not to touch the existing bdev field in case ++ * it is accessed concurrently inside dm_table_any_congested(). + */ + static int upgrade_mode(struct dm_dev *dd, int new_mode, struct mapped_device *md) + { + int r; +- struct dm_dev dd_copy; +- dev_t dev = dd->bdev->bd_dev; ++ struct dm_dev dd_new, dd_old; + +- dd_copy = *dd; ++ dd_new = dd_old = *dd; + +- dd->mode = new_mode; +- dd->bdev = NULL; +- r = open_dev(dd, dev, md); ++ dd_new.mode = new_mode; ++ dd_new.bdev = NULL; ++ ++ r = open_dev(&dd_new, dd->bdev->bd_dev, md); + if (r == -EROFS) { +- dd->mode &= ~FMODE_WRITE; +- r = open_dev(dd, dev, md); ++ dd_new.mode &= ~FMODE_WRITE; ++ r = open_dev(&dd_new, dd->bdev->bd_dev, md); + } +- if (!r) +- close_dev(&dd_copy, md); +- else +- *dd = dd_copy; ++ if (r) ++ return r; + +- return r; ++ dd->mode |= new_mode; ++ close_dev(&dd_old, md); ++ ++ return 0; + } + + /* +diff -urN linux-2.6.27.19-5.1/drivers/md/raid10.c linux-2.6.27.23-0.1.1/drivers/md/raid10.c +--- linux-2.6.27.19-5.1/drivers/md/raid10.c 2009-06-16 13:54:17.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/md/raid10.c 2009-06-16 13:40:23.000000000 +0100 +@@ -1231,6 +1231,7 @@ + /* for reconstruct, we always reschedule after a read. + * for resync, only after all reads + */ ++ rdev_dec_pending(conf->mirrors[d].rdev, conf->mddev); + if (test_bit(R10BIO_IsRecover, &r10_bio->state) || + atomic_dec_and_test(&r10_bio->remaining)) { + /* we have read all the blocks, +@@ -1238,7 +1239,6 @@ + */ + reschedule_retry(r10_bio); + } +- rdev_dec_pending(conf->mirrors[d].rdev, conf->mddev); + } + + static void end_sync_write(struct bio *bio, int error) +@@ -1259,11 +1259,13 @@ + + update_head_pos(i, r10_bio); + ++ rdev_dec_pending(conf->mirrors[d].rdev, mddev); + while (atomic_dec_and_test(&r10_bio->remaining)) { + if (r10_bio->master_bio == NULL) { + /* the primary of several recovery bios */ +- md_done_sync(mddev, r10_bio->sectors, 1); ++ sector_t s = r10_bio->sectors; + put_buf(r10_bio); ++ md_done_sync(mddev, s, 1); + break; + } else { + r10bio_t *r10_bio2 = (r10bio_t *)r10_bio->master_bio; +@@ -1271,7 +1273,6 @@ + r10_bio = r10_bio2; + } + } +- rdev_dec_pending(conf->mirrors[d].rdev, mddev); + } + + /* +@@ -1744,8 +1745,6 @@ + if (!go_faster && conf->nr_waiting) + msleep_interruptible(1000); + +- bitmap_cond_end_sync(mddev->bitmap, sector_nr); +- + /* Again, very different code for resync and recovery. + * Both must result in an r10bio with a list of bios that + * have bi_end_io, bi_sector, bi_bdev set, +@@ -1881,6 +1880,8 @@ + /* resync. Schedule a read for every block at this virt offset */ + int count = 0; + ++ bitmap_cond_end_sync(mddev->bitmap, sector_nr); ++ + if (!bitmap_start_sync(mddev->bitmap, sector_nr, + &sync_blocks, mddev->degraded) && + !conf->fullsync && !test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) { +@@ -2005,13 +2006,13 @@ + /* There is nowhere to write, so all non-sync + * drives must be failed, so try the next chunk... + */ +- { +- sector_t sec = max_sector - sector_nr; +- sectors_skipped += sec; ++ if (sector_nr + max_sync < max_sector) ++ max_sector = sector_nr + max_sync; ++ ++ sectors_skipped += (max_sector - sector_nr); + chunks_skipped ++; + sector_nr = max_sector; + goto skipped; +- } + } + + static int run(mddev_t *mddev) +diff -urN linux-2.6.27.19-5.1/drivers/md/raid1.c linux-2.6.27.23-0.1.1/drivers/md/raid1.c +--- linux-2.6.27.19-5.1/drivers/md/raid1.c 2009-06-16 13:54:17.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/md/raid1.c 2009-06-16 13:40:23.000000000 +0100 +@@ -1233,8 +1233,9 @@ + update_head_pos(mirror, r1_bio); + + if (atomic_dec_and_test(&r1_bio->remaining)) { +- md_done_sync(mddev, r1_bio->sectors, uptodate); ++ sector_t s = r1_bio->sectors; + put_buf(r1_bio); ++ md_done_sync(mddev, s, uptodate); + } + } + +diff -urN linux-2.6.27.19-5.1/drivers/media/common/tuners/tda8290.c linux-2.6.27.23-0.1.1/drivers/media/common/tuners/tda8290.c +--- linux-2.6.27.19-5.1/drivers/media/common/tuners/tda8290.c 2009-06-16 13:54:48.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/media/common/tuners/tda8290.c 2009-06-16 13:40:55.000000000 +0100 +@@ -726,7 +726,8 @@ + fe->ops.analog_ops.info.name = name; + + if (priv->ver & TDA8290) { +- tda8290_init_tuner(fe); ++ if (priv->ver & (TDA8275 | TDA8275A)) ++ tda8290_init_tuner(fe); + tda8290_init_if(fe); + } else if (priv->ver & TDA8295) + tda8295_init_if(fe); +diff -urN linux-2.6.27.19-5.1/drivers/media/dvb/frontends/s5h1409.c linux-2.6.27.23-0.1.1/drivers/media/dvb/frontends/s5h1409.c +--- linux-2.6.27.19-5.1/drivers/media/dvb/frontends/s5h1409.c 2009-06-16 13:54:47.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/media/dvb/frontends/s5h1409.c 2009-06-16 13:40:47.000000000 +0100 +@@ -542,9 +542,6 @@ + + s5h1409_enable_modulation(fe, p->u.vsb.modulation); + +- /* Allow the demod to settle */ +- msleep(100); +- + if (fe->ops.tuner_ops.set_params) { + if (fe->ops.i2c_gate_ctrl) fe->ops.i2c_gate_ctrl(fe, 1); + fe->ops.tuner_ops.set_params(fe, p); +@@ -557,6 +554,10 @@ + s5h1409_set_qam_interleave_mode(fe); + } + ++ /* Issue a reset to the demod so it knows to resync against the ++ newly tuned frequency */ ++ s5h1409_softreset(fe); ++ + return 0; + } + +diff -urN linux-2.6.27.19-5.1/drivers/media/video/cx23885/cx23885-417.c linux-2.6.27.23-0.1.1/drivers/media/video/cx23885/cx23885-417.c +--- linux-2.6.27.19-5.1/drivers/media/video/cx23885/cx23885-417.c 2009-06-16 13:54:48.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/media/video/cx23885/cx23885-417.c 2009-06-16 13:40:54.000000000 +0100 +@@ -1585,7 +1585,8 @@ + + list_for_each(list, &cx23885_devlist) { + h = list_entry(list, struct cx23885_dev, devlist); +- if (h->v4l_device->minor == minor) { ++ if (h->v4l_device && ++ h->v4l_device->minor == minor) { + dev = h; + break; + } +diff -urN linux-2.6.27.19-5.1/drivers/media/video/cx23885/cx23885-video.c linux-2.6.27.23-0.1.1/drivers/media/video/cx23885/cx23885-video.c +--- linux-2.6.27.19-5.1/drivers/media/video/cx23885/cx23885-video.c 2009-06-16 13:54:48.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/media/video/cx23885/cx23885-video.c 2009-06-16 13:40:54.000000000 +0100 +@@ -733,12 +733,13 @@ + + list_for_each(list, &cx23885_devlist) { + h = list_entry(list, struct cx23885_dev, devlist); +- if (h->video_dev->minor == minor) { ++ if (h->video_dev && ++ h->video_dev->minor == minor) { + dev = h; + type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + } + if (h->vbi_dev && +- h->vbi_dev->minor == minor) { ++ h->vbi_dev->minor == minor) { + dev = h; + type = V4L2_BUF_TYPE_VBI_CAPTURE; + } +diff -urN linux-2.6.27.19-5.1/drivers/media/video/ivtv/ivtv-ioctl.c linux-2.6.27.23-0.1.1/drivers/media/video/ivtv/ivtv-ioctl.c +--- linux-2.6.27.19-5.1/drivers/media/video/ivtv/ivtv-ioctl.c 2009-06-16 13:54:48.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/media/video/ivtv/ivtv-ioctl.c 2009-06-16 13:40:54.000000000 +0100 +@@ -1744,6 +1744,18 @@ + break; + } + ++ case IVTV_IOC_DMA_FRAME: ++ case VIDEO_GET_PTS: ++ case VIDEO_GET_FRAME_COUNT: ++ case VIDEO_GET_EVENT: ++ case VIDEO_PLAY: ++ case VIDEO_STOP: ++ case VIDEO_FREEZE: ++ case VIDEO_CONTINUE: ++ case VIDEO_COMMAND: ++ case VIDEO_TRY_COMMAND: ++ return ivtv_decoder_ioctls(file, cmd, (void *)arg); ++ + default: + return -EINVAL; + } +@@ -1786,18 +1798,6 @@ + ivtv_vapi(itv, CX2341X_DEC_SET_AUDIO_MODE, 2, itv->audio_bilingual_mode, itv->audio_stereo_mode); + return 0; + +- case IVTV_IOC_DMA_FRAME: +- case VIDEO_GET_PTS: +- case VIDEO_GET_FRAME_COUNT: +- case VIDEO_GET_EVENT: +- case VIDEO_PLAY: +- case VIDEO_STOP: +- case VIDEO_FREEZE: +- case VIDEO_CONTINUE: +- case VIDEO_COMMAND: +- case VIDEO_TRY_COMMAND: +- return ivtv_decoder_ioctls(filp, cmd, (void *)arg); +- + default: + break; + } +diff -urN linux-2.6.27.19-5.1/drivers/media/video/uvc/uvc_driver.c linux-2.6.27.23-0.1.1/drivers/media/video/uvc/uvc_driver.c +--- linux-2.6.27.19-5.1/drivers/media/video/uvc/uvc_driver.c 2009-06-16 13:54:48.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/media/video/uvc/uvc_driver.c 2009-06-16 13:40:54.000000000 +0100 +@@ -1663,7 +1663,7 @@ + return uvc_video_suspend(&dev->video); + } + +-static int uvc_resume(struct usb_interface *intf) ++static int __uvc_resume(struct usb_interface *intf, int reset) + { + struct uvc_device *dev = usb_get_intfdata(intf); + int ret; +@@ -1672,7 +1672,7 @@ + intf->cur_altsetting->desc.bInterfaceNumber); + + if (intf->cur_altsetting->desc.bInterfaceSubClass == SC_VIDEOCONTROL) { +- if ((ret = uvc_ctrl_resume_device(dev)) < 0) ++ if (reset && (ret = uvc_ctrl_resume_device(dev)) < 0) + return ret; + + return uvc_status_resume(dev); +@@ -1687,6 +1687,16 @@ + return uvc_video_resume(&dev->video); + } + ++static int uvc_resume(struct usb_interface *intf) ++{ ++ return __uvc_resume(intf, 0); ++} ++ ++static int uvc_reset_resume(struct usb_interface *intf) ++{ ++ return __uvc_resume(intf, 1); ++} ++ + /* ------------------------------------------------------------------------ + * Driver initialization and cleanup + */ +@@ -1952,6 +1962,7 @@ + .disconnect = uvc_disconnect, + .suspend = uvc_suspend, + .resume = uvc_resume, ++ .reset_resume = uvc_reset_resume, + .id_table = uvc_ids, + .supports_autosuspend = 1, + }, +diff -urN linux-2.6.27.19-5.1/drivers/misc/hpilo.c linux-2.6.27.23-0.1.1/drivers/misc/hpilo.c +--- linux-2.6.27.19-5.1/drivers/misc/hpilo.c 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/misc/hpilo.c 2009-06-16 13:40:46.000000000 +0100 +@@ -710,6 +710,7 @@ + + static struct pci_device_id ilo_devices[] = { + { PCI_DEVICE(PCI_VENDOR_ID_COMPAQ, 0xB204) }, ++ { PCI_DEVICE(PCI_VENDOR_ID_HP, 0x3307) }, + { } + }; + MODULE_DEVICE_TABLE(pci, ilo_devices); +diff -urN linux-2.6.27.19-5.1/drivers/misc/thinkpad_acpi.c linux-2.6.27.23-0.1.1/drivers/misc/thinkpad_acpi.c +--- linux-2.6.27.19-5.1/drivers/misc/thinkpad_acpi.c 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/misc/thinkpad_acpi.c 2009-06-16 13:40:46.000000000 +0100 +@@ -283,11 +283,17 @@ + + static struct workqueue_struct *tpacpi_wq; + ++enum led_status_t { ++ TPACPI_LED_OFF = 0, ++ TPACPI_LED_ON, ++ TPACPI_LED_BLINK, ++}; ++ + /* Special LED class that can defer work */ + struct tpacpi_led_classdev { + struct led_classdev led_classdev; + struct work_struct work; +- enum led_brightness new_brightness; ++ enum led_status_t new_state; + unsigned int led; + }; + +@@ -3504,7 +3510,7 @@ + container_of(work, struct tpacpi_led_classdev, work); + + if (likely(tpacpi_lifecycle == TPACPI_LIFE_RUNNING)) +- light_set_status((data->new_brightness != LED_OFF)); ++ light_set_status((data->new_state != TPACPI_LED_OFF)); + } + + static void light_sysfs_set(struct led_classdev *led_cdev, +@@ -3514,7 +3520,8 @@ + container_of(led_cdev, + struct tpacpi_led_classdev, + led_classdev); +- data->new_brightness = brightness; ++ data->new_state = (brightness != LED_OFF) ? ++ TPACPI_LED_ON : TPACPI_LED_OFF; + queue_work(tpacpi_wq, &data->work); + } + +@@ -4021,12 +4028,6 @@ + TPACPI_LED_EC_HLMS = 0x0e, /* EC reg to select led to command */ + }; + +-enum led_status_t { +- TPACPI_LED_OFF = 0, +- TPACPI_LED_ON, +- TPACPI_LED_BLINK, +-}; +- + static enum led_access_mode led_supported; + + TPACPI_HANDLE(led, ec, "SLED", /* 570 */ +@@ -4120,23 +4121,13 @@ + return rc; + } + +-static void led_sysfs_set_status(unsigned int led, +- enum led_brightness brightness) +-{ +- led_set_status(led, +- (brightness == LED_OFF) ? +- TPACPI_LED_OFF : +- (tpacpi_led_state_cache[led] == TPACPI_LED_BLINK) ? +- TPACPI_LED_BLINK : TPACPI_LED_ON); +-} +- + static void led_set_status_worker(struct work_struct *work) + { + struct tpacpi_led_classdev *data = + container_of(work, struct tpacpi_led_classdev, work); + + if (likely(tpacpi_lifecycle == TPACPI_LIFE_RUNNING)) +- led_sysfs_set_status(data->led, data->new_brightness); ++ led_set_status(data->led, data->new_state); + } + + static void led_sysfs_set(struct led_classdev *led_cdev, +@@ -4145,7 +4136,13 @@ + struct tpacpi_led_classdev *data = container_of(led_cdev, + struct tpacpi_led_classdev, led_classdev); + +- data->new_brightness = brightness; ++ if (brightness == LED_OFF) ++ data->new_state = TPACPI_LED_OFF; ++ else if (tpacpi_led_state_cache[data->led] != TPACPI_LED_BLINK) ++ data->new_state = TPACPI_LED_ON; ++ else ++ data->new_state = TPACPI_LED_BLINK; ++ + queue_work(tpacpi_wq, &data->work); + } + +@@ -4163,7 +4160,7 @@ + } else if ((*delay_on != 500) || (*delay_off != 500)) + return -EINVAL; + +- data->new_brightness = TPACPI_LED_BLINK; ++ data->new_state = TPACPI_LED_BLINK; + queue_work(tpacpi_wq, &data->work); + + return 0; +@@ -6867,7 +6864,7 @@ + * if it is not there yet. + */ + #define IBM_BIOS_MODULE_ALIAS(__type) \ +- MODULE_ALIAS("dmi:bvnIBM:bvr" __type "ET??WW") ++ MODULE_ALIAS("dmi:bvnIBM:bvr" __type "ET??WW*") + + /* Non-ancient thinkpads */ + MODULE_ALIAS("dmi:bvnIBM:*:svnIBM:*:pvrThinkPad*:rvnIBM:*"); +@@ -6876,9 +6873,9 @@ + /* Ancient thinkpad BIOSes have to be identified by + * BIOS type or model number, and there are far less + * BIOS types than model numbers... */ +-IBM_BIOS_MODULE_ALIAS("I[B,D,H,I,M,N,O,T,W,V,Y,Z]"); +-IBM_BIOS_MODULE_ALIAS("1[0,3,6,8,A-G,I,K,M-P,S,T]"); +-IBM_BIOS_MODULE_ALIAS("K[U,X-Z]"); ++IBM_BIOS_MODULE_ALIAS("I[BDHIMNOTWVYZ]"); ++IBM_BIOS_MODULE_ALIAS("1[0368A-GIKM-PST]"); ++IBM_BIOS_MODULE_ALIAS("K[UX-Z]"); + + MODULE_AUTHOR("Borislav Deianov, Henrique de Moraes Holschuh"); + MODULE_DESCRIPTION(TPACPI_DESC); +diff -urN linux-2.6.27.19-5.1/drivers/mmc/card/mmc_test.c linux-2.6.27.23-0.1.1/drivers/mmc/card/mmc_test.c +--- linux-2.6.27.19-5.1/drivers/mmc/card/mmc_test.c 2009-06-16 13:54:17.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/mmc/card/mmc_test.c 2009-06-16 13:40:30.000000000 +0100 +@@ -494,7 +494,7 @@ + + sg_init_one(&sg, test->buffer, 512); + +- ret = mmc_test_simple_transfer(test, &sg, 1, 0, 1, 512, 1); ++ ret = mmc_test_simple_transfer(test, &sg, 1, 0, 1, 512, 0); + if (ret) + return ret; + +diff -urN linux-2.6.27.19-5.1/drivers/mmc/host/s3cmci.c linux-2.6.27.23-0.1.1/drivers/mmc/host/s3cmci.c +--- linux-2.6.27.19-5.1/drivers/mmc/host/s3cmci.c 2009-06-16 13:54:17.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/mmc/host/s3cmci.c 2009-06-16 13:40:30.000000000 +0100 +@@ -756,8 +756,7 @@ + host->mem->start + host->sdidata); + + if (!setup_ok) { +- s3c2410_dma_config(host->dma, 4, +- (S3C2410_DCON_HWTRIG | S3C2410_DCON_CH0_SDI)); ++ s3c2410_dma_config(host->dma, 4, 0); + s3c2410_dma_set_buffdone_fn(host->dma, + s3cmci_dma_done_callback); + s3c2410_dma_setflags(host->dma, S3C2410_DMAF_AUTOSTART); +diff -urN linux-2.6.27.19-5.1/drivers/mmc/host/sdhci.c linux-2.6.27.23-0.1.1/drivers/mmc/host/sdhci.c +--- linux-2.6.27.19-5.1/drivers/mmc/host/sdhci.c 2009-06-16 13:54:17.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/mmc/host/sdhci.c 2009-06-16 13:40:30.000000000 +0100 +@@ -1690,7 +1690,9 @@ + #endif + + #ifdef CONFIG_LEDS_CLASS +- host->led.name = mmc_hostname(mmc); ++ snprintf(host->led_name, sizeof(host->led_name), ++ "%s::", mmc_hostname(mmc)); ++ host->led.name = host->led_name; + host->led.brightness = LED_OFF; + host->led.default_trigger = mmc_hostname(mmc); + host->led.brightness_set = sdhci_led_control; +diff -urN linux-2.6.27.19-5.1/drivers/mmc/host/sdhci.h linux-2.6.27.23-0.1.1/drivers/mmc/host/sdhci.h +--- linux-2.6.27.19-5.1/drivers/mmc/host/sdhci.h 2009-06-16 13:54:17.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/mmc/host/sdhci.h 2009-06-16 13:40:30.000000000 +0100 +@@ -220,6 +220,7 @@ + + #ifdef CONFIG_LEDS_CLASS + struct led_classdev led; /* LED control */ ++ char led_name[32]; + #endif + + spinlock_t lock; /* Mutex */ +diff -urN linux-2.6.27.19-5.1/drivers/mtd/devices/mtd_dataflash.c linux-2.6.27.23-0.1.1/drivers/mtd/devices/mtd_dataflash.c +--- linux-2.6.27.19-5.1/drivers/mtd/devices/mtd_dataflash.c 2009-06-16 13:54:24.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/mtd/devices/mtd_dataflash.c 2009-06-16 13:40:30.000000000 +0100 +@@ -628,7 +628,8 @@ + if (!(info->flags & IS_POW2PS)) + return info; + } +- } ++ } else ++ return info; + } + } + +diff -urN linux-2.6.27.19-5.1/drivers/net/b44.c linux-2.6.27.23-0.1.1/drivers/net/b44.c +--- linux-2.6.27.19-5.1/drivers/net/b44.c 2009-06-16 13:54:24.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/net/b44.c 2009-06-16 13:40:30.000000000 +0100 +@@ -750,7 +750,7 @@ + dest_idx * sizeof(dest_desc), + DMA_BIDIRECTIONAL); + +- ssb_dma_sync_single_for_device(bp->sdev, le32_to_cpu(src_desc->addr), ++ ssb_dma_sync_single_for_device(bp->sdev, dest_map->mapping, + RX_PKT_BUF_SZ, + DMA_FROM_DEVICE); + } +diff -urN linux-2.6.27.19-5.1/drivers/net/bonding/bonding.h linux-2.6.27.23-0.1.1/drivers/net/bonding/bonding.h +--- linux-2.6.27.19-5.1/drivers/net/bonding/bonding.h 2009-06-16 13:54:24.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/net/bonding/bonding.h 2009-06-16 13:40:30.000000000 +0100 +@@ -248,6 +248,12 @@ + return (struct bonding *)slave->dev->master->priv; + } + ++static inline bool bond_is_lb(const struct bonding *bond) ++{ ++ return bond->params.mode == BOND_MODE_TLB ++ || bond->params.mode == BOND_MODE_ALB; ++} ++ + #define BOND_FOM_NONE 0 + #define BOND_FOM_ACTIVE 1 + #define BOND_FOM_FOLLOW 2 +diff -urN linux-2.6.27.19-5.1/drivers/net/bonding/bond_main.c linux-2.6.27.23-0.1.1/drivers/net/bonding/bond_main.c +--- linux-2.6.27.19-5.1/drivers/net/bonding/bond_main.c 2009-06-16 13:54:24.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/net/bonding/bond_main.c 2009-06-16 13:40:30.000000000 +0100 +@@ -3516,11 +3516,26 @@ + } + break; + case NETDEV_CHANGE: +- /* +- * TODO: is this what we get if somebody +- * sets up a hierarchical bond, then rmmod's +- * one of the slave bonding devices? +- */ ++ if (bond->params.mode == BOND_MODE_8023AD || bond_is_lb(bond)) { ++ struct slave *slave; ++ ++ slave = bond_get_slave_by_dev(bond, slave_dev); ++ if (slave) { ++ u16 old_speed = slave->speed; ++ u16 old_duplex = slave->duplex; ++ ++ bond_update_speed_duplex(slave); ++ ++ if (bond_is_lb(bond)) ++ break; ++ ++ if (old_speed != slave->speed) ++ bond_3ad_adapter_speed_changed(slave); ++ if (old_duplex != slave->duplex) ++ bond_3ad_adapter_duplex_changed(slave); ++ } ++ } ++ + break; + case NETDEV_DOWN: + /* +diff -urN linux-2.6.27.19-5.1/drivers/net/ehea/ehea.h linux-2.6.27.23-0.1.1/drivers/net/ehea/ehea.h +--- linux-2.6.27.19-5.1/drivers/net/ehea/ehea.h 2009-06-16 13:54:17.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/net/ehea/ehea.h 2009-06-16 13:40:30.000000000 +0100 +@@ -40,7 +40,7 @@ + #include + + #define DRV_NAME "ehea" +-#define DRV_VERSION "EHEA_0094-02" ++#define DRV_VERSION "EHEA_0094-03" + + /* eHEA capability flags */ + #define DLPAR_PORT_ADD_REM 1 +diff -urN linux-2.6.27.19-5.1/drivers/net/ehea/ehea_main.c linux-2.6.27.23-0.1.1/drivers/net/ehea/ehea_main.c +--- linux-2.6.27.19-5.1/drivers/net/ehea/ehea_main.c 2009-06-16 13:54:17.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/net/ehea/ehea_main.c 2009-06-16 13:40:30.000000000 +0100 +@@ -542,14 +542,17 @@ + x &= (arr_len - 1); + + pref = skb_array[x]; +- prefetchw(pref); +- prefetchw(pref + EHEA_CACHE_LINE); ++ if (pref) { ++ prefetchw(pref); ++ prefetchw(pref + EHEA_CACHE_LINE); ++ ++ pref = (skb_array[x]->data); ++ prefetch(pref); ++ prefetch(pref + EHEA_CACHE_LINE); ++ prefetch(pref + EHEA_CACHE_LINE * 2); ++ prefetch(pref + EHEA_CACHE_LINE * 3); ++ } + +- pref = (skb_array[x]->data); +- prefetch(pref); +- prefetch(pref + EHEA_CACHE_LINE); +- prefetch(pref + EHEA_CACHE_LINE * 2); +- prefetch(pref + EHEA_CACHE_LINE * 3); + skb = skb_array[skb_index]; + skb_array[skb_index] = NULL; + return skb; +@@ -566,12 +569,14 @@ + x &= (arr_len - 1); + + pref = skb_array[x]; +- prefetchw(pref); +- prefetchw(pref + EHEA_CACHE_LINE); +- +- pref = (skb_array[x]->data); +- prefetchw(pref); +- prefetchw(pref + EHEA_CACHE_LINE); ++ if (pref) { ++ prefetchw(pref); ++ prefetchw(pref + EHEA_CACHE_LINE); ++ ++ pref = (skb_array[x]->data); ++ prefetchw(pref); ++ prefetchw(pref + EHEA_CACHE_LINE); ++ } + + skb = skb_array[wqe_index]; + skb_array[wqe_index] = NULL; +diff -urN linux-2.6.27.19-5.1/drivers/net/forcedeth.c linux-2.6.27.23-0.1.1/drivers/net/forcedeth.c +--- linux-2.6.27.19-5.1/drivers/net/forcedeth.c 2009-06-16 13:54:24.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/net/forcedeth.c 2009-06-16 13:40:30.000000000 +0100 +@@ -5967,6 +5967,9 @@ + for (i = 0;i <= np->register_size/sizeof(u32); i++) + writel(np->saved_config_space[i], base+i*sizeof(u32)); + ++ /* restore phy state, including autoneg */ ++ phy_init(dev); ++ + netif_device_attach(dev); + if (netif_running(dev)) { + rc = nv_open(dev); +diff -urN linux-2.6.27.19-5.1/drivers/net/mv643xx_eth.c linux-2.6.27.23-0.1.1/drivers/net/mv643xx_eth.c +--- linux-2.6.27.19-5.1/drivers/net/mv643xx_eth.c 2009-06-16 13:54:24.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/net/mv643xx_eth.c 2009-06-16 13:40:30.000000000 +0100 +@@ -1060,7 +1060,6 @@ + struct mib_counters *p = &mp->mib_counters; + + p->good_octets_received += mib_read(mp, 0x00); +- p->good_octets_received += (u64)mib_read(mp, 0x04) << 32; + p->bad_octets_received += mib_read(mp, 0x08); + p->internal_mac_transmit_err += mib_read(mp, 0x0c); + p->good_frames_received += mib_read(mp, 0x10); +@@ -1074,7 +1073,6 @@ + p->frames_512_to_1023_octets += mib_read(mp, 0x30); + p->frames_1024_to_max_octets += mib_read(mp, 0x34); + p->good_octets_sent += mib_read(mp, 0x38); +- p->good_octets_sent += (u64)mib_read(mp, 0x3c) << 32; + p->good_frames_sent += mib_read(mp, 0x40); + p->excessive_collision += mib_read(mp, 0x44); + p->multicast_frames_sent += mib_read(mp, 0x48); +diff -urN linux-2.6.27.19-5.1/drivers/net/r8169.c linux-2.6.27.23-0.1.1/drivers/net/r8169.c +--- linux-2.6.27.19-5.1/drivers/net/r8169.c 2009-06-16 13:54:24.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/net/r8169.c 2009-06-16 13:40:30.000000000 +0100 +@@ -423,6 +423,22 @@ + RTL_FEATURE_GMII = (1 << 2), + }; + ++struct rtl8169_counters { ++ __le64 tx_packets; ++ __le64 rx_packets; ++ __le64 tx_errors; ++ __le32 rx_errors; ++ __le16 rx_missed; ++ __le16 align_errors; ++ __le32 tx_one_collision; ++ __le32 tx_multi_collision; ++ __le64 rx_unicast; ++ __le64 rx_broadcast; ++ __le32 rx_multicast; ++ __le16 tx_aborted; ++ __le16 tx_underun; ++}; ++ + struct rtl8169_private { + void __iomem *mmio_addr; /* memory map physical address */ + struct pci_dev *pci_dev; /* Index of PCI device */ +@@ -465,6 +481,7 @@ + unsigned features; + + struct mii_if_info mii; ++ struct rtl8169_counters counters; + }; + + MODULE_AUTHOR("Realtek and the Linux r8169 crew "); +@@ -811,76 +828,83 @@ + { + struct rtl8169_private *tp = netdev_priv(dev); + void __iomem *ioaddr = tp->mmio_addr; +- int auto_nego, giga_ctrl; +- +- auto_nego = mdio_read(ioaddr, MII_ADVERTISE); +- auto_nego &= ~(ADVERTISE_10HALF | ADVERTISE_10FULL | +- ADVERTISE_100HALF | ADVERTISE_100FULL); +- giga_ctrl = mdio_read(ioaddr, MII_CTRL1000); +- giga_ctrl &= ~(ADVERTISE_1000FULL | ADVERTISE_1000HALF); ++ int giga_ctrl, bmcr; + + if (autoneg == AUTONEG_ENABLE) { ++ int auto_nego; ++ ++ auto_nego = mdio_read(ioaddr, MII_ADVERTISE); + auto_nego |= (ADVERTISE_10HALF | ADVERTISE_10FULL | + ADVERTISE_100HALF | ADVERTISE_100FULL); +- giga_ctrl |= ADVERTISE_1000FULL | ADVERTISE_1000HALF; +- } else { +- if (speed == SPEED_10) +- auto_nego |= ADVERTISE_10HALF | ADVERTISE_10FULL; +- else if (speed == SPEED_100) +- auto_nego |= ADVERTISE_100HALF | ADVERTISE_100FULL; +- else if (speed == SPEED_1000) +- giga_ctrl |= ADVERTISE_1000FULL | ADVERTISE_1000HALF; +- +- if (duplex == DUPLEX_HALF) +- auto_nego &= ~(ADVERTISE_10FULL | ADVERTISE_100FULL); +- +- if (duplex == DUPLEX_FULL) +- auto_nego &= ~(ADVERTISE_10HALF | ADVERTISE_100HALF); ++ auto_nego |= ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM; + +- /* This tweak comes straight from Realtek's driver. */ +- if ((speed == SPEED_100) && (duplex == DUPLEX_HALF) && +- ((tp->mac_version == RTL_GIGA_MAC_VER_13) || +- (tp->mac_version == RTL_GIGA_MAC_VER_16))) { +- auto_nego = ADVERTISE_100HALF | ADVERTISE_CSMA; +- } +- } ++ giga_ctrl = mdio_read(ioaddr, MII_CTRL1000); ++ giga_ctrl &= ~(ADVERTISE_1000FULL | ADVERTISE_1000HALF); + +- /* The 8100e/8101e/8102e do Fast Ethernet only. */ +- if ((tp->mac_version == RTL_GIGA_MAC_VER_07) || +- (tp->mac_version == RTL_GIGA_MAC_VER_08) || +- (tp->mac_version == RTL_GIGA_MAC_VER_09) || +- (tp->mac_version == RTL_GIGA_MAC_VER_10) || +- (tp->mac_version == RTL_GIGA_MAC_VER_13) || +- (tp->mac_version == RTL_GIGA_MAC_VER_14) || +- (tp->mac_version == RTL_GIGA_MAC_VER_15) || +- (tp->mac_version == RTL_GIGA_MAC_VER_16)) { +- if ((giga_ctrl & (ADVERTISE_1000FULL | ADVERTISE_1000HALF)) && +- netif_msg_link(tp)) { ++ /* The 8100e/8101e/8102e do Fast Ethernet only. */ ++ if ((tp->mac_version != RTL_GIGA_MAC_VER_07) && ++ (tp->mac_version != RTL_GIGA_MAC_VER_08) && ++ (tp->mac_version != RTL_GIGA_MAC_VER_09) && ++ (tp->mac_version != RTL_GIGA_MAC_VER_10) && ++ (tp->mac_version != RTL_GIGA_MAC_VER_13) && ++ (tp->mac_version != RTL_GIGA_MAC_VER_14) && ++ (tp->mac_version != RTL_GIGA_MAC_VER_15) && ++ (tp->mac_version != RTL_GIGA_MAC_VER_16)) { ++ giga_ctrl |= ADVERTISE_1000FULL | ADVERTISE_1000HALF; ++ } else if (netif_msg_link(tp)) { + printk(KERN_INFO "%s: PHY does not support 1000Mbps.\n", + dev->name); + } +- giga_ctrl &= ~(ADVERTISE_1000FULL | ADVERTISE_1000HALF); +- } + +- auto_nego |= ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM; ++ bmcr = BMCR_ANENABLE | BMCR_ANRESTART; ++ ++ if ((tp->mac_version == RTL_GIGA_MAC_VER_11) || ++ (tp->mac_version == RTL_GIGA_MAC_VER_12) || ++ (tp->mac_version >= RTL_GIGA_MAC_VER_17)) { ++ /* ++ * Wake up the PHY. ++ * Vendor specific (0x1f) and reserved (0x0e) MII ++ * registers. ++ */ ++ mdio_write(ioaddr, 0x1f, 0x0000); ++ mdio_write(ioaddr, 0x0e, 0x0000); ++ } ++ ++ tp->phy_auto_nego_reg = auto_nego; ++ ++ mdio_write(ioaddr, MII_ADVERTISE, auto_nego); ++ mdio_write(ioaddr, MII_CTRL1000, giga_ctrl); ++ } else { ++ giga_ctrl = 0; ++ ++ if (speed == SPEED_10) ++ bmcr = 0; ++ else if (speed == SPEED_100) ++ bmcr = BMCR_SPEED100; ++ else ++ return -EINVAL; ++ ++ if (duplex == DUPLEX_FULL) ++ bmcr |= BMCR_FULLDPLX; + +- if ((tp->mac_version == RTL_GIGA_MAC_VER_11) || +- (tp->mac_version == RTL_GIGA_MAC_VER_12) || +- (tp->mac_version >= RTL_GIGA_MAC_VER_17)) { +- /* +- * Wake up the PHY. +- * Vendor specific (0x1f) and reserved (0x0e) MII registers. +- */ + mdio_write(ioaddr, 0x1f, 0x0000); +- mdio_write(ioaddr, 0x0e, 0x0000); + } + +- tp->phy_auto_nego_reg = auto_nego; + tp->phy_1000_ctrl_reg = giga_ctrl; + +- mdio_write(ioaddr, MII_ADVERTISE, auto_nego); +- mdio_write(ioaddr, MII_CTRL1000, giga_ctrl); +- mdio_write(ioaddr, MII_BMCR, BMCR_ANENABLE | BMCR_ANRESTART); ++ mdio_write(ioaddr, MII_BMCR, bmcr); ++ ++ if ((tp->mac_version == RTL_GIGA_MAC_VER_02) || ++ (tp->mac_version == RTL_GIGA_MAC_VER_03)) { ++ if ((speed == SPEED_100) && (autoneg != AUTONEG_ENABLE)) { ++ mdio_write(ioaddr, 0x17, 0x2138); ++ mdio_write(ioaddr, 0x0e, 0x0260); ++ } else { ++ mdio_write(ioaddr, 0x17, 0x2108); ++ mdio_write(ioaddr, 0x0e, 0x0000); ++ } ++ } ++ + return 0; + } + +@@ -1084,22 +1108,6 @@ + "tx_underrun", + }; + +-struct rtl8169_counters { +- __le64 tx_packets; +- __le64 rx_packets; +- __le64 tx_errors; +- __le32 rx_errors; +- __le16 rx_missed; +- __le16 align_errors; +- __le32 tx_one_collision; +- __le32 tx_multi_collision; +- __le64 rx_unicast; +- __le64 rx_broadcast; +- __le32 rx_multicast; +- __le16 tx_aborted; +- __le16 tx_underun; +-}; +- + static int rtl8169_get_sset_count(struct net_device *dev, int sset) + { + switch (sset) { +@@ -1110,16 +1118,21 @@ + } + } + +-static void rtl8169_get_ethtool_stats(struct net_device *dev, +- struct ethtool_stats *stats, u64 *data) ++static void rtl8169_update_counters(struct net_device *dev) + { + struct rtl8169_private *tp = netdev_priv(dev); + void __iomem *ioaddr = tp->mmio_addr; + struct rtl8169_counters *counters; + dma_addr_t paddr; + u32 cmd; ++ int wait = 1000; + +- ASSERT_RTNL(); ++ /* ++ * Some chips are unable to dump tally counters when the receiver ++ * is disabled. ++ */ ++ if ((RTL_R8(ChipCmd) & CmdRxEnb) == 0) ++ return; + + counters = pci_alloc_consistent(tp->pci_dev, sizeof(*counters), &paddr); + if (!counters) +@@ -1130,31 +1143,45 @@ + RTL_W32(CounterAddrLow, cmd); + RTL_W32(CounterAddrLow, cmd | CounterDump); + +- while (RTL_R32(CounterAddrLow) & CounterDump) { +- if (msleep_interruptible(1)) ++ while (wait--) { ++ if ((RTL_R32(CounterAddrLow) & CounterDump) == 0) { ++ /* copy updated counters */ ++ memcpy(&tp->counters, counters, sizeof(*counters)); + break; ++ } ++ udelay(10); + } + + RTL_W32(CounterAddrLow, 0); + RTL_W32(CounterAddrHigh, 0); + +- data[0] = le64_to_cpu(counters->tx_packets); +- data[1] = le64_to_cpu(counters->rx_packets); +- data[2] = le64_to_cpu(counters->tx_errors); +- data[3] = le32_to_cpu(counters->rx_errors); +- data[4] = le16_to_cpu(counters->rx_missed); +- data[5] = le16_to_cpu(counters->align_errors); +- data[6] = le32_to_cpu(counters->tx_one_collision); +- data[7] = le32_to_cpu(counters->tx_multi_collision); +- data[8] = le64_to_cpu(counters->rx_unicast); +- data[9] = le64_to_cpu(counters->rx_broadcast); +- data[10] = le32_to_cpu(counters->rx_multicast); +- data[11] = le16_to_cpu(counters->tx_aborted); +- data[12] = le16_to_cpu(counters->tx_underun); +- + pci_free_consistent(tp->pci_dev, sizeof(*counters), counters, paddr); + } + ++static void rtl8169_get_ethtool_stats(struct net_device *dev, ++ struct ethtool_stats *stats, u64 *data) ++{ ++ struct rtl8169_private *tp = netdev_priv(dev); ++ ++ ASSERT_RTNL(); ++ ++ rtl8169_update_counters(dev); ++ ++ data[0] = le64_to_cpu(tp->counters.tx_packets); ++ data[1] = le64_to_cpu(tp->counters.rx_packets); ++ data[2] = le64_to_cpu(tp->counters.tx_errors); ++ data[3] = le32_to_cpu(tp->counters.rx_errors); ++ data[4] = le16_to_cpu(tp->counters.rx_missed); ++ data[5] = le16_to_cpu(tp->counters.align_errors); ++ data[6] = le32_to_cpu(tp->counters.tx_one_collision); ++ data[7] = le32_to_cpu(tp->counters.tx_multi_collision); ++ data[8] = le64_to_cpu(tp->counters.rx_unicast); ++ data[9] = le64_to_cpu(tp->counters.rx_broadcast); ++ data[10] = le32_to_cpu(tp->counters.rx_multicast); ++ data[11] = le16_to_cpu(tp->counters.tx_aborted); ++ data[12] = le16_to_cpu(tp->counters.tx_underun); ++} ++ + static void rtl8169_get_strings(struct net_device *dev, u32 stringset, u8 *data) + { + switch(stringset) { +@@ -1825,8 +1852,7 @@ + if (!tp->pcie_cap && netif_msg_probe(tp)) + dev_info(&pdev->dev, "no PCI Express capability\n"); + +- /* Unneeded ? Don't mess with Mrs. Murphy. */ +- rtl8169_irq_mask_and_ack(ioaddr); ++ RTL_W16(IntrMask, 0x0000); + + /* Soft reset the chip. */ + RTL_W8(ChipCmd, CmdReset); +@@ -1838,6 +1864,8 @@ + msleep_interruptible(1); + } + ++ RTL_W16(IntrStatus, 0xffff); ++ + /* Identify chip attached to board */ + rtl8169_get_mac_version(tp, ioaddr); + +@@ -2805,13 +2833,6 @@ + opts1 |= FirstFrag; + } else { + len = skb->len; +- +- if (unlikely(len < ETH_ZLEN)) { +- if (skb_padto(skb, ETH_ZLEN)) +- goto err_update_stats; +- len = ETH_ZLEN; +- } +- + opts1 |= FirstFrag | LastFrag; + tp->tx_skb[entry].skb = skb; + } +@@ -2849,7 +2870,6 @@ + err_stop: + netif_stop_queue(dev); + ret = NETDEV_TX_BUSY; +-err_update_stats: + dev->stats.tx_dropped++; + goto out; + } +@@ -3255,6 +3275,9 @@ + struct rtl8169_private *tp = netdev_priv(dev); + struct pci_dev *pdev = tp->pci_dev; + ++ /* update counters before going down */ ++ rtl8169_update_counters(dev); ++ + rtl8169_down(dev); + + free_irq(dev->irq, dev); +diff -urN linux-2.6.27.19-5.1/drivers/net/sfc/sfc_resource/ci/efhw/common.h linux-2.6.27.23-0.1.1/drivers/net/sfc/sfc_resource/ci/efhw/common.h +--- linux-2.6.27.19-5.1/drivers/net/sfc/sfc_resource/ci/efhw/common.h 2009-06-16 13:54:17.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/net/sfc/sfc_resource/ci/efhw/common.h 2009-06-16 13:40:30.000000000 +0100 +@@ -41,6 +41,10 @@ + + #include + ++enum efhw_arch { ++ EFHW_ARCH_FALCON, ++}; ++ + typedef uint32_t efhw_buffer_addr_t; + #define EFHW_BUFFER_ADDR_FMT "[ba:%"PRIx32"]" + +diff -urN linux-2.6.27.19-5.1/drivers/net/sfc/sfc_resource/efx_vi_shm.c linux-2.6.27.23-0.1.1/drivers/net/sfc/sfc_resource/efx_vi_shm.c +--- linux-2.6.27.19-5.1/drivers/net/sfc/sfc_resource/efx_vi_shm.c 2009-06-16 13:54:17.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/net/sfc/sfc_resource/efx_vi_shm.c 2009-06-16 13:40:30.000000000 +0100 +@@ -498,7 +498,7 @@ + struct filter_resource_t **fh_out) + { + struct efx_vi_state *efx_state = vih; +- struct filter_resource *frs; ++ struct filter_resource *uninitialized_var(frs); + int rc; + + #if EFX_VI_STATIC_FILTERS +diff -urN linux-2.6.27.19-5.1/drivers/net/sfc/sfc_resource/falcon.c linux-2.6.27.23-0.1.1/drivers/net/sfc/sfc_resource/falcon.c +--- linux-2.6.27.19-5.1/drivers/net/sfc/sfc_resource/falcon.c 2009-06-16 13:54:17.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/net/sfc/sfc_resource/falcon.c 2009-06-16 13:40:30.000000000 +0100 +@@ -2090,7 +2090,7 @@ + filter_spec_cache_entry(struct efhw_nic *nic, int filter_idx) + { + EFHW_ASSERT(nic->filter_spec_cache); +- return &nic->filter_spec_cache[FALCON_FILTER_TBL_NUM + filter_idx]; ++ return &nic->filter_spec_cache[filter_idx]; + } + #endif + +diff -urN linux-2.6.27.19-5.1/drivers/net/sfc/sfc_resource/nic.c linux-2.6.27.23-0.1.1/drivers/net/sfc/sfc_resource/nic.c +--- linux-2.6.27.19-5.1/drivers/net/sfc/sfc_resource/nic.c 2009-06-16 13:54:17.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/net/sfc/sfc_resource/nic.c 2009-06-16 13:40:30.000000000 +0100 +@@ -47,6 +47,7 @@ + switch (device_id) { + case 0x0703: + case 0x6703: ++ dt->arch = EFHW_ARCH_FALCON; + dt->variant = 'A'; + switch (class_revision) { + case 0: +@@ -60,6 +61,7 @@ + } + break; + case 0x0710: ++ dt->arch = EFHW_ARCH_FALCON; + dt->variant = 'B'; + switch (class_revision) { + case 2: +diff -urN linux-2.6.27.19-5.1/drivers/net/sis190.c linux-2.6.27.23-0.1.1/drivers/net/sis190.c +--- linux-2.6.27.19-5.1/drivers/net/sis190.c 2009-06-16 13:54:24.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/net/sis190.c 2009-06-16 13:40:30.000000000 +0100 +@@ -317,6 +317,7 @@ + unsigned int type; + u32 feature; + } mii_chip_table[] = { ++ { "Atheros PHY AR8012", { 0x004d, 0xd020 }, LAN, 0 }, + { "Broadcom PHY BCM5461", { 0x0020, 0x60c0 }, LAN, F_PHY_BCM5461 }, + { "Broadcom PHY AC131", { 0x0143, 0xbc70 }, LAN, 0 }, + { "Agere PHY ET1101B", { 0x0282, 0xf010 }, LAN, 0 }, +diff -urN linux-2.6.27.19-5.1/drivers/net/usb/cdc_ether.c linux-2.6.27.23-0.1.1/drivers/net/usb/cdc_ether.c +--- linux-2.6.27.19-5.1/drivers/net/usb/cdc_ether.c 2009-06-16 13:54:17.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/net/usb/cdc_ether.c 2009-06-16 13:40:30.000000000 +0100 +@@ -559,6 +559,11 @@ + USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ETHERNET, + USB_CDC_PROTO_NONE), + .driver_info = (unsigned long) &cdc_info, ++}, { ++ /* Ericsson F3507g */ ++ USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x1900, USB_CLASS_COMM, ++ USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), ++ .driver_info = (unsigned long) &cdc_info, + }, + { }, // END + }; +diff -urN linux-2.6.27.19-5.1/drivers/net/usb/zaurus.c linux-2.6.27.23-0.1.1/drivers/net/usb/zaurus.c +--- linux-2.6.27.19-5.1/drivers/net/usb/zaurus.c 2009-06-16 13:54:17.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/net/usb/zaurus.c 2009-06-16 13:40:30.000000000 +0100 +@@ -341,6 +341,11 @@ + USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_MDLM, + USB_CDC_PROTO_NONE), + .driver_info = (unsigned long) &bogus_mdlm_info, ++}, { ++ /* Motorola MOTOMAGX phones */ ++ USB_DEVICE_AND_INTERFACE_INFO(0x22b8, 0x6425, USB_CLASS_COMM, ++ USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), ++ .driver_info = (unsigned long) &bogus_mdlm_info, + }, + + /* Olympus has some models with a Zaurus-compatible option. +diff -urN linux-2.6.27.19-5.1/drivers/net/wireless/ath5k/base.c linux-2.6.27.23-0.1.1/drivers/net/wireless/ath5k/base.c +--- linux-2.6.27.19-5.1/drivers/net/wireless/ath5k/base.c 2009-06-16 13:54:24.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/net/wireless/ath5k/base.c 2009-06-16 13:40:30.000000000 +0100 +@@ -2593,6 +2593,13 @@ + sc->led_pin = 1; + sc->led_on = 1; /* active high */ + } ++ /* Pin 3 on Foxconn chips used in Acer Aspire One (0x105b:e008) */ ++ if (pdev->subsystem_vendor == PCI_VENDOR_ID_FOXCONN) { ++ __set_bit(ATH_STAT_LEDSOFT, sc->status); ++ sc->led_pin = 3; ++ sc->led_on = 0; /* active low */ ++ } ++ + if (!test_bit(ATH_STAT_LEDSOFT, sc->status)) + goto out; + +diff -urN linux-2.6.27.19-5.1/drivers/net/wireless/ath5k/hw.c linux-2.6.27.23-0.1.1/drivers/net/wireless/ath5k/hw.c +--- linux-2.6.27.19-5.1/drivers/net/wireless/ath5k/hw.c 2009-06-16 13:54:24.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/net/wireless/ath5k/hw.c 2009-06-16 13:40:30.000000000 +0100 +@@ -3134,7 +3134,7 @@ + * Note2: Windows driver (ndiswrapper) sets this to + * 0x00000714 instead of 0x00000007 + */ +- if (ah->ah_version > AR5K_AR5211) ++ if (ah->ah_version >= AR5K_AR5211) + ath5k_hw_reg_write(ah, AR5K_KEYTABLE_TYPE_NULL, + AR5K_KEYTABLE_TYPE(entry)); + +diff -urN linux-2.6.27.19-5.1/drivers/net/wireless/ath9k/ath9k.h linux-2.6.27.23-0.1.1/drivers/net/wireless/ath9k/ath9k.h +--- linux-2.6.27.19-5.1/drivers/net/wireless/ath9k/ath9k.h 2009-06-16 13:54:24.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/net/wireless/ath9k/ath9k.h 2009-06-16 13:40:30.000000000 +0100 +@@ -591,8 +591,8 @@ + u8 iso[3]; + }; + +-#define REG_WRITE(_ah, _reg, _val) iowrite32(_val, _ah->ah_sh + _reg) +-#define REG_READ(_ah, _reg) ioread32(_ah->ah_sh + _reg) ++#define REG_WRITE(_ah, _reg, _val) ath9k_iowrite32((_ah), (_reg), (_val)) ++#define REG_READ(_ah, _reg) ath9k_ioread32((_ah), (_reg)) + + #define SM(_v, _f) (((_v) << _f##_S) & _f) + #define MS(_v, _f) (((_v) & _f) >> _f##_S) +diff -urN linux-2.6.27.19-5.1/drivers/net/wireless/ath9k/core.c linux-2.6.27.23-0.1.1/drivers/net/wireless/ath9k/core.c +--- linux-2.6.27.19-5.1/drivers/net/wireless/ath9k/core.c 2009-06-16 13:54:24.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/net/wireless/ath9k/core.c 2009-06-16 13:40:30.000000000 +0100 +@@ -1120,6 +1120,7 @@ + sc->sc_cachelsz = csz << 2; /* convert to bytes */ + + spin_lock_init(&sc->sc_resetlock); ++ spin_lock_init(&sc->sc_serial_rw); + + ah = ath9k_hw_attach(devid, sc, sc->mem, &status); + if (ah == NULL) { +diff -urN linux-2.6.27.19-5.1/drivers/net/wireless/ath9k/core.h linux-2.6.27.23-0.1.1/drivers/net/wireless/ath9k/core.h +--- linux-2.6.27.19-5.1/drivers/net/wireless/ath9k/core.h 2009-06-16 13:54:24.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/net/wireless/ath9k/core.h 2009-06-16 13:40:30.000000000 +0100 +@@ -1022,6 +1022,7 @@ + spinlock_t sc_rxbuflock; + spinlock_t sc_txbuflock; + spinlock_t sc_resetlock; ++ spinlock_t sc_serial_rw; + spinlock_t node_lock; + }; + +@@ -1069,4 +1070,36 @@ + void ath_mcast_merge(struct ath_softc *sc, u32 mfilt[2]); + enum ath9k_ht_macmode ath_cwm_macmode(struct ath_softc *sc); + ++/* ++ * Read and write, they both share the same lock. We do this to serialize ++ * reads and writes on Atheros 802.11n PCI devices only. This is required ++ * as the FIFO on these devices can only accept sanely 2 requests. After ++ * that the device goes bananas. Serializing the reads/writes prevents this ++ * from happening. ++ */ ++ ++static inline void ath9k_iowrite32(struct ath_hal *ah, u32 reg_offset, u32 val) ++{ ++ if (ah->ah_config.serialize_regmode == SER_REG_MODE_ON) { ++ unsigned long flags; ++ spin_lock_irqsave(&ah->ah_sc->sc_serial_rw, flags); ++ iowrite32(val, ah->ah_sc->mem + reg_offset); ++ spin_unlock_irqrestore(&ah->ah_sc->sc_serial_rw, flags); ++ } else ++ iowrite32(val, ah->ah_sc->mem + reg_offset); ++} ++ ++static inline unsigned int ath9k_ioread32(struct ath_hal *ah, u32 reg_offset) ++{ ++ u32 val; ++ if (ah->ah_config.serialize_regmode == SER_REG_MODE_ON) { ++ unsigned long flags; ++ spin_lock_irqsave(&ah->ah_sc->sc_serial_rw, flags); ++ val = ioread32(ah->ah_sc->mem + reg_offset); ++ spin_unlock_irqrestore(&ah->ah_sc->sc_serial_rw, flags); ++ } else ++ val = ioread32(ah->ah_sc->mem + reg_offset); ++ return val; ++} ++ + #endif /* CORE_H */ +diff -urN linux-2.6.27.19-5.1/drivers/net/wireless/ath9k/hw.c linux-2.6.27.23-0.1.1/drivers/net/wireless/ath9k/hw.c +--- linux-2.6.27.19-5.1/drivers/net/wireless/ath9k/hw.c 2009-06-16 13:54:24.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/net/wireless/ath9k/hw.c 2009-06-16 13:40:30.000000000 +0100 +@@ -369,6 +369,25 @@ + } + + ah->ah_config.intr_mitigation = 0; ++ ++ /* ++ * We need this for PCI devices only (Cardbus, PCI, miniPCI) ++ * _and_ if on non-uniprocessor systems (Multiprocessor/HT). ++ * This means we use it for all AR5416 devices, and the few ++ * minor PCI AR9280 devices out there. ++ * ++ * Serialization is required because these devices do not handle ++ * well the case of two concurrent reads/writes due to the latency ++ * involved. During one read/write another read/write can be issued ++ * on another CPU while the previous read/write may still be working ++ * on our hardware, if we hit this case the hardware poops in a loop. ++ * We prevent this by serializing reads and writes. ++ * ++ * This issue is not present on PCI-Express devices or pre-AR5416 ++ * devices (legacy, 802.11abg). ++ */ ++ if (num_possible_cpus() > 1) ++ ah->ah_config.serialize_regmode = SER_REG_MODE_AUTO; + } + + static inline void ath9k_hw_override_ini(struct ath_hal *ah, +@@ -3294,7 +3313,8 @@ + } + + if (ah->ah_config.serialize_regmode == SER_REG_MODE_AUTO) { +- if (ah->ah_macVersion == AR_SREV_VERSION_5416_PCI) { ++ if (ah->ah_macVersion == AR_SREV_VERSION_5416_PCI || ++ (AR_SREV_9280(ah) && !ah->ah_isPciExpress)) { + ah->ah_config.serialize_regmode = + SER_REG_MODE_ON; + } else { +diff -urN linux-2.6.27.19-5.1/drivers/net/wireless/b43/dma.c linux-2.6.27.23-0.1.1/drivers/net/wireless/b43/dma.c +--- linux-2.6.27.19-5.1/drivers/net/wireless/b43/dma.c 2009-06-16 13:54:24.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/net/wireless/b43/dma.c 2009-06-16 13:40:30.000000000 +0100 +@@ -551,11 +551,32 @@ + return 1; + } + ++static bool b43_rx_buffer_is_poisoned(struct b43_dmaring *ring, struct sk_buff *skb) ++{ ++ unsigned char *f = skb->data + ring->frameoffset; ++ ++ return ((f[0] & f[1] & f[2] & f[3] & f[4] & f[5] & f[6] & f[7]) == 0xFF); ++} ++ ++static void b43_poison_rx_buffer(struct b43_dmaring *ring, struct sk_buff *skb) ++{ ++ struct b43_rxhdr_fw4 *rxhdr; ++ unsigned char *frame; ++ ++ /* This poisons the RX buffer to detect DMA failures. */ ++ ++ rxhdr = (struct b43_rxhdr_fw4 *)(skb->data); ++ rxhdr->frame_len = 0; ++ ++ B43_WARN_ON(ring->rx_buffersize < ring->frameoffset + sizeof(struct b43_plcp_hdr6) + 2); ++ frame = skb->data + ring->frameoffset; ++ memset(frame, 0xFF, sizeof(struct b43_plcp_hdr6) + 2 /* padding */); ++} ++ + static int setup_rx_descbuffer(struct b43_dmaring *ring, + struct b43_dmadesc_generic *desc, + struct b43_dmadesc_meta *meta, gfp_t gfp_flags) + { +- struct b43_rxhdr_fw4 *rxhdr; + dma_addr_t dmaaddr; + struct sk_buff *skb; + +@@ -564,6 +585,7 @@ + skb = __dev_alloc_skb(ring->rx_buffersize, gfp_flags); + if (unlikely(!skb)) + return -ENOMEM; ++ b43_poison_rx_buffer(ring, skb); + dmaaddr = map_descbuffer(ring, skb->data, ring->rx_buffersize, 0); + if (b43_dma_mapping_error(ring, dmaaddr, ring->rx_buffersize, 0)) { + /* ugh. try to realloc in zone_dma */ +@@ -574,6 +596,7 @@ + skb = __dev_alloc_skb(ring->rx_buffersize, gfp_flags); + if (unlikely(!skb)) + return -ENOMEM; ++ b43_poison_rx_buffer(ring, skb); + dmaaddr = map_descbuffer(ring, skb->data, + ring->rx_buffersize, 0); + } +@@ -589,9 +612,6 @@ + ring->ops->fill_descriptor(ring, desc, dmaaddr, + ring->rx_buffersize, 0, 0, 0); + +- rxhdr = (struct b43_rxhdr_fw4 *)(skb->data); +- rxhdr->frame_len = 0; +- + return 0; + } + +@@ -1478,12 +1498,17 @@ + len = le16_to_cpu(rxhdr->frame_len); + } while (len == 0 && i++ < 5); + if (unlikely(len == 0)) { +- /* recycle the descriptor buffer. */ +- sync_descbuffer_for_device(ring, meta->dmaaddr, +- ring->rx_buffersize); +- goto drop; ++ dmaaddr = meta->dmaaddr; ++ goto drop_recycle_buffer; + } + } ++ if (unlikely(b43_rx_buffer_is_poisoned(ring, skb))) { ++ /* Something went wrong with the DMA. ++ * The device did not touch the buffer and did not overwrite the poison. */ ++ b43dbg(ring->dev->wl, "DMA RX: Dropping poisoned buffer.\n"); ++ dmaaddr = meta->dmaaddr; ++ goto drop_recycle_buffer; ++ } + if (unlikely(len > ring->rx_buffersize)) { + /* The data did not fit into one descriptor buffer + * and is split over multiple buffers. +@@ -1496,6 +1521,7 @@ + while (1) { + desc = ops->idx2desc(ring, *slot, &meta); + /* recycle the descriptor buffer. */ ++ b43_poison_rx_buffer(ring, meta->skb); + sync_descbuffer_for_device(ring, meta->dmaaddr, + ring->rx_buffersize); + *slot = next_slot(ring, *slot); +@@ -1514,8 +1540,7 @@ + err = setup_rx_descbuffer(ring, desc, meta, GFP_ATOMIC); + if (unlikely(err)) { + b43dbg(ring->dev->wl, "DMA RX: setup_rx_descbuffer() failed\n"); +- sync_descbuffer_for_device(ring, dmaaddr, ring->rx_buffersize); +- goto drop; ++ goto drop_recycle_buffer; + } + + unmap_descbuffer(ring, dmaaddr, ring->rx_buffersize, 0); +@@ -1525,6 +1550,11 @@ + b43_rx(ring->dev, skb, rxhdr); + drop: + return; ++ ++drop_recycle_buffer: ++ /* Poison and recycle the RX buffer. */ ++ b43_poison_rx_buffer(ring, skb); ++ sync_descbuffer_for_device(ring, dmaaddr, ring->rx_buffersize); + } + + void b43_dma_rx(struct b43_dmaring *ring) +diff -urN linux-2.6.27.19-5.1/drivers/net/wireless/b43/xmit.c linux-2.6.27.23-0.1.1/drivers/net/wireless/b43/xmit.c +--- linux-2.6.27.19-5.1/drivers/net/wireless/b43/xmit.c 2009-06-16 13:54:24.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/net/wireless/b43/xmit.c 2009-06-16 13:40:30.000000000 +0100 +@@ -51,7 +51,7 @@ + } + + /* Extract the bitrate index out of an OFDM PLCP header. */ +-static u8 b43_plcp_get_bitrate_idx_ofdm(struct b43_plcp_hdr6 *plcp, bool aphy) ++static int b43_plcp_get_bitrate_idx_ofdm(struct b43_plcp_hdr6 *plcp, bool aphy) + { + int base = aphy ? 0 : 4; + +diff -urN linux-2.6.27.19-5.1/drivers/net/wireless/iwlwifi/iwl3945-base.c linux-2.6.27.23-0.1.1/drivers/net/wireless/iwlwifi/iwl3945-base.c +--- linux-2.6.27.19-5.1/drivers/net/wireless/iwlwifi/iwl3945-base.c 2009-06-16 13:54:24.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/net/wireless/iwlwifi/iwl3945-base.c 2009-06-16 13:40:30.000000000 +0100 +@@ -8105,7 +8105,12 @@ + + set_bit(STATUS_EXIT_PENDING, &priv->status); + +- iwl3945_down(priv); ++ if (priv->mac80211_registered) { ++ ieee80211_unregister_hw(priv->hw); ++ priv->mac80211_registered = 0; ++ } else { ++ iwl3945_down(priv); ++ } + + /* make sure we flush any pending irq or + * tasklet for the driver +@@ -8130,9 +8135,6 @@ + iwl3945_unset_hw_setting(priv); + iwl3945_clear_stations_table(priv); + +- if (priv->mac80211_registered) +- ieee80211_unregister_hw(priv->hw); +- + /*netif_stop_queue(dev); */ + flush_workqueue(priv->workqueue); + +diff -urN linux-2.6.27.19-5.1/drivers/net/wireless/iwlwifi/iwl-core.c linux-2.6.27.23-0.1.1/drivers/net/wireless/iwlwifi/iwl-core.c +--- linux-2.6.27.19-5.1/drivers/net/wireless/iwlwifi/iwl-core.c 2009-06-16 13:54:24.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/net/wireless/iwlwifi/iwl-core.c 2009-06-16 13:40:30.000000000 +0100 +@@ -279,6 +279,7 @@ + void iwl_clear_stations_table(struct iwl_priv *priv) + { + unsigned long flags; ++ int i; + + spin_lock_irqsave(&priv->sta_lock, flags); + +@@ -293,6 +294,12 @@ + /* clean ucode key table bit map */ + priv->ucode_key_table = 0; + ++ /* keep track of static keys */ ++ for (i = 0; i < WEP_KEYS_MAX ; i++) { ++ if (priv->wep_keys[i].key_size) ++ test_and_set_bit(i, &priv->ucode_key_table); ++ } ++ + spin_unlock_irqrestore(&priv->sta_lock, flags); + } + EXPORT_SYMBOL(iwl_clear_stations_table); +diff -urN linux-2.6.27.19-5.1/drivers/net/wireless/rndis_wlan.c linux-2.6.27.23-0.1.1/drivers/net/wireless/rndis_wlan.c +--- linux-2.6.27.19-5.1/drivers/net/wireless/rndis_wlan.c 2009-06-16 13:54:24.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/net/wireless/rndis_wlan.c 2009-06-16 13:40:30.000000000 +0100 +@@ -2556,6 +2556,11 @@ + mutex_init(&priv->command_lock); + spin_lock_init(&priv->stats_lock); + ++ /* because rndis_command() sleeps we need to use workqueue */ ++ priv->workqueue = create_singlethread_workqueue("rndis_wlan"); ++ INIT_WORK(&priv->work, rndis_wext_worker); ++ INIT_DELAYED_WORK(&priv->stats_work, rndis_update_wireless_stats); ++ + /* try bind rndis_host */ + retval = generic_rndis_bind(usbdev, intf, FLAG_RNDIS_PHYM_WIRELESS); + if (retval < 0) +@@ -2600,16 +2605,17 @@ + disassociate(usbdev, 1); + netif_carrier_off(usbdev->net); + +- /* because rndis_command() sleeps we need to use workqueue */ +- priv->workqueue = create_singlethread_workqueue("rndis_wlan"); +- INIT_DELAYED_WORK(&priv->stats_work, rndis_update_wireless_stats); + queue_delayed_work(priv->workqueue, &priv->stats_work, + round_jiffies_relative(STATS_UPDATE_JIFFIES)); +- INIT_WORK(&priv->work, rndis_wext_worker); + + return 0; + + fail: ++ cancel_delayed_work_sync(&priv->stats_work); ++ cancel_work_sync(&priv->work); ++ flush_workqueue(priv->workqueue); ++ destroy_workqueue(priv->workqueue); ++ + kfree(priv); + return retval; + } +diff -urN linux-2.6.27.19-5.1/drivers/net/wireless/rtl8187_dev.c linux-2.6.27.23-0.1.1/drivers/net/wireless/rtl8187_dev.c +--- linux-2.6.27.19-5.1/drivers/net/wireless/rtl8187_dev.c 2009-06-16 13:54:24.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/net/wireless/rtl8187_dev.c 2009-06-16 13:40:30.000000000 +0100 +@@ -40,6 +40,10 @@ + {USB_DEVICE(0x0bda, 0x8189), .driver_info = DEVICE_RTL8187B}, + {USB_DEVICE(0x0bda, 0x8197), .driver_info = DEVICE_RTL8187B}, + {USB_DEVICE(0x0bda, 0x8198), .driver_info = DEVICE_RTL8187B}, ++ /* Surecom */ ++ {USB_DEVICE(0x0769, 0x11F2), .driver_info = DEVICE_RTL8187}, ++ /* Logitech */ ++ {USB_DEVICE(0x0789, 0x010C), .driver_info = DEVICE_RTL8187}, + /* Netgear */ + {USB_DEVICE(0x0846, 0x6100), .driver_info = DEVICE_RTL8187}, + {USB_DEVICE(0x0846, 0x6a00), .driver_info = DEVICE_RTL8187}, +@@ -49,8 +53,16 @@ + /* Sitecom */ + {USB_DEVICE(0x0df6, 0x000d), .driver_info = DEVICE_RTL8187}, + {USB_DEVICE(0x0df6, 0x0028), .driver_info = DEVICE_RTL8187B}, ++ /* Sphairon Access Systems GmbH */ ++ {USB_DEVICE(0x114B, 0x0150), .driver_info = DEVICE_RTL8187}, ++ /* Dick Smith Electronics */ ++ {USB_DEVICE(0x1371, 0x9401), .driver_info = DEVICE_RTL8187}, + /* Abocom */ + {USB_DEVICE(0x13d1, 0xabe6), .driver_info = DEVICE_RTL8187}, ++ /* Qcom */ ++ {USB_DEVICE(0x18E8, 0x6232), .driver_info = DEVICE_RTL8187}, ++ /* AirLive */ ++ {USB_DEVICE(0x1b75, 0x8187), .driver_info = DEVICE_RTL8187}, + {} + }; + +diff -urN linux-2.6.27.19-5.1/drivers/oprofile/cpu_buffer.c linux-2.6.27.23-0.1.1/drivers/oprofile/cpu_buffer.c +--- linux-2.6.27.19-5.1/drivers/oprofile/cpu_buffer.c 2009-06-16 13:54:54.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/oprofile/cpu_buffer.c 2009-06-16 13:41:02.000000000 +0100 +@@ -219,7 +219,7 @@ + cpu_buf->last_cpu_mode = cpu_mode; + add_code(cpu_buf, cpu_mode); + } +- ++ + /* notice a task switch */ + /* if not processing other domain samples */ + if ((cpu_buf->last_task != task) && +@@ -308,13 +308,44 @@ + } + + #ifdef CONFIG_XEN ++/* ++ * This is basically log_sample(b, ESCAPE_CODE, cpu_mode, CPU_TRACE_BEGIN), ++ * as was previously accessible through oprofile_add_pc(). ++ */ ++void oprofile_add_mode(int cpu_mode) ++{ ++ struct oprofile_cpu_buffer *cpu_buf = &__get_cpu_var(cpu_buffer); ++ struct task_struct *task; ++ ++ if (nr_available_slots(cpu_buf) < 3) { ++ cpu_buf->sample_lost_overflow++; ++ return; ++ } ++ ++ task = current; ++ ++ /* notice a switch from user->kernel or vice versa */ ++ if (cpu_buf->last_cpu_mode != cpu_mode) { ++ cpu_buf->last_cpu_mode = cpu_mode; ++ add_code(cpu_buf, cpu_mode); ++ } ++ ++ /* notice a task switch */ ++ if (cpu_buf->last_task != task) { ++ cpu_buf->last_task = task; ++ add_code(cpu_buf, (unsigned long)task); ++ } ++ ++ add_code(cpu_buf, CPU_TRACE_BEGIN); ++} ++ + int oprofile_add_domain_switch(int32_t domain_id) + { + struct oprofile_cpu_buffer *cpu_buf = &__get_cpu_var(cpu_buffer); + +- /* should have space for switching into and out of domain ++ /* should have space for switching into and out of domain + (2 slots each) plus one sample and one cpu mode switch */ +- if (((nr_available_slots(cpu_buf) < 6) && ++ if (((nr_available_slots(cpu_buf) < 6) && + (domain_id != COORDINATOR_DOMAIN)) || + (nr_available_slots(cpu_buf) < 2)) + return 0; +diff -urN linux-2.6.27.19-5.1/drivers/oprofile/oprofile_files.c linux-2.6.27.23-0.1.1/drivers/oprofile/oprofile_files.c +--- linux-2.6.27.19-5.1/drivers/oprofile/oprofile_files.c 2009-06-16 13:54:54.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/oprofile/oprofile_files.c 2009-06-16 13:41:02.000000000 +0100 +@@ -8,7 +8,7 @@ + * + * Modified by Aravind Menon for Xen + * These modifications are: +- * Copyright (C) 2005 Hewlett-Packard Co. ++ * Copyright (C) 2005 Hewlett-Packard Co. + */ + + #include +@@ -132,7 +132,7 @@ + static int active_domains[MAX_OPROF_DOMAINS + 1]; + static DEFINE_MUTEX(adom_mutex); + +-static ssize_t adomain_write(struct file * file, char const __user * buf, ++static ssize_t adomain_write(struct file * file, char const __user * buf, + size_t count, loff_t * offset) + { + char *tmpbuf; +@@ -140,9 +140,9 @@ + int i; + unsigned long val; + ssize_t retval = count; +- ++ + if (*offset) +- return -EINVAL; ++ return -EINVAL; + if (count > TMPBUFSIZE - 1) + return -EINVAL; + +@@ -186,7 +186,7 @@ + return retval; + } + +-static ssize_t adomain_read(struct file * file, char __user * buf, ++static ssize_t adomain_read(struct file * file, char __user * buf, + size_t count, loff_t * offset) + { + char * tmpbuf; +@@ -217,7 +217,7 @@ + } + + +-static struct file_operations active_domain_ops = { ++static const struct file_operations active_domain_ops = { + .read = adomain_read, + .write = adomain_write, + }; +@@ -226,7 +226,7 @@ + static int passive_domains[MAX_OPROF_DOMAINS]; + static DEFINE_MUTEX(pdom_mutex); + +-static ssize_t pdomain_write(struct file * file, char const __user * buf, ++static ssize_t pdomain_write(struct file * file, char const __user * buf, + size_t count, loff_t * offset) + { + char *tmpbuf; +@@ -234,9 +234,9 @@ + int i; + unsigned long val; + ssize_t retval = count; +- ++ + if (*offset) +- return -EINVAL; ++ return -EINVAL; + if (count > TMPBUFSIZE - 1) + return -EINVAL; + +@@ -280,7 +280,7 @@ + return retval; + } + +-static ssize_t pdomain_read(struct file * file, char __user * buf, ++static ssize_t pdomain_read(struct file * file, char __user * buf, + size_t count, loff_t * offset) + { + char * tmpbuf; +@@ -310,7 +310,7 @@ + return retval; + } + +-static struct file_operations passive_domain_ops = { ++static const struct file_operations passive_domain_ops = { + .read = pdomain_read, + .write = pdomain_write, + }; +diff -urN linux-2.6.27.19-5.1/drivers/pci/msi-xen.c linux-2.6.27.23-0.1.1/drivers/pci/msi-xen.c +--- linux-2.6.27.19-5.1/drivers/pci/msi-xen.c 2009-06-16 13:54:24.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/pci/msi-xen.c 2009-06-16 13:40:30.000000000 +0100 +@@ -234,8 +234,8 @@ + int rc; + + unmap.domid = msi_get_dev_owner(dev); +- /* See comments in msi_map_pirq_to_vector, input parameter pirq +- * mean irq number only if the device belongs to dom0 itself. ++ /* See comments in msi_map_vector, input parameter pirq means ++ * irq number only if the device belongs to dom0 itself. + */ + unmap.pirq = (unmap.domid != DOMID_SELF) + ? pirq : evtchn_get_xen_pirq(pirq); +@@ -271,8 +271,7 @@ + /* + * Protected by msi_lock + */ +-static int msi_map_pirq_to_vector(struct pci_dev *dev, int pirq, +- int entry_nr, u64 table_base) ++static int msi_map_vector(struct pci_dev *dev, int entry_nr, u64 table_base) + { + struct physdev_map_pirq map_irq; + int rc; +@@ -283,7 +282,7 @@ + map_irq.domid = domid; + map_irq.type = MAP_PIRQ_TYPE_MSI; + map_irq.index = -1; +- map_irq.pirq = pirq < 0 ? -1 : evtchn_get_xen_pirq(pirq); ++ map_irq.pirq = -1; + map_irq.bus = dev->bus->number; + map_irq.devfn = dev->devfn; + map_irq.entry_nr = entry_nr; +@@ -294,7 +293,7 @@ + + if (rc < 0) + return rc; +- /* This happens when MSI support is not enabled in Xen. */ ++ /* This happens when MSI support is not enabled in older Xen. */ + if (rc == 0 && map_irq.pirq < 0) + return -ENOSYS; + +@@ -306,12 +305,7 @@ + * to another domain, and will be 'Linux irq' if it belongs to dom0. + */ + return ((domid != DOMID_SELF) ? +- map_irq.pirq : evtchn_map_pirq(pirq, map_irq.pirq)); +-} +- +-static int msi_map_vector(struct pci_dev *dev, int entry_nr, u64 table_base) +-{ +- return msi_map_pirq_to_vector(dev, -1, entry_nr, table_base); ++ map_irq.pirq : evtchn_map_pirq(-1, map_irq.pirq)); + } + + static void pci_intx_for_msi(struct pci_dev *dev, int enable) +@@ -506,13 +500,8 @@ + extern int pci_frontend_enable_msi(struct pci_dev *dev); + int pci_enable_msi(struct pci_dev* dev) + { +- struct pci_bus *bus; + int temp, status; + +- for (bus = dev->bus; bus; bus = bus->parent) +- if (bus->bus_flags & PCI_BUS_FLAGS_NO_MSI) +- return -EINVAL; +- + status = pci_msi_check_device(dev, 1, PCI_CAP_ID_MSI); + if (status) + return status; +diff -urN linux-2.6.27.19-5.1/drivers/pci/pcie/aer/aerdrv_core.c linux-2.6.27.23-0.1.1/drivers/pci/pcie/aer/aerdrv_core.c +--- linux-2.6.27.19-5.1/drivers/pci/pcie/aer/aerdrv_core.c 2009-06-16 13:54:24.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/pci/pcie/aer/aerdrv_core.c 2009-06-16 13:40:30.000000000 +0100 +@@ -134,6 +134,34 @@ + } + #endif /* 0 */ + ++ ++static void set_device_error_reporting(struct pci_dev *dev, void *data) ++{ ++ bool enable = *((bool *)data); ++ ++ if (dev->pcie_type != PCIE_RC_PORT && ++ dev->pcie_type != PCIE_SW_UPSTREAM_PORT && ++ dev->pcie_type != PCIE_SW_DOWNSTREAM_PORT) ++ return; ++ ++ if (enable) ++ pci_enable_pcie_error_reporting(dev); ++ else ++ pci_disable_pcie_error_reporting(dev); ++} ++ ++/** ++ * set_downstream_devices_error_reporting - enable/disable the error reporting bits on the root port and its downstream ports. ++ * @dev: pointer to root port's pci_dev data structure ++ * @enable: true = enable error reporting, false = disable error reporting. ++ */ ++static void set_downstream_devices_error_reporting(struct pci_dev *dev, ++ bool enable) ++{ ++ set_device_error_reporting(dev, &enable); ++ pci_walk_bus(dev->subordinate, set_device_error_reporting, &enable); ++} ++ + static int find_device_iter(struct device *device, void *data) + { + struct pci_dev *dev; +@@ -551,15 +579,11 @@ + pci_read_config_dword(pdev, aer_pos + PCI_ERR_UNCOR_STATUS, ®32); + pci_write_config_dword(pdev, aer_pos + PCI_ERR_UNCOR_STATUS, reg32); + +- /* Enable Root Port device reporting error itself */ +- pci_read_config_word(pdev, pos+PCI_EXP_DEVCTL, ®16); +- reg16 = reg16 | +- PCI_EXP_DEVCTL_CERE | +- PCI_EXP_DEVCTL_NFERE | +- PCI_EXP_DEVCTL_FERE | +- PCI_EXP_DEVCTL_URRE; +- pci_write_config_word(pdev, pos+PCI_EXP_DEVCTL, +- reg16); ++ /* ++ * Enable error reporting for the root port device and downstream port ++ * devices. ++ */ ++ set_downstream_devices_error_reporting(pdev, true); + + /* Enable Root Port's interrupt in response to error messages */ + pci_write_config_dword(pdev, +@@ -579,6 +603,12 @@ + u32 reg32; + int pos; + ++ /* ++ * Disable error reporting for the root port device and downstream port ++ * devices. ++ */ ++ set_downstream_devices_error_reporting(pdev, false); ++ + pos = pci_find_aer_capability(pdev); + /* Disable Root's interrupt in response to error messages */ + pci_write_config_dword(pdev, pos + PCI_ERR_ROOT_COMMAND, 0); +diff -urN linux-2.6.27.19-5.1/drivers/pci/pcie/portdrv_pci.c linux-2.6.27.23-0.1.1/drivers/pci/pcie/portdrv_pci.c +--- linux-2.6.27.19-5.1/drivers/pci/pcie/portdrv_pci.c 2009-06-16 13:54:24.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/pci/pcie/portdrv_pci.c 2009-06-16 13:40:30.000000000 +0100 +@@ -109,14 +109,13 @@ + + pcie_portdrv_save_config(dev); + +- pci_enable_pcie_error_reporting(dev); +- + return 0; + } + + static void pcie_portdrv_remove (struct pci_dev *dev) + { + pcie_port_device_remove(dev); ++ pci_disable_device(dev); + kfree(pci_get_drvdata(dev)); + } + +diff -urN linux-2.6.27.19-5.1/drivers/pci/quirks.c linux-2.6.27.23-0.1.1/drivers/pci/quirks.c +--- linux-2.6.27.19-5.1/drivers/pci/quirks.c 2009-06-16 13:54:24.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/pci/quirks.c 2009-06-16 13:40:30.000000000 +0100 +@@ -22,19 +22,21 @@ + #include + #include + #include ++#include + #include "pci.h" + + #ifdef CONFIG_PCI_REASSIGN + /* +- * This quirk function disables the device and releases resources +- * which is specified by kernel's boot parameter 'reassigndev'. ++ * This quirk function disables memory decoding and releases memory ++ * resources which is specified by kernel's boot parameter 'reassigndev'. + * Later on, kernel will assign page-aligned memory resource back +- * to that device. ++ * to the device. + */ + static void __devinit quirk_release_resources(struct pci_dev *dev) + { + int i; + struct resource *r; ++ u16 command; + + if (is_reassigndev(dev)) { + if (dev->hdr_type == PCI_HEADER_TYPE_NORMAL && +@@ -42,8 +44,11 @@ + /* PCI Host Bridge isn't a target device */ + return; + } +- dev_info(&dev->dev, "disable device and release resources\n"); +- pci_disable_device(dev); ++ dev_info(&dev->dev, ++ "disable memory decoding and release memory resources\n"); ++ pci_read_config_word(dev, PCI_COMMAND, &command); ++ command &= ~PCI_COMMAND_MEMORY; ++ pci_write_config_word(dev, PCI_COMMAND, command); + + for (i=0; i < PCI_NUM_RESOURCES; i++) { + r = &dev->resource[i]; +@@ -1721,6 +1726,30 @@ + } + DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_ANY_ID, quirk_e100_interrupt); + ++/* ++ * The 82575 and 82598 may experience data corruption issues when transitioning ++ * out of L0S. To prevent this we need to disable L0S on the pci-e link ++ */ ++static void __devinit quirk_disable_aspm_l0s(struct pci_dev *dev) ++{ ++ dev_info(&dev->dev, "Disabling L0s\n"); ++ pci_disable_link_state(dev, PCIE_LINK_STATE_L0S); ++} ++DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10a7, quirk_disable_aspm_l0s); ++DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10a9, quirk_disable_aspm_l0s); ++DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10b6, quirk_disable_aspm_l0s); ++DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10c6, quirk_disable_aspm_l0s); ++DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10c7, quirk_disable_aspm_l0s); ++DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10c8, quirk_disable_aspm_l0s); ++DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10d6, quirk_disable_aspm_l0s); ++DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10db, quirk_disable_aspm_l0s); ++DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10dd, quirk_disable_aspm_l0s); ++DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10e1, quirk_disable_aspm_l0s); ++DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10ec, quirk_disable_aspm_l0s); ++DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10f1, quirk_disable_aspm_l0s); ++DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10f4, quirk_disable_aspm_l0s); ++DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x1508, quirk_disable_aspm_l0s); ++ + static void __devinit fixup_rev1_53c810(struct pci_dev* dev) + { + /* rev 1 ncr53c810 chips don't set the class at all which means +@@ -2036,7 +2065,6 @@ + DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_HT2000_PCIE, + quirk_msi_ht_cap); + +- + /* The nVidia CK804 chipset may have 2 HT MSI mappings. + * MSI are supported if the MSI capability set in any of these mappings. + */ +@@ -2087,6 +2115,9 @@ + PCI_DEVICE_ID_SERVERWORKS_HT1000_PXB, + ht_enable_msi_mapping); + ++DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8132_BRIDGE, ++ ht_enable_msi_mapping); ++ + static void __devinit nv_msi_ht_cap_quirk(struct pci_dev *dev) + { + struct pci_dev *host_bridge; +diff -urN linux-2.6.27.19-5.1/drivers/s390/block/dasd.c linux-2.6.27.23-0.1.1/drivers/s390/block/dasd.c +--- linux-2.6.27.19-5.1/drivers/s390/block/dasd.c 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/s390/block/dasd.c 2009-06-16 13:40:46.000000000 +0100 +@@ -57,6 +57,8 @@ + static void dasd_block_tasklet(struct dasd_block *); + static void do_kick_device(struct work_struct *); + static void dasd_return_cqr_cb(struct dasd_ccw_req *, void *); ++static void dasd_device_timeout(unsigned long); ++static void dasd_block_timeout(unsigned long); + + /* + * SECTION: Operations on the device structure. +@@ -99,6 +101,8 @@ + (unsigned long) device); + INIT_LIST_HEAD(&device->ccw_queue); + init_timer(&device->timer); ++ device->timer.function = dasd_device_timeout; ++ device->timer.data = (unsigned long) device; + INIT_WORK(&device->kick_work, do_kick_device); + device->state = DASD_STATE_NEW; + device->target = DASD_STATE_NEW; +@@ -138,6 +142,8 @@ + INIT_LIST_HEAD(&block->ccw_queue); + spin_lock_init(&block->queue_lock); + init_timer(&block->timer); ++ block->timer.function = dasd_block_timeout; ++ block->timer.data = (unsigned long) block; + + return block; + } +@@ -923,19 +929,10 @@ + */ + void dasd_device_set_timer(struct dasd_device *device, int expires) + { +- if (expires == 0) { +- if (timer_pending(&device->timer)) +- del_timer(&device->timer); +- return; +- } +- if (timer_pending(&device->timer)) { +- if (mod_timer(&device->timer, jiffies + expires)) +- return; +- } +- device->timer.function = dasd_device_timeout; +- device->timer.data = (unsigned long) device; +- device->timer.expires = jiffies + expires; +- add_timer(&device->timer); ++ if (expires == 0) ++ del_timer(&device->timer); ++ else ++ mod_timer(&device->timer, jiffies + expires); + } + + /* +@@ -943,8 +940,7 @@ + */ + void dasd_device_clear_timer(struct dasd_device *device) + { +- if (timer_pending(&device->timer)) +- del_timer(&device->timer); ++ del_timer(&device->timer); + } + + static void dasd_handle_killed_request(struct ccw_device *cdev, +@@ -1594,19 +1590,10 @@ + */ + void dasd_block_set_timer(struct dasd_block *block, int expires) + { +- if (expires == 0) { +- if (timer_pending(&block->timer)) +- del_timer(&block->timer); +- return; +- } +- if (timer_pending(&block->timer)) { +- if (mod_timer(&block->timer, jiffies + expires)) +- return; +- } +- block->timer.function = dasd_block_timeout; +- block->timer.data = (unsigned long) block; +- block->timer.expires = jiffies + expires; +- add_timer(&block->timer); ++ if (expires == 0) ++ del_timer(&block->timer); ++ else ++ mod_timer(&block->timer, jiffies + expires); + } + + /* +@@ -1614,8 +1601,7 @@ + */ + void dasd_block_clear_timer(struct dasd_block *block) + { +- if (timer_pending(&block->timer)) +- del_timer(&block->timer); ++ del_timer(&block->timer); + } + + /* +@@ -2373,6 +2359,7 @@ + ret = 0; + switch (event) { + case CIO_GONE: ++ case CIO_BOXED: + case CIO_NO_PATH: + /* First of all call extended error reporting. */ + dasd_eer_write(device, NULL, DASD_EER_NOPATH); +diff -urN linux-2.6.27.19-5.1/drivers/s390/cio/airq.c linux-2.6.27.23-0.1.1/drivers/s390/cio/airq.c +--- linux-2.6.27.19-5.1/drivers/s390/cio/airq.c 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/s390/cio/airq.c 2009-06-16 13:40:46.000000000 +0100 +@@ -34,8 +34,8 @@ + void *drv_data; + }; + +-static union indicator_t indicators[MAX_ISC]; +-static struct airq_t *airqs[MAX_ISC][NR_AIRQS]; ++static union indicator_t indicators[MAX_ISC+1]; ++static struct airq_t *airqs[MAX_ISC+1][NR_AIRQS]; + + static int register_airq(struct airq_t *airq, u8 isc) + { +diff -urN linux-2.6.27.19-5.1/drivers/s390/cio/ccwgroup.c linux-2.6.27.23-0.1.1/drivers/s390/cio/ccwgroup.c +--- linux-2.6.27.19-5.1/drivers/s390/cio/ccwgroup.c 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/s390/cio/ccwgroup.c 2009-06-16 13:40:46.000000000 +0100 +@@ -313,16 +313,32 @@ + } + EXPORT_SYMBOL(ccwgroup_create_from_string); + +-static int __init +-init_ccwgroup (void) ++static int ccwgroup_notifier(struct notifier_block *nb, unsigned long action, ++ void *data); ++ ++static struct notifier_block ccwgroup_nb = { ++ .notifier_call = ccwgroup_notifier ++}; ++ ++static int __init init_ccwgroup(void) + { +- return bus_register (&ccwgroup_bus_type); ++ int ret; ++ ++ ret = bus_register(&ccwgroup_bus_type); ++ if (ret) ++ return ret; ++ ++ ret = bus_register_notifier(&ccwgroup_bus_type, &ccwgroup_nb); ++ if (ret) ++ bus_unregister(&ccwgroup_bus_type); ++ ++ return ret; + } + +-static void __exit +-cleanup_ccwgroup (void) ++static void __exit cleanup_ccwgroup(void) + { +- bus_unregister (&ccwgroup_bus_type); ++ bus_unregister_notifier(&ccwgroup_bus_type, &ccwgroup_nb); ++ bus_unregister(&ccwgroup_bus_type); + } + + module_init(init_ccwgroup); +@@ -390,27 +406,28 @@ + unsigned long value; + int ret; + +- gdev = to_ccwgroupdev(dev); + if (!dev->driver) +- return count; ++ return -ENODEV; ++ ++ gdev = to_ccwgroupdev(dev); ++ gdrv = to_ccwgroupdrv(dev->driver); + +- gdrv = to_ccwgroupdrv (gdev->dev.driver); + if (!try_module_get(gdrv->owner)) + return -EINVAL; + + ret = strict_strtoul(buf, 0, &value); + if (ret) + goto out; +- ret = count; ++ + if (value == 1) +- ccwgroup_set_online(gdev); ++ ret = ccwgroup_set_online(gdev); + else if (value == 0) +- ccwgroup_set_offline(gdev); ++ ret = ccwgroup_set_offline(gdev); + else + ret = -EINVAL; + out: + module_put(gdrv->owner); +- return ret; ++ return (ret == 0) ? count : ret; + } + + static ssize_t +@@ -452,13 +469,18 @@ + struct ccwgroup_device *gdev; + struct ccwgroup_driver *gdrv; + ++ device_remove_file(dev, &dev_attr_online); ++ device_remove_file(dev, &dev_attr_ungroup); ++ ++ if (!dev->driver) ++ return 0; ++ + gdev = to_ccwgroupdev(dev); + gdrv = to_ccwgroupdrv(dev->driver); + +- device_remove_file(dev, &dev_attr_online); +- +- if (gdrv && gdrv->remove) ++ if (gdrv->remove) + gdrv->remove(gdev); ++ + return 0; + } + +@@ -467,9 +489,13 @@ + struct ccwgroup_device *gdev; + struct ccwgroup_driver *gdrv; + ++ if (!dev->driver) ++ return; ++ + gdev = to_ccwgroupdev(dev); + gdrv = to_ccwgroupdrv(dev->driver); +- if (gdrv && gdrv->shutdown) ++ ++ if (gdrv->shutdown) + gdrv->shutdown(gdev); + } + +@@ -482,6 +508,19 @@ + .shutdown = ccwgroup_shutdown, + }; + ++ ++static int ccwgroup_notifier(struct notifier_block *nb, unsigned long action, ++ void *data) ++{ ++ struct device *dev = data; ++ ++ if (action == BUS_NOTIFY_UNBIND_DRIVER) ++ device_schedule_callback(dev, ccwgroup_ungroup_callback); ++ ++ return NOTIFY_OK; ++} ++ ++ + /** + * ccwgroup_driver_register() - register a ccw group driver + * @cdriver: driver to be registered +diff -urN linux-2.6.27.19-5.1/drivers/s390/cio/css.c linux-2.6.27.23-0.1.1/drivers/s390/cio/css.c +--- linux-2.6.27.19-5.1/drivers/s390/cio/css.c 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/s390/cio/css.c 2009-06-16 13:40:46.000000000 +0100 +@@ -509,6 +509,17 @@ + return ret; + } + ++static void reprobe_after_idle(struct work_struct *unused) ++{ ++ /* Make sure initial subchannel scan is done. */ ++ wait_event(ccw_device_init_wq, ++ atomic_read(&ccw_device_init_count) == 0); ++ if (need_reprobe) ++ css_schedule_reprobe(); ++} ++ ++static DECLARE_WORK(reprobe_idle_work, reprobe_after_idle); ++ + /* Work function used to reprobe all unregistered subchannels. */ + static void reprobe_all(struct work_struct *unused) + { +@@ -516,10 +527,12 @@ + + CIO_MSG_EVENT(4, "reprobe start\n"); + +- need_reprobe = 0; + /* Make sure initial subchannel scan is done. */ +- wait_event(ccw_device_init_wq, +- atomic_read(&ccw_device_init_count) == 0); ++ if (atomic_read(&ccw_device_init_count) != 0) { ++ queue_work(ccw_device_work, &reprobe_idle_work); ++ return; ++ } ++ need_reprobe = 0; + ret = for_each_subchannel_staged(NULL, reprobe_subchannel, NULL); + + CIO_MSG_EVENT(4, "reprobe done (rc=%d, need_reprobe=%d)\n", ret, +diff -urN linux-2.6.27.19-5.1/drivers/s390/cio/device.c linux-2.6.27.23-0.1.1/drivers/s390/cio/device.c +--- linux-2.6.27.19-5.1/drivers/s390/cio/device.c 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/s390/cio/device.c 2009-06-16 13:40:46.000000000 +0100 +@@ -479,11 +479,15 @@ + } + wait_event(cdev->private->wait_q, + cdev->private->flags.recog_done); ++ if (cdev->private->state != DEV_STATE_OFFLINE) ++ /* recognition failed */ ++ return -EAGAIN; + } + if (cdev->drv && cdev->drv->set_online) + ccw_device_set_online(cdev); + return 0; + } ++ + static int online_store_handle_online(struct ccw_device *cdev, int force) + { + int ret; +@@ -497,7 +501,9 @@ + return ret; + if (cdev->id.cu_type == 0) + cdev->private->state = DEV_STATE_NOT_OPER; +- online_store_recog_and_online(cdev); ++ ret = online_store_recog_and_online(cdev); ++ if (ret) ++ return ret; + } + return 0; + } +@@ -1017,33 +1023,35 @@ + put_device(&sch->dev); + } + ++void ccw_device_schedule_sch_unregister(struct ccw_device *cdev) ++{ ++ PREPARE_WORK(&cdev->private->kick_work, ++ ccw_device_call_sch_unregister); ++ queue_work(slow_path_wq, &cdev->private->kick_work); ++} ++ + /* + * subchannel recognition done. Called from the state machine. + */ + void + io_subchannel_recog_done(struct ccw_device *cdev) + { +- struct subchannel *sch; +- + if (css_init_done == 0) { + cdev->private->flags.recog_done = 1; + return; + } + switch (cdev->private->state) { ++ case DEV_STATE_BOXED: ++ /* Device did not respond in time. */ + case DEV_STATE_NOT_OPER: + cdev->private->flags.recog_done = 1; + /* Remove device found not operational. */ + if (!get_device(&cdev->dev)) + break; +- sch = to_subchannel(cdev->dev.parent); +- PREPARE_WORK(&cdev->private->kick_work, +- ccw_device_call_sch_unregister); +- queue_work(slow_path_wq, &cdev->private->kick_work); ++ ccw_device_schedule_sch_unregister(cdev); + if (atomic_dec_and_test(&ccw_device_init_count)) + wake_up(&ccw_device_init_wq); + break; +- case DEV_STATE_BOXED: +- /* Device did not respond in time. */ + case DEV_STATE_OFFLINE: + /* + * We can't register the device in interrupt context so +diff -urN linux-2.6.27.19-5.1/drivers/s390/cio/device_fsm.c linux-2.6.27.23-0.1.1/drivers/s390/cio/device_fsm.c +--- linux-2.6.27.19-5.1/drivers/s390/cio/device_fsm.c 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/s390/cio/device_fsm.c 2009-06-16 13:40:46.000000000 +0100 +@@ -253,13 +253,12 @@ + old_lpm = 0; + if (sch->lpm != old_lpm) + __recover_lost_chpids(sch, old_lpm); +- if (cdev->private->state == DEV_STATE_DISCONNECTED_SENSE_ID) { +- if (state == DEV_STATE_NOT_OPER) { +- cdev->private->flags.recog_done = 1; +- cdev->private->state = DEV_STATE_DISCONNECTED; +- return; +- } +- /* Boxed devices don't need extra treatment. */ ++ if (cdev->private->state == DEV_STATE_DISCONNECTED_SENSE_ID && ++ (state == DEV_STATE_NOT_OPER || state == DEV_STATE_BOXED)) { ++ cdev->private->flags.recog_done = 1; ++ cdev->private->state = DEV_STATE_DISCONNECTED; ++ wake_up(&cdev->private->wait_q); ++ return; + } + notify = 0; + same_dev = 0; /* Keep the compiler quiet... */ +@@ -304,12 +303,17 @@ + " subchannel 0.%x.%04x\n", + cdev->private->dev_id.devno, + sch->schid.ssid, sch->schid.sch_no); ++ if (cdev->id.cu_type != 0) { /* device was recognized before */ ++ cdev->private->flags.recog_done = 1; ++ cdev->private->state = DEV_STATE_BOXED; ++ wake_up(&cdev->private->wait_q); ++ return; ++ } + break; + } + cdev->private->state = state; + io_subchannel_recog_done(cdev); +- if (state != DEV_STATE_NOT_OPER) +- wake_up(&cdev->private->wait_q); ++ wake_up(&cdev->private->wait_q); + } + + /* +@@ -387,10 +391,13 @@ + + cdev->private->state = state; + +- +- if (state == DEV_STATE_BOXED) ++ if (state == DEV_STATE_BOXED) { + CIO_MSG_EVENT(0, "Boxed device %04x on subchannel %04x\n", + cdev->private->dev_id.devno, sch->schid.sch_no); ++ if (cdev->online && !ccw_device_notify(cdev, CIO_BOXED)) ++ ccw_device_schedule_sch_unregister(cdev); ++ cdev->private->flags.donotify = 0; ++ } + + if (cdev->private->flags.donotify) { + cdev->private->flags.donotify = 0; +diff -urN linux-2.6.27.19-5.1/drivers/s390/cio/device.h linux-2.6.27.23-0.1.1/drivers/s390/cio/device.h +--- linux-2.6.27.19-5.1/drivers/s390/cio/device.h 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/s390/cio/device.h 2009-06-16 13:40:46.000000000 +0100 +@@ -86,6 +86,7 @@ + int ccw_device_recognition(struct ccw_device *); + int ccw_device_online(struct ccw_device *); + int ccw_device_offline(struct ccw_device *); ++void ccw_device_schedule_sch_unregister(struct ccw_device *); + + /* Function prototypes for device status and basic sense stuff. */ + void ccw_device_accumulate_irb(struct ccw_device *, struct irb *); +diff -urN linux-2.6.27.19-5.1/drivers/s390/cio/qdio_debug.c linux-2.6.27.23-0.1.1/drivers/s390/cio/qdio_debug.c +--- linux-2.6.27.19-5.1/drivers/s390/cio/qdio_debug.c 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/s390/cio/qdio_debug.c 2009-06-16 13:40:46.000000000 +0100 +@@ -62,8 +62,9 @@ + seq_printf(m, "device state indicator: %d\n", *(u32 *)q->irq_ptr->dsci); + seq_printf(m, "nr_used: %d\n", atomic_read(&q->nr_buf_used)); + seq_printf(m, "ftc: %d\n", q->first_to_check); +- seq_printf(m, "last_move_ftc: %d\n", q->last_move_ftc); ++ seq_printf(m, "last_move: %d\n", q->last_move); + seq_printf(m, "polling: %d\n", q->u.in.polling); ++ seq_printf(m, "ack start: %d\n", q->u.in.ack_start); + seq_printf(m, "ack count: %d\n", q->u.in.ack_count); + seq_printf(m, "slsb buffer states:\n"); + seq_printf(m, "|0 |8 |16 |24 |32 |40 |48 |56 63|\n"); +diff -urN linux-2.6.27.19-5.1/drivers/s390/cio/qdio.h linux-2.6.27.23-0.1.1/drivers/s390/cio/qdio.h +--- linux-2.6.27.19-5.1/drivers/s390/cio/qdio.h 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/s390/cio/qdio.h 2009-06-16 13:40:46.000000000 +0100 +@@ -14,7 +14,6 @@ + #include "chsc.h" + + #define QDIO_BUSY_BIT_PATIENCE 100 /* 100 microseconds */ +-#define QDIO_BUSY_BIT_GIVE_UP 2000000 /* 2 seconds = eternity */ + #define QDIO_INPUT_THRESHOLD 500 /* 500 microseconds */ + + /* +@@ -187,6 +186,9 @@ + /* input buffer acknowledgement flag */ + int polling; + ++ /* first ACK'ed buffer */ ++ int ack_start; ++ + /* how much sbals are acknowledged with qebsm */ + int ack_count; + +@@ -195,12 +197,6 @@ + }; + + struct qdio_output_q { +- /* failed siga-w attempts*/ +- atomic_t busy_siga_counter; +- +- /* start time of busy condition */ +- u64 timestamp; +- + /* PCIs are enabled for the queue */ + int pci_out_enabled; + +@@ -238,7 +234,7 @@ + int first_to_check; + + /* first_to_check of the last time */ +- int last_move_ftc; ++ int last_move; + + /* beginning position for calling the program */ + int first_to_kick; +diff -urN linux-2.6.27.19-5.1/drivers/s390/cio/qdio_main.c linux-2.6.27.23-0.1.1/drivers/s390/cio/qdio_main.c +--- linux-2.6.27.19-5.1/drivers/s390/cio/qdio_main.c 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/s390/cio/qdio_main.c 2009-06-16 13:40:46.000000000 +0100 +@@ -74,7 +74,7 @@ + * Note: For IQDC unicast queues only the highest priority queue is processed. + */ + static inline int do_siga_output(unsigned long schid, unsigned long mask, +- u32 *bb, unsigned int fc) ++ unsigned int *bb, unsigned int fc) + { + register unsigned long __fc asm("0") = fc; + register unsigned long __schid asm("1") = schid; +@@ -278,8 +278,7 @@ + if (!need_siga_sync(q)) + return 0; + +- DBF_DEV_EVENT(DBF_INFO, q->irq_ptr, "siga-s:"); +- DBF_DEV_HEX(DBF_INFO, q->irq_ptr, q, sizeof(void *)); ++ DBF_DEV_EVENT(DBF_INFO, q->irq_ptr, "siga-s:%1d", q->nr); + qdio_perf_stat_inc(&perf_stats.siga_sync); + + cc = do_siga_sync(q->irq_ptr->schid, output, input); +@@ -306,43 +305,34 @@ + return qdio_siga_sync(q, ~0U, ~0U); + } + +-static inline int qdio_do_siga_output(struct qdio_q *q, unsigned int *busy_bit) ++static int qdio_siga_output(struct qdio_q *q, unsigned int *busy_bit) + { +- unsigned int fc = 0; + unsigned long schid; ++ unsigned int fc = 0; ++ u64 start_time = 0; ++ int cc; + +- if (!is_qebsm(q)) +- schid = *((u32 *)&q->irq_ptr->schid); +- else { ++ if (is_qebsm(q)) { + schid = q->irq_ptr->sch_token; + fc |= 0x80; + } +- return do_siga_output(schid, q->mask, busy_bit, fc); +-} +- +-static int qdio_siga_output(struct qdio_q *q) +-{ +- int cc; +- u32 busy_bit; +- u64 start_time = 0; ++ else ++ schid = *((u32 *)&q->irq_ptr->schid); + +- DBF_DEV_EVENT(DBF_INFO, q->irq_ptr, "siga-w:%1d", q->nr); +- qdio_perf_stat_inc(&perf_stats.siga_out); + again: +- cc = qdio_do_siga_output(q, &busy_bit); +- if (queue_type(q) == QDIO_IQDIO_QFMT && cc == 2 && busy_bit) { +- DBF_DEV_EVENT(DBF_INFO, q->irq_ptr, "siga-w bb:%2d", q->nr); ++ cc = do_siga_output(schid, q->mask, busy_bit, fc); + +- if (!start_time) ++ /* hipersocket busy condition */ ++ if (*busy_bit) { ++ WARN_ON(queue_type(q) != QDIO_IQDIO_QFMT || cc != 2); ++ ++ if (!start_time) { + start_time = get_usecs(); +- else if ((get_usecs() - start_time) < QDIO_BUSY_BIT_PATIENCE) ++ goto again; ++ } ++ if ((get_usecs() - start_time) < QDIO_BUSY_BIT_PATIENCE) + goto again; + } +- +- if (cc == 2 && busy_bit) +- cc |= QDIO_ERROR_SIGA_BUSY; +- if (cc) +- DBF_ERROR("%4x SIGA-W:%2d", SCH_NO(q), cc); + return cc; + } + +@@ -381,16 +371,16 @@ + + /* show the card that we are not polling anymore */ + if (is_qebsm(q)) { +- set_buf_states(q, q->last_move_ftc, SLSB_P_INPUT_NOT_INIT, ++ set_buf_states(q, q->u.in.ack_start, SLSB_P_INPUT_NOT_INIT, + q->u.in.ack_count); + q->u.in.ack_count = 0; + } else +- set_buf_state(q, q->last_move_ftc, SLSB_P_INPUT_NOT_INIT); ++ set_buf_state(q, q->u.in.ack_start, SLSB_P_INPUT_NOT_INIT); + } + + static void announce_buffer_error(struct qdio_q *q, int count) + { +- q->qdio_error = QDIO_ERROR_SLSB_STATE; ++ q->qdio_error |= QDIO_ERROR_SLSB_STATE; + + /* special handling for no target buffer empty */ + if ((!q->is_input_q && +@@ -420,15 +410,15 @@ + if (!q->u.in.polling) { + q->u.in.polling = 1; + q->u.in.ack_count = count; +- q->last_move_ftc = q->first_to_check; ++ q->u.in.ack_start = q->first_to_check; + return; + } + + /* delete the previous ACK's */ +- set_buf_states(q, q->last_move_ftc, SLSB_P_INPUT_NOT_INIT, ++ set_buf_states(q, q->u.in.ack_start, SLSB_P_INPUT_NOT_INIT, + q->u.in.ack_count); + q->u.in.ack_count = count; +- q->last_move_ftc = q->first_to_check; ++ q->u.in.ack_start = q->first_to_check; + return; + } + +@@ -440,14 +430,13 @@ + if (q->u.in.polling) { + /* reset the previous ACK but first set the new one */ + set_buf_state(q, new, SLSB_P_INPUT_ACK); +- set_buf_state(q, q->last_move_ftc, SLSB_P_INPUT_NOT_INIT); +- } +- else { ++ set_buf_state(q, q->u.in.ack_start, SLSB_P_INPUT_NOT_INIT); ++ } else { + q->u.in.polling = 1; +- set_buf_state(q, q->first_to_check, SLSB_P_INPUT_ACK); ++ set_buf_state(q, new, SLSB_P_INPUT_ACK); + } + +- q->last_move_ftc = new; ++ q->u.in.ack_start = new; + count--; + if (!count) + return; +@@ -456,7 +445,7 @@ + * Need to change all PRIMED buffers to NOT_INIT, otherwise + * we're loosing initiative in the thinint code. + */ +- set_buf_states(q, next_buf(q->first_to_check), SLSB_P_INPUT_NOT_INIT, ++ set_buf_states(q, q->first_to_check, SLSB_P_INPUT_NOT_INIT, + count); + } + +@@ -524,7 +513,8 @@ + + bufnr = get_inbound_buffer_frontier(q); + +- if ((bufnr != q->last_move_ftc) || q->qdio_error) { ++ if ((bufnr != q->last_move) || q->qdio_error) { ++ q->last_move = bufnr; + if (!need_siga_sync(q) && !pci_out_supported(q)) + q->u.in.timestamp = get_usecs(); + +@@ -699,77 +689,42 @@ + + bufnr = get_outbound_buffer_frontier(q); + +- if ((bufnr != q->last_move_ftc) || q->qdio_error) { +- q->last_move_ftc = bufnr; ++ if ((bufnr != q->last_move) || q->qdio_error) { ++ q->last_move = bufnr; + DBF_DEV_EVENT(DBF_INFO, q->irq_ptr, "out moved:%1d", q->nr); + return 1; + } else + return 0; + } + +-/* +- * VM could present us cc=2 and busy bit set on SIGA-write +- * during reconfiguration of their Guest LAN (only in iqdio mode, +- * otherwise qdio is asynchronous and cc=2 and busy bit there will take +- * the queues down immediately). +- * +- * Therefore qdio_siga_output will try for a short time constantly, +- * if such a condition occurs. If it doesn't change, it will +- * increase the busy_siga_counter and save the timestamp, and +- * schedule the queue for later processing. qdio_outbound_processing +- * will check out the counter. If non-zero, it will call qdio_kick_outbound_q +- * as often as the value of the counter. This will attempt further SIGA +- * instructions. For each successful SIGA, the counter is +- * decreased, for failing SIGAs the counter remains the same, after +- * all. After some time of no movement, qdio_kick_outbound_q will +- * finally fail and reflect corresponding error codes to call +- * the upper layer module and have it take the queues down. +- * +- * Note that this is a change from the original HiperSockets design +- * (saying cc=2 and busy bit means take the queues down), but in +- * these days Guest LAN didn't exist... excessive cc=2 with busy bit +- * conditions will still take the queues down, but the threshold is +- * higher due to the Guest LAN environment. +- * +- * Called from outbound tasklet and do_QDIO handler. +- */ +-static void qdio_kick_outbound_q(struct qdio_q *q) ++static int qdio_kick_outbound_q(struct qdio_q *q) + { +- int rc; +- +- DBF_DEV_EVENT(DBF_INFO, q->irq_ptr, "kickoutq:%1d", q->nr); ++ unsigned int busy_bit; ++ int cc; + + if (!need_siga_out(q)) +- return; ++ return 0; ++ ++ DBF_DEV_EVENT(DBF_INFO, q->irq_ptr, "siga-w:%1d", q->nr); ++ qdio_perf_stat_inc(&perf_stats.siga_out); + +- rc = qdio_siga_output(q); +- switch (rc) { ++ cc = qdio_siga_output(q, &busy_bit); ++ switch (cc) { + case 0: +- /* TODO: improve error handling for CC=0 case */ +- if (q->u.out.timestamp) +- DBF_DEV_EVENT(DBF_INFO, q->irq_ptr, "cc2 rslv:%4x", +- atomic_read(&q->u.out.busy_siga_counter)); +- /* went smooth this time, reset timestamp */ +- q->u.out.timestamp = 0; + break; +- /* cc=2 and busy bit */ +- case (2 | QDIO_ERROR_SIGA_BUSY): +- atomic_inc(&q->u.out.busy_siga_counter); +- +- /* if the last siga was successful, save timestamp here */ +- if (!q->u.out.timestamp) +- q->u.out.timestamp = get_usecs(); +- +- /* if we're in time, don't touch qdio_error */ +- if (get_usecs() - q->u.out.timestamp < QDIO_BUSY_BIT_GIVE_UP) { +- tasklet_schedule(&q->tasklet); +- break; +- } +- DBF_ERROR("%4x cc2 REP:%1d", SCH_NO(q), q->nr); +- default: +- /* for plain cc=1, 2 or 3 */ +- q->qdio_error = rc; ++ case 2: ++ if (busy_bit) { ++ DBF_ERROR("%4x cc2 REP:%1d", SCH_NO(q), q->nr); ++ cc |= QDIO_ERROR_SIGA_BUSY; ++ } else ++ DBF_DEV_EVENT(DBF_INFO, q->irq_ptr, "siga-w cc2:%1d", q->nr); ++ break; ++ case 1: ++ case 3: ++ DBF_ERROR("%4x SIGA-W:%1d", SCH_NO(q), cc); ++ break; + } ++ return cc; + } + + static void qdio_kick_outbound_handler(struct qdio_q *q) +@@ -777,7 +732,7 @@ + int start, end, count; + + start = q->first_to_kick; +- end = q->last_move_ftc; ++ end = q->last_move; + if (end >= start) + count = end - start; + else +@@ -793,43 +748,29 @@ + q->irq_ptr->int_parm); + + /* for the next time: */ +- q->first_to_kick = q->last_move_ftc; ++ q->first_to_kick = q->last_move; + q->qdio_error = 0; + } + + static void __qdio_outbound_processing(struct qdio_q *q) + { +- int siga_attempts; +- + qdio_perf_stat_inc(&perf_stats.tasklet_outbound); +- +- /* see comment in qdio_kick_outbound_q */ +- siga_attempts = atomic_read(&q->u.out.busy_siga_counter); +- while (siga_attempts--) { +- atomic_dec(&q->u.out.busy_siga_counter); +- qdio_kick_outbound_q(q); +- } +- + BUG_ON(atomic_read(&q->nr_buf_used) < 0); + + if (qdio_outbound_q_moved(q)) + qdio_kick_outbound_handler(q); + +- if (queue_type(q) == QDIO_ZFCP_QFMT) { ++ if (queue_type(q) == QDIO_ZFCP_QFMT) + if (!pci_out_supported(q) && !qdio_outbound_q_done(q)) +- tasklet_schedule(&q->tasklet); +- return; +- } ++ goto sched; + + /* bail out for HiperSockets unicast queues */ + if (queue_type(q) == QDIO_IQDIO_QFMT && !multicast_outbound(q)) + return; + + if ((queue_type(q) == QDIO_IQDIO_QFMT) && +- (atomic_read(&q->nr_buf_used)) > QDIO_IQDIO_POLL_LVL) { +- tasklet_schedule(&q->tasklet); +- return; +- } ++ (atomic_read(&q->nr_buf_used)) > QDIO_IQDIO_POLL_LVL) ++ goto sched; + + if (q->u.out.pci_out_enabled) + return; +@@ -847,6 +788,12 @@ + qdio_perf_stat_inc(&perf_stats.debug_tl_out_timer); + } + } ++ return; ++ ++sched: ++ if (unlikely(q->irq_ptr->state == QDIO_IRQ_STATE_STOPPED)) ++ return; ++ tasklet_schedule(&q->tasklet); + } + + /* outbound tasklet */ +@@ -859,6 +806,9 @@ + void qdio_outbound_timer(unsigned long data) + { + struct qdio_q *q = (struct qdio_q *)data; ++ ++ if (unlikely(q->irq_ptr->state == QDIO_IRQ_STATE_STOPPED)) ++ return; + tasklet_schedule(&q->tasklet); + } + +@@ -900,6 +850,9 @@ + int i; + struct qdio_q *q; + ++ if (unlikely(irq_ptr->state == QDIO_IRQ_STATE_STOPPED)) ++ return; ++ + qdio_perf_stat_inc(&perf_stats.pci_int); + + for_each_input_queue(irq_ptr, q, i) +@@ -1102,8 +1055,9 @@ + * @cdev: associated ccw device + * @how: use halt or clear to shutdown + * +- * This function calls qdio_shutdown() for @cdev with method @how +- * and on success qdio_free() for @cdev. ++ * This function calls qdio_shutdown() for @cdev with method @how. ++ * and qdio_free(). The qdio_free() return value is ignored since ++ * !irq_ptr is already checked. + */ + int qdio_cleanup(struct ccw_device *cdev, int how) + { +@@ -1114,8 +1068,8 @@ + return -ENODEV; + + rc = qdio_shutdown(cdev, how); +- if (rc == 0) +- rc = qdio_free(cdev); ++ ++ qdio_free(cdev); + return rc; + } + EXPORT_SYMBOL_GPL(qdio_cleanup); +@@ -1127,11 +1081,11 @@ + int i; + + for_each_input_queue(irq_ptr, q, i) +- tasklet_disable(&q->tasklet); ++ tasklet_kill(&q->tasklet); + + for_each_output_queue(irq_ptr, q, i) { +- tasklet_disable(&q->tasklet); + del_timer(&q->u.out.timer); ++ tasklet_kill(&q->tasklet); + } + } + +@@ -1149,6 +1103,7 @@ + if (!irq_ptr) + return -ENODEV; + ++ BUG_ON(irqs_disabled()); + DBF_EVENT("qshutdown:%4x", cdev->private->schid.sch_no); + + mutex_lock(&irq_ptr->setup_mutex); +@@ -1161,6 +1116,12 @@ + return 0; + } + ++ /* ++ * Indicate that the device is going down. Scheduling the queue ++ * tasklets is forbidden from here on. ++ */ ++ qdio_set_state(irq_ptr, QDIO_IRQ_STATE_STOPPED); ++ + tiqdio_remove_input_queues(irq_ptr); + qdio_shutdown_queues(cdev); + qdio_shutdown_debug_entries(irq_ptr, cdev); +@@ -1478,10 +1439,10 @@ + * @bufnr: first buffer to process + * @count: how many buffers are emptied + */ +-static void handle_inbound(struct qdio_q *q, unsigned int callflags, +- int bufnr, int count) ++static int handle_inbound(struct qdio_q *q, unsigned int callflags, ++ int bufnr, int count) + { +- int used, rc, diff; ++ int used, diff; + + if (!q->u.in.polling) + goto set; +@@ -1492,19 +1453,18 @@ + q->u.in.polling = 0; + q->u.in.ack_count = 0; + goto set; +- } else if (buf_in_between(q->last_move_ftc, bufnr, count)) { ++ } else if (buf_in_between(q->u.in.ack_start, bufnr, count)) { + if (is_qebsm(q)) { +- /* partial overwrite, just update last_move_ftc */ ++ /* partial overwrite, just update ack_start */ + diff = add_buf(bufnr, count); +- diff = sub_buf(diff, q->last_move_ftc); ++ diff = sub_buf(diff, q->u.in.ack_start); + q->u.in.ack_count -= diff; + if (q->u.in.ack_count <= 0) { + q->u.in.polling = 0; + q->u.in.ack_count = 0; +- /* TODO: must we set last_move_ftc to something meaningful? */ + goto set; + } +- q->last_move_ftc = add_buf(q->last_move_ftc, diff); ++ q->u.in.ack_start = add_buf(q->u.in.ack_start, diff); + } + else + /* the only ACK will be deleted, so stop polling */ +@@ -1519,13 +1479,11 @@ + + /* no need to signal as long as the adapter had free buffers */ + if (used) +- return; ++ return 0; + +- if (need_siga_in(q)) { +- rc = qdio_siga_input(q); +- if (rc) +- q->qdio_error = rc; +- } ++ if (need_siga_in(q)) ++ return qdio_siga_input(q); ++ return 0; + } + + /** +@@ -1535,11 +1493,11 @@ + * @bufnr: first buffer to process + * @count: how many buffers are filled + */ +-static void handle_outbound(struct qdio_q *q, unsigned int callflags, +- int bufnr, int count) ++static int handle_outbound(struct qdio_q *q, unsigned int callflags, ++ int bufnr, int count) + { + unsigned char state; +- int used; ++ int used, rc = 0; + + qdio_perf_stat_inc(&perf_stats.outbound_handler); + +@@ -1554,14 +1512,17 @@ + + if (queue_type(q) == QDIO_IQDIO_QFMT) { + if (multicast_outbound(q)) +- qdio_kick_outbound_q(q); ++ rc = qdio_kick_outbound_q(q); + else + /* + * One siga-w per buffer required for unicast + * HiperSockets. + */ +- while (count--) +- qdio_kick_outbound_q(q); ++ while (count--) { ++ rc = qdio_kick_outbound_q(q); ++ if (rc) ++ goto out; ++ } + goto out; + } + +@@ -1573,14 +1534,14 @@ + /* try to fast requeue buffers */ + get_buf_state(q, prev_buf(bufnr), &state, 0); + if (state != SLSB_CU_OUTPUT_PRIMED) +- qdio_kick_outbound_q(q); ++ rc = qdio_kick_outbound_q(q); + else { + DBF_DEV_EVENT(DBF_INFO, q->irq_ptr, "fast-req"); + qdio_perf_stat_inc(&perf_stats.fast_requeue); + } + out: +- /* Fixme: could wait forever if called from process context */ + tasklet_schedule(&q->tasklet); ++ return rc; + } + + /** +@@ -1619,14 +1580,12 @@ + return -EBUSY; + + if (callflags & QDIO_FLAG_SYNC_INPUT) +- handle_inbound(irq_ptr->input_qs[q_nr], callflags, bufnr, +- count); ++ return handle_inbound(irq_ptr->input_qs[q_nr], ++ callflags, bufnr, count); + else if (callflags & QDIO_FLAG_SYNC_OUTPUT) +- handle_outbound(irq_ptr->output_qs[q_nr], callflags, bufnr, +- count); +- else +- return -EINVAL; +- return 0; ++ return handle_outbound(irq_ptr->output_qs[q_nr], ++ callflags, bufnr, count); ++ return -EINVAL; + } + EXPORT_SYMBOL_GPL(do_QDIO); + +diff -urN linux-2.6.27.19-5.1/drivers/s390/cio/qdio_thinint.c linux-2.6.27.23-0.1.1/drivers/s390/cio/qdio_thinint.c +--- linux-2.6.27.19-5.1/drivers/s390/cio/qdio_thinint.c 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/s390/cio/qdio_thinint.c 2009-06-16 13:40:46.000000000 +0100 +@@ -31,6 +31,7 @@ + + /* list of thin interrupt input queues */ + static LIST_HEAD(tiq_list); ++DEFINE_MUTEX(tiq_list_lock); + + /* adapter local summary indicator */ + static unsigned char *tiqdio_alsi; +@@ -95,12 +96,11 @@ + if (!css_qdio_omit_svs && irq_ptr->siga_flag.sync) + css_qdio_omit_svs = 1; + +- for_each_input_queue(irq_ptr, q, i) { ++ mutex_lock(&tiq_list_lock); ++ for_each_input_queue(irq_ptr, q, i) + list_add_rcu(&q->entry, &tiq_list); +- synchronize_rcu(); +- } ++ mutex_unlock(&tiq_list_lock); + xchg(irq_ptr->dsci, 1); +- tasklet_schedule(&tiqdio_tasklet); + } + + /* +@@ -118,7 +118,10 @@ + /* if establish triggered an error */ + if (!q || !q->entry.prev || !q->entry.next) + continue; ++ ++ mutex_lock(&tiq_list_lock); + list_del_rcu(&q->entry); ++ mutex_unlock(&tiq_list_lock); + synchronize_rcu(); + } + } +@@ -155,7 +158,6 @@ + */ + qdio_check_outbound_after_thinint(q); + +-again: + if (!qdio_inbound_q_moved(q)) + return; + +@@ -163,7 +165,8 @@ + + if (!tiqdio_inbound_q_done(q)) { + qdio_perf_stat_inc(&perf_stats.thinint_inbound_loop); +- goto again; ++ if (likely(q->irq_ptr->state != QDIO_IRQ_STATE_STOPPED)) ++ tasklet_schedule(&q->tasklet); + } + + qdio_stop_polling(q); +@@ -173,7 +176,8 @@ + */ + if (!tiqdio_inbound_q_done(q)) { + qdio_perf_stat_inc(&perf_stats.thinint_inbound_loop2); +- goto again; ++ if (likely(q->irq_ptr->state != QDIO_IRQ_STATE_STOPPED)) ++ tasklet_schedule(&q->tasklet); + } + } + +diff -urN linux-2.6.27.19-5.1/drivers/s390/net/ctcm_main.c linux-2.6.27.23-0.1.1/drivers/s390/net/ctcm_main.c +--- linux-2.6.27.19-5.1/drivers/s390/net/ctcm_main.c 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/s390/net/ctcm_main.c 2009-06-16 13:40:46.000000000 +0100 +@@ -1665,10 +1665,8 @@ + BUG_ON(priv == NULL); + + CTCM_DBF_TEXT_(SETUP, CTC_DBF_INFO, +- "removing device %s, r/w = %s/%s, proto : %d", +- priv->channel[READ]->netdev->name, +- priv->channel[READ]->id, priv->channel[WRITE]->id, +- priv->protocol); ++ "removing device %p, proto : %d", ++ cgdev, priv->protocol); + + if (cgdev->state == CCWGROUP_ONLINE) + ctcm_shutdown_device(cgdev); +diff -urN linux-2.6.27.19-5.1/drivers/s390/net/lcs.c linux-2.6.27.23-0.1.1/drivers/s390/net/lcs.c +--- linux-2.6.27.19-5.1/drivers/s390/net/lcs.c 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/s390/net/lcs.c 2009-06-16 13:40:46.000000000 +0100 +@@ -1553,7 +1553,7 @@ + if (skb == NULL) { + card->stats.tx_dropped++; + card->stats.tx_errors++; +- return -EIO; ++ return 0; + } + if (card->state != DEV_STATE_UP) { + dev_kfree_skb(skb); +@@ -1578,7 +1578,7 @@ + card->tx_buffer = lcs_get_buffer(&card->write); + if (card->tx_buffer == NULL) { + card->stats.tx_dropped++; +- rc = -EBUSY; ++ rc = NETDEV_TX_BUSY; + goto out; + } + card->tx_buffer->callback = lcs_txbuffer_cb; +diff -urN linux-2.6.27.19-5.1/drivers/s390/net/qeth_core_main.c linux-2.6.27.23-0.1.1/drivers/s390/net/qeth_core_main.c +--- linux-2.6.27.19-5.1/drivers/s390/net/qeth_core_main.c 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/s390/net/qeth_core_main.c 2009-06-16 13:40:46.000000000 +0100 +@@ -2659,40 +2659,21 @@ + struct qeth_qdio_out_buffer *buffer, unsigned int qdio_err) + { + int sbalf15 = buffer->buffer->element[15].flags & 0xff; +- int cc = qdio_err & 3; + + QETH_DBF_TEXT(TRACE, 6, "hdsnderr"); + qeth_check_qdio_errors(buffer->buffer, qdio_err, "qouterr"); +- switch (cc) { +- case 0: +- if (qdio_err) { +- QETH_DBF_TEXT(TRACE, 1, "lnkfail"); +- QETH_DBF_TEXT_(TRACE, 1, "%s", CARD_BUS_ID(card)); +- QETH_DBF_TEXT_(TRACE, 1, "%04x %02x", +- (u16)qdio_err, (u8)sbalf15); +- return QETH_SEND_ERROR_LINK_FAILURE; +- } ++ ++ if (!qdio_err) + return QETH_SEND_ERROR_NONE; +- case 2: +- if (qdio_err & QDIO_ERROR_SIGA_BUSY) { +- QETH_DBF_TEXT(TRACE, 1, "SIGAcc2B"); +- QETH_DBF_TEXT_(TRACE, 1, "%s", CARD_BUS_ID(card)); +- return QETH_SEND_ERROR_KICK_IT; +- } +- if ((sbalf15 >= 15) && (sbalf15 <= 31)) +- return QETH_SEND_ERROR_RETRY; +- return QETH_SEND_ERROR_LINK_FAILURE; +- /* look at qdio_error and sbalf 15 */ +- case 1: +- QETH_DBF_TEXT(TRACE, 1, "SIGAcc1"); +- QETH_DBF_TEXT_(TRACE, 1, "%s", CARD_BUS_ID(card)); +- return QETH_SEND_ERROR_LINK_FAILURE; +- case 3: +- default: +- QETH_DBF_TEXT(TRACE, 1, "SIGAcc3"); +- QETH_DBF_TEXT_(TRACE, 1, "%s", CARD_BUS_ID(card)); +- return QETH_SEND_ERROR_KICK_IT; +- } ++ ++ if ((sbalf15 >= 15) && (sbalf15 <= 31)) ++ return QETH_SEND_ERROR_RETRY; ++ ++ QETH_DBF_TEXT(TRACE, 1, "lnkfail"); ++ QETH_DBF_TEXT_(TRACE, 1, "%s", CARD_BUS_ID(card)); ++ QETH_DBF_TEXT_(TRACE, 1, "%04x %02x", ++ (u16)qdio_err, (u8)sbalf15); ++ return QETH_SEND_ERROR_LINK_FAILURE; + } + + /* +@@ -2828,10 +2809,14 @@ + qeth_get_micros() - + queue->card->perf_stats.outbound_do_qdio_start_time; + if (rc) { ++ queue->card->stats.tx_errors += count; ++ /* ignore temporary SIGA errors without busy condition */ ++ if (rc == 2) ++ return; + QETH_DBF_TEXT(TRACE, 2, "flushbuf"); + QETH_DBF_TEXT_(TRACE, 2, " err%d", rc); + QETH_DBF_TEXT_(TRACE, 2, "%s", CARD_DDEV_ID(queue->card)); +- queue->card->stats.tx_errors += count; ++ + /* this must not happen under normal circumstances. if it + * happens something is really wrong -> recover */ + qeth_schedule_recovery(queue->card); +@@ -2906,13 +2891,7 @@ + } + for (i = first_element; i < (first_element + count); ++i) { + buffer = &queue->bufs[i % QDIO_MAX_BUFFERS_PER_Q]; +- /*we only handle the KICK_IT error by doing a recovery */ +- if (qeth_handle_send_error(card, buffer, qdio_error) +- == QETH_SEND_ERROR_KICK_IT){ +- netif_stop_queue(card->dev); +- qeth_schedule_recovery(card); +- return; +- } ++ qeth_handle_send_error(card, buffer, qdio_error); + qeth_clear_output_buffer(queue, buffer); + } + atomic_sub(count, &queue->used_buffers); +diff -urN linux-2.6.27.19-5.1/drivers/s390/net/qeth_l2_main.c linux-2.6.27.23-0.1.1/drivers/s390/net/qeth_l2_main.c +--- linux-2.6.27.19-5.1/drivers/s390/net/qeth_l2_main.c 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/s390/net/qeth_l2_main.c 2009-06-16 13:40:46.000000000 +0100 +@@ -388,7 +388,8 @@ + dev_close(card->dev); + rtnl_unlock(); + } +- if (!card->use_hard_stop) { ++ if (!card->use_hard_stop || ++ recovery_mode) { + __u8 *mac = &card->dev->dev_addr[0]; + rc = qeth_l2_send_delmac(card, mac); + QETH_DBF_TEXT_(SETUP, 2, "Lerr%d", rc); +@@ -397,7 +398,8 @@ + } + if (card->state == CARD_STATE_SOFTSETUP) { + qeth_l2_process_vlans(card, 1); +- if (!card->use_hard_stop) ++ if (!card->use_hard_stop || ++ recovery_mode) + qeth_l2_del_all_mc(card); + qeth_clear_ipacmd_list(card); + card->state = CARD_STATE_HARDSETUP; +@@ -871,6 +873,7 @@ + { + struct qeth_card *card = dev_get_drvdata(&cgdev->dev); + ++ qeth_set_allowed_threads(card, 0, 1); + wait_event(card->wait_q, qeth_threads_running(card, 0xffffffff) == 0); + + if (cgdev->state == CCWGROUP_ONLINE) { +@@ -1027,8 +1030,9 @@ + dev_warn(&card->gdev->dev, + "The LAN is offline\n"); + card->lan_online = 0; ++ return 0; + } +- return rc; ++ goto out_remove; + } else + card->lan_online = 1; + +diff -urN linux-2.6.27.19-5.1/drivers/s390/net/qeth_l3_main.c linux-2.6.27.23-0.1.1/drivers/s390/net/qeth_l3_main.c +--- linux-2.6.27.19-5.1/drivers/s390/net/qeth_l3_main.c 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/s390/net/qeth_l3_main.c 2009-06-16 13:40:46.000000000 +0100 +@@ -3033,6 +3033,7 @@ + { + struct qeth_card *card = dev_get_drvdata(&cgdev->dev); + ++ qeth_set_allowed_threads(card, 0, 1); + wait_event(card->wait_q, qeth_threads_running(card, 0xffffffff) == 0); + + if (cgdev->state == CCWGROUP_ONLINE) { +@@ -3107,8 +3108,9 @@ + dev_warn(&card->gdev->dev, + "The LAN is offline\n"); + card->lan_online = 0; ++ return 0; + } +- return rc; ++ goto out_remove; + } else + card->lan_online = 1; + qeth_set_large_send(card, card->options.large_send); +diff -urN linux-2.6.27.19-5.1/drivers/s390/scsi/zfcp_aux.c linux-2.6.27.23-0.1.1/drivers/s390/scsi/zfcp_aux.c +--- linux-2.6.27.19-5.1/drivers/s390/scsi/zfcp_aux.c 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/s390/scsi/zfcp_aux.c 2009-06-16 13:40:46.000000000 +0100 +@@ -133,9 +133,7 @@ + ccw_device_set_online(adapter->ccw_device); + + zfcp_erp_wait(adapter); +- wait_event(adapter->erp_done_wqh, +- !(atomic_read(&unit->status) & +- ZFCP_STATUS_UNIT_SCSI_WORK_PENDING)); ++ flush_work(&unit->scsi_work); + + down(&zfcp_data.config_sema); + zfcp_unit_put(unit); +@@ -288,6 +286,7 @@ + + atomic_set(&unit->refcount, 0); + init_waitqueue_head(&unit->remove_wq); ++ INIT_WORK(&unit->scsi_work, zfcp_scsi_scan); + + unit->port = port; + unit->fcp_lun = fcp_lun; +@@ -612,10 +611,13 @@ + init_waitqueue_head(&port->remove_wq); + INIT_LIST_HEAD(&port->unit_list_head); + INIT_WORK(&port->gid_pn_work, zfcp_erp_port_strategy_open_lookup); ++ INIT_WORK(&port->test_link_work, zfcp_fc_link_test_work); ++ INIT_WORK(&port->rport_work, zfcp_scsi_rport_work); + + port->adapter = adapter; + port->d_id = d_id; + port->wwpn = wwpn; ++ port->rport_task = RPORT_NONE; + + /* mark port unusable as long as sysfs registration is not complete */ + atomic_set_mask(status | ZFCP_STATUS_COMMON_REMOVE, &port->status); +@@ -676,8 +678,7 @@ + list_del(&port->list); + write_unlock_irq(&zfcp_data.config_lock); + if (port->rport) +- fc_remote_port_delete(port->rport); +- port->rport = NULL; ++ port->rport->dd_data = NULL; + zfcp_adapter_put(port->adapter); + sysfs_remove_group(&port->sysfs_device.kobj, &zfcp_sysfs_port_attrs); + device_unregister(&port->sysfs_device); +diff -urN linux-2.6.27.19-5.1/drivers/s390/scsi/zfcp_ccw.c linux-2.6.27.23-0.1.1/drivers/s390/scsi/zfcp_ccw.c +--- linux-2.6.27.19-5.1/drivers/s390/scsi/zfcp_ccw.c 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/s390/scsi/zfcp_ccw.c 2009-06-16 13:40:46.000000000 +0100 +@@ -175,6 +175,11 @@ + zfcp_erp_adapter_reopen(adapter, ZFCP_STATUS_COMMON_ERP_FAILED, + 89, NULL); + break; ++ case CIO_BOXED: ++ dev_warn(&adapter->ccw_device->dev, "The FCP device " ++ "did not respond within the specified time\n"); ++ zfcp_erp_adapter_shutdown(adapter, 0, 91, NULL); ++ break; + } + return 1; + } +diff -urN linux-2.6.27.19-5.1/drivers/s390/scsi/zfcp_cfdc.c linux-2.6.27.23-0.1.1/drivers/s390/scsi/zfcp_cfdc.c +--- linux-2.6.27.19-5.1/drivers/s390/scsi/zfcp_cfdc.c 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/s390/scsi/zfcp_cfdc.c 2009-06-16 13:40:46.000000000 +0100 +@@ -207,6 +207,7 @@ + retval = -ENXIO; + goto free_buffer; + } ++ zfcp_adapter_get(adapter); + + retval = zfcp_cfdc_sg_setup(data->command, fsf_cfdc->sg, + data_user->control_file); +diff -urN linux-2.6.27.19-5.1/drivers/s390/scsi/zfcp_dbf.c linux-2.6.27.23-0.1.1/drivers/s390/scsi/zfcp_dbf.c +--- linux-2.6.27.19-5.1/drivers/s390/scsi/zfcp_dbf.c 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/s390/scsi/zfcp_dbf.c 2009-06-16 13:40:46.000000000 +0100 +@@ -545,15 +545,15 @@ + [53] = "port boxed fcp", + [54] = "unit boxed fcp", + [55] = "port access denied", +- [56] = "", +- [57] = "", ++ [56] = "port d_id changed", ++ [57] = "port reopen on RSCN reception", + [58] = "", + [59] = "unit access denied", + [60] = "shared unit access denied open unit", + [61] = "", + [62] = "request timeout", + [63] = "adisc link test reject or timeout", +- [64] = "adisc link test d_id changed", ++ [64] = "adisc link test d_id changed or port not open", + [65] = "adisc link test failed", + [66] = "recovery out of memory", + [67] = "adapter recovery repeated after state change", +@@ -574,7 +574,7 @@ + [79] = "link down", + [80] = "exclusive read-only unit access unsupported", + [81] = "shared read-write unit access unsupported", +- [82] = "incoming rscn", ++ [82] = "", + [83] = "incoming wwpn", + [84] = "wka port handle not valid close port", + [85] = "online", +@@ -644,6 +644,7 @@ + [149] = "port scan", + [150] = "ptp attach", + [151] = "port validation failed", ++ [152] = "term rport io", + }; + + static int zfcp_rec_dbf_view_format(debug_info_t *id, struct debug_view *view, +diff -urN linux-2.6.27.19-5.1/drivers/s390/scsi/zfcp_def.h linux-2.6.27.23-0.1.1/drivers/s390/scsi/zfcp_def.h +--- linux-2.6.27.19-5.1/drivers/s390/scsi/zfcp_def.h 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/s390/scsi/zfcp_def.h 2009-06-16 13:40:46.000000000 +0100 +@@ -273,7 +273,6 @@ + #define ZFCP_STATUS_UNIT_SHARED 0x00000004 + #define ZFCP_STATUS_UNIT_READONLY 0x00000008 + #define ZFCP_STATUS_UNIT_REGISTERED 0x00000010 +-#define ZFCP_STATUS_UNIT_SCSI_WORK_PENDING 0x00000020 + + /* FSF request status (this does not have a common part) */ + #define ZFCP_STATUS_FSFREQ_TASK_MANAGEMENT 0x00000002 +@@ -539,6 +538,9 @@ + u32 maxframe_size; + u32 supported_classes; + struct work_struct gid_pn_work; ++ struct work_struct test_link_work; ++ struct work_struct rport_work; ++ enum { RPORT_NONE, RPORT_ADD, RPORT_DEL } rport_task; + }; + + struct zfcp_unit { +@@ -555,6 +557,7 @@ + struct zfcp_erp_action erp_action; /* pending error recovery */ + atomic_t erp_counter; + struct zfcp_latencies latencies; ++ struct work_struct scsi_work; + }; + + /* FSF request */ +diff -urN linux-2.6.27.19-5.1/drivers/s390/scsi/zfcp_erp.c linux-2.6.27.23-0.1.1/drivers/s390/scsi/zfcp_erp.c +--- linux-2.6.27.19-5.1/drivers/s390/scsi/zfcp_erp.c 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/s390/scsi/zfcp_erp.c 2009-06-16 13:40:46.000000000 +0100 +@@ -239,6 +239,7 @@ + int clear_mask, u8 id, void *ref) + { + zfcp_erp_adapter_block(adapter, clear_mask); ++ zfcp_scsi_schedule_rports_block(adapter); + + /* ensure propagation of failed status to new devices */ + if (atomic_read(&adapter->status) & ZFCP_STATUS_COMMON_ERP_FAILED) { +@@ -319,6 +320,7 @@ + int clear, u8 id, void *ref) + { + zfcp_erp_port_block(port, clear); ++ zfcp_scsi_schedule_rport_block(port); + + if (atomic_read(&port->status) & ZFCP_STATUS_COMMON_ERP_FAILED) + return; +@@ -350,6 +352,7 @@ + void *ref) + { + zfcp_erp_port_block(port, clear); ++ zfcp_scsi_schedule_rport_block(port); + + if (atomic_read(&port->status) & ZFCP_STATUS_COMMON_ERP_FAILED) { + /* ensure propagation of failed status to new devices */ +@@ -722,7 +725,6 @@ + goto failed_openfcp; + + atomic_set_mask(ZFCP_STATUS_COMMON_OPEN, &act->adapter->status); +- schedule_work(&act->adapter->scan_work); + + return ZFCP_ERP_SUCCEEDED; + +@@ -735,6 +737,7 @@ + zfcp_qdio_close(adapter); + zfcp_fsf_req_dismiss_all(adapter); + adapter->fsf_req_seq_no = 0; ++ zfcp_fc_wka_port_force_offline(&adapter->nsp); + /* all ports and units are closed */ + zfcp_erp_modify_adapter_status(adapter, 24, NULL, + ZFCP_STATUS_COMMON_OPEN, ZFCP_CLEAR); +@@ -856,7 +859,7 @@ + port->erp_action.step = ZFCP_ERP_STEP_NAMESERVER_LOOKUP; + if (retval) + zfcp_erp_notify(&port->erp_action, ZFCP_ERP_FAILED); +- ++ zfcp_port_put(port); + } + + static int zfcp_erp_port_strategy_open_common(struct zfcp_erp_action *act) +@@ -872,7 +875,10 @@ + if (fc_host_port_type(adapter->scsi_host) == FC_PORTTYPE_PTP) + return zfcp_erp_open_ptp_port(act); + if (!(p_status & ZFCP_STATUS_PORT_DID_DID)) { +- queue_work(zfcp_data.work_queue, &port->gid_pn_work); ++ zfcp_port_get(port); ++ if (!queue_work(zfcp_data.work_queue, ++ &port->gid_pn_work)) ++ zfcp_port_put(port); + return ZFCP_ERP_CONTINUES; + } + case ZFCP_ERP_STEP_NAMESERVER_LOOKUP: +@@ -886,7 +892,6 @@ + return zfcp_erp_port_strategy_open_port(act); + + case ZFCP_ERP_STEP_PORT_OPENING: +- /* D_ID might have changed during open */ + if (p_status & ZFCP_STATUS_COMMON_OPEN) { + if (p_status & ZFCP_STATUS_PORT_DID_DID) + return ZFCP_ERP_SUCCEEDED; +@@ -894,8 +899,15 @@ + act->step = ZFCP_ERP_STEP_PORT_CLOSING; + return ZFCP_ERP_CONTINUES; + } +- /* fall through otherwise */ + } ++ if ((atomic_read(&port->status) & ZFCP_STATUS_PORT_DID_DID) && ++ !(p_status & ZFCP_STATUS_COMMON_NOESC)) { ++ atomic_clear_mask(ZFCP_STATUS_PORT_DID_DID, ++ &port->status); ++ _zfcp_erp_port_reopen(port, 0, 56, NULL); ++ return ZFCP_ERP_EXIT; ++ } ++ /* fall through otherwise */ + } + return ZFCP_ERP_FAILED; + } +@@ -1177,78 +1189,6 @@ + } + } + +-struct zfcp_erp_add_work { +- struct zfcp_unit *unit; +- struct work_struct work; +-}; +- +-static void zfcp_erp_scsi_scan(struct work_struct *work) +-{ +- struct zfcp_erp_add_work *p = +- container_of(work, struct zfcp_erp_add_work, work); +- struct zfcp_unit *unit = p->unit; +- struct fc_rport *rport = unit->port->rport; +- +- if (rport && rport->port_state == FC_PORTSTATE_ONLINE) +- scsi_scan_target(&rport->dev, 0, rport->scsi_target_id, +- scsilun_to_int((struct scsi_lun *)&unit->fcp_lun), 0); +- atomic_clear_mask(ZFCP_STATUS_UNIT_SCSI_WORK_PENDING, &unit->status); +- zfcp_unit_put(unit); +- wake_up(&unit->port->adapter->erp_done_wqh); +- kfree(p); +-} +- +-static void zfcp_erp_schedule_work(struct zfcp_unit *unit) +-{ +- struct zfcp_erp_add_work *p; +- +- p = kzalloc(sizeof(*p), GFP_KERNEL); +- if (!p) { +- dev_err(&unit->port->adapter->ccw_device->dev, +- "Registering unit 0x%016Lx on port 0x%016Lx failed\n", +- (unsigned long long)unit->fcp_lun, +- (unsigned long long)unit->port->wwpn); +- return; +- } +- +- zfcp_unit_get(unit); +- atomic_set_mask(ZFCP_STATUS_UNIT_SCSI_WORK_PENDING, &unit->status); +- INIT_WORK(&p->work, zfcp_erp_scsi_scan); +- p->unit = unit; +- queue_work(zfcp_data.work_queue, &p->work); +-} +- +-static void zfcp_erp_rport_register(struct zfcp_port *port) +-{ +- struct fc_rport_identifiers ids; +- ids.node_name = port->wwnn; +- ids.port_name = port->wwpn; +- ids.port_id = port->d_id; +- ids.roles = FC_RPORT_ROLE_FCP_TARGET; +- port->rport = fc_remote_port_add(port->adapter->scsi_host, 0, &ids); +- if (!port->rport) { +- dev_err(&port->adapter->ccw_device->dev, +- "Registering port 0x%016Lx failed\n", +- (unsigned long long)port->wwpn); +- return; +- } +- +- scsi_target_unblock(&port->rport->dev); +- port->rport->maxframe_size = port->maxframe_size; +- port->rport->supported_classes = port->supported_classes; +-} +- +-static void zfcp_erp_rports_del(struct zfcp_adapter *adapter) +-{ +- struct zfcp_port *port; +- list_for_each_entry(port, &adapter->port_list_head, list) { +- if (!port->rport) +- continue; +- fc_remote_port_delete(port->rport); +- port->rport = NULL; +- } +-} +- + static void zfcp_erp_action_cleanup(struct zfcp_erp_action *act, int result) + { + struct zfcp_adapter *adapter = act->adapter; +@@ -1257,13 +1197,13 @@ + + switch (act->action) { + case ZFCP_ERP_ACTION_REOPEN_UNIT: +- if ((result == ZFCP_ERP_SUCCEEDED) && +- !unit->device && port->rport) { ++ if ((result == ZFCP_ERP_SUCCEEDED) && !unit->device) { + atomic_set_mask(ZFCP_STATUS_UNIT_REGISTERED, + &unit->status); +- if (!(atomic_read(&unit->status) & +- ZFCP_STATUS_UNIT_SCSI_WORK_PENDING)) +- zfcp_erp_schedule_work(unit); ++ zfcp_unit_get(unit); ++ if (scsi_queue_work(unit->port->adapter->scsi_host, ++ &unit->scsi_work) <= 0) ++ zfcp_unit_put(unit); + } + zfcp_unit_put(unit); + break; +@@ -1274,18 +1214,13 @@ + zfcp_port_put(port); + return; + } +- if ((result == ZFCP_ERP_SUCCEEDED) && !port->rport) +- zfcp_erp_rport_register(port); +- if ((result != ZFCP_ERP_SUCCEEDED) && port->rport) { +- fc_remote_port_delete(port->rport); +- port->rport = NULL; +- } ++ if (result == ZFCP_ERP_SUCCEEDED) ++ zfcp_scsi_schedule_rport_register(port); + zfcp_port_put(port); + break; + + case ZFCP_ERP_ACTION_REOPEN_ADAPTER: +- if (result != ZFCP_ERP_SUCCEEDED) +- zfcp_erp_rports_del(adapter); ++ schedule_work(&adapter->scan_work); + zfcp_adapter_put(adapter); + break; + } +@@ -1380,6 +1315,7 @@ + struct list_head *next; + struct zfcp_erp_action *act; + unsigned long flags; ++ int ignore; + + daemonize("zfcperp%s", adapter->ccw_device->dev.bus_id); + /* Block all signals */ +@@ -1389,6 +1325,11 @@ + + while (!(atomic_read(&adapter->status) & + ZFCP_STATUS_ADAPTER_ERP_THREAD_KILL)) { ++ ++ zfcp_rec_dbf_event_thread_lock(4, adapter); ++ ignore = down_interruptible(&adapter->erp_ready_sem); ++ zfcp_rec_dbf_event_thread_lock(5, adapter); ++ + write_lock_irqsave(&adapter->erp_lock, flags); + next = adapter->erp_ready_head.next; + write_unlock_irqrestore(&adapter->erp_lock, flags); +@@ -1400,10 +1341,6 @@ + if (zfcp_erp_strategy(act) != ZFCP_ERP_DISMISSED) + zfcp_erp_wakeup(adapter); + } +- +- zfcp_rec_dbf_event_thread_lock(4, adapter); +- down_interruptible(&adapter->erp_ready_sem); +- zfcp_rec_dbf_event_thread_lock(5, adapter); + } + + atomic_clear_mask(ZFCP_STATUS_ADAPTER_ERP_THREAD_UP, &adapter->status); +diff -urN linux-2.6.27.19-5.1/drivers/s390/scsi/zfcp_ext.h linux-2.6.27.23-0.1.1/drivers/s390/scsi/zfcp_ext.h +--- linux-2.6.27.19-5.1/drivers/s390/scsi/zfcp_ext.h 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/s390/scsi/zfcp_ext.h 2009-06-16 13:40:46.000000000 +0100 +@@ -101,7 +101,9 @@ + extern int zfcp_fc_ns_gid_pn(struct zfcp_erp_action *); + extern void zfcp_fc_plogi_evaluate(struct zfcp_port *, struct fsf_plogi *); + extern void zfcp_test_link(struct zfcp_port *); ++extern void zfcp_fc_link_test_work(struct work_struct *); + extern void zfcp_fc_nameserver_init(struct zfcp_adapter *); ++extern void zfcp_fc_wka_port_force_offline(struct zfcp_wka_port *); + + /* zfcp_fsf.c */ + extern int zfcp_fsf_open_port(struct zfcp_erp_action *); +@@ -153,6 +155,11 @@ + extern void zfcp_adapter_scsi_unregister(struct zfcp_adapter *); + extern char *zfcp_get_fcp_sns_info_ptr(struct fcp_rsp_iu *); + extern struct fc_function_template zfcp_transport_functions; ++extern void zfcp_scsi_rport_work(struct work_struct *); ++extern void zfcp_scsi_schedule_rport_register(struct zfcp_port *); ++extern void zfcp_scsi_schedule_rport_block(struct zfcp_port *); ++extern void zfcp_scsi_schedule_rports_block(struct zfcp_adapter *); ++extern void zfcp_scsi_scan(struct work_struct *); + + /* zfcp_sysfs.c */ + extern struct attribute_group zfcp_sysfs_unit_attrs; +diff -urN linux-2.6.27.19-5.1/drivers/s390/scsi/zfcp_fc.c linux-2.6.27.23-0.1.1/drivers/s390/scsi/zfcp_fc.c +--- linux-2.6.27.19-5.1/drivers/s390/scsi/zfcp_fc.c 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/s390/scsi/zfcp_fc.c 2009-06-16 13:40:46.000000000 +0100 +@@ -75,9 +75,6 @@ + struct zfcp_wka_port *wka_port = + container_of(dw, struct zfcp_wka_port, work); + +- wait_event(wka_port->completion_wq, +- atomic_read(&wka_port->refcount) == 0); +- + mutex_lock(&wka_port->mutex); + if ((atomic_read(&wka_port->refcount) != 0) || + (wka_port->status != ZFCP_WKA_PORT_ONLINE)) +@@ -115,6 +112,14 @@ + INIT_DELAYED_WORK(&wka_port->work, zfcp_wka_port_offline); + } + ++void zfcp_fc_wka_port_force_offline(struct zfcp_wka_port *wka) ++{ ++ cancel_delayed_work_sync(&wka->work); ++ mutex_lock(&wka->mutex); ++ wka->status = ZFCP_WKA_PORT_OFFLINE; ++ mutex_unlock(&wka->mutex); ++} ++ + static void _zfcp_fc_incoming_rscn(struct zfcp_fsf_req *fsf_req, u32 range, + struct fcp_rscn_element *elem) + { +@@ -123,15 +128,14 @@ + + read_lock_irqsave(&zfcp_data.config_lock, flags); + list_for_each_entry(port, &fsf_req->adapter->port_list_head, list) { +- if (!(atomic_read(&port->status) & ZFCP_STATUS_PORT_PHYS_OPEN)) +- /* Try to connect to unused ports anyway. */ +- zfcp_erp_port_reopen(port, +- ZFCP_STATUS_COMMON_ERP_FAILED, +- 82, fsf_req); +- else if ((port->d_id & range) == (elem->nport_did & range)) +- /* Check connection status for connected ports */ ++ if ((port->d_id & range) == (elem->nport_did & range)) + zfcp_test_link(port); ++ if (!(atomic_read(&port->status) & ZFCP_STATUS_PORT_DID_DID)) ++ zfcp_erp_port_reopen(port, ++ ZFCP_STATUS_COMMON_ERP_FAILED, 57, ++ 0); + } ++ + read_unlock_irqrestore(&zfcp_data.config_lock, flags); + } + +@@ -368,15 +372,23 @@ + + if (adisc->els.status) { + /* request rejected or timed out */ +- zfcp_erp_port_forced_reopen(port, 0, 63, NULL); ++ zfcp_erp_port_forced_reopen(port, ZFCP_STATUS_COMMON_ERP_FAILED, ++ 63, NULL); + goto out; + } + + if (!port->wwnn) + port->wwnn = ls_adisc->wwnn; + +- if (port->wwpn != ls_adisc->wwpn) +- zfcp_erp_port_reopen(port, 0, 64, NULL); ++ if ((port->wwpn != ls_adisc->wwpn) || ++ !(atomic_read(&port->status) & ZFCP_STATUS_COMMON_OPEN)) { ++ zfcp_erp_port_reopen(port, ZFCP_STATUS_COMMON_ERP_FAILED, 64, ++ NULL); ++ goto out; ++ } ++ ++ /* port is good, unblock rport without going through erp */ ++ zfcp_scsi_schedule_rport_register(port); + + out: + zfcp_port_put(port); +@@ -415,6 +427,26 @@ + return zfcp_fsf_send_els(&adisc->els); + } + ++void zfcp_fc_link_test_work(struct work_struct *work) ++{ ++ struct zfcp_port *port = ++ container_of(work, struct zfcp_port, test_link_work); ++ int retval; ++ ++ zfcp_port_get(port); ++ port->rport_task = RPORT_DEL; ++ zfcp_scsi_rport_work(&port->rport_work); ++ ++ retval = zfcp_fc_adisc(port); ++ if (retval == 0) ++ return; ++ ++ /* send of ADISC was not possible */ ++ zfcp_erp_port_forced_reopen(port, 0, 65, NULL); ++ ++ zfcp_port_put(port); ++} ++ + /** + * zfcp_test_link - lightweight link test procedure + * @port: port to be tested +@@ -425,17 +457,9 @@ + */ + void zfcp_test_link(struct zfcp_port *port) + { +- int retval; +- + zfcp_port_get(port); +- retval = zfcp_fc_adisc(port); +- if (retval == 0) +- return; +- +- /* send of ADISC was not possible */ +- zfcp_port_put(port); +- if (retval != -EBUSY) +- zfcp_erp_port_forced_reopen(port, 0, 65, NULL); ++ if (!queue_work(zfcp_data.work_queue, &port->test_link_work)) ++ zfcp_port_put(port); + } + + static void zfcp_free_sg_env(struct zfcp_gpn_ft *gpn_ft, int buf_num) +@@ -516,6 +540,9 @@ + { + struct zfcp_adapter *adapter = port->adapter; + ++ if (!(atomic_read(&port->status) & ZFCP_STATUS_COMMON_NOESC)) ++ return; ++ + atomic_clear_mask(ZFCP_STATUS_COMMON_NOESC, &port->status); + + if ((port->supported_classes != 0) || +@@ -576,10 +603,8 @@ + if (acc->wwpn == fc_host_port_name(adapter->scsi_host)) + continue; + port = zfcp_get_port_by_wwpn(adapter, acc->wwpn); +- if (port) { +- zfcp_port_get(port); ++ if (port) + continue; +- } + + port = zfcp_port_enqueue(adapter, acc->wwpn, + ZFCP_STATUS_PORT_DID_DID | +@@ -612,7 +637,6 @@ + max_entries = chain ? ZFCP_GPN_FT_MAX_ENTRIES : ZFCP_GPN_FT_ENTRIES; + max_bytes = chain ? ZFCP_GPN_FT_MAX_SIZE : ZFCP_CT_SIZE_ONE_PAGE; + +- zfcp_erp_wait(adapter); /* wait until adapter is finished with ERP */ + if (fc_host_port_type(adapter->scsi_host) != FC_PORTTYPE_NPORT) + return 0; + +diff -urN linux-2.6.27.19-5.1/drivers/s390/scsi/zfcp_fsf.c linux-2.6.27.23-0.1.1/drivers/s390/scsi/zfcp_fsf.c +--- linux-2.6.27.19-5.1/drivers/s390/scsi/zfcp_fsf.c 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/s390/scsi/zfcp_fsf.c 2009-06-16 13:40:46.000000000 +0100 +@@ -175,12 +175,17 @@ + struct fsf_link_down_info *link_down) + { + struct zfcp_adapter *adapter = req->adapter; ++ unsigned long flags; + + if (atomic_read(&adapter->status) & ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED) + return; + + atomic_set_mask(ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED, &adapter->status); + ++ read_lock_irqsave(&zfcp_data.config_lock, flags); ++ zfcp_scsi_schedule_rports_block(adapter); ++ read_unlock_irqrestore(&zfcp_data.config_lock, flags); ++ + if (!link_down) + goto out; + +@@ -654,14 +659,6 @@ + return 0; + } + +-static int zfcp_fsf_sbal_available(struct zfcp_adapter *adapter) +-{ +- unsigned int count = atomic_read(&adapter->req_q.count); +- if (!count) +- atomic_inc(&adapter->qdio_outb_full); +- return count > 0; +-} +- + static int zfcp_fsf_req_sbal_get(struct zfcp_adapter *adapter) + { + long ret; +@@ -927,8 +924,8 @@ + struct qdio_buffer_element *sbale; + struct zfcp_fsf_req *req = NULL; + +- spin_lock(&adapter->req_q_lock); +- if (!zfcp_fsf_sbal_available(adapter)) ++ spin_lock_bh(&adapter->req_q_lock); ++ if (zfcp_fsf_req_sbal_get(adapter)) + goto out; + req = zfcp_fsf_req_create(adapter, FSF_QTCB_ABORT_FCP_CMND, + req_flags, adapter->pool.fsf_req_abort); +@@ -959,7 +956,7 @@ + zfcp_fsf_req_free(req); + req = NULL; + out: +- spin_unlock(&adapter->req_q_lock); ++ spin_unlock_bh(&adapter->req_q_lock); + return req; + } + +@@ -1173,12 +1170,8 @@ + struct fsf_qtcb_bottom_support *bottom; + int ret = -EIO; + +- if (unlikely(!(atomic_read(&els->port->status) & +- ZFCP_STATUS_COMMON_UNBLOCKED))) +- return -EBUSY; +- +- spin_lock(&adapter->req_q_lock); +- if (!zfcp_fsf_sbal_available(adapter)) ++ spin_lock_bh(&adapter->req_q_lock); ++ if (zfcp_fsf_req_sbal_get(adapter)) + goto out; + req = zfcp_fsf_req_create(adapter, FSF_QTCB_SEND_ELS, + ZFCP_REQ_AUTO_CLEANUP, NULL); +@@ -1211,7 +1204,7 @@ + failed_send: + zfcp_fsf_req_free(req); + out: +- spin_unlock(&adapter->req_q_lock); ++ spin_unlock_bh(&adapter->req_q_lock); + return ret; + } + +@@ -1223,7 +1216,7 @@ + int retval = -EIO; + + spin_lock_bh(&adapter->req_q_lock); +- if (!zfcp_fsf_sbal_available(adapter)) ++ if (zfcp_fsf_req_sbal_get(adapter)) + goto out; + req = zfcp_fsf_req_create(adapter, + FSF_QTCB_EXCHANGE_CONFIG_DATA, +@@ -1267,13 +1260,13 @@ + + spin_lock_bh(&adapter->req_q_lock); + if (zfcp_fsf_req_sbal_get(adapter)) +- goto out; ++ goto out_unlock; + + req = zfcp_fsf_req_create(adapter, FSF_QTCB_EXCHANGE_CONFIG_DATA, + 0, NULL); + if (IS_ERR(req)) { + retval = PTR_ERR(req); +- goto out; ++ goto out_unlock; + } + + sbale = zfcp_qdio_sbale_req(req); +@@ -1292,14 +1285,16 @@ + + zfcp_fsf_start_timer(req, ZFCP_FSF_REQUEST_TIMEOUT); + retval = zfcp_fsf_req_send(req); +-out: + spin_unlock_bh(&adapter->req_q_lock); + if (!retval) + wait_event(req->completion_wq, + req->status & ZFCP_STATUS_FSFREQ_COMPLETED); + + zfcp_fsf_req_free(req); ++ return retval; + ++out_unlock: ++ spin_unlock_bh(&adapter->req_q_lock); + return retval; + } + +@@ -1319,7 +1314,7 @@ + return -EOPNOTSUPP; + + spin_lock_bh(&adapter->req_q_lock); +- if (!zfcp_fsf_sbal_available(adapter)) ++ if (zfcp_fsf_req_sbal_get(adapter)) + goto out; + req = zfcp_fsf_req_create(adapter, FSF_QTCB_EXCHANGE_PORT_DATA, + ZFCP_REQ_AUTO_CLEANUP, +@@ -1365,14 +1360,14 @@ + return -EOPNOTSUPP; + + spin_lock_bh(&adapter->req_q_lock); +- if (!zfcp_fsf_sbal_available(adapter)) +- goto out; ++ if (zfcp_fsf_req_sbal_get(adapter)) ++ goto out_unlock; + + req = zfcp_fsf_req_create(adapter, FSF_QTCB_EXCHANGE_PORT_DATA, 0, + NULL); + if (IS_ERR(req)) { + retval = PTR_ERR(req); +- goto out; ++ goto out_unlock; + } + + if (data) +@@ -1385,14 +1380,18 @@ + req->handler = zfcp_fsf_exchange_port_data_handler; + zfcp_fsf_start_timer(req, ZFCP_FSF_REQUEST_TIMEOUT); + retval = zfcp_fsf_req_send(req); +-out: + spin_unlock_bh(&adapter->req_q_lock); ++ + if (!retval) + wait_event(req->completion_wq, + req->status & ZFCP_STATUS_FSFREQ_COMPLETED); + zfcp_fsf_req_free(req); + + return retval; ++ ++out_unlock: ++ spin_unlock_bh(&adapter->req_q_lock); ++ return retval; + } + + static void zfcp_fsf_open_port_handler(struct zfcp_fsf_req *req) +@@ -2336,8 +2335,10 @@ + return -EBUSY; + + spin_lock(&adapter->req_q_lock); +- if (!zfcp_fsf_sbal_available(adapter)) ++ if (atomic_read(&adapter->req_q.count) <= 0) { ++ atomic_inc(&adapter->qdio_outb_full); + goto out; ++ } + req = zfcp_fsf_req_create(adapter, FSF_QTCB_FCP_CMND, req_flags, + adapter->pool.fsf_req_scsi); + if (IS_ERR(req)) { +@@ -2458,8 +2459,8 @@ + ZFCP_STATUS_COMMON_UNBLOCKED))) + return NULL; + +- spin_lock(&adapter->req_q_lock); +- if (!zfcp_fsf_sbal_available(adapter)) ++ spin_lock_bh(&adapter->req_q_lock); ++ if (zfcp_fsf_req_sbal_get(adapter)) + goto out; + req = zfcp_fsf_req_create(adapter, FSF_QTCB_FCP_CMND, req_flags, + adapter->pool.fsf_req_scsi); +@@ -2493,14 +2494,12 @@ + zfcp_fsf_req_free(req); + req = NULL; + out: +- spin_unlock(&adapter->req_q_lock); ++ spin_unlock_bh(&adapter->req_q_lock); + return req; + } + + static void zfcp_fsf_control_file_handler(struct zfcp_fsf_req *req) + { +- if (req->qtcb->header.fsf_status != FSF_GOOD) +- req->status |= ZFCP_STATUS_FSFREQ_ERROR; + } + + /** +diff -urN linux-2.6.27.19-5.1/drivers/s390/scsi/zfcp_scsi.c linux-2.6.27.23-0.1.1/drivers/s390/scsi/zfcp_scsi.c +--- linux-2.6.27.19-5.1/drivers/s390/scsi/zfcp_scsi.c 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/s390/scsi/zfcp_scsi.c 2009-06-16 13:40:46.000000000 +0100 +@@ -28,7 +28,6 @@ + struct zfcp_unit *unit = (struct zfcp_unit *) sdpnt->hostdata; + atomic_clear_mask(ZFCP_STATUS_UNIT_REGISTERED, &unit->status); + unit->device = NULL; +- zfcp_erp_unit_failed(unit, 12, NULL); + zfcp_unit_put(unit); + } + +@@ -57,8 +56,8 @@ + { + struct zfcp_unit *unit; + struct zfcp_adapter *adapter; +- int status; +- int ret; ++ int status, scsi_result, ret; ++ struct fc_rport *rport = starget_to_rport(scsi_target(scpnt->device)); + + /* reset the status for this request */ + scpnt->result = 0; +@@ -80,6 +79,14 @@ + return 0; + } + ++ scsi_result = fc_remote_port_chkready(rport); ++ if (unlikely(scsi_result)) { ++ scpnt->result = scsi_result; ++ zfcp_scsi_dbf_event_result("fail", 4, adapter, scpnt, NULL); ++ scpnt->scsi_done(scpnt); ++ return 0; ++ } ++ + status = atomic_read(&unit->status); + if (unlikely((status & ZFCP_STATUS_COMMON_ERP_FAILED) || + !(status & ZFCP_STATUS_COMMON_RUNNING))) { +@@ -168,7 +175,7 @@ + if (!fsf_req) { + write_unlock_irqrestore(&adapter->abort_lock, flags); + zfcp_scsi_dbf_event_abort("lte1", adapter, scpnt, NULL, 0); +- return retval; ++ return FAILED; /* completion could be in progress */ + } + fsf_req->data = NULL; + +@@ -478,6 +485,139 @@ + rport->dev_loss_tmo = timeout; + } + ++/** ++ * zfcp_scsi_dev_loss_tmo_callbk - Free any reference to rport ++ * @rport: The rport that is about to be deleted. ++ */ ++static void zfcp_scsi_dev_loss_tmo_callbk(struct fc_rport *rport) ++{ ++ struct zfcp_port *port; ++ ++ write_lock_irq(&zfcp_data.config_lock); ++ port = rport->dd_data; ++ if (port) ++ port->rport = NULL; ++ write_unlock_irq(&zfcp_data.config_lock); ++} ++ ++/** ++ * zfcp_scsi_terminate_rport_io - Terminate all I/O on a rport ++ * @rport: The FC rport where to teminate I/O ++ * ++ * Abort all pending SCSI commands for a port by closing the ++ * port. Using a reopen for avoids a conflict with a shutdown ++ * overwriting a reopen. ++ */ ++static void zfcp_scsi_terminate_rport_io(struct fc_rport *rport) ++{ ++ struct zfcp_port *port; ++ ++ write_lock_irq(&zfcp_data.config_lock); ++ port = rport->dd_data; ++ if (port) ++ zfcp_port_get(port); ++ write_unlock_irq(&zfcp_data.config_lock); ++ ++ if (port) { ++ zfcp_erp_port_reopen(port, 0, 152, NULL); ++ zfcp_port_put(port); ++ } ++} ++ ++static void zfcp_scsi_rport_register(struct zfcp_port *port) ++{ ++ struct fc_rport_identifiers ids; ++ struct fc_rport *rport; ++ ++ ids.node_name = port->wwnn; ++ ids.port_name = port->wwpn; ++ ids.port_id = port->d_id; ++ ids.roles = FC_RPORT_ROLE_FCP_TARGET; ++ ++ rport = fc_remote_port_add(port->adapter->scsi_host, 0, &ids); ++ if (!rport) { ++ dev_err(&port->adapter->ccw_device->dev, ++ "Registering port 0x%016Lx failed\n", ++ (unsigned long long)port->wwpn); ++ return; ++ } ++ ++ rport->dd_data = port; ++ rport->maxframe_size = port->maxframe_size; ++ rport->supported_classes = port->supported_classes; ++ port->rport = rport; ++} ++ ++static void zfcp_scsi_rport_block(struct zfcp_port *port) ++{ ++ struct fc_rport *rport = port->rport; ++ ++ if (rport) ++ fc_remote_port_delete(rport); ++} ++ ++void zfcp_scsi_schedule_rport_register(struct zfcp_port *port) ++{ ++ zfcp_port_get(port); ++ port->rport_task = RPORT_ADD; ++ ++ if (!queue_work(zfcp_data.work_queue, &port->rport_work)) ++ zfcp_port_put(port); ++} ++ ++void zfcp_scsi_schedule_rport_block(struct zfcp_port *port) ++{ ++ zfcp_port_get(port); ++ port->rport_task = RPORT_DEL; ++ ++ if (!queue_work(zfcp_data.work_queue, &port->rport_work)) ++ zfcp_port_put(port); ++} ++ ++void zfcp_scsi_schedule_rports_block(struct zfcp_adapter *adapter) ++{ ++ struct zfcp_port *port; ++ ++ list_for_each_entry(port, &adapter->port_list_head, list) ++ zfcp_scsi_schedule_rport_block(port); ++} ++ ++void zfcp_scsi_rport_work(struct work_struct *work) ++{ ++ struct zfcp_port *port = container_of(work, struct zfcp_port, ++ rport_work); ++ ++ while (port->rport_task) { ++ if (port->rport_task == RPORT_ADD) { ++ port->rport_task = RPORT_NONE; ++ zfcp_scsi_rport_register(port); ++ } else { ++ port->rport_task = RPORT_NONE; ++ zfcp_scsi_rport_block(port); ++ } ++ } ++ ++ zfcp_port_put(port); ++} ++ ++ ++void zfcp_scsi_scan(struct work_struct *work) ++{ ++ struct zfcp_unit *unit = container_of(work, struct zfcp_unit, ++ scsi_work); ++ struct fc_rport *rport; ++ ++ flush_work(&unit->port->rport_work); ++ rport = unit->port->rport; ++ ++ if (rport && rport->port_state == FC_PORTSTATE_ONLINE) ++ scsi_scan_target(&rport->dev, 0, rport->scsi_target_id, ++ scsilun_to_int((struct scsi_lun *) ++ &unit->fcp_lun), 0); ++ ++ zfcp_unit_put(unit); ++} ++ + struct fc_function_template zfcp_transport_functions = { + .show_starget_port_id = 1, + .show_starget_port_name = 1, +@@ -496,6 +636,8 @@ + .reset_fc_host_stats = zfcp_reset_fc_host_stats, + .set_rport_dev_loss_tmo = zfcp_set_rport_dev_loss_tmo, + .get_host_port_state = zfcp_get_host_port_state, ++ .dev_loss_tmo_callbk = zfcp_scsi_dev_loss_tmo_callbk, ++ .terminate_rport_io = zfcp_scsi_terminate_rport_io, + .show_host_port_state = 1, + /* no functions registered for following dynamic attributes but + directly set by LLDD */ +diff -urN linux-2.6.27.19-5.1/drivers/s390/scsi/zfcp_sysfs.c linux-2.6.27.23-0.1.1/drivers/s390/scsi/zfcp_sysfs.c +--- linux-2.6.27.19-5.1/drivers/s390/scsi/zfcp_sysfs.c 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/s390/scsi/zfcp_sysfs.c 2009-06-16 13:40:46.000000000 +0100 +@@ -253,12 +253,21 @@ + + write_lock_irq(&zfcp_data.config_lock); + unit = zfcp_get_unit_by_lun(port, fcp_lun); +- if (unit && (atomic_read(&unit->refcount) == 0)) { +- zfcp_unit_get(unit); +- atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, &unit->status); +- list_move(&unit->list, &unit_remove_lh); +- } else +- unit = NULL; ++ if (unit) { ++ write_unlock_irq(&zfcp_data.config_lock); ++ /* wait for possible timeout during SCSI probe */ ++ flush_work(&unit->scsi_work); ++ write_lock_irq(&zfcp_data.config_lock); ++ ++ if (atomic_read(&unit->refcount) == 0) { ++ zfcp_unit_get(unit); ++ atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, ++ &unit->status); ++ list_move(&unit->list, &unit_remove_lh); ++ } else { ++ unit = NULL; ++ } ++ } + + write_unlock_irq(&zfcp_data.config_lock); + +diff -urN linux-2.6.27.19-5.1/drivers/scsi/aic7xxx/aic79xx_pci.c linux-2.6.27.23-0.1.1/drivers/scsi/aic7xxx/aic79xx_pci.c +--- linux-2.6.27.19-5.1/drivers/scsi/aic7xxx/aic79xx_pci.c 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/scsi/aic7xxx/aic79xx_pci.c 2009-06-16 13:40:47.000000000 +0100 +@@ -379,14 +379,12 @@ + error = ahd_init(ahd); + if (error != 0) + return (error); ++ ahd->init_level++; + + /* + * Allow interrupts now that we are completely setup. + */ +- error = ahd_pci_map_int(ahd); +- if (!error) +- ahd->init_level++; +- return error; ++ return ahd_pci_map_int(ahd); + } + + #ifdef CONFIG_PM +diff -urN linux-2.6.27.19-5.1/drivers/scsi/aic7xxx/aic7xxx_pci.c linux-2.6.27.23-0.1.1/drivers/scsi/aic7xxx/aic7xxx_pci.c +--- linux-2.6.27.19-5.1/drivers/scsi/aic7xxx/aic7xxx_pci.c 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/scsi/aic7xxx/aic7xxx_pci.c 2009-06-16 13:40:47.000000000 +0100 +@@ -960,16 +960,12 @@ + error = ahc_init(ahc); + if (error != 0) + return (error); ++ ahc->init_level++; + + /* + * Allow interrupts now that we are completely setup. + */ +- error = ahc_pci_map_int(ahc); +- if (error != 0) +- return (error); +- +- ahc->init_level++; +- return (0); ++ return ahc_pci_map_int(ahc); + } + + /* +diff -urN linux-2.6.27.19-5.1/drivers/scsi/device_handler/scsi_dh.c linux-2.6.27.23-0.1.1/drivers/scsi/device_handler/scsi_dh.c +--- linux-2.6.27.19-5.1/drivers/scsi/device_handler/scsi_dh.c 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/scsi/device_handler/scsi_dh.c 2009-06-16 13:40:47.000000000 +0100 +@@ -427,7 +427,7 @@ + struct scsi_device_handler *scsi_dh = NULL; + + spin_lock_irqsave(q->queue_lock, flags); +- sdev = q->queuedata; ++ sdev = scsi_device_from_queue(q); + if (sdev && sdev->scsi_dh_data) + scsi_dh = sdev->scsi_dh_data->scsi_dh; + if (!scsi_dh || !get_device(&sdev->sdev_gendev)) +@@ -456,7 +456,7 @@ + EXPORT_SYMBOL_GPL(scsi_dh_handler_exist); + + /* +- * scsi_dh_handler_attach - Attach device handler ++ * scsi_dh_attach - Attach device handler + * @sdev - sdev the handler should be attached to + * @name - name of the handler to attach + */ +@@ -472,7 +472,7 @@ + return -EINVAL; + + spin_lock_irqsave(q->queue_lock, flags); +- sdev = q->queuedata; ++ sdev = scsi_device_from_queue(q); + if (!sdev || !get_device(&sdev->sdev_gendev)) + err = -ENODEV; + spin_unlock_irqrestore(q->queue_lock, flags); +@@ -487,7 +487,7 @@ + EXPORT_SYMBOL_GPL(scsi_dh_attach); + + /* +- * scsi_dh_handler_detach - Detach device handler ++ * scsi_dh_detach - Detach device handler + * @sdev - sdev the handler should be detached from + * + * This function will detach the device handler only +@@ -500,7 +500,7 @@ + struct scsi_device *sdev; + + spin_lock_irqsave(q->queue_lock, flags); +- sdev = q->queuedata; ++ sdev = scsi_device_from_queue(q); + if (!sdev || !get_device(&sdev->sdev_gendev)) + sdev = NULL; + spin_unlock_irqrestore(q->queue_lock, flags); +diff -urN linux-2.6.27.19-5.1/drivers/scsi/device_handler/scsi_dh_emc.c linux-2.6.27.23-0.1.1/drivers/scsi/device_handler/scsi_dh_emc.c +--- linux-2.6.27.19-5.1/drivers/scsi/device_handler/scsi_dh_emc.c 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/scsi/device_handler/scsi_dh_emc.c 2009-06-16 13:40:47.000000000 +0100 +@@ -286,14 +286,17 @@ + len = sizeof(short_trespass); + rq->cmd_flags |= REQ_RW; + rq->cmd[1] = 0x10; ++ rq->cmd[4] = len; + break; + case MODE_SELECT_10: + len = sizeof(long_trespass); + rq->cmd_flags |= REQ_RW; + rq->cmd[1] = 0x10; ++ rq->cmd[8] = len; + break; + case INQUIRY: + len = CLARIION_BUFFER_SIZE; ++ rq->cmd[4] = len; + memset(buffer, 0, len); + break; + default: +@@ -301,7 +304,6 @@ + break; + } + +- rq->cmd[4] = len; + rq->cmd_type = REQ_TYPE_BLOCK_PC; + rq->cmd_flags |= REQ_FAILFAST_DEV | REQ_FAILFAST_TRANSPORT | + REQ_FAILFAST_DRIVER; +diff -urN linux-2.6.27.19-5.1/drivers/scsi/device_handler/scsi_dh_rdac.c linux-2.6.27.23-0.1.1/drivers/scsi/device_handler/scsi_dh_rdac.c +--- linux-2.6.27.19-5.1/drivers/scsi/device_handler/scsi_dh_rdac.c 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/scsi/device_handler/scsi_dh_rdac.c 2009-06-16 13:40:47.000000000 +0100 +@@ -548,6 +548,11 @@ + struct rdac_dh_data *h = get_rdac_data(sdev); + switch (sense_hdr->sense_key) { + case NOT_READY: ++ if (sense_hdr->asc == 0x04 && sense_hdr->ascq == 0x01) ++ /* LUN Not Ready - In process of becoming ready ++ * Just retry. ++ */ ++ return ADD_TO_MLQUEUE; + if (sense_hdr->asc == 0x04 && sense_hdr->ascq == 0x81) + /* LUN Not Ready - Storage firmware incompatible + * Manual code synchonisation required. +diff -urN linux-2.6.27.19-5.1/drivers/scsi/hptiop.c linux-2.6.27.23-0.1.1/drivers/scsi/hptiop.c +--- linux-2.6.27.19-5.1/drivers/scsi/hptiop.c 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/scsi/hptiop.c 2009-06-16 13:40:47.000000000 +0100 +@@ -1251,6 +1251,7 @@ + { PCI_VDEVICE(TTI, 0x3530), (kernel_ulong_t)&hptiop_itl_ops }, + { PCI_VDEVICE(TTI, 0x3560), (kernel_ulong_t)&hptiop_itl_ops }, + { PCI_VDEVICE(TTI, 0x4322), (kernel_ulong_t)&hptiop_itl_ops }, ++ { PCI_VDEVICE(TTI, 0x4321), (kernel_ulong_t)&hptiop_itl_ops }, + { PCI_VDEVICE(TTI, 0x4210), (kernel_ulong_t)&hptiop_itl_ops }, + { PCI_VDEVICE(TTI, 0x4211), (kernel_ulong_t)&hptiop_itl_ops }, + { PCI_VDEVICE(TTI, 0x4310), (kernel_ulong_t)&hptiop_itl_ops }, +diff -urN linux-2.6.27.19-5.1/drivers/scsi/ipr.c linux-2.6.27.23-0.1.1/drivers/scsi/ipr.c +--- linux-2.6.27.19-5.1/drivers/scsi/ipr.c 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/scsi/ipr.c 2009-06-16 13:40:47.000000000 +0100 +@@ -3658,6 +3658,7 @@ + { + struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *) sdev->host->hostdata; + struct ipr_resource_entry *res; ++ struct ata_port *ap = NULL; + unsigned long lock_flags = 0; + + spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); +@@ -3676,12 +3677,16 @@ + } + if (ipr_is_vset_device(res) || ipr_is_scsi_disk(res)) + sdev->allow_restart = 1; +- if (ipr_is_gata(res) && res->sata_port) { ++ if (ipr_is_gata(res) && res->sata_port) ++ ap = res->sata_port->ap; ++ spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); ++ ++ if (ap) { + scsi_adjust_queue_depth(sdev, 0, IPR_MAX_CMD_PER_ATA_LUN); +- ata_sas_slave_configure(sdev, res->sata_port->ap); +- } else { ++ ata_sas_slave_configure(sdev, ap); ++ } else + scsi_adjust_queue_depth(sdev, 0, sdev->host->cmd_per_lun); +- } ++ return 0; + } + spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); + return 0; +@@ -7002,6 +7007,7 @@ + ioa_cfg->sdt_state = ABORT_DUMP; + ioa_cfg->reset_retries = IPR_NUM_RESET_RELOAD_RETRIES; + ioa_cfg->in_ioa_bringdown = 1; ++ ioa_cfg->allow_cmds = 0; + ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NONE); + spin_unlock_irqrestore(ioa_cfg->host->host_lock, flags); + } +diff -urN linux-2.6.27.19-5.1/drivers/scsi/libiscsi.c linux-2.6.27.23-0.1.1/drivers/scsi/libiscsi.c +--- linux-2.6.27.19-5.1/drivers/scsi/libiscsi.c 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/scsi/libiscsi.c 2009-06-16 13:40:47.000000000 +0100 +@@ -502,6 +502,9 @@ + */ + task = conn->login_task; + else { ++ if (session->state != ISCSI_STATE_LOGGED_IN) ++ return NULL; ++ + BUG_ON(conn->c_stage == ISCSI_CONN_INITIAL_STAGE); + BUG_ON(conn->c_stage == ISCSI_CONN_STOPPED); + +@@ -1872,12 +1875,14 @@ + num_arrays++; + q->pool = kzalloc(num_arrays * max * sizeof(void*), GFP_KERNEL); + if (q->pool == NULL) +- goto enomem; ++ return -ENOMEM; + + q->queue = kfifo_init((void*)q->pool, max * sizeof(void*), + GFP_KERNEL, NULL); +- if (q->queue == ERR_PTR(-ENOMEM)) ++ if (IS_ERR(q->queue)) { ++ q->queue = NULL; + goto enomem; ++ } + + for (i = 0; i < max; i++) { + q->pool[i] = kzalloc(item_size, GFP_KERNEL); +@@ -1907,8 +1912,7 @@ + + for (i = 0; i < q->max; i++) + kfree(q->pool[i]); +- if (q->pool) +- kfree(q->pool); ++ kfree(q->pool); + kfree(q->queue); + } + EXPORT_SYMBOL_GPL(iscsi_pool_free); +@@ -2413,8 +2417,6 @@ + { + int old_stop_stage; + +- del_timer_sync(&conn->transport_timer); +- + mutex_lock(&session->eh_mutex); + spin_lock_bh(&session->lock); + if (conn->stop_stage == STOP_CONN_TERM) { +@@ -2432,13 +2434,17 @@ + session->state = ISCSI_STATE_TERMINATE; + else if (conn->stop_stage != STOP_CONN_RECOVER) + session->state = ISCSI_STATE_IN_RECOVERY; ++ spin_unlock_bh(&session->lock); ++ ++ del_timer_sync(&conn->transport_timer); ++ iscsi_suspend_tx(conn); + ++ spin_lock_bh(&session->lock); + old_stop_stage = conn->stop_stage; + conn->stop_stage = flag; + conn->c_stage = ISCSI_CONN_STOPPED; + spin_unlock_bh(&session->lock); + +- iscsi_suspend_tx(conn); + /* + * for connection level recovery we should not calculate + * header digest. conn->hdr_size used for optimization +diff -urN linux-2.6.27.19-5.1/drivers/scsi/qla1280.c linux-2.6.27.23-0.1.1/drivers/scsi/qla1280.c +--- linux-2.6.27.19-5.1/drivers/scsi/qla1280.c 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/scsi/qla1280.c 2009-06-16 13:40:47.000000000 +0100 +@@ -17,9 +17,12 @@ + * General Public License for more details. + * + ******************************************************************************/ +-#define QLA1280_VERSION "3.26" ++#define QLA1280_VERSION "3.27" + /***************************************************************************** + Revision History: ++ Rev 3.27, February 10, 2009, Michael Reed ++ - General code cleanup. ++ - Improve error recovery. + Rev 3.26, January 16, 2006 Jes Sorensen + - Ditch all < 2.6 support + Rev 3.25.1, February 10, 2005 Christoph Hellwig +@@ -438,7 +441,6 @@ + uint8_t, uint16_t *); + static int qla1280_bus_reset(struct scsi_qla_host *, int); + static int qla1280_device_reset(struct scsi_qla_host *, int, int); +-static int qla1280_abort_device(struct scsi_qla_host *, int, int, int); + static int qla1280_abort_command(struct scsi_qla_host *, struct srb *, int); + static int qla1280_abort_isp(struct scsi_qla_host *); + #ifdef QLA_64BIT_PTR +@@ -710,7 +712,7 @@ + } + + /************************************************************************** +- * qla1200_queuecommand ++ * qla1280_queuecommand + * Queue a command to the controller. + * + * Note: +@@ -725,12 +727,14 @@ + { + struct Scsi_Host *host = cmd->device->host; + struct scsi_qla_host *ha = (struct scsi_qla_host *)host->hostdata; +- struct srb *sp = (struct srb *)&cmd->SCp; ++ struct srb *sp = (struct srb *)CMD_SP(cmd); + int status; + + cmd->scsi_done = fn; + sp->cmd = cmd; + sp->flags = 0; ++ sp->wait = NULL; ++ CMD_HANDLE(cmd) = (unsigned char *)NULL; + + qla1280_print_scsi_cmd(5, cmd); + +@@ -750,21 +754,11 @@ + + enum action { + ABORT_COMMAND, +- ABORT_DEVICE, + DEVICE_RESET, + BUS_RESET, + ADAPTER_RESET, +- FAIL + }; + +-/* timer action for error action processor */ +-static void qla1280_error_wait_timeout(unsigned long __data) +-{ +- struct scsi_cmnd *cmd = (struct scsi_cmnd *)__data; +- struct srb *sp = (struct srb *)CMD_SP(cmd); +- +- complete(sp->wait); +-} + + static void qla1280_mailbox_timeout(unsigned long __data) + { +@@ -779,8 +773,67 @@ + complete(ha->mailbox_wait); + } + ++static int ++_qla1280_wait_for_single_command(struct scsi_qla_host *ha, struct srb *sp, ++ struct completion *wait) ++{ ++ int status = FAILED; ++ struct scsi_cmnd *cmd = sp->cmd; ++ ++ spin_unlock_irq(ha->host->host_lock); ++ wait_for_completion_timeout(wait, 4*HZ); ++ spin_lock_irq(ha->host->host_lock); ++ sp->wait = NULL; ++ if(CMD_HANDLE(cmd) == COMPLETED_HANDLE) { ++ status = SUCCESS; ++ (*cmd->scsi_done)(cmd); ++ } ++ return status; ++} ++ ++static int ++qla1280_wait_for_single_command(struct scsi_qla_host *ha, struct srb *sp) ++{ ++ DECLARE_COMPLETION_ONSTACK(wait); ++ ++ sp->wait = &wait; ++ return _qla1280_wait_for_single_command(ha, sp, &wait); ++} ++ ++static int ++qla1280_wait_for_pending_commands(struct scsi_qla_host *ha, int bus, int target) ++{ ++ int cnt; ++ int status; ++ struct srb *sp; ++ struct scsi_cmnd *cmd; ++ ++ status = SUCCESS; ++ ++ /* ++ * Wait for all commands with the designated bus/target ++ * to be completed by the firmware ++ */ ++ for (cnt = 0; cnt < MAX_OUTSTANDING_COMMANDS; cnt++) { ++ sp = ha->outstanding_cmds[cnt]; ++ if (sp) { ++ cmd = sp->cmd; ++ ++ if (bus >= 0 && SCSI_BUS_32(cmd) != bus) ++ continue; ++ if (target >= 0 && SCSI_TCN_32(cmd) != target) ++ continue; ++ ++ status = qla1280_wait_for_single_command(ha, sp); ++ if (status == FAILED) ++ break; ++ } ++ } ++ return status; ++} ++ + /************************************************************************** +- * qla1200_error_action ++ * qla1280_error_action + * The function will attempt to perform a specified error action and + * wait for the results (or time out). + * +@@ -792,11 +845,6 @@ + * Returns: + * SUCCESS or FAILED + * +- * Note: +- * Resetting the bus always succeeds - is has to, otherwise the +- * kernel will panic! Try a surgical technique - sending a BUS +- * DEVICE RESET message - on the offending target before pulling +- * the SCSI bus reset line. + **************************************************************************/ + static int + qla1280_error_action(struct scsi_cmnd *cmd, enum action action) +@@ -804,13 +852,19 @@ + struct scsi_qla_host *ha; + int bus, target, lun; + struct srb *sp; +- uint16_t data; +- unsigned char *handle; +- int result, i; ++ int i, found; ++ int result=FAILED; ++ int wait_for_bus=-1; ++ int wait_for_target = -1; + DECLARE_COMPLETION_ONSTACK(wait); +- struct timer_list timer; ++ ++ ENTER("qla1280_error_action"); + + ha = (struct scsi_qla_host *)(CMD_HOST(cmd)->hostdata); ++ sp = (struct srb *)CMD_SP(cmd); ++ bus = SCSI_BUS_32(cmd); ++ target = SCSI_TCN_32(cmd); ++ lun = SCSI_LUN_32(cmd); + + dprintk(4, "error_action %i, istatus 0x%04x\n", action, + RD_REG_WORD(&ha->iobase->istatus)); +@@ -819,99 +873,47 @@ + RD_REG_WORD(&ha->iobase->host_cmd), + RD_REG_WORD(&ha->iobase->ictrl), jiffies); + +- ENTER("qla1280_error_action"); + if (qla1280_verbose) + printk(KERN_INFO "scsi(%li): Resetting Cmnd=0x%p, " + "Handle=0x%p, action=0x%x\n", + ha->host_no, cmd, CMD_HANDLE(cmd), action); + +- if (cmd == NULL) { +- printk(KERN_WARNING "(scsi?:?:?:?) Reset called with NULL " +- "si_Cmnd pointer, failing.\n"); +- LEAVE("qla1280_error_action"); +- return FAILED; +- } +- +- ha = (struct scsi_qla_host *)cmd->device->host->hostdata; +- sp = (struct srb *)CMD_SP(cmd); +- handle = CMD_HANDLE(cmd); +- +- /* Check for pending interrupts. */ +- data = qla1280_debounce_register(&ha->iobase->istatus); +- /* +- * The io_request_lock is held when the reset handler is called, hence +- * the interrupt handler cannot be running in parallel as it also +- * grabs the lock. /Jes +- */ +- if (data & RISC_INT) +- qla1280_isr(ha, &ha->done_q); +- + /* +- * Determine the suggested action that the mid-level driver wants +- * us to perform. ++ * Check to see if we have the command in the outstanding_cmds[] ++ * array. If not then it must have completed before this error ++ * action was initiated. If the error_action isn't ABORT_COMMAND ++ * then the driver must proceed with the requested action. + */ +- if (handle == (unsigned char *)INVALID_HANDLE || handle == NULL) { +- if(action == ABORT_COMMAND) { +- /* we never got this command */ +- printk(KERN_INFO "qla1280: Aborting a NULL handle\n"); +- return SUCCESS; /* no action - we don't have command */ ++ found = -1; ++ for (i = 0; i < MAX_OUTSTANDING_COMMANDS; i++) { ++ if (sp == ha->outstanding_cmds[i]) { ++ found = i; ++ sp->wait = &wait; /* we'll wait for it to complete */ ++ break; + } +- } else { +- sp->wait = &wait; + } + +- bus = SCSI_BUS_32(cmd); +- target = SCSI_TCN_32(cmd); +- lun = SCSI_LUN_32(cmd); ++ if (found < 0) { /* driver doesn't have command */ ++ result = SUCCESS; ++ if (qla1280_verbose) { ++ printk(KERN_INFO ++ "scsi(%ld:%d:%d:%d): specified command has " ++ "already completed.\n", ha->host_no, bus, ++ target, lun); ++ } ++ } + +- /* Overloading result. Here it means the success or fail of the +- * *issue* of the action. When we return from the routine, it must +- * mean the actual success or fail of the action */ +- result = FAILED; + switch (action) { +- case FAIL: +- break; + + case ABORT_COMMAND: +- if ((sp->flags & SRB_ABORT_PENDING)) { +- printk(KERN_WARNING +- "scsi(): Command has a pending abort " +- "message - ABORT_PENDING.\n"); +- /* This should technically be impossible since we +- * now wait for abort completion */ +- break; +- } +- +- for (i = 0; i < MAX_OUTSTANDING_COMMANDS; i++) { +- if (sp == ha->outstanding_cmds[i]) { +- dprintk(1, "qla1280: RISC aborting command\n"); +- if (qla1280_abort_command(ha, sp, i) == 0) +- result = SUCCESS; +- else { +- /* +- * Since we don't know what might +- * have happend to the command, it +- * is unsafe to remove it from the +- * device's queue at this point. +- * Wait and let the escalation +- * process take care of it. +- */ +- printk(KERN_WARNING +- "scsi(%li:%i:%i:%i): Unable" +- " to abort command!\n", +- ha->host_no, bus, target, lun); +- } +- } +- } +- break; +- +- case ABORT_DEVICE: +- if (qla1280_verbose) +- printk(KERN_INFO +- "scsi(%ld:%d:%d:%d): Queueing abort device " +- "command.\n", ha->host_no, bus, target, lun); +- if (qla1280_abort_device(ha, bus, target, lun) == 0) +- result = SUCCESS; ++ dprintk(1, "qla1280: RISC aborting command\n"); ++ /* ++ * The abort might fail due to race when the host_lock ++ * is released to issue the abort. As such, we ++ * don't bother to check the return status. ++ */ ++ if (found >= 0) ++ qla1280_abort_command(ha, sp, found); + break; + + case DEVICE_RESET: +@@ -919,16 +921,21 @@ + printk(KERN_INFO + "scsi(%ld:%d:%d:%d): Queueing device reset " + "command.\n", ha->host_no, bus, target, lun); +- if (qla1280_device_reset(ha, bus, target) == 0) +- result = SUCCESS; ++ if (qla1280_device_reset(ha, bus, target) == 0) { ++ /* issued device reset, set wait conditions */ ++ wait_for_bus = bus; ++ wait_for_target = target; ++ } + break; + + case BUS_RESET: + if (qla1280_verbose) + printk(KERN_INFO "qla1280(%ld:%d): Issued bus " + "reset.\n", ha->host_no, bus); +- if (qla1280_bus_reset(ha, bus) == 0) +- result = SUCCESS; ++ if (qla1280_bus_reset(ha, bus) == 0) { ++ /* issued bus reset, set wait conditions */ ++ wait_for_bus = bus; ++ } + break; + + case ADAPTER_RESET: +@@ -941,55 +948,48 @@ + "continue automatically\n", ha->host_no); + } + ha->flags.reset_active = 1; +- /* +- * We restarted all of the commands automatically, so the +- * mid-level code can expect completions momentitarily. +- */ +- if (qla1280_abort_isp(ha) == 0) +- result = SUCCESS; ++ ++ if (qla1280_abort_isp(ha) != 0) { /* it's dead */ ++ result = FAILED; ++ } + + ha->flags.reset_active = 0; + } + +- if (!list_empty(&ha->done_q)) +- qla1280_done(ha); +- +- /* If we didn't manage to issue the action, or we have no +- * command to wait for, exit here */ +- if (result == FAILED || handle == NULL || +- handle == (unsigned char *)INVALID_HANDLE) { +- /* +- * Clear completion queue to avoid qla1280_done() trying +- * to complete the command at a later stage after we +- * have exited the current context +- */ +- sp->wait = NULL; +- goto leave; +- } ++ /* ++ * At this point, the host_lock has been released and retaken ++ * by the issuance of the mailbox command. ++ * Wait for the command passed in by the mid-layer if it ++ * was found by the driver. It might have been returned ++ * between eh recovery steps, hence the check of the "found" ++ * variable. ++ */ + +- /* set up a timer just in case we're really jammed */ +- init_timer(&timer); +- timer.expires = jiffies + 4*HZ; +- timer.data = (unsigned long)cmd; +- timer.function = qla1280_error_wait_timeout; +- add_timer(&timer); ++ if (found >= 0) ++ result = _qla1280_wait_for_single_command(ha, sp, &wait); + +- /* wait for the action to complete (or the timer to expire) */ +- spin_unlock_irq(ha->host->host_lock); +- wait_for_completion(&wait); +- del_timer_sync(&timer); +- spin_lock_irq(ha->host->host_lock); +- sp->wait = NULL; ++ if (action == ABORT_COMMAND && result != SUCCESS) { ++ printk(KERN_WARNING ++ "scsi(%li:%i:%i:%i): " ++ "Unable to abort command!\n", ++ ha->host_no, bus, target, lun); ++ } + +- /* the only action we might get a fail for is abort */ +- if (action == ABORT_COMMAND) { +- if(sp->flags & SRB_ABORTED) +- result = SUCCESS; +- else +- result = FAILED; ++ /* ++ * If the command passed in by the mid-layer has been ++ * returned by the board, then wait for any additional ++ * commands which are supposed to complete based upon ++ * the error action. ++ * ++ * All commands are unconditionally returned during a ++ * call to qla1280_abort_isp(), ADAPTER_RESET. No need ++ * to wait for them. ++ */ ++ if (result == SUCCESS && wait_for_bus >= 0) { ++ result = qla1280_wait_for_pending_commands(ha, ++ wait_for_bus, wait_for_target); + } + +- leave: + dprintk(1, "RESET returning %d\n", result); + + LEAVE("qla1280_error_action"); +@@ -1292,13 +1292,12 @@ + switch ((CMD_RESULT(cmd) >> 16)) { + case DID_RESET: + /* Issue marker command. */ +- qla1280_marker(ha, bus, target, 0, MK_SYNC_ID); ++ if (!ha->flags.abort_isp_active) ++ qla1280_marker(ha, bus, target, 0, MK_SYNC_ID); + break; + case DID_ABORT: + sp->flags &= ~SRB_ABORT_PENDING; + sp->flags |= SRB_ABORTED; +- if (sp->flags & SRB_TIMEOUT) +- CMD_RESULT(sp->cmd) = DID_TIME_OUT << 16; + break; + default: + break; +@@ -1308,12 +1307,11 @@ + scsi_dma_unmap(cmd); + + /* Call the mid-level driver interrupt handler */ +- CMD_HANDLE(sp->cmd) = (unsigned char *)INVALID_HANDLE; + ha->actthreads--; + +- (*(cmd)->scsi_done)(cmd); +- +- if(sp->wait != NULL) ++ if (sp->wait == NULL) ++ (*(cmd)->scsi_done)(cmd); ++ else + complete(sp->wait); + } + LEAVE("qla1280_done"); +@@ -2386,9 +2384,6 @@ + qla1280_mailbox_command(struct scsi_qla_host *ha, uint8_t mr, uint16_t *mb) + { + struct device_reg __iomem *reg = ha->iobase; +-#if 0 +- LIST_HEAD(done_q); +-#endif + int status = 0; + int cnt; + uint16_t *optr, *iptr; +@@ -2462,19 +2457,9 @@ + mr = MAILBOX_REGISTER_COUNT; + memcpy(optr, iptr, MAILBOX_REGISTER_COUNT * sizeof(uint16_t)); + +-#if 0 +- /* Go check for any response interrupts pending. */ +- qla1280_isr(ha, &done_q); +-#endif +- + if (ha->flags.reset_marker) + qla1280_rst_aen(ha); + +-#if 0 +- if (!list_empty(&done_q)) +- qla1280_done(ha, &done_q); +-#endif +- + if (status) + dprintk(2, "qla1280_mailbox_command: **** FAILED, mailbox0 = " + "0x%x ****\n", mb[0]); +@@ -2610,41 +2595,6 @@ + } + + /* +- * qla1280_abort_device +- * Issue an abort message to the device +- * +- * Input: +- * ha = adapter block pointer. +- * bus = SCSI BUS. +- * target = SCSI ID. +- * lun = SCSI LUN. +- * +- * Returns: +- * 0 = success +- */ +-static int +-qla1280_abort_device(struct scsi_qla_host *ha, int bus, int target, int lun) +-{ +- uint16_t mb[MAILBOX_REGISTER_COUNT]; +- int status; +- +- ENTER("qla1280_abort_device"); +- +- mb[0] = MBC_ABORT_DEVICE; +- mb[1] = (bus ? target | BIT_7 : target) << 8 | lun; +- status = qla1280_mailbox_command(ha, BIT_1 | BIT_0, &mb[0]); +- +- /* Issue marker command. */ +- qla1280_marker(ha, bus, target, lun, MK_SYNC_ID_LUN); +- +- if (status) +- dprintk(2, "qla1280_abort_device: **** FAILED ****\n"); +- +- LEAVE("qla1280_abort_device"); +- return status; +-} +- +-/* + * qla1280_abort_command + * Abort command aborts a specified IOCB. + * +@@ -2802,7 +2752,7 @@ + + /* If room for request in request ring. */ + if ((req_cnt + 2) >= ha->req_q_cnt) { +- status = 1; ++ status = SCSI_MLQUEUE_HOST_BUSY; + dprintk(2, "qla1280_start_scsi: in-ptr=0x%x req_q_cnt=" + "0x%xreq_cnt=0x%x", ha->req_ring_index, ha->req_q_cnt, + req_cnt); +@@ -2814,7 +2764,7 @@ + ha->outstanding_cmds[cnt] != NULL; cnt++); + + if (cnt >= MAX_OUTSTANDING_COMMANDS) { +- status = 1; ++ status = SCSI_MLQUEUE_HOST_BUSY; + dprintk(2, "qla1280_start_scsi: NO ROOM IN " + "OUTSTANDING ARRAY, req_q_cnt=0x%x", ha->req_q_cnt); + goto out; +@@ -3077,7 +3027,7 @@ + ha->req_q_cnt, seg_cnt); + /* If room for request in request ring. */ + if ((req_cnt + 2) >= ha->req_q_cnt) { +- status = 1; ++ status = SCSI_MLQUEUE_HOST_BUSY; + dprintk(2, "qla1280_32bit_start_scsi: in-ptr=0x%x, " + "req_q_cnt=0x%x, req_cnt=0x%x", ha->req_ring_index, + ha->req_q_cnt, req_cnt); +@@ -3089,7 +3039,7 @@ + (ha->outstanding_cmds[cnt] != 0); cnt++) ; + + if (cnt >= MAX_OUTSTANDING_COMMANDS) { +- status = 1; ++ status = SCSI_MLQUEUE_HOST_BUSY; + dprintk(2, "qla1280_32bit_start_scsi: NO ROOM IN OUTSTANDING " + "ARRAY, req_q_cnt=0x%x\n", ha->req_q_cnt); + goto out; +@@ -3456,6 +3406,7 @@ + + /* Save ISP completion status */ + CMD_RESULT(sp->cmd) = 0; ++ CMD_HANDLE(sp->cmd) = COMPLETED_HANDLE; + + /* Place block on done queue */ + list_add_tail(&sp->list, done_q); +@@ -3464,7 +3415,7 @@ + * If we get here we have a real problem! + */ + printk(KERN_WARNING +- "qla1280: ISP invalid handle"); ++ "qla1280: ISP invalid handle\n"); + } + } + break; +@@ -3722,6 +3673,8 @@ + } + } + ++ CMD_HANDLE(sp->cmd) = COMPLETED_HANDLE; ++ + /* Place command on done queue. */ + list_add_tail(&sp->list, done_q); + out: +@@ -3777,6 +3730,8 @@ + CMD_RESULT(sp->cmd) = DID_ERROR << 16; + } + ++ CMD_HANDLE(sp->cmd) = COMPLETED_HANDLE; ++ + /* Place command on done queue. */ + list_add_tail(&sp->list, done_q); + } +@@ -3827,19 +3782,16 @@ + struct scsi_cmnd *cmd; + sp = ha->outstanding_cmds[cnt]; + if (sp) { +- + cmd = sp->cmd; + CMD_RESULT(cmd) = DID_RESET << 16; +- +- sp->cmd = NULL; ++ CMD_HANDLE(cmd) = COMPLETED_HANDLE; + ha->outstanding_cmds[cnt] = NULL; +- +- (*cmd->scsi_done)(cmd); +- +- sp->flags = 0; ++ list_add_tail(&sp->list, &ha->done_q); + } + } + ++ qla1280_done(ha); ++ + status = qla1280_load_firmware(ha); + if (status) + goto out; +@@ -3924,13 +3876,6 @@ + + if (scsi_control == SCSI_PHASE_INVALID) { + ha->bus_settings[bus].scsi_bus_dead = 1; +-#if 0 +- CMD_RESULT(cp) = DID_NO_CONNECT << 16; +- CMD_HANDLE(cp) = INVALID_HANDLE; +- /* ha->actthreads--; */ +- +- (*(cp)->scsi_done)(cp); +-#endif + return 1; /* bus is dead */ + } else { + ha->bus_settings[bus].scsi_bus_dead = 0; +diff -urN linux-2.6.27.19-5.1/drivers/scsi/qla1280.h linux-2.6.27.23-0.1.1/drivers/scsi/qla1280.h +--- linux-2.6.27.19-5.1/drivers/scsi/qla1280.h 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/scsi/qla1280.h 2009-06-16 13:40:47.000000000 +0100 +@@ -88,7 +88,8 @@ + + /* Maximum outstanding commands in ISP queues */ + #define MAX_OUTSTANDING_COMMANDS 512 +-#define INVALID_HANDLE (MAX_OUTSTANDING_COMMANDS + 2) ++#define COMPLETED_HANDLE ((unsigned char *) \ ++ (MAX_OUTSTANDING_COMMANDS + 2)) + + /* ISP request and response entry counts (37-65535) */ + #define REQUEST_ENTRY_CNT 255 /* Number of request entries. */ +diff -urN linux-2.6.27.19-5.1/drivers/scsi/qla2xxx/qla_attr.c linux-2.6.27.23-0.1.1/drivers/scsi/qla2xxx/qla_attr.c +--- linux-2.6.27.19-5.1/drivers/scsi/qla2xxx/qla_attr.c 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/scsi/qla2xxx/qla_attr.c 2009-06-16 13:40:47.000000000 +0100 +@@ -295,8 +295,7 @@ + else if (start == (ha->flt_region_boot * 4) || + start == (ha->flt_region_fw * 4)) + valid = 1; +- else if (IS_QLA25XX(ha) && +- start == (ha->flt_region_vpd_nvram * 4)) ++ else if (IS_QLA25XX(ha)) + valid = 1; + if (!valid) { + qla_printk(KERN_WARNING, ha, +diff -urN linux-2.6.27.19-5.1/drivers/scsi/qla4xxx/ql4_dbg.c linux-2.6.27.23-0.1.1/drivers/scsi/qla4xxx/ql4_dbg.c +--- linux-2.6.27.19-5.1/drivers/scsi/qla4xxx/ql4_dbg.c 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/scsi/qla4xxx/ql4_dbg.c 2009-06-16 13:40:47.000000000 +0100 +@@ -138,13 +138,13 @@ + "Fh\n"); + printk("------------------------------------------------------------" + "--\n"); +- for (cnt = 0; cnt < size; cnt++, c++) { +- printk(KERN_DEBUG "%02x", *c); +- if (!(cnt % 16)) +- printk(KERN_DEBUG "\n"); ++ for (cnt = 0; cnt < size; c++) { ++ printk("%02x", *c); ++ if (!(++cnt % 16)) ++ printk("\n"); + + else +- printk(KERN_DEBUG " "); ++ printk(" "); + } +- printk(KERN_DEBUG "\n"); ++ printk("\n"); + } +diff -urN linux-2.6.27.19-5.1/drivers/scsi/qla4xxx/ql4_def.h linux-2.6.27.23-0.1.1/drivers/scsi/qla4xxx/ql4_def.h +--- linux-2.6.27.19-5.1/drivers/scsi/qla4xxx/ql4_def.h 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/scsi/qla4xxx/ql4_def.h 2009-06-16 13:40:47.000000000 +0100 +@@ -465,6 +465,9 @@ + #define QL_INDICES_PER_ENTRY 32 + #define QL_OSINDEX_ENTRIES (MAX_DDB_ENTRIES/QL_INDICES_PER_ENTRY) + volatile unsigned long os_map[QL_OSINDEX_ENTRIES]; ++ ++ /* Saved srb for status continuation entry processing */ ++ struct srb *status_srb; + }; + + static inline int is_qla4010(struct scsi_qla_host *ha) +diff -urN linux-2.6.27.19-5.1/drivers/scsi/qla4xxx/ql4_fw.h linux-2.6.27.23-0.1.1/drivers/scsi/qla4xxx/ql4_fw.h +--- linux-2.6.27.19-5.1/drivers/scsi/qla4xxx/ql4_fw.h 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/scsi/qla4xxx/ql4_fw.h 2009-06-16 13:40:47.000000000 +0100 +@@ -581,6 +581,7 @@ + *************************************************************************/ + #define IOCB_MAX_CDB_LEN 16 /* Bytes in a CBD */ + #define IOCB_MAX_SENSEDATA_LEN 32 /* Bytes of sense data */ ++#define IOCB_MAX_EXT_SENSEDATA_LEN 60 /* Bytes of extended sense data */ + + /* IOCB header structure */ + struct qla4_header { +@@ -750,6 +751,12 @@ + dma_addr_t DmaBuff; + }; + ++/* Status Continuation entry */ ++struct status_cont_entry { ++ struct qla4_header hdr; /* 00-03 */ ++ uint8_t extSenseData[IOCB_MAX_EXT_SENSEDATA_LEN]; /* 04-63 */ ++}; ++ + struct passthru0 { + struct qla4_header hdr; /* 00-03 */ + uint32_t handle; /* 04-07 */ +diff -urN linux-2.6.27.19-5.1/drivers/scsi/qla4xxx/ql4_isr.c linux-2.6.27.23-0.1.1/drivers/scsi/qla4xxx/ql4_isr.c +--- linux-2.6.27.19-5.1/drivers/scsi/qla4xxx/ql4_isr.c 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/scsi/qla4xxx/ql4_isr.c 2009-06-16 13:40:47.000000000 +0100 +@@ -13,6 +13,100 @@ + #include "ql4_os.h" + + /** ++ * qla4xxx_copy_sense - copy sense data into cmd sense buffer ++ * @ha: Pointer to host adapter structure. ++ * @sts_entry: Pointer to status entry structure. ++ * @srb: Pointer to srb structure. ++ **/ ++static void qla4xxx_copy_sense(struct scsi_qla_host *ha, ++ struct status_entry *sts_entry, ++ struct srb *srb) ++{ ++ struct scsi_cmnd *cmd = srb->cmd; ++ uint16_t sense_len; ++ ++ memset(cmd->sense_buffer, 0, SCSI_SENSE_BUFFERSIZE); ++ sense_len = le16_to_cpu(sts_entry->senseDataByteCnt); ++ if (sense_len == 0) ++ return; ++ ++ /* Save total available sense length, ++ * not to exceed cmd's sense buffer size */ ++ sense_len = min_t(uint16_t, sense_len, SCSI_SENSE_BUFFERSIZE); ++ cmd->SCp.ptr = cmd->sense_buffer; ++ cmd->SCp.this_residual = sense_len; ++ ++ /* Copy sense from sts_entry pkt */ ++ sense_len = min_t(uint16_t, sense_len, IOCB_MAX_SENSEDATA_LEN); ++ memcpy(cmd->sense_buffer, sts_entry->senseData, sense_len); ++ ++ DEBUG2(printk("scsi%ld:%d:%d:%d: %s: sense key = %x, " ++ "Addl.SenseLen - %02x, " ++ "ASC/ASCQ = %02x/%02x\n", ha->host_no, ++ cmd->device->channel, cmd->device->id, ++ cmd->device->lun, __func__, ++ sts_entry->senseData[2] & 0x0f, ++ sts_entry->senseData[7], ++ sts_entry->senseData[12], ++ sts_entry->senseData[13])); ++ ++ DEBUG5(qla4xxx_dump_buffer(cmd->SCp.ptr, sense_len)); ++ srb->flags |= SRB_GOT_SENSE; ++ ++ /* Update srb, in case a sts_cont pkt follows */ ++ cmd->SCp.ptr += sense_len; ++ cmd->SCp.this_residual -= sense_len; ++ if (cmd->SCp.this_residual != 0) ++ ha->status_srb = srb; ++ else ++ ha->status_srb = NULL; ++} ++ ++/** ++ * qla4xxx_status_cont_entry() - Process a Status Continuations entry. ++ * @ha: SCSI driver HA context ++ * @sts_cont: Entry pointer ++ * ++ * Extended sense data. ++ */ ++static void ++qla4xxx_status_cont_entry(struct scsi_qla_host *ha, ++ struct status_cont_entry *sts_cont) ++{ ++ struct srb *srb = ha->status_srb; ++ struct scsi_cmnd *cmd; ++ uint8_t sense_len; ++ ++ if (srb == NULL) { ++ DEBUG2(printk("scsi%ld: %s: Throw away extra STATUS CONTINUATION\n", ++ ha->host_no, __func__)); ++ return; ++ } ++ ++ cmd = srb->cmd; ++ if (cmd == NULL) { ++ DEBUG2(printk("scsi%ld: %s: Cmd already returned back to OS " ++ "srb=%p srb->state:%d\n", ha->host_no, __func__, srb, srb->state)); ++ ha->status_srb = NULL; ++ return; ++ } ++ ++ /* Copy sense data. */ ++ sense_len = min(cmd->SCp.this_residual, IOCB_MAX_EXT_SENSEDATA_LEN); ++ memcpy(cmd->SCp.ptr, sts_cont->extSenseData, sense_len); ++ DEBUG5(qla4xxx_dump_buffer(cmd->SCp.ptr, sense_len)); ++ ++ cmd->SCp.ptr += sense_len; ++ cmd->SCp.this_residual -= sense_len; ++ ++ /* Place command on done queue. */ ++ if (cmd->SCp.this_residual == 0) { ++ qla4xxx_srb_compl(ha, srb); ++ ha->status_srb = NULL; ++ } ++} ++ ++/** + * qla4xxx_status_entry - processes status IOCBs + * @ha: Pointer to host adapter structure. + * @sts_entry: Pointer to status entry structure. +@@ -25,7 +119,6 @@ + struct srb *srb; + struct ddb_entry *ddb_entry; + uint32_t residual; +- uint16_t sensebytecnt; + + srb = qla4xxx_del_from_active_array(ha, le32_to_cpu(sts_entry->handle)); + if (!srb) { +@@ -74,25 +167,7 @@ + break; + + /* Copy Sense Data into sense buffer. */ +- memset(cmd->sense_buffer, 0, sizeof(cmd->sense_buffer)); +- +- sensebytecnt = le16_to_cpu(sts_entry->senseDataByteCnt); +- if (sensebytecnt == 0) +- break; +- +- memcpy(cmd->sense_buffer, sts_entry->senseData, +- min(sensebytecnt, +- (uint16_t) sizeof(cmd->sense_buffer))); +- +- DEBUG2(printk("scsi%ld:%d:%d:%d: %s: sense key = %x, " +- "ASC/ASCQ = %02x/%02x\n", ha->host_no, +- cmd->device->channel, cmd->device->id, +- cmd->device->lun, __func__, +- sts_entry->senseData[2] & 0x0f, +- sts_entry->senseData[12], +- sts_entry->senseData[13])); +- +- srb->flags |= SRB_GOT_SENSE; ++ qla4xxx_copy_sense(ha, sts_entry, srb); + break; + + case SCS_INCOMPLETE: +@@ -159,25 +234,7 @@ + break; + + /* Copy Sense Data into sense buffer. */ +- memset(cmd->sense_buffer, 0, +- sizeof(cmd->sense_buffer)); +- +- sensebytecnt = +- le16_to_cpu(sts_entry->senseDataByteCnt); +- if (sensebytecnt == 0) +- break; +- +- memcpy(cmd->sense_buffer, sts_entry->senseData, +- min(sensebytecnt, +- (uint16_t) sizeof(cmd->sense_buffer))); +- +- DEBUG2(printk("scsi%ld:%d:%d:%d: %s: sense key = %x, " +- "ASC/ASCQ = %02x/%02x\n", ha->host_no, +- cmd->device->channel, cmd->device->id, +- cmd->device->lun, __func__, +- sts_entry->senseData[2] & 0x0f, +- sts_entry->senseData[12], +- sts_entry->senseData[13])); ++ qla4xxx_copy_sense(ha, sts_entry, srb); + } else { + /* + * If RISC reports underrun and target does not +@@ -253,9 +310,10 @@ + + status_entry_exit: + +- /* complete the request */ ++ /* complete the request, if not waiting for status_continuation pkt */ + srb->cc_stat = sts_entry->completionStatus; +- qla4xxx_srb_compl(ha, srb); ++ if (ha->status_srb == NULL) ++ qla4xxx_srb_compl(ha, srb); + } + + /** +@@ -290,10 +348,7 @@ + /* process entry */ + switch (sts_entry->hdr.entryType) { + case ET_STATUS: +- /* +- * Common status - Single completion posted in single +- * IOSB. +- */ ++ /* Common status */ + qla4xxx_status_entry(ha, sts_entry); + break; + +@@ -301,9 +356,8 @@ + break; + + case ET_STATUS_CONTINUATION: +- /* Just throw away the status continuation entries */ +- DEBUG2(printk("scsi%ld: %s: Status Continuation entry " +- "- ignoring\n", ha->host_no, __func__)); ++ qla4xxx_status_cont_entry(ha, ++ (struct status_cont_entry *) sts_entry); + break; + + case ET_COMMAND: +diff -urN linux-2.6.27.19-5.1/drivers/scsi/qla4xxx/ql4_version.h linux-2.6.27.23-0.1.1/drivers/scsi/qla4xxx/ql4_version.h +--- linux-2.6.27.19-5.1/drivers/scsi/qla4xxx/ql4_version.h 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/scsi/qla4xxx/ql4_version.h 2009-06-16 13:40:47.000000000 +0100 +@@ -5,5 +5,5 @@ + * See LICENSE.qla4xxx for copyright and licensing details. + */ + +-#define QLA4XXX_DRIVER_VERSION "5.01.00-k8_sles11-04" ++#define QLA4XXX_DRIVER_VERSION "5.01.00-k9_sles11-04" + +diff -urN linux-2.6.27.19-5.1/drivers/scsi/scsi_error.c linux-2.6.27.23-0.1.1/drivers/scsi/scsi_error.c +--- linux-2.6.27.19-5.1/drivers/scsi/scsi_error.c 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/scsi/scsi_error.c 2009-06-16 13:40:47.000000000 +0100 +@@ -384,7 +384,8 @@ + * if the device is in the process of becoming ready, we + * should retry. + */ +- if ((sshdr.asc == 0x04) && (sshdr.ascq == 0x01)) ++ if ((sshdr.asc == 0x04) && ++ (sshdr.ascq == 0x01 || sshdr.ascq == 0x0a)) + return NEEDS_RETRY; + /* + * if the device is not started, we need to wake +diff -urN linux-2.6.27.19-5.1/drivers/scsi/scsi_lib.c linux-2.6.27.23-0.1.1/drivers/scsi/scsi_lib.c +--- linux-2.6.27.19-5.1/drivers/scsi/scsi_lib.c 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/scsi/scsi_lib.c 2009-06-16 13:40:47.000000000 +0100 +@@ -1727,6 +1727,17 @@ + spin_lock_irq(q->queue_lock); + } + ++struct scsi_device *scsi_device_from_queue(struct request_queue *q) ++{ ++ struct scsi_device *sdev = NULL; ++ ++ if (q->request_fn == scsi_request_fn) ++ sdev = q->queuedata; ++ ++ return sdev; ++} ++EXPORT_SYMBOL_GPL(scsi_device_from_queue); ++ + u64 scsi_calculate_bounce_limit(struct Scsi_Host *shost) + { + struct device *host_dev; +diff -urN linux-2.6.27.19-5.1/drivers/scsi/sd.c linux-2.6.27.23-0.1.1/drivers/scsi/sd.c +--- linux-2.6.27.19-5.1/drivers/scsi/sd.c 2009-06-16 13:54:40.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/scsi/sd.c 2009-06-16 13:40:47.000000000 +0100 +@@ -1172,23 +1172,19 @@ + /* + * The device does not want the automatic start to be issued. + */ +- if (sdkp->device->no_start_on_add) { ++ if (sdkp->device->no_start_on_add) + break; +- } +- +- /* +- * If manual intervention is required, or this is an +- * absent USB storage device, a spinup is meaningless. +- */ +- if (sense_valid && +- sshdr.sense_key == NOT_READY && +- sshdr.asc == 4 && sshdr.ascq == 3) { +- break; /* manual intervention required */ + +- /* +- * Issue command to spin up drive when not ready +- */ +- } else if (sense_valid && sshdr.sense_key == NOT_READY) { ++ if (sense_valid && sshdr.sense_key == NOT_READY) { ++ if (sshdr.asc == 4 && sshdr.ascq == 3) ++ break; /* manual intervention required */ ++ if (sshdr.asc == 4 && sshdr.ascq == 0xb) ++ break; /* standby */ ++ if (sshdr.asc == 4 && sshdr.ascq == 0xc) ++ break; /* unavailable */ ++ /* ++ * Issue command to spin up drive when not ready ++ */ + if (!spintime) { + sd_printk(KERN_NOTICE, sdkp, "Spinning up disk..."); + cmd[0] = START_STOP; +diff -urN linux-2.6.27.19-5.1/drivers/serial/8250.c linux-2.6.27.23-0.1.1/drivers/serial/8250.c +--- linux-2.6.27.19-5.1/drivers/serial/8250.c 2009-06-16 13:54:54.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/serial/8250.c 2009-06-16 13:41:02.000000000 +0100 +@@ -1991,6 +1991,20 @@ + + serial8250_set_mctrl(&up->port, up->port.mctrl); + ++ /* Serial over Lan (SoL) hack: ++ Intel 8257x Gigabit ethernet chips have a ++ 16550 emulation, to be used for Serial Over Lan. ++ Those chips take a longer time than a normal ++ serial device to signalize that a transmission ++ data was queued. Due to that, the above test generally ++ fails. One solution would be to delay the reading of ++ iir. However, this is not reliable, since the timeout ++ is variable. So, let's just don't test if we receive ++ TX irq. This way, we'll never enable UART_BUG_TXEN. ++ */ ++ if (up->port.flags & UPF_NO_TXEN_TEST) ++ goto dont_test_tx_en; ++ + /* + * Do a quick test to see if we receive an + * interrupt when we enable the TX irq. +@@ -2010,6 +2024,7 @@ + up->bugs &= ~UART_BUG_TXEN; + } + ++dont_test_tx_en: + spin_unlock_irqrestore(&up->port.lock, flags); + + /* +diff -urN linux-2.6.27.19-5.1/drivers/serial/8250_pci.c linux-2.6.27.23-0.1.1/drivers/serial/8250_pci.c +--- linux-2.6.27.19-5.1/drivers/serial/8250_pci.c 2009-06-16 13:54:54.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/serial/8250_pci.c 2009-06-16 13:41:02.000000000 +0100 +@@ -762,6 +762,21 @@ + return setup_port(priv, port, bar, offset, board->reg_shift); + } + ++static int skip_tx_en_setup(struct serial_private *priv, ++ const struct pciserial_board *board, ++ struct uart_port *port, int idx) ++{ ++ port->flags |= UPF_NO_TXEN_TEST; ++ printk(KERN_DEBUG "serial8250: skipping TxEn test for device " ++ "[%04x:%04x] subsystem [%04x:%04x]\n", ++ priv->dev->vendor, ++ priv->dev->device, ++ priv->dev->subsystem_vendor, ++ priv->dev->subsystem_device); ++ ++ return pci_default_setup(priv, board, port, idx); ++} ++ + /* This should be in linux/pci_ids.h */ + #define PCI_VENDOR_ID_SBSMODULARIO 0x124B + #define PCI_SUBVENDOR_ID_SBSMODULARIO 0x124B +@@ -828,6 +843,27 @@ + .init = pci_inteli960ni_init, + .setup = pci_default_setup, + }, ++ { ++ .vendor = PCI_VENDOR_ID_INTEL, ++ .device = PCI_DEVICE_ID_INTEL_8257X_SOL, ++ .subvendor = PCI_ANY_ID, ++ .subdevice = PCI_ANY_ID, ++ .setup = skip_tx_en_setup, ++ }, ++ { ++ .vendor = PCI_VENDOR_ID_INTEL, ++ .device = PCI_DEVICE_ID_INTEL_82573L_SOL, ++ .subvendor = PCI_ANY_ID, ++ .subdevice = PCI_ANY_ID, ++ .setup = skip_tx_en_setup, ++ }, ++ { ++ .vendor = PCI_VENDOR_ID_INTEL, ++ .device = PCI_DEVICE_ID_INTEL_82573E_SOL, ++ .subvendor = PCI_ANY_ID, ++ .subdevice = PCI_ANY_ID, ++ .setup = skip_tx_en_setup, ++ }, + /* + * ITE + */ +diff -urN linux-2.6.27.19-5.1/drivers/serial/jsm/jsm_driver.c linux-2.6.27.23-0.1.1/drivers/serial/jsm/jsm_driver.c +--- linux-2.6.27.19-5.1/drivers/serial/jsm/jsm_driver.c 2009-06-16 13:54:54.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/serial/jsm/jsm_driver.c 2009-06-16 13:41:02.000000000 +0100 +@@ -84,6 +84,8 @@ + brd->pci_dev = pdev; + if (pdev->device == PCIE_DEVICE_ID_NEO_4_IBM) + brd->maxports = 4; ++ else if (pdev->device == PCI_DEVICE_ID_DIGI_NEO_8) ++ brd->maxports = 8; + else + brd->maxports = 2; + +@@ -212,6 +214,7 @@ + { PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_NEO_2RJ45), 0, 0, 2 }, + { PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_NEO_2RJ45PRI), 0, 0, 3 }, + { PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCIE_DEVICE_ID_NEO_4_IBM), 0, 0, 4 }, ++ { PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_DIGI_NEO_8), 0, 0, 5 }, + { 0, } + }; + MODULE_DEVICE_TABLE(pci, jsm_pci_tbl); +diff -urN linux-2.6.27.19-5.1/drivers/usb/class/cdc-acm.c linux-2.6.27.23-0.1.1/drivers/usb/class/cdc-acm.c +--- linux-2.6.27.19-5.1/drivers/usb/class/cdc-acm.c 2009-06-16 13:54:24.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/usb/class/cdc-acm.c 2009-06-16 13:40:39.000000000 +0100 +@@ -1365,6 +1365,8 @@ + { USB_DEVICE(0x0572, 0x1321), /* Conexant USB MODEM CX93010 */ + .driver_info = NO_UNION_NORMAL, /* has no union descriptor */ + }, ++ { USB_DEVICE(0x22b8, 0x6425), /* Motorola MOTOMAGX phones */ ++ }, + + /* control interfaces with various AT-command sets */ + { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM, +diff -urN linux-2.6.27.19-5.1/drivers/usb/class/cdc-wdm.c linux-2.6.27.23-0.1.1/drivers/usb/class/cdc-wdm.c +--- linux-2.6.27.19-5.1/drivers/usb/class/cdc-wdm.c 2009-06-16 13:54:24.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/usb/class/cdc-wdm.c 2009-06-16 13:40:39.000000000 +0100 +@@ -641,7 +641,7 @@ + + iface = &intf->altsetting[0]; + ep = &iface->endpoint[0].desc; +- if (!usb_endpoint_is_int_in(ep)) { ++ if (!ep || !usb_endpoint_is_int_in(ep)) { + rv = -EINVAL; + goto err; + } +diff -urN linux-2.6.27.19-5.1/drivers/usb/core/devio.c linux-2.6.27.23-0.1.1/drivers/usb/core/devio.c +--- linux-2.6.27.19-5.1/drivers/usb/core/devio.c 2009-06-16 13:54:24.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/usb/core/devio.c 2009-06-16 13:40:39.000000000 +0100 +@@ -359,11 +359,6 @@ + spin_lock_irqsave(&ps->lock, flags); + } + spin_unlock_irqrestore(&ps->lock, flags); +- as = async_getcompleted(ps); +- while (as) { +- free_async(as); +- as = async_getcompleted(ps); +- } + } + + static void destroy_async_on_interface(struct dev_state *ps, +@@ -639,6 +634,7 @@ + struct dev_state *ps = file->private_data; + struct usb_device *dev = ps->dev; + unsigned int ifnum; ++ struct async *as; + + usb_lock_device(dev); + +@@ -657,6 +653,12 @@ + usb_unlock_device(dev); + usb_put_dev(dev); + put_pid(ps->disc_pid); ++ ++ as = async_getcompleted(ps); ++ while (as) { ++ free_async(as); ++ as = async_getcompleted(ps); ++ } + kfree(ps); + return 0; + } +diff -urN linux-2.6.27.19-5.1/drivers/usb/core/message.c linux-2.6.27.23-0.1.1/drivers/usb/core/message.c +--- linux-2.6.27.19-5.1/drivers/usb/core/message.c 2009-06-16 13:54:24.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/usb/core/message.c 2009-06-16 13:40:39.000000000 +0100 +@@ -651,7 +651,7 @@ + if (result <= 0 && result != -ETIMEDOUT) + continue; + if (result > 1 && ((u8 *)buf)[1] != type) { +- result = -EPROTO; ++ result = -ENODATA; + continue; + } + break; +@@ -694,8 +694,13 @@ + USB_REQ_GET_DESCRIPTOR, USB_DIR_IN, + (USB_DT_STRING << 8) + index, langid, buf, size, + USB_CTRL_GET_TIMEOUT); +- if (!(result == 0 || result == -EPIPE)) +- break; ++ if (result == 0 || result == -EPIPE) ++ continue; ++ if (result > 1 && ((u8 *) buf)[1] != USB_DT_STRING) { ++ result = -ENODATA; ++ continue; ++ } ++ break; + } + return result; + } +diff -urN linux-2.6.27.19-5.1/drivers/usb/gadget/f_rndis.c linux-2.6.27.23-0.1.1/drivers/usb/gadget/f_rndis.c +--- linux-2.6.27.19-5.1/drivers/usb/gadget/f_rndis.c 2009-06-16 13:54:32.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/usb/gadget/f_rndis.c 2009-06-16 13:40:39.000000000 +0100 +@@ -437,7 +437,7 @@ + DBG(cdev, "rndis req%02x.%02x v%04x i%04x l%d\n", + ctrl->bRequestType, ctrl->bRequest, + w_value, w_index, w_length); +- req->zero = 0; ++ req->zero = (value < w_length); + req->length = value; + value = usb_ep_queue(cdev->gadget->ep0, req, GFP_ATOMIC); + if (value < 0) +diff -urN linux-2.6.27.19-5.1/drivers/usb/gadget/u_ether.c linux-2.6.27.23-0.1.1/drivers/usb/gadget/u_ether.c +--- linux-2.6.27.19-5.1/drivers/usb/gadget/u_ether.c 2009-06-16 13:54:32.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/usb/gadget/u_ether.c 2009-06-16 13:40:39.000000000 +0100 +@@ -175,12 +175,6 @@ + strlcpy(p->bus_info, dev_name(&dev->gadget->dev), sizeof p->bus_info); + } + +-static u32 eth_get_link(struct net_device *net) +-{ +- struct eth_dev *dev = netdev_priv(net); +- return dev->gadget->speed != USB_SPEED_UNKNOWN; +-} +- + /* REVISIT can also support: + * - WOL (by tracking suspends and issuing remote wakeup) + * - msglevel (implies updated messaging) +@@ -189,7 +183,7 @@ + + static struct ethtool_ops ops = { + .get_drvinfo = eth_get_drvinfo, +- .get_link = eth_get_link ++ .get_link = ethtool_op_get_link, + }; + + static void defer_kevent(struct eth_dev *dev, int flag) +diff -urN linux-2.6.27.19-5.1/drivers/usb/host/ehci.h linux-2.6.27.23-0.1.1/drivers/usb/host/ehci.h +--- linux-2.6.27.19-5.1/drivers/usb/host/ehci.h 2009-06-16 13:54:24.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/usb/host/ehci.h 2009-06-16 13:40:39.000000000 +0100 +@@ -87,6 +87,10 @@ + int next_uframe; /* scan periodic, start here */ + unsigned periodic_sched; /* periodic activity count */ + ++ /* list of itds completed while clock_frame was still active */ ++ struct list_head cached_itd_list; ++ unsigned clock_frame; ++ + /* per root hub port */ + unsigned long reset_done [EHCI_MAX_ROOT_PORTS]; + +@@ -208,6 +212,8 @@ + } + } + ++static void free_cached_itd_list(struct ehci_hcd *ehci); ++ + /*-------------------------------------------------------------------------*/ + + #include +@@ -358,6 +364,9 @@ + #define QH_STATE_UNLINK_WAIT 4 /* LINKED and on reclaim q */ + #define QH_STATE_COMPLETING 5 /* don't touch token.HALT */ + ++ u8 xacterrs; /* XactErr retry counter */ ++#define QH_XACTERR_MAX 32 /* XactErr retry limit */ ++ + /* periodic schedule info */ + u8 usecs; /* intr bandwidth */ + u8 gap_uf; /* uframes split/csplit gap */ +diff -urN linux-2.6.27.19-5.1/drivers/usb/host/ehci-hcd.c linux-2.6.27.23-0.1.1/drivers/usb/host/ehci-hcd.c +--- linux-2.6.27.19-5.1/drivers/usb/host/ehci-hcd.c 2009-06-16 13:54:24.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/usb/host/ehci-hcd.c 2009-06-16 13:40:39.000000000 +0100 +@@ -485,6 +485,7 @@ + * periodic_size can shrink by USBCMD update if hcc_params allows. + */ + ehci->periodic_size = DEFAULT_I_TDPS; ++ INIT_LIST_HEAD(&ehci->cached_itd_list); + if ((retval = ehci_mem_init(ehci, GFP_KERNEL)) < 0) + return retval; + +@@ -497,6 +498,7 @@ + + ehci->reclaim = NULL; + ehci->next_uframe = -1; ++ ehci->clock_frame = -1; + + /* + * dedicate a qh for the async ring head, since we couldn't unlink +diff -urN linux-2.6.27.19-5.1/drivers/usb/host/ehci-mem.c linux-2.6.27.23-0.1.1/drivers/usb/host/ehci-mem.c +--- linux-2.6.27.19-5.1/drivers/usb/host/ehci-mem.c 2009-06-16 13:54:24.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/usb/host/ehci-mem.c 2009-06-16 13:40:39.000000000 +0100 +@@ -128,6 +128,7 @@ + + static void ehci_mem_cleanup (struct ehci_hcd *ehci) + { ++ free_cached_itd_list(ehci); + if (ehci->async) + qh_put (ehci->async); + ehci->async = NULL; +diff -urN linux-2.6.27.19-5.1/drivers/usb/host/ehci-q.c linux-2.6.27.23-0.1.1/drivers/usb/host/ehci-q.c +--- linux-2.6.27.19-5.1/drivers/usb/host/ehci-q.c 2009-06-16 13:54:24.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/usb/host/ehci-q.c 2009-06-16 13:40:39.000000000 +0100 +@@ -333,12 +333,40 @@ + token = hc32_to_cpu(ehci, qtd->hw_token); + + /* always clean up qtds the hc de-activated */ ++ retry_xacterr: + if ((token & QTD_STS_ACTIVE) == 0) { + + /* on STALL, error, and short reads this urb must + * complete and all its qtds must be recycled. + */ + if ((token & QTD_STS_HALT) != 0) { ++ ++ /* retry transaction errors until we ++ * reach the software xacterr limit ++ */ ++ if ((token & QTD_STS_XACT) && ++ QTD_CERR(token) == 0 && ++ --qh->xacterrs > 0 && ++ !urb->unlinked) { ++ ehci_dbg(ehci, ++ "detected XactErr len %d/%d retry %d\n", ++ qtd->length - QTD_LENGTH(token), qtd->length, ++ QH_XACTERR_MAX - qh->xacterrs); ++ ++ /* reset the token in the qtd and the ++ * qh overlay (which still contains ++ * the qtd) so that we pick up from ++ * where we left off ++ */ ++ token &= ~QTD_STS_HALT; ++ token |= QTD_STS_ACTIVE | ++ (EHCI_TUNE_CERR << 10); ++ qtd->hw_token = cpu_to_hc32(ehci, ++ token); ++ wmb(); ++ qh->hw_token = cpu_to_hc32(ehci, token); ++ goto retry_xacterr; ++ } + stopped = 1; + + /* magic dummy for some short reads; qh won't advance. +@@ -421,6 +449,9 @@ + /* remove qtd; it's recycled after possible urb completion */ + list_del (&qtd->qtd_list); + last = qtd; ++ ++ /* reinit the xacterr counter for the next qtd */ ++ qh->xacterrs = QH_XACTERR_MAX; + } + + /* last urb's completion might still need calling */ +@@ -1084,6 +1115,7 @@ + head->qh_next.qh = qh; + head->hw_next = dma; + ++ qh->xacterrs = QH_XACTERR_MAX; + qh->qh_state = QH_STATE_LINKED; + /* qtd completions reported later by interrupt */ + } +@@ -1317,7 +1349,8 @@ + prev->qh_next = qh->qh_next; + wmb (); + +- if (unlikely (ehci_to_hcd(ehci)->state == HC_STATE_HALT)) { ++ /* If the controller isn't running, we don't have to wait for it */ ++ if (unlikely(!HC_IS_RUNNING(ehci_to_hcd(ehci)->state))) { + /* if (unlikely (qh->reclaim != 0)) + * this will recurse, probably not much + */ +diff -urN linux-2.6.27.19-5.1/drivers/usb/host/ehci-sched.c linux-2.6.27.23-0.1.1/drivers/usb/host/ehci-sched.c +--- linux-2.6.27.19-5.1/drivers/usb/host/ehci-sched.c 2009-06-16 13:54:24.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/usb/host/ehci-sched.c 2009-06-16 13:40:39.000000000 +0100 +@@ -1004,7 +1004,8 @@ + + is_in = (stream->bEndpointAddress & USB_DIR_IN) ? 0x10 : 0; + stream->bEndpointAddress &= 0x0f; +- stream->ep->hcpriv = NULL; ++ if (stream->ep) ++ stream->ep->hcpriv = NULL; + + if (stream->rescheduled) { + ehci_info (ehci, "ep%d%s-iso rescheduled " +@@ -1535,7 +1536,7 @@ + struct ehci_itd, itd_list); + list_move_tail (&itd->itd_list, &stream->td_list); + itd->stream = iso_stream_get (stream); +- itd->urb = usb_get_urb (urb); ++ itd->urb = urb; + itd_init (ehci, stream, itd); + } + +@@ -1644,7 +1645,7 @@ + (void) disable_periodic(ehci); + ehci_to_hcd(ehci)->self.bandwidth_isoc_reqs--; + +- if (unlikely (list_empty (&stream->td_list))) { ++ if (unlikely(list_is_singular(&stream->td_list))) { + ehci_to_hcd(ehci)->self.bandwidth_allocated + -= stream->bandwidth; + ehci_vdbg (ehci, +@@ -1653,14 +1654,27 @@ + (stream->bEndpointAddress & USB_DIR_IN) ? "in" : "out"); + } + iso_stream_put (ehci, stream); +- /* OK to recycle this ITD now that its completion callback ran. */ ++ + done: +- usb_put_urb(urb); + itd->urb = NULL; +- itd->stream = NULL; +- list_move(&itd->itd_list, &stream->free_list); +- iso_stream_put(ehci, stream); +- ++ if (ehci->clock_frame != itd->frame || itd->index[7] != -1) { ++ /* OK to recycle this ITD now. */ ++ itd->stream = NULL; ++ list_move(&itd->itd_list, &stream->free_list); ++ iso_stream_put(ehci, stream); ++ } else { ++ /* HW might remember this ITD, so we can't recycle it yet. ++ * Move it to a safe place until a new frame starts. ++ */ ++ list_move(&itd->itd_list, &ehci->cached_itd_list); ++ if (stream->refcount == 2) { ++ /* If iso_stream_put() were called here, stream ++ * would be freed. Instead, just prevent reuse. ++ */ ++ stream->ep->hcpriv = NULL; ++ stream->ep = NULL; ++ } ++ } + return retval; + } + +@@ -1934,7 +1948,7 @@ + struct ehci_sitd, sitd_list); + list_move_tail (&sitd->sitd_list, &stream->td_list); + sitd->stream = iso_stream_get (stream); +- sitd->urb = usb_get_urb (urb); ++ sitd->urb = urb; + + sitd_patch(ehci, stream, sitd, sched, packet); + sitd_link (ehci, (next_uframe >> 3) % ehci->periodic_size, +@@ -2019,7 +2033,7 @@ + (void) disable_periodic(ehci); + ehci_to_hcd(ehci)->self.bandwidth_isoc_reqs--; + +- if (list_empty (&stream->td_list)) { ++ if (list_is_singular(&stream->td_list)) { + ehci_to_hcd(ehci)->self.bandwidth_allocated + -= stream->bandwidth; + ehci_vdbg (ehci, +@@ -2030,7 +2044,6 @@ + iso_stream_put (ehci, stream); + /* OK to recycle this SITD now that its completion callback ran. */ + done: +- usb_put_urb(urb); + sitd->urb = NULL; + sitd->stream = NULL; + list_move(&sitd->sitd_list, &stream->free_list); +@@ -2101,6 +2114,20 @@ + + /*-------------------------------------------------------------------------*/ + ++static void free_cached_itd_list(struct ehci_hcd *ehci) ++{ ++ struct ehci_itd *itd, *n; ++ ++ list_for_each_entry_safe(itd, n, &ehci->cached_itd_list, itd_list) { ++ struct ehci_iso_stream *stream = itd->stream; ++ itd->stream = NULL; ++ list_move(&itd->itd_list, &stream->free_list); ++ iso_stream_put(ehci, stream); ++ } ++} ++ ++/*-------------------------------------------------------------------------*/ ++ + static void + scan_periodic (struct ehci_hcd *ehci) + { +@@ -2115,10 +2142,17 @@ + * Touches as few pages as possible: cache-friendly. + */ + now_uframe = ehci->next_uframe; +- if (HC_IS_RUNNING (ehci_to_hcd(ehci)->state)) ++ if (HC_IS_RUNNING(ehci_to_hcd(ehci)->state)) { + clock = ehci_readl(ehci, &ehci->regs->frame_index); +- else ++ clock_frame = (clock >> 3) % ehci->periodic_size; ++ } else { + clock = now_uframe + mod - 1; ++ clock_frame = -1; ++ } ++ if (ehci->clock_frame != clock_frame) { ++ free_cached_itd_list(ehci); ++ ehci->clock_frame = clock_frame; ++ } + clock %= mod; + clock_frame = clock >> 3; + +@@ -2277,6 +2311,10 @@ + /* rescan the rest of this frame, then ... */ + clock = now; + clock_frame = clock >> 3; ++ if (ehci->clock_frame != clock_frame) { ++ free_cached_itd_list(ehci); ++ ehci->clock_frame = clock_frame; ++ } + } else { + now_uframe++; + now_uframe %= mod; +diff -urN linux-2.6.27.19-5.1/drivers/usb/serial/cp2101.c linux-2.6.27.23-0.1.1/drivers/usb/serial/cp2101.c +--- linux-2.6.27.19-5.1/drivers/usb/serial/cp2101.c 2009-06-16 13:54:32.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/usb/serial/cp2101.c 2009-06-16 13:40:39.000000000 +0100 +@@ -77,6 +77,7 @@ + { USB_DEVICE(0x10C4, 0x814A) }, /* West Mountain Radio RIGblaster P&P */ + { USB_DEVICE(0x10C4, 0x814B) }, /* West Mountain Radio RIGtalk */ + { USB_DEVICE(0x10C4, 0x815E) }, /* Helicomm IP-Link 1220-DVM */ ++ { USB_DEVICE(0x10C4, 0x819F) }, /* MJS USB Toslink Switcher */ + { USB_DEVICE(0x10C4, 0x81A6) }, /* ThinkOptics WavIt */ + { USB_DEVICE(0x10C4, 0x81AC) }, /* MSD Dash Hawk */ + { USB_DEVICE(0x10C4, 0x81C8) }, /* Lipowsky Industrie Elektronik GmbH, Baby-JTAG */ +diff -urN linux-2.6.27.19-5.1/drivers/usb/serial/ftdi_sio.c linux-2.6.27.23-0.1.1/drivers/usb/serial/ftdi_sio.c +--- linux-2.6.27.19-5.1/drivers/usb/serial/ftdi_sio.c 2009-06-16 13:54:32.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/usb/serial/ftdi_sio.c 2009-06-16 13:40:39.000000000 +0100 +@@ -657,6 +657,12 @@ + { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO4x4_PID) }, + { USB_DEVICE(FTDI_VID, FTDI_DOMINTELL_DGQG_PID) }, + { USB_DEVICE(FTDI_VID, FTDI_DOMINTELL_DUSB_PID) }, ++ { USB_DEVICE(ATMEL_VID, STK541_PID) }, ++ { USB_DEVICE(DE_VID, STB_PID) }, ++ { USB_DEVICE(DE_VID, WHT_PID) }, ++ { USB_DEVICE(ADI_VID, ADI_GNICE_PID), ++ .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, ++ { USB_DEVICE(JETI_VID, JETI_SPC1201_PID) }, + { }, /* Optional parameter entry */ + { } /* Terminating entry */ + }; +diff -urN linux-2.6.27.19-5.1/drivers/usb/serial/ftdi_sio.h linux-2.6.27.23-0.1.1/drivers/usb/serial/ftdi_sio.h +--- linux-2.6.27.19-5.1/drivers/usb/serial/ftdi_sio.h 2009-06-16 13:54:32.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/usb/serial/ftdi_sio.h 2009-06-16 13:40:39.000000000 +0100 +@@ -870,6 +870,33 @@ + #define RATOC_PRODUCT_ID_USB60F 0xb020 + + /* ++ * Atmel STK541 ++ */ ++#define ATMEL_VID 0x03eb /* Vendor ID */ ++#define STK541_PID 0x2109 /* Zigbee Controller */ ++ ++/* ++ * Dresden Elektronic Sensor Terminal Board ++ */ ++#define DE_VID 0x1cf1 /* Vendor ID */ ++#define STB_PID 0x0001 /* Sensor Terminal Board */ ++#define WHT_PID 0x0004 /* Wireless Handheld Terminal */ ++ ++/* ++ * Blackfin gnICE JTAG ++ * http://docs.blackfin.uclinux.org/doku.php?id=hw:jtag:gnice ++ */ ++#define ADI_VID 0x0456 ++#define ADI_GNICE_PID 0xF000 ++ ++/* ++ * JETI SPECTROMETER SPECBOS 1201 ++ * http://www.jeti.com/products/sys/scb/scb1201.php ++ */ ++#define JETI_VID 0x0c6c ++#define JETI_SPC1201_PID 0x04b2 ++ ++/* + * BmRequestType: 1100 0000b + * bRequest: FTDI_E2_READ + * wValue: 0 +diff -urN linux-2.6.27.19-5.1/drivers/usb/serial/option.c linux-2.6.27.23-0.1.1/drivers/usb/serial/option.c +--- linux-2.6.27.19-5.1/drivers/usb/serial/option.c 2009-06-16 13:54:32.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/usb/serial/option.c 2009-06-16 13:40:39.000000000 +0100 +@@ -89,6 +89,7 @@ + #define OPTION_PRODUCT_ETNA_MODEM_GT 0x7041 + #define OPTION_PRODUCT_ETNA_MODEM_EX 0x7061 + #define OPTION_PRODUCT_ETNA_KOI_MODEM 0x7100 ++#define OPTION_PRODUCT_GTM380_MODEM 0x7201 + + #define HUAWEI_VENDOR_ID 0x12D1 + #define HUAWEI_PRODUCT_E600 0x1001 +@@ -190,6 +191,7 @@ + /* OVATION PRODUCTS */ + #define NOVATELWIRELESS_PRODUCT_MC727 0x4100 + #define NOVATELWIRELESS_PRODUCT_MC950D 0x4400 ++#define NOVATELWIRELESS_PRODUCT_U727 0x5010 + + /* FUTURE NOVATEL PRODUCTS */ + #define NOVATELWIRELESS_PRODUCT_EVDO_FULLSPEED 0X6000 +@@ -281,14 +283,11 @@ + + /* ZTE PRODUCTS */ + #define ZTE_VENDOR_ID 0x19d2 ++#define ZTE_PRODUCT_MF622 0x0001 + #define ZTE_PRODUCT_MF628 0x0015 + #define ZTE_PRODUCT_MF626 0x0031 + #define ZTE_PRODUCT_CDMA_TECH 0xfffe + +-/* Ericsson products */ +-#define ERICSSON_VENDOR_ID 0x0bdb +-#define ERICSSON_PRODUCT_F3507G 0x1900 +- + #define BENQ_VENDOR_ID 0x04a5 + #define BENQ_PRODUCT_H10 0x4068 + +@@ -317,6 +316,7 @@ + { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_MODEM_GT) }, + { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_MODEM_EX) }, + { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_KOI_MODEM) }, ++ { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_GTM380_MODEM) }, + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E220, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E220BIS, 0xff, 0xff, 0xff) }, +@@ -402,6 +402,7 @@ + { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EU870D) }, /* Novatel EU850D/EU860D/EU870D */ + { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_MC950D) }, /* Novatel MC930D/MC950D */ + { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_MC727) }, /* Novatel MC727/U727/USB727 */ ++ { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_U727) }, /* Novatel MC727/U727/USB727 */ + { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_FULLSPEED) }, /* Novatel EVDO product */ + { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_FULLSPEED) }, /* Novatel HSPA product */ + { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_EMBEDDED_FULLSPEED) }, /* Novatel EVDO Embedded product */ +@@ -429,7 +430,6 @@ + { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5520_MINICARD_CINGULAR) }, /* Dell Wireless HSDPA 5520 == Novatel Expedite EU860D */ + { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5520_MINICARD_GENERIC_L) }, /* Dell Wireless HSDPA 5520 */ + { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5520_MINICARD_GENERIC_I) }, /* Dell Wireless 5520 Voda I Mobile Broadband (3G HSDPA) Minicard */ +- { USB_DEVICE(DELL_VENDOR_ID, 0x8147) }, /* Dell Wireless 5530 Mobile Broadband (3G HSPA) Mini-Card */ + { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5730_MINICARD_SPRINT) }, /* Dell Wireless 5730 Mobile Broadband EVDO/HSPA Mini-Card */ + { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5730_MINICARD_TELUS) }, /* Dell Wireless 5730 Mobile Broadband EVDO/HSPA Mini-Card */ + { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5730_MINICARD_VZW) }, /* Dell Wireless 5730 Mobile Broadband EVDO/HSPA Mini-Card */ +@@ -497,10 +497,10 @@ + { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */ + { USB_DEVICE(MAXON_VENDOR_ID, 0x6280) }, /* BP3-USB & BP3-EXT HSDPA */ + { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864E) }, ++ { USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_MF622) }, + { USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_MF626) }, + { USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_MF628) }, + { USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_CDMA_TECH) }, +- { USB_DEVICE(ERICSSON_VENDOR_ID, ERICSSON_PRODUCT_F3507G) }, + { USB_DEVICE(BENQ_VENDOR_ID, BENQ_PRODUCT_H10) }, + { USB_DEVICE(0x1da5, 0x4515) }, /* BenQ H20 */ + { } /* Terminating entry */ +diff -urN linux-2.6.27.19-5.1/drivers/usb/serial/usb-serial.c linux-2.6.27.23-0.1.1/drivers/usb/serial/usb-serial.c +--- linux-2.6.27.19-5.1/drivers/usb/serial/usb-serial.c 2009-06-16 13:54:32.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/usb/serial/usb-serial.c 2009-06-16 13:40:39.000000000 +0100 +@@ -136,22 +136,10 @@ + + dbg("%s - %s", __func__, serial->type->description); + +- serial->type->shutdown(serial); +- + /* return the minor range that this device had */ + if (serial->minor != SERIAL_TTY_NO_MINOR) + return_serial(serial); + +- for (i = 0; i < serial->num_ports; ++i) +- serial->port[i]->port.count = 0; +- +- /* the ports are cleaned up and released in port_release() */ +- for (i = 0; i < serial->num_ports; ++i) +- if (serial->port[i]->dev.parent != NULL) { +- device_unregister(&serial->port[i]->dev); +- serial->port[i] = NULL; +- } +- + /* If this is a "fake" port, we have to clean it up here, as it will + * not get cleaned up in port_release() as it was never registered with + * the driver core */ +@@ -186,7 +174,7 @@ + struct usb_serial *serial; + struct usb_serial_port *port; + unsigned int portNumber; +- int retval; ++ int retval = 0; + + dbg("%s", __func__); + +@@ -197,16 +185,24 @@ + return -ENODEV; + } + ++ mutex_lock(&serial->disc_mutex); + portNumber = tty->index - serial->minor; + port = serial->port[portNumber]; +- if (!port) { ++ if (!port || serial->disconnected) + retval = -ENODEV; +- goto bailout_kref_put; +- } ++ else ++ get_device(&port->dev); ++ /* ++ * Note: Our locking order requirement does not allow port->mutex ++ * to be acquired while serial->disc_mutex is held. ++ */ ++ mutex_unlock(&serial->disc_mutex); ++ if (retval) ++ goto bailout_serial_put; + + if (mutex_lock_interruptible(&port->mutex)) { + retval = -ERESTARTSYS; +- goto bailout_kref_put; ++ goto bailout_port_put; + } + + ++port->port.count; +@@ -226,14 +222,20 @@ + goto bailout_mutex_unlock; + } + +- retval = usb_autopm_get_interface(serial->interface); ++ mutex_lock(&serial->disc_mutex); ++ if (serial->disconnected) ++ retval = -ENODEV; ++ else ++ retval = usb_autopm_get_interface(serial->interface); + if (retval) + goto bailout_module_put; ++ + /* only call the device specific open if this + * is the first time the port is opened */ + retval = serial->type->open(tty, port, filp); + if (retval) + goto bailout_interface_put; ++ mutex_unlock(&serial->disc_mutex); + } + + mutex_unlock(&port->mutex); +@@ -242,13 +244,16 @@ + bailout_interface_put: + usb_autopm_put_interface(serial->interface); + bailout_module_put: ++ mutex_unlock(&serial->disc_mutex); + module_put(serial->type->driver.owner); + bailout_mutex_unlock: + port->port.count = 0; + tty->driver_data = NULL; + port->port.tty = NULL; + mutex_unlock(&port->mutex); +-bailout_kref_put: ++bailout_port_put: ++ put_device(&port->dev); ++bailout_serial_put: + usb_serial_put(serial); + return retval; + } +@@ -256,6 +261,9 @@ + static void serial_close(struct tty_struct *tty, struct file *filp) + { + struct usb_serial_port *port = tty->driver_data; ++ struct usb_serial *serial; ++ struct module *owner; ++ int count; + + if (!port) + return; +@@ -263,6 +271,8 @@ + dbg("%s - port %d", __func__, port->number); + + mutex_lock(&port->mutex); ++ serial = port->serial; ++ owner = serial->type->driver.owner; + + if (port->port.count == 0) { + mutex_unlock(&port->mutex); +@@ -273,7 +283,7 @@ + if (port->port.count == 0) + /* only call the device specific close if this + * port is being closed by the last owner */ +- port->serial->type->close(tty, port, filp); ++ serial->type->close(tty, port, filp); + + if (port->port.count == (port->console? 1 : 0)) { + if (port->port.tty) { +@@ -283,16 +293,22 @@ + } + } + +- if (port->port.count == 0) { +- mutex_lock(&port->serial->disc_mutex); +- if (!port->serial->disconnected) +- usb_autopm_put_interface(port->serial->interface); +- mutex_unlock(&port->serial->disc_mutex); +- module_put(port->serial->type->driver.owner); ++ count = port->port.count; ++ mutex_unlock(&port->mutex); ++ put_device(&port->dev); ++ ++ /* Mustn't dereference port any more */ ++ if (count == 0) { ++ mutex_lock(&serial->disc_mutex); ++ if (!serial->disconnected) ++ usb_autopm_put_interface(serial->interface); ++ mutex_unlock(&serial->disc_mutex); + } ++ usb_serial_put(serial); + +- mutex_unlock(&port->mutex); +- usb_serial_put(port->serial); ++ /* Mustn't dereference serial any more */ ++ if (count == 0) ++ module_put(owner); + } + + static int serial_write(struct tty_struct *tty, const unsigned char *buf, +@@ -544,7 +560,13 @@ + + static void port_free(struct usb_serial_port *port) + { ++ /* ++ * Stop all the traffic before cancelling the work, so that ++ * nobody will restart it by calling usb_serial_port_softint. ++ */ + kill_traffic(port); ++ cancel_work_sync(&port->work); ++ + usb_free_urb(port->read_urb); + usb_free_urb(port->write_urb); + usb_free_urb(port->interrupt_in_urb); +@@ -553,7 +575,6 @@ + kfree(port->bulk_out_buffer); + kfree(port->interrupt_in_buffer); + kfree(port->interrupt_out_buffer); +- flush_scheduled_work(); /* port->work */ + kfree(port); + } + +@@ -1037,17 +1058,33 @@ + usb_set_intfdata(interface, NULL); + /* must set a flag, to signal subdrivers */ + serial->disconnected = 1; ++ mutex_unlock(&serial->disc_mutex); ++ ++ /* Unfortunately, many of the sub-drivers expect the port structures ++ * to exist when their shutdown method is called, so we have to go ++ * through this awkward two-step unregistration procedure. ++ */ + for (i = 0; i < serial->num_ports; ++i) { + port = serial->port[i]; + if (port) { + if (port->port.tty) + tty_hangup(port->port.tty); + kill_traffic(port); ++ cancel_work_sync(&port->work); ++ device_del(&port->dev); + } + } ++ serial->type->shutdown(serial); ++ for (i = 0; i < serial->num_ports; ++i) { ++ port = serial->port[i]; ++ if (port) { ++ put_device(&port->dev); ++ serial->port[i] = NULL; ++ } ++ } ++ + /* let the last holder of this object + * cause it to be cleaned up */ +- mutex_unlock(&serial->disc_mutex); + usb_serial_put(serial); + dev_info(dev, "device disconnected\n"); + } +diff -urN linux-2.6.27.19-5.1/drivers/usb/storage/cypress_atacb.c linux-2.6.27.23-0.1.1/drivers/usb/storage/cypress_atacb.c +--- linux-2.6.27.19-5.1/drivers/usb/storage/cypress_atacb.c 2009-06-16 13:54:32.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/usb/storage/cypress_atacb.c 2009-06-16 13:40:39.000000000 +0100 +@@ -133,19 +133,18 @@ + + /* build the command for + * reading the ATA registers */ +- scsi_eh_prep_cmnd(srb, &ses, NULL, 0, 0); +- srb->sdb.length = sizeof(regs); +- sg_init_one(&ses.sense_sgl, regs, srb->sdb.length); +- srb->sdb.table.sgl = &ses.sense_sgl; +- srb->sc_data_direction = DMA_FROM_DEVICE; +- srb->sdb.table.nents = 1; ++ scsi_eh_prep_cmnd(srb, &ses, NULL, 0, sizeof(regs)); ++ + /* we use the same command as before, but we set + * the read taskfile bit, for not executing atacb command, + * but reading register selected in srb->cmnd[4] + */ ++ srb->cmd_len = 16; ++ srb->cmnd = ses.cmnd; + srb->cmnd[2] = 1; + + usb_stor_transparent_scsi_command(srb, us); ++ memcpy(regs, srb->sense_buffer, sizeof(regs)); + tmp_result = srb->result; + scsi_eh_restore_cmnd(srb, &ses); + /* we fail to get registers, report invalid command */ +@@ -162,8 +161,8 @@ + + /* XXX we should generate sk, asc, ascq from status and error + * regs +- * (see 11.1 Error translation ­ ATA device error to SCSI error map) +- * and ata_to_sense_error from libata. ++ * (see 11.1 Error translation ATA device error to SCSI error ++ * map, and ata_to_sense_error from libata.) + */ + + /* Sense data is current and format is descriptor. */ +diff -urN linux-2.6.27.19-5.1/drivers/usb/storage/scsiglue.c linux-2.6.27.23-0.1.1/drivers/usb/storage/scsiglue.c +--- linux-2.6.27.19-5.1/drivers/usb/storage/scsiglue.c 2009-06-16 13:54:32.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/usb/storage/scsiglue.c 2009-06-16 13:40:39.000000000 +0100 +@@ -135,6 +135,12 @@ + if (sdev->request_queue->max_sectors > max_sectors) + blk_queue_max_sectors(sdev->request_queue, + max_sectors); ++ } else if (sdev->type == TYPE_TAPE) { ++ /* Tapes need much higher max_sector limits, so just ++ * raise it to the maximum possible (4 GB / 512) and ++ * let the queue segment size sort out the real limit. ++ */ ++ blk_queue_max_sectors(sdev->request_queue, 0x7FFFFF); + } + + /* We can't put these settings in slave_alloc() because that gets +diff -urN linux-2.6.27.19-5.1/drivers/usb/storage/unusual_devs.h linux-2.6.27.23-0.1.1/drivers/usb/storage/unusual_devs.h +--- linux-2.6.27.19-5.1/drivers/usb/storage/unusual_devs.h 2009-06-16 13:54:32.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/usb/storage/unusual_devs.h 2009-06-16 13:40:39.000000000 +0100 +@@ -219,7 +219,7 @@ + US_FL_MAX_SECTORS_64 ), + + /* Reported by Manuel Osdoba */ +-UNUSUAL_DEV( 0x0421, 0x0492, 0x0452, 0x0452, ++UNUSUAL_DEV( 0x0421, 0x0492, 0x0452, 0x9999, + "Nokia", + "Nokia 6233", + US_SC_DEVICE, US_PR_DEVICE, NULL, +@@ -953,13 +953,13 @@ + "Genesys Logic", + "USB to IDE Optical", + US_SC_DEVICE, US_PR_DEVICE, NULL, +- US_FL_GO_SLOW | US_FL_MAX_SECTORS_64 ), ++ US_FL_GO_SLOW | US_FL_MAX_SECTORS_64 | US_FL_IGNORE_RESIDUE ), + + UNUSUAL_DEV( 0x05e3, 0x0702, 0x0000, 0xffff, + "Genesys Logic", + "USB to IDE Disk", + US_SC_DEVICE, US_PR_DEVICE, NULL, +- US_FL_GO_SLOW | US_FL_MAX_SECTORS_64 ), ++ US_FL_GO_SLOW | US_FL_MAX_SECTORS_64 | US_FL_IGNORE_RESIDUE ), + + /* Reported by Hanno Boeck + * Taken from the Lycoris Kernel */ +@@ -990,7 +990,9 @@ + US_FL_FIX_CAPACITY ), + + /* Reported by Richard -=[]=- */ +-UNUSUAL_DEV( 0x067b, 0x2507, 0x0100, 0x0100, ++/* Change to bcdDeviceMin (0x0100 to 0x0001) reported by ++ * Thomas Bartosik */ ++UNUSUAL_DEV( 0x067b, 0x2507, 0x0001, 0x0100, + "Prolific Technology Inc.", + "Mass Storage Device", + US_SC_DEVICE, US_PR_DEVICE, NULL, +@@ -1239,12 +1241,14 @@ + US_SC_DEVICE, US_PR_DEVICE, NULL, + US_FL_FIX_INQUIRY ), + +-/* Reported by Rauch Wolke */ ++/* Reported by Rauch Wolke ++ * and augmented by binbin (Bugzilla #12882) ++ */ + UNUSUAL_DEV( 0x07c4, 0xa4a5, 0x0000, 0xffff, + "Simple Tech/Datafab", + "CF+SM Reader", + US_SC_DEVICE, US_PR_DEVICE, NULL, +- US_FL_IGNORE_RESIDUE ), ++ US_FL_IGNORE_RESIDUE | US_FL_MAX_SECTORS_64 ), + + /* Casio QV 2x00/3x00/4000/8000 digital still cameras are not conformant + * to the USB storage specification in two ways: +@@ -1405,6 +1409,16 @@ + US_SC_DEVICE, US_PR_DEVICE, NULL, + 0 ), + ++/* Reported by Jan Dumon ++ * This device (wrongly) has a vendor-specific device descriptor. ++ * The entry is needed so usb-storage can bind to it's mass-storage ++ * interface as an interface driver */ ++UNUSUAL_DEV( 0x0af0, 0x7501, 0x0000, 0x0000, ++ "Option", ++ "GI 0431 SD-Card", ++ US_SC_DEVICE, US_PR_DEVICE, NULL, ++ 0 ), ++ + #ifdef CONFIG_USB_STORAGE_ISD200 + UNUSUAL_DEV( 0x0bf6, 0xa001, 0x0100, 0x0110, + "ATI", +@@ -2133,6 +2147,12 @@ + US_SC_DEVICE, US_PR_DEVICE, NULL, + US_FL_CAPACITY_HEURISTICS), + ++/* Reported by Alessio Treglia */ ++UNUSUAL_DEV( 0xed10, 0x7636, 0x0001, 0x0001, ++ "TGE", ++ "Digital MP3 Audio Player", ++ US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_NOT_LOCKABLE ), ++ + /* Control/Bulk transport for all SubClass values */ + USUAL_DEV(US_SC_RBC, US_PR_CB, USB_US_TYPE_STOR), + USUAL_DEV(US_SC_8020, US_PR_CB, USB_US_TYPE_STOR), +diff -urN linux-2.6.27.19-5.1/drivers/watchdog/ks8695_wdt.c linux-2.6.27.23-0.1.1/drivers/watchdog/ks8695_wdt.c +--- linux-2.6.27.19-5.1/drivers/watchdog/ks8695_wdt.c 2009-06-16 13:54:54.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/watchdog/ks8695_wdt.c 2009-06-16 13:41:02.000000000 +0100 +@@ -21,6 +21,7 @@ + #include + #include + #include ++#include + #include + + #define WDT_DEFAULT_TIME 5 /* seconds */ +diff -urN linux-2.6.27.19-5.1/drivers/watchdog/rc32434_wdt.c linux-2.6.27.23-0.1.1/drivers/watchdog/rc32434_wdt.c +--- linux-2.6.27.19-5.1/drivers/watchdog/rc32434_wdt.c 2009-06-16 13:54:54.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/watchdog/rc32434_wdt.c 2009-06-16 13:41:02.000000000 +0100 +@@ -33,104 +33,89 @@ + #include + #include + +-#define MAX_TIMEOUT 20 +-#define RC32434_WDT_INTERVAL (15 * HZ) +- +-#define VERSION "0.2" ++#define VERSION "0.4" + + static struct { +- struct completion stop; +- int running; +- struct timer_list timer; +- int queue; +- int default_ticks; + unsigned long inuse; + } rc32434_wdt_device; + + static struct integ __iomem *wdt_reg; +-static int ticks = 100 * HZ; + + static int expect_close; +-static int timeout; ++ ++/* Board internal clock speed in Hz, ++ * the watchdog timer ticks at. */ ++extern unsigned int idt_cpu_freq; ++ ++/* translate wtcompare value to seconds and vice versa */ ++#define WTCOMP2SEC(x) (x / idt_cpu_freq) ++#define SEC2WTCOMP(x) (x * idt_cpu_freq) ++ ++/* Use a default timeout of 20s. This should be ++ * safe for CPU clock speeds up to 400MHz, as ++ * ((2 ^ 32) - 1) / (400MHz / 2) = 21s. */ ++#define WATCHDOG_TIMEOUT 20 ++ ++static int timeout = WATCHDOG_TIMEOUT; + + static int nowayout = WATCHDOG_NOWAYOUT; + module_param(nowayout, int, 0); + MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" + __MODULE_STRING(WATCHDOG_NOWAYOUT) ")"); + ++/* apply or and nand masks to data read from addr and write back */ ++#define SET_BITS(addr, or, nand) \ ++ writel((readl(&addr) | or) & ~nand, &addr) + + static void rc32434_wdt_start(void) + { +- u32 val; ++ u32 or, nand; + +- if (!rc32434_wdt_device.inuse) { +- writel(0, &wdt_reg->wtcount); ++ /* zero the counter before enabling */ ++ writel(0, &wdt_reg->wtcount); + +- val = RC32434_ERR_WRE; +- writel(readl(&wdt_reg->errcs) | val, &wdt_reg->errcs); ++ /* don't generate a non-maskable interrupt, ++ * do a warm reset instead */ ++ nand = 1 << RC32434_ERR_WNE; ++ or = 1 << RC32434_ERR_WRE; + +- val = RC32434_WTC_EN; +- writel(readl(&wdt_reg->wtc) | val, &wdt_reg->wtc); +- } +- rc32434_wdt_device.running++; +-} ++ /* reset the ERRCS timeout bit in case it's set */ ++ nand |= 1 << RC32434_ERR_WTO; + +-static void rc32434_wdt_stop(void) +-{ +- u32 val; +- +- if (rc32434_wdt_device.running) { ++ SET_BITS(wdt_reg->errcs, or, nand); + +- val = ~RC32434_WTC_EN; +- writel(readl(&wdt_reg->wtc) & val, &wdt_reg->wtc); ++ /* reset WTC timeout bit and enable WDT */ ++ nand = 1 << RC32434_WTC_TO; ++ or = 1 << RC32434_WTC_EN; + +- val = ~RC32434_ERR_WRE; +- writel(readl(&wdt_reg->errcs) & val, &wdt_reg->errcs); ++ SET_BITS(wdt_reg->wtc, or, nand); ++} + +- rc32434_wdt_device.running = 0; +- } ++static void rc32434_wdt_stop(void) ++{ ++ /* Disable WDT */ ++ SET_BITS(wdt_reg->wtc, 0, 1 << RC32434_WTC_EN); + } + +-static void rc32434_wdt_set(int new_timeout) ++static int rc32434_wdt_set(int new_timeout) + { +- u32 cmp = new_timeout * HZ; +- u32 state, val; ++ int max_to = WTCOMP2SEC((u32)-1); + ++ if (new_timeout < 0 || new_timeout > max_to) { ++ printk(KERN_ERR KBUILD_MODNAME ++ ": timeout value must be between 0 and %d", ++ max_to); ++ return -EINVAL; ++ } + timeout = new_timeout; +- /* +- * store and disable WTC +- */ +- state = (u32)(readl(&wdt_reg->wtc) & RC32434_WTC_EN); +- val = ~RC32434_WTC_EN; +- writel(readl(&wdt_reg->wtc) & val, &wdt_reg->wtc); +- +- writel(0, &wdt_reg->wtcount); +- writel(cmp, &wdt_reg->wtcompare); +- +- /* +- * restore WTC +- */ ++ writel(SEC2WTCOMP(timeout), &wdt_reg->wtcompare); + +- writel(readl(&wdt_reg->wtc) | state, &wdt_reg); +-} +- +-static void rc32434_wdt_reset(void) +-{ +- ticks = rc32434_wdt_device.default_ticks; ++ return 0; + } + +-static void rc32434_wdt_update(unsigned long unused) ++static void rc32434_wdt_ping(void) + { +- if (rc32434_wdt_device.running) +- ticks--; +- + writel(0, &wdt_reg->wtcount); +- +- if (rc32434_wdt_device.queue && ticks) +- mod_timer(&rc32434_wdt_device.timer, +- jiffies + RC32434_WDT_INTERVAL); +- else +- complete(&rc32434_wdt_device.stop); + } + + static int rc32434_wdt_open(struct inode *inode, struct file *file) +@@ -141,19 +126,23 @@ + if (nowayout) + __module_get(THIS_MODULE); + ++ rc32434_wdt_start(); ++ rc32434_wdt_ping(); ++ + return nonseekable_open(inode, file); + } + + static int rc32434_wdt_release(struct inode *inode, struct file *file) + { +- if (expect_close && nowayout == 0) { ++ if (expect_close == 42) { + rc32434_wdt_stop(); + printk(KERN_INFO KBUILD_MODNAME ": disabling watchdog timer\n"); + module_put(THIS_MODULE); +- } else ++ } else { + printk(KERN_CRIT KBUILD_MODNAME + ": device closed unexpectedly. WDT will not stop !\n"); +- ++ rc32434_wdt_ping(); ++ } + clear_bit(0, &rc32434_wdt_device.inuse); + return 0; + } +@@ -173,10 +162,10 @@ + if (get_user(c, data + i)) + return -EFAULT; + if (c == 'V') +- expect_close = 1; ++ expect_close = 42; + } + } +- rc32434_wdt_update(0); ++ rc32434_wdt_ping(); + return len; + } + return 0; +@@ -196,11 +185,11 @@ + }; + switch (cmd) { + case WDIOC_KEEPALIVE: +- rc32434_wdt_reset(); ++ rc32434_wdt_ping(); + break; + case WDIOC_GETSTATUS: + case WDIOC_GETBOOTSTATUS: +- value = readl(&wdt_reg->wtcount); ++ value = 0; + if (copy_to_user(argp, &value, sizeof(int))) + return -EFAULT; + break; +@@ -217,6 +206,7 @@ + break; + case WDIOS_DISABLECARD: + rc32434_wdt_stop(); ++ break; + default: + return -EINVAL; + } +@@ -224,11 +214,9 @@ + case WDIOC_SETTIMEOUT: + if (copy_from_user(&new_timeout, argp, sizeof(int))) + return -EFAULT; +- if (new_timeout < 1) ++ if (rc32434_wdt_set(new_timeout)) + return -EINVAL; +- if (new_timeout > MAX_TIMEOUT) +- return -EINVAL; +- rc32434_wdt_set(new_timeout); ++ /* Fall through */ + case WDIOC_GETTIMEOUT: + return copy_to_user(argp, &timeout, sizeof(int)); + default: +@@ -253,15 +241,15 @@ + .fops = &rc32434_wdt_fops, + }; + +-static char banner[] = KERN_INFO KBUILD_MODNAME ++static char banner[] __devinitdata = KERN_INFO KBUILD_MODNAME + ": Watchdog Timer version " VERSION ", timer margin: %d sec\n"; + +-static int rc32434_wdt_probe(struct platform_device *pdev) ++static int __devinit rc32434_wdt_probe(struct platform_device *pdev) + { + int ret; + struct resource *r; + +- r = platform_get_resource_byname(pdev, IORESOURCE_MEM, "rb500_wdt_res"); ++ r = platform_get_resource_byname(pdev, IORESOURCE_MEM, "rb532_wdt_res"); + if (!r) { + printk(KERN_ERR KBUILD_MODNAME + "failed to retrieve resources\n"); +@@ -276,24 +264,12 @@ + } + + ret = misc_register(&rc32434_wdt_miscdev); +- + if (ret < 0) { + printk(KERN_ERR KBUILD_MODNAME + "failed to register watchdog device\n"); + goto unmap; + } + +- init_completion(&rc32434_wdt_device.stop); +- rc32434_wdt_device.queue = 0; +- +- clear_bit(0, &rc32434_wdt_device.inuse); +- +- setup_timer(&rc32434_wdt_device.timer, rc32434_wdt_update, 0L); +- +- rc32434_wdt_device.default_ticks = ticks; +- +- rc32434_wdt_start(); +- + printk(banner, timeout); + + return 0; +@@ -303,23 +279,17 @@ + return ret; + } + +-static int rc32434_wdt_remove(struct platform_device *pdev) ++static int __devexit rc32434_wdt_remove(struct platform_device *pdev) + { +- if (rc32434_wdt_device.queue) { +- rc32434_wdt_device.queue = 0; +- wait_for_completion(&rc32434_wdt_device.stop); +- } + misc_deregister(&rc32434_wdt_miscdev); +- + iounmap(wdt_reg); +- + return 0; + } + + static struct platform_driver rc32434_wdt = { + .probe = rc32434_wdt_probe, +- .remove = rc32434_wdt_remove, +- .driver = { ++ .remove = __devexit_p(rc32434_wdt_remove), ++ .driver = { + .name = "rc32434_wdt", + } + }; +diff -urN linux-2.6.27.19-5.1/drivers/xen/blkfront/blkfront.c linux-2.6.27.23-0.1.1/drivers/xen/blkfront/blkfront.c +--- linux-2.6.27.19-5.1/drivers/xen/blkfront/blkfront.c 2009-06-16 13:54:32.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/xen/blkfront/blkfront.c 2009-06-16 13:40:39.000000000 +0100 +@@ -633,27 +633,26 @@ + + ring_req->nr_segments = blk_rq_map_sg(req->q, req, info->sg); + BUG_ON(ring_req->nr_segments > BLKIF_MAX_SEGMENTS_PER_REQUEST); +- + for_each_sg(info->sg, sg, ring_req->nr_segments, i) { +- buffer_mfn = page_to_phys(sg_page(sg)) >> PAGE_SHIFT; +- fsect = sg->offset >> 9; +- lsect = fsect + (sg->length >> 9) - 1; +- /* install a grant reference. */ +- ref = gnttab_claim_grant_reference(&gref_head); +- BUG_ON(ref == -ENOSPC); +- +- gnttab_grant_foreign_access_ref( +- ref, +- info->xbdev->otherend_id, +- buffer_mfn, +- rq_data_dir(req) ? GTF_readonly : 0 ); +- +- info->shadow[id].frame[i] = mfn_to_pfn(buffer_mfn); +- ring_req->seg[i] = +- (struct blkif_request_segment) { +- .gref = ref, +- .first_sect = fsect, +- .last_sect = lsect }; ++ buffer_mfn = page_to_phys(sg_page(sg)) >> PAGE_SHIFT; ++ fsect = sg->offset >> 9; ++ lsect = fsect + (sg->length >> 9) - 1; ++ /* install a grant reference. */ ++ ref = gnttab_claim_grant_reference(&gref_head); ++ BUG_ON(ref == -ENOSPC); ++ ++ gnttab_grant_foreign_access_ref( ++ ref, ++ info->xbdev->otherend_id, ++ buffer_mfn, ++ rq_data_dir(req) ? GTF_readonly : 0 ); ++ ++ info->shadow[id].frame[i] = mfn_to_pfn(buffer_mfn); ++ ring_req->seg[i] = ++ (struct blkif_request_segment) { ++ .gref = ref, ++ .first_sect = fsect, ++ .last_sect = lsect }; + } + + info->ring.req_prod_pvt++; +diff -urN linux-2.6.27.19-5.1/drivers/xen/blktap/blktap.c linux-2.6.27.23-0.1.1/drivers/xen/blktap/blktap.c +--- linux-2.6.27.19-5.1/drivers/xen/blktap/blktap.c 2009-06-16 13:54:32.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/xen/blktap/blktap.c 2009-06-16 13:40:39.000000000 +0100 +@@ -296,6 +296,10 @@ + /****************************************************************** + * BLKTAP VM OPS + */ ++struct tap_vma_priv { ++ tap_blkif_t *info; ++ struct page *map[]; ++}; + + static int blktap_fault(struct vm_area_struct *vma, struct vm_fault *vmf) + { +@@ -389,9 +393,22 @@ + return copy; + } + ++static void blktap_vma_close(struct vm_area_struct *vma) ++{ ++ if (vma->vm_private_data) { ++ struct tap_vma_priv *priv = container_of(vma->vm_private_data, ++ struct tap_vma_priv, ++ map); ++ ++ priv->info->vma = NULL; ++ kfree(priv); ++ } ++} ++ + struct vm_operations_struct blktap_vm_ops = { + fault: blktap_fault, + zap_pte: blktap_clear_pte, ++ close: blktap_vma_close, + }; + + /****************************************************************** +@@ -609,21 +626,6 @@ + ClearPageReserved(virt_to_page(info->ufe_ring.sring)); + free_page((unsigned long) info->ufe_ring.sring); + +- /* Clear any active mappings and free foreign map table */ +- if (info->vma) { +- struct mm_struct *mm = info->vma->vm_mm; +- +- down_write(&mm->mmap_sem); +- zap_page_range( +- info->vma, info->vma->vm_start, +- info->vma->vm_end - info->vma->vm_start, NULL); +- up_write(&mm->mmap_sem); +- +- kfree(info->vma->vm_private_data); +- +- info->vma = NULL; +- } +- + if (info->idx_map) { + kfree(info->idx_map); + info->idx_map = NULL; +@@ -662,8 +664,7 @@ + static int blktap_mmap(struct file *filp, struct vm_area_struct *vma) + { + int size; +- struct page **map; +- int i; ++ struct tap_vma_priv *priv; + tap_blkif_t *info = filp->private_data; + int ret; + +@@ -700,18 +701,16 @@ + } + + /* Mark this VM as containing foreign pages, and set up mappings. */ +- map = kzalloc(((vma->vm_end - vma->vm_start) >> PAGE_SHIFT) +- * sizeof(struct page *), +- GFP_KERNEL); +- if (map == NULL) { ++ priv = kzalloc(sizeof(*priv) + ((vma->vm_end - vma->vm_start) ++ >> PAGE_SHIFT) * sizeof(*priv->map), ++ GFP_KERNEL); ++ if (priv == NULL) { + WPRINTK("Couldn't alloc VM_FOREIGN map.\n"); + goto fail; + } ++ priv->info = info; + +- for (i = 0; i < ((vma->vm_end - vma->vm_start) >> PAGE_SHIFT); i++) +- map[i] = NULL; +- +- vma->vm_private_data = map; ++ vma->vm_private_data = priv->map; + vma->vm_flags |= VM_FOREIGN; + vma->vm_flags |= VM_DONTCOPY; + +@@ -1369,6 +1368,7 @@ + unsigned int nseg; + int ret, i, nr_sects = 0; + tap_blkif_t *info; ++ struct page **pgmap; + blkif_request_t *target; + int pending_idx = RTN_PEND_IDX(pending_req,pending_req->mem_idx); + int usr_idx; +@@ -1478,6 +1478,8 @@ + ret = HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, map, op); + BUG_ON(ret); + ++ pgmap = info->vma->vm_private_data; ++ + if (!xen_feature(XENFEAT_auto_translated_physmap)) { + up_write(&mm->mmap_sem); + +@@ -1517,8 +1519,7 @@ + >> PAGE_SHIFT)); + offset = (uvaddr - info->vma->vm_start) >> PAGE_SHIFT; + pg = pfn_to_page(__pa(kvaddr) >> PAGE_SHIFT); +- ((struct page **)info->vma->vm_private_data)[offset] = +- pg; ++ pgmap[offset] = pg; + } + } else { + for (i = 0; i < nseg; i++) { +@@ -1545,8 +1546,7 @@ + + offset = (uvaddr - info->vma->vm_start) >> PAGE_SHIFT; + pg = pfn_to_page(__pa(kvaddr) >> PAGE_SHIFT); +- ((struct page **)info->vma->vm_private_data)[offset] = +- pg; ++ pgmap[offset] = pg; + } + } + +diff -urN linux-2.6.27.19-5.1/drivers/xen/core/evtchn.c linux-2.6.27.23-0.1.1/drivers/xen/core/evtchn.c +--- linux-2.6.27.19-5.1/drivers/xen/core/evtchn.c 2009-06-16 13:54:32.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/xen/core/evtchn.c 2009-06-16 13:40:39.000000000 +0100 +@@ -66,7 +66,7 @@ + } *virq_actions[NR_VIRQS]; + /* IRQ <-> VIRQ mapping. */ + static DECLARE_BITMAP(virq_per_cpu, NR_VIRQS) __read_mostly; +-static DEFINE_PER_CPU(int[NR_VIRQS], virq_to_evtchn) = {[0 ... NR_VIRQS-1] = -1}; ++static DEFINE_PER_CPU(int[NR_VIRQS], virq_to_evtchn); + #define BUG_IF_VIRQ_PER_CPU(irq) \ + BUG_ON(type_from_irq(irq) == IRQT_VIRQ \ + && test_bit(index_from_irq(irq), virq_per_cpu)) +@@ -81,7 +81,7 @@ + #endif + #if defined(CONFIG_SMP) && defined(CONFIG_X86) + static int ipi_to_irq[NR_IPIS] __read_mostly = {[0 ... NR_IPIS-1] = -1}; +-static DEFINE_PER_CPU(int[NR_IPIS], ipi_to_evtchn) = {[0 ... NR_IPIS-1] = -1}; ++static DEFINE_PER_CPU(int[NR_IPIS], ipi_to_evtchn); + #else + #define PER_CPU_IPI_IRQ + #endif +@@ -154,6 +154,7 @@ + #endif + } + BUG(); ++ return 0; + } + + static inline unsigned int evtchn_from_irq(unsigned int irq) +@@ -377,14 +378,29 @@ + irq_exit(); + } + +-static int find_unbound_irq(void) ++static struct irq_chip dynirq_chip; ++ ++static int find_unbound_irq(bool percpu) + { + static int warned; + int irq; + + for (irq = DYNIRQ_BASE; irq < (DYNIRQ_BASE + NR_DYNIRQS); irq++) +- if (irq_bindcount[irq] == 0) ++ if (irq_bindcount[irq] == 0) { ++ irq_flow_handler_t handle; ++ const char *name; ++ ++ if (!percpu) { ++ handle = handle_level_irq; ++ name = "level"; ++ } else { ++ handle = handle_percpu_irq; ++ name = "percpu"; ++ } ++ set_irq_chip_and_handler_name(irq, &dynirq_chip, ++ handle, name); + return irq; ++ } + + if (!warned) { + warned = 1; +@@ -402,7 +418,7 @@ + spin_lock(&irq_mapping_update_lock); + + if ((irq = evtchn_to_irq[caller_port]) == -1) { +- if ((irq = find_unbound_irq()) < 0) ++ if ((irq = find_unbound_irq(false)) < 0) + goto out; + + evtchn_to_irq[caller_port] = irq; +@@ -424,7 +440,7 @@ + + BUG_ON(evtchn_to_irq[local_port] != -1); + +- if ((irq = find_unbound_irq()) < 0) { ++ if ((irq = find_unbound_irq(false)) < 0) { + struct evtchn_close close = { .port = local_port }; + if (HYPERVISOR_event_channel_op(EVTCHNOP_close, &close)) + BUG(); +@@ -477,7 +493,7 @@ + spin_lock(&irq_mapping_update_lock); + + if ((irq = per_cpu(virq_to_irq, cpu)[virq]) == -1) { +- if ((irq = find_unbound_irq()) < 0) ++ if ((irq = find_unbound_irq(false)) < 0) + goto out; + + bind_virq.virq = virq; +@@ -519,7 +535,7 @@ + spin_lock(&irq_mapping_update_lock); + + if ((irq = per_cpu(ipi_to_irq, cpu)[ipi]) == -1) { +- if ((irq = find_unbound_irq()) < 0) ++ if ((irq = find_unbound_irq(false)) < 0) + goto out; + + bind_ipi.vcpu = cpu; +@@ -568,7 +584,7 @@ + #ifndef PER_CPU_VIRQ_IRQ + for_each_possible_cpu(cpu) + per_cpu(virq_to_evtchn, cpu) +- [index_from_irq(irq)] = -1; ++ [index_from_irq(irq)] = 0; + #endif + break; + #if defined(CONFIG_SMP) && defined(PER_CPU_IPI_IRQ) +@@ -647,12 +663,12 @@ + switch (type_from_irq(irq)) { + #ifndef PER_CPU_VIRQ_IRQ + case IRQT_VIRQ: +- per_cpu(virq_to_evtchn, cpu)[index_from_irq(irq)] = -1; ++ per_cpu(virq_to_evtchn, cpu)[index_from_irq(irq)] = 0; + break; + #endif + #ifndef PER_CPU_IPI_IRQ + case IRQT_IPI: +- per_cpu(ipi_to_evtchn, cpu)[index_from_irq(irq)] = -1; ++ per_cpu(ipi_to_evtchn, cpu)[index_from_irq(irq)] = 0; + break; + #endif + default: +@@ -817,7 +833,7 @@ + + BUG_ON(!retval); + +- if ((irq = find_unbound_irq()) < 0) { ++ if ((irq = find_unbound_irq(true)) < 0) { + if (cur) + virq_actions[virq] = cur->next; + spin_unlock(&irq_mapping_update_lock); +@@ -832,10 +848,10 @@ + for_each_possible_cpu(cpu) + per_cpu(virq_to_irq, cpu)[virq] = irq; + irq_info[irq] = mk_irq_info(IRQT_VIRQ, virq, 0); +- irq_desc[irq].handle_irq = handle_percpu_irq; + } + +- if ((evtchn = per_cpu(virq_to_evtchn, cpu)[virq]) == -1) { ++ evtchn = per_cpu(virq_to_evtchn, cpu)[virq]; ++ if (!VALID_EVTCHN(evtchn)) { + bind_virq.virq = virq; + bind_virq.vcpu = cpu; + if (HYPERVISOR_event_channel_op(EVTCHNOP_bind_virq, +@@ -910,13 +926,13 @@ + + spin_lock(&irq_mapping_update_lock); + +- if (per_cpu(ipi_to_evtchn, cpu)[ipi] != -1) { ++ if (VALID_EVTCHN(per_cpu(ipi_to_evtchn, cpu)[ipi])) { + spin_unlock(&irq_mapping_update_lock); + return -EBUSY; + } + + if ((irq = ipi_to_irq[ipi]) == -1) { +- if ((irq = find_unbound_irq()) < 0) { ++ if ((irq = find_unbound_irq(true)) < 0) { + spin_unlock(&irq_mapping_update_lock); + return irq; + } +@@ -926,7 +942,6 @@ + + ipi_to_irq[ipi] = irq; + irq_info[irq] = mk_irq_info(IRQT_IPI, ipi, 0); +- irq_desc[irq].handle_irq = handle_percpu_irq; + retval = 1; + } + +@@ -1392,15 +1407,9 @@ + continue; + + #ifndef PER_CPU_VIRQ_IRQ +- if (test_bit(virq, virq_per_cpu)) { +- const struct per_cpu_irqaction *cur; +- +- for (cur = virq_actions[virq]; cur; cur = cur->next) +- if (cpu_isset(cpu, cur->cpus)) +- break; +- if (!cur) +- continue; +- } ++ if (test_bit(virq, virq_per_cpu) ++ && !VALID_EVTCHN(per_cpu(virq_to_evtchn, cpu)[virq])) ++ continue; + #endif + + BUG_ON(irq_info[irq] != mk_irq_info(IRQT_VIRQ, virq, 0)); +@@ -1445,7 +1454,8 @@ + #ifdef PER_CPU_IPI_IRQ + if ((irq = per_cpu(ipi_to_irq, cpu)[ipi]) == -1) + #else +- if ((irq = ipi_to_irq[ipi]) == -1) ++ if ((irq = ipi_to_irq[ipi]) == -1 ++ || !VALID_EVTCHN(per_cpu(ipi_to_evtchn, cpu)[ipi])) + #endif + continue; + +@@ -1560,7 +1570,7 @@ + + void evtchn_register_pirq(int irq) + { +- BUG_ON(irq < PIRQ_BASE || irq - PIRQ_BASE > NR_PIRQS); ++ BUG_ON(irq < PIRQ_BASE || irq - PIRQ_BASE >= NR_PIRQS); + if (identity_mapped_irq(irq) || type_from_irq(irq) != IRQT_UNBOUND) + return; + irq_info[irq] = mk_irq_info(IRQT_PIRQ, irq, 0); +@@ -1655,8 +1665,6 @@ + irq_bindcount[i] = 0; + + irq_desc[i].status |= IRQ_NOPROBE; +- set_irq_chip_and_handler_name(i, &dynirq_chip, +- handle_level_irq, "level"); + } + + /* Phys IRQ space is statically bound (1:1 mapping). Nail refcnts. */ +diff -urN linux-2.6.27.19-5.1/drivers/xen/core/firmware.c linux-2.6.27.23-0.1.1/drivers/xen/core/firmware.c +--- linux-2.6.27.19-5.1/drivers/xen/core/firmware.c 2009-06-16 13:54:32.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/xen/core/firmware.c 2009-06-16 13:40:39.000000000 +0100 +@@ -1,4 +1,5 @@ + #include ++#include + #include + #include + #include +diff -urN linux-2.6.27.19-5.1/drivers/xen/core/machine_kexec.c linux-2.6.27.23-0.1.1/drivers/xen/core/machine_kexec.c +--- linux-2.6.27.19-5.1/drivers/xen/core/machine_kexec.c 2009-06-16 13:54:32.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/xen/core/machine_kexec.c 2009-06-16 13:40:39.000000000 +0100 +@@ -5,6 +5,7 @@ + + #include + #include ++#include + #include + #include + +@@ -56,7 +57,7 @@ + + /* allocate xen_phys_cpus */ + +- xen_phys_cpus = alloc_bootmem_low(k * sizeof(struct resource)); ++ xen_phys_cpus = alloc_bootmem(k * sizeof(struct resource)); + BUG_ON(xen_phys_cpus == NULL); + + /* fill in xen_phys_cpus with per-cpu crash note information */ +@@ -140,6 +141,13 @@ + xen_max_nr_phys_cpus)) + goto err; + ++#ifdef CONFIG_X86 ++ if (xen_create_contiguous_region((unsigned long)&vmcoreinfo_note, ++ get_order(sizeof(vmcoreinfo_note)), ++ BITS_PER_LONG)) ++ goto err; ++#endif ++ + return; + + err: +@@ -217,11 +225,23 @@ + panic("KEXEC_CMD_kexec hypercall should not return\n"); + } + ++#ifdef CONFIG_X86 ++unsigned long paddr_vmcoreinfo_note(void) ++{ ++ return virt_to_machine(&vmcoreinfo_note); ++} ++#endif ++ + void machine_shutdown(void) + { + /* do nothing */ + } + ++void machine_crash_shutdown(struct pt_regs *regs) ++{ ++ /* The kernel is broken so disable interrupts */ ++ local_irq_disable(); ++} + + /* + * Local variables: +diff -urN linux-2.6.27.19-5.1/drivers/xen/core/machine_reboot.c linux-2.6.27.23-0.1.1/drivers/xen/core/machine_reboot.c +--- linux-2.6.27.19-5.1/drivers/xen/core/machine_reboot.c 2009-06-16 13:54:32.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/xen/core/machine_reboot.c 2009-06-16 13:40:39.000000000 +0100 +@@ -53,14 +53,6 @@ + HYPERVISOR_shutdown(SHUTDOWN_poweroff); + } + +-#ifdef CONFIG_KEXEC +-#include +-void machine_crash_shutdown(struct pt_regs *regs) +-{ +- native_machine_crash_shutdown(regs); +-} +-#endif +- + int reboot_thru_bios = 0; /* for dmi_scan.c */ + EXPORT_SYMBOL(machine_restart); + EXPORT_SYMBOL(machine_halt); +diff -urN linux-2.6.27.19-5.1/drivers/xen/core/smpboot.c linux-2.6.27.23-0.1.1/drivers/xen/core/smpboot.c +--- linux-2.6.27.19-5.1/drivers/xen/core/smpboot.c 2009-06-16 13:54:32.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/xen/core/smpboot.c 2009-06-16 13:40:39.000000000 +0100 +@@ -49,10 +49,6 @@ + DEFINE_PER_CPU(struct cpuinfo_x86, cpu_info); + EXPORT_PER_CPU_SYMBOL(cpu_info); + +-#ifdef CONFIG_HOTPLUG_CPU +-DEFINE_PER_CPU(int, cpu_state) = { 0 }; +-#endif +- + static int __read_mostly resched_irq = -1; + static int __read_mostly callfunc_irq = -1; + static int __read_mostly call1func_irq = -1; +@@ -84,10 +80,6 @@ + } + } + +-void __init smp_alloc_memory(void) +-{ +-} +- + static inline void + set_cpu_sibling_map(unsigned int cpu) + { +@@ -133,7 +125,7 @@ + cpu, + &resched_action); + if (rc < 0) +- goto fail; ++ return rc; + if (resched_irq < 0) + resched_irq = rc; + else +@@ -143,7 +135,7 @@ + cpu, + &callfunc_action); + if (rc < 0) +- goto fail; ++ goto unbind_resched; + if (callfunc_irq < 0) + callfunc_irq = rc; + else +@@ -153,7 +145,7 @@ + cpu, + &call1func_action); + if (rc < 0) +- goto fail; ++ goto unbind_call; + if (call1func_irq < 0) + call1func_irq = rc; + else +@@ -161,7 +153,7 @@ + + rc = xen_spinlock_init(cpu); + if (rc < 0) +- goto fail; ++ goto unbind_call1; + + if ((cpu != 0) && ((rc = local_setup_timer(cpu)) != 0)) + goto fail; +@@ -169,13 +161,13 @@ + return 0; + + fail: +- if (resched_irq >= 0) +- unbind_from_per_cpu_irq(resched_irq, cpu, NULL); +- if (callfunc_irq >= 0) +- unbind_from_per_cpu_irq(callfunc_irq, cpu, NULL); +- if (call1func_irq >= 0) +- unbind_from_per_cpu_irq(call1func_irq, cpu, NULL); + xen_spinlock_cleanup(cpu); ++ unbind_call1: ++ unbind_from_per_cpu_irq(call1func_irq, cpu, NULL); ++ unbind_call: ++ unbind_from_per_cpu_irq(callfunc_irq, cpu, NULL); ++ unbind_resched: ++ unbind_from_per_cpu_irq(resched_irq, cpu, NULL); + return rc; + } + +@@ -363,8 +355,8 @@ + { + #ifdef __i386__ + init_gdt(smp_processor_id()); +- switch_to_new_gdt(); + #endif ++ switch_to_new_gdt(); + prefill_possible_map(); + } + +diff -urN linux-2.6.27.19-5.1/drivers/xen/core/spinlock.c linux-2.6.27.23-0.1.1/drivers/xen/core/spinlock.c +--- linux-2.6.27.19-5.1/drivers/xen/core/spinlock.c 2009-06-16 13:54:32.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/xen/core/spinlock.c 2009-06-16 13:40:39.000000000 +0100 +@@ -55,8 +55,7 @@ + + void __cpuinit xen_spinlock_cleanup(unsigned int cpu) + { +- if (spinlock_irq >= 0) +- unbind_from_per_cpu_irq(spinlock_irq, cpu, NULL); ++ unbind_from_per_cpu_irq(spinlock_irq, cpu, NULL); + } + + int xen_spin_wait(raw_spinlock_t *lock, unsigned int token) +diff -urN linux-2.6.27.19-5.1/drivers/xen/fbfront/xenfb.c linux-2.6.27.23-0.1.1/drivers/xen/fbfront/xenfb.c +--- linux-2.6.27.19-5.1/drivers/xen/fbfront/xenfb.c 2009-06-16 13:54:32.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/xen/fbfront/xenfb.c 2009-06-16 13:40:39.000000000 +0100 +@@ -63,7 +63,6 @@ + int irq; + struct xenfb_page *page; + unsigned long *mfns; +- int update_wanted; /* XENFB_TYPE_UPDATE wanted */ + int feature_resize; /* Backend has resize feature */ + struct xenfb_resize resize; + int resize_dpy; +@@ -210,20 +209,25 @@ + int y1, y2, x1, x2; + struct xenfb_mapping *map; + +- if (!info->update_wanted) +- return; + if (xenfb_queue_full(info)) + return; + + mutex_lock(&info->mm_lock); + + spin_lock_irqsave(&info->dirty_lock, flags); +- y1 = info->y1; +- y2 = info->y2; +- x1 = info->x1; +- x2 = info->x2; +- info->x1 = info->y1 = INT_MAX; +- info->x2 = info->y2 = 0; ++ if (info->dirty){ ++ info->dirty = 0; ++ y1 = info->y1; ++ y2 = info->y2; ++ x1 = info->x1; ++ x2 = info->x2; ++ info->x1 = info->y1 = INT_MAX; ++ info->x2 = info->y2 = 0; ++ } else { ++ spin_unlock_irqrestore(&info->dirty_lock, flags); ++ mutex_unlock(&info->mm_lock); ++ return; ++ } + spin_unlock_irqrestore(&info->dirty_lock, flags); + + list_for_each_entry(map, &info->mappings, link) { +@@ -264,10 +268,7 @@ + + while (!kthread_should_stop()) { + xenfb_handle_resize_dpy(info); +- if (info->dirty) { +- info->dirty = 0; +- xenfb_update_screen(info); +- } ++ xenfb_update_screen(info); + wait_event_interruptible(info->wq, + kthread_should_stop() || info->dirty); + try_to_freeze(); +@@ -687,15 +688,6 @@ + if (ret < 0) + goto error; + +- /* FIXME should this be delayed until backend XenbusStateConnected? */ +- info->kthread = kthread_run(xenfb_thread, info, "xenfb thread"); +- if (IS_ERR(info->kthread)) { +- ret = PTR_ERR(info->kthread); +- info->kthread = NULL; +- xenbus_dev_fatal(dev, ret, "register_framebuffer"); +- goto error; +- } +- + xenfb_make_preferred_console(); + return 0; + +@@ -851,16 +843,25 @@ + if (dev->state != XenbusStateConnected) + goto InitWait; /* no InitWait seen yet, fudge it */ + +- if (xenbus_scanf(XBT_NIL, info->xbdev->otherend, +- "request-update", "%d", &val) < 0) +- val = 0; +- if (val) +- info->update_wanted = 1; + + if (xenbus_scanf(XBT_NIL, dev->otherend, + "feature-resize", "%d", &val) < 0) + val = 0; + info->feature_resize = val; ++ ++ if (xenbus_scanf(XBT_NIL, info->xbdev->otherend, ++ "request-update", "%d", &val) < 0) ++ val = 0; ++ ++ if (val){ ++ info->kthread = kthread_run(xenfb_thread, info, ++ "xenfb thread"); ++ if (IS_ERR(info->kthread)) { ++ info->kthread = NULL; ++ xenbus_dev_fatal(dev, PTR_ERR(info->kthread), ++ "xenfb_thread"); ++ } ++ } + break; + + case XenbusStateClosing: +diff -urN linux-2.6.27.19-5.1/drivers/xen/netfront/accel.c linux-2.6.27.23-0.1.1/drivers/xen/netfront/accel.c +--- linux-2.6.27.19-5.1/drivers/xen/netfront/accel.c 2009-06-16 13:54:32.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/xen/netfront/accel.c 2009-06-16 13:40:39.000000000 +0100 +@@ -58,9 +58,6 @@ + */ + static struct list_head accelerators_list; + +-/* Lock to protect access to accelerators_list */ +-static spinlock_t accelerators_lock; +- + /* Workqueue to process acceleration configuration changes */ + struct workqueue_struct *accel_watch_workqueue; + +@@ -70,7 +67,6 @@ + void netif_init_accel(void) + { + INIT_LIST_HEAD(&accelerators_list); +- spin_lock_init(&accelerators_lock); + + accel_watch_workqueue = create_workqueue("net_accel"); + } +@@ -78,13 +74,11 @@ + void netif_exit_accel(void) + { + struct netfront_accelerator *accelerator, *tmp; +- unsigned long flags; + + flush_workqueue(accel_watch_workqueue); + destroy_workqueue(accel_watch_workqueue); + +- spin_lock_irqsave(&accelerators_lock, flags); +- ++ /* No lock required as everything else should be quiet by now */ + list_for_each_entry_safe(accelerator, tmp, &accelerators_list, link) { + BUG_ON(!list_empty(&accelerator->vif_states)); + +@@ -92,8 +86,6 @@ + kfree(accelerator->frontend); + kfree(accelerator); + } +- +- spin_unlock_irqrestore(&accelerators_lock, flags); + } + + +@@ -246,16 +238,12 @@ + + /* + * Add a frontend vif to the list of vifs that is using a netfront +- * accelerator plugin module. ++ * accelerator plugin module. Must be called with the accelerator ++ * mutex held. + */ + static void add_accelerator_vif(struct netfront_accelerator *accelerator, + struct netfront_info *np) + { +- unsigned long flags; +- +- /* Need lock to write list */ +- spin_lock_irqsave(&accelerator->vif_states_lock, flags); +- + if (np->accelerator == NULL) { + np->accelerator = accelerator; + +@@ -268,13 +256,13 @@ + */ + BUG_ON(np->accelerator != accelerator); + } +- +- spin_unlock_irqrestore(&accelerator->vif_states_lock, flags); + } + + + /* + * Initialise the state to track an accelerator plugin module. ++ * ++ * Must be called with the accelerator mutex held. + */ + static int init_accelerator(const char *frontend, + struct netfront_accelerator **result, +@@ -282,7 +270,6 @@ + { + struct netfront_accelerator *accelerator = + kmalloc(sizeof(struct netfront_accelerator), GFP_KERNEL); +- unsigned long flags; + int frontend_len; + + if (!accelerator) { +@@ -304,9 +291,7 @@ + + accelerator->hooks = hooks; + +- spin_lock_irqsave(&accelerators_lock, flags); + list_add(&accelerator->link, &accelerators_list); +- spin_unlock_irqrestore(&accelerators_lock, flags); + + *result = accelerator; + +@@ -317,11 +302,14 @@ + /* + * Modify the hooks stored in the per-vif state to match that in the + * netfront accelerator's state. ++ * ++ * Takes the vif_states_lock spinlock and may sleep. + */ + static void + accelerator_set_vif_state_hooks(struct netfront_accel_vif_state *vif_state) + { +- /* This function must be called with the vif_states_lock held */ ++ struct netfront_accelerator *accelerator; ++ unsigned long flags; + + DPRINTK("%p\n",vif_state); + +@@ -329,19 +317,25 @@ + napi_disable(&vif_state->np->napi); + netif_tx_lock_bh(vif_state->np->netdev); + +- vif_state->hooks = vif_state->np->accelerator->hooks; ++ accelerator = vif_state->np->accelerator; ++ spin_lock_irqsave(&accelerator->vif_states_lock, flags); ++ vif_state->hooks = accelerator->hooks; ++ spin_unlock_irqrestore(&accelerator->vif_states_lock, flags); + + netif_tx_unlock_bh(vif_state->np->netdev); + napi_enable(&vif_state->np->napi); + } + + ++/* ++ * Must be called with the accelerator mutex held. Takes the ++ * vif_states_lock spinlock. ++ */ + static void accelerator_probe_new_vif(struct netfront_info *np, + struct xenbus_device *dev, + struct netfront_accelerator *accelerator) + { + struct netfront_accel_hooks *hooks; +- unsigned long flags; + + DPRINTK("\n"); + +@@ -350,17 +344,8 @@ + + hooks = accelerator->hooks; + +- if (hooks) { +- if (hooks->new_device(np->netdev, dev) == 0) { +- spin_lock_irqsave +- (&accelerator->vif_states_lock, flags); +- +- accelerator_set_vif_state_hooks(&np->accel_vif_state); +- +- spin_unlock_irqrestore +- (&accelerator->vif_states_lock, flags); +- } +- } ++ if (hooks && hooks->new_device(np->netdev, dev) == 0) ++ accelerator_set_vif_state_hooks(&np->accel_vif_state); + + return; + } +@@ -369,7 +354,10 @@ + /* + * Request that a particular netfront accelerator plugin is loaded. + * Usually called as a result of the vif configuration specifying +- * which one to use. Must be called with accelerator_mutex held ++ * which one to use. ++ * ++ * Must be called with accelerator_mutex held. Takes the ++ * vif_states_lock spinlock. + */ + static int netfront_load_accelerator(struct netfront_info *np, + struct xenbus_device *dev, +@@ -408,13 +396,15 @@ + * this accelerator. Notify the accelerator plugin of the relevant + * device if so. Called when an accelerator plugin module is first + * loaded and connects to netfront. ++ * ++ * Must be called with accelerator_mutex held. Takes the ++ * vif_states_lock spinlock. + */ + static void + accelerator_probe_vifs(struct netfront_accelerator *accelerator, + struct netfront_accel_hooks *hooks) + { + struct netfront_accel_vif_state *vif_state, *tmp; +- unsigned long flags; + + DPRINTK("%p\n", accelerator); + +@@ -426,29 +416,22 @@ + BUG_ON(hooks == NULL); + accelerator->hooks = hooks; + +- /* +- * currently hold accelerator_mutex, so don't need +- * vif_states_lock to read the list +- */ ++ /* Holds accelerator_mutex to iterate list */ + list_for_each_entry_safe(vif_state, tmp, &accelerator->vif_states, + link) { + struct netfront_info *np = vif_state->np; + +- if (hooks->new_device(np->netdev, vif_state->dev) == 0) { +- spin_lock_irqsave +- (&accelerator->vif_states_lock, flags); +- ++ if (hooks->new_device(np->netdev, vif_state->dev) == 0) + accelerator_set_vif_state_hooks(vif_state); +- +- spin_unlock_irqrestore +- (&accelerator->vif_states_lock, flags); +- } + } + } + + + /* +- * Called by the netfront accelerator plugin module when it has loaded ++ * Called by the netfront accelerator plugin module when it has ++ * loaded. ++ * ++ * Takes the accelerator_mutex and vif_states_lock spinlock. + */ + int netfront_accelerator_loaded(int version, const char *frontend, + struct netfront_accel_hooks *hooks) +@@ -504,15 +487,21 @@ + + /* + * Remove the hooks from a single vif state. ++ * ++ * Takes the vif_states_lock spinlock and may sleep. + */ + static void + accelerator_remove_single_hook(struct netfront_accelerator *accelerator, + struct netfront_accel_vif_state *vif_state) + { ++ unsigned long flags; ++ + /* Make sure there are no data path operations going on */ + napi_disable(&vif_state->np->napi); + netif_tx_lock_bh(vif_state->np->netdev); + ++ spin_lock_irqsave(&accelerator->vif_states_lock, flags); ++ + /* + * Remove the hooks, but leave the vif_state on the + * accelerator's list as that signifies this vif is +@@ -521,6 +510,8 @@ + */ + vif_state->hooks = NULL; + ++ spin_unlock_irqrestore(&accelerator->vif_states_lock, flags); ++ + netif_tx_unlock_bh(vif_state->np->netdev); + napi_enable(&vif_state->np->napi); + } +@@ -528,25 +519,25 @@ + + /* + * Safely remove the accelerator function hooks from a netfront state. ++ * ++ * Must be called with the accelerator mutex held. Takes the ++ * vif_states_lock spinlock. + */ + static void accelerator_remove_hooks(struct netfront_accelerator *accelerator) + { +- struct netfront_accel_hooks *hooks; + struct netfront_accel_vif_state *vif_state, *tmp; + unsigned long flags; + +- /* Mutex is held so don't need vif_states_lock to iterate list */ ++ /* Mutex is held to iterate list */ + list_for_each_entry_safe(vif_state, tmp, + &accelerator->vif_states, + link) { +- spin_lock_irqsave(&accelerator->vif_states_lock, flags); +- + if(vif_state->hooks) { +- hooks = vif_state->hooks; +- ++ spin_lock_irqsave(&accelerator->vif_states_lock, flags); ++ + /* Last chance to get statistics from the accelerator */ +- hooks->get_stats(vif_state->np->netdev, +- &vif_state->np->stats); ++ vif_state->hooks->get_stats(vif_state->np->netdev, ++ &vif_state->np->stats); + + spin_unlock_irqrestore(&accelerator->vif_states_lock, + flags); +@@ -554,9 +545,6 @@ + accelerator_remove_single_hook(accelerator, vif_state); + + accelerator->hooks->remove(vif_state->dev); +- } else { +- spin_unlock_irqrestore(&accelerator->vif_states_lock, +- flags); + } + } + +@@ -568,47 +556,47 @@ + * Called by a netfront accelerator when it is unloaded. This safely + * removes the hooks into the plugin and blocks until all devices have + * finished using it, so on return it is safe to unload. ++ * ++ * Takes the accelerator mutex, and vif_states_lock spinlock. + */ + void netfront_accelerator_stop(const char *frontend) + { + struct netfront_accelerator *accelerator; +- unsigned long flags; + + mutex_lock(&accelerator_mutex); +- spin_lock_irqsave(&accelerators_lock, flags); + + list_for_each_entry(accelerator, &accelerators_list, link) { + if (match_accelerator(frontend, accelerator)) { +- spin_unlock_irqrestore(&accelerators_lock, flags); +- + accelerator_remove_hooks(accelerator); +- + goto out; + } + } +- spin_unlock_irqrestore(&accelerators_lock, flags); + out: + mutex_unlock(&accelerator_mutex); + } + EXPORT_SYMBOL_GPL(netfront_accelerator_stop); + + +-/* Helper for call_remove and do_suspend */ +-static int do_remove(struct netfront_info *np, struct xenbus_device *dev, +- unsigned long *lock_flags) ++/* ++ * Helper for call_remove and do_suspend ++ * ++ * Must be called with the accelerator mutex held. Takes the ++ * vif_states_lock spinlock. ++ */ ++static int do_remove(struct netfront_info *np, struct xenbus_device *dev) + { + struct netfront_accelerator *accelerator = np->accelerator; +- struct netfront_accel_hooks *hooks; ++ unsigned long flags; + int rc = 0; + + if (np->accel_vif_state.hooks) { +- hooks = np->accel_vif_state.hooks; ++ spin_lock_irqsave(&accelerator->vif_states_lock, flags); + + /* Last chance to get statistics from the accelerator */ +- hooks->get_stats(np->netdev, &np->stats); ++ np->accel_vif_state.hooks->get_stats(np->netdev, &np->stats); + + spin_unlock_irqrestore(&accelerator->vif_states_lock, +- *lock_flags); ++ flags); + + /* + * Try and do the opposite of accelerator_probe_new_vif +@@ -619,20 +607,21 @@ + &np->accel_vif_state); + + rc = accelerator->hooks->remove(dev); +- +- spin_lock_irqsave(&accelerator->vif_states_lock, *lock_flags); + } + + return rc; + } + + ++/* ++ * Must be called with the accelerator mutex held. Takes the ++ * vif_states_lock spinlock ++ */ + static int netfront_remove_accelerator(struct netfront_info *np, + struct xenbus_device *dev) + { + struct netfront_accelerator *accelerator; + struct netfront_accel_vif_state *tmp_vif_state; +- unsigned long flags; + int rc = 0; + + /* Check that we've got a device that was accelerated */ +@@ -641,8 +630,6 @@ + + accelerator = np->accelerator; + +- spin_lock_irqsave(&accelerator->vif_states_lock, flags); +- + list_for_each_entry(tmp_vif_state, &accelerator->vif_states, + link) { + if (tmp_vif_state == &np->accel_vif_state) { +@@ -651,16 +638,18 @@ + } + } + +- rc = do_remove(np, dev, &flags); ++ rc = do_remove(np, dev); + + np->accelerator = NULL; + +- spin_unlock_irqrestore(&accelerator->vif_states_lock, flags); +- + return rc; + } + + ++/* ++ * No lock pre-requisites. Takes the accelerator mutex and the ++ * vif_states_lock spinlock. ++ */ + int netfront_accelerator_call_remove(struct netfront_info *np, + struct xenbus_device *dev) + { +@@ -672,11 +661,14 @@ + return rc; + } + +- ++ ++/* ++ * No lock pre-requisites. Takes the accelerator mutex and the ++ * vif_states_lock spinlock. ++ */ + int netfront_accelerator_suspend(struct netfront_info *np, + struct xenbus_device *dev) + { +- unsigned long flags; + int rc = 0; + + netfront_accelerator_remove_watch(np); +@@ -691,11 +683,7 @@ + * Call the remove accelerator hook, but leave the vif_state + * on the accelerator's list in case there is a suspend_cancel. + */ +- spin_lock_irqsave(&np->accelerator->vif_states_lock, flags); +- +- rc = do_remove(np, dev, &flags); +- +- spin_unlock_irqrestore(&np->accelerator->vif_states_lock, flags); ++ rc = do_remove(np, dev); + out: + mutex_unlock(&accelerator_mutex); + return rc; +@@ -714,15 +702,16 @@ + netfront_accelerator_add_watch(np); + return 0; + } +- +- ++ ++ ++/* ++ * No lock pre-requisites. Takes the accelerator mutex ++ */ + void netfront_accelerator_resume(struct netfront_info *np, + struct xenbus_device *dev) + { + struct netfront_accel_vif_state *accel_vif_state = NULL; +- spinlock_t *vif_states_lock; +- unsigned long flags; +- ++ + mutex_lock(&accelerator_mutex); + + /* Check that we've got a device that was accelerated */ +@@ -735,9 +724,6 @@ + if (accel_vif_state->dev == dev) { + BUG_ON(accel_vif_state != &np->accel_vif_state); + +- vif_states_lock = &np->accelerator->vif_states_lock; +- spin_lock_irqsave(vif_states_lock, flags); +- + /* + * Remove it from the accelerator's list so + * state is consistent for probing new vifs +@@ -745,9 +731,7 @@ + */ + list_del(&accel_vif_state->link); + np->accelerator = NULL; +- +- spin_unlock_irqrestore(vif_states_lock, flags); +- ++ + break; + } + } +@@ -758,11 +742,13 @@ + } + + ++/* ++ * No lock pre-requisites. Takes the vif_states_lock spinlock ++ */ + int netfront_check_accelerator_queue_ready(struct net_device *dev, + struct netfront_info *np) + { + struct netfront_accelerator *accelerator; +- struct netfront_accel_hooks *hooks; + int rc = 1; + unsigned long flags; + +@@ -771,8 +757,8 @@ + /* Call the check_ready accelerator hook. */ + if (np->accel_vif_state.hooks && accelerator) { + spin_lock_irqsave(&accelerator->vif_states_lock, flags); +- hooks = np->accel_vif_state.hooks; +- if (hooks && np->accelerator == accelerator) ++ if (np->accel_vif_state.hooks && ++ np->accelerator == accelerator) + rc = np->accel_vif_state.hooks->check_ready(dev); + spin_unlock_irqrestore(&accelerator->vif_states_lock, flags); + } +@@ -781,11 +767,13 @@ + } + + ++/* ++ * No lock pre-requisites. Takes the vif_states_lock spinlock ++ */ + void netfront_accelerator_call_stop_napi_irq(struct netfront_info *np, + struct net_device *dev) + { + struct netfront_accelerator *accelerator; +- struct netfront_accel_hooks *hooks; + unsigned long flags; + + accelerator = np->accelerator; +@@ -793,19 +781,21 @@ + /* Call the stop_napi_interrupts accelerator hook. */ + if (np->accel_vif_state.hooks && accelerator != NULL) { + spin_lock_irqsave(&accelerator->vif_states_lock, flags); +- hooks = np->accel_vif_state.hooks; +- if (hooks && np->accelerator == accelerator) ++ if (np->accel_vif_state.hooks && ++ np->accelerator == accelerator) + np->accel_vif_state.hooks->stop_napi_irq(dev); + spin_unlock_irqrestore(&accelerator->vif_states_lock, flags); + } + } + + ++/* ++ * No lock pre-requisites. Takes the vif_states_lock spinlock ++ */ + int netfront_accelerator_call_get_stats(struct netfront_info *np, + struct net_device *dev) + { + struct netfront_accelerator *accelerator; +- struct netfront_accel_hooks *hooks; + unsigned long flags; + int rc = 0; + +@@ -814,8 +804,8 @@ + /* Call the get_stats accelerator hook. */ + if (np->accel_vif_state.hooks && accelerator != NULL) { + spin_lock_irqsave(&accelerator->vif_states_lock, flags); +- hooks = np->accel_vif_state.hooks; +- if (hooks && np->accelerator == accelerator) ++ if (np->accel_vif_state.hooks && ++ np->accelerator == accelerator) + rc = np->accel_vif_state.hooks->get_stats(dev, + &np->stats); + spin_unlock_irqrestore(&accelerator->vif_states_lock, flags); +diff -urN linux-2.6.27.19-5.1/drivers/xen/netfront/netfront.c linux-2.6.27.23-0.1.1/drivers/xen/netfront/netfront.c +--- linux-2.6.27.19-5.1/drivers/xen/netfront/netfront.c 2009-06-16 13:54:32.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/xen/netfront/netfront.c 2009-06-16 13:40:39.000000000 +0100 +@@ -2186,6 +2186,8 @@ + + static int __init netif_init(void) + { ++ int err; ++ + if (!is_running_on_xen()) + return -ENODEV; + +@@ -2207,7 +2209,13 @@ + (void)register_inetaddr_notifier(¬ifier_inetdev); + #endif + +- return xenbus_register_frontend(&netfront_driver); ++ err = xenbus_register_frontend(&netfront_driver); ++ if (err) { ++#ifdef CONFIG_INET ++ unregister_inetaddr_notifier(¬ifier_inetdev); ++#endif ++ } ++ return err; + } + module_init(netif_init); + +@@ -2217,10 +2225,9 @@ + #ifdef CONFIG_INET + unregister_inetaddr_notifier(¬ifier_inetdev); + #endif ++ xenbus_unregister_driver(&netfront_driver); + + netif_exit_accel(); +- +- return xenbus_unregister_driver(&netfront_driver); + } + module_exit(netif_exit); + +diff -urN linux-2.6.27.19-5.1/drivers/xen/pciback/conf_space_quirks.c linux-2.6.27.23-0.1.1/drivers/xen/pciback/conf_space_quirks.c +--- linux-2.6.27.19-5.1/drivers/xen/pciback/conf_space_quirks.c 2009-06-16 13:54:32.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/xen/pciback/conf_space_quirks.c 2009-06-16 13:40:39.000000000 +0100 +@@ -13,13 +13,25 @@ + + LIST_HEAD(pciback_quirks); + ++static inline const struct pci_device_id * ++match_one_device(const struct pci_device_id *id, const struct pci_dev *dev) ++{ ++ if ((id->vendor == PCI_ANY_ID || id->vendor == dev->vendor) && ++ (id->device == PCI_ANY_ID || id->device == dev->device) && ++ (id->subvendor == PCI_ANY_ID || id->subvendor == dev->subsystem_vendor) && ++ (id->subdevice == PCI_ANY_ID || id->subdevice == dev->subsystem_device) && ++ !((id->class ^ dev->class) & id->class_mask)) ++ return id; ++ return NULL; ++} ++ + struct pciback_config_quirk *pciback_find_quirk(struct pci_dev *dev) + { + struct pciback_config_quirk *tmp_quirk; + + list_for_each_entry(tmp_quirk, &pciback_quirks, quirks_list) +- if (pci_match_id(&tmp_quirk->devid, dev)) +- goto out; ++ if (match_one_device(&tmp_quirk->devid, dev) != NULL) ++ goto out; + tmp_quirk = NULL; + printk(KERN_DEBUG + "quirk didn't match any device pciback knows about\n"); +diff -urN linux-2.6.27.19-5.1/drivers/xen/sfc_netback/accel.h linux-2.6.27.23-0.1.1/drivers/xen/sfc_netback/accel.h +--- linux-2.6.27.19-5.1/drivers/xen/sfc_netback/accel.h 2009-06-16 13:54:32.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/xen/sfc_netback/accel.h 2009-06-16 13:40:39.000000000 +0100 +@@ -124,8 +124,6 @@ + enum net_accel_hw_type hw_type; + /*! State of allocation */ + int hw_state; +- /*! Index into ci_driver.nics[] for this interface */ +- int nic_index; + /*! How to set up the acceleration for this hardware */ + int (*accel_setup)(struct netback_accel *); + /*! And how to stop it. */ +diff -urN linux-2.6.27.19-5.1/drivers/xen/sfc_netback/accel_solarflare.c linux-2.6.27.23-0.1.1/drivers/xen/sfc_netback/accel_solarflare.c +--- linux-2.6.27.19-5.1/drivers/xen/sfc_netback/accel_solarflare.c 2009-06-16 13:54:32.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/xen/sfc_netback/accel_solarflare.c 2009-06-16 13:40:39.000000000 +0100 +@@ -87,7 +87,6 @@ + enum net_accel_hw_type type; + struct net_device *net_dev; + struct efx_dl_device *efx_dl_dev; +- int nic_index; + void *fwd_priv; + }; + +@@ -164,34 +163,6 @@ + }; + + +-/* +- * Handy helper which given an efx_dl_device works out which +- * efab_nic_t index into efrm_nic_table.nics[] it corresponds to +- */ +-static int efx_device_to_efab_nic_index(struct efx_dl_device *efx_dl_dev) +-{ +- int i; +- +- for (i = 0; i < EFHW_MAX_NR_DEVS; i++) { +- struct efhw_nic *nic = efrm_nic_tablep->nic[i]; +- +- /* +- * It's possible for the nic structure to have not +- * been initialised if the resource driver failed its +- * driverlink probe +- */ +- if (nic == NULL || nic->net_driver_dev == NULL) +- continue; +- +- /* Work out if these are talking about the same NIC */ +- if (nic->net_driver_dev->pci_dev == efx_dl_dev->pci_dev) +- return i; +- } +- +- return -1; +-} +- +- + /* Driver link probe - register our callbacks */ + static int bend_dl_probe(struct efx_dl_device *efx_dl_dev, + const struct net_device *net_dev, +@@ -225,17 +196,6 @@ + port->efx_dl_dev = efx_dl_dev; + efx_dl_dev->priv = port; + +- port->nic_index = efx_device_to_efab_nic_index(efx_dl_dev); +- if (port->nic_index < 0) { +- /* +- * This can happen in theory if the resource driver +- * failed to initialise properly +- */ +- EPRINTK("%s: nic structure not found\n", __FUNCTION__); +- rc = -EINVAL; +- goto fail2; +- } +- + port->fwd_priv = netback_accel_init_fwd_port(); + if (port->fwd_priv == NULL) { + EPRINTK("%s: failed to set up forwarding for port\n", +@@ -377,8 +337,6 @@ + bend->accel_setup = netback_accel_setup_vnic_hw; + bend->accel_shutdown = netback_accel_shutdown_vnic_hw; + bend->fwd_priv = port->fwd_priv; +- /* This is just needed to pass to efx_vi_alloc */ +- bend->nic_index = port->nic_index; + bend->net_dev = port->net_dev; + mutex_unlock(&accel_mutex); + return 0; +@@ -505,7 +463,7 @@ + + accel_hw_priv = bend->accel_hw_priv; + +- rc = efx_vi_alloc(&accel_hw_priv->efx_vih, bend->nic_index); ++ rc = efx_vi_alloc(&accel_hw_priv->efx_vih, bend->net_dev->ifindex); + if (rc != 0) { + EPRINTK("%s: efx_vi_alloc failed %d\n", __FUNCTION__, rc); + free_page_state(bend); +@@ -600,9 +558,6 @@ + return rc; + } + +- if (res_mdata.version != 0) +- return -EPROTO; +- + hwinfo->nic_arch = res_mdata.nic_arch; + hwinfo->nic_variant = res_mdata.nic_variant; + hwinfo->nic_revision = res_mdata.nic_revision; +diff -urN linux-2.6.27.19-5.1/drivers/xen/sfc_netback/ci/driver/resource/efx_vi.h linux-2.6.27.23-0.1.1/drivers/xen/sfc_netback/ci/driver/resource/efx_vi.h +--- linux-2.6.27.19-5.1/drivers/xen/sfc_netback/ci/driver/resource/efx_vi.h 2009-06-16 13:54:32.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/xen/sfc_netback/ci/driver/resource/efx_vi.h 2009-06-16 13:40:39.000000000 +0100 +@@ -49,11 +49,11 @@ + * Allocate an efx_vi, including event queue and pt_endpoint + * + * \param vih_out Pointer to a handle that is set on success +- * \param nic_index Index of NIC to apply this resource to ++ * \param ifindex Index of the network interface desired + * \return Zero on success (and vih_out set), non-zero on failure. + */ + extern int +-efx_vi_alloc(struct efx_vi_state **vih_out, int nic_index); ++efx_vi_alloc(struct efx_vi_state **vih_out, int ifindex); + + /*! + * Free a previously allocated efx_vi +@@ -190,8 +190,6 @@ + /*! Constants for the type field in efx_vi_hw_resource */ + #define EFX_VI_HW_RESOURCE_TXDMAQ 0x0 /* PFN of TX DMA Q */ + #define EFX_VI_HW_RESOURCE_RXDMAQ 0x1 /* PFN of RX DMA Q */ +-#define EFX_VI_HW_RESOURCE_TXBELL 0x2 /* PFN of TX Doorbell (EF1) */ +-#define EFX_VI_HW_RESOURCE_RXBELL 0x3 /* PFN of RX Doorbell (EF1) */ + #define EFX_VI_HW_RESOURCE_EVQTIMER 0x4 /* Address of event q timer */ + + /* Address of event q pointer (EF1) */ +@@ -229,7 +227,6 @@ + * Metadata concerning the list of hardware resource mappings + */ + struct efx_vi_hw_resource_metadata { +- int version; + int evq_order; + int evq_offs; + int evq_capacity; +diff -urN linux-2.6.27.19-5.1/drivers/xen/sfc_netback/ci/efhw/common.h linux-2.6.27.23-0.1.1/drivers/xen/sfc_netback/ci/efhw/common.h +--- linux-2.6.27.19-5.1/drivers/xen/sfc_netback/ci/efhw/common.h 2009-06-16 13:54:32.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/xen/sfc_netback/ci/efhw/common.h 2009-06-16 13:40:39.000000000 +0100 +@@ -43,7 +43,6 @@ + + enum efhw_arch { + EFHW_ARCH_FALCON, +- EFHW_ARCH_SIENA, + }; + + typedef uint32_t efhw_buffer_addr_t; +@@ -56,25 +55,21 @@ + uint32_t a; + uint32_t b; + } opaque; +- struct { +- uint32_t code; +- uint32_t status; +- } ev1002; + } efhw_event_t; + + /* Flags for TX/RX queues */ +-#define EFHW_VI_JUMBO_EN 0x01 /*! scatter RX over multiple desc */ +-#define EFHW_VI_ISCSI_RX_HDIG_EN 0x02 /*! iscsi rx header digest */ +-#define EFHW_VI_ISCSI_TX_HDIG_EN 0x04 /*! iscsi tx header digest */ +-#define EFHW_VI_ISCSI_RX_DDIG_EN 0x08 /*! iscsi rx data digest */ +-#define EFHW_VI_ISCSI_TX_DDIG_EN 0x10 /*! iscsi tx data digest */ +-#define EFHW_VI_TX_PHYS_ADDR_EN 0x20 /*! TX physical address mode */ +-#define EFHW_VI_RX_PHYS_ADDR_EN 0x40 /*! RX physical address mode */ +-#define EFHW_VI_RM_WITH_INTERRUPT 0x80 /*! VI with an interrupt */ +-#define EFHW_VI_TX_IP_CSUM_DIS 0x100 /*! enable ip checksum generation */ +-#define EFHW_VI_TX_TCPUDP_CSUM_DIS 0x200 /*! enable tcp/udp checksum +- generation */ +-#define EFHW_VI_TX_TCPUDP_ONLY 0x400 /*! drop non-tcp/udp packets */ ++#define EFHW_VI_JUMBO_EN 0x01 /*! scatter RX over multiple desc */ ++#define EFHW_VI_ISCSI_RX_HDIG_EN 0x02 /*! iscsi rx header digest */ ++#define EFHW_VI_ISCSI_TX_HDIG_EN 0x04 /*! iscsi tx header digest */ ++#define EFHW_VI_ISCSI_RX_DDIG_EN 0x08 /*! iscsi rx data digest */ ++#define EFHW_VI_ISCSI_TX_DDIG_EN 0x10 /*! iscsi tx data digest */ ++#define EFHW_VI_TX_PHYS_ADDR_EN 0x20 /*! TX physical address mode */ ++#define EFHW_VI_RX_PHYS_ADDR_EN 0x40 /*! RX physical address mode */ ++#define EFHW_VI_RM_WITH_INTERRUPT 0x80 /*! VI with an interrupt */ ++#define EFHW_VI_TX_IP_CSUM_DIS 0x100 /*! enable ip checksum generation */ ++#define EFHW_VI_TX_TCPUDP_CSUM_DIS 0x200 /*! enable tcp/udp checksum ++ generation */ ++#define EFHW_VI_TX_TCPUDP_ONLY 0x400 /*! drop non-tcp/udp packets */ + + /* Types of hardware filter */ + /* Each of these values implicitly selects scatter filters on B0 - or in +diff -urN linux-2.6.27.19-5.1/drivers/xen/sfc_netback/ci/efhw/common_sysdep.h linux-2.6.27.23-0.1.1/drivers/xen/sfc_netback/ci/efhw/common_sysdep.h +--- linux-2.6.27.19-5.1/drivers/xen/sfc_netback/ci/efhw/common_sysdep.h 2009-06-16 13:54:32.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/xen/sfc_netback/ci/efhw/common_sysdep.h 2009-06-16 13:40:39.000000000 +0100 +@@ -41,7 +41,6 @@ + #define __CI_EFHW_COMMON_LINUX_H__ + + #include +-#include + + /* Dirty hack, but Linux kernel does not provide DMA_ADDR_T_FMT */ + #if BITS_PER_LONG == 64 || defined(CONFIG_HIGHMEM64G) +@@ -52,16 +51,11 @@ + + /* Linux kernel also does not provide PRIx32... Sigh. */ + #define PRIx32 "x" +-#define PRIx64 "llx" + +- +-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) +-enum { +- false = 0, +- true = 1 +-}; +- +-typedef _Bool bool; +-#endif /* LINUX_VERSION_CODE < 2.6.19 */ ++#ifdef __ia64__ ++# define PRIx64 "lx" ++#else ++# define PRIx64 "llx" ++#endif + + #endif /* __CI_EFHW_COMMON_LINUX_H__ */ +diff -urN linux-2.6.27.19-5.1/drivers/xen/sfc_netback/ci/efhw/efhw_types.h linux-2.6.27.23-0.1.1/drivers/xen/sfc_netback/ci/efhw/efhw_types.h +--- linux-2.6.27.19-5.1/drivers/xen/sfc_netback/ci/efhw/efhw_types.h 2009-06-16 13:54:32.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/xen/sfc_netback/ci/efhw/efhw_types.h 2009-06-16 13:40:39.000000000 +0100 +@@ -45,14 +45,6 @@ + + /*-------------------------------------------------------------------- + * +- * hardware limits used in the types +- * +- *--------------------------------------------------------------------*/ +- +-#define EFHW_KEVENTQ_MAX 8 +- +-/*-------------------------------------------------------------------- +- * + * forward type declarations + * + *--------------------------------------------------------------------*/ +@@ -72,7 +64,7 @@ + + struct eventq_resource_hardware { + /*!iobuffer allocated for eventq - can be larger than eventq */ +- efhw_iopages_t iobuff; ++ struct efhw_iopages iobuff; + unsigned iobuff_off; + struct efhw_buffer_table_allocation buf_tbl_alloc; + int capacity; /*!< capacity of event queue */ +@@ -85,7 +77,7 @@ + *--------------------------------------------------------------------*/ + + struct efhw_keventq { +- volatile int lock; ++ int lock; + caddr_t evq_base; + int32_t evq_ptr; + uint32_t evq_mask; +@@ -94,6 +86,37 @@ + struct efhw_ev_handler *ev_handlers; + }; + ++/*-------------------------------------------------------------------- ++ * ++ * filters ++ * ++ *--------------------------------------------------------------------*/ ++ ++struct efhw_filter_spec { ++ uint dmaq_id; ++ uint32_t saddr_le32; ++ uint32_t daddr_le32; ++ uint16_t sport_le16; ++ uint16_t dport_le16; ++ unsigned tcp : 1; ++ unsigned full : 1; ++ unsigned rss : 1; /* not supported on A1 */ ++ unsigned scatter : 1; /* not supported on A1 */ ++}; ++ ++struct efhw_filter_depth { ++ unsigned needed; ++ unsigned max; ++}; ++ ++struct efhw_filter_search_limits { ++ unsigned tcp_full; ++ unsigned tcp_wild; ++ unsigned udp_full; ++ unsigned udp_wild; ++}; ++ ++ + /********************************************************************** + * Portable HW interface. *************************************** + **********************************************************************/ +@@ -115,7 +138,7 @@ + /*! initialise all hardware functional units */ + int (*init_hardware) (struct efhw_nic *nic, + struct efhw_ev_handler *, +- const uint8_t *mac_addr); ++ const uint8_t *mac_addr, int non_irq_evq); + + /*-------------- Interrupt support ------------ */ + +@@ -130,17 +153,17 @@ + */ + int (*interrupt) (struct efhw_nic *nic); + +- /*! Enable given interrupt mask for the given IRQ unit */ +- void (*interrupt_enable) (struct efhw_nic *nic, uint idx); ++ /*! Enable the interrupt */ ++ void (*interrupt_enable) (struct efhw_nic *nic); + +- /*! Disable given interrupt mask for the given IRQ unit */ +- void (*interrupt_disable) (struct efhw_nic *nic, uint idx); ++ /*! Disable the interrupt */ ++ void (*interrupt_disable) (struct efhw_nic *nic); + + /*! Set interrupt moderation strategy for the given IRQ unit + ** val is in usec + */ +- void (*set_interrupt_moderation)(struct efhw_nic *nic, +- uint idx, uint val); ++ void (*set_interrupt_moderation)(struct efhw_nic *nic, int evq, ++ uint val); + + /*-------------- Event support ------------ */ + +@@ -152,7 +175,8 @@ + void (*event_queue_enable) (struct efhw_nic *nic, + uint evq, /* evnt queue index */ + uint evq_size, /* units of #entries */ +- dma_addr_t q_base_addr, uint buf_base_id); ++ dma_addr_t q_base_addr, uint buf_base_id, ++ int interrupting); + + /*! Disable the given event queue (and any associated timer) */ + void (*event_queue_disable) (struct efhw_nic *nic, uint evq, +@@ -165,7 +189,7 @@ + /*! Push a SW event on a given eventQ */ + void (*sw_event) (struct efhw_nic *nic, int data, int evq); + +- /*-------------- Filter support ------------ */ ++ /*-------------- IP Filter API ------------ */ + + /*! Setup a given filter - The software can request a filter_i, + * but some EtherFabric implementations will override with +@@ -176,13 +200,6 @@ + unsigned saddr_be32, unsigned sport_be16, + unsigned daddr_be32, unsigned dport_be16); + +- /*! Attach a given filter to a DMAQ */ +- void (*ipfilter_attach) (struct efhw_nic *nic, int filter_idx, +- int dmaq_idx); +- +- /*! Detach a filter from its DMAQ */ +- void (*ipfilter_detach) (struct efhw_nic *nic, int filter_idx); +- + /*! Clear down a given filter */ + void (*ipfilter_clear) (struct efhw_nic *nic, int filter_idx); + +@@ -231,6 +248,14 @@ + /*! Commit a buffer table update */ + void (*buffer_table_commit) (struct efhw_nic *nic); + ++ /*-------------- New filter API ------------ */ ++ ++ /*! Set a given filter */ ++ int (*filter_set) (struct efhw_nic *nic, struct efhw_filter_spec *spec, ++ int *filter_idx_out); ++ ++ /*! Clear a given filter */ ++ void (*filter_clear) (struct efhw_nic *nic, int filter_idx); + }; + + +@@ -255,12 +280,10 @@ + + /*! */ + struct efhw_nic { +- /*! zero base index in efrm_nic_table.nic array */ +- volatile int index; ++ /*! zero base index in efrm_nic_tablep->nic array */ ++ int index; + int ifindex; /*!< OS level nic index */ +-#ifdef HAS_NET_NAMESPACE + struct net *nd_net; +-#endif + + struct efhw_device_type devtype; + +@@ -276,14 +299,13 @@ + # define NIC_FLAG_TRY_MSI 0x02 + # define NIC_FLAG_MSI 0x04 + # define NIC_FLAG_OS_IRQ_EN 0x08 +-# define NIC_FLAG_10G 0x10 + + unsigned mtu; /*!< MAC MTU (includes MAC hdr) */ + + /* hardware resources */ + + /*! I/O address of the start of the bar */ +- efhw_ioaddr_t bar_ioaddr; ++ volatile char __iomem *bar_ioaddr; + + /*! Bar number of control aperture. */ + unsigned ctr_ap_bar; +@@ -295,9 +317,6 @@ + /*! EtherFabric Functional Units -- functions */ + const struct efhw_func_ops *efhw_func; + +- /* Value read from FPGA version register. Zero for asic. */ +- unsigned fpga_version; +- + /*! This lock protects a number of misc NIC resources. It should + * only be used for things that can be at the bottom of the lock + * order. ie. You mustn't attempt to grab any other lock while +@@ -312,14 +331,17 @@ + void (*irq_handler) (struct efhw_nic *, int unit); + + /*! event queues per driver */ +- struct efhw_keventq evq[EFHW_KEVENTQ_MAX]; ++ struct efhw_keventq interrupting_evq; + + /* for marking when we are not using an IRQ unit + - 0 is a valid offset to an IRQ unit on EF1! */ + #define EFHW_IRQ_UNIT_UNUSED 0xffff +- /*! interrupt unit in use */ +- unsigned int irq_unit[EFHW_KEVENTQ_MAX]; +- efhw_iopage_t irq_iobuff; /*!< Falcon SYSERR interrupt */ ++ /*! interrupt unit in use for the interrupting event queue */ ++ unsigned int irq_unit; ++ ++ struct efhw_keventq non_interrupting_evq; ++ ++ struct efhw_iopage irq_iobuff; /*!< Falcon SYSERR interrupt */ + + /* The new driverlink infrastructure. */ + struct efx_dl_device *net_driver_dev; +@@ -331,8 +353,26 @@ + unsigned rxq_sizes; + unsigned txq_sizes; + +- /* Size of filter table (including odd and even banks). */ +- unsigned filter_tbl_size; ++ /* Size of filter table. */ ++ unsigned ip_filter_tbl_size; ++ ++ /* Number of filters currently used */ ++ unsigned ip_filter_tbl_used; ++ ++ /* Dynamically allocated filter state. */ ++ uint8_t *filter_in_use; ++ struct efhw_filter_spec *filter_spec_cache; ++ ++ /* Currently required and maximum filter table search depths. */ ++ struct efhw_filter_depth tcp_full_srch; ++ struct efhw_filter_depth tcp_wild_srch; ++ struct efhw_filter_depth udp_full_srch; ++ struct efhw_filter_depth udp_wild_srch; ++ ++ /* Number of event queues, DMA queues and timers. */ ++ unsigned num_evqs; ++ unsigned num_dmaqs; ++ unsigned num_timers; + }; + + +diff -urN linux-2.6.27.19-5.1/drivers/xen/sfc_netback/ci/efhw/hardware_sysdep.h linux-2.6.27.23-0.1.1/drivers/xen/sfc_netback/ci/efhw/hardware_sysdep.h +--- linux-2.6.27.19-5.1/drivers/xen/sfc_netback/ci/efhw/hardware_sysdep.h 2009-06-16 13:54:32.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/xen/sfc_netback/ci/efhw/hardware_sysdep.h 2009-06-16 13:40:39.000000000 +0100 +@@ -40,7 +40,7 @@ + #ifndef __CI_EFHW_HARDWARE_LINUX_H__ + #define __CI_EFHW_HARDWARE_LINUX_H__ + +-#include ++#include + + #ifdef __LITTLE_ENDIAN + #define EFHW_IS_LITTLE_ENDIAN +@@ -50,23 +50,8 @@ + #error Unknown endianness + #endif + +-#ifndef mmiowb +- #if defined(__i386__) || defined(__x86_64__) +- #define mmiowb() +- #elif defined(__ia64__) +- #ifndef ia64_mfa +- #define ia64_mfa() asm volatile ("mf.a" ::: "memory") +- #endif +- #define mmiowb ia64_mfa +- #else +- #error "Need definition for mmiowb()" +- #endif +-#endif +- +-typedef char *efhw_ioaddr_t; +- + #ifndef readq +-static inline uint64_t __readq(void __iomem *addr) ++static inline uint64_t __readq(volatile void __iomem *addr) + { + return *(volatile uint64_t *)addr; + } +@@ -74,7 +59,7 @@ + #endif + + #ifndef writeq +-static inline void __writeq(uint64_t v, void __iomem *addr) ++static inline void __writeq(uint64_t v, volatile void __iomem *addr) + { + *(volatile uint64_t *)addr = v; + } +diff -urN linux-2.6.27.19-5.1/drivers/xen/sfc_netback/ci/efhw/iopage_types.h linux-2.6.27.23-0.1.1/drivers/xen/sfc_netback/ci/efhw/iopage_types.h +--- linux-2.6.27.19-5.1/drivers/xen/sfc_netback/ci/efhw/iopage_types.h 2009-06-16 13:54:32.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/xen/sfc_netback/ci/efhw/iopage_types.h 2009-06-16 13:40:39.000000000 +0100 +@@ -3,7 +3,8 @@ + * resource management for Xen backend, OpenOnload, etc + * (including support for SFE4001 10GBT NIC) + * +- * This file provides efhw_page_t and efhw_iopage_t for Linux kernel. ++ * This file provides struct efhw_page and struct efhw_iopage for Linux ++ * kernel. + * + * Copyright 2005-2007: Solarflare Communications Inc, + * 9501 Jeronimo Road, Suite 250, +@@ -40,75 +41,76 @@ + + #include + #include ++#include + #include + + /*-------------------------------------------------------------------- + * +- * efhw_page_t: A single page of memory. Directly mapped in the driver, +- * and can be mapped to userlevel. ++ * struct efhw_page: A single page of memory. Directly mapped in the ++ * driver, and can be mapped to userlevel. + * + *--------------------------------------------------------------------*/ + +-typedef struct { ++struct efhw_page { + unsigned long kva; +-} efhw_page_t; ++}; + +-static inline int efhw_page_alloc(efhw_page_t *p) ++static inline int efhw_page_alloc(struct efhw_page *p) + { + p->kva = __get_free_page(in_interrupt()? GFP_ATOMIC : GFP_KERNEL); + return p->kva ? 0 : -ENOMEM; + } + +-static inline int efhw_page_alloc_zeroed(efhw_page_t *p) ++static inline int efhw_page_alloc_zeroed(struct efhw_page *p) + { + p->kva = get_zeroed_page(in_interrupt()? GFP_ATOMIC : GFP_KERNEL); + return p->kva ? 0 : -ENOMEM; + } + +-static inline void efhw_page_free(efhw_page_t *p) ++static inline void efhw_page_free(struct efhw_page *p) + { + free_page(p->kva); + EFHW_DO_DEBUG(memset(p, 0, sizeof(*p))); + } + +-static inline char *efhw_page_ptr(efhw_page_t *p) ++static inline char *efhw_page_ptr(struct efhw_page *p) + { + return (char *)p->kva; + } + +-static inline unsigned efhw_page_pfn(efhw_page_t *p) ++static inline unsigned efhw_page_pfn(struct efhw_page *p) + { + return (unsigned)(__pa(p->kva) >> PAGE_SHIFT); + } + +-static inline void efhw_page_mark_invalid(efhw_page_t *p) ++static inline void efhw_page_mark_invalid(struct efhw_page *p) + { + p->kva = 0; + } + +-static inline int efhw_page_is_valid(efhw_page_t *p) ++static inline int efhw_page_is_valid(struct efhw_page *p) + { + return p->kva != 0; + } + +-static inline void efhw_page_init_from_va(efhw_page_t *p, void *va) ++static inline void efhw_page_init_from_va(struct efhw_page *p, void *va) + { + p->kva = (unsigned long)va; + } + + /*-------------------------------------------------------------------- + * +- * efhw_iopage_t: A single page of memory. Directly mapped in the driver, ++ * struct efhw_iopage: A single page of memory. Directly mapped in the driver, + * and can be mapped to userlevel. Can also be accessed by the NIC. + * + *--------------------------------------------------------------------*/ + +-typedef struct { +- efhw_page_t p; ++struct efhw_iopage { ++ struct efhw_page p; + dma_addr_t dma_addr; +-} efhw_iopage_t; ++}; + +-static inline dma_addr_t efhw_iopage_dma_addr(efhw_iopage_t *p) ++static inline dma_addr_t efhw_iopage_dma_addr(struct efhw_iopage *p) + { + return p->dma_addr; + } +@@ -120,9 +122,9 @@ + + /*-------------------------------------------------------------------- + * +- * efhw_iopages_t: A set of pages that are contiguous in physical memory. +- * Directly mapped in the driver, and can be mapped to userlevel. Can also +- * be accessed by the NIC. ++ * struct efhw_iopages: A set of pages that are contiguous in physical ++ * memory. Directly mapped in the driver, and can be mapped to userlevel. ++ * Can also be accessed by the NIC. + * + * NB. The O/S may be unwilling to allocate many, or even any of these. So + * only use this type where the NIC really needs a physically contiguous +@@ -130,44 +132,44 @@ + * + *--------------------------------------------------------------------*/ + +-typedef struct { ++struct efhw_iopages { + caddr_t kva; + unsigned order; + dma_addr_t dma_addr; +-} efhw_iopages_t; ++}; + +-static inline caddr_t efhw_iopages_ptr(efhw_iopages_t *p) ++static inline caddr_t efhw_iopages_ptr(struct efhw_iopages *p) + { + return p->kva; + } + +-static inline unsigned efhw_iopages_pfn(efhw_iopages_t *p) ++static inline unsigned efhw_iopages_pfn(struct efhw_iopages *p) + { + return (unsigned)(__pa(p->kva) >> PAGE_SHIFT); + } + +-static inline dma_addr_t efhw_iopages_dma_addr(efhw_iopages_t *p) ++static inline dma_addr_t efhw_iopages_dma_addr(struct efhw_iopages *p) + { + return p->dma_addr; + } + +-static inline unsigned efhw_iopages_size(efhw_iopages_t *p) ++static inline unsigned efhw_iopages_size(struct efhw_iopages *p) + { + return 1u << (p->order + PAGE_SHIFT); + } + +-/* efhw_iopage_t <-> efhw_iopages_t conversions for handling physically +- * contiguous allocations in iobufsets for iSCSI. This allows the +- * essential information about contiguous allocations from +- * efhw_iopages_alloc() to be saved away in the efhw_iopage_t array in an +- * iobufset. (Changing the iobufset resource to use a union type would ++/* struct efhw_iopage <-> struct efhw_iopages conversions for handling ++ * physically contiguous allocations in iobufsets for iSCSI. This allows ++ * the essential information about contiguous allocations from ++ * efhw_iopages_alloc() to be saved away in the struct efhw_iopage array in ++ * an iobufset. (Changing the iobufset resource to use a union type would + * involve a lot of code changes, and make the iobufset's metadata larger + * which could be bad as it's supposed to fit into a single page on some + * platforms.) + */ + static inline void +-efhw_iopage_init_from_iopages(efhw_iopage_t *iopage, +- efhw_iopages_t *iopages, unsigned pageno) ++efhw_iopage_init_from_iopages(struct efhw_iopage *iopage, ++ struct efhw_iopages *iopages, unsigned pageno) + { + iopage->p.kva = ((unsigned long)efhw_iopages_ptr(iopages)) + + (pageno * PAGE_SIZE); +@@ -176,8 +178,8 @@ + } + + static inline void +-efhw_iopages_init_from_iopage(efhw_iopages_t *iopages, +- efhw_iopage_t *iopage, unsigned order) ++efhw_iopages_init_from_iopage(struct efhw_iopages *iopages, ++ struct efhw_iopage *iopage, unsigned order) + { + iopages->kva = (caddr_t) efhw_iopage_ptr(iopage); + EFHW_ASSERT(iopages->kva); +diff -urN linux-2.6.27.19-5.1/drivers/xen/sfc_netback/ci/efhw/public.h linux-2.6.27.23-0.1.1/drivers/xen/sfc_netback/ci/efhw/public.h +--- linux-2.6.27.19-5.1/drivers/xen/sfc_netback/ci/efhw/public.h 2009-06-16 13:54:32.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/xen/sfc_netback/ci/efhw/public.h 2009-06-16 13:40:39.000000000 +0100 +@@ -70,11 +70,32 @@ + extern void falcon_nic_set_rx_usr_buf_size(struct efhw_nic *, + int rx_usr_buf_size); + ++/*! Get RX filter search limits from RX_FILTER_CTL_REG. ++ * use_raw_values = 0 to get actual depth of search, or 1 to get raw values ++ * from register. ++ */ ++extern void ++falcon_nic_get_rx_filter_search_limits(struct efhw_nic *nic, ++ struct efhw_filter_search_limits *lim, ++ int use_raw_values); ++ ++/*! Set RX filter search limits in RX_FILTER_CTL_REG. ++ * use_raw_values = 0 if specifying actual depth of search, or 1 if specifying ++ * raw values to write to the register. ++ */ ++extern void ++falcon_nic_set_rx_filter_search_limits(struct efhw_nic *nic, ++ struct efhw_filter_search_limits *lim, ++ int use_raw_values); ++ ++ ++/*! Legacy RX IP filter search depth control interface */ + extern void + falcon_nic_rx_filter_ctl_set(struct efhw_nic *nic, uint32_t tcp_full, + uint32_t tcp_wild, + uint32_t udp_full, uint32_t udp_wild); + ++/*! Legacy RX IP filter search depth control interface */ + extern void + falcon_nic_rx_filter_ctl_get(struct efhw_nic *nic, uint32_t *tcp_full, + uint32_t *tcp_wild, +diff -urN linux-2.6.27.19-5.1/drivers/xen/sfc_netback/ci/efhw/sysdep.h linux-2.6.27.23-0.1.1/drivers/xen/sfc_netback/ci/efhw/sysdep.h +--- linux-2.6.27.19-5.1/drivers/xen/sfc_netback/ci/efhw/sysdep.h 2009-06-16 13:54:32.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/xen/sfc_netback/ci/efhw/sysdep.h 2009-06-16 13:40:39.000000000 +0100 +@@ -39,34 +39,17 @@ + #ifndef __CI_EFHW_SYSDEP_LINUX_H__ + #define __CI_EFHW_SYSDEP_LINUX_H__ + +-#include + #include + #include + #include ++#include + #include + + #include /* necessary for etherdevice.h on some kernels */ + #include + +-#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,21) +-static inline int is_local_ether_addr(const u8 *addr) +-{ +- return (0x02 & addr[0]); +-} +-#endif +- + typedef unsigned long irq_flags_t; + + #define spin_lock_destroy(l_) do {} while (0) + +-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24) +-#define HAS_NET_NAMESPACE +-#endif +- +-/* Funny, but linux has round_up for x86 only, defined in +- * x86-specific header */ +-#ifndef round_up +-#define round_up(x, y) (((x) + (y) - 1) & ~((y)-1)) +-#endif +- + #endif /* __CI_EFHW_SYSDEP_LINUX_H__ */ +diff -urN linux-2.6.27.19-5.1/drivers/xen/sfc_netback/ci/efrm/nic_table.h linux-2.6.27.23-0.1.1/drivers/xen/sfc_netback/ci/efrm/nic_table.h +--- linux-2.6.27.19-5.1/drivers/xen/sfc_netback/ci/efrm/nic_table.h 2009-06-16 13:54:32.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/xen/sfc_netback/ci/efrm/nic_table.h 2009-06-16 13:40:39.000000000 +0100 +@@ -76,7 +76,7 @@ + + static inline int efrm_nic_table_held(void) + { +- return (atomic_read(&efrm_nic_tablep->ref_count) != 0); ++ return atomic_read(&efrm_nic_tablep->ref_count) != 0; + } + + /* Run code block _x multiple times with variable nic set to each +diff -urN linux-2.6.27.19-5.1/drivers/xen/sfc_netback/ci/efrm/sysdep.h linux-2.6.27.23-0.1.1/drivers/xen/sfc_netback/ci/efrm/sysdep.h +--- linux-2.6.27.19-5.1/drivers/xen/sfc_netback/ci/efrm/sysdep.h 2009-06-16 13:54:32.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/xen/sfc_netback/ci/efrm/sysdep.h 2009-06-16 13:40:39.000000000 +0100 +@@ -41,14 +41,6 @@ + /* Spinlocks are defined in efhw/sysdep.h */ + #include + +-#if defined(__linux__) && defined(__KERNEL__) +- +-# include +- +-#else +- +-# include +- +-#endif ++#include + + #endif /* __CI_EFRM_SYSDEP_H__ */ +diff -urN linux-2.6.27.19-5.1/drivers/xen/sfc_netback/ci/efrm/sysdep_linux.h linux-2.6.27.23-0.1.1/drivers/xen/sfc_netback/ci/efrm/sysdep_linux.h +--- linux-2.6.27.19-5.1/drivers/xen/sfc_netback/ci/efrm/sysdep_linux.h 2009-06-16 13:54:32.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/xen/sfc_netback/ci/efrm/sysdep_linux.h 2009-06-16 13:40:39.000000000 +0100 +@@ -42,7 +42,6 @@ + #ifndef __CI_EFRM_SYSDEP_LINUX_H__ + #define __CI_EFRM_SYSDEP_LINUX_H__ + +-#include + #include + #include + #include +@@ -55,28 +54,15 @@ + #include + #include + #include +- +-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20) +-/* get roundup_pow_of_two(), which was in kernel.h in early kernel versions */ + #include +-#endif ++#include ++ + + /******************************************************************** + * + * List API + * + ********************************************************************/ +-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18) +-static inline void +-list_replace_init(struct list_head *old, struct list_head *new) +-{ +- new->next = old->next; +- new->next->prev = new; +- new->prev = old->prev; +- new->prev->next = new; +- INIT_LIST_HEAD(old); +-} +-#endif + + static inline struct list_head *list_pop(struct list_head *list) + { +@@ -94,151 +80,10 @@ + + /******************************************************************** + * +- * Workqueue API +- * +- ********************************************************************/ +- +-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) +-#define NEED_OLD_WORK_API +- +-/** +- * The old and new work function prototypes just change +- * the type of the pointer in the only argument, so it's +- * safe to cast one function type to the other +- */ +-typedef void (*efrm_old_work_func_t) (void *p); +- +-#undef INIT_WORK +-#define INIT_WORK(_work, _func) \ +- do { \ +- INIT_LIST_HEAD(&(_work)->entry); \ +- (_work)->pending = 0; \ +- PREPARE_WORK((_work), \ +- (efrm_old_work_func_t) (_func), \ +- (_work)); \ +- } while (0) +- +-#endif +- +-/******************************************************************** +- * + * Kfifo API + * + ********************************************************************/ + +-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10) +- +-#if !defined(RHEL_RELEASE_CODE) || (RHEL_RELEASE_CODE < 1029) +-typedef unsigned gfp_t; +-#endif +- +-#define HAS_NO_KFIFO +- +-struct kfifo { +- unsigned char *buffer; /* the buffer holding the data */ +- unsigned int size; /* the size of the allocated buffer */ +- unsigned int in; /* data is added at offset (in % size) */ +- unsigned int out; /* data is extracted from off. (out % size) */ +- spinlock_t *lock; /* protects concurrent modifications */ +-}; +- +-extern struct kfifo *kfifo_init(unsigned char *buffer, unsigned int size, +- gfp_t gfp_mask, spinlock_t *lock); +-extern struct kfifo *kfifo_alloc(unsigned int size, gfp_t gfp_mask, +- spinlock_t *lock); +-extern void kfifo_free(struct kfifo *fifo); +-extern unsigned int __kfifo_put(struct kfifo *fifo, +- unsigned char *buffer, unsigned int len); +-extern unsigned int __kfifo_get(struct kfifo *fifo, +- unsigned char *buffer, unsigned int len); +- +-/** +- * kfifo_put - puts some data into the FIFO +- * @fifo: the fifo to be used. +- * @buffer: the data to be added. +- * @len: the length of the data to be added. +- * +- * This function copies at most @len bytes from the @buffer into +- * the FIFO depending on the free space, and returns the number of +- * bytes copied. +- */ +-static inline unsigned int +-kfifo_put(struct kfifo *fifo, unsigned char *buffer, unsigned int len) +-{ +- unsigned long flags; +- unsigned int ret; +- +- spin_lock_irqsave(fifo->lock, flags); +- +- ret = __kfifo_put(fifo, buffer, len); +- +- spin_unlock_irqrestore(fifo->lock, flags); +- +- return ret; +-} +- +-/** +- * kfifo_get - gets some data from the FIFO +- * @fifo: the fifo to be used. +- * @buffer: where the data must be copied. +- * @len: the size of the destination buffer. +- * +- * This function copies at most @len bytes from the FIFO into the +- * @buffer and returns the number of copied bytes. +- */ +-static inline unsigned int +-kfifo_get(struct kfifo *fifo, unsigned char *buffer, unsigned int len) +-{ +- unsigned long flags; +- unsigned int ret; +- +- spin_lock_irqsave(fifo->lock, flags); +- +- ret = __kfifo_get(fifo, buffer, len); +- +- /* +- * optimization: if the FIFO is empty, set the indices to 0 +- * so we don't wrap the next time +- */ +- if (fifo->in == fifo->out) +- fifo->in = fifo->out = 0; +- +- spin_unlock_irqrestore(fifo->lock, flags); +- +- return ret; +-} +- +-/** +- * __kfifo_len - returns the number of bytes available in the FIFO, no locking version +- * @fifo: the fifo to be used. +- */ +-static inline unsigned int __kfifo_len(struct kfifo *fifo) +-{ +- return fifo->in - fifo->out; +-} +- +-/** +- * kfifo_len - returns the number of bytes available in the FIFO +- * @fifo: the fifo to be used. +- */ +-static inline unsigned int kfifo_len(struct kfifo *fifo) +-{ +- unsigned long flags; +- unsigned int ret; +- +- spin_lock_irqsave(fifo->lock, flags); +- +- ret = __kfifo_len(fifo); +- +- spin_unlock_irqrestore(fifo->lock, flags); +- +- return ret; +-} +- +-#else +-#include +-#endif +- + static inline void kfifo_vfree(struct kfifo *fifo) + { + vfree(fifo->buffer); +diff -urN linux-2.6.27.19-5.1/drivers/xen/sfc_netfront/accel.h linux-2.6.27.23-0.1.1/drivers/xen/sfc_netfront/accel.h +--- linux-2.6.27.19-5.1/drivers/xen/sfc_netfront/accel.h 2009-06-16 13:54:32.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/xen/sfc_netfront/accel.h 2009-06-16 13:40:39.000000000 +0100 +@@ -262,8 +262,10 @@ + + int poll_enabled; + +- /** A spare slot for a TX packet. This is treated as an extension +- * of the DMA queue. */ ++ /** A spare slot for a TX packet. This is treated as an ++ * extension of the DMA queue. Reads require either ++ * netfront's tx_lock or the vnic tx_lock; writes require both ++ * locks */ + struct sk_buff *tx_skb; + + /** Keep track of fragments of SSR packets */ +diff -urN linux-2.6.27.19-5.1/drivers/xen/sfc_netfront/accel_netfront.c linux-2.6.27.23-0.1.1/drivers/xen/sfc_netfront/accel_netfront.c +--- linux-2.6.27.19-5.1/drivers/xen/sfc_netfront/accel_netfront.c 2009-06-16 13:54:32.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/xen/sfc_netfront/accel_netfront.c 2009-06-16 13:40:39.000000000 +0100 +@@ -65,7 +65,7 @@ + BUG_ON(vnic->net_dev != net_dev); + DPRINTK("%s stopping queue\n", __FUNCTION__); + +- /* Netfront's lock protects tx_skb */ ++ /* Need netfront's tx_lock and vnic tx_lock to write tx_skb */ + spin_lock_irqsave(&np->tx_lock, flags2); + BUG_ON(vnic->tx_skb != NULL); + vnic->tx_skb = skb; +@@ -183,7 +183,7 @@ + + BUG_ON(vnic == NULL); + +- /* This is protected by netfront's lock */ ++ /* Read of tx_skb is protected by netfront's tx_lock */ + return vnic->tx_skb == NULL; + } + +diff -urN linux-2.6.27.19-5.1/drivers/xen/sfc_netfront/accel_vi.c linux-2.6.27.23-0.1.1/drivers/xen/sfc_netfront/accel_vi.c +--- linux-2.6.27.19-5.1/drivers/xen/sfc_netfront/accel_vi.c 2009-06-16 13:54:32.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/xen/sfc_netfront/accel_vi.c 2009-06-16 13:40:39.000000000 +0100 +@@ -983,39 +983,35 @@ + { + struct netfront_info *np = ((struct netfront_info *) + netdev_priv(vnic->net_dev)); +- struct sk_buff *skb; + int handled; + unsigned long flags; +- ++ + /* +- * TODO if we could safely check tx_skb == NULL and return +- * early without taking the lock, that would obviously help +- * performance ++ * We hold the vnic tx_lock which is sufficient to exclude ++ * writes to tx_skb + */ + +- /* Take the netfront lock which protects tx_skb. */ +- spin_lock_irqsave(&np->tx_lock, flags); + if (vnic->tx_skb != NULL) { + DPRINTK("%s trying to send spare buffer\n", __FUNCTION__); + +- skb = vnic->tx_skb; +- vnic->tx_skb = NULL; +- +- spin_unlock_irqrestore(&np->tx_lock, flags); +- +- handled = netfront_accel_vi_tx_post(vnic, skb); ++ handled = netfront_accel_vi_tx_post(vnic, vnic->tx_skb); + +- spin_lock_irqsave(&np->tx_lock, flags); +- + if (handled != NETFRONT_ACCEL_STATUS_BUSY) { + DPRINTK("%s restarting tx\n", __FUNCTION__); ++ ++ /* Need netfront tx_lock and vnic tx_lock to ++ * write tx_skb */ ++ spin_lock_irqsave(&np->tx_lock, flags); ++ ++ vnic->tx_skb = NULL; ++ + if (netfront_check_queue_ready(vnic->net_dev)) { + netif_wake_queue(vnic->net_dev); + NETFRONT_ACCEL_STATS_OP + (vnic->stats.queue_wakes++); + } +- } else { +- vnic->tx_skb = skb; ++ spin_unlock_irqrestore(&np->tx_lock, flags); ++ + } + + /* +@@ -1024,7 +1020,6 @@ + */ + BUG_ON(handled == NETFRONT_ACCEL_STATUS_CANT); + } +- spin_unlock_irqrestore(&np->tx_lock, flags); + } + + +diff -urN linux-2.6.27.19-5.1/drivers/xen/xenbus/xenbus_client.c linux-2.6.27.23-0.1.1/drivers/xen/xenbus/xenbus_client.c +--- linux-2.6.27.19-5.1/drivers/xen/xenbus/xenbus_client.c 2009-06-16 13:54:32.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/xen/xenbus/xenbus_client.c 2009-06-16 13:40:39.000000000 +0100 +@@ -60,6 +60,8 @@ + [ XenbusStateConnected ] = "Connected", + [ XenbusStateClosing ] = "Closing", + [ XenbusStateClosed ] = "Closed", ++ [ XenbusStateReconfiguring ] = "Reconfiguring", ++ [ XenbusStateReconfigured ] = "Reconfigured", + }; + return (state < ARRAY_SIZE(name)) ? name[state] : "INVALID"; + } +@@ -148,7 +150,7 @@ + char *path; + + va_start(ap, pathfmt); +- path = kvasprintf(GFP_KERNEL, pathfmt, ap); ++ path = kvasprintf(GFP_NOIO | __GFP_HIGH, pathfmt, ap); + va_end(ap); + + if (!path) { +diff -urN linux-2.6.27.19-5.1/drivers/xen/xenoprof/xenoprofile.c linux-2.6.27.23-0.1.1/drivers/xen/xenoprof/xenoprofile.c +--- linux-2.6.27.19-5.1/drivers/xen/xenoprof/xenoprofile.c 2009-06-16 13:54:32.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/drivers/xen/xenoprof/xenoprofile.c 2009-06-16 13:40:39.000000000 +0100 +@@ -29,7 +29,6 @@ + #include + #include + #include +-#include "../../../drivers/oprofile/cpu_buffer.h" + #include "../../../drivers/oprofile/event_buffer.h" + + #define MAX_XENOPROF_SAMPLES 16 +@@ -142,8 +141,7 @@ + if (xenoprof_is_escape(buf, tail) && + xenoprof_get_event(buf, tail) == XENOPROF_TRACE_BEGIN) { + tracing=1; +- oprofile_add_pc(ESCAPE_CODE, buf->event_log[tail].mode, +- CPU_TRACE_BEGIN); ++ oprofile_add_mode(buf->event_log[tail].mode); + if (!is_passive) + oprofile_samples++; + else +diff -urN linux-2.6.27.19-5.1/fs/aio.c linux-2.6.27.23-0.1.1/fs/aio.c +--- linux-2.6.27.19-5.1/fs/aio.c 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/aio.c 2009-06-16 13:39:36.000000000 +0100 +@@ -433,7 +433,7 @@ + req->private = NULL; + req->ki_iovec = NULL; + INIT_LIST_HEAD(&req->ki_run_list); +- req->ki_eventfd = ERR_PTR(-EINVAL); ++ req->ki_eventfd = NULL; + + /* Check if the completion queue has enough free space to + * accept an event from this io. +@@ -475,8 +475,6 @@ + { + assert_spin_locked(&ctx->ctx_lock); + +- if (!IS_ERR(req->ki_eventfd)) +- fput(req->ki_eventfd); + if (req->ki_dtor) + req->ki_dtor(req); + if (req->ki_iovec != &req->ki_inline_vec) +@@ -498,8 +496,11 @@ + list_del(&req->ki_list); + spin_unlock_irq(&fput_lock); + +- /* Complete the fput */ +- __fput(req->ki_filp); ++ /* Complete the fput(s) */ ++ if (req->ki_filp != NULL) ++ __fput(req->ki_filp); ++ if (req->ki_eventfd != NULL) ++ __fput(req->ki_eventfd); + + /* Link the iocb into the context's free list */ + spin_lock_irq(&ctx->ctx_lock); +@@ -517,12 +518,14 @@ + */ + static int __aio_put_req(struct kioctx *ctx, struct kiocb *req) + { ++ int schedule_putreq = 0; ++ + dprintk(KERN_DEBUG "aio_put(%p): f_count=%ld\n", + req, atomic_long_read(&req->ki_filp->f_count)); + + assert_spin_locked(&ctx->ctx_lock); + +- req->ki_users --; ++ req->ki_users--; + BUG_ON(req->ki_users < 0); + if (likely(req->ki_users)) + return 0; +@@ -530,10 +533,23 @@ + req->ki_cancel = NULL; + req->ki_retry = NULL; + +- /* Must be done under the lock to serialise against cancellation. +- * Call this aio_fput as it duplicates fput via the fput_work. ++ /* ++ * Try to optimize the aio and eventfd file* puts, by avoiding to ++ * schedule work in case it is not __fput() time. In normal cases, ++ * we would not be holding the last reference to the file*, so ++ * this function will be executed w/out any aio kthread wakeup. + */ +- if (unlikely(atomic_long_dec_and_test(&req->ki_filp->f_count))) { ++ if (unlikely(atomic_long_dec_and_test(&req->ki_filp->f_count))) ++ schedule_putreq++; ++ else ++ req->ki_filp = NULL; ++ if (req->ki_eventfd != NULL) { ++ if (unlikely(atomic_long_dec_and_test(&req->ki_eventfd->f_count))) ++ schedule_putreq++; ++ else ++ req->ki_eventfd = NULL; ++ } ++ if (unlikely(schedule_putreq)) { + get_ioctx(ctx); + spin_lock(&fput_lock); + list_add(&req->ki_list, &fput_head); +@@ -997,7 +1013,7 @@ + * eventfd. The eventfd_signal() function is safe to be called + * from IRQ context. + */ +- if (!IS_ERR(iocb->ki_eventfd)) ++ if (iocb->ki_eventfd != NULL) + eventfd_signal(iocb->ki_eventfd, 1); + + put_rq: +@@ -1701,6 +1717,7 @@ + req->ki_eventfd = eventfd_fget((int) iocb->aio_resfd); + if (IS_ERR(req->ki_eventfd)) { + ret = PTR_ERR(req->ki_eventfd); ++ req->ki_eventfd = NULL; + goto out_put_req; + } + } +diff -urN linux-2.6.27.19-5.1/fs/buffer.c linux-2.6.27.23-0.1.1/fs/buffer.c +--- linux-2.6.27.19-5.1/fs/buffer.c 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/buffer.c 2009-06-16 13:39:37.000000000 +0100 +@@ -3056,7 +3056,7 @@ + if (test_clear_buffer_dirty(bh)) { + get_bh(bh); + bh->b_end_io = end_buffer_write_sync; +- ret = submit_bh(WRITE_SYNC, bh); ++ ret = submit_bh(WRITE, bh); + wait_on_buffer(bh); + if (buffer_eopnotsupp(bh)) { + clear_buffer_eopnotsupp(bh); +diff -urN linux-2.6.27.19-5.1/fs/cifs/CHANGES linux-2.6.27.23-0.1.1/fs/cifs/CHANGES +--- linux-2.6.27.19-5.1/fs/cifs/CHANGES 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/cifs/CHANGES 2009-06-16 13:39:36.000000000 +0100 +@@ -1,3 +1,8 @@ ++Fix oops in cifs_dfs_ref.c when prefixpath is not reachable when using DFS. ++Fix "redzone overwritten" bug in cifs_put_tcon (CIFSTcon may allocate too ++little memory for the "nativeFileSystem" field returned by the server ++during mount). ++ + Version 1.54 + ------------ + Fix premature write failure on congested networks (we would give up +@@ -12,7 +17,7 @@ + on dns_upcall (resolving DFS referralls). Fix plain text password + authentication (requires setting SecurityFlags to 0x30030 to enable + lanman and plain text though). Fix writes to be at correct offset when +-file is open with O_APPEND and file is on a directio (forcediretio) mount. Fix oops in cifs_dfs_ref.c when prefixpath is not reachable when using DFS. ++file is open with O_APPEND and file is on a directio (forcediretio) mount. + + Version 1.53 + ------------ +diff -urN linux-2.6.27.19-5.1/fs/cifs/cifssmb.c linux-2.6.27.23-0.1.1/fs/cifs/cifssmb.c +--- linux-2.6.27.19-5.1/fs/cifs/cifssmb.c 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/cifs/cifssmb.c 2009-06-16 13:39:36.000000000 +0100 +@@ -2348,8 +2348,10 @@ + PATH_MAX, nls_codepage, remap); + name_len++; /* trailing null */ + name_len *= 2; +- pSMB->OldFileName[name_len] = 0; /* pad */ +- pSMB->OldFileName[name_len + 1] = 0x04; ++ ++ /* protocol specifies ASCII buffer format (0x04) for unicode */ ++ pSMB->OldFileName[name_len] = 0x04; ++ pSMB->OldFileName[name_len + 1] = 0x00; /* pad */ + name_len2 = + cifsConvertToUCS((__le16 *)&pSMB->OldFileName[name_len + 2], + toName, PATH_MAX, nls_codepage, remap); +diff -urN linux-2.6.27.19-5.1/fs/cifs/connect.c linux-2.6.27.23-0.1.1/fs/cifs/connect.c +--- linux-2.6.27.19-5.1/fs/cifs/connect.c 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/cifs/connect.c 2009-06-16 13:39:36.000000000 +0100 +@@ -3549,7 +3549,7 @@ + BCC(smb_buffer_response)) { + kfree(tcon->nativeFileSystem); + tcon->nativeFileSystem = +- kzalloc(length + 2, GFP_KERNEL); ++ kzalloc(2*(length + 1), GFP_KERNEL); + if (tcon->nativeFileSystem) + cifs_strfromUCS_le( + tcon->nativeFileSystem, +diff -urN linux-2.6.27.19-5.1/fs/cifs/sess.c linux-2.6.27.23-0.1.1/fs/cifs/sess.c +--- linux-2.6.27.19-5.1/fs/cifs/sess.c 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/cifs/sess.c 2009-06-16 13:39:36.000000000 +0100 +@@ -202,27 +202,26 @@ + int words_left, len; + char *data = *pbcc_area; + +- +- + cFYI(1, ("bleft %d", bleft)); + +- +- /* SMB header is unaligned, so cifs servers word align start of +- Unicode strings */ +- data++; +- bleft--; /* Windows servers do not always double null terminate +- their final Unicode string - in which case we +- now will not attempt to decode the byte of junk +- which follows it */ ++ /* ++ * Windows servers do not always double null terminate their final ++ * Unicode string. Check to see if there are an uneven number of bytes ++ * left. If so, then add an extra NULL pad byte to the end of the ++ * response. ++ * ++ * See section 2.7.2 in "Implementing CIFS" for details ++ */ ++ if (bleft % 2) { ++ data[bleft] = 0; ++ ++bleft; ++ } + + words_left = bleft / 2; + + /* save off server operating system */ + len = UniStrnlen((wchar_t *) data, words_left); + +-/* We look for obvious messed up bcc or strings in response so we do not go off +- the end since (at least) WIN2K and Windows XP have a major bug in not null +- terminating last Unicode string in response */ + if (len >= words_left) + return rc; + +@@ -260,13 +259,10 @@ + return rc; + + kfree(ses->serverDomain); +- ses->serverDomain = kzalloc(2 * (len + 1), GFP_KERNEL); /* BB FIXME wrong length */ +- if (ses->serverDomain != NULL) { ++ ses->serverDomain = kzalloc((4 * len) + 2, GFP_KERNEL); ++ if (ses->serverDomain != NULL) + cifs_strfromUCS_le(ses->serverDomain, (__le16 *)data, len, + nls_cp); +- ses->serverDomain[2*len] = 0; +- ses->serverDomain[(2*len) + 1] = 0; +- } + data += 2 * (len + 1); + words_left -= len + 1; + +@@ -616,12 +612,18 @@ + } + + /* BB check if Unicode and decode strings */ +- if (smb_buf->Flags2 & SMBFLG2_UNICODE) ++ if (smb_buf->Flags2 & SMBFLG2_UNICODE) { ++ /* unicode string area must be word-aligned */ ++ if (((unsigned long) bcc_ptr - (unsigned long) smb_buf) % 2) { ++ ++bcc_ptr; ++ --bytes_remaining; ++ } + rc = decode_unicode_ssetup(&bcc_ptr, bytes_remaining, +- ses, nls_cp); +- else ++ ses, nls_cp); ++ } else { + rc = decode_ascii_ssetup(&bcc_ptr, bytes_remaining, + ses, nls_cp); ++ } + + ssetup_exit: + if (spnego_key) +diff -urN linux-2.6.27.19-5.1/fs/compat.c linux-2.6.27.23-0.1.1/fs/compat.c +--- linux-2.6.27.19-5.1/fs/compat.c 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/compat.c 2009-06-16 13:39:37.000000000 +0100 +@@ -1354,12 +1354,17 @@ + { + struct linux_binprm *bprm; + struct file *file; ++ struct files_struct *displaced; + int retval; + ++ retval = unshare_files(&displaced); ++ if (retval) ++ goto out_ret; ++ + retval = -ENOMEM; + bprm = kzalloc(sizeof(*bprm), GFP_KERNEL); + if (!bprm) +- goto out_ret; ++ goto out_files; + + file = open_exec(filename); + retval = PTR_ERR(file); +@@ -1412,6 +1417,8 @@ + security_bprm_free(bprm); + acct_update_integrals(current); + free_bprm(bprm); ++ if (displaced) ++ put_files_struct(displaced); + return retval; + } + +@@ -1432,6 +1439,9 @@ + out_kfree: + free_bprm(bprm); + ++out_files: ++ if (displaced) ++ reset_files_struct(displaced); + out_ret: + return retval; + } +diff -urN linux-2.6.27.19-5.1/fs/compat_ioctl.c linux-2.6.27.23-0.1.1/fs/compat_ioctl.c +--- linux-2.6.27.19-5.1/fs/compat_ioctl.c 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/compat_ioctl.c 2009-06-16 13:39:37.000000000 +0100 +@@ -1946,6 +1946,8 @@ + /* Big K */ + COMPATIBLE_IOCTL(PIO_FONT) + COMPATIBLE_IOCTL(GIO_FONT) ++COMPATIBLE_IOCTL(PIO_CMAP) ++COMPATIBLE_IOCTL(GIO_CMAP) + ULONG_IOCTL(KDSIGACCEPT) + COMPATIBLE_IOCTL(KDGETKEYCODE) + COMPATIBLE_IOCTL(KDSETKEYCODE) +diff -urN linux-2.6.27.19-5.1/fs/dcache.c linux-2.6.27.23-0.1.1/fs/dcache.c +--- linux-2.6.27.19-5.1/fs/dcache.c 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/dcache.c 2009-06-16 13:39:37.000000000 +0100 +@@ -1921,8 +1921,8 @@ + buffer += buflen; + prepend(&buffer, &buflen, "\0", 1); + +- spin_lock(&vfsmount_lock); + spin_lock(&dcache_lock); ++ spin_lock(&vfsmount_lock); + if (!IS_ROOT(dentry) && d_unhashed(dentry)) { + if (flags & D_PATH_FAIL_DELETED) { + buffer = ERR_PTR(-ENOENT); +@@ -1957,8 +1957,8 @@ + goto Elong; + + out: +- spin_unlock(&dcache_lock); + spin_unlock(&vfsmount_lock); ++ spin_unlock(&dcache_lock); + return buffer; + + global_root: +diff -urN linux-2.6.27.19-5.1/fs/dlm/ast.c linux-2.6.27.23-0.1.1/fs/dlm/ast.c +--- linux-2.6.27.19-5.1/fs/dlm/ast.c 2009-06-16 13:53:04.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/dlm/ast.c 2009-06-16 13:39:31.000000000 +0100 +@@ -2,7 +2,7 @@ + ******************************************************************************* + ** + ** Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved. +-** Copyright (C) 2004-2005 Red Hat, Inc. All rights reserved. ++** Copyright (C) 2004-2008 Red Hat, Inc. All rights reserved. + ** + ** This copyrighted material is made available to anyone wishing to use, + ** modify, copy, or redistribute it subject to the terms and conditions +@@ -33,10 +33,10 @@ + spin_unlock(&ast_queue_lock); + } + +-void dlm_add_ast(struct dlm_lkb *lkb, int type) ++void dlm_add_ast(struct dlm_lkb *lkb, int type, int bastmode) + { + if (lkb->lkb_flags & DLM_IFL_USER) { +- dlm_user_add_ast(lkb, type); ++ dlm_user_add_ast(lkb, type, bastmode); + return; + } + +@@ -46,6 +46,8 @@ + list_add_tail(&lkb->lkb_astqueue, &ast_queue); + } + lkb->lkb_ast_type |= type; ++ if (bastmode) ++ lkb->lkb_bastmode = bastmode; + spin_unlock(&ast_queue_lock); + + set_bit(WAKE_ASTS, &astd_wakeflags); +@@ -59,50 +61,40 @@ + struct dlm_lkb *lkb; + void (*cast) (void *astparam); + void (*bast) (void *astparam, int mode); +- int type = 0, found, bmode; ++ int type = 0, bastmode; + +- for (;;) { +- found = 0; +- spin_lock(&ast_queue_lock); +- list_for_each_entry(lkb, &ast_queue, lkb_astqueue) { +- r = lkb->lkb_resource; +- ls = r->res_ls; +- +- if (dlm_locking_stopped(ls)) +- continue; +- +- list_del(&lkb->lkb_astqueue); +- type = lkb->lkb_ast_type; +- lkb->lkb_ast_type = 0; +- found = 1; +- break; +- } +- spin_unlock(&ast_queue_lock); ++repeat: ++ spin_lock(&ast_queue_lock); ++ list_for_each_entry(lkb, &ast_queue, lkb_astqueue) { ++ r = lkb->lkb_resource; ++ ls = r->res_ls; + +- if (!found) +- break; ++ if (dlm_locking_stopped(ls)) ++ continue; ++ ++ list_del(&lkb->lkb_astqueue); ++ type = lkb->lkb_ast_type; ++ lkb->lkb_ast_type = 0; ++ bastmode = lkb->lkb_bastmode; + ++ spin_unlock(&ast_queue_lock); + cast = lkb->lkb_astfn; + bast = lkb->lkb_bastfn; +- bmode = lkb->lkb_bastmode; + + if ((type & AST_COMP) && cast) + cast(lkb->lkb_astparam); + +- /* FIXME: Is it safe to look at lkb_grmode here +- without doing a lock_rsb() ? +- Look at other checks in v1 to avoid basts. */ +- + if ((type & AST_BAST) && bast) +- if (!dlm_modes_compat(lkb->lkb_grmode, bmode)) +- bast(lkb->lkb_astparam, bmode); ++ bast(lkb->lkb_astparam, bastmode); + + /* this removes the reference added by dlm_add_ast + and may result in the lkb being freed */ + dlm_put_lkb(lkb); + +- schedule(); ++ cond_resched(); ++ goto repeat; + } ++ spin_unlock(&ast_queue_lock); + } + + static inline int no_asts(void) +diff -urN linux-2.6.27.19-5.1/fs/dlm/ast.h linux-2.6.27.23-0.1.1/fs/dlm/ast.h +--- linux-2.6.27.19-5.1/fs/dlm/ast.h 2009-06-16 13:53:04.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/dlm/ast.h 2009-06-16 13:39:31.000000000 +0100 +@@ -1,7 +1,7 @@ + /****************************************************************************** + ******************************************************************************* + ** +-** Copyright (C) 2005 Red Hat, Inc. All rights reserved. ++** Copyright (C) 2005-2008 Red Hat, Inc. All rights reserved. + ** + ** This copyrighted material is made available to anyone wishing to use, + ** modify, copy, or redistribute it subject to the terms and conditions +@@ -13,7 +13,7 @@ + #ifndef __ASTD_DOT_H__ + #define __ASTD_DOT_H__ + +-void dlm_add_ast(struct dlm_lkb *lkb, int type); ++void dlm_add_ast(struct dlm_lkb *lkb, int type, int bastmode); + void dlm_del_ast(struct dlm_lkb *lkb); + + void dlm_astd_wake(void); +diff -urN linux-2.6.27.19-5.1/fs/dlm/config.c linux-2.6.27.23-0.1.1/fs/dlm/config.c +--- linux-2.6.27.19-5.1/fs/dlm/config.c 2009-06-16 13:53:04.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/dlm/config.c 2009-06-16 13:39:31.000000000 +0100 +@@ -14,6 +14,9 @@ + #include + #include + #include ++#include ++#include ++#include + #include + + #include "config.h" +@@ -377,24 +380,24 @@ + .ct_owner = THIS_MODULE, + }; + +-static struct dlm_cluster *to_cluster(struct config_item *i) ++static struct dlm_cluster *config_item_to_cluster(struct config_item *i) + { + return i ? container_of(to_config_group(i), struct dlm_cluster, group) : + NULL; + } + +-static struct dlm_space *to_space(struct config_item *i) ++static struct dlm_space *config_item_to_space(struct config_item *i) + { + return i ? container_of(to_config_group(i), struct dlm_space, group) : + NULL; + } + +-static struct dlm_comm *to_comm(struct config_item *i) ++static struct dlm_comm *config_item_to_comm(struct config_item *i) + { + return i ? container_of(i, struct dlm_comm, item) : NULL; + } + +-static struct dlm_node *to_node(struct config_item *i) ++static struct dlm_node *config_item_to_node(struct config_item *i) + { + return i ? container_of(i, struct dlm_node, item) : NULL; + } +@@ -450,7 +453,7 @@ + + static void drop_cluster(struct config_group *g, struct config_item *i) + { +- struct dlm_cluster *cl = to_cluster(i); ++ struct dlm_cluster *cl = config_item_to_cluster(i); + struct config_item *tmp; + int j; + +@@ -468,7 +471,7 @@ + + static void release_cluster(struct config_item *i) + { +- struct dlm_cluster *cl = to_cluster(i); ++ struct dlm_cluster *cl = config_item_to_cluster(i); + kfree(cl->group.default_groups); + kfree(cl); + } +@@ -507,7 +510,7 @@ + + static void drop_space(struct config_group *g, struct config_item *i) + { +- struct dlm_space *sp = to_space(i); ++ struct dlm_space *sp = config_item_to_space(i); + struct config_item *tmp; + int j; + +@@ -524,7 +527,7 @@ + + static void release_space(struct config_item *i) + { +- struct dlm_space *sp = to_space(i); ++ struct dlm_space *sp = config_item_to_space(i); + kfree(sp->group.default_groups); + kfree(sp); + } +@@ -546,7 +549,7 @@ + + static void drop_comm(struct config_group *g, struct config_item *i) + { +- struct dlm_comm *cm = to_comm(i); ++ struct dlm_comm *cm = config_item_to_comm(i); + if (local_comm == cm) + local_comm = NULL; + dlm_lowcomms_close(cm->nodeid); +@@ -557,13 +560,13 @@ + + static void release_comm(struct config_item *i) + { +- struct dlm_comm *cm = to_comm(i); ++ struct dlm_comm *cm = config_item_to_comm(i); + kfree(cm); + } + + static struct config_item *make_node(struct config_group *g, const char *name) + { +- struct dlm_space *sp = to_space(g->cg_item.ci_parent); ++ struct dlm_space *sp = config_item_to_space(g->cg_item.ci_parent); + struct dlm_node *nd; + + nd = kzalloc(sizeof(struct dlm_node), GFP_KERNEL); +@@ -585,8 +588,8 @@ + + static void drop_node(struct config_group *g, struct config_item *i) + { +- struct dlm_space *sp = to_space(g->cg_item.ci_parent); +- struct dlm_node *nd = to_node(i); ++ struct dlm_space *sp = config_item_to_space(g->cg_item.ci_parent); ++ struct dlm_node *nd = config_item_to_node(i); + + mutex_lock(&sp->members_lock); + list_del(&nd->list); +@@ -598,7 +601,7 @@ + + static void release_node(struct config_item *i) + { +- struct dlm_node *nd = to_node(i); ++ struct dlm_node *nd = config_item_to_node(i); + kfree(nd); + } + +@@ -632,7 +635,7 @@ + static ssize_t show_cluster(struct config_item *i, struct configfs_attribute *a, + char *buf) + { +- struct dlm_cluster *cl = to_cluster(i); ++ struct dlm_cluster *cl = config_item_to_cluster(i); + struct cluster_attribute *cla = + container_of(a, struct cluster_attribute, attr); + return cla->show ? cla->show(cl, buf) : 0; +@@ -642,7 +645,7 @@ + struct configfs_attribute *a, + const char *buf, size_t len) + { +- struct dlm_cluster *cl = to_cluster(i); ++ struct dlm_cluster *cl = config_item_to_cluster(i); + struct cluster_attribute *cla = + container_of(a, struct cluster_attribute, attr); + return cla->store ? cla->store(cl, buf, len) : -EINVAL; +@@ -651,7 +654,7 @@ + static ssize_t show_comm(struct config_item *i, struct configfs_attribute *a, + char *buf) + { +- struct dlm_comm *cm = to_comm(i); ++ struct dlm_comm *cm = config_item_to_comm(i); + struct comm_attribute *cma = + container_of(a, struct comm_attribute, attr); + return cma->show ? cma->show(cm, buf) : 0; +@@ -660,7 +663,7 @@ + static ssize_t store_comm(struct config_item *i, struct configfs_attribute *a, + const char *buf, size_t len) + { +- struct dlm_comm *cm = to_comm(i); ++ struct dlm_comm *cm = config_item_to_comm(i); + struct comm_attribute *cma = + container_of(a, struct comm_attribute, attr); + return cma->store ? cma->store(cm, buf, len) : -EINVAL; +@@ -714,7 +717,7 @@ + static ssize_t show_node(struct config_item *i, struct configfs_attribute *a, + char *buf) + { +- struct dlm_node *nd = to_node(i); ++ struct dlm_node *nd = config_item_to_node(i); + struct node_attribute *nda = + container_of(a, struct node_attribute, attr); + return nda->show ? nda->show(nd, buf) : 0; +@@ -723,7 +726,7 @@ + static ssize_t store_node(struct config_item *i, struct configfs_attribute *a, + const char *buf, size_t len) + { +- struct dlm_node *nd = to_node(i); ++ struct dlm_node *nd = config_item_to_node(i); + struct node_attribute *nda = + container_of(a, struct node_attribute, attr); + return nda->store ? nda->store(nd, buf, len) : -EINVAL; +@@ -768,7 +771,7 @@ + i = config_group_find_item(space_list, name); + mutex_unlock(&space_list->cg_subsys->su_mutex); + +- return to_space(i); ++ return config_item_to_space(i); + } + + static void put_space(struct dlm_space *sp) +@@ -776,6 +779,33 @@ + config_item_put(&sp->group.cg_item); + } + ++static int addr_compare(struct sockaddr_storage *x, struct sockaddr_storage *y) ++{ ++ switch (x->ss_family) { ++ case AF_INET: { ++ struct sockaddr_in *sinx = (struct sockaddr_in *)x; ++ struct sockaddr_in *siny = (struct sockaddr_in *)y; ++ if (sinx->sin_addr.s_addr != siny->sin_addr.s_addr) ++ return 0; ++ if (sinx->sin_port != siny->sin_port) ++ return 0; ++ break; ++ } ++ case AF_INET6: { ++ struct sockaddr_in6 *sinx = (struct sockaddr_in6 *)x; ++ struct sockaddr_in6 *siny = (struct sockaddr_in6 *)y; ++ if (!ipv6_addr_equal(&sinx->sin6_addr, &siny->sin6_addr)) ++ return 0; ++ if (sinx->sin6_port != siny->sin6_port) ++ return 0; ++ break; ++ } ++ default: ++ return 0; ++ } ++ return 1; ++} ++ + static struct dlm_comm *get_comm(int nodeid, struct sockaddr_storage *addr) + { + struct config_item *i; +@@ -788,7 +818,7 @@ + mutex_lock(&clusters_root.subsys.su_mutex); + + list_for_each_entry(i, &comm_list->cg_children, ci_entry) { +- cm = to_comm(i); ++ cm = config_item_to_comm(i); + + if (nodeid) { + if (cm->nodeid != nodeid) +@@ -797,8 +827,7 @@ + config_item_get(i); + break; + } else { +- if (!cm->addr_count || +- memcmp(cm->addr[0], addr, sizeof(*addr))) ++ if (!cm->addr_count || !addr_compare(cm->addr[0], addr)) + continue; + found = 1; + config_item_get(i); +diff -urN linux-2.6.27.19-5.1/fs/dlm/debug_fs.c linux-2.6.27.23-0.1.1/fs/dlm/debug_fs.c +--- linux-2.6.27.19-5.1/fs/dlm/debug_fs.c 2009-06-16 13:53:04.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/dlm/debug_fs.c 2009-06-16 13:39:31.000000000 +0100 +@@ -1,7 +1,7 @@ + /****************************************************************************** + ******************************************************************************* + ** +-** Copyright (C) 2005 Red Hat, Inc. All rights reserved. ++** Copyright (C) 2005-2009 Red Hat, Inc. All rights reserved. + ** + ** This copyrighted material is made available to anyone wishing to use, + ** modify, copy, or redistribute it subject to the terms and conditions +@@ -25,19 +25,6 @@ + + static struct dentry *dlm_root; + +-struct rsb_iter { +- int entry; +- int locks; +- int header; +- struct dlm_ls *ls; +- struct list_head *next; +- struct dlm_rsb *rsb; +-}; +- +-/* +- * dump all rsb's in the lockspace hash table +- */ +- + static char *print_lockmode(int mode) + { + switch (mode) { +@@ -60,13 +47,13 @@ + } + } + +-static void print_resource_lock(struct seq_file *s, struct dlm_lkb *lkb, +- struct dlm_rsb *res) ++static int print_format1_lock(struct seq_file *s, struct dlm_lkb *lkb, ++ struct dlm_rsb *res) + { + seq_printf(s, "%08x %s", lkb->lkb_id, print_lockmode(lkb->lkb_grmode)); + +- if (lkb->lkb_status == DLM_LKSTS_CONVERT +- || lkb->lkb_status == DLM_LKSTS_WAITING) ++ if (lkb->lkb_status == DLM_LKSTS_CONVERT || ++ lkb->lkb_status == DLM_LKSTS_WAITING) + seq_printf(s, " (%s)", print_lockmode(lkb->lkb_rqmode)); + + if (lkb->lkb_nodeid) { +@@ -80,33 +67,42 @@ + if (lkb->lkb_wait_type) + seq_printf(s, " wait_type: %d", lkb->lkb_wait_type); + +- seq_printf(s, "\n"); ++ return seq_printf(s, "\n"); + } + +-static int print_resource(struct dlm_rsb *res, struct seq_file *s) ++static int print_format1(struct dlm_rsb *res, struct seq_file *s) + { + struct dlm_lkb *lkb; + int i, lvblen = res->res_ls->ls_lvblen, recover_list, root_list; ++ int rv; + + lock_rsb(res); + +- seq_printf(s, "\nResource %p Name (len=%d) \"", res, res->res_length); ++ rv = seq_printf(s, "\nResource %p Name (len=%d) \"", ++ res, res->res_length); ++ if (rv) ++ goto out; ++ + for (i = 0; i < res->res_length; i++) { + if (isprint(res->res_name[i])) + seq_printf(s, "%c", res->res_name[i]); + else + seq_printf(s, "%c", '.'); + } ++ + if (res->res_nodeid > 0) +- seq_printf(s, "\" \nLocal Copy, Master is node %d\n", +- res->res_nodeid); ++ rv = seq_printf(s, "\" \nLocal Copy, Master is node %d\n", ++ res->res_nodeid); + else if (res->res_nodeid == 0) +- seq_printf(s, "\" \nMaster Copy\n"); ++ rv = seq_printf(s, "\" \nMaster Copy\n"); + else if (res->res_nodeid == -1) +- seq_printf(s, "\" \nLooking up master (lkid %x)\n", +- res->res_first_lkid); ++ rv = seq_printf(s, "\" \nLooking up master (lkid %x)\n", ++ res->res_first_lkid); + else +- seq_printf(s, "\" \nInvalid master %d\n", res->res_nodeid); ++ rv = seq_printf(s, "\" \nInvalid master %d\n", ++ res->res_nodeid); ++ if (rv) ++ goto out; + + /* Print the LVB: */ + if (res->res_lvbptr) { +@@ -119,329 +115,489 @@ + } + if (rsb_flag(res, RSB_VALNOTVALID)) + seq_printf(s, " (INVALID)"); +- seq_printf(s, "\n"); ++ rv = seq_printf(s, "\n"); ++ if (rv) ++ goto out; + } + + root_list = !list_empty(&res->res_root_list); + recover_list = !list_empty(&res->res_recover_list); + + if (root_list || recover_list) { +- seq_printf(s, "Recovery: root %d recover %d flags %lx " +- "count %d\n", root_list, recover_list, +- res->res_flags, res->res_recover_locks_count); ++ rv = seq_printf(s, "Recovery: root %d recover %d flags %lx " ++ "count %d\n", root_list, recover_list, ++ res->res_flags, res->res_recover_locks_count); ++ if (rv) ++ goto out; + } + + /* Print the locks attached to this resource */ + seq_printf(s, "Granted Queue\n"); +- list_for_each_entry(lkb, &res->res_grantqueue, lkb_statequeue) +- print_resource_lock(s, lkb, res); ++ list_for_each_entry(lkb, &res->res_grantqueue, lkb_statequeue) { ++ rv = print_format1_lock(s, lkb, res); ++ if (rv) ++ goto out; ++ } + + seq_printf(s, "Conversion Queue\n"); +- list_for_each_entry(lkb, &res->res_convertqueue, lkb_statequeue) +- print_resource_lock(s, lkb, res); ++ list_for_each_entry(lkb, &res->res_convertqueue, lkb_statequeue) { ++ rv = print_format1_lock(s, lkb, res); ++ if (rv) ++ goto out; ++ } + + seq_printf(s, "Waiting Queue\n"); +- list_for_each_entry(lkb, &res->res_waitqueue, lkb_statequeue) +- print_resource_lock(s, lkb, res); ++ list_for_each_entry(lkb, &res->res_waitqueue, lkb_statequeue) { ++ rv = print_format1_lock(s, lkb, res); ++ if (rv) ++ goto out; ++ } + + if (list_empty(&res->res_lookup)) + goto out; + + seq_printf(s, "Lookup Queue\n"); + list_for_each_entry(lkb, &res->res_lookup, lkb_rsb_lookup) { +- seq_printf(s, "%08x %s", lkb->lkb_id, +- print_lockmode(lkb->lkb_rqmode)); ++ rv = seq_printf(s, "%08x %s", lkb->lkb_id, ++ print_lockmode(lkb->lkb_rqmode)); + if (lkb->lkb_wait_type) + seq_printf(s, " wait_type: %d", lkb->lkb_wait_type); +- seq_printf(s, "\n"); ++ rv = seq_printf(s, "\n"); + } + out: + unlock_rsb(res); +- return 0; ++ return rv; + } + +-static void print_lock(struct seq_file *s, struct dlm_lkb *lkb, struct dlm_rsb *r) ++static int print_format2_lock(struct seq_file *s, struct dlm_lkb *lkb, ++ struct dlm_rsb *r) + { +- unsigned int waiting = 0; +- uint64_t xid = 0; ++ u64 xid = 0; ++ u64 us; ++ int rv; + + if (lkb->lkb_flags & DLM_IFL_USER) { + if (lkb->lkb_ua) + xid = lkb->lkb_ua->xid; + } + +- if (lkb->lkb_timestamp) +- waiting = jiffies_to_msecs(jiffies - lkb->lkb_timestamp); ++ /* microseconds since lkb was added to current queue */ ++ us = ktime_to_us(ktime_sub(ktime_get(), lkb->lkb_timestamp)); + +- /* id nodeid remid pid xid exflags flags sts grmode rqmode time_ms ++ /* id nodeid remid pid xid exflags flags sts grmode rqmode time_us + r_nodeid r_len r_name */ + +- seq_printf(s, "%x %d %x %u %llu %x %x %d %d %d %u %u %d \"%s\"\n", +- lkb->lkb_id, +- lkb->lkb_nodeid, +- lkb->lkb_remid, +- lkb->lkb_ownpid, +- (unsigned long long)xid, +- lkb->lkb_exflags, +- lkb->lkb_flags, +- lkb->lkb_status, +- lkb->lkb_grmode, +- lkb->lkb_rqmode, +- waiting, +- r->res_nodeid, +- r->res_length, +- r->res_name); ++ rv = seq_printf(s, "%x %d %x %u %llu %x %x %d %d %d %llu %u %d \"%s\"\n", ++ lkb->lkb_id, ++ lkb->lkb_nodeid, ++ lkb->lkb_remid, ++ lkb->lkb_ownpid, ++ (unsigned long long)xid, ++ lkb->lkb_exflags, ++ lkb->lkb_flags, ++ lkb->lkb_status, ++ lkb->lkb_grmode, ++ lkb->lkb_rqmode, ++ (unsigned long long)us, ++ r->res_nodeid, ++ r->res_length, ++ r->res_name); ++ return rv; + } + +-static int print_locks(struct dlm_rsb *r, struct seq_file *s) ++static int print_format2(struct dlm_rsb *r, struct seq_file *s) + { + struct dlm_lkb *lkb; ++ int rv = 0; + + lock_rsb(r); + +- list_for_each_entry(lkb, &r->res_grantqueue, lkb_statequeue) +- print_lock(s, lkb, r); +- +- list_for_each_entry(lkb, &r->res_convertqueue, lkb_statequeue) +- print_lock(s, lkb, r); +- +- list_for_each_entry(lkb, &r->res_waitqueue, lkb_statequeue) +- print_lock(s, lkb, r); +- ++ list_for_each_entry(lkb, &r->res_grantqueue, lkb_statequeue) { ++ rv = print_format2_lock(s, lkb, r); ++ if (rv) ++ goto out; ++ } ++ ++ list_for_each_entry(lkb, &r->res_convertqueue, lkb_statequeue) { ++ rv = print_format2_lock(s, lkb, r); ++ if (rv) ++ goto out; ++ } ++ ++ list_for_each_entry(lkb, &r->res_waitqueue, lkb_statequeue) { ++ rv = print_format2_lock(s, lkb, r); ++ if (rv) ++ goto out; ++ } ++ out: + unlock_rsb(r); +- return 0; ++ return rv; + } + +-static int rsb_iter_next(struct rsb_iter *ri) ++static int print_format3_lock(struct seq_file *s, struct dlm_lkb *lkb, ++ int rsb_lookup) + { +- struct dlm_ls *ls = ri->ls; +- int i; ++ u64 xid = 0; ++ int rv; + +- if (!ri->next) { +- top: +- /* Find the next non-empty hash bucket */ +- for (i = ri->entry; i < ls->ls_rsbtbl_size; i++) { +- read_lock(&ls->ls_rsbtbl[i].lock); +- if (!list_empty(&ls->ls_rsbtbl[i].list)) { +- ri->next = ls->ls_rsbtbl[i].list.next; +- ri->rsb = list_entry(ri->next, struct dlm_rsb, +- res_hashchain); +- dlm_hold_rsb(ri->rsb); +- read_unlock(&ls->ls_rsbtbl[i].lock); +- break; +- } +- read_unlock(&ls->ls_rsbtbl[i].lock); +- } +- ri->entry = i; +- +- if (ri->entry >= ls->ls_rsbtbl_size) +- return 1; +- } else { +- struct dlm_rsb *old = ri->rsb; +- i = ri->entry; +- read_lock(&ls->ls_rsbtbl[i].lock); +- ri->next = ri->next->next; +- if (ri->next->next == ls->ls_rsbtbl[i].list.next) { +- /* End of list - move to next bucket */ +- ri->next = NULL; +- ri->entry++; +- read_unlock(&ls->ls_rsbtbl[i].lock); +- dlm_put_rsb(old); +- goto top; +- } +- ri->rsb = list_entry(ri->next, struct dlm_rsb, res_hashchain); +- dlm_hold_rsb(ri->rsb); +- read_unlock(&ls->ls_rsbtbl[i].lock); +- dlm_put_rsb(old); ++ if (lkb->lkb_flags & DLM_IFL_USER) { ++ if (lkb->lkb_ua) ++ xid = lkb->lkb_ua->xid; + } + +- return 0; +-} +- +-static void rsb_iter_free(struct rsb_iter *ri) +-{ +- kfree(ri); ++ rv = seq_printf(s, "lkb %x %d %x %u %llu %x %x %d %d %d %d %d %d %u %llu %llu\n", ++ lkb->lkb_id, ++ lkb->lkb_nodeid, ++ lkb->lkb_remid, ++ lkb->lkb_ownpid, ++ (unsigned long long)xid, ++ lkb->lkb_exflags, ++ lkb->lkb_flags, ++ lkb->lkb_status, ++ lkb->lkb_grmode, ++ lkb->lkb_rqmode, ++ lkb->lkb_highbast, ++ rsb_lookup, ++ lkb->lkb_wait_type, ++ lkb->lkb_lvbseq, ++ (unsigned long long)ktime_to_ns(lkb->lkb_timestamp), ++ (unsigned long long)ktime_to_ns(lkb->lkb_time_bast)); ++ return rv; + } + +-static struct rsb_iter *rsb_iter_init(struct dlm_ls *ls) ++static int print_format3(struct dlm_rsb *r, struct seq_file *s) + { +- struct rsb_iter *ri; ++ struct dlm_lkb *lkb; ++ int i, lvblen = r->res_ls->ls_lvblen; ++ int print_name = 1; ++ int rv; + +- ri = kzalloc(sizeof *ri, GFP_KERNEL); +- if (!ri) +- return NULL; ++ lock_rsb(r); + +- ri->ls = ls; +- ri->entry = 0; +- ri->next = NULL; ++ rv = seq_printf(s, "rsb %p %d %x %lx %d %d %u %d ", ++ r, ++ r->res_nodeid, ++ r->res_first_lkid, ++ r->res_flags, ++ !list_empty(&r->res_root_list), ++ !list_empty(&r->res_recover_list), ++ r->res_recover_locks_count, ++ r->res_length); ++ if (rv) ++ goto out; + +- if (rsb_iter_next(ri)) { +- rsb_iter_free(ri); +- return NULL; ++ for (i = 0; i < r->res_length; i++) { ++ if (!isascii(r->res_name[i]) || !isprint(r->res_name[i])) ++ print_name = 0; + } + +- return ri; +-} +- +-static void *rsb_seq_start(struct seq_file *file, loff_t *pos) +-{ +- struct rsb_iter *ri; +- loff_t n = *pos; +- +- ri = rsb_iter_init(file->private); +- if (!ri) +- return NULL; ++ seq_printf(s, "%s", print_name ? "str " : "hex"); + +- while (n--) { +- if (rsb_iter_next(ri)) { +- rsb_iter_free(ri); +- return NULL; +- } ++ for (i = 0; i < r->res_length; i++) { ++ if (print_name) ++ seq_printf(s, "%c", r->res_name[i]); ++ else ++ seq_printf(s, " %02x", (unsigned char)r->res_name[i]); + } ++ rv = seq_printf(s, "\n"); ++ if (rv) ++ goto out; + +- return ri; +-} ++ if (!r->res_lvbptr) ++ goto do_locks; + +-static void *rsb_seq_next(struct seq_file *file, void *iter_ptr, loff_t *pos) +-{ +- struct rsb_iter *ri = iter_ptr; ++ seq_printf(s, "lvb %u %d", r->res_lvbseq, lvblen); + +- (*pos)++; ++ for (i = 0; i < lvblen; i++) ++ seq_printf(s, " %02x", (unsigned char)r->res_lvbptr[i]); ++ rv = seq_printf(s, "\n"); ++ if (rv) ++ goto out; + +- if (rsb_iter_next(ri)) { +- rsb_iter_free(ri); +- return NULL; ++ do_locks: ++ list_for_each_entry(lkb, &r->res_grantqueue, lkb_statequeue) { ++ rv = print_format3_lock(s, lkb, 0); ++ if (rv) ++ goto out; + } + +- return ri; +-} ++ list_for_each_entry(lkb, &r->res_convertqueue, lkb_statequeue) { ++ rv = print_format3_lock(s, lkb, 0); ++ if (rv) ++ goto out; ++ } + +-static void rsb_seq_stop(struct seq_file *file, void *iter_ptr) +-{ +- /* nothing for now */ ++ list_for_each_entry(lkb, &r->res_waitqueue, lkb_statequeue) { ++ rv = print_format3_lock(s, lkb, 0); ++ if (rv) ++ goto out; ++ } ++ ++ list_for_each_entry(lkb, &r->res_lookup, lkb_rsb_lookup) { ++ rv = print_format3_lock(s, lkb, 1); ++ if (rv) ++ goto out; ++ } ++ out: ++ unlock_rsb(r); ++ return rv; + } + +-static int rsb_seq_show(struct seq_file *file, void *iter_ptr) +-{ +- struct rsb_iter *ri = iter_ptr; ++struct rsbtbl_iter { ++ struct dlm_rsb *rsb; ++ unsigned bucket; ++ int format; ++ int header; ++}; + +- if (ri->locks) { ++/* seq_printf returns -1 if the buffer is full, and 0 otherwise. ++ If the buffer is full, seq_printf can be called again, but it ++ does nothing and just returns -1. So, the these printing routines ++ periodically check the return value to avoid wasting too much time ++ trying to print to a full buffer. */ ++ ++static int table_seq_show(struct seq_file *seq, void *iter_ptr) ++{ ++ struct rsbtbl_iter *ri = iter_ptr; ++ int rv = 0; ++ ++ switch (ri->format) { ++ case 1: ++ rv = print_format1(ri->rsb, seq); ++ break; ++ case 2: ++ if (ri->header) { ++ seq_printf(seq, "id nodeid remid pid xid exflags " ++ "flags sts grmode rqmode time_ms " ++ "r_nodeid r_len r_name\n"); ++ ri->header = 0; ++ } ++ rv = print_format2(ri->rsb, seq); ++ break; ++ case 3: + if (ri->header) { +- seq_printf(file, "id nodeid remid pid xid exflags flags " +- "sts grmode rqmode time_ms r_nodeid " +- "r_len r_name\n"); ++ seq_printf(seq, "version rsb 1.1 lvb 1.1 lkb 1.1\n"); + ri->header = 0; + } +- print_locks(ri->rsb, file); +- } else { +- print_resource(ri->rsb, file); ++ rv = print_format3(ri->rsb, seq); ++ break; + } + +- return 0; +-} +- +-static struct seq_operations rsb_seq_ops = { +- .start = rsb_seq_start, +- .next = rsb_seq_next, +- .stop = rsb_seq_stop, +- .show = rsb_seq_show, +-}; +- +-static int rsb_open(struct inode *inode, struct file *file) +-{ +- struct seq_file *seq; +- int ret; +- +- ret = seq_open(file, &rsb_seq_ops); +- if (ret) +- return ret; +- +- seq = file->private_data; +- seq->private = inode->i_private; +- +- return 0; ++ return rv; + } + +-static const struct file_operations rsb_fops = { +- .owner = THIS_MODULE, +- .open = rsb_open, +- .read = seq_read, +- .llseek = seq_lseek, +- .release = seq_release +-}; ++static struct seq_operations format1_seq_ops; ++static struct seq_operations format2_seq_ops; ++static struct seq_operations format3_seq_ops; ++ ++static void *table_seq_start(struct seq_file *seq, loff_t *pos) ++{ ++ struct dlm_ls *ls = seq->private; ++ struct rsbtbl_iter *ri; ++ struct dlm_rsb *r; ++ loff_t n = *pos; ++ unsigned bucket, entry; + +-/* +- * Dump state in compact per-lock listing +- */ ++ bucket = n >> 32; ++ entry = n & ((1LL << 32) - 1); + +-static struct rsb_iter *locks_iter_init(struct dlm_ls *ls, loff_t *pos) +-{ +- struct rsb_iter *ri; ++ if (bucket >= ls->ls_rsbtbl_size) ++ return NULL; + +- ri = kzalloc(sizeof *ri, GFP_KERNEL); ++ ri = kzalloc(sizeof(struct rsbtbl_iter), GFP_KERNEL); + if (!ri) + return NULL; ++ if (n == 0) ++ ri->header = 1; ++ if (seq->op == &format1_seq_ops) ++ ri->format = 1; ++ if (seq->op == &format2_seq_ops) ++ ri->format = 2; ++ if (seq->op == &format3_seq_ops) ++ ri->format = 3; ++ ++ spin_lock(&ls->ls_rsbtbl[bucket].lock); ++ if (!list_empty(&ls->ls_rsbtbl[bucket].list)) { ++ list_for_each_entry(r, &ls->ls_rsbtbl[bucket].list, ++ res_hashchain) { ++ if (!entry--) { ++ dlm_hold_rsb(r); ++ ri->rsb = r; ++ ri->bucket = bucket; ++ spin_unlock(&ls->ls_rsbtbl[bucket].lock); ++ return ri; ++ } ++ } ++ } ++ spin_unlock(&ls->ls_rsbtbl[bucket].lock); + +- ri->ls = ls; +- ri->entry = 0; +- ri->next = NULL; +- ri->locks = 1; ++ /* ++ * move to the first rsb in the next non-empty bucket ++ */ + +- if (*pos == 0) +- ri->header = 1; ++ /* zero the entry */ ++ n &= ~((1LL << 32) - 1); + +- if (rsb_iter_next(ri)) { +- rsb_iter_free(ri); +- return NULL; +- } ++ while (1) { ++ bucket++; ++ n += 1LL << 32; ++ ++ if (bucket >= ls->ls_rsbtbl_size) { ++ kfree(ri); ++ return NULL; ++ } + +- return ri; ++ spin_lock(&ls->ls_rsbtbl[bucket].lock); ++ if (!list_empty(&ls->ls_rsbtbl[bucket].list)) { ++ r = list_first_entry(&ls->ls_rsbtbl[bucket].list, ++ struct dlm_rsb, res_hashchain); ++ dlm_hold_rsb(r); ++ ri->rsb = r; ++ ri->bucket = bucket; ++ spin_unlock(&ls->ls_rsbtbl[bucket].lock); ++ *pos = n; ++ return ri; ++ } ++ spin_unlock(&ls->ls_rsbtbl[bucket].lock); ++ } + } + +-static void *locks_seq_start(struct seq_file *file, loff_t *pos) ++static void *table_seq_next(struct seq_file *seq, void *iter_ptr, loff_t *pos) + { +- struct rsb_iter *ri; ++ struct dlm_ls *ls = seq->private; ++ struct rsbtbl_iter *ri = iter_ptr; ++ struct list_head *next; ++ struct dlm_rsb *r, *rp; + loff_t n = *pos; ++ unsigned bucket; + +- ri = locks_iter_init(file->private, pos); +- if (!ri) +- return NULL; ++ bucket = n >> 32; + +- while (n--) { +- if (rsb_iter_next(ri)) { +- rsb_iter_free(ri); ++ /* ++ * move to the next rsb in the same bucket ++ */ ++ ++ spin_lock(&ls->ls_rsbtbl[bucket].lock); ++ rp = ri->rsb; ++ next = rp->res_hashchain.next; ++ ++ if (next != &ls->ls_rsbtbl[bucket].list) { ++ r = list_entry(next, struct dlm_rsb, res_hashchain); ++ dlm_hold_rsb(r); ++ ri->rsb = r; ++ spin_unlock(&ls->ls_rsbtbl[bucket].lock); ++ dlm_put_rsb(rp); ++ ++*pos; ++ return ri; ++ } ++ spin_unlock(&ls->ls_rsbtbl[bucket].lock); ++ dlm_put_rsb(rp); ++ ++ /* ++ * move to the first rsb in the next non-empty bucket ++ */ ++ ++ /* zero the entry */ ++ n &= ~((1LL << 32) - 1); ++ ++ while (1) { ++ bucket++; ++ n += 1LL << 32; ++ ++ if (bucket >= ls->ls_rsbtbl_size) { ++ kfree(ri); + return NULL; + } ++ ++ spin_lock(&ls->ls_rsbtbl[bucket].lock); ++ if (!list_empty(&ls->ls_rsbtbl[bucket].list)) { ++ r = list_first_entry(&ls->ls_rsbtbl[bucket].list, ++ struct dlm_rsb, res_hashchain); ++ dlm_hold_rsb(r); ++ ri->rsb = r; ++ ri->bucket = bucket; ++ spin_unlock(&ls->ls_rsbtbl[bucket].lock); ++ *pos = n; ++ return ri; ++ } ++ spin_unlock(&ls->ls_rsbtbl[bucket].lock); + } ++} ++ ++static void table_seq_stop(struct seq_file *seq, void *iter_ptr) ++{ ++ struct rsbtbl_iter *ri = iter_ptr; + +- return ri; ++ if (ri) { ++ dlm_put_rsb(ri->rsb); ++ kfree(ri); ++ } + } + +-static struct seq_operations locks_seq_ops = { +- .start = locks_seq_start, +- .next = rsb_seq_next, +- .stop = rsb_seq_stop, +- .show = rsb_seq_show, ++static struct seq_operations format1_seq_ops = { ++ .start = table_seq_start, ++ .next = table_seq_next, ++ .stop = table_seq_stop, ++ .show = table_seq_show, ++}; ++ ++static struct seq_operations format2_seq_ops = { ++ .start = table_seq_start, ++ .next = table_seq_next, ++ .stop = table_seq_stop, ++ .show = table_seq_show, + }; + +-static int locks_open(struct inode *inode, struct file *file) ++static struct seq_operations format3_seq_ops = { ++ .start = table_seq_start, ++ .next = table_seq_next, ++ .stop = table_seq_stop, ++ .show = table_seq_show, ++}; ++ ++static const struct file_operations format1_fops; ++static const struct file_operations format2_fops; ++static const struct file_operations format3_fops; ++ ++static int table_open(struct inode *inode, struct file *file) + { + struct seq_file *seq; +- int ret; ++ int ret = -1; ++ ++ if (file->f_op == &format1_fops) ++ ret = seq_open(file, &format1_seq_ops); ++ else if (file->f_op == &format2_fops) ++ ret = seq_open(file, &format2_seq_ops); ++ else if (file->f_op == &format3_fops) ++ ret = seq_open(file, &format3_seq_ops); + +- ret = seq_open(file, &locks_seq_ops); + if (ret) + return ret; + + seq = file->private_data; +- seq->private = inode->i_private; +- ++ seq->private = inode->i_private; /* the dlm_ls */ + return 0; + } + +-static const struct file_operations locks_fops = { ++static const struct file_operations format1_fops = { + .owner = THIS_MODULE, +- .open = locks_open, ++ .open = table_open, ++ .read = seq_read, ++ .llseek = seq_lseek, ++ .release = seq_release ++}; ++ ++static const struct file_operations format2_fops = { ++ .owner = THIS_MODULE, ++ .open = table_open, ++ .read = seq_read, ++ .llseek = seq_lseek, ++ .release = seq_release ++}; ++ ++static const struct file_operations format3_fops = { ++ .owner = THIS_MODULE, ++ .open = table_open, + .read = seq_read, + .llseek = seq_lseek, + .release = seq_release +@@ -489,30 +645,33 @@ + .read = waiters_read + }; + ++void dlm_delete_debug_file(struct dlm_ls *ls) ++{ ++ if (ls->ls_debug_rsb_dentry) ++ debugfs_remove(ls->ls_debug_rsb_dentry); ++ if (ls->ls_debug_waiters_dentry) ++ debugfs_remove(ls->ls_debug_waiters_dentry); ++ if (ls->ls_debug_locks_dentry) ++ debugfs_remove(ls->ls_debug_locks_dentry); ++ if (ls->ls_debug_all_dentry) ++ debugfs_remove(ls->ls_debug_all_dentry); ++} ++ + int dlm_create_debug_file(struct dlm_ls *ls) + { + char name[DLM_LOCKSPACE_LEN+8]; + ++ /* format 1 */ ++ + ls->ls_debug_rsb_dentry = debugfs_create_file(ls->ls_name, + S_IFREG | S_IRUGO, + dlm_root, + ls, +- &rsb_fops); ++ &format1_fops); + if (!ls->ls_debug_rsb_dentry) +- return -ENOMEM; ++ goto fail; + +- memset(name, 0, sizeof(name)); +- snprintf(name, DLM_LOCKSPACE_LEN+8, "%s_waiters", ls->ls_name); +- +- ls->ls_debug_waiters_dentry = debugfs_create_file(name, +- S_IFREG | S_IRUGO, +- dlm_root, +- ls, +- &waiters_fops); +- if (!ls->ls_debug_waiters_dentry) { +- debugfs_remove(ls->ls_debug_rsb_dentry); +- return -ENOMEM; +- } ++ /* format 2 */ + + memset(name, 0, sizeof(name)); + snprintf(name, DLM_LOCKSPACE_LEN+8, "%s_locks", ls->ls_name); +@@ -521,24 +680,39 @@ + S_IFREG | S_IRUGO, + dlm_root, + ls, +- &locks_fops); +- if (!ls->ls_debug_locks_dentry) { +- debugfs_remove(ls->ls_debug_waiters_dentry); +- debugfs_remove(ls->ls_debug_rsb_dentry); +- return -ENOMEM; +- } ++ &format2_fops); ++ if (!ls->ls_debug_locks_dentry) ++ goto fail; ++ ++ /* format 3 */ ++ ++ memset(name, 0, sizeof(name)); ++ snprintf(name, DLM_LOCKSPACE_LEN+8, "%s_all", ls->ls_name); ++ ++ ls->ls_debug_all_dentry = debugfs_create_file(name, ++ S_IFREG | S_IRUGO, ++ dlm_root, ++ ls, ++ &format3_fops); ++ if (!ls->ls_debug_all_dentry) ++ goto fail; ++ ++ memset(name, 0, sizeof(name)); ++ snprintf(name, DLM_LOCKSPACE_LEN+8, "%s_waiters", ls->ls_name); ++ ++ ls->ls_debug_waiters_dentry = debugfs_create_file(name, ++ S_IFREG | S_IRUGO, ++ dlm_root, ++ ls, ++ &waiters_fops); ++ if (!ls->ls_debug_waiters_dentry) ++ goto fail; + + return 0; +-} + +-void dlm_delete_debug_file(struct dlm_ls *ls) +-{ +- if (ls->ls_debug_rsb_dentry) +- debugfs_remove(ls->ls_debug_rsb_dentry); +- if (ls->ls_debug_waiters_dentry) +- debugfs_remove(ls->ls_debug_waiters_dentry); +- if (ls->ls_debug_locks_dentry) +- debugfs_remove(ls->ls_debug_locks_dentry); ++ fail: ++ dlm_delete_debug_file(ls); ++ return -ENOMEM; + } + + int __init dlm_register_debugfs(void) +diff -urN linux-2.6.27.19-5.1/fs/dlm/dir.c linux-2.6.27.23-0.1.1/fs/dlm/dir.c +--- linux-2.6.27.19-5.1/fs/dlm/dir.c 2009-06-16 13:53:04.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/dlm/dir.c 2009-06-16 13:39:31.000000000 +0100 +@@ -156,7 +156,7 @@ + + bucket = dir_hash(ls, name, namelen); + +- write_lock(&ls->ls_dirtbl[bucket].lock); ++ spin_lock(&ls->ls_dirtbl[bucket].lock); + + de = search_bucket(ls, name, namelen, bucket); + +@@ -173,7 +173,7 @@ + list_del(&de->list); + kfree(de); + out: +- write_unlock(&ls->ls_dirtbl[bucket].lock); ++ spin_unlock(&ls->ls_dirtbl[bucket].lock); + } + + void dlm_dir_clear(struct dlm_ls *ls) +@@ -185,14 +185,14 @@ + DLM_ASSERT(list_empty(&ls->ls_recover_list), ); + + for (i = 0; i < ls->ls_dirtbl_size; i++) { +- write_lock(&ls->ls_dirtbl[i].lock); ++ spin_lock(&ls->ls_dirtbl[i].lock); + head = &ls->ls_dirtbl[i].list; + while (!list_empty(head)) { + de = list_entry(head->next, struct dlm_direntry, list); + list_del(&de->list); + put_free_de(ls, de); + } +- write_unlock(&ls->ls_dirtbl[i].lock); ++ spin_unlock(&ls->ls_dirtbl[i].lock); + } + } + +@@ -307,17 +307,17 @@ + + bucket = dir_hash(ls, name, namelen); + +- write_lock(&ls->ls_dirtbl[bucket].lock); ++ spin_lock(&ls->ls_dirtbl[bucket].lock); + de = search_bucket(ls, name, namelen, bucket); + if (de) { + *r_nodeid = de->master_nodeid; +- write_unlock(&ls->ls_dirtbl[bucket].lock); ++ spin_unlock(&ls->ls_dirtbl[bucket].lock); + if (*r_nodeid == nodeid) + return -EEXIST; + return 0; + } + +- write_unlock(&ls->ls_dirtbl[bucket].lock); ++ spin_unlock(&ls->ls_dirtbl[bucket].lock); + + if (namelen > DLM_RESNAME_MAXLEN) + return -EINVAL; +@@ -330,7 +330,7 @@ + de->length = namelen; + memcpy(de->name, name, namelen); + +- write_lock(&ls->ls_dirtbl[bucket].lock); ++ spin_lock(&ls->ls_dirtbl[bucket].lock); + tmp = search_bucket(ls, name, namelen, bucket); + if (tmp) { + kfree(de); +@@ -339,7 +339,7 @@ + list_add_tail(&de->list, &ls->ls_dirtbl[bucket].list); + } + *r_nodeid = de->master_nodeid; +- write_unlock(&ls->ls_dirtbl[bucket].lock); ++ spin_unlock(&ls->ls_dirtbl[bucket].lock); + return 0; + } + +@@ -374,7 +374,7 @@ + struct list_head *list; + struct dlm_rsb *r; + int offset = 0, dir_nodeid; +- uint16_t be_namelen; ++ __be16 be_namelen; + + down_read(&ls->ls_root_sem); + +@@ -410,15 +410,15 @@ + + if (offset + sizeof(uint16_t)*2 + r->res_length > outlen) { + /* Write end-of-block record */ +- be_namelen = 0; +- memcpy(outbuf + offset, &be_namelen, sizeof(uint16_t)); +- offset += sizeof(uint16_t); ++ be_namelen = cpu_to_be16(0); ++ memcpy(outbuf + offset, &be_namelen, sizeof(__be16)); ++ offset += sizeof(__be16); + goto out; + } + + be_namelen = cpu_to_be16(r->res_length); +- memcpy(outbuf + offset, &be_namelen, sizeof(uint16_t)); +- offset += sizeof(uint16_t); ++ memcpy(outbuf + offset, &be_namelen, sizeof(__be16)); ++ offset += sizeof(__be16); + memcpy(outbuf + offset, r->res_name, r->res_length); + offset += r->res_length; + } +@@ -430,9 +430,9 @@ + + if ((list == &ls->ls_root_list) && + (offset + sizeof(uint16_t) <= outlen)) { +- be_namelen = 0xFFFF; +- memcpy(outbuf + offset, &be_namelen, sizeof(uint16_t)); +- offset += sizeof(uint16_t); ++ be_namelen = cpu_to_be16(0xFFFF); ++ memcpy(outbuf + offset, &be_namelen, sizeof(__be16)); ++ offset += sizeof(__be16); + } + + out: +diff -urN linux-2.6.27.19-5.1/fs/dlm/dlm_internal.h linux-2.6.27.23-0.1.1/fs/dlm/dlm_internal.h +--- linux-2.6.27.19-5.1/fs/dlm/dlm_internal.h 2009-06-16 13:53:04.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/dlm/dlm_internal.h 2009-06-16 13:39:31.000000000 +0100 +@@ -99,13 +99,13 @@ + + struct dlm_dirtable { + struct list_head list; +- rwlock_t lock; ++ spinlock_t lock; + }; + + struct dlm_rsbtable { + struct list_head list; + struct list_head toss; +- rwlock_t lock; ++ spinlock_t lock; + }; + + struct dlm_lkbtable { +@@ -245,7 +245,8 @@ + struct list_head lkb_astqueue; /* need ast to be sent */ + struct list_head lkb_ownqueue; /* list of locks for a process */ + struct list_head lkb_time_list; +- unsigned long lkb_timestamp; ++ ktime_t lkb_time_bast; /* for debugging */ ++ ktime_t lkb_timestamp; + unsigned long lkb_timeout_cs; + + char *lkb_lvbptr; +@@ -445,6 +446,7 @@ + the dlm using this ls */ + int ls_create_count; /* create/release refcount */ + unsigned long ls_flags; /* LSFL_ */ ++ unsigned long ls_scan_time; + struct kobject ls_kobj; + + struct dlm_rsbtable *ls_rsbtbl; +@@ -480,6 +482,7 @@ + struct dentry *ls_debug_rsb_dentry; /* debugfs */ + struct dentry *ls_debug_waiters_dentry; /* debugfs */ + struct dentry *ls_debug_locks_dentry; /* debugfs */ ++ struct dentry *ls_debug_all_dentry; /* debugfs */ + + wait_queue_head_t ls_uevent_wait; /* user part of join/leave */ + int ls_uevent_result; +diff -urN linux-2.6.27.19-5.1/fs/dlm/lock.c linux-2.6.27.23-0.1.1/fs/dlm/lock.c +--- linux-2.6.27.19-5.1/fs/dlm/lock.c 2009-06-16 13:53:04.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/dlm/lock.c 2009-06-16 13:39:31.000000000 +0100 +@@ -307,7 +307,7 @@ + lkb->lkb_lksb->sb_status = rv; + lkb->lkb_lksb->sb_flags = lkb->lkb_sbflags; + +- dlm_add_ast(lkb, AST_COMP); ++ dlm_add_ast(lkb, AST_COMP, 0); + } + + static inline void queue_cast_overlap(struct dlm_rsb *r, struct dlm_lkb *lkb) +@@ -318,12 +318,12 @@ + + static void queue_bast(struct dlm_rsb *r, struct dlm_lkb *lkb, int rqmode) + { ++ lkb->lkb_time_bast = ktime_get(); ++ + if (is_master_copy(lkb)) + send_bast(r, lkb, rqmode); +- else { +- lkb->lkb_bastmode = rqmode; +- dlm_add_ast(lkb, AST_BAST); +- } ++ else ++ dlm_add_ast(lkb, AST_BAST, rqmode); + } + + /* +@@ -412,9 +412,9 @@ + unsigned int flags, struct dlm_rsb **r_ret) + { + int error; +- write_lock(&ls->ls_rsbtbl[b].lock); ++ spin_lock(&ls->ls_rsbtbl[b].lock); + error = _search_rsb(ls, name, len, b, flags, r_ret); +- write_unlock(&ls->ls_rsbtbl[b].lock); ++ spin_unlock(&ls->ls_rsbtbl[b].lock); + return error; + } + +@@ -478,16 +478,16 @@ + r->res_nodeid = nodeid; + } + +- write_lock(&ls->ls_rsbtbl[bucket].lock); ++ spin_lock(&ls->ls_rsbtbl[bucket].lock); + error = _search_rsb(ls, name, namelen, bucket, 0, &tmp); + if (!error) { +- write_unlock(&ls->ls_rsbtbl[bucket].lock); ++ spin_unlock(&ls->ls_rsbtbl[bucket].lock); + dlm_free_rsb(r); + r = tmp; + goto out; + } + list_add(&r->res_hashchain, &ls->ls_rsbtbl[bucket].list); +- write_unlock(&ls->ls_rsbtbl[bucket].lock); ++ spin_unlock(&ls->ls_rsbtbl[bucket].lock); + error = 0; + out: + *r_ret = r; +@@ -530,9 +530,9 @@ + struct dlm_ls *ls = r->res_ls; + uint32_t bucket = r->res_bucket; + +- write_lock(&ls->ls_rsbtbl[bucket].lock); ++ spin_lock(&ls->ls_rsbtbl[bucket].lock); + kref_put(&r->res_ref, toss_rsb); +- write_unlock(&ls->ls_rsbtbl[bucket].lock); ++ spin_unlock(&ls->ls_rsbtbl[bucket].lock); + } + + void dlm_put_rsb(struct dlm_rsb *r) +@@ -744,6 +744,8 @@ + + DLM_ASSERT(!lkb->lkb_status, dlm_print_lkb(lkb);); + ++ lkb->lkb_timestamp = ktime_get(); ++ + lkb->lkb_status = status; + + switch (status) { +@@ -833,7 +835,7 @@ + lkb->lkb_wait_count++; + hold_lkb(lkb); + +- log_debug(ls, "add overlap %x cur %d new %d count %d flags %x", ++ log_debug(ls, "addwait %x cur %d overlap %d count %d f %x", + lkb->lkb_id, lkb->lkb_wait_type, mstype, + lkb->lkb_wait_count, lkb->lkb_flags); + goto out; +@@ -849,7 +851,7 @@ + list_add(&lkb->lkb_wait_reply, &ls->ls_waiters); + out: + if (error) +- log_error(ls, "add_to_waiters %x error %d flags %x %d %d %s", ++ log_error(ls, "addwait error %x %d flags %x %d %d %s", + lkb->lkb_id, error, lkb->lkb_flags, mstype, + lkb->lkb_wait_type, lkb->lkb_resource->res_name); + mutex_unlock(&ls->ls_waiters_mutex); +@@ -861,23 +863,55 @@ + request reply on the requestqueue) between dlm_recover_waiters_pre() which + set RESEND and dlm_recover_waiters_post() */ + +-static int _remove_from_waiters(struct dlm_lkb *lkb, int mstype) ++static int _remove_from_waiters(struct dlm_lkb *lkb, int mstype, ++ struct dlm_message *ms) + { + struct dlm_ls *ls = lkb->lkb_resource->res_ls; + int overlap_done = 0; + + if (is_overlap_unlock(lkb) && (mstype == DLM_MSG_UNLOCK_REPLY)) { ++ log_debug(ls, "remwait %x unlock_reply overlap", lkb->lkb_id); + lkb->lkb_flags &= ~DLM_IFL_OVERLAP_UNLOCK; + overlap_done = 1; + goto out_del; + } + + if (is_overlap_cancel(lkb) && (mstype == DLM_MSG_CANCEL_REPLY)) { ++ log_debug(ls, "remwait %x cancel_reply overlap", lkb->lkb_id); + lkb->lkb_flags &= ~DLM_IFL_OVERLAP_CANCEL; + overlap_done = 1; + goto out_del; + } + ++ /* Cancel state was preemptively cleared by a successful convert, ++ see next comment, nothing to do. */ ++ ++ if ((mstype == DLM_MSG_CANCEL_REPLY) && ++ (lkb->lkb_wait_type != DLM_MSG_CANCEL)) { ++ log_debug(ls, "remwait %x cancel_reply wait_type %d", ++ lkb->lkb_id, lkb->lkb_wait_type); ++ return -1; ++ } ++ ++ /* Remove for the convert reply, and premptively remove for the ++ cancel reply. A convert has been granted while there's still ++ an outstanding cancel on it (the cancel is moot and the result ++ in the cancel reply should be 0). We preempt the cancel reply ++ because the app gets the convert result and then can follow up ++ with another op, like convert. This subsequent op would see the ++ lingering state of the cancel and fail with -EBUSY. */ ++ ++ if ((mstype == DLM_MSG_CONVERT_REPLY) && ++ (lkb->lkb_wait_type == DLM_MSG_CONVERT) && ++ is_overlap_cancel(lkb) && ms && !ms->m_result) { ++ log_debug(ls, "remwait %x convert_reply zap overlap_cancel", ++ lkb->lkb_id); ++ lkb->lkb_wait_type = 0; ++ lkb->lkb_flags &= ~DLM_IFL_OVERLAP_CANCEL; ++ lkb->lkb_wait_count--; ++ goto out_del; ++ } ++ + /* N.B. type of reply may not always correspond to type of original + msg due to lookup->request optimization, verify others? */ + +@@ -886,8 +920,8 @@ + goto out_del; + } + +- log_error(ls, "remove_from_waiters lkid %x flags %x types %d %d", +- lkb->lkb_id, lkb->lkb_flags, mstype, lkb->lkb_wait_type); ++ log_error(ls, "remwait error %x reply %d flags %x no wait_type", ++ lkb->lkb_id, mstype, lkb->lkb_flags); + return -1; + + out_del: +@@ -897,7 +931,7 @@ + this would happen */ + + if (overlap_done && lkb->lkb_wait_type) { +- log_error(ls, "remove_from_waiters %x reply %d give up on %d", ++ log_error(ls, "remwait error %x reply %d wait_type %d overlap", + lkb->lkb_id, mstype, lkb->lkb_wait_type); + lkb->lkb_wait_count--; + lkb->lkb_wait_type = 0; +@@ -919,7 +953,7 @@ + int error; + + mutex_lock(&ls->ls_waiters_mutex); +- error = _remove_from_waiters(lkb, mstype); ++ error = _remove_from_waiters(lkb, mstype, NULL); + mutex_unlock(&ls->ls_waiters_mutex); + return error; + } +@@ -934,7 +968,7 @@ + + if (ms != &ls->ls_stub_ms) + mutex_lock(&ls->ls_waiters_mutex); +- error = _remove_from_waiters(lkb, ms->m_type); ++ error = _remove_from_waiters(lkb, ms->m_type, ms); + if (ms != &ls->ls_stub_ms) + mutex_unlock(&ls->ls_waiters_mutex); + return error; +@@ -965,7 +999,7 @@ + + for (;;) { + found = 0; +- write_lock(&ls->ls_rsbtbl[b].lock); ++ spin_lock(&ls->ls_rsbtbl[b].lock); + list_for_each_entry_reverse(r, &ls->ls_rsbtbl[b].toss, + res_hashchain) { + if (!time_after_eq(jiffies, r->res_toss_time + +@@ -976,20 +1010,20 @@ + } + + if (!found) { +- write_unlock(&ls->ls_rsbtbl[b].lock); ++ spin_unlock(&ls->ls_rsbtbl[b].lock); + break; + } + + if (kref_put(&r->res_ref, kill_rsb)) { + list_del(&r->res_hashchain); +- write_unlock(&ls->ls_rsbtbl[b].lock); ++ spin_unlock(&ls->ls_rsbtbl[b].lock); + + if (is_master(r)) + dir_remove(r); + dlm_free_rsb(r); + count++; + } else { +- write_unlock(&ls->ls_rsbtbl[b].lock); ++ spin_unlock(&ls->ls_rsbtbl[b].lock); + log_error(ls, "tossed rsb in use %s", r->res_name); + } + } +@@ -1013,10 +1047,8 @@ + { + struct dlm_ls *ls = lkb->lkb_resource->res_ls; + +- if (is_master_copy(lkb)) { +- lkb->lkb_timestamp = jiffies; ++ if (is_master_copy(lkb)) + return; +- } + + if (test_bit(LSFL_TIMEWARN, &ls->ls_flags) && + !(lkb->lkb_exflags & DLM_LKF_NODLCKWT)) { +@@ -1031,7 +1063,6 @@ + DLM_ASSERT(list_empty(&lkb->lkb_time_list), dlm_print_lkb(lkb);); + mutex_lock(&ls->ls_timeout_mutex); + hold_lkb(lkb); +- lkb->lkb_timestamp = jiffies; + list_add_tail(&lkb->lkb_time_list, &ls->ls_timeout); + mutex_unlock(&ls->ls_timeout_mutex); + } +@@ -1059,6 +1090,7 @@ + struct dlm_rsb *r; + struct dlm_lkb *lkb; + int do_cancel, do_warn; ++ s64 wait_us; + + for (;;) { + if (dlm_locking_stopped(ls)) +@@ -1069,14 +1101,15 @@ + mutex_lock(&ls->ls_timeout_mutex); + list_for_each_entry(lkb, &ls->ls_timeout, lkb_time_list) { + ++ wait_us = ktime_to_us(ktime_sub(ktime_get(), ++ lkb->lkb_timestamp)); ++ + if ((lkb->lkb_exflags & DLM_LKF_TIMEOUT) && +- time_after_eq(jiffies, lkb->lkb_timestamp + +- lkb->lkb_timeout_cs * HZ/100)) ++ wait_us >= (lkb->lkb_timeout_cs * 10000)) + do_cancel = 1; + + if ((lkb->lkb_flags & DLM_IFL_WATCH_TIMEWARN) && +- time_after_eq(jiffies, lkb->lkb_timestamp + +- dlm_config.ci_timewarn_cs * HZ/100)) ++ wait_us >= dlm_config.ci_timewarn_cs * 10000) + do_warn = 1; + + if (!do_cancel && !do_warn) +@@ -1122,12 +1155,12 @@ + void dlm_adjust_timeouts(struct dlm_ls *ls) + { + struct dlm_lkb *lkb; +- long adj = jiffies - ls->ls_recover_begin; ++ u64 adj_us = jiffies_to_usecs(jiffies - ls->ls_recover_begin); + + ls->ls_recover_begin = 0; + mutex_lock(&ls->ls_timeout_mutex); + list_for_each_entry(lkb, &ls->ls_timeout, lkb_time_list) +- lkb->lkb_timestamp += adj; ++ lkb->lkb_timestamp = ktime_add_us(lkb->lkb_timestamp, adj_us); + mutex_unlock(&ls->ls_timeout_mutex); + } + +@@ -2082,6 +2115,11 @@ + lkb->lkb_timeout_cs = args->timeout; + rv = 0; + out: ++ if (rv) ++ log_debug(ls, "validate_lock_args %d %x %x %x %d %d %s", ++ rv, lkb->lkb_id, lkb->lkb_flags, args->flags, ++ lkb->lkb_status, lkb->lkb_wait_type, ++ lkb->lkb_resource->res_name); + return rv; + } + +@@ -2148,6 +2186,13 @@ + goto out; + } + ++ /* there's nothing to cancel */ ++ if (lkb->lkb_status == DLM_LKSTS_GRANTED && ++ !lkb->lkb_wait_type) { ++ rv = -EBUSY; ++ goto out; ++ } ++ + switch (lkb->lkb_wait_type) { + case DLM_MSG_LOOKUP: + case DLM_MSG_REQUEST: +@@ -4223,7 +4268,7 @@ + { + struct dlm_rsb *r, *r_ret = NULL; + +- read_lock(&ls->ls_rsbtbl[bucket].lock); ++ spin_lock(&ls->ls_rsbtbl[bucket].lock); + list_for_each_entry(r, &ls->ls_rsbtbl[bucket].list, res_hashchain) { + if (!rsb_flag(r, RSB_LOCKS_PURGED)) + continue; +@@ -4232,7 +4277,7 @@ + r_ret = r; + break; + } +- read_unlock(&ls->ls_rsbtbl[bucket].lock); ++ spin_unlock(&ls->ls_rsbtbl[bucket].lock); + return r_ret; + } + +diff -urN linux-2.6.27.19-5.1/fs/dlm/lockspace.c linux-2.6.27.23-0.1.1/fs/dlm/lockspace.c +--- linux-2.6.27.19-5.1/fs/dlm/lockspace.c 2009-06-16 13:53:04.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/dlm/lockspace.c 2009-06-16 13:39:31.000000000 +0100 +@@ -212,19 +212,41 @@ + kset_unregister(dlm_kset); + } + ++static struct dlm_ls *find_ls_to_scan(void) ++{ ++ struct dlm_ls *ls; ++ ++ spin_lock(&lslist_lock); ++ list_for_each_entry(ls, &lslist, ls_list) { ++ if (time_after_eq(jiffies, ls->ls_scan_time + ++ dlm_config.ci_scan_secs * HZ)) { ++ spin_unlock(&lslist_lock); ++ return ls; ++ } ++ } ++ spin_unlock(&lslist_lock); ++ return NULL; ++} ++ + static int dlm_scand(void *data) + { + struct dlm_ls *ls; ++ int timeout_jiffies = dlm_config.ci_scan_secs * HZ; + + while (!kthread_should_stop()) { +- list_for_each_entry(ls, &lslist, ls_list) { ++ ls = find_ls_to_scan(); ++ if (ls) { + if (dlm_lock_recovery_try(ls)) { ++ ls->ls_scan_time = jiffies; + dlm_scan_rsbs(ls); + dlm_scan_timeout(ls); + dlm_unlock_recovery(ls); ++ } else { ++ ls->ls_scan_time += HZ; + } ++ } else { ++ schedule_timeout_interruptible(timeout_jiffies); + } +- schedule_timeout_interruptible(dlm_config.ci_scan_secs * HZ); + } + return 0; + } +@@ -378,6 +400,11 @@ + if (!try_module_get(THIS_MODULE)) + return -EINVAL; + ++ if (!dlm_user_daemon_available()) { ++ module_put(THIS_MODULE); ++ return -EUNATCH; ++ } ++ + error = 0; + + spin_lock(&lslist_lock); +@@ -413,6 +440,7 @@ + ls->ls_lvblen = lvblen; + ls->ls_count = 0; + ls->ls_flags = 0; ++ ls->ls_scan_time = jiffies; + + if (flags & DLM_LSFL_TIMEWARN) + set_bit(LSFL_TIMEWARN, &ls->ls_flags); +@@ -436,7 +464,7 @@ + for (i = 0; i < size; i++) { + INIT_LIST_HEAD(&ls->ls_rsbtbl[i].list); + INIT_LIST_HEAD(&ls->ls_rsbtbl[i].toss); +- rwlock_init(&ls->ls_rsbtbl[i].lock); ++ spin_lock_init(&ls->ls_rsbtbl[i].lock); + } + + size = dlm_config.ci_lkbtbl_size; +@@ -459,7 +487,7 @@ + goto out_lkbfree; + for (i = 0; i < size; i++) { + INIT_LIST_HEAD(&ls->ls_dirtbl[i].list); +- rwlock_init(&ls->ls_dirtbl[i].lock); ++ spin_lock_init(&ls->ls_dirtbl[i].lock); + } + + INIT_LIST_HEAD(&ls->ls_waiters); +@@ -669,7 +697,7 @@ + + dlm_device_deregister(ls); + +- if (force < 3) ++ if (force < 3 && dlm_user_daemon_available()) + do_uevent(ls, 0); + + dlm_recoverd_stop(ls); +@@ -791,3 +819,20 @@ + return error; + } + ++void dlm_stop_lockspaces(void) ++{ ++ struct dlm_ls *ls; ++ ++ restart: ++ spin_lock(&lslist_lock); ++ list_for_each_entry(ls, &lslist, ls_list) { ++ if (!test_bit(LSFL_RUNNING, &ls->ls_flags)) ++ continue; ++ spin_unlock(&lslist_lock); ++ log_error(ls, "no userland control daemon, stopping lockspace"); ++ dlm_ls_stop(ls); ++ goto restart; ++ } ++ spin_unlock(&lslist_lock); ++} ++ +diff -urN linux-2.6.27.19-5.1/fs/dlm/lockspace.h linux-2.6.27.23-0.1.1/fs/dlm/lockspace.h +--- linux-2.6.27.19-5.1/fs/dlm/lockspace.h 2009-06-16 13:53:04.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/dlm/lockspace.h 2009-06-16 13:39:31.000000000 +0100 +@@ -20,6 +20,7 @@ + struct dlm_ls *dlm_find_lockspace_local(void *id); + struct dlm_ls *dlm_find_lockspace_device(int minor); + void dlm_put_lockspace(struct dlm_ls *ls); ++void dlm_stop_lockspaces(void); + + #endif /* __LOCKSPACE_DOT_H__ */ + +diff -urN linux-2.6.27.19-5.1/fs/dlm/lowcomms.c linux-2.6.27.23-0.1.1/fs/dlm/lowcomms.c +--- linux-2.6.27.19-5.1/fs/dlm/lowcomms.c 2009-06-16 13:53:04.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/dlm/lowcomms.c 2009-06-16 13:39:31.000000000 +0100 +@@ -2,7 +2,7 @@ + ******************************************************************************* + ** + ** Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved. +-** Copyright (C) 2004-2007 Red Hat, Inc. All rights reserved. ++** Copyright (C) 2004-2009 Red Hat, Inc. All rights reserved. + ** + ** This copyrighted material is made available to anyone wishing to use, + ** modify, copy, or redistribute it subject to the terms and conditions +@@ -21,7 +21,7 @@ + * + * Cluster nodes are referred to by their nodeids. nodeids are + * simply 32 bit numbers to the locking module - if they need to +- * be expanded for the cluster infrastructure then that is it's ++ * be expanded for the cluster infrastructure then that is its + * responsibility. It is this layer's + * responsibility to resolve these into IP address or + * whatever it needs for inter-node communication. +@@ -36,9 +36,9 @@ + * of high load. Also, this way, the sending thread can collect together + * messages bound for one node and send them in one block. + * +- * lowcomms will choose to use wither TCP or SCTP as its transport layer ++ * lowcomms will choose to use either TCP or SCTP as its transport layer + * depending on the configuration variable 'protocol'. This should be set +- * to 0 (default) for TCP or 1 for SCTP. It shouldbe configured using a ++ * to 0 (default) for TCP or 1 for SCTP. It should be configured using a + * cluster-wide mechanism as it must be the same on all nodes of the cluster + * for the DLM to function. + * +@@ -48,11 +48,11 @@ + #include + #include + #include +-#include + #include + #include + #include + #include ++#include + + #include "dlm_internal.h" + #include "lowcomms.h" +@@ -60,6 +60,7 @@ + #include "config.h" + + #define NEEDED_RMEM (4*1024*1024) ++#define CONN_HASH_SIZE 32 + + struct cbuf { + unsigned int base; +@@ -114,6 +115,7 @@ + int retries; + #define MAX_CONNECT_RETRIES 3 + int sctp_assoc; ++ struct hlist_node list; + struct connection *othercon; + struct work_struct rwork; /* Receive workqueue */ + struct work_struct swork; /* Send workqueue */ +@@ -138,14 +140,37 @@ + static struct workqueue_struct *recv_workqueue; + static struct workqueue_struct *send_workqueue; + +-static DEFINE_IDR(connections_idr); ++static struct hlist_head connection_hash[CONN_HASH_SIZE]; + static DEFINE_MUTEX(connections_lock); +-static int max_nodeid; + static struct kmem_cache *con_cache; + + static void process_recv_sockets(struct work_struct *work); + static void process_send_sockets(struct work_struct *work); + ++ ++/* This is deliberately very simple because most clusters have simple ++ sequential nodeids, so we should be able to go straight to a connection ++ struct in the array */ ++static inline int nodeid_hash(int nodeid) ++{ ++ return nodeid & (CONN_HASH_SIZE-1); ++} ++ ++static struct connection *__find_con(int nodeid) ++{ ++ int r; ++ struct hlist_node *h; ++ struct connection *con; ++ ++ r = nodeid_hash(nodeid); ++ ++ hlist_for_each_entry(con, h, &connection_hash[r], list) { ++ if (con->nodeid == nodeid) ++ return con; ++ } ++ return NULL; ++} ++ + /* + * If 'allocation' is zero then we don't attempt to create a new + * connection structure for this node. +@@ -154,31 +179,17 @@ + { + struct connection *con = NULL; + int r; +- int n; + +- con = idr_find(&connections_idr, nodeid); ++ con = __find_con(nodeid); + if (con || !alloc) + return con; + +- r = idr_pre_get(&connections_idr, alloc); +- if (!r) +- return NULL; +- + con = kmem_cache_zalloc(con_cache, alloc); + if (!con) + return NULL; + +- r = idr_get_new_above(&connections_idr, con, nodeid, &n); +- if (r) { +- kmem_cache_free(con_cache, con); +- return NULL; +- } +- +- if (n != nodeid) { +- idr_remove(&connections_idr, n); +- kmem_cache_free(con_cache, con); +- return NULL; +- } ++ r = nodeid_hash(nodeid); ++ hlist_add_head(&con->list, &connection_hash[r]); + + con->nodeid = nodeid; + mutex_init(&con->sock_mutex); +@@ -189,19 +200,30 @@ + + /* Setup action pointers for child sockets */ + if (con->nodeid) { +- struct connection *zerocon = idr_find(&connections_idr, 0); ++ struct connection *zerocon = __find_con(0); + + con->connect_action = zerocon->connect_action; + if (!con->rx_action) + con->rx_action = zerocon->rx_action; + } + +- if (nodeid > max_nodeid) +- max_nodeid = nodeid; +- + return con; + } + ++/* Loop round all connections */ ++static void foreach_conn(void (*conn_func)(struct connection *c)) ++{ ++ int i; ++ struct hlist_node *h, *n; ++ struct connection *con; ++ ++ for (i = 0; i < CONN_HASH_SIZE; i++) { ++ hlist_for_each_entry_safe(con, h, n, &connection_hash[i], list){ ++ conn_func(con); ++ } ++ } ++} ++ + static struct connection *nodeid2con(int nodeid, gfp_t allocation) + { + struct connection *con; +@@ -217,14 +239,17 @@ + static struct connection *assoc2con(int assoc_id) + { + int i; ++ struct hlist_node *h; + struct connection *con; + + mutex_lock(&connections_lock); +- for (i=0; i<=max_nodeid; i++) { +- con = __nodeid2con(i, 0); +- if (con && con->sctp_assoc == assoc_id) { +- mutex_unlock(&connections_lock); +- return con; ++ ++ for (i = 0 ; i < CONN_HASH_SIZE; i++) { ++ hlist_for_each_entry(con, h, &connection_hash[i], list) { ++ if (con && con->sctp_assoc == assoc_id) { ++ mutex_unlock(&connections_lock); ++ return con; ++ } + } + } + mutex_unlock(&connections_lock); +@@ -250,8 +275,7 @@ + } else { + struct sockaddr_in6 *in6 = (struct sockaddr_in6 *) &addr; + struct sockaddr_in6 *ret6 = (struct sockaddr_in6 *) retaddr; +- memcpy(&ret6->sin6_addr, &in6->sin6_addr, +- sizeof(in6->sin6_addr)); ++ ipv6_addr_copy(&ret6->sin6_addr, &in6->sin6_addr); + } + + return 0; +@@ -295,6 +319,7 @@ + con->sock->sk->sk_write_space = lowcomms_write_space; + con->sock->sk->sk_state_change = lowcomms_state_change; + con->sock->sk->sk_user_data = con; ++ con->sock->sk->sk_allocation = GFP_NOFS; + return 0; + } + +@@ -375,25 +400,23 @@ + log_print("send EOF to node failed: %d", ret); + } + ++static void sctp_init_failed_foreach(struct connection *con) ++{ ++ con->sctp_assoc = 0; ++ if (test_and_clear_bit(CF_CONNECT_PENDING, &con->flags)) { ++ if (!test_and_set_bit(CF_WRITE_PENDING, &con->flags)) ++ queue_work(send_workqueue, &con->swork); ++ } ++} ++ + /* INIT failed but we don't know which node... + restart INIT on all pending nodes */ + static void sctp_init_failed(void) + { +- int i; +- struct connection *con; +- + mutex_lock(&connections_lock); +- for (i=1; i<=max_nodeid; i++) { +- con = __nodeid2con(i, 0); +- if (!con) +- continue; +- con->sctp_assoc = 0; +- if (test_and_clear_bit(CF_CONNECT_PENDING, &con->flags)) { +- if (!test_and_set_bit(CF_WRITE_PENDING, &con->flags)) { +- queue_work(send_workqueue, &con->swork); +- } +- } +- } ++ ++ foreach_conn(sctp_init_failed_foreach); ++ + mutex_unlock(&connections_lock); + } + +@@ -823,7 +846,6 @@ + len = e->len; + offset = e->offset; + spin_unlock(&con->writequeue_lock); +- kmap(e->page); + + /* Send the first block off the write queue */ + iov[0].iov_base = page_address(e->page)+offset; +@@ -854,7 +876,6 @@ + + if (e->len == 0 && e->users == 0) { + list_del(&e->list); +- kunmap(e->page); + free_entry(e); + } + spin_unlock(&con->writequeue_lock); +@@ -1203,8 +1224,6 @@ + + if (e) { + got_one: +- if (users == 0) +- kmap(e->page); + *ppc = page_address(e->page) + offset; + return e; + } +@@ -1233,7 +1252,6 @@ + if (users) + goto out; + e->len = e->end - e->offset; +- kunmap(e->page); + spin_unlock(&con->writequeue_lock); + + if (!test_and_set_bit(CF_WRITE_PENDING, &con->flags)) { +@@ -1272,7 +1290,6 @@ + offset = e->offset; + BUG_ON(len == 0 && e->users == 0); + spin_unlock(&con->writequeue_lock); +- kmap(e->page); + + ret = 0; + if (len) { +@@ -1294,7 +1311,6 @@ + + if (e->len == 0 && e->users == 0) { + list_del(&e->list); +- kunmap(e->page); + free_entry(e); + continue; + } +@@ -1319,13 +1335,10 @@ + + static void clean_one_writequeue(struct connection *con) + { +- struct list_head *list; +- struct list_head *temp; ++ struct writequeue_entry *e, *safe; + + spin_lock(&con->writequeue_lock); +- list_for_each_safe(list, temp, &con->writequeue) { +- struct writequeue_entry *e = +- list_entry(list, struct writequeue_entry, list); ++ list_for_each_entry_safe(e, safe, &con->writequeue, list) { + list_del(&e->list); + free_entry(e); + } +@@ -1375,14 +1388,7 @@ + /* Discard all entries on the write queues */ + static void clean_writequeues(void) + { +- int nodeid; +- +- for (nodeid = 1; nodeid <= max_nodeid; nodeid++) { +- struct connection *con = __nodeid2con(nodeid, 0); +- +- if (con) +- clean_one_writequeue(con); +- } ++ foreach_conn(clean_one_writequeue); + } + + static void work_stop(void) +@@ -1412,23 +1418,29 @@ + return 0; + } + +-void dlm_lowcomms_stop(void) ++static void stop_conn(struct connection *con) + { +- int i; +- struct connection *con; ++ con->flags |= 0x0F; ++ if (con->sock) ++ con->sock->sk->sk_user_data = NULL; ++} + ++static void free_conn(struct connection *con) ++{ ++ close_connection(con, true); ++ if (con->othercon) ++ kmem_cache_free(con_cache, con->othercon); ++ hlist_del(&con->list); ++ kmem_cache_free(con_cache, con); ++} ++ ++void dlm_lowcomms_stop(void) ++{ + /* Set all the flags to prevent any + socket activity. + */ + mutex_lock(&connections_lock); +- for (i = 0; i <= max_nodeid; i++) { +- con = __nodeid2con(i, 0); +- if (con) { +- con->flags |= 0x0F; +- if (con->sock) +- con->sock->sk->sk_user_data = NULL; +- } +- } ++ foreach_conn(stop_conn); + mutex_unlock(&connections_lock); + + work_stop(); +@@ -1436,25 +1448,20 @@ + mutex_lock(&connections_lock); + clean_writequeues(); + +- for (i = 0; i <= max_nodeid; i++) { +- con = __nodeid2con(i, 0); +- if (con) { +- close_connection(con, true); +- if (con->othercon) +- kmem_cache_free(con_cache, con->othercon); +- kmem_cache_free(con_cache, con); +- } +- } +- max_nodeid = 0; ++ foreach_conn(free_conn); ++ + mutex_unlock(&connections_lock); + kmem_cache_destroy(con_cache); +- idr_init(&connections_idr); + } + + int dlm_lowcomms_start(void) + { + int error = -EINVAL; + struct connection *con; ++ int i; ++ ++ for (i = 0; i < CONN_HASH_SIZE; i++) ++ INIT_HLIST_HEAD(&connection_hash[i]); + + init_local(); + if (!dlm_local_count) { +diff -urN linux-2.6.27.19-5.1/fs/dlm/memory.c linux-2.6.27.23-0.1.1/fs/dlm/memory.c +--- linux-2.6.27.19-5.1/fs/dlm/memory.c 2009-06-16 13:53:04.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/dlm/memory.c 2009-06-16 13:39:31.000000000 +0100 +@@ -39,7 +39,7 @@ + { + char *p; + +- p = kzalloc(ls->ls_lvblen, GFP_KERNEL); ++ p = kzalloc(ls->ls_lvblen, ls->ls_allocation); + return p; + } + +@@ -57,7 +57,7 @@ + + DLM_ASSERT(namelen <= DLM_RESNAME_MAXLEN,); + +- r = kzalloc(sizeof(*r) + namelen, GFP_KERNEL); ++ r = kzalloc(sizeof(*r) + namelen, ls->ls_allocation); + return r; + } + +@@ -72,7 +72,7 @@ + { + struct dlm_lkb *lkb; + +- lkb = kmem_cache_zalloc(lkb_cache, GFP_KERNEL); ++ lkb = kmem_cache_zalloc(lkb_cache, ls->ls_allocation); + return lkb; + } + +diff -urN linux-2.6.27.19-5.1/fs/dlm/midcomms.c linux-2.6.27.23-0.1.1/fs/dlm/midcomms.c +--- linux-2.6.27.19-5.1/fs/dlm/midcomms.c 2009-06-16 13:53:04.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/dlm/midcomms.c 2009-06-16 13:39:31.000000000 +0100 +@@ -112,7 +112,7 @@ + ordinary messages). */ + + if (msglen > sizeof(__tmp) && p == &__tmp.p) { +- p = kmalloc(dlm_config.ci_buffer_size, GFP_KERNEL); ++ p = kmalloc(dlm_config.ci_buffer_size, GFP_NOFS); + if (p == NULL) + return ret; + } +diff -urN linux-2.6.27.19-5.1/fs/dlm/netlink.c linux-2.6.27.23-0.1.1/fs/dlm/netlink.c +--- linux-2.6.27.19-5.1/fs/dlm/netlink.c 2009-06-16 13:53:04.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/dlm/netlink.c 2009-06-16 13:39:31.000000000 +0100 +@@ -115,7 +115,6 @@ + data->status = lkb->lkb_status; + data->grmode = lkb->lkb_grmode; + data->rqmode = lkb->lkb_rqmode; +- data->timestamp = lkb->lkb_timestamp; + if (lkb->lkb_ua) + data->xid = lkb->lkb_ua->xid; + if (r) { +@@ -127,8 +126,8 @@ + + void dlm_timeout_warn(struct dlm_lkb *lkb) + { ++ struct sk_buff *uninitialized_var(send_skb); + struct dlm_lock_data *data; +- struct sk_buff *send_skb; + size_t size; + int rv; + +diff -urN linux-2.6.27.19-5.1/fs/dlm/plock.c linux-2.6.27.23-0.1.1/fs/dlm/plock.c +--- linux-2.6.27.19-5.1/fs/dlm/plock.c 2009-06-16 13:53:04.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/dlm/plock.c 2009-06-16 13:39:31.000000000 +0100 +@@ -168,7 +168,7 @@ + notify = xop->callback; + + if (op->info.rv) { +- notify(flc, NULL, op->info.rv); ++ notify(fl, NULL, op->info.rv); + goto out; + } + +@@ -187,7 +187,7 @@ + (unsigned long long)op->info.number, file, fl); + } + +- rv = notify(flc, NULL, 0); ++ rv = notify(fl, NULL, 0); + if (rv) { + /* XXX: We need to cancel the fs lock here: */ + log_print("dlm_plock_callback: lock granted after lock request " +diff -urN linux-2.6.27.19-5.1/fs/dlm/recover.c linux-2.6.27.23-0.1.1/fs/dlm/recover.c +--- linux-2.6.27.19-5.1/fs/dlm/recover.c 2009-06-16 13:53:04.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/dlm/recover.c 2009-06-16 13:39:31.000000000 +0100 +@@ -726,7 +726,7 @@ + } + + for (i = 0; i < ls->ls_rsbtbl_size; i++) { +- read_lock(&ls->ls_rsbtbl[i].lock); ++ spin_lock(&ls->ls_rsbtbl[i].lock); + list_for_each_entry(r, &ls->ls_rsbtbl[i].list, res_hashchain) { + list_add(&r->res_root_list, &ls->ls_root_list); + dlm_hold_rsb(r); +@@ -737,7 +737,7 @@ + but no other recovery steps should do anything with them. */ + + if (dlm_no_directory(ls)) { +- read_unlock(&ls->ls_rsbtbl[i].lock); ++ spin_unlock(&ls->ls_rsbtbl[i].lock); + continue; + } + +@@ -745,7 +745,7 @@ + list_add(&r->res_root_list, &ls->ls_root_list); + dlm_hold_rsb(r); + } +- read_unlock(&ls->ls_rsbtbl[i].lock); ++ spin_unlock(&ls->ls_rsbtbl[i].lock); + } + out: + up_write(&ls->ls_root_sem); +@@ -775,7 +775,7 @@ + int i; + + for (i = 0; i < ls->ls_rsbtbl_size; i++) { +- write_lock(&ls->ls_rsbtbl[i].lock); ++ spin_lock(&ls->ls_rsbtbl[i].lock); + list_for_each_entry_safe(r, safe, &ls->ls_rsbtbl[i].toss, + res_hashchain) { + if (dlm_no_directory(ls) || !is_master(r)) { +@@ -783,7 +783,7 @@ + dlm_free_rsb(r); + } + } +- write_unlock(&ls->ls_rsbtbl[i].lock); ++ spin_unlock(&ls->ls_rsbtbl[i].lock); + } + } + +diff -urN linux-2.6.27.19-5.1/fs/dlm/user.c linux-2.6.27.23-0.1.1/fs/dlm/user.c +--- linux-2.6.27.19-5.1/fs/dlm/user.c 2009-06-16 13:53:04.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/dlm/user.c 2009-06-16 13:39:31.000000000 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (C) 2006-2008 Red Hat, Inc. All rights reserved. ++ * Copyright (C) 2006-2009 Red Hat, Inc. All rights reserved. + * + * This copyrighted material is made available to anyone wishing to use, + * modify, copy, or redistribute it subject to the terms and conditions +@@ -15,7 +15,6 @@ + #include + #include + #include +-#include + #include + #include + +@@ -27,6 +26,8 @@ + + static const char name_prefix[] = "dlm"; + static const struct file_operations device_fops; ++static atomic_t dlm_monitor_opened; ++static int dlm_monitor_unused = 1; + + #ifdef CONFIG_COMPAT + +@@ -83,7 +84,7 @@ + + static void compat_input(struct dlm_write_request *kb, + struct dlm_write_request32 *kb32, +- size_t count) ++ int namelen) + { + kb->version[0] = kb32->version[0]; + kb->version[1] = kb32->version[1]; +@@ -95,8 +96,7 @@ + kb->cmd == DLM_USER_REMOVE_LOCKSPACE) { + kb->i.lspace.flags = kb32->i.lspace.flags; + kb->i.lspace.minor = kb32->i.lspace.minor; +- memcpy(kb->i.lspace.name, kb32->i.lspace.name, count - +- offsetof(struct dlm_write_request32, i.lspace.name)); ++ memcpy(kb->i.lspace.name, kb32->i.lspace.name, namelen); + } else if (kb->cmd == DLM_USER_PURGE) { + kb->i.purge.nodeid = kb32->i.purge.nodeid; + kb->i.purge.pid = kb32->i.purge.pid; +@@ -114,8 +114,7 @@ + kb->i.lock.bastaddr = (void *)(long)kb32->i.lock.bastaddr; + kb->i.lock.lksb = (void *)(long)kb32->i.lock.lksb; + memcpy(kb->i.lock.lvb, kb32->i.lock.lvb, DLM_USER_LVB_LEN); +- memcpy(kb->i.lock.name, kb32->i.lock.name, count - +- offsetof(struct dlm_write_request32, i.lock.name)); ++ memcpy(kb->i.lock.name, kb32->i.lock.name, namelen); + } + } + +@@ -174,7 +173,7 @@ + /* we could possibly check if the cancel of an orphan has resulted in the lkb + being removed and then remove that lkb from the orphans list and free it */ + +-void dlm_user_add_ast(struct dlm_lkb *lkb, int type) ++void dlm_user_add_ast(struct dlm_lkb *lkb, int type, int bastmode) + { + struct dlm_ls *ls; + struct dlm_user_args *ua; +@@ -207,6 +206,8 @@ + + ast_type = lkb->lkb_ast_type; + lkb->lkb_ast_type |= type; ++ if (bastmode) ++ lkb->lkb_bastmode = bastmode; + + if (!ast_type) { + kref_get(&lkb->lkb_ref); +@@ -536,9 +537,16 @@ + #ifdef CONFIG_COMPAT + if (!kbuf->is64bit) { + struct dlm_write_request32 *k32buf; ++ int namelen = 0; ++ ++ if (count > sizeof(struct dlm_write_request32)) ++ namelen = count - sizeof(struct dlm_write_request32); ++ + k32buf = (struct dlm_write_request32 *)kbuf; +- kbuf = kmalloc(count + 1 + (sizeof(struct dlm_write_request) - +- sizeof(struct dlm_write_request32)), GFP_KERNEL); ++ ++ /* add 1 after namelen so that the name string is terminated */ ++ kbuf = kzalloc(sizeof(struct dlm_write_request) + namelen + 1, ++ GFP_KERNEL); + if (!kbuf) { + kfree(k32buf); + return -ENOMEM; +@@ -546,7 +554,8 @@ + + if (proc) + set_bit(DLM_PROC_FLAGS_COMPAT, &proc->flags); +- compat_input(kbuf, k32buf, count + 1); ++ ++ compat_input(kbuf, k32buf, namelen); + kfree(k32buf); + } + #endif +@@ -635,17 +644,13 @@ + struct dlm_user_proc *proc; + struct dlm_ls *ls; + +- lock_kernel(); + ls = dlm_find_lockspace_device(iminor(inode)); +- if (!ls) { +- unlock_kernel(); ++ if (!ls) + return -ENOENT; +- } + + proc = kzalloc(sizeof(struct dlm_user_proc), GFP_KERNEL); + if (!proc) { + dlm_put_lockspace(ls); +- unlock_kernel(); + return -ENOMEM; + } + +@@ -657,7 +662,6 @@ + spin_lock_init(&proc->locks_spin); + init_waitqueue_head(&proc->wait); + file->private_data = proc; +- unlock_kernel(); + + return 0; + } +@@ -890,9 +894,28 @@ + return 0; + } + ++int dlm_user_daemon_available(void) ++{ ++ /* dlm_controld hasn't started (or, has started, but not ++ properly populated configfs) */ ++ ++ if (!dlm_our_nodeid()) ++ return 0; ++ ++ /* This is to deal with versions of dlm_controld that don't ++ know about the monitor device. We assume that if the ++ dlm_controld was started (above), but the monitor device ++ was never opened, that it's an old version. dlm_controld ++ should open the monitor device before populating configfs. */ ++ ++ if (dlm_monitor_unused) ++ return 1; ++ ++ return atomic_read(&dlm_monitor_opened) ? 1 : 0; ++} ++ + static int ctl_device_open(struct inode *inode, struct file *file) + { +- cycle_kernel_lock(); + file->private_data = NULL; + return 0; + } +@@ -902,6 +925,20 @@ + return 0; + } + ++static int monitor_device_open(struct inode *inode, struct file *file) ++{ ++ atomic_inc(&dlm_monitor_opened); ++ dlm_monitor_unused = 0; ++ return 0; ++} ++ ++static int monitor_device_close(struct inode *inode, struct file *file) ++{ ++ if (atomic_dec_and_test(&dlm_monitor_opened)) ++ dlm_stop_lockspaces(); ++ return 0; ++} ++ + static const struct file_operations device_fops = { + .open = device_open, + .release = device_close, +@@ -925,19 +962,42 @@ + .minor = MISC_DYNAMIC_MINOR, + }; + ++static const struct file_operations monitor_device_fops = { ++ .open = monitor_device_open, ++ .release = monitor_device_close, ++ .owner = THIS_MODULE, ++}; ++ ++static struct miscdevice monitor_device = { ++ .name = "dlm-monitor", ++ .fops = &monitor_device_fops, ++ .minor = MISC_DYNAMIC_MINOR, ++}; ++ + int __init dlm_user_init(void) + { + int error; + ++ atomic_set(&dlm_monitor_opened, 0); ++ + error = misc_register(&ctl_device); +- if (error) ++ if (error) { + log_print("misc_register failed for control device"); ++ goto out; ++ } + ++ error = misc_register(&monitor_device); ++ if (error) { ++ log_print("misc_register failed for monitor device"); ++ misc_deregister(&ctl_device); ++ } ++ out: + return error; + } + + void dlm_user_exit(void) + { + misc_deregister(&ctl_device); ++ misc_deregister(&monitor_device); + } + +diff -urN linux-2.6.27.19-5.1/fs/dlm/user.h linux-2.6.27.23-0.1.1/fs/dlm/user.h +--- linux-2.6.27.19-5.1/fs/dlm/user.h 2009-06-16 13:53:04.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/dlm/user.h 2009-06-16 13:39:31.000000000 +0100 +@@ -9,9 +9,10 @@ + #ifndef __USER_DOT_H__ + #define __USER_DOT_H__ + +-void dlm_user_add_ast(struct dlm_lkb *lkb, int type); ++void dlm_user_add_ast(struct dlm_lkb *lkb, int type, int bastmode); + int dlm_user_init(void); + void dlm_user_exit(void); + int dlm_device_deregister(struct dlm_ls *ls); ++int dlm_user_daemon_available(void); + + #endif +diff -urN linux-2.6.27.19-5.1/fs/dquot.c linux-2.6.27.23-0.1.1/fs/dquot.c +--- linux-2.6.27.19-5.1/fs/dquot.c 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/dquot.c 2009-06-16 13:39:37.000000000 +0100 +@@ -788,7 +788,7 @@ + continue; + if (!dqinit_needed(inode, type)) + continue; +- if (inode->i_state & (I_FREEING|I_WILL_FREE)) ++ if (inode->i_state & (I_FREEING|I_CLEAR|I_WILL_FREE)) + continue; + + __iget(inode); +diff -urN linux-2.6.27.19-5.1/fs/drop_caches.c linux-2.6.27.23-0.1.1/fs/drop_caches.c +--- linux-2.6.27.19-5.1/fs/drop_caches.c 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/drop_caches.c 2009-06-16 13:39:37.000000000 +0100 +@@ -18,7 +18,7 @@ + + spin_lock(&inode_lock); + list_for_each_entry(inode, &sb->s_inodes, i_sb_list) { +- if (inode->i_state & (I_FREEING|I_WILL_FREE)) ++ if (inode->i_state & (I_FREEING|I_CLEAR|I_WILL_FREE)) + continue; + if (inode->i_mapping->nrpages == 0) + continue; +diff -urN linux-2.6.27.19-5.1/fs/exec.c linux-2.6.27.23-0.1.1/fs/exec.c +--- linux-2.6.27.19-5.1/fs/exec.c 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/exec.c 2009-06-16 13:39:37.000000000 +0100 +@@ -1098,9 +1098,7 @@ + { + int unsafe = tracehook_unsafe_exec(p); + +- if (atomic_read(&p->fs->count) > 1 || +- atomic_read(&p->files->count) > 1 || +- atomic_read(&p->sighand->count) > 1) ++ if (atomic_read(&p->fs->count) > 1) + unsafe |= LSM_UNSAFE_SHARE; + + return unsafe; +diff -urN linux-2.6.27.19-5.1/fs/ext2/namei.c linux-2.6.27.23-0.1.1/fs/ext2/namei.c +--- linux-2.6.27.19-5.1/fs/ext2/namei.c 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/ext2/namei.c 2009-06-16 13:39:36.000000000 +0100 +@@ -355,7 +355,10 @@ + inode_dec_link_count(old_inode); + + if (dir_de) { +- ext2_set_link(old_inode, dir_de, dir_page, new_dir); ++ /* Set link only if parent has changed and thus avoid setting ++ * of mtime of the moved directory on a pure rename. */ ++ if (old_dir != new_dir) ++ ext2_set_link(old_inode, dir_de, dir_page, new_dir); + inode_dec_link_count(old_dir); + } + return 0; +diff -urN linux-2.6.27.19-5.1/fs/ext3/inode.c linux-2.6.27.23-0.1.1/fs/ext3/inode.c +--- linux-2.6.27.19-5.1/fs/ext3/inode.c 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/ext3/inode.c 2009-06-16 13:39:36.000000000 +0100 +@@ -1196,6 +1196,18 @@ + return err; + } + ++/* For ordered writepage and write_end functions */ ++static int journal_dirty_data_fn(handle_t *handle, struct buffer_head *bh) ++{ ++ /* ++ * Write could have mapped the buffer but it didn't copy the data in ++ * yet. So avoid filing such buffer into a transaction. ++ */ ++ if (buffer_mapped(bh) && buffer_uptodate(bh)) ++ return ext3_journal_dirty_data(handle, bh); ++ return 0; ++} ++ + /* For write_end() in data=journal mode */ + static int write_end_fn(handle_t *handle, struct buffer_head *bh) + { +@@ -1206,26 +1218,29 @@ + } + + /* +- * Generic write_end handler for ordered and writeback ext3 journal modes. +- * We can't use generic_write_end, because that unlocks the page and we need to +- * unlock the page after ext3_journal_stop, but ext3_journal_stop must run +- * after block_write_end. +- */ +-static int ext3_generic_write_end(struct file *file, +- struct address_space *mapping, +- loff_t pos, unsigned len, unsigned copied, +- struct page *page, void *fsdata) +-{ +- struct inode *inode = file->f_mapping->host; +- +- copied = block_write_end(file, mapping, pos, len, copied, page, fsdata); +- +- if (pos+copied > inode->i_size) { +- i_size_write(inode, pos+copied); +- mark_inode_dirty(inode); ++ * This is nasty and subtle: ext3_write_begin() could have allocated blocks ++ * for the whole page but later we failed to copy the data in. So the disk ++ * size we really have allocated is pos + len (block_write_end() has zeroed ++ * the freshly allocated buffers so we aren't going to write garbage). But we ++ * want to keep i_size at the place where data copying finished so that we ++ * don't confuse readers. The worst what can happen is that we expose a page ++ * of zeros at the end of file after a crash... ++ */ ++static void update_file_sizes(struct inode *inode, loff_t pos, unsigned len, ++ unsigned copied) ++{ ++ int mark_dirty = 0; ++ ++ if (pos + len > EXT3_I(inode)->i_disksize) { ++ mark_dirty = 1; ++ EXT3_I(inode)->i_disksize = pos + len; ++ } ++ if (pos + copied > inode->i_size) { ++ i_size_write(inode, pos + copied); ++ mark_dirty = 1; + } +- +- return copied; ++ if (mark_dirty) ++ mark_inode_dirty(inode); + } + + /* +@@ -1245,29 +1260,17 @@ + unsigned from, to; + int ret = 0, ret2; + ++ copied = block_write_end(file, mapping, pos, len, copied, page, fsdata); ++ ++ /* See comment at update_file_sizes() for why we check buffers upto ++ * from + len */ + from = pos & (PAGE_CACHE_SIZE - 1); + to = from + len; +- + ret = walk_page_buffers(handle, page_buffers(page), +- from, to, NULL, ext3_journal_dirty_data); +- +- if (ret == 0) { +- /* +- * generic_write_end() will run mark_inode_dirty() if i_size +- * changes. So let's piggyback the i_disksize mark_inode_dirty +- * into that. +- */ +- loff_t new_i_size; ++ from, to, NULL, journal_dirty_data_fn); + +- new_i_size = pos + copied; +- if (new_i_size > EXT3_I(inode)->i_disksize) +- EXT3_I(inode)->i_disksize = new_i_size; +- ret2 = ext3_generic_write_end(file, mapping, pos, len, copied, +- page, fsdata); +- copied = ret2; +- if (ret2 < 0) +- ret = ret2; +- } ++ if (ret == 0) ++ update_file_sizes(inode, pos, len, copied); + ret2 = ext3_journal_stop(handle); + if (!ret) + ret = ret2; +@@ -1284,22 +1287,11 @@ + { + handle_t *handle = ext3_journal_current_handle(); + struct inode *inode = file->f_mapping->host; +- int ret = 0, ret2; +- loff_t new_i_size; +- +- new_i_size = pos + copied; +- if (new_i_size > EXT3_I(inode)->i_disksize) +- EXT3_I(inode)->i_disksize = new_i_size; +- +- ret2 = ext3_generic_write_end(file, mapping, pos, len, copied, +- page, fsdata); +- copied = ret2; +- if (ret2 < 0) +- ret = ret2; ++ int ret; + +- ret2 = ext3_journal_stop(handle); +- if (!ret) +- ret = ret2; ++ copied = block_write_end(file, mapping, pos, len, copied, page, fsdata); ++ update_file_sizes(inode, pos, len, copied); ++ ret = ext3_journal_stop(handle); + unlock_page(page); + page_cache_release(page); + +@@ -1413,13 +1405,6 @@ + return 0; + } + +-static int journal_dirty_data_fn(handle_t *handle, struct buffer_head *bh) +-{ +- if (buffer_mapped(bh)) +- return ext3_journal_dirty_data(handle, bh); +- return 0; +-} +- + /* + * Note that we always start a transaction even if we're not journalling + * data. This is to preserve ordering: any hole instantiation within +diff -urN linux-2.6.27.19-5.1/fs/ext4/extents.c linux-2.6.27.23-0.1.1/fs/ext4/extents.c +--- linux-2.6.27.19-5.1/fs/ext4/extents.c 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/ext4/extents.c 2009-06-16 13:39:36.000000000 +0100 +@@ -2664,6 +2664,8 @@ + if (allocated > max_blocks) + allocated = max_blocks; + set_buffer_unwritten(bh_result); ++ bh_result->b_bdev = inode->i_sb->s_bdev; ++ bh_result->b_blocknr = newblock; + goto out2; + } + +diff -urN linux-2.6.27.19-5.1/fs/ext4/inode.c linux-2.6.27.23-0.1.1/fs/ext4/inode.c +--- linux-2.6.27.19-5.1/fs/ext4/inode.c 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/ext4/inode.c 2009-06-16 13:39:36.000000000 +0100 +@@ -600,7 +600,9 @@ + ar.goal = goal; + ar.len = target; + ar.logical = iblock; +- ar.flags = EXT4_MB_HINT_DATA; ++ if (S_ISREG(inode->i_mode)) ++ /* preallocate only for regular files */ ++ ar.flags = EXT4_MB_HINT_DATA; + + current_block = ext4_mb_new_blocks(handle, &ar, err); + +@@ -1056,6 +1058,7 @@ + int retval; + + clear_buffer_mapped(bh); ++ clear_buffer_unwritten(bh); + + /* + * Try to see if we can get the block without requesting +@@ -1086,6 +1089,18 @@ + return retval; + + /* ++ * When we call get_blocks without the create flag, the ++ * BH_Unwritten flag could have gotten set if the blocks ++ * requested were part of a uninitialized extent. We need to ++ * clear this flag now that we are committed to convert all or ++ * part of the uninitialized extent to be an initialized ++ * extent. This is because we need to avoid the combination ++ * of BH_Unwritten and BH_Mapped flags being simultaneously ++ * set on the buffer_head. ++ */ ++ clear_buffer_unwritten(bh); ++ ++ /* + * New blocks allocate and/or writing to uninitialized extent + * will possibly result in updating i_data, so we take + * the write lock of i_data_sem, and call get_blocks() +@@ -2188,6 +2203,10 @@ + struct buffer_head *bh_result, int create) + { + int ret = 0; ++ sector_t invalid_block = ~((sector_t) 0xffff); ++ ++ if (invalid_block < ext4_blocks_count(EXT4_SB(inode->i_sb)->s_es)) ++ invalid_block = ~0; + + BUG_ON(create == 0); + BUG_ON(bh_result->b_size != inode->i_sb->s_blocksize); +@@ -2209,11 +2228,18 @@ + /* not enough space to reserve */ + return ret; + +- map_bh(bh_result, inode->i_sb, 0); ++ map_bh(bh_result, inode->i_sb, invalid_block); + set_buffer_new(bh_result); + set_buffer_delay(bh_result); + } else if (ret > 0) { + bh_result->b_size = (ret << inode->i_blkbits); ++ /* ++ * With sub-block writes into unwritten extents ++ * we also need to mark the buffer as new so that ++ * the unwritten parts of the buffer gets correctly zeroed. ++ */ ++ if (buffer_unwritten(bh_result)) ++ set_buffer_new(bh_result); + ret = 0; + } + +diff -urN linux-2.6.27.19-5.1/fs/fcntl.c linux-2.6.27.23-0.1.1/fs/fcntl.c +--- linux-2.6.27.19-5.1/fs/fcntl.c 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/fcntl.c 2009-06-16 13:39:37.000000000 +0100 +@@ -117,11 +117,12 @@ + { + if (unlikely(newfd == oldfd)) { /* corner case */ + struct files_struct *files = current->files; ++ int retval = oldfd; + rcu_read_lock(); + if (!fcheck_files(files, oldfd)) +- oldfd = -EBADF; ++ retval = -EBADF; + rcu_read_unlock(); +- return oldfd; ++ return retval; + } + return sys_dup3(oldfd, newfd, 0); + } +diff -urN linux-2.6.27.19-5.1/fs/fs-writeback.c linux-2.6.27.23-0.1.1/fs/fs-writeback.c +--- linux-2.6.27.19-5.1/fs/fs-writeback.c 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/fs-writeback.c 2009-06-16 13:39:37.000000000 +0100 +@@ -274,6 +274,7 @@ + int ret; + + BUG_ON(inode->i_state & I_SYNC); ++ WARN_ON(inode->i_state & I_NEW); + + /* Set I_SYNC, reset I_DIRTY */ + dirty = inode->i_state & I_DIRTY; +@@ -298,6 +299,7 @@ + } + + spin_lock(&inode_lock); ++ WARN_ON(inode->i_state & I_NEW); + inode->i_state &= ~I_SYNC; + if (!(inode->i_state & I_FREEING)) { + if (!(inode->i_state & I_DIRTY) && +@@ -470,6 +472,11 @@ + break; + } + ++ if (inode->i_state & I_NEW) { ++ requeue_io(inode); ++ continue; ++ } ++ + if (wbc->nonblocking && bdi_write_congested(bdi)) { + wbc->encountered_congestion = 1; + if (!sb_is_blkdev_sb(sb)) +@@ -531,7 +538,8 @@ + list_for_each_entry(inode, &sb->s_inodes, i_sb_list) { + struct address_space *mapping; + +- if (inode->i_state & (I_FREEING|I_WILL_FREE)) ++ if (inode->i_state & ++ (I_FREEING|I_CLEAR|I_WILL_FREE|I_NEW)) + continue; + mapping = inode->i_mapping; + if (mapping->nrpages == 0) +diff -urN linux-2.6.27.19-5.1/fs/hugetlbfs/inode.c linux-2.6.27.23-0.1.1/fs/hugetlbfs/inode.c +--- linux-2.6.27.19-5.1/fs/hugetlbfs/inode.c 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/hugetlbfs/inode.c 2009-06-16 13:39:37.000000000 +0100 +@@ -26,7 +26,6 @@ + #include + #include + #include +-#include + #include + #include + #include +@@ -838,7 +837,7 @@ + bad_val: + printk(KERN_ERR "hugetlbfs: Bad value '%s' for mount option '%s'\n", + args[0].from, p); +- return 1; ++ return -EINVAL; + } + + static int +diff -urN linux-2.6.27.19-5.1/fs/inode.c linux-2.6.27.23-0.1.1/fs/inode.c +--- linux-2.6.27.19-5.1/fs/inode.c 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/inode.c 2009-06-16 13:39:37.000000000 +0100 +@@ -339,6 +339,7 @@ + invalidate_inode_buffers(inode); + if (!atomic_read(&inode->i_count)) { + list_move(&inode->i_list, dispose); ++ WARN_ON(inode->i_state & I_NEW); + inode->i_state |= I_FREEING; + count++; + continue; +@@ -440,6 +441,7 @@ + continue; + } + list_move(&inode->i_list, &freeable); ++ WARN_ON(inode->i_state & I_NEW); + inode->i_state |= I_FREEING; + nr_pruned++; + } +@@ -595,6 +597,7 @@ + * just created it (so there can be no old holders + * that haven't tested I_LOCK). + */ ++ WARN_ON((inode->i_state & (I_LOCK|I_NEW)) != (I_LOCK|I_NEW)); + inode->i_state &= ~(I_LOCK|I_NEW); + wake_up_inode(inode); + } +@@ -1041,6 +1044,7 @@ + + list_del_init(&inode->i_list); + list_del_init(&inode->i_sb_list); ++ WARN_ON(inode->i_state & I_NEW); + inode->i_state |= I_FREEING; + inodes_stat.nr_inodes--; + spin_unlock(&inode_lock); +@@ -1082,16 +1086,19 @@ + spin_unlock(&inode_lock); + return; + } ++ WARN_ON(inode->i_state & I_NEW); + inode->i_state |= I_WILL_FREE; + spin_unlock(&inode_lock); + write_inode_now(inode, 1); + spin_lock(&inode_lock); ++ WARN_ON(inode->i_state & I_NEW); + inode->i_state &= ~I_WILL_FREE; + inodes_stat.nr_unused--; + hlist_del_init(&inode->i_hash); + } + list_del_init(&inode->i_list); + list_del_init(&inode->i_sb_list); ++ WARN_ON(inode->i_state & I_NEW); + inode->i_state |= I_FREEING; + inodes_stat.nr_inodes--; + spin_unlock(&inode_lock); +diff -urN linux-2.6.27.19-5.1/fs/inotify.c linux-2.6.27.23-0.1.1/fs/inotify.c +--- linux-2.6.27.19-5.1/fs/inotify.c 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/inotify.c 2009-06-16 13:39:37.000000000 +0100 +@@ -156,7 +156,7 @@ + int ret; + + do { +- if (unlikely(!idr_pre_get(&ih->idr, GFP_KERNEL))) ++ if (unlikely(!idr_pre_get(&ih->idr, GFP_NOFS))) + return -ENOSPC; + ret = idr_get_new_above(&ih->idr, watch, ih->last_wd+1, &watch->wd); + } while (ret == -EAGAIN); +diff -urN linux-2.6.27.19-5.1/fs/jffs2/readinode.c linux-2.6.27.23-0.1.1/fs/jffs2/readinode.c +--- linux-2.6.27.19-5.1/fs/jffs2/readinode.c 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/jffs2/readinode.c 2009-06-16 13:39:36.000000000 +0100 +@@ -220,7 +220,7 @@ + struct jffs2_tmp_dnode_info *tn) + { + uint32_t fn_end = tn->fn->ofs + tn->fn->size; +- struct jffs2_tmp_dnode_info *this; ++ struct jffs2_tmp_dnode_info *this, *ptn; + + dbg_readinode("insert fragment %#04x-%#04x, ver %u at %08x\n", tn->fn->ofs, fn_end, tn->version, ref_offset(tn->fn->raw)); + +@@ -251,11 +251,18 @@ + if (this) { + /* If the node is coincident with another at a lower address, + back up until the other node is found. It may be relevant */ +- while (this->overlapped) +- this = tn_prev(this); +- +- /* First node should never be marked overlapped */ +- BUG_ON(!this); ++ while (this->overlapped) { ++ ptn = tn_prev(this); ++ if (!ptn) { ++ /* ++ * We killed a node which set the overlapped ++ * flags during the scan. Fix it up. ++ */ ++ this->overlapped = 0; ++ break; ++ } ++ this = ptn; ++ } + dbg_readinode("'this' found %#04x-%#04x (%s)\n", this->fn->ofs, this->fn->ofs + this->fn->size, this->fn ? "data" : "hole"); + } + +@@ -360,7 +367,17 @@ + } + if (!this->overlapped) + break; +- this = tn_prev(this); ++ ++ ptn = tn_prev(this); ++ if (!ptn) { ++ /* ++ * We killed a node which set the overlapped ++ * flags during the scan. Fix it up. ++ */ ++ this->overlapped = 0; ++ break; ++ } ++ this = ptn; + } + } + +@@ -456,8 +473,15 @@ + eat_last(&rii->tn_root, &last->rb); + ver_insert(&ver_root, last); + +- if (unlikely(last->overlapped)) +- continue; ++ if (unlikely(last->overlapped)) { ++ if (pen) ++ continue; ++ /* ++ * We killed a node which set the overlapped ++ * flags during the scan. Fix it up. ++ */ ++ last->overlapped = 0; ++ } + + /* Now we have a bunch of nodes in reverse version + order, in the tree at ver_root. Most of the time, +diff -urN linux-2.6.27.19-5.1/fs/nfs/dir.c linux-2.6.27.23-0.1.1/fs/nfs/dir.c +--- linux-2.6.27.19-5.1/fs/nfs/dir.c 2009-06-16 13:53:04.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/nfs/dir.c 2009-06-16 13:39:31.000000000 +0100 +@@ -1880,8 +1880,14 @@ + cache.cred = cred; + cache.jiffies = jiffies; + status = NFS_PROTO(inode)->access(inode, &cache); +- if (status != 0) ++ if (status != 0) { ++ if (status == -ESTALE) { ++ nfs_zap_caches(inode); ++ if (!S_ISDIR(inode->i_mode)) ++ set_bit(NFS_INO_STALE, &NFS_I(inode)->flags); ++ } + return status; ++ } + nfs_access_add_cache(inode, &cache); + out: + if ((mask & ~cache.mask & (MAY_READ | MAY_WRITE | MAY_EXEC)) == 0) +diff -urN linux-2.6.27.19-5.1/fs/nfs/nfs3acl.c linux-2.6.27.23-0.1.1/fs/nfs/nfs3acl.c +--- linux-2.6.27.19-5.1/fs/nfs/nfs3acl.c 2009-06-16 13:53:04.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/nfs/nfs3acl.c 2009-06-16 13:39:31.000000000 +0100 +@@ -291,7 +291,7 @@ + { + struct nfs_server *server = NFS_SERVER(inode); + struct nfs_fattr fattr; +- struct page *pages[NFSACL_MAXPAGES] = { }; ++ struct page *pages[NFSACL_MAXPAGES]; + struct nfs3_setaclargs args = { + .inode = inode, + .mask = NFS_ACL, +@@ -302,7 +302,7 @@ + .rpc_argp = &args, + .rpc_resp = &fattr, + }; +- int status, count; ++ int status; + + status = -EOPNOTSUPP; + if (!nfs_server_capable(inode, NFS_CAP_ACLS)) +@@ -318,6 +318,20 @@ + if (S_ISDIR(inode->i_mode)) { + args.mask |= NFS_DFACL; + args.acl_default = dfacl; ++ args.len = nfsacl_size(acl, dfacl); ++ } else ++ args.len = nfsacl_size(acl, NULL); ++ ++ if (args.len > NFS_ACL_INLINE_BUFSIZE) { ++ unsigned int npages = 1 + ((args.len - 1) >> PAGE_SHIFT); ++ ++ status = -ENOMEM; ++ do { ++ args.pages[args.npages] = alloc_page(GFP_KERNEL); ++ if (args.pages[args.npages] == NULL) ++ goto out_freepages; ++ args.npages++; ++ } while (args.npages < npages); + } + + dprintk("NFS call setacl\n"); +@@ -327,10 +341,6 @@ + nfs_zap_acl_cache(inode); + dprintk("NFS reply setacl: %d\n", status); + +- /* pages may have been allocated at the xdr layer. */ +- for (count = 0; count < NFSACL_MAXPAGES && args.pages[count]; count++) +- __free_page(args.pages[count]); +- + switch (status) { + case 0: + status = nfs_refresh_inode(inode, &fattr); +@@ -344,6 +354,11 @@ + case -ENOTSUPP: + status = -EOPNOTSUPP; + } ++out_freepages: ++ while (args.npages != 0) { ++ args.npages--; ++ __free_page(args.pages[args.npages]); ++ } + out: + return status; + } +diff -urN linux-2.6.27.19-5.1/fs/nfs/nfs3xdr.c linux-2.6.27.23-0.1.1/fs/nfs/nfs3xdr.c +--- linux-2.6.27.19-5.1/fs/nfs/nfs3xdr.c 2009-06-16 13:53:04.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/nfs/nfs3xdr.c 2009-06-16 13:39:31.000000000 +0100 +@@ -82,8 +82,10 @@ + #define NFS3_commitres_sz (1+NFS3_wcc_data_sz+2) + + #define ACL3_getaclargs_sz (NFS3_fh_sz+1) +-#define ACL3_setaclargs_sz (NFS3_fh_sz+1+2*(2+5*3)) +-#define ACL3_getaclres_sz (1+NFS3_post_op_attr_sz+1+2*(2+5*3)) ++#define ACL3_setaclargs_sz (NFS3_fh_sz+1+ \ ++ XDR_QUADLEN(NFS_ACL_INLINE_BUFSIZE)) ++#define ACL3_getaclres_sz (1+NFS3_post_op_attr_sz+1+ \ ++ XDR_QUADLEN(NFS_ACL_INLINE_BUFSIZE)) + #define ACL3_setaclres_sz (1+NFS3_post_op_attr_sz) + + /* +@@ -703,28 +705,19 @@ + struct nfs3_setaclargs *args) + { + struct xdr_buf *buf = &req->rq_snd_buf; +- unsigned int base, len_in_head, len = nfsacl_size( +- (args->mask & NFS_ACL) ? args->acl_access : NULL, +- (args->mask & NFS_DFACL) ? args->acl_default : NULL); +- int count, err; ++ unsigned int base; ++ int err; + + p = xdr_encode_fhandle(p, NFS_FH(args->inode)); + *p++ = htonl(args->mask); +- base = (char *)p - (char *)buf->head->iov_base; +- /* put as much of the acls into head as possible. */ +- len_in_head = min_t(unsigned int, buf->head->iov_len - base, len); +- len -= len_in_head; +- req->rq_slen = xdr_adjust_iovec(req->rq_svec, p + (len_in_head >> 2)); +- +- for (count = 0; (count << PAGE_SHIFT) < len; count++) { +- args->pages[count] = alloc_page(GFP_KERNEL); +- if (!args->pages[count]) { +- while (count) +- __free_page(args->pages[--count]); +- return -ENOMEM; +- } +- } +- xdr_encode_pages(buf, args->pages, 0, len); ++ req->rq_slen = xdr_adjust_iovec(req->rq_svec, p); ++ base = req->rq_slen; ++ ++ if (args->npages != 0) ++ xdr_encode_pages(buf, args->pages, 0, args->len); ++ else ++ req->rq_slen = xdr_adjust_iovec(req->rq_svec, ++ p + XDR_QUADLEN(args->len)); + + err = nfsacl_encode(buf, base, args->inode, + (args->mask & NFS_ACL) ? +diff -urN linux-2.6.27.19-5.1/fs/nfs4acl_base.c linux-2.6.27.23-0.1.1/fs/nfs4acl_base.c +--- linux-2.6.27.19-5.1/fs/nfs4acl_base.c 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/nfs4acl_base.c 2009-06-16 13:39:36.000000000 +0100 +@@ -29,9 +29,9 @@ + const char nfs4ace_group_who[] = "GROUP@"; + const char nfs4ace_everyone_who[] = "EVERYONE@"; + +-EXPORT_SYMBOL_GPL(nfs4ace_owner_who); +-EXPORT_SYMBOL_GPL(nfs4ace_group_who); +-EXPORT_SYMBOL_GPL(nfs4ace_everyone_who); ++EXPORT_SYMBOL(nfs4ace_owner_who); ++EXPORT_SYMBOL(nfs4ace_group_who); ++EXPORT_SYMBOL(nfs4ace_everyone_who); + + /** + * nfs4acl_alloc - allocate an acl +@@ -50,7 +50,7 @@ + } + return acl; + } +-EXPORT_SYMBOL_GPL(nfs4acl_alloc); ++EXPORT_SYMBOL(nfs4acl_alloc); + + /** + * nfs4acl_clone - create a copy of an acl +@@ -113,7 +113,7 @@ + nfs4acl_mask_to_mode(acl->a_group_mask) << 3 | + nfs4acl_mask_to_mode(acl->a_other_mask); + } +-EXPORT_SYMBOL_GPL(nfs4acl_masks_to_mode); ++EXPORT_SYMBOL(nfs4acl_masks_to_mode); + + static unsigned int + nfs4acl_mode_to_mask(mode_t mode) +@@ -172,7 +172,7 @@ + } + return clone; + } +-EXPORT_SYMBOL_GPL(nfs4acl_chmod); ++EXPORT_SYMBOL(nfs4acl_chmod); + + /** + * nfs4acl_want_to_mask - convert permission want argument to a mask +@@ -196,7 +196,7 @@ + + return mask; + } +-EXPORT_SYMBOL_GPL(nfs4acl_want_to_mask); ++EXPORT_SYMBOL(nfs4acl_want_to_mask); + + /** + * nfs4acl_capability_check - check for capabilities overriding read/write access +@@ -328,7 +328,7 @@ + return 0; + return nfs4acl_capability_check(inode, requested); + } +-EXPORT_SYMBOL_GPL(nfs4acl_permission); ++EXPORT_SYMBOL(nfs4acl_permission); + + /** + * nfs4acl_generic_permission - permission check algorithm without explicit acl +@@ -353,7 +353,7 @@ + return 0; + return nfs4acl_capability_check(inode, mask); + } +-EXPORT_SYMBOL_GPL(nfs4acl_generic_permission); ++EXPORT_SYMBOL(nfs4acl_generic_permission); + + /* + * nfs4ace_is_same_who - do both acl entries refer to the same identifier? +@@ -393,7 +393,7 @@ + ace->e_flags &= ~ACE4_IDENTIFIER_GROUP; + return 0; + } +-EXPORT_SYMBOL_GPL(nfs4ace_set_who); ++EXPORT_SYMBOL(nfs4ace_set_who); + + /** + * nfs4acl_allowed_to_who - mask flags allowed to a specific who value +@@ -570,4 +570,4 @@ + + return acl; + } +-EXPORT_SYMBOL_GPL(nfs4acl_inherit); ++EXPORT_SYMBOL(nfs4acl_inherit); +diff -urN linux-2.6.27.19-5.1/fs/nfs4acl_compat.c linux-2.6.27.23-0.1.1/fs/nfs4acl_compat.c +--- linux-2.6.27.19-5.1/fs/nfs4acl_compat.c 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/nfs4acl_compat.c 2009-06-16 13:39:37.000000000 +0100 +@@ -733,7 +733,7 @@ + *acl = x.acl; + return retval; + } +-EXPORT_SYMBOL_GPL(nfs4acl_apply_masks); ++EXPORT_SYMBOL(nfs4acl_apply_masks); + + int nfs4acl_write_through(struct nfs4acl **acl) + { +diff -urN linux-2.6.27.19-5.1/fs/nfs4acl_xattr.c linux-2.6.27.23-0.1.1/fs/nfs4acl_xattr.c +--- linux-2.6.27.19-5.1/fs/nfs4acl_xattr.c 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/nfs4acl_xattr.c 2009-06-16 13:39:37.000000000 +0100 +@@ -91,7 +91,7 @@ + nfs4acl_put(acl); + return ERR_PTR(-EINVAL); + } +-EXPORT_SYMBOL_GPL(nfs4acl_from_xattr); ++EXPORT_SYMBOL(nfs4acl_from_xattr); + + size_t + nfs4acl_xattr_size(const struct nfs4acl *acl) +@@ -106,7 +106,7 @@ + } + return size; + } +-EXPORT_SYMBOL_GPL(nfs4acl_xattr_size); ++EXPORT_SYMBOL(nfs4acl_xattr_size); + + void + nfs4acl_to_xattr(const struct nfs4acl *acl, void *buffer) +@@ -143,4 +143,4 @@ + } + } + } +-EXPORT_SYMBOL_GPL(nfs4acl_to_xattr); ++EXPORT_SYMBOL(nfs4acl_to_xattr); +diff -urN linux-2.6.27.19-5.1/fs/nfsd/nfs4xdr.c linux-2.6.27.23-0.1.1/fs/nfsd/nfs4xdr.c +--- linux-2.6.27.19-5.1/fs/nfsd/nfs4xdr.c 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/nfsd/nfs4xdr.c 2009-06-16 13:39:36.000000000 +0100 +@@ -2593,6 +2593,7 @@ + [OP_LOOKUPP] = (nfsd4_enc)nfsd4_encode_noop, + [OP_NVERIFY] = (nfsd4_enc)nfsd4_encode_noop, + [OP_OPEN] = (nfsd4_enc)nfsd4_encode_open, ++ [OP_OPENATTR] = (nfsd4_enc)nfsd4_encode_noop, + [OP_OPEN_CONFIRM] = (nfsd4_enc)nfsd4_encode_open_confirm, + [OP_OPEN_DOWNGRADE] = (nfsd4_enc)nfsd4_encode_open_downgrade, + [OP_PUTFH] = (nfsd4_enc)nfsd4_encode_noop, +diff -urN linux-2.6.27.19-5.1/fs/ocfs2/alloc.c linux-2.6.27.23-0.1.1/fs/ocfs2/alloc.c +--- linux-2.6.27.19-5.1/fs/ocfs2/alloc.c 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/ocfs2/alloc.c 2009-06-16 13:39:36.000000000 +0100 +@@ -174,7 +174,8 @@ + + BUG_ON(OCFS2_I(inode)->ip_dyn_features & OCFS2_INLINE_DATA_FL); + mlog_bug_on_msg(!ocfs2_sparse_alloc(osb) && +- (OCFS2_I(inode)->ip_clusters != rec->e_cpos), ++ (OCFS2_I(inode)->ip_clusters != ++ le32_to_cpu(rec->e_cpos)), + "Device %s, asking for sparse allocation: inode %llu, " + "cpos %u, clusters %u\n", + osb->dev_str, +@@ -4708,6 +4709,29 @@ + return ret; + } + ++static int ocfs2_replace_extent_rec(struct inode *inode, ++ handle_t *handle, ++ struct ocfs2_path *path, ++ struct ocfs2_extent_list *el, ++ int split_index, ++ struct ocfs2_extent_rec *split_rec) ++{ ++ int ret; ++ ++ ret = ocfs2_journal_access(handle, inode, path_leaf_bh(path), ++ OCFS2_JOURNAL_ACCESS_WRITE); ++ if (ret) { ++ mlog_errno(ret); ++ goto out; ++ } ++ ++ el->l_recs[split_index] = *split_rec; ++ ++ ocfs2_journal_dirty(handle, path_leaf_bh(path)); ++out: ++ return ret; ++} ++ + /* + * Mark part or all of the extent record at split_index in the leaf + * pointed to by path as written. This removes the unwritten +@@ -4802,7 +4826,9 @@ + + if (ctxt.c_contig_type == CONTIG_NONE) { + if (ctxt.c_split_covers_rec) +- el->l_recs[split_index] = *split_rec; ++ ret = ocfs2_replace_extent_rec(inode, handle, ++ path, el, ++ split_index, split_rec); + else + ret = ocfs2_split_and_insert(inode, handle, path, et, + &last_eb_bh, split_index, +@@ -5307,6 +5333,9 @@ + goto out; + } + ++ vfs_dq_free_space_nodirty(inode, ++ ocfs2_clusters_to_bytes(inode->i_sb, len)); ++ + ret = ocfs2_remove_extent(inode, et, cpos, len, handle, meta_ac, + dealloc); + if (ret) { +diff -urN linux-2.6.27.19-5.1/fs/ocfs2/aops.c linux-2.6.27.23-0.1.1/fs/ocfs2/aops.c +--- linux-2.6.27.19-5.1/fs/ocfs2/aops.c 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/ocfs2/aops.c 2009-06-16 13:39:36.000000000 +0100 +@@ -234,7 +234,7 @@ + size = i_size_read(inode); + + if (size > PAGE_CACHE_SIZE || +- size > ocfs2_max_inline_data(inode->i_sb)) { ++ size > ocfs2_max_inline_data_with_xattr(inode->i_sb, di)) { + ocfs2_error(inode->i_sb, + "Inode %llu has with inline data has bad size: %Lu", + (unsigned long long)OCFS2_I(inode)->ip_blkno, +@@ -1575,6 +1575,7 @@ + int ret, written = 0; + loff_t end = pos + len; + struct ocfs2_inode_info *oi = OCFS2_I(inode); ++ struct ocfs2_dinode *di = NULL; + + mlog(0, "Inode %llu, write of %u bytes at off %llu. features: 0x%x\n", + (unsigned long long)oi->ip_blkno, len, (unsigned long long)pos, +@@ -1607,7 +1608,9 @@ + /* + * Check whether the write can fit. + */ +- if (mmap_page || end > ocfs2_max_inline_data(inode->i_sb)) ++ di = (struct ocfs2_dinode *)wc->w_di_bh->b_data; ++ if (mmap_page || ++ end > ocfs2_max_inline_data_with_xattr(inode->i_sb, di)) + return 0; + + do_inline_write: +diff -urN linux-2.6.27.19-5.1/fs/ocfs2/dcache.c linux-2.6.27.23-0.1.1/fs/ocfs2/dcache.c +--- linux-2.6.27.19-5.1/fs/ocfs2/dcache.c 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/ocfs2/dcache.c 2009-06-16 13:39:36.000000000 +0100 +@@ -38,6 +38,7 @@ + #include "dlmglue.h" + #include "file.h" + #include "inode.h" ++#include "super.h" + + + static int ocfs2_dentry_revalidate(struct dentry *dentry, +@@ -294,6 +295,34 @@ + return ret; + } + ++static DEFINE_SPINLOCK(dentry_list_lock); ++ ++/* We limit the number of dentry locks to drop in one go. We have ++ * this limit so that we don't starve other users of ocfs2_wq. */ ++#define DL_INODE_DROP_COUNT 64 ++ ++/* Drop inode references from dentry locks */ ++void ocfs2_drop_dl_inodes(struct work_struct *work) ++{ ++ struct ocfs2_super *osb = container_of(work, struct ocfs2_super, ++ dentry_lock_work); ++ struct ocfs2_dentry_lock *dl; ++ int drop_count = DL_INODE_DROP_COUNT; ++ ++ spin_lock(&dentry_list_lock); ++ while (osb->dentry_lock_list && drop_count--) { ++ dl = osb->dentry_lock_list; ++ osb->dentry_lock_list = dl->dl_next; ++ spin_unlock(&dentry_list_lock); ++ iput(dl->dl_inode); ++ kfree(dl); ++ spin_lock(&dentry_list_lock); ++ } ++ if (osb->dentry_lock_list) ++ queue_work(ocfs2_wq, &osb->dentry_lock_work); ++ spin_unlock(&dentry_list_lock); ++} ++ + /* + * ocfs2_dentry_iput() and friends. + * +@@ -318,16 +347,23 @@ + static void ocfs2_drop_dentry_lock(struct ocfs2_super *osb, + struct ocfs2_dentry_lock *dl) + { +- iput(dl->dl_inode); + ocfs2_simple_drop_lockres(osb, &dl->dl_lockres); + ocfs2_lock_res_free(&dl->dl_lockres); +- kfree(dl); ++ ++ /* We leave dropping of inode reference to ocfs2_wq as that can ++ * possibly lead to inode deletion which gets tricky */ ++ spin_lock(&dentry_list_lock); ++ if (!osb->dentry_lock_list) ++ queue_work(ocfs2_wq, &osb->dentry_lock_work); ++ dl->dl_next = osb->dentry_lock_list; ++ osb->dentry_lock_list = dl; ++ spin_unlock(&dentry_list_lock); + } + + void ocfs2_dentry_lock_put(struct ocfs2_super *osb, + struct ocfs2_dentry_lock *dl) + { +- int unlock = 0; ++ int unlock; + + BUG_ON(dl->dl_count == 0); + +diff -urN linux-2.6.27.19-5.1/fs/ocfs2/dcache.h linux-2.6.27.23-0.1.1/fs/ocfs2/dcache.h +--- linux-2.6.27.19-5.1/fs/ocfs2/dcache.h 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/ocfs2/dcache.h 2009-06-16 13:39:36.000000000 +0100 +@@ -29,8 +29,13 @@ + extern struct dentry_operations ocfs2_dentry_ops; + + struct ocfs2_dentry_lock { ++ /* Use count of dentry lock */ + unsigned int dl_count; +- u64 dl_parent_blkno; ++ union { ++ /* Linked list of dentry locks to release */ ++ struct ocfs2_dentry_lock *dl_next; ++ u64 dl_parent_blkno; ++ }; + + /* + * The ocfs2_dentry_lock keeps an inode reference until +@@ -47,6 +52,8 @@ + void ocfs2_dentry_lock_put(struct ocfs2_super *osb, + struct ocfs2_dentry_lock *dl); + ++void ocfs2_drop_dl_inodes(struct work_struct *work); ++ + struct dentry *ocfs2_find_local_alias(struct inode *inode, u64 parent_blkno, + int skip_unhashed); + +diff -urN linux-2.6.27.19-5.1/fs/ocfs2/dlm/dlmcommon.h linux-2.6.27.23-0.1.1/fs/ocfs2/dlm/dlmcommon.h +--- linux-2.6.27.19-5.1/fs/ocfs2/dlm/dlmcommon.h 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/ocfs2/dlm/dlmcommon.h 2009-06-16 13:39:36.000000000 +0100 +@@ -52,16 +52,12 @@ + enum dlm_mle_type { + DLM_MLE_BLOCK, + DLM_MLE_MASTER, +- DLM_MLE_MIGRATION +-}; +- +-struct dlm_lock_name { +- u8 len; +- u8 name[DLM_LOCKID_NAME_MAX]; ++ DLM_MLE_MIGRATION, ++ DLM_MLE_NUM_TYPES + }; + + struct dlm_master_list_entry { +- struct list_head list; ++ struct hlist_node master_hash_node; + struct list_head hb_events; + struct dlm_ctxt *dlm; + spinlock_t spinlock; +@@ -78,10 +74,10 @@ + enum dlm_mle_type type; + struct o2hb_callback_func mle_hb_up; + struct o2hb_callback_func mle_hb_down; +- union { +- struct dlm_lock_resource *res; +- struct dlm_lock_name name; +- } u; ++ struct dlm_lock_resource *mleres; ++ unsigned char mname[DLM_LOCKID_NAME_MAX]; ++ unsigned int mnamelen; ++ unsigned int mnamehash; + }; + + enum dlm_ast_type { +@@ -140,6 +136,7 @@ + unsigned int purge_count; + spinlock_t spinlock; + spinlock_t ast_lock; ++ spinlock_t track_lock; + char *name; + u8 node_num; + u32 key; +@@ -150,13 +147,14 @@ + unsigned long recovery_map[BITS_TO_LONGS(O2NM_MAX_NODES)]; + struct dlm_recovery_ctxt reco; + spinlock_t master_lock; +- struct list_head master_list; ++ struct hlist_head **master_hash; + struct list_head mle_hb_events; + + /* these give a really vague idea of the system load */ +- atomic_t local_resources; +- atomic_t remote_resources; +- atomic_t unknown_resources; ++ atomic_t mle_tot_count[DLM_MLE_NUM_TYPES]; ++ atomic_t mle_cur_count[DLM_MLE_NUM_TYPES]; ++ atomic_t res_tot_count; ++ atomic_t res_cur_count; + + struct dlm_debug_ctxt *dlm_debug_ctxt; + struct dentry *dlm_debugfs_subroot; +@@ -194,6 +192,13 @@ + return dlm->lockres_hash[(i / DLM_BUCKETS_PER_PAGE) % DLM_HASH_PAGES] + (i % DLM_BUCKETS_PER_PAGE); + } + ++static inline struct hlist_head *dlm_master_hash(struct dlm_ctxt *dlm, ++ unsigned i) ++{ ++ return dlm->master_hash[(i / DLM_BUCKETS_PER_PAGE) % DLM_HASH_PAGES] + ++ (i % DLM_BUCKETS_PER_PAGE); ++} ++ + /* these keventd work queue items are for less-frequently + * called functions that cannot be directly called from the + * net message handlers for some reason, usually because +@@ -316,6 +321,8 @@ + * put on a list for the dlm thread to run. */ + unsigned long last_used; + ++ struct dlm_ctxt *dlm; ++ + unsigned migration_pending:1; + atomic_t asts_reserved; + spinlock_t spinlock; +@@ -845,9 +852,7 @@ + unsigned int len); + + int dlm_is_host_down(int errno); +-void dlm_change_lockres_owner(struct dlm_ctxt *dlm, +- struct dlm_lock_resource *res, +- u8 owner); ++ + struct dlm_lock_resource * dlm_get_lock_resource(struct dlm_ctxt *dlm, + const char *lockid, + int namelen, +@@ -1005,6 +1010,9 @@ + DLM_LOCK_RES_MIGRATING)); + } + ++void __dlm_unlink_mle(struct dlm_ctxt *dlm, struct dlm_master_list_entry *mle); ++void __dlm_insert_mle(struct dlm_ctxt *dlm, struct dlm_master_list_entry *mle); ++ + /* create/destroy slab caches */ + int dlm_init_master_caches(void); + void dlm_destroy_master_caches(void); +@@ -1107,6 +1115,23 @@ + return bit; + } + ++static inline void dlm_set_lockres_owner(struct dlm_ctxt *dlm, ++ struct dlm_lock_resource *res, ++ u8 owner) ++{ ++ assert_spin_locked(&res->spinlock); ++ ++ res->owner = owner; ++} ++ ++static inline void dlm_change_lockres_owner(struct dlm_ctxt *dlm, ++ struct dlm_lock_resource *res, ++ u8 owner) ++{ ++ assert_spin_locked(&res->spinlock); + ++ if (owner != res->owner) ++ dlm_set_lockres_owner(dlm, res, owner); ++} + + #endif /* DLMCOMMON_H */ +diff -urN linux-2.6.27.19-5.1/fs/ocfs2/dlm/dlmdebug.c linux-2.6.27.23-0.1.1/fs/ocfs2/dlm/dlmdebug.c +--- linux-2.6.27.19-5.1/fs/ocfs2/dlm/dlmdebug.c 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/ocfs2/dlm/dlmdebug.c 2009-06-16 13:39:36.000000000 +0100 +@@ -287,18 +287,8 @@ + static int dump_mle(struct dlm_master_list_entry *mle, char *buf, int len) + { + int out = 0; +- unsigned int namelen; +- const char *name; + char *mle_type; + +- if (mle->type != DLM_MLE_MASTER) { +- namelen = mle->u.name.len; +- name = mle->u.name.name; +- } else { +- namelen = mle->u.res->lockname.len; +- name = mle->u.res->lockname.name; +- } +- + if (mle->type == DLM_MLE_BLOCK) + mle_type = "BLK"; + else if (mle->type == DLM_MLE_MASTER) +@@ -306,7 +296,7 @@ + else + mle_type = "MIG"; + +- out += stringify_lockname(name, namelen, buf + out, len - out); ++ out += stringify_lockname(mle->mname, mle->mnamelen, buf + out, len - out); + out += snprintf(buf + out, len - out, + "\t%3s\tmas=%3u\tnew=%3u\tevt=%1d\tuse=%1d\tref=%3d\n", + mle_type, mle->master, mle->new_master, +@@ -501,23 +491,33 @@ + static int debug_mle_print(struct dlm_ctxt *dlm, struct debug_buffer *db) + { + struct dlm_master_list_entry *mle; +- int out = 0; +- unsigned long total = 0; ++ struct hlist_head *bucket; ++ struct hlist_node *list; ++ int i, out = 0; ++ unsigned long total = 0, longest = 0, bktcnt; + + out += snprintf(db->buf + out, db->len - out, + "Dumping MLEs for Domain: %s\n", dlm->name); + + spin_lock(&dlm->master_lock); +- list_for_each_entry(mle, &dlm->master_list, list) { +- ++total; +- if (db->len - out < 200) +- continue; +- out += dump_mle(mle, db->buf + out, db->len - out); ++ for (i = 0; i < DLM_HASH_BUCKETS; i++) { ++ bucket = dlm_master_hash(dlm, i); ++ hlist_for_each(list, bucket) { ++ mle = hlist_entry(list, struct dlm_master_list_entry, ++ master_hash_node); ++ ++total; ++ ++bktcnt; ++ if (db->len - out < 200) ++ continue; ++ out += dump_mle(mle, db->buf + out, db->len - out); ++ } ++ longest = max(longest, bktcnt); ++ bktcnt = 0; + } + spin_unlock(&dlm->master_lock); + + out += snprintf(db->buf + out, db->len - out, +- "Total on list: %ld\n", total); ++ "Total: %ld, Longest: %ld\n", total, longest); + return out; + } + +@@ -630,43 +630,38 @@ + { + struct debug_lockres *dl = m->private; + struct dlm_ctxt *dlm = dl->dl_ctxt; ++ struct dlm_lock_resource *oldres = dl->dl_res; + struct dlm_lock_resource *res = NULL; ++ struct list_head *track_list; + +- spin_lock(&dlm->spinlock); ++ spin_lock(&dlm->track_lock); ++ if (oldres) ++ track_list = &oldres->tracking; ++ else ++ track_list = &dlm->tracking_list; + +- if (dl->dl_res) { +- list_for_each_entry(res, &dl->dl_res->tracking, tracking) { +- if (dl->dl_res) { +- dlm_lockres_put(dl->dl_res); +- dl->dl_res = NULL; +- } +- if (&res->tracking == &dlm->tracking_list) { +- mlog(0, "End of list found, %p\n", res); +- dl = NULL; +- break; +- } +- dlm_lockres_get(res); +- dl->dl_res = res; +- break; +- } +- } else { +- if (!list_empty(&dlm->tracking_list)) { +- list_for_each_entry(res, &dlm->tracking_list, tracking) +- break; ++ list_for_each_entry(res, track_list, tracking) { ++ if (&res->tracking == &dlm->tracking_list) ++ res = NULL; ++ else + dlm_lockres_get(res); +- dl->dl_res = res; +- } else +- dl = NULL; ++ break; + } ++ spin_unlock(&dlm->track_lock); + +- if (dl) { +- spin_lock(&dl->dl_res->spinlock); +- dump_lockres(dl->dl_res, dl->dl_buf, dl->dl_len - 1); +- spin_unlock(&dl->dl_res->spinlock); +- } ++ if (oldres) ++ dlm_lockres_put(oldres); + +- spin_unlock(&dlm->spinlock); ++ dl->dl_res = res; + ++ if (res) { ++ spin_lock(&res->spinlock); ++ dump_lockres(res, dl->dl_buf, dl->dl_len - 1); ++ spin_unlock(&res->spinlock); ++ } else ++ dl = NULL; ++ ++ /* passed to seq_show */ + return dl; + } + +@@ -761,12 +756,8 @@ + int out = 0; + struct dlm_reco_node_data *node; + char *state; +- int lres, rres, ures, tres; +- +- lres = atomic_read(&dlm->local_resources); +- rres = atomic_read(&dlm->remote_resources); +- ures = atomic_read(&dlm->unknown_resources); +- tres = lres + rres + ures; ++ int cur_mles = 0, tot_mles = 0; ++ int i; + + spin_lock(&dlm->spinlock); + +@@ -809,21 +800,48 @@ + db->buf + out, db->len - out); + out += snprintf(db->buf + out, db->len - out, "\n"); + +- /* Mastered Resources Total: xxx Locally: xxx Remotely: ... */ ++ /* Lock Resources: xxx (xxx) */ ++ out += snprintf(db->buf + out, db->len - out, ++ "Lock Resources: %d (%d)\n", ++ atomic_read(&dlm->res_cur_count), ++ atomic_read(&dlm->res_tot_count)); ++ ++ for (i = 0; i < DLM_MLE_NUM_TYPES; ++i) ++ tot_mles += atomic_read(&dlm->mle_tot_count[i]); ++ ++ for (i = 0; i < DLM_MLE_NUM_TYPES; ++i) ++ cur_mles += atomic_read(&dlm->mle_cur_count[i]); ++ ++ /* MLEs: xxx (xxx) */ ++ out += snprintf(db->buf + out, db->len - out, ++ "MLEs: %d (%d)\n", cur_mles, tot_mles); ++ ++ /* Blocking: xxx (xxx) */ ++ out += snprintf(db->buf + out, db->len - out, ++ " Blocking: %d (%d)\n", ++ atomic_read(&dlm->mle_cur_count[DLM_MLE_BLOCK]), ++ atomic_read(&dlm->mle_tot_count[DLM_MLE_BLOCK])); ++ ++ /* Mastery: xxx (xxx) */ ++ out += snprintf(db->buf + out, db->len - out, ++ " Mastery: %d (%d)\n", ++ atomic_read(&dlm->mle_cur_count[DLM_MLE_MASTER]), ++ atomic_read(&dlm->mle_tot_count[DLM_MLE_MASTER])); ++ ++ /* Migration: xxx (xxx) */ + out += snprintf(db->buf + out, db->len - out, +- "Mastered Resources Total: %d Locally: %d " +- "Remotely: %d Unknown: %d\n", +- tres, lres, rres, ures); ++ " Migration: %d (%d)\n", ++ atomic_read(&dlm->mle_cur_count[DLM_MLE_MIGRATION]), ++ atomic_read(&dlm->mle_tot_count[DLM_MLE_MIGRATION])); + + /* Lists: Dirty=Empty Purge=InUse PendingASTs=Empty ... */ + out += snprintf(db->buf + out, db->len - out, + "Lists: Dirty=%s Purge=%s PendingASTs=%s " +- "PendingBASTs=%s Master=%s\n", ++ "PendingBASTs=%s\n", + (list_empty(&dlm->dirty_list) ? "Empty" : "InUse"), + (list_empty(&dlm->purge_list) ? "Empty" : "InUse"), + (list_empty(&dlm->pending_asts) ? "Empty" : "InUse"), +- (list_empty(&dlm->pending_basts) ? "Empty" : "InUse"), +- (list_empty(&dlm->master_list) ? "Empty" : "InUse")); ++ (list_empty(&dlm->pending_basts) ? "Empty" : "InUse")); + + /* Purge Count: xxx Refs: xxx */ + out += snprintf(db->buf + out, db->len - out, +diff -urN linux-2.6.27.19-5.1/fs/ocfs2/dlm/dlmdomain.c linux-2.6.27.23-0.1.1/fs/ocfs2/dlm/dlmdomain.c +--- linux-2.6.27.19-5.1/fs/ocfs2/dlm/dlmdomain.c 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/ocfs2/dlm/dlmdomain.c 2009-06-16 13:39:36.000000000 +0100 +@@ -304,6 +304,9 @@ + if (dlm->lockres_hash) + dlm_free_pagevec((void **)dlm->lockres_hash, DLM_HASH_PAGES); + ++ if (dlm->master_hash) ++ dlm_free_pagevec((void **)dlm->master_hash, DLM_HASH_PAGES); ++ + if (dlm->name) + kfree(dlm->name); + +@@ -1534,12 +1537,27 @@ + for (i = 0; i < DLM_HASH_BUCKETS; i++) + INIT_HLIST_HEAD(dlm_lockres_hash(dlm, i)); + ++ dlm->master_hash = (struct hlist_head **) ++ dlm_alloc_pagevec(DLM_HASH_PAGES); ++ if (!dlm->master_hash) { ++ mlog_errno(-ENOMEM); ++ dlm_free_pagevec((void **)dlm->lockres_hash, DLM_HASH_PAGES); ++ kfree(dlm->name); ++ kfree(dlm); ++ dlm = NULL; ++ goto leave; ++ } ++ ++ for (i = 0; i < DLM_HASH_BUCKETS; i++) ++ INIT_HLIST_HEAD(dlm_master_hash(dlm, i)); ++ + strcpy(dlm->name, domain); + dlm->key = key; + dlm->node_num = o2nm_this_node(); + + ret = dlm_create_debugfs_subroot(dlm); + if (ret < 0) { ++ dlm_free_pagevec((void **)dlm->master_hash, DLM_HASH_PAGES); + dlm_free_pagevec((void **)dlm->lockres_hash, DLM_HASH_PAGES); + kfree(dlm->name); + kfree(dlm); +@@ -1550,6 +1568,7 @@ + spin_lock_init(&dlm->spinlock); + spin_lock_init(&dlm->master_lock); + spin_lock_init(&dlm->ast_lock); ++ spin_lock_init(&dlm->track_lock); + INIT_LIST_HEAD(&dlm->list); + INIT_LIST_HEAD(&dlm->dirty_list); + INIT_LIST_HEAD(&dlm->reco.resources); +@@ -1578,7 +1597,6 @@ + init_waitqueue_head(&dlm->reco.event); + init_waitqueue_head(&dlm->ast_wq); + init_waitqueue_head(&dlm->migration_wq); +- INIT_LIST_HEAD(&dlm->master_list); + INIT_LIST_HEAD(&dlm->mle_hb_events); + + dlm->joining_node = DLM_LOCK_RES_OWNER_UNKNOWN; +@@ -1586,9 +1604,13 @@ + + dlm->reco.new_master = O2NM_INVALID_NODE_NUM; + dlm->reco.dead_node = O2NM_INVALID_NODE_NUM; +- atomic_set(&dlm->local_resources, 0); +- atomic_set(&dlm->remote_resources, 0); +- atomic_set(&dlm->unknown_resources, 0); ++ ++ atomic_set(&dlm->res_tot_count, 0); ++ atomic_set(&dlm->res_cur_count, 0); ++ for (i = 0; i < DLM_MLE_NUM_TYPES; ++i) { ++ atomic_set(&dlm->mle_tot_count[i], 0); ++ atomic_set(&dlm->mle_cur_count[i], 0); ++ } + + spin_lock_init(&dlm->work_lock); + INIT_LIST_HEAD(&dlm->work_list); +diff -urN linux-2.6.27.19-5.1/fs/ocfs2/dlm/dlmmaster.c linux-2.6.27.23-0.1.1/fs/ocfs2/dlm/dlmmaster.c +--- linux-2.6.27.19-5.1/fs/ocfs2/dlm/dlmmaster.c 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/ocfs2/dlm/dlmmaster.c 2009-06-16 13:39:36.000000000 +0100 +@@ -73,22 +73,13 @@ + const char *name, + unsigned int namelen) + { +- struct dlm_lock_resource *res; +- + if (dlm != mle->dlm) + return 0; + +- if (mle->type == DLM_MLE_BLOCK || +- mle->type == DLM_MLE_MIGRATION) { +- if (namelen != mle->u.name.len || +- memcmp(name, mle->u.name.name, namelen)!=0) +- return 0; +- } else { +- res = mle->u.res; +- if (namelen != res->lockname.len || +- memcmp(res->lockname.name, name, namelen) != 0) +- return 0; +- } ++ if (namelen != mle->mnamelen || ++ memcmp(name, mle->mname, namelen) != 0) ++ return 0; ++ + return 1; + } + +@@ -283,7 +274,7 @@ + + mle->dlm = dlm; + mle->type = type; +- INIT_LIST_HEAD(&mle->list); ++ INIT_HLIST_NODE(&mle->master_hash_node); + INIT_LIST_HEAD(&mle->hb_events); + memset(mle->maybe_map, 0, sizeof(mle->maybe_map)); + spin_lock_init(&mle->spinlock); +@@ -295,19 +286,27 @@ + mle->new_master = O2NM_MAX_NODES; + mle->inuse = 0; + ++ BUG_ON(mle->type != DLM_MLE_BLOCK && ++ mle->type != DLM_MLE_MASTER && ++ mle->type != DLM_MLE_MIGRATION); ++ + if (mle->type == DLM_MLE_MASTER) { + BUG_ON(!res); +- mle->u.res = res; +- } else if (mle->type == DLM_MLE_BLOCK) { +- BUG_ON(!name); +- memcpy(mle->u.name.name, name, namelen); +- mle->u.name.len = namelen; +- } else /* DLM_MLE_MIGRATION */ { ++ mle->mleres = res; ++ memcpy(mle->mname, res->lockname.name, res->lockname.len); ++ mle->mnamelen = res->lockname.len; ++ mle->mnamehash = res->lockname.hash; ++ } else { + BUG_ON(!name); +- memcpy(mle->u.name.name, name, namelen); +- mle->u.name.len = namelen; ++ mle->mleres = NULL; ++ memcpy(mle->mname, name, namelen); ++ mle->mnamelen = namelen; ++ mle->mnamehash = dlm_lockid_hash(name, namelen); + } + ++ atomic_inc(&dlm->mle_tot_count[mle->type]); ++ atomic_inc(&dlm->mle_cur_count[mle->type]); ++ + /* copy off the node_map and register hb callbacks on our copy */ + memcpy(mle->node_map, dlm->domain_map, sizeof(mle->node_map)); + memcpy(mle->vote_map, dlm->domain_map, sizeof(mle->vote_map)); +@@ -318,6 +317,24 @@ + __dlm_mle_attach_hb_events(dlm, mle); + } + ++void __dlm_unlink_mle(struct dlm_ctxt *dlm, struct dlm_master_list_entry *mle) ++{ ++ assert_spin_locked(&dlm->spinlock); ++ assert_spin_locked(&dlm->master_lock); ++ ++ if (!hlist_unhashed(&mle->master_hash_node)) ++ hlist_del_init(&mle->master_hash_node); ++} ++ ++void __dlm_insert_mle(struct dlm_ctxt *dlm, struct dlm_master_list_entry *mle) ++{ ++ struct hlist_head *bucket; ++ ++ assert_spin_locked(&dlm->master_lock); ++ ++ bucket = dlm_master_hash(dlm, mle->mnamehash); ++ hlist_add_head(&mle->master_hash_node, bucket); ++} + + /* returns 1 if found, 0 if not */ + static int dlm_find_mle(struct dlm_ctxt *dlm, +@@ -325,10 +342,17 @@ + char *name, unsigned int namelen) + { + struct dlm_master_list_entry *tmpmle; ++ struct hlist_head *bucket; ++ struct hlist_node *list; ++ unsigned int hash; + + assert_spin_locked(&dlm->master_lock); + +- list_for_each_entry(tmpmle, &dlm->master_list, list) { ++ hash = dlm_lockid_hash(name, namelen); ++ bucket = dlm_master_hash(dlm, hash); ++ hlist_for_each(list, bucket) { ++ tmpmle = hlist_entry(list, struct dlm_master_list_entry, ++ master_hash_node); + if (!dlm_mle_equal(dlm, tmpmle, name, namelen)) + continue; + dlm_get_mle(tmpmle); +@@ -408,24 +432,20 @@ + mle = container_of(kref, struct dlm_master_list_entry, mle_refs); + dlm = mle->dlm; + +- if (mle->type != DLM_MLE_MASTER) { +- mlog(0, "calling mle_release for %.*s, type %d\n", +- mle->u.name.len, mle->u.name.name, mle->type); +- } else { +- mlog(0, "calling mle_release for %.*s, type %d\n", +- mle->u.res->lockname.len, +- mle->u.res->lockname.name, mle->type); +- } + assert_spin_locked(&dlm->spinlock); + assert_spin_locked(&dlm->master_lock); + ++ mlog(0, "Releasing mle for %.*s, type %d\n", mle->mnamelen, mle->mname, ++ mle->type); ++ + /* remove from list if not already */ +- if (!list_empty(&mle->list)) +- list_del_init(&mle->list); ++ __dlm_unlink_mle(dlm, mle); + + /* detach the mle from the domain node up/down events */ + __dlm_mle_detach_hb_events(dlm, mle); + ++ atomic_dec(&dlm->mle_cur_count[mle->type]); ++ + /* NOTE: kfree under spinlock here. + * if this is bad, we can move this to a freelist. */ + kmem_cache_free(dlm_mle_cache, mle); +@@ -465,48 +485,13 @@ + kmem_cache_destroy(dlm_lockres_cache); + } + +-static void dlm_set_lockres_owner(struct dlm_ctxt *dlm, +- struct dlm_lock_resource *res, +- u8 owner) +-{ +- assert_spin_locked(&res->spinlock); +- +- mlog_entry("%.*s, %u\n", res->lockname.len, res->lockname.name, owner); +- +- if (owner == dlm->node_num) +- atomic_inc(&dlm->local_resources); +- else if (owner == DLM_LOCK_RES_OWNER_UNKNOWN) +- atomic_inc(&dlm->unknown_resources); +- else +- atomic_inc(&dlm->remote_resources); +- +- res->owner = owner; +-} +- +-void dlm_change_lockres_owner(struct dlm_ctxt *dlm, +- struct dlm_lock_resource *res, u8 owner) +-{ +- assert_spin_locked(&res->spinlock); +- +- if (owner == res->owner) +- return; +- +- if (res->owner == dlm->node_num) +- atomic_dec(&dlm->local_resources); +- else if (res->owner == DLM_LOCK_RES_OWNER_UNKNOWN) +- atomic_dec(&dlm->unknown_resources); +- else +- atomic_dec(&dlm->remote_resources); +- +- dlm_set_lockres_owner(dlm, res, owner); +-} +- +- + static void dlm_lockres_release(struct kref *kref) + { + struct dlm_lock_resource *res; ++ struct dlm_ctxt *dlm; + + res = container_of(kref, struct dlm_lock_resource, refs); ++ dlm = res->dlm; + + /* This should not happen -- all lockres' have a name + * associated with them at init time. */ +@@ -515,6 +500,7 @@ + mlog(0, "destroying lockres %.*s\n", res->lockname.len, + res->lockname.name); + ++ spin_lock(&dlm->track_lock); + if (!list_empty(&res->tracking)) + list_del_init(&res->tracking); + else { +@@ -522,6 +508,11 @@ + res->lockname.len, res->lockname.name); + dlm_print_one_lock_resource(res); + } ++ spin_unlock(&dlm->track_lock); ++ ++ atomic_dec(&dlm->res_cur_count); ++ ++ dlm_put(dlm); + + if (!hlist_unhashed(&res->hash_node) || + !list_empty(&res->granted) || +@@ -595,8 +586,15 @@ + res->migration_pending = 0; + res->inflight_locks = 0; + ++ /* put in dlm_lockres_release */ ++ dlm_grab(dlm); ++ res->dlm = dlm; ++ + kref_init(&res->refs); + ++ atomic_inc(&dlm->res_tot_count); ++ atomic_inc(&dlm->res_cur_count); ++ + /* just for consistency */ + spin_lock(&res->spinlock); + dlm_set_lockres_owner(dlm, res, DLM_LOCK_RES_OWNER_UNKNOWN); +@@ -826,7 +824,7 @@ + alloc_mle = NULL; + dlm_init_mle(mle, DLM_MLE_MASTER, dlm, res, NULL, 0); + set_bit(dlm->node_num, mle->maybe_map); +- list_add(&mle->list, &dlm->master_list); ++ __dlm_insert_mle(dlm, mle); + + /* still holding the dlm spinlock, check the recovery map + * to see if there are any nodes that still need to be +@@ -1253,7 +1251,7 @@ + res->lockname.len, + res->lockname.name); + mle->type = DLM_MLE_MASTER; +- mle->u.res = res; ++ mle->mleres = res; + } + } + } +@@ -1298,14 +1296,8 @@ + + BUG_ON(mle->type == DLM_MLE_MIGRATION); + +- if (mle->type != DLM_MLE_MASTER) { +- request.namelen = mle->u.name.len; +- memcpy(request.name, mle->u.name.name, request.namelen); +- } else { +- request.namelen = mle->u.res->lockname.len; +- memcpy(request.name, mle->u.res->lockname.name, +- request.namelen); +- } ++ request.namelen = (u8)mle->mnamelen; ++ memcpy(request.name, mle->mname, request.namelen); + + again: + ret = o2net_send_message(DLM_MASTER_REQUEST_MSG, dlm->key, &request, +@@ -1558,7 +1550,7 @@ + // "add the block.\n"); + dlm_init_mle(mle, DLM_MLE_BLOCK, dlm, NULL, name, namelen); + set_bit(request->node_idx, mle->maybe_map); +- list_add(&mle->list, &dlm->master_list); ++ __dlm_insert_mle(dlm, mle); + response = DLM_MASTER_RESP_NO; + } else { + // mlog(0, "mle was found\n"); +@@ -1832,12 +1824,12 @@ + if (!mle) { + if (res->owner != DLM_LOCK_RES_OWNER_UNKNOWN && + res->owner != assert->node_idx) { +- mlog(ML_ERROR, "assert_master from " +- "%u, but current owner is " +- "%u! (%.*s)\n", +- assert->node_idx, res->owner, +- namelen, name); +- goto kill; ++ mlog(ML_ERROR, "DIE! Mastery assert from %u, " ++ "but current owner is %u! (%.*s)\n", ++ assert->node_idx, res->owner, namelen, ++ name); ++ __dlm_print_one_lock_resource(res); ++ BUG(); + } + } else if (mle->type != DLM_MLE_MIGRATION) { + if (res->owner != DLM_LOCK_RES_OWNER_UNKNOWN) { +@@ -1950,7 +1942,7 @@ + assert->node_idx, rr, extra_ref, mle->inuse); + dlm_print_one_mle(mle); + } +- list_del_init(&mle->list); ++ __dlm_unlink_mle(dlm, mle); + __dlm_mle_detach_hb_events(dlm, mle); + __dlm_put_mle(mle); + if (extra_ref) { +@@ -3127,10 +3119,8 @@ + tmp->master = master; + atomic_set(&tmp->woken, 1); + wake_up(&tmp->wq); +- /* remove it from the list so that only one +- * mle will be found */ +- list_del_init(&tmp->list); +- /* this was obviously WRONG. mle is uninited here. should be tmp. */ ++ /* remove it so that only one mle will be found */ ++ __dlm_unlink_mle(dlm, tmp); + __dlm_mle_detach_hb_events(dlm, tmp); + ret = DLM_MIGRATE_RESPONSE_MASTERY_REF; + mlog(0, "%s:%.*s: master=%u, newmaster=%u, " +@@ -3149,137 +3139,164 @@ + mle->master = master; + /* do this for consistency with other mle types */ + set_bit(new_master, mle->maybe_map); +- list_add(&mle->list, &dlm->master_list); ++ __dlm_insert_mle(dlm, mle); + + return ret; + } + +- +-void dlm_clean_master_list(struct dlm_ctxt *dlm, u8 dead_node) ++/* ++ * Sets the owner of the lockres, associated to the mle, to UNKNOWN ++ */ ++static struct dlm_lock_resource *dlm_reset_mleres_owner(struct dlm_ctxt *dlm, ++ struct dlm_master_list_entry *mle) + { +- struct dlm_master_list_entry *mle, *next; + struct dlm_lock_resource *res; +- unsigned int hash; + +- mlog_entry("dlm=%s, dead node=%u\n", dlm->name, dead_node); +-top: +- assert_spin_locked(&dlm->spinlock); ++ /* Find the lockres associated to the mle and set its owner to UNK */ ++ res = __dlm_lookup_lockres(dlm, mle->mname, mle->mnamelen, ++ mle->mnamehash); ++ if (res) { ++ spin_unlock(&dlm->master_lock); + +- /* clean the master list */ +- spin_lock(&dlm->master_lock); +- list_for_each_entry_safe(mle, next, &dlm->master_list, list) { +- BUG_ON(mle->type != DLM_MLE_BLOCK && +- mle->type != DLM_MLE_MASTER && +- mle->type != DLM_MLE_MIGRATION); +- +- /* MASTER mles are initiated locally. the waiting +- * process will notice the node map change +- * shortly. let that happen as normal. */ +- if (mle->type == DLM_MLE_MASTER) +- continue; ++ /* move lockres onto recovery list */ ++ spin_lock(&res->spinlock); ++ dlm_set_lockres_owner(dlm, res, DLM_LOCK_RES_OWNER_UNKNOWN); ++ dlm_move_lockres_to_recovery_list(dlm, res); ++ spin_unlock(&res->spinlock); ++ dlm_lockres_put(res); + ++ /* about to get rid of mle, detach from heartbeat */ ++ __dlm_mle_detach_hb_events(dlm, mle); + +- /* BLOCK mles are initiated by other nodes. +- * need to clean up if the dead node would have +- * been the master. */ +- if (mle->type == DLM_MLE_BLOCK) { +- int bit; ++ /* dump the mle */ ++ spin_lock(&dlm->master_lock); ++ __dlm_put_mle(mle); ++ spin_unlock(&dlm->master_lock); ++ } + +- spin_lock(&mle->spinlock); +- bit = find_next_bit(mle->maybe_map, O2NM_MAX_NODES, 0); +- if (bit != dead_node) { +- mlog(0, "mle found, but dead node %u would " +- "not have been master\n", dead_node); +- spin_unlock(&mle->spinlock); +- } else { +- /* must drop the refcount by one since the +- * assert_master will never arrive. this +- * may result in the mle being unlinked and +- * freed, but there may still be a process +- * waiting in the dlmlock path which is fine. */ +- mlog(0, "node %u was expected master\n", +- dead_node); +- atomic_set(&mle->woken, 1); +- spin_unlock(&mle->spinlock); +- wake_up(&mle->wq); +- /* do not need events any longer, so detach +- * from heartbeat */ +- __dlm_mle_detach_hb_events(dlm, mle); +- __dlm_put_mle(mle); +- } +- continue; +- } ++ return res; ++} + +- /* everything else is a MIGRATION mle */ ++static void dlm_clean_migration_mle(struct dlm_ctxt *dlm, ++ struct dlm_master_list_entry *mle) ++{ ++ __dlm_mle_detach_hb_events(dlm, mle); + +- /* the rule for MIGRATION mles is that the master +- * becomes UNKNOWN if *either* the original or +- * the new master dies. all UNKNOWN lockreses +- * are sent to whichever node becomes the recovery +- * master. the new master is responsible for +- * determining if there is still a master for +- * this lockres, or if he needs to take over +- * mastery. either way, this node should expect +- * another message to resolve this. */ +- if (mle->master != dead_node && +- mle->new_master != dead_node) +- continue; ++ spin_lock(&mle->spinlock); ++ __dlm_unlink_mle(dlm, mle); ++ atomic_set(&mle->woken, 1); ++ spin_unlock(&mle->spinlock); + +- /* if we have reached this point, this mle needs to +- * be removed from the list and freed. */ ++ wake_up(&mle->wq); ++} + +- /* remove from the list early. NOTE: unlinking +- * list_head while in list_for_each_safe */ +- __dlm_mle_detach_hb_events(dlm, mle); +- spin_lock(&mle->spinlock); +- list_del_init(&mle->list); ++static void dlm_clean_block_mle(struct dlm_ctxt *dlm, ++ struct dlm_master_list_entry *mle, u8 dead_node) ++{ ++ int bit; ++ ++ BUG_ON(mle->type != DLM_MLE_BLOCK); ++ ++ spin_lock(&mle->spinlock); ++ bit = find_next_bit(mle->maybe_map, O2NM_MAX_NODES, 0); ++ if (bit != dead_node) { ++ mlog(0, "mle found, but dead node %u would not have been " ++ "master\n", dead_node); ++ spin_unlock(&mle->spinlock); ++ } else { ++ /* Must drop the refcount by one since the assert_master will ++ * never arrive. This may result in the mle being unlinked and ++ * freed, but there may still be a process waiting in the ++ * dlmlock path which is fine. */ ++ mlog(0, "node %u was expected master\n", dead_node); + atomic_set(&mle->woken, 1); + spin_unlock(&mle->spinlock); + wake_up(&mle->wq); + +- mlog(0, "%s: node %u died during migration from " +- "%u to %u!\n", dlm->name, dead_node, +- mle->master, mle->new_master); +- /* if there is a lockres associated with this +- * mle, find it and set its owner to UNKNOWN */ +- hash = dlm_lockid_hash(mle->u.name.name, mle->u.name.len); +- res = __dlm_lookup_lockres(dlm, mle->u.name.name, +- mle->u.name.len, hash); +- if (res) { +- /* unfortunately if we hit this rare case, our +- * lock ordering is messed. we need to drop +- * the master lock so that we can take the +- * lockres lock, meaning that we will have to +- * restart from the head of list. */ +- spin_unlock(&dlm->master_lock); ++ /* Do not need events any longer, so detach from heartbeat */ ++ __dlm_mle_detach_hb_events(dlm, mle); ++ __dlm_put_mle(mle); ++ } ++} + +- /* move lockres onto recovery list */ +- spin_lock(&res->spinlock); +- dlm_set_lockres_owner(dlm, res, +- DLM_LOCK_RES_OWNER_UNKNOWN); +- dlm_move_lockres_to_recovery_list(dlm, res); +- spin_unlock(&res->spinlock); +- dlm_lockres_put(res); ++void dlm_clean_master_list(struct dlm_ctxt *dlm, u8 dead_node) ++{ ++ struct dlm_master_list_entry *mle; ++ struct dlm_lock_resource *res; ++ struct hlist_head *bucket; ++ struct hlist_node *list; ++ unsigned int i; + +- /* about to get rid of mle, detach from heartbeat */ +- __dlm_mle_detach_hb_events(dlm, mle); ++ mlog_entry("dlm=%s, dead node=%u\n", dlm->name, dead_node); ++top: ++ assert_spin_locked(&dlm->spinlock); + +- /* dump the mle */ +- spin_lock(&dlm->master_lock); +- __dlm_put_mle(mle); +- spin_unlock(&dlm->master_lock); ++ /* clean the master list */ ++ spin_lock(&dlm->master_lock); ++ for (i = 0; i < DLM_HASH_BUCKETS; i++) { ++ bucket = dlm_master_hash(dlm, i); ++ hlist_for_each(list, bucket) { ++ mle = hlist_entry(list, struct dlm_master_list_entry, ++ master_hash_node); ++ ++ BUG_ON(mle->type != DLM_MLE_BLOCK && ++ mle->type != DLM_MLE_MASTER && ++ mle->type != DLM_MLE_MIGRATION); ++ ++ /* MASTER mles are initiated locally. The waiting ++ * process will notice the node map change shortly. ++ * Let that happen as normal. */ ++ if (mle->type == DLM_MLE_MASTER) ++ continue; ++ ++ /* BLOCK mles are initiated by other nodes. Need to ++ * clean up if the dead node would have been the ++ * master. */ ++ if (mle->type == DLM_MLE_BLOCK) { ++ dlm_clean_block_mle(dlm, mle, dead_node); ++ continue; ++ } ++ ++ /* Everything else is a MIGRATION mle */ ++ ++ /* The rule for MIGRATION mles is that the master ++ * becomes UNKNOWN if *either* the original or the new ++ * master dies. All UNKNOWN lockres' are sent to ++ * whichever node becomes the recovery master. The new ++ * master is responsible for determining if there is ++ * still a master for this lockres, or if he needs to ++ * take over mastery. Either way, this node should ++ * expect another message to resolve this. */ ++ ++ if (mle->master != dead_node && ++ mle->new_master != dead_node) ++ continue; ++ ++ /* If we have reached this point, this mle needs to be ++ * removed from the list and freed. */ ++ dlm_clean_migration_mle(dlm, mle); ++ ++ mlog(0, "%s: node %u died during migration from " ++ "%u to %u!\n", dlm->name, dead_node, mle->master, ++ mle->new_master); ++ ++ /* If we find a lockres associated with the mle, we've ++ * hit this rare case that messes up our lock ordering. ++ * If so, we need to drop the master lock so that we can ++ * take the lockres lock, meaning that we will have to ++ * restart from the head of list. */ ++ res = dlm_reset_mleres_owner(dlm, mle); ++ if (res) ++ /* restart */ ++ goto top; + +- /* restart */ +- goto top; ++ /* This may be the last reference */ ++ __dlm_put_mle(mle); + } +- +- /* this may be the last reference */ +- __dlm_put_mle(mle); + } + spin_unlock(&dlm->master_lock); + } + +- + int dlm_finish_migration(struct dlm_ctxt *dlm, struct dlm_lock_resource *res, + u8 old_master) + { +diff -urN linux-2.6.27.19-5.1/fs/ocfs2/dlm/dlmthread.c linux-2.6.27.23-0.1.1/fs/ocfs2/dlm/dlmthread.c +--- linux-2.6.27.19-5.1/fs/ocfs2/dlm/dlmthread.c 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/ocfs2/dlm/dlmthread.c 2009-06-16 13:39:36.000000000 +0100 +@@ -162,12 +162,28 @@ + + spin_lock(&res->spinlock); + if (!__dlm_lockres_unused(res)) { +- spin_unlock(&res->spinlock); + mlog(0, "%s:%.*s: tried to purge but not unused\n", + dlm->name, res->lockname.len, res->lockname.name); +- return -ENOTEMPTY; ++ __dlm_print_one_lock_resource(res); ++ spin_unlock(&res->spinlock); ++ BUG(); + } ++ ++ if (res->state & DLM_LOCK_RES_MIGRATING) { ++ mlog(0, "%s:%.*s: Delay dropref as this lockres is " ++ "being remastered\n", dlm->name, res->lockname.len, ++ res->lockname.name); ++ /* Re-add the lockres to the end of the purge list */ ++ if (!list_empty(&res->purge)) { ++ list_del_init(&res->purge); ++ list_add_tail(&res->purge, &dlm->purge_list); ++ } ++ spin_unlock(&res->spinlock); ++ return 0; ++ } ++ + master = (res->owner == dlm->node_num); ++ + if (!master) + res->state |= DLM_LOCK_RES_DROPPING_REF; + spin_unlock(&res->spinlock); +diff -urN linux-2.6.27.19-5.1/fs/ocfs2/dlm/dlmunlock.c linux-2.6.27.23-0.1.1/fs/ocfs2/dlm/dlmunlock.c +--- linux-2.6.27.19-5.1/fs/ocfs2/dlm/dlmunlock.c 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/ocfs2/dlm/dlmunlock.c 2009-06-16 13:39:36.000000000 +0100 +@@ -117,11 +117,11 @@ + else + BUG_ON(res->owner == dlm->node_num); + +- spin_lock(&dlm->spinlock); ++ spin_lock(&dlm->ast_lock); + /* We want to be sure that we're not freeing a lock + * that still has AST's pending... */ + in_use = !list_empty(&lock->ast_list); +- spin_unlock(&dlm->spinlock); ++ spin_unlock(&dlm->ast_lock); + if (in_use) { + mlog(ML_ERROR, "lockres %.*s: Someone is calling dlmunlock " + "while waiting for an ast!", res->lockname.len, +diff -urN linux-2.6.27.19-5.1/fs/ocfs2/dlmglue.c linux-2.6.27.23-0.1.1/fs/ocfs2/dlmglue.c +--- linux-2.6.27.19-5.1/fs/ocfs2/dlmglue.c 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/ocfs2/dlmglue.c 2009-06-16 13:39:36.000000000 +0100 +@@ -2866,6 +2866,10 @@ + case OCFS2_UNLOCK_CANCEL_CONVERT: + mlog(0, "Cancel convert success for %s\n", lockres->l_name); + lockres->l_action = OCFS2_AST_INVALID; ++ /* Downconvert thread may have requeued this lock, we ++ * need to wake it. */ ++ if (lockres->l_flags & OCFS2_LOCK_BLOCKED) ++ ocfs2_wake_downconvert_thread(ocfs2_get_lockres_osb(lockres)); + break; + case OCFS2_UNLOCK_DROP_LOCK: + lockres->l_level = DLM_LOCK_IV; +diff -urN linux-2.6.27.19-5.1/fs/ocfs2/file.c linux-2.6.27.23-0.1.1/fs/ocfs2/file.c +--- linux-2.6.27.19-5.1/fs/ocfs2/file.c 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/ocfs2/file.c 2009-06-16 13:39:36.000000000 +0100 +@@ -1933,7 +1933,7 @@ + out->f_path.dentry->d_name.len, + out->f_path.dentry->d_name.name); + +- inode_double_lock(inode, pipe->inode); ++ mutex_lock_nested(&inode->i_mutex, I_MUTEX_PARENT); + + ret = ocfs2_rw_lock(inode, 1); + if (ret < 0) { +@@ -1948,12 +1948,16 @@ + goto out_unlock; + } + ++ if (pipe->inode) ++ mutex_lock_nested(&pipe->inode->i_mutex, I_MUTEX_CHILD); + ret = generic_file_splice_write_nolock(pipe, out, ppos, len, flags); ++ if (pipe->inode) ++ mutex_unlock(&pipe->inode->i_mutex); + + out_unlock: + ocfs2_rw_unlock(inode, 1); + out: +- inode_double_unlock(inode, pipe->inode); ++ mutex_unlock(&inode->i_mutex); + + mlog_exit(ret); + return ret; +diff -urN linux-2.6.27.19-5.1/fs/ocfs2/namei.c linux-2.6.27.23-0.1.1/fs/ocfs2/namei.c +--- linux-2.6.27.19-5.1/fs/ocfs2/namei.c 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/ocfs2/namei.c 2009-06-16 13:39:36.000000000 +0100 +@@ -532,7 +532,8 @@ + + fe->i_dyn_features = cpu_to_le16(feat | OCFS2_INLINE_DATA_FL); + +- fe->id2.i_data.id_count = cpu_to_le16(ocfs2_max_inline_data(osb->sb)); ++ fe->id2.i_data.id_count = cpu_to_le16( ++ ocfs2_max_inline_data_with_xattr(osb->sb, fe)); + } else { + fel = &fe->id2.i_list; + fel->l_tree_depth = 0; +diff -urN linux-2.6.27.19-5.1/fs/ocfs2/ocfs2_fs.h linux-2.6.27.23-0.1.1/fs/ocfs2/ocfs2_fs.h +--- linux-2.6.27.19-5.1/fs/ocfs2/ocfs2_fs.h 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/ocfs2/ocfs2_fs.h 2009-06-16 13:39:37.000000000 +0100 +@@ -987,12 +987,6 @@ + offsetof(struct ocfs2_dinode, id2.i_symlink); + } + +-static inline int ocfs2_max_inline_data(struct super_block *sb) +-{ +- return sb->s_blocksize - +- offsetof(struct ocfs2_dinode, id2.i_data.id_data); +-} +- + static inline int ocfs2_max_inline_data_with_xattr(struct super_block *sb, + struct ocfs2_dinode *di) + { +diff -urN linux-2.6.27.19-5.1/fs/ocfs2/ocfs2.h linux-2.6.27.23-0.1.1/fs/ocfs2/ocfs2.h +--- linux-2.6.27.19-5.1/fs/ocfs2/ocfs2.h 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/ocfs2/ocfs2.h 2009-06-16 13:39:36.000000000 +0100 +@@ -210,6 +210,7 @@ + struct ocfs2_slot_info; + struct ocfs2_recovery_map; + struct ocfs2_quota_recovery; ++struct ocfs2_dentry_lock; + struct ocfs2_super + { + struct task_struct *commit_task; +@@ -325,6 +326,11 @@ + struct list_head blocked_lock_list; + unsigned long blocked_lock_count; + ++ /* List of dentry locks to release. Anyone can add locks to ++ * the list, ocfs2_wq processes the list */ ++ struct ocfs2_dentry_lock *dentry_lock_list; ++ struct work_struct dentry_lock_work; ++ + wait_queue_head_t osb_mount_event; + + /* Truncate log info */ +diff -urN linux-2.6.27.19-5.1/fs/ocfs2/super.c linux-2.6.27.23-0.1.1/fs/ocfs2/super.c +--- linux-2.6.27.19-5.1/fs/ocfs2/super.c 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/ocfs2/super.c 2009-06-16 13:39:36.000000000 +0100 +@@ -1538,6 +1538,13 @@ + unlock_buffer(*bh); + ll_rw_block(READ, 1, bh); + wait_on_buffer(*bh); ++ if (!buffer_uptodate(*bh)) { ++ mlog_errno(-EIO); ++ brelse(*bh); ++ *bh = NULL; ++ return -EIO; ++ } ++ + return 0; + } + +@@ -1888,6 +1895,9 @@ + INIT_WORK(&journal->j_recovery_work, ocfs2_complete_recovery); + journal->j_state = OCFS2_JOURNAL_FREE; + ++ INIT_WORK(&osb->dentry_lock_work, ocfs2_drop_dl_inodes); ++ osb->dentry_lock_list = NULL; ++ + /* get some pseudo constants for clustersize bits */ + osb->s_clustersize_bits = + le32_to_cpu(di->id2.i_super.s_clustersize_bits); +diff -urN linux-2.6.27.19-5.1/fs/ocfs2/xattr.c linux-2.6.27.23-0.1.1/fs/ocfs2/xattr.c +--- linux-2.6.27.19-5.1/fs/ocfs2/xattr.c 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/ocfs2/xattr.c 2009-06-16 13:39:37.000000000 +0100 +@@ -81,13 +81,14 @@ + + #define OCFS2_XATTR_ROOT_SIZE (sizeof(struct ocfs2_xattr_def_value_root)) + #define OCFS2_XATTR_INLINE_SIZE 80 ++#define OCFS2_XATTR_HEADER_GAP 4 + #define OCFS2_XATTR_FREE_IN_IBODY (OCFS2_MIN_XATTR_INLINE_SIZE \ + - sizeof(struct ocfs2_xattr_header) \ +- - sizeof(__u32)) ++ - OCFS2_XATTR_HEADER_GAP) + #define OCFS2_XATTR_FREE_IN_BLOCK(ptr) ((ptr)->i_sb->s_blocksize \ + - sizeof(struct ocfs2_xattr_block) \ + - sizeof(struct ocfs2_xattr_header) \ +- - sizeof(__u32)) ++ - OCFS2_XATTR_HEADER_GAP) + + static struct ocfs2_xattr_def_value_root def_xv = { + .xv.xr_list.l_count = cpu_to_le16(1), +@@ -449,8 +450,12 @@ + * when blocksize = 512, may reserve one more cluser for + * xattr bucket, otherwise reserve one metadata block + * for them is ok. ++ * If this is a new directory with inline data, ++ * we choose to reserve the entire inline area for ++ * directory contents and force an external xattr block. + */ + if (dir->i_sb->s_blocksize == OCFS2_MIN_BLOCKSIZE || ++ (S_ISDIR(mode) && ocfs2_supports_inline_data(osb)) || + (s_size + a_size) > OCFS2_XATTR_FREE_IN_IBODY) { + ret = ocfs2_reserve_new_metadata_blocks(osb, 1, xattr_ac); + if (ret) { +@@ -1411,7 +1416,7 @@ + last += 1; + } + +- free = min_offs - ((void *)last - xs->base) - sizeof(__u32); ++ free = min_offs - ((void *)last - xs->base) - OCFS2_XATTR_HEADER_GAP; + if (free < 0) + return -EIO; + +@@ -2101,7 +2106,7 @@ + last += 1; + } + +- free = min_offs - ((void *)last - xs->base) - sizeof(__u32); ++ free = min_offs - ((void *)last - xs->base) - OCFS2_XATTR_HEADER_GAP; + if (free < 0) + return 0; + +@@ -4644,19 +4649,33 @@ + char *val, + int value_len) + { +- int offset; ++ int ret, offset, block_off; + struct ocfs2_xattr_value_root *xv; + struct ocfs2_xattr_entry *xe = xs->here; ++ struct ocfs2_xattr_header *xh = bucket_xh(xs->bucket); ++ void *base; + + BUG_ON(!xs->base || !xe || ocfs2_xattr_is_local(xe)); + +- offset = le16_to_cpu(xe->xe_name_offset) + +- OCFS2_XATTR_SIZE(xe->xe_name_len); ++ ret = ocfs2_xattr_bucket_get_name_value(inode, xh, ++ xe - xh->xh_entries, ++ &block_off, ++ &offset); ++ if (ret) { ++ mlog_errno(ret); ++ goto out; ++ } + +- xv = (struct ocfs2_xattr_value_root *)(xs->base + offset); ++ base = bucket_block(xs->bucket, block_off); ++ xv = (struct ocfs2_xattr_value_root *)(base + offset + ++ OCFS2_XATTR_SIZE(xe->xe_name_len)); + +- return __ocfs2_xattr_set_value_outside(inode, handle, +- xv, val, value_len); ++ ret = __ocfs2_xattr_set_value_outside(inode, handle, ++ xv, val, value_len); ++ if (ret) ++ mlog_errno(ret); ++out: ++ return ret; + } + + static int ocfs2_rm_xattr_cluster(struct inode *inode, +@@ -4919,8 +4938,8 @@ + xh_free_start = le16_to_cpu(xh->xh_free_start); + header_size = sizeof(struct ocfs2_xattr_header) + + count * sizeof(struct ocfs2_xattr_entry); +- max_free = OCFS2_XATTR_BUCKET_SIZE - +- le16_to_cpu(xh->xh_name_value_len) - header_size; ++ max_free = OCFS2_XATTR_BUCKET_SIZE - header_size - ++ le16_to_cpu(xh->xh_name_value_len) - OCFS2_XATTR_HEADER_GAP; + + mlog_bug_on_msg(header_size > blocksize, "bucket %llu has header size " + "of %u which exceed block size\n", +@@ -4953,7 +4972,7 @@ + need = 0; + } + +- free = xh_free_start - header_size; ++ free = xh_free_start - header_size - OCFS2_XATTR_HEADER_GAP; + /* + * We need to make sure the new name/value pair + * can exist in the same block. +@@ -4986,7 +5005,8 @@ + } + + xh_free_start = le16_to_cpu(xh->xh_free_start); +- free = xh_free_start - header_size; ++ free = xh_free_start - header_size ++ - OCFS2_XATTR_HEADER_GAP; + if (xh_free_start % blocksize < need) + free -= xh_free_start % blocksize; + +diff -urN linux-2.6.27.19-5.1/fs/proc/array.c linux-2.6.27.23-0.1.1/fs/proc/array.c +--- linux-2.6.27.19-5.1/fs/proc/array.c 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/proc/array.c 2009-06-16 13:39:36.000000000 +0100 +@@ -80,6 +80,7 @@ + #include + #include + #include ++#include + #include + #include + +@@ -350,6 +351,7 @@ + char state; + pid_t ppid = 0, pgid = -1, sid = -1; + int num_threads = 0; ++ int permitted; + struct mm_struct *mm; + unsigned long long start_time; + unsigned long cmin_flt = 0, cmaj_flt = 0; +@@ -362,11 +364,14 @@ + + state = *get_task_state(task); + vsize = eip = esp = 0; ++ permitted = ptrace_may_access(task, PTRACE_MODE_READ); + mm = get_task_mm(task); + if (mm) { + vsize = task_vsize(mm); +- eip = KSTK_EIP(task); +- esp = KSTK_ESP(task); ++ if (permitted) { ++ eip = KSTK_EIP(task); ++ esp = KSTK_ESP(task); ++ } + } + + get_task_comm(tcomm, task); +@@ -422,7 +427,7 @@ + unlock_task_sighand(task, &flags); + } + +- if (!whole || num_threads < 2) ++ if (permitted && (!whole || num_threads < 2)) + wchan = get_wchan(task); + if (!whole) { + min_flt = task->min_flt; +@@ -474,7 +479,7 @@ + rsslim, + mm ? mm->start_code : 0, + mm ? mm->end_code : 0, +- mm ? mm->start_stack : 0, ++ (permitted && mm) ? mm->start_stack : 0, + esp, + eip, + /* The signal information here is obsolete. +diff -urN linux-2.6.27.19-5.1/fs/proc/base.c linux-2.6.27.23-0.1.1/fs/proc/base.c +--- linux-2.6.27.19-5.1/fs/proc/base.c 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/proc/base.c 2009-06-16 13:39:36.000000000 +0100 +@@ -151,15 +151,22 @@ + int maps_protect; + EXPORT_SYMBOL(maps_protect); + +-static struct fs_struct *get_fs_struct(struct task_struct *task) ++static int get_fs_path(struct task_struct *task, struct path *path, bool root) + { + struct fs_struct *fs; ++ int result = -ENOENT; ++ + task_lock(task); + fs = task->fs; +- if(fs) +- atomic_inc(&fs->count); ++ if (fs) { ++ read_lock(&fs->lock); ++ *path = root ? fs->root : fs->pwd; ++ path_get(path); ++ read_unlock(&fs->lock); ++ result = 0; ++ } + task_unlock(task); +- return fs; ++ return result; + } + + static int get_nr_threads(struct task_struct *tsk) +@@ -178,42 +185,24 @@ + static int proc_cwd_link(struct inode *inode, struct path *path) + { + struct task_struct *task = get_proc_task(inode); +- struct fs_struct *fs = NULL; + int result = -ENOENT; + + if (task) { +- fs = get_fs_struct(task); ++ result = get_fs_path(task, path, 0); + put_task_struct(task); + } +- if (fs) { +- read_lock(&fs->lock); +- *path = fs->pwd; +- path_get(&fs->pwd); +- read_unlock(&fs->lock); +- result = 0; +- put_fs_struct(fs); +- } + return result; + } + + static int proc_root_link(struct inode *inode, struct path *path) + { + struct task_struct *task = get_proc_task(inode); +- struct fs_struct *fs = NULL; + int result = -ENOENT; + + if (task) { +- fs = get_fs_struct(task); ++ result = get_fs_path(task, path, 1); + put_task_struct(task); + } +- if (fs) { +- read_lock(&fs->lock); +- *path = fs->root; +- path_get(&fs->root); +- read_unlock(&fs->lock); +- result = 0; +- put_fs_struct(fs); +- } + return result; + } + +@@ -338,7 +327,10 @@ + wchan = get_wchan(task); + + if (lookup_symbol_name(wchan, symname) < 0) +- return sprintf(buffer, "%lu", wchan); ++ if (!ptrace_may_access(task, PTRACE_MODE_READ)) ++ return 0; ++ else ++ return sprintf(buffer, "%lu", wchan); + else + return sprintf(buffer, "%s", symname); + } +@@ -575,7 +567,6 @@ + struct task_struct *task = get_proc_task(inode); + struct nsproxy *nsp; + struct mnt_namespace *ns = NULL; +- struct fs_struct *fs = NULL; + struct path root; + struct proc_mounts *p; + int ret = -EINVAL; +@@ -589,22 +580,16 @@ + get_mnt_ns(ns); + } + rcu_read_unlock(); +- if (ns) +- fs = get_fs_struct(task); ++ if (ns && get_fs_path(task, &root, 1) == 0) ++ ret = 0; + put_task_struct(task); + } + + if (!ns) + goto err; +- if (!fs) ++ if (ret) + goto err_put_ns; + +- read_lock(&fs->lock); +- root = fs->root; +- path_get(&root); +- read_unlock(&fs->lock); +- put_fs_struct(fs); +- + ret = -ENOMEM; + p = kmalloc(sizeof(struct proc_mounts), GFP_KERNEL); + if (!p) +diff -urN linux-2.6.27.19-5.1/fs/proc/proc_misc.c linux-2.6.27.23-0.1.1/fs/proc/proc_misc.c +--- linux-2.6.27.19-5.1/fs/proc/proc_misc.c 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/proc/proc_misc.c 2009-06-16 13:39:36.000000000 +0100 +@@ -145,7 +145,7 @@ + #define K(x) ((x) << (PAGE_SHIFT - 10)) + si_meminfo(&i); + si_swapinfo(&i); +- committed = atomic_long_read(&vm_committed_space); ++ committed = percpu_counter_read_positive(&vm_committed_as); + allowed = ((totalram_pages - hugetlb_total_pages()) + * sysctl_overcommit_ratio / 100) + total_swap_pages; + +@@ -258,7 +258,7 @@ + #define K(x) ((x) << (PAGE_SHIFT - 10)) + si_meminfo(&i); + kdb_si_swapinfo(&i); +- committed = atomic_read(&vm_committed_space); ++ committed = percpu_counter_read_positive(&vm_committed_as); + allowed = ((totalram_pages - hugetlb_total_pages()) + * sysctl_overcommit_ratio / 100) + total_swap_pages; + +@@ -911,7 +911,7 @@ + #define KPF_RECLAIM 9 + #define KPF_BUDDY 10 + +-#define kpf_copy_bit(flags, srcpos, dstpos) (((flags >> srcpos) & 1) << dstpos) ++#define kpf_copy_bit(flags, dstpos, srcpos) (((flags >> srcpos) & 1) << dstpos) + + static ssize_t kpageflags_read(struct file *file, char __user *buf, + size_t count, loff_t *ppos) +@@ -938,7 +938,7 @@ + else + kflags = ppage->flags; + +- uflags = kpf_copy_bit(KPF_LOCKED, PG_locked, kflags) | ++ uflags = kpf_copy_bit(kflags, KPF_LOCKED, PG_locked) | + kpf_copy_bit(kflags, KPF_ERROR, PG_error) | + kpf_copy_bit(kflags, KPF_REFERENCED, PG_referenced) | + kpf_copy_bit(kflags, KPF_UPTODATE, PG_uptodate) | +diff -urN linux-2.6.27.19-5.1/fs/proc/task_mmu.c linux-2.6.27.23-0.1.1/fs/proc/task_mmu.c +--- linux-2.6.27.19-5.1/fs/proc/task_mmu.c 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/proc/task_mmu.c 2009-06-16 13:39:36.000000000 +0100 +@@ -665,6 +665,10 @@ + goto out_task; + + ret = 0; ++ ++ if (!count) ++ goto out_task; ++ + mm = get_task_mm(task); + if (!mm) + goto out_task; +diff -urN linux-2.6.27.19-5.1/fs/seq_file.c linux-2.6.27.23-0.1.1/fs/seq_file.c +--- linux-2.6.27.19-5.1/fs/seq_file.c 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/seq_file.c 2009-06-16 13:39:37.000000000 +0100 +@@ -48,8 +48,16 @@ + */ + file->f_version = 0; + +- /* SEQ files support lseek, but not pread/pwrite */ +- file->f_mode &= ~(FMODE_PREAD | FMODE_PWRITE); ++ /* ++ * seq_files support lseek() and pread(). They do not implement ++ * write() at all, but we clear FMODE_PWRITE here for historical ++ * reasons. ++ * ++ * If a client of seq_files a) implements file.write() and b) wishes to ++ * support pwrite() then that client will need to implement its own ++ * file.open() which calls seq_open() and then sets FMODE_PWRITE. ++ */ ++ file->f_mode &= ~FMODE_PWRITE; + return 0; + } + EXPORT_SYMBOL(seq_open); +@@ -131,6 +139,22 @@ + int err = 0; + + mutex_lock(&m->lock); ++ ++ /* Don't assume *ppos is where we left it */ ++ if (unlikely(*ppos != m->read_pos)) { ++ m->read_pos = *ppos; ++ while ((err = traverse(m, *ppos)) == -EAGAIN) ++ ; ++ if (err) { ++ /* With prejudice... */ ++ m->read_pos = 0; ++ m->version = 0; ++ m->index = 0; ++ m->count = 0; ++ goto Done; ++ } ++ } ++ + /* + * seq_file->op->..m_start/m_stop/m_next may do special actions + * or optimisations based on the file->f_version, so we want to +@@ -230,8 +254,10 @@ + Done: + if (!copied) + copied = err; +- else ++ else { + *ppos += copied; ++ m->read_pos += copied; ++ } + file->f_version = m->version; + mutex_unlock(&m->lock); + return copied; +@@ -266,16 +292,18 @@ + if (offset < 0) + break; + retval = offset; +- if (offset != file->f_pos) { ++ if (offset != m->read_pos) { + while ((retval=traverse(m, offset)) == -EAGAIN) + ; + if (retval) { + /* with extreme prejudice... */ + file->f_pos = 0; ++ m->read_pos = 0; + m->version = 0; + m->index = 0; + m->count = 0; + } else { ++ m->read_pos = offset; + retval = file->f_pos = offset; + } + } +diff -urN linux-2.6.27.19-5.1/fs/splice.c linux-2.6.27.23-0.1.1/fs/splice.c +--- linux-2.6.27.19-5.1/fs/splice.c 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/splice.c 2009-06-16 13:39:37.000000000 +0100 +@@ -735,10 +735,19 @@ + * ->commit_write. Most of the time, these expect i_mutex to + * be held. Since this may result in an ABBA deadlock with + * pipe->inode, we have to order lock acquiry here. ++ * ++ * Outer lock must be inode->i_mutex, as pipe_wait() will ++ * release and reacquire pipe->inode->i_mutex, AND inode must ++ * never be a pipe. + */ +- inode_double_lock(inode, pipe->inode); ++ WARN_ON(S_ISFIFO(inode->i_mode)); ++ mutex_lock_nested(&inode->i_mutex, I_MUTEX_PARENT); ++ if (pipe->inode) ++ mutex_lock_nested(&pipe->inode->i_mutex, I_MUTEX_CHILD); + ret = __splice_from_pipe(pipe, &sd, actor); +- inode_double_unlock(inode, pipe->inode); ++ if (pipe->inode) ++ mutex_unlock(&pipe->inode->i_mutex); ++ mutex_unlock(&inode->i_mutex); + + return ret; + } +@@ -829,11 +838,17 @@ + }; + ssize_t ret; + +- inode_double_lock(inode, pipe->inode); ++ WARN_ON(S_ISFIFO(inode->i_mode)); ++ mutex_lock_nested(&inode->i_mutex, I_MUTEX_PARENT); + ret = file_remove_suid(out); +- if (likely(!ret)) ++ if (likely(!ret)) { ++ if (pipe->inode) ++ mutex_lock_nested(&pipe->inode->i_mutex, I_MUTEX_CHILD); + ret = __splice_from_pipe(pipe, &sd, pipe_to_file); +- inode_double_unlock(inode, pipe->inode); ++ if (pipe->inode) ++ mutex_unlock(&pipe->inode->i_mutex); ++ } ++ mutex_unlock(&inode->i_mutex); + if (ret > 0) { + unsigned long nr_pages; + +diff -urN linux-2.6.27.19-5.1/fs/timerfd.c linux-2.6.27.23-0.1.1/fs/timerfd.c +--- linux-2.6.27.19-5.1/fs/timerfd.c 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/timerfd.c 2009-06-16 13:39:37.000000000 +0100 +@@ -188,10 +188,9 @@ + BUILD_BUG_ON(TFD_CLOEXEC != O_CLOEXEC); + BUILD_BUG_ON(TFD_NONBLOCK != O_NONBLOCK); + +- if (flags & ~(TFD_CLOEXEC | TFD_NONBLOCK)) +- return -EINVAL; +- if (clockid != CLOCK_MONOTONIC && +- clockid != CLOCK_REALTIME) ++ if ((flags & ~TFD_CREATE_FLAGS) || ++ (clockid != CLOCK_MONOTONIC && ++ clockid != CLOCK_REALTIME)) + return -EINVAL; + + ctx = kzalloc(sizeof(*ctx), GFP_KERNEL); +@@ -203,7 +202,7 @@ + hrtimer_init(&ctx->tmr, clockid, HRTIMER_MODE_ABS); + + ufd = anon_inode_getfd("[timerfd]", &timerfd_fops, ctx, +- flags & (O_CLOEXEC | O_NONBLOCK)); ++ flags & TFD_SHARED_FCNTL_FLAGS); + if (ufd < 0) + kfree(ctx); + +@@ -221,7 +220,8 @@ + if (copy_from_user(&ktmr, utmr, sizeof(ktmr))) + return -EFAULT; + +- if (!timespec_valid(&ktmr.it_value) || ++ if ((flags & ~TFD_SETTIME_FLAGS) || ++ !timespec_valid(&ktmr.it_value) || + !timespec_valid(&ktmr.it_interval)) + return -EINVAL; + +diff -urN linux-2.6.27.19-5.1/fs/udf/super.c linux-2.6.27.23-0.1.1/fs/udf/super.c +--- linux-2.6.27.19-5.1/fs/udf/super.c 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/udf/super.c 2009-06-16 13:39:31.000000000 +0100 +@@ -83,10 +83,7 @@ + static void udf_put_super(struct super_block *); + static void udf_write_super(struct super_block *); + static int udf_remount_fs(struct super_block *, int *, char *); +-static int udf_check_valid(struct super_block *, int, int); +-static int udf_vrs(struct super_block *sb, int silent); + static void udf_load_logicalvolint(struct super_block *, kernel_extent_ad); +-static void udf_find_anchor(struct super_block *); + static int udf_find_fileset(struct super_block *, kernel_lb_addr *, + kernel_lb_addr *); + static void udf_load_fileset(struct super_block *, struct buffer_head *, +@@ -286,14 +283,8 @@ + seq_printf(seq, ",session=%u", sbi->s_session); + if (UDF_QUERY_FLAG(sb, UDF_FLAG_LASTBLOCK_SET)) + seq_printf(seq, ",lastblock=%u", sbi->s_last_block); +- /* +- * s_anchor[2] could be zeroed out in case there is no anchor +- * in the specified block, but then the "anchor=N" option +- * originally given by the user wasn't effective, so it's OK +- * if we don't show it. +- */ +- if (sbi->s_anchor[2] != 0) +- seq_printf(seq, ",anchor=%u", sbi->s_anchor[2]); ++ if (sbi->s_anchor != 0) ++ seq_printf(seq, ",anchor=%u", sbi->s_anchor); + /* + * volume, partition, fileset and rootdir seem to be ignored + * currently +@@ -585,22 +576,19 @@ + return 0; + } + +-static int udf_vrs(struct super_block *sb, int silent) ++/* Check Volume Structure Descriptors (ECMA 167 2/9.1) */ ++/* We also check any "CD-ROM Volume Descriptor Set" (ECMA 167 2/8.3.1) */ ++static loff_t udf_check_vsd(struct super_block *sb) + { + struct volStructDesc *vsd = NULL; + loff_t sector = 32768; + int sectorsize; + struct buffer_head *bh = NULL; +- int iso9660 = 0; + int nsr02 = 0; + int nsr03 = 0; + struct udf_sb_info *sbi; + +- /* Block size must be a multiple of 512 */ +- if (sb->s_blocksize & 511) +- return 0; + sbi = UDF_SB(sb); +- + if (sb->s_blocksize < sizeof(struct volStructDesc)) + sectorsize = sizeof(struct volStructDesc); + else +@@ -627,7 +615,6 @@ + break; + } else if (!strncmp(vsd->stdIdent, VSD_STD_ID_CD001, + VSD_STD_ID_LEN)) { +- iso9660 = sector; + switch (vsd->structType) { + case 0: + udf_debug("ISO9660 Boot Record found\n"); +@@ -679,136 +666,6 @@ + return 0; + } + +-/* +- * Check whether there is an anchor block in the given block +- */ +-static int udf_check_anchor_block(struct super_block *sb, sector_t block) +-{ +- struct buffer_head *bh; +- uint16_t ident; +- +- if (UDF_QUERY_FLAG(sb, UDF_FLAG_VARCONV) && +- udf_fixed_to_variable(block) >= +- sb->s_bdev->bd_inode->i_size >> sb->s_blocksize_bits) +- return 0; +- +- bh = udf_read_tagged(sb, block, block, &ident); +- if (!bh) +- return 0; +- brelse(bh); +- +- return ident == TAG_IDENT_AVDP; +-} +- +-/* Search for an anchor volume descriptor pointer */ +-static sector_t udf_scan_anchors(struct super_block *sb, sector_t lastblock) +-{ +- sector_t last[6]; +- int i; +- struct udf_sb_info *sbi = UDF_SB(sb); +- +- last[0] = lastblock; +- last[1] = last[0] - 1; +- last[2] = last[0] + 1; +- last[3] = last[0] - 2; +- last[4] = last[0] - 150; +- last[5] = last[0] - 152; +- +- /* according to spec, anchor is in either: +- * block 256 +- * lastblock-256 +- * lastblock +- * however, if the disc isn't closed, it could be 512 */ +- +- for (i = 0; i < ARRAY_SIZE(last); i++) { +- if (last[i] < 0) +- continue; +- if (last[i] >= sb->s_bdev->bd_inode->i_size >> +- sb->s_blocksize_bits) +- continue; +- +- if (udf_check_anchor_block(sb, last[i])) { +- sbi->s_anchor[0] = last[i]; +- sbi->s_anchor[1] = last[i] - 256; +- return last[i]; +- } +- +- if (last[i] < 256) +- continue; +- +- if (udf_check_anchor_block(sb, last[i] - 256)) { +- sbi->s_anchor[1] = last[i] - 256; +- return last[i]; +- } +- } +- +- if (udf_check_anchor_block(sb, sbi->s_session + 256)) { +- sbi->s_anchor[0] = sbi->s_session + 256; +- return last[0]; +- } +- if (udf_check_anchor_block(sb, sbi->s_session + 512)) { +- sbi->s_anchor[0] = sbi->s_session + 512; +- return last[0]; +- } +- return 0; +-} +- +-/* +- * Find an anchor volume descriptor. The function expects sbi->s_lastblock to +- * be the last block on the media. +- * +- * Return 1 if not found, 0 if ok +- * +- */ +-static void udf_find_anchor(struct super_block *sb) +-{ +- sector_t lastblock; +- struct buffer_head *bh = NULL; +- uint16_t ident; +- int i; +- struct udf_sb_info *sbi = UDF_SB(sb); +- +- lastblock = udf_scan_anchors(sb, sbi->s_last_block); +- if (lastblock) +- goto check_anchor; +- +- /* No anchor found? Try VARCONV conversion of block numbers */ +- UDF_SET_FLAG(sb, UDF_FLAG_VARCONV); +- /* Firstly, we try to not convert number of the last block */ +- lastblock = udf_scan_anchors(sb, +- udf_variable_to_fixed(sbi->s_last_block)); +- if (lastblock) +- goto check_anchor; +- +- /* Secondly, we try with converted number of the last block */ +- lastblock = udf_scan_anchors(sb, sbi->s_last_block); +- if (!lastblock) { +- /* VARCONV didn't help. Clear it. */ +- UDF_CLEAR_FLAG(sb, UDF_FLAG_VARCONV); +- } +- +-check_anchor: +- /* +- * Check located anchors and the anchor block supplied via +- * mount options +- */ +- for (i = 0; i < ARRAY_SIZE(sbi->s_anchor); i++) { +- if (!sbi->s_anchor[i]) +- continue; +- bh = udf_read_tagged(sb, sbi->s_anchor[i], +- sbi->s_anchor[i], &ident); +- if (!bh) +- sbi->s_anchor[i] = 0; +- else { +- brelse(bh); +- if (ident != TAG_IDENT_AVDP) +- sbi->s_anchor[i] = 0; +- } +- } +- +- sbi->s_last_block = lastblock; +-} +- + static int udf_find_fileset(struct super_block *sb, + kernel_lb_addr *fileset, + kernel_lb_addr *root) +@@ -1655,86 +1512,201 @@ + return 0; + } + ++static int udf_load_sequence(struct super_block *sb, struct buffer_head *bh, ++ kernel_lb_addr *fileset) ++{ ++ struct anchorVolDescPtr *anchor; ++ long main_s, main_e, reserve_s, reserve_e; ++ struct udf_sb_info *sbi; ++ ++ sbi = UDF_SB(sb); ++ anchor = (struct anchorVolDescPtr *)bh->b_data; ++ ++ /* Locate the main sequence */ ++ main_s = le32_to_cpu(anchor->mainVolDescSeqExt.extLocation); ++ main_e = le32_to_cpu(anchor->mainVolDescSeqExt.extLength); ++ main_e = main_e >> sb->s_blocksize_bits; ++ main_e += main_s; ++ ++ /* Locate the reserve sequence */ ++ reserve_s = le32_to_cpu(anchor->reserveVolDescSeqExt.extLocation); ++ reserve_e = le32_to_cpu(anchor->reserveVolDescSeqExt.extLength); ++ reserve_e = reserve_e >> sb->s_blocksize_bits; ++ reserve_e += reserve_s; ++ ++ /* Process the main & reserve sequences */ ++ /* responsible for finding the PartitionDesc(s) */ ++ if (!udf_process_sequence(sb, main_s, main_e, fileset)) ++ return 1; ++ return !udf_process_sequence(sb, reserve_s, reserve_e, fileset); ++} ++ + /* +- * udf_check_valid() ++ * Check whether there is an anchor block in the given block and ++ * load Volume Descriptor Sequence if so. + */ +-static int udf_check_valid(struct super_block *sb, int novrs, int silent) ++static int udf_check_anchor_block(struct super_block *sb, sector_t block, ++ kernel_lb_addr *fileset) + { +- long block; +- struct udf_sb_info *sbi = UDF_SB(sb); ++ struct buffer_head *bh; ++ uint16_t ident; ++ int ret; + +- if (novrs) { +- udf_debug("Validity check skipped because of novrs option\n"); ++ if (UDF_QUERY_FLAG(sb, UDF_FLAG_VARCONV) && ++ udf_fixed_to_variable(block) >= ++ sb->s_bdev->bd_inode->i_size >> sb->s_blocksize_bits) ++ return 0; ++ ++ bh = udf_read_tagged(sb, block, block, &ident); ++ if (!bh) ++ return 0; ++ if (ident != TAG_IDENT_AVDP) { ++ brelse(bh); + return 0; + } +- /* Check that it is NSR02 compliant */ +- /* Process any "CD-ROM Volume Descriptor Set" (ECMA 167 2/8.3.1) */ +- block = udf_vrs(sb, silent); +- if (block == -1) +- udf_debug("Failed to read byte 32768. Assuming open " +- "disc. Skipping validity check\n"); +- if (block && !sbi->s_last_block) +- sbi->s_last_block = udf_get_last_block(sb); +- return !block; ++ ret = udf_load_sequence(sb, bh, fileset); ++ brelse(bh); ++ return ret; + } + +-static int udf_load_sequence(struct super_block *sb, kernel_lb_addr *fileset) ++/* Search for an anchor volume descriptor pointer */ ++static sector_t udf_scan_anchors(struct super_block *sb, sector_t lastblock, ++ kernel_lb_addr *fileset) + { +- struct anchorVolDescPtr *anchor; +- uint16_t ident; +- struct buffer_head *bh; +- long main_s, main_e, reserve_s, reserve_e; ++ sector_t last[6]; + int i; +- struct udf_sb_info *sbi; ++ struct udf_sb_info *sbi = UDF_SB(sb); ++ int last_count = 0; + +- if (!sb) +- return 1; +- sbi = UDF_SB(sb); ++ /* First try user provided anchor */ ++ if (sbi->s_anchor) { ++ if (udf_check_anchor_block(sb, sbi->s_anchor, fileset)) ++ return lastblock; ++ } ++ /* ++ * according to spec, anchor is in either: ++ * block 256 ++ * lastblock-256 ++ * lastblock ++ * however, if the disc isn't closed, it could be 512. ++ */ ++ if (udf_check_anchor_block(sb, sbi->s_session + 256, fileset)) ++ return lastblock; ++ /* ++ * The trouble is which block is the last one. Drives often misreport ++ * this so we try various possibilities. ++ */ ++ last[last_count++] = lastblock; ++ if (lastblock >= 1) ++ last[last_count++] = lastblock - 1; ++ last[last_count++] = lastblock + 1; ++ if (lastblock >= 2) ++ last[last_count++] = lastblock - 2; ++ if (lastblock >= 150) ++ last[last_count++] = lastblock - 150; ++ if (lastblock >= 152) ++ last[last_count++] = lastblock - 152; + +- for (i = 0; i < ARRAY_SIZE(sbi->s_anchor); i++) { +- if (!sbi->s_anchor[i]) ++ for (i = 0; i < last_count; i++) { ++ if (last[i] >= sb->s_bdev->bd_inode->i_size >> ++ sb->s_blocksize_bits) + continue; +- +- bh = udf_read_tagged(sb, sbi->s_anchor[i], sbi->s_anchor[i], +- &ident); +- if (!bh) ++ if (udf_check_anchor_block(sb, last[i], fileset)) ++ return last[i]; ++ if (last[i] < 256) + continue; ++ if (udf_check_anchor_block(sb, last[i] - 256, fileset)) ++ return last[i]; ++ } ++ ++ /* Finally try block 512 in case media is open */ ++ if (udf_check_anchor_block(sb, sbi->s_session + 512, fileset)) ++ return last[0]; ++ return 0; ++} + +- anchor = (struct anchorVolDescPtr *)bh->b_data; ++/* ++ * Find an anchor volume descriptor and load Volume Descriptor Sequence from ++ * area specified by it. The function expects sbi->s_lastblock to be the last ++ * block on the media. ++ * ++ * Return 1 if ok, 0 if not found. ++ * ++ */ ++static int udf_find_anchor(struct super_block *sb, ++ kernel_lb_addr *fileset) ++{ ++ sector_t lastblock; ++ struct udf_sb_info *sbi = UDF_SB(sb); + +- /* Locate the main sequence */ +- main_s = le32_to_cpu(anchor->mainVolDescSeqExt.extLocation); +- main_e = le32_to_cpu(anchor->mainVolDescSeqExt.extLength); +- main_e = main_e >> sb->s_blocksize_bits; +- main_e += main_s; +- +- /* Locate the reserve sequence */ +- reserve_s = le32_to_cpu( +- anchor->reserveVolDescSeqExt.extLocation); +- reserve_e = le32_to_cpu( +- anchor->reserveVolDescSeqExt.extLength); +- reserve_e = reserve_e >> sb->s_blocksize_bits; +- reserve_e += reserve_s; ++ lastblock = udf_scan_anchors(sb, sbi->s_last_block, fileset); ++ if (lastblock) ++ goto out; + +- brelse(bh); ++ /* No anchor found? Try VARCONV conversion of block numbers */ ++ UDF_SET_FLAG(sb, UDF_FLAG_VARCONV); ++ /* Firstly, we try to not convert number of the last block */ ++ lastblock = udf_scan_anchors(sb, ++ udf_variable_to_fixed(sbi->s_last_block), ++ fileset); ++ if (lastblock) ++ goto out; + +- /* Process the main & reserve sequences */ +- /* responsible for finding the PartitionDesc(s) */ +- if (!(udf_process_sequence(sb, main_s, main_e, +- fileset) && +- udf_process_sequence(sb, reserve_s, reserve_e, +- fileset))) +- break; ++ /* Secondly, we try with converted number of the last block */ ++ lastblock = udf_scan_anchors(sb, sbi->s_last_block, fileset); ++ if (!lastblock) { ++ /* VARCONV didn't help. Clear it. */ ++ UDF_CLEAR_FLAG(sb, UDF_FLAG_VARCONV); ++ return 0; + } ++out: ++ sbi->s_last_block = lastblock; ++ return 1; ++} + +- if (i == ARRAY_SIZE(sbi->s_anchor)) { +- udf_debug("No Anchor block found\n"); +- return 1; ++/* ++ * Check Volume Structure Descriptor, find Anchor block and load Volume ++ * Descriptor Sequence ++ */ ++static int udf_load_vrs(struct super_block *sb, struct udf_options *uopt, ++ int silent, kernel_lb_addr *fileset) ++{ ++ struct udf_sb_info *sbi = UDF_SB(sb); ++ loff_t nsr_off; ++ ++ if (!sb_set_blocksize(sb, uopt->blocksize)) { ++ if (!silent) ++ printk(KERN_WARNING "UDF-fs: Bad block size\n"); ++ return 0; ++ } ++ sbi->s_last_block = uopt->lastblock; ++ if (!uopt->novrs) { ++ /* Check that it is NSR02 compliant */ ++ nsr_off = udf_check_vsd(sb); ++ if (!nsr_off) { ++ if (!silent) ++ printk(KERN_WARNING "UDF-fs: No VRS found\n"); ++ return 0; ++ } ++ if (nsr_off == -1) ++ udf_debug("Failed to read byte 32768. Assuming open " ++ "disc. Skipping validity check\n"); ++ if (!sbi->s_last_block) ++ sbi->s_last_block = udf_get_last_block(sb); ++ } else { ++ udf_debug("Validity check skipped because of novrs option\n"); + } +- udf_debug("Using anchor in block %d\n", sbi->s_anchor[i]); + +- return 0; ++ /* Look for anchor block and load Volume Descriptor Sequence */ ++ sbi->s_anchor = uopt->anchor; ++ if (!udf_find_anchor(sb, fileset)) { ++ if (!silent) ++ printk(KERN_WARNING "UDF-fs: No anchor found\n"); ++ return 0; ++ } ++ return 1; + } ++ + + static void udf_open_lvid(struct super_block *sb) + { +@@ -1908,18 +1880,6 @@ + + udf_debug("Multi-session=%d\n", sbi->s_session); + +- sbi->s_last_block = uopt.lastblock; +- sbi->s_anchor[0] = sbi->s_anchor[1] = 0; +- sbi->s_anchor[2] = uopt.anchor; +- +- if (udf_check_valid(sb, uopt.novrs, silent)) { +- /* read volume recognition sequences */ +- printk(KERN_WARNING "UDF-fs: No VRS found\n"); +- goto error_out; +- } +- +- udf_find_anchor(sb); +- + /* Fill in the rest of the superblock */ + sb->s_op = &udf_sb_ops; + sb->s_export_op = &udf_export_ops; +@@ -1928,7 +1888,7 @@ + sb->s_magic = UDF_SUPER_MAGIC; + sb->s_time_gran = 1000; + +- if (udf_load_sequence(sb, &fileset)) { ++ if (!udf_load_vrs(sb, &uopt, silent, &fileset)) { + printk(KERN_WARNING "UDF-fs: No partition found (1)\n"); + goto error_out; + } +diff -urN linux-2.6.27.19-5.1/fs/udf/udf_sb.h linux-2.6.27.23-0.1.1/fs/udf/udf_sb.h +--- linux-2.6.27.19-5.1/fs/udf/udf_sb.h 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/udf/udf_sb.h 2009-06-16 13:39:31.000000000 +0100 +@@ -114,7 +114,7 @@ + + /* Sector headers */ + __s32 s_session; +- __u32 s_anchor[3]; ++ __u32 s_anchor; + __u32 s_last_block; + + struct buffer_head *s_lvid_bh; +diff -urN linux-2.6.27.19-5.1/fs/xfs/xfs_inode.c linux-2.6.27.23-0.1.1/fs/xfs/xfs_inode.c +--- linux-2.6.27.19-5.1/fs/xfs/xfs_inode.c 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/fs/xfs/xfs_inode.c 2009-06-16 13:39:36.000000000 +0100 +@@ -1306,8 +1306,10 @@ + * necessary. + */ + if (ip->i_df.if_flags & XFS_IFEXTENTS) { ++ xfs_ilock(ip, XFS_ILOCK_SHARED); + error = xfs_bmap_last_offset(NULL, ip, &last_block, + XFS_DATA_FORK); ++ xfs_iunlock(ip, XFS_ILOCK_SHARED); + if (error) { + last_block = 0; + } +diff -urN linux-2.6.27.19-5.1/include/acpi/acpi_numa.h linux-2.6.27.23-0.1.1/include/acpi/acpi_numa.h +--- linux-2.6.27.19-5.1/include/acpi/acpi_numa.h 2009-06-16 13:55:16.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/include/acpi/acpi_numa.h 2009-06-16 13:41:15.000000000 +0100 +@@ -15,6 +15,7 @@ + extern int node_to_pxm(int); + extern void __acpi_map_pxm_to_node(int, int); + extern int acpi_map_pxm_to_node(int); ++extern unsigned char acpi_srat_revision; + + #endif /* CONFIG_ACPI_NUMA */ + #endif /* __ACP_NUMA_H */ +diff -urN linux-2.6.27.19-5.1/include/asm-mips/compat.h linux-2.6.27.23-0.1.1/include/asm-mips/compat.h +--- linux-2.6.27.19-5.1/include/asm-mips/compat.h 2009-06-16 13:55:27.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/include/asm-mips/compat.h 2009-06-16 13:41:22.000000000 +0100 +@@ -3,6 +3,8 @@ + /* + * Architecture specific compatibility types + */ ++#include ++#include + #include + #include + #include +@@ -218,4 +220,9 @@ + compat_ulong_t __unused2; + }; + ++static inline int is_compat_task(void) ++{ ++ return test_thread_flag(TIF_32BIT); ++} ++ + #endif /* _ASM_COMPAT_H */ +diff -urN linux-2.6.27.19-5.1/include/asm-mips/seccomp.h linux-2.6.27.23-0.1.1/include/asm-mips/seccomp.h +--- linux-2.6.27.19-5.1/include/asm-mips/seccomp.h 2009-06-16 13:55:27.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/include/asm-mips/seccomp.h 2009-06-16 13:41:22.000000000 +0100 +@@ -1,6 +1,5 @@ + #ifndef __ASM_SECCOMP_H + +-#include + #include + + #define __NR_seccomp_read __NR_read +diff -urN linux-2.6.27.19-5.1/include/asm-x86/apic.h linux-2.6.27.23-0.1.1/include/asm-x86/apic.h +--- linux-2.6.27.19-5.1/include/asm-x86/apic.h 2009-06-16 13:55:33.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/include/asm-x86/apic.h 2009-06-16 13:41:27.000000000 +0100 +@@ -95,11 +95,19 @@ + } + + #ifndef CONFIG_X86_32 +- extern int x2apic, x2apic_preenabled; ++ extern int x2apic, x2apic_preenabled, x2apic_phys; + extern void check_x2apic(void); + extern void enable_x2apic(void); ++ extern int x2apic_enabled(void); + extern void enable_IR_x2apic(void); + extern void x2apic_icr_write(u32 low, u32 id); ++#else ++ #define x2apic 0 ++ #define x2apic_phys 0 ++static inline int x2apic_enabled(void) ++{ ++ return 0; ++} + #endif + + struct apic_ops { +diff -urN linux-2.6.27.19-5.1/include/asm-x86/e820.h linux-2.6.27.23-0.1.1/include/asm-x86/e820.h +--- linux-2.6.27.19-5.1/include/asm-x86/e820.h 2009-06-16 13:55:33.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/include/asm-x86/e820.h 2009-06-16 13:41:27.000000000 +0100 +@@ -127,7 +127,11 @@ + #endif /* __KERNEL__ */ + #endif /* __ASSEMBLY__ */ + ++#ifndef CONFIG_XEN + #define ISA_START_ADDRESS 0xa0000 ++#else ++#define ISA_START_ADDRESS 0 ++#endif + #define ISA_END_ADDRESS 0x100000 + #define is_ISA_range(s, e) ((s) >= ISA_START_ADDRESS && (e) < ISA_END_ADDRESS) + +diff -urN linux-2.6.27.19-5.1/include/asm-x86/kexec.h linux-2.6.27.23-0.1.1/include/asm-x86/kexec.h +--- linux-2.6.27.19-5.1/include/asm-x86/kexec.h 2009-06-16 13:55:33.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/include/asm-x86/kexec.h 2009-06-16 13:41:26.000000000 +0100 +@@ -10,6 +10,7 @@ + # define VA_PTE_0 5 + # define PA_PTE_1 6 + # define VA_PTE_1 7 ++# ifndef CONFIG_XEN + # define PA_SWAP_PAGE 8 + # ifdef CONFIG_X86_PAE + # define PA_PMD_0 9 +@@ -20,6 +21,18 @@ + # else + # define PAGES_NR 9 + # endif ++# else /* CONFIG_XEN */ ++/* ++ * The hypervisor interface implicitly requires that all entries (except ++ * for possibly the final one) are arranged in matching PA_/VA_ pairs. ++ */ ++# define PA_PMD_0 8 ++# define VA_PMD_0 9 ++# define PA_PMD_1 10 ++# define VA_PMD_1 11 ++# define PA_SWAP_PAGE 12 ++# define PAGES_NR 13 ++# endif /* CONFIG_XEN */ + #else + # define PA_CONTROL_PAGE 0 + # define VA_CONTROL_PAGE 1 +diff -urN linux-2.6.27.19-5.1/include/asm-x86/mach-xen/asm/hypervisor.h linux-2.6.27.23-0.1.1/include/asm-x86/mach-xen/asm/hypervisor.h +--- linux-2.6.27.19-5.1/include/asm-x86/mach-xen/asm/hypervisor.h 2009-06-16 13:55:33.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/include/asm-x86/mach-xen/asm/hypervisor.h 2009-06-16 13:41:27.000000000 +0100 +@@ -115,6 +115,8 @@ + unsigned long vstart, unsigned int order, unsigned int address_bits); + void xen_destroy_contiguous_region( + unsigned long vstart, unsigned int order); ++int early_create_contiguous_region(unsigned long pfn, unsigned int order, ++ unsigned int address_bits); + + struct page; + +@@ -130,7 +132,7 @@ + #define scrub_pages(_p,_n) ((void)0) + #endif + +-#ifdef CONFIG_XEN ++#if defined(CONFIG_XEN) && !defined(MODULE) + + DECLARE_PER_CPU(bool, xen_lazy_mmu); + +@@ -174,6 +176,18 @@ + } + #endif + ++#else /* !CONFIG_XEN || MODULE */ ++ ++static inline void xen_multicall_flush(bool ignore) {} ++#define arch_use_lazy_mmu_mode() false ++#define xen_multi_update_va_mapping(...) ({ BUG(); -ENOSYS; }) ++#define xen_multi_mmu_update(...) ({ BUG(); -ENOSYS; }) ++#define xen_multi_mmuext_op(...) ({ BUG(); -ENOSYS; }) ++ ++#endif /* CONFIG_XEN && !MODULE */ ++ ++#ifdef CONFIG_XEN ++ + struct gnttab_map_grant_ref; + bool gnttab_pre_map_adjust(unsigned int cmd, struct gnttab_map_grant_ref *, + unsigned int count); +@@ -188,13 +202,7 @@ + } + #endif + +-#else /* CONFIG_XEN */ +- +-static inline void xen_multicall_flush(bool ignore) {} +-#define arch_use_lazy_mmu_mode() false +-#define xen_multi_update_va_mapping(...) ({ BUG(); -ENOSYS; }) +-#define xen_multi_mmu_update(...) ({ BUG(); -ENOSYS; }) +-#define xen_multi_mmuext_op(...) ({ BUG(); -ENOSYS; }) ++#else /* !CONFIG_XEN */ + + #define gnttab_pre_map_adjust(...) false + #define gnttab_post_map_adjust(...) ({ BUG(); -ENOSYS; }) +diff -urN linux-2.6.27.19-5.1/include/asm-x86/mach-xen/asm/io_32.h linux-2.6.27.23-0.1.1/include/asm-x86/mach-xen/asm/io_32.h +--- linux-2.6.27.19-5.1/include/asm-x86/mach-xen/asm/io_32.h 2009-06-16 13:55:33.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/include/asm-x86/mach-xen/asm/io_32.h 1970-01-01 01:00:00.000000000 +0100 +@@ -1,295 +0,0 @@ +-#ifndef _ASM_IO_H +-#define _ASM_IO_H +- +-#include +-#include +- +-/* +- * This file contains the definitions for the x86 IO instructions +- * inb/inw/inl/outb/outw/outl and the "string versions" of the same +- * (insb/insw/insl/outsb/outsw/outsl). You can also use "pausing" +- * versions of the single-IO instructions (inb_p/inw_p/..). +- * +- * This file is not meant to be obfuscating: it's just complicated +- * to (a) handle it all in a way that makes gcc able to optimize it +- * as well as possible and (b) trying to avoid writing the same thing +- * over and over again with slight variations and possibly making a +- * mistake somewhere. +- */ +- +-/* +- * Thanks to James van Artsdalen for a better timing-fix than +- * the two short jumps: using outb's to a nonexistent port seems +- * to guarantee better timings even on fast machines. +- * +- * On the other hand, I'd like to be sure of a non-existent port: +- * I feel a bit unsafe about using 0x80 (should be safe, though) +- * +- * Linus +- */ +- +- /* +- * Bit simplified and optimized by Jan Hubicka +- * Support of BIGMEM added by Gerhard Wichert, Siemens AG, July 1999. +- * +- * isa_memset_io, isa_memcpy_fromio, isa_memcpy_toio added, +- * isa_read[wl] and isa_write[wl] fixed +- * - Arnaldo Carvalho de Melo +- */ +- +-#define IO_SPACE_LIMIT 0xffff +- +-#define XQUAD_PORTIO_BASE 0xfe400000 +-#define XQUAD_PORTIO_QUAD 0x40000 /* 256k per quad. */ +- +-#ifdef __KERNEL__ +- +-#include +- +-#include +-#include +- +-/* +- * Convert a virtual cached pointer to an uncached pointer +- */ +-#define xlate_dev_kmem_ptr(p) p +- +-/** +- * virt_to_phys - map virtual addresses to physical +- * @address: address to remap +- * +- * The returned physical address is the physical (CPU) mapping for +- * the memory address given. It is only valid to use this function on +- * addresses directly mapped or allocated via kmalloc. +- * +- * This function does not give bus mappings for DMA transfers. In +- * almost all conceivable cases a device driver should not be using +- * this function +- */ +- +-static inline unsigned long virt_to_phys(volatile void *address) +-{ +- return __pa(address); +-} +- +-/** +- * phys_to_virt - map physical address to virtual +- * @address: address to remap +- * +- * The returned virtual address is a current CPU mapping for +- * the memory address given. It is only valid to use this function on +- * addresses that have a kernel mapping +- * +- * This function does not handle bus mappings for DMA transfers. In +- * almost all conceivable cases a device driver should not be using +- * this function +- */ +- +-static inline void *phys_to_virt(unsigned long address) +-{ +- return __va(address); +-} +- +-/* +- * Change "struct page" to physical address. +- */ +-#define page_to_pseudophys(page) ((dma_addr_t)page_to_pfn(page) << PAGE_SHIFT) +-#define page_to_phys(page) (phys_to_machine(page_to_pseudophys(page))) +-#define page_to_bus(page) (phys_to_machine(page_to_pseudophys(page))) +- +-#define bio_to_pseudophys(bio) (page_to_pseudophys(bio_page((bio))) + \ +- (unsigned long) bio_offset((bio))) +-#define bvec_to_pseudophys(bv) (page_to_pseudophys((bv)->bv_page) + \ +- (unsigned long) (bv)->bv_offset) +- +-#define BIOVEC_PHYS_MERGEABLE(vec1, vec2) \ +- (((bvec_to_phys((vec1)) + (vec1)->bv_len) == bvec_to_phys((vec2))) && \ +- ((bvec_to_pseudophys((vec1)) + (vec1)->bv_len) == \ +- bvec_to_pseudophys((vec2)))) +- +-/** +- * ioremap - map bus memory into CPU space +- * @offset: bus address of the memory +- * @size: size of the resource to map +- * +- * ioremap performs a platform specific sequence of operations to +- * make bus memory CPU accessible via the readb/readw/readl/writeb/ +- * writew/writel functions and the other mmio helpers. The returned +- * address is not guaranteed to be usable directly as a virtual +- * address. +- * +- * If the area you are trying to map is a PCI BAR you should have a +- * look at pci_iomap(). +- */ +-extern void __iomem *ioremap_nocache(resource_size_t offset, unsigned long size); +-extern void __iomem *ioremap_cache(resource_size_t offset, unsigned long size); +-extern void __iomem *ioremap_prot(resource_size_t offset, unsigned long size, +- unsigned long prot_val); +- +-/* +- * The default ioremap() behavior is non-cached: +- */ +-static inline void __iomem *ioremap(resource_size_t offset, unsigned long size) +-{ +- return ioremap_nocache(offset, size); +-} +- +-extern void iounmap(volatile void __iomem *addr); +- +-/* +- * ISA I/O bus memory addresses are 1:1 with the physical address. +- */ +-#define isa_virt_to_bus(_x) ({ BUG(); virt_to_bus(_x); }) +-#define isa_page_to_bus(_x) isa_page_to_bus_is_UNSUPPORTED->x +-#define isa_bus_to_virt(_x) (void *)(__fix_to_virt(FIX_ISAMAP_BEGIN) + (_x)) +- +-/* +- * However PCI ones are not necessarily 1:1 and therefore these interfaces +- * are forbidden in portable PCI drivers. +- * +- * Allow them on x86 for legacy drivers, though. +- */ +-#define virt_to_bus(_x) phys_to_machine(__pa(_x)) +-#define bus_to_virt(_x) __va(machine_to_phys(_x)) +- +-static inline void +-memset_io(volatile void __iomem *addr, unsigned char val, int count) +-{ +- memset((void __force *)addr, val, count); +-} +- +-static inline void +-memcpy_fromio(void *dst, const volatile void __iomem *src, int count) +-{ +- __memcpy(dst, (const void __force *)src, count); +-} +- +-static inline void +-memcpy_toio(volatile void __iomem *dst, const void *src, int count) +-{ +- __memcpy((void __force *)dst, src, count); +-} +- +-/* +- * ISA space is 'always mapped' on a typical x86 system, no need to +- * explicitly ioremap() it. The fact that the ISA IO space is mapped +- * to PAGE_OFFSET is pure coincidence - it does not mean ISA values +- * are physical addresses. The following constant pointer can be +- * used as the IO-area pointer (it can be iounmapped as well, so the +- * analogy with PCI is quite large): +- */ +-#define __ISA_IO_base ((char __iomem *)(fix_to_virt(FIX_ISAMAP_BEGIN))) +- +-/* +- * Cache management +- * +- * This needed for two cases +- * 1. Out of order aware processors +- * 2. Accidentally out of order processors (PPro errata #51) +- */ +- +-#if defined(CONFIG_X86_OOSTORE) || defined(CONFIG_X86_PPRO_FENCE) +- +-static inline void flush_write_buffers(void) +-{ +- asm volatile("lock; addl $0,0(%%esp)": : :"memory"); +-} +- +-#else +- +-#define flush_write_buffers() do { } while (0) +- +-#endif +- +-#endif /* __KERNEL__ */ +- +-extern void xen_io_delay(void); +-#define native_io_delay xen_io_delay +- +-extern int io_delay_type; +-extern void io_delay_init(void); +- +-static inline void slow_down_io(void) +-{ +- native_io_delay(); +-#ifdef REALLY_SLOW_IO +- native_io_delay(); +- native_io_delay(); +- native_io_delay(); +-#endif +-} +- +-#define __BUILDIO(bwl, bw, type) \ +-static inline void out##bwl(unsigned type value, int port) \ +-{ \ +- out##bwl##_local(value, port); \ +-} \ +- \ +-static inline unsigned type in##bwl(int port) \ +-{ \ +- return in##bwl##_local(port); \ +-} +- +-#define BUILDIO(bwl, bw, type) \ +-static inline void out##bwl##_local(unsigned type value, int port) \ +-{ \ +- asm volatile("out" #bwl " %" #bw "0, %w1" \ +- : : "a"(value), "Nd"(port)); \ +-} \ +- \ +-static inline unsigned type in##bwl##_local(int port) \ +-{ \ +- unsigned type value; \ +- asm volatile("in" #bwl " %w1, %" #bw "0" \ +- : "=a"(value) : "Nd"(port)); \ +- return value; \ +-} \ +- \ +-static inline void out##bwl##_local_p(unsigned type value, int port) \ +-{ \ +- out##bwl##_local(value, port); \ +- slow_down_io(); \ +-} \ +- \ +-static inline unsigned type in##bwl##_local_p(int port) \ +-{ \ +- unsigned type value = in##bwl##_local(port); \ +- slow_down_io(); \ +- return value; \ +-} \ +- \ +-__BUILDIO(bwl, bw, type) \ +- \ +-static inline void out##bwl##_p(unsigned type value, int port) \ +-{ \ +- out##bwl(value, port); \ +- slow_down_io(); \ +-} \ +- \ +-static inline unsigned type in##bwl##_p(int port) \ +-{ \ +- unsigned type value = in##bwl(port); \ +- slow_down_io(); \ +- return value; \ +-} \ +- \ +-static inline void outs##bwl(int port, const void *addr, unsigned long count) \ +-{ \ +- asm volatile("rep; outs" #bwl \ +- : "+S"(addr), "+c"(count) : "d"(port)); \ +-} \ +- \ +-static inline void ins##bwl(int port, void *addr, unsigned long count) \ +-{ \ +- asm volatile("rep; ins" #bwl \ +- : "+D"(addr), "+c"(count) : "d"(port)); \ +-} +- +-BUILDIO(b, b, char) +-BUILDIO(w, w, short) +-BUILDIO(l, , int) +- +-/* We will be supplying our own /dev/mem implementation */ +-#define ARCH_HAS_DEV_MEM +- +-#endif +diff -urN linux-2.6.27.19-5.1/include/asm-x86/mach-xen/asm/io_64.h linux-2.6.27.23-0.1.1/include/asm-x86/mach-xen/asm/io_64.h +--- linux-2.6.27.19-5.1/include/asm-x86/mach-xen/asm/io_64.h 2009-06-16 13:55:33.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/include/asm-x86/mach-xen/asm/io_64.h 1970-01-01 01:00:00.000000000 +0100 +@@ -1,264 +0,0 @@ +-#ifndef _ASM_IO_H +-#define _ASM_IO_H +- +-#include +- +-/* +- * This file contains the definitions for the x86 IO instructions +- * inb/inw/inl/outb/outw/outl and the "string versions" of the same +- * (insb/insw/insl/outsb/outsw/outsl). You can also use "pausing" +- * versions of the single-IO instructions (inb_p/inw_p/..). +- * +- * This file is not meant to be obfuscating: it's just complicated +- * to (a) handle it all in a way that makes gcc able to optimize it +- * as well as possible and (b) trying to avoid writing the same thing +- * over and over again with slight variations and possibly making a +- * mistake somewhere. +- */ +- +-/* +- * Thanks to James van Artsdalen for a better timing-fix than +- * the two short jumps: using outb's to a nonexistent port seems +- * to guarantee better timings even on fast machines. +- * +- * On the other hand, I'd like to be sure of a non-existent port: +- * I feel a bit unsafe about using 0x80 (should be safe, though) +- * +- * Linus +- */ +- +- /* +- * Bit simplified and optimized by Jan Hubicka +- * Support of BIGMEM added by Gerhard Wichert, Siemens AG, July 1999. +- * +- * isa_memset_io, isa_memcpy_fromio, isa_memcpy_toio added, +- * isa_read[wl] and isa_write[wl] fixed +- * - Arnaldo Carvalho de Melo +- */ +- +-extern void xen_io_delay(void); +-#define native_io_delay xen_io_delay +- +-extern int io_delay_type; +-extern void io_delay_init(void); +- +-static inline void slow_down_io(void) +-{ +- native_io_delay(); +-#ifdef REALLY_SLOW_IO +- native_io_delay(); +- native_io_delay(); +- native_io_delay(); +-#endif +-} +- +-/* +- * Talk about misusing macros.. +- */ +-#define __OUT1(s, x) \ +-static inline void out##s(unsigned x value, unsigned short port) { +- +-#define __OUT2(s, s1, s2) \ +-asm volatile ("out" #s " %" s1 "0,%" s2 "1" +- +-#ifndef REALLY_SLOW_IO +-#define REALLY_SLOW_IO +-#define UNSET_REALLY_SLOW_IO +-#endif +- +-#define __OUT(s, s1, x) \ +- __OUT1(s, x) __OUT2(s, s1, "w") : : "a" (value), "Nd" (port)); \ +- } \ +- __OUT1(s##_p, x) __OUT2(s, s1, "w") : : "a" (value), "Nd" (port)); \ +- slow_down_io(); \ +-} +- +-#define __IN1(s) \ +-static inline RETURN_TYPE in##s(unsigned short port) \ +-{ \ +- RETURN_TYPE _v; +- +-#define __IN2(s, s1, s2) \ +- asm volatile ("in" #s " %" s2 "1,%" s1 "0" +- +-#define __IN(s, s1, i...) \ +- __IN1(s) __IN2(s, s1, "w") : "=a" (_v) : "Nd" (port), ##i); \ +- return _v; \ +- } \ +- __IN1(s##_p) __IN2(s, s1, "w") : "=a" (_v) : "Nd" (port), ##i); \ +- slow_down_io(); \ +- return _v; } +- +-#ifdef UNSET_REALLY_SLOW_IO +-#undef REALLY_SLOW_IO +-#endif +- +-#define __INS(s) \ +-static inline void ins##s(unsigned short port, void *addr, \ +- unsigned long count) \ +-{ \ +- asm volatile ("rep ; ins" #s \ +- : "=D" (addr), "=c" (count) \ +- : "d" (port), "0" (addr), "1" (count)); \ +-} +- +-#define __OUTS(s) \ +-static inline void outs##s(unsigned short port, const void *addr, \ +- unsigned long count) \ +-{ \ +- asm volatile ("rep ; outs" #s \ +- : "=S" (addr), "=c" (count) \ +- : "d" (port), "0" (addr), "1" (count)); \ +-} +- +-#define RETURN_TYPE unsigned char +-__IN(b, "") +-#undef RETURN_TYPE +-#define RETURN_TYPE unsigned short +-__IN(w, "") +-#undef RETURN_TYPE +-#define RETURN_TYPE unsigned int +-__IN(l, "") +-#undef RETURN_TYPE +- +-__OUT(b, "b", char) +-__OUT(w, "w", short) +-__OUT(l, , int) +- +-__INS(b) +-__INS(w) +-__INS(l) +- +-__OUTS(b) +-__OUTS(w) +-__OUTS(l) +- +-#define IO_SPACE_LIMIT 0xffff +- +-#if defined(__KERNEL__) && defined(__x86_64__) +- +-#include +- +-#ifndef __i386__ +-/* +- * Change virtual addresses to physical addresses and vv. +- * These are pretty trivial +- */ +-static inline unsigned long virt_to_phys(volatile void *address) +-{ +- return __pa(address); +-} +- +-static inline void *phys_to_virt(unsigned long address) +-{ +- return __va(address); +-} +- +-#define virt_to_bus(_x) phys_to_machine(__pa(_x)) +-#define bus_to_virt(_x) __va(machine_to_phys(_x)) +-#endif +- +-/* +- * Change "struct page" to physical address. +- */ +-#define page_to_pseudophys(page) ((dma_addr_t)page_to_pfn(page) << PAGE_SHIFT) +-#define page_to_phys(page) (phys_to_machine(page_to_pseudophys(page))) +-#define page_to_bus(page) (phys_to_machine(page_to_pseudophys(page))) +- +-#define bio_to_pseudophys(bio) (page_to_pseudophys(bio_page((bio))) + \ +- (unsigned long) bio_offset((bio))) +-#define bvec_to_pseudophys(bv) (page_to_pseudophys((bv)->bv_page) + \ +- (unsigned long) (bv)->bv_offset) +- +-#define BIOVEC_PHYS_MERGEABLE(vec1, vec2) \ +- (((bvec_to_phys((vec1)) + (vec1)->bv_len) == bvec_to_phys((vec2))) && \ +- ((bvec_to_pseudophys((vec1)) + (vec1)->bv_len) == \ +- bvec_to_pseudophys((vec2)))) +- +-#include +- +-extern void early_ioremap_init(void); +-extern void *early_ioremap(unsigned long addr, unsigned long size); +-extern void early_iounmap(void *addr, unsigned long size); +- +-/* +- * This one maps high address device memory and turns off caching for that area. +- * it's useful if some control registers are in such an area and write combining +- * or read caching is not desirable: +- */ +-extern void __iomem *ioremap_nocache(resource_size_t offset, unsigned long size); +-extern void __iomem *ioremap_cache(resource_size_t offset, unsigned long size); +-extern void __iomem *ioremap_prot(resource_size_t offset, unsigned long size, +- unsigned long prot_val); +- +-/* +- * The default ioremap() behavior is non-cached: +- */ +-static inline void __iomem *ioremap(resource_size_t offset, unsigned long size) +-{ +- return ioremap_nocache(offset, size); +-} +- +-extern void iounmap(volatile void __iomem *addr); +- +-extern void __iomem *fix_ioremap(unsigned idx, unsigned long phys); +- +-/* +- * ISA I/O bus memory addresses are 1:1 with the physical address. +- */ +- +-#define isa_virt_to_bus(_x) ({ BUG(); virt_to_bus(_x); }) +-#define isa_page_to_bus(_x) isa_page_to_bus_is_UNSUPPORTED->x +-#define isa_bus_to_virt(_x) (void *)(__fix_to_virt(FIX_ISAMAP_BEGIN) + (_x)) +- +-/* +- * However PCI ones are not necessarily 1:1 and therefore these interfaces +- * are forbidden in portable PCI drivers. +- * +- * Allow them on x86 for legacy drivers, though. +- */ +-#define virt_to_bus(_x) phys_to_machine(__pa(_x)) +-#define bus_to_virt(_x) __va(machine_to_phys(_x)) +- +-void __memcpy_fromio(void *, unsigned long, unsigned); +-void __memcpy_toio(unsigned long, const void *, unsigned); +- +-static inline void memcpy_fromio(void *to, const volatile void __iomem *from, +- unsigned len) +-{ +- __memcpy_fromio(to, (unsigned long)from, len); +-} +- +-static inline void memcpy_toio(volatile void __iomem *to, const void *from, +- unsigned len) +-{ +- __memcpy_toio((unsigned long)to, from, len); +-} +- +-void memset_io(volatile void __iomem *a, int b, size_t c); +- +-/* +- * ISA space is 'always mapped' on a typical x86 system, no need to +- * explicitly ioremap() it. The fact that the ISA IO space is mapped +- * to PAGE_OFFSET is pure coincidence - it does not mean ISA values +- * are physical addresses. The following constant pointer can be +- * used as the IO-area pointer (it can be iounmapped as well, so the +- * analogy with PCI is quite large): +- */ +-#define __ISA_IO_base ((char __iomem *)(fix_to_virt(FIX_ISAMAP_BEGIN))) +- +-#define flush_write_buffers() +- +-extern int iommu_bio_merge; +-#define BIO_VMERGE_BOUNDARY iommu_bio_merge +- +-/* +- * Convert a virtual cached pointer to an uncached pointer +- */ +-#define xlate_dev_kmem_ptr(p) p +- +-#endif /* __KERNEL__ */ +- +-#define ARCH_HAS_DEV_MEM +- +-#endif +diff -urN linux-2.6.27.19-5.1/include/asm-x86/mach-xen/asm/io.h linux-2.6.27.23-0.1.1/include/asm-x86/mach-xen/asm/io.h +--- linux-2.6.27.19-5.1/include/asm-x86/mach-xen/asm/io.h 2009-06-16 13:55:33.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/include/asm-x86/mach-xen/asm/io.h 2009-06-16 13:41:27.000000000 +0100 +@@ -72,18 +72,54 @@ + #define writeq writeq + #endif + ++#define native_io_delay xen_io_delay ++ + #ifdef CONFIG_X86_32 +-# include "io_32.h" ++# include "../../io_32.h" + #else +-# include "io_64.h" ++# include "../../io_64.h" ++#endif ++ ++#if defined(__KERNEL__) && !defined(__ASSEMBLY__) ++ ++/* We will be supplying our own /dev/mem implementation */ ++#define ARCH_HAS_DEV_MEM ++ ++#define page_to_pseudophys(page) ((dma_addr_t)page_to_pfn(page) << PAGE_SHIFT) ++#undef page_to_phys ++#define page_to_phys(page) (phys_to_machine(page_to_pseudophys(page))) ++#define page_to_bus(page) (phys_to_machine(page_to_pseudophys(page))) ++ ++#define bvec_to_pseudophys(bv) (page_to_pseudophys((bv)->bv_page) + \ ++ (unsigned long) (bv)->bv_offset) ++ ++#define BIOVEC_PHYS_MERGEABLE(vec1, vec2) \ ++ (bvec_to_phys(vec1) + (vec1)->bv_len == bvec_to_phys(vec2) \ ++ && bvec_to_pseudophys(vec1) + (vec1)->bv_len \ ++ == bvec_to_pseudophys(vec2)) ++ ++#undef virt_to_bus ++#undef bus_to_virt ++#define virt_to_bus(_x) phys_to_machine(__pa(_x)) ++#define bus_to_virt(_x) __va(machine_to_phys(_x)) ++ ++#include ++ ++#undef isa_virt_to_bus ++#undef isa_page_to_bus ++#undef isa_bus_to_virt ++#define isa_virt_to_bus(_x) ({ BUG(); virt_to_bus(_x); }) ++#define isa_page_to_bus(_x) isa_page_to_bus_is_UNSUPPORTED->_x ++#define isa_bus_to_virt(_x) ((void *)__fix_to_virt(FIX_ISAMAP_BEGIN) + (_x)) ++ ++#undef __ISA_IO_base ++#define __ISA_IO_base ((char __iomem *)fix_to_virt(FIX_ISAMAP_BEGIN)) ++ + #endif + + extern void *xlate_dev_mem_ptr(unsigned long phys); + extern void unxlate_dev_mem_ptr(unsigned long phys, void *addr); + +-extern void map_devmem(unsigned long pfn, unsigned long len, pgprot_t); +-extern void unmap_devmem(unsigned long pfn, unsigned long len, pgprot_t); +- + extern int ioremap_check_change_attr(unsigned long mfn, unsigned long size, + unsigned long prot_val); + extern void __iomem *ioremap_wc(unsigned long offset, unsigned long size); +diff -urN linux-2.6.27.19-5.1/include/asm-x86/mach-xen/asm/irq_vectors.h linux-2.6.27.23-0.1.1/include/asm-x86/mach-xen/asm/irq_vectors.h +--- linux-2.6.27.19-5.1/include/asm-x86/mach-xen/asm/irq_vectors.h 2009-06-16 13:55:33.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/include/asm-x86/mach-xen/asm/irq_vectors.h 2009-06-16 13:41:27.000000000 +0100 +@@ -35,12 +35,12 @@ + */ + + #define PIRQ_BASE 0 +-#if !defined(MAX_IO_APICS) +-# define NR_PIRQS (NR_VECTORS + 32 * NR_CPUS) +-#elif NR_CPUS < MAX_IO_APICS +-# define NR_PIRQS (NR_VECTORS + 32 * NR_CPUS) +-#else +-# define NR_PIRQS (NR_VECTORS + 32 * MAX_IO_APICS) ++#if defined(NR_CPUS) && defined(MAX_IO_APICS) ++# if NR_CPUS < MAX_IO_APICS ++# define NR_PIRQS (NR_VECTORS + 32 * NR_CPUS) ++# else ++# define NR_PIRQS (NR_VECTORS + 32 * MAX_IO_APICS) ++# endif + #endif + + #define DYNIRQ_BASE (PIRQ_BASE + NR_PIRQS) +diff -urN linux-2.6.27.19-5.1/include/asm-x86/mach-xen/asm/pci_64.h linux-2.6.27.23-0.1.1/include/asm-x86/mach-xen/asm/pci_64.h +--- linux-2.6.27.19-5.1/include/asm-x86/mach-xen/asm/pci_64.h 2009-06-16 13:55:33.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/include/asm-x86/mach-xen/asm/pci_64.h 1970-01-01 01:00:00.000000000 +0100 +@@ -1,68 +0,0 @@ +-#ifndef __x8664_PCI_H +-#define __x8664_PCI_H +- +-#ifdef __KERNEL__ +- +-#ifdef CONFIG_CALGARY_IOMMU +-static inline void *pci_iommu(struct pci_bus *bus) +-{ +- struct pci_sysdata *sd = bus->sysdata; +- return sd->iommu; +-} +- +-static inline void set_pci_iommu(struct pci_bus *bus, void *val) +-{ +- struct pci_sysdata *sd = bus->sysdata; +- sd->iommu = val; +-} +-#endif /* CONFIG_CALGARY_IOMMU */ +- +-extern int (*pci_config_read)(int seg, int bus, int dev, int fn, +- int reg, int len, u32 *value); +-extern int (*pci_config_write)(int seg, int bus, int dev, int fn, +- int reg, int len, u32 value); +- +-extern void dma32_reserve_bootmem(void); +- +-/* The PCI address space does equal the physical memory +- * address space. The networking and block device layers use +- * this boolean for bounce buffer decisions +- * +- * On AMD64 it mostly equals, but we set it to zero if a hardware +- * IOMMU (gart) of sotware IOMMU (swiotlb) is available. +- */ +-#define PCI_DMA_BUS_IS_PHYS (dma_ops->is_phys) +- +-#define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME) \ +- dma_addr_t ADDR_NAME; +-#define DECLARE_PCI_UNMAP_LEN(LEN_NAME) \ +- __u32 LEN_NAME; +-#define pci_unmap_addr(PTR, ADDR_NAME) \ +- ((PTR)->ADDR_NAME) +-#define pci_unmap_addr_set(PTR, ADDR_NAME, VAL) \ +- (((PTR)->ADDR_NAME) = (VAL)) +-#define pci_unmap_len(PTR, LEN_NAME) \ +- ((PTR)->LEN_NAME) +-#define pci_unmap_len_set(PTR, LEN_NAME, VAL) \ +- (((PTR)->LEN_NAME) = (VAL)) +- +-#elif defined(CONFIG_SWIOTLB) +- +-#define pci_dac_dma_supported(pci_dev, mask) 1 +- +-#define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME) \ +- dma_addr_t ADDR_NAME; +-#define DECLARE_PCI_UNMAP_LEN(LEN_NAME) \ +- __u32 LEN_NAME; +-#define pci_unmap_addr(PTR, ADDR_NAME) \ +- ((PTR)->ADDR_NAME) +-#define pci_unmap_addr_set(PTR, ADDR_NAME, VAL) \ +- (((PTR)->ADDR_NAME) = (VAL)) +-#define pci_unmap_len(PTR, LEN_NAME) \ +- ((PTR)->LEN_NAME) +-#define pci_unmap_len_set(PTR, LEN_NAME, VAL) \ +- (((PTR)->LEN_NAME) = (VAL)) +- +-#endif /* __KERNEL__ */ +- +-#endif /* __x8664_PCI_H */ +diff -urN linux-2.6.27.19-5.1/include/asm-x86/mach-xen/asm/pci.h linux-2.6.27.23-0.1.1/include/asm-x86/mach-xen/asm/pci.h +--- linux-2.6.27.19-5.1/include/asm-x86/mach-xen/asm/pci.h 2009-06-16 13:55:33.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/include/asm-x86/mach-xen/asm/pci.h 2009-06-16 13:41:27.000000000 +0100 +@@ -93,7 +93,7 @@ + #ifdef CONFIG_X86_32 + # include "pci_32.h" + #else +-# include "pci_64.h" ++# include "../../pci_64.h" + #endif + + /* implement the pci_ DMA API in terms of the generic device dma_ one */ +diff -urN linux-2.6.27.19-5.1/include/asm-x86/mach-xen/asm/pgtable_64.h linux-2.6.27.23-0.1.1/include/asm-x86/mach-xen/asm/pgtable_64.h +--- linux-2.6.27.19-5.1/include/asm-x86/mach-xen/asm/pgtable_64.h 2009-06-16 13:55:33.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/include/asm-x86/mach-xen/asm/pgtable_64.h 2009-06-16 13:41:27.000000000 +0100 +@@ -165,7 +165,7 @@ + #define PGDIR_MASK (~(PGDIR_SIZE - 1)) + + +-#define MAXMEM _AC(0x0000006fffffffff, UL) ++#define MAXMEM _AC(0x000004ffffffffff, UL) + #define VMALLOC_START _AC(0xffffc20000000000, UL) + #define VMALLOC_END _AC(0xffffe1ffffffffff, UL) + #define VMEMMAP_START _AC(0xffffe20000000000, UL) +diff -urN linux-2.6.27.19-5.1/include/asm-x86/mach-xen/mach_apic.h linux-2.6.27.23-0.1.1/include/asm-x86/mach-xen/mach_apic.h +--- linux-2.6.27.19-5.1/include/asm-x86/mach-xen/mach_apic.h 2009-06-16 13:55:33.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/include/asm-x86/mach-xen/mach_apic.h 2009-06-16 13:41:27.000000000 +0100 +@@ -1,7 +1,7 @@ + #ifndef __ASM_MACH_APIC_H + #define __ASM_MACH_APIC_H + +-#include ++#include + + #ifdef CONFIG_X86_64 + +diff -urN linux-2.6.27.19-5.1/include/asm-x86/mach-xen/mach_time.h linux-2.6.27.23-0.1.1/include/asm-x86/mach-xen/mach_time.h +--- linux-2.6.27.19-5.1/include/asm-x86/mach-xen/mach_time.h 2009-06-16 13:55:33.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/include/asm-x86/mach-xen/mach_time.h 2009-06-16 13:41:27.000000000 +0100 +@@ -1,2 +1,111 @@ +-#include "../mc146818rtc_32.h" +-#include "../mach-default/mach_time.h" ++/* ++ * include/asm-i386/mach-default/mach_time.h ++ * ++ * Machine specific set RTC function for generic. ++ * Split out from time.c by Osamu Tomita ++ */ ++#ifndef _MACH_TIME_H ++#define _MACH_TIME_H ++ ++#include ++ ++/* for check timing call set_rtc_mmss() 500ms */ ++/* used in arch/i386/time.c::do_timer_interrupt() */ ++#define USEC_AFTER 500000 ++#define USEC_BEFORE 500000 ++ ++/* ++ * In order to set the CMOS clock precisely, set_rtc_mmss has to be ++ * called 500 ms after the second nowtime has started, because when ++ * nowtime is written into the registers of the CMOS clock, it will ++ * jump to the next second precisely 500 ms later. Check the Motorola ++ * MC146818A or Dallas DS12887 data sheet for details. ++ * ++ * BUG: This routine does not handle hour overflow properly; it just ++ * sets the minutes. Usually you'll only notice that after reboot! ++ */ ++static inline int mach_set_rtc_mmss(unsigned long nowtime) ++{ ++ int retval = 0; ++ int real_seconds, real_minutes, cmos_minutes; ++ unsigned char save_control, save_freq_select; ++ ++ save_control = CMOS_READ(RTC_CONTROL); /* tell the clock it's being set */ ++ CMOS_WRITE((save_control|RTC_SET), RTC_CONTROL); ++ ++ save_freq_select = CMOS_READ(RTC_FREQ_SELECT); /* stop and reset prescaler */ ++ CMOS_WRITE((save_freq_select|RTC_DIV_RESET2), RTC_FREQ_SELECT); ++ ++ cmos_minutes = CMOS_READ(RTC_MINUTES); ++ if (!(save_control & RTC_DM_BINARY) || RTC_ALWAYS_BCD) ++ BCD_TO_BIN(cmos_minutes); ++ ++ /* ++ * since we're only adjusting minutes and seconds, ++ * don't interfere with hour overflow. This avoids ++ * messing with unknown time zones but requires your ++ * RTC not to be off by more than 15 minutes ++ */ ++ real_seconds = nowtime % 60; ++ real_minutes = nowtime / 60; ++ if (((abs(real_minutes - cmos_minutes) + 15)/30) & 1) ++ real_minutes += 30; /* correct for half hour time zone */ ++ real_minutes %= 60; ++ ++ if (abs(real_minutes - cmos_minutes) < 30) { ++ if (!(save_control & RTC_DM_BINARY) || RTC_ALWAYS_BCD) { ++ BIN_TO_BCD(real_seconds); ++ BIN_TO_BCD(real_minutes); ++ } ++ CMOS_WRITE(real_seconds,RTC_SECONDS); ++ CMOS_WRITE(real_minutes,RTC_MINUTES); ++ } else { ++ printk(KERN_WARNING ++ "set_rtc_mmss: can't update from %d to %d\n", ++ cmos_minutes, real_minutes); ++ retval = -1; ++ } ++ ++ /* The following flags have to be released exactly in this order, ++ * otherwise the DS12887 (popular MC146818A clone with integrated ++ * battery and quartz) will not reset the oscillator and will not ++ * update precisely 500 ms later. You won't find this mentioned in ++ * the Dallas Semiconductor data sheets, but who believes data ++ * sheets anyway ... -- Markus Kuhn ++ */ ++ CMOS_WRITE(save_control, RTC_CONTROL); ++ CMOS_WRITE(save_freq_select, RTC_FREQ_SELECT); ++ ++ return retval; ++} ++ ++static inline unsigned long mach_get_cmos_time(void) ++{ ++ unsigned int year, mon, day, hour, min, sec; ++ ++ do { ++ sec = CMOS_READ(RTC_SECONDS); ++ min = CMOS_READ(RTC_MINUTES); ++ hour = CMOS_READ(RTC_HOURS); ++ day = CMOS_READ(RTC_DAY_OF_MONTH); ++ mon = CMOS_READ(RTC_MONTH); ++ year = CMOS_READ(RTC_YEAR); ++ } while (sec != CMOS_READ(RTC_SECONDS)); ++ ++ if (!(CMOS_READ(RTC_CONTROL) & RTC_DM_BINARY) || RTC_ALWAYS_BCD) { ++ BCD_TO_BIN(sec); ++ BCD_TO_BIN(min); ++ BCD_TO_BIN(hour); ++ BCD_TO_BIN(day); ++ BCD_TO_BIN(mon); ++ BCD_TO_BIN(year); ++ } ++ ++ year += 1900; ++ if (year < 1970) ++ year += 100; ++ ++ return mktime(year, mon, day, hour, min, sec); ++} ++ ++#endif /* !_MACH_TIME_H */ +diff -urN linux-2.6.27.19-5.1/include/asm-x86/mach-xen/mach_timer.h linux-2.6.27.23-0.1.1/include/asm-x86/mach-xen/mach_timer.h +--- linux-2.6.27.19-5.1/include/asm-x86/mach-xen/mach_timer.h 2009-06-16 13:55:33.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/include/asm-x86/mach-xen/mach_timer.h 1970-01-01 01:00:00.000000000 +0100 +@@ -1 +0,0 @@ +-#include "../mach-default/mach_timer.h" +diff -urN linux-2.6.27.19-5.1/include/asm-x86/mmzone_32.h linux-2.6.27.23-0.1.1/include/asm-x86/mmzone_32.h +--- linux-2.6.27.19-5.1/include/asm-x86/mmzone_32.h 2009-06-16 13:55:33.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/include/asm-x86/mmzone_32.h 2009-06-16 13:41:27.000000000 +0100 +@@ -32,8 +32,6 @@ + get_memcfg_numa_flat(); + } + +-extern int early_pfn_to_nid(unsigned long pfn); +- + extern void resume_map_numa_kva(pgd_t *pgd); + + #else /* !CONFIG_NUMA */ +diff -urN linux-2.6.27.19-5.1/include/asm-x86/mmzone_64.h linux-2.6.27.23-0.1.1/include/asm-x86/mmzone_64.h +--- linux-2.6.27.19-5.1/include/asm-x86/mmzone_64.h 2009-06-16 13:55:33.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/include/asm-x86/mmzone_64.h 2009-06-16 13:41:27.000000000 +0100 +@@ -41,8 +41,6 @@ + #define node_end_pfn(nid) (NODE_DATA(nid)->node_start_pfn + \ + NODE_DATA(nid)->node_spanned_pages) + +-extern int early_pfn_to_nid(unsigned long pfn); +- + #ifdef CONFIG_NUMA_EMU + #define FAKE_NODE_MIN_SIZE (64 * 1024 * 1024) + #define FAKE_NODE_MIN_HASH_MASK (~(FAKE_NODE_MIN_SIZE - 1UL)) +diff -urN linux-2.6.27.19-5.1/include/asm-x86/msr-index.h linux-2.6.27.23-0.1.1/include/asm-x86/msr-index.h +--- linux-2.6.27.19-5.1/include/asm-x86/msr-index.h 2009-06-16 13:55:33.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/include/asm-x86/msr-index.h 2009-06-16 13:41:26.000000000 +0100 +@@ -196,6 +196,35 @@ + #define MSR_IA32_THERM_STATUS 0x0000019c + #define MSR_IA32_MISC_ENABLE 0x000001a0 + ++/* MISC_ENABLE bits: architectural */ ++#define MSR_IA32_MISC_ENABLE_FAST_STRING (1ULL << 0) ++#define MSR_IA32_MISC_ENABLE_TCC (1ULL << 1) ++#define MSR_IA32_MISC_ENABLE_EMON (1ULL << 7) ++#define MSR_IA32_MISC_ENABLE_BTS_UNAVAIL (1ULL << 11) ++#define MSR_IA32_MISC_ENABLE_PEBS_UNAVAIL (1ULL << 12) ++#define MSR_IA32_MISC_ENABLE_ENHANCED_SPEEDSTEP (1ULL << 16) ++#define MSR_IA32_MISC_ENABLE_MWAIT (1ULL << 18) ++#define MSR_IA32_MISC_ENABLE_LIMIT_CPUID (1ULL << 22) ++#define MSR_IA32_MISC_ENABLE_XTPR_DISABLE (1ULL << 23) ++#define MSR_IA32_MISC_ENABLE_XD_DISABLE (1ULL << 34) ++ ++/* MISC_ENABLE bits: model-specific, meaning may vary from core to core */ ++#define MSR_IA32_MISC_ENABLE_X87_COMPAT (1ULL << 2) ++#define MSR_IA32_MISC_ENABLE_TM1 (1ULL << 3) ++#define MSR_IA32_MISC_ENABLE_SPLIT_LOCK_DISABLE (1ULL << 4) ++#define MSR_IA32_MISC_ENABLE_L3CACHE_DISABLE (1ULL << 6) ++#define MSR_IA32_MISC_ENABLE_SUPPRESS_LOCK (1ULL << 8) ++#define MSR_IA32_MISC_ENABLE_PREFETCH_DISABLE (1ULL << 9) ++#define MSR_IA32_MISC_ENABLE_FERR (1ULL << 10) ++#define MSR_IA32_MISC_ENABLE_FERR_MULTIPLEX (1ULL << 10) ++#define MSR_IA32_MISC_ENABLE_TM2 (1ULL << 13) ++#define MSR_IA32_MISC_ENABLE_ADJ_PREF_DISABLE (1ULL << 19) ++#define MSR_IA32_MISC_ENABLE_SPEEDSTEP_LOCK (1ULL << 20) ++#define MSR_IA32_MISC_ENABLE_L1D_CONTEXT (1ULL << 24) ++#define MSR_IA32_MISC_ENABLE_DCU_PREF_DISABLE (1ULL << 37) ++#define MSR_IA32_MISC_ENABLE_TURBO_DISABLE (1ULL << 38) ++#define MSR_IA32_MISC_ENABLE_IP_PREF_DISABLE (1ULL << 39) ++ + /* Intel Model 6 */ + #define MSR_P6_EVNTSEL0 0x00000186 + #define MSR_P6_EVNTSEL1 0x00000187 +diff -urN linux-2.6.27.19-5.1/include/asm-x86/pgtable_64.h linux-2.6.27.23-0.1.1/include/asm-x86/pgtable_64.h +--- linux-2.6.27.19-5.1/include/asm-x86/pgtable_64.h 2009-06-16 13:55:33.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/include/asm-x86/pgtable_64.h 2009-06-16 13:41:27.000000000 +0100 +@@ -146,7 +146,7 @@ + #define PGDIR_MASK (~(PGDIR_SIZE - 1)) + + +-#define MAXMEM _AC(0x00003fffffffffff, UL) ++#define MAXMEM _AC(__AC(1, UL) << MAX_PHYSMEM_BITS, UL) + #define VMALLOC_START _AC(0xffffc20000000000, UL) + #define VMALLOC_END _AC(0xffffe1ffffffffff, UL) + #define VMEMMAP_START _AC(0xffffe20000000000, UL) +diff -urN linux-2.6.27.19-5.1/include/asm-x86/seccomp_32.h linux-2.6.27.23-0.1.1/include/asm-x86/seccomp_32.h +--- linux-2.6.27.19-5.1/include/asm-x86/seccomp_32.h 2009-06-16 13:55:33.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/include/asm-x86/seccomp_32.h 2009-06-16 13:41:26.000000000 +0100 +@@ -1,12 +1,6 @@ + #ifndef _ASM_SECCOMP_H + #define _ASM_SECCOMP_H + +-#include +- +-#ifdef TIF_32BIT +-#error "unexpected TIF_32BIT on i386" +-#endif +- + #include + + #define __NR_seccomp_read __NR_read +diff -urN linux-2.6.27.19-5.1/include/asm-x86/seccomp_64.h linux-2.6.27.23-0.1.1/include/asm-x86/seccomp_64.h +--- linux-2.6.27.19-5.1/include/asm-x86/seccomp_64.h 2009-06-16 13:55:33.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/include/asm-x86/seccomp_64.h 2009-06-16 13:41:26.000000000 +0100 +@@ -1,14 +1,6 @@ + #ifndef _ASM_SECCOMP_H + #define _ASM_SECCOMP_H + +-#include +- +-#ifdef TIF_32BIT +-#error "unexpected TIF_32BIT on x86_64" +-#else +-#define TIF_32BIT TIF_IA32 +-#endif +- + #include + #include + +diff -urN linux-2.6.27.19-5.1/include/asm-x86/sparsemem.h linux-2.6.27.23-0.1.1/include/asm-x86/sparsemem.h +--- linux-2.6.27.19-5.1/include/asm-x86/sparsemem.h 2009-06-16 13:55:33.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/include/asm-x86/sparsemem.h 2009-06-16 13:41:27.000000000 +0100 +@@ -27,7 +27,7 @@ + #else /* CONFIG_X86_32 */ + # define SECTION_SIZE_BITS 27 /* matt - 128 is convenient right now */ + # define MAX_PHYSADDR_BITS 44 +-# define MAX_PHYSMEM_BITS 44 ++# define MAX_PHYSMEM_BITS 44 /* Can be max 45 bits */ + #endif + + #endif /* CONFIG_SPARSEMEM */ +diff -urN linux-2.6.27.19-5.1/include/asm-x86/xen/hypercall.h linux-2.6.27.23-0.1.1/include/asm-x86/xen/hypercall.h +--- linux-2.6.27.19-5.1/include/asm-x86/xen/hypercall.h 2009-06-16 13:55:33.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/include/asm-x86/xen/hypercall.h 2009-06-16 13:41:26.000000000 +0100 +@@ -264,7 +264,7 @@ + static inline int + HYPERVISOR_sched_op(int cmd, void *arg) + { +- return _hypercall2(int, sched_op, cmd, arg); ++ return _hypercall2(int, sched_op_new, cmd, arg); + } + + static inline long +diff -urN linux-2.6.27.19-5.1/include/drm/drm_pciids.h linux-2.6.27.23-0.1.1/include/drm/drm_pciids.h +--- linux-2.6.27.19-5.1/include/drm/drm_pciids.h 2009-06-16 13:55:10.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/include/drm/drm_pciids.h 2009-06-16 13:41:09.000000000 +0100 +@@ -412,4 +412,5 @@ + {0x8086, 0x2e02, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ + {0x8086, 0x2e12, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ + {0x8086, 0x2e22, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ ++ {0x8086, 0x2e32, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ + {0, 0, 0} +diff -urN linux-2.6.27.19-5.1/include/linux/bootmem.h linux-2.6.27.23-0.1.1/include/linux/bootmem.h +--- linux-2.6.27.19-5.1/include/linux/bootmem.h 2009-06-16 13:55:22.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/include/linux/bootmem.h 2009-06-16 13:41:19.000000000 +0100 +@@ -144,10 +144,10 @@ + + #define HASH_EARLY 0x00000001 /* Allocating during early boot? */ + +-/* Only NUMA needs hash distribution. +- * IA64 and x86_64 have sufficient vmalloc space. ++/* Only NUMA needs hash distribution. 64bit NUMA architectures have ++ * sufficient vmalloc space. + */ +-#if defined(CONFIG_NUMA) && (defined(CONFIG_IA64) || defined(CONFIG_X86_64)) ++#if defined(CONFIG_NUMA) && defined(CONFIG_64BIT) + #define HASHDIST_DEFAULT 1 + #else + #define HASHDIST_DEFAULT 0 +diff -urN linux-2.6.27.19-5.1/include/linux/capability.h linux-2.6.27.23-0.1.1/include/linux/capability.h +--- linux-2.6.27.19-5.1/include/linux/capability.h 2009-06-16 13:55:22.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/include/linux/capability.h 2009-06-16 13:41:19.000000000 +0100 +@@ -369,7 +369,21 @@ + #define CAP_FOR_EACH_U32(__capi) \ + for (__capi = 0; __capi < _KERNEL_CAPABILITY_U32S; ++__capi) + ++/* ++ * CAP_FS_MASK and CAP_NFSD_MASKS: ++ * ++ * The fs mask is all the privileges that fsuid==0 historically meant. ++ * At one time in the past, that included CAP_MKNOD and CAP_LINUX_IMMUTABLE. ++ * ++ * It has never meant setting security.* and trusted.* xattrs. ++ * ++ * We could also define fsmask as follows: ++ * 1. CAP_FS_MASK is the privilege to bypass all fs-related DAC permissions ++ * 2. The security.* and trusted.* xattrs are fs-related MAC permissions ++ */ ++ + # define CAP_FS_MASK_B0 (CAP_TO_MASK(CAP_CHOWN) \ ++ | CAP_TO_MASK(CAP_MKNOD) \ + | CAP_TO_MASK(CAP_DAC_OVERRIDE) \ + | CAP_TO_MASK(CAP_DAC_READ_SEARCH) \ + | CAP_TO_MASK(CAP_FOWNER) \ +@@ -384,9 +398,12 @@ + # define CAP_EMPTY_SET ((kernel_cap_t){{ 0, 0 }}) + # define CAP_FULL_SET ((kernel_cap_t){{ ~0, ~0 }}) + # define CAP_INIT_EFF_SET ((kernel_cap_t){{ ~CAP_TO_MASK(CAP_SETPCAP), ~0 }}) +-# define CAP_FS_SET ((kernel_cap_t){{ CAP_FS_MASK_B0, CAP_FS_MASK_B1 } }) +-# define CAP_NFSD_SET ((kernel_cap_t){{ CAP_FS_MASK_B0|CAP_TO_MASK(CAP_SYS_RESOURCE), \ +- CAP_FS_MASK_B1 } }) ++# define CAP_FS_SET ((kernel_cap_t){{ CAP_FS_MASK_B0 \ ++ | CAP_TO_MASK(CAP_LINUX_IMMUTABLE), \ ++ CAP_FS_MASK_B1 } }) ++# define CAP_NFSD_SET ((kernel_cap_t){{ CAP_FS_MASK_B0 \ ++ | CAP_TO_MASK(CAP_SYS_RESOURCE), \ ++ CAP_FS_MASK_B1 } }) + + #endif /* _KERNEL_CAPABILITY_U32S != 2 */ + +diff -urN linux-2.6.27.19-5.1/include/linux/dlm_netlink.h linux-2.6.27.23-0.1.1/include/linux/dlm_netlink.h +--- linux-2.6.27.19-5.1/include/linux/dlm_netlink.h 2009-06-16 13:55:20.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/include/linux/dlm_netlink.h 2009-06-16 13:41:15.000000000 +0100 +@@ -9,6 +9,8 @@ + #ifndef _DLM_NETLINK_H + #define _DLM_NETLINK_H + ++#include ++ + enum { + DLM_STATUS_WAITING = 1, + DLM_STATUS_GRANTED = 2, +@@ -18,16 +20,16 @@ + #define DLM_LOCK_DATA_VERSION 1 + + struct dlm_lock_data { +- uint16_t version; +- uint32_t lockspace_id; ++ __u16 version; ++ __u32 lockspace_id; + int nodeid; + int ownpid; +- uint32_t id; +- uint32_t remid; +- uint64_t xid; +- int8_t status; +- int8_t grmode; +- int8_t rqmode; ++ __u32 id; ++ __u32 remid; ++ __u64 xid; ++ __s8 status; ++ __s8 grmode; ++ __s8 rqmode; + unsigned long timestamp; + int resource_namelen; + char resource_name[DLM_RESNAME_MAXLEN]; +diff -urN linux-2.6.27.19-5.1/include/linux/dlm_plock.h linux-2.6.27.23-0.1.1/include/linux/dlm_plock.h +--- linux-2.6.27.19-5.1/include/linux/dlm_plock.h 2009-06-16 13:55:22.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/include/linux/dlm_plock.h 2009-06-16 13:41:19.000000000 +0100 +@@ -9,6 +9,8 @@ + #ifndef __DLM_PLOCK_DOT_H__ + #define __DLM_PLOCK_DOT_H__ + ++#include ++ + #define DLM_PLOCK_MISC_NAME "dlm_plock" + + #define DLM_PLOCK_VERSION_MAJOR 1 +diff -urN linux-2.6.27.19-5.1/include/linux/fs.h linux-2.6.27.23-0.1.1/include/linux/fs.h +--- linux-2.6.27.19-5.1/include/linux/fs.h 2009-06-16 13:55:16.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/include/linux/fs.h 2009-06-16 13:41:15.000000000 +0100 +@@ -63,18 +63,23 @@ + #define MAY_ACCESS 16 + #define MAY_OPEN 32 + +-#define FMODE_READ 1 +-#define FMODE_WRITE 2 ++/* ++ * flags in file.f_mode. Note that FMODE_READ and FMODE_WRITE must correspond ++ * to O_WRONLY and O_RDWR via the strange trick in __dentry_open() ++ */ + +-/* Internal kernel extensions */ +-#define FMODE_LSEEK 4 +-#define FMODE_PREAD 8 +-#define FMODE_PWRITE FMODE_PREAD /* These go hand in hand */ +- +-/* File is being opened for execution. Primary users of this flag are +- distributed filesystems that can use it to achieve correct ETXTBUSY +- behavior for cross-node execution/opening_for_writing of files */ +-#define FMODE_EXEC 16 ++/* file is open for reading */ ++#define FMODE_READ (1) ++/* file is open for writing */ ++#define FMODE_WRITE (2) ++/* file is seekable */ ++#define FMODE_LSEEK (4) ++/* file can be accessed using pread */ ++#define FMODE_PREAD (8) ++/* file can be accessed using pwrite */ ++#define FMODE_PWRITE (16) ++/* File is opened for execution with sys_execve / sys_uselib */ ++#define FMODE_EXEC (32) + + #define RW_MASK 1 + #define RWA_MASK 2 +diff -urN linux-2.6.27.19-5.1/include/linux/kexec.h linux-2.6.27.23-0.1.1/include/linux/kexec.h +--- linux-2.6.27.19-5.1/include/linux/kexec.h 2009-06-16 13:55:16.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/include/linux/kexec.h 2009-06-16 13:41:15.000000000 +0100 +@@ -202,8 +202,15 @@ + #define VMCOREINFO_BYTES (4096) + #define VMCOREINFO_NOTE_NAME "VMCOREINFO" + #define VMCOREINFO_NOTE_NAME_BYTES ALIGN(sizeof(VMCOREINFO_NOTE_NAME), 4) ++#if !defined(CONFIG_XEN) || !defined(CONFIG_X86) + #define VMCOREINFO_NOTE_SIZE (KEXEC_NOTE_HEAD_BYTES*2 + VMCOREINFO_BYTES \ + + VMCOREINFO_NOTE_NAME_BYTES) ++#else ++#define VMCOREINFO_NOTE_SIZE ALIGN(KEXEC_NOTE_HEAD_BYTES*2 \ ++ + VMCOREINFO_BYTES \ ++ + VMCOREINFO_NOTE_NAME_BYTES, \ ++ PAGE_SIZE) ++#endif + + /* Location of a reserved region to hold the crash kernel. + */ +diff -urN linux-2.6.27.19-5.1/include/linux/mman.h linux-2.6.27.23-0.1.1/include/linux/mman.h +--- linux-2.6.27.19-5.1/include/linux/mman.h 2009-06-16 13:55:22.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/include/linux/mman.h 2009-06-16 13:41:19.000000000 +0100 +@@ -12,21 +12,18 @@ + + #ifdef __KERNEL__ + #include ++#include + + #include + + extern int sysctl_overcommit_memory; + extern int sysctl_overcommit_ratio; +-extern atomic_long_t vm_committed_space; ++extern struct percpu_counter vm_committed_as; + +-#ifdef CONFIG_SMP +-extern void vm_acct_memory(long pages); +-#else + static inline void vm_acct_memory(long pages) + { +- atomic_long_add(pages, &vm_committed_space); ++ percpu_counter_add(&vm_committed_as, pages); + } +-#endif + + static inline void vm_unacct_memory(long pages) + { +diff -urN linux-2.6.27.19-5.1/include/linux/mm.h linux-2.6.27.23-0.1.1/include/linux/mm.h +--- linux-2.6.27.19-5.1/include/linux/mm.h 2009-06-16 13:55:16.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/include/linux/mm.h 2009-06-16 13:41:15.000000000 +0100 +@@ -190,7 +190,7 @@ + #ifdef CONFIG_XEN + /* Area-specific function for clearing the PTE at @ptep. Returns the + * original value of @ptep. */ +- pte_t (*zap_pte)(struct vm_area_struct *vma, ++ pte_t (*zap_pte)(struct vm_area_struct *vma, + unsigned long addr, pte_t *ptep, int is_fullmm); + #endif + #ifdef CONFIG_NUMA +@@ -1067,10 +1067,23 @@ + typedef int (*work_fn_t)(unsigned long, unsigned long, void *); + extern void work_with_active_regions(int nid, work_fn_t work_fn, void *data); + extern void sparse_memory_present_with_active_regions(int nid); +-#ifndef CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID +-extern int early_pfn_to_nid(unsigned long pfn); +-#endif /* CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID */ + #endif /* CONFIG_ARCH_POPULATES_NODE_MAP */ ++ ++#if !defined(CONFIG_ARCH_POPULATES_NODE_MAP) && \ ++ !defined(CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID) ++static inline int __early_pfn_to_nid(unsigned long pfn) ++{ ++ return 0; ++} ++#else ++/* please see mm/page_alloc.c */ ++extern int __meminit early_pfn_to_nid(unsigned long pfn); ++#ifdef CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID ++/* there is a per-arch backend function. */ ++extern int __meminit __early_pfn_to_nid(unsigned long pfn); ++#endif /* CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID */ ++#endif ++ + extern void set_dma_reserve(unsigned long new_dma_reserve); + extern void memmap_init_zone(unsigned long, int, unsigned long, + unsigned long, enum memmap_context); +diff -urN linux-2.6.27.19-5.1/include/linux/mmzone.h linux-2.6.27.23-0.1.1/include/linux/mmzone.h +--- linux-2.6.27.19-5.1/include/linux/mmzone.h 2009-06-16 13:55:21.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/include/linux/mmzone.h 2009-06-16 13:41:15.000000000 +0100 +@@ -982,7 +982,7 @@ + #endif /* CONFIG_SPARSEMEM */ + + #ifdef CONFIG_NODES_SPAN_OTHER_NODES +-#define early_pfn_in_nid(pfn, nid) (early_pfn_to_nid(pfn) == (nid)) ++bool early_pfn_in_nid(unsigned long pfn, int nid); + #else + #define early_pfn_in_nid(pfn, nid) (1) + #endif +diff -urN linux-2.6.27.19-5.1/include/linux/nfsacl.h linux-2.6.27.23-0.1.1/include/linux/nfsacl.h +--- linux-2.6.27.19-5.1/include/linux/nfsacl.h 2009-06-16 13:55:22.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/include/linux/nfsacl.h 2009-06-16 13:41:19.000000000 +0100 +@@ -37,6 +37,9 @@ + #define NFSACL_MAXPAGES ((2*(8+12*NFS_ACL_MAX_ENTRIES) + PAGE_SIZE-1) \ + >> PAGE_SHIFT) + ++#define NFS_ACL_MAX_ENTRIES_INLINE (5) ++#define NFS_ACL_INLINE_BUFSIZE ((2*(2+3*NFS_ACL_MAX_ENTRIES_INLINE)) << 2) ++ + static inline unsigned int + nfsacl_size(struct posix_acl *acl_access, struct posix_acl *acl_default) + { +diff -urN linux-2.6.27.19-5.1/include/linux/nfs_xdr.h linux-2.6.27.23-0.1.1/include/linux/nfs_xdr.h +--- linux-2.6.27.19-5.1/include/linux/nfs_xdr.h 2009-06-16 13:55:22.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/include/linux/nfs_xdr.h 2009-06-16 13:41:19.000000000 +0100 +@@ -404,6 +404,8 @@ + int mask; + struct posix_acl * acl_access; + struct posix_acl * acl_default; ++ size_t len; ++ unsigned int npages; + struct page ** pages; + }; + +diff -urN linux-2.6.27.19-5.1/include/linux/oprofile.h linux-2.6.27.23-0.1.1/include/linux/oprofile.h +--- linux-2.6.27.19-5.1/include/linux/oprofile.h 2009-06-16 13:55:22.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/include/linux/oprofile.h 2009-06-16 13:41:19.000000000 +0100 +@@ -116,6 +116,8 @@ + /* add a backtrace entry, to be called from the ->backtrace callback */ + void oprofile_add_trace(unsigned long eip); + ++void oprofile_add_mode(int cpu_mode); ++ + /* add a domain switch entry */ + int oprofile_add_domain_switch(int32_t domain_id); + +diff -urN linux-2.6.27.19-5.1/include/linux/pci_ids.h linux-2.6.27.23-0.1.1/include/linux/pci_ids.h +--- linux-2.6.27.19-5.1/include/linux/pci_ids.h 2009-06-16 13:55:22.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/include/linux/pci_ids.h 2009-06-16 13:41:19.000000000 +0100 +@@ -823,6 +823,8 @@ + #define PCI_DEVICE_ID_PROMISE_20276 0x5275 + #define PCI_DEVICE_ID_PROMISE_20277 0x7275 + ++#define PCI_VENDOR_ID_FOXCONN 0x105b ++ + #define PCI_VENDOR_ID_UMC 0x1060 + #define PCI_DEVICE_ID_UMC_UM8673F 0x0101 + #define PCI_DEVICE_ID_UMC_UM8886BF 0x673a +@@ -1432,6 +1434,7 @@ + #define PCI_DEVICE_ID_DIGI_DF_M_E 0x0071 + #define PCI_DEVICE_ID_DIGI_DF_M_IOM2_A 0x0072 + #define PCI_DEVICE_ID_DIGI_DF_M_A 0x0073 ++#define PCI_DEVICE_ID_DIGI_NEO_8 0x00B1 + #define PCI_DEVICE_ID_NEO_2DB9 0x00C8 + #define PCI_DEVICE_ID_NEO_2DB9PRI 0x00C9 + #define PCI_DEVICE_ID_NEO_2RJ45 0x00CA +@@ -2288,6 +2291,9 @@ + #define PCI_DEVICE_ID_INTEL_82378 0x0484 + #define PCI_DEVICE_ID_INTEL_I960 0x0960 + #define PCI_DEVICE_ID_INTEL_I960RM 0x0962 ++#define PCI_DEVICE_ID_INTEL_8257X_SOL 0x1062 ++#define PCI_DEVICE_ID_INTEL_82573E_SOL 0x1085 ++#define PCI_DEVICE_ID_INTEL_82573L_SOL 0x108F + #define PCI_DEVICE_ID_INTEL_82815_MC 0x1130 + #define PCI_DEVICE_ID_INTEL_82815_CGC 0x1132 + #define PCI_DEVICE_ID_INTEL_82092AA_0 0x1221 +diff -urN linux-2.6.27.19-5.1/include/linux/pci_regs.h linux-2.6.27.23-0.1.1/include/linux/pci_regs.h +--- linux-2.6.27.19-5.1/include/linux/pci_regs.h 2009-06-16 13:55:16.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/include/linux/pci_regs.h 2009-06-16 13:41:15.000000000 +0100 +@@ -234,7 +234,7 @@ + #define PCI_PM_CAP_PME_SHIFT 11 /* Start of the PME Mask in PMC */ + #define PCI_PM_CTRL 4 /* PM control and status register */ + #define PCI_PM_CTRL_STATE_MASK 0x0003 /* Current power state (D0 to D3) */ +-#define PCI_PM_CTRL_NO_SOFT_RESET 0x0004 /* No reset for D3hot->D0 */ ++#define PCI_PM_CTRL_NO_SOFT_RESET 0x0008 /* No reset for D3hot->D0 */ + #define PCI_PM_CTRL_PME_ENABLE 0x0100 /* PME pin enable */ + #define PCI_PM_CTRL_DATA_SEL_MASK 0x1e00 /* Data select (??) */ + #define PCI_PM_CTRL_DATA_SCALE_MASK 0x6000 /* Data scale (??) */ +diff -urN linux-2.6.27.19-5.1/include/linux/sched.h linux-2.6.27.23-0.1.1/include/linux/sched.h +--- linux-2.6.27.19-5.1/include/linux/sched.h 2009-06-16 13:55:20.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/include/linux/sched.h 2009-06-16 13:41:15.000000000 +0100 +@@ -202,7 +202,8 @@ + #define task_is_stopped_or_traced(task) \ + ((task->state & (__TASK_STOPPED | __TASK_TRACED)) != 0) + #define task_contributes_to_load(task) \ +- ((task->state & TASK_UNINTERRUPTIBLE) != 0) ++ ((task->state & TASK_UNINTERRUPTIBLE) != 0 && \ ++ (task->flags & PF_FROZEN) == 0) + + #define __set_task_state(tsk, state_value) \ + do { (tsk)->state = (state_value); } while (0) +diff -urN linux-2.6.27.19-5.1/include/linux/seq_file.h linux-2.6.27.23-0.1.1/include/linux/seq_file.h +--- linux-2.6.27.19-5.1/include/linux/seq_file.h 2009-06-16 13:55:22.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/include/linux/seq_file.h 2009-06-16 13:41:19.000000000 +0100 +@@ -23,6 +23,9 @@ + struct mutex lock; + const struct seq_operations *op; + void *private; ++#ifndef __GENKSYMS__ ++ loff_t read_pos; ++#endif + }; + + struct seq_operations { +diff -urN linux-2.6.27.19-5.1/include/linux/serial_core.h linux-2.6.27.23-0.1.1/include/linux/serial_core.h +--- linux-2.6.27.19-5.1/include/linux/serial_core.h 2009-06-16 13:55:22.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/include/linux/serial_core.h 2009-06-16 13:41:19.000000000 +0100 +@@ -285,6 +285,7 @@ + #define UPF_HARDPPS_CD ((__force upf_t) (1 << 11)) + #define UPF_LOW_LATENCY ((__force upf_t) (1 << 13)) + #define UPF_BUGGY_UART ((__force upf_t) (1 << 14)) ++#define UPF_NO_TXEN_TEST ((__force upf_t) (1 << 15)) + #define UPF_MAGIC_MULTIPLIER ((__force upf_t) (1 << 16)) + #define UPF_CONS_FLOW ((__force upf_t) (1 << 23)) + #define UPF_SHARE_IRQ ((__force upf_t) (1 << 24)) +diff -urN linux-2.6.27.19-5.1/include/linux/timerfd.h linux-2.6.27.23-0.1.1/include/linux/timerfd.h +--- linux-2.6.27.19-5.1/include/linux/timerfd.h 2009-06-16 13:55:21.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/include/linux/timerfd.h 2009-06-16 13:41:15.000000000 +0100 +@@ -11,13 +11,21 @@ + /* For O_CLOEXEC and O_NONBLOCK */ + #include + +-/* Flags for timerfd_settime. */ ++/* ++ * CAREFUL: Check include/asm-generic/fcntl.h when defining ++ * new flags, since they might collide with O_* ones. We want ++ * to re-use O_* flags that couldn't possibly have a meaning ++ * from eventfd, in order to leave a free define-space for ++ * shared O_* flags. ++ */ + #define TFD_TIMER_ABSTIME (1 << 0) +- +-/* Flags for timerfd_create. */ + #define TFD_CLOEXEC O_CLOEXEC + #define TFD_NONBLOCK O_NONBLOCK + ++#define TFD_SHARED_FCNTL_FLAGS (TFD_CLOEXEC | TFD_NONBLOCK) ++/* Flags for timerfd_create. */ ++#define TFD_CREATE_FLAGS TFD_SHARED_FCNTL_FLAGS ++/* Flags for timerfd_settime. */ ++#define TFD_SETTIME_FLAGS TFD_TIMER_ABSTIME + + #endif /* _LINUX_TIMERFD_H */ +- +diff -urN linux-2.6.27.19-5.1/include/net/sock.h linux-2.6.27.23-0.1.1/include/net/sock.h +--- linux-2.6.27.19-5.1/include/net/sock.h 2009-06-16 13:55:16.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/include/net/sock.h 2009-06-16 13:41:15.000000000 +0100 +@@ -834,7 +834,6 @@ + + static inline void sk_wmem_free_skb(struct sock *sk, struct sk_buff *skb) + { +- skb_truesize_check(skb); + sock_set_flag(sk, SOCK_QUEUE_SHRUNK); + sk->sk_wmem_queued -= skb->truesize; + sk_mem_uncharge(sk, skb->truesize); +diff -urN linux-2.6.27.19-5.1/include/scsi/scsi_device.h linux-2.6.27.23-0.1.1/include/scsi/scsi_device.h +--- linux-2.6.27.19-5.1/include/scsi/scsi_device.h 2009-06-16 13:55:16.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/include/scsi/scsi_device.h 2009-06-16 13:41:15.000000000 +0100 +@@ -291,6 +291,7 @@ + extern void __starget_for_each_device(struct scsi_target *, void *, + void (*fn)(struct scsi_device *, + void *)); ++extern struct scsi_device *scsi_device_from_queue(struct request_queue *); + + /* only exposed to implement shost_for_each_device */ + extern struct scsi_device *__scsi_iterate_devices(struct Scsi_Host *, +diff -urN linux-2.6.27.19-5.1/include/xen/interface/acm.h linux-2.6.27.23-0.1.1/include/xen/interface/acm.h +--- linux-2.6.27.19-5.1/include/xen/interface/acm.h 2009-06-16 13:55:16.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/include/xen/interface/acm.h 1970-01-01 01:00:00.000000000 +0100 +@@ -1,228 +0,0 @@ +-/* +- * acm.h: Xen access control module interface defintions +- * +- * Permission is hereby granted, free of charge, to any person obtaining a copy +- * of this software and associated documentation files (the "Software"), to +- * deal in the Software without restriction, including without limitation the +- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +- * sell copies of the Software, and to permit persons to whom the Software is +- * furnished to do so, subject to the following conditions: +- * +- * The above copyright notice and this permission notice shall be included in +- * all copies or substantial portions of the Software. +- * +- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +- * DEALINGS IN THE SOFTWARE. +- * +- * Reiner Sailer +- * Copyright (c) 2005, International Business Machines Corporation. +- */ +- +-#ifndef _XEN_PUBLIC_ACM_H +-#define _XEN_PUBLIC_ACM_H +- +-#include "xen.h" +- +-/* if ACM_DEBUG defined, all hooks should +- * print a short trace message (comment it out +- * when not in testing mode ) +- */ +-/* #define ACM_DEBUG */ +- +-#ifdef ACM_DEBUG +-# define printkd(fmt, args...) printk(fmt,## args) +-#else +-# define printkd(fmt, args...) +-#endif +- +-/* default ssid reference value if not supplied */ +-#define ACM_DEFAULT_SSID 0x0 +-#define ACM_DEFAULT_LOCAL_SSID 0x0 +- +-/* Internal ACM ERROR types */ +-#define ACM_OK 0 +-#define ACM_UNDEF -1 +-#define ACM_INIT_SSID_ERROR -2 +-#define ACM_INIT_SOID_ERROR -3 +-#define ACM_ERROR -4 +- +-/* External ACCESS DECISIONS */ +-#define ACM_ACCESS_PERMITTED 0 +-#define ACM_ACCESS_DENIED -111 +-#define ACM_NULL_POINTER_ERROR -200 +- +-/* +- Error codes reported in when trying to test for a new policy +- These error codes are reported in an array of tuples where +- each error code is followed by a parameter describing the error +- more closely, such as a domain id. +-*/ +-#define ACM_EVTCHN_SHARING_VIOLATION 0x100 +-#define ACM_GNTTAB_SHARING_VIOLATION 0x101 +-#define ACM_DOMAIN_LOOKUP 0x102 +-#define ACM_CHWALL_CONFLICT 0x103 +-#define ACM_SSIDREF_IN_USE 0x104 +- +- +-/* primary policy in lower 4 bits */ +-#define ACM_NULL_POLICY 0 +-#define ACM_CHINESE_WALL_POLICY 1 +-#define ACM_SIMPLE_TYPE_ENFORCEMENT_POLICY 2 +-#define ACM_POLICY_UNDEFINED 15 +- +-/* combinations have secondary policy component in higher 4bit */ +-#define ACM_CHINESE_WALL_AND_SIMPLE_TYPE_ENFORCEMENT_POLICY \ +- ((ACM_SIMPLE_TYPE_ENFORCEMENT_POLICY << 4) | ACM_CHINESE_WALL_POLICY) +- +-/* policy: */ +-#define ACM_POLICY_NAME(X) \ +- ((X) == (ACM_NULL_POLICY)) ? "NULL" : \ +- ((X) == (ACM_CHINESE_WALL_POLICY)) ? "CHINESE WALL" : \ +- ((X) == (ACM_SIMPLE_TYPE_ENFORCEMENT_POLICY)) ? "SIMPLE TYPE ENFORCEMENT" : \ +- ((X) == (ACM_CHINESE_WALL_AND_SIMPLE_TYPE_ENFORCEMENT_POLICY)) ? "CHINESE WALL AND SIMPLE TYPE ENFORCEMENT" : \ +- "UNDEFINED" +- +-/* the following policy versions must be increased +- * whenever the interpretation of the related +- * policy's data structure changes +- */ +-#define ACM_POLICY_VERSION 3 +-#define ACM_CHWALL_VERSION 1 +-#define ACM_STE_VERSION 1 +- +-/* defines a ssid reference used by xen */ +-typedef uint32_t ssidref_t; +- +-/* hooks that are known to domains */ +-#define ACMHOOK_none 0 +-#define ACMHOOK_sharing 1 +- +-/* -------security policy relevant type definitions-------- */ +- +-/* type identifier; compares to "equal" or "not equal" */ +-typedef uint16_t domaintype_t; +- +-/* CHINESE WALL POLICY DATA STRUCTURES +- * +- * current accumulated conflict type set: +- * When a domain is started and has a type that is in +- * a conflict set, the conflicting types are incremented in +- * the aggregate set. When a domain is destroyed, the +- * conflicting types to its type are decremented. +- * If a domain has multiple types, this procedure works over +- * all those types. +- * +- * conflict_aggregate_set[i] holds the number of +- * running domains that have a conflict with type i. +- * +- * running_types[i] holds the number of running domains +- * that include type i in their ssidref-referenced type set +- * +- * conflict_sets[i][j] is "0" if type j has no conflict +- * with type i and is "1" otherwise. +- */ +-/* high-16 = version, low-16 = check magic */ +-#define ACM_MAGIC 0x0001debc +- +-/* each offset in bytes from start of the struct they +- * are part of */ +- +-/* V3 of the policy buffer aded a version structure */ +-struct acm_policy_version +-{ +- uint32_t major; +- uint32_t minor; +-}; +- +- +-/* each buffer consists of all policy information for +- * the respective policy given in the policy code +- * +- * acm_policy_buffer, acm_chwall_policy_buffer, +- * and acm_ste_policy_buffer need to stay 32-bit aligned +- * because we create binary policies also with external +- * tools that assume packed representations (e.g. the java tool) +- */ +-struct acm_policy_buffer { +- uint32_t policy_version; /* ACM_POLICY_VERSION */ +- uint32_t magic; +- uint32_t len; +- uint32_t policy_reference_offset; +- uint32_t primary_policy_code; +- uint32_t primary_buffer_offset; +- uint32_t secondary_policy_code; +- uint32_t secondary_buffer_offset; +- struct acm_policy_version xml_pol_version; /* add in V3 */ +-}; +- +- +-struct acm_policy_reference_buffer { +- uint32_t len; +-}; +- +-struct acm_chwall_policy_buffer { +- uint32_t policy_version; /* ACM_CHWALL_VERSION */ +- uint32_t policy_code; +- uint32_t chwall_max_types; +- uint32_t chwall_max_ssidrefs; +- uint32_t chwall_max_conflictsets; +- uint32_t chwall_ssid_offset; +- uint32_t chwall_conflict_sets_offset; +- uint32_t chwall_running_types_offset; +- uint32_t chwall_conflict_aggregate_offset; +-}; +- +-struct acm_ste_policy_buffer { +- uint32_t policy_version; /* ACM_STE_VERSION */ +- uint32_t policy_code; +- uint32_t ste_max_types; +- uint32_t ste_max_ssidrefs; +- uint32_t ste_ssid_offset; +-}; +- +-struct acm_stats_buffer { +- uint32_t magic; +- uint32_t len; +- uint32_t primary_policy_code; +- uint32_t primary_stats_offset; +- uint32_t secondary_policy_code; +- uint32_t secondary_stats_offset; +-}; +- +-struct acm_ste_stats_buffer { +- uint32_t ec_eval_count; +- uint32_t gt_eval_count; +- uint32_t ec_denied_count; +- uint32_t gt_denied_count; +- uint32_t ec_cachehit_count; +- uint32_t gt_cachehit_count; +-}; +- +-struct acm_ssid_buffer { +- uint32_t len; +- ssidref_t ssidref; +- uint32_t policy_reference_offset; +- uint32_t primary_policy_code; +- uint32_t primary_max_types; +- uint32_t primary_types_offset; +- uint32_t secondary_policy_code; +- uint32_t secondary_max_types; +- uint32_t secondary_types_offset; +-}; +- +-#endif +- +-/* +- * Local variables: +- * mode: C +- * c-set-style: "BSD" +- * c-basic-offset: 4 +- * tab-width: 4 +- * indent-tabs-mode: nil +- * End: +- */ +diff -urN linux-2.6.27.19-5.1/include/xen/interface/acm_ops.h linux-2.6.27.23-0.1.1/include/xen/interface/acm_ops.h +--- linux-2.6.27.19-5.1/include/xen/interface/acm_ops.h 2009-06-16 13:55:16.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/include/xen/interface/acm_ops.h 1970-01-01 01:00:00.000000000 +0100 +@@ -1,159 +0,0 @@ +-/* +- * acm_ops.h: Xen access control module hypervisor commands +- * +- * Permission is hereby granted, free of charge, to any person obtaining a copy +- * of this software and associated documentation files (the "Software"), to +- * deal in the Software without restriction, including without limitation the +- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +- * sell copies of the Software, and to permit persons to whom the Software is +- * furnished to do so, subject to the following conditions: +- * +- * The above copyright notice and this permission notice shall be included in +- * all copies or substantial portions of the Software. +- * +- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +- * DEALINGS IN THE SOFTWARE. +- * +- * Reiner Sailer +- * Copyright (c) 2005,2006 International Business Machines Corporation. +- */ +- +-#ifndef __XEN_PUBLIC_ACM_OPS_H__ +-#define __XEN_PUBLIC_ACM_OPS_H__ +- +-#include "xen.h" +-#include "acm.h" +- +-/* +- * Make sure you increment the interface version whenever you modify this file! +- * This makes sure that old versions of acm tools will stop working in a +- * well-defined way (rather than crashing the machine, for instance). +- */ +-#define ACM_INTERFACE_VERSION 0xAAAA000A +- +-/************************************************************************/ +- +-/* +- * Prototype for this hypercall is: +- * int acm_op(int cmd, void *args) +- * @cmd == ACMOP_??? (access control module operation). +- * @args == Operation-specific extra arguments (NULL if none). +- */ +- +- +-#define ACMOP_setpolicy 1 +-struct acm_setpolicy { +- /* IN */ +- XEN_GUEST_HANDLE_64(void) pushcache; +- uint32_t pushcache_size; +-}; +- +- +-#define ACMOP_getpolicy 2 +-struct acm_getpolicy { +- /* IN */ +- XEN_GUEST_HANDLE_64(void) pullcache; +- uint32_t pullcache_size; +-}; +- +- +-#define ACMOP_dumpstats 3 +-struct acm_dumpstats { +- /* IN */ +- XEN_GUEST_HANDLE_64(void) pullcache; +- uint32_t pullcache_size; +-}; +- +- +-#define ACMOP_getssid 4 +-#define ACM_GETBY_ssidref 1 +-#define ACM_GETBY_domainid 2 +-struct acm_getssid { +- /* IN */ +- uint32_t get_ssid_by; /* ACM_GETBY_* */ +- union { +- domaintype_t domainid; +- ssidref_t ssidref; +- } id; +- XEN_GUEST_HANDLE_64(void) ssidbuf; +- uint32_t ssidbuf_size; +-}; +- +-#define ACMOP_getdecision 5 +-struct acm_getdecision { +- /* IN */ +- uint32_t get_decision_by1; /* ACM_GETBY_* */ +- uint32_t get_decision_by2; /* ACM_GETBY_* */ +- union { +- domaintype_t domainid; +- ssidref_t ssidref; +- } id1; +- union { +- domaintype_t domainid; +- ssidref_t ssidref; +- } id2; +- uint32_t hook; +- /* OUT */ +- uint32_t acm_decision; +-}; +- +- +-#define ACMOP_chgpolicy 6 +-struct acm_change_policy { +- /* IN */ +- XEN_GUEST_HANDLE_64(void) policy_pushcache; +- uint32_t policy_pushcache_size; +- XEN_GUEST_HANDLE_64(void) del_array; +- uint32_t delarray_size; +- XEN_GUEST_HANDLE_64(void) chg_array; +- uint32_t chgarray_size; +- /* OUT */ +- /* array with error code */ +- XEN_GUEST_HANDLE_64(void) err_array; +- uint32_t errarray_size; +-}; +- +-#define ACMOP_relabeldoms 7 +-struct acm_relabel_doms { +- /* IN */ +- XEN_GUEST_HANDLE_64(void) relabel_map; +- uint32_t relabel_map_size; +- /* OUT */ +- XEN_GUEST_HANDLE_64(void) err_array; +- uint32_t errarray_size; +-}; +- +-/* future interface to Xen */ +-struct xen_acmctl { +- uint32_t cmd; +- uint32_t interface_version; +- union { +- struct acm_setpolicy setpolicy; +- struct acm_getpolicy getpolicy; +- struct acm_dumpstats dumpstats; +- struct acm_getssid getssid; +- struct acm_getdecision getdecision; +- struct acm_change_policy change_policy; +- struct acm_relabel_doms relabel_doms; +- } u; +-}; +- +-typedef struct xen_acmctl xen_acmctl_t; +-DEFINE_XEN_GUEST_HANDLE(xen_acmctl_t); +- +-#endif /* __XEN_PUBLIC_ACM_OPS_H__ */ +- +-/* +- * Local variables: +- * mode: C +- * c-set-style: "BSD" +- * c-basic-offset: 4 +- * tab-width: 4 +- * indent-tabs-mode: nil +- * End: +- */ +diff -urN linux-2.6.27.19-5.1/include/xen/interface/elfnote.h linux-2.6.27.23-0.1.1/include/xen/interface/elfnote.h +--- linux-2.6.27.19-5.1/include/xen/interface/elfnote.h 2009-06-16 13:55:16.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/include/xen/interface/elfnote.h 2009-06-16 13:41:15.000000000 +0100 +@@ -162,9 +162,20 @@ + #define XEN_ELFNOTE_SUSPEND_CANCEL 14 + + /* ++ * The (non-default) location the initial phys-to-machine map should be ++ * placed at by the hypervisor (Dom0) or the tools (DomU). ++ * The kernel must be prepared for this mapping to be established using ++ * large pages, despite such otherwise not being available to guests. ++ * The kernel must also be prepared that the page table pages used for ++ * this mapping may not be accessible through the initial mapping. ++ * (Only x86-64 supports this at present.) ++ */ ++#define XEN_ELFNOTE_INIT_P2M 15 ++ ++/* + * The number of the highest elfnote defined. + */ +-#define XEN_ELFNOTE_MAX XEN_ELFNOTE_SUSPEND_CANCEL ++#define XEN_ELFNOTE_MAX XEN_ELFNOTE_INIT_P2M + + /* + * System information exported through crash notes. +diff -urN linux-2.6.27.19-5.1/include/xen/interface/hvm/vmx_assist.h linux-2.6.27.23-0.1.1/include/xen/interface/hvm/vmx_assist.h +--- linux-2.6.27.19-5.1/include/xen/interface/hvm/vmx_assist.h 2009-06-16 13:55:16.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/include/xen/interface/hvm/vmx_assist.h 1970-01-01 01:00:00.000000000 +0100 +@@ -1,122 +0,0 @@ +-/* +- * vmx_assist.h: Context definitions for the VMXASSIST world switch. +- * +- * Permission is hereby granted, free of charge, to any person obtaining a copy +- * of this software and associated documentation files (the "Software"), to +- * deal in the Software without restriction, including without limitation the +- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +- * sell copies of the Software, and to permit persons to whom the Software is +- * furnished to do so, subject to the following conditions: +- * +- * The above copyright notice and this permission notice shall be included in +- * all copies or substantial portions of the Software. +- * +- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +- * DEALINGS IN THE SOFTWARE. +- * +- * Leendert van Doorn, leendert@watson.ibm.com +- * Copyright (c) 2005, International Business Machines Corporation. +- */ +- +-#ifndef _VMX_ASSIST_H_ +-#define _VMX_ASSIST_H_ +- +-#define VMXASSIST_BASE 0xD0000 +-#define VMXASSIST_MAGIC 0x17101966 +-#define VMXASSIST_MAGIC_OFFSET (VMXASSIST_BASE+8) +- +-#define VMXASSIST_NEW_CONTEXT (VMXASSIST_BASE + 12) +-#define VMXASSIST_OLD_CONTEXT (VMXASSIST_NEW_CONTEXT + 4) +- +-#ifndef __ASSEMBLY__ +- +-#define NR_EXCEPTION_HANDLER 32 +-#define NR_INTERRUPT_HANDLERS 16 +-#define NR_TRAPS (NR_EXCEPTION_HANDLER+NR_INTERRUPT_HANDLERS) +- +-union vmcs_arbytes { +- struct arbyte_fields { +- unsigned int seg_type : 4, +- s : 1, +- dpl : 2, +- p : 1, +- reserved0 : 4, +- avl : 1, +- reserved1 : 1, +- default_ops_size: 1, +- g : 1, +- null_bit : 1, +- reserved2 : 15; +- } fields; +- unsigned int bytes; +-}; +- +-/* +- * World switch state +- */ +-struct vmx_assist_context { +- uint32_t eip; /* execution pointer */ +- uint32_t esp; /* stack pointer */ +- uint32_t eflags; /* flags register */ +- uint32_t cr0; +- uint32_t cr3; /* page table directory */ +- uint32_t cr4; +- uint32_t idtr_limit; /* idt */ +- uint32_t idtr_base; +- uint32_t gdtr_limit; /* gdt */ +- uint32_t gdtr_base; +- uint32_t cs_sel; /* cs selector */ +- uint32_t cs_limit; +- uint32_t cs_base; +- union vmcs_arbytes cs_arbytes; +- uint32_t ds_sel; /* ds selector */ +- uint32_t ds_limit; +- uint32_t ds_base; +- union vmcs_arbytes ds_arbytes; +- uint32_t es_sel; /* es selector */ +- uint32_t es_limit; +- uint32_t es_base; +- union vmcs_arbytes es_arbytes; +- uint32_t ss_sel; /* ss selector */ +- uint32_t ss_limit; +- uint32_t ss_base; +- union vmcs_arbytes ss_arbytes; +- uint32_t fs_sel; /* fs selector */ +- uint32_t fs_limit; +- uint32_t fs_base; +- union vmcs_arbytes fs_arbytes; +- uint32_t gs_sel; /* gs selector */ +- uint32_t gs_limit; +- uint32_t gs_base; +- union vmcs_arbytes gs_arbytes; +- uint32_t tr_sel; /* task selector */ +- uint32_t tr_limit; +- uint32_t tr_base; +- union vmcs_arbytes tr_arbytes; +- uint32_t ldtr_sel; /* ldtr selector */ +- uint32_t ldtr_limit; +- uint32_t ldtr_base; +- union vmcs_arbytes ldtr_arbytes; +- +- unsigned char rm_irqbase[2]; +-}; +-typedef struct vmx_assist_context vmx_assist_context_t; +- +-#endif /* __ASSEMBLY__ */ +- +-#endif /* _VMX_ASSIST_H_ */ +- +-/* +- * Local variables: +- * mode: C +- * c-set-style: "BSD" +- * c-basic-offset: 4 +- * tab-width: 4 +- * indent-tabs-mode: nil +- * End: +- */ +diff -urN linux-2.6.27.19-5.1/include/xen/interface/xen.h linux-2.6.27.23-0.1.1/include/xen/interface/xen.h +--- linux-2.6.27.19-5.1/include/xen/interface/xen.h 2009-06-16 13:55:16.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/include/xen/interface/xen.h 2009-06-16 13:41:15.000000000 +0100 +@@ -87,7 +87,7 @@ + #define __HYPERVISOR_mmuext_op 26 + #define __HYPERVISOR_xsm_op 27 + #define __HYPERVISOR_nmi_op 28 +-#define __HYPERVISOR_sched_op 29 ++#define __HYPERVISOR_sched_op_new 29 + #define __HYPERVISOR_callback_op 30 + #define __HYPERVISOR_xenoprof_op 31 + #define __HYPERVISOR_event_channel_op 32 +@@ -115,6 +115,8 @@ + #if __XEN_INTERFACE_VERSION__ < 0x00030101 || (defined(CONFIG_PARAVIRT_XEN) && !defined(HAVE_XEN_PLATFORM_COMPAT_H)) + #undef __HYPERVISOR_sched_op + #define __HYPERVISOR_sched_op __HYPERVISOR_sched_op_compat ++#else ++#define __HYPERVISOR_sched_op __HYPERVISOR_sched_op_new + #endif + + /* New event-channel and physdev hypercalls introduced in 0x00030202. */ +@@ -534,6 +536,7 @@ + * a. relocated kernel image + * b. initial ram disk [mod_start, mod_len] + * c. list of allocated page frames [mfn_list, nr_pages] ++ * (unless relocated due to XEN_ELFNOTE_INIT_P2M) + * d. start_info_t structure [register ESI (x86)] + * e. bootstrap page tables [pt_base, CR3 (x86)] + * f. bootstrap stack [register ESP (x86)] +@@ -575,6 +578,11 @@ + unsigned long mod_start; /* VIRTUAL address of pre-loaded module. */ + unsigned long mod_len; /* Size (bytes) of pre-loaded module. */ + int8_t cmd_line[MAX_GUEST_CMDLINE]; ++#ifndef __GENKSYMS__ ++ /* The pfn range here covers both page table and p->m table frames. */ ++ unsigned long first_p2m_pfn;/* 1st pfn forming initial P->M table. */ ++ unsigned long nr_p2m_frames;/* # of pfns forming initial P->M table. */ ++#endif + }; + typedef struct start_info start_info_t; + +diff -urN linux-2.6.27.19-5.1/kernel/exit.c linux-2.6.27.23-0.1.1/kernel/exit.c +--- linux-2.6.27.19-5.1/kernel/exit.c 2009-06-16 13:55:01.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/kernel/exit.c 2009-06-16 13:41:02.000000000 +0100 +@@ -945,8 +945,7 @@ + */ + if (tsk->exit_signal != SIGCHLD && !task_detached(tsk) && + (tsk->parent_exec_id != tsk->real_parent->self_exec_id || +- tsk->self_exec_id != tsk->parent_exec_id) && +- !capable(CAP_KILL)) ++ tsk->self_exec_id != tsk->parent_exec_id)) + tsk->exit_signal = SIGCHLD; + + signal = tracehook_notify_death(tsk, &cookie, group_dead); +diff -urN linux-2.6.27.19-5.1/kernel/fork.c linux-2.6.27.23-0.1.1/kernel/fork.c +--- linux-2.6.27.19-5.1/kernel/fork.c 2009-06-16 13:55:01.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/kernel/fork.c 2009-06-16 13:41:02.000000000 +0100 +@@ -1138,14 +1138,8 @@ + #endif + clear_all_latency_tracing(p); + +- /* Our parent execution domain becomes current domain +- These must match for thread signalling to apply */ +- p->parent_exec_id = p->self_exec_id; +- + /* ok, now we should be set up.. */ +- p->exit_signal = (clone_flags & CLONE_THREAD) ? -1 : +- (clone_flags & CLONE_PARENT) ? current->group_leader->exit_signal : +- (clone_flags & CSIGNAL); ++ p->exit_signal = (clone_flags & CLONE_THREAD) ? -1 : (clone_flags & CSIGNAL); + p->pdeath_signal = 0; + p->exit_state = 0; + +@@ -1181,10 +1175,13 @@ + set_task_cpu(p, smp_processor_id()); + + /* CLONE_PARENT re-uses the old parent */ +- if (clone_flags & (CLONE_PARENT|CLONE_THREAD)) ++ if (clone_flags & (CLONE_PARENT|CLONE_THREAD)) { + p->real_parent = current->real_parent; +- else ++ p->parent_exec_id = current->parent_exec_id; ++ } else { + p->real_parent = current; ++ p->parent_exec_id = current->self_exec_id; ++ } + + spin_lock(¤t->sighand->siglock); + +@@ -1448,6 +1445,8 @@ + mm_cachep = kmem_cache_create("mm_struct", + sizeof(struct mm_struct), ARCH_MIN_MMSTRUCT_ALIGN, + SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL); ++ if (percpu_counter_init(&vm_committed_as, 0)) ++ panic("Failed to allocate vm_committed_as"); + } + + /* +diff -urN linux-2.6.27.19-5.1/kernel/kexec.c linux-2.6.27.23-0.1.1/kernel/kexec.c +--- linux-2.6.27.19-5.1/kernel/kexec.c 2009-06-16 13:55:01.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/kernel/kexec.c 2009-06-16 13:41:02.000000000 +0100 +@@ -44,13 +44,19 @@ + #include + #endif + ++#ifndef CONFIG_XEN + /* Per cpu memory for storing cpu states in case of system crash. */ + note_buf_t* crash_notes; ++#endif + int dump_after_notifier; + + /* vmcoreinfo stuff */ + unsigned char vmcoreinfo_data[VMCOREINFO_BYTES]; +-u32 vmcoreinfo_note[VMCOREINFO_NOTE_SIZE/4]; ++u32 ++#if defined(CONFIG_XEN) && defined(CONFIG_X86) ++__page_aligned_bss ++#endif ++vmcoreinfo_note[VMCOREINFO_NOTE_SIZE/4]; + size_t vmcoreinfo_size; + size_t vmcoreinfo_max_size = sizeof(vmcoreinfo_data); + +@@ -1167,6 +1173,7 @@ + memcpy(buf, ¬e, sizeof(note)); + } + ++#ifndef CONFIG_XEN + void crash_save_cpu(struct pt_regs *regs, int cpu) + { + struct elf_prstatus prstatus; +@@ -1192,6 +1199,7 @@ + &prstatus, sizeof(prstatus)); + final_note(buf); + } ++#endif + + #ifdef CONFIG_SYSCTL + static ctl_table dump_after_notifier_table[] = { +@@ -1219,6 +1227,7 @@ + + static int __init crash_notes_memory_init(void) + { ++#ifndef CONFIG_XEN + /* Allocate memory for saving cpu registers. */ + crash_notes = alloc_percpu(note_buf_t); + if (!crash_notes) { +@@ -1226,6 +1235,7 @@ + " states failed\n"); + return -ENOMEM; + } ++#endif + #ifdef CONFIG_SYSCTL + register_sysctl_table(kexec_sys_table); + #endif +diff -urN linux-2.6.27.19-5.1/kernel/kprobes.c linux-2.6.27.23-0.1.1/kernel/kprobes.c +--- linux-2.6.27.19-5.1/kernel/kprobes.c 2009-06-16 13:55:01.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/kernel/kprobes.c 2009-06-16 13:41:02.000000000 +0100 +@@ -890,10 +890,8 @@ + ri->rp = rp; + ri->task = current; + +- if (rp->entry_handler && rp->entry_handler(ri, regs)) { +- spin_unlock_irqrestore(&rp->lock, flags); ++ if (rp->entry_handler && rp->entry_handler(ri, regs)) + return 0; +- } + + arch_prepare_kretprobe(ri, regs); + +diff -urN linux-2.6.27.19-5.1/kernel/seccomp.c linux-2.6.27.23-0.1.1/kernel/seccomp.c +--- linux-2.6.27.19-5.1/kernel/seccomp.c 2009-06-16 13:55:01.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/kernel/seccomp.c 2009-06-16 13:41:02.000000000 +0100 +@@ -8,6 +8,7 @@ + + #include + #include ++#include + + /* #define SECCOMP_DEBUG 1 */ + #define NR_SECCOMP_MODES 1 +@@ -22,7 +23,7 @@ + 0, /* null terminated */ + }; + +-#ifdef TIF_32BIT ++#ifdef CONFIG_COMPAT + static int mode1_syscalls_32[] = { + __NR_seccomp_read_32, __NR_seccomp_write_32, __NR_seccomp_exit_32, __NR_seccomp_sigreturn_32, + 0, /* null terminated */ +@@ -37,8 +38,8 @@ + switch (mode) { + case 1: + syscall = mode1_syscalls; +-#ifdef TIF_32BIT +- if (test_thread_flag(TIF_32BIT)) ++#ifdef CONFIG_COMPAT ++ if (is_compat_task()) + syscall = mode1_syscalls_32; + #endif + do { +diff -urN linux-2.6.27.19-5.1/kernel/signal.c linux-2.6.27.23-0.1.1/kernel/signal.c +--- linux-2.6.27.19-5.1/kernel/signal.c 2009-06-16 13:55:01.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/kernel/signal.c 2009-06-16 13:41:02.000000000 +0100 +@@ -1552,7 +1552,15 @@ + read_lock(&tasklist_lock); + if (may_ptrace_stop()) { + do_notify_parent_cldstop(current, CLD_TRAPPED); ++ /* ++ * Don't want to allow preemption here, because ++ * sys_ptrace() needs this task to be inactive. ++ * ++ * XXX: implement read_unlock_no_resched(). ++ */ ++ preempt_disable(); + read_unlock(&tasklist_lock); ++ preempt_enable_no_resched(); + schedule(); + } else { + /* +diff -urN linux-2.6.27.19-5.1/kernel/time/tick-common.c linux-2.6.27.23-0.1.1/kernel/time/tick-common.c +--- linux-2.6.27.19-5.1/kernel/time/tick-common.c 2009-06-16 13:55:01.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/kernel/time/tick-common.c 2009-06-16 13:41:02.000000000 +0100 +@@ -93,7 +93,17 @@ + for (;;) { + if (!clockevents_program_event(dev, next, ktime_get())) + return; +- tick_periodic(cpu); ++ /* ++ * Have to be careful here. If we're in oneshot mode, ++ * before we call tick_periodic() in a loop, we need ++ * to be sure we're using a real hardware clocksource. ++ * Otherwise we could get trapped in an infinite ++ * loop, as the tick_periodic() increments jiffies, ++ * when then will increment time, posibly causing ++ * the loop to trigger again and again. ++ */ ++ if (timekeeping_valid_for_hres()) ++ tick_periodic(cpu); + next = ktime_add(next, tick_period); + } + } +diff -urN linux-2.6.27.19-5.1/kernel/tsacct.c linux-2.6.27.23-0.1.1/kernel/tsacct.c +--- linux-2.6.27.19-5.1/kernel/tsacct.c 2009-06-16 13:55:01.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/kernel/tsacct.c 2009-06-16 13:41:02.000000000 +0100 +@@ -120,8 +120,10 @@ + if (likely(tsk->mm)) { + cputime_t time, dtime; + struct timeval value; ++ unsigned long flags; + u64 delta; + ++ local_irq_save(flags); + time = tsk->stime + tsk->utime; + dtime = cputime_sub(time, tsk->acct_timexpd); + jiffies_to_timeval(cputime_to_jiffies(dtime), &value); +@@ -129,10 +131,12 @@ + delta = delta * USEC_PER_SEC + value.tv_usec; + + if (delta == 0) +- return; ++ goto out; + tsk->acct_timexpd = time; + tsk->acct_rss_mem1 += delta * get_mm_rss(tsk->mm); + tsk->acct_vm_mem1 += delta * tsk->mm->total_vm; ++ out: ++ local_irq_restore(flags); + } + } + +diff -urN linux-2.6.27.19-5.1/lib/swiotlb-xen.c linux-2.6.27.23-0.1.1/lib/swiotlb-xen.c +--- linux-2.6.27.19-5.1/lib/swiotlb-xen.c 2009-06-16 13:53:16.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/lib/swiotlb-xen.c 2009-06-16 13:39:37.000000000 +0100 +@@ -151,7 +151,7 @@ + /* + * Get IO TLB memory from the low pages + */ +- iotlb_virt_start = alloc_bootmem_low_pages(bytes); ++ iotlb_virt_start = alloc_bootmem_pages(bytes); + if (!iotlb_virt_start) + panic("Cannot allocate SWIOTLB buffer!\n"); + +@@ -196,7 +196,7 @@ + /* + * Get the overflow emergency buffer + */ +- io_tlb_overflow_buffer = alloc_bootmem_low(io_tlb_overflow); ++ io_tlb_overflow_buffer = alloc_bootmem(io_tlb_overflow); + if (!io_tlb_overflow_buffer) + panic("Cannot allocate SWIOTLB overflow buffer!\n"); + +diff -urN linux-2.6.27.19-5.1/Makefile linux-2.6.27.23-0.1.1/Makefile +--- linux-2.6.27.19-5.1/Makefile 2009-06-16 13:54:10.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/Makefile 2009-06-16 13:40:23.000000000 +0100 +@@ -1,7 +1,7 @@ + VERSION = 2 + PATCHLEVEL = 6 + SUBLEVEL = 27 +-EXTRAVERSION = .19-5.1 ++EXTRAVERSION = .23-0.1.1 + NAME = Trembling Tortoise + + # *DOCUMENTATION* +@@ -356,6 +356,7 @@ + KBUILD_CFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \ + -fno-strict-aliasing -fno-common \ + -Werror-implicit-function-declaration ++KBUILD_CFLAGS += $(call cc-option,-fwrapv) + KBUILD_AFLAGS := -D__ASSEMBLY__ + + # Warn about unsupported modules in kernels built inside Autobuild +@@ -581,6 +582,9 @@ + # disable pointer signed / unsigned warnings in gcc 4.0 + KBUILD_CFLAGS += $(call cc-option,-Wno-pointer-sign,) + ++# disable invalid "can't wrap" optimzations for signed / pointers ++KBUILD_CFLAGS += $(call cc-option,-fwrapv) ++ + # Add user supplied CPPFLAGS, AFLAGS and CFLAGS as the last assignments + # But warn user when we do so + warn-assign = \ +diff -urN linux-2.6.27.19-5.1/mm/filemap_xip.c linux-2.6.27.23-0.1.1/mm/filemap_xip.c +--- linux-2.6.27.19-5.1/mm/filemap_xip.c 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/mm/filemap_xip.c 2009-06-16 13:39:37.000000000 +0100 +@@ -89,8 +89,8 @@ + } + } + nr = nr - offset; +- if (nr > len) +- nr = len; ++ if (nr > len - copied) ++ nr = len - copied; + + error = mapping->a_ops->get_xip_mem(mapping, index, 0, + &xip_mem, &xip_pfn); +diff -urN linux-2.6.27.19-5.1/mm/madvise.c linux-2.6.27.23-0.1.1/mm/madvise.c +--- linux-2.6.27.19-5.1/mm/madvise.c 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/mm/madvise.c 2009-06-16 13:39:37.000000000 +0100 +@@ -112,6 +112,14 @@ + if (!file) + return -EBADF; + ++ /* ++ * Page cache readahead assumes page cache pages are order-0 which ++ * is not the case for hugetlbfs. Do not give a bad return value ++ * but ignore the advice. ++ */ ++ if (vma->vm_flags & VM_HUGETLB) ++ return 0; ++ + if (file->f_mapping->a_ops->get_xip_mem) { + /* no bad return value, but ignore advice */ + return 0; +diff -urN linux-2.6.27.19-5.1/mm/mmap.c linux-2.6.27.23-0.1.1/mm/mmap.c +--- linux-2.6.27.19-5.1/mm/mmap.c 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/mm/mmap.c 2009-06-16 13:39:37.000000000 +0100 +@@ -84,7 +84,7 @@ + int sysctl_overcommit_memory = OVERCOMMIT_GUESS; /* heuristic overcommit */ + int sysctl_overcommit_ratio = 50; /* default is 50% */ + int sysctl_max_map_count __read_mostly = DEFAULT_MAX_MAP_COUNT; +-atomic_long_t vm_committed_space = ATOMIC_LONG_INIT(0); ++struct percpu_counter vm_committed_as; + int heap_stack_gap __read_mostly = 1; + + /* +@@ -178,11 +178,7 @@ + leave 3% of the size of this process for other processes */ + allowed -= mm->total_vm / 32; + +- /* +- * cast `allowed' as a signed long because vm_committed_space +- * sometimes has a negative value +- */ +- if (atomic_long_read(&vm_committed_space) < (long)allowed) ++ if (percpu_counter_read_positive(&vm_committed_as) < allowed) + return 0; + error: + vm_unacct_memory(pages); +@@ -2125,6 +2121,9 @@ + arch_exit_mmap(mm); + mmu_notifier_release(mm); + ++ if (!mm->mmap) /* Can happen if dup_mmap() received an OOM */ ++ return; ++ + lru_add_drain(); + flush_cache_mm(mm); + tlb = tlb_gather_mmu(mm, 1); +diff -urN linux-2.6.27.19-5.1/mm/nommu.c linux-2.6.27.23-0.1.1/mm/nommu.c +--- linux-2.6.27.19-5.1/mm/nommu.c 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/mm/nommu.c 2009-06-16 13:39:37.000000000 +0100 +@@ -39,7 +39,7 @@ + unsigned long max_mapnr; + unsigned long num_physpages; + unsigned long askedalloc, realalloc; +-atomic_long_t vm_committed_space = ATOMIC_LONG_INIT(0); ++struct percpu_counter vm_committed_as; + int sysctl_overcommit_memory = OVERCOMMIT_GUESS; /* heuristic overcommit */ + int sysctl_overcommit_ratio = 50; /* default is 50% */ + int sysctl_max_map_count = DEFAULT_MAX_MAP_COUNT; +@@ -1434,12 +1434,9 @@ + leave 3% of the size of this process for other processes */ + allowed -= current->mm->total_vm / 32; + +- /* +- * cast `allowed' as a signed long because vm_committed_space +- * sometimes has a negative value +- */ +- if (atomic_long_read(&vm_committed_space) < (long)allowed) ++ if (percpu_counter_read_positive(&vm_committed_as) < allowed) + return 0; ++ + error: + vm_unacct_memory(pages); + +diff -urN linux-2.6.27.19-5.1/mm/page_alloc.c linux-2.6.27.23-0.1.1/mm/page_alloc.c +--- linux-2.6.27.19-5.1/mm/page_alloc.c 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/mm/page_alloc.c 2009-06-16 13:39:37.000000000 +0100 +@@ -3000,7 +3000,7 @@ + * was used and there are no special requirements, this is a convenient + * alternative + */ +-int __meminit early_pfn_to_nid(unsigned long pfn) ++int __meminit __early_pfn_to_nid(unsigned long pfn) + { + int i; + +@@ -3011,10 +3011,33 @@ + if (start_pfn <= pfn && pfn < end_pfn) + return early_node_map[i].nid; + } ++ /* This is a memory hole */ ++ return -1; ++} ++#endif /* CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID */ ++ ++int __meminit early_pfn_to_nid(unsigned long pfn) ++{ ++ int nid; + ++ nid = __early_pfn_to_nid(pfn); ++ if (nid >= 0) ++ return nid; ++ /* just returns 0 */ + return 0; + } +-#endif /* CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID */ ++ ++#ifdef CONFIG_NODES_SPAN_OTHER_NODES ++bool __meminit early_pfn_in_nid(unsigned long pfn, int node) ++{ ++ int nid; ++ ++ nid = __early_pfn_to_nid(pfn); ++ if (nid >= 0 && nid != node) ++ return false; ++ return true; ++} ++#endif + + /* Basic iterator support to walk early_node_map[] */ + #define for_each_active_range_index_in_nid(i, nid) \ +diff -urN linux-2.6.27.19-5.1/mm/pdflush.c linux-2.6.27.23-0.1.1/mm/pdflush.c +--- linux-2.6.27.19-5.1/mm/pdflush.c 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/mm/pdflush.c 2009-06-16 13:39:37.000000000 +0100 +@@ -98,7 +98,6 @@ + INIT_LIST_HEAD(&my_work->list); + + spin_lock_irq(&pdflush_lock); +- nr_pdflush_threads++; + for ( ; ; ) { + struct pdflush_work *pdf; + +@@ -126,20 +125,23 @@ + + (*my_work->fn)(my_work->arg0); + ++ spin_lock_irq(&pdflush_lock); ++ + /* + * Thread creation: For how long have there been zero + * available threads? + */ + if (time_after(jiffies, last_empty_jifs + 1 * HZ)) { +- /* unlocked list_empty() test is OK here */ + if (list_empty(&pdflush_list)) { +- /* unlocked test is OK here */ +- if (nr_pdflush_threads < MAX_PDFLUSH_THREADS) ++ if (nr_pdflush_threads < MAX_PDFLUSH_THREADS) { ++ nr_pdflush_threads++; ++ spin_unlock_irq(&pdflush_lock); + start_one_pdflush_thread(); ++ spin_lock_irq(&pdflush_lock); ++ } + } + } + +- spin_lock_irq(&pdflush_lock); + my_work->fn = NULL; + + /* +@@ -227,13 +229,26 @@ + + static void start_one_pdflush_thread(void) + { +- kthread_run(pdflush, NULL, "pdflush"); ++ struct task_struct *k; ++ ++ k = kthread_run(pdflush, NULL, "pdflush"); ++ if (unlikely(IS_ERR(k))) { ++ spin_lock_irq(&pdflush_lock); ++ nr_pdflush_threads--; ++ spin_unlock_irq(&pdflush_lock); ++ } + } + + static int __init pdflush_init(void) + { + int i; + ++ /* ++ * Pre-set nr_pdflush_threads... If we fail to create, ++ * the count will be decremented. ++ */ ++ nr_pdflush_threads = MIN_PDFLUSH_THREADS; ++ + for (i = 0; i < MIN_PDFLUSH_THREADS; i++) + start_one_pdflush_thread(); + return 0; +diff -urN linux-2.6.27.19-5.1/mm/swap.c linux-2.6.27.23-0.1.1/mm/swap.c +--- linux-2.6.27.19-5.1/mm/swap.c 2009-06-16 13:53:09.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/mm/swap.c 2009-06-16 13:39:37.000000000 +0100 +@@ -474,49 +474,6 @@ + + EXPORT_SYMBOL(pagevec_lookup_tag); + +-#ifdef CONFIG_SMP +-/* +- * We tolerate a little inaccuracy to avoid ping-ponging the counter between +- * CPUs +- */ +-#define ACCT_THRESHOLD max(16, NR_CPUS * 2) +- +-static DEFINE_PER_CPU(long, committed_space); +- +-void vm_acct_memory(long pages) +-{ +- long *local; +- +- preempt_disable(); +- local = &__get_cpu_var(committed_space); +- *local += pages; +- if (*local > ACCT_THRESHOLD || *local < -ACCT_THRESHOLD) { +- atomic_long_add(*local, &vm_committed_space); +- *local = 0; +- } +- preempt_enable(); +-} +- +-#ifdef CONFIG_HOTPLUG_CPU +- +-/* Drop the CPU's cached committed space back into the central pool. */ +-static int cpu_swap_callback(struct notifier_block *nfb, +- unsigned long action, +- void *hcpu) +-{ +- long *committed; +- +- committed = &per_cpu(committed_space, (long)hcpu); +- if (action == CPU_DEAD || action == CPU_DEAD_FROZEN) { +- atomic_long_add(*committed, &vm_committed_space); +- *committed = 0; +- drain_cpu_pagevecs((long)hcpu); +- } +- return NOTIFY_OK; +-} +-#endif /* CONFIG_HOTPLUG_CPU */ +-#endif /* CONFIG_SMP */ +- + /* + * Perform any setup for the swap system + */ +@@ -537,7 +494,4 @@ + * Right now other parts of the system means that we + * _really_ don't want to cluster much more + */ +-#ifdef CONFIG_HOTPLUG_CPU +- hotcpu_notifier(cpu_swap_callback, 0); +-#endif + } +diff -urN linux-2.6.27.19-5.1/net/bridge/br_if.c linux-2.6.27.23-0.1.1/net/bridge/br_if.c +--- linux-2.6.27.19-5.1/net/bridge/br_if.c 2009-06-16 13:53:17.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/net/bridge/br_if.c 2009-06-16 13:39:43.000000000 +0100 +@@ -428,7 +428,6 @@ + err1: + kobject_del(&p->kobj); + err0: +- kobject_put(&p->kobj); + dev_set_promiscuity(dev, -1); + put_back: + dev_put(dev); +diff -urN linux-2.6.27.19-5.1/net/bridge/br_netfilter.c linux-2.6.27.23-0.1.1/net/bridge/br_netfilter.c +--- linux-2.6.27.19-5.1/net/bridge/br_netfilter.c 2009-06-16 13:53:17.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/net/bridge/br_netfilter.c 2009-06-16 13:39:43.000000000 +0100 +@@ -101,6 +101,18 @@ + pppoe_proto(skb) == htons(PPP_IPV6) && \ + brnf_filter_pppoe_tagged) + ++static void fake_update_pmtu(struct dst_entry *dst, u32 mtu) ++{ ++} ++ ++static struct dst_ops fake_dst_ops = { ++ .family = AF_INET, ++ .protocol = __constant_htons(ETH_P_IP), ++ .update_pmtu = fake_update_pmtu, ++ .entry_size = sizeof(struct rtable), ++ .entries = ATOMIC_INIT(0), ++}; ++ + /* + * Initialize bogus route table used to keep netfilter happy. + * Currently, we fill in the PMTU entry because netfilter +@@ -117,6 +129,7 @@ + rt->u.dst.path = &rt->u.dst; + rt->u.dst.metrics[RTAX_MTU - 1] = 1500; + rt->u.dst.flags = DST_NOXFRM; ++ rt->u.dst.ops = &fake_dst_ops; + } + + static inline struct rtable *bridge_parent_rtable(const struct net_device *dev) +diff -urN linux-2.6.27.19-5.1/net/core/skbuff.c linux-2.6.27.23-0.1.1/net/core/skbuff.c +--- linux-2.6.27.19-5.1/net/core/skbuff.c 2009-06-16 13:53:17.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/net/core/skbuff.c 2009-06-16 13:39:42.000000000 +0100 +@@ -2106,7 +2106,7 @@ + next_skb: + block_limit = skb_headlen(st->cur_skb) + st->stepped_offset; + +- if (abs_offset < block_limit) { ++ if (abs_offset < block_limit && !st->frag_data) { + *data = st->cur_skb->data + (abs_offset - st->stepped_offset); + return block_limit - abs_offset; + } +diff -urN linux-2.6.27.19-5.1/net/core/sock.c linux-2.6.27.23-0.1.1/net/core/sock.c +--- linux-2.6.27.19-5.1/net/core/sock.c 2009-06-16 13:53:17.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/net/core/sock.c 2009-06-16 13:39:42.000000000 +0100 +@@ -811,7 +811,7 @@ + if (len < 0) + return -EINVAL; + +- v.val = 0; ++ memset(&v, 0, sizeof(v)); + + switch(optname) { + case SO_DEBUG: +@@ -1259,7 +1259,6 @@ + { + struct sock *sk = skb->sk; + +- skb_truesize_check(skb); + atomic_sub(skb->truesize, &sk->sk_rmem_alloc); + sk_mem_uncharge(skb->sk, skb->truesize); + } +diff -urN linux-2.6.27.19-5.1/net/ipv4/netfilter/arp_tables.c linux-2.6.27.23-0.1.1/net/ipv4/netfilter/arp_tables.c +--- linux-2.6.27.19-5.1/net/ipv4/netfilter/arp_tables.c 2009-06-16 13:53:17.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/net/ipv4/netfilter/arp_tables.c 2009-06-16 13:39:42.000000000 +0100 +@@ -372,7 +372,9 @@ + && unconditional(&e->arp)) || visited) { + unsigned int oldpos, size; + +- if (t->verdict < -NF_MAX_VERDICT - 1) { ++ if ((strcmp(t->target.u.user.name, ++ ARPT_STANDARD_TARGET) == 0) && ++ t->verdict < -NF_MAX_VERDICT - 1) { + duprintf("mark_source_chains: bad " + "negative verdict (%i)\n", + t->verdict); +diff -urN linux-2.6.27.19-5.1/net/ipv4/netfilter/ip_tables.c linux-2.6.27.23-0.1.1/net/ipv4/netfilter/ip_tables.c +--- linux-2.6.27.19-5.1/net/ipv4/netfilter/ip_tables.c 2009-06-16 13:53:17.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/net/ipv4/netfilter/ip_tables.c 2009-06-16 13:39:42.000000000 +0100 +@@ -502,7 +502,9 @@ + && unconditional(&e->ip)) || visited) { + unsigned int oldpos, size; + +- if (t->verdict < -NF_MAX_VERDICT - 1) { ++ if ((strcmp(t->target.u.user.name, ++ IPT_STANDARD_TARGET) == 0) && ++ t->verdict < -NF_MAX_VERDICT - 1) { + duprintf("mark_source_chains: bad " + "negative verdict (%i)\n", + t->verdict); +diff -urN linux-2.6.27.19-5.1/net/ipv6/inet6_hashtables.c linux-2.6.27.23-0.1.1/net/ipv6/inet6_hashtables.c +--- linux-2.6.27.19-5.1/net/ipv6/inet6_hashtables.c 2009-06-16 13:53:17.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/net/ipv6/inet6_hashtables.c 2009-06-16 13:39:42.000000000 +0100 +@@ -210,11 +210,11 @@ + + if (twp != NULL) { + *twp = tw; +- NET_INC_STATS_BH(twsk_net(tw), LINUX_MIB_TIMEWAITRECYCLED); ++ NET_INC_STATS_BH(net, LINUX_MIB_TIMEWAITRECYCLED); + } else if (tw != NULL) { + /* Silly. Should hash-dance instead... */ + inet_twsk_deschedule(tw, death_row); +- NET_INC_STATS_BH(twsk_net(tw), LINUX_MIB_TIMEWAITRECYCLED); ++ NET_INC_STATS_BH(net, LINUX_MIB_TIMEWAITRECYCLED); + + inet_twsk_put(tw); + } +diff -urN linux-2.6.27.19-5.1/net/ipv6/ip6_input.c linux-2.6.27.23-0.1.1/net/ipv6/ip6_input.c +--- linux-2.6.27.19-5.1/net/ipv6/ip6_input.c 2009-06-16 13:53:17.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/net/ipv6/ip6_input.c 2009-06-16 13:39:42.000000000 +0100 +@@ -74,8 +74,7 @@ + if ((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL || + !idev || unlikely(idev->cnf.disable_ipv6)) { + IP6_INC_STATS_BH(idev, IPSTATS_MIB_INDISCARDS); +- rcu_read_unlock(); +- goto out; ++ goto drop; + } + + memset(IP6CB(skb), 0, sizeof(struct inet6_skb_parm)); +@@ -145,7 +144,6 @@ + drop: + rcu_read_unlock(); + kfree_skb(skb); +-out: + return 0; + } + +diff -urN linux-2.6.27.19-5.1/net/ipv6/netfilter/ip6_tables.c linux-2.6.27.23-0.1.1/net/ipv6/netfilter/ip6_tables.c +--- linux-2.6.27.19-5.1/net/ipv6/netfilter/ip6_tables.c 2009-06-16 13:53:17.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/net/ipv6/netfilter/ip6_tables.c 2009-06-16 13:39:42.000000000 +0100 +@@ -529,7 +529,9 @@ + && unconditional(&e->ipv6)) || visited) { + unsigned int oldpos, size; + +- if (t->verdict < -NF_MAX_VERDICT - 1) { ++ if ((strcmp(t->target.u.user.name, ++ IP6T_STANDARD_TARGET) == 0) && ++ t->verdict < -NF_MAX_VERDICT - 1) { + duprintf("mark_source_chains: bad " + "negative verdict (%i)\n", + t->verdict); +diff -urN linux-2.6.27.19-5.1/net/iucv/af_iucv.c linux-2.6.27.23-0.1.1/net/iucv/af_iucv.c +--- linux-2.6.27.19-5.1/net/iucv/af_iucv.c 2009-06-16 13:53:17.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/net/iucv/af_iucv.c 2009-06-16 13:39:42.000000000 +0100 +@@ -1089,6 +1089,8 @@ + if (sk->sk_shutdown & RCV_SHUTDOWN) + return; + ++ spin_lock(&iucv->message_q.lock); ++ + if (!list_empty(&iucv->message_q.list) || + !skb_queue_empty(&iucv->backlog_skb_q)) + goto save_message; +@@ -1102,11 +1104,8 @@ + if (!skb) + goto save_message; + +- spin_lock(&iucv->message_q.lock); + iucv_process_message(sk, skb, path, msg); +- spin_unlock(&iucv->message_q.lock); +- +- return; ++ goto out_unlock; + + save_message: + save_msg = kzalloc(sizeof(struct sock_msg_q), GFP_ATOMIC | GFP_DMA); +@@ -1115,8 +1114,9 @@ + save_msg->path = path; + save_msg->msg = *msg; + +- spin_lock(&iucv->message_q.lock); + list_add_tail(&save_msg->list, &iucv->message_q.list); ++ ++out_unlock: + spin_unlock(&iucv->message_q.lock); + } + +diff -urN linux-2.6.27.19-5.1/net/iucv/iucv.c linux-2.6.27.23-0.1.1/net/iucv/iucv.c +--- linux-2.6.27.19-5.1/net/iucv/iucv.c 2009-06-16 13:53:17.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/net/iucv/iucv.c 2009-06-16 13:39:42.000000000 +0100 +@@ -280,6 +280,7 @@ + * Anchor for per-cpu IUCV command parameter block. + */ + static union iucv_param *iucv_param[NR_CPUS]; ++static union iucv_param *iucv_param_irq[NR_CPUS]; + + /** + * iucv_call_b2f0 +@@ -358,7 +359,7 @@ + * 0x10 - Flag to allow priority message completion interrupts + * 0x08 - Flag to allow IUCV control interrupts + */ +- parm = iucv_param[cpu]; ++ parm = iucv_param_irq[cpu]; + memset(parm, 0, sizeof(union iucv_param)); + parm->set_mask.ipmask = 0xf8; + iucv_call_b2f0(IUCV_SETMASK, parm); +@@ -379,7 +380,7 @@ + union iucv_param *parm; + + /* Disable all iucv interrupts. */ +- parm = iucv_param[cpu]; ++ parm = iucv_param_irq[cpu]; + memset(parm, 0, sizeof(union iucv_param)); + iucv_call_b2f0(IUCV_SETMASK, parm); + +@@ -403,7 +404,7 @@ + return; + + /* Declare interrupt buffer. */ +- parm = iucv_param[cpu]; ++ parm = iucv_param_irq[cpu]; + memset(parm, 0, sizeof(union iucv_param)); + parm->db.ipbfadr1 = virt_to_phys(iucv_irq_data[cpu]); + rc = iucv_call_b2f0(IUCV_DECLARE_BUFFER, parm); +@@ -460,7 +461,7 @@ + iucv_block_cpu(NULL); + + /* Retrieve interrupt buffer. */ +- parm = iucv_param[cpu]; ++ parm = iucv_param_irq[cpu]; + iucv_call_b2f0(IUCV_RETRIEVE_BUFFER, parm); + + /* Clear indication that an iucv buffer exists for this cpu. */ +@@ -574,11 +575,22 @@ + iucv_irq_data[cpu] = NULL; + return NOTIFY_BAD; + } ++ iucv_param_irq[cpu] = kmalloc_node(sizeof(union iucv_param), ++ GFP_KERNEL|GFP_DMA, cpu_to_node(cpu)); ++ if (!iucv_param_irq[cpu]) { ++ kfree(iucv_param[cpu]); ++ iucv_param[cpu] = NULL; ++ kfree(iucv_irq_data[cpu]); ++ iucv_irq_data[cpu] = NULL; ++ return NOTIFY_BAD; ++ } + break; + case CPU_UP_CANCELED: + case CPU_UP_CANCELED_FROZEN: + case CPU_DEAD: + case CPU_DEAD_FROZEN: ++ kfree(iucv_param_irq[cpu]); ++ iucv_param_irq[cpu] = NULL; + kfree(iucv_param[cpu]); + iucv_param[cpu] = NULL; + kfree(iucv_irq_data[cpu]); +@@ -625,7 +637,7 @@ + { + union iucv_param *parm; + +- parm = iucv_param[smp_processor_id()]; ++ parm = iucv_param_irq[smp_processor_id()]; + memset(parm, 0, sizeof(union iucv_param)); + if (userdata) + memcpy(parm->ctrl.ipuser, userdata, sizeof(parm->ctrl.ipuser)); +@@ -918,10 +930,8 @@ + if (iucv_active_cpu != smp_processor_id()) + spin_lock_bh(&iucv_table_lock); + rc = iucv_sever_pathid(path->pathid, userdata); +- if (!rc) { +- iucv_path_table[path->pathid] = NULL; +- list_del_init(&path->list); +- } ++ iucv_path_table[path->pathid] = NULL; ++ list_del_init(&path->list); + if (iucv_active_cpu != smp_processor_id()) + spin_unlock_bh(&iucv_table_lock); + preempt_enable(); +@@ -1333,7 +1343,7 @@ + else { + iucv_sever_pathid(path->pathid, NULL); + iucv_path_table[path->pathid] = NULL; +- list_del_init(&path->list); ++ list_del(&path->list); + iucv_path_free(path); + } + } +@@ -1637,6 +1647,13 @@ + rc = -ENOMEM; + goto out_free; + } ++ iucv_param_irq[cpu] = kmalloc_node(sizeof(union iucv_param), ++ GFP_KERNEL|GFP_DMA, cpu_to_node(cpu)); ++ if (!iucv_param_irq[cpu]) { ++ rc = -ENOMEM; ++ goto out_free; ++ } ++ + } + rc = register_hotcpu_notifier(&iucv_cpu_notifier); + if (rc) +@@ -1654,6 +1671,8 @@ + unregister_hotcpu_notifier(&iucv_cpu_notifier); + out_free: + for_each_possible_cpu(cpu) { ++ kfree(iucv_param_irq[cpu]); ++ iucv_param_irq[cpu] = NULL; + kfree(iucv_param[cpu]); + iucv_param[cpu] = NULL; + kfree(iucv_irq_data[cpu]); +@@ -1684,6 +1703,8 @@ + spin_unlock_irq(&iucv_queue_lock); + unregister_hotcpu_notifier(&iucv_cpu_notifier); + for_each_possible_cpu(cpu) { ++ kfree(iucv_param_irq[cpu]); ++ iucv_param_irq[cpu] = NULL; + kfree(iucv_param[cpu]); + iucv_param[cpu] = NULL; + kfree(iucv_irq_data[cpu]); +diff -urN linux-2.6.27.19-5.1/net/mac80211/rc80211_pid_algo.c linux-2.6.27.23-0.1.1/net/mac80211/rc80211_pid_algo.c +--- linux-2.6.27.19-5.1/net/mac80211/rc80211_pid_algo.c 2009-06-16 13:53:17.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/net/mac80211/rc80211_pid_algo.c 2009-06-16 13:39:43.000000000 +0100 +@@ -367,8 +367,40 @@ + * Until that method is implemented, we will use the lowest supported + * rate as a workaround. */ + struct ieee80211_supported_band *sband; ++ struct rc_pid_info *pinfo = priv; ++ struct rc_pid_rateinfo *rinfo = pinfo->rinfo; ++ int i, j, tmp; ++ bool s; + + sband = local->hw.wiphy->bands[local->hw.conf.channel->band]; ++ ++ /* Sort the rates. This is optimized for the most common case (i.e. ++ * almost-sorted CCK+OFDM rates). Kind of bubble-sort with reversed ++ * mapping too. */ ++ for (i = 0; i < sband->n_bitrates; i++) { ++ rinfo[i].index = i; ++ rinfo[i].rev_index = i; ++ if (RC_PID_FAST_START) ++ rinfo[i].diff = 0; ++ else ++ rinfo[i].diff = i * pinfo->norm_offset; ++ } ++ for (i = 1; i < sband->n_bitrates; i++) { ++ s = 0; ++ for (j = 0; j < sband->n_bitrates - i; j++) ++ if (unlikely(sband->bitrates[rinfo[j].index].bitrate > ++ sband->bitrates[rinfo[j + 1].index].bitrate)) { ++ tmp = rinfo[j].index; ++ rinfo[j].index = rinfo[j + 1].index; ++ rinfo[j + 1].index = tmp; ++ rinfo[rinfo[j].index].rev_index = j; ++ rinfo[rinfo[j + 1].index].rev_index = j + 1; ++ s = 1; ++ } ++ if (!s) ++ break; ++ } ++ + sta->txrate_idx = rate_lowest_index(local, sband, sta); + sta->fail_avg = 0; + } +@@ -378,21 +410,23 @@ + struct rc_pid_info *pinfo; + struct rc_pid_rateinfo *rinfo; + struct ieee80211_supported_band *sband; +- int i, j, tmp; +- bool s; ++ int i, max_rates = 0; + #ifdef CONFIG_MAC80211_DEBUGFS + struct rc_pid_debugfs_entries *de; + #endif + +- sband = local->hw.wiphy->bands[local->hw.conf.channel->band]; +- + pinfo = kmalloc(sizeof(*pinfo), GFP_ATOMIC); + if (!pinfo) + return NULL; + ++ for (i = 0; i < IEEE80211_NUM_BANDS; i++) { ++ sband = local->hw.wiphy->bands[i]; ++ if (sband && sband->n_bitrates > max_rates) ++ max_rates = sband->n_bitrates; ++ } + /* We can safely assume that sband won't change unless we get + * reinitialized. */ +- rinfo = kmalloc(sizeof(*rinfo) * sband->n_bitrates, GFP_ATOMIC); ++ rinfo = kmalloc(sizeof(*rinfo) * max_rates, GFP_ATOMIC); + if (!rinfo) { + kfree(pinfo); + return NULL; +@@ -410,33 +444,6 @@ + pinfo->rinfo = rinfo; + pinfo->oldrate = 0; + +- /* Sort the rates. This is optimized for the most common case (i.e. +- * almost-sorted CCK+OFDM rates). Kind of bubble-sort with reversed +- * mapping too. */ +- for (i = 0; i < sband->n_bitrates; i++) { +- rinfo[i].index = i; +- rinfo[i].rev_index = i; +- if (RC_PID_FAST_START) +- rinfo[i].diff = 0; +- else +- rinfo[i].diff = i * pinfo->norm_offset; +- } +- for (i = 1; i < sband->n_bitrates; i++) { +- s = 0; +- for (j = 0; j < sband->n_bitrates - i; j++) +- if (unlikely(sband->bitrates[rinfo[j].index].bitrate > +- sband->bitrates[rinfo[j + 1].index].bitrate)) { +- tmp = rinfo[j].index; +- rinfo[j].index = rinfo[j + 1].index; +- rinfo[j + 1].index = tmp; +- rinfo[rinfo[j].index].rev_index = j; +- rinfo[rinfo[j + 1].index].rev_index = j + 1; +- s = 1; +- } +- if (!s) +- break; +- } +- + #ifdef CONFIG_MAC80211_DEBUGFS + de = &pinfo->dentries; + de->dir = debugfs_create_dir("rc80211_pid", +diff -urN linux-2.6.27.19-5.1/net/netfilter/nf_conntrack_proto_tcp.c linux-2.6.27.23-0.1.1/net/netfilter/nf_conntrack_proto_tcp.c +--- linux-2.6.27.19-5.1/net/netfilter/nf_conntrack_proto_tcp.c 2009-06-16 13:53:17.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/net/netfilter/nf_conntrack_proto_tcp.c 2009-06-16 13:39:43.000000000 +0100 +@@ -15,6 +15,7 @@ + #include + #include + #include ++#include + + #include + +@@ -466,7 +467,7 @@ + for (i = 0; + i < (opsize - TCPOLEN_SACK_BASE); + i += TCPOLEN_SACK_PERBLOCK) { +- tmp = ntohl(*((__be32 *)(ptr+i)+1)); ++ tmp = get_unaligned_be32((__be32 *)(ptr+i)+1); + + if (after(tmp, *sack)) + *sack = tmp; +diff -urN linux-2.6.27.19-5.1/net/netfilter/nf_conntrack_slp.c linux-2.6.27.23-0.1.1/net/netfilter/nf_conntrack_slp.c +--- linux-2.6.27.19-5.1/net/netfilter/nf_conntrack_slp.c 2009-06-16 13:53:17.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/net/netfilter/nf_conntrack_slp.c 2009-06-16 13:39:43.000000000 +0100 +@@ -47,7 +47,6 @@ + struct nf_conn *ct, enum ip_conntrack_info ctinfo) + { + struct nf_conntrack_expect *exp; +- struct iphdr *iph = ip_hdr(skb); + struct rtable *rt = skb->rtable; + struct in_device *in_dev; + __be32 mask = 0; +diff -urN linux-2.6.27.19-5.1/net/netrom/af_netrom.c linux-2.6.27.23-0.1.1/net/netrom/af_netrom.c +--- linux-2.6.27.19-5.1/net/netrom/af_netrom.c 2009-06-16 13:53:17.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/net/netrom/af_netrom.c 2009-06-16 13:39:43.000000000 +0100 +@@ -1082,7 +1082,13 @@ + + SOCK_DEBUG(sk, "NET/ROM: sendto: Addresses built.\n"); + +- /* Build a packet */ ++ /* Build a packet - the conventional user limit is 236 bytes. We can ++ do ludicrously large NetROM frames but must not overflow */ ++ if (len > 65536) { ++ err = -EMSGSIZE; ++ goto out; ++ } ++ + SOCK_DEBUG(sk, "NET/ROM: sendto: building packet.\n"); + size = len + NR_NETWORK_LEN + NR_TRANSPORT_LEN; + +diff -urN linux-2.6.27.19-5.1/net/rose/af_rose.c linux-2.6.27.23-0.1.1/net/rose/af_rose.c +--- linux-2.6.27.19-5.1/net/rose/af_rose.c 2009-06-16 13:53:17.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/net/rose/af_rose.c 2009-06-16 13:39:42.000000000 +0100 +@@ -1120,6 +1120,10 @@ + + /* Build a packet */ + SOCK_DEBUG(sk, "ROSE: sendto: building packet.\n"); ++ /* Sanity check the packet size */ ++ if (len > 65535) ++ return -EMSGSIZE; ++ + size = len + AX25_BPQ_HEADER_LEN + AX25_MAX_HEADER_LEN + ROSE_MIN_LEN; + + if ((skb = sock_alloc_send_skb(sk, size, msg->msg_flags & MSG_DONTWAIT, &err)) == NULL) +diff -urN linux-2.6.27.19-5.1/net/sctp/endpointola.c linux-2.6.27.23-0.1.1/net/sctp/endpointola.c +--- linux-2.6.27.19-5.1/net/sctp/endpointola.c 2009-06-16 13:53:17.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/net/sctp/endpointola.c 2009-06-16 13:39:42.000000000 +0100 +@@ -111,7 +111,8 @@ + if (sctp_addip_enable) { + auth_chunks->chunks[0] = SCTP_CID_ASCONF; + auth_chunks->chunks[1] = SCTP_CID_ASCONF_ACK; +- auth_chunks->param_hdr.length += htons(2); ++ auth_chunks->param_hdr.length = ++ htons(sizeof(sctp_paramhdr_t) + 2); + } + } + +diff -urN linux-2.6.27.19-5.1/net/sunrpc/xprtsock.c linux-2.6.27.23-0.1.1/net/sunrpc/xprtsock.c +--- linux-2.6.27.19-5.1/net/sunrpc/xprtsock.c 2009-06-16 13:53:17.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/net/sunrpc/xprtsock.c 2009-06-16 13:39:43.000000000 +0100 +@@ -469,7 +469,7 @@ + int err, sent = 0; + + if (unlikely(!sock)) +- return -ENOTCONN; ++ return -ENOTSOCK; + + clear_bit(SOCK_ASYNC_NOSPACE, &sock->flags); + if (base != 0) { +@@ -596,6 +596,10 @@ + } + + switch (status) { ++ case -ENOTSOCK: ++ status = -ENOTCONN; ++ /* Should we call xs_close() here? */ ++ break; + case -EAGAIN: + xs_nospace(task); + break; +@@ -695,6 +699,10 @@ + } + + switch (status) { ++ case -ENOTSOCK: ++ status = -ENOTCONN; ++ /* Should we call xs_close() here? */ ++ break; + case -EAGAIN: + xs_nospace(task); + break; +diff -urN linux-2.6.27.19-5.1/net/x25/af_x25.c linux-2.6.27.23-0.1.1/net/x25/af_x25.c +--- linux-2.6.27.19-5.1/net/x25/af_x25.c 2009-06-16 13:53:16.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/net/x25/af_x25.c 2009-06-16 13:39:42.000000000 +0100 +@@ -1037,6 +1037,12 @@ + sx25.sx25_addr = x25->dest_addr; + } + ++ /* Sanity check the packet size */ ++ if (len > 65535) { ++ rc = -EMSGSIZE; ++ goto out; ++ } ++ + SOCK_DEBUG(sk, "x25_sendmsg: sendto: Addresses built.\n"); + + /* Build a packet */ +diff -urN linux-2.6.27.19-5.1/scripts/mod/modpost.c linux-2.6.27.23-0.1.1/scripts/mod/modpost.c +--- linux-2.6.27.19-5.1/scripts/mod/modpost.c 2009-06-16 13:54:10.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/scripts/mod/modpost.c 2009-06-16 13:40:23.000000000 +0100 +@@ -2062,6 +2062,7 @@ + if (!mod->skip) + add_marker(mod, marker, fmt); + } ++ release_file(file, size); + return; + fail: + fatal("parse error in markers list file\n"); +diff -urN linux-2.6.27.19-5.1/security/selinux/hooks.c linux-2.6.27.23-0.1.1/security/selinux/hooks.c +--- linux-2.6.27.19-5.1/security/selinux/hooks.c 2009-06-16 13:55:01.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/security/selinux/hooks.c 2009-06-16 13:41:02.000000000 +0100 +@@ -4465,6 +4465,7 @@ + if (err) + return err; + err = avc_has_perm(sk_sid, if_sid, SECCLASS_NETIF, netif_perm, ad); ++ if (err) + return err; + + err = sel_netnode_sid(addrp, family, &node_sid); +diff -urN linux-2.6.27.19-5.1/security/selinux/netlabel.c linux-2.6.27.23-0.1.1/security/selinux/netlabel.c +--- linux-2.6.27.19-5.1/security/selinux/netlabel.c 2009-06-16 13:55:01.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/security/selinux/netlabel.c 2009-06-16 13:41:02.000000000 +0100 +@@ -236,11 +236,12 @@ + if (!S_ISSOCK(inode->i_mode) || + ((mask & (MAY_WRITE | MAY_APPEND)) == 0)) + return 0; +- + sock = SOCKET_I(inode); + sk = sock->sk; ++ if (sk == NULL) ++ return 0; + sksec = sk->sk_security; +- if (sksec->nlbl_state != NLBL_REQUIRE) ++ if (sksec == NULL || sksec->nlbl_state != NLBL_REQUIRE) + return 0; + + local_bh_disable(); +@@ -339,8 +340,10 @@ + lock_sock(sk); + rc = netlbl_sock_getattr(sk, &secattr); + release_sock(sk); +- if (rc == 0 && secattr.flags != NETLBL_SECATTR_NONE) ++ if (rc == 0) + rc = -EACCES; ++ else if (rc == -ENOMSG) ++ rc = 0; + netlbl_secattr_destroy(&secattr); + } + +diff -urN linux-2.6.27.19-5.1/security/smack/smack_lsm.c linux-2.6.27.23-0.1.1/security/smack/smack_lsm.c +--- linux-2.6.27.19-5.1/security/smack/smack_lsm.c 2009-06-16 13:55:01.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/security/smack/smack_lsm.c 2009-06-16 13:41:02.000000000 +0100 +@@ -617,6 +617,8 @@ + strcmp(name, XATTR_NAME_SMACKIPOUT) == 0) { + if (!capable(CAP_MAC_ADMIN)) + rc = -EPERM; ++ if (size == 0) ++ rc = -EINVAL; + } else + rc = cap_inode_setxattr(dentry, mnt, name, value, size, flags, + file); +@@ -1382,7 +1384,7 @@ + struct socket *sock; + int rc = 0; + +- if (value == NULL || size > SMK_LABELLEN) ++ if (value == NULL || size > SMK_LABELLEN || size == 0) + return -EACCES; + + sp = smk_import(value, size); +diff -urN linux-2.6.27.19-5.1/sound/core/oss/pcm_oss.c linux-2.6.27.23-0.1.1/sound/core/oss/pcm_oss.c +--- linux-2.6.27.19-5.1/sound/core/oss/pcm_oss.c 2009-06-16 13:54:10.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/sound/core/oss/pcm_oss.c 2009-06-16 13:40:23.000000000 +0100 +@@ -2854,7 +2854,7 @@ + setup = kmalloc(sizeof(*setup), GFP_KERNEL); + if (! setup) { + buffer->error = -ENOMEM; +- mutex_lock(&pstr->oss.setup_mutex); ++ mutex_unlock(&pstr->oss.setup_mutex); + return; + } + if (pstr->oss.setup_list == NULL) +@@ -2868,7 +2868,7 @@ + if (! template.task_name) { + kfree(setup); + buffer->error = -ENOMEM; +- mutex_lock(&pstr->oss.setup_mutex); ++ mutex_unlock(&pstr->oss.setup_mutex); + return; + } + } +diff -urN linux-2.6.27.19-5.1/sound/core/oss/rate.c linux-2.6.27.23-0.1.1/sound/core/oss/rate.c +--- linux-2.6.27.19-5.1/sound/core/oss/rate.c 2009-06-16 13:54:10.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/sound/core/oss/rate.c 2009-06-16 13:40:23.000000000 +0100 +@@ -157,7 +157,7 @@ + while (dst_frames1 > 0) { + S1 = S2; + if (src_frames1-- > 0) { +- S1 = *src; ++ S2 = *src; + src += src_step; + } + if (pos & ~R_MASK) { +diff -urN linux-2.6.27.19-5.1/sound/core/sgbuf.c linux-2.6.27.23-0.1.1/sound/core/sgbuf.c +--- linux-2.6.27.19-5.1/sound/core/sgbuf.c 2009-06-16 13:54:10.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/sound/core/sgbuf.c 2009-06-16 13:40:23.000000000 +0100 +@@ -38,6 +38,10 @@ + if (! sgbuf) + return -EINVAL; + ++ if (dmab->area) ++ vunmap(dmab->area); ++ dmab->area = NULL; ++ + tmpb.dev.type = SNDRV_DMA_TYPE_DEV; + tmpb.dev.dev = sgbuf->dev; + for (i = 0; i < sgbuf->pages; i++) { +@@ -46,9 +50,6 @@ + tmpb.bytes = PAGE_SIZE; + snd_dma_free_pages(&tmpb); + } +- if (dmab->area) +- vunmap(dmab->area); +- dmab->area = NULL; + + kfree(sgbuf->table); + kfree(sgbuf->page_table); +diff -urN linux-2.6.27.19-5.1/sound/pci/aw2/aw2-alsa.c linux-2.6.27.23-0.1.1/sound/pci/aw2/aw2-alsa.c +--- linux-2.6.27.19-5.1/sound/pci/aw2/aw2-alsa.c 2009-06-16 13:54:10.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/sound/pci/aw2/aw2-alsa.c 2009-06-16 13:40:23.000000000 +0100 +@@ -165,7 +165,7 @@ + MODULE_PARM_DESC(enable, "Enable Audiowerk2 soundcard."); + + static struct pci_device_id snd_aw2_ids[] = { +- {PCI_VENDOR_ID_SAA7146, PCI_DEVICE_ID_SAA7146, PCI_ANY_ID, PCI_ANY_ID, ++ {PCI_VENDOR_ID_SAA7146, PCI_DEVICE_ID_SAA7146, 0, 0, + 0, 0, 0}, + {0} + }; +diff -urN linux-2.6.27.19-5.1/sound/pci/hda/hda_beep.c linux-2.6.27.23-0.1.1/sound/pci/hda/hda_beep.c +--- linux-2.6.27.19-5.1/sound/pci/hda/hda_beep.c 2009-06-16 13:54:10.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/sound/pci/hda/hda_beep.c 2009-06-16 13:40:23.000000000 +0100 +@@ -134,7 +134,6 @@ + struct hda_beep *beep = codec->beep; + if (beep) { + cancel_work_sync(&beep->beep_work); +- flush_scheduled_work(); + + input_unregister_device(beep->dev); + kfree(beep); +diff -urN linux-2.6.27.19-5.1/sound/pci/hda/hda_codec.c linux-2.6.27.23-0.1.1/sound/pci/hda/hda_codec.c +--- linux-2.6.27.19-5.1/sound/pci/hda/hda_codec.c 2009-06-16 13:54:10.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/sound/pci/hda/hda_codec.c 2009-06-16 13:40:23.000000000 +0100 +@@ -107,6 +107,23 @@ + static inline void hda_keep_power_on(struct hda_codec *codec) {} + #endif + ++/* ++ * Compose a 32bit command word to be sent to the HD-audio controller ++ */ ++static inline unsigned int ++make_codec_cmd(struct hda_codec *codec, hda_nid_t nid, int direct, ++ unsigned int verb, unsigned int parm) ++{ ++ u32 val; ++ ++ val = (u32)(codec->addr & 0x0f) << 28; ++ val |= (u32)direct << 27; ++ val |= (u32)nid << 20; ++ val |= verb << 8; ++ val |= parm; ++ return val; ++} ++ + /** + * snd_hda_codec_read - send a command and get the response + * @codec: the HDA codec +@@ -123,14 +140,26 @@ + int direct, + unsigned int verb, unsigned int parm) + { +- unsigned int res; ++ struct hda_bus *bus = codec->bus; ++ unsigned int cmd, res; ++ int repeated = 0; ++ ++ cmd = make_codec_cmd(codec, nid, direct, verb, parm); + snd_hda_power_up(codec); +- mutex_lock(&codec->bus->cmd_mutex); +- if (!codec->bus->ops.command(codec, nid, direct, verb, parm)) +- res = codec->bus->ops.get_response(codec); +- else ++ mutex_lock(&bus->cmd_mutex); ++ again: ++ if (!bus->ops.command(bus, cmd)) { ++ res = bus->ops.get_response(bus); ++ if (res == -1 && bus->rirb_error) { ++ if (repeated++ < 1) { ++ snd_printd(KERN_WARNING "hda_codec: " ++ "Trying verb 0x%08x again\n", cmd); ++ goto again; ++ } ++ } ++ } else + res = (unsigned int)-1; +- mutex_unlock(&codec->bus->cmd_mutex); ++ mutex_unlock(&bus->cmd_mutex); + snd_hda_power_down(codec); + return res; + } +@@ -150,11 +179,15 @@ + int snd_hda_codec_write(struct hda_codec *codec, hda_nid_t nid, int direct, + unsigned int verb, unsigned int parm) + { ++ struct hda_bus *bus = codec->bus; ++ unsigned int res; + int err; ++ ++ res = make_codec_cmd(codec, nid, direct, verb, parm); + snd_hda_power_up(codec); +- mutex_lock(&codec->bus->cmd_mutex); +- err = codec->bus->ops.command(codec, nid, direct, verb, parm); +- mutex_unlock(&codec->bus->cmd_mutex); ++ mutex_lock(&bus->cmd_mutex); ++ err = bus->ops.command(bus, res); ++ mutex_unlock(&bus->cmd_mutex); + snd_hda_power_down(codec); + return err; + } +@@ -310,7 +343,7 @@ + unsol->queue[wp] = res; + unsol->queue[wp + 1] = res_ex; + +- schedule_work(&unsol->work); ++ queue_work(bus->workq, &unsol->work); + + return 0; + } +@@ -373,15 +406,17 @@ + + if (!bus) + return 0; +- if (bus->unsol) { +- flush_scheduled_work(); ++ if (bus->workq) ++ flush_workqueue(bus->workq); ++ if (bus->unsol) + kfree(bus->unsol); +- } + list_for_each_entry_safe(codec, n, &bus->codec_list, list) { + snd_hda_codec_free(codec); + } + if (bus->ops.private_free) + bus->ops.private_free(bus); ++ if (bus->workq) ++ destroy_workqueue(bus->workq); + kfree(bus); + return 0; + } +@@ -431,6 +466,16 @@ + mutex_init(&bus->cmd_mutex); + INIT_LIST_HEAD(&bus->codec_list); + ++ snprintf(bus->workq_name, sizeof(bus->workq_name), ++ "hd-audio%d", card->number); ++ bus->workq = create_singlethread_workqueue(bus->workq_name); ++ if (!bus->workq) { ++ snd_printk(KERN_ERR "cannot create workqueue %s\n", ++ bus->workq_name); ++ kfree(bus); ++ return -ENOMEM; ++ } ++ + err = snd_device_new(card, SNDRV_DEV_BUS, bus, &dev_ops); + if (err < 0) { + snd_hda_bus_free(bus); +@@ -564,7 +609,7 @@ + return; + #ifdef CONFIG_SND_HDA_POWER_SAVE + cancel_delayed_work(&codec->power_work); +- flush_scheduled_work(); ++ flush_workqueue(codec->bus->workq); + #endif + list_del(&codec->list); + codec->bus->caddr_tbl[codec->addr] = NULL; +@@ -1784,10 +1829,14 @@ + int snd_hda_codec_write_cache(struct hda_codec *codec, hda_nid_t nid, + int direct, unsigned int verb, unsigned int parm) + { ++ struct hda_bus *bus = codec->bus; ++ unsigned int res; + int err; ++ ++ res = make_codec_cmd(codec, nid, direct, verb, parm); + snd_hda_power_up(codec); +- mutex_lock(&codec->bus->cmd_mutex); +- err = codec->bus->ops.command(codec, nid, direct, verb, parm); ++ mutex_lock(&bus->cmd_mutex); ++ err = bus->ops.command(bus, res); + if (!err) { + struct hda_cache_head *c; + u32 key = build_cmd_cache_key(nid, verb); +@@ -1795,7 +1844,7 @@ + if (c) + c->val = parm; + } +- mutex_unlock(&codec->bus->cmd_mutex); ++ mutex_unlock(&bus->cmd_mutex); + snd_hda_power_down(codec); + return err; + } +@@ -2495,6 +2544,7 @@ + { + struct hda_codec *codec = + container_of(work, struct hda_codec, power_work.work); ++ struct hda_bus *bus = codec->bus; + + if (!codec->power_on || codec->power_count) { + codec->power_transition = 0; +@@ -2502,8 +2552,8 @@ + } + + hda_call_codec_suspend(codec); +- if (codec->bus->ops.pm_notify) +- codec->bus->ops.pm_notify(codec); ++ if (bus->ops.pm_notify) ++ bus->ops.pm_notify(bus); + } + + static void hda_keep_power_on(struct hda_codec *codec) +@@ -2514,13 +2564,15 @@ + + void snd_hda_power_up(struct hda_codec *codec) + { ++ struct hda_bus *bus = codec->bus; ++ + codec->power_count++; + if (codec->power_on || codec->power_transition) + return; + + codec->power_on = 1; +- if (codec->bus->ops.pm_notify) +- codec->bus->ops.pm_notify(codec); ++ if (bus->ops.pm_notify) ++ bus->ops.pm_notify(bus); + hda_call_codec_resume(codec); + cancel_delayed_work(&codec->power_work); + codec->power_transition = 0; +@@ -2533,7 +2585,7 @@ + return; + if (power_save) { + codec->power_transition = 1; /* avoid reentrance */ +- schedule_delayed_work(&codec->power_work, ++ queue_delayed_work(codec->bus->workq, &codec->power_work, + msecs_to_jiffies(power_save * 1000)); + } + } +diff -urN linux-2.6.27.19-5.1/sound/pci/hda/hda_codec.h linux-2.6.27.23-0.1.1/sound/pci/hda/hda_codec.h +--- linux-2.6.27.19-5.1/sound/pci/hda/hda_codec.h 2009-06-16 13:54:10.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/sound/pci/hda/hda_codec.h 2009-06-16 13:40:23.000000000 +0100 +@@ -536,15 +536,14 @@ + /* bus operators */ + struct hda_bus_ops { + /* send a single command */ +- int (*command)(struct hda_codec *codec, hda_nid_t nid, int direct, +- unsigned int verb, unsigned int parm); ++ int (*command)(struct hda_bus *bus, unsigned int cmd); + /* get a response from the last command */ +- unsigned int (*get_response)(struct hda_codec *codec); ++ unsigned int (*get_response)(struct hda_bus *bus); + /* free the private data */ + void (*private_free)(struct hda_bus *); + #ifdef CONFIG_SND_HDA_POWER_SAVE + /* notify power-up/down from codec to controller */ +- void (*pm_notify)(struct hda_codec *codec); ++ void (*pm_notify)(struct hda_bus *bus); + #endif + }; + +@@ -580,11 +579,14 @@ + + /* unsolicited event queue */ + struct hda_bus_unsolicited *unsol; ++ char workq_name[16]; ++ struct workqueue_struct *workq; /* common workqueue for codecs */ + + struct snd_info_entry *proc; + + /* misc op flags */ + unsigned int needs_damn_long_delay :1; ++ unsigned int rirb_error:1; /* error in codec communication */ + }; + + /* +diff -urN linux-2.6.27.19-5.1/sound/pci/hda/hda_intel.c linux-2.6.27.23-0.1.1/sound/pci/hda/hda_intel.c +--- linux-2.6.27.19-5.1/sound/pci/hda/hda_intel.c 2009-06-16 13:54:10.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/sound/pci/hda/hda_intel.c 2009-06-16 13:40:23.000000000 +0100 +@@ -304,6 +304,9 @@ + unsigned int period_bytes; /* size of the period in bytes */ + unsigned int frags; /* number for period in the play buffer */ + unsigned int fifo_size; /* FIFO size */ ++ unsigned int start_flag: 1; /* stream full start flag */ ++ unsigned long start_jiffies; /* start + minimum jiffies */ ++ unsigned long min_jiffies; /* minimum jiffies before position is valid */ + + void __iomem *sd_addr; /* stream descriptor pointer */ + +@@ -322,7 +325,6 @@ + unsigned int opened :1; + unsigned int running :1; + unsigned int irq_pending :1; +- unsigned int irq_ignore :1; + /* + * For VIA: + * A flag to ensure DMA position is 0 +@@ -373,6 +375,7 @@ + + /* HD codec */ + unsigned short codec_mask; ++ int codec_probe_mask; /* copied from probe_mask option */ + struct hda_bus *bus; + + /* CORB/RIRB */ +@@ -392,6 +395,7 @@ + unsigned int msi :1; + unsigned int irq_pending_warned :1; + unsigned int via_dmapos_patch :1; /* enable DMA-position fix for VIA */ ++ unsigned int probing :1; /* codec probing phase */ + + /* for debugging */ + unsigned int last_cmd; /* last issued command (to sync) */ +@@ -527,9 +531,9 @@ + } + + /* send a command */ +-static int azx_corb_send_cmd(struct hda_codec *codec, u32 val) ++static int azx_corb_send_cmd(struct hda_bus *bus, u32 val) + { +- struct azx *chip = codec->bus->private_data; ++ struct azx *chip = bus->private_data; + unsigned int wp; + + /* add command to corb */ +@@ -577,9 +581,9 @@ + } + + /* receive a response */ +-static unsigned int azx_rirb_get_response(struct hda_codec *codec) ++static unsigned int azx_rirb_get_response(struct hda_bus *bus) + { +- struct azx *chip = codec->bus->private_data; ++ struct azx *chip = bus->private_data; + unsigned long timeout; + + again: +@@ -592,11 +596,12 @@ + } + if (!chip->rirb.cmds) { + smp_rmb(); ++ bus->rirb_error = 0; + return chip->rirb.res; /* the last value */ + } + if (time_after(jiffies, timeout)) + break; +- if (codec->bus->needs_damn_long_delay) ++ if (bus->needs_damn_long_delay) + msleep(2); /* temporary workaround */ + else { + udelay(10); +@@ -611,8 +616,10 @@ + chip->irq = -1; + pci_disable_msi(chip->pci); + chip->msi = 0; +- if (azx_acquire_irq(chip, 1) < 0) ++ if (azx_acquire_irq(chip, 1) < 0) { ++ bus->rirb_error = 1; + return -1; ++ } + goto again; + } + +@@ -624,14 +631,20 @@ + goto again; + } + +- snd_printk(KERN_ERR "hda_intel: azx_get_response timeout, " +- "switching to single_cmd mode: last cmd=0x%08x\n", +- chip->last_cmd); +- chip->rirb.rp = azx_readb(chip, RIRBWP); +- chip->rirb.cmds = 0; +- /* switch to single_cmd mode */ +- chip->single_cmd = 1; +- azx_free_cmd_io(chip); ++ if (chip->probing) { ++ /* If this critical timeout happens during the codec probing ++ * phase, this is likely an access to a non-existing codec ++ * slot. Better to return an error and reset the system. ++ */ ++ return -1; ++ } ++ ++ snd_printk(KERN_ERR "hda_intel: azx_get_response timeout (ERROR): " ++ "last cmd=0x%08x\n", chip->last_cmd); ++ spin_lock_irq(&chip->reg_lock); ++ chip->rirb.cmds = 0; /* reset the index */ ++ bus->rirb_error = 1; ++ spin_unlock_irq(&chip->reg_lock); + return -1; + } + +@@ -646,9 +659,9 @@ + */ + + /* send a command */ +-static int azx_single_send_cmd(struct hda_codec *codec, u32 val) ++static int azx_single_send_cmd(struct hda_bus *bus, u32 val) + { +- struct azx *chip = codec->bus->private_data; ++ struct azx *chip = bus->private_data; + int timeout = 50; + + while (timeout--) { +@@ -671,9 +684,9 @@ + } + + /* receive a response */ +-static unsigned int azx_single_get_response(struct hda_codec *codec) ++static unsigned int azx_single_get_response(struct hda_bus *bus) + { +- struct azx *chip = codec->bus->private_data; ++ struct azx *chip = bus->private_data; + int timeout = 50; + + while (timeout--) { +@@ -696,38 +709,29 @@ + */ + + /* send a command */ +-static int azx_send_cmd(struct hda_codec *codec, hda_nid_t nid, +- int direct, unsigned int verb, +- unsigned int para) +-{ +- struct azx *chip = codec->bus->private_data; +- u32 val; +- +- val = (u32)(codec->addr & 0x0f) << 28; +- val |= (u32)direct << 27; +- val |= (u32)nid << 20; +- val |= verb << 8; +- val |= para; +- chip->last_cmd = val; ++static int azx_send_cmd(struct hda_bus *bus, unsigned int val) ++{ ++ struct azx *chip = bus->private_data; + ++ chip->last_cmd = val; + if (chip->single_cmd) +- return azx_single_send_cmd(codec, val); ++ return azx_single_send_cmd(bus, val); + else +- return azx_corb_send_cmd(codec, val); ++ return azx_corb_send_cmd(bus, val); + } + + /* get a response */ +-static unsigned int azx_get_response(struct hda_codec *codec) ++static unsigned int azx_get_response(struct hda_bus *bus) + { +- struct azx *chip = codec->bus->private_data; ++ struct azx *chip = bus->private_data; + if (chip->single_cmd) +- return azx_single_get_response(codec); ++ return azx_single_get_response(bus); + else +- return azx_rirb_get_response(codec); ++ return azx_rirb_get_response(bus); + } + + #ifdef CONFIG_SND_HDA_POWER_SAVE +-static void azx_power_notify(struct hda_codec *codec); ++static void azx_power_notify(struct hda_bus *bus); + #endif + + /* reset codec link */ +@@ -848,13 +852,18 @@ + SD_CTL_DMA_START | SD_INT_MASK); + } + +-/* stop a stream */ +-static void azx_stream_stop(struct azx *chip, struct azx_dev *azx_dev) ++/* stop DMA */ ++static void azx_stream_clear(struct azx *chip, struct azx_dev *azx_dev) + { +- /* stop DMA */ + azx_sd_writeb(azx_dev, SD_CTL, azx_sd_readb(azx_dev, SD_CTL) & + ~(SD_CTL_DMA_START | SD_INT_MASK)); + azx_sd_writeb(azx_dev, SD_STS, SD_INT_MASK); /* to be sure */ ++} ++ ++/* stop a stream */ ++static void azx_stream_stop(struct azx *chip, struct azx_dev *azx_dev) ++{ ++ azx_stream_clear(chip, azx_dev); + /* disable SIE */ + azx_writeb(chip, INTCTL, + azx_readb(chip, INTCTL) & ~(1 << azx_dev->index)); +@@ -959,7 +968,7 @@ + struct azx *chip = dev_id; + struct azx_dev *azx_dev; + u32 status; +- int i; ++ int i, ok; + + spin_lock(&chip->reg_lock); + +@@ -975,21 +984,18 @@ + azx_sd_writeb(azx_dev, SD_STS, SD_INT_MASK); + if (!azx_dev->substream || !azx_dev->running) + continue; +- /* ignore the first dummy IRQ (due to pos_adj) */ +- if (azx_dev->irq_ignore) { +- azx_dev->irq_ignore = 0; +- continue; +- } + /* check whether this IRQ is really acceptable */ +- if (azx_position_ok(chip, azx_dev)) { ++ ok = azx_position_ok(chip, azx_dev); ++ if (ok == 1) { + azx_dev->irq_pending = 0; + spin_unlock(&chip->reg_lock); + snd_pcm_period_elapsed(azx_dev->substream); + spin_lock(&chip->reg_lock); +- } else { ++ } else if (ok == 0 && chip->bus && chip->bus->workq) { + /* bogus IRQ, process it later */ + azx_dev->irq_pending = 1; +- schedule_work(&chip->irq_pending_work); ++ queue_work(chip->bus->workq, ++ &chip->irq_pending_work); + } + } + } +@@ -1067,15 +1073,13 @@ + azx_sd_writel(azx_dev, SD_BDLPL, 0); + azx_sd_writel(azx_dev, SD_BDLPU, 0); + +- period_bytes = snd_pcm_lib_period_bytes(substream); +- azx_dev->period_bytes = period_bytes; ++ period_bytes = azx_dev->period_bytes; + periods = azx_dev->bufsize / period_bytes; + + /* program the initial BDL entries */ + bdl = (u32 *)azx_dev->bdl.area; + ofs = 0; + azx_dev->frags = 0; +- azx_dev->irq_ignore = 0; + pos_adj = bdl_pos_adj[chip->dev_index]; + if (pos_adj > 0) { + struct snd_pcm_runtime *runtime = substream->runtime; +@@ -1096,7 +1100,6 @@ + &bdl, ofs, pos_adj, 1); + if (ofs < 0) + goto error; +- azx_dev->irq_ignore = 1; + } + } else + pos_adj = 0; +@@ -1115,24 +1118,17 @@ + error: + snd_printk(KERN_ERR "Too many BDL entries: buffer=%d, period=%d\n", + azx_dev->bufsize, period_bytes); +- /* reset */ +- azx_sd_writel(azx_dev, SD_BDLPL, 0); +- azx_sd_writel(azx_dev, SD_BDLPU, 0); + return -EINVAL; + } + +-/* +- * set up the SD for streaming +- */ +-static int azx_setup_controller(struct azx *chip, struct azx_dev *azx_dev) ++/* reset stream */ ++static void azx_stream_reset(struct azx *chip, struct azx_dev *azx_dev) + { + unsigned char val; + int timeout; + +- /* make sure the run bit is zero for SD */ +- azx_sd_writeb(azx_dev, SD_CTL, azx_sd_readb(azx_dev, SD_CTL) & +- ~SD_CTL_DMA_START); +- /* reset stream */ ++ azx_stream_clear(chip, azx_dev); ++ + azx_sd_writeb(azx_dev, SD_CTL, azx_sd_readb(azx_dev, SD_CTL) | + SD_CTL_STREAM_RESET); + udelay(3); +@@ -1150,6 +1146,17 @@ + --timeout) + ; + ++ /* reset first position - may not be synced with hw at this time */ ++ *azx_dev->posbuf = 0; ++} ++ ++/* ++ * set up the SD for streaming ++ */ ++static int azx_setup_controller(struct azx *chip, struct azx_dev *azx_dev) ++{ ++ /* make sure the run bit is zero for SD */ ++ azx_stream_clear(chip, azx_dev); + /* program the stream_tag */ + azx_sd_writel(azx_dev, SD_CTL, + (azx_sd_readl(azx_dev, SD_CTL) & ~SD_CTL_STREAM_TAG_MASK)| +@@ -1187,6 +1194,26 @@ + return 0; + } + ++/* ++ * Probe the given codec address ++ */ ++static int probe_codec(struct azx *chip, int addr) ++{ ++ unsigned int cmd = (addr << 28) | (AC_NODE_ROOT << 20) | ++ (AC_VERB_PARAMETERS << 8) | AC_PAR_VENDOR_ID; ++ unsigned int res; ++ ++ chip->probing = 1; ++ azx_send_cmd(chip->bus, cmd); ++ res = azx_get_response(chip->bus); ++ chip->probing = 0; ++ if (res == -1) ++ return -EIO; ++ snd_printdd("hda_intel: codec #%d probed OK\n", addr); ++ return 0; ++} ++ ++static void azx_stop_chip(struct azx *chip); + + /* + * Codec initialization +@@ -1197,21 +1224,11 @@ + [AZX_DRIVER_TERA] = 1, + }; + +-/* number of slots to probe as default +- * this can be different from azx_max_codecs[] -- e.g. some boards +- * report wrongly the non-existing 4th slot availability +- */ +-static unsigned int azx_default_codecs[AZX_NUM_DRIVERS] __devinitdata = { +- [AZX_DRIVER_ICH] = 3, +- [AZX_DRIVER_ATI] = 3, +-}; +- +-static int __devinit azx_codec_create(struct azx *chip, const char *model, +- unsigned int codec_probe_mask) ++static int __devinit azx_codec_create(struct azx *chip, const char *model) + { + struct hda_bus_template bus_temp; +- int c, codecs, audio_codecs, err; +- int def_slots, max_slots; ++ int c, codecs, err; ++ int max_slots; + + memset(&bus_temp, 0, sizeof(bus_temp)); + bus_temp.private_data = chip; +@@ -1230,33 +1247,43 @@ + if (chip->driver_type == AZX_DRIVER_NVIDIA) + chip->bus->needs_damn_long_delay = 1; + +- codecs = audio_codecs = 0; ++ codecs = 0; + max_slots = azx_max_codecs[chip->driver_type]; + if (!max_slots) + max_slots = AZX_MAX_CODECS; +- def_slots = azx_default_codecs[chip->driver_type]; +- if (!def_slots) +- def_slots = max_slots; +- for (c = 0; c < def_slots; c++) { +- if ((chip->codec_mask & (1 << c)) & codec_probe_mask) { ++ ++ /* First try to probe all given codec slots */ ++ for (c = 0; c < max_slots; c++) { ++ if ((chip->codec_mask & (1 << c)) & chip->codec_probe_mask) { ++ if (probe_codec(chip, c) < 0) { ++ /* Some BIOSen give you wrong codec addresses ++ * that don't exist ++ */ ++ snd_printk(KERN_WARNING ++ "hda_intel: Codec #%d probe error; " ++ "disabling it...\n", c); ++ chip->codec_mask &= ~(1 << c); ++ /* More badly, accessing to a non-existing ++ * codec often screws up the controller chip, ++ * and distrubs the further communications. ++ * Thus if an error occurs during probing, ++ * better to reset the controller chip to ++ * get back to the sanity state. ++ */ ++ azx_stop_chip(chip); ++ azx_init_chip(chip); ++ } ++ } ++ } ++ ++ /* Then create codec instances */ ++ for (c = 0; c < max_slots; c++) { ++ if ((chip->codec_mask & (1 << c)) & chip->codec_probe_mask) { + struct hda_codec *codec; + err = snd_hda_codec_new(chip->bus, c, &codec); + if (err < 0) + continue; + codecs++; +- if (codec->afg) +- audio_codecs++; +- } +- } +- if (!audio_codecs) { +- /* probe additional slots if no codec is found */ +- for (; c < max_slots; c++) { +- if ((chip->codec_mask & (1 << c)) & codec_probe_mask) { +- err = snd_hda_codec_new(chip->bus, c, NULL); +- if (err < 0) +- continue; +- codecs++; +- } + } + } + if (!codecs) { +@@ -1369,6 +1396,7 @@ + runtime->private_data = azx_dev; + snd_pcm_set_sync(substream); + mutex_unlock(&chip->open_mutex); ++ + return 0; + } + +@@ -1395,6 +1423,11 @@ + static int azx_pcm_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *hw_params) + { ++ struct azx_dev *azx_dev = get_azx_dev(substream); ++ ++ azx_dev->bufsize = 0; ++ azx_dev->period_bytes = 0; ++ azx_dev->format_val = 0; + return snd_pcm_lib_malloc_pages(substream, + params_buffer_bytes(hw_params)); + } +@@ -1409,6 +1442,9 @@ + azx_sd_writel(azx_dev, SD_BDLPL, 0); + azx_sd_writel(azx_dev, SD_BDLPU, 0); + azx_sd_writel(azx_dev, SD_CTL, 0); ++ azx_dev->bufsize = 0; ++ azx_dev->period_bytes = 0; ++ azx_dev->format_val = 0; + + hinfo->ops.cleanup(hinfo, apcm->codec, substream); + +@@ -1422,23 +1458,40 @@ + struct azx_dev *azx_dev = get_azx_dev(substream); + struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream]; + struct snd_pcm_runtime *runtime = substream->runtime; ++ unsigned int bufsize, period_bytes, format_val; ++ int err; + +- azx_dev->bufsize = snd_pcm_lib_buffer_bytes(substream); +- azx_dev->format_val = snd_hda_calc_stream_format(runtime->rate, +- runtime->channels, +- runtime->format, +- hinfo->maxbps); +- if (!azx_dev->format_val) { ++ azx_stream_reset(chip, azx_dev); ++ format_val = snd_hda_calc_stream_format(runtime->rate, ++ runtime->channels, ++ runtime->format, ++ hinfo->maxbps); ++ if (!format_val) { + snd_printk(KERN_ERR SFX + "invalid format_val, rate=%d, ch=%d, format=%d\n", + runtime->rate, runtime->channels, runtime->format); + return -EINVAL; + } + ++ bufsize = snd_pcm_lib_buffer_bytes(substream); ++ period_bytes = snd_pcm_lib_period_bytes(substream); ++ + snd_printdd("azx_pcm_prepare: bufsize=0x%x, format=0x%x\n", +- azx_dev->bufsize, azx_dev->format_val); +- if (azx_setup_periods(chip, substream, azx_dev) < 0) +- return -EINVAL; ++ bufsize, format_val); ++ ++ if (bufsize != azx_dev->bufsize || ++ period_bytes != azx_dev->period_bytes || ++ format_val != azx_dev->format_val) { ++ azx_dev->bufsize = bufsize; ++ azx_dev->period_bytes = period_bytes; ++ azx_dev->format_val = format_val; ++ err = azx_setup_periods(chip, substream, azx_dev); ++ if (err < 0) ++ return err; ++ } ++ ++ azx_dev->min_jiffies = (runtime->period_size * HZ) / ++ (runtime->rate * 2); + azx_setup_controller(chip, azx_dev); + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) + azx_dev->fifo_size = azx_sd_readw(azx_dev, SD_FIFOSIZE) + 1; +@@ -1455,13 +1508,14 @@ + struct azx *chip = apcm->chip; + struct azx_dev *azx_dev; + struct snd_pcm_substream *s; +- int start, nsync = 0, sbits = 0; ++ int rstart = 0, start, nsync = 0, sbits = 0; + int nwait, timeout; + + switch (cmd) { ++ case SNDRV_PCM_TRIGGER_START: ++ rstart = 1; + case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: + case SNDRV_PCM_TRIGGER_RESUME: +- case SNDRV_PCM_TRIGGER_START: + start = 1; + break; + case SNDRV_PCM_TRIGGER_PAUSE_PUSH: +@@ -1491,6 +1545,10 @@ + if (s->pcm->card != substream->pcm->card) + continue; + azx_dev = get_azx_dev(s); ++ if (rstart) { ++ azx_dev->start_flag = 1; ++ azx_dev->start_jiffies = jiffies + azx_dev->min_jiffies; ++ } + if (start) + azx_stream_start(chip, azx_dev); + else +@@ -1640,6 +1698,11 @@ + { + unsigned int pos; + ++ if (azx_dev->start_flag && ++ time_before_eq(jiffies, azx_dev->start_jiffies)) ++ return -1; /* bogus (too early) interrupt */ ++ azx_dev->start_flag = 0; ++ + pos = azx_get_position(chip, azx_dev); + if (chip->position_fix == POS_FIX_AUTO) { + if (!pos) { +@@ -1708,7 +1771,6 @@ + for (i = 0; i < chip->num_streams; i++) + chip->azx_dev[i].irq_pending = 0; + spin_unlock_irq(&chip->reg_lock); +- flush_scheduled_work(); + } + + static struct snd_pcm_ops azx_pcm_ops = { +@@ -1905,13 +1967,13 @@ + + #ifdef CONFIG_SND_HDA_POWER_SAVE + /* power-up/down the controller */ +-static void azx_power_notify(struct hda_codec *codec) ++static void azx_power_notify(struct hda_bus *bus) + { +- struct azx *chip = codec->bus->private_data; ++ struct azx *chip = bus->private_data; + struct hda_codec *c; + int power_on = 0; + +- list_for_each_entry(c, &codec->bus->codec_list, list) { ++ list_for_each_entry(c, &bus->codec_list, list) { + if (c->power_on) { + power_on = 1; + break; +@@ -2065,26 +2127,31 @@ + { + const struct snd_pci_quirk *q; + +- /* Check VIA HD Audio Controller exist */ +- if (chip->pci->vendor == PCI_VENDOR_ID_VIA && +- chip->pci->device == VIA_HDAC_DEVICE_ID) { ++ switch (fix) { ++ case POS_FIX_LPIB: ++ case POS_FIX_POSBUF: ++ return fix; ++ } ++ ++ /* Check VIA/ATI HD Audio Controller exist */ ++ switch (chip->driver_type) { ++ case AZX_DRIVER_VIA: ++ case AZX_DRIVER_ATI: + chip->via_dmapos_patch = 1; + /* Use link position directly, avoid any transfer problem. */ + return POS_FIX_LPIB; + } + chip->via_dmapos_patch = 0; + +- if (fix == POS_FIX_AUTO) { +- q = snd_pci_quirk_lookup(chip->pci, position_fix_list); +- if (q) { +- printk(KERN_INFO +- "hda_intel: position_fix set to %d " +- "for device %04x:%04x\n", +- q->value, q->subvendor, q->subdevice); +- return q->value; +- } ++ q = snd_pci_quirk_lookup(chip->pci, position_fix_list); ++ if (q) { ++ printk(KERN_INFO ++ "hda_intel: position_fix set to %d " ++ "for device %04x:%04x\n", ++ q->value, q->subvendor, q->subdevice); ++ return q->value; + } +- return fix; ++ return POS_FIX_AUTO; + } + + /* +@@ -2099,23 +2166,38 @@ + SND_PCI_QUIRK(0x17aa, 0x20ac, "Thinkpad X/T/R61", 0x01), + /* broken BIOS */ + SND_PCI_QUIRK(0x1028, 0x20ac, "Dell Studio Desktop", 0x01), ++ /* including bogus ALC268 in slot#2 that conflicts with ALC888 */ ++ SND_PCI_QUIRK(0x17c0, 0x4085, "Medion MD96630", 0x01), ++ /* forced codec slots */ ++ SND_PCI_QUIRK(0x1046, 0x1262, "ASUS W5F", 0x103), + {} + }; + ++#define AZX_FORCE_CODEC_MASK 0x100 ++ + static void __devinit check_probe_mask(struct azx *chip, int dev) + { + const struct snd_pci_quirk *q; + +- if (probe_mask[dev] == -1) { ++ chip->codec_probe_mask = probe_mask[dev]; ++ if (chip->codec_probe_mask == -1) { + q = snd_pci_quirk_lookup(chip->pci, probe_mask_list); + if (q) { + printk(KERN_INFO + "hda_intel: probe_mask set to 0x%x " + "for device %04x:%04x\n", + q->value, q->subvendor, q->subdevice); +- probe_mask[dev] = q->value; ++ chip->codec_probe_mask = q->value; + } + } ++ ++ /* check forced option */ ++ if (chip->codec_probe_mask != -1 && ++ (chip->codec_probe_mask & AZX_FORCE_CODEC_MASK)) { ++ chip->codec_mask = chip->codec_probe_mask & 0xff; ++ printk(KERN_INFO "hda_intel: codec_mask forced to 0x%x\n", ++ chip->codec_mask); ++ } + } + + +@@ -2212,9 +2294,17 @@ + gcap = azx_readw(chip, GCAP); + snd_printdd("chipset global capabilities = 0x%x\n", gcap); + ++ /* ATI chips seems buggy about 64bit DMA addresses */ ++ if (chip->driver_type == AZX_DRIVER_ATI) ++ gcap &= ~0x01; ++ + /* allow 64bit DMA address if supported by H/W */ + if ((gcap & 0x01) && !pci_set_dma_mask(pci, DMA_64BIT_MASK)) + pci_set_consistent_dma_mask(pci, DMA_64BIT_MASK); ++ else { ++ pci_set_dma_mask(pci, DMA_32BIT_MASK); ++ pci_set_consistent_dma_mask(pci, DMA_32BIT_MASK); ++ } + + /* read number of streams from GCAP register instead of using + * hardcoded value +@@ -2342,40 +2432,30 @@ + } + + err = azx_create(card, pci, dev, pci_id->driver_data, &chip); +- if (err < 0) { +- snd_card_free(card); +- return err; +- } ++ if (err < 0) ++ goto out_free; + card->private_data = chip; + + /* create codec instances */ +- err = azx_codec_create(chip, model[dev], probe_mask[dev]); +- if (err < 0) { +- snd_card_free(card); +- return err; +- } ++ err = azx_codec_create(chip, model[dev]); ++ if (err < 0) ++ goto out_free; + + /* create PCM streams */ + err = azx_pcm_create(chip); +- if (err < 0) { +- snd_card_free(card); +- return err; +- } ++ if (err < 0) ++ goto out_free; + + /* create mixer controls */ + err = azx_mixer_create(chip); +- if (err < 0) { +- snd_card_free(card); +- return err; +- } ++ if (err < 0) ++ goto out_free; + + snd_card_set_dev(card, &pci->dev); + + err = snd_card_register(card); +- if (err < 0) { +- snd_card_free(card); +- return err; +- } ++ if (err < 0) ++ goto out_free; + + pci_set_drvdata(pci, card); + chip->running = 1; +@@ -2384,6 +2464,9 @@ + + dev++; + return err; ++out_free: ++ snd_card_free(card); ++ return err; + } + + static void __devexit azx_remove(struct pci_dev *pci) +diff -urN linux-2.6.27.19-5.1/sound/pci/hda/patch_analog.c linux-2.6.27.23-0.1.1/sound/pci/hda/patch_analog.c +--- linux-2.6.27.19-5.1/sound/pci/hda/patch_analog.c 2009-06-16 13:54:10.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/sound/pci/hda/patch_analog.c 2009-06-16 13:40:23.000000000 +0100 +@@ -3233,7 +3233,7 @@ + "Mic Playback Volume", + "CD Playback Volume", + "Internal Mic Playback Volume", +- "Docking Mic Playback Volume" ++ "Docking Mic Playback Volume", + "Beep Playback Volume", + "IEC958 Playback Volume", + NULL +@@ -3798,6 +3798,49 @@ + { } /* end */ + }; + ++static struct hda_verb ad1884a_mobile_verbs[] = { ++ /* DACs; unmute as default */ ++ {0x03, AC_VERB_SET_AMP_GAIN_MUTE, 0x27}, /* 0dB */ ++ {0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0x27}, /* 0dB */ ++ /* Port-A (HP) mixer - route only from analog mixer */ ++ {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, ++ {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, ++ /* Port-A pin */ ++ {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, ++ /* Port-A (HP) pin - always unmuted */ ++ {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, ++ /* Port-B (mic jack) pin */ ++ {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, ++ {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7002}, /* raise mic as default */ ++ /* Port-C (int mic) pin */ ++ {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, ++ {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x7002}, /* raise mic as default */ ++ /* Port-F (int speaker) mixer - route only from analog mixer */ ++ {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, ++ {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, ++ /* Port-F pin */ ++ {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, ++ {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, ++ /* Analog mixer; mute as default */ ++ {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, ++ {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, ++ {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, ++ {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, ++ {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, ++ {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, ++ /* Analog Mix output amp */ ++ {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, ++ /* capture sources */ ++ /* {0x0c, AC_VERB_SET_CONNECT_SEL, 0x0}, */ /* set via unsol */ ++ {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, ++ {0x0d, AC_VERB_SET_CONNECT_SEL, 0x0}, ++ {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, ++ /* unsolicited event for pin-sense */ ++ {0x11, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1884A_HP_EVENT}, ++ {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1884A_MIC_EVENT}, ++ { } /* end */ ++}; ++ + /* + * Thinkpad X300 + * 0x11 - HP +@@ -3907,13 +3950,19 @@ + SND_PCI_QUIRK(0x103c, 0x3056, "HP", AD1884A_MOBILE), + SND_PCI_QUIRK(0x103c, 0x3072, "HP", AD1884A_MOBILE), + SND_PCI_QUIRK(0x103c, 0x3073, "HP", AD1884A_MOBILE), ++ SND_PCI_QUIRK(0x103c, 0x3074, "HP", AD1884A_MOBILE), ++ SND_PCI_QUIRK(0x103c, 0x3075, "HP", AD1884A_MOBILE), + SND_PCI_QUIRK(0x103c, 0x3076, "HP", AD1884A_MOBILE), + SND_PCI_QUIRK(0x103c, 0x3077, "HP", AD1884A_MOBILE), ++ SND_PCI_QUIRK(0x103c, 0x3078, "HP", AD1884A_MOBILE), + SND_PCI_QUIRK(0x103c, 0x3079, "HP", AD1884A_MOBILE), + SND_PCI_QUIRK(0x103c, 0x307a, "HP", AD1884A_MOBILE), ++ SND_PCI_QUIRK(0x103c, 0x30e1, "HP 2530p", AD1884A_LAPTOP), + SND_PCI_QUIRK(0x103c, 0x30e6, "HP 6730b", AD1884A_LAPTOP), + SND_PCI_QUIRK(0x103c, 0x30e7, "HP EliteBook 8530p", AD1884A_LAPTOP), ++ SND_PCI_QUIRK(0x103c, 0x360d, "HP 6530b", AD1884A_LAPTOP), + SND_PCI_QUIRK(0x103c, 0x3614, "HP 6730s", AD1884A_LAPTOP), ++ SND_PCI_QUIRK(0x103c, 0x3632, "HP", AD1884A_MOBILE), + SND_PCI_QUIRK(0x17aa, 0x20ac, "Thinkpad X300", AD1884A_THINKPAD), + {} + }; +@@ -3970,10 +4019,18 @@ + break; + case AD1884A_MOBILE: + spec->mixers[0] = ad1884a_mobile_mixers; +- spec->init_verbs[spec->num_init_verbs++] = ad1884a_laptop_verbs; ++ spec->init_verbs[0] = ad1884a_mobile_verbs; + spec->multiout.dig_out_nid = 0; + codec->patch_ops.unsol_event = ad1884a_hp_unsol_event; + codec->patch_ops.init = ad1884a_hp_init; ++ /* set the upper-limit for mixer amp to 0dB for avoiding the ++ * possible damage by overloading ++ */ ++ snd_hda_override_amp_caps(codec, 0x20, HDA_INPUT, ++ (0x17 << AC_AMPCAP_OFFSET_SHIFT) | ++ (0x17 << AC_AMPCAP_NUM_STEPS_SHIFT) | ++ (0x05 << AC_AMPCAP_STEP_SIZE_SHIFT) | ++ (1 << AC_AMPCAP_MUTE_SHIFT)); + break; + case AD1884A_THINKPAD: + spec->mixers[0] = ad1984a_thinkpad_mixers; +diff -urN linux-2.6.27.19-5.1/sound/pci/hda/patch_conexant.c linux-2.6.27.23-0.1.1/sound/pci/hda/patch_conexant.c +--- linux-2.6.27.19-5.1/sound/pci/hda/patch_conexant.c 2009-06-16 13:54:10.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/sound/pci/hda/patch_conexant.c 2009-06-16 13:40:23.000000000 +0100 +@@ -58,6 +58,7 @@ + */ + unsigned int cur_eapd; + unsigned int hp_present; ++ unsigned int no_auto_mic; + unsigned int need_dac_fix; + + /* capture */ +@@ -1571,8 +1572,11 @@ + /* toggle input of built-in and mic jack appropriately */ + static void cxt5051_portb_automic(struct hda_codec *codec) + { ++ struct conexant_spec *spec = codec->spec; + unsigned int present; + ++ if (spec->no_auto_mic) ++ return; + present = snd_hda_codec_read(codec, 0x17, 0, + AC_VERB_GET_PIN_SENSE, 0) & + AC_PINSENSE_PRESENCE; +@@ -1588,6 +1592,8 @@ + unsigned int present; + hda_nid_t new_adc; + ++ if (spec->no_auto_mic) ++ return; + present = snd_hda_codec_read(codec, 0x18, 0, + AC_VERB_GET_PIN_SENSE, 0) & + AC_PINSENSE_PRESENCE; +@@ -1672,6 +1678,22 @@ + {} + }; + ++static struct snd_kcontrol_new cxt5051_hp_dv6736_mixers[] = { ++ HDA_CODEC_VOLUME("Mic Volume", 0x14, 0x00, HDA_INPUT), ++ HDA_CODEC_MUTE("Mic Switch", 0x14, 0x00, HDA_INPUT), ++ HDA_CODEC_VOLUME("Master Playback Volume", 0x10, 0x00, HDA_OUTPUT), ++ { ++ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, ++ .name = "Master Playback Switch", ++ .info = cxt_eapd_info, ++ .get = cxt_eapd_get, ++ .put = cxt5051_hp_master_sw_put, ++ .private_value = 0x1a, ++ }, ++ ++ {} ++}; ++ + static struct hda_verb cxt5051_init_verbs[] = { + /* Line in, Mic */ + {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) | 0x03}, +@@ -1702,6 +1724,66 @@ + { } /* end */ + }; + ++static struct hda_verb cxt5051_hp_dv6736_init_verbs[] = { ++ /* Line in, Mic */ ++ {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) | 0x03}, ++ {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, ++ {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0}, ++ {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0}, ++ /* SPK */ ++ {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, ++ {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00}, ++ /* HP, Amp */ ++ {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, ++ {0x16, AC_VERB_SET_CONNECT_SEL, 0x00}, ++ /* DAC1 */ ++ {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, ++ /* Record selector: Int mic */ ++ {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1) | 0x44}, ++ {0x14, AC_VERB_SET_CONNECT_SEL, 0x1}, ++ /* SPDIF route: PCM */ ++ {0x1c, AC_VERB_SET_CONNECT_SEL, 0x0}, ++ /* EAPD */ ++ {0x1a, AC_VERB_SET_EAPD_BTLENABLE, 0x2}, /* default on */ ++ {0x16, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|CONEXANT_HP_EVENT}, ++ {0x17, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|CXT5051_PORTB_EVENT}, ++ { } /* end */ ++}; ++ ++static struct hda_verb cxt5051_lenovo_x200_init_verbs[] = { ++ /* Line in, Mic */ ++ {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) | 0x03}, ++ {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, ++ {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) | 0x03}, ++ {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, ++ {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, ++ {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) | 0x03}, ++ /* SPK */ ++ {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, ++ {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00}, ++ /* HP, Amp */ ++ {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, ++ {0x16, AC_VERB_SET_CONNECT_SEL, 0x00}, ++ /* Docking HP */ ++ {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, ++ {0x19, AC_VERB_SET_CONNECT_SEL, 0x00}, ++ /* DAC1 */ ++ {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, ++ /* Record selector: Int mic */ ++ {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) | 0x44}, ++ {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1) | 0x44}, ++ {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) | 0x44}, ++ /* SPDIF route: PCM */ ++ {0x1c, AC_VERB_SET_CONNECT_SEL, 0x0}, ++ /* EAPD */ ++ {0x1a, AC_VERB_SET_EAPD_BTLENABLE, 0x2}, /* default on */ ++ {0x16, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|CONEXANT_HP_EVENT}, ++ {0x17, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|CXT5051_PORTB_EVENT}, ++ {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|CXT5051_PORTC_EVENT}, ++ {0x19, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|CONEXANT_HP_EVENT}, ++ { } /* end */ ++}; ++ + /* initialize jack-sensing, too */ + static int cxt5051_init(struct hda_codec *codec) + { +@@ -1718,18 +1800,24 @@ + enum { + CXT5051_LAPTOP, /* Laptops w/ EAPD support */ + CXT5051_HP, /* no docking */ ++ CXT5051_HP_DV6736, /* HP without mic switch */ ++ CXT5051_LENOVO_X200, /* Lenovo X200 laptop */ + CXT5051_MODELS + }; + + static const char *cxt5051_models[CXT5051_MODELS] = { + [CXT5051_LAPTOP] = "laptop", + [CXT5051_HP] = "hp", ++ [CXT5051_HP_DV6736] = "hp-dv6736", ++ [CXT5051_LENOVO_X200] = "lenovo-x200", + }; + + static struct snd_pci_quirk cxt5051_cfg_tbl[] = { ++ SND_PCI_QUIRK(0x103c, 0x30cf, "HP DV6736", CXT5051_HP_DV6736), + SND_PCI_QUIRK(0x14f1, 0x0101, "Conexant Reference board", + CXT5051_LAPTOP), + SND_PCI_QUIRK(0x14f1, 0x5051, "HP Spartan 1.1", CXT5051_HP), ++ SND_PCI_QUIRK(0x17aa, 0x20f2, "Lenovo X200", CXT5051_LENOVO_X200), + {} + }; + +@@ -1762,17 +1850,22 @@ + spec->cur_adc = 0; + spec->cur_adc_idx = 0; + ++ codec->patch_ops.unsol_event = cxt5051_hp_unsol_event; ++ + board_config = snd_hda_check_board_config(codec, CXT5051_MODELS, + cxt5051_models, + cxt5051_cfg_tbl); + switch (board_config) { + case CXT5051_HP: +- codec->patch_ops.unsol_event = cxt5051_hp_unsol_event; + spec->mixers[0] = cxt5051_hp_mixers; + break; +- default: +- case CXT5051_LAPTOP: +- codec->patch_ops.unsol_event = cxt5051_hp_unsol_event; ++ case CXT5051_HP_DV6736: ++ spec->init_verbs[0] = cxt5051_hp_dv6736_init_verbs; ++ spec->mixers[0] = cxt5051_hp_dv6736_mixers; ++ spec->no_auto_mic = 1; ++ break; ++ case CXT5051_LENOVO_X200: ++ spec->init_verbs[0] = cxt5051_lenovo_x200_init_verbs; + break; + } + +diff -urN linux-2.6.27.19-5.1/sound/pci/hda/patch_realtek.c linux-2.6.27.23-0.1.1/sound/pci/hda/patch_realtek.c +--- linux-2.6.27.19-5.1/sound/pci/hda/patch_realtek.c 2009-06-16 13:54:10.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/sound/pci/hda/patch_realtek.c 2009-06-16 13:40:23.000000000 +0100 +@@ -884,7 +884,7 @@ + snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0); + tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0); + snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7); +- if ((tmp & 0xf0) == 2) ++ if ((tmp & 0xf0) == 0x20) + /* alc888S-VC */ + snd_hda_codec_read(codec, 0x20, 0, + AC_VERB_SET_PROC_COEF, 0x830); +@@ -6779,6 +6779,7 @@ + case 0x106b2800: /* AppleTV */ + board_config = ALC885_IMAC24; + break; ++ case 0x106b00a0: /* MacBookPro3,1 - Another revision */ + case 0x106b00a1: /* Macbook (might be wrong - PCI SSID?) */ + case 0x106b00a4: /* MacbookPro4,1 */ + case 0x106b2c00: /* Macbook Pro rev3 */ +@@ -7852,36 +7853,83 @@ + { } /* end */ + }; + ++static struct hda_verb alc888_6st_dell_verbs[] = { ++ {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, ++ { } ++}; ++ ++static void alc888_3st_hp_front_automute(struct hda_codec *codec) ++{ ++ unsigned int present, bits; ++ ++ present = snd_hda_codec_read(codec, 0x1b, 0, ++ AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; ++ bits = present ? HDA_AMP_MUTE : 0; ++ snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, ++ HDA_AMP_MUTE, bits); ++ snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0, ++ HDA_AMP_MUTE, bits); ++ snd_hda_codec_amp_stereo(codec, 0x18, HDA_OUTPUT, 0, ++ HDA_AMP_MUTE, bits); ++} ++ ++static void alc888_3st_hp_unsol_event(struct hda_codec *codec, ++ unsigned int res) ++{ ++ switch (res >> 26) { ++ case ALC880_HP_EVENT: ++ alc888_3st_hp_front_automute(codec); ++ break; ++ } ++} ++ + static struct hda_verb alc888_3st_hp_verbs[] = { + {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front: output 0 (0x0c) */ + {0x16, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Rear : output 1 (0x0d) */ + {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* CLFE : output 2 (0x0e) */ +- { } +-}; +- +-static struct hda_verb alc888_6st_dell_verbs[] = { + {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, +- { } ++ { } /* end */ + }; + ++/* ++ * 2ch mode ++ */ + static struct hda_verb alc888_3st_hp_2ch_init[] = { + { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, + { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, + { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, + { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, +- { } ++ { } /* end */ + }; + ++/* ++ * 4ch mode ++ */ ++static struct hda_verb alc888_3st_hp_4ch_init[] = { ++ { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, ++ { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, ++ { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, ++ { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, ++ { 0x16, AC_VERB_SET_CONNECT_SEL, 0x01 }, ++ { } /* end */ ++}; ++ ++/* ++ * 6ch mode ++ */ + static struct hda_verb alc888_3st_hp_6ch_init[] = { + { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, + { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, ++ { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 }, + { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, + { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, +- { } ++ { 0x16, AC_VERB_SET_CONNECT_SEL, 0x01 }, ++ { } /* end */ + }; + +-static struct hda_channel_mode alc888_3st_hp_modes[2] = { ++static struct hda_channel_mode alc888_3st_hp_modes[3] = { + { 2, alc888_3st_hp_2ch_init }, ++ { 4, alc888_3st_hp_4ch_init }, + { 6, alc888_3st_hp_6ch_init }, + }; + +@@ -8428,8 +8476,11 @@ + SND_PCI_QUIRK(0x103c, 0x2a4f, "HP Samba", ALC888_3ST_HP), + SND_PCI_QUIRK(0x103c, 0x2a60, "HP Lucknow", ALC888_3ST_HP), + SND_PCI_QUIRK(0x103c, 0x2a61, "HP Nettle", ALC883_6ST_DIG), ++ SND_PCI_QUIRK(0x103c, 0x2a66, "HP Acacia", ALC888_3ST_HP), ++ SND_PCI_QUIRK(0x103c, 0x2a72, "HP Educ.ar", ALC888_3ST_HP), + SND_PCI_QUIRK(0x1043, 0x1873, "Asus M90V", ALC888_ASUS_M90V), + SND_PCI_QUIRK(0x1043, 0x8249, "Asus M2A-VM HDMI", ALC883_3ST_6ch_DIG), ++ SND_PCI_QUIRK(0x1043, 0x8284, "Asus Z37E", ALC883_6ST_DIG), + SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_ASUS_EEE1601), + SND_PCI_QUIRK(0x105b, 0x0ce8, "Foxconn P35AX-S", ALC883_6ST_DIG), + SND_PCI_QUIRK(0x105b, 0x6668, "Foxconn", ALC883_6ST_DIG), +@@ -8693,6 +8744,8 @@ + .channel_mode = alc888_3st_hp_modes, + .need_dac_fix = 1, + .input_mux = &alc883_capture_source, ++ .unsol_event = alc888_3st_hp_unsol_event, ++ .init_hook = alc888_3st_hp_front_automute, + }, + [ALC888_6ST_DELL] = { + .mixers = { alc883_base_mixer, alc883_chmode_mixer }, +@@ -10453,6 +10506,7 @@ + SND_PCI_QUIRK(0x103c, 0x1309, "HP xw4*00", ALC262_HP_BPC), + SND_PCI_QUIRK(0x103c, 0x130a, "HP xw6*00", ALC262_HP_BPC), + SND_PCI_QUIRK(0x103c, 0x130b, "HP xw8*00", ALC262_HP_BPC), ++ SND_PCI_QUIRK(0x103c, 0x170b, "HP xw*", ALC262_HP_BPC), + SND_PCI_QUIRK(0x103c, 0x2800, "HP D7000", ALC262_HP_BPC_D7000_WL), + SND_PCI_QUIRK(0x103c, 0x2801, "HP D7000", ALC262_HP_BPC_D7000_WF), + SND_PCI_QUIRK(0x103c, 0x2802, "HP D7000", ALC262_HP_BPC_D7000_WL), +@@ -10669,16 +10723,6 @@ + .channel_mode = alc262_modes, + .input_mux = &alc262_capture_source, + }, +- [ALC262_NEC] = { +- .mixers = { alc262_nec_mixer }, +- .init_verbs = { alc262_nec_verbs }, +- .num_dacs = ARRAY_SIZE(alc262_dac_nids), +- .dac_nids = alc262_dac_nids, +- .hp_nid = 0x03, +- .num_channel_mode = ARRAY_SIZE(alc262_modes), +- .channel_mode = alc262_modes, +- .input_mux = &alc262_capture_source, +- }, + [ALC262_TOSHIBA_S06] = { + .mixers = { alc262_toshiba_s06_mixer }, + .init_verbs = { alc262_init_verbs, alc262_toshiba_s06_verbs, +@@ -12348,6 +12392,27 @@ + #define alc269_pcm_digital_playback alc880_pcm_digital_playback + #define alc269_pcm_digital_capture alc880_pcm_digital_capture + ++static struct hda_pcm_stream alc269_44k_pcm_analog_playback = { ++ .substreams = 1, ++ .channels_min = 2, ++ .channels_max = 8, ++ .rates = SNDRV_PCM_RATE_44100, /* fixed rate */ ++ /* NID is set in alc_build_pcms */ ++ .ops = { ++ .open = alc880_playback_pcm_open, ++ .prepare = alc880_playback_pcm_prepare, ++ .cleanup = alc880_playback_pcm_cleanup ++ }, ++}; ++ ++static struct hda_pcm_stream alc269_44k_pcm_analog_capture = { ++ .substreams = 1, ++ .channels_min = 2, ++ .channels_max = 2, ++ .rates = SNDRV_PCM_RATE_44100, /* fixed rate */ ++ /* NID is set in alc_build_pcms */ ++}; ++ + /* + * BIOS auto configuration + */ +@@ -12549,9 +12614,16 @@ + setup_preset(spec, &alc269_presets[board_config]); + + spec->stream_name_analog = "ALC269 Analog"; +- spec->stream_analog_playback = &alc269_pcm_analog_playback; +- spec->stream_analog_capture = &alc269_pcm_analog_capture; +- ++ if (codec->subsystem_id == 0x17aa3bf8) { ++ /* Due to a hardware problem on Lenovo Ideadpad, we need to ++ * fix the sample rate of analog I/O to 44.1kHz ++ */ ++ spec->stream_analog_playback = &alc269_44k_pcm_analog_playback; ++ spec->stream_analog_capture = &alc269_44k_pcm_analog_capture; ++ } else { ++ spec->stream_analog_playback = &alc269_pcm_analog_playback; ++ spec->stream_analog_capture = &alc269_pcm_analog_capture; ++ } + spec->stream_name_digital = "ALC269 Digital"; + spec->stream_digital_playback = &alc269_pcm_digital_playback; + spec->stream_digital_capture = &alc269_pcm_digital_capture; +@@ -15939,12 +16011,13 @@ + SND_PCI_QUIRK(0x1043, 0x1765, "ASUS NB", ALC663_ASUS_MODE6), + SND_PCI_QUIRK(0x105b, 0x0d47, "Foxconn 45CMX/45GMX/45CMX-K", + ALC662_3ST_6ch_DIG), +- SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo", ALC662_LENOVO_101E), + SND_PCI_QUIRK(0x1019, 0x9087, "ECS", ALC662_ECS), + SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_ECS), + SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte 945GCM-S2L", + ALC662_3ST_6ch_DIG), + SND_PCI_QUIRK(0x1565, 0x820f, "Biostar TA780G M2+", ALC662_3ST_6ch_DIG), ++ SND_PCI_QUIRK(0x1631, 0xc10c, "PB RS65", ALC663_ASUS_M51VA), ++ SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo", ALC662_LENOVO_101E), + SND_PCI_QUIRK(0x1849, 0x3662, "ASROCK K10N78FullHD-hSLI R3.0", + ALC662_3ST_6ch_DIG), + SND_PCI_QUIRK(0x1854, 0x2000, "ASUS H13-2000", ALC663_ASUS_H13), +diff -urN linux-2.6.27.19-5.1/sound/pci/hda/patch_sigmatel.c linux-2.6.27.23-0.1.1/sound/pci/hda/patch_sigmatel.c +--- linux-2.6.27.19-5.1/sound/pci/hda/patch_sigmatel.c 2009-06-16 13:54:10.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/sound/pci/hda/patch_sigmatel.c 2009-06-16 13:40:23.000000000 +0100 +@@ -82,6 +82,7 @@ + + enum { + STAC_92HD83XXX_REF, ++ STAC_92HD83XXX_PWR_REF, + STAC_92HD83XXX_MODELS + }; + +@@ -144,6 +145,13 @@ + STAC_927X_MODELS + }; + ++struct sigmatel_event { ++ hda_nid_t nid; ++ unsigned char type; ++ unsigned char tag; ++ int data; ++}; ++ + struct sigmatel_spec { + struct snd_kcontrol_new *mixers[4]; + unsigned int num_mixers; +@@ -151,8 +159,6 @@ + int board_config; + unsigned int eapd_switch: 1; + unsigned int surr_switch: 1; +- unsigned int line_switch: 1; +- unsigned int mic_switch: 1; + unsigned int alt_switch: 1; + unsigned int hp_detect: 1; + unsigned int spdif_mute: 1; +@@ -178,12 +184,18 @@ + hda_nid_t *pwr_nids; + hda_nid_t *dac_list; + ++ /* events */ ++ int num_events; ++ struct sigmatel_event events[32]; ++ + /* playback */ + struct hda_input_mux *mono_mux; + struct hda_input_mux *amp_mux; + unsigned int cur_mmux; + struct hda_multi_out multiout; + hda_nid_t dac_nids[5]; ++ hda_nid_t hp_dacs[5]; ++ hda_nid_t speaker_dacs[5]; + + int volume_offset; + +@@ -230,7 +242,9 @@ + /* i/o switches */ + unsigned int io_switch[2]; + unsigned int clfe_swap; +- unsigned int hp_switch; /* NID of HP as line-out */ ++ hda_nid_t line_switch; /* shared line-in for input and output */ ++ hda_nid_t mic_switch; /* shared mic-in for input and output */ ++ hda_nid_t hp_switch; /* NID of HP as line-out */ + unsigned int aloopback; + + struct hda_pcm pcm_rec[2]; /* PCM information */ +@@ -282,9 +296,6 @@ + }; + + #define STAC92HD73_DAC_COUNT 5 +-static hda_nid_t stac92hd73xx_dac_nids[STAC92HD73_DAC_COUNT] = { +- 0x15, 0x16, 0x17, 0x18, 0x19, +-}; + + static hda_nid_t stac92hd73xx_mux_nids[4] = { + 0x28, 0x29, 0x2a, 0x2b, +@@ -303,11 +314,7 @@ + 0x11, 0x12, 0 + }; + +-#define STAC92HD81_DAC_COUNT 2 + #define STAC92HD83_DAC_COUNT 3 +-static hda_nid_t stac92hd83xxx_dac_nids[STAC92HD73_DAC_COUNT] = { +- 0x13, 0x14, 0x22, +-}; + + static hda_nid_t stac92hd83xxx_dmux_nids[2] = { + 0x17, 0x18, +@@ -326,7 +333,11 @@ + }; + + static unsigned int stac92hd83xxx_pwr_mapping[4] = { +- 0x03, 0x0c, 0x10, 0x40, ++ 0x03, 0x0c, 0x20, 0x40, ++}; ++ ++static hda_nid_t stac92hd83xxx_amp_nids[1] = { ++ 0xc, + }; + + static hda_nid_t stac92hd71bxx_pwr_nids[3] = { +@@ -349,10 +360,6 @@ + 0x24, 0x25, + }; + +-static hda_nid_t stac92hd71bxx_dac_nids[1] = { +- 0x10, /*0x11, */ +-}; +- + #define STAC92HD71BXX_NUM_DMICS 2 + static hda_nid_t stac92hd71bxx_dmic_nids[STAC92HD71BXX_NUM_DMICS + 1] = { + 0x18, 0x19, 0 +@@ -584,12 +591,12 @@ + else + nid = codec->slave_dig_outs[smux_idx - 1]; + if (spec->cur_smux[smux_idx] == smux->num_items - 1) +- val = AMP_OUT_MUTE; ++ val = HDA_AMP_MUTE; + else +- val = AMP_OUT_UNMUTE; ++ val = 0; + /* un/mute SPDIF out */ +- snd_hda_codec_write_cache(codec, nid, 0, +- AC_VERB_SET_AMP_GAIN_MUTE, val); ++ snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0, ++ HDA_AMP_MUTE, val); + } + return 0; + } +@@ -754,10 +761,6 @@ + static struct hda_verb stac92hd73xx_6ch_core_init[] = { + /* set master volume and direct control */ + { 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff}, +- /* setup audio connections */ +- { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00}, +- { 0x10, AC_VERB_SET_CONNECT_SEL, 0x01}, +- { 0x11, AC_VERB_SET_CONNECT_SEL, 0x02}, + /* setup adcs to point to mixer */ + { 0x20, AC_VERB_SET_CONNECT_SEL, 0x0b}, + { 0x21, AC_VERB_SET_CONNECT_SEL, 0x0b}, +@@ -776,10 +779,6 @@ + /* set master volume to max value without distortion + * and direct control */ + { 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xec}, +- /* setup audio connections */ +- { 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00}, +- { 0x0a, AC_VERB_SET_CONNECT_SEL, 0x02}, +- { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x01}, + /* setup adcs to point to mixer */ + { 0x20, AC_VERB_SET_CONNECT_SEL, 0x0b}, + { 0x21, AC_VERB_SET_CONNECT_SEL, 0x0b}, +@@ -793,10 +792,6 @@ + + static struct hda_verb dell_m6_core_init[] = { + { 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff}, +- /* setup audio connections */ +- { 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00}, +- { 0x0a, AC_VERB_SET_CONNECT_SEL, 0x01}, +- { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x02}, + /* setup adcs to point to mixer */ + { 0x20, AC_VERB_SET_CONNECT_SEL, 0x0b}, + { 0x21, AC_VERB_SET_CONNECT_SEL, 0x0b}, +@@ -811,13 +806,6 @@ + static struct hda_verb stac92hd73xx_8ch_core_init[] = { + /* set master volume and direct control */ + { 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff}, +- /* setup audio connections */ +- { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00}, +- { 0x10, AC_VERB_SET_CONNECT_SEL, 0x01}, +- { 0x11, AC_VERB_SET_CONNECT_SEL, 0x02}, +- /* connect hp ports to dac3 */ +- { 0x0a, AC_VERB_SET_CONNECT_SEL, 0x03}, +- { 0x0d, AC_VERB_SET_CONNECT_SEL, 0x03}, + /* setup adcs to point to mixer */ + { 0x20, AC_VERB_SET_CONNECT_SEL, 0x0b}, + { 0x21, AC_VERB_SET_CONNECT_SEL, 0x0b}, +@@ -835,15 +823,8 @@ + static struct hda_verb stac92hd73xx_10ch_core_init[] = { + /* set master volume and direct control */ + { 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff}, +- /* setup audio connections */ +- { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 }, +- { 0x10, AC_VERB_SET_CONNECT_SEL, 0x01 }, +- { 0x11, AC_VERB_SET_CONNECT_SEL, 0x02 }, + /* dac3 is connected to import3 mux */ + { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0xb07f}, +- /* connect hp ports to dac4 */ +- { 0x0a, AC_VERB_SET_CONNECT_SEL, 0x04}, +- { 0x0d, AC_VERB_SET_CONNECT_SEL, 0x04}, + /* setup adcs to point to mixer */ + { 0x20, AC_VERB_SET_CONNECT_SEL, 0x0b}, + { 0x21, AC_VERB_SET_CONNECT_SEL, 0x0b}, +@@ -859,10 +840,6 @@ + }; + + static struct hda_verb stac92hd83xxx_core_init[] = { +- /* start of config #1 */ +- { 0xe, AC_VERB_SET_CONNECT_SEL, 0x3}, +- +- /* start of config #2 */ + { 0xa, AC_VERB_SET_CONNECT_SEL, 0x0}, + { 0xb, AC_VERB_SET_CONNECT_SEL, 0x0}, + { 0xd, AC_VERB_SET_CONNECT_SEL, 0x1}, +@@ -875,8 +852,6 @@ + static struct hda_verb stac92hd71bxx_core_init[] = { + /* set master volume and direct control */ + { 0x28, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff}, +- /* connect headphone jack to dac1 */ +- { 0x0a, AC_VERB_SET_CONNECT_SEL, 0x01}, + /* unmute right and left channels for nodes 0x0a, 0xd, 0x0f */ + { 0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, + { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, +@@ -896,8 +871,6 @@ + + /* set master volume and direct control */ + { 0x28, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff}, +- /* connect headphone jack to dac1 */ +- { 0x0a, AC_VERB_SET_CONNECT_SEL, 0x01}, + /* unmute right and left channels for nodes 0x0a, 0xd */ + { 0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, + { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, +@@ -1099,21 +1072,21 @@ + HDA_CODEC_VOLUME_IDX("Capture Volume", 0x1, 0x18, 0x0, HDA_OUTPUT), + HDA_CODEC_MUTE_IDX("Capture Switch", 0x1, 0x18, 0x0, HDA_OUTPUT), + +- HDA_CODEC_VOLUME("DAC0 Capture Volume", 0x1b, 0, HDA_INPUT), +- HDA_CODEC_MUTE("DAC0 Capture Switch", 0x1b, 0, HDA_INPUT), ++ HDA_CODEC_VOLUME("DAC0 Capture Volume", 0x1b, 0x3, HDA_INPUT), ++ HDA_CODEC_MUTE("DAC0 Capture Switch", 0x1b, 0x3, HDA_INPUT), + +- HDA_CODEC_VOLUME("DAC1 Capture Volume", 0x1b, 0x1, HDA_INPUT), +- HDA_CODEC_MUTE("DAC1 Capture Switch", 0x1b, 0x1, HDA_INPUT), ++ HDA_CODEC_VOLUME("DAC1 Capture Volume", 0x1b, 0x4, HDA_INPUT), ++ HDA_CODEC_MUTE("DAC1 Capture Switch", 0x1b, 0x4, HDA_INPUT), + +- HDA_CODEC_VOLUME("Front Mic Capture Volume", 0x1b, 0x2, HDA_INPUT), +- HDA_CODEC_MUTE("Front Mic Capture Switch", 0x1b, 0x2, HDA_INPUT), ++ HDA_CODEC_VOLUME("Front Mic Capture Volume", 0x1b, 0x0, HDA_INPUT), ++ HDA_CODEC_MUTE("Front Mic Capture Switch", 0x1b, 0x0, HDA_INPUT), + +- HDA_CODEC_VOLUME("Line In Capture Volume", 0x1b, 0x3, HDA_INPUT), +- HDA_CODEC_MUTE("Line In Capture Switch", 0x1b, 0x3, HDA_INPUT), ++ HDA_CODEC_VOLUME("Line In Capture Volume", 0x1b, 0x2, HDA_INPUT), ++ HDA_CODEC_MUTE("Line In Capture Switch", 0x1b, 0x2, HDA_INPUT), + + /* +- HDA_CODEC_VOLUME("Mic Capture Volume", 0x1b, 0x4, HDA_INPUT), +- HDA_CODEC_MUTE("Mic Capture Switch", 0x1b 0x4, HDA_INPUT), ++ HDA_CODEC_VOLUME("Mic Capture Volume", 0x1b, 0x1, HDA_INPUT), ++ HDA_CODEC_MUTE("Mic Capture Switch", 0x1b 0x1, HDA_INPUT), + */ + { } /* end */ + }; +@@ -1232,7 +1205,7 @@ + "LFE Playback Volume", + "Side Playback Volume", + "Headphone Playback Volume", +- "Headphone Playback Volume", ++ "Headphone2 Playback Volume", + "Speaker Playback Volume", + "External Speaker Playback Volume", + "Speaker2 Playback Volume", +@@ -1246,7 +1219,7 @@ + "LFE Playback Switch", + "Side Playback Switch", + "Headphone Playback Switch", +- "Headphone Playback Switch", ++ "Headphone2 Playback Switch", + "Speaker Playback Switch", + "External Speaker Playback Switch", + "Speaker2 Playback Switch", +@@ -1726,10 +1699,12 @@ + + static unsigned int *stac92hd83xxx_brd_tbl[STAC_92HD83XXX_MODELS] = { + [STAC_92HD83XXX_REF] = ref92hd83xxx_pin_configs, ++ [STAC_92HD83XXX_PWR_REF] = ref92hd83xxx_pin_configs, + }; + + static const char *stac92hd83xxx_models[STAC_92HD83XXX_MODELS] = { + [STAC_92HD83XXX_REF] = "ref", ++ [STAC_92HD83XXX_PWR_REF] = "mic-ref", + }; + + static struct snd_pci_quirk stac92hd83xxx_cfg_tbl[] = { +@@ -1785,14 +1760,20 @@ + /* SigmaTel reference board */ + SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, + "DFI LanParty", STAC_92HD71BXX_REF), ++ SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x308c, ++ "HP", STAC_HP_DV5), ++ SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x308d, ++ "HP", STAC_HP_DV5), + SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x30f2, +- "HP dv5", STAC_HP_M4), ++ "HP dv5", STAC_HP_DV5), + SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x30f4, +- "HP dv7", STAC_HP_M4), ++ "HP dv7", STAC_HP_DV5), + SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x30f7, + "HP dv4", STAC_HP_DV5), + SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x30fc, +- "HP dv7", STAC_HP_M4), ++ "HP dv7", STAC_HP_DV5), ++ SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3600, ++ "HP dv5", STAC_HP_DV5), + SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3603, + "HP dv5", STAC_HP_DV5), + SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x361a, +@@ -2419,7 +2400,7 @@ + + if (spec->powerdown_adcs) { + msleep(40); +- snd_hda_codec_write_cache(codec, nid, 0, ++ snd_hda_codec_write(codec, nid, 0, + AC_VERB_SET_POWER_STATE, AC_PWRST_D0); + } + snd_hda_codec_setup_stream(codec, nid, stream_tag, 0, format); +@@ -2435,7 +2416,7 @@ + + snd_hda_codec_cleanup_stream(codec, nid); + if (spec->powerdown_adcs) +- snd_hda_codec_write_cache(codec, nid, 0, ++ snd_hda_codec_write(codec, nid, 0, + AC_VERB_SET_POWER_STATE, AC_PWRST_D3); + return 0; + } +@@ -2569,6 +2550,9 @@ + return 0; + } + ++static void stac_issue_unsol_event(struct hda_codec *codec, hda_nid_t nid, ++ unsigned char type); ++ + static int stac92xx_hp_switch_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) + { +@@ -2581,8 +2565,7 @@ + /* check to be sure that the ports are upto date with + * switch changes + */ +- codec->patch_ops.unsol_event(codec, STAC_HP_EVENT << 26); +- ++ stac_issue_unsol_event(codec, nid, STAC_HP_EVENT); + return 1; + } + +@@ -2621,7 +2604,7 @@ + * appropriately according to the pin direction + */ + if (spec->hp_detect) +- codec->patch_ops.unsol_event(codec, STAC_HP_EVENT << 26); ++ stac_issue_unsol_event(codec, nid, STAC_HP_EVENT); + + return 1; + } +@@ -2758,70 +2741,53 @@ + return stac92xx_add_control_idx(spec, type, 0, name, val); + } + +-/* flag inputs as additional dynamic lineouts */ +-static int stac92xx_add_dyn_out_pins(struct hda_codec *codec, struct auto_pin_cfg *cfg) ++/* check whether the line-input can be used as line-out */ ++static hda_nid_t check_line_out_switch(struct hda_codec *codec) + { + struct sigmatel_spec *spec = codec->spec; +- unsigned int wcaps, wtype; +- int i, num_dacs = 0; +- +- /* use the wcaps cache to count all DACs available for line-outs */ +- for (i = 0; i < codec->num_nodes; i++) { +- wcaps = codec->wcaps[i]; +- wtype = (wcaps & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT; ++ struct auto_pin_cfg *cfg = &spec->autocfg; ++ hda_nid_t nid; ++ unsigned int pincap; + +- if (wtype == AC_WID_AUD_OUT && !(wcaps & AC_WCAP_DIGITAL)) +- num_dacs++; +- } ++ if (cfg->line_out_type != AUTO_PIN_LINE_OUT) ++ return 0; ++ nid = cfg->input_pins[AUTO_PIN_LINE]; ++ pincap = snd_hda_param_read(codec, nid, AC_PAR_PIN_CAP); ++ if (pincap & AC_PINCAP_OUT) ++ return nid; ++ return 0; ++} + +- snd_printdd("%s: total dac count=%d\n", __func__, num_dacs); +- +- switch (cfg->line_outs) { +- case 3: +- /* add line-in as side */ +- if (cfg->input_pins[AUTO_PIN_LINE] && num_dacs > 3) { +- cfg->line_out_pins[cfg->line_outs] = +- cfg->input_pins[AUTO_PIN_LINE]; +- spec->line_switch = 1; +- cfg->line_outs++; +- } +- break; +- case 2: +- /* add line-in as clfe and mic as side */ +- if (cfg->input_pins[AUTO_PIN_LINE] && num_dacs > 2) { +- cfg->line_out_pins[cfg->line_outs] = +- cfg->input_pins[AUTO_PIN_LINE]; +- spec->line_switch = 1; +- cfg->line_outs++; +- } +- if (cfg->input_pins[AUTO_PIN_MIC] && num_dacs > 3) { +- cfg->line_out_pins[cfg->line_outs] = +- cfg->input_pins[AUTO_PIN_MIC]; +- spec->mic_switch = 1; +- cfg->line_outs++; +- } +- break; +- case 1: +- /* add line-in as surr and mic as clfe */ +- if (cfg->input_pins[AUTO_PIN_LINE] && num_dacs > 1) { +- cfg->line_out_pins[cfg->line_outs] = +- cfg->input_pins[AUTO_PIN_LINE]; +- spec->line_switch = 1; +- cfg->line_outs++; +- } +- if (cfg->input_pins[AUTO_PIN_MIC] && num_dacs > 2) { +- cfg->line_out_pins[cfg->line_outs] = +- cfg->input_pins[AUTO_PIN_MIC]; +- spec->mic_switch = 1; +- cfg->line_outs++; ++/* check whether the mic-input can be used as line-out */ ++static hda_nid_t check_mic_out_switch(struct hda_codec *codec) ++{ ++ struct sigmatel_spec *spec = codec->spec; ++ struct auto_pin_cfg *cfg = &spec->autocfg; ++ unsigned int def_conf, pincap; ++ unsigned int mic_pin; ++ ++ if (cfg->line_out_type != AUTO_PIN_LINE_OUT) ++ return 0; ++ mic_pin = AUTO_PIN_MIC; ++ for (;;) { ++ hda_nid_t nid = cfg->input_pins[mic_pin]; ++ def_conf = snd_hda_codec_read(codec, nid, 0, ++ AC_VERB_GET_CONFIG_DEFAULT, 0); ++ /* some laptops have an internal analog microphone ++ * which can't be used as a output */ ++ if (get_defcfg_connect(def_conf) != AC_JACK_PORT_FIXED) { ++ pincap = snd_hda_param_read(codec, nid, AC_PAR_PIN_CAP); ++ if (pincap & AC_PINCAP_OUT) ++ return nid; + } +- break; ++ if (mic_pin == AUTO_PIN_MIC) ++ mic_pin = AUTO_PIN_FRONT_MIC; ++ else ++ break; + } +- + return 0; + } + +- + static int is_in_dac_nids(struct sigmatel_spec *spec, hda_nid_t nid) + { + int i; +@@ -2834,6 +2800,52 @@ + return 0; + } + ++static int check_all_dac_nids(struct sigmatel_spec *spec, hda_nid_t nid) ++{ ++ int i; ++ if (is_in_dac_nids(spec, nid)) ++ return 1; ++ for (i = 0; i < spec->autocfg.hp_outs; i++) ++ if (spec->hp_dacs[i] == nid) ++ return 1; ++ for (i = 0; i < spec->autocfg.speaker_outs; i++) ++ if (spec->speaker_dacs[i] == nid) ++ return 1; ++ return 0; ++} ++ ++static hda_nid_t get_unassigned_dac(struct hda_codec *codec, hda_nid_t nid) ++{ ++ struct sigmatel_spec *spec = codec->spec; ++ int j, conn_len; ++ hda_nid_t conn[HDA_MAX_CONNECTIONS]; ++ unsigned int wcaps, wtype; ++ ++ conn_len = snd_hda_get_connections(codec, nid, conn, ++ HDA_MAX_CONNECTIONS); ++ for (j = 0; j < conn_len; j++) { ++ wcaps = snd_hda_param_read(codec, conn[j], ++ AC_PAR_AUDIO_WIDGET_CAP); ++ wtype = (wcaps & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT; ++ /* we check only analog outputs */ ++ if (wtype != AC_WID_AUD_OUT || (wcaps & AC_WCAP_DIGITAL)) ++ continue; ++ /* if this route has a free DAC, assign it */ ++ if (!check_all_dac_nids(spec, conn[j])) { ++ if (conn_len > 1) { ++ /* select this DAC in the pin's input mux */ ++ snd_hda_codec_write_cache(codec, nid, 0, ++ AC_VERB_SET_CONNECT_SEL, j); ++ } ++ return conn[j]; ++ } ++ } ++ return 0; ++} ++ ++static int add_spec_dacs(struct sigmatel_spec *spec, hda_nid_t nid); ++static int add_spec_extra_dacs(struct sigmatel_spec *spec, hda_nid_t nid); ++ + /* + * Fill in the dac_nids table from the parsed pin configuration + * This function only works when every pin in line_out_pins[] +@@ -2841,31 +2853,17 @@ + * codecs are not connected directly to a DAC, such as the 9200 + * and 9202/925x. For those, dac_nids[] must be hard-coded. + */ +-static int stac92xx_auto_fill_dac_nids(struct hda_codec *codec, +- struct auto_pin_cfg *cfg) ++static int stac92xx_auto_fill_dac_nids(struct hda_codec *codec) + { + struct sigmatel_spec *spec = codec->spec; +- int i, j, conn_len = 0; +- hda_nid_t nid, conn[HDA_MAX_CONNECTIONS]; +- unsigned int wcaps, wtype; ++ struct auto_pin_cfg *cfg = &spec->autocfg; ++ int i; ++ hda_nid_t nid, dac; + + for (i = 0; i < cfg->line_outs; i++) { + nid = cfg->line_out_pins[i]; +- conn_len = snd_hda_get_connections(codec, nid, conn, +- HDA_MAX_CONNECTIONS); +- for (j = 0; j < conn_len; j++) { +- wcaps = snd_hda_param_read(codec, conn[j], +- AC_PAR_AUDIO_WIDGET_CAP); +- wtype = (wcaps & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT; +- if (wtype != AC_WID_AUD_OUT || +- (wcaps & AC_WCAP_DIGITAL)) +- continue; +- /* conn[j] is a DAC routed to this line-out */ +- if (!is_in_dac_nids(spec, conn[j])) +- break; +- } +- +- if (j == conn_len) { ++ dac = get_unassigned_dac(codec, nid); ++ if (!dac) { + if (spec->multiout.num_dacs > 0) { + /* we have already working output pins, + * so let's drop the broken ones again +@@ -2879,24 +2877,64 @@ + __func__, nid); + return -ENODEV; + } ++ add_spec_dacs(spec, dac); ++ } + +- spec->multiout.dac_nids[i] = conn[j]; +- spec->multiout.num_dacs++; +- if (conn_len > 1) { +- /* select this DAC in the pin's input mux */ +- snd_hda_codec_write_cache(codec, nid, 0, +- AC_VERB_SET_CONNECT_SEL, j); ++ /* add line-in as output */ ++ nid = check_line_out_switch(codec); ++ if (nid) { ++ dac = get_unassigned_dac(codec, nid); ++ if (dac) { ++ snd_printdd("STAC: Add line-in 0x%x as output %d\n", ++ nid, cfg->line_outs); ++ cfg->line_out_pins[cfg->line_outs] = nid; ++ cfg->line_outs++; ++ spec->line_switch = nid; ++ add_spec_dacs(spec, dac); ++ } ++ } ++ /* add mic as output */ ++ nid = check_mic_out_switch(codec); ++ if (nid) { ++ dac = get_unassigned_dac(codec, nid); ++ if (dac) { ++ snd_printdd("STAC: Add mic-in 0x%x as output %d\n", ++ nid, cfg->line_outs); ++ cfg->line_out_pins[cfg->line_outs] = nid; ++ cfg->line_outs++; ++ spec->mic_switch = nid; ++ add_spec_dacs(spec, dac); ++ } ++ } + ++ for (i = 0; i < cfg->hp_outs; i++) { ++ nid = cfg->hp_pins[i]; ++ dac = get_unassigned_dac(codec, nid); ++ if (dac) { ++ if (!spec->multiout.hp_nid) ++ spec->multiout.hp_nid = dac; ++ else ++ add_spec_extra_dacs(spec, dac); + } ++ spec->hp_dacs[i] = dac; + } + +- snd_printd("dac_nids=%d (0x%x/0x%x/0x%x/0x%x/0x%x)\n", ++ for (i = 0; i < cfg->speaker_outs; i++) { ++ nid = cfg->speaker_pins[i]; ++ dac = get_unassigned_dac(codec, nid); ++ if (dac) ++ add_spec_extra_dacs(spec, dac); ++ spec->speaker_dacs[i] = dac; ++ } ++ ++ snd_printd("stac92xx: dac_nids=%d (0x%x/0x%x/0x%x/0x%x/0x%x)\n", + spec->multiout.num_dacs, + spec->multiout.dac_nids[0], + spec->multiout.dac_nids[1], + spec->multiout.dac_nids[2], + spec->multiout.dac_nids[3], + spec->multiout.dac_nids[4]); ++ + return 0; + } + +@@ -2941,9 +2979,7 @@ + + static int add_spec_dacs(struct sigmatel_spec *spec, hda_nid_t nid) + { +- if (!spec->multiout.hp_nid) +- spec->multiout.hp_nid = nid; +- else if (spec->multiout.num_dacs > 4) { ++ if (spec->multiout.num_dacs > 4) { + printk(KERN_WARNING "stac92xx: No space for DAC 0x%x\n", nid); + return 1; + } else { +@@ -2953,36 +2989,51 @@ + return 0; + } + +-static int check_in_dac_nids(struct sigmatel_spec *spec, hda_nid_t nid) ++static int add_spec_extra_dacs(struct sigmatel_spec *spec, hda_nid_t nid) + { +- if (is_in_dac_nids(spec, nid)) +- return 1; +- if (spec->multiout.hp_nid == nid) +- return 1; +- return 0; ++ int i; ++ for (i = 0; i < ARRAY_SIZE(spec->multiout.extra_out_nid); i++) { ++ if (!spec->multiout.extra_out_nid[i]) { ++ spec->multiout.extra_out_nid[i] = nid; ++ return 0; ++ } ++ } ++ printk(KERN_WARNING "stac92xx: No space for extra DAC 0x%x\n", nid); ++ return 1; + } + +-/* add playback controls from the parsed DAC table */ +-static int stac92xx_auto_create_multi_out_ctls(struct hda_codec *codec, +- const struct auto_pin_cfg *cfg) ++/* Create output controls ++ * The mixer elements are named depending on the given type (AUTO_PIN_XXX_OUT) ++ */ ++static int create_multi_out_ctls(struct hda_codec *codec, int num_outs, ++ const hda_nid_t *pins, ++ const hda_nid_t *dac_nids, ++ int type) + { ++ struct sigmatel_spec *spec = codec->spec; + static const char *chname[4] = { + "Front", "Surround", NULL /*CLFE*/, "Side" + }; +- hda_nid_t nid = 0; ++ static const char *hp_pfxs[] = { ++ "Headphone", "Headphone2", "Headphone3", "Headphone4" ++ }; ++ static const char *speaker_pfxs[] = { ++ "Speaker", "External Speaker", "Speaker2", "Speaker3" ++ }; ++ hda_nid_t nid; + int i, err; ++ unsigned int wid_caps; + +- struct sigmatel_spec *spec = codec->spec; +- unsigned int wid_caps, pincap; +- +- +- for (i = 0; i < cfg->line_outs && i < spec->multiout.num_dacs; i++) { +- if (!spec->multiout.dac_nids[i]) ++ for (i = 0; i < num_outs && i < ARRAY_SIZE(chname); i++) { ++ if (type == AUTO_PIN_HP_OUT && !spec->hp_detect) { ++ wid_caps = get_wcaps(codec, pins[i]); ++ if (wid_caps & AC_WCAP_UNSOL_CAP) ++ spec->hp_detect = 1; ++ } ++ nid = dac_nids[i]; ++ if (!nid) + continue; +- +- nid = spec->multiout.dac_nids[i]; +- +- if (i == 2) { ++ if (type != AUTO_PIN_HP_OUT && i == 2) { + /* Center/LFE */ + err = create_controls(codec, "Center", nid, 1); + if (err < 0) +@@ -3003,15 +3054,38 @@ + } + + } else { +- err = create_controls(codec, chname[i], nid, 3); ++ const char *name; ++ switch (type) { ++ case AUTO_PIN_HP_OUT: ++ name = hp_pfxs[i]; ++ break; ++ case AUTO_PIN_SPEAKER_OUT: ++ name = speaker_pfxs[i]; ++ break; ++ default: ++ name = chname[i]; ++ break; ++ } ++ err = create_controls(codec, name, nid, 3); + if (err < 0) + return err; + } + } ++ return 0; ++} + +- if ((spec->multiout.num_dacs - cfg->line_outs) > 0 && +- cfg->hp_outs == 1 && !spec->multiout.hp_nid) +- spec->multiout.hp_nid = nid; ++/* add playback controls from the parsed DAC table */ ++static int stac92xx_auto_create_multi_out_ctls(struct hda_codec *codec, ++ const struct auto_pin_cfg *cfg) ++{ ++ struct sigmatel_spec *spec = codec->spec; ++ int err; ++ ++ err = create_multi_out_ctls(codec, cfg->line_outs, cfg->line_out_pins, ++ spec->multiout.dac_nids, ++ cfg->line_out_type); ++ if (err < 0) ++ return err; + + if (cfg->hp_outs > 1 && cfg->line_out_type == AUTO_PIN_LINE_OUT) { + err = stac92xx_add_control(spec, +@@ -3023,45 +3097,19 @@ + } + + if (spec->line_switch) { +- nid = cfg->input_pins[AUTO_PIN_LINE]; +- pincap = snd_hda_param_read(codec, nid, +- AC_PAR_PIN_CAP); +- if (pincap & AC_PINCAP_OUT) { +- err = stac92xx_add_control(spec, +- STAC_CTL_WIDGET_IO_SWITCH, +- "Line In as Output Switch", nid << 8); +- if (err < 0) +- return err; +- } ++ err = stac92xx_add_control(spec, STAC_CTL_WIDGET_IO_SWITCH, ++ "Line In as Output Switch", ++ spec->line_switch << 8); ++ if (err < 0) ++ return err; + } + + if (spec->mic_switch) { +- unsigned int def_conf; +- unsigned int mic_pin = AUTO_PIN_MIC; +-again: +- nid = cfg->input_pins[mic_pin]; +- def_conf = snd_hda_codec_read(codec, nid, 0, +- AC_VERB_GET_CONFIG_DEFAULT, 0); +- /* some laptops have an internal analog microphone +- * which can't be used as a output */ +- if (get_defcfg_connect(def_conf) != AC_JACK_PORT_FIXED) { +- pincap = snd_hda_param_read(codec, nid, +- AC_PAR_PIN_CAP); +- if (pincap & AC_PINCAP_OUT) { +- err = stac92xx_add_control(spec, +- STAC_CTL_WIDGET_IO_SWITCH, +- "Mic as Output Switch", (nid << 8) | 1); +- nid = snd_hda_codec_read(codec, nid, 0, +- AC_VERB_GET_CONNECT_LIST, 0) & 0xff; +- if (!check_in_dac_nids(spec, nid)) +- add_spec_dacs(spec, nid); +- if (err < 0) +- return err; +- } +- } else if (mic_pin == AUTO_PIN_MIC) { +- mic_pin = AUTO_PIN_FRONT_MIC; +- goto again; +- } ++ err = stac92xx_add_control(spec, STAC_CTL_WIDGET_IO_SWITCH, ++ "Mic as Output Switch", ++ (spec->mic_switch << 8) | 1); ++ if (err < 0) ++ return err; + } + + return 0; +@@ -3072,55 +3120,17 @@ + struct auto_pin_cfg *cfg) + { + struct sigmatel_spec *spec = codec->spec; +- hda_nid_t nid; +- int i, old_num_dacs, err; ++ int err; + +- old_num_dacs = spec->multiout.num_dacs; +- for (i = 0; i < cfg->hp_outs; i++) { +- unsigned int wid_caps = get_wcaps(codec, cfg->hp_pins[i]); +- if (wid_caps & AC_WCAP_UNSOL_CAP) +- spec->hp_detect = 1; +- nid = snd_hda_codec_read(codec, cfg->hp_pins[i], 0, +- AC_VERB_GET_CONNECT_LIST, 0) & 0xff; +- if (check_in_dac_nids(spec, nid)) +- nid = 0; +- if (! nid) +- continue; +- add_spec_dacs(spec, nid); +- } +- for (i = 0; i < cfg->speaker_outs; i++) { +- nid = snd_hda_codec_read(codec, cfg->speaker_pins[i], 0, +- AC_VERB_GET_CONNECT_LIST, 0) & 0xff; +- if (check_in_dac_nids(spec, nid)) +- nid = 0; +- if (! nid) +- continue; +- add_spec_dacs(spec, nid); +- } +- for (i = 0; i < cfg->line_outs; i++) { +- nid = snd_hda_codec_read(codec, cfg->line_out_pins[i], 0, +- AC_VERB_GET_CONNECT_LIST, 0) & 0xff; +- if (check_in_dac_nids(spec, nid)) +- nid = 0; +- if (! nid) +- continue; +- add_spec_dacs(spec, nid); +- } +- for (i = old_num_dacs; i < spec->multiout.num_dacs; i++) { +- static const char *pfxs[] = { +- "Speaker", "External Speaker", "Speaker2", +- }; +- err = create_controls(codec, pfxs[i - old_num_dacs], +- spec->multiout.dac_nids[i], 3); +- if (err < 0) +- return err; +- } +- if (spec->multiout.hp_nid) { +- err = create_controls(codec, "Headphone", +- spec->multiout.hp_nid, 3); +- if (err < 0) +- return err; +- } ++ err = create_multi_out_ctls(codec, cfg->hp_outs, cfg->hp_pins, ++ spec->hp_dacs, AUTO_PIN_HP_OUT); ++ if (err < 0) ++ return err; ++ ++ err = create_multi_out_ctls(codec, cfg->speaker_outs, cfg->speaker_pins, ++ spec->speaker_dacs, AUTO_PIN_SPEAKER_OUT); ++ if (err < 0) ++ return err; + + return 0; + } +@@ -3458,8 +3468,8 @@ + static int stac92xx_parse_auto_config(struct hda_codec *codec, hda_nid_t dig_out, hda_nid_t dig_in) + { + struct sigmatel_spec *spec = codec->spec; ++ int hp_swap = 0; + int err; +- int hp_speaker_swap = 0; + + if ((err = snd_hda_parse_pin_def_config(codec, + &spec->autocfg, +@@ -3477,13 +3487,16 @@ + * speaker_outs so that the following routines can handle + * HP pins as primary outputs. + */ ++ snd_printdd("stac92xx: Enabling multi-HPs workaround\n"); + memcpy(spec->autocfg.speaker_pins, spec->autocfg.line_out_pins, + sizeof(spec->autocfg.line_out_pins)); + spec->autocfg.speaker_outs = spec->autocfg.line_outs; + memcpy(spec->autocfg.line_out_pins, spec->autocfg.hp_pins, + sizeof(spec->autocfg.hp_pins)); + spec->autocfg.line_outs = spec->autocfg.hp_outs; +- hp_speaker_swap = 1; ++ spec->autocfg.line_out_type = AUTO_PIN_HP_OUT; ++ spec->autocfg.hp_outs = 0; ++ hp_swap = 1; + } + if (spec->autocfg.mono_out_pin) { + int dir = get_wcaps(codec, spec->autocfg.mono_out_pin) & +@@ -3535,10 +3548,9 @@ + AC_PINCTL_OUT_EN); + } + +- if ((err = stac92xx_add_dyn_out_pins(codec, &spec->autocfg)) < 0) +- return err; +- if (spec->multiout.num_dacs == 0) { +- if ((err = stac92xx_auto_fill_dac_nids(codec, &spec->autocfg)) < 0) ++ if (!spec->multiout.num_dacs) { ++ err = stac92xx_auto_fill_dac_nids(codec); ++ if (err < 0) + return err; + err = stac92xx_auto_create_multi_out_ctls(codec, + &spec->autocfg); +@@ -3577,26 +3589,20 @@ + } + #endif + +- if (hp_speaker_swap == 1) { +- /* Restore the hp_outs and line_outs */ +- memcpy(spec->autocfg.hp_pins, spec->autocfg.line_out_pins, +- sizeof(spec->autocfg.line_out_pins)); +- spec->autocfg.hp_outs = spec->autocfg.line_outs; +- memcpy(spec->autocfg.line_out_pins, spec->autocfg.speaker_pins, +- sizeof(spec->autocfg.speaker_pins)); +- spec->autocfg.line_outs = spec->autocfg.speaker_outs; +- memset(spec->autocfg.speaker_pins, 0, +- sizeof(spec->autocfg.speaker_pins)); +- spec->autocfg.speaker_outs = 0; +- } +- + err = stac92xx_auto_create_hp_ctls(codec, &spec->autocfg); +- + if (err < 0) + return err; + +- err = stac92xx_auto_create_analog_input_ctls(codec, &spec->autocfg); ++ /* All output parsing done, now restore the swapped hp pins */ ++ if (hp_swap) { ++ memcpy(spec->autocfg.hp_pins, spec->autocfg.line_out_pins, ++ sizeof(spec->autocfg.hp_pins)); ++ spec->autocfg.hp_outs = spec->autocfg.line_outs; ++ spec->autocfg.line_out_type = AUTO_PIN_HP_OUT; ++ spec->autocfg.line_outs = 0; ++ } + ++ err = stac92xx_auto_create_analog_input_ctls(codec, &spec->autocfg); + if (err < 0) + return err; + +@@ -3638,7 +3644,8 @@ + spec->mixers[spec->num_mixers++] = spec->kctl_alloc; + + spec->input_mux = &spec->private_imux; +- spec->dinput_mux = &spec->private_dimux; ++ if (!spec->dinput_mux) ++ spec->dinput_mux = &spec->private_dimux; + spec->sinput_mux = &spec->private_smux; + spec->mono_mux = &spec->private_mono_mux; + spec->amp_mux = &spec->private_amp_mux; +@@ -3787,13 +3794,68 @@ + AC_VERB_SET_GPIO_DATA, gpiostate); /* sync */ + } + ++static int stac_add_event(struct sigmatel_spec *spec, hda_nid_t nid, ++ unsigned char type, int data) ++{ ++ struct sigmatel_event *event; ++ ++ if (spec->num_events >= ARRAY_SIZE(spec->events)) ++ return -ENOMEM; ++ event = &spec->events[spec->num_events++]; ++ event->nid = nid; ++ event->type = type; ++ event->tag = spec->num_events; ++ event->data = data; ++ ++ return event->tag; ++} ++ ++static struct sigmatel_event *stac_get_event(struct hda_codec *codec, ++ hda_nid_t nid, unsigned char type) ++{ ++ struct sigmatel_spec *spec = codec->spec; ++ struct sigmatel_event *event = spec->events; ++ int i; ++ ++ for (i = 0; i < spec->num_events; i++, event++) { ++ if (event->nid == nid && event->type == type) ++ return event; ++ } ++ return NULL; ++} ++ ++static struct sigmatel_event *stac_get_event_from_tag(struct hda_codec *codec, ++ unsigned char tag) ++{ ++ struct sigmatel_spec *spec = codec->spec; ++ struct sigmatel_event *event = spec->events; ++ int i; ++ ++ for (i = 0; i < spec->num_events; i++, event++) { ++ if (event->tag == tag) ++ return event; ++ } ++ return NULL; ++} ++ + static void enable_pin_detect(struct hda_codec *codec, hda_nid_t nid, +- unsigned int event) ++ unsigned int type) + { +- if (get_wcaps(codec, nid) & AC_WCAP_UNSOL_CAP) +- snd_hda_codec_write_cache(codec, nid, 0, +- AC_VERB_SET_UNSOLICITED_ENABLE, +- (AC_USRSP_EN | event)); ++ struct sigmatel_event *event; ++ int tag; ++ ++ if (!(get_wcaps(codec, nid) & AC_WCAP_UNSOL_CAP)) ++ return; ++ event = stac_get_event(codec, nid, type); ++ if (event) ++ tag = event->tag; ++ else ++ tag = stac_add_event(codec->spec, nid, type, 0); ++ if (tag < 0) ++ return; ++ snd_hda_codec_write_cache(codec, nid, 0, ++ AC_VERB_SET_UNSOLICITED_ENABLE, ++ AC_USRSP_EN | tag); + } + + static int is_nid_hp_pin(struct auto_pin_cfg *cfg, hda_nid_t nid) +@@ -3813,9 +3875,8 @@ + /* power down inactive DACs */ + hda_nid_t *dac; + for (dac = spec->dac_list; *dac; dac++) +- if (!is_in_dac_nids(spec, *dac) && +- spec->multiout.hp_nid != *dac) +- snd_hda_codec_write_cache(codec, *dac, 0, ++ if (!check_all_dac_nids(spec, *dac)) ++ snd_hda_codec_write(codec, *dac, 0, + AC_VERB_SET_POWER_STATE, AC_PWRST_D3); + } + +@@ -3834,7 +3895,7 @@ + /* power down adcs initially */ + if (spec->powerdown_adcs) + for (i = 0; i < spec->num_adcs; i++) +- snd_hda_codec_write_cache(codec, ++ snd_hda_codec_write(codec, + spec->adc_nids[i], 0, + AC_VERB_SET_POWER_STATE, AC_PWRST_D3); + +@@ -3850,37 +3911,51 @@ + /* set up pins */ + if (spec->hp_detect) { + /* Enable unsolicited responses on the HP widget */ +- for (i = 0; i < cfg->hp_outs; i++) +- enable_pin_detect(codec, cfg->hp_pins[i], +- STAC_HP_EVENT); ++ for (i = 0; i < cfg->hp_outs; i++) { ++ hda_nid_t nid = cfg->hp_pins[i]; ++ enable_pin_detect(codec, nid, STAC_HP_EVENT); ++ } + /* force to enable the first line-out; the others are set up + * in unsol_event + */ + stac92xx_auto_set_pinctl(codec, spec->autocfg.line_out_pins[0], + AC_PINCTL_OUT_EN); +- stac92xx_auto_init_hp_out(codec); + /* fake event to set up pins */ +- codec->patch_ops.unsol_event(codec, STAC_HP_EVENT << 26); ++ stac_issue_unsol_event(codec, spec->autocfg.hp_pins[0], ++ STAC_HP_EVENT); + } else { + stac92xx_auto_init_multi_out(codec); + stac92xx_auto_init_hp_out(codec); ++ for (i = 0; i < cfg->hp_outs; i++) ++ stac_toggle_power_map(codec, cfg->hp_pins[i], 1); + } + for (i = 0; i < AUTO_PIN_LAST; i++) { + hda_nid_t nid = cfg->input_pins[i]; + if (nid) { +- unsigned int pinctl; ++ unsigned int pinctl, conf; + if (i == AUTO_PIN_MIC || i == AUTO_PIN_FRONT_MIC) { + /* for mic pins, force to initialize */ + pinctl = stac92xx_get_vref(codec, nid); ++ pinctl |= AC_PINCTL_IN_EN; ++ stac92xx_auto_set_pinctl(codec, nid, pinctl); + } else { + pinctl = snd_hda_codec_read(codec, nid, 0, + AC_VERB_GET_PIN_WIDGET_CONTROL, 0); + /* if PINCTL already set then skip */ +- if (pinctl & AC_PINCTL_IN_EN) +- continue; ++ if (!(pinctl & AC_PINCTL_IN_EN)) { ++ pinctl |= AC_PINCTL_IN_EN; ++ stac92xx_auto_set_pinctl(codec, nid, ++ pinctl); ++ } ++ } ++ conf = snd_hda_codec_read(codec, nid, 0, ++ AC_VERB_GET_CONFIG_DEFAULT, 0); ++ if (get_defcfg_connect(conf) != AC_JACK_PORT_FIXED) { ++ enable_pin_detect(codec, nid, ++ STAC_INSERT_EVENT); ++ stac_issue_unsol_event(codec, nid, ++ STAC_INSERT_EVENT); + } +- pinctl |= AC_PINCTL_IN_EN; +- stac92xx_auto_set_pinctl(codec, nid, pinctl); + } + } + for (i = 0; i < spec->num_dmics; i++) +@@ -3895,9 +3970,14 @@ + for (i = 0; i < spec->num_pwrs; i++) { + hda_nid_t nid = spec->pwr_nids[i]; + int pinctl, def_conf; +- int event = STAC_PWR_EVENT; + +- if (is_nid_hp_pin(cfg, nid) && spec->hp_detect) ++ /* power on when no jack detection is available */ ++ if (!spec->hp_detect) { ++ stac_toggle_power_map(codec, nid, 1); ++ continue; ++ } ++ ++ if (is_nid_hp_pin(cfg, nid)) + continue; /* already has an unsol event */ + + pinctl = snd_hda_codec_read(codec, nid, 0, +@@ -3906,8 +3986,10 @@ + * any attempts on powering down a input port cause the + * referenced VREF to act quirky. + */ +- if (pinctl & AC_PINCTL_IN_EN) ++ if (pinctl & AC_PINCTL_IN_EN) { ++ stac_toggle_power_map(codec, nid, 1); + continue; ++ } + def_conf = snd_hda_codec_read(codec, nid, 0, + AC_VERB_GET_CONFIG_DEFAULT, 0); + def_conf = get_defcfg_connect(def_conf); +@@ -3918,8 +4000,10 @@ + stac_toggle_power_map(codec, nid, 1); + continue; + } +- enable_pin_detect(codec, spec->pwr_nids[i], event | i); +- codec->patch_ops.unsol_event(codec, (event | i) << 26); ++ if (!stac_get_event(codec, nid, STAC_INSERT_EVENT)) { ++ enable_pin_detect(codec, nid, STAC_PWR_EVENT); ++ stac_issue_unsol_event(codec, nid, STAC_PWR_EVENT); ++ } + } + if (spec->dac_list) + stac92xx_power_down(codec); +@@ -3960,11 +4044,7 @@ + * "xxx as Output" mixer switch + */ + struct sigmatel_spec *spec = codec->spec; +- struct auto_pin_cfg *cfg = &spec->autocfg; +- if ((nid == cfg->input_pins[AUTO_PIN_LINE] && +- spec->line_switch) || +- (nid == cfg->input_pins[AUTO_PIN_MIC] && +- spec->mic_switch)) ++ if (nid == spec->line_switch || nid == spec->mic_switch) + return; + } + +@@ -3988,20 +4068,13 @@ + pin_ctl & ~flag); + } + +-static int get_hp_pin_presence(struct hda_codec *codec, hda_nid_t nid) ++static int get_pin_presence(struct hda_codec *codec, hda_nid_t nid) + { + if (!nid) + return 0; + if (snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_PIN_SENSE, 0x00) +- & (1 << 31)) { +- unsigned int pinctl; +- pinctl = snd_hda_codec_read(codec, nid, 0, +- AC_VERB_GET_PIN_WIDGET_CONTROL, 0); +- if (pinctl & AC_PINCTL_IN_EN) +- return 0; /* mic- or line-input */ +- else +- return 1; /* HP-output */ +- } ++ & (1 << 31)) ++ return 1; + return 0; + } + +@@ -4013,11 +4086,9 @@ + struct auto_pin_cfg *cfg = &spec->autocfg; + + /* ignore sensing of shared line and mic jacks */ +- if (spec->line_switch && +- cfg->hp_pins[i] == cfg->input_pins[AUTO_PIN_LINE]) ++ if (cfg->hp_pins[i] == spec->line_switch) + return 1; +- if (spec->mic_switch && +- cfg->hp_pins[i] == cfg->input_pins[AUTO_PIN_MIC]) ++ if (cfg->hp_pins[i] == spec->mic_switch) + return 1; + /* ignore if the pin is set as line-out */ + if (cfg->hp_pins[i] == spec->hp_switch) +@@ -4025,7 +4096,7 @@ + return 0; + } + +-static void stac92xx_hp_detect(struct hda_codec *codec, unsigned int res) ++static void stac92xx_hp_detect(struct hda_codec *codec) + { + struct sigmatel_spec *spec = codec->spec; + struct auto_pin_cfg *cfg = &spec->autocfg; +@@ -4041,7 +4112,14 @@ + break; + if (no_hp_sensing(spec, i)) + continue; +- presence = get_hp_pin_presence(codec, cfg->hp_pins[i]); ++ presence = get_pin_presence(codec, cfg->hp_pins[i]); ++ if (presence) { ++ unsigned int pinctl; ++ pinctl = snd_hda_codec_read(codec, cfg->hp_pins[i], 0, ++ AC_VERB_GET_PIN_WIDGET_CONTROL, 0); ++ if (pinctl & AC_PINCTL_IN_EN) ++ presence = 0; /* mic- or line-input */ ++ } + } + + if (presence) { +@@ -4082,8 +4160,19 @@ + continue; + if (presence) + stac92xx_set_pinctl(codec, cfg->hp_pins[i], val); ++#if 0 /* FIXME */ ++/* Resetting the pinctl like below may lead to (a sort of) regressions ++ * on some devices since they use the HP pin actually for line/speaker ++ * outs although the default pin config shows a different pin (that is ++ * wrong and useless). ++ * ++ * So, it's basically a problem of default pin configs, likely a BIOS issue. ++ * But, disabling the code below just works around it, and I'm too tired of ++ * bug reports with such devices... ++ */ + else + stac92xx_reset_pinctl(codec, cfg->hp_pins[i], val); ++#endif /* FIXME */ + } + } + +@@ -4118,30 +4207,45 @@ + + static void stac92xx_pin_sense(struct hda_codec *codec, hda_nid_t nid) + { +- stac_toggle_power_map(codec, nid, get_hp_pin_presence(codec, nid)); ++ stac_toggle_power_map(codec, nid, get_pin_presence(codec, nid)); ++} ++ ++static void stac_issue_unsol_event(struct hda_codec *codec, hda_nid_t nid, ++ unsigned char type) ++{ ++ struct sigmatel_event *event = stac_get_event(codec, nid, type); ++ if (!event) ++ return; ++ codec->patch_ops.unsol_event(codec, (unsigned)event->tag << 26); + } + + static void stac92xx_unsol_event(struct hda_codec *codec, unsigned int res) + { + struct sigmatel_spec *spec = codec->spec; +- int idx = res >> 26 & 0x0f; ++ struct sigmatel_event *event; ++ int tag, data; ++ ++ tag = (res >> 26) & 0x7f; ++ event = stac_get_event_from_tag(codec, tag); ++ if (!event) ++ return; + +- switch ((res >> 26) & 0x70) { ++ switch (event->type) { + case STAC_HP_EVENT: +- stac92xx_hp_detect(codec, res); ++ stac92xx_hp_detect(codec); + /* fallthru */ ++ case STAC_INSERT_EVENT: + case STAC_PWR_EVENT: + if (spec->num_pwrs > 0) +- stac92xx_pin_sense(codec, idx); ++ stac92xx_pin_sense(codec, event->nid); + break; +- case STAC_VREF_EVENT: { +- int data = snd_hda_codec_read(codec, codec->afg, 0, +- AC_VERB_GET_GPIO_DATA, 0); ++ case STAC_VREF_EVENT: ++ data = snd_hda_codec_read(codec, codec->afg, 0, ++ AC_VERB_GET_GPIO_DATA, 0); + /* toggle VREF state based on GPIOx status */ + snd_hda_codec_write(codec, codec->afg, 0, 0x7e0, +- !!(data & (1 << idx))); ++ !!(data & (1 << event->data))); + break; +- } + } + } + +@@ -4151,17 +4255,23 @@ + struct sigmatel_spec *spec = codec->spec; + + stac92xx_set_config_regs(codec); +- snd_hda_sequence_write(codec, spec->init); +- stac_gpio_set(codec, spec->gpio_mask, +- spec->gpio_dir, spec->gpio_data); ++ stac92xx_init(codec); + snd_hda_codec_resume_amp(codec); + snd_hda_codec_resume_cache(codec); +- /* power down inactive DACs */ +- if (spec->dac_list) +- stac92xx_power_down(codec); +- /* invoke unsolicited event to reset the HP state */ ++ /* fake event to set up pins again to override cached values */ + if (spec->hp_detect) +- codec->patch_ops.unsol_event(codec, STAC_HP_EVENT << 26); ++ stac_issue_unsol_event(codec, spec->autocfg.hp_pins[0], ++ STAC_HP_EVENT); ++ return 0; ++} ++ ++static int stac92xx_suspend(struct hda_codec *codec, pm_message_t state) ++{ ++ struct sigmatel_spec *spec = codec->spec; ++ if (spec->eapd_mask) ++ stac_gpio_set(codec, spec->gpio_mask, ++ spec->gpio_dir, spec->gpio_data & ++ ~spec->eapd_mask); + return 0; + } + #endif +@@ -4173,6 +4283,7 @@ + .free = stac92xx_free, + .unsol_event = stac92xx_unsol_event, + #ifdef SND_HDA_NEEDS_RESUME ++ .suspend = stac92xx_suspend, + .resume = stac92xx_resume, + #endif + }; +@@ -4234,6 +4345,12 @@ + return err; + } + ++ /* CF-74 has no headphone detection, and the driver should *NOT* ++ * do detection and HP/speaker toggle because the hardware does it. ++ */ ++ if (spec->board_config == STAC_9200_PANASONIC) ++ spec->hp_detect = 0; ++ + codec->patch_ops = stac92xx_patch_ops; + + return 0; +@@ -4340,6 +4457,7 @@ + struct sigmatel_spec *spec; + hda_nid_t conn[STAC92HD73_DAC_COUNT + 2]; + int err = 0; ++ int num_dacs; + + spec = kzalloc(sizeof(*spec), GFP_KERNEL); + if (spec == NULL) +@@ -4368,33 +4486,29 @@ + stac92xx_set_config_regs(codec); + } + +- spec->multiout.num_dacs = snd_hda_get_connections(codec, 0x0a, ++ num_dacs = snd_hda_get_connections(codec, 0x0a, + conn, STAC92HD73_DAC_COUNT + 2) - 1; + +- if (spec->multiout.num_dacs < 0) { ++ if (num_dacs < 3 || num_dacs > 5) { + printk(KERN_WARNING "hda_codec: Could not determine " + "number of channels defaulting to DAC count\n"); +- spec->multiout.num_dacs = STAC92HD73_DAC_COUNT; ++ num_dacs = STAC92HD73_DAC_COUNT; + } +- +- switch (spec->multiout.num_dacs) { ++ switch (num_dacs) { + case 0x3: /* 6 Channel */ +- spec->multiout.hp_nid = 0x17; + spec->mixer = stac92hd73xx_6ch_mixer; + spec->init = stac92hd73xx_6ch_core_init; + break; + case 0x4: /* 8 Channel */ +- spec->multiout.hp_nid = 0x18; + spec->mixer = stac92hd73xx_8ch_mixer; + spec->init = stac92hd73xx_8ch_core_init; + break; + case 0x5: /* 10 Channel */ +- spec->multiout.hp_nid = 0x19; + spec->mixer = stac92hd73xx_10ch_mixer; + spec->init = stac92hd73xx_10ch_core_init; +- }; ++ } ++ spec->multiout.dac_nids = spec->dac_nids; + +- spec->multiout.dac_nids = stac92hd73xx_dac_nids; + spec->aloopback_mask = 0x01; + spec->aloopback_shift = 8; + +@@ -4425,9 +4539,8 @@ + spec->amp_nids = &stac92hd73xx_amp_nids[DELL_M6_AMP]; + spec->eapd_switch = 0; + spec->num_amps = 1; +- spec->multiout.hp_nid = 0; /* dual HPs */ + +- if (!spec->init) ++ if (spec->board_config != STAC_DELL_EQ) + spec->init = dell_m6_core_init; + switch (spec->board_config) { + case STAC_DELL_M6_AMIC: /* Analog Mics */ +@@ -4500,7 +4613,9 @@ + static int patch_stac92hd83xxx(struct hda_codec *codec) + { + struct sigmatel_spec *spec; ++ hda_nid_t conn[STAC92HD83_DAC_COUNT + 1]; + int err; ++ int num_dacs; + + spec = kzalloc(sizeof(*spec), GFP_KERNEL); + if (spec == NULL) +@@ -4514,25 +4629,25 @@ + spec->dmux_nids = stac92hd83xxx_dmux_nids; + spec->adc_nids = stac92hd83xxx_adc_nids; + spec->pwr_nids = stac92hd83xxx_pwr_nids; ++ spec->amp_nids = stac92hd83xxx_amp_nids; + spec->pwr_mapping = stac92hd83xxx_pwr_mapping; + spec->num_pwrs = ARRAY_SIZE(stac92hd83xxx_pwr_nids); +- spec->multiout.dac_nids = stac92hd83xxx_dac_nids; ++ spec->multiout.dac_nids = spec->dac_nids; + +- spec->init = stac92hd83xxx_core_init; +- switch (codec->vendor_id) { +- case 0x111d7605: +- spec->multiout.num_dacs = STAC92HD81_DAC_COUNT; +- break; +- default: +- spec->num_pwrs--; +- spec->init++; /* switch to config #2 */ +- spec->multiout.num_dacs = STAC92HD83_DAC_COUNT; +- } ++ /* set port 0xe to select the last DAC ++ */ ++ num_dacs = snd_hda_get_connections(codec, 0x0e, ++ conn, STAC92HD83_DAC_COUNT + 1) - 1; ++ ++ snd_hda_codec_write_cache(codec, 0xe, 0, ++ AC_VERB_SET_CONNECT_SEL, num_dacs); + ++ spec->init = stac92hd83xxx_core_init; + spec->mixer = stac92hd83xxx_mixer; + spec->num_pins = ARRAY_SIZE(stac92hd83xxx_pin_nids); + spec->num_dmuxes = ARRAY_SIZE(stac92hd83xxx_dmux_nids); + spec->num_adcs = ARRAY_SIZE(stac92hd83xxx_adc_nids); ++ spec->num_amps = ARRAY_SIZE(stac92hd83xxx_amp_nids); + spec->num_dmics = STAC92HD83XXX_NUM_DMICS; + spec->dinput_mux = &stac92hd83xxx_dmux; + spec->pin_nids = stac92hd83xxx_pin_nids; +@@ -4555,6 +4670,15 @@ + stac92xx_set_config_regs(codec); + } + ++ switch (codec->vendor_id) { ++ case 0x111d7604: ++ case 0x111d7605: ++ if (spec->board_config == STAC_92HD83XXX_PWR_REF) ++ break; ++ spec->num_pwrs = 0; ++ break; ++ } ++ + err = stac92xx_parse_auto_config(codec, 0x1d, 0); + if (!err) { + if (spec->board_config < 0) { +@@ -4576,54 +4700,6 @@ + return 0; + } + +-#ifdef SND_HDA_NEEDS_RESUME +-static void stac92hd71xx_set_power_state(struct hda_codec *codec, int pwr) +-{ +- struct sigmatel_spec *spec = codec->spec; +- int i; +- snd_hda_codec_write_cache(codec, codec->afg, 0, +- AC_VERB_SET_POWER_STATE, pwr); +- +- msleep(1); +- for (i = 0; i < spec->num_adcs; i++) { +- snd_hda_codec_write_cache(codec, +- spec->adc_nids[i], 0, +- AC_VERB_SET_POWER_STATE, pwr); +- } +-}; +- +-static int stac92hd71xx_resume(struct hda_codec *codec) +-{ +- stac92hd71xx_set_power_state(codec, AC_PWRST_D0); +- return stac92xx_resume(codec); +-} +- +-static int stac92hd71xx_suspend(struct hda_codec *codec, pm_message_t state) +-{ +- struct sigmatel_spec *spec = codec->spec; +- +- stac92hd71xx_set_power_state(codec, AC_PWRST_D3); +- if (spec->eapd_mask) +- stac_gpio_set(codec, spec->gpio_mask, +- spec->gpio_dir, spec->gpio_data & +- ~spec->eapd_mask); +- return 0; +-}; +- +-#endif +- +-static struct hda_codec_ops stac92hd71bxx_patch_ops = { +- .build_controls = stac92xx_build_controls, +- .build_pcms = stac92xx_build_pcms, +- .init = stac92xx_init, +- .free = stac92xx_free, +- .unsol_event = stac92xx_unsol_event, +-#ifdef SND_HDA_NEEDS_RESUME +- .resume = stac92hd71xx_resume, +- .suspend = stac92hd71xx_suspend, +-#endif +-}; +- + static struct hda_input_mux stac92hd71bxx_dmux = { + .num_items = 4, + .items = { +@@ -4689,21 +4765,21 @@ + switch (spec->board_config) { + case STAC_HP_M4: + /* Enable VREF power saving on GPIO1 detect */ ++ err = stac_add_event(spec, codec->afg, ++ STAC_VREF_EVENT, 0x02); ++ if (err < 0) ++ return err; + snd_hda_codec_write_cache(codec, codec->afg, 0, + AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x02); + snd_hda_codec_write_cache(codec, codec->afg, 0, +- AC_VERB_SET_UNSOLICITED_ENABLE, +- (AC_USRSP_EN | STAC_VREF_EVENT | 0x01)); ++ AC_VERB_SET_UNSOLICITED_ENABLE, ++ AC_USRSP_EN | err); + spec->gpio_mask |= 0x02; + break; + } + if ((codec->revision_id & 0xf) == 0 || +- (codec->revision_id & 0xf) == 1) { +-#ifdef SND_HDA_NEEDS_RESUME +- codec->patch_ops = stac92hd71bxx_patch_ops; +-#endif ++ (codec->revision_id & 0xf) == 1) + spec->stream_delay = 40; /* 40 milliseconds */ +- } + + /* no output amps */ + spec->num_pwrs = 0; +@@ -4715,12 +4791,8 @@ + stac92xx_set_config_reg(codec, 0xf, 0x40f000f0); + break; + case 0x111d7603: /* 6 Port with Analog Mixer */ +- if ((codec->revision_id & 0xf) == 1) { +-#ifdef SND_HDA_NEEDS_RESUME +- codec->patch_ops = stac92hd71bxx_patch_ops; +-#endif ++ if ((codec->revision_id & 0xf) == 1) + spec->stream_delay = 40; /* 40 milliseconds */ +- } + + /* no output amps */ + spec->num_pwrs = 0; +@@ -4763,7 +4835,7 @@ + case STAC_DELL_M4_3: + spec->num_dmics = 1; + spec->num_smuxes = 0; +- spec->num_dmuxes = 0; ++ spec->num_dmuxes = 1; + break; + default: + spec->num_dmics = STAC92HD71BXX_NUM_DMICS; +@@ -4771,9 +4843,7 @@ + spec->num_dmuxes = ARRAY_SIZE(stac92hd71bxx_dmux_nids); + }; + +- spec->multiout.num_dacs = 1; +- spec->multiout.hp_nid = 0x11; +- spec->multiout.dac_nids = stac92hd71bxx_dac_nids; ++ spec->multiout.dac_nids = spec->dac_nids; + if (spec->dinput_mux) + spec->private_dimux.num_items += + spec->num_dmics - +@@ -5097,11 +5167,14 @@ + stac92xx_set_config_reg(codec, 0x20, 0x1c410030); + + /* Enable unsol response for GPIO4/Dock HP connection */ ++ err = stac_add_event(spec, codec->afg, STAC_VREF_EVENT, 0x01); ++ if (err < 0) ++ return err; + snd_hda_codec_write_cache(codec, codec->afg, 0, + AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x10); + snd_hda_codec_write_cache(codec, codec->afg, 0, + AC_VERB_SET_UNSOLICITED_ENABLE, +- (AC_USRSP_EN | STAC_HP_EVENT)); ++ AC_USRSP_EN | err); + + spec->gpio_dir = 0x0b; + spec->eapd_mask = 0x01; +@@ -5275,7 +5348,7 @@ + + static void stac9872_vaio_hp_detect(struct hda_codec *codec, unsigned int res) + { +- if (get_hp_pin_presence(codec, 0x0a)) { ++ if (get_pin_presence(codec, 0x0a)) { + stac92xx_reset_pinctl(codec, 0x0f, AC_PINCTL_OUT_EN); + stac92xx_set_pinctl(codec, 0x0a, AC_PINCTL_OUT_EN); + } else { +diff -urN linux-2.6.27.19-5.1/sound/pci/mixart/mixart.c linux-2.6.27.23-0.1.1/sound/pci/mixart/mixart.c +--- linux-2.6.27.19-5.1/sound/pci/mixart/mixart.c 2009-06-16 13:54:10.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/sound/pci/mixart/mixart.c 2009-06-16 13:40:23.000000000 +0100 +@@ -607,6 +607,7 @@ + /* set the format to the board */ + err = mixart_set_format(stream, format); + if(err < 0) { ++ mutex_unlock(&mgr->setup_mutex); + return err; + } + +diff -urN linux-2.6.27.19-5.1/sound/pci/oxygen/virtuoso.c linux-2.6.27.23-0.1.1/sound/pci/oxygen/virtuoso.c +--- linux-2.6.27.19-5.1/sound/pci/oxygen/virtuoso.c 2009-06-16 13:54:10.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/sound/pci/oxygen/virtuoso.c 2009-06-16 13:40:23.000000000 +0100 +@@ -26,7 +26,7 @@ + * SPI 0 -> 1st PCM1796 (front) + * SPI 1 -> 2nd PCM1796 (surround) + * SPI 2 -> 3rd PCM1796 (center/LFE) +- * SPI 4 -> 4th PCM1796 (back) and EEPROM self-destruct (do not use!) ++ * SPI 4 -> 4th PCM1796 (back) + * + * GPIO 2 -> M0 of CS5381 + * GPIO 3 -> M1 of CS5381 +@@ -142,12 +142,6 @@ + static void pcm1796_write(struct oxygen *chip, unsigned int codec, + u8 reg, u8 value) + { +- /* +- * We don't want to do writes on SPI 4 because the EEPROM, which shares +- * the same pin, might get confused and broken. We'd better take care +- * that the driver works with the default register values ... +- */ +-#if 0 + /* maps ALSA channel pair number to SPI output */ + static const u8 codec_map[4] = { + 0, 1, 2, 4 +@@ -158,7 +152,6 @@ + (codec_map[codec] << OXYGEN_SPI_CODEC_SHIFT) | + OXYGEN_SPI_CEN_LATCH_CLOCK_HI, + (reg << 8) | value); +-#endif + } + + static void cs4398_write(struct oxygen *chip, u8 reg, u8 value) +@@ -546,9 +539,6 @@ + + static int xonar_d2_control_filter(struct snd_kcontrol_new *template) + { +- if (!strncmp(template->name, "Master Playback ", 16)) +- /* disable volume/mute because they would require SPI writes */ +- return 1; + if (!strncmp(template->name, "CD Capture ", 11)) + /* CD in is actually connected to the video in pin */ + template->private_value ^= AC97_CD ^ AC97_VIDEO; +@@ -598,8 +588,9 @@ + .dac_volume_min = 0x0f, + .dac_volume_max = 0xff, + .misc_flags = OXYGEN_MISC_MIDI, +- .function_flags = OXYGEN_FUNCTION_SPI, +- .dac_i2s_format = OXYGEN_I2S_FORMAT_I2S, ++ .function_flags = OXYGEN_FUNCTION_SPI | ++ OXYGEN_FUNCTION_ENABLE_SPI_4_5, ++ .dac_i2s_format = OXYGEN_I2S_FORMAT_LJUST, + .adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST, + }, + [MODEL_D2X] = { +@@ -628,8 +619,9 @@ + .dac_volume_min = 0x0f, + .dac_volume_max = 0xff, + .misc_flags = OXYGEN_MISC_MIDI, +- .function_flags = OXYGEN_FUNCTION_SPI, +- .dac_i2s_format = OXYGEN_I2S_FORMAT_I2S, ++ .function_flags = OXYGEN_FUNCTION_SPI | ++ OXYGEN_FUNCTION_ENABLE_SPI_4_5, ++ .dac_i2s_format = OXYGEN_I2S_FORMAT_LJUST, + .adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST, + }, + [MODEL_D1] = { +diff -urN linux-2.6.27.19-5.1/sound/usb/usbaudio.c linux-2.6.27.23-0.1.1/sound/usb/usbaudio.c +--- linux-2.6.27.19-5.1/sound/usb/usbaudio.c 2009-06-16 13:54:10.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/sound/usb/usbaudio.c 2009-06-16 13:40:23.000000000 +0100 +@@ -2516,7 +2516,6 @@ + * build the rate table and bitmap flags + */ + int r, idx; +- unsigned int nonzero_rates = 0; + + fp->rate_table = kmalloc(sizeof(int) * nr_rates, GFP_KERNEL); + if (fp->rate_table == NULL) { +@@ -2524,24 +2523,27 @@ + return -1; + } + +- fp->nr_rates = nr_rates; +- fp->rate_min = fp->rate_max = combine_triple(&fmt[8]); ++ fp->nr_rates = 0; ++ fp->rate_min = fp->rate_max = 0; + for (r = 0, idx = offset + 1; r < nr_rates; r++, idx += 3) { + unsigned int rate = combine_triple(&fmt[idx]); ++ if (!rate) ++ continue; + /* C-Media CM6501 mislabels its 96 kHz altsetting */ + if (rate == 48000 && nr_rates == 1 && +- chip->usb_id == USB_ID(0x0d8c, 0x0201) && ++ (chip->usb_id == USB_ID(0x0d8c, 0x0201) || ++ chip->usb_id == USB_ID(0x0d8c, 0x0102)) && + fp->altsetting == 5 && fp->maxpacksize == 392) + rate = 96000; +- fp->rate_table[r] = rate; +- nonzero_rates |= rate; +- if (rate < fp->rate_min) ++ fp->rate_table[fp->nr_rates] = rate; ++ if (!fp->rate_min || rate < fp->rate_min) + fp->rate_min = rate; +- else if (rate > fp->rate_max) ++ if (!fp->rate_max || rate > fp->rate_max) + fp->rate_max = rate; + fp->rates |= snd_pcm_rate_to_rate_bit(rate); ++ fp->nr_rates++; + } +- if (!nonzero_rates) { ++ if (!fp->nr_rates) { + hwc_debug("All rates were zero. Skipping format!\n"); + return -1; + } +diff -urN linux-2.6.27.19-5.1/sound/usb/usbmidi.c linux-2.6.27.23-0.1.1/sound/usb/usbmidi.c +--- linux-2.6.27.19-5.1/sound/usb/usbmidi.c 2009-06-16 13:54:10.000000000 +0100 ++++ linux-2.6.27.23-0.1.1/sound/usb/usbmidi.c 2009-06-16 13:40:23.000000000 +0100 +@@ -1583,6 +1583,7 @@ + } + + ep_info.out_ep = get_endpoint(hostif, 2)->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK; ++ ep_info.out_interval = 0; + ep_info.out_cables = endpoint->out_cables & 0x5555; + err = snd_usbmidi_out_endpoint_create(umidi, &ep_info, &umidi->endpoints[0]); + if (err < 0) +--- a/buildconfigs/Rules.mk Wed May 06 15:47:13 2009 +0100 ++++ b/buildconfigs/Rules.mk Wed May 06 16:56:12 2009 +0100 +@@ -2,7 +2,7 @@ + XEN_TARGET_X86_PAE ?= y + + LINUX_SERIES = 2.6 +-LINUX_VER = 2.6.27.19-5.1 ++LINUX_VER = 2.6.27.23-0.1.1 + + EXTRAVERSION ?= xen + diff --git a/master/mpt2sas-01.255.04.00.patch b/master/mpt2sas-01.255.04.00.patch new file mode 100644 index 0000000..2da5227 --- /dev/null +++ b/master/mpt2sas-01.255.04.00.patch @@ -0,0 +1,25139 @@ +diff -r e02b4006a7c8 drivers/scsi/mpt2sas/Kconfig +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/scsi/mpt2sas/Kconfig Wed Jul 01 09:49:59 2009 +0100 +@@ -0,0 +1,66 @@ ++# ++# Kernel configuration file for the MPT2SAS ++# ++# This code is based on drivers/scsi/mpt2sas/Kconfig ++# Copyright (C) 2007-2008 LSI Corporation ++# (mailto:DL-MPTFusionLinux@lsi.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. ++ ++# NO WARRANTY ++# THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR ++# CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT ++# LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, ++# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is ++# solely responsible for determining the appropriateness of using and ++# distributing the Program and assumes all risks associated with its ++# exercise of rights under this Agreement, including but not limited to ++# the risks and costs of program errors, damage to or loss of data, ++# programs or equipment, and unavailability or interruption of operations. ++ ++# DISCLAIMER OF LIABILITY ++# NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY ++# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ++# DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), 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 OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED ++# HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES ++ ++# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, ++# USA. ++ ++config SCSI_MPT2SAS ++ tristate "LSI MPT Fusion SAS 2.0 Device Driver" ++ depends on PCI && SCSI ++ select SCSI_SAS_ATTRS ++ ---help--- ++ This driver supports PCI-Express SAS 6Gb/s Host Adapters. ++ ++config SCSI_MPT2SAS_MAX_SGE ++ int "LSI MPT Fusion Max number of SG Entries (16 - 128)" ++ depends on PCI && SCSI && SCSI_MPT2SAS ++ default "128" ++ range 16 128 ++ ---help--- ++ This option allows you to specify the maximum number of scatter- ++ gather entries per I/O. The driver default is 128, which matches ++ SAFE_PHYS_SEGMENTS. However, it may decreased down to 16. ++ Decreasing this parameter will reduce memory requirements ++ on a per controller instance. ++ ++config SCSI_MPT2SAS_LOGGING ++ bool "LSI MPT Fusion logging facility" ++ depends on PCI && SCSI && SCSI_MPT2SAS ++ ---help--- ++ This turns on a logging facility. +diff -r e02b4006a7c8 drivers/scsi/mpt2sas/Makefile +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/scsi/mpt2sas/Makefile Wed Jul 01 09:49:59 2009 +0100 +@@ -0,0 +1,14 @@ ++# mpt2sas makefile ++ ++# event logging support ++EXTRA_CFLAGS += -DCONFIG_SCSI_MPT2SAS_LOGGING ++ ++# utilizing chain pool instead of dedicated chains ++#EXTRA_CFLAGS += -DCHAIN_POOL ++ ++obj-$(CONFIG_SCSI_MPT2SAS) += mpt2sas.o ++mpt2sas-y += mpt2sas_base.o \ ++ mpt2sas_config.o \ ++ mpt2sas_scsih.o \ ++ mpt2sas_transport.o \ ++ mpt2sas_ctl.o +diff -r e02b4006a7c8 drivers/scsi/mpt2sas/mpi/.copyarea.db +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/scsi/mpt2sas/mpi/.copyarea.db Wed Jul 01 09:49:59 2009 +0100 +@@ -0,0 +1,14 @@ ++ClearCase CopyAreaDB|4 ++sas2_drv/mpt2sas/mpi ++2 ++a ++a:mpi2_sas.h|1|12025dcce68|334b|ca3600e0|a2b1036283134f29a0c114c045461ae1|0 ++10:mpi2_history.txt|1|12025dcce68|450e|99167003|4d701d3de14f46298b9695bf74267553|0 ++6:mpi2.h|1|12025dcce68|ac4c|a0dc971f|89e12deadaab4182948f74c3605ecea2|0 ++b:mpi2_raid.h|1|12025dcce68|3537|79494b61|49c45f50e8424b419d17f67da30aacf6|0 ++b:mpi2_targ.h|1|12025dcce68|5800|790c6272|be471f5dd75344c6aec626eb1440aa79|0 ++b:mpi2_tool.h|1|12025dcce68|302b|356b00fc|956d748c22024a72b5d0359a51518fc5|0 ++b:mpi2_type.h|1|1200fc4fbc8|664|6c63907c|d607d9eee2b842cbaae65f99c3b103fa|0 ++b:mpi2_init.h|1|12025dcce68|4f6a|99956bd|5e83d076242e4f289ff04f1b1d2ae824|0 ++b:mpi2_cnfg.h|1|12025dcce68|19fb3|483dd4d6|37e8cf7e03104e269f932cb5132bc05d|0 ++a:mpi2_ioc.h|1|12025dcce68|fece|86693d79|7d23222fe3e344f982bd80b433dcdc12|0 +diff -r e02b4006a7c8 drivers/scsi/mpt2sas/mpi/mpi2.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/scsi/mpt2sas/mpi/mpi2.h Wed Jul 01 09:49:59 2009 +0100 +@@ -0,0 +1,1067 @@ ++/* ++ * Copyright (c) 2000-2009 LSI Corporation. ++ * ++ * ++ * Name: mpi2.h ++ * Title: MPI Message independent structures and definitions ++ * including System Interface Register Set and ++ * scatter/gather formats. ++ * Creation Date: June 21, 2006 ++ * ++ * mpi2.h Version: 02.00.11 ++ * ++ * Version History ++ * --------------- ++ * ++ * Date Version Description ++ * -------- -------- ------------------------------------------------------ ++ * 04-30-07 02.00.00 Corresponds to Fusion-MPT MPI Specification Rev A. ++ * 06-04-07 02.00.01 Bumped MPI2_HEADER_VERSION_UNIT. ++ * 06-26-07 02.00.02 Bumped MPI2_HEADER_VERSION_UNIT. ++ * 08-31-07 02.00.03 Bumped MPI2_HEADER_VERSION_UNIT. ++ * Moved ReplyPostHostIndex register to offset 0x6C of the ++ * MPI2_SYSTEM_INTERFACE_REGS and modified the define for ++ * MPI2_REPLY_POST_HOST_INDEX_OFFSET. ++ * Added union of request descriptors. ++ * Added union of reply descriptors. ++ * 10-31-07 02.00.04 Bumped MPI2_HEADER_VERSION_UNIT. ++ * Added define for MPI2_VERSION_02_00. ++ * Fixed the size of the FunctionDependent5 field in the ++ * MPI2_DEFAULT_REPLY structure. ++ * 12-18-07 02.00.05 Bumped MPI2_HEADER_VERSION_UNIT. ++ * Removed the MPI-defined Fault Codes and extended the ++ * product specific codes up to 0xEFFF. ++ * Added a sixth key value for the WriteSequence register ++ * and changed the flush value to 0x0. ++ * Added message function codes for Diagnostic Buffer Post ++ * and Diagnsotic Release. ++ * New IOCStatus define: MPI2_IOCSTATUS_DIAGNOSTIC_RELEASED ++ * Moved MPI2_VERSION_UNION from mpi2_ioc.h. ++ * 02-29-08 02.00.06 Bumped MPI2_HEADER_VERSION_UNIT. ++ * 03-03-08 02.00.07 Bumped MPI2_HEADER_VERSION_UNIT. ++ * 05-21-08 02.00.08 Bumped MPI2_HEADER_VERSION_UNIT. ++ * Added #defines for marking a reply descriptor as unused. ++ * 06-27-08 02.00.09 Bumped MPI2_HEADER_VERSION_UNIT. ++ * 10-02-08 02.00.10 Bumped MPI2_HEADER_VERSION_UNIT. ++ * Moved LUN field defines from mpi2_init.h. ++ * 01-19-09 02.00.11 Bumped MPI2_HEADER_VERSION_UNIT. ++ * -------------------------------------------------------------------------- ++ */ ++ ++#ifndef MPI2_H ++#define MPI2_H ++ ++ ++/***************************************************************************** ++* ++* MPI Version Definitions ++* ++*****************************************************************************/ ++ ++#define MPI2_VERSION_MAJOR (0x02) ++#define MPI2_VERSION_MINOR (0x00) ++#define MPI2_VERSION_MAJOR_MASK (0xFF00) ++#define MPI2_VERSION_MAJOR_SHIFT (8) ++#define MPI2_VERSION_MINOR_MASK (0x00FF) ++#define MPI2_VERSION_MINOR_SHIFT (0) ++#define MPI2_VERSION ((MPI2_VERSION_MAJOR << MPI2_VERSION_MAJOR_SHIFT) | \ ++ MPI2_VERSION_MINOR) ++ ++#define MPI2_VERSION_02_00 (0x0200) ++ ++/* versioning for this MPI header set */ ++#define MPI2_HEADER_VERSION_UNIT (0x0B) ++#define MPI2_HEADER_VERSION_DEV (0x00) ++#define MPI2_HEADER_VERSION_UNIT_MASK (0xFF00) ++#define MPI2_HEADER_VERSION_UNIT_SHIFT (8) ++#define MPI2_HEADER_VERSION_DEV_MASK (0x00FF) ++#define MPI2_HEADER_VERSION_DEV_SHIFT (0) ++#define MPI2_HEADER_VERSION ((MPI2_HEADER_VERSION_UNIT << 8) | MPI2_HEADER_VERSION_DEV) ++ ++ ++/***************************************************************************** ++* ++* IOC State Definitions ++* ++*****************************************************************************/ ++ ++#define MPI2_IOC_STATE_RESET (0x00000000) ++#define MPI2_IOC_STATE_READY (0x10000000) ++#define MPI2_IOC_STATE_OPERATIONAL (0x20000000) ++#define MPI2_IOC_STATE_FAULT (0x40000000) ++ ++#define MPI2_IOC_STATE_MASK (0xF0000000) ++#define MPI2_IOC_STATE_SHIFT (28) ++ ++/* Fault state range for prodcut specific codes */ ++#define MPI2_FAULT_PRODUCT_SPECIFIC_MIN (0x0000) ++#define MPI2_FAULT_PRODUCT_SPECIFIC_MAX (0xEFFF) ++ ++ ++/***************************************************************************** ++* ++* System Interface Register Definitions ++* ++*****************************************************************************/ ++ ++typedef volatile struct _MPI2_SYSTEM_INTERFACE_REGS ++{ ++ U32 Doorbell; /* 0x00 */ ++ U32 WriteSequence; /* 0x04 */ ++ U32 HostDiagnostic; /* 0x08 */ ++ U32 Reserved1; /* 0x0C */ ++ U32 DiagRWData; /* 0x10 */ ++ U32 DiagRWAddressLow; /* 0x14 */ ++ U32 DiagRWAddressHigh; /* 0x18 */ ++ U32 Reserved2[5]; /* 0x1C */ ++ U32 HostInterruptStatus; /* 0x30 */ ++ U32 HostInterruptMask; /* 0x34 */ ++ U32 DCRData; /* 0x38 */ ++ U32 DCRAddress; /* 0x3C */ ++ U32 Reserved3[2]; /* 0x40 */ ++ U32 ReplyFreeHostIndex; /* 0x48 */ ++ U32 Reserved4[8]; /* 0x4C */ ++ U32 ReplyPostHostIndex; /* 0x6C */ ++ U32 Reserved5; /* 0x70 */ ++ U32 HCBSize; /* 0x74 */ ++ U32 HCBAddressLow; /* 0x78 */ ++ U32 HCBAddressHigh; /* 0x7C */ ++ U32 Reserved6[16]; /* 0x80 */ ++ U32 RequestDescriptorPostLow; /* 0xC0 */ ++ U32 RequestDescriptorPostHigh; /* 0xC4 */ ++ U32 Reserved7[14]; /* 0xC8 */ ++} MPI2_SYSTEM_INTERFACE_REGS, MPI2_POINTER PTR_MPI2_SYSTEM_INTERFACE_REGS, ++ Mpi2SystemInterfaceRegs_t, MPI2_POINTER pMpi2SystemInterfaceRegs_t; ++ ++/* ++ * Defines for working with the Doorbell register. ++ */ ++#define MPI2_DOORBELL_OFFSET (0x00000000) ++ ++/* IOC --> System values */ ++#define MPI2_DOORBELL_USED (0x08000000) ++#define MPI2_DOORBELL_WHO_INIT_MASK (0x07000000) ++#define MPI2_DOORBELL_WHO_INIT_SHIFT (24) ++#define MPI2_DOORBELL_FAULT_CODE_MASK (0x0000FFFF) ++#define MPI2_DOORBELL_DATA_MASK (0x0000FFFF) ++ ++/* System --> IOC values */ ++#define MPI2_DOORBELL_FUNCTION_MASK (0xFF000000) ++#define MPI2_DOORBELL_FUNCTION_SHIFT (24) ++#define MPI2_DOORBELL_ADD_DWORDS_MASK (0x00FF0000) ++#define MPI2_DOORBELL_ADD_DWORDS_SHIFT (16) ++ ++ ++/* ++ * Defines for the WriteSequence register ++ */ ++#define MPI2_WRITE_SEQUENCE_OFFSET (0x00000004) ++#define MPI2_WRSEQ_KEY_VALUE_MASK (0x0000000F) ++#define MPI2_WRSEQ_FLUSH_KEY_VALUE (0x0) ++#define MPI2_WRSEQ_1ST_KEY_VALUE (0xF) ++#define MPI2_WRSEQ_2ND_KEY_VALUE (0x4) ++#define MPI2_WRSEQ_3RD_KEY_VALUE (0xB) ++#define MPI2_WRSEQ_4TH_KEY_VALUE (0x2) ++#define MPI2_WRSEQ_5TH_KEY_VALUE (0x7) ++#define MPI2_WRSEQ_6TH_KEY_VALUE (0xD) ++ ++/* ++ * Defines for the HostDiagnostic register ++ */ ++#define MPI2_HOST_DIAGNOSTIC_OFFSET (0x00000008) ++ ++#define MPI2_DIAG_BOOT_DEVICE_SELECT_MASK (0x00001800) ++#define MPI2_DIAG_BOOT_DEVICE_SELECT_DEFAULT (0x00000000) ++#define MPI2_DIAG_BOOT_DEVICE_SELECT_HCDW (0x00000800) ++ ++#define MPI2_DIAG_CLEAR_FLASH_BAD_SIG (0x00000400) ++#define MPI2_DIAG_FORCE_HCB_ON_RESET (0x00000200) ++#define MPI2_DIAG_HCB_MODE (0x00000100) ++#define MPI2_DIAG_DIAG_WRITE_ENABLE (0x00000080) ++#define MPI2_DIAG_FLASH_BAD_SIG (0x00000040) ++#define MPI2_DIAG_RESET_HISTORY (0x00000020) ++#define MPI2_DIAG_DIAG_RW_ENABLE (0x00000010) ++#define MPI2_DIAG_RESET_ADAPTER (0x00000004) ++#define MPI2_DIAG_HOLD_IOC_RESET (0x00000002) ++ ++/* ++ * Offsets for DiagRWData and address ++ */ ++#define MPI2_DIAG_RW_DATA_OFFSET (0x00000010) ++#define MPI2_DIAG_RW_ADDRESS_LOW_OFFSET (0x00000014) ++#define MPI2_DIAG_RW_ADDRESS_HIGH_OFFSET (0x00000018) ++ ++/* ++ * Defines for the HostInterruptStatus register ++ */ ++#define MPI2_HOST_INTERRUPT_STATUS_OFFSET (0x00000030) ++#define MPI2_HIS_SYS2IOC_DB_STATUS (0x80000000) ++#define MPI2_HIS_IOP_DOORBELL_STATUS MPI2_HIS_SYS2IOC_DB_STATUS ++#define MPI2_HIS_RESET_IRQ_STATUS (0x40000000) ++#define MPI2_HIS_REPLY_DESCRIPTOR_INTERRUPT (0x00000008) ++#define MPI2_HIS_IOC2SYS_DB_STATUS (0x00000001) ++#define MPI2_HIS_DOORBELL_INTERRUPT MPI2_HIS_IOC2SYS_DB_STATUS ++ ++/* ++ * Defines for the HostInterruptMask register ++ */ ++#define MPI2_HOST_INTERRUPT_MASK_OFFSET (0x00000034) ++#define MPI2_HIM_RESET_IRQ_MASK (0x40000000) ++#define MPI2_HIM_REPLY_INT_MASK (0x00000008) ++#define MPI2_HIM_RIM MPI2_HIM_REPLY_INT_MASK ++#define MPI2_HIM_IOC2SYS_DB_MASK (0x00000001) ++#define MPI2_HIM_DIM MPI2_HIM_IOC2SYS_DB_MASK ++ ++/* ++ * Offsets for DCRData and address ++ */ ++#define MPI2_DCR_DATA_OFFSET (0x00000038) ++#define MPI2_DCR_ADDRESS_OFFSET (0x0000003C) ++ ++/* ++ * Offset for the Reply Free Queue ++ */ ++#define MPI2_REPLY_FREE_HOST_INDEX_OFFSET (0x00000048) ++ ++/* ++ * Offset for the Reply Descriptor Post Queue ++ */ ++#define MPI2_REPLY_POST_HOST_INDEX_OFFSET (0x0000006C) ++ ++/* ++ * Defines for the HCBSize and address ++ */ ++#define MPI2_HCB_SIZE_OFFSET (0x00000074) ++#define MPI2_HCB_SIZE_SIZE_MASK (0xFFFFF000) ++#define MPI2_HCB_SIZE_HCB_ENABLE (0x00000001) ++ ++#define MPI2_HCB_ADDRESS_LOW_OFFSET (0x00000078) ++#define MPI2_HCB_ADDRESS_HIGH_OFFSET (0x0000007C) ++ ++/* ++ * Offsets for the Request Queue ++ */ ++#define MPI2_REQUEST_DESCRIPTOR_POST_LOW_OFFSET (0x000000C0) ++#define MPI2_REQUEST_DESCRIPTOR_POST_HIGH_OFFSET (0x000000C4) ++ ++ ++/***************************************************************************** ++* ++* Message Descriptors ++* ++*****************************************************************************/ ++ ++/* Request Descriptors */ ++ ++/* Default Request Descriptor */ ++typedef struct _MPI2_DEFAULT_REQUEST_DESCRIPTOR ++{ ++ U8 RequestFlags; /* 0x00 */ ++ U8 VF_ID; /* 0x01 */ ++ U16 SMID; /* 0x02 */ ++ U16 LMID; /* 0x04 */ ++ U16 DescriptorTypeDependent; /* 0x06 */ ++} MPI2_DEFAULT_REQUEST_DESCRIPTOR, ++ MPI2_POINTER PTR_MPI2_DEFAULT_REQUEST_DESCRIPTOR, ++ Mpi2DefaultRequestDescriptor_t, MPI2_POINTER pMpi2DefaultRequestDescriptor_t; ++ ++/* defines for the RequestFlags field */ ++#define MPI2_REQ_DESCRIPT_FLAGS_TYPE_MASK (0x0E) ++#define MPI2_REQ_DESCRIPT_FLAGS_SCSI_IO (0x00) ++#define MPI2_REQ_DESCRIPT_FLAGS_SCSI_TARGET (0x02) ++#define MPI2_REQ_DESCRIPT_FLAGS_HIGH_PRIORITY (0x06) ++#define MPI2_REQ_DESCRIPT_FLAGS_DEFAULT_TYPE (0x08) ++ ++#define MPI2_REQ_DESCRIPT_FLAGS_IOC_FIFO_MARKER (0x01) ++ ++ ++/* High Priority Request Descriptor */ ++typedef struct _MPI2_HIGH_PRIORITY_REQUEST_DESCRIPTOR ++{ ++ U8 RequestFlags; /* 0x00 */ ++ U8 VF_ID; /* 0x01 */ ++ U16 SMID; /* 0x02 */ ++ U16 LMID; /* 0x04 */ ++ U16 Reserved1; /* 0x06 */ ++} MPI2_HIGH_PRIORITY_REQUEST_DESCRIPTOR, ++ MPI2_POINTER PTR_MPI2_HIGH_PRIORITY_REQUEST_DESCRIPTOR, ++ Mpi2HighPriorityRequestDescriptor_t, ++ MPI2_POINTER pMpi2HighPriorityRequestDescriptor_t; ++ ++ ++/* SCSI IO Request Descriptor */ ++typedef struct _MPI2_SCSI_IO_REQUEST_DESCRIPTOR ++{ ++ U8 RequestFlags; /* 0x00 */ ++ U8 VF_ID; /* 0x01 */ ++ U16 SMID; /* 0x02 */ ++ U16 LMID; /* 0x04 */ ++ U16 DevHandle; /* 0x06 */ ++} MPI2_SCSI_IO_REQUEST_DESCRIPTOR, ++ MPI2_POINTER PTR_MPI2_SCSI_IO_REQUEST_DESCRIPTOR, ++ Mpi2SCSIIORequestDescriptor_t, MPI2_POINTER pMpi2SCSIIORequestDescriptor_t; ++ ++ ++/* SCSI Target Request Descriptor */ ++typedef struct _MPI2_SCSI_TARGET_REQUEST_DESCRIPTOR ++{ ++ U8 RequestFlags; /* 0x00 */ ++ U8 VF_ID; /* 0x01 */ ++ U16 SMID; /* 0x02 */ ++ U16 LMID; /* 0x04 */ ++ U16 IoIndex; /* 0x06 */ ++} MPI2_SCSI_TARGET_REQUEST_DESCRIPTOR, ++ MPI2_POINTER PTR_MPI2_SCSI_TARGET_REQUEST_DESCRIPTOR, ++ Mpi2SCSITargetRequestDescriptor_t, ++ MPI2_POINTER pMpi2SCSITargetRequestDescriptor_t; ++ ++/* union of Request Descriptors */ ++typedef union _MPI2_REQUEST_DESCRIPTOR_UNION ++{ ++ MPI2_DEFAULT_REQUEST_DESCRIPTOR Default; ++ MPI2_HIGH_PRIORITY_REQUEST_DESCRIPTOR HighPriority; ++ MPI2_SCSI_IO_REQUEST_DESCRIPTOR SCSIIO; ++ MPI2_SCSI_TARGET_REQUEST_DESCRIPTOR SCSITarget; ++ U64 Words; ++} MPI2_REQUEST_DESCRIPTOR_UNION, MPI2_POINTER PTR_MPI2_REQUEST_DESCRIPTOR_UNION, ++ Mpi2RequestDescriptorUnion_t, MPI2_POINTER pMpi2RequestDescriptorUnion_t; ++ ++ ++/* Reply Descriptors */ ++ ++/* Default Reply Descriptor */ ++typedef struct _MPI2_DEFAULT_REPLY_DESCRIPTOR ++{ ++ U8 ReplyFlags; /* 0x00 */ ++ U8 VF_ID; /* 0x01 */ ++ U16 DescriptorTypeDependent1; /* 0x02 */ ++ U32 DescriptorTypeDependent2; /* 0x04 */ ++} MPI2_DEFAULT_REPLY_DESCRIPTOR, MPI2_POINTER PTR_MPI2_DEFAULT_REPLY_DESCRIPTOR, ++ Mpi2DefaultReplyDescriptor_t, MPI2_POINTER pMpi2DefaultReplyDescriptor_t; ++ ++/* defines for the ReplyFlags field */ ++#define MPI2_RPY_DESCRIPT_FLAGS_TYPE_MASK (0x0F) ++#define MPI2_RPY_DESCRIPT_FLAGS_SCSI_IO_SUCCESS (0x00) ++#define MPI2_RPY_DESCRIPT_FLAGS_ADDRESS_REPLY (0x01) ++#define MPI2_RPY_DESCRIPT_FLAGS_TARGETASSIST_SUCCESS (0x02) ++#define MPI2_RPY_DESCRIPT_FLAGS_TARGET_COMMAND_BUFFER (0x03) ++#define MPI2_RPY_DESCRIPT_FLAGS_UNUSED (0x0F) ++ ++/* values for marking a reply descriptor as unused */ ++#define MPI2_RPY_DESCRIPT_UNUSED_WORD0_MARK (0xFFFFFFFF) ++#define MPI2_RPY_DESCRIPT_UNUSED_WORD1_MARK (0xFFFFFFFF) ++ ++/* Address Reply Descriptor */ ++typedef struct _MPI2_ADDRESS_REPLY_DESCRIPTOR ++{ ++ U8 ReplyFlags; /* 0x00 */ ++ U8 VF_ID; /* 0x01 */ ++ U16 SMID; /* 0x02 */ ++ U32 ReplyFrameAddress; /* 0x04 */ ++} MPI2_ADDRESS_REPLY_DESCRIPTOR, MPI2_POINTER PTR_MPI2_ADDRESS_REPLY_DESCRIPTOR, ++ Mpi2AddressReplyDescriptor_t, MPI2_POINTER pMpi2AddressReplyDescriptor_t; ++ ++#define MPI2_ADDRESS_REPLY_SMID_INVALID (0x00) ++ ++ ++/* SCSI IO Success Reply Descriptor */ ++typedef struct _MPI2_SCSI_IO_SUCCESS_REPLY_DESCRIPTOR ++{ ++ U8 ReplyFlags; /* 0x00 */ ++ U8 VF_ID; /* 0x01 */ ++ U16 SMID; /* 0x02 */ ++ U16 TaskTag; /* 0x04 */ ++ U16 DevHandle; /* 0x06 */ ++} MPI2_SCSI_IO_SUCCESS_REPLY_DESCRIPTOR, ++ MPI2_POINTER PTR_MPI2_SCSI_IO_SUCCESS_REPLY_DESCRIPTOR, ++ Mpi2SCSIIOSuccessReplyDescriptor_t, ++ MPI2_POINTER pMpi2SCSIIOSuccessReplyDescriptor_t; ++ ++ ++/* TargetAssist Success Reply Descriptor */ ++typedef struct _MPI2_TARGETASSIST_SUCCESS_REPLY_DESCRIPTOR ++{ ++ U8 ReplyFlags; /* 0x00 */ ++ U8 VF_ID; /* 0x01 */ ++ U16 SMID; /* 0x02 */ ++ U8 SequenceNumber; /* 0x04 */ ++ U8 Reserved1; /* 0x05 */ ++ U16 IoIndex; /* 0x06 */ ++} MPI2_TARGETASSIST_SUCCESS_REPLY_DESCRIPTOR, ++ MPI2_POINTER PTR_MPI2_TARGETASSIST_SUCCESS_REPLY_DESCRIPTOR, ++ Mpi2TargetAssistSuccessReplyDescriptor_t, ++ MPI2_POINTER pMpi2TargetAssistSuccessReplyDescriptor_t; ++ ++ ++/* Target Command Buffer Reply Descriptor */ ++typedef struct _MPI2_TARGET_COMMAND_BUFFER_REPLY_DESCRIPTOR ++{ ++ U8 ReplyFlags; /* 0x00 */ ++ U8 VF_ID; /* 0x01 */ ++ U8 VP_ID; /* 0x02 */ ++ U8 Flags; /* 0x03 */ ++ U16 InitiatorDevHandle; /* 0x04 */ ++ U16 IoIndex; /* 0x06 */ ++} MPI2_TARGET_COMMAND_BUFFER_REPLY_DESCRIPTOR, ++ MPI2_POINTER PTR_MPI2_TARGET_COMMAND_BUFFER_REPLY_DESCRIPTOR, ++ Mpi2TargetCommandBufferReplyDescriptor_t, ++ MPI2_POINTER pMpi2TargetCommandBufferReplyDescriptor_t; ++ ++/* defines for Flags field */ ++#define MPI2_RPY_DESCRIPT_TCB_FLAGS_PHYNUM_MASK (0x3F) ++ ++ ++/* union of Reply Descriptors */ ++typedef union _MPI2_REPLY_DESCRIPTORS_UNION ++{ ++ MPI2_DEFAULT_REPLY_DESCRIPTOR Default; ++ MPI2_ADDRESS_REPLY_DESCRIPTOR AddressReply; ++ MPI2_SCSI_IO_SUCCESS_REPLY_DESCRIPTOR SCSIIOSuccess; ++ MPI2_TARGETASSIST_SUCCESS_REPLY_DESCRIPTOR TargetAssistSuccess; ++ MPI2_TARGET_COMMAND_BUFFER_REPLY_DESCRIPTOR TargetCommandBuffer; ++ U64 Words; ++} MPI2_REPLY_DESCRIPTORS_UNION, MPI2_POINTER PTR_MPI2_REPLY_DESCRIPTORS_UNION, ++ Mpi2ReplyDescriptorsUnion_t, MPI2_POINTER pMpi2ReplyDescriptorsUnion_t; ++ ++ ++ ++/***************************************************************************** ++* ++* Message Functions ++* 0x80 -> 0x8F reserved for private message use per product ++* ++* ++*****************************************************************************/ ++ ++#define MPI2_FUNCTION_SCSI_IO_REQUEST (0x00) /* SCSI IO */ ++#define MPI2_FUNCTION_SCSI_TASK_MGMT (0x01) /* SCSI Task Management */ ++#define MPI2_FUNCTION_IOC_INIT (0x02) /* IOC Init */ ++#define MPI2_FUNCTION_IOC_FACTS (0x03) /* IOC Facts */ ++#define MPI2_FUNCTION_CONFIG (0x04) /* Configuration */ ++#define MPI2_FUNCTION_PORT_FACTS (0x05) /* Port Facts */ ++#define MPI2_FUNCTION_PORT_ENABLE (0x06) /* Port Enable */ ++#define MPI2_FUNCTION_EVENT_NOTIFICATION (0x07) /* Event Notification */ ++#define MPI2_FUNCTION_EVENT_ACK (0x08) /* Event Acknowledge */ ++#define MPI2_FUNCTION_FW_DOWNLOAD (0x09) /* FW Download */ ++#define MPI2_FUNCTION_TARGET_ASSIST (0x0B) /* Target Assist */ ++#define MPI2_FUNCTION_TARGET_STATUS_SEND (0x0C) /* Target Status Send */ ++#define MPI2_FUNCTION_TARGET_MODE_ABORT (0x0D) /* Target Mode Abort */ ++#define MPI2_FUNCTION_FW_UPLOAD (0x12) /* FW Upload */ ++#define MPI2_FUNCTION_RAID_ACTION (0x15) /* RAID Action */ ++#define MPI2_FUNCTION_RAID_SCSI_IO_PASSTHROUGH (0x16) /* SCSI IO RAID Passthrough */ ++#define MPI2_FUNCTION_TOOLBOX (0x17) /* Toolbox */ ++#define MPI2_FUNCTION_SCSI_ENCLOSURE_PROCESSOR (0x18) /* SCSI Enclosure Processor */ ++#define MPI2_FUNCTION_SMP_PASSTHROUGH (0x1A) /* SMP Passthrough */ ++#define MPI2_FUNCTION_SAS_IO_UNIT_CONTROL (0x1B) /* SAS IO Unit Control */ ++#define MPI2_FUNCTION_SATA_PASSTHROUGH (0x1C) /* SATA Passthrough */ ++#define MPI2_FUNCTION_DIAG_BUFFER_POST (0x1D) /* Diagnostic Buffer Post */ ++#define MPI2_FUNCTION_DIAG_RELEASE (0x1E) /* Diagnostic Release */ ++#define MPI2_FUNCTION_TARGET_CMD_BUF_BASE_POST (0x24) /* Target Command Buffer Post Base */ ++#define MPI2_FUNCTION_TARGET_CMD_BUF_LIST_POST (0x25) /* Target Command Buffer Post List */ ++ ++ ++ ++/* Doorbell functions */ ++#define MPI2_FUNCTION_IOC_MESSAGE_UNIT_RESET (0x40) ++/* #define MPI2_FUNCTION_IO_UNIT_RESET (0x41) */ ++#define MPI2_FUNCTION_HANDSHAKE (0x42) ++ ++ ++/***************************************************************************** ++* ++* IOC Status Values ++* ++*****************************************************************************/ ++ ++/* mask for IOCStatus status value */ ++#define MPI2_IOCSTATUS_MASK (0x7FFF) ++ ++/**************************************************************************** ++* Common IOCStatus values for all replies ++****************************************************************************/ ++ ++#define MPI2_IOCSTATUS_SUCCESS (0x0000) ++#define MPI2_IOCSTATUS_INVALID_FUNCTION (0x0001) ++#define MPI2_IOCSTATUS_BUSY (0x0002) ++#define MPI2_IOCSTATUS_INVALID_SGL (0x0003) ++#define MPI2_IOCSTATUS_INTERNAL_ERROR (0x0004) ++#define MPI2_IOCSTATUS_INVALID_VPID (0x0005) ++#define MPI2_IOCSTATUS_INSUFFICIENT_RESOURCES (0x0006) ++#define MPI2_IOCSTATUS_INVALID_FIELD (0x0007) ++#define MPI2_IOCSTATUS_INVALID_STATE (0x0008) ++#define MPI2_IOCSTATUS_OP_STATE_NOT_SUPPORTED (0x0009) ++ ++/**************************************************************************** ++* Config IOCStatus values ++****************************************************************************/ ++ ++#define MPI2_IOCSTATUS_CONFIG_INVALID_ACTION (0x0020) ++#define MPI2_IOCSTATUS_CONFIG_INVALID_TYPE (0x0021) ++#define MPI2_IOCSTATUS_CONFIG_INVALID_PAGE (0x0022) ++#define MPI2_IOCSTATUS_CONFIG_INVALID_DATA (0x0023) ++#define MPI2_IOCSTATUS_CONFIG_NO_DEFAULTS (0x0024) ++#define MPI2_IOCSTATUS_CONFIG_CANT_COMMIT (0x0025) ++ ++/**************************************************************************** ++* SCSI IO Reply ++****************************************************************************/ ++ ++#define MPI2_IOCSTATUS_SCSI_RECOVERED_ERROR (0x0040) ++#define MPI2_IOCSTATUS_SCSI_INVALID_DEVHANDLE (0x0042) ++#define MPI2_IOCSTATUS_SCSI_DEVICE_NOT_THERE (0x0043) ++#define MPI2_IOCSTATUS_SCSI_DATA_OVERRUN (0x0044) ++#define MPI2_IOCSTATUS_SCSI_DATA_UNDERRUN (0x0045) ++#define MPI2_IOCSTATUS_SCSI_IO_DATA_ERROR (0x0046) ++#define MPI2_IOCSTATUS_SCSI_PROTOCOL_ERROR (0x0047) ++#define MPI2_IOCSTATUS_SCSI_TASK_TERMINATED (0x0048) ++#define MPI2_IOCSTATUS_SCSI_RESIDUAL_MISMATCH (0x0049) ++#define MPI2_IOCSTATUS_SCSI_TASK_MGMT_FAILED (0x004A) ++#define MPI2_IOCSTATUS_SCSI_IOC_TERMINATED (0x004B) ++#define MPI2_IOCSTATUS_SCSI_EXT_TERMINATED (0x004C) ++ ++/**************************************************************************** ++* For use by SCSI Initiator and SCSI Target end-to-end data protection ++****************************************************************************/ ++ ++#define MPI2_IOCSTATUS_EEDP_GUARD_ERROR (0x004D) ++#define MPI2_IOCSTATUS_EEDP_REF_TAG_ERROR (0x004E) ++#define MPI2_IOCSTATUS_EEDP_APP_TAG_ERROR (0x004F) ++ ++/**************************************************************************** ++* SCSI Target values ++****************************************************************************/ ++ ++#define MPI2_IOCSTATUS_TARGET_INVALID_IO_INDEX (0x0062) ++#define MPI2_IOCSTATUS_TARGET_ABORTED (0x0063) ++#define MPI2_IOCSTATUS_TARGET_NO_CONN_RETRYABLE (0x0064) ++#define MPI2_IOCSTATUS_TARGET_NO_CONNECTION (0x0065) ++#define MPI2_IOCSTATUS_TARGET_XFER_COUNT_MISMATCH (0x006A) ++#define MPI2_IOCSTATUS_TARGET_DATA_OFFSET_ERROR (0x006D) ++#define MPI2_IOCSTATUS_TARGET_TOO_MUCH_WRITE_DATA (0x006E) ++#define MPI2_IOCSTATUS_TARGET_IU_TOO_SHORT (0x006F) ++#define MPI2_IOCSTATUS_TARGET_ACK_NAK_TIMEOUT (0x0070) ++#define MPI2_IOCSTATUS_TARGET_NAK_RECEIVED (0x0071) ++ ++/**************************************************************************** ++* Serial Attached SCSI values ++****************************************************************************/ ++ ++#define MPI2_IOCSTATUS_SAS_SMP_REQUEST_FAILED (0x0090) ++#define MPI2_IOCSTATUS_SAS_SMP_DATA_OVERRUN (0x0091) ++ ++/**************************************************************************** ++* Diagnostic Buffer Post / Diagnostic Release values ++****************************************************************************/ ++ ++#define MPI2_IOCSTATUS_DIAGNOSTIC_RELEASED (0x00A0) ++ ++ ++/**************************************************************************** ++* IOCStatus flag to indicate that log info is available ++****************************************************************************/ ++ ++#define MPI2_IOCSTATUS_FLAG_LOG_INFO_AVAILABLE (0x8000) ++ ++/**************************************************************************** ++* IOCLogInfo Types ++****************************************************************************/ ++ ++#define MPI2_IOCLOGINFO_TYPE_MASK (0xF0000000) ++#define MPI2_IOCLOGINFO_TYPE_SHIFT (28) ++#define MPI2_IOCLOGINFO_TYPE_NONE (0x0) ++#define MPI2_IOCLOGINFO_TYPE_SCSI (0x1) ++#define MPI2_IOCLOGINFO_TYPE_FC (0x2) ++#define MPI2_IOCLOGINFO_TYPE_SAS (0x3) ++#define MPI2_IOCLOGINFO_TYPE_ISCSI (0x4) ++#define MPI2_IOCLOGINFO_LOG_DATA_MASK (0x0FFFFFFF) ++ ++ ++/***************************************************************************** ++* ++* Standard Message Structures ++* ++*****************************************************************************/ ++ ++/**************************************************************************** ++* Request Message Header for all request messages ++****************************************************************************/ ++ ++typedef struct _MPI2_REQUEST_HEADER ++{ ++ U16 FunctionDependent1; /* 0x00 */ ++ U8 ChainOffset; /* 0x02 */ ++ U8 Function; /* 0x03 */ ++ U16 FunctionDependent2; /* 0x04 */ ++ U8 FunctionDependent3; /* 0x06 */ ++ U8 MsgFlags; /* 0x07 */ ++ U8 VP_ID; /* 0x08 */ ++ U8 VF_ID; /* 0x09 */ ++ U16 Reserved1; /* 0x0A */ ++} MPI2_REQUEST_HEADER, MPI2_POINTER PTR_MPI2_REQUEST_HEADER, ++ MPI2RequestHeader_t, MPI2_POINTER pMPI2RequestHeader_t; ++ ++ ++/**************************************************************************** ++* Default Reply ++****************************************************************************/ ++ ++typedef struct _MPI2_DEFAULT_REPLY ++{ ++ U16 FunctionDependent1; /* 0x00 */ ++ U8 MsgLength; /* 0x02 */ ++ U8 Function; /* 0x03 */ ++ U16 FunctionDependent2; /* 0x04 */ ++ U8 FunctionDependent3; /* 0x06 */ ++ U8 MsgFlags; /* 0x07 */ ++ U8 VP_ID; /* 0x08 */ ++ U8 VF_ID; /* 0x09 */ ++ U16 Reserved1; /* 0x0A */ ++ U16 FunctionDependent5; /* 0x0C */ ++ U16 IOCStatus; /* 0x0E */ ++ U32 IOCLogInfo; /* 0x10 */ ++} MPI2_DEFAULT_REPLY, MPI2_POINTER PTR_MPI2_DEFAULT_REPLY, ++ MPI2DefaultReply_t, MPI2_POINTER pMPI2DefaultReply_t; ++ ++ ++/* common version structure/union used in messages and configuration pages */ ++ ++typedef struct _MPI2_VERSION_STRUCT ++{ ++ U8 Dev; /* 0x00 */ ++ U8 Unit; /* 0x01 */ ++ U8 Minor; /* 0x02 */ ++ U8 Major; /* 0x03 */ ++} MPI2_VERSION_STRUCT; ++ ++typedef union _MPI2_VERSION_UNION ++{ ++ MPI2_VERSION_STRUCT Struct; ++ U32 Word; ++} MPI2_VERSION_UNION; ++ ++ ++/* LUN field defines, common to many structures */ ++#define MPI2_LUN_FIRST_LEVEL_ADDRESSING (0x0000FFFF) ++#define MPI2_LUN_SECOND_LEVEL_ADDRESSING (0xFFFF0000) ++#define MPI2_LUN_THIRD_LEVEL_ADDRESSING (0x0000FFFF) ++#define MPI2_LUN_FOURTH_LEVEL_ADDRESSING (0xFFFF0000) ++#define MPI2_LUN_LEVEL_1_WORD (0xFF00) ++#define MPI2_LUN_LEVEL_1_DWORD (0x0000FF00) ++ ++ ++/***************************************************************************** ++* ++* Fusion-MPT MPI Scatter Gather Elements ++* ++*****************************************************************************/ ++ ++/**************************************************************************** ++* MPI Simple Element structures ++****************************************************************************/ ++ ++typedef struct _MPI2_SGE_SIMPLE32 ++{ ++ U32 FlagsLength; ++ U32 Address; ++} MPI2_SGE_SIMPLE32, MPI2_POINTER PTR_MPI2_SGE_SIMPLE32, ++ Mpi2SGESimple32_t, MPI2_POINTER pMpi2SGESimple32_t; ++ ++typedef struct _MPI2_SGE_SIMPLE64 ++{ ++ U32 FlagsLength; ++ U64 Address; ++} MPI2_SGE_SIMPLE64, MPI2_POINTER PTR_MPI2_SGE_SIMPLE64, ++ Mpi2SGESimple64_t, MPI2_POINTER pMpi2SGESimple64_t; ++ ++typedef struct _MPI2_SGE_SIMPLE_UNION ++{ ++ U32 FlagsLength; ++ union ++ { ++ U32 Address32; ++ U64 Address64; ++ } u; ++} MPI2_SGE_SIMPLE_UNION, MPI2_POINTER PTR_MPI2_SGE_SIMPLE_UNION, ++ Mpi2SGESimpleUnion_t, MPI2_POINTER pMpi2SGESimpleUnion_t; ++ ++ ++/**************************************************************************** ++* MPI Chain Element structures ++****************************************************************************/ ++ ++typedef struct _MPI2_SGE_CHAIN32 ++{ ++ U16 Length; ++ U8 NextChainOffset; ++ U8 Flags; ++ U32 Address; ++} MPI2_SGE_CHAIN32, MPI2_POINTER PTR_MPI2_SGE_CHAIN32, ++ Mpi2SGEChain32_t, MPI2_POINTER pMpi2SGEChain32_t; ++ ++typedef struct _MPI2_SGE_CHAIN64 ++{ ++ U16 Length; ++ U8 NextChainOffset; ++ U8 Flags; ++ U64 Address; ++} MPI2_SGE_CHAIN64, MPI2_POINTER PTR_MPI2_SGE_CHAIN64, ++ Mpi2SGEChain64_t, MPI2_POINTER pMpi2SGEChain64_t; ++ ++typedef struct _MPI2_SGE_CHAIN_UNION ++{ ++ U16 Length; ++ U8 NextChainOffset; ++ U8 Flags; ++ union ++ { ++ U32 Address32; ++ U64 Address64; ++ } u; ++} MPI2_SGE_CHAIN_UNION, MPI2_POINTER PTR_MPI2_SGE_CHAIN_UNION, ++ Mpi2SGEChainUnion_t, MPI2_POINTER pMpi2SGEChainUnion_t; ++ ++ ++/**************************************************************************** ++* MPI Transaction Context Element structures ++****************************************************************************/ ++ ++typedef struct _MPI2_SGE_TRANSACTION32 ++{ ++ U8 Reserved; ++ U8 ContextSize; ++ U8 DetailsLength; ++ U8 Flags; ++ U32 TransactionContext[1]; ++ U32 TransactionDetails[1]; ++} MPI2_SGE_TRANSACTION32, MPI2_POINTER PTR_MPI2_SGE_TRANSACTION32, ++ Mpi2SGETransaction32_t, MPI2_POINTER pMpi2SGETransaction32_t; ++ ++typedef struct _MPI2_SGE_TRANSACTION64 ++{ ++ U8 Reserved; ++ U8 ContextSize; ++ U8 DetailsLength; ++ U8 Flags; ++ U32 TransactionContext[2]; ++ U32 TransactionDetails[1]; ++} MPI2_SGE_TRANSACTION64, MPI2_POINTER PTR_MPI2_SGE_TRANSACTION64, ++ Mpi2SGETransaction64_t, MPI2_POINTER pMpi2SGETransaction64_t; ++ ++typedef struct _MPI2_SGE_TRANSACTION96 ++{ ++ U8 Reserved; ++ U8 ContextSize; ++ U8 DetailsLength; ++ U8 Flags; ++ U32 TransactionContext[3]; ++ U32 TransactionDetails[1]; ++} MPI2_SGE_TRANSACTION96, MPI2_POINTER PTR_MPI2_SGE_TRANSACTION96, ++ Mpi2SGETransaction96_t, MPI2_POINTER pMpi2SGETransaction96_t; ++ ++typedef struct _MPI2_SGE_TRANSACTION128 ++{ ++ U8 Reserved; ++ U8 ContextSize; ++ U8 DetailsLength; ++ U8 Flags; ++ U32 TransactionContext[4]; ++ U32 TransactionDetails[1]; ++} MPI2_SGE_TRANSACTION128, MPI2_POINTER PTR_MPI2_SGE_TRANSACTION128, ++ Mpi2SGETransaction_t128, MPI2_POINTER pMpi2SGETransaction_t128; ++ ++typedef struct _MPI2_SGE_TRANSACTION_UNION ++{ ++ U8 Reserved; ++ U8 ContextSize; ++ U8 DetailsLength; ++ U8 Flags; ++ union ++ { ++ U32 TransactionContext32[1]; ++ U32 TransactionContext64[2]; ++ U32 TransactionContext96[3]; ++ U32 TransactionContext128[4]; ++ } u; ++ U32 TransactionDetails[1]; ++} MPI2_SGE_TRANSACTION_UNION, MPI2_POINTER PTR_MPI2_SGE_TRANSACTION_UNION, ++ Mpi2SGETransactionUnion_t, MPI2_POINTER pMpi2SGETransactionUnion_t; ++ ++ ++/**************************************************************************** ++* MPI SGE union for IO SGL's ++****************************************************************************/ ++ ++typedef struct _MPI2_MPI_SGE_IO_UNION ++{ ++ union ++ { ++ MPI2_SGE_SIMPLE_UNION Simple; ++ MPI2_SGE_CHAIN_UNION Chain; ++ } u; ++} MPI2_MPI_SGE_IO_UNION, MPI2_POINTER PTR_MPI2_MPI_SGE_IO_UNION, ++ Mpi2MpiSGEIOUnion_t, MPI2_POINTER pMpi2MpiSGEIOUnion_t; ++ ++ ++/**************************************************************************** ++* MPI SGE union for SGL's with Simple and Transaction elements ++****************************************************************************/ ++ ++typedef struct _MPI2_SGE_TRANS_SIMPLE_UNION ++{ ++ union ++ { ++ MPI2_SGE_SIMPLE_UNION Simple; ++ MPI2_SGE_TRANSACTION_UNION Transaction; ++ } u; ++} MPI2_SGE_TRANS_SIMPLE_UNION, MPI2_POINTER PTR_MPI2_SGE_TRANS_SIMPLE_UNION, ++ Mpi2SGETransSimpleUnion_t, MPI2_POINTER pMpi2SGETransSimpleUnion_t; ++ ++ ++/**************************************************************************** ++* All MPI SGE types union ++****************************************************************************/ ++ ++typedef struct _MPI2_MPI_SGE_UNION ++{ ++ union ++ { ++ MPI2_SGE_SIMPLE_UNION Simple; ++ MPI2_SGE_CHAIN_UNION Chain; ++ MPI2_SGE_TRANSACTION_UNION Transaction; ++ } u; ++} MPI2_MPI_SGE_UNION, MPI2_POINTER PTR_MPI2_MPI_SGE_UNION, ++ Mpi2MpiSgeUnion_t, MPI2_POINTER pMpi2MpiSgeUnion_t; ++ ++ ++/**************************************************************************** ++* MPI SGE field definition and masks ++****************************************************************************/ ++ ++/* Flags field bit definitions */ ++ ++#define MPI2_SGE_FLAGS_LAST_ELEMENT (0x80) ++#define MPI2_SGE_FLAGS_END_OF_BUFFER (0x40) ++#define MPI2_SGE_FLAGS_ELEMENT_TYPE_MASK (0x30) ++#define MPI2_SGE_FLAGS_LOCAL_ADDRESS (0x08) ++#define MPI2_SGE_FLAGS_DIRECTION (0x04) ++#define MPI2_SGE_FLAGS_ADDRESS_SIZE (0x02) ++#define MPI2_SGE_FLAGS_END_OF_LIST (0x01) ++ ++#define MPI2_SGE_FLAGS_SHIFT (24) ++ ++#define MPI2_SGE_LENGTH_MASK (0x00FFFFFF) ++#define MPI2_SGE_CHAIN_LENGTH_MASK (0x0000FFFF) ++ ++/* Element Type */ ++ ++#define MPI2_SGE_FLAGS_TRANSACTION_ELEMENT (0x00) ++#define MPI2_SGE_FLAGS_SIMPLE_ELEMENT (0x10) ++#define MPI2_SGE_FLAGS_CHAIN_ELEMENT (0x30) ++#define MPI2_SGE_FLAGS_ELEMENT_MASK (0x30) ++ ++/* Address location */ ++ ++#define MPI2_SGE_FLAGS_SYSTEM_ADDRESS (0x00) ++ ++/* Direction */ ++ ++#define MPI2_SGE_FLAGS_IOC_TO_HOST (0x00) ++#define MPI2_SGE_FLAGS_HOST_TO_IOC (0x04) ++ ++/* Address Size */ ++ ++#define MPI2_SGE_FLAGS_32_BIT_ADDRESSING (0x00) ++#define MPI2_SGE_FLAGS_64_BIT_ADDRESSING (0x02) ++ ++/* Context Size */ ++ ++#define MPI2_SGE_FLAGS_32_BIT_CONTEXT (0x00) ++#define MPI2_SGE_FLAGS_64_BIT_CONTEXT (0x02) ++#define MPI2_SGE_FLAGS_96_BIT_CONTEXT (0x04) ++#define MPI2_SGE_FLAGS_128_BIT_CONTEXT (0x06) ++ ++#define MPI2_SGE_CHAIN_OFFSET_MASK (0x00FF0000) ++#define MPI2_SGE_CHAIN_OFFSET_SHIFT (16) ++ ++/**************************************************************************** ++* MPI SGE operation Macros ++****************************************************************************/ ++ ++/* SIMPLE FlagsLength manipulations... */ ++#define MPI2_SGE_SET_FLAGS(f) ((U32)(f) << MPI2_SGE_FLAGS_SHIFT) ++#define MPI2_SGE_GET_FLAGS(f) (((f) & ~MPI2_SGE_LENGTH_MASK) >> MPI2_SGE_FLAGS_SHIFT) ++#define MPI2_SGE_LENGTH(f) ((f) & MPI2_SGE_LENGTH_MASK) ++#define MPI2_SGE_CHAIN_LENGTH(f) ((f) & MPI2_SGE_CHAIN_LENGTH_MASK) ++ ++#define MPI2_SGE_SET_FLAGS_LENGTH(f,l) (MPI2_SGE_SET_FLAGS(f) | MPI2_SGE_LENGTH(l)) ++ ++#define MPI2_pSGE_GET_FLAGS(psg) MPI2_SGE_GET_FLAGS((psg)->FlagsLength) ++#define MPI2_pSGE_GET_LENGTH(psg) MPI2_SGE_LENGTH((psg)->FlagsLength) ++#define MPI2_pSGE_SET_FLAGS_LENGTH(psg,f,l) (psg)->FlagsLength = MPI2_SGE_SET_FLAGS_LENGTH(f,l) ++ ++/* CAUTION - The following are READ-MODIFY-WRITE! */ ++#define MPI2_pSGE_SET_FLAGS(psg,f) (psg)->FlagsLength |= MPI2_SGE_SET_FLAGS(f) ++#define MPI2_pSGE_SET_LENGTH(psg,l) (psg)->FlagsLength |= MPI2_SGE_LENGTH(l) ++ ++#define MPI2_GET_CHAIN_OFFSET(x) ((x & MPI2_SGE_CHAIN_OFFSET_MASK) >> MPI2_SGE_CHAIN_OFFSET_SHIFT) ++ ++ ++/***************************************************************************** ++* ++* Fusion-MPT IEEE Scatter Gather Elements ++* ++*****************************************************************************/ ++ ++/**************************************************************************** ++* IEEE Simple Element structures ++****************************************************************************/ ++ ++typedef struct _MPI2_IEEE_SGE_SIMPLE32 ++{ ++ U32 Address; ++ U32 FlagsLength; ++} MPI2_IEEE_SGE_SIMPLE32, MPI2_POINTER PTR_MPI2_IEEE_SGE_SIMPLE32, ++ Mpi2IeeeSgeSimple32_t, MPI2_POINTER pMpi2IeeeSgeSimple32_t; ++ ++typedef struct _MPI2_IEEE_SGE_SIMPLE64 ++{ ++ U64 Address; ++ U32 Length; ++ U16 Reserved1; ++ U8 Reserved2; ++ U8 Flags; ++} MPI2_IEEE_SGE_SIMPLE64, MPI2_POINTER PTR_MPI2_IEEE_SGE_SIMPLE64, ++ Mpi2IeeeSgeSimple64_t, MPI2_POINTER pMpi2IeeeSgeSimple64_t; ++ ++typedef union _MPI2_IEEE_SGE_SIMPLE_UNION ++{ ++ MPI2_IEEE_SGE_SIMPLE32 Simple32; ++ MPI2_IEEE_SGE_SIMPLE64 Simple64; ++} MPI2_IEEE_SGE_SIMPLE_UNION, MPI2_POINTER PTR_MPI2_IEEE_SGE_SIMPLE_UNION, ++ Mpi2IeeeSgeSimpleUnion_t, MPI2_POINTER pMpi2IeeeSgeSimpleUnion_t; ++ ++ ++/**************************************************************************** ++* IEEE Chain Element structures ++****************************************************************************/ ++ ++typedef MPI2_IEEE_SGE_SIMPLE32 MPI2_IEEE_SGE_CHAIN32; ++ ++typedef MPI2_IEEE_SGE_SIMPLE64 MPI2_IEEE_SGE_CHAIN64; ++ ++typedef union _MPI2_IEEE_SGE_CHAIN_UNION ++{ ++ MPI2_IEEE_SGE_CHAIN32 Chain32; ++ MPI2_IEEE_SGE_CHAIN64 Chain64; ++} MPI2_IEEE_SGE_CHAIN_UNION, MPI2_POINTER PTR_MPI2_IEEE_SGE_CHAIN_UNION, ++ Mpi2IeeeSgeChainUnion_t, MPI2_POINTER pMpi2IeeeSgeChainUnion_t; ++ ++ ++/**************************************************************************** ++* All IEEE SGE types union ++****************************************************************************/ ++ ++typedef struct _MPI2_IEEE_SGE_UNION ++{ ++ union ++ { ++ MPI2_IEEE_SGE_SIMPLE_UNION Simple; ++ MPI2_IEEE_SGE_CHAIN_UNION Chain; ++ } u; ++} MPI2_IEEE_SGE_UNION, MPI2_POINTER PTR_MPI2_IEEE_SGE_UNION, ++ Mpi2IeeeSgeUnion_t, MPI2_POINTER pMpi2IeeeSgeUnion_t; ++ ++ ++/**************************************************************************** ++* IEEE SGE field definitions and masks ++****************************************************************************/ ++ ++/* Flags field bit definitions */ ++ ++#define MPI2_IEEE_SGE_FLAGS_ELEMENT_TYPE_MASK (0x80) ++ ++#define MPI2_IEEE32_SGE_FLAGS_SHIFT (24) ++ ++#define MPI2_IEEE32_SGE_LENGTH_MASK (0x00FFFFFF) ++ ++/* Element Type */ ++ ++#define MPI2_IEEE_SGE_FLAGS_SIMPLE_ELEMENT (0x00) ++#define MPI2_IEEE_SGE_FLAGS_CHAIN_ELEMENT (0x80) ++ ++/* Data Location Address Space */ ++ ++#define MPI2_IEEE_SGE_FLAGS_ADDR_MASK (0x03) ++#define MPI2_IEEE_SGE_FLAGS_SYSTEM_ADDR (0x00) ++#define MPI2_IEEE_SGE_FLAGS_IOCDDR_ADDR (0x01) ++#define MPI2_IEEE_SGE_FLAGS_IOCPLB_ADDR (0x02) ++#define MPI2_IEEE_SGE_FLAGS_IOCPLBNTA_ADDR (0x03) ++ ++ ++/**************************************************************************** ++* IEEE SGE operation Macros ++****************************************************************************/ ++ ++/* SIMPLE FlagsLength manipulations... */ ++#define MPI2_IEEE32_SGE_SET_FLAGS(f) ((U32)(f) << MPI2_IEEE32_SGE_FLAGS_SHIFT) ++#define MPI2_IEEE32_SGE_GET_FLAGS(f) (((f) & ~MPI2_IEEE32_SGE_LENGTH_MASK) >> MPI2_IEEE32_SGE_FLAGS_SHIFT) ++#define MPI2_IEEE32_SGE_LENGTH(f) ((f) & MPI2_IEEE32_SGE_LENGTH_MASK) ++ ++#define MPI2_IEEE32_SGE_SET_FLAGS_LENGTH(f, l) (MPI2_IEEE32_SGE_SET_FLAGS(f) | MPI2_IEEE32_SGE_LENGTH(l)) ++ ++#define MPI2_IEEE32_pSGE_GET_FLAGS(psg) MPI2_IEEE32_SGE_GET_FLAGS((psg)->FlagsLength) ++#define MPI2_IEEE32_pSGE_GET_LENGTH(psg) MPI2_IEEE32_SGE_LENGTH((psg)->FlagsLength) ++#define MPI2_IEEE32_pSGE_SET_FLAGS_LENGTH(psg,f,l) (psg)->FlagsLength = MPI2_IEEE32_SGE_SET_FLAGS_LENGTH(f,l) ++ ++/* CAUTION - The following are READ-MODIFY-WRITE! */ ++#define MPI2_IEEE32_pSGE_SET_FLAGS(psg,f) (psg)->FlagsLength |= MPI2_IEEE32_SGE_SET_FLAGS(f) ++#define MPI2_IEEE32_pSGE_SET_LENGTH(psg,l) (psg)->FlagsLength |= MPI2_IEEE32_SGE_LENGTH(l) ++ ++ ++ ++ ++/***************************************************************************** ++* ++* Fusion-MPT MPI/IEEE Scatter Gather Unions ++* ++*****************************************************************************/ ++ ++typedef union _MPI2_SIMPLE_SGE_UNION ++{ ++ MPI2_SGE_SIMPLE_UNION MpiSimple; ++ MPI2_IEEE_SGE_SIMPLE_UNION IeeeSimple; ++} MPI2_SIMPLE_SGE_UNION, MPI2_POINTER PTR_MPI2_SIMPLE_SGE_UNION, ++ Mpi2SimpleSgeUntion_t, MPI2_POINTER pMpi2SimpleSgeUntion_t; ++ ++ ++typedef union _MPI2_SGE_IO_UNION ++{ ++ MPI2_SGE_SIMPLE_UNION MpiSimple; ++ MPI2_SGE_CHAIN_UNION MpiChain; ++ MPI2_IEEE_SGE_SIMPLE_UNION IeeeSimple; ++ MPI2_IEEE_SGE_CHAIN_UNION IeeeChain; ++} MPI2_SGE_IO_UNION, MPI2_POINTER PTR_MPI2_SGE_IO_UNION, ++ Mpi2SGEIOUnion_t, MPI2_POINTER pMpi2SGEIOUnion_t; ++ ++ ++/**************************************************************************** ++* ++* Values for SGLFlags field, used in many request messages with an SGL ++* ++****************************************************************************/ ++ ++/* values for MPI SGL Data Location Address Space subfield */ ++#define MPI2_SGLFLAGS_ADDRESS_SPACE_MASK (0x0C) ++#define MPI2_SGLFLAGS_SYSTEM_ADDRESS_SPACE (0x00) ++#define MPI2_SGLFLAGS_IOCDDR_ADDRESS_SPACE (0x04) ++#define MPI2_SGLFLAGS_IOCPLB_ADDRESS_SPACE (0x08) ++#define MPI2_SGLFLAGS_IOCPLBNTA_ADDRESS_SPACE (0x0C) ++/* values for SGL Type subfield */ ++#define MPI2_SGLFLAGS_SGL_TYPE_MASK (0x03) ++#define MPI2_SGLFLAGS_SGL_TYPE_MPI (0x00) ++#define MPI2_SGLFLAGS_SGL_TYPE_IEEE32 (0x01) ++#define MPI2_SGLFLAGS_SGL_TYPE_IEEE64 (0x02) ++ ++ ++#endif ++ +diff -r e02b4006a7c8 drivers/scsi/mpt2sas/mpi/mpi2_cnfg.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/scsi/mpt2sas/mpi/mpi2_cnfg.h Wed Jul 01 09:49:59 2009 +0100 +@@ -0,0 +1,2151 @@ ++/* ++ * Copyright (c) 2000-2009 LSI Corporation. ++ * ++ * ++ * Name: mpi2_cnfg.h ++ * Title: MPI Configuration messages and pages ++ * Creation Date: November 10, 2006 ++ * ++ * mpi2_cnfg.h Version: 02.00.10 ++ * ++ * Version History ++ * --------------- ++ * ++ * Date Version Description ++ * -------- -------- ------------------------------------------------------ ++ * 04-30-07 02.00.00 Corresponds to Fusion-MPT MPI Specification Rev A. ++ * 06-04-07 02.00.01 Added defines for SAS IO Unit Page 2 PhyFlags. ++ * Added Manufacturing Page 11. ++ * Added MPI2_SAS_EXPANDER0_FLAGS_CONNECTOR_END_DEVICE ++ * define. ++ * 06-26-07 02.00.02 Adding generic structure for product-specific ++ * Manufacturing pages: MPI2_CONFIG_PAGE_MANUFACTURING_PS. ++ * Rework of BIOS Page 2 configuration page. ++ * Fixed MPI2_BIOSPAGE2_BOOT_DEVICE to be a union of the ++ * forms. ++ * Added configuration pages IOC Page 8 and Driver ++ * Persistent Mapping Page 0. ++ * 08-31-07 02.00.03 Modified configuration pages dealing with Integrated ++ * RAID (Manufacturing Page 4, RAID Volume Pages 0 and 1, ++ * RAID Physical Disk Pages 0 and 1, RAID Configuration ++ * Page 0). ++ * Added new value for AccessStatus field of SAS Device ++ * Page 0 (_SATA_NEEDS_INITIALIZATION). ++ * 10-31-07 02.00.04 Added missing SEPDevHandle field to ++ * MPI2_CONFIG_PAGE_SAS_ENCLOSURE_0. ++ * 12-18-07 02.00.05 Modified IO Unit Page 0 to use 32-bit version fields for ++ * NVDATA. ++ * Modified IOC Page 7 to use masks and added field for ++ * SASBroadcastPrimitiveMasks. ++ * Added MPI2_CONFIG_PAGE_BIOS_4. ++ * Added MPI2_CONFIG_PAGE_LOG_0. ++ * 02-29-08 02.00.06 Modified various names to make them 32-character unique. ++ * Added SAS Device IDs. ++ * Updated Integrated RAID configuration pages including ++ * Manufacturing Page 4, IOC Page 6, and RAID Configuration ++ * Page 0. ++ * 05-21-08 02.00.07 Added define MPI2_MANPAGE4_MIX_SSD_SAS_SATA. ++ * Added define MPI2_MANPAGE4_PHYSDISK_128MB_COERCION. ++ * Fixed define MPI2_IOCPAGE8_FLAGS_ENCLOSURE_SLOT_MAPPING. ++ * Added missing MaxNumRoutedSasAddresses field to ++ * MPI2_CONFIG_PAGE_EXPANDER_0. ++ * Added SAS Port Page 0. ++ * Modified structure layout for ++ * MPI2_CONFIG_PAGE_DRIVER_MAPPING_0. ++ * 06-27-08 02.00.08 Changed MPI2_CONFIG_PAGE_RD_PDISK_1 to use ++ * MPI2_RAID_PHYS_DISK1_PATH_MAX to size the array. ++ * 10-02-08 02.00.09 Changed MPI2_RAID_PGAD_CONFIGNUM_MASK from 0x0000FFFF ++ * to 0x000000FF. ++ * Added two new values for the Physical Disk Coercion Size ++ * bits in the Flags field of Manufacturing Page 4. ++ * Added product-specific Manufacturing pages 16 to 31. ++ * Modified Flags bits for controlling write cache on SATA ++ * drives in IO Unit Page 1. ++ * Added new bit to AdditionalControlFlags of SAS IO Unit ++ * Page 1 to control Invalid Topology Correction. ++ * Added additional defines for RAID Volume Page 0 ++ * VolumeStatusFlags field. ++ * Modified meaning of RAID Volume Page 0 VolumeSettings ++ * define for auto-configure of hot-swap drives. ++ * Added SupportedPhysDisks field to RAID Volume Page 1 and ++ * added related defines. ++ * Added PhysDiskAttributes field (and related defines) to ++ * RAID Physical Disk Page 0. ++ * Added MPI2_SAS_PHYINFO_PHY_VACANT define. ++ * Added three new DiscoveryStatus bits for SAS IO Unit ++ * Page 0 and SAS Expander Page 0. ++ * Removed multiplexing information from SAS IO Unit pages. ++ * Added BootDeviceWaitTime field to SAS IO Unit Page 4. ++ * Removed Zone Address Resolved bit from PhyInfo and from ++ * Expander Page 0 Flags field. ++ * Added two new AccessStatus values to SAS Device Page 0 ++ * for indicating routing problems. Added 3 reserved words ++ * to this page. ++ * 01-19-09 02.00.10 Fixed defines for GPIOVal field of IO Unit Page 3. ++ * Inserted missing reserved field into structure for IOC ++ * Page 6. ++ * Added more pending task bits to RAID Volume Page 0 ++ * VolumeStatusFlags defines. ++ * Added MPI2_PHYSDISK0_STATUS_FLAG_NOT_CERTIFIED define. ++ * Added a new DiscoveryStatus bit for SAS IO Unit Page 0 ++ * and SAS Expander Page 0 to flag a downstream initiator ++ * when in simplified routing mode. ++ * Removed SATA Init Failure defines for DiscoveryStatus ++ * fields of SAS IO Unit Page 0 and SAS Expander Page 0. ++ * Added MPI2_SAS_DEVICE0_ASTATUS_DEVICE_BLOCKED define. ++ * Added PortGroups, DmaGroup, and ControlGroup fields to ++ * SAS Device Page 0. ++ * -------------------------------------------------------------------------- ++ */ ++ ++#ifndef MPI2_CNFG_H ++#define MPI2_CNFG_H ++ ++/***************************************************************************** ++* Configuration Page Header and defines ++*****************************************************************************/ ++ ++/* Config Page Header */ ++typedef struct _MPI2_CONFIG_PAGE_HEADER ++{ ++ U8 PageVersion; /* 0x00 */ ++ U8 PageLength; /* 0x01 */ ++ U8 PageNumber; /* 0x02 */ ++ U8 PageType; /* 0x03 */ ++} MPI2_CONFIG_PAGE_HEADER, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_HEADER, ++ Mpi2ConfigPageHeader_t, MPI2_POINTER pMpi2ConfigPageHeader_t; ++ ++typedef union _MPI2_CONFIG_PAGE_HEADER_UNION ++{ ++ MPI2_CONFIG_PAGE_HEADER Struct; ++ U8 Bytes[4]; ++ U16 Word16[2]; ++ U32 Word32; ++} MPI2_CONFIG_PAGE_HEADER_UNION, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_HEADER_UNION, ++ Mpi2ConfigPageHeaderUnion, MPI2_POINTER pMpi2ConfigPageHeaderUnion; ++ ++/* Extended Config Page Header */ ++typedef struct _MPI2_CONFIG_EXTENDED_PAGE_HEADER ++{ ++ U8 PageVersion; /* 0x00 */ ++ U8 Reserved1; /* 0x01 */ ++ U8 PageNumber; /* 0x02 */ ++ U8 PageType; /* 0x03 */ ++ U16 ExtPageLength; /* 0x04 */ ++ U8 ExtPageType; /* 0x06 */ ++ U8 Reserved2; /* 0x07 */ ++} MPI2_CONFIG_EXTENDED_PAGE_HEADER, ++ MPI2_POINTER PTR_MPI2_CONFIG_EXTENDED_PAGE_HEADER, ++ Mpi2ConfigExtendedPageHeader_t, MPI2_POINTER pMpi2ConfigExtendedPageHeader_t; ++ ++typedef union _MPI2_CONFIG_EXT_PAGE_HEADER_UNION ++{ ++ MPI2_CONFIG_PAGE_HEADER Struct; ++ MPI2_CONFIG_EXTENDED_PAGE_HEADER Ext; ++ U8 Bytes[8]; ++ U16 Word16[4]; ++ U32 Word32[2]; ++} MPI2_CONFIG_EXT_PAGE_HEADER_UNION, MPI2_POINTER PTR_MPI2_CONFIG_EXT_PAGE_HEADER_UNION, ++ Mpi2ConfigPageExtendedHeaderUnion, MPI2_POINTER pMpi2ConfigPageExtendedHeaderUnion; ++ ++ ++/* PageType field values */ ++#define MPI2_CONFIG_PAGEATTR_READ_ONLY (0x00) ++#define MPI2_CONFIG_PAGEATTR_CHANGEABLE (0x10) ++#define MPI2_CONFIG_PAGEATTR_PERSISTENT (0x20) ++#define MPI2_CONFIG_PAGEATTR_MASK (0xF0) ++ ++#define MPI2_CONFIG_PAGETYPE_IO_UNIT (0x00) ++#define MPI2_CONFIG_PAGETYPE_IOC (0x01) ++#define MPI2_CONFIG_PAGETYPE_BIOS (0x02) ++#define MPI2_CONFIG_PAGETYPE_RAID_VOLUME (0x08) ++#define MPI2_CONFIG_PAGETYPE_MANUFACTURING (0x09) ++#define MPI2_CONFIG_PAGETYPE_RAID_PHYSDISK (0x0A) ++#define MPI2_CONFIG_PAGETYPE_EXTENDED (0x0F) ++#define MPI2_CONFIG_PAGETYPE_MASK (0x0F) ++ ++#define MPI2_CONFIG_TYPENUM_MASK (0x0FFF) ++ ++ ++/* ExtPageType field values */ ++#define MPI2_CONFIG_EXTPAGETYPE_SAS_IO_UNIT (0x10) ++#define MPI2_CONFIG_EXTPAGETYPE_SAS_EXPANDER (0x11) ++#define MPI2_CONFIG_EXTPAGETYPE_SAS_DEVICE (0x12) ++#define MPI2_CONFIG_EXTPAGETYPE_SAS_PHY (0x13) ++#define MPI2_CONFIG_EXTPAGETYPE_LOG (0x14) ++#define MPI2_CONFIG_EXTPAGETYPE_ENCLOSURE (0x15) ++#define MPI2_CONFIG_EXTPAGETYPE_RAID_CONFIG (0x16) ++#define MPI2_CONFIG_EXTPAGETYPE_DRIVER_MAPPING (0x17) ++#define MPI2_CONFIG_EXTPAGETYPE_SAS_PORT (0x18) ++ ++ ++/***************************************************************************** ++* PageAddress defines ++*****************************************************************************/ ++ ++/* RAID Volume PageAddress format */ ++#define MPI2_RAID_VOLUME_PGAD_FORM_MASK (0xF0000000) ++#define MPI2_RAID_VOLUME_PGAD_FORM_GET_NEXT_HANDLE (0x00000000) ++#define MPI2_RAID_VOLUME_PGAD_FORM_HANDLE (0x10000000) ++ ++#define MPI2_RAID_VOLUME_PGAD_HANDLE_MASK (0x0000FFFF) ++ ++ ++/* RAID Physical Disk PageAddress format */ ++#define MPI2_PHYSDISK_PGAD_FORM_MASK (0xF0000000) ++#define MPI2_PHYSDISK_PGAD_FORM_GET_NEXT_PHYSDISKNUM (0x00000000) ++#define MPI2_PHYSDISK_PGAD_FORM_PHYSDISKNUM (0x10000000) ++#define MPI2_PHYSDISK_PGAD_FORM_DEVHANDLE (0x20000000) ++ ++#define MPI2_PHYSDISK_PGAD_PHYSDISKNUM_MASK (0x000000FF) ++#define MPI2_PHYSDISK_PGAD_DEVHANDLE_MASK (0x0000FFFF) ++ ++ ++/* SAS Expander PageAddress format */ ++#define MPI2_SAS_EXPAND_PGAD_FORM_MASK (0xF0000000) ++#define MPI2_SAS_EXPAND_PGAD_FORM_GET_NEXT_HNDL (0x00000000) ++#define MPI2_SAS_EXPAND_PGAD_FORM_HNDL_PHY_NUM (0x10000000) ++#define MPI2_SAS_EXPAND_PGAD_FORM_HNDL (0x20000000) ++ ++#define MPI2_SAS_EXPAND_PGAD_HANDLE_MASK (0x0000FFFF) ++#define MPI2_SAS_EXPAND_PGAD_PHYNUM_MASK (0x00FF0000) ++#define MPI2_SAS_EXPAND_PGAD_PHYNUM_SHIFT (16) ++ ++ ++/* SAS Device PageAddress format */ ++#define MPI2_SAS_DEVICE_PGAD_FORM_MASK (0xF0000000) ++#define MPI2_SAS_DEVICE_PGAD_FORM_GET_NEXT_HANDLE (0x00000000) ++#define MPI2_SAS_DEVICE_PGAD_FORM_HANDLE (0x20000000) ++ ++#define MPI2_SAS_DEVICE_PGAD_HANDLE_MASK (0x0000FFFF) ++ ++ ++/* SAS PHY PageAddress format */ ++#define MPI2_SAS_PHY_PGAD_FORM_MASK (0xF0000000) ++#define MPI2_SAS_PHY_PGAD_FORM_PHY_NUMBER (0x00000000) ++#define MPI2_SAS_PHY_PGAD_FORM_PHY_TBL_INDEX (0x10000000) ++ ++#define MPI2_SAS_PHY_PGAD_PHY_NUMBER_MASK (0x000000FF) ++#define MPI2_SAS_PHY_PGAD_PHY_TBL_INDEX_MASK (0x0000FFFF) ++ ++ ++/* SAS Port PageAddress format */ ++#define MPI2_SASPORT_PGAD_FORM_MASK (0xF0000000) ++#define MPI2_SASPORT_PGAD_FORM_GET_NEXT_PORT (0x00000000) ++#define MPI2_SASPORT_PGAD_FORM_PORT_NUM (0x10000000) ++ ++#define MPI2_SASPORT_PGAD_PORTNUMBER_MASK (0x00000FFF) ++ ++ ++/* SAS Enclosure PageAddress format */ ++#define MPI2_SAS_ENCLOS_PGAD_FORM_MASK (0xF0000000) ++#define MPI2_SAS_ENCLOS_PGAD_FORM_GET_NEXT_HANDLE (0x00000000) ++#define MPI2_SAS_ENCLOS_PGAD_FORM_HANDLE (0x10000000) ++ ++#define MPI2_SAS_ENCLOS_PGAD_HANDLE_MASK (0x0000FFFF) ++ ++ ++/* RAID Configuration PageAddress format */ ++#define MPI2_RAID_PGAD_FORM_MASK (0xF0000000) ++#define MPI2_RAID_PGAD_FORM_GET_NEXT_CONFIGNUM (0x00000000) ++#define MPI2_RAID_PGAD_FORM_CONFIGNUM (0x10000000) ++#define MPI2_RAID_PGAD_FORM_ACTIVE_CONFIG (0x20000000) ++ ++#define MPI2_RAID_PGAD_CONFIGNUM_MASK (0x000000FF) ++ ++ ++/* Driver Persistent Mapping PageAddress format */ ++#define MPI2_DPM_PGAD_FORM_MASK (0xF0000000) ++#define MPI2_DPM_PGAD_FORM_ENTRY_RANGE (0x00000000) ++ ++#define MPI2_DPM_PGAD_ENTRY_COUNT_MASK (0x0FFF0000) ++#define MPI2_DPM_PGAD_ENTRY_COUNT_SHIFT (16) ++#define MPI2_DPM_PGAD_START_ENTRY_MASK (0x0000FFFF) ++ ++ ++/**************************************************************************** ++* Configuration messages ++****************************************************************************/ ++ ++/* Configuration Request Message */ ++typedef struct _MPI2_CONFIG_REQUEST ++{ ++ U8 Action; /* 0x00 */ ++ U8 SGLFlags; /* 0x01 */ ++ U8 ChainOffset; /* 0x02 */ ++ U8 Function; /* 0x03 */ ++ U16 ExtPageLength; /* 0x04 */ ++ U8 ExtPageType; /* 0x06 */ ++ U8 MsgFlags; /* 0x07 */ ++ U8 VP_ID; /* 0x08 */ ++ U8 VF_ID; /* 0x09 */ ++ U16 Reserved1; /* 0x0A */ ++ U32 Reserved2; /* 0x0C */ ++ U32 Reserved3; /* 0x10 */ ++ MPI2_CONFIG_PAGE_HEADER Header; /* 0x14 */ ++ U32 PageAddress; /* 0x18 */ ++ MPI2_SGE_IO_UNION PageBufferSGE; /* 0x1C */ ++} MPI2_CONFIG_REQUEST, MPI2_POINTER PTR_MPI2_CONFIG_REQUEST, ++ Mpi2ConfigRequest_t, MPI2_POINTER pMpi2ConfigRequest_t; ++ ++/* values for the Action field */ ++#define MPI2_CONFIG_ACTION_PAGE_HEADER (0x00) ++#define MPI2_CONFIG_ACTION_PAGE_READ_CURRENT (0x01) ++#define MPI2_CONFIG_ACTION_PAGE_WRITE_CURRENT (0x02) ++#define MPI2_CONFIG_ACTION_PAGE_DEFAULT (0x03) ++#define MPI2_CONFIG_ACTION_PAGE_WRITE_NVRAM (0x04) ++#define MPI2_CONFIG_ACTION_PAGE_READ_DEFAULT (0x05) ++#define MPI2_CONFIG_ACTION_PAGE_READ_NVRAM (0x06) ++#define MPI2_CONFIG_ACTION_PAGE_GET_CHANGEABLE (0x07) ++ ++/* values for SGLFlags field are in the SGL section of mpi2.h */ ++ ++ ++/* Config Reply Message */ ++typedef struct _MPI2_CONFIG_REPLY ++{ ++ U8 Action; /* 0x00 */ ++ U8 SGLFlags; /* 0x01 */ ++ U8 MsgLength; /* 0x02 */ ++ U8 Function; /* 0x03 */ ++ U16 ExtPageLength; /* 0x04 */ ++ U8 ExtPageType; /* 0x06 */ ++ U8 MsgFlags; /* 0x07 */ ++ U8 VP_ID; /* 0x08 */ ++ U8 VF_ID; /* 0x09 */ ++ U16 Reserved1; /* 0x0A */ ++ U16 Reserved2; /* 0x0C */ ++ U16 IOCStatus; /* 0x0E */ ++ U32 IOCLogInfo; /* 0x10 */ ++ MPI2_CONFIG_PAGE_HEADER Header; /* 0x14 */ ++} MPI2_CONFIG_REPLY, MPI2_POINTER PTR_MPI2_CONFIG_REPLY, ++ Mpi2ConfigReply_t, MPI2_POINTER pMpi2ConfigReply_t; ++ ++ ++ ++/***************************************************************************** ++* ++* C o n f i g u r a t i o n P a g e s ++* ++*****************************************************************************/ ++ ++/**************************************************************************** ++* Manufacturing Config pages ++****************************************************************************/ ++ ++#define MPI2_MFGPAGE_VENDORID_LSI (0x1000) ++ ++/* SAS */ ++#define MPI2_MFGPAGE_DEVID_SAS2004 (0x0070) ++#define MPI2_MFGPAGE_DEVID_SAS2008 (0x0072) ++#define MPI2_MFGPAGE_DEVID_SAS2108_1 (0x0074) ++#define MPI2_MFGPAGE_DEVID_SAS2108_2 (0x0076) ++#define MPI2_MFGPAGE_DEVID_SAS2108_3 (0x0077) ++#define MPI2_MFGPAGE_DEVID_SAS2116_1 (0x0064) ++#define MPI2_MFGPAGE_DEVID_SAS2116_2 (0x0065) ++ ++ ++/* Manufacturing Page 0 */ ++ ++typedef struct _MPI2_CONFIG_PAGE_MAN_0 ++{ ++ MPI2_CONFIG_PAGE_HEADER Header; /* 0x00 */ ++ U8 ChipName[16]; /* 0x04 */ ++ U8 ChipRevision[8]; /* 0x14 */ ++ U8 BoardName[16]; /* 0x1C */ ++ U8 BoardAssembly[16]; /* 0x2C */ ++ U8 BoardTracerNumber[16]; /* 0x3C */ ++} MPI2_CONFIG_PAGE_MAN_0, ++ MPI2_POINTER PTR_MPI2_CONFIG_PAGE_MAN_0, ++ Mpi2ManufacturingPage0_t, MPI2_POINTER pMpi2ManufacturingPage0_t; ++ ++#define MPI2_MANUFACTURING0_PAGEVERSION (0x00) ++ ++ ++/* Manufacturing Page 1 */ ++ ++typedef struct _MPI2_CONFIG_PAGE_MAN_1 ++{ ++ MPI2_CONFIG_PAGE_HEADER Header; /* 0x00 */ ++ U8 VPD[256]; /* 0x04 */ ++} MPI2_CONFIG_PAGE_MAN_1, ++ MPI2_POINTER PTR_MPI2_CONFIG_PAGE_MAN_1, ++ Mpi2ManufacturingPage1_t, MPI2_POINTER pMpi2ManufacturingPage1_t; ++ ++#define MPI2_MANUFACTURING1_PAGEVERSION (0x00) ++ ++ ++typedef struct _MPI2_CHIP_REVISION_ID ++{ ++ U16 DeviceID; /* 0x00 */ ++ U8 PCIRevisionID; /* 0x02 */ ++ U8 Reserved; /* 0x03 */ ++} MPI2_CHIP_REVISION_ID, MPI2_POINTER PTR_MPI2_CHIP_REVISION_ID, ++ Mpi2ChipRevisionId_t, MPI2_POINTER pMpi2ChipRevisionId_t; ++ ++ ++/* Manufacturing Page 2 */ ++ ++/* ++ * Host code (drivers, BIOS, utilities, etc.) should leave this define set to ++ * one and check Header.PageLength at runtime. ++ */ ++#ifndef MPI2_MAN_PAGE_2_HW_SETTINGS_WORDS ++#define MPI2_MAN_PAGE_2_HW_SETTINGS_WORDS (1) ++#endif ++ ++typedef struct _MPI2_CONFIG_PAGE_MAN_2 ++{ ++ MPI2_CONFIG_PAGE_HEADER Header; /* 0x00 */ ++ MPI2_CHIP_REVISION_ID ChipId; /* 0x04 */ ++ U32 HwSettings[MPI2_MAN_PAGE_2_HW_SETTINGS_WORDS];/* 0x08 */ ++} MPI2_CONFIG_PAGE_MAN_2, ++ MPI2_POINTER PTR_MPI2_CONFIG_PAGE_MAN_2, ++ Mpi2ManufacturingPage2_t, MPI2_POINTER pMpi2ManufacturingPage2_t; ++ ++#define MPI2_MANUFACTURING2_PAGEVERSION (0x00) ++ ++ ++/* Manufacturing Page 3 */ ++ ++/* ++ * Host code (drivers, BIOS, utilities, etc.) should leave this define set to ++ * one and check Header.PageLength at runtime. ++ */ ++#ifndef MPI2_MAN_PAGE_3_INFO_WORDS ++#define MPI2_MAN_PAGE_3_INFO_WORDS (1) ++#endif ++ ++typedef struct _MPI2_CONFIG_PAGE_MAN_3 ++{ ++ MPI2_CONFIG_PAGE_HEADER Header; /* 0x00 */ ++ MPI2_CHIP_REVISION_ID ChipId; /* 0x04 */ ++ U32 Info[MPI2_MAN_PAGE_3_INFO_WORDS];/* 0x08 */ ++} MPI2_CONFIG_PAGE_MAN_3, ++ MPI2_POINTER PTR_MPI2_CONFIG_PAGE_MAN_3, ++ Mpi2ManufacturingPage3_t, MPI2_POINTER pMpi2ManufacturingPage3_t; ++ ++#define MPI2_MANUFACTURING3_PAGEVERSION (0x00) ++ ++ ++/* Manufacturing Page 4 */ ++ ++typedef struct _MPI2_MANPAGE4_PWR_SAVE_SETTINGS ++{ ++ U8 PowerSaveFlags; /* 0x00 */ ++ U8 InternalOperationsSleepTime; /* 0x01 */ ++ U8 InternalOperationsRunTime; /* 0x02 */ ++ U8 HostIdleTime; /* 0x03 */ ++} MPI2_MANPAGE4_PWR_SAVE_SETTINGS, ++ MPI2_POINTER PTR_MPI2_MANPAGE4_PWR_SAVE_SETTINGS, ++ Mpi2ManPage4PwrSaveSettings_t, MPI2_POINTER pMpi2ManPage4PwrSaveSettings_t; ++ ++/* defines for the PowerSaveFlags field */ ++#define MPI2_MANPAGE4_MASK_POWERSAVE_MODE (0x03) ++#define MPI2_MANPAGE4_POWERSAVE_MODE_DISABLED (0x00) ++#define MPI2_MANPAGE4_CUSTOM_POWERSAVE_MODE (0x01) ++#define MPI2_MANPAGE4_FULL_POWERSAVE_MODE (0x02) ++ ++typedef struct _MPI2_CONFIG_PAGE_MAN_4 ++{ ++ MPI2_CONFIG_PAGE_HEADER Header; /* 0x00 */ ++ U32 Reserved1; /* 0x04 */ ++ U32 Flags; /* 0x08 */ ++ U8 InquirySize; /* 0x0C */ ++ U8 Reserved2; /* 0x0D */ ++ U16 Reserved3; /* 0x0E */ ++ U8 InquiryData[56]; /* 0x10 */ ++ U32 RAID0VolumeSettings; /* 0x48 */ ++ U32 RAID1EVolumeSettings; /* 0x4C */ ++ U32 RAID1VolumeSettings; /* 0x50 */ ++ U32 RAID10VolumeSettings; /* 0x54 */ ++ U32 Reserved4; /* 0x58 */ ++ U32 Reserved5; /* 0x5C */ ++ MPI2_MANPAGE4_PWR_SAVE_SETTINGS PowerSaveSettings; /* 0x60 */ ++ U8 MaxOCEDisks; /* 0x64 */ ++ U8 ResyncRate; /* 0x65 */ ++ U16 DataScrubDuration; /* 0x66 */ ++ U8 MaxHotSpares; /* 0x68 */ ++ U8 MaxPhysDisksPerVol; /* 0x69 */ ++ U8 MaxPhysDisks; /* 0x6A */ ++ U8 MaxVolumes; /* 0x6B */ ++} MPI2_CONFIG_PAGE_MAN_4, ++ MPI2_POINTER PTR_MPI2_CONFIG_PAGE_MAN_4, ++ Mpi2ManufacturingPage4_t, MPI2_POINTER pMpi2ManufacturingPage4_t; ++ ++#define MPI2_MANUFACTURING4_PAGEVERSION (0x0A) ++ ++/* Manufacturing Page 4 Flags field */ ++#define MPI2_MANPAGE4_METADATA_SIZE_MASK (0x00030000) ++#define MPI2_MANPAGE4_METADATA_512MB (0x00000000) ++ ++#define MPI2_MANPAGE4_MIX_SSD_SAS_SATA (0x00008000) ++#define MPI2_MANPAGE4_MIX_SSD_AND_NON_SSD (0x00004000) ++#define MPI2_MANPAGE4_HIDE_PHYSDISK_NON_IR (0x00002000) ++ ++#define MPI2_MANPAGE4_MASK_PHYSDISK_COERCION (0x00001C00) ++#define MPI2_MANPAGE4_PHYSDISK_COERCION_1GB (0x00000000) ++#define MPI2_MANPAGE4_PHYSDISK_128MB_COERCION (0x00000400) ++#define MPI2_MANPAGE4_PHYSDISK_ADAPTIVE_COERCION (0x00000800) ++#define MPI2_MANPAGE4_PHYSDISK_ZERO_COERCION (0x00000C00) ++ ++#define MPI2_MANPAGE4_MASK_BAD_BLOCK_MARKING (0x00000300) ++#define MPI2_MANPAGE4_DEFAULT_BAD_BLOCK_MARKING (0x00000000) ++#define MPI2_MANPAGE4_TABLE_BAD_BLOCK_MARKING (0x00000100) ++#define MPI2_MANPAGE4_WRITE_LONG_BAD_BLOCK_MARKING (0x00000200) ++ ++#define MPI2_MANPAGE4_FORCE_OFFLINE_FAILOVER (0x00000080) ++#define MPI2_MANPAGE4_RAID10_DISABLE (0x00000040) ++#define MPI2_MANPAGE4_RAID1E_DISABLE (0x00000020) ++#define MPI2_MANPAGE4_RAID1_DISABLE (0x00000010) ++#define MPI2_MANPAGE4_RAID0_DISABLE (0x00000008) ++#define MPI2_MANPAGE4_IR_MODEPAGE8_DISABLE (0x00000004) ++#define MPI2_MANPAGE4_IM_RESYNC_CACHE_ENABLE (0x00000002) ++#define MPI2_MANPAGE4_IR_NO_MIX_SAS_SATA (0x00000001) ++ ++ ++/* Manufacturing Page 5 */ ++ ++/* ++ * Host code (drivers, BIOS, utilities, etc.) should leave this define set to ++ * one and check Header.PageLength or NumPhys at runtime. ++ */ ++#ifndef MPI2_MAN_PAGE_5_PHY_ENTRIES ++#define MPI2_MAN_PAGE_5_PHY_ENTRIES (1) ++#endif ++ ++typedef struct _MPI2_MANUFACTURING5_ENTRY ++{ ++ U64 WWID; /* 0x00 */ ++ U64 DeviceName; /* 0x08 */ ++} MPI2_MANUFACTURING5_ENTRY, MPI2_POINTER PTR_MPI2_MANUFACTURING5_ENTRY, ++ Mpi2Manufacturing5Entry_t, MPI2_POINTER pMpi2Manufacturing5Entry_t; ++ ++typedef struct _MPI2_CONFIG_PAGE_MAN_5 ++{ ++ MPI2_CONFIG_PAGE_HEADER Header; /* 0x00 */ ++ U8 NumPhys; /* 0x04 */ ++ U8 Reserved1; /* 0x05 */ ++ U16 Reserved2; /* 0x06 */ ++ U32 Reserved3; /* 0x08 */ ++ U32 Reserved4; /* 0x0C */ ++ MPI2_MANUFACTURING5_ENTRY Phy[MPI2_MAN_PAGE_5_PHY_ENTRIES];/* 0x08 */ ++} MPI2_CONFIG_PAGE_MAN_5, ++ MPI2_POINTER PTR_MPI2_CONFIG_PAGE_MAN_5, ++ Mpi2ManufacturingPage5_t, MPI2_POINTER pMpi2ManufacturingPage5_t; ++ ++#define MPI2_MANUFACTURING5_PAGEVERSION (0x03) ++ ++ ++/* Manufacturing Page 6 */ ++ ++typedef struct _MPI2_CONFIG_PAGE_MAN_6 ++{ ++ MPI2_CONFIG_PAGE_HEADER Header; /* 0x00 */ ++ U32 ProductSpecificInfo;/* 0x04 */ ++} MPI2_CONFIG_PAGE_MAN_6, ++ MPI2_POINTER PTR_MPI2_CONFIG_PAGE_MAN_6, ++ Mpi2ManufacturingPage6_t, MPI2_POINTER pMpi2ManufacturingPage6_t; ++ ++#define MPI2_MANUFACTURING6_PAGEVERSION (0x00) ++ ++ ++/* Manufacturing Page 7 */ ++ ++typedef struct _MPI2_MANPAGE7_CONNECTOR_INFO ++{ ++ U32 Pinout; /* 0x00 */ ++ U8 Connector[16]; /* 0x04 */ ++ U8 Location; /* 0x14 */ ++ U8 Reserved1; /* 0x15 */ ++ U16 Slot; /* 0x16 */ ++ U32 Reserved2; /* 0x18 */ ++} MPI2_MANPAGE7_CONNECTOR_INFO, MPI2_POINTER PTR_MPI2_MANPAGE7_CONNECTOR_INFO, ++ Mpi2ManPage7ConnectorInfo_t, MPI2_POINTER pMpi2ManPage7ConnectorInfo_t; ++ ++/* defines for the Pinout field */ ++#define MPI2_MANPAGE7_PINOUT_SFF_8484_L4 (0x00080000) ++#define MPI2_MANPAGE7_PINOUT_SFF_8484_L3 (0x00040000) ++#define MPI2_MANPAGE7_PINOUT_SFF_8484_L2 (0x00020000) ++#define MPI2_MANPAGE7_PINOUT_SFF_8484_L1 (0x00010000) ++#define MPI2_MANPAGE7_PINOUT_SFF_8470_L4 (0x00000800) ++#define MPI2_MANPAGE7_PINOUT_SFF_8470_L3 (0x00000400) ++#define MPI2_MANPAGE7_PINOUT_SFF_8470_L2 (0x00000200) ++#define MPI2_MANPAGE7_PINOUT_SFF_8470_L1 (0x00000100) ++#define MPI2_MANPAGE7_PINOUT_SFF_8482 (0x00000002) ++#define MPI2_MANPAGE7_PINOUT_CONNECTION_UNKNOWN (0x00000001) ++ ++/* defines for the Location field */ ++#define MPI2_MANPAGE7_LOCATION_UNKNOWN (0x01) ++#define MPI2_MANPAGE7_LOCATION_INTERNAL (0x02) ++#define MPI2_MANPAGE7_LOCATION_EXTERNAL (0x04) ++#define MPI2_MANPAGE7_LOCATION_SWITCHABLE (0x08) ++#define MPI2_MANPAGE7_LOCATION_AUTO (0x10) ++#define MPI2_MANPAGE7_LOCATION_NOT_PRESENT (0x20) ++#define MPI2_MANPAGE7_LOCATION_NOT_CONNECTED (0x80) ++ ++/* ++ * Host code (drivers, BIOS, utilities, etc.) should leave this define set to ++ * one and check NumPhys at runtime. ++ */ ++#ifndef MPI2_MANPAGE7_CONNECTOR_INFO_MAX ++#define MPI2_MANPAGE7_CONNECTOR_INFO_MAX (1) ++#endif ++ ++typedef struct _MPI2_CONFIG_PAGE_MAN_7 ++{ ++ MPI2_CONFIG_PAGE_HEADER Header; /* 0x00 */ ++ U32 Reserved1; /* 0x04 */ ++ U32 Reserved2; /* 0x08 */ ++ U32 Flags; /* 0x0C */ ++ U8 EnclosureName[16]; /* 0x10 */ ++ U8 NumPhys; /* 0x20 */ ++ U8 Reserved3; /* 0x21 */ ++ U16 Reserved4; /* 0x22 */ ++ MPI2_MANPAGE7_CONNECTOR_INFO ConnectorInfo[MPI2_MANPAGE7_CONNECTOR_INFO_MAX]; /* 0x24 */ ++} MPI2_CONFIG_PAGE_MAN_7, ++ MPI2_POINTER PTR_MPI2_CONFIG_PAGE_MAN_7, ++ Mpi2ManufacturingPage7_t, MPI2_POINTER pMpi2ManufacturingPage7_t; ++ ++#define MPI2_MANUFACTURING7_PAGEVERSION (0x00) ++ ++/* defines for the Flags field */ ++#define MPI2_MANPAGE7_FLAG_USE_SLOT_INFO (0x00000001) ++ ++ ++/* ++ * Generic structure to use for product-specific manufacturing pages ++ * (currently Manufacturing Page 8 through Manufacturing Page 31). ++ */ ++ ++typedef struct _MPI2_CONFIG_PAGE_MAN_PS ++{ ++ MPI2_CONFIG_PAGE_HEADER Header; /* 0x00 */ ++ U32 ProductSpecificInfo;/* 0x04 */ ++} MPI2_CONFIG_PAGE_MAN_PS, ++ MPI2_POINTER PTR_MPI2_CONFIG_PAGE_MAN_PS, ++ Mpi2ManufacturingPagePS_t, MPI2_POINTER pMpi2ManufacturingPagePS_t; ++ ++#define MPI2_MANUFACTURING8_PAGEVERSION (0x00) ++#define MPI2_MANUFACTURING9_PAGEVERSION (0x00) ++#define MPI2_MANUFACTURING10_PAGEVERSION (0x00) ++#define MPI2_MANUFACTURING11_PAGEVERSION (0x00) ++#define MPI2_MANUFACTURING12_PAGEVERSION (0x00) ++#define MPI2_MANUFACTURING13_PAGEVERSION (0x00) ++#define MPI2_MANUFACTURING14_PAGEVERSION (0x00) ++#define MPI2_MANUFACTURING15_PAGEVERSION (0x00) ++#define MPI2_MANUFACTURING16_PAGEVERSION (0x00) ++#define MPI2_MANUFACTURING17_PAGEVERSION (0x00) ++#define MPI2_MANUFACTURING18_PAGEVERSION (0x00) ++#define MPI2_MANUFACTURING19_PAGEVERSION (0x00) ++#define MPI2_MANUFACTURING20_PAGEVERSION (0x00) ++#define MPI2_MANUFACTURING21_PAGEVERSION (0x00) ++#define MPI2_MANUFACTURING22_PAGEVERSION (0x00) ++#define MPI2_MANUFACTURING23_PAGEVERSION (0x00) ++#define MPI2_MANUFACTURING24_PAGEVERSION (0x00) ++#define MPI2_MANUFACTURING25_PAGEVERSION (0x00) ++#define MPI2_MANUFACTURING26_PAGEVERSION (0x00) ++#define MPI2_MANUFACTURING27_PAGEVERSION (0x00) ++#define MPI2_MANUFACTURING28_PAGEVERSION (0x00) ++#define MPI2_MANUFACTURING29_PAGEVERSION (0x00) ++#define MPI2_MANUFACTURING30_PAGEVERSION (0x00) ++#define MPI2_MANUFACTURING31_PAGEVERSION (0x00) ++ ++ ++/**************************************************************************** ++* IO Unit Config Pages ++****************************************************************************/ ++ ++/* IO Unit Page 0 */ ++ ++typedef struct _MPI2_CONFIG_PAGE_IO_UNIT_0 ++{ ++ MPI2_CONFIG_PAGE_HEADER Header; /* 0x00 */ ++ U64 UniqueValue; /* 0x04 */ ++ MPI2_VERSION_UNION NvdataVersionDefault; /* 0x08 */ ++ MPI2_VERSION_UNION NvdataVersionPersistent; /* 0x0A */ ++} MPI2_CONFIG_PAGE_IO_UNIT_0, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_IO_UNIT_0, ++ Mpi2IOUnitPage0_t, MPI2_POINTER pMpi2IOUnitPage0_t; ++ ++#define MPI2_IOUNITPAGE0_PAGEVERSION (0x02) ++ ++ ++/* IO Unit Page 1 */ ++ ++typedef struct _MPI2_CONFIG_PAGE_IO_UNIT_1 ++{ ++ MPI2_CONFIG_PAGE_HEADER Header; /* 0x00 */ ++ U32 Flags; /* 0x04 */ ++} MPI2_CONFIG_PAGE_IO_UNIT_1, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_IO_UNIT_1, ++ Mpi2IOUnitPage1_t, MPI2_POINTER pMpi2IOUnitPage1_t; ++ ++#define MPI2_IOUNITPAGE1_PAGEVERSION (0x04) ++ ++/* IO Unit Page 1 Flags defines */ ++#define MPI2_IOUNITPAGE1_MASK_SATA_WRITE_CACHE (0x00000600) ++#define MPI2_IOUNITPAGE1_ENABLE_SATA_WRITE_CACHE (0x00000000) ++#define MPI2_IOUNITPAGE1_DISABLE_SATA_WRITE_CACHE (0x00000200) ++#define MPI2_IOUNITPAGE1_UNCHANGED_SATA_WRITE_CACHE (0x00000400) ++#define MPI2_IOUNITPAGE1_NATIVE_COMMAND_Q_DISABLE (0x00000100) ++#define MPI2_IOUNITPAGE1_DISABLE_IR (0x00000040) ++#define MPI2_IOUNITPAGE1_DISABLE_TASK_SET_FULL_HANDLING (0x00000020) ++#define MPI2_IOUNITPAGE1_IR_USE_STATIC_VOLUME_ID (0x00000004) ++#define MPI2_IOUNITPAGE1_MULTI_PATHING (0x00000002) ++#define MPI2_IOUNITPAGE1_SINGLE_PATHING (0x00000000) ++ ++ ++/* IO Unit Page 3 */ ++ ++/* ++ * Host code (drivers, BIOS, utilities, etc.) should leave this define set to ++ * one and check Header.PageLength at runtime. ++ */ ++#ifndef MPI2_IO_UNIT_PAGE_3_GPIO_VAL_MAX ++#define MPI2_IO_UNIT_PAGE_3_GPIO_VAL_MAX (1) ++#endif ++ ++typedef struct _MPI2_CONFIG_PAGE_IO_UNIT_3 ++{ ++ MPI2_CONFIG_PAGE_HEADER Header; /* 0x00 */ ++ U8 GPIOCount; /* 0x04 */ ++ U8 Reserved1; /* 0x05 */ ++ U16 Reserved2; /* 0x06 */ ++ U16 GPIOVal[MPI2_IO_UNIT_PAGE_3_GPIO_VAL_MAX];/* 0x08 */ ++} MPI2_CONFIG_PAGE_IO_UNIT_3, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_IO_UNIT_3, ++ Mpi2IOUnitPage3_t, MPI2_POINTER pMpi2IOUnitPage3_t; ++ ++#define MPI2_IOUNITPAGE3_PAGEVERSION (0x01) ++ ++/* defines for IO Unit Page 3 GPIOVal field */ ++#define MPI2_IOUNITPAGE3_GPIO_FUNCTION_MASK (0xFFFC) ++#define MPI2_IOUNITPAGE3_GPIO_FUNCTION_SHIFT (2) ++#define MPI2_IOUNITPAGE3_GPIO_SETTING_OFF (0x0000) ++#define MPI2_IOUNITPAGE3_GPIO_SETTING_ON (0x0001) ++ ++ ++/**************************************************************************** ++* IOC Config Pages ++****************************************************************************/ ++ ++/* IOC Page 0 */ ++ ++typedef struct _MPI2_CONFIG_PAGE_IOC_0 ++{ ++ MPI2_CONFIG_PAGE_HEADER Header; /* 0x00 */ ++ U32 Reserved1; /* 0x04 */ ++ U32 Reserved2; /* 0x08 */ ++ U16 VendorID; /* 0x0C */ ++ U16 DeviceID; /* 0x0E */ ++ U8 RevisionID; /* 0x10 */ ++ U8 Reserved3; /* 0x11 */ ++ U16 Reserved4; /* 0x12 */ ++ U32 ClassCode; /* 0x14 */ ++ U16 SubsystemVendorID; /* 0x18 */ ++ U16 SubsystemID; /* 0x1A */ ++} MPI2_CONFIG_PAGE_IOC_0, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_IOC_0, ++ Mpi2IOCPage0_t, MPI2_POINTER pMpi2IOCPage0_t; ++ ++#define MPI2_IOCPAGE0_PAGEVERSION (0x02) ++ ++ ++/* IOC Page 1 */ ++ ++typedef struct _MPI2_CONFIG_PAGE_IOC_1 ++{ ++ MPI2_CONFIG_PAGE_HEADER Header; /* 0x00 */ ++ U32 Flags; /* 0x04 */ ++ U32 CoalescingTimeout; /* 0x08 */ ++ U8 CoalescingDepth; /* 0x0C */ ++ U8 PCISlotNum; /* 0x0D */ ++ U8 PCIBusNum; /* 0x0E */ ++ U8 PCIDomainSegment; /* 0x0F */ ++ U32 Reserved1; /* 0x10 */ ++ U32 Reserved2; /* 0x14 */ ++} MPI2_CONFIG_PAGE_IOC_1, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_IOC_1, ++ Mpi2IOCPage1_t, MPI2_POINTER pMpi2IOCPage1_t; ++ ++#define MPI2_IOCPAGE1_PAGEVERSION (0x05) ++ ++/* defines for IOC Page 1 Flags field */ ++#define MPI2_IOCPAGE1_REPLY_COALESCING (0x00000001) ++ ++#define MPI2_IOCPAGE1_PCISLOTNUM_UNKNOWN (0xFF) ++#define MPI2_IOCPAGE1_PCIBUSNUM_UNKNOWN (0xFF) ++#define MPI2_IOCPAGE1_PCIDOMAIN_UNKNOWN (0xFF) ++ ++/* IOC Page 6 */ ++ ++typedef struct _MPI2_CONFIG_PAGE_IOC_6 ++{ ++ MPI2_CONFIG_PAGE_HEADER Header; /* 0x00 */ ++ U32 CapabilitiesFlags; /* 0x04 */ ++ U8 MaxDrivesRAID0; /* 0x08 */ ++ U8 MaxDrivesRAID1; /* 0x09 */ ++ U8 MaxDrivesRAID1E; /* 0x0A */ ++ U8 MaxDrivesRAID10; /* 0x0B */ ++ U8 MinDrivesRAID0; /* 0x0C */ ++ U8 MinDrivesRAID1; /* 0x0D */ ++ U8 MinDrivesRAID1E; /* 0x0E */ ++ U8 MinDrivesRAID10; /* 0x0F */ ++ U32 Reserved1; /* 0x10 */ ++ U8 MaxGlobalHotSpares; /* 0x14 */ ++ U8 MaxPhysDisks; /* 0x15 */ ++ U8 MaxVolumes; /* 0x16 */ ++ U8 MaxConfigs; /* 0x17 */ ++ U8 MaxOCEDisks; /* 0x18 */ ++ U8 Reserved2; /* 0x19 */ ++ U16 Reserved3; /* 0x1A */ ++ U32 SupportedStripeSizeMapRAID0; /* 0x1C */ ++ U32 SupportedStripeSizeMapRAID1E; /* 0x20 */ ++ U32 SupportedStripeSizeMapRAID10; /* 0x24 */ ++ U32 Reserved4; /* 0x28 */ ++ U32 Reserved5; /* 0x2C */ ++ U16 DefaultMetadataSize; /* 0x30 */ ++ U16 Reserved6; /* 0x32 */ ++ U16 MaxBadBlockTableEntries; /* 0x34 */ ++ U16 Reserved7; /* 0x36 */ ++ U32 IRNvsramVersion; /* 0x38 */ ++} MPI2_CONFIG_PAGE_IOC_6, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_IOC_6, ++ Mpi2IOCPage6_t, MPI2_POINTER pMpi2IOCPage6_t; ++ ++#define MPI2_IOCPAGE6_PAGEVERSION (0x04) ++ ++/* defines for IOC Page 6 CapabilitiesFlags */ ++#define MPI2_IOCPAGE6_CAP_FLAGS_RAID10_SUPPORT (0x00000010) ++#define MPI2_IOCPAGE6_CAP_FLAGS_RAID1_SUPPORT (0x00000008) ++#define MPI2_IOCPAGE6_CAP_FLAGS_RAID1E_SUPPORT (0x00000004) ++#define MPI2_IOCPAGE6_CAP_FLAGS_RAID0_SUPPORT (0x00000002) ++#define MPI2_IOCPAGE6_CAP_FLAGS_GLOBAL_HOT_SPARE (0x00000001) ++ ++ ++/* IOC Page 7 */ ++ ++#define MPI2_IOCPAGE7_EVENTMASK_WORDS (4) ++ ++typedef struct _MPI2_CONFIG_PAGE_IOC_7 ++{ ++ MPI2_CONFIG_PAGE_HEADER Header; /* 0x00 */ ++ U32 Reserved1; /* 0x04 */ ++ U32 EventMasks[MPI2_IOCPAGE7_EVENTMASK_WORDS];/* 0x08 */ ++ U16 SASBroadcastPrimitiveMasks; /* 0x18 */ ++ U16 Reserved2; /* 0x1A */ ++ U32 Reserved3; /* 0x1C */ ++} MPI2_CONFIG_PAGE_IOC_7, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_IOC_7, ++ Mpi2IOCPage7_t, MPI2_POINTER pMpi2IOCPage7_t; ++ ++#define MPI2_IOCPAGE7_PAGEVERSION (0x01) ++ ++ ++/* IOC Page 8 */ ++ ++typedef struct _MPI2_CONFIG_PAGE_IOC_8 ++{ ++ MPI2_CONFIG_PAGE_HEADER Header; /* 0x00 */ ++ U8 NumDevsPerEnclosure; /* 0x04 */ ++ U8 Reserved1; /* 0x05 */ ++ U16 Reserved2; /* 0x06 */ ++ U16 MaxPersistentEntries; /* 0x08 */ ++ U16 MaxNumPhysicalMappedIDs; /* 0x0A */ ++ U16 Flags; /* 0x0C */ ++ U16 Reserved3; /* 0x0E */ ++ U16 IRVolumeMappingFlags; /* 0x10 */ ++ U16 Reserved4; /* 0x12 */ ++ U32 Reserved5; /* 0x14 */ ++} MPI2_CONFIG_PAGE_IOC_8, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_IOC_8, ++ Mpi2IOCPage8_t, MPI2_POINTER pMpi2IOCPage8_t; ++ ++#define MPI2_IOCPAGE8_PAGEVERSION (0x00) ++ ++/* defines for IOC Page 8 Flags field */ ++#define MPI2_IOCPAGE8_FLAGS_DA_START_SLOT_1 (0x00000020) ++#define MPI2_IOCPAGE8_FLAGS_RESERVED_TARGETID_0 (0x00000010) ++ ++#define MPI2_IOCPAGE8_FLAGS_MASK_MAPPING_MODE (0x0000000E) ++#define MPI2_IOCPAGE8_FLAGS_DEVICE_PERSISTENCE_MAPPING (0x00000000) ++#define MPI2_IOCPAGE8_FLAGS_ENCLOSURE_SLOT_MAPPING (0x00000002) ++ ++#define MPI2_IOCPAGE8_FLAGS_DISABLE_PERSISTENT_MAPPING (0x00000001) ++#define MPI2_IOCPAGE8_FLAGS_ENABLE_PERSISTENT_MAPPING (0x00000000) ++ ++/* defines for IOC Page 8 IRVolumeMappingFlags */ ++#define MPI2_IOCPAGE8_IRFLAGS_MASK_VOLUME_MAPPING_MODE (0x00000003) ++#define MPI2_IOCPAGE8_IRFLAGS_LOW_VOLUME_MAPPING (0x00000000) ++#define MPI2_IOCPAGE8_IRFLAGS_HIGH_VOLUME_MAPPING (0x00000001) ++ ++ ++/**************************************************************************** ++* BIOS Config Pages ++****************************************************************************/ ++ ++/* BIOS Page 1 */ ++ ++typedef struct _MPI2_CONFIG_PAGE_BIOS_1 ++{ ++ MPI2_CONFIG_PAGE_HEADER Header; /* 0x00 */ ++ U32 BiosOptions; /* 0x04 */ ++ U32 IOCSettings; /* 0x08 */ ++ U32 Reserved1; /* 0x0C */ ++ U32 DeviceSettings; /* 0x10 */ ++ U16 NumberOfDevices; /* 0x14 */ ++ U16 Reserved2; /* 0x16 */ ++ U16 IOTimeoutBlockDevicesNonRM; /* 0x18 */ ++ U16 IOTimeoutSequential; /* 0x1A */ ++ U16 IOTimeoutOther; /* 0x1C */ ++ U16 IOTimeoutBlockDevicesRM; /* 0x1E */ ++} MPI2_CONFIG_PAGE_BIOS_1, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_BIOS_1, ++ Mpi2BiosPage1_t, MPI2_POINTER pMpi2BiosPage1_t; ++ ++#define MPI2_BIOSPAGE1_PAGEVERSION (0x04) ++ ++/* values for BIOS Page 1 BiosOptions field */ ++#define MPI2_BIOSPAGE1_OPTIONS_DISABLE_BIOS (0x00000001) ++ ++/* values for BIOS Page 1 IOCSettings field */ ++#define MPI2_BIOSPAGE1_IOCSET_MASK_BOOT_PREFERENCE (0x00030000) ++#define MPI2_BIOSPAGE1_IOCSET_ENCLOSURE_SLOT_BOOT (0x00000000) ++#define MPI2_BIOSPAGE1_IOCSET_SAS_ADDRESS_BOOT (0x00010000) ++ ++#define MPI2_BIOSPAGE1_IOCSET_MASK_RM_SETTING (0x000000C0) ++#define MPI2_BIOSPAGE1_IOCSET_NONE_RM_SETTING (0x00000000) ++#define MPI2_BIOSPAGE1_IOCSET_BOOT_RM_SETTING (0x00000040) ++#define MPI2_BIOSPAGE1_IOCSET_MEDIA_RM_SETTING (0x00000080) ++ ++#define MPI2_BIOSPAGE1_IOCSET_MASK_ADAPTER_SUPPORT (0x00000030) ++#define MPI2_BIOSPAGE1_IOCSET_NO_SUPPORT (0x00000000) ++#define MPI2_BIOSPAGE1_IOCSET_BIOS_SUPPORT (0x00000010) ++#define MPI2_BIOSPAGE1_IOCSET_OS_SUPPORT (0x00000020) ++#define MPI2_BIOSPAGE1_IOCSET_ALL_SUPPORT (0x00000030) ++ ++#define MPI2_BIOSPAGE1_IOCSET_ALTERNATE_CHS (0x00000008) ++ ++/* values for BIOS Page 1 DeviceSettings field */ ++#define MPI2_BIOSPAGE1_DEVSET_DISABLE_SMART_POLLING (0x00000010) ++#define MPI2_BIOSPAGE1_DEVSET_DISABLE_SEQ_LUN (0x00000008) ++#define MPI2_BIOSPAGE1_DEVSET_DISABLE_RM_LUN (0x00000004) ++#define MPI2_BIOSPAGE1_DEVSET_DISABLE_NON_RM_LUN (0x00000002) ++#define MPI2_BIOSPAGE1_DEVSET_DISABLE_OTHER_LUN (0x00000001) ++ ++ ++/* BIOS Page 2 */ ++ ++typedef struct _MPI2_BOOT_DEVICE_ADAPTER_ORDER ++{ ++ U32 Reserved1; /* 0x00 */ ++ U32 Reserved2; /* 0x04 */ ++ U32 Reserved3; /* 0x08 */ ++ U32 Reserved4; /* 0x0C */ ++ U32 Reserved5; /* 0x10 */ ++ U32 Reserved6; /* 0x14 */ ++} MPI2_BOOT_DEVICE_ADAPTER_ORDER, ++ MPI2_POINTER PTR_MPI2_BOOT_DEVICE_ADAPTER_ORDER, ++ Mpi2BootDeviceAdapterOrder_t, MPI2_POINTER pMpi2BootDeviceAdapterOrder_t; ++ ++typedef struct _MPI2_BOOT_DEVICE_SAS_WWID ++{ ++ U64 SASAddress; /* 0x00 */ ++ U8 LUN[8]; /* 0x08 */ ++ U32 Reserved1; /* 0x10 */ ++ U32 Reserved2; /* 0x14 */ ++} MPI2_BOOT_DEVICE_SAS_WWID, MPI2_POINTER PTR_MPI2_BOOT_DEVICE_SAS_WWID, ++ Mpi2BootDeviceSasWwid_t, MPI2_POINTER pMpi2BootDeviceSasWwid_t; ++ ++typedef struct _MPI2_BOOT_DEVICE_ENCLOSURE_SLOT ++{ ++ U64 EnclosureLogicalID; /* 0x00 */ ++ U32 Reserved1; /* 0x08 */ ++ U32 Reserved2; /* 0x0C */ ++ U16 SlotNumber; /* 0x10 */ ++ U16 Reserved3; /* 0x12 */ ++ U32 Reserved4; /* 0x14 */ ++} MPI2_BOOT_DEVICE_ENCLOSURE_SLOT, ++ MPI2_POINTER PTR_MPI2_BOOT_DEVICE_ENCLOSURE_SLOT, ++ Mpi2BootDeviceEnclosureSlot_t, MPI2_POINTER pMpi2BootDeviceEnclosureSlot_t; ++ ++typedef struct _MPI2_BOOT_DEVICE_DEVICE_NAME ++{ ++ U64 DeviceName; /* 0x00 */ ++ U8 LUN[8]; /* 0x08 */ ++ U32 Reserved1; /* 0x10 */ ++ U32 Reserved2; /* 0x14 */ ++} MPI2_BOOT_DEVICE_DEVICE_NAME, MPI2_POINTER PTR_MPI2_BOOT_DEVICE_DEVICE_NAME, ++ Mpi2BootDeviceDeviceName_t, MPI2_POINTER pMpi2BootDeviceDeviceName_t; ++ ++typedef union _MPI2_MPI2_BIOSPAGE2_BOOT_DEVICE ++{ ++ MPI2_BOOT_DEVICE_ADAPTER_ORDER AdapterOrder; ++ MPI2_BOOT_DEVICE_SAS_WWID SasWwid; ++ MPI2_BOOT_DEVICE_ENCLOSURE_SLOT EnclosureSlot; ++ MPI2_BOOT_DEVICE_DEVICE_NAME DeviceName; ++} MPI2_BIOSPAGE2_BOOT_DEVICE, MPI2_POINTER PTR_MPI2_BIOSPAGE2_BOOT_DEVICE, ++ Mpi2BiosPage2BootDevice_t, MPI2_POINTER pMpi2BiosPage2BootDevice_t; ++ ++typedef struct _MPI2_CONFIG_PAGE_BIOS_2 ++{ ++ MPI2_CONFIG_PAGE_HEADER Header; /* 0x00 */ ++ U32 Reserved1; /* 0x04 */ ++ U32 Reserved2; /* 0x08 */ ++ U32 Reserved3; /* 0x0C */ ++ U32 Reserved4; /* 0x10 */ ++ U32 Reserved5; /* 0x14 */ ++ U32 Reserved6; /* 0x18 */ ++ U8 ReqBootDeviceForm; /* 0x1C */ ++ U8 Reserved7; /* 0x1D */ ++ U16 Reserved8; /* 0x1E */ ++ MPI2_BIOSPAGE2_BOOT_DEVICE RequestedBootDevice; /* 0x20 */ ++ U8 ReqAltBootDeviceForm; /* 0x38 */ ++ U8 Reserved9; /* 0x39 */ ++ U16 Reserved10; /* 0x3A */ ++ MPI2_BIOSPAGE2_BOOT_DEVICE RequestedAltBootDevice; /* 0x3C */ ++ U8 CurrentBootDeviceForm; /* 0x58 */ ++ U8 Reserved11; /* 0x59 */ ++ U16 Reserved12; /* 0x5A */ ++ MPI2_BIOSPAGE2_BOOT_DEVICE CurrentBootDevice; /* 0x58 */ ++} MPI2_CONFIG_PAGE_BIOS_2, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_BIOS_2, ++ Mpi2BiosPage2_t, MPI2_POINTER pMpi2BiosPage2_t; ++ ++#define MPI2_BIOSPAGE2_PAGEVERSION (0x04) ++ ++/* values for BIOS Page 2 BootDeviceForm fields */ ++#define MPI2_BIOSPAGE2_FORM_MASK (0x0F) ++#define MPI2_BIOSPAGE2_FORM_NO_DEVICE_SPECIFIED (0x00) ++#define MPI2_BIOSPAGE2_FORM_SAS_WWID (0x05) ++#define MPI2_BIOSPAGE2_FORM_ENCLOSURE_SLOT (0x06) ++#define MPI2_BIOSPAGE2_FORM_DEVICE_NAME (0x07) ++ ++ ++/* BIOS Page 3 */ ++ ++typedef struct _MPI2_ADAPTER_INFO ++{ ++ U8 PciBusNumber; /* 0x00 */ ++ U8 PciDeviceAndFunctionNumber; /* 0x01 */ ++ U16 AdapterFlags; /* 0x02 */ ++} MPI2_ADAPTER_INFO, MPI2_POINTER PTR_MPI2_ADAPTER_INFO, ++ Mpi2AdapterInfo_t, MPI2_POINTER pMpi2AdapterInfo_t; ++ ++#define MPI2_ADAPTER_INFO_FLAGS_EMBEDDED (0x0001) ++#define MPI2_ADAPTER_INFO_FLAGS_INIT_STATUS (0x0002) ++ ++typedef struct _MPI2_CONFIG_PAGE_BIOS_3 ++{ ++ MPI2_CONFIG_PAGE_HEADER Header; /* 0x00 */ ++ U32 GlobalFlags; /* 0x04 */ ++ U32 BiosVersion; /* 0x08 */ ++ MPI2_ADAPTER_INFO AdapterOrder[4]; /* 0x0C */ ++ U32 Reserved1; /* 0x1C */ ++} MPI2_CONFIG_PAGE_BIOS_3, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_BIOS_3, ++ Mpi2BiosPage3_t, MPI2_POINTER pMpi2BiosPage3_t; ++ ++#define MPI2_BIOSPAGE3_PAGEVERSION (0x00) ++ ++/* values for BIOS Page 3 GlobalFlags */ ++#define MPI2_BIOSPAGE3_FLAGS_PAUSE_ON_ERROR (0x00000002) ++#define MPI2_BIOSPAGE3_FLAGS_VERBOSE_ENABLE (0x00000004) ++#define MPI2_BIOSPAGE3_FLAGS_HOOK_INT_40_DISABLE (0x00000010) ++ ++#define MPI2_BIOSPAGE3_FLAGS_DEV_LIST_DISPLAY_MASK (0x000000E0) ++#define MPI2_BIOSPAGE3_FLAGS_INSTALLED_DEV_DISPLAY (0x00000000) ++#define MPI2_BIOSPAGE3_FLAGS_ADAPTER_DISPLAY (0x00000020) ++#define MPI2_BIOSPAGE3_FLAGS_ADAPTER_DEV_DISPLAY (0x00000040) ++ ++ ++/* BIOS Page 4 */ ++ ++/* ++ * Host code (drivers, BIOS, utilities, etc.) should leave this define set to ++ * one and check Header.PageLength or NumPhys at runtime. ++ */ ++#ifndef MPI2_BIOS_PAGE_4_PHY_ENTRIES ++#define MPI2_BIOS_PAGE_4_PHY_ENTRIES (1) ++#endif ++ ++typedef struct _MPI2_BIOS4_ENTRY ++{ ++ U64 ReassignmentWWID; /* 0x00 */ ++ U64 ReassignmentDeviceName; /* 0x08 */ ++} MPI2_BIOS4_ENTRY, MPI2_POINTER PTR_MPI2_BIOS4_ENTRY, ++ Mpi2MBios4Entry_t, MPI2_POINTER pMpi2Bios4Entry_t; ++ ++typedef struct _MPI2_CONFIG_PAGE_BIOS_4 ++{ ++ MPI2_CONFIG_PAGE_HEADER Header; /* 0x00 */ ++ U8 NumPhys; /* 0x04 */ ++ U8 Reserved1; /* 0x05 */ ++ U16 Reserved2; /* 0x06 */ ++ MPI2_BIOS4_ENTRY Phy[MPI2_BIOS_PAGE_4_PHY_ENTRIES]; /* 0x08 */ ++} MPI2_CONFIG_PAGE_BIOS_4, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_BIOS_4, ++ Mpi2BiosPage4_t, MPI2_POINTER pMpi2BiosPage4_t; ++ ++#define MPI2_BIOSPAGE4_PAGEVERSION (0x01) ++ ++ ++/**************************************************************************** ++* RAID Volume Config Pages ++****************************************************************************/ ++ ++/* RAID Volume Page 0 */ ++ ++typedef struct _MPI2_RAIDVOL0_PHYS_DISK ++{ ++ U8 RAIDSetNum; /* 0x00 */ ++ U8 PhysDiskMap; /* 0x01 */ ++ U8 PhysDiskNum; /* 0x02 */ ++ U8 Reserved; /* 0x03 */ ++} MPI2_RAIDVOL0_PHYS_DISK, MPI2_POINTER PTR_MPI2_RAIDVOL0_PHYS_DISK, ++ Mpi2RaidVol0PhysDisk_t, MPI2_POINTER pMpi2RaidVol0PhysDisk_t; ++ ++/* defines for the PhysDiskMap field */ ++#define MPI2_RAIDVOL0_PHYSDISK_PRIMARY (0x01) ++#define MPI2_RAIDVOL0_PHYSDISK_SECONDARY (0x02) ++ ++typedef struct _MPI2_RAIDVOL0_SETTINGS ++{ ++ U16 Settings; /* 0x00 */ ++ U8 HotSparePool; /* 0x01 */ ++ U8 Reserved; /* 0x02 */ ++} MPI2_RAIDVOL0_SETTINGS, MPI2_POINTER PTR_MPI2_RAIDVOL0_SETTINGS, ++ Mpi2RaidVol0Settings_t, MPI2_POINTER pMpi2RaidVol0Settings_t; ++ ++/* RAID Volume Page 0 HotSparePool defines, also used in RAID Physical Disk */ ++#define MPI2_RAID_HOT_SPARE_POOL_0 (0x01) ++#define MPI2_RAID_HOT_SPARE_POOL_1 (0x02) ++#define MPI2_RAID_HOT_SPARE_POOL_2 (0x04) ++#define MPI2_RAID_HOT_SPARE_POOL_3 (0x08) ++#define MPI2_RAID_HOT_SPARE_POOL_4 (0x10) ++#define MPI2_RAID_HOT_SPARE_POOL_5 (0x20) ++#define MPI2_RAID_HOT_SPARE_POOL_6 (0x40) ++#define MPI2_RAID_HOT_SPARE_POOL_7 (0x80) ++ ++/* RAID Volume Page 0 VolumeSettings defines */ ++#define MPI2_RAIDVOL0_SETTING_USE_PRODUCT_ID_SUFFIX (0x0008) ++#define MPI2_RAIDVOL0_SETTING_AUTO_CONFIG_HSWAP_DISABLE (0x0004) ++ ++#define MPI2_RAIDVOL0_SETTING_MASK_WRITE_CACHING (0x0003) ++#define MPI2_RAIDVOL0_SETTING_UNCHANGED (0x0000) ++#define MPI2_RAIDVOL0_SETTING_DISABLE_WRITE_CACHING (0x0001) ++#define MPI2_RAIDVOL0_SETTING_ENABLE_WRITE_CACHING (0x0002) ++ ++/* ++ * Host code (drivers, BIOS, utilities, etc.) should leave this define set to ++ * one and check Header.PageLength at runtime. ++ */ ++#ifndef MPI2_RAID_VOL_PAGE_0_PHYSDISK_MAX ++#define MPI2_RAID_VOL_PAGE_0_PHYSDISK_MAX (1) ++#endif ++ ++typedef struct _MPI2_CONFIG_PAGE_RAID_VOL_0 ++{ ++ MPI2_CONFIG_PAGE_HEADER Header; /* 0x00 */ ++ U16 DevHandle; /* 0x04 */ ++ U8 VolumeState; /* 0x06 */ ++ U8 VolumeType; /* 0x07 */ ++ U32 VolumeStatusFlags; /* 0x08 */ ++ MPI2_RAIDVOL0_SETTINGS VolumeSettings; /* 0x0C */ ++ U64 MaxLBA; /* 0x10 */ ++ U32 StripeSize; /* 0x18 */ ++ U16 BlockSize; /* 0x1C */ ++ U16 Reserved1; /* 0x1E */ ++ U8 SupportedPhysDisks; /* 0x20 */ ++ U8 ResyncRate; /* 0x21 */ ++ U16 DataScrubDuration; /* 0x22 */ ++ U8 NumPhysDisks; /* 0x24 */ ++ U8 Reserved2; /* 0x25 */ ++ U8 Reserved3; /* 0x26 */ ++ U8 InactiveStatus; /* 0x27 */ ++ MPI2_RAIDVOL0_PHYS_DISK PhysDisk[MPI2_RAID_VOL_PAGE_0_PHYSDISK_MAX]; /* 0x28 */ ++} MPI2_CONFIG_PAGE_RAID_VOL_0, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_RAID_VOL_0, ++ Mpi2RaidVolPage0_t, MPI2_POINTER pMpi2RaidVolPage0_t; ++ ++#define MPI2_RAIDVOLPAGE0_PAGEVERSION (0x0A) ++ ++/* values for RAID VolumeState */ ++#define MPI2_RAID_VOL_STATE_MISSING (0x00) ++#define MPI2_RAID_VOL_STATE_FAILED (0x01) ++#define MPI2_RAID_VOL_STATE_INITIALIZING (0x02) ++#define MPI2_RAID_VOL_STATE_ONLINE (0x03) ++#define MPI2_RAID_VOL_STATE_DEGRADED (0x04) ++#define MPI2_RAID_VOL_STATE_OPTIMAL (0x05) ++ ++/* values for RAID VolumeType */ ++#define MPI2_RAID_VOL_TYPE_RAID0 (0x00) ++#define MPI2_RAID_VOL_TYPE_RAID1E (0x01) ++#define MPI2_RAID_VOL_TYPE_RAID1 (0x02) ++#define MPI2_RAID_VOL_TYPE_RAID10 (0x05) ++#define MPI2_RAID_VOL_TYPE_UNKNOWN (0xFF) ++ ++/* values for RAID Volume Page 0 VolumeStatusFlags field */ ++#define MPI2_RAIDVOL0_STATUS_FLAG_PENDING_RESYNC (0x02000000) ++#define MPI2_RAIDVOL0_STATUS_FLAG_BACKG_INIT_PENDING (0x01000000) ++#define MPI2_RAIDVOL0_STATUS_FLAG_MDC_PENDING (0x00800000) ++#define MPI2_RAIDVOL0_STATUS_FLAG_USER_CONSIST_PENDING (0x00400000) ++#define MPI2_RAIDVOL0_STATUS_FLAG_MAKE_DATA_CONSISTENT (0x00200000) ++#define MPI2_RAIDVOL0_STATUS_FLAG_DATA_SCRUB (0x00100000) ++#define MPI2_RAIDVOL0_STATUS_FLAG_CONSISTENCY_CHECK (0x00080000) ++#define MPI2_RAIDVOL0_STATUS_FLAG_CAPACITY_EXPANSION (0x00040000) ++#define MPI2_RAIDVOL0_STATUS_FLAG_BACKGROUND_INIT (0x00020000) ++#define MPI2_RAIDVOL0_STATUS_FLAG_RESYNC_IN_PROGRESS (0x00010000) ++#define MPI2_RAIDVOL0_STATUS_FLAG_OCE_ALLOWED (0x00000040) ++#define MPI2_RAIDVOL0_STATUS_FLAG_BGI_COMPLETE (0x00000020) ++#define MPI2_RAIDVOL0_STATUS_FLAG_1E_OFFSET_MIRROR (0x00000000) ++#define MPI2_RAIDVOL0_STATUS_FLAG_1E_ADJACENT_MIRROR (0x00000010) ++#define MPI2_RAIDVOL0_STATUS_FLAG_BAD_BLOCK_TABLE_FULL (0x00000008) ++#define MPI2_RAIDVOL0_STATUS_FLAG_VOLUME_INACTIVE (0x00000004) ++#define MPI2_RAIDVOL0_STATUS_FLAG_QUIESCED (0x00000002) ++#define MPI2_RAIDVOL0_STATUS_FLAG_ENABLED (0x00000001) ++ ++/* values for RAID Volume Page 0 SupportedPhysDisks field */ ++#define MPI2_RAIDVOL0_SUPPORT_SOLID_STATE_DISKS (0x08) ++#define MPI2_RAIDVOL0_SUPPORT_HARD_DISKS (0x04) ++#define MPI2_RAIDVOL0_SUPPORT_SAS_PROTOCOL (0x02) ++#define MPI2_RAIDVOL0_SUPPORT_SATA_PROTOCOL (0x01) ++ ++/* values for RAID Volume Page 0 InactiveStatus field */ ++#define MPI2_RAIDVOLPAGE0_UNKNOWN_INACTIVE (0x00) ++#define MPI2_RAIDVOLPAGE0_STALE_METADATA_INACTIVE (0x01) ++#define MPI2_RAIDVOLPAGE0_FOREIGN_VOLUME_INACTIVE (0x02) ++#define MPI2_RAIDVOLPAGE0_INSUFFICIENT_RESOURCE_INACTIVE (0x03) ++#define MPI2_RAIDVOLPAGE0_CLONE_VOLUME_INACTIVE (0x04) ++#define MPI2_RAIDVOLPAGE0_INSUFFICIENT_METADATA_INACTIVE (0x05) ++#define MPI2_RAIDVOLPAGE0_PREVIOUSLY_DELETED (0x06) ++ ++ ++/* RAID Volume Page 1 */ ++ ++typedef struct _MPI2_CONFIG_PAGE_RAID_VOL_1 ++{ ++ MPI2_CONFIG_PAGE_HEADER Header; /* 0x00 */ ++ U16 DevHandle; /* 0x04 */ ++ U16 Reserved0; /* 0x06 */ ++ U8 GUID[24]; /* 0x08 */ ++ U8 Name[16]; /* 0x20 */ ++ U64 WWID; /* 0x30 */ ++ U32 Reserved1; /* 0x38 */ ++ U32 Reserved2; /* 0x3C */ ++} MPI2_CONFIG_PAGE_RAID_VOL_1, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_RAID_VOL_1, ++ Mpi2RaidVolPage1_t, MPI2_POINTER pMpi2RaidVolPage1_t; ++ ++#define MPI2_RAIDVOLPAGE1_PAGEVERSION (0x03) ++ ++ ++/**************************************************************************** ++* RAID Physical Disk Config Pages ++****************************************************************************/ ++ ++/* RAID Physical Disk Page 0 */ ++ ++typedef struct _MPI2_RAIDPHYSDISK0_SETTINGS ++{ ++ U16 Reserved1; /* 0x00 */ ++ U8 HotSparePool; /* 0x02 */ ++ U8 Reserved2; /* 0x03 */ ++} MPI2_RAIDPHYSDISK0_SETTINGS, MPI2_POINTER PTR_MPI2_RAIDPHYSDISK0_SETTINGS, ++ Mpi2RaidPhysDisk0Settings_t, MPI2_POINTER pMpi2RaidPhysDisk0Settings_t; ++ ++/* use MPI2_RAID_HOT_SPARE_POOL_ defines for the HotSparePool field */ ++ ++typedef struct _MPI2_RAIDPHYSDISK0_INQUIRY_DATA ++{ ++ U8 VendorID[8]; /* 0x00 */ ++ U8 ProductID[16]; /* 0x08 */ ++ U8 ProductRevLevel[4]; /* 0x18 */ ++ U8 SerialNum[32]; /* 0x1C */ ++} MPI2_RAIDPHYSDISK0_INQUIRY_DATA, ++ MPI2_POINTER PTR_MPI2_RAIDPHYSDISK0_INQUIRY_DATA, ++ Mpi2RaidPhysDisk0InquiryData_t, MPI2_POINTER pMpi2RaidPhysDisk0InquiryData_t; ++ ++typedef struct _MPI2_CONFIG_PAGE_RD_PDISK_0 ++{ ++ MPI2_CONFIG_PAGE_HEADER Header; /* 0x00 */ ++ U16 DevHandle; /* 0x04 */ ++ U8 Reserved1; /* 0x06 */ ++ U8 PhysDiskNum; /* 0x07 */ ++ MPI2_RAIDPHYSDISK0_SETTINGS PhysDiskSettings; /* 0x08 */ ++ U32 Reserved2; /* 0x0C */ ++ MPI2_RAIDPHYSDISK0_INQUIRY_DATA InquiryData; /* 0x10 */ ++ U32 Reserved3; /* 0x4C */ ++ U8 PhysDiskState; /* 0x50 */ ++ U8 OfflineReason; /* 0x51 */ ++ U8 IncompatibleReason; /* 0x52 */ ++ U8 PhysDiskAttributes; /* 0x53 */ ++ U32 PhysDiskStatusFlags; /* 0x54 */ ++ U64 DeviceMaxLBA; /* 0x58 */ ++ U64 HostMaxLBA; /* 0x60 */ ++ U64 CoercedMaxLBA; /* 0x68 */ ++ U16 BlockSize; /* 0x70 */ ++ U16 Reserved5; /* 0x72 */ ++ U32 Reserved6; /* 0x74 */ ++} MPI2_CONFIG_PAGE_RD_PDISK_0, ++ MPI2_POINTER PTR_MPI2_CONFIG_PAGE_RD_PDISK_0, ++ Mpi2RaidPhysDiskPage0_t, MPI2_POINTER pMpi2RaidPhysDiskPage0_t; ++ ++#define MPI2_RAIDPHYSDISKPAGE0_PAGEVERSION (0x05) ++ ++/* PhysDiskState defines */ ++#define MPI2_RAID_PD_STATE_NOT_CONFIGURED (0x00) ++#define MPI2_RAID_PD_STATE_NOT_COMPATIBLE (0x01) ++#define MPI2_RAID_PD_STATE_OFFLINE (0x02) ++#define MPI2_RAID_PD_STATE_ONLINE (0x03) ++#define MPI2_RAID_PD_STATE_HOT_SPARE (0x04) ++#define MPI2_RAID_PD_STATE_DEGRADED (0x05) ++#define MPI2_RAID_PD_STATE_REBUILDING (0x06) ++#define MPI2_RAID_PD_STATE_OPTIMAL (0x07) ++ ++/* OfflineReason defines */ ++#define MPI2_PHYSDISK0_ONLINE (0x00) ++#define MPI2_PHYSDISK0_OFFLINE_MISSING (0x01) ++#define MPI2_PHYSDISK0_OFFLINE_FAILED (0x03) ++#define MPI2_PHYSDISK0_OFFLINE_INITIALIZING (0x04) ++#define MPI2_PHYSDISK0_OFFLINE_REQUESTED (0x05) ++#define MPI2_PHYSDISK0_OFFLINE_FAILED_REQUESTED (0x06) ++#define MPI2_PHYSDISK0_OFFLINE_OTHER (0xFF) ++ ++/* IncompatibleReason defines */ ++#define MPI2_PHYSDISK0_COMPATIBLE (0x00) ++#define MPI2_PHYSDISK0_INCOMPATIBLE_PROTOCOL (0x01) ++#define MPI2_PHYSDISK0_INCOMPATIBLE_BLOCKSIZE (0x02) ++#define MPI2_PHYSDISK0_INCOMPATIBLE_MAX_LBA (0x03) ++#define MPI2_PHYSDISK0_INCOMPATIBLE_SATA_EXTENDED_CMD (0x04) ++#define MPI2_PHYSDISK0_INCOMPATIBLE_REMOVEABLE_MEDIA (0x05) ++#define MPI2_PHYSDISK0_INCOMPATIBLE_UNKNOWN (0xFF) ++ ++/* PhysDiskAttributes defines */ ++#define MPI2_PHYSDISK0_ATTRIB_SOLID_STATE_DRIVE (0x08) ++#define MPI2_PHYSDISK0_ATTRIB_HARD_DISK_DRIVE (0x04) ++#define MPI2_PHYSDISK0_ATTRIB_SAS_PROTOCOL (0x02) ++#define MPI2_PHYSDISK0_ATTRIB_SATA_PROTOCOL (0x01) ++ ++/* PhysDiskStatusFlags defines */ ++#define MPI2_PHYSDISK0_STATUS_FLAG_NOT_CERTIFIED (0x00000040) ++#define MPI2_PHYSDISK0_STATUS_FLAG_OCE_TARGET (0x00000020) ++#define MPI2_PHYSDISK0_STATUS_FLAG_WRITE_CACHE_ENABLED (0x00000010) ++#define MPI2_PHYSDISK0_STATUS_FLAG_OPTIMAL_PREVIOUS (0x00000000) ++#define MPI2_PHYSDISK0_STATUS_FLAG_NOT_OPTIMAL_PREVIOUS (0x00000008) ++#define MPI2_PHYSDISK0_STATUS_FLAG_INACTIVE_VOLUME (0x00000004) ++#define MPI2_PHYSDISK0_STATUS_FLAG_QUIESCED (0x00000002) ++#define MPI2_PHYSDISK0_STATUS_FLAG_OUT_OF_SYNC (0x00000001) ++ ++ ++/* RAID Physical Disk Page 1 */ ++ ++/* ++ * Host code (drivers, BIOS, utilities, etc.) should leave this define set to ++ * one and check Header.PageLength or NumPhysDiskPaths at runtime. ++ */ ++#ifndef MPI2_RAID_PHYS_DISK1_PATH_MAX ++#define MPI2_RAID_PHYS_DISK1_PATH_MAX (1) ++#endif ++ ++typedef struct _MPI2_RAIDPHYSDISK1_PATH ++{ ++ U16 DevHandle; /* 0x00 */ ++ U16 Reserved1; /* 0x02 */ ++ U64 WWID; /* 0x04 */ ++ U64 OwnerWWID; /* 0x0C */ ++ U8 OwnerIdentifier; /* 0x14 */ ++ U8 Reserved2; /* 0x15 */ ++ U16 Flags; /* 0x16 */ ++} MPI2_RAIDPHYSDISK1_PATH, MPI2_POINTER PTR_MPI2_RAIDPHYSDISK1_PATH, ++ Mpi2RaidPhysDisk1Path_t, MPI2_POINTER pMpi2RaidPhysDisk1Path_t; ++ ++/* RAID Physical Disk Page 1 Physical Disk Path Flags field defines */ ++#define MPI2_RAID_PHYSDISK1_FLAG_PRIMARY (0x0004) ++#define MPI2_RAID_PHYSDISK1_FLAG_BROKEN (0x0002) ++#define MPI2_RAID_PHYSDISK1_FLAG_INVALID (0x0001) ++ ++typedef struct _MPI2_CONFIG_PAGE_RD_PDISK_1 ++{ ++ MPI2_CONFIG_PAGE_HEADER Header; /* 0x00 */ ++ U8 NumPhysDiskPaths; /* 0x04 */ ++ U8 PhysDiskNum; /* 0x05 */ ++ U16 Reserved1; /* 0x06 */ ++ U32 Reserved2; /* 0x08 */ ++ MPI2_RAIDPHYSDISK1_PATH PhysicalDiskPath[MPI2_RAID_PHYS_DISK1_PATH_MAX];/* 0x0C */ ++} MPI2_CONFIG_PAGE_RD_PDISK_1, ++ MPI2_POINTER PTR_MPI2_CONFIG_PAGE_RD_PDISK_1, ++ Mpi2RaidPhysDiskPage1_t, MPI2_POINTER pMpi2RaidPhysDiskPage1_t; ++ ++#define MPI2_RAIDPHYSDISKPAGE1_PAGEVERSION (0x02) ++ ++ ++/**************************************************************************** ++* values for fields used by several types of SAS Config Pages ++****************************************************************************/ ++ ++/* values for NegotiatedLinkRates fields */ ++#define MPI2_SAS_NEG_LINK_RATE_MASK_LOGICAL (0xF0) ++#define MPI2_SAS_NEG_LINK_RATE_SHIFT_LOGICAL (4) ++#define MPI2_SAS_NEG_LINK_RATE_MASK_PHYSICAL (0x0F) ++/* link rates used for Negotiated Physical and Logical Link Rate */ ++#define MPI2_SAS_NEG_LINK_RATE_UNKNOWN_LINK_RATE (0x00) ++#define MPI2_SAS_NEG_LINK_RATE_PHY_DISABLED (0x01) ++#define MPI2_SAS_NEG_LINK_RATE_NEGOTIATION_FAILED (0x02) ++#define MPI2_SAS_NEG_LINK_RATE_SATA_OOB_COMPLETE (0x03) ++#define MPI2_SAS_NEG_LINK_RATE_PORT_SELECTOR (0x04) ++#define MPI2_SAS_NEG_LINK_RATE_SMP_RESET_IN_PROGRESS (0x05) ++#define MPI2_SAS_NEG_LINK_RATE_1_5 (0x08) ++#define MPI2_SAS_NEG_LINK_RATE_3_0 (0x09) ++#define MPI2_SAS_NEG_LINK_RATE_6_0 (0x0A) ++ ++ ++/* values for AttachedPhyInfo fields */ ++#define MPI2_SAS_APHYINFO_INSIDE_ZPSDS_PERSISTENT (0x00000040) ++#define MPI2_SAS_APHYINFO_REQUESTED_INSIDE_ZPSDS (0x00000020) ++#define MPI2_SAS_APHYINFO_BREAK_REPLY_CAPABLE (0x00000010) ++ ++#define MPI2_SAS_APHYINFO_REASON_MASK (0x0000000F) ++#define MPI2_SAS_APHYINFO_REASON_UNKNOWN (0x00000000) ++#define MPI2_SAS_APHYINFO_REASON_POWER_ON (0x00000001) ++#define MPI2_SAS_APHYINFO_REASON_HARD_RESET (0x00000002) ++#define MPI2_SAS_APHYINFO_REASON_SMP_PHY_CONTROL (0x00000003) ++#define MPI2_SAS_APHYINFO_REASON_LOSS_OF_SYNC (0x00000004) ++#define MPI2_SAS_APHYINFO_REASON_MULTIPLEXING_SEQ (0x00000005) ++#define MPI2_SAS_APHYINFO_REASON_IT_NEXUS_LOSS_TIMER (0x00000006) ++#define MPI2_SAS_APHYINFO_REASON_BREAK_TIMEOUT (0x00000007) ++#define MPI2_SAS_APHYINFO_REASON_PHY_TEST_STOPPED (0x00000008) ++ ++ ++/* values for PhyInfo fields */ ++#define MPI2_SAS_PHYINFO_PHY_VACANT (0x80000000) ++#define MPI2_SAS_PHYINFO_CHANGED_REQ_INSIDE_ZPSDS (0x04000000) ++#define MPI2_SAS_PHYINFO_INSIDE_ZPSDS_PERSISTENT (0x02000000) ++#define MPI2_SAS_PHYINFO_REQ_INSIDE_ZPSDS (0x01000000) ++#define MPI2_SAS_PHYINFO_ZONE_GROUP_PERSISTENT (0x00400000) ++#define MPI2_SAS_PHYINFO_INSIDE_ZPSDS (0x00200000) ++#define MPI2_SAS_PHYINFO_ZONING_ENABLED (0x00100000) ++ ++#define MPI2_SAS_PHYINFO_REASON_MASK (0x000F0000) ++#define MPI2_SAS_PHYINFO_REASON_UNKNOWN (0x00000000) ++#define MPI2_SAS_PHYINFO_REASON_POWER_ON (0x00010000) ++#define MPI2_SAS_PHYINFO_REASON_HARD_RESET (0x00020000) ++#define MPI2_SAS_PHYINFO_REASON_SMP_PHY_CONTROL (0x00030000) ++#define MPI2_SAS_PHYINFO_REASON_LOSS_OF_SYNC (0x00040000) ++#define MPI2_SAS_PHYINFO_REASON_MULTIPLEXING_SEQ (0x00050000) ++#define MPI2_SAS_PHYINFO_REASON_IT_NEXUS_LOSS_TIMER (0x00060000) ++#define MPI2_SAS_PHYINFO_REASON_BREAK_TIMEOUT (0x00070000) ++#define MPI2_SAS_PHYINFO_REASON_PHY_TEST_STOPPED (0x00080000) ++ ++#define MPI2_SAS_PHYINFO_MULTIPLEXING_SUPPORTED (0x00008000) ++#define MPI2_SAS_PHYINFO_SATA_PORT_ACTIVE (0x00004000) ++#define MPI2_SAS_PHYINFO_SATA_PORT_SELECTOR_PRESENT (0x00002000) ++#define MPI2_SAS_PHYINFO_VIRTUAL_PHY (0x00001000) ++ ++#define MPI2_SAS_PHYINFO_MASK_PARTIAL_PATHWAY_TIME (0x00000F00) ++#define MPI2_SAS_PHYINFO_SHIFT_PARTIAL_PATHWAY_TIME (8) ++ ++#define MPI2_SAS_PHYINFO_MASK_ROUTING_ATTRIBUTE (0x000000F0) ++#define MPI2_SAS_PHYINFO_DIRECT_ROUTING (0x00000000) ++#define MPI2_SAS_PHYINFO_SUBTRACTIVE_ROUTING (0x00000010) ++#define MPI2_SAS_PHYINFO_TABLE_ROUTING (0x00000020) ++ ++ ++/* values for SAS ProgrammedLinkRate fields */ ++#define MPI2_SAS_PRATE_MAX_RATE_MASK (0xF0) ++#define MPI2_SAS_PRATE_MAX_RATE_NOT_PROGRAMMABLE (0x00) ++#define MPI2_SAS_PRATE_MAX_RATE_1_5 (0x80) ++#define MPI2_SAS_PRATE_MAX_RATE_3_0 (0x90) ++#define MPI2_SAS_PRATE_MAX_RATE_6_0 (0xA0) ++#define MPI2_SAS_PRATE_MIN_RATE_MASK (0x0F) ++#define MPI2_SAS_PRATE_MIN_RATE_NOT_PROGRAMMABLE (0x00) ++#define MPI2_SAS_PRATE_MIN_RATE_1_5 (0x08) ++#define MPI2_SAS_PRATE_MIN_RATE_3_0 (0x09) ++#define MPI2_SAS_PRATE_MIN_RATE_6_0 (0x0A) ++ ++ ++/* values for SAS HwLinkRate fields */ ++#define MPI2_SAS_HWRATE_MAX_RATE_MASK (0xF0) ++#define MPI2_SAS_HWRATE_MAX_RATE_1_5 (0x80) ++#define MPI2_SAS_HWRATE_MAX_RATE_3_0 (0x90) ++#define MPI2_SAS_HWRATE_MAX_RATE_6_0 (0xA0) ++#define MPI2_SAS_HWRATE_MIN_RATE_MASK (0x0F) ++#define MPI2_SAS_HWRATE_MIN_RATE_1_5 (0x08) ++#define MPI2_SAS_HWRATE_MIN_RATE_3_0 (0x09) ++#define MPI2_SAS_HWRATE_MIN_RATE_6_0 (0x0A) ++ ++ ++ ++/**************************************************************************** ++* SAS IO Unit Config Pages ++****************************************************************************/ ++ ++/* SAS IO Unit Page 0 */ ++ ++typedef struct _MPI2_SAS_IO_UNIT0_PHY_DATA ++{ ++ U8 Port; /* 0x00 */ ++ U8 PortFlags; /* 0x01 */ ++ U8 PhyFlags; /* 0x02 */ ++ U8 NegotiatedLinkRate; /* 0x03 */ ++ U32 ControllerPhyDeviceInfo;/* 0x04 */ ++ U16 AttachedDevHandle; /* 0x08 */ ++ U16 ControllerDevHandle; /* 0x0A */ ++ U32 DiscoveryStatus; /* 0x0C */ ++ U32 Reserved; /* 0x10 */ ++} MPI2_SAS_IO_UNIT0_PHY_DATA, MPI2_POINTER PTR_MPI2_SAS_IO_UNIT0_PHY_DATA, ++ Mpi2SasIOUnit0PhyData_t, MPI2_POINTER pMpi2SasIOUnit0PhyData_t; ++ ++/* ++ * Host code (drivers, BIOS, utilities, etc.) should leave this define set to ++ * one and check Header.ExtPageLength or NumPhys at runtime. ++ */ ++#ifndef MPI2_SAS_IOUNIT0_PHY_MAX ++#define MPI2_SAS_IOUNIT0_PHY_MAX (1) ++#endif ++ ++typedef struct _MPI2_CONFIG_PAGE_SASIOUNIT_0 ++{ ++ MPI2_CONFIG_EXTENDED_PAGE_HEADER Header; /* 0x00 */ ++ U32 Reserved1; /* 0x08 */ ++ U8 NumPhys; /* 0x0C */ ++ U8 Reserved2; /* 0x0D */ ++ U16 Reserved3; /* 0x0E */ ++ MPI2_SAS_IO_UNIT0_PHY_DATA PhyData[MPI2_SAS_IOUNIT0_PHY_MAX]; /* 0x10 */ ++} MPI2_CONFIG_PAGE_SASIOUNIT_0, ++ MPI2_POINTER PTR_MPI2_CONFIG_PAGE_SASIOUNIT_0, ++ Mpi2SasIOUnitPage0_t, MPI2_POINTER pMpi2SasIOUnitPage0_t; ++ ++#define MPI2_SASIOUNITPAGE0_PAGEVERSION (0x05) ++ ++/* values for SAS IO Unit Page 0 PortFlags */ ++#define MPI2_SASIOUNIT0_PORTFLAGS_DISCOVERY_IN_PROGRESS (0x08) ++#define MPI2_SASIOUNIT0_PORTFLAGS_AUTO_PORT_CONFIG (0x01) ++ ++/* values for SAS IO Unit Page 0 PhyFlags */ ++#define MPI2_SASIOUNIT0_PHYFLAGS_ZONING_ENABLED (0x10) ++#define MPI2_SASIOUNIT0_PHYFLAGS_PHY_DISABLED (0x08) ++ ++/* use MPI2_SAS_NEG_LINK_RATE_ defines for the NegotiatedLinkRate field */ ++ ++/* see mpi2_sas.h for values for SAS IO Unit Page 0 ControllerPhyDeviceInfo values */ ++ ++/* values for SAS IO Unit Page 0 DiscoveryStatus */ ++#define MPI2_SASIOUNIT0_DS_MAX_ENCLOSURES_EXCEED (0x80000000) ++#define MPI2_SASIOUNIT0_DS_MAX_EXPANDERS_EXCEED (0x40000000) ++#define MPI2_SASIOUNIT0_DS_MAX_DEVICES_EXCEED (0x20000000) ++#define MPI2_SASIOUNIT0_DS_MAX_TOPO_PHYS_EXCEED (0x10000000) ++#define MPI2_SASIOUNIT0_DS_DOWNSTREAM_INITIATOR (0x08000000) ++#define MPI2_SASIOUNIT0_DS_MULTI_SUBTRACTIVE_SUBTRACTIVE (0x00008000) ++#define MPI2_SASIOUNIT0_DS_EXP_MULTI_SUBTRACTIVE (0x00004000) ++#define MPI2_SASIOUNIT0_DS_MULTI_PORT_DOMAIN (0x00002000) ++#define MPI2_SASIOUNIT0_DS_TABLE_TO_SUBTRACTIVE_LINK (0x00001000) ++#define MPI2_SASIOUNIT0_DS_UNSUPPORTED_DEVICE (0x00000800) ++#define MPI2_SASIOUNIT0_DS_TABLE_LINK (0x00000400) ++#define MPI2_SASIOUNIT0_DS_SUBTRACTIVE_LINK (0x00000200) ++#define MPI2_SASIOUNIT0_DS_SMP_CRC_ERROR (0x00000100) ++#define MPI2_SASIOUNIT0_DS_SMP_FUNCTION_FAILED (0x00000080) ++#define MPI2_SASIOUNIT0_DS_INDEX_NOT_EXIST (0x00000040) ++#define MPI2_SASIOUNIT0_DS_OUT_ROUTE_ENTRIES (0x00000020) ++#define MPI2_SASIOUNIT0_DS_SMP_TIMEOUT (0x00000010) ++#define MPI2_SASIOUNIT0_DS_MULTIPLE_PORTS (0x00000004) ++#define MPI2_SASIOUNIT0_DS_UNADDRESSABLE_DEVICE (0x00000002) ++#define MPI2_SASIOUNIT0_DS_LOOP_DETECTED (0x00000001) ++ ++ ++/* SAS IO Unit Page 1 */ ++ ++typedef struct _MPI2_SAS_IO_UNIT1_PHY_DATA ++{ ++ U8 Port; /* 0x00 */ ++ U8 PortFlags; /* 0x01 */ ++ U8 PhyFlags; /* 0x02 */ ++ U8 MaxMinLinkRate; /* 0x03 */ ++ U32 ControllerPhyDeviceInfo; /* 0x04 */ ++ U16 MaxTargetPortConnectTime; /* 0x08 */ ++ U16 Reserved1; /* 0x0A */ ++} MPI2_SAS_IO_UNIT1_PHY_DATA, MPI2_POINTER PTR_MPI2_SAS_IO_UNIT1_PHY_DATA, ++ Mpi2SasIOUnit1PhyData_t, MPI2_POINTER pMpi2SasIOUnit1PhyData_t; ++ ++/* ++ * Host code (drivers, BIOS, utilities, etc.) should leave this define set to ++ * one and check Header.ExtPageLength or NumPhys at runtime. ++ */ ++#ifndef MPI2_SAS_IOUNIT1_PHY_MAX ++#define MPI2_SAS_IOUNIT1_PHY_MAX (1) ++#endif ++ ++typedef struct _MPI2_CONFIG_PAGE_SASIOUNIT_1 ++{ ++ MPI2_CONFIG_EXTENDED_PAGE_HEADER Header; /* 0x00 */ ++ U16 ControlFlags; /* 0x08 */ ++ U16 SASNarrowMaxQueueDepth; /* 0x0A */ ++ U16 AdditionalControlFlags; /* 0x0C */ ++ U16 SASWideMaxQueueDepth; /* 0x0E */ ++ U8 NumPhys; /* 0x10 */ ++ U8 SATAMaxQDepth; /* 0x11 */ ++ U8 ReportDeviceMissingDelay; /* 0x12 */ ++ U8 IODeviceMissingDelay; /* 0x13 */ ++ MPI2_SAS_IO_UNIT1_PHY_DATA PhyData[MPI2_SAS_IOUNIT1_PHY_MAX]; /* 0x14 */ ++} MPI2_CONFIG_PAGE_SASIOUNIT_1, ++ MPI2_POINTER PTR_MPI2_CONFIG_PAGE_SASIOUNIT_1, ++ Mpi2SasIOUnitPage1_t, MPI2_POINTER pMpi2SasIOUnitPage1_t; ++ ++#define MPI2_SASIOUNITPAGE1_PAGEVERSION (0x09) ++ ++/* values for SAS IO Unit Page 1 ControlFlags */ ++#define MPI2_SASIOUNIT1_CONTROL_DEVICE_SELF_TEST (0x8000) ++#define MPI2_SASIOUNIT1_CONTROL_SATA_3_0_MAX (0x4000) ++#define MPI2_SASIOUNIT1_CONTROL_SATA_1_5_MAX (0x2000) ++#define MPI2_SASIOUNIT1_CONTROL_SATA_SW_PRESERVE (0x1000) ++ ++#define MPI2_SASIOUNIT1_CONTROL_MASK_DEV_SUPPORT (0x0600) ++#define MPI2_SASIOUNIT1_CONTROL_SHIFT_DEV_SUPPORT (9) ++#define MPI2_SASIOUNIT1_CONTROL_DEV_SUPPORT_BOTH (0x0) ++#define MPI2_SASIOUNIT1_CONTROL_DEV_SAS_SUPPORT (0x1) ++#define MPI2_SASIOUNIT1_CONTROL_DEV_SATA_SUPPORT (0x2) ++ ++#define MPI2_SASIOUNIT1_CONTROL_SATA_48BIT_LBA_REQUIRED (0x0080) ++#define MPI2_SASIOUNIT1_CONTROL_SATA_SMART_REQUIRED (0x0040) ++#define MPI2_SASIOUNIT1_CONTROL_SATA_NCQ_REQUIRED (0x0020) ++#define MPI2_SASIOUNIT1_CONTROL_SATA_FUA_REQUIRED (0x0010) ++#define MPI2_SASIOUNIT1_CONTROL_TABLE_SUBTRACTIVE_ILLEGAL (0x0008) ++#define MPI2_SASIOUNIT1_CONTROL_SUBTRACTIVE_ILLEGAL (0x0004) ++#define MPI2_SASIOUNIT1_CONTROL_FIRST_LVL_DISC_ONLY (0x0002) ++#define MPI2_SASIOUNIT1_CONTROL_CLEAR_AFFILIATION (0x0001) ++ ++/* values for SAS IO Unit Page 1 AdditionalControlFlags */ ++#define MPI2_SASIOUNIT1_ACONTROL_MULTI_PORT_DOMAIN_ILLEGAL (0x0080) ++#define MPI2_SASIOUNIT1_ACONTROL_SATA_ASYNCHROUNOUS_NOTIFICATION (0x0040) ++#define MPI2_SASIOUNIT1_ACONTROL_INVALID_TOPOLOGY_CORRECTION (0x0020) ++#define MPI2_SASIOUNIT1_ACONTROL_PORT_ENABLE_ONLY_SATA_LINK_RESET (0x0010) ++#define MPI2_SASIOUNIT1_ACONTROL_OTHER_AFFILIATION_SATA_LINK_RESET (0x0008) ++#define MPI2_SASIOUNIT1_ACONTROL_SELF_AFFILIATION_SATA_LINK_RESET (0x0004) ++#define MPI2_SASIOUNIT1_ACONTROL_NO_AFFILIATION_SATA_LINK_RESET (0x0002) ++#define MPI2_SASIOUNIT1_ACONTROL_ALLOW_TABLE_TO_TABLE (0x0001) ++ ++/* defines for SAS IO Unit Page 1 ReportDeviceMissingDelay */ ++#define MPI2_SASIOUNIT1_REPORT_MISSING_TIMEOUT_MASK (0x7F) ++#define MPI2_SASIOUNIT1_REPORT_MISSING_UNIT_16 (0x80) ++ ++/* values for SAS IO Unit Page 1 PortFlags */ ++#define MPI2_SASIOUNIT1_PORT_FLAGS_AUTO_PORT_CONFIG (0x01) ++ ++/* values for SAS IO Unit Page 2 PhyFlags */ ++#define MPI2_SASIOUNIT1_PHYFLAGS_ZONING_ENABLE (0x10) ++#define MPI2_SASIOUNIT1_PHYFLAGS_PHY_DISABLE (0x08) ++ ++/* values for SAS IO Unit Page 0 MaxMinLinkRate */ ++#define MPI2_SASIOUNIT1_MAX_RATE_MASK (0xF0) ++#define MPI2_SASIOUNIT1_MAX_RATE_1_5 (0x80) ++#define MPI2_SASIOUNIT1_MAX_RATE_3_0 (0x90) ++#define MPI2_SASIOUNIT1_MAX_RATE_6_0 (0xA0) ++#define MPI2_SASIOUNIT1_MIN_RATE_MASK (0x0F) ++#define MPI2_SASIOUNIT1_MIN_RATE_1_5 (0x08) ++#define MPI2_SASIOUNIT1_MIN_RATE_3_0 (0x09) ++#define MPI2_SASIOUNIT1_MIN_RATE_6_0 (0x0A) ++ ++/* see mpi2_sas.h for values for SAS IO Unit Page 1 ControllerPhyDeviceInfo values */ ++ ++ ++/* SAS IO Unit Page 4 */ ++ ++typedef struct _MPI2_SAS_IOUNIT4_SPINUP_GROUP ++{ ++ U8 MaxTargetSpinup; /* 0x00 */ ++ U8 SpinupDelay; /* 0x01 */ ++ U16 Reserved1; /* 0x02 */ ++} MPI2_SAS_IOUNIT4_SPINUP_GROUP, MPI2_POINTER PTR_MPI2_SAS_IOUNIT4_SPINUP_GROUP, ++ Mpi2SasIOUnit4SpinupGroup_t, MPI2_POINTER pMpi2SasIOUnit4SpinupGroup_t; ++ ++/* ++ * Host code (drivers, BIOS, utilities, etc.) should leave this define set to ++ * four and check Header.ExtPageLength or NumPhys at runtime. ++ */ ++#ifndef MPI2_SAS_IOUNIT4_PHY_MAX ++#define MPI2_SAS_IOUNIT4_PHY_MAX (4) ++#endif ++ ++typedef struct _MPI2_CONFIG_PAGE_SASIOUNIT_4 ++{ ++ MPI2_CONFIG_EXTENDED_PAGE_HEADER Header; /* 0x00 */ ++ MPI2_SAS_IOUNIT4_SPINUP_GROUP SpinupGroupParameters[4]; /* 0x08 */ ++ U32 Reserved1; /* 0x18 */ ++ U32 Reserved2; /* 0x1C */ ++ U32 Reserved3; /* 0x20 */ ++ U8 BootDeviceWaitTime; /* 0x24 */ ++ U8 Reserved4; /* 0x25 */ ++ U16 Reserved5; /* 0x26 */ ++ U8 NumPhys; /* 0x28 */ ++ U8 PEInitialSpinupDelay; /* 0x29 */ ++ U8 PEReplyDelay; /* 0x2A */ ++ U8 Flags; /* 0x2B */ ++ U8 PHY[MPI2_SAS_IOUNIT4_PHY_MAX]; /* 0x2C */ ++} MPI2_CONFIG_PAGE_SASIOUNIT_4, ++ MPI2_POINTER PTR_MPI2_CONFIG_PAGE_SASIOUNIT_4, ++ Mpi2SasIOUnitPage4_t, MPI2_POINTER pMpi2SasIOUnitPage4_t; ++ ++#define MPI2_SASIOUNITPAGE4_PAGEVERSION (0x02) ++ ++/* defines for Flags field */ ++#define MPI2_SASIOUNIT4_FLAGS_AUTO_PORTENABLE (0x01) ++ ++/* defines for PHY field */ ++#define MPI2_SASIOUNIT4_PHY_SPINUP_GROUP_MASK (0x03) ++ ++ ++/**************************************************************************** ++* SAS Expander Config Pages ++****************************************************************************/ ++ ++/* SAS Expander Page 0 */ ++ ++typedef struct _MPI2_CONFIG_PAGE_EXPANDER_0 ++{ ++ MPI2_CONFIG_EXTENDED_PAGE_HEADER Header; /* 0x00 */ ++ U8 PhysicalPort; /* 0x08 */ ++ U8 ReportGenLength; /* 0x09 */ ++ U16 EnclosureHandle; /* 0x0A */ ++ U64 SASAddress; /* 0x0C */ ++ U32 DiscoveryStatus; /* 0x14 */ ++ U16 DevHandle; /* 0x18 */ ++ U16 ParentDevHandle; /* 0x1A */ ++ U16 ExpanderChangeCount; /* 0x1C */ ++ U16 ExpanderRouteIndexes; /* 0x1E */ ++ U8 NumPhys; /* 0x20 */ ++ U8 SASLevel; /* 0x21 */ ++ U16 Flags; /* 0x22 */ ++ U16 STPBusInactivityTimeLimit; /* 0x24 */ ++ U16 STPMaxConnectTimeLimit; /* 0x26 */ ++ U16 STP_SMP_NexusLossTime; /* 0x28 */ ++ U16 MaxNumRoutedSasAddresses; /* 0x2A */ ++ U64 ActiveZoneManagerSASAddress;/* 0x2C */ ++ U16 ZoneLockInactivityLimit; /* 0x34 */ ++ U16 Reserved1; /* 0x36 */ ++} MPI2_CONFIG_PAGE_EXPANDER_0, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_EXPANDER_0, ++ Mpi2ExpanderPage0_t, MPI2_POINTER pMpi2ExpanderPage0_t; ++ ++#define MPI2_SASEXPANDER0_PAGEVERSION (0x05) ++ ++/* values for SAS Expander Page 0 DiscoveryStatus field */ ++#define MPI2_SAS_EXPANDER0_DS_MAX_ENCLOSURES_EXCEED (0x80000000) ++#define MPI2_SAS_EXPANDER0_DS_MAX_EXPANDERS_EXCEED (0x40000000) ++#define MPI2_SAS_EXPANDER0_DS_MAX_DEVICES_EXCEED (0x20000000) ++#define MPI2_SAS_EXPANDER0_DS_MAX_TOPO_PHYS_EXCEED (0x10000000) ++#define MPI2_SAS_EXPANDER0_DS_DOWNSTREAM_INITIATOR (0x08000000) ++#define MPI2_SAS_EXPANDER0_DS_MULTI_SUBTRACTIVE_SUBTRACTIVE (0x00008000) ++#define MPI2_SAS_EXPANDER0_DS_EXP_MULTI_SUBTRACTIVE (0x00004000) ++#define MPI2_SAS_EXPANDER0_DS_MULTI_PORT_DOMAIN (0x00002000) ++#define MPI2_SAS_EXPANDER0_DS_TABLE_TO_SUBTRACTIVE_LINK (0x00001000) ++#define MPI2_SAS_EXPANDER0_DS_UNSUPPORTED_DEVICE (0x00000800) ++#define MPI2_SAS_EXPANDER0_DS_TABLE_LINK (0x00000400) ++#define MPI2_SAS_EXPANDER0_DS_SUBTRACTIVE_LINK (0x00000200) ++#define MPI2_SAS_EXPANDER0_DS_SMP_CRC_ERROR (0x00000100) ++#define MPI2_SAS_EXPANDER0_DS_SMP_FUNCTION_FAILED (0x00000080) ++#define MPI2_SAS_EXPANDER0_DS_INDEX_NOT_EXIST (0x00000040) ++#define MPI2_SAS_EXPANDER0_DS_OUT_ROUTE_ENTRIES (0x00000020) ++#define MPI2_SAS_EXPANDER0_DS_SMP_TIMEOUT (0x00000010) ++#define MPI2_SAS_EXPANDER0_DS_MULTIPLE_PORTS (0x00000004) ++#define MPI2_SAS_EXPANDER0_DS_UNADDRESSABLE_DEVICE (0x00000002) ++#define MPI2_SAS_EXPANDER0_DS_LOOP_DETECTED (0x00000001) ++ ++/* values for SAS Expander Page 0 Flags field */ ++#define MPI2_SAS_EXPANDER0_FLAGS_ZONE_LOCKED (0x1000) ++#define MPI2_SAS_EXPANDER0_FLAGS_SUPPORTED_PHYSICAL_PRES (0x0800) ++#define MPI2_SAS_EXPANDER0_FLAGS_ASSERTED_PHYSICAL_PRES (0x0400) ++#define MPI2_SAS_EXPANDER0_FLAGS_ZONING_SUPPORT (0x0200) ++#define MPI2_SAS_EXPANDER0_FLAGS_ENABLED_ZONING (0x0100) ++#define MPI2_SAS_EXPANDER0_FLAGS_TABLE_TO_TABLE_SUPPORT (0x0080) ++#define MPI2_SAS_EXPANDER0_FLAGS_CONNECTOR_END_DEVICE (0x0010) ++#define MPI2_SAS_EXPANDER0_FLAGS_OTHERS_CONFIG (0x0004) ++#define MPI2_SAS_EXPANDER0_FLAGS_CONFIG_IN_PROGRESS (0x0002) ++#define MPI2_SAS_EXPANDER0_FLAGS_ROUTE_TABLE_CONFIG (0x0001) ++ ++ ++/* SAS Expander Page 1 */ ++ ++typedef struct _MPI2_CONFIG_PAGE_EXPANDER_1 ++{ ++ MPI2_CONFIG_EXTENDED_PAGE_HEADER Header; /* 0x00 */ ++ U8 PhysicalPort; /* 0x08 */ ++ U8 Reserved1; /* 0x09 */ ++ U16 Reserved2; /* 0x0A */ ++ U8 NumPhys; /* 0x0C */ ++ U8 Phy; /* 0x0D */ ++ U16 NumTableEntriesProgrammed; /* 0x0E */ ++ U8 ProgrammedLinkRate; /* 0x10 */ ++ U8 HwLinkRate; /* 0x11 */ ++ U16 AttachedDevHandle; /* 0x12 */ ++ U32 PhyInfo; /* 0x14 */ ++ U32 AttachedDeviceInfo; /* 0x18 */ ++ U16 ExpanderDevHandle; /* 0x1C */ ++ U8 ChangeCount; /* 0x1E */ ++ U8 NegotiatedLinkRate; /* 0x1F */ ++ U8 PhyIdentifier; /* 0x20 */ ++ U8 AttachedPhyIdentifier; /* 0x21 */ ++ U8 Reserved3; /* 0x22 */ ++ U8 DiscoveryInfo; /* 0x23 */ ++ U32 AttachedPhyInfo; /* 0x24 */ ++ U8 ZoneGroup; /* 0x28 */ ++ U8 SelfConfigStatus; /* 0x29 */ ++ U16 Reserved4; /* 0x2A */ ++} MPI2_CONFIG_PAGE_EXPANDER_1, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_EXPANDER_1, ++ Mpi2ExpanderPage1_t, MPI2_POINTER pMpi2ExpanderPage1_t; ++ ++#define MPI2_SASEXPANDER1_PAGEVERSION (0x02) ++ ++/* use MPI2_SAS_PRATE_ defines for the ProgrammedLinkRate field */ ++ ++/* use MPI2_SAS_HWRATE_ defines for the HwLinkRate field */ ++ ++/* use MPI2_SAS_PHYINFO_ for the PhyInfo field */ ++ ++/* see mpi2_sas.h for the MPI2_SAS_DEVICE_INFO_ defines used for the AttachedDeviceInfo field */ ++ ++/* use MPI2_SAS_NEG_LINK_RATE_ defines for the NegotiatedLinkRate field */ ++ ++/* use MPI2_SAS_APHYINFO_ defines for AttachedPhyInfo field */ ++ ++/* values for SAS Expander Page 1 DiscoveryInfo field */ ++#define MPI2_SAS_EXPANDER1_DISCINFO_BAD_PHY_DISABLED (0x04) ++#define MPI2_SAS_EXPANDER1_DISCINFO_LINK_STATUS_CHANGE (0x02) ++#define MPI2_SAS_EXPANDER1_DISCINFO_NO_ROUTING_ENTRIES (0x01) ++ ++ ++/**************************************************************************** ++* SAS Device Config Pages ++****************************************************************************/ ++ ++/* SAS Device Page 0 */ ++ ++typedef struct _MPI2_CONFIG_PAGE_SAS_DEV_0 ++{ ++ MPI2_CONFIG_EXTENDED_PAGE_HEADER Header; /* 0x00 */ ++ U16 Slot; /* 0x08 */ ++ U16 EnclosureHandle; /* 0x0A */ ++ U64 SASAddress; /* 0x0C */ ++ U16 ParentDevHandle; /* 0x14 */ ++ U8 PhyNum; /* 0x16 */ ++ U8 AccessStatus; /* 0x17 */ ++ U16 DevHandle; /* 0x18 */ ++ U8 AttachedPhyIdentifier; /* 0x1A */ ++ U8 ZoneGroup; /* 0x1B */ ++ U32 DeviceInfo; /* 0x1C */ ++ U16 Flags; /* 0x20 */ ++ U8 PhysicalPort; /* 0x22 */ ++ U8 MaxPortConnections; /* 0x23 */ ++ U64 DeviceName; /* 0x24 */ ++ U8 PortGroups; /* 0x2C */ ++ U8 DmaGroup; /* 0x2D */ ++ U8 ControlGroup; /* 0x2E */ ++ U8 Reserved1; /* 0x2F */ ++ U32 Reserved2; /* 0x30 */ ++ U32 Reserved3; /* 0x34 */ ++} MPI2_CONFIG_PAGE_SAS_DEV_0, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_SAS_DEV_0, ++ Mpi2SasDevicePage0_t, MPI2_POINTER pMpi2SasDevicePage0_t; ++ ++#define MPI2_SASDEVICE0_PAGEVERSION (0x08) ++ ++/* values for SAS Device Page 0 AccessStatus field */ ++#define MPI2_SAS_DEVICE0_ASTATUS_NO_ERRORS (0x00) ++#define MPI2_SAS_DEVICE0_ASTATUS_SATA_INIT_FAILED (0x01) ++#define MPI2_SAS_DEVICE0_ASTATUS_SATA_CAPABILITY_FAILED (0x02) ++#define MPI2_SAS_DEVICE0_ASTATUS_SATA_AFFILIATION_CONFLICT (0x03) ++#define MPI2_SAS_DEVICE0_ASTATUS_SATA_NEEDS_INITIALIZATION (0x04) ++#define MPI2_SAS_DEVICE0_ASTATUS_ROUTE_NOT_ADDRESSABLE (0x05) ++#define MPI2_SAS_DEVICE0_ASTATUS_SMP_ERROR_NOT_ADDRESSABLE (0x06) ++#define MPI2_SAS_DEVICE0_ASTATUS_DEVICE_BLOCKED (0x07) ++/* specific values for SATA Init failures */ ++#define MPI2_SAS_DEVICE0_ASTATUS_SIF_UNKNOWN (0x10) ++#define MPI2_SAS_DEVICE0_ASTATUS_SIF_AFFILIATION_CONFLICT (0x11) ++#define MPI2_SAS_DEVICE0_ASTATUS_SIF_DIAG (0x12) ++#define MPI2_SAS_DEVICE0_ASTATUS_SIF_IDENTIFICATION (0x13) ++#define MPI2_SAS_DEVICE0_ASTATUS_SIF_CHECK_POWER (0x14) ++#define MPI2_SAS_DEVICE0_ASTATUS_SIF_PIO_SN (0x15) ++#define MPI2_SAS_DEVICE0_ASTATUS_SIF_MDMA_SN (0x16) ++#define MPI2_SAS_DEVICE0_ASTATUS_SIF_UDMA_SN (0x17) ++#define MPI2_SAS_DEVICE0_ASTATUS_SIF_ZONING_VIOLATION (0x18) ++#define MPI2_SAS_DEVICE0_ASTATUS_SIF_NOT_ADDRESSABLE (0x19) ++#define MPI2_SAS_DEVICE0_ASTATUS_SIF_MAX (0x1F) ++ ++/* see mpi2_sas.h for values for SAS Device Page 0 DeviceInfo values */ ++ ++/* values for SAS Device Page 0 Flags field */ ++#define MPI2_SAS_DEVICE0_FLAGS_SATA_ASYNCHRONOUS_NOTIFY (0x0400) ++#define MPI2_SAS_DEVICE0_FLAGS_SATA_SW_PRESERVE (0x0200) ++#define MPI2_SAS_DEVICE0_FLAGS_UNSUPPORTED_DEVICE (0x0100) ++#define MPI2_SAS_DEVICE0_FLAGS_SATA_48BIT_LBA_SUPPORTED (0x0080) ++#define MPI2_SAS_DEVICE0_FLAGS_SATA_SMART_SUPPORTED (0x0040) ++#define MPI2_SAS_DEVICE0_FLAGS_SATA_NCQ_SUPPORTED (0x0020) ++#define MPI2_SAS_DEVICE0_FLAGS_SATA_FUA_SUPPORTED (0x0010) ++#define MPI2_SAS_DEVICE0_FLAGS_PORT_SELECTOR_ATTACH (0x0008) ++#define MPI2_SAS_DEVICE0_FLAGS_DEVICE_PRESENT (0x0001) ++ ++ ++/* SAS Device Page 1 */ ++ ++typedef struct _MPI2_CONFIG_PAGE_SAS_DEV_1 ++{ ++ MPI2_CONFIG_EXTENDED_PAGE_HEADER Header; /* 0x00 */ ++ U32 Reserved1; /* 0x08 */ ++ U64 SASAddress; /* 0x0C */ ++ U32 Reserved2; /* 0x14 */ ++ U16 DevHandle; /* 0x18 */ ++ U16 Reserved3; /* 0x1A */ ++ U8 InitialRegDeviceFIS[20];/* 0x1C */ ++} MPI2_CONFIG_PAGE_SAS_DEV_1, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_SAS_DEV_1, ++ Mpi2SasDevicePage1_t, MPI2_POINTER pMpi2SasDevicePage1_t; ++ ++#define MPI2_SASDEVICE1_PAGEVERSION (0x01) ++ ++ ++/**************************************************************************** ++* SAS PHY Config Pages ++****************************************************************************/ ++ ++/* SAS PHY Page 0 */ ++ ++typedef struct _MPI2_CONFIG_PAGE_SAS_PHY_0 ++{ ++ MPI2_CONFIG_EXTENDED_PAGE_HEADER Header; /* 0x00 */ ++ U16 OwnerDevHandle; /* 0x08 */ ++ U16 Reserved1; /* 0x0A */ ++ U16 AttachedDevHandle; /* 0x0C */ ++ U8 AttachedPhyIdentifier; /* 0x0E */ ++ U8 Reserved2; /* 0x0F */ ++ U32 AttachedPhyInfo; /* 0x10 */ ++ U8 ProgrammedLinkRate; /* 0x14 */ ++ U8 HwLinkRate; /* 0x15 */ ++ U8 ChangeCount; /* 0x16 */ ++ U8 Flags; /* 0x17 */ ++ U32 PhyInfo; /* 0x18 */ ++ U8 NegotiatedLinkRate; /* 0x1C */ ++ U8 Reserved3; /* 0x1D */ ++ U16 Reserved4; /* 0x1E */ ++} MPI2_CONFIG_PAGE_SAS_PHY_0, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_SAS_PHY_0, ++ Mpi2SasPhyPage0_t, MPI2_POINTER pMpi2SasPhyPage0_t; ++ ++#define MPI2_SASPHY0_PAGEVERSION (0x03) ++ ++/* use MPI2_SAS_PRATE_ defines for the ProgrammedLinkRate field */ ++ ++/* use MPI2_SAS_HWRATE_ defines for the HwLinkRate field */ ++ ++/* values for SAS PHY Page 0 Flags field */ ++#define MPI2_SAS_PHY0_FLAGS_SGPIO_DIRECT_ATTACH_ENC (0x01) ++ ++/* use MPI2_SAS_APHYINFO_ defines for AttachedPhyInfo field */ ++ ++/* use MPI2_SAS_NEG_LINK_RATE_ defines for the NegotiatedLinkRate field */ ++ ++/* use MPI2_SAS_PHYINFO_ for the PhyInfo field */ ++ ++ ++/* SAS PHY Page 1 */ ++ ++typedef struct _MPI2_CONFIG_PAGE_SAS_PHY_1 ++{ ++ MPI2_CONFIG_EXTENDED_PAGE_HEADER Header; /* 0x00 */ ++ U32 Reserved1; /* 0x08 */ ++ U32 InvalidDwordCount; /* 0x0C */ ++ U32 RunningDisparityErrorCount; /* 0x10 */ ++ U32 LossDwordSynchCount; /* 0x14 */ ++ U32 PhyResetProblemCount; /* 0x18 */ ++} MPI2_CONFIG_PAGE_SAS_PHY_1, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_SAS_PHY_1, ++ Mpi2SasPhyPage1_t, MPI2_POINTER pMpi2SasPhyPage1_t; ++ ++#define MPI2_SASPHY1_PAGEVERSION (0x01) ++ ++ ++/**************************************************************************** ++* SAS Port Config Pages ++****************************************************************************/ ++ ++/* SAS Port Page 0 */ ++ ++typedef struct _MPI2_CONFIG_PAGE_SAS_PORT_0 ++{ ++ MPI2_CONFIG_EXTENDED_PAGE_HEADER Header; /* 0x00 */ ++ U8 PortNumber; /* 0x08 */ ++ U8 PhysicalPort; /* 0x09 */ ++ U8 PortWidth; /* 0x0A */ ++ U8 PhysicalPortWidth; /* 0x0B */ ++ U8 ZoneGroup; /* 0x0C */ ++ U8 Reserved1; /* 0x0D */ ++ U16 Reserved2; /* 0x0E */ ++ U64 SASAddress; /* 0x10 */ ++ U32 DeviceInfo; /* 0x18 */ ++ U32 Reserved3; /* 0x1C */ ++ U32 Reserved4; /* 0x20 */ ++} MPI2_CONFIG_PAGE_SAS_PORT_0, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_SAS_PORT_0, ++ Mpi2SasPortPage0_t, MPI2_POINTER pMpi2SasPortPage0_t; ++ ++#define MPI2_SASPORT0_PAGEVERSION (0x00) ++ ++/* see mpi2_sas.h for values for SAS Port Page 0 DeviceInfo values */ ++ ++ ++/**************************************************************************** ++* SAS Enclosure Config Pages ++****************************************************************************/ ++ ++/* SAS Enclosure Page 0 */ ++ ++typedef struct _MPI2_CONFIG_PAGE_SAS_ENCLOSURE_0 ++{ ++ MPI2_CONFIG_EXTENDED_PAGE_HEADER Header; /* 0x00 */ ++ U32 Reserved1; /* 0x08 */ ++ U64 EnclosureLogicalID; /* 0x0C */ ++ U16 Flags; /* 0x14 */ ++ U16 EnclosureHandle; /* 0x16 */ ++ U16 NumSlots; /* 0x18 */ ++ U16 StartSlot; /* 0x1A */ ++ U16 Reserved2; /* 0x1C */ ++ U16 SEPDevHandle; /* 0x1E */ ++ U32 Reserved3; /* 0x20 */ ++ U32 Reserved4; /* 0x24 */ ++} MPI2_CONFIG_PAGE_SAS_ENCLOSURE_0, ++ MPI2_POINTER PTR_MPI2_CONFIG_PAGE_SAS_ENCLOSURE_0, ++ Mpi2SasEnclosurePage0_t, MPI2_POINTER pMpi2SasEnclosurePage0_t; ++ ++#define MPI2_SASENCLOSURE0_PAGEVERSION (0x03) ++ ++/* values for SAS Enclosure Page 0 Flags field */ ++#define MPI2_SAS_ENCLS0_FLAGS_MNG_MASK (0x000F) ++#define MPI2_SAS_ENCLS0_FLAGS_MNG_UNKNOWN (0x0000) ++#define MPI2_SAS_ENCLS0_FLAGS_MNG_IOC_SES (0x0001) ++#define MPI2_SAS_ENCLS0_FLAGS_MNG_IOC_SGPIO (0x0002) ++#define MPI2_SAS_ENCLS0_FLAGS_MNG_EXP_SGPIO (0x0003) ++#define MPI2_SAS_ENCLS0_FLAGS_MNG_SES_ENCLOSURE (0x0004) ++#define MPI2_SAS_ENCLS0_FLAGS_MNG_IOC_GPIO (0x0005) ++ ++ ++/**************************************************************************** ++* Log Config Page ++****************************************************************************/ ++ ++/* Log Page 0 */ ++ ++/* ++ * Host code (drivers, BIOS, utilities, etc.) should leave this define set to ++ * one and check Header.ExtPageLength or NumPhys at runtime. ++ */ ++#ifndef MPI2_LOG_0_NUM_LOG_ENTRIES ++#define MPI2_LOG_0_NUM_LOG_ENTRIES (1) ++#endif ++ ++#define MPI2_LOG_0_LOG_DATA_LENGTH (0x1C) ++ ++typedef struct _MPI2_LOG_0_ENTRY ++{ ++ U64 TimeStamp; /* 0x00 */ ++ U32 Reserved1; /* 0x08 */ ++ U16 LogSequence; /* 0x0C */ ++ U16 LogEntryQualifier; /* 0x0E */ ++ U8 VP_ID; /* 0x10 */ ++ U8 VF_ID; /* 0x11 */ ++ U16 Reserved2; /* 0x12 */ ++ U8 LogData[MPI2_LOG_0_LOG_DATA_LENGTH];/* 0x14 */ ++} MPI2_LOG_0_ENTRY, MPI2_POINTER PTR_MPI2_LOG_0_ENTRY, ++ Mpi2Log0Entry_t, MPI2_POINTER pMpi2Log0Entry_t; ++ ++/* values for Log Page 0 LogEntry LogEntryQualifier field */ ++#define MPI2_LOG_0_ENTRY_QUAL_ENTRY_UNUSED (0x0000) ++#define MPI2_LOG_0_ENTRY_QUAL_POWER_ON_RESET (0x0001) ++#define MPI2_LOG_0_ENTRY_QUAL_TIMESTAMP_UPDATE (0x0002) ++#define MPI2_LOG_0_ENTRY_QUAL_MIN_IMPLEMENT_SPEC (0x8000) ++#define MPI2_LOG_0_ENTRY_QUAL_MAX_IMPLEMENT_SPEC (0xFFFF) ++ ++typedef struct _MPI2_CONFIG_PAGE_LOG_0 ++{ ++ MPI2_CONFIG_EXTENDED_PAGE_HEADER Header; /* 0x00 */ ++ U32 Reserved1; /* 0x08 */ ++ U32 Reserved2; /* 0x0C */ ++ U16 NumLogEntries; /* 0x10 */ ++ U16 Reserved3; /* 0x12 */ ++ MPI2_LOG_0_ENTRY LogEntry[MPI2_LOG_0_NUM_LOG_ENTRIES]; /* 0x14 */ ++} MPI2_CONFIG_PAGE_LOG_0, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_LOG_0, ++ Mpi2LogPage0_t, MPI2_POINTER pMpi2LogPage0_t; ++ ++#define MPI2_LOG_0_PAGEVERSION (0x02) ++ ++ ++/**************************************************************************** ++* RAID Config Page ++****************************************************************************/ ++ ++/* RAID Page 0 */ ++ ++/* ++ * Host code (drivers, BIOS, utilities, etc.) should leave this define set to ++ * one and check Header.ExtPageLength or NumPhys at runtime. ++ */ ++#ifndef MPI2_RAIDCONFIG0_MAX_ELEMENTS ++#define MPI2_RAIDCONFIG0_MAX_ELEMENTS (1) ++#endif ++ ++typedef struct _MPI2_RAIDCONFIG0_CONFIG_ELEMENT ++{ ++ U16 ElementFlags; /* 0x00 */ ++ U16 VolDevHandle; /* 0x02 */ ++ U8 HotSparePool; /* 0x04 */ ++ U8 PhysDiskNum; /* 0x05 */ ++ U16 PhysDiskDevHandle; /* 0x06 */ ++} MPI2_RAIDCONFIG0_CONFIG_ELEMENT, ++ MPI2_POINTER PTR_MPI2_RAIDCONFIG0_CONFIG_ELEMENT, ++ Mpi2RaidConfig0ConfigElement_t, MPI2_POINTER pMpi2RaidConfig0ConfigElement_t; ++ ++/* values for the ElementFlags field */ ++#define MPI2_RAIDCONFIG0_EFLAGS_MASK_ELEMENT_TYPE (0x000F) ++#define MPI2_RAIDCONFIG0_EFLAGS_VOLUME_ELEMENT (0x0000) ++#define MPI2_RAIDCONFIG0_EFLAGS_VOL_PHYS_DISK_ELEMENT (0x0001) ++#define MPI2_RAIDCONFIG0_EFLAGS_HOT_SPARE_ELEMENT (0x0002) ++#define MPI2_RAIDCONFIG0_EFLAGS_OCE_ELEMENT (0x0003) ++ ++ ++typedef struct _MPI2_CONFIG_PAGE_RAID_CONFIGURATION_0 ++{ ++ MPI2_CONFIG_EXTENDED_PAGE_HEADER Header; /* 0x00 */ ++ U8 NumHotSpares; /* 0x08 */ ++ U8 NumPhysDisks; /* 0x09 */ ++ U8 NumVolumes; /* 0x0A */ ++ U8 ConfigNum; /* 0x0B */ ++ U32 Flags; /* 0x0C */ ++ U8 ConfigGUID[24]; /* 0x10 */ ++ U32 Reserved1; /* 0x28 */ ++ U8 NumElements; /* 0x2C */ ++ U8 Reserved2; /* 0x2D */ ++ U16 Reserved3; /* 0x2E */ ++ MPI2_RAIDCONFIG0_CONFIG_ELEMENT ConfigElement[MPI2_RAIDCONFIG0_MAX_ELEMENTS]; /* 0x30 */ ++} MPI2_CONFIG_PAGE_RAID_CONFIGURATION_0, ++ MPI2_POINTER PTR_MPI2_CONFIG_PAGE_RAID_CONFIGURATION_0, ++ Mpi2RaidConfigurationPage0_t, MPI2_POINTER pMpi2RaidConfigurationPage0_t; ++ ++#define MPI2_RAIDCONFIG0_PAGEVERSION (0x00) ++ ++/* values for RAID Configuration Page 0 Flags field */ ++#define MPI2_RAIDCONFIG0_FLAG_FOREIGN_CONFIG (0x00000001) ++ ++ ++/**************************************************************************** ++* Driver Persistent Mapping Config Pages ++****************************************************************************/ ++ ++/* Driver Persistent Mapping Page 0 */ ++ ++typedef struct _MPI2_CONFIG_PAGE_DRIVER_MAP0_ENTRY ++{ ++ U64 PhysicalIdentifier; /* 0x00 */ ++ U16 MappingInformation; /* 0x08 */ ++ U16 DeviceIndex; /* 0x0A */ ++ U32 PhysicalBitsMapping; /* 0x0C */ ++ U32 Reserved1; /* 0x10 */ ++} MPI2_CONFIG_PAGE_DRIVER_MAP0_ENTRY, ++ MPI2_POINTER PTR_MPI2_CONFIG_PAGE_DRIVER_MAP0_ENTRY, ++ Mpi2DriverMap0Entry_t, MPI2_POINTER pMpi2DriverMap0Entry_t; ++ ++typedef struct _MPI2_CONFIG_PAGE_DRIVER_MAPPING_0 ++{ ++ MPI2_CONFIG_EXTENDED_PAGE_HEADER Header; /* 0x00 */ ++ MPI2_CONFIG_PAGE_DRIVER_MAP0_ENTRY Entry; /* 0x08 */ ++} MPI2_CONFIG_PAGE_DRIVER_MAPPING_0, ++ MPI2_POINTER PTR_MPI2_CONFIG_PAGE_DRIVER_MAPPING_0, ++ Mpi2DriverMappingPage0_t, MPI2_POINTER pMpi2DriverMappingPage0_t; ++ ++#define MPI2_DRIVERMAPPING0_PAGEVERSION (0x00) ++ ++/* values for Driver Persistent Mapping Page 0 MappingInformation field */ ++#define MPI2_DRVMAP0_MAPINFO_SLOT_MASK (0x07F0) ++#define MPI2_DRVMAP0_MAPINFO_SLOT_SHIFT (4) ++#define MPI2_DRVMAP0_MAPINFO_MISSING_MASK (0x000F) ++ ++ ++#endif ++ +diff -r e02b4006a7c8 drivers/scsi/mpt2sas/mpi/mpi2_history.txt +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/scsi/mpt2sas/mpi/mpi2_history.txt Wed Jul 01 09:49:59 2009 +0100 +@@ -0,0 +1,294 @@ ++ ============================== ++ Fusion-MPT MPI 2.0 Header File Change History ++ ============================== ++ ++ Copyright (c) 2000-2009 LSI Corporation. ++ ++ --------------------------------------- ++ Header Set Release Version: 02.00.11 ++ Header Set Release Date: 01-19-09 ++ --------------------------------------- ++ ++ Filename Current version Prior version ++ ---------- --------------- ------------- ++ mpi2.h 02.00.11 02.00.10 ++ mpi2_cnfg.h 02.00.10 02.00.09 ++ mpi2_init.h 02.00.06 02.00.06 ++ mpi2_ioc.h 02.00.10 02.00.09 ++ mpi2_raid.h 02.00.03 02.00.03 ++ mpi2_sas.h 02.00.02 02.00.02 ++ mpi2_targ.h 02.00.03 02.00.03 ++ mpi2_tool.h 02.00.02 02.00.02 ++ mpi2_type.h 02.00.00 02.00.00 ++ mpi2_history.txt 02.00.11 02.00.10 ++ ++ ++ * Date Version Description ++ * -------- -------- ------------------------------------------------------ ++ ++mpi2.h ++ * 04-30-07 02.00.00 Corresponds to Fusion-MPT MPI Specification Rev A. ++ * 06-04-07 02.00.01 Bumped MPI2_HEADER_VERSION_UNIT. ++ * 06-26-07 02.00.02 Bumped MPI2_HEADER_VERSION_UNIT. ++ * 08-31-07 02.00.03 Bumped MPI2_HEADER_VERSION_UNIT. ++ * Moved ReplyPostHostIndex register to offset 0x6C of the ++ * MPI2_SYSTEM_INTERFACE_REGS and modified the define for ++ * MPI2_REPLY_POST_HOST_INDEX_OFFSET. ++ * Added union of request descriptors. ++ * Added union of reply descriptors. ++ * 10-31-07 02.00.04 Bumped MPI2_HEADER_VERSION_UNIT. ++ * Added define for MPI2_VERSION_02_00. ++ * Fixed the size of the FunctionDependent5 field in the ++ * MPI2_DEFAULT_REPLY structure. ++ * 12-18-07 02.00.05 Bumped MPI2_HEADER_VERSION_UNIT. ++ * Removed the MPI-defined Fault Codes and extended the ++ * product specific codes up to 0xEFFF. ++ * Added a sixth key value for the WriteSequence register ++ * and changed the flush value to 0x0. ++ * Added message function codes for Diagnostic Buffer Post ++ * and Diagnsotic Release. ++ * New IOCStatus define: MPI2_IOCSTATUS_DIAGNOSTIC_RELEASED ++ * Moved MPI2_VERSION_UNION from mpi2_ioc.h. ++ * 02-29-08 02.00.06 Bumped MPI2_HEADER_VERSION_UNIT. ++ * 03-03-08 02.00.07 Bumped MPI2_HEADER_VERSION_UNIT. ++ * 05-21-08 02.00.08 Bumped MPI2_HEADER_VERSION_UNIT. ++ * Added #defines for marking a reply descriptor as unused. ++ * 06-27-08 02.00.09 Bumped MPI2_HEADER_VERSION_UNIT. ++ * 10-02-08 02.00.10 Bumped MPI2_HEADER_VERSION_UNIT. ++ * Moved LUN field defines from mpi2_init.h. ++ * 01-19-09 02.00.11 Bumped MPI2_HEADER_VERSION_UNIT. ++ * -------------------------------------------------------------------------- ++ ++mpi2_cnfg.h ++ * 04-30-07 02.00.00 Corresponds to Fusion-MPT MPI Specification Rev A. ++ * 06-04-07 02.00.01 Added defines for SAS IO Unit Page 2 PhyFlags. ++ * Added Manufacturing Page 11. ++ * Added MPI2_SAS_EXPANDER0_FLAGS_CONNECTOR_END_DEVICE ++ * define. ++ * 06-26-07 02.00.02 Adding generic structure for product-specific ++ * Manufacturing pages: MPI2_CONFIG_PAGE_MANUFACTURING_PS. ++ * Rework of BIOS Page 2 configuration page. ++ * Fixed MPI2_BIOSPAGE2_BOOT_DEVICE to be a union of the ++ * forms. ++ * Added configuration pages IOC Page 8 and Driver ++ * Persistent Mapping Page 0. ++ * 08-31-07 02.00.03 Modified configuration pages dealing with Integrated ++ * RAID (Manufacturing Page 4, RAID Volume Pages 0 and 1, ++ * RAID Physical Disk Pages 0 and 1, RAID Configuration ++ * Page 0). ++ * Added new value for AccessStatus field of SAS Device ++ * Page 0 (_SATA_NEEDS_INITIALIZATION). ++ * 10-31-07 02.00.04 Added missing SEPDevHandle field to ++ * MPI2_CONFIG_PAGE_SAS_ENCLOSURE_0. ++ * 12-18-07 02.00.05 Modified IO Unit Page 0 to use 32-bit version fields for ++ * NVDATA. ++ * Modified IOC Page 7 to use masks and added field for ++ * SASBroadcastPrimitiveMasks. ++ * Added MPI2_CONFIG_PAGE_BIOS_4. ++ * Added MPI2_CONFIG_PAGE_LOG_0. ++ * 02-29-08 02.00.06 Modified various names to make them 32-character unique. ++ * Added SAS Device IDs. ++ * Updated Integrated RAID configuration pages including ++ * Manufacturing Page 4, IOC Page 6, and RAID Configuration ++ * Page 0. ++ * 05-21-08 02.00.07 Added define MPI2_MANPAGE4_MIX_SSD_SAS_SATA. ++ * Added define MPI2_MANPAGE4_PHYSDISK_128MB_COERCION. ++ * Fixed define MPI2_IOCPAGE8_FLAGS_ENCLOSURE_SLOT_MAPPING. ++ * Added missing MaxNumRoutedSasAddresses field to ++ * MPI2_CONFIG_PAGE_EXPANDER_0. ++ * Added SAS Port Page 0. ++ * Modified structure layout for ++ * MPI2_CONFIG_PAGE_DRIVER_MAPPING_0. ++ * 06-27-08 02.00.08 Changed MPI2_CONFIG_PAGE_RD_PDISK_1 to use ++ * MPI2_RAID_PHYS_DISK1_PATH_MAX to size the array. ++ * 10-02-08 02.00.09 Changed MPI2_RAID_PGAD_CONFIGNUM_MASK from 0x0000FFFF ++ * to 0x000000FF. ++ * Added two new values for the Physical Disk Coercion Size ++ * bits in the Flags field of Manufacturing Page 4. ++ * Added product-specific Manufacturing pages 16 to 31. ++ * Modified Flags bits for controlling write cache on SATA ++ * drives in IO Unit Page 1. ++ * Added new bit to AdditionalControlFlags of SAS IO Unit ++ * Page 1 to control Invalid Topology Correction. ++ * Added SupportedPhysDisks field to RAID Volume Page 1 and ++ * added related defines. ++ * Added additional defines for RAID Volume Page 0 ++ * VolumeStatusFlags field. ++ * Modified meaning of RAID Volume Page 0 VolumeSettings ++ * define for auto-configure of hot-swap drives. ++ * Added PhysDiskAttributes field (and related defines) to ++ * RAID Physical Disk Page 0. ++ * Added MPI2_SAS_PHYINFO_PHY_VACANT define. ++ * Added three new DiscoveryStatus bits for SAS IO Unit ++ * Page 0 and SAS Expander Page 0. ++ * Removed multiplexing information from SAS IO Unit pages. ++ * Added BootDeviceWaitTime field to SAS IO Unit Page 4. ++ * Removed Zone Address Resolved bit from PhyInfo and from ++ * Expander Page 0 Flags field. ++ * Added two new AccessStatus values to SAS Device Page 0 ++ * for indicating routing problems. Added 3 reserved words ++ * to this page. ++ * 01-19-09 02.00.10 Fixed defines for GPIOVal field of IO Unit Page 3. ++ * Inserted missing reserved field into structure for IOC ++ * Page 6. ++ * Added more pending task bits to RAID Volume Page 0 ++ * VolumeStatusFlags defines. ++ * Added MPI2_PHYSDISK0_STATUS_FLAG_NOT_CERTIFIED define. ++ * Added a new DiscoveryStatus bit for SAS IO Unit Page 0 ++ * and SAS Expander Page 0 to flag a downstream initiator ++ * when in simplified routing mode. ++ * Removed SATA Init Failure defines for DiscoveryStatus ++ * fields of SAS IO Unit Page 0 and SAS Expander Page 0. ++ * Added MPI2_SAS_DEVICE0_ASTATUS_DEVICE_BLOCKED define. ++ * Added PortGroups, DmaGroup, and ControlGroup fields to ++ * SAS Device Page 0. ++ * -------------------------------------------------------------------------- ++ ++mpi2_init.h ++ * 04-30-07 02.00.00 Corresponds to Fusion-MPT MPI Specification Rev A. ++ * 10-31-07 02.00.01 Fixed name for pMpi2SCSITaskManagementRequest_t. ++ * 12-18-07 02.00.02 Modified Task Management Target Reset Method defines. ++ * 02-29-08 02.00.03 Added Query Task Set and Query Unit Attention. ++ * 03-03-08 02.00.04 Fixed name of struct _MPI2_SCSI_TASK_MANAGE_REPLY. ++ * 05-21-08 02.00.05 Fixed typo in name of Mpi2SepRequest_t. ++ * 10-02-08 02.00.06 Removed Untagged and No Disconnect values from SCSI IO ++ * Control field Task Attribute flags. ++ * Moved LUN field defines to mpi2.h becasue they are ++ * common to many structures. ++ * -------------------------------------------------------------------------- ++ ++mpi2_ioc.h ++ * 04-30-07 02.00.00 Corresponds to Fusion-MPT MPI Specification Rev A. ++ * 06-04-07 02.00.01 In IOCFacts Reply structure, renamed MaxDevices to ++ * MaxTargets. ++ * Added TotalImageSize field to FWDownload Request. ++ * Added reserved words to FWUpload Request. ++ * 06-26-07 02.00.02 Added IR Configuration Change List Event. ++ * 08-31-07 02.00.03 Removed SystemReplyQueueDepth field from the IOCInit ++ * request and replaced it with ++ * ReplyDescriptorPostQueueDepth and ReplyFreeQueueDepth. ++ * Replaced the MinReplyQueueDepth field of the IOCFacts ++ * reply with MaxReplyDescriptorPostQueueDepth. ++ * Added MPI2_RDPQ_DEPTH_MIN define to specify the minimum ++ * depth for the Reply Descriptor Post Queue. ++ * Added SASAddress field to Initiator Device Table ++ * Overflow Event data. ++ * 10-31-07 02.00.04 Added ReasonCode MPI2_EVENT_SAS_INIT_RC_NOT_RESPONDING ++ * for SAS Initiator Device Status Change Event data. ++ * Modified Reason Code defines for SAS Topology Change ++ * List Event data, including adding a bit for PHY Vacant ++ * status, and adding a mask for the Reason Code. ++ * Added define for ++ * MPI2_EVENT_SAS_TOPO_ES_DELAY_NOT_RESPONDING. ++ * Added define for MPI2_EXT_IMAGE_TYPE_MEGARAID. ++ * 12-18-07 02.00.05 Added Boot Status defines for the IOCExceptions field of ++ * the IOCFacts Reply. ++ * Removed MPI2_IOCFACTS_CAPABILITY_EXTENDED_BUFFER define. ++ * Moved MPI2_VERSION_UNION to mpi2.h. ++ * Changed MPI2_EVENT_NOTIFICATION_REQUEST to use masks ++ * instead of enables, and added SASBroadcastPrimitiveMasks ++ * field. ++ * Added Log Entry Added Event and related structure. ++ * 02-29-08 02.00.06 Added define MPI2_IOCFACTS_CAPABILITY_INTEGRATED_RAID. ++ * Removed define MPI2_IOCFACTS_PROTOCOL_SMP_TARGET. ++ * Added MaxVolumes and MaxPersistentEntries fields to ++ * IOCFacts reply. ++ * Added ProtocalFlags and IOCCapabilities fields to ++ * MPI2_FW_IMAGE_HEADER. ++ * Removed MPI2_PORTENABLE_FLAGS_ENABLE_SINGLE_PORT. ++ * 03-03-08 02.00.07 Fixed MPI2_FW_IMAGE_HEADER by changing Reserved26 to ++ * a U16 (from a U32). ++ * Removed extra 's' from EventMasks name. ++ * 06-27-08 02.00.08 Fixed an offset in a comment. ++ * 10-02-08 02.00.09 Removed SystemReplyFrameSize from MPI2_IOC_INIT_REQUEST. ++ * Removed CurReplyFrameSize from MPI2_IOC_FACTS_REPLY and ++ * renamed MinReplyFrameSize to ReplyFrameSize. ++ * Added MPI2_IOCFACTS_EXCEPT_IR_FOREIGN_CONFIG_MAX. ++ * Added two new RAIDOperation values for Integrated RAID ++ * Operations Status Event data. ++ * Added four new IR Configuration Change List Event data ++ * ReasonCode values. ++ * Added two new ReasonCode defines for SAS Device Status ++ * Change Event data. ++ * Added three new DiscoveryStatus bits for the SAS ++ * Discovery event data. ++ * Added Multiplexing Status Change bit to the PhyStatus ++ * field of the SAS Topology Change List event data. ++ * Removed define for MPI2_INIT_IMAGE_BOOTFLAGS_XMEMCOPY. ++ * BootFlags are now product-specific. ++ * Added defines for the indivdual signature bytes ++ * for MPI2_INIT_IMAGE_FOOTER. ++ * 01-19-09 02.00.10 Added MPI2_IOCFACTS_CAPABILITY_EVENT_REPLAY define. ++ * Added MPI2_EVENT_SAS_DISC_DS_DOWNSTREAM_INITIATOR ++ * define. ++ * Added MPI2_EVENT_SAS_DEV_STAT_RC_SATA_INIT_FAILURE ++ * define. ++ * Removed MPI2_EVENT_SAS_DISC_DS_SATA_INIT_FAILURE define. ++ * -------------------------------------------------------------------------- ++ ++mpi2_raid.h ++ * 04-30-07 02.00.00 Corresponds to Fusion-MPT MPI Specification Rev A. ++ * 08-31-07 02.00.01 Modifications to RAID Action request and reply, ++ * including the Actions and ActionData. ++ * 02-29-08 02.00.02 Added MPI2_RAID_ACTION_ADATA_DISABL_FULL_REBUILD. ++ * 05-21-08 02.00.03 Added MPI2_RAID_VOL_CREATION_NUM_PHYSDISKS so that ++ * the PhysDisk array in MPI2_RAID_VOLUME_CREATION_STRUCT ++ * can be sized by the build environment. ++ * -------------------------------------------------------------------------- ++ ++mpi2_sas.h ++ * 04-30-07 02.00.00 Corresponds to Fusion-MPT MPI Specification Rev A. ++ * 06-26-07 02.00.01 Added Clear All Persistent Operation to SAS IO Unit ++ * Control Request. ++ * 10-02-08 02.00.02 Added Set IOC Parameter Operation to SAS IO Unit Control ++ * Request. ++ * -------------------------------------------------------------------------- ++ ++mpi2_targ.h ++ * 04-30-07 02.00.00 Corresponds to Fusion-MPT MPI Specification Rev A. ++ * 08-31-07 02.00.01 Added Command Buffer Data Location Address Space bits to ++ * BufferPostFlags field of CommandBufferPostBase Request. ++ * 02-29-08 02.00.02 Modified various names to make them 32-character unique. ++ * 10-02-08 02.00.03 Removed NextCmdBufferOffset from ++ * MPI2_TARGET_CMD_BUF_POST_BASE_REQUEST. ++ * Target Status Send Request only takes a single SGE for ++ * response data. ++ * -------------------------------------------------------------------------- ++ ++mpi2_tool.h ++ * 04-30-07 02.00.00 Corresponds to Fusion-MPT MPI Specification Rev A. ++ * 12-18-07 02.00.01 Added Diagnostic Buffer Post and Diagnostic Release ++ * structures and defines. ++ * 02-29-08 02.00.02 Modified various names to make them 32-character unique. ++ * -------------------------------------------------------------------------- ++ ++mpi2_type.h ++ * 04-30-07 02.00.00 Corresponds to Fusion-MPT MPI Specification Rev A. ++ * -------------------------------------------------------------------------- ++ ++mpi2_history.txt Parts list history ++ ++Filename 02.00.11 02.00.10 02.00.09 02.00.08 02.00.07 02.00.06 ++---------- -------- -------- -------- -------- -------- -------- ++mpi2.h 02.00.11 02.00.10 02.00.09 02.00.08 02.00.07 02.00.06 ++mpi2_cnfg.h 02.00.10 02.00.09 02.00.08 02.00.07 02.00.06 02.00.06 ++mpi2_init.h 02.00.06 02.00.06 02.00.05 02.00.05 02.00.04 02.00.03 ++mpi2_ioc.h 02.00.10 02.00.09 02.00.08 02.00.07 02.00.07 02.00.06 ++mpi2_raid.h 02.00.03 02.00.03 02.00.03 02.00.03 02.00.02 02.00.02 ++mpi2_sas.h 02.00.02 02.00.02 02.00.01 02.00.01 02.00.01 02.00.01 ++mpi2_targ.h 02.00.03 02.00.03 02.00.02 02.00.02 02.00.02 02.00.02 ++mpi2_tool.h 02.00.02 02.00.02 02.00.02 02.00.02 02.00.02 02.00.02 ++mpi2_type.h 02.00.00 02.00.00 02.00.00 02.00.00 02.00.00 02.00.00 ++ ++Filename 02.00.05 02.00.04 02.00.03 02.00.02 02.00.01 02.00.00 ++---------- -------- -------- -------- -------- -------- -------- ++mpi2.h 02.00.05 02.00.04 02.00.03 02.00.02 02.00.01 02.00.00 ++mpi2_cnfg.h 02.00.05 02.00.04 02.00.03 02.00.02 02.00.01 02.00.00 ++mpi2_init.h 02.00.02 02.00.01 02.00.00 02.00.00 02.00.00 02.00.00 ++mpi2_ioc.h 02.00.05 02.00.04 02.00.03 02.00.02 02.00.01 02.00.00 ++mpi2_raid.h 02.00.01 02.00.01 02.00.01 02.00.00 02.00.00 02.00.00 ++mpi2_sas.h 02.00.01 02.00.01 02.00.01 02.00.01 02.00.00 02.00.00 ++mpi2_targ.h 02.00.01 02.00.01 02.00.01 02.00.00 02.00.00 02.00.00 ++mpi2_tool.h 02.00.01 02.00.00 02.00.00 02.00.00 02.00.00 02.00.00 ++mpi2_type.h 02.00.00 02.00.00 02.00.00 02.00.00 02.00.00 02.00.00 ++ +diff -r e02b4006a7c8 drivers/scsi/mpt2sas/mpi/mpi2_init.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/scsi/mpt2sas/mpi/mpi2_init.h Wed Jul 01 09:49:59 2009 +0100 +@@ -0,0 +1,420 @@ ++/* ++ * Copyright (c) 2000-2008 LSI Corporation. ++ * ++ * ++ * Name: mpi2_init.h ++ * Title: MPI SCSI initiator mode messages and structures ++ * Creation Date: June 23, 2006 ++ * ++ * mpi2_init.h Version: 02.00.06 ++ * ++ * Version History ++ * --------------- ++ * ++ * Date Version Description ++ * -------- -------- ------------------------------------------------------ ++ * 04-30-07 02.00.00 Corresponds to Fusion-MPT MPI Specification Rev A. ++ * 10-31-07 02.00.01 Fixed name for pMpi2SCSITaskManagementRequest_t. ++ * 12-18-07 02.00.02 Modified Task Management Target Reset Method defines. ++ * 02-29-08 02.00.03 Added Query Task Set and Query Unit Attention. ++ * 03-03-08 02.00.04 Fixed name of struct _MPI2_SCSI_TASK_MANAGE_REPLY. ++ * 05-21-08 02.00.05 Fixed typo in name of Mpi2SepRequest_t. ++ * 10-02-08 02.00.06 Removed Untagged and No Disconnect values from SCSI IO ++ * Control field Task Attribute flags. ++ * Moved LUN field defines to mpi2.h becasue they are ++ * common to many structures. ++ * -------------------------------------------------------------------------- ++ */ ++ ++#ifndef MPI2_INIT_H ++#define MPI2_INIT_H ++ ++/***************************************************************************** ++* ++* SCSI Initiator Messages ++* ++*****************************************************************************/ ++ ++/**************************************************************************** ++* SCSI IO messages and associated structures ++****************************************************************************/ ++ ++typedef struct ++{ ++ U8 CDB[20]; /* 0x00 */ ++ U32 PrimaryReferenceTag; /* 0x14 */ ++ U16 PrimaryApplicationTag; /* 0x18 */ ++ U16 PrimaryApplicationTagMask; /* 0x1A */ ++ U32 TransferLength; /* 0x1C */ ++} MPI2_SCSI_IO_CDB_EEDP32, MPI2_POINTER PTR_MPI2_SCSI_IO_CDB_EEDP32, ++ Mpi2ScsiIoCdbEedp32_t, MPI2_POINTER pMpi2ScsiIoCdbEedp32_t; ++ ++/* TBD: I don't think this is needed for MPI2/Gen2 */ ++#if 0 ++typedef struct ++{ ++ U8 CDB[16]; /* 0x00 */ ++ U32 DataLength; /* 0x10 */ ++ U32 PrimaryReferenceTag; /* 0x14 */ ++ U16 PrimaryApplicationTag; /* 0x18 */ ++ U16 PrimaryApplicationTagMask; /* 0x1A */ ++ U32 TransferLength; /* 0x1C */ ++} MPI2_SCSI_IO32_CDB_EEDP16, MPI2_POINTER PTR_MPI2_SCSI_IO32_CDB_EEDP16, ++ Mpi2ScsiIo32CdbEedp16_t, MPI2_POINTER pMpi2ScsiIo32CdbEedp16_t; ++#endif ++ ++typedef union ++{ ++ U8 CDB32[32]; ++ MPI2_SCSI_IO_CDB_EEDP32 EEDP32; ++ MPI2_SGE_SIMPLE_UNION SGE; ++} MPI2_SCSI_IO_CDB_UNION, MPI2_POINTER PTR_MPI2_SCSI_IO_CDB_UNION, ++ Mpi2ScsiIoCdb_t, MPI2_POINTER pMpi2ScsiIoCdb_t; ++ ++/* SCSI IO Request Message */ ++typedef struct _MPI2_SCSI_IO_REQUEST ++{ ++ U16 DevHandle; /* 0x00 */ ++ U8 ChainOffset; /* 0x02 */ ++ U8 Function; /* 0x03 */ ++ U16 Reserved1; /* 0x04 */ ++ U8 Reserved2; /* 0x06 */ ++ U8 MsgFlags; /* 0x07 */ ++ U8 VP_ID; /* 0x08 */ ++ U8 VF_ID; /* 0x09 */ ++ U16 Reserved3; /* 0x0A */ ++ U32 SenseBufferLowAddress; /* 0x0C */ ++ U16 SGLFlags; /* 0x10 */ ++ U8 SenseBufferLength; /* 0x12 */ ++ U8 Reserved4; /* 0x13 */ ++ U8 SGLOffset0; /* 0x14 */ ++ U8 SGLOffset1; /* 0x15 */ ++ U8 SGLOffset2; /* 0x16 */ ++ U8 SGLOffset3; /* 0x17 */ ++ U32 SkipCount; /* 0x18 */ ++ U32 DataLength; /* 0x1C */ ++ U32 BidirectionalDataLength; /* 0x20 */ ++ U16 IoFlags; /* 0x24 */ ++ U16 EEDPFlags; /* 0x26 */ ++ U32 EEDPBlockSize; /* 0x28 */ ++ U32 SecondaryReferenceTag; /* 0x2C */ ++ U16 SecondaryApplicationTag; /* 0x30 */ ++ U16 ApplicationTagTranslationMask; /* 0x32 */ ++ U8 LUN[8]; /* 0x34 */ ++ U32 Control; /* 0x3C */ ++ MPI2_SCSI_IO_CDB_UNION CDB; /* 0x40 */ ++ MPI2_SGE_IO_UNION SGL; /* 0x60 */ ++} MPI2_SCSI_IO_REQUEST, MPI2_POINTER PTR_MPI2_SCSI_IO_REQUEST, ++ Mpi2SCSIIORequest_t, MPI2_POINTER pMpi2SCSIIORequest_t; ++ ++/* SCSI IO MsgFlags bits */ ++ ++/* MsgFlags for SenseBufferAddressSpace */ ++#define MPI2_SCSIIO_MSGFLAGS_MASK_SENSE_ADDR (0x0C) ++#define MPI2_SCSIIO_MSGFLAGS_SYSTEM_SENSE_ADDR (0x00) ++#define MPI2_SCSIIO_MSGFLAGS_IOCDDR_SENSE_ADDR (0x04) ++#define MPI2_SCSIIO_MSGFLAGS_IOCPLB_SENSE_ADDR (0x08) ++#define MPI2_SCSIIO_MSGFLAGS_IOCPLBNTA_SENSE_ADDR (0x0C) ++ ++/* SCSI IO SGLFlags bits */ ++ ++/* base values for Data Location Address Space */ ++#define MPI2_SCSIIO_SGLFLAGS_ADDR_MASK (0x0C) ++#define MPI2_SCSIIO_SGLFLAGS_SYSTEM_ADDR (0x00) ++#define MPI2_SCSIIO_SGLFLAGS_IOCDDR_ADDR (0x04) ++#define MPI2_SCSIIO_SGLFLAGS_IOCPLB_ADDR (0x08) ++#define MPI2_SCSIIO_SGLFLAGS_IOCPLBNTA_ADDR (0x0C) ++ ++/* base values for Type */ ++#define MPI2_SCSIIO_SGLFLAGS_TYPE_MASK (0x03) ++#define MPI2_SCSIIO_SGLFLAGS_TYPE_MPI (0x00) ++#define MPI2_SCSIIO_SGLFLAGS_TYPE_IEEE32 (0x01) ++#define MPI2_SCSIIO_SGLFLAGS_TYPE_IEEE64 (0x02) ++ ++/* shift values for each sub-field */ ++#define MPI2_SCSIIO_SGLFLAGS_SGL3_SHIFT (12) ++#define MPI2_SCSIIO_SGLFLAGS_SGL2_SHIFT (8) ++#define MPI2_SCSIIO_SGLFLAGS_SGL1_SHIFT (4) ++#define MPI2_SCSIIO_SGLFLAGS_SGL0_SHIFT (0) ++ ++/* SCSI IO IoFlags bits */ ++ ++/* Large CDB Address Space */ ++#define MPI2_SCSIIO_CDB_ADDR_MASK (0x6000) ++#define MPI2_SCSIIO_CDB_ADDR_SYSTEM (0x0000) ++#define MPI2_SCSIIO_CDB_ADDR_IOCDDR (0x2000) ++#define MPI2_SCSIIO_CDB_ADDR_IOCPLB (0x4000) ++#define MPI2_SCSIIO_CDB_ADDR_IOCPLBNTA (0x6000) ++ ++#define MPI2_SCSIIO_IOFLAGS_LARGE_CDB (0x1000) ++#define MPI2_SCSIIO_IOFLAGS_BIDIRECTIONAL (0x0800) ++#define MPI2_SCSIIO_IOFLAGS_MULTICAST (0x0400) ++#define MPI2_SCSIIO_IOFLAGS_CMD_DETERMINES_DATA_DIR (0x0200) ++#define MPI2_SCSIIO_IOFLAGS_CDBLENGTH_MASK (0x01FF) ++ ++/* SCSI IO EEDPFlags bits */ ++ ++#define MPI2_SCSIIO_EEDPFLAGS_INC_PRI_REFTAG (0x8000) ++#define MPI2_SCSIIO_EEDPFLAGS_INC_SEC_REFTAG (0x4000) ++#define MPI2_SCSIIO_EEDPFLAGS_INC_PRI_APPTAG (0x2000) ++#define MPI2_SCSIIO_EEDPFLAGS_INC_SEC_APPTAG (0x1000) ++ ++#define MPI2_SCSIIO_EEDPFLAGS_CHECK_REFTAG (0x0400) ++#define MPI2_SCSIIO_EEDPFLAGS_CHECK_APPTAG (0x0200) ++#define MPI2_SCSIIO_EEDPFLAGS_CHECK_GUARD (0x0100) ++ ++#define MPI2_SCSIIO_EEDPFLAGS_PASSTHRU_REFTAG (0x0008) ++ ++#define MPI2_SCSIIO_EEDPFLAGS_MASK_OP (0x0007) ++#define MPI2_SCSIIO_EEDPFLAGS_NOOP_OP (0x0000) ++#define MPI2_SCSIIO_EEDPFLAGS_CHECK_OP (0x0001) ++#define MPI2_SCSIIO_EEDPFLAGS_STRIP_OP (0x0002) ++#define MPI2_SCSIIO_EEDPFLAGS_CHECK_REMOVE_OP (0x0003) ++#define MPI2_SCSIIO_EEDPFLAGS_INSERT_OP (0x0004) ++#define MPI2_SCSIIO_EEDPFLAGS_REPLACE_OP (0x0006) ++#define MPI2_SCSIIO_EEDPFLAGS_CHECK_REGEN_OP (0x0007) ++ ++/* SCSI IO LUN fields: use MPI2_LUN_ from mpi2.h */ ++ ++/* SCSI IO Control bits */ ++#define MPI2_SCSIIO_CONTROL_ADDCDBLEN_MASK (0xFC000000) ++#define MPI2_SCSIIO_CONTROL_ADDCDBLEN_SHIFT (26) ++ ++#define MPI2_SCSIIO_CONTROL_DATADIRECTION_MASK (0x03000000) ++#define MPI2_SCSIIO_CONTROL_NODATATRANSFER (0x00000000) ++#define MPI2_SCSIIO_CONTROL_WRITE (0x01000000) ++#define MPI2_SCSIIO_CONTROL_READ (0x02000000) ++#define MPI2_SCSIIO_CONTROL_BIDIRECTIONAL (0x03000000) ++ ++#define MPI2_SCSIIO_CONTROL_TASKPRI_MASK (0x00007800) ++#define MPI2_SCSIIO_CONTROL_TASKPRI_SHIFT (11) ++ ++#define MPI2_SCSIIO_CONTROL_TASKATTRIBUTE_MASK (0x00000700) ++#define MPI2_SCSIIO_CONTROL_SIMPLEQ (0x00000000) ++#define MPI2_SCSIIO_CONTROL_HEADOFQ (0x00000100) ++#define MPI2_SCSIIO_CONTROL_ORDEREDQ (0x00000200) ++#define MPI2_SCSIIO_CONTROL_ACAQ (0x00000400) ++ ++#define MPI2_SCSIIO_CONTROL_TLR_MASK (0x000000C0) ++#define MPI2_SCSIIO_CONTROL_NO_TLR (0x00000000) ++#define MPI2_SCSIIO_CONTROL_TLR_ON (0x00000040) ++#define MPI2_SCSIIO_CONTROL_TLR_OFF (0x00000080) ++ ++ ++/* SCSI IO Error Reply Message */ ++typedef struct _MPI2_SCSI_IO_REPLY ++{ ++ U16 DevHandle; /* 0x00 */ ++ U8 MsgLength; /* 0x02 */ ++ U8 Function; /* 0x03 */ ++ U16 Reserved1; /* 0x04 */ ++ U8 Reserved2; /* 0x06 */ ++ U8 MsgFlags; /* 0x07 */ ++ U8 VP_ID; /* 0x08 */ ++ U8 VF_ID; /* 0x09 */ ++ U16 Reserved3; /* 0x0A */ ++ U8 SCSIStatus; /* 0x0C */ ++ U8 SCSIState; /* 0x0D */ ++ U16 IOCStatus; /* 0x0E */ ++ U32 IOCLogInfo; /* 0x10 */ ++ U32 TransferCount; /* 0x14 */ ++ U32 SenseCount; /* 0x18 */ ++ U32 ResponseInfo; /* 0x1C */ ++ U16 TaskTag; /* 0x20 */ ++ U16 Reserved4; /* 0x22 */ ++ U32 BidirectionalTransferCount; /* 0x24 */ ++ U32 Reserved5; /* 0x28 */ ++ U32 Reserved6; /* 0x2C */ ++} MPI2_SCSI_IO_REPLY, MPI2_POINTER PTR_MPI2_SCSI_IO_REPLY, ++ Mpi2SCSIIOReply_t, MPI2_POINTER pMpi2SCSIIOReply_t; ++ ++/* SCSI IO Reply SCSIStatus values (SAM-4 status codes) */ ++ ++#define MPI2_SCSI_STATUS_GOOD (0x00) ++#define MPI2_SCSI_STATUS_CHECK_CONDITION (0x02) ++#define MPI2_SCSI_STATUS_CONDITION_MET (0x04) ++#define MPI2_SCSI_STATUS_BUSY (0x08) ++#define MPI2_SCSI_STATUS_INTERMEDIATE (0x10) ++#define MPI2_SCSI_STATUS_INTERMEDIATE_CONDMET (0x14) ++#define MPI2_SCSI_STATUS_RESERVATION_CONFLICT (0x18) ++#define MPI2_SCSI_STATUS_COMMAND_TERMINATED (0x22) /* obsolete */ ++#define MPI2_SCSI_STATUS_TASK_SET_FULL (0x28) ++#define MPI2_SCSI_STATUS_ACA_ACTIVE (0x30) ++#define MPI2_SCSI_STATUS_TASK_ABORTED (0x40) ++ ++/* SCSI IO Reply SCSIState flags */ ++ ++#define MPI2_SCSI_STATE_RESPONSE_INFO_VALID (0x10) ++#define MPI2_SCSI_STATE_TERMINATED (0x08) ++#define MPI2_SCSI_STATE_NO_SCSI_STATUS (0x04) ++#define MPI2_SCSI_STATE_AUTOSENSE_FAILED (0x02) ++#define MPI2_SCSI_STATE_AUTOSENSE_VALID (0x01) ++ ++#define MPI2_SCSI_TASKTAG_UNKNOWN (0xFFFF) ++ ++ ++/**************************************************************************** ++* SCSI Task Management messages ++****************************************************************************/ ++ ++/* SCSI Task Management Request Message */ ++typedef struct _MPI2_SCSI_TASK_MANAGE_REQUEST ++{ ++ U16 DevHandle; /* 0x00 */ ++ U8 ChainOffset; /* 0x02 */ ++ U8 Function; /* 0x03 */ ++ U8 Reserved1; /* 0x04 */ ++ U8 TaskType; /* 0x05 */ ++ U8 Reserved2; /* 0x06 */ ++ U8 MsgFlags; /* 0x07 */ ++ U8 VP_ID; /* 0x08 */ ++ U8 VF_ID; /* 0x09 */ ++ U16 Reserved3; /* 0x0A */ ++ U8 LUN[8]; /* 0x0C */ ++ U32 Reserved4[7]; /* 0x14 */ ++ U16 TaskMID; /* 0x30 */ ++ U16 Reserved5; /* 0x32 */ ++} MPI2_SCSI_TASK_MANAGE_REQUEST, ++ MPI2_POINTER PTR_MPI2_SCSI_TASK_MANAGE_REQUEST, ++ Mpi2SCSITaskManagementRequest_t, ++ MPI2_POINTER pMpi2SCSITaskManagementRequest_t; ++ ++/* TaskType values */ ++ ++#define MPI2_SCSITASKMGMT_TASKTYPE_ABORT_TASK (0x01) ++#define MPI2_SCSITASKMGMT_TASKTYPE_ABRT_TASK_SET (0x02) ++#define MPI2_SCSITASKMGMT_TASKTYPE_TARGET_RESET (0x03) ++#define MPI2_SCSITASKMGMT_TASKTYPE_LOGICAL_UNIT_RESET (0x05) ++#define MPI2_SCSITASKMGMT_TASKTYPE_CLEAR_TASK_SET (0x06) ++#define MPI2_SCSITASKMGMT_TASKTYPE_QUERY_TASK (0x07) ++#define MPI2_SCSITASKMGMT_TASKTYPE_CLR_ACA (0x08) ++#define MPI2_SCSITASKMGMT_TASKTYPE_QRY_TASK_SET (0x09) ++#define MPI2_SCSITASKMGMT_TASKTYPE_QRY_UNIT_ATTENTION (0x0A) ++ ++/* MsgFlags bits */ ++ ++#define MPI2_SCSITASKMGMT_MSGFLAGS_MASK_TARGET_RESET (0x18) ++#define MPI2_SCSITASKMGMT_MSGFLAGS_LINK_RESET (0x00) ++#define MPI2_SCSITASKMGMT_MSGFLAGS_NEXUS_RESET_SRST (0x08) ++#define MPI2_SCSITASKMGMT_MSGFLAGS_SAS_HARD_LINK_RESET (0x10) ++ ++#define MPI2_SCSITASKMGMT_MSGFLAGS_DO_NOT_SEND_TASK_IU (0x01) ++ ++ ++ ++/* SCSI Task Management Reply Message */ ++typedef struct _MPI2_SCSI_TASK_MANAGE_REPLY ++{ ++ U16 DevHandle; /* 0x00 */ ++ U8 MsgLength; /* 0x02 */ ++ U8 Function; /* 0x03 */ ++ U8 ResponseCode; /* 0x04 */ ++ U8 TaskType; /* 0x05 */ ++ U8 Reserved1; /* 0x06 */ ++ U8 MsgFlags; /* 0x07 */ ++ U8 VP_ID; /* 0x08 */ ++ U8 VF_ID; /* 0x09 */ ++ U16 Reserved2; /* 0x0A */ ++ U16 Reserved3; /* 0x0C */ ++ U16 IOCStatus; /* 0x0E */ ++ U32 IOCLogInfo; /* 0x10 */ ++ U32 TerminationCount; /* 0x14 */ ++} MPI2_SCSI_TASK_MANAGE_REPLY, ++ MPI2_POINTER PTR_MPI2_SCSI_TASK_MANAGE_REPLY, ++ Mpi2SCSITaskManagementReply_t, MPI2_POINTER pMpi2SCSIManagementReply_t; ++ ++/* ResponseCode values */ ++ ++#define MPI2_SCSITASKMGMT_RSP_TM_COMPLETE (0x00) ++#define MPI2_SCSITASKMGMT_RSP_INVALID_FRAME (0x02) ++#define MPI2_SCSITASKMGMT_RSP_TM_NOT_SUPPORTED (0x04) ++#define MPI2_SCSITASKMGMT_RSP_TM_FAILED (0x05) ++#define MPI2_SCSITASKMGMT_RSP_TM_SUCCEEDED (0x08) ++#define MPI2_SCSITASKMGMT_RSP_TM_INVALID_LUN (0x09) ++#define MPI2_SCSITASKMGMT_RSP_IO_QUEUED_ON_IOC (0x80) ++ ++ ++/**************************************************************************** ++* SCSI Enclosure Processor messages ++****************************************************************************/ ++ ++/* SCSI Enclosure Processor Request Message */ ++typedef struct _MPI2_SEP_REQUEST ++{ ++ U16 DevHandle; /* 0x00 */ ++ U8 ChainOffset; /* 0x02 */ ++ U8 Function; /* 0x03 */ ++ U8 Action; /* 0x04 */ ++ U8 Flags; /* 0x05 */ ++ U8 Reserved1; /* 0x06 */ ++ U8 MsgFlags; /* 0x07 */ ++ U8 VP_ID; /* 0x08 */ ++ U8 VF_ID; /* 0x09 */ ++ U16 Reserved2; /* 0x0A */ ++ U32 SlotStatus; /* 0x0C */ ++ U32 Reserved3; /* 0x10 */ ++ U32 Reserved4; /* 0x14 */ ++ U32 Reserved5; /* 0x18 */ ++ U16 Slot; /* 0x1C */ ++ U16 EnclosureHandle; /* 0x1E */ ++} MPI2_SEP_REQUEST, MPI2_POINTER PTR_MPI2_SEP_REQUEST, ++ Mpi2SepRequest_t, MPI2_POINTER pMpi2SepRequest_t; ++ ++/* Action defines */ ++#define MPI2_SEP_REQ_ACTION_WRITE_STATUS (0x00) ++#define MPI2_SEP_REQ_ACTION_READ_STATUS (0x01) ++ ++/* Flags defines */ ++#define MPI2_SEP_REQ_FLAGS_DEVHANDLE_ADDRESS (0x00) ++#define MPI2_SEP_REQ_FLAGS_ENCLOSURE_SLOT_ADDRESS (0x01) ++ ++/* SlotStatus defines */ ++#define MPI2_SEP_REQ_SLOTSTATUS_REQUEST_REMOVE (0x00040000) ++#define MPI2_SEP_REQ_SLOTSTATUS_IDENTIFY_REQUEST (0x00020000) ++#define MPI2_SEP_REQ_SLOTSTATUS_REBUILD_STOPPED (0x00000200) ++#define MPI2_SEP_REQ_SLOTSTATUS_HOT_SPARE (0x00000100) ++#define MPI2_SEP_REQ_SLOTSTATUS_UNCONFIGURED (0x00000080) ++#define MPI2_SEP_REQ_SLOTSTATUS_PREDICTED_FAULT (0x00000040) ++#define MPI2_SEP_REQ_SLOTSTATUS_DEV_REBUILDING (0x00000004) ++#define MPI2_SEP_REQ_SLOTSTATUS_DEV_FAULTY (0x00000002) ++#define MPI2_SEP_REQ_SLOTSTATUS_NO_ERROR (0x00000001) ++ ++ ++/* SCSI Enclosure Processor Reply Message */ ++typedef struct _MPI2_SEP_REPLY ++{ ++ U16 DevHandle; /* 0x00 */ ++ U8 MsgLength; /* 0x02 */ ++ U8 Function; /* 0x03 */ ++ U8 Action; /* 0x04 */ ++ U8 Flags; /* 0x05 */ ++ U8 Reserved1; /* 0x06 */ ++ U8 MsgFlags; /* 0x07 */ ++ U8 VP_ID; /* 0x08 */ ++ U8 VF_ID; /* 0x09 */ ++ U16 Reserved2; /* 0x0A */ ++ U16 Reserved3; /* 0x0C */ ++ U16 IOCStatus; /* 0x0E */ ++ U32 IOCLogInfo; /* 0x10 */ ++ U32 SlotStatus; /* 0x14 */ ++ U32 Reserved4; /* 0x18 */ ++ U16 Slot; /* 0x1C */ ++ U16 EnclosureHandle; /* 0x1E */ ++} MPI2_SEP_REPLY, MPI2_POINTER PTR_MPI2_SEP_REPLY, ++ Mpi2SepReply_t, MPI2_POINTER pMpi2SepReply_t; ++ ++/* SlotStatus defines */ ++#define MPI2_SEP_REPLY_SLOTSTATUS_REMOVE_READY (0x00040000) ++#define MPI2_SEP_REPLY_SLOTSTATUS_IDENTIFY_REQUEST (0x00020000) ++#define MPI2_SEP_REPLY_SLOTSTATUS_REBUILD_STOPPED (0x00000200) ++#define MPI2_SEP_REPLY_SLOTSTATUS_HOT_SPARE (0x00000100) ++#define MPI2_SEP_REPLY_SLOTSTATUS_UNCONFIGURED (0x00000080) ++#define MPI2_SEP_REPLY_SLOTSTATUS_PREDICTED_FAULT (0x00000040) ++#define MPI2_SEP_REPLY_SLOTSTATUS_DEV_REBUILDING (0x00000004) ++#define MPI2_SEP_REPLY_SLOTSTATUS_DEV_FAULTY (0x00000002) ++#define MPI2_SEP_REPLY_SLOTSTATUS_NO_ERROR (0x00000001) ++ ++ ++#endif ++ ++ +diff -r e02b4006a7c8 drivers/scsi/mpt2sas/mpi/mpi2_ioc.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/scsi/mpt2sas/mpi/mpi2_ioc.h Wed Jul 01 09:49:59 2009 +0100 +@@ -0,0 +1,1295 @@ ++/* ++ * Copyright (c) 2000-2009 LSI Corporation. ++ * ++ * ++ * Name: mpi2_ioc.h ++ * Title: MPI IOC, Port, Event, FW Download, and FW Upload messages ++ * Creation Date: October 11, 2006 ++ * ++ * mpi2_ioc.h Version: 02.00.10 ++ * ++ * Version History ++ * --------------- ++ * ++ * Date Version Description ++ * -------- -------- ------------------------------------------------------ ++ * 04-30-07 02.00.00 Corresponds to Fusion-MPT MPI Specification Rev A. ++ * 06-04-07 02.00.01 In IOCFacts Reply structure, renamed MaxDevices to ++ * MaxTargets. ++ * Added TotalImageSize field to FWDownload Request. ++ * Added reserved words to FWUpload Request. ++ * 06-26-07 02.00.02 Added IR Configuration Change List Event. ++ * 08-31-07 02.00.03 Removed SystemReplyQueueDepth field from the IOCInit ++ * request and replaced it with ++ * ReplyDescriptorPostQueueDepth and ReplyFreeQueueDepth. ++ * Replaced the MinReplyQueueDepth field of the IOCFacts ++ * reply with MaxReplyDescriptorPostQueueDepth. ++ * Added MPI2_RDPQ_DEPTH_MIN define to specify the minimum ++ * depth for the Reply Descriptor Post Queue. ++ * Added SASAddress field to Initiator Device Table ++ * Overflow Event data. ++ * 10-31-07 02.00.04 Added ReasonCode MPI2_EVENT_SAS_INIT_RC_NOT_RESPONDING ++ * for SAS Initiator Device Status Change Event data. ++ * Modified Reason Code defines for SAS Topology Change ++ * List Event data, including adding a bit for PHY Vacant ++ * status, and adding a mask for the Reason Code. ++ * Added define for ++ * MPI2_EVENT_SAS_TOPO_ES_DELAY_NOT_RESPONDING. ++ * Added define for MPI2_EXT_IMAGE_TYPE_MEGARAID. ++ * 12-18-07 02.00.05 Added Boot Status defines for the IOCExceptions field of ++ * the IOCFacts Reply. ++ * Removed MPI2_IOCFACTS_CAPABILITY_EXTENDED_BUFFER define. ++ * Moved MPI2_VERSION_UNION to mpi2.h. ++ * Changed MPI2_EVENT_NOTIFICATION_REQUEST to use masks ++ * instead of enables, and added SASBroadcastPrimitiveMasks ++ * field. ++ * Added Log Entry Added Event and related structure. ++ * 02-29-08 02.00.06 Added define MPI2_IOCFACTS_CAPABILITY_INTEGRATED_RAID. ++ * Removed define MPI2_IOCFACTS_PROTOCOL_SMP_TARGET. ++ * Added MaxVolumes and MaxPersistentEntries fields to ++ * IOCFacts reply. ++ * Added ProtocalFlags and IOCCapabilities fields to ++ * MPI2_FW_IMAGE_HEADER. ++ * Removed MPI2_PORTENABLE_FLAGS_ENABLE_SINGLE_PORT. ++ * 03-03-08 02.00.07 Fixed MPI2_FW_IMAGE_HEADER by changing Reserved26 to ++ * a U16 (from a U32). ++ * Removed extra 's' from EventMasks name. ++ * 06-27-08 02.00.08 Fixed an offset in a comment. ++ * 10-02-08 02.00.09 Removed SystemReplyFrameSize from MPI2_IOC_INIT_REQUEST. ++ * Removed CurReplyFrameSize from MPI2_IOC_FACTS_REPLY and ++ * renamed MinReplyFrameSize to ReplyFrameSize. ++ * Added MPI2_IOCFACTS_EXCEPT_IR_FOREIGN_CONFIG_MAX. ++ * Added two new RAIDOperation values for Integrated RAID ++ * Operations Status Event data. ++ * Added four new IR Configuration Change List Event data ++ * ReasonCode values. ++ * Added two new ReasonCode defines for SAS Device Status ++ * Change Event data. ++ * Added three new DiscoveryStatus bits for the SAS ++ * Discovery event data. ++ * Added Multiplexing Status Change bit to the PhyStatus ++ * field of the SAS Topology Change List event data. ++ * Removed define for MPI2_INIT_IMAGE_BOOTFLAGS_XMEMCOPY. ++ * BootFlags are now product-specific. ++ * Added defines for the indivdual signature bytes ++ * for MPI2_INIT_IMAGE_FOOTER. ++ * 01-19-09 02.00.10 Added MPI2_IOCFACTS_CAPABILITY_EVENT_REPLAY define. ++ * Added MPI2_EVENT_SAS_DISC_DS_DOWNSTREAM_INITIATOR ++ * define. ++ * Added MPI2_EVENT_SAS_DEV_STAT_RC_SATA_INIT_FAILURE ++ * define. ++ * Removed MPI2_EVENT_SAS_DISC_DS_SATA_INIT_FAILURE define. ++ * -------------------------------------------------------------------------- ++ */ ++ ++#ifndef MPI2_IOC_H ++#define MPI2_IOC_H ++ ++/***************************************************************************** ++* ++* IOC Messages ++* ++*****************************************************************************/ ++ ++/**************************************************************************** ++* IOCInit message ++****************************************************************************/ ++ ++/* IOCInit Request message */ ++typedef struct _MPI2_IOC_INIT_REQUEST ++{ ++ U8 WhoInit; /* 0x00 */ ++ U8 Reserved1; /* 0x01 */ ++ U8 ChainOffset; /* 0x02 */ ++ U8 Function; /* 0x03 */ ++ U16 Reserved2; /* 0x04 */ ++ U8 Reserved3; /* 0x06 */ ++ U8 MsgFlags; /* 0x07 */ ++ U8 VP_ID; /* 0x08 */ ++ U8 VF_ID; /* 0x09 */ ++ U16 Reserved4; /* 0x0A */ ++ U16 MsgVersion; /* 0x0C */ ++ U16 HeaderVersion; /* 0x0E */ ++ U32 Reserved5; /* 0x10 */ ++ U32 Reserved6; /* 0x14 */ ++ U16 Reserved7; /* 0x18 */ ++ U16 SystemRequestFrameSize; /* 0x1A */ ++ U16 ReplyDescriptorPostQueueDepth; /* 0x1C */ ++ U16 ReplyFreeQueueDepth; /* 0x1E */ ++ U32 SenseBufferAddressHigh; /* 0x20 */ ++ U32 SystemReplyAddressHigh; /* 0x24 */ ++ U64 SystemRequestFrameBaseAddress; /* 0x28 */ ++ U64 ReplyDescriptorPostQueueAddress;/* 0x30 */ ++ U64 ReplyFreeQueueAddress; /* 0x38 */ ++ U64 TimeStamp; /* 0x40 */ ++} MPI2_IOC_INIT_REQUEST, MPI2_POINTER PTR_MPI2_IOC_INIT_REQUEST, ++ Mpi2IOCInitRequest_t, MPI2_POINTER pMpi2IOCInitRequest_t; ++ ++/* WhoInit values */ ++#define MPI2_WHOINIT_NOT_INITIALIZED (0x00) ++#define MPI2_WHOINIT_SYSTEM_BIOS (0x01) ++#define MPI2_WHOINIT_ROM_BIOS (0x02) ++#define MPI2_WHOINIT_PCI_PEER (0x03) ++#define MPI2_WHOINIT_HOST_DRIVER (0x04) ++#define MPI2_WHOINIT_MANUFACTURER (0x05) ++ ++/* MsgVersion */ ++#define MPI2_IOCINIT_MSGVERSION_MAJOR_MASK (0xFF00) ++#define MPI2_IOCINIT_MSGVERSION_MAJOR_SHIFT (8) ++#define MPI2_IOCINIT_MSGVERSION_MINOR_MASK (0x00FF) ++#define MPI2_IOCINIT_MSGVERSION_MINOR_SHIFT (0) ++ ++/* HeaderVersion */ ++#define MPI2_IOCINIT_HDRVERSION_UNIT_MASK (0xFF00) ++#define MPI2_IOCINIT_HDRVERSION_UNIT_SHIFT (8) ++#define MPI2_IOCINIT_HDRVERSION_DEV_MASK (0x00FF) ++#define MPI2_IOCINIT_HDRVERSION_DEV_SHIFT (0) ++ ++/* minimum depth for the Reply Descriptor Post Queue */ ++#define MPI2_RDPQ_DEPTH_MIN (16) ++ ++ ++/* IOCInit Reply message */ ++typedef struct _MPI2_IOC_INIT_REPLY ++{ ++ U8 WhoInit; /* 0x00 */ ++ U8 Reserved1; /* 0x01 */ ++ U8 MsgLength; /* 0x02 */ ++ U8 Function; /* 0x03 */ ++ U16 Reserved2; /* 0x04 */ ++ U8 Reserved3; /* 0x06 */ ++ U8 MsgFlags; /* 0x07 */ ++ U8 VP_ID; /* 0x08 */ ++ U8 VF_ID; /* 0x09 */ ++ U16 Reserved4; /* 0x0A */ ++ U16 Reserved5; /* 0x0C */ ++ U16 IOCStatus; /* 0x0E */ ++ U32 IOCLogInfo; /* 0x10 */ ++} MPI2_IOC_INIT_REPLY, MPI2_POINTER PTR_MPI2_IOC_INIT_REPLY, ++ Mpi2IOCInitReply_t, MPI2_POINTER pMpi2IOCInitReply_t; ++ ++ ++/**************************************************************************** ++* IOCFacts message ++****************************************************************************/ ++ ++/* IOCFacts Request message */ ++typedef struct _MPI2_IOC_FACTS_REQUEST ++{ ++ U16 Reserved1; /* 0x00 */ ++ U8 ChainOffset; /* 0x02 */ ++ U8 Function; /* 0x03 */ ++ U16 Reserved2; /* 0x04 */ ++ U8 Reserved3; /* 0x06 */ ++ U8 MsgFlags; /* 0x07 */ ++ U8 VP_ID; /* 0x08 */ ++ U8 VF_ID; /* 0x09 */ ++ U16 Reserved4; /* 0x0A */ ++} MPI2_IOC_FACTS_REQUEST, MPI2_POINTER PTR_MPI2_IOC_FACTS_REQUEST, ++ Mpi2IOCFactsRequest_t, MPI2_POINTER pMpi2IOCFactsRequest_t; ++ ++ ++/* IOCFacts Reply message */ ++typedef struct _MPI2_IOC_FACTS_REPLY ++{ ++ U16 MsgVersion; /* 0x00 */ ++ U8 MsgLength; /* 0x02 */ ++ U8 Function; /* 0x03 */ ++ U16 HeaderVersion; /* 0x04 */ ++ U8 IOCNumber; /* 0x06 */ ++ U8 MsgFlags; /* 0x07 */ ++ U8 VP_ID; /* 0x08 */ ++ U8 VF_ID; /* 0x09 */ ++ U16 Reserved1; /* 0x0A */ ++ U16 IOCExceptions; /* 0x0C */ ++ U16 IOCStatus; /* 0x0E */ ++ U32 IOCLogInfo; /* 0x10 */ ++ U8 MaxChainDepth; /* 0x14 */ ++ U8 WhoInit; /* 0x15 */ ++ U8 NumberOfPorts; /* 0x16 */ ++ U8 Reserved2; /* 0x17 */ ++ U16 RequestCredit; /* 0x18 */ ++ U16 ProductID; /* 0x1A */ ++ U32 IOCCapabilities; /* 0x1C */ ++ MPI2_VERSION_UNION FWVersion; /* 0x20 */ ++ U16 IOCRequestFrameSize; /* 0x24 */ ++ U16 Reserved3; /* 0x26 */ ++ U16 MaxInitiators; /* 0x28 */ ++ U16 MaxTargets; /* 0x2A */ ++ U16 MaxSasExpanders; /* 0x2C */ ++ U16 MaxEnclosures; /* 0x2E */ ++ U16 ProtocolFlags; /* 0x30 */ ++ U16 HighPriorityCredit; /* 0x32 */ ++ U16 MaxReplyDescriptorPostQueueDepth; /* 0x34 */ ++ U8 ReplyFrameSize; /* 0x36 */ ++ U8 MaxVolumes; /* 0x37 */ ++ U16 MaxDevHandle; /* 0x38 */ ++ U16 MaxPersistentEntries; /* 0x3A */ ++ U32 Reserved4; /* 0x3C */ ++} MPI2_IOC_FACTS_REPLY, MPI2_POINTER PTR_MPI2_IOC_FACTS_REPLY, ++ Mpi2IOCFactsReply_t, MPI2_POINTER pMpi2IOCFactsReply_t; ++ ++/* MsgVersion */ ++#define MPI2_IOCFACTS_MSGVERSION_MAJOR_MASK (0xFF00) ++#define MPI2_IOCFACTS_MSGVERSION_MAJOR_SHIFT (8) ++#define MPI2_IOCFACTS_MSGVERSION_MINOR_MASK (0x00FF) ++#define MPI2_IOCFACTS_MSGVERSION_MINOR_SHIFT (0) ++ ++/* HeaderVersion */ ++#define MPI2_IOCFACTS_HDRVERSION_UNIT_MASK (0xFF00) ++#define MPI2_IOCFACTS_HDRVERSION_UNIT_SHIFT (8) ++#define MPI2_IOCFACTS_HDRVERSION_DEV_MASK (0x00FF) ++#define MPI2_IOCFACTS_HDRVERSION_DEV_SHIFT (0) ++ ++/* IOCExceptions */ ++#define MPI2_IOCFACTS_EXCEPT_IR_FOREIGN_CONFIG_MAX (0x0100) ++ ++#define MPI2_IOCFACTS_EXCEPT_BOOTSTAT_MASK (0x00E0) ++#define MPI2_IOCFACTS_EXCEPT_BOOTSTAT_GOOD (0x0000) ++#define MPI2_IOCFACTS_EXCEPT_BOOTSTAT_BACKUP (0x0020) ++#define MPI2_IOCFACTS_EXCEPT_BOOTSTAT_RESTORED (0x0040) ++#define MPI2_IOCFACTS_EXCEPT_BOOTSTAT_CORRUPT_BACKUP (0x0060) ++ ++#define MPI2_IOCFACTS_EXCEPT_METADATA_UNSUPPORTED (0x0010) ++#define MPI2_IOCFACTS_EXCEPT_MANUFACT_CHECKSUM_FAIL (0x0008) ++#define MPI2_IOCFACTS_EXCEPT_FW_CHECKSUM_FAIL (0x0004) ++#define MPI2_IOCFACTS_EXCEPT_RAID_CONFIG_INVALID (0x0002) ++#define MPI2_IOCFACTS_EXCEPT_CONFIG_CHECKSUM_FAIL (0x0001) ++ ++/* defines for WhoInit field are after the IOCInit Request */ ++ ++/* ProductID field uses MPI2_FW_HEADER_PID_ */ ++ ++/* IOCCapabilities */ ++#define MPI2_IOCFACTS_CAPABILITY_EVENT_REPLAY (0x00002000) ++#define MPI2_IOCFACTS_CAPABILITY_INTEGRATED_RAID (0x00001000) ++#define MPI2_IOCFACTS_CAPABILITY_TLR (0x00000800) ++#define MPI2_IOCFACTS_CAPABILITY_MULTICAST (0x00000100) ++#define MPI2_IOCFACTS_CAPABILITY_BIDIRECTIONAL_TARGET (0x00000080) ++#define MPI2_IOCFACTS_CAPABILITY_EEDP (0x00000040) ++#define MPI2_IOCFACTS_CAPABILITY_SNAPSHOT_BUFFER (0x00000010) ++#define MPI2_IOCFACTS_CAPABILITY_DIAG_TRACE_BUFFER (0x00000008) ++#define MPI2_IOCFACTS_CAPABILITY_TASK_SET_FULL_HANDLING (0x00000004) ++ ++/* ProtocolFlags */ ++#define MPI2_IOCFACTS_PROTOCOL_SCSI_TARGET (0x0001) ++#define MPI2_IOCFACTS_PROTOCOL_SCSI_INITIATOR (0x0002) ++ ++ ++/**************************************************************************** ++* PortFacts message ++****************************************************************************/ ++ ++/* PortFacts Request message */ ++typedef struct _MPI2_PORT_FACTS_REQUEST ++{ ++ U16 Reserved1; /* 0x00 */ ++ U8 ChainOffset; /* 0x02 */ ++ U8 Function; /* 0x03 */ ++ U16 Reserved2; /* 0x04 */ ++ U8 PortNumber; /* 0x06 */ ++ U8 MsgFlags; /* 0x07 */ ++ U8 VP_ID; /* 0x08 */ ++ U8 VF_ID; /* 0x09 */ ++ U16 Reserved3; /* 0x0A */ ++} MPI2_PORT_FACTS_REQUEST, MPI2_POINTER PTR_MPI2_PORT_FACTS_REQUEST, ++ Mpi2PortFactsRequest_t, MPI2_POINTER pMpi2PortFactsRequest_t; ++ ++/* PortFacts Reply message */ ++typedef struct _MPI2_PORT_FACTS_REPLY ++{ ++ U16 Reserved1; /* 0x00 */ ++ U8 MsgLength; /* 0x02 */ ++ U8 Function; /* 0x03 */ ++ U16 Reserved2; /* 0x04 */ ++ U8 PortNumber; /* 0x06 */ ++ U8 MsgFlags; /* 0x07 */ ++ U8 VP_ID; /* 0x08 */ ++ U8 VF_ID; /* 0x09 */ ++ U16 Reserved3; /* 0x0A */ ++ U16 Reserved4; /* 0x0C */ ++ U16 IOCStatus; /* 0x0E */ ++ U32 IOCLogInfo; /* 0x10 */ ++ U8 Reserved5; /* 0x14 */ ++ U8 PortType; /* 0x15 */ ++ U16 Reserved6; /* 0x16 */ ++ U16 MaxPostedCmdBuffers; /* 0x18 */ ++ U16 Reserved7; /* 0x1A */ ++} MPI2_PORT_FACTS_REPLY, MPI2_POINTER PTR_MPI2_PORT_FACTS_REPLY, ++ Mpi2PortFactsReply_t, MPI2_POINTER pMpi2PortFactsReply_t; ++ ++/* PortType values */ ++#define MPI2_PORTFACTS_PORTTYPE_INACTIVE (0x00) ++#define MPI2_PORTFACTS_PORTTYPE_FC (0x10) ++#define MPI2_PORTFACTS_PORTTYPE_ISCSI (0x20) ++#define MPI2_PORTFACTS_PORTTYPE_SAS_PHYSICAL (0x30) ++#define MPI2_PORTFACTS_PORTTYPE_SAS_VIRTUAL (0x31) ++ ++ ++/**************************************************************************** ++* PortEnable message ++****************************************************************************/ ++ ++/* PortEnable Request message */ ++typedef struct _MPI2_PORT_ENABLE_REQUEST ++{ ++ U16 Reserved1; /* 0x00 */ ++ U8 ChainOffset; /* 0x02 */ ++ U8 Function; /* 0x03 */ ++ U8 Reserved2; /* 0x04 */ ++ U8 PortFlags; /* 0x05 */ ++ U8 Reserved3; /* 0x06 */ ++ U8 MsgFlags; /* 0x07 */ ++ U8 VP_ID; /* 0x08 */ ++ U8 VF_ID; /* 0x09 */ ++ U16 Reserved4; /* 0x0A */ ++} MPI2_PORT_ENABLE_REQUEST, MPI2_POINTER PTR_MPI2_PORT_ENABLE_REQUEST, ++ Mpi2PortEnableRequest_t, MPI2_POINTER pMpi2PortEnableRequest_t; ++ ++ ++/* PortEnable Reply message */ ++typedef struct _MPI2_PORT_ENABLE_REPLY ++{ ++ U16 Reserved1; /* 0x00 */ ++ U8 MsgLength; /* 0x02 */ ++ U8 Function; /* 0x03 */ ++ U8 Reserved2; /* 0x04 */ ++ U8 PortFlags; /* 0x05 */ ++ U8 Reserved3; /* 0x06 */ ++ U8 MsgFlags; /* 0x07 */ ++ U8 VP_ID; /* 0x08 */ ++ U8 VF_ID; /* 0x09 */ ++ U16 Reserved4; /* 0x0A */ ++ U16 Reserved5; /* 0x0C */ ++ U16 IOCStatus; /* 0x0E */ ++ U32 IOCLogInfo; /* 0x10 */ ++} MPI2_PORT_ENABLE_REPLY, MPI2_POINTER PTR_MPI2_PORT_ENABLE_REPLY, ++ Mpi2PortEnableReply_t, MPI2_POINTER pMpi2PortEnableReply_t; ++ ++ ++/**************************************************************************** ++* EventNotification message ++****************************************************************************/ ++ ++/* EventNotification Request message */ ++#define MPI2_EVENT_NOTIFY_EVENTMASK_WORDS (4) ++ ++typedef struct _MPI2_EVENT_NOTIFICATION_REQUEST ++{ ++ U16 Reserved1; /* 0x00 */ ++ U8 ChainOffset; /* 0x02 */ ++ U8 Function; /* 0x03 */ ++ U16 Reserved2; /* 0x04 */ ++ U8 Reserved3; /* 0x06 */ ++ U8 MsgFlags; /* 0x07 */ ++ U8 VP_ID; /* 0x08 */ ++ U8 VF_ID; /* 0x09 */ ++ U16 Reserved4; /* 0x0A */ ++ U32 Reserved5; /* 0x0C */ ++ U32 Reserved6; /* 0x10 */ ++ U32 EventMasks[MPI2_EVENT_NOTIFY_EVENTMASK_WORDS];/* 0x14 */ ++ U16 SASBroadcastPrimitiveMasks; /* 0x24 */ ++ U16 Reserved7; /* 0x26 */ ++ U32 Reserved8; /* 0x28 */ ++} MPI2_EVENT_NOTIFICATION_REQUEST, ++ MPI2_POINTER PTR_MPI2_EVENT_NOTIFICATION_REQUEST, ++ Mpi2EventNotificationRequest_t, MPI2_POINTER pMpi2EventNotificationRequest_t; ++ ++ ++/* EventNotification Reply message */ ++typedef struct _MPI2_EVENT_NOTIFICATION_REPLY ++{ ++ U16 EventDataLength; /* 0x00 */ ++ U8 MsgLength; /* 0x02 */ ++ U8 Function; /* 0x03 */ ++ U16 Reserved1; /* 0x04 */ ++ U8 AckRequired; /* 0x06 */ ++ U8 MsgFlags; /* 0x07 */ ++ U8 VP_ID; /* 0x08 */ ++ U8 VF_ID; /* 0x09 */ ++ U16 Reserved2; /* 0x0A */ ++ U16 Reserved3; /* 0x0C */ ++ U16 IOCStatus; /* 0x0E */ ++ U32 IOCLogInfo; /* 0x10 */ ++ U16 Event; /* 0x14 */ ++ U16 Reserved4; /* 0x16 */ ++ U32 EventContext; /* 0x18 */ ++ U32 EventData[1]; /* 0x1C */ ++} MPI2_EVENT_NOTIFICATION_REPLY, MPI2_POINTER PTR_MPI2_EVENT_NOTIFICATION_REPLY, ++ Mpi2EventNotificationReply_t, MPI2_POINTER pMpi2EventNotificationReply_t; ++ ++/* AckRequired */ ++#define MPI2_EVENT_NOTIFICATION_ACK_NOT_REQUIRED (0x00) ++#define MPI2_EVENT_NOTIFICATION_ACK_REQUIRED (0x01) ++ ++/* Event */ ++#define MPI2_EVENT_LOG_DATA (0x0001) ++#define MPI2_EVENT_STATE_CHANGE (0x0002) ++#define MPI2_EVENT_HARD_RESET_RECEIVED (0x0005) ++#define MPI2_EVENT_EVENT_CHANGE (0x000A) ++#define MPI2_EVENT_TASK_SET_FULL (0x000E) ++#define MPI2_EVENT_SAS_DEVICE_STATUS_CHANGE (0x000F) ++#define MPI2_EVENT_IR_OPERATION_STATUS (0x0014) ++#define MPI2_EVENT_SAS_DISCOVERY (0x0016) ++#define MPI2_EVENT_SAS_BROADCAST_PRIMITIVE (0x0017) ++#define MPI2_EVENT_SAS_INIT_DEVICE_STATUS_CHANGE (0x0018) ++#define MPI2_EVENT_SAS_INIT_TABLE_OVERFLOW (0x0019) ++#define MPI2_EVENT_SAS_TOPOLOGY_CHANGE_LIST (0x001C) ++#define MPI2_EVENT_SAS_ENCL_DEVICE_STATUS_CHANGE (0x001D) ++#define MPI2_EVENT_IR_VOLUME (0x001E) ++#define MPI2_EVENT_IR_PHYSICAL_DISK (0x001F) ++#define MPI2_EVENT_IR_CONFIGURATION_CHANGE_LIST (0x0020) ++#define MPI2_EVENT_LOG_ENTRY_ADDED (0x0021) ++ ++ ++/* Log Entry Added Event data */ ++ ++/* the following structure matches MPI2_LOG_0_ENTRY in mpi2_cnfg.h */ ++#define MPI2_EVENT_DATA_LOG_DATA_LENGTH (0x1C) ++ ++typedef struct _MPI2_EVENT_DATA_LOG_ENTRY_ADDED ++{ ++ U64 TimeStamp; /* 0x00 */ ++ U32 Reserved1; /* 0x08 */ ++ U16 LogSequence; /* 0x0C */ ++ U16 LogEntryQualifier; /* 0x0E */ ++ U8 VP_ID; /* 0x10 */ ++ U8 VF_ID; /* 0x11 */ ++ U16 Reserved2; /* 0x12 */ ++ U8 LogData[MPI2_EVENT_DATA_LOG_DATA_LENGTH];/* 0x14 */ ++} MPI2_EVENT_DATA_LOG_ENTRY_ADDED, ++ MPI2_POINTER PTR_MPI2_EVENT_DATA_LOG_ENTRY_ADDED, ++ Mpi2EventDataLogEntryAdded_t, MPI2_POINTER pMpi2EventDataLogEntryAdded_t; ++ ++/* Hard Reset Received Event data */ ++ ++typedef struct _MPI2_EVENT_DATA_HARD_RESET_RECEIVED ++{ ++ U8 Reserved1; /* 0x00 */ ++ U8 Port; /* 0x01 */ ++ U16 Reserved2; /* 0x02 */ ++} MPI2_EVENT_DATA_HARD_RESET_RECEIVED, ++ MPI2_POINTER PTR_MPI2_EVENT_DATA_HARD_RESET_RECEIVED, ++ Mpi2EventDataHardResetReceived_t, ++ MPI2_POINTER pMpi2EventDataHardResetReceived_t; ++ ++/* Task Set Full Event data */ ++ ++typedef struct _MPI2_EVENT_DATA_TASK_SET_FULL ++{ ++ U16 DevHandle; /* 0x00 */ ++ U16 CurrentDepth; /* 0x02 */ ++} MPI2_EVENT_DATA_TASK_SET_FULL, MPI2_POINTER PTR_MPI2_EVENT_DATA_TASK_SET_FULL, ++ Mpi2EventDataTaskSetFull_t, MPI2_POINTER pMpi2EventDataTaskSetFull_t; ++ ++ ++/* SAS Device Status Change Event data */ ++ ++typedef struct _MPI2_EVENT_DATA_SAS_DEVICE_STATUS_CHANGE ++{ ++ U16 TaskTag; /* 0x00 */ ++ U8 ReasonCode; /* 0x02 */ ++ U8 Reserved1; /* 0x03 */ ++ U8 ASC; /* 0x04 */ ++ U8 ASCQ; /* 0x05 */ ++ U16 DevHandle; /* 0x06 */ ++ U32 Reserved2; /* 0x08 */ ++ U64 SASAddress; /* 0x0C */ ++ U8 LUN[8]; /* 0x14 */ ++} MPI2_EVENT_DATA_SAS_DEVICE_STATUS_CHANGE, ++ MPI2_POINTER PTR_MPI2_EVENT_DATA_SAS_DEVICE_STATUS_CHANGE, ++ Mpi2EventDataSasDeviceStatusChange_t, ++ MPI2_POINTER pMpi2EventDataSasDeviceStatusChange_t; ++ ++/* SAS Device Status Change Event data ReasonCode values */ ++#define MPI2_EVENT_SAS_DEV_STAT_RC_SMART_DATA (0x05) ++#define MPI2_EVENT_SAS_DEV_STAT_RC_UNSUPPORTED (0x07) ++#define MPI2_EVENT_SAS_DEV_STAT_RC_INTERNAL_DEVICE_RESET (0x08) ++#define MPI2_EVENT_SAS_DEV_STAT_RC_TASK_ABORT_INTERNAL (0x09) ++#define MPI2_EVENT_SAS_DEV_STAT_RC_ABORT_TASK_SET_INTERNAL (0x0A) ++#define MPI2_EVENT_SAS_DEV_STAT_RC_CLEAR_TASK_SET_INTERNAL (0x0B) ++#define MPI2_EVENT_SAS_DEV_STAT_RC_QUERY_TASK_INTERNAL (0x0C) ++#define MPI2_EVENT_SAS_DEV_STAT_RC_ASYNC_NOTIFICATION (0x0D) ++#define MPI2_EVENT_SAS_DEV_STAT_RC_CMP_INTERNAL_DEV_RESET (0x0E) ++#define MPI2_EVENT_SAS_DEV_STAT_RC_CMP_TASK_ABORT_INTERNAL (0x0F) ++#define MPI2_EVENT_SAS_DEV_STAT_RC_SATA_INIT_FAILURE (0x10) ++ ++ ++/* Integrated RAID Operation Status Event data */ ++ ++typedef struct _MPI2_EVENT_DATA_IR_OPERATION_STATUS ++{ ++ U16 VolDevHandle; /* 0x00 */ ++ U16 Reserved1; /* 0x02 */ ++ U8 RAIDOperation; /* 0x04 */ ++ U8 PercentComplete; /* 0x05 */ ++ U16 Reserved2; /* 0x06 */ ++ U32 Resereved3; /* 0x08 */ ++} MPI2_EVENT_DATA_IR_OPERATION_STATUS, ++ MPI2_POINTER PTR_MPI2_EVENT_DATA_IR_OPERATION_STATUS, ++ Mpi2EventDataIrOperationStatus_t, ++ MPI2_POINTER pMpi2EventDataIrOperationStatus_t; ++ ++/* Integrated RAID Operation Status Event data RAIDOperation values */ ++#define MPI2_EVENT_IR_RAIDOP_RESYNC (0x00) ++#define MPI2_EVENT_IR_RAIDOP_ONLINE_CAP_EXPANSION (0x01) ++#define MPI2_EVENT_IR_RAIDOP_CONSISTENCY_CHECK (0x02) ++#define MPI2_EVENT_IR_RAIDOP_BACKGROUND_INIT (0x03) ++#define MPI2_EVENT_IR_RAIDOP_MAKE_DATA_CONSISTENT (0x04) ++ ++ ++/* Integrated RAID Volume Event data */ ++ ++typedef struct _MPI2_EVENT_DATA_IR_VOLUME ++{ ++ U16 VolDevHandle; /* 0x00 */ ++ U8 ReasonCode; /* 0x02 */ ++ U8 Reserved1; /* 0x03 */ ++ U32 NewValue; /* 0x04 */ ++ U32 PreviousValue; /* 0x08 */ ++} MPI2_EVENT_DATA_IR_VOLUME, MPI2_POINTER PTR_MPI2_EVENT_DATA_IR_VOLUME, ++ Mpi2EventDataIrVolume_t, MPI2_POINTER pMpi2EventDataIrVolume_t; ++ ++/* Integrated RAID Volume Event data ReasonCode values */ ++#define MPI2_EVENT_IR_VOLUME_RC_SETTINGS_CHANGED (0x01) ++#define MPI2_EVENT_IR_VOLUME_RC_STATUS_FLAGS_CHANGED (0x02) ++#define MPI2_EVENT_IR_VOLUME_RC_STATE_CHANGED (0x03) ++ ++ ++/* Integrated RAID Physical Disk Event data */ ++ ++typedef struct _MPI2_EVENT_DATA_IR_PHYSICAL_DISK ++{ ++ U16 Reserved1; /* 0x00 */ ++ U8 ReasonCode; /* 0x02 */ ++ U8 PhysDiskNum; /* 0x03 */ ++ U16 PhysDiskDevHandle; /* 0x04 */ ++ U16 Reserved2; /* 0x06 */ ++ U16 Slot; /* 0x08 */ ++ U16 EnclosureHandle; /* 0x0A */ ++ U32 NewValue; /* 0x0C */ ++ U32 PreviousValue; /* 0x10 */ ++} MPI2_EVENT_DATA_IR_PHYSICAL_DISK, ++ MPI2_POINTER PTR_MPI2_EVENT_DATA_IR_PHYSICAL_DISK, ++ Mpi2EventDataIrPhysicalDisk_t, MPI2_POINTER pMpi2EventDataIrPhysicalDisk_t; ++ ++/* Integrated RAID Physical Disk Event data ReasonCode values */ ++#define MPI2_EVENT_IR_PHYSDISK_RC_SETTINGS_CHANGED (0x01) ++#define MPI2_EVENT_IR_PHYSDISK_RC_STATUS_FLAGS_CHANGED (0x02) ++#define MPI2_EVENT_IR_PHYSDISK_RC_STATE_CHANGED (0x03) ++ ++ ++/* Integrated RAID Configuration Change List Event data */ ++ ++/* ++ * Host code (drivers, BIOS, utilities, etc.) should leave this define set to ++ * one and check NumElements at runtime. ++ */ ++#ifndef MPI2_EVENT_IR_CONFIG_ELEMENT_COUNT ++#define MPI2_EVENT_IR_CONFIG_ELEMENT_COUNT (1) ++#endif ++ ++typedef struct _MPI2_EVENT_IR_CONFIG_ELEMENT ++{ ++ U16 ElementFlags; /* 0x00 */ ++ U16 VolDevHandle; /* 0x02 */ ++ U8 ReasonCode; /* 0x04 */ ++ U8 PhysDiskNum; /* 0x05 */ ++ U16 PhysDiskDevHandle; /* 0x06 */ ++} MPI2_EVENT_IR_CONFIG_ELEMENT, MPI2_POINTER PTR_MPI2_EVENT_IR_CONFIG_ELEMENT, ++ Mpi2EventIrConfigElement_t, MPI2_POINTER pMpi2EventIrConfigElement_t; ++ ++/* IR Configuration Change List Event data ElementFlags values */ ++#define MPI2_EVENT_IR_CHANGE_EFLAGS_ELEMENT_TYPE_MASK (0x000F) ++#define MPI2_EVENT_IR_CHANGE_EFLAGS_VOLUME_ELEMENT (0x0000) ++#define MPI2_EVENT_IR_CHANGE_EFLAGS_VOLPHYSDISK_ELEMENT (0x0001) ++#define MPI2_EVENT_IR_CHANGE_EFLAGS_HOTSPARE_ELEMENT (0x0002) ++ ++/* IR Configuration Change List Event data ReasonCode values */ ++#define MPI2_EVENT_IR_CHANGE_RC_ADDED (0x01) ++#define MPI2_EVENT_IR_CHANGE_RC_REMOVED (0x02) ++#define MPI2_EVENT_IR_CHANGE_RC_NO_CHANGE (0x03) ++#define MPI2_EVENT_IR_CHANGE_RC_HIDE (0x04) ++#define MPI2_EVENT_IR_CHANGE_RC_UNHIDE (0x05) ++#define MPI2_EVENT_IR_CHANGE_RC_VOLUME_CREATED (0x06) ++#define MPI2_EVENT_IR_CHANGE_RC_VOLUME_DELETED (0x07) ++#define MPI2_EVENT_IR_CHANGE_RC_PD_CREATED (0x08) ++#define MPI2_EVENT_IR_CHANGE_RC_PD_DELETED (0x09) ++ ++typedef struct _MPI2_EVENT_DATA_IR_CONFIG_CHANGE_LIST ++{ ++ U8 NumElements; /* 0x00 */ ++ U8 Reserved1; /* 0x01 */ ++ U8 Reserved2; /* 0x02 */ ++ U8 ConfigNum; /* 0x03 */ ++ U32 Flags; /* 0x04 */ ++ MPI2_EVENT_IR_CONFIG_ELEMENT ConfigElement[MPI2_EVENT_IR_CONFIG_ELEMENT_COUNT]; /* 0x08 */ ++} MPI2_EVENT_DATA_IR_CONFIG_CHANGE_LIST, ++ MPI2_POINTER PTR_MPI2_EVENT_DATA_IR_CONFIG_CHANGE_LIST, ++ Mpi2EventDataIrConfigChangeList_t, ++ MPI2_POINTER pMpi2EventDataIrConfigChangeList_t; ++ ++/* IR Configuration Change List Event data Flags values */ ++#define MPI2_EVENT_IR_CHANGE_FLAGS_FOREIGN_CONFIG (0x00000001) ++ ++ ++/* SAS Discovery Event data */ ++ ++typedef struct _MPI2_EVENT_DATA_SAS_DISCOVERY ++{ ++ U8 Flags; /* 0x00 */ ++ U8 ReasonCode; /* 0x01 */ ++ U8 PhysicalPort; /* 0x02 */ ++ U8 Reserved1; /* 0x03 */ ++ U32 DiscoveryStatus; /* 0x04 */ ++} MPI2_EVENT_DATA_SAS_DISCOVERY, ++ MPI2_POINTER PTR_MPI2_EVENT_DATA_SAS_DISCOVERY, ++ Mpi2EventDataSasDiscovery_t, MPI2_POINTER pMpi2EventDataSasDiscovery_t; ++ ++/* SAS Discovery Event data Flags values */ ++#define MPI2_EVENT_SAS_DISC_DEVICE_CHANGE (0x02) ++#define MPI2_EVENT_SAS_DISC_IN_PROGRESS (0x01) ++ ++/* SAS Discovery Event data ReasonCode values */ ++#define MPI2_EVENT_SAS_DISC_RC_STARTED (0x01) ++#define MPI2_EVENT_SAS_DISC_RC_COMPLETED (0x02) ++ ++/* SAS Discovery Event data DiscoveryStatus values */ ++#define MPI2_EVENT_SAS_DISC_DS_MAX_ENCLOSURES_EXCEED (0x80000000) ++#define MPI2_EVENT_SAS_DISC_DS_MAX_EXPANDERS_EXCEED (0x40000000) ++#define MPI2_EVENT_SAS_DISC_DS_MAX_DEVICES_EXCEED (0x20000000) ++#define MPI2_EVENT_SAS_DISC_DS_MAX_TOPO_PHYS_EXCEED (0x10000000) ++#define MPI2_EVENT_SAS_DISC_DS_DOWNSTREAM_INITIATOR (0x08000000) ++#define MPI2_EVENT_SAS_DISC_DS_MULTI_SUBTRACTIVE_SUBTRACTIVE (0x00008000) ++#define MPI2_EVENT_SAS_DISC_DS_EXP_MULTI_SUBTRACTIVE (0x00004000) ++#define MPI2_EVENT_SAS_DISC_DS_MULTI_PORT_DOMAIN (0x00002000) ++#define MPI2_EVENT_SAS_DISC_DS_TABLE_TO_SUBTRACTIVE_LINK (0x00001000) ++#define MPI2_EVENT_SAS_DISC_DS_UNSUPPORTED_DEVICE (0x00000800) ++#define MPI2_EVENT_SAS_DISC_DS_TABLE_LINK (0x00000400) ++#define MPI2_EVENT_SAS_DISC_DS_SUBTRACTIVE_LINK (0x00000200) ++#define MPI2_EVENT_SAS_DISC_DS_SMP_CRC_ERROR (0x00000100) ++#define MPI2_EVENT_SAS_DISC_DS_SMP_FUNCTION_FAILED (0x00000080) ++#define MPI2_EVENT_SAS_DISC_DS_INDEX_NOT_EXIST (0x00000040) ++#define MPI2_EVENT_SAS_DISC_DS_OUT_ROUTE_ENTRIES (0x00000020) ++#define MPI2_EVENT_SAS_DISC_DS_SMP_TIMEOUT (0x00000010) ++#define MPI2_EVENT_SAS_DISC_DS_MULTIPLE_PORTS (0x00000004) ++#define MPI2_EVENT_SAS_DISC_DS_UNADDRESSABLE_DEVICE (0x00000002) ++#define MPI2_EVENT_SAS_DISC_DS_LOOP_DETECTED (0x00000001) ++ ++ ++/* SAS Broadcast Primitive Event data */ ++ ++typedef struct _MPI2_EVENT_DATA_SAS_BROADCAST_PRIMITIVE ++{ ++ U8 PhyNum; /* 0x00 */ ++ U8 Port; /* 0x01 */ ++ U8 PortWidth; /* 0x02 */ ++ U8 Primitive; /* 0x03 */ ++} MPI2_EVENT_DATA_SAS_BROADCAST_PRIMITIVE, ++ MPI2_POINTER PTR_MPI2_EVENT_DATA_SAS_BROADCAST_PRIMITIVE, ++ Mpi2EventDataSasBroadcastPrimitive_t, ++ MPI2_POINTER pMpi2EventDataSasBroadcastPrimitive_t; ++ ++/* defines for the Primitive field */ ++#define MPI2_EVENT_PRIMITIVE_CHANGE (0x01) ++#define MPI2_EVENT_PRIMITIVE_SES (0x02) ++#define MPI2_EVENT_PRIMITIVE_EXPANDER (0x03) ++#define MPI2_EVENT_PRIMITIVE_ASYNCHRONOUS_EVENT (0x04) ++#define MPI2_EVENT_PRIMITIVE_RESERVED3 (0x05) ++#define MPI2_EVENT_PRIMITIVE_RESERVED4 (0x06) ++#define MPI2_EVENT_PRIMITIVE_CHANGE0_RESERVED (0x07) ++#define MPI2_EVENT_PRIMITIVE_CHANGE1_RESERVED (0x08) ++ ++ ++/* SAS Initiator Device Status Change Event data */ ++ ++typedef struct _MPI2_EVENT_DATA_SAS_INIT_DEV_STATUS_CHANGE ++{ ++ U8 ReasonCode; /* 0x00 */ ++ U8 PhysicalPort; /* 0x01 */ ++ U16 DevHandle; /* 0x02 */ ++ U64 SASAddress; /* 0x04 */ ++} MPI2_EVENT_DATA_SAS_INIT_DEV_STATUS_CHANGE, ++ MPI2_POINTER PTR_MPI2_EVENT_DATA_SAS_INIT_DEV_STATUS_CHANGE, ++ Mpi2EventDataSasInitDevStatusChange_t, ++ MPI2_POINTER pMpi2EventDataSasInitDevStatusChange_t; ++ ++/* SAS Initiator Device Status Change event ReasonCode values */ ++#define MPI2_EVENT_SAS_INIT_RC_ADDED (0x01) ++#define MPI2_EVENT_SAS_INIT_RC_NOT_RESPONDING (0x02) ++ ++ ++/* SAS Initiator Device Table Overflow Event data */ ++ ++typedef struct _MPI2_EVENT_DATA_SAS_INIT_TABLE_OVERFLOW ++{ ++ U16 MaxInit; /* 0x00 */ ++ U16 CurrentInit; /* 0x02 */ ++ U64 SASAddress; /* 0x04 */ ++} MPI2_EVENT_DATA_SAS_INIT_TABLE_OVERFLOW, ++ MPI2_POINTER PTR_MPI2_EVENT_DATA_SAS_INIT_TABLE_OVERFLOW, ++ Mpi2EventDataSasInitTableOverflow_t, ++ MPI2_POINTER pMpi2EventDataSasInitTableOverflow_t; ++ ++ ++/* SAS Topology Change List Event data */ ++ ++/* ++ * Host code (drivers, BIOS, utilities, etc.) should leave this define set to ++ * one and check NumEntries at runtime. ++ */ ++#ifndef MPI2_EVENT_SAS_TOPO_PHY_COUNT ++#define MPI2_EVENT_SAS_TOPO_PHY_COUNT (1) ++#endif ++ ++typedef struct _MPI2_EVENT_SAS_TOPO_PHY_ENTRY ++{ ++ U16 AttachedDevHandle; /* 0x00 */ ++ U8 LinkRate; /* 0x02 */ ++ U8 PhyStatus; /* 0x03 */ ++} MPI2_EVENT_SAS_TOPO_PHY_ENTRY, MPI2_POINTER PTR_MPI2_EVENT_SAS_TOPO_PHY_ENTRY, ++ Mpi2EventSasTopoPhyEntry_t, MPI2_POINTER pMpi2EventSasTopoPhyEntry_t; ++ ++typedef struct _MPI2_EVENT_DATA_SAS_TOPOLOGY_CHANGE_LIST ++{ ++ U16 EnclosureHandle; /* 0x00 */ ++ U16 ExpanderDevHandle; /* 0x02 */ ++ U8 NumPhys; /* 0x04 */ ++ U8 Reserved1; /* 0x05 */ ++ U16 Reserved2; /* 0x06 */ ++ U8 NumEntries; /* 0x08 */ ++ U8 StartPhyNum; /* 0x09 */ ++ U8 ExpStatus; /* 0x0A */ ++ U8 PhysicalPort; /* 0x0B */ ++ MPI2_EVENT_SAS_TOPO_PHY_ENTRY PHY[MPI2_EVENT_SAS_TOPO_PHY_COUNT]; /* 0x0C*/ ++} MPI2_EVENT_DATA_SAS_TOPOLOGY_CHANGE_LIST, ++ MPI2_POINTER PTR_MPI2_EVENT_DATA_SAS_TOPOLOGY_CHANGE_LIST, ++ Mpi2EventDataSasTopologyChangeList_t, ++ MPI2_POINTER pMpi2EventDataSasTopologyChangeList_t; ++ ++/* values for the ExpStatus field */ ++#define MPI2_EVENT_SAS_TOPO_ES_ADDED (0x01) ++#define MPI2_EVENT_SAS_TOPO_ES_NOT_RESPONDING (0x02) ++#define MPI2_EVENT_SAS_TOPO_ES_RESPONDING (0x03) ++#define MPI2_EVENT_SAS_TOPO_ES_DELAY_NOT_RESPONDING (0x04) ++ ++/* defines for the LinkRate field */ ++#define MPI2_EVENT_SAS_TOPO_LR_CURRENT_MASK (0xF0) ++#define MPI2_EVENT_SAS_TOPO_LR_CURRENT_SHIFT (4) ++#define MPI2_EVENT_SAS_TOPO_LR_PREV_MASK (0x0F) ++#define MPI2_EVENT_SAS_TOPO_LR_PREV_SHIFT (0) ++ ++#define MPI2_EVENT_SAS_TOPO_LR_UNKNOWN_LINK_RATE (0x00) ++#define MPI2_EVENT_SAS_TOPO_LR_PHY_DISABLED (0x01) ++#define MPI2_EVENT_SAS_TOPO_LR_NEGOTIATION_FAILED (0x02) ++#define MPI2_EVENT_SAS_TOPO_LR_SATA_OOB_COMPLETE (0x03) ++#define MPI2_EVENT_SAS_TOPO_LR_PORT_SELECTOR (0x04) ++#define MPI2_EVENT_SAS_TOPO_LR_SMP_RESET_IN_PROGRESS (0x05) ++#define MPI2_EVENT_SAS_TOPO_LR_RATE_1_5 (0x08) ++#define MPI2_EVENT_SAS_TOPO_LR_RATE_3_0 (0x09) ++#define MPI2_EVENT_SAS_TOPO_LR_RATE_6_0 (0x0A) ++ ++/* values for the PhyStatus field */ ++#define MPI2_EVENT_SAS_TOPO_PHYSTATUS_VACANT (0x80) ++#define MPI2_EVENT_SAS_TOPO_PS_MULTIPLEX_CHANGE (0x10) ++/* values for the PhyStatus ReasonCode sub-field */ ++#define MPI2_EVENT_SAS_TOPO_RC_MASK (0x0F) ++#define MPI2_EVENT_SAS_TOPO_RC_TARG_ADDED (0x01) ++#define MPI2_EVENT_SAS_TOPO_RC_TARG_NOT_RESPONDING (0x02) ++#define MPI2_EVENT_SAS_TOPO_RC_PHY_CHANGED (0x03) ++#define MPI2_EVENT_SAS_TOPO_RC_NO_CHANGE (0x04) ++#define MPI2_EVENT_SAS_TOPO_RC_DELAY_NOT_RESPONDING (0x05) ++ ++ ++/* SAS Enclosure Device Status Change Event data */ ++ ++typedef struct _MPI2_EVENT_DATA_SAS_ENCL_DEV_STATUS_CHANGE ++{ ++ U16 EnclosureHandle; /* 0x00 */ ++ U8 ReasonCode; /* 0x02 */ ++ U8 PhysicalPort; /* 0x03 */ ++ U64 EnclosureLogicalID; /* 0x04 */ ++ U16 NumSlots; /* 0x0C */ ++ U16 StartSlot; /* 0x0E */ ++ U32 PhyBits; /* 0x10 */ ++} MPI2_EVENT_DATA_SAS_ENCL_DEV_STATUS_CHANGE, ++ MPI2_POINTER PTR_MPI2_EVENT_DATA_SAS_ENCL_DEV_STATUS_CHANGE, ++ Mpi2EventDataSasEnclDevStatusChange_t, ++ MPI2_POINTER pMpi2EventDataSasEnclDevStatusChange_t; ++ ++/* SAS Enclosure Device Status Change event ReasonCode values */ ++#define MPI2_EVENT_SAS_ENCL_RC_ADDED (0x01) ++#define MPI2_EVENT_SAS_ENCL_RC_NOT_RESPONDING (0x02) ++ ++ ++/**************************************************************************** ++* EventAck message ++****************************************************************************/ ++ ++/* EventAck Request message */ ++typedef struct _MPI2_EVENT_ACK_REQUEST ++{ ++ U16 Reserved1; /* 0x00 */ ++ U8 ChainOffset; /* 0x02 */ ++ U8 Function; /* 0x03 */ ++ U16 Reserved2; /* 0x04 */ ++ U8 Reserved3; /* 0x06 */ ++ U8 MsgFlags; /* 0x07 */ ++ U8 VP_ID; /* 0x08 */ ++ U8 VF_ID; /* 0x09 */ ++ U16 Reserved4; /* 0x0A */ ++ U16 Event; /* 0x0C */ ++ U16 Reserved5; /* 0x0E */ ++ U32 EventContext; /* 0x10 */ ++} MPI2_EVENT_ACK_REQUEST, MPI2_POINTER PTR_MPI2_EVENT_ACK_REQUEST, ++ Mpi2EventAckRequest_t, MPI2_POINTER pMpi2EventAckRequest_t; ++ ++ ++/* EventAck Reply message */ ++typedef struct _MPI2_EVENT_ACK_REPLY ++{ ++ U16 Reserved1; /* 0x00 */ ++ U8 MsgLength; /* 0x02 */ ++ U8 Function; /* 0x03 */ ++ U16 Reserved2; /* 0x04 */ ++ U8 Reserved3; /* 0x06 */ ++ U8 MsgFlags; /* 0x07 */ ++ U8 VP_ID; /* 0x08 */ ++ U8 VF_ID; /* 0x09 */ ++ U16 Reserved4; /* 0x0A */ ++ U16 Reserved5; /* 0x0C */ ++ U16 IOCStatus; /* 0x0E */ ++ U32 IOCLogInfo; /* 0x10 */ ++} MPI2_EVENT_ACK_REPLY, MPI2_POINTER PTR_MPI2_EVENT_ACK_REPLY, ++ Mpi2EventAckReply_t, MPI2_POINTER pMpi2EventAckReply_t; ++ ++ ++/**************************************************************************** ++* FWDownload message ++****************************************************************************/ ++ ++/* FWDownload Request message */ ++typedef struct _MPI2_FW_DOWNLOAD_REQUEST ++{ ++ U8 ImageType; /* 0x00 */ ++ U8 Reserved1; /* 0x01 */ ++ U8 ChainOffset; /* 0x02 */ ++ U8 Function; /* 0x03 */ ++ U16 Reserved2; /* 0x04 */ ++ U8 Reserved3; /* 0x06 */ ++ U8 MsgFlags; /* 0x07 */ ++ U8 VP_ID; /* 0x08 */ ++ U8 VF_ID; /* 0x09 */ ++ U16 Reserved4; /* 0x0A */ ++ U32 TotalImageSize; /* 0x0C */ ++ U32 Reserved5; /* 0x10 */ ++ MPI2_MPI_SGE_UNION SGL; /* 0x14 */ ++} MPI2_FW_DOWNLOAD_REQUEST, MPI2_POINTER PTR_MPI2_FW_DOWNLOAD_REQUEST, ++ Mpi2FWDownloadRequest, MPI2_POINTER pMpi2FWDownloadRequest; ++ ++#define MPI2_FW_DOWNLOAD_MSGFLGS_LAST_SEGMENT (0x01) ++ ++#define MPI2_FW_DOWNLOAD_ITYPE_FW (0x01) ++#define MPI2_FW_DOWNLOAD_ITYPE_BIOS (0x02) ++#define MPI2_FW_DOWNLOAD_ITYPE_MANUFACTURING (0x06) ++#define MPI2_FW_DOWNLOAD_ITYPE_CONFIG_1 (0x07) ++#define MPI2_FW_DOWNLOAD_ITYPE_CONFIG_2 (0x08) ++#define MPI2_FW_DOWNLOAD_ITYPE_MEGARAID (0x09) ++#define MPI2_FW_DOWNLOAD_ITYPE_COMMON_BOOT_BLOCK (0x0B) ++ ++/* FWDownload TransactionContext Element */ ++typedef struct _MPI2_FW_DOWNLOAD_TCSGE ++{ ++ U8 Reserved1; /* 0x00 */ ++ U8 ContextSize; /* 0x01 */ ++ U8 DetailsLength; /* 0x02 */ ++ U8 Flags; /* 0x03 */ ++ U32 Reserved2; /* 0x04 */ ++ U32 ImageOffset; /* 0x08 */ ++ U32 ImageSize; /* 0x0C */ ++} MPI2_FW_DOWNLOAD_TCSGE, MPI2_POINTER PTR_MPI2_FW_DOWNLOAD_TCSGE, ++ Mpi2FWDownloadTCSGE_t, MPI2_POINTER pMpi2FWDownloadTCSGE_t; ++ ++/* FWDownload Reply message */ ++typedef struct _MPI2_FW_DOWNLOAD_REPLY ++{ ++ U8 ImageType; /* 0x00 */ ++ U8 Reserved1; /* 0x01 */ ++ U8 MsgLength; /* 0x02 */ ++ U8 Function; /* 0x03 */ ++ U16 Reserved2; /* 0x04 */ ++ U8 Reserved3; /* 0x06 */ ++ U8 MsgFlags; /* 0x07 */ ++ U8 VP_ID; /* 0x08 */ ++ U8 VF_ID; /* 0x09 */ ++ U16 Reserved4; /* 0x0A */ ++ U16 Reserved5; /* 0x0C */ ++ U16 IOCStatus; /* 0x0E */ ++ U32 IOCLogInfo; /* 0x10 */ ++} MPI2_FW_DOWNLOAD_REPLY, MPI2_POINTER PTR_MPI2_FW_DOWNLOAD_REPLY, ++ Mpi2FWDownloadReply_t, MPI2_POINTER pMpi2FWDownloadReply_t; ++ ++ ++/**************************************************************************** ++* FWUpload message ++****************************************************************************/ ++ ++/* FWUpload Request message */ ++typedef struct _MPI2_FW_UPLOAD_REQUEST ++{ ++ U8 ImageType; /* 0x00 */ ++ U8 Reserved1; /* 0x01 */ ++ U8 ChainOffset; /* 0x02 */ ++ U8 Function; /* 0x03 */ ++ U16 Reserved2; /* 0x04 */ ++ U8 Reserved3; /* 0x06 */ ++ U8 MsgFlags; /* 0x07 */ ++ U8 VP_ID; /* 0x08 */ ++ U8 VF_ID; /* 0x09 */ ++ U16 Reserved4; /* 0x0A */ ++ U32 Reserved5; /* 0x0C */ ++ U32 Reserved6; /* 0x10 */ ++ MPI2_MPI_SGE_UNION SGL; /* 0x14 */ ++} MPI2_FW_UPLOAD_REQUEST, MPI2_POINTER PTR_MPI2_FW_UPLOAD_REQUEST, ++ Mpi2FWUploadRequest_t, MPI2_POINTER pMpi2FWUploadRequest_t; ++ ++#define MPI2_FW_UPLOAD_ITYPE_FW_CURRENT (0x00) ++#define MPI2_FW_UPLOAD_ITYPE_FW_FLASH (0x01) ++#define MPI2_FW_UPLOAD_ITYPE_BIOS_FLASH (0x02) ++#define MPI2_FW_UPLOAD_ITYPE_FW_BACKUP (0x05) ++#define MPI2_FW_UPLOAD_ITYPE_MANUFACTURING (0x06) ++#define MPI2_FW_UPLOAD_ITYPE_CONFIG_1 (0x07) ++#define MPI2_FW_UPLOAD_ITYPE_CONFIG_2 (0x08) ++#define MPI2_FW_UPLOAD_ITYPE_MEGARAID (0x09) ++#define MPI2_FW_UPLOAD_ITYPE_COMPLETE (0x0A) ++#define MPI2_FW_UPLOAD_ITYPE_COMMON_BOOT_BLOCK (0x0B) ++ ++typedef struct _MPI2_FW_UPLOAD_TCSGE ++{ ++ U8 Reserved1; /* 0x00 */ ++ U8 ContextSize; /* 0x01 */ ++ U8 DetailsLength; /* 0x02 */ ++ U8 Flags; /* 0x03 */ ++ U32 Reserved2; /* 0x04 */ ++ U32 ImageOffset; /* 0x08 */ ++ U32 ImageSize; /* 0x0C */ ++} MPI2_FW_UPLOAD_TCSGE, MPI2_POINTER PTR_MPI2_FW_UPLOAD_TCSGE, ++ Mpi2FWUploadTCSGE_t, MPI2_POINTER pMpi2FWUploadTCSGE_t; ++ ++/* FWUpload Reply message */ ++typedef struct _MPI2_FW_UPLOAD_REPLY ++{ ++ U8 ImageType; /* 0x00 */ ++ U8 Reserved1; /* 0x01 */ ++ U8 MsgLength; /* 0x02 */ ++ U8 Function; /* 0x03 */ ++ U16 Reserved2; /* 0x04 */ ++ U8 Reserved3; /* 0x06 */ ++ U8 MsgFlags; /* 0x07 */ ++ U8 VP_ID; /* 0x08 */ ++ U8 VF_ID; /* 0x09 */ ++ U16 Reserved4; /* 0x0A */ ++ U16 Reserved5; /* 0x0C */ ++ U16 IOCStatus; /* 0x0E */ ++ U32 IOCLogInfo; /* 0x10 */ ++ U32 ActualImageSize; /* 0x14 */ ++} MPI2_FW_UPLOAD_REPLY, MPI2_POINTER PTR_MPI2_FW_UPLOAD_REPLY, ++ Mpi2FWUploadReply_t, MPI2_POINTER pMPi2FWUploadReply_t; ++ ++ ++/* FW Image Header */ ++typedef struct _MPI2_FW_IMAGE_HEADER ++{ ++ U32 Signature; /* 0x00 */ ++ U32 Signature0; /* 0x04 */ ++ U32 Signature1; /* 0x08 */ ++ U32 Signature2; /* 0x0C */ ++ MPI2_VERSION_UNION MPIVersion; /* 0x10 */ ++ MPI2_VERSION_UNION FWVersion; /* 0x14 */ ++ MPI2_VERSION_UNION NVDATAVersion; /* 0x18 */ ++ MPI2_VERSION_UNION PackageVersion; /* 0x1C */ ++ U16 VendorID; /* 0x20 */ ++ U16 ProductID; /* 0x22 */ ++ U16 ProtocolFlags; /* 0x24 */ ++ U16 Reserved26; /* 0x26 */ ++ U32 IOCCapabilities; /* 0x28 */ ++ U32 ImageSize; /* 0x2C */ ++ U32 NextImageHeaderOffset; /* 0x30 */ ++ U32 Checksum; /* 0x34 */ ++ U32 Reserved38; /* 0x38 */ ++ U32 Reserved3C; /* 0x3C */ ++ U32 Reserved40; /* 0x40 */ ++ U32 Reserved44; /* 0x44 */ ++ U32 Reserved48; /* 0x48 */ ++ U32 Reserved4C; /* 0x4C */ ++ U32 Reserved50; /* 0x50 */ ++ U32 Reserved54; /* 0x54 */ ++ U32 Reserved58; /* 0x58 */ ++ U32 Reserved5C; /* 0x5C */ ++ U32 Reserved60; /* 0x60 */ ++ U32 FirmwareVersionNameWhat; /* 0x64 */ ++ U8 FirmwareVersionName[32]; /* 0x68 */ ++ U32 VendorNameWhat; /* 0x88 */ ++ U8 VendorName[32]; /* 0x8C */ ++ U32 PackageNameWhat; /* 0x88 */ ++ U8 PackageName[32]; /* 0x8C */ ++ U32 ReservedD0; /* 0xD0 */ ++ U32 ReservedD4; /* 0xD4 */ ++ U32 ReservedD8; /* 0xD8 */ ++ U32 ReservedDC; /* 0xDC */ ++ U32 ReservedE0; /* 0xE0 */ ++ U32 ReservedE4; /* 0xE4 */ ++ U32 ReservedE8; /* 0xE8 */ ++ U32 ReservedEC; /* 0xEC */ ++ U32 ReservedF0; /* 0xF0 */ ++ U32 ReservedF4; /* 0xF4 */ ++ U32 ReservedF8; /* 0xF8 */ ++ U32 ReservedFC; /* 0xFC */ ++} MPI2_FW_IMAGE_HEADER, MPI2_POINTER PTR_MPI2_FW_IMAGE_HEADER, ++ Mpi2FWImageHeader_t, MPI2_POINTER pMpi2FWImageHeader_t; ++ ++/* Signature field */ ++#define MPI2_FW_HEADER_SIGNATURE_OFFSET (0x00) ++#define MPI2_FW_HEADER_SIGNATURE_MASK (0xFF000000) ++#define MPI2_FW_HEADER_SIGNATURE (0xEA000000) ++ ++/* Signature0 field */ ++#define MPI2_FW_HEADER_SIGNATURE0_OFFSET (0x04) ++#define MPI2_FW_HEADER_SIGNATURE0 (0x5AFAA55A) ++ ++/* Signature1 field */ ++#define MPI2_FW_HEADER_SIGNATURE1_OFFSET (0x08) ++#define MPI2_FW_HEADER_SIGNATURE1 (0xA55AFAA5) ++ ++/* Signature2 field */ ++#define MPI2_FW_HEADER_SIGNATURE2_OFFSET (0x0C) ++#define MPI2_FW_HEADER_SIGNATURE2 (0x5AA55AFA) ++ ++ ++/* defines for using the ProductID field */ ++#define MPI2_FW_HEADER_PID_TYPE_MASK (0xF000) ++#define MPI2_FW_HEADER_PID_TYPE_SAS (0x2000) ++ ++#define MPI2_FW_HEADER_PID_PROD_MASK (0x0F00) ++#define MPI2_FW_HEADER_PID_PROD_A (0x0000) ++ ++#define MPI2_FW_HEADER_PID_FAMILY_MASK (0x00FF) ++/* SAS */ ++#define MPI2_FW_HEADER_PID_FAMILY_2108_SAS (0x0010) ++ ++/* use MPI2_IOCFACTS_PROTOCOL_ defines for ProtocolFlags field */ ++ ++/* use MPI2_IOCFACTS_CAPABILITY_ defines for IOCCapabilities field */ ++ ++ ++#define MPI2_FW_HEADER_IMAGESIZE_OFFSET (0x2C) ++#define MPI2_FW_HEADER_NEXTIMAGE_OFFSET (0x30) ++#define MPI2_FW_HEADER_VERNMHWAT_OFFSET (0x64) ++ ++#define MPI2_FW_HEADER_WHAT_SIGNATURE (0x29232840) ++ ++#define MPI2_FW_HEADER_SIZE (0x100) ++ ++ ++/* Extended Image Header */ ++typedef struct _MPI2_EXT_IMAGE_HEADER ++ ++{ ++ U8 ImageType; /* 0x00 */ ++ U8 Reserved1; /* 0x01 */ ++ U16 Reserved2; /* 0x02 */ ++ U32 Checksum; /* 0x04 */ ++ U32 ImageSize; /* 0x08 */ ++ U32 NextImageHeaderOffset; /* 0x0C */ ++ U32 PackageVersion; /* 0x10 */ ++ U32 Reserved3; /* 0x14 */ ++ U32 Reserved4; /* 0x18 */ ++ U32 Reserved5; /* 0x1C */ ++ U8 IdentifyString[32]; /* 0x20 */ ++} MPI2_EXT_IMAGE_HEADER, MPI2_POINTER PTR_MPI2_EXT_IMAGE_HEADER, ++ Mpi2ExtImageHeader_t, MPI2_POINTER pMpi2ExtImageHeader_t; ++ ++/* useful offsets */ ++#define MPI2_EXT_IMAGE_IMAGETYPE_OFFSET (0x00) ++#define MPI2_EXT_IMAGE_IMAGESIZE_OFFSET (0x08) ++#define MPI2_EXT_IMAGE_NEXTIMAGE_OFFSET (0x0C) ++ ++#define MPI2_EXT_IMAGE_HEADER_SIZE (0x40) ++ ++/* defines for the ImageType field */ ++#define MPI2_EXT_IMAGE_TYPE_UNSPECIFIED (0x00) ++#define MPI2_EXT_IMAGE_TYPE_FW (0x01) ++#define MPI2_EXT_IMAGE_TYPE_NVDATA (0x03) ++#define MPI2_EXT_IMAGE_TYPE_BOOTLOADER (0x04) ++#define MPI2_EXT_IMAGE_TYPE_INITIALIZATION (0x05) ++#define MPI2_EXT_IMAGE_TYPE_FLASH_LAYOUT (0x06) ++#define MPI2_EXT_IMAGE_TYPE_SUPPORTED_DEVICES (0x07) ++#define MPI2_EXT_IMAGE_TYPE_MEGARAID (0x08) ++ ++#define MPI2_EXT_IMAGE_TYPE_MAX (MPI2_EXT_IMAGE_TYPE_MEGARAID) ++ ++ ++ ++/* FLASH Layout Extended Image Data */ ++ ++/* ++ * Host code (drivers, BIOS, utilities, etc.) should leave this define set to ++ * one and check RegionsPerLayout at runtime. ++ */ ++#ifndef MPI2_FLASH_NUMBER_OF_REGIONS ++#define MPI2_FLASH_NUMBER_OF_REGIONS (1) ++#endif ++ ++/* ++ * Host code (drivers, BIOS, utilities, etc.) should leave this define set to ++ * one and check NumberOfLayouts at runtime. ++ */ ++#ifndef MPI2_FLASH_NUMBER_OF_LAYOUTS ++#define MPI2_FLASH_NUMBER_OF_LAYOUTS (1) ++#endif ++ ++typedef struct _MPI2_FLASH_REGION ++{ ++ U8 RegionType; /* 0x00 */ ++ U8 Reserved1; /* 0x01 */ ++ U16 Reserved2; /* 0x02 */ ++ U32 RegionOffset; /* 0x04 */ ++ U32 RegionSize; /* 0x08 */ ++ U32 Reserved3; /* 0x0C */ ++} MPI2_FLASH_REGION, MPI2_POINTER PTR_MPI2_FLASH_REGION, ++ Mpi2FlashRegion_t, MPI2_POINTER pMpi2FlashRegion_t; ++ ++typedef struct _MPI2_FLASH_LAYOUT ++{ ++ U32 FlashSize; /* 0x00 */ ++ U32 Reserved1; /* 0x04 */ ++ U32 Reserved2; /* 0x08 */ ++ U32 Reserved3; /* 0x0C */ ++ MPI2_FLASH_REGION Region[MPI2_FLASH_NUMBER_OF_REGIONS];/* 0x10 */ ++} MPI2_FLASH_LAYOUT, MPI2_POINTER PTR_MPI2_FLASH_LAYOUT, ++ Mpi2FlashLayout_t, MPI2_POINTER pMpi2FlashLayout_t; ++ ++typedef struct _MPI2_FLASH_LAYOUT_DATA ++{ ++ U8 ImageRevision; /* 0x00 */ ++ U8 Reserved1; /* 0x01 */ ++ U8 SizeOfRegion; /* 0x02 */ ++ U8 Reserved2; /* 0x03 */ ++ U16 NumberOfLayouts; /* 0x04 */ ++ U16 RegionsPerLayout; /* 0x06 */ ++ U16 MinimumSectorAlignment; /* 0x08 */ ++ U16 Reserved3; /* 0x0A */ ++ U32 Reserved4; /* 0x0C */ ++ MPI2_FLASH_LAYOUT Layout[MPI2_FLASH_NUMBER_OF_LAYOUTS];/* 0x10 */ ++} MPI2_FLASH_LAYOUT_DATA, MPI2_POINTER PTR_MPI2_FLASH_LAYOUT_DATA, ++ Mpi2FlashLayoutData_t, MPI2_POINTER pMpi2FlashLayoutData_t; ++ ++/* defines for the RegionType field */ ++#define MPI2_FLASH_REGION_UNUSED (0x00) ++#define MPI2_FLASH_REGION_FIRMWARE (0x01) ++#define MPI2_FLASH_REGION_BIOS (0x02) ++#define MPI2_FLASH_REGION_NVDATA (0x03) ++#define MPI2_FLASH_REGION_FIRMWARE_BACKUP (0x05) ++#define MPI2_FLASH_REGION_MFG_INFORMATION (0x06) ++#define MPI2_FLASH_REGION_CONFIG_1 (0x07) ++#define MPI2_FLASH_REGION_CONFIG_2 (0x08) ++#define MPI2_FLASH_REGION_MEGARAID (0x09) ++#define MPI2_FLASH_REGION_INIT (0x0A) ++ ++/* ImageRevision */ ++#define MPI2_FLASH_LAYOUT_IMAGE_REVISION (0x00) ++ ++ ++ ++/* Supported Devices Extended Image Data */ ++ ++/* ++ * Host code (drivers, BIOS, utilities, etc.) should leave this define set to ++ * one and check NumberOfDevices at runtime. ++ */ ++#ifndef MPI2_SUPPORTED_DEVICES_IMAGE_NUM_DEVICES ++#define MPI2_SUPPORTED_DEVICES_IMAGE_NUM_DEVICES (1) ++#endif ++ ++typedef struct _MPI2_SUPPORTED_DEVICE ++{ ++ U16 DeviceID; /* 0x00 */ ++ U16 VendorID; /* 0x02 */ ++ U16 DeviceIDMask; /* 0x04 */ ++ U16 Reserved1; /* 0x06 */ ++ U8 LowPCIRev; /* 0x08 */ ++ U8 HighPCIRev; /* 0x09 */ ++ U16 Reserved2; /* 0x0A */ ++ U32 Reserved3; /* 0x0C */ ++} MPI2_SUPPORTED_DEVICE, MPI2_POINTER PTR_MPI2_SUPPORTED_DEVICE, ++ Mpi2SupportedDevice_t, MPI2_POINTER pMpi2SupportedDevice_t; ++ ++typedef struct _MPI2_SUPPORTED_DEVICES_DATA ++{ ++ U8 ImageRevision; /* 0x00 */ ++ U8 Reserved1; /* 0x01 */ ++ U8 NumberOfDevices; /* 0x02 */ ++ U8 Reserved2; /* 0x03 */ ++ U32 Reserved3; /* 0x04 */ ++ MPI2_SUPPORTED_DEVICE SupportedDevice[MPI2_SUPPORTED_DEVICES_IMAGE_NUM_DEVICES]; /* 0x08 */ ++} MPI2_SUPPORTED_DEVICES_DATA, MPI2_POINTER PTR_MPI2_SUPPORTED_DEVICES_DATA, ++ Mpi2SupportedDevicesData_t, MPI2_POINTER pMpi2SupportedDevicesData_t; ++ ++/* ImageRevision */ ++#define MPI2_SUPPORTED_DEVICES_IMAGE_REVISION (0x00) ++ ++ ++/* Init Extended Image Data */ ++ ++typedef struct _MPI2_INIT_IMAGE_FOOTER ++ ++{ ++ U32 BootFlags; /* 0x00 */ ++ U32 ImageSize; /* 0x04 */ ++ U32 Signature0; /* 0x08 */ ++ U32 Signature1; /* 0x0C */ ++ U32 Signature2; /* 0x10 */ ++ U32 ResetVector; /* 0x14 */ ++} MPI2_INIT_IMAGE_FOOTER, MPI2_POINTER PTR_MPI2_INIT_IMAGE_FOOTER, ++ Mpi2InitImageFooter_t, MPI2_POINTER pMpi2InitImageFooter_t; ++ ++/* defines for the BootFlags field */ ++#define MPI2_INIT_IMAGE_BOOTFLAGS_OFFSET (0x00) ++ ++/* defines for the ImageSize field */ ++#define MPI2_INIT_IMAGE_IMAGESIZE_OFFSET (0x04) ++ ++/* defines for the Signature0 field */ ++#define MPI2_INIT_IMAGE_SIGNATURE0_OFFSET (0x08) ++#define MPI2_INIT_IMAGE_SIGNATURE0 (0x5AA55AEA) ++ ++/* defines for the Signature1 field */ ++#define MPI2_INIT_IMAGE_SIGNATURE1_OFFSET (0x0C) ++#define MPI2_INIT_IMAGE_SIGNATURE1 (0xA55AEAA5) ++ ++/* defines for the Signature2 field */ ++#define MPI2_INIT_IMAGE_SIGNATURE2_OFFSET (0x10) ++#define MPI2_INIT_IMAGE_SIGNATURE2 (0x5AEAA55A) ++ ++/* Signature fields as individual bytes */ ++#define MPI2_INIT_IMAGE_SIGNATURE_BYTE_0 (0xEA) ++#define MPI2_INIT_IMAGE_SIGNATURE_BYTE_1 (0x5A) ++#define MPI2_INIT_IMAGE_SIGNATURE_BYTE_2 (0xA5) ++#define MPI2_INIT_IMAGE_SIGNATURE_BYTE_3 (0x5A) ++ ++#define MPI2_INIT_IMAGE_SIGNATURE_BYTE_4 (0xA5) ++#define MPI2_INIT_IMAGE_SIGNATURE_BYTE_5 (0xEA) ++#define MPI2_INIT_IMAGE_SIGNATURE_BYTE_6 (0x5A) ++#define MPI2_INIT_IMAGE_SIGNATURE_BYTE_7 (0xA5) ++ ++#define MPI2_INIT_IMAGE_SIGNATURE_BYTE_8 (0x5A) ++#define MPI2_INIT_IMAGE_SIGNATURE_BYTE_9 (0xA5) ++#define MPI2_INIT_IMAGE_SIGNATURE_BYTE_A (0xEA) ++#define MPI2_INIT_IMAGE_SIGNATURE_BYTE_B (0x5A) ++ ++/* defines for the ResetVector field */ ++#define MPI2_INIT_IMAGE_RESETVECTOR_OFFSET (0x14) ++ ++ ++#endif ++ +diff -r e02b4006a7c8 drivers/scsi/mpt2sas/mpi/mpi2_raid.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/scsi/mpt2sas/mpi/mpi2_raid.h Wed Jul 01 09:49:59 2009 +0100 +@@ -0,0 +1,295 @@ ++/* ++ * Copyright (c) 2000-2008 LSI Corporation. ++ * ++ * ++ * Name: mpi2_raid.h ++ * Title: MPI Integrated RAID messages and structures ++ * Creation Date: April 26, 2007 ++ * ++ * mpi2_raid.h Version: 02.00.03 ++ * ++ * Version History ++ * --------------- ++ * ++ * Date Version Description ++ * -------- -------- ------------------------------------------------------ ++ * 04-30-07 02.00.00 Corresponds to Fusion-MPT MPI Specification Rev A. ++ * 08-31-07 02.00.01 Modifications to RAID Action request and reply, ++ * including the Actions and ActionData. ++ * 02-29-08 02.00.02 Added MPI2_RAID_ACTION_ADATA_DISABL_FULL_REBUILD. ++ * 05-21-08 02.00.03 Added MPI2_RAID_VOL_CREATION_NUM_PHYSDISKS so that ++ * the PhysDisk array in MPI2_RAID_VOLUME_CREATION_STRUCT ++ * can be sized by the build environment. ++ * -------------------------------------------------------------------------- ++ */ ++ ++#ifndef MPI2_RAID_H ++#define MPI2_RAID_H ++ ++/***************************************************************************** ++* ++* Integrated RAID Messages ++* ++*****************************************************************************/ ++ ++/**************************************************************************** ++* RAID Action messages ++****************************************************************************/ ++ ++/* ActionDataWord defines for use with MPI2_RAID_ACTION_DELETE_VOLUME action */ ++#define MPI2_RAID_ACTION_ADATA_KEEP_LBA0 (0x00000000) ++#define MPI2_RAID_ACTION_ADATA_ZERO_LBA0 (0x00000001) ++ ++/* use MPI2_RAIDVOL0_SETTING_ defines from mpi2_cnfg.h for MPI2_RAID_ACTION_CHANGE_VOL_WRITE_CACHE action */ ++ ++/* ActionDataWord defines for use with MPI2_RAID_ACTION_DISABLE_ALL_VOLUMES action */ ++#define MPI2_RAID_ACTION_ADATA_DISABL_FULL_REBUILD (0x00000001) ++ ++/* ActionDataWord for MPI2_RAID_ACTION_SET_RAID_FUNCTION_RATE Action */ ++typedef struct _MPI2_RAID_ACTION_RATE_DATA ++{ ++ U8 RateToChange; /* 0x00 */ ++ U8 RateOrMode; /* 0x01 */ ++ U16 DataScrubDuration; /* 0x02 */ ++} MPI2_RAID_ACTION_RATE_DATA, MPI2_POINTER PTR_MPI2_RAID_ACTION_RATE_DATA, ++ Mpi2RaidActionRateData_t, MPI2_POINTER pMpi2RaidActionRateData_t; ++ ++#define MPI2_RAID_ACTION_SET_RATE_RESYNC (0x00) ++#define MPI2_RAID_ACTION_SET_RATE_DATA_SCRUB (0x01) ++#define MPI2_RAID_ACTION_SET_RATE_POWERSAVE_MODE (0x02) ++ ++/* ActionDataWord for MPI2_RAID_ACTION_START_RAID_FUNCTION Action */ ++typedef struct _MPI2_RAID_ACTION_START_RAID_FUNCTION ++{ ++ U8 RAIDFunction; /* 0x00 */ ++ U8 Flags; /* 0x01 */ ++ U16 Reserved1; /* 0x02 */ ++} MPI2_RAID_ACTION_START_RAID_FUNCTION, ++ MPI2_POINTER PTR_MPI2_RAID_ACTION_START_RAID_FUNCTION, ++ Mpi2RaidActionStartRaidFunction_t, ++ MPI2_POINTER pMpi2RaidActionStartRaidFunction_t; ++ ++/* defines for the RAIDFunction field */ ++#define MPI2_RAID_ACTION_START_BACKGROUND_INIT (0x00) ++#define MPI2_RAID_ACTION_START_ONLINE_CAP_EXPANSION (0x01) ++#define MPI2_RAID_ACTION_START_CONSISTENCY_CHECK (0x02) ++ ++/* defines for the Flags field */ ++#define MPI2_RAID_ACTION_START_NEW (0x00) ++#define MPI2_RAID_ACTION_START_RESUME (0x01) ++ ++/* ActionDataWord for MPI2_RAID_ACTION_STOP_RAID_FUNCTION Action */ ++typedef struct _MPI2_RAID_ACTION_STOP_RAID_FUNCTION ++{ ++ U8 RAIDFunction; /* 0x00 */ ++ U8 Flags; /* 0x01 */ ++ U16 Reserved1; /* 0x02 */ ++} MPI2_RAID_ACTION_STOP_RAID_FUNCTION, ++ MPI2_POINTER PTR_MPI2_RAID_ACTION_STOP_RAID_FUNCTION, ++ Mpi2RaidActionStopRaidFunction_t, ++ MPI2_POINTER pMpi2RaidActionStopRaidFunction_t; ++ ++/* defines for the RAIDFunction field */ ++#define MPI2_RAID_ACTION_STOP_BACKGROUND_INIT (0x00) ++#define MPI2_RAID_ACTION_STOP_ONLINE_CAP_EXPANSION (0x01) ++#define MPI2_RAID_ACTION_STOP_CONSISTENCY_CHECK (0x02) ++ ++/* defines for the Flags field */ ++#define MPI2_RAID_ACTION_STOP_ABORT (0x00) ++#define MPI2_RAID_ACTION_STOP_PAUSE (0x01) ++ ++/* ActionDataWord for MPI2_RAID_ACTION_CREATE_HOT_SPARE Action */ ++typedef struct _MPI2_RAID_ACTION_HOT_SPARE ++{ ++ U8 HotSparePool; /* 0x00 */ ++ U8 Reserved1; /* 0x01 */ ++ U16 DevHandle; /* 0x02 */ ++} MPI2_RAID_ACTION_HOT_SPARE, MPI2_POINTER PTR_MPI2_RAID_ACTION_HOT_SPARE, ++ Mpi2RaidActionHotSpare_t, MPI2_POINTER pMpi2RaidActionHotSpare_t; ++ ++/* ActionDataWord for MPI2_RAID_ACTION_DEVICE_FW_UPDATE_MODE Action */ ++typedef struct _MPI2_RAID_ACTION_FW_UPDATE_MODE ++{ ++ U8 Flags; /* 0x00 */ ++ U8 DeviceFirmwareUpdateModeTimeout; /* 0x01 */ ++ U16 Reserved1; /* 0x02 */ ++} MPI2_RAID_ACTION_FW_UPDATE_MODE, ++ MPI2_POINTER PTR_MPI2_RAID_ACTION_FW_UPDATE_MODE, ++ Mpi2RaidActionFwUpdateMode_t, MPI2_POINTER pMpi2RaidActionFwUpdateMode_t; ++ ++/* ActionDataWord defines for use with MPI2_RAID_ACTION_DEVICE_FW_UPDATE_MODE action */ ++#define MPI2_RAID_ACTION_ADATA_DISABLE_FW_UPDATE (0x00) ++#define MPI2_RAID_ACTION_ADATA_ENABLE_FW_UPDATE (0x01) ++ ++typedef union _MPI2_RAID_ACTION_DATA ++{ ++ U32 Word; ++ MPI2_RAID_ACTION_RATE_DATA Rates; ++ MPI2_RAID_ACTION_START_RAID_FUNCTION StartRaidFunction; ++ MPI2_RAID_ACTION_STOP_RAID_FUNCTION StopRaidFunction; ++ MPI2_RAID_ACTION_HOT_SPARE HotSpare; ++ MPI2_RAID_ACTION_FW_UPDATE_MODE FwUpdateMode; ++} MPI2_RAID_ACTION_DATA, MPI2_POINTER PTR_MPI2_RAID_ACTION_DATA, ++ Mpi2RaidActionData_t, MPI2_POINTER pMpi2RaidActionData_t; ++ ++ ++/* RAID Action Request Message */ ++typedef struct _MPI2_RAID_ACTION_REQUEST ++{ ++ U8 Action; /* 0x00 */ ++ U8 Reserved1; /* 0x01 */ ++ U8 ChainOffset; /* 0x02 */ ++ U8 Function; /* 0x03 */ ++ U16 VolDevHandle; /* 0x04 */ ++ U8 PhysDiskNum; /* 0x06 */ ++ U8 MsgFlags; /* 0x07 */ ++ U8 VP_ID; /* 0x08 */ ++ U8 VF_ID; /* 0x09 */ ++ U16 Reserved2; /* 0x0A */ ++ U32 Reserved3; /* 0x0C */ ++ MPI2_RAID_ACTION_DATA ActionDataWord; /* 0x10 */ ++ MPI2_SGE_SIMPLE_UNION ActionDataSGE; /* 0x14 */ ++} MPI2_RAID_ACTION_REQUEST, MPI2_POINTER PTR_MPI2_RAID_ACTION_REQUEST, ++ Mpi2RaidActionRequest_t, MPI2_POINTER pMpi2RaidActionRequest_t; ++ ++/* RAID Action request Action values */ ++ ++#define MPI2_RAID_ACTION_INDICATOR_STRUCT (0x01) ++#define MPI2_RAID_ACTION_CREATE_VOLUME (0x02) ++#define MPI2_RAID_ACTION_DELETE_VOLUME (0x03) ++#define MPI2_RAID_ACTION_DISABLE_ALL_VOLUMES (0x04) ++#define MPI2_RAID_ACTION_ENABLE_ALL_VOLUMES (0x05) ++#define MPI2_RAID_ACTION_PHYSDISK_OFFLINE (0x0A) ++#define MPI2_RAID_ACTION_PHYSDISK_ONLINE (0x0B) ++#define MPI2_RAID_ACTION_FAIL_PHYSDISK (0x0F) ++#define MPI2_RAID_ACTION_ACTIVATE_VOLUME (0x11) ++#define MPI2_RAID_ACTION_DEVICE_FW_UPDATE_MODE (0x15) ++#define MPI2_RAID_ACTION_CHANGE_VOL_WRITE_CACHE (0x17) ++#define MPI2_RAID_ACTION_SET_VOLUME_NAME (0x18) ++#define MPI2_RAID_ACTION_SET_RAID_FUNCTION_RATE (0x19) ++#define MPI2_RAID_ACTION_ENABLE_FAILED_VOLUME (0x1C) ++#define MPI2_RAID_ACTION_CREATE_HOT_SPARE (0x1D) ++#define MPI2_RAID_ACTION_DELETE_HOT_SPARE (0x1E) ++#define MPI2_RAID_ACTION_SYSTEM_SHUTDOWN_INITIATED (0x20) ++#define MPI2_RAID_ACTION_START_RAID_FUNCTION (0x21) ++#define MPI2_RAID_ACTION_STOP_RAID_FUNCTION (0x22) ++ ++ ++/* RAID Volume Creation Structure */ ++ ++/* ++ * The following define can be customized for the targeted product. ++ */ ++#ifndef MPI2_RAID_VOL_CREATION_NUM_PHYSDISKS ++#define MPI2_RAID_VOL_CREATION_NUM_PHYSDISKS (1) ++#endif ++ ++typedef struct _MPI2_RAID_VOLUME_PHYSDISK ++{ ++ U8 RAIDSetNum; /* 0x00 */ ++ U8 PhysDiskMap; /* 0x01 */ ++ U16 PhysDiskDevHandle; /* 0x02 */ ++} MPI2_RAID_VOLUME_PHYSDISK, MPI2_POINTER PTR_MPI2_RAID_VOLUME_PHYSDISK, ++ Mpi2RaidVolumePhysDisk_t, MPI2_POINTER pMpi2RaidVolumePhysDisk_t; ++ ++/* defines for the PhysDiskMap field */ ++#define MPI2_RAIDACTION_PHYSDISK_PRIMARY (0x01) ++#define MPI2_RAIDACTION_PHYSDISK_SECONDARY (0x02) ++ ++typedef struct _MPI2_RAID_VOLUME_CREATION_STRUCT ++{ ++ U8 NumPhysDisks; /* 0x00 */ ++ U8 VolumeType; /* 0x01 */ ++ U16 Reserved1; /* 0x02 */ ++ U32 VolumeCreationFlags; /* 0x04 */ ++ U32 VolumeSettings; /* 0x08 */ ++ U8 Reserved2; /* 0x0C */ ++ U8 ResyncRate; /* 0x0D */ ++ U16 DataScrubDuration; /* 0x0E */ ++ U64 VolumeMaxLBA; /* 0x10 */ ++ U32 StripeSize; /* 0x18 */ ++ U8 Name[16]; /* 0x1C */ ++ MPI2_RAID_VOLUME_PHYSDISK PhysDisk[MPI2_RAID_VOL_CREATION_NUM_PHYSDISKS];/* 0x2C */ ++} MPI2_RAID_VOLUME_CREATION_STRUCT, ++ MPI2_POINTER PTR_MPI2_RAID_VOLUME_CREATION_STRUCT, ++ Mpi2RaidVolumeCreationStruct_t, MPI2_POINTER pMpi2RaidVolumeCreationStruct_t; ++ ++/* use MPI2_RAID_VOL_TYPE_ defines from mpi2_cnfg.h for VolumeType */ ++ ++/* defines for the VolumeCreationFlags field */ ++#define MPI2_RAID_VOL_CREATION_USE_DEFAULT_SETTINGS (0x80) ++#define MPI2_RAID_VOL_CREATION_BACKGROUND_INIT (0x04) ++#define MPI2_RAID_VOL_CREATION_LOW_LEVEL_INIT (0x02) ++#define MPI2_RAID_VOL_CREATION_MIGRATE_DATA (0x01) ++ ++ ++/* RAID Online Capacity Expansion Structure */ ++ ++typedef struct _MPI2_RAID_ONLINE_CAPACITY_EXPANSION ++{ ++ U32 Flags; /* 0x00 */ ++ U16 DevHandle0; /* 0x04 */ ++ U16 Reserved1; /* 0x06 */ ++ U16 DevHandle1; /* 0x08 */ ++ U16 Reserved2; /* 0x0A */ ++} MPI2_RAID_ONLINE_CAPACITY_EXPANSION, ++ MPI2_POINTER PTR_MPI2_RAID_ONLINE_CAPACITY_EXPANSION, ++ Mpi2RaidOnlineCapacityExpansion_t, ++ MPI2_POINTER pMpi2RaidOnlineCapacityExpansion_t; ++ ++ ++/* RAID Volume Indicator Structure */ ++ ++typedef struct _MPI2_RAID_VOL_INDICATOR ++{ ++ U64 TotalBlocks; /* 0x00 */ ++ U64 BlocksRemaining; /* 0x08 */ ++ U32 Flags; /* 0x10 */ ++} MPI2_RAID_VOL_INDICATOR, MPI2_POINTER PTR_MPI2_RAID_VOL_INDICATOR, ++ Mpi2RaidVolIndicator_t, MPI2_POINTER pMpi2RaidVolIndicator_t; ++ ++/* defines for RAID Volume Indicator Flags field */ ++#define MPI2_RAID_VOL_FLAGS_OP_MASK (0x0000000F) ++#define MPI2_RAID_VOL_FLAGS_OP_BACKGROUND_INIT (0x00000000) ++#define MPI2_RAID_VOL_FLAGS_OP_ONLINE_CAP_EXPANSION (0x00000001) ++#define MPI2_RAID_VOL_FLAGS_OP_CONSISTENCY_CHECK (0x00000002) ++#define MPI2_RAID_VOL_FLAGS_OP_RESYNC (0x00000003) ++ ++ ++/* RAID Action Reply ActionData union */ ++typedef union _MPI2_RAID_ACTION_REPLY_DATA ++{ ++ U32 Word[5]; ++ MPI2_RAID_VOL_INDICATOR RaidVolumeIndicator; ++ U16 VolDevHandle; ++ U8 VolumeState; ++ U8 PhysDiskNum; ++} MPI2_RAID_ACTION_REPLY_DATA, MPI2_POINTER PTR_MPI2_RAID_ACTION_REPLY_DATA, ++ Mpi2RaidActionReplyData_t, MPI2_POINTER pMpi2RaidActionReplyData_t; ++ ++/* use MPI2_RAIDVOL0_SETTING_ defines from mpi2_cnfg.h for MPI2_RAID_ACTION_CHANGE_VOL_WRITE_CACHE action */ ++ ++ ++/* RAID Action Reply Message */ ++typedef struct _MPI2_RAID_ACTION_REPLY ++{ ++ U8 Action; /* 0x00 */ ++ U8 Reserved1; /* 0x01 */ ++ U8 MsgLength; /* 0x02 */ ++ U8 Function; /* 0x03 */ ++ U16 VolDevHandle; /* 0x04 */ ++ U8 PhysDiskNum; /* 0x06 */ ++ U8 MsgFlags; /* 0x07 */ ++ U8 VP_ID; /* 0x08 */ ++ U8 VF_ID; /* 0x09 */ ++ U16 Reserved2; /* 0x0A */ ++ U16 Reserved3; /* 0x0C */ ++ U16 IOCStatus; /* 0x0E */ ++ U32 IOCLogInfo; /* 0x10 */ ++ MPI2_RAID_ACTION_REPLY_DATA ActionData; /* 0x14 */ ++} MPI2_RAID_ACTION_REPLY, MPI2_POINTER PTR_MPI2_RAID_ACTION_REPLY, ++ Mpi2RaidActionReply_t, MPI2_POINTER pMpi2RaidActionReply_t; ++ ++ ++#endif ++ +diff -r e02b4006a7c8 drivers/scsi/mpt2sas/mpi/mpi2_sas.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/scsi/mpt2sas/mpi/mpi2_sas.h Wed Jul 01 09:49:59 2009 +0100 +@@ -0,0 +1,282 @@ ++/* ++ * Copyright (c) 2000-2007 LSI Corporation. ++ * ++ * ++ * Name: mpi2_sas.h ++ * Title: MPI Serial Attached SCSI structures and definitions ++ * Creation Date: February 9, 2007 ++ * ++ * mpi2.h Version: 02.00.02 ++ * ++ * Version History ++ * --------------- ++ * ++ * Date Version Description ++ * -------- -------- ------------------------------------------------------ ++ * 04-30-07 02.00.00 Corresponds to Fusion-MPT MPI Specification Rev A. ++ * 06-26-07 02.00.01 Added Clear All Persistent Operation to SAS IO Unit ++ * Control Request. ++ * 10-02-08 02.00.02 Added Set IOC Parameter Operation to SAS IO Unit Control ++ * Request. ++ * -------------------------------------------------------------------------- ++ */ ++ ++#ifndef MPI2_SAS_H ++#define MPI2_SAS_H ++ ++/* ++ * Values for SASStatus. ++ */ ++#define MPI2_SASSTATUS_SUCCESS (0x00) ++#define MPI2_SASSTATUS_UNKNOWN_ERROR (0x01) ++#define MPI2_SASSTATUS_INVALID_FRAME (0x02) ++#define MPI2_SASSTATUS_UTC_BAD_DEST (0x03) ++#define MPI2_SASSTATUS_UTC_BREAK_RECEIVED (0x04) ++#define MPI2_SASSTATUS_UTC_CONNECT_RATE_NOT_SUPPORTED (0x05) ++#define MPI2_SASSTATUS_UTC_PORT_LAYER_REQUEST (0x06) ++#define MPI2_SASSTATUS_UTC_PROTOCOL_NOT_SUPPORTED (0x07) ++#define MPI2_SASSTATUS_UTC_STP_RESOURCES_BUSY (0x08) ++#define MPI2_SASSTATUS_UTC_WRONG_DESTINATION (0x09) ++#define MPI2_SASSTATUS_SHORT_INFORMATION_UNIT (0x0A) ++#define MPI2_SASSTATUS_LONG_INFORMATION_UNIT (0x0B) ++#define MPI2_SASSTATUS_XFER_RDY_INCORRECT_WRITE_DATA (0x0C) ++#define MPI2_SASSTATUS_XFER_RDY_REQUEST_OFFSET_ERROR (0x0D) ++#define MPI2_SASSTATUS_XFER_RDY_NOT_EXPECTED (0x0E) ++#define MPI2_SASSTATUS_DATA_INCORRECT_DATA_LENGTH (0x0F) ++#define MPI2_SASSTATUS_DATA_TOO_MUCH_READ_DATA (0x10) ++#define MPI2_SASSTATUS_DATA_OFFSET_ERROR (0x11) ++#define MPI2_SASSTATUS_SDSF_NAK_RECEIVED (0x12) ++#define MPI2_SASSTATUS_SDSF_CONNECTION_FAILED (0x13) ++#define MPI2_SASSTATUS_INITIATOR_RESPONSE_TIMEOUT (0x14) ++ ++ ++/* ++ * Values for the SAS DeviceInfo field used in SAS Device Status Change Event ++ * data and SAS Configuration pages. ++ */ ++#define MPI2_SAS_DEVICE_INFO_SEP (0x00004000) ++#define MPI2_SAS_DEVICE_INFO_ATAPI_DEVICE (0x00002000) ++#define MPI2_SAS_DEVICE_INFO_LSI_DEVICE (0x00001000) ++#define MPI2_SAS_DEVICE_INFO_DIRECT_ATTACH (0x00000800) ++#define MPI2_SAS_DEVICE_INFO_SSP_TARGET (0x00000400) ++#define MPI2_SAS_DEVICE_INFO_STP_TARGET (0x00000200) ++#define MPI2_SAS_DEVICE_INFO_SMP_TARGET (0x00000100) ++#define MPI2_SAS_DEVICE_INFO_SATA_DEVICE (0x00000080) ++#define MPI2_SAS_DEVICE_INFO_SSP_INITIATOR (0x00000040) ++#define MPI2_SAS_DEVICE_INFO_STP_INITIATOR (0x00000020) ++#define MPI2_SAS_DEVICE_INFO_SMP_INITIATOR (0x00000010) ++#define MPI2_SAS_DEVICE_INFO_SATA_HOST (0x00000008) ++ ++#define MPI2_SAS_DEVICE_INFO_MASK_DEVICE_TYPE (0x00000007) ++#define MPI2_SAS_DEVICE_INFO_NO_DEVICE (0x00000000) ++#define MPI2_SAS_DEVICE_INFO_END_DEVICE (0x00000001) ++#define MPI2_SAS_DEVICE_INFO_EDGE_EXPANDER (0x00000002) ++#define MPI2_SAS_DEVICE_INFO_FANOUT_EXPANDER (0x00000003) ++ ++ ++/***************************************************************************** ++* ++* SAS Messages ++* ++*****************************************************************************/ ++ ++/**************************************************************************** ++* SMP Passthrough messages ++****************************************************************************/ ++ ++/* SMP Passthrough Request Message */ ++typedef struct _MPI2_SMP_PASSTHROUGH_REQUEST ++{ ++ U8 PassthroughFlags; /* 0x00 */ ++ U8 PhysicalPort; /* 0x01 */ ++ U8 ChainOffset; /* 0x02 */ ++ U8 Function; /* 0x03 */ ++ U16 RequestDataLength; /* 0x04 */ ++ U8 SGLFlags; /* 0x06 */ ++ U8 MsgFlags; /* 0x07 */ ++ U8 VP_ID; /* 0x08 */ ++ U8 VF_ID; /* 0x09 */ ++ U16 Reserved1; /* 0x0A */ ++ U32 Reserved2; /* 0x0C */ ++ U64 SASAddress; /* 0x10 */ ++ U32 Reserved3; /* 0x18 */ ++ U32 Reserved4; /* 0x1C */ ++ MPI2_SIMPLE_SGE_UNION SGL; /* 0x20 */ ++} MPI2_SMP_PASSTHROUGH_REQUEST, MPI2_POINTER PTR_MPI2_SMP_PASSTHROUGH_REQUEST, ++ Mpi2SmpPassthroughRequest_t, MPI2_POINTER pMpi2SmpPassthroughRequest_t; ++ ++/* values for PassthroughFlags field */ ++#define MPI2_SMP_PT_REQ_PT_FLAGS_IMMEDIATE (0x80) ++ ++/* values for SGLFlags field are in the SGL section of mpi2.h */ ++ ++ ++/* SMP Passthrough Reply Message */ ++typedef struct _MPI2_SMP_PASSTHROUGH_REPLY ++{ ++ U8 PassthroughFlags; /* 0x00 */ ++ U8 PhysicalPort; /* 0x01 */ ++ U8 MsgLength; /* 0x02 */ ++ U8 Function; /* 0x03 */ ++ U16 ResponseDataLength; /* 0x04 */ ++ U8 SGLFlags; /* 0x06 */ ++ U8 MsgFlags; /* 0x07 */ ++ U8 VP_ID; /* 0x08 */ ++ U8 VF_ID; /* 0x09 */ ++ U16 Reserved1; /* 0x0A */ ++ U8 Reserved2; /* 0x0C */ ++ U8 SASStatus; /* 0x0D */ ++ U16 IOCStatus; /* 0x0E */ ++ U32 IOCLogInfo; /* 0x10 */ ++ U32 Reserved3; /* 0x14 */ ++ U8 ResponseData[4]; /* 0x18 */ ++} MPI2_SMP_PASSTHROUGH_REPLY, MPI2_POINTER PTR_MPI2_SMP_PASSTHROUGH_REPLY, ++ Mpi2SmpPassthroughReply_t, MPI2_POINTER pMpi2SmpPassthroughReply_t; ++ ++/* values for PassthroughFlags field */ ++#define MPI2_SMP_PT_REPLY_PT_FLAGS_IMMEDIATE (0x80) ++ ++/* values for SASStatus field are at the top of this file */ ++ ++ ++/**************************************************************************** ++* SATA Passthrough messages ++****************************************************************************/ ++ ++/* SATA Passthrough Request Message */ ++typedef struct _MPI2_SATA_PASSTHROUGH_REQUEST ++{ ++ U16 DevHandle; /* 0x00 */ ++ U8 ChainOffset; /* 0x02 */ ++ U8 Function; /* 0x03 */ ++ U16 PassthroughFlags; /* 0x04 */ ++ U8 SGLFlags; /* 0x06 */ ++ U8 MsgFlags; /* 0x07 */ ++ U8 VP_ID; /* 0x08 */ ++ U8 VF_ID; /* 0x09 */ ++ U16 Reserved1; /* 0x0A */ ++ U32 Reserved2; /* 0x0C */ ++ U32 Reserved3; /* 0x10 */ ++ U32 Reserved4; /* 0x14 */ ++ U32 DataLength; /* 0x18 */ ++ U8 CommandFIS[20]; /* 0x1C */ ++ MPI2_SIMPLE_SGE_UNION SGL; /* 0x20 */ ++} MPI2_SATA_PASSTHROUGH_REQUEST, MPI2_POINTER PTR_MPI2_SATA_PASSTHROUGH_REQUEST, ++ Mpi2SataPassthroughRequest_t, MPI2_POINTER pMpi2SataPassthroughRequest_t; ++ ++/* values for PassthroughFlags field */ ++#define MPI2_SATA_PT_REQ_PT_FLAGS_EXECUTE_DIAG (0x0100) ++#define MPI2_SATA_PT_REQ_PT_FLAGS_DMA (0x0020) ++#define MPI2_SATA_PT_REQ_PT_FLAGS_PIO (0x0010) ++#define MPI2_SATA_PT_REQ_PT_FLAGS_UNSPECIFIED_VU (0x0004) ++#define MPI2_SATA_PT_REQ_PT_FLAGS_WRITE (0x0002) ++#define MPI2_SATA_PT_REQ_PT_FLAGS_READ (0x0001) ++ ++/* values for SGLFlags field are in the SGL section of mpi2.h */ ++ ++ ++/* SATA Passthrough Reply Message */ ++typedef struct _MPI2_SATA_PASSTHROUGH_REPLY ++{ ++ U16 DevHandle; /* 0x00 */ ++ U8 MsgLength; /* 0x02 */ ++ U8 Function; /* 0x03 */ ++ U16 PassthroughFlags; /* 0x04 */ ++ U8 SGLFlags; /* 0x06 */ ++ U8 MsgFlags; /* 0x07 */ ++ U8 VP_ID; /* 0x08 */ ++ U8 VF_ID; /* 0x09 */ ++ U16 Reserved1; /* 0x0A */ ++ U8 Reserved2; /* 0x0C */ ++ U8 SASStatus; /* 0x0D */ ++ U16 IOCStatus; /* 0x0E */ ++ U32 IOCLogInfo; /* 0x10 */ ++ U8 StatusFIS[20]; /* 0x14 */ ++ U32 StatusControlRegisters; /* 0x28 */ ++ U32 TransferCount; /* 0x2C */ ++} MPI2_SATA_PASSTHROUGH_REPLY, MPI2_POINTER PTR_MPI2_SATA_PASSTHROUGH_REPLY, ++ Mpi2SataPassthroughReply_t, MPI2_POINTER pMpi2SataPassthroughReply_t; ++ ++/* values for SASStatus field are at the top of this file */ ++ ++ ++/**************************************************************************** ++* SAS IO Unit Control messages ++****************************************************************************/ ++ ++/* SAS IO Unit Control Request Message */ ++typedef struct _MPI2_SAS_IOUNIT_CONTROL_REQUEST ++{ ++ U8 Operation; /* 0x00 */ ++ U8 Reserved1; /* 0x01 */ ++ U8 ChainOffset; /* 0x02 */ ++ U8 Function; /* 0x03 */ ++ U16 DevHandle; /* 0x04 */ ++ U8 IOCParameter; /* 0x06 */ ++ U8 MsgFlags; /* 0x07 */ ++ U8 VP_ID; /* 0x08 */ ++ U8 VF_ID; /* 0x09 */ ++ U16 Reserved3; /* 0x0A */ ++ U16 Reserved4; /* 0x0C */ ++ U8 PhyNum; /* 0x0E */ ++ U8 PrimFlags; /* 0x0F */ ++ U32 Primitive; /* 0x10 */ ++ U8 LookupMethod; /* 0x14 */ ++ U8 Reserved5; /* 0x15 */ ++ U16 SlotNumber; /* 0x16 */ ++ U64 LookupAddress; /* 0x18 */ ++ U32 IOCParameterValue; /* 0x20 */ ++ U32 Reserved7; /* 0x24 */ ++ U32 Reserved8; /* 0x28 */ ++} MPI2_SAS_IOUNIT_CONTROL_REQUEST, ++ MPI2_POINTER PTR_MPI2_SAS_IOUNIT_CONTROL_REQUEST, ++ Mpi2SasIoUnitControlRequest_t, MPI2_POINTER pMpi2SasIoUnitControlRequest_t; ++ ++/* values for the Operation field */ ++#define MPI2_SAS_OP_CLEAR_ALL_PERSISTENT (0x02) ++#define MPI2_SAS_OP_PHY_LINK_RESET (0x06) ++#define MPI2_SAS_OP_PHY_HARD_RESET (0x07) ++#define MPI2_SAS_OP_PHY_CLEAR_ERROR_LOG (0x08) ++#define MPI2_SAS_OP_SEND_PRIMITIVE (0x0A) ++#define MPI2_SAS_OP_FORCE_FULL_DISCOVERY (0x0B) ++#define MPI2_SAS_OP_TRANSMIT_PORT_SELECT_SIGNAL (0x0C) ++#define MPI2_SAS_OP_REMOVE_DEVICE (0x0D) ++#define MPI2_SAS_OP_LOOKUP_MAPPING (0x0E) ++#define MPI2_SAS_OP_SET_IOC_PARAMETER (0x0F) ++#define MPI2_SAS_OP_PRODUCT_SPECIFIC_MIN (0x80) ++ ++/* values for the PrimFlags field */ ++#define MPI2_SAS_PRIMFLAGS_SINGLE (0x08) ++#define MPI2_SAS_PRIMFLAGS_TRIPLE (0x02) ++#define MPI2_SAS_PRIMFLAGS_REDUNDANT (0x01) ++ ++/* values for the LookupMethod field */ ++#define MPI2_SAS_LOOKUP_METHOD_SAS_ADDRESS (0x01) ++#define MPI2_SAS_LOOKUP_METHOD_SAS_ENCLOSURE_SLOT (0x02) ++#define MPI2_SAS_LOOKUP_METHOD_SAS_DEVICE_NAME (0x03) ++ ++ ++/* SAS IO Unit Control Reply Message */ ++typedef struct _MPI2_SAS_IOUNIT_CONTROL_REPLY ++{ ++ U8 Operation; /* 0x00 */ ++ U8 Reserved1; /* 0x01 */ ++ U8 MsgLength; /* 0x02 */ ++ U8 Function; /* 0x03 */ ++ U16 DevHandle; /* 0x04 */ ++ U8 IOCParameter; /* 0x06 */ ++ U8 MsgFlags; /* 0x07 */ ++ U8 VP_ID; /* 0x08 */ ++ U8 VF_ID; /* 0x09 */ ++ U16 Reserved3; /* 0x0A */ ++ U16 Reserved4; /* 0x0C */ ++ U16 IOCStatus; /* 0x0E */ ++ U32 IOCLogInfo; /* 0x10 */ ++} MPI2_SAS_IOUNIT_CONTROL_REPLY, ++ MPI2_POINTER PTR_MPI2_SAS_IOUNIT_CONTROL_REPLY, ++ Mpi2SasIoUnitControlReply_t, MPI2_POINTER pMpi2SasIoUnitControlReply_t; ++ ++ ++#endif ++ ++ +diff -r e02b4006a7c8 drivers/scsi/mpt2sas/mpi/mpi2_targ.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/scsi/mpt2sas/mpi/mpi2_targ.h Wed Jul 01 09:49:59 2009 +0100 +@@ -0,0 +1,440 @@ ++/* ++ * Copyright (c) 2000-2008 LSI Corporation. ++ * ++ * ++ * Name: mpi2_targ.h ++ * Title: MPI Target mode messages and structures ++ * Creation Date: September 8, 2006 ++ * ++ * mpi2_targ.h Version: 02.00.03 ++ * ++ * Version History ++ * --------------- ++ * ++ * Date Version Description ++ * -------- -------- ------------------------------------------------------ ++ * 04-30-07 02.00.00 Corresponds to Fusion-MPT MPI Specification Rev A. ++ * 08-31-07 02.00.01 Added Command Buffer Data Location Address Space bits to ++ * BufferPostFlags field of CommandBufferPostBase Request. ++ * 02-29-08 02.00.02 Modified various names to make them 32-character unique. ++ * 10-02-08 02.00.03 Removed NextCmdBufferOffset from ++ * MPI2_TARGET_CMD_BUF_POST_BASE_REQUEST. ++ * Target Status Send Request only takes a single SGE for ++ * response data. ++ * -------------------------------------------------------------------------- ++ */ ++ ++#ifndef MPI2_TARG_H ++#define MPI2_TARG_H ++ ++ ++/****************************************************************************** ++* ++* SCSI Target Messages ++* ++*******************************************************************************/ ++ ++/**************************************************************************** ++* Target Command Buffer Post Base Request ++****************************************************************************/ ++ ++typedef struct _MPI2_TARGET_CMD_BUF_POST_BASE_REQUEST ++{ ++ U8 BufferPostFlags; /* 0x00 */ ++ U8 Reserved1; /* 0x01 */ ++ U8 ChainOffset; /* 0x02 */ ++ U8 Function; /* 0x03 */ ++ U16 TotalCmdBuffers; /* 0x04 */ ++ U8 Reserved; /* 0x06 */ ++ U8 MsgFlags; /* 0x07 */ ++ U8 VP_ID; /* 0x08 */ ++ U8 VF_ID; /* 0x09 */ ++ U16 Reserved2; /* 0x0A */ ++ U32 Reserved3; /* 0x0C */ ++ U16 CmdBufferLength; /* 0x10 */ ++ U16 Reserved4; /* 0x12 */ ++ U32 BaseAddressLow; /* 0x14 */ ++ U32 BaseAddressHigh; /* 0x18 */ ++} MPI2_TARGET_CMD_BUF_POST_BASE_REQUEST, ++ MPI2_POINTER PTR_MPI2_TARGET_CMD_BUF_POST_BASE_REQUEST, ++ Mpi2TargetCmdBufferPostBaseRequest_t, ++ MPI2_POINTER pMpi2TargetCmdBufferPostBaseRequest_t; ++ ++/* values for the BufferPostflags field */ ++#define MPI2_CMD_BUF_POST_BASE_ADDRESS_SPACE_MASK (0x0C) ++#define MPI2_CMD_BUF_POST_BASE_SYSTEM_ADDRESS_SPACE (0x00) ++#define MPI2_CMD_BUF_POST_BASE_IOCDDR_ADDRESS_SPACE (0x04) ++#define MPI2_CMD_BUF_POST_BASE_IOCPLB_ADDRESS_SPACE (0x08) ++#define MPI2_CMD_BUF_POST_BASE_IOCPLBNTA_ADDRESS_SPACE (0x0C) ++ ++#define MPI2_CMD_BUF_POST_BASE_FLAGS_AUTO_POST_ALL (0x01) ++ ++ ++/**************************************************************************** ++* Target Command Buffer Post List Request ++****************************************************************************/ ++ ++typedef struct _MPI2_TARGET_CMD_BUF_POST_LIST_REQUEST ++{ ++ U16 Reserved; /* 0x00 */ ++ U8 ChainOffset; /* 0x02 */ ++ U8 Function; /* 0x03 */ ++ U16 CmdBufferCount; /* 0x04 */ ++ U8 Reserved1; /* 0x06 */ ++ U8 MsgFlags; /* 0x07 */ ++ U8 VP_ID; /* 0x08 */ ++ U8 VF_ID; /* 0x09 */ ++ U16 Reserved2; /* 0x0A */ ++ U32 Reserved3; /* 0x0C */ ++ U16 IoIndex[2]; /* 0x10 */ ++} MPI2_TARGET_CMD_BUF_POST_LIST_REQUEST, ++ MPI2_POINTER PTR_MPI2_TARGET_CMD_BUF_POST_LIST_REQUEST, ++ Mpi2TargetCmdBufferPostListRequest_t, ++ MPI2_POINTER pMpi2TargetCmdBufferPostListRequest_t; ++ ++/**************************************************************************** ++* Target Command Buffer Post Base List Reply ++****************************************************************************/ ++ ++typedef struct _MPI2_TARGET_BUF_POST_BASE_LIST_REPLY ++{ ++ U8 Flags; /* 0x00 */ ++ U8 Reserved; /* 0x01 */ ++ U8 MsgLength; /* 0x02 */ ++ U8 Function; /* 0x03 */ ++ U16 Reserved1; /* 0x04 */ ++ U8 Reserved2; /* 0x06 */ ++ U8 MsgFlags; /* 0x07 */ ++ U8 VP_ID; /* 0x08 */ ++ U8 VF_ID; /* 0x09 */ ++ U16 Reserved3; /* 0x0A */ ++ U16 Reserved4; /* 0x0C */ ++ U16 IOCStatus; /* 0x0E */ ++ U32 IOCLogInfo; /* 0x10 */ ++ U16 IoIndex; /* 0x14 */ ++ U16 Reserved5; /* 0x16 */ ++ U32 Reserved6; /* 0x18 */ ++} MPI2_TARGET_BUF_POST_BASE_LIST_REPLY, ++ MPI2_POINTER PTR_MPI2_TARGET_BUF_POST_BASE_LIST_REPLY, ++ Mpi2TargetCmdBufferPostBaseListReply_t, ++ MPI2_POINTER pMpi2TargetCmdBufferPostBaseListReply_t; ++ ++/* Flags defines */ ++#define MPI2_CMD_BUF_POST_REPLY_IOINDEX_VALID (0x01) ++ ++ ++/**************************************************************************** ++* Command Buffer Formats (with 16 byte CDB) ++****************************************************************************/ ++ ++typedef struct _MPI2_TARGET_SSP_CMD_BUFFER ++{ ++ U8 FrameType; /* 0x00 */ ++ U8 Reserved1; /* 0x01 */ ++ U16 InitiatorConnectionTag; /* 0x02 */ ++ U32 HashedSourceSASAddress; /* 0x04 */ ++ U16 Reserved2; /* 0x08 */ ++ U16 Flags; /* 0x0A */ ++ U32 Reserved3; /* 0x0C */ ++ U16 Tag; /* 0x10 */ ++ U16 TargetPortTransferTag; /* 0x12 */ ++ U32 DataOffset; /* 0x14 */ ++ /* COMMAND information unit starts here */ ++ U8 LogicalUnitNumber[8]; /* 0x18 */ ++ U8 Reserved4; /* 0x20 */ ++ U8 TaskAttribute; /* lower 3 bits */ /* 0x21 */ ++ U8 Reserved5; /* 0x22 */ ++ U8 AdditionalCDBLength; /* upper 5 bits */ /* 0x23 */ ++ U8 CDB[16]; /* 0x24 */ ++ /* Additional CDB bytes extend past the CDB field */ ++} MPI2_TARGET_SSP_CMD_BUFFER, MPI2_POINTER PTR_MPI2_TARGET_SSP_CMD_BUFFER, ++ Mpi2TargetSspCmdBuffer, MPI2_POINTER pMp2iTargetSspCmdBuffer; ++ ++typedef struct _MPI2_TARGET_SSP_TASK_BUFFER ++{ ++ U8 FrameType; /* 0x00 */ ++ U8 Reserved1; /* 0x01 */ ++ U16 InitiatorConnectionTag; /* 0x02 */ ++ U32 HashedSourceSASAddress; /* 0x04 */ ++ U16 Reserved2; /* 0x08 */ ++ U16 Flags; /* 0x0A */ ++ U32 Reserved3; /* 0x0C */ ++ U16 Tag; /* 0x10 */ ++ U16 TargetPortTransferTag; /* 0x12 */ ++ U32 DataOffset; /* 0x14 */ ++ /* TASK information unit starts here */ ++ U8 LogicalUnitNumber[8]; /* 0x18 */ ++ U16 Reserved4; /* 0x20 */ ++ U8 TaskManagementFunction; /* 0x22 */ ++ U8 Reserved5; /* 0x23 */ ++ U16 ManagedTaskTag; /* 0x24 */ ++ U16 Reserved6; /* 0x26 */ ++ U32 Reserved7; /* 0x28 */ ++ U32 Reserved8; /* 0x2C */ ++ U32 Reserved9; /* 0x30 */ ++} MPI2_TARGET_SSP_TASK_BUFFER, MPI2_POINTER PTR_MPI2_TARGET_SSP_TASK_BUFFER, ++ Mpi2TargetSspTaskBuffer, MPI2_POINTER pMpi2TargetSspTaskBuffer; ++ ++/* mask and shift for HashedSourceSASAddress field */ ++#define MPI2_TARGET_HASHED_SAS_ADDRESS_MASK (0xFFFFFF00) ++#define MPI2_TARGET_HASHED_SAS_ADDRESS_SHIFT (8) ++ ++ ++/**************************************************************************** ++* Target Assist Request ++****************************************************************************/ ++ ++typedef struct _MPI2_TARGET_ASSIST_REQUEST ++{ ++ U8 Reserved1; /* 0x00 */ ++ U8 TargetAssistFlags; /* 0x01 */ ++ U8 ChainOffset; /* 0x02 */ ++ U8 Function; /* 0x03 */ ++ U16 QueueTag; /* 0x04 */ ++ U8 Reserved2; /* 0x06 */ ++ U8 MsgFlags; /* 0x07 */ ++ U8 VP_ID; /* 0x08 */ ++ U8 VF_ID; /* 0x09 */ ++ U16 Reserved3; /* 0x0A */ ++ U16 IoIndex; /* 0x0C */ ++ U16 InitiatorConnectionTag; /* 0x0E */ ++ U16 SGLFlags; /* 0x10 */ ++ U8 SequenceNumber; /* 0x12 */ ++ U8 Reserved4; /* 0x13 */ ++ U8 SGLOffset0; /* 0x14 */ ++ U8 SGLOffset1; /* 0x15 */ ++ U8 SGLOffset2; /* 0x16 */ ++ U8 SGLOffset3; /* 0x17 */ ++ U32 SkipCount; /* 0x18 */ ++ U32 DataLength; /* 0x1C */ ++ U32 BidirectionalDataLength; /* 0x20 */ ++ U16 IoFlags; /* 0x24 */ ++ U16 EEDPFlags; /* 0x26 */ ++ U32 EEDPBlockSize; /* 0x28 */ ++ U32 SecondaryReferenceTag; /* 0x2C */ ++ U16 SecondaryApplicationTag; /* 0x30 */ ++ U16 ApplicationTagTranslationMask; /* 0x32 */ ++ U32 PrimaryReferenceTag; /* 0x34 */ ++ U16 PrimaryApplicationTag; /* 0x38 */ ++ U16 PrimaryApplicationTagMask; /* 0x3A */ ++ U32 RelativeOffset; /* 0x3C */ ++ U32 Reserved5; /* 0x40 */ ++ U32 Reserved6; /* 0x44 */ ++ U32 Reserved7; /* 0x48 */ ++ U32 Reserved8; /* 0x4C */ ++ MPI2_SGE_IO_UNION SGL[1]; /* 0x50 */ ++} MPI2_TARGET_ASSIST_REQUEST, MPI2_POINTER PTR_MPI2_TARGET_ASSIST_REQUEST, ++ Mpi2TargetAssistRequest_t, MPI2_POINTER pMpi2TargetAssistRequest_t; ++ ++/* Target Assist TargetAssistFlags bits */ ++ ++#define MPI2_TARGET_ASSIST_FLAGS_REPOST_CMD_BUFFER (0x80) ++#define MPI2_TARGET_ASSIST_FLAGS_TLR (0x10) ++#define MPI2_TARGET_ASSIST_FLAGS_RETRANSMIT (0x04) ++#define MPI2_TARGET_ASSIST_FLAGS_AUTO_STATUS (0x02) ++#define MPI2_TARGET_ASSIST_FLAGS_DATA_DIRECTION (0x01) ++ ++/* Target Assist SGLFlags bits */ ++ ++/* base values for Data Location Address Space */ ++#define MPI2_TARGET_ASSIST_SGLFLAGS_ADDR_MASK (0x0C) ++#define MPI2_TARGET_ASSIST_SGLFLAGS_SYSTEM_ADDR (0x00) ++#define MPI2_TARGET_ASSIST_SGLFLAGS_IOCDDR_ADDR (0x04) ++#define MPI2_TARGET_ASSIST_SGLFLAGS_IOCPLB_ADDR (0x08) ++#define MPI2_TARGET_ASSIST_SGLFLAGS_PLBNTA_ADDR (0x0C) ++ ++/* base values for Type */ ++#define MPI2_TARGET_ASSIST_SGLFLAGS_TYPE_MASK (0x03) ++#define MPI2_TARGET_ASSIST_SGLFLAGS_MPI_TYPE (0x00) ++#define MPI2_TARGET_ASSIST_SGLFLAGS_32IEEE_TYPE (0x01) ++#define MPI2_TARGET_ASSIST_SGLFLAGS_64IEEE_TYPE (0x02) ++ ++/* shift values for each sub-field */ ++#define MPI2_TARGET_ASSIST_SGLFLAGS_SGL3_SHIFT (12) ++#define MPI2_TARGET_ASSIST_SGLFLAGS_SGL2_SHIFT (8) ++#define MPI2_TARGET_ASSIST_SGLFLAGS_SGL1_SHIFT (4) ++#define MPI2_TARGET_ASSIST_SGLFLAGS_SGL0_SHIFT (0) ++ ++/* Target Assist IoFlags bits */ ++ ++#define MPI2_TARGET_ASSIST_IOFLAGS_BIDIRECTIONAL (0x0800) ++#define MPI2_TARGET_ASSIST_IOFLAGS_MULTICAST (0x0400) ++#define MPI2_TARGET_ASSIST_IOFLAGS_RECEIVE_FIRST (0x0200) ++ ++/* Target Assist EEDPFlags bits */ ++ ++#define MPI2_TA_EEDPFLAGS_INC_PRI_REFTAG (0x8000) ++#define MPI2_TA_EEDPFLAGS_INC_SEC_REFTAG (0x4000) ++#define MPI2_TA_EEDPFLAGS_INC_PRI_APPTAG (0x2000) ++#define MPI2_TA_EEDPFLAGS_INC_SEC_APPTAG (0x1000) ++ ++#define MPI2_TA_EEDPFLAGS_CHECK_REFTAG (0x0400) ++#define MPI2_TA_EEDPFLAGS_CHECK_APPTAG (0x0200) ++#define MPI2_TA_EEDPFLAGS_CHECK_GUARD (0x0100) ++ ++#define MPI2_TA_EEDPFLAGS_PASSTHRU_REFTAG (0x0008) ++ ++#define MPI2_TA_EEDPFLAGS_MASK_OP (0x0007) ++#define MPI2_TA_EEDPFLAGS_NOOP_OP (0x0000) ++#define MPI2_TA_EEDPFLAGS_CHECK_OP (0x0001) ++#define MPI2_TA_EEDPFLAGS_STRIP_OP (0x0002) ++#define MPI2_TA_EEDPFLAGS_CHECK_REMOVE_OP (0x0003) ++#define MPI2_TA_EEDPFLAGS_INSERT_OP (0x0004) ++#define MPI2_TA_EEDPFLAGS_REPLACE_OP (0x0006) ++#define MPI2_TA_EEDPFLAGS_CHECK_REGEN_OP (0x0007) ++ ++ ++/**************************************************************************** ++* Target Status Send Request ++****************************************************************************/ ++ ++typedef struct _MPI2_TARGET_STATUS_SEND_REQUEST ++{ ++ U8 Reserved1; /* 0x00 */ ++ U8 StatusFlags; /* 0x01 */ ++ U8 ChainOffset; /* 0x02 */ ++ U8 Function; /* 0x03 */ ++ U16 QueueTag; /* 0x04 */ ++ U8 Reserved2; /* 0x06 */ ++ U8 MsgFlags; /* 0x07 */ ++ U8 VP_ID; /* 0x08 */ ++ U8 VF_ID; /* 0x09 */ ++ U16 Reserved3; /* 0x0A */ ++ U16 IoIndex; /* 0x0C */ ++ U16 InitiatorConnectionTag; /* 0x0E */ ++ U16 SGLFlags; /* 0x10 */ ++ U16 Reserved4; /* 0x12 */ ++ U8 SGLOffset0; /* 0x14 */ ++ U8 Reserved5; /* 0x15 */ ++ U16 Reserved6; /* 0x16 */ ++ U32 Reserved7; /* 0x18 */ ++ U32 Reserved8; /* 0x1C */ ++ MPI2_SIMPLE_SGE_UNION StatusDataSGE; /* 0x20 */ ++} MPI2_TARGET_STATUS_SEND_REQUEST, ++ MPI2_POINTER PTR_MPI2_TARGET_STATUS_SEND_REQUEST, ++ Mpi2TargetStatusSendRequest_t, MPI2_POINTER pMpi2TargetStatusSendRequest_t; ++ ++/* Target Status Send StatusFlags bits */ ++ ++#define MPI2_TSS_FLAGS_REPOST_CMD_BUFFER (0x80) ++#define MPI2_TSS_FLAGS_RETRANSMIT (0x04) ++#define MPI2_TSS_FLAGS_AUTO_GOOD_STATUS (0x01) ++ ++/* Target Status Send SGLFlags bits */ ++/* Data Location Address Space */ ++#define MPI2_TSS_SGLFLAGS_ADDR_MASK (0x0C) ++#define MPI2_TSS_SGLFLAGS_SYSTEM_ADDR (0x00) ++#define MPI2_TSS_SGLFLAGS_IOCDDR_ADDR (0x04) ++#define MPI2_TSS_SGLFLAGS_IOCPLB_ADDR (0x08) ++#define MPI2_TSS_SGLFLAGS_IOCPLBNTA_ADDR (0x0C) ++/* Type */ ++#define MPI2_TSS_SGLFLAGS_TYPE_MASK (0x03) ++#define MPI2_TSS_SGLFLAGS_MPI_TYPE (0x00) ++#define MPI2_TSS_SGLFLAGS_IEEE32_TYPE (0x01) ++#define MPI2_TSS_SGLFLAGS_IEEE64_TYPE (0x02) ++ ++ ++ ++/* ++ * NOTE: The SSP status IU is big-endian. When used on a little-endian system, ++ * this structure properly orders the bytes. ++ */ ++typedef struct _MPI2_TARGET_SSP_RSP_IU ++{ ++ U32 Reserved0[6]; /* reserved for SSP header */ /* 0x00 */ ++ /* start of RESPONSE information unit */ ++ U32 Reserved1; /* 0x18 */ ++ U32 Reserved2; /* 0x1C */ ++ U16 Reserved3; /* 0x20 */ ++ U8 DataPres; /* lower 2 bits */ /* 0x22 */ ++ U8 Status; /* 0x23 */ ++ U32 Reserved4; /* 0x24 */ ++ U32 SenseDataLength; /* 0x28 */ ++ U32 ResponseDataLength; /* 0x2C */ ++ U8 ResponseSenseData[4]; /* 0x30 */ ++} MPI2_TARGET_SSP_RSP_IU, MPI2_POINTER PTR_MPI2_TARGET_SSP_RSP_IU, ++ Mpi2TargetSspRspIu_t, MPI2_POINTER pMpi2TargetSspRspIu_t; ++ ++ ++/**************************************************************************** ++* Target Standard Reply - used with Target Assist or Target Status Send ++****************************************************************************/ ++ ++typedef struct _MPI2_TARGET_STANDARD_REPLY ++{ ++ U16 Reserved; /* 0x00 */ ++ U8 MsgLength; /* 0x02 */ ++ U8 Function; /* 0x03 */ ++ U16 Reserved1; /* 0x04 */ ++ U8 Reserved2; /* 0x06 */ ++ U8 MsgFlags; /* 0x07 */ ++ U8 VP_ID; /* 0x08 */ ++ U8 VF_ID; /* 0x09 */ ++ U16 Reserved3; /* 0x0A */ ++ U16 Reserved4; /* 0x0C */ ++ U16 IOCStatus; /* 0x0E */ ++ U32 IOCLogInfo; /* 0x10 */ ++ U16 IoIndex; /* 0x14 */ ++ U16 Reserved5; /* 0x16 */ ++ U32 TransferCount; /* 0x18 */ ++ U32 BidirectionalTransferCount; /* 0x1C */ ++} MPI2_TARGET_STANDARD_REPLY, MPI2_POINTER PTR_MPI2_TARGET_STANDARD_REPLY, ++ Mpi2TargetErrorReply_t, MPI2_POINTER pMpi2TargetErrorReply_t; ++ ++ ++/**************************************************************************** ++* Target Mode Abort Request ++****************************************************************************/ ++ ++typedef struct _MPI2_TARGET_MODE_ABORT_REQUEST ++{ ++ U8 AbortType; /* 0x00 */ ++ U8 Reserved1; /* 0x01 */ ++ U8 ChainOffset; /* 0x02 */ ++ U8 Function; /* 0x03 */ ++ U16 Reserved2; /* 0x04 */ ++ U8 Reserved3; /* 0x06 */ ++ U8 MsgFlags; /* 0x07 */ ++ U8 VP_ID; /* 0x08 */ ++ U8 VF_ID; /* 0x09 */ ++ U16 Reserved4; /* 0x0A */ ++ U16 IoIndexToAbort; /* 0x0C */ ++ U16 Reserved6; /* 0x0E */ ++ U32 MidToAbort; /* 0x10 */ ++} MPI2_TARGET_MODE_ABORT, MPI2_POINTER PTR_MPI2_TARGET_MODE_ABORT, ++ Mpi2TargetModeAbort_t, MPI2_POINTER pMpi2TargetModeAbort_t; ++ ++/* Target Mode Abort AbortType values */ ++ ++#define MPI2_TARGET_MODE_ABORT_ALL_CMD_BUFFERS (0x00) ++#define MPI2_TARGET_MODE_ABORT_ALL_IO (0x01) ++#define MPI2_TARGET_MODE_ABORT_EXACT_IO (0x02) ++#define MPI2_TARGET_MODE_ABORT_EXACT_IO_REQUEST (0x03) ++#define MPI2_TARGET_MODE_ABORT_IO_REQUEST_AND_IO (0x04) ++ ++ ++/**************************************************************************** ++* Target Mode Abort Reply ++****************************************************************************/ ++ ++typedef struct _MPI2_TARGET_MODE_ABORT_REPLY ++{ ++ U16 Reserved; /* 0x00 */ ++ U8 MsgLength; /* 0x02 */ ++ U8 Function; /* 0x03 */ ++ U16 Reserved1; /* 0x04 */ ++ U8 Reserved2; /* 0x06 */ ++ U8 MsgFlags; /* 0x07 */ ++ U8 VP_ID; /* 0x08 */ ++ U8 VF_ID; /* 0x09 */ ++ U16 Reserved3; /* 0x0A */ ++ U16 Reserved4; /* 0x0C */ ++ U16 IOCStatus; /* 0x0E */ ++ U32 IOCLogInfo; /* 0x10 */ ++ U32 AbortCount; /* 0x14 */ ++} MPI2_TARGET_MODE_ABORT_REPLY, MPI2_POINTER PTR_MPI2_TARGET_MODE_ABORT_REPLY, ++ Mpi2TargetModeAbortReply_t, MPI2_POINTER pMpi2TargetModeAbortReply_t; ++ ++ ++#endif ++ +diff -r e02b4006a7c8 drivers/scsi/mpt2sas/mpi/mpi2_tool.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/scsi/mpt2sas/mpi/mpi2_tool.h Wed Jul 01 09:49:59 2009 +0100 +@@ -0,0 +1,249 @@ ++/* ++ * Copyright (c) 2000-2008 LSI Corporation. ++ * ++ * ++ * Name: mpi2_tool.h ++ * Title: MPI diagnostic tool structures and definitions ++ * Creation Date: March 26, 2007 ++ * ++ * mpi2_tool.h Version: 02.00.02 ++ * ++ * Version History ++ * --------------- ++ * ++ * Date Version Description ++ * -------- -------- ------------------------------------------------------ ++ * 04-30-07 02.00.00 Corresponds to Fusion-MPT MPI Specification Rev A. ++ * 12-18-07 02.00.01 Added Diagnostic Buffer Post and Diagnostic Release ++ * structures and defines. ++ * 02-29-08 02.00.02 Modified various names to make them 32-character unique. ++ * -------------------------------------------------------------------------- ++ */ ++ ++#ifndef MPI2_TOOL_H ++#define MPI2_TOOL_H ++ ++/***************************************************************************** ++* ++* Toolbox Messages ++* ++*****************************************************************************/ ++ ++/* defines for the Tools */ ++#define MPI2_TOOLBOX_CLEAN_TOOL (0x00) ++#define MPI2_TOOLBOX_MEMORY_MOVE_TOOL (0x01) ++#define MPI2_TOOLBOX_BEACON_TOOL (0x05) ++ ++/**************************************************************************** ++* Toolbox reply ++****************************************************************************/ ++ ++typedef struct _MPI2_TOOLBOX_REPLY ++{ ++ U8 Tool; /* 0x00 */ ++ U8 Reserved1; /* 0x01 */ ++ U8 MsgLength; /* 0x02 */ ++ U8 Function; /* 0x03 */ ++ U16 Reserved2; /* 0x04 */ ++ U8 Reserved3; /* 0x06 */ ++ U8 MsgFlags; /* 0x07 */ ++ U8 VP_ID; /* 0x08 */ ++ U8 VF_ID; /* 0x09 */ ++ U16 Reserved4; /* 0x0A */ ++ U16 Reserved5; /* 0x0C */ ++ U16 IOCStatus; /* 0x0E */ ++ U32 IOCLogInfo; /* 0x10 */ ++} MPI2_TOOLBOX_REPLY, MPI2_POINTER PTR_MPI2_TOOLBOX_REPLY, ++ Mpi2ToolboxReply_t, MPI2_POINTER pMpi2ToolboxReply_t; ++ ++ ++/**************************************************************************** ++* Toolbox Clean Tool request ++****************************************************************************/ ++ ++typedef struct _MPI2_TOOLBOX_CLEAN_REQUEST ++{ ++ U8 Tool; /* 0x00 */ ++ U8 Reserved1; /* 0x01 */ ++ U8 ChainOffset; /* 0x02 */ ++ U8 Function; /* 0x03 */ ++ U16 Reserved2; /* 0x04 */ ++ U8 Reserved3; /* 0x06 */ ++ U8 MsgFlags; /* 0x07 */ ++ U8 VP_ID; /* 0x08 */ ++ U8 VF_ID; /* 0x09 */ ++ U16 Reserved4; /* 0x0A */ ++ U32 Flags; /* 0x0C */ ++ } MPI2_TOOLBOX_CLEAN_REQUEST, MPI2_POINTER PTR_MPI2_TOOLBOX_CLEAN_REQUEST, ++ Mpi2ToolboxCleanRequest_t, MPI2_POINTER pMpi2ToolboxCleanRequest_t; ++ ++/* values for the Flags field */ ++#define MPI2_TOOLBOX_CLEAN_BOOT_SERVICES (0x80000000) ++#define MPI2_TOOLBOX_CLEAN_PERSIST_MANUFACT_PAGES (0x40000000) ++#define MPI2_TOOLBOX_CLEAN_OTHER_PERSIST_PAGES (0x20000000) ++#define MPI2_TOOLBOX_CLEAN_FW_CURRENT (0x10000000) ++#define MPI2_TOOLBOX_CLEAN_FW_BACKUP (0x08000000) ++#define MPI2_TOOLBOX_CLEAN_MEGARAID (0x02000000) ++#define MPI2_TOOLBOX_CLEAN_INITIALIZATION (0x01000000) ++#define MPI2_TOOLBOX_CLEAN_FLASH (0x00000004) ++#define MPI2_TOOLBOX_CLEAN_SEEPROM (0x00000002) ++#define MPI2_TOOLBOX_CLEAN_NVSRAM (0x00000001) ++ ++ ++/**************************************************************************** ++* Toolbox Memory Move request ++****************************************************************************/ ++ ++typedef struct _MPI2_TOOLBOX_MEM_MOVE_REQUEST ++{ ++ U8 Tool; /* 0x00 */ ++ U8 Reserved1; /* 0x01 */ ++ U8 ChainOffset; /* 0x02 */ ++ U8 Function; /* 0x03 */ ++ U16 Reserved2; /* 0x04 */ ++ U8 Reserved3; /* 0x06 */ ++ U8 MsgFlags; /* 0x07 */ ++ U8 VP_ID; /* 0x08 */ ++ U8 VF_ID; /* 0x09 */ ++ U16 Reserved4; /* 0x0A */ ++ MPI2_SGE_SIMPLE_UNION SGL; /* 0x0C */ ++} MPI2_TOOLBOX_MEM_MOVE_REQUEST, MPI2_POINTER PTR_MPI2_TOOLBOX_MEM_MOVE_REQUEST, ++ Mpi2ToolboxMemMoveRequest_t, MPI2_POINTER pMpi2ToolboxMemMoveRequest_t; ++ ++ ++/**************************************************************************** ++* Toolbox Beacon Tool request ++****************************************************************************/ ++ ++typedef struct _MPI2_TOOLBOX_BEACON_REQUEST ++{ ++ U8 Tool; /* 0x00 */ ++ U8 Reserved1; /* 0x01 */ ++ U8 ChainOffset; /* 0x02 */ ++ U8 Function; /* 0x03 */ ++ U16 Reserved2; /* 0x04 */ ++ U8 Reserved3; /* 0x06 */ ++ U8 MsgFlags; /* 0x07 */ ++ U8 VP_ID; /* 0x08 */ ++ U8 VF_ID; /* 0x09 */ ++ U16 Reserved4; /* 0x0A */ ++ U8 Reserved5; /* 0x0C */ ++ U8 PhysicalPort; /* 0x0D */ ++ U8 Reserved6; /* 0x0E */ ++ U8 Flags; /* 0x0F */ ++} MPI2_TOOLBOX_BEACON_REQUEST, MPI2_POINTER PTR_MPI2_TOOLBOX_BEACON_REQUEST, ++ Mpi2ToolboxBeaconRequest_t, MPI2_POINTER pMpi2ToolboxBeaconRequest_t; ++ ++/* values for the Flags field */ ++#define MPI2_TOOLBOX_FLAGS_BEACONMODE_OFF (0x00) ++#define MPI2_TOOLBOX_FLAGS_BEACONMODE_ON (0x01) ++ ++ ++/***************************************************************************** ++* ++* Diagnostic Buffer Messages ++* ++*****************************************************************************/ ++ ++ ++/**************************************************************************** ++* Diagnostic Buffer Post request ++****************************************************************************/ ++ ++typedef struct _MPI2_DIAG_BUFFER_POST_REQUEST ++{ ++ U8 Reserved1; /* 0x00 */ ++ U8 BufferType; /* 0x01 */ ++ U8 ChainOffset; /* 0x02 */ ++ U8 Function; /* 0x03 */ ++ U16 Reserved2; /* 0x04 */ ++ U8 Reserved3; /* 0x06 */ ++ U8 MsgFlags; /* 0x07 */ ++ U8 VP_ID; /* 0x08 */ ++ U8 VF_ID; /* 0x09 */ ++ U16 Reserved4; /* 0x0A */ ++ U64 BufferAddress; /* 0x0C */ ++ U32 BufferLength; /* 0x14 */ ++ U32 Reserved5; /* 0x18 */ ++ U32 Reserved6; /* 0x1C */ ++ U32 Flags; /* 0x20 */ ++ U32 ProductSpecific[23]; /* 0x24 */ ++} MPI2_DIAG_BUFFER_POST_REQUEST, MPI2_POINTER PTR_MPI2_DIAG_BUFFER_POST_REQUEST, ++ Mpi2DiagBufferPostRequest_t, MPI2_POINTER pMpi2DiagBufferPostRequest_t; ++ ++/* values for the BufferType field */ ++#define MPI2_DIAG_BUF_TYPE_TRACE (0x00) ++#define MPI2_DIAG_BUF_TYPE_SNAPSHOT (0x01) ++/* count of the number of buffer types */ ++#define MPI2_DIAG_BUF_TYPE_COUNT (0x02) ++ ++ ++/**************************************************************************** ++* Diagnostic Buffer Post reply ++****************************************************************************/ ++ ++typedef struct _MPI2_DIAG_BUFFER_POST_REPLY ++{ ++ U8 Reserved1; /* 0x00 */ ++ U8 BufferType; /* 0x01 */ ++ U8 MsgLength; /* 0x02 */ ++ U8 Function; /* 0x03 */ ++ U16 Reserved2; /* 0x04 */ ++ U8 Reserved3; /* 0x06 */ ++ U8 MsgFlags; /* 0x07 */ ++ U8 VP_ID; /* 0x08 */ ++ U8 VF_ID; /* 0x09 */ ++ U16 Reserved4; /* 0x0A */ ++ U16 Reserved5; /* 0x0C */ ++ U16 IOCStatus; /* 0x0E */ ++ U32 IOCLogInfo; /* 0x10 */ ++ U32 TransferLength; /* 0x14 */ ++} MPI2_DIAG_BUFFER_POST_REPLY, MPI2_POINTER PTR_MPI2_DIAG_BUFFER_POST_REPLY, ++ Mpi2DiagBufferPostReply_t, MPI2_POINTER pMpi2DiagBufferPostReply_t; ++ ++ ++/**************************************************************************** ++* Diagnostic Release request ++****************************************************************************/ ++ ++typedef struct _MPI2_DIAG_RELEASE_REQUEST ++{ ++ U8 Reserved1; /* 0x00 */ ++ U8 BufferType; /* 0x01 */ ++ U8 ChainOffset; /* 0x02 */ ++ U8 Function; /* 0x03 */ ++ U16 Reserved2; /* 0x04 */ ++ U8 Reserved3; /* 0x06 */ ++ U8 MsgFlags; /* 0x07 */ ++ U8 VP_ID; /* 0x08 */ ++ U8 VF_ID; /* 0x09 */ ++ U16 Reserved4; /* 0x0A */ ++} MPI2_DIAG_RELEASE_REQUEST, MPI2_POINTER PTR_MPI2_DIAG_RELEASE_REQUEST, ++ Mpi2DiagReleaseRequest_t, MPI2_POINTER pMpi2DiagReleaseRequest_t; ++ ++ ++/**************************************************************************** ++* Diagnostic Buffer Post reply ++****************************************************************************/ ++ ++typedef struct _MPI2_DIAG_RELEASE_REPLY ++{ ++ U8 Reserved1; /* 0x00 */ ++ U8 BufferType; /* 0x01 */ ++ U8 MsgLength; /* 0x02 */ ++ U8 Function; /* 0x03 */ ++ U16 Reserved2; /* 0x04 */ ++ U8 Reserved3; /* 0x06 */ ++ U8 MsgFlags; /* 0x07 */ ++ U8 VP_ID; /* 0x08 */ ++ U8 VF_ID; /* 0x09 */ ++ U16 Reserved4; /* 0x0A */ ++ U16 Reserved5; /* 0x0C */ ++ U16 IOCStatus; /* 0x0E */ ++ U32 IOCLogInfo; /* 0x10 */ ++} MPI2_DIAG_RELEASE_REPLY, MPI2_POINTER PTR_MPI2_DIAG_RELEASE_REPLY, ++ Mpi2DiagReleaseReply_t, MPI2_POINTER pMpi2DiagReleaseReply_t; ++ ++ ++#endif ++ +diff -r e02b4006a7c8 drivers/scsi/mpt2sas/mpi/mpi2_type.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/scsi/mpt2sas/mpi/mpi2_type.h Wed Jul 01 09:49:59 2009 +0100 +@@ -0,0 +1,61 @@ ++/* ++ * Copyright (c) 2000-2007 LSI Corporation. ++ * ++ * ++ * Name: mpi2_type.h ++ * Title: MPI basic type definitions ++ * Creation Date: August 16, 2006 ++ * ++ * mpi2_type.h Version: 02.00.00 ++ * ++ * Version History ++ * --------------- ++ * ++ * Date Version Description ++ * -------- -------- ------------------------------------------------------ ++ * 04-30-07 02.00.00 Corresponds to Fusion-MPT MPI Specification Rev A. ++ * -------------------------------------------------------------------------- ++ */ ++ ++#ifndef MPI2_TYPE_H ++#define MPI2_TYPE_H ++ ++ ++/******************************************************************************* ++ * Define MPI2_POINTER if it hasn't already been defined. By default ++ * MPI2_POINTER is defined to be a near pointer. MPI2_POINTER can be defined as ++ * a far pointer by defining MPI2_POINTER as "far *" before this header file is ++ * included. ++ */ ++#ifndef MPI2_POINTER ++#define MPI2_POINTER * ++#endif ++ ++/* the basic types may have already been included by mpi_type.h */ ++#ifndef MPI_TYPE_H ++/***************************************************************************** ++* ++* Basic Types ++* ++*****************************************************************************/ ++ ++typedef u8 U8; ++typedef __le16 U16; ++typedef __le32 U32; ++typedef __le64 U64 __attribute__((aligned(4))); ++ ++/***************************************************************************** ++* ++* Pointer Types ++* ++*****************************************************************************/ ++ ++typedef U8 *PU8; ++typedef U16 *PU16; ++typedef U32 *PU32; ++typedef U64 *PU64; ++ ++#endif ++ ++#endif ++ +diff -r e02b4006a7c8 drivers/scsi/mpt2sas/mpt2sas_base.c +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/scsi/mpt2sas/mpt2sas_base.c Wed Jul 01 09:49:59 2009 +0100 +@@ -0,0 +1,3655 @@ ++/* ++ * This is the Fusion MPT base driver providing common API layer interface ++ * for access to MPT (Message Passing Technology) firmware. ++ * ++ * This code is based on drivers/scsi/mpt2sas/mpt2_base.c ++ * Copyright (C) 2007-2008 LSI Corporation ++ * (mailto:DL-MPTFusionLinux@lsi.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. ++ * ++ * NO WARRANTY ++ * THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR ++ * CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT ++ * LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, ++ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is ++ * solely responsible for determining the appropriateness of using and ++ * distributing the Program and assumes all risks associated with its ++ * exercise of rights under this Agreement, including but not limited to ++ * the risks and costs of program errors, damage to or loss of data, ++ * programs or equipment, and unavailability or interruption of operations. ++ ++ * DISCLAIMER OF LIABILITY ++ * NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY ++ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ++ * DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), 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 OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED ++ * HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES ++ ++ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, ++ * USA. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "mpt2sas_base.h" ++ ++static MPT_CALLBACK mpt_callbacks[MPT_MAX_CALLBACKS]; ++ ++#define FAULT_POLLING_INTERVAL 1000 /* in milliseconds */ ++#define MPT2SAS_MAX_REQUEST_QUEUE 500 /* maximum controller queue depth */ ++ ++static int max_queue_depth = -1; ++module_param(max_queue_depth, int, 0); ++MODULE_PARM_DESC(max_queue_depth, " max controller queue depth "); ++ ++static int max_sgl_entries = -1; ++module_param(max_sgl_entries, int, 0); ++MODULE_PARM_DESC(max_sgl_entries, " max sg entries "); ++ ++static int msix_disable = -1; ++module_param(msix_disable, int, 0); ++MODULE_PARM_DESC(msix_disable, " disable msix routed interrupts (default=0)"); ++ ++/** ++ * _base_fault_reset_work - workq handling ioc fault conditions ++ * @work: input argument, used to derive ioc ++ * Context: sleep. ++ * ++ * Return nothing. ++ */ ++static void ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,19)) ++_base_fault_reset_work(struct work_struct *work) ++{ ++ struct MPT2SAS_ADAPTER *ioc = ++ container_of(work, struct MPT2SAS_ADAPTER, fault_reset_work.work); ++#else ++_base_fault_reset_work(void *arg) ++{ ++ struct MPT2SAS_ADAPTER *ioc = (struct MPT2SAS_ADAPTER *)arg; ++#endif ++ unsigned long flags; ++ u32 doorbell; ++ int rc; ++ ++ spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags); ++ if (ioc->shost_recovery) ++ goto rearm_timer; ++ spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags); ++ ++ doorbell = mpt2sas_base_get_iocstate(ioc, 0); ++ if ((doorbell & MPI2_IOC_STATE_MASK) == MPI2_IOC_STATE_FAULT) { ++ rc = mpt2sas_base_hard_reset_handler(ioc, CAN_SLEEP, ++ FORCE_BIG_HAMMER); ++ printk(MPT2SAS_WARN_FMT "%s: hard reset: %s\n", ioc->name, ++ __func__, (rc == 0) ? "success" : "failed"); ++ doorbell = mpt2sas_base_get_iocstate(ioc, 0); ++ if ((doorbell & MPI2_IOC_STATE_MASK) == MPI2_IOC_STATE_FAULT) ++ mpt2sas_base_fault_info(ioc, doorbell & ++ MPI2_DOORBELL_DATA_MASK); ++ } ++ ++ spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags); ++ rearm_timer: ++ if (ioc->fault_reset_work_q) ++ queue_delayed_work(ioc->fault_reset_work_q, ++ &ioc->fault_reset_work, ++ msecs_to_jiffies(FAULT_POLLING_INTERVAL)); ++ spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags); ++} ++ ++#ifdef CONFIG_SCSI_MPT2SAS_LOGGING ++/** ++ * _base_sas_ioc_info - verbose translation of the ioc status ++ * @ioc: pointer to scsi command object ++ * @mpi_reply: reply mf payload returned from firmware ++ * @request_hdr: request mf ++ * ++ * Return nothing. ++ */ ++static void ++_base_sas_ioc_info(struct MPT2SAS_ADAPTER *ioc, MPI2DefaultReply_t *mpi_reply, ++ MPI2RequestHeader_t *request_hdr) ++{ ++ u16 ioc_status = le16_to_cpu(mpi_reply->IOCStatus) & ++ MPI2_IOCSTATUS_MASK; ++ char *desc = NULL; ++ u16 frame_sz; ++ char *func_str = NULL; ++ ++ /* SCSI_IO, RAID_PASS are handled from _scsih_scsi_ioc_info */ ++ if (request_hdr->Function == MPI2_FUNCTION_SCSI_IO_REQUEST || ++ request_hdr->Function == MPI2_FUNCTION_RAID_SCSI_IO_PASSTHROUGH || ++ request_hdr->Function == MPI2_FUNCTION_EVENT_NOTIFICATION) ++ return; ++ ++ switch (ioc_status) { ++ ++/**************************************************************************** ++* Common IOCStatus values for all replies ++****************************************************************************/ ++ ++ case MPI2_IOCSTATUS_INVALID_FUNCTION: ++ desc = "invalid function"; ++ break; ++ case MPI2_IOCSTATUS_BUSY: ++ desc = "busy"; ++ break; ++ case MPI2_IOCSTATUS_INVALID_SGL: ++ desc = "invalid sgl"; ++ break; ++ case MPI2_IOCSTATUS_INTERNAL_ERROR: ++ desc = "internal error"; ++ break; ++ case MPI2_IOCSTATUS_INVALID_VPID: ++ desc = "invalid vpid"; ++ break; ++ case MPI2_IOCSTATUS_INSUFFICIENT_RESOURCES: ++ desc = "insufficient resources"; ++ break; ++ case MPI2_IOCSTATUS_INVALID_FIELD: ++ desc = "invalid field"; ++ break; ++ case MPI2_IOCSTATUS_INVALID_STATE: ++ desc = "invalid state"; ++ break; ++ case MPI2_IOCSTATUS_OP_STATE_NOT_SUPPORTED: ++ desc = "op state not supported"; ++ break; ++ ++/**************************************************************************** ++* Config IOCStatus values ++****************************************************************************/ ++ ++ case MPI2_IOCSTATUS_CONFIG_INVALID_ACTION: ++ desc = "config invalid action"; ++ break; ++ case MPI2_IOCSTATUS_CONFIG_INVALID_TYPE: ++ desc = "config invalid type"; ++ break; ++ case MPI2_IOCSTATUS_CONFIG_INVALID_PAGE: ++ desc = "config invalid page"; ++ break; ++ case MPI2_IOCSTATUS_CONFIG_INVALID_DATA: ++ desc = "config invalid data"; ++ break; ++ case MPI2_IOCSTATUS_CONFIG_NO_DEFAULTS: ++ desc = "config no defaults"; ++ break; ++ case MPI2_IOCSTATUS_CONFIG_CANT_COMMIT: ++ desc = "config cant commit"; ++ break; ++ ++/**************************************************************************** ++* SCSI IO Reply ++****************************************************************************/ ++ ++ case MPI2_IOCSTATUS_SCSI_RECOVERED_ERROR: ++ case MPI2_IOCSTATUS_SCSI_INVALID_DEVHANDLE: ++ case MPI2_IOCSTATUS_SCSI_DEVICE_NOT_THERE: ++ case MPI2_IOCSTATUS_SCSI_DATA_OVERRUN: ++ case MPI2_IOCSTATUS_SCSI_DATA_UNDERRUN: ++ case MPI2_IOCSTATUS_SCSI_IO_DATA_ERROR: ++ case MPI2_IOCSTATUS_SCSI_PROTOCOL_ERROR: ++ case MPI2_IOCSTATUS_SCSI_TASK_TERMINATED: ++ case MPI2_IOCSTATUS_SCSI_RESIDUAL_MISMATCH: ++ case MPI2_IOCSTATUS_SCSI_TASK_MGMT_FAILED: ++ case MPI2_IOCSTATUS_SCSI_IOC_TERMINATED: ++ case MPI2_IOCSTATUS_SCSI_EXT_TERMINATED: ++ break; ++ ++/**************************************************************************** ++* For use by SCSI Initiator and SCSI Target end-to-end data protection ++****************************************************************************/ ++ ++#if defined(EEDP_SUPPORT) ++ case MPI2_IOCSTATUS_EEDP_GUARD_ERROR: ++ desc = "eedp guard error"; ++ break; ++ case MPI2_IOCSTATUS_EEDP_REF_TAG_ERROR: ++ desc = "eedp ref tag error"; ++ break; ++ case MPI2_IOCSTATUS_EEDP_APP_TAG_ERROR: ++ desc = "eedp app tag error"; ++ break; ++#endif /* EEDP Support */ ++ ++/**************************************************************************** ++* SCSI Target values ++****************************************************************************/ ++ ++ case MPI2_IOCSTATUS_TARGET_INVALID_IO_INDEX: ++ desc = "target invalid io index"; ++ break; ++ case MPI2_IOCSTATUS_TARGET_ABORTED: ++ desc = "target aborted"; ++ break; ++ case MPI2_IOCSTATUS_TARGET_NO_CONN_RETRYABLE: ++ desc = "target no conn retryable"; ++ break; ++ case MPI2_IOCSTATUS_TARGET_NO_CONNECTION: ++ desc = "target no connection"; ++ break; ++ case MPI2_IOCSTATUS_TARGET_XFER_COUNT_MISMATCH: ++ desc = "target xfer count mismatch"; ++ break; ++ case MPI2_IOCSTATUS_TARGET_DATA_OFFSET_ERROR: ++ desc = "target data offset error"; ++ break; ++ case MPI2_IOCSTATUS_TARGET_TOO_MUCH_WRITE_DATA: ++ desc = "target too much write data"; ++ break; ++ case MPI2_IOCSTATUS_TARGET_IU_TOO_SHORT: ++ desc = "target iu too short"; ++ break; ++ case MPI2_IOCSTATUS_TARGET_ACK_NAK_TIMEOUT: ++ desc = "target ack nak timeout"; ++ break; ++ case MPI2_IOCSTATUS_TARGET_NAK_RECEIVED: ++ desc = "target nak received"; ++ break; ++ ++/**************************************************************************** ++* Serial Attached SCSI values ++****************************************************************************/ ++ ++ case MPI2_IOCSTATUS_SAS_SMP_REQUEST_FAILED: ++ desc = "smp request failed"; ++ break; ++ case MPI2_IOCSTATUS_SAS_SMP_DATA_OVERRUN: ++ desc = "smp data overrun"; ++ break; ++ ++/**************************************************************************** ++* Diagnostic Buffer Post / Diagnostic Release values ++****************************************************************************/ ++ ++ case MPI2_IOCSTATUS_DIAGNOSTIC_RELEASED: ++ desc = "diagnostic released"; ++ break; ++ default: ++ break; ++ } ++ ++ if (!desc) ++ return; ++ ++ switch (request_hdr->Function) { ++ case MPI2_FUNCTION_CONFIG: ++ frame_sz = sizeof(Mpi2ConfigRequest_t) + ioc->sge_size; ++ func_str = "config_page"; ++ break; ++ case MPI2_FUNCTION_SCSI_TASK_MGMT: ++ frame_sz = sizeof(Mpi2SCSITaskManagementRequest_t); ++ func_str = "task_mgmt"; ++ break; ++ case MPI2_FUNCTION_SAS_IO_UNIT_CONTROL: ++ frame_sz = sizeof(Mpi2SasIoUnitControlRequest_t); ++ func_str = "sas_iounit_ctl"; ++ break; ++ case MPI2_FUNCTION_SCSI_ENCLOSURE_PROCESSOR: ++ frame_sz = sizeof(Mpi2SepRequest_t); ++ func_str = "enclosure"; ++ break; ++ case MPI2_FUNCTION_IOC_INIT: ++ frame_sz = sizeof(Mpi2IOCInitRequest_t); ++ func_str = "ioc_init"; ++ break; ++ case MPI2_FUNCTION_PORT_ENABLE: ++ frame_sz = sizeof(Mpi2PortEnableRequest_t); ++ func_str = "port_enable"; ++ break; ++ case MPI2_FUNCTION_SMP_PASSTHROUGH: ++ frame_sz = sizeof(Mpi2SmpPassthroughRequest_t) + ioc->sge_size; ++ func_str = "smp_passthru"; ++ break; ++ default: ++ frame_sz = 32; ++ func_str = "unknown"; ++ break; ++ } ++ ++ printk(MPT2SAS_WARN_FMT "ioc_status: %s(0x%04x), request(0x%p)," ++ " (%s)\n", ioc->name, desc, ioc_status, request_hdr, func_str); ++ ++ _debug_dump_mf(request_hdr, frame_sz/4); ++} ++ ++/** ++ * _base_display_event_data - verbose translation of firmware asyn events ++ * @ioc: pointer to scsi command object ++ * @mpi_reply: reply mf payload returned from firmware ++ * ++ * Return nothing. ++ */ ++static void ++_base_display_event_data(struct MPT2SAS_ADAPTER *ioc, ++ Mpi2EventNotificationReply_t *mpi_reply) ++{ ++ char *desc = NULL; ++ u16 event; ++ ++ if (!(ioc->logging_level & MPT_DEBUG_EVENTS)) ++ return; ++ ++ event = le16_to_cpu(mpi_reply->Event); ++ ++ switch (event) { ++ case MPI2_EVENT_LOG_DATA: ++ desc = "Log Data"; ++ break; ++ case MPI2_EVENT_STATE_CHANGE: ++ desc = "Status Change"; ++ break; ++ case MPI2_EVENT_HARD_RESET_RECEIVED: ++ desc = "Hard Reset Received"; ++ break; ++ case MPI2_EVENT_EVENT_CHANGE: ++ desc = "Event Change"; ++ break; ++ case MPI2_EVENT_TASK_SET_FULL: ++ desc = "Task Set Full"; ++ break; ++ case MPI2_EVENT_SAS_DEVICE_STATUS_CHANGE: ++ desc = "Device Status Change"; ++ break; ++ case MPI2_EVENT_IR_OPERATION_STATUS: ++ desc = "IR Operation Status"; ++ break; ++ case MPI2_EVENT_SAS_DISCOVERY: ++ desc = "Discovery"; ++ break; ++ case MPI2_EVENT_SAS_BROADCAST_PRIMITIVE: ++ desc = "SAS Broadcast Primitive"; ++ break; ++ case MPI2_EVENT_SAS_INIT_DEVICE_STATUS_CHANGE: ++ desc = "SAS Init Device Status Change"; ++ break; ++ case MPI2_EVENT_SAS_INIT_TABLE_OVERFLOW: ++ desc = "SAS Init Table Overflow"; ++ break; ++ case MPI2_EVENT_SAS_TOPOLOGY_CHANGE_LIST: ++ desc = "SAS Topology Change List"; ++ break; ++ case MPI2_EVENT_SAS_ENCL_DEVICE_STATUS_CHANGE: ++ desc = "SAS Enclosure Device Status Change"; ++ break; ++ case MPI2_EVENT_IR_VOLUME: ++ desc = "IR Volume"; ++ break; ++ case MPI2_EVENT_IR_PHYSICAL_DISK: ++ desc = "IR Physical Disk"; ++ break; ++ case MPI2_EVENT_IR_CONFIGURATION_CHANGE_LIST: ++ desc = "IR Configuration Change List"; ++ break; ++ case MPI2_EVENT_LOG_ENTRY_ADDED: ++ desc = "Log Entry Added"; ++ break; ++ } ++ ++ if (!desc) ++ return; ++ ++ printk(MPT2SAS_INFO_FMT "%s\n", ioc->name, desc); ++} ++#endif ++ ++/** ++ * _base_sas_log_info - verbose translation of firmware log info ++ * @ioc: pointer to scsi command object ++ * @log_info: log info ++ * ++ * Return nothing. ++ */ ++static void ++_base_sas_log_info(struct MPT2SAS_ADAPTER *ioc , u32 log_info) ++{ ++ union loginfo_type { ++ u32 loginfo; ++ struct { ++ u32 subcode:16; ++ u32 code:8; ++ u32 originator:4; ++ u32 bus_type:4; ++ } dw; ++ }; ++ union loginfo_type sas_loginfo; ++ char *originator_str = NULL; ++ ++ sas_loginfo.loginfo = log_info; ++ if (sas_loginfo.dw.bus_type != 3 /*SAS*/) ++ return; ++ ++ /* each nexus loss loginfo */ ++ if (log_info == 0x31170000) ++ return; ++ ++ /* eat the loginfos associated with task aborts */ ++ if (ioc->ignore_loginfos && (log_info == 30050000 || log_info == ++ 0x31140000 || log_info == 0x31130000)) ++ return; ++ ++ switch (sas_loginfo.dw.originator) { ++ case 0: ++ originator_str = "IOP"; ++ break; ++ case 1: ++ originator_str = "PL"; ++ break; ++ case 2: ++ originator_str = "IR"; ++ break; ++ } ++ ++ printk(MPT2SAS_WARN_FMT "log_info(0x%08x): originator(%s), " ++ "code(0x%02x), sub_code(0x%04x)\n", ioc->name, log_info, ++ originator_str, sas_loginfo.dw.code, ++ sas_loginfo.dw.subcode); ++} ++ ++/** ++ * mpt2sas_base_fault_info - verbose translation of firmware FAULT code ++ * @ioc: pointer to scsi command object ++ * @fault_code: fault code ++ * ++ * Return nothing. ++ */ ++void ++mpt2sas_base_fault_info(struct MPT2SAS_ADAPTER *ioc , u16 fault_code) ++{ ++ printk(MPT2SAS_ERR_FMT "fault_state(0x%04x)!\n", ++ ioc->name, fault_code); ++} ++ ++/** ++ * _base_display_reply_info - ++ * @ioc: pointer to scsi command object ++ * @smid: system request message index ++ * @VF_ID: virtual function id ++ * @reply: reply message frame(lower 32bit addr) ++ * ++ * Return nothing. ++ */ ++static void ++_base_display_reply_info(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 VF_ID, ++ u32 reply) ++{ ++ MPI2DefaultReply_t *mpi_reply; ++ u16 ioc_status; ++ ++ mpi_reply = mpt2sas_base_get_reply_virt_addr(ioc, reply); ++ ioc_status = le16_to_cpu(mpi_reply->IOCStatus); ++#ifdef CONFIG_SCSI_MPT2SAS_LOGGING ++ if ((ioc_status & MPI2_IOCSTATUS_MASK) && ++ (ioc->logging_level & MPT_DEBUG_REPLY)) { ++ _base_sas_ioc_info(ioc , mpi_reply, ++ mpt2sas_base_get_msg_frame(ioc, smid)); ++ } ++#endif ++ if (ioc_status & MPI2_IOCSTATUS_FLAG_LOG_INFO_AVAILABLE) ++ _base_sas_log_info(ioc, le32_to_cpu(mpi_reply->IOCLogInfo)); ++} ++ ++/** ++ * mpt2sas_base_done - base internal command completion routine ++ * @ioc: pointer to scsi command object ++ * @smid: system request message index ++ * @VF_ID: virtual function id ++ * @reply: reply message frame(lower 32bit addr) ++ * ++ * Return nothing. ++ */ ++void ++mpt2sas_base_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 VF_ID, u32 reply) ++{ ++ MPI2DefaultReply_t *mpi_reply; ++ ++ mpi_reply = mpt2sas_base_get_reply_virt_addr(ioc, reply); ++ if (mpi_reply && mpi_reply->Function == MPI2_FUNCTION_EVENT_ACK) ++ return; ++ ++ if (ioc->base_cmds.status == MPT2_CMD_NOT_USED) ++ return; ++ ++ ioc->base_cmds.status |= MPT2_CMD_COMPLETE; ++ if (mpi_reply) { ++ ioc->base_cmds.status |= MPT2_CMD_REPLY_VALID; ++ memcpy(ioc->base_cmds.reply, mpi_reply, mpi_reply->MsgLength*4); ++ } ++ ioc->base_cmds.status &= ~MPT2_CMD_PENDING; ++ complete(&ioc->base_cmds.done); ++} ++ ++/** ++ * _base_async_event - main callback handler for firmware asyn events ++ * @ioc: pointer to scsi command object ++ * @VF_ID: virtual function id ++ * @reply: reply message frame(lower 32bit addr) ++ * ++ * Return nothing. ++ */ ++static void ++_base_async_event(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID, u32 reply) ++{ ++ Mpi2EventNotificationReply_t *mpi_reply; ++ Mpi2EventAckRequest_t *ack_request; ++ u16 smid; ++ ++ mpi_reply = mpt2sas_base_get_reply_virt_addr(ioc, reply); ++ if (!mpi_reply) ++ return; ++ if (mpi_reply->Function != MPI2_FUNCTION_EVENT_NOTIFICATION) ++ return; ++#ifdef CONFIG_SCSI_MPT2SAS_LOGGING ++ _base_display_event_data(ioc, mpi_reply); ++#endif ++ if (!(mpi_reply->AckRequired & MPI2_EVENT_NOTIFICATION_ACK_REQUIRED)) ++ goto out; ++ smid = mpt2sas_base_get_smid(ioc, ioc->base_cb_idx); ++ if (!smid) { ++ printk(MPT2SAS_ERR_FMT "%s: failed obtaining a smid\n", ++ ioc->name, __func__); ++ goto out; ++ } ++ ++ ack_request = mpt2sas_base_get_msg_frame(ioc, smid); ++ memset(ack_request, 0, sizeof(Mpi2EventAckRequest_t)); ++ ack_request->Function = MPI2_FUNCTION_EVENT_ACK; ++ ack_request->Event = mpi_reply->Event; ++ ack_request->EventContext = mpi_reply->EventContext; ++ ack_request->VF_ID = VF_ID; ++ mpt2sas_base_put_smid_default(ioc, smid, VF_ID); ++ ++ out: ++ ++ /* scsih callback handler */ ++ mpt2sas_scsih_event_callback(ioc, VF_ID, reply); ++ ++ /* ctl callback handler */ ++ mpt2sas_ctl_event_callback(ioc, VF_ID, reply); ++} ++ ++/** ++ * _base_mask_interrupts - disable interrupts ++ * @ioc: pointer to scsi command object ++ * ++ * Disabling ResetIRQ, Reply and Doorbell Interrupts ++ * ++ * Return nothing. ++ */ ++static void ++_base_mask_interrupts(struct MPT2SAS_ADAPTER *ioc) ++{ ++ u32 him_register; ++ ++ ioc->mask_interrupts = 1; ++ him_register = readl(&ioc->chip->HostInterruptMask); ++ him_register |= MPI2_HIM_DIM + MPI2_HIM_RIM + MPI2_HIM_RESET_IRQ_MASK; ++ writel(him_register, &ioc->chip->HostInterruptMask); ++ readl(&ioc->chip->HostInterruptMask); ++} ++ ++/** ++ * _base_unmask_interrupts - enable interrupts ++ * @ioc: pointer to scsi command object ++ * ++ * Enabling only Reply Interrupts ++ * ++ * Return nothing. ++ */ ++static void ++_base_unmask_interrupts(struct MPT2SAS_ADAPTER *ioc) ++{ ++ u32 him_register; ++ ++ writel(0, &ioc->chip->HostInterruptStatus); ++ him_register = readl(&ioc->chip->HostInterruptMask); ++ him_register &= ~MPI2_HIM_RIM; ++ writel(him_register, &ioc->chip->HostInterruptMask); ++ ioc->mask_interrupts = 0; ++} ++ ++union reply_descriptor { ++ u64 word; ++ struct { ++ u32 low; ++ u32 high; ++ } u; ++}; ++ ++/** ++ * _base_interrupt - MPT adapter (IOC) specific interrupt handler. ++ * @irq: irq number (not used) ++ * @bus_id: bus identifier cookie == pointer to MPT_ADAPTER structure ++ * @r: pt_regs pointer (not used) ++ * ++ * Return IRQ_HANDLE if processed, else IRQ_NONE. ++ */ ++static irqreturn_t ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,18)) ++_base_interrupt(int irq, void *bus_id) ++#else ++_base_interrupt(int irq, void *bus_id, struct pt_regs *r) ++#endif ++{ ++ union reply_descriptor rd; ++ u32 completed_cmds; ++ u8 request_desript_type; ++ u16 smid; ++ u8 cb_idx; ++ u32 reply; ++ u8 VF_ID; ++ struct MPT2SAS_ADAPTER *ioc = bus_id; ++ Mpi2ReplyDescriptorsUnion_t *rpf; ++ ++ if (ioc->mask_interrupts) ++ return IRQ_NONE; ++ ++ rpf = &ioc->reply_post_free[ioc->reply_post_host_index]; ++ request_desript_type = rpf->Default.ReplyFlags ++ & MPI2_RPY_DESCRIPT_FLAGS_TYPE_MASK; ++ if (request_desript_type == MPI2_RPY_DESCRIPT_FLAGS_UNUSED) ++ return IRQ_NONE; ++ ++ completed_cmds = 0; ++ do { ++ rd.word = rpf->Words; ++ if (rd.u.low == UINT_MAX || rd.u.high == UINT_MAX) ++ goto out; ++ reply = 0; ++ cb_idx = 0xFF; ++ smid = le16_to_cpu(rpf->Default.DescriptorTypeDependent1); ++ VF_ID = rpf->Default.VF_ID; ++ if (request_desript_type == ++ MPI2_RPY_DESCRIPT_FLAGS_ADDRESS_REPLY) { ++ reply = le32_to_cpu(rpf->AddressReply.ReplyFrameAddress); ++ } else if (request_desript_type == ++ MPI2_RPY_DESCRIPT_FLAGS_TARGET_COMMAND_BUFFER) { ++#if defined(TARGET_MODE) ++ mpt2sas_stmapp_target_command(ioc, ++ le16_to_cpu(rpf->TargetCommandBuffer.IoIndex), ++ le16_to_cpu(rpf->TargetCommandBuffer.InitiatorDevHandle), ++ rpf->TargetCommandBuffer.VP_ID, ++ rpf->TargetCommandBuffer.VF_ID, ++ rpf->TargetCommandBuffer.Flags & ++ MPI2_RPY_DESCRIPT_TCB_FLAGS_PHYNUM_MASK); ++#endif ++ goto next; ++ } else if (request_desript_type == ++ MPI2_RPY_DESCRIPT_FLAGS_TARGETASSIST_SUCCESS) { ++#if defined(TARGET_MODE) ++ mpt2sas_stm_target_assist_success_reply(ioc, ++ le16_to_cpu(rpf->TargetAssistSuccess.SMID), ++ rpf->TargetAssistSuccess.VF_ID, ++ le16_to_cpu(rpf->TargetAssistSuccess.IoIndex), ++ rpf->TargetAssistSuccess.SequenceNumber); ++ mpt2sas_base_free_smid(ioc, smid); ++#endif ++ goto next; ++ } ++ if (smid) ++ cb_idx = ioc->scsi_lookup[smid - 1].cb_idx; ++ if (smid && cb_idx != 0xFF) { ++ mpt_callbacks[cb_idx](ioc, smid, VF_ID, reply); ++ if (reply) ++ _base_display_reply_info(ioc, smid, VF_ID, ++ reply); ++ mpt2sas_base_free_smid(ioc, smid); ++ } ++ if (!smid) { ++#if defined(TARGET_MODE) ++ mpt2sas_stm_zero_smid_handler(ioc, VF_ID, reply); ++#endif ++ _base_async_event(ioc, VF_ID, reply); ++ } ++ ++ /* reply free queue handling */ ++ if (reply) { ++ ioc->reply_free_host_index = ++ (ioc->reply_free_host_index == ++ (ioc->reply_free_queue_depth - 1)) ? ++ 0 : ioc->reply_free_host_index + 1; ++ ioc->reply_free[ioc->reply_free_host_index] = ++ cpu_to_le32(reply); ++ wmb(); ++ writel(ioc->reply_free_host_index, ++ &ioc->chip->ReplyFreeHostIndex); ++ } ++ ++ next: ++ ++ rpf->Words = ULLONG_MAX; ++ ioc->reply_post_host_index = (ioc->reply_post_host_index == ++ (ioc->reply_post_queue_depth - 1)) ? 0 : ++ ioc->reply_post_host_index + 1; ++ request_desript_type = ++ ioc->reply_post_free[ioc->reply_post_host_index].Default. ++ ReplyFlags & MPI2_RPY_DESCRIPT_FLAGS_TYPE_MASK; ++ completed_cmds++; ++ if (request_desript_type == MPI2_RPY_DESCRIPT_FLAGS_UNUSED) ++ goto out; ++ if (!ioc->reply_post_host_index) ++ rpf = ioc->reply_post_free; ++ else ++ rpf++; ++ } while (1); ++ ++ out: ++ ++ if (!completed_cmds) ++ return IRQ_NONE; ++ ++ wmb(); ++ writel(ioc->reply_post_host_index, &ioc->chip->ReplyPostHostIndex); ++ return IRQ_HANDLED; ++} ++ ++/** ++ * mpt2sas_base_release_callback_handler - clear interupt callback handler ++ * @cb_idx: callback index ++ * ++ * Return nothing. ++ */ ++void ++mpt2sas_base_release_callback_handler(u8 cb_idx) ++{ ++ mpt_callbacks[cb_idx] = NULL; ++} ++ ++/** ++ * mpt2sas_base_register_callback_handler - obtain index for the ISR handler ++ * @cb_func: callback function ++ * ++ * Returns cb_func. ++ */ ++u8 ++mpt2sas_base_register_callback_handler(MPT_CALLBACK cb_func) ++{ ++ u8 cb_idx; ++ ++ for (cb_idx = MPT_MAX_CALLBACKS-1; cb_idx; cb_idx--) ++ if (mpt_callbacks[cb_idx] == NULL) ++ break; ++ ++ mpt_callbacks[cb_idx] = cb_func; ++ return cb_idx; ++} ++ ++/** ++ * mpt2sas_base_initialize_callback_handler - initialize the ISR handler ++ * ++ * Return nothing. ++ */ ++void ++mpt2sas_base_initialize_callback_handler(void) ++{ ++ u8 cb_idx; ++ ++ for (cb_idx = 0; cb_idx < MPT_MAX_CALLBACKS; cb_idx++) ++ mpt2sas_base_release_callback_handler(cb_idx); ++} ++ ++/** ++ * mpt2sas_base_build_zero_len_sge - build zero length sg entry ++ * @ioc: per adapter object ++ * @paddr: virtual address for SGE ++ * ++ * Create a zero length scatter gather entry to insure the IOCs hardware has ++ * something to use if the target device goes brain dead and tries ++ * to send data even when none is asked for. ++ * ++ * Return nothing. ++ */ ++void ++mpt2sas_base_build_zero_len_sge(struct MPT2SAS_ADAPTER *ioc, void *paddr) ++{ ++ u32 flags_length = (u32)((MPI2_SGE_FLAGS_LAST_ELEMENT | ++ MPI2_SGE_FLAGS_END_OF_BUFFER | MPI2_SGE_FLAGS_END_OF_LIST | ++ MPI2_SGE_FLAGS_SIMPLE_ELEMENT) << ++ MPI2_SGE_FLAGS_SHIFT); ++ ioc->base_add_sg_single(paddr, flags_length, -1); ++} ++ ++/** ++ * _base_add_sg_single_32 - Place a simple 32 bit SGE at address pAddr. ++ * @paddr: virtual address for SGE ++ * @flags_length: SGE flags and data transfer length ++ * @dma_addr: Physical address ++ * ++ * Return nothing. ++ */ ++static void ++_base_add_sg_single_32(void *paddr, u32 flags_length, dma_addr_t dma_addr) ++{ ++ Mpi2SGESimple32_t *sgel = paddr; ++ ++ flags_length |= (MPI2_SGE_FLAGS_32_BIT_ADDRESSING | ++ MPI2_SGE_FLAGS_SYSTEM_ADDRESS) << MPI2_SGE_FLAGS_SHIFT; ++ sgel->FlagsLength = cpu_to_le32(flags_length); ++ sgel->Address = cpu_to_le32(dma_addr); ++} ++ ++ ++/** ++ * _base_add_sg_single_64 - Place a simple 64 bit SGE at address pAddr. ++ * @paddr: virtual address for SGE ++ * @flags_length: SGE flags and data transfer length ++ * @dma_addr: Physical address ++ * ++ * Return nothing. ++ */ ++static void ++_base_add_sg_single_64(void *paddr, u32 flags_length, dma_addr_t dma_addr) ++{ ++ Mpi2SGESimple64_t *sgel = paddr; ++ ++ flags_length |= (MPI2_SGE_FLAGS_64_BIT_ADDRESSING | ++ MPI2_SGE_FLAGS_SYSTEM_ADDRESS) << MPI2_SGE_FLAGS_SHIFT; ++ sgel->FlagsLength = cpu_to_le32(flags_length); ++ sgel->Address = cpu_to_le64(dma_addr); ++} ++ ++#define convert_to_kb(x) ((x) << (PAGE_SHIFT - 10)) ++ ++/** ++ * _base_config_dma_addressing - set dma addressing ++ * @ioc: per adapter object ++ * @pdev: PCI device struct ++ * ++ * Returns 0 for success, non-zero for failure. ++ */ ++static int ++_base_config_dma_addressing(struct MPT2SAS_ADAPTER *ioc, struct pci_dev *pdev) ++{ ++ struct sysinfo s; ++ char *desc = NULL; ++ ++ if (sizeof(dma_addr_t) > 4) { ++ uint64_t required_mask; ++ ++ /* have to first set mask to 64 to find max mask required */ ++ if (pci_set_dma_mask(pdev, DMA_64BIT_MASK) != 0) ++ goto try_32bit; ++ ++ required_mask = dma_get_required_mask(&pdev->dev); ++ ++ if (required_mask > DMA_32BIT_MASK && ++ !pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK)) { ++ ioc->base_add_sg_single = &_base_add_sg_single_64; ++ ioc->sge_size = sizeof(Mpi2SGESimple64_t); ++ desc = "64"; ++ goto out; ++ } ++ } ++ ++ try_32bit: ++ ++ if (!pci_set_dma_mask(pdev, DMA_32BIT_MASK) && ++ !pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK)) { ++ ioc->base_add_sg_single = &_base_add_sg_single_32; ++ ioc->sge_size = sizeof(Mpi2SGESimple32_t); ++ desc = "32"; ++ } else ++ return -ENODEV; ++ ++ out: ++ si_meminfo(&s); ++ printk(MPT2SAS_INFO_FMT "%s BIT PCI BUS DMA ADDRESSING SUPPORTED, " ++ "total mem (%ld kB)\n", ioc->name, desc, convert_to_kb(s.totalram)); ++ ++ return 0; ++} ++ ++/** ++ * _base_save_msix_table - backup msix vector table ++ * @ioc: per adapter object ++ * ++ * This address an errata where diag reset clears out the table ++ */ ++static void ++_base_save_msix_table(struct MPT2SAS_ADAPTER *ioc) ++{ ++ int i; ++ ++ if (!ioc->msix_enable || ioc->msix_table_backup == NULL) ++ return; ++ ++ for (i = 0; i < ioc->msix_vector_count; i++) ++ ioc->msix_table_backup[i] = ioc->msix_table[i]; ++} ++ ++/** ++ * _base_restore_msix_table - this restores the msix vector table ++ * @ioc: per adapter object ++ * ++ */ ++static void ++_base_restore_msix_table(struct MPT2SAS_ADAPTER *ioc) ++{ ++ int i; ++ ++ if (!ioc->msix_enable || ioc->msix_table_backup == NULL) ++ return; ++ ++ for (i = 0; i < ioc->msix_vector_count; i++) ++ ioc->msix_table[i] = ioc->msix_table_backup[i]; ++} ++ ++/** ++ * _base_check_enable_msix - checks MSIX capabable. ++ * @ioc: per adapter object ++ * ++ * Check to see if card is capable of MSIX, and set number ++ * of avaliable msix vectors ++ */ ++static int ++_base_check_enable_msix(struct MPT2SAS_ADAPTER *ioc) ++{ ++ int base; ++ u16 message_control; ++ u32 msix_table_offset; ++ ++ base = pci_find_capability(ioc->pdev, PCI_CAP_ID_MSIX); ++ if (!base) { ++ dfailprintk(ioc, printk(MPT2SAS_INFO_FMT "msix not " ++ "supported\n", ioc->name)); ++ return -EINVAL; ++ } ++ ++ /* get msix vector count */ ++ pci_read_config_word(ioc->pdev, base + 2, &message_control); ++ ioc->msix_vector_count = (message_control & 0x3FF) + 1; ++ ++ /* get msix table */ ++ pci_read_config_dword(ioc->pdev, base + 4, &msix_table_offset); ++ msix_table_offset &= 0xFFFFFFF8; ++ ioc->msix_table = (u32 *)((void *)ioc->chip + msix_table_offset); ++ ++ dinitprintk(ioc, printk(MPT2SAS_INFO_FMT "msix is supported, " ++ "vector_count(%d), table_offset(0x%08x), table(%p)\n", ioc->name, ++ ioc->msix_vector_count, msix_table_offset, ioc->msix_table)); ++ return 0; ++} ++ ++/** ++ * _base_disable_msix - disables msix ++ * @ioc: per adapter object ++ * ++ */ ++static void ++_base_disable_msix(struct MPT2SAS_ADAPTER *ioc) ++{ ++ if (ioc->msix_enable) { ++ pci_disable_msix(ioc->pdev); ++ kfree(ioc->msix_table_backup); ++ ioc->msix_table_backup = NULL; ++ ioc->msix_enable = 0; ++ } ++} ++ ++/** ++ * _base_enable_msix - enables msix, failback to io_apic ++ * @ioc: per adapter object ++ * ++ */ ++static int ++_base_enable_msix(struct MPT2SAS_ADAPTER *ioc) ++{ ++ struct msix_entry entries; ++ int r; ++ u8 try_msix = 0; ++ ++ if (msix_disable == -1 || msix_disable == 0) ++ try_msix = 1; ++ ++ if (!try_msix) ++ goto try_ioapic; ++ ++ if (_base_check_enable_msix(ioc) != 0) ++ goto try_ioapic; ++ ++ ioc->msix_table_backup = kcalloc(ioc->msix_vector_count, ++ sizeof(u32), GFP_KERNEL); ++ if (!ioc->msix_table_backup) { ++ dfailprintk(ioc, printk(MPT2SAS_INFO_FMT "allocation for " ++ "msix_table_backup failed!!!\n", ioc->name)); ++ goto try_ioapic; ++ } ++ ++ memset(&entries, 0, sizeof(struct msix_entry)); ++ r = pci_enable_msix(ioc->pdev, &entries, 1); ++ if (r) { ++ dfailprintk(ioc, printk(MPT2SAS_INFO_FMT "pci_enable_msix " ++ "failed (r=%d) !!!\n", ioc->name, r)); ++ goto try_ioapic; ++ } ++ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,18)) ++ r = request_irq(entries.vector, _base_interrupt, IRQF_SHARED, ++ ioc->name, ioc); ++#else ++ r = request_irq(entries.vector, _base_interrupt, SA_SHIRQ, ++ ioc->name, ioc); ++#endif ++ if (r) { ++ dfailprintk(ioc, printk(MPT2SAS_INFO_FMT "unable to allocate " ++ "interrupt %d !!!\n", ioc->name, entries.vector)); ++ pci_disable_msix(ioc->pdev); ++ goto try_ioapic; ++ } ++ ++ ioc->pci_irq = entries.vector; ++ ioc->msix_enable = 1; ++ return 0; ++ ++/* failback to io_apic interrupt routing */ ++ try_ioapic: ++ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,18)) ++ r = request_irq(ioc->pdev->irq, _base_interrupt, IRQF_SHARED, ++ ioc->name, ioc); ++#else ++ r = request_irq(ioc->pdev->irq, _base_interrupt, SA_SHIRQ, ioc->name, ++ ioc); ++#endif ++ if (r) { ++ printk(MPT2SAS_ERR_FMT "unable to allocate interrupt %d!\n", ++ ioc->name, ioc->pdev->irq); ++ r = -EBUSY; ++ goto out_fail; ++ } ++ ++ ioc->pci_irq = ioc->pdev->irq; ++ return 0; ++ ++ out_fail: ++ return r; ++} ++ ++/** ++ * mpt2sas_base_map_resources - map in controller resources (io/irq/memap) ++ * @ioc: per adapter object ++ * ++ * Returns 0 for success, non-zero for failure. ++ */ ++int ++mpt2sas_base_map_resources(struct MPT2SAS_ADAPTER *ioc) ++{ ++ struct pci_dev *pdev = ioc->pdev; ++ u32 memap_sz; ++ u32 pio_sz; ++ int i, r = 0; ++ ++ dinitprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s\n", ++ ioc->name, __func__)); ++ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21)) ++ if (pci_enable_device(pdev)) { ++ printk(MPT2SAS_WARN_FMT "pci_enable_device: failed\n", ++ ioc->name); ++ return -ENODEV; ++ } ++ ++ if (pci_request_regions(pdev, MPT2SAS_DRIVER_NAME)) { ++ printk(MPT2SAS_WARN_FMT "pci_request_regions: failed\n", ++ ioc->name); ++ r = -ENODEV; ++ goto out_fail; ++ } ++#else ++ ioc->bars = pci_select_bars(pdev, IORESOURCE_MEM); ++ if (pci_enable_device_mem(pdev)) { ++ printk(MPT2SAS_WARN_FMT "pci_enable_device_mem: " ++ "failed\n", ioc->name); ++ return -ENODEV; ++ } ++ ++ ++ if (pci_request_selected_regions(pdev, ioc->bars, ++ MPT2SAS_DRIVER_NAME)) { ++ printk(MPT2SAS_WARN_FMT "pci_request_selected_regions: " ++ "failed\n", ioc->name); ++ r = -ENODEV; ++ goto out_fail; ++ } ++#endif ++ ++ pci_set_master(pdev); ++ ++ if (_base_config_dma_addressing(ioc, pdev) != 0) { ++ printk(MPT2SAS_WARN_FMT "no suitable DMA mask for %s\n", ++ ioc->name, pci_name(pdev)); ++ r = -ENODEV; ++ goto out_fail; ++ } ++ ++ for (i = 0, memap_sz = 0, pio_sz = 0 ; i < DEVICE_COUNT_RESOURCE; i++) { ++ if (pci_resource_flags(pdev, i) & PCI_BASE_ADDRESS_SPACE_IO) { ++ if (pio_sz) ++ continue; ++ ioc->pio_chip = pci_resource_start(pdev, i); ++ pio_sz = pci_resource_len(pdev, i); ++ } else { ++ if (memap_sz) ++ continue; ++ ioc->chip_phys = pci_resource_start(pdev, i); ++ memap_sz = pci_resource_len(pdev, i); ++ ioc->chip = ioremap(ioc->chip_phys, memap_sz); ++ if (ioc->chip == NULL) { ++ printk(MPT2SAS_ERR_FMT "unable to map adapter " ++ "memory!\n", ioc->name); ++ r = -EINVAL; ++ goto out_fail; ++ } ++ } ++ } ++ ++ pci_set_drvdata(pdev, ioc->shost); ++ _base_mask_interrupts(ioc); ++ r = _base_enable_msix(ioc); ++ if (r) ++ goto out_fail; ++ ++ printk(MPT2SAS_INFO_FMT "%s: IRQ %d\n", ++ ioc->name, ((ioc->msix_enable) ? "PCI-MSI-X enabled" : ++ "IO-APIC enabled"), ioc->pci_irq); ++ printk(MPT2SAS_INFO_FMT "iomem(0x%lx), mapped(0x%p), size(%d)\n", ++ ioc->name, ioc->chip_phys, ioc->chip, memap_sz); ++ printk(MPT2SAS_INFO_FMT "ioport(0x%lx), size(%d)\n", ++ ioc->name, ioc->pio_chip, pio_sz); ++ ++ return 0; ++ ++ out_fail: ++ if (ioc->chip_phys) ++ iounmap(ioc->chip); ++ ioc->chip_phys = 0; ++ ioc->pci_irq = -1; ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21)) ++ pci_release_regions(pdev); ++#else ++ pci_release_selected_regions(ioc->pdev, ioc->bars); ++#endif ++ pci_disable_device(pdev); ++ pci_set_drvdata(pdev, NULL); ++ return r; ++} ++ ++/** ++ * mpt2sas_base_get_msg_frame_dma - obtain request mf pointer phys addr ++ * @ioc: per adapter object ++ * @smid: system request message index(smid zero is invalid) ++ * ++ * Returns phys pointer to message frame. ++ */ ++dma_addr_t ++mpt2sas_base_get_msg_frame_dma(struct MPT2SAS_ADAPTER *ioc, u16 smid) ++{ ++ return ioc->request_dma + (smid * ioc->request_sz); ++} ++ ++/** ++ * mpt2sas_base_get_msg_frame - obtain request mf pointer ++ * @ioc: per adapter object ++ * @smid: system request message index(smid zero is invalid) ++ * ++ * Returns virt pointer to message frame. ++ */ ++void * ++mpt2sas_base_get_msg_frame(struct MPT2SAS_ADAPTER *ioc, u16 smid) ++{ ++ return (void *)(ioc->request + (smid * ioc->request_sz)); ++} ++ ++/** ++ * mpt2sas_base_get_sense_buffer - obtain a sense buffer virt addr ++ * @ioc: per adapter object ++ * @smid: system request message index ++ * ++ * Returns virt pointer to sense buffer. ++ */ ++void * ++mpt2sas_base_get_sense_buffer(struct MPT2SAS_ADAPTER *ioc, u16 smid) ++{ ++ return (void *)(ioc->sense + ((smid - 1) * SCSI_SENSE_BUFFERSIZE)); ++} ++ ++/** ++ * mpt2sas_base_get_sense_buffer_dma - obtain a sense buffer dma addr ++ * @ioc: per adapter object ++ * @smid: system request message index ++ * ++ * Returns phys pointer to sense buffer. ++ */ ++dma_addr_t ++mpt2sas_base_get_sense_buffer_dma(struct MPT2SAS_ADAPTER *ioc, u16 smid) ++{ ++ return ioc->sense_dma + ((smid - 1) * SCSI_SENSE_BUFFERSIZE); ++} ++ ++/** ++ * mpt2sas_base_get_reply_virt_addr - obtain reply frames virt address ++ * @ioc: per adapter object ++ * @phys_addr: lower 32 physical addr of the reply ++ * ++ * Converts 32bit lower physical addr into a virt address. ++ */ ++void * ++mpt2sas_base_get_reply_virt_addr(struct MPT2SAS_ADAPTER *ioc, u32 phys_addr) ++{ ++ if (!phys_addr) ++ return NULL; ++ return ioc->reply + (phys_addr - (u32)ioc->reply_dma); ++} ++ ++/** ++ * mpt2sas_base_get_smid - obtain a free smid ++ * @ioc: per adapter object ++ * @cb_idx: callback index ++ * ++ * Returns smid (zero is invalid) ++ */ ++u16 ++mpt2sas_base_get_smid(struct MPT2SAS_ADAPTER *ioc, u8 cb_idx) ++{ ++ unsigned long flags; ++ struct request_tracker *request; ++ u16 smid; ++ ++ spin_lock_irqsave(&ioc->scsi_lookup_lock, flags); ++ if (list_empty(&ioc->free_list)) { ++ spin_unlock_irqrestore(&ioc->scsi_lookup_lock, flags); ++ printk(MPT2SAS_ERR_FMT "%s: smid not available\n", ++ ioc->name, __func__); ++ return 0; ++ } ++ ++ request = list_entry(ioc->free_list.next, ++ struct request_tracker, tracker_list); ++ request->cb_idx = cb_idx; ++ smid = request->smid; ++ list_del(&request->tracker_list); ++ spin_unlock_irqrestore(&ioc->scsi_lookup_lock, flags); ++ return smid; ++} ++ ++ ++/** ++ * mpt2sas_base_free_smid - put smid back on free_list ++ * @ioc: per adapter object ++ * @smid: system request message index ++ * ++ * Return nothing. ++ */ ++void ++mpt2sas_base_free_smid(struct MPT2SAS_ADAPTER *ioc, u16 smid) ++{ ++ unsigned long flags; ++#if defined(CHAIN_POOL) ++ struct chain_tracker *chain_req, *next; ++#endif ++ ++ spin_lock_irqsave(&ioc->scsi_lookup_lock, flags); ++#if defined(CHAIN_POOL) ++ if (!list_empty(&ioc->scsi_lookup[smid - 1].chain_list)) { ++ list_for_each_entry_safe(chain_req, next, ++ &ioc->scsi_lookup[smid - 1].chain_list, tracker_list) { ++ list_del_init(&chain_req->tracker_list); ++ list_add_tail(&chain_req->tracker_list, ++ &ioc->free_chain_list); ++ } ++ } ++#endif ++ ioc->scsi_lookup[smid - 1].cb_idx = 0xFF; ++ list_add_tail(&ioc->scsi_lookup[smid - 1].tracker_list, ++ &ioc->free_list); ++ spin_unlock_irqrestore(&ioc->scsi_lookup_lock, flags); ++ ++ /* ++ * See _wait_for_commands_to_complete() call with regards to this code. ++ */ ++ if (ioc->shost_recovery && ioc->pending_io_count) { ++ if (ioc->pending_io_count == 1) ++ wake_up(&ioc->reset_wq); ++ ioc->pending_io_count--; ++ } ++} ++ ++/** ++ * _base_writeq - 64 bit write to MMIO ++ * @ioc: per adapter object ++ * @b: data payload ++ * @addr: address in MMIO space ++ * @writeq_lock: spin lock ++ * ++ * Glue for handling an atomic 64 bit word to MMIO. This special handling takes ++ * care of 32 bit environment where its not quarenteed to send the entire word ++ * in one transfer. ++ */ ++#ifndef writeq ++static inline void ++_base_writeq(__u64 b, volatile void __iomem *addr, spinlock_t *writeq_lock) ++{ ++ unsigned long flags; ++ __u64 data_out = cpu_to_le64(b); ++ ++ spin_lock_irqsave(writeq_lock, flags); ++ writel((u32)(data_out), addr); ++ writel((u32)(data_out >> 32), (addr + 4)); ++ spin_unlock_irqrestore(writeq_lock, flags); ++} ++#else ++static inline void ++_base_writeq(__u64 b, volatile void __iomem *addr, spinlock_t *writeq_lock) ++{ ++ writeq(cpu_to_le64(b), addr); ++} ++#endif ++ ++/** ++ * mpt2sas_base_put_smid_scsi_io - send SCSI_IO request to firmware ++ * @ioc: per adapter object ++ * @smid: system request message index ++ * @vf_id: virtual function id ++ * @handle: device handle ++ * ++ * Return nothing. ++ */ ++void ++mpt2sas_base_put_smid_scsi_io(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 vf_id, ++ u16 handle) ++{ ++ Mpi2RequestDescriptorUnion_t descriptor; ++ u64 *request = (u64 *)&descriptor; ++ ++ ++ descriptor.SCSIIO.RequestFlags = MPI2_REQ_DESCRIPT_FLAGS_SCSI_IO; ++ descriptor.SCSIIO.VF_ID = vf_id; ++ descriptor.SCSIIO.SMID = cpu_to_le16(smid); ++ descriptor.SCSIIO.DevHandle = cpu_to_le16(handle); ++ descriptor.SCSIIO.LMID = 0; ++ _base_writeq(*request, &ioc->chip->RequestDescriptorPostLow, ++ &ioc->scsi_lookup_lock); ++} ++ ++ ++/** ++ * mpt2sas_base_put_smid_hi_priority - send Task Managment request to firmware ++ * @ioc: per adapter object ++ * @smid: system request message index ++ * @vf_id: virtual function id ++ * ++ * Return nothing. ++ */ ++void ++mpt2sas_base_put_smid_hi_priority(struct MPT2SAS_ADAPTER *ioc, u16 smid, ++ u8 vf_id) ++{ ++ Mpi2RequestDescriptorUnion_t descriptor; ++ u64 *request = (u64 *)&descriptor; ++ ++ descriptor.HighPriority.RequestFlags = ++ MPI2_REQ_DESCRIPT_FLAGS_HIGH_PRIORITY; ++ descriptor.HighPriority.VF_ID = vf_id; ++ descriptor.HighPriority.SMID = cpu_to_le16(smid); ++ descriptor.HighPriority.LMID = 0; ++ descriptor.HighPriority.Reserved1 = 0; ++ _base_writeq(*request, &ioc->chip->RequestDescriptorPostLow, ++ &ioc->scsi_lookup_lock); ++} ++ ++/** ++ * mpt2sas_base_put_smid_default - Default, primarily used for config pages ++ * @ioc: per adapter object ++ * @smid: system request message index ++ * @vf_id: virtual function id ++ * ++ * Return nothing. ++ */ ++void ++mpt2sas_base_put_smid_default(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 vf_id) ++{ ++ Mpi2RequestDescriptorUnion_t descriptor; ++ u64 *request = (u64 *)&descriptor; ++ ++ descriptor.Default.RequestFlags = MPI2_REQ_DESCRIPT_FLAGS_DEFAULT_TYPE; ++ descriptor.Default.VF_ID = vf_id; ++ descriptor.Default.SMID = cpu_to_le16(smid); ++ descriptor.Default.LMID = 0; ++ descriptor.Default.DescriptorTypeDependent = 0; ++ _base_writeq(*request, &ioc->chip->RequestDescriptorPostLow, ++ &ioc->scsi_lookup_lock); ++} ++ ++/** ++ * mpt2sas_base_put_smid_target_assist - send Target Assist/Status to firmware ++ * @ioc: per adapter object ++ * @smid: system request message index ++ * @vf_id: virtual function id ++ * @io_index: value used to track the IO ++ * ++ * Return nothing. ++ */ ++void ++mpt2sas_base_put_smid_target_assist(struct MPT2SAS_ADAPTER *ioc, u16 smid, ++ u8 vf_id, u16 io_index) ++{ ++ Mpi2RequestDescriptorUnion_t descriptor; ++ u64 *request = (u64 *)&descriptor; ++ ++ descriptor.SCSITarget.RequestFlags = ++ MPI2_REQ_DESCRIPT_FLAGS_SCSI_TARGET; ++ descriptor.SCSITarget.VF_ID = vf_id; ++ descriptor.SCSITarget.SMID = cpu_to_le16(smid); ++ descriptor.SCSITarget.LMID = 0; ++ descriptor.SCSITarget.IoIndex = cpu_to_le16(io_index); ++ _base_writeq(*request, &ioc->chip->RequestDescriptorPostLow, ++ &ioc->scsi_lookup_lock); ++} ++ ++/** ++ * _base_display_dell_branding - Disply branding string ++ * @ioc: per adapter object ++ * ++ * Return nothing. ++ */ ++static void ++_base_display_dell_branding(struct MPT2SAS_ADAPTER *ioc) ++{ ++ char dell_branding[MPT2SAS_DELL_BRANDING_SIZE]; ++ ++ if (ioc->pdev->subsystem_vendor != PCI_VENDOR_ID_DELL) ++ return; ++ ++ memset(dell_branding, 0, MPT2SAS_DELL_BRANDING_SIZE); ++ switch (ioc->pdev->subsystem_device) { ++ case MPT2SAS_DELL_6GBPS_SAS_HBA_SSDID: ++ strncpy(dell_branding, MPT2SAS_DELL_6GBPS_SAS_HBA_BRANDING, ++ MPT2SAS_DELL_BRANDING_SIZE - 1); ++ break; ++ case MPT2SAS_DELL_PERC_H200_ADAPTER_SSDID: ++ strncpy(dell_branding, MPT2SAS_DELL_PERC_H200_ADAPTER_BRANDING, ++ MPT2SAS_DELL_BRANDING_SIZE - 1); ++ break; ++ case MPT2SAS_DELL_PERC_H200_INTEGRATED_SSDID: ++ strncpy(dell_branding, ++ MPT2SAS_DELL_PERC_H200_INTEGRATED_BRANDING, ++ MPT2SAS_DELL_BRANDING_SIZE - 1); ++ break; ++ case MPT2SAS_DELL_PERC_H200_MODULAR_SSDID: ++ strncpy(dell_branding, ++ MPT2SAS_DELL_PERC_H200_MODULAR_BRANDING, ++ MPT2SAS_DELL_BRANDING_SIZE - 1); ++ break; ++ case MPT2SAS_DELL_PERC_H200_EMBEDDED_SSDID: ++ strncpy(dell_branding, ++ MPT2SAS_DELL_PERC_H200_EMBEDDED_BRANDING, ++ MPT2SAS_DELL_BRANDING_SIZE - 1); ++ break; ++ case MPT2SAS_DELL_PERC_H200_SSDID: ++ strncpy(dell_branding, MPT2SAS_DELL_PERC_H200_BRANDING, ++ MPT2SAS_DELL_BRANDING_SIZE - 1); ++ break; ++ case MPT2SAS_DELL_6GBPS_SAS_SSDID: ++ strncpy(dell_branding, MPT2SAS_DELL_6GBPS_SAS_BRANDING, ++ MPT2SAS_DELL_BRANDING_SIZE - 1); ++ break; ++ default: ++ sprintf(dell_branding, "0x%4X", ioc->pdev->subsystem_device); ++ break; ++ } ++ ++ printk(MPT2SAS_INFO_FMT "%s: Vendor(0x%04X), Device(0x%04X)," ++ " SSVID(0x%04X), SSDID(0x%04X)\n", ioc->name, dell_branding, ++ ioc->pdev->vendor, ioc->pdev->device, ioc->pdev->subsystem_vendor, ++ ioc->pdev->subsystem_device); ++} ++ ++/** ++ * _base_display_ioc_capabilities - Disply IOC's capabilities. ++ * @ioc: per adapter object ++ * ++ * Return nothing. ++ */ ++static void ++_base_display_ioc_capabilities(struct MPT2SAS_ADAPTER *ioc) ++{ ++ int i = 0; ++ char desc[16]; ++ u8 revision; ++ u32 iounit_pg1_flags; ++ ++ pci_read_config_byte(ioc->pdev, PCI_CLASS_REVISION, &revision); ++ strncpy(desc, ioc->manu_pg0.ChipName, 16); ++ printk(MPT2SAS_INFO_FMT "%s: FWVersion(%02d.%02d.%02d.%02d), " ++ "ChipRevision(0x%02x), BiosVersion(%02d.%02d.%02d.%02d)\n", ++ ioc->name, desc, ++ (ioc->facts.FWVersion.Word & 0xFF000000) >> 24, ++ (ioc->facts.FWVersion.Word & 0x00FF0000) >> 16, ++ (ioc->facts.FWVersion.Word & 0x0000FF00) >> 8, ++ ioc->facts.FWVersion.Word & 0x000000FF, ++ revision, ++ (ioc->bios_pg3.BiosVersion & 0xFF000000) >> 24, ++ (ioc->bios_pg3.BiosVersion & 0x00FF0000) >> 16, ++ (ioc->bios_pg3.BiosVersion & 0x0000FF00) >> 8, ++ ioc->bios_pg3.BiosVersion & 0x000000FF); ++ ++ _base_display_dell_branding(ioc); ++ ++ printk(MPT2SAS_INFO_FMT "Protocol=(", ioc->name); ++ ++ if (ioc->facts.ProtocolFlags & MPI2_IOCFACTS_PROTOCOL_SCSI_INITIATOR) { ++ printk("Initiator"); ++ i++; ++ } ++ ++ if (ioc->facts.ProtocolFlags & MPI2_IOCFACTS_PROTOCOL_SCSI_TARGET) { ++ printk("%sTarget", i ? "," : ""); ++ i++; ++ } ++ ++ i = 0; ++ printk("), "); ++ printk("Capabilities=("); ++ ++ if (ioc->facts.IOCCapabilities & ++ MPI2_IOCFACTS_CAPABILITY_INTEGRATED_RAID) { ++ printk("Raid"); ++ i++; ++ } ++ ++ if (ioc->facts.IOCCapabilities & MPI2_IOCFACTS_CAPABILITY_TLR) { ++ printk("%sTLR", i ? "," : ""); ++ i++; ++ } ++ ++ if (ioc->facts.IOCCapabilities & MPI2_IOCFACTS_CAPABILITY_MULTICAST) { ++ printk("%sMulticast", i ? "," : ""); ++ i++; ++ } ++ ++ if (ioc->facts.IOCCapabilities & ++ MPI2_IOCFACTS_CAPABILITY_BIDIRECTIONAL_TARGET) { ++ printk("%sBIDI Target", i ? "," : ""); ++ i++; ++ } ++ ++ if (ioc->facts.IOCCapabilities & MPI2_IOCFACTS_CAPABILITY_EEDP) { ++ printk("%sEEDP", i ? "," : ""); ++ i++; ++ } ++ ++ if (ioc->facts.IOCCapabilities & ++ MPI2_IOCFACTS_CAPABILITY_SNAPSHOT_BUFFER) { ++ printk("%sSnapshot Buffer", i ? "," : ""); ++ i++; ++ } ++ ++ if (ioc->facts.IOCCapabilities & ++ MPI2_IOCFACTS_CAPABILITY_DIAG_TRACE_BUFFER) { ++ printk("%sDiag Trace Buffer", i ? "," : ""); ++ i++; ++ } ++ ++ if (ioc->facts.IOCCapabilities & ++ MPI2_IOCFACTS_CAPABILITY_TASK_SET_FULL_HANDLING) { ++ printk("%sTask Set Full", i ? "," : ""); ++ i++; ++ } ++ ++ iounit_pg1_flags = le32_to_cpu(ioc->iounit_pg1.Flags); ++ if (!(iounit_pg1_flags & MPI2_IOUNITPAGE1_NATIVE_COMMAND_Q_DISABLE)) { ++ printk("%sNCQ", i ? "," : ""); ++ i++; ++ } ++ ++ printk(")\n"); ++} ++ ++/** ++ * _base_static_config_pages - static start of day config pages ++ * @ioc: per adapter object ++ * ++ * Return nothing. ++ */ ++static void ++_base_static_config_pages(struct MPT2SAS_ADAPTER *ioc) ++{ ++ Mpi2ConfigReply_t mpi_reply; ++ u32 iounit_pg1_flags; ++ ++ mpt2sas_config_get_manufacturing_pg0(ioc, &mpi_reply, &ioc->manu_pg0); ++ if (ioc->ir_firmware) ++ mpt2sas_config_get_manufacturing_pg10(ioc, &mpi_reply, ++ &ioc->manu_pg10); ++ mpt2sas_config_get_bios_pg2(ioc, &mpi_reply, &ioc->bios_pg2); ++ mpt2sas_config_get_bios_pg3(ioc, &mpi_reply, &ioc->bios_pg3); ++ mpt2sas_config_get_ioc_pg8(ioc, &mpi_reply, &ioc->ioc_pg8); ++ mpt2sas_config_get_iounit_pg0(ioc, &mpi_reply, &ioc->iounit_pg0); ++ mpt2sas_config_get_iounit_pg1(ioc, &mpi_reply, &ioc->iounit_pg1); ++ _base_display_ioc_capabilities(ioc); ++ ++ /* ++ * Enable task_set_full handling in iounit_pg1 when the ++ * facts capabilities indicate that its supported. ++ */ ++ iounit_pg1_flags = le32_to_cpu(ioc->iounit_pg1.Flags); ++ if ((ioc->facts.IOCCapabilities & ++ MPI2_IOCFACTS_CAPABILITY_TASK_SET_FULL_HANDLING)) ++ iounit_pg1_flags &= ++ ~MPI2_IOUNITPAGE1_DISABLE_TASK_SET_FULL_HANDLING; ++ else ++ iounit_pg1_flags |= ++ MPI2_IOUNITPAGE1_DISABLE_TASK_SET_FULL_HANDLING; ++ ioc->iounit_pg1.Flags = cpu_to_le32(iounit_pg1_flags); ++ mpt2sas_config_set_iounit_pg1(ioc, &mpi_reply, &ioc->iounit_pg1); ++} ++ ++/** ++ * _base_release_memory_pools - release memory ++ * @ioc: per adapter object ++ * ++ * Free memory allocated from _base_allocate_memory_pools. ++ * ++ * Return nothing. ++ */ ++static void ++_base_release_memory_pools(struct MPT2SAS_ADAPTER *ioc) ++{ ++ dexitprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s\n", ioc->name, ++ __func__)); ++ ++ if (ioc->request) { ++ pci_free_consistent(ioc->pdev, ioc->request_dma_sz, ++ ioc->request, ioc->request_dma); ++ dexitprintk(ioc, printk(MPT2SAS_INFO_FMT "request_pool(0x%p)" ++ ": free\n", ioc->name, ioc->request)); ++ ioc->request = NULL; ++ } ++ ++ if (ioc->sense) { ++ pci_pool_free(ioc->sense_dma_pool, ioc->sense, ioc->sense_dma); ++ if (ioc->sense_dma_pool) ++ pci_pool_destroy(ioc->sense_dma_pool); ++ dexitprintk(ioc, printk(MPT2SAS_INFO_FMT "sense_pool(0x%p)" ++ ": free\n", ioc->name, ioc->sense)); ++ ioc->sense = NULL; ++ } ++ ++ if (ioc->reply) { ++ pci_pool_free(ioc->reply_dma_pool, ioc->reply, ioc->reply_dma); ++ if (ioc->reply_dma_pool) ++ pci_pool_destroy(ioc->reply_dma_pool); ++ dexitprintk(ioc, printk(MPT2SAS_INFO_FMT "reply_pool(0x%p)" ++ ": free\n", ioc->name, ioc->reply)); ++ ioc->reply = NULL; ++ } ++ ++ if (ioc->reply_free) { ++ pci_pool_free(ioc->reply_free_dma_pool, ioc->reply_free, ++ ioc->reply_free_dma); ++ if (ioc->reply_free_dma_pool) ++ pci_pool_destroy(ioc->reply_free_dma_pool); ++ dexitprintk(ioc, printk(MPT2SAS_INFO_FMT "reply_free_pool" ++ "(0x%p): free\n", ioc->name, ioc->reply_free)); ++ ioc->reply_free = NULL; ++ } ++ ++ if (ioc->reply_post_free) { ++ pci_pool_free(ioc->reply_post_free_dma_pool, ++ ioc->reply_post_free, ioc->reply_post_free_dma); ++ if (ioc->reply_post_free_dma_pool) ++ pci_pool_destroy(ioc->reply_post_free_dma_pool); ++ dexitprintk(ioc, printk(MPT2SAS_INFO_FMT ++ "reply_post_free_pool(0x%p): free\n", ioc->name, ++ ioc->reply_post_free)); ++ ioc->reply_post_free = NULL; ++ } ++ ++ if (ioc->config_page) { ++ dexitprintk(ioc, printk(MPT2SAS_INFO_FMT ++ "config_page(0x%p): free\n", ioc->name, ++ ioc->config_page)); ++ pci_free_consistent(ioc->pdev, ioc->config_page_sz, ++ ioc->config_page, ioc->config_page_dma); ++ } ++ ++ kfree(ioc->scsi_lookup); ++#if defined(CHAIN_POOL) ++ kfree(ioc->chain_lookup); ++#endif ++} ++ ++/** ++ * _base_allocate_memory_pools - allocate start of day memory pools ++ * @ioc: per adapter object ++ * @sleep_flag: CAN_SLEEP or NO_SLEEP ++ * ++ * Returns 0 success, anything else error ++ */ ++static int ++_base_allocate_memory_pools(struct MPT2SAS_ADAPTER *ioc, int sleep_flag) ++{ ++ Mpi2IOCFactsReply_t *facts; ++ u32 queue_size, queue_diff; ++ u16 max_sge_elements; ++ u16 num_of_reply_frames; ++ u16 chains_needed_per_io; ++ u32 sz, total_sz; ++ u16 i; ++ u32 retry_sz; ++ u16 max_request_credit; ++ ++ dinitprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s\n", ioc->name, ++ __func__)); ++ ++ retry_sz = 0; ++ facts = &ioc->facts; ++ ++ /* command line tunables for max sgl entries */ ++ if (max_sgl_entries != -1) { ++ ioc->shost->sg_tablesize = (max_sgl_entries < ++ MPT2SAS_SG_DEPTH) ? max_sgl_entries : ++ MPT2SAS_SG_DEPTH; ++ } else { ++ ioc->shost->sg_tablesize = MPT2SAS_SG_DEPTH; ++ } ++ ++ /* command line tunables for max controller queue depth */ ++ if (max_queue_depth != -1) { ++ max_request_credit = (max_queue_depth < facts->RequestCredit) ++ ? max_queue_depth : facts->RequestCredit; ++ } else { ++ max_request_credit = (facts->RequestCredit > ++ MPT2SAS_MAX_REQUEST_QUEUE) ? MPT2SAS_MAX_REQUEST_QUEUE : ++ facts->RequestCredit; ++ } ++ ioc->request_depth = max_request_credit; ++ ++#if defined(TARGET_MODE) ++ if ((INTERNAL_CMDS_COUNT + NUM_CMD_BUFFERS) > ioc->request_depth) { ++ printk(MPT2SAS_ERR_FMT "request_depth too small!!!!\n", ++ ioc->name); ++ goto out; ++ } ++#endif ++ ++ /* request frame size */ ++ ioc->request_sz = facts->IOCRequestFrameSize * 4; ++ ++ /* reply frame size */ ++ ioc->reply_sz = facts->ReplyFrameSize * 4; ++ ++ retry_allocation: ++ total_sz = 0; ++ /* calculate number of sg elements left over in the 1st frame */ ++ max_sge_elements = ioc->request_sz - ((sizeof(Mpi2SCSIIORequest_t) - ++ sizeof(Mpi2SGEIOUnion_t)) + ioc->sge_size); ++ ioc->max_sges_in_main_message = max_sge_elements/ioc->sge_size; ++ ++ /* now do the same for a chain buffer */ ++ max_sge_elements = ioc->request_sz - ioc->sge_size; ++ ioc->max_sges_in_chain_message = max_sge_elements/ioc->sge_size; ++ ++ ioc->chain_offset_value_for_main_message = ++ ((sizeof(Mpi2SCSIIORequest_t) - sizeof(Mpi2SGEIOUnion_t)) + ++ (ioc->max_sges_in_chain_message * ioc->sge_size)) / 4; ++ ++ /* ++ * MPT2SAS_SG_DEPTH = CONFIG_FUSION_MAX_SGE ++ */ ++ chains_needed_per_io = ((ioc->shost->sg_tablesize - ++ ioc->max_sges_in_main_message)/ioc->max_sges_in_chain_message) ++ + 1; ++ if (chains_needed_per_io > facts->MaxChainDepth) { ++ chains_needed_per_io = facts->MaxChainDepth; ++ ioc->shost->sg_tablesize = min_t(u16, ++ ioc->max_sges_in_main_message + (ioc->max_sges_in_chain_message ++ * chains_needed_per_io), ioc->shost->sg_tablesize); ++ } ++ ioc->chains_needed_per_io = chains_needed_per_io; ++ ++ /* reply free queue sizing - taking into account for events */ ++ num_of_reply_frames = ioc->request_depth + 32; ++ ++ /* number of replies frames can't be a multiple of 16 */ ++ /* decrease number of reply frames by 1 */ ++ if (!(num_of_reply_frames % 16)) ++ num_of_reply_frames--; ++ ++ /* calculate number of reply free queue entries ++ * (must be multiple of 16) ++ */ ++ ++ /* (we know reply_free_queue_depth is not a multiple of 16) */ ++ queue_size = num_of_reply_frames; ++ queue_size += 16 - (queue_size % 16); ++ ioc->reply_free_queue_depth = queue_size; ++ ++ /* reply descriptor post queue sizing */ ++ /* this size should be the number of request frames + number of reply ++ * frames ++ */ ++ ++ queue_size = ioc->request_depth + num_of_reply_frames + 1; ++ /* round up to 16 byte boundary */ ++ if (queue_size % 16) ++ queue_size += 16 - (queue_size % 16); ++ ++ /* check against IOC maximum reply post queue depth */ ++ if (queue_size > facts->MaxReplyDescriptorPostQueueDepth) { ++ queue_diff = queue_size - ++ facts->MaxReplyDescriptorPostQueueDepth; ++ ++ /* round queue_diff up to multiple of 16 */ ++ if (queue_diff % 16) ++ queue_diff += 16 - (queue_diff % 16); ++ ++ /* adjust request_depth, reply_free_queue_depth, ++ * and queue_size ++ */ ++ ioc->request_depth -= queue_diff; ++ ioc->reply_free_queue_depth -= queue_diff; ++ queue_size -= queue_diff; ++ } ++ ioc->reply_post_queue_depth = queue_size; ++ ++ /* max scsi host queue depth */ ++#if defined(TARGET_MODE) ++ ioc->shost->can_queue = ioc->request_depth - INTERNAL_CMDS_COUNT - ++ NUM_CMD_BUFFERS; ++#else ++ ioc->shost->can_queue = ioc->request_depth - INTERNAL_CMDS_COUNT; ++#endif ++ dinitprintk(ioc, printk(MPT2SAS_INFO_FMT "scsi host queue: depth" ++ "(%d)\n", ioc->name, ioc->shost->can_queue)); ++ ++ dinitprintk(ioc, printk(MPT2SAS_INFO_FMT "scatter gather: " ++ "sge_in_main_msg(%d), sge_per_chain(%d), sge_per_io(%d), " ++ "chains_per_io(%d)\n", ioc->name, ioc->max_sges_in_main_message, ++ ioc->max_sges_in_chain_message, ioc->shost->sg_tablesize, ++ ioc->chains_needed_per_io)); ++ ++ /* contiguous pool for request and chains, 16 byte align, one extra " ++ * "frame for smid=0 ++ */ ++#if defined(CHAIN_POOL) ++ ioc->chain_depth = ioc->chains_needed_per_io * ioc->shost->can_queue; ++#else ++ ioc->chain_depth = ioc->chains_needed_per_io * ioc->request_depth; ++#endif ++ sz = ((ioc->request_depth + 1 + ioc->chain_depth) * ioc->request_sz); ++ ++ ioc->request_dma_sz = sz; ++ ioc->request = pci_alloc_consistent(ioc->pdev, sz, &ioc->request_dma); ++ if (!ioc->request) { ++ printk(MPT2SAS_ERR_FMT "request pool: pci_alloc_consistent " ++ "failed: req_depth(%d), chains_per_io(%d), frame_sz(%d), " ++ "total(%d kB)\n", ioc->name, ioc->request_depth, ++ ioc->chains_needed_per_io, ioc->request_sz, sz/1024); ++ if (ioc->request_depth < MPT2SAS_SAS_QUEUE_DEPTH) ++ goto out; ++ retry_sz += 64; ++ ioc->request_depth = max_request_credit - retry_sz; ++ goto retry_allocation; ++ } ++ ++ if (retry_sz) ++ printk(MPT2SAS_ERR_FMT "request pool: pci_alloc_consistent " ++ "succeed: req_depth(%d), chains_per_io(%d), frame_sz(%d), " ++ "total(%d kb)\n", ioc->name, ioc->request_depth, ++ ioc->chains_needed_per_io, ioc->request_sz, sz/1024); ++ ++ ioc->chain = ioc->request + ((ioc->request_depth + 1) * ++ ioc->request_sz); ++ ioc->chain_dma = ioc->request_dma + ((ioc->request_depth + 1) * ++ ioc->request_sz); ++ dinitprintk(ioc, printk(MPT2SAS_INFO_FMT "request pool(0x%p): " ++ "depth(%d), frame_size(%d), pool_size(%d kB)\n", ioc->name, ++ ioc->request, ioc->request_depth, ioc->request_sz, ++ ((ioc->request_depth + 1) * ioc->request_sz)/1024)); ++ dinitprintk(ioc, printk(MPT2SAS_INFO_FMT "chain pool(0x%p): depth" ++ "(%d), frame_size(%d), pool_size(%d kB)\n", ioc->name, ioc->chain, ++ ioc->chain_depth, ioc->request_sz, ((ioc->chain_depth * ++ ioc->request_sz))/1024)); ++ dinitprintk(ioc, printk(MPT2SAS_INFO_FMT "request pool: dma(0x%llx)\n", ++ ioc->name, (unsigned long long) ioc->request_dma)); ++ total_sz += sz; ++ ++ ioc->scsi_lookup = kcalloc(ioc->request_depth, ++ sizeof(struct request_tracker), GFP_KERNEL); ++ if (!ioc->scsi_lookup) { ++ printk(MPT2SAS_ERR_FMT "scsi_lookup: kcalloc failed\n", ++ ioc->name); ++ goto out; ++ } ++ ++ /* initialize some bits */ ++ for (i = 0; i < ioc->request_depth; i++) ++ ioc->scsi_lookup[i].smid = i + 1; ++ ++#if defined(CHAIN_POOL) ++ ioc->chain_lookup = kcalloc(ioc->chain_depth, ++ sizeof(struct chain_tracker), GFP_KERNEL); ++ if (!ioc->chain_lookup) { ++ printk(MPT2SAS_ERR_FMT "chain_lookup: kcalloc failed\n", ++ ioc->name); ++ goto out; ++ } ++ for (i = 0; i < ioc->chain_depth; i++) ++ ioc->chain_lookup[i].index = i; ++#endif ++ ++ /* sense buffers, 4 byte align */ ++ sz = ioc->request_depth * SCSI_SENSE_BUFFERSIZE; ++ ioc->sense_dma_pool = pci_pool_create("sense pool", ioc->pdev, sz, 4, ++ 0); ++ if (!ioc->sense_dma_pool) { ++ printk(MPT2SAS_ERR_FMT "sense pool: pci_pool_create failed\n", ++ ioc->name); ++ goto out; ++ } ++ ioc->sense = pci_pool_alloc(ioc->sense_dma_pool , GFP_KERNEL, ++ &ioc->sense_dma); ++ if (!ioc->sense) { ++ printk(MPT2SAS_ERR_FMT "sense pool: pci_pool_alloc failed\n", ++ ioc->name); ++ goto out; ++ } ++ dinitprintk(ioc, printk(MPT2SAS_INFO_FMT ++ "sense pool(0x%p): depth(%d), element_size(%d), pool_size" ++ "(%d kB)\n", ioc->name, ioc->sense, ioc->request_depth, ++ SCSI_SENSE_BUFFERSIZE, sz/1024)); ++ dinitprintk(ioc, printk(MPT2SAS_INFO_FMT "sense_dma(0x%llx)\n", ++ ioc->name, (unsigned long long)ioc->sense_dma)); ++ total_sz += sz; ++ ++ /* reply pool, 4 byte align */ ++ sz = ioc->reply_free_queue_depth * ioc->reply_sz; ++ ioc->reply_dma_pool = pci_pool_create("reply pool", ioc->pdev, sz, 4, ++ 0); ++ if (!ioc->reply_dma_pool) { ++ printk(MPT2SAS_ERR_FMT "reply pool: pci_pool_create failed\n", ++ ioc->name); ++ goto out; ++ } ++ ioc->reply = pci_pool_alloc(ioc->reply_dma_pool , GFP_KERNEL, ++ &ioc->reply_dma); ++ if (!ioc->reply) { ++ printk(MPT2SAS_ERR_FMT "reply pool: pci_pool_alloc failed\n", ++ ioc->name); ++ goto out; ++ } ++ dinitprintk(ioc, printk(MPT2SAS_INFO_FMT "reply pool(0x%p): depth" ++ "(%d), frame_size(%d), pool_size(%d kB)\n", ioc->name, ioc->reply, ++ ioc->reply_free_queue_depth, ioc->reply_sz, sz/1024)); ++ dinitprintk(ioc, printk(MPT2SAS_INFO_FMT "reply_dma(0x%llx)\n", ++ ioc->name, (unsigned long long)ioc->reply_dma)); ++ total_sz += sz; ++ ++ /* reply free queue, 16 byte align */ ++ sz = ioc->reply_free_queue_depth * 4; ++ ioc->reply_free_dma_pool = pci_pool_create("reply_free pool", ++ ioc->pdev, sz, 16, 0); ++ if (!ioc->reply_free_dma_pool) { ++ printk(MPT2SAS_ERR_FMT "reply_free pool: pci_pool_create " ++ "failed\n", ioc->name); ++ goto out; ++ } ++ ioc->reply_free = pci_pool_alloc(ioc->reply_free_dma_pool , GFP_KERNEL, ++ &ioc->reply_free_dma); ++ if (!ioc->reply_free) { ++ printk(MPT2SAS_ERR_FMT "reply_free pool: pci_pool_alloc " ++ "failed\n", ioc->name); ++ goto out; ++ } ++ memset(ioc->reply_free, 0, sz); ++ dinitprintk(ioc, printk(MPT2SAS_INFO_FMT "reply_free pool(0x%p): " ++ "depth(%d), element_size(%d), pool_size(%d kB)\n", ioc->name, ++ ioc->reply_free, ioc->reply_free_queue_depth, 4, sz/1024)); ++ dinitprintk(ioc, printk(MPT2SAS_INFO_FMT "reply_free_dma" ++ "(0x%llx)\n", ioc->name, (unsigned long long)ioc->reply_free_dma)); ++ total_sz += sz; ++ ++ /* reply post queue, 16 byte align */ ++ sz = ioc->reply_post_queue_depth * sizeof(Mpi2DefaultReplyDescriptor_t); ++ ioc->reply_post_free_dma_pool = pci_pool_create("reply_post_free pool", ++ ioc->pdev, sz, 16, 0); ++ if (!ioc->reply_post_free_dma_pool) { ++ printk(MPT2SAS_ERR_FMT "reply_post_free pool: pci_pool_create " ++ "failed\n", ioc->name); ++ goto out; ++ } ++ ioc->reply_post_free = pci_pool_alloc(ioc->reply_post_free_dma_pool , ++ GFP_KERNEL, &ioc->reply_post_free_dma); ++ if (!ioc->reply_post_free) { ++ printk(MPT2SAS_ERR_FMT "reply_post_free pool: pci_pool_alloc " ++ "failed\n", ioc->name); ++ goto out; ++ } ++ memset(ioc->reply_post_free, 0, sz); ++ dinitprintk(ioc, printk(MPT2SAS_INFO_FMT "reply post free pool" ++ "(0x%p): depth(%d), element_size(%d), pool_size(%d kB)\n", ++ ioc->name, ioc->reply_post_free, ioc->reply_post_queue_depth, 8, ++ sz/1024)); ++ dinitprintk(ioc, printk(MPT2SAS_INFO_FMT "reply_post_free_dma = " ++ "(0x%llx)\n", ioc->name, (unsigned long long) ++ ioc->reply_post_free_dma)); ++ total_sz += sz; ++ ++ ioc->config_page_sz = 512; ++ ioc->config_page = pci_alloc_consistent(ioc->pdev, ++ ioc->config_page_sz, &ioc->config_page_dma); ++ if (!ioc->config_page) { ++ printk(MPT2SAS_ERR_FMT "config page: pci_pool_alloc " ++ "failed\n", ioc->name); ++ goto out; ++ } ++ dinitprintk(ioc, printk(MPT2SAS_INFO_FMT "config page(0x%p): size" ++ "(%d)\n", ioc->name, ioc->config_page, ioc->config_page_sz)); ++ dinitprintk(ioc, printk(MPT2SAS_INFO_FMT "config_page_dma" ++ "(0x%llx)\n", ioc->name, (unsigned long long)ioc->config_page_dma)); ++ total_sz += ioc->config_page_sz; ++ ++ printk(MPT2SAS_INFO_FMT "Allocated physical memory: size(%d kB)\n", ++ ioc->name, total_sz/1024); ++ printk(MPT2SAS_INFO_FMT "Current Controller Queue Depth(%d), " ++ "Max Controller Queue Depth(%d)\n", ++ ioc->name, ioc->shost->can_queue, facts->RequestCredit); ++ printk(MPT2SAS_INFO_FMT "Scatter Gather Elements per IO(%d)\n", ++ ioc->name, ioc->shost->sg_tablesize); ++ return 0; ++ ++ out: ++ _base_release_memory_pools(ioc); ++ return -ENOMEM; ++} ++ ++ ++/** ++ * mpt2sas_base_get_iocstate - Get the current state of a MPT adapter. ++ * @ioc: Pointer to MPT_ADAPTER structure ++ * @cooked: Request raw or cooked IOC state ++ * ++ * Returns all IOC Doorbell register bits if cooked==0, else just the ++ * Doorbell bits in MPI_IOC_STATE_MASK. ++ */ ++u32 ++mpt2sas_base_get_iocstate(struct MPT2SAS_ADAPTER *ioc, int cooked) ++{ ++ u32 s, sc; ++ ++ s = readl(&ioc->chip->Doorbell); ++ sc = s & MPI2_IOC_STATE_MASK; ++ return cooked ? sc : s; ++} ++ ++/** ++ * _base_wait_on_iocstate - waiting on a particular ioc state ++ * @ioc_state: controller state { READY, OPERATIONAL, or RESET } ++ * @timeout: timeout in second ++ * @sleep_flag: CAN_SLEEP or NO_SLEEP ++ * ++ * Returns 0 for success, non-zero for failure. ++ */ ++static int ++_base_wait_on_iocstate(struct MPT2SAS_ADAPTER *ioc, u32 ioc_state, int timeout, ++ int sleep_flag) ++{ ++ u32 count, cntdn; ++ u32 current_state; ++ ++ count = 0; ++ cntdn = (sleep_flag == CAN_SLEEP) ? 1000*timeout : 2000*timeout; ++ do { ++ current_state = mpt2sas_base_get_iocstate(ioc, 1); ++ if (current_state == ioc_state) ++ return 0; ++ if (count && current_state == MPI2_IOC_STATE_FAULT) ++ break; ++ if (sleep_flag == CAN_SLEEP) ++ msleep(1); ++ else ++ udelay(500); ++ count++; ++ } while (--cntdn); ++ ++ return current_state; ++} ++ ++/** ++ * _base_wait_for_doorbell_int - waiting for controller interrupt(generated by ++ * a write to the doorbell) ++ * @ioc: per adapter object ++ * @timeout: timeout in second ++ * @sleep_flag: CAN_SLEEP or NO_SLEEP ++ * ++ * Returns 0 for success, non-zero for failure. ++ * ++ * Notes: MPI2_HIS_IOC2SYS_DB_STATUS - set to one when IOC writes to doorbell. ++ */ ++static int ++_base_wait_for_doorbell_int(struct MPT2SAS_ADAPTER *ioc, int timeout, ++ int sleep_flag) ++{ ++ u32 cntdn, count; ++ u32 int_status; ++ ++ count = 0; ++ cntdn = (sleep_flag == CAN_SLEEP) ? 1000*timeout : 2000*timeout; ++ do { ++ int_status = readl(&ioc->chip->HostInterruptStatus); ++ if (int_status & MPI2_HIS_IOC2SYS_DB_STATUS) { ++ dhsprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: " ++ "successfull count(%d), timeout(%d)\n", ioc->name, ++ __func__, count, timeout)); ++ return 0; ++ } ++ if (sleep_flag == CAN_SLEEP) ++ msleep(1); ++ else ++ udelay(500); ++ count++; ++ } while (--cntdn); ++ ++ printk(MPT2SAS_ERR_FMT "%s: failed due to timeout count(%d), " ++ "int_status(%x)!\n", ioc->name, __func__, count, int_status); ++ return -EFAULT; ++} ++ ++/** ++ * _base_wait_for_doorbell_ack - waiting for controller to read the doorbell. ++ * @ioc: per adapter object ++ * @timeout: timeout in second ++ * @sleep_flag: CAN_SLEEP or NO_SLEEP ++ * ++ * Returns 0 for success, non-zero for failure. ++ * ++ * Notes: MPI2_HIS_SYS2IOC_DB_STATUS - set to one when host writes to ++ * doorbell. ++ */ ++static int ++_base_wait_for_doorbell_ack(struct MPT2SAS_ADAPTER *ioc, int timeout, ++ int sleep_flag) ++{ ++ u32 cntdn, count; ++ u32 int_status; ++ u32 doorbell; ++ ++ count = 0; ++ cntdn = (sleep_flag == CAN_SLEEP) ? 1000*timeout : 2000*timeout; ++ do { ++ int_status = readl(&ioc->chip->HostInterruptStatus); ++ if (!(int_status & MPI2_HIS_SYS2IOC_DB_STATUS)) { ++ dhsprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: " ++ "successfull count(%d), timeout(%d)\n", ioc->name, ++ __func__, count, timeout)); ++ return 0; ++ } else if (int_status & MPI2_HIS_IOC2SYS_DB_STATUS) { ++ doorbell = readl(&ioc->chip->Doorbell); ++ if ((doorbell & MPI2_IOC_STATE_MASK) == ++ MPI2_IOC_STATE_FAULT) { ++ mpt2sas_base_fault_info(ioc , doorbell); ++ return -EFAULT; ++ } ++ } else if (int_status == 0xFFFFFFFF) ++ goto out; ++ ++ if (sleep_flag == CAN_SLEEP) ++ msleep(1); ++ else ++ udelay(500); ++ count++; ++ } while (--cntdn); ++ ++ out: ++ printk(MPT2SAS_ERR_FMT "%s: failed due to timeout count(%d), " ++ "int_status(%x)!\n", ioc->name, __func__, count, int_status); ++ return -EFAULT; ++} ++ ++/** ++ * _base_wait_for_doorbell_not_used - waiting for doorbell to not be in use ++ * @ioc: per adapter object ++ * @timeout: timeout in second ++ * @sleep_flag: CAN_SLEEP or NO_SLEEP ++ * ++ * Returns 0 for success, non-zero for failure. ++ * ++ */ ++static int ++_base_wait_for_doorbell_not_used(struct MPT2SAS_ADAPTER *ioc, int timeout, ++ int sleep_flag) ++{ ++ u32 cntdn, count; ++ u32 doorbell_reg; ++ ++ count = 0; ++ cntdn = (sleep_flag == CAN_SLEEP) ? 1000*timeout : 2000*timeout; ++ do { ++ doorbell_reg = readl(&ioc->chip->Doorbell); ++ if (!(doorbell_reg & MPI2_DOORBELL_USED)) { ++ dhsprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: " ++ "successfull count(%d), timeout(%d)\n", ioc->name, ++ __func__, count, timeout)); ++ return 0; ++ } ++ if (sleep_flag == CAN_SLEEP) ++ msleep(1); ++ else ++ udelay(500); ++ count++; ++ } while (--cntdn); ++ ++ printk(MPT2SAS_ERR_FMT "%s: failed due to timeout count(%d), " ++ "doorbell_reg(%x)!\n", ioc->name, __func__, count, doorbell_reg); ++ return -EFAULT; ++} ++ ++/** ++ * _base_send_ioc_reset - send doorbell reset ++ * @ioc: per adapter object ++ * @reset_type: currently only supports: MPI2_FUNCTION_IOC_MESSAGE_UNIT_RESET ++ * @timeout: timeout in second ++ * @sleep_flag: CAN_SLEEP or NO_SLEEP ++ * ++ * Returns 0 for success, non-zero for failure. ++ */ ++static int ++_base_send_ioc_reset(struct MPT2SAS_ADAPTER *ioc, u8 reset_type, int timeout, ++ int sleep_flag) ++{ ++ u32 ioc_state; ++ int r = 0; ++ ++ if (reset_type != MPI2_FUNCTION_IOC_MESSAGE_UNIT_RESET) { ++ printk(MPT2SAS_ERR_FMT "%s: unknown reset_type\n", ++ ioc->name, __func__); ++ return -EFAULT; ++ } ++ ++ if (!(ioc->facts.IOCCapabilities & ++ MPI2_IOCFACTS_CAPABILITY_EVENT_REPLAY)) ++ return -EFAULT; ++ ++ printk(MPT2SAS_INFO_FMT "sending message unit reset !!\n", ioc->name); ++ ++ writel(reset_type << MPI2_DOORBELL_FUNCTION_SHIFT, ++ &ioc->chip->Doorbell); ++ if ((_base_wait_for_doorbell_ack(ioc, 15, sleep_flag))) { ++ r = -EFAULT; ++ goto out; ++ } ++ ioc_state = _base_wait_on_iocstate(ioc, MPI2_IOC_STATE_READY, ++ timeout, sleep_flag); ++ if (ioc_state) { ++ printk(MPT2SAS_ERR_FMT "%s: failed going to ready state " ++ " (ioc_state=0x%x)\n", ioc->name, __func__, ioc_state); ++ r = -EFAULT; ++ goto out; ++ } ++ out: ++ printk(MPT2SAS_INFO_FMT "message unit reset: %s\n", ++ ioc->name, ((r == 0) ? "SUCCESS" : "FAILED")); ++ return r; ++} ++ ++/** ++ * _base_handshake_req_reply_wait - send request thru doorbell interface ++ * @ioc: per adapter object ++ * @request_bytes: request length ++ * @request: pointer having request payload ++ * @reply_bytes: reply length ++ * @reply: pointer to reply payload ++ * @timeout: timeout in second ++ * @sleep_flag: CAN_SLEEP or NO_SLEEP ++ * ++ * Returns 0 for success, non-zero for failure. ++ */ ++static int ++_base_handshake_req_reply_wait(struct MPT2SAS_ADAPTER *ioc, int request_bytes, ++ u32 *request, int reply_bytes, u16 *reply, int timeout, int sleep_flag) ++{ ++ MPI2DefaultReply_t *default_reply = (MPI2DefaultReply_t *)reply; ++ int i; ++ u8 failed; ++ u16 dummy; ++ u32 *mfp; ++ ++ /* make sure doorbell is not in use */ ++ if ((readl(&ioc->chip->Doorbell) & MPI2_DOORBELL_USED)) { ++ printk(MPT2SAS_ERR_FMT "doorbell is in use " ++ " (line=%d)\n", ioc->name, __LINE__); ++ return -EFAULT; ++ } ++ ++ /* clear pending doorbell interrupts from previous state changes */ ++ if (readl(&ioc->chip->HostInterruptStatus) & ++ MPI2_HIS_IOC2SYS_DB_STATUS) ++ writel(0, &ioc->chip->HostInterruptStatus); ++ ++ /* send message to ioc */ ++ writel(((MPI2_FUNCTION_HANDSHAKE<chip->Doorbell); ++ ++ if ((_base_wait_for_doorbell_int(ioc, 5, sleep_flag))) { ++ printk(MPT2SAS_ERR_FMT "doorbell handshake " ++ "int failed (line=%d)\n", ioc->name, __LINE__); ++ return -EFAULT; ++ } ++ writel(0, &ioc->chip->HostInterruptStatus); ++ ++ if ((_base_wait_for_doorbell_ack(ioc, 5, sleep_flag))) { ++ printk(MPT2SAS_ERR_FMT "doorbell handshake " ++ "ack failed (line=%d)\n", ioc->name, __LINE__); ++ return -EFAULT; ++ } ++ ++ /* send message 32-bits at a time */ ++ for (i = 0, failed = 0; i < request_bytes/4 && !failed; i++) { ++ writel(cpu_to_le32(request[i]), &ioc->chip->Doorbell); ++ if ((_base_wait_for_doorbell_ack(ioc, 5, sleep_flag))) ++ failed = 1; ++ } ++ ++ if (failed) { ++ printk(MPT2SAS_ERR_FMT "doorbell handshake " ++ "sending request failed (line=%d)\n", ioc->name, __LINE__); ++ return -EFAULT; ++ } ++ ++ /* now wait for the reply */ ++ if ((_base_wait_for_doorbell_int(ioc, timeout, sleep_flag))) { ++ printk(MPT2SAS_ERR_FMT "doorbell handshake " ++ "int failed (line=%d)\n", ioc->name, __LINE__); ++ return -EFAULT; ++ } ++ ++ /* read the first two 16-bits, it gives the total length of the reply */ ++ reply[0] = le16_to_cpu(readl(&ioc->chip->Doorbell) ++ & MPI2_DOORBELL_DATA_MASK); ++ writel(0, &ioc->chip->HostInterruptStatus); ++ if ((_base_wait_for_doorbell_int(ioc, 5, sleep_flag))) { ++ printk(MPT2SAS_ERR_FMT "doorbell handshake " ++ "int failed (line=%d)\n", ioc->name, __LINE__); ++ return -EFAULT; ++ } ++ reply[1] = le16_to_cpu(readl(&ioc->chip->Doorbell) ++ & MPI2_DOORBELL_DATA_MASK); ++ writel(0, &ioc->chip->HostInterruptStatus); ++ ++ for (i = 2; i < default_reply->MsgLength * 2; i++) { ++ if ((_base_wait_for_doorbell_int(ioc, 5, sleep_flag))) { ++ printk(MPT2SAS_ERR_FMT "doorbell " ++ "handshake int failed (line=%d)\n", ioc->name, ++ __LINE__); ++ return -EFAULT; ++ } ++ if (i >= reply_bytes/2) /* overflow case */ ++ dummy = readl(&ioc->chip->Doorbell); ++ else ++ reply[i] = le16_to_cpu(readl(&ioc->chip->Doorbell) ++ & MPI2_DOORBELL_DATA_MASK); ++ writel(0, &ioc->chip->HostInterruptStatus); ++ } ++ ++ _base_wait_for_doorbell_int(ioc, 5, sleep_flag); ++ if (_base_wait_for_doorbell_not_used(ioc, 5, sleep_flag) != 0) { ++ dhsprintk(ioc, printk(MPT2SAS_INFO_FMT "doorbell is in use " ++ " (line=%d)\n", ioc->name, __LINE__)); ++ } ++ writel(0, &ioc->chip->HostInterruptStatus); ++ ++ if (ioc->logging_level & MPT_DEBUG_INIT) { ++ mfp = (u32 *)reply; ++ printk(KERN_DEBUG "\toffset:data\n"); ++ for (i = 0; i < reply_bytes/4; i++) ++ printk(KERN_DEBUG "\t[0x%02x]:%08x\n", i*4, ++ le32_to_cpu(mfp[i])); ++ } ++ return 0; ++} ++ ++/** ++ * mpt2sas_base_sas_iounit_control - send sas iounit control to FW ++ * @ioc: per adapter object ++ * @mpi_reply: the reply payload from FW ++ * @mpi_request: the request payload sent to FW ++ * ++ * The SAS IO Unit Control Request message allows the host to perform low-level ++ * operations, such as resets on the PHYs of the IO Unit, also allows the host ++ * to obtain the IOC assigned device handles for a device if it has other ++ * identifying information about the device, in addition allows the host to ++ * remove IOC resources associated with the device. ++ * ++ * Returns 0 for success, non-zero for failure. ++ */ ++int ++mpt2sas_base_sas_iounit_control(struct MPT2SAS_ADAPTER *ioc, ++ Mpi2SasIoUnitControlReply_t *mpi_reply, ++ Mpi2SasIoUnitControlRequest_t *mpi_request) ++{ ++ u16 smid; ++ u32 ioc_state; ++ unsigned long timeleft; ++ u8 issue_reset; ++ int rc; ++ void *request; ++ u16 wait_state_count; ++ ++ dinitprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s\n", ioc->name, ++ __func__)); ++ ++ mutex_lock(&ioc->base_cmds.mutex); ++ ++ if (ioc->base_cmds.status != MPT2_CMD_NOT_USED) { ++ printk(MPT2SAS_ERR_FMT "%s: base_cmd in use\n", ++ ioc->name, __func__); ++ rc = -EAGAIN; ++ goto out; ++ } ++ ++ wait_state_count = 0; ++ ioc_state = mpt2sas_base_get_iocstate(ioc, 1); ++ while (ioc_state != MPI2_IOC_STATE_OPERATIONAL) { ++ if (wait_state_count++ == 10) { ++ printk(MPT2SAS_ERR_FMT ++ "%s: failed due to ioc not operational\n", ++ ioc->name, __func__); ++ rc = -EFAULT; ++ goto out; ++ } ++ ssleep(1); ++ ioc_state = mpt2sas_base_get_iocstate(ioc, 1); ++ printk(MPT2SAS_INFO_FMT "%s: waiting for " ++ "operational state(count=%d)\n", ioc->name, ++ __func__, wait_state_count); ++ } ++ ++ smid = mpt2sas_base_get_smid(ioc, ioc->base_cb_idx); ++ if (!smid) { ++ printk(MPT2SAS_ERR_FMT "%s: failed obtaining a smid\n", ++ ioc->name, __func__); ++ rc = -EAGAIN; ++ goto out; ++ } ++ ++ rc = 0; ++ ioc->base_cmds.status = MPT2_CMD_PENDING; ++ request = mpt2sas_base_get_msg_frame(ioc, smid); ++ ioc->base_cmds.smid = smid; ++ memcpy(request, mpi_request, sizeof(Mpi2SasIoUnitControlRequest_t)); ++ if (mpi_request->Operation == MPI2_SAS_OP_PHY_HARD_RESET || ++ mpi_request->Operation == MPI2_SAS_OP_PHY_LINK_RESET) ++ ioc->ioc_link_reset_in_progress = 1; ++ mpt2sas_base_put_smid_default(ioc, smid, mpi_request->VF_ID); ++ timeleft = wait_for_completion_timeout(&ioc->base_cmds.done, ++ msecs_to_jiffies(10000)); ++ if ((mpi_request->Operation == MPI2_SAS_OP_PHY_HARD_RESET || ++ mpi_request->Operation == MPI2_SAS_OP_PHY_LINK_RESET) && ++ ioc->ioc_link_reset_in_progress) ++ ioc->ioc_link_reset_in_progress = 0; ++ if (!(ioc->base_cmds.status & MPT2_CMD_COMPLETE)) { ++ printk(MPT2SAS_ERR_FMT "%s: timeout\n", ++ ioc->name, __func__); ++ _debug_dump_mf(mpi_request, ++ sizeof(Mpi2SasIoUnitControlRequest_t)/4); ++ if (!(ioc->base_cmds.status & MPT2_CMD_RESET)) ++ issue_reset = 1; ++ goto issue_host_reset; ++ } ++ if (ioc->base_cmds.status & MPT2_CMD_REPLY_VALID) ++ memcpy(mpi_reply, ioc->base_cmds.reply, ++ sizeof(Mpi2SasIoUnitControlReply_t)); ++ else ++ memset(mpi_reply, 0, sizeof(Mpi2SasIoUnitControlReply_t)); ++ ioc->base_cmds.status = MPT2_CMD_NOT_USED; ++ goto out; ++ ++ issue_host_reset: ++ if (issue_reset) ++ mpt2sas_base_hard_reset_handler(ioc, CAN_SLEEP, ++ FORCE_BIG_HAMMER); ++ ioc->base_cmds.status = MPT2_CMD_NOT_USED; ++ rc = -EFAULT; ++ out: ++ mutex_unlock(&ioc->base_cmds.mutex); ++ return rc; ++} ++ ++ ++/** ++ * mpt2sas_base_scsi_enclosure_processor - sending request to sep device ++ * @ioc: per adapter object ++ * @mpi_reply: the reply payload from FW ++ * @mpi_request: the request payload sent to FW ++ * ++ * The SCSI Enclosure Processor request message causes the IOC to ++ * communicate with SES devices to control LED status signals. ++ * ++ * Returns 0 for success, non-zero for failure. ++ */ ++int ++mpt2sas_base_scsi_enclosure_processor(struct MPT2SAS_ADAPTER *ioc, ++ Mpi2SepReply_t *mpi_reply, Mpi2SepRequest_t *mpi_request) ++{ ++ u16 smid; ++ u32 ioc_state; ++ unsigned long timeleft; ++ u8 issue_reset; ++ int rc; ++ void *request; ++ u16 wait_state_count; ++ ++ dinitprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s\n", ioc->name, ++ __func__)); ++ ++ mutex_lock(&ioc->base_cmds.mutex); ++ ++ if (ioc->base_cmds.status != MPT2_CMD_NOT_USED) { ++ printk(MPT2SAS_ERR_FMT "%s: base_cmd in use\n", ++ ioc->name, __func__); ++ rc = -EAGAIN; ++ goto out; ++ } ++ ++ wait_state_count = 0; ++ ioc_state = mpt2sas_base_get_iocstate(ioc, 1); ++ while (ioc_state != MPI2_IOC_STATE_OPERATIONAL) { ++ if (wait_state_count++ == 10) { ++ printk(MPT2SAS_ERR_FMT ++ "%s: failed due to ioc not operational\n", ++ ioc->name, __func__); ++ rc = -EFAULT; ++ goto out; ++ } ++ ssleep(1); ++ ioc_state = mpt2sas_base_get_iocstate(ioc, 1); ++ printk(MPT2SAS_INFO_FMT "%s: waiting for " ++ "operational state(count=%d)\n", ioc->name, ++ __func__, wait_state_count); ++ } ++ ++ smid = mpt2sas_base_get_smid(ioc, ioc->base_cb_idx); ++ if (!smid) { ++ printk(MPT2SAS_ERR_FMT "%s: failed obtaining a smid\n", ++ ioc->name, __func__); ++ rc = -EAGAIN; ++ goto out; ++ } ++ ++ rc = 0; ++ ioc->base_cmds.status = MPT2_CMD_PENDING; ++ request = mpt2sas_base_get_msg_frame(ioc, smid); ++ ioc->base_cmds.smid = smid; ++ memcpy(request, mpi_request, sizeof(Mpi2SepReply_t)); ++ mpt2sas_base_put_smid_default(ioc, smid, mpi_request->VF_ID); ++ timeleft = wait_for_completion_timeout(&ioc->base_cmds.done, ++ msecs_to_jiffies(10000)); ++ if (!(ioc->base_cmds.status & MPT2_CMD_COMPLETE)) { ++ printk(MPT2SAS_ERR_FMT "%s: timeout\n", ++ ioc->name, __func__); ++ _debug_dump_mf(mpi_request, ++ sizeof(Mpi2SepRequest_t)/4); ++ if (!(ioc->base_cmds.status & MPT2_CMD_RESET)) ++ issue_reset = 1; ++ goto issue_host_reset; ++ } ++ if (ioc->base_cmds.status & MPT2_CMD_REPLY_VALID) ++ memcpy(mpi_reply, ioc->base_cmds.reply, ++ sizeof(Mpi2SepReply_t)); ++ else ++ memset(mpi_reply, 0, sizeof(Mpi2SepReply_t)); ++ ioc->base_cmds.status = MPT2_CMD_NOT_USED; ++ goto out; ++ ++ issue_host_reset: ++ if (issue_reset) ++ mpt2sas_base_hard_reset_handler(ioc, CAN_SLEEP, ++ FORCE_BIG_HAMMER); ++ ioc->base_cmds.status = MPT2_CMD_NOT_USED; ++ rc = -EFAULT; ++ out: ++ mutex_unlock(&ioc->base_cmds.mutex); ++ return rc; ++} ++ ++/** ++ * _base_get_port_facts - obtain port facts reply and save in ioc ++ * @ioc: per adapter object ++ * @sleep_flag: CAN_SLEEP or NO_SLEEP ++ * ++ * Returns 0 for success, non-zero for failure. ++ */ ++static int ++_base_get_port_facts(struct MPT2SAS_ADAPTER *ioc, int port, int sleep_flag) ++{ ++ Mpi2PortFactsRequest_t mpi_request; ++ Mpi2PortFactsReply_t mpi_reply, *pfacts; ++ int mpi_reply_sz, mpi_request_sz, r; ++ ++ dinitprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s\n", ioc->name, ++ __func__)); ++ ++ mpi_reply_sz = sizeof(Mpi2PortFactsReply_t); ++ mpi_request_sz = sizeof(Mpi2PortFactsRequest_t); ++ memset(&mpi_request, 0, mpi_request_sz); ++ mpi_request.Function = MPI2_FUNCTION_PORT_FACTS; ++ mpi_request.PortNumber = port; ++ r = _base_handshake_req_reply_wait(ioc, mpi_request_sz, ++ (u32 *)&mpi_request, mpi_reply_sz, (u16 *)&mpi_reply, 5, CAN_SLEEP); ++ ++ if (r != 0) { ++ printk(MPT2SAS_ERR_FMT "%s: handshake failed (r=%d)\n", ++ ioc->name, __func__, r); ++ return r; ++ } ++ ++ pfacts = &ioc->pfacts[port]; ++ memset(pfacts, 0, sizeof(Mpi2PortFactsReply_t)); ++ pfacts->PortNumber = mpi_reply.PortNumber; ++ pfacts->VP_ID = mpi_reply.VP_ID; ++ pfacts->VF_ID = mpi_reply.VF_ID; ++ pfacts->MaxPostedCmdBuffers = ++ le16_to_cpu(mpi_reply.MaxPostedCmdBuffers); ++ ++ return 0; ++} ++ ++/** ++ * _base_get_ioc_facts - obtain ioc facts reply and save in ioc ++ * @ioc: per adapter object ++ * @sleep_flag: CAN_SLEEP or NO_SLEEP ++ * ++ * Returns 0 for success, non-zero for failure. ++ */ ++static int ++_base_get_ioc_facts(struct MPT2SAS_ADAPTER *ioc, int sleep_flag) ++{ ++ Mpi2IOCFactsRequest_t mpi_request; ++ Mpi2IOCFactsReply_t mpi_reply, *facts; ++ int mpi_reply_sz, mpi_request_sz, r; ++ ++ dinitprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s\n", ioc->name, ++ __func__)); ++ ++ mpi_reply_sz = sizeof(Mpi2IOCFactsReply_t); ++ mpi_request_sz = sizeof(Mpi2IOCFactsRequest_t); ++ memset(&mpi_request, 0, mpi_request_sz); ++ mpi_request.Function = MPI2_FUNCTION_IOC_FACTS; ++ r = _base_handshake_req_reply_wait(ioc, mpi_request_sz, ++ (u32 *)&mpi_request, mpi_reply_sz, (u16 *)&mpi_reply, 5, CAN_SLEEP); ++ ++ if (r != 0) { ++ printk(MPT2SAS_ERR_FMT "%s: handshake failed (r=%d)\n", ++ ioc->name, __func__, r); ++ return r; ++ } ++ ++ facts = &ioc->facts; ++ memset(facts, 0, sizeof(Mpi2IOCFactsReply_t)); ++ facts->MsgVersion = le16_to_cpu(mpi_reply.MsgVersion); ++ facts->HeaderVersion = le16_to_cpu(mpi_reply.HeaderVersion); ++ facts->VP_ID = mpi_reply.VP_ID; ++ facts->VF_ID = mpi_reply.VF_ID; ++ facts->IOCExceptions = le16_to_cpu(mpi_reply.IOCExceptions); ++ facts->MaxChainDepth = mpi_reply.MaxChainDepth; ++ facts->WhoInit = mpi_reply.WhoInit; ++ facts->NumberOfPorts = mpi_reply.NumberOfPorts; ++ facts->RequestCredit = le16_to_cpu(mpi_reply.RequestCredit); ++ facts->MaxReplyDescriptorPostQueueDepth = ++ le16_to_cpu(mpi_reply.MaxReplyDescriptorPostQueueDepth); ++ facts->ProductID = le16_to_cpu(mpi_reply.ProductID); ++ facts->IOCCapabilities = le32_to_cpu(mpi_reply.IOCCapabilities); ++ if ((facts->IOCCapabilities & MPI2_IOCFACTS_CAPABILITY_INTEGRATED_RAID)) ++ ioc->ir_firmware = 1; ++ facts->FWVersion.Word = le32_to_cpu(mpi_reply.FWVersion.Word); ++ facts->IOCRequestFrameSize = ++ le16_to_cpu(mpi_reply.IOCRequestFrameSize); ++ facts->MaxInitiators = le16_to_cpu(mpi_reply.MaxInitiators); ++ facts->MaxTargets = le16_to_cpu(mpi_reply.MaxTargets); ++ ioc->shost->max_id = -1; ++ facts->MaxSasExpanders = le16_to_cpu(mpi_reply.MaxSasExpanders); ++ facts->MaxEnclosures = le16_to_cpu(mpi_reply.MaxEnclosures); ++ facts->ProtocolFlags = le16_to_cpu(mpi_reply.ProtocolFlags); ++ facts->HighPriorityCredit = ++ le16_to_cpu(mpi_reply.HighPriorityCredit); ++ facts->ReplyFrameSize = mpi_reply.ReplyFrameSize; ++ facts->MaxDevHandle = le16_to_cpu(mpi_reply.MaxDevHandle); ++ ++ dinitprintk(ioc, printk(MPT2SAS_INFO_FMT "hba queue depth(%d), " ++ "max chains per io(%d)\n", ioc->name, facts->RequestCredit, ++ facts->MaxChainDepth)); ++ dinitprintk(ioc, printk(MPT2SAS_INFO_FMT "request frame size(%d), " ++ "reply frame size(%d)\n", ioc->name, ++ facts->IOCRequestFrameSize * 4, facts->ReplyFrameSize * 4)); ++ return 0; ++} ++ ++/** ++ * _base_send_ioc_init - send ioc_init to firmware ++ * @ioc: per adapter object ++ * @VF_ID: virtual function id ++ * @sleep_flag: CAN_SLEEP or NO_SLEEP ++ * ++ * Returns 0 for success, non-zero for failure. ++ */ ++static int ++_base_send_ioc_init(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID, int sleep_flag) ++{ ++ Mpi2IOCInitRequest_t mpi_request; ++ Mpi2IOCInitReply_t mpi_reply; ++ int r; ++ ++ dinitprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s\n", ioc->name, ++ __func__)); ++ ++ memset(&mpi_request, 0, sizeof(Mpi2IOCInitRequest_t)); ++ mpi_request.Function = MPI2_FUNCTION_IOC_INIT; ++ mpi_request.WhoInit = MPI2_WHOINIT_HOST_DRIVER; ++ mpi_request.VF_ID = VF_ID; ++ mpi_request.MsgVersion = cpu_to_le16(MPI2_VERSION); ++ mpi_request.HeaderVersion = cpu_to_le16(MPI2_HEADER_VERSION); ++ ++ /* In MPI Revision I (0xA), the SystemReplyFrameSize(offset 0x18) was ++ * removed and made reserved. For those with older firmware will need ++ * this fix. It was decided that the Reply and Request frame sizes are ++ * the same. ++ */ ++ if ((ioc->facts.HeaderVersion >> 8) < 0xA) ++ mpi_request.Reserved7 = cpu_to_le16(ioc->reply_sz); ++ ++ mpi_request.SystemRequestFrameSize = cpu_to_le16(ioc->request_sz/4); ++ mpi_request.ReplyDescriptorPostQueueDepth = ++ cpu_to_le16(ioc->reply_post_queue_depth); ++ mpi_request.ReplyFreeQueueDepth = ++ cpu_to_le16(ioc->reply_free_queue_depth); ++ ++#if BITS_PER_LONG > 32 ++ mpi_request.SenseBufferAddressHigh = ++ cpu_to_le32(ioc->sense_dma >> 32); ++ mpi_request.SystemReplyAddressHigh = ++ cpu_to_le32(ioc->reply_dma >> 32); ++ mpi_request.SystemRequestFrameBaseAddress = ++ cpu_to_le64(ioc->request_dma); ++ mpi_request.ReplyFreeQueueAddress = ++ cpu_to_le64(ioc->reply_free_dma); ++ mpi_request.ReplyDescriptorPostQueueAddress = ++ cpu_to_le64(ioc->reply_post_free_dma); ++#else ++ mpi_request.SystemRequestFrameBaseAddress = ++ cpu_to_le32(ioc->request_dma); ++ mpi_request.ReplyFreeQueueAddress = ++ cpu_to_le32(ioc->reply_free_dma); ++ mpi_request.ReplyDescriptorPostQueueAddress = ++ cpu_to_le32(ioc->reply_post_free_dma); ++#endif ++ ++ if (ioc->logging_level & MPT_DEBUG_INIT) { ++ u32 *mfp; ++ int i; ++ ++ mfp = (u32 *)&mpi_request; ++ printk(KERN_DEBUG "\toffset:data\n"); ++ for (i = 0; i < sizeof(Mpi2IOCInitRequest_t)/4; i++) ++ printk(KERN_DEBUG "\t[0x%02x]:%08x\n", i*4, ++ le32_to_cpu(mfp[i])); ++ } ++ ++ r = _base_handshake_req_reply_wait(ioc, ++ sizeof(Mpi2IOCInitRequest_t), (u32 *)&mpi_request, ++ sizeof(Mpi2IOCInitReply_t), (u16 *)&mpi_reply, 10, ++ sleep_flag); ++ ++ if (r != 0) { ++ printk(MPT2SAS_ERR_FMT "%s: handshake failed (r=%d)\n", ++ ioc->name, __func__, r); ++ return r; ++ } ++ ++ if (mpi_reply.IOCStatus != MPI2_IOCSTATUS_SUCCESS || ++ mpi_reply.IOCLogInfo) { ++ printk(MPT2SAS_ERR_FMT "%s: failed\n", ioc->name, __func__); ++ r = -EIO; ++ } ++ ++ return 0; ++} ++ ++/** ++ * _base_send_port_enable - send port_enable(discovery stuff) to firmware ++ * @ioc: per adapter object ++ * @VF_ID: virtual function id ++ * @sleep_flag: CAN_SLEEP or NO_SLEEP ++ * ++ * Returns 0 for success, non-zero for failure. ++ */ ++static int ++_base_send_port_enable(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID, int sleep_flag) ++{ ++ Mpi2PortEnableRequest_t *mpi_request; ++ u32 ioc_state; ++ unsigned long timeleft; ++ int r = 0; ++ u16 smid; ++ ++ printk(MPT2SAS_INFO_FMT "sending port enable !!\n", ioc->name); ++ ++ if (ioc->base_cmds.status & MPT2_CMD_PENDING) { ++ printk(MPT2SAS_ERR_FMT "%s: internal command already in use\n", ++ ioc->name, __func__); ++ return -EAGAIN; ++ } ++ ++ smid = mpt2sas_base_get_smid(ioc, ioc->base_cb_idx); ++ if (!smid) { ++ printk(MPT2SAS_ERR_FMT "%s: failed obtaining a smid\n", ++ ioc->name, __func__); ++ return -EAGAIN; ++ } ++ ++ ioc->base_cmds.status = MPT2_CMD_PENDING; ++ mpi_request = mpt2sas_base_get_msg_frame(ioc, smid); ++ ioc->base_cmds.smid = smid; ++ memset(mpi_request, 0, sizeof(Mpi2PortEnableRequest_t)); ++ mpi_request->Function = MPI2_FUNCTION_PORT_ENABLE; ++ mpi_request->VF_ID = VF_ID; ++ ++ mpt2sas_base_put_smid_default(ioc, smid, VF_ID); ++ timeleft = wait_for_completion_timeout(&ioc->base_cmds.done, ++ 300*HZ); ++ if (!(ioc->base_cmds.status & MPT2_CMD_COMPLETE)) { ++ printk(MPT2SAS_ERR_FMT "%s: timeout\n", ++ ioc->name, __func__); ++ _debug_dump_mf(mpi_request, ++ sizeof(Mpi2PortEnableRequest_t)/4); ++ if (ioc->base_cmds.status & MPT2_CMD_RESET) ++ r = -EFAULT; ++ else ++ r = -ETIME; ++ goto out; ++ } else ++ dinitprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: complete\n", ++ ioc->name, __func__)); ++ ++ ioc_state = _base_wait_on_iocstate(ioc, MPI2_IOC_STATE_OPERATIONAL, ++ 60, sleep_flag); ++ if (ioc_state) { ++ printk(MPT2SAS_ERR_FMT "%s: failed going to operational state " ++ " (ioc_state=0x%x)\n", ioc->name, __func__, ioc_state); ++ r = -EFAULT; ++ } ++ out: ++ ioc->base_cmds.status = MPT2_CMD_NOT_USED; ++ printk(MPT2SAS_INFO_FMT "port enable: %s\n", ++ ioc->name, ((r == 0) ? "SUCCESS" : "FAILED")); ++ return r; ++} ++ ++/** ++ * _base_unmask_events - turn on notification for this event ++ * @ioc: per adapter object ++ * @event: firmware event ++ * ++ * The mask is stored in ioc->event_masks. ++ */ ++static void ++_base_unmask_events(struct MPT2SAS_ADAPTER *ioc, u16 event) ++{ ++ u32 desired_event; ++ ++ if (event >= 128) ++ return; ++ ++ desired_event = (1 << (event % 32)); ++ ++ if (event < 32) ++ ioc->event_masks[0] &= ~desired_event; ++ else if (event < 64) ++ ioc->event_masks[1] &= ~desired_event; ++ else if (event < 96) ++ ioc->event_masks[2] &= ~desired_event; ++ else if (event < 128) ++ ioc->event_masks[3] &= ~desired_event; ++} ++ ++/** ++ * _base_event_notification - send event notification ++ * @ioc: per adapter object ++ * @VF_ID: virtual function id ++ * @sleep_flag: CAN_SLEEP or NO_SLEEP ++ * ++ * Returns 0 for success, non-zero for failure. ++ */ ++static int ++_base_event_notification(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID, int sleep_flag) ++{ ++ Mpi2EventNotificationRequest_t *mpi_request; ++ unsigned long timeleft; ++ u16 smid; ++ int r = 0; ++ int i; ++ ++ dinitprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s\n", ioc->name, ++ __func__)); ++ ++ if (ioc->base_cmds.status & MPT2_CMD_PENDING) { ++ printk(MPT2SAS_ERR_FMT "%s: internal command already in use\n", ++ ioc->name, __func__); ++ return -EAGAIN; ++ } ++ ++ smid = mpt2sas_base_get_smid(ioc, ioc->base_cb_idx); ++ if (!smid) { ++ printk(MPT2SAS_ERR_FMT "%s: failed obtaining a smid\n", ++ ioc->name, __func__); ++ return -EAGAIN; ++ } ++ ioc->base_cmds.status = MPT2_CMD_PENDING; ++ mpi_request = mpt2sas_base_get_msg_frame(ioc, smid); ++ ioc->base_cmds.smid = smid; ++ memset(mpi_request, 0, sizeof(Mpi2EventNotificationRequest_t)); ++ mpi_request->Function = MPI2_FUNCTION_EVENT_NOTIFICATION; ++ mpi_request->VF_ID = VF_ID; ++ for (i = 0; i < MPI2_EVENT_NOTIFY_EVENTMASK_WORDS; i++) ++ mpi_request->EventMasks[i] = ++ le32_to_cpu(ioc->event_masks[i]); ++ mpt2sas_base_put_smid_default(ioc, smid, VF_ID); ++ timeleft = wait_for_completion_timeout(&ioc->base_cmds.done, 30*HZ); ++ if (!(ioc->base_cmds.status & MPT2_CMD_COMPLETE)) { ++ printk(MPT2SAS_ERR_FMT "%s: timeout\n", ++ ioc->name, __func__); ++ _debug_dump_mf(mpi_request, ++ sizeof(Mpi2EventNotificationRequest_t)/4); ++ if (ioc->base_cmds.status & MPT2_CMD_RESET) ++ r = -EFAULT; ++ else ++ r = -ETIME; ++ } else ++ dinitprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: complete\n", ++ ioc->name, __func__)); ++ ioc->base_cmds.status = MPT2_CMD_NOT_USED; ++ return r; ++} ++ ++/** ++ * mpt2sas_base_validate_event_type - validating event types ++ * @ioc: per adapter object ++ * @event: firmware event ++ * ++ * This will turn on firmware event notification when application ++ * ask for that event. We don't mask events that are already enabled. ++ */ ++void ++mpt2sas_base_validate_event_type(struct MPT2SAS_ADAPTER *ioc, u32 *event_type) ++{ ++ int i, j; ++ u32 event_mask, desired_event; ++ u8 send_update_to_fw; ++ ++ for (i = 0, send_update_to_fw = 0; i < ++ MPI2_EVENT_NOTIFY_EVENTMASK_WORDS; i++) { ++ event_mask = ~event_type[i]; ++ desired_event = 1; ++ for (j = 0; j < 32; j++) { ++ if (!(event_mask & desired_event) && ++ (ioc->event_masks[i] & desired_event)) { ++ ioc->event_masks[i] &= ~desired_event; ++ send_update_to_fw = 1; ++ } ++ desired_event = (desired_event << 1); ++ } ++ } ++ ++ if (!send_update_to_fw) ++ return; ++ ++ mutex_lock(&ioc->base_cmds.mutex); ++ _base_event_notification(ioc, 0, CAN_SLEEP); ++ mutex_unlock(&ioc->base_cmds.mutex); ++} ++ ++/** ++ * _base_diag_reset - the "big hammer" start of day reset ++ * @ioc: per adapter object ++ * @sleep_flag: CAN_SLEEP or NO_SLEEP ++ * ++ * Returns 0 for success, non-zero for failure. ++ */ ++static int ++_base_diag_reset(struct MPT2SAS_ADAPTER *ioc, int sleep_flag) ++{ ++ u32 host_diagnostic; ++ u32 ioc_state; ++ u32 count; ++ u32 hcb_size; ++ ++ printk(MPT2SAS_INFO_FMT "sending diag reset !!\n", ioc->name); ++ ++ _base_save_msix_table(ioc); ++ ++ drsprintk(ioc, printk(MPT2SAS_DEBUG_FMT "clear interrupts\n", ++ ioc->name)); ++ writel(0, &ioc->chip->HostInterruptStatus); ++ ++ count = 0; ++ do { ++ /* Write magic sequence to WriteSequence register ++ * Loop until in diagnostic mode ++ */ ++ drsprintk(ioc, printk(MPT2SAS_DEBUG_FMT "write magic " ++ "sequence\n", ioc->name)); ++ writel(MPI2_WRSEQ_FLUSH_KEY_VALUE, &ioc->chip->WriteSequence); ++ writel(MPI2_WRSEQ_1ST_KEY_VALUE, &ioc->chip->WriteSequence); ++ writel(MPI2_WRSEQ_2ND_KEY_VALUE, &ioc->chip->WriteSequence); ++ writel(MPI2_WRSEQ_3RD_KEY_VALUE, &ioc->chip->WriteSequence); ++ writel(MPI2_WRSEQ_4TH_KEY_VALUE, &ioc->chip->WriteSequence); ++ writel(MPI2_WRSEQ_5TH_KEY_VALUE, &ioc->chip->WriteSequence); ++ writel(MPI2_WRSEQ_6TH_KEY_VALUE, &ioc->chip->WriteSequence); ++ ++ /* wait 100 msec */ ++ if (sleep_flag == CAN_SLEEP) ++ msleep(100); ++ else ++ mdelay(100); ++ ++ if (count++ > 20) ++ goto out; ++ ++ host_diagnostic = readl(&ioc->chip->HostDiagnostic); ++ drsprintk(ioc, printk(MPT2SAS_DEBUG_FMT "wrote magic " ++ "sequence: count(%d), host_diagnostic(0x%08x)\n", ++ ioc->name, count, host_diagnostic)); ++ ++ } while ((host_diagnostic & MPI2_DIAG_DIAG_WRITE_ENABLE) == 0); ++ ++ hcb_size = readl(&ioc->chip->HCBSize); ++ ++ drsprintk(ioc, printk(MPT2SAS_DEBUG_FMT "diag reset: issued\n", ++ ioc->name)); ++ writel(host_diagnostic | MPI2_DIAG_RESET_ADAPTER, ++ &ioc->chip->HostDiagnostic); ++ ++ /* don't access any registers for 50 milliseconds */ ++ msleep(50); ++ ++ /* 300 second max wait */ ++ for (count = 0; count < 3000000 ; count++) { ++ ++ host_diagnostic = readl(&ioc->chip->HostDiagnostic); ++ ++ if (host_diagnostic == 0xFFFFFFFF) ++ goto out; ++ if (!(host_diagnostic & MPI2_DIAG_RESET_ADAPTER)) ++ break; ++ ++ /* wait 100 msec */ ++ if (sleep_flag == CAN_SLEEP) ++ msleep(1); ++ else ++ mdelay(1); ++ } ++ ++ if (host_diagnostic & MPI2_DIAG_HCB_MODE) { ++ ++ drsprintk(ioc, printk(MPT2SAS_DEBUG_FMT "restart the adapter " ++ "assuming the HCB Address points to good F/W\n", ++ ioc->name)); ++ host_diagnostic &= ~MPI2_DIAG_BOOT_DEVICE_SELECT_MASK; ++ host_diagnostic |= MPI2_DIAG_BOOT_DEVICE_SELECT_HCDW; ++ writel(host_diagnostic, &ioc->chip->HostDiagnostic); ++ ++ drsprintk(ioc, printk(MPT2SAS_DEBUG_FMT ++ "re-enable the HCDW\n", ioc->name)); ++ writel(hcb_size | MPI2_HCB_SIZE_HCB_ENABLE, ++ &ioc->chip->HCBSize); ++ } ++ ++ drsprintk(ioc, printk(MPT2SAS_DEBUG_FMT "restart the adapter\n", ++ ioc->name)); ++ writel(host_diagnostic & ~MPI2_DIAG_HOLD_IOC_RESET, ++ &ioc->chip->HostDiagnostic); ++ ++ drsprintk(ioc, printk(MPT2SAS_DEBUG_FMT "disable writes to the " ++ "diagnostic register\n", ioc->name)); ++ writel(MPI2_WRSEQ_FLUSH_KEY_VALUE, &ioc->chip->WriteSequence); ++ ++ drsprintk(ioc, printk(MPT2SAS_DEBUG_FMT "Wait for FW to go to the " ++ "READY state\n", ioc->name)); ++ ioc_state = _base_wait_on_iocstate(ioc, MPI2_IOC_STATE_READY, 20, ++ sleep_flag); ++ if (ioc_state) { ++ printk(MPT2SAS_ERR_FMT "%s: failed going to ready state " ++ " (ioc_state=0x%x)\n", ioc->name, __func__, ioc_state); ++ goto out; ++ } ++ ++ _base_restore_msix_table(ioc); ++ printk(MPT2SAS_INFO_FMT "diag reset: SUCCESS\n", ioc->name); ++ return 0; ++ ++ out: ++ printk(MPT2SAS_ERR_FMT "diag reset: FAILED\n", ioc->name); ++ return -EFAULT; ++} ++ ++/** ++ * _base_make_ioc_ready - put controller in READY state ++ * @ioc: per adapter object ++ * @sleep_flag: CAN_SLEEP or NO_SLEEP ++ * @type: FORCE_BIG_HAMMER or SOFT_RESET ++ * ++ * Returns 0 for success, non-zero for failure. ++ */ ++static int ++_base_make_ioc_ready(struct MPT2SAS_ADAPTER *ioc, int sleep_flag, ++ enum reset_type type) ++{ ++ u32 ioc_state; ++ ++ dinitprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s\n", ioc->name, ++ __func__)); ++ ++ ioc_state = mpt2sas_base_get_iocstate(ioc, 0); ++ dhsprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: ioc_state(0x%08x)\n", ++ ioc->name, __func__, ioc_state)); ++ ++ if ((ioc_state & MPI2_IOC_STATE_MASK) == MPI2_IOC_STATE_READY) ++ return 0; ++ ++ if (ioc_state & MPI2_DOORBELL_USED) { ++ dhsprintk(ioc, printk(MPT2SAS_DEBUG_FMT "unexpected doorbell " ++ "active!\n", ioc->name)); ++ goto issue_diag_reset; ++ } ++ ++ if ((ioc_state & MPI2_IOC_STATE_MASK) == MPI2_IOC_STATE_FAULT) { ++ mpt2sas_base_fault_info(ioc, ioc_state & ++ MPI2_DOORBELL_DATA_MASK); ++ goto issue_diag_reset; ++ } ++ ++ if (type == FORCE_BIG_HAMMER) ++ goto issue_diag_reset; ++ ++ if ((ioc_state & MPI2_IOC_STATE_MASK) == MPI2_IOC_STATE_OPERATIONAL) ++ if (!(_base_send_ioc_reset(ioc, ++ MPI2_FUNCTION_IOC_MESSAGE_UNIT_RESET, 15, CAN_SLEEP))) ++ return 0; ++ ++ issue_diag_reset: ++ return _base_diag_reset(ioc, CAN_SLEEP); ++} ++ ++/** ++ * _base_make_ioc_operational - put controller in OPERATIONAL state ++ * @ioc: per adapter object ++ * @VF_ID: virtual function id ++ * @sleep_flag: CAN_SLEEP or NO_SLEEP ++ * ++ * Returns 0 for success, non-zero for failure. ++ */ ++static int ++_base_make_ioc_operational(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID, ++ int sleep_flag) ++{ ++ int r, i; ++ unsigned long flags; ++ u32 reply_address; ++ ++ dinitprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s\n", ioc->name, ++ __func__)); ++ ++ /* initialize the scsi lookup free list */ ++ spin_lock_irqsave(&ioc->scsi_lookup_lock, flags); ++ INIT_LIST_HEAD(&ioc->free_list); ++ for (i = 0; i < ioc->request_depth; i++) { ++#if defined(CHAIN_POOL) ++ INIT_LIST_HEAD(&ioc->scsi_lookup[i].chain_list); ++#endif ++ ioc->scsi_lookup[i].cb_idx = 0xFF; ++ list_add_tail(&ioc->scsi_lookup[i].tracker_list, ++ &ioc->free_list); ++ } ++#if defined(CHAIN_POOL) ++ INIT_LIST_HEAD(&ioc->free_chain_list); ++ for (i = 0; i < ioc->chain_depth; i++) ++ list_add_tail(&ioc->chain_lookup[i].tracker_list, ++ &ioc->free_chain_list); ++#endif ++ spin_unlock_irqrestore(&ioc->scsi_lookup_lock, flags); ++ ++ /* initialize Reply Free Queue */ ++ for (i = 0, reply_address = (u32)ioc->reply_dma ; ++ i < ioc->reply_free_queue_depth ; i++, reply_address += ++ ioc->reply_sz) ++ ioc->reply_free[i] = cpu_to_le32(reply_address); ++ ++ /* initialize Reply Post Free Queue */ ++ for (i = 0; i < ioc->reply_post_queue_depth; i++) ++ ioc->reply_post_free[i].Words = ULLONG_MAX; ++ ++ r = _base_send_ioc_init(ioc, VF_ID, sleep_flag); ++ if (r) ++ return r; ++ ++ /* initialize the index's */ ++ ioc->reply_free_host_index = ioc->reply_free_queue_depth - 1; ++ ioc->reply_post_host_index = 0; ++ writel(ioc->reply_free_host_index, &ioc->chip->ReplyFreeHostIndex); ++ writel(0, &ioc->chip->ReplyPostHostIndex); ++ ++ _base_unmask_interrupts(ioc); ++ r = _base_event_notification(ioc, VF_ID, sleep_flag); ++ if (r) ++ return r; ++ ++ if (sleep_flag == CAN_SLEEP) ++ _base_static_config_pages(ioc); ++ ++#if defined(TARGET_MODE) ++ if (ioc->wait_for_port_enable_to_complete) ++ mpt2sas_stm_adapter_install(ioc); ++#endif ++ ++ r = _base_send_port_enable(ioc, VF_ID, sleep_flag); ++ if (r) ++ return r; ++ ++ return r; ++} ++ ++/** ++ * mpt2sas_base_free_resources - free resources controller resources ++ * @ioc: per adapter object ++ * ++ * Return nothing. ++ */ ++void ++mpt2sas_base_free_resources(struct MPT2SAS_ADAPTER *ioc) ++{ ++ struct pci_dev *pdev = ioc->pdev; ++ ++ dexitprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s\n", ioc->name, ++ __func__)); ++ ++ _base_mask_interrupts(ioc); ++ _base_make_ioc_ready(ioc, CAN_SLEEP, SOFT_RESET); ++ if (ioc->pci_irq) { ++ synchronize_irq(pdev->irq); ++ free_irq(ioc->pci_irq, ioc); ++ } ++ _base_disable_msix(ioc); ++ if (ioc->chip_phys) ++ iounmap(ioc->chip); ++ ioc->pci_irq = -1; ++ ioc->chip_phys = 0; ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21)) ++ pci_release_regions(pdev); ++#else ++ pci_release_selected_regions(ioc->pdev, ioc->bars); ++#endif ++ pci_disable_device(pdev); ++ pci_set_drvdata(pdev, NULL); ++ return; ++} ++ ++/** ++ * mpt2sas_base_attach - attach controller instance ++ * @ioc: per adapter object ++ * ++ * Returns 0 for success, non-zero for failure. ++ */ ++int ++mpt2sas_base_attach(struct MPT2SAS_ADAPTER *ioc) ++{ ++ int r, i; ++ unsigned long flags; ++ ++ dinitprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s\n", ioc->name, ++ __func__)); ++ ++ r = mpt2sas_base_map_resources(ioc); ++ if (r) ++ return r; ++ ++ r = _base_make_ioc_ready(ioc, CAN_SLEEP, SOFT_RESET); ++ if (r) ++ goto out_free_resources; ++ ++ r = _base_get_ioc_facts(ioc, CAN_SLEEP); ++ if (r) ++ goto out_free_resources; ++ ++ r = _base_allocate_memory_pools(ioc, CAN_SLEEP); ++ if (r) ++ goto out_free_resources; ++ ++ init_waitqueue_head(&ioc->reset_wq); ++ ++ /* base internal command bits */ ++ mutex_init(&ioc->base_cmds.mutex); ++ init_completion(&ioc->base_cmds.done); ++ ioc->base_cmds.reply = kzalloc(ioc->reply_sz, GFP_KERNEL); ++ ioc->base_cmds.status = MPT2_CMD_NOT_USED; ++ ++ /* transport internal command bits */ ++ ioc->transport_cmds.reply = kzalloc(ioc->reply_sz, GFP_KERNEL); ++ ioc->transport_cmds.status = MPT2_CMD_NOT_USED; ++ mutex_init(&ioc->transport_cmds.mutex); ++ init_completion(&ioc->transport_cmds.done); ++ ++ /* scsih internal command bits */ ++ ioc->scsih_cmds.reply = kzalloc(ioc->reply_sz, GFP_KERNEL); ++ ioc->scsih_cmds.status = MPT2_CMD_NOT_USED; ++ mutex_init(&ioc->scsih_cmds.mutex); ++ ++ /* task management internal command bits */ ++ ioc->tm_cmds.reply = kzalloc(ioc->reply_sz, GFP_KERNEL); ++ ioc->tm_cmds.status = MPT2_CMD_NOT_USED; ++ mutex_init(&ioc->tm_cmds.mutex); ++ ++ /* config page internal command bits */ ++ ioc->config_cmds.reply = kzalloc(ioc->reply_sz, GFP_KERNEL); ++ ioc->config_cmds.status = MPT2_CMD_NOT_USED; ++ mutex_init(&ioc->config_cmds.mutex); ++ ++ /* ctl module internal command bits */ ++ ioc->ctl_cmds.reply = kzalloc(ioc->reply_sz, GFP_KERNEL); ++ ioc->ctl_cmds.status = MPT2_CMD_NOT_USED; ++ mutex_init(&ioc->ctl_cmds.mutex); ++ init_completion(&ioc->ctl_cmds.done); ++ ++ for (i = 0; i < MPI2_EVENT_NOTIFY_EVENTMASK_WORDS; i++) ++ ioc->event_masks[i] = -1; ++ ++ /* here we enable the events we care about */ ++ _base_unmask_events(ioc, MPI2_EVENT_SAS_DISCOVERY); ++ _base_unmask_events(ioc, MPI2_EVENT_SAS_BROADCAST_PRIMITIVE); ++ _base_unmask_events(ioc, MPI2_EVENT_SAS_TOPOLOGY_CHANGE_LIST); ++ _base_unmask_events(ioc, MPI2_EVENT_SAS_DEVICE_STATUS_CHANGE); ++ _base_unmask_events(ioc, MPI2_EVENT_SAS_ENCL_DEVICE_STATUS_CHANGE); ++ _base_unmask_events(ioc, MPI2_EVENT_IR_CONFIGURATION_CHANGE_LIST); ++ _base_unmask_events(ioc, MPI2_EVENT_IR_VOLUME); ++ _base_unmask_events(ioc, MPI2_EVENT_IR_PHYSICAL_DISK); ++ _base_unmask_events(ioc, MPI2_EVENT_IR_OPERATION_STATUS); ++ _base_unmask_events(ioc, MPI2_EVENT_TASK_SET_FULL); ++ _base_unmask_events(ioc, MPI2_EVENT_LOG_ENTRY_ADDED); ++#if defined(TARGET_MODE) ++ _base_unmask_events(ioc, MPI2_EVENT_SAS_INIT_DEVICE_STATUS_CHANGE); ++ _base_unmask_events(ioc, MPI2_EVENT_SAS_INIT_TABLE_OVERFLOW); ++ _base_unmask_events(ioc, MPI2_EVENT_HARD_RESET_RECEIVED); ++#endif ++ ++ ioc->pfacts = kcalloc(ioc->facts.NumberOfPorts, ++ sizeof(Mpi2PortFactsReply_t), GFP_KERNEL); ++ if (!ioc->pfacts) ++ goto out_free_resources; ++ ++ for (i = 0 ; i < ioc->facts.NumberOfPorts; i++) { ++ r = _base_get_port_facts(ioc, i, CAN_SLEEP); ++ if (r) ++ goto out_free_resources; ++ } ++ r = _base_make_ioc_operational(ioc, 0, CAN_SLEEP); ++ if (r) ++ goto out_free_resources; ++ ++ /* initialize fault polling */ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,19)) ++ INIT_DELAYED_WORK(&ioc->fault_reset_work, _base_fault_reset_work); ++#else ++ INIT_WORK(&ioc->fault_reset_work, _base_fault_reset_work, (void *)ioc); ++#endif ++ snprintf(ioc->fault_reset_work_q_name, ++ sizeof(ioc->fault_reset_work_q_name), "poll_%d_status", ioc->id); ++ ioc->fault_reset_work_q = ++ create_singlethread_workqueue(ioc->fault_reset_work_q_name); ++ if (!ioc->fault_reset_work_q) { ++ printk(MPT2SAS_ERR_FMT "%s: failed (line=%d)\n", ++ ioc->name, __func__, __LINE__); ++ goto out_free_resources; ++ } ++ spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags); ++ if (ioc->fault_reset_work_q) ++ queue_delayed_work(ioc->fault_reset_work_q, ++ &ioc->fault_reset_work, ++ msecs_to_jiffies(FAULT_POLLING_INTERVAL)); ++ spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags); ++ return 0; ++ ++ out_free_resources: ++ ++ ioc->remove_host = 1; ++#if defined(TARGET_MODE) ++ mpt2sas_stm_adapter_dispose(ioc); ++#endif ++ ++ mpt2sas_base_free_resources(ioc); ++ _base_release_memory_pools(ioc); ++ kfree(ioc->tm_cmds.reply); ++ kfree(ioc->transport_cmds.reply); ++ kfree(ioc->scsih_cmds.reply); ++ kfree(ioc->config_cmds.reply); ++ kfree(ioc->base_cmds.reply); ++ kfree(ioc->ctl_cmds.reply); ++ kfree(ioc->pfacts); ++ ioc->ctl_cmds.reply = NULL; ++ ioc->base_cmds.reply = NULL; ++ ioc->tm_cmds.reply = NULL; ++ ioc->scsih_cmds.reply = NULL; ++ ioc->transport_cmds.reply = NULL; ++ ioc->config_cmds.reply = NULL; ++ ioc->pfacts = NULL; ++ return r; ++} ++ ++ ++/** ++ * mpt2sas_base_detach - remove controller instance ++ * @ioc: per adapter object ++ * ++ * Return nothing. ++ */ ++void ++mpt2sas_base_detach(struct MPT2SAS_ADAPTER *ioc) ++{ ++ unsigned long flags; ++ struct workqueue_struct *wq; ++ ++ dexitprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s\n", ioc->name, ++ __func__)); ++ ++#if defined(TARGET_MODE) ++ mpt2sas_stm_adapter_dispose(ioc); ++#endif ++ ++ spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags); ++ wq = ioc->fault_reset_work_q; ++ ioc->fault_reset_work_q = NULL; ++ spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags); ++ if (!cancel_delayed_work(&ioc->fault_reset_work)) ++ flush_workqueue(wq); ++ destroy_workqueue(wq); ++ ++ mpt2sas_base_free_resources(ioc); ++ _base_release_memory_pools(ioc); ++ kfree(ioc->pfacts); ++ kfree(ioc->ctl_cmds.reply); ++ kfree(ioc->base_cmds.reply); ++ kfree(ioc->tm_cmds.reply); ++ kfree(ioc->transport_cmds.reply); ++ kfree(ioc->scsih_cmds.reply); ++ kfree(ioc->config_cmds.reply); ++} ++ ++/** ++ * _base_reset_handler - reset callback handler (for base) ++ * @ioc: per adapter object ++ * @reset_phase: phase ++ * ++ * The handler for doing any required cleanup or initialization. ++ * ++ * The reset phase can be MPT2_IOC_PRE_RESET, MPT2_IOC_AFTER_RESET, ++ * MPT2_IOC_DONE_RESET ++ * ++ * Return nothing. ++ */ ++static void ++_base_reset_handler(struct MPT2SAS_ADAPTER *ioc, int reset_phase) ++{ ++ switch (reset_phase) { ++ case MPT2_IOC_PRE_RESET: ++ dtmprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: " ++ "MPT2_IOC_PRE_RESET\n", ioc->name, __func__)); ++ break; ++ case MPT2_IOC_AFTER_RESET: ++ dtmprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: " ++ "MPT2_IOC_AFTER_RESET\n", ioc->name, __func__)); ++ if (ioc->transport_cmds.status & MPT2_CMD_PENDING) { ++ ioc->transport_cmds.status |= MPT2_CMD_RESET; ++ mpt2sas_base_free_smid(ioc, ioc->transport_cmds.smid); ++ complete(&ioc->transport_cmds.done); ++ } ++ if (ioc->base_cmds.status & MPT2_CMD_PENDING) { ++ ioc->base_cmds.status |= MPT2_CMD_RESET; ++ mpt2sas_base_free_smid(ioc, ioc->base_cmds.smid); ++ complete(&ioc->base_cmds.done); ++ } ++ if (ioc->config_cmds.status & MPT2_CMD_PENDING) { ++ ioc->config_cmds.status |= MPT2_CMD_RESET; ++ mpt2sas_base_free_smid(ioc, ioc->config_cmds.smid); ++ ioc->config_cmds.smid = USHORT_MAX; ++ complete(&ioc->config_cmds.done); ++ } ++ break; ++ case MPT2_IOC_DONE_RESET: ++ dtmprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: " ++ "MPT2_IOC_DONE_RESET\n", ioc->name, __func__)); ++ break; ++ } ++ mpt2sas_scsih_reset_handler(ioc, reset_phase); ++ mpt2sas_ctl_reset_handler(ioc, reset_phase); ++#if defined(TARGET_MODE) ++ mpt2sas_stm_reset_handler(ioc, reset_phase); ++#endif ++} ++ ++/** ++ * _wait_for_commands_to_complete - reset controller ++ * @ioc: Pointer to MPT_ADAPTER structure ++ * @sleep_flag: CAN_SLEEP or NO_SLEEP ++ * ++ * This function waiting(3s) for all pending commands to complete ++ * prior to putting controller in reset. ++ */ ++static void ++_wait_for_commands_to_complete(struct MPT2SAS_ADAPTER *ioc, int sleep_flag) ++{ ++ u32 ioc_state; ++ unsigned long flags; ++ u16 i; ++ ++ ioc->pending_io_count = 0; ++ if (sleep_flag != CAN_SLEEP) ++ return; ++ ++ ioc_state = mpt2sas_base_get_iocstate(ioc, 0); ++ if ((ioc_state & MPI2_IOC_STATE_MASK) != MPI2_IOC_STATE_OPERATIONAL) ++ return; ++ ++ /* pending command count */ ++ spin_lock_irqsave(&ioc->scsi_lookup_lock, flags); ++ for (i = 0; i < ioc->request_depth; i++) ++ if (ioc->scsi_lookup[i].cb_idx != 0xFF) ++ ioc->pending_io_count++; ++ spin_unlock_irqrestore(&ioc->scsi_lookup_lock, flags); ++ ++ if (!ioc->pending_io_count) ++ return; ++ ++ /* wait for pending commands to complete */ ++ wait_event_timeout(ioc->reset_wq, ioc->pending_io_count == 0, 3 * HZ); ++} ++ ++/** ++ * mpt2sas_base_hard_reset_handler - reset controller ++ * @ioc: Pointer to MPT_ADAPTER structure ++ * @sleep_flag: CAN_SLEEP or NO_SLEEP ++ * @type: FORCE_BIG_HAMMER or SOFT_RESET ++ * ++ * Returns 0 for success, non-zero for failure. ++ */ ++int ++mpt2sas_base_hard_reset_handler(struct MPT2SAS_ADAPTER *ioc, int sleep_flag, ++ enum reset_type type) ++{ ++ int r, i; ++ unsigned long flags; ++ ++ dtmprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: enter\n", ioc->name, ++ __func__)); ++ ++ spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags); ++ if (ioc->shost_recovery) { ++ spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags); ++ printk(MPT2SAS_ERR_FMT "%s: busy\n", ++ ioc->name, __func__); ++ return -EBUSY; ++ } ++ ioc->shost_recovery = 1; ++ spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags); ++ ++ _base_reset_handler(ioc, MPT2_IOC_PRE_RESET); ++ _wait_for_commands_to_complete(ioc, sleep_flag); ++ _base_mask_interrupts(ioc); ++ r = _base_make_ioc_ready(ioc, sleep_flag, type); ++ if (r) ++ goto out; ++ _base_reset_handler(ioc, MPT2_IOC_AFTER_RESET); ++ for (i = 0 ; i < ioc->facts.NumberOfPorts; i++) ++ r = _base_make_ioc_operational(ioc, ioc->pfacts[i].VF_ID, ++ sleep_flag); ++ if (!r) ++ _base_reset_handler(ioc, MPT2_IOC_DONE_RESET); ++ ++ out: ++ dtmprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: %s\n", ++ ioc->name, __func__, ((r == 0) ? "SUCCESS" : "FAILED"))); ++ ++ spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags); ++ ioc->shost_recovery = 0; ++ spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags); ++ ++ if (!r) ++ _base_reset_handler(ioc, MPT2_IOC_RUNNING); ++ return r; ++} +diff -r e02b4006a7c8 drivers/scsi/mpt2sas/mpt2sas_base.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/scsi/mpt2sas/mpt2sas_base.h Wed Jul 01 09:49:59 2009 +0100 +@@ -0,0 +1,977 @@ ++/* ++ * This is the Fusion MPT base driver providing common API layer interface ++ * for access to MPT (Message Passing Technology) firmware. ++ * ++ * This code is based on drivers/scsi/mpt2sas/mpt2_base.h ++ * Copyright (C) 2007-2008 LSI Corporation ++ * (mailto:DL-MPTFusionLinux@lsi.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. ++ * ++ * NO WARRANTY ++ * THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR ++ * CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT ++ * LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, ++ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is ++ * solely responsible for determining the appropriateness of using and ++ * distributing the Program and assumes all risks associated with its ++ * exercise of rights under this Agreement, including but not limited to ++ * the risks and costs of program errors, damage to or loss of data, ++ * programs or equipment, and unavailability or interruption of operations. ++ ++ * DISCLAIMER OF LIABILITY ++ * NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY ++ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ++ * DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), 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 OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED ++ * HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES ++ ++ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, ++ * USA. ++ */ ++ ++#ifndef MPT2SAS_BASE_H_INCLUDED ++#define MPT2SAS_BASE_H_INCLUDED ++ ++#include "mpi/mpi2_type.h" ++#include "mpi/mpi2.h" ++#include "mpi/mpi2_ioc.h" ++#include "mpi/mpi2_cnfg.h" ++#include "mpi/mpi2_init.h" ++#include "mpi/mpi2_raid.h" ++#include "mpi/mpi2_targ.h" ++#include "mpi/mpi2_tool.h" ++#include "mpi/mpi2_sas.h" ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "mpt2sas_compatibility.h" ++#include "mpt2sas_debug.h" ++ ++/* driver versioning info */ ++#define MPT2SAS_DRIVER_NAME "mpt2sas" ++#define MPT2SAS_AUTHOR "LSI Corporation " ++#define MPT2SAS_DESCRIPTION "LSI MPT Fusion SAS 2.0 Device Driver" ++#define MPT2SAS_DRIVER_VERSION "01.255.04.00" ++#define MPT2SAS_MAJOR_VERSION 01 ++#define MPT2SAS_MINOR_VERSION 255 ++#define MPT2SAS_BUILD_VERSION 04 ++#define MPT2SAS_RELEASE_VERSION 00 ++ ++/* ++ * Set MPT2SAS_SG_DEPTH value based on user input. ++ */ ++#ifdef CONFIG_SCSI_MPT2SAS_MAX_SGE ++#if CONFIG_SCSI_MPT2SAS_MAX_SGE < 16 ++#define MPT2SAS_SG_DEPTH 16 ++#elif CONFIG_SCSI_MPT2SAS_MAX_SGE > 128 ++#define MPT2SAS_SG_DEPTH 128 ++#else ++#define MPT2SAS_SG_DEPTH CONFIG_SCSI_MPT2SAS_MAX_SGE ++#endif ++#else ++#define MPT2SAS_SG_DEPTH 128 /* MAX_HW_SEGMENTS */ ++#endif ++ ++#if defined(TARGET_MODE) ++#include "mpt2sas_stm.h" ++#endif ++ ++/* ++ * Generic Defines ++ */ ++#define MPT2SAS_SATA_QUEUE_DEPTH 32 ++#define MPT2SAS_SAS_QUEUE_DEPTH 254 ++#define MPT2SAS_RAID_QUEUE_DEPTH 128 ++ ++#define MPT_NAME_LENGTH 32 /* generic length of strings */ ++#define MPT_STRING_LENGTH 64 ++ ++#define MPT_MAX_CALLBACKS 16 ++ ++#define CAN_SLEEP 1 ++#define NO_SLEEP 0 ++ ++#define INTERNAL_CMDS_COUNT 10 /* reserved cmds */ ++ ++#define MPI2_HIM_MASK 0xFFFFFFFF /* mask every bit*/ ++ ++#define MPT2SAS_INVALID_DEVICE_HANDLE 0xFFFF ++ ++/* ++ * reset phases ++ */ ++#define MPT2_IOC_PRE_RESET 1 /* prior to host reset */ ++#define MPT2_IOC_AFTER_RESET 2 /* just after host reset */ ++#define MPT2_IOC_DONE_RESET 3 /* links re-initialized */ ++#define MPT2_IOC_RUNNING 4 /* shost running */ ++ ++/* ++ * logging format ++ */ ++#define MPT2SAS_FMT "%s: " ++#define MPT2SAS_DEBUG_FMT KERN_DEBUG MPT2SAS_FMT ++#define MPT2SAS_INFO_FMT KERN_INFO MPT2SAS_FMT ++#define MPT2SAS_NOTE_FMT KERN_NOTICE MPT2SAS_FMT ++#define MPT2SAS_WARN_FMT KERN_WARNING MPT2SAS_FMT ++#define MPT2SAS_ERR_FMT KERN_ERR MPT2SAS_FMT ++ ++/* ++ * per target private data ++ */ ++#define MPT_TARGET_FLAGS_RAID_COMPONENT 0x01 ++#define MPT_TARGET_FLAGS_VOLUME 0x02 ++#define MPT_TARGET_FLAGS_DELETED 0x04 ++ ++/* Enable Multipath suport */ ++#define MPT2SAS_MULTIPATH ++ ++/* ++ * Dell HBA branding ++ */ ++#define MPT2SAS_DELL_BRANDING_SIZE 32 ++ ++#define MPT2SAS_DELL_6GBPS_SAS_HBA_BRANDING "Dell 6Gbps SAS HBA" ++#define MPT2SAS_DELL_PERC_H200_ADAPTER_BRANDING "Dell PERC H200 Adapter" ++#define MPT2SAS_DELL_PERC_H200_INTEGRATED_BRANDING "Dell PERC H200 Integrated" ++#define MPT2SAS_DELL_PERC_H200_MODULAR_BRANDING "Dell PERC H200 Modular" ++#define MPT2SAS_DELL_PERC_H200_EMBEDDED_BRANDING "Dell PERC H200 Embedded" ++#define MPT2SAS_DELL_PERC_H200_BRANDING "Dell PERC H200" ++#define MPT2SAS_DELL_6GBPS_SAS_BRANDING "Dell 6Gbps SAS" ++ ++/* ++ * Dell HBA SSDIDs ++ */ ++#define MPT2SAS_DELL_6GBPS_SAS_HBA_SSDID 0x1F1C ++#define MPT2SAS_DELL_PERC_H200_ADAPTER_SSDID 0x1F1D ++#define MPT2SAS_DELL_PERC_H200_INTEGRATED_SSDID 0x1F1E ++#define MPT2SAS_DELL_PERC_H200_MODULAR_SSDID 0x1F1F ++#define MPT2SAS_DELL_PERC_H200_EMBEDDED_SSDID 0x1F20 ++#define MPT2SAS_DELL_PERC_H200_SSDID 0x1F21 ++#define MPT2SAS_DELL_6GBPS_SAS_SSDID 0x1F22 ++ ++/* ++ * End to End Data Protection Support ++ */ ++#define EEDP_SUPPORT ++#ifdef EEDP_SUPPORT ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27)) ++ ++#define PRO_R MPI2_SCSIIO_EEDPFLAGS_CHECK_REMOVE_OP ++#define PRO_W MPI2_SCSIIO_EEDPFLAGS_INSERT_OP ++#define PRO_V MPI2_SCSIIO_EEDPFLAGS_INSERT_OP ++ ++/* the read capacity 16 byte parameter block - defined in SBC-3 */ ++struct read_cap_parameter{ ++ u64 logical_block_addr; ++ u32 logical_block_length; ++ u8 prot_en:1; ++ u8 p_type:3; ++ u8 reserved0:4; ++ u8 logical_blocks_per_phyical_block:4; ++ u8 reserved1:4; ++ u16 lowest_aligned_log_block_address:14; ++ u16 reserved2:2; ++ u8 reserved3[16]; ++}; ++#endif ++#endif ++ ++/* OEM Identifiers */ ++#define MFG10_OEM_ID_INVALID (0x00000000) ++#define MFG10_OEM_ID_DELL (0x00000001) ++#define MFG10_OEM_ID_FSC (0x00000002) ++#define MFG10_OEM_ID_SUN (0x00000003) ++#define MFG10_OEM_ID_IBM (0x00000004) ++ ++/* GENERIC Flags 0*/ ++#define MFG10_GF0_OCE_DISABLED (0x00000001) ++#define MFG10_GF0_R1E_DRIVE_COUNT (0x00000002) ++#define MFG10_GF0_R10_DISPLAY (0x00000004) ++#define MFG10_GF0_SSD_DATA_SCRUB_DISABLE (0x00000008) ++#define MFG10_GF0_SINGLE_DRIVE_R0 (0x00000010) ++ ++/* OEM Specific Flags will come from OEM specific header files */ ++typedef struct _MPI2_CONFIG_PAGE_MAN_10 ++{ ++ MPI2_CONFIG_PAGE_HEADER Header; /* 00h */ ++ U8 OEMIdentifier; /* 04h */ ++ U8 Reserved1; /* 05h */ ++ U16 Reserved2; /* 08h */ ++ U32 Reserved3; /* 0Ch */ ++ U32 GenericFlags0; /* 10h */ ++ U32 GenericFlags1; /* 14h */ ++ U32 Reserved4; /* 18h */ ++ U32 OEMSpecificFlags0; /* 1Ch */ ++ U32 OEMSpecificFlags1; /* 20h */ ++ U32 Reserved5[18]; /* 24h - 60h*/ ++} MPI2_CONFIG_PAGE_MAN_10, ++ MPI2_POINTER PTR_MPI2_CONFIG_PAGE_MAN_10, ++ Mpi2ManufacturingPage10_t, MPI2_POINTER pMpi2ManufacturingPage10_t; ++ ++/** ++ * struct MPT2SAS_TARGET - starget private hostdata ++ * @starget: starget object ++ * @sas_address: target sas address ++ * @handle: device handle ++ * @num_luns: number luns ++ * @flags: MPT_TARGET_FLAGS_XXX flags ++ * @deleted: target flaged for deletion ++ * @tm_busy: target is busy with TM request. ++ */ ++struct MPT2SAS_TARGET { ++ struct scsi_target *starget; ++ u64 sas_address; ++ u16 handle; ++ int num_luns; ++ u32 flags; ++ u8 deleted; ++ u8 tm_busy; ++}; ++ ++/* ++ * per device private data ++ */ ++#define MPT_DEVICE_FLAGS_INIT 0x01 ++#define MPT_DEVICE_TLR_ON 0x02 ++ ++/** ++ * struct MPT2SAS_DEVICE - sdev private hostdata ++ * @sas_target: starget private hostdata ++ * @lun: lun number ++ * @flags: MPT_DEVICE_XXX flags ++ * @configured_lun: lun is configured ++ * @block: device is in SDEV_BLOCK state ++ * @tlr_snoop_check: flag used in determining whether to disable TLR ++ * @eedp_enable: eedp support enable bit ++ * @eedp_type: 0(type_1), 1(type_2), 2(type_3) ++ * @eedp_block_length: block size ++ */ ++struct MPT2SAS_DEVICE { ++ struct MPT2SAS_TARGET *sas_target; ++ unsigned int lun; ++ u32 flags; ++ u8 configured_lun; ++ u8 block; ++ u8 tlr_snoop_check; ++#ifdef EEDP_SUPPORT ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27)) ++ u8 eedp_enable; ++ u8 eedp_type; ++#endif ++#endif ++}; ++ ++#define MPT2_CMD_NOT_USED 0x8000 /* free */ ++#define MPT2_CMD_COMPLETE 0x0001 /* completed */ ++#define MPT2_CMD_PENDING 0x0002 /* pending */ ++#define MPT2_CMD_REPLY_VALID 0x0004 /* reply is valid */ ++#define MPT2_CMD_RESET 0x0008 /* host reset dropped the command */ ++ ++/** ++ * struct _internal_cmd - internal commands struct ++ * @mutex: mutex ++ * @done: completion ++ * @reply: reply message pointer ++ * @status: MPT2_CMD_XXX status ++ * @smid: system message id ++ */ ++struct _internal_cmd { ++ struct mutex mutex; ++ struct completion done; ++ void *reply; ++ u16 status; ++ u16 smid; ++}; ++ ++#if (defined(CONFIG_SUSE_KERNEL) && defined(scsi_is_sas_phy_local)) || LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18) ++#define MPT_WIDE_PORT_API 1 ++#define MPT_WIDE_PORT_API_PLUS 1 ++#endif ++ ++/* ++ * SAS Topology Structures ++ */ ++ ++/** ++ * struct _sas_device - attached device information ++ * @list: sas device list ++ * @starget: starget object ++ * @sas_address: device sas address ++ * @device_name: retrieved from the SAS IDENTIFY frame. ++ * @handle: device handle ++ * @parent_handle: handle to parent device ++ * @enclosure_handle: enclosure handle ++ * @enclosure_logical_id: enclosure logical identifier ++ * @volume_handle: volume handle (valid when hidden raid member) ++ * @volume_wwid: volume unique identifier ++ * @device_info: bitfield provides detailed info about the device ++ * @id: target id ++ * @channel: target channel ++ * @slot: number number ++ * @hidden_raid_component: set to 1 when this is a raid member ++ * @responding: used in _scsih_sas_device_mark_responding ++ */ ++struct _sas_device { ++ struct list_head list; ++ struct scsi_target *starget; ++ u64 sas_address; ++ u64 device_name; ++ u16 handle; ++ u16 parent_handle; ++ u16 enclosure_handle; ++ u64 enclosure_logical_id; ++ u16 volume_handle; ++ u64 volume_wwid; ++ u32 device_info; ++ int id; ++ int channel; ++ u16 slot; ++ u8 hidden_raid_component; ++ u8 responding; ++#ifdef MPT2SAS_MULTIPATH ++ u8 *serial_number; ++ struct MPT2SAS_ADAPTER *ioc; ++ struct _sas_device *sas_device_alt; ++#endif ++}; ++ ++/** ++ * struct _raid_device - raid volume link list ++ * @list: sas device list ++ * @starget: starget object ++ * @sdev: scsi device struct (volumes are single lun) ++ * @wwid: unique identifier for the volume ++ * @handle: device handle ++ * @id: target id ++ * @channel: target channel ++ * @volume_type: the raid level ++ * @device_info: bitfield provides detailed info about the hidden components ++ * @num_pds: number of hidden raid components ++ * @responding: used in _scsih_raid_device_mark_responding ++ */ ++struct _raid_device { ++ struct list_head list; ++ struct scsi_target *starget; ++ struct scsi_device *sdev; ++ u64 wwid; ++ u16 handle; ++ int id; ++ int channel; ++ u8 volume_type; ++ u32 device_info; ++ u8 num_pds; ++ u8 responding; ++}; ++ ++/** ++ * struct _boot_device - boot device info ++ * @is_raid: flag to indicate whether this is volume ++ * @device: holds pointer for either struct _sas_device or ++ * struct _raid_device ++ */ ++struct _boot_device { ++ u8 is_raid; ++ void *device; ++}; ++ ++/** ++ * struct _sas_port - wide/narrow sas port information ++ * @port_list: list of ports belonging to expander ++ * @handle: device handle for this port ++ * @sas_address: sas address of this port ++ * @num_phys: number of phys belonging to this port ++ * @remote_identify: attached device identification ++ * @rphy: sas transport rphy object ++ * @port: sas transport wide/narrow port object ++ * @phy_list: _sas_phy list objects belonging to this port ++ */ ++struct _sas_port { ++ struct list_head port_list; ++ u16 handle; ++ u64 sas_address; ++ u8 num_phys; ++ struct sas_identify remote_identify; ++ struct sas_rphy *rphy; ++#if defined(MPT_WIDE_PORT_API) ++ struct sas_port *port; ++#endif ++ struct list_head phy_list; ++}; ++ ++/** ++ * struct _sas_phy - phy information ++ * @port_siblings: list of phys belonging to a port ++ * @identify: phy identification ++ * @remote_identify: attached device identification ++ * @phy: sas transport phy object ++ * @phy_id: unique phy id ++ * @handle: device handle for this phy ++ * @attached_handle: device handle for attached device ++ */ ++struct _sas_phy { ++ struct list_head port_siblings; ++ struct sas_identify identify; ++ struct sas_identify remote_identify; ++ struct sas_phy *phy; ++ u8 phy_id; ++ u16 handle; ++ u16 attached_handle; ++}; ++ ++/** ++ * struct _sas_node - sas_host/expander information ++ * @list: list of expanders ++ * @parent_dev: parent device class ++ * @num_phys: number phys belonging to this sas_host/expander ++ * @sas_address: sas address of this sas_host/expander ++ * @handle: handle for this sas_host/expander ++ * @parent_handle: parent handle ++ * @enclosure_handle: handle for this a member of an enclosure ++ * @device_info: bitwise defining capabilities of this sas_host/expander ++ * @responding: used in _scsih_expander_device_mark_responding ++ * @phy: a list of phys that make up this sas_host/expander ++ * @sas_port_list: list of ports attached to this sas_host/expander ++ */ ++struct _sas_node { ++ struct list_head list; ++ struct device *parent_dev; ++ u8 num_phys; ++ u64 sas_address; ++ u16 handle; ++ u16 parent_handle; ++ u16 enclosure_handle; ++ u64 enclosure_logical_id; ++ u8 responding; ++ struct _sas_phy *phy; ++ struct list_head sas_port_list; ++}; ++ ++/** ++ * enum reset_type - reset state ++ * @FORCE_BIG_HAMMER: issue diagnostic reset ++ * @SOFT_RESET: issue message_unit_reset, if fails to to big hammer ++ */ ++enum reset_type { ++ FORCE_BIG_HAMMER, ++ SOFT_RESET, ++}; ++ ++#if defined(CHAIN_POOL) ++/** ++ * struct chain_tracker - firmware chain tracker ++ * @index: index from zero (ioc->chain) ++ * @tracker_list: list of free request (ioc->free_chain_list) ++ */ ++struct chain_tracker { ++ u16 index; ++ struct list_head tracker_list; ++}; ++#endif ++ ++/** ++ * struct request_tracker - firmware request tracker ++ * @smid: system message id ++ * @scmd: scsi request pointer ++ * @cb_idx: callback index ++ * @chain_list: list of chains associated to this IO ++ * @tracker_list: list of free request (ioc->free_list) ++ */ ++struct request_tracker { ++ u16 smid; ++ struct scsi_cmnd *scmd; ++ u8 cb_idx; ++#if defined(CHAIN_POOL) ++ struct list_head chain_list; ++#endif ++ struct list_head tracker_list; ++}; ++ ++typedef void (*MPT_ADD_SGE)(void *paddr, u32 flags_length, dma_addr_t dma_addr); ++ ++/** ++ * struct MPT2SAS_ADAPTER - per adapter struct ++ * @list: ioc_list ++ * @shost: shost object ++ * @id: unique adapter id ++ * @pci_irq: irq number ++ * @name: generic ioc string ++ * @tmp_string: tmp string used for logging ++ * @pdev: pci pdev object ++ * @chip: memory mapped register space ++ * @chip_phys: physical addrss prior to mapping ++ * @pio_chip: I/O mapped register space ++ * @logging_level: see mpt2sas_debug.h ++ * @ir_firmware: IR firmware present ++ * @bars: bitmask of BAR's that must be configured ++ * @mask_interrupts: ignore interrupt ++ * @fault_reset_work_q_name: fw fault work queue ++ * @fault_reset_work_q: "" ++ * @fault_reset_work: "" ++ * @firmware_event_name: fw event work queue ++ * @firmware_event_thread: "" ++ * @fw_events_off: flag to turn off fw event handling ++ * @fw_event_lock: ++ * @fw_event_list: list of fw events ++ * @aen_event_read_flag: event log was read ++ * @broadcast_aen_busy: broadcast aen waiting to be serviced ++ * @shost_recovery: host reset in progress ++ * @ioc_reset_in_progress_lock: ++ * @ioc_link_reset_in_progress: phy/hard reset in progress ++ * @ignore_loginfos: ignore loginfos during task managment ++ * @remove_host: flag for when driver unloads, to avoid sending dev resets ++ * @wait_for_port_enable_to_complete: ++ * @msix_enable: flag indicating msix is enabled ++ * @msix_vector_count: number msix vectors ++ * @msix_table: virt address to the msix table ++ * @msix_table_backup: backup msix table ++ * @scsi_io_cb_idx: shost generated commands ++ * @tm_cb_idx: task management commands ++ * @scsih_cb_idx: scsih internal commands ++ * @ctl_cb_idx: clt internal commands ++ * @base_cb_idx: base internal commands ++ * @config_cb_idx: base internal commands ++ * @base_cmds: ++ * @transport_cmds: ++ * @scsih_cmds: ++ * @tm_cmds: ++ * @ctl_cmds: ++ * @config_cmds: ++ * @base_add_sg_single: handler for either 32/64 bit sgl's ++ * @event_type: bits indicating which events to log ++ * @event_context: unique id for each logged event ++ * @event_log: event log pointer ++ * @event_masks: events that are masked ++ * @facts: static facts data ++ * @pfacts: static port facts data ++ * @manu_pg0: static manufacturing page 0 ++ * @manu_pg10: static manufacturing page 10 ++ * @bios_pg2: static bios page 2 ++ * @bios_pg3: static bios page 3 ++ * @ioc_pg8: static ioc page 8 ++ * @iounit_pg0: static iounit page 0 ++ * @iounit_pg1: static iounit page 1 ++ * @sas_hba: sas host object ++ * @sas_expander_list: expander object list ++ * @sas_node_lock: ++ * @sas_device_list: sas device object list ++ * @sas_device_init_list: sas device object list (used only at init time) ++ * @sas_device_lock: ++ * @io_missing_delay: time for IO completed by fw when PDR enabled ++ * @device_missing_delay: time for device missing by fw when PDR enabled ++ * @config_page_sz: config page size ++ * @config_page: reserve memory for config page payload ++ * @config_page_dma: ++ * @sge_size: sg element size for either 32/64 bit ++ * @request_depth: hba request queue depth ++ * @request_sz: per request frame size ++ * @request: pool of request frames ++ * @request_dma: ++ * @request_dma_sz: ++ * @scsi_lookup: firmware request tracker list ++ * @scsi_lookup_lock: ++ * @free_list: free list of request ++ * @pending_io_count: ++ * @reset_wq: ++ * @chain: pool of chains ++ * @chain_dma: ++ * @max_sges_in_main_message: number sg elements in main message ++ * @max_sges_in_chain_message: number sg elements per chain ++ * @chains_needed_per_io: max chains per io ++ * @chain_offset_value_for_main_message: location 1st sg in main ++ * @chain_depth: total chains allocated ++ * @chain_lookup: chain lookup table ++ * @free_chain_list: pool of free chains buffers ++ * @sense: pool of sense ++ * @sense_dma: ++ * @sense_dma_pool: ++ * @reply_depth: hba reply queue depth: ++ * @reply_sz: per reply frame size: ++ * @reply: pool of replys: ++ * @reply_dma: ++ * @reply_dma_pool: ++ * @reply_free_queue_depth: reply free depth ++ * @reply_free: pool for reply free queue (32 bit addr) ++ * @reply_free_dma: ++ * @reply_free_dma_pool: ++ * @reply_free_host_index: tail index in pool to insert free replys ++ * @reply_post_queue_depth: reply post queue depth ++ * @reply_post_free: pool for reply post (64bit descriptor) ++ * @reply_post_free_dma: ++ * @reply_post_free_dma_pool: ++ * @reply_post_host_index: head index in the pool where FW completes IO ++ */ ++struct MPT2SAS_ADAPTER { ++ struct list_head list; ++ struct Scsi_Host *shost; ++ u8 id; ++ u32 pci_irq; ++ char name[MPT_NAME_LENGTH]; ++ char tmp_string[MPT_STRING_LENGTH]; ++ struct pci_dev *pdev; ++ Mpi2SystemInterfaceRegs_t __iomem *chip; ++ unsigned long chip_phys; ++ unsigned long pio_chip; ++ int logging_level; ++ u8 ir_firmware; ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21)) ++ int bars; ++#endif ++ u8 mask_interrupts; ++ ++ /* fw fault handler */ ++ char fault_reset_work_q_name[20]; ++ struct workqueue_struct *fault_reset_work_q; ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,19)) ++ struct delayed_work fault_reset_work; ++#else ++ struct work_struct fault_reset_work; ++#endif ++ ++ /* fw event handler */ ++ char firmware_event_name[20]; ++ struct workqueue_struct *firmware_event_thread; ++ u8 fw_events_off; ++ spinlock_t fw_event_lock; ++ struct list_head fw_event_list; ++ ++ /* misc flags */ ++ int aen_event_read_flag; ++ u8 broadcast_aen_busy; ++ u8 shost_recovery; ++ spinlock_t ioc_reset_in_progress_lock; ++ u8 ioc_link_reset_in_progress; ++ u8 ignore_loginfos; ++ u8 remove_host; ++ u8 wait_for_port_enable_to_complete; ++ ++ u8 msix_enable; ++ u16 msix_vector_count; ++ u32 *msix_table; ++ u32 *msix_table_backup; ++ ++ /* internal commands, callback index */ ++ u8 scsi_io_cb_idx; ++ u8 tm_cb_idx; ++ u8 transport_cb_idx; ++ u8 scsih_cb_idx; ++ u8 ctl_cb_idx; ++ u8 base_cb_idx; ++ u8 config_cb_idx; ++ struct _internal_cmd base_cmds; ++ struct _internal_cmd transport_cmds; ++ struct _internal_cmd scsih_cmds; ++ struct _internal_cmd tm_cmds; ++ struct _internal_cmd ctl_cmds; ++ struct _internal_cmd config_cmds; ++ ++ MPT_ADD_SGE base_add_sg_single; ++ ++ /* event log */ ++ u32 event_type[MPI2_EVENT_NOTIFY_EVENTMASK_WORDS]; ++ u32 event_context; ++ void *event_log; ++ u32 event_masks[MPI2_EVENT_NOTIFY_EVENTMASK_WORDS]; ++ ++ /* static config pages */ ++ Mpi2IOCFactsReply_t facts; ++ Mpi2PortFactsReply_t *pfacts; ++ Mpi2ManufacturingPage0_t manu_pg0; ++ Mpi2ManufacturingPage10_t manu_pg10; ++ Mpi2BiosPage2_t bios_pg2; ++ Mpi2BiosPage3_t bios_pg3; ++ Mpi2IOCPage8_t ioc_pg8; ++ Mpi2IOUnitPage0_t iounit_pg0; ++ Mpi2IOUnitPage1_t iounit_pg1; ++ ++ struct _boot_device req_boot_device; ++ struct _boot_device req_alt_boot_device; ++ struct _boot_device current_boot_device; ++ ++ /* sas hba, expander, and device list */ ++ struct _sas_node sas_hba; ++ struct list_head sas_expander_list; ++ spinlock_t sas_node_lock; ++ struct list_head sas_device_list; ++ struct list_head sas_device_init_list; ++ spinlock_t sas_device_lock; ++ struct list_head raid_device_list; ++ spinlock_t raid_device_lock; ++ u8 io_missing_delay; ++ u16 device_missing_delay; ++ int sas_id; ++ ++ /* config page */ ++ u16 config_page_sz; ++ void *config_page; ++ dma_addr_t config_page_dma; ++ ++ /* request */ ++ u16 sge_size; ++ u16 request_depth; ++ u16 request_sz; ++ u8 *request; ++ dma_addr_t request_dma; ++ u32 request_dma_sz; ++ struct request_tracker *scsi_lookup; ++ spinlock_t scsi_lookup_lock; ++ struct list_head free_list; ++ int pending_io_count; ++ wait_queue_head_t reset_wq; ++ ++ /* chain */ ++ u8 *chain; ++ dma_addr_t chain_dma; ++ u16 max_sges_in_main_message; ++ u16 max_sges_in_chain_message; ++ u16 chains_needed_per_io; ++ u16 chain_offset_value_for_main_message; ++ u16 chain_depth; ++#if defined(CHAIN_POOL) ++ struct chain_tracker *chain_lookup; ++ struct list_head free_chain_list; ++#endif ++ ++ /* sense */ ++ u8 *sense; ++ dma_addr_t sense_dma; ++ struct dma_pool *sense_dma_pool; ++ ++ /* reply */ ++ u16 reply_sz; ++ u8 *reply; ++ dma_addr_t reply_dma; ++ struct dma_pool *reply_dma_pool; ++ ++ /* reply free queue */ ++ u16 reply_free_queue_depth; ++ u32 *reply_free; ++ dma_addr_t reply_free_dma; ++ struct dma_pool *reply_free_dma_pool; ++ u32 reply_free_host_index; ++ ++ /* reply post queue */ ++ u16 reply_post_queue_depth; ++ Mpi2ReplyDescriptorsUnion_t *reply_post_free; ++ dma_addr_t reply_post_free_dma; ++ struct dma_pool *reply_post_free_dma_pool; ++ u32 reply_post_host_index; ++ ++ /* diag buffer support */ ++ u8 *diag_buffer[MPI2_DIAG_BUF_TYPE_COUNT]; ++ u32 diag_buffer_sz[MPI2_DIAG_BUF_TYPE_COUNT]; ++ dma_addr_t diag_buffer_dma[MPI2_DIAG_BUF_TYPE_COUNT]; ++ u8 diag_buffer_status[MPI2_DIAG_BUF_TYPE_COUNT]; ++ u32 unique_id[MPI2_DIAG_BUF_TYPE_COUNT]; ++ u32 product_specific[MPI2_DIAG_BUF_TYPE_COUNT][23]; ++ u32 diagnostic_flags[MPI2_DIAG_BUF_TYPE_COUNT]; ++#if defined(TARGET_MODE) ++ char stm_name[MPT_NAME_LENGTH]; ++ u8 stm_io_cb_idx; /* normal io */ ++ u8 stm_tm_cb_idx; /* task managment */ ++ u8 stm_tm_imm_cb_idx; ++ struct _internal_cmd stm_tm_cmds; ++ void *priv; ++#endif ++}; ++ ++typedef void (*MPT_CALLBACK)(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 VF_ID, ++ u32 reply); ++ ++/* base shared API */ ++extern struct list_head mpt2sas_ioc_list; ++ ++int mpt2sas_base_attach(struct MPT2SAS_ADAPTER *ioc); ++void mpt2sas_base_detach(struct MPT2SAS_ADAPTER *ioc); ++int mpt2sas_base_map_resources(struct MPT2SAS_ADAPTER *ioc); ++void mpt2sas_base_free_resources(struct MPT2SAS_ADAPTER *ioc); ++int mpt2sas_base_hard_reset_handler(struct MPT2SAS_ADAPTER *ioc, int sleep_flag, ++ enum reset_type type); ++ ++void *mpt2sas_base_get_msg_frame(struct MPT2SAS_ADAPTER *ioc, u16 smid); ++void *mpt2sas_base_get_sense_buffer(struct MPT2SAS_ADAPTER *ioc, u16 smid); ++void mpt2sas_base_build_zero_len_sge(struct MPT2SAS_ADAPTER *ioc, void *paddr); ++dma_addr_t mpt2sas_base_get_msg_frame_dma(struct MPT2SAS_ADAPTER *ioc, ++ u16 smid); ++dma_addr_t mpt2sas_base_get_sense_buffer_dma(struct MPT2SAS_ADAPTER *ioc, ++ u16 smid); ++ ++u16 mpt2sas_base_get_smid(struct MPT2SAS_ADAPTER *ioc, u8 cb_idx); ++void mpt2sas_base_free_smid(struct MPT2SAS_ADAPTER *ioc, u16 smid); ++void mpt2sas_base_put_smid_scsi_io(struct MPT2SAS_ADAPTER *ioc, u16 smid, ++ u8 vf_id, u16 handle); ++void mpt2sas_base_put_smid_hi_priority(struct MPT2SAS_ADAPTER *ioc, u16 smid, ++ u8 vf_id); ++void mpt2sas_base_put_smid_target_assist(struct MPT2SAS_ADAPTER *ioc, u16 smid, ++ u8 vf_id, u16 io_index); ++void mpt2sas_base_put_smid_default(struct MPT2SAS_ADAPTER *ioc, u16 smid, ++ u8 vf_id); ++void mpt2sas_base_initialize_callback_handler(void); ++u8 mpt2sas_base_register_callback_handler(MPT_CALLBACK cb_func); ++void mpt2sas_base_release_callback_handler(u8 cb_idx); ++ ++void mpt2sas_base_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 VF_ID, ++ u32 reply); ++void *mpt2sas_base_get_reply_virt_addr(struct MPT2SAS_ADAPTER *ioc, ++ u32 phys_addr); ++ ++u32 mpt2sas_base_get_iocstate(struct MPT2SAS_ADAPTER *ioc, int cooked); ++ ++void mpt2sas_base_fault_info(struct MPT2SAS_ADAPTER *ioc , u16 fault_code); ++int mpt2sas_base_sas_iounit_control(struct MPT2SAS_ADAPTER *ioc, ++ Mpi2SasIoUnitControlReply_t *mpi_reply, Mpi2SasIoUnitControlRequest_t ++ *mpi_request); ++int mpt2sas_base_scsi_enclosure_processor(struct MPT2SAS_ADAPTER *ioc, ++ Mpi2SepReply_t *mpi_reply, Mpi2SepRequest_t *mpi_request); ++ ++void mpt2sas_base_validate_event_type(struct MPT2SAS_ADAPTER *ioc, ++ u32 *event_type); ++ ++/* scsih shared API */ ++void mpt2sas_scsih_event_callback(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID, ++ u32 reply); ++void mpt2sas_scsih_reset_handler(struct MPT2SAS_ADAPTER *ioc, int reset_phase); ++#ifdef MPT2SAS_MULTIPATH ++void mpt2sas_scsih_check_tm_for_multipath(struct MPT2SAS_ADAPTER *ioc, ++ u16 handle, u8 task_type); ++#endif ++void mpt2sas_scsih_issue_tm(struct MPT2SAS_ADAPTER *ioc, u16 handle, uint lun, ++ u8 type, u16 smid_task, ulong timeout); ++void mpt2sas_scsih_set_tm_flag(struct MPT2SAS_ADAPTER *ioc, u16 handle); ++void mpt2sas_scsih_clear_tm_flag(struct MPT2SAS_ADAPTER *ioc, u16 handle); ++ ++struct _sas_node *mpt2sas_scsih_expander_find_by_handle( ++ struct MPT2SAS_ADAPTER *ioc, u16 handle); ++struct _sas_node *mpt2sas_scsih_expander_find_by_sas_address( ++ struct MPT2SAS_ADAPTER *ioc, u64 sas_address); ++struct _sas_device *mpt2sas_scsih_sas_device_find_by_sas_address( ++ struct MPT2SAS_ADAPTER *ioc, u64 sas_address); ++ ++/* config shared API */ ++void mpt2sas_config_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 VF_ID, ++ u32 reply); ++int mpt2sas_config_get_number_hba_phys(struct MPT2SAS_ADAPTER *ioc, ++ u8 *num_phys); ++int mpt2sas_config_get_manufacturing_pg0(struct MPT2SAS_ADAPTER *ioc, ++ Mpi2ConfigReply_t *mpi_reply, Mpi2ManufacturingPage0_t *config_page); ++int mpt2sas_config_get_manufacturing_pg10(struct MPT2SAS_ADAPTER *ioc, ++ Mpi2ConfigReply_t *mpi_reply, Mpi2ManufacturingPage10_t *config_page); ++int mpt2sas_config_get_bios_pg2(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t ++ *mpi_reply, Mpi2BiosPage2_t *config_page); ++int mpt2sas_config_get_bios_pg3(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t ++ *mpi_reply, Mpi2BiosPage3_t *config_page); ++int mpt2sas_config_get_iounit_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t ++ *mpi_reply, Mpi2IOUnitPage0_t *config_page); ++int mpt2sas_config_get_sas_device_pg0(struct MPT2SAS_ADAPTER *ioc, ++ Mpi2ConfigReply_t *mpi_reply, Mpi2SasDevicePage0_t *config_page, u32 form, ++ u32 handle); ++int mpt2sas_config_get_sas_device_pg1(struct MPT2SAS_ADAPTER *ioc, ++ Mpi2ConfigReply_t *mpi_reply, Mpi2SasDevicePage1_t *config_page, u32 form, ++ u32 handle); ++int mpt2sas_config_get_sas_iounit_pg0(struct MPT2SAS_ADAPTER *ioc, ++ Mpi2ConfigReply_t *mpi_reply, Mpi2SasIOUnitPage0_t *config_page, u16 sz); ++int mpt2sas_config_get_iounit_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t ++ *mpi_reply, Mpi2IOUnitPage1_t *config_page); ++int mpt2sas_config_set_iounit_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t ++ *mpi_reply, Mpi2IOUnitPage1_t *config_page); ++int mpt2sas_config_get_sas_iounit_pg1(struct MPT2SAS_ADAPTER *ioc, ++ Mpi2ConfigReply_t *mpi_reply, Mpi2SasIOUnitPage1_t *config_page, u16 sz); ++int mpt2sas_config_get_ioc_pg8(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t ++ *mpi_reply, Mpi2IOCPage8_t *config_page); ++int mpt2sas_config_get_expander_pg0(struct MPT2SAS_ADAPTER *ioc, ++ Mpi2ConfigReply_t *mpi_reply, Mpi2ExpanderPage0_t *config_page, u32 form, ++ u32 handle); ++int mpt2sas_config_get_expander_pg1(struct MPT2SAS_ADAPTER *ioc, ++ Mpi2ConfigReply_t *mpi_reply, Mpi2ExpanderPage1_t *config_page, ++ u32 phy_number, u16 handle); ++int mpt2sas_config_get_enclosure_pg0(struct MPT2SAS_ADAPTER *ioc, ++ Mpi2ConfigReply_t *mpi_reply, Mpi2SasEnclosurePage0_t *config_page, ++ u32 form, u32 handle); ++int mpt2sas_config_get_phy_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t ++ *mpi_reply, Mpi2SasPhyPage0_t *config_page, u32 phy_number); ++int mpt2sas_config_get_phy_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t ++ *mpi_reply, Mpi2SasPhyPage1_t *config_page, u32 phy_number); ++int mpt2sas_config_get_raid_volume_pg1(struct MPT2SAS_ADAPTER *ioc, ++ Mpi2ConfigReply_t *mpi_reply, Mpi2RaidVolPage1_t *config_page, u32 form, ++ u32 handle); ++int mpt2sas_config_get_number_pds(struct MPT2SAS_ADAPTER *ioc, u16 handle, ++ u8 *num_pds); ++int mpt2sas_config_get_raid_volume_pg0(struct MPT2SAS_ADAPTER *ioc, ++ Mpi2ConfigReply_t *mpi_reply, Mpi2RaidVolPage0_t *config_page, u32 form, ++ u32 handle, u16 sz); ++int mpt2sas_config_get_phys_disk_pg0(struct MPT2SAS_ADAPTER *ioc, ++ Mpi2ConfigReply_t *mpi_reply, Mpi2RaidPhysDiskPage0_t *config_page, ++ u32 form, u32 form_specific); ++int mpt2sas_config_get_volume_handle(struct MPT2SAS_ADAPTER *ioc, u16 pd_handle, ++ u16 *volume_handle); ++int mpt2sas_config_get_volume_wwid(struct MPT2SAS_ADAPTER *ioc, ++ u16 volume_handle, u64 *wwid); ++ ++/* ctl shared API */ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,25)) ++extern struct device_attribute *mpt2sas_host_attrs[]; ++#else ++extern struct class_device_attribute *mpt2sas_host_attrs[]; ++#endif ++extern struct device_attribute *mpt2sas_dev_attrs[]; ++void mpt2sas_ctl_init(void); ++void mpt2sas_ctl_exit(void); ++void mpt2sas_ctl_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 VF_ID, ++ u32 reply); ++void mpt2sas_ctl_reset_handler(struct MPT2SAS_ADAPTER *ioc, int reset_phase); ++void mpt2sas_ctl_event_callback(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID, ++ u32 reply); ++void mpt2sas_ctl_add_to_event_log(struct MPT2SAS_ADAPTER *ioc, ++ Mpi2EventNotificationReply_t *mpi_reply); ++ ++/* transport shared API */ ++void mpt2sas_transport_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 VF_ID, u32 reply); ++struct _sas_port *mpt2sas_transport_port_add(struct MPT2SAS_ADAPTER *ioc, ++ u16 handle, u16 parent_handle); ++void mpt2sas_transport_port_remove(struct MPT2SAS_ADAPTER *ioc, u64 sas_address, ++ u16 parent_handle); ++int mpt2sas_transport_add_host_phy(struct MPT2SAS_ADAPTER *ioc, struct _sas_phy ++ *mpt2sas_phy, Mpi2SasPhyPage0_t phy_pg0, struct device *parent_dev); ++int mpt2sas_transport_add_expander_phy(struct MPT2SAS_ADAPTER *ioc, ++ struct _sas_phy *mpt2sas_phy, Mpi2ExpanderPage1_t expander_pg1, ++ struct device *parent_dev); ++void mpt2sas_transport_update_links(struct MPT2SAS_ADAPTER *ioc, ++ u16 handle, u16 attached_handle, u8 phy_number, u8 link_rate); ++extern struct sas_function_template mpt2sas_transport_functions; ++extern struct scsi_transport_template *mpt2sas_transport_template; ++ ++#if defined(TARGET_MODE) ++extern void mpt2sas_stmapp_target_command(struct MPT2SAS_ADAPTER *ioc, ++ u16 io_index, u16 initiator_handle, u8 VP_ID, u8 VF_ID, u8 phy_number); ++extern void mpt2sas_stm_target_assist_success_reply(struct MPT2SAS_ADAPTER *ioc, ++ u16 smid, u8 VF_ID, u16 io_index, u8 sequence_number); ++extern void mpt2sas_stm_init(void); ++extern void mpt2sas_stm_exit(void); ++extern void mpt2sas_stm_adapter_install(struct MPT2SAS_ADAPTER *ioc); ++extern void mpt2sas_stm_adapter_dispose(struct MPT2SAS_ADAPTER *ioc); ++extern void mpt2sas_stm_zero_smid_handler(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID, ++ u32 reply); ++extern void mpt2sas_stm_reset_handler(struct MPT2SAS_ADAPTER *ioc, ++ int reset_phase); ++#endif ++ ++#endif /* MPT2SAS_BASE_H_INCLUDED */ +diff -r e02b4006a7c8 drivers/scsi/mpt2sas/mpt2sas_compatibility.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/scsi/mpt2sas/mpt2sas_compatibility.h Wed Jul 01 09:49:59 2009 +0100 +@@ -0,0 +1,142 @@ ++/* ++ * Compatiblity Header for compilation working across multiple kernels ++ * ++ * This code is based on drivers/scsi/mpt2sas/mpt2_base.c ++ * Copyright (C) 2007-2008 LSI Corporation ++ * (mailto:DL-MPTFusionLinux@lsi.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. ++ * ++ * NO WARRANTY ++ * THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR ++ * CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT ++ * LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, ++ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is ++ * solely responsible for determining the appropriateness of using and ++ * distributing the Program and assumes all risks associated with its ++ * exercise of rights under this Agreement, including but not limited to ++ * the risks and costs of program errors, damage to or loss of data, ++ * programs or equipment, and unavailability or interruption of operations. ++ ++ * DISCLAIMER OF LIABILITY ++ * NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY ++ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ++ * DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), 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 OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED ++ * HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES ++ ++ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, ++ * USA. ++ */ ++ ++#ifndef FUSION_LINUX_COMPAT_H ++#define FUSION_LINUX_COMPAT_H ++ ++#include ++ ++#ifndef ULLONG_MAX ++#define ULLONG_MAX (~0ULL) ++#endif ++ ++#ifndef USHORT_MAX ++#define USHORT_MAX ((u16)(~0U)) ++#endif ++ ++/* ++ * TODO Need to change 'shost_private' back to 'shost_priv' when suppying patchs ++ * upstream. Since Red Hat decided to backport this to rhel5.2 (2.6.18-92.el5) ++ * from the 2.6.23 kernel, it will make it difficult for us to add the proper ++ * glue in our driver. ++ */ ++static inline void *shost_private(struct Scsi_Host *shost) ++{ ++ return (void *)shost->hostdata; ++} ++ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27)) ++static inline sector_t scsi_get_lba(struct scsi_cmnd *scmd) ++{ ++ return scmd->request->sector; ++} ++#endif ++ ++/** ++ * mpt_scsi_build_sense_buffer - build sense data in a buffer ++ * @desc: Sense format (non zero == descriptor format, ++ * 0 == fixed format) ++ * @buf: Where to build sense data ++ * @key: Sense key ++ * @asc: Additional sense code ++ * @ascq: Additional sense code qualifier ++ * ++ * Note: scsi_build_sense_buffer was added in the 2.6.26 kernel ++ * It was backported in RHEL5.3 2.6.18-128.el5 ++ **/ ++static inline void mpt_scsi_build_sense_buffer(int desc, u8 *buf, u8 key, ++ u8 asc, u8 ascq) ++{ ++ if (desc) { ++ buf[0] = 0x72; /* descriptor, current */ ++ buf[1] = key; ++ buf[2] = asc; ++ buf[3] = ascq; ++ buf[7] = 0; ++ } else { ++ buf[0] = 0x70; /* fixed, current */ ++ buf[2] = key; ++ buf[7] = 0xa; ++ buf[12] = asc; ++ buf[13] = ascq; ++ } ++} ++ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)) ++/** ++ * mpt_scsilun_to_int: convert a scsi_lun to an int ++ * @scsilun: struct scsi_lun to be converted. ++ * ++ * Description: ++ * Convert @scsilun from a struct scsi_lun to a four byte host byte-ordered ++ * integer, and return the result. The caller must check for ++ * truncation before using this function. ++ * ++ * Notes: ++ * The struct scsi_lun is assumed to be four levels, with each level ++ * effectively containing a SCSI byte-ordered (big endian) short; the ++ * addressing bits of each level are ignored (the highest two bits). ++ * For a description of the LUN format, post SCSI-3 see the SCSI ++ * Architecture Model, for SCSI-3 see the SCSI Controller Commands. ++ * ++ * Given a struct scsi_lun of: 0a 04 0b 03 00 00 00 00, this function ++ * returns the integer: 0x0b030a04 ++ **/ ++static inline int mpt_scsilun_to_int(struct scsi_lun *scsilun) ++{ ++ int i; ++ unsigned int lun; ++ ++ lun = 0; ++ for (i = 0; i < sizeof(lun); i += 2) ++ lun = lun | (((scsilun->scsi_lun[i] << 8) | ++ scsilun->scsi_lun[i + 1]) << (i * 8)); ++ return lun; ++} ++#else ++static inline int mpt_scsilun_to_int(struct scsi_lun *scsilun) ++{ ++ return scsilun_to_int(scsilun); ++} ++#endif ++#endif /* FUSION_LINUX_COMPAT_H */ +diff -r e02b4006a7c8 drivers/scsi/mpt2sas/mpt2sas_config.c +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/scsi/mpt2sas/mpt2sas_config.c Wed Jul 01 09:49:59 2009 +0100 +@@ -0,0 +1,1382 @@ ++/* ++ * This module provides common API for accessing firmware configuration pages ++ * ++ * This code is based on drivers/scsi/mpt2sas/mpt2_base.c ++ * Copyright (C) 2007-2008 LSI Corporation ++ * (mailto:DL-MPTFusionLinux@lsi.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. ++ * ++ * NO WARRANTY ++ * THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR ++ * CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT ++ * LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, ++ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is ++ * solely responsible for determining the appropriateness of using and ++ * distributing the Program and assumes all risks associated with its ++ * exercise of rights under this Agreement, including but not limited to ++ * the risks and costs of program errors, damage to or loss of data, ++ * programs or equipment, and unavailability or interruption of operations. ++ ++ * DISCLAIMER OF LIABILITY ++ * NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY ++ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ++ * DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), 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 OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED ++ * HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES ++ ++ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, ++ * USA. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "mpt2sas_base.h" ++ ++/* local definitions */ ++ ++/* Timeout for config page request (in seconds) */ ++#define MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT 15 ++ ++/* Common sgl flags for READING a config page. */ ++#define MPT2_CONFIG_COMMON_SGLFLAGS ((MPI2_SGE_FLAGS_SIMPLE_ELEMENT | \ ++ MPI2_SGE_FLAGS_LAST_ELEMENT | MPI2_SGE_FLAGS_END_OF_BUFFER \ ++ | MPI2_SGE_FLAGS_END_OF_LIST) << MPI2_SGE_FLAGS_SHIFT) ++ ++/* Common sgl flags for WRITING a config page. */ ++#define MPT2_CONFIG_COMMON_WRITE_SGLFLAGS ((MPI2_SGE_FLAGS_SIMPLE_ELEMENT | \ ++ MPI2_SGE_FLAGS_LAST_ELEMENT | MPI2_SGE_FLAGS_END_OF_BUFFER \ ++ | MPI2_SGE_FLAGS_END_OF_LIST | MPI2_SGE_FLAGS_HOST_TO_IOC) \ ++ << MPI2_SGE_FLAGS_SHIFT) ++ ++/** ++ * struct config_request - obtain dma memory via routine ++ * @sz: size ++ * @page: virt pointer ++ * @page_dma: phys pointer ++ * ++ */ ++struct config_request{ ++ u16 sz; ++ void *page; ++ dma_addr_t page_dma; ++}; ++ ++#ifdef CONFIG_SCSI_MPT2SAS_LOGGING ++/** ++ * _config_display_some_debug - debug routine ++ * @ioc: per adapter object ++ * @smid: system request message index ++ * @calling_function_name: string pass from calling function ++ * @mpi_reply: reply message frame ++ * Context: none. ++ * ++ * Function for displaying debug info helpfull when debugging issues ++ * in this module. ++ */ ++static void ++_config_display_some_debug(struct MPT2SAS_ADAPTER *ioc, u16 smid, ++ char *calling_function_name, MPI2DefaultReply_t *mpi_reply) ++{ ++ Mpi2ConfigRequest_t *mpi_request; ++ char *desc = NULL; ++ ++ if (!(ioc->logging_level & MPT_DEBUG_CONFIG)) ++ return; ++ ++ mpi_request = mpt2sas_base_get_msg_frame(ioc, smid); ++ switch (mpi_request->Header.PageType & MPI2_CONFIG_PAGETYPE_MASK) { ++ case MPI2_CONFIG_PAGETYPE_IO_UNIT: ++ desc = "io_unit"; ++ break; ++ case MPI2_CONFIG_PAGETYPE_IOC: ++ desc = "ioc"; ++ break; ++ case MPI2_CONFIG_PAGETYPE_BIOS: ++ desc = "bios"; ++ break; ++ case MPI2_CONFIG_PAGETYPE_RAID_VOLUME: ++ desc = "raid_volume"; ++ break; ++ case MPI2_CONFIG_PAGETYPE_MANUFACTURING: ++ desc = "manufaucturing"; ++ break; ++ case MPI2_CONFIG_PAGETYPE_RAID_PHYSDISK: ++ desc = "physdisk"; ++ break; ++ case MPI2_CONFIG_PAGETYPE_EXTENDED: ++ switch (mpi_request->ExtPageType) { ++ case MPI2_CONFIG_EXTPAGETYPE_SAS_IO_UNIT: ++ desc = "sas_io_unit"; ++ break; ++ case MPI2_CONFIG_EXTPAGETYPE_SAS_EXPANDER: ++ desc = "sas_expander"; ++ break; ++ case MPI2_CONFIG_EXTPAGETYPE_SAS_DEVICE: ++ desc = "sas_device"; ++ break; ++ case MPI2_CONFIG_EXTPAGETYPE_SAS_PHY: ++ desc = "sas_phy"; ++ break; ++ case MPI2_CONFIG_EXTPAGETYPE_LOG: ++ desc = "log"; ++ break; ++ case MPI2_CONFIG_EXTPAGETYPE_ENCLOSURE: ++ desc = "enclosure"; ++ break; ++ case MPI2_CONFIG_EXTPAGETYPE_RAID_CONFIG: ++ desc = "raid_config"; ++ break; ++ case MPI2_CONFIG_EXTPAGETYPE_DRIVER_MAPPING: ++ desc = "driver_mappping"; ++ break; ++ } ++ break; ++ } ++ ++ if (!desc) ++ return; ++ ++ printk(MPT2SAS_DEBUG_FMT "%s: %s(%d), action(%d), form(0x%08x), " ++ "smid(%d)\n", ioc->name, calling_function_name, desc, ++ mpi_request->Header.PageNumber, mpi_request->Action, ++ le32_to_cpu(mpi_request->PageAddress), smid); ++ ++ if (!mpi_reply) ++ return; ++ ++ if (mpi_reply->IOCStatus || mpi_reply->IOCLogInfo) ++ printk(MPT2SAS_DEBUG_FMT ++ "\tiocstatus(0x%04x), loginfo(0x%08x)\n", ++ ioc->name, le16_to_cpu(mpi_reply->IOCStatus), ++ le32_to_cpu(mpi_reply->IOCLogInfo)); ++} ++#endif ++ ++/** ++ * _config_alloc_config_dma_memory - obtain physical memory ++ * @ioc: per adapter object ++ * @mem: struct config_request ++ * ++ * A wrapper for obtaining dma-able memory for config page request. ++ * ++ * Returns 0 for success, non-zero for failure. ++ */ ++static int ++_config_alloc_config_dma_memory(struct MPT2SAS_ADAPTER *ioc, ++ struct config_request *mem) ++{ ++ int r = 0; ++ ++ if (mem->sz > ioc->config_page_sz) { ++ mem->page = dma_alloc_coherent(&ioc->pdev->dev, mem->sz, ++ &mem->page_dma, GFP_KERNEL); ++ if (!mem->page) { ++ printk(MPT2SAS_ERR_FMT "%s: dma_alloc_coherent" ++ " failed asking for (%d) bytes!!\n", ++ ioc->name, __func__, mem->sz); ++ r = -ENOMEM; ++ } ++ } else { /* use tmp buffer if less than 512 bytes */ ++ mem->page = ioc->config_page; ++ mem->page_dma = ioc->config_page_dma; ++ } ++ return r; ++} ++ ++/** ++ * _config_free_config_dma_memory - wrapper to free the memory ++ * @ioc: per adapter object ++ * @mem: struct config_request ++ * ++ * A wrapper to free dma-able memory when using _config_alloc_config_dma_memory. ++ * ++ * Returns 0 for success, non-zero for failure. ++ */ ++static void ++_config_free_config_dma_memory(struct MPT2SAS_ADAPTER *ioc, ++ struct config_request *mem) ++{ ++ if (mem->sz > ioc->config_page_sz) ++ dma_free_coherent(&ioc->pdev->dev, mem->sz, mem->page, ++ mem->page_dma); ++} ++ ++/** ++ * mpt2sas_config_done - config page completion routine ++ * @ioc: per adapter object ++ * @smid: system request message index ++ * @VF_ID: virtual function id ++ * @reply: reply message frame(lower 32bit addr) ++ * Context: none. ++ * ++ * The callback handler when using _config_request. ++ * ++ * Return nothing. ++ */ ++void ++mpt2sas_config_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 VF_ID, u32 reply) ++{ ++ MPI2DefaultReply_t *mpi_reply; ++ ++ if (ioc->config_cmds.status == MPT2_CMD_NOT_USED) ++ return; ++ if (ioc->config_cmds.smid != smid) ++ return; ++ ioc->config_cmds.status |= MPT2_CMD_COMPLETE; ++ mpi_reply = mpt2sas_base_get_reply_virt_addr(ioc, reply); ++ if (mpi_reply) { ++ ioc->config_cmds.status |= MPT2_CMD_REPLY_VALID; ++ memcpy(ioc->config_cmds.reply, mpi_reply, ++ mpi_reply->MsgLength*4); ++ } ++ ioc->config_cmds.status &= ~MPT2_CMD_PENDING; ++#ifdef CONFIG_SCSI_MPT2SAS_LOGGING ++ _config_display_some_debug(ioc, smid, "config_done", mpi_reply); ++#endif ++ ioc->config_cmds.smid = USHORT_MAX; ++ complete(&ioc->config_cmds.done); ++} ++ ++/** ++ * _config_request - main routine for sending config page requests ++ * @ioc: per adapter object ++ * @mpi_request: request message frame ++ * @mpi_reply: reply mf payload returned from firmware ++ * @timeout: timeout in seconds ++ * @config_page: contents of the config page ++ * @config_page_sz: size of config page ++ * Context: sleep ++ * ++ * A generic API for config page requests to firmware. ++ * ++ * The ioc->config_cmds.status flag should be MPT2_CMD_NOT_USED before calling ++ * this API. ++ * ++ * The callback index is set inside `ioc->config_cb_idx. ++ * ++ * Returns 0 for success, non-zero for failure. ++ */ ++static int ++_config_request(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigRequest_t ++ *mpi_request, Mpi2ConfigReply_t *mpi_reply, int timeout, ++ void *config_page, u16 config_page_sz) ++{ ++ u16 smid; ++ u32 ioc_state; ++ unsigned long timeleft; ++ Mpi2ConfigRequest_t *config_request; ++ int r; ++ u8 retry_count, issue_host_reset = 0; ++ u16 wait_state_count; ++ struct config_request mem; ++ ++ mutex_lock(&ioc->config_cmds.mutex); ++ if (ioc->config_cmds.status != MPT2_CMD_NOT_USED) { ++ printk(MPT2SAS_ERR_FMT "%s: config_cmd in use\n", ++ ioc->name, __func__); ++ mutex_unlock(&ioc->config_cmds.mutex); ++ return -EAGAIN; ++ } ++ ++ retry_count = 0; ++ memset(&mem, 0, sizeof(struct config_request)); ++ ++ if (config_page) { ++ mpi_request->Header.PageVersion = mpi_reply->Header.PageVersion; ++ mpi_request->Header.PageNumber = mpi_reply->Header.PageNumber; ++ mpi_request->Header.PageType = mpi_reply->Header.PageType; ++ mpi_request->Header.PageLength = mpi_reply->Header.PageLength; ++ mpi_request->ExtPageLength = mpi_reply->ExtPageLength; ++ mpi_request->ExtPageType = mpi_reply->ExtPageType; ++ if (mpi_request->Header.PageLength) ++ mem.sz = mpi_request->Header.PageLength * 4; ++ else ++ mem.sz = le16_to_cpu(mpi_reply->ExtPageLength) * 4; ++ r = _config_alloc_config_dma_memory(ioc, &mem); ++ if (r != 0) ++ goto out; ++ if (mpi_request->Action == ++ MPI2_CONFIG_ACTION_PAGE_WRITE_CURRENT) { ++ ioc->base_add_sg_single(&mpi_request->PageBufferSGE, ++ MPT2_CONFIG_COMMON_WRITE_SGLFLAGS | mem.sz, ++ mem.page_dma); ++ memcpy(mem.page, config_page, min_t(u16, mem.sz, ++ config_page_sz)); ++ } else { ++ memset(config_page, 0, config_page_sz); ++ ioc->base_add_sg_single(&mpi_request->PageBufferSGE, ++ MPT2_CONFIG_COMMON_SGLFLAGS | mem.sz, mem.page_dma); ++ } ++ } ++ ++ retry_config: ++ if (retry_count) { ++ if (retry_count > 2) { /* attempt only 2 retries */ ++ r = -EFAULT; ++ goto free_mem; ++ } ++ printk(MPT2SAS_INFO_FMT "%s: attempting retry (%d)\n", ++ ioc->name, __func__, retry_count); ++ } ++ wait_state_count = 0; ++ ioc_state = mpt2sas_base_get_iocstate(ioc, 1); ++ while (ioc_state != MPI2_IOC_STATE_OPERATIONAL) { ++ if (wait_state_count++ == MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT) { ++ printk(MPT2SAS_ERR_FMT ++ "%s: failed due to ioc not operational\n", ++ ioc->name, __func__); ++ ioc->config_cmds.status = MPT2_CMD_NOT_USED; ++ r = -EFAULT; ++ goto free_mem; ++ } ++ ssleep(1); ++ ioc_state = mpt2sas_base_get_iocstate(ioc, 1); ++ printk(MPT2SAS_INFO_FMT "%s: waiting for " ++ "operational state(count=%d)\n", ioc->name, ++ __func__, wait_state_count); ++ } ++ if (wait_state_count) ++ printk(MPT2SAS_INFO_FMT "%s: ioc is operational\n", ++ ioc->name, __func__); ++ ++ smid = mpt2sas_base_get_smid(ioc, ioc->config_cb_idx); ++ if (!smid) { ++ printk(MPT2SAS_ERR_FMT "%s: failed obtaining a smid\n", ++ ioc->name, __func__); ++ ioc->config_cmds.status = MPT2_CMD_NOT_USED; ++ r = -EAGAIN; ++ goto free_mem; ++ } ++ ++ r = 0; ++ memset(mpi_reply, 0, sizeof(Mpi2ConfigReply_t)); ++ ioc->config_cmds.status = MPT2_CMD_PENDING; ++ config_request = mpt2sas_base_get_msg_frame(ioc, smid); ++ ioc->config_cmds.smid = smid; ++ memcpy(config_request, mpi_request, sizeof(Mpi2ConfigRequest_t)); ++#ifdef CONFIG_SCSI_MPT2SAS_LOGGING ++ _config_display_some_debug(ioc, smid, "config_request", NULL); ++#endif ++ init_completion(&ioc->config_cmds.done); ++ mpt2sas_base_put_smid_default(ioc, smid, config_request->VF_ID); ++ timeleft = wait_for_completion_timeout(&ioc->config_cmds.done, ++ timeout*HZ); ++ if (!(ioc->config_cmds.status & MPT2_CMD_COMPLETE)) { ++ printk(MPT2SAS_ERR_FMT "%s: timeout\n", ++ ioc->name, __func__); ++ _debug_dump_mf(mpi_request, ++ sizeof(Mpi2ConfigRequest_t)/4); ++ retry_count++; ++ if (ioc->config_cmds.smid == smid) ++ mpt2sas_base_free_smid(ioc, smid); ++ if ((ioc->shost_recovery) || (ioc->config_cmds.status & ++ MPT2_CMD_RESET)) ++ goto retry_config; ++ issue_host_reset = 1; ++ r = -EFAULT; ++ goto free_mem; ++ } ++ ++ if (ioc->config_cmds.status & MPT2_CMD_REPLY_VALID) ++ memcpy(mpi_reply, ioc->config_cmds.reply, ++ sizeof(Mpi2ConfigReply_t)); ++ if (retry_count) ++ printk(MPT2SAS_INFO_FMT "%s: retry (%d) completed!!\n", ++ ioc->name, __func__, retry_count); ++ if (config_page && mpi_request->Action == ++ MPI2_CONFIG_ACTION_PAGE_READ_CURRENT) ++ memcpy(config_page, mem.page, min_t(u16, mem.sz, ++ config_page_sz)); ++ free_mem: ++ if (config_page) ++ _config_free_config_dma_memory(ioc, &mem); ++ out: ++ ioc->config_cmds.status = MPT2_CMD_NOT_USED; ++ mutex_unlock(&ioc->config_cmds.mutex); ++ ++ if (issue_host_reset) ++ mpt2sas_base_hard_reset_handler(ioc, CAN_SLEEP, ++ FORCE_BIG_HAMMER); ++ return r; ++} ++ ++/** ++ * mpt2sas_config_get_manufacturing_pg0 - obtain manufacturing page 0 ++ * @ioc: per adapter object ++ * @mpi_reply: reply mf payload returned from firmware ++ * @config_page: contents of the config page ++ * Context: sleep. ++ * ++ * Returns 0 for success, non-zero for failure. ++ */ ++int ++mpt2sas_config_get_manufacturing_pg0(struct MPT2SAS_ADAPTER *ioc, ++ Mpi2ConfigReply_t *mpi_reply, Mpi2ManufacturingPage0_t *config_page) ++{ ++ Mpi2ConfigRequest_t mpi_request; ++ int r; ++ ++ memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); ++ mpi_request.Function = MPI2_FUNCTION_CONFIG; ++ mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER; ++ mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_MANUFACTURING; ++ mpi_request.Header.PageNumber = 0; ++ mpi_request.Header.PageVersion = MPI2_MANUFACTURING0_PAGEVERSION; ++ mpt2sas_base_build_zero_len_sge(ioc, &mpi_request.PageBufferSGE); ++ r = _config_request(ioc, &mpi_request, mpi_reply, ++ MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0); ++ if (r) ++ goto out; ++ ++ mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT; ++ r = _config_request(ioc, &mpi_request, mpi_reply, ++ MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page, ++ sizeof(*config_page)); ++ out: ++ return r; ++} ++ ++/** ++ * mpt2sas_config_get_manufacturing_pg10 - obtain manufacturing page 10 ++ * @ioc: per adapter object ++ * @mpi_reply: reply mf payload returned from firmware ++ * @config_page: contents of the config page ++ * Context: sleep. ++ * ++ * Returns 0 for success, non-zero for failure. ++ */ ++int ++mpt2sas_config_get_manufacturing_pg10(struct MPT2SAS_ADAPTER *ioc, ++ Mpi2ConfigReply_t *mpi_reply, Mpi2ManufacturingPage10_t *config_page) ++{ ++ Mpi2ConfigRequest_t mpi_request; ++ int r; ++ ++ memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); ++ mpi_request.Function = MPI2_FUNCTION_CONFIG; ++ mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER; ++ mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_MANUFACTURING; ++ mpi_request.Header.PageNumber = 10; ++ mpi_request.Header.PageVersion = MPI2_MANUFACTURING0_PAGEVERSION; ++ mpt2sas_base_build_zero_len_sge(ioc, &mpi_request.PageBufferSGE); ++ r = _config_request(ioc, &mpi_request, mpi_reply, ++ MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0); ++ if (r) ++ goto out; ++ ++ mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT; ++ r = _config_request(ioc, &mpi_request, mpi_reply, ++ MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page, ++ sizeof(*config_page)); ++ out: ++ return r; ++} ++ ++/** ++ * mpt2sas_config_get_bios_pg2 - obtain bios page 2 ++ * @ioc: per adapter object ++ * @mpi_reply: reply mf payload returned from firmware ++ * @config_page: contents of the config page ++ * Context: sleep. ++ * ++ * Returns 0 for success, non-zero for failure. ++ */ ++int ++mpt2sas_config_get_bios_pg2(struct MPT2SAS_ADAPTER *ioc, ++ Mpi2ConfigReply_t *mpi_reply, Mpi2BiosPage2_t *config_page) ++{ ++ Mpi2ConfigRequest_t mpi_request; ++ int r; ++ ++ memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); ++ mpi_request.Function = MPI2_FUNCTION_CONFIG; ++ mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER; ++ mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_BIOS; ++ mpi_request.Header.PageNumber = 2; ++ mpi_request.Header.PageVersion = MPI2_BIOSPAGE2_PAGEVERSION; ++ mpt2sas_base_build_zero_len_sge(ioc, &mpi_request.PageBufferSGE); ++ r = _config_request(ioc, &mpi_request, mpi_reply, ++ MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0); ++ if (r) ++ goto out; ++ ++ mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT; ++ r = _config_request(ioc, &mpi_request, mpi_reply, ++ MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page, ++ sizeof(*config_page)); ++ out: ++ return r; ++} ++ ++/** ++ * mpt2sas_config_get_bios_pg3 - obtain bios page 3 ++ * @ioc: per adapter object ++ * @mpi_reply: reply mf payload returned from firmware ++ * @config_page: contents of the config page ++ * Context: sleep. ++ * ++ * Returns 0 for success, non-zero for failure. ++ */ ++int ++mpt2sas_config_get_bios_pg3(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t ++ *mpi_reply, Mpi2BiosPage3_t *config_page) ++{ ++ Mpi2ConfigRequest_t mpi_request; ++ int r; ++ ++ memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); ++ mpi_request.Function = MPI2_FUNCTION_CONFIG; ++ mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER; ++ mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_BIOS; ++ mpi_request.Header.PageNumber = 3; ++ mpi_request.Header.PageVersion = MPI2_BIOSPAGE3_PAGEVERSION; ++ mpt2sas_base_build_zero_len_sge(ioc, &mpi_request.PageBufferSGE); ++ r = _config_request(ioc, &mpi_request, mpi_reply, ++ MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0); ++ if (r) ++ goto out; ++ ++ mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT; ++ r = _config_request(ioc, &mpi_request, mpi_reply, ++ MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page, ++ sizeof(*config_page)); ++ out: ++ return r; ++} ++ ++/** ++ * mpt2sas_config_get_iounit_pg0 - obtain iounit page 0 ++ * @ioc: per adapter object ++ * @mpi_reply: reply mf payload returned from firmware ++ * @config_page: contents of the config page ++ * Context: sleep. ++ * ++ * Returns 0 for success, non-zero for failure. ++ */ ++int ++mpt2sas_config_get_iounit_pg0(struct MPT2SAS_ADAPTER *ioc, ++ Mpi2ConfigReply_t *mpi_reply, Mpi2IOUnitPage0_t *config_page) ++{ ++ Mpi2ConfigRequest_t mpi_request; ++ int r; ++ ++ memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); ++ mpi_request.Function = MPI2_FUNCTION_CONFIG; ++ mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER; ++ mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_IO_UNIT; ++ mpi_request.Header.PageNumber = 0; ++ mpi_request.Header.PageVersion = MPI2_IOUNITPAGE0_PAGEVERSION; ++ mpt2sas_base_build_zero_len_sge(ioc, &mpi_request.PageBufferSGE); ++ r = _config_request(ioc, &mpi_request, mpi_reply, ++ MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0); ++ if (r) ++ goto out; ++ ++ mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT; ++ r = _config_request(ioc, &mpi_request, mpi_reply, ++ MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page, ++ sizeof(*config_page)); ++ out: ++ return r; ++} ++ ++/** ++ * mpt2sas_config_get_iounit_pg1 - obtain iounit page 1 ++ * @ioc: per adapter object ++ * @mpi_reply: reply mf payload returned from firmware ++ * @config_page: contents of the config page ++ * Context: sleep. ++ * ++ * Returns 0 for success, non-zero for failure. ++ */ ++int ++mpt2sas_config_get_iounit_pg1(struct MPT2SAS_ADAPTER *ioc, ++ Mpi2ConfigReply_t *mpi_reply, Mpi2IOUnitPage1_t *config_page) ++{ ++ Mpi2ConfigRequest_t mpi_request; ++ int r; ++ ++ memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); ++ mpi_request.Function = MPI2_FUNCTION_CONFIG; ++ mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER; ++ mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_IO_UNIT; ++ mpi_request.Header.PageNumber = 1; ++ mpi_request.Header.PageVersion = MPI2_IOUNITPAGE1_PAGEVERSION; ++ mpt2sas_base_build_zero_len_sge(ioc, &mpi_request.PageBufferSGE); ++ r = _config_request(ioc, &mpi_request, mpi_reply, ++ MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0); ++ if (r) ++ goto out; ++ ++ mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT; ++ r = _config_request(ioc, &mpi_request, mpi_reply, ++ MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page, ++ sizeof(*config_page)); ++ out: ++ return r; ++} ++ ++/** ++ * mpt2sas_config_set_iounit_pg1 - set iounit page 1 ++ * @ioc: per adapter object ++ * @mpi_reply: reply mf payload returned from firmware ++ * @config_page: contents of the config page ++ * Context: sleep. ++ * ++ * Returns 0 for success, non-zero for failure. ++ */ ++int ++mpt2sas_config_set_iounit_pg1(struct MPT2SAS_ADAPTER *ioc, ++ Mpi2ConfigReply_t *mpi_reply, Mpi2IOUnitPage1_t *config_page) ++{ ++ Mpi2ConfigRequest_t mpi_request; ++ int r; ++ ++ memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); ++ mpi_request.Function = MPI2_FUNCTION_CONFIG; ++ mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER; ++ mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_IO_UNIT; ++ mpi_request.Header.PageNumber = 1; ++ mpi_request.Header.PageVersion = MPI2_IOUNITPAGE1_PAGEVERSION; ++ mpt2sas_base_build_zero_len_sge(ioc, &mpi_request.PageBufferSGE); ++ r = _config_request(ioc, &mpi_request, mpi_reply, ++ MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0); ++ if (r) ++ goto out; ++ ++ mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_WRITE_CURRENT; ++ r = _config_request(ioc, &mpi_request, mpi_reply, ++ MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page, ++ sizeof(*config_page)); ++ out: ++ return r; ++} ++ ++/** ++ * mpt2sas_config_get_ioc_pg8 - obtain ioc page 8 ++ * @ioc: per adapter object ++ * @mpi_reply: reply mf payload returned from firmware ++ * @config_page: contents of the config page ++ * Context: sleep. ++ * ++ * Returns 0 for success, non-zero for failure. ++ */ ++int ++mpt2sas_config_get_ioc_pg8(struct MPT2SAS_ADAPTER *ioc, ++ Mpi2ConfigReply_t *mpi_reply, Mpi2IOCPage8_t *config_page) ++{ ++ Mpi2ConfigRequest_t mpi_request; ++ int r; ++ ++ memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); ++ mpi_request.Function = MPI2_FUNCTION_CONFIG; ++ mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER; ++ mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_IOC; ++ mpi_request.Header.PageNumber = 8; ++ mpi_request.Header.PageVersion = MPI2_IOCPAGE8_PAGEVERSION; ++ mpt2sas_base_build_zero_len_sge(ioc, &mpi_request.PageBufferSGE); ++ r = _config_request(ioc, &mpi_request, mpi_reply, ++ MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0); ++ if (r) ++ goto out; ++ ++ mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT; ++ r = _config_request(ioc, &mpi_request, mpi_reply, ++ MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page, ++ sizeof(*config_page)); ++ out: ++ return r; ++} ++ ++/** ++ * mpt2sas_config_get_sas_device_pg0 - obtain sas device page 0 ++ * @ioc: per adapter object ++ * @mpi_reply: reply mf payload returned from firmware ++ * @config_page: contents of the config page ++ * @form: GET_NEXT_HANDLE or HANDLE ++ * @handle: device handle ++ * Context: sleep. ++ * ++ * Returns 0 for success, non-zero for failure. ++ */ ++int ++mpt2sas_config_get_sas_device_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t ++ *mpi_reply, Mpi2SasDevicePage0_t *config_page, u32 form, u32 handle) ++{ ++ Mpi2ConfigRequest_t mpi_request; ++ int r; ++ ++ memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); ++ mpi_request.Function = MPI2_FUNCTION_CONFIG; ++ mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER; ++ mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_EXTENDED; ++ mpi_request.ExtPageType = MPI2_CONFIG_EXTPAGETYPE_SAS_DEVICE; ++ mpi_request.Header.PageVersion = MPI2_SASDEVICE0_PAGEVERSION; ++ mpi_request.Header.PageNumber = 0; ++ mpt2sas_base_build_zero_len_sge(ioc, &mpi_request.PageBufferSGE); ++ r = _config_request(ioc, &mpi_request, mpi_reply, ++ MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0); ++ if (r) ++ goto out; ++ ++ mpi_request.PageAddress = cpu_to_le32(form | handle); ++ mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT; ++ r = _config_request(ioc, &mpi_request, mpi_reply, ++ MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page, ++ sizeof(*config_page)); ++ out: ++ return r; ++} ++ ++/** ++ * mpt2sas_config_get_sas_device_pg1 - obtain sas device page 1 ++ * @ioc: per adapter object ++ * @mpi_reply: reply mf payload returned from firmware ++ * @config_page: contents of the config page ++ * @form: GET_NEXT_HANDLE or HANDLE ++ * @handle: device handle ++ * Context: sleep. ++ * ++ * Returns 0 for success, non-zero for failure. ++ */ ++int ++mpt2sas_config_get_sas_device_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t ++ *mpi_reply, Mpi2SasDevicePage1_t *config_page, u32 form, u32 handle) ++{ ++ Mpi2ConfigRequest_t mpi_request; ++ int r; ++ ++ memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); ++ mpi_request.Function = MPI2_FUNCTION_CONFIG; ++ mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER; ++ mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_EXTENDED; ++ mpi_request.ExtPageType = MPI2_CONFIG_EXTPAGETYPE_SAS_DEVICE; ++ mpi_request.Header.PageVersion = MPI2_SASDEVICE1_PAGEVERSION; ++ mpi_request.Header.PageNumber = 1; ++ mpt2sas_base_build_zero_len_sge(ioc, &mpi_request.PageBufferSGE); ++ r = _config_request(ioc, &mpi_request, mpi_reply, ++ MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0); ++ if (r) ++ goto out; ++ ++ mpi_request.PageAddress = cpu_to_le32(form | handle); ++ mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT; ++ r = _config_request(ioc, &mpi_request, mpi_reply, ++ MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page, ++ sizeof(*config_page)); ++ out: ++ return r; ++} ++ ++/** ++ * mpt2sas_config_get_number_hba_phys - obtain number of phys on the host ++ * @ioc: per adapter object ++ * @num_phys: pointer returned with the number of phys ++ * Context: sleep. ++ * ++ * Returns 0 for success, non-zero for failure. ++ */ ++int ++mpt2sas_config_get_number_hba_phys(struct MPT2SAS_ADAPTER *ioc, u8 *num_phys) ++{ ++ Mpi2ConfigRequest_t mpi_request; ++ int r; ++ u16 ioc_status; ++ Mpi2ConfigReply_t mpi_reply; ++ Mpi2SasIOUnitPage0_t config_page; ++ ++ *num_phys = 0; ++ memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); ++ mpi_request.Function = MPI2_FUNCTION_CONFIG; ++ mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER; ++ mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_EXTENDED; ++ mpi_request.ExtPageType = MPI2_CONFIG_EXTPAGETYPE_SAS_IO_UNIT; ++ mpi_request.Header.PageNumber = 0; ++ mpi_request.Header.PageVersion = MPI2_SASIOUNITPAGE0_PAGEVERSION; ++ mpt2sas_base_build_zero_len_sge(ioc, &mpi_request.PageBufferSGE); ++ r = _config_request(ioc, &mpi_request, &mpi_reply, ++ MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0); ++ if (r) ++ goto out; ++ ++ mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT; ++ r = _config_request(ioc, &mpi_request, &mpi_reply, ++ MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, &config_page, ++ sizeof(Mpi2SasIOUnitPage0_t)); ++ if (!r) { ++ ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & ++ MPI2_IOCSTATUS_MASK; ++ if (ioc_status == MPI2_IOCSTATUS_SUCCESS) ++ *num_phys = config_page.NumPhys; ++ } ++ out: ++ return r; ++} ++ ++/** ++ * mpt2sas_config_get_sas_iounit_pg0 - obtain sas iounit page 0 ++ * @ioc: per adapter object ++ * @mpi_reply: reply mf payload returned from firmware ++ * @config_page: contents of the config page ++ * @sz: size of buffer passed in config_page ++ * Context: sleep. ++ * ++ * Calling function should call config_get_number_hba_phys prior to ++ * this function, so enough memory is allocated for config_page. ++ * ++ * Returns 0 for success, non-zero for failure. ++ */ ++int ++mpt2sas_config_get_sas_iounit_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t ++ *mpi_reply, Mpi2SasIOUnitPage0_t *config_page, u16 sz) ++{ ++ Mpi2ConfigRequest_t mpi_request; ++ int r; ++ ++ memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); ++ mpi_request.Function = MPI2_FUNCTION_CONFIG; ++ mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER; ++ mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_EXTENDED; ++ mpi_request.ExtPageType = MPI2_CONFIG_EXTPAGETYPE_SAS_IO_UNIT; ++ mpi_request.Header.PageNumber = 0; ++ mpi_request.Header.PageVersion = MPI2_SASIOUNITPAGE0_PAGEVERSION; ++ mpt2sas_base_build_zero_len_sge(ioc, &mpi_request.PageBufferSGE); ++ r = _config_request(ioc, &mpi_request, mpi_reply, ++ MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0); ++ if (r) ++ goto out; ++ ++ mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT; ++ r = _config_request(ioc, &mpi_request, mpi_reply, ++ MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page, sz); ++ out: ++ return r; ++} ++ ++/** ++ * mpt2sas_config_get_sas_iounit_pg1 - obtain sas iounit page 0 ++ * @ioc: per adapter object ++ * @mpi_reply: reply mf payload returned from firmware ++ * @config_page: contents of the config page ++ * @sz: size of buffer passed in config_page ++ * Context: sleep. ++ * ++ * Calling function should call config_get_number_hba_phys prior to ++ * this function, so enough memory is allocated for config_page. ++ * ++ * Returns 0 for success, non-zero for failure. ++ */ ++int ++mpt2sas_config_get_sas_iounit_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t ++ *mpi_reply, Mpi2SasIOUnitPage1_t *config_page, u16 sz) ++{ ++ Mpi2ConfigRequest_t mpi_request; ++ int r; ++ ++ memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); ++ mpi_request.Function = MPI2_FUNCTION_CONFIG; ++ mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER; ++ mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_EXTENDED; ++ mpi_request.ExtPageType = MPI2_CONFIG_EXTPAGETYPE_SAS_IO_UNIT; ++ mpi_request.Header.PageNumber = 1; ++ mpi_request.Header.PageVersion = MPI2_SASIOUNITPAGE0_PAGEVERSION; ++ mpt2sas_base_build_zero_len_sge(ioc, &mpi_request.PageBufferSGE); ++ r = _config_request(ioc, &mpi_request, mpi_reply, ++ MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0); ++ if (r) ++ goto out; ++ ++ mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT; ++ r = _config_request(ioc, &mpi_request, mpi_reply, ++ MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page, sz); ++ out: ++ return r; ++} ++ ++/** ++ * mpt2sas_config_get_expander_pg0 - obtain expander page 0 ++ * @ioc: per adapter object ++ * @mpi_reply: reply mf payload returned from firmware ++ * @config_page: contents of the config page ++ * @form: GET_NEXT_HANDLE or HANDLE ++ * @handle: expander handle ++ * Context: sleep. ++ * ++ * Returns 0 for success, non-zero for failure. ++ */ ++int ++mpt2sas_config_get_expander_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t ++ *mpi_reply, Mpi2ExpanderPage0_t *config_page, u32 form, u32 handle) ++{ ++ Mpi2ConfigRequest_t mpi_request; ++ int r; ++ ++ memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); ++ mpi_request.Function = MPI2_FUNCTION_CONFIG; ++ mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER; ++ mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_EXTENDED; ++ mpi_request.ExtPageType = MPI2_CONFIG_EXTPAGETYPE_SAS_EXPANDER; ++ mpi_request.Header.PageNumber = 0; ++ mpi_request.Header.PageVersion = MPI2_SASEXPANDER0_PAGEVERSION; ++ mpt2sas_base_build_zero_len_sge(ioc, &mpi_request.PageBufferSGE); ++ r = _config_request(ioc, &mpi_request, mpi_reply, ++ MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0); ++ if (r) ++ goto out; ++ ++ mpi_request.PageAddress = cpu_to_le32(form | handle); ++ mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT; ++ r = _config_request(ioc, &mpi_request, mpi_reply, ++ MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page, ++ sizeof(*config_page)); ++ out: ++ return r; ++} ++ ++/** ++ * mpt2sas_config_get_expander_pg1 - obtain expander page 1 ++ * @ioc: per adapter object ++ * @mpi_reply: reply mf payload returned from firmware ++ * @config_page: contents of the config page ++ * @phy_number: phy number ++ * @handle: expander handle ++ * Context: sleep. ++ * ++ * Returns 0 for success, non-zero for failure. ++ */ ++int ++mpt2sas_config_get_expander_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t ++ *mpi_reply, Mpi2ExpanderPage1_t *config_page, u32 phy_number, ++ u16 handle) ++{ ++ Mpi2ConfigRequest_t mpi_request; ++ int r; ++ ++ memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); ++ mpi_request.Function = MPI2_FUNCTION_CONFIG; ++ mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER; ++ mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_EXTENDED; ++ mpi_request.ExtPageType = MPI2_CONFIG_EXTPAGETYPE_SAS_EXPANDER; ++ mpi_request.Header.PageNumber = 1; ++ mpi_request.Header.PageVersion = MPI2_SASEXPANDER1_PAGEVERSION; ++ mpt2sas_base_build_zero_len_sge(ioc, &mpi_request.PageBufferSGE); ++ r = _config_request(ioc, &mpi_request, mpi_reply, ++ MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0); ++ if (r) ++ goto out; ++ ++ mpi_request.PageAddress = ++ cpu_to_le32(MPI2_SAS_EXPAND_PGAD_FORM_HNDL_PHY_NUM | ++ (phy_number << MPI2_SAS_EXPAND_PGAD_PHYNUM_SHIFT) | handle); ++ mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT; ++ r = _config_request(ioc, &mpi_request, mpi_reply, ++ MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page, ++ sizeof(*config_page)); ++ out: ++ return r; ++} ++ ++/** ++ * mpt2sas_config_get_enclosure_pg0 - obtain enclosure page 0 ++ * @ioc: per adapter object ++ * @mpi_reply: reply mf payload returned from firmware ++ * @config_page: contents of the config page ++ * @form: GET_NEXT_HANDLE or HANDLE ++ * @handle: expander handle ++ * Context: sleep. ++ * ++ * Returns 0 for success, non-zero for failure. ++ */ ++int ++mpt2sas_config_get_enclosure_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t ++ *mpi_reply, Mpi2SasEnclosurePage0_t *config_page, u32 form, u32 handle) ++{ ++ Mpi2ConfigRequest_t mpi_request; ++ int r; ++ ++ memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); ++ mpi_request.Function = MPI2_FUNCTION_CONFIG; ++ mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER; ++ mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_EXTENDED; ++ mpi_request.ExtPageType = MPI2_CONFIG_EXTPAGETYPE_ENCLOSURE; ++ mpi_request.Header.PageNumber = 0; ++ mpi_request.Header.PageVersion = MPI2_SASENCLOSURE0_PAGEVERSION; ++ mpt2sas_base_build_zero_len_sge(ioc, &mpi_request.PageBufferSGE); ++ r = _config_request(ioc, &mpi_request, mpi_reply, ++ MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0); ++ if (r) ++ goto out; ++ ++ mpi_request.PageAddress = cpu_to_le32(form | handle); ++ mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT; ++ r = _config_request(ioc, &mpi_request, mpi_reply, ++ MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page, ++ sizeof(*config_page)); ++ out: ++ return r; ++} ++ ++/** ++ * mpt2sas_config_get_phy_pg0 - obtain phy page 0 ++ * @ioc: per adapter object ++ * @mpi_reply: reply mf payload returned from firmware ++ * @config_page: contents of the config page ++ * @phy_number: phy number ++ * Context: sleep. ++ * ++ * Returns 0 for success, non-zero for failure. ++ */ ++int ++mpt2sas_config_get_phy_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t ++ *mpi_reply, Mpi2SasPhyPage0_t *config_page, u32 phy_number) ++{ ++ Mpi2ConfigRequest_t mpi_request; ++ int r; ++ ++ memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); ++ mpi_request.Function = MPI2_FUNCTION_CONFIG; ++ mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER; ++ mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_EXTENDED; ++ mpi_request.ExtPageType = MPI2_CONFIG_EXTPAGETYPE_SAS_PHY; ++ mpi_request.Header.PageNumber = 0; ++ mpi_request.Header.PageVersion = MPI2_SASPHY0_PAGEVERSION; ++ mpt2sas_base_build_zero_len_sge(ioc, &mpi_request.PageBufferSGE); ++ r = _config_request(ioc, &mpi_request, mpi_reply, ++ MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0); ++ if (r) ++ goto out; ++ ++ mpi_request.PageAddress = ++ cpu_to_le32(MPI2_SAS_PHY_PGAD_FORM_PHY_NUMBER | phy_number); ++ mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT; ++ r = _config_request(ioc, &mpi_request, mpi_reply, ++ MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page, ++ sizeof(*config_page)); ++ out: ++ return r; ++} ++ ++/** ++ * mpt2sas_config_get_phy_pg1 - obtain phy page 1 ++ * @ioc: per adapter object ++ * @mpi_reply: reply mf payload returned from firmware ++ * @config_page: contents of the config page ++ * @phy_number: phy number ++ * Context: sleep. ++ * ++ * Returns 0 for success, non-zero for failure. ++ */ ++int ++mpt2sas_config_get_phy_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t ++ *mpi_reply, Mpi2SasPhyPage1_t *config_page, u32 phy_number) ++{ ++ Mpi2ConfigRequest_t mpi_request; ++ int r; ++ ++ memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); ++ mpi_request.Function = MPI2_FUNCTION_CONFIG; ++ mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER; ++ mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_EXTENDED; ++ mpi_request.ExtPageType = MPI2_CONFIG_EXTPAGETYPE_SAS_PHY; ++ mpi_request.Header.PageNumber = 1; ++ mpi_request.Header.PageVersion = MPI2_SASPHY1_PAGEVERSION; ++ mpt2sas_base_build_zero_len_sge(ioc, &mpi_request.PageBufferSGE); ++ r = _config_request(ioc, &mpi_request, mpi_reply, ++ MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0); ++ if (r) ++ goto out; ++ ++ mpi_request.PageAddress = ++ cpu_to_le32(MPI2_SAS_PHY_PGAD_FORM_PHY_NUMBER | phy_number); ++ mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT; ++ r = _config_request(ioc, &mpi_request, mpi_reply, ++ MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page, ++ sizeof(*config_page)); ++ out: ++ return r; ++} ++ ++/** ++ * mpt2sas_config_get_raid_volume_pg1 - obtain raid volume page 1 ++ * @ioc: per adapter object ++ * @mpi_reply: reply mf payload returned from firmware ++ * @config_page: contents of the config page ++ * @form: GET_NEXT_HANDLE or HANDLE ++ * @handle: volume handle ++ * Context: sleep. ++ * ++ * Returns 0 for success, non-zero for failure. ++ */ ++int ++mpt2sas_config_get_raid_volume_pg1(struct MPT2SAS_ADAPTER *ioc, ++ Mpi2ConfigReply_t *mpi_reply, Mpi2RaidVolPage1_t *config_page, u32 form, ++ u32 handle) ++{ ++ Mpi2ConfigRequest_t mpi_request; ++ int r; ++ ++ memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); ++ mpi_request.Function = MPI2_FUNCTION_CONFIG; ++ mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER; ++ mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_RAID_VOLUME; ++ mpi_request.Header.PageNumber = 1; ++ mpi_request.Header.PageVersion = MPI2_RAIDVOLPAGE1_PAGEVERSION; ++ mpt2sas_base_build_zero_len_sge(ioc, &mpi_request.PageBufferSGE); ++ r = _config_request(ioc, &mpi_request, mpi_reply, ++ MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0); ++ if (r) ++ goto out; ++ ++ mpi_request.PageAddress = cpu_to_le32(form | handle); ++ mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT; ++ r = _config_request(ioc, &mpi_request, mpi_reply, ++ MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page, ++ sizeof(*config_page)); ++ out: ++ return r; ++} ++ ++/** ++ * mpt2sas_config_get_number_pds - obtain number of phys disk assigned to volume ++ * @ioc: per adapter object ++ * @handle: volume handle ++ * @num_pds: returns pds count ++ * Context: sleep. ++ * ++ * Returns 0 for success, non-zero for failure. ++ */ ++int ++mpt2sas_config_get_number_pds(struct MPT2SAS_ADAPTER *ioc, u16 handle, ++ u8 *num_pds) ++{ ++ Mpi2ConfigRequest_t mpi_request; ++ Mpi2RaidVolPage0_t config_page; ++ Mpi2ConfigReply_t mpi_reply; ++ int r; ++ u16 ioc_status; ++ ++ memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); ++ *num_pds = 0; ++ mpi_request.Function = MPI2_FUNCTION_CONFIG; ++ mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER; ++ mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_RAID_VOLUME; ++ mpi_request.Header.PageNumber = 0; ++ mpi_request.Header.PageVersion = MPI2_RAIDVOLPAGE0_PAGEVERSION; ++ mpt2sas_base_build_zero_len_sge(ioc, &mpi_request.PageBufferSGE); ++ r = _config_request(ioc, &mpi_request, &mpi_reply, ++ MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0); ++ if (r) ++ goto out; ++ ++ mpi_request.PageAddress = ++ cpu_to_le32(MPI2_RAID_VOLUME_PGAD_FORM_HANDLE | handle); ++ mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT; ++ r = _config_request(ioc, &mpi_request, &mpi_reply, ++ MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, &config_page, ++ sizeof(Mpi2RaidVolPage0_t)); ++ if (!r) { ++ ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & ++ MPI2_IOCSTATUS_MASK; ++ if (ioc_status == MPI2_IOCSTATUS_SUCCESS) ++ *num_pds = config_page.NumPhysDisks; ++ } ++ ++ out: ++ return r; ++} ++ ++/** ++ * mpt2sas_config_get_raid_volume_pg0 - obtain raid volume page 0 ++ * @ioc: per adapter object ++ * @mpi_reply: reply mf payload returned from firmware ++ * @config_page: contents of the config page ++ * @form: GET_NEXT_HANDLE or HANDLE ++ * @handle: volume handle ++ * @sz: size of buffer passed in config_page ++ * Context: sleep. ++ * ++ * Returns 0 for success, non-zero for failure. ++ */ ++int ++mpt2sas_config_get_raid_volume_pg0(struct MPT2SAS_ADAPTER *ioc, ++ Mpi2ConfigReply_t *mpi_reply, Mpi2RaidVolPage0_t *config_page, u32 form, ++ u32 handle, u16 sz) ++{ ++ Mpi2ConfigRequest_t mpi_request; ++ int r; ++ ++ memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); ++ mpi_request.Function = MPI2_FUNCTION_CONFIG; ++ mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER; ++ mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_RAID_VOLUME; ++ mpi_request.Header.PageNumber = 0; ++ mpi_request.Header.PageVersion = MPI2_RAIDVOLPAGE0_PAGEVERSION; ++ mpt2sas_base_build_zero_len_sge(ioc, &mpi_request.PageBufferSGE); ++ r = _config_request(ioc, &mpi_request, mpi_reply, ++ MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0); ++ if (r) ++ goto out; ++ ++ mpi_request.PageAddress = cpu_to_le32(form | handle); ++ mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT; ++ r = _config_request(ioc, &mpi_request, mpi_reply, ++ MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page, sz); ++ out: ++ return r; ++} ++ ++/** ++ * mpt2sas_config_get_phys_disk_pg0 - obtain phys disk page 0 ++ * @ioc: per adapter object ++ * @mpi_reply: reply mf payload returned from firmware ++ * @config_page: contents of the config page ++ * @form: GET_NEXT_PHYSDISKNUM, PHYSDISKNUM, DEVHANDLE ++ * @form_specific: specific to the form ++ * Context: sleep. ++ * ++ * Returns 0 for success, non-zero for failure. ++ */ ++int ++mpt2sas_config_get_phys_disk_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t ++ *mpi_reply, Mpi2RaidPhysDiskPage0_t *config_page, u32 form, ++ u32 form_specific) ++{ ++ Mpi2ConfigRequest_t mpi_request; ++ int r; ++ ++ memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); ++ mpi_request.Function = MPI2_FUNCTION_CONFIG; ++ mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER; ++ mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_RAID_PHYSDISK; ++ mpi_request.Header.PageNumber = 0; ++ mpi_request.Header.PageVersion = MPI2_RAIDPHYSDISKPAGE0_PAGEVERSION; ++ mpt2sas_base_build_zero_len_sge(ioc, &mpi_request.PageBufferSGE); ++ r = _config_request(ioc, &mpi_request, mpi_reply, ++ MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0); ++ if (r) ++ goto out; ++ ++ mpi_request.PageAddress = cpu_to_le32(form | form_specific); ++ mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT; ++ r = _config_request(ioc, &mpi_request, mpi_reply, ++ MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page, ++ sizeof(*config_page)); ++ out: ++ return r; ++} ++ ++/** ++ * mpt2sas_config_get_volume_handle - returns volume handle for give hidden raid components ++ * @ioc: per adapter object ++ * @pd_handle: phys disk handle ++ * @volume_handle: volume handle ++ * Context: sleep. ++ * ++ * Returns 0 for success, non-zero for failure. ++ */ ++int ++mpt2sas_config_get_volume_handle(struct MPT2SAS_ADAPTER *ioc, u16 pd_handle, ++ u16 *volume_handle) ++{ ++ Mpi2RaidConfigurationPage0_t *config_page = NULL; ++ Mpi2ConfigRequest_t mpi_request; ++ Mpi2ConfigReply_t mpi_reply; ++ int r, i, config_page_sz; ++ u16 ioc_status; ++ ++ *volume_handle = 0; ++ memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); ++ mpi_request.Function = MPI2_FUNCTION_CONFIG; ++ mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER; ++ mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_EXTENDED; ++ mpi_request.ExtPageType = MPI2_CONFIG_EXTPAGETYPE_RAID_CONFIG; ++ mpi_request.Header.PageVersion = MPI2_RAIDCONFIG0_PAGEVERSION; ++ mpi_request.Header.PageNumber = 0; ++ mpt2sas_base_build_zero_len_sge(ioc, &mpi_request.PageBufferSGE); ++ r = _config_request(ioc, &mpi_request, &mpi_reply, ++ MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0); ++ if (r) ++ goto out; ++ ++ mpi_request.PageAddress = ++ cpu_to_le32(MPI2_RAID_PGAD_FORM_ACTIVE_CONFIG); ++ mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT; ++ config_page_sz = (le16_to_cpu(mpi_reply.ExtPageLength) * 4); ++ config_page = kmalloc(config_page_sz, GFP_KERNEL); ++ if (!config_page) ++ goto out; ++ r = _config_request(ioc, &mpi_request, &mpi_reply, ++ MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page, ++ config_page_sz); ++ if (r) ++ goto out; ++ ++ r = -1; ++ ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & MPI2_IOCSTATUS_MASK; ++ if (ioc_status != MPI2_IOCSTATUS_SUCCESS) ++ goto out; ++ for (i = 0; i < config_page->NumElements; i++) { ++ if ((config_page->ConfigElement[i].ElementFlags & ++ MPI2_RAIDCONFIG0_EFLAGS_MASK_ELEMENT_TYPE) != ++ MPI2_RAIDCONFIG0_EFLAGS_VOL_PHYS_DISK_ELEMENT) ++ continue; ++ if (config_page->ConfigElement[i].PhysDiskDevHandle == ++ pd_handle) { ++ *volume_handle = le16_to_cpu(config_page-> ++ ConfigElement[i].VolDevHandle); ++ r = 0; ++ goto out; ++ } ++ } ++ out: ++ kfree(config_page); ++ return r; ++} ++ ++/** ++ * mpt2sas_config_get_volume_wwid - returns wwid given the volume handle ++ * @ioc: per adapter object ++ * @volume_handle: volume handle ++ * @wwid: volume wwid ++ * Context: sleep. ++ * ++ * Returns 0 for success, non-zero for failure. ++ */ ++int ++mpt2sas_config_get_volume_wwid(struct MPT2SAS_ADAPTER *ioc, u16 volume_handle, ++ u64 *wwid) ++{ ++ Mpi2ConfigReply_t mpi_reply; ++ Mpi2RaidVolPage1_t raid_vol_pg1; ++ ++ *wwid = 0; ++ if (!(mpt2sas_config_get_raid_volume_pg1(ioc, &mpi_reply, ++ &raid_vol_pg1, MPI2_RAID_VOLUME_PGAD_FORM_HANDLE, ++ volume_handle))) { ++ *wwid = le64_to_cpu(raid_vol_pg1.WWID); ++ return 0; ++ } else ++ return -1; ++} +diff -r e02b4006a7c8 drivers/scsi/mpt2sas/mpt2sas_ctl.c +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/scsi/mpt2sas/mpt2sas_ctl.c Wed Jul 01 09:49:59 2009 +0100 +@@ -0,0 +1,2753 @@ ++/* ++ * Management Module Support for MPT (Message Passing Technology) based ++ * controllers ++ * ++ * This code is based on drivers/scsi/mpt2sas/mpt2_ctl.c ++ * Copyright (C) 2007-2008 LSI Corporation ++ * (mailto:DL-MPTFusionLinux@lsi.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. ++ * ++ * NO WARRANTY ++ * THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR ++ * CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT ++ * LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, ++ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is ++ * solely responsible for determining the appropriateness of using and ++ * distributing the Program and assumes all risks associated with its ++ * exercise of rights under this Agreement, including but not limited to ++ * the risks and costs of program errors, damage to or loss of data, ++ * programs or equipment, and unavailability or interruption of operations. ++ ++ * DISCLAIMER OF LIABILITY ++ * NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY ++ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ++ * DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), 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 OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED ++ * HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES ++ ++ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, ++ * USA. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++ ++#include "mpt2sas_base.h" ++#include "mpt2sas_ctl.h" ++ ++static struct fasync_struct *async_queue; ++static DECLARE_WAIT_QUEUE_HEAD(ctl_poll_wait); ++ ++static int _ctl_send_release(struct MPT2SAS_ADAPTER *ioc, u8 buffer_type, ++ u8 *issue_reset); ++ ++/** ++ * enum block_state - blocking state ++ * @NON_BLOCKING: non blocking ++ * @BLOCKING: blocking ++ * ++ * These states are for ioctls that need to wait for a response ++ * from firmware, so they probably require sleep. ++ */ ++enum block_state { ++ NON_BLOCKING, ++ BLOCKING, ++}; ++ ++#ifdef CONFIG_SCSI_MPT2SAS_LOGGING ++/** ++ * _ctl_display_some_debug - debug routine ++ * @ioc: per adapter object ++ * @smid: system request message index ++ * @calling_function_name: string pass from calling function ++ * @mpi_reply: reply message frame ++ * Context: none. ++ * ++ * Function for displaying debug info helpfull when debugging issues ++ * in this module. ++ */ ++static void ++_ctl_display_some_debug(struct MPT2SAS_ADAPTER *ioc, u16 smid, ++ char *calling_function_name, MPI2DefaultReply_t *mpi_reply) ++{ ++ Mpi2ConfigRequest_t *mpi_request; ++ char *desc = NULL; ++ ++ if (!(ioc->logging_level & MPT_DEBUG_IOCTL)) ++ return; ++ ++ mpi_request = mpt2sas_base_get_msg_frame(ioc, smid); ++ switch (mpi_request->Function) { ++ case MPI2_FUNCTION_SCSI_IO_REQUEST: ++ { ++ Mpi2SCSIIORequest_t *scsi_request = ++ (Mpi2SCSIIORequest_t *)mpi_request; ++ ++ snprintf(ioc->tmp_string, MPT_STRING_LENGTH, ++ "scsi_io, cmd(0x%02x), cdb_len(%d)", ++ scsi_request->CDB.CDB32[0], ++ le16_to_cpu(scsi_request->IoFlags) & 0xF); ++ desc = ioc->tmp_string; ++ break; ++ } ++ case MPI2_FUNCTION_SCSI_TASK_MGMT: ++ desc = "task_mgmt"; ++ break; ++ case MPI2_FUNCTION_IOC_INIT: ++ desc = "ioc_init"; ++ break; ++ case MPI2_FUNCTION_IOC_FACTS: ++ desc = "ioc_facts"; ++ break; ++ case MPI2_FUNCTION_CONFIG: ++ { ++ Mpi2ConfigRequest_t *config_request = ++ (Mpi2ConfigRequest_t *)mpi_request; ++ ++ snprintf(ioc->tmp_string, MPT_STRING_LENGTH, ++ "config, type(0x%02x), ext_type(0x%02x), number(%d)", ++ (config_request->Header.PageType & ++ MPI2_CONFIG_PAGETYPE_MASK), config_request->ExtPageType, ++ config_request->Header.PageNumber); ++ desc = ioc->tmp_string; ++ break; ++ } ++ case MPI2_FUNCTION_PORT_FACTS: ++ desc = "port_facts"; ++ break; ++ case MPI2_FUNCTION_PORT_ENABLE: ++ desc = "port_enable"; ++ break; ++ case MPI2_FUNCTION_EVENT_NOTIFICATION: ++ desc = "event_notification"; ++ break; ++ case MPI2_FUNCTION_FW_DOWNLOAD: ++ desc = "fw_download"; ++ break; ++ case MPI2_FUNCTION_FW_UPLOAD: ++ desc = "fw_upload"; ++ break; ++ case MPI2_FUNCTION_RAID_ACTION: ++ desc = "raid_action"; ++ break; ++ case MPI2_FUNCTION_RAID_SCSI_IO_PASSTHROUGH: ++ { ++ Mpi2SCSIIORequest_t *scsi_request = ++ (Mpi2SCSIIORequest_t *)mpi_request; ++ ++ snprintf(ioc->tmp_string, MPT_STRING_LENGTH, ++ "raid_pass, cmd(0x%02x), cdb_len(%d)", ++ scsi_request->CDB.CDB32[0], ++ le16_to_cpu(scsi_request->IoFlags) & 0xF); ++ desc = ioc->tmp_string; ++ break; ++ } ++ case MPI2_FUNCTION_SAS_IO_UNIT_CONTROL: ++ desc = "sas_iounit_cntl"; ++ break; ++ case MPI2_FUNCTION_SATA_PASSTHROUGH: ++ desc = "sata_pass"; ++ break; ++ case MPI2_FUNCTION_DIAG_BUFFER_POST: ++ desc = "diag_buffer_post"; ++ break; ++ case MPI2_FUNCTION_DIAG_RELEASE: ++ desc = "diag_release"; ++ break; ++ case MPI2_FUNCTION_SMP_PASSTHROUGH: ++ desc = "smp_passthrough"; ++ break; ++ } ++ ++ if (!desc) ++ return; ++ ++ printk(MPT2SAS_DEBUG_FMT "%s: %s, smid(%d)\n", ++ ioc->name, calling_function_name, desc, smid); ++ ++ if (!mpi_reply) ++ return; ++ ++ if (mpi_reply->IOCStatus || mpi_reply->IOCLogInfo) ++ printk(MPT2SAS_DEBUG_FMT ++ "\tiocstatus(0x%04x), loginfo(0x%08x)\n", ++ ioc->name, le16_to_cpu(mpi_reply->IOCStatus), ++ le32_to_cpu(mpi_reply->IOCLogInfo)); ++ ++ if (mpi_request->Function == MPI2_FUNCTION_SCSI_IO_REQUEST || ++ mpi_request->Function == ++ MPI2_FUNCTION_RAID_SCSI_IO_PASSTHROUGH) { ++ Mpi2SCSIIOReply_t *scsi_reply = ++ (Mpi2SCSIIOReply_t *)mpi_reply; ++ if (scsi_reply->SCSIState || scsi_reply->SCSIStatus) ++ printk(MPT2SAS_DEBUG_FMT ++ "\tscsi_state(0x%02x), scsi_status" ++ "(0x%02x)\n", ioc->name, ++ scsi_reply->SCSIState, ++ scsi_reply->SCSIStatus); ++ } ++} ++#endif ++ ++/** ++ * mpt2sas_ctl_done - ctl module completion routine ++ * @ioc: per adapter object ++ * @smid: system request message index ++ * @VF_ID: virtual function id ++ * @reply: reply message frame(lower 32bit addr) ++ * Context: none. ++ * ++ * The callback handler when using ioc->ctl_cb_idx. ++ * ++ * Return nothing. ++ */ ++void ++mpt2sas_ctl_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 VF_ID, u32 reply) ++{ ++ MPI2DefaultReply_t *mpi_reply; ++ ++ if (ioc->ctl_cmds.status == MPT2_CMD_NOT_USED) ++ return; ++ if (ioc->ctl_cmds.smid != smid) ++ return; ++ ioc->ctl_cmds.status |= MPT2_CMD_COMPLETE; ++ mpi_reply = mpt2sas_base_get_reply_virt_addr(ioc, reply); ++ if (mpi_reply) { ++ memcpy(ioc->ctl_cmds.reply, mpi_reply, mpi_reply->MsgLength*4); ++ ioc->ctl_cmds.status |= MPT2_CMD_REPLY_VALID; ++ } ++#ifdef CONFIG_SCSI_MPT2SAS_LOGGING ++ _ctl_display_some_debug(ioc, smid, "ctl_done", mpi_reply); ++#endif ++ ioc->ctl_cmds.status &= ~MPT2_CMD_PENDING; ++ complete(&ioc->ctl_cmds.done); ++} ++ ++/** ++ * _ctl_check_event_type - determines when an event needs logging ++ * @ioc: per adapter object ++ * @event: firmware event ++ * ++ * The bitmask in ioc->event_type[] indicates which events should be ++ * be saved in the driver event_log. This bitmask is set by application. ++ * ++ * Returns 1 when event should be captured, or zero means no match. ++ */ ++static int ++_ctl_check_event_type(struct MPT2SAS_ADAPTER *ioc, u16 event) ++{ ++ u16 i; ++ u32 desired_event; ++ ++ if (event >= 128 || !event || !ioc->event_log) ++ return 0; ++ ++ desired_event = (1 << (event % 32)); ++ if (!desired_event) ++ desired_event = 1; ++ i = event / 32; ++ return desired_event & ioc->event_type[i]; ++} ++ ++/** ++ * mpt2sas_ctl_add_to_event_log - add event ++ * @ioc: per adapter object ++ * @mpi_reply: reply message frame ++ * ++ * Return nothing. ++ */ ++void ++mpt2sas_ctl_add_to_event_log(struct MPT2SAS_ADAPTER *ioc, ++ Mpi2EventNotificationReply_t *mpi_reply) ++{ ++ struct MPT2_IOCTL_EVENTS *event_log; ++ u16 event; ++ int i; ++ u32 sz, event_data_sz; ++ u8 send_aen = 0; ++ ++ if (!ioc->event_log) ++ return; ++ ++ event = le16_to_cpu(mpi_reply->Event); ++ ++ if (_ctl_check_event_type(ioc, event)) { ++ ++ /* insert entry into circular event_log */ ++ i = ioc->event_context % MPT2SAS_CTL_EVENT_LOG_SIZE; ++ event_log = ioc->event_log; ++ event_log[i].event = event; ++ event_log[i].context = ioc->event_context++; ++ ++ event_data_sz = le16_to_cpu(mpi_reply->EventDataLength)*4; ++ sz = min_t(u32, event_data_sz, MPT2_EVENT_DATA_SIZE); ++ memset(event_log[i].data, 0, MPT2_EVENT_DATA_SIZE); ++ memcpy(event_log[i].data, mpi_reply->EventData, sz); ++ send_aen = 1; ++ } ++ ++ /* This aen_event_read_flag flag is set until the ++ * application has read the event log. ++ * For MPI2_EVENT_LOG_ENTRY_ADDED, we always notify. ++ */ ++ if (event == MPI2_EVENT_LOG_ENTRY_ADDED || ++ (send_aen && !ioc->aen_event_read_flag)) { ++ ioc->aen_event_read_flag = 1; ++ wake_up_interruptible(&ctl_poll_wait); ++ if (async_queue) ++ kill_fasync(&async_queue, SIGIO, POLL_IN); ++ } ++} ++ ++/** ++ * mpt2sas_ctl_event_callback - firmware event handler (called at ISR time) ++ * @ioc: per adapter object ++ * @VF_ID: virtual function id ++ * @reply: reply message frame(lower 32bit addr) ++ * Context: interrupt. ++ * ++ * This function merely adds a new work task into ioc->firmware_event_thread. ++ * The tasks are worked from _firmware_event_work in user context. ++ * ++ * Return nothing. ++ */ ++void ++mpt2sas_ctl_event_callback(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID, u32 reply) ++{ ++ Mpi2EventNotificationReply_t *mpi_reply; ++ ++ mpi_reply = mpt2sas_base_get_reply_virt_addr(ioc, reply); ++ mpt2sas_ctl_add_to_event_log(ioc, mpi_reply); ++} ++ ++/** ++ * _ctl_verify_adapter - validates ioc_number passed from application ++ * @ioc: per adapter object ++ * @iocpp: The ioc pointer is returned in this. ++ * ++ * Return (-1) means error, else ioc_number. ++ */ ++static int ++_ctl_verify_adapter(int ioc_number, struct MPT2SAS_ADAPTER **iocpp) ++{ ++ struct MPT2SAS_ADAPTER *ioc; ++ ++ list_for_each_entry(ioc, &mpt2sas_ioc_list, list) { ++ if (ioc->id != ioc_number) ++ continue; ++ *iocpp = ioc; ++ return ioc_number; ++ } ++ *iocpp = NULL; ++ return -1; ++} ++ ++/** ++ * mpt2sas_ctl_reset_handler - reset callback handler (for ctl) ++ * @ioc: per adapter object ++ * @reset_phase: phase ++ * ++ * The handler for doing any required cleanup or initialization. ++ * ++ * The reset phase can be MPT2_IOC_PRE_RESET, MPT2_IOC_AFTER_RESET, ++ * MPT2_IOC_DONE_RESET ++ */ ++void ++mpt2sas_ctl_reset_handler(struct MPT2SAS_ADAPTER *ioc, int reset_phase) ++{ ++ int i; ++ u8 issue_reset; ++ ++ switch (reset_phase) { ++ case MPT2_IOC_PRE_RESET: ++ dtmprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: " ++ "MPT2_IOC_PRE_RESET\n", ioc->name, __func__)); ++ for (i = 0; i < MPI2_DIAG_BUF_TYPE_COUNT; i++) { ++ if (!(ioc->diag_buffer_status[i] & ++ MPT2_DIAG_BUFFER_IS_REGISTERED)) ++ continue; ++ if ((ioc->diag_buffer_status[i] & ++ MPT2_DIAG_BUFFER_IS_RELEASED)) ++ continue; ++ _ctl_send_release(ioc, i, &issue_reset); ++ } ++ break; ++ case MPT2_IOC_AFTER_RESET: ++ dtmprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: " ++ "MPT2_IOC_AFTER_RESET\n", ioc->name, __func__)); ++ if (ioc->ctl_cmds.status & MPT2_CMD_PENDING) { ++ ioc->ctl_cmds.status |= MPT2_CMD_RESET; ++ mpt2sas_base_free_smid(ioc, ioc->ctl_cmds.smid); ++ complete(&ioc->ctl_cmds.done); ++ } ++ break; ++ case MPT2_IOC_DONE_RESET: ++ dtmprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: " ++ "MPT2_IOC_DONE_RESET\n", ioc->name, __func__)); ++ ++ for (i = 0; i < MPI2_DIAG_BUF_TYPE_COUNT; i++) { ++ if (!(ioc->diag_buffer_status[i] & ++ MPT2_DIAG_BUFFER_IS_REGISTERED)) ++ continue; ++ if ((ioc->diag_buffer_status[i] & ++ MPT2_DIAG_BUFFER_IS_RELEASED)) ++ continue; ++ ioc->diag_buffer_status[i] |= ++ MPT2_DIAG_BUFFER_IS_DIAG_RESET; ++ } ++ break; ++ } ++} ++ ++/** ++ * _ctl_fasync - ++ * @fd - ++ * @filep - ++ * @mode - ++ * ++ * Called when application request fasyn callback handler. ++ */ ++static int ++_ctl_fasync(int fd, struct file *filep, int mode) ++{ ++ return fasync_helper(fd, filep, mode, &async_queue); ++} ++ ++/** ++ * _ctl_release - ++ * @inode - ++ * @filep - ++ * ++ * Called when application releases the fasyn callback handler. ++ */ ++static int ++_ctl_release(struct inode *inode, struct file *filep) ++{ ++ return fasync_helper(-1, filep, 0, &async_queue); ++} ++ ++/** ++ * _ctl_poll - ++ * @file - ++ * @wait - ++ * ++ */ ++static unsigned int ++_ctl_poll(struct file *filep, poll_table *wait) ++{ ++ struct MPT2SAS_ADAPTER *ioc; ++ ++ poll_wait(filep, &ctl_poll_wait, wait); ++ ++ list_for_each_entry(ioc, &mpt2sas_ioc_list, list) { ++ if (ioc->aen_event_read_flag) ++ return POLLIN | POLLRDNORM; ++ } ++ return 0; ++} ++ ++/** ++ * _ctl_set_task_mid - assign an active smid to tm request ++ * @ioc: per adapter object ++ * @karg - (struct mpt2_ioctl_command) ++ * @tm_request - pointer to mf from user space ++ * ++ * Returns 0 when an smid if found, else fail. ++ * during failure, the reply frame is filled. ++ */ ++static int ++_ctl_set_task_mid(struct MPT2SAS_ADAPTER *ioc, struct mpt2_ioctl_command *karg, ++ Mpi2SCSITaskManagementRequest_t *tm_request) ++{ ++ u8 found = 0; ++ u16 i; ++ u16 handle; ++ struct scsi_cmnd *scmd; ++ struct MPT2SAS_DEVICE *priv_data; ++ unsigned long flags; ++ Mpi2SCSITaskManagementReply_t *tm_reply; ++ u32 sz; ++ u32 lun; ++ char *desc = NULL; ++ ++ if (tm_request->TaskType == MPI2_SCSITASKMGMT_TASKTYPE_ABORT_TASK) ++ desc = "abort_task"; ++ else if (tm_request->TaskType == MPI2_SCSITASKMGMT_TASKTYPE_QUERY_TASK) ++ desc = "query_task"; ++ else ++ return 0; ++ ++ lun = mpt_scsilun_to_int((struct scsi_lun *)tm_request->LUN); ++ ++ handle = le16_to_cpu(tm_request->DevHandle); ++ spin_lock_irqsave(&ioc->scsi_lookup_lock, flags); ++ for (i = ioc->request_depth; i && !found; i--) { ++ scmd = ioc->scsi_lookup[i - 1].scmd; ++ if (scmd == NULL || scmd->device == NULL || ++ scmd->device->hostdata == NULL) ++ continue; ++ if (lun != scmd->device->lun) ++ continue; ++ priv_data = scmd->device->hostdata; ++ if (priv_data->sas_target == NULL) ++ continue; ++ if (priv_data->sas_target->handle != handle) ++ continue; ++ tm_request->TaskMID = cpu_to_le16(ioc->scsi_lookup[i - 1].smid); ++ found = 1; ++ } ++ spin_unlock_irqrestore(&ioc->scsi_lookup_lock, flags); ++ ++ if (!found) { ++ dctlprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: " ++ "handle(0x%04x), lun(%d), no active mid!!\n", ioc->name, ++ desc, tm_request->DevHandle, lun)); ++ tm_reply = ioc->ctl_cmds.reply; ++ tm_reply->DevHandle = tm_request->DevHandle; ++ tm_reply->Function = MPI2_FUNCTION_SCSI_TASK_MGMT; ++ tm_reply->TaskType = tm_request->TaskType; ++ tm_reply->MsgLength = sizeof(Mpi2SCSITaskManagementReply_t)/4; ++ tm_reply->VP_ID = tm_request->VP_ID; ++ tm_reply->VF_ID = tm_request->VF_ID; ++ sz = min_t(u32, karg->max_reply_bytes, ioc->reply_sz); ++ if (copy_to_user(karg->reply_frame_buf_ptr, ioc->ctl_cmds.reply, ++ sz)) ++ printk(KERN_ERR "failure at %s:%d/%s()!\n", __FILE__, ++ __LINE__, __func__); ++ return 1; ++ } ++ ++ dctlprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: " ++ "handle(0x%04x), lun(%d), task_mid(%d)\n", ioc->name, ++ desc, tm_request->DevHandle, lun, tm_request->TaskMID)); ++ return 0; ++} ++ ++/** ++ * _ctl_do_mpt_command - main handler for MPT2COMMAND opcode ++ * @ioc: per adapter object ++ * @karg - (struct mpt2_ioctl_command) ++ * @mf - pointer to mf in user space ++ * @state - NON_BLOCKING or BLOCKING ++ */ ++static long ++_ctl_do_mpt_command(struct MPT2SAS_ADAPTER *ioc, ++ struct mpt2_ioctl_command karg, void __user *mf, enum block_state state) ++{ ++ MPI2RequestHeader_t *mpi_request; ++ MPI2DefaultReply_t *mpi_reply; ++ u32 ioc_state; ++ u16 ioc_status; ++ u16 smid; ++ unsigned long timeout, timeleft; ++ u8 issue_reset; ++ u32 sz; ++ void *psge; ++ void *priv_sense = NULL; ++ void *data_out = NULL; ++ dma_addr_t data_out_dma; ++ size_t data_out_sz = 0; ++ void *data_in = NULL; ++ dma_addr_t data_in_dma; ++ size_t data_in_sz = 0; ++ u32 sgl_flags; ++ long ret; ++ u16 wait_state_count; ++ ++ issue_reset = 0; ++ ++ if (state == NON_BLOCKING && !mutex_trylock(&ioc->ctl_cmds.mutex)) ++ return -EAGAIN; ++ else if (mutex_lock_interruptible(&ioc->ctl_cmds.mutex)) ++ return -ERESTARTSYS; ++ ++ if (ioc->ctl_cmds.status != MPT2_CMD_NOT_USED) { ++ printk(MPT2SAS_ERR_FMT "%s: ctl_cmd in use\n", ++ ioc->name, __func__); ++ ret = -EAGAIN; ++ goto out; ++ } ++ ++ wait_state_count = 0; ++ ioc_state = mpt2sas_base_get_iocstate(ioc, 1); ++ while (ioc_state != MPI2_IOC_STATE_OPERATIONAL) { ++ if (wait_state_count++ == 10) { ++ printk(MPT2SAS_ERR_FMT ++ "%s: failed due to ioc not operational\n", ++ ioc->name, __func__); ++ ret = -EFAULT; ++ goto out; ++ } ++ ssleep(1); ++ ioc_state = mpt2sas_base_get_iocstate(ioc, 1); ++ printk(MPT2SAS_INFO_FMT "%s: waiting for " ++ "operational state(count=%d)\n", ioc->name, ++ __func__, wait_state_count); ++ } ++ if (wait_state_count) ++ printk(MPT2SAS_INFO_FMT "%s: ioc is operational\n", ++ ioc->name, __func__); ++ ++ smid = mpt2sas_base_get_smid(ioc, ioc->ctl_cb_idx); ++ if (!smid) { ++ printk(MPT2SAS_ERR_FMT "%s: failed obtaining a smid\n", ++ ioc->name, __func__); ++ ret = -EAGAIN; ++ goto out; ++ } ++ ++ ret = 0; ++ ioc->ctl_cmds.status = MPT2_CMD_PENDING; ++ memset(ioc->ctl_cmds.reply, 0, ioc->reply_sz); ++ mpi_request = mpt2sas_base_get_msg_frame(ioc, smid); ++ ioc->ctl_cmds.smid = smid; ++ data_out_sz = karg.data_out_size; ++ data_in_sz = karg.data_in_size; ++ ++ /* copy in request message frame from user */ ++ if (copy_from_user(mpi_request, mf, karg.data_sge_offset*4)) { ++ printk(KERN_ERR "failure at %s:%d/%s()!\n", __FILE__, __LINE__, ++ __func__); ++ ret = -EFAULT; ++ mpt2sas_base_free_smid(ioc, smid); ++ goto out; ++ } ++ ++ if (mpi_request->Function == MPI2_FUNCTION_SCSI_IO_REQUEST || ++ mpi_request->Function == MPI2_FUNCTION_RAID_SCSI_IO_PASSTHROUGH) { ++ if (!mpi_request->FunctionDependent1 || ++ mpi_request->FunctionDependent1 > ++ cpu_to_le16(ioc->facts.MaxDevHandle)) { ++ ret = -EINVAL; ++ mpt2sas_base_free_smid(ioc, smid); ++ goto out; ++ } ++ } ++ ++ /* obtain dma-able memory for data transfer */ ++ if (data_out_sz) /* WRITE */ { ++ data_out = pci_alloc_consistent(ioc->pdev, data_out_sz, ++ &data_out_dma); ++ if (!data_out) { ++ printk(KERN_ERR "failure at %s:%d/%s()!\n", __FILE__, ++ __LINE__, __func__); ++ ret = -ENOMEM; ++ mpt2sas_base_free_smid(ioc, smid); ++ goto out; ++ } ++ if (copy_from_user(data_out, karg.data_out_buf_ptr, ++ data_out_sz)) { ++ printk(KERN_ERR "failure at %s:%d/%s()!\n", __FILE__, ++ __LINE__, __func__); ++ ret = -EFAULT; ++ mpt2sas_base_free_smid(ioc, smid); ++ goto out; ++ } ++ } ++ ++ if (data_in_sz) /* READ */ { ++ data_in = pci_alloc_consistent(ioc->pdev, data_in_sz, ++ &data_in_dma); ++ if (!data_in) { ++ printk(KERN_ERR "failure at %s:%d/%s()!\n", __FILE__, ++ __LINE__, __func__); ++ ret = -ENOMEM; ++ mpt2sas_base_free_smid(ioc, smid); ++ goto out; ++ } ++ } ++ ++ /* add scatter gather elements */ ++ psge = (void *)mpi_request + (karg.data_sge_offset*4); ++ ++ if (!data_out_sz && !data_in_sz) { ++ mpt2sas_base_build_zero_len_sge(ioc, psge); ++ } else if (data_out_sz && data_in_sz) { ++ /* WRITE sgel first */ ++ sgl_flags = (MPI2_SGE_FLAGS_SIMPLE_ELEMENT | ++ MPI2_SGE_FLAGS_END_OF_BUFFER | MPI2_SGE_FLAGS_HOST_TO_IOC); ++ sgl_flags = sgl_flags << MPI2_SGE_FLAGS_SHIFT; ++ ioc->base_add_sg_single(psge, sgl_flags | ++ data_out_sz, data_out_dma); ++ ++ /* incr sgel */ ++ psge += ioc->sge_size; ++ ++ /* READ sgel last */ ++ sgl_flags = (MPI2_SGE_FLAGS_SIMPLE_ELEMENT | ++ MPI2_SGE_FLAGS_LAST_ELEMENT | MPI2_SGE_FLAGS_END_OF_BUFFER | ++ MPI2_SGE_FLAGS_END_OF_LIST); ++ sgl_flags = sgl_flags << MPI2_SGE_FLAGS_SHIFT; ++ ioc->base_add_sg_single(psge, sgl_flags | ++ data_in_sz, data_in_dma); ++ } else if (data_out_sz) /* WRITE */ { ++ sgl_flags = (MPI2_SGE_FLAGS_SIMPLE_ELEMENT | ++ MPI2_SGE_FLAGS_LAST_ELEMENT | MPI2_SGE_FLAGS_END_OF_BUFFER | ++ MPI2_SGE_FLAGS_END_OF_LIST | MPI2_SGE_FLAGS_HOST_TO_IOC); ++ sgl_flags = sgl_flags << MPI2_SGE_FLAGS_SHIFT; ++ ioc->base_add_sg_single(psge, sgl_flags | ++ data_out_sz, data_out_dma); ++ } else if (data_in_sz) /* READ */ { ++ sgl_flags = (MPI2_SGE_FLAGS_SIMPLE_ELEMENT | ++ MPI2_SGE_FLAGS_LAST_ELEMENT | MPI2_SGE_FLAGS_END_OF_BUFFER | ++ MPI2_SGE_FLAGS_END_OF_LIST); ++ sgl_flags = sgl_flags << MPI2_SGE_FLAGS_SHIFT; ++ ioc->base_add_sg_single(psge, sgl_flags | ++ data_in_sz, data_in_dma); ++ } ++ ++ /* send command to firmware */ ++#ifdef CONFIG_SCSI_MPT2SAS_LOGGING ++ _ctl_display_some_debug(ioc, smid, "ctl_request", NULL); ++#endif ++ ++ switch (mpi_request->Function) { ++ case MPI2_FUNCTION_SCSI_IO_REQUEST: ++ case MPI2_FUNCTION_RAID_SCSI_IO_PASSTHROUGH: ++ { ++ Mpi2SCSIIORequest_t *scsiio_request = ++ (Mpi2SCSIIORequest_t *)mpi_request; ++ scsiio_request->SenseBufferLowAddress = ++ (u32)mpt2sas_base_get_sense_buffer_dma(ioc, smid); ++ priv_sense = mpt2sas_base_get_sense_buffer(ioc, smid); ++ memset(priv_sense, 0, SCSI_SENSE_BUFFERSIZE); ++ mpt2sas_base_put_smid_scsi_io(ioc, smid, 0, ++ le16_to_cpu(mpi_request->FunctionDependent1)); ++ break; ++ } ++ case MPI2_FUNCTION_SCSI_TASK_MGMT: ++ { ++ Mpi2SCSITaskManagementRequest_t *tm_request = ++ (Mpi2SCSITaskManagementRequest_t *)mpi_request; ++ ++ if (tm_request->TaskType == ++ MPI2_SCSITASKMGMT_TASKTYPE_ABORT_TASK || ++ tm_request->TaskType == ++ MPI2_SCSITASKMGMT_TASKTYPE_QUERY_TASK) { ++ if (_ctl_set_task_mid(ioc, &karg, tm_request)) { ++ mpt2sas_base_free_smid(ioc, smid); ++ goto out; ++ } ++ } ++ ++#ifdef MPT2SAS_MULTIPATH ++ mpt2sas_scsih_check_tm_for_multipath(ioc, ++ le16_to_cpu(tm_request->DevHandle), tm_request->TaskType); ++#endif ++ ++ mutex_lock(&ioc->tm_cmds.mutex); ++ mpt2sas_scsih_set_tm_flag(ioc, le16_to_cpu( ++ tm_request->DevHandle)); ++ mpt2sas_base_put_smid_hi_priority(ioc, smid, ++ mpi_request->VF_ID); ++ break; ++ } ++ case MPI2_FUNCTION_SMP_PASSTHROUGH: ++ { ++ Mpi2SmpPassthroughRequest_t *smp_request = ++ (Mpi2SmpPassthroughRequest_t *)mpi_request; ++ u8 *data; ++ ++ /* ioc determines which port to use */ ++ smp_request->PhysicalPort = 0xFF; ++ if (smp_request->PassthroughFlags & ++ MPI2_SMP_PT_REQ_PT_FLAGS_IMMEDIATE) ++ data = (u8 *)&smp_request->SGL; ++ else ++ data = data_out; ++ ++ if (data[1] == 0x91 && (data[10] == 1 || data[10] == 2)) { ++ ioc->ioc_link_reset_in_progress = 1; ++ ioc->ignore_loginfos = 1; ++ } ++ mpt2sas_base_put_smid_default(ioc, smid, mpi_request->VF_ID); ++ break; ++ } ++ case MPI2_FUNCTION_SAS_IO_UNIT_CONTROL: ++ { ++ Mpi2SasIoUnitControlRequest_t *sasiounit_request = ++ (Mpi2SasIoUnitControlRequest_t *)mpi_request; ++ ++ if (sasiounit_request->Operation == MPI2_SAS_OP_PHY_HARD_RESET ++ || sasiounit_request->Operation == ++ MPI2_SAS_OP_PHY_LINK_RESET) { ++ ioc->ioc_link_reset_in_progress = 1; ++ ioc->ignore_loginfos = 1; ++ } ++ mpt2sas_base_put_smid_default(ioc, smid, mpi_request->VF_ID); ++ break; ++ } ++ default: ++ mpt2sas_base_put_smid_default(ioc, smid, mpi_request->VF_ID); ++ break; ++ } ++ ++ if (karg.timeout < MPT2_IOCTL_DEFAULT_TIMEOUT) ++ timeout = MPT2_IOCTL_DEFAULT_TIMEOUT; ++ else ++ timeout = karg.timeout; ++ timeleft = wait_for_completion_timeout(&ioc->ctl_cmds.done, ++ timeout*HZ); ++ if (mpi_request->Function == MPI2_FUNCTION_SCSI_TASK_MGMT) { ++ Mpi2SCSITaskManagementRequest_t *tm_request = ++ (Mpi2SCSITaskManagementRequest_t *)mpi_request; ++ mutex_unlock(&ioc->tm_cmds.mutex); ++ mpt2sas_scsih_clear_tm_flag(ioc, le16_to_cpu( ++ tm_request->DevHandle)); ++ } else if ((mpi_request->Function == MPI2_FUNCTION_SMP_PASSTHROUGH || ++ mpi_request->Function == MPI2_FUNCTION_SAS_IO_UNIT_CONTROL) && ++ ioc->ioc_link_reset_in_progress) { ++ ioc->ioc_link_reset_in_progress = 0; ++ ioc->ignore_loginfos = 0; ++ } ++ if (!(ioc->ctl_cmds.status & MPT2_CMD_COMPLETE)) { ++ printk(MPT2SAS_ERR_FMT "%s: timeout\n", ioc->name, ++ __func__); ++ _debug_dump_mf(mpi_request, karg.data_sge_offset); ++ if (!(ioc->ctl_cmds.status & MPT2_CMD_RESET)) ++ issue_reset = 1; ++ goto issue_host_reset; ++ } ++ ++ mpi_reply = ioc->ctl_cmds.reply; ++ ioc_status = le16_to_cpu(mpi_reply->IOCStatus) & MPI2_IOCSTATUS_MASK; ++ ++#ifdef CONFIG_SCSI_MPT2SAS_LOGGING ++ if (mpi_reply->Function == MPI2_FUNCTION_SCSI_TASK_MGMT && ++ (ioc->logging_level & MPT_DEBUG_TM)) { ++ Mpi2SCSITaskManagementReply_t *tm_reply = ++ (Mpi2SCSITaskManagementReply_t *)mpi_reply; ++ ++ printk(MPT2SAS_DEBUG_FMT "TASK_MGMT: " ++ "IOCStatus(0x%04x), IOCLogInfo(0x%08x), " ++ "TerminationCount(0x%08x)\n", ioc->name, ++ tm_reply->IOCStatus, tm_reply->IOCLogInfo, ++ tm_reply->TerminationCount); ++ } ++#endif ++ /* copy out xdata to user */ ++ if (data_in_sz) { ++ if (copy_to_user(karg.data_in_buf_ptr, data_in, ++ data_in_sz)) { ++ printk(KERN_ERR "failure at %s:%d/%s()!\n", __FILE__, ++ __LINE__, __func__); ++ ret = -ENODATA; ++ goto out; ++ } ++ } ++ ++ /* copy out reply message frame to user */ ++ if (karg.max_reply_bytes) { ++ sz = min_t(u32, karg.max_reply_bytes, ioc->reply_sz); ++ if (copy_to_user(karg.reply_frame_buf_ptr, ioc->ctl_cmds.reply, ++ sz)) { ++ printk(KERN_ERR "failure at %s:%d/%s()!\n", __FILE__, ++ __LINE__, __func__); ++ ret = -ENODATA; ++ goto out; ++ } ++ } ++ ++ /* copy out sense to user */ ++ if (karg.max_sense_bytes && (mpi_request->Function == ++ MPI2_FUNCTION_SCSI_IO_REQUEST || mpi_request->Function == ++ MPI2_FUNCTION_RAID_SCSI_IO_PASSTHROUGH)) { ++ sz = min_t(u32, karg.max_sense_bytes, SCSI_SENSE_BUFFERSIZE); ++ if (copy_to_user(karg.sense_data_ptr, priv_sense, sz)) { ++ printk(KERN_ERR "failure at %s:%d/%s()!\n", __FILE__, ++ __LINE__, __func__); ++ ret = -ENODATA; ++ goto out; ++ } ++ } ++ ++ issue_host_reset: ++ if (issue_reset) { ++ if ((mpi_request->Function == MPI2_FUNCTION_SCSI_IO_REQUEST || ++ mpi_request->Function == ++ MPI2_FUNCTION_RAID_SCSI_IO_PASSTHROUGH)) { ++ printk(MPT2SAS_INFO_FMT "issue target reset: handle " ++ "= (0x%04x)\n", ioc->name, ++ mpi_request->FunctionDependent1); ++ mutex_lock(&ioc->tm_cmds.mutex); ++ mpt2sas_scsih_issue_tm(ioc, ++ mpi_request->FunctionDependent1, 0, ++ MPI2_SCSITASKMGMT_TASKTYPE_TARGET_RESET, 0, 10); ++ ioc->tm_cmds.status = MPT2_CMD_NOT_USED; ++ mutex_unlock(&ioc->tm_cmds.mutex); ++ } else ++ mpt2sas_base_hard_reset_handler(ioc, CAN_SLEEP, ++ FORCE_BIG_HAMMER); ++ } ++ ++ out: ++ ++ /* free memory associated with sg buffers */ ++ if (data_in) ++ pci_free_consistent(ioc->pdev, data_in_sz, data_in, ++ data_in_dma); ++ ++ if (data_out) ++ pci_free_consistent(ioc->pdev, data_out_sz, data_out, ++ data_out_dma); ++ ++ ioc->ctl_cmds.status = MPT2_CMD_NOT_USED; ++ mutex_unlock(&ioc->ctl_cmds.mutex); ++ return ret; ++} ++ ++/** ++ * _ctl_getiocinfo - main handler for MPT2IOCINFO opcode ++ * @arg - user space buffer containing ioctl content ++ */ ++static long ++_ctl_getiocinfo(void __user *arg) ++{ ++ struct mpt2_ioctl_iocinfo karg; ++ struct MPT2SAS_ADAPTER *ioc; ++ u8 revision; ++ ++ if (copy_from_user(&karg, arg, sizeof(karg))) { ++ printk(KERN_ERR "failure at %s:%d/%s()!\n", ++ __FILE__, __LINE__, __func__); ++ return -EFAULT; ++ } ++ if (_ctl_verify_adapter(karg.hdr.ioc_number, &ioc) == -1 || !ioc) ++ return -ENODEV; ++ ++ dctlprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: enter\n", ioc->name, ++ __func__)); ++ ++ memset(&karg, 0 , sizeof(karg)); ++ karg.adapter_type = MPT2_IOCTL_INTERFACE_SAS2; ++ if (ioc->pfacts) ++ karg.port_number = ioc->pfacts[0].PortNumber; ++ pci_read_config_byte(ioc->pdev, PCI_CLASS_REVISION, &revision); ++ karg.hw_rev = revision; ++ karg.pci_id = ioc->pdev->device; ++ karg.subsystem_device = ioc->pdev->subsystem_device; ++ karg.subsystem_vendor = ioc->pdev->subsystem_vendor; ++ karg.pci_information.u.bits.bus = ioc->pdev->bus->number; ++ karg.pci_information.u.bits.device = PCI_SLOT(ioc->pdev->devfn); ++ karg.pci_information.u.bits.function = PCI_FUNC(ioc->pdev->devfn); ++ karg.pci_information.segment_id = pci_domain_nr(ioc->pdev->bus); ++ karg.firmware_version = ioc->facts.FWVersion.Word; ++ strcpy(karg.driver_version, MPT2SAS_DRIVER_NAME); ++ strcat(karg.driver_version, "-"); ++ strcat(karg.driver_version, MPT2SAS_DRIVER_VERSION); ++ karg.bios_version = le32_to_cpu(ioc->bios_pg3.BiosVersion); ++ ++ if (copy_to_user(arg, &karg, sizeof(karg))) { ++ printk(KERN_ERR "failure at %s:%d/%s()!\n", ++ __FILE__, __LINE__, __func__); ++ return -EFAULT; ++ } ++ return 0; ++} ++ ++/** ++ * _ctl_eventquery - main handler for MPT2EVENTQUERY opcode ++ * @arg - user space buffer containing ioctl content ++ */ ++static long ++_ctl_eventquery(void __user *arg) ++{ ++ struct mpt2_ioctl_eventquery karg; ++ struct MPT2SAS_ADAPTER *ioc; ++ ++ if (copy_from_user(&karg, arg, sizeof(karg))) { ++ printk(KERN_ERR "failure at %s:%d/%s()!\n", ++ __FILE__, __LINE__, __func__); ++ return -EFAULT; ++ } ++ if (_ctl_verify_adapter(karg.hdr.ioc_number, &ioc) == -1 || !ioc) ++ return -ENODEV; ++ ++ dctlprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: enter\n", ioc->name, ++ __func__)); ++ ++ karg.event_entries = MPT2SAS_CTL_EVENT_LOG_SIZE; ++ memcpy(karg.event_types, ioc->event_type, ++ MPI2_EVENT_NOTIFY_EVENTMASK_WORDS * sizeof(u32)); ++ ++ if (copy_to_user(arg, &karg, sizeof(karg))) { ++ printk(KERN_ERR "failure at %s:%d/%s()!\n", ++ __FILE__, __LINE__, __func__); ++ return -EFAULT; ++ } ++ return 0; ++} ++ ++/** ++ * _ctl_eventenable - main handler for MPT2EVENTENABLE opcode ++ * @arg - user space buffer containing ioctl content ++ */ ++static long ++_ctl_eventenable(void __user *arg) ++{ ++ struct mpt2_ioctl_eventenable karg; ++ struct MPT2SAS_ADAPTER *ioc; ++ ++ if (copy_from_user(&karg, arg, sizeof(karg))) { ++ printk(KERN_ERR "failure at %s:%d/%s()!\n", ++ __FILE__, __LINE__, __func__); ++ return -EFAULT; ++ } ++ if (_ctl_verify_adapter(karg.hdr.ioc_number, &ioc) == -1 || !ioc) ++ return -ENODEV; ++ ++ dctlprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: enter\n", ioc->name, ++ __func__)); ++ ++ if (ioc->event_log) ++ return 0; ++ memcpy(ioc->event_type, karg.event_types, ++ MPI2_EVENT_NOTIFY_EVENTMASK_WORDS * sizeof(u32)); ++ mpt2sas_base_validate_event_type(ioc, ioc->event_type); ++ ++ /* initialize event_log */ ++ ioc->event_context = 0; ++ ioc->aen_event_read_flag = 0; ++ ioc->event_log = kcalloc(MPT2SAS_CTL_EVENT_LOG_SIZE, ++ sizeof(struct MPT2_IOCTL_EVENTS), GFP_KERNEL); ++ if (!ioc->event_log) { ++ printk(KERN_ERR "failure at %s:%d/%s()!\n", ++ __FILE__, __LINE__, __func__); ++ return -ENOMEM; ++ } ++ return 0; ++} ++ ++/** ++ * _ctl_eventreport - main handler for MPT2EVENTREPORT opcode ++ * @arg - user space buffer containing ioctl content ++ */ ++static long ++_ctl_eventreport(void __user *arg) ++{ ++ struct mpt2_ioctl_eventreport karg; ++ struct MPT2SAS_ADAPTER *ioc; ++ u32 number_bytes, max_events, max; ++ struct mpt2_ioctl_eventreport __user *uarg = arg; ++ ++ if (copy_from_user(&karg, arg, sizeof(karg))) { ++ printk(KERN_ERR "failure at %s:%d/%s()!\n", ++ __FILE__, __LINE__, __func__); ++ return -EFAULT; ++ } ++ if (_ctl_verify_adapter(karg.hdr.ioc_number, &ioc) == -1 || !ioc) ++ return -ENODEV; ++ ++ dctlprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: enter\n", ioc->name, ++ __func__)); ++ ++ number_bytes = karg.hdr.max_data_size - ++ sizeof(struct mpt2_ioctl_header); ++ max_events = number_bytes/sizeof(struct MPT2_IOCTL_EVENTS); ++ max = min_t(u32, MPT2SAS_CTL_EVENT_LOG_SIZE, max_events); ++ ++ /* If fewer than 1 event is requested, there must have ++ * been some type of error. ++ */ ++ if (!max || !ioc->event_log) ++ return -ENODATA; ++ ++ number_bytes = max * sizeof(struct MPT2_IOCTL_EVENTS); ++ if (copy_to_user(uarg->event_data, ioc->event_log, number_bytes)) { ++ printk(KERN_ERR "failure at %s:%d/%s()!\n", ++ __FILE__, __LINE__, __func__); ++ return -EFAULT; ++ } ++ ++ /* reset flag so SIGIO can restart */ ++ ioc->aen_event_read_flag = 0; ++ return 0; ++} ++ ++/** ++ * _ctl_do_reset - main handler for MPT2HARDRESET opcode ++ * @arg - user space buffer containing ioctl content ++ */ ++static long ++_ctl_do_reset(void __user *arg) ++{ ++ struct mpt2_ioctl_diag_reset karg; ++ struct MPT2SAS_ADAPTER *ioc; ++ int retval; ++ ++ if (copy_from_user(&karg, arg, sizeof(karg))) { ++ printk(KERN_ERR "failure at %s:%d/%s()!\n", ++ __FILE__, __LINE__, __func__); ++ return -EFAULT; ++ } ++ if (_ctl_verify_adapter(karg.hdr.ioc_number, &ioc) == -1 || !ioc) ++ return -ENODEV; ++ ++ dctlprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: enter\n", ioc->name, ++ __func__)); ++ ++ retval = mpt2sas_base_hard_reset_handler(ioc, CAN_SLEEP, ++ FORCE_BIG_HAMMER); ++ printk(MPT2SAS_INFO_FMT "host reset: %s\n", ++ ioc->name, ((!retval) ? "SUCCESS" : "FAILED")); ++ return 0; ++} ++ ++/** ++ * _ctl_btdh_search_sas_device - searching for sas device ++ * @ioc: per adapter object ++ * @btdh: btdh ioctl payload ++ */ ++static int ++_ctl_btdh_search_sas_device(struct MPT2SAS_ADAPTER *ioc, ++ struct mpt2_ioctl_btdh_mapping *btdh) ++{ ++ struct _sas_device *sas_device; ++ unsigned long flags; ++ int rc = 0; ++ ++ if (list_empty(&ioc->sas_device_list)) ++ return rc; ++ ++ spin_lock_irqsave(&ioc->sas_device_lock, flags); ++ list_for_each_entry(sas_device, &ioc->sas_device_list, list) { ++ if (btdh->bus == 0xFFFFFFFF && btdh->id == 0xFFFFFFFF && ++ btdh->handle == sas_device->handle) { ++ btdh->bus = sas_device->channel; ++ btdh->id = sas_device->id; ++ rc = 1; ++ goto out; ++ } else if (btdh->bus == sas_device->channel && btdh->id == ++ sas_device->id && btdh->handle == 0xFFFF) { ++ btdh->handle = sas_device->handle; ++ rc = 1; ++ goto out; ++ } ++ } ++ out: ++ spin_unlock_irqrestore(&ioc->sas_device_lock, flags); ++ return rc; ++} ++ ++/** ++ * _ctl_btdh_search_raid_device - searching for raid device ++ * @ioc: per adapter object ++ * @btdh: btdh ioctl payload ++ */ ++static int ++_ctl_btdh_search_raid_device(struct MPT2SAS_ADAPTER *ioc, ++ struct mpt2_ioctl_btdh_mapping *btdh) ++{ ++ struct _raid_device *raid_device; ++ unsigned long flags; ++ int rc = 0; ++ ++ if (list_empty(&ioc->raid_device_list)) ++ return rc; ++ ++ spin_lock_irqsave(&ioc->raid_device_lock, flags); ++ list_for_each_entry(raid_device, &ioc->raid_device_list, list) { ++ if (btdh->bus == 0xFFFFFFFF && btdh->id == 0xFFFFFFFF && ++ btdh->handle == raid_device->handle) { ++ btdh->bus = raid_device->channel; ++ btdh->id = raid_device->id; ++ rc = 1; ++ goto out; ++ } else if (btdh->bus == raid_device->channel && btdh->id == ++ raid_device->id && btdh->handle == 0xFFFF) { ++ btdh->handle = raid_device->handle; ++ rc = 1; ++ goto out; ++ } ++ } ++ out: ++ spin_unlock_irqrestore(&ioc->raid_device_lock, flags); ++ return rc; ++} ++ ++/** ++ * _ctl_btdh_mapping - main handler for MPT2BTDHMAPPING opcode ++ * @arg - user space buffer containing ioctl content ++ */ ++static long ++_ctl_btdh_mapping(void __user *arg) ++{ ++ struct mpt2_ioctl_btdh_mapping karg; ++ struct MPT2SAS_ADAPTER *ioc; ++ int rc; ++ ++ if (copy_from_user(&karg, arg, sizeof(karg))) { ++ printk(KERN_ERR "failure at %s:%d/%s()!\n", ++ __FILE__, __LINE__, __func__); ++ return -EFAULT; ++ } ++ if (_ctl_verify_adapter(karg.hdr.ioc_number, &ioc) == -1 || !ioc) ++ return -ENODEV; ++ ++ dctlprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s\n", ioc->name, ++ __func__)); ++ ++ rc = _ctl_btdh_search_sas_device(ioc, &karg); ++ if (!rc) ++ _ctl_btdh_search_raid_device(ioc, &karg); ++ ++ if (copy_to_user(arg, &karg, sizeof(karg))) { ++ printk(KERN_ERR "failure at %s:%d/%s()!\n", ++ __FILE__, __LINE__, __func__); ++ return -EFAULT; ++ } ++ return 0; ++} ++ ++/** ++ * _ctl_diag_capability - return diag buffer capability ++ * @ioc: per adapter object ++ * @buffer_type: specifies either TRACE or SNAPSHOT ++ * ++ * returns 1 when diag buffer support is enabled in firmware ++ */ ++static u8 ++_ctl_diag_capability(struct MPT2SAS_ADAPTER *ioc, u8 buffer_type) ++{ ++ u8 rc = 0; ++ ++ switch (buffer_type) { ++ case MPI2_DIAG_BUF_TYPE_TRACE: ++ if (ioc->facts.IOCCapabilities & ++ MPI2_IOCFACTS_CAPABILITY_DIAG_TRACE_BUFFER) ++ rc = 1; ++ break; ++ case MPI2_DIAG_BUF_TYPE_SNAPSHOT: ++ if (ioc->facts.IOCCapabilities & ++ MPI2_IOCFACTS_CAPABILITY_SNAPSHOT_BUFFER) ++ rc = 1; ++ break; ++ } ++ ++ return rc; ++} ++ ++/** ++ * _ctl_diag_register - application register with driver ++ * @arg - user space buffer containing ioctl content ++ * @state - NON_BLOCKING or BLOCKING ++ * ++ * This will allow the driver to setup any required buffers that will be ++ * needed by firmware to communicate with the driver. ++ */ ++static long ++_ctl_diag_register(void __user *arg, enum block_state state) ++{ ++ struct mpt2_diag_register karg; ++ struct MPT2SAS_ADAPTER *ioc; ++ int rc, i; ++ void *request_data = NULL; ++ dma_addr_t request_data_dma; ++ u32 request_data_sz = 0; ++ Mpi2DiagBufferPostRequest_t *mpi_request; ++ Mpi2DiagBufferPostReply_t *mpi_reply; ++ u8 buffer_type; ++ unsigned long timeleft; ++ u16 smid; ++ u16 ioc_status; ++ u8 issue_reset = 0; ++ ++ if (copy_from_user(&karg, arg, sizeof(karg))) { ++ printk(KERN_ERR "failure at %s:%d/%s()!\n", ++ __FILE__, __LINE__, __func__); ++ return -EFAULT; ++ } ++ if (_ctl_verify_adapter(karg.hdr.ioc_number, &ioc) == -1 || !ioc) ++ return -ENODEV; ++ ++ dctlprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s\n", ioc->name, ++ __func__)); ++ ++ buffer_type = karg.buffer_type; ++ if (!_ctl_diag_capability(ioc, buffer_type)) { ++ printk(MPT2SAS_ERR_FMT "%s: doesn't have capability for " ++ "buffer_type(0x%02x)\n", ioc->name, __func__, buffer_type); ++ return -EPERM; ++ } ++ ++ if (ioc->diag_buffer_status[buffer_type] & ++ MPT2_DIAG_BUFFER_IS_REGISTERED) { ++ printk(MPT2SAS_ERR_FMT "%s: already has a registered " ++ "buffer for buffer_type(0x%02x)\n", ioc->name, __func__, ++ buffer_type); ++ return -EINVAL; ++ } ++ ++ if (karg.requested_buffer_size % 4) { ++ printk(MPT2SAS_ERR_FMT "%s: the requested_buffer_size " ++ "is not 4 byte aligned\n", ioc->name, __func__); ++ return -EINVAL; ++ } ++ ++ if (state == NON_BLOCKING && !mutex_trylock(&ioc->ctl_cmds.mutex)) ++ return -EAGAIN; ++ else if (mutex_lock_interruptible(&ioc->ctl_cmds.mutex)) ++ return -ERESTARTSYS; ++ ++ if (ioc->ctl_cmds.status != MPT2_CMD_NOT_USED) { ++ printk(MPT2SAS_ERR_FMT "%s: ctl_cmd in use\n", ++ ioc->name, __func__); ++ rc = -EAGAIN; ++ goto out; ++ } ++ ++ smid = mpt2sas_base_get_smid(ioc, ioc->ctl_cb_idx); ++ if (!smid) { ++ printk(MPT2SAS_ERR_FMT "%s: failed obtaining a smid\n", ++ ioc->name, __func__); ++ rc = -EAGAIN; ++ goto out; ++ } ++ ++ rc = 0; ++ ioc->ctl_cmds.status = MPT2_CMD_PENDING; ++ memset(ioc->ctl_cmds.reply, 0, ioc->reply_sz); ++ mpi_request = mpt2sas_base_get_msg_frame(ioc, smid); ++ ioc->ctl_cmds.smid = smid; ++ ++ request_data = ioc->diag_buffer[buffer_type]; ++ request_data_sz = karg.requested_buffer_size; ++ ioc->unique_id[buffer_type] = karg.unique_id; ++ ioc->diag_buffer_status[buffer_type] = 0; ++ memcpy(ioc->product_specific[buffer_type], karg.product_specific, ++ MPT2_PRODUCT_SPECIFIC_DWORDS); ++ ioc->diagnostic_flags[buffer_type] = karg.diagnostic_flags; ++ ++ if (request_data) { ++ request_data_dma = ioc->diag_buffer_dma[buffer_type]; ++ if (request_data_sz != ioc->diag_buffer_sz[buffer_type]) { ++ pci_free_consistent(ioc->pdev, ++ ioc->diag_buffer_sz[buffer_type], ++ request_data, request_data_dma); ++ request_data = NULL; ++ } ++ } ++ ++ if (request_data == NULL) { ++ ioc->diag_buffer_sz[buffer_type] = 0; ++ ioc->diag_buffer_dma[buffer_type] = 0; ++ request_data = pci_alloc_consistent( ++ ioc->pdev, request_data_sz, &request_data_dma); ++ if (request_data == NULL) { ++ printk(MPT2SAS_ERR_FMT "%s: failed allocating memory" ++ " for diag buffers, requested size(%d)\n", ++ ioc->name, __func__, request_data_sz); ++ mpt2sas_base_free_smid(ioc, smid); ++ return -ENOMEM; ++ } ++ ioc->diag_buffer[buffer_type] = request_data; ++ ioc->diag_buffer_sz[buffer_type] = request_data_sz; ++ ioc->diag_buffer_dma[buffer_type] = request_data_dma; ++ } ++ ++ mpi_request->Function = MPI2_FUNCTION_DIAG_BUFFER_POST; ++ mpi_request->BufferType = karg.buffer_type; ++ mpi_request->Flags = cpu_to_le32(karg.diagnostic_flags); ++ mpi_request->BufferAddress = cpu_to_le64(request_data_dma); ++ mpi_request->BufferLength = cpu_to_le32(request_data_sz); ++ ++ dctlprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: diag_buffer(0x%p), " ++ "dma(0x%llx), sz(%d)\n", ioc->name, __func__, request_data, ++ (unsigned long long)request_data_dma, mpi_request->BufferLength)); ++ ++ for (i = 0; i < MPT2_PRODUCT_SPECIFIC_DWORDS; i++) ++ mpi_request->ProductSpecific[i] = ++ cpu_to_le32(ioc->product_specific[buffer_type][i]); ++ ++ mpt2sas_base_put_smid_default(ioc, smid, mpi_request->VF_ID); ++ timeleft = wait_for_completion_timeout(&ioc->ctl_cmds.done, ++ MPT2_IOCTL_DEFAULT_TIMEOUT*HZ); ++ ++ if (!(ioc->ctl_cmds.status & MPT2_CMD_COMPLETE)) { ++ printk(MPT2SAS_ERR_FMT "%s: timeout\n", ioc->name, ++ __func__); ++ _debug_dump_mf(mpi_request, ++ sizeof(Mpi2DiagBufferPostRequest_t)/4); ++ if (!(ioc->ctl_cmds.status & MPT2_CMD_RESET)) ++ issue_reset = 1; ++ goto issue_host_reset; ++ } ++ ++ /* process the completed Reply Message Frame */ ++ if ((ioc->ctl_cmds.status & MPT2_CMD_REPLY_VALID) == 0) { ++ printk(MPT2SAS_ERR_FMT "%s: no reply message\n", ++ ioc->name, __func__); ++ rc = -EFAULT; ++ goto out; ++ } ++ ++ mpi_reply = ioc->ctl_cmds.reply; ++ ioc_status = le16_to_cpu(mpi_reply->IOCStatus) & MPI2_IOCSTATUS_MASK; ++ ++ if (ioc_status == MPI2_IOCSTATUS_SUCCESS) { ++ ioc->diag_buffer_status[buffer_type] |= ++ MPT2_DIAG_BUFFER_IS_REGISTERED; ++ dctlprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: success\n", ++ ioc->name, __func__)); ++ } else { ++ printk(MPT2SAS_DEBUG_FMT "%s: ioc_status(0x%04x) " ++ "log_info(0x%08x)\n", ioc->name, __func__, ++ ioc_status, mpi_reply->IOCLogInfo); ++ rc = -EFAULT; ++ } ++ ++ issue_host_reset: ++ if (issue_reset) ++ mpt2sas_base_hard_reset_handler(ioc, CAN_SLEEP, ++ FORCE_BIG_HAMMER); ++ ++ out: ++ ++ if (rc && request_data) ++ pci_free_consistent(ioc->pdev, request_data_sz, ++ request_data, request_data_dma); ++ ++ ioc->ctl_cmds.status = MPT2_CMD_NOT_USED; ++ mutex_unlock(&ioc->ctl_cmds.mutex); ++ return rc; ++} ++ ++/** ++ * _ctl_diag_unregister - application unregister with driver ++ * @arg - user space buffer containing ioctl content ++ * ++ * This will allow the driver to cleanup any memory allocated for diag ++ * messages and to free up any resources. ++ */ ++static long ++_ctl_diag_unregister(void __user *arg) ++{ ++ struct mpt2_diag_unregister karg; ++ struct MPT2SAS_ADAPTER *ioc; ++ void *request_data; ++ dma_addr_t request_data_dma; ++ u32 request_data_sz; ++ u8 buffer_type; ++ ++ if (copy_from_user(&karg, arg, sizeof(karg))) { ++ printk(KERN_ERR "failure at %s:%d/%s()!\n", ++ __FILE__, __LINE__, __func__); ++ return -EFAULT; ++ } ++ if (_ctl_verify_adapter(karg.hdr.ioc_number, &ioc) == -1 || !ioc) ++ return -ENODEV; ++ ++ dctlprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s\n", ioc->name, ++ __func__)); ++ ++ buffer_type = karg.unique_id & 0x000000ff; ++ if (!_ctl_diag_capability(ioc, buffer_type)) { ++ printk(MPT2SAS_ERR_FMT "%s: doesn't have capability for " ++ "buffer_type(0x%02x)\n", ioc->name, __func__, buffer_type); ++ return -EPERM; ++ } ++ ++ if ((ioc->diag_buffer_status[buffer_type] & ++ MPT2_DIAG_BUFFER_IS_REGISTERED) == 0) { ++ printk(MPT2SAS_ERR_FMT "%s: buffer_type(0x%02x) is not " ++ "registered\n", ioc->name, __func__, buffer_type); ++ return -EINVAL; ++ } ++ if ((ioc->diag_buffer_status[buffer_type] & ++ MPT2_DIAG_BUFFER_IS_RELEASED) == 0) { ++ printk(MPT2SAS_ERR_FMT "%s: buffer_type(0x%02x) has not been " ++ "released\n", ioc->name, __func__, buffer_type); ++ return -EINVAL; ++ } ++ ++ if (karg.unique_id != ioc->unique_id[buffer_type]) { ++ printk(MPT2SAS_ERR_FMT "%s: unique_id(0x%08x) is not " ++ "registered\n", ioc->name, __func__, karg.unique_id); ++ return -EINVAL; ++ } ++ ++ request_data = ioc->diag_buffer[buffer_type]; ++ if (!request_data) { ++ printk(MPT2SAS_ERR_FMT "%s: doesn't have memory allocated for " ++ "buffer_type(0x%02x)\n", ioc->name, __func__, buffer_type); ++ return -ENOMEM; ++ } ++ ++ request_data_sz = ioc->diag_buffer_sz[buffer_type]; ++ request_data_dma = ioc->diag_buffer_dma[buffer_type]; ++ pci_free_consistent(ioc->pdev, request_data_sz, ++ request_data, request_data_dma); ++ ioc->diag_buffer[buffer_type] = NULL; ++ ioc->diag_buffer_status[buffer_type] = 0; ++ return 0; ++} ++ ++/** ++ * _ctl_diag_query - query relevant info associated with diag buffers ++ * @arg - user space buffer containing ioctl content ++ * ++ * The application will send only buffer_type and unique_id. Driver will ++ * inspect unique_id first, if valid, fill in all the info. If unique_id is ++ * 0x00, the driver will return info specified by Buffer Type. ++ */ ++static long ++_ctl_diag_query(void __user *arg) ++{ ++ struct mpt2_diag_query karg; ++ struct MPT2SAS_ADAPTER *ioc; ++ void *request_data; ++ int i; ++ u8 buffer_type; ++ ++ if (copy_from_user(&karg, arg, sizeof(karg))) { ++ printk(KERN_ERR "failure at %s:%d/%s()!\n", ++ __FILE__, __LINE__, __func__); ++ return -EFAULT; ++ } ++ if (_ctl_verify_adapter(karg.hdr.ioc_number, &ioc) == -1 || !ioc) ++ return -ENODEV; ++ ++ dctlprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s\n", ioc->name, ++ __func__)); ++ ++ karg.application_flags = 0; ++ buffer_type = karg.buffer_type; ++ ++ if (!_ctl_diag_capability(ioc, buffer_type)) { ++ printk(MPT2SAS_ERR_FMT "%s: doesn't have capability for " ++ "buffer_type(0x%02x)\n", ioc->name, __func__, buffer_type); ++ return -EPERM; ++ } ++ ++ if ((ioc->diag_buffer_status[buffer_type] & ++ MPT2_DIAG_BUFFER_IS_REGISTERED) == 0) { ++ printk(MPT2SAS_ERR_FMT "%s: buffer_type(0x%02x) is not " ++ "registered\n", ioc->name, __func__, buffer_type); ++ return -EINVAL; ++ } ++ ++ if (karg.unique_id & 0xffffff00) { ++ if (karg.unique_id != ioc->unique_id[buffer_type]) { ++ printk(MPT2SAS_ERR_FMT "%s: unique_id(0x%08x) is not " ++ "registered\n", ioc->name, __func__, ++ karg.unique_id); ++ return -EINVAL; ++ } ++ } ++ ++ request_data = ioc->diag_buffer[buffer_type]; ++ if (!request_data) { ++ printk(MPT2SAS_ERR_FMT "%s: doesn't have buffer for " ++ "buffer_type(0x%02x)\n", ioc->name, __func__, buffer_type); ++ return -ENOMEM; ++ } ++ ++ if (ioc->diag_buffer_status[buffer_type] & MPT2_DIAG_BUFFER_IS_RELEASED) ++ karg.application_flags = (MPT2_APP_FLAGS_APP_OWNED | ++ MPT2_APP_FLAGS_BUFFER_VALID); ++ else ++ karg.application_flags = (MPT2_APP_FLAGS_APP_OWNED | ++ MPT2_APP_FLAGS_BUFFER_VALID | ++ MPT2_APP_FLAGS_FW_BUFFER_ACCESS); ++ ++ for (i = 0; i < MPT2_PRODUCT_SPECIFIC_DWORDS; i++) ++ karg.product_specific[i] = ++ ioc->product_specific[buffer_type][i]; ++ ++ karg.total_buffer_size = ioc->diag_buffer_sz[buffer_type]; ++ karg.driver_added_buffer_size = 0; ++ karg.unique_id = ioc->unique_id[buffer_type]; ++ karg.diagnostic_flags = ioc->diagnostic_flags[buffer_type]; ++ ++ if (copy_to_user(arg, &karg, sizeof(struct mpt2_diag_query))) { ++ printk(MPT2SAS_ERR_FMT "%s: unable to write mpt2_diag_query " ++ "data @ %p\n", ioc->name, __func__, arg); ++ return -EFAULT; ++ } ++ return 0; ++} ++ ++/** ++ * _ctl_send_release - Diag Release Message ++ * @ioc: per adapter object ++ * @buffer_type - specifies either TRACE or SNAPSHOT ++ * @issue_reset - specifies whether host reset is required. ++ * ++ */ ++static int ++_ctl_send_release(struct MPT2SAS_ADAPTER *ioc, u8 buffer_type, u8 *issue_reset) ++{ ++ Mpi2DiagReleaseRequest_t *mpi_request; ++ Mpi2DiagReleaseReply_t *mpi_reply; ++ u16 smid; ++ u16 ioc_status; ++ u32 ioc_state; ++ int rc; ++ unsigned long timeleft; ++ ++ dctlprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s\n", ioc->name, ++ __func__)); ++ ++ rc = 0; ++ *issue_reset = 0; ++ ++ ioc_state = mpt2sas_base_get_iocstate(ioc, 1); ++ if (ioc_state != MPI2_IOC_STATE_OPERATIONAL) { ++ dctlprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: " ++ "skipping due to FAULT state\n", ioc->name, ++ __func__)); ++ rc = -EAGAIN; ++ goto out; ++ } ++ ++ if (ioc->ctl_cmds.status != MPT2_CMD_NOT_USED) { ++ printk(MPT2SAS_ERR_FMT "%s: ctl_cmd in use\n", ++ ioc->name, __func__); ++ rc = -EAGAIN; ++ goto out; ++ } ++ ++ smid = mpt2sas_base_get_smid(ioc, ioc->ctl_cb_idx); ++ if (!smid) { ++ printk(MPT2SAS_ERR_FMT "%s: failed obtaining a smid\n", ++ ioc->name, __func__); ++ rc = -EAGAIN; ++ goto out; ++ } ++ ++ ioc->ctl_cmds.status = MPT2_CMD_PENDING; ++ memset(ioc->ctl_cmds.reply, 0, ioc->reply_sz); ++ mpi_request = mpt2sas_base_get_msg_frame(ioc, smid); ++ ioc->ctl_cmds.smid = smid; ++ ++ mpi_request->Function = MPI2_FUNCTION_DIAG_RELEASE; ++ mpi_request->BufferType = buffer_type; ++ ++ mpt2sas_base_put_smid_default(ioc, smid, mpi_request->VF_ID); ++ timeleft = wait_for_completion_timeout(&ioc->ctl_cmds.done, ++ MPT2_IOCTL_DEFAULT_TIMEOUT*HZ); ++ ++ if (!(ioc->ctl_cmds.status & MPT2_CMD_COMPLETE)) { ++ printk(MPT2SAS_ERR_FMT "%s: timeout\n", ioc->name, ++ __func__); ++ _debug_dump_mf(mpi_request, ++ sizeof(Mpi2DiagReleaseRequest_t)/4); ++ if (!(ioc->ctl_cmds.status & MPT2_CMD_RESET)) ++ *issue_reset = 1; ++ rc = -EFAULT; ++ goto out; ++ } ++ ++ /* process the completed Reply Message Frame */ ++ if ((ioc->ctl_cmds.status & MPT2_CMD_REPLY_VALID) == 0) { ++ printk(MPT2SAS_ERR_FMT "%s: no reply message\n", ++ ioc->name, __func__); ++ rc = -EFAULT; ++ goto out; ++ } ++ ++ mpi_reply = ioc->ctl_cmds.reply; ++ ioc_status = le16_to_cpu(mpi_reply->IOCStatus) & MPI2_IOCSTATUS_MASK; ++ ++ if (ioc_status == MPI2_IOCSTATUS_SUCCESS) { ++ ioc->diag_buffer_status[buffer_type] |= ++ MPT2_DIAG_BUFFER_IS_RELEASED; ++ dctlprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: success\n", ++ ioc->name, __func__)); ++ } else { ++ printk(MPT2SAS_DEBUG_FMT "%s: ioc_status(0x%04x) " ++ "log_info(0x%08x)\n", ioc->name, __func__, ++ ioc_status, mpi_reply->IOCLogInfo); ++ rc = -EFAULT; ++ } ++ ++ out: ++ ioc->ctl_cmds.status = MPT2_CMD_NOT_USED; ++ return rc; ++} ++ ++/** ++ * _ctl_diag_release - request to send Diag Release Message to firmware ++ * @arg - user space buffer containing ioctl content ++ * @state - NON_BLOCKING or BLOCKING ++ * ++ * This allows ownership of the specified buffer to returned to the driver, ++ * allowing an application to read the buffer without fear that firmware is ++ * overwritting information in the buffer. ++ */ ++static long ++_ctl_diag_release(void __user *arg, enum block_state state) ++{ ++ struct mpt2_diag_release karg; ++ struct MPT2SAS_ADAPTER *ioc; ++ void *request_data; ++ int rc; ++ u8 buffer_type; ++ u8 issue_reset = 0; ++ ++ if (copy_from_user(&karg, arg, sizeof(karg))) { ++ printk(KERN_ERR "failure at %s:%d/%s()!\n", ++ __FILE__, __LINE__, __func__); ++ return -EFAULT; ++ } ++ if (_ctl_verify_adapter(karg.hdr.ioc_number, &ioc) == -1 || !ioc) ++ return -ENODEV; ++ ++ dctlprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s\n", ioc->name, ++ __func__)); ++ ++ buffer_type = karg.unique_id & 0x000000ff; ++ if (!_ctl_diag_capability(ioc, buffer_type)) { ++ printk(MPT2SAS_ERR_FMT "%s: doesn't have capability for " ++ "buffer_type(0x%02x)\n", ioc->name, __func__, buffer_type); ++ return -EPERM; ++ } ++ ++ if ((ioc->diag_buffer_status[buffer_type] & ++ MPT2_DIAG_BUFFER_IS_REGISTERED) == 0) { ++ printk(MPT2SAS_ERR_FMT "%s: buffer_type(0x%02x) is not " ++ "registered\n", ioc->name, __func__, buffer_type); ++ return -EINVAL; ++ } ++ ++ if (karg.unique_id != ioc->unique_id[buffer_type]) { ++ printk(MPT2SAS_ERR_FMT "%s: unique_id(0x%08x) is not " ++ "registered\n", ioc->name, __func__, karg.unique_id); ++ return -EINVAL; ++ } ++ ++ if (ioc->diag_buffer_status[buffer_type] & ++ MPT2_DIAG_BUFFER_IS_RELEASED) { ++ printk(MPT2SAS_ERR_FMT "%s: buffer_type(0x%02x) " ++ "is already released\n", ioc->name, __func__, ++ buffer_type); ++ return 0; ++ } ++ ++ request_data = ioc->diag_buffer[buffer_type]; ++ ++ if (!request_data) { ++ printk(MPT2SAS_ERR_FMT "%s: doesn't have memory allocated for " ++ "buffer_type(0x%02x)\n", ioc->name, __func__, buffer_type); ++ return -ENOMEM; ++ } ++ ++ /* buffers were released by due to host reset */ ++ if ((ioc->diag_buffer_status[buffer_type] & ++ MPT2_DIAG_BUFFER_IS_DIAG_RESET)) { ++ ioc->diag_buffer_status[buffer_type] |= ++ MPT2_DIAG_BUFFER_IS_RELEASED; ++ ioc->diag_buffer_status[buffer_type] &= ++ ~MPT2_DIAG_BUFFER_IS_DIAG_RESET; ++ printk(MPT2SAS_ERR_FMT "%s: buffer_type(0x%02x) " ++ "was released due to host reset\n", ioc->name, __func__, ++ buffer_type); ++ return 0; ++ } ++ ++ if (state == NON_BLOCKING && !mutex_trylock(&ioc->ctl_cmds.mutex)) ++ return -EAGAIN; ++ else if (mutex_lock_interruptible(&ioc->ctl_cmds.mutex)) ++ return -ERESTARTSYS; ++ ++ rc = _ctl_send_release(ioc, buffer_type, &issue_reset); ++ ++ if (issue_reset) ++ mpt2sas_base_hard_reset_handler(ioc, CAN_SLEEP, ++ FORCE_BIG_HAMMER); ++ ++ mutex_unlock(&ioc->ctl_cmds.mutex); ++ return rc; ++} ++ ++/** ++ * _ctl_diag_read_buffer - request for copy of the diag buffer ++ * @arg - user space buffer containing ioctl content ++ * @state - NON_BLOCKING or BLOCKING ++ */ ++static long ++_ctl_diag_read_buffer(void __user *arg, enum block_state state) ++{ ++ struct mpt2_diag_read_buffer karg; ++ struct mpt2_diag_read_buffer __user *uarg = arg; ++ struct MPT2SAS_ADAPTER *ioc; ++ void *request_data, *diag_data; ++ Mpi2DiagBufferPostRequest_t *mpi_request; ++ Mpi2DiagBufferPostReply_t *mpi_reply; ++ int rc, i; ++ u8 buffer_type; ++ unsigned long timeleft; ++ u16 smid; ++ u16 ioc_status; ++ u8 issue_reset = 0; ++ ++ if (copy_from_user(&karg, arg, sizeof(karg))) { ++ printk(KERN_ERR "failure at %s:%d/%s()!\n", ++ __FILE__, __LINE__, __func__); ++ return -EFAULT; ++ } ++ if (_ctl_verify_adapter(karg.hdr.ioc_number, &ioc) == -1 || !ioc) ++ return -ENODEV; ++ ++ dctlprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s\n", ioc->name, ++ __func__)); ++ ++ buffer_type = karg.unique_id & 0x000000ff; ++ if (!_ctl_diag_capability(ioc, buffer_type)) { ++ printk(MPT2SAS_ERR_FMT "%s: doesn't have capability for " ++ "buffer_type(0x%02x)\n", ioc->name, __func__, buffer_type); ++ return -EPERM; ++ } ++ ++ if (karg.unique_id != ioc->unique_id[buffer_type]) { ++ printk(MPT2SAS_ERR_FMT "%s: unique_id(0x%08x) is not " ++ "registered\n", ioc->name, __func__, karg.unique_id); ++ return -EINVAL; ++ } ++ ++ request_data = ioc->diag_buffer[buffer_type]; ++ if (!request_data) { ++ printk(MPT2SAS_ERR_FMT "%s: doesn't have buffer for " ++ "buffer_type(0x%02x)\n", ioc->name, __func__, buffer_type); ++ return -ENOMEM; ++ } ++ ++ if ((karg.starting_offset % 4) || (karg.bytes_to_read % 4)) { ++ printk(MPT2SAS_ERR_FMT "%s: either the starting_offset " ++ "or bytes_to_read are not 4 byte aligned\n", ioc->name, ++ __func__); ++ return -EINVAL; ++ } ++ ++ diag_data = (void *)(request_data + karg.starting_offset); ++ dctlprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: diag_buffer(%p), " ++ "offset(%d), sz(%d)\n", ioc->name, __func__, ++ diag_data, karg.starting_offset, karg.bytes_to_read)); ++ ++ if (copy_to_user((void __user *)uarg->diagnostic_data, ++ diag_data, karg.bytes_to_read)) { ++ printk(MPT2SAS_ERR_FMT "%s: Unable to write " ++ "mpt_diag_read_buffer_t data @ %p\n", ioc->name, ++ __func__, diag_data); ++ return -EFAULT; ++ } ++ ++ if ((karg.flags & MPT2_FLAGS_REREGISTER) == 0) ++ return 0; ++ ++ dctlprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: Reregister " ++ "buffer_type(0x%02x)\n", ioc->name, __func__, buffer_type)); ++ if ((ioc->diag_buffer_status[buffer_type] & ++ MPT2_DIAG_BUFFER_IS_RELEASED) == 0) { ++ dctlprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: " ++ "buffer_type(0x%02x) is still registered\n", ioc->name, ++ __func__, buffer_type)); ++ return 0; ++ } ++ /* Get a free request frame and save the message context. ++ */ ++ if (state == NON_BLOCKING && !mutex_trylock(&ioc->ctl_cmds.mutex)) ++ return -EAGAIN; ++ else if (mutex_lock_interruptible(&ioc->ctl_cmds.mutex)) ++ return -ERESTARTSYS; ++ ++ if (ioc->ctl_cmds.status != MPT2_CMD_NOT_USED) { ++ printk(MPT2SAS_ERR_FMT "%s: ctl_cmd in use\n", ++ ioc->name, __func__); ++ rc = -EAGAIN; ++ goto out; ++ } ++ ++ smid = mpt2sas_base_get_smid(ioc, ioc->ctl_cb_idx); ++ if (!smid) { ++ printk(MPT2SAS_ERR_FMT "%s: failed obtaining a smid\n", ++ ioc->name, __func__); ++ rc = -EAGAIN; ++ goto out; ++ } ++ ++ rc = 0; ++ ioc->ctl_cmds.status = MPT2_CMD_PENDING; ++ memset(ioc->ctl_cmds.reply, 0, ioc->reply_sz); ++ mpi_request = mpt2sas_base_get_msg_frame(ioc, smid); ++ ioc->ctl_cmds.smid = smid; ++ ++ mpi_request->Function = MPI2_FUNCTION_DIAG_BUFFER_POST; ++ mpi_request->BufferType = buffer_type; ++ mpi_request->BufferLength = ++ cpu_to_le32(ioc->diag_buffer_sz[buffer_type]); ++ mpi_request->BufferAddress = ++ cpu_to_le64(ioc->diag_buffer_dma[buffer_type]); ++ for (i = 0; i < MPT2_PRODUCT_SPECIFIC_DWORDS; i++) ++ mpi_request->ProductSpecific[i] = ++ cpu_to_le32(ioc->product_specific[buffer_type][i]); ++ ++ mpt2sas_base_put_smid_default(ioc, smid, mpi_request->VF_ID); ++ timeleft = wait_for_completion_timeout(&ioc->ctl_cmds.done, ++ MPT2_IOCTL_DEFAULT_TIMEOUT*HZ); ++ ++ if (!(ioc->ctl_cmds.status & MPT2_CMD_COMPLETE)) { ++ printk(MPT2SAS_ERR_FMT "%s: timeout\n", ioc->name, ++ __func__); ++ _debug_dump_mf(mpi_request, ++ sizeof(Mpi2DiagBufferPostRequest_t)/4); ++ if (!(ioc->ctl_cmds.status & MPT2_CMD_RESET)) ++ issue_reset = 1; ++ goto issue_host_reset; ++ } ++ ++ /* process the completed Reply Message Frame */ ++ if ((ioc->ctl_cmds.status & MPT2_CMD_REPLY_VALID) == 0) { ++ printk(MPT2SAS_ERR_FMT "%s: no reply message\n", ++ ioc->name, __func__); ++ rc = -EFAULT; ++ goto out; ++ } ++ ++ mpi_reply = ioc->ctl_cmds.reply; ++ ioc_status = le16_to_cpu(mpi_reply->IOCStatus) & MPI2_IOCSTATUS_MASK; ++ ++ if (ioc_status == MPI2_IOCSTATUS_SUCCESS) { ++ ioc->diag_buffer_status[buffer_type] |= ++ MPT2_DIAG_BUFFER_IS_REGISTERED; ++ dctlprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: success\n", ++ ioc->name, __func__)); ++ } else { ++ printk(MPT2SAS_DEBUG_FMT "%s: ioc_status(0x%04x) " ++ "log_info(0x%08x)\n", ioc->name, __func__, ++ ioc_status, mpi_reply->IOCLogInfo); ++ rc = -EFAULT; ++ } ++ ++ issue_host_reset: ++ if (issue_reset) ++ mpt2sas_base_hard_reset_handler(ioc, CAN_SLEEP, ++ FORCE_BIG_HAMMER); ++ ++ out: ++ ++ ioc->ctl_cmds.status = MPT2_CMD_NOT_USED; ++ mutex_unlock(&ioc->ctl_cmds.mutex); ++ return rc; ++} ++ ++/** ++ * _ctl_ioctl_main - main ioctl entry point ++ * @file - (struct file) ++ * @cmd - ioctl opcode ++ * @arg - ++ */ ++static long ++_ctl_ioctl_main(struct file *file, unsigned int cmd, void __user *arg) ++{ ++ enum block_state state; ++ long ret = -EINVAL; ++ ++ state = (file->f_flags & O_NONBLOCK) ? NON_BLOCKING : ++ BLOCKING; ++ ++ switch (cmd) { ++ case MPT2IOCINFO: ++ if (_IOC_SIZE(cmd) == sizeof(struct mpt2_ioctl_iocinfo)) ++ ret = _ctl_getiocinfo(arg); ++ break; ++ case MPT2COMMAND: ++ { ++ struct mpt2_ioctl_command karg; ++ struct mpt2_ioctl_command __user *uarg; ++ struct MPT2SAS_ADAPTER *ioc; ++ ++ if (copy_from_user(&karg, arg, sizeof(karg))) { ++ printk(KERN_ERR "failure at %s:%d/%s()!\n", ++ __FILE__, __LINE__, __func__); ++ return -EFAULT; ++ } ++ ++ if (_ctl_verify_adapter(karg.hdr.ioc_number, &ioc) == -1 || ++ !ioc) ++ return -ENODEV; ++ ++ if (ioc->shost_recovery) ++ return -EAGAIN; ++ ++ if (_IOC_SIZE(cmd) == sizeof(struct mpt2_ioctl_command)) { ++ uarg = arg; ++ ret = _ctl_do_mpt_command(ioc, karg, &uarg->mf, state); ++ } ++ break; ++ } ++ case MPT2EVENTQUERY: ++ if (_IOC_SIZE(cmd) == sizeof(struct mpt2_ioctl_eventquery)) ++ ret = _ctl_eventquery(arg); ++ break; ++ case MPT2EVENTENABLE: ++ if (_IOC_SIZE(cmd) == sizeof(struct mpt2_ioctl_eventenable)) ++ ret = _ctl_eventenable(arg); ++ break; ++ case MPT2EVENTREPORT: ++ ret = _ctl_eventreport(arg); ++ break; ++ case MPT2HARDRESET: ++ if (_IOC_SIZE(cmd) == sizeof(struct mpt2_ioctl_diag_reset)) ++ ret = _ctl_do_reset(arg); ++ break; ++ case MPT2BTDHMAPPING: ++ if (_IOC_SIZE(cmd) == sizeof(struct mpt2_ioctl_btdh_mapping)) ++ ret = _ctl_btdh_mapping(arg); ++ break; ++ case MPT2DIAGREGISTER: ++ if (_IOC_SIZE(cmd) == sizeof(struct mpt2_diag_register)) ++ ret = _ctl_diag_register(arg, state); ++ break; ++ case MPT2DIAGUNREGISTER: ++ if (_IOC_SIZE(cmd) == sizeof(struct mpt2_diag_unregister)) ++ ret = _ctl_diag_unregister(arg); ++ break; ++ case MPT2DIAGQUERY: ++ if (_IOC_SIZE(cmd) == sizeof(struct mpt2_diag_query)) ++ ret = _ctl_diag_query(arg); ++ break; ++ case MPT2DIAGRELEASE: ++ if (_IOC_SIZE(cmd) == sizeof(struct mpt2_diag_release)) ++ ret = _ctl_diag_release(arg, state); ++ break; ++ case MPT2DIAGREADBUFFER: ++ if (_IOC_SIZE(cmd) == sizeof(struct mpt2_diag_read_buffer)) ++ ret = _ctl_diag_read_buffer(arg, state); ++ break; ++ default: ++ { ++ struct mpt2_ioctl_command karg; ++ struct MPT2SAS_ADAPTER *ioc; ++ ++ if (copy_from_user(&karg, arg, sizeof(karg))) { ++ printk(KERN_ERR "failure at %s:%d/%s()!\n", ++ __FILE__, __LINE__, __func__); ++ return -EFAULT; ++ } ++ ++ if (_ctl_verify_adapter(karg.hdr.ioc_number, &ioc) == -1 || ++ !ioc) ++ return -ENODEV; ++ ++ dctlprintk(ioc, printk(MPT2SAS_DEBUG_FMT ++ "unsupported ioctl opcode(0x%08x)\n", ioc->name, cmd)); ++ break; ++ } ++ } ++ return ret; ++} ++ ++/** ++ * _ctl_ioctl - main ioctl entry point (unlocked) ++ * @file - (struct file) ++ * @cmd - ioctl opcode ++ * @arg - ++ */ ++static long ++_ctl_ioctl(struct file *file, unsigned int cmd, unsigned long arg) ++{ ++ long ret; ++ lock_kernel(); ++ ret = _ctl_ioctl_main(file, cmd, (void __user *)arg); ++ unlock_kernel(); ++ return ret; ++} ++ ++#ifdef CONFIG_COMPAT ++/** ++ * _ctl_compat_mpt_command - convert 32bit pointers to 64bit. ++ * @file - (struct file) ++ * @cmd - ioctl opcode ++ * @arg - (struct mpt2_ioctl_command32) ++ * ++ * MPT2COMMAND32 - Handle 32bit applications running on 64bit os. ++ */ ++static long ++_ctl_compat_mpt_command(struct file *file, unsigned cmd, unsigned long arg) ++{ ++ struct mpt2_ioctl_command32 karg32; ++ struct mpt2_ioctl_command32 __user *uarg; ++ struct mpt2_ioctl_command karg; ++ struct MPT2SAS_ADAPTER *ioc; ++ enum block_state state; ++ ++ if (_IOC_SIZE(cmd) != sizeof(struct mpt2_ioctl_command32)) ++ return -EINVAL; ++ ++ uarg = (struct mpt2_ioctl_command32 __user *) arg; ++ ++ if (copy_from_user(&karg32, (char __user *)arg, sizeof(karg32))) { ++ printk(KERN_ERR "failure at %s:%d/%s()!\n", ++ __FILE__, __LINE__, __func__); ++ return -EFAULT; ++ } ++ if (_ctl_verify_adapter(karg32.hdr.ioc_number, &ioc) == -1 || !ioc) ++ return -ENODEV; ++ ++ if (ioc->shost_recovery) ++ return -EAGAIN; ++ ++ memset(&karg, 0, sizeof(struct mpt2_ioctl_command)); ++ karg.hdr.ioc_number = karg32.hdr.ioc_number; ++ karg.hdr.port_number = karg32.hdr.port_number; ++ karg.hdr.max_data_size = karg32.hdr.max_data_size; ++ karg.timeout = karg32.timeout; ++ karg.max_reply_bytes = karg32.max_reply_bytes; ++ karg.data_in_size = karg32.data_in_size; ++ karg.data_out_size = karg32.data_out_size; ++ karg.max_sense_bytes = karg32.max_sense_bytes; ++ karg.data_sge_offset = karg32.data_sge_offset; ++ memcpy(&karg.reply_frame_buf_ptr, &karg32.reply_frame_buf_ptr, ++ sizeof(uint32_t)); ++ memcpy(&karg.data_in_buf_ptr, &karg32.data_in_buf_ptr, ++ sizeof(uint32_t)); ++ memcpy(&karg.data_out_buf_ptr, &karg32.data_out_buf_ptr, ++ sizeof(uint32_t)); ++ memcpy(&karg.sense_data_ptr, &karg32.sense_data_ptr, ++ sizeof(uint32_t)); ++ state = (file->f_flags & O_NONBLOCK) ? NON_BLOCKING : BLOCKING; ++ return _ctl_do_mpt_command(ioc, karg, &uarg->mf, state); ++} ++ ++/** ++ * _ctl_ioctl_compat - main ioctl entry point (compat) ++ * @file - ++ * @cmd - ++ * @arg - ++ * ++ * This routine handles 32 bit applications in 64bit os. ++ */ ++static long ++_ctl_ioctl_compat(struct file *file, unsigned cmd, unsigned long arg) ++{ ++ long ret; ++ lock_kernel(); ++ if (cmd == MPT2COMMAND32) ++ ret = _ctl_compat_mpt_command(file, cmd, arg); ++ else ++ ret = _ctl_ioctl_main(file, cmd, (void __user *)arg); ++ unlock_kernel(); ++ return ret; ++} ++#endif ++ ++/* scsi host attributes */ ++ ++/** ++ * _ctl_version_fw_show - firmware version ++ * @cdev - pointer to embedded class device ++ * @buf - the buffer returned ++ * ++ * A sysfs 'read-only' shost attribute. ++ */ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,25)) ++static ssize_t ++_ctl_version_fw_show(struct device *cdev, struct device_attribute *attr, ++ char *buf) ++#else ++static ssize_t ++_ctl_version_fw_show(struct class_device *cdev, char *buf) ++#endif ++{ ++ struct Scsi_Host *shost = class_to_shost(cdev); ++ struct MPT2SAS_ADAPTER *ioc = shost_private(shost); ++ ++ return snprintf(buf, PAGE_SIZE, "%02d.%02d.%02d.%02d\n", ++ (ioc->facts.FWVersion.Word & 0xFF000000) >> 24, ++ (ioc->facts.FWVersion.Word & 0x00FF0000) >> 16, ++ (ioc->facts.FWVersion.Word & 0x0000FF00) >> 8, ++ ioc->facts.FWVersion.Word & 0x000000FF); ++} ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,25)) ++static DEVICE_ATTR(version_fw, S_IRUGO, _ctl_version_fw_show, NULL); ++#else ++static CLASS_DEVICE_ATTR(version_fw, S_IRUGO, _ctl_version_fw_show, NULL); ++#endif ++ ++/** ++ * _ctl_version_bios_show - bios version ++ * @cdev - pointer to embedded class device ++ * @buf - the buffer returned ++ * ++ * A sysfs 'read-only' shost attribute. ++ */ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,25)) ++static ssize_t ++_ctl_version_bios_show(struct device *cdev, struct device_attribute *attr, ++ char *buf) ++#else ++static ssize_t ++_ctl_version_bios_show(struct class_device *cdev, char *buf) ++#endif ++{ ++ struct Scsi_Host *shost = class_to_shost(cdev); ++ struct MPT2SAS_ADAPTER *ioc = shost_private(shost); ++ ++ u32 version = le32_to_cpu(ioc->bios_pg3.BiosVersion); ++ ++ return snprintf(buf, PAGE_SIZE, "%02d.%02d.%02d.%02d\n", ++ (version & 0xFF000000) >> 24, ++ (version & 0x00FF0000) >> 16, ++ (version & 0x0000FF00) >> 8, ++ version & 0x000000FF); ++} ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,25)) ++static DEVICE_ATTR(version_bios, S_IRUGO, _ctl_version_bios_show, NULL); ++#else ++static CLASS_DEVICE_ATTR(version_bios, S_IRUGO, _ctl_version_bios_show, NULL); ++#endif ++ ++/** ++ * _ctl_version_mpi_show - MPI (message passing interface) version ++ * @cdev - pointer to embedded class device ++ * @buf - the buffer returned ++ * ++ * A sysfs 'read-only' shost attribute. ++ */ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,25)) ++static ssize_t ++_ctl_version_mpi_show(struct device *cdev, struct device_attribute *attr, ++ char *buf) ++#else ++static ssize_t ++_ctl_version_mpi_show(struct class_device *cdev, char *buf) ++#endif ++{ ++ struct Scsi_Host *shost = class_to_shost(cdev); ++ struct MPT2SAS_ADAPTER *ioc = shost_private(shost); ++ ++ return snprintf(buf, PAGE_SIZE, "%03x.%02x\n", ++ ioc->facts.MsgVersion, ioc->facts.HeaderVersion >> 8); ++} ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,25)) ++static DEVICE_ATTR(version_mpi, S_IRUGO, _ctl_version_mpi_show, NULL); ++#else ++static CLASS_DEVICE_ATTR(version_mpi, S_IRUGO, _ctl_version_mpi_show, NULL); ++#endif ++ ++/** ++ * _ctl_version_product_show - product name ++ * @cdev - pointer to embedded class device ++ * @buf - the buffer returned ++ * ++ * A sysfs 'read-only' shost attribute. ++ */ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,25)) ++static ssize_t ++_ctl_version_product_show(struct device *cdev, struct device_attribute *attr, ++ char *buf) ++#else ++static ssize_t ++_ctl_version_product_show(struct class_device *cdev, char *buf) ++#endif ++{ ++ struct Scsi_Host *shost = class_to_shost(cdev); ++ struct MPT2SAS_ADAPTER *ioc = shost_private(shost); ++ ++ return snprintf(buf, 16, "%s\n", ioc->manu_pg0.ChipName); ++} ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,25)) ++static DEVICE_ATTR(version_product, S_IRUGO, ++ _ctl_version_product_show, NULL); ++#else ++static CLASS_DEVICE_ATTR(version_product, S_IRUGO, ++ _ctl_version_product_show, NULL); ++#endif ++ ++/** ++ * _ctl_version_nvdata_persistent_show - ndvata persistent version ++ * @cdev - pointer to embedded class device ++ * @buf - the buffer returned ++ * ++ * A sysfs 'read-only' shost attribute. ++ */ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,25)) ++static ssize_t ++_ctl_version_nvdata_persistent_show(struct device *cdev, ++ struct device_attribute *attr, char *buf) ++#else ++static ssize_t ++_ctl_version_nvdata_persistent_show(struct class_device *cdev, char *buf) ++#endif ++{ ++ struct Scsi_Host *shost = class_to_shost(cdev); ++ struct MPT2SAS_ADAPTER *ioc = shost_private(shost); ++ ++ return snprintf(buf, PAGE_SIZE, "%02xh\n", ++ le16_to_cpu(ioc->iounit_pg0.NvdataVersionPersistent.Word)); ++} ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,25)) ++static DEVICE_ATTR(version_nvdata_persistent, S_IRUGO, ++ _ctl_version_nvdata_persistent_show, NULL); ++#else ++static CLASS_DEVICE_ATTR(version_nvdata_persistent, S_IRUGO, ++ _ctl_version_nvdata_persistent_show, NULL); ++#endif ++ ++/** ++ * _ctl_version_nvdata_default_show - nvdata default version ++ * @cdev - pointer to embedded class device ++ * @buf - the buffer returned ++ * ++ * A sysfs 'read-only' shost attribute. ++ */ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,25)) ++static ssize_t ++_ctl_version_nvdata_default_show(struct device *cdev, struct device_attribute ++ *attr, char *buf) ++#else ++static ssize_t ++_ctl_version_nvdata_default_show(struct class_device *cdev, char *buf) ++#endif ++{ ++ struct Scsi_Host *shost = class_to_shost(cdev); ++ struct MPT2SAS_ADAPTER *ioc = shost_private(shost); ++ ++ return snprintf(buf, PAGE_SIZE, "%02xh\n", ++ le16_to_cpu(ioc->iounit_pg0.NvdataVersionDefault.Word)); ++} ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,25)) ++static DEVICE_ATTR(version_nvdata_default, S_IRUGO, ++ _ctl_version_nvdata_default_show, NULL); ++#else ++static CLASS_DEVICE_ATTR(version_nvdata_default, S_IRUGO, ++ _ctl_version_nvdata_default_show, NULL); ++#endif ++ ++/** ++ * _ctl_board_name_show - board name ++ * @cdev - pointer to embedded class device ++ * @buf - the buffer returned ++ * ++ * A sysfs 'read-only' shost attribute. ++ */ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,25)) ++static ssize_t ++_ctl_board_name_show(struct device *cdev, struct device_attribute *attr, ++ char *buf) ++#else ++static ssize_t ++_ctl_board_name_show(struct class_device *cdev, char *buf) ++#endif ++{ ++ struct Scsi_Host *shost = class_to_shost(cdev); ++ struct MPT2SAS_ADAPTER *ioc = shost_private(shost); ++ ++ return snprintf(buf, 16, "%s\n", ioc->manu_pg0.BoardName); ++} ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,25)) ++static DEVICE_ATTR(board_name, S_IRUGO, _ctl_board_name_show, NULL); ++#else ++static CLASS_DEVICE_ATTR(board_name, S_IRUGO, _ctl_board_name_show, NULL); ++#endif ++ ++/** ++ * _ctl_board_assembly_show - board assembly name ++ * @cdev - pointer to embedded class device ++ * @buf - the buffer returned ++ * ++ * A sysfs 'read-only' shost attribute. ++ */ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,25)) ++static ssize_t ++_ctl_board_assembly_show(struct device *cdev, struct device_attribute *attr, ++ char *buf) ++#else ++static ssize_t ++_ctl_board_assembly_show(struct class_device *cdev, char *buf) ++#endif ++{ ++ struct Scsi_Host *shost = class_to_shost(cdev); ++ struct MPT2SAS_ADAPTER *ioc = shost_private(shost); ++ ++ return snprintf(buf, 16, "%s\n", ioc->manu_pg0.BoardAssembly); ++} ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,25)) ++static DEVICE_ATTR(board_assembly, S_IRUGO, ++ _ctl_board_assembly_show, NULL); ++#else ++static CLASS_DEVICE_ATTR(board_assembly, S_IRUGO, ++ _ctl_board_assembly_show, NULL); ++#endif ++ ++/** ++ * _ctl_board_tracer_show - board tracer number ++ * @cdev - pointer to embedded class device ++ * @buf - the buffer returned ++ * ++ * A sysfs 'read-only' shost attribute. ++ */ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,25)) ++static ssize_t ++_ctl_board_tracer_show(struct device *cdev, struct device_attribute *attr, ++ char *buf) ++#else ++static ssize_t ++_ctl_board_tracer_show(struct class_device *cdev, char *buf) ++#endif ++{ ++ struct Scsi_Host *shost = class_to_shost(cdev); ++ struct MPT2SAS_ADAPTER *ioc = shost_private(shost); ++ ++ return snprintf(buf, 16, "%s\n", ioc->manu_pg0.BoardTracerNumber); ++} ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,25)) ++static DEVICE_ATTR(board_tracer, S_IRUGO, ++ _ctl_board_tracer_show, NULL); ++#else ++static CLASS_DEVICE_ATTR(board_tracer, S_IRUGO, ++ _ctl_board_tracer_show, NULL); ++#endif ++ ++/** ++ * _ctl_io_delay_show - io missing delay ++ * @cdev - pointer to embedded class device ++ * @buf - the buffer returned ++ * ++ * This is for firmware implemention for deboucing device ++ * removal events. ++ * ++ * A sysfs 'read-only' shost attribute. ++ */ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,25)) ++static ssize_t ++_ctl_io_delay_show(struct device *cdev, struct device_attribute *attr, ++ char *buf) ++#else ++static ssize_t ++_ctl_io_delay_show(struct class_device *cdev, char *buf) ++#endif ++{ ++ struct Scsi_Host *shost = class_to_shost(cdev); ++ struct MPT2SAS_ADAPTER *ioc = shost_private(shost); ++ ++ return snprintf(buf, PAGE_SIZE, "%02d\n", ioc->io_missing_delay); ++} ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,25)) ++static DEVICE_ATTR(io_delay, S_IRUGO, ++ _ctl_io_delay_show, NULL); ++#else ++static CLASS_DEVICE_ATTR(io_delay, S_IRUGO, ++ _ctl_io_delay_show, NULL); ++#endif ++ ++/** ++ * _ctl_device_delay_show - device missing delay ++ * @cdev - pointer to embedded class device ++ * @buf - the buffer returned ++ * ++ * This is for firmware implemention for deboucing device ++ * removal events. ++ * ++ * A sysfs 'read-only' shost attribute. ++ */ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,25)) ++static ssize_t ++_ctl_device_delay_show(struct device *cdev, struct device_attribute *attr, ++ char *buf) ++#else ++static ssize_t ++_ctl_device_delay_show(struct class_device *cdev, char *buf) ++#endif ++{ ++ struct Scsi_Host *shost = class_to_shost(cdev); ++ struct MPT2SAS_ADAPTER *ioc = shost_private(shost); ++ ++ return snprintf(buf, PAGE_SIZE, "%02d\n", ioc->device_missing_delay); ++} ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,25)) ++static DEVICE_ATTR(device_delay, S_IRUGO, ++ _ctl_device_delay_show, NULL); ++#else ++static CLASS_DEVICE_ATTR(device_delay, S_IRUGO, ++ _ctl_device_delay_show, NULL); ++#endif ++ ++/** ++ * _ctl_fw_queue_depth_show - global credits ++ * @cdev - pointer to embedded class device ++ * @buf - the buffer returned ++ * ++ * This is firmware queue depth limit ++ * ++ * A sysfs 'read-only' shost attribute. ++ */ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,25)) ++static ssize_t ++_ctl_fw_queue_depth_show(struct device *cdev, struct device_attribute *attr, ++ char *buf) ++#else ++static ssize_t ++_ctl_fw_queue_depth_show(struct class_device *cdev, char *buf) ++#endif ++{ ++ struct Scsi_Host *shost = class_to_shost(cdev); ++ struct MPT2SAS_ADAPTER *ioc = shost_private(shost); ++ ++ return snprintf(buf, PAGE_SIZE, "%02d\n", ioc->facts.RequestCredit); ++} ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,25)) ++static DEVICE_ATTR(fw_queue_depth, S_IRUGO, ++ _ctl_fw_queue_depth_show, NULL); ++#else ++static CLASS_DEVICE_ATTR(fw_queue_depth, S_IRUGO, ++ _ctl_fw_queue_depth_show, NULL); ++#endif ++ ++/** ++ * _ctl_sas_address_show - sas address ++ * @cdev - pointer to embedded class device ++ * @buf - the buffer returned ++ * ++ * This is the controller sas address ++ * ++ * A sysfs 'read-only' shost attribute. ++ */ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,25)) ++static ssize_t ++_ctl_host_sas_address_show(struct device *cdev, struct device_attribute *attr, ++ char *buf) ++#else ++static ssize_t ++_ctl_host_sas_address_show(struct class_device *cdev, char *buf) ++#endif ++{ ++ struct Scsi_Host *shost = class_to_shost(cdev); ++ struct MPT2SAS_ADAPTER *ioc = shost_private(shost); ++ ++ return snprintf(buf, PAGE_SIZE, "0x%016llx\n", ++ (unsigned long long)ioc->sas_hba.sas_address); ++} ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,25)) ++static DEVICE_ATTR(host_sas_address, S_IRUGO, ++ _ctl_host_sas_address_show, NULL); ++#else ++static CLASS_DEVICE_ATTR(host_sas_address, S_IRUGO, ++ _ctl_host_sas_address_show, NULL); ++#endif ++ ++/** ++ * _ctl_logging_level_show - logging level ++ * @cdev - pointer to embedded class device ++ * @buf - the buffer returned ++ * ++ * A sysfs 'read/write' shost attribute. ++ */ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,25)) ++static ssize_t ++_ctl_logging_level_show(struct device *cdev, struct device_attribute *attr, ++ char *buf) ++#else ++static ssize_t ++_ctl_logging_level_show(struct class_device *cdev, char *buf) ++#endif ++{ ++ struct Scsi_Host *shost = class_to_shost(cdev); ++ struct MPT2SAS_ADAPTER *ioc = shost_private(shost); ++ ++ return snprintf(buf, PAGE_SIZE, "%08xh\n", ioc->logging_level); ++} ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,25)) ++static ssize_t ++_ctl_logging_level_store(struct device *cdev, struct device_attribute *attr, ++ const char *buf, size_t count) ++#else ++static ssize_t ++_ctl_logging_level_store(struct class_device *cdev, const char *buf, ++ size_t count) ++#endif ++{ ++ struct Scsi_Host *shost = class_to_shost(cdev); ++ struct MPT2SAS_ADAPTER *ioc = shost_private(shost); ++ int val = 0; ++ ++ if (sscanf(buf, "%x", &val) != 1) ++ return -EINVAL; ++ ++ ioc->logging_level = val; ++ printk(MPT2SAS_INFO_FMT "logging_level=%08xh\n", ioc->name, ++ ioc->logging_level); ++ return strlen(buf); ++} ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,25)) ++static DEVICE_ATTR(logging_level, S_IRUGO | S_IWUSR, ++ _ctl_logging_level_show, _ctl_logging_level_store); ++#else ++static CLASS_DEVICE_ATTR(logging_level, S_IRUGO | S_IWUSR, ++ _ctl_logging_level_show, _ctl_logging_level_store); ++#endif ++ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,25)) ++struct device_attribute *mpt2sas_host_attrs[] = { ++ &dev_attr_version_fw, ++ &dev_attr_version_bios, ++ &dev_attr_version_mpi, ++ &dev_attr_version_product, ++ &dev_attr_version_nvdata_persistent, ++ &dev_attr_version_nvdata_default, ++ &dev_attr_board_name, ++ &dev_attr_board_assembly, ++ &dev_attr_board_tracer, ++ &dev_attr_io_delay, ++ &dev_attr_device_delay, ++ &dev_attr_logging_level, ++ &dev_attr_fw_queue_depth, ++ &dev_attr_host_sas_address, ++ NULL, ++}; ++#else ++struct class_device_attribute *mpt2sas_host_attrs[] = { ++ &class_device_attr_version_fw, ++ &class_device_attr_version_bios, ++ &class_device_attr_version_mpi, ++ &class_device_attr_version_product, ++ &class_device_attr_version_nvdata_persistent, ++ &class_device_attr_version_nvdata_default, ++ &class_device_attr_board_name, ++ &class_device_attr_board_assembly, ++ &class_device_attr_board_tracer, ++ &class_device_attr_io_delay, ++ &class_device_attr_device_delay, ++ &class_device_attr_logging_level, ++ &class_device_attr_fw_queue_depth, ++ &class_device_attr_host_sas_address, ++ NULL, ++}; ++#endif ++ ++/* device attributes */ ++ ++/** ++ * _ctl_device_sas_address_show - sas address ++ * @cdev - pointer to embedded class device ++ * @buf - the buffer returned ++ * ++ * This is the sas address for the target ++ * ++ * A sysfs 'read-only' shost attribute. ++ */ ++static ssize_t ++_ctl_device_sas_address_show(struct device *dev, struct device_attribute *attr, ++ char *buf) ++{ ++ struct scsi_device *sdev = to_scsi_device(dev); ++ struct MPT2SAS_DEVICE *sas_device_priv_data = sdev->hostdata; ++ ++ return snprintf(buf, PAGE_SIZE, "0x%016llx\n", ++ (unsigned long long)sas_device_priv_data->sas_target->sas_address); ++} ++static DEVICE_ATTR(sas_address, S_IRUGO, _ctl_device_sas_address_show, NULL); ++ ++/** ++ * _ctl_device_handle_show - device handle ++ * @cdev - pointer to embedded class device ++ * @buf - the buffer returned ++ * ++ * This is the firmware assigned device handle ++ * ++ * A sysfs 'read-only' shost attribute. ++ */ ++static ssize_t ++_ctl_device_handle_show(struct device *dev, struct device_attribute *attr, ++ char *buf) ++{ ++ struct scsi_device *sdev = to_scsi_device(dev); ++ struct MPT2SAS_DEVICE *sas_device_priv_data = sdev->hostdata; ++ ++ return snprintf(buf, PAGE_SIZE, "0x%04x\n", ++ sas_device_priv_data->sas_target->handle); ++} ++static DEVICE_ATTR(sas_device_handle, S_IRUGO, _ctl_device_handle_show, NULL); ++ ++struct device_attribute *mpt2sas_dev_attrs[] = { ++ &dev_attr_sas_address, ++ &dev_attr_sas_device_handle, ++ NULL, ++}; ++ ++static struct file_operations ctl_fops = { ++ .owner = THIS_MODULE, ++ .unlocked_ioctl = _ctl_ioctl, ++ .release = _ctl_release, ++ .poll = _ctl_poll, ++ .fasync = _ctl_fasync, ++#ifdef CONFIG_COMPAT ++ .compat_ioctl = _ctl_ioctl_compat, ++#endif ++}; ++ ++static struct miscdevice ctl_dev = { ++ .minor = MPT2SAS_MINOR, ++ .name = MPT2SAS_DEV_NAME, ++ .fops = &ctl_fops, ++}; ++ ++/** ++ * mpt2sas_ctl_init - main entry point for ctl. ++ * ++ */ ++void ++mpt2sas_ctl_init(void) ++{ ++ async_queue = NULL; ++ if (misc_register(&ctl_dev) < 0) ++ printk(KERN_ERR "%s can't register misc device [minor=%d]\n", ++ MPT2SAS_DRIVER_NAME, MPT2SAS_MINOR); ++ ++ init_waitqueue_head(&ctl_poll_wait); ++} ++ ++/** ++ * mpt2sas_ctl_exit - exit point for ctl ++ * ++ */ ++void ++mpt2sas_ctl_exit(void) ++{ ++ struct MPT2SAS_ADAPTER *ioc; ++ int i; ++ ++ list_for_each_entry(ioc, &mpt2sas_ioc_list, list) { ++ ++ /* free memory associated to diag buffers */ ++ for (i = 0; i < MPI2_DIAG_BUF_TYPE_COUNT; i++) { ++ if (!ioc->diag_buffer[i]) ++ continue; ++ pci_free_consistent(ioc->pdev, ioc->diag_buffer_sz[i], ++ ioc->diag_buffer[i], ioc->diag_buffer_dma[i]); ++ ioc->diag_buffer[i] = NULL; ++ ioc->diag_buffer_status[i] = 0; ++ } ++ ++ kfree(ioc->event_log); ++ } ++ misc_deregister(&ctl_dev); ++} ++ +diff -r e02b4006a7c8 drivers/scsi/mpt2sas/mpt2sas_ctl.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/scsi/mpt2sas/mpt2sas_ctl.h Wed Jul 01 09:49:59 2009 +0100 +@@ -0,0 +1,429 @@ ++/* ++ * Management Module Support for MPT (Message Passing Technology) based ++ * controllers ++ * ++ * This code is based on drivers/scsi/mpt2sas/mpt2_ctl.h ++ * Copyright (C) 2007-2008 LSI Corporation ++ * (mailto:DL-MPTFusionLinux@lsi.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. ++ * ++ * NO WARRANTY ++ * THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR ++ * CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT ++ * LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, ++ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is ++ * solely responsible for determining the appropriateness of using and ++ * distributing the Program and assumes all risks associated with its ++ * exercise of rights under this Agreement, including but not limited to ++ * the risks and costs of program errors, damage to or loss of data, ++ * programs or equipment, and unavailability or interruption of operations. ++ ++ * DISCLAIMER OF LIABILITY ++ * NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY ++ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ++ * DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), 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 OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED ++ * HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES ++ ++ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, ++ * USA. ++ */ ++ ++#ifndef MPT2SAS_CTL_H_INCLUDED ++#define MPT2SAS_CTL_H_INCLUDED ++ ++#ifdef __KERNEL__ ++#include ++#endif ++ ++/** ++ * NOTE ++ * FWDOWNLOAD - PR is let me know if we need to implement this ++ * DIAGBUFFER - PR said hold off ++ */ ++ ++/** ++ * HACK - changeme (MPT_MINOR = 220 ) ++ */ ++#ifndef MPT2SAS_MINOR ++#define MPT2SAS_MINOR (MPT_MINOR + 1) ++#endif ++#define MPT2SAS_DEV_NAME "mpt2ctl" ++#define MPT2_MAGIC_NUMBER 'L' ++#define MPT2_IOCTL_DEFAULT_TIMEOUT (10) /* in seconds */ ++ ++/** ++ * IOCTL opcodes ++ */ ++#define MPT2IOCINFO _IOWR(MPT2_MAGIC_NUMBER, 17, \ ++ struct mpt2_ioctl_iocinfo) ++#define MPT2COMMAND _IOWR(MPT2_MAGIC_NUMBER, 20, \ ++ struct mpt2_ioctl_command) ++#ifdef CONFIG_COMPAT ++#define MPT2COMMAND32 _IOWR(MPT2_MAGIC_NUMBER, 20, \ ++ struct mpt2_ioctl_command32) ++#endif ++#define MPT2EVENTQUERY _IOWR(MPT2_MAGIC_NUMBER, 21, \ ++ struct mpt2_ioctl_eventquery) ++#define MPT2EVENTENABLE _IOWR(MPT2_MAGIC_NUMBER, 22, \ ++ struct mpt2_ioctl_eventenable) ++#define MPT2EVENTREPORT _IOWR(MPT2_MAGIC_NUMBER, 23, \ ++ struct mpt2_ioctl_eventreport) ++#define MPT2HARDRESET _IOWR(MPT2_MAGIC_NUMBER, 24, \ ++ struct mpt2_ioctl_diag_reset) ++#define MPT2BTDHMAPPING _IOWR(MPT2_MAGIC_NUMBER, 31, \ ++ struct mpt2_ioctl_btdh_mapping) ++ ++/* diag buffer support */ ++#define MPT2DIAGREGISTER _IOWR(MPT2_MAGIC_NUMBER, 26, \ ++ struct mpt2_diag_register) ++#define MPT2DIAGRELEASE _IOWR(MPT2_MAGIC_NUMBER, 27, \ ++ struct mpt2_diag_release) ++#define MPT2DIAGUNREGISTER _IOWR(MPT2_MAGIC_NUMBER, 28, \ ++ struct mpt2_diag_unregister) ++#define MPT2DIAGQUERY _IOWR(MPT2_MAGIC_NUMBER, 29, \ ++ struct mpt2_diag_query) ++#define MPT2DIAGREADBUFFER _IOWR(MPT2_MAGIC_NUMBER, 30, \ ++ struct mpt2_diag_read_buffer) ++ ++/** ++ * struct mpt2_ioctl_header - main header structure ++ * @ioc_number - IOC unit number ++ * @port_number - IOC port number ++ * @max_data_size - maximum number bytes to transfer on read ++ */ ++struct mpt2_ioctl_header { ++ uint32_t ioc_number; ++ uint32_t port_number; ++ uint32_t max_data_size; ++}; ++ ++/** ++ * struct mpt2_ioctl_diag_reset - diagnostic reset ++ * @hdr - generic header ++ */ ++struct mpt2_ioctl_diag_reset { ++ struct mpt2_ioctl_header hdr; ++}; ++ ++ ++/** ++ * struct mpt2_ioctl_pci_info - pci device info ++ * @device - pci device id ++ * @function - pci function id ++ * @bus - pci bus id ++ * @segment_id - pci segment id ++ */ ++struct mpt2_ioctl_pci_info { ++ union { ++ struct { ++ uint32_t device:5; ++ uint32_t function:3; ++ uint32_t bus:24; ++ } bits; ++ uint32_t word; ++ } u; ++ uint32_t segment_id; ++}; ++ ++ ++#define MPT2_IOCTL_INTERFACE_SCSI (0x00) ++#define MPT2_IOCTL_INTERFACE_FC (0x01) ++#define MPT2_IOCTL_INTERFACE_FC_IP (0x02) ++#define MPT2_IOCTL_INTERFACE_SAS (0x03) ++#define MPT2_IOCTL_INTERFACE_SAS2 (0x04) ++#define MPT2_IOCTL_VERSION_LENGTH (32) ++ ++/** ++ * struct mpt2_ioctl_iocinfo - generic controller info ++ * @hdr - generic header ++ * @adapter_type - type of adapter (spi, fc, sas) ++ * @port_number - port number ++ * @pci_id - PCI Id ++ * @hw_rev - hardware revision ++ * @sub_system_device - PCI subsystem Device ID ++ * @sub_system_vendor - PCI subsystem Vendor ID ++ * @rsvd0 - reserved ++ * @firmware_version - firmware version ++ * @bios_version - BIOS version ++ * @driver_version - driver version - 32 ASCII characters ++ * @rsvd1 - reserved ++ * @scsi_id - scsi id of adapter 0 ++ * @rsvd2 - reserved ++ * @pci_information - pci info (2nd revision) ++ */ ++struct mpt2_ioctl_iocinfo { ++ struct mpt2_ioctl_header hdr; ++ uint32_t adapter_type; ++ uint32_t port_number; ++ uint32_t pci_id; ++ uint32_t hw_rev; ++ uint32_t subsystem_device; ++ uint32_t subsystem_vendor; ++ uint32_t rsvd0; ++ uint32_t firmware_version; ++ uint32_t bios_version; ++ uint8_t driver_version[MPT2_IOCTL_VERSION_LENGTH]; ++ uint8_t rsvd1; ++ uint8_t scsi_id; ++ uint16_t rsvd2; ++ struct mpt2_ioctl_pci_info pci_information; ++}; ++ ++ ++/* number of event log entries */ ++#define MPT2SAS_CTL_EVENT_LOG_SIZE (50) ++ ++/** ++ * struct mpt2_ioctl_eventquery - query event count and type ++ * @hdr - generic header ++ * @event_entries - number of events returned by get_event_report ++ * @rsvd - reserved ++ * @event_types - type of events currently being captured ++ */ ++struct mpt2_ioctl_eventquery { ++ struct mpt2_ioctl_header hdr; ++ uint16_t event_entries; ++ uint16_t rsvd; ++ uint32_t event_types[MPI2_EVENT_NOTIFY_EVENTMASK_WORDS]; ++}; ++ ++/** ++ * struct mpt2_ioctl_eventenable - enable/disable event capturing ++ * @hdr - generic header ++ * @event_types - toggle off/on type of events to be captured ++ */ ++struct mpt2_ioctl_eventenable { ++ struct mpt2_ioctl_header hdr; ++ uint32_t event_types[4]; ++}; ++ ++#define MPT2_EVENT_DATA_SIZE (192) ++/** ++ * struct MPT2_IOCTL_EVENTS - ++ * @event - the event that was reported ++ * @context - unique value for each event assigned by driver ++ * @data - event data returned in fw reply message ++ */ ++struct MPT2_IOCTL_EVENTS { ++ uint32_t event; ++ uint32_t context; ++ uint8_t data[MPT2_EVENT_DATA_SIZE]; ++}; ++ ++/** ++ * struct mpt2_ioctl_eventreport - returing event log ++ * @hdr - generic header ++ * @event_data - (see struct MPT2_IOCTL_EVENTS) ++ */ ++struct mpt2_ioctl_eventreport { ++ struct mpt2_ioctl_header hdr; ++ struct MPT2_IOCTL_EVENTS event_data[1]; ++}; ++ ++/** ++ * struct mpt2_ioctl_command - generic mpt firmware passthru ioclt ++ * @hdr - generic header ++ * @timeout - command timeout in seconds. (if zero then use driver default ++ * value). ++ * @reply_frame_buf_ptr - reply location ++ * @data_in_buf_ptr - destination for read ++ * @data_out_buf_ptr - data source for write ++ * @sense_data_ptr - sense data location ++ * @max_reply_bytes - maximum number of reply bytes to be sent to app. ++ * @data_in_size - number bytes for data transfer in (read) ++ * @data_out_size - number bytes for data transfer out (write) ++ * @max_sense_bytes - maximum number of bytes for auto sense buffers ++ * @data_sge_offset - offset in words from the start of the request message to ++ * the first SGL ++ * @mf[1]; ++ */ ++struct mpt2_ioctl_command { ++ struct mpt2_ioctl_header hdr; ++ uint32_t timeout; ++ void __user *reply_frame_buf_ptr; ++ void __user *data_in_buf_ptr; ++ void __user *data_out_buf_ptr; ++ void __user *sense_data_ptr; ++ uint32_t max_reply_bytes; ++ uint32_t data_in_size; ++ uint32_t data_out_size; ++ uint32_t max_sense_bytes; ++ uint32_t data_sge_offset; ++ uint8_t mf[1]; ++}; ++ ++#ifdef CONFIG_COMPAT ++struct mpt2_ioctl_command32 { ++ struct mpt2_ioctl_header hdr; ++ uint32_t timeout; ++ uint32_t reply_frame_buf_ptr; ++ uint32_t data_in_buf_ptr; ++ uint32_t data_out_buf_ptr; ++ uint32_t sense_data_ptr; ++ uint32_t max_reply_bytes; ++ uint32_t data_in_size; ++ uint32_t data_out_size; ++ uint32_t max_sense_bytes; ++ uint32_t data_sge_offset; ++ uint8_t mf[1]; ++}; ++#endif ++ ++/** ++ * struct mpt2_ioctl_btdh_mapping - mapping info ++ * @hdr - generic header ++ * @id - target device identification number ++ * @bus - SCSI bus number that the target device exists on ++ * @handle - device handle for the target device ++ * @rsvd - reserved ++ * ++ * To obtain a bus/id the application sets ++ * handle to valid handle, and bus/id to 0xFFFF. ++ * ++ * To obtain the device handle the application sets ++ * bus/id valid value, and the handle to 0xFFFF. ++ */ ++struct mpt2_ioctl_btdh_mapping { ++ struct mpt2_ioctl_header hdr; ++ uint32_t id; ++ uint32_t bus; ++ uint16_t handle; ++ uint16_t rsvd; ++}; ++ ++ ++/* status bits for ioc->diag_buffer_status */ ++#define MPT2_DIAG_BUFFER_IS_REGISTERED (0x01) ++#define MPT2_DIAG_BUFFER_IS_RELEASED (0x02) ++#define MPT2_DIAG_BUFFER_IS_DIAG_RESET (0x04) ++ ++/* application flags for mpt2_diag_register, mpt2_diag_query */ ++#define MPT2_APP_FLAGS_APP_OWNED (0x0001) ++#define MPT2_APP_FLAGS_BUFFER_VALID (0x0002) ++#define MPT2_APP_FLAGS_FW_BUFFER_ACCESS (0x0004) ++ ++/* flags for mpt2_diag_read_buffer */ ++#define MPT2_FLAGS_REREGISTER (0x0001) ++ ++#define MPT2_PRODUCT_SPECIFIC_DWORDS 23 ++ ++/** ++ * struct mpt2_diag_register - application register with driver ++ * @hdr - generic header ++ * @reserved - ++ * @buffer_type - specifies either TRACE or SNAPSHOT ++ * @application_flags - misc flags ++ * @diagnostic_flags - specifies flags affecting command processing ++ * @product_specific - product specific information ++ * @requested_buffer_size - buffers size in bytes ++ * @unique_id - tag specified by application that is used to signal ownership ++ * of the buffer. ++ * ++ * This will allow the driver to setup any required buffers that will be ++ * needed by firmware to communicate with the driver. ++ */ ++struct mpt2_diag_register { ++ struct mpt2_ioctl_header hdr; ++ uint8_t reserved; ++ uint8_t buffer_type; ++ uint16_t application_flags; ++ uint32_t diagnostic_flags; ++ uint32_t product_specific[MPT2_PRODUCT_SPECIFIC_DWORDS]; ++ uint32_t requested_buffer_size; ++ uint32_t unique_id; ++}; ++ ++/** ++ * struct mpt2_diag_unregister - application unregister with driver ++ * @hdr - generic header ++ * @unique_id - tag uniquely identifies the buffer to be unregistered ++ * ++ * This will allow the driver to cleanup any memory allocated for diag ++ * messages and to free up any resources. ++ */ ++struct mpt2_diag_unregister { ++ struct mpt2_ioctl_header hdr; ++ uint32_t unique_id; ++}; ++ ++/** ++ * struct mpt2_diag_query - query relevant info associated with diag buffers ++ * @hdr - generic header ++ * @reserved - ++ * @buffer_type - specifies either TRACE or SNAPSHOT ++ * @application_flags - misc flags ++ * @diagnostic_flags - specifies flags affecting command processing ++ * @product_specific - product specific information ++ * @total_buffer_size - diag buffer size in bytes ++ * @driver_added_buffer_size - size of extra space appended to end of buffer ++ * @unique_id - unique id associated with this buffer. ++ * ++ * The application will send only buffer_type and unique_id. Driver will ++ * inspect unique_id first, if valid, fill in all the info. If unique_id is ++ * 0x00, the driver will return info specified by Buffer Type. ++ */ ++struct mpt2_diag_query { ++ struct mpt2_ioctl_header hdr; ++ uint8_t reserved; ++ uint8_t buffer_type; ++ uint16_t application_flags; ++ uint32_t diagnostic_flags; ++ uint32_t product_specific[MPT2_PRODUCT_SPECIFIC_DWORDS]; ++ uint32_t total_buffer_size; ++ uint32_t driver_added_buffer_size; ++ uint32_t unique_id; ++}; ++ ++/** ++ * struct mpt2_diag_release - request to send Diag Release Message to firmware ++ * @hdr - generic header ++ * @unique_id - tag uniquely identifies the buffer to be released ++ * ++ * This allows ownership of the specified buffer to returned to the driver, ++ * allowing an application to read the buffer without fear that firmware is ++ * overwritting information in the buffer. ++ */ ++struct mpt2_diag_release { ++ struct mpt2_ioctl_header hdr; ++ uint32_t unique_id; ++}; ++ ++/** ++ * struct mpt2_diag_read_buffer - request for copy of the diag buffer ++ * @hdr - generic header ++ * @status - ++ * @reserved - ++ * @flags - misc flags ++ * @starting_offset - starting offset within drivers buffer where to start ++ * reading data at into the specified application buffer ++ * @bytes_to_read - number of bytes to copy from the drivers buffer into the ++ * application buffer starting at starting_offset. ++ * @unique_id - unique id associated with this buffer. ++ * @diagnostic_data - data payload ++ */ ++struct mpt2_diag_read_buffer { ++ struct mpt2_ioctl_header hdr; ++ uint8_t status; ++ uint8_t reserved; ++ uint16_t flags; ++ uint32_t starting_offset; ++ uint32_t bytes_to_read; ++ uint32_t unique_id; ++ uint32_t diagnostic_data[1]; ++}; ++ ++#endif /* MPT2SAS_CTL_H_INCLUDED */ +diff -r e02b4006a7c8 drivers/scsi/mpt2sas/mpt2sas_debug.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/scsi/mpt2sas/mpt2sas_debug.h Wed Jul 01 09:49:59 2009 +0100 +@@ -0,0 +1,181 @@ ++/* ++ * Logging Support for MPT (Message Passing Technology) based controllers ++ * ++ * This code is based on drivers/scsi/mpt2sas/mpt2_debug.c ++ * Copyright (C) 2007-2008 LSI Corporation ++ * (mailto:DL-MPTFusionLinux@lsi.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. ++ * ++ * NO WARRANTY ++ * THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR ++ * CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT ++ * LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, ++ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is ++ * solely responsible for determining the appropriateness of using and ++ * distributing the Program and assumes all risks associated with its ++ * exercise of rights under this Agreement, including but not limited to ++ * the risks and costs of program errors, damage to or loss of data, ++ * programs or equipment, and unavailability or interruption of operations. ++ ++ * DISCLAIMER OF LIABILITY ++ * NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY ++ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ++ * DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), 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 OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED ++ * HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES ++ ++ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, ++ * USA. ++ */ ++ ++#ifndef MPT2SAS_DEBUG_H_INCLUDED ++#define MPT2SAS_DEBUG_H_INCLUDED ++ ++#define MPT_DEBUG 0x00000001 ++#define MPT_DEBUG_MSG_FRAME 0x00000002 ++#define MPT_DEBUG_SG 0x00000004 ++#define MPT_DEBUG_EVENTS 0x00000008 ++#define MPT_DEBUG_EVENT_WORK_TASK 0x00000010 ++#define MPT_DEBUG_INIT 0x00000020 ++#define MPT_DEBUG_EXIT 0x00000040 ++#define MPT_DEBUG_FAIL 0x00000080 ++#define MPT_DEBUG_TM 0x00000100 ++#define MPT_DEBUG_REPLY 0x00000200 ++#define MPT_DEBUG_HANDSHAKE 0x00000400 ++#define MPT_DEBUG_CONFIG 0x00000800 ++#define MPT_DEBUG_DL 0x00001000 ++#define MPT_DEBUG_RESET 0x00002000 ++#define MPT_DEBUG_SCSI 0x00004000 ++#define MPT_DEBUG_IOCTL 0x00008000 ++#define MPT_DEBUG_CSMISAS 0x00010000 ++#define MPT_DEBUG_SAS 0x00020000 ++#define MPT_DEBUG_TRANSPORT 0x00040000 ++#define MPT_DEBUG_TASK_SET_FULL 0x00080000 ++ ++#define MPT_DEBUG_TARGET_MODE 0x00100000 ++ ++ ++/* ++ * CONFIG_SCSI_MPT2SAS_LOGGING - enabled in Kconfig ++ */ ++ ++#ifdef CONFIG_SCSI_MPT2SAS_LOGGING ++#define MPT_CHECK_LOGGING(IOC, CMD, BITS) \ ++{ \ ++ if (IOC->logging_level & BITS) \ ++ CMD; \ ++} ++#else ++#define MPT_CHECK_LOGGING(IOC, CMD, BITS) ++#endif /* CONFIG_SCSI_MPT2SAS_LOGGING */ ++ ++ ++/* ++ * debug macros ++ */ ++ ++#define dprintk(IOC, CMD) \ ++ MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG) ++ ++#define dsgprintk(IOC, CMD) \ ++ MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_SG) ++ ++#define devtprintk(IOC, CMD) \ ++ MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_EVENTS) ++ ++#define dewtprintk(IOC, CMD) \ ++ MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_EVENT_WORK_TASK) ++ ++#define dinitprintk(IOC, CMD) \ ++ MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_INIT) ++ ++#define dexitprintk(IOC, CMD) \ ++ MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_EXIT) ++ ++#define dfailprintk(IOC, CMD) \ ++ MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_FAIL) ++ ++#define dtmprintk(IOC, CMD) \ ++ MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_TM) ++ ++#define dreplyprintk(IOC, CMD) \ ++ MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_REPLY) ++ ++#define dhsprintk(IOC, CMD) \ ++ MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_HANDSHAKE) ++ ++#define dcprintk(IOC, CMD) \ ++ MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_CONFIG) ++ ++#define ddlprintk(IOC, CMD) \ ++ MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_DL) ++ ++#define drsprintk(IOC, CMD) \ ++ MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_RESET) ++ ++#define dsprintk(IOC, CMD) \ ++ MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_SCSI) ++ ++#define dctlprintk(IOC, CMD) \ ++ MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_IOCTL) ++ ++#define dcsmisasprintk(IOC, CMD) \ ++ MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_CSMISAS) ++ ++#define dsasprintk(IOC, CMD) \ ++ MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_SAS) ++ ++#define dsastransport(IOC, CMD) \ ++ MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_SAS_WIDE) ++ ++#define dmfprintk(IOC, CMD) \ ++ MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_MSG_FRAME) ++ ++#define dtsfprintk(IOC, CMD) \ ++ MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_TASK_SET_FULL) ++ ++#define dtransportprintk(IOC, CMD) \ ++ MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_TRANSPORT) ++ ++#define dTMprintk(IOC, CMD) \ ++ MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_TARGET_MODE) ++ ++/* inline functions for dumping debug data*/ ++#ifdef CONFIG_SCSI_MPT2SAS_LOGGING ++/** ++ * _debug_dump_mf - print message frame contents ++ * @mpi_request: pointer to message frame ++ * @sz: number of dwords ++ */ ++static inline void ++_debug_dump_mf(void *mpi_request, int sz) ++{ ++ int i; ++ u32 *mfp = (u32 *)mpi_request; ++ ++ printk(KERN_INFO "mf:\n\t"); ++ for (i = 0; i < sz; i++) { ++ if (i && ((i % 8) == 0)) ++ printk("\n\t"); ++ printk("%08x ", le32_to_cpu(mfp[i])); ++ } ++ printk("\n"); ++} ++#else ++#define _debug_dump_mf(mpi_request, sz) ++#endif /* CONFIG_SCSI_MPT2SAS_LOGGING */ ++ ++#endif /* MPT2SAS_DEBUG_H_INCLUDED */ +diff -r e02b4006a7c8 drivers/scsi/mpt2sas/mpt2sas_scsih.c +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/scsi/mpt2sas/mpt2sas_scsih.c Wed Jul 01 09:49:59 2009 +0100 +@@ -0,0 +1,7626 @@ ++/* ++ * Scsi Host Layer for MPT (Message Passing Technology) based controllers ++ * ++ * This code is based on drivers/scsi/mpt2sas/mpt2_scsih.c ++ * Copyright (C) 2007-2008 LSI Corporation ++ * (mailto:DL-MPTFusionLinux@lsi.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. ++ * ++ * NO WARRANTY ++ * THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR ++ * CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT ++ * LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, ++ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is ++ * solely responsible for determining the appropriateness of using and ++ * distributing the Program and assumes all risks associated with its ++ * exercise of rights under this Agreement, including but not limited to ++ * the risks and costs of program errors, damage to or loss of data, ++ * programs or equipment, and unavailability or interruption of operations. ++ ++ * DISCLAIMER OF LIABILITY ++ * NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY ++ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ++ * DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), 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 OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED ++ * HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES ++ ++ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, ++ * USA. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "mpt2sas_base.h" ++ ++MODULE_AUTHOR(MPT2SAS_AUTHOR); ++MODULE_DESCRIPTION(MPT2SAS_DESCRIPTION); ++MODULE_LICENSE("GPL"); ++MODULE_VERSION(MPT2SAS_DRIVER_VERSION); ++ ++#define RAID_CHANNEL 1 ++ ++/* forward proto's */ ++static void _scsih_expander_node_remove(struct MPT2SAS_ADAPTER *ioc, ++ struct _sas_node *sas_expander); ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,19)) ++static void _firmware_event_work(struct work_struct *work); ++static void _firmware_event_work_delayed(struct work_struct *work); ++#else ++static void _firmware_event_work(void *arg); ++#endif ++ ++#if defined(EEDP_SUPPORT) ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27)) ++static enum device_responsive_state ++_scsih_read_capacity_16(struct MPT2SAS_ADAPTER *ioc, u16 handle, u32 lun, ++ void *data, u32 data_length); ++#endif ++#endif ++ ++#ifdef MPT2SAS_MULTIPATH ++static enum device_responsive_state ++_scsih_inquiry_vpd_sn(struct MPT2SAS_ADAPTER *ioc, u16 handle, void *data, ++ u32 data_length); ++#endif ++ ++static enum device_responsive_state ++_scsih_inquiry_vpd_supported_pages(struct MPT2SAS_ADAPTER *ioc, u16 handle, u32 lun, ++ void *data, u32 data_length); ++ ++/* global parameters */ ++LIST_HEAD(mpt2sas_ioc_list); ++ ++/* local parameters */ ++static u8 scsi_io_cb_idx = -1; ++static u8 tm_cb_idx = -1; ++static u8 ctl_cb_idx = -1; ++static u8 base_cb_idx = -1; ++static u8 transport_cb_idx = -1; ++static u8 scsih_cb_idx = -1; ++static u8 config_cb_idx = -1; ++static int mpt_ids; ++ ++/* command line options */ ++static u32 logging_level; ++MODULE_PARM_DESC(logging_level, " bits for enabling additional logging info " ++ "(default=0)"); ++ ++static int command_retry_count = 144; ++module_param(command_retry_count, int, 0); ++MODULE_PARM_DESC(command_retry_count, " Device discovery TUR command retry " ++ "count: (default=144)"); ++ ++/* scsi-mid layer global parmeter is max_report_luns, which is 511 */ ++#define MPT2SAS_MAX_LUN (16895) ++static int max_lun = MPT2SAS_MAX_LUN; ++module_param(max_lun, int, 0); ++MODULE_PARM_DESC(max_lun, " max lun, default=16895 "); ++ ++#ifdef MPT2SAS_MULTIPATH ++static int mpt2sas_multipath = -1; ++module_param(mpt2sas_multipath, int, 0); ++MODULE_PARM_DESC(mpt2sas_multipath, " enabling mulipath support for target " ++ "resets (default=0)"); ++#endif ++ ++#if (defined(CONFIG_SUSE_KERNEL) && defined(scsi_is_sas_phy_local)) || LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18) ++#define MPT_WIDE_PORT_API 1 ++#define MPT_WIDE_PORT_API_PLUS 1 ++#endif ++ ++/** ++ * enum device_responsive_state - responsive state ++ * @DEVICE_READY: device is ready to be added ++ * @DEVICE_RETRY: device can be retried later ++ * @DEVICE_RETRY_UA: retry unit attentions ++ * @DEVICE_START_UNIT: requires start unit ++ * @DEVICE_ERROR: device reported some fatal error ++ * ++ * Look at _scsih_wait_for_device_to_become_ready() ++ * ++ */ ++enum device_responsive_state { ++ DEVICE_READY, ++ DEVICE_RETRY, ++ DEVICE_RETRY_UA, ++ DEVICE_START_UNIT, ++ DEVICE_ERROR, ++}; ++ ++/** ++ * struct sense_info - common structure for obtaining sense keys ++ * @skey: sense key ++ * @asc: additional sense code ++ * @ascq: additional sense code qualifier ++ */ ++struct sense_info { ++ u8 skey; ++ u8 asc; ++ u8 ascq; ++}; ++ ++#ifdef MPT2SAS_MULTIPATH ++/** ++ * struct mpt2sas_abort_task_set - abort task set ++ * @handle: device handle ++ * @lun: lun ++ */ ++struct mpt2sas_abort_task_set { ++ u16 handle; ++ u32 lun; ++}; ++#endif ++ ++#define MPT2SAS_ABRT_TASK_SET (0xFFFE) ++ ++/** ++ * struct fw_event_work - firmware event struct ++ * @list: link list framework ++ * @work: work object (ioc->fault_reset_work_q) ++ * @ioc: per adapter object ++ * @VF_ID: virtual function id ++ * @host_reset_handling: handling events during host reset ++ * @ignore: flag meaning this event has been marked to ignore ++ * @event: firmware event MPI2_EVENT_XXX defined in mpt2_ioc.h ++ * @event_data: reply event data payload follows ++ * @retries: number of times this event has been retried(for each device) ++ * ++ * This object stored on ioc->fw_event_list. ++ */ ++struct fw_event_work { ++ struct list_head list; ++ struct work_struct work; ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,19)) ++ struct delayed_work delayed_work; ++ u8 delayed_work_active; ++#endif ++ struct MPT2SAS_ADAPTER *ioc; ++ u8 VF_ID; ++ u8 host_reset_handling; ++ u8 ignore; ++ u16 event; ++ void *event_data; ++ u8 *retries; ++}; ++ ++/** ++ * struct _scsi_io_transfer - scsi io transfer ++ * @handle: sas device handle (assigned by firmware) ++ * @is_raid: flag set for hidden raid components ++ * @dir: DMA_TO_DEVICE, DMA_FROM_DEVICE, ++ * @data_length: data transfer length ++ * @data_dma: dma pointer to data ++ * @sense: sense data ++ * @lun: lun number ++ * @cdb_length: cdb length ++ * @cdb: cdb contents ++ * @valid_reply: flag set for reply message ++ * @timeout: timeout for this command ++ * @sense_length: sense length ++ * @ioc_status: ioc status ++ * @scsi_state: scsi state ++ * @scsi_status: scsi staus ++ * @log_info: log information ++ * @transfer_length: data length transfer when there is a reply message ++ * ++ * Used for sending internal scsi commands to devices within this module. ++ * Refer to _scsi_send_scsi_io(). ++ */ ++struct _scsi_io_transfer { ++ u16 handle; ++ u8 is_raid; ++ enum dma_data_direction dir; ++ u32 data_length; ++ dma_addr_t data_dma; ++ u8 sense[SCSI_SENSE_BUFFERSIZE]; ++ u32 lun; ++ u8 cdb_length; ++ u8 cdb[32]; ++ u8 timeout; ++ u8 valid_reply; ++ /* the following bits are only valid when 'valid_reply = 1' */ ++ u32 sense_length; ++ u16 ioc_status; ++ u8 scsi_state; ++ u8 scsi_status; ++ u32 log_info; ++ u32 transfer_length; ++}; ++ ++/* ++ * The pci device ids are defined in mpi/mpi2_cnfg.h. ++ */ ++static struct pci_device_id scsih_pci_table[] = { ++ { MPI2_MFGPAGE_VENDORID_LSI, MPI2_MFGPAGE_DEVID_SAS2004, ++ PCI_ANY_ID, PCI_ANY_ID }, ++ /* Falcon ~ 2008*/ ++ { MPI2_MFGPAGE_VENDORID_LSI, MPI2_MFGPAGE_DEVID_SAS2008, ++ PCI_ANY_ID, PCI_ANY_ID }, ++ /* Liberator ~ 2108 */ ++ { MPI2_MFGPAGE_VENDORID_LSI, MPI2_MFGPAGE_DEVID_SAS2108_1, ++ PCI_ANY_ID, PCI_ANY_ID }, ++ { MPI2_MFGPAGE_VENDORID_LSI, MPI2_MFGPAGE_DEVID_SAS2108_2, ++ PCI_ANY_ID, PCI_ANY_ID }, ++ { MPI2_MFGPAGE_VENDORID_LSI, MPI2_MFGPAGE_DEVID_SAS2108_3, ++ PCI_ANY_ID, PCI_ANY_ID }, ++ { MPI2_MFGPAGE_VENDORID_LSI, MPI2_MFGPAGE_DEVID_SAS2116_1, ++ PCI_ANY_ID, PCI_ANY_ID }, ++ { MPI2_MFGPAGE_VENDORID_LSI, MPI2_MFGPAGE_DEVID_SAS2116_2, ++ PCI_ANY_ID, PCI_ANY_ID }, ++ {0} /* Terminating entry */ ++}; ++MODULE_DEVICE_TABLE(pci, scsih_pci_table); ++ ++/** ++ * _scsih_set_debug_level - global setting of ioc->logging_level. ++ * ++ * Note: The logging levels are defined in mpt2sas_debug.h. ++ */ ++static int ++_scsih_set_debug_level(const char *val, struct kernel_param *kp) ++{ ++ int ret = param_set_int(val, kp); ++ struct MPT2SAS_ADAPTER *ioc; ++ ++ if (ret) ++ return ret; ++ ++ printk(KERN_INFO "setting logging_level(0x%08x)\n", logging_level); ++ list_for_each_entry(ioc, &mpt2sas_ioc_list, list) ++ ioc->logging_level = logging_level; ++ return 0; ++} ++module_param_call(logging_level, _scsih_set_debug_level, param_get_int, ++ &logging_level, 0644); ++ ++/** ++ * _scsih_srch_boot_sas_address - search based on sas_address ++ * @sas_address: sas address ++ * @boot_device: boot device object from bios page 2 ++ * ++ * Returns 1 when there's a match, 0 means no match. ++ */ ++static inline int ++_scsih_srch_boot_sas_address(u64 sas_address, ++ Mpi2BootDeviceSasWwid_t *boot_device) ++{ ++ return (sas_address == le64_to_cpu(boot_device->SASAddress)) ? 1 : 0; ++} ++ ++/** ++ * _scsih_srch_boot_device_name - search based on device name ++ * @device_name: device name specified in INDENTIFY fram ++ * @boot_device: boot device object from bios page 2 ++ * ++ * Returns 1 when there's a match, 0 means no match. ++ */ ++static inline int ++_scsih_srch_boot_device_name(u64 device_name, ++ Mpi2BootDeviceDeviceName_t *boot_device) ++{ ++ return (device_name == le64_to_cpu(boot_device->DeviceName)) ? 1 : 0; ++} ++ ++/** ++ * _scsih_srch_boot_encl_slot - search based on enclosure_logical_id/slot ++ * @enclosure_logical_id: enclosure logical id ++ * @slot_number: slot number ++ * @boot_device: boot device object from bios page 2 ++ * ++ * Returns 1 when there's a match, 0 means no match. ++ */ ++static inline int ++_scsih_srch_boot_encl_slot(u64 enclosure_logical_id, u16 slot_number, ++ Mpi2BootDeviceEnclosureSlot_t *boot_device) ++{ ++ return (enclosure_logical_id == le64_to_cpu(boot_device-> ++ EnclosureLogicalID) && slot_number == le16_to_cpu(boot_device-> ++ SlotNumber)) ? 1 : 0; ++} ++ ++/** ++ * _scsih_is_boot_device - search for matching boot device. ++ * @sas_address: sas address ++ * @device_name: device name specified in INDENTIFY fram ++ * @enclosure_logical_id: enclosure logical id ++ * @slot_number: slot number ++ * @form: specifies boot device form ++ * @boot_device: boot device object from bios page 2 ++ * ++ * Returns 1 when there's a match, 0 means no match. ++ */ ++static int ++_scsih_is_boot_device(u64 sas_address, u64 device_name, ++ u64 enclosure_logical_id, u16 slot, u8 form, ++ Mpi2BiosPage2BootDevice_t *boot_device) ++{ ++ int rc = 0; ++ ++ switch (form) { ++ case MPI2_BIOSPAGE2_FORM_SAS_WWID: ++ if (!sas_address) ++ break; ++ rc = _scsih_srch_boot_sas_address( ++ sas_address, &boot_device->SasWwid); ++ break; ++ case MPI2_BIOSPAGE2_FORM_ENCLOSURE_SLOT: ++ if (!enclosure_logical_id) ++ break; ++ rc = _scsih_srch_boot_encl_slot( ++ enclosure_logical_id, ++ slot, &boot_device->EnclosureSlot); ++ break; ++ case MPI2_BIOSPAGE2_FORM_DEVICE_NAME: ++ if (!device_name) ++ break; ++ rc = _scsih_srch_boot_device_name( ++ device_name, &boot_device->DeviceName); ++ break; ++ case MPI2_BIOSPAGE2_FORM_NO_DEVICE_SPECIFIED: ++ break; ++ } ++ ++ return rc; ++} ++ ++/** ++ * _scsih_determine_boot_device - determine boot device. ++ * @ioc: per adapter object ++ * @device: either sas_device or raid_device object ++ * @is_raid: [flag] 1 = raid object, 0 = sas object ++ * ++ * Determines whether this device should be first reported device to ++ * to scsi-ml or sas transport, this purpose is for persistant boot device. ++ * There are primary, alternate, and current entries in bios page 2. The order ++ * priority is primary, alternate, then current. This routine saves ++ * the corresponding device object and is_raid flag in the ioc object. ++ * The saved data to be used later in _scsih_probe_boot_devices(). ++ */ ++static void ++_scsih_determine_boot_device(struct MPT2SAS_ADAPTER *ioc, ++ void *device, u8 is_raid) ++{ ++ struct _sas_device *sas_device; ++ struct _raid_device *raid_device; ++ u64 sas_address; ++ u64 device_name; ++ u64 enclosure_logical_id; ++ u16 slot; ++ ++ /* only process this function when driver loads */ ++ if (!ioc->wait_for_port_enable_to_complete) ++ return; ++ ++ if (!is_raid) { ++ sas_device = device; ++ sas_address = sas_device->sas_address; ++ device_name = sas_device->device_name; ++ enclosure_logical_id = sas_device->enclosure_logical_id; ++ slot = sas_device->slot; ++ } else { ++ raid_device = device; ++ sas_address = raid_device->wwid; ++ device_name = 0; ++ enclosure_logical_id = 0; ++ slot = 0; ++ } ++ ++ if (!ioc->req_boot_device.device) { ++ if (_scsih_is_boot_device(sas_address, device_name, ++ enclosure_logical_id, slot, ++ (ioc->bios_pg2.ReqBootDeviceForm & ++ MPI2_BIOSPAGE2_FORM_MASK), ++ &ioc->bios_pg2.RequestedBootDevice)) { ++ dinitprintk(ioc, printk(MPT2SAS_DEBUG_FMT ++ "%s: req_boot_device(0x%016llx)\n", ++ ioc->name, __func__, ++ (unsigned long long)sas_address)); ++ ioc->req_boot_device.device = device; ++ ioc->req_boot_device.is_raid = is_raid; ++ } ++ } ++ ++ if (!ioc->req_alt_boot_device.device) { ++ if (_scsih_is_boot_device(sas_address, device_name, ++ enclosure_logical_id, slot, ++ (ioc->bios_pg2.ReqAltBootDeviceForm & ++ MPI2_BIOSPAGE2_FORM_MASK), ++ &ioc->bios_pg2.RequestedAltBootDevice)) { ++ dinitprintk(ioc, printk(MPT2SAS_DEBUG_FMT ++ "%s: req_alt_boot_device(0x%016llx)\n", ++ ioc->name, __func__, ++ (unsigned long long)sas_address)); ++ ioc->req_alt_boot_device.device = device; ++ ioc->req_alt_boot_device.is_raid = is_raid; ++ } ++ } ++ ++ if (!ioc->current_boot_device.device) { ++ if (_scsih_is_boot_device(sas_address, device_name, ++ enclosure_logical_id, slot, ++ (ioc->bios_pg2.CurrentBootDeviceForm & ++ MPI2_BIOSPAGE2_FORM_MASK), ++ &ioc->bios_pg2.CurrentBootDevice)) { ++ dinitprintk(ioc, printk(MPT2SAS_DEBUG_FMT ++ "%s: current_boot_device(0x%016llx)\n", ++ ioc->name, __func__, ++ (unsigned long long)sas_address)); ++ ioc->current_boot_device.device = device; ++ ioc->current_boot_device.is_raid = is_raid; ++ } ++ } ++} ++ ++/** ++ * mpt2sas_scsih_sas_device_find_by_sas_address - sas device search ++ * @ioc: per adapter object ++ * @sas_address: sas address ++ * Context: Calling function should acquire ioc->sas_device_lock ++ * ++ * This searches for sas_device based on sas_address, then return sas_device ++ * object. ++ */ ++struct _sas_device * ++mpt2sas_scsih_sas_device_find_by_sas_address(struct MPT2SAS_ADAPTER *ioc, ++ u64 sas_address) ++{ ++ struct _sas_device *sas_device, *r; ++ ++ r = NULL; ++ /* check the sas_device_init_list */ ++ list_for_each_entry(sas_device, &ioc->sas_device_init_list, ++ list) { ++ if (sas_device->sas_address != sas_address) ++ continue; ++ r = sas_device; ++ goto out; ++ } ++ ++ /* then check the sas_device_list */ ++ list_for_each_entry(sas_device, &ioc->sas_device_list, list) { ++ if (sas_device->sas_address != sas_address) ++ continue; ++ r = sas_device; ++ goto out; ++ } ++ out: ++ return r; ++} ++ ++/** ++ * _scsih_sas_device_find_by_handle - sas device search ++ * @ioc: per adapter object ++ * @handle: sas device handle (assigned by firmware) ++ * Context: Calling function should acquire ioc->sas_device_lock ++ * ++ * This searches for sas_device based on sas_address, then return sas_device ++ * object. ++ */ ++static struct _sas_device * ++_scsih_sas_device_find_by_handle(struct MPT2SAS_ADAPTER *ioc, u16 handle) ++{ ++ struct _sas_device *sas_device, *r; ++ ++ r = NULL; ++ if (ioc->wait_for_port_enable_to_complete) { ++ list_for_each_entry(sas_device, &ioc->sas_device_init_list, ++ list) { ++ if (sas_device->handle != handle) ++ continue; ++ r = sas_device; ++ goto out; ++ } ++ } else { ++ list_for_each_entry(sas_device, &ioc->sas_device_list, list) { ++ if (sas_device->handle != handle) ++ continue; ++ r = sas_device; ++ goto out; ++ } ++ } ++ ++ out: ++ return r; ++} ++ ++/** ++ * _scsih_sas_device_remove - remove sas_device from list. ++ * @ioc: per adapter object ++ * @sas_device: the sas_device object ++ * Context: This function will acquire ioc->sas_device_lock. ++ * ++ * Removing object and freeing associated memory from the ioc->sas_device_list. ++ */ ++static void ++_scsih_sas_device_remove(struct MPT2SAS_ADAPTER *ioc, ++ struct _sas_device *sas_device) ++{ ++ unsigned long flags; ++ ++ spin_lock_irqsave(&ioc->sas_device_lock, flags); ++ list_del(&sas_device->list); ++#ifdef MPT2SAS_MULTIPATH ++ kfree(sas_device->serial_number); ++#endif ++ memset(sas_device, 0, sizeof(struct _sas_device)); ++ kfree(sas_device); ++ spin_unlock_irqrestore(&ioc->sas_device_lock, flags); ++} ++ ++/** ++ * _scsih_sas_device_add - insert sas_device to the list. ++ * @ioc: per adapter object ++ * @sas_device: the sas_device object ++ * Context: This function will acquire ioc->sas_device_lock. ++ * ++ * Adding new object to the ioc->sas_device_list. ++ */ ++static void ++_scsih_sas_device_add(struct MPT2SAS_ADAPTER *ioc, ++ struct _sas_device *sas_device) ++{ ++ unsigned long flags; ++ u16 handle, parent_handle; ++ u64 sas_address; ++ ++ dewtprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: handle" ++ "(0x%04x), sas_addr(0x%016llx)\n", ioc->name, __func__, ++ sas_device->handle, (unsigned long long)sas_device->sas_address)); ++ ++ spin_lock_irqsave(&ioc->sas_device_lock, flags); ++ list_add_tail(&sas_device->list, &ioc->sas_device_list); ++ spin_unlock_irqrestore(&ioc->sas_device_lock, flags); ++ ++ handle = sas_device->handle; ++ parent_handle = sas_device->parent_handle; ++ sas_address = sas_device->sas_address; ++ if (!mpt2sas_transport_port_add(ioc, handle, parent_handle)) ++ _scsih_sas_device_remove(ioc, sas_device); ++} ++ ++/** ++ * _scsih_sas_device_init_add - insert sas_device to the list. ++ * @ioc: per adapter object ++ * @sas_device: the sas_device object ++ * Context: This function will acquire ioc->sas_device_lock. ++ * ++ * Adding new object at driver load time to the ioc->sas_device_init_list. ++ */ ++static void ++_scsih_sas_device_init_add(struct MPT2SAS_ADAPTER *ioc, ++ struct _sas_device *sas_device) ++{ ++ unsigned long flags; ++ ++ dewtprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: handle" ++ "(0x%04x), sas_addr(0x%016llx)\n", ioc->name, __func__, ++ sas_device->handle, (unsigned long long)sas_device->sas_address)); ++ ++ spin_lock_irqsave(&ioc->sas_device_lock, flags); ++ list_add_tail(&sas_device->list, &ioc->sas_device_init_list); ++ spin_unlock_irqrestore(&ioc->sas_device_lock, flags); ++ _scsih_determine_boot_device(ioc, sas_device, 0); ++} ++ ++/** ++ * mpt2sas_scsih_expander_find_by_handle - expander device search ++ * @ioc: per adapter object ++ * @handle: expander handle (assigned by firmware) ++ * Context: Calling function should acquire ioc->sas_device_lock ++ * ++ * This searches for expander device based on handle, then returns the ++ * sas_node object. ++ */ ++struct _sas_node * ++mpt2sas_scsih_expander_find_by_handle(struct MPT2SAS_ADAPTER *ioc, u16 handle) ++{ ++ struct _sas_node *sas_expander, *r; ++ ++ r = NULL; ++ list_for_each_entry(sas_expander, &ioc->sas_expander_list, list) { ++ if (sas_expander->handle != handle) ++ continue; ++ r = sas_expander; ++ goto out; ++ } ++ out: ++ return r; ++} ++ ++/** ++ * _scsih_raid_device_find_by_id - raid device search ++ * @ioc: per adapter object ++ * @id: sas device target id ++ * @channel: sas device channel ++ * Context: Calling function should acquire ioc->raid_device_lock ++ * ++ * This searches for raid_device based on target id, then return raid_device ++ * object. ++ */ ++static struct _raid_device * ++_scsih_raid_device_find_by_id(struct MPT2SAS_ADAPTER *ioc, int id, int channel) ++{ ++ struct _raid_device *raid_device, *r; ++ ++ r = NULL; ++ list_for_each_entry(raid_device, &ioc->raid_device_list, list) { ++ if (raid_device->id == id && raid_device->channel == channel) { ++ r = raid_device; ++ goto out; ++ } ++ } ++ ++ out: ++ return r; ++} ++ ++/** ++ * _scsih_raid_device_find_by_handle - raid device search ++ * @ioc: per adapter object ++ * @handle: sas device handle (assigned by firmware) ++ * Context: Calling function should acquire ioc->raid_device_lock ++ * ++ * This searches for raid_device based on handle, then return raid_device ++ * object. ++ */ ++static struct _raid_device * ++_scsih_raid_device_find_by_handle(struct MPT2SAS_ADAPTER *ioc, u16 handle) ++{ ++ struct _raid_device *raid_device, *r; ++ ++ r = NULL; ++ list_for_each_entry(raid_device, &ioc->raid_device_list, list) { ++ if (raid_device->handle != handle) ++ continue; ++ r = raid_device; ++ goto out; ++ } ++ ++ out: ++ return r; ++} ++ ++/** ++ * _scsih_raid_device_find_by_wwid - raid device search ++ * @ioc: per adapter object ++ * @handle: sas device handle (assigned by firmware) ++ * Context: Calling function should acquire ioc->raid_device_lock ++ * ++ * This searches for raid_device based on wwid, then return raid_device ++ * object. ++ */ ++static struct _raid_device * ++_scsih_raid_device_find_by_wwid(struct MPT2SAS_ADAPTER *ioc, u64 wwid) ++{ ++ struct _raid_device *raid_device, *r; ++ ++ r = NULL; ++ list_for_each_entry(raid_device, &ioc->raid_device_list, list) { ++ if (raid_device->wwid != wwid) ++ continue; ++ r = raid_device; ++ goto out; ++ } ++ ++ out: ++ return r; ++} ++ ++/** ++ * _scsih_raid_device_add - add raid_device object ++ * @ioc: per adapter object ++ * @raid_device: raid_device object ++ * ++ * This is added to the raid_device_list link list. ++ */ ++static void ++_scsih_raid_device_add(struct MPT2SAS_ADAPTER *ioc, ++ struct _raid_device *raid_device) ++{ ++ unsigned long flags; ++ ++ dewtprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: handle" ++ "(0x%04x), wwid(0x%016llx)\n", ioc->name, __func__, ++ raid_device->handle, (unsigned long long)raid_device->wwid)); ++ ++ spin_lock_irqsave(&ioc->raid_device_lock, flags); ++ list_add_tail(&raid_device->list, &ioc->raid_device_list); ++ spin_unlock_irqrestore(&ioc->raid_device_lock, flags); ++} ++ ++/** ++ * _scsih_raid_device_remove - delete raid_device object ++ * @ioc: per adapter object ++ * @raid_device: raid_device object ++ * ++ * This is removed from the raid_device_list link list. ++ */ ++static void ++_scsih_raid_device_remove(struct MPT2SAS_ADAPTER *ioc, ++ struct _raid_device *raid_device) ++{ ++ unsigned long flags; ++ ++ spin_lock_irqsave(&ioc->raid_device_lock, flags); ++ list_del(&raid_device->list); ++ memset(raid_device, 0, sizeof(struct _raid_device)); ++ kfree(raid_device); ++ spin_unlock_irqrestore(&ioc->raid_device_lock, flags); ++} ++ ++/** ++ * mpt2sas_scsih_expander_find_by_sas_address - expander device search ++ * @ioc: per adapter object ++ * @sas_address: sas address ++ * Context: Calling function should acquire ioc->sas_node_lock. ++ * ++ * This searches for expander device based on sas_address, then returns the ++ * sas_node object. ++ */ ++struct _sas_node * ++mpt2sas_scsih_expander_find_by_sas_address(struct MPT2SAS_ADAPTER *ioc, ++ u64 sas_address) ++{ ++ struct _sas_node *sas_expander, *r; ++ ++ r = NULL; ++ list_for_each_entry(sas_expander, &ioc->sas_expander_list, list) { ++ if (sas_expander->sas_address != sas_address) ++ continue; ++ r = sas_expander; ++ goto out; ++ } ++ out: ++ return r; ++} ++ ++/** ++ * _scsih_expander_node_add - insert expander device to the list. ++ * @ioc: per adapter object ++ * @sas_expander: the sas_device object ++ * Context: This function will acquire ioc->sas_node_lock. ++ * ++ * Adding new object to the ioc->sas_expander_list. ++ * ++ * Return nothing. ++ */ ++static void ++_scsih_expander_node_add(struct MPT2SAS_ADAPTER *ioc, ++ struct _sas_node *sas_expander) ++{ ++ unsigned long flags; ++ ++ spin_lock_irqsave(&ioc->sas_node_lock, flags); ++ list_add_tail(&sas_expander->list, &ioc->sas_expander_list); ++ spin_unlock_irqrestore(&ioc->sas_node_lock, flags); ++} ++ ++/** ++ * _scsih_is_end_device - determines if device is an end device ++ * @device_info: bitfield providing information about the device. ++ * Context: none ++ * ++ * Returns 1 if end device. ++ */ ++static int ++_scsih_is_end_device(u32 device_info) ++{ ++ if (device_info & MPI2_SAS_DEVICE_INFO_END_DEVICE && ++ ((device_info & MPI2_SAS_DEVICE_INFO_SSP_TARGET) | ++ (device_info & MPI2_SAS_DEVICE_INFO_STP_TARGET) | ++ (device_info & MPI2_SAS_DEVICE_INFO_SATA_DEVICE))) ++ return 1; ++ else ++ return 0; ++} ++ ++/** ++ * _scsih_scsi_lookup_get - returns scmd entry ++ * @ioc: per adapter object ++ * @smid: system request message index ++ * Context: This function will acquire ioc->scsi_lookup_lock. ++ * ++ * Returns the smid stored scmd pointer. ++ */ ++static struct scsi_cmnd * ++_scsih_scsi_lookup_get(struct MPT2SAS_ADAPTER *ioc, u16 smid) ++{ ++ unsigned long flags; ++ struct scsi_cmnd *scmd; ++ ++ spin_lock_irqsave(&ioc->scsi_lookup_lock, flags); ++ scmd = ioc->scsi_lookup[smid - 1].scmd; ++ spin_unlock_irqrestore(&ioc->scsi_lookup_lock, flags); ++ return scmd; ++} ++ ++/** ++ * mptscsih_getclear_scsi_lookup - returns scmd entry ++ * @ioc: per adapter object ++ * @smid: system request message index ++ * Context: This function will acquire ioc->scsi_lookup_lock. ++ * ++ * Returns the smid stored scmd pointer, as well as clearing the scmd pointer. ++ */ ++static struct scsi_cmnd * ++_scsih_scsi_lookup_getclear(struct MPT2SAS_ADAPTER *ioc, u16 smid) ++{ ++ unsigned long flags; ++ struct scsi_cmnd *scmd; ++ ++ spin_lock_irqsave(&ioc->scsi_lookup_lock, flags); ++ scmd = ioc->scsi_lookup[smid - 1].scmd; ++ ioc->scsi_lookup[smid - 1].scmd = NULL; ++ spin_unlock_irqrestore(&ioc->scsi_lookup_lock, flags); ++ return scmd; ++} ++ ++/** ++ * _scsih_scsi_lookup_set - updates scmd entry in lookup ++ * @ioc: per adapter object ++ * @smid: system request message index ++ * @scmd: pointer to scsi command object ++ * Context: This function will acquire ioc->scsi_lookup_lock. ++ * ++ * This will save scmd pointer in the scsi_lookup array. ++ * ++ * Return nothing. ++ */ ++static void ++_scsih_scsi_lookup_set(struct MPT2SAS_ADAPTER *ioc, u16 smid, ++ struct scsi_cmnd *scmd) ++{ ++ unsigned long flags; ++ ++ spin_lock_irqsave(&ioc->scsi_lookup_lock, flags); ++ ioc->scsi_lookup[smid - 1].scmd = scmd; ++ spin_unlock_irqrestore(&ioc->scsi_lookup_lock, flags); ++} ++ ++/** ++ * _scsih_scsi_lookup_find_by_scmd - scmd lookup ++ * @ioc: per adapter object ++ * @smid: system request message index ++ * @scmd: pointer to scsi command object ++ * Context: This function will acquire ioc->scsi_lookup_lock. ++ * ++ * This will search for a scmd pointer in the scsi_lookup array, ++ * returning the revelent smid. A returned value of zero means invalid. ++ */ ++static u16 ++_scsih_scsi_lookup_find_by_scmd(struct MPT2SAS_ADAPTER *ioc, struct scsi_cmnd ++ *scmd) ++{ ++ u16 smid; ++ unsigned long flags; ++ int i; ++ ++ spin_lock_irqsave(&ioc->scsi_lookup_lock, flags); ++ smid = 0; ++ for (i = 0; i < ioc->request_depth; i++) { ++ if (ioc->scsi_lookup[i].scmd == scmd) { ++ smid = i + 1; ++ goto out; ++ } ++ } ++ out: ++ spin_unlock_irqrestore(&ioc->scsi_lookup_lock, flags); ++ return smid; ++} ++ ++/** ++ * _scsih_scsi_lookup_find_by_target - search for matching channel:id ++ * @ioc: per adapter object ++ * @id: target id ++ * @channel: channel ++ * Context: This function will acquire ioc->scsi_lookup_lock. ++ * ++ * This will search for a matching channel:id in the scsi_lookup array, ++ * returning 1 if found. ++ */ ++static u8 ++_scsih_scsi_lookup_find_by_target(struct MPT2SAS_ADAPTER *ioc, int id, ++ int channel) ++{ ++ u8 found; ++ unsigned long flags; ++ int i; ++ ++ spin_lock_irqsave(&ioc->scsi_lookup_lock, flags); ++ found = 0; ++ for (i = 0 ; i < ioc->request_depth; i++) { ++ if (ioc->scsi_lookup[i].scmd && ++ (ioc->scsi_lookup[i].scmd->device->id == id && ++ ioc->scsi_lookup[i].scmd->device->channel == channel)) { ++ found = 1; ++ goto out; ++ } ++ } ++ out: ++ spin_unlock_irqrestore(&ioc->scsi_lookup_lock, flags); ++ return found; ++} ++ ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26)) ++/** ++ * _scsih_scsi_lookup_find_by_lun - search for matching channel:id:lun ++ * @ioc: per adapter object ++ * @id: target id ++ * @lun: lun number ++ * @channel: channel ++ * Context: This function will acquire ioc->scsi_lookup_lock. ++ * ++ * This will search for a matching channel:id:lun in the scsi_lookup array, ++ * returning 1 if found. ++ */ ++static u8 ++_scsih_scsi_lookup_find_by_lun(struct MPT2SAS_ADAPTER *ioc, int id, ++ unsigned int lun, int channel) ++{ ++ u8 found; ++ unsigned long flags; ++ int i; ++ ++ spin_lock_irqsave(&ioc->scsi_lookup_lock, flags); ++ found = 0; ++ for (i = 0 ; i < ioc->request_depth; i++) { ++ if (ioc->scsi_lookup[i].scmd && ++ (ioc->scsi_lookup[i].scmd->device->id == id && ++ ioc->scsi_lookup[i].scmd->device->channel == channel && ++ ioc->scsi_lookup[i].scmd->device->lun == lun)) { ++ found = 1; ++ goto out; ++ } ++ } ++ out: ++ spin_unlock_irqrestore(&ioc->scsi_lookup_lock, flags); ++ return found; ++} ++#endif ++ ++#if defined(CHAIN_POOL) ++/** ++ * _scsih_get_chain_buffer_tracker - obtain chain tracker ++ * @ioc: per adapter object ++ * @smid: smid associated to an IO request ++ * ++ * Returns chain tracker(from ioc->free_chain_list) ++ */ ++static struct chain_tracker * ++_scsih_get_chain_buffer_tracker(struct MPT2SAS_ADAPTER *ioc, u16 smid) ++{ ++ struct chain_tracker *chain_req; ++ unsigned long flags; ++ ++ spin_lock_irqsave(&ioc->scsi_lookup_lock, flags); ++ if (list_empty(&ioc->free_chain_list)) { ++ spin_unlock_irqrestore(&ioc->scsi_lookup_lock, flags); ++ printk(MPT2SAS_WARN_FMT "chain buffers not available\n", ++ ioc->name); ++ return NULL; ++ } ++ chain_req = list_entry(ioc->free_chain_list.next, ++ struct chain_tracker, tracker_list); ++ list_del_init(&chain_req->tracker_list); ++ list_add_tail(&chain_req->tracker_list, ++ &ioc->scsi_lookup[smid - 1].chain_list); ++ spin_unlock_irqrestore(&ioc->scsi_lookup_lock, flags); ++ return chain_req; ++} ++ ++/** ++ * _scsih_get_chain_buffer_dma - obtain chain dma address ++ * @ioc: per adapter object ++ * @index: index from zero (ioc->chain) ++ * ++ * Returns phys pointer to chain buffer. ++ */ ++static dma_addr_t ++_scsih_get_chain_buffer_dma(struct MPT2SAS_ADAPTER *ioc, u16 index) ++{ ++ return ioc->chain_dma + (ioc->request_sz * index); ++} ++ ++/** ++ * _scsih_get_chain_buffer - obtain chains virtual addr ++ * @ioc: per adapter object ++ * @index: index from zero (ioc->chain) ++ * ++ * Returns virt pointer to chain buffer. ++ */ ++static void * ++_scsih_get_chain_buffer(struct MPT2SAS_ADAPTER *ioc, u16 index) ++{ ++ return (void *)(ioc->chain + (ioc->request_sz * index)); ++} ++#else ++/** ++ * _scsih_get_chain_buffer_dma - obtain block of chains (dma address) ++ * @ioc: per adapter object ++ * @smid: system request message index ++ * ++ * Returns phys pointer to chain buffer. ++ */ ++static dma_addr_t ++_scsih_get_chain_buffer_dma(struct MPT2SAS_ADAPTER *ioc, u16 smid) ++{ ++ return ioc->chain_dma + ((smid - 1) * (ioc->request_sz * ++ ioc->chains_needed_per_io)); ++} ++ ++/** ++ * _scsih_get_chain_buffer - obtain block of chains assigned to a mf request ++ * @ioc: per adapter object ++ * @smid: system request message index ++ * ++ * Returns virt pointer to chain buffer. ++ */ ++static void * ++_scsih_get_chain_buffer(struct MPT2SAS_ADAPTER *ioc, u16 smid) ++{ ++ return (void *)(ioc->chain + ((smid - 1) * (ioc->request_sz * ++ ioc->chains_needed_per_io))); ++} ++#endif ++ ++/** ++ * _scsih_build_scatter_gather - main sg creation routine ++ * @ioc: per adapter object ++ * @scmd: scsi command ++ * @smid: system request message index ++ * Context: none. ++ * ++ * The main routine that builds scatter gather table from a given ++ * scsi request sent via the .queuecommand main handler. ++ * ++ * Returns 0 success, anything else error ++ */ ++static int ++_scsih_build_scatter_gather(struct MPT2SAS_ADAPTER *ioc, ++ struct scsi_cmnd *scmd, u16 smid) ++{ ++ Mpi2SCSIIORequest_t *mpi_request; ++ dma_addr_t chain_dma; ++ struct scatterlist *sg_scmd; ++ void *sg_local, *chain; ++ u32 chain_offset; ++ u32 chain_length; ++ u32 chain_flags; ++ u32 sges_left; ++ u32 sges_in_segment; ++ u32 sgl_flags; ++ u32 sgl_flags_last_element; ++ u32 sgl_flags_end_buffer; ++#if defined(CHAIN_POOL) ++ struct chain_tracker *chain_req; ++#endif ++ ++ mpi_request = mpt2sas_base_get_msg_frame(ioc, smid); ++ ++ /* init scatter gather flags */ ++ sgl_flags = MPI2_SGE_FLAGS_SIMPLE_ELEMENT; ++ if (scmd->sc_data_direction == DMA_TO_DEVICE) ++ sgl_flags |= MPI2_SGE_FLAGS_HOST_TO_IOC; ++ sgl_flags_last_element = (sgl_flags | MPI2_SGE_FLAGS_LAST_ELEMENT) ++ << MPI2_SGE_FLAGS_SHIFT; ++ sgl_flags_end_buffer = (sgl_flags | MPI2_SGE_FLAGS_LAST_ELEMENT | ++ MPI2_SGE_FLAGS_END_OF_BUFFER | MPI2_SGE_FLAGS_END_OF_LIST) ++ << MPI2_SGE_FLAGS_SHIFT; ++ sgl_flags = sgl_flags << MPI2_SGE_FLAGS_SHIFT; ++ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)) ++ /* single buffer sge */ ++ if (!scmd->use_sg) { ++ scmd->SCp.dma_handle = pci_map_single(ioc->pdev, ++ scmd->request_buffer, scmd->request_bufflen, ++ scmd->sc_data_direction); ++ if (pci_dma_mapping_error(scmd->SCp.dma_handle)) { ++ sdev_printk(KERN_ERR, scmd->device, "pci_map_single" ++ " failed: request for %d bytes!\n", ++ scmd->request_bufflen); ++ return -ENOMEM; ++ } ++ ioc->base_add_sg_single(&mpi_request->SGL, ++ sgl_flags_end_buffer | scmd->request_bufflen, ++ scmd->SCp.dma_handle); ++ return 0; ++ } ++ ++ /* sg list provided */ ++ sg_scmd = (struct scatterlist *) scmd->request_buffer; ++ sges_left = pci_map_sg(ioc->pdev, sg_scmd, scmd->use_sg, ++ scmd->sc_data_direction); ++ ++#if defined(CRACK_MONKEY_EEDP) && defined(EEDP_SUPPORT) ++ if (scmd->cmnd[0] == INQUIRY) { ++ scmd->host_scribble = ++ page_address(((struct scatterlist *) ++ scmd->request_buffer)[0].page)+ ++ ((struct scatterlist *) ++ scmd->request_buffer)[0].offset; ++ } ++#endif /* CRACK_MONKEY_EEDP */ ++ if (!sges_left) { ++ sdev_printk(KERN_ERR, scmd->device, "pci_map_sg" ++ " failed: request for %d bytes!\n", scmd->request_bufflen); ++ return -ENOMEM; ++ } ++#else ++ sg_scmd = scsi_sglist(scmd); ++ sges_left = scsi_dma_map(scmd); ++ if (!sges_left) { ++ sdev_printk(KERN_ERR, scmd->device, "pci_map_sg" ++ " failed: request for %d bytes!\n", scsi_bufflen(scmd)); ++ return -ENOMEM; ++ } ++ ++#if defined(CRACK_MONKEY_EEDP) && defined(EEDP_SUPPORT) ++ if (scmd->cmnd[0] == INQUIRY) ++ scmd->host_scribble = page_address(sg_page(sg_scmd)) + ++ sg_scmd[0].offset; ++#endif /* CRACK_MONKEY_EEDP */ ++#endif ++ ++ ++ sg_local = &mpi_request->SGL; ++ sges_in_segment = ioc->max_sges_in_main_message; ++ if (sges_left <= sges_in_segment) ++ goto fill_in_last_segment; ++ ++ mpi_request->ChainOffset = (offsetof(Mpi2SCSIIORequest_t, SGL) + ++ (sges_in_segment * ioc->sge_size))/4; ++ ++ /* fill in main message segment when there is a chain following */ ++ while (sges_in_segment) { ++ if (sges_in_segment == 1) ++ ioc->base_add_sg_single(sg_local, ++ sgl_flags_last_element | sg_dma_len(sg_scmd), ++ sg_dma_address(sg_scmd)); ++ else ++ ioc->base_add_sg_single(sg_local, sgl_flags | ++ sg_dma_len(sg_scmd), sg_dma_address(sg_scmd)); ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) ++ sg_scmd++; ++#else ++ sg_scmd = sg_next(sg_scmd); ++#endif ++ sg_local += ioc->sge_size; ++ sges_left--; ++ sges_in_segment--; ++ } ++ ++ /* initializing the chain flags and pointers */ ++ chain_flags = MPI2_SGE_FLAGS_CHAIN_ELEMENT << MPI2_SGE_FLAGS_SHIFT; ++#if defined(CHAIN_POOL) ++ chain_req = _scsih_get_chain_buffer_tracker(ioc, smid); ++ if (!chain_req) ++ return -1; ++ chain = _scsih_get_chain_buffer(ioc, chain_req->index); ++ chain_dma = _scsih_get_chain_buffer_dma(ioc, chain_req->index); ++#else ++ chain = _scsih_get_chain_buffer(ioc, smid); ++ chain_dma = _scsih_get_chain_buffer_dma(ioc, smid); ++#endif ++ do { ++ sges_in_segment = (sges_left <= ++ ioc->max_sges_in_chain_message) ? sges_left : ++ ioc->max_sges_in_chain_message; ++ chain_offset = (sges_left == sges_in_segment) ? ++ 0 : (sges_in_segment * ioc->sge_size)/4; ++ chain_length = sges_in_segment * ioc->sge_size; ++ if (chain_offset) { ++ chain_offset = chain_offset << ++ MPI2_SGE_CHAIN_OFFSET_SHIFT; ++ chain_length += ioc->sge_size; ++ } ++ ioc->base_add_sg_single(sg_local, chain_flags | chain_offset | ++ chain_length, chain_dma); ++ sg_local = chain; ++ if (!chain_offset) ++ goto fill_in_last_segment; ++ ++ /* fill in chain segments */ ++ while (sges_in_segment) { ++ if (sges_in_segment == 1) ++ ioc->base_add_sg_single(sg_local, ++ sgl_flags_last_element | ++ sg_dma_len(sg_scmd), ++ sg_dma_address(sg_scmd)); ++ else ++ ioc->base_add_sg_single(sg_local, sgl_flags | ++ sg_dma_len(sg_scmd), ++ sg_dma_address(sg_scmd)); ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) ++ sg_scmd++; ++#else ++ sg_scmd = sg_next(sg_scmd); ++#endif ++ sg_local += ioc->sge_size; ++ sges_left--; ++ sges_in_segment--; ++ } ++ ++#if defined(CHAIN_POOL) ++ chain_req = _scsih_get_chain_buffer_tracker(ioc, smid); ++ if (!chain_req) ++ return -1; ++ chain = _scsih_get_chain_buffer(ioc, chain_req->index); ++ chain_dma = _scsih_get_chain_buffer_dma(ioc, chain_req->index); ++#else ++ chain_dma += ioc->request_sz; ++ chain += ioc->request_sz; ++#endif ++ } while (1); ++ ++ ++ fill_in_last_segment: ++ ++ /* fill the last segment */ ++ while (sges_left) { ++ if (sges_left == 1) ++ ioc->base_add_sg_single(sg_local, sgl_flags_end_buffer | ++ sg_dma_len(sg_scmd), sg_dma_address(sg_scmd)); ++ else ++ ioc->base_add_sg_single(sg_local, sgl_flags | ++ sg_dma_len(sg_scmd), sg_dma_address(sg_scmd)); ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) ++ sg_scmd++; ++#else ++ sg_scmd = sg_next(sg_scmd); ++#endif ++ sg_local += ioc->sge_size; ++ sges_left--; ++ } ++ ++ return 0; ++} ++ ++/** ++ * _scsih_change_queue_depth - setting device queue depth ++ * @sdev: scsi device struct ++ * @qdepth: requested queue depth ++ * ++ * Returns queue depth. ++ */ ++static int ++_scsih_change_queue_depth(struct scsi_device *sdev, int qdepth) ++{ ++ struct Scsi_Host *shost = sdev->host; ++ int max_depth; ++ int tag_type; ++ ++ max_depth = shost->can_queue; ++ if (!sdev->tagged_supported) ++ max_depth = 1; ++ if (qdepth > max_depth) ++ qdepth = max_depth; ++ tag_type = (qdepth == 1) ? 0 : MSG_SIMPLE_TAG; ++ scsi_adjust_queue_depth(sdev, tag_type, qdepth); ++ ++ if (sdev->inquiry_len > 7) ++ sdev_printk(KERN_INFO, sdev, "qdepth(%d), tagged(%d), " ++ "simple(%d), ordered(%d), scsi_level(%d), cmd_que(%d)\n", ++ sdev->queue_depth, sdev->tagged_supported, sdev->simple_tags, ++ sdev->ordered_tags, sdev->scsi_level, ++ (sdev->inquiry[7] & 2) >> 1); ++ ++ return sdev->queue_depth; ++} ++ ++/** ++ * _scsih_change_queue_type - changing device queue tag type ++ * @sdev: scsi device struct ++ * @tag_type: requested tag type ++ * ++ * Returns queue tag type. ++ */ ++static int ++_scsih_change_queue_type(struct scsi_device *sdev, int tag_type) ++{ ++ if (sdev->tagged_supported) { ++ scsi_set_tag_type(sdev, tag_type); ++ if (tag_type) ++ scsi_activate_tcq(sdev, sdev->queue_depth); ++ else ++ scsi_deactivate_tcq(sdev, sdev->queue_depth); ++ } else ++ tag_type = 0; ++ ++ return tag_type; ++} ++ ++/** ++ * _scsih_target_alloc - target add routine ++ * @starget: scsi target struct ++ * ++ * Returns 0 if ok. Any other return is assumed to be an error and ++ * the device is ignored. ++ */ ++static int ++_scsih_target_alloc(struct scsi_target *starget) ++{ ++ struct Scsi_Host *shost = dev_to_shost(&starget->dev); ++ struct MPT2SAS_ADAPTER *ioc = shost_private(shost); ++ struct MPT2SAS_TARGET *sas_target_priv_data; ++ struct _sas_device *sas_device; ++ struct _raid_device *raid_device; ++ unsigned long flags; ++ struct sas_rphy *rphy; ++ ++ sas_target_priv_data = kzalloc(sizeof(struct scsi_target), GFP_KERNEL); ++ if (!sas_target_priv_data) ++ return -ENOMEM; ++ ++ starget->hostdata = sas_target_priv_data; ++ sas_target_priv_data->starget = starget; ++ sas_target_priv_data->handle = MPT2SAS_INVALID_DEVICE_HANDLE; ++ ++ /* RAID volumes */ ++ if (starget->channel == RAID_CHANNEL) { ++ spin_lock_irqsave(&ioc->raid_device_lock, flags); ++ raid_device = _scsih_raid_device_find_by_id(ioc, starget->id, ++ starget->channel); ++ if (raid_device) { ++ sas_target_priv_data->handle = raid_device->handle; ++ sas_target_priv_data->sas_address = raid_device->wwid; ++ sas_target_priv_data->flags |= MPT_TARGET_FLAGS_VOLUME; ++ raid_device->starget = starget; ++ } ++ spin_unlock_irqrestore(&ioc->raid_device_lock, flags); ++ return 0; ++ } ++ ++ /* sas/sata devices */ ++ spin_lock_irqsave(&ioc->sas_device_lock, flags); ++ rphy = dev_to_rphy(starget->dev.parent); ++ sas_device = mpt2sas_scsih_sas_device_find_by_sas_address(ioc, ++ rphy->identify.sas_address); ++ ++ if (sas_device) { ++ sas_target_priv_data->handle = sas_device->handle; ++ sas_target_priv_data->sas_address = sas_device->sas_address; ++ sas_device->starget = starget; ++ sas_device->id = starget->id; ++ sas_device->channel = starget->channel; ++ if (sas_device->hidden_raid_component) ++ sas_target_priv_data->flags |= ++ MPT_TARGET_FLAGS_RAID_COMPONENT; ++ } ++ spin_unlock_irqrestore(&ioc->sas_device_lock, flags); ++ ++ return 0; ++} ++ ++/** ++ * _scsih_target_destroy - target destroy routine ++ * @starget: scsi target struct ++ * ++ * Returns nothing. ++ */ ++static void ++_scsih_target_destroy(struct scsi_target *starget) ++{ ++ struct Scsi_Host *shost = dev_to_shost(&starget->dev); ++ struct MPT2SAS_ADAPTER *ioc = shost_private(shost); ++ struct MPT2SAS_TARGET *sas_target_priv_data; ++ struct _sas_device *sas_device; ++ struct _raid_device *raid_device; ++ unsigned long flags; ++ struct sas_rphy *rphy; ++ ++ sas_target_priv_data = starget->hostdata; ++ if (!sas_target_priv_data) ++ return; ++ ++ if (starget->channel == RAID_CHANNEL) { ++ spin_lock_irqsave(&ioc->raid_device_lock, flags); ++ raid_device = _scsih_raid_device_find_by_id(ioc, starget->id, ++ starget->channel); ++ if (raid_device) { ++ raid_device->starget = NULL; ++ raid_device->sdev = NULL; ++ } ++ spin_unlock_irqrestore(&ioc->raid_device_lock, flags); ++ goto out; ++ } ++ ++ spin_lock_irqsave(&ioc->sas_device_lock, flags); ++ rphy = dev_to_rphy(starget->dev.parent); ++ sas_device = mpt2sas_scsih_sas_device_find_by_sas_address(ioc, ++ rphy->identify.sas_address); ++ if (sas_device && (sas_device->starget == starget) && ++ (sas_device->id == starget->id) && ++ (sas_device->channel == starget->channel)) ++ sas_device->starget = NULL; ++ ++ spin_unlock_irqrestore(&ioc->sas_device_lock, flags); ++ ++ out: ++ kfree(sas_target_priv_data); ++ starget->hostdata = NULL; ++} ++ ++/** ++ * _scsih_slave_alloc - device add routine ++ * @sdev: scsi device struct ++ * ++ * Returns 0 if ok. Any other return is assumed to be an error and ++ * the device is ignored. ++ */ ++static int ++_scsih_slave_alloc(struct scsi_device *sdev) ++{ ++ struct Scsi_Host *shost; ++ struct MPT2SAS_ADAPTER *ioc; ++ struct MPT2SAS_TARGET *sas_target_priv_data; ++ struct MPT2SAS_DEVICE *sas_device_priv_data; ++ struct scsi_target *starget; ++ struct _raid_device *raid_device; ++ unsigned long flags; ++ ++ sas_device_priv_data = kzalloc(sizeof(struct scsi_device), GFP_KERNEL); ++ if (!sas_device_priv_data) ++ return -ENOMEM; ++ ++ sas_device_priv_data->lun = sdev->lun; ++ sas_device_priv_data->flags = MPT_DEVICE_FLAGS_INIT; ++ ++ starget = scsi_target(sdev); ++ sas_target_priv_data = starget->hostdata; ++ sas_target_priv_data->num_luns++; ++ sas_device_priv_data->sas_target = sas_target_priv_data; ++ sdev->hostdata = sas_device_priv_data; ++ if ((sas_target_priv_data->flags & MPT_TARGET_FLAGS_RAID_COMPONENT)) ++ sdev->no_uld_attach = 1; ++ ++ shost = dev_to_shost(&starget->dev); ++ ioc = shost_private(shost); ++ if (starget->channel == RAID_CHANNEL) { ++ spin_lock_irqsave(&ioc->raid_device_lock, flags); ++ raid_device = _scsih_raid_device_find_by_id(ioc, ++ starget->id, starget->channel); ++ if (raid_device) ++ raid_device->sdev = sdev; /* raid is single lun */ ++ spin_unlock_irqrestore(&ioc->raid_device_lock, flags); ++ } ++ ++ return 0; ++} ++ ++/** ++ * _scsih_slave_destroy - device destroy routine ++ * @sdev: scsi device struct ++ * ++ * Returns nothing. ++ */ ++static void ++_scsih_slave_destroy(struct scsi_device *sdev) ++{ ++ struct MPT2SAS_TARGET *sas_target_priv_data; ++ struct scsi_target *starget; ++ ++ if (!sdev->hostdata) ++ return; ++ ++ starget = scsi_target(sdev); ++ sas_target_priv_data = starget->hostdata; ++ sas_target_priv_data->num_luns--; ++ kfree(sdev->hostdata); ++ sdev->hostdata = NULL; ++} ++ ++/** ++ * _scsih_display_sata_capabilities - sata capabilities ++ * @ioc: per adapter object ++ * @sas_device: the sas_device object ++ * @sdev: scsi device struct ++ */ ++static void ++_scsih_display_sata_capabilities(struct MPT2SAS_ADAPTER *ioc, ++ struct _sas_device *sas_device, struct scsi_device *sdev) ++{ ++ Mpi2ConfigReply_t mpi_reply; ++ Mpi2SasDevicePage0_t sas_device_pg0; ++ u32 ioc_status; ++ u16 flags; ++ u32 device_info; ++ ++ if ((mpt2sas_config_get_sas_device_pg0(ioc, &mpi_reply, &sas_device_pg0, ++ MPI2_SAS_DEVICE_PGAD_FORM_HANDLE, sas_device->handle))) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ return; ++ } ++ ++ ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & ++ MPI2_IOCSTATUS_MASK; ++ if (ioc_status != MPI2_IOCSTATUS_SUCCESS) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ return; ++ } ++ ++ flags = le16_to_cpu(sas_device_pg0.Flags); ++ device_info = le16_to_cpu(sas_device_pg0.DeviceInfo); ++ ++ sdev_printk(KERN_INFO, sdev, ++ "atapi(%s), ncq(%s), asyn_notify(%s), smart(%s), fua(%s), " ++ "sw_preserve(%s)\n", ++ (device_info & MPI2_SAS_DEVICE_INFO_ATAPI_DEVICE) ? "y" : "n", ++ (flags & MPI2_SAS_DEVICE0_FLAGS_SATA_NCQ_SUPPORTED) ? "y" : "n", ++ (flags & MPI2_SAS_DEVICE0_FLAGS_SATA_ASYNCHRONOUS_NOTIFY) ? "y" : ++ "n", ++ (flags & MPI2_SAS_DEVICE0_FLAGS_SATA_SMART_SUPPORTED) ? "y" : "n", ++ (flags & MPI2_SAS_DEVICE0_FLAGS_SATA_FUA_SUPPORTED) ? "y" : "n", ++ (flags & MPI2_SAS_DEVICE0_FLAGS_SATA_SW_PRESERVE) ? "y" : "n"); ++} ++ ++/** ++ * _scsih_get_volume_capabilities - volume capabilities ++ * @ioc: per adapter object ++ * @sas_device: the raid_device object ++ */ ++static void ++_scsih_get_volume_capabilities(struct MPT2SAS_ADAPTER *ioc, ++ struct _raid_device *raid_device) ++{ ++ Mpi2RaidVolPage0_t *vol_pg0; ++ Mpi2RaidPhysDiskPage0_t pd_pg0; ++ Mpi2SasDevicePage0_t sas_device_pg0; ++ Mpi2ConfigReply_t mpi_reply; ++ u16 sz; ++ u8 num_pds; ++ ++ if ((mpt2sas_config_get_number_pds(ioc, raid_device->handle, ++ &num_pds)) || !num_pds) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ return; ++ } ++ ++ raid_device->num_pds = num_pds; ++ sz = offsetof(Mpi2RaidVolPage0_t, PhysDisk) + (num_pds * ++ sizeof(Mpi2RaidVol0PhysDisk_t)); ++ vol_pg0 = kzalloc(sz, GFP_KERNEL); ++ if (!vol_pg0) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ return; ++ } ++ ++ if ((mpt2sas_config_get_raid_volume_pg0(ioc, &mpi_reply, vol_pg0, ++ MPI2_RAID_VOLUME_PGAD_FORM_HANDLE, raid_device->handle, sz))) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ kfree(vol_pg0); ++ return; ++ } ++ ++ raid_device->volume_type = vol_pg0->VolumeType; ++ ++ /* figure out what the underlying devices are by ++ * obtaining the device_info bits for the 1st device ++ */ ++ if (!(mpt2sas_config_get_phys_disk_pg0(ioc, &mpi_reply, ++ &pd_pg0, MPI2_PHYSDISK_PGAD_FORM_PHYSDISKNUM, ++ vol_pg0->PhysDisk[0].PhysDiskNum))) { ++ if (!(mpt2sas_config_get_sas_device_pg0(ioc, &mpi_reply, ++ &sas_device_pg0, MPI2_SAS_DEVICE_PGAD_FORM_HANDLE, ++ le16_to_cpu(pd_pg0.DevHandle)))) { ++ raid_device->device_info = ++ le32_to_cpu(sas_device_pg0.DeviceInfo); ++ } ++ } ++ ++ kfree(vol_pg0); ++} ++ ++#ifdef MPT2SAS_MULTIPATH ++/** ++ * _scsih_detect_multipath - find vpd-sn, and dual path ++ * @ioc: ++ * @sdev: scsi device struct ++ * @sas_device: ++ * ++ */ ++static void ++_scsih_detect_multipath(struct MPT2SAS_ADAPTER *ioc, struct scsi_device *sdev, ++ struct _sas_device *sas_device) ++{ ++ struct _sas_device *sas_device_alt; ++ u8 data[252], len; ++ struct MPT2SAS_ADAPTER *ioc_alt; ++ ++ if (mpt2sas_multipath == -1 || mpt2sas_multipath == 0) ++ return; ++ ++ if (sdev->type != TYPE_DISK) ++ return; ++ ++ if (sas_device->serial_number != NULL) ++ return; ++ ++ if (_scsih_inquiry_vpd_sn(ioc, sas_device->handle, data, 252) ++ != DEVICE_READY) ++ return; ++ ++ len = strlen(&data[4]) + 1; ++ sas_device->serial_number = kmalloc(len, GFP_KERNEL); ++ if (!sas_device->serial_number) ++ return; ++ ++ strncpy(sas_device->serial_number, &data[4], len); ++ sdev_printk(KERN_INFO, sdev, "serial_number(%s)\n", ++ sas_device->serial_number); ++ list_for_each_entry(ioc_alt, &mpt2sas_ioc_list, list) { ++ list_for_each_entry(sas_device_alt, &ioc_alt->sas_device_list, ++ list) { ++ if (sas_device_alt == sas_device) ++ continue; ++ if (sas_device_alt->serial_number == NULL) ++ continue; ++ if (strcmp(sas_device_alt->serial_number, ++ sas_device->serial_number) != 0) ++ continue; ++ sas_device->ioc = ioc; ++ sas_device->sas_device_alt = sas_device_alt; ++ sas_device_alt->sas_device_alt = sas_device; ++ sas_device_alt->ioc = ioc_alt; ++ } ++ } ++} ++#endif ++ ++/** ++ * _scsih_enable_tlr - setting TLR flags ++ * @ioc: per adapter object ++ * @sdev: scsi device struct ++ * ++ * Enabling Transaction Layer Retries for tape devices when ++ * vpd page 0x90 is present ++ * ++ */ ++static void ++_scsih_enable_tlr(struct MPT2SAS_ADAPTER *ioc, struct scsi_device *sdev) ++{ ++ u8 data[30]; ++ u8 page_len, ii; ++ struct MPT2SAS_DEVICE *sas_device_priv_data; ++ struct MPT2SAS_TARGET *sas_target_priv_data; ++ ++ /* only for TAPE */ ++ if (sdev->type != TYPE_TAPE) ++ return; ++ ++ if (!(ioc->facts.IOCCapabilities & MPI2_IOCFACTS_CAPABILITY_TLR)) ++ return; ++ ++ sas_device_priv_data = sdev->hostdata; ++ if (!sas_device_priv_data) ++ return; ++ sas_target_priv_data = sas_device_priv_data->sas_target; ++ if (!sas_target_priv_data) ++ return; ++ ++ /* is Protocol-specific logical unit information (0x90) present ?? */ ++ if (_scsih_inquiry_vpd_supported_pages(ioc, ++ sas_target_priv_data->handle, sdev->lun, data, ++ sizeof(data)) != DEVICE_READY) ++ return; ++ ++ page_len = data[3]; ++ for (ii = 4; ii < page_len + 4; ii++) { ++ if (data[ii] == 0x90) { ++ sas_device_priv_data->flags |= MPT_DEVICE_TLR_ON; ++ return; ++ } ++ } ++} ++ ++/** ++ * _scsih_slave_configure - device configure routine. ++ * @sdev: scsi device struct ++ * ++ * Returns 0 if ok. Any other return is assumed to be an error and ++ * the device is ignored. ++ */ ++static int ++_scsih_slave_configure(struct scsi_device *sdev) ++{ ++ struct Scsi_Host *shost = sdev->host; ++ struct MPT2SAS_ADAPTER *ioc = shost_private(shost); ++ struct MPT2SAS_DEVICE *sas_device_priv_data; ++ struct MPT2SAS_TARGET *sas_target_priv_data; ++ struct _sas_device *sas_device; ++ struct _raid_device *raid_device; ++ unsigned long flags; ++ int qdepth; ++ u8 ssp_target = 0; ++ char *ds = ""; ++ char *r_level = ""; ++ ++ qdepth = 1; ++ sas_device_priv_data = sdev->hostdata; ++ sas_device_priv_data->configured_lun = 1; ++ sas_device_priv_data->flags &= ~MPT_DEVICE_FLAGS_INIT; ++ sas_target_priv_data = sas_device_priv_data->sas_target; ++ ++ /* raid volume handling */ ++ if (sas_target_priv_data->flags & MPT_TARGET_FLAGS_VOLUME) { ++ ++ spin_lock_irqsave(&ioc->raid_device_lock, flags); ++ raid_device = _scsih_raid_device_find_by_handle(ioc, ++ sas_target_priv_data->handle); ++ spin_unlock_irqrestore(&ioc->raid_device_lock, flags); ++ if (!raid_device) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ return 0; ++ } ++ ++ _scsih_get_volume_capabilities(ioc, raid_device); ++ ++ /* RAID Queue Depth Support ++ * IS volume = underlying qdepth of drive type, either ++ * MPT2SAS_SAS_QUEUE_DEPTH or MPT2SAS_SATA_QUEUE_DEPTH ++ * IM/IME/R10 = 128 (MPT2SAS_RAID_QUEUE_DEPTH) ++ */ ++ if (raid_device->device_info & ++ MPI2_SAS_DEVICE_INFO_SSP_TARGET) { ++ qdepth = MPT2SAS_SAS_QUEUE_DEPTH; ++ ds = "SSP"; ++ } else { ++ qdepth = MPT2SAS_SATA_QUEUE_DEPTH; ++ if (raid_device->device_info & ++ MPI2_SAS_DEVICE_INFO_SATA_DEVICE) ++ ds = "SATA"; ++ else ++ ds = "STP"; ++ } ++ ++ switch (raid_device->volume_type) { ++ case MPI2_RAID_VOL_TYPE_RAID0: ++ r_level = "RAID0"; ++ break; ++ case MPI2_RAID_VOL_TYPE_RAID1E: ++ qdepth = MPT2SAS_RAID_QUEUE_DEPTH; ++ if (ioc->manu_pg10.OEMIdentifier && ++ (ioc->manu_pg10.GenericFlags0 & ++ MFG10_GF0_R10_DISPLAY) && ++ !(raid_device->num_pds % 2)) ++ r_level = "RAID10"; ++ else ++ r_level = "RAID1E"; ++ break; ++ case MPI2_RAID_VOL_TYPE_RAID1: ++ qdepth = MPT2SAS_RAID_QUEUE_DEPTH; ++ r_level = "RAID1"; ++ break; ++ case MPI2_RAID_VOL_TYPE_RAID10: ++ qdepth = MPT2SAS_RAID_QUEUE_DEPTH; ++ r_level = "RAID10"; ++ break; ++ case MPI2_RAID_VOL_TYPE_UNKNOWN: ++ default: ++ qdepth = MPT2SAS_RAID_QUEUE_DEPTH; ++ r_level = "RAIDX"; ++ break; ++ } ++ ++ sdev_printk(KERN_INFO, sdev, "%s: " ++ "handle(0x%04x), wwid(0x%016llx), pd_count(%d), type(%s)\n", ++ r_level, raid_device->handle, ++ (unsigned long long)raid_device->wwid, ++ raid_device->num_pds, ds); ++ _scsih_change_queue_depth(sdev, qdepth); ++ return 0; ++ } ++ ++ /* non-raid handling */ ++ spin_lock_irqsave(&ioc->sas_device_lock, flags); ++ sas_device = mpt2sas_scsih_sas_device_find_by_sas_address(ioc, ++ sas_device_priv_data->sas_target->sas_address); ++ spin_unlock_irqrestore(&ioc->sas_device_lock, flags); ++ if (sas_device) { ++ if (sas_target_priv_data->flags & ++ MPT_TARGET_FLAGS_RAID_COMPONENT) { ++ mpt2sas_config_get_volume_handle(ioc, ++ sas_device->handle, &sas_device->volume_handle); ++ mpt2sas_config_get_volume_wwid(ioc, ++ sas_device->volume_handle, ++ &sas_device->volume_wwid); ++ } ++ if (sas_device->device_info & MPI2_SAS_DEVICE_INFO_SSP_TARGET) { ++ qdepth = MPT2SAS_SAS_QUEUE_DEPTH; ++ ssp_target = 1; ++ ds = "SSP"; ++ } else { ++ qdepth = MPT2SAS_SATA_QUEUE_DEPTH; ++ if (sas_device->device_info & ++ MPI2_SAS_DEVICE_INFO_STP_TARGET) ++ ds = "STP"; ++ else if (sas_device->device_info & ++ MPI2_SAS_DEVICE_INFO_SATA_DEVICE) ++ ds = "SATA"; ++ } ++ ++ sdev_printk(KERN_INFO, sdev, "%s: handle(0x%04x), " ++ "sas_addr(0x%016llx), device_name(0x%016llx)\n", ++ ds, sas_device->handle, ++ (unsigned long long)sas_device->sas_address, ++ (unsigned long long)sas_device->device_name); ++ sdev_printk(KERN_INFO, sdev, "%s: " ++ "enclosure_logical_id(0x%016llx), slot(%d)\n", ds, ++ (unsigned long long)sas_device->enclosure_logical_id, ++ sas_device->slot); ++ ++ if (!ssp_target) ++ _scsih_display_sata_capabilities(ioc, sas_device, sdev); ++ ++#ifdef MPT2SAS_MULTIPATH ++ _scsih_detect_multipath(ioc, sdev, sas_device); ++#endif ++ } ++ ++ _scsih_change_queue_depth(sdev, qdepth); ++ ++ if (ssp_target) { ++ sas_read_port_mode_page(sdev); ++ _scsih_enable_tlr(ioc, sdev); ++ } ++ ++#if defined(EEDP_SUPPORT) ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27)) ++ if (ssp_target && (!(sas_target_priv_data->flags & ++ MPT_TARGET_FLAGS_RAID_COMPONENT))) { ++ struct read_cap_parameter data; ++ enum device_responsive_state retcode; ++ u8 retry_count = 0; ++ ++ if (!(sdev->inquiry[5] & 1)) ++ goto out; ++ retry: ++ /* issue one retry to handle UA's */ ++ memset(&data, 0, sizeof(struct read_cap_parameter)); ++ retcode = _scsih_read_capacity_16(ioc, ++ sas_target_priv_data->handle, sdev->lun, &data, ++ sizeof(struct read_cap_parameter)); ++ ++ if ((retcode == DEVICE_RETRY || retcode == DEVICE_RETRY_UA) ++ && (!retry_count++)) ++ goto retry; ++ if (retcode != DEVICE_READY) ++ goto out; ++ if (!data.prot_en) ++ goto out; ++ sas_device_priv_data->eedp_type = data.p_type + 1; ++ ++ if (sas_device_priv_data->eedp_type == 2) { ++ sdev_printk(KERN_INFO, sdev, "formatted with " ++ "DIF Type 2 protection which is currently " ++ "unsupported. \n"); ++ goto out; ++ } ++ ++ sas_device_priv_data->eedp_enable = 1; ++ sdev_printk(KERN_INFO, sdev, "Enabling DIF Type %d " ++ "protection\n", sas_device_priv_data->eedp_type); ++ } ++ out: ++#endif ++#endif /* EEDP Support */ ++ return 0; ++} ++ ++/** ++ * _scsih_bios_param - fetch head, sector, cylinder info for a disk ++ * @sdev: scsi device struct ++ * @bdev: pointer to block device context ++ * @capacity: device size (in 512 byte sectors) ++ * @params: three element array to place output: ++ * params[0] number of heads (max 255) ++ * params[1] number of sectors (max 63) ++ * params[2] number of cylinders ++ * ++ * Return nothing. ++ */ ++static int ++_scsih_bios_param(struct scsi_device *sdev, struct block_device *bdev, ++ sector_t capacity, int params[]) ++{ ++ int heads; ++ int sectors; ++ sector_t cylinders; ++ ulong dummy; ++ ++ heads = 64; ++ sectors = 32; ++ ++ dummy = heads * sectors; ++ cylinders = capacity; ++ sector_div(cylinders, dummy); ++ ++ /* ++ * Handle extended translation size for logical drives ++ * > 1Gb ++ */ ++ if ((ulong)capacity >= 0x200000) { ++ heads = 255; ++ sectors = 63; ++ dummy = heads * sectors; ++ cylinders = capacity; ++ sector_div(cylinders, dummy); ++ } ++ ++ /* return result */ ++ params[0] = heads; ++ params[1] = sectors; ++ params[2] = cylinders; ++ ++ return 0; ++} ++ ++/** ++ * _scsih_response_code - translation of device response code ++ * @ioc: per adapter object ++ * @response_code: response code returned by the device ++ * ++ * Return nothing. ++ */ ++static void ++_scsih_response_code(struct MPT2SAS_ADAPTER *ioc, u8 response_code) ++{ ++ char *desc; ++ ++ switch (response_code) { ++ case MPI2_SCSITASKMGMT_RSP_TM_COMPLETE: ++ desc = "task management request completed"; ++ break; ++ case MPI2_SCSITASKMGMT_RSP_INVALID_FRAME: ++ desc = "invalid frame"; ++ break; ++ case MPI2_SCSITASKMGMT_RSP_TM_NOT_SUPPORTED: ++ desc = "task management request not supported"; ++ break; ++ case MPI2_SCSITASKMGMT_RSP_TM_FAILED: ++ desc = "task management request failed"; ++ break; ++ case MPI2_SCSITASKMGMT_RSP_TM_SUCCEEDED: ++ desc = "task management request succeeded"; ++ break; ++ case MPI2_SCSITASKMGMT_RSP_TM_INVALID_LUN: ++ desc = "invalid lun"; ++ break; ++ case 0xA: ++ desc = "overlapped tag attempted"; ++ break; ++ case MPI2_SCSITASKMGMT_RSP_IO_QUEUED_ON_IOC: ++ desc = "task queued, however not sent to target"; ++ break; ++ default: ++ desc = "unknown"; ++ break; ++ } ++ printk(MPT2SAS_WARN_FMT "response_code(0x%01x): %s\n", ++ ioc->name, response_code, desc); ++} ++ ++/** ++ * _scsih_tm_done - tm completion routine ++ * @ioc: per adapter object ++ * @smid: system request message index ++ * @VF_ID: virtual function id ++ * @reply: reply message frame(lower 32bit addr) ++ * Context: none. ++ * ++ * The callback handler when using scsih_issue_tm. ++ * ++ * Return nothing. ++ */ ++static void ++_scsih_tm_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 VF_ID, u32 reply) ++{ ++ MPI2DefaultReply_t *mpi_reply; ++ ++ if (ioc->tm_cmds.status == MPT2_CMD_NOT_USED) ++ return; ++ if (ioc->tm_cmds.smid != smid) ++ return; ++ ioc->tm_cmds.status |= MPT2_CMD_COMPLETE; ++ mpi_reply = mpt2sas_base_get_reply_virt_addr(ioc, reply); ++ if (mpi_reply) { ++ memcpy(ioc->tm_cmds.reply, mpi_reply, mpi_reply->MsgLength*4); ++ ioc->tm_cmds.status |= MPT2_CMD_REPLY_VALID; ++ } ++ ioc->tm_cmds.status &= ~MPT2_CMD_PENDING; ++ complete(&ioc->tm_cmds.done); ++} ++ ++/** ++ * mpt2sas_scsih_set_tm_flag - set per target tm_busy ++ * @ioc: per adapter object ++ * @handle: device handle ++ * ++ * During taskmangement request, we need to freeze the device queue. ++ */ ++void ++mpt2sas_scsih_set_tm_flag(struct MPT2SAS_ADAPTER *ioc, u16 handle) ++{ ++ struct MPT2SAS_DEVICE *sas_device_priv_data; ++ struct scsi_device *sdev; ++ u8 skip = 0; ++ ++ shost_for_each_device(sdev, ioc->shost) { ++ if (skip) ++ continue; ++ sas_device_priv_data = sdev->hostdata; ++ if (!sas_device_priv_data) ++ continue; ++ if (sas_device_priv_data->sas_target->handle == handle) { ++ sas_device_priv_data->sas_target->tm_busy = 1; ++ skip = 1; ++ ioc->ignore_loginfos = 1; ++ } ++ } ++} ++ ++/** ++ * mpt2sas_scsih_clear_tm_flag - clear per target tm_busy ++ * @ioc: per adapter object ++ * @handle: device handle ++ * ++ * During taskmangement request, we need to freeze the device queue. ++ */ ++void ++mpt2sas_scsih_clear_tm_flag(struct MPT2SAS_ADAPTER *ioc, u16 handle) ++{ ++ struct MPT2SAS_DEVICE *sas_device_priv_data; ++ struct scsi_device *sdev; ++ u8 skip = 0; ++ ++ shost_for_each_device(sdev, ioc->shost) { ++ if (skip) ++ continue; ++ sas_device_priv_data = sdev->hostdata; ++ if (!sas_device_priv_data) ++ continue; ++ if (sas_device_priv_data->sas_target->handle == handle) { ++ sas_device_priv_data->sas_target->tm_busy = 0; ++ skip = 1; ++ ioc->ignore_loginfos = 0; ++ } ++ } ++} ++ ++/** ++ * mpt2sas_scsih_issue_tm - main routine for sending tm requests ++ * @ioc: per adapter struct ++ * @device_handle: device handle ++ * @lun: lun number ++ * @type: MPI2_SCSITASKMGMT_TASKTYPE__XXX (defined in mpi2_init.h) ++ * @smid_task: smid assigned to the task ++ * @timeout: timeout in seconds ++ * Context: The calling function needs to acquire the tm_cmds.mutex ++ * ++ * A generic API for sending task management requests to firmware. ++ * ++ * The ioc->tm_cmds.status flag should be MPT2_CMD_NOT_USED before calling ++ * this API. ++ * ++ * The callback index is set inside `ioc->tm_cb_idx`. ++ * ++ * Return nothing. ++ */ ++void ++mpt2sas_scsih_issue_tm(struct MPT2SAS_ADAPTER *ioc, u16 handle, uint lun, ++ u8 type, u16 smid_task, ulong timeout) ++{ ++ Mpi2SCSITaskManagementRequest_t *mpi_request; ++ Mpi2SCSITaskManagementReply_t *mpi_reply; ++ u16 smid = 0; ++ u32 ioc_state; ++ unsigned long timeleft; ++ u8 VF_ID = 0; ++ ++ if (ioc->tm_cmds.status != MPT2_CMD_NOT_USED) { ++ printk(MPT2SAS_INFO_FMT "%s: tm_cmd busy!!!\n", ++ __func__, ioc->name); ++ return; ++ } ++ ++ if (ioc->shost_recovery) { ++ printk(MPT2SAS_INFO_FMT "%s: host reset in progress!\n", ++ __func__, ioc->name); ++ return; ++ } ++ ++ ioc_state = mpt2sas_base_get_iocstate(ioc, 0); ++ if (ioc_state & MPI2_DOORBELL_USED) { ++ dhsprintk(ioc, printk(MPT2SAS_DEBUG_FMT "unexpected doorbell " ++ "active!\n", ioc->name)); ++ goto issue_host_reset; ++ } ++ ++ if ((ioc_state & MPI2_IOC_STATE_MASK) == MPI2_IOC_STATE_FAULT) { ++ mpt2sas_base_fault_info(ioc, ioc_state & ++ MPI2_DOORBELL_DATA_MASK); ++ goto issue_host_reset; ++ } ++ ++ smid = mpt2sas_base_get_smid(ioc, ioc->tm_cb_idx); ++ if (!smid) { ++ printk(MPT2SAS_ERR_FMT "%s: failed obtaining a smid\n", ++ ioc->name, __func__); ++ return; ++ } ++ ++ dtmprintk(ioc, printk(MPT2SAS_INFO_FMT "sending tm: handle(0x%04x)," ++ " task_type(0x%02x), smid(%d)\n", ioc->name, handle, type, ++ smid_task)); ++ ioc->tm_cmds.status = MPT2_CMD_PENDING; ++ mpi_request = mpt2sas_base_get_msg_frame(ioc, smid); ++ ioc->tm_cmds.smid = smid; ++ memset(mpi_request, 0, sizeof(Mpi2SCSITaskManagementRequest_t)); ++ mpi_request->Function = MPI2_FUNCTION_SCSI_TASK_MGMT; ++ mpi_request->DevHandle = cpu_to_le16(handle); ++ mpi_request->TaskType = type; ++ mpi_request->TaskMID = cpu_to_le16(smid_task); ++ int_to_scsilun(lun, (struct scsi_lun *)mpi_request->LUN); ++ mpt2sas_scsih_set_tm_flag(ioc, handle); ++ init_completion(&ioc->tm_cmds.done); ++ mpt2sas_base_put_smid_hi_priority(ioc, smid, VF_ID); ++ timeleft = wait_for_completion_timeout(&ioc->tm_cmds.done, timeout*HZ); ++ mpt2sas_scsih_clear_tm_flag(ioc, handle); ++ if (!(ioc->tm_cmds.status & MPT2_CMD_COMPLETE)) { ++ printk(MPT2SAS_ERR_FMT "%s: timeout\n", ++ ioc->name, __func__); ++ _debug_dump_mf(mpi_request, ++ sizeof(Mpi2SCSITaskManagementRequest_t)/4); ++ if (!(ioc->tm_cmds.status & MPT2_CMD_RESET)) ++ goto issue_host_reset; ++ } ++ ++ if (ioc->tm_cmds.status & MPT2_CMD_REPLY_VALID) { ++ mpi_reply = ioc->tm_cmds.reply; ++ dtmprintk(ioc, printk(MPT2SAS_INFO_FMT "complete tm: " ++ "ioc_status(0x%04x), loginfo(0x%08x), term_count(0x%08x)\n", ++ ioc->name, le16_to_cpu(mpi_reply->IOCStatus), ++ le32_to_cpu(mpi_reply->IOCLogInfo), ++ le32_to_cpu(mpi_reply->TerminationCount))); ++ if (ioc->logging_level & MPT_DEBUG_TM) { ++ _scsih_response_code(ioc, mpi_reply->ResponseCode); ++ if (mpi_reply->IOCStatus) ++ _debug_dump_mf(mpi_request, ++ sizeof(Mpi2SCSITaskManagementRequest_t)/4); ++ } ++ } ++ ++#ifdef MPT2SAS_MULTIPATH ++ mpt2sas_scsih_check_tm_for_multipath(ioc, handle, type); ++#endif ++ ++ return; ++ issue_host_reset: ++ mpt2sas_base_hard_reset_handler(ioc, CAN_SLEEP, FORCE_BIG_HAMMER); ++} ++ ++/** ++ * _scsih_abort - eh threads main abort routine ++ * @sdev: scsi device struct ++ * ++ * Returns SUCCESS if command aborted else FAILED ++ */ ++static int ++_scsih_abort(struct scsi_cmnd *scmd) ++{ ++ struct MPT2SAS_ADAPTER *ioc = shost_private(scmd->device->host); ++ struct MPT2SAS_DEVICE *sas_device_priv_data; ++ u16 smid; ++ u16 handle; ++ int r; ++ struct scsi_cmnd *scmd_lookup; ++ ++ printk(MPT2SAS_INFO_FMT "attempting task abort! scmd(%p)\n", ++ ioc->name, scmd); ++ scsi_print_command(scmd); ++ ++ sas_device_priv_data = scmd->device->hostdata; ++ if (!sas_device_priv_data || !sas_device_priv_data->sas_target) { ++ printk(MPT2SAS_INFO_FMT "device been deleted! scmd(%p)\n", ++ ioc->name, scmd); ++ scmd->result = DID_NO_CONNECT << 16; ++ scmd->scsi_done(scmd); ++ r = SUCCESS; ++ goto out; ++ } ++ ++ /* search for the command */ ++ smid = _scsih_scsi_lookup_find_by_scmd(ioc, scmd); ++ if (!smid) { ++ scmd->result = DID_RESET << 16; ++ r = SUCCESS; ++ goto out; ++ } ++ ++ /* for hidden raid components and volumes this is not supported */ ++ if (sas_device_priv_data->sas_target->flags & ++ MPT_TARGET_FLAGS_RAID_COMPONENT || ++ sas_device_priv_data->sas_target->flags & MPT_TARGET_FLAGS_VOLUME) { ++ scmd->result = DID_RESET << 16; ++ r = FAILED; ++ goto out; ++ } ++ ++ mutex_lock(&ioc->tm_cmds.mutex); ++ handle = sas_device_priv_data->sas_target->handle; ++ mpt2sas_scsih_issue_tm(ioc, handle, sas_device_priv_data->lun, ++ MPI2_SCSITASKMGMT_TASKTYPE_ABORT_TASK, smid, 30); ++ ++ /* sanity check - see whether command actually completed */ ++ scmd_lookup = _scsih_scsi_lookup_get(ioc, smid); ++ if (scmd_lookup && (scmd_lookup->serial_number == scmd->serial_number)) ++ r = FAILED; ++ else ++ r = SUCCESS; ++ ioc->tm_cmds.status = MPT2_CMD_NOT_USED; ++ mutex_unlock(&ioc->tm_cmds.mutex); ++ ++ out: ++ printk(MPT2SAS_INFO_FMT "task abort: %s scmd(%p)\n", ++ ioc->name, ((r == SUCCESS) ? "SUCCESS" : "FAILED"), scmd); ++ return r; ++} ++ ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26)) ++/** ++ * _scsih_dev_reset - eh threads main device reset routine ++ * @sdev: scsi device struct ++ * ++ * Returns SUCCESS if command aborted else FAILED ++ */ ++static int ++_scsih_dev_reset(struct scsi_cmnd *scmd) ++{ ++ struct MPT2SAS_ADAPTER *ioc = shost_private(scmd->device->host); ++ struct MPT2SAS_DEVICE *sas_device_priv_data; ++ struct _sas_device *sas_device; ++ unsigned long flags; ++ u16 handle; ++ int r; ++ ++ printk(MPT2SAS_INFO_FMT "attempting device reset! scmd(%p)\n", ++ ioc->name, scmd); ++ scsi_print_command(scmd); ++ ++ sas_device_priv_data = scmd->device->hostdata; ++ if (!sas_device_priv_data || !sas_device_priv_data->sas_target) { ++ printk(MPT2SAS_INFO_FMT "device been deleted! scmd(%p)\n", ++ ioc->name, scmd); ++ scmd->result = DID_NO_CONNECT << 16; ++ scmd->scsi_done(scmd); ++ r = SUCCESS; ++ goto out; ++ } ++ ++ /* for hidden raid components obtain the volume_handle */ ++ handle = 0; ++ if (sas_device_priv_data->sas_target->flags & ++ MPT_TARGET_FLAGS_RAID_COMPONENT) { ++ spin_lock_irqsave(&ioc->sas_device_lock, flags); ++ sas_device = _scsih_sas_device_find_by_handle(ioc, ++ sas_device_priv_data->sas_target->handle); ++ if (sas_device) ++ handle = sas_device->volume_handle; ++ spin_unlock_irqrestore(&ioc->sas_device_lock, flags); ++ } else ++ handle = sas_device_priv_data->sas_target->handle; ++ ++ if (!handle) { ++ scmd->result = DID_RESET << 16; ++ r = FAILED; ++ goto out; ++ } ++ ++ mutex_lock(&ioc->tm_cmds.mutex); ++ mpt2sas_scsih_issue_tm(ioc, handle, 0, ++ MPI2_SCSITASKMGMT_TASKTYPE_LOGICAL_UNIT_RESET, scmd->device->lun, ++ 30); ++ ++ /* ++ * sanity check see whether all commands to this device been ++ * completed ++ */ ++ if (_scsih_scsi_lookup_find_by_lun(ioc, scmd->device->id, ++ scmd->device->lun, scmd->device->channel)) ++ r = FAILED; ++ else ++ r = SUCCESS; ++ ioc->tm_cmds.status = MPT2_CMD_NOT_USED; ++ mutex_unlock(&ioc->tm_cmds.mutex); ++ ++ out: ++ printk(MPT2SAS_INFO_FMT "device reset: %s scmd(%p)\n", ++ ioc->name, ((r == SUCCESS) ? "SUCCESS" : "FAILED"), scmd); ++ return r; ++} ++ ++/** ++ * _scsih_target_reset - eh threads main target reset routine ++ * @sdev: scsi device struct ++ * ++ * Returns SUCCESS if command aborted else FAILED ++ */ ++static int ++_scsih_target_reset(struct scsi_cmnd *scmd) ++{ ++ struct MPT2SAS_ADAPTER *ioc = shost_private(scmd->device->host); ++ struct MPT2SAS_DEVICE *sas_device_priv_data; ++ struct _sas_device *sas_device; ++ unsigned long flags; ++ u16 handle; ++ int r; ++ ++ printk(MPT2SAS_INFO_FMT "attempting target reset! scmd(%p)\n", ++ ioc->name, scmd); ++ scsi_print_command(scmd); ++ ++ sas_device_priv_data = scmd->device->hostdata; ++ if (!sas_device_priv_data || !sas_device_priv_data->sas_target) { ++ printk(MPT2SAS_INFO_FMT "target been deleted! scmd(%p)\n", ++ ioc->name, scmd); ++ scmd->result = DID_NO_CONNECT << 16; ++ scmd->scsi_done(scmd); ++ r = SUCCESS; ++ goto out; ++ } ++ ++ /* for hidden raid components obtain the volume_handle */ ++ handle = 0; ++ if (sas_device_priv_data->sas_target->flags & ++ MPT_TARGET_FLAGS_RAID_COMPONENT) { ++ spin_lock_irqsave(&ioc->sas_device_lock, flags); ++ sas_device = _scsih_sas_device_find_by_handle(ioc, ++ sas_device_priv_data->sas_target->handle); ++ if (sas_device) ++ handle = sas_device->volume_handle; ++ spin_unlock_irqrestore(&ioc->sas_device_lock, flags); ++ } else ++ handle = sas_device_priv_data->sas_target->handle; ++ ++ if (!handle) { ++ scmd->result = DID_RESET << 16; ++ r = FAILED; ++ goto out; ++ } ++ ++ mutex_lock(&ioc->tm_cmds.mutex); ++ mpt2sas_scsih_issue_tm(ioc, handle, 0, ++ MPI2_SCSITASKMGMT_TASKTYPE_TARGET_RESET, 0, 30); ++ ++ /* ++ * sanity check see whether all commands to this target been ++ * completed ++ */ ++ if (_scsih_scsi_lookup_find_by_target(ioc, scmd->device->id, ++ scmd->device->channel)) ++ r = FAILED; ++ else ++ r = SUCCESS; ++ ioc->tm_cmds.status = MPT2_CMD_NOT_USED; ++ mutex_unlock(&ioc->tm_cmds.mutex); ++ ++ out: ++ printk(MPT2SAS_INFO_FMT "target reset: %s scmd(%p)\n", ++ ioc->name, ((r == SUCCESS) ? "SUCCESS" : "FAILED"), scmd); ++ return r; ++} ++ ++#else /* prior to 2.6.26 kernel */ ++ ++/** ++ * _scsih_dev_reset - eh threads main device reset routine ++ * @sdev: scsi device struct ++ * ++ * Returns SUCCESS if command aborted else FAILED ++ */ ++static int ++_scsih_dev_reset(struct scsi_cmnd *scmd) ++{ ++ struct MPT2SAS_ADAPTER *ioc = shost_private(scmd->device->host); ++ struct MPT2SAS_DEVICE *sas_device_priv_data; ++ struct _sas_device *sas_device; ++ unsigned long flags; ++ u16 handle; ++ int r; ++ ++ printk(MPT2SAS_INFO_FMT "attempting target reset! scmd(%p)\n", ++ ioc->name, scmd); ++ scsi_print_command(scmd); ++ ++ sas_device_priv_data = scmd->device->hostdata; ++ if (!sas_device_priv_data || !sas_device_priv_data->sas_target) { ++ printk(MPT2SAS_INFO_FMT "target been deleted! scmd(%p)\n", ++ ioc->name, scmd); ++ scmd->result = DID_NO_CONNECT << 16; ++ scmd->scsi_done(scmd); ++ r = SUCCESS; ++ goto out; ++ } ++ ++ /* for hidden raid components obtain the volume_handle */ ++ handle = 0; ++ if (sas_device_priv_data->sas_target->flags & ++ MPT_TARGET_FLAGS_RAID_COMPONENT) { ++ spin_lock_irqsave(&ioc->sas_device_lock, flags); ++ sas_device = _scsih_sas_device_find_by_handle(ioc, ++ sas_device_priv_data->sas_target->handle); ++ if (sas_device) ++ handle = sas_device->volume_handle; ++ spin_unlock_irqrestore(&ioc->sas_device_lock, flags); ++ } else ++ handle = sas_device_priv_data->sas_target->handle; ++ ++ if (!handle) { ++ scmd->result = DID_RESET << 16; ++ r = FAILED; ++ goto out; ++ } ++ ++ mutex_lock(&ioc->tm_cmds.mutex); ++ mpt2sas_scsih_issue_tm(ioc, handle, 0, ++ MPI2_SCSITASKMGMT_TASKTYPE_TARGET_RESET, 0, 30); ++ ++ /* ++ * sanity check see whether all commands to this target been ++ * completed ++ */ ++ if (_scsih_scsi_lookup_find_by_target(ioc, scmd->device->id, ++ scmd->device->channel)) ++ r = FAILED; ++ else ++ r = SUCCESS; ++ ioc->tm_cmds.status = MPT2_CMD_NOT_USED; ++ mutex_unlock(&ioc->tm_cmds.mutex); ++ ++ out: ++ printk(MPT2SAS_INFO_FMT "target reset: %s scmd(%p)\n", ++ ioc->name, ((r == SUCCESS) ? "SUCCESS" : "FAILED"), scmd); ++ return r; ++} ++#endif ++ ++/** ++ * _scsih_host_reset - eh threads main host reset routine ++ * @sdev: scsi device struct ++ * ++ * Returns SUCCESS if command aborted else FAILED ++ */ ++static int ++_scsih_host_reset(struct scsi_cmnd *scmd) ++{ ++ struct MPT2SAS_ADAPTER *ioc = shost_private(scmd->device->host); ++ int r, retval; ++ ++ printk(MPT2SAS_INFO_FMT "attempting host reset! scmd(%p)\n", ++ ioc->name, scmd); ++ scsi_print_command(scmd); ++ ++ retval = mpt2sas_base_hard_reset_handler(ioc, CAN_SLEEP, ++ FORCE_BIG_HAMMER); ++ r = (retval < 0) ? FAILED : SUCCESS; ++ printk(MPT2SAS_INFO_FMT "host reset: %s scmd(%p)\n", ++ ioc->name, ((r == SUCCESS) ? "SUCCESS" : "FAILED"), scmd); ++ ++ return r; ++} ++ ++/** ++ * _scsih_fw_event_add - insert and queue up fw_event ++ * @ioc: per adapter object ++ * @fw_event: object describing the event ++ * Context: This function will acquire ioc->fw_event_lock. ++ * ++ * This adds the firmware event object into link list, then queues it up to ++ * be processed from user context. ++ * ++ * Return nothing. ++ */ ++static void ++_scsih_fw_event_add(struct MPT2SAS_ADAPTER *ioc, struct fw_event_work *fw_event) ++{ ++ unsigned long flags; ++ ++ if (ioc->firmware_event_thread == NULL) ++ return; ++ ++ spin_lock_irqsave(&ioc->fw_event_lock, flags); ++ list_add_tail(&fw_event->list, &ioc->fw_event_list); ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,19)) ++ INIT_WORK(&fw_event->work, _firmware_event_work); ++#else ++ INIT_WORK(&fw_event->work, _firmware_event_work, (void *)fw_event); ++#endif ++ queue_work(ioc->firmware_event_thread, &fw_event->work); ++ spin_unlock_irqrestore(&ioc->fw_event_lock, flags); ++} ++ ++/** ++ * _scsih_fw_event_free - delete fw_event ++ * @ioc: per adapter object ++ * @fw_event: object describing the event ++ * Context: This function will acquire ioc->fw_event_lock. ++ * ++ * This removes firmware event object from link list, frees associated memory. ++ * ++ * Return nothing. ++ */ ++static void ++_scsih_fw_event_free(struct MPT2SAS_ADAPTER *ioc, struct fw_event_work ++ *fw_event) ++{ ++ unsigned long flags; ++ ++ spin_lock_irqsave(&ioc->fw_event_lock, flags); ++ list_del(&fw_event->list); ++ kfree(fw_event->retries); ++ kfree(fw_event->event_data); ++ kfree(fw_event); ++ spin_unlock_irqrestore(&ioc->fw_event_lock, flags); ++} ++ ++/** ++ * _scsih_fw_event_add - requeue an event ++ * @ioc: per adapter object ++ * @fw_event: object describing the event ++ * Context: This function will acquire ioc->fw_event_lock. ++ * ++ * Return nothing. ++ */ ++static void ++_scsih_fw_event_requeue(struct MPT2SAS_ADAPTER *ioc, struct fw_event_work ++ *fw_event, unsigned long delay) ++{ ++ unsigned long flags; ++ ++ if (ioc->firmware_event_thread == NULL) ++ return; ++ ++ spin_lock_irqsave(&ioc->fw_event_lock, flags); ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,19)) ++ if (!fw_event->delayed_work_active) { ++ fw_event->delayed_work_active = 1; ++ INIT_DELAYED_WORK(&fw_event->delayed_work, ++ _firmware_event_work_delayed); ++ } ++ queue_delayed_work(ioc->firmware_event_thread, &fw_event->delayed_work, ++ msecs_to_jiffies(delay)); ++#else ++ queue_delayed_work(ioc->firmware_event_thread, &fw_event->work, ++ msecs_to_jiffies(delay)); ++#endif ++ spin_unlock_irqrestore(&ioc->fw_event_lock, flags); ++} ++ ++/** ++ * _scsih_fw_event_off - turn flag off preventing event handling ++ * @ioc: per adapter object ++ * ++ * Used to prevent handling of firmware events during adapter reset ++ * driver unload. ++ * ++ * Return nothing. ++ */ ++static void ++_scsih_fw_event_off(struct MPT2SAS_ADAPTER *ioc) ++{ ++ unsigned long flags; ++ ++ spin_lock_irqsave(&ioc->fw_event_lock, flags); ++ ioc->fw_events_off = 1; ++ spin_unlock_irqrestore(&ioc->fw_event_lock, flags); ++ ++} ++ ++/** ++ * _scsih_fw_event_on - turn flag on allowing firmware event handling ++ * @ioc: per adapter object ++ * ++ * Returns nothing. ++ */ ++static void ++_scsih_fw_event_on(struct MPT2SAS_ADAPTER *ioc) ++{ ++ unsigned long flags; ++ ++ spin_lock_irqsave(&ioc->fw_event_lock, flags); ++ ioc->fw_events_off = 0; ++ spin_unlock_irqrestore(&ioc->fw_event_lock, flags); ++} ++ ++/** ++ * _scsih_fw_event_cleanup_queue - cleanup event queue ++ * @ioc: per adapter object ++ * ++ * Walk the firmware event queue, either killing timers, or waiting ++ * for outstanding events to complete ++ * ++ * Return nothing. ++ */ ++static void ++_scsih_fw_event_cleanup_queue(struct MPT2SAS_ADAPTER *ioc) ++{ ++ struct fw_event_work *fw_event, *next; ++ ++ if (list_empty(&ioc->fw_event_list) || ++ !ioc->firmware_event_thread || in_interrupt()) ++ return; ++ ++ list_for_each_entry_safe(fw_event, next, &ioc->fw_event_list, list) ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,19)) ++ if (fw_event->delayed_work_active && ++ cancel_delayed_work(&fw_event->delayed_work)) ++ _scsih_fw_event_free(ioc, fw_event); ++#else ++ if (cancel_delayed_work(&fw_event->work)) ++ _scsih_fw_event_free(ioc, fw_event); ++#endif ++} ++ ++/** ++ * _scsih_ublock_io_device - set the device state to SDEV_RUNNING ++ * @ioc: per adapter object ++ * @handle: device handle ++ * ++ * During device pull we need to appropiately set the sdev state. ++ */ ++static void ++_scsih_ublock_io_device(struct MPT2SAS_ADAPTER *ioc, u16 handle) ++{ ++ struct MPT2SAS_DEVICE *sas_device_priv_data; ++ struct scsi_device *sdev; ++ ++ shost_for_each_device(sdev, ioc->shost) { ++ sas_device_priv_data = sdev->hostdata; ++ if (!sas_device_priv_data) ++ continue; ++ if (!sas_device_priv_data->block) ++ continue; ++ if (sas_device_priv_data->sas_target->handle == handle) { ++ dewtprintk(ioc, sdev_printk(KERN_INFO, sdev, ++ MPT2SAS_INFO_FMT "SDEV_RUNNING: " ++ "handle(0x%04x)\n", ioc->name, handle)); ++ sas_device_priv_data->block = 0; ++ scsi_device_set_state(sdev, SDEV_RUNNING); ++ } ++ } ++} ++ ++/** ++ * _scsih_block_io_device - set the device state to SDEV_BLOCK ++ * @ioc: per adapter object ++ * @handle: device handle ++ * ++ * During device pull we need to appropiately set the sdev state. ++ */ ++static void ++_scsih_block_io_device(struct MPT2SAS_ADAPTER *ioc, u16 handle) ++{ ++ struct MPT2SAS_DEVICE *sas_device_priv_data; ++ struct scsi_device *sdev; ++ ++ shost_for_each_device(sdev, ioc->shost) { ++ sas_device_priv_data = sdev->hostdata; ++ if (!sas_device_priv_data) ++ continue; ++ if (sas_device_priv_data->block) ++ continue; ++ if (sas_device_priv_data->sas_target->handle == handle) { ++ dewtprintk(ioc, sdev_printk(KERN_INFO, sdev, ++ MPT2SAS_INFO_FMT "SDEV_BLOCK: " ++ "handle(0x%04x)\n", ioc->name, handle)); ++ sas_device_priv_data->block = 1; ++ scsi_device_set_state(sdev, SDEV_BLOCK); ++ } ++ } ++} ++ ++/** ++ * _scsih_block_io_to_children_attached_to_ex ++ * @ioc: per adapter object ++ * @sas_expander: the sas_device object ++ * ++ * This routine set sdev state to SDEV_BLOCK for all devices ++ * attached to this expander. This function called when expander is ++ * pulled. ++ */ ++static void ++_scsih_block_io_to_children_attached_to_ex(struct MPT2SAS_ADAPTER *ioc, ++ struct _sas_node *sas_expander) ++{ ++ struct _sas_port *mpt2sas_port; ++ struct _sas_device *sas_device; ++ struct _sas_node *expander_sibling; ++ unsigned long flags; ++ ++ if (!sas_expander) ++ return; ++ ++ list_for_each_entry(mpt2sas_port, ++ &sas_expander->sas_port_list, port_list) { ++ if (mpt2sas_port->remote_identify.device_type == ++ SAS_END_DEVICE) { ++ spin_lock_irqsave(&ioc->sas_device_lock, flags); ++ sas_device = ++ mpt2sas_scsih_sas_device_find_by_sas_address(ioc, ++ mpt2sas_port->remote_identify.sas_address); ++ spin_unlock_irqrestore(&ioc->sas_device_lock, flags); ++ if (!sas_device) ++ continue; ++ _scsih_block_io_device(ioc, sas_device->handle); ++ } ++ } ++ ++ list_for_each_entry(mpt2sas_port, ++ &sas_expander->sas_port_list, port_list) { ++ ++ if (mpt2sas_port->remote_identify.device_type == ++ MPI2_SAS_DEVICE_INFO_EDGE_EXPANDER || ++ mpt2sas_port->remote_identify.device_type == ++ MPI2_SAS_DEVICE_INFO_FANOUT_EXPANDER) { ++ ++ spin_lock_irqsave(&ioc->sas_node_lock, flags); ++ expander_sibling = ++ mpt2sas_scsih_expander_find_by_sas_address( ++ ioc, mpt2sas_port->remote_identify.sas_address); ++ spin_unlock_irqrestore(&ioc->sas_node_lock, flags); ++ _scsih_block_io_to_children_attached_to_ex(ioc, ++ expander_sibling); ++ } ++ } ++} ++ ++/** ++ * _scsih_block_io_to_children_attached_directly ++ * @ioc: per adapter object ++ * @event_data: topology change event data ++ * ++ * This routine set sdev state to SDEV_BLOCK for all devices ++ * direct attached during device pull. ++ */ ++static void ++_scsih_block_io_to_children_attached_directly(struct MPT2SAS_ADAPTER *ioc, ++ Mpi2EventDataSasTopologyChangeList_t *event_data) ++{ ++ int i; ++ u16 handle; ++ u16 reason_code; ++ u8 phy_number; ++ u8 link_rate; ++ ++ for (i = 0; i < event_data->NumEntries; i++) { ++ handle = le16_to_cpu(event_data->PHY[i].AttachedDevHandle); ++ if (!handle) ++ continue; ++ phy_number = event_data->StartPhyNum + i; ++ reason_code = event_data->PHY[i].PhyStatus & ++ MPI2_EVENT_SAS_TOPO_RC_MASK; ++ if (reason_code == MPI2_EVENT_SAS_TOPO_RC_DELAY_NOT_RESPONDING) ++ _scsih_block_io_device(ioc, handle); ++ if (reason_code == MPI2_EVENT_SAS_TOPO_RC_PHY_CHANGED) { ++ link_rate = event_data->PHY[i].LinkRate >> 4; ++ if (link_rate >= MPI2_SAS_NEG_LINK_RATE_1_5) ++ _scsih_ublock_io_device(ioc, handle); ++ } ++ } ++} ++ ++/** ++ * _scsih_check_topo_delete_events - sanity check on topo events ++ * @ioc: per adapter object ++ * @event_data: the event data payload ++ * ++ * This routine added to better handle cable breaker. ++ * ++ * This handles the case where driver recieves multiple expander ++ * add and delete events in a single shot. When there is a delete event ++ * the routine will void any pending add events waiting in the event queue. ++ * ++ * Return nothing. ++ */ ++static void ++_scsih_check_topo_delete_events(struct MPT2SAS_ADAPTER *ioc, ++ Mpi2EventDataSasTopologyChangeList_t *event_data) ++{ ++ struct fw_event_work *fw_event; ++ Mpi2EventDataSasTopologyChangeList_t *local_event_data; ++ u16 expander_handle; ++ struct _sas_node *sas_expander; ++ unsigned long flags; ++ ++ expander_handle = le16_to_cpu(event_data->ExpanderDevHandle); ++ if (expander_handle < ioc->sas_hba.num_phys) { ++ _scsih_block_io_to_children_attached_directly(ioc, event_data); ++ return; ++ } ++ ++ if (event_data->ExpStatus == MPI2_EVENT_SAS_TOPO_ES_DELAY_NOT_RESPONDING ++ || event_data->ExpStatus == MPI2_EVENT_SAS_TOPO_ES_NOT_RESPONDING) { ++ spin_lock_irqsave(&ioc->sas_node_lock, flags); ++ sas_expander = mpt2sas_scsih_expander_find_by_handle(ioc, ++ expander_handle); ++ spin_unlock_irqrestore(&ioc->sas_node_lock, flags); ++ _scsih_block_io_to_children_attached_to_ex(ioc, sas_expander); ++ } else if (event_data->ExpStatus == MPI2_EVENT_SAS_TOPO_ES_RESPONDING) ++ _scsih_block_io_to_children_attached_directly(ioc, event_data); ++ ++ if (event_data->ExpStatus != MPI2_EVENT_SAS_TOPO_ES_NOT_RESPONDING) ++ return; ++ ++ /* mark ignore flag for pending events */ ++ spin_lock_irqsave(&ioc->fw_event_lock, flags); ++ list_for_each_entry(fw_event, &ioc->fw_event_list, list) { ++ if (fw_event->event != MPI2_EVENT_SAS_TOPOLOGY_CHANGE_LIST || ++ fw_event->ignore) ++ continue; ++ local_event_data = fw_event->event_data; ++ if (local_event_data->ExpStatus == ++ MPI2_EVENT_SAS_TOPO_ES_ADDED || ++ local_event_data->ExpStatus == ++ MPI2_EVENT_SAS_TOPO_ES_RESPONDING) { ++ if (le16_to_cpu(local_event_data->ExpanderDevHandle) == ++ expander_handle) { ++ dewtprintk(ioc, printk(MPT2SAS_DEBUG_FMT ++ "setting ignoring flag\n", ioc->name)); ++ fw_event->ignore = 1; ++ } ++ } ++ } ++ spin_unlock_irqrestore(&ioc->fw_event_lock, flags); ++} ++ ++/** ++ * _scsih_flush_running_cmds - completing outstanding commands. ++ * @ioc: per adapter object ++ * ++ * The flushing out of all pending scmd commands following host reset, ++ * where all IO is dropped to the floor. ++ * ++ * Return nothing. ++ */ ++static void ++_scsih_flush_running_cmds(struct MPT2SAS_ADAPTER *ioc) ++{ ++ struct scsi_cmnd *scmd; ++ u16 smid; ++ u16 count = 0; ++ ++ for (smid = 1; smid <= ioc->request_depth; smid++) { ++ scmd = _scsih_scsi_lookup_getclear(ioc, smid); ++ if (!scmd) ++ continue; ++ count++; ++ mpt2sas_base_free_smid(ioc, smid); ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)) ++ if (scmd->use_sg) { ++ pci_unmap_sg(ioc->pdev, ++ (struct scatterlist *) scmd->request_buffer, ++ scmd->use_sg, scmd->sc_data_direction); ++ } else if (scmd->request_bufflen) { ++ pci_unmap_single(ioc->pdev, ++ scmd->SCp.dma_handle, scmd->request_bufflen, ++ scmd->sc_data_direction); ++ } ++#else ++ scsi_dma_unmap(scmd); ++#endif ++ scmd->result = DID_RESET << 16; ++ scmd->scsi_done(scmd); ++ } ++ dtmprintk(ioc, printk(MPT2SAS_INFO_FMT "completing %d cmds\n", ++ ioc->name, count)); ++} ++ ++#if defined(EEDP_SUPPORT) ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27)) ++static u8 opcode_protection[256] = { ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, PRO_R, 0, PRO_W, 0, 0, 0, PRO_W, PRO_V, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, PRO_W, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, PRO_R, 0, PRO_W, 0, 0, 0, PRO_W, PRO_V, ++ 0, 0, 0, PRO_W, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, PRO_R, 0, PRO_W, 0, 0, 0, PRO_W, PRO_V, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; ++#endif ++/** ++ * _scsih_setup_eedp - setup MPI request for EEDP transfer ++ * @scmd: pointer to scsi command object ++ * @mpi_request: pointer to the SCSI_IO reqest message frame ++ * ++ * Supporting protection 1 and 3. ++ * ++ * Returns nothing ++ */ ++static void ++_scsih_setup_eedp(struct scsi_cmnd *scmd, Mpi2SCSIIORequest_t *mpi_request) ++{ ++ u16 eedp_flags; ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27)) ++ struct MPT2SAS_DEVICE *sas_device_priv_data; ++ u8 scsi_opcode; ++ ++ sas_device_priv_data = scmd->device->hostdata; ++ ++ if (!sas_device_priv_data->eedp_enable) ++ return; ++ ++ /* check whether scsi opcode supports eedp transfer */ ++ scsi_opcode = scmd->cmnd[0]; ++ eedp_flags = opcode_protection[scsi_opcode]; ++ if (!eedp_flags) ++ return; ++ ++ /* set RDPROTECT, WRPROTECT, VRPROTECT bits to (001b) */ ++ scmd->cmnd[1] = (scmd->cmnd[1] & 0x1F) | 0x20; ++ ++ mpi_request->EEDPBlockSize = scmd->device->sector_size; ++ ++ switch (sas_device_priv_data->eedp_type) { ++ case 1: /* type 1 */ ++ ++ /* ++ * enable ref/guard checking ++ * auto increment ref tag ++ */ ++ mpi_request->EEDPFlags = eedp_flags | ++ MPI2_SCSIIO_EEDPFLAGS_INC_PRI_REFTAG | ++ MPI2_SCSIIO_EEDPFLAGS_CHECK_REFTAG | ++ MPI2_SCSIIO_EEDPFLAGS_CHECK_GUARD; ++ mpi_request->CDB.EEDP32.PrimaryReferenceTag = ++ cpu_to_be32(scsi_get_lba(scmd)); ++ ++ break; ++ ++ case 3: /* type 3 */ ++ ++ /* ++ * enable guard checking ++ */ ++ mpi_request->EEDPFlags = eedp_flags | ++ MPI2_SCSIIO_EEDPFLAGS_CHECK_GUARD; ++ ++ break; ++ } ++ ++#else /* sles11 and newer */ ++ ++ unsigned char prot_op = scsi_get_prot_op(scmd); ++ unsigned char prot_type = scsi_get_prot_type(scmd); ++ ++ if (prot_type == SCSI_PROT_DIF_TYPE0 || ++ prot_type == SCSI_PROT_DIF_TYPE2 || ++ prot_op == SCSI_PROT_NORMAL) ++ return; ++ ++ if (prot_op == SCSI_PROT_READ_STRIP) ++ eedp_flags = MPI2_SCSIIO_EEDPFLAGS_CHECK_REMOVE_OP; ++ else if (prot_op == SCSI_PROT_WRITE_INSERT) ++ eedp_flags = MPI2_SCSIIO_EEDPFLAGS_INSERT_OP; ++ else ++ return; ++ ++ mpi_request->EEDPBlockSize = scmd->device->sector_size; ++ ++ switch (prot_type) { ++ case SCSI_PROT_DIF_TYPE1: ++ ++ /* ++ * enable ref/guard checking ++ * auto increment ref tag ++ */ ++ mpi_request->EEDPFlags = eedp_flags | ++ MPI2_SCSIIO_EEDPFLAGS_INC_PRI_REFTAG | ++ MPI2_SCSIIO_EEDPFLAGS_CHECK_REFTAG | ++ MPI2_SCSIIO_EEDPFLAGS_CHECK_GUARD; ++ mpi_request->CDB.EEDP32.PrimaryReferenceTag = ++ cpu_to_be32(scsi_get_lba(scmd)); ++ ++ break; ++ ++ case SCSI_PROT_DIF_TYPE3: ++ ++ /* ++ * enable guard checking ++ */ ++ mpi_request->EEDPFlags = eedp_flags | ++ MPI2_SCSIIO_EEDPFLAGS_CHECK_GUARD; ++ ++ break; ++ } ++#endif ++} ++ ++/** ++ * _scsih_eedp_error_handling - return sense code for EEDP errors ++ * @scmd: pointer to scsi command object ++ * @ioc_status: ioc status ++ * ++ * Returns nothing ++ */ ++static void ++_scsih_eedp_error_handling(struct scsi_cmnd *scmd, u16 ioc_status) ++{ ++ u8 ascq; ++ u8 sk; ++ u8 host_byte; ++ ++ switch (ioc_status) { ++ case MPI2_IOCSTATUS_EEDP_GUARD_ERROR: ++ ascq = 0x01; ++ break; ++ case MPI2_IOCSTATUS_EEDP_APP_TAG_ERROR: ++ ascq = 0x02; ++ break; ++ case MPI2_IOCSTATUS_EEDP_REF_TAG_ERROR: ++ ascq = 0x03; ++ break; ++ default: ++ ascq = 0x00; ++ break; ++ } ++ ++ if (scmd->sc_data_direction == DMA_TO_DEVICE) { ++ sk = ILLEGAL_REQUEST; ++ host_byte = DID_ABORT; ++ } else { ++ sk = ABORTED_COMMAND; ++ host_byte = DID_OK; ++ } ++ ++ mpt_scsi_build_sense_buffer(0, scmd->sense_buffer, sk, 0x10, ascq); ++ scmd->result = DRIVER_SENSE << 24 | (host_byte << 16) | ++ SAM_STAT_CHECK_CONDITION; ++} ++#endif /* EEDP_SUPPORT Support */ ++ ++/** ++ * _scsih_qcmd - main scsi request entry point ++ * @scmd: pointer to scsi command object ++ * @done: function pointer to be invoked on completion ++ * ++ * The callback index is set inside `ioc->scsi_io_cb_idx`. ++ * ++ * Returns 0 on success. If there's a failure, return either: ++ * SCSI_MLQUEUE_DEVICE_BUSY if the device queue is full, or ++ * SCSI_MLQUEUE_HOST_BUSY if the entire host queue is full ++ */ ++static int ++_scsih_qcmd(struct scsi_cmnd *scmd, void (*done)(struct scsi_cmnd *)) ++{ ++ struct MPT2SAS_ADAPTER *ioc = shost_private(scmd->device->host); ++ struct MPT2SAS_DEVICE *sas_device_priv_data; ++ struct MPT2SAS_TARGET *sas_target_priv_data; ++ Mpi2SCSIIORequest_t *mpi_request; ++ u32 mpi_control; ++ u16 smid; ++ ++#ifdef CONFIG_SCSI_MPT2SAS_LOGGING ++ if (ioc->logging_level & MPT_DEBUG_SCSI) ++ scsi_print_command(scmd); ++#endif ++ ++ scmd->scsi_done = done; ++ sas_device_priv_data = scmd->device->hostdata; ++ if (!sas_device_priv_data) { ++ scmd->result = DID_NO_CONNECT << 16; ++ scmd->scsi_done(scmd); ++ return 0; ++ } ++ ++ sas_target_priv_data = sas_device_priv_data->sas_target; ++ if (!sas_target_priv_data || sas_target_priv_data->handle == ++ MPT2SAS_INVALID_DEVICE_HANDLE || sas_target_priv_data->deleted) { ++ scmd->result = DID_NO_CONNECT << 16; ++ scmd->scsi_done(scmd); ++ return 0; ++ } ++ ++ /* see if we are busy with task managment stuff */ ++ if (sas_target_priv_data->tm_busy) ++ return SCSI_MLQUEUE_DEVICE_BUSY; ++ else if (ioc->shost_recovery || ioc->ioc_link_reset_in_progress) ++ return SCSI_MLQUEUE_HOST_BUSY; ++ ++ if (scmd->sc_data_direction == DMA_FROM_DEVICE) ++ mpi_control = MPI2_SCSIIO_CONTROL_READ; ++ else if (scmd->sc_data_direction == DMA_TO_DEVICE) ++ mpi_control = MPI2_SCSIIO_CONTROL_WRITE; ++ else ++ mpi_control = MPI2_SCSIIO_CONTROL_NODATATRANSFER; ++ ++ /* set tags */ ++ if (!(sas_device_priv_data->flags & MPT_DEVICE_FLAGS_INIT)) { ++ if (scmd->device->tagged_supported) { ++ if (scmd->device->ordered_tags) ++ mpi_control |= MPI2_SCSIIO_CONTROL_ORDEREDQ; ++ else ++ mpi_control |= MPI2_SCSIIO_CONTROL_SIMPLEQ; ++ } else ++/* MPI Revision I (UNIT = 0xA) - removed MPI2_SCSIIO_CONTROL_UNTAGGED */ ++/* mpi_control |= MPI2_SCSIIO_CONTROL_UNTAGGED; ++ */ ++ mpi_control |= (0x500); ++ } else ++ mpi_control |= MPI2_SCSIIO_CONTROL_SIMPLEQ; ++ ++ if ((sas_device_priv_data->flags & MPT_DEVICE_TLR_ON)) ++ mpi_control |= MPI2_SCSIIO_CONTROL_TLR_ON; ++ ++ smid = mpt2sas_base_get_smid(ioc, ioc->scsi_io_cb_idx); ++ if (!smid) { ++ printk(MPT2SAS_ERR_FMT "%s: failed obtaining a smid\n", ++ ioc->name, __func__); ++ goto out; ++ } ++ mpi_request = mpt2sas_base_get_msg_frame(ioc, smid); ++ memset(mpi_request, 0, sizeof(Mpi2SCSIIORequest_t)); ++#if defined(EEDP_SUPPORT) ++ _scsih_setup_eedp(scmd, mpi_request); ++#endif ++ mpi_request->Function = MPI2_FUNCTION_SCSI_IO_REQUEST; ++ if (sas_device_priv_data->sas_target->flags & ++ MPT_TARGET_FLAGS_RAID_COMPONENT) ++ mpi_request->Function = MPI2_FUNCTION_RAID_SCSI_IO_PASSTHROUGH; ++ else ++ mpi_request->Function = MPI2_FUNCTION_SCSI_IO_REQUEST; ++ mpi_request->DevHandle = ++ cpu_to_le16(sas_device_priv_data->sas_target->handle); ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)) ++ mpi_request->DataLength = cpu_to_le32(scmd->request_bufflen); ++#else ++ mpi_request->DataLength = cpu_to_le32(scsi_bufflen(scmd)); ++#endif ++ mpi_request->Control = cpu_to_le32(mpi_control); ++ mpi_request->IoFlags = cpu_to_le16(scmd->cmd_len); ++ mpi_request->MsgFlags = MPI2_SCSIIO_MSGFLAGS_SYSTEM_SENSE_ADDR; ++ mpi_request->SenseBufferLength = SCSI_SENSE_BUFFERSIZE; ++ mpi_request->SenseBufferLowAddress = ++ (u32)mpt2sas_base_get_sense_buffer_dma(ioc, smid); ++ mpi_request->SGLOffset0 = offsetof(Mpi2SCSIIORequest_t, SGL) / 4; ++ mpi_request->SGLFlags = cpu_to_le16(MPI2_SCSIIO_SGLFLAGS_TYPE_MPI + ++ MPI2_SCSIIO_SGLFLAGS_SYSTEM_ADDR); ++ ++ int_to_scsilun(sas_device_priv_data->lun, (struct scsi_lun *) ++ mpi_request->LUN); ++ memcpy(mpi_request->CDB.CDB32, scmd->cmnd, scmd->cmd_len); ++ ++ if (!mpi_request->DataLength) { ++ mpt2sas_base_build_zero_len_sge(ioc, &mpi_request->SGL); ++ } else { ++ if (_scsih_build_scatter_gather(ioc, scmd, smid)) { ++ mpt2sas_base_free_smid(ioc, smid); ++ goto out; ++ } ++ } ++ ++ _scsih_scsi_lookup_set(ioc, smid, scmd); ++ mpt2sas_base_put_smid_scsi_io(ioc, smid, 0, ++ sas_device_priv_data->sas_target->handle); ++ return 0; ++ ++ out: ++ return SCSI_MLQUEUE_HOST_BUSY; ++} ++ ++/** ++ * _scsih_normalize_sense - normalize descriptor and fixed format sense data ++ * @sense_buffer: sense data returned by target ++ * @data: normalized skey/asc/ascq ++ * ++ * Return nothing. ++ */ ++static void ++_scsih_normalize_sense(char *sense_buffer, struct sense_info *data) ++{ ++ if ((sense_buffer[0] & 0x7F) >= 0x72) { ++ /* descriptor format */ ++ data->skey = sense_buffer[1] & 0x0F; ++ data->asc = sense_buffer[2]; ++ data->ascq = sense_buffer[3]; ++ } else { ++ /* fixed format */ ++ data->skey = sense_buffer[2] & 0x0F; ++ data->asc = sense_buffer[12]; ++ data->ascq = sense_buffer[13]; ++ } ++} ++ ++#ifdef CONFIG_SCSI_MPT2SAS_LOGGING ++/** ++ * _scsih_scsi_ioc_info - translated non-succesfull SCSI_IO request ++ * @ioc: per adapter object ++ * @scmd: pointer to scsi command object ++ * @mpi_reply: reply mf payload returned from firmware ++ * ++ * scsi_status - SCSI Status code returned from target device ++ * scsi_state - state info associated with SCSI_IO determined by ioc ++ * ioc_status - ioc supplied status info ++ * ++ * Return nothing. ++ */ ++static void ++_scsih_scsi_ioc_info(struct MPT2SAS_ADAPTER *ioc, struct scsi_cmnd *scmd, ++ Mpi2SCSIIOReply_t *mpi_reply, u16 smid) ++{ ++ u32 response_info; ++ u8 *response_bytes; ++ u16 ioc_status = le16_to_cpu(mpi_reply->IOCStatus) & ++ MPI2_IOCSTATUS_MASK; ++ u8 scsi_state = mpi_reply->SCSIState; ++ u8 scsi_status = mpi_reply->SCSIStatus; ++ char *desc_ioc_state = NULL; ++ char *desc_scsi_status = NULL; ++ char *desc_scsi_state = ioc->tmp_string; ++ u32 log_info = le32_to_cpu(mpi_reply->IOCLogInfo); ++ ++ if (log_info == 0x31170000) ++ return; ++ ++ switch (ioc_status) { ++ case MPI2_IOCSTATUS_SUCCESS: ++ desc_ioc_state = "success"; ++ break; ++ case MPI2_IOCSTATUS_INVALID_FUNCTION: ++ desc_ioc_state = "invalid function"; ++ break; ++ case MPI2_IOCSTATUS_SCSI_RECOVERED_ERROR: ++ desc_ioc_state = "scsi recovered error"; ++ break; ++ case MPI2_IOCSTATUS_SCSI_INVALID_DEVHANDLE: ++ desc_ioc_state = "scsi invalid dev handle"; ++ break; ++ case MPI2_IOCSTATUS_SCSI_DEVICE_NOT_THERE: ++ desc_ioc_state = "scsi device not there"; ++ break; ++ case MPI2_IOCSTATUS_SCSI_DATA_OVERRUN: ++ desc_ioc_state = "scsi data overrun"; ++ break; ++ case MPI2_IOCSTATUS_SCSI_DATA_UNDERRUN: ++ desc_ioc_state = "scsi data underrun"; ++ break; ++ case MPI2_IOCSTATUS_SCSI_IO_DATA_ERROR: ++ desc_ioc_state = "scsi io data error"; ++ break; ++ case MPI2_IOCSTATUS_SCSI_PROTOCOL_ERROR: ++ desc_ioc_state = "scsi protocol error"; ++ break; ++ case MPI2_IOCSTATUS_SCSI_TASK_TERMINATED: ++ desc_ioc_state = "scsi task terminated"; ++ break; ++ case MPI2_IOCSTATUS_SCSI_RESIDUAL_MISMATCH: ++ desc_ioc_state = "scsi residual mismatch"; ++ break; ++ case MPI2_IOCSTATUS_SCSI_TASK_MGMT_FAILED: ++ desc_ioc_state = "scsi task mgmt failed"; ++ break; ++ case MPI2_IOCSTATUS_SCSI_IOC_TERMINATED: ++ desc_ioc_state = "scsi ioc terminated"; ++ break; ++ case MPI2_IOCSTATUS_SCSI_EXT_TERMINATED: ++ desc_ioc_state = "scsi ext terminated"; ++ break; ++#if defined(EEDP_SUPPORT) ++ case MPI2_IOCSTATUS_EEDP_GUARD_ERROR: ++ desc_ioc_state = "eedp guard error"; ++ break; ++ case MPI2_IOCSTATUS_EEDP_REF_TAG_ERROR: ++ desc_ioc_state = "eedp ref tag error"; ++ break; ++ case MPI2_IOCSTATUS_EEDP_APP_TAG_ERROR: ++ desc_ioc_state = "eedp app tag error"; ++ break; ++#endif /* EEDP Support */ ++ default: ++ desc_ioc_state = "unknown"; ++ break; ++ } ++ ++ switch (scsi_status) { ++ case MPI2_SCSI_STATUS_GOOD: ++ desc_scsi_status = "good"; ++ break; ++ case MPI2_SCSI_STATUS_CHECK_CONDITION: ++ desc_scsi_status = "check condition"; ++ break; ++ case MPI2_SCSI_STATUS_CONDITION_MET: ++ desc_scsi_status = "condition met"; ++ break; ++ case MPI2_SCSI_STATUS_BUSY: ++ desc_scsi_status = "busy"; ++ break; ++ case MPI2_SCSI_STATUS_INTERMEDIATE: ++ desc_scsi_status = "intermediate"; ++ break; ++ case MPI2_SCSI_STATUS_INTERMEDIATE_CONDMET: ++ desc_scsi_status = "intermediate condmet"; ++ break; ++ case MPI2_SCSI_STATUS_RESERVATION_CONFLICT: ++ desc_scsi_status = "reservation conflict"; ++ break; ++ case MPI2_SCSI_STATUS_COMMAND_TERMINATED: ++ desc_scsi_status = "command terminated"; ++ break; ++ case MPI2_SCSI_STATUS_TASK_SET_FULL: ++ desc_scsi_status = "task set full"; ++ break; ++ case MPI2_SCSI_STATUS_ACA_ACTIVE: ++ desc_scsi_status = "aca active"; ++ break; ++ case MPI2_SCSI_STATUS_TASK_ABORTED: ++ desc_scsi_status = "task aborted"; ++ break; ++ default: ++ desc_scsi_status = "unknown"; ++ break; ++ } ++ ++ desc_scsi_state[0] = '\0'; ++ if (!scsi_state) ++ desc_scsi_state = " "; ++ if (scsi_state & MPI2_SCSI_STATE_RESPONSE_INFO_VALID) ++ strcat(desc_scsi_state, "response info "); ++ if (scsi_state & MPI2_SCSI_STATE_TERMINATED) ++ strcat(desc_scsi_state, "state terminated "); ++ if (scsi_state & MPI2_SCSI_STATE_NO_SCSI_STATUS) ++ strcat(desc_scsi_state, "no status "); ++ if (scsi_state & MPI2_SCSI_STATE_AUTOSENSE_FAILED) ++ strcat(desc_scsi_state, "autosense failed "); ++ if (scsi_state & MPI2_SCSI_STATE_AUTOSENSE_VALID) ++ strcat(desc_scsi_state, "autosense valid "); ++ ++ scsi_print_command(scmd); ++ printk(MPT2SAS_WARN_FMT "\tdev handle(0x%04x), " ++ "ioc_status(%s)(0x%04x), smid(%d)\n", ioc->name, ++ le16_to_cpu(mpi_reply->DevHandle), desc_ioc_state, ++ ioc_status, smid); ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)) ++ printk(MPT2SAS_WARN_FMT "\trequest_len(%d), underflow(%d), " ++ "resid(%d)\n", ioc->name, scmd->request_bufflen, scmd->underflow, ++ scmd->resid); ++#else ++ printk(MPT2SAS_WARN_FMT "\trequest_len(%d), underflow(%d), " ++ "resid(%d)\n", ioc->name, scsi_bufflen(scmd), scmd->underflow, ++ scsi_get_resid(scmd)); ++#endif ++ printk(MPT2SAS_WARN_FMT "\ttag(%d), transfer_count(%d), " ++ "sc->result(0x%08x)\n", ioc->name, le16_to_cpu(mpi_reply->TaskTag), ++ le32_to_cpu(mpi_reply->TransferCount), scmd->result); ++ printk(MPT2SAS_WARN_FMT "\tscsi_status(%s)(0x%02x), " ++ "scsi_state(%s)(0x%02x)\n", ioc->name, desc_scsi_status, ++ scsi_status, desc_scsi_state, scsi_state); ++ ++ if (scsi_state & MPI2_SCSI_STATE_AUTOSENSE_VALID) { ++ struct sense_info data; ++ _scsih_normalize_sense(scmd->sense_buffer, &data); ++ printk(MPT2SAS_WARN_FMT "\t[sense_key,asc,ascq]: " ++ "[0x%02x,0x%02x,0x%02x], count(%d)\n", ioc->name, data.skey, ++ data.asc, data.ascq, le32_to_cpu(mpi_reply->SenseCount)); ++ } ++ ++ if (scsi_state & MPI2_SCSI_STATE_RESPONSE_INFO_VALID) { ++ response_info = le32_to_cpu(mpi_reply->ResponseInfo); ++ response_bytes = (u8 *)&response_info; ++ _scsih_response_code(ioc, response_bytes[3]); ++ } ++} ++#endif ++ ++#ifdef MPT2SAS_MULTIPATH ++/** ++ * _scsih_abort_task_set - issue a delayed ABRT_TASK_SET ++ * @ioc: per adapter object ++ * @VF_ID: virtual function id ++ * @tm_data: contains handle/lun ++ * ++ * issue TM following bus reset using custom event MPT2SAS_ABRT_TASK_SET ++ * ++ * Return nothing. ++ */ ++static void ++_scsih_abort_task_set(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID, ++ struct mpt2sas_abort_task_set *tm_data) ++{ ++ mutex_lock(&ioc->tm_cmds.mutex); ++ mpt2sas_scsih_issue_tm(ioc, tm_data->handle, tm_data->lun, ++ MPI2_SCSITASKMGMT_TASKTYPE_ABRT_TASK_SET, 0, 5); ++ ioc->tm_cmds.status = MPT2_CMD_NOT_USED; ++ mutex_unlock(&ioc->tm_cmds.mutex); ++} ++ ++/** ++ * _scsih_abort_task_set_schedule - schedule a ABRT_TASK_SET ++ * @ioc: per adapter object ++ * @handle: device handle ++ * @lun: lun ++ * @VF_ID: virtual function id ++ * ++ * schedule a ABRT_TASK_SET following UA bus reset ++ * ++ * Return nothing. ++ */ ++static void ++_scsih_abort_task_set_schedule(struct MPT2SAS_ADAPTER *ioc, u16 handle, ++ u32 lun, u8 VF_ID, ulong delay) ++{ ++ struct fw_event_work *fw_event; ++ struct mpt2sas_abort_task_set *tm_data; ++ unsigned long flags; ++ ++ if (ioc->remove_host) ++ return; ++ ++ fw_event = kzalloc(sizeof(struct fw_event_work), GFP_ATOMIC); ++ if (!fw_event) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ return; ++ } ++ ++ tm_data = kzalloc(sizeof(struct mpt2sas_abort_task_set), GFP_ATOMIC); ++ if (!tm_data) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ kfree(fw_event); ++ return; ++ } ++ ++ fw_event->event_data = tm_data; ++ tm_data->handle = handle; ++ tm_data->lun = lun; ++ fw_event->ioc = ioc; ++ fw_event->VF_ID = VF_ID; ++ fw_event->event = MPT2SAS_ABRT_TASK_SET; ++ ++ spin_lock_irqsave(&ioc->fw_event_lock, flags); ++ list_add_tail(&fw_event->list, &ioc->fw_event_list); ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,19)) ++ INIT_WORK(&fw_event->work, _firmware_event_work); ++ queue_work(ioc->firmware_event_thread, &fw_event->work); ++#else ++ INIT_WORK(&fw_event->work, _firmware_event_work, (void *)fw_event); ++ queue_delayed_work(ioc->firmware_event_thread, &fw_event->work, ++ msecs_to_jiffies(delay)); ++#endif ++ spin_unlock_irqrestore(&ioc->fw_event_lock, flags); ++} ++ ++/** ++ * mpt2sas_scsih_check_tm_for_multipath - ++ * @ioc: per adapter object ++ * @handle: device handle ++ * @task_type: ++ * ++ * For multipath, a target reset to one path will kill all the IO to the ++ * other. This code issues an abrt_task_set to the other path, so as ++ * to prevent timeouts. ++ */ ++void ++mpt2sas_scsih_check_tm_for_multipath(struct MPT2SAS_ADAPTER *ioc, u16 handle, ++ u8 task_type) ++{ ++ struct MPT2SAS_ADAPTER *ioc_alt; ++ struct _sas_device *sas_device, *sas_device_alt; ++ unsigned long flags; ++ struct scsi_device *sdev; ++ ++ if (mpt2sas_multipath == -1 || mpt2sas_multipath == 0) ++ return; ++ ++ if (task_type != MPI2_SCSITASKMGMT_TASKTYPE_TARGET_RESET) ++ return; ++ ++ spin_lock_irqsave(&ioc->sas_device_lock, flags); ++ sas_device = _scsih_sas_device_find_by_handle(ioc, handle); ++ spin_unlock_irqrestore(&ioc->sas_device_lock, flags); ++ ++ if (!sas_device || !sas_device->sas_device_alt) ++ return; ++ ++ sas_device_alt = sas_device->sas_device_alt; ++ ioc_alt = sas_device_alt->ioc; ++ ++ /* sending abort task 5 seconds later on alternate path */ ++ shost_for_each_device(sdev, ioc_alt->shost) { ++ if (sdev->id != sas_device_alt->id || ++ sdev->channel != sas_device_alt->channel) ++ continue; ++ _scsih_abort_task_set_schedule(ioc_alt, ++ sas_device_alt->handle, sdev->lun, 0, 5000); ++ } ++} ++#endif ++ ++/** ++ * _scsih_smart_predicted_fault - illuminate Fault LED ++ * @ioc: per adapter object ++ * @handle: device handle ++ * ++ * Return nothing. ++ */ ++static void ++_scsih_smart_predicted_fault(struct MPT2SAS_ADAPTER *ioc, u16 handle) ++{ ++ Mpi2SepReply_t mpi_reply; ++ Mpi2SepRequest_t mpi_request; ++ struct scsi_target *starget; ++ struct MPT2SAS_TARGET *sas_target_priv_data; ++ Mpi2EventNotificationReply_t *event_reply; ++ Mpi2EventDataSasDeviceStatusChange_t *event_data; ++ struct _sas_device *sas_device; ++ ssize_t sz; ++ unsigned long flags; ++ ++ /* only handle non-raid devices */ ++ spin_lock_irqsave(&ioc->sas_device_lock, flags); ++ sas_device = _scsih_sas_device_find_by_handle(ioc, handle); ++ if (!sas_device) { ++ spin_unlock_irqrestore(&ioc->sas_device_lock, flags); ++ return; ++ } ++ starget = sas_device->starget; ++ sas_target_priv_data = starget->hostdata; ++ ++ if ((sas_target_priv_data->flags & MPT_TARGET_FLAGS_RAID_COMPONENT) || ++ ((sas_target_priv_data->flags & MPT_TARGET_FLAGS_VOLUME))) { ++ spin_unlock_irqrestore(&ioc->sas_device_lock, flags); ++ return; ++ } ++ starget_printk(KERN_WARNING, starget, "predicted fault\n"); ++ spin_unlock_irqrestore(&ioc->sas_device_lock, flags); ++ ++ if (ioc->pdev->subsystem_vendor == PCI_VENDOR_ID_IBM) { ++ memset(&mpi_request, 0, sizeof(Mpi2SepRequest_t)); ++ mpi_request.Function = MPI2_FUNCTION_SCSI_ENCLOSURE_PROCESSOR; ++ mpi_request.Action = MPI2_SEP_REQ_ACTION_WRITE_STATUS; ++ mpi_request.SlotStatus = ++ MPI2_SEP_REQ_SLOTSTATUS_PREDICTED_FAULT; ++ mpi_request.DevHandle = cpu_to_le16(handle); ++ mpi_request.Flags = MPI2_SEP_REQ_FLAGS_DEVHANDLE_ADDRESS; ++ if ((mpt2sas_base_scsi_enclosure_processor(ioc, &mpi_reply, ++ &mpi_request)) != 0) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ return; ++ } ++ ++ if (mpi_reply.IOCStatus || mpi_reply.IOCLogInfo) { ++ dewtprintk(ioc, printk(MPT2SAS_INFO_FMT ++ "enclosure_processor: ioc_status (0x%04x), " ++ "loginfo(0x%08x)\n", ioc->name, ++ le16_to_cpu(mpi_reply.IOCStatus), ++ le32_to_cpu(mpi_reply.IOCLogInfo))); ++ return; ++ } ++ } ++ ++ /* insert into event log */ ++ sz = offsetof(Mpi2EventNotificationReply_t, EventData) + ++ sizeof(Mpi2EventDataSasDeviceStatusChange_t); ++ event_reply = kzalloc(sz, GFP_KERNEL); ++ if (!event_reply) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ return; ++ } ++ ++ event_reply->Function = MPI2_FUNCTION_EVENT_NOTIFICATION; ++ event_reply->Event = ++ cpu_to_le16(MPI2_EVENT_SAS_DEVICE_STATUS_CHANGE); ++ event_reply->MsgLength = sz/4; ++ event_reply->EventDataLength = ++ cpu_to_le16(sizeof(Mpi2EventDataSasDeviceStatusChange_t)/4); ++ event_data = (Mpi2EventDataSasDeviceStatusChange_t *) ++ event_reply->EventData; ++ event_data->ReasonCode = MPI2_EVENT_SAS_DEV_STAT_RC_SMART_DATA; ++ event_data->ASC = 0x5D; ++ event_data->DevHandle = cpu_to_le16(handle); ++ event_data->SASAddress = cpu_to_le64(sas_target_priv_data->sas_address); ++ mpt2sas_ctl_add_to_event_log(ioc, event_reply); ++ kfree(event_reply); ++} ++ ++/** ++ * _scsih_io_done - scsi request callback ++ * @ioc: per adapter object ++ * @smid: system request message index ++ * @VF_ID: virtual function id ++ * @reply: reply message frame(lower 32bit addr) ++ * ++ * Callback handler when using _scsih_qcmd. ++ * ++ * Return nothing. ++ */ ++static void ++_scsih_io_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 VF_ID, u32 reply) ++{ ++ Mpi2SCSIIORequest_t *mpi_request; ++ Mpi2SCSIIOReply_t *mpi_reply; ++ struct scsi_cmnd *scmd; ++ u16 ioc_status; ++ u32 xfer_cnt; ++ u8 scsi_state; ++ u8 scsi_status; ++ u32 log_info; ++ struct MPT2SAS_DEVICE *sas_device_priv_data; ++ u32 response_code; ++ ++ mpi_reply = mpt2sas_base_get_reply_virt_addr(ioc, reply); ++ scmd = _scsih_scsi_lookup_getclear(ioc, smid); ++ if (scmd == NULL) ++ return; ++ ++ mpi_request = mpt2sas_base_get_msg_frame(ioc, smid); ++ ++ if (mpi_reply == NULL) { ++ scmd->result = DID_OK << 16; ++ goto out; ++ } ++ ++ sas_device_priv_data = scmd->device->hostdata; ++ if (!sas_device_priv_data || !sas_device_priv_data->sas_target || ++ sas_device_priv_data->sas_target->deleted) { ++ scmd->result = DID_NO_CONNECT << 16; ++ goto out; ++ } ++ ++ /* turning off TLR */ ++ if (!sas_device_priv_data->tlr_snoop_check) { ++ sas_device_priv_data->tlr_snoop_check++; ++ if (sas_device_priv_data->flags & MPT_DEVICE_TLR_ON) { ++ response_code = (le32_to_cpu(mpi_reply->ResponseInfo) ++ >> 24); ++ if (response_code == ++ MPI2_SCSITASKMGMT_RSP_INVALID_FRAME) ++ sas_device_priv_data->flags &= ++ ~MPT_DEVICE_TLR_ON; ++ } ++ } ++ ++ xfer_cnt = le32_to_cpu(mpi_reply->TransferCount); ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)) ++ scmd->resid = scmd->request_bufflen - xfer_cnt; ++#else ++ scsi_set_resid(scmd, scsi_bufflen(scmd) - xfer_cnt); ++#endif ++ ioc_status = le16_to_cpu(mpi_reply->IOCStatus); ++ if (ioc_status & MPI2_IOCSTATUS_FLAG_LOG_INFO_AVAILABLE) ++ log_info = le32_to_cpu(mpi_reply->IOCLogInfo); ++ else ++ log_info = 0; ++ ioc_status &= MPI2_IOCSTATUS_MASK; ++ scsi_state = mpi_reply->SCSIState; ++ scsi_status = mpi_reply->SCSIStatus; ++ ++ if (ioc_status == MPI2_IOCSTATUS_SCSI_DATA_UNDERRUN && xfer_cnt == 0 && ++ (scsi_status == MPI2_SCSI_STATUS_BUSY || ++ scsi_status == MPI2_SCSI_STATUS_RESERVATION_CONFLICT || ++ scsi_status == MPI2_SCSI_STATUS_TASK_SET_FULL)) { ++ ioc_status = MPI2_IOCSTATUS_SUCCESS; ++ } ++ ++ if (scsi_state & MPI2_SCSI_STATE_AUTOSENSE_VALID) { ++ struct sense_info data; ++ const void *sense_data = mpt2sas_base_get_sense_buffer(ioc, ++ smid); ++ u32 sz = min_t(u32, SCSI_SENSE_BUFFERSIZE, ++ le32_to_cpu(mpi_reply->SenseCount)); ++ memcpy(scmd->sense_buffer, sense_data, sz); ++ _scsih_normalize_sense(scmd->sense_buffer, &data); ++ /* failure prediction threshold exceeded */ ++ if (data.asc == 0x5D) ++ _scsih_smart_predicted_fault(ioc, ++ le16_to_cpu(mpi_reply->DevHandle)); ++ } ++ ++ switch (ioc_status) { ++ case MPI2_IOCSTATUS_BUSY: ++ case MPI2_IOCSTATUS_INSUFFICIENT_RESOURCES: ++ scmd->result = SAM_STAT_BUSY; ++ break; ++ ++ case MPI2_IOCSTATUS_SCSI_DEVICE_NOT_THERE: ++ scmd->result = DID_NO_CONNECT << 16; ++ break; ++ ++ case MPI2_IOCSTATUS_SCSI_IOC_TERMINATED: ++ if (sas_device_priv_data->block) { ++ scmd->result = (DID_BUS_BUSY << 16); ++ break; ++ } ++ ++ case MPI2_IOCSTATUS_SCSI_TASK_TERMINATED: ++ case MPI2_IOCSTATUS_SCSI_EXT_TERMINATED: ++ scmd->result = DID_RESET << 16; ++ break; ++ ++ case MPI2_IOCSTATUS_SCSI_RESIDUAL_MISMATCH: ++ if ((xfer_cnt == 0) || (scmd->underflow > xfer_cnt)) ++ scmd->result = DID_SOFT_ERROR << 16; ++ else ++ scmd->result = (DID_OK << 16) | scsi_status; ++ break; ++ ++ case MPI2_IOCSTATUS_SCSI_DATA_UNDERRUN: ++ scmd->result = (DID_OK << 16) | scsi_status; ++ ++ if ((scsi_state & MPI2_SCSI_STATE_AUTOSENSE_VALID)) ++ break; ++ ++ if (xfer_cnt < scmd->underflow) { ++ if (scsi_status == SAM_STAT_BUSY) ++ scmd->result = SAM_STAT_BUSY; ++ else ++ scmd->result = DID_SOFT_ERROR << 16; ++ } else if (scsi_state & (MPI2_SCSI_STATE_AUTOSENSE_FAILED | ++ MPI2_SCSI_STATE_NO_SCSI_STATUS)) ++ scmd->result = DID_SOFT_ERROR << 16; ++ else if (scsi_state & MPI2_SCSI_STATE_TERMINATED) ++ scmd->result = DID_RESET << 16; ++ else if (!xfer_cnt && scmd->cmnd[0] == REPORT_LUNS) { ++ mpi_reply->SCSIState = MPI2_SCSI_STATE_AUTOSENSE_VALID; ++ mpi_reply->SCSIStatus = SAM_STAT_CHECK_CONDITION; ++ scmd->result = (DRIVER_SENSE << 24) | ++ SAM_STAT_CHECK_CONDITION; ++ scmd->sense_buffer[0] = 0x70; ++ scmd->sense_buffer[2] = ILLEGAL_REQUEST; ++ scmd->sense_buffer[12] = 0x20; ++ scmd->sense_buffer[13] = 0; ++ } ++ break; ++ ++ case MPI2_IOCSTATUS_SCSI_DATA_OVERRUN: ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)) ++ scmd->resid = 0; ++#else ++ scsi_set_resid(scmd, 0); ++#endif ++ case MPI2_IOCSTATUS_SCSI_RECOVERED_ERROR: ++ case MPI2_IOCSTATUS_SUCCESS: ++ scmd->result = (DID_OK << 16) | scsi_status; ++ if (scsi_state & (MPI2_SCSI_STATE_AUTOSENSE_FAILED | ++ MPI2_SCSI_STATE_NO_SCSI_STATUS)) ++ scmd->result = DID_SOFT_ERROR << 16; ++ else if (scsi_state & MPI2_SCSI_STATE_TERMINATED) ++ scmd->result = DID_RESET << 16; ++ break; ++ ++#if defined(EEDP_SUPPORT) ++ case MPI2_IOCSTATUS_EEDP_GUARD_ERROR: ++ case MPI2_IOCSTATUS_EEDP_REF_TAG_ERROR: ++ case MPI2_IOCSTATUS_EEDP_APP_TAG_ERROR: ++ _scsih_eedp_error_handling(scmd, ioc_status); ++ break; ++#endif /* EEDP Support */ ++ ++ case MPI2_IOCSTATUS_SCSI_PROTOCOL_ERROR: ++ case MPI2_IOCSTATUS_INVALID_FUNCTION: ++ case MPI2_IOCSTATUS_INVALID_SGL: ++ case MPI2_IOCSTATUS_INTERNAL_ERROR: ++ case MPI2_IOCSTATUS_INVALID_FIELD: ++ case MPI2_IOCSTATUS_INVALID_STATE: ++ case MPI2_IOCSTATUS_SCSI_IO_DATA_ERROR: ++ case MPI2_IOCSTATUS_SCSI_TASK_MGMT_FAILED: ++ default: ++ scmd->result = DID_SOFT_ERROR << 16; ++ break; ++ ++ } ++ ++#ifdef CONFIG_SCSI_MPT2SAS_LOGGING ++ if (scmd->result && (ioc->logging_level & MPT_DEBUG_REPLY)) ++ _scsih_scsi_ioc_info(ioc , scmd, mpi_reply, smid); ++#endif ++ ++ out: ++ ++#if defined(CRACK_MONKEY_EEDP) && defined(EEDP_SUPPORT) ++ if (scmd->cmnd[0] == INQUIRY && scmd->host_scribble) { ++ char *some_data = scmd->host_scribble; ++ char inq_str[16]; ++ ++ memset(inq_str, 0, 16); ++ strncpy(inq_str, &some_data[16], 10); ++ if (!strcmp(inq_str, "Harpy Disk")) ++ some_data[5] |= 1; ++ scmd->host_scribble = NULL; ++ } ++#endif /* CRACK_MONKEY_EEDP */ ++ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)) ++ if (scmd->use_sg) ++ pci_unmap_sg(ioc->pdev, (struct scatterlist *) ++ scmd->request_buffer, scmd->use_sg, ++ scmd->sc_data_direction); ++ else if (scmd->request_bufflen) ++ pci_unmap_single(ioc->pdev, scmd->SCp.dma_handle, ++ scmd->request_bufflen, scmd->sc_data_direction); ++#else ++ scsi_dma_unmap(scmd); ++#endif ++ ++ scmd->scsi_done(scmd); ++} ++ ++/** ++ * _scsih_sas_host_refresh - refreshing sas host object contents ++ * @ioc: per adapter object ++ * @update: update link information ++ * Context: user ++ * ++ * During port enable, fw will send topology events for every device. Its ++ * possible that the handles may change from the previous setting, so this ++ * code keeping handles updating if changed. ++ * ++ * Return nothing. ++ */ ++static void ++_scsih_sas_host_refresh(struct MPT2SAS_ADAPTER *ioc, u8 update) ++{ ++ u16 sz; ++ u16 ioc_status; ++ int i; ++ Mpi2ConfigReply_t mpi_reply; ++ Mpi2SasIOUnitPage0_t *sas_iounit_pg0 = NULL; ++ ++ dtmprintk(ioc, printk(MPT2SAS_INFO_FMT ++ "updating handles for sas_host(0x%016llx)\n", ++ ioc->name, (unsigned long long)ioc->sas_hba.sas_address)); ++ ++ sz = offsetof(Mpi2SasIOUnitPage0_t, PhyData) + (ioc->sas_hba.num_phys ++ * sizeof(Mpi2SasIOUnit0PhyData_t)); ++ sas_iounit_pg0 = kzalloc(sz, GFP_KERNEL); ++ if (!sas_iounit_pg0) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ return; ++ } ++ if (!(mpt2sas_config_get_sas_iounit_pg0(ioc, &mpi_reply, ++ sas_iounit_pg0, sz))) { ++ ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & ++ MPI2_IOCSTATUS_MASK; ++ if (ioc_status != MPI2_IOCSTATUS_SUCCESS) ++ goto out; ++ for (i = 0; i < ioc->sas_hba.num_phys ; i++) { ++ ioc->sas_hba.phy[i].handle = ++ le16_to_cpu(sas_iounit_pg0->PhyData[i]. ++ ControllerDevHandle); ++ if (update) ++ mpt2sas_transport_update_links( ++ ioc, ++ ioc->sas_hba.phy[i].handle, ++ le16_to_cpu(sas_iounit_pg0->PhyData[i]. ++ AttachedDevHandle), i, ++ sas_iounit_pg0->PhyData[i]. ++ NegotiatedLinkRate >> 4); ++ } ++ } ++ ++ out: ++ kfree(sas_iounit_pg0); ++} ++ ++/** ++ * _scsih_sas_host_add - create sas host object ++ * @ioc: per adapter object ++ * ++ * Creating host side data object, stored in ioc->sas_hba ++ * ++ * Return nothing. ++ */ ++static void ++_scsih_sas_host_add(struct MPT2SAS_ADAPTER *ioc) ++{ ++ int i; ++ Mpi2ConfigReply_t mpi_reply; ++ Mpi2SasIOUnitPage0_t *sas_iounit_pg0 = NULL; ++ Mpi2SasIOUnitPage1_t *sas_iounit_pg1 = NULL; ++ Mpi2SasPhyPage0_t phy_pg0; ++ Mpi2SasDevicePage0_t sas_device_pg0; ++ Mpi2SasEnclosurePage0_t enclosure_pg0; ++ u16 ioc_status; ++ u16 sz; ++ u16 device_missing_delay; ++ ++ mpt2sas_config_get_number_hba_phys(ioc, &ioc->sas_hba.num_phys); ++ if (!ioc->sas_hba.num_phys) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ return; ++ } ++ ++ /* sas_iounit page 0 */ ++ sz = offsetof(Mpi2SasIOUnitPage0_t, PhyData) + (ioc->sas_hba.num_phys * ++ sizeof(Mpi2SasIOUnit0PhyData_t)); ++ sas_iounit_pg0 = kzalloc(sz, GFP_KERNEL); ++ if (!sas_iounit_pg0) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ return; ++ } ++ if ((mpt2sas_config_get_sas_iounit_pg0(ioc, &mpi_reply, ++ sas_iounit_pg0, sz))) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ goto out; ++ } ++ ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & ++ MPI2_IOCSTATUS_MASK; ++ if (ioc_status != MPI2_IOCSTATUS_SUCCESS) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ goto out; ++ } ++ ++ /* sas_iounit page 1 */ ++ sz = offsetof(Mpi2SasIOUnitPage1_t, PhyData) + (ioc->sas_hba.num_phys * ++ sizeof(Mpi2SasIOUnit1PhyData_t)); ++ sas_iounit_pg1 = kzalloc(sz, GFP_KERNEL); ++ if (!sas_iounit_pg1) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ goto out; ++ } ++ if ((mpt2sas_config_get_sas_iounit_pg1(ioc, &mpi_reply, ++ sas_iounit_pg1, sz))) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ goto out; ++ } ++ ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & ++ MPI2_IOCSTATUS_MASK; ++ if (ioc_status != MPI2_IOCSTATUS_SUCCESS) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ goto out; ++ } ++ ++ ioc->io_missing_delay = ++ le16_to_cpu(sas_iounit_pg1->IODeviceMissingDelay); ++ device_missing_delay = ++ le16_to_cpu(sas_iounit_pg1->ReportDeviceMissingDelay); ++ if (device_missing_delay & MPI2_SASIOUNIT1_REPORT_MISSING_UNIT_16) ++ ioc->device_missing_delay = (device_missing_delay & ++ MPI2_SASIOUNIT1_REPORT_MISSING_TIMEOUT_MASK) * 16; ++ else ++ ioc->device_missing_delay = device_missing_delay & ++ MPI2_SASIOUNIT1_REPORT_MISSING_TIMEOUT_MASK; ++ ++ ioc->sas_hba.parent_dev = &ioc->shost->shost_gendev; ++ ioc->sas_hba.phy = kcalloc(ioc->sas_hba.num_phys, ++ sizeof(struct _sas_phy), GFP_KERNEL); ++ if (!ioc->sas_hba.phy) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ goto out; ++ } ++ for (i = 0; i < ioc->sas_hba.num_phys ; i++) { ++ if ((mpt2sas_config_get_phy_pg0(ioc, &mpi_reply, &phy_pg0, ++ i))) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ goto out; ++ } ++ ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & ++ MPI2_IOCSTATUS_MASK; ++ if (ioc_status != MPI2_IOCSTATUS_SUCCESS) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ goto out; ++ } ++ ioc->sas_hba.phy[i].handle = ++ le16_to_cpu(sas_iounit_pg0->PhyData[i].ControllerDevHandle); ++ ioc->sas_hba.phy[i].phy_id = i; ++ mpt2sas_transport_add_host_phy(ioc, &ioc->sas_hba.phy[i], ++ phy_pg0, ioc->sas_hba.parent_dev); ++ } ++ if ((mpt2sas_config_get_sas_device_pg0(ioc, &mpi_reply, &sas_device_pg0, ++ MPI2_SAS_DEVICE_PGAD_FORM_HANDLE, ioc->sas_hba.phy[0].handle))) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ goto out; ++ } ++ ioc->sas_hba.handle = le16_to_cpu(sas_device_pg0.DevHandle); ++ ioc->sas_hba.enclosure_handle = ++ le16_to_cpu(sas_device_pg0.EnclosureHandle); ++ ioc->sas_hba.sas_address = le64_to_cpu(sas_device_pg0.SASAddress); ++ printk(MPT2SAS_INFO_FMT "host_add: handle(0x%04x), " ++ "sas_addr(0x%016llx), phys(%d)\n", ioc->name, ioc->sas_hba.handle, ++ (unsigned long long) ioc->sas_hba.sas_address, ++ ioc->sas_hba.num_phys) ; ++ ++ if (ioc->sas_hba.enclosure_handle) { ++ if (!(mpt2sas_config_get_enclosure_pg0(ioc, &mpi_reply, ++ &enclosure_pg0, MPI2_SAS_ENCLOS_PGAD_FORM_HANDLE, ++ ioc->sas_hba.enclosure_handle))) ++ ioc->sas_hba.enclosure_logical_id = ++ le64_to_cpu(enclosure_pg0.EnclosureLogicalID); ++ } ++ ++ out: ++ kfree(sas_iounit_pg1); ++ kfree(sas_iounit_pg0); ++} ++ ++/** ++ * _scsih_expander_add - creating expander object ++ * @ioc: per adapter object ++ * @handle: expander handle ++ * ++ * Creating expander object, stored in ioc->sas_expander_list. ++ * ++ * Return 0 for success, else error. ++ */ ++static int ++_scsih_expander_add(struct MPT2SAS_ADAPTER *ioc, u16 handle) ++{ ++ struct _sas_node *sas_expander; ++ Mpi2ConfigReply_t mpi_reply; ++ Mpi2ExpanderPage0_t expander_pg0; ++ Mpi2ExpanderPage1_t expander_pg1; ++ Mpi2SasEnclosurePage0_t enclosure_pg0; ++ u32 ioc_status; ++ u16 parent_handle; ++ __le64 sas_address; ++ int i; ++ unsigned long flags; ++ struct _sas_port *mpt2sas_port = NULL; ++ ++ int rc = 0; ++ ++ if (!handle) ++ return -1; ++ ++ if (ioc->shost_recovery) ++ return -1; ++ ++ if ((mpt2sas_config_get_expander_pg0(ioc, &mpi_reply, &expander_pg0, ++ MPI2_SAS_EXPAND_PGAD_FORM_HNDL, handle))) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ return -1; ++ } ++ ++ ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & ++ MPI2_IOCSTATUS_MASK; ++ if (ioc_status != MPI2_IOCSTATUS_SUCCESS) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ return -1; ++ } ++ ++ /* handle out of order topology events */ ++ parent_handle = le16_to_cpu(expander_pg0.ParentDevHandle); ++ if (parent_handle >= ioc->sas_hba.num_phys) { ++ spin_lock_irqsave(&ioc->sas_node_lock, flags); ++ sas_expander = mpt2sas_scsih_expander_find_by_handle(ioc, ++ parent_handle); ++ spin_unlock_irqrestore(&ioc->sas_node_lock, flags); ++ if (!sas_expander) { ++ rc = _scsih_expander_add(ioc, parent_handle); ++ if (rc != 0) ++ return rc; ++ } ++ } ++ ++ spin_lock_irqsave(&ioc->sas_node_lock, flags); ++ sas_address = le64_to_cpu(expander_pg0.SASAddress); ++ sas_expander = mpt2sas_scsih_expander_find_by_sas_address(ioc, ++ sas_address); ++ spin_unlock_irqrestore(&ioc->sas_node_lock, flags); ++ ++ if (sas_expander) ++ return 0; ++ ++ sas_expander = kzalloc(sizeof(struct _sas_node), ++ GFP_KERNEL); ++ if (!sas_expander) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ return -1; ++ } ++ ++ sas_expander->handle = handle; ++ sas_expander->num_phys = expander_pg0.NumPhys; ++ sas_expander->parent_handle = parent_handle; ++ sas_expander->enclosure_handle = ++ le16_to_cpu(expander_pg0.EnclosureHandle); ++ sas_expander->sas_address = sas_address; ++ ++ printk(MPT2SAS_INFO_FMT "expander_add: handle(0x%04x)," ++ " parent(0x%04x), sas_addr(0x%016llx), phys(%d)\n", ioc->name, ++ handle, sas_expander->parent_handle, (unsigned long long) ++ sas_expander->sas_address, sas_expander->num_phys); ++ ++ if (!sas_expander->num_phys) ++ goto out_fail; ++ sas_expander->phy = kcalloc(sas_expander->num_phys, ++ sizeof(struct _sas_phy), GFP_KERNEL); ++ if (!sas_expander->phy) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ rc = -1; ++ goto out_fail; ++ } ++ ++ INIT_LIST_HEAD(&sas_expander->sas_port_list); ++ mpt2sas_port = mpt2sas_transport_port_add(ioc, handle, ++ sas_expander->parent_handle); ++ if (!mpt2sas_port) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ rc = -1; ++ goto out_fail; ++ } ++ sas_expander->parent_dev = &mpt2sas_port->rphy->dev; ++ ++ for (i = 0 ; i < sas_expander->num_phys ; i++) { ++ if ((mpt2sas_config_get_expander_pg1(ioc, &mpi_reply, ++ &expander_pg1, i, handle))) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ rc = -1; ++ goto out_fail; ++ } ++ sas_expander->phy[i].handle = handle; ++ sas_expander->phy[i].phy_id = i; ++ ++ if ((mpt2sas_transport_add_expander_phy(ioc, ++ &sas_expander->phy[i], expander_pg1, ++ sas_expander->parent_dev))) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ rc = -1; ++ goto out_fail; ++ } ++ } ++ ++ if (sas_expander->enclosure_handle) { ++ if (!(mpt2sas_config_get_enclosure_pg0(ioc, &mpi_reply, ++ &enclosure_pg0, MPI2_SAS_ENCLOS_PGAD_FORM_HANDLE, ++ sas_expander->enclosure_handle))) ++ sas_expander->enclosure_logical_id = ++ le64_to_cpu(enclosure_pg0.EnclosureLogicalID); ++ } ++ ++ _scsih_expander_node_add(ioc, sas_expander); ++ return 0; ++ ++ out_fail: ++ ++ if (mpt2sas_port) ++ mpt2sas_transport_port_remove(ioc, sas_expander->sas_address, ++ sas_expander->parent_handle); ++ kfree(sas_expander); ++ return rc; ++} ++ ++/** ++ * _scsih_expander_remove - removing expander object ++ * @ioc: per adapter object ++ * @handle: expander handle ++ * ++ * Return nothing. ++ */ ++static void ++_scsih_expander_remove(struct MPT2SAS_ADAPTER *ioc, u16 handle) ++{ ++ struct _sas_node *sas_expander; ++ unsigned long flags; ++ ++ if (ioc->shost_recovery) ++ return; ++ ++ spin_lock_irqsave(&ioc->sas_node_lock, flags); ++ sas_expander = mpt2sas_scsih_expander_find_by_handle(ioc, handle); ++ spin_unlock_irqrestore(&ioc->sas_node_lock, flags); ++ _scsih_expander_node_remove(ioc, sas_expander); ++} ++ ++/** ++ * _scsih_done - internal SCSI_IO callback handler. ++ * @ioc: per adapter object ++ * @smid: system request message index ++ * @VF_ID: virtual function id ++ * @reply: reply message frame(lower 32bit addr) ++ * ++ * Callback handler when sending internal generated SCSI_IO. ++ * The callback index passed is `ioc->scsih_cb_idx` ++ * ++ * Return nothing. ++ */ ++static void ++_scsih_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 VF_ID, u32 reply) ++{ ++ MPI2DefaultReply_t *mpi_reply; ++ ++ mpi_reply = mpt2sas_base_get_reply_virt_addr(ioc, reply); ++ if (ioc->scsih_cmds.status == MPT2_CMD_NOT_USED) ++ return; ++ if (ioc->scsih_cmds.smid != smid) ++ return; ++ ioc->scsih_cmds.status |= MPT2_CMD_COMPLETE; ++ if (mpi_reply) { ++ memcpy(ioc->scsih_cmds.reply, mpi_reply, ++ mpi_reply->MsgLength*4); ++ ioc->scsih_cmds.status |= MPT2_CMD_REPLY_VALID; ++ } ++ ioc->scsih_cmds.status &= ~MPT2_CMD_PENDING; ++ complete(&ioc->scsih_cmds.done); ++} ++ ++/** ++ * _scsi_send_scsi_io - send internal SCSI_IO to target ++ * @ioc: per adapter object ++ * @transfer_packet: packet describing the transfer ++ * Context: user ++ * ++ * Returns 0 for success, non-zero for failure. ++ */ ++static int ++_scsi_send_scsi_io(struct MPT2SAS_ADAPTER *ioc, struct _scsi_io_transfer ++ *transfer_packet) ++{ ++ Mpi2SCSIIOReply_t *mpi_reply; ++ Mpi2SCSIIORequest_t *mpi_request; ++ u16 smid; ++ u32 ioc_state; ++ unsigned long timeleft; ++ u8 issue_reset; ++ int rc; ++ void *priv_sense; ++ u32 mpi_control; ++ u32 sgl_flags; ++ u16 wait_state_count; ++ ++ if (ioc->shost_recovery) { ++ printk(MPT2SAS_INFO_FMT "%s: host reset in progress!\n", ++ __func__, ioc->name); ++ return -EFAULT; ++ } ++ ++ mutex_lock(&ioc->scsih_cmds.mutex); ++ ++ if (ioc->scsih_cmds.status != MPT2_CMD_NOT_USED) { ++ printk(MPT2SAS_ERR_FMT "%s: scsih_cmd in use\n", ++ ioc->name, __func__); ++ rc = -EAGAIN; ++ goto out; ++ } ++ ioc->scsih_cmds.status = MPT2_CMD_PENDING; ++ ++ wait_state_count = 0; ++ ioc_state = mpt2sas_base_get_iocstate(ioc, 1); ++ while (ioc_state != MPI2_IOC_STATE_OPERATIONAL) { ++ if (wait_state_count++ == 10) { ++ printk(MPT2SAS_ERR_FMT ++ "%s: failed due to ioc not operational\n", ++ ioc->name, __func__); ++ rc = -EFAULT; ++ goto out; ++ } ++ ssleep(1); ++ ioc_state = mpt2sas_base_get_iocstate(ioc, 1); ++ printk(MPT2SAS_INFO_FMT "%s: waiting for " ++ "operational state(count=%d)\n", ioc->name, ++ __func__, wait_state_count); ++ } ++ if (wait_state_count) ++ printk(MPT2SAS_INFO_FMT "%s: ioc is operational\n", ++ ioc->name, __func__); ++ ++ smid = mpt2sas_base_get_smid(ioc, ioc->scsih_cb_idx); ++ if (!smid) { ++ printk(MPT2SAS_ERR_FMT "%s: failed obtaining a smid\n", ++ ioc->name, __func__); ++ rc = -EAGAIN; ++ goto out; ++ } ++ ++ rc = 0; ++ mpi_request = mpt2sas_base_get_msg_frame(ioc, smid); ++ ioc->scsih_cmds.smid = smid; ++ memset(mpi_request, 0, sizeof(Mpi2SCSIIORequest_t)); ++ if (transfer_packet->is_raid) ++ mpi_request->Function = MPI2_FUNCTION_RAID_SCSI_IO_PASSTHROUGH; ++ else ++ mpi_request->Function = MPI2_FUNCTION_SCSI_IO_REQUEST; ++ mpi_request->DevHandle = cpu_to_le16(transfer_packet->handle); ++ ++ /* set scatter gather flags */ ++ sgl_flags = (MPI2_SGE_FLAGS_SIMPLE_ELEMENT | ++ MPI2_SGE_FLAGS_LAST_ELEMENT | MPI2_SGE_FLAGS_END_OF_BUFFER | ++ MPI2_SGE_FLAGS_END_OF_LIST); ++ if (transfer_packet->dir == DMA_TO_DEVICE) ++ sgl_flags |= MPI2_SGE_FLAGS_HOST_TO_IOC; ++ sgl_flags = sgl_flags << MPI2_SGE_FLAGS_SHIFT; ++ ++ switch (transfer_packet->dir) { ++ case DMA_TO_DEVICE: ++ ioc->base_add_sg_single(&mpi_request->SGL, sgl_flags | ++ transfer_packet->data_length, transfer_packet->data_dma); ++ mpi_control = MPI2_SCSIIO_CONTROL_WRITE; ++ break; ++ case DMA_FROM_DEVICE: ++ ioc->base_add_sg_single(&mpi_request->SGL, sgl_flags | ++ transfer_packet->data_length, transfer_packet->data_dma); ++ mpi_control = MPI2_SCSIIO_CONTROL_READ; ++ break; ++ case DMA_BIDIRECTIONAL: ++ mpi_control = MPI2_SCSIIO_CONTROL_BIDIRECTIONAL; ++ /* TODO - is BIDI support needed ?? */ ++ BUG(); ++ break; ++ default: ++ case DMA_NONE: ++ mpi_control = MPI2_SCSIIO_CONTROL_NODATATRANSFER; ++ mpt2sas_base_build_zero_len_sge(ioc, &mpi_request->SGL); ++ break; ++ } ++ mpi_request->Control = cpu_to_le32(mpi_control | ++ MPI2_SCSIIO_CONTROL_SIMPLEQ); ++ mpi_request->DataLength = cpu_to_le32(transfer_packet->data_length); ++ mpi_request->MsgFlags = MPI2_SCSIIO_MSGFLAGS_SYSTEM_SENSE_ADDR; ++ mpi_request->SenseBufferLength = SCSI_SENSE_BUFFERSIZE; ++ mpi_request->SenseBufferLowAddress = ++ (u32)mpt2sas_base_get_sense_buffer_dma(ioc, smid); ++ priv_sense = mpt2sas_base_get_sense_buffer(ioc, smid); ++ mpi_request->SGLOffset0 = offsetof(Mpi2SCSIIORequest_t, SGL) / 4; ++ mpi_request->SGLFlags = cpu_to_le16(MPI2_SCSIIO_SGLFLAGS_TYPE_MPI + ++ MPI2_SCSIIO_SGLFLAGS_SYSTEM_ADDR); ++ mpi_request->IoFlags = cpu_to_le16(transfer_packet->cdb_length); ++ int_to_scsilun(transfer_packet->lun, (struct scsi_lun *) ++ mpi_request->LUN); ++ memcpy(mpi_request->CDB.CDB32, transfer_packet->cdb, ++ transfer_packet->cdb_length); ++ init_completion(&ioc->scsih_cmds.done); ++ mpt2sas_base_put_smid_scsi_io(ioc, smid, 0, transfer_packet->handle); ++ timeleft = wait_for_completion_timeout(&ioc->scsih_cmds.done, ++ transfer_packet->timeout*HZ); ++ if (!(ioc->scsih_cmds.status & MPT2_CMD_COMPLETE)) { ++ printk(MPT2SAS_ERR_FMT "%s: timeout\n", ++ ioc->name, __func__); ++ ++ _debug_dump_mf(mpi_request, sizeof(Mpi2SCSIIORequest_t)/4); ++ ++ if (!(ioc->scsih_cmds.status & MPT2_CMD_RESET)) ++ issue_reset = 1; ++ goto issue_target_reset; ++ } ++ if (ioc->scsih_cmds.status & MPT2_CMD_REPLY_VALID) { ++ transfer_packet->valid_reply = 1; ++ mpi_reply = ioc->scsih_cmds.reply; ++ transfer_packet->sense_length = ++ le32_to_cpu(mpi_reply->SenseCount); ++ if (transfer_packet->sense_length) ++ memcpy(transfer_packet->sense, priv_sense, ++ transfer_packet->sense_length); ++ transfer_packet->transfer_length = ++ le32_to_cpu(mpi_reply->TransferCount); ++ transfer_packet->ioc_status = ++ le16_to_cpu(mpi_reply->IOCStatus) & ++ MPI2_IOCSTATUS_MASK; ++ transfer_packet->scsi_state = mpi_reply->SCSIState; ++ transfer_packet->scsi_status = mpi_reply->SCSIStatus; ++ transfer_packet->log_info = ++ le32_to_cpu(mpi_reply->IOCLogInfo); ++ } ++ goto out; ++ ++ issue_target_reset: ++ if (issue_reset) { ++ printk(MPT2SAS_INFO_FMT "issue target reset: handle" ++ "(0x%04x)\n", ioc->name, transfer_packet->handle); ++ mutex_lock(&ioc->tm_cmds.mutex); ++ mpt2sas_scsih_issue_tm(ioc, transfer_packet->handle, 0, ++ MPI2_SCSITASKMGMT_TASKTYPE_TARGET_RESET, 0, 10); ++ ioc->tm_cmds.status = MPT2_CMD_NOT_USED; ++ mutex_unlock(&ioc->tm_cmds.mutex); ++ /* TODO validate whether command was terminated ++ * so we know whether to call mpt2sas_base_free_smid() ++ */ ++ } ++/* TODO ~ don't allow retries for commands that timeout */ ++#if 0 ++ rc = -EAGAIN; ++#endif ++ rc = -EFAULT; ++ ++ out: ++ ioc->scsih_cmds.status = MPT2_CMD_NOT_USED; ++ mutex_unlock(&ioc->scsih_cmds.mutex); ++ return rc; ++} ++ ++/** ++ * _scsih_determine_disposition - ++ * @ioc: per adapter object ++ * @transfer_packet: packet describing the transfer ++ * Context: user ++ * ++ * Determines if an internal generated scsi_io is good data, or ++ * whether it needs to be retried or treated as an error. ++ * ++ * Returns device_responsive_state ++ */ ++static enum device_responsive_state ++_scsih_determine_disposition(struct MPT2SAS_ADAPTER *ioc, ++ struct _scsi_io_transfer *transfer_packet) ++{ ++ static enum device_responsive_state rc; ++ struct sense_info sense_info = {0, 0, 0}; ++ u8 check_sense = 0; ++#ifdef CONFIG_SCSI_MPT2SAS_LOGGING ++ char *desc = NULL; ++#endif ++ ++ if (!transfer_packet->valid_reply) ++ return DEVICE_READY; ++ ++ switch (transfer_packet->ioc_status) { ++ case MPI2_IOCSTATUS_BUSY: ++ case MPI2_IOCSTATUS_INSUFFICIENT_RESOURCES: ++ case MPI2_IOCSTATUS_SCSI_TASK_TERMINATED: ++ case MPI2_IOCSTATUS_SCSI_IO_DATA_ERROR: ++ case MPI2_IOCSTATUS_SCSI_EXT_TERMINATED: ++ rc = DEVICE_RETRY; ++ break; ++ case MPI2_IOCSTATUS_SCSI_IOC_TERMINATED: ++ if (transfer_packet->cdb[0] == REPORT_LUNS) ++ rc = DEVICE_READY; ++ else ++ rc = DEVICE_RETRY; ++ case MPI2_IOCSTATUS_SCSI_DATA_UNDERRUN: ++ case MPI2_IOCSTATUS_SCSI_RECOVERED_ERROR: ++ case MPI2_IOCSTATUS_SUCCESS: ++ if (!transfer_packet->scsi_state || ++ !transfer_packet->scsi_status) { ++ rc = DEVICE_READY; ++ break; ++ } ++ if (transfer_packet->scsi_state & ++ MPI2_SCSI_STATE_AUTOSENSE_VALID) { ++ rc = DEVICE_ERROR; ++ check_sense = 1; ++ break; ++ } ++ if (transfer_packet->scsi_state & ++ (MPI2_SCSI_STATE_AUTOSENSE_FAILED | ++ MPI2_SCSI_STATE_NO_SCSI_STATUS | ++ MPI2_SCSI_STATE_TERMINATED)) { ++ rc = DEVICE_RETRY; ++ break; ++ } ++ if (transfer_packet->scsi_status >= ++ MPI2_SCSI_STATUS_BUSY) { ++ rc = DEVICE_RETRY; ++ break; ++ } ++ rc = DEVICE_READY; ++ break; ++ case MPI2_IOCSTATUS_SCSI_PROTOCOL_ERROR: ++ if (transfer_packet->scsi_state & ++ MPI2_SCSI_STATE_TERMINATED) ++ rc = DEVICE_RETRY; ++ else ++ rc = DEVICE_ERROR; ++ break; ++ default: ++ rc = DEVICE_ERROR; ++ break; ++ } ++ ++ if (check_sense) { ++ _scsih_normalize_sense(transfer_packet->sense, &sense_info); ++ if (sense_info.skey == UNIT_ATTENTION) ++ rc = DEVICE_RETRY_UA; ++ else if (sense_info.skey == NOT_READY) { ++ /* medium isn't present */ ++ if (sense_info.asc == 0x3a) ++ rc = DEVICE_READY; ++ /* send START_UNIT */ ++ if (sense_info.asc == 0x04 && sense_info.ascq == 0x11) ++ rc = DEVICE_START_UNIT; ++ /* LU becoming ready, or hasn't self-configured yet */ ++ else if ((sense_info.asc == 0x04 && ++ sense_info.ascq == 0x01) || sense_info.asc == 0x3e) ++ rc = DEVICE_RETRY; ++ } else if (sense_info.skey == ILLEGAL_REQUEST && ++ transfer_packet->cdb[0] == REPORT_LUNS) { ++ rc = DEVICE_READY; ++ } ++ } ++ ++#ifdef CONFIG_SCSI_MPT2SAS_LOGGING ++ if (ioc->logging_level & MPT_DEBUG_EVENT_WORK_TASK) { ++ switch (rc) { ++ case DEVICE_READY: ++ desc = "ready"; ++ break; ++ case DEVICE_RETRY: ++ desc = "retry"; ++ break; ++ case DEVICE_RETRY_UA: ++ desc = "retry_ua"; ++ break; ++ case DEVICE_START_UNIT: ++ desc = "start_unit"; ++ break; ++ case DEVICE_ERROR: ++ desc = "error"; ++ break; ++ } ++ ++ printk(MPT2SAS_INFO_FMT "\tioc_status(0x%04x), " ++ "loginfo(0x%08x), rc(%s)\n", ++ ioc->name, transfer_packet->ioc_status, ++ transfer_packet->log_info, desc); ++ ++ if (check_sense) ++ printk(MPT2SAS_INFO_FMT "\t[sense_key,asc,ascq]: " ++ "[0x%02x,0x%02x,0x%02x]\n", ioc->name, ++ sense_info.skey, sense_info.asc, sense_info.ascq); ++ } ++#endif ++ return rc; ++} ++ ++#if defined(EEDP_SUPPORT) ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27)) ++/** ++ * _scsih_read_capacity_16 - send READ_CAPACITY_16 to target ++ * @ioc: per adapter object ++ * @handle: expander handle ++ * @data: report luns data payload ++ * @data_length: length of data in bytes ++ * Context: user ++ * ++ * Returns device_responsive_state ++ */ ++static enum device_responsive_state ++_scsih_read_capacity_16(struct MPT2SAS_ADAPTER *ioc, u16 handle, u32 lun, ++ void *data, u32 data_length) ++{ ++ struct _scsi_io_transfer *transfer_packet; ++ enum device_responsive_state rc; ++ void *parameter_data; ++ int return_code; ++ ++ parameter_data = NULL; ++ transfer_packet = kzalloc(sizeof(struct _scsi_io_transfer), GFP_KERNEL); ++ if (!transfer_packet) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ rc = DEVICE_RETRY; ++ goto out; ++ } ++ ++ parameter_data = pci_alloc_consistent(ioc->pdev, data_length, ++ &transfer_packet->data_dma); ++ if (!parameter_data) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ rc = DEVICE_RETRY; ++ goto out; ++ } ++ ++ rc = DEVICE_READY; ++ memset(parameter_data, 0, data_length); ++ transfer_packet->handle = handle; ++ transfer_packet->lun = lun; ++ transfer_packet->dir = DMA_FROM_DEVICE; ++ transfer_packet->data_length = data_length; ++ transfer_packet->cdb_length = 16; ++ transfer_packet->cdb[0] = SERVICE_ACTION_IN; ++ transfer_packet->cdb[1] = 0x10; ++ transfer_packet->cdb[13] = data_length; ++ transfer_packet->timeout = 10; ++ ++ return_code = _scsi_send_scsi_io(ioc, transfer_packet); ++ if (return_code == -EFAULT) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ rc = DEVICE_ERROR; ++ goto out; ++ } else if (return_code == -EAGAIN) { ++ rc = DEVICE_RETRY; ++ goto out; ++ } ++ ++ rc = _scsih_determine_disposition(ioc, transfer_packet); ++ if (rc == DEVICE_READY) ++ memcpy(data, parameter_data, data_length); ++ ++ out: ++ if (parameter_data) ++ pci_free_consistent(ioc->pdev, data_length, parameter_data, ++ transfer_packet->data_dma); ++ kfree(transfer_packet); ++ return rc; ++} ++#endif ++#endif /* EEDP Support */ ++ ++#ifdef MPT2SAS_MULTIPATH ++/** ++ * _scsih_inquiry_vpd_sn - obtain device serial number ++ * @ioc: per adapter object ++ * @handle: device handle ++ * @data: report luns data payload ++ * @data_length: length of data in bytes ++ * Context: user ++ * ++ * Returns device_responsive_state ++ */ ++static enum device_responsive_state ++_scsih_inquiry_vpd_sn(struct MPT2SAS_ADAPTER *ioc, u16 handle, void *data, ++ u32 data_length) ++{ ++ struct _scsi_io_transfer *transfer_packet; ++ enum device_responsive_state rc; ++ void *inq_data; ++ int return_code; ++ ++ inq_data = NULL; ++ transfer_packet = kzalloc(sizeof(struct _scsi_io_transfer), GFP_KERNEL); ++ if (!transfer_packet) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ rc = DEVICE_RETRY; ++ goto out; ++ } ++ ++ inq_data = pci_alloc_consistent(ioc->pdev, data_length, ++ &transfer_packet->data_dma); ++ if (!inq_data) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ rc = DEVICE_RETRY; ++ goto out; ++ } ++ ++ rc = DEVICE_READY; ++ memset(inq_data, 0, data_length); ++ transfer_packet->handle = handle; ++ transfer_packet->dir = DMA_FROM_DEVICE; ++ transfer_packet->data_length = data_length; ++ transfer_packet->cdb_length = 6; ++ transfer_packet->cdb[0] = INQUIRY; ++ transfer_packet->cdb[1] = 1; ++ transfer_packet->cdb[2] = 0x80; ++ transfer_packet->cdb[4] = data_length; ++ transfer_packet->timeout = 5; ++ ++ return_code = _scsi_send_scsi_io(ioc, transfer_packet); ++ if (return_code == -EFAULT) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ rc = DEVICE_ERROR; ++ goto out; ++ } else if (return_code == -EAGAIN) { ++ rc = DEVICE_RETRY; ++ goto out; ++ } ++ ++ rc = _scsih_determine_disposition(ioc, transfer_packet); ++ if (rc == DEVICE_READY) ++ memcpy(data, inq_data, data_length); ++ ++ out: ++ if (inq_data) ++ pci_free_consistent(ioc->pdev, data_length, inq_data, ++ transfer_packet->data_dma); ++ kfree(transfer_packet); ++ return rc; ++} ++#endif ++ ++/** ++ * _scsih_inquiry_vpd_supported_pages - get supported pages ++ * @ioc: per adapter object ++ * @handle: device handle ++ * @data: report luns data payload ++ * @data_length: length of data in bytes ++ * Context: user ++ * ++ * Returns device_responsive_state ++ */ ++static enum device_responsive_state ++_scsih_inquiry_vpd_supported_pages(struct MPT2SAS_ADAPTER *ioc, u16 handle, u32 lun, ++ void *data, u32 data_length) ++{ ++ struct _scsi_io_transfer *transfer_packet; ++ enum device_responsive_state rc; ++ void *inq_data; ++ int return_code; ++ ++ inq_data = NULL; ++ transfer_packet = kzalloc(sizeof(struct _scsi_io_transfer), GFP_KERNEL); ++ if (!transfer_packet) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ rc = DEVICE_RETRY; ++ goto out; ++ } ++ ++ inq_data = pci_alloc_consistent(ioc->pdev, data_length, ++ &transfer_packet->data_dma); ++ if (!inq_data) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ rc = DEVICE_RETRY; ++ goto out; ++ } ++ ++ rc = DEVICE_READY; ++ memset(inq_data, 0, data_length); ++ transfer_packet->handle = handle; ++ transfer_packet->dir = DMA_FROM_DEVICE; ++ transfer_packet->data_length = data_length; ++ transfer_packet->cdb_length = 6; ++ transfer_packet->lun = lun; ++ transfer_packet->cdb[0] = INQUIRY; ++ transfer_packet->cdb[1] = 1; ++ transfer_packet->cdb[4] = data_length; ++ transfer_packet->timeout = 5; ++ ++ return_code = _scsi_send_scsi_io(ioc, transfer_packet); ++ if (return_code == -EFAULT) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ rc = DEVICE_ERROR; ++ goto out; ++ } else if (return_code == -EAGAIN) { ++ rc = DEVICE_RETRY; ++ goto out; ++ } ++ ++ rc = _scsih_determine_disposition(ioc, transfer_packet); ++ if (rc == DEVICE_READY) ++ memcpy(data, inq_data, data_length); ++ ++ out: ++ if (inq_data) ++ pci_free_consistent(ioc->pdev, data_length, inq_data, ++ transfer_packet->data_dma); ++ kfree(transfer_packet); ++ return rc; ++} ++ ++/** ++ * _scsih_report_luns - send REPORT_LUNS to target ++ * @ioc: per adapter object ++ * @handle: expander handle ++ * @data: report luns data payload ++ * @data_length: length of data in bytes ++ * @is_pd: is this hidden raid component ++ * Context: user ++ * ++ * Returns device_responsive_state ++ */ ++static enum device_responsive_state ++_scsih_report_luns(struct MPT2SAS_ADAPTER *ioc, u16 handle, void *data, ++ u32 data_length, u8 is_pd) ++{ ++ struct _scsi_io_transfer *transfer_packet; ++ enum device_responsive_state rc; ++ void *lun_data; ++ int return_code; ++ ++ lun_data = NULL; ++ transfer_packet = kzalloc(sizeof(struct _scsi_io_transfer), GFP_KERNEL); ++ if (!transfer_packet) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ rc = DEVICE_RETRY; ++ goto out; ++ } ++ ++ lun_data = pci_alloc_consistent(ioc->pdev, data_length, ++ &transfer_packet->data_dma); ++ if (!lun_data) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ rc = DEVICE_RETRY; ++ goto out; ++ } ++ ++ rc = DEVICE_READY; ++ memset(lun_data, 0, data_length); ++ transfer_packet->handle = handle; ++ transfer_packet->dir = DMA_FROM_DEVICE; ++ transfer_packet->data_length = data_length; ++ transfer_packet->cdb_length = 12; ++ transfer_packet->cdb[0] = REPORT_LUNS; ++ transfer_packet->cdb[6] = (data_length >> 24) & 0xFF; ++ transfer_packet->cdb[7] = (data_length >> 16) & 0xFF; ++ transfer_packet->cdb[8] = (data_length >> 8) & 0xFF; ++ transfer_packet->cdb[9] = data_length & 0xFF; ++ transfer_packet->timeout = 30; ++ transfer_packet->is_raid = is_pd; ++ ++ return_code = _scsi_send_scsi_io(ioc, transfer_packet); ++ if (return_code == -EFAULT) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ rc = DEVICE_ERROR; ++ goto out; ++ } else if (return_code == -EAGAIN) { ++ rc = DEVICE_RETRY; ++ goto out; ++ } ++ ++ rc = _scsih_determine_disposition(ioc, transfer_packet); ++ if (rc == DEVICE_READY) ++ memcpy(data, lun_data, data_length); ++ ++ out: ++ if (lun_data) ++ pci_free_consistent(ioc->pdev, data_length, lun_data, ++ transfer_packet->data_dma); ++ kfree(transfer_packet); ++ return rc; ++} ++ ++/** ++ * _scsih_start_unit - send START_UNIT to target ++ * @ioc: per adapter object ++ * @handle: expander handle ++ * @lun: lun number ++ * @is_pd: is this hidden raid component ++ * Context: user ++ * ++ * Returns device_responsive_state ++ */ ++static enum device_responsive_state ++_scsih_start_unit(struct MPT2SAS_ADAPTER *ioc, u16 handle, u32 lun, u8 is_pd) ++{ ++ struct _scsi_io_transfer *transfer_packet; ++ enum device_responsive_state rc; ++ ++ transfer_packet = kzalloc(sizeof(struct _scsi_io_transfer), GFP_KERNEL); ++ if (!transfer_packet) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ rc = DEVICE_RETRY; ++ goto out; ++ } ++ ++ rc = DEVICE_READY; ++ transfer_packet->handle = handle; ++ transfer_packet->dir = DMA_NONE; ++ transfer_packet->lun = lun; ++ transfer_packet->cdb_length = 6; ++ transfer_packet->cdb[0] = START_STOP; ++ transfer_packet->cdb[4] = 1; ++ transfer_packet->timeout = 30; ++ transfer_packet->is_raid = is_pd; ++ ++ if ((_scsi_send_scsi_io(ioc, transfer_packet))) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ rc = DEVICE_RETRY; ++ goto out; ++ } ++ ++ rc = _scsih_determine_disposition(ioc, transfer_packet); ++ ++ out: ++ kfree(transfer_packet); ++ return rc; ++} ++ ++/** ++ * _scsih_test_unit_ready - send TUR to target ++ * @ioc: per adapter object ++ * @handle: expander handle ++ * @lun: lun number ++ * @is_pd: is this hidden raid component ++ * Context: user ++ * ++ * Returns device_responsive_state ++ */ ++static enum device_responsive_state ++_scsih_test_unit_ready(struct MPT2SAS_ADAPTER *ioc, u16 handle, u32 lun, ++ u8 is_pd) ++{ ++ struct _scsi_io_transfer *transfer_packet; ++ enum device_responsive_state rc; ++ ++ transfer_packet = kzalloc(sizeof(struct _scsi_io_transfer), GFP_KERNEL); ++ if (!transfer_packet) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ rc = DEVICE_RETRY; ++ goto out; ++ } ++ ++ rc = DEVICE_READY; ++ transfer_packet->handle = handle; ++ transfer_packet->dir = DMA_NONE; ++ transfer_packet->lun = lun; ++ transfer_packet->cdb_length = 6; ++ transfer_packet->cdb[0] = TEST_UNIT_READY; ++ transfer_packet->timeout = 10; ++ transfer_packet->is_raid = is_pd; ++ ++ if ((_scsi_send_scsi_io(ioc, transfer_packet))) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ rc = DEVICE_RETRY; ++ goto out; ++ } ++ ++ rc = _scsih_determine_disposition(ioc, transfer_packet); ++ ++ out: ++ kfree(transfer_packet); ++ return rc; ++} ++ ++#define MPT2_MAX_LUNS (255) ++ ++/** ++ * _scsih_wait_for_device_to_become_ready - handle busy devices ++ * @ioc: per adapter object ++ * @handle: expander handle ++ * @retry_count: number of times this event has been retried ++ * @is_pd: is this hidden raid component ++ * ++ * Some devices spend too much time in busy state, queue event later ++ * ++ * Return the device_responsive_state. ++ */ ++static enum device_responsive_state ++_scsih_wait_for_device_to_become_ready(struct MPT2SAS_ADAPTER *ioc, u16 handle, ++ u8 retry_count, u8 is_pd) ++{ ++ enum device_responsive_state rc; ++ struct scsi_lun *lun_data; ++ u32 length, num_luns; ++ u8 *data; ++ int lun; ++ ++ lun_data = kcalloc(MPT2_MAX_LUNS, sizeof(struct scsi_lun), GFP_KERNEL); ++ if (!lun_data) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ return DEVICE_RETRY; ++ } ++ ++ retry_rlun: ++ ++ dewtprintk(ioc, printk(MPT2SAS_INFO_FMT "RLUN: handle(0x%04x), " ++ "retry_count(%d)\n", ioc->name, handle, retry_count)); ++ ++ rc = _scsih_report_luns(ioc, handle, lun_data, ++ MPT2_MAX_LUNS * sizeof(struct scsi_lun), is_pd); ++ ++ if (rc == DEVICE_RETRY_UA) ++ goto retry_rlun; ++ else if (rc != DEVICE_READY) ++ goto out; ++ ++ /* some debug bits*/ ++ data = (u8 *)lun_data; ++ length = ((data[0] << 24) | (data[1] << 16) | ++ (data[2] << 8) | (data[3] << 0)); ++ ++ num_luns = (length / sizeof(struct scsi_lun)); ++#if 0 /* debug */ ++ if (num_luns) { ++ struct scsi_lun *lunp; ++ for (lunp = &lun_data[1]; lunp <= &lun_data[num_luns]; ++ lunp++) ++ printk("%x\n", mpt_scsilun_to_int(lunp)); ++ } ++#endif ++ lun = (num_luns) ? mpt_scsilun_to_int(&lun_data[1]) : 0; ++ ++ retry_tur: ++ dewtprintk(ioc, printk(MPT2SAS_INFO_FMT "TUR: handle" ++ "(0x%04x), lun(%d), retry_count(%d)\n", ioc->name, ++ handle, lun, retry_count)); ++ rc = _scsih_test_unit_ready(ioc, handle, lun, is_pd); ++ if (rc == DEVICE_RETRY_UA) ++ goto retry_tur; ++ else if (rc != DEVICE_START_UNIT) ++ goto out; ++ ++ dewtprintk(ioc, printk(MPT2SAS_INFO_FMT "START: handle" ++ "(0x%04x), lun(%d), retry_count(%d)\n", ioc->name, ++ handle, lun, retry_count)); ++ _scsih_start_unit(ioc, handle, lun, is_pd); ++ goto retry_tur; ++ ++ out: ++ kfree(lun_data); ++ ++ if (rc == DEVICE_RETRY && retry_count >= command_retry_count) ++ rc = DEVICE_ERROR; ++ ++ return rc; ++} ++ ++/** ++ * _scsih_add_device - creating sas device object ++ * @ioc: per adapter object ++ * @handle: sas device handle ++ * @retry_count: number of times this event has been retried ++ * @phy_num: phy number end device attached to ++ * @is_pd: is this hidden raid component ++ * ++ * Creating end device object, stored in ioc->sas_device_list. ++ * ++ * Return 1 means queue the event later, 0 means complete the event ++ */ ++static int ++_scsih_add_device(struct MPT2SAS_ADAPTER *ioc, u16 handle, u8 retry_count, ++ u8 phy_num, u8 is_pd) ++{ ++ Mpi2ConfigReply_t mpi_reply; ++ Mpi2SasDevicePage0_t sas_device_pg0; ++ Mpi2SasEnclosurePage0_t enclosure_pg0; ++ struct _sas_device *sas_device; ++ u32 ioc_status; ++ __le64 sas_address; ++ u32 device_info; ++ unsigned long flags; ++ enum device_responsive_state rc; ++ ++ if ((mpt2sas_config_get_sas_device_pg0(ioc, &mpi_reply, &sas_device_pg0, ++ MPI2_SAS_DEVICE_PGAD_FORM_HANDLE, handle))) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ return 0; ++ } ++ ++ ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & ++ MPI2_IOCSTATUS_MASK; ++ if (ioc_status != MPI2_IOCSTATUS_SUCCESS) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ return 0; ++ } ++ ++ sas_address = le64_to_cpu(sas_device_pg0.SASAddress); ++ ++ /* check if device is present */ ++ if (!(le16_to_cpu(sas_device_pg0.Flags) & ++ MPI2_SAS_DEVICE0_FLAGS_DEVICE_PRESENT)) { ++ printk(MPT2SAS_INFO_FMT "not present: handle(0x%04x)" ++ ", sas_addr(0x%016llx), retry_count(%d)\n", ioc->name, ++ handle, (unsigned long long)sas_address, retry_count); ++ if (retry_count && !is_pd) { ++ sas_device = kzalloc(sizeof(struct _sas_device), ++ GFP_KERNEL); ++ if (!sas_device) ++ return 0; ++ sas_device->handle = handle; ++ sas_device->sas_address = sas_address; ++ list_add_tail(&sas_device->list, &ioc->sas_device_list); ++ } ++ return 0; ++ } ++ ++ /* check if there were any issus with discovery */ ++ if (sas_device_pg0.AccessStatus == ++ MPI2_SAS_DEVICE0_ASTATUS_SATA_INIT_FAILED) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ printk(MPT2SAS_ERR_FMT "AccessStatus = 0x%02x\n", ++ ioc->name, sas_device_pg0.AccessStatus); ++ return 0; ++ } ++ ++ /* check if this is end device */ ++ device_info = le32_to_cpu(sas_device_pg0.DeviceInfo); ++ if (!(_scsih_is_end_device(device_info))) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ return 0; ++ } ++ ++ spin_lock_irqsave(&ioc->sas_device_lock, flags); ++ sas_device = mpt2sas_scsih_sas_device_find_by_sas_address(ioc, ++ sas_address); ++ spin_unlock_irqrestore(&ioc->sas_device_lock, flags); ++ ++ if (sas_device) { ++ _scsih_ublock_io_device(ioc, handle); ++ return 0; ++ } ++ ++ /* ++ * Wait for device that is becoming ready ++ * queue request later if device is busy. ++ */ ++ if (!ioc->wait_for_port_enable_to_complete) { ++ rc = _scsih_wait_for_device_to_become_ready(ioc, handle, ++ retry_count, is_pd); ++ if (rc == DEVICE_RETRY) ++ return 1; ++ else if (rc == DEVICE_ERROR) ++ return 0; ++ } ++ ++ sas_device = kzalloc(sizeof(struct _sas_device), ++ GFP_KERNEL); ++ if (!sas_device) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ return 0; ++ } ++ ++ sas_device->handle = handle; ++ sas_device->parent_handle = ++ le16_to_cpu(sas_device_pg0.ParentDevHandle); ++ sas_device->enclosure_handle = ++ le16_to_cpu(sas_device_pg0.EnclosureHandle); ++ sas_device->slot = ++ le16_to_cpu(sas_device_pg0.Slot); ++ sas_device->device_info = device_info; ++ sas_device->sas_address = sas_address; ++ sas_device->hidden_raid_component = is_pd; ++ ++ ++ /* get enclosure_logical_id */ ++ if (sas_device->enclosure_handle && !(mpt2sas_config_get_enclosure_pg0( ++ ioc, &mpi_reply, &enclosure_pg0, MPI2_SAS_ENCLOS_PGAD_FORM_HANDLE, ++ sas_device->enclosure_handle))) ++ sas_device->enclosure_logical_id = ++ le64_to_cpu(enclosure_pg0.EnclosureLogicalID); ++ ++ /* get device name */ ++ sas_device->device_name = le64_to_cpu(sas_device_pg0.DeviceName); ++ ++ if (ioc->wait_for_port_enable_to_complete) ++ _scsih_sas_device_init_add(ioc, sas_device); ++ else ++ _scsih_sas_device_add(ioc, sas_device); ++ ++ return 0; ++} ++ ++/** ++ * _scsih_remove_device - removing sas device object ++ * @ioc: per adapter object ++ * @handle: sas device handle ++ * ++ * Return nothing. ++ */ ++static void ++_scsih_remove_device(struct MPT2SAS_ADAPTER *ioc, u16 handle) ++{ ++ struct MPT2SAS_TARGET *sas_target_priv_data; ++ struct _sas_device *sas_device; ++ unsigned long flags; ++ Mpi2SasIoUnitControlReply_t mpi_reply; ++ Mpi2SasIoUnitControlRequest_t mpi_request; ++ u16 device_handle; ++ ++ /* lookup sas_device */ ++ spin_lock_irqsave(&ioc->sas_device_lock, flags); ++ sas_device = _scsih_sas_device_find_by_handle(ioc, handle); ++ if (!sas_device) { ++ spin_unlock_irqrestore(&ioc->sas_device_lock, flags); ++ return; ++ } ++ ++ dewtprintk(ioc, printk(MPT2SAS_INFO_FMT "%s: enter: handle" ++ "(0x%04x)\n", ioc->name, __func__, handle)); ++ ++ if (sas_device->starget && sas_device->starget->hostdata) { ++ sas_target_priv_data = sas_device->starget->hostdata; ++ sas_target_priv_data->deleted = 1; ++ } ++ spin_unlock_irqrestore(&ioc->sas_device_lock, flags); ++ ++ if (ioc->remove_host) ++ goto out; ++ ++ /* Target Reset to flush out all the outstanding IO */ ++ device_handle = (sas_device->hidden_raid_component) ? ++ sas_device->volume_handle : handle; ++ if (device_handle) { ++ dewtprintk(ioc, printk(MPT2SAS_INFO_FMT "issue target reset: " ++ "handle(0x%04x)\n", ioc->name, device_handle)); ++ mutex_lock(&ioc->tm_cmds.mutex); ++ mpt2sas_scsih_issue_tm(ioc, device_handle, 0, ++ MPI2_SCSITASKMGMT_TASKTYPE_TARGET_RESET, 0, 10); ++ ioc->tm_cmds.status = MPT2_CMD_NOT_USED; ++ mutex_unlock(&ioc->tm_cmds.mutex); ++ dewtprintk(ioc, printk(MPT2SAS_INFO_FMT "issue target reset " ++ "done: handle(0x%04x)\n", ioc->name, device_handle)); ++ if (ioc->shost_recovery) ++ goto out; ++ } ++ ++ /* SAS_IO_UNIT_CNTR - send REMOVE_DEVICE */ ++ dewtprintk(ioc, printk(MPT2SAS_INFO_FMT "sas_iounit: handle" ++ "(0x%04x)\n", ioc->name, handle)); ++ memset(&mpi_request, 0, sizeof(Mpi2SasIoUnitControlRequest_t)); ++ mpi_request.Function = MPI2_FUNCTION_SAS_IO_UNIT_CONTROL; ++ mpi_request.Operation = MPI2_SAS_OP_REMOVE_DEVICE; ++ mpi_request.DevHandle = handle; ++ mpi_request.VF_ID = 0; ++ if ((mpt2sas_base_sas_iounit_control(ioc, &mpi_reply, ++ &mpi_request)) != 0) ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ ++ dewtprintk(ioc, printk(MPT2SAS_INFO_FMT "sas_iounit: ioc_status" ++ "(0x%04x), loginfo(0x%08x)\n", ioc->name, ++ le16_to_cpu(mpi_reply.IOCStatus), ++ le32_to_cpu(mpi_reply.IOCLogInfo))); ++ ++ out: ++ mpt2sas_transport_port_remove(ioc, sas_device->sas_address, ++ sas_device->parent_handle); ++ ++#ifdef MPT2SAS_MULTIPATH ++ if (sas_device->sas_device_alt != NULL) { ++ sas_device->sas_device_alt->sas_device_alt = NULL; ++ sas_device->sas_device_alt->ioc = NULL; ++ } ++#endif ++ ++ printk(MPT2SAS_INFO_FMT "removing handle(0x%04x), sas_addr" ++ "(0x%016llx)\n", ioc->name, sas_device->handle, ++ (unsigned long long) sas_device->sas_address); ++ _scsih_sas_device_remove(ioc, sas_device); ++ ++ dewtprintk(ioc, printk(MPT2SAS_INFO_FMT "%s: exit: handle" ++ "(0x%04x)\n", ioc->name, __func__, handle)); ++} ++ ++#ifdef CONFIG_SCSI_MPT2SAS_LOGGING ++/** ++ * _scsih_sas_topology_change_event_debug - debug for topology event ++ * @ioc: per adapter object ++ * @event_data: event data payload ++ * Context: user. ++ */ ++static void ++_scsih_sas_topology_change_event_debug(struct MPT2SAS_ADAPTER *ioc, ++ Mpi2EventDataSasTopologyChangeList_t *event_data) ++{ ++ int i; ++ u16 handle; ++ u16 reason_code; ++ u8 phy_number; ++ char *status_str = NULL; ++ char link_rate[25]; ++ ++ switch (event_data->ExpStatus) { ++ case MPI2_EVENT_SAS_TOPO_ES_ADDED: ++ status_str = "add"; ++ break; ++ case MPI2_EVENT_SAS_TOPO_ES_NOT_RESPONDING: ++ status_str = "remove"; ++ break; ++ case MPI2_EVENT_SAS_TOPO_ES_RESPONDING: ++ status_str = "responding"; ++ break; ++ case MPI2_EVENT_SAS_TOPO_ES_DELAY_NOT_RESPONDING: ++ status_str = "remove delay"; ++ break; ++ default: ++ status_str = "unknown status"; ++ break; ++ } ++ printk(MPT2SAS_DEBUG_FMT "sas topology change: (%s)\n", ++ ioc->name, status_str); ++ printk(KERN_DEBUG "\thandle(0x%04x), enclosure_handle(0x%04x) " ++ "start_phy(%02d), count(%d)\n", ++ le16_to_cpu(event_data->ExpanderDevHandle), ++ le16_to_cpu(event_data->EnclosureHandle), ++ event_data->StartPhyNum, event_data->NumEntries); ++ for (i = 0; i < event_data->NumEntries; i++) { ++ handle = le16_to_cpu(event_data->PHY[i].AttachedDevHandle); ++ if (!handle) ++ continue; ++ phy_number = event_data->StartPhyNum + i; ++ reason_code = event_data->PHY[i].PhyStatus & ++ MPI2_EVENT_SAS_TOPO_RC_MASK; ++ switch (reason_code) { ++ case MPI2_EVENT_SAS_TOPO_RC_TARG_ADDED: ++ snprintf(link_rate, 25, ": add, link(0x%02x)", ++ (event_data->PHY[i].LinkRate >> 4)); ++ status_str = link_rate; ++ break; ++ case MPI2_EVENT_SAS_TOPO_RC_TARG_NOT_RESPONDING: ++ status_str = ": remove"; ++ break; ++ case MPI2_EVENT_SAS_TOPO_RC_DELAY_NOT_RESPONDING: ++ status_str = ": remove_delay"; ++ break; ++ case MPI2_EVENT_SAS_TOPO_RC_PHY_CHANGED: ++ snprintf(link_rate, 25, ": link(0x%02x)", ++ (event_data->PHY[i].LinkRate >> 4)); ++ status_str = link_rate; ++ break; ++ case MPI2_EVENT_SAS_TOPO_RC_NO_CHANGE: ++ status_str = ": responding"; ++ break; ++ default: ++ status_str = ": unknown"; ++ break; ++ } ++ printk(KERN_DEBUG "\tphy(%02d), attached_handle(0x%04x)%s\n", ++ phy_number, handle, status_str); ++ } ++} ++#endif ++ ++/** ++ * _scsih_sas_topology_change_event - handle topology changes ++ * @ioc: per adapter object ++ * @VF_ID: ++ * @event_data: event data payload ++ * fw_event: ++ * Context: user. ++ * ++ */ ++static int ++_scsih_sas_topology_change_event(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID, ++ Mpi2EventDataSasTopologyChangeList_t *event_data, ++ struct fw_event_work *fw_event) ++{ ++ int i; ++ u16 parent_handle, handle; ++ u16 reason_code; ++ u8 phy_number; ++ struct _sas_node *sas_expander; ++ unsigned long flags; ++ u8 link_rate_; ++ int rc; ++ int requeue_event; ++ ++#ifdef CONFIG_SCSI_MPT2SAS_LOGGING ++ if (ioc->logging_level & MPT_DEBUG_EVENT_WORK_TASK) ++ _scsih_sas_topology_change_event_debug(ioc, event_data); ++#endif ++ ++ if (!ioc->sas_hba.num_phys) ++ _scsih_sas_host_add(ioc); ++ else ++ _scsih_sas_host_refresh(ioc, 0); ++ ++ if (fw_event->ignore) { ++ dewtprintk(ioc, printk(MPT2SAS_DEBUG_FMT "ignoring expander " ++ "event\n", ioc->name)); ++ return 0; ++ } ++ ++ parent_handle = le16_to_cpu(event_data->ExpanderDevHandle); ++ ++ /* handle expander add */ ++ if (event_data->ExpStatus == MPI2_EVENT_SAS_TOPO_ES_ADDED) ++ if (_scsih_expander_add(ioc, parent_handle) != 0) ++ return 0; ++ ++ /* handle siblings events */ ++ for (i = 0, requeue_event = 0; i < event_data->NumEntries; i++) { ++ if (fw_event->ignore) { ++ dewtprintk(ioc, printk(MPT2SAS_DEBUG_FMT "ignoring " ++ "expander event\n", ioc->name)); ++ return 0; ++ } ++ if (ioc->shost_recovery) ++ return 0; ++ if (event_data->PHY[i].PhyStatus & ++ MPI2_EVENT_SAS_TOPO_PHYSTATUS_VACANT) ++ continue; ++ handle = le16_to_cpu(event_data->PHY[i].AttachedDevHandle); ++ if (!handle) ++ continue; ++ phy_number = event_data->StartPhyNum + i; ++ reason_code = event_data->PHY[i].PhyStatus & ++ MPI2_EVENT_SAS_TOPO_RC_MASK; ++ link_rate_ = event_data->PHY[i].LinkRate >> 4; ++ switch (reason_code) { ++ case MPI2_EVENT_SAS_TOPO_RC_PHY_CHANGED: ++ case MPI2_EVENT_SAS_TOPO_RC_TARG_ADDED: ++ if (!parent_handle) { ++ if (phy_number < ioc->sas_hba.num_phys) ++ mpt2sas_transport_update_links( ++ ioc, ++ ioc->sas_hba.phy[phy_number].handle, ++ handle, phy_number, link_rate_); ++ } else { ++ spin_lock_irqsave(&ioc->sas_node_lock, flags); ++ sas_expander = ++ mpt2sas_scsih_expander_find_by_handle(ioc, ++ parent_handle); ++ spin_unlock_irqrestore(&ioc->sas_node_lock, ++ flags); ++ if (sas_expander) { ++ if (phy_number < sas_expander->num_phys) ++ mpt2sas_transport_update_links( ++ ioc, ++ sas_expander-> ++ phy[phy_number].handle, ++ handle, phy_number, ++ link_rate_); ++ } ++ } ++ if (reason_code == MPI2_EVENT_SAS_TOPO_RC_TARG_ADDED) { ++ if (link_rate_ < MPI2_SAS_NEG_LINK_RATE_1_5) ++ break; ++ rc = _scsih_add_device(ioc, handle, ++ fw_event->retries[i], phy_number, 0); ++ if (rc) {/* retry due to busy device */ ++ fw_event->retries[i]++; ++ requeue_event = 1; ++ } else {/* mark entry vacant */ ++ event_data->PHY[i].PhyStatus |= ++ MPI2_EVENT_SAS_TOPO_PHYSTATUS_VACANT; ++ } ++ } ++ break; ++ case MPI2_EVENT_SAS_TOPO_RC_TARG_NOT_RESPONDING: ++ _scsih_remove_device(ioc, handle); ++ break; ++ } ++ } ++ ++ /* handle expander removal */ ++ if (event_data->ExpStatus == MPI2_EVENT_SAS_TOPO_ES_NOT_RESPONDING) ++ _scsih_expander_remove(ioc, parent_handle); ++ ++ return requeue_event; ++} ++ ++#ifdef CONFIG_SCSI_MPT2SAS_LOGGING ++/** ++ * _scsih_sas_device_status_change_event_debug - debug for device event ++ * @event_data: event data payload ++ * Context: user. ++ * ++ * Return nothing. ++ */ ++static void ++_scsih_sas_device_status_change_event_debug(struct MPT2SAS_ADAPTER *ioc, ++ Mpi2EventDataSasDeviceStatusChange_t *event_data) ++{ ++ char *reason_str = NULL; ++ ++ switch (event_data->ReasonCode) { ++ case MPI2_EVENT_SAS_DEV_STAT_RC_SMART_DATA: ++ reason_str = "smart data"; ++ break; ++ case MPI2_EVENT_SAS_DEV_STAT_RC_UNSUPPORTED: ++ reason_str = "unsupported device discovered"; ++ break; ++ case MPI2_EVENT_SAS_DEV_STAT_RC_INTERNAL_DEVICE_RESET: ++ reason_str = "internal device reset"; ++ break; ++ case MPI2_EVENT_SAS_DEV_STAT_RC_TASK_ABORT_INTERNAL: ++ reason_str = "internal task abort"; ++ break; ++ case MPI2_EVENT_SAS_DEV_STAT_RC_ABORT_TASK_SET_INTERNAL: ++ reason_str = "internal task abort set"; ++ break; ++ case MPI2_EVENT_SAS_DEV_STAT_RC_CLEAR_TASK_SET_INTERNAL: ++ reason_str = "internal clear task set"; ++ break; ++ case MPI2_EVENT_SAS_DEV_STAT_RC_QUERY_TASK_INTERNAL: ++ reason_str = "internal query task"; ++ break; ++ case MPI2_EVENT_SAS_DEV_STAT_RC_SATA_INIT_FAILURE: ++ reason_str = "sata init failure"; ++ break; ++ case MPI2_EVENT_SAS_DEV_STAT_RC_CMP_INTERNAL_DEV_RESET: ++ reason_str = "internal device reset complete"; ++ break; ++ case MPI2_EVENT_SAS_DEV_STAT_RC_CMP_TASK_ABORT_INTERNAL: ++ reason_str = "internal task abort complete"; ++ break; ++ case MPI2_EVENT_SAS_DEV_STAT_RC_ASYNC_NOTIFICATION: ++ reason_str = "internal async notification"; ++ break; ++ default: ++ reason_str = "unknown reason"; ++ break; ++ } ++ printk(MPT2SAS_DEBUG_FMT "device status change: (%s)\n" ++ "\thandle(0x%04x), sas address(0x%016llx)", ioc->name, ++ reason_str, le16_to_cpu(event_data->DevHandle), ++ (unsigned long long)le64_to_cpu(event_data->SASAddress)); ++ if (event_data->ReasonCode == MPI2_EVENT_SAS_DEV_STAT_RC_SMART_DATA) ++ printk(MPT2SAS_DEBUG_FMT ", ASC(0x%x), ASCQ(0x%x)\n", ioc->name, ++ event_data->ASC, event_data->ASCQ); ++ printk(KERN_INFO "\n"); ++} ++#endif ++ ++/** ++ * _scsih_sas_device_status_change_event - handle device status change ++ * @ioc: per adapter object ++ * @VF_ID: ++ * @event_data: event data payload ++ * Context: user. ++ * ++ * Return nothing. ++ */ ++static void ++_scsih_sas_device_status_change_event(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID, ++ Mpi2EventDataSasDeviceStatusChange_t *event_data) ++{ ++#ifdef CONFIG_SCSI_MPT2SAS_LOGGING ++ if (ioc->logging_level & MPT_DEBUG_EVENT_WORK_TASK) ++ _scsih_sas_device_status_change_event_debug(ioc, event_data); ++#endif ++} ++ ++#ifdef CONFIG_SCSI_MPT2SAS_LOGGING ++/** ++ * _scsih_sas_enclosure_dev_status_change_event_debug - debug for enclosure event ++ * @ioc: per adapter object ++ * @event_data: event data payload ++ * Context: user. ++ * ++ * Return nothing. ++ */ ++static void ++_scsih_sas_enclosure_dev_status_change_event_debug(struct MPT2SAS_ADAPTER *ioc, ++ Mpi2EventDataSasEnclDevStatusChange_t *event_data) ++{ ++ char *reason_str = NULL; ++ ++ switch (event_data->ReasonCode) { ++ case MPI2_EVENT_SAS_ENCL_RC_ADDED: ++ reason_str = "enclosure add"; ++ break; ++ case MPI2_EVENT_SAS_ENCL_RC_NOT_RESPONDING: ++ reason_str = "enclosure remove"; ++ break; ++ default: ++ reason_str = "unknown reason"; ++ break; ++ } ++ ++ printk(MPT2SAS_DEBUG_FMT "enclosure status change: (%s)\n" ++ "\thandle(0x%04x), enclosure logical id(0x%016llx)" ++ " number slots(%d)\n", ioc->name, reason_str, ++ le16_to_cpu(event_data->EnclosureHandle), ++ (unsigned long long)le64_to_cpu(event_data->EnclosureLogicalID), ++ le16_to_cpu(event_data->StartSlot)); ++} ++#endif ++ ++/** ++ * _scsih_sas_enclosure_dev_status_change_event - handle enclosure events ++ * @ioc: per adapter object ++ * @VF_ID: ++ * @event_data: event data payload ++ * Context: user. ++ * ++ * Return nothing. ++ */ ++static void ++_scsih_sas_enclosure_dev_status_change_event(struct MPT2SAS_ADAPTER *ioc, ++ u8 VF_ID, Mpi2EventDataSasEnclDevStatusChange_t *event_data) ++{ ++#ifdef CONFIG_SCSI_MPT2SAS_LOGGING ++ if (ioc->logging_level & MPT_DEBUG_EVENT_WORK_TASK) ++ _scsih_sas_enclosure_dev_status_change_event_debug(ioc, ++ event_data); ++#endif ++} ++ ++/** ++ * _scsih_sas_broadcast_primative_event - handle broadcast events ++ * @ioc: per adapter object ++ * @event_data: event data payload ++ * Context: user. ++ * ++ * Return nothing. ++ */ ++static void ++_scsih_sas_broadcast_primative_event(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID, ++ Mpi2EventDataSasBroadcastPrimitive_t *event_data) ++{ ++ struct scsi_cmnd *scmd; ++ u16 smid, handle; ++ u32 lun; ++ struct MPT2SAS_DEVICE *sas_device_priv_data; ++ u32 termination_count; ++ u32 query_count; ++ Mpi2SCSITaskManagementReply_t *mpi_reply; ++ ++ dewtprintk(ioc, printk(MPT2SAS_DEBUG_FMT "broadcast primative: " ++ "phy number(%d), width(%d)\n", ioc->name, event_data->PhyNum, ++ event_data->PortWidth)); ++ ++ dtmprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: enter\n", ioc->name, ++ __func__)); ++ ++ mutex_lock(&ioc->tm_cmds.mutex); ++ termination_count = 0; ++ query_count = 0; ++ mpi_reply = ioc->tm_cmds.reply; ++ for (smid = 1; smid <= ioc->request_depth; smid++) { ++ scmd = _scsih_scsi_lookup_get(ioc, smid); ++ if (!scmd) ++ continue; ++ sas_device_priv_data = scmd->device->hostdata; ++ if (!sas_device_priv_data || !sas_device_priv_data->sas_target) ++ continue; ++ /* skip hidden raid components */ ++ if (sas_device_priv_data->sas_target->flags & ++ MPT_TARGET_FLAGS_RAID_COMPONENT) ++ continue; ++ /* skip volumes */ ++ if (sas_device_priv_data->sas_target->flags & ++ MPT_TARGET_FLAGS_VOLUME) ++ continue; ++ ++ handle = sas_device_priv_data->sas_target->handle; ++ lun = sas_device_priv_data->lun; ++ query_count++; ++ ++ mpt2sas_scsih_issue_tm(ioc, handle, lun, ++ MPI2_SCSITASKMGMT_TASKTYPE_QUERY_TASK, smid, 30); ++ ioc->tm_cmds.status = MPT2_CMD_NOT_USED; ++ ++ if ((mpi_reply->IOCStatus == MPI2_IOCSTATUS_SUCCESS) && ++ (mpi_reply->ResponseCode == ++ MPI2_SCSITASKMGMT_RSP_TM_SUCCEEDED || ++ mpi_reply->ResponseCode == ++ MPI2_SCSITASKMGMT_RSP_IO_QUEUED_ON_IOC)) ++ continue; ++ ++ mpt2sas_scsih_issue_tm(ioc, handle, lun, ++ MPI2_SCSITASKMGMT_TASKTYPE_ABRT_TASK_SET, 0, 30); ++ ioc->tm_cmds.status = MPT2_CMD_NOT_USED; ++ termination_count += le32_to_cpu(mpi_reply->TerminationCount); ++ } ++ ioc->broadcast_aen_busy = 0; ++ mutex_unlock(&ioc->tm_cmds.mutex); ++ ++ dtmprintk(ioc, printk(MPT2SAS_DEBUG_FMT ++ "%s - exit, query_count = %d termination_count = %d\n", ++ ioc->name, __func__, query_count, termination_count)); ++} ++ ++/** ++ * _scsih_sas_discovery_event - handle discovery events ++ * @ioc: per adapter object ++ * @event_data: event data payload ++ * Context: user. ++ * ++ * Return nothing. ++ */ ++static void ++_scsih_sas_discovery_event(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID, ++ Mpi2EventDataSasDiscovery_t *event_data) ++{ ++#ifdef CONFIG_SCSI_MPT2SAS_LOGGING ++ if (ioc->logging_level & MPT_DEBUG_EVENT_WORK_TASK) { ++ printk(MPT2SAS_DEBUG_FMT "discovery event: (%s)", ioc->name, ++ (event_data->ReasonCode == MPI2_EVENT_SAS_DISC_RC_STARTED) ? ++ "start" : "stop"); ++ if (event_data->DiscoveryStatus) ++ printk(MPT2SAS_DEBUG_FMT ", discovery_status(0x%08x)", ++ ioc->name, le32_to_cpu(event_data->DiscoveryStatus)); ++ printk("\n"); ++ } ++#endif ++ ++ if (event_data->ReasonCode == MPI2_EVENT_SAS_DISC_RC_STARTED && ++ !ioc->sas_hba.num_phys) ++ _scsih_sas_host_add(ioc); ++} ++ ++/** ++ * _scsih_reprobe_lun - reprobing lun ++ * @sdev: scsi device struct ++ * @no_uld_attach: sdev->no_uld_attach flag setting ++ * ++ **/ ++static void ++_scsih_reprobe_lun(struct scsi_device *sdev, void *no_uld_attach) ++{ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,18)) ++ int rc; ++#endif ++ sdev->no_uld_attach = no_uld_attach ? 1 : 0; ++ sdev_printk(KERN_INFO, sdev, "%s raid component\n", ++ sdev->no_uld_attach ? "hidding" : "exposing"); ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,18)) ++ rc = scsi_device_reprobe(sdev); ++#else ++ scsi_device_reprobe(sdev); ++#endif ++} ++ ++/** ++ * _scsih_reprobe_target - reprobing target ++ * @starget: scsi target struct ++ * @no_uld_attach: sdev->no_uld_attach flag setting ++ * ++ * Note: no_uld_attach flag determines whether the disk device is attached ++ * to block layer. A value of `1` means to not attach. ++ **/ ++static void ++_scsih_reprobe_target(struct scsi_target *starget, int no_uld_attach) ++{ ++ struct MPT2SAS_TARGET *sas_target_priv_data = starget->hostdata; ++ ++ if (no_uld_attach) ++ sas_target_priv_data->flags |= MPT_TARGET_FLAGS_RAID_COMPONENT; ++ else ++ sas_target_priv_data->flags &= ~MPT_TARGET_FLAGS_RAID_COMPONENT; ++ ++ starget_for_each_device(starget, no_uld_attach ? (void *)1 : NULL, ++ _scsih_reprobe_lun); ++} ++ ++/** ++ * _scsih_sas_volume_add - add new volume ++ * @ioc: per adapter object ++ * @element: IR config element data ++ * Context: user. ++ * ++ * Return nothing. ++ */ ++static void ++_scsih_sas_volume_add(struct MPT2SAS_ADAPTER *ioc, ++ Mpi2EventIrConfigElement_t *element) ++{ ++ struct _raid_device *raid_device; ++ unsigned long flags; ++ u64 wwid; ++ u16 handle = le16_to_cpu(element->VolDevHandle); ++ int rc; ++ ++ mpt2sas_config_get_volume_wwid(ioc, handle, &wwid); ++ if (!wwid) { ++ printk(MPT2SAS_ERR_FMT ++ "failure at %s:%d/%s()!\n", ioc->name, ++ __FILE__, __LINE__, __func__); ++ return; ++ } ++ ++ spin_lock_irqsave(&ioc->raid_device_lock, flags); ++ raid_device = _scsih_raid_device_find_by_wwid(ioc, wwid); ++ spin_unlock_irqrestore(&ioc->raid_device_lock, flags); ++ ++ if (raid_device) ++ return; ++ ++ raid_device = kzalloc(sizeof(struct _raid_device), GFP_KERNEL); ++ if (!raid_device) { ++ printk(MPT2SAS_ERR_FMT ++ "failure at %s:%d/%s()!\n", ioc->name, ++ __FILE__, __LINE__, __func__); ++ return; ++ } ++ ++ raid_device->id = ioc->sas_id++; ++ raid_device->channel = RAID_CHANNEL; ++ raid_device->handle = handle; ++ raid_device->wwid = wwid; ++ _scsih_raid_device_add(ioc, raid_device); ++ if (!ioc->wait_for_port_enable_to_complete) { ++ rc = scsi_add_device(ioc->shost, RAID_CHANNEL, ++ raid_device->id, 0); ++ if (rc) ++ _scsih_raid_device_remove(ioc, raid_device); ++ } else ++ _scsih_determine_boot_device(ioc, raid_device, 1); ++} ++ ++/** ++ * _scsih_sas_volume_delete - delete volume ++ * @ioc: per adapter object ++ * @element: IR config element data ++ * Context: user. ++ * ++ * Return nothing. ++ */ ++static void ++_scsih_sas_volume_delete(struct MPT2SAS_ADAPTER *ioc, ++ Mpi2EventIrConfigElement_t *element) ++{ ++ struct _raid_device *raid_device; ++ u16 handle = le16_to_cpu(element->VolDevHandle); ++ unsigned long flags; ++ struct MPT2SAS_TARGET *sas_target_priv_data; ++ ++ spin_lock_irqsave(&ioc->raid_device_lock, flags); ++ raid_device = _scsih_raid_device_find_by_handle(ioc, handle); ++ spin_unlock_irqrestore(&ioc->raid_device_lock, flags); ++ if (!raid_device) ++ return; ++ if (raid_device->starget) { ++ sas_target_priv_data = raid_device->starget->hostdata; ++ sas_target_priv_data->deleted = 1; ++ scsi_remove_target(&raid_device->starget->dev); ++ } ++ _scsih_raid_device_remove(ioc, raid_device); ++} ++ ++/** ++ * _scsih_sas_pd_expose - expose pd component to /dev/sdX ++ * @ioc: per adapter object ++ * @element: IR config element data ++ * Context: user. ++ * ++ * Return nothing. ++ */ ++static void ++_scsih_sas_pd_expose(struct MPT2SAS_ADAPTER *ioc, ++ Mpi2EventIrConfigElement_t *element) ++{ ++ struct _sas_device *sas_device; ++ unsigned long flags; ++ u16 handle = le16_to_cpu(element->PhysDiskDevHandle); ++ ++ spin_lock_irqsave(&ioc->sas_device_lock, flags); ++ sas_device = _scsih_sas_device_find_by_handle(ioc, handle); ++ spin_unlock_irqrestore(&ioc->sas_device_lock, flags); ++ if (!sas_device) ++ return; ++ ++ /* exposing raid component */ ++ sas_device->volume_handle = 0; ++ sas_device->volume_wwid = 0; ++ sas_device->hidden_raid_component = 0; ++ _scsih_reprobe_target(sas_device->starget, 0); ++} ++ ++/** ++ * _scsih_sas_pd_hide - hide pd component from /dev/sdX ++ * @ioc: per adapter object ++ * @element: IR config element data ++ * Context: user. ++ * ++ * Return nothing. ++ */ ++static void ++_scsih_sas_pd_hide(struct MPT2SAS_ADAPTER *ioc, ++ Mpi2EventIrConfigElement_t *element) ++{ ++ struct _sas_device *sas_device; ++ unsigned long flags; ++ u16 handle = le16_to_cpu(element->PhysDiskDevHandle); ++ ++ spin_lock_irqsave(&ioc->sas_device_lock, flags); ++ sas_device = _scsih_sas_device_find_by_handle(ioc, handle); ++ spin_unlock_irqrestore(&ioc->sas_device_lock, flags); ++ if (!sas_device) ++ return; ++ ++ /* hiding raid component */ ++ mpt2sas_config_get_volume_handle(ioc, handle, ++ &sas_device->volume_handle); ++ mpt2sas_config_get_volume_wwid(ioc, sas_device->volume_handle, ++ &sas_device->volume_wwid); ++ sas_device->hidden_raid_component = 1; ++ _scsih_reprobe_target(sas_device->starget, 1); ++} ++ ++/** ++ * _scsih_sas_pd_delete - delete pd component ++ * @ioc: per adapter object ++ * @element: IR config element data ++ * Context: user. ++ * ++ * Return nothing. ++ */ ++static void ++_scsih_sas_pd_delete(struct MPT2SAS_ADAPTER *ioc, ++ Mpi2EventIrConfigElement_t *element) ++{ ++ struct _sas_device *sas_device; ++ unsigned long flags; ++ u16 handle = le16_to_cpu(element->PhysDiskDevHandle); ++ ++ spin_lock_irqsave(&ioc->sas_device_lock, flags); ++ sas_device = _scsih_sas_device_find_by_handle(ioc, handle); ++ spin_unlock_irqrestore(&ioc->sas_device_lock, flags); ++ if (!sas_device) ++ return; ++ _scsih_remove_device(ioc, handle); ++} ++ ++/** ++ * _scsih_sas_pd_add - remove pd component ++ * @ioc: per adapter object ++ * @element: IR config element data ++ * Context: user. ++ * ++ * Return nothing. ++ */ ++static void ++_scsih_sas_pd_add(struct MPT2SAS_ADAPTER *ioc, ++ Mpi2EventIrConfigElement_t *element) ++{ ++ struct _sas_device *sas_device; ++ unsigned long flags; ++ u16 handle = le16_to_cpu(element->PhysDiskDevHandle); ++ Mpi2ConfigReply_t mpi_reply; ++ Mpi2SasDevicePage0_t sas_device_pg0; ++ u32 ioc_status; ++ ++ spin_lock_irqsave(&ioc->sas_device_lock, flags); ++ sas_device = _scsih_sas_device_find_by_handle(ioc, handle); ++ spin_unlock_irqrestore(&ioc->sas_device_lock, flags); ++ if (sas_device) { ++ sas_device->hidden_raid_component = 1; ++ return; ++ } ++ ++ if ((mpt2sas_config_get_sas_device_pg0(ioc, &mpi_reply, &sas_device_pg0, ++ MPI2_SAS_DEVICE_PGAD_FORM_HANDLE, handle))) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ return; ++ } ++ ++ ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & ++ MPI2_IOCSTATUS_MASK; ++ if (ioc_status != MPI2_IOCSTATUS_SUCCESS) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ return; ++ } ++ ++ mpt2sas_transport_update_links(ioc, ++ le16_to_cpu(sas_device_pg0.ParentDevHandle), ++ handle, sas_device_pg0.PhyNum, MPI2_SAS_NEG_LINK_RATE_1_5); ++ ++ _scsih_add_device(ioc, handle, 0, 0, 1); ++} ++ ++#ifdef CONFIG_SCSI_MPT2SAS_LOGGING ++/** ++ * _scsih_sas_ir_config_change_event_debug - debug for IR Config Change events ++ * @ioc: per adapter object ++ * @event_data: event data payload ++ * Context: user. ++ * ++ * Return nothing. ++ */ ++static void ++_scsih_sas_ir_config_change_event_debug(struct MPT2SAS_ADAPTER *ioc, ++ Mpi2EventDataIrConfigChangeList_t *event_data) ++{ ++ Mpi2EventIrConfigElement_t *element; ++ u8 element_type; ++ int i; ++ char *reason_str = NULL, *element_str = NULL; ++ ++ element = (Mpi2EventIrConfigElement_t *)&event_data->ConfigElement[0]; ++ ++ printk(MPT2SAS_DEBUG_FMT "raid config change: (%s), elements(%d)\n", ++ ioc->name, (le32_to_cpu(event_data->Flags) & ++ MPI2_EVENT_IR_CHANGE_FLAGS_FOREIGN_CONFIG) ? ++ "foreign" : "native", event_data->NumElements); ++ for (i = 0; i < event_data->NumElements; i++, element++) { ++ switch (element->ReasonCode) { ++ case MPI2_EVENT_IR_CHANGE_RC_ADDED: ++ reason_str = "add"; ++ break; ++ case MPI2_EVENT_IR_CHANGE_RC_REMOVED: ++ reason_str = "remove"; ++ break; ++ case MPI2_EVENT_IR_CHANGE_RC_NO_CHANGE: ++ reason_str = "no change"; ++ break; ++ case MPI2_EVENT_IR_CHANGE_RC_HIDE: ++ reason_str = "hide"; ++ break; ++ case MPI2_EVENT_IR_CHANGE_RC_UNHIDE: ++ reason_str = "unhide"; ++ break; ++ case MPI2_EVENT_IR_CHANGE_RC_VOLUME_CREATED: ++ reason_str = "volume_created"; ++ break; ++ case MPI2_EVENT_IR_CHANGE_RC_VOLUME_DELETED: ++ reason_str = "volume_deleted"; ++ break; ++ case MPI2_EVENT_IR_CHANGE_RC_PD_CREATED: ++ reason_str = "pd_created"; ++ break; ++ case MPI2_EVENT_IR_CHANGE_RC_PD_DELETED: ++ reason_str = "pd_deleted"; ++ break; ++ default: ++ reason_str = "unknown reason"; ++ break; ++ } ++ element_type = le16_to_cpu(element->ElementFlags) & ++ MPI2_EVENT_IR_CHANGE_EFLAGS_ELEMENT_TYPE_MASK; ++ switch (element_type) { ++ case MPI2_EVENT_IR_CHANGE_EFLAGS_VOLUME_ELEMENT: ++ element_str = "volume"; ++ break; ++ case MPI2_EVENT_IR_CHANGE_EFLAGS_VOLPHYSDISK_ELEMENT: ++ element_str = "phys disk"; ++ break; ++ case MPI2_EVENT_IR_CHANGE_EFLAGS_HOTSPARE_ELEMENT: ++ element_str = "hot spare"; ++ break; ++ default: ++ element_str = "unknown element"; ++ break; ++ } ++ printk(KERN_DEBUG "\t(%s:%s), vol handle(0x%04x), " ++ "pd handle(0x%04x), pd num(0x%02x)\n", element_str, ++ reason_str, le16_to_cpu(element->VolDevHandle), ++ le16_to_cpu(element->PhysDiskDevHandle), ++ element->PhysDiskNum); ++ } ++} ++#endif ++ ++/** ++ * _scsih_sas_ir_config_change_event - handle ir configuration change events ++ * @ioc: per adapter object ++ * @VF_ID: ++ * @event_data: event data payload ++ * Context: user. ++ * ++ * Return nothing. ++ */ ++static void ++_scsih_sas_ir_config_change_event(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID, ++ Mpi2EventDataIrConfigChangeList_t *event_data) ++{ ++ Mpi2EventIrConfigElement_t *element; ++ int i; ++ u8 foreign_config; ++ ++#ifdef CONFIG_SCSI_MPT2SAS_LOGGING ++ if (ioc->logging_level & MPT_DEBUG_EVENT_WORK_TASK) ++ _scsih_sas_ir_config_change_event_debug(ioc, event_data); ++ ++#endif ++ ++ foreign_config = (le32_to_cpu(event_data->Flags) & ++ MPI2_EVENT_IR_CHANGE_FLAGS_FOREIGN_CONFIG) ? 1 : 0; ++ ++ element = (Mpi2EventIrConfigElement_t *)&event_data->ConfigElement[0]; ++ for (i = 0; i < event_data->NumElements; i++, element++) { ++ ++ switch (element->ReasonCode) { ++ case MPI2_EVENT_IR_CHANGE_RC_VOLUME_CREATED: ++ case MPI2_EVENT_IR_CHANGE_RC_ADDED: ++ if (!foreign_config) ++ _scsih_sas_volume_add(ioc, element); ++ break; ++ case MPI2_EVENT_IR_CHANGE_RC_VOLUME_DELETED: ++ case MPI2_EVENT_IR_CHANGE_RC_REMOVED: ++ if (!foreign_config) ++ _scsih_sas_volume_delete(ioc, element); ++ break; ++ case MPI2_EVENT_IR_CHANGE_RC_PD_CREATED: ++ _scsih_sas_pd_hide(ioc, element); ++ break; ++ case MPI2_EVENT_IR_CHANGE_RC_PD_DELETED: ++ _scsih_sas_pd_expose(ioc, element); ++ break; ++ case MPI2_EVENT_IR_CHANGE_RC_HIDE: ++ _scsih_sas_pd_add(ioc, element); ++ break; ++ case MPI2_EVENT_IR_CHANGE_RC_UNHIDE: ++ _scsih_sas_pd_delete(ioc, element); ++ break; ++ } ++ } ++} ++ ++/** ++ * _scsih_sas_ir_volume_event - IR volume event ++ * @ioc: per adapter object ++ * @event_data: event data payload ++ * Context: user. ++ * ++ * Return nothing. ++ */ ++static void ++_scsih_sas_ir_volume_event(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID, ++ Mpi2EventDataIrVolume_t *event_data) ++{ ++ u64 wwid; ++ unsigned long flags; ++ struct _raid_device *raid_device; ++ u16 handle; ++ u32 state; ++ int rc; ++ struct MPT2SAS_TARGET *sas_target_priv_data; ++ ++ if (event_data->ReasonCode != MPI2_EVENT_IR_VOLUME_RC_STATE_CHANGED) ++ return; ++ ++ handle = le16_to_cpu(event_data->VolDevHandle); ++ state = le32_to_cpu(event_data->NewValue); ++ dewtprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: handle(0x%04x), " ++ "old(0x%08x), new(0x%08x)\n", ioc->name, __func__, handle, ++ le32_to_cpu(event_data->PreviousValue), state)); ++ ++ spin_lock_irqsave(&ioc->raid_device_lock, flags); ++ raid_device = _scsih_raid_device_find_by_handle(ioc, handle); ++ spin_unlock_irqrestore(&ioc->raid_device_lock, flags); ++ ++ switch (state) { ++ case MPI2_RAID_VOL_STATE_MISSING: ++ case MPI2_RAID_VOL_STATE_FAILED: ++ if (!raid_device) ++ break; ++ if (raid_device->starget) { ++ sas_target_priv_data = raid_device->starget->hostdata; ++ sas_target_priv_data->deleted = 1; ++ scsi_remove_target(&raid_device->starget->dev); ++ } ++ _scsih_raid_device_remove(ioc, raid_device); ++ break; ++ ++ case MPI2_RAID_VOL_STATE_ONLINE: ++ case MPI2_RAID_VOL_STATE_DEGRADED: ++ case MPI2_RAID_VOL_STATE_OPTIMAL: ++ if (raid_device) ++ break; ++ ++ mpt2sas_config_get_volume_wwid(ioc, handle, &wwid); ++ if (!wwid) { ++ printk(MPT2SAS_ERR_FMT ++ "failure at %s:%d/%s()!\n", ioc->name, ++ __FILE__, __LINE__, __func__); ++ break; ++ } ++ ++ raid_device = kzalloc(sizeof(struct _raid_device), GFP_KERNEL); ++ if (!raid_device) { ++ printk(MPT2SAS_ERR_FMT ++ "failure at %s:%d/%s()!\n", ioc->name, ++ __FILE__, __LINE__, __func__); ++ break; ++ } ++ ++ raid_device->id = ioc->sas_id++; ++ raid_device->channel = RAID_CHANNEL; ++ raid_device->handle = handle; ++ raid_device->wwid = wwid; ++ _scsih_raid_device_add(ioc, raid_device); ++ rc = scsi_add_device(ioc->shost, RAID_CHANNEL, ++ raid_device->id, 0); ++ if (rc) ++ _scsih_raid_device_remove(ioc, raid_device); ++ break; ++ ++ case MPI2_RAID_VOL_STATE_INITIALIZING: ++ default: ++ break; ++ } ++} ++ ++/** ++ * _scsih_sas_ir_physical_disk_event - PD event ++ * @ioc: per adapter object ++ * @event_data: event data payload ++ * Context: user. ++ * ++ * Return nothing. ++ */ ++static void ++_scsih_sas_ir_physical_disk_event(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID, ++ Mpi2EventDataIrPhysicalDisk_t *event_data) ++{ ++ u16 handle; ++ u32 state; ++ struct _sas_device *sas_device; ++ unsigned long flags; ++ Mpi2ConfigReply_t mpi_reply; ++ Mpi2SasDevicePage0_t sas_device_pg0; ++ u32 ioc_status; ++ ++ if (event_data->ReasonCode != MPI2_EVENT_IR_PHYSDISK_RC_STATE_CHANGED) ++ return; ++ ++ handle = le16_to_cpu(event_data->PhysDiskDevHandle); ++ state = le32_to_cpu(event_data->NewValue); ++ ++ dewtprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: handle(0x%04x), " ++ "old(0x%08x), new(0x%08x)\n", ioc->name, __func__, handle, ++ le32_to_cpu(event_data->PreviousValue), state)); ++ ++ spin_lock_irqsave(&ioc->sas_device_lock, flags); ++ sas_device = _scsih_sas_device_find_by_handle(ioc, handle); ++ spin_unlock_irqrestore(&ioc->sas_device_lock, flags); ++ ++ switch (state) { ++ case MPI2_RAID_PD_STATE_ONLINE: ++ case MPI2_RAID_PD_STATE_DEGRADED: ++ case MPI2_RAID_PD_STATE_REBUILDING: ++ case MPI2_RAID_PD_STATE_OPTIMAL: ++ if (sas_device) { ++ sas_device->hidden_raid_component = 1; ++ return; ++ } ++ ++ if ((mpt2sas_config_get_sas_device_pg0(ioc, &mpi_reply, ++ &sas_device_pg0, MPI2_SAS_DEVICE_PGAD_FORM_HANDLE, ++ handle))) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ return; ++ } ++ ++ ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & ++ MPI2_IOCSTATUS_MASK; ++ if (ioc_status != MPI2_IOCSTATUS_SUCCESS) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ return; ++ } ++ ++ mpt2sas_transport_update_links(ioc, ++ le16_to_cpu(sas_device_pg0.ParentDevHandle), ++ handle, sas_device_pg0.PhyNum, MPI2_SAS_NEG_LINK_RATE_1_5); ++ ++ _scsih_add_device(ioc, handle, 0, 0, 1); ++ ++ break; ++ ++ case MPI2_RAID_PD_STATE_OFFLINE: ++ case MPI2_RAID_PD_STATE_NOT_CONFIGURED: ++ case MPI2_RAID_PD_STATE_NOT_COMPATIBLE: ++ case MPI2_RAID_PD_STATE_HOT_SPARE: ++ default: ++ break; ++ } ++} ++ ++#ifdef CONFIG_SCSI_MPT2SAS_LOGGING ++/** ++ * _scsih_sas_ir_operation_status_event_debug - debug for IR op event ++ * @ioc: per adapter object ++ * @event_data: event data payload ++ * Context: user. ++ * ++ * Return nothing. ++ */ ++static void ++_scsih_sas_ir_operation_status_event_debug(struct MPT2SAS_ADAPTER *ioc, ++ Mpi2EventDataIrOperationStatus_t *event_data) ++{ ++ char *reason_str = NULL; ++ ++ switch (event_data->RAIDOperation) { ++ case MPI2_EVENT_IR_RAIDOP_RESYNC: ++ reason_str = "resync"; ++ break; ++ case MPI2_EVENT_IR_RAIDOP_ONLINE_CAP_EXPANSION: ++ reason_str = "online capacity expansion"; ++ break; ++ case MPI2_EVENT_IR_RAIDOP_CONSISTENCY_CHECK: ++ reason_str = "consistency check"; ++ break; ++ default: ++ reason_str = "unknown reason"; ++ break; ++ } ++ ++ printk(MPT2SAS_INFO_FMT "raid operational status: (%s)" ++ "\thandle(0x%04x), percent complete(%d)\n", ++ ioc->name, reason_str, ++ le16_to_cpu(event_data->VolDevHandle), ++ event_data->PercentComplete); ++} ++#endif ++ ++/** ++ * _scsih_sas_ir_operation_status_event - handle RAID operation events ++ * @ioc: per adapter object ++ * @VF_ID: ++ * @event_data: event data payload ++ * Context: user. ++ * ++ * Return nothing. ++ */ ++static void ++_scsih_sas_ir_operation_status_event(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID, ++ Mpi2EventDataIrOperationStatus_t *event_data) ++{ ++#ifdef CONFIG_SCSI_MPT2SAS_LOGGING ++ if (ioc->logging_level & MPT_DEBUG_EVENT_WORK_TASK) ++ _scsih_sas_ir_operation_status_event_debug(ioc, event_data); ++#endif ++} ++ ++/** ++ * _scsih_task_set_full - handle task set full ++ * @ioc: per adapter object ++ * @event_data: event data payload ++ * Context: user. ++ * ++ * Throttle back qdepth. ++ */ ++static void ++_scsih_task_set_full(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID, ++ Mpi2EventDataTaskSetFull_t *event_data) ++{ ++ unsigned long flags; ++ struct _sas_device *sas_device; ++ static struct _raid_device *raid_device; ++ struct scsi_device *sdev; ++ int depth; ++ u16 current_depth; ++ u16 handle; ++ int id, channel; ++ u64 sas_address; ++ ++ current_depth = le16_to_cpu(event_data->CurrentDepth); ++ handle = le16_to_cpu(event_data->DevHandle); ++ spin_lock_irqsave(&ioc->sas_device_lock, flags); ++ sas_device = _scsih_sas_device_find_by_handle(ioc, handle); ++ if (!sas_device) { ++ spin_unlock_irqrestore(&ioc->sas_device_lock, flags); ++ return; ++ } ++ spin_unlock_irqrestore(&ioc->sas_device_lock, flags); ++ id = sas_device->id; ++ channel = sas_device->channel; ++ sas_address = sas_device->sas_address; ++ ++ /* if hidden raid component, then change to volume characteristics */ ++ if (sas_device->hidden_raid_component && sas_device->volume_handle) { ++ spin_lock_irqsave(&ioc->raid_device_lock, flags); ++ raid_device = _scsih_raid_device_find_by_handle( ++ ioc, sas_device->volume_handle); ++ spin_unlock_irqrestore(&ioc->raid_device_lock, flags); ++ if (raid_device) { ++ id = raid_device->id; ++ channel = raid_device->channel; ++ handle = raid_device->handle; ++ sas_address = raid_device->wwid; ++ } ++ } ++ ++ if (ioc->logging_level & MPT_DEBUG_TASK_SET_FULL) ++ starget_printk(KERN_DEBUG, sas_device->starget, "task set " ++ "full: handle(0x%04x), sas_addr(0x%016llx), depth(%d)\n", ++ handle, (unsigned long long)sas_address, current_depth); ++ ++ shost_for_each_device(sdev, ioc->shost) { ++ if (sdev->id == id && sdev->channel == channel) { ++ if (current_depth > sdev->queue_depth) { ++ if (ioc->logging_level & ++ MPT_DEBUG_TASK_SET_FULL) ++ sdev_printk(KERN_INFO, sdev, "strange " ++ "observation, the queue depth is" ++ " (%d) meanwhile fw queue depth " ++ "is (%d)\n", sdev->queue_depth, ++ current_depth); ++ continue; ++ } ++ depth = scsi_track_queue_full(sdev, ++ current_depth - 1); ++ if (depth > 0) ++ sdev_printk(KERN_INFO, sdev, "Queue depth " ++ "reduced to (%d)\n", depth); ++ else if (depth < 0) ++ sdev_printk(KERN_INFO, sdev, "Tagged Command " ++ "Queueing is being disabled\n"); ++ else if (depth == 0) ++ if (ioc->logging_level & ++ MPT_DEBUG_TASK_SET_FULL) ++ sdev_printk(KERN_INFO, sdev, ++ "Queue depth not changed yet\n"); ++ } ++ } ++} ++ ++/** ++ * _scsih_mark_responding_sas_device - mark a sas_devices as responding ++ * @ioc: per adapter object ++ * @sas_address: sas address ++ * @slot: enclosure slot id ++ * @handle: device handle ++ * ++ * After host reset, find out whether devices are still responding. ++ * Used in _scsi_remove_unresponsive_sas_devices. ++ * ++ * Return nothing. ++ */ ++static void ++_scsih_mark_responding_sas_device(struct MPT2SAS_ADAPTER *ioc, u64 sas_address, ++ u16 slot, u16 handle) ++{ ++ struct MPT2SAS_TARGET *sas_target_priv_data; ++ struct scsi_target *starget; ++ struct _sas_device *sas_device; ++ unsigned long flags; ++ ++ spin_lock_irqsave(&ioc->sas_device_lock, flags); ++ list_for_each_entry(sas_device, &ioc->sas_device_list, list) { ++ if (sas_device->sas_address == sas_address && ++ sas_device->slot == slot && sas_device->starget) { ++ sas_device->responding = 1; ++ starget_printk(KERN_INFO, sas_device->starget, ++ "handle(0x%04x), sas_addr(0x%016llx), enclosure " ++ "logical id(0x%016llx), slot(%d)\n", handle, ++ (unsigned long long)sas_device->sas_address, ++ (unsigned long long) ++ sas_device->enclosure_logical_id, ++ sas_device->slot); ++ if (sas_device->handle == handle) ++ goto out; ++ printk(KERN_INFO "\thandle changed from(0x%04x)!!!\n", ++ sas_device->handle); ++ sas_device->handle = handle; ++ starget = sas_device->starget; ++ sas_target_priv_data = starget->hostdata; ++ sas_target_priv_data->handle = handle; ++ goto out; ++ } ++ } ++ out: ++ spin_unlock_irqrestore(&ioc->sas_device_lock, flags); ++} ++ ++/** ++ * _scsih_search_responding_sas_devices - ++ * @ioc: per adapter object ++ * ++ * After host reset, find out whether devices are still responding. ++ * If not remove. ++ * ++ * Return nothing. ++ */ ++static void ++_scsih_search_responding_sas_devices(struct MPT2SAS_ADAPTER *ioc) ++{ ++ Mpi2SasDevicePage0_t sas_device_pg0; ++ Mpi2ConfigReply_t mpi_reply; ++ u16 ioc_status; ++ u16 handle; ++ u32 device_info; ++ ++ printk(MPT2SAS_INFO_FMT "%s\n", ioc->name, __func__); ++ ++ if (list_empty(&ioc->sas_device_list)) ++ return; ++ ++ handle = 0xFFFF; ++ while (!(mpt2sas_config_get_sas_device_pg0(ioc, &mpi_reply, ++ &sas_device_pg0, MPI2_SAS_DEVICE_PGAD_FORM_GET_NEXT_HANDLE, ++ handle))) { ++ ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & ++ MPI2_IOCSTATUS_MASK; ++ if (ioc_status == MPI2_IOCSTATUS_CONFIG_INVALID_PAGE) ++ break; ++ handle = le16_to_cpu(sas_device_pg0.DevHandle); ++ device_info = le32_to_cpu(sas_device_pg0.DeviceInfo); ++ if (!(_scsih_is_end_device(device_info))) ++ continue; ++ _scsih_mark_responding_sas_device(ioc, ++ le64_to_cpu(sas_device_pg0.SASAddress), ++ le16_to_cpu(sas_device_pg0.Slot), handle); ++ } ++} ++ ++/** ++ * _scsih_mark_responding_raid_device - mark a raid_device as responding ++ * @ioc: per adapter object ++ * @wwid: world wide identifier for raid volume ++ * @handle: device handle ++ * ++ * After host reset, find out whether devices are still responding. ++ * Used in _scsi_remove_unresponsive_raid_devices. ++ * ++ * Return nothing. ++ */ ++static void ++_scsih_mark_responding_raid_device(struct MPT2SAS_ADAPTER *ioc, u64 wwid, ++ u16 handle) ++{ ++ struct MPT2SAS_TARGET *sas_target_priv_data; ++ struct scsi_target *starget; ++ struct _raid_device *raid_device; ++ unsigned long flags; ++ ++ spin_lock_irqsave(&ioc->raid_device_lock, flags); ++ list_for_each_entry(raid_device, &ioc->raid_device_list, list) { ++ if (raid_device->wwid == wwid && raid_device->starget) { ++ raid_device->responding = 1; ++ starget_printk(KERN_INFO, raid_device->starget, ++ "handle(0x%04x), wwid(0x%016llx)\n", handle, ++ (unsigned long long)raid_device->wwid); ++ if (raid_device->handle == handle) ++ goto out; ++ printk(KERN_INFO "\thandle changed from(0x%04x)!!!\n", ++ raid_device->handle); ++ raid_device->handle = handle; ++ starget = raid_device->starget; ++ sas_target_priv_data = starget->hostdata; ++ sas_target_priv_data->handle = handle; ++ goto out; ++ } ++ } ++ out: ++ spin_unlock_irqrestore(&ioc->raid_device_lock, flags); ++} ++ ++/** ++ * _scsih_search_responding_raid_devices - ++ * @ioc: per adapter object ++ * ++ * After host reset, find out whether devices are still responding. ++ * If not remove. ++ * ++ * Return nothing. ++ */ ++static void ++_scsih_search_responding_raid_devices(struct MPT2SAS_ADAPTER *ioc) ++{ ++ Mpi2RaidVolPage1_t volume_pg1; ++ Mpi2ConfigReply_t mpi_reply; ++ u16 ioc_status; ++ u16 handle; ++ ++ printk(MPT2SAS_INFO_FMT "%s\n", ioc->name, __func__); ++ ++ if (list_empty(&ioc->raid_device_list)) ++ return; ++ ++ handle = 0xFFFF; ++ while (!(mpt2sas_config_get_raid_volume_pg1(ioc, &mpi_reply, ++ &volume_pg1, MPI2_RAID_VOLUME_PGAD_FORM_GET_NEXT_HANDLE, handle))) { ++ ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & ++ MPI2_IOCSTATUS_MASK; ++ if (ioc_status == MPI2_IOCSTATUS_CONFIG_INVALID_PAGE) ++ break; ++ handle = le16_to_cpu(volume_pg1.DevHandle); ++ _scsih_mark_responding_raid_device(ioc, ++ le64_to_cpu(volume_pg1.WWID), handle); ++ } ++} ++ ++/** ++ * _scsih_mark_responding_expander - mark a expander as responding ++ * @ioc: per adapter object ++ * @sas_address: sas address ++ * @handle: ++ * ++ * After host reset, find out whether devices are still responding. ++ * Used in _scsi_remove_unresponsive_expanders. ++ * ++ * Return nothing. ++ */ ++static void ++_scsih_mark_responding_expander(struct MPT2SAS_ADAPTER *ioc, u64 sas_address, ++ u16 handle) ++{ ++ struct _sas_node *sas_expander; ++ unsigned long flags; ++ ++ spin_lock_irqsave(&ioc->sas_node_lock, flags); ++ list_for_each_entry(sas_expander, &ioc->sas_expander_list, list) { ++ if (sas_expander->sas_address == sas_address) { ++ sas_expander->responding = 1; ++ if (sas_expander->handle != handle) { ++ printk(KERN_INFO "old handle(0x%04x)\n", ++ sas_expander->handle); ++ sas_expander->handle = handle; ++ } ++ goto out; ++ } ++ } ++ out: ++ spin_unlock_irqrestore(&ioc->sas_node_lock, flags); ++} ++ ++/** ++ * _scsih_search_responding_expanders - ++ * @ioc: per adapter object ++ * ++ * After host reset, find out whether devices are still responding. ++ * If not remove. ++ * ++ * Return nothing. ++ */ ++static void ++_scsih_search_responding_expanders(struct MPT2SAS_ADAPTER *ioc) ++{ ++ Mpi2ExpanderPage0_t expander_pg0; ++ Mpi2ConfigReply_t mpi_reply; ++ u16 ioc_status; ++ __le64 sas_address; ++ u16 handle; ++ ++ printk(MPT2SAS_INFO_FMT "%s\n", ioc->name, __func__); ++ ++ if (list_empty(&ioc->sas_expander_list)) ++ return; ++ ++ handle = 0xFFFF; ++ while (!(mpt2sas_config_get_expander_pg0(ioc, &mpi_reply, &expander_pg0, ++ MPI2_SAS_EXPAND_PGAD_FORM_GET_NEXT_HNDL, handle))) { ++ ++ ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & ++ MPI2_IOCSTATUS_MASK; ++ if (ioc_status == MPI2_IOCSTATUS_CONFIG_INVALID_PAGE) ++ break; ++ ++ handle = le16_to_cpu(expander_pg0.DevHandle); ++ sas_address = le64_to_cpu(expander_pg0.SASAddress); ++ printk(KERN_INFO "\texpander present: handle(0x%04x), " ++ "sas_addr(0x%016llx)\n", handle, ++ (unsigned long long)sas_address); ++ _scsih_mark_responding_expander(ioc, sas_address, handle); ++ } ++ ++} ++ ++/** ++ * _scsih_remove_unresponding_devices - removing unresponding devices ++ * @ioc: per adapter object ++ * ++ * Return nothing. ++ */ ++static void ++_scsih_remove_unresponding_devices(struct MPT2SAS_ADAPTER *ioc) ++{ ++ struct _sas_device *sas_device, *sas_device_next; ++ struct _sas_node *sas_expander; ++ struct _raid_device *raid_device, *raid_device_next; ++ ++ list_for_each_entry_safe(sas_device, sas_device_next, ++ &ioc->sas_device_list, list) { ++ if (sas_device->responding) { ++ sas_device->responding = 0; ++ continue; ++ } ++ if (sas_device->starget) ++ starget_printk(KERN_INFO, sas_device->starget, ++ "removing: handle(0x%04x), sas_addr(0x%016llx), " ++ "enclosure logical id(0x%016llx), slot(%d)\n", ++ sas_device->handle, ++ (unsigned long long)sas_device->sas_address, ++ (unsigned long long) ++ sas_device->enclosure_logical_id, ++ sas_device->slot); ++ _scsih_remove_device(ioc, sas_device->handle); ++ } ++ ++ list_for_each_entry_safe(raid_device, raid_device_next, ++ &ioc->raid_device_list, list) { ++ if (raid_device->responding) { ++ raid_device->responding = 0; ++ continue; ++ } ++ if (raid_device->starget) { ++ starget_printk(KERN_INFO, raid_device->starget, ++ "removing: handle(0x%04x), wwid(0x%016llx)\n", ++ raid_device->handle, ++ (unsigned long long)raid_device->wwid); ++ scsi_remove_target(&raid_device->starget->dev); ++ } ++ _scsih_raid_device_remove(ioc, raid_device); ++ } ++ ++ retry_expander_search: ++ sas_expander = NULL; ++ list_for_each_entry(sas_expander, &ioc->sas_expander_list, list) { ++ if (sas_expander->responding) { ++ sas_expander->responding = 0; ++ continue; ++ } ++ _scsih_expander_remove(ioc, sas_expander->handle); ++ goto retry_expander_search; ++ } ++} ++ ++/** ++ * mpt2sas_scsih_reset_handler - reset callback handler (for scsih) ++ * @ioc: per adapter object ++ * @reset_phase: phase ++ * ++ * The handler for doing any required cleanup or initialization. ++ * ++ * The reset phase can be MPT2_IOC_PRE_RESET, MPT2_IOC_AFTER_RESET, ++ * MPT2_IOC_DONE_RESET ++ * ++ * Return nothing. ++ */ ++void ++mpt2sas_scsih_reset_handler(struct MPT2SAS_ADAPTER *ioc, int reset_phase) ++{ ++ switch (reset_phase) { ++ case MPT2_IOC_PRE_RESET: ++ dtmprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: " ++ "MPT2_IOC_PRE_RESET\n", ioc->name, __func__)); ++ _scsih_fw_event_off(ioc); ++ break; ++ case MPT2_IOC_AFTER_RESET: ++ dtmprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: " ++ "MPT2_IOC_AFTER_RESET\n", ioc->name, __func__)); ++ if (ioc->scsih_cmds.status & MPT2_CMD_PENDING) { ++ ioc->scsih_cmds.status |= MPT2_CMD_RESET; ++ mpt2sas_base_free_smid(ioc, ioc->scsih_cmds.smid); ++ complete(&ioc->scsih_cmds.done); ++ } ++ if (ioc->tm_cmds.status & MPT2_CMD_PENDING) { ++ ioc->tm_cmds.status |= MPT2_CMD_RESET; ++ mpt2sas_base_free_smid(ioc, ioc->tm_cmds.smid); ++ complete(&ioc->tm_cmds.done); ++ } ++ _scsih_fw_event_cleanup_queue(ioc); ++ _scsih_fw_event_on(ioc); ++ _scsih_flush_running_cmds(ioc); ++ break; ++ case MPT2_IOC_DONE_RESET: ++ dtmprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: " ++ "MPT2_IOC_DONE_RESET\n", ioc->name, __func__)); ++ _scsih_sas_host_refresh(ioc, 0); ++ _scsih_search_responding_sas_devices(ioc); ++ _scsih_search_responding_raid_devices(ioc); ++ _scsih_search_responding_expanders(ioc); ++ break; ++ case MPT2_IOC_RUNNING: ++ dtmprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: " ++ "MPT2_IOC_RUNNING\n", ioc->name, __func__)); ++ _scsih_remove_unresponding_devices(ioc); ++ break; ++ } ++} ++ ++/** ++ * _mpt2sas_fw_work - delayed task for processing firmware events ++ * @ioc: per adapter object ++ * @fw_event: The fw_event_work object ++ * Context: user. ++ * ++ * Return nothing. ++ */ ++static void ++_mpt2sas_fw_work(struct MPT2SAS_ADAPTER *ioc, struct fw_event_work *fw_event) ++{ ++ unsigned long flags; ++ ++ /* the queue is being flushed so ignore this event */ ++ spin_lock_irqsave(&ioc->fw_event_lock, flags); ++ if (ioc->fw_events_off || ioc->remove_host) { ++ spin_unlock_irqrestore(&ioc->fw_event_lock, flags); ++ _scsih_fw_event_free(ioc, fw_event); ++ return; ++ } ++ spin_unlock_irqrestore(&ioc->fw_event_lock, flags); ++ ++ if (ioc->shost_recovery) { ++ _scsih_fw_event_requeue(ioc, fw_event, 1000); ++ return; ++ } ++ ++ switch (fw_event->event) { ++#ifdef MPT2SAS_MULTIPATH ++ case MPT2SAS_ABRT_TASK_SET: ++ _scsih_abort_task_set(ioc, fw_event->VF_ID, ++ fw_event->event_data); ++ break; ++#endif ++ case MPI2_EVENT_SAS_TOPOLOGY_CHANGE_LIST: ++ if (_scsih_sas_topology_change_event(ioc, fw_event->VF_ID, ++ fw_event->event_data, fw_event)) { ++ _scsih_fw_event_requeue(ioc, fw_event, 1000); ++ return; ++ } ++ break; ++ case MPI2_EVENT_SAS_DEVICE_STATUS_CHANGE: ++ _scsih_sas_device_status_change_event(ioc, fw_event->VF_ID, ++ fw_event->event_data); ++ break; ++ case MPI2_EVENT_SAS_DISCOVERY: ++ _scsih_sas_discovery_event(ioc, fw_event->VF_ID, ++ fw_event->event_data); ++ break; ++ case MPI2_EVENT_SAS_BROADCAST_PRIMITIVE: ++ _scsih_sas_broadcast_primative_event(ioc, fw_event->VF_ID, ++ fw_event->event_data); ++ break; ++ case MPI2_EVENT_SAS_ENCL_DEVICE_STATUS_CHANGE: ++ _scsih_sas_enclosure_dev_status_change_event(ioc, ++ fw_event->VF_ID, fw_event->event_data); ++ break; ++ case MPI2_EVENT_IR_CONFIGURATION_CHANGE_LIST: ++ _scsih_sas_ir_config_change_event(ioc, fw_event->VF_ID, ++ fw_event->event_data); ++ break; ++ case MPI2_EVENT_IR_VOLUME: ++ _scsih_sas_ir_volume_event(ioc, fw_event->VF_ID, ++ fw_event->event_data); ++ break; ++ case MPI2_EVENT_IR_PHYSICAL_DISK: ++ _scsih_sas_ir_physical_disk_event(ioc, fw_event->VF_ID, ++ fw_event->event_data); ++ break; ++ case MPI2_EVENT_IR_OPERATION_STATUS: ++ _scsih_sas_ir_operation_status_event(ioc, fw_event->VF_ID, ++ fw_event->event_data); ++ break; ++ case MPI2_EVENT_TASK_SET_FULL: ++ _scsih_task_set_full(ioc, fw_event->VF_ID, ++ fw_event->event_data); ++ break; ++ } ++ _scsih_fw_event_free(ioc, fw_event); ++} ++ ++/** ++ * _firmware_event_work and _firmware_event_work_delayed ++ * @ioc: per adapter object ++ * @work: The fw_event_work object ++ * Context: user. ++ * ++ * wrappers for the work thread handling firmware events ++ * ++ * Return nothing. ++ */ ++ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,19)) ++static void ++_firmware_event_work(struct work_struct *work) ++{ ++ struct fw_event_work *fw_event = container_of(work, ++ struct fw_event_work, work); ++ ++ _mpt2sas_fw_work(fw_event->ioc, fw_event); ++} ++static void ++_firmware_event_work_delayed(struct work_struct *work) ++{ ++ struct fw_event_work *fw_event = container_of(work, ++ struct fw_event_work, delayed_work.work); ++ ++ _mpt2sas_fw_work(fw_event->ioc, fw_event); ++} ++#else ++static void ++_firmware_event_work(void *arg) ++{ ++ struct fw_event_work *fw_event = (struct fw_event_work *)arg; ++ ++ _mpt2sas_fw_work(fw_event->ioc, fw_event); ++} ++#endif ++ ++/** ++ * mpt2sas_scsih_event_callback - firmware event handler (called at ISR time) ++ * @ioc: per adapter object ++ * @VF_ID: virtual function id ++ * @reply: reply message frame(lower 32bit addr) ++ * Context: interrupt. ++ * ++ * This function merely adds a new work task into ioc->firmware_event_thread. ++ * The tasks are worked from _firmware_event_work in user context. ++ * ++ * Return nothing. ++ */ ++void ++mpt2sas_scsih_event_callback(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID, u32 reply) ++{ ++ struct fw_event_work *fw_event; ++ Mpi2EventNotificationReply_t *mpi_reply; ++ unsigned long flags; ++ u16 event; ++ ++ /* events turned off due to host reset or driver unloading */ ++ spin_lock_irqsave(&ioc->fw_event_lock, flags); ++ if (ioc->fw_events_off || ioc->remove_host) { ++ spin_unlock_irqrestore(&ioc->fw_event_lock, flags); ++ return; ++ } ++ spin_unlock_irqrestore(&ioc->fw_event_lock, flags); ++ ++ mpi_reply = mpt2sas_base_get_reply_virt_addr(ioc, reply); ++ event = le16_to_cpu(mpi_reply->Event); ++ ++ switch (event) { ++ /* handle these */ ++ case MPI2_EVENT_SAS_BROADCAST_PRIMITIVE: ++ { ++ Mpi2EventDataSasBroadcastPrimitive_t *baen_data = ++ (Mpi2EventDataSasBroadcastPrimitive_t *) ++ mpi_reply->EventData; ++ ++ if (baen_data->Primitive != ++ MPI2_EVENT_PRIMITIVE_ASYNCHRONOUS_EVENT || ++ ioc->broadcast_aen_busy) ++ return; ++ ioc->broadcast_aen_busy = 1; ++ break; ++ } ++ ++ case MPI2_EVENT_SAS_TOPOLOGY_CHANGE_LIST: ++ _scsih_check_topo_delete_events(ioc, ++ (Mpi2EventDataSasTopologyChangeList_t *) ++ mpi_reply->EventData); ++ break; ++ ++ case MPI2_EVENT_SAS_DEVICE_STATUS_CHANGE: ++ case MPI2_EVENT_IR_OPERATION_STATUS: ++ case MPI2_EVENT_SAS_DISCOVERY: ++ case MPI2_EVENT_SAS_ENCL_DEVICE_STATUS_CHANGE: ++ case MPI2_EVENT_IR_VOLUME: ++ case MPI2_EVENT_IR_PHYSICAL_DISK: ++ case MPI2_EVENT_IR_CONFIGURATION_CHANGE_LIST: ++ case MPI2_EVENT_TASK_SET_FULL: ++ break; ++ ++ default: /* ignore the rest */ ++ return; ++ } ++ ++ fw_event = kzalloc(sizeof(struct fw_event_work), GFP_ATOMIC); ++ if (!fw_event) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ return; ++ } ++ fw_event->event_data = ++ kzalloc(mpi_reply->EventDataLength*4, GFP_ATOMIC); ++ if (!fw_event->event_data) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ kfree(fw_event); ++ return; ++ } ++ ++ if (event == MPI2_EVENT_SAS_TOPOLOGY_CHANGE_LIST) { ++ Mpi2EventDataSasTopologyChangeList_t *topo_event_data = ++ (Mpi2EventDataSasTopologyChangeList_t *) ++ mpi_reply->EventData; ++ fw_event->retries = kzalloc(topo_event_data->NumEntries, ++ GFP_ATOMIC); ++ if (!fw_event->retries) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ kfree(fw_event->event_data); ++ kfree(fw_event); ++ return; ++ } ++ } ++ ++ memcpy(fw_event->event_data, mpi_reply->EventData, ++ mpi_reply->EventDataLength*4); ++ fw_event->ioc = ioc; ++ fw_event->VF_ID = VF_ID; ++ fw_event->event = event; ++ _scsih_fw_event_add(ioc, fw_event); ++} ++ ++/* shost template */ ++static struct scsi_host_template scsih_driver_template = { ++ .module = THIS_MODULE, ++ .name = "Fusion MPT SAS Host", ++ .proc_name = MPT2SAS_DRIVER_NAME, ++ .queuecommand = _scsih_qcmd, ++ .target_alloc = _scsih_target_alloc, ++ .slave_alloc = _scsih_slave_alloc, ++ .slave_configure = _scsih_slave_configure, ++ .target_destroy = _scsih_target_destroy, ++ .slave_destroy = _scsih_slave_destroy, ++ .change_queue_depth = _scsih_change_queue_depth, ++ .change_queue_type = _scsih_change_queue_type, ++ .eh_abort_handler = _scsih_abort, ++ .eh_device_reset_handler = _scsih_dev_reset, ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26)) ++ .eh_target_reset_handler = _scsih_target_reset, ++#endif ++ .eh_host_reset_handler = _scsih_host_reset, ++ .bios_param = _scsih_bios_param, ++ .can_queue = 1, ++ .this_id = -1, ++ .sg_tablesize = MPT2SAS_SG_DEPTH, ++ .max_sectors = 8192, ++ .cmd_per_lun = 7, ++ .use_clustering = ENABLE_CLUSTERING, ++ .shost_attrs = mpt2sas_host_attrs, ++ .sdev_attrs = mpt2sas_dev_attrs, ++}; ++ ++/** ++ * _scsih_expander_node_remove - removing expander device from list. ++ * @ioc: per adapter object ++ * @sas_expander: the sas_device object ++ * Context: Calling function should acquire ioc->sas_node_lock. ++ * ++ * Removing object and freeing associated memory from the ++ * ioc->sas_expander_list. ++ * ++ * Return nothing. ++ */ ++static void ++_scsih_expander_node_remove(struct MPT2SAS_ADAPTER *ioc, ++ struct _sas_node *sas_expander) ++{ ++ struct _sas_port *mpt2sas_port; ++ struct _sas_device *sas_device; ++ struct _sas_node *expander_sibling; ++ unsigned long flags; ++ ++ if (!sas_expander) ++ return; ++ ++ /* remove sibling ports attached to this expander */ ++ retry_device_search: ++ list_for_each_entry(mpt2sas_port, ++ &sas_expander->sas_port_list, port_list) { ++ if (mpt2sas_port->remote_identify.device_type == ++ SAS_END_DEVICE) { ++ spin_lock_irqsave(&ioc->sas_device_lock, flags); ++ sas_device = ++ mpt2sas_scsih_sas_device_find_by_sas_address(ioc, ++ mpt2sas_port->remote_identify.sas_address); ++ spin_unlock_irqrestore(&ioc->sas_device_lock, flags); ++ if (!sas_device) ++ continue; ++ _scsih_remove_device(ioc, sas_device->handle); ++ if (ioc->shost_recovery) ++ return; ++ goto retry_device_search; ++ } ++ } ++ ++ retry_expander_search: ++ list_for_each_entry(mpt2sas_port, ++ &sas_expander->sas_port_list, port_list) { ++ ++ if (mpt2sas_port->remote_identify.device_type == ++ MPI2_SAS_DEVICE_INFO_EDGE_EXPANDER || ++ mpt2sas_port->remote_identify.device_type == ++ MPI2_SAS_DEVICE_INFO_FANOUT_EXPANDER) { ++ ++ spin_lock_irqsave(&ioc->sas_node_lock, flags); ++ expander_sibling = ++ mpt2sas_scsih_expander_find_by_sas_address( ++ ioc, mpt2sas_port->remote_identify.sas_address); ++ spin_unlock_irqrestore(&ioc->sas_node_lock, flags); ++ if (!expander_sibling) ++ continue; ++ _scsih_expander_remove(ioc, expander_sibling->handle); ++ if (ioc->shost_recovery) ++ return; ++ goto retry_expander_search; ++ } ++ } ++ ++ mpt2sas_transport_port_remove(ioc, sas_expander->sas_address, ++ sas_expander->parent_handle); ++ ++ printk(MPT2SAS_INFO_FMT "expander_remove: handle" ++ "(0x%04x), sas_addr(0x%016llx)\n", ioc->name, ++ sas_expander->handle, (unsigned long long) ++ sas_expander->sas_address); ++ ++ list_del(&sas_expander->list); ++ kfree(sas_expander->phy); ++ kfree(sas_expander); ++} ++ ++/** ++ * _scsih_remove - detach and remove add host ++ * @pdev: PCI device struct ++ * ++ * Return nothing. ++ */ ++static void __devexit ++_scsih_remove(struct pci_dev *pdev) ++{ ++ struct Scsi_Host *shost = pci_get_drvdata(pdev); ++ struct MPT2SAS_ADAPTER *ioc = shost_private(shost); ++ struct _sas_port *mpt2sas_port; ++ struct _sas_device *sas_device; ++ struct _sas_node *expander_sibling; ++ struct workqueue_struct *wq; ++ unsigned long flags; ++ ++ ioc->remove_host = 1; ++ _scsih_fw_event_off(ioc); ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) ++ _scsih_fw_event_cleanup_queue(ioc); ++#endif ++ ++ spin_lock_irqsave(&ioc->fw_event_lock, flags); ++ wq = ioc->firmware_event_thread; ++ ioc->firmware_event_thread = NULL; ++ spin_unlock_irqrestore(&ioc->fw_event_lock, flags); ++ if (wq) ++ destroy_workqueue(wq); ++ ++ /* free ports attached to the sas_host */ ++ retry_again: ++ list_for_each_entry(mpt2sas_port, ++ &ioc->sas_hba.sas_port_list, port_list) { ++ if (mpt2sas_port->remote_identify.device_type == ++ SAS_END_DEVICE) { ++ sas_device = ++ mpt2sas_scsih_sas_device_find_by_sas_address(ioc, ++ mpt2sas_port->remote_identify.sas_address); ++ if (sas_device) { ++ _scsih_remove_device(ioc, sas_device->handle); ++ goto retry_again; ++ } ++ } else { ++ expander_sibling = ++ mpt2sas_scsih_expander_find_by_sas_address(ioc, ++ mpt2sas_port->remote_identify.sas_address); ++ if (expander_sibling) { ++ _scsih_expander_remove(ioc, ++ expander_sibling->handle); ++ goto retry_again; ++ } ++ } ++ } ++ ++ /* free phys attached to the sas_host */ ++ if (ioc->sas_hba.num_phys) { ++ kfree(ioc->sas_hba.phy); ++ ioc->sas_hba.phy = NULL; ++ ioc->sas_hba.num_phys = 0; ++ } ++ ++ sas_remove_host(shost); ++ mpt2sas_base_detach(ioc); ++ list_del(&ioc->list); ++ scsi_remove_host(shost); ++ scsi_host_put(shost); ++} ++ ++/** ++ * _scsih_probe_boot_devices - reports 1st device ++ * @ioc: per adapter object ++ * ++ * If specified in bios page 2, this routine reports the 1st ++ * device scsi-ml or sas transport for persistent boot device ++ * purposes. Please refer to function _scsih_determine_boot_device() ++ */ ++static void ++_scsih_probe_boot_devices(struct MPT2SAS_ADAPTER *ioc) ++{ ++ u8 is_raid; ++ void *device; ++ struct _sas_device *sas_device; ++ struct _raid_device *raid_device; ++ u16 handle, parent_handle; ++ u64 sas_address; ++ unsigned long flags; ++ int rc; ++ ++ device = NULL; ++ if (ioc->req_boot_device.device) { ++ device = ioc->req_boot_device.device; ++ is_raid = ioc->req_boot_device.is_raid; ++ } else if (ioc->req_alt_boot_device.device) { ++ device = ioc->req_alt_boot_device.device; ++ is_raid = ioc->req_alt_boot_device.is_raid; ++ } else if (ioc->current_boot_device.device) { ++ device = ioc->current_boot_device.device; ++ is_raid = ioc->current_boot_device.is_raid; ++ } ++ ++ if (!device) ++ return; ++ ++ if (is_raid) { ++ raid_device = device; ++ rc = scsi_add_device(ioc->shost, RAID_CHANNEL, ++ raid_device->id, 0); ++ if (rc) ++ _scsih_raid_device_remove(ioc, raid_device); ++ } else { ++ sas_device = device; ++ handle = sas_device->handle; ++ parent_handle = sas_device->parent_handle; ++ sas_address = sas_device->sas_address; ++ spin_lock_irqsave(&ioc->sas_device_lock, flags); ++ list_move_tail(&sas_device->list, &ioc->sas_device_list); ++ spin_unlock_irqrestore(&ioc->sas_device_lock, flags); ++ if (!mpt2sas_transport_port_add(ioc, handle, parent_handle)) { ++ _scsih_sas_device_remove(ioc, sas_device); ++ } else if (!sas_device->starget) { ++ mpt2sas_transport_port_remove(ioc, sas_address, ++ parent_handle); ++ _scsih_sas_device_remove(ioc, sas_device); ++ } ++ } ++} ++ ++/** ++ * _scsih_probe_raid - reporting raid volumes to scsi-ml ++ * @ioc: per adapter object ++ * ++ * Called during initial loading of the driver. ++ */ ++static void ++_scsih_probe_raid(struct MPT2SAS_ADAPTER *ioc) ++{ ++ struct _raid_device *raid_device, *raid_next; ++ int rc; ++ ++ list_for_each_entry_safe(raid_device, raid_next, ++ &ioc->raid_device_list, list) { ++ if (raid_device->starget) ++ continue; ++ rc = scsi_add_device(ioc->shost, RAID_CHANNEL, ++ raid_device->id, 0); ++ if (rc) ++ _scsih_raid_device_remove(ioc, raid_device); ++ } ++} ++ ++/** ++ * _scsih_probe_sas - reporting sas devices to sas transport ++ * @ioc: per adapter object ++ * ++ * Called during initial loading of the driver. ++ */ ++static void ++_scsih_probe_sas(struct MPT2SAS_ADAPTER *ioc) ++{ ++ struct _sas_device *sas_device, *next; ++ unsigned long flags; ++ u16 handle, parent_handle; ++ u64 sas_address; ++ ++ /* SAS Device List */ ++ list_for_each_entry_safe(sas_device, next, &ioc->sas_device_init_list, ++ list) { ++ spin_lock_irqsave(&ioc->sas_device_lock, flags); ++ list_move_tail(&sas_device->list, &ioc->sas_device_list); ++ spin_unlock_irqrestore(&ioc->sas_device_lock, flags); ++ ++ handle = sas_device->handle; ++ parent_handle = sas_device->parent_handle; ++ sas_address = sas_device->sas_address; ++ if (!mpt2sas_transport_port_add(ioc, handle, parent_handle)) { ++ _scsih_sas_device_remove(ioc, sas_device); ++ } else if (!sas_device->starget) { ++ mpt2sas_transport_port_remove(ioc, sas_address, ++ parent_handle); ++ _scsih_sas_device_remove(ioc, sas_device); ++ } ++ } ++} ++ ++/** ++ * _scsih_probe_devices - probing for devices ++ * @ioc: per adapter object ++ * ++ * Called during initial loading of the driver. ++ */ ++static void ++_scsih_probe_devices(struct MPT2SAS_ADAPTER *ioc) ++{ ++ u16 volume_mapping_flags = ++ le16_to_cpu(ioc->ioc_pg8.IRVolumeMappingFlags) & ++ MPI2_IOCPAGE8_IRFLAGS_MASK_VOLUME_MAPPING_MODE; ++ ++ if (!(ioc->facts.ProtocolFlags & MPI2_IOCFACTS_PROTOCOL_SCSI_INITIATOR)) ++ return; /* return when IOC doesn't support initiator mode */ ++ ++ _scsih_probe_boot_devices(ioc); ++ ++ if (ioc->ir_firmware) { ++ if ((volume_mapping_flags & ++ MPI2_IOCPAGE8_IRFLAGS_HIGH_VOLUME_MAPPING)) { ++ _scsih_probe_sas(ioc); ++ _scsih_probe_raid(ioc); ++ } else { ++ _scsih_probe_raid(ioc); ++ _scsih_probe_sas(ioc); ++ } ++ } else ++ _scsih_probe_sas(ioc); ++} ++ ++/** ++ * _scsih_probe - attach and add scsi host ++ * @pdev: PCI device struct ++ * @id: pci device id ++ * ++ * Returns 0 success, anything else error. ++ */ ++static int ++_scsih_probe(struct pci_dev *pdev, const struct pci_device_id *id) ++{ ++ struct MPT2SAS_ADAPTER *ioc; ++ struct Scsi_Host *shost; ++ ++ shost = scsi_host_alloc(&scsih_driver_template, ++ sizeof(struct MPT2SAS_ADAPTER)); ++ if (!shost) ++ return -ENODEV; ++ ++ /* init local params */ ++ ioc = shost_private(shost); ++ memset(ioc, 0, sizeof(struct MPT2SAS_ADAPTER)); ++ INIT_LIST_HEAD(&ioc->list); ++ list_add_tail(&ioc->list, &mpt2sas_ioc_list); ++ ioc->shost = shost; ++ ioc->id = mpt_ids++; ++ sprintf(ioc->name, "%s%d", MPT2SAS_DRIVER_NAME, ioc->id); ++ ioc->pdev = pdev; ++ ioc->scsi_io_cb_idx = scsi_io_cb_idx; ++ ioc->tm_cb_idx = tm_cb_idx; ++ ioc->ctl_cb_idx = ctl_cb_idx; ++ ioc->base_cb_idx = base_cb_idx; ++ ioc->transport_cb_idx = transport_cb_idx; ++ ioc->scsih_cb_idx = scsih_cb_idx; ++ ioc->config_cb_idx = config_cb_idx; ++ ioc->logging_level = logging_level; ++ /* misc semaphores and spin locks */ ++ spin_lock_init(&ioc->ioc_reset_in_progress_lock); ++ spin_lock_init(&ioc->scsi_lookup_lock); ++ spin_lock_init(&ioc->sas_device_lock); ++ spin_lock_init(&ioc->sas_node_lock); ++ spin_lock_init(&ioc->fw_event_lock); ++ spin_lock_init(&ioc->raid_device_lock); ++ ++ INIT_LIST_HEAD(&ioc->sas_device_list); ++ INIT_LIST_HEAD(&ioc->sas_device_init_list); ++ INIT_LIST_HEAD(&ioc->sas_expander_list); ++ INIT_LIST_HEAD(&ioc->fw_event_list); ++ INIT_LIST_HEAD(&ioc->raid_device_list); ++ INIT_LIST_HEAD(&ioc->sas_hba.sas_port_list); ++ ++ /* init shost parameters */ ++ shost->max_cmd_len = 16; ++ shost->max_lun = max_lun; ++ shost->transportt = mpt2sas_transport_template; ++ shost->unique_id = ioc->id; ++ ++ if ((scsi_add_host(shost, &pdev->dev))) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ list_del(&ioc->list); ++ goto out_add_shost_fail; ++ } ++ ++#if defined(EEDP_SUPPORT) ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)) ++ scsi_host_set_prot(shost, SHOST_DIF_TYPE1_PROTECTION ++ | SHOST_DIF_TYPE3_PROTECTION); ++ scsi_host_set_guard(shost, SHOST_DIX_GUARD_CRC); ++#endif ++#endif ++ ++ /* event thread */ ++ snprintf(ioc->firmware_event_name, sizeof(ioc->firmware_event_name), ++ "fw_event%d", ioc->id); ++ ioc->firmware_event_thread = create_singlethread_workqueue( ++ ioc->firmware_event_name); ++ if (!ioc->firmware_event_thread) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ goto out_thread_fail; ++ } ++ ++ ioc->wait_for_port_enable_to_complete = 1; ++ if ((mpt2sas_base_attach(ioc))) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ goto out_attach_fail; ++ } ++ ++ ioc->wait_for_port_enable_to_complete = 0; ++ _scsih_probe_devices(ioc); ++ return 0; ++ ++ out_attach_fail: ++ destroy_workqueue(ioc->firmware_event_thread); ++ out_thread_fail: ++ list_del(&ioc->list); ++ scsi_remove_host(shost); ++ out_add_shost_fail: ++ return -ENODEV; ++} ++ ++#ifdef CONFIG_PM ++/** ++ * _scsih_suspend - power management suspend main entry point ++ * @pdev: PCI device struct ++ * @state: PM state change to (usually PCI_D3) ++ * ++ * Returns 0 success, anything else error. ++ */ ++static int ++_scsih_suspend(struct pci_dev *pdev, pm_message_t state) ++{ ++ struct Scsi_Host *shost = pci_get_drvdata(pdev); ++ struct MPT2SAS_ADAPTER *ioc = shost_private(shost); ++ u32 device_state; ++ ++ flush_scheduled_work(); ++ scsi_block_requests(shost); ++ device_state = pci_choose_state(pdev, state); ++ printk(MPT2SAS_INFO_FMT "pdev=0x%p, slot=%s, entering " ++ "operating state [D%d]\n", ioc->name, pdev, ++ pci_name(pdev), device_state); ++ ++ mpt2sas_base_free_resources(ioc); ++ pci_save_state(pdev); ++ pci_disable_device(pdev); ++ pci_set_power_state(pdev, device_state); ++ return 0; ++} ++ ++/** ++ * _scsih_resume - power management resume main entry point ++ * @pdev: PCI device struct ++ * ++ * Returns 0 success, anything else error. ++ */ ++static int ++_scsih_resume(struct pci_dev *pdev) ++{ ++ struct Scsi_Host *shost = pci_get_drvdata(pdev); ++ struct MPT2SAS_ADAPTER *ioc = shost_private(shost); ++ u32 device_state = pdev->current_state; ++ int r; ++ ++ printk(MPT2SAS_INFO_FMT "pdev=0x%p, slot=%s, previous " ++ "operating state [D%d]\n", ioc->name, pdev, ++ pci_name(pdev), device_state); ++ ++ pci_set_power_state(pdev, PCI_D0); ++ pci_enable_wake(pdev, PCI_D0, 0); ++ pci_restore_state(pdev); ++ ioc->pdev = pdev; ++ r = mpt2sas_base_map_resources(ioc); ++ if (r) ++ return r; ++ ++ mpt2sas_base_hard_reset_handler(ioc, CAN_SLEEP, SOFT_RESET); ++ scsi_unblock_requests(shost); ++ return 0; ++} ++#endif /* CONFIG_PM */ ++ ++ ++static struct pci_driver scsih_driver = { ++ .name = MPT2SAS_DRIVER_NAME, ++ .id_table = scsih_pci_table, ++ .probe = _scsih_probe, ++ .remove = __devexit_p(_scsih_remove), ++#ifdef CONFIG_PM ++ .suspend = _scsih_suspend, ++ .resume = _scsih_resume, ++#endif ++}; ++ ++ ++/** ++ * _scsih_init - main entry point for this driver. ++ * ++ * Returns 0 success, anything else error. ++ */ ++static int __init ++_scsih_init(void) ++{ ++ int error; ++ ++ mpt_ids = 0; ++ ++ printk(KERN_INFO "%s version %s loaded\n", MPT2SAS_DRIVER_NAME, ++ MPT2SAS_DRIVER_VERSION); ++ ++ mpt2sas_transport_template = ++ sas_attach_transport(&mpt2sas_transport_functions); ++ if (!mpt2sas_transport_template) ++ return -ENODEV; ++ ++ mpt2sas_base_initialize_callback_handler(); ++ ++ /* queuecommand callback hander */ ++ scsi_io_cb_idx = mpt2sas_base_register_callback_handler(_scsih_io_done); ++ ++ /* task managment callback handler */ ++ tm_cb_idx = mpt2sas_base_register_callback_handler(_scsih_tm_done); ++ ++ /* base internal commands callback handler */ ++ base_cb_idx = mpt2sas_base_register_callback_handler(mpt2sas_base_done); ++ ++ /* transport internal commands callback handler */ ++ transport_cb_idx = mpt2sas_base_register_callback_handler( ++ mpt2sas_transport_done); ++ ++ /* scsih internal commands callback handler */ ++ scsih_cb_idx = mpt2sas_base_register_callback_handler(_scsih_done); ++ ++ /* configuration page API internal commands callback handler */ ++ config_cb_idx = mpt2sas_base_register_callback_handler( ++ mpt2sas_config_done); ++ ++ /* ctl module callback handler */ ++ ctl_cb_idx = mpt2sas_base_register_callback_handler(mpt2sas_ctl_done); ++ ++ mpt2sas_ctl_init(); ++ ++#if defined(TARGET_MODE) ++ mpt2sas_stm_init(); ++#endif ++ ++ error = pci_register_driver(&scsih_driver); ++ if (error) ++ sas_release_transport(mpt2sas_transport_template); ++ ++ return error; ++} ++ ++/** ++ * _scsih_exit - exit point for this driver (when it is a module). ++ * ++ * Returns 0 success, anything else error. ++ */ ++static void __exit ++_scsih_exit(void) ++{ ++ printk(KERN_INFO "mpt2sas version %s unloading\n", ++ MPT2SAS_DRIVER_VERSION); ++ ++ pci_unregister_driver(&scsih_driver); ++ ++ sas_release_transport(mpt2sas_transport_template); ++ mpt2sas_base_release_callback_handler(scsi_io_cb_idx); ++ mpt2sas_base_release_callback_handler(tm_cb_idx); ++ mpt2sas_base_release_callback_handler(base_cb_idx); ++ mpt2sas_base_release_callback_handler(transport_cb_idx); ++ mpt2sas_base_release_callback_handler(scsih_cb_idx); ++ mpt2sas_base_release_callback_handler(config_cb_idx); ++ mpt2sas_base_release_callback_handler(ctl_cb_idx); ++ ++#if defined(TARGET_MODE) ++ mpt2sas_stm_exit(); ++#endif ++ mpt2sas_ctl_exit(); ++} ++ ++module_init(_scsih_init); ++module_exit(_scsih_exit); +diff -r e02b4006a7c8 drivers/scsi/mpt2sas/mpt2sas_transport.c +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/scsi/mpt2sas/mpt2sas_transport.c Wed Jul 01 09:49:59 2009 +0100 +@@ -0,0 +1,1258 @@ ++/* ++ * SAS Transport Layer for MPT (Message Passing Technology) based controllers ++ * ++ * This code is based on drivers/scsi/mpt2sas/mpt2_transport.c ++ * Copyright (C) 2007-2008 LSI Corporation ++ * (mailto:DL-MPTFusionLinux@lsi.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. ++ * ++ * NO WARRANTY ++ * THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR ++ * CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT ++ * LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, ++ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is ++ * solely responsible for determining the appropriateness of using and ++ * distributing the Program and assumes all risks associated with its ++ * exercise of rights under this Agreement, including but not limited to ++ * the risks and costs of program errors, damage to or loss of data, ++ * programs or equipment, and unavailability or interruption of operations. ++ ++ * DISCLAIMER OF LIABILITY ++ * NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY ++ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ++ * DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), 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 OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED ++ * HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES ++ ++ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, ++ * USA. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "mpt2sas_base.h" ++ ++/** ++ * _transport_sas_node_find_by_handle - sas node search ++ * @ioc: per adapter object ++ * @handle: expander or hba handle (assigned by firmware) ++ * Context: Calling function should acquire ioc->sas_node_lock. ++ * ++ * Search for either hba phys or expander device based on handle, then returns ++ * the sas_node object. ++ */ ++static struct _sas_node * ++_transport_sas_node_find_by_handle(struct MPT2SAS_ADAPTER *ioc, u16 handle) ++{ ++ int i; ++ ++ for (i = 0; i < ioc->sas_hba.num_phys; i++) ++ if (ioc->sas_hba.phy[i].handle == handle) ++ return &ioc->sas_hba; ++ ++ return mpt2sas_scsih_expander_find_by_handle(ioc, handle); ++} ++ ++/** ++ * _transport_convert_phy_link_rate - ++ * @link_rate: link rate returned from mpt firmware ++ * ++ * Convert link_rate from mpi fusion into sas_transport form. ++ */ ++static enum sas_linkrate ++_transport_convert_phy_link_rate(u8 link_rate) ++{ ++ enum sas_linkrate rc; ++ ++ switch (link_rate) { ++ case MPI2_SAS_NEG_LINK_RATE_1_5: ++ rc = SAS_LINK_RATE_1_5_GBPS; ++ break; ++ case MPI2_SAS_NEG_LINK_RATE_3_0: ++ rc = SAS_LINK_RATE_3_0_GBPS; ++ break; ++ case MPI2_SAS_NEG_LINK_RATE_6_0: ++ rc = SAS_LINK_RATE_6_0_GBPS; ++ break; ++ case MPI2_SAS_NEG_LINK_RATE_PHY_DISABLED: ++ rc = SAS_PHY_DISABLED; ++ break; ++ case MPI2_SAS_NEG_LINK_RATE_NEGOTIATION_FAILED: ++ rc = SAS_LINK_RATE_FAILED; ++ break; ++ case MPI2_SAS_NEG_LINK_RATE_PORT_SELECTOR: ++ rc = SAS_SATA_PORT_SELECTOR; ++ break; ++ case MPI2_SAS_NEG_LINK_RATE_SMP_RESET_IN_PROGRESS: ++ /* only supported in SLES10 SP1 kernels, not RHEL5 */ ++/* rc = SAS_PHY_RESET_IN_PROGRESS; ++ * break; ++ */ ++ default: ++ case MPI2_SAS_NEG_LINK_RATE_SATA_OOB_COMPLETE: ++ case MPI2_SAS_NEG_LINK_RATE_UNKNOWN_LINK_RATE: ++ rc = SAS_LINK_RATE_UNKNOWN; ++ break; ++ } ++ return rc; ++} ++ ++/** ++ * _transport_set_identify - set identify for phys and end devices ++ * @ioc: per adapter object ++ * @handle: device handle ++ * @identify: sas identify info ++ * ++ * Populates sas identify info. ++ * ++ * Returns 0 for success, non-zero for failure. ++ */ ++static int ++_transport_set_identify(struct MPT2SAS_ADAPTER *ioc, u16 handle, ++ struct sas_identify *identify) ++{ ++ Mpi2SasDevicePage0_t sas_device_pg0; ++ Mpi2ConfigReply_t mpi_reply; ++ u32 device_info; ++ u32 ioc_status; ++ ++ if (ioc->shost_recovery) { ++ printk(MPT2SAS_INFO_FMT "%s: host reset in progress!\n", ++ __func__, ioc->name); ++ return -EFAULT; ++ } ++ ++ if ((mpt2sas_config_get_sas_device_pg0(ioc, &mpi_reply, &sas_device_pg0, ++ MPI2_SAS_DEVICE_PGAD_FORM_HANDLE, handle))) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ return -ENXIO; ++ } ++ ++ ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & ++ MPI2_IOCSTATUS_MASK; ++ if (ioc_status != MPI2_IOCSTATUS_SUCCESS) { ++ printk(MPT2SAS_ERR_FMT "handle(0x%04x), ioc_status(0x%04x)" ++ "\nfailure at %s:%d/%s()!\n", ioc->name, handle, ioc_status, ++ __FILE__, __LINE__, __func__); ++ return -EIO; ++ } ++ ++ memset(identify, 0, sizeof(identify)); ++ device_info = le32_to_cpu(sas_device_pg0.DeviceInfo); ++ ++ /* sas_address */ ++ identify->sas_address = le64_to_cpu(sas_device_pg0.SASAddress); ++ ++ /* device_type */ ++ switch (device_info & MPI2_SAS_DEVICE_INFO_MASK_DEVICE_TYPE) { ++ case MPI2_SAS_DEVICE_INFO_NO_DEVICE: ++ identify->device_type = SAS_PHY_UNUSED; ++ break; ++ case MPI2_SAS_DEVICE_INFO_END_DEVICE: ++ identify->device_type = SAS_END_DEVICE; ++ break; ++ case MPI2_SAS_DEVICE_INFO_EDGE_EXPANDER: ++ identify->device_type = SAS_EDGE_EXPANDER_DEVICE; ++ break; ++ case MPI2_SAS_DEVICE_INFO_FANOUT_EXPANDER: ++ identify->device_type = SAS_FANOUT_EXPANDER_DEVICE; ++ break; ++ } ++ ++ /* initiator_port_protocols */ ++ if (device_info & MPI2_SAS_DEVICE_INFO_SSP_INITIATOR) ++ identify->initiator_port_protocols |= SAS_PROTOCOL_SSP; ++ if (device_info & MPI2_SAS_DEVICE_INFO_STP_INITIATOR) ++ identify->initiator_port_protocols |= SAS_PROTOCOL_STP; ++ if (device_info & MPI2_SAS_DEVICE_INFO_SMP_INITIATOR) ++ identify->initiator_port_protocols |= SAS_PROTOCOL_SMP; ++ if (device_info & MPI2_SAS_DEVICE_INFO_SATA_HOST) ++ identify->initiator_port_protocols |= SAS_PROTOCOL_SATA; ++ ++ /* target_port_protocols */ ++ if (device_info & MPI2_SAS_DEVICE_INFO_SSP_TARGET) ++ identify->target_port_protocols |= SAS_PROTOCOL_SSP; ++ if (device_info & MPI2_SAS_DEVICE_INFO_STP_TARGET) ++ identify->target_port_protocols |= SAS_PROTOCOL_STP; ++ if (device_info & MPI2_SAS_DEVICE_INFO_SMP_TARGET) ++ identify->target_port_protocols |= SAS_PROTOCOL_SMP; ++ if (device_info & MPI2_SAS_DEVICE_INFO_SATA_DEVICE) ++ identify->target_port_protocols |= SAS_PROTOCOL_SATA; ++ ++ return 0; ++} ++ ++/** ++ * mpt2sas_transport_done - internal transport layer callback handler. ++ * @ioc: per adapter object ++ * @smid: system request message index ++ * @VF_ID: virtual function id ++ * @reply: reply message frame(lower 32bit addr) ++ * ++ * Callback handler when sending internal generated transport cmds. ++ * The callback index passed is `ioc->transport_cb_idx` ++ * ++ * Return nothing. ++ */ ++void ++mpt2sas_transport_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 VF_ID, ++ u32 reply) ++{ ++ MPI2DefaultReply_t *mpi_reply; ++ ++ mpi_reply = mpt2sas_base_get_reply_virt_addr(ioc, reply); ++ if (ioc->transport_cmds.status == MPT2_CMD_NOT_USED) ++ return; ++ if (ioc->transport_cmds.smid != smid) ++ return; ++ ioc->transport_cmds.status |= MPT2_CMD_COMPLETE; ++ if (mpi_reply) { ++ memcpy(ioc->transport_cmds.reply, mpi_reply, ++ mpi_reply->MsgLength*4); ++ ioc->transport_cmds.status |= MPT2_CMD_REPLY_VALID; ++ } ++ ioc->transport_cmds.status &= ~MPT2_CMD_PENDING; ++ complete(&ioc->transport_cmds.done); ++} ++ ++#if defined(MPT_WIDE_PORT_API) ++/* report manufacture request structure */ ++struct rep_manu_request{ ++ u8 smp_frame_type; ++ u8 function; ++ u8 reserved; ++ u8 request_length; ++}; ++ ++/* report manufacture reply structure */ ++struct rep_manu_reply{ ++ u8 smp_frame_type; /* 0x41 */ ++ u8 function; /* 0x01 */ ++ u8 function_result; ++ u8 response_length; ++ u16 expander_change_count; ++ u8 reserved0[2]; ++ u8 sas_format:1; ++ u8 reserved1:7; ++ u8 reserved2[3]; ++ u8 vendor_id[SAS_EXPANDER_VENDOR_ID_LEN]; ++ u8 product_id[SAS_EXPANDER_PRODUCT_ID_LEN]; ++ u8 product_rev[SAS_EXPANDER_PRODUCT_REV_LEN]; ++ u8 component_vendor_id[SAS_EXPANDER_COMPONENT_VENDOR_ID_LEN]; ++ u16 component_id; ++ u8 component_revision_id; ++ u8 reserved3; ++ u8 vendor_specific[8]; ++}; ++ ++/** ++ * transport_expander_report_manufacture - obtain SMP report_manufacture ++ * @ioc: per adapter object ++ * @sas_address: expander sas address ++ * @edev: the sas_expander_device object ++ * ++ * Fills in the sas_expander_device object when SMP port is created. ++ * ++ * Returns 0 for success, non-zero for failure. ++ */ ++static int ++_transport_expander_report_manufacture(struct MPT2SAS_ADAPTER *ioc, ++ u64 sas_address, struct sas_expander_device *edev) ++{ ++ Mpi2SmpPassthroughRequest_t *mpi_request; ++ Mpi2SmpPassthroughReply_t *mpi_reply; ++ struct rep_manu_reply *manufacture_reply; ++ struct rep_manu_request *manufacture_request; ++ int rc; ++ u16 smid; ++ u32 ioc_state; ++ unsigned long timeleft; ++ void *psge; ++ u32 sgl_flags; ++ u8 issue_reset = 0; ++ void *data_out = NULL; ++ dma_addr_t data_out_dma; ++ u32 sz; ++ u64 *sas_address_le; ++ u16 wait_state_count; ++ ++ if (ioc->shost_recovery) { ++ printk(MPT2SAS_INFO_FMT "%s: host reset in progress!\n", ++ __func__, ioc->name); ++ return -EFAULT; ++ } ++ ++ mutex_lock(&ioc->transport_cmds.mutex); ++ ++ if (ioc->transport_cmds.status != MPT2_CMD_NOT_USED) { ++ printk(MPT2SAS_ERR_FMT "%s: transport_cmds in use\n", ++ ioc->name, __func__); ++ rc = -EAGAIN; ++ goto out; ++ } ++ ioc->transport_cmds.status = MPT2_CMD_PENDING; ++ ++ wait_state_count = 0; ++ ioc_state = mpt2sas_base_get_iocstate(ioc, 1); ++ while (ioc_state != MPI2_IOC_STATE_OPERATIONAL) { ++ if (wait_state_count++ == 10) { ++ printk(MPT2SAS_ERR_FMT ++ "%s: failed due to ioc not operational\n", ++ ioc->name, __func__); ++ rc = -EFAULT; ++ goto out; ++ } ++ ssleep(1); ++ ioc_state = mpt2sas_base_get_iocstate(ioc, 1); ++ printk(MPT2SAS_INFO_FMT "%s: waiting for " ++ "operational state(count=%d)\n", ioc->name, ++ __func__, wait_state_count); ++ } ++ if (wait_state_count) ++ printk(MPT2SAS_INFO_FMT "%s: ioc is operational\n", ++ ioc->name, __func__); ++ ++ smid = mpt2sas_base_get_smid(ioc, ioc->transport_cb_idx); ++ if (!smid) { ++ printk(MPT2SAS_ERR_FMT "%s: failed obtaining a smid\n", ++ ioc->name, __func__); ++ rc = -EAGAIN; ++ goto out; ++ } ++ ++ rc = 0; ++ mpi_request = mpt2sas_base_get_msg_frame(ioc, smid); ++ ioc->transport_cmds.smid = smid; ++ ++ sz = sizeof(struct rep_manu_request) + sizeof(struct rep_manu_reply); ++ data_out = pci_alloc_consistent(ioc->pdev, sz, &data_out_dma); ++ ++ if (!data_out) { ++ printk(KERN_ERR "failure at %s:%d/%s()!\n", __FILE__, ++ __LINE__, __func__); ++ rc = -ENOMEM; ++ mpt2sas_base_free_smid(ioc, smid); ++ goto out; ++ } ++ ++ manufacture_request = data_out; ++ manufacture_request->smp_frame_type = 0x40; ++ manufacture_request->function = 1; ++ manufacture_request->reserved = 0; ++ manufacture_request->request_length = 0; ++ ++ memset(mpi_request, 0, sizeof(Mpi2SmpPassthroughRequest_t)); ++ mpi_request->Function = MPI2_FUNCTION_SMP_PASSTHROUGH; ++ mpi_request->PhysicalPort = 0xFF; ++ sas_address_le = (u64 *)&mpi_request->SASAddress; ++ *sas_address_le = cpu_to_le64(sas_address); ++ mpi_request->RequestDataLength = sizeof(struct rep_manu_request); ++ psge = &mpi_request->SGL; ++ ++ /* WRITE sgel first */ ++ sgl_flags = (MPI2_SGE_FLAGS_SIMPLE_ELEMENT | ++ MPI2_SGE_FLAGS_END_OF_BUFFER | MPI2_SGE_FLAGS_HOST_TO_IOC); ++ sgl_flags = sgl_flags << MPI2_SGE_FLAGS_SHIFT; ++ ioc->base_add_sg_single(psge, sgl_flags | ++ sizeof(struct rep_manu_request), data_out_dma); ++ ++ /* incr sgel */ ++ psge += ioc->sge_size; ++ ++ /* READ sgel last */ ++ sgl_flags = (MPI2_SGE_FLAGS_SIMPLE_ELEMENT | ++ MPI2_SGE_FLAGS_LAST_ELEMENT | MPI2_SGE_FLAGS_END_OF_BUFFER | ++ MPI2_SGE_FLAGS_END_OF_LIST); ++ sgl_flags = sgl_flags << MPI2_SGE_FLAGS_SHIFT; ++ ioc->base_add_sg_single(psge, sgl_flags | ++ sizeof(struct rep_manu_reply), data_out_dma + ++ sizeof(struct rep_manu_request)); ++ ++ dtransportprintk(ioc, printk(MPT2SAS_DEBUG_FMT "report_manufacture - " ++ "send to sas_addr(0x%016llx)\n", ioc->name, ++ (unsigned long long)sas_address)); ++ mpt2sas_base_put_smid_default(ioc, smid, 0 /* VF_ID */); ++ timeleft = wait_for_completion_timeout(&ioc->transport_cmds.done, ++ 10*HZ); ++ ++ if (!(ioc->transport_cmds.status & MPT2_CMD_COMPLETE)) { ++ printk(MPT2SAS_ERR_FMT "%s: timeout\n", ++ ioc->name, __func__); ++ _debug_dump_mf(mpi_request, ++ sizeof(Mpi2SmpPassthroughRequest_t)/4); ++ if (!(ioc->transport_cmds.status & MPT2_CMD_RESET)) ++ issue_reset = 1; ++ goto issue_host_reset; ++ } ++ ++ dtransportprintk(ioc, printk(MPT2SAS_DEBUG_FMT "report_manufacture - " ++ "complete\n", ioc->name)); ++ ++ if (ioc->transport_cmds.status & MPT2_CMD_REPLY_VALID) { ++ u8 *tmp; ++ ++ mpi_reply = ioc->transport_cmds.reply; ++ ++ dtransportprintk(ioc, printk(MPT2SAS_DEBUG_FMT ++ "report_manufacture - reply data transfer size(%d)\n", ++ ioc->name, le16_to_cpu(mpi_reply->ResponseDataLength))); ++ ++ if (le16_to_cpu(mpi_reply->ResponseDataLength) != ++ sizeof(struct rep_manu_reply)) ++ goto out; ++ ++ manufacture_reply = data_out + sizeof(struct rep_manu_request); ++ strncpy(edev->vendor_id, manufacture_reply->vendor_id, ++ SAS_EXPANDER_VENDOR_ID_LEN); ++ strncpy(edev->product_id, manufacture_reply->product_id, ++ SAS_EXPANDER_PRODUCT_ID_LEN); ++ strncpy(edev->product_rev, manufacture_reply->product_rev, ++ SAS_EXPANDER_PRODUCT_REV_LEN); ++ edev->level = manufacture_reply->sas_format; ++ if (manufacture_reply->sas_format) { ++ strncpy(edev->component_vendor_id, ++ manufacture_reply->component_vendor_id, ++ SAS_EXPANDER_COMPONENT_VENDOR_ID_LEN); ++ tmp = (u8 *)&manufacture_reply->component_id; ++ edev->component_id = tmp[0] << 8 | tmp[1]; ++ edev->component_revision_id = ++ manufacture_reply->component_revision_id; ++ } ++ } else ++ dtransportprintk(ioc, printk(MPT2SAS_DEBUG_FMT ++ "report_manufacture - no reply\n", ioc->name)); ++ ++ issue_host_reset: ++ if (issue_reset) ++ mpt2sas_base_hard_reset_handler(ioc, CAN_SLEEP, ++ FORCE_BIG_HAMMER); ++ out: ++ ioc->transport_cmds.status = MPT2_CMD_NOT_USED; ++ if (data_out) ++ pci_free_consistent(ioc->pdev, sz, data_out, data_out_dma); ++ ++ mutex_unlock(&ioc->transport_cmds.mutex); ++ return rc; ++} ++#endif ++ ++/** ++ * mpt2sas_transport_port_add - insert port to the list ++ * @ioc: per adapter object ++ * @handle: handle of attached device ++ * @parent_handle: parent handle(either hba or expander) ++ * Context: This function will acquire ioc->sas_node_lock. ++ * ++ * Adding new port object to the sas_node->sas_port_list. ++ * ++ * Returns mpt2sas_port. ++ */ ++struct _sas_port * ++mpt2sas_transport_port_add(struct MPT2SAS_ADAPTER *ioc, u16 handle, ++ u16 parent_handle) ++{ ++ struct _sas_phy *mpt2sas_phy, *next; ++ struct _sas_port *mpt2sas_port; ++ unsigned long flags; ++ struct _sas_node *sas_node; ++ struct sas_rphy *rphy; ++ int i; ++#if defined(MPT_WIDE_PORT_API) ++ struct sas_port *port; ++#endif ++ ++ if (!parent_handle) ++ return NULL; ++ ++ mpt2sas_port = kzalloc(sizeof(struct _sas_port), ++ GFP_KERNEL); ++ if (!mpt2sas_port) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ return NULL; ++ } ++ ++ INIT_LIST_HEAD(&mpt2sas_port->port_list); ++ INIT_LIST_HEAD(&mpt2sas_port->phy_list); ++ spin_lock_irqsave(&ioc->sas_node_lock, flags); ++ sas_node = _transport_sas_node_find_by_handle(ioc, parent_handle); ++ spin_unlock_irqrestore(&ioc->sas_node_lock, flags); ++ ++ if (!sas_node) { ++ printk(MPT2SAS_ERR_FMT "%s: Could not find parent(0x%04x)!\n", ++ ioc->name, __func__, parent_handle); ++ goto out_fail; ++ } ++ ++ mpt2sas_port->handle = parent_handle; ++ mpt2sas_port->sas_address = sas_node->sas_address; ++ if ((_transport_set_identify(ioc, handle, ++ &mpt2sas_port->remote_identify))) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ goto out_fail; ++ } ++ ++ if (mpt2sas_port->remote_identify.device_type == SAS_PHY_UNUSED) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ goto out_fail; ++ } ++ ++ for (i = 0; i < sas_node->num_phys; i++) { ++ if (sas_node->phy[i].remote_identify.sas_address != ++ mpt2sas_port->remote_identify.sas_address) ++ continue; ++ list_add_tail(&sas_node->phy[i].port_siblings, ++ &mpt2sas_port->phy_list); ++ mpt2sas_port->num_phys++; ++ } ++ ++ if (!mpt2sas_port->num_phys) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ goto out_fail; ++ } ++ ++#if defined(MPT_WIDE_PORT_API) ++ port = sas_port_alloc_num(sas_node->parent_dev); ++ if ((sas_port_add(port))) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ goto out_fail; ++ } ++ ++ list_for_each_entry(mpt2sas_phy, &mpt2sas_port->phy_list, ++ port_siblings) { ++ if ((ioc->logging_level & MPT_DEBUG_TRANSPORT)) ++ dev_printk(KERN_INFO, &port->dev, "add: handle(0x%04x)" ++ ", sas_addr(0x%016llx), phy(%d)\n", handle, ++ (unsigned long long) ++ mpt2sas_port->remote_identify.sas_address, ++ mpt2sas_phy->phy_id); ++ sas_port_add_phy(port, mpt2sas_phy->phy); ++ } ++ ++ mpt2sas_port->port = port; ++ if (mpt2sas_port->remote_identify.device_type == SAS_END_DEVICE) ++ rphy = sas_end_device_alloc(port); ++ else ++ rphy = sas_expander_alloc(port, ++ mpt2sas_port->remote_identify.device_type); ++#else ++ mpt2sas_phy = list_entry(mpt2sas_port->phy_list.next, struct _sas_phy, ++ port_siblings); ++ if (mpt2sas_port->remote_identify.device_type == SAS_END_DEVICE) ++ rphy = sas_end_device_alloc(mpt2sas_phy->phy); ++ else ++ rphy = sas_expander_alloc(mpt2sas_phy->phy, ++ mpt2sas_port->remote_identify.device_type); ++#endif ++ rphy->identify = mpt2sas_port->remote_identify; ++ if ((sas_rphy_add(rphy))) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ } ++ if ((ioc->logging_level & MPT_DEBUG_TRANSPORT)) ++ dev_printk(KERN_INFO, &rphy->dev, "add: handle(0x%04x), " ++ "sas_addr(0x%016llx)\n", handle, ++ (unsigned long long) ++ mpt2sas_port->remote_identify.sas_address); ++ mpt2sas_port->rphy = rphy; ++ spin_lock_irqsave(&ioc->sas_node_lock, flags); ++ list_add_tail(&mpt2sas_port->port_list, &sas_node->sas_port_list); ++ spin_unlock_irqrestore(&ioc->sas_node_lock, flags); ++ ++#if defined(MPT_WIDE_PORT_API) ++ /* fill in report manufacture */ ++ if (mpt2sas_port->remote_identify.device_type == ++ MPI2_SAS_DEVICE_INFO_EDGE_EXPANDER || ++ mpt2sas_port->remote_identify.device_type == ++ MPI2_SAS_DEVICE_INFO_FANOUT_EXPANDER) ++ _transport_expander_report_manufacture(ioc, ++ mpt2sas_port->remote_identify.sas_address, ++ rphy_to_expander_device(rphy)); ++#endif ++ return mpt2sas_port; ++ ++ out_fail: ++ list_for_each_entry_safe(mpt2sas_phy, next, &mpt2sas_port->phy_list, ++ port_siblings) ++ list_del(&mpt2sas_phy->port_siblings); ++ kfree(mpt2sas_port); ++ return NULL; ++} ++ ++/** ++ * mpt2sas_transport_port_remove - remove port from the list ++ * @ioc: per adapter object ++ * @sas_address: sas address of attached device ++ * @parent_handle: handle to the upstream parent(either hba or expander) ++ * Context: This function will acquire ioc->sas_node_lock. ++ * ++ * Removing object and freeing associated memory from the ++ * ioc->sas_port_list. ++ * ++ * Return nothing. ++ */ ++void ++mpt2sas_transport_port_remove(struct MPT2SAS_ADAPTER *ioc, u64 sas_address, ++ u16 parent_handle) ++{ ++ int i; ++ unsigned long flags; ++ struct _sas_port *mpt2sas_port, *next; ++ struct _sas_node *sas_node; ++ u8 found = 0; ++#if defined(MPT_WIDE_PORT_API) ++ struct _sas_phy *mpt2sas_phy, *next_phy; ++#endif ++ ++ spin_lock_irqsave(&ioc->sas_node_lock, flags); ++ sas_node = _transport_sas_node_find_by_handle(ioc, parent_handle); ++ spin_unlock_irqrestore(&ioc->sas_node_lock, flags); ++ if (!sas_node) ++ return; ++ list_for_each_entry_safe(mpt2sas_port, next, &sas_node->sas_port_list, ++ port_list) { ++ if (mpt2sas_port->remote_identify.sas_address != sas_address) ++ continue; ++ found = 1; ++ list_del(&mpt2sas_port->port_list); ++ goto out; ++ } ++ out: ++ if (!found) ++ return; ++ ++ for (i = 0; i < sas_node->num_phys; i++) { ++ if (sas_node->phy[i].remote_identify.sas_address == sas_address) ++ memset(&sas_node->phy[i].remote_identify, 0 , ++ sizeof(struct sas_identify)); ++ } ++ ++#if defined(MPT_WIDE_PORT_API) ++ list_for_each_entry_safe(mpt2sas_phy, next_phy, ++ &mpt2sas_port->phy_list, port_siblings) { ++ if ((ioc->logging_level & MPT_DEBUG_TRANSPORT)) ++ dev_printk(KERN_INFO, &mpt2sas_port->port->dev, ++ "remove: parent_handle(0x%04x), " ++ "sas_addr(0x%016llx), phy(%d)\n", parent_handle, ++ (unsigned long long) ++ mpt2sas_port->remote_identify.sas_address, ++ mpt2sas_phy->phy_id); ++ sas_port_delete_phy(mpt2sas_port->port, mpt2sas_phy->phy); ++ list_del(&mpt2sas_phy->port_siblings); ++ } ++ sas_port_delete(mpt2sas_port->port); ++#else ++ if ((ioc->logging_level & MPT_DEBUG_TRANSPORT)) ++ dev_printk(KERN_INFO, &mpt2sas_port->rphy->dev, ++ "remove: parent_handle(0x%04x), sas_addr(0x%016llx)\n", ++ parent_handle, ++ (unsigned long long)sas_address); ++ sas_rphy_delete(mpt2sas_port->rphy); ++#endif ++ kfree(mpt2sas_port); ++} ++ ++/** ++ * mpt2sas_transport_add_host_phy - report sas_host phy to transport ++ * @ioc: per adapter object ++ * @mpt2sas_phy: mpt2sas per phy object ++ * @phy_pg0: sas phy page 0 ++ * @parent_dev: parent device class object ++ * ++ * Returns 0 for success, non-zero for failure. ++ */ ++int ++mpt2sas_transport_add_host_phy(struct MPT2SAS_ADAPTER *ioc, struct _sas_phy ++ *mpt2sas_phy, Mpi2SasPhyPage0_t phy_pg0, struct device *parent_dev) ++{ ++ struct sas_phy *phy; ++ int phy_index = mpt2sas_phy->phy_id; ++ ++ ++ INIT_LIST_HEAD(&mpt2sas_phy->port_siblings); ++ phy = sas_phy_alloc(parent_dev, phy_index); ++ if (!phy) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ return -1; ++ } ++ if ((_transport_set_identify(ioc, mpt2sas_phy->handle, ++ &mpt2sas_phy->identify))) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ return -1; ++ } ++ phy->identify = mpt2sas_phy->identify; ++ mpt2sas_phy->attached_handle = le16_to_cpu(phy_pg0.AttachedDevHandle); ++ if (mpt2sas_phy->attached_handle) ++ _transport_set_identify(ioc, mpt2sas_phy->attached_handle, ++ &mpt2sas_phy->remote_identify); ++ phy->identify.phy_identifier = mpt2sas_phy->phy_id; ++ phy->negotiated_linkrate = _transport_convert_phy_link_rate( ++ phy_pg0.NegotiatedLinkRate & MPI2_SAS_NEG_LINK_RATE_MASK_PHYSICAL); ++ phy->minimum_linkrate_hw = _transport_convert_phy_link_rate( ++ phy_pg0.HwLinkRate & MPI2_SAS_HWRATE_MIN_RATE_MASK); ++ phy->maximum_linkrate_hw = _transport_convert_phy_link_rate( ++ phy_pg0.HwLinkRate >> 4); ++ phy->minimum_linkrate = _transport_convert_phy_link_rate( ++ phy_pg0.ProgrammedLinkRate & MPI2_SAS_PRATE_MIN_RATE_MASK); ++ phy->maximum_linkrate = _transport_convert_phy_link_rate( ++ phy_pg0.ProgrammedLinkRate >> 4); ++ ++#if !defined(MPT_WIDE_PORT_API_PLUS) ++ phy->local_attached = 1; ++#endif ++#if !defined(MPT_WIDE_PORT_API) ++ phy->port_identifier = phy_index; ++#endif ++ ++ if ((sas_phy_add(phy))) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ sas_phy_free(phy); ++ return -1; ++ } ++ if ((ioc->logging_level & MPT_DEBUG_TRANSPORT)) ++ dev_printk(KERN_INFO, &phy->dev, ++ "add: handle(0x%04x), sas_addr(0x%016llx)\n" ++ "\tattached_handle(0x%04x), sas_addr(0x%016llx)\n", ++ mpt2sas_phy->handle, (unsigned long long) ++ mpt2sas_phy->identify.sas_address, ++ mpt2sas_phy->attached_handle, ++ (unsigned long long) ++ mpt2sas_phy->remote_identify.sas_address); ++ mpt2sas_phy->phy = phy; ++ return 0; ++} ++ ++ ++/** ++ * mpt2sas_transport_add_expander_phy - report expander phy to transport ++ * @ioc: per adapter object ++ * @mpt2sas_phy: mpt2sas per phy object ++ * @expander_pg1: expander page 1 ++ * @parent_dev: parent device class object ++ * ++ * Returns 0 for success, non-zero for failure. ++ */ ++int ++mpt2sas_transport_add_expander_phy(struct MPT2SAS_ADAPTER *ioc, struct _sas_phy ++ *mpt2sas_phy, Mpi2ExpanderPage1_t expander_pg1, struct device *parent_dev) ++{ ++ struct sas_phy *phy; ++ int phy_index = mpt2sas_phy->phy_id; ++ ++ INIT_LIST_HEAD(&mpt2sas_phy->port_siblings); ++ phy = sas_phy_alloc(parent_dev, phy_index); ++ if (!phy) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ return -1; ++ } ++ if ((_transport_set_identify(ioc, mpt2sas_phy->handle, ++ &mpt2sas_phy->identify))) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ return -1; ++ } ++ phy->identify = mpt2sas_phy->identify; ++ mpt2sas_phy->attached_handle = ++ le16_to_cpu(expander_pg1.AttachedDevHandle); ++ if (mpt2sas_phy->attached_handle) ++ _transport_set_identify(ioc, mpt2sas_phy->attached_handle, ++ &mpt2sas_phy->remote_identify); ++ phy->identify.phy_identifier = mpt2sas_phy->phy_id; ++ phy->negotiated_linkrate = _transport_convert_phy_link_rate( ++ expander_pg1.NegotiatedLinkRate & ++ MPI2_SAS_NEG_LINK_RATE_MASK_PHYSICAL); ++ phy->minimum_linkrate_hw = _transport_convert_phy_link_rate( ++ expander_pg1.HwLinkRate & MPI2_SAS_HWRATE_MIN_RATE_MASK); ++ phy->maximum_linkrate_hw = _transport_convert_phy_link_rate( ++ expander_pg1.HwLinkRate >> 4); ++ phy->minimum_linkrate = _transport_convert_phy_link_rate( ++ expander_pg1.ProgrammedLinkRate & MPI2_SAS_PRATE_MIN_RATE_MASK); ++ phy->maximum_linkrate = _transport_convert_phy_link_rate( ++ expander_pg1.ProgrammedLinkRate >> 4); ++ ++#if !defined(MPT_WIDE_PORT_API) ++ phy->port_identifier = phy_index; ++#endif ++ ++ if ((sas_phy_add(phy))) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ sas_phy_free(phy); ++ return -1; ++ } ++ if ((ioc->logging_level & MPT_DEBUG_TRANSPORT)) ++ dev_printk(KERN_INFO, &phy->dev, ++ "add: handle(0x%04x), sas_addr(0x%016llx)\n" ++ "\tattached_handle(0x%04x), sas_addr(0x%016llx)\n", ++ mpt2sas_phy->handle, (unsigned long long) ++ mpt2sas_phy->identify.sas_address, ++ mpt2sas_phy->attached_handle, ++ (unsigned long long) ++ mpt2sas_phy->remote_identify.sas_address); ++ mpt2sas_phy->phy = phy; ++ return 0; ++} ++ ++/** ++ * mpt2sas_transport_update_links - refreshing phy link changes ++ * @ioc: per adapter object ++ * @handle: handle to sas_host or expander ++ * @attached_handle: attached device handle ++ * @phy_numberv: phy number ++ * @link_rate: new link rate ++ * ++ * Returns nothing. ++ */ ++void ++mpt2sas_transport_update_links(struct MPT2SAS_ADAPTER *ioc, ++ u16 handle, u16 attached_handle, u8 phy_number, u8 link_rate) ++{ ++ unsigned long flags; ++ struct _sas_node *sas_node; ++ struct _sas_phy *mpt2sas_phy; ++ ++ if (ioc->shost_recovery) { ++ printk(MPT2SAS_INFO_FMT "%s: host reset in progress!\n", ++ __func__, ioc->name); ++ return; ++ } ++ ++ spin_lock_irqsave(&ioc->sas_node_lock, flags); ++ sas_node = _transport_sas_node_find_by_handle(ioc, handle); ++ spin_unlock_irqrestore(&ioc->sas_node_lock, flags); ++ if (!sas_node) ++ return; ++ ++ mpt2sas_phy = &sas_node->phy[phy_number]; ++ mpt2sas_phy->attached_handle = attached_handle; ++ if (attached_handle && (link_rate >= MPI2_SAS_NEG_LINK_RATE_1_5)) ++ _transport_set_identify(ioc, mpt2sas_phy->attached_handle, ++ &mpt2sas_phy->remote_identify); ++ else ++ memset(&mpt2sas_phy->remote_identify, 0 , sizeof(struct ++ sas_identify)); ++ ++ if (mpt2sas_phy->phy) ++ mpt2sas_phy->phy->negotiated_linkrate = ++ _transport_convert_phy_link_rate(link_rate); ++ ++ if ((ioc->logging_level & MPT_DEBUG_TRANSPORT)) ++ dev_printk(KERN_INFO, &mpt2sas_phy->phy->dev, ++ "refresh: handle(0x%04x), sas_addr(0x%016llx),\n" ++ "\tlink_rate(0x%02x), phy(%d)\n" ++ "\tattached_handle(0x%04x), sas_addr(0x%016llx)\n", ++ handle, (unsigned long long) ++ mpt2sas_phy->identify.sas_address, link_rate, ++ phy_number, attached_handle, ++ (unsigned long long) ++ mpt2sas_phy->remote_identify.sas_address); ++} ++ ++static inline void * ++phy_to_ioc(struct sas_phy *phy) ++{ ++ struct Scsi_Host *shost = dev_to_shost(phy->dev.parent); ++ return shost_private(shost); ++} ++ ++static inline void * ++rphy_to_ioc(struct sas_rphy *rphy) ++{ ++ struct Scsi_Host *shost = dev_to_shost(rphy->dev.parent->parent); ++ return shost_private(shost); ++} ++ ++/** ++ * _transport_get_linkerrors - ++ * @phy: The sas phy object ++ * ++ * Only support sas_host direct attached phys. ++ * Returns 0 for success, non-zero for failure. ++ * ++ */ ++static int ++_transport_get_linkerrors(struct sas_phy *phy) ++{ ++ struct MPT2SAS_ADAPTER *ioc = phy_to_ioc(phy); ++ struct _sas_phy *mpt2sas_phy; ++ Mpi2ConfigReply_t mpi_reply; ++ Mpi2SasPhyPage1_t phy_pg1; ++ int i; ++ ++ for (i = 0, mpt2sas_phy = NULL; i < ioc->sas_hba.num_phys && ++ !mpt2sas_phy; i++) { ++ if (ioc->sas_hba.phy[i].phy != phy) ++ continue; ++ mpt2sas_phy = &ioc->sas_hba.phy[i]; ++ } ++ ++ if (!mpt2sas_phy) /* this phy not on sas_host */ ++ return -EINVAL; ++ ++ if ((mpt2sas_config_get_phy_pg1(ioc, &mpi_reply, &phy_pg1, ++ mpt2sas_phy->phy_id))) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ return -ENXIO; ++ } ++ ++ if (mpi_reply.IOCStatus || mpi_reply.IOCLogInfo) ++ printk(MPT2SAS_INFO_FMT "phy(%d), ioc_status" ++ "(0x%04x), loginfo(0x%08x)\n", ioc->name, ++ mpt2sas_phy->phy_id, ++ le16_to_cpu(mpi_reply.IOCStatus), ++ le32_to_cpu(mpi_reply.IOCLogInfo)); ++ ++ phy->invalid_dword_count = le32_to_cpu(phy_pg1.InvalidDwordCount); ++ phy->running_disparity_error_count = ++ le32_to_cpu(phy_pg1.RunningDisparityErrorCount); ++ phy->loss_of_dword_sync_count = ++ le32_to_cpu(phy_pg1.LossDwordSynchCount); ++ phy->phy_reset_problem_count = ++ le32_to_cpu(phy_pg1.PhyResetProblemCount); ++ return 0; ++} ++ ++/** ++ * _transport_get_enclosure_identifier - ++ * @phy: The sas phy object ++ * ++ * Obtain the enclosure logical id for an expander. ++ * Returns 0 for success, non-zero for failure. ++ */ ++static int ++_transport_get_enclosure_identifier(struct sas_rphy *rphy, u64 *identifier) ++{ ++ struct MPT2SAS_ADAPTER *ioc = rphy_to_ioc(rphy); ++ struct _sas_node *sas_expander; ++ unsigned long flags; ++ ++ spin_lock_irqsave(&ioc->sas_node_lock, flags); ++ sas_expander = mpt2sas_scsih_expander_find_by_sas_address(ioc, ++ rphy->identify.sas_address); ++ spin_unlock_irqrestore(&ioc->sas_node_lock, flags); ++ ++ if (!sas_expander) ++ return -ENXIO; ++ ++ *identifier = sas_expander->enclosure_logical_id; ++ return 0; ++} ++ ++/** ++ * _transport_get_bay_identifier - ++ * @phy: The sas phy object ++ * ++ * Returns the slot id for a device that resides inside an enclosure. ++ */ ++static int ++_transport_get_bay_identifier(struct sas_rphy *rphy) ++{ ++ struct MPT2SAS_ADAPTER *ioc = rphy_to_ioc(rphy); ++ struct _sas_device *sas_device; ++ unsigned long flags; ++ ++ spin_lock_irqsave(&ioc->sas_device_lock, flags); ++ sas_device = mpt2sas_scsih_sas_device_find_by_sas_address(ioc, ++ rphy->identify.sas_address); ++ spin_unlock_irqrestore(&ioc->sas_device_lock, flags); ++ ++ if (!sas_device) ++ return -ENXIO; ++ ++ return sas_device->slot; ++} ++ ++/** ++ * _transport_phy_reset - ++ * @phy: The sas phy object ++ * @hard_reset: ++ * ++ * Only support sas_host direct attached phys. ++ * Returns 0 for success, non-zero for failure. ++ */ ++static int ++_transport_phy_reset(struct sas_phy *phy, int hard_reset) ++{ ++ struct MPT2SAS_ADAPTER *ioc = phy_to_ioc(phy); ++ struct _sas_phy *mpt2sas_phy; ++ Mpi2SasIoUnitControlReply_t mpi_reply; ++ Mpi2SasIoUnitControlRequest_t mpi_request; ++ int i; ++ ++ for (i = 0, mpt2sas_phy = NULL; i < ioc->sas_hba.num_phys && ++ !mpt2sas_phy; i++) { ++ if (ioc->sas_hba.phy[i].phy != phy) ++ continue; ++ mpt2sas_phy = &ioc->sas_hba.phy[i]; ++ } ++ ++ if (!mpt2sas_phy) /* this phy not on sas_host */ ++ return -EINVAL; ++ ++ memset(&mpi_request, 0, sizeof(Mpi2SasIoUnitControlReply_t)); ++ mpi_request.Function = MPI2_FUNCTION_SAS_IO_UNIT_CONTROL; ++ mpi_request.Operation = hard_reset ? ++ MPI2_SAS_OP_PHY_HARD_RESET : MPI2_SAS_OP_PHY_LINK_RESET; ++ mpi_request.PhyNum = mpt2sas_phy->phy_id; ++ ++ if ((mpt2sas_base_sas_iounit_control(ioc, &mpi_reply, &mpi_request))) { ++ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ return -ENXIO; ++ } ++ ++ if (mpi_reply.IOCStatus || mpi_reply.IOCLogInfo) ++ printk(MPT2SAS_INFO_FMT "phy(%d), ioc_status" ++ "(0x%04x), loginfo(0x%08x)\n", ioc->name, ++ mpt2sas_phy->phy_id, ++ le16_to_cpu(mpi_reply.IOCStatus), ++ le32_to_cpu(mpi_reply.IOCLogInfo)); ++ ++ return 0; ++} ++ ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)) ++/** ++ * _transport_smp_handler - transport portal for smp passthru ++ * @shost: shost object ++ * @rphy: sas transport rphy object ++ * @req: ++ * ++ * This used primarily for smp_utils. ++ * Example: ++ * smp_rep_general /sys/class/bsg/expander-5:0 ++ */ ++static int ++_transport_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy, ++ struct request *req) ++{ ++ struct MPT2SAS_ADAPTER *ioc = shost_private(shost); ++ Mpi2SmpPassthroughRequest_t *mpi_request; ++ Mpi2SmpPassthroughReply_t *mpi_reply; ++ int rc; ++ u16 smid; ++ u32 ioc_state; ++ unsigned long timeleft; ++ void *psge; ++ u32 sgl_flags; ++ u8 issue_reset = 0; ++ dma_addr_t dma_addr_in = 0; ++ dma_addr_t dma_addr_out = 0; ++ u16 wait_state_count; ++ struct request *rsp = req->next_rq; ++ ++ if (!rsp) { ++ printk(MPT2SAS_ERR_FMT "%s: the smp response space is " ++ "missing\n", ioc->name, __func__); ++ return -EINVAL; ++ } ++ ++ /* do we need to support multiple segments? */ ++ if (req->bio->bi_vcnt > 1 || rsp->bio->bi_vcnt > 1) { ++ printk(MPT2SAS_ERR_FMT "%s: multiple segments req %u %u, " ++ "rsp %u %u\n", ioc->name, __func__, req->bio->bi_vcnt, ++ req->data_len, rsp->bio->bi_vcnt, rsp->data_len); ++ return -EINVAL; ++ } ++ ++ if (ioc->shost_recovery) { ++ printk(MPT2SAS_INFO_FMT "%s: host reset in progress!\n", ++ __func__, ioc->name); ++ return -EFAULT; ++ } ++ ++ rc = mutex_lock_interruptible(&ioc->transport_cmds.mutex); ++ if (rc) ++ return rc; ++ ++ if (ioc->transport_cmds.status != MPT2_CMD_NOT_USED) { ++ printk(MPT2SAS_ERR_FMT "%s: transport_cmds in use\n", ioc->name, ++ __func__); ++ rc = -EAGAIN; ++ goto out; ++ } ++ ioc->transport_cmds.status = MPT2_CMD_PENDING; ++ ++ wait_state_count = 0; ++ ioc_state = mpt2sas_base_get_iocstate(ioc, 1); ++ while (ioc_state != MPI2_IOC_STATE_OPERATIONAL) { ++ if (wait_state_count++ == 10) { ++ printk(MPT2SAS_ERR_FMT ++ "%s: failed due to ioc not operational\n", ++ ioc->name, __func__); ++ rc = -EFAULT; ++ goto out; ++ } ++ ssleep(1); ++ ioc_state = mpt2sas_base_get_iocstate(ioc, 1); ++ printk(MPT2SAS_INFO_FMT "%s: waiting for " ++ "operational state(count=%d)\n", ioc->name, ++ __func__, wait_state_count); ++ } ++ if (wait_state_count) ++ printk(MPT2SAS_INFO_FMT "%s: ioc is operational\n", ++ ioc->name, __func__); ++ ++ smid = mpt2sas_base_get_smid(ioc, ioc->transport_cb_idx); ++ if (!smid) { ++ printk(MPT2SAS_ERR_FMT "%s: failed obtaining a smid\n", ++ ioc->name, __func__); ++ rc = -EAGAIN; ++ goto out; ++ } ++ ++ rc = 0; ++ mpi_request = mpt2sas_base_get_msg_frame(ioc, smid); ++ ioc->transport_cmds.smid = smid; ++ ++ memset(mpi_request, 0, sizeof(Mpi2SmpPassthroughRequest_t)); ++ mpi_request->Function = MPI2_FUNCTION_SMP_PASSTHROUGH; ++ mpi_request->PhysicalPort = 0xFF; ++ *((u64 *)&mpi_request->SASAddress) = (rphy) ? ++ cpu_to_le64(rphy->identify.sas_address) : ++ cpu_to_le64(ioc->sas_hba.sas_address); ++ mpi_request->RequestDataLength = cpu_to_le16(req->data_len - 4); ++ psge = &mpi_request->SGL; ++ ++ /* WRITE sgel first */ ++ sgl_flags = (MPI2_SGE_FLAGS_SIMPLE_ELEMENT | ++ MPI2_SGE_FLAGS_END_OF_BUFFER | MPI2_SGE_FLAGS_HOST_TO_IOC); ++ sgl_flags = sgl_flags << MPI2_SGE_FLAGS_SHIFT; ++ dma_addr_out = pci_map_single(ioc->pdev, bio_data(req->bio), ++ req->data_len, PCI_DMA_BIDIRECTIONAL); ++ if (!dma_addr_out) { ++ mpt2sas_base_free_smid(ioc, le16_to_cpu(smid)); ++ goto unmap; ++ } ++ ++ ioc->base_add_sg_single(psge, sgl_flags | (req->data_len - 4), ++ dma_addr_out); ++ ++ /* incr sgel */ ++ psge += ioc->sge_size; ++ ++ /* READ sgel last */ ++ sgl_flags = (MPI2_SGE_FLAGS_SIMPLE_ELEMENT | ++ MPI2_SGE_FLAGS_LAST_ELEMENT | MPI2_SGE_FLAGS_END_OF_BUFFER | ++ MPI2_SGE_FLAGS_END_OF_LIST); ++ sgl_flags = sgl_flags << MPI2_SGE_FLAGS_SHIFT; ++ dma_addr_in = pci_map_single(ioc->pdev, bio_data(rsp->bio), ++ rsp->data_len, PCI_DMA_BIDIRECTIONAL); ++ if (!dma_addr_in) { ++ mpt2sas_base_free_smid(ioc, le16_to_cpu(smid)); ++ goto unmap; ++ } ++ ++ ioc->base_add_sg_single(psge, sgl_flags | (rsp->data_len + 4), ++ dma_addr_in); ++ ++ dtransportprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s - " ++ "sending smp request\n", ioc->name, __func__)); ++ ++ mpt2sas_base_put_smid_default(ioc, smid, 0 /* VF_ID */); ++ timeleft = wait_for_completion_timeout(&ioc->transport_cmds.done, ++ 10*HZ); ++ ++ if (!(ioc->transport_cmds.status & MPT2_CMD_COMPLETE)) { ++ printk(MPT2SAS_ERR_FMT "%s : timeout\n", ++ __func__, ioc->name); ++ _debug_dump_mf(mpi_request, ++ sizeof(Mpi2SmpPassthroughRequest_t)/4); ++ if (!(ioc->transport_cmds.status & MPT2_CMD_RESET)) ++ issue_reset = 1; ++ goto issue_host_reset; ++ } ++ ++ dtransportprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s - " ++ "complete\n", ioc->name, __func__)); ++ ++ if (ioc->transport_cmds.status & MPT2_CMD_REPLY_VALID) { ++ ++ mpi_reply = ioc->transport_cmds.reply; ++ ++ dtransportprintk(ioc, printk(MPT2SAS_DEBUG_FMT ++ "%s - reply data transfer size(%d)\n", ++ ioc->name, __func__, ++ le16_to_cpu(mpi_reply->ResponseDataLength))); ++ ++ memcpy(req->sense, mpi_reply, sizeof(*mpi_reply)); ++ req->sense_len = sizeof(*mpi_reply); ++ req->data_len = 0; ++ rsp->data_len -= mpi_reply->ResponseDataLength; ++ ++ } else { ++ dtransportprintk(ioc, printk(MPT2SAS_DEBUG_FMT ++ "%s - no reply\n", ioc->name, __func__)); ++ rc = -ENXIO; ++ } ++ ++ issue_host_reset: ++ if (issue_reset) { ++ mpt2sas_base_hard_reset_handler(ioc, CAN_SLEEP, ++ FORCE_BIG_HAMMER); ++ rc = -ETIMEDOUT; ++ } ++ ++ unmap: ++ if (dma_addr_out) ++ pci_unmap_single(ioc->pdev, dma_addr_out, req->data_len, ++ PCI_DMA_BIDIRECTIONAL); ++ if (dma_addr_in) ++ pci_unmap_single(ioc->pdev, dma_addr_in, rsp->data_len, ++ PCI_DMA_BIDIRECTIONAL); ++ ++ out: ++ ioc->transport_cmds.status = MPT2_CMD_NOT_USED; ++ mutex_unlock(&ioc->transport_cmds.mutex); ++ return rc; ++} ++#endif ++ ++struct sas_function_template mpt2sas_transport_functions = { ++ .get_linkerrors = _transport_get_linkerrors, ++ .get_enclosure_identifier = _transport_get_enclosure_identifier, ++ .get_bay_identifier = _transport_get_bay_identifier, ++ .phy_reset = _transport_phy_reset, ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)) ++ .smp_handler = _transport_smp_handler, ++#endif ++}; ++ ++struct scsi_transport_template *mpt2sas_transport_template; diff --git a/master/mpt2sas-build-integration.patch b/master/mpt2sas-build-integration.patch new file mode 100644 index 0000000..a7394bf --- /dev/null +++ b/master/mpt2sas-build-integration.patch @@ -0,0 +1,33 @@ +diff -r 23e714c3ad0f drivers/scsi/Kconfig +--- a/drivers/scsi/Kconfig Wed Jul 01 09:50:04 2009 +0100 ++++ b/drivers/scsi/Kconfig Wed Jul 01 09:52:02 2009 +0100 +@@ -570,6 +570,7 @@ + To enable this function, choose Y here. + + source "drivers/scsi/megaraid/Kconfig.megaraid" ++source "drivers/scsi/mpt2sas/Kconfig" + + config SCSI_HPTIOP + tristate "HighPoint RocketRAID 3xxx/4xxx Controller support" +diff -r 23e714c3ad0f drivers/scsi/Makefile +--- a/drivers/scsi/Makefile Wed Jul 01 09:50:04 2009 +0100 ++++ b/drivers/scsi/Makefile Wed Jul 01 09:52:02 2009 +0100 +@@ -100,6 +100,7 @@ + obj-$(CONFIG_MEGARAID_LEGACY) += megaraid.o + obj-$(CONFIG_MEGARAID_NEWGEN) += megaraid/ + obj-$(CONFIG_MEGARAID_SAS) += megaraid/ ++obj-$(CONFIG_SCSI_MPT2SAS) += mpt2sas/ + obj-$(CONFIG_SCSI_ACARD) += atp870u.o + obj-$(CONFIG_SCSI_SUNESP) += esp_scsi.o sun_esp.o + obj-$(CONFIG_SCSI_GDTH) += gdth.o +diff -r 23e714c3ad0f include/linux/miscdevice.h +--- a/include/linux/miscdevice.h Wed Jul 01 09:50:04 2009 +0100 ++++ b/include/linux/miscdevice.h Wed Jul 01 09:52:02 2009 +0100 +@@ -25,6 +25,7 @@ + #define MICROCODE_MINOR 184 + #define MWAVE_MINOR 219 /* ACP/Mwave Modem */ + #define MPT_MINOR 220 ++#define MPT2SAS_MINOR 221 + #define MISC_DYNAMIC_MINOR 255 + + #define TUN_MINOR 200 diff --git a/master/mptlinux-4.19.00.03.patch b/master/mptlinux-4.19.00.03.patch new file mode 100644 index 0000000..d0b5906 --- /dev/null +++ b/master/mptlinux-4.19.00.03.patch @@ -0,0 +1,18942 @@ +MPT Fusion driver 4.00.07.00 from +http://scale.ad.xensource.com/confluence/download/attachments/1409154/DellDrivers.zip?version=1 +-> DellDrivers.zip/mptlinux_4.00.07.00_2.tgz -> mptlinux-4.00.07.00-src.tar + +diff -r 60d73800068f drivers/message/fusion/csmi/csmisas.c +--- a/drivers/message/fusion/csmi/csmisas.c Tue Jun 30 11:26:39 2009 +0100 ++++ b/drivers/message/fusion/csmi/csmisas.c Wed Jul 01 09:46:25 2009 +0100 +@@ -43,13 +43,16 @@ + */ + /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ + +-#define MPT_CSMI_DESCRIPTION \ +- "LSI Corporation: Fusion MPT Driver "MPT_LINUX_VERSION_COMMON ++#define MPT_CSMI_DESCRIPTION "LSI Corporation: Fusion MPT Driver "MPT_LINUX_VERSION_COMMON + #define csmisas_is_this_sas_cntr(ioc) (ioc->bus_type == SAS) ? 1 : 0 + +- +-static int csmisas_do_raid(MPT_ADAPTER *ioc, u8 action, u8 PhysDiskNum, +- u8 VolumeBus, u8 VolumeId, pMpiRaidActionReply_t reply); ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)) ++#define __user ++#include ++#endif ++ ++static int csmisas_do_raid(MPT_ADAPTER *ioc, u8 action, u8 PhysDiskNum, u8 VolumeBus, ++ u8 VolumeId, pMpiRaidActionReply_t reply); + static u8 map_sas_status_to_csmi(u8 mpi_sas_status); + + /** +@@ -63,7 +66,7 @@ + { + int i; + u64 rc; +- u8 *inWord = (u8 *)&data64, *outWord = (u8 *)&rc; ++ u8 *inWord = (u8*)&data64, *outWord = (u8*)&rc; + + for (i = 0 ; i < 8 ; i++) + outWord[i] = inWord[7-i]; +@@ -95,7 +98,7 @@ + * + **/ + static inline int +-csmisas_is_end_device(struct mptsas_devinfo *attached) ++csmisas_is_end_device(struct mptsas_devinfo * attached) + { + if ((attached->sas_address) && + (attached->device_info & +@@ -127,8 +130,7 @@ + goto out; + for (i = 0; i < ioc->raid_data.pIocPg3->NumPhysDisks; i++) { + if ((id == ioc->raid_data.pIocPg3->PhysDisk[i].PhysDiskID) && +- (channel == +- ioc->raid_data.pIocPg3->PhysDisk[i].PhysDiskBus)) { ++ (channel == ioc->raid_data.pIocPg3->PhysDisk[i].PhysDiskBus)) { + rc = 1; + goto out; + } +@@ -140,14 +142,14 @@ + if (list_empty(&ioc->raid_data.inactive_list)) + goto out; + +- mutex_lock(&ioc->raid_data.inactive_list_mutex); ++ down(&ioc->raid_data.inactive_list_mutex); + list_for_each_entry(component_info, &ioc->raid_data.inactive_list, + list) { + if ((component_info->d.PhysDiskID == id) && + (component_info->d.PhysDiskBus == channel)) + rc = 1; + } +- mutex_unlock(&ioc->raid_data.inactive_list_mutex); ++ up(&ioc->raid_data.inactive_list_mutex); + + out: + return rc; +@@ -159,8 +161,7 @@ + * Obtains the phys disk num for given H:C:T nexus + * + * input (channel/id) +- * output (phys disk number - used by SCSI_IO_PASSTHRU to access hidden +- * component) ++ * output (phys disk number - used by SCSI_IO_PASSTHRU to access hidden component) + * + * returns - signed return means failure + **/ +@@ -175,8 +176,7 @@ + goto out; + for (i = 0; i < ioc->raid_data.pIocPg3->NumPhysDisks; i++) { + if ((id == ioc->raid_data.pIocPg3->PhysDisk[i].PhysDiskID) && +- (channel == +- ioc->raid_data.pIocPg3->PhysDisk[i].PhysDiskBus)) { ++ (channel == ioc->raid_data.pIocPg3->PhysDisk[i].PhysDiskBus)) { + rc = ioc->raid_data.pIocPg3->PhysDisk[i].PhysDiskNum; + goto out; + } +@@ -188,14 +188,14 @@ + if (list_empty(&ioc->raid_data.inactive_list)) + goto out; + +- mutex_lock(&ioc->raid_data.inactive_list_mutex); ++ down(&ioc->raid_data.inactive_list_mutex); + list_for_each_entry(component_info, &ioc->raid_data.inactive_list, + list) { + if ((component_info->d.PhysDiskID == id) && + (component_info->d.PhysDiskBus == channel)) + rc = component_info->d.PhysDiskNum; + } +- mutex_unlock(&ioc->raid_data.inactive_list_mutex); ++ up(&ioc->raid_data.inactive_list_mutex); + + out: + return rc; +@@ -218,7 +218,7 @@ + + sas_info = NULL; + +- mutex_lock(&ioc->sas_device_info_mutex); ++ down(&ioc->sas_device_info_mutex); + list_for_each_entry(p, &ioc->sas_device_info_list, list) { + if (p->os.channel == channel && p->os.id == id) { + sas_info = p; +@@ -227,7 +227,7 @@ + } + + out: +- mutex_unlock(&ioc->sas_device_info_mutex); ++ up(&ioc->sas_device_info_mutex); + return sas_info; + } + +@@ -248,7 +248,7 @@ + + sas_info = NULL; + +- mutex_lock(&ioc->sas_device_info_mutex); ++ down(&ioc->sas_device_info_mutex); + list_for_each_entry(p, &ioc->sas_device_info_list, list) { + if (p->fw.channel == channel && p->fw.id == id) { + sas_info = p; +@@ -257,7 +257,7 @@ + } + + out: +- mutex_unlock(&ioc->sas_device_info_mutex); ++ up(&ioc->sas_device_info_mutex); + return sas_info; + } + +@@ -279,7 +279,7 @@ + + sas_info = NULL; + +- mutex_lock(&ioc->sas_device_info_mutex); ++ down(&ioc->sas_device_info_mutex); + list_for_each_entry(p, &ioc->sas_device_info_list, list) { + if (p->sas_address == sas_address) { + sas_info = p; +@@ -288,7 +288,7 @@ + } + + out: +- mutex_unlock(&ioc->sas_device_info_mutex); ++ up(&ioc->sas_device_info_mutex); + return sas_info; + } + +@@ -305,8 +305,7 @@ + * non-zero, failure + **/ + static int +-csmisas_send_command_wait(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, +- unsigned long timeout) ++csmisas_send_command_wait(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, unsigned long timeout) + { + int rc; + unsigned long timeleft; +@@ -314,16 +313,41 @@ + timeout = max_t(unsigned long, MPT_IOCTL_DEFAULT_TIMEOUT, timeout); + rc = 0; + timeleft = 0; ++ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)) ++ ++ INITIALIZE_IOCTL_STATUS(ioc->ioctl_cmds.status) ++ ioc->ioctl_cmds.wait_done = 0; ++ ioc->ioctl_cmds.timer.expires = jiffies + (MPT_JIFFY * timeout); ++ ioc->ioctl_cmds.status |= MPT_MGMT_STATUS_TIMER_ACTIVE; ++ ADD_TIMER(&ioc->ioctl_cmds.timer); ++ mpt_put_msg_frame(mptctl_id, ioc, mf); ++ WAIT_EVENT(mptctl_wait, ioc->ioctl_cmds.wait_done); ++ ++#elif (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,16)) ++ ++ INITIALIZE_IOCTL_STATUS(ioc->ioctl_cmds.status) ++ ioc->ioctl_cmds.wait_done = 0; ++ mpt_put_msg_frame(mptctl_id, ioc, mf); ++ ++ if ((wait_event_timeout(mptctl_wait, ++ ioc->ioctl_cmds.wait_done == 1, HZ * timeout) <=0) && ++ ioc->ioctl_cmds.wait_done != 1 ) { ++ mptctl_timeout_expired(ioc,mf); ++ mpt_free_msg_frame(ioc, mf); ++ rc = -1; ++ } ++ ++#else + + SET_MGMT_MSG_CONTEXT(ioc->ioctl_cmds.msg_context, + mf->u.hdr.MsgContext); + INITIALIZE_MGMT_STATUS(ioc->ioctl_cmds.status) + mpt_put_msg_frame(mptctl_id, ioc, mf); +- timeleft = wait_for_completion_timeout(&ioc->ioctl_cmds.done, +- timeout*HZ); ++ timeleft = wait_for_completion_timeout(&ioc->ioctl_cmds.done, timeout*HZ); + if (!(ioc->ioctl_cmds.status & MPT_MGMT_STATUS_COMMAND_GOOD)) { + rc = -1; +- printk(KERN_WARNING "%s: failed\n", __func__); ++ printk("%s: failed\n", __FUNCTION__); + if (ioc->ioctl_cmds.status & MPT_MGMT_STATUS_DID_IOCRESET) { + mpt_free_msg_frame(ioc, mf); + CLEAR_MGMT_STATUS(ioc->ioctl_cmds.status) +@@ -333,6 +357,7 @@ + mptctl_timeout_expired(ioc, mf); + } + SET_MGMT_MSG_CONTEXT(ioc->ioctl_cmds.msg_context, 0); ++#endif + return rc; + } + +@@ -350,8 +375,7 @@ + * non-zero, failure + **/ + static int +-csmisas_send_handshake_wait(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, +- unsigned long timeout) ++csmisas_send_handshake_wait(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, unsigned long timeout) + { + int rc; + unsigned long timeleft; +@@ -360,13 +384,42 @@ + rc = 0; + timeleft = 0; + ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)) ++ ++ INITIALIZE_IOCTL_STATUS(ioc->taskmgmt_cmds.status) ++ ioc->taskmgmt_cmds.timer.expires = jiffies + (MPT_JIFFY*timeout); ++ ioc->taskmgmt_cmds.status |= MPT_MGMT_STATUS_TIMER_ACTIVE; ++ ioc->taskmgmt_cmds.wait_done = 0; ++ ADD_TIMER(&ioc->taskmgmt_cmds.timer); ++ rc = mpt_send_special_message(mptctl_taskmgmt_id, ioc, ++ sizeof(SCSITaskMgmt_t), (u32*)mf, timeout, CAN_SLEEP); ++ if (rc != 0) ++ return rc; ++ WAIT_EVENT(mptctl_taskmgmt_wait, ioc->taskmgmt_cmds.wait_done); ++ ++#elif (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,16)) ++ ++ INITIALIZE_IOCTL_STATUS(ioc->taskmgmt_cmds.status) ++ ioc->taskmgmt_cmds.wait_done = 0; ++ rc = mpt_send_special_message(mptctl_taskmgmt_id, ioc, ++ sizeof(SCSITaskMgmt_t), (u32*)mf, timeout, CAN_SLEEP); ++ if (rc != 0) ++ return rc; ++ if ((wait_event_timeout(mptctl_taskmgmt_wait, ++ ioc->taskmgmt_cmds.wait_done == 1, HZ * timeout) <=0) && ++ ioc->taskmgmt_cmds.wait_done != 1 ) { ++ mptctl_timeout_expired(ioc, mf); ++ mpt_free_msg_frame(ioc, mf); ++ rc = -1; ++ } ++ ++#else + INITIALIZE_MGMT_STATUS(ioc->taskmgmt_cmds.status) + mpt_put_msg_frame_hi_pri(mptctl_taskmgmt_id, ioc, mf); +- timeleft = wait_for_completion_timeout(&ioc->taskmgmt_cmds.done, +- timeout*HZ); ++ timeleft = wait_for_completion_timeout(&ioc->taskmgmt_cmds.done, timeout*HZ); + if (!(ioc->ioctl_cmds.status & MPT_MGMT_STATUS_COMMAND_GOOD)) { + rc = -1; +- printk(KERN_WARNING "%s: failed\n", __func__); ++ printk("%s: failed\n", __FUNCTION__); + mpt_clear_taskmgmt_in_progress_flag(ioc); + if (ioc->ioctl_cmds.status & MPT_MGMT_STATUS_DID_IOCRESET) { + mpt_free_msg_frame(ioc, mf); +@@ -376,6 +429,7 @@ + if (!timeleft) + mptctl_timeout_expired(ioc, mf); + } ++#endif + return rc; + } + +@@ -473,8 +527,7 @@ + cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER; + cfg.timeout = MPT_IOCTL_DEFAULT_TIMEOUT; + +- rc = mpt_config(ioc, &cfg); +- if (rc != 0) ++ if ((rc = mpt_config(ioc, &cfg)) != 0) + goto get_ioc_pg5; + + if (hdr.PageLength == 0) { +@@ -494,8 +547,7 @@ + cfg.physAddr = dma_handle; + cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT; + +- rc = mpt_config(ioc, &cfg); +- if (rc != 0) ++ if ((rc = mpt_config(ioc, &cfg)) != 0) + goto get_ioc_pg5; + + memcpy(iocPage5, buffer, data_size); +@@ -513,8 +565,7 @@ + * csmisas_sas_device_pg0 - sas device page 0 + * @ioc: Pointer to MPT_ADAPTER structure + * @mptsas_devinfo: structure found in mptsas.h +- * @form, @form_specific - defines the Page Address field in +- * the config page ++ * @form, @form_specific - defines the Page Address field in the config page + * (pls refer to chapter 5.1 in the mpi spec) + * + * Return: 0 for success +@@ -551,8 +602,7 @@ + cfg.timeout = 10; + + memset(device_info, 0, sizeof(struct mptsas_devinfo)); +- rc = mpt_config(ioc, &cfg); +- if (rc != 0) ++ if ((rc = mpt_config(ioc, &cfg)) != 0) + goto out; + + if (!hdr.ExtPageLength) { +@@ -570,8 +620,7 @@ + cfg.physAddr = dma_handle; + cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT; + +- rc = mpt_config(ioc, &cfg); +- if (rc != 0) ++ if ((rc = mpt_config(ioc, &cfg)) != 0) + goto out_free_consistent; + + device_info->handle = le16_to_cpu(buffer->DevHandle); +@@ -615,31 +664,31 @@ + if (copy_from_user(&karg, uarg, sizeof(CSMI_SAS_DRIVER_INFO_BUFFER))) { + printk(KERN_ERR "%s@%d::%s - " + "Unable to read in csmi_sas_get_driver_info_buffer struct @ %p\n", +- __FILE__, __LINE__, __func__, uarg); +- return -EFAULT; +- } +- +- if (((iocnum = mpt_verify_adapter(karg.IoctlHeader.IOControllerNumber, +- &ioc)) < 0) || (ioc == NULL)) { +- printk(KERN_ERR "%s::%s() @%d - ioc%d not found!\n", +- __FILE__, __func__, __LINE__, iocnum); +- return -ENODEV; +- } +- +- if (!csmisas_is_this_sas_cntr(ioc)) { +- printk(KERN_ERR "%s::%s() @%d - ioc%d not SAS controller!\n", +- __FILE__, __func__, __LINE__, iocnum); +- return -ENODEV; +- } +- +- dcsmisasprintk(ioc, printk(KERN_DEBUG "%s enter.\n", __func__)); ++ __FILE__, __LINE__, __FUNCTION__, uarg); ++ return -EFAULT; ++ } ++ ++ if (((iocnum = mpt_verify_adapter(karg.IoctlHeader.IOControllerNumber, ++ &ioc)) < 0) || (ioc == NULL)) { ++ printk(KERN_ERR "%s::%s() @%d - ioc%d not found!\n", ++ __FILE__, __FUNCTION__, __LINE__, iocnum); ++ return -ENODEV; ++ } ++ ++ if (!csmisas_is_this_sas_cntr(ioc)) { ++ printk(KERN_ERR "%s::%s() @%d - ioc%d not SAS controller!\n", ++ __FILE__, __FUNCTION__, __LINE__, iocnum); ++ return -ENODEV; ++ } ++ ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "%s enter.\n",__FUNCTION__)); + + /* Fill in the data and return the structure to the calling + * program + */ +- memcpy(karg.Information.szName, MPT_MISCDEV_BASENAME, ++ memcpy( karg.Information.szName, MPT_MISCDEV_BASENAME, + sizeof(MPT_MISCDEV_BASENAME)); +- memcpy(karg.Information.szDescription, MPT_CSMI_DESCRIPTION, ++ memcpy( karg.Information.szDescription, MPT_CSMI_DESCRIPTION, + sizeof(MPT_CSMI_DESCRIPTION)); + + karg.Information.usMajorRevision = MPT_LINUX_MAJOR_VERSION; +@@ -658,11 +707,11 @@ + sizeof(CSMI_SAS_DRIVER_INFO_BUFFER))) { + printk(KERN_ERR "%s@%d::%s - " + "Unable to write out csmi_sas_get_driver_info_buffer @ %p\n", +- __FILE__, __LINE__, __func__, uarg); +- return -EFAULT; +- } +- +- dcsmisasprintk(ioc, printk(KERN_DEBUG "%s exit.\n", __func__)); ++ __FILE__, __LINE__, __FUNCTION__, uarg); ++ return -EFAULT; ++ } ++ ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "%s exit.\n",__FUNCTION__)); + return 0; + } + +@@ -687,28 +736,28 @@ + if (copy_from_user(&karg, uarg, sizeof(CSMI_SAS_CNTLR_CONFIG_BUFFER))) { + printk(KERN_ERR "%s@%d::%s - " + "Unable to read in csmi_sas_get_cntlr_config_buffer struct @ %p\n", +- __FILE__, __LINE__, __func__, uarg); +- return -EFAULT; +- } +- +- if (((iocnum = mpt_verify_adapter(karg.IoctlHeader.IOControllerNumber, +- &ioc)) < 0) || (ioc == NULL)) { +- printk(KERN_ERR "%s::%s() @%d - ioc%d not found!\n", +- __FILE__, __func__, __LINE__, iocnum); ++ __FILE__, __LINE__, __FUNCTION__, uarg); ++ return -EFAULT; ++ } ++ ++ if (((iocnum = mpt_verify_adapter(karg.IoctlHeader.IOControllerNumber, ++ &ioc)) < 0) || (ioc == NULL)) { ++ printk(KERN_ERR "%s::%s() @%d - ioc%d not found!\n", ++ __FILE__, __FUNCTION__, __LINE__, iocnum); + karg.IoctlHeader.ReturnCode = CSMI_SAS_STATUS_INVALID_PARAMETER; + return -ENODEV; + } + + if (!csmisas_is_this_sas_cntr(ioc)) { + printk(KERN_ERR "%s::%s() @%d - ioc%d not SAS controller!\n", +- __FILE__, __func__, __LINE__, iocnum); +- return -ENODEV; +- } +- +- dcsmisasprintk(ioc, printk(KERN_DEBUG "%s enter.\n", __func__)); ++ __FILE__, __FUNCTION__, __LINE__, iocnum); ++ return -ENODEV; ++ } ++ ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "%s enter.\n",__FUNCTION__)); + + /* Clear the struct before filling in data. */ +- memset(&karg.Configuration, 0, sizeof(CSMI_SAS_CNTLR_CONFIG)); ++ memset( &karg.Configuration, 0, sizeof(CSMI_SAS_CNTLR_CONFIG)); + + /* Fill in the data and return the structure to the calling + * program +@@ -737,7 +786,7 @@ + karg.Configuration.BusAddress.PciAddress.bFunctionNumber = + PCI_FUNC(ioc->pcidev->devfn); + karg.Configuration.BusAddress.PciAddress.bReserved = 0; +- memcpy(&karg.Configuration.szSerialNumber, ioc->board_tracer, 16); ++ memcpy( &karg.Configuration.szSerialNumber, ioc->board_tracer, 16 ); + karg.Configuration.usMajorRevision = ioc->facts.FWVersion.Struct.Major; + karg.Configuration.usMinorRevision = ioc->facts.FWVersion.Struct.Minor; + karg.Configuration.usBuildRevision = ioc->facts.FWVersion.Struct.Unit; +@@ -770,11 +819,11 @@ + sizeof(CSMI_SAS_DRIVER_INFO_BUFFER))) { + printk(KERN_ERR "%s@%d::%s - " + "Unable to write out csmi_sas_get_driver_info_buffer @ %p\n", +- __FILE__, __LINE__, __func__, uarg); +- return -EFAULT; +- } +- +- dcsmisasprintk(ioc, printk(KERN_DEBUG "%s exit.\n", __func__)); ++ __FILE__, __LINE__, __FUNCTION__, uarg); ++ return -EFAULT; ++ } ++ ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "%s exit.\n",__FUNCTION__)); + return 0; + } + +@@ -799,24 +848,24 @@ + if (copy_from_user(&karg, uarg, sizeof(CSMI_SAS_CNTLR_STATUS_BUFFER))) { + printk(KERN_ERR "%s@%d::%s - " + "Unable to read in csmi_sas_get_cntlr_status_buffer struct @ %p\n", +- __FILE__, __LINE__, __func__, uarg); +- return -EFAULT; +- } +- +- if (((iocnum = mpt_verify_adapter(karg.IoctlHeader.IOControllerNumber, +- &ioc)) < 0) || (ioc == NULL)) { +- printk(KERN_ERR "%s::%s() @%d - ioc%d not found!\n", +- __FILE__, __func__, __LINE__, iocnum); +- return -ENODEV; +- } +- +- if (!csmisas_is_this_sas_cntr(ioc)) { +- printk(KERN_ERR "%s::%s() @%d - ioc%d not SAS controller!\n", +- __FILE__, __func__, __LINE__, iocnum); +- return -ENODEV; +- } +- +- dcsmisasprintk(ioc, printk(KERN_DEBUG "%s enter.\n", __func__)); ++ __FILE__, __LINE__, __FUNCTION__, uarg); ++ return -EFAULT; ++ } ++ ++ if (((iocnum = mpt_verify_adapter(karg.IoctlHeader.IOControllerNumber, ++ &ioc)) < 0) || (ioc == NULL)) { ++ printk(KERN_ERR "%s::%s() @%d - ioc%d not found!\n", ++ __FILE__, __FUNCTION__, __LINE__, iocnum); ++ return -ENODEV; ++ } ++ ++ if (!csmisas_is_this_sas_cntr(ioc)) { ++ printk(KERN_ERR "%s::%s() @%d - ioc%d not SAS controller!\n", ++ __FILE__, __FUNCTION__, __LINE__, iocnum); ++ return -ENODEV; ++ } ++ ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "%s enter.\n",__FUNCTION__)); + + /* Fill in the data and return the structure to the calling + * program +@@ -853,11 +902,11 @@ + sizeof(CSMI_SAS_CNTLR_STATUS_BUFFER))) { + printk(KERN_ERR "%s@%d::%s - " + "Unable to write out csmi_sas_get_cntlr_status @ %p\n", +- __FILE__, __LINE__, __func__, uarg); +- return -EFAULT; +- } +- +- dcsmisasprintk(ioc, printk(KERN_DEBUG "%s exit.\n", __func__)); ++ __FILE__, __LINE__, __FUNCTION__, uarg); ++ return -EFAULT; ++ } ++ ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "%s exit.\n",__FUNCTION__)); + return 0; + } + +@@ -891,19 +940,19 @@ + struct mptsas_devinfo device_info; + int memory_pages; + +- sasIoUnitPg0 = NULL; +- sasPhyPg0 = NULL; +- sasIoUnitPg0_data_sz = 0; +- sasPhyPg0_data_sz = 0; ++ sasIoUnitPg0=NULL; ++ sasPhyPg0=NULL; ++ sasIoUnitPg0_data_sz=0; ++ sasPhyPg0_data_sz=0; + + memory_pages = get_order(sizeof(CSMI_SAS_PHY_INFO_BUFFER)); + karg = (CSMI_SAS_PHY_INFO_BUFFER *)__get_free_pages( + GFP_KERNEL, memory_pages); +- if (!karg) { ++ if (!karg){ + printk(KERN_ERR "%s@%d::%s() - " + "Unable to malloc CSMI_SAS_PHY_INFO_BUFFER " + "malloc_data_sz=%d memory_pages=%d\n", +- __FILE__, __LINE__, __func__, ++ __FILE__, __LINE__, __FUNCTION__, + (int)sizeof(CSMI_SAS_PHY_INFO_BUFFER), memory_pages); + return -ENOMEM; + } +@@ -913,7 +962,7 @@ + if (copy_from_user(karg, uarg, sizeof(CSMI_SAS_PHY_INFO_BUFFER))) { + printk(KERN_ERR "%s@%d::%s - " + "Unable to read in csmisas_get_phy_info_buffer struct @ %p\n", +- __FILE__, __LINE__, __func__, uarg); ++ __FILE__, __LINE__, __FUNCTION__, uarg); + free_pages((unsigned long)karg, memory_pages); + return -EFAULT; + } +@@ -921,19 +970,19 @@ + if (((iocnum = mpt_verify_adapter(karg->IoctlHeader.IOControllerNumber, + &ioc)) < 0) || (ioc == NULL)) { + printk(KERN_ERR "%s::%s() @%d - ioc%d not found!\n", +- __FILE__, __func__, __LINE__, iocnum); +- free_pages((unsigned long)karg, memory_pages); +- return -ENODEV; +- } +- +- if (!csmisas_is_this_sas_cntr(ioc)) { +- printk(KERN_ERR "%s::%s() @%d - ioc%d not SAS controller!\n", +- __FILE__, __func__, __LINE__, iocnum); +- free_pages((unsigned long)karg, memory_pages); +- return -ENODEV; +- } +- +- dcsmisasprintk(ioc, printk(KERN_DEBUG "%s enter.\n", __func__)); ++ __FILE__, __FUNCTION__, __LINE__, iocnum); ++ free_pages((unsigned long)karg, memory_pages); ++ return -ENODEV; ++ } ++ ++ if (!csmisas_is_this_sas_cntr(ioc)) { ++ printk(KERN_ERR "%s::%s() @%d - ioc%d not SAS controller!\n", ++ __FILE__, __FUNCTION__, __LINE__, iocnum); ++ free_pages((unsigned long)karg, memory_pages); ++ return -ENODEV; ++ } ++ ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "%s enter.\n",__FUNCTION__)); + + /* Fill in the data and return the structure to the calling + * program +@@ -962,7 +1011,7 @@ + */ + dcsmisasprintk(ioc, printk(KERN_ERR + ": FAILED: MPI_SASIOUNITPAGE0_PAGEVERSION: HEADER\n")); +- dcsmisasprintk(ioc, printk(": rc=%x\n", rc)); ++ dcsmisasprintk(ioc, printk(": rc=%x\n",rc)); + karg->IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; + goto sas_get_phy_info_exit; + } +@@ -971,8 +1020,7 @@ + /* Don't check if this failed. Already in a + * failure case. + */ +- dcsmisasprintk(ioc, printk(KERN_ERR +- ": hdr.ExtPageLength == 0\n")); ++ dcsmisasprintk(ioc, printk(KERN_ERR ": hdr.ExtPageLength == 0\n")); + karg->IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; + goto sas_get_phy_info_exit; + } +@@ -984,8 +1032,7 @@ + sasIoUnitPg0_data_sz, &sasIoUnitPg0_dma); + + if (!sasIoUnitPg0) { +- dcsmisasprintk(ioc, printk(KERN_ERR +- ": pci_alloc_consistent: FAILED\n")); ++ dcsmisasprintk(ioc, printk(KERN_ERR ": pci_alloc_consistent: FAILED\n")); + karg->IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; + goto sas_get_phy_info_exit; + } +@@ -1001,7 +1048,7 @@ + */ + dcsmisasprintk(ioc, printk(KERN_ERR + ": FAILED: MPI_SASIOUNITPAGE0_PAGEVERSION: PAGE\n")); +- dcsmisasprintk(ioc, printk(KERN_ERR ": rc=%x\n", rc)); ++ dcsmisasprintk(ioc, printk(KERN_ERR ": rc=%x\n",rc)); + karg->IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; + goto sas_get_phy_info_exit; + } +@@ -1011,30 +1058,27 @@ + + /* Fill in information for each phy. */ + for (ii = 0; ii < karg->Information.bNumberOfPhys; ii++) { +- dcsmisasprintk(ioc, printk(KERN_DEBUG +- "---- IO UNIT PAGE 0 ------------\n")); +- dcsmisasprintk(ioc, printk(KERN_DEBUG +- "Handle=0x%X\n", ++ ++/* EDM : dump IO Unit Page 0 data*/ ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "---- IO UNIT PAGE 0 ------------\n")); ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "Handle=0x%X\n", + le16_to_cpu(sasIoUnitPg0->PhyData[ii].AttachedDeviceHandle))); +- dcsmisasprintk(ioc, printk(KERN_DEBUG +- "Controller Handle=0x%X\n", ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "Controller Handle=0x%X\n", + le16_to_cpu(sasIoUnitPg0->PhyData[ii].ControllerDevHandle))); +- dcsmisasprintk(ioc, printk(KERN_DEBUG +- "Port=0x%X\n", ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "Port=0x%X\n", + sasIoUnitPg0->PhyData[ii].Port)); + dcsmisasprintk(ioc, printk(KERN_DEBUG "Port Flags=0x%X\n", + sasIoUnitPg0->PhyData[ii].PortFlags)); + dcsmisasprintk(ioc, printk(KERN_DEBUG "PHY Flags=0x%X\n", + sasIoUnitPg0->PhyData[ii].PhyFlags)); +- dcsmisasprintk(ioc, printk(KERN_DEBUG +- "Negotiated Link Rate=0x%X\n", ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "Negotiated Link Rate=0x%X\n", + sasIoUnitPg0->PhyData[ii].NegotiatedLinkRate)); +- dcsmisasprintk(ioc, printk(KERN_DEBUG +- "Controller PHY Device Info=0x%X\n", ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "Controller PHY Device Info=0x%X\n", + le32_to_cpu(sasIoUnitPg0->PhyData[ii].ControllerPhyDeviceInfo))); + dcsmisasprintk(ioc, printk(KERN_DEBUG "DiscoveryStatus=0x%X\n", + le32_to_cpu(sasIoUnitPg0->PhyData[ii].DiscoveryStatus))); + dcsmisasprintk(ioc, printk(KERN_DEBUG "\n")); ++/* EDM : debug data */ + + /* PHY stuff. */ + karg->Information.Phy[ii].bPortIdentifier = +@@ -1103,14 +1147,13 @@ + if ((rc = mpt_config(ioc, &cfg)) != 0) { + dcsmisasprintk(ioc, printk(KERN_ERR + ": FAILED: MPI_SASPHY0_PAGEVERSION: HEADER\n")); +- dcsmisasprintk(ioc, printk(": rc=%x\n", rc)); ++ dcsmisasprintk(ioc, printk(": rc=%x\n",rc)); + karg->IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; + goto sas_get_phy_info_exit; + } + + if (hdr.ExtPageLength == 0) { +- dcsmisasprintk(ioc, printk(KERN_ERR +- ": pci_alloc_consistent: FAILED\n")); ++ dcsmisasprintk(ioc, printk(KERN_ERR ": pci_alloc_consistent: FAILED\n")); + karg->IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; + goto sas_get_phy_info_exit; + } +@@ -1121,9 +1164,8 @@ + sasPhyPg0 = (SasPhyPage0_t *) pci_alloc_consistent( + ioc->pcidev, sasPhyPg0_data_sz, &sasPhyPg0_dma); + +- if (!sasPhyPg0) { +- dcsmisasprintk(ioc, printk(KERN_ERR +- ": pci_alloc_consistent: FAILED\n")); ++ if (! sasPhyPg0) { ++ dcsmisasprintk(ioc, printk(KERN_ERR ": pci_alloc_consistent: FAILED\n")); + karg->IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; + goto sas_get_phy_info_exit; + } +@@ -1135,37 +1177,34 @@ + if ((rc = mpt_config(ioc, &cfg)) != 0) { + dcsmisasprintk(ioc, printk(KERN_ERR + ": FAILED: MPI_SASPHY0_PAGEVERSION: PAGE\n")); +- dcsmisasprintk(ioc, printk(KERN_ERR ": rc=%x\n", rc)); ++ dcsmisasprintk(ioc, printk(KERN_ERR ": rc=%x\n",rc)); + karg->IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; + pci_free_consistent(ioc->pcidev, sasPhyPg0_data_sz, + (u8 *) sasPhyPg0, sasPhyPg0_dma); + goto sas_get_phy_info_exit; + } + ++/* EDM : dump PHY Page 0 data*/ + memcpy(&sas_address, &sasPhyPg0->SASAddress, sizeof(u64)); +- dcsmisasprintk(ioc, printk(KERN_DEBUG +- "---- SAS PHY PAGE 0 ------------\n")); ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "---- SAS PHY PAGE 0 ------------\n")); + dcsmisasprintk(ioc, printk(KERN_DEBUG "Handle=0x%X\n", + le16_to_cpu(sasPhyPg0->AttachedDevHandle))); + dcsmisasprintk(ioc, printk(KERN_DEBUG "SAS Address=0x%llX\n", + (unsigned long long)sas_address)); +- dcsmisasprintk(ioc, printk(KERN_DEBUG +- "Attached PHY Identifier=0x%X\n", ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "Attached PHY Identifier=0x%X\n", + sasPhyPg0->AttachedPhyIdentifier)); +- dcsmisasprintk(ioc, printk(KERN_DEBUG +- "Attached Device Info=0x%X\n", ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "Attached Device Info=0x%X\n", + le32_to_cpu(sasPhyPg0->AttachedDeviceInfo))); +- dcsmisasprintk(ioc, printk(KERN_DEBUG +- "Programmed Link Rate=0x%X\n", ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "Programmed Link Rate=0x%X\n", + sasPhyPg0->ProgrammedLinkRate)); +- dcsmisasprintk(ioc, printk(KERN_DEBUG +- "Hardware Link Rate=0x%X\n", ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "Hardware Link Rate=0x%X\n", + sasPhyPg0->HwLinkRate)); + dcsmisasprintk(ioc, printk(KERN_DEBUG "Change Count=0x%X\n", + sasPhyPg0->ChangeCount)); + dcsmisasprintk(ioc, printk(KERN_DEBUG "PHY Info=0x%X\n", + le32_to_cpu(sasPhyPg0->PhyInfo))); + dcsmisasprintk(ioc, printk(KERN_DEBUG "\n")); ++/* EDM : debug data */ + + /* save the data */ + +@@ -1245,9 +1284,8 @@ + } + + karg->Information.Phy[ii].bPhyChangeCount = sasPhyPg0->ChangeCount; +- if (sasPhyPg0->PhyInfo & MPI_SAS_PHY0_PHYINFO_VIRTUAL_PHY) +- karg->Information.Phy[ii].bPhyFeatures +- = CSMI_SAS_PHY_VIRTUAL_SMP; ++ if( sasPhyPg0->PhyInfo & MPI_SAS_PHY0_PHYINFO_VIRTUAL_PHY ) ++ karg->Information.Phy[ii].bPhyFeatures = CSMI_SAS_PHY_VIRTUAL_SMP; + + /* Fill in Attached Device + * Initiator Port Protocol. +@@ -1257,17 +1295,17 @@ + protocol = le32_to_cpu(sasPhyPg0->AttachedDeviceInfo) & 0x78; + karg->Information.Phy[ii].Attached.bInitiatorPortProtocol = 0; + if (protocol & MPI_SAS_DEVICE_INFO_SSP_INITIATOR) +- karg->Information.Phy[ii].Attached.bInitiatorPortProtocol +- = CSMI_SAS_PROTOCOL_SSP; ++ karg->Information.Phy[ii].Attached.bInitiatorPortProtocol = ++ CSMI_SAS_PROTOCOL_SSP; + if (protocol & MPI_SAS_DEVICE_INFO_STP_INITIATOR) +- karg->Information.Phy[ii].Attached.bInitiatorPortProtocol +- |= CSMI_SAS_PROTOCOL_STP; ++ karg->Information.Phy[ii].Attached.bInitiatorPortProtocol |= ++ CSMI_SAS_PROTOCOL_STP; + if (protocol & MPI_SAS_DEVICE_INFO_SMP_INITIATOR) +- karg->Information.Phy[ii].Attached.bInitiatorPortProtocol +- |= CSMI_SAS_PROTOCOL_SMP; ++ karg->Information.Phy[ii].Attached.bInitiatorPortProtocol |= ++ CSMI_SAS_PROTOCOL_SMP; + if (protocol & MPI_SAS_DEVICE_INFO_SATA_HOST) +- karg->Information.Phy[ii].Attached.bInitiatorPortProtocol +- |= CSMI_SAS_PROTOCOL_SATA; ++ karg->Information.Phy[ii].Attached.bInitiatorPortProtocol |= ++ CSMI_SAS_PROTOCOL_SATA; + + /* Fill in Phy Target Port + * Protocol. Bits 10:7 +@@ -1276,17 +1314,17 @@ + protocol = le32_to_cpu(sasPhyPg0->AttachedDeviceInfo) & 0x780; + karg->Information.Phy[ii].Attached.bTargetPortProtocol = 0; + if (protocol & MPI_SAS_DEVICE_INFO_SSP_TARGET) +- karg->Information.Phy[ii].Attached.bTargetPortProtocol +- |= CSMI_SAS_PROTOCOL_SSP; ++ karg->Information.Phy[ii].Attached.bTargetPortProtocol |= ++ CSMI_SAS_PROTOCOL_SSP; + if (protocol & MPI_SAS_DEVICE_INFO_STP_TARGET) +- karg->Information.Phy[ii].Attached.bTargetPortProtocol +- |= CSMI_SAS_PROTOCOL_STP; ++ karg->Information.Phy[ii].Attached.bTargetPortProtocol |= ++ CSMI_SAS_PROTOCOL_STP; + if (protocol & MPI_SAS_DEVICE_INFO_SMP_TARGET) +- karg->Information.Phy[ii].Attached.bTargetPortProtocol +- |= CSMI_SAS_PROTOCOL_SMP; ++ karg->Information.Phy[ii].Attached.bTargetPortProtocol |= ++ CSMI_SAS_PROTOCOL_SMP; + if (protocol & MPI_SAS_DEVICE_INFO_SATA_DEVICE) +- karg->Information.Phy[ii].Attached.bTargetPortProtocol +- |= CSMI_SAS_PROTOCOL_SATA; ++ karg->Information.Phy[ii].Attached.bTargetPortProtocol |= ++ CSMI_SAS_PROTOCOL_SATA; + + + /* Fill in Attached device type */ +@@ -1315,8 +1353,7 @@ + } + + /* Identify Info. */ +- switch (le32_to_cpu +- (sasIoUnitPg0->PhyData[ii].ControllerPhyDeviceInfo) & ++ switch (le32_to_cpu(sasIoUnitPg0->PhyData[ii].ControllerPhyDeviceInfo) & + MPI_SAS_DEVICE_INFO_MASK_DEVICE_TYPE) { + + case MPI_SAS_DEVICE_INFO_NO_DEVICE: +@@ -1346,18 +1383,18 @@ + protocol = le32_to_cpu( + sasIoUnitPg0->PhyData[ii].ControllerPhyDeviceInfo) & 0x78; + karg->Information.Phy[ii].Identify.bInitiatorPortProtocol = 0; +- if (protocol & MPI_SAS_DEVICE_INFO_SSP_INITIATOR) +- karg->Information.Phy[ii].Identify.bInitiatorPortProtocol +- |= CSMI_SAS_PROTOCOL_SSP; +- if (protocol & MPI_SAS_DEVICE_INFO_STP_INITIATOR) +- karg->Information.Phy[ii].Identify.bInitiatorPortProtocol +- |= CSMI_SAS_PROTOCOL_STP; +- if (protocol & MPI_SAS_DEVICE_INFO_SMP_INITIATOR) +- karg->Information.Phy[ii].Identify.bInitiatorPortProtocol +- |= CSMI_SAS_PROTOCOL_SMP; +- if (protocol & MPI_SAS_DEVICE_INFO_SATA_HOST) +- karg->Information.Phy[ii].Identify.bInitiatorPortProtocol +- |= CSMI_SAS_PROTOCOL_SATA; ++ if( protocol & MPI_SAS_DEVICE_INFO_SSP_INITIATOR ) ++ karg->Information.Phy[ii].Identify.bInitiatorPortProtocol |= ++ CSMI_SAS_PROTOCOL_SSP; ++ if( protocol & MPI_SAS_DEVICE_INFO_STP_INITIATOR ) ++ karg->Information.Phy[ii].Identify.bInitiatorPortProtocol |= ++ CSMI_SAS_PROTOCOL_STP; ++ if( protocol & MPI_SAS_DEVICE_INFO_SMP_INITIATOR ) ++ karg->Information.Phy[ii].Identify.bInitiatorPortProtocol |= ++ CSMI_SAS_PROTOCOL_SMP; ++ if( protocol & MPI_SAS_DEVICE_INFO_SATA_HOST ) ++ karg->Information.Phy[ii].Identify.bInitiatorPortProtocol |= ++ CSMI_SAS_PROTOCOL_SATA; + + /* Fill in Phy Target Port Protocol. Bits 10:7 + * More than one bit can be set, fall through cases. +@@ -1365,18 +1402,18 @@ + protocol = le32_to_cpu( + sasIoUnitPg0->PhyData[ii].ControllerPhyDeviceInfo) & 0x780; + karg->Information.Phy[ii].Identify.bTargetPortProtocol = 0; +- if (protocol & MPI_SAS_DEVICE_INFO_SSP_TARGET) +- karg->Information.Phy[ii].Identify.bTargetPortProtocol +- |= CSMI_SAS_PROTOCOL_SSP; +- if (protocol & MPI_SAS_DEVICE_INFO_STP_TARGET) +- karg->Information.Phy[ii].Identify.bTargetPortProtocol +- |= CSMI_SAS_PROTOCOL_STP; +- if (protocol & MPI_SAS_DEVICE_INFO_SMP_TARGET) +- karg->Information.Phy[ii].Identify.bTargetPortProtocol +- |= CSMI_SAS_PROTOCOL_SMP; +- if (protocol & MPI_SAS_DEVICE_INFO_SATA_DEVICE) +- karg->Information.Phy[ii].Identify.bTargetPortProtocol +- |= CSMI_SAS_PROTOCOL_SATA; ++ if( protocol & MPI_SAS_DEVICE_INFO_SSP_TARGET ) ++ karg->Information.Phy[ii].Identify.bTargetPortProtocol |= ++ CSMI_SAS_PROTOCOL_SSP; ++ if( protocol & MPI_SAS_DEVICE_INFO_STP_TARGET ) ++ karg->Information.Phy[ii].Identify.bTargetPortProtocol |= ++ CSMI_SAS_PROTOCOL_STP; ++ if( protocol & MPI_SAS_DEVICE_INFO_SMP_TARGET ) ++ karg->Information.Phy[ii].Identify.bTargetPortProtocol |= ++ CSMI_SAS_PROTOCOL_SMP; ++ if( protocol & MPI_SAS_DEVICE_INFO_SATA_DEVICE ) ++ karg->Information.Phy[ii].Identify.bTargetPortProtocol |= ++ CSMI_SAS_PROTOCOL_SATA; + + /* Setup SAS Address for the attached device */ + if (sasPhyPg0->AttachedDevHandle) { +@@ -1413,13 +1450,13 @@ + sizeof(CSMI_SAS_PHY_INFO_BUFFER))) { + printk(KERN_ERR "%s@%d::%s - " + "Unable to write out csmisas_get_phy_info_buffer @ %p\n", +- __FILE__, __LINE__, __func__, uarg); +- free_pages((unsigned long)karg, memory_pages); +- return -EFAULT; +- } +- +- free_pages((unsigned long)karg, memory_pages); +- dcsmisasprintk(ioc, printk(KERN_DEBUG "%s exit.\n", __func__)); ++ __FILE__, __LINE__, __FUNCTION__, uarg); ++ free_pages((unsigned long)karg, memory_pages); ++ return -EFAULT; ++ } ++ ++ free_pages((unsigned long)karg, memory_pages); ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "%s exit.\n",__FUNCTION__)); + return 0; + } + +@@ -1442,28 +1479,30 @@ + if (copy_from_user(&karg, uarg, sizeof(CSMI_SAS_SET_PHY_INFO_BUFFER))) { + printk(KERN_ERR "%s@%d::%s() - " + "Unable to read in csmi_sas_set_phy_info struct @ %p\n", +- __FILE__, __LINE__, __func__, uarg); +- return -EFAULT; +- } +- +- if (((iocnum = mpt_verify_adapter(karg.IoctlHeader.IOControllerNumber, +- &ioc)) < 0) || (ioc == NULL)) { +- printk(KERN_ERR "%s::%s() @%d - ioc%d not found!\n", +- __FILE__, __func__, __LINE__, iocnum); +- return -ENODEV; +- } +- +- if (!csmisas_is_this_sas_cntr(ioc)) { +- printk(KERN_ERR "%s::%s() @%d - ioc%d not SAS controller!\n", +- __FILE__, __func__, __LINE__, iocnum); +- return -ENODEV; +- } +- +- dcsmisasprintk(ioc, printk(KERN_DEBUG "%s enter.\n", __func__)); +- ++ __FILE__, __LINE__, __FUNCTION__, uarg); ++ return -EFAULT; ++ } ++ ++ if (((iocnum = mpt_verify_adapter(karg.IoctlHeader.IOControllerNumber, ++ &ioc)) < 0) || (ioc == NULL)) { ++ printk(KERN_ERR "%s::%s() @%d - ioc%d not found!\n", ++ __FILE__, __FUNCTION__, __LINE__, iocnum); ++ return -ENODEV; ++ } ++ ++ if (!csmisas_is_this_sas_cntr(ioc)) { ++ printk(KERN_ERR "%s::%s() @%d - ioc%d not SAS controller!\n", ++ __FILE__, __FUNCTION__, __LINE__, iocnum); ++ return -ENODEV; ++ } ++ ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "%s enter.\n",__FUNCTION__)); ++ ++/* TODO - implement IOCTL here */ + karg.IoctlHeader.ReturnCode = CSMI_SAS_STATUS_BAD_CNTL_CODE; + dcsmisasprintk(ioc, printk(KERN_DEBUG ": not implemented\n")); + ++// cim_set_phy_info_exit: + + /* Copy the data from kernel memory to user memory + */ +@@ -1471,11 +1510,11 @@ + sizeof(CSMI_SAS_SET_PHY_INFO_BUFFER))) { + printk(KERN_ERR "%s@%d::%s() - " + "Unable to write out csmi_sas_set_phy_info @ %p\n", +- __FILE__, __LINE__, __func__, uarg); +- return -EFAULT; +- } +- +- dcsmisasprintk(ioc, printk(KERN_DEBUG "%s exit.\n", __func__)); ++ __FILE__, __LINE__, __FUNCTION__, uarg); ++ return -EFAULT; ++ } ++ ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "%s exit.\n",__FUNCTION__)); + return 0; + + } +@@ -1502,24 +1541,24 @@ + sizeof(CSMI_SAS_GET_SCSI_ADDRESS_BUFFER))) { + printk(KERN_ERR "%s@%d::%s() - " + "Unable to read in csmi_sas_get_scsi_address struct @ %p\n", +- __FILE__, __LINE__, __func__, uarg); +- return -EFAULT; +- } +- +- if (((iocnum = mpt_verify_adapter(karg.IoctlHeader.IOControllerNumber, +- &ioc)) < 0) || (ioc == NULL)) { +- printk(KERN_ERR "%s::%s() @%d - ioc%d not found!\n", +- __FILE__, __func__, __LINE__, iocnum); +- return -ENODEV; +- } +- +- if (!csmisas_is_this_sas_cntr(ioc)) { +- printk(KERN_ERR "%s::%s() @%d - ioc%d not SAS controller!\n", +- __FILE__, __func__, __LINE__, iocnum); +- return -ENODEV; +- } +- +- dcsmisasprintk(ioc, printk(KERN_DEBUG "%s enter.\n", __func__)); ++ __FILE__, __LINE__, __FUNCTION__, uarg); ++ return -EFAULT; ++ } ++ ++ if (((iocnum = mpt_verify_adapter(karg.IoctlHeader.IOControllerNumber, ++ &ioc)) < 0) || (ioc == NULL)) { ++ printk(KERN_ERR "%s::%s() @%d - ioc%d not found!\n", ++ __FILE__, __FUNCTION__, __LINE__, iocnum); ++ return -ENODEV; ++ } ++ ++ if (!csmisas_is_this_sas_cntr(ioc)) { ++ printk(KERN_ERR "%s::%s() @%d - ioc%d not SAS controller!\n", ++ __FILE__, __FUNCTION__, __LINE__, iocnum); ++ return -ENODEV; ++ } ++ ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "%s enter.\n",__FUNCTION__)); + + /* reverse byte order the sas address */ + memcpy(&sas_address, karg.bSASAddress, sizeof(u64)); +@@ -1547,11 +1586,11 @@ + sizeof(CSMI_SAS_GET_SCSI_ADDRESS_BUFFER))) { + printk(KERN_ERR "%s@%d::%s() - " + "Unable to write out csmi_sas_get_scsi_address @ %p\n", +- __FILE__, __LINE__, __func__, uarg); +- return -EFAULT; +- } +- +- dcsmisasprintk(ioc, printk(KERN_DEBUG "%s exit.\n", __func__)); ++ __FILE__, __LINE__, __FUNCTION__, uarg); ++ return -EFAULT; ++ } ++ ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "%s exit.\n",__FUNCTION__)); + return 0; + } + +@@ -1582,38 +1621,37 @@ + u8 phyId; + u64 sas_address; + +- sasPhyPg0 = NULL; +- sasPhyPg0_data_sz = 0; +- sasDevicePg1 = NULL; +- sasDevicePg1_data_sz = 0; ++ sasPhyPg0=NULL; ++ sasPhyPg0_data_sz=0; ++ sasDevicePg1=NULL; ++ sasDevicePg1_data_sz=0; + + if (copy_from_user(&karg, uarg, + sizeof(CSMI_SAS_SATA_SIGNATURE_BUFFER))) { + printk(KERN_ERR "%s@%d::%s() - " + "Unable to read in csmi_sas_sata_signature struct @ %p\n", +- __FILE__, __LINE__, __func__, uarg); +- return -EFAULT; +- } +- +- if (((iocnum = mpt_verify_adapter(karg.IoctlHeader.IOControllerNumber, +- &ioc)) < 0) || (ioc == NULL)) { +- printk(KERN_ERR "%s::%s() @%d - ioc%d not found!\n", +- __FILE__, __func__, __LINE__, iocnum); +- return -ENODEV; +- } +- +- if (!csmisas_is_this_sas_cntr(ioc)) { +- printk(KERN_ERR "%s::%s() @%d - ioc%d not SAS controller!\n", +- __FILE__, __func__, __LINE__, iocnum); +- return -ENODEV; +- } +- +- dcsmisasprintk(ioc, printk(KERN_DEBUG "%s enter.\n", __func__)); ++ __FILE__, __LINE__, __FUNCTION__, uarg); ++ return -EFAULT; ++ } ++ ++ if (((iocnum = mpt_verify_adapter(karg.IoctlHeader.IOControllerNumber, ++ &ioc)) < 0) || (ioc == NULL)) { ++ printk(KERN_ERR "%s::%s() @%d - ioc%d not found!\n", ++ __FILE__, __FUNCTION__, __LINE__, iocnum); ++ return -ENODEV; ++ } ++ ++ if (!csmisas_is_this_sas_cntr(ioc)) { ++ printk(KERN_ERR "%s::%s() @%d - ioc%d not SAS controller!\n", ++ __FILE__, __FUNCTION__, __LINE__, iocnum); ++ return -ENODEV; ++ } ++ ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "%s enter.\n",__FUNCTION__)); + phyId = karg.Signature.bPhyIdentifier; + if (phyId >= ioc->num_ports) { + karg.IoctlHeader.ReturnCode = CSMI_SAS_PHY_DOES_NOT_EXIST; +- dcsmisasprintk(ioc, +- printk(KERN_WARNING ": phyId >= ioc->num_ports\n")); ++ dcsmisasprintk(ioc, printk(KERN_WARNING ": phyId >= ioc->num_ports\n")); + goto cim_sata_signature_exit; + } + +@@ -1645,17 +1683,16 @@ + */ + dcsmisasprintk(ioc, printk(KERN_ERR + ": FAILED: MPI_SASPHY0_PAGEVERSION: HEADER\n")); +- dcsmisasprintk(ioc, printk(KERN_ERR ": rc=%x\n", rc)); +- karg.IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; +- goto cim_sata_signature_exit; +- } +- +- if (hdr.ExtPageLength == 0) { +- /* Don't check if this failed. Already in a +- * failure case. +- */ +- dcsmisasprintk(ioc, +- printk(KERN_ERR ": hdr.ExtPageLength == 0\n")); ++ dcsmisasprintk(ioc, printk(KERN_ERR ": rc=%x\n",rc)); ++ karg.IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; ++ goto cim_sata_signature_exit; ++ } ++ ++ if (hdr.ExtPageLength == 0) { ++ /* Don't check if this failed. Already in a ++ * failure case. ++ */ ++ dcsmisasprintk(ioc, printk(KERN_ERR ": hdr.ExtPageLength == 0\n")); + karg.IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; + goto cim_sata_signature_exit; + } +@@ -1667,9 +1704,8 @@ + sasPhyPg0 = (SasPhyPage0_t *) pci_alloc_consistent(ioc->pcidev, + sasPhyPg0_data_sz, &sasPhyPg0_dma); + +- if (!sasPhyPg0) { +- dcsmisasprintk(ioc, +- printk(KERN_ERR ": pci_alloc_consistent: FAILED\n")); ++ if (! sasPhyPg0) { ++ dcsmisasprintk(ioc, printk(KERN_ERR ": pci_alloc_consistent: FAILED\n")); + karg.IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; + goto cim_sata_signature_exit; + } +@@ -1684,7 +1720,7 @@ + */ + dcsmisasprintk(ioc, printk(KERN_ERR + ": FAILED: MPI_SASPHY0_PAGEVERSION: PAGE\n")); +- dcsmisasprintk(ioc, printk(KERN_ERR ": rc=%x\n", rc)); ++ dcsmisasprintk(ioc, printk(KERN_ERR ": rc=%x\n",rc)); + karg.IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; + goto cim_sata_signature_exit; + } +@@ -1692,8 +1728,7 @@ + /* Make sure a SATA device is attached. */ + if ((le32_to_cpu(sasPhyPg0->AttachedDeviceInfo) & + MPI_SAS_DEVICE_INFO_SATA_DEVICE) == 0) { +- dcsmisasprintk(ioc, +- printk(KERN_WARNING ": NOT A SATA DEVICE\n")); ++ dcsmisasprintk(ioc, printk(KERN_WARNING ": NOT A SATA DEVICE\n")); + karg.IoctlHeader.ReturnCode = CSMI_SAS_NO_SATA_DEVICE; + goto cim_sata_signature_exit; + } +@@ -1720,14 +1755,13 @@ + if ((rc = mpt_config(ioc, &cfg)) != 0) { + dcsmisasprintk(ioc, printk(KERN_ERR + ": FAILED: MPI_SASDEVICE1_PAGEVERSION: HEADER\n")); +- dcsmisasprintk(ioc, printk(KERN_ERR ": rc=%x\n", rc)); +- karg.IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; +- goto cim_sata_signature_exit; +- } +- +- if (hdr.ExtPageLength == 0) { +- dcsmisasprintk(ioc, printk(KERN_ERR +- ": hdr.ExtPageLength == 0\n")); ++ dcsmisasprintk(ioc, printk(KERN_ERR ": rc=%x\n",rc)); ++ karg.IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; ++ goto cim_sata_signature_exit; ++ } ++ ++ if (hdr.ExtPageLength == 0) { ++ dcsmisasprintk(ioc, printk(KERN_ERR ": hdr.ExtPageLength == 0\n")); + karg.IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; + goto cim_sata_signature_exit; + } +@@ -1738,9 +1772,8 @@ + sasDevicePg1 = (SasDevicePage1_t *) pci_alloc_consistent + (ioc->pcidev, sasDevicePg1_data_sz, &sasDevicePg1_dma); + +- if (!sasDevicePg1) { +- dcsmisasprintk(ioc, printk(KERN_ERR +- ": pci_alloc_consistent: FAILED\n")); ++ if (! sasDevicePg1) { ++ dcsmisasprintk(ioc, printk(KERN_ERR ": pci_alloc_consistent: FAILED\n")); + karg.IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; + goto cim_sata_signature_exit; + } +@@ -1752,31 +1785,29 @@ + if ((rc = mpt_config(ioc, &cfg)) != 0) { + dcsmisasprintk(ioc, printk(KERN_ERR + ": FAILED: MPI_SASDEVICE1_PAGEVERSION: PAGE\n")); +- dcsmisasprintk(ioc, printk(KERN_ERR ": rc=%x\n", rc)); +- karg.IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; +- goto cim_sata_signature_exit; +- } +- +- dcsmisasprintk(ioc, printk(KERN_DEBUG +- "---- SAS DEVICE PAGE 1 ---------\n")); +- dcsmisasprintk(ioc, printk(KERN_DEBUG +- "Handle=0x%x\n", sasDevicePg1->DevHandle)); ++ dcsmisasprintk(ioc, printk(KERN_ERR ": rc=%x\n",rc)); ++ karg.IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; ++ goto cim_sata_signature_exit; ++ } ++ ++/* EDM : dump Device Page 1 data*/ ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "---- SAS DEVICE PAGE 1 ---------\n")); ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "Handle=0x%x\n",sasDevicePg1->DevHandle)); + memcpy(&sas_address, &sasDevicePg1->SASAddress, sizeof(u64)); + dcsmisasprintk(ioc, printk(KERN_DEBUG "SAS Address=0x%llX\n", + (unsigned long long)sas_address)); + dcsmisasprintk(ioc, printk(KERN_DEBUG "\n")); +- dcsmisasprintk(ioc, printk(KERN_DEBUG +- "Target ID=0x%x\n", sasDevicePg1->TargetID)); +- dcsmisasprintk(ioc, printk(KERN_DEBUG +- "Bus=0x%x\n", sasDevicePg1->Bus)); ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "Target ID=0x%x\n",sasDevicePg1->TargetID)); ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "Bus=0x%x\n",sasDevicePg1->Bus)); + dcsmisasprintk(ioc, printk(KERN_DEBUG "Initial Reg Device FIS=")); +- for (jj = 0; jj < 20; jj++) ++ for(jj=0;jj<20;jj++) + dcsmisasprintk(ioc, printk("%02x ", + ((u8 *)&sasDevicePg1->InitialRegDeviceFIS)[jj])); + dcsmisasprintk(ioc, printk(KERN_DEBUG "\n\n")); ++/* EDM : debug data */ + + memcpy(karg.Signature.bSignatureFIS, +- sasDevicePg1->InitialRegDeviceFIS, 20); ++ sasDevicePg1->InitialRegDeviceFIS,20); + + cim_sata_signature_exit: + +@@ -1794,11 +1825,11 @@ + sizeof(CSMI_SAS_SATA_SIGNATURE_BUFFER))) { + printk(KERN_ERR "%s@%d::%s() - " + "Unable to write out csmi_sas_sata_signature @ %p\n", +- __FILE__, __LINE__, __func__, uarg); +- return -EFAULT; +- } +- +- dcsmisasprintk(ioc, printk(KERN_DEBUG "%s exit.\n", __func__)); ++ __FILE__, __LINE__, __FUNCTION__, uarg); ++ return -EFAULT; ++ } ++ ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "%s exit.\n",__FUNCTION__)); + return 0; + } + +@@ -1824,24 +1855,24 @@ + sizeof(CSMI_SAS_GET_DEVICE_ADDRESS_BUFFER))) { + printk(KERN_ERR "%s@%d::%s() - " + "Unable to read in csmi_sas_get_device_address_buffer struct @ %p\n", +- __FILE__, __LINE__, __func__, uarg); +- return -EFAULT; +- } +- +- if (((iocnum = mpt_verify_adapter(karg.IoctlHeader.IOControllerNumber, +- &ioc)) < 0) || (ioc == NULL)) { +- printk(KERN_ERR "%s::%s() @%d - ioc%d not found!\n", +- __FILE__, __func__, __LINE__, iocnum); +- return -ENODEV; +- } +- +- if (!csmisas_is_this_sas_cntr(ioc)) { +- printk(KERN_ERR "%s::%s() @%d - ioc%d not SAS controller!\n", +- __FILE__, __func__, __LINE__, iocnum); +- return -ENODEV; +- } +- +- dcsmisasprintk(ioc, printk(KERN_DEBUG "%s enter.\n", __func__)); ++ __FILE__, __LINE__, __FUNCTION__, uarg); ++ return -EFAULT; ++ } ++ ++ if (((iocnum = mpt_verify_adapter(karg.IoctlHeader.IOControllerNumber, ++ &ioc)) < 0) || (ioc == NULL)) { ++ printk(KERN_ERR "%s::%s() @%d - ioc%d not found!\n", ++ __FILE__, __FUNCTION__, __LINE__, iocnum); ++ return -ENODEV; ++ } ++ ++ if (!csmisas_is_this_sas_cntr(ioc)) { ++ printk(KERN_ERR "%s::%s() @%d - ioc%d not SAS controller!\n", ++ __FILE__, __FUNCTION__, __LINE__, iocnum); ++ return -ENODEV; ++ } ++ ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "%s enter.\n",__FUNCTION__)); + + karg.IoctlHeader.ReturnCode = CSMI_SAS_NO_DEVICE_ADDRESS; + memset(karg.bSASAddress, 0, sizeof(u64)); +@@ -1865,11 +1896,11 @@ + sizeof(CSMI_SAS_GET_DEVICE_ADDRESS_BUFFER))) { + printk(KERN_ERR "%s@%d::%s() - " + "Unable to write out csmi_sas_get_device_address_buffer @ %p\n", +- __FILE__, __LINE__, __func__, uarg); +- return -EFAULT; +- } +- +- dcsmisasprintk(ioc, printk(KERN_DEBUG "%s exit.\n", __func__)); ++ __FILE__, __LINE__, __FUNCTION__, uarg); ++ return -EFAULT; ++ } ++ ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "%s exit.\n",__FUNCTION__)); + return 0; + } + +@@ -1902,36 +1933,35 @@ + u16 ioc_status; + u32 MsgContext; + +- sasPhyPage1 = NULL; +- sasPhyPage1_data_sz = 0; ++ sasPhyPage1=NULL; ++ sasPhyPage1_data_sz=0; + + if (copy_from_user(&karg, uarg, + sizeof(CSMI_SAS_LINK_ERRORS_BUFFER))) { + printk(KERN_ERR "%s@%d::%s() - " + "Unable to read in csmisas_get_link_errors struct @ %p\n", +- __FILE__, __LINE__, __func__, uarg); +- return -EFAULT; +- } +- +- if (((iocnum = mpt_verify_adapter(karg.IoctlHeader.IOControllerNumber, +- &ioc)) < 0) || (ioc == NULL)) { +- printk(KERN_ERR "%s::%s() @%d - ioc%d not found!\n", +- __FILE__, __func__, __LINE__, iocnum); +- return -ENODEV; +- } +- +- if (!csmisas_is_this_sas_cntr(ioc)) { +- printk(KERN_ERR "%s::%s() @%d - ioc%d not SAS controller!\n", +- __FILE__, __func__, __LINE__, iocnum); +- return -ENODEV; +- } +- +- dcsmisasprintk(ioc, printk(KERN_DEBUG "%s enter.\n", __func__)); ++ __FILE__, __LINE__, __FUNCTION__, uarg); ++ return -EFAULT; ++ } ++ ++ if (((iocnum = mpt_verify_adapter(karg.IoctlHeader.IOControllerNumber, ++ &ioc)) < 0) || (ioc == NULL)) { ++ printk(KERN_ERR "%s::%s() @%d - ioc%d not found!\n", ++ __FILE__, __FUNCTION__, __LINE__, iocnum); ++ return -ENODEV; ++ } ++ ++ if (!csmisas_is_this_sas_cntr(ioc)) { ++ printk(KERN_ERR "%s::%s() @%d - ioc%d not SAS controller!\n", ++ __FILE__, __FUNCTION__, __LINE__, iocnum); ++ return -ENODEV; ++ } ++ ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "%s enter.\n",__FUNCTION__)); + phyId = karg.Information.bPhyIdentifier; + if (phyId >= ioc->num_ports) { + karg.IoctlHeader.ReturnCode = CSMI_SAS_PHY_DOES_NOT_EXIST; +- dcsmisasprintk(ioc, printk(KERN_WARNING +- ": phyId >= ioc->num_ports\n")); ++ dcsmisasprintk(ioc, printk(KERN_WARNING ": phyId >= ioc->num_ports\n")); + goto cim_get_link_errors_exit; + } + +@@ -1963,17 +1993,16 @@ + */ + dcsmisasprintk(ioc, printk(KERN_ERR + ": FAILED: MPI_SASPHY1_PAGEVERSION: HEADER\n")); +- dcsmisasprintk(ioc, printk(KERN_ERR ": rc=%x\n", rc)); +- karg.IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; +- goto cim_get_link_errors_exit; +- } +- +- if (hdr.ExtPageLength == 0) { +- /* Don't check if this failed. Already in a +- * failure case. +- */ +- dcsmisasprintk(ioc, printk(KERN_ERR +- ": hdr.ExtPageLength == 0\n")); ++ dcsmisasprintk(ioc, printk(KERN_ERR ": rc=%x\n",rc)); ++ karg.IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; ++ goto cim_get_link_errors_exit; ++ } ++ ++ if (hdr.ExtPageLength == 0) { ++ /* Don't check if this failed. Already in a ++ * failure case. ++ */ ++ dcsmisasprintk(ioc, printk(KERN_ERR ": hdr.ExtPageLength == 0\n")); + karg.IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; + goto cim_get_link_errors_exit; + } +@@ -1985,9 +2014,8 @@ + sasPhyPage1 = (SasPhyPage1_t *) pci_alloc_consistent(ioc->pcidev, + sasPhyPage1_data_sz, &sasPhyPage1_dma); + +- if (!sasPhyPage1) { +- dcsmisasprintk(ioc, printk(KERN_ERR +- ": pci_alloc_consistent: FAILED\n")); ++ if (! sasPhyPage1) { ++ dcsmisasprintk(ioc, printk(KERN_ERR ": pci_alloc_consistent: FAILED\n")); + karg.IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; + goto cim_get_link_errors_exit; + } +@@ -2000,25 +2028,24 @@ + /* Don't check if this failed. Already in a + * failure case. + */ +- dcsmisasprintk(ioc, printk(KERN_ERR +- ": FAILED: MPI_SASPHY1_PAGEVERSION: PAGE\n")); +- dcsmisasprintk(ioc, printk(KERN_ERR ": rc=%x\n", rc)); +- karg.IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; +- goto cim_get_link_errors_exit; +- } +- +- dcsmisasprintk(ioc, printk(KERN_DEBUG +- "---- SAS PHY PAGE 1 ------------\n")); ++ dcsmisasprintk(ioc, printk(KERN_ERR ": FAILED: MPI_SASPHY1_PAGEVERSION: PAGE\n")); ++ dcsmisasprintk(ioc, printk(KERN_ERR ": rc=%x\n",rc)); ++ karg.IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; ++ goto cim_get_link_errors_exit; ++ } ++ ++/* EDM : dump PHY Page 1 data*/ ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "---- SAS PHY PAGE 1 ------------\n")); + dcsmisasprintk(ioc, printk(KERN_DEBUG "Invalid Dword Count=0x%x\n", + sasPhyPage1->InvalidDwordCount)); +- dcsmisasprintk(ioc, printk(KERN_DEBUG +- "Running Disparity Error Count=0x%x\n", ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "Running Disparity Error Count=0x%x\n", + sasPhyPage1->RunningDisparityErrorCount)); + dcsmisasprintk(ioc, printk(KERN_DEBUG "Loss Dword Synch Count=0x%x\n", + sasPhyPage1->LossDwordSynchCount)); + dcsmisasprintk(ioc, printk(KERN_DEBUG "PHY Reset Problem Count=0x%x\n", + sasPhyPage1->PhyResetProblemCount)); + dcsmisasprintk(ioc, printk(KERN_DEBUG "\n\n")); ++/* EDM : debug data */ + + karg.Information.uInvalidDwordCount = + le32_to_cpu(sasPhyPage1->InvalidDwordCount); +@@ -2030,7 +2057,7 @@ + le32_to_cpu(sasPhyPage1->PhyResetProblemCount); + + if (karg.Information.bResetCounts == +- CSMI_SAS_LINK_ERROR_DONT_RESET_COUNTS) { ++ CSMI_SAS_LINK_ERROR_DONT_RESET_COUNTS ) { + goto cim_get_link_errors_exit; + } + +@@ -2045,12 +2072,12 @@ + dcsmisasprintk(ioc, printk(KERN_ERR ": no msg frames!\n")); + karg.IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; + goto cim_get_link_errors_exit; +- } ++ } + + mpi_hdr = (MPIHeader_t *) mf; + MsgContext = mpi_hdr->MsgContext; + sasIoUnitCntrReq = (SasIoUnitControlRequest_t *)mf; +- memset(sasIoUnitCntrReq, 0, sizeof(SasIoUnitControlRequest_t)); ++ memset(sasIoUnitCntrReq,0,sizeof(SasIoUnitControlRequest_t)); + sasIoUnitCntrReq->Function = MPI_FUNCTION_SAS_IO_UNIT_CONTROL; + sasIoUnitCntrReq->MsgContext = MsgContext; + sasIoUnitCntrReq->PhyNum = phyId; +@@ -2070,10 +2097,8 @@ + & MPI_IOCSTATUS_MASK; + + if (ioc_status != MPI_IOCSTATUS_SUCCESS) { +- dcsmisasprintk(ioc, printk(KERN_DEBUG +- ": SAS IO Unit Control: ")); +- dcsmisasprintk(ioc, printk( +- "IOCStatus=0x%X IOCLogInfo=0x%X\n", ++ dcsmisasprintk(ioc, printk(KERN_DEBUG ": SAS IO Unit Control: ")); ++ dcsmisasprintk(ioc, printk("IOCStatus=0x%X IOCLogInfo=0x%X\n", + sasIoUnitCntrReply->IOCStatus, + sasIoUnitCntrReply->IOCLogInfo)); + } +@@ -2091,11 +2116,11 @@ + sizeof(CSMI_SAS_LINK_ERRORS_BUFFER))) { + printk(KERN_ERR "%s@%d::%s() - " + "Unable to write out csmisas_get_link_errors @ %p\n", +- __FILE__, __LINE__, __func__, uarg); +- return -EFAULT; +- } +- +- dcsmisasprintk(ioc, printk(KERN_DEBUG "%s exit.\n", __func__)); ++ __FILE__, __LINE__, __FUNCTION__, uarg); ++ return -EFAULT; ++ } ++ ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "%s exit.\n",__FUNCTION__)); + return 0; + + } +@@ -2120,10 +2145,10 @@ + MPIHeader_t *mpi_hdr; + char *psge; + int iocnum, flagsLength; +- void *request_data; ++ void * request_data; + dma_addr_t request_data_dma; + u32 request_data_sz; +- void *response_data; ++ void * response_data; + dma_addr_t response_data_dma; + u32 response_data_sz; + u16 ioc_status; +@@ -2136,11 +2161,11 @@ + memory_pages = get_order(malloc_data_sz); + karg = (CSMI_SAS_SMP_PASSTHRU_BUFFER *)__get_free_pages( + GFP_KERNEL, memory_pages); +- if (!karg) { ++ if (!karg){ + printk(KERN_ERR "%s@%d::%s() - " + "Unable to malloc CSMI_SAS_SMP_PASSTHRU_BUFFER " + "malloc_data_sz=%d memory_pages=%d\n", +- __FILE__, __LINE__, __func__, ++ __FILE__, __LINE__, __FUNCTION__, + malloc_data_sz, memory_pages); + return -ENOMEM; + } +@@ -2148,7 +2173,7 @@ + if (copy_from_user(karg, uarg, sizeof(CSMI_SAS_SMP_PASSTHRU_BUFFER))) { + printk(KERN_ERR "%s@%d::%s() - " + "Unable to read in csmi_sas_smp_passthru struct @ %p\n", +- __FILE__, __LINE__, __func__, uarg); ++ __FILE__, __LINE__, __FUNCTION__, uarg); + free_pages((unsigned long)karg, memory_pages); + return -EFAULT; + } +@@ -2161,7 +2186,7 @@ + if (((iocnum = mpt_verify_adapter(karg->IoctlHeader.IOControllerNumber, + &ioc)) < 0) || (ioc == NULL)) { + printk(KERN_ERR "%s::%s() @%d - ioc%d not found!\n", +- __FILE__, __func__, __LINE__, iocnum); ++ __FILE__, __FUNCTION__, __LINE__, iocnum); + free_pages((unsigned long)karg, memory_pages); + return -ENODEV; + } +@@ -2169,19 +2194,19 @@ + if (ioc->ioc_reset_in_progress) { + printk(KERN_ERR "%s@%d::%s - " + "Busy with IOC Reset \n", +- __FILE__, __LINE__, __func__); ++ __FILE__, __LINE__,__FUNCTION__); + free_pages((unsigned long)karg, memory_pages); + return -EBUSY; + } + + if (!csmisas_is_this_sas_cntr(ioc)) { + printk(KERN_ERR "%s::%s() @%d - ioc%d not SAS controller!\n", +- __FILE__, __func__, __LINE__, iocnum); +- free_pages((unsigned long)karg, memory_pages); +- return -ENODEV; +- } +- +- dcsmisasprintk(ioc, printk(KERN_DEBUG "%s enter.\n", __func__)); ++ __FILE__, __FUNCTION__, __LINE__, iocnum); ++ free_pages((unsigned long)karg, memory_pages); ++ return -ENODEV; ++ } ++ ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "%s enter.\n",__FUNCTION__)); + + /* Default to success.*/ + karg->IoctlHeader.ReturnCode = CSMI_SAS_STATUS_SUCCESS; +@@ -2203,13 +2228,13 @@ + dcsmisasprintk(ioc, printk(KERN_ERR ": no msg frames!\n")); + karg->IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; + goto cim_smp_passthru_exit; +- } ++ } + + mpi_hdr = (MPIHeader_t *) mf; + MsgContext = mpi_hdr->MsgContext; +- smpReq = (pSmpPassthroughRequest_t) mf; +- +- memset(smpReq, 0, ioc->req_sz); ++ smpReq = (pSmpPassthroughRequest_t ) mf; ++ ++ memset(smpReq,0,ioc->req_sz); + + memcpy(&sas_address, karg->Parameters.bDestinationSASAddress, + sizeof(u64)); +@@ -2245,8 +2270,7 @@ + ioc->pcidev, request_data_sz, &request_data_dma); + + if (!request_data) { +- dcsmisasprintk(ioc, printk(KERN_ERR +- ": pci_alloc_consistent: FAILED\n")); ++ dcsmisasprintk(ioc, printk(KERN_ERR ": pci_alloc_consistent: FAILED\n")); + karg->IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; + mpt_free_msg_frame(ioc, mf); + goto cim_smp_passthru_exit; +@@ -2262,8 +2286,7 @@ + ioc->pcidev, response_data_sz, &response_data_dma); + + if (!response_data) { +- dcsmisasprintk(ioc, printk(KERN_ERR +- ": pci_alloc_consistent: FAILED\n")); ++ dcsmisasprintk(ioc, printk(KERN_ERR ": pci_alloc_consistent: FAILED\n")); + karg->IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; + mpt_free_msg_frame(ioc, mf); + goto cim_smp_passthru_exit; +@@ -2279,29 +2302,26 @@ + + ioc->add_sge(psge, flagsLength, response_data_dma); + +- if (csmisas_send_command_wait(ioc, mf, karg->IoctlHeader.Timeout) +- != 0) { ++ if (csmisas_send_command_wait(ioc, mf, karg->IoctlHeader.Timeout) != 0) { + karg->IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; + goto cim_smp_passthru_exit; + } + + if ((ioc->ioctl_cmds.status & MPT_MGMT_STATUS_RF_VALID) == 0) { +- dcsmisasprintk(ioc, printk(KERN_DEBUG +- ": SMP Passthru: oh no, there is no reply!!")); ++ dcsmisasprintk(ioc, printk(KERN_DEBUG ": SMP Passthru: oh no, there is no reply!!")); + karg->IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; + goto cim_smp_passthru_exit; + } + + /* process the completed Reply Message Frame */ +- smpReply = (pSmpPassthroughReply_t)ioc->ioctl_cmds.reply; ++ smpReply = (pSmpPassthroughReply_t )ioc->ioctl_cmds.reply; + ioc_status = le16_to_cpu(smpReply->IOCStatus) & MPI_IOCSTATUS_MASK; + + if ((ioc_status != MPI_IOCSTATUS_SUCCESS) && + (ioc_status != MPI_IOCSTATUS_SCSI_DATA_UNDERRUN)) { + karg->IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; + dcsmisasprintk(ioc, printk(KERN_DEBUG ": SMP Passthru: ")); +- dcsmisasprintk(ioc, printk( +- "IOCStatus=0x%X IOCLogInfo=0x%X SASStatus=0x%X\n", ++ dcsmisasprintk(ioc, printk("IOCStatus=0x%X IOCLogInfo=0x%X SASStatus=0x%X\n", + le16_to_cpu(smpReply->IOCStatus), + le32_to_cpu(smpReply->IOCLogInfo), + smpReply->SASStatus)); +@@ -2313,8 +2333,7 @@ + + + if (le16_to_cpu(smpReply->ResponseDataLength)) { +- karg->Parameters.uResponseBytes +- = le16_to_cpu(smpReply->ResponseDataLength); ++ karg->Parameters.uResponseBytes = le16_to_cpu(smpReply->ResponseDataLength); + memcpy(&karg->Parameters.Response, + response_data, le16_to_cpu(smpReply->ResponseDataLength)); + } +@@ -2336,13 +2355,13 @@ + sizeof(CSMI_SAS_SMP_PASSTHRU_BUFFER))) { + printk(KERN_ERR "%s@%d::%s() - " + "Unable to write out csmi_sas_smp_passthru @ %p\n", +- __FILE__, __LINE__, __func__, uarg); +- free_pages((unsigned long)karg, memory_pages); +- return -EFAULT; +- } +- +- free_pages((unsigned long)karg, memory_pages); +- dcsmisasprintk(ioc, printk(KERN_DEBUG ": %s exit.\n", __func__)); ++ __FILE__, __LINE__, __FUNCTION__, uarg); ++ free_pages((unsigned long)karg, memory_pages); ++ return -EFAULT; ++ } ++ ++ free_pages((unsigned long)karg, memory_pages); ++ dcsmisasprintk(ioc, printk(KERN_DEBUG ": %s exit.\n",__FUNCTION__)); + return 0; + } + +@@ -2357,18 +2376,18 @@ + static int csmisas_ssp_passthru(unsigned long arg) + { + CSMI_SAS_SSP_PASSTHRU_BUFFER __user *uarg = (void __user *) arg; +- CSMI_SAS_SSP_PASSTHRU_BUFFER karg_hdr, *karg; ++ CSMI_SAS_SSP_PASSTHRU_BUFFER karg_hdr, * karg; + MPT_ADAPTER *ioc = NULL; + pSCSIIORequest_t pScsiRequest; + pSCSIIOReply_t pScsiReply; + MPT_FRAME_HDR *mf = NULL; + MPIHeader_t *mpi_hdr; +- int iocnum, ii; ++ int iocnum,ii; + u64 sas_address; + u16 req_idx; + char *psge; + int flagsLength; +- void *request_data; ++ void * request_data; + dma_addr_t request_data_dma; + u32 request_data_sz; + int malloc_data_sz; +@@ -2383,11 +2402,10 @@ + u8 skey, asc, ascq; + u32 MsgContext; + +- if (copy_from_user(&karg_hdr, uarg, +- sizeof(CSMI_SAS_SSP_PASSTHRU_BUFFER))) { ++ if (copy_from_user(&karg_hdr, uarg, sizeof(CSMI_SAS_SSP_PASSTHRU_BUFFER))) { + printk(KERN_ERR "%s@%d::%s() - " + "Unable to read in csmi_sas_ssp_passthru struct @ %p\n", +- __FILE__, __LINE__, __func__, uarg); ++ __FILE__, __LINE__, __FUNCTION__, uarg); + return -EFAULT; + } + +@@ -2404,11 +2422,11 @@ + memory_pages = get_order(malloc_data_sz); + karg = (CSMI_SAS_SSP_PASSTHRU_BUFFER *)__get_free_pages( + GFP_KERNEL, memory_pages); +- if (!karg) { ++ if (!karg){ + printk(KERN_ERR "%s@%d::%s() - " + "Unable to malloc SAS_SSP_PASSTHRU_BUFFER " + "malloc_data_sz=%d memory_pages=%d\n", +- __FILE__, __LINE__, __func__, ++ __FILE__, __LINE__, __FUNCTION__, + malloc_data_sz, memory_pages); + return -ENOMEM; + } +@@ -2416,10 +2434,10 @@ + memset(karg, 0, sizeof(*karg)); + + if (copy_from_user(karg, uarg, request_data_sz + +- offsetof(CSMI_SAS_SSP_PASSTHRU_BUFFER, bDataBuffer))) { ++ offsetof(CSMI_SAS_SSP_PASSTHRU_BUFFER,bDataBuffer))) { + printk(KERN_ERR "%s@%d::%s() - " + "Unable to read in csmi_sas_ssp_passthru struct @ %p\n", +- __FILE__, __LINE__, __func__, uarg); ++ __FILE__, __LINE__, __FUNCTION__, uarg); + free_pages((unsigned long)karg, memory_pages); + return -EFAULT; + } +@@ -2427,43 +2445,40 @@ + /* + * some checks of the incoming frame + */ +- if (offsetof(CSMI_SAS_SSP_PASSTHRU_BUFFER, bDataBuffer) + ++ if ( offsetof(CSMI_SAS_SSP_PASSTHRU_BUFFER,bDataBuffer) + + request_data_sz - sizeof(IOCTL_HEADER) > +- karg->IoctlHeader.Length) { +- karg->IoctlHeader.ReturnCode +- = CSMI_SAS_STATUS_INVALID_PARAMETER; ++ karg->IoctlHeader.Length ) { ++ karg->IoctlHeader.ReturnCode = CSMI_SAS_STATUS_INVALID_PARAMETER; + dcsmisasprintk(ioc, printk(KERN_ERR + "%s::%s()" + " @%d - expected datalen incorrect!\n", +- __FILE__, __func__, __LINE__)); ++ __FILE__, __FUNCTION__, __LINE__)); + goto cim_ssp_passthru_exit; + } + + if (((iocnum = mpt_verify_adapter(karg->IoctlHeader.IOControllerNumber, + &ioc)) < 0) || (ioc == NULL)) { +- karg->IoctlHeader.ReturnCode +- = CSMI_SAS_STATUS_INVALID_PARAMETER; +- printk(KERN_ERR "%s::%s() @%d - ioc%d not found!\n", +- __FILE__, __func__, __LINE__, iocnum); ++ karg->IoctlHeader.ReturnCode = CSMI_SAS_STATUS_INVALID_PARAMETER; ++ printk(KERN_ERR "%s::%s() @%d - ioc%d not found!\n", ++ __FILE__, __FUNCTION__, __LINE__, iocnum); + goto cim_ssp_passthru_exit; + } + + if (ioc->ioc_reset_in_progress) { + printk(KERN_ERR "%s@%d::%s - " + "Busy with IOC Reset \n", +- __FILE__, __LINE__, __func__); ++ __FILE__, __LINE__,__FUNCTION__); + return -EBUSY; + } + + if (!csmisas_is_this_sas_cntr(ioc)) { +- karg->IoctlHeader.ReturnCode +- = CSMI_SAS_STATUS_INVALID_PARAMETER; ++ karg->IoctlHeader.ReturnCode = CSMI_SAS_STATUS_INVALID_PARAMETER; + printk(KERN_ERR "%s::%s()@%d - ioc%d not SAS controller!\n", +- __FILE__, __func__, __LINE__, iocnum); +- goto cim_ssp_passthru_exit; +- } +- +- dcsmisasprintk(ioc, printk(KERN_DEBUG "%s enter.\n", __func__)); ++ __FILE__, __FUNCTION__, __LINE__, iocnum); ++ goto cim_ssp_passthru_exit; ++ } ++ ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "%s enter.\n",__FUNCTION__)); + + /* Default to success. + */ +@@ -2477,7 +2492,7 @@ + dcsmisasprintk(ioc, printk(KERN_ERR + "%s::%s()" + " @%d - incorrect bPhyIdentifier and bPortIdentifier!\n", +- __FILE__, __func__, __LINE__)); ++ __FILE__, __FUNCTION__, __LINE__)); + goto cim_ssp_passthru_exit; + } + +@@ -2487,8 +2502,7 @@ + + /* Is the phy in range? */ + if (karg->Parameters.bPhyIdentifier >= ioc->num_ports) { +- dcsmisasprintk(ioc, printk(KERN_WARNING +- ": phyId >= ioc->num_ports (%d %d)\n", ++ dcsmisasprintk(ioc, printk(KERN_WARNING ": phyId >= ioc->num_ports (%d %d)\n", + karg->Parameters.bPhyIdentifier, + ioc->num_ports)); + karg->IoctlHeader.ReturnCode = +@@ -2497,9 +2511,10 @@ + } + } + +- if (karg->Parameters.bAdditionalCDBLength) { +- dcsmisasprintk(ioc, printk(KERN_DEBUG +- ": greater than 16-byte cdb " ++ if(karg->Parameters.bAdditionalCDBLength) { ++ /* TODO - SCSI IO (32) Request Message support ++ */ ++ dcsmisasprintk(ioc, printk(KERN_DEBUG ": greater than 16-byte cdb " + "is not supported!\n")); + karg->IoctlHeader.ReturnCode = + CSMI_SAS_STATUS_INVALID_PARAMETER; +@@ -2523,7 +2538,7 @@ + CSMI_SAS_STATUS_INVALID_PARAMETER; + dcsmisasprintk(ioc, printk(KERN_ERR + "%s::%s() @%d - couldn't find associated " +- "SASAddress=%llX!\n", __FILE__, __func__, __LINE__, ++ "SASAddress=%llX!\n", __FILE__, __FUNCTION__, __LINE__, + (unsigned long long)sas_address)); + goto cim_ssp_passthru_exit; + } +@@ -2543,21 +2558,20 @@ + dcsmisasprintk(ioc, printk(KERN_ERR ": no msg frames!\n")); + karg->IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; + goto cim_ssp_passthru_exit; +- } ++ } + + mpi_hdr = (MPIHeader_t *) mf; + MsgContext = mpi_hdr->MsgContext; + pScsiRequest = (pSCSIIORequest_t) mf; + req_idx = le16_to_cpu(mf->u.frame.hwhdr.msgctxu.fld.req_idx); + +- memset(pScsiRequest, 0, sizeof(SCSIIORequest_t)); ++ memset(pScsiRequest,0,sizeof(SCSIIORequest_t)); + + /* Fill in SCSI IO (16) request. + */ + + pScsiRequest->Function = (is_hidden_raid_component == 1) ? +- MPI_FUNCTION_RAID_SCSI_IO_PASSTHROUGH +- : MPI_FUNCTION_SCSI_IO_REQUEST; ++ MPI_FUNCTION_RAID_SCSI_IO_PASSTHROUGH : MPI_FUNCTION_SCSI_IO_REQUEST; + pScsiRequest->TargetID = id; + pScsiRequest->Bus = channel; + memcpy(pScsiRequest->LUN, &karg->Parameters.bLun, 8); +@@ -2569,11 +2583,10 @@ + + dcsmisasprintk(ioc, printk(KERN_DEBUG "\tchannel = %d id = %d ", + sas_info->fw.channel, sas_info->fw.id)); +- dcsmisasprintk(ioc, if (is_hidden_raid_component) ++ dcsmisasprintk(ioc, if(is_hidden_raid_component) + printk(KERN_DEBUG "num_id = %d ", id)); + dcsmisasprintk(ioc, printk(KERN_DEBUG "\n")); +- dcsmisasprintk(ioc, printk(KERN_DEBUG +- "\tcdb_len = %d request_len = %d\n", ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "\tcdb_len = %d request_len = %d\n", + pScsiRequest->CDBLength, request_data_sz)); + dcsmisasprintk(ioc, printk(KERN_DEBUG "\t")); + dcsmisasprintk(ioc, for (ii = 0; ii < pScsiRequest->CDBLength; ++ii) +@@ -2590,8 +2603,7 @@ + (!karg->Parameters.uDataLength)) { + /* no data transfer + */ +- pScsiRequest->Control +- = cpu_to_le32(MPI_SCSIIO_CONTROL_NODATATRANSFER); ++ pScsiRequest->Control = cpu_to_le32(MPI_SCSIIO_CONTROL_NODATATRANSFER); + } else { + /* no direction specified + */ +@@ -2606,23 +2618,19 @@ + + /* task attributes + */ +- if ((karg->Parameters.uFlags && 0xFF) == 0) { +- pScsiRequest->Control +- |= cpu_to_le32(MPI_SCSIIO_CONTROL_SIMPLEQ); ++ if((karg->Parameters.uFlags && 0xFF) == 0) { ++ pScsiRequest->Control |= cpu_to_le32(MPI_SCSIIO_CONTROL_SIMPLEQ); + } else if (karg->Parameters.uFlags & + CSMI_SAS_SSP_TASK_ATTRIBUTE_HEAD_OF_QUEUE) { +- pScsiRequest->Control +- |= cpu_to_le32(MPI_SCSIIO_CONTROL_HEADOFQ); ++ pScsiRequest->Control |= cpu_to_le32(MPI_SCSIIO_CONTROL_HEADOFQ); + } else if (karg->Parameters.uFlags & + CSMI_SAS_SSP_TASK_ATTRIBUTE_ORDERED) { +- pScsiRequest->Control +- |= cpu_to_le32(MPI_SCSIIO_CONTROL_ORDEREDQ); ++ pScsiRequest->Control |= cpu_to_le32(MPI_SCSIIO_CONTROL_ORDEREDQ); + } else if (karg->Parameters.uFlags & + CSMI_SAS_SSP_TASK_ATTRIBUTE_ACA) { + pScsiRequest->Control |= cpu_to_le32(MPI_SCSIIO_CONTROL_ACAQ); + } else { +- pScsiRequest->Control +- |= cpu_to_le32(MPI_SCSIIO_CONTROL_UNTAGGED); ++ pScsiRequest->Control |= cpu_to_le32(MPI_SCSIIO_CONTROL_UNTAGGED); + } + + /* setup sense +@@ -2639,20 +2647,19 @@ + flagsLength = MPT_SGE_FLAGS_SSIMPLE_WRITE; + } else if (karg->Parameters.uFlags & CSMI_SAS_SSP_READ) { + flagsLength = MPT_SGE_FLAGS_SSIMPLE_READ; +- } else { +- flagsLength = (MPI_SGE_FLAGS_SIMPLE_ELEMENT | +- MPI_SGE_FLAGS_DIRECTION) ++ }else { ++ flagsLength = ( MPI_SGE_FLAGS_SIMPLE_ELEMENT | ++ MPI_SGE_FLAGS_DIRECTION ) + << MPI_SGE_FLAGS_SHIFT; + } + flagsLength |= request_data_sz; + +- if (request_data_sz > 0) { ++ if ( request_data_sz > 0) { + request_data = pci_alloc_consistent( + ioc->pcidev, request_data_sz, &request_data_dma); + + if (request_data == NULL) { +- dcsmisasprintk(ioc, printk(KERN_ERR +- ": pci_alloc_consistent: FAILED " ++ dcsmisasprintk(ioc, printk(KERN_ERR ": pci_alloc_consistent: FAILED " + "request_data_sz=%d\n", request_data_sz)); + karg->IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; + mpt_free_msg_frame(ioc, mf); +@@ -2661,19 +2668,17 @@ + + ioc->add_sge(psge, flagsLength, request_data_dma); + if (karg->Parameters.uFlags & CSMI_SAS_SSP_WRITE) +- memcpy(request_data, karg->bDataBuffer, +- request_data_sz); ++ memcpy(request_data, karg->bDataBuffer, request_data_sz); + } else { + ioc->add_sge(psge, flagsLength, (dma_addr_t) -1); + } + +- if (csmisas_send_command_wait(ioc, mf, karg->IoctlHeader.Timeout) +- != 0) { +- karg->IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; +- goto cim_ssp_passthru_exit; +- } +- +- memset(&karg->Status, 0, sizeof(CSMI_SAS_SSP_PASSTHRU_STATUS)); ++ if (csmisas_send_command_wait(ioc, mf, karg->IoctlHeader.Timeout) != 0) { ++ karg->IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; ++ goto cim_ssp_passthru_exit; ++ } ++ ++ memset(&karg->Status,0,sizeof(CSMI_SAS_SSP_PASSTHRU_STATUS)); + karg->Status.bConnectionStatus = CSMI_SAS_OPEN_ACCEPT; + karg->Status.bDataPresent = CSMI_SAS_SSP_NO_DATA_PRESENT; + karg->Status.bStatus = GOOD; +@@ -2684,13 +2689,11 @@ + /* process the completed Reply Message Frame */ + if (ioc->ioctl_cmds.status & MPT_MGMT_STATUS_RF_VALID) { + +- pScsiReply = (pSCSIIOReply_t) ioc->ioctl_cmds.reply; ++ pScsiReply = (pSCSIIOReply_t ) ioc->ioctl_cmds.reply; + karg->Status.bStatus = pScsiReply->SCSIStatus; +- karg->Status.uDataBytes +- = min(le32_to_cpu(pScsiReply->TransferCount), ++ karg->Status.uDataBytes = min(le32_to_cpu(pScsiReply->TransferCount), + request_data_sz); +- ioc_status +- = le16_to_cpu(pScsiReply->IOCStatus) & MPI_IOCSTATUS_MASK; ++ ioc_status = le16_to_cpu(pScsiReply->IOCStatus) & MPI_IOCSTATUS_MASK; + + if (pScsiReply->SCSIState == + MPI_SCSI_STATE_AUTOSENSE_VALID) { +@@ -2698,28 +2701,26 @@ + CSMI_SAS_SSP_SENSE_DATA_PRESENT; + karg->Status.bResponseLength[0] = + (u8)le32_to_cpu(pScsiReply->SenseCount) & 0xFF; +- memcpy(karg->Status.bResponse, ioc->ioctl_cmds.sense, +- le32_to_cpu(pScsiReply->SenseCount)); ++ memcpy(karg->Status.bResponse, ++ ioc->ioctl_cmds.sense, le32_to_cpu(pScsiReply->SenseCount)); + + skey = ioc->ioctl_cmds.sense[2] & 0x0F; + asc = ioc->ioctl_cmds.sense[12]; + ascq = ioc->ioctl_cmds.sense[13]; + +- dcsmisasprintk(ioc, printk(KERN_DEBUG +- "\t [sense_key,asc,ascq]: " +- "[0x%02x,0x%02x,0x%02x]\n", +- skey, asc, ascq)); +- +- } else if (pScsiReply->SCSIState == ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "\t [sense_key,asc,ascq]: " ++ "[0x%02x,0x%02x,0x%02x]\n", ++ skey, asc, ascq)); ++ ++ } else if(pScsiReply->SCSIState == + MPI_SCSI_STATE_RESPONSE_INFO_VALID) { + karg->Status.bDataPresent = + CSMI_SAS_SSP_RESPONSE_DATA_PRESENT; + karg->Status.bResponseLength[0] = + sizeof(pScsiReply->ResponseInfo); +- for (ii = 0; ii < sizeof(pScsiReply->ResponseInfo); +- ii++) { ++ for (ii=0;iiResponseInfo);ii++) { + karg->Status.bResponse[ii] = +- ((u8 *)&pScsiReply->ResponseInfo)[ ++ ((u8*)&pScsiReply->ResponseInfo)[ + (sizeof(pScsiReply->ResponseInfo)-1)-ii]; + } + } else if ((ioc_status != MPI_IOCSTATUS_SUCCESS) && +@@ -2727,8 +2728,7 @@ + (ioc_status != MPI_IOCSTATUS_SCSI_DATA_UNDERRUN)) { + karg->IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; + dcsmisasprintk(ioc, printk(KERN_DEBUG ": SCSI IO : ")); +- dcsmisasprintk(ioc, +- printk("IOCStatus=0x%X IOCLogInfo=0x%X\n", ++ dcsmisasprintk(ioc, printk("IOCStatus=0x%X IOCLogInfo=0x%X\n", + pScsiReply->IOCStatus, + pScsiReply->IOCLogInfo)); + } +@@ -2740,8 +2740,8 @@ + request_data, karg->Status.uDataBytes)) { + printk(KERN_ERR "%s@%d::%s - " + "Unable to write data to user %p\n", +- __FILE__, __LINE__, __func__, +- (void *)karg->bDataBuffer); ++ __FILE__, __LINE__,__FUNCTION__, ++ (void*)karg->bDataBuffer); + karg->IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; + } + } +@@ -2759,12 +2759,12 @@ + offsetof(CSMI_SAS_SSP_PASSTHRU_BUFFER, bDataBuffer))) { + printk(KERN_ERR "%s@%d::%s() - " + "Unable to write out csmi_sas_ssp_passthru @ %p\n", +- __FILE__, __LINE__, __func__, uarg); +- free_pages((unsigned long)karg, memory_pages); +- return -EFAULT; +- } +- +- dcsmisasprintk(ioc, printk(KERN_DEBUG "%s exit.\n", __func__)); ++ __FILE__, __LINE__, __FUNCTION__, uarg); ++ free_pages((unsigned long)karg, memory_pages); ++ return -EFAULT; ++ } ++ ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "%s exit.\n",__FUNCTION__)); + free_pages((unsigned long)karg, memory_pages); + return 0; + } +@@ -2793,7 +2793,7 @@ + u16 req_idx; + char *psge; + int flagsLength; +- void *request_data; ++ void * request_data; + dma_addr_t request_data_dma; + u32 request_data_sz; + int malloc_data_sz; +@@ -2806,15 +2806,14 @@ + u16 ioc_status; + u32 MsgContext; + +- if (copy_from_user(&karg_hdr, uarg, +- sizeof(CSMI_SAS_STP_PASSTHRU_BUFFER))) { ++ if (copy_from_user(&karg_hdr, uarg, sizeof(CSMI_SAS_STP_PASSTHRU_BUFFER))) { + printk(KERN_ERR "%s@%d::%s() - " + "Unable to read struct @ %p\n", +- __FILE__, __LINE__, __func__, uarg); +- return -EFAULT; +- } +- +- request_data = NULL; ++ __FILE__, __LINE__, __FUNCTION__, uarg); ++ return -EFAULT; ++ } ++ ++ request_data=NULL; + request_data_sz = karg_hdr.Parameters.uDataLength; + volume_id = 0; + volume_bus = 0; +@@ -2826,11 +2825,11 @@ + memory_pages = get_order(malloc_data_sz); + karg = (CSMI_SAS_STP_PASSTHRU_BUFFER *)__get_free_pages( + GFP_KERNEL, memory_pages); +- if (!karg) { ++ if (!karg){ + printk(KERN_ERR "%s@%d::%s() - " + "Unable to malloc CSMI_SAS_STP_PASSTHRU_BUFFER " + "malloc_data_sz=%d memory_pages=%d\n", +- __FILE__, __LINE__, __func__, ++ __FILE__, __LINE__, __FUNCTION__, + malloc_data_sz, memory_pages); + return -ENOMEM; + } +@@ -2840,7 +2839,7 @@ + if (copy_from_user(karg, uarg, malloc_data_sz)) { + printk(KERN_ERR "%s@%d::%s() - " + "Unable to read in csmi_sas_ssp_passthru struct @ %p\n", +- __FILE__, __LINE__, __func__, uarg); ++ __FILE__, __LINE__, __FUNCTION__, uarg); + free_pages((unsigned long)karg, memory_pages); + return -EFAULT; + } +@@ -2848,7 +2847,7 @@ + if (((iocnum = mpt_verify_adapter(karg->IoctlHeader.IOControllerNumber, + &ioc)) < 0) || (ioc == NULL)) { + printk(KERN_ERR "%s::%s @%d - ioc%d not found!\n", +- __FILE__, __func__, __LINE__, iocnum); ++ __FILE__, __FUNCTION__, __LINE__, iocnum); + free_pages((unsigned long)karg, memory_pages); + return -ENODEV; + } +@@ -2856,19 +2855,19 @@ + if (ioc->ioc_reset_in_progress) { + printk(KERN_ERR "%s@%d::%s - " + "Busy with IOC Reset \n", +- __FILE__, __LINE__, __func__); ++ __FILE__, __LINE__,__FUNCTION__); + free_pages((unsigned long)karg, memory_pages); + return -EBUSY; + } + + if (!csmisas_is_this_sas_cntr(ioc)) { + printk(KERN_ERR "%s::%s() @%d - ioc%d not SAS controller!\n", +- __FILE__, __func__, __LINE__, iocnum); +- free_pages((unsigned long)karg, memory_pages); +- return -ENODEV; +- } +- +- dcsmisasprintk(ioc, printk(KERN_DEBUG "%s enter.\n", __func__)); ++ __FILE__, __FUNCTION__, __LINE__, iocnum); ++ free_pages((unsigned long)karg, memory_pages); ++ return -ENODEV; ++ } ++ ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "%s enter.\n",__FUNCTION__)); + + /* Default to success. + */ +@@ -2880,9 +2879,8 @@ + (karg->Parameters.bPortIdentifier == CSMI_SAS_IGNORE_PORT)) { + karg->IoctlHeader.ReturnCode = CSMI_SAS_SELECT_PHY_OR_PORT; + dcsmisasprintk(ioc, printk(KERN_ERR +- "%s::%s() @%d -incorrect bPhyIdentifier" +- " and bPortIdentifier!\n", +- __FILE__, __func__, __LINE__)); ++ "%s::%s() @%d - incorrect bPhyIdentifier and bPortIdentifier!\n", ++ __FILE__,__FUNCTION__, __LINE__)); + goto cim_stp_passthru_exit; + } + +@@ -2899,15 +2897,15 @@ + } + + data_sz = sizeof(CSMI_SAS_STP_PASSTHRU_BUFFER) - +- sizeof(IOCTL_HEADER) - sizeof(u8 *) + ++ sizeof(IOCTL_HEADER) - sizeof(u8*) + + request_data_sz; + +- if (data_sz > karg->IoctlHeader.Length) { ++ if ( data_sz > karg->IoctlHeader.Length ) { + karg->IoctlHeader.ReturnCode = + CSMI_SAS_STATUS_INVALID_PARAMETER; + dcsmisasprintk(ioc, printk(KERN_ERR + "%s::%s() @%d - expected datalen incorrect!\n", +- __FILE__, __func__, __LINE__)); ++ __FILE__, __FUNCTION__,__LINE__)); + goto cim_stp_passthru_exit; + } + +@@ -2929,7 +2927,7 @@ + CSMI_SAS_STATUS_INVALID_PARAMETER; + dcsmisasprintk(ioc, printk(KERN_ERR + "%s::%s() @%d - couldn't find associated " +- "SASAddress=%llX!\n", __FILE__, __func__, __LINE__, ++ "SASAddress=%llX!\n", __FILE__, __FUNCTION__, __LINE__, + (unsigned long long)sas_address)); + goto cim_stp_passthru_exit; + } +@@ -2939,8 +2937,8 @@ + + /* check that this is an STP or SATA target device + */ +- if (!(sas_info->device_info & MPI_SAS_DEVICE_INFO_STP_TARGET) && +- !(sas_info->device_info & MPI_SAS_DEVICE_INFO_SATA_DEVICE)) { ++ if ( !(sas_info->device_info & MPI_SAS_DEVICE_INFO_STP_TARGET ) && ++ !(sas_info->device_info & MPI_SAS_DEVICE_INFO_SATA_DEVICE )) { + karg->IoctlHeader.ReturnCode = + CSMI_SAS_STATUS_INVALID_PARAMETER; + goto cim_stp_passthru_exit; +@@ -2952,14 +2950,14 @@ + dcsmisasprintk(ioc, printk(KERN_ERR ": no msg frames!\n")); + karg->IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; + goto cim_stp_passthru_exit; +- } ++ } + + mpi_hdr = (MPIHeader_t *) mf; + MsgContext = mpi_hdr->MsgContext; + pSataRequest = (pSataPassthroughRequest_t) mf; + req_idx = le16_to_cpu(mf->u.frame.hwhdr.msgctxu.fld.req_idx); + +- memset(pSataRequest, 0, sizeof(pSataPassthroughRequest_t)); ++ memset(pSataRequest,0,sizeof(pSataPassthroughRequest_t)); + + pSataRequest->TargetID = id; + pSataRequest->Bus = channel; +@@ -2969,16 +2967,16 @@ + pSataRequest->MsgContext = MsgContext; + pSataRequest->DataLength = cpu_to_le32(request_data_sz); + pSataRequest->MsgFlags = 0; +- memcpy(pSataRequest->CommandFIS, karg->Parameters.bCommandFIS, 20); ++ memcpy( pSataRequest->CommandFIS,karg->Parameters.bCommandFIS, 20); + + psge = (char *)&pSataRequest->SGL; + if (karg->Parameters.uFlags & CSMI_SAS_STP_WRITE) { + flagsLength = MPT_SGE_FLAGS_SSIMPLE_WRITE; + } else if (karg->Parameters.uFlags & CSMI_SAS_STP_READ) { + flagsLength = MPT_SGE_FLAGS_SSIMPLE_READ; +- } else { +- flagsLength = (MPI_SGE_FLAGS_SIMPLE_ELEMENT | +- MPI_SGE_FLAGS_DIRECTION) ++ }else { ++ flagsLength = ( MPI_SGE_FLAGS_SIMPLE_ELEMENT | ++ MPI_SGE_FLAGS_DIRECTION ) + << MPI_SGE_FLAGS_SHIFT; + } + +@@ -2988,8 +2986,7 @@ + ioc->pcidev, request_data_sz, &request_data_dma); + + if (request_data == NULL) { +- dcsmisasprintk(ioc, printk(KERN_ERR +- ": pci_alloc_consistent: FAILED\n")); ++ dcsmisasprintk(ioc, printk(KERN_ERR ": pci_alloc_consistent: FAILED\n")); + karg->IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; + mpt_free_msg_frame(ioc, mf); + goto cim_stp_passthru_exit; +@@ -2997,37 +2994,33 @@ + + ioc->add_sge(psge, flagsLength, request_data_dma); + if (karg->Parameters.uFlags & CSMI_SAS_SSP_WRITE) +- memcpy(request_data, karg->bDataBuffer, +- request_data_sz); ++ memcpy(request_data, karg->bDataBuffer, request_data_sz); + } else { + ioc->add_sge(psge, flagsLength, (dma_addr_t) -1); + } + +- if (csmisas_send_command_wait(ioc, mf, karg->IoctlHeader.Timeout) +- != 0) { +- karg->IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; +- goto cim_stp_passthru_exit; +- } +- +- memset(&karg->Status, 0, sizeof(CSMI_SAS_STP_PASSTHRU_STATUS)); ++ if (csmisas_send_command_wait(ioc, mf, karg->IoctlHeader.Timeout) != 0) { ++ karg->IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; ++ goto cim_stp_passthru_exit; ++ } ++ ++ memset(&karg->Status,0,sizeof(CSMI_SAS_STP_PASSTHRU_STATUS)); + + if ((ioc->ioctl_cmds.status & MPT_MGMT_STATUS_RF_VALID) == 0) { +- dcsmisasprintk(ioc, printk(KERN_DEBUG +- ": STP Passthru: oh no, there is no reply!!")); ++ dcsmisasprintk(ioc, printk(KERN_DEBUG ": STP Passthru: oh no, there is no reply!!")); + karg->IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; + goto cim_stp_passthru_exit; + } + + /* process the completed Reply Message Frame */ +- pSataReply = (pSataPassthroughReply_t) ioc->ioctl_cmds.reply; ++ pSataReply = (pSataPassthroughReply_t ) ioc->ioctl_cmds.reply; + ioc_status = le16_to_cpu(pSataReply->IOCStatus) & MPI_IOCSTATUS_MASK; + + if (ioc_status != MPI_IOCSTATUS_SUCCESS && + ioc_status != MPI_IOCSTATUS_SCSI_DATA_UNDERRUN) { + karg->IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; + dcsmisasprintk(ioc, printk(KERN_DEBUG ": STP Passthru: ")); +- dcsmisasprintk(ioc, +- printk("IOCStatus=0x%X IOCLogInfo=0x%X SASStatus=0x%X\n", ++ dcsmisasprintk(ioc, printk("IOCStatus=0x%X IOCLogInfo=0x%X SASStatus=0x%X\n", + le16_to_cpu(pSataReply->IOCStatus), + le32_to_cpu(pSataReply->IOCLogInfo), + pSataReply->SASStatus)); +@@ -3036,27 +3029,26 @@ + karg->Status.bConnectionStatus = + map_sas_status_to_csmi(pSataReply->SASStatus); + +- memcpy(karg->Status.bStatusFIS, pSataReply->StatusFIS, 20); ++ memcpy(karg->Status.bStatusFIS,pSataReply->StatusFIS, 20); + + /* + * for now, just zero out uSCR array, + * then copy the one dword returned + * in the reply frame into uSCR[0] + */ +- memset(karg->Status.uSCR, 0, 64); ++ memset( karg->Status.uSCR, 0, 64); + karg->Status.uSCR[0] = le32_to_cpu(pSataReply->StatusControlRegisters); + +- if ((le32_to_cpu(pSataReply->TransferCount)) && (request_data) && ++ if((le32_to_cpu(pSataReply->TransferCount)) && (request_data) && + (karg->Parameters.uFlags & CSMI_SAS_STP_READ)) { + karg->Status.uDataBytes = +- min(le32_to_cpu(pSataReply->TransferCount), +- request_data_sz); ++ min(le32_to_cpu(pSataReply->TransferCount),request_data_sz); + if (copy_to_user((void __user *)uarg->bDataBuffer, + request_data, karg->Status.uDataBytes)) { + printk(KERN_ERR "%s::%s() @%d - " + "Unable to write data to user %p\n", +- __FILE__, __func__, __LINE__, +- (void *)karg->bDataBuffer); ++ __FILE__, __FUNCTION__, __LINE__, ++ (void*)karg->bDataBuffer); + karg->IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; + } + } +@@ -3073,13 +3065,13 @@ + offsetof(CSMI_SAS_STP_PASSTHRU_BUFFER, bDataBuffer))) { + printk(KERN_ERR "%s@%d::%s() - " + "Unable to write out csmi_sas_ssp_passthru @ %p\n", +- __FILE__, __LINE__, __func__, uarg); +- free_pages((unsigned long)karg, memory_pages); +- return -EFAULT; +- } +- +- free_pages((unsigned long)karg, memory_pages); +- dcsmisasprintk(ioc, printk(KERN_DEBUG ": %s exit.\n", __func__)); ++ __FILE__, __LINE__, __FUNCTION__, uarg); ++ free_pages((unsigned long)karg, memory_pages); ++ return -EFAULT; ++ } ++ ++ free_pages((unsigned long)karg, memory_pages); ++ dcsmisasprintk(ioc, printk(KERN_DEBUG ": %s exit.\n",__FUNCTION__)); + return 0; + } + +@@ -3098,30 +3090,30 @@ + CSMI_SAS_FIRMWARE_DOWNLOAD_BUFFER karg; + MPT_ADAPTER *ioc = NULL; + int iocnum; +- pMpiFwHeader_t pFwHeader = NULL; ++ pMpiFwHeader_t pFwHeader=NULL; + + if (copy_from_user(&karg, uarg, + sizeof(CSMI_SAS_FIRMWARE_DOWNLOAD_BUFFER))) { + printk(KERN_ERR "%s@%d::%s() - " +- "Unable to read in csmi_sas_firmware_download struct@ %p\n", +- __FILE__, __LINE__, __func__, uarg); +- return -EFAULT; +- } +- +- if (((iocnum = mpt_verify_adapter(karg.IoctlHeader.IOControllerNumber, +- &ioc)) < 0) || (ioc == NULL)) { +- printk(KERN_ERR "%s::%s() @%d - ioc%d not found!\n", +- __FILE__, __func__, __LINE__, iocnum); +- return -ENODEV; +- } +- +- if (!csmisas_is_this_sas_cntr(ioc)) { +- printk(KERN_ERR "%s::%s() @%d - ioc%d not SAS controller!\n", +- __FILE__, __func__, __LINE__, iocnum); +- return -ENODEV; +- } +- +- dcsmisasprintk(ioc, printk(KERN_DEBUG "%s enter.\n", __func__)); ++ "Unable to read in csmi_sas_firmware_download struct @ %p\n", ++ __FILE__, __LINE__, __FUNCTION__, uarg); ++ return -EFAULT; ++ } ++ ++ if (((iocnum = mpt_verify_adapter(karg.IoctlHeader.IOControllerNumber, ++ &ioc)) < 0) || (ioc == NULL)) { ++ printk(KERN_ERR "%s::%s() @%d - ioc%d not found!\n", ++ __FILE__, __FUNCTION__, __LINE__, iocnum); ++ return -ENODEV; ++ } ++ ++ if (!csmisas_is_this_sas_cntr(ioc)) { ++ printk(KERN_ERR "%s::%s() @%d - ioc%d not SAS controller!\n", ++ __FILE__, __FUNCTION__, __LINE__, iocnum); ++ return -ENODEV; ++ } ++ ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "%s enter.\n",__FUNCTION__)); + + /* Default to success.*/ + karg.IoctlHeader.ReturnCode = CSMI_SAS_STATUS_SUCCESS; +@@ -3138,7 +3130,7 @@ + goto cim_firmware_download_exit; + } + +- if (karg.Information.uDownloadFlags & ++ if ( karg.Information.uDownloadFlags & + (CSMI_SAS_FWD_SOFT_RESET | CSMI_SAS_FWD_VALIDATE)) { + karg.IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; + karg.Information.usStatus = CSMI_SAS_FWD_REJECT; +@@ -3150,7 +3142,7 @@ + * fw image attached to end of incoming packet. + */ + pFwHeader = kmalloc(karg.Information.uBufferLength, GFP_KERNEL); +- if (!pFwHeader) { ++ if (!pFwHeader){ + karg.IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; + karg.Information.usStatus = CSMI_SAS_FWD_REJECT; + karg.Information.usSeverity = CSMI_SAS_FWD_ERROR; +@@ -3162,21 +3154,21 @@ + karg.Information.uBufferLength)) { + printk(KERN_ERR "%s@%d::%s() - " + "Unable to read in pFwHeader @ %p\n", +- __FILE__, __LINE__, __func__, uarg); +- return -EFAULT; +- } +- +- if (!((pFwHeader->Signature0 == MPI_FW_HEADER_SIGNATURE_0) && ++ __FILE__, __LINE__, __FUNCTION__, uarg); ++ return -EFAULT; ++ } ++ ++ if ( !((pFwHeader->Signature0 == MPI_FW_HEADER_SIGNATURE_0) && + (pFwHeader->Signature1 == MPI_FW_HEADER_SIGNATURE_1) && + (pFwHeader->Signature2 == MPI_FW_HEADER_SIGNATURE_2))) { +- /* the signature check failed */ ++ // the signature check failed + karg.IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; + karg.Information.usStatus = CSMI_SAS_FWD_REJECT; + karg.Information.usSeverity = CSMI_SAS_FWD_ERROR; + goto cim_firmware_download_exit; + } + +- if (mptctl_do_fw_download(karg.IoctlHeader.IOControllerNumber, ++ if ( mptctl_do_fw_download(karg.IoctlHeader.IOControllerNumber, + uarg->bDataBuffer, karg.Information.uBufferLength) + != 0) { + karg.IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; +@@ -3185,7 +3177,7 @@ + goto cim_firmware_download_exit; + } + +- if ((karg.Information.uDownloadFlags & CSMI_SAS_FWD_SOFT_RESET) || ++ if((karg.Information.uDownloadFlags & CSMI_SAS_FWD_SOFT_RESET) || + (karg.Information.uDownloadFlags & CSMI_SAS_FWD_HARD_RESET)) { + if (mpt_HardResetHandler(ioc, CAN_SLEEP) != 0) { + karg.IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; +@@ -3196,7 +3188,7 @@ + + cim_firmware_download_exit: + +- if (pFwHeader) ++ if(pFwHeader) + kfree(pFwHeader); + + /* Copy the data from kernel memory to user memory +@@ -3205,11 +3197,11 @@ + sizeof(CSMI_SAS_FIRMWARE_DOWNLOAD_BUFFER))) { + printk(KERN_ERR "%s@%d::%s() - " + "Unable to write out csmi_sas_firmware_download @ %p\n", +- __FILE__, __LINE__, __func__, uarg); +- return -EFAULT; +- } +- +- dcsmisasprintk(ioc, printk(KERN_DEBUG "%s exit.\n", __func__)); ++ __FILE__, __LINE__, __FUNCTION__, uarg); ++ return -EFAULT; ++ } ++ ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "%s exit.\n",__FUNCTION__)); + return 0; + } + +@@ -3235,24 +3227,24 @@ + if (copy_from_user(&karg, uarg, sizeof(CSMI_SAS_RAID_INFO_BUFFER))) { + printk(KERN_ERR "%s@%d::%s() - " + "Unable to read in csmi_sas_get_raid_info struct @ %p\n", +- __FILE__, __LINE__, __func__, uarg); +- return -EFAULT; +- } +- +- if (((iocnum = mpt_verify_adapter(karg.IoctlHeader.IOControllerNumber, +- &ioc)) < 0) || (ioc == NULL)) { +- printk(KERN_ERR "%s::%s() @%d - ioc%d not found!\n", +- __FILE__, __func__, __LINE__, iocnum); +- return -ENODEV; +- } +- +- if (!csmisas_is_this_sas_cntr(ioc)) { +- printk(KERN_ERR "%s::%s() @%d - ioc%d not SAS controller!\n", +- __FILE__, __func__, __LINE__, iocnum); +- return -ENODEV; +- } +- +- dcsmisasprintk(ioc, printk(KERN_DEBUG "%s enter.\n", __func__)); ++ __FILE__, __LINE__, __FUNCTION__, uarg); ++ return -EFAULT; ++ } ++ ++ if (((iocnum = mpt_verify_adapter(karg.IoctlHeader.IOControllerNumber, ++ &ioc)) < 0) || (ioc == NULL)) { ++ printk(KERN_ERR "%s::%s() @%d - ioc%d not found!\n", ++ __FILE__, __FUNCTION__, __LINE__, iocnum); ++ return -ENODEV; ++ } ++ ++ if (!csmisas_is_this_sas_cntr(ioc)) { ++ printk(KERN_ERR "%s::%s() @%d - ioc%d not SAS controller!\n", ++ __FILE__, __FUNCTION__, __LINE__, iocnum); ++ return -ENODEV; ++ } ++ ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "%s enter.\n",__FUNCTION__)); + + karg.IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; + if (!ioc->raid_data.pIocPg2) +@@ -3260,8 +3252,8 @@ + karg.Information.uNumRaidSets = + ioc->raid_data.pIocPg2->NumActiveVolumes; + karg.Information.uMaxRaidSets = ioc->raid_data.pIocPg2->MaxVolumes; +- if (ioc->raid_data.pIocPg6) { +- /* get absolute maximum for all RAID sets */ ++ if( ioc->raid_data.pIocPg6 ) { ++ // get absolute maximum for all RAID sets + maxDrivesPerSet = ioc->raid_data.pIocPg6->MaxDrivesIS; + maxDrivesPerSet = max(ioc->raid_data.pIocPg6->MaxDrivesIM, + maxDrivesPerSet); +@@ -3271,19 +3263,17 @@ + } + else + karg.Information.uMaxDrivesPerSet = 8; +- /* For bMaxRaidSets, count bits set in bits 0-6 of CapabilitiesFlags */ ++ // For bMaxRaidSets, count bits set in bits 0-6 of CapabilitiesFlags + raidFlags = ioc->raid_data.pIocPg2->CapabilitiesFlags & 0x0000007F; +- for (maxRaidTypes = 0; raidFlags; maxRaidTypes++) ++ for( maxRaidTypes=0; raidFlags; maxRaidTypes++ ) + raidFlags &= raidFlags - 1; + karg.Information.bMaxRaidTypes = maxRaidTypes; +- /* ulMinRaidSetBlocks hard coded to 1MB until available +- * from config page +- */ ++ // ulMinRaidSetBlocks hard coded to 1MB until available from config page + karg.Information.ulMinRaidSetBlocks.uLowPart = 2048; + karg.Information.ulMinRaidSetBlocks.uHighPart = 0; + karg.Information.ulMaxRaidSetBlocks.uLowPart = 0xffffffff; +- if (ioc->raid_data.pIocPg2->CapabilitiesFlags & +- MPI_IOCPAGE2_CAP_FLAGS_RAID_64_BIT_ADDRESSING) ++ if( ioc->raid_data.pIocPg2->CapabilitiesFlags & ++ MPI_IOCPAGE2_CAP_FLAGS_RAID_64_BIT_ADDRESSING ) + karg.Information.ulMaxRaidSetBlocks.uHighPart = 0xffffffff; + else + karg.Information.ulMaxRaidSetBlocks.uHighPart = 0; +@@ -3303,11 +3293,11 @@ + sizeof(CSMI_SAS_RAID_INFO_BUFFER))) { + printk(KERN_ERR "%s@%d::%s() - " + "Unable to write out csmi_sas_get_raid_info @ %p\n", +- __FILE__, __LINE__, __func__, uarg); +- return -EFAULT; +- } +- +- dcsmisasprintk(ioc, printk(KERN_DEBUG "%s exit.\n", __func__)); ++ __FILE__, __LINE__, __FUNCTION__, uarg); ++ return -EFAULT; ++ } ++ ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "%s exit.\n",__FUNCTION__)); + return 0; + } + +@@ -3325,8 +3315,7 @@ + * Remark: Wait to return until reply processed by the ISR. + **/ + static int +-csmisas_do_raid(MPT_ADAPTER *ioc, u8 action, u8 PhysDiskNum, u8 VolumeBus, +- u8 VolumeId, pMpiRaidActionReply_t reply) ++csmisas_do_raid(MPT_ADAPTER *ioc, u8 action, u8 PhysDiskNum, u8 VolumeBus, u8 VolumeId, pMpiRaidActionReply_t reply) + { + MpiRaidActionRequest_t *pReq; + MpiRaidActionReply_t *pReply; +@@ -3349,6 +3338,7 @@ + pReq->MsgFlags = 0; + pReq->Reserved2 = 0; + pReq->ActionDataWord = 0; /* Reserved for this action */ ++ //pReq->ActionDataSGE = 0; + + ioc->add_sge((char *)&pReq->ActionDataSGE, + MPT_SGE_FLAGS_SSIMPLE_READ | 0, (dma_addr_t) -1); +@@ -3357,7 +3347,7 @@ + return -ENODATA; + + if ((ioc->ioctl_cmds.status & MPT_MGMT_STATUS_RF_VALID) && +- (reply != NULL)) { ++ (reply != NULL)){ + pReply = (MpiRaidActionReply_t *)&(ioc->ioctl_cmds.reply); + memcpy(reply, pReply, + min(ioc->reply_sz, +@@ -3381,7 +3371,7 @@ + **/ + static int + csmisas_raid_inq(MPT_ADAPTER *ioc, u8 opcode, u8 bus, u8 id, u8 inq_vpd_page, +- u8 *inq_vpd, u32 inq_vpd_sz) ++ u8 * inq_vpd, u32 inq_vpd_sz) + { + MPT_FRAME_HDR *mf = NULL; + MPIHeader_t *mpi_hdr; +@@ -3389,7 +3379,7 @@ + u16 req_idx; + char *psge; + u8 inq_vpd_cdb[6]; +- u8 *request_data = NULL; ++ u8 *request_data=NULL; + dma_addr_t request_data_dma; + u32 request_data_sz; + int rc = 0; +@@ -3419,14 +3409,14 @@ + pScsiRequest = (pSCSIIORequest_t) mf; + req_idx = le16_to_cpu(mf->u.frame.hwhdr.msgctxu.fld.req_idx); + +- memset(pScsiRequest, 0, sizeof(SCSIIORequest_t)); ++ memset(pScsiRequest,0,sizeof(SCSIIORequest_t)); + pScsiRequest->Function = opcode; + pScsiRequest->TargetID = id; + pScsiRequest->Bus = bus; + pScsiRequest->CDBLength = 6; + pScsiRequest->DataLength = cpu_to_le32(request_data_sz); + pScsiRequest->MsgContext = MsgContext; +- memcpy(pScsiRequest->CDB, inq_vpd_cdb, pScsiRequest->CDBLength); ++ memcpy(pScsiRequest->CDB,inq_vpd_cdb,pScsiRequest->CDBLength); + pScsiRequest->Control = cpu_to_le32(MPI_SCSIIO_CONTROL_READ); + pScsiRequest->Control |= cpu_to_le32(MPI_SCSIIO_CONTROL_SIMPLEQ); + pScsiRequest->MsgFlags &= ~MPI_SCSIIO_MSGFLGS_SENSE_WIDTH; +@@ -3444,18 +3434,17 @@ + + if (request_data == NULL) { + mpt_free_msg_frame(ioc, mf); +- rc = -1; ++ rc=-1; + goto csmisas_raid_inq_exit; + } + +- memset(request_data, 0, request_data_sz); ++ memset(request_data,0,request_data_sz); + psge = (char *)&pScsiRequest->SGL; + ioc->add_sge(psge, (MPT_SGE_FLAGS_SSIMPLE_READ | 0xFC) , + request_data_dma); + +- if (csmisas_send_command_wait(ioc, mf, MPT_IOCTL_DEFAULT_TIMEOUT) +- != 0) { +- rc = -1; ++ if (csmisas_send_command_wait(ioc, mf, MPT_IOCTL_DEFAULT_TIMEOUT) != 0) { ++ rc=-1; + goto csmisas_raid_inq_exit; + } + +@@ -3483,7 +3472,7 @@ + csmisas_get_raid_config(unsigned long arg) + { + CSMI_SAS_RAID_CONFIG_BUFFER __user *uarg = (void __user *) arg; +- CSMI_SAS_RAID_CONFIG_BUFFER karg, *pKarg = NULL; ++ CSMI_SAS_RAID_CONFIG_BUFFER karg,*pKarg=NULL; + CONFIGPARMS cfg; + ConfigPageHeader_t header; + MPT_ADAPTER *ioc = NULL; +@@ -3509,7 +3498,7 @@ + if (copy_from_user(&karg, uarg, sizeof(IOCTL_HEADER))) { + printk(KERN_ERR "%s@%d::%s() - " + "Unable to read in csmisas_get_raid_config struct @ %p\n", +- __FILE__, __LINE__, __func__, uarg); ++ __FILE__, __LINE__, __FUNCTION__, uarg); + return -EFAULT; + } + +@@ -3517,11 +3506,11 @@ + memory_pages = get_order(csmi_sas_raid_config_buffer_sz); + pKarg = (CSMI_SAS_RAID_CONFIG_BUFFER *)__get_free_pages( + GFP_KERNEL, memory_pages); +- if (!pKarg) { ++ if (!pKarg){ + printk(KERN_ERR "%s@%d::%s() - " + "Unable to malloc RAID_CONFIG_BUFFER " + "csmi_sas_raid_config_buffer_sz=%d memory_pages=%d\n", +- __FILE__, __LINE__, __func__, ++ __FILE__, __LINE__, __FUNCTION__, + csmi_sas_raid_config_buffer_sz, memory_pages); + return -ENOMEM; + } +@@ -3530,7 +3519,7 @@ + if (copy_from_user(pKarg, uarg, csmi_sas_raid_config_buffer_sz)) { + printk(KERN_ERR "%s@%d::%s() - " + "Unable to read in csmisas_get_raid_config struct @ %p\n", +- __FILE__, __LINE__, __func__, uarg); ++ __FILE__, __LINE__, __FUNCTION__, uarg); + free_pages((unsigned long)pKarg, memory_pages); + return -EFAULT; + } +@@ -3538,22 +3527,22 @@ + if (((iocnum = mpt_verify_adapter(pKarg->IoctlHeader.IOControllerNumber, + &ioc)) < 0) || (ioc == NULL)) { + printk(KERN_ERR "%s::%s() @%d - ioc%d not found!\n", +- __FILE__, __func__, __LINE__, iocnum); +- free_pages((unsigned long)pKarg, memory_pages); +- return -ENODEV; +- } +- +- if (!csmisas_is_this_sas_cntr(ioc)) { +- printk(KERN_ERR "%s::%s() @%d - ioc%d not SAS controller!\n", +- __FILE__, __func__, __LINE__, iocnum); +- free_pages((unsigned long)pKarg, memory_pages); +- return -ENODEV; +- } +- +- dcsmisasprintk(ioc, printk(KERN_DEBUG "%s enter.\n", __func__)); ++ __FILE__, __FUNCTION__, __LINE__, iocnum); ++ free_pages((unsigned long)pKarg, memory_pages); ++ return -ENODEV; ++ } ++ ++ if (!csmisas_is_this_sas_cntr(ioc)) { ++ printk(KERN_ERR "%s::%s() @%d - ioc%d not SAS controller!\n", ++ __FILE__, __FUNCTION__, __LINE__, iocnum); ++ free_pages((unsigned long)pKarg, memory_pages); ++ return -ENODEV; ++ } ++ ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "%s enter.\n",__FUNCTION__)); + + if (pKarg->Configuration.uChangeCount != 0 && +- pKarg->Configuration.uChangeCount != ioc->csmi_change_count) { ++ pKarg->Configuration.uChangeCount != ioc->csmi_change_count ) { + pKarg->IoctlHeader.ReturnCode = + CSMI_SAS_STATUS_INVALID_PARAMETER; + pKarg->Configuration.uFailureCode = +@@ -3626,7 +3615,7 @@ + pKarg->Configuration.uStripeSize = + le32_to_cpu(pVolume0->StripeSize)/2; + +- switch (pVolume0->VolumeType) { ++ switch(pVolume0->VolumeType) { + case MPI_RAID_VOL_TYPE_IS: + pKarg->Configuration.bRaidType = CSMI_SAS_RAID_TYPE_0; + break; +@@ -3647,8 +3636,7 @@ + break; + case MPI_RAIDVOL0_STATUS_STATE_DEGRADED: + /* Volume is degraded, check if Resyncing or Inactive */ +- pKarg->Configuration.bStatus +- = CSMI_SAS_RAID_SET_STATUS_DEGRADED; ++ pKarg->Configuration.bStatus = CSMI_SAS_RAID_SET_STATUS_DEGRADED; + break; + case MPI_RAIDVOL0_STATUS_STATE_FAILED: + pKarg->Configuration.bStatus = CSMI_SAS_RAID_SET_STATUS_FAILED; +@@ -3661,26 +3649,25 @@ + pKarg->Configuration.bStatus = CSMI_SAS_RAID_SET_STATUS_OFFLINE; + else if (pVolume0->VolumeStatus.Flags & + MPI_RAIDVOL0_STATUS_FLAG_RESYNC_IN_PROGRESS) +- pKarg->Configuration.bStatus +- = CSMI_SAS_RAID_SET_STATUS_REBUILDING; ++ pKarg->Configuration.bStatus = CSMI_SAS_RAID_SET_STATUS_REBUILDING; + + pKarg->Configuration.bInformation = 0; /* default */ +- if (pVolume0->VolumeStatus.Flags & +- MPI_RAIDVOL0_STATUS_FLAG_RESYNC_IN_PROGRESS) { +- +- uint64_t *ptrUint64; ++ if(pVolume0->VolumeStatus.Flags & ++ MPI_RAIDVOL0_STATUS_FLAG_RESYNC_IN_PROGRESS ) { ++ ++ uint64_t * ptrUint64; + uint64_t totalBlocks64, blocksRemaining64; + uint32_t totalBlocks32, blocksRemaining32; + + /* get percentage complete */ +- pRaidActionReply = kmalloc(sizeof(MPI_RAID_VOL_INDICATOR) + +- offsetof(MSG_RAID_ACTION_REPLY, ActionData), ++ pRaidActionReply = kmalloc( sizeof(MPI_RAID_VOL_INDICATOR) + ++ offsetof(MSG_RAID_ACTION_REPLY,ActionData), + GFP_KERNEL); + +- if (!pRaidActionReply) { ++ if (!pRaidActionReply){ + printk(KERN_ERR "%s@%d::%s() - " + "Unable to malloc @ %p\n", +- __FILE__, __LINE__, __func__, pKarg); ++ __FILE__, __LINE__, __FUNCTION__,pKarg); + goto cim_get_raid_config_exit; + } + memset(pRaidActionReply, 0, sizeof(*pRaidActionReply)); +@@ -3693,14 +3680,14 @@ + totalBlocks64 = *ptrUint64; + ptrUint64++; + blocksRemaining64 = *ptrUint64; +- while (totalBlocks64 > 0xFFFFFFFFUL) { ++ while(totalBlocks64 > 0xFFFFFFFFUL){ + totalBlocks64 = totalBlocks64 >> 1; + blocksRemaining64 = blocksRemaining64 >> 1; + } + totalBlocks32 = (uint32_t)totalBlocks64; + blocksRemaining32 = (uint32_t)blocksRemaining64; + +- if (totalBlocks32) ++ if(totalBlocks32) + pKarg->Configuration.bInformation = + (totalBlocks32 - blocksRemaining32) / + (totalBlocks32 / 100); +@@ -3726,14 +3713,15 @@ + pKarg->Configuration.Data->ulRaidSetBlocks.uHighPart = + le32_to_cpu(pVolume0->MaxLBAHigh); + if (pVolume0->VolumeType == MPI_RAID_VOL_TYPE_IS || +- pVolume0->VolumeType == MPI_RAID_VOL_TYPE_IME) { ++ pVolume0->VolumeType == MPI_RAID_VOL_TYPE_IME ) { + pKarg->Configuration.Data->uStripeSizeInBlocks = + le32_to_cpu(pVolume0->StripeSize); + } else { + pKarg->Configuration.Data->uStripeSizeInBlocks = 0; + } + pKarg->Configuration.Data->uSectorsPerTrack = 128; +- for (i = 0; i < 16; i++) { ++ for (i=0; i<16; i++) { ++ // unsupported + pKarg->Configuration.Data->bApplicationScratchPad[i] = + 0xFF; + } +@@ -3744,15 +3732,15 @@ + (pKarg->Configuration.Data->uNumberOfHeads * + pKarg->Configuration.Data->uSectorsPerTrack)); + pKarg->Configuration.Data->uNumberOfTracks = tmpTotalMaxLBA; +- } else if (pKarg->Configuration.bDataType == +- CSMI_SAS_RAID_DATA_DEVICE_ID) { ++ } else if ( pKarg->Configuration.bDataType == ++ CSMI_SAS_RAID_DATA_DEVICE_ID ) { + /* Send inquiry to get VPD Page 0x83 */ + u32 vpd_page_sz; + vpd_page_sz = csmi_sas_raid_config_buffer_sz - +- offsetof(CSMI_SAS_RAID_CONFIG, DeviceId); ++ offsetof(CSMI_SAS_RAID_CONFIG,DeviceId); + if (csmisas_raid_inq(ioc, MPI_FUNCTION_SCSI_IO_REQUEST, + VolumeBus, volumeID, 0x83, +- (u8 *)&pKarg->Configuration.DeviceId->bDeviceIdentificationVPDPage, ++ (u8*)&pKarg->Configuration.DeviceId->bDeviceIdentificationVPDPage, + vpd_page_sz) != 0) { + pKarg->IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; + goto cim_get_raid_config_exit; +@@ -3785,7 +3773,7 @@ + pIocPage5 = pci_alloc_consistent(ioc->pcidev, + ioc_page5_sz, + &ioc_page5_dma); +- memset(pIocPage5, 0, ioc_page5_sz); ++ memset(pIocPage5,0,ioc_page5_sz); + if (ioc_page5_dma) { + cfg.physAddr = ioc_page5_dma; + cfg.action = +@@ -3828,55 +3816,52 @@ + cfg.physAddr = physdisk0_dma; + + physDiskNumMax = (csmi_sas_raid_config_buffer_sz - +- offsetof(CSMI_SAS_RAID_CONFIG, Drives)) ++ offsetof(CSMI_SAS_RAID_CONFIG,Drives)) + / sizeof(CSMI_SAS_RAID_DRIVES); + + tmpTotalMaxLBA = totalMaxLBA; + if (pVolume0->VolumeType == MPI_RAID_VOL_TYPE_IS) { + do_div(tmpTotalMaxLBA, pVolume0->NumPhysDisks); +- dcsmisasprintk(ioc, printk(KERN_DEBUG +- "IS Volume tmpTotalMaxLBA=%llX\n", ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "IS Volume tmpTotalMaxLBA=%llX\n", + (unsigned long long)tmpTotalMaxLBA)); +- } else if (pVolume0->VolumeType == MPI_RAID_VOL_TYPE_IME) { ++ } ++ else if (pVolume0->VolumeType == MPI_RAID_VOL_TYPE_IME) { + do_div(tmpTotalMaxLBA, pVolume0->NumPhysDisks * 2); +- dcsmisasprintk(ioc, printk(KERN_DEBUG +- "IME Volume tmpTotalMaxLBA=%llX\n", ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "IME Volume tmpTotalMaxLBA=%llX\n", + (unsigned long long)tmpTotalMaxLBA)); + } else { +- dcsmisasprintk(ioc, printk(KERN_DEBUG +- "IM Volume tmpTotalMaxLBA=%llX\n", ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "IM Volume tmpTotalMaxLBA=%llX\n", + (unsigned long long)tmpTotalMaxLBA)); + } + +- for (i = 0; i < min(pVolume0->NumPhysDisks, physDiskNumMax); i++) { ++ for (i=0; i< min(pVolume0->NumPhysDisks, physDiskNumMax); i++) { + + physDiskNum = pVolume0->PhysDisk[i].PhysDiskNum; + cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT; + cfg.pageAddr = physDiskNum; +- if (mpt_config(ioc, &cfg) != 0) { ++ if (mpt_config(ioc, &cfg) != 0){ + pKarg->IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; + goto cim_get_raid_config_exit; + } + +- pKarg->Configuration.bDriveCount++; ++ pKarg->Configuration.bDriveCount++; + if (pKarg->Configuration.bDataType != CSMI_SAS_RAID_DATA_DRIVES) + continue; + + /* Search the list for the matching SAS address. */ +- sas_info = csmisas_get_device_component_by_fw(ioc, +- pPhysDisk0->PhysDiskBus, pPhysDisk0->PhysDiskID); ++ sas_info = csmisas_get_device_component_by_fw(ioc, pPhysDisk0->PhysDiskBus, ++ pPhysDisk0->PhysDiskID); + if (sas_info) { +- sas_address +- = reverse_byte_order64(sas_info->sas_address); ++ sas_address = reverse_byte_order64(sas_info->sas_address); + memcpy(pKarg->Configuration.Drives[i].bSASAddress, +- &sas_address, sizeof(u64)); ++ &sas_address,sizeof(u64)); + if (!device_info) + device_info = sas_info->device_info; + } + + memcpy(pKarg->Configuration.Drives[i].bModel, + pPhysDisk0->InquiryData.VendorID, +- offsetof(RAID_PHYS_DISK0_INQUIRY_DATA, ProductRevLevel)); ++ offsetof(RAID_PHYS_DISK0_INQUIRY_DATA,ProductRevLevel)); + memcpy(pKarg->Configuration.Drives[i].bFirmware, + pPhysDisk0->InquiryData.ProductRevLevel, + sizeof(pPhysDisk0->InquiryData.ProductRevLevel)); +@@ -3905,19 +3890,19 @@ + MPI_PHYSDISK0_STATUS_OFFLINE_REQUESTED) { + pKarg->Configuration.Drives[i].bDriveStatus = + CSMI_SAS_DRIVE_STATUS_OFFLINE; +- } else if (pPhysDisk0->PhysDiskStatus.State) { ++ } else if(pPhysDisk0->PhysDiskStatus.State) { + pKarg->Configuration.Drives[i].bDriveStatus = + CSMI_SAS_DRIVE_STATUS_FAILED; +- if (pKarg->Configuration.bStatus == ++ if(pKarg->Configuration.bStatus == + CSMI_SAS_RAID_SET_STATUS_DEGRADED) + pKarg->Configuration.bInformation = i; +- } else if ((pVolume0->VolumeStatus.Flags & ++ } else if((pVolume0->VolumeStatus.Flags & + MPI_RAIDVOL0_STATUS_FLAG_RESYNC_IN_PROGRESS) && + (pPhysDisk0->PhysDiskStatus.Flags & + MPI_PHYSDISK0_STATUS_FLAG_OUT_OF_SYNC)) + pKarg->Configuration.Drives[i].bDriveStatus = + CSMI_SAS_DRIVE_STATUS_REBUILDING; +- else if (pPhysDisk0->ErrorData.SmartCount || ++ else if(pPhysDisk0->ErrorData.SmartCount || + (pPhysDisk0->PhysDiskStatus.Flags & + MPI_PHYSDISK0_STATUS_FLAG_OUT_OF_SYNC)) + pKarg->Configuration.Drives[i].bDriveStatus = +@@ -3933,7 +3918,7 @@ + CSMI_SAS_DRIVE_TYPE_SINGLE_PORT_SAS; + if (mpt_raid_phys_disk_get_num_paths(ioc, + pVolume0->PhysDisk[i].PhysDiskNum) > 1) +- pKarg->Configuration.Drives[i].bDriveType = ++ pKarg->Configuration.Drives[i].bDriveType = + CSMI_SAS_DRIVE_TYPE_DUAL_PORT_SAS; + } + +@@ -3956,9 +3941,9 @@ + if ((pVolume0->VolumeSettings.HotSparePool & + pIocPage5->HotSpare[idx].HotSparePool) == 0) + continue; +- if (pIocPage5->HotSpare[idx].Flags != ++ if(pIocPage5->HotSpare[idx].Flags != + MPI_IOC_PAGE_5_HOT_SPARE_ACTIVE) +- continue; ++ continue; + physDiskNum = pIocPage5->HotSpare[idx].PhysDiskNum; + cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT; + cfg.pageAddr = physDiskNum; +@@ -3996,11 +3981,11 @@ + MPI_RAID_VOL_TYPE_IME) && + (((totalMaxLBA + + pVolume0->NumPhysDisks) * 2) + +- (64*2*1024) /*metadata = 64MB*/ > ++ (64*2*1024 ) /*metadata = 64MB*/ > + le32_to_cpu(pPhysDisk0->MaxLBA))) + continue; + +- pKarg->Configuration.bDriveCount++; ++ pKarg->Configuration.bDriveCount++; + if (pKarg->Configuration.bDataType != + CSMI_SAS_RAID_DATA_DRIVES) { + i++; +@@ -4011,16 +3996,14 @@ + sas_info = csmisas_get_device_component_by_fw(ioc, + pPhysDisk0->PhysDiskBus, pPhysDisk0->PhysDiskID); + if (sas_info) { +- sas_address = +- reverse_byte_order64(sas_info->sas_address); ++ sas_address = reverse_byte_order64(sas_info->sas_address); + memcpy(pKarg->Configuration.Drives[i].bSASAddress, +- &sas_address, sizeof(u64)); ++ &sas_address,sizeof(u64)); + } + + memcpy(pKarg->Configuration.Drives[i].bModel, + pPhysDisk0->InquiryData.VendorID, +- offsetof(RAID_PHYS_DISK0_INQUIRY_DATA, +- ProductRevLevel)); ++ offsetof(RAID_PHYS_DISK0_INQUIRY_DATA,ProductRevLevel)); + memcpy(pKarg->Configuration.Drives[i].bFirmware, + pPhysDisk0->InquiryData.ProductRevLevel, + sizeof(pPhysDisk0->InquiryData.ProductRevLevel)); +@@ -4038,10 +4021,10 @@ + } + pKarg->Configuration.Drives[i].bDriveStatus = + CSMI_SAS_DRIVE_STATUS_OK; +- if (pPhysDisk0->PhysDiskStatus.State) ++ if(pPhysDisk0->PhysDiskStatus.State) + pKarg->Configuration.Drives[i].bDriveStatus = + CSMI_SAS_DRIVE_STATUS_FAILED; +- else if (pPhysDisk0->ErrorData.SmartCount) ++ else if(pPhysDisk0->ErrorData.SmartCount) + pKarg->Configuration.Drives[i].bDriveStatus = + CSMI_SAS_DRIVE_STATUS_DEGRADED; + pKarg->Configuration.Drives[i].bDriveUsage = +@@ -4064,8 +4047,8 @@ + } + } + +- /* Only return data on the first 240 drives */ +- if (pKarg->Configuration.bDriveCount > 0xF0) ++ // Only return data on the first 240 drives ++ if( pKarg->Configuration.bDriveCount > 0xF0 ) + pKarg->Configuration.bDriveCount = + CSMI_SAS_RAID_DRIVE_COUNT_TOO_BIG; + +@@ -4077,11 +4060,11 @@ + pci_free_consistent(ioc->pcidev, volumepage0sz, pVolume0, + volume0_dma); + +- if (pPhysDisk0 != NULL) ++ if(pPhysDisk0 != NULL) + pci_free_consistent(ioc->pcidev, physdiskpage0sz, pPhysDisk0, + physdisk0_dma); + +- if (pIocPage5 != NULL) ++ if(pIocPage5 != NULL) + pci_free_consistent(ioc->pcidev, ioc_page5_sz, pIocPage5, + ioc_page5_dma); + +@@ -4092,17 +4075,17 @@ + switch (pKarg->Configuration.bDataType) { + case CSMI_SAS_RAID_DATA_ADDITIONAL_DATA: + copy_buffer_sz = sizeof(IOCTL_HEADER) + +- offsetof(CSMI_SAS_RAID_CONFIG, Data) + ++ offsetof(CSMI_SAS_RAID_CONFIG,Data) + + sizeof(CSMI_SAS_RAID_SET_ADDITIONAL_DATA); + break; + case CSMI_SAS_RAID_DATA_DRIVES: + if (pKarg->Configuration.bDriveCount == + CSMI_SAS_RAID_DRIVE_COUNT_SUPRESSED) + copy_buffer_sz = sizeof(IOCTL_HEADER) + +- offsetof(CSMI_SAS_RAID_CONFIG, Drives); +- else ++ offsetof(CSMI_SAS_RAID_CONFIG,Drives); ++ else + copy_buffer_sz = sizeof(IOCTL_HEADER) + +- offsetof(CSMI_SAS_RAID_CONFIG, Drives) + ++ offsetof(CSMI_SAS_RAID_CONFIG,Drives) + + (pKarg->Configuration.bDriveCount * + sizeof(CSMI_SAS_RAID_DRIVES)); + break; +@@ -4114,12 +4097,12 @@ + if (copy_to_user(uarg, pKarg, copy_buffer_sz)) { + printk(KERN_ERR "%s@%d::%s() - " + "Unable to write out csmi_sas_get_raid_config @ %p\n", +- __FILE__, __LINE__, __func__, uarg); +- free_pages((unsigned long)pKarg, memory_pages); +- return -EFAULT; +- } +- +- dcsmisasprintk(ioc, printk(KERN_DEBUG "%s exit.\n", __func__)); ++ __FILE__, __LINE__, __FUNCTION__, uarg); ++ free_pages((unsigned long)pKarg, memory_pages); ++ return -EFAULT; ++ } ++ ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "%s exit.\n",__FUNCTION__)); + free_pages((unsigned long)pKarg, memory_pages); + return 0; + } +@@ -4136,15 +4119,15 @@ + csmisas_get_raid_features(unsigned long arg) + { + CSMI_SAS_RAID_FEATURES_BUFFER __user *uarg = (void __user *) arg; +- CSMI_SAS_RAID_FEATURES_BUFFER karg, *pKarg = NULL; ++ CSMI_SAS_RAID_FEATURES_BUFFER karg, *pKarg=NULL; + int csmi_sas_raid_features_buffer_sz, iocnum; + int memory_pages; + MPT_ADAPTER *ioc = NULL; + + if (copy_from_user(&karg, uarg, sizeof(IOCTL_HEADER))) { +- printk(KERN_ERR "%s@%d::%s() - Unable to " +- "read in csmi_sas_get_raid_features struct @ %p\n", +- __FILE__, __LINE__, __func__, uarg); ++ printk(KERN_ERR "%s@%d::%s() - " ++ "Unable to read in csmi_sas_get_raid_features struct @ %p\n", ++ __FILE__, __LINE__, __FUNCTION__, uarg); + return -EFAULT; + } + +@@ -4152,20 +4135,20 @@ + memory_pages = get_order(csmi_sas_raid_features_buffer_sz); + pKarg = (CSMI_SAS_RAID_FEATURES_BUFFER *)__get_free_pages( + GFP_KERNEL, memory_pages); +- if (!pKarg) { ++ if (!pKarg){ + printk(KERN_ERR "%s@%d::%s() - " + "Unable to malloc RAID_FEATURES_BUFFER " + "csmi_sas_raid_features_buffer_sz=%d memory_pages=%d\n", +- __FILE__, __LINE__, __func__, ++ __FILE__, __LINE__, __FUNCTION__, + csmi_sas_raid_features_buffer_sz, memory_pages); + return -ENOMEM; + } + memset(pKarg, 0, sizeof(*pKarg)); + + if (copy_from_user(pKarg, uarg, csmi_sas_raid_features_buffer_sz)) { +- printk(KERN_ERR "%s@%d::%s() - Unable to " +- "read in csmi_sas_get_raid_features struct @ %p\n", +- __FILE__, __LINE__, __func__, uarg); ++ printk(KERN_ERR "%s@%d::%s() - " ++ "Unable to read in csmi_sas_get_raid_features struct @ %p\n", ++ __FILE__, __LINE__, __FUNCTION__, uarg); + free_pages((unsigned long)pKarg, memory_pages); + return -EFAULT; + } +@@ -4173,22 +4156,22 @@ + if (((iocnum = mpt_verify_adapter(pKarg->IoctlHeader.IOControllerNumber, + &ioc)) < 0) || (ioc == NULL)) { + printk(KERN_ERR "%s::%s() @%d - ioc%d not found!\n", +- __FILE__, __func__, __LINE__, iocnum); +- free_pages((unsigned long)pKarg, memory_pages); +- return -ENODEV; +- } +- +- if (!csmisas_is_this_sas_cntr(ioc)) { +- printk(KERN_ERR "%s::%s() @%d - ioc%d not SAS controller!\n", +- __FILE__, __func__, __LINE__, iocnum); +- free_pages((unsigned long)pKarg, memory_pages); +- return -ENODEV; +- } +- +- dcsmisasprintk(ioc, printk(KERN_DEBUG "%s enter.\n", __func__)); ++ __FILE__, __FUNCTION__, __LINE__, iocnum); ++ free_pages((unsigned long)pKarg, memory_pages); ++ return -ENODEV; ++ } ++ ++ if (!csmisas_is_this_sas_cntr(ioc)) { ++ printk(KERN_ERR "%s::%s() @%d - ioc%d not SAS controller!\n", ++ __FILE__, __FUNCTION__, __LINE__, iocnum); ++ free_pages((unsigned long)pKarg, memory_pages); ++ return -ENODEV; ++ } ++ ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "%s enter.\n",__FUNCTION__)); + + if (pKarg->Information.uChangeCount != 0 && +- pKarg->Information.uChangeCount != ioc->csmi_change_count) { ++ pKarg->Information.uChangeCount != ioc->csmi_change_count ) { + pKarg->IoctlHeader.ReturnCode = + CSMI_SAS_STATUS_INVALID_PARAMETER; + pKarg->Information.uFailureCode = +@@ -4235,12 +4218,12 @@ + sizeof(CSMI_SAS_RAID_FEATURES_BUFFER))) { + printk(KERN_ERR "%s@%d::%s() - " + "Unable to write out csmi_sas_get_raid_features @ %p\n", +- __FILE__, __LINE__, __func__, uarg); +- free_pages((unsigned long)pKarg, memory_pages); +- return -EFAULT; +- } +- +- dcsmisasprintk(ioc, printk(KERN_DEBUG "%s exit.\n", __func__)); ++ __FILE__, __LINE__, __FUNCTION__, uarg); ++ free_pages((unsigned long)pKarg, memory_pages); ++ return -EFAULT; ++ } ++ ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "%s exit.\n",__FUNCTION__)); + free_pages((unsigned long)pKarg, memory_pages); + return 0; + } +@@ -4257,7 +4240,7 @@ + csmisas_set_raid_control(unsigned long arg) + { + CSMI_SAS_RAID_CONTROL_BUFFER __user *uarg = (void __user *) arg; +- CSMI_SAS_RAID_CONTROL_BUFFER karg, *pKarg = NULL; ++ CSMI_SAS_RAID_CONTROL_BUFFER karg, *pKarg=NULL; + int csmi_sas_raid_control_buffer_sz, iocnum; + int memory_pages; + MPT_ADAPTER *ioc = NULL; +@@ -4265,7 +4248,7 @@ + if (copy_from_user(&karg, uarg, sizeof(IOCTL_HEADER))) { + printk(KERN_ERR "%s@%d::%s() - " + "Unable to read in csmi_sas_set_raid_control struct @ %p\n", +- __FILE__, __LINE__, __func__, uarg); ++ __FILE__, __LINE__, __FUNCTION__, uarg); + return -EFAULT; + } + +@@ -4273,11 +4256,11 @@ + memory_pages = get_order(csmi_sas_raid_control_buffer_sz); + pKarg = (CSMI_SAS_RAID_CONTROL_BUFFER *)__get_free_pages( + GFP_KERNEL, memory_pages); +- if (!pKarg) { ++ if (!pKarg){ + printk(KERN_ERR "%s@%d::%s() - " + "Unable to malloc RAID_CONTROL_BUFFER " + "csmi_sas_raid_control_buffer_sz=%d memory_pages=%d\n", +- __FILE__, __LINE__, __func__, ++ __FILE__, __LINE__, __FUNCTION__, + csmi_sas_raid_control_buffer_sz, memory_pages); + return -ENOMEM; + } +@@ -4286,7 +4269,7 @@ + if (copy_from_user(pKarg, uarg, csmi_sas_raid_control_buffer_sz)) { + printk(KERN_ERR "%s@%d::%s() - " + "Unable to read in csmi_sas_set_raid_control struct @ %p\n", +- __FILE__, __LINE__, __func__, uarg); ++ __FILE__, __LINE__, __FUNCTION__, uarg); + free_pages((unsigned long)pKarg, memory_pages); + return -EFAULT; + } +@@ -4294,22 +4277,22 @@ + if (((iocnum = mpt_verify_adapter(pKarg->IoctlHeader.IOControllerNumber, + &ioc)) < 0) || (ioc == NULL)) { + printk(KERN_ERR "%s::%s() @%d - ioc%d not found!\n", +- __FILE__, __func__, __LINE__, iocnum); +- free_pages((unsigned long)pKarg, memory_pages); +- return -ENODEV; +- } +- +- if (!csmisas_is_this_sas_cntr(ioc)) { +- printk(KERN_ERR "%s::%s() @%d - ioc%d not SAS controller!\n", +- __FILE__, __func__, __LINE__, iocnum); +- free_pages((unsigned long)pKarg, memory_pages); +- return -ENODEV; +- } +- +- dcsmisasprintk(ioc, printk(KERN_DEBUG "%s enter.\n", __func__)); ++ __FILE__, __FUNCTION__, __LINE__, iocnum); ++ free_pages((unsigned long)pKarg, memory_pages); ++ return -ENODEV; ++ } ++ ++ if (!csmisas_is_this_sas_cntr(ioc)) { ++ printk(KERN_ERR "%s::%s() @%d - ioc%d not SAS controller!\n", ++ __FILE__, __FUNCTION__, __LINE__, iocnum); ++ free_pages((unsigned long)pKarg, memory_pages); ++ return -ENODEV; ++ } ++ ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "%s enter.\n",__FUNCTION__)); + + if (pKarg->Information.uChangeCount != 0 && +- pKarg->Information.uChangeCount != ioc->csmi_change_count) { ++ pKarg->Information.uChangeCount != ioc->csmi_change_count ) { + pKarg->IoctlHeader.ReturnCode = + CSMI_SAS_STATUS_INVALID_PARAMETER; + pKarg->Information.uFailureCode = +@@ -4346,8 +4329,8 @@ + goto cim_set_raid_control_exit; + } + +- if (!strcmp(pKarg->Information.bClearConfiguration, +- CSMI_SAS_RAID_CLEAR_CONFIGURATION_SIGNATURE)) { ++ if( !strcmp(pKarg->Information.bClearConfiguration, ++ CSMI_SAS_RAID_CLEAR_CONFIGURATION_SIGNATURE) ) { + pKarg->IoctlHeader.ReturnCode = + CSMI_SAS_STATUS_INVALID_PARAMETER; + pKarg->Information.uFailureCode = +@@ -4366,12 +4349,12 @@ + sizeof(CSMI_SAS_RAID_CONTROL_BUFFER))) { + printk(KERN_ERR "%s@%d::%s() - " + "Unable to write out csmi_sas_set_raid_control @ %p\n", +- __FILE__, __LINE__, __func__, uarg); +- free_pages((unsigned long)pKarg, memory_pages); +- return -EFAULT; +- } +- +- dcsmisasprintk(ioc, printk(KERN_DEBUG "%s exit.\n", __func__)); ++ __FILE__, __LINE__, __FUNCTION__, uarg); ++ free_pages((unsigned long)pKarg, memory_pages); ++ return -EFAULT; ++ } ++ ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "%s exit.\n",__FUNCTION__)); + free_pages((unsigned long)pKarg, memory_pages); + return 0; + } +@@ -4395,39 +4378,42 @@ + if (copy_from_user(&karg, uarg, sizeof(CSMI_SAS_RAID_ELEMENT_BUFFER))) { + printk(KERN_ERR "%s@%d::%s() - " + "Unable to read in csmisas_get_raid_element struct @ %p\n", +- __FILE__, __LINE__, __func__, uarg); +- return -EFAULT; +- } +- +- if (((iocnum = mpt_verify_adapter(karg.IoctlHeader.IOControllerNumber, +- &ioc)) < 0) || (ioc == NULL)) { +- printk(KERN_ERR "%s::%s() @%d - ioc%d not found!\n", +- __FILE__, __func__, __LINE__, iocnum); +- return -ENODEV; +- } +- +- if (!csmisas_is_this_sas_cntr(ioc)) { +- printk(KERN_ERR "%s::%s() @%d - ioc%d not SAS controller!\n", +- __FILE__, __func__, __LINE__, iocnum); +- return -ENODEV; +- } +- +- dcsmisasprintk(ioc, printk(KERN_DEBUG "%s enter.\n", __func__)); +- ++ __FILE__, __LINE__, __FUNCTION__, uarg); ++ return -EFAULT; ++ } ++ ++ if (((iocnum = mpt_verify_adapter(karg.IoctlHeader.IOControllerNumber, ++ &ioc)) < 0) || (ioc == NULL)) { ++ printk(KERN_ERR "%s::%s() @%d - ioc%d not found!\n", ++ __FILE__, __FUNCTION__, __LINE__, iocnum); ++ return -ENODEV; ++ } ++ ++ if (!csmisas_is_this_sas_cntr(ioc)) { ++ printk(KERN_ERR "%s::%s() @%d - ioc%d not SAS controller!\n", ++ __FILE__, __FUNCTION__, __LINE__, iocnum); ++ return -ENODEV; ++ } ++ ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "%s enter.\n",__FUNCTION__)); ++ ++/* TODO - implement IOCTL here */ + karg.IoctlHeader.ReturnCode = CSMI_SAS_STATUS_BAD_CNTL_CODE; + dcsmisasprintk(ioc, printk(KERN_DEBUG ": not implemented\n")); + ++// csmisas_get_raid_element_exit: ++ + /* Copy the data from kernel memory to user memory + */ + if (copy_to_user(uarg, &karg, + sizeof(CSMI_SAS_RAID_ELEMENT_BUFFER))) { + printk(KERN_ERR "%s@%d::%s() - " + "Unable to write out csmisas_get_raid_element @ %p\n", +- __FILE__, __LINE__, __func__, uarg); +- return -EFAULT; +- } +- +- dcsmisasprintk(ioc, printk(KERN_DEBUG "%s exit.\n", __func__)); ++ __FILE__, __LINE__, __FUNCTION__, uarg); ++ return -EFAULT; ++ } ++ ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "%s exit.\n",__FUNCTION__)); + return 0; + + } +@@ -4448,43 +4434,45 @@ + MPT_ADAPTER *ioc = NULL; + int iocnum; + +- if (copy_from_user(&karg, uarg, +- sizeof(CSMI_SAS_RAID_SET_OPERATION_BUFFER))) { ++ if (copy_from_user(&karg, uarg, sizeof(CSMI_SAS_RAID_SET_OPERATION_BUFFER))) { + printk(KERN_ERR "%s@%d::%s() - " + "Unable to read in csmi_set_raid_operation struct @ %p\n", +- __FILE__, __LINE__, __func__, uarg); +- return -EFAULT; +- } +- +- if (((iocnum = mpt_verify_adapter(karg.IoctlHeader.IOControllerNumber, +- &ioc)) < 0) || (ioc == NULL)) { +- printk(KERN_ERR "%s::%s() @%d - ioc%d not found!\n", +- __FILE__, __func__, __LINE__, iocnum); +- return -ENODEV; +- } +- +- if (!csmisas_is_this_sas_cntr(ioc)) { +- printk(KERN_ERR "%s::%s() @%d - ioc%d not SAS controller!\n", +- __FILE__, __func__, __LINE__, iocnum); +- return -ENODEV; +- } +- +- dcsmisasprintk(ioc, printk(KERN_DEBUG "%s enter.\n", __func__)); +- ++ __FILE__, __LINE__, __FUNCTION__, uarg); ++ return -EFAULT; ++ } ++ ++ if (((iocnum = mpt_verify_adapter(karg.IoctlHeader.IOControllerNumber, ++ &ioc)) < 0) || (ioc == NULL)) { ++ printk(KERN_ERR "%s::%s() @%d - ioc%d not found!\n", ++ __FILE__, __FUNCTION__, __LINE__, iocnum); ++ return -ENODEV; ++ } ++ ++ if (!csmisas_is_this_sas_cntr(ioc)) { ++ printk(KERN_ERR "%s::%s() @%d - ioc%d not SAS controller!\n", ++ __FILE__, __FUNCTION__, __LINE__, iocnum); ++ return -ENODEV; ++ } ++ ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "%s enter.\n",__FUNCTION__)); ++ ++/* TODO - implement IOCTL here */ + karg.IoctlHeader.ReturnCode = CSMI_SAS_STATUS_BAD_CNTL_CODE; + dcsmisasprintk(ioc, printk(KERN_DEBUG ": not implemented\n")); + ++// cim_set_raid_operation: ++ + /* Copy the data from kernel memory to user memory + */ + if (copy_to_user(uarg, &karg, + sizeof(CSMI_SAS_RAID_SET_OPERATION_BUFFER))) { + printk(KERN_ERR "%s@%d::%s() - " + "Unable to write out csmi_set_raid_operation @ %p\n", +- __FILE__, __LINE__, __func__, uarg); +- return -EFAULT; +- } +- +- dcsmisasprintk(ioc, printk(KERN_DEBUG "%s exit.\n", __func__)); ++ __FILE__, __LINE__, __FUNCTION__, uarg); ++ return -EFAULT; ++ } ++ ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "%s exit.\n",__FUNCTION__)); + return 0; + + } +@@ -4524,24 +4512,24 @@ + if (copy_from_user(&karg, uarg, sizeof(CSMI_SAS_SSP_TASK_IU_BUFFER))) { + printk(KERN_ERR "%s@%d::%s() - " + "Unable to read in csmi_sas_task_managment struct @ %p\n", +- __FILE__, __LINE__, __func__, uarg); +- return -EFAULT; +- } +- +- if (((iocnum = mpt_verify_adapter(karg.IoctlHeader.IOControllerNumber, +- &ioc)) < 0) || (ioc == NULL)) { +- printk(KERN_ERR "%s::%s() @%d - ioc%d not found!\n", +- __FILE__, __func__, __LINE__, iocnum); +- return -ENODEV; +- } +- +- if (!csmisas_is_this_sas_cntr(ioc)) { +- printk(KERN_ERR "%s::%s() @%d - ioc%d not SAS controller!\n", +- __FILE__, __func__, __LINE__, iocnum); +- return -ENODEV; +- } +- +- dcsmisasprintk(ioc, printk(KERN_DEBUG "%s enter.\n", __func__)); ++ __FILE__, __LINE__, __FUNCTION__, uarg); ++ return -EFAULT; ++ } ++ ++ if (((iocnum = mpt_verify_adapter(karg.IoctlHeader.IOControllerNumber, ++ &ioc)) < 0) || (ioc == NULL)) { ++ printk(KERN_ERR "%s::%s() @%d - ioc%d not found!\n", ++ __FILE__, __FUNCTION__, __LINE__, iocnum); ++ return -ENODEV; ++ } ++ ++ if (!csmisas_is_this_sas_cntr(ioc)) { ++ printk(KERN_ERR "%s::%s() @%d - ioc%d not SAS controller!\n", ++ __FILE__, __FUNCTION__, __LINE__, iocnum); ++ return -ENODEV; ++ } ++ ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "%s enter.\n",__FUNCTION__)); + + karg.IoctlHeader.ReturnCode = CSMI_SAS_STATUS_INVALID_PARAMETER; + +@@ -4587,22 +4575,18 @@ + goto cim_get_task_managment_exit; + + switch (karg.Parameters.uInformation) { +- case CSMI_SAS_SSP_TEST: +- dcsmisasprintk(ioc, printk(KERN_DEBUG +- "TM request for test purposes\n")); +- break; +- case CSMI_SAS_SSP_EXCEEDED: +- dcsmisasprintk(ioc, printk(KERN_DEBUG +- "TM request due to timeout\n")); +- break; +- case CSMI_SAS_SSP_DEMAND: +- dcsmisasprintk(ioc, printk(KERN_DEBUG +- "TM request demanded by app\n")); +- break; +- case CSMI_SAS_SSP_TRIGGER: +- dcsmisasprintk(ioc, printk(KERN_DEBUG +- "TM request sent to trigger event\n")); +- break; ++ case CSMI_SAS_SSP_TEST: ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "TM request for test purposes\n")); ++ break; ++ case CSMI_SAS_SSP_EXCEEDED: ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "TM request due to timeout\n")); ++ break; ++ case CSMI_SAS_SSP_DEMAND: ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "TM request demanded by app\n")); ++ break; ++ case CSMI_SAS_SSP_TRIGGER: ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "TM request sent to trigger event\n")); ++ break; + } + + switch (taskType) { +@@ -4617,12 +4601,12 @@ + mf = MPT_INDEX_2_MFPTR(hd->ioc, i); + TaskMsgContext = + mf->u.frame.hwhdr.msgctxu.MsgContext; +- found_qtag = 1; ++ found_qtag=1; + break; + } + } + +- if (!found_qtag) ++ if(!found_qtag) + goto cim_get_task_managment_exit; + + case MPI_SCSITASKMGMT_TASKTYPE_LOGICAL_UNIT_RESET: +@@ -4634,6 +4618,7 @@ + + /* Single threading .... + */ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,15)) + mutex_lock(&ioc->taskmgmt_cmds.mutex); + if (mpt_set_taskmgmt_in_progress_flag(ioc) != 0) { + mutex_unlock(&ioc->taskmgmt_cmds.mutex); +@@ -4641,34 +4626,50 @@ + CSMI_SAS_STATUS_FAILED; + goto cim_get_task_managment_exit; + } ++#elif (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0)) ++ if (mptctl_set_tm_flags(hd) != 0) { ++ karg.IoctlHeader.ReturnCode = ++ CSMI_SAS_STATUS_FAILED; ++ goto cim_get_task_managment_exit; ++ } ++#endif + /* Send request + */ + if ((mf = mpt_get_msg_frame(mptctl_taskmgmt_id, ioc)) == NULL) { +- dcsmisasprintk(ioc, +- printk(KERN_ERR ": no msg frames!\n")); ++ dcsmisasprintk(ioc, printk(KERN_ERR ": no msg frames!\n")); ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,15)) + mutex_unlock(&ioc->taskmgmt_cmds.mutex); + mpt_clear_taskmgmt_in_progress_flag(ioc); ++#elif (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0)) ++ mptctl_free_tm_flags(ioc); ++#endif + karg.IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; + goto cim_get_task_managment_exit; + } + + mpi_hdr = (MPIHeader_t *) mf; + MsgContext = mpi_hdr->MsgContext; +- pScsiTm = (pSCSITaskMgmt_t) mf; +- +- memset(pScsiTm, 0, sizeof(SCSITaskMgmt_t)); ++ pScsiTm = (pSCSITaskMgmt_t ) mf; ++ ++ memset(pScsiTm,0,sizeof(SCSITaskMgmt_t)); + pScsiTm->TaskType = taskType; + pScsiTm->Bus = channel; + pScsiTm->TargetID = id; ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,15)) + int_to_scsilun(karg.Parameters.bLun, + (struct scsi_lun *)pScsiTm->LUN); ++#else ++ pScsiTm->LUN[1] = karg.Parameters.bLun; ++#endif + pScsiTm->MsgContext = MsgContext; + pScsiTm->TaskMsgContext = TaskMsgContext; + pScsiTm->Function = MPI_FUNCTION_SCSI_TASK_MGMT; + + if (csmisas_send_handshake_wait(ioc, mf, + karg.IoctlHeader.Timeout) != 0) { ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,15)) + mutex_unlock(&ioc->taskmgmt_cmds.mutex); ++#endif + karg.IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; + goto cim_get_task_managment_exit; + } +@@ -4676,26 +4677,25 @@ + if (ioc->ioctl_cmds.status & MPT_MGMT_STATUS_RF_VALID) { + + pScsiTmReply = +- (pSCSITaskMgmtReply_t) ioc->ioctl_cmds.reply; ++ (pSCSITaskMgmtReply_t ) ioc->ioctl_cmds.reply; + + ioc_status = le16_to_cpu(pScsiTmReply->IOCStatus) + & MPI_IOCSTATUS_MASK; + +- memset(&karg.Status, 0, ++ memset(&karg.Status,0, + sizeof(CSMI_SAS_SSP_PASSTHRU_STATUS)); + +- if (ioc_status == MPI_IOCSTATUS_SUCCESS) { ++ if(ioc_status == MPI_IOCSTATUS_SUCCESS) { + karg.IoctlHeader.ReturnCode = + CSMI_SAS_STATUS_SUCCESS; + karg.Status.bSSPStatus = + CSMI_SAS_SSP_STATUS_COMPLETED; +- } else if (ioc_status +- == MPI_IOCSTATUS_INSUFFICIENT_RESOURCES) { ++ }else if(ioc_status == MPI_IOCSTATUS_INSUFFICIENT_RESOURCES) { + karg.IoctlHeader.ReturnCode = + CSMI_SAS_STATUS_SUCCESS; + karg.Status.bSSPStatus = + CSMI_SAS_SSP_STATUS_RETRY; +- } else { ++ }else { + karg.IoctlHeader.ReturnCode = + CSMI_SAS_STATUS_FAILED; + karg.Status.bSSPStatus = +@@ -4711,7 +4711,9 @@ + break; + } + ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,15)) + mutex_unlock(&ioc->taskmgmt_cmds.mutex); ++#endif + + cim_get_task_managment_exit: + +@@ -4721,11 +4723,11 @@ + sizeof(CSMI_SAS_SSP_TASK_IU_BUFFER))) { + printk(KERN_ERR "%s@%d::%s() - " + "Unable to write out csmi_sas_task_managment @ %p\n", +- __FILE__, __LINE__, __func__, uarg); +- return -EFAULT; +- } +- +- dcsmisasprintk(ioc, printk(KERN_DEBUG "%s exit.\n", __func__)); ++ __FILE__, __LINE__, __FUNCTION__, uarg); ++ return -EFAULT; ++ } ++ ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "%s exit.\n",__FUNCTION__)); + return 0; + } + +@@ -4825,19 +4827,19 @@ + + if ((opcode != MPI_SAS_OP_PHY_LINK_RESET) && + (opcode != MPI_SAS_OP_PHY_HARD_RESET)) ++ return -1; ++ ++ /* Get a MF for this command. ++ */ ++ if ((mf = mpt_get_msg_frame(mptctl_id, ioc)) == NULL) { ++ dcsmisasprintk(ioc, printk(KERN_ERR ": no msg frames!\n")); + return -1; +- +- /* Get a MF for this command. +- */ +- if ((mf = mpt_get_msg_frame(mptctl_id, ioc)) == NULL) { +- dcsmisasprintk(ioc, printk(KERN_ERR ": no msg frames!\n")); +- return -1; +- } ++ } + + mpi_hdr = (MPIHeader_t *) mf; + MsgContext = mpi_hdr->MsgContext; + sasIoUnitCntrReq = (SasIoUnitControlRequest_t *)mf; +- memset(sasIoUnitCntrReq, 0, sizeof(SasIoUnitControlRequest_t)); ++ memset(sasIoUnitCntrReq,0,sizeof(SasIoUnitControlRequest_t)); + sasIoUnitCntrReq->Function = MPI_FUNCTION_SAS_IO_UNIT_CONTROL; + sasIoUnitCntrReq->MsgContext = MsgContext; + sasIoUnitCntrReq->Operation = opcode; +@@ -4855,7 +4857,7 @@ + & MPI_IOCSTATUS_MASK; + if (ioc_status != MPI_IOCSTATUS_SUCCESS) { + printk(KERN_DEBUG "%s: IOCStatus=0x%X IOCLogInfo=0x%X\n", +- __func__, ++ __FUNCTION__, + sasIoUnitCntrReply->IOCStatus, + sasIoUnitCntrReply->IOCLogInfo); + return -1; +@@ -4876,12 +4878,12 @@ + CSMI_SAS_PHY_CONTROL_BUFFER __user *uarg = (void __user *) arg; + IOCTL_HEADER ioctl_header; + PCSMI_SAS_PHY_CONTROL_BUFFER karg; +- SasIOUnitPage0_t *sasIoUnitPg0 = NULL; ++ SasIOUnitPage0_t *sasIoUnitPg0=NULL; + dma_addr_t sasIoUnitPg0_dma; +- int sasIoUnitPg0_data_sz = 0; +- SasIOUnitPage1_t *sasIoUnitPg1 = NULL; ++ int sasIoUnitPg0_data_sz=0; ++ SasIOUnitPage1_t *sasIoUnitPg1=NULL; + dma_addr_t sasIoUnitPg1_dma; +- int sasIoUnitPg1_data_sz = 0; ++ int sasIoUnitPg1_data_sz=0; + ConfigExtendedPageHeader_t hdr; + CONFIGPARMS cfg; + MPT_ADAPTER *ioc = NULL; +@@ -4892,7 +4894,7 @@ + if (copy_from_user(&ioctl_header, uarg, sizeof(IOCTL_HEADER))) { + printk(KERN_ERR "%s@%d::%s() - " + "Unable to read in IOCTL_HEADER" +- "struct @ %p\n", __FILE__, __LINE__, __func__, uarg); ++ "struct @ %p\n", __FILE__, __LINE__, __FUNCTION__, uarg); + return -EFAULT; + } + +@@ -4900,11 +4902,11 @@ + memory_pages = get_order(csmi_sas_phy_control_buffer_sz); + karg = (PCSMI_SAS_PHY_CONTROL_BUFFER)__get_free_pages( + GFP_KERNEL, memory_pages); +- if (!karg) { ++ if (!karg){ + printk(KERN_ERR "%s@%d::%s() - " + "Unable to malloc SAS_PHY_CONTROL_BUFFER " + "csmi_sas_phy_control_buffer_sz=%d memory_pages=%d\n", +- __FILE__, __LINE__, __func__, ++ __FILE__, __LINE__, __FUNCTION__, + csmi_sas_phy_control_buffer_sz, memory_pages); + return -ENOMEM; + } +@@ -4913,7 +4915,7 @@ + if (copy_from_user(karg, uarg, csmi_sas_phy_control_buffer_sz)) { + printk(KERN_ERR "%s@%d::%s() - " + "Unable to read in csmi_sas_phy_control_buffer " +- "struct @ %p\n", __FILE__, __LINE__, __func__, uarg); ++ "struct @ %p\n", __FILE__, __LINE__, __FUNCTION__, uarg); + free_pages((unsigned long)karg, memory_pages); + return -EFAULT; + } +@@ -4921,19 +4923,19 @@ + if (((iocnum = mpt_verify_adapter(ioctl_header.IOControllerNumber, + &ioc)) < 0) || (ioc == NULL)) { + printk(KERN_ERR "%s::%s() @%d - ioc%d not found!\n", +- __FILE__, __func__, __LINE__, iocnum); +- free_pages((unsigned long)karg, memory_pages); +- return -ENODEV; +- } +- +- if (!csmisas_is_this_sas_cntr(ioc)) { +- printk(KERN_ERR "%s::%s() @%d - ioc%d not SAS controller!\n", +- __FILE__, __func__, __LINE__, iocnum); +- free_pages((unsigned long)karg, memory_pages); +- return -ENODEV; +- } +- +- dcsmisasprintk(ioc, printk(KERN_DEBUG "%s enter.\n", __func__)); ++ __FILE__, __FUNCTION__, __LINE__, iocnum); ++ free_pages((unsigned long)karg, memory_pages); ++ return -ENODEV; ++ } ++ ++ if (!csmisas_is_this_sas_cntr(ioc)) { ++ printk(KERN_ERR "%s::%s() @%d - ioc%d not SAS controller!\n", ++ __FILE__, __FUNCTION__, __LINE__, iocnum); ++ free_pages((unsigned long)karg, memory_pages); ++ return -ENODEV; ++ } ++ ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "%s enter.\n",__FUNCTION__)); + + if (karg->bPhyIdentifier >= ioc->num_ports) { + karg->IoctlHeader.ReturnCode = +@@ -4968,8 +4970,7 @@ + } + + if (hdr.ExtPageLength == 0) { +- dcsmisasprintk(ioc, +- printk(KERN_ERR ": hdr.ExtPageLength == 0\n")); ++ dcsmisasprintk(ioc, printk(KERN_ERR ": hdr.ExtPageLength == 0\n")); + karg->IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; + goto cim_sas_phy_control_exit; + } +@@ -4979,8 +4980,7 @@ + sasIoUnitPg0_data_sz, &sasIoUnitPg0_dma); + + if (!sasIoUnitPg0) { +- dcsmisasprintk(ioc, +- printk(KERN_ERR ": pci_alloc_consistent: FAILED\n")); ++ dcsmisasprintk(ioc, printk(KERN_ERR ": pci_alloc_consistent: FAILED\n")); + karg->IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; + goto cim_sas_phy_control_exit; + } +@@ -5023,8 +5023,7 @@ + } + + if (hdr.ExtPageLength == 0) { +- dcsmisasprintk(ioc, +- printk(KERN_ERR ": hdr.ExtPageLength == 0\n")); ++ dcsmisasprintk(ioc, printk(KERN_ERR ": hdr.ExtPageLength == 0\n")); + karg->IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; + goto cim_sas_phy_control_exit; + } +@@ -5034,8 +5033,7 @@ + sasIoUnitPg1_data_sz, &sasIoUnitPg1_dma); + + if (!sasIoUnitPg1) { +- dcsmisasprintk(ioc, +- printk(KERN_ERR ": pci_alloc_consistent: FAILED\n")); ++ dcsmisasprintk(ioc, printk(KERN_ERR ": pci_alloc_consistent: FAILED\n")); + karg->IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED; + goto cim_sas_phy_control_exit; + } +@@ -5056,18 +5054,19 @@ + case CSMI_SAS_PC_LINK_RESET: + case CSMI_SAS_PC_HARD_RESET: + { +- u8 opcode = (karg->uFunction == CSMI_SAS_PC_LINK_RESET) ? ++ u8 opcode = (karg->uFunction==CSMI_SAS_PC_LINK_RESET) ? + MPI_SAS_OP_PHY_LINK_RESET : MPI_SAS_OP_PHY_HARD_RESET; + +- if ((karg->uLinkFlags & CSMI_SAS_PHY_ACTIVATE_CONTROL) && ++ if((karg->uLinkFlags & CSMI_SAS_PHY_ACTIVATE_CONTROL) && + (karg->usLengthOfControl >= sizeof(CSMI_SAS_PHY_CONTROL)) && +- (karg->bNumberOfControls > 0)) { +- if (karg->Control[0].bRate == ++ (karg->bNumberOfControls > 0)){ ++ if(karg->Control[0].bRate == + CSMI_SAS_LINK_RATE_1_5_GBPS) { + sasIoUnitPg1->PhyData[karg->bPhyIdentifier].MaxMinLinkRate = + MPI_SAS_IOUNIT1_MAX_RATE_1_5 | + MPI_SAS_IOUNIT1_MIN_RATE_1_5; +- } else if (karg->Control[0].bRate == ++ } ++ else if(karg->Control[0].bRate == + CSMI_SAS_LINK_RATE_3_0_GBPS) { + sasIoUnitPg1->PhyData[karg->bPhyIdentifier].MaxMinLinkRate = + MPI_SAS_IOUNIT1_MAX_RATE_3_0 | +@@ -5104,7 +5103,7 @@ + + } + case CSMI_SAS_PC_PHY_DISABLE: +- if (karg->usLengthOfControl || karg->bNumberOfControls) { ++ if(karg->usLengthOfControl || karg->bNumberOfControls) { + karg->IoctlHeader.ReturnCode = + CSMI_SAS_STATUS_INVALID_PARAMETER; + break; +@@ -5136,14 +5135,14 @@ + break; + + case CSMI_SAS_PC_GET_PHY_SETTINGS: +- if (karg->usLengthOfControl || karg->bNumberOfControls) { ++ if(karg->usLengthOfControl || karg->bNumberOfControls) { + karg->IoctlHeader.ReturnCode = + CSMI_SAS_STATUS_INVALID_PARAMETER; + break; + } +- if (csmi_sas_phy_control_buffer_sz < +- offsetof(CSMI_SAS_PHY_CONTROL_BUFFER, Control) + +- (4 * sizeof(CSMI_SAS_PHY_CONTROL))) { ++ if(csmi_sas_phy_control_buffer_sz < ++ offsetof(CSMI_SAS_PHY_CONTROL_BUFFER,Control) + ++ (4* sizeof(CSMI_SAS_PHY_CONTROL))) { + karg->IoctlHeader.ReturnCode = + CSMI_SAS_STATUS_INVALID_PARAMETER; + break; +@@ -5176,15 +5175,15 @@ + + /* Copy the data from kernel memory to user memory + */ +- if (copy_to_user(uarg, karg, csmi_sas_phy_control_buffer_sz)) { ++ if (copy_to_user(uarg, karg,csmi_sas_phy_control_buffer_sz)) { + printk(KERN_ERR "%s@%d::%s() - " + "Unable to write out csmi_sas_phy_control_buffer @ %p\n", +- __FILE__, __LINE__, __func__, uarg); +- free_pages((unsigned long)karg, memory_pages); +- return -EFAULT; +- } +- +- dcsmisasprintk(ioc, printk(KERN_DEBUG "%s exit.\n", __func__)); ++ __FILE__, __LINE__, __FUNCTION__, uarg); ++ free_pages((unsigned long)karg, memory_pages); ++ return -EFAULT; ++ } ++ ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "%s exit.\n",__FUNCTION__)); + free_pages((unsigned long)karg, memory_pages); + return 0; + } +@@ -5203,8 +5202,7 @@ + * -EFAULT for non-successful reply or no reply (timeout) + **/ + static int +-csmisas_get_manuf_pg_7(MPT_ADAPTER *ioc, ManufacturingPage7_t *mfgpage7_buffer, +- int mfg_size) ++csmisas_get_manuf_pg_7(MPT_ADAPTER *ioc, ManufacturingPage7_t *mfgpage7_buffer, int mfg_size) + { + ConfigPageHeader_t hdr; + CONFIGPARMS cfg; +@@ -5283,41 +5281,41 @@ + printk(KERN_ERR "%s@%d::%s() - " + "Unable to read in csmi_sas_connector_info_buffer" + " struct @ %p\n", +- __FILE__, __LINE__, __func__, uarg); +- return -EFAULT; +- } +- +- if (((iocnum = mpt_verify_adapter(karg.IoctlHeader.IOControllerNumber, +- &ioc)) < 0) || (ioc == NULL)) { +- printk(KERN_ERR "%s::%s() @%d - ioc%d not found!\n", +- __FILE__, __func__, __LINE__, iocnum); +- return -ENODEV; +- } +- +- if (!csmisas_is_this_sas_cntr(ioc)) { +- printk(KERN_ERR "%s::%s() @%d - ioc%d not SAS controller!\n", +- __FILE__, __func__, __LINE__, iocnum); +- return -ENODEV; +- } +- +- dcsmisasprintk(ioc, printk(KERN_DEBUG "%s enter.\n", __func__)); ++ __FILE__, __LINE__, __FUNCTION__, uarg); ++ return -EFAULT; ++ } ++ ++ if (((iocnum = mpt_verify_adapter(karg.IoctlHeader.IOControllerNumber, ++ &ioc)) < 0) || (ioc == NULL)) { ++ printk(KERN_ERR "%s::%s() @%d - ioc%d not found!\n", ++ __FILE__, __FUNCTION__, __LINE__, iocnum); ++ return -ENODEV; ++ } ++ ++ if (!csmisas_is_this_sas_cntr(ioc)) { ++ printk(KERN_ERR "%s::%s() @%d - ioc%d not SAS controller!\n", ++ __FILE__, __FUNCTION__, __LINE__, iocnum); ++ return -ENODEV; ++ } ++ ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "%s enter.\n",__FUNCTION__)); + + karg.IoctlHeader.ReturnCode = CSMI_SAS_STATUS_SUCCESS; + + /* `32` is the sizeof MPI_MANPAGE7_CONNECTOR_INFO */ + for (i = 0; i < 32; i++) { + karg.Reference[i].uPinout = CSMI_SAS_CON_UNKNOWN; +- strcpy(karg.Reference[i].bConnector, ""); ++ strcpy(karg.Reference[i].bConnector,""); + karg.Reference[i].bLocation = CSMI_SAS_CON_UNKNOWN; + } + +- mfgPg7_sz = offsetof(CONFIG_PAGE_MANUFACTURING_7, ConnectorInfo) + ++ mfgPg7_sz = offsetof(CONFIG_PAGE_MANUFACTURING_7,ConnectorInfo) + + (ioc->num_ports * sizeof(MPI_MANPAGE7_CONNECTOR_INFO)); + mfgPg7 = kmalloc(mfgPg7_sz, GFP_KERNEL); +- if (!mfgPg7) { ++ if (!mfgPg7){ + printk(KERN_ERR "%s@%d::%s() - " + "Unable to malloc @ %p\n", +- __FILE__, __LINE__, __func__, mfgPg7); ++ __FILE__, __LINE__, __FUNCTION__, mfgPg7); + return -EFAULT; + } + memset(mfgPg7, 0, mfgPg7_sz); +@@ -5341,12 +5339,13 @@ + if (copy_to_user(uarg, &karg, + sizeof(CSMI_SAS_CONNECTOR_INFO_BUFFER))) { + printk(KERN_ERR "%s@%d::%s() - " +- "Unable to write out csmi_sas_connector_info_buffer @%p\n", +- __FILE__, __LINE__, __func__, uarg); +- return -EFAULT; +- } +- +- dcsmisasprintk(ioc, printk(KERN_DEBUG "%s exit.\n", __func__)); ++ "Unable to write out csmi_sas_connector_info_buffer @" ++ "%p\n", ++ __FILE__, __LINE__, __FUNCTION__, uarg); ++ return -EFAULT; ++ } ++ ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "%s exit.\n",__FUNCTION__)); + return 0; + } + +@@ -5358,21 +5357,21 @@ + **/ + static int + csmisas_fill_location_data(MPT_ADAPTER *ioc, u8 bus, u8 id, u8 opcode, +- CSMI_SAS_LOCATION_IDENTIFIER *location_ident) ++ CSMI_SAS_LOCATION_IDENTIFIER * location_ident) + { + + ConfigExtendedPageHeader_t hdr; + CONFIGPARMS cfg; + int rc; +- SasDevicePage0_t *sasDevicePg0 = NULL; +- SasEnclosurePage0_t *sasEnclosurePg0 = NULL; +- dma_addr_t sasDevicePg0_dma, sasEnclosurePg0_dma; +- int sasDevicePg0_data_sz = 0; +- int sasEnclosurePg0_data_sz = 0; +- u64 sas_address; +- +- dcsmisasprintk(ioc, printk(KERN_DEBUG "%s enter.\n", __func__)); +- memset(location_ident, 0, sizeof(*location_ident)); ++ SasDevicePage0_t *sasDevicePg0=NULL; ++ SasEnclosurePage0_t *sasEnclosurePg0=NULL; ++ dma_addr_t sasDevicePg0_dma,sasEnclosurePg0_dma; ++ int sasDevicePg0_data_sz=0; ++ int sasEnclosurePg0_data_sz=0; ++ u64 sas_address; ++ ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "%s enter.\n",__FUNCTION__)); ++ memset (location_ident, 0, sizeof(*location_ident)); + + /* SAS Device Page 0 */ + hdr.PageVersion = MPI_SASDEVICE0_PAGEVERSION; +@@ -5390,12 +5389,12 @@ + cfg.timeout = MPT_IOCTL_DEFAULT_TIMEOUT; + + if ((rc = mpt_config(ioc, &cfg)) != 0) { +- rc = -1; +- goto fill_location_data_exit; +- } +- +- if (hdr.ExtPageLength == 0) { +- rc = -1; ++ rc=-1; ++ goto fill_location_data_exit; ++ } ++ ++ if (hdr.ExtPageLength == 0) { ++ rc=-1; + goto fill_location_data_exit; + } + +@@ -5403,7 +5402,7 @@ + sasDevicePg0 = (SasDevicePage0_t *) pci_alloc_consistent( + ioc->pcidev, sasDevicePg0_data_sz, &sasDevicePg0_dma); + if (!sasDevicePg0) { +- rc = -1; ++ rc=-1; + goto fill_location_data_exit; + } + +@@ -5412,10 +5411,10 @@ + cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT; + cfg.pageAddr = (bus << 8) + id + + (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID << +- MPI_SAS_DEVICE_PGAD_FORM_SHIFT); +- +- if ((rc = mpt_config(ioc, &cfg)) != 0) { +- rc = -1; ++ MPI_SAS_DEVICE_PGAD_FORM_SHIFT); ++ ++ if ((rc = mpt_config(ioc, &cfg)) != 0) { ++ rc=-1; + goto fill_location_data_exit; + } + +@@ -5443,12 +5442,12 @@ + cfg.timeout = MPT_IOCTL_DEFAULT_TIMEOUT; + + if ((rc = mpt_config(ioc, &cfg)) != 0) { +- rc = 0; +- goto fill_location_data_exit; +- } +- +- if (hdr.ExtPageLength == 0) { +- rc = 0; ++ rc=0; ++ goto fill_location_data_exit; ++ } ++ ++ if (hdr.ExtPageLength == 0) { ++ rc=0; + goto fill_location_data_exit; + } + +@@ -5456,34 +5455,36 @@ + sasEnclosurePg0 = (SasEnclosurePage0_t *) pci_alloc_consistent( + ioc->pcidev, sasEnclosurePg0_data_sz, &sasEnclosurePg0_dma); + if (!sasEnclosurePg0) { +- rc = 0; ++ rc=0; + goto fill_location_data_exit; + } + cfg.physAddr = sasEnclosurePg0_dma; + cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT; + cfg.pageAddr = sasDevicePg0->EnclosureHandle +- + (MPI_SAS_ENCLOS_PGAD_FORM_HANDLE << +- MPI_SAS_ENCLOS_PGAD_FORM_SHIFT); +- +- if ((rc = mpt_config(ioc, &cfg)) != 0) { +- rc = 0; +- goto fill_location_data_exit; +- } +- +- location_ident->bLocationFlags |= +- CSMI_SAS_LOCATE_ENCLOSURE_IDENTIFIER_VALID; ++ + (MPI_SAS_ENCLOS_PGAD_FORM_HANDLE << MPI_SAS_ENCLOS_PGAD_FORM_SHIFT); ++ ++ if ((rc = mpt_config(ioc, &cfg)) != 0) { ++ rc=0; ++ goto fill_location_data_exit; ++ } ++ ++ location_ident->bLocationFlags |= CSMI_SAS_LOCATE_ENCLOSURE_IDENTIFIER_VALID; + memcpy(&sas_address, &sasEnclosurePg0->EnclosureLogicalID, sizeof(u64)); + sas_address = reverse_byte_order64(sas_address); + if (sas_address) +- memcpy(location_ident->bEnclosureIdentifier, &sas_address, +- sizeof(u64)); +- else +- strcpy(location_ident->bEnclosureIdentifier, "Internal"); +- +-/* bBayPrefix - not supported */ +- ++ memcpy(location_ident->bEnclosureIdentifier, &sas_address, sizeof(u64)); ++ else ++ strcpy(location_ident->bEnclosureIdentifier,"Internal"); ++ ++// bBayPrefix - not supported ++ ++// TODO - We need to look at sasEnclosurePg0-.Flags , to determine ++// whether SEP BUS/TargetID is valid. Ifs its a SES device, then ++// issue internal inquiry to (bus/id) to gather the Enclosure name. ++// If the device is SMP, then issue SMP_MANUFACTURING to get enclosure name ++// If its direct attached, there is no enclosure name + location_ident->bLocationFlags |= CSMI_SAS_LOCATE_ENCLOSURE_NAME_VALID; +- strcpy(location_ident->bEnclosureName, "Not Supported"); ++ strcpy(location_ident->bEnclosureName,"Not Supported"); + + location_ident->bLocationFlags |= CSMI_SAS_LOCATE_LOCATION_STATE_VALID; + location_ident->bLocationState = CSMI_SAS_LOCATE_UNKNOWN; +@@ -5491,6 +5492,11 @@ + location_ident->bLocationFlags |= CSMI_SAS_LOCATE_BAY_IDENTIFIER_VALID; + location_ident->bBayIdentifier = le16_to_cpu(sasDevicePg0->Slot); + ++ ++// TODO - illuminating LEDs, ++// karg->bIdentify = CSMI_SAS_LOCATE_FORCE_OFF, CSMI_SAS_LOCATE_FORCE_ON ++// We can enable/disable LEDs by SCSI Enclosure Processor MPI request message ++// printk("Flags=0x%x\n",sasEnclosurePg0->Flags); + + /* check sasEnclosurePg0->Flags - + * to validate whether we need to send the SEPRequest +@@ -5521,13 +5527,13 @@ + pci_free_consistent(ioc->pcidev, sasEnclosurePg0_data_sz, + sasEnclosurePg0, sasEnclosurePg0_dma); + +- dcsmisasprintk(ioc, printk(KERN_DEBUG "%s exit.\n", __func__)); +- return rc; +-} +- +-static int +-csmisas_fill_location_data_raid(MPT_ADAPTER *ioc, +- PCSMI_SAS_GET_LOCATION_BUFFER karg, u8 VolumeBus, u8 volumeID) ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "%s exit.\n",__FUNCTION__)); ++ return rc; ++} ++ ++static int ++csmisas_fill_location_data_raid(MPT_ADAPTER *ioc, PCSMI_SAS_GET_LOCATION_BUFFER karg, u8 VolumeBus, ++ u8 volumeID) + { + pRaidVolumePage0_t pVolume0 = NULL; + pRaidPhysDiskPage0_t pPhysDisk0 = NULL; +@@ -5548,9 +5554,9 @@ + + csmi_sas_get_location_sz = karg->IoctlHeader.Length; + physDiskNumMax = (csmi_sas_get_location_sz - +- offsetof(CSMI_SAS_GET_LOCATION_BUFFER, Location)) ++ offsetof(CSMI_SAS_GET_LOCATION_BUFFER,Location)) + / sizeof(CSMI_SAS_LOCATION_IDENTIFIER); +- karg->bNumberOfLocationIdentifiers = 0; ++ karg->bNumberOfLocationIdentifiers=0; + + /* + * get RAID Volume Page 0 +@@ -5586,7 +5592,7 @@ + + cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT; + cfg.physAddr = volume0_dma; +- if (mpt_config(ioc, &cfg) != 0) { ++ if (mpt_config(ioc, &cfg) != 0){ + rc = -1; + goto sas_fill_location_data_raid_exit; + } +@@ -5626,17 +5632,17 @@ + } + cfg.physAddr = physdisk0_dma; + +- for (i = 0; i < min(pVolume0->NumPhysDisks, physDiskNumMax); i++) { ++ for (i=0; i < min(pVolume0->NumPhysDisks, physDiskNumMax); i++) { + + /* obtain a refresh of pPhysDisk0 */ + cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT; + cfg.pageAddr = pVolume0->PhysDisk[i].PhysDiskNum; +- if (mpt_config(ioc, &cfg) != 0) { ++ if (mpt_config(ioc, &cfg) != 0){ + rc = -1; + goto sas_fill_location_data_raid_exit; + } + +- if ((csmisas_fill_location_data(ioc, pPhysDisk0->PhysDiskBus, ++ if((csmisas_fill_location_data(ioc, pPhysDisk0->PhysDiskBus, + pPhysDisk0->PhysDiskID, karg->bIdentify, + &karg->Location[karg->bNumberOfLocationIdentifiers])) == 0) + karg->bNumberOfLocationIdentifiers++; +@@ -5673,7 +5679,7 @@ + if (csmisas_get_ioc_pg5(ioc, iocPage5, sz) != 0) + goto sas_fill_location_data_raid_exit; + +- for (i = 0, idx = pVolume0->NumPhysDisks ; i < num_hotpares; ++ for(i = 0, idx = pVolume0->NumPhysDisks ; i < num_hotpares; + i++, idx++) { + + if (idx >= physDiskNumMax) +@@ -5722,11 +5728,11 @@ + if ((pVolume0->VolumeType == + MPI_RAID_VOL_TYPE_IME) && + ((tmpTotalMaxLBA * 2) + +- (64*2*1024) /*metadata = 64MB*/ > ++ (64*2*1024 ) /*metadata = 64MB*/ > + le32_to_cpu(pPhysDisk0->MaxLBA))) + continue; + +- if ((csmisas_fill_location_data(ioc, ++ if((csmisas_fill_location_data(ioc, + pPhysDisk0->PhysDiskBus, pPhysDisk0->PhysDiskID, + karg->bIdentify, + &karg->Location[karg->bNumberOfLocationIdentifiers])) == 0) +@@ -5743,7 +5749,7 @@ + pci_free_consistent(ioc->pcidev, volumepage0sz, pVolume0, + volume0_dma); + +- if (pPhysDisk0) ++ if(pPhysDisk0) + pci_free_consistent(ioc->pcidev, physdiskpage0sz, pPhysDisk0, + physdisk0_dma); + +@@ -5765,7 +5771,7 @@ + PCSMI_SAS_GET_LOCATION_BUFFER karg; + IOCTL_HEADER ioctl_header; + MPT_ADAPTER *ioc = NULL; +- int iocnum, i; ++ int iocnum,i; + int csmi_sas_get_location_sz; + int memory_pages; + struct sas_device_info *sas_info; +@@ -5773,7 +5779,7 @@ + if (copy_from_user(&ioctl_header, uarg, sizeof(IOCTL_HEADER))) { + printk(KERN_ERR "%s@%d::%s() - " + "Unable to read in IOCTL_HEADER" +- "struct @ %p\n", __FILE__, __LINE__, __func__, uarg); ++ "struct @ %p\n", __FILE__, __LINE__, __FUNCTION__, uarg); + return -EFAULT; + } + +@@ -5781,11 +5787,11 @@ + memory_pages = get_order(csmi_sas_get_location_sz); + karg = (PCSMI_SAS_GET_LOCATION_BUFFER)__get_free_pages( + GFP_KERNEL, memory_pages); +- if (!karg) { ++ if (!karg){ + printk(KERN_ERR "%s@%d::%s() - " + "Unable to malloc GET_LOCATION_BUFFER " + "csmi_sas_get_location_sz=%d memory_pages=%d\n", +- __FILE__, __LINE__, __func__, ++ __FILE__, __LINE__, __FUNCTION__, + csmi_sas_get_location_sz, memory_pages); + return -ENOMEM; + } +@@ -5794,7 +5800,7 @@ + if (copy_from_user(karg, uarg, csmi_sas_get_location_sz)) { + printk(KERN_ERR "%s@%d::%s() - " + "Unable to read in csmi_sas_phy_control_buffer " +- "struct @ %p\n", __FILE__, __LINE__, __func__, uarg); ++ "struct @ %p\n", __FILE__, __LINE__, __FUNCTION__, uarg); + free_pages((unsigned long)karg, memory_pages); + return -EFAULT; + } +@@ -5802,22 +5808,22 @@ + if (((iocnum = mpt_verify_adapter(karg->IoctlHeader.IOControllerNumber, + &ioc)) < 0) || (ioc == NULL)) { + printk(KERN_ERR "%s::%s() @%d - ioc%d not found!\n", +- __FILE__, __func__, __LINE__, iocnum); +- free_pages((unsigned long)karg, memory_pages); +- return -ENODEV; +- } +- +- if (!csmisas_is_this_sas_cntr(ioc)) { +- printk(KERN_ERR "%s::%s() @%d - ioc%d not SAS controller!\n", +- __FILE__, __func__, __LINE__, iocnum); +- free_pages((unsigned long)karg, memory_pages); +- return -ENODEV; +- } +- +- dcsmisasprintk(ioc, printk(KERN_DEBUG "%s enter.\n", __func__)); ++ __FILE__, __FUNCTION__, __LINE__, iocnum); ++ free_pages((unsigned long)karg, memory_pages); ++ return -ENODEV; ++ } ++ ++ if (!csmisas_is_this_sas_cntr(ioc)) { ++ printk(KERN_ERR "%s::%s() @%d - ioc%d not SAS controller!\n", ++ __FILE__, __FUNCTION__, __LINE__, iocnum); ++ free_pages((unsigned long)karg, memory_pages); ++ return -ENODEV; ++ } ++ ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "%s enter.\n",__FUNCTION__)); + + karg->IoctlHeader.ReturnCode = CSMI_SAS_STATUS_INVALID_PARAMETER; +- if (karg->bLengthOfLocationIdentifier != ++ if(karg->bLengthOfLocationIdentifier != + sizeof(CSMI_SAS_LOCATION_IDENTIFIER)) + goto cim_sas_get_location_exit; + +@@ -5828,12 +5834,12 @@ + + /* RAID SUPPORT */ + if (ioc->raid_data.pIocPg2 && sas_info->is_logical_volume) { +- for (i = 0; i < ioc->raid_data.pIocPg2->NumActiveVolumes; i++) { ++ for (i=0; iraid_data.pIocPg2->NumActiveVolumes; i++){ + if (sas_info->fw.id == + ioc->raid_data.pIocPg2->RaidVolume[i].VolumeID && + sas_info->fw.channel == + ioc->raid_data.pIocPg2->RaidVolume[i].VolumeBus) { +- if (csmisas_fill_location_data_raid(ioc, karg, ++ if(csmisas_fill_location_data_raid(ioc, karg, + ioc->raid_data.pIocPg2->RaidVolume[i].VolumeBus, + ioc->raid_data.pIocPg2->RaidVolume[i].VolumeID) == 0) + karg->IoctlHeader.ReturnCode = +@@ -5852,13 +5858,13 @@ + + /* make sure there's enough room to populate the Location[] struct */ + if ((csmi_sas_get_location_sz - +- offsetof(CSMI_SAS_GET_LOCATION_BUFFER, Location)) < ++ offsetof(CSMI_SAS_GET_LOCATION_BUFFER,Location)) < + sizeof(CSMI_SAS_LOCATION_IDENTIFIER)) + goto cim_sas_get_location_exit; + +- karg->bNumberOfLocationIdentifiers = 1; +- karg->Location[0].bLocationFlags = 0; +- if ((csmisas_fill_location_data(ioc, sas_info->fw.channel, ++ karg->bNumberOfLocationIdentifiers=1; ++ karg->Location[0].bLocationFlags=0; ++ if((csmisas_fill_location_data(ioc, sas_info->fw.channel, + sas_info->fw.id, karg->bIdentify, &karg->Location[0])) == 0) + karg->IoctlHeader.ReturnCode = CSMI_SAS_STATUS_SUCCESS; + else +@@ -5871,12 +5877,12 @@ + if (copy_to_user(uarg, karg, csmi_sas_get_location_sz)) { + printk(KERN_ERR "%s@%d::%s() - " + "Unable to write out csmi_sas_get_location_buffer " +- "@ %p\n", __FILE__, __LINE__, __func__, uarg); +- free_pages((unsigned long)karg, memory_pages); +- return -EFAULT; +- } +- +- dcsmisasprintk(ioc, printk(KERN_DEBUG "%s exit.\n", __func__)); +- free_pages((unsigned long)karg, memory_pages); +- return 0; +-} ++ "@ %p\n",__FILE__, __LINE__, __FUNCTION__, uarg); ++ free_pages((unsigned long)karg, memory_pages); ++ return -EFAULT; ++ } ++ ++ dcsmisasprintk(ioc, printk(KERN_DEBUG "%s exit.\n",__FUNCTION__)); ++ free_pages((unsigned long)karg, memory_pages); ++ return 0; ++} +diff -r 60d73800068f drivers/message/fusion/csmi/csmisas.h +--- a/drivers/message/fusion/csmi/csmisas.h Tue Jun 30 11:26:39 2009 +0100 ++++ b/drivers/message/fusion/csmi/csmisas.h Wed Jul 01 09:46:25 2009 +0100 +@@ -87,10 +87,10 @@ + #ifndef _CSMI_SAS_H_ + #define _CSMI_SAS_H_ + +-/* CSMI Specification Revision, the intent is that all versions of the +- specification will be backward compatible after the 1.00 release. +- Major revision number, corresponds to xxxx. of CSMI specification +- Minor revision number, corresponds to .xxxx of CSMI specification */ ++// CSMI Specification Revision, the intent is that all versions of the ++// specification will be backward compatible after the 1.00 release. ++// Major revision number, corresponds to xxxx. of CSMI specification ++// Minor revision number, corresponds to .xxxx of CSMI specification + #define CSMI_MAJOR_REVISION 0 + #define CSMI_MINOR_REVISION 90 + +@@ -104,60 +104,60 @@ + /* TARGET OS LINUX SPECIFIC CODE */ + /*************************************************************************/ + ++// EDM #ifdef _linux + #ifdef __KERNEL__ + +-/* Linux base types */ ++// Linux base types + + #include + + #define __i8 char + +-/* pack definition */ ++// pack definition + +-#if 0 +- #define CSMI_SAS_BEGIN_PACK(x) pack(x) +- #define CSMI_SAS_END_PACK pack() ++// EDM #define CSMI_SAS_BEGIN_PACK(x) pack(x) ++// EDM #define CSMI_SAS_END_PACK pack() + +- /* IOCTL Control Codes */ +- /* (IoctlHeader.ControlCode) */ ++// IOCTL Control Codes ++// (IoctlHeader.ControlCode) + +- /* Control Codes prior to 0.77 */ ++// Control Codes prior to 0.77 + +- /* Control Codes requiring CSMI_ALL_SIGNATURE */ ++// Control Codes requiring CSMI_ALL_SIGNATURE + +- #define CC_CSMI_SAS_GET_DRIVER_INFO 0x12345678 +- #define CC_CSMI_SAS_GET_CNTLR_CONFIG 0x23456781 +- #define CC_CSMI_SAS_GET_CNTLR_STATUS 0x34567812 +- #define CC_CSMI_SAS_FIRMWARE_DOWNLOAD 0x92345678 ++// #define CC_CSMI_SAS_GET_DRIVER_INFO 0x12345678 ++// #define CC_CSMI_SAS_GET_CNTLR_CONFIG 0x23456781 ++// #define CC_CSMI_SAS_GET_CNTLR_STATUS 0x34567812 ++// #define CC_CSMI_SAS_FIRMWARE_DOWNLOAD 0x92345678 + +- /* Control Codes requiring CSMI_RAID_SIGNATURE */ ++// Control Codes requiring CSMI_RAID_SIGNATURE + +- #define CC_CSMI_SAS_GET_RAID_INFO 0x45678123 +- #define CC_CSMI_SAS_GET_RAID_CONFIG 0x56781234 ++// #define CC_CSMI_SAS_GET_RAID_INFO 0x45678123 ++// #define CC_CSMI_SAS_GET_RAID_CONFIG 0x56781234 + +- /* Control Codes requiring CSMI_SAS_SIGNATURE */ ++// Control Codes requiring CSMI_SAS_SIGNATURE + +- #define CC_CSMI_SAS_GET_PHY_INFO 0x67812345 +- #define CC_CSMI_SAS_SET_PHY_INFO 0x78123456 +- #define CC_CSMI_SAS_GET_LINK_ERRORS 0x81234567 +- #define CC_CSMI_SAS_SMP_PASSTHRU 0xA1234567 +- #define CC_CSMI_SAS_SSP_PASSTHRU 0xB1234567 +- #define CC_CSMI_SAS_STP_PASSTHRU 0xC1234567 +- #define CC_CSMI_SAS_GET_SATA_SIGNATURE 0xD1234567 +- #define CC_CSMI_SAS_GET_SCSI_ADDRESS 0xE1234567 +- #define CC_CSMI_SAS_GET_DEVICE_ADDRESS 0xF1234567 +- #define CC_CSMI_SAS_TASK_MANAGEMENT 0xA2345678 +-#endif +- /* Control Codes for 0.77 and later */ ++// #define CC_CSMI_SAS_GET_PHY_INFO 0x67812345 ++// #define CC_CSMI_SAS_SET_PHY_INFO 0x78123456 ++// #define CC_CSMI_SAS_GET_LINK_ERRORS 0x81234567 ++// #define CC_CSMI_SAS_SMP_PASSTHRU 0xA1234567 ++// #define CC_CSMI_SAS_SSP_PASSTHRU 0xB1234567 ++// #define CC_CSMI_SAS_STP_PASSTHRU 0xC1234567 ++// #define CC_CSMI_SAS_GET_SATA_SIGNATURE 0xD1234567 ++// #define CC_CSMI_SAS_GET_SCSI_ADDRESS 0xE1234567 ++// #define CC_CSMI_SAS_GET_DEVICE_ADDRESS 0xF1234567 ++// #define CC_CSMI_SAS_TASK_MANAGEMENT 0xA2345678 + +- /* Control Codes requiring CSMI_ALL_SIGNATURE */ ++// Control Codes for 0.77 and later ++ ++// Control Codes requiring CSMI_ALL_SIGNATURE + + #define CC_CSMI_SAS_GET_DRIVER_INFO 0xCC770001 + #define CC_CSMI_SAS_GET_CNTLR_CONFIG 0xCC770002 + #define CC_CSMI_SAS_GET_CNTLR_STATUS 0xCC770003 + #define CC_CSMI_SAS_FIRMWARE_DOWNLOAD 0xCC770004 + +-/* Control Codes requiring CSMI_RAID_SIGNATURE */ ++// Control Codes requiring CSMI_RAID_SIGNATURE + + #define CC_CSMI_SAS_GET_RAID_INFO 0xCC77000A + #define CC_CSMI_SAS_GET_RAID_CONFIG 0xCC77000B +@@ -166,7 +166,7 @@ + #define CC_CSMI_SAS_GET_RAID_ELEMENT 0xCC77000E + #define CC_CSMI_SAS_SET_RAID_OPERATION 0xCC77000F + +-/* Control Codes requiring CSMI_SAS_SIGNATURE */ ++// Control Codes requiring CSMI_SAS_SIGNATURE + + #define CC_CSMI_SAS_GET_PHY_INFO 0xCC770014 + #define CC_CSMI_SAS_SET_PHY_INFO 0xCC770015 +@@ -182,14 +182,14 @@ + #define CC_CSMI_SAS_GET_LOCATION 0xCC770025 + + +-/* Control Codes requiring CSMI_PHY_SIGNATURE */ ++// Control Codes requiring CSMI_PHY_SIGNATURE + + #define CC_CSMI_SAS_PHY_CONTROL 0xCC77003C + +-/* #pragma CSMI_SAS_BEGIN_PACK(8) */ ++// EDM #pragma CSMI_SAS_BEGIN_PACK(8) + #pragma pack(8) + +-/* IOCTL_HEADER */ ++// IOCTL_HEADER + typedef struct _IOCTL_HEADER { + __u32 IOControllerNumber; + __u32 Length; +@@ -199,9 +199,180 @@ + } IOCTL_HEADER, + *PIOCTL_HEADER; + ++// EDM #pragma CSMI_SAS_END_PACK + #pragma pack() + + #endif ++ ++/*************************************************************************/ ++/* TARGET OS WINDOWS SPECIFIC CODE */ ++/*************************************************************************/ ++ ++#ifdef _WIN32 ++ ++// windows IOCTL definitions ++ ++#ifndef _NTDDSCSIH_ ++#include ++#endif ++ ++// pack definition ++ ++#if defined _MSC_VER ++ #define CSMI_SAS_BEGIN_PACK(x) pack(push,x) ++ #define CSMI_SAS_END_PACK pack(pop) ++#elif defined __BORLANDC__ ++ #define CSMI_SAS_BEGIN_PACK(x) option -a##x ++ #define CSMI_SAS_END_PACK option -a. ++#else ++ #error "CSMISAS.H - Must externally define a pack compiler designator." ++#endif ++ ++// base types ++ ++#define __u8 unsigned char ++#define __u16 unsigned short ++#define __u32 unsigned long ++#define __u64 unsigned __int64 ++ ++#define __i8 char ++ ++// IOCTL Control Codes ++// (IoctlHeader.ControlCode) ++ ++// Control Codes requiring CSMI_ALL_SIGNATURE ++ ++#define CC_CSMI_SAS_GET_DRIVER_INFO 1 ++#define CC_CSMI_SAS_GET_CNTLR_CONFIG 2 ++#define CC_CSMI_SAS_GET_CNTLR_STATUS 3 ++#define CC_CSMI_SAS_FIRMWARE_DOWNLOAD 4 ++ ++// Control Codes requiring CSMI_RAID_SIGNATURE ++ ++#define CC_CSMI_SAS_GET_RAID_INFO 10 ++#define CC_CSMI_SAS_GET_RAID_CONFIG 11 ++#define CC_CSMI_SAS_GET_RAID_FEATURES 12 ++#define CC_CSMI_SAS_SET_RAID_CONTROL 13 ++#define CC_CSMI_SAS_GET_RAID_ELEMENT 14 ++#define CC_CSMI_SAS_SET_RAID_OPERATION 15 ++ ++// Control Codes requiring CSMI_SAS_SIGNATURE ++ ++#define CC_CSMI_SAS_GET_PHY_INFO 20 ++#define CC_CSMI_SAS_SET_PHY_INFO 21 ++#define CC_CSMI_SAS_GET_LINK_ERRORS 22 ++#define CC_CSMI_SAS_SMP_PASSTHRU 23 ++#define CC_CSMI_SAS_SSP_PASSTHRU 24 ++#define CC_CSMI_SAS_STP_PASSTHRU 25 ++#define CC_CSMI_SAS_GET_SATA_SIGNATURE 26 ++#define CC_CSMI_SAS_GET_SCSI_ADDRESS 27 ++#define CC_CSMI_SAS_GET_DEVICE_ADDRESS 28 ++#define CC_CSMI_SAS_TASK_MANAGEMENT 29 ++#define CC_CSMI_SAS_GET_CONNECTOR_INFO 30 ++#define CC_CSMI_SAS_GET_LOCATION 31 ++ ++// Control Codes requiring CSMI_PHY_SIGNATURE ++ ++#define CC_CSMI_SAS_PHY_CONTROL 60 ++ ++#define IOCTL_HEADER SRB_IO_CONTROL ++#define PIOCTL_HEADER PSRB_IO_CONTROL ++ ++#endif ++ ++/*************************************************************************/ ++/* TARGET OS NETWARE SPECIFIC CODE */ ++/*************************************************************************/ ++ ++#ifdef _NETWARE ++ ++// NetWare IOCTL definitions ++ ++#define CSMI_SAS_BEGIN_PACK(x) pack(x) ++#define CSMI_SAS_END_PACK pack() ++ ++#ifndef LONG ++typedef unsigned long LONG; ++#endif ++ ++#ifndef WORD ++typedef unsigned short WORD; ++#endif ++ ++#ifndef BYTE ++typedef unsigned char BYTE; ++#endif ++ ++/* Need to have these definitions for Netware */ ++#define __u8 unsigned char ++#define __u16 unsigned short ++#define __u32 unsigned long ++#define __u64 unsigned __int64 ++ ++#define __i8 char ++ ++ ++// EDM #pragma CSMI_SAS_BEGIN_PACK(8) ++#pragma pack(8) ++ ++// IOCTL_HEADER ++typedef struct _IOCTL_HEADER { ++ __u32 Length; ++ __u32 ReturnCode; ++} IOCTL_HEADER, ++ *PIOCTL_HEADER; ++ ++// EDM #pragma CSMI_SAS_END_PACK ++#pragma pack() ++ ++// IOCTL Control Codes ++// (IoctlHeader.ControlCode) ++ ++// Control Codes requiring CSMI_ALL_SIGNATURE ++ ++#define CC_CSMI_SAS_GET_DRIVER_INFO 0x01FF0001 ++#define CC_CSMI_SAS_GET_CNTLR_CONFIG 0x01FF0002 ++#define CC_CSMI_SAS_GET_CNTLR_STATUS 0x01FF0003 ++#define CC_CSMI_SAS_FIRMWARE_DOWNLOAD 0x01FF0004 ++ ++// Control Codes requiring CSMI_RAID_SIGNATURE ++ ++#define CC_CSMI_SAS_GET_RAID_INFO 0x01FF000A ++#define CC_CSMI_SAS_GET_RAID_CONFIG 0x01FF000B ++#define CC_CSMI_SAS_GET_RAID_FEATURES 0x01FF000C ++#define CC_CSMI_SAS_SET_RAID_CONTROL 0x01FF000D ++#define CC_CSMI_SAS_GET_RAID_ELEMENT 0x01FF000E ++#define CC_CSMI_SAS_SET_RAID_OPERATION 0x01FF000F ++ ++// Control Codes requiring CSMI_SAS_SIGNATURE ++ ++#define CC_CSMI_SAS_GET_PHY_INFO 0x01FF0014 ++#define CC_CSMI_SAS_SET_PHY_INFO 0x01FF0015 ++#define CC_CSMI_SAS_GET_LINK_ERRORS 0x01FF0016 ++#define CC_CSMI_SAS_SMP_PASSTHRU 0x01FF0017 ++#define CC_CSMI_SAS_SSP_PASSTHRU 0x01FF0018 ++#define CC_CSMI_SAS_STP_PASSTHRU 0x01FF0019 ++#define CC_CSMI_SAS_GET_SATA_SIGNATURE 0x01FF001A ++#define CC_CSMI_SAS_GET_SCSI_ADDRESS 0x01FF001B ++#define CC_CSMI_SAS_GET_DEVICE_ADDRESS 0x01FF001C ++#define CC_CSMI_SAS_TASK_MANAGEMENT 0x01FF001D ++#define CC_CSMI_SAS_GET_CONNECTOR_INFO 0x01FF001E ++#define CC_CSMI_SAS_GET_LOCATION 0x01FF001F ++ ++// Control Codes requiring CSMI_PHY_SIGNATURE ++ ++#define CC_CSMI_SAS_PHY_CONTROL 60 ++ ++#endif ++ ++/*************************************************************************/ ++/* TARGET OS NOT DEFINED ERROR */ ++/*************************************************************************/ ++ ++// EDM ++//#if (!_WIN32 && !_linux && !_NETWARE) ++// #error "Unknown target OS." ++//#endif + + /*************************************************************************/ + /* OS INDEPENDENT CODE */ +@@ -209,8 +380,8 @@ + + /* * * * * * * * * * Class Independent IOCTL Constants * * * * * * * * * */ + +-/* Return codes for all IOCTL's regardless of class*/ +-/* (IoctlHeader.ReturnCode) */ ++// Return codes for all IOCTL's regardless of class ++// (IoctlHeader.ReturnCode) + + #define CSMI_SAS_STATUS_SUCCESS 0 + #define CSMI_SAS_STATUS_FAILED 1 +@@ -218,51 +389,51 @@ + #define CSMI_SAS_STATUS_INVALID_PARAMETER 3 + #define CSMI_SAS_STATUS_WRITE_ATTEMPTED 4 + +-/* Signature value +- (IoctlHeader.Signature) */ ++// Signature value ++// (IoctlHeader.Signature) + + #define CSMI_ALL_SIGNATURE "CSMIALL" + +-/* Timeout value default of 60 seconds +- (IoctlHeader.Timeout) */ ++// Timeout value default of 60 seconds ++// (IoctlHeader.Timeout) + + #define CSMI_ALL_TIMEOUT 60 + +-/* Direction values for data flow on this IOCTL +- (IoctlHeader.Direction, Linux only) */ ++// Direction values for data flow on this IOCTL ++// (IoctlHeader.Direction, Linux only) + #define CSMI_SAS_DATA_READ 0 + #define CSMI_SAS_DATA_WRITE 1 + +-/* I/O Bus Types +- ISA and EISA bus types are not supported +- (bIoBusType) */ ++// I/O Bus Types ++// ISA and EISA bus types are not supported ++// (bIoBusType) + + #define CSMI_SAS_BUS_TYPE_PCI 3 + #define CSMI_SAS_BUS_TYPE_PCMCIA 4 + +-/* Controller Status +- (uStatus) */ ++// Controller Status ++// (uStatus) + + #define CSMI_SAS_CNTLR_STATUS_GOOD 1 + #define CSMI_SAS_CNTLR_STATUS_FAILED 2 + #define CSMI_SAS_CNTLR_STATUS_OFFLINE 3 + #define CSMI_SAS_CNTLR_STATUS_POWEROFF 4 + +-/* Offline Status Reason +- (uOfflineReason) */ ++// Offline Status Reason ++// (uOfflineReason) + + #define CSMI_SAS_OFFLINE_REASON_NO_REASON 0 + #define CSMI_SAS_OFFLINE_REASON_INITIALIZING 1 + #define CSMI_SAS_OFFLINE_REASON_BACKSIDE_BUS_DEGRADED 2 + #define CSMI_SAS_OFFLINE_REASON_BACKSIDE_BUS_FAILURE 3 + +-/* Controller Class +- (bControllerClass) */ ++// Controller Class ++// (bControllerClass) + + #define CSMI_SAS_CNTLR_CLASS_HBA 5 + +-/* Controller Flag bits +- (uControllerFlags) */ ++// Controller Flag bits ++// (uControllerFlags) + + #define CSMI_SAS_CNTLR_SAS_HBA 0x00000001 + #define CSMI_SAS_CNTLR_SAS_RAID 0x00000002 +@@ -270,29 +441,32 @@ + #define CSMI_SAS_CNTLR_SATA_RAID 0x00000008 + #define CSMI_SAS_CNTLR_SMART_ARRAY 0x00000010 + +-/* for firmware download */ ++// for firmware download + #define CSMI_SAS_CNTLR_FWD_SUPPORT 0x00010000 + #define CSMI_SAS_CNTLR_FWD_ONLINE 0x00020000 + #define CSMI_SAS_CNTLR_FWD_SRESET 0x00040000 + #define CSMI_SAS_CNTLR_FWD_HRESET 0x00080000 + #define CSMI_SAS_CNTLR_FWD_RROM 0x00100000 + +-/* for RAID configuration supported */ ++// for RAID configuration supported + #define CSMI_SAS_CNTLR_RAID_CFG_SUPPORT 0x01000000 + +-/* Download Flag bits (uDownloadFlags) */ ++// Download Flag bits ++// (uDownloadFlags) + #define CSMI_SAS_FWD_VALIDATE 0x00000001 + #define CSMI_SAS_FWD_SOFT_RESET 0x00000002 + #define CSMI_SAS_FWD_HARD_RESET 0x00000004 + +-/* Firmware Download Status (usStatus) */ ++// Firmware Download Status ++// (usStatus) + #define CSMI_SAS_FWD_SUCCESS 0 + #define CSMI_SAS_FWD_FAILED 1 + #define CSMI_SAS_FWD_USING_RROM 2 + #define CSMI_SAS_FWD_REJECT 3 + #define CSMI_SAS_FWD_DOWNREV 4 + +-/* Firmware Download Severity (usSeverity) */ ++// Firmware Download Severity ++// (usSeverity> + #define CSMI_SAS_FWD_INFORMATION 0 + #define CSMI_SAS_FWD_WARNING 1 + #define CSMI_SAS_FWD_ERROR 2 +@@ -300,22 +474,25 @@ + + /* * * * * * * * * * SAS RAID Class IOCTL Constants * * * * * * * * */ + +-/* Return codes for the RAID IOCTL's regardless of class */ +-/* (IoctlHeader.ReturnCode) */ ++// Return codes for the RAID IOCTL's regardless of class ++// (IoctlHeader.ReturnCode) + + #define CSMI_SAS_RAID_SET_OUT_OF_RANGE 1000 + #define CSMI_SAS_RAID_SET_BUFFER_TOO_SMALL 1001 + #define CSMI_SAS_RAID_SET_DATA_CHANGED 1002 + +-/* Signature value (IoctlHeader.Signature) */ ++// Signature value ++// (IoctlHeader.Signature) + + #define CSMI_RAID_SIGNATURE "CSMIARY" + +-/* Timeout value default of 60 seconds (IoctlHeader.Timeout) */ ++// Timeout value default of 60 seconds ++// (IoctlHeader.Timeout) + + #define CSMI_RAID_TIMEOUT 60 + +-/* RAID Types (bRaidType) */ ++// RAID Types ++// (bRaidType) + #define CSMI_SAS_RAID_TYPE_NONE 0 + #define CSMI_SAS_RAID_TYPE_0 1 + #define CSMI_SAS_RAID_TYPE_1 2 +@@ -327,11 +504,12 @@ + #define CSMI_SAS_RAID_TYPE_VOLUME 8 + #define CSMI_SAS_RAID_TYPE_1E 9 + #define CSMI_SAS_RAID_TYPE_OTHER 255 +-/* the last value 255 was already defined for other so end is defined as 254 */ ++// the last value 255 was already defined for other ++// so end is defined as 254 + #define CSMI_SAS_RAID_TYPE_END 254 + +-/* RAID Status (bStatus) */ +- ++// RAID Status ++// (bStatus) + #define CSMI_SAS_RAID_SET_STATUS_OK 0 + #define CSMI_SAS_RAID_SET_STATUS_DEGRADED 1 + #define CSMI_SAS_RAID_SET_STATUS_REBUILDING 2 +@@ -341,16 +519,19 @@ + #define CSMI_SAS_RAID_SET_STATUS_QUEUED_FOR_REBUILD 6 + #define CSMI_SAS_RAID_SET_STATUS_QUEUED_FOR_TRANSFORMATION 7 + +-/* RAID Drive Count (bDriveCount, 0xF1 to 0xFF are reserved) */ ++// RAID Drive Count ++// (bDriveCount, 0xF1 to 0xFF are reserved) + #define CSMI_SAS_RAID_DRIVE_COUNT_TOO_BIG 0xF1 + #define CSMI_SAS_RAID_DRIVE_COUNT_SUPRESSED 0xF2 + +-/* RAID Data Type (bDataType) */ ++// RAID Data Type ++// (bDataType) + #define CSMI_SAS_RAID_DATA_DRIVES 0 + #define CSMI_SAS_RAID_DATA_DEVICE_ID 1 + #define CSMI_SAS_RAID_DATA_ADDITIONAL_DATA 2 + +-/* RAID Drive Status (bDriveStatus) */ ++// RAID Drive Status ++// (bDriveStatus) + #define CSMI_SAS_DRIVE_STATUS_OK 0 + #define CSMI_SAS_DRIVE_STATUS_REBUILDING 1 + #define CSMI_SAS_DRIVE_STATUS_FAILED 2 +@@ -358,13 +539,15 @@ + #define CSMI_SAS_DRIVE_STATUS_OFFLINE 4 + #define CSMI_SAS_DRIVE_STATUS_QUEUED_FOR_REBUILD 5 + +-/* RAID Drive Usage (bDriveUsage) */ ++// RAID Drive Usage ++// (bDriveUsage) + #define CSMI_SAS_DRIVE_CONFIG_NOT_USED 0 + #define CSMI_SAS_DRIVE_CONFIG_MEMBER 1 + #define CSMI_SAS_DRIVE_CONFIG_SPARE 2 + #define CSMI_SAS_DRIVE_CONFIG_SPARE_ACTIVE 3 + +-/* RAID Drive Type (bDriveType) */ ++// RAID Drive Type ++// (bDriveType) + #define CSMI_SAS_DRIVE_TYPE_UNKNOWN 0 + #define CSMI_SAS_DRIVE_TYPE_SINGLE_PORT_SAS 1 + #define CSMI_SAS_DRIVE_TYPE_DUAL_PORT_SAS 2 +@@ -372,20 +555,23 @@ + #define CSMI_SAS_DRIVE_TYPE_SATA_PS 4 + #define CSMI_SAS_DRIVE_TYPE_OTHER 255 + +-/* RAID Write Protect (bWriteProtect) */ ++// RAID Write Protect ++// (bWriteProtect) + #define CSMI_SAS_RAID_SET_WRITE_PROTECT_UNKNOWN 0 + #define CSMI_SAS_RAID_SET_WRITE_PROTECT_UNCHANGED 0 + #define CSMI_SAS_RAID_SET_WRITE_PROTECT_ENABLED 1 + #define CSMI_SAS_RAID_SET_WRITE_PROTECT_DISABLED 2 + +-/* RAID Cache Setting (bCacheSetting) */ ++// RAID Cache Setting ++// (bCacheSetting) + #define CSMI_SAS_RAID_SET_CACHE_UNKNOWN 0 + #define CSMI_SAS_RAID_SET_CACHE_UNCHANGED 0 + #define CSMI_SAS_RAID_SET_CACHE_ENABLED 1 + #define CSMI_SAS_RAID_SET_CACHE_DISABLED 2 + #define CSMI_SAS_RAID_SET_CACHE_CORRUPT 3 + +-/* RAID Features (uFeatures) */ ++// RAID Features ++// (uFeatures) + #define CSMI_SAS_RAID_FEATURE_TRANSFORMATION 0x00000001 + #define CSMI_SAS_RAID_FEATURE_REBUILD 0x00000002 + #define CSMI_SAS_RAID_FEATURE_SPLIT_MIRROR 0x00000004 +@@ -394,7 +580,8 @@ + #define CSMI_SAS_RAID_FEATURE_SURFACE_SCAN 0x00000020 + #define CSMI_SAS_RAID_FEATURE_SPARES_SHARED 0x00000040 + +-/* RAID Priority (bDefaultTransformPriority, etc.) */ ++// RAID Priority ++// (bDefaultTransformPriority, etc.) + #define CSMI_SAS_PRIORITY_UNKNOWN 0 + #define CSMI_SAS_PRIORITY_UNCHANGED 0 + #define CSMI_SAS_PRIORITY_AUTO 1 +@@ -403,25 +590,30 @@ + #define CSMI_SAS_PRIORITY_MEDIUM 4 + #define CSMI_SAS_PRIORITY_HIGH 5 + +-/* RAID Transformation Rules (uRaidSetTransformationRules) */ ++// RAID Transformation Rules ++// (uRaidSetTransformationRules) + #define CSMI_SAS_RAID_RULE_AVAILABLE_MEMORY 0x00000001 + #define CSMI_SAS_RAID_RULE_OVERLAPPED_EXTENTS 0x00000002 + +-/* RAID Cache Ratios Supported (bCacheRatiosSupported) */ +-/* from 0 to 100 defines the write to read ratio, 0 is 100% write */ ++// RAID Cache Ratios Supported ++// (bCacheRatiosSupported) ++// from 0 to 100 defines the write to read ratio, 0 is 100% write + #define CSMI_SAS_RAID_CACHE_RATIO_RANGE 101 + #define CSMI_SAS_RAID_CACHE_RATIO_FIXED 102 + #define CSMI_SAS_RAID_CACHE_RATIO_AUTO 103 + #define CSMI_SAS_RAID_CACHE_RATIO_END 255 + +-/* RAID Cache Ratio Flag (bCacheRatioFlag) */ ++// RAID Cache Ratio Flag ++// (bCacheRatioFlag) + #define CSMI_SAS_RAID_CACHE_RATIO_DISABLE 0 + #define CSMI_SAS_RAID_CACHE_RATIO_ENABLE 1 + +-/* RAID Clear Configuration Signature (bClearConfiguration) */ ++// RAID Clear Configuration Signature ++// (bClearConfiguration) + #define CSMI_SAS_RAID_CLEAR_CONFIGURATION_SIGNATURE "RAIDCLR" + +-/* RAID Failure Codes (uFailureCode) */ ++// RAID Failure Codes ++// (uFailureCode) + #define CSMI_SAS_FAIL_CODE_OK 0 + #define CSMI_SAS_FAIL_CODE_PARAMETER_INVALID 1000 + #define CSMI_SAS_FAIL_CODE_TRANSFORM_PRIORITY_INVALID 1001 +@@ -446,19 +638,22 @@ + + #define CSMI_SAS_FAIL_CODE_WAIT_FOR_OPERATION 3000 + +-/* RAID Enumeration Types (uEnumerationType) */ ++// RAID Enumeration Types ++// (uEnumerationType) + #define CSMI_SAS_RAID_ELEMENT_TYPE_DRIVE 0 + #define CSMI_SAS_RAID_ELEMENT_TYPE_MODULE 1 + #define CSMI_SAS_RAID_ELEMENT_TYPE_DRIVE_RAID_SET 2 + #define CSMI_SAS_RAID_ELEMENT_TYPE_EXTENT_DRIVE 3 + +-/* RAID Extent Types (bExtentType) */ ++// RAID Extent Types ++// (bExtentType) + #define CSMI_SAS_RAID_EXTENT_RESERVED 0 + #define CSMI_SAS_RAID_EXTENT_METADATA 1 + #define CSMI_SAS_RAID_EXTENT_ALLOCATED 2 + #define CSMI_SAS_RAID_EXTENT_UNALLOCATED 3 + +-/* RAID Operation Types (uOperationType) */ ++// RAID Operation Types ++// (uOperationType) + #define CSMI_SAS_RAID_SET_CREATE 0 + #define CSMI_SAS_RAID_SET_LABEL 1 + #define CSMI_SAS_RAID_SET_TRANSFORM 2 +@@ -468,20 +663,23 @@ + #define CSMI_SAS_RAID_SET_ONLINE_STATE 6 + #define CSMI_SAS_RAID_SET_SPARE 7 + +-/* RAID Transform Types (bTransformType) */ ++// RAID Transform Types ++// (bTransformType) + #define CSMI_SAS_RAID_SET_TRANSFORM_SPLIT_MIRROR 0 + #define CSMI_SAS_RAID_SET_TRANSFORM_MERGE_RAID_0 1 + #define CSMI_SAS_RAID_SET_TRANSFORM_LUN_RENUMBER 2 + #define CSMI_SAS_RAID_SET_TRANSFORM_RAID_SET 3 + +-/* RAID Online State (bOnlineState) */ ++// RAID Online State ++// (bOnlineState) + #define CSMI_SAS_RAID_SET_STATE_UNKNOWN 0 + #define CSMI_SAS_RAID_SET_STATE_ONLINE 1 + #define CSMI_SAS_RAID_SET_STATE_OFFLINE 2 + + /* * * * * * * * * * SAS HBA Class IOCTL Constants * * * * * * * * * */ + +-/* Return codes for SAS IOCTL's (IoctlHeader.ReturnCode) */ ++// Return codes for SAS IOCTL's ++// (IoctlHeader.ReturnCode) + + #define CSMI_SAS_PHY_INFO_CHANGED CSMI_SAS_STATUS_SUCCESS + #define CSMI_SAS_PHY_INFO_NOT_CHANGEABLE 2000 +@@ -502,15 +700,18 @@ + #define CSMI_SAS_NO_SCSI_ADDRESS 2013 + #define CSMI_SAS_NO_DEVICE_ADDRESS 2014 + +-/* Signature value (IoctlHeader.Signature) */ ++// Signature value ++// (IoctlHeader.Signature) + + #define CSMI_SAS_SIGNATURE "CSMISAS" + +-/* Timeout value default of 60 seconds (IoctlHeader.Timeout) */ ++// Timeout value default of 60 seconds ++// (IoctlHeader.Timeout) + + #define CSMI_SAS_TIMEOUT 60 + +-/* Device types (bDeviceType) */ ++// Device types ++// (bDeviceType) + + #define CSMI_SAS_PHY_UNUSED 0x00 + #define CSMI_SAS_NO_DEVICE_ATTACHED 0x00 +@@ -518,15 +719,16 @@ + #define CSMI_SAS_EDGE_EXPANDER_DEVICE 0x20 + #define CSMI_SAS_FANOUT_EXPANDER_DEVICE 0x30 + +-/* Protocol options (bInitiatorPortProtocol, bTargetPortProtocol) */ ++// Protocol options ++// (bInitiatorPortProtocol, bTargetPortProtocol) + + #define CSMI_SAS_PROTOCOL_SATA 0x01 + #define CSMI_SAS_PROTOCOL_SMP 0x02 + #define CSMI_SAS_PROTOCOL_STP 0x04 + #define CSMI_SAS_PROTOCOL_SSP 0x08 + +-/* Negotiated and hardware link rates */ +-/* (bNegotiatedLinkRate, bMinimumLinkRate, bMaximumLinkRate) */ ++// Negotiated and hardware link rates ++// (bNegotiatedLinkRate, bMinimumLinkRate, bMaximumLinkRate) + + #define CSMI_SAS_LINK_RATE_UNKNOWN 0x00 + #define CSMI_SAS_PHY_DISABLED 0x01 +@@ -537,7 +739,8 @@ + #define CSMI_SAS_LINK_RATE_3_0_GBPS 0x09 + #define CSMI_SAS_LINK_VIRTUAL 0x10 + +-/* Discover state (bAutoDiscover) */ ++// Discover state ++// (bAutoDiscover) + + #define CSMI_SAS_DISCOVER_NOT_SUPPORTED 0x00 + #define CSMI_SAS_DISCOVER_NOT_STARTED 0x01 +@@ -545,49 +748,57 @@ + #define CSMI_SAS_DISCOVER_COMPLETE 0x03 + #define CSMI_SAS_DISCOVER_ERROR 0x04 + +-/* Phy features */ ++// Phy features + + #define CSMI_SAS_PHY_VIRTUAL_SMP 0x01 + +-/* Programmed link rates (bMinimumLinkRate, bMaximumLinkRate) */ +-/* (bProgrammedMinimumLinkRate, bProgrammedMaximumLinkRate) */ ++// Programmed link rates ++// (bMinimumLinkRate, bMaximumLinkRate) ++// (bProgrammedMinimumLinkRate, bProgrammedMaximumLinkRate) + + #define CSMI_SAS_PROGRAMMED_LINK_RATE_UNCHANGED 0x00 + #define CSMI_SAS_PROGRAMMED_LINK_RATE_1_5_GBPS 0x08 + #define CSMI_SAS_PROGRAMMED_LINK_RATE_3_0_GBPS 0x09 + +-/* Link rate (bNegotiatedLinkRate in CSMI_SAS_SET_PHY_INFO) */ ++// Link rate ++// (bNegotiatedLinkRate in CSMI_SAS_SET_PHY_INFO) + + #define CSMI_SAS_LINK_RATE_NEGOTIATE 0x00 + #define CSMI_SAS_LINK_RATE_PHY_DISABLED 0x01 + +-/* Signal class (bSignalClass in CSMI_SAS_SET_PHY_INFO) */ ++// Signal class ++// (bSignalClass in CSMI_SAS_SET_PHY_INFO) + + #define CSMI_SAS_SIGNAL_CLASS_UNKNOWN 0x00 + #define CSMI_SAS_SIGNAL_CLASS_DIRECT 0x01 + #define CSMI_SAS_SIGNAL_CLASS_SERVER 0x02 + #define CSMI_SAS_SIGNAL_CLASS_ENCLOSURE 0x03 + +-/* Link error reset (bResetCounts) */ ++// Link error reset ++// (bResetCounts) + + #define CSMI_SAS_LINK_ERROR_DONT_RESET_COUNTS 0x00 + #define CSMI_SAS_LINK_ERROR_RESET_COUNTS 0x01 + +-/* Phy identifier (bPhyIdentifier) */ ++// Phy identifier ++// (bPhyIdentifier) + + #define CSMI_SAS_USE_PORT_IDENTIFIER 0xFF + +-/* Port identifier (bPortIdentifier) */ ++// Port identifier ++// (bPortIdentifier) + + #define CSMI_SAS_IGNORE_PORT 0xFF + +-/* Programmed link rates (bConnectionRate) */ ++// Programmed link rates ++// (bConnectionRate) + + #define CSMI_SAS_LINK_RATE_NEGOTIATED 0x00 + #define CSMI_SAS_LINK_RATE_1_5_GBPS 0x08 + #define CSMI_SAS_LINK_RATE_3_0_GBPS 0x09 + +-/* Connection status (bConnectionStatus) */ ++// Connection status ++// (bConnectionStatus) + + #define CSMI_SAS_OPEN_ACCEPT 0 + #define CSMI_SAS_OPEN_REJECT_BAD_DESTINATION 1 +@@ -603,7 +814,8 @@ + #define CSMI_SAS_OPEN_REJECT_STP_RESOURCES_BUSY 11 + #define CSMI_SAS_OPEN_REJECT_WRONG_DESTINATION 12 + +-/* SSP Status (bSSPStatus)*/ ++// SSP Status ++// (bSSPStatus) + + #define CSMI_SAS_SSP_STATUS_UNKNOWN 0x00 + #define CSMI_SAS_SSP_STATUS_WAITING 0x01 +@@ -612,7 +824,8 @@ + #define CSMI_SAS_SSP_STATUS_RETRY 0x04 + #define CSMI_SAS_SSP_STATUS_NO_TAG 0x05 + +-/* SSP Flags (uFlags) */ ++// SSP Flags ++// (uFlags) + + #define CSMI_SAS_SSP_READ 0x00000001 + #define CSMI_SAS_SSP_WRITE 0x00000002 +@@ -623,13 +836,15 @@ + #define CSMI_SAS_SSP_TASK_ATTRIBUTE_ORDERED 0x00000020 + #define CSMI_SAS_SSP_TASK_ATTRIBUTE_ACA 0x00000040 + +-/* SSP Data present (bDataPresent) */ ++// SSP Data present ++// (bDataPresent) + + #define CSMI_SAS_SSP_NO_DATA_PRESENT 0x00 + #define CSMI_SAS_SSP_RESPONSE_DATA_PRESENT 0x01 + #define CSMI_SAS_SSP_SENSE_DATA_PRESENT 0x02 + +-/* STP Flags (uFlags) */ ++// STP Flags ++// (uFlags) + + #define CSMI_SAS_STP_READ 0x00000001 + #define CSMI_SAS_STP_WRITE 0x00000002 +@@ -641,13 +856,15 @@ + #define CSMI_SAS_STP_EXECUTE_DIAG 0x00000100 + #define CSMI_SAS_STP_RESET_DEVICE 0x00000200 + +-/* Task Management Flags (uFlags) */ ++// Task Management Flags ++// (uFlags) + + #define CSMI_SAS_TASK_IU 0x00000001 + #define CSMI_SAS_HARD_RESET_SEQUENCE 0x00000002 + #define CSMI_SAS_SUPPRESS_RESULT 0x00000004 + +-/* Task Management Functions (bTaskManagement) */ ++// Task Management Functions ++// (bTaskManagement) + + #define CSMI_SAS_SSP_ABORT_TASK 0x01 + #define CSMI_SAS_SSP_ABORT_TASK_SET 0x02 +@@ -656,14 +873,16 @@ + #define CSMI_SAS_SSP_CLEAR_ACA 0x40 + #define CSMI_SAS_SSP_QUERY_TASK 0x80 + +-/* Task Management Information (uInformation) */ ++// Task Management Information ++// (uInformation) + + #define CSMI_SAS_SSP_TEST 1 + #define CSMI_SAS_SSP_EXCEEDED 2 + #define CSMI_SAS_SSP_DEMAND 3 + #define CSMI_SAS_SSP_TRIGGER 4 + +-/* Connector Pinout Information (uPinout) */ ++// Connector Pinout Information ++// (uPinout) + + #define CSMI_SAS_CON_UNKNOWN 0x00000001 + #define CSMI_SAS_CON_SFF_8482 0x00000002 +@@ -676,9 +895,10 @@ + #define CSMI_SAS_CON_SFF_8484_LANE_3 0x00040000 + #define CSMI_SAS_CON_SFF_8484_LANE_4 0x00080000 + +-/* Connector Location Information (bLocation) */ ++// Connector Location Information ++// (bLocation) + +-/* same as uPinout above... */ ++// same as uPinout above... + // #define CSMI_SAS_CON_UNKNOWN 0x01 + #define CSMI_SAS_CON_INTERNAL 0x02 + #define CSMI_SAS_CON_EXTERNAL 0x04 +@@ -687,13 +907,15 @@ + #define CSMI_SAS_CON_NOT_PRESENT 0x20 + #define CSMI_SAS_CON_NOT_CONNECTED 0x80 + +-/* Device location identification (bIdentify) */ ++// Device location identification ++// (bIdentify) + + #define CSMI_SAS_LOCATE_UNKNOWN 0x00 + #define CSMI_SAS_LOCATE_FORCE_OFF 0x01 + #define CSMI_SAS_LOCATE_FORCE_ON 0x02 + +-/* Location Valid flags (uLocationFlags) */ ++// Location Valid flags ++// (uLocationFlags) + + #define CSMI_SAS_LOCATE_SAS_ADDRESS_VALID 0x00000001 + #define CSMI_SAS_LOCATE_SAS_LUN_VALID 0x00000002 +@@ -705,41 +927,48 @@ + + /* * * * * * * * SAS Phy Control Class IOCTL Constants * * * * * * * * */ + +-/* Return codes for SAS Phy Control IOCTL's (IoctlHeader.ReturnCode) */ ++// Return codes for SAS Phy Control IOCTL's ++// (IoctlHeader.ReturnCode) + +-/* Signature value (IoctlHeader.Signature) */ ++// Signature value ++// (IoctlHeader.Signature) + + #define CSMI_PHY_SIGNATURE "CSMIPHY" + +-/* Phy Control Functions (bFunction) */ ++// Phy Control Functions ++// (bFunction) + +-/* values 0x00 to 0xFF are consistent in definition with the SMP PHY CONTROL +- function defined in the SAS spec */ ++// values 0x00 to 0xFF are consistent in definition with the SMP PHY CONTROL ++// function defined in the SAS spec + #define CSMI_SAS_PC_NOP 0x00000000 + #define CSMI_SAS_PC_LINK_RESET 0x00000001 + #define CSMI_SAS_PC_HARD_RESET 0x00000002 + #define CSMI_SAS_PC_PHY_DISABLE 0x00000003 +-/* 0x04 to 0xFF reserved... */ ++// 0x04 to 0xFF reserved... + #define CSMI_SAS_PC_GET_PHY_SETTINGS 0x00000100 + +-/* Link Flags */ ++// Link Flags + #define CSMI_SAS_PHY_ACTIVATE_CONTROL 0x00000001 + #define CSMI_SAS_PHY_UPDATE_SPINUP_RATE 0x00000002 + #define CSMI_SAS_PHY_AUTO_COMWAKE 0x00000004 + +-/* Device Types for Phy Settings (bType) */ ++// Device Types for Phy Settings ++// (bType) + #define CSMI_SAS_UNDEFINED 0x00 + #define CSMI_SAS_SATA 0x01 + #define CSMI_SAS_SAS 0x02 + +-/* Transmitter Flags (uTransmitterFlags) */ ++// Transmitter Flags ++// (uTransmitterFlags) + #define CSMI_SAS_PHY_PREEMPHASIS_DISABLED 0x00000001 + +-/* Receiver Flags (uReceiverFlags) */ ++// Receiver Flags ++// (uReceiverFlags) + #define CSMI_SAS_PHY_EQUALIZATION_DISABLED 0x00000001 + +-/* Pattern Flags (uPatternFlags) */ +-#define CSMI_SAS_PHY_ACTIVATE_CONTROL 0x00000001 ++// Pattern Flags ++// (uPatternFlags) ++// #define CSMI_SAS_PHY_ACTIVATE_CONTROL 0x00000001 + #define CSMI_SAS_PHY_DISABLE_SCRAMBLING 0x00000002 + #define CSMI_SAS_PHY_DISABLE_ALIGN 0x00000004 + #define CSMI_SAS_PHY_DISABLE_SSC 0x00000008 +@@ -747,16 +976,18 @@ + #define CSMI_SAS_PHY_FIXED_PATTERN 0x00000010 + #define CSMI_SAS_PHY_USER_PATTERN 0x00000020 + +-/* Fixed Patterns (bFixedPattern) */ ++// Fixed Patterns ++// (bFixedPattern) + #define CSMI_SAS_PHY_CJPAT 0x00000001 + #define CSMI_SAS_PHY_ALIGN 0x00000002 + +-/* Type Flags (bTypeFlags) */ ++// Type Flags ++// (bTypeFlags) + #define CSMI_SAS_PHY_POSITIVE_DISPARITY 0x01 + #define CSMI_SAS_PHY_NEGATIVE_DISPARITY 0x02 + #define CSMI_SAS_PHY_CONTROL_CHARACTER 0x04 + +-/* Miscellaneous */ ++// Miscellaneous + #define SLOT_NUMBER_UNKNOWN 0xFFFF + + /*************************************************************************/ +@@ -765,9 +996,10 @@ + + /* * * * * * * * * * Class Independent Structures * * * * * * * * * */ + ++// EDM #pragma CSMI_SAS_BEGIN_PACK(8) + #pragma pack(8) + +-/* CC_CSMI_SAS_DRIVER_INFO */ ++// CC_CSMI_SAS_DRIVER_INFO + + typedef struct _CSMI_SAS_DRIVER_INFO { + __u8 szName[81]; +@@ -787,7 +1019,7 @@ + } CSMI_SAS_DRIVER_INFO_BUFFER, + *PCSMI_SAS_DRIVER_INFO_BUFFER; + +-/* CC_CSMI_SAS_CNTLR_CONFIGURATION */ ++// CC_CSMI_SAS_CNTLR_CONFIGURATION + + typedef struct _CSMI_SAS_PCI_BUS_ADDRESS { + __u8 bBusNumber; +@@ -842,7 +1074,7 @@ + } CSMI_SAS_CNTLR_CONFIG_BUFFER, + *PCSMI_SAS_CNTLR_CONFIG_BUFFER; + +-/* CC_CSMI_SAS_CNTLR_STATUS */ ++// CC_CSMI_SAS_CNTLR_STATUS + + typedef struct _CSMI_SAS_CNTLR_STATUS { + __u32 uStatus; +@@ -857,7 +1089,7 @@ + } CSMI_SAS_CNTLR_STATUS_BUFFER, + *PCSMI_SAS_CNTLR_STATUS_BUFFER; + +-/* CC_CSMI_SAS_FIRMWARE_DOWNLOAD */ ++// CC_CSMI_SAS_FIRMWARE_DOWNLOAD + + typedef struct _CSMI_SAS_FIRMWARE_DOWNLOAD { + __u32 uBufferLength; +@@ -875,7 +1107,7 @@ + } CSMI_SAS_FIRMWARE_DOWNLOAD_BUFFER, + *PCSMI_SAS_FIRMWARE_DOWNLOAD_BUFFER; + +-/* CC_CSMI_SAS_RAID_INFO */ ++// CC_CSMI_SAS_RAID_INFO + + typedef struct _CSMI_SAS_RAID_INFO { + __u32 uNumRaidSets; +@@ -908,7 +1140,7 @@ + } CSMI_SAS_RAID_INFO_BUFFER, + *PCSMI_SAS_RAID_INFO_BUFFER; + +-/* CC_CSMI_SAS_GET_RAID_CONFIG */ ++// CC_CSMI_SAS_GET_RAID_CONFIG + + typedef struct _CSMI_SAS_RAID_DRIVES { + __u8 bModel[40]; +@@ -988,7 +1220,7 @@ + } CSMI_SAS_RAID_CONFIG_BUFFER, + *PCSMI_SAS_RAID_CONFIG_BUFFER; + +-/* CC_CSMI_SAS_GET_RAID_FEATURES */ ++// CC_CSMI_SAS_GET_RAID_FEATURES + + typedef struct _CSMI_SAS_RAID_TYPE_DESCRIPTION { + __u8 bRaidType; +@@ -1024,7 +1256,7 @@ + } CSMI_SAS_RAID_FEATURES_BUFFER, + *PCSMI_SAS_RAID_FEATURES_BUFFER; + +-/* CC_CSMI_SAS_SET_RAID_CONTROL */ ++// CC_CSMI_SAS_SET_RAID_CONTROL + + typedef struct _CSMI_SAS_RAID_CONTROL { + __u8 bTransformPriority; +@@ -1047,7 +1279,7 @@ + } CSMI_SAS_RAID_CONTROL_BUFFER, + *PCSMI_SAS_RAID_CONTROL_BUFFER; + +-/* CC_CSMI_SAS_GET_RAID_ELEMENT */ ++// CC_CSMI_SAS_GET_RAID_ELEMENT + + typedef struct _CSMI_SAS_DRIVE_EXTENT_INFO { + __u32 uDriveIndex; +@@ -1121,7 +1353,7 @@ + } CSMI_SAS_RAID_ELEMENT_BUFFER, + *PCSMI_SAS_RAID_ELEMENT_BUFFER; + +-/* CC_CSMI_SAS_SET_RAID_OPERATION */ ++// CC_CSMI_SAS_SET_RAID_OPERATION + + typedef struct _CSMI_SAS_RAID_SET_LIST { + __u32 uRaidSetIndex; +@@ -1271,7 +1503,7 @@ + + /* * * * * * * * * * SAS HBA Class Structures * * * * * * * * * */ + +-/* CC_CSMI_SAS_GET_PHY_INFO */ ++// CC_CSMI_SAS_GET_PHY_INFO + + typedef struct _CSMI_SAS_IDENTIFY { + __u8 bDeviceType; +@@ -1313,7 +1545,7 @@ + } CSMI_SAS_PHY_INFO_BUFFER, + *PCSMI_SAS_PHY_INFO_BUFFER; + +-/* CC_CSMI_SAS_SET_PHY_INFO */ ++// CC_CSMI_SAS_SET_PHY_INFO + + typedef struct _CSMI_SAS_SET_PHY_INFO { + __u8 bPhyIdentifier; +@@ -1331,7 +1563,7 @@ + } CSMI_SAS_SET_PHY_INFO_BUFFER, + *PCSMI_SAS_SET_PHY_INFO_BUFFER; + +-/* CC_CSMI_SAS_GET_LINK_ERRORS */ ++// CC_CSMI_SAS_GET_LINK_ERRORS + + typedef struct _CSMI_SAS_LINK_ERRORS { + __u8 bPhyIdentifier; +@@ -1350,7 +1582,7 @@ + } CSMI_SAS_LINK_ERRORS_BUFFER, + *PCSMI_SAS_LINK_ERRORS_BUFFER; + +-/* CC_CSMI_SAS_SMP_PASSTHRU */ ++// CC_CSMI_SAS_SMP_PASSTHRU + + typedef struct _CSMI_SAS_SMP_REQUEST { + __u8 bFrameType; +@@ -1390,7 +1622,7 @@ + } CSMI_SAS_SMP_PASSTHRU_BUFFER, + *PCSMI_SAS_SMP_PASSTHRU_BUFFER; + +-/* CC_CSMI_SAS_SSP_PASSTHRU */ ++// CC_CSMI_SAS_SSP_PASSTHRU + + typedef struct _CSMI_SAS_SSP_PASSTHRU { + __u8 bPhyIdentifier; +@@ -1429,7 +1661,7 @@ + } CSMI_SAS_SSP_PASSTHRU_BUFFER, + *PCSMI_SAS_SSP_PASSTHRU_BUFFER; + +-/* CC_CSMI_SAS_STP_PASSTHRU */ ++// CC_CSMI_SAS_STP_PASSTHRU + + typedef struct _CSMI_SAS_STP_PASSTHRU { + __u8 bPhyIdentifier; +@@ -1461,7 +1693,7 @@ + } CSMI_SAS_STP_PASSTHRU_BUFFER, + *PCSMI_SAS_STP_PASSTHRU_BUFFER; + +-/* CC_CSMI_SAS_GET_SATA_SIGNATURE */ ++// CC_CSMI_SAS_GET_SATA_SIGNATURE + + typedef struct _CSMI_SAS_SATA_SIGNATURE { + __u8 bPhyIdentifier; +@@ -1476,7 +1708,7 @@ + } CSMI_SAS_SATA_SIGNATURE_BUFFER, + *PCSMI_SAS_SATA_SIGNATURE_BUFFER; + +-/* CC_CSMI_SAS_GET_SCSI_ADDRESS */ ++// CC_CSMI_SAS_GET_SCSI_ADDRESS + + typedef struct _CSMI_SAS_GET_SCSI_ADDRESS_BUFFER { + IOCTL_HEADER IoctlHeader; +@@ -1489,7 +1721,7 @@ + } CSMI_SAS_GET_SCSI_ADDRESS_BUFFER, + *PCSMI_SAS_GET_SCSI_ADDRESS_BUFFER; + +-/* CC_CSMI_SAS_GET_DEVICE_ADDRESS */ ++// CC_CSMI_SAS_GET_DEVICE_ADDRESS + + typedef struct _CSMI_SAS_GET_DEVICE_ADDRESS_BUFFER { + IOCTL_HEADER IoctlHeader; +@@ -1502,7 +1734,7 @@ + } CSMI_SAS_GET_DEVICE_ADDRESS_BUFFER, + *PCSMI_SAS_GET_DEVICE_ADDRESS_BUFFER; + +-/* CC_CSMI_SAS_TASK_MANAGEMENT */ ++// CC_CSMI_SAS_TASK_MANAGEMENT + + typedef struct _CSMI_SAS_SSP_TASK_IU { + __u8 bHostIndex; +@@ -1525,7 +1757,7 @@ + } CSMI_SAS_SSP_TASK_IU_BUFFER, + *PCSMI_SAS_SSP_TASK_IU_BUFFER; + +-/* CC_CSMI_SAS_GET_CONNECTOR_INFO */ ++// CC_CSMI_SAS_GET_CONNECTOR_INFO + + typedef struct _CSMI_SAS_GET_CONNECTOR_INFO { + __u32 uPinout; +@@ -1541,7 +1773,7 @@ + } CSMI_SAS_CONNECTOR_INFO_BUFFER, + *PCSMI_SAS_CONNECTOR_INFO_BUFFER; + +-/* CC_CSMI_SAS_GET_LOCATION */ ++// CC_CSMI_SAS_GET_LOCATION + + typedef struct _CSMI_SAS_LOCATION_IDENTIFIER { + __u32 bLocationFlags; +@@ -1569,7 +1801,7 @@ + } CSMI_SAS_GET_LOCATION_BUFFER, + *PCSMI_SAS_GET_LOCATION_BUFFER; + +-/* CC_CSMI_SAS_PHY_CONTROL */ ++// CC_CSMI_SAS_PHY_CONTROL + + typedef struct _CSMI_SAS_CHARACTER { + __u8 bTypeFlags; +@@ -1616,6 +1848,7 @@ + } CSMI_SAS_PHY_CONTROL_BUFFER, + *PCSMI_SAS_PHY_CONTROL_BUFFER; + ++//EDM #pragma CSMI_SAS_END_PACK + #pragma pack() + + #endif // _CSMI_SAS_H_ +diff -r 60d73800068f drivers/message/fusion/linux_compat.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/message/fusion/linux_compat.h Wed Jul 01 09:46:25 2009 +0100 +@@ -0,0 +1,73 @@ ++/* drivers/message/fusion/linux_compat.h */ ++#ifndef FUSION_LINUX_COMPAT_H ++#define FUSION_LINUX_COMPAT_H ++ ++#include ++#include ++#include ++#include ++#include ++ ++#ifndef PCI_VENDOR_ID_ATTO ++#define PCI_VENDOR_ID_ATTO 0x117c ++#endif ++ ++#ifndef PCI_VENDOR_ID_BROCADE ++#define PCI_VENDOR_ID_BROCADE 0x1657 ++#endif ++ ++/* ++ * TODO Need to change 'shost_private' back to 'shost_priv' when suppying patchs ++ * upstream. Since Red Hat decided to backport this to rhel5.2 (2.6.18-92.el5) ++ * from the 2.6.23 kernel, it will make it difficult for us to add the proper ++ * glue in our driver. ++ */ ++static inline void *shost_private(struct Scsi_Host *shost) ++{ ++ return (void *)shost->hostdata; ++} ++ ++#ifndef spi_dv_pending ++#define spi_dv_pending(x) (((struct spi_transport_attrs *)&(x)->starget_data)->dv_pending) ++#endif ++#ifndef upper_32_bits ++#define upper_32_bits(n) ((u32)(((n) >> 16) >> 16)) ++#endif ++#ifndef lower_32_bits ++#define lower_32_bits(n) ((u32)(n)) ++#endif ++/** ++ * mpt_scsilun_to_int: convert a scsi_lun to an int ++ * @scsilun: struct scsi_lun to be converted. ++ * ++ * Description: ++ * Convert @scsilun from a struct scsi_lun to a four byte host byte-ordered ++ * integer, and return the result. The caller must check for ++ * truncation before using this function. ++ * ++ * Notes: ++ * The struct scsi_lun is assumed to be four levels, with each level ++ * effectively containing a SCSI byte-ordered (big endian) short; the ++ * addressing bits of each level are ignored (the highest two bits). ++ * For a description of the LUN format, post SCSI-3 see the SCSI ++ * Architecture Model, for SCSI-3 see the SCSI Controller Commands. ++ * ++ * Given a struct scsi_lun of: 0a 04 0b 03 00 00 00 00, this function returns ++ * the integer: 0x0b030a04 ++ **/ ++static inline int mpt_scsilun_to_int(struct scsi_lun *scsilun) ++{ ++ int i; ++ unsigned int lun; ++ ++ lun = 0; ++ for (i = 0; i < sizeof(lun); i += 2) ++ lun = lun | (((scsilun->scsi_lun[i] << 8) | ++ scsilun->scsi_lun[i + 1]) << (i * 8)); ++ return lun; ++} ++#if (defined(CONFIG_SUSE_KERNEL) && !defined(scsi_is_sas_phy_local)) ++#define SUSE_KERNEL_BASE 1 ++#endif ++/*}-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ ++#endif /* _LINUX_COMPAT_H */ +diff -r 60d73800068f drivers/message/fusion/lsi/mpi.h +--- a/drivers/message/fusion/lsi/mpi.h Tue Jun 30 11:26:39 2009 +0100 ++++ b/drivers/message/fusion/lsi/mpi.h Wed Jul 01 09:46:25 2009 +0100 +@@ -6,7 +6,7 @@ + * Title: MPI Message independent structures and definitions + * Creation Date: July 27, 2000 + * +- * mpi.h Version: 01.05.16 ++ * mpi.h Version: 01.05.17 + * + * Version History + * --------------- +@@ -82,6 +82,7 @@ + * 08-07-07 01.05.14 Bumped MPI_HEADER_VERSION_UNIT. + * 01-15-08 01.05.15 Bumped MPI_HEADER_VERSION_UNIT. + * 03-28-08 01.05.16 Bumped MPI_HEADER_VERSION_UNIT. ++ * 07-11-08 01.05.17 Bumped MPI_HEADER_VERSION_UNIT. + * -------------------------------------------------------------------------- + */ + +@@ -112,7 +113,7 @@ + /* Note: The major versions of 0xe0 through 0xff are reserved */ + + /* versioning for this MPI header set */ +-#define MPI_HEADER_VERSION_UNIT (0x13) ++#define MPI_HEADER_VERSION_UNIT (0x14) + #define MPI_HEADER_VERSION_DEV (0x00) + #define MPI_HEADER_VERSION_UNIT_MASK (0xFF00) + #define MPI_HEADER_VERSION_UNIT_SHIFT (8) +diff -r 60d73800068f drivers/message/fusion/lsi/mpi_cnfg.h +--- a/drivers/message/fusion/lsi/mpi_cnfg.h Tue Jun 30 11:26:39 2009 +0100 ++++ b/drivers/message/fusion/lsi/mpi_cnfg.h Wed Jul 01 09:46:25 2009 +0100 +@@ -6,7 +6,7 @@ + * Title: MPI Config message, structures, and Pages + * Creation Date: July 27, 2000 + * +- * mpi_cnfg.h Version: 01.05.18 ++ * mpi_cnfg.h Version: 01.05.19 + * + * Version History + * --------------- +@@ -322,6 +322,14 @@ + * 03-28-08 01.05.18 Defined new bits in Manufacturing Page 4 ExtFlags field + * to control coercion size and the mixing of SAS and SATA + * SSD drives. ++ * 07-11-08 01.05.19 Added defines MPI_MANPAGE4_EXTFLAGS_RAID0_SINGLE_DRIVE ++ * and MPI_MANPAGE4_EXTFLAGS_SSD_SCRUB_DISABLE for ExtFlags ++ * field of Manufacturing Page 4. ++ * Added defines for a new bit in BIOS Page 1 BiosOptions ++ * field to control adapter scan order. ++ * Added BootDeviceWaitTime field to SAS IO Unit Page 2. ++ * Added MPI_SAS_PHY0_PHYINFO_PHY_VACANT for use in PhyInfo ++ * field of SAS Expander Page 1. + * -------------------------------------------------------------------------- + */ + +@@ -700,6 +708,8 @@ + #define MPI_MANPAGE4_IR_NO_MIX_SAS_SATA (0x01) + + /* defines for the ExtFlags field */ ++#define MPI_MANPAGE4_EXTFLAGS_RAID0_SINGLE_DRIVE (0x0400) ++#define MPI_MANPAGE4_EXTFLAGS_SSD_SCRUB_DISABLE (0x0200) + #define MPI_MANPAGE4_EXTFLAGS_MASK_COERCION_SIZE (0x0180) + #define MPI_MANPAGE4_EXTFLAGS_SHIFT_COERCION_SIZE (7) + #define MPI_MANPAGE4_EXTFLAGS_1GB_COERCION_SIZE (0) +@@ -1219,6 +1229,10 @@ + #define MPI_BIOSPAGE1_OPTIONS_SPI_ENABLE (0x00000400) + #define MPI_BIOSPAGE1_OPTIONS_FC_ENABLE (0x00000200) + #define MPI_BIOSPAGE1_OPTIONS_SAS_ENABLE (0x00000100) ++ ++#define MPI_BIOSPAGE1_OPTIONS_SCAN_HIGH_TO_LOW (0x00000002) ++#define MPI_BIOSPAGE1_OPTIONS_SCAN_LOW_TO_HIGH (0x00000000) ++ + #define MPI_BIOSPAGE1_OPTIONS_DISABLE_BIOS (0x00000001) + + /* values for the IOCSettings field */ +@@ -1452,7 +1466,8 @@ + #define MPI_BIOSPAGE2_FORM_SAS_WWN (0x05) + #define MPI_BIOSPAGE2_FORM_ENCLOSURE_SLOT (0x06) + +-typedef struct _CONFIG_PAGE_BIOS_4 { ++typedef struct _CONFIG_PAGE_BIOS_4 ++{ + CONFIG_PAGE_HEADER Header; /* 00h */ + U64 ReassignmentBaseWWID; /* 04h */ + } CONFIG_PAGE_BIOS_4, MPI_POINTER PTR_CONFIG_PAGE_BIOS_4, +@@ -2711,7 +2726,7 @@ + { + CONFIG_EXTENDED_PAGE_HEADER Header; /* 00h */ + U8 NumDevsPerEnclosure; /* 08h */ +- U8 Reserved1; /* 09h */ ++ U8 BootDeviceWaitTime; /* 09h */ + U16 Reserved2; /* 0Ah */ + U16 MaxPersistentIDs; /* 0Ch */ + U16 NumPersistentIDsUsed; /* 0Eh */ +@@ -2721,7 +2736,7 @@ + } CONFIG_PAGE_SAS_IO_UNIT_2, MPI_POINTER PTR_CONFIG_PAGE_SAS_IO_UNIT_2, + SasIOUnitPage2_t, MPI_POINTER pSasIOUnitPage2_t; + +-#define MPI_SASIOUNITPAGE2_PAGEVERSION (0x06) ++#define MPI_SASIOUNITPAGE2_PAGEVERSION (0x07) + + /* values for SAS IO Unit Page 2 Status field */ + #define MPI_SAS_IOUNIT2_STATUS_DEVICE_LIMIT_EXCEEDED (0x08) +@@ -2996,6 +3011,7 @@ + #define MPI_SAS_PHY0_FLAGS_SGPIO_DIRECT_ATTACH_ENC (0x01) + + /* values for SAS PHY Page 0 PhyInfo field */ ++#define MPI_SAS_PHY0_PHYINFO_PHY_VACANT (0x80000000) + #define MPI_SAS_PHY0_PHYINFO_SATA_PORT_ACTIVE (0x00004000) + #define MPI_SAS_PHY0_PHYINFO_SATA_PORT_SELECTOR (0x00002000) + #define MPI_SAS_PHY0_PHYINFO_VIRTUAL_PHY (0x00001000) +diff -r 60d73800068f drivers/message/fusion/lsi/mpi_history.txt +--- a/drivers/message/fusion/lsi/mpi_history.txt Tue Jun 30 11:26:39 2009 +0100 ++++ b/drivers/message/fusion/lsi/mpi_history.txt Wed Jul 01 09:46:25 2009 +0100 +@@ -6,15 +6,15 @@ + Copyright (c) 2000-2008 LSI Corporation. + + --------------------------------------- +- Header Set Release Version: 01.05.19 +- Header Set Release Date: 03-28-08 ++ Header Set Release Version: 01.05.20 ++ Header Set Release Date: 07-11-08 + --------------------------------------- + + Filename Current version Prior version + ---------- --------------- ------------- +- mpi.h 01.05.16 01.05.15 +- mpi_ioc.h 01.05.16 01.05.15 +- mpi_cnfg.h 01.05.18 01.05.17 ++ mpi.h 01.05.17 01.05.16 ++ mpi_ioc.h 01.05.16 01.05.16 ++ mpi_cnfg.h 01.05.19 01.05.18 + mpi_init.h 01.05.09 01.05.09 + mpi_targ.h 01.05.06 01.05.06 + mpi_fc.h 01.05.01 01.05.01 +@@ -24,7 +24,7 @@ + mpi_inb.h 01.05.01 01.05.01 + mpi_sas.h 01.05.05 01.05.05 + mpi_type.h 01.05.02 01.05.02 +- mpi_history.txt 01.05.19 01.05.18 ++ mpi_history.txt 01.05.20 01.05.19 + + + * Date Version Description +@@ -99,6 +99,7 @@ + * 08-07-07 01.05.14 Bumped MPI_HEADER_VERSION_UNIT. + * 01-15-08 01.05.15 Bumped MPI_HEADER_VERSION_UNIT. + * 03-28-08 01.05.16 Bumped MPI_HEADER_VERSION_UNIT. ++ * 07-11-08 01.05.17 Bumped MPI_HEADER_VERSION_UNIT. + * -------------------------------------------------------------------------- + + mpi_ioc.h +@@ -523,6 +524,14 @@ + * 03-28-08 01.05.18 Defined new bits in Manufacturing Page 4 ExtFlags field + * to control coercion size and the mixing of SAS and SATA + * SSD drives. ++ * 07-11-08 01.05.19 Added defines MPI_MANPAGE4_EXTFLAGS_RAID0_SINGLE_DRIVE ++ * and MPI_MANPAGE4_EXTFLAGS_SSD_SCRUB_DISABLE for ExtFlags ++ * field of Manufacturing Page 4. ++ * Added defines for a new bit in BIOS Page 1 BiosOptions ++ * field to control adapter scan order. ++ * Added BootDeviceWaitTime field to SAS IO Unit Page 2. ++ * Added MPI_SAS_PHY0_PHYINFO_PHY_VACANT for use in PhyInfo ++ * field of SAS Expander Page 1. + * -------------------------------------------------------------------------- + + mpi_init.h +@@ -743,20 +752,20 @@ + + mpi_history.txt Parts list history + +-Filename 01.05.19 01.05.18 01.05.17 01.05.16 01.05.15 +----------- -------- -------- -------- -------- -------- +-mpi.h 01.05.16 01.05.15 01.05.14 01.05.13 01.05.12 +-mpi_ioc.h 01.05.16 01.05.15 01.05.15 01.05.14 01.05.13 +-mpi_cnfg.h 01.05.18 01.05.17 01.05.16 01.05.15 01.05.14 +-mpi_init.h 01.05.09 01.05.09 01.05.09 01.05.09 01.05.09 +-mpi_targ.h 01.05.06 01.05.06 01.05.06 01.05.06 01.05.06 +-mpi_fc.h 01.05.01 01.05.01 01.05.01 01.05.01 01.05.01 +-mpi_lan.h 01.05.01 01.05.01 01.05.01 01.05.01 01.05.01 +-mpi_raid.h 01.05.05 01.05.05 01.05.04 01.05.03 01.05.03 +-mpi_tool.h 01.05.03 01.05.03 01.05.03 01.05.03 01.05.03 +-mpi_inb.h 01.05.01 01.05.01 01.05.01 01.05.01 01.05.01 +-mpi_sas.h 01.05.05 01.05.05 01.05.04 01.05.04 01.05.04 +-mpi_type.h 01.05.02 01.05.02 01.05.02 01.05.02 01.05.02 ++Filename 01.05.20 01.05.19 01.05.18 01.05.17 01.05.16 01.05.15 ++---------- -------- -------- -------- -------- -------- -------- ++mpi.h 01.05.17 01.05.16 01.05.15 01.05.14 01.05.13 01.05.12 ++mpi_ioc.h 01.05.16 01.05.16 01.05.15 01.05.15 01.05.14 01.05.13 ++mpi_cnfg.h 01.05.19 01.05.18 01.05.17 01.05.16 01.05.15 01.05.14 ++mpi_init.h 01.05.09 01.05.09 01.05.09 01.05.09 01.05.09 01.05.09 ++mpi_targ.h 01.05.06 01.05.06 01.05.06 01.05.06 01.05.06 01.05.06 ++mpi_fc.h 01.05.01 01.05.01 01.05.01 01.05.01 01.05.01 01.05.01 ++mpi_lan.h 01.05.01 01.05.01 01.05.01 01.05.01 01.05.01 01.05.01 ++mpi_raid.h 01.05.05 01.05.05 01.05.05 01.05.04 01.05.03 01.05.03 ++mpi_tool.h 01.05.03 01.05.03 01.05.03 01.05.03 01.05.03 01.05.03 ++mpi_inb.h 01.05.01 01.05.01 01.05.01 01.05.01 01.05.01 01.05.01 ++mpi_sas.h 01.05.05 01.05.05 01.05.05 01.05.04 01.05.04 01.05.04 ++mpi_type.h 01.05.02 01.05.02 01.05.02 01.05.02 01.05.02 01.05.02 + + Filename 01.05.14 01.05.13 01.05.12 01.05.11 01.05.10 01.05.09 + ---------- -------- -------- -------- -------- -------- -------- +diff -r 60d73800068f drivers/message/fusion/lsi/mpi_log_sas.h +--- a/drivers/message/fusion/lsi/mpi_log_sas.h Tue Jun 30 11:26:39 2009 +0100 ++++ b/drivers/message/fusion/lsi/mpi_log_sas.h Wed Jul 01 09:46:25 2009 +0100 +@@ -160,12 +160,11 @@ + + + #define PL_LOGINFO_SUB_CODE_INVALID_SGL (0x00000200) +- + #define PL_LOGINFO_SUB_CODE_WRONG_REL_OFF_OR_FRAME_LENGTH (0x00000300) +-/* Bits 0-3 encode Transport Status Register (offset 0x08) */ +-/* Bit 0 is Status Bit 0: FrameXferErr */ +-/* Bit 1 & 2 are Status Bits 16 and 17: FrameXmitErrStatus */ +-/* Bit 3 is Status Bit 18 WriteDataLenghtGTDataLengthErr */ ++#define PL_LOGINFO_SUB_CODE_FRAME_XFER_ERROR (0x00000400) /* Bits 0-3 encode Transport Status Register (offset 0x08) */ ++ /* Bit 0 is Status Bit 0: FrameXferErr */ ++ /* Bit 1 & 2 are Status Bits 16 and 17: FrameXmitErrStatus */ ++ /* Bit 3 is Status Bit 18 WriteDataLenghtGTDataLengthErr */ + + #define PL_LOGINFO_SUB_CODE_TX_FM_CONNECTED_LOW (0x00000500) + #define PL_LOGINFO_SUB_CODE_SATA_NON_NCQ_RW_ERR_BIT_SET (0x00000600) +@@ -180,7 +179,7 @@ + #define PL_LOGINFO_SUB_CODE_DISCOVERY_REMOTE_SEP_RESET (0x00000E01) + #define PL_LOGINFO_SUB_CODE_SECOND_OPEN (0x00000F00) + #define PL_LOGINFO_SUB_CODE_DSCVRY_SATA_INIT_TIMEOUT (0x00001000) +-#define PL_LOGINFO_SUB_CODE_BREAK_ON_SATA_CONNECTION (0x00002000) ++#define PL_LOGINFO_SUB_CODE_BREAK_ON_SATA_CONNECTION (0x00002000) /* not currently used in mainline */ + #define PL_LOGINFO_SUB_CODE_BREAK_ON_STUCK_LINK (0x00003000) + #define PL_LOGINFO_SUB_CODE_BREAK_ON_STUCK_LINK_AIP (0x00004000) + #define PL_LOGINFO_SUB_CODE_BREAK_ON_INCOMPLETE_BREAK_RCVD (0x00005000) +@@ -309,6 +308,7 @@ + /* Device Firmware Update: Unable to allocate memory for page */ + #define IR_LOGINFO_DEV_FW_UPDATE_ERR_ALLOC_CFG_PAGE (0x00010056) + /* Device Firmware Update: */ ++//#define IR_LOGINFO_DEV_FW_UPDATE_ERR_ (0x00010054) + + + /****************************************************************************/ +diff -r 60d73800068f drivers/message/fusion/lsi/mpi_type.h +--- a/drivers/message/fusion/lsi/mpi_type.h Tue Jun 30 11:26:39 2009 +0100 ++++ b/drivers/message/fusion/lsi/mpi_type.h Wed Jul 01 09:46:25 2009 +0100 +@@ -50,8 +50,18 @@ + typedef unsigned short U16; + + +-typedef int32_t S32; +-typedef u_int32_t U32; ++#if defined(unix) || defined(__arm) || defined(ALPHA) || defined(__PPC__) || defined(__ppc) ++ ++ typedef signed int S32; ++ typedef unsigned int U32; ++ ++#else ++ ++ typedef signed long S32; ++ typedef unsigned long U32; ++ ++#endif ++ + + typedef struct _S64 + { +diff -r 60d73800068f drivers/message/fusion/mptbase.c +--- a/drivers/message/fusion/mptbase.c Tue Jun 30 11:26:39 2009 +0100 ++++ b/drivers/message/fusion/mptbase.c Wed Jul 01 09:46:25 2009 +0100 +@@ -45,7 +45,7 @@ + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ +- ++#include + #include + #include + #include +@@ -65,6 +65,7 @@ + #endif + + #include "mptbase.h" ++#include "linux_compat.h" /* linux-2.6 tweaks */ + #include "lsi/mpi_log_fc.h" + + /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ +@@ -83,18 +84,18 @@ + + static int mpt_msi_enable_spi; + module_param(mpt_msi_enable_spi, int, 0); +-MODULE_PARM_DESC(mpt_msi_enable_spi, +- " Enable MSI Support for SPI controllers (default=0)"); ++MODULE_PARM_DESC(mpt_msi_enable_spi, " Enable MSI Support for SPI \ ++ controllers (default=0)"); + + static int mpt_msi_enable_fc; + module_param(mpt_msi_enable_fc, int, 0); +-MODULE_PARM_DESC(mpt_msi_enable_fc, +- " Enable MSI Support for FC controllers (default=0)"); +- +-static int mpt_msi_enable_sas = 1; ++MODULE_PARM_DESC(mpt_msi_enable_fc, " Enable MSI Support for FC \ ++ controllers (default=0)"); ++ ++static int mpt_msi_enable_sas; + module_param(mpt_msi_enable_sas, int, 0); +-MODULE_PARM_DESC(mpt_msi_enable_sas, +- " Enable MSI Support for SAS controllers (default=1)"); ++MODULE_PARM_DESC(mpt_msi_enable_sas, " Enable MSI Support for SAS \ ++ controllers (default=0)"); + + + static int mpt_channel_mapping; +@@ -102,20 +103,20 @@ + MODULE_PARM_DESC(mpt_channel_mapping, " Mapping id's to channels (default=0)"); + + int mpt_debug_level; +-EXPORT_SYMBOL(mpt_debug_level); +- + static int mpt_set_debug_level(const char *val, struct kernel_param *kp); + module_param_call(mpt_debug_level, mpt_set_debug_level, param_get_int, + &mpt_debug_level, 0600); +-MODULE_PARM_DESC(mpt_debug_level, +- " debug level - refer to mptdebug.h - (default=0)"); ++MODULE_PARM_DESC(mpt_debug_level, " debug level - refer to mptdebug.h \ ++ - (default=0)"); ++EXPORT_SYMBOL(mpt_debug_level); + + int mpt_fwfault_debug; + EXPORT_SYMBOL(mpt_fwfault_debug); + module_param_call(mpt_fwfault_debug, param_set_int, param_get_int, +- &mpt_fwfault_debug, 0600); ++ &mpt_fwfault_debug, 0600); + MODULE_PARM_DESC(mpt_fwfault_debug, "Enable detection of Firmware fault" +- " and halt Firmware on fault - (default=0)"); ++ " and halt Firmware on fault - (default=0)"); ++ + + + #ifdef MFCNT +@@ -127,7 +128,8 @@ + /* + * Public data... + */ +-static struct proc_dir_entry *mpt_proc_root_dir; ++ ++struct proc_dir_entry *mpt_proc_root_dir; + + #define WHOINIT_UNKNOWN 0xAA + +@@ -147,9 +149,6 @@ + static MPT_RESETHANDLER MptResetHandlers[MPT_MAX_PROTOCOL_DRIVERS]; + static struct mpt_pci_driver *MptDeviceDriverHandlers[MPT_MAX_PROTOCOL_DRIVERS]; + +-static DECLARE_WAIT_QUEUE_HEAD(mpt_waitq); +- +-/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ + + /* + * Driver Callback Index's +@@ -162,7 +161,7 @@ + * Forward protos... + */ + static int mptbase_reply(MPT_ADAPTER *ioc, MPT_FRAME_HDR *req, +- MPT_FRAME_HDR *reply); ++ MPT_FRAME_HDR *reply); + static int mpt_handshake_req_reply_wait(MPT_ADAPTER *ioc, int reqBytes, + u32 *req, int replyBytes, u16 *u16reply, int maxwait, + int sleepFlag); +@@ -195,7 +194,7 @@ + static void mpt_read_ioc_pg_4(MPT_ADAPTER *ioc); + static void mpt_get_manufacturing_pg_0(MPT_ADAPTER *ioc); + static int SendEventNotification(MPT_ADAPTER *ioc, u8 EvSwitch, +- int sleepFlag); ++ int sleepFlag); + static int SendEventAck(MPT_ADAPTER *ioc, EventNotificationReply_t *evnp); + static int mpt_host_page_access_control(MPT_ADAPTER *ioc, u8 access_control_value, int sleepFlag); + static int mpt_host_page_alloc(MPT_ADAPTER *ioc, pIOCInit_t ioc_init); +@@ -210,7 +209,8 @@ + #endif + static void mpt_get_fw_exp_ver(char *buf, MPT_ADAPTER *ioc); + +-static int ProcessEventNotification(MPT_ADAPTER *ioc, EventNotificationReply_t *evReply, int *evHandlers); ++static int ProcessEventNotification(MPT_ADAPTER *ioc, ++ EventNotificationReply_t *evReply, int *evHandlers); + static void mpt_iocstatus_info(MPT_ADAPTER *ioc, u32 ioc_status, MPT_FRAME_HDR *mf); + static void mpt_fc_log_info(MPT_ADAPTER *ioc, u32 log_info); + static void mpt_spi_log_info(MPT_ADAPTER *ioc, u32 log_info); +@@ -218,7 +218,6 @@ + static int mpt_read_ioc_pg_3(MPT_ADAPTER *ioc); + static void mpt_inactive_raid_list_free(MPT_ADAPTER *ioc); + +- + /* module entry point */ + static int __init fusion_init (void); + static void __exit fusion_exit (void); +@@ -257,8 +256,8 @@ + * + * Returns + **/ +-static int +-mpt_set_debug_level(const char *val, struct kernel_param *kp) ++ ++static int mpt_set_debug_level(const char *val, struct kernel_param *kp) + { + int ret = param_set_int(val, kp); + MPT_ADAPTER *ioc; +@@ -344,10 +343,16 @@ + * + **/ + static void ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,19)) + mpt_fault_reset_work(struct work_struct *work) + { + MPT_ADAPTER *ioc = + container_of(work, MPT_ADAPTER, fault_reset_work.work); ++#else ++mpt_fault_reset_work(void *arg) ++{ ++ MPT_ADAPTER *ioc = (MPT_ADAPTER *)arg; ++#endif + u32 ioc_raw_state; + int rc; + unsigned long flags; +@@ -358,12 +363,12 @@ + ioc_raw_state = mpt_GetIocState(ioc, 0); + if ((ioc_raw_state & MPI_IOC_STATE_MASK) == MPI_IOC_STATE_FAULT) { + printk(MYIOC_s_WARN_FMT "IOC is in FAULT state (%04xh)!!!\n", +- ioc->name, ioc_raw_state & MPI_DOORBELL_DATA_MASK); ++ ioc->name, ioc_raw_state & MPI_DOORBELL_DATA_MASK); + printk(MYIOC_s_WARN_FMT "Issuing HardReset from %s!!\n", +- ioc->name, __func__); ++ ioc->name, __func__); + rc = mpt_HardResetHandler(ioc, CAN_SLEEP); + printk(MYIOC_s_WARN_FMT "%s: HardReset: %s\n", ioc->name, +- __func__, (rc == 0) ? "success" : "failed"); ++ __func__, (rc == 0) ? "success" : "failed"); + ioc_raw_state = mpt_GetIocState(ioc, 0); + if ((ioc_raw_state & MPI_IOC_STATE_MASK) == MPI_IOC_STATE_FAULT) + printk(MYIOC_s_WARN_FMT "IOC is in FAULT state after " +@@ -385,12 +390,13 @@ + ioc = ioc->alt_ioc; + + /* rearm the timer */ +- spin_lock_irqsave(&ioc->fault_reset_work_lock, flags); ++ spin_lock_irqsave(&ioc->taskmgmt_lock, flags); + if (ioc->reset_work_q) + queue_delayed_work(ioc->reset_work_q, &ioc->fault_reset_work, + msecs_to_jiffies(MPT_POLLING_INTERVAL)); +- spin_unlock_irqrestore(&ioc->fault_reset_work_lock, flags); +-} ++ spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags); ++} ++ + + /* + * Process turbo (context) reply... +@@ -444,7 +450,7 @@ + + /* Check for (valid) IO callback! */ + if (!cb_idx || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS || +- MptCallbacks[cb_idx] == NULL) { ++ MptCallbacks[cb_idx] == NULL) { + printk(MYIOC_s_WARN_FMT "%s: Invalid cb_idx (%d)!\n", + __func__, ioc->name, cb_idx); + goto out; +@@ -488,7 +494,6 @@ + + dmfprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Got non-TURBO reply=%p req_idx=%x cb_idx=%x Function=%x\n", + ioc->name, mr, req_idx, cb_idx, mr->u.hdr.Function)); +- + DBG_DUMP_REPLY_FRAME(ioc, (u32 *)mr); + + /* Check/log IOC log info +@@ -504,12 +509,15 @@ + mpt_sas_log_info(ioc, log_info); + } + ++ /* TODO - add shost_attrs, or command line option, and ++ * extend this to SAS/FC ++ */ + if (ioc_stat & MPI_IOCSTATUS_MASK) + mpt_iocstatus_info(ioc, (u32)ioc_stat, mf); + + /* Check for (valid) IO callback! */ + if (!cb_idx || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS || +- MptCallbacks[cb_idx] == NULL) { ++ MptCallbacks[cb_idx] == NULL) { + printk(MYIOC_s_WARN_FMT "%s: Invalid cb_idx (%d)!\n", + __func__, ioc->name, cb_idx); + freeme = 0; +@@ -545,7 +553,11 @@ + * the protocol-specific details of the MPT request completion. + */ + static irqreturn_t ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,18)) + mpt_interrupt(int irq, void *bus_id) ++#else ++mpt_interrupt(int irq, void *bus_id, struct pt_regs *r) ++#endif + { + MPT_ADAPTER *ioc = bus_id; + u32 pa = CHIPREG_READ32_dmasync(&ioc->chip->ReplyFifo); +@@ -720,7 +732,7 @@ + + /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ + /** +- * mpt_event_deregister - Deregister protocol-specific event callback handler. ++ * mpt_event_deregister - Deregister protocol-specific event callback handler + * @cb_idx: previously registered callback handle + * + * Each protocol-specific driver should call this routine +@@ -794,11 +806,13 @@ + + /* call per pci device probe entry point */ + list_for_each_entry(ioc, &ioc_list, list) { ++ if (!pci_get_drvdata(ioc->pcidev)) ++ continue; + id = ioc->pcidev->driver ? + ioc->pcidev->driver->id_table : NULL; + if (dd_cbfunc->probe) + dd_cbfunc->probe(ioc->pcidev, id); +- } ++ } + + return 0; + } +@@ -826,6 +840,7 @@ + + MptDeviceDriverHandlers[cb_idx] = NULL; + } ++ + + /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ + /** +@@ -868,6 +883,7 @@ + mf->u.frame.linkage.arg1 = 0; + mf->u.frame.hwhdr.msgctxu.fld.cb_idx = cb_idx; /* byte */ + req_offset = (u8 *)mf - (u8 *)ioc->req_frames; ++ /* u16! */ + req_idx = req_offset / ioc->req_sz; + mf->u.frame.hwhdr.msgctxu.fld.req_idx = cpu_to_le16(req_idx); + mf->u.frame.hwhdr.msgctxu.fld.rsvd = 0; +@@ -917,6 +933,7 @@ + /* ensure values are reset properly! */ + mf->u.frame.hwhdr.msgctxu.fld.cb_idx = cb_idx; /* byte */ + req_offset = (u8 *)mf - (u8 *)ioc->req_frames; ++ /* u16! */ + req_idx = req_offset / ioc->req_sz; + mf->u.frame.hwhdr.msgctxu.fld.req_idx = cpu_to_le16(req_idx); + mf->u.frame.hwhdr.msgctxu.fld.rsvd = 0; +@@ -968,7 +985,6 @@ + /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ + /** + * mpt_free_msg_frame - Place MPT request frame back on FreeQ. +- * @handle: Handle of registered MPT protocol driver + * @ioc: Pointer to MPT adapter structure + * @mf: Pointer to MPT request frame + * +@@ -994,6 +1010,7 @@ + spin_unlock_irqrestore(&ioc->FreeQlock, flags); + } + ++/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ + /** + * mpt_add_sge - Place a simple 32 bit SGE at address pAddr. + * @pAddr: virtual address for SGE +@@ -1002,15 +1019,14 @@ + * + * This routine places a MPT request frame back on the MPT adapter's + * FreeQ. +- **/ +-static void +-mpt_add_sge(char *pAddr, u32 flagslength, dma_addr_t dma_addr) ++ */ ++static void ++mpt_add_sge(void *pAddr, u32 flagslength, dma_addr_t dma_addr) + { + SGESimple32_t *pSge = (SGESimple32_t *) pAddr; + pSge->FlagsLength = cpu_to_le32(flagslength); + pSge->Address = cpu_to_le32(dma_addr); + } +- + + /** + * mpt_add_sge_64bit - Place a simple 64 bit SGE at address pAddr. +@@ -1022,19 +1038,16 @@ + * FreeQ. + **/ + static void +-mpt_add_sge_64bit(char *pAddr, u32 flagslength, dma_addr_t dma_addr) ++mpt_add_sge_64bit(void *pAddr, u32 flagslength, dma_addr_t dma_addr) + { + SGESimple64_t *pSge = (SGESimple64_t *) pAddr; +- u32 tmp; +- +- tmp = dma_addr & 0xFFFFFFFF; +- pSge->Address.Low = cpu_to_le32(tmp); +- tmp = (u32) ((u64)dma_addr >> 32); +- pSge->Address.High = cpu_to_le32(tmp); +- pSge->FlagsLength = cpu_to_le32( +- (flagslength | MPT_SGE_FLAGS_64_BIT_ADDRESSING)); +-} +- ++ pSge->Address.Low = cpu_to_le32 ++ (lower_32_bits(dma_addr)); ++ pSge->Address.High = cpu_to_le32 ++ (upper_32_bits(dma_addr)); ++ pSge->FlagsLength = cpu_to_le32 ++ ((flagslength | MPT_SGE_FLAGS_64_BIT_ADDRESSING)); ++} + + /** + * mpt_add_sge_64bit_1078 - Place a simple 64 bit SGE at address pAddr +@@ -1047,14 +1060,14 @@ + * FreeQ. + **/ + static void +-mpt_add_sge_64bit_1078(char *pAddr, u32 flagslength, dma_addr_t dma_addr) ++mpt_add_sge_64bit_1078(void *pAddr, u32 flagslength, dma_addr_t dma_addr) + { + SGESimple64_t *pSge = (SGESimple64_t *) pAddr; + u32 tmp; + +- tmp = dma_addr & 0xFFFFFFFF; +- pSge->Address.Low = cpu_to_le32(tmp); +- tmp = (u32) ((u64)dma_addr >> 32); ++ pSge->Address.Low = cpu_to_le32 ++ (lower_32_bits(dma_addr)); ++ tmp = (u32)(upper_32_bits(dma_addr)); + + /* + * 1078 errata workaround for the 36GB limitation +@@ -1085,7 +1098,7 @@ + * + */ + static void +-mpt_add_chain(char *pAddr, u8 next, u16 length, dma_addr_t dma_addr) ++mpt_add_chain(void *pAddr, u8 next, u16 length, dma_addr_t dma_addr) + { + SGEChain32_t *pChain = (SGEChain32_t *) pAddr; + pChain->Length = cpu_to_le16(length); +@@ -1104,7 +1117,7 @@ + * + */ + static void +-mpt_add_chain_64bit(char *pAddr, u8 next, u16 length, dma_addr_t dma_addr) ++mpt_add_chain_64bit(void *pAddr, u8 next, u16 length, dma_addr_t dma_addr) + { + SGEChain64_t *pChain = (SGEChain64_t *) pAddr; + u32 tmp = dma_addr & 0xFFFFFFFF; +@@ -1116,10 +1129,9 @@ + pChain->NextChainOffset = next; + + pChain->Address.Low = cpu_to_le32(tmp); +- tmp = (u32) ((u64)dma_addr >> 32); ++ tmp = (u32)(upper_32_bits(dma_addr)); + pChain->Address.High = cpu_to_le32(tmp); + } +- + + /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ + /** +@@ -1141,7 +1153,7 @@ + int + mpt_send_handshake_request(u8 cb_idx, MPT_ADAPTER *ioc, int reqBytes, u32 *req, int sleepFlag) + { +- int r = 0; ++ int r = 0; + u8 *req_as_bytes; + int ii; + +@@ -1232,6 +1244,7 @@ + * + * Returns 0 for success, non-zero for failure. + */ ++ + static int + mpt_host_page_access_control(MPT_ADAPTER *ioc, u8 access_control_value, int sleepFlag) + { +@@ -1288,7 +1301,7 @@ + host_page_buffer_sz, + &ioc->HostPageBuffer_dma)) != NULL) { + +- dinitprintk(ioc, printk(MYIOC_s_INFO_FMT ++ dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT + "host_page_buffer @ %p, dma @ %x, sz=%d bytes\n", + ioc->name, ioc->HostPageBuffer, + (u32)ioc->HostPageBuffer_dma, +@@ -1597,6 +1610,7 @@ + * @ioc: Pointer to pointer to IOC adapter + * + **/ ++#define convert_to_kb(x) ((x) << (PAGE_SHIFT - 10)) + static int + mpt_mapresources(MPT_ADAPTER *ioc) + { +@@ -1608,48 +1622,82 @@ + u32 psize; + int r = -ENODEV; + struct pci_dev *pdev; ++ struct sysinfo s; + + pdev = ioc->pcidev; ++ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21)) ++ if (pci_enable_device(pdev)) { ++ printk(MYIOC_s_WARN_FMT "pci_enable_device: failed\n", ++ ioc->name); ++ return r; ++ } ++#else + ioc->bars = pci_select_bars(pdev, IORESOURCE_MEM); ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25)) ++ if (pci_enable_device_bars(pdev, ioc->bars)) { ++ printk(MYIOC_s_ERR_FMT "pci_enable_device_bars() with MEM " ++ "failed\n",ioc->name); ++ return r; ++ } ++#else + if (pci_enable_device_mem(pdev)) { + printk(MYIOC_s_ERR_FMT "pci_enable_device_mem() " + "failed\n", ioc->name); + return r; + } ++#endif + if (pci_request_selected_regions(pdev, ioc->bars, "mpt")) { + printk(MYIOC_s_ERR_FMT "pci_request_selected_regions() with " + "MEM failed\n", ioc->name); + return r; + } ++#endif + if (sizeof(dma_addr_t) > 4) { + uint64_t required_mask; ++ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27)) ++ /*have to first set mask to 64 bits to find max mask required */ ++ if (pci_set_dma_mask(pdev, DMA_64BIT_MASK) != 0) { ++ printk(MYIOC_s_WARN_FMT ++ "unable to set dma mask to 64BIT for %s\n", ++ ioc->name, pci_name(pdev)); ++ if (pci_set_dma_mask(pdev, DMA_32BIT_MASK) != 0) { ++ printk(MYIOC_s_WARN_FMT ++ "unable to set dma mask to 32BIT for %s\n", ++ ioc->name, pci_name(pdev)); ++ return r; ++ } ++ } ++#endif ++ + required_mask = dma_get_required_mask(&pdev->dev); ++ + if (required_mask > DMA_32BIT_MASK +- && !pci_set_dma_mask(pdev, DMA_64BIT_MASK) +- && !pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK)) { ++ && !pci_set_dma_mask(pdev, DMA_64BIT_MASK) ++ && !pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK)) { + ioc->dma_mask = DMA_64BIT_MASK; + dinitprintk(ioc, printk(MYIOC_s_INFO_FMT +- ": 64 BIT PCI BUS DMA ADDRESSING SUPPORTED\n", +- ioc->name)); ++ ": 64 BIT PCI BUS DMA ADDRESSING SUPPORTED\n", ++ ioc->name)); + } else if (!pci_set_dma_mask(pdev, DMA_32BIT_MASK) +- && !pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK)) { ++ && !pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK)) { + ioc->dma_mask = DMA_32BIT_MASK; + dinitprintk(ioc, printk(MYIOC_s_INFO_FMT +- ": 32 BIT PCI BUS DMA ADDRESSING SUPPORTED\n", +- ioc->name)); ++ ": 32 BIT PCI BUS DMA ADDRESSING SUPPORTED\n", ++ ioc->name)); + } else { + printk(MYIOC_s_WARN_FMT "no suitable DMA mask for %s\n", + ioc->name, pci_name(pdev)); + return r; + } +- + } else { + if (!pci_set_dma_mask(pdev, DMA_32BIT_MASK) +- && !pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK)) { ++ && !pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK)) { + ioc->dma_mask = DMA_32BIT_MASK; + dinitprintk(ioc, printk(MYIOC_s_INFO_FMT +- ": 32 BIT PCI BUS DMA ADDRESSING SUPPORTED\n", +- ioc->name)); ++ ": 32 BIT PCI BUS DMA ADDRESSING SUPPORTED\n", ++ ioc->name)); + } else { + printk(MYIOC_s_WARN_FMT "no suitable DMA mask for %s\n", + ioc->name, pci_name(pdev)); +@@ -1657,6 +1705,11 @@ + } + } + ++ si_meminfo(&s); ++ printk(MYIOC_s_INFO_FMT "%s BIT PCI BUS DMA ADDRESSING SUPPORTED, " ++ "total memory = %ld kB\n", ++ ioc->name, ioc->dma_mask == DMA_64BIT_MASK ? "64" : "32", ++ convert_to_kb(s.totalram)); + mem_phys = msize = 0; + port = psize = 0; + for (ii = 0; ii < DEVICE_COUNT_RESOURCE; ii++) { +@@ -1682,7 +1735,7 @@ + mem = ioremap(mem_phys, msize); + if (mem == NULL) { + printk(MYIOC_s_ERR_FMT ": ERROR - Unable to map adapter" +- "memory!\n", ioc->name); ++ " memory!\n", ioc->name); + return -EINVAL; + } + ioc->memmap = mem; +@@ -1715,6 +1768,7 @@ + * + * Returns 0 for success, non-zero for failure. + * ++ * TODO: Add support for polled controllers + */ + int + mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id) +@@ -1748,6 +1802,7 @@ + if (mpt_debug_level) + printk(KERN_INFO "mpt_debug_level=%xh\n", mpt_debug_level); + ++ dinitprintk(ioc, printk(MYIOC_s_INFO_FMT ": mpt_adapter_install\n", ioc->name)); + + ioc->pcidev = pdev; + if (mpt_mapresources(ioc)) { +@@ -1775,6 +1830,9 @@ + ioc->alloc_total = sizeof(MPT_ADAPTER); + ioc->req_sz = MPT_DEFAULT_FRAME_SIZE; /* avoid div by zero! */ + ioc->reply_sz = MPT_REPLY_FRAME_SIZE; ++ ++ ioc->pcidev = pdev; ++ + + spin_lock_init(&ioc->taskmgmt_lock); + mutex_init(&ioc->internal_cmds.mutex); +@@ -1810,25 +1868,30 @@ + INIT_LIST_HEAD(&ioc->list); + + /* Initialize work */ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,19)) + INIT_DELAYED_WORK(&ioc->fault_reset_work, mpt_fault_reset_work); +- spin_lock_init(&ioc->fault_reset_work_lock); ++#else ++ INIT_WORK(&ioc->fault_reset_work, mpt_fault_reset_work, (void *)ioc); ++#endif + + /* Initialize workqueue */ +- snprintf(ioc->reset_work_q_name, sizeof(ioc->reset_work_q_name), ++ ++ snprintf(ioc->reset_work_q_name, MPT_KOBJ_NAME_LEN, + "mpt_poll_%d", ioc->id); + ioc->reset_work_q = + create_singlethread_workqueue(ioc->reset_work_q_name); + if (!ioc->reset_work_q) { + printk(MYIOC_s_ERR_FMT "Insufficient memory to add adapter!\n", + ioc->name); ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21)) + pci_release_selected_regions(pdev, ioc->bars); ++#endif + kfree(ioc); + return -ENOMEM; + } + +- dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "facts @ %p," +- " pfacts[0] @ %p\n", +- ioc->name, &ioc->facts, &ioc->pfacts[0])); ++ dinitprintk(ioc, printk(MYIOC_s_INFO_FMT "facts @ %p, pfacts[0] @ %p\n", ++ ioc->name, &ioc->facts, &ioc->pfacts[0])); + + pci_read_config_byte(pdev, PCI_CLASS_REVISION, &revision); + mpt_get_product_name(pdev->vendor, pdev->device, revision, ioc->prod_name); +@@ -1848,14 +1911,14 @@ + case MPI_MANUFACTPAGE_DEVICEID_FC929X: + if (revision < XL_929) { + /* 929X Chip Fix. Set Split transactions level +- * for PCIX. Set MOST bits to zero. +- */ ++ * for PCIX. Set MOST bits to zero. ++ */ + pci_read_config_byte(pdev, 0x6a, &pcixcmd); + pcixcmd &= 0x8F; + pci_write_config_byte(pdev, 0x6a, pcixcmd); + } else { + /* 929XL Chip Fix. Set MMRBC to 0x08. +- */ ++ */ + pci_read_config_byte(pdev, 0x6a, &pcixcmd); + pcixcmd |= 0x08; + pci_write_config_byte(pdev, 0x6a, pcixcmd); +@@ -1873,7 +1936,6 @@ + ioc->bus_type = FC; + break; + +- + case MPI_MANUFACTPAGE_DEVID_53C1030: + /* 1030 Chip Fix. Disable Split transactions + * for PCIX. Set MOST bits to zero if Rev < C0( = 8). +@@ -1901,7 +1963,9 @@ + break; + } + ++ + switch (ioc->bus_type) { ++ + case SAS: + ioc->msi_enable = mpt_msi_enable_sas; + break; +@@ -1918,7 +1982,6 @@ + ioc->msi_enable = 0; + break; + } +- + if (ioc->errata_flag_1064) + pci_disable_io_access(pdev); + +@@ -1939,29 +2002,27 @@ + */ + mpt_detect_bound_ports(ioc, pdev); + +- + INIT_LIST_HEAD(&ioc->fw_event_list); + spin_lock_init(&ioc->fw_event_lock); +- snprintf(ioc->fw_event_q_name, sizeof(ioc->fw_event_q_name), +- "mpt/%d", ioc->id); ++ snprintf(ioc->fw_event_q_name, MPT_KOBJ_NAME_LEN, "mpt/%d", ioc->id); + ioc->fw_event_q = create_singlethread_workqueue(ioc->fw_event_q_name); + + if ((r = mpt_do_ioc_recovery(ioc, MPT_HOSTEVENT_IOC_BRINGUP, + CAN_SLEEP)) != 0){ + printk(MYIOC_s_ERR_FMT "didn't initialize properly! (%d)\n", +- ioc->name, r); ++ ioc->name, r); + + list_del(&ioc->list); + if (ioc->alt_ioc) + ioc->alt_ioc->alt_ioc = NULL; + iounmap(ioc->memmap); ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21)) + if (r != -5) + pci_release_selected_regions(pdev, ioc->bars); +- ++#endif + destroy_workqueue(ioc->reset_work_q); + ioc->reset_work_q = NULL; +- destroy_workqueue(ioc->fw_event_q); +- ioc->fw_event_q = NULL; ++ + kfree(ioc); + pci_set_drvdata(pdev, NULL); + return r; +@@ -1997,6 +2058,7 @@ + if (!ioc->alt_ioc) + queue_delayed_work(ioc->reset_work_q, &ioc->fault_reset_work, + msecs_to_jiffies(MPT_POLLING_INTERVAL)); ++ + return 0; + } + +@@ -2005,22 +2067,23 @@ + * mpt_detach - Remove a PCI intelligent MPT adapter. + * @pdev: Pointer to pci_dev structure + */ ++ + void + mpt_detach(struct pci_dev *pdev) + { + MPT_ADAPTER *ioc = pci_get_drvdata(pdev); + char pname[32]; + u8 cb_idx; +- unsigned long flags; ++ unsigned long flags; + struct workqueue_struct *wq; + + /* + * Stop polling ioc for fault condition + */ +- spin_lock_irqsave(&ioc->fault_reset_work_lock, flags); ++ spin_lock_irqsave(&ioc->taskmgmt_lock, flags); + wq = ioc->reset_work_q; + ioc->reset_work_q = NULL; +- spin_unlock_irqrestore(&ioc->fault_reset_work_lock, flags); ++ spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags); + cancel_delayed_work(&ioc->fault_reset_work); + destroy_workqueue(wq); + +@@ -2045,7 +2108,20 @@ + } + } + ++ /* Disable interrupts! */ ++ CHIPREG_WRITE32(&ioc->chip->IntMask, 0xFFFFFFFF); ++ ++ ioc->active = 0; ++ synchronize_irq(pdev->irq); ++ ++ /* Clear any lingering interrupt */ ++ CHIPREG_WRITE32(&ioc->chip->IntStatus, 0); ++ ++ CHIPREG_READ32(&ioc->chip->IntStatus); ++ + mpt_adapter_dispose(ioc); ++ ++ pci_set_drvdata(pdev, NULL); + } + + /************************************************************************** +@@ -2078,6 +2154,7 @@ + /* disable interrupts */ + CHIPREG_WRITE32(&ioc->chip->IntMask, 0xFFFFFFFF); + ioc->active = 0; ++ + /* Clear any lingering interrupt */ + CHIPREG_WRITE32(&ioc->chip->IntStatus, 0); + +@@ -2087,7 +2164,9 @@ + ioc->pci_irq = -1; + pci_save_state(pdev); + pci_disable_device(pdev); ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21)) + pci_release_selected_regions(pdev, ioc->bars); ++#endif + pci_set_power_state(pdev, device_state); + return 0; + } +@@ -2132,7 +2211,6 @@ + } + ioc->SGE_size = sizeof(u32) + ioc->sg_addr_size; + +- + printk(MYIOC_s_INFO_FMT "pci-resume: ioc-state=0x%x,doorbell=0x%x\n", + ioc->name, (mpt_GetIocState(ioc, 1) >> MPI_IOC_STATE_SHIFT), + CHIPREG_READ32(&ioc->chip->Doorbell)); +@@ -2157,7 +2235,7 @@ + /* bring ioc to operational state */ + printk(MYIOC_s_INFO_FMT "Sending mpt_do_ioc_recovery\n", ioc->name); + recovery_state = mpt_do_ioc_recovery(ioc, MPT_HOSTEVENT_IOC_BRINGUP, +- CAN_SLEEP); ++ CAN_SLEEP); + if (recovery_state != 0) + printk(MYIOC_s_WARN_FMT "pci-resume: Cannot recover, " + "error:[%x]\n", ioc->name, recovery_state); +@@ -2166,6 +2244,7 @@ + "pci-resume: success\n", ioc->name); + out: + return 0; ++ + } + #endif + +@@ -2219,7 +2298,7 @@ + int irq_allocated = 0; + u8 *a; + +- printk(MYIOC_s_DEBUG_FMT "Initiating %s\n", ioc->name, ++ printk(MYIOC_s_INFO_FMT "Initiating %s\n", ioc->name, + reason == MPT_HOSTEVENT_IOC_BRINGUP ? "bringup" : "recovery"); + + /* Disable reply interrupts (also blocks FreeQ) */ +@@ -2227,12 +2306,16 @@ + ioc->active = 0; + + if (ioc->alt_ioc) { +- if (ioc->alt_ioc->active || reason == MPT_HOSTEVENT_IOC_RECOVER) ++ if (ioc->alt_ioc->active || ++ reason == MPT_HOSTEVENT_IOC_RECOVER) { + reset_alt_ioc_active = 1; +- +- /* Disable alt-IOC's reply interrupts (and FreeQ) for a bit ... */ +- CHIPREG_WRITE32(&ioc->alt_ioc->chip->IntMask, 0xFFFFFFFF); +- ioc->alt_ioc->active = 0; ++ /* Disable alt-IOC's reply interrupts ++ * (and FreeQ) for a bit ++ **/ ++ CHIPREG_WRITE32(&ioc->alt_ioc->chip->IntMask, ++ 0xFFFFFFFF); ++ ioc->alt_ioc->active = 0; ++ } + } + + hard = 1; +@@ -2246,16 +2329,15 @@ + + if (reset_alt_ioc_active && ioc->alt_ioc) { + /* (re)Enable alt-IOC! (reply interrupt, FreeQ) */ +- dprintk(ioc, printk(MYIOC_s_DEBUG_FMT +- ": alt-ioc reply irq re-enabled\n", +- ioc->alt_ioc->name)); ++ dprintk(ioc, printk(MYIOC_s_INFO_FMT ++ "alt_ioc reply irq re-enabled\n", ioc->alt_ioc->name)); + CHIPREG_WRITE32(&ioc->alt_ioc->chip->IntMask, MPI_HIM_DIM); + ioc->alt_ioc->active = 1; + } + + } else { +- printk(MYIOC_s_WARN_FMT "NOT READY WARNING!\n", +- ioc->name); ++ printk(MYIOC_s_WARN_FMT ++ "NOT READY WARNING!\n", ioc->name); + } + ret = -1; + goto out; +@@ -2264,6 +2346,15 @@ + /* hard_reset_done = 0 if a soft reset was performed + * and 1 if a hard reset was performed. + */ ++ if (!hard_reset_done && reset_alt_ioc_active && ioc->alt_ioc) { ++ /* (re)Enable alt-IOC! (reply interrupt, FreeQ) */ ++ dprintk(ioc, printk(MYIOC_s_DEBUG_FMT ": alt-ioc reply irq re-enabled\n", ++ ioc->alt_ioc->name)); ++ CHIPREG_WRITE32(&ioc->alt_ioc->chip->IntMask, MPI_HIM_DIM); ++ ioc->alt_ioc->active = 1; ++ reset_alt_ioc_active = 0; ++ } ++ + if (hard_reset_done && reset_alt_ioc_active && ioc->alt_ioc) { + if ((rc = MakeIocReady(ioc->alt_ioc, 0, sleepFlag)) == 0) + alt_ioc_ready = 1; +@@ -2291,7 +2382,8 @@ + if (alt_ioc_ready) { + if ((rc = GetIocFacts(ioc->alt_ioc, sleepFlag, reason)) != 0) { + dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT +- "Initial Alt IocFacts failed rc=%x\n", ioc->name, rc)); ++ "Initial Alt IocFacts failed rc=%x\n", ++ ioc->name, rc)); + /* Retry - alt IOC was initialized once + */ + rc = GetIocFacts(ioc->alt_ioc, sleepFlag, reason); +@@ -2306,17 +2398,24 @@ + } + } + ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21)) + if ((ret == 0) && (reason == MPT_HOSTEVENT_IOC_BRINGUP) && + (ioc->facts.Flags & MPI_IOCFACTS_FLAGS_FW_DOWNLOAD_BOOT)) { + pci_release_selected_regions(ioc->pcidev, ioc->bars); + ioc->bars = pci_select_bars(ioc->pcidev, IORESOURCE_MEM | + IORESOURCE_IO); ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25)) ++ if (pci_enable_device_bars(ioc->pcidev, ioc->bars)) ++ return -5; ++#else + if (pci_enable_device(ioc->pcidev)) + return -5; ++#endif + if (pci_request_selected_regions(ioc->pcidev, ioc->bars, + "mpt")) + return -5; + } ++#endif + + /* + * Device is reset now. It must have de-asserted the interrupt line +@@ -2328,16 +2427,21 @@ + if (ioc->pcidev->irq) { + if (ioc->msi_enable && !pci_enable_msi(ioc->pcidev)) + printk(MYIOC_s_INFO_FMT "PCI-MSI enabled\n", +- ioc->name); ++ ioc->name); + else + ioc->msi_enable = 0; + ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,18)) + rc = request_irq(ioc->pcidev->irq, mpt_interrupt, + IRQF_SHARED, ioc->name, ioc); ++#else ++ rc = request_irq(ioc->pcidev->irq, mpt_interrupt, ++ SA_SHIRQ, ioc->name, ioc); ++#endif + if (rc < 0) { + printk(MYIOC_s_ERR_FMT "Unable to allocate " +- "interrupt %d!\n", ioc->name, +- ioc->pcidev->irq); ++ "interrupt %d!\n", ++ ioc->name, ioc->pcidev->irq); + if (ioc->msi_enable) + pci_disable_msi(ioc->pcidev); + ret = -EBUSY; +@@ -2392,7 +2496,7 @@ + if (reason == MPT_HOSTEVENT_IOC_BRINGUP){ + if (ioc->upload_fw) { + ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT +- "firmware upload required!\n", ioc->name)); ++ "firmware upload required!\n", ioc->name)); + + /* Controller is not operational, cannot do upload + */ +@@ -2426,7 +2530,8 @@ + */ + if ((ret == 0) && (!ioc->facts.EventState)) { + dinitprintk(ioc, printk(MYIOC_s_INFO_FMT +- "SendEventNotification\n", ioc->name)); ++ "SendEventNotification\n", ++ ioc->name)); + ret = SendEventNotification(ioc, 1, sleepFlag); /* 1=Enable */ + } + +@@ -2441,11 +2546,11 @@ + if (rc == 0) { /* alt ioc */ + if (reset_alt_ioc_active && ioc->alt_ioc) { + /* (re)Enable alt-IOC! (reply interrupt) */ +- dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT +- "alt-ioc reply irq re-enabled\n", ++ dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "alt-ioc" ++ "reply irq re-enabled\n", + ioc->alt_ioc->name)); + CHIPREG_WRITE32(&ioc->alt_ioc->chip->IntMask, +- MPI_HIM_DIM); ++ MPI_HIM_DIM); + ioc->alt_ioc->active = 1; + } + } +@@ -2462,7 +2567,7 @@ + /* + * Initalize link list for inactive raid volumes. + */ +- mutex_init(&ioc->raid_data.inactive_list_mutex); ++ init_MUTEX(&ioc->raid_data.inactive_list_mutex); + INIT_LIST_HEAD(&ioc->raid_data.inactive_list); + + switch (ioc->bus_type) { +@@ -2496,8 +2601,7 @@ + * (LANPage1_t stuff) + */ + (void) GetLanConfigPages(ioc); +- a = (u8 *) +- &ioc->lan_cnfg_page1.HardwareAddressLow; ++ a = (u8*)&ioc->lan_cnfg_page1.HardwareAddressLow; + dprintk(ioc, printk(MYIOC_s_DEBUG_FMT + "LanAddr = %02X:%02X:%02X" + ":%02X:%02X:%02X\n", +@@ -2534,7 +2638,6 @@ + } + + out: +- + if ((ret != 0) && irq_allocated) { + free_irq(ioc->pci_irq, ioc); + if (ioc->msi_enable) +@@ -2566,8 +2669,8 @@ + + dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "PCI device %s devfn=%x/%x," + " searching for devfn match on %x or %x\n", +- ioc->name, pci_name(pdev), pdev->bus->number, +- pdev->devfn, func-1, func+1)); ++ ioc->name, pci_name(pdev), pdev->bus->number, ++ pdev->devfn, func-1, func+1)); + + peer = pci_get_slot(pdev->bus, PCI_DEVFN(slot,func-1)); + if (!peer) { +@@ -2614,8 +2717,8 @@ + int ret; + + if (ioc->cached_fw != NULL) { +- ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "mpt_adapter_disable: " +- "Pushing FW onto adapter\n", ioc->name)); ++ ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT ++ "%s: Pushing FW onto adapter\n", __func__, ioc->name)); + if ((ret = mpt_downloadboot(ioc, (MpiFwHeader_t *) + ioc->cached_fw, CAN_SLEEP)) < 0) { + printk(MYIOC_s_WARN_FMT +@@ -2628,15 +2731,15 @@ + * Put the controller into ready state (if its not already) + */ + if (mpt_GetIocState(ioc, 1) != MPI_IOC_STATE_READY) { +- if (!SendIocReset(ioc, MPI_FUNCTION_IOC_MESSAGE_UNIT_RESET, ++ if(!SendIocReset(ioc, MPI_FUNCTION_IOC_MESSAGE_UNIT_RESET, + CAN_SLEEP)) { + if (mpt_GetIocState(ioc, 1) != MPI_IOC_STATE_READY) + printk(MYIOC_s_ERR_FMT "%s: IOC msg unit " + "reset failed to put ioc in ready state!\n", +- ioc->name, __func__); ++ ioc->name, __FUNCTION__); + } else + printk(MYIOC_s_ERR_FMT "%s: IOC msg unit reset " +- "failed!\n", ioc->name, __func__); ++ "failed!\n", ioc->name, __FUNCTION__); + } + + /* Disable adapter interrupts! */ +@@ -2650,9 +2753,8 @@ + + if (ioc->alloc != NULL) { + sz = ioc->alloc_sz; +- dexitprintk(ioc, printk(MYIOC_s_DEBUG_FMT +- "free @ %p, sz=%d bytes\n", ioc->name, +- ioc->alloc, ioc->alloc_sz)); ++ dexitprintk(ioc, printk(MYIOC_s_INFO_FMT "free @ %p, sz=%d bytes\n", ++ ioc->name, ioc->alloc, ioc->alloc_sz)); + pci_free_consistent(ioc->pcidev, sz, + ioc->alloc, ioc->alloc_dma); + ioc->reply_frames = NULL; +@@ -2713,11 +2815,11 @@ + ioc->name, __func__, ret); + } + dexitprintk(ioc, printk(MYIOC_s_DEBUG_FMT +- "HostPageBuffer free @ %p, sz=%d bytes\n", ioc->name, +- ioc->HostPageBuffer, ioc->HostPageBuffer_sz)); ++ "HostPageBuffer free @ %p, sz=%d bytes\n", ++ ioc->name, ioc->HostPageBuffer, ++ ioc->HostPageBuffer_sz)); + pci_free_consistent(ioc->pcidev, ioc->HostPageBuffer_sz, +- ioc->HostPageBuffer, +- ioc->HostPageBuffer_dma); ++ ioc->HostPageBuffer, ioc->HostPageBuffer_dma); + ioc->HostPageBuffer = NULL; + ioc->HostPageBuffer_sz = 0; + ioc->alloc_total -= ioc->HostPageBuffer_sz; +@@ -2725,7 +2827,6 @@ + + pci_set_drvdata(ioc->pcidev, NULL); + } +- + /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ + /** + * mpt_adapter_dispose - Free all resources associated with an MPT adapter +@@ -2759,13 +2860,14 @@ + } + + pci_disable_device(ioc->pcidev); ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21)) + pci_release_selected_regions(ioc->pcidev, ioc->bars); ++#endif + + #if defined(CONFIG_MTRR) && 0 + if (ioc->mtrr_reg > 0) { + mtrr_del(ioc->mtrr_reg, 0, 0); +- dprintk(ioc, printk(MYIOC_s_DEBUG_FMT +- "MTRR region de-registered\n", ioc->name)); ++ dprintk(ioc, printk(MYIOC_s_INFO_FMT "MTRR region de-registered\n", ioc->name)); + } + #endif + +@@ -2773,9 +2875,8 @@ + list_del(&ioc->list); + + sz_last = ioc->alloc_total; +- dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "free'd %d of %d bytes\n", +- ioc->name, sz_first-sz_last+(int)sizeof(*ioc), +- sz_first)); ++ dprintk(ioc, printk(MYIOC_s_INFO_FMT "free'd %d of %d bytes\n", ++ ioc->name, sz_first-sz_last+(int)sizeof(*ioc), sz_first)); + + if (ioc->alt_ioc) + ioc->alt_ioc->alt_ioc = NULL; +@@ -2854,8 +2955,7 @@ + + /* Get current [raw] IOC state */ + ioc_state = mpt_GetIocState(ioc, 0); +- dhsprintk(ioc, printk(MYIOC_s_DEBUG_FMT +- "MakeIocReady, [raw] state=%08x\n", ioc->name, ioc_state)); ++ dhsprintk(ioc, printk(MYIOC_s_INFO_FMT "MakeIocReady [raw] state=%08x\n", ioc->name, ioc_state)); + + /* + * Check to see if IOC got left/stuck in doorbell handshake +@@ -2869,10 +2969,9 @@ + + /* Is it already READY? */ + if (!statefault && +- (ioc_state & MPI_IOC_STATE_MASK) == MPI_IOC_STATE_READY) { ++ ((ioc_state & MPI_IOC_STATE_MASK) == MPI_IOC_STATE_READY)) { + dinitprintk(ioc, printk(MYIOC_s_INFO_FMT +- "IOC is in READY state\n", +- ioc->name)); ++ "IOC is in READY state\n", ioc->name)); + return 0; + } + +@@ -2881,10 +2980,11 @@ + */ + if ((ioc_state & MPI_IOC_STATE_MASK) == MPI_IOC_STATE_FAULT) { + statefault = 2; ++ ioc->is_fault = 1; + printk(MYIOC_s_WARN_FMT "IOC is in FAULT state!!!\n", +- ioc->name); +- printk(KERN_WARNING " FAULT code = %04xh\n", +- ioc_state & MPI_DOORBELL_DATA_MASK); ++ ioc->name); ++ printk(MYIOC_s_WARN_FMT " FAULT code = %04xh\n", ++ ioc->name, ioc_state & MPI_DOORBELL_DATA_MASK); + } + + /* +@@ -2900,7 +3000,7 @@ + * Else, fall through to KickStart case + */ + whoinit = (ioc_state & MPI_DOORBELL_WHO_INIT_MASK) >> MPI_DOORBELL_WHO_INIT_SHIFT; +- dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT ++ dinitprintk(ioc, printk(MYIOC_s_INFO_FMT + "whoinit 0x%x statefault %d force %d\n", + ioc->name, whoinit, statefault, force)); + if (whoinit == MPI_WHOINIT_PCI_PEER) +@@ -2948,23 +3048,22 @@ + ii++; cntdn--; + if (!cntdn) { + printk(MYIOC_s_ERR_FMT +- "Wait IOC_READY state (0x%x) timeout(%d)!\n", +- ioc->name, ioc_state, (int)((ii+5)/HZ)); ++ "Wait IOC_READY state (0x%x) timeout(%d)!\n", ++ ioc->name, ioc_state, (int)((ii+5)/HZ)); + return -ETIME; + } + + if (sleepFlag == CAN_SLEEP) { + msleep(1); + } else { +- mdelay(1); /* 1 msec delay */ ++ mdelay (1); /* 1 msec delay */ + } + + } + + if (statefault < 3) { +- printk(MYIOC_s_INFO_FMT "Recovered from %s\n", +- ioc->name, +- statefault==1 ? "stuck handshake" : "IOC FAULT"); ++ printk(MYIOC_s_INFO_FMT "Recovered from %s\n", ioc->name, ++ statefault == 1 ? "stuck handshake" : "IOC FAULT"); + } + + return hard_reset_done; +@@ -3036,7 +3135,7 @@ + get_facts.Function = MPI_FUNCTION_IOC_FACTS; + /* Assert: All other get_facts fields are zero! */ + +- dinitprintk(ioc, printk(MYIOC_s_INFO_FMT ++ dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT + "Sending get IocFacts request req_sz=%d reply_sz=%d\n", + ioc->name, req_sz, reply_sz)); + +@@ -3067,8 +3166,7 @@ + + facts->MsgVersion = le16_to_cpu(facts->MsgVersion); + if (facts->MsgVersion == MPI_VERSION_01_05) +- facts->HeaderVersion = +- le16_to_cpu(facts->HeaderVersion); ++ facts->HeaderVersion = le16_to_cpu(facts->HeaderVersion); + facts->MsgContext = le32_to_cpu(facts->MsgContext); + facts->IOCExceptions = le16_to_cpu(facts->IOCExceptions); + facts->IOCStatus = le16_to_cpu(facts->IOCStatus); +@@ -3198,8 +3296,8 @@ + + /* IOC *must* NOT be in RESET state! */ + if (ioc->last_state == MPI_IOC_STATE_RESET) { +- printk(MYIOC_s_ERR_FMT "Can't get PortFacts, " +- " NOT READY! (%08x)\n", ioc->name, ioc->last_state); ++ printk(MYIOC_s_ERR_FMT "Can't get PortFacts NOT READY! (%08x)\n", ++ ioc->name, ioc->last_state ); + return -4; + } + +@@ -3217,14 +3315,14 @@ + get_pfacts.PortNumber = portnum; + /* Assert: All other get_pfacts fields are zero! */ + +- dinitprintk(ioc, printk(MYIOC_s_INFO_FMT +- "Sending get PortFacts(%d) request\n", ioc->name, portnum)); ++ dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Sending get PortFacts(%d) request\n", ++ ioc->name, portnum)); + + /* No non-zero fields in the get_pfacts request are greater than + * 1 byte in size, so we can just fire it off as is. + */ + ii = mpt_handshake_req_reply_wait(ioc, req_sz, (u32*)&get_pfacts, +- reply_sz, (u16 *)pfacts, 5 /*seconds*/, sleepFlag); ++ reply_sz, (u16*)pfacts, 5 /*seconds*/, sleepFlag); + if (ii != 0) + return ii; + +@@ -3299,7 +3397,7 @@ + ioc_init.MaxDevices = (U8)ioc->devices_per_bus; + ioc_init.MaxBuses = (U8)ioc->number_of_buses; + +- dinitprintk(ioc, printk(MYIOC_s_INFO_FMT "facts.MsgVersion=%x\n", ++ dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "facts.MsgVersion=%x\n", + ioc->name, ioc->facts.MsgVersion)); + if (ioc->facts.MsgVersion >= MPI_VERSION_01_05) { + // set MsgVersion and HeaderVersion host driver was built with +@@ -3415,19 +3513,18 @@ + /* port_enable.MsgFlags = 0; */ + /* port_enable.MsgContext = 0; */ + +- dinitprintk(ioc, printk(MYIOC_s_INFO_FMT +- "Sending Port(%d)Enable (req @ %p)\n", ioc->name, +- portnum, &port_enable)); ++ dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Sending Port(%d)Enable (req @ %p)\n", ++ ioc->name, portnum, &port_enable)); + + /* RAID FW may take a long time to enable + */ + if (ioc->ir_firmware || ioc->bus_type == SAS) { + rc = mpt_handshake_req_reply_wait(ioc, req_sz, +- (u32 *)&port_enable, reply_sz, (u16 *)&reply_buf, ++ (u32*)&port_enable, reply_sz, (u16*)&reply_buf, + 300 /*seconds*/, sleepFlag); + } else { + rc = mpt_handshake_req_reply_wait(ioc, req_sz, +- (u32 *)&port_enable, reply_sz, (u16 *)&reply_buf, ++ (u32*)&port_enable, reply_sz, (u16*)&reply_buf, + 30 /*seconds*/, sleepFlag); + } + return rc; +@@ -3518,17 +3615,21 @@ + FWUploadReply_t *preply; + FWUploadTCSGE_t *ptcsge; + u32 flagsLength; +- int ii, reply_sz; ++ int ii, sz, reply_sz; + int cmdStatus; + int request_size; + + /* If the image size is 0, we are done. + */ +- if (!ioc->facts.FWImageSize) +- return 0; +- +- if (mpt_alloc_fw_memory(ioc, ioc->facts.FWImageSize) != 0) ++ sz = ioc->facts.FWImageSize; ++ if (!sz) ++ return 0; ++ ++ if (mpt_alloc_fw_memory(ioc, sz) != 0) + return -ENOMEM; ++ ++ dinitprintk(ioc, printk(MYIOC_s_INFO_FMT ": FW Image @ %p[%p], sz=%d[%x] bytes\n", ++ ioc->name, ioc->cached_fw, (void *)(ulong)ioc->cached_fw_dma, sz, sz)); + + prequest = (sleepFlag == NO_SLEEP) ? kzalloc(ioc->req_sz, GFP_ATOMIC) : + kzalloc(ioc->req_sz, GFP_KERNEL); +@@ -3546,19 +3647,20 @@ + + prequest->ImageType = MPI_FW_UPLOAD_ITYPE_FW_IOC_MEM; + prequest->Function = MPI_FUNCTION_FW_UPLOAD; ++ + ptcsge = (FWUploadTCSGE_t *) &prequest->SGL; + ptcsge->DetailsLength = 12; + ptcsge->Flags = MPI_SGE_FLAGS_TRANSACTION_ELEMENT; +- ptcsge->ImageSize = cpu_to_le32(ioc->facts.FWImageSize); ++ ptcsge->ImageSize = cpu_to_le32(sz); + ptcsge++; + +- flagsLength = MPT_SGE_FLAGS_SSIMPLE_READ | ioc->facts.FWImageSize; ++ flagsLength = MPT_SGE_FLAGS_SSIMPLE_READ | sz; + ioc->add_sge((char *)ptcsge, flagsLength, ioc->cached_fw_dma); + request_size = offsetof(FWUpload_t, SGL) + sizeof(FWUploadTCSGE_t) + + ioc->SGE_size; + dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Sending FW Upload " + " (req @ %p) fw_size=%d mf_request_size=%d\n", ioc->name, prequest, +- ioc->facts.FWImageSize, request_size)); ++ sz, request_size)); + DBG_DUMP_FW_REQUEST_FRAME(ioc, (u32 *)prequest); + + ii = mpt_handshake_req_reply_wait(ioc, request_size, (u32 *)prequest, +@@ -3574,14 +3676,14 @@ + */ + int status; + status = le16_to_cpu(preply->IOCStatus) & +- MPI_IOCSTATUS_MASK; +- if (status == MPI_IOCSTATUS_SUCCESS && +- ioc->facts.FWImageSize == +- le32_to_cpu(preply->ActualImageSize)) +- cmdStatus = 0; +- } +- dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "do_upload cmdStatus=%d \n", +- ioc->name, cmdStatus)); ++ MPI_IOCSTATUS_MASK; ++ if ((status == MPI_IOCSTATUS_SUCCESS) && ++ (ioc->facts.FWImageSize == ++ le32_to_cpu(preply->ActualImageSize))) ++ cmdStatus = 0; ++ } ++ dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT ": do_upload cmdStatus=%d \n", ++ ioc->name, cmdStatus)); + + + if (cmdStatus) { +@@ -3622,7 +3724,7 @@ + u32 doorbell; + + ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "downloadboot: fw size 0x%x (%d), FW Ptr %p\n", +- ioc->name, pFwHeader->ImageSize, pFwHeader->ImageSize, pFwHeader)); ++ ioc->name, pFwHeader->ImageSize, pFwHeader->ImageSize, pFwHeader)); + + CHIPREG_WRITE32(&ioc->chip->WriteSequence, 0xFF); + CHIPREG_WRITE32(&ioc->chip->WriteSequence, MPI_WRSEQ_1ST_KEY_VALUE); +@@ -3634,10 +3736,11 @@ + CHIPREG_WRITE32(&ioc->chip->Diagnostic, (MPI_DIAG_PREVENT_IOC_BOOT | MPI_DIAG_DISABLE_ARM)); + + /* wait 1 msec */ +- if (sleepFlag == CAN_SLEEP) ++ if (sleepFlag == CAN_SLEEP) { + msleep(1); +- else +- mdelay(1); ++ } else { ++ mdelay (1); ++ } + + diag0val = CHIPREG_READ32(&ioc->chip->Diagnostic); + CHIPREG_WRITE32(&ioc->chip->Diagnostic, diag0val | MPI_DIAG_RESET_ADAPTER); +@@ -3650,10 +3753,11 @@ + break; + } + /* wait .1 sec */ +- if (sleepFlag == CAN_SLEEP) ++ if (sleepFlag == CAN_SLEEP) { + msleep (100); +- else ++ } else { + mdelay (100); ++ } + } + + if ( count == 30 ) { +@@ -3685,12 +3789,13 @@ + + CHIPREG_PIO_WRITE32(&ioc->pio_chip->DiagRwAddress, pFwHeader->LoadStartAddress); + ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "LoadStart addr written 0x%x \n", +- ioc->name, pFwHeader->LoadStartAddress)); ++ ioc->name, pFwHeader->LoadStartAddress)); + + ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Write FW Image: 0x%x bytes @ %p\n", +- ioc->name, fwSize*4, ptrFw)); +- while (fwSize--) ++ ioc->name, fwSize*4, ptrFw)); ++ while (fwSize--) { + CHIPREG_PIO_WRITE32(&ioc->pio_chip->DiagRwData, *ptrFw++); ++ } + + nextImage = pFwHeader->NextImageHeaderOffset; + while (nextImage) { +@@ -3702,24 +3807,23 @@ + ptrFw = (u32 *)pExtImage; + + ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Write Ext Image: 0x%x (%d) bytes @ %p load_addr=%x\n", +- ioc->name, fwSize*4, fwSize*4, ptrFw, load_addr)); ++ ioc->name, fwSize*4, fwSize*4, ptrFw, load_addr)); + CHIPREG_PIO_WRITE32(&ioc->pio_chip->DiagRwAddress, load_addr); + +- while (fwSize--) ++ while (fwSize--) { + CHIPREG_PIO_WRITE32(&ioc->pio_chip->DiagRwData, *ptrFw++); ++ } + nextImage = pExtImage->NextImageHeaderOffset; + } + + /* Write the IopResetVectorRegAddr */ +- ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT +- "Write IopResetVector Addr=%x!\n", ioc->name, +- pFwHeader->IopResetRegAddr)); ++ ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Write IopResetVector Addr=%x! \n", ++ ioc->name, pFwHeader->IopResetRegAddr)); + CHIPREG_PIO_WRITE32(&ioc->pio_chip->DiagRwAddress, pFwHeader->IopResetRegAddr); + + /* Write the IopResetVectorValue */ +- ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT +- "Write IopResetVector Value=%x!\n", ioc->name, +- pFwHeader->IopResetVectorValue)); ++ ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Write IopResetVector Value=%x! \n", ++ ioc->name, pFwHeader->IopResetVectorValue)); + CHIPREG_PIO_WRITE32(&ioc->pio_chip->DiagRwData, pFwHeader->IopResetVectorValue); + + /* Clear the internal flash bad bit - autoincrementing register, +@@ -3742,14 +3846,15 @@ + pci_disable_io_access(ioc->pcidev); + + diag0val = CHIPREG_READ32(&ioc->chip->Diagnostic); +- ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "diag0val=%x, turning off" +- " PREVENT_IOC_BOOT and DISABLE_ARM\n", ioc->name, diag0val)); ++ ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "downloadboot diag0val=%x, " ++ "turning off PREVENT_IOC_BOOT, DISABLE_ARM, RW_ENABLE\n", ++ ioc->name, diag0val)); + diag0val &= ~(MPI_DIAG_PREVENT_IOC_BOOT | MPI_DIAG_DISABLE_ARM); +- ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "diag0val=%x\n", +- ioc->name, diag0val)); ++ ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "downloadboot now diag0val=%x\n", ++ ioc->name, diag0val)); + CHIPREG_WRITE32(&ioc->chip->Diagnostic, diag0val); + +- if (ioc->bus_type == SAS) { ++ if (ioc->bus_type == SAS ) { + /* wait 1 sec */ + if (sleepFlag == CAN_SLEEP) + msleep(1000); +@@ -3757,7 +3862,7 @@ + mdelay(1000); + + diag0val = CHIPREG_READ32(&ioc->chip->Diagnostic); +- ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT ++ ddlprintk(ioc, printk (MYIOC_s_DEBUG_FMT + "diag0val=%x, turning off RW_ENABLE\n", ioc->name, + diag0val)); + diag0val &= ~(MPI_DIAG_RW_ENABLE); +@@ -3780,9 +3885,8 @@ + /* Write 0xFF to reset the sequencer */ + CHIPREG_WRITE32(&ioc->chip->WriteSequence, 0xFF); + +- for (count = 0; count < 30; count++) { +- doorbell = CHIPREG_READ32(&ioc->chip->Doorbell) +- & MPI_IOC_STATE_MASK; ++ for (count = 0; count < 30; count ++) { ++ doorbell = CHIPREG_READ32(&ioc->chip->Doorbell) & MPI_IOC_STATE_MASK; + if (doorbell == MPI_IOC_STATE_READY) { + if (ioc->bus_type == SAS) + return 0; +@@ -3795,16 +3899,14 @@ + "SendIocInit successful\n", ioc->name)); + return 0; + } +- ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT +- "looking for READY STATE: doorbell=%x count=%d\n", +- ioc->name, doorbell, count)); ++ ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "looking for READY STATE:" ++ " doorbell=%x count=%d\n", ioc->name, doorbell, count)); + if (sleepFlag == CAN_SLEEP) + msleep(1000); + else + mdelay(1000); + } +- ddlprintk(ioc, printk(MYIOC_s_WARN_FMT +- "downloadboot failed! count=%d\n", ioc->name, count)); ++ ddlprintk(ioc, printk(MYIOC_s_WARN_FMT "downloadboot failed! count=%d\n", ioc->name, count)); + return -EFAULT; + } + +@@ -3841,7 +3943,7 @@ + u32 ioc_state=0; + int cnt,cntdn; + +- dinitprintk(ioc, printk(MYIOC_s_INFO_FMT ": KickStart\n", ioc->name)); ++ dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "KickStarting!\n", ioc->name)); + if (ioc->bus_type == SPI) { + /* Always issue a Msg Unit Reset first. This will clear some + * SCSI bus hang conditions. +@@ -3859,20 +3961,16 @@ + if (hard_reset_done < 0) + return hard_reset_done; + +- /* may not have worked but hard_reset_done +- * doesn't always signal failure +- */ +- dinitprintk(ioc, printk(MYIOC_s_INFO_FMT +- "Diagnostic reset completed!\n", ioc->name)); ++ /* may not have worked but hard_reset_done doesn't always signal failure */ ++ dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Diagnostic reset successful!\n", ++ ioc->name)); + + cntdn = ((sleepFlag == CAN_SLEEP) ? HZ : 1000) * 2; /* 2 seconds */ + for (cnt=0; cntname, +- cnt)); ++ if ((ioc_state == MPI_IOC_STATE_READY) || (ioc_state == MPI_IOC_STATE_OPERATIONAL)) { ++ dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "KickStart successful! (cnt=%d)\n", ++ ioc->name, cnt)); + return hard_reset_done; + } + if (sleepFlag == CAN_SLEEP) { +@@ -3883,7 +3981,7 @@ + } + + dinitprintk(ioc, printk(MYIOC_s_ERR_FMT "Failed to come READY after reset! IocState=%x\n", +- ioc->name, mpt_GetIocState(ioc, 0))); ++ ioc->name, mpt_GetIocState(ioc, 0))); + return -1; + } + +@@ -3926,8 +4024,8 @@ + return 0; + + drsprintk(ioc, printk(MYIOC_s_WARN_FMT "%s: Doorbell=%p; 1078 reset " +- "address=%p\n", ioc->name, __func__, &ioc->chip->Doorbell, +- &ioc->chip->Reset_1078)); ++ "address=%p\n", ioc->name, __func__, ++ &ioc->chip->Doorbell, &ioc->chip->Reset_1078)); + CHIPREG_WRITE32(&ioc->chip->Reset_1078, 0x07); + if (sleepFlag == CAN_SLEEP) + msleep(1); +@@ -3942,8 +4040,7 @@ + */ + for (cb_idx = MPT_MAX_PROTOCOL_DRIVERS-1; cb_idx; cb_idx--) { + if (MptResetHandlers[cb_idx]) +- (*(MptResetHandlers[cb_idx])) +- (ioc, MPT_IOC_PRE_RESET); ++ (*(MptResetHandlers[cb_idx]))(ioc, MPT_IOC_PRE_RESET); + } + + for (count = 0; count < 60; count ++) { +@@ -3955,8 +4052,9 @@ + " count=%d\n", + ioc->name, doorbell, count)); + +- if (doorbell == MPI_IOC_STATE_READY) ++ if (doorbell == MPI_IOC_STATE_READY) { + return 1; ++ } + + /* + * Early out for hard fault +@@ -3982,10 +4080,8 @@ + + if (ioc->debug_level & MPT_DEBUG_RESET) { + if (ioc->alt_ioc) +- diag1val = +- CHIPREG_READ32(&ioc->alt_ioc->chip->Diagnostic); +- drsprintk(ioc, printk(MYIOC_s_DEBUG_FMT +- "DbG1: diag0=%08x, diag1=%08x\n", ++ diag1val = CHIPREG_READ32(&ioc->alt_ioc->chip->Diagnostic); ++ drsprintk(ioc, printk(MYIOC_s_DEBUG_FMT "DbG1: diag0=%08x, diag1=%08x\n", + ioc->name, diag0val, diag1val)); + } + +@@ -4005,10 +4101,11 @@ + CHIPREG_WRITE32(&ioc->chip->WriteSequence, MPI_WRSEQ_5TH_KEY_VALUE); + + /* wait 100 msec */ +- if (sleepFlag == CAN_SLEEP) ++ if (sleepFlag == CAN_SLEEP) { + msleep (100); +- else ++ } else { + mdelay (100); ++ } + + count++; + if (count > 20) { +@@ -4020,16 +4117,14 @@ + + diag0val = CHIPREG_READ32(&ioc->chip->Diagnostic); + +- drsprintk(ioc, printk(MYIOC_s_DEBUG_FMT +- "Wrote magic DiagWriteEn sequence (%x)\n", +- ioc->name, diag0val)); ++ drsprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Wrote magic DiagWriteEn sequence (%x)\n", ++ ioc->name, diag0val)); + } + + if (ioc->debug_level & MPT_DEBUG_RESET) { + if (ioc->alt_ioc) + diag1val = CHIPREG_READ32(&ioc->alt_ioc->chip->Diagnostic); +- drsprintk(ioc, printk(MYIOC_s_DEBUG_FMT +- "DbG2: diag0=%08x, diag1=%08x\n", ++ drsprintk(ioc, printk(MYIOC_s_DEBUG_FMT "DbG2: diag0=%08x, diag1=%08x\n", + ioc->name, diag0val, diag1val)); + } + /* +@@ -4045,8 +4140,8 @@ + */ + CHIPREG_WRITE32(&ioc->chip->Diagnostic, diag0val | MPI_DIAG_RESET_ADAPTER); + hard_reset_done = 1; +- drsprintk(ioc, printk(MYIOC_s_DEBUG_FMT +- "Diagnostic reset performed\n", ioc->name)); ++ drsprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Diagnostic reset performed\n", ++ ioc->name)); + + /* + * Call each currently registered protocol IOC reset handler +@@ -4056,11 +4151,10 @@ + */ + for (cb_idx = MPT_MAX_PROTOCOL_DRIVERS-1; cb_idx; cb_idx--) { + if (MptResetHandlers[cb_idx]) { +- mpt_signal_reset(cb_idx, ioc, +- MPT_IOC_PRE_RESET); +- if (ioc->alt_ioc) +- mpt_signal_reset(cb_idx, +- ioc->alt_ioc, MPT_IOC_PRE_RESET); ++ mpt_signal_reset(cb_idx, ioc, MPT_IOC_PRE_RESET); ++ if (ioc->alt_ioc) { ++ mpt_signal_reset(cb_idx, ioc->alt_ioc, MPT_IOC_PRE_RESET); ++ } + } + } + +@@ -4081,19 +4175,20 @@ + break; + } + +- drsprintk(ioc, printk(MYIOC_s_DEBUG_FMT +- "cached_fw: diag0val=%x count=%d\n", ++ drsprintk(ioc, printk(MYIOC_s_DEBUG_FMT "cached_fw: diag0val=%x count=%d\n", + ioc->name, diag0val, count)); + /* wait 1 sec */ +- if (sleepFlag == CAN_SLEEP) ++ if (sleepFlag == CAN_SLEEP) { + msleep (1000); +- else ++ } else { + mdelay (1000); ++ } + } + if ((count = mpt_downloadboot(ioc, cached_fw, sleepFlag)) < 0) { + printk(MYIOC_s_WARN_FMT + "firmware downloadboot failure (%d)!\n", ioc->name, count); + } ++ + } else { + /* Wait for FW to reload and for board + * to go to the READY state. +@@ -4109,8 +4204,9 @@ + "looking for READY STATE: doorbell=%x" + " count=%d\n", ioc->name, doorbell, count)); + +- if (doorbell == MPI_IOC_STATE_READY) ++ if (doorbell == MPI_IOC_STATE_READY) { + break; ++ } + + /* + * Early out for hard fault +@@ -4119,10 +4215,11 @@ + break; + + /* wait 1 sec */ +- if (sleepFlag == CAN_SLEEP) ++ if (sleepFlag == CAN_SLEEP) { + msleep (1000); +- else ++ } else { + mdelay (1000); ++ } + } + + if (doorbell != MPI_IOC_STATE_READY) +@@ -4136,8 +4233,7 @@ + if (ioc->debug_level & MPT_DEBUG_RESET) { + if (ioc->alt_ioc) + diag1val = CHIPREG_READ32(&ioc->alt_ioc->chip->Diagnostic); +- drsprintk(ioc, printk(MYIOC_s_DEBUG_FMT +- "DbG3: diag0=%08x, diag1=%08x\n", ++ drsprintk(ioc, printk(MYIOC_s_DEBUG_FMT "DbG3: diag0=%08x, diag1=%08x\n", + ioc->name, diag0val, diag1val)); + } + +@@ -4158,10 +4254,11 @@ + CHIPREG_WRITE32(&ioc->chip->WriteSequence, MPI_WRSEQ_5TH_KEY_VALUE); + + /* wait 100 msec */ +- if (sleepFlag == CAN_SLEEP) ++ if (sleepFlag == CAN_SLEEP) { + msleep (100); +- else ++ } else { + mdelay (100); ++ } + + count++; + if (count > 20) { +@@ -4195,9 +4292,8 @@ + if (ioc->debug_level & MPT_DEBUG_RESET) { + if (ioc->alt_ioc) + diag1val = CHIPREG_READ32(&ioc->alt_ioc->chip->Diagnostic); +- drsprintk(ioc, printk(MYIOC_s_DEBUG_FMT +- "DbG4: diag0=%08x, diag1=%08x\n", +- ioc->name, diag0val, diag1val)); ++ drsprintk(ioc, printk(MYIOC_s_DEBUG_FMT "DbG4: diag0=%08x, diag1=%08x\n", ++ ioc->name, diag0val, diag1val)); + } + + /* +@@ -4257,10 +4353,14 @@ + if (sleepFlag == CAN_SLEEP) { + msleep(1); + } else { +- mdelay(1); /* 1 msec delay */ +- } +- } +- ++ mdelay (1); /* 1 msec delay */ ++ } ++ } ++ ++ /* TODO! ++ * Cleanup all event stuff for this IOC; re-issue EventNotification ++ * request if needed. ++ */ + if (ioc->facts.Function) + ioc->facts.EventState = 0; + +@@ -4326,8 +4426,8 @@ + numSGE = (scale - 1) * (ioc->facts.MaxChainDepth-1) + scale + + (ioc->req_sz - 60) / ioc->SGE_size; + } else { +- numSGE = 1 + (scale - 1) * (ioc->facts.MaxChainDepth-1) + scale + +- (ioc->req_sz - 64) / ioc->SGE_size; ++ numSGE = 1 + (scale - 1) * (ioc->facts.MaxChainDepth-1) + ++ scale + (ioc->req_sz - 64) / ioc->SGE_size; + } + dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "num_sge=%d numSGE=%d\n", + ioc->name, num_sge, numSGE)); +@@ -4335,7 +4435,8 @@ + if (ioc->bus_type == FC) { + if (numSGE > MPT_SCSI_FC_SG_DEPTH) + numSGE = MPT_SCSI_FC_SG_DEPTH; +- } else { ++ } ++ else { + if (numSGE > MPT_SCSI_SG_DEPTH) + numSGE = MPT_SCSI_SG_DEPTH; + } +@@ -4397,10 +4498,10 @@ + dma_mask = 0; + + /* Prime reply FIFO... */ ++ + if (ioc->reply_frames == NULL) { + if ( (num_chain = initChainBuffers(ioc)) < 0) + return -1; +- + /* + * 1078 errata workaround for the 36GB limitation + */ +@@ -4415,10 +4516,17 @@ + "Request/Reply/Chain and Sense Buffers\n", + ioc->name)); + } else { +- d36memprintk(ioc, printk(MYIOC_s_DEBUG_FMT ++ /*Reseting DMA mask to 64 bit*/ ++ pci_set_dma_mask(ioc->pcidev, ++ DMA_64BIT_MASK); ++ pci_set_consistent_dma_mask(ioc->pcidev, ++ DMA_64BIT_MASK); ++ ++ printk(MYIOC_s_ERR_FMT + "failed setting 35 bit addressing for " + "Request/Reply/Chain and Sense Buffers\n", +- ioc->name)); ++ ioc->name); ++ return -1; + } + } + +@@ -4788,7 +4896,7 @@ + } + } else { + while (--cntdn) { +- udelay(1000); ++ udelay (1000); + intstat = CHIPREG_READ32(&ioc->chip->IntStatus); + if (intstat & MPI_HIS_DOORBELL_INTERRUPT) + break; +@@ -4862,7 +4970,7 @@ + failcnt++; + hword = le16_to_cpu(CHIPREG_READ32(&ioc->chip->Doorbell) & 0x0000FFFF); + /* don't overflow our IOC hs_reply[] buffer! */ +- if (u16cnt < sizeof(ioc->hs_reply) / sizeof(ioc->hs_reply[0])) ++ if (u16cnt < ARRAY_SIZE(ioc->hs_reply)) + hs_reply[u16cnt] = hword; + CHIPREG_WRITE32(&ioc->chip->IntStatus, 0); + } +@@ -4950,6 +5058,10 @@ + + pci_free_consistent(ioc->pcidev, data_sz, (u8 *) ppage0_alloc, page0_dma); + ++ /* FIXME! ++ * Normalize endianness of structure data, ++ * by byte-swapping all > 1 byte fields! ++ */ + + } + +@@ -4990,6 +5102,11 @@ + + pci_free_consistent(ioc->pcidev, data_sz, (u8 *) ppage1_alloc, page1_dma); + ++ /* FIXME! ++ * Normalize endianness of structure data, ++ * by byte-swapping all > 1 byte fields! ++ */ ++ + } + + return rc; +@@ -5009,6 +5126,8 @@ + * + * Returns 0 for success, non-zero error + */ ++ ++/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ + int + mptbase_sas_persist_operation(MPT_ADAPTER *ioc, u8 persist_opcode) + { +@@ -5037,12 +5156,13 @@ + goto out; + } + +- printk("%s: persist_opcode=%x\n",__func__, persist_opcode); ++ printk(KERN_DEBUG "%s: persist_opcode=%x\n", ++ __func__, persist_opcode); + + /* Get a MF for this command. + */ + if ((mf = mpt_get_msg_frame(mpt_base_index, ioc)) == NULL) { +- printk("%s: no msg frames!\n",__func__); ++ printk(KERN_DEBUG "%s: no msg frames!\n", __func__); + ret = -1; + goto out; + } +@@ -5058,11 +5178,11 @@ + timeleft = wait_for_completion_timeout(&ioc->mptbase_cmds.done, 10*HZ); + if (!(ioc->mptbase_cmds.status & MPT_MGMT_STATUS_COMMAND_GOOD)) { + ret = -ETIME; +- printk(KERN_WARNING "%s: failed\n", __func__); ++ printk(KERN_DEBUG "%s: failed\n", __func__); + if (ioc->mptbase_cmds.status & MPT_MGMT_STATUS_DID_IOCRESET) + goto out; + if (!timeleft) { +- printk(MYIOC_s_WARN_FMT "Issuing Reset from %s!!\n", ++ printk(KERN_DEBUG "%s: Issuing Reset from %s!!\n", + ioc->name, __func__); + if (mpt_SoftResetHandler(ioc, CAN_SLEEP) != 0) + mpt_HardResetHandler(ioc, CAN_SLEEP); +@@ -5079,13 +5199,13 @@ + sasIoUnitCntrReply = + (SasIoUnitControlReply_t *)ioc->mptbase_cmds.reply; + if (le16_to_cpu(sasIoUnitCntrReply->IOCStatus) != MPI_IOCSTATUS_SUCCESS) { +- printk(KERN_WARNING "%s: IOCStatus=0x%X IOCLogInfo=0x%X\n", ++ printk(KERN_DEBUG "%s: IOCStatus=0x%X IOCLogInfo=0x%X\n", + __func__, sasIoUnitCntrReply->IOCStatus, + sasIoUnitCntrReply->IOCLogInfo); +- printk(KERN_WARNING "%s: failed\n", __func__); ++ printk(KERN_DEBUG "%s: failed\n", __func__); + ret = -1; + } else +- printk(KERN_INFO "%s: success\n", __func__); ++ printk(KERN_DEBUG "%s: success\n", __func__); + out: + + CLEAR_MGMT_STATUS(ioc->mptbase_cmds.status) +@@ -5363,8 +5483,8 @@ + ioc->spi_data.busType = MPT_HOST_BUS_UNKNOWN; + rc = 1; + ddvprintk(ioc, printk(MYIOC_s_DEBUG_FMT +- "Unable to read PortPage0 minSyncFactor=%x\n", +- ioc->name, ioc->spi_data.minSyncFactor)); ++ "Unable to read PortPage0 minSyncFactor=%x\n", ++ ioc->name, ioc->spi_data.minSyncFactor)); + } else { + /* Save the Port Page 0 data + */ +@@ -5563,7 +5683,7 @@ + { + CONFIGPARMS cfg; + ConfigPageHeader_t header; +- IOCPage6_t *pIoc6 = NULL; ++ IOCPage6_t *pIoc6=NULL; + dma_addr_t ioc6_dma; + int iocpage6sz; + void *mem; +@@ -5622,9 +5742,8 @@ + } + + /** +- * mpt_inactive_raid_list_free - This clears this link list. +- * @ioc : pointer to per adapter structure +- * ++ * mpt_inactive_raid_list_free - This clears this link list. ++ * @ioc : pointer to per adapter structure + **/ + static void + mpt_inactive_raid_list_free(MPT_ADAPTER *ioc) +@@ -5634,23 +5753,21 @@ + if (list_empty(&ioc->raid_data.inactive_list)) + return; + +- mutex_lock(&ioc->raid_data.inactive_list_mutex); ++ down(&ioc->raid_data.inactive_list_mutex); + list_for_each_entry_safe(component_info, pNext, + &ioc->raid_data.inactive_list, list) { + list_del(&component_info->list); + kfree(component_info); + } +- mutex_unlock(&ioc->raid_data.inactive_list_mutex); +-} +- +-/** +- * mpt_inactive_raid_volumes - sets up link list of phy_disk_nums +- * for devices belonging in an inactive volume +- * +- * @ioc : pointer to per adapter structure +- * @channel : volume channel +- * @id : volume target id +- * ++ up(&ioc->raid_data.inactive_list_mutex); ++} ++ ++/** ++ * mpt_inactive_raid_volumes - sets up link list of phy_disk_nums for devices belonging in an inactive volume ++ * ++ * @ioc : pointer to per adapter structure ++ * @channel : volume channel ++ * @id : volume target id + **/ + static void + mpt_inactive_raid_volumes(MPT_ADAPTER *ioc, u8 channel, u8 id) +@@ -5703,7 +5820,7 @@ + if (!handle_inactive_volumes) + goto out; + +- mutex_lock(&ioc->raid_data.inactive_list_mutex); ++ down(&ioc->raid_data.inactive_list_mutex); + for (i = 0; i < buffer->NumPhysDisks; i++) { + if(mpt_raid_phys_disk_pg0(ioc, + buffer->PhysDisk[i].PhysDiskNum, &phys_disk) != 0) +@@ -5719,7 +5836,7 @@ + buffer->PhysDisk[i].PhysDiskNum); + if (num_paths < 2) + continue; +- phys_disk_1 = kzalloc(offsetof(RaidPhysDiskPage1_t, Path) + ++ phys_disk_1 = kzalloc(offsetof(RaidPhysDiskPage1_t,Path) + + (num_paths * sizeof(RAID_PHYS_DISK1_PATH)), GFP_KERNEL); + if (!phys_disk_1) + continue; +@@ -5733,7 +5850,7 @@ + continue; + + if ((component_info = kmalloc(sizeof (*component_info), +- GFP_KERNEL)) == NULL) ++ GFP_KERNEL)) == NULL) + continue; + + component_info->volumeID = id; +@@ -5746,7 +5863,7 @@ + list_add_tail(&component_info->list, + &ioc->raid_data.inactive_list); + } +- mutex_unlock(&ioc->raid_data.inactive_list_mutex); ++ up(&ioc->raid_data.inactive_list_mutex); + + out: + if (buffer) +@@ -5767,10 +5884,10 @@ + **/ + int + mpt_raid_phys_disk_pg0(MPT_ADAPTER *ioc, u8 phys_disk_num, +- RaidPhysDiskPage0_t *phys_disk) +-{ +- CONFIGPARMS cfg; +- ConfigPageHeader_t hdr; ++ RaidPhysDiskPage0_t *phys_disk) ++{ ++ CONFIGPARMS cfg; ++ ConfigPageHeader_t hdr; + dma_addr_t dma_handle; + pRaidPhysDiskPage0_t buffer = NULL; + int rc; +@@ -5901,8 +6018,7 @@ + * -ENOMEM if pci_alloc failed + **/ + int +-mpt_raid_phys_disk_pg1(MPT_ADAPTER *ioc, u8 phys_disk_num, +- RaidPhysDiskPage1_t *phys_disk) ++mpt_raid_phys_disk_pg1(MPT_ADAPTER *ioc, u8 phys_disk_num, RaidPhysDiskPage1_t *phys_disk) + { + CONFIGPARMS cfg; + ConfigPageHeader_t hdr; +@@ -5955,20 +6071,14 @@ + for (i = 0; i < phys_disk->NumPhysDiskPaths; i++) { + phys_disk->Path[i].PhysDiskID = buffer->Path[i].PhysDiskID; + phys_disk->Path[i].PhysDiskBus = buffer->Path[i].PhysDiskBus; +- phys_disk->Path[i].OwnerIdentifier = +- buffer->Path[i].OwnerIdentifier; +- phys_disk->Path[i].Flags = +- le16_to_cpu(buffer->Path[i].Flags); +- memcpy(&sas_address, &buffer->Path[i].WWID, +- sizeof(__le64)); ++ phys_disk->Path[i].OwnerIdentifier = buffer->Path[i].OwnerIdentifier; ++ phys_disk->Path[i].Flags = le16_to_cpu(buffer->Path[i].Flags); ++ memcpy(&sas_address, &buffer->Path[i].WWID, sizeof(__le64)); + sas_address = le64_to_cpu(sas_address); +- memcpy(&phys_disk->Path[i].WWID, &sas_address, +- sizeof(__le64)); +- memcpy(&sas_address, &buffer->Path[i].OwnerWWID, +- sizeof(__le64)); ++ memcpy(&phys_disk->Path[i].WWID, &sas_address, sizeof(__le64)); ++ memcpy(&sas_address, &buffer->Path[i].OwnerWWID, sizeof(__le64)); + sas_address = le64_to_cpu(sas_address); +- memcpy(&phys_disk->Path[i].OwnerWWID, &sas_address, +- sizeof(__le64)); ++ memcpy(&phys_disk->Path[i].OwnerWWID, &sas_address, sizeof(__le64)); + } + + out: +@@ -5992,8 +6102,8 @@ + static int + mpt_sort_ioc_pg2(const void *a, const void *b) + { +- ConfigPageIoc2RaidVol_t *volume_a = (ConfigPageIoc2RaidVol_t *)a; +- ConfigPageIoc2RaidVol_t *volume_b = (ConfigPageIoc2RaidVol_t *)b; ++ ConfigPageIoc2RaidVol_t * volume_a = (ConfigPageIoc2RaidVol_t *)a; ++ ConfigPageIoc2RaidVol_t * volume_b = (ConfigPageIoc2RaidVol_t *)b; + + if (volume_a->VolumeBus == volume_b->VolumeBus) { + if (volume_a->VolumeID == volume_b->VolumeID) +@@ -6010,7 +6120,6 @@ + /** + * mpt_findImVolumes - Identify IDs of hidden disks and RAID Volumes + * @ioc: Pointer to a Adapter Strucutre +- * @portnum: IOC port number + * + * Return: + * 0 on success +@@ -6268,22 +6377,24 @@ + + cfg.action = MPI_CONFIG_ACTION_PAGE_WRITE_NVRAM; + if (mpt_config(ioc, &cfg) == 0) { +- dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Reset NVRAM Coalescing Timeout to = %d\n", ++ dprintk(ioc, printk(MYIOC_s_DEBUG_FMT ++ "Reset NVRAM Coalescing Timeout to = %d\n", + ioc->name, MPT_COALESCING_TIMEOUT)); + } else { +- dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Reset NVRAM Coalescing Timeout Failed\n", +- ioc->name)); ++ dprintk(ioc, printk(MYIOC_s_DEBUG_FMT ++ "Reset NVRAM Coalescing Timeout Failed\n", ++ ioc->name)); + } + + } else { +- dprintk(ioc, printk(MYIOC_s_WARN_FMT "Reset of Current Coalescing Timeout Failed!\n", +- ioc->name)); +- } +- } +- +- } else { +- dprintk(ioc, printk(MYIOC_s_WARN_FMT +- "Coalescing Disabled\n", ioc->name)); ++ dprintk(ioc, printk(MYIOC_s_WARN_FMT ++ "Reset of Current Coalescing Timeout Failed!\n", ++ ioc->name)); ++ } ++ } ++ ++ } else { ++ dprintk(ioc, printk(MYIOC_s_WARN_FMT "Coalescing Disabled\n", ioc->name)); + } + } + +@@ -6377,7 +6488,7 @@ + + if ((pAck = (EventAck_t *) mpt_get_msg_frame(mpt_base_index, ioc)) == NULL) { + dfailprintk(ioc, printk(MYIOC_s_WARN_FMT "%s, no msg frames!!\n", +- ioc->name,__func__)); ++ ioc->name, __func__)); + return -1; + } + +@@ -6424,11 +6535,19 @@ + u8 page_type = 0, extend_page; + unsigned long timeleft; + unsigned long flags; ++ int in_isr; + u8 issue_hard_reset = 0; + u8 retry_count = 0; + +- if (in_interrupt()) ++ /* Prevent calling wait_event() (below), if caller happens ++ * to be in ISR context, because that is fatal! ++ */ ++ in_isr = in_interrupt(); ++ if (in_isr) { ++ dcprintk(ioc, printk(MYIOC_s_WARN_FMT "Config request not allowed in ISR context!\n", ++ ioc->name)); + return -EPERM; ++ } + + /* don't send a config page during diag reset */ + spin_lock_irqsave(&ioc->taskmgmt_lock, flags); +@@ -6523,8 +6642,8 @@ + ioc->add_sge((char *)&pReq->PageBufferSGE, flagsLength, pCfg->physAddr); + timeout = (pCfg->timeout < 15) ? HZ*15 : HZ*pCfg->timeout; + mpt_put_msg_frame(mpt_base_index, ioc, mf); +- timeleft = +- wait_for_completion_timeout(&ioc->mptbase_cmds.done, timeout); ++ timeleft = wait_for_completion_timeout(&ioc->mptbase_cmds.done, ++ timeout); + if (!(ioc->mptbase_cmds.status & MPT_MGMT_STATUS_COMMAND_GOOD)) { + ret = -ETIME; + dfailprintk(ioc, printk(MYIOC_s_DEBUG_FMT +@@ -6560,8 +6679,8 @@ + } + + if (retry_count) +- printk(MYIOC_s_INFO_FMT +- "Retry completed ret=0x%x timeleft=%ld\n", ++ printk(MYIOC_s_INFO_FMT "Retry completed " ++ "ret=0x%x timeleft=%ld\n", + ioc->name, ret, timeleft); + + dcprintk(ioc, printk(KERN_DEBUG "IOCStatus=%04xh, IOCLogInfo=%08xh\n", +@@ -6581,8 +6700,9 @@ + /* attempt one retry for a timed out command */ + if (!retry_count) { + printk(MYIOC_s_INFO_FMT +- "Attempting Retry Config request type 0x%x," +- " page 0x%x, action %d\n", ioc->name, page_type, ++ "Attempting Retry Config request" ++ " type 0x%x, page 0x%x," ++ " action %d\n", ioc->name, page_type, + pCfg->cfghdr.hdr->PageNumber, pCfg->action); + retry_count++; + goto retry_config; +@@ -6604,9 +6724,9 @@ + { + switch (reset_phase) { + case MPT_IOC_SETUP_RESET: ++ ioc->taskmgmt_quiesce_io = 1; + dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT + "%s: MPT_IOC_SETUP_RESET\n", ioc->name, __func__)); +- ioc->taskmgmt_quiesce_io = 1; + break; + case MPT_IOC_PRE_RESET: + dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT +@@ -6617,14 +6737,14 @@ + "%s: MPT_IOC_POST_RESET\n", ioc->name, __func__)); + /* wake up mptbase_cmds */ + if (ioc->mptbase_cmds.status & MPT_MGMT_STATUS_PENDING) { +- ioc->mptbase_cmds.status +- |= MPT_MGMT_STATUS_DID_IOCRESET; ++ ioc->mptbase_cmds.status |= ++ MPT_MGMT_STATUS_DID_IOCRESET; + complete(&ioc->mptbase_cmds.done); + } + /* wake up taskmgmt_cmds */ + if (ioc->taskmgmt_cmds.status & MPT_MGMT_STATUS_PENDING) { +- ioc->taskmgmt_cmds.status +- |= MPT_MGMT_STATUS_DID_IOCRESET; ++ ioc->taskmgmt_cmds.status |= ++ MPT_MGMT_STATUS_DID_IOCRESET; + complete(&ioc->taskmgmt_cmds.done); + } + break; +@@ -6637,6 +6757,10 @@ + + + #ifdef CONFIG_PROC_FS /* { */ ++/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ ++/* ++ * procfs (%MPT_PROCFS_MPTBASEDIR/...) support stuff... ++ */ + /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ + /** + * procmpt_create - Create %MPT_PROCFS_MPTBASEDIR entries. +@@ -6874,6 +6998,7 @@ + + #endif /* CONFIG_PROC_FS } */ + ++/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ + static void + mpt_get_fw_exp_ver(char *buf, MPT_ADAPTER *ioc) + { +@@ -6936,12 +7061,6 @@ + + *size = y; + } +- +-/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ +-/* +- * Reset Handling +- */ +- + /** + * mpt_set_taskmgmt_in_progress_flag - set flags associated with task managment + * @ioc: Pointer to MPT_ADAPTER structure +@@ -7012,19 +7131,19 @@ + if ((ioc_raw_state & MPI_IOC_STATE_MASK) == MPI_IOC_STATE_FAULT) { + printk(MYIOC_s_ERR_FMT "IOC is in FAULT state (%04xh)!!!\n", + ioc->name, ioc_raw_state & MPI_DOORBELL_DATA_MASK); +- if (mpt_fwfault_debug == 2) +- for (;;); +- else +- panic("%s: IOC Fault (%04xh)!!!\n", ioc->name, +- ioc_raw_state & MPI_DOORBELL_DATA_MASK); ++ if(mpt_fwfault_debug == 2) ++ for(;;); ++ else ++ panic("%s: IOC Fault (%04xh)!!!\n", ioc->name, ++ ioc_raw_state & MPI_DOORBELL_DATA_MASK); + } else { + CHIPREG_WRITE32(&ioc->chip->Doorbell, 0xC0FFEE00); +- if (mpt_fwfault_debug == 2) { +- printk(KERN_ERR +- "%s: Firmware is halted due to command timeout\n", +- ioc->name); +- for (;;); +- } else ++ if(mpt_fwfault_debug == 2) { ++ printk("%s: Firmware is halted due to command timeout\n" ++ ,ioc->name); ++ for(;;); ++ } ++ else + panic("%s: Firmware is halted due to command timeout\n", + ioc->name); + } +@@ -7054,18 +7173,22 @@ + u32 ioc_state; + unsigned long time_count; + +- dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT +- "SoftResetHandler Entered!\n", ioc->name)); ++ dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "SoftResetHandler Entered!\n", ioc->name)); + + ioc_state = mpt_GetIocState(ioc, 0) & MPI_IOC_STATE_MASK; + +- if (mpt_fwfault_debug) ++ if(mpt_fwfault_debug) + mpt_halt_firmware(ioc); + +- if (ioc_state == MPI_IOC_STATE_FAULT +- || ioc_state == MPI_IOC_STATE_RESET) { ++ if (ioc_state == MPI_IOC_STATE_FAULT || ioc_state == MPI_IOC_STATE_RESET) { + dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT + "skipping, either in FAULT or RESET state!\n", ioc->name)); ++ return -1; ++ } ++ ++ if (ioc->bus_type == FC) { ++ dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT ++ "skipping, because the bus type is FC!\n", ioc->name)); + return -1; + } + +@@ -7084,6 +7207,12 @@ + mpt_signal_reset(cb_idx, ioc, MPT_IOC_SETUP_RESET); + } + ++ spin_lock_irqsave(&ioc->taskmgmt_lock, flags); ++ if (ioc->taskmgmt_in_progress) { ++ spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags); ++ return -1; ++ } ++ spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags); + /* Disable reply interrupts (also blocks FreeQ) */ + CHIPREG_WRITE32(&ioc->chip->IntMask, 0xFFFFFFFF); + ioc->active = 0; +@@ -7095,7 +7224,7 @@ + if (MptResetHandlers[cb_idx]) + mpt_signal_reset(cb_idx, ioc, MPT_IOC_PRE_RESET); + } +- ++ + if (rc) + goto out; + +@@ -7108,10 +7237,11 @@ + if ((rc = GetIocFacts(ioc, sleepFlag, + MPT_HOSTEVENT_IOC_RECOVER)) == 0) + break; +- if (sleepFlag == CAN_SLEEP) ++ if (sleepFlag == CAN_SLEEP) { + msleep(100); +- else ++ } else { + mdelay(100); ++ } + } + if (ii == 5) + goto out; +@@ -7145,15 +7275,13 @@ + if (ioc->active) { /* otherwise, hard reset coming */ + for (cb_idx = MPT_MAX_PROTOCOL_DRIVERS-1; cb_idx; cb_idx--) { + if (MptResetHandlers[cb_idx]) +- mpt_signal_reset(cb_idx, +- ioc, MPT_IOC_POST_RESET); +- } +- } +- +- dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT +- "SoftResetHandler: completed (%d seconds): %s\n", +- ioc->name, jiffies_to_msecs(jiffies - time_count)/1000, +- ((rc == 0) ? "SUCCESS" : "FAILED"))); ++ mpt_signal_reset(cb_idx, ioc, MPT_IOC_POST_RESET); ++ } ++ } ++ ++ dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "SoftResetHandler: completed (%d seconds): %s\n", ++ ioc->name, jiffies_to_msecs(jiffies - time_count)/1000, ++ ((rc == 0) ? "SUCCESS" : "FAILED"))); + + return rc; + } +@@ -7188,7 +7316,6 @@ + printk(MYIOC_s_INFO_FMT "HardResetHandler Entered!\n", ioc->name); + printk("MF count 0x%x !\n", ioc->mfcnt); + #endif +- + if (mpt_fwfault_debug) + mpt_halt_firmware(ioc); + +@@ -7215,27 +7342,29 @@ + if (MptResetHandlers[cb_idx]) { + mpt_signal_reset(cb_idx, ioc, MPT_IOC_SETUP_RESET); + if (ioc->alt_ioc) +- mpt_signal_reset(cb_idx, +- ioc->alt_ioc, MPT_IOC_SETUP_RESET); ++ mpt_signal_reset(cb_idx, ioc->alt_ioc, ++ MPT_IOC_SETUP_RESET); + } + } + + time_count = jiffies; + if ((rc = mpt_do_ioc_recovery(ioc, MPT_HOSTEVENT_IOC_RECOVER, sleepFlag)) != 0) { +- printk(KERN_WARNING MYNAM +- ": WARNING - (%d) Cannot recover %s\n", rc, ioc->name); ++ printk(KERN_WARNING MYNAM ": WARNING - (%d) Cannot recover %s\n", ++ rc, ioc->name); + } else { + if (ioc->hard_resets < -1) + ioc->hard_resets++; + } + + spin_lock_irqsave(&ioc->taskmgmt_lock, flags); ++ if (ioc->is_fault == 1) ++ ioc->is_fault = 2; ++ ioc->taskmgmt_quiesce_io = 0; + ioc->ioc_reset_in_progress = 0; +- ioc->taskmgmt_quiesce_io = 0; + ioc->taskmgmt_in_progress = 0; + if (ioc->alt_ioc) { ++ ioc->alt_ioc->taskmgmt_quiesce_io = 0; + ioc->alt_ioc->ioc_reset_in_progress = 0; +- ioc->alt_ioc->taskmgmt_quiesce_io = 0; + ioc->alt_ioc->taskmgmt_in_progress = 0; + } + spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags); +@@ -7244,15 +7373,16 @@ + if (MptResetHandlers[cb_idx]) { + mpt_signal_reset(cb_idx, ioc, MPT_IOC_POST_RESET); + if (ioc->alt_ioc) +- mpt_signal_reset(cb_idx, +- ioc->alt_ioc, MPT_IOC_POST_RESET); +- } +- } +- +- dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT +- "HardResetHandler: completed (%d seconds): %s\n", +- ioc->name, jiffies_to_msecs(jiffies - time_count)/1000, +- ((rc == 0) ? "SUCCESS" : "FAILED"))); ++ mpt_signal_reset(cb_idx, ioc->alt_ioc, MPT_IOC_POST_RESET); ++ } ++ } ++ ++ dtmprintk(ioc, ++ printk(MYIOC_s_DEBUG_FMT ++ "HardResetHandler: completed (%d seconds): %s\n", ioc->name, ++ jiffies_to_msecs(jiffies - time_count)/1000, ((rc == 0) ? ++ "SUCCESS" : "FAILED"))); ++ + return rc; + } + +@@ -7723,7 +7853,6 @@ + devtverboseprintk(ioc, printk(KERN_DEBUG "\n")); + } + #endif +- + /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ + /** + * ProcessEventNotification - Route EventNotificationReply to all event handlers +@@ -7746,14 +7875,14 @@ + int handlers = 0; + u8 event; + +- + /* + * Do platform normalization of values + */ + event = le32_to_cpu(pEventReply->Event) & 0xFF; + evDataLen = le16_to_cpu(pEventReply->EventDataLength); +- if (evDataLen) ++ if (evDataLen) { + evData0 = le32_to_cpu(pEventReply->Data[0]); ++ } + + #ifdef CONFIG_FUSION_LOGGING + if (evDataLen) +@@ -7819,6 +7948,7 @@ + handlers++; + } + } ++ /* FIXME? Examine results here? */ + + /* + * If needed, send (a single) EventAck. +@@ -7884,7 +8014,6 @@ + /** + * mpt_spi_log_info - Log information returned from SCSI Parallel IOC. + * @ioc: Pointer to MPT_ADAPTER structure +- * @mr: Pointer to MPT reply frame + * @log_info: U32 LogInfo word from the IOC + * + * Refer to lsi/sp_log.h. +@@ -8092,6 +8221,7 @@ + "Compatibility Error: IME Size Limited to < 2TB", /* 3Dh */ + }; + ++/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ + /** + * mpt_sas_log_info - Log information returned from SAS IOC. + * @ioc: Pointer to MPT_ADAPTER structure +@@ -8118,7 +8248,7 @@ + + sas_loginfo.loginfo = log_info; + if ((sas_loginfo.dw.bus_type != 3 /*SAS*/) && +- (sas_loginfo.dw.originator < sizeof(originator_str)/sizeof(char*))) ++ (sas_loginfo.dw.originator < ARRAY_SIZE(originator_str))) + return; + + originator_desc = originator_str[sas_loginfo.dw.originator]; +@@ -8127,21 +8257,21 @@ + + case 0: /* IOP */ + if (sas_loginfo.dw.code < +- sizeof(iop_code_str)/sizeof(char*)) ++ ARRAY_SIZE(iop_code_str)) + code_desc = iop_code_str[sas_loginfo.dw.code]; + break; + case 1: /* PL */ + if (sas_loginfo.dw.code < +- sizeof(pl_code_str)/sizeof(char*)) ++ ARRAY_SIZE(pl_code_str)) + code_desc = pl_code_str[sas_loginfo.dw.code]; + break; + case 2: /* IR */ + if (sas_loginfo.dw.code >= +- sizeof(ir_code_str)/sizeof(char*)) ++ ARRAY_SIZE(ir_code_str)) + break; + code_desc = ir_code_str[sas_loginfo.dw.code]; + if (sas_loginfo.dw.subcode >= +- sizeof(raid_sub_code_str)/sizeof(char*)) ++ ARRAY_SIZE(raid_sub_code_str)) + break; + if (sas_loginfo.dw.code == 0) + sub_code_desc = +@@ -8171,6 +8301,7 @@ + sas_loginfo.dw.code, sas_loginfo.dw.subcode); + } + ++/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ + /** + * mpt_iocstatus_info_config - IOCSTATUS information for config pages + * @ioc: Pointer to MPT_ADAPTER structure +@@ -8472,8 +8603,8 @@ + if (!desc) + return; + +- dreplyprintk(ioc, printk(MYIOC_s_DEBUG_FMT +- "IOCStatus(0x%04X): %s\n", ioc->name, status, desc)); ++ dreplyprintk(ioc, printk(MYIOC_s_DEBUG_FMT "IOCStatus(0x%04X): %s\n", ++ ioc->name, status, desc)); + } + + /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ +@@ -8484,6 +8615,7 @@ + EXPORT_SYMBOL(mpt_suspend); + #endif + EXPORT_SYMBOL(ioc_list); ++EXPORT_SYMBOL(mpt_proc_root_dir); + EXPORT_SYMBOL(mpt_register); + EXPORT_SYMBOL(mpt_deregister); + EXPORT_SYMBOL(mpt_event_register); +@@ -8513,7 +8645,6 @@ + EXPORT_SYMBOL(mpt_set_taskmgmt_in_progress_flag); + EXPORT_SYMBOL(mpt_clear_taskmgmt_in_progress_flag); + EXPORT_SYMBOL(mpt_halt_firmware); +- + /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ + /** + * fusion_init - Fusion MPT base driver initialization routine. +@@ -8560,6 +8691,7 @@ + static void __exit + fusion_exit(void) + { ++ + mpt_reset_deregister(mpt_base_index); + + #ifdef CONFIG_PROC_FS +diff -r 60d73800068f drivers/message/fusion/mptbase.h +--- a/drivers/message/fusion/mptbase.h Tue Jun 30 11:26:39 2009 +0100 ++++ b/drivers/message/fusion/mptbase.h Wed Jul 01 09:46:25 2009 +0100 +@@ -72,13 +72,13 @@ + #define COPYRIGHT "Copyright (c) 1999-2008 " MODULEAUTHOR + #endif + +-#define MPT_LINUX_VERSION_COMMON "4.00.43.00suse" +-#define MPT_LINUX_PACKAGE_NAME "@(#)mptlinux-4.00.43.00suse" ++#define MPT_LINUX_VERSION_COMMON "4.19.00.03" ++#define MPT_LINUX_PACKAGE_NAME "@(#)mptlinux-4.19.00.03" + #define WHAT_MAGIC_STRING "@" "(" "#" ")" + #define MPT_LINUX_MAJOR_VERSION 4 +-#define MPT_LINUX_MINOR_VERSION 00 +-#define MPT_LINUX_BUILD_VERSION 43 +-#define MPT_LINUX_RELEASE_VERSION 00 ++#define MPT_LINUX_MINOR_VERSION 19 ++#define MPT_LINUX_BUILD_VERSION 00 ++#define MPT_LINUX_RELEASE_VERSION 03 + + #define show_mptmod_ver(s,ver) \ + printk(KERN_INFO "%s %s\n", s, ver); +@@ -106,6 +106,11 @@ + #endif + + #define MPT_NAME_LENGTH 32 ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,22)) ++#define MPT_KOBJ_NAME_LEN 20 ++#else ++#define MPT_KOBJ_NAME_LEN KOBJ_NAME_LEN ++#endif + + #define MPT_PROCFS_MPTBASEDIR "mpt" + /* chg it to "driver/fusion" ? */ +@@ -159,8 +164,9 @@ + /* + * Try to keep these at 2^N-1 + */ +-#define MPT_FC_CAN_QUEUE 127 ++#define MPT_FC_CAN_QUEUE 1024 + #define MPT_SCSI_CAN_QUEUE 127 ++#define MPT_SAS_CAN_QUEUE 127 + + /* + * Set the MAX_SGE value based on user input. +@@ -177,10 +183,10 @@ + #define MPT_SCSI_SG_DEPTH 40 + #endif + +-#ifdef CONFIG_FUSION_MAX_FC_SGE +-#if CONFIG_FUSION_MAX_FC_SGE < 16 ++#ifdef CONFIG_FUSION_MAX_FC_SGE ++#if CONFIG_FUSION_MAX_FC_SGE < 16 + #define MPT_SCSI_FC_SG_DEPTH 16 +-#elif CONFIG_FUSION_MAX_FC_SGE > 256 ++#elif CONFIG_FUSION_MAX_FC_SGE > 256 + #define MPT_SCSI_FC_SG_DEPTH 256 + #else + #define MPT_SCSI_FC_SG_DEPTH CONFIG_FUSION_MAX_FC_SGE +@@ -368,6 +374,31 @@ + * in conjunction with SYSIF_REGS accesses! + */ + ++/* ++ * End to End Data Protection Support ++ */ ++#define EEDP_SUPPORT ++#ifdef EEDP_SUPPORT ++ ++#define PRO_R MPI_SCSIIO32_EEDPFLAGS_CHKRM_OP ++#define PRO_W MPI_SCSIIO32_EEDPFLAGS_INSERT_OP ++#define PRO_V MPI_SCSIIO32_EEDPFLAGS_INSERT_OP ++ ++/* the read capacity 16 byte parameter block - defined in SBC-3 */ ++struct read_cap_parameter{ ++ u64 logical_block_addr; ++ u32 logical_block_length; ++ u8 prot_en:1; ++ u8 p_type:3; ++ u8 reserved0:4; ++ u8 logical_blocks_per_phyical_block:4; ++ u8 reserved1:4; ++ u16 lowest_aligned_log_block_address:14; ++ u16 reserved2:2; ++ u8 reserved3[16]; ++}; ++#endif ++ + + /* + * Dynamic Multi-Pathing specific stuff... +@@ -402,6 +433,11 @@ + VirtTarget *vtarget; + u8 configured_lun; + int lun; ++#ifdef EEDP_SUPPORT ++ u8 eedp_enable; ++ u8 eedp_type; ++ u32 eedp_block_length; ++#endif + } VirtDevice; + + /* +@@ -444,10 +480,10 @@ + #define MPT_MGMT_STATUS_RF_VALID 0x01 /* The Reply Frame is VALID */ + #define MPT_MGMT_STATUS_COMMAND_GOOD 0x02 /* Command Status GOOD */ + #define MPT_MGMT_STATUS_PENDING 0x04 /* command is pending */ +-#define MPT_MGMT_STATUS_DID_IOCRESET 0x08 /* IOC Reset occurred */ ++#define MPT_MGMT_STATUS_DID_IOCRESET 0x08 /* IOC Reset occurred on the current*/ + #define MPT_MGMT_STATUS_SENSE_VALID 0x10 /* valid sense info */ + #define MPT_MGMT_STATUS_TIMER_ACTIVE 0x20 /* obsolete */ +-#define MPT_MGMT_STATUS_FREE_MF 0x40 /* free the mf */ ++#define MPT_MGMT_STATUS_FREE_MF 0x40 /* free the mf from complete routine */ + + + #define INITIALIZE_MGMT_STATUS(status) \ +@@ -467,7 +503,7 @@ + u8 status; /* current command status */ + int completion_code; + u32 msg_context; +-} MPT_MGMT; ++}MPT_MGMT; + + /* + * Event Structure and define +@@ -540,7 +576,7 @@ + IOCPage2_t *pIocPg2; /* table of Raid Volumes */ + IOCPage3_t *pIocPg3; /* table of physical disks */ + IOCPage6_t *pIocPg6; /* table of IR static data */ +- struct mutex inactive_list_mutex; ++ struct semaphore inactive_list_mutex; + struct list_head inactive_list; /* link list for physical + disk that belong in + inactive volumes */ +@@ -570,9 +606,8 @@ + u8 flags; + }; + +-typedef void (*MPT_ADD_SGE)(char *pAddr, u32 flagslength, dma_addr_t dma_addr); +-typedef void (*MPT_ADD_CHAIN) +- (char *pAddr, u8 next, u16 length, dma_addr_t dma_addr); ++typedef void (*MPT_ADD_SGE)(void *pAddr, u32 flagslength, dma_addr_t dma_addr); ++typedef void (*MPT_ADD_CHAIN)(void *pAddr, u8 next, u16 length, dma_addr_t dma_addr); + + /* + * Adapter Structure - pci_dev specific. Maximum: MPT_MAX_ADAPTERS +@@ -584,8 +619,7 @@ + char name[MPT_NAME_LENGTH]; /* "iocN" */ + char prod_name[MPT_NAME_LENGTH]; /* "LSIFC9x9" */ + #ifdef CONFIG_FUSION_LOGGING +- /* used in mpt_display_event_info */ +- char evStr[EVENT_DESCR_STR_SZ]; ++ char evStr[EVENT_DESCR_STR_SZ]; /* used in mpt_display_event_info */ + #endif + char board_name[16]; + char board_assembly[16]; +@@ -599,8 +633,7 @@ + SYSIF_REGS __iomem *pio_chip; /* Programmed IO (downloadboot) */ + u8 bus_type; + unsigned long mem_phys; /* == f4020000 (mmap) */ +- /* Programmed IO (downloadboot) */ +- unsigned long pio_mem_phys; ++ unsigned long pio_mem_phys; /* Programmed IO (downloadboot) */ + int mem_size; /* mmap memory size */ + int number_of_buses; + int devices_per_bus; +@@ -615,10 +648,8 @@ + int reply_depth; /* Num Allocated reply frames */ + int reply_sz; /* Reply frame size */ + int num_chain; /* Number of chain buffers */ +- /* Pointer to add_sge function */ +- MPT_ADD_SGE add_sge; +- /* Pointer to add_chain function */ +- MPT_ADD_CHAIN add_chain; ++ MPT_ADD_SGE add_sge; /* Pointer to add_sge function */ ++ MPT_ADD_CHAIN add_chain; /* Pointer to add_chain function */ + /* Pool of buffers for chaining. ReqToChain + * and ChainToChain track index of chain buffers. + * ChainBuffer (DMA) virt/phys addresses. +@@ -651,8 +682,9 @@ + dma_addr_t HostPageBuffer_dma; + int mtrr_reg; + struct pci_dev *pcidev; /* struct pci_dev pointer */ +- /* bitmask of BAR's that must be configured */ +- int bars; ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21)) ++ int bars; /* bitmask of BAR's that must be configured */ ++#endif + int msi_enable; + u8 __iomem *memmap; /* mmap address */ + struct Scsi_Host *sh; /* Scsi Host pointer */ +@@ -686,8 +718,7 @@ + #if defined(CPQ_CIM) + u32 csmi_change_count; /* count to track all IR + events for CSMI */ +- /* ioc page 1 - pci slot number */ +- u8 pci_slot_number; ++ u8 pci_slot_number; /* ioc page 1 - pci slot number */ + #endif + + u8 ir_firmware; /* =1 if IR firmware detected */ +@@ -716,14 +747,13 @@ + struct list_head fw_event_list; + spinlock_t fw_event_lock; + u8 fw_events_off; /* if '1', then ignore events */ +- char fw_event_q_name[20]; ++ char fw_event_q_name[MPT_KOBJ_NAME_LEN]; + +- /* port_info object for the host */ +- struct mptsas_portinfo *hba_port_info; ++ struct mptsas_portinfo *hba_port_info; /* port_info object for the host */ + u64 hba_port_sas_addr; + u16 hba_port_num_phy; + struct list_head sas_device_info_list; +- struct mutex sas_device_info_mutex; ++ struct semaphore sas_device_info_mutex; + u8 old_sas_discovery_protocal; + u8 sas_discovery_quiesce_io; + int sas_index; /* index refrencing */ +@@ -740,24 +770,24 @@ + u8 num_ports; + #endif + +- char reset_work_q_name[20]; ++ char reset_work_q_name[MPT_KOBJ_NAME_LEN]; + struct workqueue_struct *reset_work_q; ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,19)) + struct delayed_work fault_reset_work; +- spinlock_t fault_reset_work_lock; ++#else ++ struct work_struct fault_reset_work; ++#endif + struct work_struct fc_setup_reset_work; + struct list_head fc_rports; + struct work_struct fc_lsc_work; + u8 fc_link_speed[2]; + spinlock_t fc_rescan_work_lock; + struct work_struct fc_rescan_work; +- char fc_rescan_work_q_name[20]; ++ char fc_rescan_work_q_name[MPT_KOBJ_NAME_LEN]; + struct workqueue_struct *fc_rescan_work_q; +- /* driver forced bus resets count */ +- unsigned long hard_resets; +- /* fw/external bus resets count */ +- unsigned long soft_resets; +- /* cmd timeouts */ +- unsigned long timeouts; ++ unsigned long hard_resets; /* driver forced bus resets count */ ++ unsigned long soft_resets; /* fw/external bus resets count */ ++ unsigned long timeouts; /* cmd timeouts */ + struct scsi_cmnd **ScsiLookup; + spinlock_t scsi_lookup_lock; + int sdev_queue_depth; /* sdev queue depth */ +@@ -776,6 +806,11 @@ + #endif + u8 sg_addr_size; + u8 SGE_size; ++ u8 in_rescan; ++ /* diag buffer bits for sysfs */ ++ u8 is_fault; ++ u32 ring_buffer_offset; ++ u32 ring_buffer_sz; + } MPT_ADAPTER; + + /* +@@ -919,14 +954,10 @@ + extern int mpt_alloc_fw_memory(MPT_ADAPTER *ioc, int size); + extern void mpt_free_fw_memory(MPT_ADAPTER *ioc); + extern int mpt_findImVolumes(MPT_ADAPTER *ioc); +-extern int mptbase_sas_persist_operation(MPT_ADAPTER *ioc, +- u8 persist_opcode); +-extern int mpt_raid_phys_disk_pg0(MPT_ADAPTER *ioc, u8 phys_disk_num, +- pRaidPhysDiskPage0_t phys_disk); +-extern int mpt_raid_phys_disk_pg1(MPT_ADAPTER *ioc, u8 phys_disk_num, +- pRaidPhysDiskPage1_t phys_disk); +-extern int mpt_raid_phys_disk_get_num_paths(MPT_ADAPTER *ioc, +- u8 phys_disk_num); ++extern int mptbase_sas_persist_operation(MPT_ADAPTER *ioc, u8 persist_opcode); ++extern int mpt_raid_phys_disk_pg0(MPT_ADAPTER *ioc, u8 phys_disk_num, pRaidPhysDiskPage0_t phys_disk); ++extern int mpt_raid_phys_disk_pg1(MPT_ADAPTER *ioc, u8 phys_disk_num, pRaidPhysDiskPage1_t phys_disk); ++extern int mpt_raid_phys_disk_get_num_paths(MPT_ADAPTER *ioc, u8 phys_disk_num); + + extern int mpt_set_taskmgmt_in_progress_flag(MPT_ADAPTER *ioc); + extern void mpt_clear_taskmgmt_in_progress_flag(MPT_ADAPTER *ioc); +@@ -936,6 +967,7 @@ + * Public data decl's... + */ + extern struct list_head ioc_list; ++extern struct proc_dir_entry *mpt_proc_root_dir; + extern int mpt_debug_level; + extern int mpt_fwfault_debug; + +diff -r 60d73800068f drivers/message/fusion/mptctl.c +--- a/drivers/message/fusion/mptctl.c Tue Jun 30 11:26:39 2009 +0100 ++++ b/drivers/message/fusion/mptctl.c Wed Jul 01 09:46:25 2009 +0100 +@@ -75,7 +75,7 @@ + #if defined(CPQ_CIM) + #include "mptsas.h" + #include "csmi/csmisas.h" +-#endif ++#endif // CPQ_CIM + + #if defined(DIAG_BUFFER_SUPPORT) + #include "rejected_ioctls/diag_buffer.h" +@@ -148,7 +148,7 @@ + static int csmisas_phy_control(unsigned long arg); + static int csmisas_get_connector_info(unsigned long arg); + static int csmisas_get_location(unsigned long arg); +-#endif ++#endif // CPQ_CIM + + #if defined(DIAG_BUFFER_SUPPORT) + /* diag_buffer proto's */ +@@ -157,7 +157,7 @@ + static int mptctl_unregister_diag_buffer(unsigned long arg); + static int mptctl_query_diag_buffer(unsigned long arg); + static int mptctl_read_diag_buffer(unsigned long arg); +-#endif ++#endif // DIAG_BUFFER_SUPPORT + + static int mptctl_probe(struct pci_dev *, const struct pci_device_id *); + static void mptctl_remove(struct pci_dev *); +@@ -279,8 +279,7 @@ + le32_to_cpu(reply->u.reply.IOCLogInfo))); + + if ((req->u.hdr.Function == MPI_FUNCTION_SCSI_IO_REQUEST) || +- (req->u.hdr.Function +- == MPI_FUNCTION_RAID_SCSI_IO_PASSTHROUGH)) { ++ (req->u.hdr.Function == MPI_FUNCTION_RAID_SCSI_IO_PASSTHROUGH)) { + + if (reply->u.sreply.SCSIStatus || reply->u.sreply.SCSIState) + dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT +@@ -291,8 +290,7 @@ + le16_to_cpu(reply->u.sreply.TaskTag), + le32_to_cpu(reply->u.sreply.TransferCount))); + +- if (reply->u.sreply.SCSIState +- & MPI_SCSI_STATE_AUTOSENSE_VALID) { ++ if (reply->u.sreply.SCSIState & MPI_SCSI_STATE_AUTOSENSE_VALID) { + sz = req->u.scsireq.SenseBufferLength; + req_index = + le16_to_cpu(req->u.frame.hwhdr.msgctxu.fld.req_idx); +@@ -326,8 +324,7 @@ + if (!mf) + return 0; + +- dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT +- "TaskMgmt completed (mf=%p, mr=%p)\n", ++ dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "TaskMgmt completed (mf=%p, mr=%p)\n", + ioc->name, mf, mr)); + + ioc->taskmgmt_cmds.status |= MPT_MGMT_STATUS_COMMAND_GOOD; +@@ -366,10 +363,10 @@ + u16 iocstatus; + + /* bus reset is only good for SCSI IO, RAID PASSTHRU */ +- if (!(function == MPI_FUNCTION_RAID_SCSI_IO_PASSTHROUGH) || +- (function == MPI_FUNCTION_SCSI_IO_REQUEST)) { +- dtmprintk(ioc, printk(MYIOC_s_WARN_FMT +- "TaskMgmt, not SCSI_IO!!\n", ioc->name)); ++ if (!(function == MPI_FUNCTION_RAID_SCSI_IO_PASSTHROUGH || ++ function == MPI_FUNCTION_SCSI_IO_REQUEST)) { ++ dtmprintk(ioc, printk(MYIOC_s_WARN_FMT "TaskMgmt, not SCSI_IO!!\n", ++ ioc->name)); + return -EPERM; + } + +@@ -384,8 +381,8 @@ + /* Send request + */ + if ((mf = mpt_get_msg_frame(mptctl_taskmgmt_id, ioc)) == NULL) { +- dtmprintk(ioc, printk(MYIOC_s_WARN_FMT +- "TaskMgmt, no msg frames!!\n", ioc->name)); ++ dtmprintk(ioc, printk(MYIOC_s_WARN_FMT "TaskMgmt, no msg frames!!\n", ++ ioc->name)); + mpt_clear_taskmgmt_in_progress_flag(ioc); + retval = -ENOMEM; + goto mptctl_bus_reset_done; +@@ -411,34 +408,31 @@ + pScsiTm->Reserved2[ii] = 0; + + switch (ioc->bus_type) { +- case FC: +- timeout = 40; +- break; +- case SAS: +- timeout = 30; +- break; +- case SPI: +- default: +- timeout = 10; +- break; ++ case FC: ++ timeout = 40; ++ break; ++ case SAS: ++ timeout = 30; ++ break; ++ case SPI: ++ default: ++ timeout = 2; ++ break; + } + +- dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT +- "TaskMgmt type=%d timeout=%ld\n", ioc->name, +- MPI_SCSITASKMGMT_TASKTYPE_RESET_BUS, timeout)); ++ dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "TaskMgmt type=%d timeout=%ld\n", ++ ioc->name, MPI_SCSITASKMGMT_TASKTYPE_RESET_BUS, timeout)); + + INITIALIZE_MGMT_STATUS(ioc->taskmgmt_cmds.status) +- CLEAR_MGMT_STATUS(ioc->taskmgmt_cmds.status) + time_count = jiffies; + if ((ioc->facts.IOCCapabilities & MPI_IOCFACTS_CAPABILITY_HIGH_PRI_Q) && + (ioc->facts.MsgVersion >= MPI_VERSION_01_05)) + mpt_put_msg_frame_hi_pri(mptctl_taskmgmt_id, ioc, mf); + else { + retval = mpt_send_handshake_request(mptctl_taskmgmt_id, ioc, +- sizeof(SCSITaskMgmt_t), (u32 *)pScsiTm, CAN_SLEEP); ++ sizeof(SCSITaskMgmt_t), (u32*)pScsiTm, CAN_SLEEP); + if (retval != 0) { +- dfailprintk(ioc, printk(MYIOC_s_ERR_FMT +- "TaskMgmt send_handshake FAILED!" ++ dfailprintk(ioc, printk(MYIOC_s_ERR_FMT "TaskMgmt send_handshake FAILED!" + " (ioc %p, mf %p, rc=%d) \n", ioc->name, + ioc, mf, retval)); + mpt_clear_taskmgmt_in_progress_flag(ioc); +@@ -503,10 +497,11 @@ + unsigned long flags; + + dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT ": %s\n", +- ioc->name, __func__)); ++ ioc->name, __FUNCTION__)); + +- if (mpt_fwfault_debug) ++ if(mpt_fwfault_debug) + mpt_halt_firmware(ioc); ++ + spin_lock_irqsave(&ioc->taskmgmt_lock, flags); + if (ioc->ioc_reset_in_progress) { + spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags); +@@ -517,6 +512,7 @@ + spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags); + + ++ CLEAR_MGMT_PENDING_STATUS(ioc->ioctl_cmds.status) + if (!mptctl_bus_reset(ioc, mf->u.hdr.Function)) + return; + +@@ -525,7 +521,6 @@ + */ + dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Calling HardReset! \n", + ioc->name)); +- CLEAR_MGMT_PENDING_STATUS(ioc->ioctl_cmds.status) + if (mpt_SoftResetHandler(ioc, CAN_SLEEP) != 0) + mpt_HardResetHandler(ioc, CAN_SLEEP); + mpt_free_msg_frame(ioc, mf); +@@ -580,6 +575,8 @@ + return 1; + + /* Raise SIGIO for persistent events. ++ * TODO - this define is not in MPI spec yet, ++ * but they plan to set it to 0x21 + */ + if (event == 0x21 ) { + ioc->aen_event_read_flag=1; +@@ -662,9 +659,8 @@ + if (((iocnum = mpt_verify_adapter(iocnumX, &iocp)) < 0) || + (iocp == NULL)) { + if (mpt_debug_level & MPT_DEBUG_IOCTL) +- printk(KERN_DEBUG MYNAM +- "%s::%s @%d - ioc%d not found!\n", +- __FILE__, __func__, __LINE__, iocnumX); ++ printk(KERN_DEBUG MYNAM "%s::mptctl_ioctl() @%d - ioc%d not found!\n", ++ __FILE__, __LINE__, iocnumX); + return -ENODEV; + } + +@@ -703,9 +699,9 @@ + return csmisas_get_cntlr_status(arg); + } else if (cmd == CC_CSMI_SAS_GET_SCSI_ADDRESS) { + return csmisas_get_scsi_address(arg); +- } else if (cmd == CC_CSMI_SAS_GET_DEVICE_ADDRESS) { ++ } else if (cmd == CC_CSMI_SAS_GET_DEVICE_ADDRESS){ + return csmisas_get_device_address(arg); +-#endif ++#endif // CPQ_CIM + } + + /* All of these commands require an interrupt or +@@ -713,6 +709,8 @@ + */ + if ((ret = mptctl_syscall_down(iocp, nonblock)) != 0) + return ret; ++ ++// dctlprintk(iocp, printk(MYIOC_s_DEBUG_FMT ": mptctl_ioctl()\n", iocp->name)); + + if (cmd == MPTFWDOWNLOAD) + ret = mptctl_fw_download(arg); +@@ -764,7 +762,7 @@ + ret = csmisas_get_connector_info(arg); + else if (cmd == CC_CSMI_SAS_GET_LOCATION) + ret = csmisas_get_location(arg); +-#endif ++#endif // CPQ_CIM + + #if defined(DIAG_BUFFER_SUPPORT) + /* diag_buffer requiring fw calls*/ +@@ -774,7 +772,7 @@ + ret = mptctl_release_diag_buffer(arg); + else if (cmd == MPTDIAGREADBUFFER) + ret = mptctl_read_diag_buffer(arg); +-#endif ++#endif // DIAG_BUFFER_SUPPORT + else + ret = -EINVAL; + +@@ -808,9 +806,8 @@ + + if (mpt_verify_adapter(krinfo.hdr.iocnum, &iocp) < 0) { + if (mpt_debug_level & MPT_DEBUG_IOCTL) +- printk(KERN_DEBUG MYNAM +- "%s@%d::%s - ioc%d not found!\n", +- __FILE__, __LINE__, __func__, krinfo.hdr.iocnum); ++ printk(KERN_DEBUG MYNAM "%s@%d::mptctl_do_reset - ioc%d not found!\n", ++ __FILE__, __LINE__, krinfo.hdr.iocnum); + return -ENODEV; /* (-6) No such device or address */ + } + +@@ -900,8 +897,7 @@ + + if (mpt_verify_adapter(ioc, &iocp) < 0) { + if (mpt_debug_level & MPT_DEBUG_IOCTL) +- printk(KERN_DEBUG MYNAM +- "ioctl_fwdl - ioc%d not found!\n", ioc); ++ printk(KERN_DEBUG MYNAM "ioctl_fwdl - ioc%d not found!\n", ioc); + return -ENODEV; /* (-6) No such device or address */ + } else { + +@@ -985,7 +981,7 @@ + / iocp->SGE_size; + if (numfrags > maxfrags) { + ret = -EMLINK; +- goto fwdl_out; ++ goto fwdl_out; + } + + dctlprintk(iocp, printk(MYIOC_s_DEBUG_FMT "DbG: sgl buffer = %p, sgfrags = %d\n", +@@ -1036,21 +1032,24 @@ + mpt_put_msg_frame(mptctl_id, iocp, mf); + + /* Now wait for the command to complete */ ++retry_wait: + timeleft = wait_for_completion_timeout(&iocp->ioctl_cmds.done, HZ*60); + if (!(iocp->ioctl_cmds.status & MPT_MGMT_STATUS_COMMAND_GOOD)) { + ret = -ETIME; +- printk(MYIOC_s_WARN_FMT "%s: failed\n", iocp->name, __func__); ++ printk(MYIOC_s_WARN_FMT "%s: failed\n", iocp->name, __FUNCTION__); + if (iocp->ioctl_cmds.status & MPT_MGMT_STATUS_DID_IOCRESET) { + mpt_free_msg_frame(iocp, mf); + goto fwdl_out; + } + if (!timeleft) + mptctl_timeout_expired(iocp, mf); ++ else ++ goto retry_wait; + goto fwdl_out; + } + + if (!(iocp->ioctl_cmds.status & MPT_MGMT_STATUS_RF_VALID)) { +- printk(MYIOC_s_WARN_FMT "%s: failed\n", iocp->name, __func__); ++ printk(MYIOC_s_WARN_FMT "%s: failed\n", iocp->name, __FUNCTION__); + mpt_free_msg_frame(iocp, mf); + ret = -ENODATA; + goto fwdl_out; +@@ -1062,12 +1061,10 @@ + ReplyMsg = (pFWDownloadReply_t)iocp->ioctl_cmds.reply; + iocstat = le16_to_cpu(ReplyMsg->IOCStatus) & MPI_IOCSTATUS_MASK; + if (iocstat == MPI_IOCSTATUS_SUCCESS) { +- printk(MYIOC_s_INFO_FMT +- ": F/W update successfully sent!\n", iocp->name); ++ printk(MYIOC_s_INFO_FMT ": F/W update successfully sent!\n", iocp->name); + return 0; + } else if (iocstat == MPI_IOCSTATUS_INVALID_FUNCTION) { +- printk(MYIOC_s_WARN_FMT +- "Hmmm... doesn't support F/W download?\n", ++ printk(MYIOC_s_WARN_FMT "Hmmm... doesn't support F/W download?\n", + iocp->name); + printk(MYIOC_s_WARN_FMT "(time to go bang on somebodies door)\n", + iocp->name); +@@ -1182,8 +1179,7 @@ + bytes_allocd += this_alloc; + sgl->FlagsLength = (0x10000000|sgdir|this_alloc); + if (ioc->sg_addr_size == sizeof(u64)) +- sgl->FlagsLength +- |= MPT_SGE_FLAGS_64_BIT_ADDRESSING; ++ sgl->FlagsLength |= MPT_SGE_FLAGS_64_BIT_ADDRESSING; + dma_addr = pci_map_single(ioc->pcidev, buflist[buflist_ent].kptr, this_alloc, dir); + sgl->Address = dma_addr; + +@@ -1368,9 +1364,8 @@ + if (((iocnum = mpt_verify_adapter(karg->hdr.iocnum, &ioc)) < 0) || + (ioc == NULL)) { + if (mpt_debug_level & MPT_DEBUG_IOCTL) +- printk(KERN_DEBUG MYNAM +- "%s::%s @%d - ioc%d not found!\n", +- __FILE__, __func__, __LINE__, iocnum); ++ printk(KERN_DEBUG MYNAM "%s::mptctl_getiocinfo() @%d - ioc%d not found!\n", ++ __FILE__, __LINE__, iocnum); + kfree(karg); + return -ENODEV; + } +@@ -1505,9 +1500,8 @@ + if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) || + (ioc == NULL)) { + if (mpt_debug_level & MPT_DEBUG_IOCTL) +- printk(KERN_DEBUG MYNAM +- "%s::%s @%d - ioc%d not found!\n", +- __FILE__, __func__, __LINE__, iocnum); ++ printk(KERN_DEBUG MYNAM "%s::mptctl_gettargetinfo() @%d - ioc%d not found!\n", ++ __FILE__, __LINE__, iocnum); + return -ENODEV; + } + +@@ -1522,8 +1516,7 @@ + port = karg.hdr.port; + + if (maxWordsLeft <= 0) { +- printk(MYIOC_s_ERR_FMT +- "%s::mptctl_gettargetinfo() @%d - no memory available!\n", ++ printk(MYIOC_s_ERR_FMT "%s::mptctl_gettargetinfo() @%d - no memory available!\n", + ioc->name, __FILE__, __LINE__); + return -ENOMEM; + } +@@ -1544,8 +1537,7 @@ + */ + pmem = kzalloc(numBytes, GFP_KERNEL); + if (!pmem) { +- printk(MYIOC_s_ERR_FMT +- "%s::mptctl_gettargetinfo() @%d - no memory available!\n", ++ printk(MYIOC_s_ERR_FMT "%s::mptctl_gettargetinfo() @%d - no memory available!\n", + ioc->name, __FILE__, __LINE__); + return -ENOMEM; + } +@@ -1625,9 +1617,8 @@ + if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) || + (ioc == NULL)) { + if (mpt_debug_level & MPT_DEBUG_IOCTL) +- printk(KERN_DEBUG MYNAM +- "%s::%s @%d - ioc%d not found!\n", +- __FILE__, __func__, __LINE__, iocnum); ++ printk(KERN_DEBUG MYNAM "%s::mptctl_readtest() @%d - ioc%d not found!\n", ++ __FILE__, __LINE__, iocnum); + return -ENODEV; + } + +@@ -1688,9 +1679,8 @@ + if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) || + (ioc == NULL)) { + if (mpt_debug_level & MPT_DEBUG_IOCTL) +- printk(KERN_DEBUG MYNAM +- "%s::%s @%d - ioc%d not found!\n", +- __FILE__, __func__, __LINE__, iocnum); ++ printk(KERN_DEBUG MYNAM "%s::mptctl_eventquery() @%d - ioc%d not found!\n", ++ __FILE__, __LINE__, iocnum); + return -ENODEV; + } + +@@ -1729,9 +1719,8 @@ + if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) || + (ioc == NULL)) { + if (mpt_debug_level & MPT_DEBUG_IOCTL) +- printk(KERN_DEBUG MYNAM +- "%s::%s @%d - ioc%d not found!\n", +- __FILE__, __func__, __LINE__, iocnum); ++ printk(KERN_DEBUG MYNAM "%s::mptctl_eventenable() @%d - ioc%d not found!\n", ++ __FILE__, __LINE__, iocnum); + return -ENODEV; + } + +@@ -1743,8 +1732,7 @@ + int sz = MPTCTL_EVENT_LOG_SIZE * sizeof(MPT_IOCTL_EVENTS); + ioc->events = kzalloc(sz, GFP_KERNEL); + if (!ioc->events) { +- printk(MYIOC_s_ERR_FMT +- "Insufficient memory to add adapter!\n", ++ printk(MYIOC_s_ERR_FMT "Insufficient memory to add adapter!\n", + ioc->name); + return -ENOMEM; + } +@@ -1780,9 +1768,8 @@ + if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) || + (ioc == NULL)) { + if (mpt_debug_level & MPT_DEBUG_IOCTL) +- printk(KERN_DEBUG MYNAM +- "%s::%s @%d - ioc%d not found!\n", +- __FILE__, __func__, __LINE__, iocnum); ++ printk(KERN_DEBUG MYNAM "%s::mptctl_eventreport() @%d - ioc%d not found!\n", ++ __FILE__, __LINE__, iocnum); + return -ENODEV; + } + +@@ -1836,9 +1823,8 @@ + if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) || + (ioc == NULL)) { + if (mpt_debug_level & MPT_DEBUG_IOCTL) +- printk(KERN_DEBUG MYNAM +- "%s::%s @%d - ioc%d not found!\n", +- __FILE__, __func__, __LINE__, iocnum); ++ printk(KERN_DEBUG MYNAM "%s::mptctl_replace_fw() @%d - ioc%d not found!\n", ++ __FILE__, __LINE__, iocnum); + return -ENODEV; + } + +@@ -1886,8 +1872,7 @@ + * + * Outputs: None. + * Return: 0 if successful +- * -EBUSY if previous command timout and IOC reset is +- * not complete. ++ * -EBUSY if previous command timout and IOC reset is not complete. + * -EFAULT if data unavailable + * -ENODEV if no such device/adapter + * -ETIME if timer expires +@@ -1913,9 +1898,8 @@ + if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) || + (ioc == NULL)) { + if (mpt_debug_level & MPT_DEBUG_IOCTL) +- printk(KERN_DEBUG MYNAM +- "%s::%s @%d - ioc%d not found!\n", +- __FILE__, __func__, __LINE__, iocnum); ++ printk(KERN_DEBUG MYNAM "%s::mptctl_mpt_command() @%d - ioc%d not found!\n", ++ __FILE__, __LINE__, iocnum); + return -ENODEV; + } + +@@ -1929,8 +1913,7 @@ + * + * Outputs: None. + * Return: 0 if successful +- * -EBUSY if previous command timout and IOC reset is +- * not complete. ++ * -EBUSY if previous command timout and IOC reset is not complete. + * -EFAULT if data unavailable + * -ENODEV if no such device/adapter + * -ETIME if timer expires +@@ -1967,9 +1950,8 @@ + if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) || + (ioc == NULL)) { + if (mpt_debug_level & MPT_DEBUG_IOCTL) +- printk(KERN_DEBUG MYNAM +- "%s::%s @%d - ioc%d not found!\n", +- __FILE__, __func__, __LINE__, iocnum); ++ printk(KERN_DEBUG MYNAM "%s::mptctl_do_mpt_command() @%d - ioc%d not found!\n", ++ __FILE__, __LINE__, iocnum); + return -ENODEV; + } + +@@ -2214,12 +2196,10 @@ + { + SCSITaskMgmt_t *pScsiTm; + pScsiTm = (SCSITaskMgmt_t *)mf; +- dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT +- "\tTaskType=0x%x MsgFlags=0x%x " +- "TaskMsgContext=0x%x id=%d channel=%d\n", +- ioc->name, pScsiTm->TaskType, +- le32_to_cpu(pScsiTm->TaskMsgContext), +- pScsiTm->MsgFlags, pScsiTm->TargetID, pScsiTm->Bus)); ++ dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "\tTaskType=0x%x MsgFlags=0x%x " ++ "TaskMsgContext=0x%x id=%d channel=%d\n", ioc->name, pScsiTm->TaskType, ++ le32_to_cpu(pScsiTm->TaskMsgContext), pScsiTm->MsgFlags, ++ pScsiTm->TargetID, pScsiTm->Bus)); + break; + } + +@@ -2308,9 +2288,9 @@ + /* Set up the dataOut memory allocation */ + if (karg.dataOutSize > 0) { + if (karg.dataInSize > 0) { +- flagsLength = (MPI_SGE_FLAGS_SIMPLE_ELEMENT | ++ flagsLength = ( MPI_SGE_FLAGS_SIMPLE_ELEMENT | + MPI_SGE_FLAGS_END_OF_BUFFER | +- MPI_SGE_FLAGS_DIRECTION) ++ MPI_SGE_FLAGS_DIRECTION ) + << MPI_SGE_FLAGS_SHIFT; + } else { + flagsLength = MPT_SGE_FLAGS_SSIMPLE_WRITE; +@@ -2387,7 +2367,7 @@ + mpt_put_msg_frame_hi_pri(mptctl_id, ioc, mf); + else { + rc = mpt_send_handshake_request(mptctl_id, ioc, +- sizeof(SCSITaskMgmt_t), (u32 *)mf, CAN_SLEEP); ++ sizeof(SCSITaskMgmt_t), (u32*)mf, CAN_SLEEP); + if (rc != 0) { + dfailprintk(ioc, printk(MYIOC_s_ERR_FMT + "send_handshake FAILED! (ioc %p, mf %p)\n", +@@ -2403,20 +2383,25 @@ + + /* Now wait for the command to complete */ + timeout = (karg.timeout > 0) ? karg.timeout : MPT_IOCTL_DEFAULT_TIMEOUT; +- timeleft = +- wait_for_completion_timeout(&ioc->ioctl_cmds.done, HZ*timeout); ++retry_wait: ++ timeleft = wait_for_completion_timeout(&ioc->ioctl_cmds.done, HZ*timeout); + if (!(ioc->ioctl_cmds.status & MPT_MGMT_STATUS_COMMAND_GOOD)) { + rc = -ETIME; + dfailprintk(ioc, printk(MYIOC_s_ERR_FMT "%s: TIMED OUT!\n", +- ioc->name, __func__)); +- if (function == MPI_FUNCTION_SCSI_TASK_MGMT) +- mutex_unlock(&ioc->taskmgmt_cmds.mutex); +- if (ioc->ioctl_cmds.status & MPT_MGMT_STATUS_DID_IOCRESET) ++ ioc->name, __FUNCTION__)); ++ if (ioc->ioctl_cmds.status & MPT_MGMT_STATUS_DID_IOCRESET) { ++ if (function == MPI_FUNCTION_SCSI_TASK_MGMT) ++ mutex_unlock(&ioc->taskmgmt_cmds.mutex); + goto done_free_mem; ++ } + if (!timeleft) { ++ if (function == MPI_FUNCTION_SCSI_TASK_MGMT) ++ mutex_unlock(&ioc->taskmgmt_cmds.mutex); + mptctl_timeout_expired(ioc, mf); + mf = NULL; + } ++ else ++ goto retry_wait; + goto done_free_mem; + } + +@@ -2430,8 +2415,7 @@ + */ + if (ioc->ioctl_cmds.status & MPT_MGMT_STATUS_RF_VALID) { + if (karg.maxReplyBytes < ioc->reply_sz) { +- sz = min(karg.maxReplyBytes, +- 4*ioc->ioctl_cmds.reply[2]); ++ sz = min(karg.maxReplyBytes, 4*ioc->ioctl_cmds.reply[2]); + } else { + sz = min(ioc->reply_sz, 4*ioc->ioctl_cmds.reply[2]); + } +@@ -2453,8 +2437,7 @@ + if (ioc->ioctl_cmds.status & MPT_MGMT_STATUS_SENSE_VALID) { + sz = min(karg.maxSenseBytes, MPT_SENSE_BUFFER_SIZE); + if (sz > 0) { +- if (copy_to_user(karg.senseDataPtr, +- ioc->ioctl_cmds.sense, sz)) { ++ if (copy_to_user(karg.senseDataPtr, ioc->ioctl_cmds.sense, sz)) { + printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_do_mpt_command - " + "Unable to write sense data to user %p\n", + ioc->name, __FILE__, __LINE__, +@@ -2512,8 +2495,7 @@ + * Outputs: None. + * Return: 0 if successful + * -EFAULT if data unavailable +- * -EBUSY if previous command timout and IOC reset is +- * not complete. ++ * -EBUSY if previous command timout and IOC reset is not complete. + * -ENODEV if no such device/adapter + * -ETIME if timer expires + * -ENOMEM if memory allocation error +@@ -2524,7 +2506,7 @@ + hp_host_info_t __user *uarg = (void __user *) arg; + MPT_ADAPTER *ioc; + struct pci_dev *pdev; +- char *pbuf = NULL; ++ char *pbuf=NULL; + dma_addr_t buf_dma; + hp_host_info_t karg; + int iocnum; +@@ -2555,9 +2537,8 @@ + if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) || + (ioc == NULL)) { + if (mpt_debug_level & MPT_DEBUG_IOCTL) +- printk(KERN_DEBUG MYNAM +- "%s::%s @%d - ioc%d not found!\n", +- __FILE__, __func__, __LINE__, iocnum); ++ printk(KERN_DEBUG MYNAM "%s::mptctl_hp_hostinfo() @%d - ioc%d not found!\n", ++ __FILE__, __LINE__, iocnum); + return -ENODEV; + } + +@@ -2645,7 +2626,7 @@ + */ + if ((mf = mpt_get_msg_frame(mptctl_id, ioc)) == NULL) { + dfailprintk(ioc, printk(MYIOC_s_WARN_FMT "%s, no msg frames!!\n", +- ioc->name,__func__)); ++ ioc->name,__FUNCTION__)); + retval = -ENOMEM; + goto out; + } +@@ -2670,29 +2651,29 @@ + retval = -ENOMEM; + goto out; + } +- ioc->add_sge((char *)&IstwiRWRequest->SGL, +- (MPT_SGE_FLAGS_SSIMPLE_READ|4), buf_dma); ++ ioc->add_sge((char *)&IstwiRWRequest->SGL, (MPT_SGE_FLAGS_SSIMPLE_READ|4),buf_dma); + + retval = 0; +- SET_MGMT_MSG_CONTEXT(ioc->ioctl_cmds.msg_context, +- IstwiRWRequest->MsgContext); ++ SET_MGMT_MSG_CONTEXT(ioc->ioctl_cmds.msg_context, IstwiRWRequest->MsgContext); + INITIALIZE_MGMT_STATUS(ioc->ioctl_cmds.status) + mpt_put_msg_frame(mptctl_id, ioc, mf); +- timeleft = wait_for_completion_timeout(&ioc->ioctl_cmds.done, +- HZ*MPT_IOCTL_DEFAULT_TIMEOUT); ++retry_wait: ++ timeleft = wait_for_completion_timeout(&ioc->ioctl_cmds.done, HZ*MPT_IOCTL_DEFAULT_TIMEOUT); + if (!(ioc->ioctl_cmds.status & MPT_MGMT_STATUS_COMMAND_GOOD)) { + retval = -ETIME; +- printk(MYIOC_s_WARN_FMT "%s: failed\n", ioc->name, __func__); ++ printk(MYIOC_s_WARN_FMT "%s: failed\n", ioc->name, __FUNCTION__); + if (ioc->ioctl_cmds.status & MPT_MGMT_STATUS_DID_IOCRESET) { + mpt_free_msg_frame(ioc, mf); + goto out; + } + if (!timeleft) + mptctl_timeout_expired(ioc, mf); ++ else ++ goto retry_wait; + goto out; + } + +- /* ++ /* + *ISTWI Data Definition + * pbuf[0] = FW_VERSION = 0x4 + * pbuf[1] = Bay Count = 6 or 4 or 2, depending on +@@ -2730,8 +2711,7 @@ + * Outputs: None. + * Return: 0 if successful + * -EFAULT if data unavailable +- * -EBUSY if previous command timout and IOC reset is +- * not complete. ++ * -EBUSY if previous command timout and IOC reset is not complete. + * -ENODEV if no such device/adapter + * -ETIME if timer expires + * -ENOMEM if memory allocation error +@@ -2762,14 +2742,12 @@ + if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) || + (ioc == NULL)) { + if (mpt_debug_level & MPT_DEBUG_IOCTL) +- printk(KERN_DEBUG MYNAM +- "%s::%s @%d - ioc%d not found!\n", +- __FILE__, __func__, __LINE__, iocnum); ++ printk(KERN_DEBUG MYNAM "%s::mptctl_hp_targetinfo() @%d - ioc%d not found!\n", ++ __FILE__, __LINE__, iocnum); + return -ENODEV; + } + +- dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT +- ": mptctl_hp_targetinfo called.\n", ++ dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT ": mptctl_hp_targetinfo called.\n", + ioc->name)); + /* There is nothing to do for FCP parts. + */ +@@ -2921,9 +2899,8 @@ + if (((iocnum = mpt_verify_adapter(iocnumX, &iocp)) < 0) || + (iocp == NULL)) { + if (mpt_debug_level & MPT_DEBUG_IOCTL) +- printk(KERN_DEBUG MYNAM +- "::%s @%d - ioc%d not found!\n", __func__, +- __LINE__, iocnumX); ++ printk(KERN_DEBUG MYNAM "::compat_mptfwxfer_ioctl @%d - ioc%d not found!\n", ++ __LINE__, iocnumX); + return -ENODEV; + } + +@@ -2963,9 +2940,8 @@ + if (((iocnum = mpt_verify_adapter(iocnumX, &iocp)) < 0) || + (iocp == NULL)) { + if (mpt_debug_level & MPT_DEBUG_IOCTL) +- printk(KERN_DEBUG MYNAM +- "::%s @%d - ioc%d not found!\n", +- __func__, __LINE__, iocnumX); ++ printk(KERN_DEBUG MYNAM "::compat_mpt_command @%d - ioc%d not found!\n", ++ __LINE__, iocnumX); + return -ENODEV; + } + +@@ -3178,7 +3154,7 @@ + + #if defined(CPQ_CIM) + #include "csmi/csmisas.c" +-#endif ++#endif // CPQ_CIM + + #if defined(DIAG_BUFFER_SUPPORT) + #include "rejected_ioctls/diag_buffer.c" +diff -r 60d73800068f drivers/message/fusion/mptfc.c +--- a/drivers/message/fusion/mptfc.c Tue Jun 30 11:26:39 2009 +0100 ++++ b/drivers/message/fusion/mptfc.c Wed Jul 01 09:46:25 2009 +0100 +@@ -43,7 +43,7 @@ + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ +- ++#include + #include + #include + #include +@@ -65,6 +65,7 @@ + #include + #include + ++#include "linux_compat.h" /* linux-2.6 tweaks */ + #include "mptbase.h" + #include "mptscsih.h" + +@@ -235,7 +236,7 @@ + int ready; + MPT_ADAPTER *ioc; + +- hd = shost_priv(SCpnt->device->host); ++ hd = shost_private(SCpnt->device->host); + ioc = hd->ioc; + spin_lock_irqsave(shost->host_lock, flags); + while ((ready = fc_remote_port_chkready(rport) >> 16) == DID_IMM_RETRY) { +@@ -270,28 +271,28 @@ + mptfc_abort(struct scsi_cmnd *SCpnt) + { + return +- mptfc_block_error_handler(SCpnt, mptscsih_abort, __func__); ++ mptfc_block_error_handler(SCpnt, mptscsih_abort, __FUNCTION__); + } + + static int + mptfc_dev_reset(struct scsi_cmnd *SCpnt) + { + return +- mptfc_block_error_handler(SCpnt, mptscsih_dev_reset, __func__); ++ mptfc_block_error_handler(SCpnt, mptscsih_dev_reset, __FUNCTION__); + } + + static int + mptfc_bus_reset(struct scsi_cmnd *SCpnt) + { + return +- mptfc_block_error_handler(SCpnt, mptscsih_bus_reset, __func__); ++ mptfc_block_error_handler(SCpnt, mptscsih_bus_reset, __FUNCTION__); + } + + static int + mptfc_host_reset(struct scsi_cmnd *SCpnt) + { + return +- mptfc_block_error_handler(SCpnt, mptscsih_host_reset, __func__); ++ mptfc_block_error_handler(SCpnt, mptscsih_host_reset, __FUNCTION__); + } + + static void +@@ -553,6 +554,7 @@ + struct fc_rport *rport; + struct mptfc_rport_info *ri; + ++ printk("%s - starget=%p\n", __FUNCTION__, starget); + rport = starget_to_rport(starget); + if (rport) { + ri = *((struct mptfc_rport_info **)rport->dd_data); +@@ -652,7 +654,7 @@ + if (!rport || fc_remote_port_chkready(rport)) + return -ENXIO; + +- hd = shost_priv(sdev->host); ++ hd = shost_private(sdev->host); + ioc = hd->ioc; + vdevice = kzalloc(sizeof(VirtDevice), GFP_KERNEL); + if (!vdevice) { +@@ -993,8 +995,7 @@ + #define OFF_FLAGS (MPI_FCPORTPAGE1_FLAGS_VERBOSE_RESCAN_EVENTS) + + for (ii=0; iifacts.NumberOfPorts; ii++) { +- rc = mptfc_GetFcPortPage1(ioc, ii); +- if (rc < 0) ++ if ((rc = mptfc_GetFcPortPage1(ioc, ii)) < 0) + return rc; + pp1 = ioc->fc_data.fc_port_page1[ii].data; + if ((pp1->InitiatorDeviceTimeout == MPTFC_FW_DEVICE_TIMEOUT) +@@ -1006,8 +1007,7 @@ + pp1->InitiatorIoPendTimeout = MPTFC_FW_IO_PEND_TIMEOUT; + pp1->Flags &= ~OFF_FLAGS; + pp1->Flags |= ON_FLAGS; +- rc = mptfc_WriteFcPortPage1(ioc, ii); +- if (rc < 0) ++ if ((rc = mptfc_WriteFcPortPage1(ioc, ii)) < 0) + return rc; + } + return 0; +@@ -1109,10 +1109,16 @@ + } + + static void ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,19)) + mptfc_link_status_change(struct work_struct *work) + { + MPT_ADAPTER *ioc = + container_of(work, MPT_ADAPTER, fc_rescan_work); ++#else ++mptfc_link_status_change(void *arg) ++{ ++ MPT_ADAPTER *ioc = (MPT_ADAPTER *)arg; ++#endif + int ii; + + for (ii=0; ii < ioc->facts.NumberOfPorts; ii++) +@@ -1121,10 +1127,16 @@ + } + + static void ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,19)) + mptfc_setup_reset(struct work_struct *work) + { + MPT_ADAPTER *ioc = + container_of(work, MPT_ADAPTER, fc_setup_reset_work); ++#else ++mptfc_setup_reset(void *arg) ++{ ++ MPT_ADAPTER *ioc = (MPT_ADAPTER *)arg; ++#endif + u64 pn; + struct mptfc_rport_info *ri; + struct scsi_target *starget; +@@ -1156,10 +1168,16 @@ + } + + static void ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,19)) + mptfc_rescan_devices(struct work_struct *work) + { + MPT_ADAPTER *ioc = + container_of(work, MPT_ADAPTER, fc_rescan_work); ++#else ++mptfc_rescan_devices(void *arg) ++{ ++ MPT_ADAPTER *ioc = (MPT_ADAPTER *)arg; ++#endif + int ii; + int rc; + u64 pn; +@@ -1171,9 +1189,8 @@ + * if cannot set defaults, something's really wrong, bail out + */ + +- rc = mptfc_SetFcPortPage1_defaults(ioc); +- if (rc < 0) { +- dfcprintk(ioc, printk(MYIOC_s_DEBUG_FMT ++ if ((rc = mptfc_SetFcPortPage1_defaults(ioc)) < 0) { ++ dfcprintk (ioc, printk(MYIOC_s_DEBUG_FMT + "mptfc_rescan.%d: unable to set PP1 defaults, rc %d.\n", + ioc->name, ioc->sh->host_no, rc)); + return; +@@ -1289,9 +1306,15 @@ + } + + spin_lock_init(&ioc->fc_rescan_work_lock); ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,19)) + INIT_WORK(&ioc->fc_rescan_work, mptfc_rescan_devices); + INIT_WORK(&ioc->fc_setup_reset_work, mptfc_setup_reset); + INIT_WORK(&ioc->fc_lsc_work, mptfc_link_status_change); ++#else ++ INIT_WORK(&ioc->fc_rescan_work, mptfc_rescan_devices,(void *)ioc); ++ INIT_WORK(&ioc->fc_setup_reset_work, mptfc_setup_reset, (void *)ioc); ++ INIT_WORK(&ioc->fc_lsc_work, mptfc_link_status_change, (void *)ioc); ++#endif + + spin_lock_irqsave(&ioc->FreeQlock, flags); + +@@ -1347,7 +1370,7 @@ + + spin_unlock_irqrestore(&ioc->FreeQlock, flags); + +- hd = shost_priv(sh); ++ hd = shost_private(sh); + hd->ioc = ioc; + + /* SCSI needs scsi_cmnd lookup table! +@@ -1375,9 +1398,8 @@ + + /* initialize workqueue */ + +- snprintf(ioc->fc_rescan_work_q_name, +- sizeof(ioc->fc_rescan_work_q_name), "mptfc_wq_%d", +- sh->host_no); ++ snprintf(ioc->fc_rescan_work_q_name, MPT_KOBJ_NAME_LEN, "mptfc_wq_%d", ++ sh->host_no); + ioc->fc_rescan_work_q = + create_singlethread_workqueue(ioc->fc_rescan_work_q_name); + if (!ioc->fc_rescan_work_q) +@@ -1428,7 +1450,7 @@ + int rc=1; + + if (ioc->sh == NULL || +- ((hd = shost_priv(ioc->sh)) == NULL)) ++ ((hd = shost_private(ioc->sh)) == NULL)) + return 1; + + switch (event) { +@@ -1465,10 +1487,10 @@ + if ((ioc->bus_type != FC) || (!rc)) + return rc; + +- switch (reset_phase) { ++ switch(reset_phase) { + case MPT_IOC_SETUP_RESET: + dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT +- "%s: MPT_IOC_SETUP_RESET\n", ioc->name, __func__)); ++ "%s: MPT_IOC_SETUP_RESET\n", ioc->name, __FUNCTION__)); + spin_lock_irqsave(&ioc->fc_rescan_work_lock, flags); + if (ioc->fc_rescan_work_q) { + queue_work(ioc->fc_rescan_work_q, +@@ -1478,11 +1500,11 @@ + break; + case MPT_IOC_PRE_RESET: + dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT +- "%s: MPT_IOC_PRE_RESET\n", ioc->name, __func__)); ++ "%s: MPT_IOC_PRE_RESET\n", ioc->name, __FUNCTION__)); + break; + case MPT_IOC_POST_RESET: + dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT +- "%s: MPT_IOC_POST_RESET\n", ioc->name, __func__)); ++ "%s: MPT_IOC_POST_RESET\n", ioc->name, __FUNCTION__)); + spin_lock_irqsave(&ioc->fc_rescan_work_lock, flags); + if (ioc->fc_rescan_work_q) { + queue_work(ioc->fc_rescan_work_q, +@@ -1496,12 +1518,11 @@ + return 1; + } + +-/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ + /** + * mptfc_init - Register MPT adapter(s) as SCSI host(s) with SCSI mid-layer. + * + * Returns 0 for success, non-zero for failure. +- */ ++ **/ + static int __init + mptfc_init(void) + { +@@ -1533,12 +1554,11 @@ + return error; + } + +-/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ + /** + * mptfc_remove - Remove fc infrastructure for devices + * @pdev: Pointer to pci_dev structure + * +- */ ++ **/ + static void __devexit + mptfc_remove(struct pci_dev *pdev) + { +@@ -1547,6 +1567,8 @@ + struct workqueue_struct *work_q; + unsigned long flags; + int ii; ++ ++ printk("%s -pdev=%p\n", __FUNCTION__, pdev); + + /* destroy workqueue */ + if ((work_q=ioc->fc_rescan_work_q)) { +diff -r 60d73800068f drivers/message/fusion/mptlan.c +--- a/drivers/message/fusion/mptlan.c Tue Jun 30 11:26:39 2009 +0100 ++++ b/drivers/message/fusion/mptlan.c Wed Jul 01 09:46:25 2009 +0100 +@@ -52,6 +52,7 @@ + /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ + + #include "mptlan.h" ++#include + #include + #include + #include +@@ -113,8 +114,12 @@ + u32 total_received; + struct net_device_stats stats; /* Per device statistics */ + ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,19)) + struct delayed_work post_buckets_task; + struct net_device *dev; ++#else ++ struct work_struct post_buckets_task; ++#endif + unsigned long post_buckets_active; + }; + +@@ -135,7 +140,11 @@ + static int mpt_lan_open(struct net_device *dev); + static int mpt_lan_reset(struct net_device *dev); + static int mpt_lan_close(struct net_device *dev); ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,19)) + static void mpt_lan_post_receive_buckets(struct mpt_lan_priv *priv); ++#else ++static void mpt_lan_post_receive_buckets(void *dev_id); ++#endif + static void mpt_lan_wake_post_buckets_task(struct net_device *dev, + int priority); + static int mpt_lan_receive_post_turbo(struct net_device *dev, u32 tmsg); +@@ -346,7 +355,11 @@ + priv->mpt_rxfidx[++priv->mpt_rxfidx_tail] = i; + spin_unlock_irqrestore(&priv->rxfidx_lock, flags); + } else { ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,19)) + mpt_lan_post_receive_buckets(priv); ++#else ++ mpt_lan_post_receive_buckets(dev); ++#endif + netif_wake_queue(dev); + } + +@@ -442,7 +455,11 @@ + + dlprintk((KERN_INFO MYNAM "/lo: Finished initializing RcvCtl\n")); + ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,19)) + mpt_lan_post_receive_buckets(priv); ++#else ++ mpt_lan_post_receive_buckets(dev); ++#endif + + printk(KERN_INFO MYNAM ": %s/%s: interface up & active\n", + IOC_AND_NETDEV_NAMES_s_s(dev)); +@@ -614,7 +631,7 @@ + + dioprintk((KERN_INFO MYNAM ": %s/%s: @%s, skb %p sent.\n", + IOC_AND_NETDEV_NAMES_s_s(dev), +- __func__, sent)); ++ __FUNCTION__, sent)); + + priv->SendCtl[ctx].skb = NULL; + pci_unmap_single(mpt_dev->pcidev, priv->SendCtl[ctx].dma, +@@ -680,7 +697,7 @@ + + dioprintk((KERN_INFO MYNAM ": %s/%s: @%s, skb %p sent.\n", + IOC_AND_NETDEV_NAMES_s_s(dev), +- __func__, sent)); ++ __FUNCTION__, sent)); + + priv->SendCtl[ctx].skb = NULL; + pci_unmap_single(mpt_dev->pcidev, priv->SendCtl[ctx].dma, +@@ -712,14 +729,16 @@ + LANSendRequest_t *pSendReq; + SGETransaction32_t *pTrans; + SGESimple64_t *pSimple; ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,21)) + const unsigned char *mac; ++#endif + dma_addr_t dma; + unsigned long flags; + int ctx; + u16 cur_naa = 0x1000; + + dioprintk((KERN_INFO MYNAM ": %s called, skb_addr = %p\n", +- __func__, skb)); ++ __FUNCTION__, skb)); + + spin_lock_irqsave(&priv->txfidx_lock, flags); + if (priv->mpt_txfidx_tail < 0) { +@@ -727,7 +746,7 @@ + spin_unlock_irqrestore(&priv->txfidx_lock, flags); + + printk (KERN_ERR "%s: no tx context available: %u\n", +- __func__, priv->mpt_txfidx_tail); ++ __FUNCTION__, priv->mpt_txfidx_tail); + return 1; + } + +@@ -737,7 +756,7 @@ + spin_unlock_irqrestore(&priv->txfidx_lock, flags); + + printk (KERN_ERR "%s: Unable to alloc request frame\n", +- __func__); ++ __FUNCTION__); + return 1; + } + +@@ -752,7 +771,11 @@ + /* Set the mac.raw pointer, since this apparently isn't getting + * done before we get the skb. Pull the data pointer past the mac data. + */ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,21)) + skb_reset_mac_header(skb); ++#else ++ skb->mac.raw = skb->data; ++#endif + skb_pull(skb, 12); + + dma = pci_map_single(mpt_dev->pcidev, skb->data, skb->len, +@@ -783,7 +806,9 @@ + // IOC_AND_NETDEV_NAMES_s_s(dev), + // ctx, skb, skb->data)); + ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,21)) + mac = skb_mac_header(skb); ++#endif + + #ifdef QLOGIC_NAA_WORKAROUND + { +@@ -794,12 +819,21 @@ + drops. */ + read_lock_irq(&bad_naa_lock); + for (nh = mpt_bad_naa; nh != NULL; nh=nh->next) { ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,21)) + if ((nh->ieee[0] == mac[0]) && + (nh->ieee[1] == mac[1]) && + (nh->ieee[2] == mac[2]) && + (nh->ieee[3] == mac[3]) && + (nh->ieee[4] == mac[4]) && + (nh->ieee[5] == mac[5])) { ++#else ++ if ((nh->ieee[0] == skb->mac.raw[0]) && ++ (nh->ieee[1] == skb->mac.raw[1]) && ++ (nh->ieee[2] == skb->mac.raw[2]) && ++ (nh->ieee[3] == skb->mac.raw[3]) && ++ (nh->ieee[4] == skb->mac.raw[4]) && ++ (nh->ieee[5] == skb->mac.raw[5])) { ++#endif + cur_naa = nh->NAA; + dlprintk ((KERN_INFO "mptlan/sdu_send: using NAA value " + "= %04x.\n", cur_naa)); +@@ -811,6 +845,7 @@ + #endif + + ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,21)) + pTrans->TransactionDetails[0] = cpu_to_le32((cur_naa << 16) | + (mac[0] << 8) | + (mac[1] << 0)); +@@ -818,6 +853,15 @@ + (mac[3] << 16) | + (mac[4] << 8) | + (mac[5] << 0)); ++#else ++ pTrans->TransactionDetails[0] = cpu_to_le32((cur_naa << 16) | ++ (skb->mac.raw[0] << 8) | ++ (skb->mac.raw[1] << 0)); ++ pTrans->TransactionDetails[1] = cpu_to_le32((skb->mac.raw[2] << 24) | ++ (skb->mac.raw[3] << 16) | ++ (skb->mac.raw[4] << 8) | ++ (skb->mac.raw[5] << 0)); ++#endif + + pSimple = (SGESimple64_t *) &pTrans->TransactionDetails[2]; + +@@ -856,7 +900,8 @@ + * @priority: 0 = put it on the timer queue, 1 = put it on the immediate queue + */ + { +- struct mpt_lan_priv *priv = dev->priv; ++ //struct mpt_lan_priv *priv = dev->priv; ++ struct mpt_lan_priv *priv = netdev_priv(dev); + + if (test_and_set_bit(0, &priv->post_buckets_active) == 0) { + if (priority) { +@@ -875,7 +920,8 @@ + static int + mpt_lan_receive_skb(struct net_device *dev, struct sk_buff *skb) + { +- struct mpt_lan_priv *priv = dev->priv; ++ //struct mpt_lan_priv *priv = dev->priv; ++ struct mpt_lan_priv *priv = netdev_priv(dev); + + skb->protocol = mpt_lan_type_trans(skb, dev); + +@@ -907,7 +953,8 @@ + static int + mpt_lan_receive_post_turbo(struct net_device *dev, u32 tmsg) + { +- struct mpt_lan_priv *priv = dev->priv; ++ //struct mpt_lan_priv *priv = dev->priv; ++ struct mpt_lan_priv *priv = netdev_priv(dev); + MPT_ADAPTER *mpt_dev = priv->mpt_dev; + struct sk_buff *skb, *old_skb; + unsigned long flags; +@@ -932,7 +979,11 @@ + pci_dma_sync_single_for_cpu(mpt_dev->pcidev, priv->RcvCtl[ctx].dma, + priv->RcvCtl[ctx].len, PCI_DMA_FROMDEVICE); + ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,21)) + skb_copy_from_linear_data(old_skb, skb_put(skb, len), len); ++#else ++ memcpy(skb_put(skb, len), old_skb->data, len); ++#endif + + pci_dma_sync_single_for_device(mpt_dev->pcidev, priv->RcvCtl[ctx].dma, + priv->RcvCtl[ctx].len, PCI_DMA_FROMDEVICE); +@@ -962,7 +1013,8 @@ + mpt_lan_receive_post_free(struct net_device *dev, + LANReceivePostReply_t *pRecvRep) + { +- struct mpt_lan_priv *priv = dev->priv; ++ //struct mpt_lan_priv *priv = dev->priv; ++ struct mpt_lan_priv *priv = netdev_priv(dev); + MPT_ADAPTER *mpt_dev = priv->mpt_dev; + unsigned long flags; + struct sk_buff *skb; +@@ -1017,7 +1069,8 @@ + mpt_lan_receive_post_reply(struct net_device *dev, + LANReceivePostReply_t *pRecvRep) + { +- struct mpt_lan_priv *priv = dev->priv; ++ //struct mpt_lan_priv *priv = dev->priv; ++ struct mpt_lan_priv *priv = netdev_priv(dev); + MPT_ADAPTER *mpt_dev = priv->mpt_dev; + struct sk_buff *skb, *old_skb; + unsigned long flags; +@@ -1093,7 +1146,11 @@ + priv->RcvCtl[ctx].dma, + priv->RcvCtl[ctx].len, + PCI_DMA_FROMDEVICE); ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,21)) + skb_copy_from_linear_data(old_skb, skb_put(skb, l), l); ++#else ++ memcpy(skb_put(skb, l), old_skb->data, l); ++#endif + + pci_dma_sync_single_for_device(mpt_dev->pcidev, + priv->RcvCtl[ctx].dma, +@@ -1122,7 +1179,11 @@ + priv->RcvCtl[ctx].len, + PCI_DMA_FROMDEVICE); + ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,21)) + skb_copy_from_linear_data(old_skb, skb_put(skb, len), len); ++#else ++ memcpy(skb_put(skb, len), old_skb->data, len); ++#endif + pci_dma_sync_single_for_device(mpt_dev->pcidev, + priv->RcvCtl[ctx].dma, + priv->RcvCtl[ctx].len, +@@ -1193,9 +1254,17 @@ + /* Simple SGE's only at the moment */ + + static void ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,19)) + mpt_lan_post_receive_buckets(struct mpt_lan_priv *priv) + { + struct net_device *dev = priv->dev; ++#else ++mpt_lan_post_receive_buckets(void *dev_id) ++{ ++ struct net_device *dev = dev_id; ++ //struct mpt_lan_priv *priv = dev->priv; ++ struct mpt_lan_priv *priv = netdev_priv(dev); ++#endif + MPT_ADAPTER *mpt_dev = priv->mpt_dev; + MPT_FRAME_HDR *mf; + LANReceivePostRequest_t *pRecvReq; +@@ -1213,7 +1282,7 @@ + + dioprintk((KERN_INFO MYNAM ": %s/%s: @%s, Start_buckets = %u, buckets_out = %u\n", + IOC_AND_NETDEV_NAMES_s_s(dev), +- __func__, buckets, curr)); ++ __FUNCTION__, buckets, curr)); + + max = (mpt_dev->req_sz - MPT_LAN_RECEIVE_POST_REQUEST_SIZE) / + (MPT_LAN_TRANSACTION32_SIZE + sizeof(SGESimple64_t)); +@@ -1222,9 +1291,9 @@ + mf = mpt_get_msg_frame(LanCtx, mpt_dev); + if (mf == NULL) { + printk (KERN_ERR "%s: Unable to alloc request frame\n", +- __func__); ++ __FUNCTION__); + dioprintk((KERN_ERR "%s: %u buckets remaining\n", +- __func__, buckets)); ++ __FUNCTION__, buckets)); + goto out; + } + pRecvReq = (LANReceivePostRequest_t *) mf; +@@ -1249,7 +1318,7 @@ + spin_lock_irqsave(&priv->rxfidx_lock, flags); + if (priv->mpt_rxfidx_tail < 0) { + printk (KERN_ERR "%s: Can't alloc context\n", +- __func__); ++ __FUNCTION__); + spin_unlock_irqrestore(&priv->rxfidx_lock, + flags); + break; +@@ -1272,7 +1341,7 @@ + if (skb == NULL) { + printk (KERN_WARNING + MYNAM "/%s: Can't alloc skb\n", +- __func__); ++ __FUNCTION__); + priv->mpt_rxfidx[++priv->mpt_rxfidx_tail] = ctx; + spin_unlock_irqrestore(&priv->rxfidx_lock, flags); + break; +@@ -1310,7 +1379,7 @@ + + if (pSimple == NULL) { + /**/ printk (KERN_WARNING MYNAM "/%s: No buckets posted\n", +-/**/ __func__); ++/**/ __FUNCTION__); + mpt_free_msg_frame(mpt_dev, mf); + goto out; + } +@@ -1334,19 +1403,21 @@ + + out: + dioprintk((KERN_INFO MYNAM "/%s: End_buckets = %u, priv->buckets_out = %u\n", +- __func__, buckets, atomic_read(&priv->buckets_out))); ++ __FUNCTION__, buckets, atomic_read(&priv->buckets_out))); + dioprintk((KERN_INFO MYNAM "/%s: Posted %u buckets and received %u back\n", +- __func__, priv->total_posted, priv->total_received)); ++ __FUNCTION__, priv->total_posted, priv->total_received)); + + clear_bit(0, &priv->post_buckets_active); + } + ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,19)) + static void + mpt_lan_post_receive_buckets_work(struct work_struct *work) + { + mpt_lan_post_receive_buckets(container_of(work, struct mpt_lan_priv, + post_buckets_task.work)); + } ++#endif + + /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ + static struct net_device * +@@ -1363,13 +1434,20 @@ + + priv = netdev_priv(dev); + ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,19)) + priv->dev = dev; ++#endif + priv->mpt_dev = mpt_dev; + priv->pnum = pnum; + ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,19)) + memset(&priv->post_buckets_task, 0, sizeof(priv->post_buckets_task)); + INIT_DELAYED_WORK(&priv->post_buckets_task, + mpt_lan_post_receive_buckets_work); ++#else ++ memset(&priv->post_buckets_task, 0, sizeof(struct work_struct)); ++ INIT_WORK(&priv->post_buckets_task, mpt_lan_post_receive_buckets, dev); ++#endif + priv->post_buckets_active = 0; + + dlprintk((KERN_INFO MYNAM "@%d: bucketlen = %d\n", +@@ -1428,6 +1506,9 @@ + dlprintk((KERN_INFO MYNAM ": Finished registering dev " + "and setting initial values\n")); + ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)) ++ SET_MODULE_OWNER(dev); ++#endif + + if (register_netdev(dev) != 0) { + free_netdev(dev); +@@ -1546,7 +1627,11 @@ + struct mpt_lan_ohdr *fch = (struct mpt_lan_ohdr *)skb->data; + struct fcllc *fcllc; + ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,21)) + skb_reset_mac_header(skb); ++#else ++ skb->mac.raw = skb->data; ++#endif + skb_pull(skb, sizeof(struct mpt_lan_ohdr)); + + if (fch->dtype == htons(0xffff)) { +diff -r 60d73800068f drivers/message/fusion/mptlan.h +--- a/drivers/message/fusion/mptlan.h Tue Jun 30 11:26:39 2009 +0100 ++++ b/drivers/message/fusion/mptlan.h Wed Jul 01 09:46:25 2009 +0100 +@@ -123,7 +123,7 @@ + #define dlprintk(x) + #endif + +-#define NETDEV_TO_LANPRIV_PTR(d) ((struct mpt_lan_priv *)(d)->priv) ++#define NETDEV_TO_LANPRIV_PTR(d) ((struct mpt_lan_priv *)netdev_priv(d)) + #define NETDEV_PTR_TO_IOC_NAME_s(d) (NETDEV_TO_LANPRIV_PTR(d)->mpt_dev->name) + #define IOC_AND_NETDEV_NAMES_s_s(d) NETDEV_PTR_TO_IOC_NAME_s(d), (d)->name + +diff -r 60d73800068f drivers/message/fusion/mptsas.c +--- a/drivers/message/fusion/mptsas.c Tue Jun 30 11:26:39 2009 +0100 ++++ b/drivers/message/fusion/mptsas.c Wed Jul 01 09:46:25 2009 +0100 +@@ -42,7 +42,8 @@ + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ +- ++#include "linux_compat.h" /* linux-2.6 tweaks */ ++#include + #include + #include + #include +@@ -60,8 +61,18 @@ + #include + #include + ++#include "linux_compat.h" /* linux-2.6 tweaks */ + #include "mptbase.h" + #include "mptscsih.h" ++ ++/* The glue to get a single driver working in both ++ * SLES10 and RHEL5 environments ++ */ ++#if (defined(CONFIG_SUSE_KERNEL) && defined(scsi_is_sas_phy_local)) || LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18) ++#define MPT_WIDE_PORT_API 1 ++#define MPT_WIDE_PORT_API_PLUS 1 ++#endif ++ + #include "mptsas.h" + + #define my_NAME "Fusion MPT SAS Host driver" +@@ -71,7 +82,11 @@ + /* + * Reserved channel for integrated raid + */ ++#if defined(MPT_WIDE_PORT_API) + #define MPTSAS_RAID_CHANNEL 1 ++#else ++#define MPTSAS_RAID_CHANNEL 8 ++#endif + + #define SAS_CONFIG_PAGE_TIMEOUT 30 + +@@ -86,10 +101,10 @@ + " Clear persistency table: enable=1 " + "(default=MPTSCSIH_PT_CLEAR=0)"); + +-static int mpt_cmd_retry_count = 144; ++static int mpt_cmd_retry_count = 300; + module_param(mpt_cmd_retry_count, int, 0); + MODULE_PARM_DESC(mpt_cmd_retry_count, +- " Device discovery TUR command retry count: default=144"); ++ " Device discovery TUR command retry count: default=300"); + + static int mpt_disable_hotplug_remove = 0; + module_param(mpt_disable_hotplug_remove, int, 0); +@@ -117,27 +132,42 @@ + static u8 mptsasMgmtCtx = MPT_MAX_PROTOCOL_DRIVERS; + static u8 mptsasDeviceResetCtx = MPT_MAX_PROTOCOL_DRIVERS; + ++static void mptsas_send_sas_event(struct fw_event_work *fw_event); ++static void mptsas_send_raid_event(struct fw_event_work *fw_event); ++static void mptsas_send_ir2_event(struct fw_event_work *fw_event); ++static void mptsas_parse_device_info(struct sas_identify *identify, ++ struct mptsas_devinfo *device_info); + static inline void mptsas_set_rphy(MPT_ADAPTER *ioc, +- struct mptsas_phyinfo *phy_info, struct sas_rphy *rphy); +-static struct mptsas_phyinfo *mptsas_find_phyinfo_by_sas_address( +- MPT_ADAPTER *ioc, u64 sas_address); ++ struct mptsas_phyinfo *phy_info, struct sas_rphy *rphy); ++static struct mptsas_phyinfo *mptsas_find_phyinfo_by_sas_address ++ (MPT_ADAPTER *ioc, u64 sas_address); + static int mptsas_sas_device_pg0(MPT_ADAPTER *ioc, +- struct mptsas_devinfo *device_info, u32 form, u32 form_specific); ++ struct mptsas_devinfo *device_info, u32 form, u32 form_specific); + static int mptsas_sas_enclosure_pg0(MPT_ADAPTER *ioc, +- struct mptsas_enclosure *enclosure, u32 form, u32 form_specific); +- ++ struct mptsas_enclosure *enclosure, u32 form, u32 form_specific); + static int mptsas_add_end_device(MPT_ADAPTER *ioc, +- struct mptsas_phyinfo *phy_info); ++ struct mptsas_phyinfo *phy_info); + static void mptsas_del_end_device(MPT_ADAPTER *ioc, +- struct mptsas_phyinfo *phy_info); ++ struct mptsas_phyinfo *phy_info); ++static void mptsas_send_link_status_event(struct fw_event_work *fw_event); ++static struct mptsas_portinfo *mptsas_find_portinfo_by_sas_address ++ (MPT_ADAPTER *ioc, u64 sas_address); + static void mptsas_expander_delete(MPT_ADAPTER *ioc, +- struct mptsas_portinfo *port_info); +-static int mptsas_sas_expander_pg0(MPT_ADAPTER *ioc, +- struct mptsas_portinfo *port_info, u32 form, u32 form_specific); ++ struct mptsas_portinfo *port_info, u8 force); ++static void mptsas_send_expander_event(struct fw_event_work *fw_event); ++static void mptsas_not_responding_devices(MPT_ADAPTER *ioc); + static void mptsas_scan_sas_topology(MPT_ADAPTER *ioc); +-static void mptsas_not_responding_devices(MPT_ADAPTER *ioc); +- ++static void mptsas_broadcast_primative_work(struct fw_event_work *fw_event); ++static void mptsas_handle_queue_full_event(struct fw_event_work *fw_event); ++static void mptsas_volume_delete(MPT_ADAPTER *ioc, u8 id); ++static struct mptsas_phyinfo *mptsas_find_phyinfo_by_sas_handle(MPT_ADAPTER *ioc, u16 handle); ++ ++ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,19)) + static void mptsas_firmware_event_work(struct work_struct *work); ++#else ++static void mptsas_firmware_event_work(void *arg); ++#endif + + /** + * mptsas_set_sdev_queue_depth - global setting of the mpt_sdev_queue_depth +@@ -152,7 +182,7 @@ + { + int ret = param_set_int(val, kp); + MPT_ADAPTER *ioc; +- struct scsi_device *sdev; ++ struct scsi_device *sdev; + + if (ret) + return ret; +@@ -297,6 +327,7 @@ + + spin_lock_irqsave(&ioc->fw_event_lock, flags); + ioc->fw_events_off = 1; ++ ioc->sas_discovery_quiesce_io = 0; + spin_unlock_irqrestore(&ioc->fw_event_lock, flags); + + } +@@ -325,11 +356,15 @@ + + spin_lock_irqsave(&ioc->fw_event_lock, flags); + list_add_tail(&fw_event->list, &ioc->fw_event_list); ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,19)) + INIT_DELAYED_WORK(&fw_event->work, mptsas_firmware_event_work); +- devtprintk(ioc, printk(MYIOC_s_INFO_FMT "%s: add (fw_event=0x%p)\n", ++#else ++ INIT_WORK(&fw_event->work, mptsas_firmware_event_work, (void *)fw_event); ++#endif ++ devtprintk(ioc, printk(MYIOC_s_DEBUG_FMT "%s: add (fw_event=0x%p)\n", + ioc->name, __func__, fw_event)); + queue_delayed_work(ioc->fw_event_q, &fw_event->work, +- msecs_to_jiffies(delay)); ++ delay); + spin_unlock_irqrestore(&ioc->fw_event_lock, flags); + } + +@@ -340,8 +375,8 @@ + { + unsigned long flags; + spin_lock_irqsave(&ioc->fw_event_lock, flags); +- devtprintk(ioc, printk(MYIOC_s_INFO_FMT "%s: reschedule task " +- "(fw_event=0x%p)\n", ioc->name, __func__, fw_event)); ++ devtprintk(ioc, printk(MYIOC_s_DEBUG_FMT "%s: reschedule task " ++ "(fw_event=0x%p)\n", ioc->name,__FUNCTION__, fw_event)); + fw_event->retries++; + queue_delayed_work(ioc->fw_event_q, &fw_event->work, + msecs_to_jiffies(delay)); +@@ -355,7 +390,7 @@ + unsigned long flags; + + spin_lock_irqsave(&ioc->fw_event_lock, flags); +- devtprintk(ioc, printk(MYIOC_s_INFO_FMT "%s: kfree (fw_event=0x%p)\n", ++ devtprintk(ioc, printk(MYIOC_s_DEBUG_FMT "%s: kfree (fw_event=0x%p)\n", + ioc->name, __func__, fw_event)); + list_del(&fw_event->list); + kfree(fw_event); +@@ -370,7 +405,7 @@ + struct fw_event_work *fw_event, *next; + struct mptsas_target_reset_event *target_reset_list, *n; + u8 flush_q; +- MPT_SCSI_HOST *hd = shost_priv(ioc->sh); ++ MPT_SCSI_HOST *hd = shost_private(ioc->sh); + + /* flush the target_reset_list */ + if (!list_empty(&hd->target_reset_list)) { +@@ -401,30 +436,37 @@ + } + + +-/** +- * phy_to_ioc - +- * @phy: +- * +- * +- **/ +-static inline MPT_ADAPTER * +-phy_to_ioc(struct sas_phy *phy) ++static inline MPT_ADAPTER *phy_to_ioc(struct sas_phy *phy) + { + struct Scsi_Host *shost = dev_to_shost(phy->dev.parent); + return ((MPT_SCSI_HOST *)shost->hostdata)->ioc; + } + +-/** +- * rphy_to_ioc - +- * @rphy: +- * +- * +- **/ +-static inline MPT_ADAPTER * +-rphy_to_ioc(struct sas_rphy *rphy) ++static inline MPT_ADAPTER *rphy_to_ioc(struct sas_rphy *rphy) + { + struct Scsi_Host *shost = dev_to_shost(rphy->dev.parent->parent); + return ((MPT_SCSI_HOST *)shost->hostdata)->ioc; ++} ++ ++/* ++ * mptsas_find_portinfo_by_handle ++ * ++ * This function should be called with the sas_topology_mutex already held ++ */ ++static struct mptsas_portinfo * ++mptsas_find_portinfo_by_handle(MPT_ADAPTER *ioc, u16 handle) ++{ ++ struct mptsas_portinfo *port_info, *rc=NULL; ++ int i; ++ ++ list_for_each_entry(port_info, &ioc->sas_topology, list) ++ for (i = 0; i < port_info->num_phys; i++) ++ if (port_info->phy_info[i].identify.handle == handle) { ++ rc = port_info; ++ goto out; ++ } ++ out: ++ return rc; + } + + /** +@@ -459,36 +501,9 @@ + return rc; + } + +-/** +- * mptsas_find_portinfo_by_handle - +- * @ioc: Pointer to MPT_ADAPTER structure +- * @handle: +- * +- * This function should be called with the sas_topology_mutex already held +- * +- **/ +-static struct mptsas_portinfo * +-mptsas_find_portinfo_by_handle(MPT_ADAPTER *ioc, u16 handle) +-{ +- struct mptsas_portinfo *port_info, *rc=NULL; +- int i; +- +- list_for_each_entry(port_info, &ioc->sas_topology, list) +- for (i = 0; i < port_info->num_phys; i++) +- if (port_info->phy_info[i].identify.handle == handle) { +- rc = port_info; +- goto out; +- } +- out: +- return rc; +-} +- +-/** +- * mptsas_is_end_device - +- * @attached: +- * +- * Returns true if there is a scsi end device +- **/ ++/* ++ * Returns true if there is a scsi end device ++ */ + static inline int + mptsas_is_end_device(struct mptsas_devinfo * attached) + { +@@ -527,10 +542,18 @@ + port_info = port_details->port_info; + phy_info = port_info->phy_info; + ++#if defined(MPT_WIDE_PORT_API) + dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT "%s: [%p]: num_phys=%02d " + "bitmask=0x%016llX\n", ioc->name, __func__, port_details, + port_details->num_phys, (unsigned long long) + port_details->phy_bitmask)); ++#else ++ dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT "%s: [%p]: port=%02d num_phys=%02d " ++ "rphy=%02d bitmask=0x%016llX\n", ioc->name, __FUNCTION__, port_details, ++ port_details->port_id, port_details->num_phys, ++ port_details->rphy_id, (unsigned long long) ++ port_details->phy_bitmask)); ++#endif + + for (i = 0; i < port_info->num_phys; i++, phy_info++) { + if(phy_info->port_details != port_details) +@@ -568,8 +591,8 @@ + { + if (phy_info->port_details) { + phy_info->port_details->rphy = rphy; +- dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT +- "sas_rphy_add: rphy=%p\n", ioc->name, rphy)); ++ dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT "sas_rphy_add: rphy=%p\n", ++ ioc->name, rphy)); + } + + if (rphy) { +@@ -580,6 +603,23 @@ + } + } + ++#if !defined(MPT_WIDE_PORT_API) ++/** ++ * mptsas_get_rphy_id - ++ * @phy_info: ++ * ++ **/ ++static inline u8 ++mptsas_get_rphy_id(struct mptsas_phyinfo *phy_info) ++{ ++ if (phy_info->port_details) ++ return phy_info->port_details->rphy_id; ++ else ++ return 0xFF; ++} ++#endif ++ ++#if defined(MPT_WIDE_PORT_API) + /** + * mptsas_get_port - + * @phy_info: +@@ -614,6 +654,7 @@ + ioc->name, port, port->dev.release)); + } + } ++#endif + + /** + * mptsas_get_starget - +@@ -657,14 +698,14 @@ + u64 sas_address, u32 device_info, u16 slot, u64 enclosure_logical_id) + { + struct sas_device_info *sas_info, *next; +- struct scsi_device *sdev; ++ struct scsi_device *sdev; + struct scsi_target *starget; + struct sas_rphy *rphy; + + /* + * Delete all matching devices out of the list + */ +- mutex_lock(&ioc->sas_device_info_mutex); ++ down(&ioc->sas_device_info_mutex); + list_for_each_entry_safe(sas_info, next, &ioc->sas_device_info_list, + list) { + if (!sas_info->is_logical_volume && +@@ -676,7 +717,8 @@ + } + } + +- if (!(sas_info = kzalloc(sizeof(struct sas_device_info), GFP_KERNEL))) ++ sas_info = kzalloc(sizeof(struct sas_device_info), GFP_KERNEL); ++ if (!sas_info) + goto out; + + /* +@@ -705,7 +747,7 @@ + } + + out: +- mutex_unlock(&ioc->sas_device_info_mutex); ++ up(&ioc->sas_device_info_mutex); + return; + } + +@@ -750,8 +792,7 @@ + * + **/ + static void +-mptsas_add_device_component_starget_ir(MPT_ADAPTER *ioc, +- struct scsi_target *starget) ++mptsas_add_device_component_starget_ir(MPT_ADAPTER *ioc, struct scsi_target *starget) + { + CONFIGPARMS cfg; + ConfigPageHeader_t hdr; +@@ -765,7 +806,7 @@ + memset(&hdr, 0 , sizeof(ConfigPageHeader_t)); + hdr.PageType = MPI_CONFIG_PAGETYPE_RAID_VOLUME; + /* assumption that all volumes on channel = 0 */ +- cfg.pageAddr = starget->id; ++ cfg.pageAddr = starget->id; + cfg.cfghdr.hdr = &hdr; + cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER; + cfg.timeout = SAS_CONFIG_PAGE_TIMEOUT; +@@ -796,14 +837,14 @@ + */ + for (i = 0; i < buffer->NumPhysDisks; i++) { + +- if (mpt_raid_phys_disk_pg0(ioc, ++ if(mpt_raid_phys_disk_pg0(ioc, + buffer->PhysDisk[i].PhysDiskNum, &phys_disk) != 0) + continue; + + mptsas_add_device_component_by_fw(ioc, phys_disk.PhysDiskBus, + phys_disk.PhysDiskID); + +- mutex_lock(&ioc->sas_device_info_mutex); ++ down(&ioc->sas_device_info_mutex); + list_for_each_entry(sas_info, &ioc->sas_device_info_list, + list) { + if (!sas_info->is_logical_volume && +@@ -813,13 +854,13 @@ + sas_info->volume_id = starget->id; + } + } +- mutex_unlock(&ioc->sas_device_info_mutex); ++ up(&ioc->sas_device_info_mutex); + } + + /* + * Delete all matching devices out of the list + */ +- mutex_lock(&ioc->sas_device_info_mutex); ++ down(&ioc->sas_device_info_mutex); + list_for_each_entry_safe(sas_info, next, &ioc->sas_device_info_list, + list) { + if (sas_info->is_logical_volume && sas_info->fw.id == +@@ -838,7 +879,7 @@ + INIT_LIST_HEAD(&sas_info->list); + list_add_tail(&sas_info->list, &ioc->sas_device_info_list); + } +- mutex_unlock(&ioc->sas_device_info_mutex); ++ up(&ioc->sas_device_info_mutex); + + out: + if (buffer) +@@ -854,30 +895,30 @@ + **/ + static void + mptsas_add_device_component_starget(MPT_ADAPTER *ioc, +- struct scsi_target *starget) +-{ +- VirtTarget *vtarget; +- struct sas_rphy *rphy; +- struct mptsas_phyinfo *phy_info = NULL; +- struct mptsas_enclosure enclosure_info; ++ struct scsi_target *starget) ++{ ++ VirtTarget *vtarget; ++ struct sas_rphy *rphy; ++ struct mptsas_phyinfo *phy_info = NULL; ++ struct mptsas_enclosure enclosure_info; + + rphy = dev_to_rphy(starget->dev.parent); + vtarget = starget->hostdata; + phy_info = mptsas_find_phyinfo_by_sas_address(ioc, +- rphy->identify.sas_address); ++ rphy->identify.sas_address); + if (!phy_info) + return; + + memset(&enclosure_info, 0, sizeof(struct mptsas_enclosure)); + mptsas_sas_enclosure_pg0(ioc, &enclosure_info, +- (MPI_SAS_ENCLOS_PGAD_FORM_HANDLE << +- MPI_SAS_ENCLOS_PGAD_FORM_SHIFT), +- phy_info->attached.handle_enclosure); ++ (MPI_SAS_ENCLOS_PGAD_FORM_HANDLE << ++ MPI_SAS_ENCLOS_PGAD_FORM_SHIFT), ++ phy_info->attached.handle_enclosure); + + mptsas_add_device_component(ioc, phy_info->attached.channel, +- phy_info->attached.id, phy_info->attached.sas_address, +- phy_info->attached.device_info, +- phy_info->attached.slot, enclosure_info.enclosure_logical_id); ++ phy_info->attached.id, phy_info->attached.sas_address, ++ phy_info->attached.device_info, ++ phy_info->attached.slot, enclosure_info.enclosure_logical_id); + } + + /** +@@ -913,29 +954,35 @@ + { + struct sas_device_info *sas_info, *next; + +- mutex_lock(&ioc->sas_device_info_mutex); ++ down(&ioc->sas_device_info_mutex); + list_for_each_entry_safe(sas_info, next, &ioc->sas_device_info_list, + list) { + list_del(&sas_info->list); + kfree(sas_info); + } +- mutex_unlock(&ioc->sas_device_info_mutex); +-} +- +-/** +- * mptsas_setup_wide_ports - Updates for new and existing narrow/wide port ++ up(&ioc->sas_device_info_mutex); ++} ++ ++ ++/* ++ * mptsas_setup_wide_ports + * configuration + * in the sas_topology + * @ioc: Pointer to MPT_ADAPTER structure + * @port_info: + * ++ * Updates for new and existing narrow/wide port configuration ++ * in the sas_topology + */ + static void + mptsas_setup_wide_ports(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info) + { +- struct mptsas_portinfo_details *port_details; ++ struct mptsas_portinfo_details * port_details; + struct mptsas_phyinfo *phy_info, *phy_info_cmp; + u64 sas_address; ++#if !defined(MPT_WIDE_PORT_API) ++ u8 found_wide_port; ++#endif + int i, j; + + mutex_lock(&ioc->sas_topology_mutex); +@@ -954,16 +1001,27 @@ + * Removing a phy from a port, letting the last + * phy be removed by firmware events. + */ ++#if defined(MPT_WIDE_PORT_API) + dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT + "%s: [%p]: deleting phy = %d\n", +- ioc->name, __func__, port_details, i)); ++ ioc->name, __FUNCTION__, port_details, i)); ++#else ++ dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT ++ "%s: [%p]: deleting phy = %d\n", ++ ioc->name, __func__, port_details, i)); ++#endif + port_details->num_phys--; +- port_details->phy_bitmask &= ~(1 << phy_info->phy_id); ++ port_details->phy_bitmask &= ~ (1 << phy_info->phy_id); + memset(&phy_info->attached, 0, sizeof(struct mptsas_devinfo)); +- devtprintk(ioc, dev_printk(KERN_DEBUG, &phy_info->phy->dev, +- MYIOC_s_FMT "delete phy %d, phy-obj (0x%p)\n", ioc->name, +- phy_info->phy_id, phy_info->phy)); ++#if defined(MPT_WIDE_PORT_API) ++ if (phy_info->phy) { ++ devtprintk(ioc, dev_printk(KERN_DEBUG, ++ &phy_info->phy->dev, MYIOC_s_FMT ++ "delete phy %d, phy-obj (0x%p)\n", ioc->name, ++ phy_info->phy_id, phy_info->phy)); + sas_port_delete_phy(port_details->port, phy_info->phy); ++ } ++#endif + phy_info->port_details = NULL; + } + +@@ -973,9 +1031,8 @@ + phy_info = port_info->phy_info; + for (i = 0 ; i < port_info->num_phys ; i++, phy_info++) { + sas_address = phy_info->attached.sas_address; +- dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT +- "phy_id=%d sas_address=0x%018llX\n", +- ioc->name, i, (unsigned long long)sas_address)); ++ dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT "phy_id=%d sas_address=0x%018llX\n", ++ ioc->name, i, (unsigned long long)sas_address)); + if (!sas_address) + continue; + port_details = phy_info->port_details; +@@ -983,33 +1040,45 @@ + * Forming a port + */ + if (!port_details) { +- port_details = kzalloc(sizeof(struct mptsas_portinfo_details), +- GFP_KERNEL); ++ port_details = kzalloc(sizeof(struct ++ mptsas_portinfo_details), GFP_KERNEL); + if (!port_details) + goto out; + port_details->num_phys = 1; + port_details->port_info = port_info; +- if (phy_info->phy_id < 64) ++#if !defined(MPT_WIDE_PORT_API) ++ port_details->port_id = phy_info->port_id; ++ port_details->rphy_id = i; ++ port_details->device_info = phy_info->attached.device_info; ++#endif ++ if (phy_info->phy_id < 64 ) + port_details->phy_bitmask |= + (1 << phy_info->phy_id); +- phy_info->sas_port_add_phy = 1; +- dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT +- "\t\tForming port\n\t\t" +- "phy_id=%d sas_address=0x%018llX\n", ioc->name, +- i, (unsigned long long) sas_address)); ++#if defined(MPT_WIDE_PORT_API) ++ phy_info->sas_port_add_phy=1; ++#endif ++ dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT "\t\tForming port\n\t\t" ++ "phy_id=%d sas_address=0x%018llX\n", ++ ioc->name, i, (unsigned long long)sas_address)); + phy_info->port_details = port_details; + } + + if (i == port_info->num_phys - 1) + continue; + phy_info_cmp = &port_info->phy_info[i + 1]; ++#if !defined(MPT_WIDE_PORT_API) ++ found_wide_port = 0; ++#endif + for (j = i + 1 ; j < port_info->num_phys ; j++, + phy_info_cmp++) { + if (!phy_info_cmp->attached.sas_address) + continue; + if (sas_address != phy_info_cmp->attached.sas_address) + continue; +- if (phy_info_cmp->port_details == port_details) ++#if !defined(MPT_WIDE_PORT_API) ++ found_wide_port = 1; ++#endif ++ if (phy_info_cmp->port_details == port_details ) + continue; + dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT + "\t\tphy_id=%d sas_address=0x%018llX\n", +@@ -1018,25 +1087,43 @@ + if (phy_info_cmp->port_details) { + port_details->rphy = + mptsas_get_rphy(phy_info_cmp); ++#if defined(MPT_WIDE_PORT_API) + port_details->port = + mptsas_get_port(phy_info_cmp); ++#endif + port_details->starget = + mptsas_get_starget(phy_info_cmp); ++#if !defined(MPT_WIDE_PORT_API) ++ port_details->port_id = ++ phy_info_cmp->port_details->port_id; ++ port_details->rphy_id = ++ phy_info_cmp->port_details->rphy_id; ++#endif + port_details->num_phys = + phy_info_cmp->port_details->num_phys; + if (!phy_info_cmp->port_details->num_phys) + kfree(phy_info_cmp->port_details); ++#if defined(MPT_WIDE_PORT_API) + } else +- phy_info_cmp->sas_port_add_phy = 1; ++ phy_info_cmp->sas_port_add_phy=1; ++#else ++ } ++#endif + /* + * Adding a phy to a port + */ + phy_info_cmp->port_details = port_details; +- if (phy_info_cmp->phy_id < 64) ++ if (phy_info_cmp->phy_id < 64 ) + port_details->phy_bitmask |= + (1 << phy_info_cmp->phy_id); + port_details->num_phys++; +- } ++#if !defined(MPT_WIDE_PORT_API) ++ phy_info_cmp->attached.wide_port_enable = 1; ++#endif ++ } ++#if !defined(MPT_WIDE_PORT_API) ++ phy_info->attached.wide_port_enable = (found_wide_port) ? 1:0; ++#endif + } + + out: +@@ -1045,14 +1132,25 @@ + port_details = port_info->phy_info[i].port_details; + if (!port_details) + continue; ++#if defined(MPT_WIDE_PORT_API) + dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT + "%s: [%p]: phy_id=%02d num_phys=%02d " + "bitmask=0x%016llX\n", ioc->name, __func__, + port_details, i, port_details->num_phys, + (unsigned long long)port_details->phy_bitmask)); ++ dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT "\t\tport = %p rphy=%p\n", ++ ioc->name, port_details->port, port_details->rphy)); ++#else + dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT +- "\t\tport = %p rphy=%p\n", +- ioc->name, port_details->port, port_details->rphy)); ++ "%s: [%p]: phy=%02d port=%02d num_phys=%02d " ++ "rphy=%02d bitmask=0x%016llX\n", ++ ioc->name, __FUNCTION__, ++ port_details, i, port_details->port_id, ++ port_details->num_phys, port_details->rphy_id, ++ (unsigned long long)port_details->phy_bitmask)); ++ dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT ++ "\t\trphy=%p\n", ioc->name, port_details->rphy)); ++#endif + } + dsaswideprintk(ioc, printk("\n")); + mutex_unlock(&ioc->sas_topology_mutex); +@@ -1073,7 +1171,8 @@ + VirtTarget *vtarget = NULL; + + shost_for_each_device(sdev, ioc->sh) { +- if ((vdevice = sdev->hostdata) == NULL || ++ vdevice = sdev->hostdata; ++ if ((vdevice == NULL) || + (vdevice->vtarget == NULL)) + continue; + if ((vdevice->vtarget->tflags & +@@ -1081,7 +1180,7 @@ + vdevice->vtarget->raidVolume)) + continue; + if (vdevice->vtarget->id == id && +- vdevice->vtarget->channel == channel) ++ vdevice->vtarget->channel == channel) + vtarget = vdevice->vtarget; + } + return vtarget; +@@ -1089,7 +1188,7 @@ + + static void + mptsas_queue_device_delete(MPT_ADAPTER *ioc, +- MpiEventDataSasDeviceStatusChange_t *sas_event_data) ++ MpiEventDataSasDeviceStatusChange_t *sas_event_data) + { + struct fw_event_work *fw_event; + int sz; +@@ -1148,10 +1247,12 @@ + if (mpt_set_taskmgmt_in_progress_flag(ioc) != 0) + return 0; + +- if ((mf = mpt_get_msg_frame(mptsasDeviceResetCtx, ioc)) == NULL) { ++ ++ mf = mpt_get_msg_frame(mptsasDeviceResetCtx, ioc); ++ if (mf == NULL) { + dfailprintk(ioc, printk(MYIOC_s_WARN_FMT +- "%s, no msg frames @%d!!\n", +- ioc->name, __func__, __LINE__)); ++ "%s, no msg frames @%d!!\n", ioc->name, ++ __func__, __LINE__)); + goto out_fail; + } + +@@ -1161,7 +1262,7 @@ + /* Format the Request + */ + pScsiTm = (SCSITaskMgmt_t *) mf; +- memset(pScsiTm, 0, sizeof(SCSITaskMgmt_t)); ++ memset (pScsiTm, 0, sizeof(SCSITaskMgmt_t)); + pScsiTm->TargetID = id; + pScsiTm->Bus = channel; + pScsiTm->Function = MPI_FUNCTION_SCSI_TASK_MGMT; +@@ -1183,6 +1284,20 @@ + mpt_clear_taskmgmt_in_progress_flag(ioc); + return 0; + } ++ ++static void ++mptsas_block_io_sdev(struct scsi_device *sdev, void *data) ++{ ++ scsi_device_set_state(sdev, SDEV_BLOCK); ++} ++ ++static void ++mptsas_block_io_starget(struct scsi_target *starget) ++{ ++ if (starget) ++ starget_for_each_device(starget, NULL, mptsas_block_io_sdev); ++} ++ + /** + * mptsas_target_reset_queue - + * @ioc: Pointer to MPT_ADAPTER structure +@@ -1196,17 +1311,19 @@ + mptsas_target_reset_queue(MPT_ADAPTER *ioc, + EVENT_DATA_SAS_DEVICE_STATUS_CHANGE *sas_event_data) + { +- MPT_SCSI_HOST *hd = shost_priv(ioc->sh); ++ MPT_SCSI_HOST *hd = shost_private(ioc->sh); + VirtTarget *vtarget = NULL; +- struct mptsas_target_reset_event *target_reset_list; ++ struct mptsas_target_reset_event *target_reset_list; + u8 id, channel; + + id = sas_event_data->TargetID; + channel = sas_event_data->Bus; + + if ((vtarget = mptsas_find_vtarget(ioc, channel, id))) { +- if (!ioc->disable_hotplug_remove) ++ if (!ioc->disable_hotplug_remove) { ++ mptsas_block_io_starget(vtarget->starget); + vtarget->deleted = 1; /* block IO */ ++ } + } + + target_reset_list = kzalloc(sizeof(struct mptsas_target_reset_event), +@@ -1224,8 +1341,9 @@ + + target_reset_list->time_count = jiffies; + +- if (mptsas_target_reset(ioc, channel, id)) ++ if (mptsas_target_reset(ioc, channel, id)) { + target_reset_list->target_reset_issued = 1; ++ } + } + + /** +@@ -1238,8 +1356,8 @@ + static int + mptsas_taskmgmt_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr) + { +- MPT_SCSI_HOST *hd = shost_priv(ioc->sh); +- struct list_head *head = &hd->target_reset_list; ++ MPT_SCSI_HOST *hd = shost_private(ioc->sh); ++ struct list_head *head = &hd->target_reset_list; + struct mptsas_target_reset_event *target_reset_list; + u8 id, channel; + SCSITaskMgmtReply_t *pScsiTmReply; +@@ -1313,7 +1431,7 @@ + list_del(&target_reset_list->list); + if ((mptsas_find_vtarget(ioc, channel, id)) && !ioc->fw_events_off) + mptsas_queue_device_delete(ioc, +- &target_reset_list->sas_event_data); ++ &target_reset_list->sas_event_data); + + + /* +@@ -1324,8 +1442,8 @@ + if (list_empty(head)) + return 1; + +- target_reset_list = list_entry(head->next, +- struct mptsas_target_reset_event, list); ++ target_reset_list = list_entry(head->next, struct mptsas_target_reset_event, ++ list); + + id = target_reset_list->sas_event_data.TargetID; + channel = target_reset_list->sas_event_data.Bus; +@@ -1346,14 +1464,14 @@ + static int + mptsas_ioc_reset(MPT_ADAPTER *ioc, int reset_phase) + { +- MPT_SCSI_HOST *hd; ++ MPT_SCSI_HOST *hd; + int rc; + + rc = mptscsih_ioc_reset(ioc, reset_phase); + if ((ioc->bus_type != SAS) || (!rc)) + return rc; + +- hd = shost_priv(ioc->sh); ++ hd = shost_private(ioc->sh); + if (!hd->ioc) + goto out; + +@@ -1385,6 +1503,20 @@ + out: + return rc; + } ++ ++/** ++ * enum device_state - ++ * @DEVICE_RETRY: need to retry the TUR ++ * @DEVICE_ERROR: TUR return error, don't add device ++ * @DEVICE_READY: device can be added ++ * ++ */ ++enum device_state{ ++ DEVICE_RETRY, ++ DEVICE_ERROR, ++ DEVICE_READY, ++}; ++ + + /** + * mptsas_sas_enclosure_pg0 - +@@ -1460,6 +1592,307 @@ + } + + /** ++ * mptsas_add_end_device - report a new end device to sas transport layer ++ * @ioc: Pointer to MPT_ADAPTER structure ++ * @phy_info: decribes attached device ++ * ++ * return (0) success (1) failure ++ * ++ **/ ++static int ++mptsas_add_end_device(MPT_ADAPTER *ioc, struct mptsas_phyinfo *phy_info) ++{ ++ struct sas_rphy *rphy; ++#if defined(MPT_WIDE_PORT_API) ++ struct sas_port *port; ++#endif ++ struct sas_identify identify; ++ char *ds = NULL; ++ u8 fw_id; ++ ++ if (!phy_info) { ++ dfailprintk(ioc, printk(MYIOC_s_ERR_FMT ++ "%s: exit at line=%d\n", ioc->name, ++ __func__, __LINE__)); ++ return 1; ++ } ++ ++ fw_id = phy_info->attached.id; ++ ++ if (mptsas_get_rphy(phy_info)) { ++ dfailprintk(ioc, printk(MYIOC_s_ERR_FMT ++ "%s: fw_id=%d exit at line=%d\n", ioc->name, ++ __func__, fw_id, __LINE__)); ++ return 2; ++ } ++ ++#if defined(MPT_WIDE_PORT_API) ++ port = mptsas_get_port(phy_info); ++ if (!port) { ++ dfailprintk(ioc, printk(MYIOC_s_ERR_FMT ++ "%s: fw_id=%d exit at line=%d\n", ioc->name, ++ __func__, fw_id, __LINE__)); ++ return 3; ++ } ++#endif ++ ++ if (phy_info->attached.device_info & ++ MPI_SAS_DEVICE_INFO_SSP_TARGET) ++ ds = "ssp"; ++ if (phy_info->attached.device_info & ++ MPI_SAS_DEVICE_INFO_STP_TARGET) ++ ds = "stp"; ++ if (phy_info->attached.device_info & ++ MPI_SAS_DEVICE_INFO_SATA_DEVICE) ++ ds = "sata"; ++ ++ printk(MYIOC_s_INFO_FMT "attaching %s device: fw_channel %d, fw_id %d," ++ " phy %d, sas_addr 0x%llx\n", ioc->name, ds, ++ phy_info->attached.channel, phy_info->attached.id, ++ phy_info->attached.phy_id, (unsigned long long) ++ phy_info->attached.sas_address); ++ ++ mptsas_parse_device_info(&identify, &phy_info->attached); ++#if defined(MPT_WIDE_PORT_API) ++ rphy = sas_end_device_alloc(port); ++#else ++ rphy = sas_end_device_alloc(phy_info->phy); ++#endif ++ if (!rphy) { ++ dfailprintk(ioc, printk(MYIOC_s_ERR_FMT ++ "%s: fw_id=%d exit at line=%d\n", ioc->name, ++ __func__, fw_id, __LINE__)); ++ return 5; /* non-fatal: an rphy can be added later */ ++ } ++ ++ rphy->identify = identify; ++ if (sas_rphy_add(rphy)) { ++ dfailprintk(ioc, printk(MYIOC_s_ERR_FMT ++ "%s: fw_id=%d exit at line=%d\n", ioc->name, ++ __func__, fw_id, __LINE__)); ++ sas_rphy_free(rphy); ++ return 6; ++ } ++ mptsas_set_rphy(ioc, phy_info, rphy); ++ return 0; ++} ++ ++/** ++ * mptsas_del_end_device - report a deleted end device to sas transport ++ * layer ++ * @ioc: Pointer to MPT_ADAPTER structure ++ * @phy_info: decribes attached device ++ * ++ **/ ++static void ++mptsas_del_end_device(MPT_ADAPTER *ioc, struct mptsas_phyinfo *phy_info) ++{ ++ struct sas_rphy *rphy; ++#if defined(MPT_WIDE_PORT_API) ++ struct sas_port *port; ++ struct mptsas_portinfo *port_info; ++ struct mptsas_phyinfo *phy_info_parent; ++ int i; ++#endif ++ char *ds = NULL; ++ u8 fw_id; ++ u64 sas_address; ++ ++ if (!phy_info) ++ return; ++ ++ fw_id = phy_info->attached.id; ++ sas_address = phy_info->attached.sas_address; ++ ++ if (!phy_info->port_details) { ++ dfailprintk(ioc, printk(MYIOC_s_ERR_FMT ++ "%s: fw_id=%d exit at line=%d\n", ioc->name, ++ __func__, fw_id, __LINE__)); ++ return; ++ } ++ rphy = mptsas_get_rphy(phy_info); ++ if (!rphy) { ++ dfailprintk(ioc, printk(MYIOC_s_ERR_FMT ++ "%s: fw_id=%d exit at line=%d\n", ioc->name, ++ __func__, fw_id, __LINE__)); ++ return; ++ } ++ ++ if (phy_info->attached.device_info & MPI_SAS_DEVICE_INFO_SSP_INITIATOR ++ || phy_info->attached.device_info ++ & MPI_SAS_DEVICE_INFO_SMP_INITIATOR ++ || phy_info->attached.device_info ++ & MPI_SAS_DEVICE_INFO_STP_INITIATOR) ++ ds = "initiator"; ++ if (phy_info->attached.device_info & ++ MPI_SAS_DEVICE_INFO_SSP_TARGET) ++ ds = "ssp"; ++ if (phy_info->attached.device_info & ++ MPI_SAS_DEVICE_INFO_STP_TARGET) ++ ds = "stp"; ++ if (phy_info->attached.device_info & ++ MPI_SAS_DEVICE_INFO_SATA_DEVICE) ++ ds = "sata"; ++ ++ dev_printk(KERN_DEBUG, &rphy->dev, MYIOC_s_FMT ++ "removing %s device: fw_channel %d, fw_id %d, phy %d," ++ "sas_addr 0x%llx\n", ioc->name, ds, phy_info->attached.channel, ++ phy_info->attached.id, phy_info->attached.phy_id, ++ (unsigned long long) sas_address); ++ ++#if defined(MPT_WIDE_PORT_API) ++ port = mptsas_get_port(phy_info); ++ if (!port) { ++ dfailprintk(ioc, printk(MYIOC_s_ERR_FMT ++ "%s: fw_id=%d exit at line=%d\n", ioc->name, ++ __func__, fw_id, __LINE__)); ++ return; ++ } ++ port_info = phy_info->portinfo; ++ phy_info_parent = port_info->phy_info; ++ for (i = 0; i < port_info->num_phys; i++, phy_info_parent++) { ++ if (!phy_info_parent->phy) ++ continue; ++ if (phy_info_parent->attached.sas_address != ++ sas_address) ++ continue; ++ dev_printk(KERN_DEBUG, &phy_info_parent->phy->dev, ++ MYIOC_s_FMT "delete phy %d, phy-obj (0x%p)\n", ++ ioc->name, phy_info_parent->phy_id, ++ phy_info_parent->phy); ++ sas_port_delete_phy(port, phy_info_parent->phy); ++ } ++ ++ dev_printk(KERN_DEBUG, &port->dev, MYIOC_s_FMT ++ "delete port %d, sas_addr (0x%llx)\n", ioc->name, ++ port->port_identifier, (unsigned long long)sas_address); ++ sas_port_delete(port); ++ mptsas_set_port(ioc, phy_info, NULL); ++#else ++ sas_rphy_delete(rphy); ++ mptsas_set_rphy(ioc, phy_info, NULL); ++#endif ++ mptsas_port_delete(ioc, phy_info->port_details); ++} ++ ++struct mptsas_phyinfo * ++mptsas_refreshing_device_handles(MPT_ADAPTER *ioc, ++ struct mptsas_devinfo *sas_device) ++{ ++ struct mptsas_phyinfo *phy_info; ++ struct mptsas_portinfo *port_info; ++ int i; ++ ++ phy_info = mptsas_find_phyinfo_by_sas_address(ioc, ++ sas_device->sas_address); ++ if (!phy_info) { ++ printk(KERN_ERR "%s:%d:%s: no phy_info", ++ __FILE__, __LINE__, __func__); ++ goto out; ++ } ++ port_info = phy_info->portinfo; ++ if (!port_info) ++ goto out; ++ mutex_lock(&ioc->sas_topology_mutex); ++ for (i = 0; i < port_info->num_phys; i++) { ++ if (port_info->phy_info[i].attached.sas_address != ++ sas_device->sas_address) ++ continue; ++ port_info->phy_info[i].attached.channel = sas_device->channel; ++ port_info->phy_info[i].attached.id = sas_device->id; ++ port_info->phy_info[i].attached.sas_address = ++ sas_device->sas_address; ++ port_info->phy_info[i].attached.handle = sas_device->handle; ++ port_info->phy_info[i].attached.handle_parent = ++ sas_device->handle_parent; ++ port_info->phy_info[i].attached.handle_enclosure = ++ sas_device->handle_enclosure; ++ } ++ mutex_unlock(&ioc->sas_topology_mutex); ++ out: ++ return phy_info; ++} ++ ++/** ++ * mptsas_firmware_event_work - work thread for processing fw events ++ * @work: work queue payload containing info describing the event ++ * Context: user ++ * ++ */ ++static void ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,19)) ++mptsas_firmware_event_work(struct work_struct *work) ++{ ++ struct fw_event_work *fw_event = ++ container_of(work, struct fw_event_work, work.work); ++#else ++mptsas_firmware_event_work(void *arg) ++{ ++ struct fw_event_work *fw_event = (struct fw_event_work *)arg; ++#endif ++ MPT_ADAPTER *ioc = fw_event->ioc; ++ ++ /* special rescan topology handling */ ++ if (fw_event->event == -1) { ++ if (ioc->in_rescan) { ++ devtprintk(ioc, printk(MYIOC_s_DEBUG_FMT ++ "%s: rescan ignored as it is in progress\n", ++ ioc->name, __func__)); ++ return; ++ } ++ devtprintk(ioc, printk(MYIOC_s_DEBUG_FMT "%s: rescan after " ++ "reset\n", ioc->name, __func__)); ++ ioc->in_rescan = 1; ++ mptsas_not_responding_devices(ioc); ++ mptsas_scan_sas_topology(ioc); ++ ioc->in_rescan = 0; ++ mptsas_free_fw_event(ioc, fw_event); ++ return; ++ } ++ ++ /* events handling turned off during host reset */ ++ if (ioc->fw_events_off) { ++ mptsas_free_fw_event(ioc, fw_event); ++ return; ++ } ++ ++ devtprintk(ioc, printk(MYIOC_s_DEBUG_FMT "%s: fw_event=(0x%p), " ++ "event = (0x%02x)\n", ioc->name, __func__, fw_event, ++ (fw_event->event & 0xFF))); ++ ++ switch (fw_event->event) { ++ case MPI_EVENT_SAS_DEVICE_STATUS_CHANGE: ++ mptsas_send_sas_event(fw_event); ++ break; ++ case MPI_EVENT_INTEGRATED_RAID: ++ mptsas_send_raid_event(fw_event); ++ break; ++ case MPI_EVENT_IR2: ++ mptsas_send_ir2_event(fw_event); ++ break; ++ case MPI_EVENT_PERSISTENT_TABLE_FULL: ++ mptbase_sas_persist_operation(ioc, ++ MPI_SAS_OP_CLEAR_NOT_PRESENT); ++ mptsas_free_fw_event(ioc, fw_event); ++ break; ++ case MPI_EVENT_SAS_BROADCAST_PRIMITIVE: ++ mptsas_broadcast_primative_work(fw_event); ++ break; ++ case MPI_EVENT_SAS_EXPANDER_STATUS_CHANGE: ++ mptsas_send_expander_event(fw_event); ++ break; ++ case MPI_EVENT_SAS_PHY_LINK_STATUS: ++ mptsas_send_link_status_event(fw_event); ++ break; ++ case MPI_EVENT_QUEUE_FULL: ++ mptsas_handle_queue_full_event(fw_event); ++ break; ++ } ++} ++ ++ ++ ++/** + * mptsas_get_lun_number - returns the first entry in report_luns table + * @ioc: Pointer to MPT_ADAPTER structure + * @channel: +@@ -1480,13 +1913,13 @@ + u32 length, num_luns; + + iocmd = NULL; +- hd = shost_priv(ioc->sh); ++ hd = shost_private(ioc->sh); + lun_data_len = (255 * sizeof(struct scsi_lun)); + lun_data = pci_alloc_consistent(ioc->pcidev, lun_data_len, + &lun_data_dma); + if (!lun_data) { + printk(MYIOC_s_ERR_FMT "%s: pci_alloc_consistent(%d) FAILED!\n", +- ioc->name, __func__, lun_data_len); ++ ioc->name, __FUNCTION__, lun_data_len); + rc = -ENOMEM; + goto out; + } +@@ -1494,7 +1927,7 @@ + iocmd = kzalloc(sizeof(INTERNAL_CMD), GFP_KERNEL); + if (!iocmd) { + printk(MYIOC_s_ERR_FMT "%s: kzalloc(%zd) FAILED!\n", +- ioc->name, __func__, sizeof(INTERNAL_CMD)); ++ ioc->name, __FUNCTION__, sizeof(INTERNAL_CMD)); + rc = -ENOMEM; + goto out; + } +@@ -1512,14 +1945,14 @@ + if ((rc = mptscsih_do_cmd(hd, iocmd)) < 0) { + printk(MYIOC_s_ERR_FMT "%s: fw_channel=%d fw_id=%d: " + "report_luns failed due to rc=0x%x\n", ioc->name, +- __func__, channel, id, rc); ++ __FUNCTION__, channel, id, rc); + goto out; + } + + if (rc != MPT_SCANDV_GOOD) { + printk(MYIOC_s_ERR_FMT "%s: fw_channel=%d fw_id=%d: " + "report_luns failed due to rc=0x%x\n", ioc->name, +- __func__, channel, id, rc); ++ __FUNCTION__, channel, id, rc); + rc = -rc; + goto out; + } +@@ -1532,7 +1965,7 @@ + if (!num_luns) + goto out; + /* return 1st lun in the list */ +- *lun = scsilun_to_int(&lun_data[1]); ++ *lun = mpt_scsilun_to_int(&lun_data[1]); + + #if 0 + /* some debugging, left commented out */ +@@ -1552,19 +1985,6 @@ + } + + /** +- * enum device_state - +- * @DEVICE_RETRY: need to retry the TUR +- * @DEVICE_ERROR: TUR return error, don't add device +- * @DEVICE_READY: device can be added +- * +- */ +-enum device_state{ +- DEVICE_RETRY, +- DEVICE_ERROR, +- DEVICE_READY, +-}; +- +-/** + * mptsas_test_unit_ready - + * @ioc: Pointer to MPT_ADAPTER structure + * @channel: +@@ -1576,18 +1996,20 @@ + mptsas_test_unit_ready(MPT_ADAPTER *ioc, u8 channel, u8 id, u16 count) + { + INTERNAL_CMD *iocmd; +- MPT_SCSI_HOST *hd = shost_priv(ioc->sh); ++ MPT_SCSI_HOST *hd = shost_private(ioc->sh); + enum device_state state; + int rc; + u8 skey, asc, ascq; ++ u8 retry_ua; + + if (count >= mpt_cmd_retry_count) + return DEVICE_ERROR; + ++ retry_ua = 0; + iocmd = kzalloc(sizeof(INTERNAL_CMD), GFP_KERNEL); + if (!iocmd) { + printk(MYIOC_s_ERR_FMT "%s: kzalloc(%zd) FAILED!\n", +- __func__, ioc->name, sizeof(INTERNAL_CMD)); ++ __FUNCTION__, ioc->name, sizeof(INTERNAL_CMD)); + return DEVICE_ERROR; + } + +@@ -1606,31 +2028,31 @@ + + retry: + devtprintk(ioc, printk(MYIOC_s_DEBUG_FMT "%s: fw_channel=%d " +- "fw_id=%d retry=%d\n", ioc->name, __func__, channel, id, count)); ++ "fw_id=%d retry=%d\n", ioc->name, __FUNCTION__, channel, id, count)); + rc = mptscsih_do_cmd(hd, iocmd); + devtprintk(ioc, printk(MYIOC_s_DEBUG_FMT "%s: rc=0x%02x\n", +- ioc->name, __func__, rc)); ++ ioc->name, __FUNCTION__, rc)); + if (rc < 0) { + printk(MYIOC_s_ERR_FMT "%s: fw_channel=%d fw_id=%d: " + "tur failed due to timeout\n", ioc->name, +- __func__, channel, id); ++ __FUNCTION__, channel, id); + goto tur_done; + } + +- switch (rc) { ++ switch(rc) { + case MPT_SCANDV_GOOD: + state = DEVICE_READY; + goto tur_done; + case MPT_SCANDV_BUSY: + devtprintk(ioc, printk(MYIOC_s_DEBUG_FMT "%s: " + "fw_channel=%d fw_id=%d : device busy\n", +- ioc->name, __func__, channel, id)); ++ ioc->name, __FUNCTION__, channel, id)); + state = DEVICE_RETRY; + break; + case MPT_SCANDV_DID_RESET: + devtprintk(ioc, printk(MYIOC_s_DEBUG_FMT "%s: " + "fw_channel=%d fw_id=%d : did reset\n", +- ioc->name, __func__, channel, id)); ++ ioc->name, __FUNCTION__, channel, id)); + state = DEVICE_RETRY; + break; + case MPT_SCANDV_SENSE: +@@ -1641,7 +2063,7 @@ + devtprintk(ioc, printk(MYIOC_s_DEBUG_FMT "%s: " + "fw_channel=%d fw_id=%d : [sense_key,asc," + "ascq]: [0x%02x,0x%02x,0x%02x]\n", ioc->name, +- __func__, channel, id, skey, asc, ascq)); ++ __FUNCTION__, channel, id, skey, asc, ascq)); + + if (skey == UNIT_ATTENTION) { + state = DEVICE_RETRY; +@@ -1665,7 +2087,7 @@ + break; + } + } else if (skey == ILLEGAL_REQUEST) { +- /* try sending a tur to a non-zero lun number */ ++ /* try sending a tur to a non-zero lun number */ + if (!iocmd->lun && !mptsas_get_lun_number(ioc, + channel, id, &iocmd->lun) && iocmd->lun) + goto retry; +@@ -1673,25 +2095,25 @@ + printk(MYIOC_s_ERR_FMT "%s: fw_channel=%d fw_id=%d : " + "tur failed due to [sense_key,asc,ascq]: " + "[0x%02x,0x%02x,0x%02x]\n", ioc->name, +- __func__, channel, id, skey, asc, ascq); ++ __FUNCTION__, channel, id, skey, asc, ascq); + goto tur_done; + case MPT_SCANDV_SELECTION_TIMEOUT: + printk(MYIOC_s_ERR_FMT "%s: fw_channel=%d fw_id=%d: " + "tur failed due to no device\n", ioc->name, +- __func__, channel, ++ __FUNCTION__, channel, + id); + goto tur_done; + case MPT_SCANDV_SOME_ERROR: + printk(MYIOC_s_ERR_FMT "%s: fw_channel=%d fw_id=%d: " + "tur failed due to some error\n", ioc->name, +- __func__, ++ __FUNCTION__, + channel, id); + goto tur_done; + default: + printk(MYIOC_s_ERR_FMT + "%s: fw_channel=%d fw_id=%d: tur failed due to " +- "unknown rc=0x%02x\n", ioc->name, __func__, +- channel, id, rc); ++ "unknown rc=0x%02x\n", ioc->name, __FUNCTION__, ++ channel, id, rc ); + goto tur_done; + } + tur_done: +@@ -1714,19 +2136,19 @@ + u8 rc; + MPT_ADAPTER *ioc = hd->ioc; + +- if (sdev->inquiry[8] == 'H' && ++ if ( sdev->inquiry[8] == 'H' && + sdev->inquiry[9] == 'P' && + sdev->inquiry[10] == ' ' && + sdev->inquiry[11] == ' ' && + sdev->inquiry[12] == ' ' && + sdev->inquiry[13] == ' ' && + sdev->inquiry[14] == ' ' && +- sdev->inquiry[15] == ' ') { ++ sdev->inquiry[15] == ' ' ) { + + iocmd = kzalloc(sizeof(INTERNAL_CMD), GFP_KERNEL); + if (!iocmd) { + printk(MYIOC_s_ERR_FMT "%s: kzalloc(%zd) FAILED!\n", +- __func__, ioc->name, sizeof(INTERNAL_CMD)); ++ __FUNCTION__, ioc->name, sizeof(INTERNAL_CMD)); + return; + } + iocmd->id = vdevice->vtarget->id; +@@ -1758,10 +2180,11 @@ + mptsas_slave_configure(struct scsi_device *sdev) + { + struct Scsi_Host *host = sdev->host; +- MPT_SCSI_HOST *hd = shost_priv(host); +- MPT_ADAPTER *ioc = hd->ioc; ++ MPT_SCSI_HOST *hd = shost_private(host); ++ MPT_ADAPTER *ioc = hd->ioc; ++ + VirtDevice *vdevice = sdev->hostdata; +- ++ + + if (vdevice->vtarget->deleted) { + sdev_printk(KERN_INFO, sdev, "clearing deleted flag\n"); +@@ -1782,7 +2205,7 @@ + mptsas_add_device_component_starget(ioc, scsi_target(sdev)); + + if (sdev->type == TYPE_TAPE && +- (ioc->facts.IOCCapabilities & MPI_IOCFACTS_CAPABILITY_TLR)) ++ (ioc->facts.IOCCapabilities & MPI_IOCFACTS_CAPABILITY_TLR )) + mptsas_issue_tlr(hd, sdev); + out: + +@@ -1798,7 +2221,7 @@ + mptsas_target_alloc(struct scsi_target *starget) + { + struct Scsi_Host *host = dev_to_shost(&starget->dev); +- MPT_SCSI_HOST *hd = shost_priv(host); ++ MPT_SCSI_HOST *hd = shost_private(host); + VirtTarget *vtarget; + u8 id, channel; + struct sas_rphy *rphy; +@@ -1824,7 +2247,7 @@ + kfree(vtarget); + return -ENXIO; + } +- for (i = 0; i < ioc->raid_data.pIocPg2->NumActiveVolumes; i++) ++ for (i=0; i < ioc->raid_data.pIocPg2->NumActiveVolumes; i++) + if (id == ioc->raid_data.pIocPg2->RaidVolume[i].VolumeID) + channel = ioc->raid_data.pIocPg2->RaidVolume[i].VolumeBus; + vtarget->raidVolume = 1; +@@ -1836,18 +2259,16 @@ + list_for_each_entry(p, &ioc->sas_topology, list) { + for (i = 0; i < p->num_phys; i++) { + if (p->phy_info[i].attached.sas_address != +- rphy->identify.sas_address) ++ rphy->identify.sas_address) + continue; + id = p->phy_info[i].attached.id; + channel = p->phy_info[i].attached.channel; + mptsas_set_starget(&p->phy_info[i], starget); + + starget_printk(KERN_INFO, starget, MYIOC_s_FMT +- "add device: fw_channel %d, fw_id %d, phy %d," +- " sas_addr 0x%llx\n", ++ "add device: fw_channel %d, fw_id %d, phy %d, sas_addr 0x%llx\n", + ioc->name, p->phy_info[i].attached.channel, +- p->phy_info[i].attached.id, +- p->phy_info[i].attached.phy_id, ++ p->phy_info[i].attached.id, p->phy_info[i].attached.phy_id, + (unsigned long long)p->phy_info[i].attached.sas_address); + + /* +@@ -1855,7 +2276,7 @@ + */ + if (mptscsih_is_phys_disk(ioc, channel, id)) { + id = mptscsih_raid_id_to_num(ioc, +- channel, id); ++ channel, id); + vtarget->tflags |= + MPT_TARGET_FLAGS_RAID_COMPONENT; + p->phy_info[i].attached.phys_disk_num = id; +@@ -1885,14 +2306,17 @@ + mptsas_target_destroy(struct scsi_target *starget) + { + struct Scsi_Host *host = dev_to_shost(&starget->dev); +- MPT_SCSI_HOST *hd = shost_priv(host); ++ MPT_SCSI_HOST *hd = shost_private(host); + struct sas_rphy *rphy; + struct mptsas_portinfo *p; + int i; +- MPT_ADAPTER *ioc = hd->ioc; ++ MPT_ADAPTER *ioc = hd->ioc; ++ VirtTarget *vtarget; + + if (!starget->hostdata) + return; ++ ++ vtarget = starget->hostdata; + + mptsas_del_device_component_by_os(ioc, starget->channel, + starget->id); +@@ -1915,11 +2339,12 @@ + p->phy_info[i].attached.phy_id, (unsigned long long) + p->phy_info[i].attached.sas_address); + +- mptsas_port_delete(ioc, p->phy_info[i].port_details); +- } +- } +- +- out: ++ mptsas_set_starget(&p->phy_info[i], NULL); ++ } ++ } ++ ++ out: ++ vtarget->starget = NULL; + kfree(starget->hostdata); + starget->hostdata = NULL; + } +@@ -1933,18 +2358,18 @@ + mptsas_slave_alloc(struct scsi_device *sdev) + { + struct Scsi_Host *host = sdev->host; +- MPT_SCSI_HOST *hd = shost_priv(host); ++ MPT_SCSI_HOST *hd = shost_private(host); + struct sas_rphy *rphy; + struct mptsas_portinfo *p; + VirtDevice *vdevice; + struct scsi_target *starget; + int i; +- MPT_ADAPTER *ioc = hd->ioc; ++ MPT_ADAPTER *ioc = hd->ioc; + + vdevice = kzalloc(sizeof(VirtDevice), GFP_KERNEL); + if (!vdevice) { + printk(MYIOC_s_ERR_FMT "slave_alloc kzalloc(%zd) FAILED!\n", +- ioc->name, sizeof(VirtDevice)); ++ ioc->name, sizeof(VirtDevice)); + return -ENOMEM; + } + starget = scsi_target(sdev); +@@ -2005,13 +2430,16 @@ + return 0; + } + +- hd = shost_priv(SCpnt->device->host); ++ hd = shost_private(SCpnt->device->host); + ioc = hd->ioc; + + if (ioc->sas_discovery_quiesce_io) + return SCSI_MLQUEUE_HOST_BUSY; + +- return mptscsih_qcmd(SCpnt, done); ++ if (ioc->debug_level & MPT_DEBUG_SCSI) ++ scsi_print_command(SCpnt); ++ ++ return mptscsih_qcmd(SCpnt,done); + } + + +@@ -2033,7 +2461,7 @@ + .eh_bus_reset_handler = mptscsih_bus_reset, + .eh_host_reset_handler = mptscsih_host_reset, + .bios_param = mptscsih_bios_param, +- .can_queue = MPT_FC_CAN_QUEUE, ++ .can_queue = MPT_SAS_CAN_QUEUE, + .this_id = -1, + .sg_tablesize = MPT_SCSI_SG_DEPTH, + .max_sectors = 8192, +@@ -2056,8 +2484,11 @@ + dma_addr_t dma_handle; + int error; + ++#if defined(MPT_WIDE_PORT_API_PLUS) ++ /* FIXME: only have link errors on local phys */ + if (!scsi_is_sas_phy_local(phy)) + return -EINVAL; ++#endif + + hdr.PageVersion = MPI_SASPHY1_PAGEVERSION; + hdr.ExtPageLength = 0; +@@ -2149,8 +2580,11 @@ + unsigned long timeleft; + int error = -ERESTARTSYS; + ++#if defined(MPT_WIDE_PORT_API_PLUS) ++ /* FIXME: fusion doesn't allow non-local phy reset */ + if (!scsi_is_sas_phy_local(phy)) + return -EINVAL; ++#endif + + /* not implemented for expanders */ + if (phy->identify.target_port_protocols & SAS_PROTOCOL_SMP) +@@ -2181,7 +2615,7 @@ + error = -ETIME; + mpt_free_msg_frame(ioc, mf); + if (ioc->sas_mgmt.status & MPT_MGMT_STATUS_DID_IOCRESET) +- goto out; ++ goto out_unlock; + if (!timeleft) { + if (mpt_SoftResetHandler(ioc, CAN_SLEEP) != 0) + mpt_HardResetHandler(ioc, CAN_SLEEP); +@@ -2248,8 +2682,7 @@ + memset(&enclosure_info, 0, sizeof(struct mptsas_enclosure)); + error = mptsas_sas_enclosure_pg0(ioc, &enclosure_info, + (MPI_SAS_ENCLOS_PGAD_FORM_HANDLE << +- MPI_SAS_ENCLOS_PGAD_FORM_SHIFT), +- enclosure_handle); ++ MPI_SAS_ENCLOS_PGAD_FORM_SHIFT), enclosure_handle); + if (!error) + *identifier = enclosure_info.enclosure_logical_id; + return error; +@@ -2283,6 +2716,7 @@ + return rc; + } + ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,26)) + static int mptsas_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy, + struct request *req) + { +@@ -2299,16 +2733,14 @@ + u64 sas_address = 0; + + if (!rsp) { +- printk(MYIOC_s_ERR_FMT +- "%s: the smp response space is missing\n", ++ printk(MYIOC_s_ERR_FMT "%s: the smp response space is missing\n", + ioc->name, __func__); + return -EINVAL; + } + + /* do we need to support multiple segments? */ + if (req->bio->bi_vcnt > 1 || rsp->bio->bi_vcnt > 1) { +- printk(MYIOC_s_ERR_FMT +- "%s: multiple segments req %u %u, rsp %u %u\n", ++ printk(MYIOC_s_ERR_FMT "%s: multiple segments req %u %u, rsp %u %u\n", + ioc->name, __func__, req->bio->bi_vcnt, req->data_len, + rsp->bio->bi_vcnt, rsp->data_len); + return -EINVAL; +@@ -2430,13 +2862,17 @@ + out: + return ret; + } ++#endif ++ + + static struct sas_function_template mptsas_transport_functions = { + .get_linkerrors = mptsas_get_linkerrors, + .get_enclosure_identifier = mptsas_get_enclosure_identifier, + .get_bay_identifier = mptsas_get_bay_identifier, + .phy_reset = mptsas_phy_reset, ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,26)) + .smp_handler = mptsas_smp_handler, ++#endif + }; + + static struct scsi_transport_template *mptsas_transport_template; +@@ -2495,7 +2931,7 @@ + + port_info->num_phys = buffer->NumPhys; + port_info->phy_info = kcalloc(port_info->num_phys, +- sizeof(struct mptsas_phyinfo), GFP_KERNEL); ++ sizeof(struct mptsas_phyinfo),GFP_KERNEL); + if (!port_info->phy_info) { + error = -ENOMEM; + goto out_free_consistent; +@@ -2516,8 +2952,6 @@ + port_info->phy_info[i].portinfo = port_info; + port_info->phy_info[i].handle = + le16_to_cpu(buffer->PhyData[i].ControllerDevHandle); +- port_info->phy_info[i].port_flags = +- buffer->PhyData[i].PortFlags; + } + + out_free_consistent: +@@ -2653,8 +3087,6 @@ + phy_info->programmed_link_rate = buffer->ProgrammedLinkRate; + phy_info->identify.handle = le16_to_cpu(buffer->OwnerDevHandle); + phy_info->attached.handle = le16_to_cpu(buffer->AttachedDevHandle); +- phy_info->change_count = buffer->ChangeCount; +- phy_info->phy_info = le32_to_cpu(buffer->PhyInfo); + + out_free_consistent: + pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4, +@@ -2816,7 +3248,7 @@ + /* save config data */ + port_info->num_phys = (buffer->NumPhys) ? buffer->NumPhys : 1; + port_info->phy_info = kcalloc(port_info->num_phys, +- sizeof(struct mptsas_phyinfo), GFP_KERNEL); ++ sizeof(struct mptsas_phyinfo),GFP_KERNEL); + if (!port_info->phy_info) { + error = -ENOMEM; + goto out_free_consistent; +@@ -2897,7 +3329,7 @@ + error = -ENODEV; + goto out; + } +- ++ + if (error) + goto out_free_consistent; + +@@ -2912,15 +3344,200 @@ + phy_info->hw_link_rate = buffer->HwLinkRate; + phy_info->identify.handle = le16_to_cpu(buffer->OwnerDevHandle); + phy_info->attached.handle = le16_to_cpu(buffer->AttachedDevHandle); +- phy_info->change_count = buffer->ChangeCount; +- phy_info->phy_info = le32_to_cpu(buffer->PhyInfo); +- +- out_free_consistent: +- pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4, +- buffer, dma_handle); +- out: +- return error; +-} ++ ++ out_free_consistent: ++ pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4, ++ buffer, dma_handle); ++ out: ++ return error; ++} ++ ++struct rep_manu_request{ ++ u8 smp_frame_type; ++ u8 function; ++ u8 reserved; ++ u8 request_length; ++}; ++ ++struct rep_manu_reply{ ++ u8 smp_frame_type; /* 0x41 */ ++ u8 function; /* 0x01 */ ++ u8 function_result; ++ u8 response_length; ++ u16 expander_change_count; ++ u8 reserved0[2]; ++ u8 sas_format:1; ++ u8 reserved1:7; ++ u8 reserved2[3]; ++ u8 vendor_id[SAS_EXPANDER_VENDOR_ID_LEN]; ++ u8 product_id[SAS_EXPANDER_PRODUCT_ID_LEN]; ++ u8 product_rev[SAS_EXPANDER_PRODUCT_REV_LEN]; ++ u8 component_vendor_id[SAS_EXPANDER_COMPONENT_VENDOR_ID_LEN]; ++ u16 component_id; ++ u8 component_revision_id; ++ u8 reserved3; ++ u8 vendor_specific[8]; ++}; ++ ++/** ++ * mptsas_exp_repmanufacture_info - ++ * @ioc: per adapter object ++ * @sas_address: expander sas address ++ * @edev: the sas_expander_device object ++ * ++ * Fills in the sas_expander_device object when SMP port is created. ++ * ++ * Returns 0 for success, non-zero for failure. ++ */ ++static int ++mptsas_exp_repmanufacture_info(MPT_ADAPTER *ioc, ++ u64 sas_address, struct sas_expander_device *edev) ++{ ++ MPT_FRAME_HDR *mf; ++ SmpPassthroughRequest_t *smpreq; ++ SmpPassthroughReply_t *smprep; ++ struct rep_manu_reply *manufacture_reply; ++ struct rep_manu_request *manufacture_request; ++ int ret; ++ int flagsLength; ++ unsigned long timeleft; ++ char *psge; ++ unsigned long flags; ++ void *data_out = NULL; ++ dma_addr_t data_out_dma = 0; ++ u32 sz; ++ ++ spin_lock_irqsave(&ioc->taskmgmt_lock, flags); ++ if (ioc->ioc_reset_in_progress) { ++ spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags); ++ printk(MYIOC_s_INFO_FMT "%s: host reset in progress!\n", ++ __func__, ioc->name); ++ return -EFAULT; ++ } ++ spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags); ++ ++ ret = mutex_lock_interruptible(&ioc->sas_mgmt.mutex); ++ if (ret) ++ goto out; ++ ++ mf = mpt_get_msg_frame(mptsasMgmtCtx, ioc); ++ if (!mf) { ++ ret = -ENOMEM; ++ goto out_unlock; ++ } ++ ++ smpreq = (SmpPassthroughRequest_t *)mf; ++ memset(smpreq, 0, sizeof(*smpreq)); ++ ++ sz = sizeof(struct rep_manu_request) + sizeof(struct rep_manu_reply); ++ ++ data_out = pci_alloc_consistent(ioc->pcidev, sz, &data_out_dma); ++ if (!data_out) { ++ printk(KERN_ERR "Memory allocation failure at %s:%d/%s()!\n", ++ __FILE__, __LINE__, __func__); ++ ret = -ENOMEM; ++ goto put_mf; ++ } ++ ++ manufacture_request = data_out; ++ manufacture_request->smp_frame_type = 0x40; ++ manufacture_request->function = 1; ++ manufacture_request->reserved = 0; ++ manufacture_request->request_length = 0; ++ ++ smpreq->Function = MPI_FUNCTION_SMP_PASSTHROUGH; ++ smpreq->PhysicalPort = 0xFF; ++ *((u64 *)&smpreq->SASAddress) = cpu_to_le64(sas_address); ++ smpreq->RequestDataLength = sizeof(struct rep_manu_request); ++ ++ psge = (char *) ++ (((int *) mf) + (offsetof(SmpPassthroughRequest_t, SGL) / 4)); ++ ++ flagsLength = MPI_SGE_FLAGS_SIMPLE_ELEMENT | ++ MPI_SGE_FLAGS_SYSTEM_ADDRESS | ++ MPI_SGE_FLAGS_HOST_TO_IOC | ++ MPI_SGE_FLAGS_END_OF_BUFFER; ++ flagsLength = flagsLength << MPI_SGE_FLAGS_SHIFT; ++ flagsLength |= sizeof(struct rep_manu_request); ++ ++ ioc->add_sge(psge, flagsLength, data_out_dma); ++ psge += ioc->SGE_size; ++ ++ flagsLength = MPI_SGE_FLAGS_SIMPLE_ELEMENT | ++ MPI_SGE_FLAGS_SYSTEM_ADDRESS | ++ MPI_SGE_FLAGS_IOC_TO_HOST | ++ MPI_SGE_FLAGS_END_OF_BUFFER; ++ flagsLength = flagsLength << MPI_SGE_FLAGS_SHIFT; ++ flagsLength |= sizeof(struct rep_manu_reply); ++ ioc->add_sge(psge, flagsLength, data_out_dma + ++ sizeof(struct rep_manu_request)); ++ ++ INITIALIZE_MGMT_STATUS(ioc->sas_mgmt.status) ++ mpt_put_msg_frame(mptsasMgmtCtx, ioc, mf); ++ ++ timeleft = wait_for_completion_timeout(&ioc->sas_mgmt.done, 10 * HZ); ++ if (!(ioc->sas_mgmt.status & MPT_MGMT_STATUS_COMMAND_GOOD)) { ++ ret = -ETIME; ++ mpt_free_msg_frame(ioc, mf); ++ mf = NULL; ++ if (ioc->sas_mgmt.status & MPT_MGMT_STATUS_DID_IOCRESET) ++ goto out_free; ++ if (!timeleft) { ++ if (mpt_SoftResetHandler(ioc, CAN_SLEEP) != 0) ++ mpt_HardResetHandler(ioc, CAN_SLEEP); ++ } ++ goto out_free; ++ } ++ ++ mf = NULL; ++ ++ if (ioc->sas_mgmt.status & MPT_MGMT_STATUS_RF_VALID) { ++ u8 *tmp; ++ ++ smprep = (SmpPassthroughReply_t *)ioc->sas_mgmt.reply; ++ if (le16_to_cpu(smprep->ResponseDataLength) != ++ sizeof(struct rep_manu_reply)) ++ goto out_free; ++ ++ manufacture_reply = data_out + sizeof(struct rep_manu_request); ++ strncpy(edev->vendor_id, manufacture_reply->vendor_id, ++ SAS_EXPANDER_VENDOR_ID_LEN); ++ strncpy(edev->product_id, manufacture_reply->product_id, ++ SAS_EXPANDER_PRODUCT_ID_LEN); ++ strncpy(edev->product_rev, manufacture_reply->product_rev, ++ SAS_EXPANDER_PRODUCT_REV_LEN); ++ edev->level = manufacture_reply->sas_format; ++ if (manufacture_reply->sas_format) { ++ strncpy(edev->component_vendor_id, ++ manufacture_reply->component_vendor_id, ++ SAS_EXPANDER_COMPONENT_VENDOR_ID_LEN); ++ tmp = (u8 *)&manufacture_reply->component_id; ++ edev->component_id = tmp[0] << 8 | tmp[1]; ++ edev->component_revision_id = ++ manufacture_reply->component_revision_id; ++ } ++ ++ } else { ++ printk(MYIOC_s_ERR_FMT ++ "%s: smp passthru reply failed to be returned\n", ++ ioc->name, __func__); ++ ret = -ENXIO; ++ } ++ ++out_free: ++ if (data_out_dma) ++ pci_free_consistent(ioc->pcidev, sz, data_out, data_out_dma); ++put_mf: ++ if (mf) ++ mpt_free_msg_frame(ioc, mf); ++out_unlock: ++ CLEAR_MGMT_STATUS(ioc->sas_mgmt.status) ++ mutex_unlock(&ioc->sas_mgmt.mutex); ++out: ++ return ret; ++ ++} ++ + + /** + * mptsas_parse_device_info - +@@ -2999,7 +3616,9 @@ + { + MPT_ADAPTER *ioc; + struct sas_phy *phy; ++#if defined(MPT_WIDE_PORT_API) + struct sas_port *port; ++#endif + int error = 0; + + if (!dev) { +@@ -3016,6 +3635,9 @@ + } else + phy = phy_info->phy; + ++#if !defined(MPT_WIDE_PORT_API) ++ phy->port_identifier = phy_info->port_id; ++#endif + mptsas_parse_device_info(&phy->identify, &phy_info->identify); + + /* +@@ -3101,6 +3723,10 @@ + + if (!phy_info->phy) { + ++#if !defined(MPT_WIDE_PORT_API_PLUS) ++ if (local) ++ phy->local_attached = 1; ++#endif + error = sas_phy_add(phy); + if (error) { + sas_phy_free(phy); +@@ -3113,9 +3739,12 @@ + !phy_info->port_details) + goto out; + ++#if defined(MPT_WIDE_PORT_API) + port = mptsas_get_port(phy_info); ++#endif + ioc = phy_to_ioc(phy_info->phy); + ++#if defined(MPT_WIDE_PORT_API) + if (phy_info->sas_port_add_phy) { + if (!port) { + port = sas_port_alloc_num(dev); +@@ -3136,21 +3765,41 @@ + ioc->name, port->port_identifier, + (unsigned long long)phy_info->attached.sas_address)); + } ++ dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT "sas_port_add_phy: phy_id=%d\n", ++ ioc->name, phy_info->phy_id)); + sas_port_add_phy(port, phy_info->phy); + phy_info->sas_port_add_phy = 0; + devtprintk(ioc, dev_printk(KERN_DEBUG, &phy_info->phy->dev, + MYIOC_s_FMT "add phy %d, phy-obj (0x%p)\n", ioc->name, + phy_info->phy_id, phy_info->phy)); + } +- ++#else ++ /* ++ * wide port suport ++ * only report the expander or end device once ++ */ ++ if (phy_info->attached.wide_port_enable && ++ (phy_info->phy_id != mptsas_get_rphy_id(phy_info))) ++ goto out; ++ ++#endif ++ ++#if defined(MPT_WIDE_PORT_API) + if (!mptsas_get_rphy(phy_info) && port && !port->rphy) { ++#else ++ if (!mptsas_get_rphy(phy_info)) { ++#endif + + struct sas_rphy *rphy; + struct device *parent; + struct sas_identify identify; + + parent = dev->parent->parent; +- ++ /* ++ * Let the hotplug_work thread handle processing ++ * the adding/removing of devices that occur ++ * after start of day. ++ */ + if (mptsas_is_end_device(&phy_info->attached) && + phy_info->attached.handle_parent) { + goto out; +@@ -3162,29 +3811,42 @@ + int i; + + port_info = ioc->hba_port_info; ++ + for (i = 0; i < port_info->num_phys; i++) + if (port_info->phy_info[i].identify.sas_address == + identify.sas_address) { ++#if defined(MPT_WIDE_PORT_API_PLUS) + sas_port_mark_backlink(port); ++#endif + goto out; +- } ++ } + + } else if (scsi_is_sas_rphy(parent)) { + struct sas_rphy *parent_rphy = dev_to_rphy(parent); + if (identify.sas_address == + parent_rphy->identify.sas_address) { ++#if defined(MPT_WIDE_PORT_API_PLUS) + sas_port_mark_backlink(port); ++#endif + goto out; + } + } + + switch (identify.device_type) { + case SAS_END_DEVICE: ++#if defined(MPT_WIDE_PORT_API) + rphy = sas_end_device_alloc(port); ++#else ++ rphy = sas_end_device_alloc(phy); ++#endif + break; + case SAS_EDGE_EXPANDER_DEVICE: + case SAS_FANOUT_EXPANDER_DEVICE: ++#if defined(MPT_WIDE_PORT_API) + rphy = sas_expander_alloc(port, identify.device_type); ++#else ++ rphy = sas_expander_alloc(phy, identify.device_type); ++#endif + break; + default: + rphy = NULL; +@@ -3207,6 +3869,11 @@ + goto out; + } + mptsas_set_rphy(ioc, phy_info, rphy); ++ if (identify.device_type == SAS_EDGE_EXPANDER_DEVICE || ++ identify.device_type == SAS_FANOUT_EXPANDER_DEVICE) ++ mptsas_exp_repmanufacture_info(ioc, ++ identify.sas_address, ++ rphy_to_expander_device(rphy)); + } + + out: +@@ -3226,7 +3893,7 @@ + int error = -ENOMEM, i; + + hba = kzalloc(sizeof(struct mptsas_portinfo), GFP_KERNEL); +- if (!hba) ++ if (! hba) + goto out; + + error = mptsas_sas_io_unit_pg0(ioc, hba); +@@ -3248,8 +3915,6 @@ + hba->phy_info[i].handle; + port_info->phy_info[i].port_id = + hba->phy_info[i].port_id; +- port_info->phy_info[i].port_flags = +- hba->phy_info[i].port_flags; + } + kfree(hba->phy_info); + kfree(hba); +@@ -3296,1062 +3961,6 @@ + return error; + } + +-/** +- * mptsas_find_phyinfo_by_sas_address - +- * @ioc: Pointer to MPT_ADAPTER structure +- * @sas_address: +- * +- **/ +-static struct mptsas_phyinfo * +-mptsas_find_phyinfo_by_sas_address(MPT_ADAPTER *ioc, u64 sas_address) +-{ +- struct mptsas_portinfo *port_info; +- struct mptsas_phyinfo *phy_info = NULL; +- int i; +- +- mutex_lock(&ioc->sas_topology_mutex); +- list_for_each_entry(port_info, &ioc->sas_topology, list) { +- for (i = 0; i < port_info->num_phys; i++) { +- if (!mptsas_is_end_device( +- &port_info->phy_info[i].attached)) +- continue; +- if (port_info->phy_info[i].attached.sas_address +- != sas_address) +- continue; +- phy_info = &port_info->phy_info[i]; +- break; +- } +- } +- mutex_unlock(&ioc->sas_topology_mutex); +- return phy_info; +-} +- +-/** +- * mptsas_find_phyinfo_by_phys_disk_num - +- * @ioc: Pointer to MPT_ADAPTER structure +- * @phys_disk_num: +- * @channel: +- * @id: +- * +- **/ +-static struct mptsas_phyinfo * +-mptsas_find_phyinfo_by_phys_disk_num(MPT_ADAPTER *ioc, u8 phys_disk_num, +- u8 channel, u8 id) +-{ +- struct mptsas_phyinfo *phy_info; +- struct mptsas_portinfo *port_info; +- RaidPhysDiskPage1_t *phys_disk = NULL; +- int num_paths; +- u64 sas_address = 0; +- int i; +- +- phy_info = NULL; +- if (!ioc->raid_data.pIocPg3) +- return NULL; +- /* dual port support */ +- num_paths = mpt_raid_phys_disk_get_num_paths(ioc, phys_disk_num); +- if (!num_paths) +- goto out; +- phys_disk = kzalloc(offsetof(RaidPhysDiskPage1_t, Path) + +- (num_paths * sizeof(RAID_PHYS_DISK1_PATH)), GFP_KERNEL); +- if (!phys_disk) +- goto out; +- mpt_raid_phys_disk_pg1(ioc, phys_disk_num, phys_disk); +- for (i = 0; i < num_paths; i++) { +- if ((phys_disk->Path[i].Flags & 1) != 0) +- /* entry no longer valid */ +- continue; +- if ((id == phys_disk->Path[i].PhysDiskID) && +- (channel == phys_disk->Path[i].PhysDiskBus)) { +- memcpy(&sas_address, &phys_disk->Path[i].WWID, +- sizeof(u64)); +- phy_info = mptsas_find_phyinfo_by_sas_address(ioc, +- sas_address); +- goto out; +- } +- } +- +- out: +- kfree(phys_disk); +- if (phy_info) +- return phy_info; +- +- /* +- * Extra code to handle RAID0 case, where the sas_address is not updated +- * in phys_disk_page_1 when hotswapped +- */ +- mutex_lock(&ioc->sas_topology_mutex); +- list_for_each_entry(port_info, &ioc->sas_topology, list) { +- for (i = 0; i < port_info->num_phys && !phy_info; i++) { +- if (!mptsas_is_end_device( +- &port_info->phy_info[i].attached)) +- continue; +- if (port_info->phy_info[i].attached.phys_disk_num == ~0) +- continue; +- if (port_info->phy_info[i].attached.phys_disk_num == +- phys_disk_num && +- port_info->phy_info[i].attached.id == id && +- port_info->phy_info[i].attached.channel == channel) +- phy_info = &port_info->phy_info[i]; +- } +- } +- mutex_unlock(&ioc->sas_topology_mutex); +- return phy_info; +-} +- +-/** +- * mptsas_reprobe_lun - +- * @sdev: +- * @data: +- * +- **/ +-static void +-mptsas_reprobe_lun(struct scsi_device *sdev, void *data) +-{ +- int rc; +- +- sdev->no_uld_attach = data ? 1 : 0; +- rc = scsi_device_reprobe(sdev); +-} +- +-/** +- * mptsas_reprobe_target - +- * @starget: +- * @uld_attach: +- * +- **/ +-static void +-mptsas_reprobe_target(struct scsi_target *starget, int uld_attach) +-{ +- starget_for_each_device(starget, uld_attach ? (void *)1 : NULL, +- mptsas_reprobe_lun); +-} +- +-/** +- * mptsas_adding_inactive_raid_components - +- * @ioc: Pointer to MPT_ADAPTER structure +- * @channel: +- * @id: +- * +- * +- **/ +-static void +-mptsas_adding_inactive_raid_components(MPT_ADAPTER *ioc, u8 channel, u8 id) +-{ +- CONFIGPARMS cfg; +- ConfigPageHeader_t hdr; +- dma_addr_t dma_handle; +- pRaidVolumePage0_t buffer = NULL; +- RaidPhysDiskPage0_t phys_disk; +- int i; +- struct mptsas_phyinfo *phy_info; +- struct mptsas_devinfo sas_device; +- +- memset(&cfg, 0 , sizeof(CONFIGPARMS)); +- memset(&hdr, 0 , sizeof(ConfigPageHeader_t)); +- hdr.PageType = MPI_CONFIG_PAGETYPE_RAID_VOLUME; +- cfg.pageAddr = (channel << 8) + id; +- cfg.cfghdr.hdr = &hdr; +- cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER; +- cfg.timeout = SAS_CONFIG_PAGE_TIMEOUT; +- +- if (mpt_config(ioc, &cfg) != 0) +- goto out; +- +- if (!hdr.PageLength) +- goto out; +- +- buffer = pci_alloc_consistent(ioc->pcidev, hdr.PageLength * 4, +- &dma_handle); +- +- if (!buffer) +- goto out; +- +- cfg.physAddr = dma_handle; +- cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT; +- +- if (mpt_config(ioc, &cfg) != 0) +- goto out; +- +- if (!(buffer->VolumeStatus.Flags & +- MPI_RAIDVOL0_STATUS_FLAG_VOLUME_INACTIVE)) +- goto out; +- +- if (!buffer->NumPhysDisks) +- goto out; +- +- for (i = 0; i < buffer->NumPhysDisks; i++) { +- +- if (mpt_raid_phys_disk_pg0(ioc, +- buffer->PhysDisk[i].PhysDiskNum, &phys_disk) != 0) +- continue; +- +- if (mptsas_sas_device_pg0(ioc, &sas_device, +- (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID << +- MPI_SAS_DEVICE_PGAD_FORM_SHIFT), +- (phys_disk.PhysDiskBus << 8) + +- phys_disk.PhysDiskID)) +- continue; +- +- phy_info = mptsas_find_phyinfo_by_sas_address(ioc, +- sas_device.sas_address); +- mptsas_add_end_device(ioc, phy_info); +- } +- +- out: +- if (buffer) +- pci_free_consistent(ioc->pcidev, hdr.PageLength * 4, buffer, +- dma_handle); +-} +- +-/** +- * mptsas_add_end_device - report a new end device to sas transport layer +- * @ioc: Pointer to MPT_ADAPTER structure +- * @phy_info: decribes attached device +- * +- * return (0) success (1) failure +- * +- **/ +-static int +-mptsas_add_end_device(MPT_ADAPTER *ioc, struct mptsas_phyinfo *phy_info) +-{ +- struct sas_rphy *rphy; +- struct sas_port *port; +- struct sas_identify identify; +- char *ds = NULL; +- u8 fw_id; +- +- if (!phy_info) { +- dfailprintk(ioc, printk(MYIOC_s_ERR_FMT +- "%s: exit at line=%d\n", ioc->name, +- __func__, __LINE__)); +- return 1; +- } +- +- fw_id = phy_info->attached.id; +- +- if (mptsas_get_rphy(phy_info)) { +- dfailprintk(ioc, printk(MYIOC_s_ERR_FMT +- "%s: fw_id=%d exit at line=%d\n", ioc->name, +- __func__, fw_id, __LINE__)); +- return 2; +- } +- +- port = mptsas_get_port(phy_info); +- if (!port) { +- dfailprintk(ioc, printk(MYIOC_s_ERR_FMT +- "%s: fw_id=%d exit at line=%d\n", ioc->name, +- __func__, fw_id, __LINE__)); +- return 3; +- } +- +- if (phy_info->attached.device_info & +- MPI_SAS_DEVICE_INFO_SSP_TARGET) +- ds = "ssp"; +- if (phy_info->attached.device_info & +- MPI_SAS_DEVICE_INFO_STP_TARGET) +- ds = "stp"; +- if (phy_info->attached.device_info & +- MPI_SAS_DEVICE_INFO_SATA_DEVICE) +- ds = "sata"; +- +- printk(MYIOC_s_INFO_FMT "attaching %s device: fw_channel %d, fw_id %d," +- " phy %d, sas_addr 0x%llx\n", ioc->name, ds, +- phy_info->attached.channel, phy_info->attached.id, +- phy_info->attached.phy_id, (unsigned long long) +- phy_info->attached.sas_address); +- +- mptsas_parse_device_info(&identify, &phy_info->attached); +- rphy = sas_end_device_alloc(port); +- if (!rphy) { +- dfailprintk(ioc, printk(MYIOC_s_ERR_FMT +- "%s: fw_id=%d exit at line=%d\n", ioc->name, +- __func__, fw_id, __LINE__)); +- return 5; /* non-fatal: an rphy can be added later */ +- } +- +- rphy->identify = identify; +- if (sas_rphy_add(rphy)) { +- dfailprintk(ioc, printk(MYIOC_s_ERR_FMT +- "%s: fw_id=%d exit at line=%d\n", ioc->name, +- __func__, fw_id, __LINE__)); +- sas_rphy_free(rphy); +- return 6; +- } +- mptsas_set_rphy(ioc, phy_info, rphy); +- return 0; +-} +- +-/** +- * mptsas_del_end_device - report a deleted end device to sas transport +- * layer +- * @ioc: Pointer to MPT_ADAPTER structure +- * @phy_info: decribes attached device +- * +- **/ +-static void +-mptsas_del_end_device(MPT_ADAPTER *ioc, struct mptsas_phyinfo *phy_info) +-{ +- struct sas_rphy *rphy; +- struct sas_port *port; +- struct mptsas_portinfo *port_info; +- struct mptsas_phyinfo *phy_info_parent; +- int i; +- struct scsi_target *starget; +- char *ds = NULL; +- u8 fw_id; +- u64 sas_address; +- +- if (!phy_info) +- return; +- +- fw_id = phy_info->attached.id; +- sas_address = phy_info->attached.sas_address; +- +- if (!phy_info->port_details) { +- dfailprintk(ioc, printk(MYIOC_s_ERR_FMT +- "%s: fw_id=%d exit at line=%d\n", ioc->name, +- __func__, fw_id, __LINE__)); +- return; +- } +- rphy = mptsas_get_rphy(phy_info); +- if (!rphy) { +- dfailprintk(ioc, printk(MYIOC_s_ERR_FMT +- "%s: fw_id=%d exit at line=%d\n", ioc->name, +- __func__, fw_id, __LINE__)); +- return; +- } +- if (phy_info->attached.device_info & +- MPI_SAS_DEVICE_INFO_SSP_TARGET) +- ds = "ssp"; +- if (phy_info->attached.device_info & +- MPI_SAS_DEVICE_INFO_STP_TARGET) +- ds = "stp"; +- if (phy_info->attached.device_info & +- MPI_SAS_DEVICE_INFO_SATA_DEVICE) +- ds = "sata"; +- +- starget = mptsas_get_starget(phy_info); +- +- printk(MYIOC_s_INFO_FMT "removing %s device: fw_channel %d," +- " fw_id %d, phy %d, sas_addr 0x%llx\n", ioc->name, ds, +- phy_info->attached.channel, phy_info->attached.id, +- phy_info->attached.phy_id, (unsigned long long) +- sas_address); +- +- port = mptsas_get_port(phy_info); +- if (!port) { +- dfailprintk(ioc, printk(MYIOC_s_ERR_FMT +- "%s: fw_id=%d exit at line=%d\n", ioc->name, +- __func__, fw_id, __LINE__)); +- return; +- } +- port_info = phy_info->portinfo; +- phy_info_parent = port_info->phy_info; +- for (i = 0; i < port_info->num_phys; i++, phy_info_parent++) { +- if (!phy_info_parent->phy) +- continue; +- if (phy_info_parent->attached.sas_address != +- sas_address) +- continue; +- dev_printk(KERN_DEBUG, &phy_info_parent->phy->dev, +- MYIOC_s_FMT "delete phy %d, phy-obj (0x%p)\n", +- ioc->name, phy_info_parent->phy_id, +- phy_info_parent->phy); +- sas_port_delete_phy(port, phy_info_parent->phy); +- } +- +- dev_printk(KERN_DEBUG, &port->dev, MYIOC_s_FMT +- "delete port %d, sas_addr (0x%llx)\n", ioc->name, +- port->port_identifier, (unsigned long long)sas_address); +- sas_port_delete(port); +-} +- +-struct mptsas_phyinfo * +-mptsas_refreshing_device_handles(MPT_ADAPTER *ioc, +- struct mptsas_devinfo *sas_device) +-{ +- struct mptsas_phyinfo *phy_info; +- struct mptsas_portinfo *port_info; +- int i; +- +- phy_info = mptsas_find_phyinfo_by_sas_address(ioc, +- sas_device->sas_address); +- if (!phy_info) +- goto out; +- port_info = phy_info->portinfo; +- if (!port_info) +- goto out; +- mutex_lock(&ioc->sas_topology_mutex); +- for (i = 0; i < port_info->num_phys; i++) { +- if (port_info->phy_info[i].attached.sas_address != +- sas_device->sas_address) +- continue; +- port_info->phy_info[i].attached.channel = sas_device->channel; +- port_info->phy_info[i].attached.id = sas_device->id; +- port_info->phy_info[i].attached.sas_address = +- sas_device->sas_address; +- port_info->phy_info[i].attached.handle = sas_device->handle; +- port_info->phy_info[i].attached.handle_parent = +- sas_device->handle_parent; +- port_info->phy_info[i].attached.handle_enclosure = +- sas_device->handle_enclosure; +- } +- mutex_unlock(&ioc->sas_topology_mutex); +- out: +- return phy_info; +-} +- +- +-/** +- * mptsas_hotplug_work - Work queue thread to handle SAS hotplug events +- * +- * +- **/ +-static void +-mptsas_hotplug_work(MPT_ADAPTER *ioc, struct fw_event_work *fw_event, +- struct mptsas_hotplug_event *hot_plug_info) +-{ +- struct mptsas_phyinfo *phy_info; +- struct scsi_target *starget; +- struct mptsas_devinfo sas_device; +- VirtTarget *vtarget; +- enum device_state state; +- int i; +- +- switch (hot_plug_info->event_type) { +- +- case MPTSAS_ADD_PHYSDISK: +- +- if (!ioc->raid_data.pIocPg2) +- break; +- +- for (i = 0; i < ioc->raid_data.pIocPg2->NumActiveVolumes; i++) { +- if (ioc->raid_data.pIocPg2->RaidVolume[i].VolumeID == +- hot_plug_info->id) { +- printk(MYIOC_s_WARN_FMT "firmware bug: unable " +- "to add hidden disk - target_id matchs " +- "volume_id\n", ioc->name); +- mptsas_free_fw_event(ioc, fw_event); +- return; +- } +- } +- mpt_findImVolumes(ioc); +- +- case MPTSAS_ADD_DEVICE: +- memset(&sas_device, 0, sizeof(struct mptsas_devinfo)); +- mptsas_sas_device_pg0(ioc, &sas_device, +- (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID << +- MPI_SAS_DEVICE_PGAD_FORM_SHIFT), +- (hot_plug_info->channel << 8) + +- hot_plug_info->id); +- +- if (!sas_device.handle) +- return; +- +- phy_info = mptsas_refreshing_device_handles(ioc, &sas_device); +- if (!phy_info) +- break; +- +- if (mptsas_get_rphy(phy_info)) +- break; +- +- state = mptsas_test_unit_ready(ioc, phy_info->attached.channel, +- phy_info->attached.id, fw_event->retries); +- +- if (state == DEVICE_RETRY && !ioc->fw_events_off) { +- mptsas_requeue_fw_event(ioc, fw_event, 1000); +- return; +- } +- +- if (state == DEVICE_READY) +- mptsas_add_end_device(ioc, phy_info); +- break; +- +- case MPTSAS_DEL_DEVICE: +- +- if (!ioc->disable_hotplug_remove) { +- phy_info = mptsas_find_phyinfo_by_sas_address(ioc, +- hot_plug_info->sas_address); +- mptsas_del_end_device(ioc, phy_info); +- } +- break; +- +- case MPTSAS_DEL_PHYSDISK: +- +- mpt_findImVolumes(ioc); +- +- phy_info = mptsas_find_phyinfo_by_phys_disk_num( +- ioc, hot_plug_info->phys_disk_num, hot_plug_info->channel, +- hot_plug_info->id); +- mptsas_del_end_device(ioc, phy_info); +- break; +- +- case MPTSAS_ADD_PHYSDISK_REPROBE: +- +- if (mptsas_sas_device_pg0(ioc, &sas_device, +- (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID << +- MPI_SAS_DEVICE_PGAD_FORM_SHIFT), +- (hot_plug_info->channel << 8) + hot_plug_info->id)) { +- dfailprintk(ioc, printk(MYIOC_s_ERR_FMT +- "%s: fw_id=%d exit at line=%d\n", ioc->name, +- __func__, hot_plug_info->id, __LINE__)); +- break; +- } +- +- phy_info = mptsas_find_phyinfo_by_sas_address( +- ioc, sas_device.sas_address); +- +- if (!phy_info) { +- dfailprintk(ioc, printk(MYIOC_s_ERR_FMT +- "%s: fw_id=%d exit at line=%d\n", ioc->name, +- __func__, hot_plug_info->id, __LINE__)); +- break; +- } +- +- starget = mptsas_get_starget(phy_info); +- if (!starget) { +- dfailprintk(ioc, printk(MYIOC_s_ERR_FMT +- "%s: fw_id=%d exit at line=%d\n", ioc->name, +- __func__, hot_plug_info->id, __LINE__)); +- break; +- } +- +- vtarget = starget->hostdata; +- if (!vtarget) { +- dfailprintk(ioc, printk(MYIOC_s_ERR_FMT +- "%s: fw_id=%d exit at line=%d\n", ioc->name, +- __func__, hot_plug_info->id, __LINE__)); +- break; +- } +- +- mpt_findImVolumes(ioc); +- +- starget_printk(KERN_INFO, starget, MYIOC_s_FMT "RAID Hidding: " +- "fw_channel=%d, fw_id=%d, physdsk %d, sas_addr 0x%llx\n", +- ioc->name, hot_plug_info->channel, hot_plug_info->id, +- hot_plug_info->phys_disk_num, (unsigned long long) +- sas_device.sas_address); +- +- vtarget->id = hot_plug_info->phys_disk_num; +- vtarget->tflags |= MPT_TARGET_FLAGS_RAID_COMPONENT; +- phy_info->attached.phys_disk_num = hot_plug_info->phys_disk_num; +- mptsas_reprobe_target(starget, 1); +- break; +- +- case MPTSAS_DEL_PHYSDISK_REPROBE: +- +- if (mptsas_sas_device_pg0(ioc, &sas_device, +- (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID << +- MPI_SAS_DEVICE_PGAD_FORM_SHIFT), +- (hot_plug_info->channel << 8) + hot_plug_info->id)) { +- dfailprintk(ioc, printk(MYIOC_s_ERR_FMT +- "%s: fw_id=%d exit at line=%d\n", +- ioc->name, __func__, +- hot_plug_info->id, __LINE__)); +- break; +- } +- +- phy_info = mptsas_find_phyinfo_by_sas_address(ioc, +- sas_device.sas_address); +- if (!phy_info) { +- dfailprintk(ioc, printk(MYIOC_s_ERR_FMT +- "%s: fw_id=%d exit at line=%d\n", ioc->name, +- __func__, hot_plug_info->id, __LINE__)); +- break; +- } +- +- starget = mptsas_get_starget(phy_info); +- if (!starget) { +- dfailprintk(ioc, printk(MYIOC_s_ERR_FMT +- "%s: fw_id=%d exit at line=%d\n", ioc->name, +- __func__, hot_plug_info->id, __LINE__)); +- break; +- } +- +- vtarget = starget->hostdata; +- if (!vtarget) { +- dfailprintk(ioc, printk(MYIOC_s_ERR_FMT +- "%s: fw_id=%d exit at line=%d\n", ioc->name, +- __func__, hot_plug_info->id, __LINE__)); +- break; +- } +- +- if (!(vtarget->tflags & MPT_TARGET_FLAGS_RAID_COMPONENT)) { +- dfailprintk(ioc, printk(MYIOC_s_ERR_FMT +- "%s: fw_id=%d exit at line=%d\n", ioc->name, +- __func__, hot_plug_info->id, __LINE__)); +- break; +- } +- +- mpt_findImVolumes(ioc); +- +- starget_printk(KERN_INFO, starget, MYIOC_s_FMT "RAID Exposing:" +- " fw_channel=%d, fw_id=%d, physdsk %d, sas_addr 0x%llx\n", +- ioc->name, hot_plug_info->channel, hot_plug_info->id, +- hot_plug_info->phys_disk_num, (unsigned long long) +- sas_device.sas_address); +- +- vtarget->tflags &= ~MPT_TARGET_FLAGS_RAID_COMPONENT; +- vtarget->id = hot_plug_info->id; +- phy_info->attached.phys_disk_num = ~0; +- mptsas_reprobe_target(starget, 0); +- mptsas_add_device_component_by_fw(ioc, +- hot_plug_info->channel, hot_plug_info->id); +- break; +- +- case MPTSAS_ADD_RAID: +- +- mpt_findImVolumes(ioc); +- printk(MYIOC_s_INFO_FMT "attaching raid volume, channel %d, " +- "id %d\n", ioc->name, MPTSAS_RAID_CHANNEL, +- hot_plug_info->id); +- scsi_add_device(ioc->sh, MPTSAS_RAID_CHANNEL, +- hot_plug_info->id, 0); +- break; +- +- case MPTSAS_DEL_RAID: +- +- mpt_findImVolumes(ioc); +- printk(MYIOC_s_INFO_FMT "removing raid volume, channel %d, " +- "id %d\n", ioc->name, MPTSAS_RAID_CHANNEL, +- hot_plug_info->id); +- scsi_remove_device(hot_plug_info->sdev); +- scsi_device_put(hot_plug_info->sdev); +- break; +- +- case MPTSAS_ADD_INACTIVE_VOLUME: +- +- mpt_findImVolumes(ioc); +- mptsas_adding_inactive_raid_components(ioc, +- hot_plug_info->channel, hot_plug_info->id); +- break; +- +- default: +- break; +- } +- +- mptsas_free_fw_event(ioc, fw_event); +-} +- +-/** +- * mptsas_send_sas_event +- * +- * +- * @ioc +- * @sas_event_data +- * +- **/ +-static void +-mptsas_send_sas_event(struct fw_event_work *fw_event) +-{ +- MPT_ADAPTER *ioc; +- struct mptsas_hotplug_event hot_plug_info; +- EVENT_DATA_SAS_DEVICE_STATUS_CHANGE *sas_event_data; +- u32 device_info; +- u64 sas_address; +- +- ioc = fw_event->ioc; +- sas_event_data = (EVENT_DATA_SAS_DEVICE_STATUS_CHANGE *) +- fw_event->event_data; +- device_info = le32_to_cpu(sas_event_data->DeviceInfo); +- +- if ((device_info & +- (MPI_SAS_DEVICE_INFO_SSP_TARGET | +- MPI_SAS_DEVICE_INFO_STP_TARGET | +- MPI_SAS_DEVICE_INFO_SATA_DEVICE)) == 0) { +- mptsas_free_fw_event(ioc, fw_event); +- return; +- } +- +- if (sas_event_data->ReasonCode == +- MPI_EVENT_SAS_DEV_STAT_RC_NO_PERSIST_ADDED) { +- mptbase_sas_persist_operation(ioc, +- MPI_SAS_OP_CLEAR_NOT_PRESENT); +- mptsas_free_fw_event(ioc, fw_event); +- return; +- } +- +- switch (sas_event_data->ReasonCode) { +- case MPI_EVENT_SAS_DEV_STAT_RC_NOT_RESPONDING: +- case MPI_EVENT_SAS_DEV_STAT_RC_ADDED: +- memset(&hot_plug_info, 0, sizeof(struct mptsas_hotplug_event)); +- hot_plug_info.handle = le16_to_cpu(sas_event_data->DevHandle); +- hot_plug_info.channel = sas_event_data->Bus; +- hot_plug_info.id = sas_event_data->TargetID; +- hot_plug_info.phy_id = sas_event_data->PhyNum; +- memcpy(&sas_address, &sas_event_data->SASAddress, +- sizeof(u64)); +- hot_plug_info.sas_address = le64_to_cpu(sas_address); +- hot_plug_info.device_info = device_info; +- if (sas_event_data->ReasonCode & +- MPI_EVENT_SAS_DEV_STAT_RC_ADDED) +- hot_plug_info.event_type = MPTSAS_ADD_DEVICE; +- else +- hot_plug_info.event_type = MPTSAS_DEL_DEVICE; +- mptsas_hotplug_work(ioc, fw_event, &hot_plug_info); +- break; +- +- case MPI_EVENT_SAS_DEV_STAT_RC_NO_PERSIST_ADDED: +- mptbase_sas_persist_operation(ioc, +- MPI_SAS_OP_CLEAR_NOT_PRESENT); +- mptsas_free_fw_event(ioc, fw_event); +- break; +- +- case MPI_EVENT_SAS_DEV_STAT_RC_SMART_DATA: +- case MPI_EVENT_SAS_DEV_STAT_RC_INTERNAL_DEVICE_RESET: +- default: +- mptsas_free_fw_event(ioc, fw_event); +- break; +- } +-} +- +- +-/** +- * mptsas_send_raid_event +- * +- * +- * @ioc +- * @raid_event_data +- * +- **/ +-static void +-mptsas_send_raid_event(struct fw_event_work *fw_event) +-{ +- MPT_ADAPTER *ioc; +- EVENT_DATA_RAID *raid_event_data; +- struct mptsas_hotplug_event hot_plug_info; +- int status; +- int state; +- struct scsi_device *sdev = NULL; +- VirtDevice *vdevice = NULL; +- RaidPhysDiskPage0_t phys_disk; +- +- ioc = fw_event->ioc; +- raid_event_data = (EVENT_DATA_RAID *)fw_event->event_data; +- status = le32_to_cpu(raid_event_data->SettingsStatus); +- state = (status >> 8) & 0xff; +- +- memset(&hot_plug_info, 0, sizeof(struct mptsas_hotplug_event)); +- hot_plug_info.id = raid_event_data->VolumeID; +- hot_plug_info.channel = raid_event_data->VolumeBus; +- hot_plug_info.phys_disk_num = raid_event_data->PhysDiskNum; +- +- if (raid_event_data->ReasonCode == MPI_EVENT_RAID_RC_VOLUME_DELETED || +- raid_event_data->ReasonCode == MPI_EVENT_RAID_RC_VOLUME_CREATED || +- raid_event_data->ReasonCode == +- MPI_EVENT_RAID_RC_VOLUME_STATUS_CHANGED) { +- sdev = scsi_device_lookup(ioc->sh, MPTSAS_RAID_CHANNEL, +- hot_plug_info.id, 0); +- hot_plug_info.sdev = sdev; +- if (sdev) +- vdevice = sdev->hostdata; +- } +- +- devtprintk(ioc, printk(MYIOC_s_INFO_FMT "Entering %s: " +- "ReasonCode=%02x\n", ioc->name, __func__, +- raid_event_data->ReasonCode)); +- +- switch (raid_event_data->ReasonCode) { +- case MPI_EVENT_RAID_RC_PHYSDISK_DELETED: +- hot_plug_info.event_type = MPTSAS_DEL_PHYSDISK_REPROBE; +- break; +- case MPI_EVENT_RAID_RC_PHYSDISK_CREATED: +- hot_plug_info.event_type = MPTSAS_ADD_PHYSDISK_REPROBE; +- break; +- case MPI_EVENT_RAID_RC_PHYSDISK_STATUS_CHANGED: +- switch (state) { +- case MPI_PD_STATE_ONLINE: +- case MPI_PD_STATE_NOT_COMPATIBLE: +- mpt_raid_phys_disk_pg0(ioc, +- raid_event_data->PhysDiskNum, &phys_disk); +- hot_plug_info.id = phys_disk.PhysDiskID; +- hot_plug_info.channel = phys_disk.PhysDiskBus; +- hot_plug_info.event_type = MPTSAS_ADD_PHYSDISK; +- break; +- case MPI_PD_STATE_FAILED: +- case MPI_PD_STATE_MISSING: +- case MPI_PD_STATE_OFFLINE_AT_HOST_REQUEST: +- case MPI_PD_STATE_FAILED_AT_HOST_REQUEST: +- case MPI_PD_STATE_OFFLINE_FOR_ANOTHER_REASON: +- hot_plug_info.event_type = MPTSAS_DEL_PHYSDISK; +- break; +- default: +- break; +- } +- break; +- case MPI_EVENT_RAID_RC_VOLUME_DELETED: +- if (!sdev) +- break; +- vdevice->vtarget->deleted = 1; /* block IO */ +- hot_plug_info.event_type = MPTSAS_DEL_RAID; +- break; +- case MPI_EVENT_RAID_RC_VOLUME_CREATED: +- if (sdev) { +- scsi_device_put(sdev); +- break; +- } +- hot_plug_info.event_type = MPTSAS_ADD_RAID; +- break; +- case MPI_EVENT_RAID_RC_VOLUME_STATUS_CHANGED: +- if (!(status & MPI_RAIDVOL0_STATUS_FLAG_ENABLED)) { +- if (!sdev) +- break; +- vdevice->vtarget->deleted = 1; /* block IO */ +- hot_plug_info.event_type = MPTSAS_DEL_RAID; +- break; +- } +- switch (state) { +- case MPI_RAIDVOL0_STATUS_STATE_FAILED: +- case MPI_RAIDVOL0_STATUS_STATE_MISSING: +- if (!sdev) +- break; +- vdevice->vtarget->deleted = 1; /* block IO */ +- hot_plug_info.event_type = MPTSAS_DEL_RAID; +- break; +- case MPI_RAIDVOL0_STATUS_STATE_OPTIMAL: +- case MPI_RAIDVOL0_STATUS_STATE_DEGRADED: +- if (sdev) { +- scsi_device_put(sdev); +- break; +- } +- hot_plug_info.event_type = MPTSAS_ADD_RAID; +- break; +- default: +- break; +- } +- break; +- default: +- break; +- } +- +- if (hot_plug_info.event_type != MPTSAS_IGNORE_EVENT) +- mptsas_hotplug_work(ioc, fw_event, &hot_plug_info); +- else +- mptsas_free_fw_event(ioc, fw_event); +-} +- +-/** +- * mptsas_issue_tm - send mptsas internal tm request +- * @ioc: Pointer to MPT_ADAPTER structure +- * @type +- * @channel +- * @id +- * @lun +- * @task_context +- * @timeout +- * +- * return: +- * +- **/ +-static int +-mptsas_issue_tm(MPT_ADAPTER *ioc, u8 type, u8 channel, u8 id, u64 lun, +- int task_context, ulong timeout, u8 *issue_reset) +-{ +- MPT_FRAME_HDR *mf; +- SCSITaskMgmt_t *pScsiTm; +- int retval; +- unsigned long timeleft; +- +- *issue_reset = 0; +- if ((mf = mpt_get_msg_frame(mptsasDeviceResetCtx, ioc)) == NULL) { +- retval = -1; /* return failure */ +- dtmprintk(ioc, printk(MYIOC_s_WARN_FMT "TaskMgmt request: no " +- "msg frames!!\n", ioc->name)); +- goto out; +- } +- +- dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "TaskMgmt request: mr = %p, " +- "task_type = 0x%02X,\n\t timeout = %ld, fw_channel = %d, " +- "fw_id = %d, lun = %lld,\n\t task_context = 0x%x\n", ioc->name, mf, +- type, timeout, channel, id, (unsigned long long)lun, +- task_context)); +- +- pScsiTm = (SCSITaskMgmt_t *) mf; +- memset(pScsiTm, 0, sizeof(SCSITaskMgmt_t)); +- pScsiTm->Function = MPI_FUNCTION_SCSI_TASK_MGMT; +- pScsiTm->TaskType = type; +- pScsiTm->MsgFlags = 0; +- pScsiTm->TargetID = id; +- pScsiTm->Bus = channel; +- pScsiTm->ChainOffset = 0; +- pScsiTm->Reserved = 0; +- pScsiTm->Reserved1 = 0; +- pScsiTm->TaskMsgContext = task_context; +- int_to_scsilun(lun, (struct scsi_lun *)pScsiTm->LUN); +- +- INITIALIZE_MGMT_STATUS(ioc->taskmgmt_cmds.status) +- CLEAR_MGMT_STATUS(ioc->internal_cmds.status) +- retval = 0; +- mpt_put_msg_frame_hi_pri(mptsasDeviceResetCtx, ioc, mf); +- +- /* Now wait for the command to complete */ +- timeleft = wait_for_completion_timeout(&ioc->taskmgmt_cmds.done, +- timeout*HZ); +- if (!(ioc->taskmgmt_cmds.status & MPT_MGMT_STATUS_COMMAND_GOOD)) { +- retval = -1; /* return failure */ +- dtmprintk(ioc, printk(MYIOC_s_ERR_FMT +- "TaskMgmt request: TIMED OUT!(mr=%p)\n", ioc->name, mf)); +- mpt_free_msg_frame(ioc, mf); +- if (ioc->taskmgmt_cmds.status & MPT_MGMT_STATUS_DID_IOCRESET) +- goto out; +- *issue_reset = 1; +- goto out; +- } +- +- if (!(ioc->taskmgmt_cmds.status & MPT_MGMT_STATUS_RF_VALID)) { +- retval = -1; /* return failure */ +- dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT +- "TaskMgmt request: failed with no reply\n", ioc->name)); +- goto out; +- } +- +- out: +- CLEAR_MGMT_STATUS(ioc->taskmgmt_cmds.status) +- return retval; +-} +- +-/** +- * mptsas_broadcast_primative_work - Work queue thread to handle +- * broadcast primitive events +- * @work: work queue payload containing info describing the event +- * +- **/ +-static void +-mptsas_broadcast_primative_work(struct fw_event_work *fw_event) +-{ +- MPT_ADAPTER *ioc = fw_event->ioc; +- MPT_FRAME_HDR *mf; +- VirtDevice *vdevice; +- int ii; +- struct scsi_cmnd *sc; +- SCSITaskMgmtReply_t *pScsiTmReply; +- u8 issue_reset; +- int task_context; +- u8 channel, id; +- int lun; +- u32 termination_count; +- u32 query_count; +- +- dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT +- "%s - enter\n", ioc->name, __func__)); +- +- mutex_lock(&ioc->taskmgmt_cmds.mutex); +- if (mpt_set_taskmgmt_in_progress_flag(ioc) != 0) { +- mutex_unlock(&ioc->taskmgmt_cmds.mutex); +- mptsas_requeue_fw_event(ioc, fw_event, 1000); +- return; +- } +- +- issue_reset = 0; +- termination_count = 0; +- query_count = 0; +- mpt_findImVolumes(ioc); +- pScsiTmReply = (SCSITaskMgmtReply_t *) ioc->taskmgmt_cmds.reply; +- +- for (ii = 0; ii < ioc->req_depth; ii++) { +- sc = mptscsih_get_scsi_lookup(ioc, ii); +- if (!sc) +- continue; +- mf = MPT_INDEX_2_MFPTR(ioc, ii); +- if (!mf) +- continue; +- task_context = mf->u.frame.hwhdr.msgctxu.MsgContext; +- vdevice = sc->device->hostdata; +- if (!vdevice || !vdevice->vtarget) +- continue; +- if (vdevice->vtarget->tflags & MPT_TARGET_FLAGS_RAID_COMPONENT) +- continue; /* skip hidden raid components */ +- if (vdevice->vtarget->raidVolume) +- continue; /* skip hidden raid components */ +- channel = vdevice->vtarget->channel; +- id = vdevice->vtarget->id; +- lun = vdevice->lun; +- if (mptsas_issue_tm(ioc, MPI_SCSITASKMGMT_TASKTYPE_QUERY_TASK, +- channel, id, (u64)lun, task_context, 30, &issue_reset)) +- goto out; +- query_count++; +- termination_count += +- le32_to_cpu(pScsiTmReply->TerminationCount); +- if ((pScsiTmReply->IOCStatus == MPI_IOCSTATUS_SUCCESS) && +- (pScsiTmReply->ResponseCode == +- MPI_SCSITASKMGMT_RSP_TM_SUCCEEDED || +- pScsiTmReply->ResponseCode == +- MPI_SCSITASKMGMT_RSP_IO_QUEUED_ON_IOC)) +- continue; +- if (mptsas_issue_tm(ioc, +- MPI_SCSITASKMGMT_TASKTYPE_ABRT_TASK_SET, +- channel, id, (u64)lun, 0, 30, &issue_reset)) +- goto out; +- termination_count += +- le32_to_cpu(pScsiTmReply->TerminationCount); +- } +- +- out: +- dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT +- "%s - exit, query_count = %d termination_count = %d\n", +- ioc->name, __func__, query_count, termination_count)); +- +- ioc->broadcast_aen_busy = 0; +- mpt_clear_taskmgmt_in_progress_flag(ioc); +- mutex_unlock(&ioc->taskmgmt_cmds.mutex); +- +- if (issue_reset) { +- printk(MYIOC_s_WARN_FMT "Issuing Reset from %s!!\n", +- ioc->name, __func__); +- if (mpt_SoftResetHandler(ioc, CAN_SLEEP)) +- mpt_HardResetHandler(ioc, CAN_SLEEP); +- } +- mptsas_free_fw_event(ioc, fw_event); +-} +- +-/** +- * mptsas_send_ir2_event - handle exposing hidden disk when an inactive raid volume is added +- * @ioc: Pointer to MPT_ADAPTER structure +- * @ir2_data: +- * +- **/ +-static void +-mptsas_send_ir2_event(struct fw_event_work *fw_event) +-{ +- MPT_ADAPTER *ioc; +- struct mptsas_hotplug_event hot_plug_info; +- MPI_EVENT_DATA_IR2 *ir2_data; +- u8 reasonCode; +- RaidPhysDiskPage0_t phys_disk; +- +- ioc = fw_event->ioc; +- ir2_data = (MPI_EVENT_DATA_IR2 *)fw_event->event_data; +- reasonCode = ir2_data->ReasonCode; +- +- devtprintk(ioc, printk(MYIOC_s_INFO_FMT "Entering %s: " +- "ReasonCode=%02x\n", ioc->name, __func__, reasonCode)); +- +- memset(&hot_plug_info, 0, sizeof(struct mptsas_hotplug_event)); +- hot_plug_info.id = ir2_data->TargetID; +- hot_plug_info.channel = ir2_data->Bus; +- switch (reasonCode) { +- case MPI_EVENT_IR2_RC_FOREIGN_CFG_DETECTED: +- hot_plug_info.event_type = MPTSAS_ADD_INACTIVE_VOLUME; +- break; +- case MPI_EVENT_IR2_RC_DUAL_PORT_REMOVED: +- hot_plug_info.phys_disk_num = ir2_data->PhysDiskNum; +- hot_plug_info.event_type = MPTSAS_DEL_PHYSDISK; +- break; +- case MPI_EVENT_IR2_RC_DUAL_PORT_ADDED: +- hot_plug_info.phys_disk_num = ir2_data->PhysDiskNum; +- mpt_raid_phys_disk_pg0(ioc, +- ir2_data->PhysDiskNum, &phys_disk); +- hot_plug_info.id = phys_disk.PhysDiskID; +- hot_plug_info.event_type = MPTSAS_ADD_PHYSDISK; +- break; +- default: +- mptsas_free_fw_event(ioc, fw_event); +- return; +- } +- mptsas_hotplug_work(ioc, fw_event, &hot_plug_info); +-} +- + static void + mptsas_expander_refresh(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info) + { +@@ -4466,7 +4075,8 @@ + + phy_info = expander->phy_info; + for (i = 0; i < expander->num_phys; i++, phy_info++) { +- if (!(rphy = mptsas_get_rphy(phy_info))) ++ rphy = mptsas_get_rphy(phy_info); ++ if (!rphy) + continue; + if (rphy->identify.device_type == SAS_END_DEVICE) + mptsas_del_end_device(ioc, phy_info); +@@ -4474,7 +4084,8 @@ + + phy_info = expander->phy_info; + for (i = 0; i < expander->num_phys; i++, phy_info++) { +- if (!(rphy = mptsas_get_rphy(phy_info))) ++ rphy = mptsas_get_rphy(phy_info); ++ if (!rphy) + continue; + if (rphy->identify.device_type == + MPI_SAS_DEVICE_INFO_EDGE_EXPANDER || +@@ -4486,7 +4097,11 @@ + continue; + if (port_info == parent) /* backlink rphy */ + continue; +- mptsas_expander_delete(ioc, port_info); ++ /* ++ Delete this expander even if the expdevpage is exists ++ because the parent expander is already deleted ++ */ ++ mptsas_expander_delete(ioc, port_info, 1); + } + } + } +@@ -4496,11 +4111,12 @@ + * mptsas_expander_delete - remove this expander + * @ioc: Pointer to MPT_ADAPTER structure + * @port_info: expander port_info struct +- * +- **/ +- +-static void +-mptsas_expander_delete(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info) ++ * @force: Flag to forcefully delete the expander ++ * ++ **/ ++ ++static void mptsas_expander_delete(MPT_ADAPTER *ioc, ++ struct mptsas_portinfo *port_info, u8 force) + { + + struct mptsas_portinfo *parent; +@@ -4509,7 +4125,11 @@ + struct mptsas_phyinfo *phy_info; + struct mptsas_portinfo buffer; + struct mptsas_portinfo_details *port_details; ++#if defined(MPT_WIDE_PORT_API) + struct sas_port *port; ++#else ++ struct sas_rphy * rphy; ++#endif + + if (!port_info) + return; +@@ -4522,7 +4142,8 @@ + + if (buffer.num_phys) { + kfree(buffer.phy_info); +- return; ++ if (!force) ++ return; + } + + +@@ -4542,6 +4163,7 @@ + * Delete rphys in the parent that point + * to this expander. + */ ++#if defined(MPT_WIDE_PORT_API) + phy_info = parent->phy_info; + port = NULL; + for (i = 0; i < parent->num_phys; i++, phy_info++) { +@@ -4567,6 +4189,22 @@ + sas_port_delete(port); + mptsas_port_delete(ioc, port_details); + } ++#else ++ phy_info = parent->phy_info; ++ for (i = 0; i < parent->num_phys; i++, phy_info++) { ++ rphy = mptsas_get_rphy(phy_info); ++ if (!rphy) ++ continue; ++ if (phy_info->attached.sas_address != ++ expander_sas_address) ++ continue; ++ dev_printk(KERN_DEBUG, &rphy->dev, ++ MYIOC_s_FMT "delete: sas_addr (0x%llx)\n", ++ ioc->name, (unsigned long long) expander_sas_address); ++ sas_rphy_delete(rphy); ++ mptsas_port_delete(ioc, port_details); ++ } ++#endif + out: + + printk(MYIOC_s_INFO_FMT "delete expander: num_phys %d, " +@@ -4604,6 +4242,7 @@ + expander_data = (MpiEventDataSasExpanderStatusChange_t *) + fw_event->event_data; + memcpy(&sas_address, &expander_data->SASAddress, sizeof(__le64)); ++ sas_address = le64_to_cpu(sas_address); + port_info = mptsas_find_portinfo_by_sas_address(ioc, sas_address); + + if (expander_data->ReasonCode == MPI_EVENT_SAS_EXP_RC_ADDED) { +@@ -4622,7 +4261,7 @@ + mptsas_expander_event_add(ioc, expander_data); + } else if (expander_data->ReasonCode == + MPI_EVENT_SAS_EXP_RC_NOT_RESPONDING) +- mptsas_expander_delete(ioc, port_info); ++ mptsas_expander_delete(ioc, port_info, 0); + + mptsas_free_fw_event(ioc, fw_event); + } +@@ -4724,6 +4363,258 @@ + mptsas_free_fw_event(ioc, fw_event); + } + ++static void ++mptsas_not_responding_devices(MPT_ADAPTER *ioc) ++{ ++ struct mptsas_portinfo buffer, *port_info; ++ struct sas_device_info *sas_info; ++ struct mptsas_devinfo sas_device; ++ u32 handle; ++ VirtTarget *vtarget = NULL; ++ struct mptsas_phyinfo *phy_info; ++ u8 found_expander; ++ int retval, retry_count; ++ unsigned long flags; ++ ++ if (ioc->disable_hotplug_remove) ++ return; ++ ++ mpt_findImVolumes(ioc); ++ ++ spin_lock_irqsave(&ioc->taskmgmt_lock, flags); ++ if (ioc->ioc_reset_in_progress) { ++ dfailprintk(ioc, printk(MYIOC_s_DEBUG_FMT ++ "%s: exiting due to a parallel reset \n", ioc->name, ++ __func__)); ++ spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags); ++ return; ++ } ++ spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags); ++ ++ /* devices, logical volumes */ ++ redo_device_scan: ++ list_for_each_entry(sas_info, &ioc->sas_device_info_list, list) { ++ if (sas_info->is_cached) ++ continue; ++ if (!sas_info->is_logical_volume) { ++ sas_device.handle = 0; ++ retry_count = 0; ++retry_page: ++ retval = mptsas_sas_device_pg0(ioc, &sas_device, ++ (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID ++ << MPI_SAS_DEVICE_PGAD_FORM_SHIFT), ++ (sas_info->fw.channel << 8) + ++ sas_info->fw.id); ++ ++ if (sas_device.handle) ++ continue; ++ if (retval == -EBUSY) { ++ spin_lock_irqsave(&ioc->taskmgmt_lock, flags); ++ if (ioc->ioc_reset_in_progress) { ++ dfailprintk(ioc, ++ printk(MYIOC_s_DEBUG_FMT ++ "%s: exiting due to reset\n", ++ ioc->name, __func__)); ++ spin_unlock_irqrestore ++ (&ioc->taskmgmt_lock, flags); ++ return; ++ } ++ spin_unlock_irqrestore(&ioc->taskmgmt_lock, ++ flags); ++ } ++ ++ if (retval && (retval != -ENODEV)) { ++ if (retry_count < 10) { ++ retry_count++; ++ goto retry_page; ++ } else { ++ devtprintk(ioc, printk(MYIOC_s_DEBUG_FMT ++ "%s: Config page retry exceeded retry " ++ "count deleting device 0x%llx\n", ++ ioc->name, __func__, ++ sas_info->sas_address)); ++ } ++ } ++ ++ /* delete device */ ++ vtarget = mptsas_find_vtarget(ioc, ++ sas_info->fw.channel, sas_info->fw.id); ++ if (vtarget) ++ vtarget->deleted = 1; ++ phy_info = mptsas_find_phyinfo_by_sas_address(ioc, ++ sas_info->sas_address); ++ if (phy_info) { ++ mptsas_del_end_device(ioc, phy_info); ++ goto redo_device_scan; ++ } ++ } else ++ mptsas_volume_delete(ioc, sas_info->fw.id); ++ } ++ ++ /* expanders */ ++ redo_expander_scan: ++ list_for_each_entry(port_info, &ioc->sas_topology, list) { ++ ++ if (port_info->phy_info && ++ (!(port_info->phy_info[0].identify.device_info & ++ MPI_SAS_DEVICE_INFO_SMP_TARGET))) ++ continue; ++ found_expander = 0; ++ handle = 0xFFFF; ++ while (!mptsas_sas_expander_pg0(ioc, &buffer, ++ (MPI_SAS_EXPAND_PGAD_FORM_GET_NEXT_HANDLE << ++ MPI_SAS_EXPAND_PGAD_FORM_SHIFT), handle) && ++ !found_expander) { ++ ++ handle = buffer.phy_info[0].handle; ++ if (buffer.phy_info[0].identify.sas_address == ++ port_info->phy_info[0].identify.sas_address) { ++ found_expander = 1; ++ } ++ kfree(buffer.phy_info); ++ } ++ ++ if (!found_expander) { ++ mptsas_expander_delete(ioc, port_info, 0); ++ goto redo_expander_scan; ++ } ++ } ++} ++ ++/** ++ * mptsas_probe_expanders - adding expanders ++ * @ioc: Pointer to MPT_ADAPTER structure ++ * ++ **/ ++static void ++mptsas_probe_expanders(MPT_ADAPTER *ioc) ++{ ++ struct mptsas_portinfo buffer, *port_info; ++ u32 handle; ++ int i; ++ ++ handle = 0xFFFF; ++ while (!mptsas_sas_expander_pg0(ioc, &buffer, ++ (MPI_SAS_EXPAND_PGAD_FORM_GET_NEXT_HANDLE << ++ MPI_SAS_EXPAND_PGAD_FORM_SHIFT), handle)) { ++ ++ handle = buffer.phy_info[0].handle; ++ port_info = mptsas_find_portinfo_by_sas_address(ioc, ++ buffer.phy_info[0].identify.sas_address); ++ ++ if (port_info) { ++ /* refreshing handles */ ++ for (i = 0; i < buffer.num_phys; i++) { ++ port_info->phy_info[i].handle = handle; ++ port_info->phy_info[i].identify.handle_parent = ++ buffer.phy_info[0].identify.handle_parent; ++ } ++ mptsas_expander_refresh(ioc, port_info); ++ kfree(buffer.phy_info); ++ continue; ++ } ++ ++ port_info = kzalloc(sizeof(struct mptsas_portinfo), GFP_KERNEL); ++ if (!port_info) { ++ dfailprintk(ioc, printk(MYIOC_s_ERR_FMT ++ "%s: exit at line=%d\n", ioc->name, ++ __func__, __LINE__)); ++ return; ++ } ++ port_info->num_phys = buffer.num_phys; ++ port_info->phy_info = buffer.phy_info; ++ for (i = 0; i < port_info->num_phys; i++) ++ port_info->phy_info[i].portinfo = port_info; ++ mutex_lock(&ioc->sas_topology_mutex); ++ list_add_tail(&port_info->list, &ioc->sas_topology); ++ mutex_unlock(&ioc->sas_topology_mutex); ++ printk(MYIOC_s_INFO_FMT "add expander: num_phys %d, " ++ "sas_addr (0x%llx)\n", ioc->name, port_info->num_phys, ++ (unsigned long long)buffer.phy_info[0].identify.sas_address); ++ mptsas_expander_refresh(ioc, port_info); ++ } ++} ++ ++static void ++mptsas_probe_devices(MPT_ADAPTER *ioc) ++{ ++ u16 retry_count; ++ u16 handle; ++ struct mptsas_devinfo sas_device; ++ struct mptsas_phyinfo *phy_info; ++ enum device_state state; ++ ++ handle = 0xFFFF; ++ while (!(mptsas_sas_device_pg0(ioc, &sas_device, ++ MPI_SAS_DEVICE_PGAD_FORM_GET_NEXT_HANDLE, handle))) { ++ ++ handle = sas_device.handle; ++ ++ if ((sas_device.device_info & ++ (MPI_SAS_DEVICE_INFO_SSP_TARGET | ++ MPI_SAS_DEVICE_INFO_STP_TARGET | ++ MPI_SAS_DEVICE_INFO_SATA_DEVICE)) == 0) ++ continue; ++ ++ phy_info = mptsas_refreshing_device_handles(ioc, &sas_device); ++ if (!phy_info) ++ continue; ++ ++ if (mptsas_get_rphy(phy_info)) ++ continue; ++ ++ state = DEVICE_RETRY; ++ retry_count = 0; ++ while(state == DEVICE_RETRY) { ++ state = mptsas_test_unit_ready(ioc, sas_device.channel, ++ sas_device.id, retry_count++); ++ ssleep(1); ++ } ++ if (state == DEVICE_READY) ++ mptsas_add_end_device(ioc, phy_info); ++ else ++ memset(&phy_info->attached, 0, sizeof(struct mptsas_devinfo)); ++ } ++} ++ ++/** ++ * mptsas_scan_sas_topology - ++ * @ioc: Pointer to MPT_ADAPTER structure ++ * @sas_address: ++ * ++ **/ ++static void ++mptsas_scan_sas_topology(MPT_ADAPTER *ioc) ++{ ++ struct scsi_device *sdev; ++ int i; ++ ++ mptsas_probe_hba_phys(ioc); ++ mptsas_probe_expanders(ioc); ++ mptsas_probe_devices(ioc); ++ ++ /* ++ Reporting RAID volumes. ++ */ ++ if (!ioc->ir_firmware || !ioc->raid_data.pIocPg2 || ++ !ioc->raid_data.pIocPg2->NumActiveVolumes) ++ return; ++ for (i = 0; i < ioc->raid_data.pIocPg2->NumActiveVolumes; i++) { ++ sdev = scsi_device_lookup(ioc->sh, MPTSAS_RAID_CHANNEL, ++ ioc->raid_data.pIocPg2->RaidVolume[i].VolumeID, 0); ++ if (sdev) { ++ scsi_device_put(sdev); ++ continue; ++ } ++ printk(MYIOC_s_INFO_FMT "attaching raid volume, channel %d, " ++ "id %d\n", ioc->name, MPTSAS_RAID_CHANNEL, ++ ioc->raid_data.pIocPg2->RaidVolume[i].VolumeID); ++ scsi_add_device(ioc->sh, MPTSAS_RAID_CHANNEL, ++ ioc->raid_data.pIocPg2->RaidVolume[i].VolumeID, 0); ++ } ++} ++ ++ + + static void + mptsas_handle_queue_full_event(struct fw_event_work *fw_event) +@@ -4744,9 +4635,9 @@ + fw_id = qfull_data->TargetID; + fw_channel = qfull_data->Bus; + current_depth = le16_to_cpu(qfull_data->CurrentDepth); +- ++ + /* if hidden raid component, look for the volume id */ +- mutex_lock(&ioc->sas_device_info_mutex); ++ down(&ioc->sas_device_info_mutex); + if (mptscsih_is_phys_disk(ioc, fw_channel, fw_id)) { + list_for_each_entry(sas_info, &ioc->sas_device_info_list, + list) { +@@ -4779,8 +4670,8 @@ + } + + out: +- mutex_unlock(&ioc->sas_device_info_mutex); +- ++ up(&ioc->sas_device_info_mutex); ++ + if (id != -1) { + shost_for_each_device(sdev, ioc->sh) { + if (sdev->id == id && sdev->channel == channel) { +@@ -4800,8 +4691,8 @@ + depth); + else if (depth < 0) + sdev_printk(KERN_INFO, sdev, +- "Tagged Command Queueing is being " +- "disabled\n"); ++ "Tagged Command Queueing is being " ++ "disabled\n"); + else if (depth == 0) + sdev_printk(KERN_INFO, sdev, + "Queue depth not changed yet\n"); +@@ -4812,67 +4703,920 @@ + mptsas_free_fw_event(ioc, fw_event); + } + +-/** +- * mptsas_firmware_event_work - work thread for processing fw events +- * @work: work queue payload containing info describing the event +- * Context: user +- * +- */ +-static void +-mptsas_firmware_event_work(struct work_struct *work) +-{ +- struct fw_event_work *fw_event = +- container_of(work, struct fw_event_work, work.work); +- MPT_ADAPTER *ioc = fw_event->ioc; +- +- /* special rescan topology handling */ +- if (fw_event->event == -1) { +- devtprintk(ioc, printk(MYIOC_s_INFO_FMT "%s: rescan after " +- "reset\n", ioc->name, __func__)); +- mptsas_not_responding_devices(ioc); +- mptsas_scan_sas_topology(ioc); +- mptsas_free_fw_event(ioc, fw_event); +- return; +- } +- +- /* events handling turned off during host reset */ +- if (ioc->fw_events_off) { +- mptsas_free_fw_event(ioc, fw_event); +- return; +- } +- +- devtprintk(ioc, printk(MYIOC_s_INFO_FMT "%s: fw_event=(0x%p), " +- "event = (0x%02x)\n", ioc->name, __func__, fw_event, +- (fw_event->event & 0xFF))); +- +- switch (fw_event->event) { +- case MPI_EVENT_SAS_DEVICE_STATUS_CHANGE: +- mptsas_send_sas_event(fw_event); +- break; +- case MPI_EVENT_INTEGRATED_RAID: +- mptsas_send_raid_event(fw_event); +- break; +- case MPI_EVENT_IR2: +- mptsas_send_ir2_event(fw_event); +- break; +- case MPI_EVENT_PERSISTENT_TABLE_FULL: ++ ++/** ++ * mptsas_find_phyinfo_by_sas_address - ++ * @ioc: Pointer to MPT_ADAPTER structure ++ * @sas_address: ++ * ++ **/ ++static struct mptsas_phyinfo * ++mptsas_find_phyinfo_by_sas_address(MPT_ADAPTER *ioc, u64 sas_address) ++{ ++ struct mptsas_portinfo *port_info; ++ struct mptsas_phyinfo *phy_info = NULL; ++ int i; ++ ++ mutex_lock(&ioc->sas_topology_mutex); ++ list_for_each_entry(port_info, &ioc->sas_topology, list) { ++ for (i = 0; i < port_info->num_phys; i++) { ++ if (!mptsas_is_end_device( ++ &port_info->phy_info[i].attached)) ++ continue; ++ if (port_info->phy_info[i].attached.sas_address ++ != sas_address) ++ continue; ++ phy_info = &port_info->phy_info[i]; ++ break; ++ } ++ } ++ mutex_unlock(&ioc->sas_topology_mutex); ++ return phy_info; ++} ++ ++/** ++ * mptsas_find_phyinfo_by_handle - ++ * @ioc: Pointer to MPT_ADAPTER structure ++ * @sas_address: ++ * ++ **/ ++static struct mptsas_phyinfo * ++mptsas_find_phyinfo_by_sas_handle(MPT_ADAPTER *ioc, u16 handle) ++{ ++ struct mptsas_portinfo *port_info; ++ struct mptsas_phyinfo *phy_info = NULL; ++ int i; ++ ++ mutex_lock(&ioc->sas_topology_mutex); ++ list_for_each_entry(port_info, &ioc->sas_topology, list) { ++ for (i = 0; i < port_info->num_phys; i++) { ++ if (!mptsas_is_end_device( ++ &port_info->phy_info[i].attached)) ++ continue; ++ if (port_info->phy_info[i].attached.handle ++ != handle) ++ continue; ++ phy_info = &port_info->phy_info[i]; ++ break; ++ } ++ } ++ mutex_unlock(&ioc->sas_topology_mutex); ++ return phy_info; ++} ++ ++ ++/** ++ * mptsas_find_phyinfo_by_phys_disk_num - ++ * @ioc: Pointer to MPT_ADAPTER structure ++ * @phys_disk_num: ++ * @channel: ++ * @id: ++ * ++ **/ ++static struct mptsas_phyinfo * ++mptsas_find_phyinfo_by_phys_disk_num(MPT_ADAPTER *ioc, u8 phys_disk_num, ++ u8 channel, u8 id) ++{ ++ struct mptsas_phyinfo *phy_info = NULL; ++ struct mptsas_portinfo *port_info; ++ RaidPhysDiskPage1_t *phys_disk = NULL; ++ int num_paths; ++ u64 sas_address = 0; ++ int i; ++ ++ phy_info = NULL; ++ if (!ioc->raid_data.pIocPg3) ++ return NULL; ++ /* dual port support */ ++ num_paths = mpt_raid_phys_disk_get_num_paths(ioc, phys_disk_num); ++ if (!num_paths) ++ goto out; ++ phys_disk = kzalloc(offsetof(RaidPhysDiskPage1_t,Path) + ++ (num_paths * sizeof(RAID_PHYS_DISK1_PATH)), GFP_KERNEL); ++ if (!phys_disk) ++ goto out; ++ mpt_raid_phys_disk_pg1(ioc, phys_disk_num, phys_disk); ++ for (i = 0; i < num_paths; i++) { ++ if ((phys_disk->Path[i].Flags & 1) != 0) ++ /* entry no longer valid */ ++ continue; ++ if ((id == phys_disk->Path[i].PhysDiskID) && ++ (channel == phys_disk->Path[i].PhysDiskBus)) { ++ memcpy(&sas_address, &phys_disk->Path[i].WWID, ++ sizeof(u64)); ++ phy_info = mptsas_find_phyinfo_by_sas_address(ioc, sas_address); ++ goto out; ++ } ++ } ++ ++ out: ++ kfree(phys_disk); ++ if (phy_info) ++ return phy_info; ++ ++ /* ++ * Extra code to handle RAID0 case, where the sas_address is not updated ++ * in phys_disk_page_1 when hotswapped ++ */ ++ mutex_lock(&ioc->sas_topology_mutex); ++ list_for_each_entry(port_info, &ioc->sas_topology, list) { ++ for (i = 0; i < port_info->num_phys && !phy_info; i++) { ++ if (!mptsas_is_end_device( ++ &port_info->phy_info[i].attached)) ++ continue; ++ if (port_info->phy_info[i].attached.phys_disk_num == ~0) ++ continue; ++ if (port_info->phy_info[i].attached.phys_disk_num == phys_disk_num && ++ port_info->phy_info[i].attached.id == id && ++ port_info->phy_info[i].attached.channel == channel) ++ phy_info = &port_info->phy_info[i]; ++ } ++ } ++ mutex_unlock(&ioc->sas_topology_mutex); ++ return phy_info; ++} ++ ++/** ++ * mptsas_reprobe_lun - ++ * @sdev: ++ * @data: ++ * ++ **/ ++static void ++mptsas_reprobe_lun(struct scsi_device *sdev, void *data) ++{ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,18)) ++ int rc; ++#endif ++ sdev->no_uld_attach = data ? 1 : 0; ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,18)) ++ rc = scsi_device_reprobe(sdev); ++#else ++ scsi_device_reprobe(sdev); ++#endif ++} ++ ++/** ++ * mptsas_reprobe_target - ++ * @starget: ++ * @uld_attach: ++ * ++ **/ ++static void ++mptsas_reprobe_target(struct scsi_target *starget, int uld_attach) ++{ ++ starget_for_each_device(starget, uld_attach ? (void *)1 : NULL, ++ mptsas_reprobe_lun); ++} ++ ++/** ++ * mptsas_adding_inactive_raid_components - ++ * @ioc: Pointer to MPT_ADAPTER structure ++ * @channel: ++ * @id: ++ * ++ * ++ * TODO: check for hotspares ++ **/ ++static void ++mptsas_adding_inactive_raid_components(MPT_ADAPTER *ioc, u8 channel, u8 id) ++{ ++ CONFIGPARMS cfg; ++ ConfigPageHeader_t hdr; ++ dma_addr_t dma_handle; ++ pRaidVolumePage0_t buffer = NULL; ++ RaidPhysDiskPage0_t phys_disk; ++ int i; ++ struct mptsas_phyinfo *phy_info; ++ struct mptsas_devinfo sas_device; ++ ++ memset(&cfg, 0 , sizeof(CONFIGPARMS)); ++ memset(&hdr, 0 , sizeof(ConfigPageHeader_t)); ++ hdr.PageType = MPI_CONFIG_PAGETYPE_RAID_VOLUME; ++ cfg.pageAddr = (channel << 8) + id; ++ cfg.cfghdr.hdr = &hdr; ++ cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER; ++ cfg.timeout = SAS_CONFIG_PAGE_TIMEOUT; ++ ++ if (mpt_config(ioc, &cfg) != 0) ++ goto out; ++ ++ if (!hdr.PageLength) ++ goto out; ++ ++ buffer = pci_alloc_consistent(ioc->pcidev, hdr.PageLength * 4, ++ &dma_handle); ++ ++ if (!buffer) ++ goto out; ++ ++ cfg.physAddr = dma_handle; ++ cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT; ++ ++ if (mpt_config(ioc, &cfg) != 0) ++ goto out; ++ ++ if (!(buffer->VolumeStatus.Flags & ++ MPI_RAIDVOL0_STATUS_FLAG_VOLUME_INACTIVE)) ++ goto out; ++ ++ if (!buffer->NumPhysDisks) ++ goto out; ++ ++ for (i = 0; i < buffer->NumPhysDisks; i++) { ++ ++ if (mpt_raid_phys_disk_pg0(ioc, ++ buffer->PhysDisk[i].PhysDiskNum, &phys_disk) != 0) ++ continue; ++ ++ if (mptsas_sas_device_pg0(ioc, &sas_device, ++ (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID << ++ MPI_SAS_DEVICE_PGAD_FORM_SHIFT), ++ (phys_disk.PhysDiskBus << 8) + ++ phys_disk.PhysDiskID)) ++ continue; ++ ++ phy_info = mptsas_find_phyinfo_by_sas_address(ioc, ++ sas_device.sas_address); ++ mptsas_add_end_device(ioc, phy_info); ++ } ++ ++ out: ++ if (buffer) ++ pci_free_consistent(ioc->pcidev, hdr.PageLength * 4, buffer, ++ dma_handle); ++} ++/* ++ * Work queue thread to handle SAS hotplug events ++ */ ++static void ++mptsas_hotplug_work(MPT_ADAPTER *ioc, struct fw_event_work *fw_event, ++ struct mptsas_hotplug_event *hot_plug_info) ++{ ++ struct mptsas_phyinfo *phy_info; ++ struct scsi_target * starget; ++ struct mptsas_devinfo sas_device; ++ VirtTarget *vtarget; ++ enum device_state state; ++ int i; ++ ++ switch (hot_plug_info->event_type) { ++ ++ case MPTSAS_ADD_PHYSDISK: ++ ++ if (!ioc->raid_data.pIocPg2) ++ break; ++ ++ for (i = 0; i < ioc->raid_data.pIocPg2->NumActiveVolumes; i++) { ++ if (ioc->raid_data.pIocPg2->RaidVolume[i].VolumeID == ++ hot_plug_info->id) { ++ printk(MYIOC_s_WARN_FMT "firmware bug: unable " ++ "to add hidden disk - target_id matchs " ++ "volume_id\n", ioc->name); ++ mptsas_free_fw_event(ioc, fw_event); ++ return; ++ } ++ } ++ mpt_findImVolumes(ioc); ++ ++ case MPTSAS_ADD_DEVICE: ++ memset(&sas_device, 0, sizeof(struct mptsas_devinfo)); ++ mptsas_sas_device_pg0(ioc, &sas_device, ++ (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID << ++ MPI_SAS_DEVICE_PGAD_FORM_SHIFT), ++ (hot_plug_info->channel << 8) + ++ hot_plug_info->id); ++ ++ if (!sas_device.handle) ++ return; ++ ++ phy_info = mptsas_refreshing_device_handles(ioc, &sas_device); ++ ++ if (!phy_info) { ++ if ((sas_device.device_info & ++ MPI_SAS_DEVICE_INFO_SATA_DEVICE)) { ++ printk(KERN_DEBUG "%s:%d:%s:Find phyinfo using" ++ "mptsas_find_phyinfo_by_sas_handle", ++ __FILE__, __LINE__, __func__); ++ phy_info = mptsas_find_phyinfo_by_sas_handle ++ (ioc, sas_device.handle); ++ if (!phy_info) { ++ printk(KERN_ERR "%s:%d:%s: no phy_info", ++ __FILE__, __LINE__, __func__); ++ break; ++ } ++ phy_info->attached.sas_address = ++ sas_device.sas_address; ++ } else { ++ printk(KERN_ERR "%s:%d:%s: no phy_info", ++ __FILE__, __LINE__, __func__); ++ break; ++ } ++ } ++ ++ if (mptsas_get_rphy(phy_info)) ++ break; ++ ++ state = mptsas_test_unit_ready(ioc, phy_info->attached.channel, ++ phy_info->attached.id, fw_event->retries); ++ ++ if (state == DEVICE_RETRY && !ioc->fw_events_off) { ++ mptsas_requeue_fw_event(ioc, fw_event, 1000); ++ return; ++ } ++ ++ if (state == DEVICE_READY) ++ mptsas_add_end_device(ioc, phy_info); ++ else ++ memset(&phy_info->attached, 0, sizeof(struct mptsas_devinfo)); ++ break; ++ ++ case MPTSAS_DEL_DEVICE: ++ ++ if (!ioc->disable_hotplug_remove) { ++ phy_info = mptsas_find_phyinfo_by_sas_address(ioc, ++ hot_plug_info->sas_address); ++ mptsas_del_end_device(ioc, phy_info); ++ } ++ break; ++ ++ case MPTSAS_DEL_PHYSDISK: ++ ++ mpt_findImVolumes(ioc); ++ ++ phy_info = mptsas_find_phyinfo_by_phys_disk_num( ++ ioc, hot_plug_info->phys_disk_num, hot_plug_info->channel, ++ hot_plug_info->id); ++ mptsas_del_end_device(ioc, phy_info); ++ break; ++ ++ case MPTSAS_ADD_PHYSDISK_REPROBE: ++ ++ if (mptsas_sas_device_pg0(ioc, &sas_device, ++ (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID << ++ MPI_SAS_DEVICE_PGAD_FORM_SHIFT), ++ (hot_plug_info->channel << 8) + hot_plug_info->id)) { ++ dfailprintk(ioc, printk(MYIOC_s_ERR_FMT ++ "%s: fw_id=%d exit at line=%d\n", ioc->name, ++ __func__, hot_plug_info->id, __LINE__)); ++ break; ++ } ++ ++ phy_info = mptsas_find_phyinfo_by_sas_address( ++ ioc, sas_device.sas_address); ++ ++ if (!phy_info) { ++ dfailprintk(ioc, printk(MYIOC_s_ERR_FMT ++ "%s: fw_id=%d exit at line=%d\n", ioc->name, ++ __func__, hot_plug_info->id, __LINE__)); ++ break; ++ } ++ ++ starget = mptsas_get_starget(phy_info); ++ if (!starget) { ++ dfailprintk(ioc, printk(MYIOC_s_ERR_FMT ++ "%s: fw_id=%d exit at line=%d\n", ioc->name, ++ __func__, hot_plug_info->id, __LINE__)); ++ break; ++ } ++ ++ vtarget = starget->hostdata; ++ if (!vtarget) { ++ dfailprintk(ioc, printk(MYIOC_s_ERR_FMT ++ "%s: fw_id=%d exit at line=%d\n", ioc->name, ++ __func__, hot_plug_info->id, __LINE__)); ++ break; ++ } ++ ++ mpt_findImVolumes(ioc); ++ ++ starget_printk(KERN_INFO, starget, MYIOC_s_FMT "RAID Hidding: " ++ "fw_channel=%d, fw_id=%d, physdsk %d, sas_addr 0x%llx\n", ++ ioc->name, hot_plug_info->channel, hot_plug_info->id, ++ hot_plug_info->phys_disk_num, (unsigned long long) ++ sas_device.sas_address); ++ ++ vtarget->id = hot_plug_info->phys_disk_num; ++ vtarget->tflags |= MPT_TARGET_FLAGS_RAID_COMPONENT; ++ phy_info->attached.phys_disk_num = hot_plug_info->phys_disk_num; ++ mptsas_reprobe_target(starget, 1); ++ break; ++ ++ case MPTSAS_DEL_PHYSDISK_REPROBE: ++ ++ if (mptsas_sas_device_pg0(ioc, &sas_device, ++ (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID << ++ MPI_SAS_DEVICE_PGAD_FORM_SHIFT), ++ (hot_plug_info->channel << 8) + hot_plug_info->id)) { ++ dfailprintk(ioc, printk(MYIOC_s_ERR_FMT ++ "%s: fw_id=%d exit at line=%d\n", ++ ioc->name, __func__, ++ hot_plug_info->id, __LINE__)); ++ break; ++ } ++ ++ phy_info = mptsas_find_phyinfo_by_sas_address(ioc, ++ sas_device.sas_address); ++ if (!phy_info) { ++ dfailprintk(ioc, printk(MYIOC_s_ERR_FMT ++ "%s: fw_id=%d exit at line=%d\n", ioc->name, ++ __func__, hot_plug_info->id, __LINE__)); ++ break; ++ } ++ ++ starget = mptsas_get_starget(phy_info); ++ if (!starget) { ++ dfailprintk(ioc, printk(MYIOC_s_ERR_FMT ++ "%s: fw_id=%d exit at line=%d\n", ioc->name, ++ __func__, hot_plug_info->id, __LINE__)); ++ break; ++ } ++ ++ vtarget = starget->hostdata; ++ if (!vtarget) { ++ dfailprintk(ioc, printk(MYIOC_s_ERR_FMT ++ "%s: fw_id=%d exit at line=%d\n", ioc->name, ++ __func__, hot_plug_info->id, __LINE__)); ++ break; ++ } ++ ++ if (!(vtarget->tflags & MPT_TARGET_FLAGS_RAID_COMPONENT)) { ++ dfailprintk(ioc, printk(MYIOC_s_ERR_FMT ++ "%s: fw_id=%d exit at line=%d\n", ioc->name, ++ __func__, hot_plug_info->id, __LINE__)); ++ break; ++ } ++ ++ mpt_findImVolumes(ioc); ++ ++ starget_printk(KERN_INFO, starget, MYIOC_s_FMT "RAID Exposing:" ++ " fw_channel=%d, fw_id=%d, physdsk %d, sas_addr 0x%llx\n", ++ ioc->name, hot_plug_info->channel, hot_plug_info->id, ++ hot_plug_info->phys_disk_num, (unsigned long long) ++ sas_device.sas_address); ++ ++ vtarget->tflags &= ~MPT_TARGET_FLAGS_RAID_COMPONENT; ++ vtarget->id = hot_plug_info->id; ++ phy_info->attached.phys_disk_num = ~0; ++ mptsas_reprobe_target(starget, 0); ++ mptsas_add_device_component_by_fw(ioc, ++ hot_plug_info->channel, hot_plug_info->id); ++ break; ++ ++ case MPTSAS_ADD_RAID: ++ ++ mpt_findImVolumes(ioc); ++ printk(MYIOC_s_INFO_FMT "attaching raid volume, channel %d, " ++ "id %d\n", ioc->name, MPTSAS_RAID_CHANNEL, ++ hot_plug_info->id); ++ scsi_add_device(ioc->sh, MPTSAS_RAID_CHANNEL, ++ hot_plug_info->id, 0); ++ break; ++ ++ case MPTSAS_DEL_RAID: ++ ++ mpt_findImVolumes(ioc); ++ printk(MYIOC_s_INFO_FMT "removing raid volume, channel %d, " ++ "id %d\n", ioc->name, MPTSAS_RAID_CHANNEL, ++ hot_plug_info->id); ++ scsi_remove_device(hot_plug_info->sdev); ++ scsi_device_put(hot_plug_info->sdev); ++ break; ++ ++ case MPTSAS_ADD_INACTIVE_VOLUME: ++ ++ mpt_findImVolumes(ioc); ++ mptsas_adding_inactive_raid_components(ioc, ++ hot_plug_info->channel, hot_plug_info->id); ++ break; ++ ++ default: ++ break; ++ } ++ ++ mptsas_free_fw_event(ioc, fw_event); ++} ++ ++/** ++ * mptsas_send_sas_event ++ * ++ * ++ * @ioc ++ * @sas_event_data ++ * ++ **/ ++static void ++mptsas_send_sas_event(struct fw_event_work *fw_event) ++{ ++ MPT_ADAPTER *ioc; ++ struct mptsas_hotplug_event hot_plug_info; ++ EVENT_DATA_SAS_DEVICE_STATUS_CHANGE *sas_event_data; ++ u32 device_info; ++ u64 sas_address; ++ ++ ioc = fw_event->ioc; ++ sas_event_data = (EVENT_DATA_SAS_DEVICE_STATUS_CHANGE *) ++ fw_event->event_data; ++ device_info = le32_to_cpu(sas_event_data->DeviceInfo); ++ ++ if ((device_info & ++ (MPI_SAS_DEVICE_INFO_SSP_TARGET | ++ MPI_SAS_DEVICE_INFO_STP_TARGET | ++ MPI_SAS_DEVICE_INFO_SATA_DEVICE)) == 0) { ++ mptsas_free_fw_event(ioc, fw_event); ++ return; ++ } ++ ++ if (sas_event_data->ReasonCode == ++ MPI_EVENT_SAS_DEV_STAT_RC_NO_PERSIST_ADDED) { ++ mptbase_sas_persist_operation(ioc, ++ MPI_SAS_OP_CLEAR_NOT_PRESENT); ++ mptsas_free_fw_event(ioc, fw_event); ++ return; ++ } ++ ++ switch (sas_event_data->ReasonCode) { ++ case MPI_EVENT_SAS_DEV_STAT_RC_NOT_RESPONDING: ++ case MPI_EVENT_SAS_DEV_STAT_RC_ADDED: ++ memset(&hot_plug_info, 0, sizeof(struct mptsas_hotplug_event)); ++ hot_plug_info.handle = le16_to_cpu(sas_event_data->DevHandle); ++ hot_plug_info.channel = sas_event_data->Bus; ++ hot_plug_info.id = sas_event_data->TargetID; ++ hot_plug_info.phy_id = sas_event_data->PhyNum; ++ memcpy(&sas_address, &sas_event_data->SASAddress, ++ sizeof(u64)); ++ hot_plug_info.sas_address = le64_to_cpu(sas_address); ++ hot_plug_info.device_info = device_info; ++ if (sas_event_data->ReasonCode & ++ MPI_EVENT_SAS_DEV_STAT_RC_ADDED) ++ hot_plug_info.event_type = MPTSAS_ADD_DEVICE; ++ else ++ hot_plug_info.event_type = MPTSAS_DEL_DEVICE; ++ mptsas_hotplug_work(ioc, fw_event, &hot_plug_info); ++ break; ++ ++ case MPI_EVENT_SAS_DEV_STAT_RC_NO_PERSIST_ADDED: + mptbase_sas_persist_operation(ioc, + MPI_SAS_OP_CLEAR_NOT_PRESENT); + mptsas_free_fw_event(ioc, fw_event); + break; +- case MPI_EVENT_SAS_BROADCAST_PRIMITIVE: +- mptsas_broadcast_primative_work(fw_event); +- break; +- case MPI_EVENT_SAS_EXPANDER_STATUS_CHANGE: +- mptsas_send_expander_event(fw_event); +- break; +- case MPI_EVENT_SAS_PHY_LINK_STATUS: +- mptsas_send_link_status_event(fw_event); +- break; +- case MPI_EVENT_QUEUE_FULL: +- mptsas_handle_queue_full_event(fw_event); +- break; +- } ++ ++ case MPI_EVENT_SAS_DEV_STAT_RC_SMART_DATA: ++ /* TODO */ ++ case MPI_EVENT_SAS_DEV_STAT_RC_INTERNAL_DEVICE_RESET: ++ /* TODO */ ++ default: ++ mptsas_free_fw_event(ioc, fw_event); ++ break; ++ } ++} ++ ++ ++/** ++ * mptsas_send_raid_event ++ * ++ * ++ * @ioc ++ * @raid_event_data ++ * ++ **/ ++static void ++mptsas_send_raid_event(struct fw_event_work *fw_event) ++{ ++ MPT_ADAPTER *ioc; ++ EVENT_DATA_RAID *raid_event_data; ++ struct mptsas_hotplug_event hot_plug_info; ++ int status; ++ int state; ++ struct scsi_device *sdev = NULL; ++ VirtDevice *vdevice = NULL; ++ RaidPhysDiskPage0_t phys_disk; ++ ++ ioc = fw_event->ioc; ++ raid_event_data = (EVENT_DATA_RAID *)fw_event->event_data; ++ status = le32_to_cpu(raid_event_data->SettingsStatus); ++ state = (status >> 8) & 0xff; ++ ++ memset(&hot_plug_info, 0, sizeof(struct mptsas_hotplug_event)); ++ hot_plug_info.id = raid_event_data->VolumeID; ++ hot_plug_info.channel = raid_event_data->VolumeBus; ++ hot_plug_info.phys_disk_num = raid_event_data->PhysDiskNum; ++ ++ if (raid_event_data->ReasonCode == MPI_EVENT_RAID_RC_VOLUME_DELETED || ++ raid_event_data->ReasonCode == MPI_EVENT_RAID_RC_VOLUME_CREATED || ++ raid_event_data->ReasonCode == ++ MPI_EVENT_RAID_RC_VOLUME_STATUS_CHANGED) { ++ sdev = scsi_device_lookup(ioc->sh, MPTSAS_RAID_CHANNEL, ++ hot_plug_info.id, 0); ++ hot_plug_info.sdev = sdev; ++ if (sdev) ++ vdevice = sdev->hostdata; ++ } ++ ++ devtprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Entering %s: " ++ "ReasonCode=%02x\n", ioc->name, __func__, ++ raid_event_data->ReasonCode)); ++ ++ switch (raid_event_data->ReasonCode) { ++ case MPI_EVENT_RAID_RC_PHYSDISK_DELETED: ++ hot_plug_info.event_type = MPTSAS_DEL_PHYSDISK_REPROBE; ++ break; ++ case MPI_EVENT_RAID_RC_PHYSDISK_CREATED: ++ hot_plug_info.event_type = MPTSAS_ADD_PHYSDISK_REPROBE; ++ break; ++ case MPI_EVENT_RAID_RC_PHYSDISK_STATUS_CHANGED: ++ switch (state) { ++ case MPI_PD_STATE_ONLINE: ++ case MPI_PD_STATE_NOT_COMPATIBLE: ++ mpt_raid_phys_disk_pg0(ioc, ++ raid_event_data->PhysDiskNum, &phys_disk); ++ hot_plug_info.id = phys_disk.PhysDiskID; ++ hot_plug_info.channel = phys_disk.PhysDiskBus; ++ hot_plug_info.event_type = MPTSAS_ADD_PHYSDISK; ++ break; ++ case MPI_PD_STATE_FAILED: ++ case MPI_PD_STATE_MISSING: ++ case MPI_PD_STATE_OFFLINE_AT_HOST_REQUEST: ++ case MPI_PD_STATE_FAILED_AT_HOST_REQUEST: ++ case MPI_PD_STATE_OFFLINE_FOR_ANOTHER_REASON: ++ hot_plug_info.event_type = MPTSAS_DEL_PHYSDISK; ++ break; ++ default: ++ break; ++ } ++ break; ++ case MPI_EVENT_RAID_RC_VOLUME_DELETED: ++ if (!sdev) ++ break; ++ vdevice->vtarget->deleted = 1; /* block IO */ ++ hot_plug_info.event_type = MPTSAS_DEL_RAID; ++ break; ++ case MPI_EVENT_RAID_RC_VOLUME_CREATED: ++ if (sdev) { ++ scsi_device_put(sdev); ++ break; ++ } ++ hot_plug_info.event_type = MPTSAS_ADD_RAID; ++ break; ++ case MPI_EVENT_RAID_RC_VOLUME_STATUS_CHANGED: ++ if (!(status & MPI_RAIDVOL0_STATUS_FLAG_ENABLED)) { ++ if (!sdev) ++ break; ++ vdevice->vtarget->deleted = 1; /* block IO */ ++ hot_plug_info.event_type = MPTSAS_DEL_RAID; ++ break; ++ } ++ switch (state) { ++ case MPI_RAIDVOL0_STATUS_STATE_FAILED: ++ case MPI_RAIDVOL0_STATUS_STATE_MISSING: ++ if (!sdev) ++ break; ++ vdevice->vtarget->deleted = 1; /* block IO */ ++ hot_plug_info.event_type = MPTSAS_DEL_RAID; ++ break; ++ case MPI_RAIDVOL0_STATUS_STATE_OPTIMAL: ++ case MPI_RAIDVOL0_STATUS_STATE_DEGRADED: ++ if (sdev) { ++ scsi_device_put(sdev); ++ break; ++ } ++ hot_plug_info.event_type = MPTSAS_ADD_RAID; ++ break; ++ default: ++ break; ++ } ++ break; ++ default: ++ break; ++ } ++ ++ if (hot_plug_info.event_type != MPTSAS_IGNORE_EVENT) ++ mptsas_hotplug_work(ioc, fw_event, &hot_plug_info); ++ else ++ mptsas_free_fw_event(ioc, fw_event); ++} ++ ++/** ++ * mptsas_issue_tm - send mptsas internal tm request ++ * @ioc: Pointer to MPT_ADAPTER structure ++ * @type ++ * @channel ++ * @id ++ * @lun ++ * @task_context ++ * @timeout ++ * ++ * return: ++ * ++ **/ ++static int ++mptsas_issue_tm(MPT_ADAPTER *ioc, u8 type, u8 channel, u8 id, u64 lun, int task_context, ulong timeout, ++ u8 *issue_reset) ++{ ++ MPT_FRAME_HDR *mf; ++ SCSITaskMgmt_t *pScsiTm; ++ int retval; ++ unsigned long timeleft; ++ ++ *issue_reset = 0; ++ if ((mf = mpt_get_msg_frame(mptsasDeviceResetCtx, ioc)) == NULL) { ++ retval = -1; /* return failure */ ++ dtmprintk(ioc, printk(MYIOC_s_WARN_FMT "TaskMgmt request: no " ++ "msg frames!!\n", ioc->name)); ++ goto out; ++ } ++ ++ dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "TaskMgmt request: mr = %p, " ++ "task_type = 0x%02X,\n\t timeout = %ld, fw_channel = %d, " ++ "fw_id = %d, lun = %lld,\n\t task_context = 0x%x\n", ioc->name, mf, ++ type, timeout, channel, id, (unsigned long long)lun, ++ task_context)); ++ ++ pScsiTm = (SCSITaskMgmt_t *) mf; ++ memset(pScsiTm, 0, sizeof(SCSITaskMgmt_t)); ++ pScsiTm->Function = MPI_FUNCTION_SCSI_TASK_MGMT; ++ pScsiTm->TaskType = type; ++ pScsiTm->MsgFlags = 0; ++ pScsiTm->TargetID = id; ++ pScsiTm->Bus = channel; ++ pScsiTm->ChainOffset = 0; ++ pScsiTm->Reserved = 0; ++ pScsiTm->Reserved1 = 0; ++ pScsiTm->TaskMsgContext = task_context; ++ int_to_scsilun(lun, (struct scsi_lun *)pScsiTm->LUN); ++ ++ INITIALIZE_MGMT_STATUS(ioc->taskmgmt_cmds.status) ++ CLEAR_MGMT_STATUS(ioc->internal_cmds.status) ++ retval = 0; ++ mpt_put_msg_frame_hi_pri(mptsasDeviceResetCtx, ioc, mf); ++ ++ /* Now wait for the command to complete */ ++ timeleft = wait_for_completion_timeout(&ioc->taskmgmt_cmds.done, ++ timeout*HZ); ++ if (!(ioc->taskmgmt_cmds.status & MPT_MGMT_STATUS_COMMAND_GOOD)) { ++ retval = -1; /* return failure */ ++ dtmprintk(ioc, printk(MYIOC_s_ERR_FMT ++ "TaskMgmt request: TIMED OUT!(mr=%p)\n", ioc->name, mf)); ++ mpt_free_msg_frame(ioc, mf); ++ if (ioc->taskmgmt_cmds.status & MPT_MGMT_STATUS_DID_IOCRESET) ++ goto out; ++ *issue_reset = 1; ++ goto out; ++ } ++ ++ if (!(ioc->taskmgmt_cmds.status & MPT_MGMT_STATUS_RF_VALID)) { ++ retval = -1; /* return failure */ ++ dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT ++ "TaskMgmt request: failed with no reply\n", ioc->name)); ++ goto out; ++ } ++ ++ out: ++ CLEAR_MGMT_STATUS(ioc->taskmgmt_cmds.status) ++ return retval; ++} ++ ++/** ++ * mptsas_broadcast_primative_work - Work queue thread to handle ++ * broadcast primitive events ++ * @work: work queue payload containing info describing the event ++ * ++ **/ ++static void ++mptsas_broadcast_primative_work(struct fw_event_work *fw_event) ++{ ++ MPT_ADAPTER *ioc = fw_event->ioc; ++ MPT_FRAME_HDR *mf; ++ VirtDevice *vdevice; ++ int ii; ++ struct scsi_cmnd *sc; ++ SCSITaskMgmtReply_t * pScsiTmReply; ++ u8 issue_reset; ++ int task_context; ++ u8 channel, id; ++ int lun; ++ u32 termination_count; ++ u32 query_count; ++ ++ dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT ++ "%s - enter\n", ioc->name, __FUNCTION__)); ++ ++ mutex_lock(&ioc->taskmgmt_cmds.mutex); ++ if (mpt_set_taskmgmt_in_progress_flag(ioc) != 0) { ++ mutex_unlock(&ioc->taskmgmt_cmds.mutex); ++ mptsas_requeue_fw_event(ioc, fw_event, 1000); ++ return; ++ } ++ ++ issue_reset = 0; ++ termination_count = 0; ++ query_count = 0; ++ mpt_findImVolumes(ioc); ++ pScsiTmReply = (SCSITaskMgmtReply_t *) ioc->taskmgmt_cmds.reply; ++ ++ for (ii = 0; ii < ioc->req_depth; ii++) { ++ if (ioc->fw_events_off) ++ goto out; ++ sc = mptscsih_get_scsi_lookup(ioc, ii); ++ if (!sc) ++ continue; ++ mf = MPT_INDEX_2_MFPTR(ioc, ii); ++ if (!mf) ++ continue; ++ task_context = mf->u.frame.hwhdr.msgctxu.MsgContext; ++ vdevice = sc->device->hostdata; ++ if (!vdevice || !vdevice->vtarget) ++ continue; ++ if (vdevice->vtarget->tflags & MPT_TARGET_FLAGS_RAID_COMPONENT) ++ continue; /* skip hidden raid components */ ++ if (vdevice->vtarget->raidVolume) ++ continue; /* skip hidden raid components */ ++ channel = vdevice->vtarget->channel; ++ id = vdevice->vtarget->id; ++ lun = vdevice->lun; ++ if (mptsas_issue_tm(ioc, MPI_SCSITASKMGMT_TASKTYPE_QUERY_TASK, ++ channel, id, (u64)lun, task_context, 30, &issue_reset)) ++ goto out; ++ query_count++; ++ termination_count += ++ le32_to_cpu(pScsiTmReply->TerminationCount); ++ if ((pScsiTmReply->IOCStatus == MPI_IOCSTATUS_SUCCESS) && ++ (pScsiTmReply->ResponseCode == ++ MPI_SCSITASKMGMT_RSP_TM_SUCCEEDED || ++ pScsiTmReply->ResponseCode == ++ MPI_SCSITASKMGMT_RSP_IO_QUEUED_ON_IOC)) ++ continue; ++ if (mptsas_issue_tm(ioc, ++ MPI_SCSITASKMGMT_TASKTYPE_ABRT_TASK_SET, ++ channel, id, (u64)lun, 0, 30, &issue_reset)) ++ goto out; ++ termination_count += ++ le32_to_cpu(pScsiTmReply->TerminationCount); ++ } ++ ++ out: ++ dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT ++ "%s - exit, query_count = %d termination_count = %d\n", ++ ioc->name, __FUNCTION__, query_count, termination_count)); ++ ++ ioc->broadcast_aen_busy = 0; ++ mpt_clear_taskmgmt_in_progress_flag(ioc); ++ mutex_unlock(&ioc->taskmgmt_cmds.mutex); ++ ++ if (issue_reset) { ++ printk(MYIOC_s_WARN_FMT "Issuing Reset from %s!!\n", ++ ioc->name, __FUNCTION__); ++ if (mpt_SoftResetHandler(ioc, CAN_SLEEP)) ++ mpt_HardResetHandler(ioc, CAN_SLEEP); ++ } ++ mptsas_free_fw_event(ioc, fw_event); ++} ++ ++/** ++ * mptsas_send_ir2_event - handle exposing hidden disk when an inactive raid volume is added ++ * @ioc: Pointer to MPT_ADAPTER structure ++ * @ir2_data: ++ * ++ **/ ++static void ++mptsas_send_ir2_event(struct fw_event_work *fw_event) ++{ ++ MPT_ADAPTER *ioc; ++ struct mptsas_hotplug_event hot_plug_info; ++ MPI_EVENT_DATA_IR2 *ir2_data; ++ u8 reasonCode; ++ RaidPhysDiskPage0_t phys_disk; ++ ++ ioc = fw_event->ioc; ++ ir2_data = (MPI_EVENT_DATA_IR2 *)fw_event->event_data; ++ reasonCode = ir2_data->ReasonCode; ++ ++ devtprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Entering %s: " ++ "ReasonCode=%02x\n", ioc->name, __func__, reasonCode)); ++ ++ memset(&hot_plug_info, 0, sizeof(struct mptsas_hotplug_event)); ++ hot_plug_info.id = ir2_data->TargetID; ++ hot_plug_info.channel = ir2_data->Bus; ++ switch (reasonCode) { ++ case MPI_EVENT_IR2_RC_FOREIGN_CFG_DETECTED: ++ hot_plug_info.event_type = MPTSAS_ADD_INACTIVE_VOLUME; ++ break; ++ case MPI_EVENT_IR2_RC_DUAL_PORT_REMOVED: ++ hot_plug_info.phys_disk_num = ir2_data->PhysDiskNum; ++ hot_plug_info.event_type = MPTSAS_DEL_PHYSDISK; ++ break; ++ case MPI_EVENT_IR2_RC_DUAL_PORT_ADDED: ++ hot_plug_info.phys_disk_num = ir2_data->PhysDiskNum; ++ mpt_raid_phys_disk_pg0(ioc, ++ ir2_data->PhysDiskNum, &phys_disk); ++ hot_plug_info.id = phys_disk.PhysDiskID; ++ hot_plug_info.event_type = MPTSAS_ADD_PHYSDISK; ++ break; ++ default: ++ mptsas_free_fw_event(ioc, fw_event); ++ return; ++ } ++ mptsas_hotplug_work(ioc, fw_event, &hot_plug_info); + } + + +@@ -4962,7 +5706,7 @@ + fw_event = kzalloc(sz, GFP_ATOMIC); + if (!fw_event) { + printk(MYIOC_s_WARN_FMT "%s: failed at (line=%d)\n", ioc->name, +- __func__, __LINE__); ++ __func__, __LINE__); + return 0; + } + memcpy(fw_event->event_data, reply->Data, event_data_sz); +@@ -4992,215 +5736,10 @@ + goto release_sdev; + out: + printk(MYIOC_s_INFO_FMT "removing raid volume, channel %d, " +- "id %d\n", ioc->name, MPTSAS_RAID_CHANNEL, id); ++ "id %d\n", ioc->name, MPTSAS_RAID_CHANNEL,id); + scsi_remove_device(sdev); + release_sdev: + scsi_device_put(sdev); +-} +- +-static void +-mptsas_not_responding_devices(MPT_ADAPTER *ioc) +-{ +- struct mptsas_portinfo buffer, *port_info; +- struct sas_device_info *sas_info; +- struct mptsas_devinfo sas_device; +- u32 handle; +- VirtTarget *vtarget = NULL; +- struct mptsas_phyinfo *phy_info; +- u8 found_expander; +- +- if (ioc->disable_hotplug_remove) +- return; +- +- mpt_findImVolumes(ioc); +- +- /* devices, logical volumes */ +- redo_device_scan: +- list_for_each_entry(sas_info, &ioc->sas_device_info_list, list) { +- if (sas_info->is_cached) +- continue; +- if (!sas_info->is_logical_volume) { +- sas_device.handle = 0; +- mptsas_sas_device_pg0(ioc, &sas_device, +- (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID << +- MPI_SAS_DEVICE_PGAD_FORM_SHIFT), +- (sas_info->fw.channel << 8) + +- sas_info->fw.id); +- if (sas_device.handle) +- continue; +- /* delete device */ +- if ((vtarget = mptsas_find_vtarget(ioc, +- sas_info->fw.channel, +- sas_info->fw.id))) +- vtarget->deleted = 1; +- phy_info = mptsas_find_phyinfo_by_sas_address(ioc, +- sas_info->sas_address); +- if (phy_info) { +- mptsas_del_end_device(ioc, phy_info); +- goto redo_device_scan; +- } +- } else +- mptsas_volume_delete(ioc, sas_info->fw.id); +- } +- +- /* expanders */ +- redo_expander_scan: +- list_for_each_entry(port_info, &ioc->sas_topology, list) { +- +- if (port_info->phy_info && +- (!(port_info->phy_info[0].identify.device_info & +- MPI_SAS_DEVICE_INFO_SMP_TARGET))) +- continue; +- found_expander = 0; +- handle = 0xFFFF; +- while (!mptsas_sas_expander_pg0(ioc, &buffer, +- (MPI_SAS_EXPAND_PGAD_FORM_GET_NEXT_HANDLE << +- MPI_SAS_EXPAND_PGAD_FORM_SHIFT), handle) && +- !found_expander) { +- +- handle = buffer.phy_info[0].handle; +- if (buffer.phy_info[0].identify.sas_address == +- port_info->phy_info[0].identify.sas_address) { +- found_expander = 1; +- } +- kfree(buffer.phy_info); +- } +- +- if (!found_expander) { +- mptsas_expander_delete(ioc, port_info); +- goto redo_expander_scan; +- } +- } +-} +- +-/** +- * mptsas_probe_expanders - adding expanders +- * @ioc: Pointer to MPT_ADAPTER structure +- * +- **/ +-static void +-mptsas_probe_expanders(MPT_ADAPTER *ioc) +-{ +- struct mptsas_portinfo buffer, *port_info; +- u32 handle; +- int i; +- +- handle = 0xFFFF; +- while (!mptsas_sas_expander_pg0(ioc, &buffer, +- (MPI_SAS_EXPAND_PGAD_FORM_GET_NEXT_HANDLE << +- MPI_SAS_EXPAND_PGAD_FORM_SHIFT), handle)) { +- +- handle = buffer.phy_info[0].handle; +- port_info = mptsas_find_portinfo_by_sas_address(ioc, +- buffer.phy_info[0].identify.sas_address); +- +- if (port_info) { +- /* refreshing handles */ +- for (i = 0; i < buffer.num_phys; i++) { +- port_info->phy_info[i].handle = handle; +- port_info->phy_info[i].identify.handle_parent = +- buffer.phy_info[0].identify.handle_parent; +- } +- mptsas_expander_refresh(ioc, port_info); +- kfree(buffer.phy_info); +- continue; +- } +- +- port_info = kzalloc(sizeof(struct mptsas_portinfo), GFP_KERNEL); +- if (!port_info) { +- dfailprintk(ioc, printk(MYIOC_s_ERR_FMT +- "%s: exit at line=%d\n", ioc->name, +- __func__, __LINE__)); +- return; +- } +- port_info->num_phys = buffer.num_phys; +- port_info->phy_info = buffer.phy_info; +- for (i = 0; i < port_info->num_phys; i++) +- port_info->phy_info[i].portinfo = port_info; +- mutex_lock(&ioc->sas_topology_mutex); +- list_add_tail(&port_info->list, &ioc->sas_topology); +- mutex_unlock(&ioc->sas_topology_mutex); +- printk(MYIOC_s_INFO_FMT "add expander: num_phys %d, " +- "sas_addr (0x%llx)\n", ioc->name, port_info->num_phys, +- (unsigned long long)buffer.phy_info[0].identify.sas_address); +- mptsas_expander_refresh(ioc, port_info); +- } +-} +- +-static void +-mptsas_probe_devices(MPT_ADAPTER *ioc) +-{ +- u16 retry_count; +- u16 handle; +- struct mptsas_devinfo sas_device; +- struct mptsas_phyinfo *phy_info; +- enum device_state state; +- +- handle = 0xFFFF; +- while (!(mptsas_sas_device_pg0(ioc, &sas_device, +- MPI_SAS_DEVICE_PGAD_FORM_GET_NEXT_HANDLE, handle))) { +- +- handle = sas_device.handle; +- +- if ((sas_device.device_info & +- (MPI_SAS_DEVICE_INFO_SSP_TARGET | +- MPI_SAS_DEVICE_INFO_STP_TARGET | +- MPI_SAS_DEVICE_INFO_SATA_DEVICE)) == 0) +- continue; +- +- phy_info = mptsas_refreshing_device_handles(ioc, &sas_device); +- if (!phy_info) +- continue; +- +- if (mptsas_get_rphy(phy_info)) +- continue; +- +- state = DEVICE_RETRY; +- retry_count = 0; +- while (state == DEVICE_RETRY) { +- state = mptsas_test_unit_ready(ioc, sas_device.channel, +- sas_device.id, retry_count++); +- ssleep(1); +- } +- if (state == DEVICE_READY) +- mptsas_add_end_device(ioc, phy_info); +- } +-} +- +-/** +- * mptsas_scan_sas_topology - +- * @ioc: Pointer to MPT_ADAPTER structure +- * @sas_address: +- * +- **/ +-static void +-mptsas_scan_sas_topology(MPT_ADAPTER *ioc) +-{ +- struct scsi_device *sdev; +- int i; +- +- mptsas_probe_hba_phys(ioc); +- mptsas_probe_expanders(ioc); +- mptsas_probe_devices(ioc); +- +- /* +- Reporting RAID volumes. +- */ +- if (!ioc->ir_firmware || !ioc->raid_data.pIocPg2 || +- !ioc->raid_data.pIocPg2->NumActiveVolumes) +- return; +- for (i = 0; i < ioc->raid_data.pIocPg2->NumActiveVolumes; i++) { +- if ((sdev = scsi_device_lookup(ioc->sh, MPTSAS_RAID_CHANNEL, +- ioc->raid_data.pIocPg2->RaidVolume[i].VolumeID, 0))) { +- scsi_device_put(sdev); +- continue; +- } +- printk(MYIOC_s_INFO_FMT "attaching raid volume, channel %d, " +- "id %d\n", ioc->name, MPTSAS_RAID_CHANNEL, +- ioc->raid_data.pIocPg2->RaidVolume[i].VolumeID); +- scsi_add_device(ioc->sh, MPTSAS_RAID_CHANNEL, +- ioc->raid_data.pIocPg2->RaidVolume[i].VolumeID, 0); +- } + } + + /** +@@ -5273,7 +5812,7 @@ + ioc->name); + error = -1; + goto out_mptsas_probe; +- } ++ } + + spin_lock_irqsave(&ioc->FreeQlock, flags); + +@@ -5331,7 +5870,7 @@ + sh->sg_tablesize = numSGE; + } + +- hd = shost_priv(sh); ++ hd = shost_private(sh); + hd->ioc = ioc; + + /* SCSI needs scsi_cmnd lookup table! +@@ -5353,12 +5892,11 @@ + hd->last_queue_full = 0; + ioc->disable_hotplug_remove = mpt_disable_hotplug_remove; + if (ioc->disable_hotplug_remove) +- printk(MYIOC_s_INFO_FMT +- "disabling hotplug remove\n", ioc->name); ++ printk(MYIOC_s_INFO_FMT "disabling hotplug remove\n", ioc->name); + + INIT_LIST_HEAD(&hd->target_reset_list); + INIT_LIST_HEAD(&ioc->sas_device_info_list); +- mutex_init(&ioc->sas_device_info_mutex); ++ init_MUTEX(&ioc->sas_device_info_mutex); + + spin_unlock_irqrestore(&ioc->FreeQlock, flags); + +@@ -5387,6 +5925,16 @@ + return error; + } + ++void ++mptsas_shutdown(struct pci_dev *pdev) ++{ ++ MPT_ADAPTER *ioc = pci_get_drvdata(pdev); ++ ++ mptsas_fw_event_off(ioc); ++ mptsas_cleanup_fw_event_q(ioc); ++} ++ ++ + /** + * mptsas_remove - + * @pdev: +@@ -5399,8 +5947,7 @@ + struct mptsas_portinfo *p, *n; + int i; + +- mptsas_fw_event_off(ioc); +- mptsas_cleanup_fw_event_q(ioc); ++ mptsas_shutdown(pdev); + + mptsas_del_device_components(ioc); + +@@ -5441,7 +5988,7 @@ + .id_table = mptsas_pci_table, + .probe = mptsas_probe, + .remove = __devexit_p(mptsas_remove), +- .shutdown = mptscsih_shutdown, ++ .shutdown = mptsas_shutdown, + #ifdef CONFIG_PM + .suspend = mptscsih_suspend, + .resume = mptscsih_resume, +diff -r 60d73800068f drivers/message/fusion/mptsas.h +--- a/drivers/message/fusion/mptsas.h Tue Jun 30 11:26:39 2009 +0100 ++++ b/drivers/message/fusion/mptsas.h Wed Jul 01 09:46:25 2009 +0100 +@@ -50,7 +50,7 @@ + /*{-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ + + struct mptsas_target_reset_event { +- struct list_head list; ++ struct list_head list; + MpiEventDataSasDeviceStatusChange_t sas_event_data; + u8 target_reset_issued; + unsigned long time_count; +@@ -76,20 +76,17 @@ + }; + + struct sas_device_info { +- struct list_head list; ++ struct list_head list; + struct sas_mapping os; /* operating system mapping*/ + struct sas_mapping fw; /* firmware mapping */ +- u64 sas_address; ++ u64 sas_address; + u32 device_info; /* specific bits for devices */ + u16 slot; /* enclosure slot id */ + u64 enclosure_logical_id; /*enclosure address */ + u8 is_logical_volume; /* is this logical volume */ +- /* this belongs to volume */ +- u8 is_hidden_raid_component; +- /* this valid when is_hidden_raid_component set */ +- u8 volume_id; +- /* cached data for a removed device */ +- u8 is_cached; ++ u8 is_hidden_raid_component; /* this belongs to volume */ ++ u8 volume_id; /* this valid when is_hidden_raid_component set */ ++ u8 is_cached; /* cached data for a removed device */ + }; + + struct mptsas_hotplug_event { +@@ -107,8 +104,12 @@ + + + struct fw_event_work { +- struct list_head list; ++ struct list_head list; ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,19)) + struct delayed_work work; ++#else ++ struct work_struct work; ++#endif + MPT_ADAPTER *ioc; + u32 event; + u8 retries; +@@ -145,31 +146,40 @@ + u64 sas_address; /* WWN of this device, + SATA is assigned by HBA,expander */ + u32 device_info; /* bitfield detailed info about this device */ ++#if !defined(MPT_WIDE_PORT_API) ++ u8 wide_port_enable; /* when set, this is part of wide port*/ ++#endif + }; + + /* + * Specific details on ports, wide/narrow + */ + struct mptsas_portinfo_details{ ++#if !defined(MPT_WIDE_PORT_API) ++ u8 port_id; /* port number provided to transport */ ++ u8 rphy_id; /* phy index used for reporting end device*/ ++ u32 device_info; /* bitfield detailed info about this device */ ++#endif + u16 num_phys; /* number of phys beloing to this port */ +- u64 phy_bitmask; /* this needs extending to support 128 phys */ ++ u64 phy_bitmask; /* this needs extending to support 128 phys */ + struct sas_rphy *rphy; /* rphy for end devices */ ++#if defined(MPT_WIDE_PORT_API) + struct sas_port *port; /* transport layer port object */ ++#endif + struct scsi_target *starget; + struct mptsas_portinfo *port_info; + }; + + struct mptsas_phyinfo { + u16 handle; /* handle for this phy */ +- u8 phy_id; /* phy index */ +- u8 port_id; /* port number this phy is part of */ ++ u8 phy_id; /* phy index */ ++ u8 port_id; /* port number this phy is part of */ + u8 negotiated_link_rate; /* nego'd link rate for this phy */ +- u8 hw_link_rate; /* hardware max/min phys link rate */ ++ u8 hw_link_rate; /* hardware max/min phys link rate */ + u8 programmed_link_rate; /* programmed max/min phy link rate */ ++#if defined(MPT_WIDE_PORT_API) + u8 sas_port_add_phy; /* flag to request sas_port_add_phy*/ +- u8 change_count; /* change count of the phy */ +- u8 port_flags; /* info wrt host sas ports */ +- u32 phy_info; /* various info wrt the phy */ ++#endif + struct mptsas_devinfo identify; /* point to phy device info */ + struct mptsas_devinfo attached; /* point to attached device info */ + struct sas_phy *phy; +@@ -194,7 +204,16 @@ + u8 sep_id; /* SEP device logical target id */ + u8 sep_channel; /* SEP channel logical channel id */ + }; +- ++#if 0 ++struct mptsas_broadcast_primative_event { ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,19)) ++ struct delayed_work aen_work; ++#else ++ struct work_struct aen_work; ++#endif ++ MPT_ADAPTER *ioc; ++}; ++#endif + /*}-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ + #endif + +diff -r 60d73800068f drivers/message/fusion/mptscsih.c +--- a/drivers/message/fusion/mptscsih.c Tue Jun 30 11:26:39 2009 +0100 ++++ b/drivers/message/fusion/mptscsih.c Wed Jul 01 09:46:25 2009 +0100 +@@ -43,7 +43,7 @@ + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ +- ++#include + #include + #include + #include +@@ -64,6 +64,7 @@ + #include + #include + ++#include "linux_compat.h" /* linux-2.6 tweaks */ + #include "mptbase.h" + #include "mptscsih.h" + #include "lsi/mpi_log_sas.h" +@@ -102,8 +103,7 @@ + + int mptscsih_ioc_reset(MPT_ADAPTER *ioc, int post_reset); + int mptscsih_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply); +-static void mptscsih_synchronize_cache(struct scsi_device *sdev, +- MPT_SCSI_HOST *hd, VirtDevice *vdevice); ++static void mptscsih_synchronize_cache(struct scsi_device *sdev, MPT_SCSI_HOST *hd, VirtDevice *vdevice); + + void mptscsih_remove(struct pci_dev *); + void mptscsih_shutdown(struct pci_dev *); +@@ -111,16 +111,23 @@ + int mptscsih_suspend(struct pci_dev *pdev, pm_message_t state); + int mptscsih_resume(struct pci_dev *pdev); + #endif +- +-/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ +-/** ++static int mptscsih_taskmgmt_reply(MPT_ADAPTER *ioc, u8 type, ++ SCSITaskMgmtReply_t *pScsiTmReply); ++static int mptscsih_get_completion_code(MPT_ADAPTER *ioc, MPT_FRAME_HDR *req, ++ MPT_FRAME_HDR *reply); ++ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25)) ++#define SNS_LEN(scp) sizeof((scp)->sense_buffer) ++#endif ++/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ ++/* + * mptscsih_getFreeChainBuffer - Function to get a free chain + * from the MPT_SCSI_HOST FreeChainQ. + * @ioc: Pointer to MPT_ADAPTER structure + * @req_idx: Index of the SCSI IO request frame. (output) + * + * return SUCCESS or FAILED +- **/ ++ */ + static inline int + mptscsih_getFreeChainBuffer(MPT_ADAPTER *ioc, int *retIndex) + { +@@ -130,7 +137,7 @@ + int chain_idx; + + dsgprintk(ioc, printk(MYIOC_s_DEBUG_FMT "getFreeChainBuffer called\n", +- ioc->name)); ++ ioc->name)); + spin_lock_irqsave(&ioc->FreeQlock, flags); + if (!list_empty(&ioc->FreeChainQ)) { + int offset; +@@ -142,16 +149,13 @@ + chain_idx = offset / ioc->req_sz; + rc = SUCCESS; + dsgprintk(ioc, printk(MYIOC_s_DEBUG_FMT +- "getFreeChainBuffer chainBuf=%p ChainBuffer=%p" +- " offset=%d chain_idx=%d\n", +- ioc->name, chainBuf, ioc->ChainBuffer, offset, +- chain_idx)); ++ "getFreeChainBuffer chainBuf=%p ChainBuffer=%p offset=%d chain_idx=%d\n", ++ ioc->name, chainBuf, ioc->ChainBuffer, offset, chain_idx)); + } else { + rc = FAILED; + chain_idx = MPT_HOST_NO_CHAIN; +- dfailprintk(ioc, printk(MYIOC_s_ERR_FMT +- "getFreeChainBuffer failed\n", +- ioc->name)); ++ dfailprintk(ioc, printk(MYIOC_s_ERR_FMT "getFreeChainBuffer failed\n", ++ ioc->name)); + } + spin_unlock_irqrestore(&ioc->FreeQlock, flags); + +@@ -160,7 +164,7 @@ + } /* mptscsih_getFreeChainBuffer() */ + + /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ +-/** ++/* + * mptscsih_AddSGE - Add a SGE (plus chain buffers) to the + * SCSIIORequest_t Message Frame. + * @ioc: Pointer to MPT_ADAPTER structure +@@ -168,7 +172,7 @@ + * @pReq: Pointer to SCSIIORequest_t structure + * + * Returns ... +- **/ ++ */ + static int + mptscsih_AddSGE(MPT_ADAPTER *ioc, struct scsi_cmnd *SCpnt, + SCSIIORequest_t *pReq, int req_idx) +@@ -188,19 +192,59 @@ + dma_addr_t v2; + u32 RequestNB; + +- sgdir = le32_to_cpu(pReq->Control) & MPI_SCSIIO_CONTROL_DATADIRECTION_MASK; ++#ifdef EEDP_SUPPORT ++ if (pReq->Function == MPI_FUNCTION_SCSI_IO_32) { ++ SCSIIO32Request_t *mpi_request = (SCSIIO32Request_t *)pReq; ++ ++ sgdir = le32_to_cpu(mpi_request->Control) ++ & MPI_SCSIIO_CONTROL_DATADIRECTION_MASK; ++ psge = (char *) &mpi_request->SGL; ++ } else { ++#endif ++ sgdir = le32_to_cpu(pReq->Control) & MPI_SCSIIO_CONTROL_DATADIRECTION_MASK; ++ psge = (char *) &pReq->SGL; ++#ifdef EEDP_SUPPORT ++ } ++#endif + if (sgdir == MPI_SCSIIO_CONTROL_WRITE) { + sgdir = MPT_TRANSFER_HOST_TO_IOC; + } else { + sgdir = MPT_TRANSFER_IOC_TO_HOST; + } + +- psge = (char *) &pReq->SGL; + frm_sz = ioc->req_sz; ++ + + /* Map the data portion, if any. + * sges_left = 0 if no data transfer. + */ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)) ++ if ( (sges_left = SCpnt->use_sg) ) { ++ sges_left = pci_map_sg(ioc->pcidev, ++ (struct scatterlist *) SCpnt->request_buffer, ++ SCpnt->use_sg, ++ SCpnt->sc_data_direction); ++ if (sges_left == 0) ++ return FAILED; ++ } else if (SCpnt->request_bufflen) { ++ SCpnt->SCp.dma_handle = pci_map_single(ioc->pcidev, ++ SCpnt->request_buffer, ++ SCpnt->request_bufflen, ++ SCpnt->sc_data_direction); ++ dsgprintk(ioc, printk(MYIOC_s_DEBUG_FMT "SG: non-SG for %p, len=%d\n", ++ ioc->name, SCpnt, SCpnt->request_bufflen)); ++ ioc->add_sge((char *) &pReq->SGL, ++ 0xD1000000|sgdir|SCpnt->request_bufflen, ++ SCpnt->SCp.dma_handle); ++ ++ return SUCCESS; ++ } ++ ++ /* Handle the SG case. ++ */ ++ sg = (struct scatterlist *) SCpnt->request_buffer; ++#else ++ + sges_left = scsi_dma_map(SCpnt); + if (sges_left < 0) + return FAILED; +@@ -208,8 +252,9 @@ + /* Handle the SG case. + */ + sg = scsi_sglist(SCpnt); ++#endif + sg_done = 0; +- sgeOffset = sizeof(SCSIIORequest_t) - sizeof(SGE_IO_UNION); ++ sgeOffset = psge - (char *) pReq; + chainSge = NULL; + + /* Prior to entering this loop - the following must be set +@@ -231,7 +276,8 @@ + for (ii=0; ii < (numSgeThisFrame-1); ii++) { + thisxfer = sg_dma_len(sg); + if (thisxfer == 0) { +- sg = sg_next(sg); /* Get next SG element from the OS */ ++ /* Get next SG element from the OS */ ++ sg = mpt_sg_next(sg); + sg_done++; + continue; + } +@@ -239,7 +285,8 @@ + v2 = sg_dma_address(sg); + ioc->add_sge(psge, sgflags | thisxfer, v2); + +- sg = sg_next(sg); /* Get next SG element from the OS */ ++ /* Get next SG element from the OS */ ++ sg = mpt_sg_next(sg); + psge += ioc->SGE_size; + sgeOffset += ioc->SGE_size; + sg_done++; +@@ -269,7 +316,7 @@ + * Offset and Length fields. + */ + ioc->add_chain((char *)chainSge, 0, sgeOffset, +- ioc->ChainBufferDMA + chain_dma_off); ++ ioc->ChainBufferDMA + chain_dma_off); + } else { + /* The current buffer is the original MF + * and there is no Chain buffer. +@@ -318,7 +365,7 @@ + u8 nextChain = (u8) (sgeOffset >> 2); + sgeOffset += ioc->SGE_size; + ioc->add_chain((char *)chainSge, nextChain, sgeOffset, +- ioc->ChainBufferDMA + chain_dma_off); ++ ioc->ChainBufferDMA + chain_dma_off); + } else { + /* The original MF buffer requires a chain buffer - + * set the offset. +@@ -530,12 +577,16 @@ + scsi_print_command(sc); + printk(MYIOC_s_DEBUG_FMT "\tfw_channel = %d, fw_id = %d, lun = %d\n", + ioc->name, pScsiReply->Bus, pScsiReply->TargetID, sc->device->lun); +- printk(MYIOC_s_DEBUG_FMT +- "\trequest_len = %d, underflow = %d, resid = %d\n", +- ioc->name, scsi_bufflen(sc), sc->underflow, scsi_get_resid(sc)); +- printk(MYIOC_s_DEBUG_FMT +- "\ttag = %d, transfer_count = %d, sc->result = %08X\n", +- ioc->name, le16_to_cpu(pScsiReply->TaskTag), ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)) ++ printk(MYIOC_s_DEBUG_FMT "\trequest_len = %d, underflow = %d, resid = %d\n", ++ ioc->name, sc->request_bufflen, sc->underflow, sc->resid); ++#else ++ printk(MYIOC_s_DEBUG_FMT "\trequest_len = %d, underflow = %d, " ++ "resid = %d\n", ioc->name, scsi_bufflen(sc), sc->underflow, ++ scsi_get_resid(sc)); ++#endif ++ printk(MYIOC_s_DEBUG_FMT "\ttag = %d, transfer_count = %d, " ++ "sc->result = %08X\n", ioc->name, le16_to_cpu(pScsiReply->TaskTag), + le32_to_cpu(pScsiReply->TransferCount), sc->result); + + printk(MYIOC_s_DEBUG_FMT "\tiocstatus = %s (0x%04x), " +@@ -563,7 +614,7 @@ + #endif + + /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ +-/** ++/* + * mptscsih_io_done - Main SCSI IO callback routine registered to + * Fusion MPT (base) driver + * @ioc: Pointer to MPT_ADAPTER structure +@@ -576,7 +627,7 @@ + * load/init time via the mpt_register() API call. + * + * Returns 1 indicating alloc'd request frame ptr should be freed. +- **/ ++ */ + int + mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr) + { +@@ -588,16 +639,15 @@ + VirtDevice *vdevice; + VirtTarget *vtarget; + +- hd = shost_priv(ioc->sh); +- ++ hd = shost_private(ioc->sh); + req_idx = le16_to_cpu(mf->u.frame.hwhdr.msgctxu.fld.req_idx); + req_idx_MR = (mr != NULL) ? + le16_to_cpu(mr->u.frame.hwhdr.msgctxu.fld.req_idx) : req_idx; + if ((req_idx != req_idx_MR) || + (le32_to_cpu(mf->u.frame.linkage.arg1) == 0xdeadbeaf)) { +- printk(MYIOC_s_WARN_FMT +- "Received a mf that was already freed\n", ioc->name); +- printk(MYIOC_s_WARN_FMT ++ printk(MYIOC_s_ERR_FMT "Received a mf that was already freed\n", ++ ioc->name); ++ printk (MYIOC_s_ERR_FMT + "req_idx=%x req_idx_MR=%x mf=%p mr=%p sc=%p\n", + ioc->name, req_idx, req_idx_MR, mf, mr, + mptscsih_get_scsi_lookup(ioc, req_idx_MR)); +@@ -623,6 +673,16 @@ + if ((unsigned char *)mf != sc->host_scribble) { + mptscsih_freeChainBuffers(ioc, req_idx); + return 1; ++ } ++ ++ if (ioc->bus_type == SAS) { ++ VirtDevice *vdevice = sc->device->hostdata; ++ ++ if (!vdevice || !vdevice->vtarget || ++ vdevice->vtarget->deleted) { ++ sc->result = DID_NO_CONNECT << 16; ++ goto out; ++ } + } + + sc->host_scribble = NULL; +@@ -632,7 +692,7 @@ + + if((ioc->facts.MsgVersion >= MPI_VERSION_01_05) && pScsiReply){ + dmfprintk(ioc, printk(MYIOC_s_DEBUG_FMT +- "ScsiDone (mf=%p,mr=%p,sc=%p,idx=%d,task_tag=%d)\n", ++ "ScsiDone (mf=%p,mr=%p,sc=%p,idx=%d,task-tag=%d)\n", + ioc->name, mf, mr, sc, req_idx, pScsiReply->TaskTag)); + }else{ + dmfprintk(ioc, printk(MYIOC_s_DEBUG_FMT +@@ -654,7 +714,11 @@ + scsi_state = pScsiReply->SCSIState; + scsi_status = pScsiReply->SCSIStatus; + xfer_cnt = le32_to_cpu(pScsiReply->TransferCount); ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)) ++ sc->resid = sc->request_bufflen - xfer_cnt; ++#else + scsi_set_resid(sc, scsi_bufflen(sc) - xfer_cnt); ++#endif + log_info = le32_to_cpu(pScsiReply->IOCLogInfo); + vdevice = sc->device->hostdata; + +@@ -722,12 +786,14 @@ + } + } + } else if (ioc->bus_type == FC) { +- /* The FC IOC may kill a request for variety +- * of reasons, some of which may be recovered +- * by a retry, some which are unlikely to be +- * recovered. Return DID_ERROR instead of +- * DID_RESET to permit retry of the command, +- * just not an infinite number of them */ ++ /* ++ * The FC IOC may kill a request for variety of ++ * reasons, some of which may be recovered by a ++ * retry, some which are unlikely to be ++ * recovered. Return DID_ERROR instead of ++ * DID_RESET to permit retry of the command, ++ * just not an infinite number of them ++ */ + sc->result = DID_ERROR << 16; + break; + } +@@ -743,18 +809,25 @@ + sc->result = DID_RESET << 16; + + case MPI_IOCSTATUS_SCSI_EXT_TERMINATED: /* 0x004C */ +- if (ioc->bus_type == FC) ++ if ( ioc->bus_type == FC ) + sc->result = DID_ERROR << 16; + else + sc->result = DID_RESET << 16; + break; + + case MPI_IOCSTATUS_SCSI_RESIDUAL_MISMATCH: /* 0x0049 */ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)) ++ sc->resid = sc->request_bufflen - xfer_cnt; ++#else + scsi_set_resid(sc, scsi_bufflen(sc) - xfer_cnt); ++#endif + if((xfer_cnt==0)||(sc->underflow > xfer_cnt)) + sc->result=DID_SOFT_ERROR << 16; + else /* Sufficient data transfer occurred */ + sc->result = (DID_OK << 16) | scsi_status; ++ dreplyprintk(ioc, printk(MYIOC_s_DEBUG_FMT ++ "RESIDUAL_MISMATCH: result=%x on channel=%d id=%d\n", ++ ioc->name, sc->result, sc->device->channel, sc->device->id)); + break; + + case MPI_IOCSTATUS_SCSI_DATA_UNDERRUN: /* 0x0045 */ +@@ -781,12 +854,17 @@ + pScsiReq->CDB[0] == READ_16 || + pScsiReq->CDB[0] == VERIFY || + pScsiReq->CDB[0] == VERIFY_16) { +- if (scsi_bufflen(sc) != +- xfer_cnt) { +- sc->result = DID_SOFT_ERROR << 16; +- printk(MYIOC_s_WARN_FMT "Errata" +- "on LSI53C1030 occurred. sc->request_bufflen=0x%02x, " +- "xfer_cnt=0x%02x\n", ioc->name, scsi_bufflen(sc), xfer_cnt); ++ unsigned int bufflen; ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)) ++ bufflen = sc->request_bufflen; ++#else ++ bufflen = scsi_bufflen(sc); ++#endif ++ if (bufflen != xfer_cnt) { ++ sc->result = DID_SOFT_ERROR << 16; ++ printk(MYIOC_s_WARN_FMT "Errata" ++ "on LSI53C1030 occurred. sc->request_bufflen=0x%02x, " ++ "xfer_cnt=0x%02x\n", ioc->name, bufflen, xfer_cnt); + } + } + } +@@ -799,7 +877,7 @@ + } + if (scsi_state & (MPI_SCSI_STATE_AUTOSENSE_FAILED | MPI_SCSI_STATE_NO_SCSI_STATUS)) { + /* What to do? +- */ ++ */ + sc->result = DID_SOFT_ERROR << 16; + } + else if (scsi_state & MPI_SCSI_STATE_TERMINATED) { +@@ -808,6 +886,13 @@ + } + } + ++ ++ dreplyprintk(ioc, printk(MYIOC_s_DEBUG_FMT ++ " sc->underflow={report ERR if < %02xh bytes xfer'd}\n", ++ ioc->name, sc->underflow)); ++ dreplyprintk(ioc, printk(MYIOC_s_DEBUG_FMT ++ " ActBytesXferd=%02xh\n", ioc->name, xfer_cnt)); ++ + /* Report Queue Full + */ + if (scsi_status == MPI_SCSI_STATUS_TASK_SET_FULL) +@@ -816,14 +901,24 @@ + break; + + case MPI_IOCSTATUS_SCSI_DATA_OVERRUN: /* 0x0044 */ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)) ++ sc->resid=0; ++#else + scsi_set_resid(sc, 0); ++#endif + case MPI_IOCSTATUS_SCSI_RECOVERED_ERROR: /* 0x0040 */ + case MPI_IOCSTATUS_SUCCESS: /* 0x0000 */ + sc->result = (DID_OK << 16) | scsi_status; + if (scsi_state == 0) { + ; + } else if (scsi_state & MPI_SCSI_STATE_AUTOSENSE_VALID) { +- ++ unsigned int bufflen; ++ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)) ++ bufflen = sc->request_bufflen; ++#else ++ bufflen = scsi_bufflen(sc); ++#endif + /* + * For potential trouble on LSI53C1030. (date:2007.xx.) + * It is checked whether the length of request data is equal to +@@ -833,30 +928,30 @@ + if (ioc->bus_type == SPI && vdevice && + vdevice->vtarget->type == TYPE_DISK) { + if (sc->sense_buffer[2] & 0x20) { +- difftransfer = +- sc->sense_buffer[3] << 24 | +- sc->sense_buffer[4] << 16 | +- sc->sense_buffer[5] << 8 | +- sc->sense_buffer[6]; +- if ((sc->sense_buffer[3] & 0x80) == 0x80) { +- if (scsi_bufflen(sc) != xfer_cnt) { +- sc->sense_buffer[2] = MEDIUM_ERROR; +- sc->sense_buffer[12] = 0xff; +- sc->sense_buffer[13] = 0xff; +- printk(MYIOC_s_WARN_FMT "Errata on " +- "LSI53C1030 occurred. sc->request_bufflen=0x%02x," +- "xfer_cnt=0x%02x\n", ioc->name, scsi_bufflen(sc), xfer_cnt); +- } +- } else { +- if (scsi_bufflen(sc) != xfer_cnt + difftransfer) { +- sc->sense_buffer[2] = MEDIUM_ERROR; +- sc->sense_buffer[12] = 0xff; +- sc->sense_buffer[13] = 0xff; +- printk(MYIOC_s_WARN_FMT "Errata on " +- "LSI53C1030 occurred. sc->request_bufflen=0x%02x," +- " xfer_cnt=0x%02x, difftransfer=0x%02x\n", +- ioc->name, scsi_bufflen(sc) , xfer_cnt, difftransfer); +- } ++ difftransfer = ++ sc->sense_buffer[3] << 24 | ++ sc->sense_buffer[4] << 16 | ++ sc->sense_buffer[5] << 8 | ++ sc->sense_buffer[6]; ++ if ((sc->sense_buffer[3] & 0x80) == 0x80) { ++ if (bufflen != xfer_cnt) { ++ sc->sense_buffer[2] = MEDIUM_ERROR; ++ sc->sense_buffer[12] = 0xff; ++ sc->sense_buffer[13] = 0xff; ++ printk(MYIOC_s_WARN_FMT "Errata on " ++ "LSI53C1030 occurred. sc->request_bufflen=0x%02x," ++ "xfer_cnt=0x%02x\n", ioc->name, bufflen, xfer_cnt); ++ } ++ } else { ++ if (bufflen != xfer_cnt + difftransfer) { ++ sc->sense_buffer[2] = MEDIUM_ERROR; ++ sc->sense_buffer[12] = 0xff; ++ sc->sense_buffer[13] = 0xff; ++ printk(MYIOC_s_WARN_FMT "Errata on " ++ "LSI53C1030 occurred. sc->request_bufflen=0x%02x," ++ " xfer_cnt=0x%02x, difftransfer=0x%02x\n", ++ ioc->name, bufflen , xfer_cnt, difftransfer); ++ } + } + } + } +@@ -872,7 +967,7 @@ + + } + else if (scsi_state & +- (MPI_SCSI_STATE_AUTOSENSE_FAILED | MPI_SCSI_STATE_NO_SCSI_STATUS) ++ (MPI_SCSI_STATE_AUTOSENSE_FAILED | MPI_SCSI_STATE_NO_SCSI_STATUS) + ) { + /* + * What to do? +@@ -903,6 +998,13 @@ + case MPI_IOCSTATUS_SCSI_PROTOCOL_ERROR: /* 0x0047 */ + sc->result = DID_SOFT_ERROR << 16; + break; ++#ifdef EEDP_SUPPORT ++ case MPI_IOCSTATUS_EEDP_GUARD_ERROR: ++ case MPI_IOCSTATUS_EEDP_REF_TAG_ERROR: ++ case MPI_IOCSTATUS_EEDP_APP_TAG_ERROR: ++ sc->result = DID_PARITY << 16; ++ break; ++#endif /* EEDP Support */ + + case MPI_IOCSTATUS_INVALID_FUNCTION: /* 0x0001 */ + case MPI_IOCSTATUS_INVALID_SGL: /* 0x0003 */ +@@ -928,8 +1030,19 @@ + + } /* end of address reply case */ + ++ out: + /* Unmap the DMA buffers, if any. */ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)) ++ if (sc->use_sg) { ++ pci_unmap_sg(ioc->pcidev, (struct scatterlist *) sc->request_buffer, ++ sc->use_sg, sc->sc_data_direction); ++ } else if (sc->request_bufflen) { ++ pci_unmap_single(ioc->pcidev, sc->SCp.dma_handle, ++ sc->request_bufflen, sc->sc_data_direction); ++ } ++#else + scsi_dma_unmap(sc); ++#endif + + sc->scsi_done(sc); /* Issue the command callback */ + +@@ -938,7 +1051,7 @@ + return 1; + } + +-/** ++/* + * mptscsih_flush_running_cmds - For each command found, search + * Scsi_Host instance taskQ and reply to OS. + * Called only if recovering from a FW reload. +@@ -947,7 +1060,7 @@ + * Returns: None. + * + * Must be called while new I/Os are being queued. +- **/ ++ */ + static void + mptscsih_flush_running_cmds(MPT_SCSI_HOST *hd) + { +@@ -970,7 +1083,19 @@ + mpt_free_msg_frame(ioc, (MPT_FRAME_HDR *)mf); + if ((unsigned char *)mf != sc->host_scribble) + continue; ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)) ++ if (sc->use_sg) { ++ pci_unmap_sg(ioc->pcidev, ++ (struct scatterlist *) sc->request_buffer, ++ sc->use_sg, sc->sc_data_direction); ++ } else if (sc->request_bufflen) { ++ pci_unmap_single(ioc->pcidev, ++ sc->SCp.dma_handle, sc->request_bufflen, ++ sc->sc_data_direction); ++ } ++#else + scsi_dma_unmap(sc); ++#endif + sc->result = DID_RESET << 16; + sc->host_scribble = NULL; + dtmprintk(ioc, sdev_printk(KERN_INFO, sc->device, MYIOC_s_FMT +@@ -980,7 +1105,7 @@ + } + } + +-/** ++/* + * mptscsih_search_running_cmds - Delete any commands associated + * with the specified target and lun. Function called only + * when a lun is disable by mid-layer. +@@ -993,15 +1118,15 @@ + * Returns: None. + * + * Called from slave_destroy. +- **/ ++ */ + static void + mptscsih_search_running_cmds(MPT_SCSI_HOST *hd, VirtDevice *vdevice) + { + SCSIIORequest_t *mf = NULL; + int ii; + struct scsi_cmnd *sc; +- struct scsi_lun lun; +- MPT_ADAPTER *ioc = hd->ioc; ++ struct scsi_lun lun; ++ MPT_ADAPTER *ioc = hd->ioc; + unsigned long flags; + + spin_lock_irqsave(&ioc->scsi_lookup_lock, flags); +@@ -1011,11 +1136,8 @@ + mf = (SCSIIORequest_t *)MPT_INDEX_2_MFPTR(ioc, ii); + if (mf == NULL) + continue; +- +- /* +- * If the device is a hidden raid component, +- * then its expected that +- * the function would be raid scsi io ++ /* If the device is a hidden raid component, then its ++ * expected that the mf->function will be RAID_SCSI_IO + */ + if (vdevice->vtarget->tflags & + MPT_TARGET_FLAGS_RAID_COMPONENT && mf->Function != +@@ -1034,7 +1156,21 @@ + spin_unlock_irqrestore(&ioc->scsi_lookup_lock, flags); + mptscsih_freeChainBuffers(ioc, ii); + mpt_free_msg_frame(ioc, (MPT_FRAME_HDR *)mf); ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)) ++ if (sc->use_sg) { ++ pci_unmap_sg(ioc->pcidev, ++ (struct scatterlist *) sc->request_buffer, ++ sc->use_sg, ++ sc->sc_data_direction); ++ } else if (sc->request_bufflen) { ++ pci_unmap_single(ioc->pcidev, ++ sc->SCp.dma_handle, ++ sc->request_bufflen, ++ sc->sc_data_direction); ++ } ++#else + scsi_dma_unmap(sc); ++#endif + sc->host_scribble = NULL; + sc->result = DID_NO_CONNECT << 16; + dtmprintk(ioc, sdev_printk(KERN_INFO, sc->device, +@@ -1053,7 +1189,7 @@ + /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ + + /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ +-/** ++/* + * mptscsih_report_queue_full - Report QUEUE_FULL status returned + * from a SCSI target device. + * @sc: Pointer to scsi_cmnd structure +@@ -1063,19 +1199,19 @@ + * This routine periodically reports QUEUE_FULL status returned from a + * SCSI target device. It reports this to the console via kernel + * printk() API call, not more than once every 10 seconds. +- **/ ++ */ + static void + mptscsih_report_queue_full(struct scsi_cmnd *sc, SCSIIOReply_t *pScsiReply, SCSIIORequest_t *pScsiReq) + { + long time = jiffies; +- MPT_SCSI_HOST *hd; ++ MPT_SCSI_HOST *hd; + MPT_ADAPTER *ioc; + + if (sc->device == NULL) + return; + if (sc->device->host == NULL) + return; +- if ((hd = shost_priv(sc->device->host)) == NULL) ++ if ((hd = shost_private(sc->device->host)) == NULL) + return; + ioc = hd->ioc; + if (time - hd->last_queue_full > 10 * HZ) { +@@ -1086,12 +1222,12 @@ + } + + /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ +-/** ++/* + * mptscsih_remove - Removed scsi devices + * @pdev: Pointer to pci_dev structure + * + * +- **/ ++ */ + void + mptscsih_remove(struct pci_dev *pdev) + { +@@ -1107,7 +1243,7 @@ + + scsi_remove_host(host); + +- if((hd = shost_priv(host)) == NULL) ++ if((hd = shost_private(host)) == NULL) + return; + + mptscsih_shutdown(pdev); +@@ -1137,10 +1273,10 @@ + } + + /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ +-/** ++/* + * mptscsih_shutdown - reboot notifier + * +- **/ ++ */ + void + mptscsih_shutdown(struct pci_dev *pdev) + { +@@ -1148,11 +1284,11 @@ + + #ifdef CONFIG_PM + /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ +-/** ++/* + * mptscsih_suspend - Fusion MPT scsi driver suspend routine. + * + * +- **/ ++ */ + int + mptscsih_suspend(struct pci_dev *pdev, pm_message_t state) + { +@@ -1165,11 +1301,11 @@ + } + + /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ +-/** ++/* + * mptscsih_resume - Fusion MPT scsi driver resume routine. + * + * +- **/ ++ */ + int + mptscsih_resume(struct pci_dev *pdev) + { +@@ -1191,14 +1327,14 @@ + * (linux scsi_host_template.info routine) + * + * Returns pointer to buffer where information was written. +- **/ ++ */ + const char * + mptscsih_info(struct Scsi_Host *SChost) + { + MPT_SCSI_HOST *h; + int size = 0; + +- h = shost_priv(SChost); ++ h = shost_private(SChost); + + if (h) { + if (h->info_kbuf == NULL) +@@ -1292,7 +1428,7 @@ + mptscsih_proc_info(struct Scsi_Host *host, char *buffer, char **start, off_t offset, + int length, int func) + { +- MPT_SCSI_HOST *hd = shost_priv(host); ++ MPT_SCSI_HOST *hd = shost_private(host); + MPT_ADAPTER *ioc = hd->ioc; + int size = 0; + +@@ -1310,6 +1446,103 @@ + return size; + } + ++#ifdef EEDP_SUPPORT ++u8 opcode_protection[256] = { ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, PRO_R, 0, PRO_W, 0, 0, 0, PRO_W, PRO_V, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, PRO_W, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, PRO_R, 0, PRO_W, 0, 0, 0, PRO_W, PRO_V, ++ 0, 0, 0, PRO_W, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, PRO_R, 0, PRO_W, 0, 0, 0, PRO_W, PRO_V, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; ++ ++/** ++ * _scsih_setup_eedp - setup MPI request for EEDP transfer ++ * @ioc: ++ * @scmd: pointer to scsi command object ++ * @mpi_request: pointer to the SCSI_IO reqest message frame ++ * ++ * Supporting protection 1 only. ++ * ++ * Returns nothing ++ */ ++static int ++_scsih_setup_eedp(MPT_ADAPTER *ioc, struct scsi_cmnd *scmd, SCSIIO32Request_t *mpi_request) ++{ ++ VirtDevice *vdevice = scmd->device->hostdata; ++ u16 eedp_flags; ++ u8 scsi_opcode; ++ int lba_byte; ++ u32 *lba32; ++ ++ vdevice = scmd->device->hostdata; ++ if (!vdevice->eedp_enable) ++ return -1; ++ ++ /* protection type 1 support only */ ++ if (vdevice->eedp_type != 0) ++ return -1; ++ ++ /* check whether scsi opcode supports eedp transfer */ ++ scsi_opcode = scmd->cmnd[0]; ++ eedp_flags = opcode_protection[scsi_opcode]; ++ if (!eedp_flags) ++ return -1; ++ ++ /* ++ * enable ref/app/guard checking ++ * auto increment ref and app tag ++ */ ++ mpi_request->EEDPFlags = eedp_flags | ++ MPI_SCSIIO32_EEDPFLAGS_INC_PRI_REFTAG | ++ MPI_SCSIIO32_EEDPFLAGS_T10_CHK_REFTAG | ++ MPI_SCSIIO32_EEDPFLAGS_T10_CHK_LBATAG | ++ MPI_SCSIIO32_EEDPFLAGS_T10_CHK_GUARD; ++ ++ /* set block size */ ++ mpi_request->EEDPBlockSize = vdevice->eedp_block_length; ++ mpi_request->EEDPBlockSize += 8; ++ memset(mpi_request->CDB.CDB32, 0, 32); ++ ++ mpi_request->CDB.EEDP32.PrimaryApplicationTagMask = 0xFFFF; ++ ++ /* set reference tag to low 32bit lba */ ++ lba_byte = (scmd->cmd_len == 16) ? 6 : 2; ++ lba32 = (u32 *)&scmd->cmnd[lba_byte]; ++ mpi_request->CDB.EEDP32.PrimaryReferenceTag = *lba32; ++ ++ /* set RDPROTECT, WRPROTECT, VRPROTECT bits to (001b) */ ++ scmd->cmnd[1] = (scmd->cmnd[1] & 0x1F) | 0x20; ++ ++ /* add the rest of the bits */ ++ mpi_request->Port = 0; ++ mpi_request->Flags = MPI_SCSIIO32_FLAGS_FORM_SCSIID; ++ mpi_request->DeviceAddress.SCSIID.TargetID = vdevice->vtarget->id; ++ mpi_request->DeviceAddress.SCSIID.Bus = vdevice->vtarget->channel; ++ mpi_request->ChainOffset = 0; ++ mpi_request->Function = MPI_FUNCTION_SCSI_IO_32; ++ mpi_request->CDBLength = scmd->cmd_len; ++ mpi_request->SenseBufferLength = MPT_SENSE_BUFFER_SIZE; ++ mpi_request->MsgFlags = mpt_msg_flags(ioc); ++ int_to_scsilun(scmd->device->lun, (struct scsi_lun *)mpi_request->LUN); ++ memcpy(mpi_request->CDB.CDB32, scmd->cmnd, scmd->cmd_len); ++ mpi_request->SGLOffset0 = offsetof(SCSIIO32Request_t, SGL) / 4; ++ mpi_request->SGLOffset1 = 0; ++ mpi_request->SGLOffset2 = 0; ++ mpi_request->SGLOffset3 = 0; ++ return 0; ++} ++#endif /* EEDP Support */ ++ + /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ + #define ADD_INDEX_LOG(req_ent) do { } while(0) + +@@ -1324,7 +1557,7 @@ + * from a linux scsi_cmnd request and send it to the IOC. + * + * Returns 0. (rtn value discarded by linux scsi mid-layer) +- **/ ++ */ + int + mptscsih_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *)) + { +@@ -1340,22 +1573,25 @@ + int ii; + MPT_ADAPTER *ioc; + +- hd = shost_priv(SCpnt->device->host); ++ hd = shost_private(SCpnt->device->host); + ioc = hd->ioc; + SCpnt->scsi_done = done; + + dmfprintk(ioc, printk(MYIOC_s_DEBUG_FMT "qcmd: SCpnt=%p, done()=%p\n", + ioc->name, SCpnt, done)); + +- if (ioc->taskmgmt_quiesce_io) ++ if (ioc->taskmgmt_quiesce_io) { ++ dtmprintk(ioc, printk(MYIOC_s_WARN_FMT "qcmd: SCpnt=%p timeout + 60HZ\n", ++ ioc->name, SCpnt)); + return SCSI_MLQUEUE_HOST_BUSY; ++ } + + /* + * Put together a MPT SCSI request... + */ + if ((mf = mpt_get_msg_frame(ioc->DoneCtx, ioc)) == NULL) { + dprintk(ioc, printk(MYIOC_s_WARN_FMT "QueueCmd, no msg frames!!\n", +- ioc->name)); ++ ioc->name)); + return SCSI_MLQUEUE_HOST_BUSY; + } + +@@ -1370,10 +1606,18 @@ + * will be no data transfer! GRRRRR... + */ + if (SCpnt->sc_data_direction == DMA_FROM_DEVICE) { ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)) ++ datalen = SCpnt->request_bufflen; ++#else + datalen = scsi_bufflen(SCpnt); ++#endif + scsidir = MPI_SCSIIO_CONTROL_READ; /* DATA IN (host<--ioc<--dev) */ + } else if (SCpnt->sc_data_direction == DMA_TO_DEVICE) { ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)) ++ datalen = SCpnt->request_bufflen; ++#else + datalen = scsi_bufflen(SCpnt); ++#endif + scsidir = MPI_SCSIIO_CONTROL_WRITE; /* DATA OUT (host-->ioc-->dev) */ + } else { + datalen = 0; +@@ -1393,6 +1637,36 @@ + + /* Use the above information to set up the message frame + */ ++#ifdef EEDP_SUPPORT ++ if (_scsih_setup_eedp(ioc, SCpnt, (SCSIIO32Request_t *)mf) == 0) { ++ SCSIIO32Request_t *mpi_request = (SCSIIO32Request_t *)mf; ++ ++ /* finish off setting the rest of the SCSIIO32 */ ++ mpi_request->Control = cpu_to_le32(scsictl); ++ mpi_request->DataLength = cpu_to_le32(datalen); ++ ++ /* SenseBuffer low address */ ++ mpi_request->SenseBufferLowAddr = ++ cpu_to_le32(ioc->sense_buf_low_dma ++ + (my_idx * MPT_SENSE_BUFFER_ALLOC)); ++ ++ /* Now add the SG list ++ * Always have a SGE even if null length. ++ */ ++ if (datalen == 0) { ++ /* Add a NULL SGE */ ++ ioc->add_sge((char *)&mpi_request->SGL, ++ MPT_SGE_FLAGS_SSIMPLE_READ | 0, ++ (dma_addr_t) -1); ++ } else { ++ /* Add a 32 or 64 bit SGE */ ++ if (mptscsih_AddSGE(ioc, SCpnt, ++ pScsiReq, my_idx) != SUCCESS) ++ goto fail; ++ } ++ goto send_mf; ++ } ++#endif + pScsiReq->TargetID = (u8) vdevice->vtarget->id; + pScsiReq->Bus = vdevice->vtarget->channel; + pScsiReq->ChainOffset = 0; +@@ -1430,13 +1704,17 @@ + if (datalen == 0) { + /* Add a NULL SGE */ + ioc->add_sge((char *)&pScsiReq->SGL, +- MPT_SGE_FLAGS_SSIMPLE_READ | 0, (dma_addr_t) -1); ++ MPT_SGE_FLAGS_SSIMPLE_READ | 0, ++ (dma_addr_t) -1); + } else { + /* Add a 32 or 64 bit SGE */ + if (mptscsih_AddSGE(ioc, SCpnt, pScsiReq, my_idx) != SUCCESS) + goto fail; + } + ++#ifdef EEDP_SUPPORT ++ send_mf: ++#endif + SCpnt->host_scribble = (unsigned char *)mf; + mptscsih_set_scsi_lookup(ioc, my_idx, SCpnt); + +@@ -1453,7 +1731,7 @@ + } + + /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ +-/** ++/* + * mptscsih_freeChainBuffers - Function to free chain buffers associated + * with a SCSI IO request + * @hd: Pointer to the MPT_SCSI_HOST instance +@@ -1461,7 +1739,7 @@ + * + * Called if SG chain buffer allocation fails and mptscsih callbacks. + * No return. +- **/ ++ */ + static void + mptscsih_freeChainBuffers(MPT_ADAPTER *ioc, int req_idx) + { +@@ -1508,7 +1786,6 @@ + */ + + /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ +-/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ + + static int + mptscsih_scandv_bus_reset(MPT_ADAPTER *ioc) +@@ -1531,8 +1808,8 @@ + /* Send request + */ + if ((mf = mpt_get_msg_frame(ioc->TaskCtx, ioc)) == NULL) { +- dtmprintk(ioc, printk(MYIOC_s_WARN_FMT +- "TaskMgmt, no msg frames!!\n", ioc->name)); ++ dtmprintk(ioc, printk(MYIOC_s_WARN_FMT "TaskMgmt, no msg frames!!\n", ++ ioc->name)); + mpt_clear_taskmgmt_in_progress_flag(ioc); + retval = -ENOMEM; + goto out; +@@ -1552,27 +1829,26 @@ + pScsiTm->Reserved = 0; + pScsiTm->Reserved1 = 0; + pScsiTm->TaskMsgContext = 0; +- for (ii = 0; ii < 8; ii++) ++ for (ii= 0; ii < 8; ii++) + pScsiTm->LUN[ii] = 0; +- for (ii = 0; ii < 7; ii++) ++ for (ii=0; ii < 7; ii++) + pScsiTm->Reserved2[ii] = 0; + + switch (ioc->bus_type) { +- case FC: +- timeout = 40; +- break; +- case SAS: +- timeout = 30; +- break; +- case SPI: +- default: +- timeout = 10; +- break; +- } +- +- dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT +- "TaskMgmt type=%d timeout=%ld\n", ioc->name, +- MPI_SCSITASKMGMT_TASKTYPE_RESET_BUS, timeout)); ++ case FC: ++ timeout = 40; ++ break; ++ case SAS: ++ timeout = 30; ++ break; ++ case SPI: ++ default: ++ timeout = 2; ++ break; ++ } ++ ++ dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "TaskMgmt type=%d timeout=%ld\n", ++ ioc->name, MPI_SCSITASKMGMT_TASKTYPE_RESET_BUS, timeout)); + + INITIALIZE_MGMT_STATUS(ioc->taskmgmt_cmds.status) + CLEAR_MGMT_STATUS(ioc->internal_cmds.status) +@@ -1585,8 +1861,7 @@ + retval = mpt_send_handshake_request(ioc->TaskCtx, ioc, + sizeof(SCSITaskMgmt_t), (u32*)pScsiTm, CAN_SLEEP); + if (retval != 0) { +- dfailprintk(ioc, printk(MYIOC_s_ERR_FMT +- "TaskMgmt send_handshake FAILED!" ++ dfailprintk(ioc, printk(MYIOC_s_ERR_FMT "TaskMgmt send_handshake FAILED!" + " (ioc %p, mf %p, rc=%d) \n", ioc->name, + ioc, mf, retval)); + mpt_clear_taskmgmt_in_progress_flag(ioc); +@@ -1641,165 +1916,6 @@ + return retval; + } + +-int +-mptscsih_ioc_reset(MPT_ADAPTER *ioc, int reset_phase) +-{ +- MPT_SCSI_HOST *hd; +- +- if ((ioc->sh == NULL) || (ioc->sh->hostdata == NULL)) +- return 0; +- +- switch (reset_phase) { +- case MPT_IOC_SETUP_RESET: +- dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT +- "%s: MPT_IOC_SETUP_RESET\n", ioc->name, __func__)); +- break; +- case MPT_IOC_PRE_RESET: +- dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT +- "%s: MPT_IOC_PRE_RESET\n", ioc->name, __func__)); +- hd = shost_priv(ioc->sh); +- mptscsih_flush_running_cmds(hd); +- break; +- case MPT_IOC_POST_RESET: +- dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT +- "%s: MPT_IOC_POST_RESET\n", ioc->name, __func__)); +- if (ioc->internal_cmds.status & MPT_MGMT_STATUS_PENDING) { +- ioc->internal_cmds.status +- |= MPT_MGMT_STATUS_DID_IOCRESET; +- complete(&ioc->internal_cmds.done); +- } +- break; +- default: +- break; +- } +- return 1; /* currently means nothing really */ +-} +- +-void +-mptscsih_taskmgmt_response_code(MPT_ADAPTER *ioc, u8 response_code) +-{ +- char *desc; +- +- switch (response_code) { +- case MPI_SCSITASKMGMT_RSP_TM_COMPLETE: +- desc = "The task completed."; +- break; +- case MPI_SCSITASKMGMT_RSP_INVALID_FRAME: +- desc = "The IOC received an invalid frame status."; +- break; +- case MPI_SCSITASKMGMT_RSP_TM_NOT_SUPPORTED: +- desc = "The task type is not supported."; +- break; +- case MPI_SCSITASKMGMT_RSP_TM_FAILED: +- desc = "The requested task failed."; +- break; +- case MPI_SCSITASKMGMT_RSP_TM_SUCCEEDED: +- desc = "The task completed successfully."; +- break; +- case MPI_SCSITASKMGMT_RSP_TM_INVALID_LUN: +- desc = "The LUN request is invalid."; +- break; +- case MPI_SCSITASKMGMT_RSP_IO_QUEUED_ON_IOC: +- desc = "The task is in the IOC queue and has not been sent to target."; +- break; +- default: +- desc = "unknown"; +- break; +- } +- printk(MYIOC_s_DEBUG_FMT "Response Code(0x%08x): F/W: %s\n", +- ioc->name, response_code, desc); +-} +- +-static int +-mptscsih_taskmgmt_reply(MPT_ADAPTER *ioc, u8 type, +- SCSITaskMgmtReply_t *pScsiTmReply) +-{ +- u16 iocstatus; +- u32 termination_count; +- int retval; +- +- if (!(ioc->taskmgmt_cmds.status & MPT_MGMT_STATUS_RF_VALID)) { +- retval = FAILED; +- goto out; +- } +- +- DBG_DUMP_TM_REPLY_FRAME(ioc, (u32 *)pScsiTmReply); +- +- iocstatus = le16_to_cpu(pScsiTmReply->IOCStatus) & MPI_IOCSTATUS_MASK; +- termination_count = le32_to_cpu(pScsiTmReply->TerminationCount); +- +- dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT +- "TaskMgmt fw_channel = %d, fw_id = %d, task_type = 0x%02X,\n" +- "\tiocstatus = 0x%04X, loginfo = 0x%08X, response_code = 0x%02X,\n" +- "\tterm_cmnds = %d\n", ioc->name, pScsiTmReply->Bus, +- pScsiTmReply->TargetID, type, le16_to_cpu(pScsiTmReply->IOCStatus), +- le32_to_cpu(pScsiTmReply->IOCLogInfo), pScsiTmReply->ResponseCode, +- termination_count)); +- +- if (ioc->facts.MsgVersion >= MPI_VERSION_01_05 && +- pScsiTmReply->ResponseCode) +- mptscsih_taskmgmt_response_code(ioc, +- pScsiTmReply->ResponseCode); +- +- if (iocstatus == MPI_IOCSTATUS_SUCCESS) { +- retval = 0; +- goto out; +- } +- +- retval = FAILED; +- if (type == MPI_SCSITASKMGMT_TASKTYPE_ABORT_TASK) { +- if (termination_count == 1) +- retval = 0; +- goto out; +- } +- +- if (iocstatus == MPI_IOCSTATUS_SCSI_TASK_TERMINATED || +- iocstatus == MPI_IOCSTATUS_SCSI_IOC_TERMINATED) +- retval = 0; +- +- out: +- return retval; +-} +- +-/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ +-/** +- * mptscsih_taskmgmt_complete - Registered with Fusion MPT base driver +- * @ioc: Pointer to MPT_ADAPTER structure +- * @mf: Pointer to SCSI task mgmt request frame +- * @mr: Pointer to SCSI task mgmt reply frame +- * +- * This routine is called from mptbase.c::mpt_interrupt() at the completion +- * of any SCSI task management request. +- * This routine is registered with the MPT (base) driver at driver +- * load/init time via the mpt_register() API call. +- * +- * Returns 1 indicating alloc'd request frame ptr should be freed. +- **/ +-int +-mptscsih_taskmgmt_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, +- MPT_FRAME_HDR *mr) +-{ +- dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "TaskMgmt completed (mf=%p, mr=%p)\n", +- ioc->name, mf, mr)); +- +- ioc->taskmgmt_cmds.status |= MPT_MGMT_STATUS_COMMAND_GOOD; +- +- if (!mr) +- goto out; +- +- ioc->taskmgmt_cmds.status |= MPT_MGMT_STATUS_RF_VALID; +- memcpy(ioc->taskmgmt_cmds.reply, mr, +- min(MPT_DEFAULT_FRAME_SIZE, 4 * mr->u.reply.MsgLength)); +- out: +- if (ioc->taskmgmt_cmds.status & MPT_MGMT_STATUS_PENDING) { +- mpt_clear_taskmgmt_in_progress_flag(ioc); +- ioc->taskmgmt_cmds.status &= ~MPT_MGMT_STATUS_PENDING; +- complete(&ioc->taskmgmt_cmds.done); +- return 1; +- } +- return 0; +-} +- + /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ + /** + * mptscsih_IssueTaskMgmt - Generic send Task Management function. +@@ -1820,14 +1936,13 @@ + * + **/ + int +-mptscsih_IssueTaskMgmt(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 id, int lun, +- int ctx2abort, ulong timeout) +-{ +- MPT_FRAME_HDR *mf = NULL; ++mptscsih_IssueTaskMgmt(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 id, int lun, int ctx2abort, ulong timeout) ++{ ++ MPT_FRAME_HDR *mf; + SCSITaskMgmt_t *pScsiTm; + int ii; + int retval; +- MPT_ADAPTER *ioc = hd->ioc; ++ MPT_ADAPTER *ioc = hd->ioc; + unsigned long timeleft; + u8 issue_hard_reset; + u32 ioc_raw_state; +@@ -1858,7 +1973,7 @@ + + mutex_lock(&ioc->taskmgmt_cmds.mutex); + if (mpt_set_taskmgmt_in_progress_flag(ioc) != 0) { +- mutex_unlock(&ioc->taskmgmt_cmds.mutex); ++ mf = NULL; + retval = FAILED; + goto out; + } +@@ -1867,8 +1982,7 @@ + */ + if ((mf = mpt_get_msg_frame(ioc->TaskCtx, ioc)) == NULL) { + dfailprintk(ioc, printk(MYIOC_s_ERR_FMT +- "TaskMgmt no msg frames!!\n", +- ioc->name)); ++ "TaskMgmt no msg frames!!\n", ioc->name)); + retval = FAILED; + mpt_clear_taskmgmt_in_progress_flag(ioc); + goto out; +@@ -1888,18 +2002,18 @@ + pScsiTm->TaskType = type; + pScsiTm->Reserved1 = 0; + pScsiTm->MsgFlags = (type == MPI_SCSITASKMGMT_TASKTYPE_RESET_BUS) +- ? MPI_SCSITASKMGMT_MSGFLAGS_LIPRESET_RESET_OPTION : 0; ++ ? MPI_SCSITASKMGMT_MSGFLAGS_LIPRESET_RESET_OPTION : 0; + + int_to_scsilun(lun, (struct scsi_lun *)pScsiTm->LUN); + +- for (ii = 0; ii < 7; ii++) ++ for (ii=0; ii < 7; ii++) + pScsiTm->Reserved2[ii] = 0; + + pScsiTm->TaskMsgContext = ctx2abort; + + dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "TaskMgmt: ctx2abort (0x%08x) " +- "task_type = 0x%02X, timeout = %ld\n", ioc->name, ctx2abort, +- type, timeout)); ++ "task_type = 0x%02X, timeout = %ld\n", ioc->name, ctx2abort, ++ type, timeout)); + + DBG_DUMP_TM_REQUEST_FRAME(ioc, (u32 *)pScsiTm); + +@@ -1910,11 +2024,11 @@ + mpt_put_msg_frame_hi_pri(ioc->TaskCtx, ioc, mf); + else { + retval = mpt_send_handshake_request(ioc->TaskCtx, ioc, +- sizeof(SCSITaskMgmt_t), (u32 *)pScsiTm, CAN_SLEEP); ++ sizeof(SCSITaskMgmt_t), (u32*)pScsiTm, CAN_SLEEP); + if (retval) { + dfailprintk(ioc, printk(MYIOC_s_ERR_FMT +- "TaskMgmt handshake FAILED!" +- " (mf=%p, rc=%d) \n", ioc->name, mf, retval)); ++ "TaskMgmt handshake FAILED!(mf=%p, rc=%d) \n", ++ ioc->name, mf, retval)); + mpt_free_msg_frame(ioc, mf); + mpt_clear_taskmgmt_in_progress_flag(ioc); + goto out; +@@ -1922,7 +2036,7 @@ + } + + timeleft = wait_for_completion_timeout(&ioc->taskmgmt_cmds.done, +- timeout*HZ); ++ timeout*HZ); + if (!(ioc->taskmgmt_cmds.status & MPT_MGMT_STATUS_COMMAND_GOOD)) { + retval = FAILED; + dtmprintk(ioc, printk(MYIOC_s_ERR_FMT +@@ -1946,7 +2060,7 @@ + CLEAR_MGMT_STATUS(ioc->taskmgmt_cmds.status) + if (issue_hard_reset) { + printk(MYIOC_s_WARN_FMT "Issuing Reset from %s!!\n", +- ioc->name, __func__); ++ ioc->name, __func__); + if ((retval = mpt_SoftResetHandler(ioc, CAN_SLEEP)) != 0) + retval = mpt_HardResetHandler(ioc, CAN_SLEEP); + mpt_free_msg_frame(ioc, mf); +@@ -1990,11 +2104,11 @@ + int retval; + VirtDevice *vdevice; + ulong sn = SCpnt->serial_number; +- MPT_ADAPTER *ioc; ++ MPT_ADAPTER *ioc; + + /* If we can't locate our host adapter structure, return FAILED status. + */ +- if ((hd = shost_priv(SCpnt->device->host)) == NULL) { ++ if ((hd = shost_private(SCpnt->device->host)) == NULL) { + SCpnt->result = DID_RESET << 16; + SCpnt->scsi_done(SCpnt); + printk(KERN_ERR MYNAM ": task abort: " +@@ -2070,9 +2184,12 @@ + */ + mf = MPT_INDEX_2_MFPTR(ioc, scpnt_idx); + ctx2abort = mf->u.frame.hwhdr.msgctxu.MsgContext; +- mptscsih_IssueTaskMgmt(hd, MPI_SCSITASKMGMT_TASKTYPE_ABORT_TASK, +- vdevice->vtarget->channel, vdevice->vtarget->id, vdevice->lun, +- ctx2abort, mptscsih_get_tm_timeout(ioc)); ++ retval = mptscsih_IssueTaskMgmt(hd, ++ MPI_SCSITASKMGMT_TASKTYPE_ABORT_TASK, ++ vdevice->vtarget->channel, ++ vdevice->vtarget->id, vdevice->lun, ++ ctx2abort, mptscsih_get_tm_timeout(ioc)); ++ + + /* check to see whether command actually completed and/or + * terminated +@@ -2092,7 +2209,7 @@ + + out: + printk(MYIOC_s_INFO_FMT "task abort: %s (sc=%p)\n", +- ioc->name, ((retval == SUCCESS) ? "SUCCESS" : "FAILED"), SCpnt); ++ ioc->name, ((retval == SUCCESS) ? "SUCCESS" : "FAILED" ), SCpnt); + + return retval; + } +@@ -2116,7 +2233,7 @@ + + /* If we can't locate our host adapter structure, return FAILED status. + */ +- if ((hd = shost_priv(SCpnt->device->host)) == NULL){ ++ if ((hd = shost_private(SCpnt->device->host)) == NULL){ + printk(KERN_ERR MYNAM ": target reset: " + "Can't locate host! (sc=%p)\n", SCpnt); + return FAILED; +@@ -2141,11 +2258,13 @@ + } + + retval = mptscsih_IssueTaskMgmt(hd, +- MPI_SCSITASKMGMT_TASKTYPE_TARGET_RESET, vdevice->vtarget->channel, +- vdevice->vtarget->id, 0, 0, mptscsih_get_tm_timeout(ioc)); +- +- out: +- printk(MYIOC_s_INFO_FMT "target reset: %s (sc=%p)\n", ++ MPI_SCSITASKMGMT_TASKTYPE_TARGET_RESET, ++ vdevice->vtarget->channel, ++ vdevice->vtarget->id, 0, 0, ++ mptscsih_get_tm_timeout(ioc)); ++ ++ out: ++ printk (MYIOC_s_INFO_FMT "target reset: %s (sc=%p)\n", + ioc->name, ((retval == 0) ? "SUCCESS" : "FAILED" ), SCpnt); + + if (retval == 0) +@@ -2170,12 +2289,12 @@ + MPT_SCSI_HOST *hd; + int retval; + VirtDevice *vdevice; +- MPT_ADAPTER *ioc; ++ MPT_ADAPTER *ioc; + + /* If we can't locate our host adapter structure, return FAILED status. + */ +- if ((hd = shost_priv(SCpnt->device->host)) == NULL){ +- printk(KERN_ERR MYNAM ": bus_reset: " ++ if ((hd = shost_private(SCpnt->device->host)) == NULL){ ++ printk(KERN_ERR MYNAM ": bus reset: " + "Can't locate host! (sc=%p)\n", SCpnt); + return FAILED; + } +@@ -2191,8 +2310,10 @@ + vdevice = SCpnt->device->hostdata; + if (!vdevice || !vdevice->vtarget) + return SUCCESS; +- retval = mptscsih_IssueTaskMgmt(hd, MPI_SCSITASKMGMT_TASKTYPE_RESET_BUS, +- vdevice->vtarget->channel, 0, 0, 0, mptscsih_get_tm_timeout(ioc)); ++ retval = mptscsih_IssueTaskMgmt(hd, ++ MPI_SCSITASKMGMT_TASKTYPE_RESET_BUS, ++ vdevice->vtarget->channel, 0, 0, 0, ++ mptscsih_get_tm_timeout(ioc)); + + printk(MYIOC_s_INFO_FMT "bus reset: %s (sc=%p)\n", + ioc->name, ((retval == 0) ? "SUCCESS" : "FAILED" ), SCpnt); +@@ -2217,11 +2338,11 @@ + { + MPT_SCSI_HOST * hd; + int status = SUCCESS; +- MPT_ADAPTER *ioc; ++ MPT_ADAPTER *ioc; + int retval; + + /* If we can't locate the host to reset, then we failed. */ +- if ((hd = shost_priv(SCpnt->device->host)) == NULL){ ++ if ((hd = shost_private(SCpnt->device->host)) == NULL){ + printk(KERN_ERR MYNAM ": host reset: " + "Can't locate host! (sc=%p)\n", SCpnt); + return FAILED; +@@ -2229,7 +2350,7 @@ + + ioc = hd->ioc; + printk(MYIOC_s_INFO_FMT "attempting host reset! (sc=%p)\n", +- ioc->name, SCpnt); ++ ioc->name, SCpnt); + + /* If our attempts to reset the host failed, then return a failed + * status. The host will be taken off line by the SCSI mid-layer. +@@ -2248,10 +2369,137 @@ + return status; + } + +-/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ +-/** ++ ++static int ++mptscsih_taskmgmt_reply(MPT_ADAPTER *ioc, u8 type, ++ SCSITaskMgmtReply_t *pScsiTmReply) ++{ ++ u16 iocstatus; ++ u32 termination_count; ++ int retval; ++ ++ if (!(ioc->taskmgmt_cmds.status & MPT_MGMT_STATUS_RF_VALID)) { ++ retval = FAILED; ++ goto out; ++ } ++ ++ DBG_DUMP_TM_REPLY_FRAME(ioc, (u32 *)pScsiTmReply); ++ ++ iocstatus = le16_to_cpu(pScsiTmReply->IOCStatus) & MPI_IOCSTATUS_MASK; ++ termination_count = le32_to_cpu(pScsiTmReply->TerminationCount); ++ ++ dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT ++ "TaskMgmt fw_channel = %d, fw_id = %d, task_type = 0x%02X,\n" ++ "\tiocstatus = 0x%04X, loginfo = 0x%08X, response_code = 0x%02X,\n" ++ "\tterm_cmnds = %d\n", ioc->name, pScsiTmReply->Bus, ++ pScsiTmReply->TargetID, type, le16_to_cpu(pScsiTmReply->IOCStatus), ++ le32_to_cpu(pScsiTmReply->IOCLogInfo), pScsiTmReply->ResponseCode, ++ termination_count)); ++ ++ if (ioc->facts.MsgVersion >= MPI_VERSION_01_05 && ++ pScsiTmReply->ResponseCode) ++ mptscsih_taskmgmt_response_code(ioc, ++ pScsiTmReply->ResponseCode); ++ ++ if (iocstatus == MPI_IOCSTATUS_SUCCESS) { ++ retval = 0; ++ goto out; ++ } ++ ++ retval = FAILED; ++ if (type == MPI_SCSITASKMGMT_TASKTYPE_ABORT_TASK) { ++ if (termination_count == 1) ++ retval = 0; ++ goto out; ++ } ++ ++ if (iocstatus == MPI_IOCSTATUS_SCSI_TASK_TERMINATED || ++ iocstatus == MPI_IOCSTATUS_SCSI_IOC_TERMINATED) ++ retval = 0; ++ ++ out: ++ return retval; ++} ++ ++/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ ++void ++mptscsih_taskmgmt_response_code(MPT_ADAPTER *ioc, u8 response_code) ++{ ++ char *desc; ++ ++ switch (response_code) { ++ case MPI_SCSITASKMGMT_RSP_TM_COMPLETE: ++ desc = "The task completed."; ++ break; ++ case MPI_SCSITASKMGMT_RSP_INVALID_FRAME: ++ desc = "The IOC received an invalid frame status."; ++ break; ++ case MPI_SCSITASKMGMT_RSP_TM_NOT_SUPPORTED: ++ desc = "The task type is not supported."; ++ break; ++ case MPI_SCSITASKMGMT_RSP_TM_FAILED: ++ desc = "The requested task failed."; ++ break; ++ case MPI_SCSITASKMGMT_RSP_TM_SUCCEEDED: ++ desc = "The task completed successfully."; ++ break; ++ case MPI_SCSITASKMGMT_RSP_TM_INVALID_LUN: ++ desc = "The LUN request is invalid."; ++ break; ++ case MPI_SCSITASKMGMT_RSP_IO_QUEUED_ON_IOC: ++ desc = "The task is in the IOC queue and has not been sent to target."; ++ break; ++ default: ++ desc = "unknown"; ++ break; ++ } ++ printk(MYIOC_s_INFO_FMT "Response Code(0x%08x): F/W: %s\n", ++ ioc->name, response_code, desc); ++} ++ ++/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ ++/** ++ * mptscsih_taskmgmt_complete - Registered with Fusion MPT base driver ++ * @ioc: Pointer to MPT_ADAPTER structure ++ * @mf: Pointer to SCSI task mgmt request frame ++ * @mr: Pointer to SCSI task mgmt reply frame ++ * ++ * This routine is called from mptbase.c::mpt_interrupt() at the completion ++ * of any SCSI task management request. ++ * This routine is registered with the MPT (base) driver at driver ++ * load/init time via the mpt_register() API call. ++ * ++ * Returns 1 indicating alloc'd request frame ptr should be freed. ++ **/ ++int ++mptscsih_taskmgmt_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, ++ MPT_FRAME_HDR *mr) ++{ ++ dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT ++ "TaskMgmt completed (mf=%p, mr=%p)\n", ioc->name, mf, mr)); ++ ++ ioc->taskmgmt_cmds.status |= MPT_MGMT_STATUS_COMMAND_GOOD; ++ ++ if (!mr) ++ goto out; ++ ++ ioc->taskmgmt_cmds.status |= MPT_MGMT_STATUS_RF_VALID; ++ memcpy(ioc->taskmgmt_cmds.reply, mr, ++ min(MPT_DEFAULT_FRAME_SIZE, 4 * mr->u.reply.MsgLength)); ++ out: ++ if (ioc->taskmgmt_cmds.status & MPT_MGMT_STATUS_PENDING) { ++ mpt_clear_taskmgmt_in_progress_flag(ioc); ++ ioc->taskmgmt_cmds.status &= ~MPT_MGMT_STATUS_PENDING; ++ complete(&ioc->taskmgmt_cmds.done); ++ return 1; ++ } ++ return 0; ++} ++ ++/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ ++/* + * This is anyones guess quite frankly. +- **/ ++ */ + int + mptscsih_bios_param(struct scsi_device * sdev, struct block_device *bdev, + sector_t capacity, int geom[]) +@@ -2291,7 +2539,7 @@ + /** + * Search IOC page 3 to determine if this is hidden physical disk + * +- **/ ++ */ + int + mptscsih_is_phys_disk(MPT_ADAPTER *ioc, u8 channel, u8 id) + { +@@ -2305,8 +2553,7 @@ + goto out; + for (i = 0; i < ioc->raid_data.pIocPg3->NumPhysDisks; i++) { + if ((id == ioc->raid_data.pIocPg3->PhysDisk[i].PhysDiskID) && +- (channel == +- ioc->raid_data.pIocPg3->PhysDisk[i].PhysDiskBus)) { ++ (channel == ioc->raid_data.pIocPg3->PhysDisk[i].PhysDiskBus)) { + rc = 1; + goto out; + } +@@ -2323,7 +2570,7 @@ + ioc->raid_data.pIocPg3->PhysDisk[i].PhysDiskNum); + if (num_paths < 2) + continue; +- phys_disk = kzalloc(offsetof(RaidPhysDiskPage1_t, Path) + ++ phys_disk = kzalloc(offsetof(RaidPhysDiskPage1_t,Path) + + (num_paths * sizeof(RAID_PHYS_DISK1_PATH)), GFP_KERNEL); + if (!phys_disk) + continue; +@@ -2356,14 +2603,14 @@ + if (list_empty(&ioc->raid_data.inactive_list)) + goto out; + +- mutex_lock(&ioc->raid_data.inactive_list_mutex); ++ down(&ioc->raid_data.inactive_list_mutex); + list_for_each_entry(component_info, &ioc->raid_data.inactive_list, + list) { + if ((component_info->d.PhysDiskID == id) && + (component_info->d.PhysDiskBus == channel)) + rc = 1; + } +- mutex_lock(&ioc->raid_data.inactive_list_mutex); ++ up(&ioc->raid_data.inactive_list_mutex); + + out: + return rc; +@@ -2374,7 +2621,7 @@ + mptscsih_raid_id_to_num(MPT_ADAPTER *ioc, u8 channel, u8 id) + { + struct inactive_raid_component_info *component_info; +- int i, j; ++ int i,j; + RaidPhysDiskPage1_t *phys_disk; + int rc = -ENXIO; + u8 num_paths; +@@ -2383,8 +2630,7 @@ + goto out; + for (i = 0; i < ioc->raid_data.pIocPg3->NumPhysDisks; i++) { + if ((id == ioc->raid_data.pIocPg3->PhysDisk[i].PhysDiskID) && +- (channel == +- ioc->raid_data.pIocPg3->PhysDisk[i].PhysDiskBus)) { ++ (channel == ioc->raid_data.pIocPg3->PhysDisk[i].PhysDiskBus)) { + rc = ioc->raid_data.pIocPg3->PhysDisk[i].PhysDiskNum; + goto out; + } +@@ -2401,7 +2647,7 @@ + ioc->raid_data.pIocPg3->PhysDisk[i].PhysDiskNum); + if (num_paths < 2) + continue; +- phys_disk = kzalloc(offsetof(RaidPhysDiskPage1_t, Path) + ++ phys_disk = kzalloc(offsetof(RaidPhysDiskPage1_t,Path) + + (num_paths * sizeof(RAID_PHYS_DISK1_PATH)), GFP_KERNEL); + if (!phys_disk) + continue; +@@ -2434,29 +2680,29 @@ + if (list_empty(&ioc->raid_data.inactive_list)) + goto out; + +- mutex_lock(&ioc->raid_data.inactive_list_mutex); ++ down(&ioc->raid_data.inactive_list_mutex); + list_for_each_entry(component_info, &ioc->raid_data.inactive_list, + list) { + if ((component_info->d.PhysDiskID == id) && + (component_info->d.PhysDiskBus == channel)) + rc = component_info->d.PhysDiskNum; + } +- mutex_unlock(&ioc->raid_data.inactive_list_mutex); ++ up(&ioc->raid_data.inactive_list_mutex); + + out: + return rc; + } + EXPORT_SYMBOL(mptscsih_raid_id_to_num); + +-/** ++/* + * OS entry point to allow for host driver to free allocated memory + * Called if no device present or device being unloaded +- **/ ++ */ + void + mptscsih_slave_destroy(struct scsi_device *sdev) + { + struct Scsi_Host *host = sdev->host; +- MPT_SCSI_HOST *hd = shost_priv(host); ++ MPT_SCSI_HOST *hd = shost_private(host); + VirtTarget *vtarget; + VirtDevice *vdevice; + struct scsi_target *starget; +@@ -2475,17 +2721,17 @@ + } + + /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ +-/** ++/* + * mptscsih_change_queue_depth - This function will set a devices queue depth + * @sdev: per scsi_device pointer + * @qdepth: requested queue depth + * + * Adding support for new 'change_queue_depth' api. +- **/ ++*/ + int + mptscsih_change_queue_depth(struct scsi_device *sdev, int qdepth) + { +- MPT_SCSI_HOST *hd = shost_priv(sdev->host); ++ MPT_SCSI_HOST *hd = shost_private(sdev->host); + VirtTarget *vtarget; + struct scsi_target *starget; + int max_depth; +@@ -2527,12 +2773,115 @@ + return sdev->queue_depth; + } + +-/** ++#ifdef EEDP_SUPPORT ++/** ++ * _scsih_read_capacity_16 - send READ_CAPACITY_16 to target ++ * ++ */ ++static int ++_scsih_read_capacity_16(MPT_SCSI_HOST *hd, int id, int channel, u32 lun, ++ void *data, u32 length) ++{ ++ INTERNAL_CMD iocmd; ++ dma_addr_t data_dma; ++ struct read_cap_parameter *parameter_data; ++ u32 data_length; ++ MPT_ADAPTER *ioc = hd->ioc; ++ int rc; ++ int count; ++ u8 skey; ++ u8 asc; ++ u8 ascq; ++ ++ data_length = sizeof(struct read_cap_parameter); ++ parameter_data = pci_alloc_consistent(ioc->pcidev, ++ data_length, &data_dma); ++ if (!parameter_data) { ++ printk(MYIOC_s_ERR_FMT "failure at %s:%d/%s()!\n", ++ ioc->name, __FILE__, __LINE__, __func__); ++ return -1; ++ } ++ ++ iocmd.cmd = SERVICE_ACTION_IN; ++ iocmd.data_dma = data_dma; ++ iocmd.data = (u8 *)parameter_data; ++ iocmd.size = data_length; ++ iocmd.channel = channel; ++ iocmd.id = id; ++ iocmd.lun = lun; ++ ++ for (count=0; count < 4; count++) { ++ rc = mptscsih_do_cmd(hd, &iocmd); ++ ++ if(rc == MPT_SCANDV_GOOD) { ++ memcpy(data, parameter_data, ++ min_t(u32, data_length, length)); ++ break; ++ } else if(rc == MPT_SCANDV_BUSY) { ++ devtprintk(ioc, printk(MYIOC_s_DEBUG_FMT "%s: " ++ "fw_channel=%d fw_id=%d : device busy\n", ++ ioc->name, __FUNCTION__, channel, id)); ++ continue; ++ } else if(rc == MPT_SCANDV_DID_RESET) { ++ devtprintk(ioc, printk(MYIOC_s_DEBUG_FMT "%s: " ++ "fw_channel=%d fw_id=%d : did reset\n", ++ ioc->name, __FUNCTION__, channel, id)); ++ continue; ++ } else if(rc == MPT_SCANDV_SENSE) { ++ skey = ioc->internal_cmds.sense[2] & 0x0F; ++ asc = ioc->internal_cmds.sense[12]; ++ ascq = ioc->internal_cmds.sense[13]; ++ devtprintk(ioc, printk(MYIOC_s_DEBUG_FMT "%s: " ++ "fw_channel=%d fw_id=%d : [sense_key,arc,ascq]: " ++ "[0x%02x,0x%02x,0x%02x]\n", ioc->name, ++ __FUNCTION__, channel, id, skey, asc, ascq)); ++ if( skey == UNIT_ATTENTION || ++ skey == NOT_READY || ++ skey == ILLEGAL_REQUEST ) { ++ continue; ++ } else { ++ printk(MYIOC_s_ERR_FMT "%s: fw_channel=%d fw_id=%d : " ++ "tur failed due to [sense_key,asc,ascq]: " ++ "[0x%02x,0x%02x,0x%02x]\n", ioc->name, ++ __FUNCTION__, channel, id, skey, asc, ascq); ++ break; ++ } ++ } else if(rc == MPT_SCANDV_SELECTION_TIMEOUT) { ++ printk(MYIOC_s_ERR_FMT "%s: fw_channel=%d fw_id=%d: " ++ "read capacity failed due to no device\n", ioc->name, ++ __FUNCTION__, channel, id); ++ break; ++ } else if(rc == MPT_SCANDV_SOME_ERROR) { ++ printk(MYIOC_s_ERR_FMT "%s: fw_channel=%d fw_id=%d: " ++ "read capacity failed due to some error\n", ioc->name, ++ __FUNCTION__, channel, id); ++ break; ++ } else { ++ printk(MYIOC_s_ERR_FMT "%s: fw_channel=%d fw_id=%d: " ++ "read capacity failed due to some error\n", ioc->name, ++ __FUNCTION__, channel, id); ++ break; ++ } ++ ++ } ++ ++ if(count > 4 && rc != 0) { ++ printk(MYIOC_s_ERR_FMT "%s: fw_channel=%d fw_id=%d: " ++ "read capacity failed to many times\n", ioc->name, ++ __FUNCTION__, channel, id); ++ } ++ ++ pci_free_consistent(ioc->pcidev, data_length, parameter_data, data_dma); ++ return rc; ++} ++#endif ++ ++/* + * OS entry point to adjust the queue_depths on a per-device basis. + * Called once per device the bus scan. Use it to force the queue_depth + * member to 1 if a device does not support Q tags. + * Return non-zero if fails. +- **/ ++ */ + int + mptscsih_slave_configure(struct scsi_device *sdev) + { +@@ -2540,12 +2889,61 @@ + VirtTarget *vtarget; + VirtDevice *vdevice; + struct scsi_target *starget; +- MPT_SCSI_HOST *hd = shost_priv(sh); +- MPT_ADAPTER *ioc = hd->ioc; ++ MPT_SCSI_HOST *hd = shost_private(sh); ++ MPT_ADAPTER *ioc = hd->ioc; + + starget = scsi_target(sdev); + vtarget = starget->hostdata; + vdevice = sdev->hostdata; ++ ++#ifdef EEDP_SUPPORT ++ if ((!(vdevice->vtarget->tflags & MPT_TARGET_FLAGS_RAID_COMPONENT)) && ++ (!(vdevice->vtarget->raidVolume))) { ++ ++ struct read_cap_parameter data; ++ memset(&data, 0, sizeof(struct read_cap_parameter)); ++ ++ /* ++ * check PROTECT bit ++ * ++ * NOTE: The crack monkey target mode driver doesn't ++ * set this bit(bug has been reported). ++ * The cm_target command line option is a work around. ++ */ ++ if (!(sdev->inquiry[5] & 1)) ++ goto out; ++ ++ if ((ioc->bus_type == FC) && ++ (_scsih_read_capacity_16(hd, vtarget->id, ++ vtarget->channel, sdev->lun, &data, ++ sizeof(struct read_cap_parameter)) == 0)) { ++ vdevice->eedp_enable = data.prot_en; ++ vdevice->eedp_type = data.p_type; ++ vdevice->eedp_block_length = ++ be32_to_cpu(data.logical_block_length); ++ ++ if (!vdevice->eedp_enable) ++ goto out; ++ ++ sdev_printk(KERN_INFO, sdev, "EEDP enabled: " ++ "protection_type(%d), block_length(%d)\n", ++ vdevice->eedp_type+1, ++ vdevice->eedp_block_length); ++ } ++ } ++ out: ++#endif /* EEDP Support */ ++ ++ ++ dsprintk(ioc, printk(MYIOC_s_DEBUG_FMT ++ "device @ %p, channel=%d, id=%d, lun=%d\n", ++ ioc->name, sdev, sdev->channel, sdev->id, sdev->lun)); ++ if (ioc->bus_type == SPI) ++ dsprintk(ioc, printk(MYIOC_s_DEBUG_FMT ++ "sdtr %d wdtr %d ppr %d inq length=%d\n", ++ ioc->name, sdev->sdtr, sdev->wdtr, ++ sdev->ppr, sdev->inquiry_len)); ++ + vdevice->configured_lun = 1; + + if ((ioc->bus_type != SAS) && (sdev->id > sh->max_id)) { +@@ -2553,25 +2951,37 @@ + scsi_adjust_queue_depth(sdev, 0, 1); + goto slave_configure_exit; + } ++ dsprintk(ioc, printk(MYIOC_s_DEBUG_FMT ++ "Queue depth=%d, tflags=%x\n", ++ ioc->name, sdev->queue_depth, vtarget->tflags)); ++ ++ if (ioc->bus_type == SPI) ++ dsprintk(ioc, printk(MYIOC_s_DEBUG_FMT ++ "negoFlags=%x, maxOffset=%x, SyncFactor=%x\n", ++ ioc->name, vtarget->negoFlags, vtarget->maxOffset, ++ vtarget->minSyncFactor)); + + mptscsih_change_queue_depth(sdev, ioc->sdev_queue_depth); + + slave_configure_exit: +- +- return 0; +-} +- +-/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ +-/** ++ dsprintk(ioc, printk(MYIOC_s_DEBUG_FMT ++ "tagged %d, simple %d, ordered %d\n", ++ ioc->name,sdev->tagged_supported, sdev->simple_tags, ++ sdev->ordered_tags)); ++ ++ return 0; ++} ++ ++/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ ++/* + * Private routines... + */ + + /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ +-/** +- * Utility function to copy sense data from the scsi_cmnd buffer ++/* Utility function to copy sense data from the scsi_cmnd buffer + * to the FC and SCSI target structures. + * +- **/ ++ */ + static void + mptscsih_copy_sense_data(struct scsi_cmnd *sc, MPT_SCSI_HOST *hd, MPT_FRAME_HDR *mf, SCSIIOReply_t *pScsiReply) + { +@@ -2593,11 +3003,14 @@ + req_index = le16_to_cpu(mf->u.frame.hwhdr.msgctxu.fld.req_idx); + sense_data = ((u8 *)ioc->sense_buf_pool + (req_index * MPT_SENSE_BUFFER_ALLOC)); + ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,24)) + if (sense_count > SCSI_SENSE_BUFFERSIZE) +- sense_count = SCSI_SENSE_BUFFERSIZE; ++ sense_count = SCSI_SENSE_BUFFERSIZE; + + memcpy(sc->sense_buffer, sense_data, sense_count); +- ++#else ++ memcpy(sc->sense_buffer, sense_data, SNS_LEN(sc)); ++#endif + /* Log SMART data (asc = 0x5D, non-IM case only) if required. + */ + if ((ioc->events) && (ioc->eventTypes & (1 << MPI_EVENT_SCSI_DEVICE_STATUS_CHANGE))) { +@@ -2616,17 +3029,15 @@ + + ioc->eventContext++; + if (ioc->pcidev->vendor == PCI_VENDOR_ID_IBM) { +- mptscsih_issue_sep_command(ioc, +- vdevice->vtarget, ++ mptscsih_issue_sep_command(ioc, vdevice->vtarget, + MPI_SEP_REQ_SLOTSTATUS_PREDICTED_FAULT); +- vdevice->vtarget->tflags |= +- MPT_TARGET_FLAGS_LED_ON; ++ vdevice->vtarget->tflags |= MPT_TARGET_FLAGS_LED_ON; + } + } + } + } else { + dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Hmmm... SenseData len=0! (?)\n", +- ioc->name)); ++ ioc->name)); + } + } + +@@ -2700,14 +3111,10 @@ + } + + /** +- * SCPNT_TO_LOOKUP_IDX +- * +- * search's for a given scmd in the ScsiLookup[] array list +- * ++ * SCPNT_TO_LOOKUP_IDX - searches for a given scmd in the ScsiLookup[] array list + * @ioc: Pointer to MPT_ADAPTER structure +- * @scmd: scsi_cmnd pointer +- * +- **/ ++ * @sc: scsi_cmnd pointer ++ */ + static int + SCPNT_TO_LOOKUP_IDX(MPT_ADAPTER *ioc, struct scsi_cmnd *sc) + { +@@ -2729,13 +3136,48 @@ + + /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ + int ++mptscsih_ioc_reset(MPT_ADAPTER *ioc, int reset_phase) ++{ ++ MPT_SCSI_HOST *hd; ++ ++ if ((ioc->sh == NULL) || (ioc->sh->hostdata == NULL)) ++ return 0; ++ ++ hd = shost_private(ioc->sh); ++ switch (reset_phase) { ++ case MPT_IOC_SETUP_RESET: ++ dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT ++ "%s: MPT_IOC_SETUP_RESET\n", ioc->name, __func__)); ++ break; ++ case MPT_IOC_PRE_RESET: ++ dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT ++ "%s: MPT_IOC_PRE_RESET\n", ioc->name, __func__)); ++ mptscsih_flush_running_cmds(hd); ++ break; ++ case MPT_IOC_POST_RESET: ++ dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT ++ "%s: MPT_IOC_POST_RESET\n", ioc->name, __func__)); ++ if (ioc->internal_cmds.status & MPT_MGMT_STATUS_PENDING) { ++ ioc->internal_cmds.status |= ++ MPT_MGMT_STATUS_DID_IOCRESET; ++ complete(&ioc->internal_cmds.done); ++ } ++ break; ++ default: ++ break; ++ } ++ return 1; /* currently means nothing really */ ++} ++ ++/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ ++int + mptscsih_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply) + { + u8 event = le32_to_cpu(pEvReply->Event) & 0xFF; + + devtverboseprintk(ioc, printk(MYIOC_s_DEBUG_FMT +- "MPT event (=%02Xh) routed to SCSI host driver!\n", +- ioc->name, event)); ++ "MPT event (=%02Xh) routed to SCSI host driver!\n", ++ ioc->name, event)); + + if ((event == MPI_EVENT_IOC_BUS_RESET || + event == MPI_EVENT_EXT_BUS_RESET) && +@@ -2745,74 +3187,73 @@ + return 1; /* currently means nothing really */ + } + +-int +-mptscsih_quiesce_raid(MPT_SCSI_HOST *hd, int quiesce, u8 channel, u8 id) +-{ +- MPT_ADAPTER *ioc = hd->ioc; +- MpiRaidActionRequest_t *pReq; +- MPT_FRAME_HDR *mf; +- int ret; +- unsigned long timeleft; +- +- mutex_lock(&ioc->internal_cmds.mutex); +- +- /* Get and Populate a free Frame +- */ +- if ((mf = mpt_get_msg_frame(ioc->InternalCtx, ioc)) == NULL) { +- dfailprintk(hd->ioc, printk(MYIOC_s_WARN_FMT +- "%s: no msg frames!\n", +- ioc->name, __func__)); +- ret = -EAGAIN; +- goto out; +- } +- pReq = (MpiRaidActionRequest_t *)mf; +- if (quiesce) +- pReq->Action = MPI_RAID_ACTION_QUIESCE_PHYS_IO; +- else +- pReq->Action = MPI_RAID_ACTION_ENABLE_PHYS_IO; +- pReq->Reserved1 = 0; +- pReq->ChainOffset = 0; +- pReq->Function = MPI_FUNCTION_RAID_ACTION; +- pReq->VolumeID = id; +- pReq->VolumeBus = channel; +- pReq->PhysDiskNum = 0; +- pReq->MsgFlags = 0; +- pReq->Reserved2 = 0; +- pReq->ActionDataWord = 0; /* Reserved for this action */ +- +- ioc->add_sge((char *)&pReq->ActionDataSGE, +- MPT_SGE_FLAGS_SSIMPLE_READ | 0, (dma_addr_t) -1); +- +- ddvprintk(ioc, printk(MYIOC_s_DEBUG_FMT +- "RAID Volume action=%x channel=%d id=%d\n", +- ioc->name, pReq->Action, channel, id)); +- +- INITIALIZE_MGMT_STATUS(ioc->internal_cmds.status) +- mpt_put_msg_frame(ioc->InternalCtx, ioc, mf); +- timeleft = wait_for_completion_timeout(&ioc->internal_cmds.done, 10*HZ); +- if (!(ioc->internal_cmds.status & MPT_MGMT_STATUS_COMMAND_GOOD)) { +- ret = -ETIME; +- dfailprintk(ioc, printk(MYIOC_s_DEBUG_FMT "%s: TIMED OUT!\n", +- ioc->name, __func__)); +- if (ioc->internal_cmds.status & MPT_MGMT_STATUS_DID_IOCRESET) +- goto out; +- if (!timeleft) { +- printk(MYIOC_s_WARN_FMT "Issuing Reset from %s!!\n", +- ioc->name, __func__); +- if (mpt_SoftResetHandler(ioc, CAN_SLEEP) != 0) +- mpt_HardResetHandler(ioc, CAN_SLEEP); +- mpt_free_msg_frame(ioc, mf); +- } +- goto out; +- } +- +- ret = ioc->internal_cmds.completion_code; +- +- out: +- CLEAR_MGMT_STATUS(ioc->internal_cmds.status) +- mutex_unlock(&ioc->internal_cmds.mutex); +- return ret; +-} ++/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ ++/* ++ * Bus Scan and Domain Validation functionality ... ++ */ ++ ++/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ ++/* ++ * mptscsih_scandv_complete - Scan and DV callback routine registered ++ * to Fustion MPT (base) driver. ++ * ++ * @ioc: Pointer to MPT_ADAPTER structure ++ * @mf: Pointer to original MPT request frame ++ * @mr: Pointer to MPT reply frame (NULL if TurboReply) ++ * ++ * This routine is called from mpt.c::mpt_interrupt() at the completion ++ * of any SCSI IO request. ++ * This routine is registered with the Fusion MPT (base) driver at driver ++ * load/init time via the mpt_register() API call. ++ * ++ * Returns 1 indicating alloc'd request frame ptr should be freed. ++ * ++ * Remark: Sets a completion code and (possibly) saves sense data ++ * in the IOC member localReply structure. ++ * Used ONLY for DV and other internal commands. ++ */ ++int ++mptscsih_scandv_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *req, ++ MPT_FRAME_HDR *reply) ++{ ++ SCSIIORequest_t *pReq; ++ SCSIIOReply_t *pReply; ++ u8 cmd; ++ u16 req_idx; ++ u8 *sense_data; ++ int sz; ++ ++ ioc->internal_cmds.status |= MPT_MGMT_STATUS_COMMAND_GOOD; ++ ioc->internal_cmds.completion_code = MPT_SCANDV_GOOD; ++ if (!reply) ++ goto out; ++ ++ pReply = (SCSIIOReply_t *) reply; ++ pReq = (SCSIIORequest_t *) req; ++ ioc->internal_cmds.completion_code = ++ mptscsih_get_completion_code(ioc, req, reply); ++ ioc->internal_cmds.status |= MPT_MGMT_STATUS_RF_VALID; ++ memcpy(ioc->internal_cmds.reply, reply, ++ min(MPT_DEFAULT_FRAME_SIZE, 4 * reply->u.reply.MsgLength)); ++ cmd = reply->u.hdr.Function; ++ if (((cmd == MPI_FUNCTION_SCSI_IO_REQUEST) || ++ (cmd == MPI_FUNCTION_RAID_SCSI_IO_PASSTHROUGH)) && ++ (pReply->SCSIState & MPI_SCSI_STATE_AUTOSENSE_VALID)) { ++ req_idx = le16_to_cpu(req->u.frame.hwhdr.msgctxu.fld.req_idx); ++ sense_data = ((u8 *)ioc->sense_buf_pool + ++ (req_idx * MPT_SENSE_BUFFER_ALLOC)); ++ sz = min_t(int, pReq->SenseBufferLength, ++ MPT_SENSE_BUFFER_ALLOC); ++ memcpy(ioc->internal_cmds.sense, sense_data, sz); ++ } ++ out: ++ if (!(ioc->internal_cmds.status & MPT_MGMT_STATUS_PENDING)) ++ return 0; ++ ioc->internal_cmds.status &= ~MPT_MGMT_STATUS_PENDING; ++ complete(&ioc->internal_cmds.done); ++ return 1; ++} ++ + + /** + * mptscsih_get_completion_code - +@@ -2823,7 +3264,7 @@ + **/ + static int + mptscsih_get_completion_code(MPT_ADAPTER *ioc, MPT_FRAME_HDR *req, +- MPT_FRAME_HDR *reply) ++ MPT_FRAME_HDR *reply) + { + SCSIIOReply_t *pReply; + MpiRaidActionReply_t *pr; +@@ -2837,9 +3278,8 @@ + + devtprintk(ioc, printk(MYIOC_s_DEBUG_FMT + "IOCStatus=%04xh, SCSIState=%02xh, SCSIStatus=%02xh," +- " IOCLogInfo=%08xh\n", +- ioc->name, status, pReply->SCSIState, scsi_status, +- le32_to_cpu(pReply->IOCLogInfo))); ++ "IOCLogInfo=%08xh\n", ioc->name, status, pReply->SCSIState, ++ scsi_status, le32_to_cpu(pReply->IOCLogInfo))); + + switch (status) { + +@@ -2864,11 +3304,10 @@ + case MPI_IOCSTATUS_SUCCESS: /* 0x0000 */ + if (pReply->Function == MPI_FUNCTION_CONFIG) { + completion_code = MPT_SCANDV_GOOD; +- } else if (pReply->Function == +- MPI_FUNCTION_RAID_ACTION) { ++ } else if (pReply->Function == MPI_FUNCTION_RAID_ACTION) { + pr = (MpiRaidActionReply_t *)reply; + if (le16_to_cpu(pr->ActionStatus) == +- MPI_RAID_ACTION_ASTATUS_SUCCESS) ++ MPI_RAID_ACTION_ASTATUS_SUCCESS) + completion_code = MPT_SCANDV_GOOD; + else + completion_code = MPT_SCANDV_SOME_ERROR; +@@ -2906,55 +3345,6 @@ + return completion_code; + } + +-/** +- * mptscsih_scandv_complete - +- * @ioc: Pointer to MPT_ADAPTER structure +- * @req: +- * @reply: +- * +- **/ +-int +-mptscsih_scandv_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *req, +- MPT_FRAME_HDR *reply) +-{ +- SCSIIORequest_t *pReq; +- SCSIIOReply_t *pReply; +- u8 cmd; +- u16 req_idx; +- u8 *sense_data; +- int sz; +- +- ioc->internal_cmds.status |= MPT_MGMT_STATUS_COMMAND_GOOD; +- ioc->internal_cmds.completion_code = MPT_SCANDV_GOOD; +- if (!reply) +- goto out; +- +- pReply = (SCSIIOReply_t *) reply; +- pReq = (SCSIIORequest_t *) req; +- ioc->internal_cmds.completion_code = +- mptscsih_get_completion_code(ioc, req, reply); +- ioc->internal_cmds.status |= MPT_MGMT_STATUS_RF_VALID; +- memcpy(ioc->internal_cmds.reply, reply, +- min(MPT_DEFAULT_FRAME_SIZE, 4 * reply->u.reply.MsgLength)); +- cmd = reply->u.hdr.Function; +- if (((cmd == MPI_FUNCTION_SCSI_IO_REQUEST) || +- (cmd == MPI_FUNCTION_RAID_SCSI_IO_PASSTHROUGH)) && +- (pReply->SCSIState & MPI_SCSI_STATE_AUTOSENSE_VALID)) { +- req_idx = le16_to_cpu(req->u.frame.hwhdr.msgctxu.fld.req_idx); +- sense_data = ((u8 *)ioc->sense_buf_pool + +- (req_idx * MPT_SENSE_BUFFER_ALLOC)); +- sz = min_t(int, pReq->SenseBufferLength, +- MPT_SENSE_BUFFER_ALLOC); +- memcpy(ioc->internal_cmds.sense, sense_data, sz); +- } +- out: +- if (!(ioc->internal_cmds.status & MPT_MGMT_STATUS_PENDING)) +- return 0; +- ioc->internal_cmds.status &= ~MPT_MGMT_STATUS_PENDING; +- complete(&ioc->internal_cmds.done); +- return 1; +-} +- + /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ + /** + * mptscsih_do_cmd - Do internal command. +@@ -2974,7 +3364,7 @@ + * 0 if good + * + * > 0 if command complete but some type of completion error. +- **/ ++ */ + int + mptscsih_do_cmd(MPT_SCSI_HOST *hd, INTERNAL_CMD *io) + { +@@ -2989,13 +3379,13 @@ + int ret = 0; + unsigned long timeleft; + unsigned long flags; +- ++ + /* don't send internal command during diag reset */ + spin_lock_irqsave(&ioc->taskmgmt_lock, flags); + if (ioc->ioc_reset_in_progress) { + spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags); + dfailprintk(ioc, printk(MYIOC_s_DEBUG_FMT +- "%s: busy with host reset\n", ioc->name, __func__)); ++ "%s: busy with host reset\n", ioc->name, __FUNCTION__)); + return MPT_SCANDV_BUSY; + } + spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags); +@@ -3109,6 +3499,16 @@ + dir = MPI_SCSIIO_CONTROL_READ; + timeout = 10; + break; ++#ifdef EEDP_SUPPORT ++ case SERVICE_ACTION_IN: ++ CDB[0] = cmd; ++ CDB[1] = 0x10; ++ CDB[13] = io->size & 0xFF; ++ dir = MPI_SCSIIO_CONTROL_READ; ++ timeout = 10; ++ cmdLen = 16; ++ break; ++#endif + + default: + /* Error Case */ +@@ -3146,10 +3546,14 @@ + + pScsiReq->CDBLength = cmdLen; + pScsiReq->SenseBufferLength = MPT_SENSE_BUFFER_SIZE; ++ + pScsiReq->Reserved = 0; ++ + pScsiReq->MsgFlags = mpt_msg_flags(ioc); ++ /* MsgContext set in mpt_get_msg_fram call */ + + int_to_scsilun(io->lun, (struct scsi_lun *)pScsiReq->LUN); ++ + if (io->flags & MPT_ICFLAG_TAGGED_CMD) + pScsiReq->Control = cpu_to_le32(dir | MPI_SCSIIO_CONTROL_SIMPLEQ); + else +@@ -3214,6 +3618,73 @@ + return ret; + } + ++int ++mptscsih_quiesce_raid(MPT_SCSI_HOST *hd, int quiesce, u8 channel, u8 id) ++{ ++ MPT_ADAPTER *ioc = hd->ioc; ++ MpiRaidActionRequest_t *pReq; ++ MPT_FRAME_HDR *mf; ++ int ret; ++ unsigned long timeleft; ++ ++ mutex_lock(&ioc->internal_cmds.mutex); ++ ++ /* Get and Populate a free Frame ++ */ ++ if ((mf = mpt_get_msg_frame(ioc->InternalCtx, ioc)) == NULL) { ++ dfailprintk(hd->ioc, printk(MYIOC_s_WARN_FMT "%s: no msg frames!\n", ++ ioc->name, __FUNCTION__)); ++ ret = -EAGAIN; ++ goto out; ++ } ++ pReq = (MpiRaidActionRequest_t *)mf; ++ if (quiesce) ++ pReq->Action = MPI_RAID_ACTION_QUIESCE_PHYS_IO; ++ else ++ pReq->Action = MPI_RAID_ACTION_ENABLE_PHYS_IO; ++ pReq->Reserved1 = 0; ++ pReq->ChainOffset = 0; ++ pReq->Function = MPI_FUNCTION_RAID_ACTION; ++ pReq->VolumeID = id; ++ pReq->VolumeBus = channel; ++ pReq->PhysDiskNum = 0; ++ pReq->MsgFlags = 0; ++ pReq->Reserved2 = 0; ++ pReq->ActionDataWord = 0; /* Reserved for this action */ ++ ++ ioc->add_sge((char *)&pReq->ActionDataSGE, ++ MPT_SGE_FLAGS_SSIMPLE_READ | 0, (dma_addr_t) -1); ++ ++ ddvprintk(ioc, printk(MYIOC_s_DEBUG_FMT "RAID Volume action=%x channel=%d id=%d\n", ++ ioc->name, pReq->Action, channel, id)); ++ ++ INITIALIZE_MGMT_STATUS(ioc->internal_cmds.status) ++ mpt_put_msg_frame(ioc->InternalCtx, ioc, mf); ++ timeleft = wait_for_completion_timeout(&ioc->internal_cmds.done, 10*HZ); ++ if (!(ioc->internal_cmds.status & MPT_MGMT_STATUS_COMMAND_GOOD)) { ++ ret = -ETIME; ++ dfailprintk(ioc, printk(MYIOC_s_DEBUG_FMT "%s: TIMED OUT!\n", ++ ioc->name, __FUNCTION__)); ++ if (ioc->internal_cmds.status & MPT_MGMT_STATUS_DID_IOCRESET) ++ goto out; ++ if (!timeleft) { ++ printk(MYIOC_s_WARN_FMT "Issuing Reset from %s!!\n", ++ ioc->name, __FUNCTION__); ++ if (mpt_SoftResetHandler(ioc, CAN_SLEEP) != 0) ++ mpt_HardResetHandler(ioc, CAN_SLEEP); ++ mpt_free_msg_frame(ioc, mf); ++ } ++ goto out; ++ } ++ ++ ret = ioc->internal_cmds.completion_code; ++ ++ out: ++ CLEAR_MGMT_STATUS(ioc->internal_cmds.status) ++ mutex_unlock(&ioc->internal_cmds.mutex); ++ return ret; ++} ++ + /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ + /** + * mptscsih_synchronize_cache - Send SYNCHRONIZE_CACHE to all disks. +@@ -3225,8 +3696,7 @@ + * + */ + static void +-mptscsih_synchronize_cache(struct scsi_device *sdev, MPT_SCSI_HOST *hd, +- VirtDevice *vdevice) ++mptscsih_synchronize_cache(struct scsi_device *sdev, MPT_SCSI_HOST *hd, VirtDevice *vdevice) + { + INTERNAL_CMD iocmd; + MPT_ADAPTER *ioc = hd->ioc; +@@ -3250,21 +3720,164 @@ + iocmd.id = vdevice->vtarget->id; + iocmd.lun = vdevice->lun; + +- sdev_printk(KERN_INFO, sdev, MYIOC_s_FMT +- "SYNCHRONIZE_CACHE: fw_channel %d, fw_id %d\n", +- ioc->name, vdevice->vtarget->channel, vdevice->vtarget->id); ++ sdev_printk(KERN_INFO, sdev, MYIOC_s_FMT "SYNCHRONIZE_CACHE: fw_channel %d," ++ " fw_id %d\n", ioc->name, vdevice->vtarget->channel, vdevice->vtarget->id); + mptscsih_do_cmd(hd, &iocmd); + } + + /* + * shost attributes + */ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)) ++static ssize_t ++mptscsih_fault_show(struct class_device *cdev, char *buf) ++{ ++ struct Scsi_Host *host = class_to_shost(cdev); ++#else ++static ssize_t ++mptscsih_fault_show(struct device *dev, struct device_attribute *attr, ++ char *buf) ++{ ++ struct Scsi_Host *host = class_to_shost(dev); ++#endif ++ MPT_SCSI_HOST *hd = shost_private(host); ++ MPT_ADAPTER *ioc = hd->ioc; ++ ++ return snprintf(buf, PAGE_SIZE, "%d\n", ioc->is_fault); ++} ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)) ++static ssize_t ++mptscsih_fault_store(struct class_device *cdev, const char *buf, size_t count) ++{ ++ struct Scsi_Host *host = class_to_shost(cdev); ++#else ++static ssize_t ++mptscsih_fault_store(struct device *dev, struct device_attribute *attr, ++ const char *buf, size_t count) ++{ ++ struct Scsi_Host *host = class_to_shost(dev); ++#endif ++ MPT_SCSI_HOST *hd = shost_private(host); ++ MPT_ADAPTER *ioc = hd->ioc; ++ int val = 0; ++ ++ if (sscanf(buf, "%d", &val) != 1) ++ return -EINVAL; ++ ++ ioc->is_fault = val; ++ return strlen(buf); ++ ++} ++ ++struct DIAG_BUFFER_START { ++ u32 Size; ++ u32 DiagVersion; ++ u8 BufferType; ++ u8 Reserved[3]; ++ u32 Reserved1; ++ u32 Reserved2; ++ u32 Reserved3; ++}; ++ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)) ++static ssize_t ++mptscsih_ring_buffer_size_show(struct class_device *cdev, char *buf) ++{ ++ struct Scsi_Host *host = class_to_shost(cdev); ++#else ++static ssize_t ++mptscsih_ring_buffer_size_show(struct device *dev, ++ struct device_attribute *attr, char *buf) ++{ ++ struct Scsi_Host *host = class_to_shost(dev); ++#endif ++ MPT_SCSI_HOST *hd = shost_private(host); ++ MPT_ADAPTER *ioc = hd->ioc; ++ u32 size = 0; ++ struct DIAG_BUFFER_START *request_data; ++ ++ ioc->ring_buffer_sz = 0; ++ if (!ioc->DiagBuffer[0]) ++ return 0; ++ ++ request_data = (struct DIAG_BUFFER_START *)ioc->DiagBuffer[0]; ++ if ((le32_to_cpu(request_data->DiagVersion) == 0x00000000 || ++ le32_to_cpu(request_data->DiagVersion) == 0x01000000) && ++ le32_to_cpu(request_data->Reserved3) == 0x4742444c) { ++ size = le32_to_cpu(request_data->Size); ++ ioc->ring_buffer_sz = size; ++ } ++ ++ return snprintf(buf, PAGE_SIZE, "%d\n", size); ++} ++ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)) ++static ssize_t ++mptscsih_ring_buffer_show(struct class_device *cdev, char *buf) ++{ ++ struct Scsi_Host *host = class_to_shost(cdev); ++#else ++static ssize_t ++mptscsih_ring_buffer_show(struct device *dev, ++ struct device_attribute *attr, char *buf) ++{ ++ struct Scsi_Host *host = class_to_shost(dev); ++#endif ++ ++ MPT_SCSI_HOST *hd = shost_private(host); ++ MPT_ADAPTER *ioc = hd->ioc; ++ void *request_data; ++ u32 size; ++ ++ if (!ioc->DiagBuffer[0]) ++ return 0; ++ ++ if (ioc->ring_buffer_offset > ioc->ring_buffer_sz) ++ return 0; ++ ++ size = ioc->ring_buffer_sz - ioc->ring_buffer_offset; ++ size = (size > PAGE_SIZE) ? PAGE_SIZE : size; ++ request_data = ioc->DiagBuffer[0] + ioc->ring_buffer_offset; ++ memcpy(buf, request_data, size); ++ return size; ++} ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)) ++static ssize_t ++mptscsih_ring_buffer_store(struct class_device *cdev, const char *buf, ++ size_t count) ++{ ++ struct Scsi_Host *host = class_to_shost(cdev); ++#else ++static ssize_t ++mptscsih_ring_buffer_store(struct device *dev, struct device_attribute *attr, ++ const char *buf, size_t count) ++{ ++ struct Scsi_Host *host = class_to_shost(dev); ++#endif ++ MPT_SCSI_HOST *hd = shost_private(host); ++ MPT_ADAPTER *ioc = hd->ioc; ++ int val = 0; ++ ++ if (sscanf(buf, "%d", &val) != 1) ++ return -EINVAL; ++ ++ ioc->ring_buffer_offset = val; ++ return strlen(buf); ++} ++ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)) ++static ssize_t ++mptscsih_version_fw_show(struct class_device *cdev, char *buf) ++{ ++ struct Scsi_Host *host = class_to_shost(cdev); ++#else + static ssize_t + mptscsih_version_fw_show(struct device *dev, struct device_attribute *attr, + char *buf) + { + struct Scsi_Host *host = class_to_shost(dev); +- MPT_SCSI_HOST *hd = shost_priv(host); ++#endif ++ MPT_SCSI_HOST *hd = shost_private(host); + MPT_ADAPTER *ioc = hd->ioc; + + return snprintf(buf, PAGE_SIZE, "%02d.%02d.%02d.%02d\n", +@@ -3273,158 +3886,229 @@ + (ioc->facts.FWVersion.Word & 0x0000FF00) >> 8, + ioc->facts.FWVersion.Word & 0x000000FF); + } +-static DEVICE_ATTR(version_fw, S_IRUGO, mptscsih_version_fw_show, NULL); +- ++ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)) ++static ssize_t ++mptscsih_version_bios_show(struct class_device *cdev, char *buf) ++{ ++ struct Scsi_Host *host = class_to_shost(cdev); ++#else + static ssize_t + mptscsih_version_bios_show(struct device *dev, struct device_attribute *attr, + char *buf) + { + struct Scsi_Host *host = class_to_shost(dev); +- MPT_SCSI_HOST *hd = shost_priv(host); +- MPT_ADAPTER *ioc = hd->ioc; +- +- return snprintf(buf, PAGE_SIZE, "%02x.%02x.%02x.%02x\n", ++#endif ++ MPT_SCSI_HOST *hd = shost_private(host); ++ MPT_ADAPTER *ioc = hd->ioc; ++ ++ return snprintf(buf, PAGE_SIZE, "%02d.%02d.%02d.%02d\n", + (ioc->biosVersion & 0xFF000000) >> 24, + (ioc->biosVersion & 0x00FF0000) >> 16, + (ioc->biosVersion & 0x0000FF00) >> 8, + ioc->biosVersion & 0x000000FF); + } +-static DEVICE_ATTR(version_bios, S_IRUGO, mptscsih_version_bios_show, NULL); +- ++ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)) ++static ssize_t ++mptscsih_version_mpi_show(struct class_device *cdev, char *buf) ++{ ++ struct Scsi_Host *host = class_to_shost(cdev); ++#else + static ssize_t + mptscsih_version_mpi_show(struct device *dev, struct device_attribute *attr, + char *buf) + { + struct Scsi_Host *host = class_to_shost(dev); +- MPT_SCSI_HOST *hd = shost_priv(host); +- MPT_ADAPTER *ioc = hd->ioc; +- +- return snprintf(buf, PAGE_SIZE, "%03x\n", ioc->facts.MsgVersion); +-} +-static DEVICE_ATTR(version_mpi, S_IRUGO, mptscsih_version_mpi_show, NULL); +- ++#endif ++ MPT_SCSI_HOST *hd = shost_private(host); ++ MPT_ADAPTER *ioc = hd->ioc; ++ ++ if (ioc->facts.MsgVersion >= MPI_VERSION_01_05) ++ return snprintf(buf, PAGE_SIZE, "%03x.%02x\n", ++ ioc->facts.MsgVersion, ioc->facts.HeaderVersion >> 8); ++ else ++ return snprintf(buf, PAGE_SIZE, "%03x\n", ++ ioc->facts.MsgVersion); ++} ++ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)) ++static ssize_t ++mptscsih_version_product_show(struct class_device *cdev, char *buf) ++{ ++ struct Scsi_Host *host = class_to_shost(cdev); ++#else + static ssize_t + mptscsih_version_product_show(struct device *dev, +- struct device_attribute *attr, +-char *buf) +-{ +- struct Scsi_Host *host = class_to_shost(dev); +- MPT_SCSI_HOST *hd = shost_priv(host); ++ struct device_attribute *attr, char *buf) ++{ ++ struct Scsi_Host *host = class_to_shost(dev); ++#endif ++ MPT_SCSI_HOST *hd = shost_private(host); + MPT_ADAPTER *ioc = hd->ioc; + + return snprintf(buf, PAGE_SIZE, "%s\n", ioc->prod_name); + } +-static DEVICE_ATTR(version_product, S_IRUGO, +- mptscsih_version_product_show, NULL); +- ++ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)) ++static ssize_t ++mptscsih_version_nvdata_persistent_show(struct class_device *cdev, char *buf) ++{ ++ struct Scsi_Host *host = class_to_shost(cdev); ++#else + static ssize_t + mptscsih_version_nvdata_persistent_show(struct device *dev, + struct device_attribute *attr, + char *buf) + { + struct Scsi_Host *host = class_to_shost(dev); +- MPT_SCSI_HOST *hd = shost_priv(host); ++#endif ++ MPT_SCSI_HOST *hd = shost_private(host); + MPT_ADAPTER *ioc = hd->ioc; + + return snprintf(buf, PAGE_SIZE, "%02xh\n", + ioc->nvdata_version_persistent); + } +-static DEVICE_ATTR(version_nvdata_persistent, S_IRUGO, +- mptscsih_version_nvdata_persistent_show, NULL); +- ++ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)) ++static ssize_t ++mptscsih_version_nvdata_default_show(struct class_device *cdev, char *buf) ++{ ++ struct Scsi_Host *host = class_to_shost(cdev); ++#else + static ssize_t + mptscsih_version_nvdata_default_show(struct device *dev, + struct device_attribute *attr, char *buf) + { + struct Scsi_Host *host = class_to_shost(dev); +- MPT_SCSI_HOST *hd = shost_priv(host); ++#endif ++ MPT_SCSI_HOST *hd = shost_private(host); + MPT_ADAPTER *ioc = hd->ioc; + + return snprintf(buf, PAGE_SIZE, "%02xh\n",ioc->nvdata_version_default); + } +-static DEVICE_ATTR(version_nvdata_default, S_IRUGO, +- mptscsih_version_nvdata_default_show, NULL); +- ++ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)) ++static ssize_t ++mptscsih_board_name_show(struct class_device *cdev, char *buf) ++{ ++ struct Scsi_Host *host = class_to_shost(cdev); ++#else + static ssize_t + mptscsih_board_name_show(struct device *dev, struct device_attribute *attr, + char *buf) + { + struct Scsi_Host *host = class_to_shost(dev); +- MPT_SCSI_HOST *hd = shost_priv(host); ++#endif ++ MPT_SCSI_HOST *hd = shost_private(host); + MPT_ADAPTER *ioc = hd->ioc; + + return snprintf(buf, PAGE_SIZE, "%s\n", ioc->board_name); + } +-static DEVICE_ATTR(board_name, S_IRUGO, mptscsih_board_name_show, NULL); +- +-static ssize_t +-mptscsih_board_assembly_show(struct device *dev, +- struct device_attribute *attr, char *buf) +-{ +- struct Scsi_Host *host = class_to_shost(dev); +- MPT_SCSI_HOST *hd = shost_priv(host); ++ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)) ++static ssize_t ++mptscsih_board_assembly_show(struct class_device *cdev, char *buf) ++{ ++ struct Scsi_Host *host = class_to_shost(cdev); ++#else ++static ssize_t ++mptscsih_board_assembly_show(struct device *dev, struct device_attribute *attr, ++ char *buf) ++{ ++ struct Scsi_Host *host = class_to_shost(dev); ++#endif ++ MPT_SCSI_HOST *hd = shost_private(host); + MPT_ADAPTER *ioc = hd->ioc; + + return snprintf(buf, PAGE_SIZE, "%s\n", ioc->board_assembly); + } +-static DEVICE_ATTR(board_assembly, S_IRUGO, +- mptscsih_board_assembly_show, NULL); +- ++ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)) ++static ssize_t ++mptscsih_board_tracer_show(struct class_device *cdev, char *buf) ++{ ++ struct Scsi_Host *host = class_to_shost(cdev); ++#else + static ssize_t + mptscsih_board_tracer_show(struct device *dev, struct device_attribute *attr, + char *buf) + { + struct Scsi_Host *host = class_to_shost(dev); +- MPT_SCSI_HOST *hd = shost_priv(host); ++#endif ++ MPT_SCSI_HOST *hd = shost_private(host); + MPT_ADAPTER *ioc = hd->ioc; + + return snprintf(buf, PAGE_SIZE, "%s\n", ioc->board_tracer); + } +-static DEVICE_ATTR(board_tracer, S_IRUGO, +- mptscsih_board_tracer_show, NULL); +- ++ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)) ++static ssize_t ++mptscsih_io_delay_show(struct class_device *cdev, char *buf) ++{ ++ struct Scsi_Host *host = class_to_shost(cdev); ++#else + static ssize_t + mptscsih_io_delay_show(struct device *dev, struct device_attribute *attr, + char *buf) + { + struct Scsi_Host *host = class_to_shost(dev); +- MPT_SCSI_HOST *hd = shost_priv(host); ++#endif ++ MPT_SCSI_HOST *hd = shost_private(host); + MPT_ADAPTER *ioc = hd->ioc; + + return snprintf(buf, PAGE_SIZE, "%02d\n", ioc->io_missing_delay); + } +-static DEVICE_ATTR(io_delay, S_IRUGO, +- mptscsih_io_delay_show, NULL); +- ++ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)) ++static ssize_t ++mptscsih_device_delay_show(struct class_device *cdev, char *buf) ++{ ++ struct Scsi_Host *host = class_to_shost(cdev); ++#else + static ssize_t + mptscsih_device_delay_show(struct device *dev, struct device_attribute *attr, + char *buf) + { + struct Scsi_Host *host = class_to_shost(dev); +- MPT_SCSI_HOST *hd = shost_priv(host); ++#endif ++ MPT_SCSI_HOST *hd = shost_private(host); + MPT_ADAPTER *ioc = hd->ioc; + + return snprintf(buf, PAGE_SIZE, "%02d\n", ioc->device_missing_delay); + } +-static DEVICE_ATTR(device_delay, S_IRUGO, +- mptscsih_device_delay_show, NULL); +- ++ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)) ++static ssize_t ++mptscsih_debug_level_show(struct class_device *cdev, char *buf) ++{ ++ struct Scsi_Host *host = class_to_shost(cdev); ++#else + static ssize_t + mptscsih_debug_level_show(struct device *dev, struct device_attribute *attr, + char *buf) + { + struct Scsi_Host *host = class_to_shost(dev); +- MPT_SCSI_HOST *hd = shost_priv(host); ++#endif ++ MPT_SCSI_HOST *hd = shost_private(host); + MPT_ADAPTER *ioc = hd->ioc; + + return snprintf(buf, PAGE_SIZE, "%08xh\n", ioc->debug_level); + } ++ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)) ++static ssize_t ++mptscsih_debug_level_store(struct class_device *cdev, const char *buf, size_t count) ++{ ++ struct Scsi_Host *host = class_to_shost(cdev); ++#else + static ssize_t + mptscsih_debug_level_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t count) + { + struct Scsi_Host *host = class_to_shost(dev); +- MPT_SCSI_HOST *hd = shost_priv(host); ++#endif ++ MPT_SCSI_HOST *hd = shost_private(host); + MPT_ADAPTER *ioc = hd->ioc; + int val = 0; + +@@ -3436,25 +4120,39 @@ + ioc->debug_level); + return strlen(buf); + } +-static DEVICE_ATTR(debug_level, S_IRUGO | S_IWUSR, +- mptscsih_debug_level_show, mptscsih_debug_level_store); +- ++ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)) ++static ssize_t ++mptscsih_disable_hotplug_remove_show(struct class_device *cdev, char *buf) ++{ ++ struct Scsi_Host *host = class_to_shost(cdev); ++#else + static ssize_t + mptscsih_disable_hotplug_remove_show(struct device *dev, +- struct device_attribute *attr, char *buf) +-{ +- struct Scsi_Host *host = class_to_shost(dev); +- MPT_SCSI_HOST *hd = shost_priv(host); ++ struct device_attribute *attr, ++ char *buf) ++{ ++ struct Scsi_Host *host = class_to_shost(dev); ++#endif ++ MPT_SCSI_HOST *hd = shost_private(host); + MPT_ADAPTER *ioc = hd->ioc; + + return snprintf(buf, PAGE_SIZE, "%02xh\n", ioc->disable_hotplug_remove); + } ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)) ++static ssize_t ++mptscsih_disable_hotplug_remove_store(struct class_device *cdev, const char *buf, size_t count) ++{ ++ struct Scsi_Host *host = class_to_shost(cdev); ++#else + static ssize_t + mptscsih_disable_hotplug_remove_store(struct device *dev, +- struct device_attribute *attr, const char *buf, size_t count) +-{ +- struct Scsi_Host *host = class_to_shost(dev); +- MPT_SCSI_HOST *hd = shost_priv(host); ++ struct device_attribute *attr, ++ const char *buf, size_t count) ++{ ++ struct Scsi_Host *host = class_to_shost(dev); ++#endif ++ MPT_SCSI_HOST *hd = shost_private(host); + MPT_ADAPTER *ioc = hd->ioc; + int val = 0; + +@@ -3469,11 +4167,94 @@ + printk(MYIOC_s_INFO_FMT "eanbling hotplug remove\n", ioc->name); + return strlen(buf); + } ++ ++ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)) ++static CLASS_DEVICE_ATTR(fault, S_IRUGO | S_IWUSR, ++ mptscsih_fault_show, mptscsih_fault_store); ++static CLASS_DEVICE_ATTR(ring_buffer_size, S_IRUGO, ++ mptscsih_ring_buffer_size_show, NULL); ++static CLASS_DEVICE_ATTR(ring_buffer, S_IRUGO | S_IWUSR, ++ mptscsih_ring_buffer_show, mptscsih_ring_buffer_store); ++static CLASS_DEVICE_ATTR(version_fw, S_IRUGO, mptscsih_version_fw_show, NULL); ++static CLASS_DEVICE_ATTR(version_bios, S_IRUGO, ++ mptscsih_version_bios_show, NULL); ++static CLASS_DEVICE_ATTR(version_mpi, S_IRUGO, mptscsih_version_mpi_show, NULL); ++static CLASS_DEVICE_ATTR(version_product, S_IRUGO, ++ mptscsih_version_product_show, NULL); ++static CLASS_DEVICE_ATTR(version_nvdata_persistent, S_IRUGO, ++ mptscsih_version_nvdata_persistent_show, NULL); ++static CLASS_DEVICE_ATTR(version_nvdata_default, S_IRUGO, ++ mptscsih_version_nvdata_default_show, NULL); ++static CLASS_DEVICE_ATTR(board_name, S_IRUGO, mptscsih_board_name_show, NULL); ++static CLASS_DEVICE_ATTR(board_assembly, S_IRUGO, ++ mptscsih_board_assembly_show, NULL); ++static CLASS_DEVICE_ATTR(board_tracer, S_IRUGO, ++ mptscsih_board_tracer_show, NULL); ++static CLASS_DEVICE_ATTR(io_delay, S_IRUGO, ++ mptscsih_io_delay_show, NULL); ++static CLASS_DEVICE_ATTR(device_delay, S_IRUGO, ++ mptscsih_device_delay_show, NULL); ++static CLASS_DEVICE_ATTR(debug_level, S_IRUGO | S_IWUSR, ++ mptscsih_debug_level_show, mptscsih_debug_level_store); ++static CLASS_DEVICE_ATTR(disable_hotplug_remove, S_IRUGO | S_IWUSR, ++ mptscsih_disable_hotplug_remove_show, mptscsih_disable_hotplug_remove_store); ++ ++struct class_device_attribute *mptscsih_host_attrs[] = { ++ &class_device_attr_fault, ++ &class_device_attr_ring_buffer_size, ++ &class_device_attr_ring_buffer, ++ &class_device_attr_version_fw, ++ &class_device_attr_version_bios, ++ &class_device_attr_version_mpi, ++ &class_device_attr_version_product, ++ &class_device_attr_version_nvdata_persistent, ++ &class_device_attr_version_nvdata_default, ++ &class_device_attr_board_name, ++ &class_device_attr_board_assembly, ++ &class_device_attr_board_tracer, ++ &class_device_attr_io_delay, ++ &class_device_attr_device_delay, ++ &class_device_attr_debug_level, ++ &class_device_attr_disable_hotplug_remove, ++ NULL, ++}; ++#else ++ ++static DEVICE_ATTR(fault, S_IRUGO | S_IWUSR, ++ mptscsih_fault_show, mptscsih_fault_store); ++static DEVICE_ATTR(ring_buffer_size, S_IRUGO, ++ mptscsih_ring_buffer_size_show, NULL); ++static DEVICE_ATTR(ring_buffer, S_IRUGO | S_IWUSR, ++ mptscsih_ring_buffer_show, mptscsih_ring_buffer_store); ++static DEVICE_ATTR(version_fw, S_IRUGO, mptscsih_version_fw_show, NULL); ++static DEVICE_ATTR(version_bios, S_IRUGO, ++ mptscsih_version_bios_show, NULL); ++static DEVICE_ATTR(version_mpi, S_IRUGO, mptscsih_version_mpi_show, NULL); ++static DEVICE_ATTR(version_product, S_IRUGO, ++ mptscsih_version_product_show, NULL); ++static DEVICE_ATTR(version_nvdata_persistent, S_IRUGO, ++ mptscsih_version_nvdata_persistent_show, NULL); ++static DEVICE_ATTR(version_nvdata_default, S_IRUGO, ++ mptscsih_version_nvdata_default_show, NULL); ++static DEVICE_ATTR(board_name, S_IRUGO, mptscsih_board_name_show, NULL); ++static DEVICE_ATTR(board_assembly, S_IRUGO, ++ mptscsih_board_assembly_show, NULL); ++static DEVICE_ATTR(board_tracer, S_IRUGO, ++ mptscsih_board_tracer_show, NULL); ++static DEVICE_ATTR(io_delay, S_IRUGO, ++ mptscsih_io_delay_show, NULL); ++static DEVICE_ATTR(device_delay, S_IRUGO, ++ mptscsih_device_delay_show, NULL); ++static DEVICE_ATTR(debug_level, S_IRUGO | S_IWUSR, ++ mptscsih_debug_level_show, mptscsih_debug_level_store); + static DEVICE_ATTR(disable_hotplug_remove, S_IRUGO | S_IWUSR, +- mptscsih_disable_hotplug_remove_show, +- mptscsih_disable_hotplug_remove_store); ++ mptscsih_disable_hotplug_remove_show, mptscsih_disable_hotplug_remove_store); + + struct device_attribute *mptscsih_host_attrs[] = { ++ &dev_attr_fault, ++ &dev_attr_ring_buffer_size, ++ &dev_attr_ring_buffer, + &dev_attr_version_fw, + &dev_attr_version_bios, + &dev_attr_version_mpi, +@@ -3489,6 +4270,9 @@ + &dev_attr_disable_hotplug_remove, + NULL, + }; ++ ++#endif ++ + EXPORT_SYMBOL(mptscsih_host_attrs); + + EXPORT_SYMBOL(mptscsih_remove); +diff -r 60d73800068f drivers/message/fusion/mptscsih.h +--- a/drivers/message/fusion/mptscsih.h Tue Jun 30 11:26:39 2009 +0100 ++++ b/drivers/message/fusion/mptscsih.h Wed Jul 01 09:46:25 2009 +0100 +@@ -93,6 +93,11 @@ + #define TRANSPORT_LAYER_RETRIES 0xC2 + #endif + ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)) ++#define mpt_sg_next(sg) sg + 1 ++#else ++#define mpt_sg_next(sg) sg_next(sg) ++#endif + typedef struct _internal_cmd { + char *data; /* data pointer */ + dma_addr_t data_dma; /* data dma address */ +@@ -129,13 +134,15 @@ + extern int mptscsih_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply); + extern int mptscsih_ioc_reset(MPT_ADAPTER *ioc, int post_reset); + extern int mptscsih_change_queue_depth(struct scsi_device *sdev, int qdepth); +-extern int mptscsih_IssueTaskMgmt(MPT_SCSI_HOST *hd, u8 type, u8 channel, +- u8 id, int lun, int ctx2abort, ulong timeout); ++extern int mptscsih_IssueTaskMgmt(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 id, int lun, int ctx2abort, ulong timeout); + extern u8 mptscsih_raid_id_to_num(MPT_ADAPTER *ioc, u8 channel, u8 id); + extern int mptscsih_is_phys_disk(MPT_ADAPTER *ioc, u8 channel, u8 id); + extern int mptscsih_do_cmd(MPT_SCSI_HOST *hd, INTERNAL_CMD *iocmd); ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)) ++extern struct class_device_attribute *mptscsih_host_attrs[]; ++#else + extern struct device_attribute *mptscsih_host_attrs[]; +-extern int mptscsih_quiesce_raid(MPT_SCSI_HOST *hd, int quiesce, u8 channel, +- u8 id); ++#endif ++extern int mptscsih_quiesce_raid(MPT_SCSI_HOST *hd, int quiesce, u8 channel, u8 id); + extern struct scsi_cmnd * mptscsih_get_scsi_lookup(MPT_ADAPTER *ioc, int i); + extern void mptscsih_taskmgmt_response_code(MPT_ADAPTER *ioc, u8 response_code); +diff -r 60d73800068f drivers/message/fusion/mptspi.c +--- a/drivers/message/fusion/mptspi.c Tue Jun 30 11:26:39 2009 +0100 ++++ b/drivers/message/fusion/mptspi.c Wed Jul 01 09:46:25 2009 +0100 +@@ -43,7 +43,7 @@ + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ +- ++#include + #include + #include + #include +@@ -67,6 +67,7 @@ + #include + #include + ++#include "linux_compat.h" /* linux-2.6 tweaks */ + #include "mptbase.h" + #include "mptscsih.h" + +@@ -87,8 +88,7 @@ + + static int mpt_qas = MPTSCSIH_QAS; + module_param(mpt_qas, int, 1); +-MODULE_PARM_DESC(mpt_qas, " Quick Arbitration and Selection (QAS) enabled=1," +- " disabled= (default=MPTSCSIH_QAS=1)"); ++MODULE_PARM_DESC(mpt_qas, " Quick Arbitration and Selection (QAS) enabled=1, disabled=0 (default=MPTSCSIH_QAS=1)"); + + static void mptspi_write_offset(struct scsi_target *, int); + static void mptspi_write_width(struct scsi_target *, int); +@@ -241,7 +241,7 @@ + */ + + ddvprintk(ioc, printk(MYIOC_s_DEBUG_FMT +- "Disabling QAS due to noQas=%02x on id=%d!\n", ioc->name, noQas, id)); ++ "Disabling QAS due to noQas=%02x on id=%d!\n", ioc->name, noQas, id)); + } + } + +@@ -315,7 +315,7 @@ + + ddvprintk(ioc, printk(MYIOC_s_DEBUG_FMT + "writeIOCPage4: MaxSEP=%d ActiveSEP=%d id=%d bus=%d\n", +- ioc->name, IOCPage4Ptr->MaxSEP, IOCPage4Ptr->ActiveSEP, id, channel)); ++ ioc->name, IOCPage4Ptr->MaxSEP, IOCPage4Ptr->ActiveSEP, id, channel)); + + mpt_put_msg_frame(ioc->DoneCtx, ioc, mf); + +@@ -408,7 +408,7 @@ + static int mptspi_target_alloc(struct scsi_target *starget) + { + struct Scsi_Host *shost = dev_to_shost(&starget->dev); +- struct _MPT_SCSI_HOST *hd = shost_priv(shost); ++ struct _MPT_SCSI_HOST *hd = shost_private(shost); + VirtTarget *vtarget; + MPT_ADAPTER *ioc = hd->ioc; + +@@ -496,7 +496,7 @@ + ii & MPI_SCSIDEVPAGE0_NP_WR_FLOW ? "WRFLOW ": "", + ii & MPI_SCSIDEVPAGE0_NP_RD_STRM ? "RDSTRM ": "", + ii & MPI_SCSIDEVPAGE0_NP_RTI ? "RTI ": "", +- ii & MPI_SCSIDEVPAGE0_NP_PCOMP_EN ? "PCOMP " : ""); ++ ii & MPI_SCSIDEVPAGE0_NP_PCOMP_EN ? "PCOMP ": ""); + } + + /** +@@ -524,14 +524,14 @@ + ii & MPI_SCSIDEVPAGE0_NP_WR_FLOW ? "WRFLOW ": "", + ii & MPI_SCSIDEVPAGE0_NP_RD_STRM ? "RDSTRM ": "", + ii & MPI_SCSIDEVPAGE0_NP_RTI ? "RTI ": "", +- ii & MPI_SCSIDEVPAGE0_NP_PCOMP_EN ? "PCOMP " : ""); ++ ii & MPI_SCSIDEVPAGE0_NP_PCOMP_EN ? "PCOMP ": ""); + } + + static int mptspi_read_spi_device_pg0(struct scsi_target *starget, + struct _CONFIG_PAGE_SCSI_DEVICE_0 *pass_pg0) + { + struct Scsi_Host *shost = dev_to_shost(&starget->dev); +- struct _MPT_SCSI_HOST *hd = shost_priv(shost); ++ struct _MPT_SCSI_HOST *hd = shost_private(shost); + struct _MPT_ADAPTER *ioc = hd->ioc; + struct _CONFIG_PAGE_SCSI_DEVICE_0 *spi_dev_pg0; + dma_addr_t spi_dev_pg0_dma; +@@ -677,7 +677,7 @@ + + static int mptspi_slave_alloc(struct scsi_device *sdev) + { +- MPT_SCSI_HOST *hd = shost_priv(sdev->host); ++ MPT_SCSI_HOST *hd = shost_private(sdev->host); + VirtTarget *vtarget; + VirtDevice *vdevice; + struct scsi_target *starget; +@@ -710,7 +710,7 @@ + + static int mptspi_slave_configure(struct scsi_device *sdev) + { +- struct _MPT_SCSI_HOST *hd = shost_priv(sdev->host); ++ struct _MPT_SCSI_HOST *hd = shost_private(sdev->host); + VirtTarget *vtarget = scsi_target(sdev)->hostdata; + int ret; + +@@ -730,7 +730,7 @@ + static int + mptspi_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *)) + { +- struct _MPT_SCSI_HOST *hd = shost_priv(SCpnt->device->host); ++ struct _MPT_SCSI_HOST *hd = shost_private(SCpnt->device->host); + VirtDevice *vdevice = SCpnt->device->hostdata; + MPT_ADAPTER *ioc = hd->ioc; + +@@ -805,7 +805,7 @@ + struct _CONFIG_PAGE_SCSI_DEVICE_1 *pass_pg1) + { + struct Scsi_Host *shost = dev_to_shost(&starget->dev); +- struct _MPT_SCSI_HOST *hd = shost_priv(shost); ++ struct _MPT_SCSI_HOST *hd = shost_private(shost); + struct _MPT_ADAPTER *ioc = hd->ioc; + struct _CONFIG_PAGE_SCSI_DEVICE_1 *pg1; + dma_addr_t pg1_dma; +@@ -823,8 +823,8 @@ + + pg1 = dma_alloc_coherent(&ioc->pcidev->dev, size, &pg1_dma, GFP_KERNEL); + if (pg1 == NULL) { +- starget_printk(KERN_ERR, starget, MYIOC_s_FMT +- "dma_alloc_coherent for parameters failed\n", ioc->name); ++ starget_printk(KERN_ERR, starget, ++ MYIOC_s_FMT "dma_alloc_coherent for parameters failed\n", ioc->name); + return -EINVAL; + } + +@@ -991,7 +991,7 @@ + { + struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1; + struct Scsi_Host *shost = dev_to_shost(&starget->dev); +- struct _MPT_SCSI_HOST *hd = shost_priv(shost); ++ struct _MPT_SCSI_HOST *hd = shost_private(shost); + VirtTarget *vtarget = starget->hostdata; + u32 nego; + MPT_ADAPTER *ioc = hd->ioc; +@@ -1041,10 +1041,16 @@ + }; + + static void ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,19)) + mpt_work_wrapper(struct work_struct *work) + { + struct work_queue_wrapper *wqw = + container_of(work, struct work_queue_wrapper, work); ++#else ++mpt_work_wrapper(void *data) ++{ ++ struct work_queue_wrapper *wqw = (struct work_queue_wrapper *)data; ++#endif + struct _MPT_SCSI_HOST *hd = wqw->hd; + MPT_ADAPTER *ioc = hd->ioc; + struct Scsi_Host *shost = ioc->sh; +@@ -1072,12 +1078,12 @@ + if(vtarget->id != disk) + continue; + +- starget_printk(KERN_INFO, vtarget->starget, MYIOC_s_FMT +- "Integrated RAID requests DV of new device\n", ioc->name); ++ starget_printk(KERN_INFO, vtarget->starget, ++ MYIOC_s_FMT "Integrated RAID requests DV of new device\n", ioc->name); + mptspi_dv_device(hd, sdev); + } +- shost_printk(KERN_INFO, shost, MYIOC_s_FMT +- "Integrated RAID detects new device %d\n", ioc->name, disk); ++ shost_printk(KERN_INFO, shost, ++ MYIOC_s_FMT "Integrated RAID detects new device %d\n", ioc->name, disk); + scsi_scan_target(&ioc->sh->shost_gendev, 1, disk, 0, 1); + } + +@@ -1088,12 +1094,16 @@ + MPT_ADAPTER *ioc = hd->ioc; + + if (!wqw) { +- shost_printk(KERN_ERR, ioc->sh, MYIOC_s_FMT +- "Failed to act on RAID event for physical disk %d\n", ++ shost_printk(KERN_ERR, ioc->sh, ++ MYIOC_s_FMT "Failed to act on RAID event for physical disk %d\n", + ioc->name, disk); + return; + } ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,19)) + INIT_WORK(&wqw->work, mpt_work_wrapper); ++#else ++ INIT_WORK(&wqw->work, mpt_work_wrapper, wqw); ++#endif + wqw->hd = hd; + wqw->disk = disk; + +@@ -1104,7 +1114,7 @@ + mptspi_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply) + { + u8 event = le32_to_cpu(pEvReply->Event) & 0xFF; +- struct _MPT_SCSI_HOST *hd = shost_priv(ioc->sh); ++ struct _MPT_SCSI_HOST *hd = shost_private(ioc->sh); + + if (hd && event == MPI_EVENT_INTEGRATED_RAID) { + int reason +@@ -1184,10 +1194,16 @@ + * renegotiate for a given target + **/ + static void ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,19)) + mptspi_dv_renegotiate_work(struct work_struct *work) + { + struct work_queue_wrapper *wqw = + container_of(work, struct work_queue_wrapper, work); ++#else ++mptspi_dv_renegotiate_work(void *data) ++{ ++ struct work_queue_wrapper *wqw = (struct work_queue_wrapper *)data; ++#endif + struct _MPT_SCSI_HOST *hd = wqw->hd; + struct scsi_device *sdev; + struct scsi_target *starget; +@@ -1222,7 +1238,11 @@ + if (!wqw) + return; + ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,19)) + INIT_WORK(&wqw->work, mptspi_dv_renegotiate_work); ++#else ++ INIT_WORK(&wqw->work, mptspi_dv_renegotiate_work, wqw); ++#endif + wqw->hd = hd; + + schedule_work(&wqw->work); +@@ -1241,7 +1261,7 @@ + if ((ioc->bus_type != SPI) || (!rc)) + goto out; + +- hd = shost_priv(ioc->sh); ++ hd = shost_private(ioc->sh); + if (!hd->ioc) + goto out; + +@@ -1259,7 +1279,7 @@ + mptspi_resume(struct pci_dev *pdev) + { + MPT_ADAPTER *ioc = pci_get_drvdata(pdev); +- struct _MPT_SCSI_HOST *hd = shost_priv(ioc->sh); ++ struct _MPT_SCSI_HOST *hd = shost_private(ioc->sh); + int rc; + + rc = mptscsih_resume(pdev); +@@ -1411,7 +1431,7 @@ + sh->sg_tablesize = numSGE; + } + +- hd = shost_priv(sh); ++ hd = shost_private(sh); + hd->ioc = ioc; + + spin_unlock_irqrestore(&ioc->FreeQlock, flags); +diff -r 60d73800068f drivers/message/fusion/rejected_ioctls/diag_buffer.c +--- a/drivers/message/fusion/rejected_ioctls/diag_buffer.c Tue Jun 30 11:26:39 2009 +0100 ++++ b/drivers/message/fusion/rejected_ioctls/diag_buffer.c Wed Jul 01 09:46:25 2009 +0100 +@@ -4,20 +4,19 @@ + * Outputs: None. + * Return: 0 if successful + * -EFAULT if data unavailable +- * -EBUSY if previous command timout and IOC reset is not +- * complete. ++ * -EBUSY if previous command timout and IOC reset is not complete. + * -ENODEV if no such device/adapter + * -ETIME if timer expires + * -ENOMEM if memory allocation error + */ + static int +-mptctl_register_diag_buffer(unsigned long arg) ++mptctl_register_diag_buffer (unsigned long arg) + { + mpt_diag_register_t __user *uarg = (void __user *) arg; + mpt_diag_register_t karg; + MPT_ADAPTER *ioc; + int iocnum, rc, ii; +- void *request_data; ++ void * request_data; + dma_addr_t request_data_dma; + u32 request_data_sz; + MPT_FRAME_HDR *mf; +@@ -31,39 +30,37 @@ + if (copy_from_user(&karg, uarg, sizeof(mpt_diag_register_t))) { + printk(KERN_ERR "%s@%d::%s - " + "Unable to read in mpt_diag_register_t struct @ %p\n", +- __FILE__, __LINE__, __func__, uarg); ++ __FILE__, __LINE__, __FUNCTION__, uarg); + return -EFAULT; + } + +- iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc); +- +- if ((iocnum < 0) || (ioc == NULL)) { ++ if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) || ++ (ioc == NULL)) { + printk(KERN_ERR "%s::%s() @%d - ioc%d not found!\n", +- __FILE__, __func__, __LINE__, iocnum); ++ __FILE__, __FUNCTION__, __LINE__, iocnum); + return -ENODEV; + } + + dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "%s enter.\n", ioc->name, +- __func__)); ++ __FUNCTION__)); + buffer_type = karg.data.BufferType; + if (!(ioc->facts.IOCCapabilities & MPT_DIAG_CAPABILITY(buffer_type))) { + printk(MYIOC_s_DEBUG_FMT "%s: doesn't have Capability for " +- "buffer_type=%x\n", ioc->name, __func__, buffer_type); ++ "buffer_type=%x\n", ioc->name, __FUNCTION__, buffer_type); + return -ENODEV; + } + + if (ioc->DiagBuffer_Status[buffer_type] & + MPT_DIAG_BUFFER_IS_REGISTERED) { + printk(MYIOC_s_DEBUG_FMT "%s: already has a Registered " +- "buffer for buffer_type=%x\n", ioc->name, __func__, ++ "buffer for buffer_type=%x\n", ioc->name, __FUNCTION__, + buffer_type); + return -EFAULT; + } + + /* Get a free request frame and save the message context. + */ +- mf = mpt_get_msg_frame(mptctl_id, ioc); +- if (mf == NULL) ++ if ((mf = mpt_get_msg_frame(mptctl_id, ioc)) == NULL) + return -EAGAIN; + + request_data = ioc->DiagBuffer[buffer_type]; +@@ -88,9 +85,9 @@ + if (request_data == NULL) { + printk(MYIOC_s_DEBUG_FMT "%s: pci_alloc_consistent" + " FAILED, (request_sz=%d)\n", ioc->name, +- __func__, request_data_sz); ++ __FUNCTION__, request_data_sz); + mpt_free_msg_frame(ioc, mf); +- return -EAGAIN; ++ return -EAGAIN; + } + ioc->DiagBuffer[buffer_type] = request_data; + ioc->DiagBuffer_sz[buffer_type] = request_data_sz; +@@ -98,7 +95,7 @@ + } + + ioc->DiagBuffer_Status[buffer_type] = 0; +- diag_buffer_post_request = (DiagBufferPostRequest_t *)mf; ++ diag_buffer_post_request = (DiagBufferPostRequest_t *)mf; + diag_buffer_post_request->Function = MPI_FUNCTION_DIAG_BUFFER_POST; + diag_buffer_post_request->ChainOffset = 0; + diag_buffer_post_request->BufferType = karg.data.BufferType; +@@ -140,7 +137,7 @@ + if (!(ioc->ioctl_cmds.status & MPT_MGMT_STATUS_COMMAND_GOOD)) { + rc = -ETIME; + printk(MYIOC_s_WARN_FMT "%s: failed\n", ioc->name, +- __func__); ++ __FUNCTION__); + if (ioc->ioctl_cmds.status & MPT_MGMT_STATUS_DID_IOCRESET) { + mpt_free_msg_frame(ioc, mf); + goto out; +@@ -153,7 +150,7 @@ + /* process the completed Reply Message Frame */ + if ((ioc->ioctl_cmds.status & MPT_MGMT_STATUS_RF_VALID) == 0) { + dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "%s: status=%x\n", +- ioc->name, __func__, ioc->ioctl_cmds.status)); ++ ioc->name, __FUNCTION__, ioc->ioctl_cmds.status)); + rc = -EFAULT; + goto out; + } +@@ -163,13 +160,12 @@ + MPI_IOCSTATUS_SUCCESS) { + if (diag_buffer_post_reply->MsgLength > 5) + ioc->DataSize[buffer_type] = +- le32_to_cpu +- (diag_buffer_post_reply->TransferLength); ++ le32_to_cpu(diag_buffer_post_reply->TransferLength); + ioc->DiagBuffer_Status[buffer_type] |= + MPT_DIAG_BUFFER_IS_REGISTERED; + } else { + dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "%s: IOCStatus=%x " +- "IOCLogInfo=%x\n", ioc->name, __func__, ++ "IOCLogInfo=%x\n", ioc->name, __FUNCTION__, + diag_buffer_post_reply->IOCStatus, + diag_buffer_post_reply->IOCLogInfo)); + rc = -EFAULT; +@@ -191,19 +187,18 @@ + * Outputs: None. + * Return: 0 if successful + * -EFAULT if data unavailable +- * -EBUSY if previous command timout and IOC reset is +- * not complete. ++ * -EBUSY if previous command timout and IOC reset is not complete. + * -ENODEV if no such device/adapter + * -ETIME if timer expires + * -ENOMEM if memory allocation error + */ + static int +-mptctl_release_diag_buffer(unsigned long arg) ++mptctl_release_diag_buffer (unsigned long arg) + { + mpt_diag_release_t __user *uarg = (void __user *) arg; + mpt_diag_release_t karg; + MPT_ADAPTER *ioc; +- void *request_data; ++ void * request_data; + int iocnum, rc; + MPT_FRAME_HDR *mf; + DiagReleaseRequest_t *diag_release; +@@ -215,42 +210,42 @@ + if (copy_from_user(&karg, uarg, sizeof(mpt_diag_release_t))) { + printk(KERN_ERR "%s@%d::%s - " + "Unable to read in mpt_diag_release_t struct @ %p\n", +- __FILE__, __LINE__, __func__, uarg); ++ __FILE__, __LINE__, __FUNCTION__, uarg); + return -EFAULT; + } + +- iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc); +- if ((iocnum < 0) || (ioc == NULL)) { ++ if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) || ++ (ioc == NULL)) { + printk(KERN_ERR "%s::%s() @%d - ioc%d not found!\n", +- __FILE__, __func__, __LINE__, iocnum); ++ __FILE__, __FUNCTION__, __LINE__, iocnum); + return -ENODEV; + } + + dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "%s enter.\n", ioc->name, +- __func__)); ++ __FUNCTION__)); + buffer_type = karg.data.UniqueId & 0x000000ff; + if (!(ioc->facts.IOCCapabilities & MPT_DIAG_CAPABILITY(buffer_type))) { + printk(MYIOC_s_DEBUG_FMT "%s: doesn't have Capability for " +- "buffer_type=%x\n", ioc->name, __func__, buffer_type); ++ "buffer_type=%x\n", ioc->name, __FUNCTION__, buffer_type); + return -ENODEV; + } + + if ((ioc->DiagBuffer_Status[buffer_type] & +- MPT_DIAG_BUFFER_IS_REGISTERED) == 0) { ++ MPT_DIAG_BUFFER_IS_REGISTERED) == 0 ) { + printk(MYIOC_s_DEBUG_FMT "%s: buffer_type=%x is not " +- "registered\n", ioc->name, __func__, buffer_type); ++ "registered\n", ioc->name, __FUNCTION__, buffer_type); + return -EFAULT; + } + + if (karg.data.UniqueId != ioc->UniqueId[buffer_type]) { + printk(MYIOC_s_DEBUG_FMT "%s: unique_id=%x is not registered\n", +- ioc->name, __func__, karg.data.UniqueId); ++ ioc->name, __FUNCTION__, karg.data.UniqueId); + return -EFAULT; + } + + if (ioc->DiagBuffer_Status[buffer_type] & MPT_DIAG_BUFFER_IS_RELEASED) { + dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "%s: buffer_type=%x " +- "is already released\n", ioc->name, __func__, ++ "is already released\n", ioc->name, __FUNCTION__, + buffer_type)); + return rc; + } +@@ -259,14 +254,13 @@ + + if (request_data == NULL) { + printk(MYIOC_s_DEBUG_FMT "%s: doesn't have buffer for " +- "buffer_type=%x\n", ioc->name, __func__, buffer_type); ++ "buffer_type=%x\n", ioc->name, __FUNCTION__, buffer_type); + return -ENODEV; + } + + /* Get a free request frame and save the message context. + */ +- mf = mpt_get_msg_frame(mptctl_id, ioc); +- if (mf == NULL) ++ if ((mf = mpt_get_msg_frame(mptctl_id, ioc)) == NULL) + return -EAGAIN; + + diag_release = (DiagReleaseRequest_t *)mf; +@@ -287,7 +281,7 @@ + if (!(ioc->ioctl_cmds.status & MPT_MGMT_STATUS_COMMAND_GOOD)) { + rc = -ETIME; + printk(MYIOC_s_WARN_FMT "%s: failed\n", ioc->name, +- __func__); ++ __FUNCTION__); + if (ioc->ioctl_cmds.status & MPT_MGMT_STATUS_DID_IOCRESET) { + mpt_free_msg_frame(ioc, mf); + goto out; +@@ -300,7 +294,7 @@ + /* process the completed Reply Message Frame */ + if ((ioc->ioctl_cmds.status & MPT_MGMT_STATUS_RF_VALID) == 0) { + dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "%s: status=%x\n", +- ioc->name, __func__, ioc->ioctl_cmds.status)); ++ ioc->name, __FUNCTION__, ioc->ioctl_cmds.status)); + rc = -EFAULT; + goto out; + } +@@ -310,7 +304,7 @@ + MPI_IOCSTATUS_SUCCESS) { + dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "%s: IOCStatus=%x " + "IOCLogInfo=%x\n", +- ioc->name, __func__, diag_release_reply->IOCStatus, ++ ioc->name, __FUNCTION__, diag_release_reply->IOCStatus, + diag_release_reply->IOCLogInfo)); + rc = -EFAULT; + } else +@@ -330,20 +324,19 @@ + * Outputs: None. + * Return: 0 if successful + * -EFAULT if data unavailable +- * -EBUSY if previous command timout and IOC reset is +- * not complete. ++ * -EBUSY if previous command timout and IOC reset is not complete. + * -ENODEV if no such device/adapter + * -ETIME if timer expires + * -ENOMEM if memory allocation error + */ + static int +-mptctl_unregister_diag_buffer(unsigned long arg) ++mptctl_unregister_diag_buffer (unsigned long arg) + { + mpt_diag_unregister_t __user *uarg = (void __user *) arg; + mpt_diag_unregister_t karg; + MPT_ADAPTER *ioc; + int iocnum; +- void *request_data; ++ void * request_data; + dma_addr_t request_data_dma; + u32 request_data_sz; + u8 buffer_type; +@@ -351,48 +344,49 @@ + if (copy_from_user(&karg, uarg, sizeof(mpt_diag_unregister_t))) { + printk(KERN_ERR "%s@%d::%s - " + "Unable to read in mpt_diag_unregister_t struct @ %p\n", +- __FILE__, __LINE__, __func__, uarg); ++ __FILE__, __LINE__, __FUNCTION__, uarg); + return -EFAULT; + } +- iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc); +- if ((iocnum < 0) || (ioc == NULL)) { ++ ++ if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) || ++ (ioc == NULL)) { + printk(KERN_ERR "%s::%s() @%d - ioc%d not found!\n", +- __FILE__, __func__, __LINE__, iocnum); ++ __FILE__, __FUNCTION__, __LINE__, iocnum); + return -ENODEV; + } + + dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "%s enter.\n", ioc->name, +- __func__)); ++ __FUNCTION__)); + buffer_type = karg.data.UniqueId & 0x000000ff; + if (!(ioc->facts.IOCCapabilities & MPT_DIAG_CAPABILITY(buffer_type))) { + printk(MYIOC_s_DEBUG_FMT "%s: doesn't have Capability for " +- "buffer_type=%x\n", ioc->name, __func__, buffer_type); ++ "buffer_type=%x\n", ioc->name, __FUNCTION__, buffer_type); + return -ENODEV; + } + + if ((ioc->DiagBuffer_Status[buffer_type] & + MPT_DIAG_BUFFER_IS_REGISTERED) == 0) { + printk(MYIOC_s_DEBUG_FMT "%s: buffer_type=%x is not " +- "registered\n", ioc->name, __func__, buffer_type); ++ "registered\n", ioc->name, __FUNCTION__, buffer_type); + return -EFAULT; + } + if ((ioc->DiagBuffer_Status[buffer_type] & + MPT_DIAG_BUFFER_IS_RELEASED) == 0) { + printk(MYIOC_s_DEBUG_FMT "%s: buffer_type=%x has not been " +- "released\n", ioc->name, __func__, buffer_type); ++ "released\n", ioc->name, __FUNCTION__, buffer_type); + return -EFAULT; + } + + if (karg.data.UniqueId != ioc->UniqueId[buffer_type]) { + printk(MYIOC_s_DEBUG_FMT "%s: unique_id=%x is not registered\n", +- ioc->name, __func__, karg.data.UniqueId); ++ ioc->name, __FUNCTION__, karg.data.UniqueId); + return -EFAULT; + } + + request_data = ioc->DiagBuffer[buffer_type]; + if (!request_data) { + printk(MYIOC_s_DEBUG_FMT "%s: doesn't have buffer for " +- "buffer_type=%x\n", ioc->name, __func__, buffer_type); ++ "buffer_type=%x\n", ioc->name, __FUNCTION__, buffer_type); + return -ENODEV; + } + +@@ -411,19 +405,18 @@ + * Outputs: None. + * Return: 0 if successful + * -EFAULT if data unavailable +- * -EBUSY if previous command timout and IOC reset +- * is not complete. ++ * -EBUSY if previous command timout and IOC reset is not complete. + * -ENODEV if no such device/adapter + * -ETIME if timer expires + * -ENOMEM if memory allocation error + */ + static int +-mptctl_query_diag_buffer(unsigned long arg) ++mptctl_query_diag_buffer (unsigned long arg) + { + mpt_diag_query_t __user *uarg = (void __user *)arg; + mpt_diag_query_t karg; + MPT_ADAPTER *ioc; +- void *request_data; ++ void * request_data; + int iocnum, ii, rc; + u8 buffer_type; + +@@ -431,38 +424,38 @@ + if (copy_from_user(&karg, uarg, sizeof(mpt_diag_query_t))) { + printk(KERN_ERR "%s@%d::%s - " + "Unable to read in mpt_diag_query_t struct @ %p\n", +- __FILE__, __LINE__, __func__, uarg); ++ __FILE__, __LINE__, __FUNCTION__, uarg); + return -EFAULT; + } + + karg.data.Flags = 0; +- iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc); +- if ((iocnum < 0) || (ioc == NULL)) { ++ if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) || ++ (ioc == NULL)) { + printk(KERN_ERR "%s::%s() @%d - ioc%d not found!\n", +- __FILE__, __func__, __LINE__, iocnum); ++ __FILE__, __FUNCTION__, __LINE__, iocnum); + goto out; + } + + dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "%s enter.\n", ioc->name, +- __func__)); ++ __FUNCTION__)); + buffer_type = karg.data.BufferType; + if (!(ioc->facts.IOCCapabilities & MPT_DIAG_CAPABILITY(buffer_type))) { + printk(MYIOC_s_DEBUG_FMT "%s: doesn't have Capability for " +- "buffer_type=%x\n", ioc->name, __func__, buffer_type); ++ "buffer_type=%x\n", ioc->name, __FUNCTION__, buffer_type); + goto out; + } + + if ((ioc->DiagBuffer_Status[buffer_type] & +- MPT_DIAG_BUFFER_IS_REGISTERED) == 0) { ++ MPT_DIAG_BUFFER_IS_REGISTERED) == 0) { + printk(MYIOC_s_DEBUG_FMT "%s: buffer_type=%x is not " +- "registered\n", ioc->name, __func__, buffer_type); ++ "registered\n", ioc->name, __FUNCTION__, buffer_type); + goto out; + } + + if (karg.data.UniqueId & 0xffffff00) { + if (karg.data.UniqueId != ioc->UniqueId[buffer_type]) { + printk(MYIOC_s_DEBUG_FMT "%s: unique_id=%x is not " +- "registered\n", ioc->name, __func__, ++ "registered\n", ioc->name, __FUNCTION__, + karg.data.UniqueId); + goto out; + } +@@ -471,10 +464,10 @@ + request_data = ioc->DiagBuffer[buffer_type]; + if (!request_data) { + printk(MYIOC_s_DEBUG_FMT "%s: doesn't have buffer for " +- "buffer_type=%x\n", ioc->name, __func__, buffer_type); ++ "buffer_type=%x\n", ioc->name, __FUNCTION__, buffer_type); + goto out; + } +- ++ + rc = 0; + if (buffer_type == MPI_DIAG_BUF_TYPE_EXTENDED) { + if (karg.data.ExtendedType != ioc->ExtendedType[buffer_type]) +@@ -497,7 +490,7 @@ + out: + if (copy_to_user(uarg, &karg, sizeof(mpt_diag_query_t))) { + printk(MYIOC_s_ERR_FMT "%s Unable to write mpt_diag_query_t " +- "data @ %p\n", ioc->name, __func__, uarg); ++ "data @ %p\n", ioc->name, __FUNCTION__, uarg); + return -EFAULT; + } + return rc; +@@ -509,14 +502,13 @@ + * Outputs: None. + * Return: 0 if successful + * -EFAULT if data unavailable +- * -EBUSY if previous command timout and IOC reset +- * is not complete. ++ * -EBUSY if previous command timout and IOC reset is not complete. + * -ENODEV if no such device/adapter + * -ETIME if timer expires + * -ENOMEM if memory allocation error + */ + static int +-mptctl_read_diag_buffer(unsigned long arg) ++mptctl_read_diag_buffer (unsigned long arg) + { + mpt_diag_read_buffer_t __user *uarg = (void __user *) arg; + mpt_diag_read_buffer_t karg; +@@ -535,49 +527,50 @@ + if (copy_from_user(&karg, uarg, sizeof(mpt_diag_read_buffer_t))) { + printk(KERN_ERR "%s@%d::%s - " + "Unable to read in mpt_diag_read_buffer_t struct @ %p\n", +- __FILE__, __LINE__, __func__, uarg); ++ __FILE__, __LINE__, __FUNCTION__, uarg); + return -EFAULT; + } +- iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc); +- if ((iocnum < 0) || (ioc == NULL)) { ++ ++ if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) || ++ (ioc == NULL)) { + printk(KERN_ERR "%s::%s() @%d - ioc%d not found!\n", +- __FILE__, __func__, __LINE__, iocnum); ++ __FILE__, __FUNCTION__, __LINE__, iocnum); + return -ENODEV; + } + + dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "%s enter.\n", ioc->name, +- __func__)); ++ __FUNCTION__)); + buffer_type = karg.data.UniqueId & 0x000000ff; + if (!(ioc->facts.IOCCapabilities & MPT_DIAG_CAPABILITY(buffer_type))) { + printk(MYIOC_s_DEBUG_FMT "%s: doesn't have Capability " +- "for buffer_type=%x\n", ioc->name, __func__, ++ "for buffer_type=%x\n", ioc->name, __FUNCTION__, + buffer_type); + return -EFAULT; + } + + if (karg.data.UniqueId != ioc->UniqueId[buffer_type]) { + printk(MYIOC_s_DEBUG_FMT "%s: unique_id=%x is not registered\n", +- ioc->name, __func__, karg.data.UniqueId); ++ ioc->name, __FUNCTION__, karg.data.UniqueId); + return -EFAULT; + } + + request_data = ioc->DiagBuffer[buffer_type]; + if (!request_data) { + printk(MYIOC_s_DEBUG_FMT "%s: doesn't have buffer for " +- "buffer_type=%x\n", ioc->name, __func__, buffer_type); ++ "buffer_type=%x\n", ioc->name, __FUNCTION__, buffer_type); + return -EFAULT; + } + + diagData = (void *)(request_data + karg.data.StartingOffset); + dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "%s: diagData=%p " +- "request_data=%p StartingOffset=%x\n", ioc->name, __func__, ++ "request_data=%p StartingOffset=%x\n", ioc->name, __FUNCTION__, + diagData, request_data, karg.data.StartingOffset)); + + if (copy_to_user((void __user *)&uarg->data.DiagnosticData[0], + diagData, karg.data.BytesToRead)) { + printk(MYIOC_s_ERR_FMT "%s: Unable to write " + "mpt_diag_read_buffer_t data @ %p\n", ioc->name, +- __func__, diagData); ++ __FUNCTION__, diagData); + return -EFAULT; + } + +@@ -585,18 +578,17 @@ + goto out; + + dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "%s: Reregister " +- "buffer_type=%x\n", ioc->name, __func__, buffer_type)); ++ "buffer_type=%x\n", ioc->name, __FUNCTION__, buffer_type)); + if ((ioc->DiagBuffer_Status[buffer_type] & +- MPT_DIAG_BUFFER_IS_RELEASED) == 0) { ++ MPT_DIAG_BUFFER_IS_RELEASED) == 0) { + dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "%s: buffer_type=%x " +- "is still registered\n", ioc->name, __func__, ++ "is still registered\n", ioc->name, __FUNCTION__, + buffer_type)); + return rc; + } + /* Get a free request frame and save the message context. + */ +- mf = mpt_get_msg_frame(mptctl_id, ioc); +- if (mf == NULL) ++ if ((mf = mpt_get_msg_frame(mptctl_id, ioc)) == NULL) + return -EAGAIN; + + diag_buffer_post_request = (DiagBufferPostRequest_t *)mf; +@@ -610,7 +602,7 @@ + diag_buffer_post_request->Reserved2 = 0; + diag_buffer_post_request->Reserved3 = 0; + diag_buffer_post_request->BufferAddress.High = 0; +- if (buffer_type == MPI_DIAG_BUF_TYPE_EXTENDED) ++ if ( buffer_type == MPI_DIAG_BUF_TYPE_EXTENDED ) + diag_buffer_post_request->ExtendedType = + cpu_to_le32(ioc->ExtendedType[buffer_type]); + diag_buffer_post_request->BufferLength = +@@ -635,7 +627,7 @@ + if (!(ioc->ioctl_cmds.status & MPT_MGMT_STATUS_COMMAND_GOOD)) { + rc = -ETIME; + printk(MYIOC_s_WARN_FMT "%s: failed\n", ioc->name, +- __func__); ++ __FUNCTION__); + if (ioc->ioctl_cmds.status & MPT_MGMT_STATUS_DID_IOCRESET) { + mpt_free_msg_frame(ioc, mf); + goto out; +@@ -648,7 +640,7 @@ + /* process the completed Reply Message Frame */ + if ((ioc->ioctl_cmds.status & MPT_MGMT_STATUS_RF_VALID) == 0) { + dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "%s: status=%x\n", +- ioc->name, __func__, ioc->ioctl_cmds.status)); ++ ioc->name, __FUNCTION__, ioc->ioctl_cmds.status)); + rc = -EFAULT; + } + +@@ -662,7 +654,7 @@ + MPT_DIAG_BUFFER_IS_REGISTERED; + } else { + dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "%s: IOCStatus=%x " +- "IOCLogInfo=%x\n", ioc->name, __func__, ++ "IOCLogInfo=%x\n", ioc->name, __FUNCTION__, + diag_buffer_post_reply->IOCStatus, + diag_buffer_post_reply->IOCLogInfo)); + rc = -EFAULT; +diff -r 60d73800068f drivers/message/fusion/rejected_ioctls/diag_buffer.h +--- a/drivers/message/fusion/rejected_ioctls/diag_buffer.h Tue Jun 30 11:26:39 2009 +0100 ++++ b/drivers/message/fusion/rejected_ioctls/diag_buffer.h Wed Jul 01 09:46:25 2009 +0100 +@@ -1,13 +1,8 @@ +-#define MPTDIAGREGISTER \ +- _IOWR(MPT_MAGIC_NUMBER, 26, mpt_diag_register_t) +-#define MPTDIAGRELEASE \ +- _IOWR(MPT_MAGIC_NUMBER, 27, mpt_diag_release_t) +-#define MPTDIAGUNREGISTER \ +- _IOWR(MPT_MAGIC_NUMBER, 28, mpt_diag_unregister_t) +-#define MPTDIAGQUERY \ +- _IOWR(MPT_MAGIC_NUMBER, 29, mpt_diag_query_t) +-#define MPTDIAGREADBUFFER \ +- _IOWR(MPT_MAGIC_NUMBER, 30, mpt_diag_read_buffer_t) ++#define MPTDIAGREGISTER _IOWR(MPT_MAGIC_NUMBER,26,mpt_diag_register_t) ++#define MPTDIAGRELEASE _IOWR(MPT_MAGIC_NUMBER,27,mpt_diag_release_t) ++#define MPTDIAGUNREGISTER _IOWR(MPT_MAGIC_NUMBER,28,mpt_diag_unregister_t) ++#define MPTDIAGQUERY _IOWR(MPT_MAGIC_NUMBER,29,mpt_diag_query_t) ++#define MPTDIAGREADBUFFER _IOWR(MPT_MAGIC_NUMBER,30,mpt_diag_read_buffer_t) + + #define MPI_FW_DIAG_IOCTL (0x80646961) + #define MPI_FW_DIAG_TYPE_REGISTER (0x00000001) +@@ -30,8 +25,7 @@ + #define MPI_FW_DIAG_ERROR_NO_BUFFER (0x00000013) + #define MPI_FW_DIAG_ERROR_ALREADY_RELEASED (0x00000014) + +-#define MPT_DIAG_CAPABILITY(bufftype) \ +- (MPI_IOCFACTS_CAPABILITY_DIAG_TRACE_BUFFER << bufftype) ++#define MPT_DIAG_CAPABILITY(bufftype) (MPI_IOCFACTS_CAPABILITY_DIAG_TRACE_BUFFER << bufftype) + + #define MPT_DIAG_BUFFER_IS_REGISTERED 1 + #define MPT_DIAG_BUFFER_IS_RELEASED 2 diff --git a/master/netback-fix-receive-checksum-setup.patch b/master/netback-fix-receive-checksum-setup.patch new file mode 100644 index 0000000..7a5a724 --- /dev/null +++ b/master/netback-fix-receive-checksum-setup.patch @@ -0,0 +1,12 @@ +diff -r e033759fd63c drivers/xen/netback/netback.c +--- a/drivers/xen/netback/netback.c Wed Jun 24 15:51:46 2009 +0100 ++++ b/drivers/xen/netback/netback.c Wed Jun 24 17:09:31 2009 +0100 +@@ -1597,7 +1597,7 @@ + * can infer it from csum_blank so test both flags. + */ + if (txp->flags & (NETTXF_data_validated|NETTXF_csum_blank)) { +- skb->ip_summed = CHECKSUM_UNNECESSARY; ++ skb->ip_summed = CHECKSUM_PARTIAL; + skb->proto_data_valid = 1; + } else { + skb->ip_summed = CHECKSUM_NONE; diff --git a/master/netback-watch-csum-offload b/master/netback-watch-csum-offload index 242a0b2..1c63647 100644 --- a/master/netback-watch-csum-offload +++ b/master/netback-watch-csum-offload @@ -1,6 +1,6 @@ -diff -r 84ceaba74cdd drivers/xen/netback/common.h ---- a/drivers/xen/netback/common.h Tue Feb 10 12:30:40 2009 +0000 -+++ b/drivers/xen/netback/common.h Tue Feb 10 14:58:55 2009 +0000 +diff -r 279f194abd2c drivers/xen/netback/common.h +--- a/drivers/xen/netback/common.h Wed Jun 17 10:52:58 2009 +0100 ++++ b/drivers/xen/netback/common.h Wed Jun 17 10:53:38 2009 +0100 @@ -55,6 +55,8 @@ #define WPRINTK(fmt, args...) \ printk(KERN_WARNING "xen_net: " fmt, ##args) @@ -30,16 +30,16 @@ diff -r 84ceaba74cdd drivers/xen/netback/common.h void *netback_accel_priv; @@ -206,6 +212,8 @@ struct net_device_stats *netif_be_get_stats(struct net_device *dev); - irqreturn_t netif_be_int(int irq, void *dev_id, struct pt_regs *regs); + irqreturn_t netif_be_int(int irq, void *dev_id); +void netif_set_tx_csum(struct backend_info *, u32); + static inline int netbk_can_queue(struct net_device *dev) { netif_t *netif = netdev_priv(dev); -diff -r 84ceaba74cdd drivers/xen/netback/interface.c ---- a/drivers/xen/netback/interface.c Tue Feb 10 12:30:40 2009 +0000 -+++ b/drivers/xen/netback/interface.c Tue Feb 10 14:58:55 2009 +0000 +diff -r 279f194abd2c drivers/xen/netback/interface.c +--- a/drivers/xen/netback/interface.c Wed Jun 17 10:52:58 2009 +0100 ++++ b/drivers/xen/netback/interface.c Wed Jun 17 10:53:38 2009 +0100 @@ -116,6 +116,13 @@ return ethtool_op_set_tso(dev, data); } @@ -63,9 +63,9 @@ diff -r 84ceaba74cdd drivers/xen/netback/interface.c .get_sg = ethtool_op_get_sg, .set_sg = netbk_set_sg, .get_tso = ethtool_op_get_tso, -diff -r 84ceaba74cdd drivers/xen/netback/xenbus.c ---- a/drivers/xen/netback/xenbus.c Tue Feb 10 12:30:40 2009 +0000 -+++ b/drivers/xen/netback/xenbus.c Tue Feb 10 14:58:55 2009 +0000 +diff -r 279f194abd2c drivers/xen/netback/xenbus.c +--- a/drivers/xen/netback/xenbus.c Wed Jun 17 10:52:58 2009 +0100 ++++ b/drivers/xen/netback/xenbus.c Wed Jun 17 10:53:38 2009 +0100 @@ -32,6 +32,8 @@ static int connect_rings(struct backend_info *); static void connect(struct backend_info *); @@ -92,15 +92,15 @@ diff -r 84ceaba74cdd drivers/xen/netback/xenbus.c sg = 1; if (netbk_copy_skb_mode == NETBK_ALWAYS_COPY_SKB) -@@ -220,6 +225,7 @@ +@@ -214,6 +219,7 @@ xenbus_dev_fatal(dev, err, "creating interface"); return; } + be->netif->be = be; - SET_NETDEV_DEV(be->netif->dev, &dev->dev); kobject_uevent(&dev->dev.kobj, KOBJ_ONLINE); -@@ -231,6 +237,7 @@ + } +@@ -224,6 +230,7 @@ struct backend_info *be = dev->dev.driver_data; if (be->netif) { @@ -108,7 +108,7 @@ diff -r 84ceaba74cdd drivers/xen/netback/xenbus.c netif_disconnect(be->netif); be->netif = NULL; } -@@ -375,6 +382,66 @@ +@@ -368,6 +375,66 @@ netif_wake_queue(be->netif->dev); } @@ -175,7 +175,7 @@ diff -r 84ceaba74cdd drivers/xen/netback/xenbus.c static int connect_rings(struct backend_info *be) { -@@ -449,13 +516,10 @@ +@@ -442,13 +509,10 @@ be->netif->dev->features |= NETIF_F_TSO; } diff --git a/master/open-iscsi-2.0-870.3-2.6.27_compat.patch b/master/open-iscsi-2.0-870.3-2.6.27_compat.patch new file mode 100644 index 0000000..4b70310 --- /dev/null +++ b/master/open-iscsi-2.0-870.3-2.6.27_compat.patch @@ -0,0 +1,60 @@ +diff -r e4d07a2386bd drivers/scsi/libiscsi.c +--- a/drivers/scsi/libiscsi.c Fri Jun 05 14:28:47 2009 +0100 ++++ b/drivers/scsi/libiscsi.c Fri Jun 05 15:55:17 2009 +0100 +@@ -1501,12 +1501,12 @@ + scsi_queue_work(conn->session->host, &conn->xmitwork); + } + +-static enum scsi_eh_timer_return iscsi_eh_cmd_timed_out(struct scsi_cmnd *scmd) ++static enum blk_eh_timer_return iscsi_eh_cmd_timed_out(struct scsi_cmnd *scmd) + { + struct iscsi_cls_session *cls_session; + struct iscsi_session *session; + struct iscsi_conn *conn; +- enum scsi_eh_timer_return rc = EH_NOT_HANDLED; ++ enum blk_eh_timer_return rc = BLK_EH_NOT_HANDLED; + + cls_session = starget_to_session(scsi_target(scmd->device)); + session = cls_session->dd_data; +@@ -1519,14 +1519,14 @@ + * We are probably in the middle of iscsi recovery so let + * that complete and handle the error. + */ +- rc = EH_RESET_TIMER; ++ rc = BLK_EH_RESET_TIMER; + goto done; + } + + conn = session->leadconn; + if (!conn) { + /* In the middle of shuting down */ +- rc = EH_RESET_TIMER; ++ rc = BLK_EH_RESET_TIMER; + goto done; + } + +@@ -1538,20 +1538,20 @@ + */ + if (time_before_eq(conn->last_recv + (conn->recv_timeout * HZ) + + (conn->ping_timeout * HZ), jiffies)) +- rc = EH_RESET_TIMER; ++ rc = BLK_EH_RESET_TIMER; + /* + * if we are about to check the transport then give the command + * more time + */ + if (time_before_eq(conn->last_recv + (conn->recv_timeout * HZ), + jiffies)) +- rc = EH_RESET_TIMER; ++ rc = BLK_EH_RESET_TIMER; + /* if in the middle of checking the transport then give us more time */ + if (conn->ping_task) +- rc = EH_RESET_TIMER; ++ rc = BLK_EH_RESET_TIMER; + done: + spin_unlock(&session->lock); +- debug_scsi("return %s\n", rc == EH_RESET_TIMER ? "timer reset" : "nh"); ++ debug_scsi("return %s\n", rc == BLK_EH_RESET_TIMER ? "timer reset" : "nh"); + return rc; + } + diff --git a/master/open-iscsi-2.0-870.3.patch b/master/open-iscsi-2.0-870.3.patch new file mode 100644 index 0000000..82c02a1 --- /dev/null +++ b/master/open-iscsi-2.0-870.3.patch @@ -0,0 +1,1194 @@ +Apply kernel parts of open-iscsi-2.0.865.13.tar.gz + +diff -r c7d20a90487f drivers/scsi/iscsi_tcp.c +--- a/drivers/scsi/iscsi_tcp.c Thu Jun 04 15:14:02 2009 +0100 ++++ b/drivers/scsi/iscsi_tcp.c Fri Jun 05 14:24:35 2009 +0100 +@@ -40,7 +40,7 @@ + #include + #include + #include +-#include ++#include "scsi_transport_iscsi.h" + + #include "iscsi_tcp.h" + +@@ -97,7 +97,7 @@ + * data is copied to the indicated sg entry, at the given + * offset. + */ +-void ++static inline void + iscsi_tcp_segment_init_sg(struct iscsi_segment *segment, + struct scatterlist *sg, unsigned int offset) + { +@@ -107,7 +107,6 @@ + segment->total_size - segment->total_copied); + segment->data = NULL; + } +-EXPORT_SYMBOL_GPL(iscsi_tcp_segment_init_sg); + + /** + * iscsi_tcp_segment_map - map the current S/G page +@@ -118,7 +117,7 @@ + * because the iscsi passthrough and internal IO paths will never use high + * mem pages. + */ +-void ++static inline void + iscsi_tcp_segment_map(struct iscsi_segment *segment, int recv) + { + struct scatterlist *sg; +@@ -144,9 +143,8 @@ + segment->sg_mapped = kmap_atomic(sg_page(sg), KM_SOFTIRQ0); + segment->data = segment->sg_mapped + sg->offset + segment->sg_offset; + } +-EXPORT_SYMBOL_GPL(iscsi_tcp_segment_map); + +-void ++static inline void + iscsi_tcp_segment_unmap(struct iscsi_segment *segment) + { + debug_tcp("iscsi_tcp_segment_unmap %p\n", segment); +@@ -158,7 +156,6 @@ + segment->data = NULL; + } + } +-EXPORT_SYMBOL_GPL(iscsi_tcp_segment_unmap); + + /* + * Splice the digest buffer into the buffer +@@ -379,9 +376,6 @@ + iscsi_tcp_dgst_verify(struct iscsi_tcp_conn *tcp_conn, + struct iscsi_segment *segment) + { +- if (tcp_conn->iscsi_conn->session->tt->caps & CAP_DIGEST_OFFLOAD) +- return (segment->status & ISCSI_SEGMENT_DGST_ERR) ? 0 : 1; +- + if (!segment->digest_len) + return 1; + +@@ -454,7 +448,7 @@ + * function is called we do not yet know the final size of the header and want + * to delay the digest processing until we know that. + */ +-void ++static void + iscsi_tcp_hdr_recv_prep(struct iscsi_tcp_conn *tcp_conn) + { + debug_tcp("iscsi_tcp_hdr_recv_prep(%p%s)\n", tcp_conn, +@@ -463,7 +457,6 @@ + tcp_conn->in.hdr_buf, sizeof(struct iscsi_hdr), + iscsi_tcp_hdr_recv_done, NULL); + } +-EXPORT_SYMBOL_GPL(iscsi_tcp_hdr_recv_prep); + + /* + * Handle incoming reply to any other type of command +@@ -493,8 +486,7 @@ + struct iscsi_conn *conn = tcp_conn->iscsi_conn; + struct hash_desc *rx_hash = NULL; + +- if (conn->datadgst_en && +- !(conn->session->tt->caps & CAP_DIGEST_OFFLOAD)) ++ if (conn->datadgst_en) + rx_hash = &tcp_conn->rx_hash; + + iscsi_segment_init_linear(&tcp_conn->in.segment, +@@ -505,7 +497,7 @@ + /* + * must be called with session lock + */ +-void ++static void + iscsi_tcp_cleanup_task(struct iscsi_conn *conn, struct iscsi_task *task) + { + struct iscsi_tcp_task *tcp_task = task->dd_data; +@@ -529,25 +521,22 @@ + tcp_task->r2t = NULL; + } + } +-EXPORT_SYMBOL_GPL(iscsi_tcp_cleanup_task); + + /** +- * iscsi_data_rsp - SCSI Data-In Response processing ++ * iscsi_data_in - SCSI Data-In Response processing + * @conn: iscsi connection + * @task: scsi command task + **/ + static int +-iscsi_data_rsp(struct iscsi_conn *conn, struct iscsi_task *task) ++iscsi_data_in(struct iscsi_conn *conn, struct iscsi_task *task) + { + struct iscsi_tcp_conn *tcp_conn = conn->dd_data; + struct iscsi_tcp_task *tcp_task = task->dd_data; + struct iscsi_data_rsp *rhdr = (struct iscsi_data_rsp *)tcp_conn->in.hdr; +- struct iscsi_session *session = conn->session; +- struct scsi_cmnd *sc = task->sc; + int datasn = be32_to_cpu(rhdr->datasn); +- unsigned total_in_length = scsi_in(sc)->length; ++ unsigned total_in_length = scsi_in(task->sc)->length; + +- iscsi_update_cmdsn(session, (struct iscsi_nopin*)rhdr); ++ iscsi_update_cmdsn(conn->session, (struct iscsi_nopin*)rhdr); + if (tcp_conn->in.datalen == 0) + return 0; + +@@ -565,23 +554,6 @@ + __func__, tcp_task->data_offset, + tcp_conn->in.datalen, total_in_length); + return ISCSI_ERR_DATA_OFFSET; +- } +- +- if (rhdr->flags & ISCSI_FLAG_DATA_STATUS) { +- sc->result = (DID_OK << 16) | rhdr->cmd_status; +- conn->exp_statsn = be32_to_cpu(rhdr->statsn) + 1; +- if (rhdr->flags & (ISCSI_FLAG_DATA_UNDERFLOW | +- ISCSI_FLAG_DATA_OVERFLOW)) { +- int res_count = be32_to_cpu(rhdr->residual_count); +- +- if (res_count > 0 && +- (rhdr->flags & ISCSI_FLAG_CMD_OVERFLOW || +- res_count <= total_in_length)) +- scsi_in(sc)->resid = res_count; +- else +- sc->result = (DID_BAD_TARGET << 16) | +- rhdr->cmd_status; +- } + } + + conn->datain_pdus_cnt++; +@@ -746,7 +718,7 @@ + * by data, the receive buffer is set up to copy the incoming data + * to the correct location. + */ +-int ++static int + iscsi_tcp_hdr_dissect(struct iscsi_conn *conn, struct iscsi_hdr *hdr) + { + int rc = 0, opcode, ahslen; +@@ -783,7 +755,7 @@ + if (!task) + rc = ISCSI_ERR_BAD_ITT; + else +- rc = iscsi_data_rsp(conn, task); ++ rc = iscsi_data_in(conn, task); + if (rc) { + spin_unlock(&conn->session->lock); + break; +@@ -802,8 +774,7 @@ + * we move on to the next scatterlist entry and + * update the digest per-entry. + */ +- if (conn->datadgst_en && +- !(conn->session->tt->caps & CAP_DIGEST_OFFLOAD)) ++ if (conn->datadgst_en) + rx_hash = &tcp_conn->rx_hash; + + debug_tcp("iscsi_tcp_begin_data_in(%p, offset=%d, " +@@ -891,7 +862,6 @@ + + return rc; + } +-EXPORT_SYMBOL_GPL(iscsi_tcp_hdr_dissect); + + /** + * iscsi_tcp_hdr_recv_done - process PDU header +@@ -930,8 +900,7 @@ + /* We're done processing the header. See if we're doing + * header digests; if so, set up the recv_digest buffer + * and go back for more. */ +- if (conn->hdrdgst_en && +- !(conn->session->tt->caps & CAP_DIGEST_OFFLOAD)) { ++ if (conn->hdrdgst_en) { + if (segment->digest_len == 0) { + iscsi_tcp_segment_splice_digest(segment, + segment->recv_digest); +@@ -1010,7 +979,7 @@ + + error: + debug_tcp("Error receiving PDU, errno=%d\n", rc); +- iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED); ++ iscsi_conn_failure(conn, rc); + return 0; + } + +@@ -1129,8 +1098,10 @@ + + while (1) { + rc = iscsi_tcp_xmit_segment(tcp_conn, segment); +- if (rc < 0) ++ if (rc < 0) { ++ rc = ISCSI_ERR_XMIT_FAILED; + goto error; ++ } + if (rc == 0) + break; + +@@ -1139,7 +1110,7 @@ + if (segment->total_copied >= segment->total_size) { + if (segment->done != NULL) { + rc = segment->done(tcp_conn, segment); +- if (rc < 0) ++ if (rc != 0) + goto error; + } + } +@@ -1154,8 +1125,8 @@ + /* Transmit error. We could initiate error recovery + * here. */ + debug_tcp("Error sending PDU, errno=%d\n", rc); +- iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED); +- return rc; ++ iscsi_conn_failure(conn, rc); ++ return -EIO; + } + + /** +@@ -1173,11 +1144,10 @@ + static inline int + iscsi_tcp_flush(struct iscsi_conn *conn) + { +- struct iscsi_tcp_conn *tcp_conn = conn->dd_data; + int rc; + + while (iscsi_tcp_xmit_qlen(conn)) { +- rc = tcp_conn->xmit_segment(conn); ++ rc = iscsi_xmit(conn); + if (rc == 0) + return -EAGAIN; + if (rc < 0) +@@ -1218,8 +1188,7 @@ + * sure that both iscsi_tcp_task and mtask have + * sufficient room. + */ +- if (conn->hdrdgst_en && +- !(conn->session->tt->caps & CAP_DIGEST_OFFLOAD)) { ++ if (conn->hdrdgst_en) { + iscsi_tcp_dgst_header(&tcp_conn->tx_hash, hdr, hdrlen, + hdr + hdrlen); + hdrlen += ISCSI_DIGEST_SIZE; +@@ -1257,8 +1226,7 @@ + hdr_spec_len = ntoh24(tcp_conn->out.hdr->dlength); + WARN_ON(iscsi_padded(len) != iscsi_padded(hdr_spec_len)); + +- if (conn->datadgst_en && +- !(conn->session->tt->caps & CAP_DIGEST_OFFLOAD)) ++ if (conn->datadgst_en) + tx_hash = &tcp_conn->tx_hash; + + return iscsi_segment_seek_sg(&tcp_conn->out.data_segment, +@@ -1282,8 +1250,7 @@ + hdr_spec_len = ntoh24(tcp_conn->out.hdr->dlength); + WARN_ON(iscsi_padded(len) != iscsi_padded(hdr_spec_len)); + +- if (conn->datadgst_en && +- !(conn->session->tt->caps & CAP_DIGEST_OFFLOAD)) ++ if (conn->datadgst_en) + tx_hash = &tcp_conn->tx_hash; + + iscsi_segment_init_linear(&tcp_conn->out.data_segment, +@@ -1345,7 +1312,7 @@ + * @task: scsi command task + * @sc: scsi command + **/ +-int ++static int + iscsi_tcp_task_init(struct iscsi_task *task) + { + struct iscsi_tcp_task *tcp_task = task->dd_data; +@@ -1394,7 +1361,6 @@ + task->imm_count = 0; + return 0; + } +-EXPORT_SYMBOL_GPL(iscsi_tcp_task_init); + + /* + * iscsi_tcp_task_xmit - xmit normal PDU task +@@ -1404,7 +1370,7 @@ + * -EAGAIN if there's still data in the queue, or != 0 for any other kind + * of error. + */ +-int ++static int + iscsi_tcp_task_xmit(struct iscsi_task *task) + { + struct iscsi_conn *conn = task->conn; +@@ -1507,7 +1473,6 @@ + iscsi_conn_failure(conn, rc); + return -EIO; + } +-EXPORT_SYMBOL_GPL(iscsi_tcp_task_xmit); + + static struct iscsi_cls_conn * + iscsi_tcp_conn_create(struct iscsi_cls_session *cls_session, uint32_t conn_idx) +@@ -1703,7 +1668,6 @@ + + iscsi_conn_set_callbacks(conn); + tcp_conn->sendpage = tcp_conn->sock->ops->sendpage; +- tcp_conn->xmit_segment = iscsi_xmit; + /* + * set receive state machine into initial state + */ +@@ -1715,7 +1679,7 @@ + return err; + } + +-int ++static int + iscsi_r2tpool_alloc(struct iscsi_session *session) + { + int i; +@@ -1761,9 +1725,8 @@ + } + return -ENOMEM; + } +-EXPORT_SYMBOL_GPL(iscsi_r2tpool_alloc); + +-void ++static void + iscsi_r2tpool_free(struct iscsi_session *session) + { + int i; +@@ -1776,7 +1739,6 @@ + iscsi_pool_free(&tcp_task->r2tpool); + } + } +-EXPORT_SYMBOL_GPL(iscsi_r2tpool_free); + + static int + iscsi_conn_set_param(struct iscsi_cls_conn *cls_conn, enum iscsi_param param, +@@ -1925,7 +1887,6 @@ + struct Scsi_Host *shost = iscsi_session_to_shost(cls_session); + + iscsi_r2tpool_free(cls_session->dd_data); +- iscsi_session_teardown(cls_session); + + iscsi_host_remove(shost); + iscsi_host_free(shost); +diff -r c7d20a90487f drivers/scsi/iscsi_tcp.h +--- a/drivers/scsi/iscsi_tcp.h Thu Jun 04 15:14:02 2009 +0100 ++++ b/drivers/scsi/iscsi_tcp.h Fri Jun 05 14:24:35 2009 +0100 +@@ -22,7 +22,7 @@ + #ifndef ISCSI_TCP_H + #define ISCSI_TCP_H + +-#include ++#include "libiscsi.h" + + struct crypto_hash; + struct socket; +@@ -32,9 +32,7 @@ + typedef int iscsi_segment_done_fn_t(struct iscsi_tcp_conn *, + struct iscsi_segment *); + +-#define ISCSI_SEGMENT_DGST_ERR 0x1 + struct iscsi_segment { +- unsigned int status; + unsigned char *data; + unsigned int size; + unsigned int copied; +@@ -97,8 +95,6 @@ + + int error; + +- /* segment transmit */ +- int (*xmit_segment)(struct iscsi_conn *); + ssize_t (*sendpage)(struct socket *, struct page *, int, size_t, int); + }; + +@@ -134,16 +130,4 @@ + struct iscsi_data_task unsol_dtask; /* Data-Out header buf */ + }; + +-void iscsi_tcp_segment_init_sg(struct iscsi_segment *, struct scatterlist *, +- unsigned int); +-void iscsi_tcp_segment_map(struct iscsi_segment *, int); +-void iscsi_tcp_segment_unmap(struct iscsi_segment *); +-void iscsi_tcp_hdr_recv_prep(struct iscsi_tcp_conn *); +-void iscsi_tcp_cleanup_task(struct iscsi_conn *, struct iscsi_task *); +-int iscsi_tcp_hdr_dissect(struct iscsi_conn *conn, struct iscsi_hdr *); +-int iscsi_tcp_task_init(struct iscsi_task *); +-int iscsi_tcp_task_xmit(struct iscsi_task *); +-int iscsi_r2tpool_alloc(struct iscsi_session *); +-void iscsi_r2tpool_free(struct iscsi_session *); +- + #endif /* ISCSI_H */ +diff -r c7d20a90487f drivers/scsi/libiscsi.c +--- a/drivers/scsi/libiscsi.c Thu Jun 04 15:14:02 2009 +0100 ++++ b/drivers/scsi/libiscsi.c Fri Jun 05 14:24:35 2009 +0100 +@@ -33,10 +33,11 @@ + #include + #include + #include +-#include + #include +-#include +-#include ++#include "iscsi_proto.h" ++#include "scsi_transport_iscsi.h" ++#include "libiscsi.h" ++ + + /* Serial Number Arithmetic, 32 bits, less than, RFC1982 */ + #define SNA32_CHECK 2147483648UL +@@ -218,12 +219,7 @@ + hdr->opcode = ISCSI_OP_SCSI_CMD; + hdr->flags = ISCSI_ATTR_SIMPLE; + int_to_scsilun(sc->device->lun, (struct scsi_lun *)hdr->lun); +- if (session->tt->reserve_itt) { +- rc = session->tt->reserve_itt(task, &hdr->itt); +- if (rc) +- return rc; +- } else +- hdr->itt = build_itt(task->itt, session->age); ++ hdr->itt = build_itt(task->itt, session->age); + hdr->cmdsn = cpu_to_be32(session->cmdsn); + session->cmdsn++; + hdr->exp_statsn = cpu_to_be32(conn->exp_statsn); +@@ -337,9 +333,6 @@ + struct iscsi_session *session = conn->session; + struct scsi_cmnd *sc = task->sc; + +- if (session->tt->release_itt) +- session->tt->release_itt(task, task->hdr->itt); +- + list_del_init(&task->running); + task->state = ISCSI_TASK_COMPLETED; + task->sc = NULL; +@@ -376,12 +369,11 @@ + } + EXPORT_SYMBOL_GPL(__iscsi_get_task); + +-void __iscsi_put_task(struct iscsi_task *task) ++static void __iscsi_put_task(struct iscsi_task *task) + { + if (atomic_dec_and_test(&task->refcount)) + iscsi_complete_command(task); + } +-EXPORT_SYMBOL_GPL(__iscsi_put_task); + + void iscsi_put_task(struct iscsi_task *task) + { +@@ -413,11 +405,6 @@ + conn->session->queued_cmdsn--; + else + conn->session->tt->cleanup_task(conn, task); +- /* +- * Check if cleanup_task dropped the lock and the command completed, +- */ +- if (!task->sc) +- return; + + sc->result = err; + if (!scsi_bidi_cmnd(sc)) +@@ -451,12 +438,7 @@ + */ + nop->cmdsn = cpu_to_be32(session->cmdsn); + if (hdr->itt != RESERVED_ITT) { +- if (session->tt->reserve_itt) { +- int rc = session->tt->reserve_itt(task, &hdr->itt); +- if (rc) +- return rc; +- } else +- hdr->itt = build_itt(task->itt, session->age); ++ hdr->itt = build_itt(task->itt, session->age); + /* + * TODO: We always use immediate, so we never hit this. + * If we start to send tmfs or nops as non-immediate then +@@ -647,6 +629,40 @@ + __iscsi_put_task(task); + } + ++/** ++ * iscsi_data_in_rsp - SCSI Data-In Response processing ++ * @conn: iscsi connection ++ * @hdr: iscsi pdu ++ * @task: scsi command task ++ **/ ++static void ++iscsi_data_in_rsp(struct iscsi_conn *conn, struct iscsi_hdr *hdr, ++ struct iscsi_task *task) ++{ ++ struct iscsi_data_rsp *rhdr = (struct iscsi_data_rsp *)hdr; ++ struct scsi_cmnd *sc = task->sc; ++ ++ if (!(rhdr->flags & ISCSI_FLAG_DATA_STATUS)) ++ return; ++ ++ sc->result = (DID_OK << 16) | rhdr->cmd_status; ++ conn->exp_statsn = be32_to_cpu(rhdr->statsn) + 1; ++ if (rhdr->flags & (ISCSI_FLAG_DATA_UNDERFLOW | ++ ISCSI_FLAG_DATA_OVERFLOW)) { ++ int res_count = be32_to_cpu(rhdr->residual_count); ++ ++ if (res_count > 0 && ++ (rhdr->flags & ISCSI_FLAG_CMD_OVERFLOW || ++ res_count <= scsi_in(sc)->length)) ++ scsi_in(sc)->resid = res_count; ++ else ++ sc->result = (DID_BAD_TARGET << 16) | rhdr->cmd_status; ++ } ++ ++ conn->scsirsp_pdus_cnt++; ++ __iscsi_put_task(task); ++} ++ + static void iscsi_tmf_rsp(struct iscsi_conn *conn, struct iscsi_hdr *hdr) + { + struct iscsi_tm_rsp *tmf = (struct iscsi_tm_rsp *)hdr; +@@ -705,13 +721,7 @@ + + if (ntoh24(reject->dlength) >= sizeof(struct iscsi_hdr)) { + memcpy(&rejected_pdu, data, sizeof(struct iscsi_hdr)); +- if (conn->session->tt->parse_itt) +- conn->session->tt->parse_itt(conn, +- rejected_pdu.itt, +- &itt, +- NULL); +- else +- itt = get_itt(rejected_pdu.itt); ++ itt = get_itt(rejected_pdu.itt); + iscsi_conn_printk(KERN_ERR, conn, + "itt 0x%x had pdu (op 0x%x) rejected " + "due to DataDigest error.\n", itt, +@@ -731,7 +741,7 @@ + * + * The session lock must be held. + */ +-struct iscsi_task *iscsi_itt_to_task(struct iscsi_conn *conn, itt_t itt) ++static struct iscsi_task *iscsi_itt_to_task(struct iscsi_conn *conn, itt_t itt) + { + struct iscsi_session *session = conn->session; + uint32_t i; +@@ -739,16 +749,12 @@ + if (itt == RESERVED_ITT) + return NULL; + +- if (conn->session->tt->parse_itt) +- conn->session->tt->parse_itt(conn, itt, &i, NULL); +- else +- i = get_itt(itt); ++ i = get_itt(itt); + if (i >= session->cmds_max) + return NULL; + + return session->cmds[i]; + } +-EXPORT_SYMBOL_GPL(iscsi_itt_to_task); + + /** + * __iscsi_complete_pdu - complete pdu +@@ -774,13 +780,9 @@ + if (rc) + return rc; + +- if (hdr->itt != RESERVED_ITT) { +- if (conn->session->tt->parse_itt) +- conn->session->tt->parse_itt(conn, hdr->itt, +- &itt, NULL); +- else +- itt = get_itt(hdr->itt); +- } else ++ if (hdr->itt != RESERVED_ITT) ++ itt = get_itt(hdr->itt); ++ else + itt = ~0U; + + debug_scsi("[op 0x%x cid %d itt 0x%x len %d]\n", +@@ -846,12 +848,7 @@ + iscsi_scsi_cmd_rsp(conn, hdr, task, data, datalen); + break; + case ISCSI_OP_SCSI_DATA_IN: +- if (hdr->flags & ISCSI_FLAG_DATA_STATUS) { +- conn->scsirsp_pdus_cnt++; +- iscsi_update_cmdsn(session, +- (struct iscsi_nopin*) hdr); +- __iscsi_put_task(task); +- } ++ iscsi_data_in_rsp(conn, hdr, task); + break; + case ISCSI_OP_LOGOUT_RSP: + iscsi_update_cmdsn(session, (struct iscsi_nopin*)hdr); +@@ -927,25 +924,20 @@ + int iscsi_verify_itt(struct iscsi_conn *conn, itt_t itt) + { + struct iscsi_session *session = conn->session; +- uint32_t i, age; ++ uint32_t i; + + if (itt == RESERVED_ITT) + return 0; + +- if (conn->session->tt->parse_itt) +- conn->session->tt->parse_itt(conn, itt, &i, &age); +- else { +- i = get_itt(itt); +- age = ((__force u32)itt >> ISCSI_AGE_SHIFT) & ISCSI_AGE_MASK; +- } +- +- if (age != session->age) { ++ if (((__force u32)itt & ISCSI_AGE_MASK) != ++ (session->age << ISCSI_AGE_SHIFT)) { + iscsi_conn_printk(KERN_ERR, conn, + "received itt %x expected session age (%x)\n", + (__force u32)itt, session->age); + return ISCSI_ERR_BAD_ITT; + } + ++ i = get_itt(itt); + if (i >= session->cmds_max) { + iscsi_conn_printk(KERN_ERR, conn, + "received invalid itt index %u (max cmds " +@@ -987,38 +979,6 @@ + } + EXPORT_SYMBOL_GPL(iscsi_itt_to_ctask); + +-void iscsi_session_failure(struct iscsi_cls_session *cls_session, +- enum iscsi_err err) +-{ +- struct iscsi_session *session = cls_session->dd_data; +- struct iscsi_conn *conn; +- struct device *dev; +- unsigned long flags; +- +- spin_lock_irqsave(&session->lock, flags); +- conn = session->leadconn; +- if (session->state == ISCSI_STATE_TERMINATE || !conn) { +- spin_unlock_irqrestore(&session->lock, flags); +- return; +- } +- +- dev = get_device(&conn->cls_conn->dev); +- spin_unlock_irqrestore(&session->lock, flags); +- if (!dev) +- return; +- /* +- * if the host is being removed bypass the connection +- * recovery initialization because we are going to kill +- * the session. +- */ +- if (err == ISCSI_ERR_INVALID_HOST) +- iscsi_conn_error(conn->cls_conn, err); +- else +- iscsi_conn_failure(conn, err); +- put_device(dev); +-} +-EXPORT_SYMBOL_GPL(iscsi_session_failure); +- + void iscsi_conn_failure(struct iscsi_conn *conn, enum iscsi_err err) + { + struct iscsi_session *session = conn->session; +@@ -1033,7 +993,6 @@ + if (conn->stop_stage == 0) + session->state = ISCSI_STATE_FAILED; + spin_unlock_irqrestore(&session->lock, flags); +- + set_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx); + set_bit(ISCSI_SUSPEND_BIT, &conn->suspend_rx); + iscsi_conn_error(conn->cls_conn, err); +@@ -1260,13 +1219,15 @@ + switch (session->state) { + case ISCSI_STATE_IN_RECOVERY: + reason = FAILURE_SESSION_IN_RECOVERY; +- goto reject; ++ sc->result = DID_IMM_RETRY << 16; ++ break; + case ISCSI_STATE_LOGGING_OUT: + reason = FAILURE_SESSION_LOGGING_OUT; +- goto reject; ++ sc->result = DID_IMM_RETRY << 16; ++ break; + case ISCSI_STATE_RECOVERY_FAILED: + reason = FAILURE_SESSION_RECOVERY_TIMEOUT; +- sc->result = DID_TRANSPORT_FAILFAST << 16; ++ sc->result = DID_NO_CONNECT << 16; + break; + case ISCSI_STATE_TERMINATE: + reason = FAILURE_SESSION_TERMINATE; +@@ -1331,7 +1292,7 @@ + spin_unlock(&session->lock); + debug_scsi("cmd 0x%x rejected (%d)\n", sc->cmnd[0], reason); + spin_lock(host->host_lock); +- return SCSI_MLQUEUE_TARGET_BUSY; ++ return SCSI_MLQUEUE_HOST_BUSY; + + fault: + spin_unlock(&session->lock); +@@ -1520,7 +1481,7 @@ + if (lun == task->sc->device->lun || lun == -1) { + debug_scsi("failing in progress sc %p itt 0x%x\n", + task->sc, task->itt); +- fail_command(conn, task, error << 16); ++ fail_command(conn, task, DID_BUS_BUSY << 16); + } + } + } +@@ -1540,12 +1501,12 @@ + scsi_queue_work(conn->session->host, &conn->xmitwork); + } + +-static enum blk_eh_timer_return iscsi_eh_cmd_timed_out(struct scsi_cmnd *scmd) ++static enum scsi_eh_timer_return iscsi_eh_cmd_timed_out(struct scsi_cmnd *scmd) + { + struct iscsi_cls_session *cls_session; + struct iscsi_session *session; + struct iscsi_conn *conn; +- enum blk_eh_timer_return rc = BLK_EH_NOT_HANDLED; ++ enum scsi_eh_timer_return rc = EH_NOT_HANDLED; + + cls_session = starget_to_session(scsi_target(scmd->device)); + session = cls_session->dd_data; +@@ -1558,14 +1519,14 @@ + * We are probably in the middle of iscsi recovery so let + * that complete and handle the error. + */ +- rc = BLK_EH_RESET_TIMER; ++ rc = EH_RESET_TIMER; + goto done; + } + + conn = session->leadconn; + if (!conn) { + /* In the middle of shuting down */ +- rc = BLK_EH_RESET_TIMER; ++ rc = EH_RESET_TIMER; + goto done; + } + +@@ -1577,21 +1538,20 @@ + */ + if (time_before_eq(conn->last_recv + (conn->recv_timeout * HZ) + + (conn->ping_timeout * HZ), jiffies)) +- rc = BLK_EH_RESET_TIMER; ++ rc = EH_RESET_TIMER; + /* + * if we are about to check the transport then give the command + * more time + */ + if (time_before_eq(conn->last_recv + (conn->recv_timeout * HZ), + jiffies)) +- rc = BLK_EH_RESET_TIMER; ++ rc = EH_RESET_TIMER; + /* if in the middle of checking the transport then give us more time */ + if (conn->ping_task) +- rc = BLK_EH_RESET_TIMER; ++ rc = EH_RESET_TIMER; + done: + spin_unlock(&session->lock); +- debug_scsi("return %s\n", rc == BLK_EH_RESET_TIMER ? +- "timer reset" : "nh"); ++ debug_scsi("return %s\n", rc == EH_RESET_TIMER ? "timer reset" : "nh"); + return rc; + } + +@@ -1833,10 +1793,10 @@ + + iscsi_suspend_tx(conn); + +- spin_lock(&session->lock); ++ spin_lock_bh(&session->lock); + fail_all_commands(conn, sc->device->lun, DID_ERROR); + conn->tmf_state = TMF_INITIAL; +- spin_unlock(&session->lock); ++ spin_unlock_bh(&session->lock); + + iscsi_start_tx(conn); + goto done; +@@ -1926,7 +1886,8 @@ + if (!shost->can_queue) + shost->can_queue = ISCSI_DEF_XMIT_CMDS_MAX; + +- shost->transportt->eh_timed_out = iscsi_eh_cmd_timed_out; ++ if (!shost->transportt->eh_timed_out) ++ shost->transportt->eh_timed_out = iscsi_eh_cmd_timed_out; + return scsi_add_host(shost, pdev); + } + EXPORT_SYMBOL_GPL(iscsi_host_add); +@@ -1944,7 +1905,6 @@ + int dd_data_size, uint16_t qdepth) + { + struct Scsi_Host *shost; +- struct iscsi_host *ihost; + + shost = scsi_host_alloc(sht, sizeof(struct iscsi_host) + dd_data_size); + if (!shost) +@@ -1958,43 +1918,22 @@ + qdepth = ISCSI_DEF_CMD_PER_LUN; + } + shost->cmd_per_lun = qdepth; +- +- ihost = shost_priv(shost); +- spin_lock_init(&ihost->lock); +- ihost->state = ISCSI_HOST_SETUP; +- ihost->num_sessions = 0; +- init_waitqueue_head(&ihost->session_removal_wq); + return shost; + } + EXPORT_SYMBOL_GPL(iscsi_host_alloc); +- +-static void iscsi_notify_host_removed(struct iscsi_cls_session *cls_session) +-{ +- iscsi_session_failure(cls_session, ISCSI_ERR_INVALID_HOST); +-} + + /** + * iscsi_host_remove - remove host and sessions + * @shost: scsi host + * +- * If there are any sessions left, this will initiate the removal and wait +- * for the completion. ++ * This will also remove any sessions attached to the host, but if userspace ++ * is managing the session at the same time this will break. TODO: add ++ * refcounting to the netlink iscsi interface so a rmmod or host hot unplug ++ * does not remove the memory from under us. + */ + void iscsi_host_remove(struct Scsi_Host *shost) + { +- struct iscsi_host *ihost = shost_priv(shost); +- unsigned long flags; +- +- spin_lock_irqsave(&ihost->lock, flags); +- ihost->state = ISCSI_HOST_REMOVED; +- spin_unlock_irqrestore(&ihost->lock, flags); +- +- iscsi_host_for_each_session(shost, iscsi_notify_host_removed); +- wait_event_interruptible(ihost->session_removal_wq, +- ihost->num_sessions == 0); +- if (signal_pending(current)) +- flush_signals(current); +- ++ iscsi_host_for_each_session(shost, iscsi_session_teardown); + scsi_remove_host(shost); + } + EXPORT_SYMBOL_GPL(iscsi_host_remove); +@@ -2009,27 +1948,6 @@ + scsi_host_put(shost); + } + EXPORT_SYMBOL_GPL(iscsi_host_free); +- +-static void iscsi_host_dec_session_cnt(struct Scsi_Host *shost) +-{ +- struct iscsi_host *ihost = shost_priv(shost); +- unsigned long flags; +- +- shost = scsi_host_get(shost); +- if (!shost) { +- printk(KERN_ERR "Invalid state. Cannot notify host removal " +- "of session teardown event because host already " +- "removed.\n"); +- return; +- } +- +- spin_lock_irqsave(&ihost->lock, flags); +- ihost->num_sessions--; +- if (ihost->num_sessions == 0) +- wake_up(&ihost->session_removal_wq); +- spin_unlock_irqrestore(&ihost->lock, flags); +- scsi_host_put(shost); +-} + + /** + * iscsi_session_setup - create iscsi cls session and host and session +@@ -2051,19 +1969,9 @@ + uint16_t cmds_max, int cmd_task_size, + uint32_t initial_cmdsn, unsigned int id) + { +- struct iscsi_host *ihost = shost_priv(shost); + struct iscsi_session *session; + struct iscsi_cls_session *cls_session; + int cmd_i, scsi_cmds, total_cmds = cmds_max; +- unsigned long flags; +- +- spin_lock_irqsave(&ihost->lock, flags); +- if (ihost->state == ISCSI_HOST_REMOVED) { +- spin_unlock_irqrestore(&ihost->lock, flags); +- return NULL; +- } +- ihost->num_sessions++; +- spin_unlock_irqrestore(&ihost->lock, flags); + + if (!total_cmds) + total_cmds = ISCSI_DEF_XMIT_CMDS_MAX; +@@ -2076,7 +1984,7 @@ + printk(KERN_ERR "iscsi: invalid can_queue of %d. can_queue " + "must be a power of two that is at least %d.\n", + total_cmds, ISCSI_TOTAL_CMDS_MIN); +- goto dec_session_count; ++ return NULL; + } + + if (total_cmds > ISCSI_TOTAL_CMDS_MAX) { +@@ -2100,7 +2008,7 @@ + cls_session = iscsi_alloc_session(shost, iscsit, + sizeof(struct iscsi_session)); + if (!cls_session) +- goto dec_session_count; ++ return NULL; + session = cls_session->dd_data; + session->cls_session = cls_session; + session->host = shost; +@@ -2139,7 +2047,6 @@ + + if (iscsi_add_session(cls_session, id)) + goto cls_session_fail; +- + return cls_session; + + cls_session_fail: +@@ -2148,8 +2055,6 @@ + iscsi_pool_free(&session->cmdpool); + cmdpool_alloc_fail: + iscsi_free_session(cls_session); +-dec_session_count: +- iscsi_host_dec_session_cnt(shost); + return NULL; + } + EXPORT_SYMBOL_GPL(iscsi_session_setup); +@@ -2165,7 +2070,6 @@ + { + struct iscsi_session *session = cls_session->dd_data; + struct module *owner = cls_session->transport->owner; +- struct Scsi_Host *shost = session->host; + + iscsi_pool_free(&session->cmdpool); + +@@ -2178,8 +2082,6 @@ + kfree(session->ifacename); + + iscsi_destroy_session(cls_session); +- +- iscsi_host_dec_session_cnt(shost); + module_put(owner); + } + EXPORT_SYMBOL_GPL(iscsi_session_teardown); +@@ -2459,10 +2361,8 @@ + * flush queues. + */ + spin_lock_bh(&session->lock); +- if (STOP_CONN_RECOVER) +- fail_all_commands(conn, -1, DID_TRANSPORT_DISRUPTED); +- else +- fail_all_commands(conn, -1, DID_ERROR); ++ fail_all_commands(conn, -1, ++ STOP_CONN_RECOVER ? DID_BUS_BUSY : DID_ERROR); + flush_control_queues(session, conn); + spin_unlock_bh(&session->lock); + mutex_unlock(&session->eh_mutex); +diff -r c7d20a90487f drivers/scsi/scsi_transport_iscsi.c +--- a/drivers/scsi/scsi_transport_iscsi.c Thu Jun 04 15:14:02 2009 +0100 ++++ b/drivers/scsi/scsi_transport_iscsi.c Fri Jun 05 14:24:35 2009 +0100 +@@ -27,8 +27,8 @@ + #include + #include + #include +-#include +-#include ++#include "scsi_transport_iscsi.h" ++#include "iscsi_if.h" + + #define ISCSI_SESSION_ATTRS 21 + #define ISCSI_CONN_ATTRS 13 +@@ -138,7 +138,7 @@ + show_ep_handle(struct device *dev, struct device_attribute *attr, char *buf) + { + struct iscsi_endpoint *ep = iscsi_dev_to_endpoint(dev); +- return sprintf(buf, "%llu\n", (unsigned long long)ep->id); ++ return sprintf(buf, "%llu\n", (unsigned long long) ep->id); + } + static ISCSI_ATTR(ep, handle, S_IRUGO, show_ep_handle, NULL); + +@@ -187,7 +187,8 @@ + + ep->id = id; + ep->dev.class = &iscsi_endpoint_class; +- snprintf(ep->dev.bus_id, BUS_ID_SIZE, "ep-%llu", id); ++ snprintf(ep->dev.bus_id, BUS_ID_SIZE, "ep-%llu", ++ (unsigned long long) id); + err = device_register(&ep->dev); + if (err) + goto free_ep; +@@ -374,10 +375,10 @@ + err = 0; + break; + case ISCSI_SESSION_FAILED: +- err = DID_TRANSPORT_DISRUPTED << 16; ++ err = DID_IMM_RETRY << 16; + break; + case ISCSI_SESSION_FREE: +- err = DID_TRANSPORT_FAILFAST << 16; ++ err = DID_NO_CONNECT << 16; + break; + default: + err = DID_NO_CONNECT << 16; +diff -r c7d20a90487f include/scsi/iscsi_if.h +--- a/include/scsi/iscsi_if.h Thu Jun 04 15:14:02 2009 +0100 ++++ b/include/scsi/iscsi_if.h Fri Jun 05 14:24:35 2009 +0100 +@@ -21,7 +21,7 @@ + #ifndef ISCSI_IF_H + #define ISCSI_IF_H + +-#include ++#include "iscsi_proto.h" + + #define UEVENT_BASE 10 + #define KEVENT_BASE 100 +@@ -214,6 +214,7 @@ + ISCSI_ERR_PARAM_NOT_FOUND = ISCSI_ERR_BASE + 16, + ISCSI_ERR_NO_SCSI_CMD = ISCSI_ERR_BASE + 17, + ISCSI_ERR_INVALID_HOST = ISCSI_ERR_BASE + 18, ++ ISCSI_ERR_XMIT_FAILED = ISCSI_ERR_BASE + 19, + }; + + /* +@@ -334,7 +335,6 @@ + #define CAP_FW_DB 0x200 + #define CAP_SENDTARGETS_OFFLOAD 0x400 + #define CAP_DATA_PATH_OFFLOAD 0x800 +-#define CAP_DIGEST_OFFLOAD 0x1000 + + /* + * These flags describes reason of stop_conn() call +diff -r c7d20a90487f include/scsi/iscsi_proto.h +--- a/include/scsi/iscsi_proto.h Thu Jun 04 15:14:02 2009 +0100 ++++ b/include/scsi/iscsi_proto.h Fri Jun 05 14:24:35 2009 +0100 +@@ -22,7 +22,6 @@ + #define ISCSI_PROTO_H + + #include +-#include + + #define ISCSI_DRAFT20_VERSION 0x00 + +@@ -42,6 +41,21 @@ + p[2] = ((v) & 0xFF); \ + } + #define zero_data(p) {p[0]=0;p[1]=0;p[2]=0;} ++ ++/* ++ * If running svn modules we may need to define these. ++ * This should not go upstream since this is already properly defined there ++ */ ++#ifdef __CHECKER__ ++#define __bitwise__ __attribute__((bitwise)) ++#else ++#define __bitwise__ ++#endif ++#ifdef __CHECK_ENDIAN__ ++#define __bitwise __bitwise__ ++#else ++#define __bitwise ++#endif + + /* initiator tags; opaque for target */ + typedef uint32_t __bitwise__ itt_t; +@@ -157,7 +171,7 @@ + uint8_t ahstype; + uint8_t reserved; + /* 4-byte aligned extended CDB spillover */ +- uint8_t ecdb[SCSI_MAX_VARLEN_CDB_SIZE - ISCSI_CDB_SIZE]; ++ uint8_t ecdb[260 - ISCSI_CDB_SIZE]; + }; + + /* SCSI Response Header */ +diff -r c7d20a90487f include/scsi/libiscsi.h +--- a/include/scsi/libiscsi.h Thu Jun 04 15:14:02 2009 +0100 ++++ b/include/scsi/libiscsi.h Fri Jun 05 14:24:35 2009 +0100 +@@ -28,8 +28,9 @@ + #include + #include + #include +-#include +-#include ++ ++#include "iscsi_proto.h" ++#include "iscsi_if.h" + + struct scsi_transport_template; + struct scsi_host_template; +@@ -75,7 +76,7 @@ + /* this must be a power of two greater than ISCSI_MGMT_CMDS_MAX */ + #define ISCSI_TOTAL_CMDS_MIN 16 + #define ISCSI_AGE_SHIFT 28 +-#define ISCSI_AGE_MASK 0xf ++#define ISCSI_AGE_MASK (0xf << ISCSI_AGE_SHIFT) + + #define ISCSI_ADDRESS_BUF_LEN 64 + +@@ -287,10 +288,6 @@ + struct iscsi_pool cmdpool; /* PDU's pool */ + }; + +-enum { +- ISCSI_HOST_SETUP, +- ISCSI_HOST_REMOVED, +-}; + struct iscsi_host { + char *initiatorname; + /* hw address or netdev iscsi connection is bound to */ +@@ -299,13 +296,6 @@ + /* local address */ + int local_port; + char local_address[ISCSI_ADDRESS_BUF_LEN]; +- +- wait_queue_head_t session_removal_wq; +- +- /* protects sessions and state */ +- spinlock_t lock; +- int num_sessions; +- int state; + }; + + /* +@@ -362,8 +352,6 @@ + extern int iscsi_conn_bind(struct iscsi_cls_session *, struct iscsi_cls_conn *, + int); + extern void iscsi_conn_failure(struct iscsi_conn *conn, enum iscsi_err err); +-extern void iscsi_session_failure(struct iscsi_cls_session *cls_session, +- enum iscsi_err err); + extern int iscsi_conn_get_param(struct iscsi_cls_conn *cls_conn, + enum iscsi_param param, char *buf); + extern void iscsi_suspend_tx(struct iscsi_conn *conn); +@@ -386,10 +374,8 @@ + char *, int); + extern int iscsi_verify_itt(struct iscsi_conn *, itt_t); + extern struct iscsi_task *iscsi_itt_to_ctask(struct iscsi_conn *, itt_t); +-extern struct iscsi_task *iscsi_itt_to_task(struct iscsi_conn *, itt_t); + extern void iscsi_requeue_task(struct iscsi_task *task); + extern void iscsi_put_task(struct iscsi_task *task); +-extern void __iscsi_put_task(struct iscsi_task *task); + extern void __iscsi_get_task(struct iscsi_task *task); + + /* +diff -r c7d20a90487f include/scsi/scsi_transport_iscsi.h +--- a/include/scsi/scsi_transport_iscsi.h Thu Jun 04 15:14:02 2009 +0100 ++++ b/include/scsi/scsi_transport_iscsi.h Fri Jun 05 14:24:35 2009 +0100 +@@ -26,7 +26,7 @@ + #include + #include + #include +-#include ++#include "iscsi_if.h" + + struct scsi_transport_template; + struct iscsi_transport; +@@ -56,9 +56,6 @@ + * is not supported, and a -Exx value on other error + * @start_conn: set connection to be operational + * @stop_conn: suspend/recover/terminate connection +- * @parse_itt: parse the itt rcv'ed in BHS +- * @reserve_itt: construct a task itt to be sent in BHS +- * @release_itt: release a itt (constructed by reserve_itt) + * @send_pdu: send iSCSI PDU, Login, Logout, NOP-Out, Reject, Text. + * @session_recovery_timedout: notify LLD a block during recovery timed out + * @init_task: Initialize a iscsi_task and any internal structs. +@@ -112,10 +109,6 @@ + int (*set_host_param) (struct Scsi_Host *shost, + enum iscsi_host_param param, char *buf, + int buflen); +- void (*parse_itt)(struct iscsi_conn *conn, itt_t hdr_itt, +- int *idx, int *age); +- int (*reserve_itt)(struct iscsi_task *task, itt_t *hdr_itt); +- void (*release_itt)(struct iscsi_task *task, itt_t hdr_itt); + int (*send_pdu) (struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr, + char *data, uint32_t data_size); + void (*get_stats) (struct iscsi_cls_conn *conn, diff --git a/master/open-iscsi-adjust-for-in-kernel-build b/master/open-iscsi-adjust-for-in-kernel-build index da37f35..ec47d0d 100644 --- a/master/open-iscsi-adjust-for-in-kernel-build +++ b/master/open-iscsi-adjust-for-in-kernel-build @@ -1,6 +1,6 @@ -diff -r a17fa29eb1ee drivers/scsi/iscsi_tcp.c ---- a/drivers/scsi/iscsi_tcp.c Wed Apr 16 14:26:49 2008 +0100 -+++ b/drivers/scsi/iscsi_tcp.c Wed Apr 16 14:40:16 2008 +0100 +diff -r 8e19b52b3cfc drivers/scsi/iscsi_tcp.c +--- a/drivers/scsi/iscsi_tcp.c Fri Jun 05 14:24:40 2009 +0100 ++++ b/drivers/scsi/iscsi_tcp.c Fri Jun 05 14:28:31 2009 +0100 @@ -40,7 +40,7 @@ #include #include @@ -10,9 +10,9 @@ diff -r a17fa29eb1ee drivers/scsi/iscsi_tcp.c #include "iscsi_tcp.h" -diff -r a17fa29eb1ee drivers/scsi/iscsi_tcp.h ---- a/drivers/scsi/iscsi_tcp.h Wed Apr 16 14:26:49 2008 +0100 -+++ b/drivers/scsi/iscsi_tcp.h Wed Apr 16 14:40:46 2008 +0100 +diff -r 8e19b52b3cfc drivers/scsi/iscsi_tcp.h +--- a/drivers/scsi/iscsi_tcp.h Fri Jun 05 14:24:40 2009 +0100 ++++ b/drivers/scsi/iscsi_tcp.h Fri Jun 05 14:28:31 2009 +0100 @@ -22,7 +22,7 @@ #ifndef ISCSI_TCP_H #define ISCSI_TCP_H @@ -20,12 +20,12 @@ diff -r a17fa29eb1ee drivers/scsi/iscsi_tcp.h -#include "libiscsi.h" +#include - /* Socket's Receive state machine */ - #define IN_PROGRESS_WAIT_HEADER 0x0 -diff -r a17fa29eb1ee drivers/scsi/libiscsi.c ---- a/drivers/scsi/libiscsi.c Wed Apr 16 14:26:49 2008 +0100 -+++ b/drivers/scsi/libiscsi.c Wed Apr 16 14:39:52 2008 +0100 -@@ -33,9 +33,9 @@ + struct crypto_hash; + struct socket; +diff -r 8e19b52b3cfc drivers/scsi/libiscsi.c +--- a/drivers/scsi/libiscsi.c Fri Jun 05 14:24:40 2009 +0100 ++++ b/drivers/scsi/libiscsi.c Fri Jun 05 14:28:31 2009 +0100 +@@ -34,9 +34,9 @@ #include #include #include @@ -36,11 +36,11 @@ diff -r a17fa29eb1ee drivers/scsi/libiscsi.c +#include +#include - struct iscsi_session * - class_to_transport_session(struct iscsi_cls_session *cls_session) -diff -r a17fa29eb1ee drivers/scsi/scsi_transport_iscsi.c ---- a/drivers/scsi/scsi_transport_iscsi.c Wed Apr 16 14:26:49 2008 +0100 -+++ b/drivers/scsi/scsi_transport_iscsi.c Wed Apr 16 14:36:48 2008 +0100 + + /* Serial Number Arithmetic, 32 bits, less than, RFC1982 */ +diff -r 8e19b52b3cfc drivers/scsi/scsi_transport_iscsi.c +--- a/drivers/scsi/scsi_transport_iscsi.c Fri Jun 05 14:24:40 2009 +0100 ++++ b/drivers/scsi/scsi_transport_iscsi.c Fri Jun 05 14:28:31 2009 +0100 @@ -27,8 +27,8 @@ #include #include @@ -49,17 +49,17 @@ diff -r a17fa29eb1ee drivers/scsi/scsi_transport_iscsi.c -#include "iscsi_if.h" +#include +#include - #include "iscsi_2.6.22_compat.h" - #define ISCSI_SESSION_ATTRS 16 -diff -r a17fa29eb1ee include/scsi/iscsi_if.h ---- a/include/scsi/iscsi_if.h Wed Apr 16 14:26:49 2008 +0100 -+++ b/include/scsi/iscsi_if.h Wed Apr 16 14:33:51 2008 +0100 + #define ISCSI_SESSION_ATTRS 21 + #define ISCSI_CONN_ATTRS 13 +diff -r 8e19b52b3cfc include/scsi/iscsi_if.h +--- a/include/scsi/iscsi_if.h Fri Jun 05 14:24:40 2009 +0100 ++++ b/include/scsi/iscsi_if.h Fri Jun 05 14:28:31 2009 +0100 @@ -21,7 +21,7 @@ #ifndef ISCSI_IF_H #define ISCSI_IF_H --#include +-#include "iscsi_proto.h" +#include #define UEVENT_BASE 10 diff --git a/master/open-iscsi-gfpkernel.patch b/master/open-iscsi-gfpkernel.patch index ba2791d..b7b4610 100644 --- a/master/open-iscsi-gfpkernel.patch +++ b/master/open-iscsi-gfpkernel.patch @@ -1,12 +1,12 @@ -diff -r 5cdfec377e5c drivers/scsi/scsi_transport_iscsi.c ---- a/drivers/scsi/scsi_transport_iscsi.c Wed Feb 04 17:14:25 2009 +0000 -+++ b/drivers/scsi/scsi_transport_iscsi.c Thu Feb 05 09:23:34 2009 +0000 -@@ -575,7 +575,7 @@ +diff -r cf52cd97d524 drivers/scsi/scsi_transport_iscsi.c +--- a/drivers/scsi/scsi_transport_iscsi.c Fri Jun 05 15:56:34 2009 +0100 ++++ b/drivers/scsi/scsi_transport_iscsi.c Mon Jun 15 11:28:15 2009 +0100 +@@ -1044,7 +1044,7 @@ if (!priv) return; - skb = alloc_skb(len, GFP_ATOMIC); + skb = alloc_skb(len, GFP_KERNEL); /* not called from interrupt ctxt */ if (!skb) { - dev_printk(KERN_ERR, &conn->dev, "iscsi: gracefully ignored " - "conn error (%d)\n", error); + iscsi_cls_conn_printk(KERN_ERR, conn, "gracefully ignored " + "conn error (%d)\n", error); diff --git a/master/pciback-flr b/master/pciback-flr index e39ef4b..e993f18 100644 --- a/master/pciback-flr +++ b/master/pciback-flr @@ -1,8 +1,7 @@ diff --git a/drivers/xen/pciback/controller.c b/drivers/xen/pciback/controller.c -index 294e48f..4c1aaf3 100644 --- a/drivers/xen/pciback/controller.c +++ b/drivers/xen/pciback/controller.c -@@ -208,7 +208,7 @@ void pciback_release_pci_dev(struct pciback_device *pdev, struct pci_dev *dev) +@@ -208,7 +208,7 @@ } spin_unlock_irqrestore(&dev_data->lock, flags); @@ -11,7 +10,7 @@ index 294e48f..4c1aaf3 100644 } int pciback_init_devices(struct pciback_device *pdev) -@@ -396,7 +396,7 @@ void pciback_release_devices(struct pciback_device *pdev) +@@ -396,7 +396,7 @@ list_for_each_entry_safe(dev_entry, d, &cntrl_entry->dev_list, list) { list_del(&dev_entry->list); @@ -21,10 +20,9 @@ index 294e48f..4c1aaf3 100644 } list_del(&cntrl_entry->list); diff --git a/drivers/xen/pciback/passthrough.c b/drivers/xen/pciback/passthrough.c -index 9e7a0c4..b9948a5 100644 --- a/drivers/xen/pciback/passthrough.c +++ b/drivers/xen/pciback/passthrough.c -@@ -88,7 +88,7 @@ void pciback_release_pci_dev(struct pciback_device *pdev, struct pci_dev *dev) +@@ -88,7 +88,7 @@ spin_unlock_irqrestore(&dev_data->lock, flags); if (found_dev) @@ -33,7 +31,7 @@ index 9e7a0c4..b9948a5 100644 } int pciback_init_devices(struct pciback_device *pdev) -@@ -157,7 +157,7 @@ void pciback_release_devices(struct pciback_device *pdev) +@@ -157,7 +157,7 @@ list_for_each_entry_safe(dev_entry, t, &dev_data->dev_list, list) { list_del(&dev_entry->list); @@ -43,10 +41,9 @@ index 9e7a0c4..b9948a5 100644 } diff --git a/drivers/xen/pciback/pci_stub.c b/drivers/xen/pciback/pci_stub.c -index 6345b39..486034f 100644 --- a/drivers/xen/pciback/pci_stub.c +++ b/drivers/xen/pciback/pci_stub.c -@@ -24,10 +24,28 @@ wait_queue_head_t aer_wait_queue; +@@ -24,10 +24,28 @@ * We want to avoid in middle of AER ops, pciback devices is being removed */ static DECLARE_RWSEM(pcistub_sem); @@ -76,7 +73,7 @@ index 6345b39..486034f 100644 int domain; unsigned char bus; unsigned int devfn; -@@ -56,6 +74,8 @@ static LIST_HEAD(pcistub_devices); +@@ -56,6 +74,8 @@ static int initialize_devices = 0; static LIST_HEAD(seized_devices); @@ -85,10 +82,12 @@ index 6345b39..486034f 100644 static struct pcistub_device *pcistub_device_alloc(struct pci_dev *dev) { struct pcistub_device *psdev; -@@ -78,6 +98,23 @@ static struct pcistub_device *pcistub_device_alloc(struct pci_dev *dev) - return psdev; - } +@@ -76,6 +96,23 @@ + spin_lock_init(&psdev->lock); + return psdev; ++} ++ +static struct pciback_dev_data *pcistub_dev_data_alloc(struct pci_dev *dev) +{ + struct pciback_dev_data *dev_data; @@ -104,12 +103,10 @@ index 6345b39..486034f 100644 + dev_data->cfg_space = (u8*)(dev_data) + sizeof(*dev_data); + + return dev_data; -+} -+ + } + /* Don't call this directly as it's called by pcistub_device_put */ - static void pcistub_device_release(struct kref *kref) - { -@@ -200,7 +237,7 @@ struct pci_dev *pcistub_get_pci_dev(struct pciback_device *pdev, +@@ -200,7 +237,7 @@ return found_dev; } @@ -118,7 +115,7 @@ index 6345b39..486034f 100644 { struct pcistub_device *psdev, *found_psdev = NULL; unsigned long flags; -@@ -220,6 +257,13 @@ void pcistub_put_pci_dev(struct pci_dev *dev) +@@ -220,6 +257,13 @@ * pcistub and pciback when AER is in processing */ down_write(&pcistub_sem); @@ -132,10 +129,12 @@ index 6345b39..486034f 100644 /* Cleanup our device * (so it's ready for the next domain) */ -@@ -235,6 +279,43 @@ void pcistub_put_pci_dev(struct pci_dev *dev) - up_write(&pcistub_sem); - } +@@ -233,6 +277,43 @@ + pcistub_device_put(found_psdev); + up_write(&pcistub_sem); ++} ++ +struct pci_dev *pcistub_ref_pci_dev(struct pci_dev *dev) +{ + struct pcistub_device *psdev; @@ -171,12 +170,10 @@ index 6345b39..486034f 100644 + } + + spin_unlock_irqrestore(&pcistub_devices_lock, flags); -+} -+ + } + static int __devinit pcistub_match_one(struct pci_dev *dev, - struct pcistub_device_id *pdev_id) - { -@@ -255,7 +336,7 @@ static int __devinit pcistub_match_one(struct pci_dev *dev, +@@ -255,7 +336,7 @@ return 0; } @@ -185,7 +182,7 @@ index 6345b39..486034f 100644 { struct pcistub_device_id *pdev_id; unsigned long flags; -@@ -263,6 +344,8 @@ static int __devinit pcistub_match(struct pci_dev *dev) +@@ -263,6 +344,8 @@ spin_lock_irqsave(&device_ids_lock, flags); list_for_each_entry(pdev_id, &pcistub_device_ids, slot_list) { @@ -194,7 +191,7 @@ index 6345b39..486034f 100644 if (pcistub_match_one(dev, pdev_id)) { found = 1; break; -@@ -285,12 +368,11 @@ static int __devinit pcistub_init_device(struct pci_dev *dev) +@@ -285,12 +368,11 @@ * would need to be called somewhere to free the memory allocated * here and then to call kfree(pci_get_drvdata(psdev->dev)). */ @@ -208,10 +205,11 @@ index 6345b39..486034f 100644 dev_dbg(&dev->dev, "initializing config\n"); -@@ -317,6 +399,22 @@ static int __devinit pcistub_init_device(struct pci_dev *dev) +@@ -316,6 +398,22 @@ + */ dev_dbg(&dev->dev, "reset device\n"); pciback_reset_device(dev); - ++ + /* Classify the device so we know if it is PCI/PCIe and if it is + * a bridge - this information is used for FLR logic. Also store + * values if SBR/D3R reset logic was requested. @@ -227,11 +225,10 @@ index 6345b39..486034f 100644 + * exported before any FLRs or other resets are done + */ + pciback_store_config_space(dev); -+ + return 0; - config_release: -@@ -414,7 +512,7 @@ static int __devinit pcistub_probe(struct pci_dev *dev, +@@ -414,7 +512,7 @@ dev_dbg(&dev->dev, "probing...\n"); @@ -240,7 +237,7 @@ index 6345b39..486034f 100644 if (dev->hdr_type != PCI_HEADER_TYPE_NORMAL && dev->hdr_type != PCI_HEADER_TYPE_BRIDGE) { -@@ -851,7 +949,7 @@ static inline int str_to_quirk(const char *buf, int *domain, int *bus, int +@@ -851,7 +949,7 @@ return -EINVAL; } @@ -249,7 +246,7 @@ index 6345b39..486034f 100644 { struct pcistub_device_id *pci_dev_id; unsigned long flags; -@@ -860,12 +958,13 @@ static int pcistub_device_id_add(int domain, int bus, int slot, int func) +@@ -860,12 +958,13 @@ if (!pci_dev_id) return -ENOMEM; @@ -265,7 +262,7 @@ index 6345b39..486034f 100644 spin_lock_irqsave(&device_ids_lock, flags); list_add_tail(&pci_dev_id->slot_list, &pcistub_device_ids); -@@ -874,7 +973,7 @@ static int pcistub_device_id_add(int domain, int bus, int slot, int func) +@@ -874,7 +973,7 @@ return 0; } @@ -274,7 +271,7 @@ index 6345b39..486034f 100644 { struct pcistub_device_id *pci_dev_id, *t; int devfn = PCI_DEVFN(slot, func); -@@ -884,7 +983,7 @@ static int pcistub_device_id_remove(int domain, int bus, int slot, int func) +@@ -884,7 +983,7 @@ spin_lock_irqsave(&device_ids_lock, flags); list_for_each_entry_safe(pci_dev_id, t, &pcistub_device_ids, slot_list) { @@ -283,7 +280,7 @@ index 6345b39..486034f 100644 && pci_dev_id->bus == bus && pci_dev_id->devfn == devfn) { /* Don't break; here because it's possible the same * slot could be in the list more than once -@@ -939,6 +1038,32 @@ static int pcistub_reg_add(int domain, int bus, int slot, int func, int reg, +@@ -939,6 +1038,32 @@ return err; } @@ -316,7 +313,7 @@ index 6345b39..486034f 100644 static ssize_t pcistub_slot_add(struct device_driver *drv, const char *buf, size_t count) { -@@ -949,7 +1074,7 @@ static ssize_t pcistub_slot_add(struct device_driver *drv, const char *buf, +@@ -949,7 +1074,7 @@ if (err) goto out; @@ -325,7 +322,7 @@ index 6345b39..486034f 100644 out: if (!err) -@@ -969,7 +1094,7 @@ static ssize_t pcistub_slot_remove(struct device_driver *drv, const char *buf, +@@ -969,7 +1094,7 @@ if (err) goto out; @@ -334,7 +331,7 @@ index 6345b39..486034f 100644 out: if (!err) -@@ -987,6 +1112,10 @@ static ssize_t pcistub_slot_show(struct device_driver *drv, char *buf) +@@ -987,6 +1112,10 @@ spin_lock_irqsave(&device_ids_lock, flags); list_for_each_entry(pci_dev_id, &pcistub_device_ids, slot_list) { @@ -345,7 +342,7 @@ index 6345b39..486034f 100644 if (count >= PAGE_SIZE) break; -@@ -1068,7 +1197,7 @@ static ssize_t pcistub_quirk_show(struct device_driver *drv, char *buf) +@@ -1068,7 +1197,7 @@ DRIVER_ATTR(quirks, S_IRUSR | S_IWUSR, pcistub_quirk_show, pcistub_quirk_add); @@ -354,7 +351,7 @@ index 6345b39..486034f 100644 size_t count) { int domain, bus, slot, func; -@@ -1109,7 +1238,7 @@ static ssize_t permissive_add(struct device_driver *drv, const char *buf, +@@ -1109,7 +1238,7 @@ return err; } @@ -363,7 +360,7 @@ index 6345b39..486034f 100644 { struct pcistub_device *psdev; struct pciback_dev_data *dev_data; -@@ -1132,7 +1261,68 @@ static ssize_t permissive_show(struct device_driver *drv, char *buf) +@@ -1132,7 +1261,68 @@ return count; } @@ -433,7 +430,7 @@ index 6345b39..486034f 100644 #ifdef CONFIG_PCI_MSI -@@ -1158,6 +1348,8 @@ static void pcistub_exit(void) +@@ -1158,6 +1348,8 @@ driver_remove_file(&pciback_pci_driver.driver, &driver_attr_slots); driver_remove_file(&pciback_pci_driver.driver, &driver_attr_quirks); driver_remove_file(&pciback_pci_driver.driver, &driver_attr_permissive); @@ -442,7 +439,7 @@ index 6345b39..486034f 100644 pci_unregister_driver(&pciback_pci_driver); WARN_ON(unregister_msi_get_owner(pciback_get_owner)); -@@ -1165,35 +1357,27 @@ static void pcistub_exit(void) +@@ -1165,35 +1357,27 @@ static int __init pcistub_init(void) { @@ -450,11 +447,15 @@ index 6345b39..486034f 100644 int err = 0; - int domain, bus, slot, func; - int parsed; -- + - if (pci_devs_to_hide && *pci_devs_to_hide) { - do { - parsed = 0; -- ++ /* Parse device lists for hide, sbr, and d3r */ ++ err = pciback_parse_device_params(pci_devs_to_hide, PCIBACK_ID_TYPE_HIDE, pcistub_device_id_add); ++ if (err) ++ goto out; + - err = sscanf(pci_devs_to_hide + pos, - " (%x:%x:%x.%x) %n", - &domain, &bus, &slot, &func, &parsed); @@ -466,28 +467,21 @@ index 6345b39..486034f 100644 - if (err != 3) - goto parse_error; - } -- ++ err = pciback_parse_device_params(pci_devs_use_sbr, PCIBACK_ID_TYPE_SBR, pcistub_device_id_add); ++ if (err) ++ goto out; + - err = pcistub_device_id_add(domain, bus, slot, func); - if (err) - goto out; ++ err = pciback_parse_device_params(pci_devs_use_d3r, PCIBACK_ID_TYPE_D3R, pcistub_device_id_add); ++ if (err) ++ goto out; - /* if parsed<=0, we've reached the end of the string */ - pos += parsed; - } while (parsed > 0 && pci_devs_to_hide[pos]); - } -+ /* Parse device lists for hide, sbr, and d3r */ -+ err = pciback_parse_device_params(pci_devs_to_hide, PCIBACK_ID_TYPE_HIDE, pcistub_device_id_add); -+ if (err) -+ goto out; -+ -+ err = pciback_parse_device_params(pci_devs_use_sbr, PCIBACK_ID_TYPE_SBR, pcistub_device_id_add); -+ if (err) -+ goto out; -+ -+ err = pciback_parse_device_params(pci_devs_use_d3r, PCIBACK_ID_TYPE_D3R, pcistub_device_id_add); -+ if (err) -+ goto out; -+ + if (pci_devs_no_flr && *pci_devs_no_flr && !strncmp(pci_devs_no_flr, "(*)", 3)) + disable_all_flr = 1; /* check special wildcard noflr */ + else @@ -497,7 +491,7 @@ index 6345b39..486034f 100644 /* If we're the first PCI Device Driver to register, we're the * first one to get offered PCI devices as they become -@@ -1217,6 +1401,12 @@ static int __init pcistub_init(void) +@@ -1217,6 +1401,12 @@ if (!err) err = driver_create_file(&pciback_pci_driver.driver, &driver_attr_permissive); @@ -510,7 +504,7 @@ index 6345b39..486034f 100644 if (!err) err = register_msi_get_owner(pciback_get_owner); -@@ -1225,11 +1415,6 @@ static int __init pcistub_init(void) +@@ -1225,11 +1415,6 @@ out: return err; @@ -523,10 +517,9 @@ index 6345b39..486034f 100644 #ifndef MODULE diff --git a/drivers/xen/pciback/pciback.h b/drivers/xen/pciback/pciback.h -index b2cb031..5cd967c 100644 --- a/drivers/xen/pciback/pciback.h +++ b/drivers/xen/pciback/pciback.h -@@ -25,6 +25,14 @@ struct pci_dev_entry { +@@ -25,6 +25,14 @@ #define _PCIB_op_pending (1) #define PCIB_op_pending (1<<(_PCIB_op_pending)) @@ -541,7 +534,7 @@ index b2cb031..5cd967c 100644 struct pciback_device { void *pci_dev_data; spinlock_t dev_lock; -@@ -48,6 +56,13 @@ struct pciback_dev_data { +@@ -48,6 +56,13 @@ struct list_head config_fields; int permissive; int warned_on_write; @@ -555,7 +548,7 @@ index b2cb031..5cd967c 100644 }; /* Get/Put PCI Devices that are hidden from the PCI Backend Domain */ -@@ -56,11 +71,25 @@ struct pci_dev *pcistub_get_pci_dev_by_slot(struct pciback_device *pdev, +@@ -56,10 +71,24 @@ int slot, int func); struct pci_dev *pcistub_get_pci_dev(struct pciback_device *pdev, struct pci_dev *dev); @@ -572,17 +565,16 @@ index b2cb031..5cd967c 100644 /* Ensure a device is turned off or reset */ void pciback_reset_device(struct pci_dev *pdev); - ++ +/* Do a function level reset (or approximage functionality) for device */ +void pciback_flr_device(struct pci_dev *dev); + +/* Helper to classify the device type */ +void pciback_classify_device(struct pci_dev *dev); -+ + /* Access a virtual configuration space for a PCI device */ int pciback_config_init(void); - int pciback_config_init_dev(struct pci_dev *dev); -@@ -102,6 +131,10 @@ void pciback_release_devices(struct pciback_device *pdev); +@@ -102,6 +131,10 @@ irqreturn_t pciback_handle_event(int irq, void *dev_id); void pciback_do_op(struct work_struct *work); @@ -594,10 +586,9 @@ index b2cb031..5cd967c 100644 void pciback_xenbus_unregister(void); diff --git a/drivers/xen/pciback/pciback_ops.c b/drivers/xen/pciback/pciback_ops.c -index d6b9bf9..ff61476 100644 --- a/drivers/xen/pciback/pciback_ops.c +++ b/drivers/xen/pciback/pciback_ops.c -@@ -9,16 +9,184 @@ +@@ -9,8 +9,176 @@ #include #include "pciback.h" @@ -614,7 +605,7 @@ index d6b9bf9..ff61476 100644 + int verbose_request = 0; module_param(verbose_request, int, 0644); - ++ +struct pcistub_sbr_entry { + struct list_head dev_list; + struct pci_dev *dev; @@ -771,10 +762,10 @@ index d6b9bf9..ff61476 100644 + + return 0; +} -+ + /* Ensure a device is "turned off" and ready to be exported. * (Also see pciback_config_reset to ensure virtual configuration space is - * ready to be re-exported) +@@ -18,7 +186,7 @@ */ void pciback_reset_device(struct pci_dev *dev) { @@ -783,7 +774,7 @@ index d6b9bf9..ff61476 100644 /* Disable devices (but not bridges) */ if (dev->hdr_type == PCI_HEADER_TYPE_NORMAL) { -@@ -38,6 +206,425 @@ void pciback_reset_device(struct pci_dev *dev) +@@ -38,6 +206,425 @@ } } } @@ -1209,7 +1200,7 @@ index d6b9bf9..ff61476 100644 extern wait_queue_head_t aer_wait_queue; extern struct workqueue_struct *pciback_wq; /* -@@ -132,3 +719,51 @@ irqreturn_t pciback_handle_event(int irq, void *dev_id) +@@ -132,3 +719,51 @@ return IRQ_HANDLED; } @@ -1262,10 +1253,9 @@ index d6b9bf9..ff61476 100644 + return -EINVAL; +} diff --git a/drivers/xen/pciback/slot.c b/drivers/xen/pciback/slot.c -index 105a8b6..9c66633 100644 --- a/drivers/xen/pciback/slot.c +++ b/drivers/xen/pciback/slot.c -@@ -109,7 +109,7 @@ void pciback_release_pci_dev(struct pciback_device *pdev, struct pci_dev *dev) +@@ -109,7 +109,7 @@ spin_unlock_irqrestore(&slot_dev->lock, flags); if (found_dev) @@ -1274,7 +1264,7 @@ index 105a8b6..9c66633 100644 } int pciback_init_devices(struct pciback_device *pdev) -@@ -149,7 +149,7 @@ void pciback_release_devices(struct pciback_device *pdev) +@@ -149,7 +149,7 @@ for (slot = 0; slot < PCI_SLOT_MAX; slot++) { dev = slot_dev->slots[bus][slot]; if (dev != NULL) @@ -1284,10 +1274,9 @@ index 105a8b6..9c66633 100644 kfree(slot_dev); diff --git a/drivers/xen/pciback/vpci.c b/drivers/xen/pciback/vpci.c -index a5b7ece..259e71d 100644 --- a/drivers/xen/pciback/vpci.c +++ b/drivers/xen/pciback/vpci.c -@@ -162,7 +162,7 @@ void pciback_release_pci_dev(struct pciback_device *pdev, struct pci_dev *dev) +@@ -162,7 +162,7 @@ spin_unlock_irqrestore(&vpci_dev->lock, flags); if (found_dev) @@ -1296,7 +1285,7 @@ index a5b7ece..259e71d 100644 } int pciback_init_devices(struct pciback_device *pdev) -@@ -202,7 +202,7 @@ void pciback_release_devices(struct pciback_device *pdev) +@@ -202,7 +202,7 @@ list_for_each_entry_safe(e, tmp, &vpci_dev->dev_list[slot], list) { list_del(&e->list); @@ -1306,10 +1295,9 @@ index a5b7ece..259e71d 100644 } } diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h -index 12080a3..4a6eba5 100644 --- a/include/linux/pci_ids.h +++ b/include/linux/pci_ids.h -@@ -2495,6 +2495,14 @@ +@@ -2501,6 +2501,14 @@ #define PCI_DEVICE_ID_INTEL_IXP2800 0x9004 #define PCI_DEVICE_ID_INTEL_S21152BB 0xb152 @@ -1325,7 +1313,6 @@ index 12080a3..4a6eba5 100644 #define PCI_DEVICE_ID_SCALEMP_VSMP_CTL 0x1010 diff --git a/include/linux/pci_regs.h b/include/linux/pci_regs.h -index 450684f..97812c6 100644 --- a/include/linux/pci_regs.h +++ b/include/linux/pci_regs.h @@ -210,6 +210,7 @@ @@ -1348,55 +1335,10 @@ index 450684f..97812c6 100644 #define PCI_PM_PPB_EXTENSIONS 6 /* PPB support extensions (??) */ #define PCI_PM_PPB_B2_B3 0x40 /* Stop clock when in D3hot (??) */ #define PCI_PM_BPCC_ENABLE 0x80 /* Bus power/clock control enable (??) */ -@@ -377,6 +383,7 @@ - #define PCI_EXP_DEVCAP_RBER 0x8000 /* Role-Based Error Reporting */ - #define PCI_EXP_DEVCAP_PWR_VAL 0x3fc0000 /* Slot Power Limit Value */ - #define PCI_EXP_DEVCAP_PWR_SCL 0xc000000 /* Slot Power Limit Scale */ -+#define PCI_EXP_DEVCAP_FLR 0x10000000 /* Function Level Reset */ - #define PCI_EXP_DEVCTL 8 /* Device Control */ - #define PCI_EXP_DEVCTL_CERE 0x0001 /* Correctable Error Reporting En. */ - #define PCI_EXP_DEVCTL_NFERE 0x0002 /* Non-Fatal Error Reporting Enable */ -@@ -389,6 +396,7 @@ - #define PCI_EXP_DEVCTL_AUX_PME 0x0400 /* Auxiliary Power PM Enable */ - #define PCI_EXP_DEVCTL_NOSNOOP_EN 0x0800 /* Enable No Snoop */ - #define PCI_EXP_DEVCTL_READRQ 0x7000 /* Max_Read_Request_Size */ -+#define PCI_EXP_DEVCTL_BCR_FLR 0x8000 /* Bridge Configuration Retry / FLR */ - #define PCI_EXP_DEVSTA 10 /* Device Status */ - #define PCI_EXP_DEVSTA_CED 0x01 /* Correctable Error Detected */ - #define PCI_EXP_DEVSTA_NFED 0x02 /* Non-Fatal Error Detected */ -@@ -419,6 +427,10 @@ - #define PCI_EXP_RTCTL_CRSSVE 0x10 /* CRS Software Visibility Enable */ - #define PCI_EXP_RTCAP 30 /* Root Capabilities */ - #define PCI_EXP_RTSTA 32 /* Root Status */ -+#define PCI_EXP_DEVCAP2 36 /* Device Capabilities 2 */ -+#define PCI_EXP_DEVCAP2_ARI 0x20 /* Alternative Routing-ID */ -+#define PCI_EXP_DEVCTL2 40 /* Device Control 2 */ -+#define PCI_EXP_DEVCTL2_ARI 0x20 /* Alternative Routing-ID */ - - /* Extended Capabilities (PCI-X 2.0 and Express) */ - #define PCI_EXT_CAP_ID(header) (header & 0x0000ffff) -@@ -429,6 +441,7 @@ - #define PCI_EXT_CAP_ID_VC 2 - #define PCI_EXT_CAP_ID_DSN 3 - #define PCI_EXT_CAP_ID_PWR 4 -+#define PCI_EXT_CAP_ID_ARI 14 - - /* Advanced Error Reporting */ - #define PCI_ERR_UNCOR_STATUS 4 /* Uncorrectable Error Status */ -@@ -536,5 +549,25 @@ - #define HT_CAPTYPE_GEN3 0xD0 /* Generation 3 hypertransport configuration */ - #define HT_CAPTYPE_PM 0xE0 /* Hypertransport powermanagement configuration */ - -+/* Alternative Routing-ID Interpretation */ -+#define PCI_ARI_CAP 0x04 /* ARI Capability Register */ -+#define PCI_ARI_CAP_MFVC 0x0001 /* MFVC Function Groups Capability */ -+#define PCI_ARI_CAP_ACS 0x0002 /* ACS Function Groups Capability */ -+#define PCI_ARI_CAP_NFN(x) (((x) >> 8) & 0xff) /* Next Function Number */ -+#define PCI_ARI_CTRL 0x06 /* ARI Control Register */ -+#define PCI_ARI_CTRL_MFVC 0x0001 /* MFVC Function Groups Enable */ -+#define PCI_ARI_CTRL_ACS 0x0002 /* ACS Function Groups Enable */ -+#define PCI_ARI_CTRL_FG(x) (((x) >> 4) & 7) /* Function Group */ -+ +@@ -558,6 +564,17 @@ + #define PCI_ARI_CTRL_ACS 0x0002 /* ACS Function Groups Enable */ + #define PCI_ARI_CTRL_FG(x) (((x) >> 4) & 7) /* Function Group */ + +/* Advanced Features Capability */ +#define PCI_AF_LENFLD 0x02 /* Device length offset */ +#define PCI_AF_LENGTH 0x06 @@ -1407,5 +1349,7 @@ index 450684f..97812c6 100644 +#define PCI_AF_CTRL_FLR 0x01 +#define PCI_AF_STA 0x05 /* Device STATUS offset */ +#define PCI_AF_STA_TP 0x01 - - #endif /* LINUX_PCI_REGS_H */ ++ + /* Single Root I/O Virtualization */ + #define PCI_SRIOV_CAP 0x04 /* SR-IOV Capabilities */ + #define PCI_SRIOV_CAP_VFM 0x01 /* VF Migration Capable */ diff --git a/master/revert-balloon-max-target.patch b/master/revert-balloon-max-target.patch new file mode 100644 index 0000000..9ce212e --- /dev/null +++ b/master/revert-balloon-max-target.patch @@ -0,0 +1,75 @@ +diff -r fc29f01f25d7 drivers/xen/balloon/balloon.c +--- a/drivers/xen/balloon/balloon.c Wed Jun 17 11:42:31 2009 +0100 ++++ b/drivers/xen/balloon/balloon.c Wed Jun 17 11:44:15 2009 +0100 +@@ -194,7 +194,7 @@ + return target; + } + +-unsigned long balloon_minimum_target(void) ++static unsigned long minimum_target(void) + { + #ifndef CONFIG_XEN + #define max_pfn num_physpages +@@ -421,7 +421,7 @@ + { + /* No need for lock. Not read-modify-write updates. */ + bs.hard_limit = ~0UL; +- bs.target_pages = max(target, balloon_minimum_target()); ++ bs.target_pages = max(target, minimum_target()); + schedule_work(&balloon_worker); + } + +@@ -496,14 +496,11 @@ + page, + "Current allocation: %8lu kB\n" + "Requested target: %8lu kB\n" +- "Minimum target: %8lu kB\n" +- "Maximum target: %8lu kB\n" + "Low-mem balloon: %8lu kB\n" + "High-mem balloon: %8lu kB\n" + "Driver pages: %8lu kB\n" + "Xen hard limit: ", + PAGES2KB(bs.current_pages), PAGES2KB(bs.target_pages), +- PAGES2KB(balloon_minimum_target()), PAGES2KB(num_physpages), + PAGES2KB(bs.balloon_low), PAGES2KB(bs.balloon_high), + PAGES2KB(bs.driver_pages)); + +diff -r fc29f01f25d7 drivers/xen/balloon/common.h +--- a/drivers/xen/balloon/common.h Wed Jun 17 11:42:31 2009 +0100 ++++ b/drivers/xen/balloon/common.h Wed Jun 17 11:44:15 2009 +0100 +@@ -47,7 +47,6 @@ + unsigned long balloon_high; + }; + +-extern unsigned long num_physpages; + extern struct balloon_stats balloon_stats; + #define bs balloon_stats + +@@ -55,6 +54,5 @@ + void balloon_sysfs_exit(void); + + void balloon_set_new_target(unsigned long target); +-unsigned long balloon_minimum_target(void); + + #endif /* __XEN_BALLOON_COMMON_H__ */ +diff -r fc29f01f25d7 drivers/xen/balloon/sysfs.c +--- a/drivers/xen/balloon/sysfs.c Wed Jun 17 11:42:31 2009 +0100 ++++ b/drivers/xen/balloon/sysfs.c Wed Jun 17 11:44:15 2009 +0100 +@@ -53,8 +51,6 @@ + static SYSDEV_ATTR(name, S_IRUGO, show_##name, NULL) + + BALLOON_SHOW(current_kb, "%lu\n", PAGES2KB(bs.current_pages)); +-BALLOON_SHOW(min_kb, "%lu\n", PAGES2KB(balloon_minimum_target())); +-BALLOON_SHOW(max_kb, "%lu\n", PAGES2KB(num_physpages)); + BALLOON_SHOW(low_kb, "%lu\n", PAGES2KB(bs.balloon_low)); + BALLOON_SHOW(high_kb, "%lu\n", PAGES2KB(bs.balloon_high)); + BALLOON_SHOW(hard_limit_kb, +@@ -99,8 +94,6 @@ + + static struct attribute *balloon_info_attrs[] = { + &attr_current_kb.attr, +- &attr_min_kb.attr, +- &attr_max_kb.attr, + &attr_low_kb.attr, + &attr_high_kb.attr, + &attr_hard_limit_kb.attr, diff --git a/master/revert-configurable-nr-guest-devices.patch b/master/revert-configurable-nr-guest-devices.patch new file mode 100644 index 0000000..e4f1c04 --- /dev/null +++ b/master/revert-configurable-nr-guest-devices.patch @@ -0,0 +1,68 @@ +diff -r fcc0693d4ebf drivers/xen/Kconfig +--- a/drivers/xen/Kconfig Wed Jun 17 09:23:57 2009 +0100 ++++ b/drivers/xen/Kconfig Wed Jun 17 11:11:42 2009 +0100 +@@ -72,15 +72,6 @@ + The network-device backend driver allows the kernel to export its + network devices to other guests via a high-performance shared-memory + interface. +- +-config XEN_NETDEV_TX_SHIFT +- int "Maximum simultaneous transmit requests (as a power of 2)" +- depends on XEN_NETDEV_BACKEND +- range 5 16 +- default 8 +- help +- The maximum number transmits the driver can hold pending, expressed +- as the exponent of a power of 2. + + config XEN_NETDEV_PIPELINED_TRANSMITTER + bool "Pipelined transmitter (DANGEROUS)" +@@ -264,16 +255,6 @@ + help + Xen hypervisor attributes will show up under /sys/hypervisor/. + +-config XEN_NR_GUEST_DEVICES +- int "Number of guest devices" +- range 0 4032 if 64BIT +- range 0 960 +- default 256 if XEN_BACKEND +- default 16 +- help +- Specify the total number of virtual devices (i.e. both frontend +- and backend) that you want the kernel to be able to service. +- + choice + prompt "Xen version compatibility" + default XEN_COMPAT_030002_AND_LATER +diff -r fcc0693d4ebf drivers/xen/netback/netback.c +--- a/drivers/xen/netback/netback.c Wed Jun 17 09:23:57 2009 +0100 ++++ b/drivers/xen/netback/netback.c Wed Jun 17 11:11:42 2009 +0100 +@@ -71,7 +71,7 @@ + static struct timer_list net_timer; + static struct timer_list netbk_tx_pending_timer; + +-#define MAX_PENDING_REQS (1U << CONFIG_XEN_NETDEV_TX_SHIFT) ++#define MAX_PENDING_REQS 256 + + static struct sk_buff_head rx_queue; + +@@ -1224,7 +1224,6 @@ + net_tx_action_dealloc(); + + mop = tx_map_ops; +- BUILD_BUG_ON(MAX_SKB_FRAGS >= MAX_PENDING_REQS); + while (((NR_PENDING_REQS + MAX_SKB_FRAGS) < MAX_PENDING_REQS) && + !list_empty(&net_schedule_list)) { + /* Get a netif from the list with work to do. */ +diff -r fcc0693d4ebf include/asm-x86/mach-xen/asm/irq_vectors.h +--- a/include/asm-x86/mach-xen/asm/irq_vectors.h Wed Jun 17 09:23:57 2009 +0100 ++++ b/include/asm-x86/mach-xen/asm/irq_vectors.h Wed Jun 17 11:11:42 2009 +0100 +@@ -44,7 +44,7 @@ + #endif + + #define DYNIRQ_BASE (PIRQ_BASE + NR_PIRQS) +-#define NR_DYNIRQS (64 + CONFIG_XEN_NR_GUEST_DEVICES) ++#define NR_DYNIRQS 256 + + #define NR_IRQS (NR_PIRQS + NR_DYNIRQS) + #define NR_IRQ_VECTORS NR_IRQS diff --git a/master/revert-netback-dynirq-accounting.patch b/master/revert-netback-dynirq-accounting.patch new file mode 100644 index 0000000..f742e7d --- /dev/null +++ b/master/revert-netback-dynirq-accounting.patch @@ -0,0 +1,53 @@ +diff -r 59857f1d6c00 drivers/xen/netback/interface.c +--- a/drivers/xen/netback/interface.c Tue Jun 16 15:44:21 2009 +0100 ++++ b/drivers/xen/netback/interface.c Tue Jun 16 16:22:34 2009 +0100 +@@ -280,7 +328,6 @@ + netif->dev->name, netif); + if (err < 0) + goto err_hypervisor; +- BUG_ON(err < DYNIRQ_BASE || err >= DYNIRQ_BASE + NR_DYNIRQS); + netif->irq = err; + disable_irq(netif->irq); + +diff -r 59857f1d6c00 drivers/xen/netback/netback.c +--- a/drivers/xen/netback/netback.c Tue Jun 16 15:44:21 2009 +0100 ++++ b/drivers/xen/netback/netback.c Tue Jun 16 16:22:34 2009 +0100 +@@ -580,12 +576,8 @@ + static mmu_update_t rx_mmu[NET_RX_RING_SIZE]; + static gnttab_transfer_t grant_trans_op[NET_RX_RING_SIZE]; + static gnttab_copy_t grant_copy_op[NET_RX_RING_SIZE]; +- static DECLARE_BITMAP(rx_notify, NR_DYNIRQS); +-#if NR_DYNIRQS <= 0x10000 ++ static unsigned char rx_notify[NR_IRQS]; + static u16 notify_list[NET_RX_RING_SIZE]; +-#else +- static int notify_list[NET_RX_RING_SIZE]; +-#endif + static struct netbk_rx_meta meta[NET_RX_RING_SIZE]; + + struct netrx_pending_operations npo = { +@@ -734,9 +726,11 @@ + nr_frags); + + RING_PUSH_RESPONSES_AND_CHECK_NOTIFY(&netif->rx, ret); +- irq = netif->irq - DYNIRQ_BASE; +- if (ret && !__test_and_set_bit(irq, rx_notify)) ++ irq = netif->irq; ++ if (ret && !rx_notify[irq]) { ++ rx_notify[irq] = 1; + notify_list[notify_nr++] = irq; ++ } + + if (netif_queue_stopped(netif->dev) && + netif_schedulable(netif) && +@@ -750,8 +744,8 @@ + + while (notify_nr != 0) { + irq = notify_list[--notify_nr]; +- __clear_bit(irq, rx_notify); +- notify_remote_via_irq(irq + DYNIRQ_BASE); ++ rx_notify[irq] = 0; ++ notify_remote_via_irq(irq); + } + + /* More work to do? */ diff --git a/master/revert-netback-notify-multiple.patch b/master/revert-netback-notify-multiple.patch new file mode 100644 index 0000000..a337b65 --- /dev/null +++ b/master/revert-netback-notify-multiple.patch @@ -0,0 +1,81 @@ +diff -r 91b096eb5227 drivers/xen/core/evtchn.c +--- a/drivers/xen/core/evtchn.c Wed Jun 17 11:11:47 2009 +0100 ++++ b/drivers/xen/core/evtchn.c Wed Jun 17 11:42:27 2009 +0100 +@@ -1294,21 +1294,6 @@ + } + EXPORT_SYMBOL_GPL(notify_remote_via_irq); + +-int multi_notify_remote_via_irq(multicall_entry_t *mcl, int irq) +-{ +- int evtchn = evtchn_from_irq(irq); +- +- BUG_ON(type_from_irq(irq) == IRQT_VIRQ); +- BUG_IF_IPI(irq); +- +- if (!VALID_EVTCHN(evtchn)) +- return -EINVAL; +- +- multi_notify_remote_via_evtchn(mcl, evtchn); +- return 0; +-} +-EXPORT_SYMBOL_GPL(multi_notify_remote_via_irq); +- + int irq_to_evtchn_port(int irq) + { + BUG_IF_VIRQ_PER_CPU(irq); +diff -r 91b096eb5227 drivers/xen/netback/netback.c +--- a/drivers/xen/netback/netback.c Wed Jun 17 11:11:47 2009 +0100 ++++ b/drivers/xen/netback/netback.c Wed Jun 17 11:42:27 2009 +0100 +@@ -748,20 +748,10 @@ + npo.meta_cons += nr_frags + 1; + } + +- if (notify_nr == 1) { +- irq = *notify_list; ++ while (notify_nr != 0) { ++ irq = notify_list[--notify_nr]; + __clear_bit(irq, rx_notify); + notify_remote_via_irq(irq + DYNIRQ_BASE); +- } else { +- for (count = ret = 0; ret < notify_nr; ++ret) { +- irq = notify_list[ret]; +- __clear_bit(irq, rx_notify); +- if (!multi_notify_remote_via_irq(rx_mcl + count, +- irq + DYNIRQ_BASE)) +- ++count; +- } +- if (HYPERVISOR_multicall(rx_mcl, count)) +- BUG(); + } + + /* More work to do? */ +diff -r 91b096eb5227 include/xen/evtchn.h +--- a/include/xen/evtchn.h Wed Jun 17 11:11:47 2009 +0100 ++++ b/include/xen/evtchn.h Wed Jun 17 11:42:27 2009 +0100 +@@ -179,18 +179,6 @@ + VOID(HYPERVISOR_event_channel_op(EVTCHNOP_send, &send)); + } + +-static inline void +-multi_notify_remote_via_evtchn(multicall_entry_t *mcl, int port) +-{ +- struct evtchn_send *send = (void *)(mcl->args + 2); +- +- BUILD_BUG_ON(sizeof(*send) > sizeof(mcl->args) - 2 * sizeof(*mcl->args)); +- send->port = port; +- mcl->op = __HYPERVISOR_event_channel_op; +- mcl->args[0] = EVTCHNOP_send; +- mcl->args[1] = (unsigned long)send; +-} +- + /* Clear an irq's pending state, in preparation for polling on it. */ + void xen_clear_irq_pending(int irq); + +@@ -209,7 +197,6 @@ + * by bind_*_to_irqhandler(). + */ + void notify_remote_via_irq(int irq); +-int multi_notify_remote_via_irq(multicall_entry_t *, int irq); + int irq_to_evtchn_port(int irq); + + #define PIRQ_SET_MAPPING 0x0 diff --git a/master/revert-vbd-cdrom-extensions.patch b/master/revert-vbd-cdrom-extensions.patch new file mode 100644 index 0000000..6cd5f29 --- /dev/null +++ b/master/revert-vbd-cdrom-extensions.patch @@ -0,0 +1,815 @@ +diff -r 59857f1d6c00 drivers/cdrom/Makefile +--- a/drivers/cdrom/Makefile Tue Jun 16 15:44:21 2009 +0100 ++++ b/drivers/cdrom/Makefile Tue Jun 16 17:07:32 2009 +0100 +@@ -9,7 +9,6 @@ + obj-$(CONFIG_BLK_DEV_SR) += cdrom.o + obj-$(CONFIG_PARIDE_PCD) += cdrom.o + obj-$(CONFIG_CDROM_PKTCDVD) += cdrom.o +-obj-$(CONFIG_XEN_BLKDEV_FRONTEND) += cdrom.o + + obj-$(CONFIG_VIOCD) += viocd.o cdrom.o + obj-$(CONFIG_GDROM) += gdrom.o cdrom.o +diff -r 59857f1d6c00 drivers/xen/blkback/Makefile +--- a/drivers/xen/blkback/Makefile Tue Jun 16 15:44:21 2009 +0100 ++++ b/drivers/xen/blkback/Makefile Tue Jun 16 17:07:32 2009 +0100 +@@ -1,3 +1,3 @@ + obj-$(CONFIG_XEN_BLKDEV_BACKEND) := blkbk.o + +-blkbk-y := blkback.o xenbus.o interface.o vbd.o cdrom.o ++blkbk-y := blkback.o xenbus.o interface.o vbd.o +diff -r 59857f1d6c00 drivers/xen/blkback/cdrom.c +--- a/drivers/xen/blkback/cdrom.c Tue Jun 16 15:44:21 2009 +0100 ++++ /dev/null Thu Jan 01 00:00:00 1970 +0000 +@@ -1,162 +0,0 @@ +-/****************************************************************************** +- * blkback/cdrom.c +- * +- * Routines for managing cdrom watch and media-present attribute of a +- * cdrom type virtual block device (VBD). +- * +- * Copyright (c) 2003-2005, Keir Fraser & Steve Hand +- * Copyright (c) 2007 Pat Campbell +- * +- * 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; or, when distributed +- * separately from the Linux kernel or incorporated into other +- * software packages, subject to the following license: +- * +- * Permission is hereby granted, free of charge, to any person obtaining a copy +- * of this source file (the "Software"), to deal in the Software without +- * restriction, including without limitation the rights to use, copy, modify, +- * merge, publish, distribute, sublicense, and/or sell copies of the Software, +- * and to permit persons to whom the Software is furnished to do so, subject to +- * the following conditions: +- * +- * The above copyright notice and this permission notice shall be included in +- * all copies or substantial portions of the Software. +- * +- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +- * IN THE SOFTWARE. +- */ +- +-#include "common.h" +- +-#undef DPRINTK +-#define DPRINTK(_f, _a...) \ +- printk("(%s() file=%s, line=%d) " _f "\n", \ +- __PRETTY_FUNCTION__, __FILE__ , __LINE__ , ##_a ) +- +- +-#define MEDIA_PRESENT "media-present" +- +-static void cdrom_media_changed(struct xenbus_watch *, const char **, unsigned int); +- +-/** +- * Writes media-present=1 attribute for the given vbd device if not +- * already there +- */ +-static int cdrom_xenstore_write_media_present(struct backend_info *be) +-{ +- struct xenbus_device *dev = be->dev; +- struct xenbus_transaction xbt; +- int err; +- int media_present; +- +- err = xenbus_scanf(XBT_NIL, dev->nodename, MEDIA_PRESENT, "%d", +- &media_present); +- if (0 < err) { +- DPRINTK("already written err%d", err); +- return(0); +- } +- media_present = 1; +- +-again: +- err = xenbus_transaction_start(&xbt); +- if (err) { +- xenbus_dev_fatal(dev, err, "starting transaction"); +- return(-1); +- } +- +- err = xenbus_printf(xbt, dev->nodename, MEDIA_PRESENT, "%d", media_present ); +- if (err) { +- xenbus_dev_fatal(dev, err, "writing %s/%s", +- dev->nodename, MEDIA_PRESENT); +- goto abort; +- } +- err = xenbus_transaction_end(xbt, 0); +- if (err == -EAGAIN) +- goto again; +- if (err) +- xenbus_dev_fatal(dev, err, "ending transaction"); +- return 0; +- abort: +- xenbus_transaction_end(xbt, 1); +- return -1; +-} +- +-/** +- * +- */ +-static int cdrom_is_type(struct backend_info *be) +-{ +- DPRINTK("type:%x", be->blkif->vbd.type ); +- return (be->blkif->vbd.type & VDISK_CDROM) +- && (be->blkif->vbd.type & GENHD_FL_REMOVABLE); +-} +- +-/** +- * +- */ +-void cdrom_add_media_watch(struct backend_info *be) +-{ +- struct xenbus_device *dev = be->dev; +- int err; +- +- DPRINTK("nodename:%s", dev->nodename); +- if (cdrom_is_type(be)) { +- DPRINTK("is a cdrom"); +- if ( cdrom_xenstore_write_media_present(be) == 0 ) { +- DPRINTK( "xenstore wrote OK"); +- err = xenbus_watch_path2(dev, dev->nodename, MEDIA_PRESENT, +- &be->backend_cdrom_watch, +- cdrom_media_changed); +- if (err) +- DPRINTK( "media_present watch add failed" ); +- } +- } +-} +- +-/** +- * Callback received when the "media_present" xenstore node is changed +- */ +-static void cdrom_media_changed(struct xenbus_watch *watch, +- const char **vec, unsigned int len) +-{ +- int err; +- unsigned media_present; +- struct backend_info *be +- = container_of(watch, struct backend_info, backend_cdrom_watch); +- struct xenbus_device *dev = be->dev; +- +- if (!cdrom_is_type(be)) { +- DPRINTK("callback not for a cdrom" ); +- return; +- } +- +- err = xenbus_scanf(XBT_NIL, dev->nodename, MEDIA_PRESENT, "%d", +- &media_present); +- if (err == 0 || err == -ENOENT) { +- DPRINTK("xenbus_read of cdrom media_present node error:%d",err); +- return; +- } +- +- if (media_present == 0) +- vbd_free(&be->blkif->vbd); +- else { +- char *p = strrchr(dev->otherend, '/') + 1; +- long handle = simple_strtoul(p, NULL, 0); +- +- if (!be->blkif->vbd.bdev) { +- err = vbd_create(be->blkif, handle, be->major, be->minor, +- !strchr(be->mode, 'w'), 1); +- if (err) { +- be->major = be->minor = 0; +- xenbus_dev_fatal(dev, err, "creating vbd structure"); +- return; +- } +- } +- } +-} +diff -r 59857f1d6c00 drivers/xen/blkback/common.h +--- a/drivers/xen/blkback/common.h Tue Jun 16 15:44:21 2009 +0100 ++++ b/drivers/xen/blkback/common.h Tue Jun 16 17:07:32 2009 +0100 +@@ -97,17 +97,6 @@ + grant_ref_t shmem_ref; + } blkif_t; + +-struct backend_info +-{ +- struct xenbus_device *dev; +- blkif_t *blkif; +- struct xenbus_watch backend_watch; +- struct xenbus_watch backend_cdrom_watch; +- unsigned major; +- unsigned minor; +- char *mode; +-}; +- + blkif_t *blkif_alloc(domid_t domid); + void blkif_disconnect(blkif_t *blkif); + void blkif_free(blkif_t *blkif); +@@ -148,7 +137,4 @@ + int blkback_barrier(struct xenbus_transaction xbt, + struct backend_info *be, int state); + +-/* cdrom media change */ +-void cdrom_add_media_watch(struct backend_info *be); +- + #endif /* __BLKIF__BACKEND__COMMON_H__ */ +diff -r 59857f1d6c00 drivers/xen/blkback/vbd.c +--- a/drivers/xen/blkback/vbd.c Tue Jun 16 15:44:21 2009 +0100 ++++ b/drivers/xen/blkback/vbd.c Tue Jun 16 17:07:32 2009 +0100 +@@ -106,9 +106,6 @@ + if ((operation != READ) && vbd->readonly) + goto out; + +- if (vbd->bdev == NULL) +- goto out; +- + if (unlikely((req->sector_number + req->nr_sects) > vbd_sz(vbd))) + goto out; + +diff -r 59857f1d6c00 drivers/xen/blkback/xenbus.c +--- a/drivers/xen/blkback/xenbus.c Tue Jun 16 15:44:21 2009 +0100 ++++ b/drivers/xen/blkback/xenbus.c Tue Jun 16 17:07:32 2009 +0100 +@@ -27,6 +27,16 @@ + #define DPRINTK(fmt, args...) \ + pr_debug("blkback/xenbus (%s:%d) " fmt ".\n", \ + __FUNCTION__, __LINE__, ##args) ++ ++struct backend_info ++{ ++ struct xenbus_device *dev; ++ blkif_t *blkif; ++ struct xenbus_watch backend_watch; ++ unsigned major; ++ unsigned minor; ++ char *mode; ++}; + + static void connect(struct backend_info *); + static int connect_ring(struct backend_info *); +@@ -173,12 +183,6 @@ + be->backend_watch.node = NULL; + } + +- if (be->backend_cdrom_watch.node) { +- unregister_xenbus_watch(&be->backend_cdrom_watch); +- kfree(be->backend_cdrom_watch.node); +- be->backend_cdrom_watch.node = NULL; +- } +- + if (be->blkif) { + blkif_disconnect(be->blkif); + vbd_free(&be->blkif->vbd); +@@ -335,9 +339,6 @@ + + /* We're potentially connected now */ + update_blkif_status(be->blkif); +- +- /* Add watch for cdrom media status if necessay */ +- cdrom_add_media_watch(be); + } + } + +diff -r 59857f1d6c00 drivers/xen/blkfront/Makefile +--- a/drivers/xen/blkfront/Makefile Tue Jun 16 15:44:21 2009 +0100 ++++ b/drivers/xen/blkfront/Makefile Tue Jun 16 17:07:32 2009 +0100 +@@ -1,5 +1,5 @@ + + obj-$(CONFIG_XEN_BLKDEV_FRONTEND) := xenblk.o + +-xenblk-objs := blkfront.o vbd.o vcd.o ++xenblk-objs := blkfront.o vbd.o + +diff -r 59857f1d6c00 drivers/xen/blkfront/blkfront.c +--- a/drivers/xen/blkfront/blkfront.c Tue Jun 16 15:44:21 2009 +0100 ++++ b/drivers/xen/blkfront/blkfront.c Tue Jun 16 17:07:32 2009 +0100 +@@ -375,8 +375,6 @@ + add_disk(info->gd); + + info->is_ready = 1; +- +- register_vcd(info); + } + + /** +@@ -406,8 +404,6 @@ + flush_scheduled_work(); + + xlvbd_sysfs_delif(info); +- +- unregister_vcd(info); + + xlvbd_del(info); + +diff -r 59857f1d6c00 drivers/xen/blkfront/block.h +--- a/drivers/xen/blkfront/block.h Tue Jun 16 15:44:21 2009 +0100 ++++ b/drivers/xen/blkfront/block.h Tue Jun 16 17:07:32 2009 +0100 +@@ -155,8 +155,4 @@ + } + #endif + +-/* Virtual cdrom block-device */ +-extern void register_vcd(struct blkfront_info *info); +-extern void unregister_vcd(struct blkfront_info *info); +- + #endif /* __XEN_DRIVERS_BLOCK_H__ */ +diff -r 59857f1d6c00 drivers/xen/blkfront/vbd.c +--- a/drivers/xen/blkfront/vbd.c Tue Jun 16 15:44:21 2009 +0100 ++++ b/drivers/xen/blkfront/vbd.c Tue Jun 16 17:07:32 2009 +0100 +@@ -281,8 +281,7 @@ + goto out; + info->mi = mi; + +- if (!(vdisk_info & VDISK_CDROM) && +- (minor & ((1 << mi->type->partn_shift) - 1)) == 0) ++ if ((minor & ((1 << mi->type->partn_shift) - 1)) == 0) + nr_minors = 1 << mi->type->partn_shift; + + gd = alloc_disk(nr_minors); +@@ -291,7 +290,7 @@ + + offset = mi->index * mi->type->disks_per_major + + (minor >> mi->type->partn_shift); +- if (nr_minors > 1 || (vdisk_info & VDISK_CDROM)) { ++ if (nr_minors > 1) { + if (offset < 26) { + sprintf(gd->disk_name, "%s%c", + mi->type->diskname, 'a' + offset ); +diff -r 59857f1d6c00 drivers/xen/blkfront/vcd.c +--- a/drivers/xen/blkfront/vcd.c Tue Jun 16 15:44:21 2009 +0100 ++++ /dev/null Thu Jan 01 00:00:00 1970 +0000 +@@ -1,476 +0,0 @@ +-/******************************************************************************* +-* vcd.c +-* +-* Implements CDROM cmd packet passing between frontend guest and backend driver. +-* +-* Copyright (c) 2008, Pat Campell plc@novell.com +-* +-* Permission is hereby granted, free of charge, to any person obtaining a copy +-* of this source file (the "Software"), to deal in the Software without +-* restriction, including without limitation the rights to use, copy, modify, +-* merge, publish, distribute, sublicense, and/or sell copies of the Software, +-* and to permit persons to whom the Software is furnished to do so, subject to +-* the following conditions: +-* +-* The above copyright notice and this permission notice shall be included in +-* all copies or substantial portions of the Software. +-* +-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +-* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +-* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +-* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +-* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +-* IN THE SOFTWARE. +-*/ +- +-#define REVISION "$Revision: 1.0 $" +- +-#include +-#include +-#include +-#include +-#include +-#include "block.h" +- +-/* List of cdrom_device_info, can have as many as blkfront supports */ +-struct vcd_disk { +- struct list_head vcd_entry; +- struct cdrom_device_info vcd_cdrom_info; +- spinlock_t vcd_cdrom_info_lock; +-}; +-static LIST_HEAD(vcd_disks); +-static DEFINE_SPINLOCK(vcd_disks_lock); +- +-static struct vcd_disk * xencdrom_get_list_entry(struct gendisk *disk) +-{ +- struct vcd_disk * ret_vcd = NULL; +- struct vcd_disk * vcd; +- +- spin_lock(&vcd_disks_lock); +- list_for_each_entry(vcd, &vcd_disks, vcd_entry) { +- if (vcd->vcd_cdrom_info.disk == disk) { +- spin_lock(&vcd->vcd_cdrom_info_lock); +- ret_vcd = vcd; +- break; +- } +- } +- spin_unlock(&vcd_disks_lock); +- return ret_vcd; +-} +- +-static void submit_message(struct blkfront_info *info, void * sp) +-{ +- struct request *req = NULL; +- +- req = blk_get_request(info->rq, READ, __GFP_WAIT); +- if (blk_rq_map_kern(info->rq, req, sp, PAGE_SIZE, __GFP_WAIT)) +- goto out; +- +- req->rq_disk = info->gd; +-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,18) +- req->cmd_type = REQ_TYPE_BLOCK_PC; +- req->cmd_flags |= REQ_NOMERGE; +-#else +- req->flags |= REQ_BLOCK_PC; +-#endif +- req->sector = 0; +- req->nr_sectors = 1; +- req->timeout = 60*HZ; +- +- blk_execute_rq(req->q, info->gd, req, 1); +- +-out: +- blk_put_request(req); +-} +- +-static int submit_cdrom_cmd(struct blkfront_info *info, +- struct packet_command * cgc) +-{ +- int ret = 0; +- struct page *page; +- size_t size; +- union xen_block_packet *sp; +- struct xen_cdrom_packet *xcp; +- struct vcd_generic_command * vgc; +- +- if (cgc->buffer && cgc->buflen > MAX_PACKET_DATA) { +- printk(KERN_WARNING "%s() Packet buffer length is to large \n", __func__); +- return -EIO; +- } +- +- page = alloc_page(GFP_NOIO); +- if (!page) { +- printk(KERN_CRIT "%s() Unable to allocate page\n", __func__); +- return -ENOMEM; +- } +- +- size = PAGE_SIZE; +- memset(page_address(page), 0, PAGE_SIZE); +- sp = page_address(page); +- xcp = &(sp->xcp); +- xcp->type = XEN_TYPE_CDROM_PACKET; +- xcp->payload_offset = PACKET_PAYLOAD_OFFSET; +- +- vgc = (struct vcd_generic_command *)((char *)sp + xcp->payload_offset); +- memcpy(vgc->cmd, cgc->cmd, CDROM_PACKET_SIZE); +- vgc->stat = cgc->stat; +- vgc->data_direction = cgc->data_direction; +- vgc->quiet = cgc->quiet; +- vgc->timeout = cgc->timeout; +- if (cgc->sense) { +- vgc->sense_offset = PACKET_SENSE_OFFSET; +- memcpy((char *)sp + vgc->sense_offset, cgc->sense, sizeof(struct request_sense)); +- } +- if (cgc->buffer) { +- vgc->buffer_offset = PACKET_BUFFER_OFFSET; +- memcpy((char *)sp + vgc->buffer_offset, cgc->buffer, cgc->buflen); +- vgc->buflen = cgc->buflen; +- } +- +- submit_message(info,sp); +- +- if (xcp->ret) +- ret = xcp->err; +- +- if (cgc->sense) { +- memcpy(cgc->sense, (char *)sp + PACKET_SENSE_OFFSET, sizeof(struct request_sense)); +- } +- if (cgc->buffer && cgc->buflen) { +- memcpy(cgc->buffer, (char *)sp + PACKET_BUFFER_OFFSET, cgc->buflen); +- } +- +- __free_page(page); +- return ret; +-} +- +- +-static int xencdrom_open(struct cdrom_device_info *cdi, int purpose) +-{ +- int ret = 0; +- struct page *page; +- struct blkfront_info *info; +- union xen_block_packet *sp; +- struct xen_cdrom_open *xco; +- +- info = cdi->disk->private_data; +- +- if (strlen(info->xbdev->otherend) > MAX_PACKET_DATA) { +- return -EIO; +- } +- +- page = alloc_page(GFP_NOIO); +- if (!page) { +- printk(KERN_CRIT "%s() Unable to allocate page\n", __func__); +- return -ENOMEM; +- } +- +- memset(page_address(page), 0, PAGE_SIZE); +- sp = page_address(page); +- xco = &(sp->xco); +- xco->type = XEN_TYPE_CDROM_OPEN; +- xco->payload_offset = sizeof(struct xen_cdrom_open); +- strcpy((char *)sp + xco->payload_offset, info->xbdev->otherend); +- +- submit_message(info,sp); +- +- if (xco->ret) { +- ret = xco->err; +- goto out; +- } +- +- if (xco->media_present) +- set_capacity(cdi->disk, xco->sectors); +- +-out: +- __free_page(page); +- return ret; +-} +- +-static void xencdrom_release(struct cdrom_device_info *cdi) +-{ +-} +- +-static int xencdrom_media_changed(struct cdrom_device_info *cdi, int disc_nr) +-{ +- int ret; +- struct page *page; +- struct blkfront_info *info; +- union xen_block_packet *sp; +- struct xen_cdrom_media_changed *xcmc; +- +- info = cdi->disk->private_data; +- +- page = alloc_page(GFP_NOIO); +- if (!page) { +- printk(KERN_CRIT "%s() Unable to allocate page\n", __func__); +- return -ENOMEM; +- } +- +- memset(page_address(page), 0, PAGE_SIZE); +- sp = page_address(page); +- xcmc = &(sp->xcmc); +- xcmc->type = XEN_TYPE_CDROM_MEDIA_CHANGED; +- submit_message(info,sp); +- ret = xcmc->media_changed; +- +- __free_page(page); +- +- return ret; +-} +- +-static int xencdrom_tray_move(struct cdrom_device_info *cdi, int position) +-{ +- int ret; +- struct packet_command cgc; +- struct blkfront_info *info; +- +- info = cdi->disk->private_data; +- init_cdrom_command(&cgc, NULL, 0, CGC_DATA_NONE); +- cgc.cmd[0] = GPCMD_START_STOP_UNIT; +- if (position) +- cgc.cmd[4] = 2; +- else +- cgc.cmd[4] = 3; +- ret = submit_cdrom_cmd(info, &cgc); +- return ret; +-} +- +-static int xencdrom_lock_door(struct cdrom_device_info *cdi, int lock) +-{ +- int ret = 0; +- struct blkfront_info *info; +- struct packet_command cgc; +- +- info = cdi->disk->private_data; +- init_cdrom_command(&cgc, NULL, 0, CGC_DATA_NONE); +- cgc.cmd[0] = GPCMD_PREVENT_ALLOW_MEDIUM_REMOVAL; +- cgc.cmd[4] = lock; +- ret = submit_cdrom_cmd(info, &cgc); +- return ret; +-} +- +-static int xencdrom_packet(struct cdrom_device_info *cdi, +- struct packet_command *cgc) +-{ +- int ret = -EIO; +- struct blkfront_info *info; +- +- info = cdi->disk->private_data; +- ret = submit_cdrom_cmd(info, cgc); +- cgc->stat = ret; +- return ret; +-} +- +-static int xencdrom_audio_ioctl(struct cdrom_device_info *cdi, unsigned int cmd, +- void *arg) +-{ +- return -EINVAL; +-} +- +-/* Query backend to see if CDROM packets are supported */ +-static int xencdrom_supported(struct blkfront_info *info) +-{ +- struct page *page; +- union xen_block_packet *sp; +- struct xen_cdrom_support *xcs; +- +- page = alloc_page(GFP_NOIO); +- if (!page) { +- printk(KERN_CRIT "%s() Unable to allocate page\n", __func__); +- return -ENOMEM; +- } +- +- memset(page_address(page), 0, PAGE_SIZE); +- sp = page_address(page); +- xcs = &(sp->xcs); +- xcs->type = XEN_TYPE_CDROM_SUPPORT; +- submit_message(info,sp); +- return xcs->supported; +-} +- +-static struct cdrom_device_ops xencdrom_dops = { +- .open = xencdrom_open, +- .release = xencdrom_release, +- .media_changed = xencdrom_media_changed, +- .tray_move = xencdrom_tray_move, +- .lock_door = xencdrom_lock_door, +- .generic_packet = xencdrom_packet, +- .audio_ioctl = xencdrom_audio_ioctl, +- .capability = (CDC_CLOSE_TRAY | CDC_OPEN_TRAY | CDC_LOCK | \ +- CDC_MEDIA_CHANGED | CDC_GENERIC_PACKET | CDC_DVD | \ +- CDC_CD_R), +- .n_minors = 1, +-}; +- +-static int xencdrom_block_open(struct inode *inode, struct file *file) +-{ +- struct blkfront_info *info = inode->i_bdev->bd_disk->private_data; +- struct vcd_disk * vcd; +- int ret = 0; +- +- if ((vcd = xencdrom_get_list_entry(info->gd))) { +- ret = cdrom_open(&vcd->vcd_cdrom_info, inode, file); +- info->users = vcd->vcd_cdrom_info.use_count; +- spin_unlock(&vcd->vcd_cdrom_info_lock); +- } +- return ret; +-} +- +-static int xencdrom_block_release(struct inode *inode, struct file *file) +-{ +- struct blkfront_info *info = inode->i_bdev->bd_disk->private_data; +- struct vcd_disk * vcd; +- int ret = 0; +- +- if ((vcd = xencdrom_get_list_entry(info->gd))) { +- ret = cdrom_release(&vcd->vcd_cdrom_info, file); +- spin_unlock(&vcd->vcd_cdrom_info_lock); +- if (vcd->vcd_cdrom_info.use_count == 0) { +- info->users = 1; +- blkif_release(inode, file); +- } +- } +- return ret; +-} +- +-static int xencdrom_block_ioctl(struct inode *inode, struct file *file, +- unsigned cmd, unsigned long arg) +-{ +- struct blkfront_info *info = inode->i_bdev->bd_disk->private_data; +- struct vcd_disk * vcd; +- int ret = 0; +- +- if (!(vcd = xencdrom_get_list_entry(info->gd))) +- goto out; +- +- switch (cmd) { +- case 2285: /* SG_IO */ +- ret = -ENOSYS; +- break; +- case CDROMEJECT: +- ret = xencdrom_tray_move(&vcd->vcd_cdrom_info, 1); +- break; +- case CDROMCLOSETRAY: +- ret = xencdrom_tray_move(&vcd->vcd_cdrom_info, 0); +- break; +- case CDROM_GET_CAPABILITY: +- ret = vcd->vcd_cdrom_info.ops->capability & ~vcd->vcd_cdrom_info.mask; +- break; +- case CDROM_SET_OPTIONS: +- ret = vcd->vcd_cdrom_info.options; +- break; +- case CDROM_SEND_PACKET: +- { +- struct packet_command * cgc = (struct packet_command *)arg; +- ret = submit_cdrom_cmd(info, cgc); +- } +- break; +- default: +- /* Not supported, augment supported above if necessary */ +- printk( "%s():%d Unsupported IOCTL:%x \n", __func__, __LINE__, cmd); +- ret = -ENOTTY; +- break; +- } +- spin_unlock(&vcd->vcd_cdrom_info_lock); +-out: +- return ret; +-} +- +-/* Called as result of cdrom_open, vcd_cdrom_info_lock already held */ +-static int xencdrom_block_media_changed(struct gendisk *disk) +-{ +- struct vcd_disk * vcd; +- struct vcd_disk * ret_vcd = NULL; +- int ret = 0; +- +- spin_lock(&vcd_disks_lock); +- list_for_each_entry(vcd, &vcd_disks, vcd_entry) { +- if (vcd->vcd_cdrom_info.disk == disk) { +- ret_vcd = vcd; +- break; +- } +- } +- spin_unlock(&vcd_disks_lock); +- if (ret_vcd) { +- ret = cdrom_media_changed(&ret_vcd->vcd_cdrom_info); +- } +- return ret; +-} +- +-static struct block_device_operations xencdrom_bdops = +-{ +- .owner = THIS_MODULE, +- .open = xencdrom_block_open, +- .release = xencdrom_block_release, +- .ioctl = xencdrom_block_ioctl, +- .media_changed = xencdrom_block_media_changed, +-}; +- +-void register_vcd(struct blkfront_info *info) +-{ +- struct gendisk * gd = info->gd; +- struct vcd_disk * vcd; +- +- /* Make sure this is for a CD device */ +- if (!(gd->flags & GENHD_FL_CD)) +- goto out; +- +- /* Make sure we have backend support */ +- if (!xencdrom_supported(info)) { +- goto out; +- } +- +- /* Create new vcd_disk and fill in cdrom_info */ +- vcd = (struct vcd_disk *)kzalloc(sizeof(struct vcd_disk), GFP_KERNEL); +- if (!vcd) { +- printk(KERN_INFO "%s(): Unable to allocate vcd struct!\n", __func__); +- goto out; +- } +- spin_lock_init(&vcd->vcd_cdrom_info_lock); +- +- vcd->vcd_cdrom_info.ops = &xencdrom_dops; +- vcd->vcd_cdrom_info.speed = 4; +- vcd->vcd_cdrom_info.capacity = 1; +- vcd->vcd_cdrom_info.options = 0; +- strcpy(vcd->vcd_cdrom_info.name, gd->disk_name); +- vcd->vcd_cdrom_info.mask = ( CDC_CD_RW | CDC_DVD_R | CDC_DVD_RAM | +- CDC_SELECT_DISC | CDC_SELECT_SPEED | +- CDC_MRW | CDC_MRW_W | CDC_RAM); +- +- if (register_cdrom(&(vcd->vcd_cdrom_info)) != 0) { +- printk(KERN_WARNING "%s() Cannot register blkdev as a cdrom %d!\n", __func__, +- gd->major); +- goto err_out; +- } +- xencdrom_bdops.owner = gd->fops->owner; +- gd->fops = &xencdrom_bdops; +- vcd->vcd_cdrom_info.disk = gd; +- +- spin_lock(&vcd_disks_lock); +- list_add(&(vcd->vcd_entry), &vcd_disks); +- spin_unlock(&vcd_disks_lock); +-out: +- return; +-err_out: +- kfree(vcd); +-} +- +-void unregister_vcd(struct blkfront_info *info) { +- struct gendisk * gd = info->gd; +- struct vcd_disk * vcd; +- +- spin_lock(&vcd_disks_lock); +- list_for_each_entry(vcd, &vcd_disks, vcd_entry) { +- if (vcd->vcd_cdrom_info.disk == gd) { +- spin_lock(&vcd->vcd_cdrom_info_lock); +- unregister_cdrom(&vcd->vcd_cdrom_info); +- list_del(&vcd->vcd_entry); +- spin_unlock(&vcd->vcd_cdrom_info_lock); +- kfree(vcd); +- break; +- } +- } +- spin_unlock(&vcd_disks_lock); +-} +- diff --git a/master/revert-vbd-packet-extensions.patch b/master/revert-vbd-packet-extensions.patch new file mode 100644 index 0000000..dd93402 --- /dev/null +++ b/master/revert-vbd-packet-extensions.patch @@ -0,0 +1,141 @@ +diff -r 4f3178e31a6d drivers/xen/blkback/blkback.c +--- a/drivers/xen/blkback/blkback.c Tue Jun 16 17:19:06 2009 +0100 ++++ b/drivers/xen/blkback/blkback.c Tue Jun 16 17:20:13 2009 +0100 +@@ -192,15 +192,13 @@ + + static void print_stats(blkif_t *blkif) + { +- printk(KERN_DEBUG "%s: oo %3d | rd %4d | wr %4d | br %4d | pk %4d\n", ++ printk(KERN_DEBUG "%s: oo %3d | rd %4d | wr %4d | br %4d\n", + current->comm, blkif->st_oo_req, +- blkif->st_rd_req, blkif->st_wr_req, blkif->st_br_req, +- blkif->st_pk_req); ++ blkif->st_rd_req, blkif->st_wr_req, blkif->st_br_req); + blkif->st_print = jiffies + msecs_to_jiffies(10 * 1000); + blkif->st_rd_req = 0; + blkif->st_wr_req = 0; + blkif->st_oo_req = 0; +- blkif->st_pk_req = 0; + } + + int blkif_schedule(void *arg) +@@ -359,13 +357,6 @@ + case BLKIF_OP_WRITE: + blkif->st_wr_req++; + dispatch_rw_block_io(blkif, &req, pending_req); +- break; +- case BLKIF_OP_PACKET: +- DPRINTK("error: block operation BLKIF_OP_PACKET not implemented\n"); +- blkif->st_pk_req++; +- make_response(blkif, req.id, req.operation, +- BLKIF_RSP_ERROR); +- free_req(pending_req); + break; + default: + /* A good sign something is wrong: sleep for a while to +diff -r 4f3178e31a6d drivers/xen/blkback/common.h +--- a/drivers/xen/blkback/common.h Tue Jun 16 17:19:06 2009 +0100 ++++ b/drivers/xen/blkback/common.h Tue Jun 16 17:20:13 2009 +0100 +@@ -87,7 +87,6 @@ + int st_wr_req; + int st_oo_req; + int st_br_req; +- int st_pk_req; + int st_rd_sect; + int st_wr_sect; + +diff -r 4f3178e31a6d drivers/xen/blkfront/blkfront.c +--- a/drivers/xen/blkfront/blkfront.c Tue Jun 16 17:19:06 2009 +0100 ++++ b/drivers/xen/blkfront/blkfront.c Tue Jun 16 17:20:13 2009 +0100 +@@ -624,8 +624,6 @@ + BLKIF_OP_WRITE : BLKIF_OP_READ; + if (blk_barrier_rq(req)) + ring_req->operation = BLKIF_OP_WRITE_BARRIER; +- if (blk_pc_request(req)) +- ring_req->operation = BLKIF_OP_PACKET; + + ring_req->nr_segments = blk_rq_map_sg(req->q, req, info->sg); + BUG_ON(ring_req->nr_segments > BLKIF_MAX_SEGMENTS_PER_REQUEST); +@@ -677,7 +675,7 @@ + + while ((req = elv_next_request(rq)) != NULL) { + info = req->rq_disk->private_data; +- if (!blk_fs_request(req) && !blk_pc_request(req)) { ++ if (!blk_fs_request(req)) { + end_request(req, 0); + continue; + } +@@ -754,7 +752,6 @@ + /* fall through */ + case BLKIF_OP_READ: + case BLKIF_OP_WRITE: +- case BLKIF_OP_PACKET: + if (unlikely(bret->status != BLKIF_RSP_OKAY)) + DPRINTK("Bad return from blkdev data " + "request: %x\n", bret->status); +diff -r 4f3178e31a6d drivers/xen/blktap/blktap.c +--- a/drivers/xen/blktap/blktap.c Tue Jun 16 17:19:06 2009 +0100 ++++ b/drivers/xen/blktap/blktap.c Tue Jun 16 17:20:13 2009 +0100 +@@ -1089,14 +1089,13 @@ + + static void print_stats(blkif_t *blkif) + { +- printk(KERN_DEBUG "%s: oo %3d | rd %4d | wr %4d | pk %4d\n", ++ printk(KERN_DEBUG "%s: oo %3d | rd %4d | wr %4d\n", + current->comm, blkif->st_oo_req, +- blkif->st_rd_req, blkif->st_wr_req, blkif->st_pk_req); ++ blkif->st_rd_req, blkif->st_wr_req); + blkif->st_print = jiffies + msecs_to_jiffies(10 * 1000); + blkif->st_rd_req = 0; + blkif->st_wr_req = 0; + blkif->st_oo_req = 0; +- blkif->st_pk_req = 0; + } + + int tap_blkif_schedule(void *arg) +@@ -1332,11 +1331,6 @@ + dispatch_rw_block_io(blkif, &req, pending_req); + break; + +- case BLKIF_OP_PACKET: +- blkif->st_pk_req++; +- dispatch_rw_block_io(blkif, &req, pending_req); +- break; +- + default: + /* A good sign something is wrong: sleep for a while to + * avoid excessive CPU consumption by a bad guest. */ +@@ -1376,8 +1370,6 @@ + struct mm_struct *mm; + + switch (req->operation) { +- case BLKIF_OP_PACKET: +- /* Fall through */ + case BLKIF_OP_READ: + operation = READ; + break; +diff -r 4f3178e31a6d drivers/xen/blktap/common.h +--- a/drivers/xen/blktap/common.h Tue Jun 16 17:19:06 2009 +0100 ++++ b/drivers/xen/blktap/common.h Tue Jun 16 17:20:13 2009 +0100 +@@ -75,7 +75,6 @@ + int st_rd_req; + int st_wr_req; + int st_oo_req; +- int st_pk_req; + int st_rd_sect; + int st_wr_sect; + +diff -r 4f3178e31a6d include/xen/interface/io/blkif.h +--- a/include/xen/interface/io/blkif.h Tue Jun 16 17:19:06 2009 +0100 ++++ b/include/xen/interface/io/blkif.h Tue Jun 16 17:20:13 2009 +0100 +@@ -76,10 +76,6 @@ + * "feature-flush-cache" node! + */ + #define BLKIF_OP_FLUSH_DISKCACHE 3 +-/* +- * Device specific command packet contained within the request +- */ +-#define BLKIF_OP_PACKET 4 + + /* + * Maximum scatter/gather segments per request. diff --git a/master/revert-vbd-protocol-hack.patch b/master/revert-vbd-protocol-hack.patch new file mode 100644 index 0000000..e346cbc --- /dev/null +++ b/master/revert-vbd-protocol-hack.patch @@ -0,0 +1,182 @@ +diff -r 59857f1d6c00 drivers/xen/blkback/xenbus.c +--- a/drivers/xen/blkback/xenbus.c Tue Jun 16 15:44:21 2009 +0100 ++++ b/drivers/xen/blkback/xenbus.c Tue Jun 16 16:22:34 2009 +0100 +@@ -21,7 +21,6 @@ + #include + #include + #include "common.h" +-#include "../core/domctl.h" + + #undef DPRINTK + #define DPRINTK(fmt, args...) \ +@@ -488,10 +488,8 @@ + be->blkif->blk_protocol = BLKIF_PROTOCOL_NATIVE; + err = xenbus_gather(XBT_NIL, dev->otherend, "protocol", + "%63s", protocol, NULL); +- if (err) { +- strcpy(protocol, "unspecified"); +- be->blkif->blk_protocol = xen_guest_blkif_protocol(be->blkif->domid); +- } ++ if (err) ++ strcpy(protocol, "unspecified, assuming native"); + else if (0 == strcmp(protocol, XEN_IO_PROTO_ABI_NATIVE)) + be->blkif->blk_protocol = BLKIF_PROTOCOL_NATIVE; + else if (0 == strcmp(protocol, XEN_IO_PROTO_ABI_X86_32)) +diff -r 59857f1d6c00 drivers/xen/blktap/xenbus.c +--- a/drivers/xen/blktap/xenbus.c Tue Jun 16 15:44:21 2009 +0100 ++++ b/drivers/xen/blktap/xenbus.c Tue Jun 16 16:22:34 2009 +0100 +@@ -39,7 +39,6 @@ + #include + #include + #include "common.h" +-#include "../core/domctl.h" + + + struct backend_info +@@ -448,9 +426,7 @@ + be->blkif->blk_protocol = BLKIF_PROTOCOL_NATIVE; + err = xenbus_gather(XBT_NIL, dev->otherend, "protocol", + "%63s", protocol, NULL); +- if (err) { +- strcpy(protocol, "unspecified"); +- be->blkif->blk_protocol = xen_guest_blkif_protocol(be->blkif->domid); +- } ++ if (err) ++ strcpy(protocol, "unspecified, assuming native"); + else if (0 == strcmp(protocol, XEN_IO_PROTO_ABI_NATIVE)) + be->blkif->blk_protocol = BLKIF_PROTOCOL_NATIVE; +diff -r 59857f1d6c00 drivers/xen/core/Makefile +--- a/drivers/xen/core/Makefile Tue Jun 16 15:44:21 2009 +0100 ++++ b/drivers/xen/core/Makefile Tue Jun 16 16:22:34 2009 +0100 +@@ -2,7 +2,7 @@ + # Makefile for the linux kernel. + # + +-obj-y := evtchn.o gnttab.o features.o reboot.o machine_reboot.o firmware.o domctl.o ++obj-y := evtchn.o gnttab.o features.o reboot.o machine_reboot.o firmware.o + + obj-$(CONFIG_PCI) += pci.o + obj-$(CONFIG_PROC_FS) += xen_proc.o +diff -r 59857f1d6c00 drivers/xen/core/domctl.c +--- a/drivers/xen/core/domctl.c Tue Jun 16 15:44:21 2009 +0100 ++++ /dev/null Thu Jan 01 00:00:00 1970 +0000 +@@ -1,113 +0,0 @@ +-/* +- * !!! dirty hack alert !!! +- * +- * Problem: old guests kernels don't have a "protocol" node +- * in the frontend xenstore directory, so mixing +- * 32 and 64bit domains doesn't work. +- * +- * Upstream plans to solve this in the tools, by letting them +- * create a protocol node. Which certainly makes sense. +- * But it isn't trivial and isn't done yet. Too bad. +- * +- * So for the time being we use the get_address_size domctl +- * hypercall for a pretty good guess. Not nice as the domctl +- * hypercall isn't supposed to be used by the kernel. Because +- * we don't want to have dependencies between dom0 kernel and +- * xen kernel versions. Now we have one. Ouch. +- */ +- +-#include +-#include +-#include +-#include +- +-#include "domctl.h" +- +-/* stuff copied from xen/interface/domctl.h, which we can't +- * include directly for the reasons outlined above .... */ +- +-#define XEN_DOMCTL_get_address_size 36 +-typedef struct xen_domctl_address_size { +- uint32_t size; +-} xen_domctl_address_size_t; +- +-typedef __attribute__((aligned(8))) uint64_t uint64_aligned_t; +- +-union xen_domctl { +- /* v4: sles10 sp1: xen 3.0.4 + 32-on-64 patches */ +- struct { +- uint32_t cmd; +- uint32_t interface_version; +- domid_t domain; +- union { +- /* left out lots of other struct xen_domctl_foobar */ +- struct xen_domctl_address_size address_size; +- uint64_t dummy_align; +- uint8_t dummy_pad[128]; +- } u; +- } v4; +- +- /* v5: upstream: xen 3.1 */ +- struct { +- uint32_t cmd; +- uint32_t interface_version; +- domid_t domain; +- union { +- struct xen_domctl_address_size address_size; +- uint64_aligned_t dummy_align; +- uint8_t dummy_pad[128]; +- } u; +- } v5; +-}; +- +-/* The actual code comes here */ +- +-static inline int hypervisor_domctl(void *domctl) +-{ +- return _hypercall1(int, domctl, domctl); +-} +- +-int xen_guest_address_size(int domid) +-{ +- union xen_domctl domctl; +- int low, ret; +- +-#define guest_address_size(ver) do { \ +- memset(&domctl, 0, sizeof(domctl)); \ +- domctl.v##ver.cmd = XEN_DOMCTL_get_address_size; \ +- domctl.v##ver.interface_version = low = ver; \ +- domctl.v##ver.domain = domid; \ +- ret = hypervisor_domctl(&domctl) ?: domctl.v##ver.u.address_size.size; \ +- if (ret == 32 || ret == 64) { \ +- printk("v" #ver " domctl worked ok: dom%d is %d-bit\n", \ +- domid, ret); \ +- return ret; \ +- } \ +-} while (0) +- +- guest_address_size(5); +-#if CONFIG_XEN_COMPAT < 0x030100 +- guest_address_size(4); +-#endif +- +- ret = BITS_PER_LONG; +- printk("v%d...5 domctls failed, assuming dom%d is native: %d\n", +- low, domid, ret); +- +- return ret; +-} +-EXPORT_SYMBOL_GPL(xen_guest_address_size); +- +-int xen_guest_blkif_protocol(int domid) +-{ +- int address_size = xen_guest_address_size(domid); +- +- if (address_size == BITS_PER_LONG) +- return BLKIF_PROTOCOL_NATIVE; +- if (address_size == 32) +- return BLKIF_PROTOCOL_X86_32; +- if (address_size == 64) +- return BLKIF_PROTOCOL_X86_64; +- return BLKIF_PROTOCOL_NATIVE; +-} +-EXPORT_SYMBOL_GPL(xen_guest_blkif_protocol); +diff -r 59857f1d6c00 drivers/xen/core/domctl.h +--- a/drivers/xen/core/domctl.h Tue Jun 16 15:44:21 2009 +0100 ++++ /dev/null Thu Jan 01 00:00:00 1970 +0000 +@@ -1,2 +0,0 @@ +-int xen_guest_address_size(int domid); +-int xen_guest_blkif_protocol(int domid); diff --git a/master/revert-xencons-behaviour b/master/revert-xencons-behaviour index 395d6d2..4378569 100644 --- a/master/revert-xencons-behaviour +++ b/master/revert-xencons-behaviour @@ -35,6 +35,25 @@ diff -r 41d7dc0c8bd8 drivers/xen/console/console.c static int xc_num = -1; /* /dev/xvc0 device number allocated by lanana.org. */ +@@ -84,6 +84,18 @@ + /* /dev/hvc0 device number */ + #define XEN_HVC_MAJOR 229 + #define XEN_HVC_MINOR 0 ++ ++void xencons_early_setup(void) ++{ ++ extern int console_use_vt; ++ ++ if (is_initial_xendomain()) { ++ xc_mode = XC_SERIAL; ++ } else { ++ xc_mode = XC_TTY; ++ console_use_vt = 0; ++ } ++} + + static int __init xencons_setup(char *str) + { diff -r 41d7dc0c8bd8 include/xen/xencons.h --- a/include/xen/xencons.h Fri Jan 30 10:52:39 2009 +0000 +++ b/include/xen/xencons.h Fri Jan 30 10:53:39 2009 +0000 diff --git a/master/series b/master/series index 32f96fd..a8e3cb8 100644 --- a/master/series +++ b/master/series @@ -9,20 +9,31 @@ build-system-integration.patch # Distro patches. # linux-2.6.27.19-5.1.patch +linux-2.6.27.23-0.1.1.patch +revert-vbd-cdrom-extensions.patch +revert-vbd-packet-extensions.patch +revert-vbd-protocol-hack.patch +revert-configurable-nr-guest-devices.patch +revert-netback-notify-multiple.patch +revert-netback-dynirq-accounting.patch +revert-balloon-max-target.patch # # Resynchronise with base 2.6.18-xen tree # -sync-drivers-xen.patch -forward-port-drivers-xen.patch +sync-drivers-xen-blktap.patch +forward-port-drivers-xen-blktap.patch # # Patches imported from OSS linux-2.6.18-xen tree. # +linux-2.6.18-xen.hg-734.412b24a36929 # pciback: error handler for PCIE_AER. +linux-2.6.18-xen.hg-767.78d81e85e8cd # Bind PCI back driver to PCI device specified by "guestdev=". +linux-2.6.18-xen.hg-778.0fadef4d5c46 # pciback: Global 'permissive' module parameter. +linux-2.6.18-xen.hg-792.db9857bb0320 # netback: add ethtool stat to track copied skbs. +linux-2.6.18-xen.hg-793.3aa9b8a7876b # netback: make queue length parameter writeable in sysfs +linux-2.6.18-xen.hg-820.8b86d11a6eb3 # netback: parent sysfs device should be set before registering. linux-2.6.18-xen.hg-832.c0f2f398aa3c # x86: Fix interaction of NTP and dom0->xen time updates -#linux-2.6.18-xen.hg-847.ad4d307bf9ce # net sfc: Update sfc and sfc_resource driver to latest release XXX disabled for 2.6.27-xen port -#linux-2.6.18-xen.hg-848.ab1d4fbbe4bf # netfront accel: Simplify, document, and fix a theoretical bug in use XXX disabled for 2.6.27-xen port -#linux-2.6.18-xen.hg-849.3a4410c4504e # sfc_netfront: Only clear tx_skb when ready for netif_wake_queue XXX disabled for 2.6.27-xen port # # Patches reverted from OSS linux-2.6.18-xen tree. @@ -41,10 +52,39 @@ blktap-dont-count-to-infinity # # Patches from upstream Linux git tree. # -git-c5279dee26c0e8d7c4200993bfc4b540d2469598.patch # ACPI: EC: Add some basic check for ECDT data -git-3e54048691bce3f323fd5460695273be379803b9.patch # ACPI: EC: fix compilation warning git-235c4a59278eb07e61d909f1f0c233733034a8b3.patch # ACPI: EC: Limit workaround for ASUS notebooks even more git-c6cb0e878446c79f42e7833d7bb69ed6bfbb381f.patch # ACPI: EC: Don't trust ECDT tables from ASUS +git-67fd1a731ff1a990d4da7689909317756e50cb4d.patch # net: Add debug info to track down GSO checksum bug +git-93ff68a55aa92180a765d6c51c3303f6200167a6.patch # PCI: make CPU list affinity visible +git-201de56eb22f1ff3f36804bc70cbff220b50f067.patch # PCI: centralize the capabilities code in probe.c +git-58c3a727cb73b75a9104d295f096cca12959a5a5.patch # PCI: support PCIe ARI capability +git-f19aeb1f3638b7bb4ca21eb361f004fac2bfe259.patch # PCI: Add ability to mmap legacy_io on some platforms +git-8dd7f8036c123296fc4214f9d8810eb485570422.patch # PCI: add support for function level reset +git-8113587c2d14d3be2414190845b2e2617c0aa33b.patch # PCI: fix ARI code to be compatible with mixed ARI/non-ARI systems +git-d3a54014e2a94bd37b7dee5e76e03f7bc4fab49a.patch # PCI: Add legacy_io/mem to all busses +git-6a49d8120021897e139641062236215aac5d220e.patch # PCI: enhance pci_ari_enabled() +git-14add80b5120966fe0659d61815b9e9b4b68fdc5.patch # PCI: remove unnecessary arg of pci_update_resource() +git-14add80b5120966fe0659d61815b9e9b4b68fdc5-fixes.patch +git-fde09c6d8f92de0c9f75698a75f0989f2234c517.patch # PCI: define PCI resource names in an 'enum' +git-bc5f5a8277cb353161454b6704b3186ebcf3a2a3.patch # PCI: remove unnecessary condition check in pci_restore_bars() +git-0b400c7ed4d027e02f6231afa39852a2d48e6f25.patch # PCI: export __pci_read_base() +git-3789fa8a2e534523c896a32a9f27f78d52ad7d82.patch # PCI: allow pci_alloc_child_bus() to handle a NULL bridge +git-613e7ed6f72b1a115f7ece8ce1b66cf095de1348.patch # PCI: add a new function to map BAR offsets +git-3fa16fdb48e0d83c2acf46e357548c89891df58b.patch # PCI: cleanup pci_bus_add_devices() +git-876e501ab25dcd683574a5d3d56d8fe450083ed6.patch # PCI: factor pci_bus_add_child() from pci_bus_add_devices() +git-d1b054da8f599905f3c18a218961dcf17f9d5f13.patch # PCI: initialize and release SR-IOV capability +git-8c5cdb6adc6688b9b8fd82ea4a5cf4674dabad79.patch # PCI: restore saved SR-IOV state +git-a28724b0fb909d247229a70761c90bb37b13366a.patch # PCI: reserve bus range for SR-IOV device +git-480b93b7837fb3cf0579a42f4953ac463a5b9e1e.patch # PCI: centralize device setup code +git-dd7cc44d0bcec5e9c42fe52e88dc254ae62eac8d.patch # PCI: add SR-IOV API for Physical Function driver +git-74bb1bcc7dbbc9ddef773bf3395d7ff92aaaad2e.patch # PCI: handle SR-IOV Virtual Function Migration +git-01db4957179c92fda7d9a06e49b7ae56fb7c925b.patch # PCI: document SR-IOV sysfs entries +git-15b49bee3a2b228370194f1b3ebc3db427cc9c94.patch # PCI: manual for SR-IOV user and driver developer +git-898585172fa729513d8636257b44bd1cfd279096.patch # PCI: save and restore PCIe 2.0 registers +git-7eb93b175d4de9438a4b0af3a94a112cb5266944.patch # PCI: SR-IOV quirk for Intel 82576 NIC +git-1b6b8ce2ac372ea1f2065b89228ede105eb68dc5.patch # PCI: only save/restore existent registers in the PCIe capability +git-f79b1b146b52765ee38bfb91bb14eb850fa98017.patch # PCI: use fixed-up device class when configuring device +git-4d135dbee7b0a89e946f7ba284f2b957505a2c3a.patch # PCI: fix SR-IOV function dependency link problem # # Marker to show that the queue is applied. @@ -55,7 +95,6 @@ XenSource # Update the Xen interface headers. # xen-interface-HVMOP.patch -xen-interface-xen_pcie_aer_op.patch # # Build fixes, tweaks and warning squashing @@ -83,43 +122,37 @@ kexec-define-vmcore_elf_check_arch_cross.patch # # ... Ethernet. -e1000-8.0.6.patch -e1000e-0.5.8.2.patch -igb-1.3.8.6.patch +e1000-8.0.13.patch +e1000e-0.5.18.3.patch +igb-1.3.19.3.patch ixgb-1.0.135.patch -ixgbe-1.3.56.5.patch +ixgbe-2.0.34.3.patch intel-net-driver-kcompat.patch -intel-net-driver-conflicting-names.patch -tg3-3.92n +tg3-3.99d tg3-tune-interrupt-load tg3-build-without-vlan-support.patch -bnx2-1.8.2b -bnx2-tune-interrupt-load +bnx2-1.9.16b bnx2-cnic-over-bridge -bnx2x-1.46.12 +bnx2x-1.50.8 bnx2x-fix-paths -bnx2x-disable-tpa #cxgb3toe-1.2-xen XXX disabled for 2.6.27-xen port s2io-2.0.31.12965 forward-port-s2io.patch -#solarflare-sfc XXX disabled for 2.6.27-xen port solarflare-sfc-alternative-configuration-location # ... Storage. -#open-iscsi-2.0-865.13 XXX disabled for 2.6.27-xen port -#open-iscsi-2.0-865.13-2.6.18-18_compat.patch -#open-iscsi-adjust-for-in-kernel-build +open-iscsi-2.0-870.3.patch +open-iscsi-2.0-870.3-2.6.27_compat.patch +open-iscsi-adjust-for-in-kernel-build open-iscsi-gfpkernel.patch -#mptlinux-4.00.38.02 XXX disabled for 2.6.27-xen port -#megaraid_sas-v00.00.03.21 XXX disabled for 2.6.27-xen port -#megaraid_sas-v00.00.03.21-rhel5-patch +mptlinux-4.19.00.03.patch +mpt2sas-01.255.04.00.patch +mpt2sas-build-integration.patch fix-cfq-iscsi-live-lock.patch CA-8809-fix-aio-deadlock #sata_nv-disable-adma-by-dflt XXX disabled for 2.6.27-xen port. underlying issue fixed in 2.6.27? -bnx2i-1.3.9 +bnx2i-1.8.9k bnx2i-host-params -forward-port-bnx2i.patch -#cciss-3.6.20_2009_01_12 XXX disabled for 2.6.27-xen port. not sure how this version relates to the 2.6.27 version which also claims to be 3.6.20 nfs-allow-0-retransmits.patch # ... Other. @@ -137,6 +170,7 @@ get_user_pages_fast-support-foreign-pages.patch backend-track-pages-with-page-flags.patch # ... blkback and blktap +blkback-use-blk_getput_queue.patch blktap-ioprio.patch blktap-backend-dom-dev blk-name @@ -163,6 +197,8 @@ CA-25742-force-shutdown-tapdisk.diff CA-24604-blktap-kthread-uevent.diff blktap2-spin_lock_init.patch CA-27974-fix-shutdown-race.diff +blkback_multi_page_ring +blktap_multi_page_ring forward-port-block-drivers.patch blktap2-forward-port-sysfs.patch @@ -179,7 +215,13 @@ netback-workaround-bad-csums netback-linearise-skbs netback-defensive.patch netback-thread -netback-SET_NETDEV_DEV-before-register_netdev.patch +netback-fix-receive-checksum-setup.patch + +# ... pciback +pciback-flr +remove-release-flr +flr-change-sbr-d3r-lists +export-pci_walk_bus.patch # # ParaVirtual Frontend Drivers. @@ -206,6 +248,8 @@ watch_online_node config-create_config-script utility-guest create_config.sh-x86_64-sane-default +increase-nr-dynirq +enable-xen-save-restore.patch kernel-configuration # @@ -231,6 +275,9 @@ privcmd_memop # # Networking. # +vswitch-0.90.1.0.patch +vswitch-build-integration.patch + bridge-locate-physical-device.patch bonding-balance-slb.patch bonding-default-slb.patch @@ -243,6 +290,7 @@ bonding-no-updelay-on-first-active-slave.patch debug-dump-skb-info-when-invalid bonding-vlan-fixes.patch bridge-no-topology-change-when-no-stp.patch +feature-gso-tcpv4-prefix # # Debugging. @@ -251,18 +299,11 @@ dom0-swap-extra-debugging oom-debugging oom-debug-me-harder sysrq-loglevel -fix_domain_switch_code # # XenClient # xen-acpi-wmi -pciback-flr -snd-hda-intel-hp-elite-6930p-laptop-mode pass2-driver -remove-release-flr -intel-hda-2.6.30 -flr-change-sbr-d3r-lists on-the-fly-cx-change bridge-carrier - diff --git a/master/status b/master/status index e69de29..cce2676 100644 --- a/master/status +++ b/master/status @@ -0,0 +1,189 @@ +hgignore.patch +build-system-integration.patch +linux-2.6.27.19-5.1.patch +linux-2.6.27.23-0.1.1.patch +revert-vbd-cdrom-extensions.patch +revert-vbd-packet-extensions.patch +revert-vbd-protocol-hack.patch +revert-configurable-nr-guest-devices.patch +revert-netback-notify-multiple.patch +revert-netback-dynirq-accounting.patch +revert-balloon-max-target.patch +sync-drivers-xen-blktap.patch +forward-port-drivers-xen-blktap.patch +linux-2.6.18-xen.hg-734.412b24a36929 +linux-2.6.18-xen.hg-767.78d81e85e8cd +linux-2.6.18-xen.hg-778.0fadef4d5c46 +linux-2.6.18-xen.hg-792.db9857bb0320 +linux-2.6.18-xen.hg-793.3aa9b8a7876b +linux-2.6.18-xen.hg-820.8b86d11a6eb3 +linux-2.6.18-xen.hg-832.c0f2f398aa3c +revert-linux-2.6.18-xen.hg-740.5012c470f875 +revert-linux-2.6.18-xen.hg-719.be9555ea5512 +revert-linux-2.6.18-xen.hg-598.f1d726b984a3 +revert-linux-2.6.18-xen.hg-582.b29a06ba7a5f +blktap-dont-count-to-infinity +git-235c4a59278eb07e61d909f1f0c233733034a8b3.patch +git-c6cb0e878446c79f42e7833d7bb69ed6bfbb381f.patch +git-67fd1a731ff1a990d4da7689909317756e50cb4d.patch +git-93ff68a55aa92180a765d6c51c3303f6200167a6.patch +git-201de56eb22f1ff3f36804bc70cbff220b50f067.patch +git-58c3a727cb73b75a9104d295f096cca12959a5a5.patch +git-f19aeb1f3638b7bb4ca21eb361f004fac2bfe259.patch +git-8dd7f8036c123296fc4214f9d8810eb485570422.patch +git-8113587c2d14d3be2414190845b2e2617c0aa33b.patch +git-d3a54014e2a94bd37b7dee5e76e03f7bc4fab49a.patch +git-6a49d8120021897e139641062236215aac5d220e.patch +git-14add80b5120966fe0659d61815b9e9b4b68fdc5.patch +git-14add80b5120966fe0659d61815b9e9b4b68fdc5-fixes.patch +git-fde09c6d8f92de0c9f75698a75f0989f2234c517.patch +git-bc5f5a8277cb353161454b6704b3186ebcf3a2a3.patch +git-0b400c7ed4d027e02f6231afa39852a2d48e6f25.patch +git-3789fa8a2e534523c896a32a9f27f78d52ad7d82.patch +git-613e7ed6f72b1a115f7ece8ce1b66cf095de1348.patch +git-3fa16fdb48e0d83c2acf46e357548c89891df58b.patch +git-876e501ab25dcd683574a5d3d56d8fe450083ed6.patch +git-d1b054da8f599905f3c18a218961dcf17f9d5f13.patch +git-8c5cdb6adc6688b9b8fd82ea4a5cf4674dabad79.patch +git-a28724b0fb909d247229a70761c90bb37b13366a.patch +git-480b93b7837fb3cf0579a42f4953ac463a5b9e1e.patch +git-dd7cc44d0bcec5e9c42fe52e88dc254ae62eac8d.patch +git-74bb1bcc7dbbc9ddef773bf3395d7ff92aaaad2e.patch +git-01db4957179c92fda7d9a06e49b7ae56fb7c925b.patch +git-15b49bee3a2b228370194f1b3ebc3db427cc9c94.patch +git-898585172fa729513d8636257b44bd1cfd279096.patch +git-7eb93b175d4de9438a4b0af3a94a112cb5266944.patch +git-1b6b8ce2ac372ea1f2065b89228ede105eb68dc5.patch +git-f79b1b146b52765ee38bfb91bb14eb850fa98017.patch +git-4d135dbee7b0a89e946f7ba284f2b957505a2c3a.patch +XenSource +xen-interface-HVMOP.patch +clobber-induction-variable.patch +pci-ignore +CA-14360-loadavg-not-uninterruptible +revert-xencons-behaviour +kexec-define-vmcore_elf_check_arch_cross.patch +e1000-8.0.13.patch +e1000e-0.5.18.3.patch +igb-1.3.19.3.patch +ixgb-1.0.135.patch +ixgbe-2.0.34.3.patch +intel-net-driver-kcompat.patch +tg3-3.99d +tg3-tune-interrupt-load +tg3-build-without-vlan-support.patch +bnx2-1.9.16b +bnx2-cnic-over-bridge +bnx2x-1.50.8 +bnx2x-fix-paths +s2io-2.0.31.12965 +forward-port-s2io.patch +solarflare-sfc-alternative-configuration-location +open-iscsi-2.0-870.3.patch +open-iscsi-2.0-870.3-2.6.27_compat.patch +open-iscsi-adjust-for-in-kernel-build +open-iscsi-gfpkernel.patch +mptlinux-4.19.00.03.patch +mpt2sas-01.255.04.00.patch +mpt2sas-build-integration.patch +fix-cfq-iscsi-live-lock.patch +CA-8809-fix-aio-deadlock +bnx2i-1.8.9k +bnx2i-host-params +nfs-allow-0-retransmits.patch +cdrom-sysctl-info.patch +export-mlock +get_user_pages_fast-support-foreign-pages.patch +backend-track-pages-with-page-flags.patch +blkback-use-blk_getput_queue.patch +blktap-ioprio.patch +blktap-backend-dom-dev +blk-name +blktap-shutdown-cleanup +blktap-shutdown-cleanup2 +blktap-missed-requests-CA-7665 +CA-7672-blk-shutdown.patch +CA-8806-blk-dont-reconnect-on-unplug +CA-9002-blktap-plug +CA-12483-fix-forced-shutdown-race +blk-fix-sysfs-remove-race +CA-14804-fix-block-unplug-retries +CA-15586-blkback-close-bdev +CA-15999-blkback-pause-unpause +close-and-flush-disconnected-emulated-devices +ratelimit-blktap-wprintk +blk-latency-stats +CA-20346-blktap-vma-unmap +CA-24267-blkback-unpause +CA-24784-resource-leak +blkback-pagemap +blktap2 +CA-25742-force-shutdown-tapdisk.diff +CA-24604-blktap-kthread-uevent.diff +blktap2-spin_lock_init.patch +CA-27974-fix-shutdown-race.diff +blkback_multi_page_ring +blktap_multi_page_ring +forward-port-block-drivers.patch +blktap2-forward-port-sysfs.patch +netback-rx-offset +netback-tcp-and-ip-in-different-fragments +disconnect-netback-on-close +netback-watch-csum-offload +netback-wait-for-hotplug +netback-dont-get-stuck-in-state-closed +netback-handle-small-tso-with-no-segmentation +netback-increase-pullup +netback-workaround-bad-csums +netback-linearise-skbs +netback-defensive.patch +netback-thread +netback-fix-receive-checksum-setup.patch +pciback-flr +remove-release-flr +flr-change-sbr-d3r-lists +export-pci_walk_bus.patch +fake-GET_IDLUN-scsi-ioctl +gnttab-copy-page-irq-safe.patch +watch_online_node +config-create_config-script +utility-guest +create_config.sh-x86_64-sane-default +increase-nr-dynirq +enable-xen-save-restore.patch +kernel-configuration +quiet-vfat +quieten-serio-i8042-warning.patch +quiet-sd-cache-info +quiet-intel-rng +CA-14400-reduce-printk-levels +CA-13783-ipmi-fixes +restricted-evtchn-dev +restricted-privcmd-dev +privcmd_domctl +privcmd_hvmop +privcmd_schedop +privcmd_memop +vswitch-0.90.1.0.patch +vswitch-build-integration.patch +bridge-locate-physical-device.patch +bonding-balance-slb.patch +bonding-default-slb.patch +promisc-bridging +quiet-no-ufo +bonding-balance-slb-fixes.patch +bonding-balance-slb-fixes2.patch +bonding-balance-slb-fixes3.patch +bonding-no-updelay-on-first-active-slave.patch +debug-dump-skb-info-when-invalid +bonding-vlan-fixes.patch +bridge-no-topology-change-when-no-stp.patch +feature-gso-tcpv4-prefix +dom0-swap-extra-debugging +oom-debugging +oom-debug-me-harder +sysrq-loglevel +xen-acpi-wmi +pass2-driver +on-the-fly-cx-change +bridge-carrier diff --git a/master/sync-drivers-xen-blktap.patch b/master/sync-drivers-xen-blktap.patch new file mode 100644 index 0000000..2613c6c --- /dev/null +++ b/master/sync-drivers-xen-blktap.patch @@ -0,0 +1,435 @@ +diff -r fc29f01f25d7 drivers/xen/blktap/Makefile +--- a/drivers/xen/blktap/Makefile Wed Jun 17 11:42:31 2009 +0100 ++++ b/drivers/xen/blktap/Makefile Wed Jun 17 11:44:15 2009 +0100 +@@ -1,5 +1,5 @@ + LINUXINCLUDE += -I../xen/include/public/io + +-obj-$(CONFIG_XEN_BLKDEV_TAP) := blktap.o ++obj-$(CONFIG_XEN_BLKDEV_TAP) := xenblktap.o + +-blktap-y := xenbus.o interface.o blocktap.o ++xenblktap-y := xenbus.o interface.o blktap.o +diff -r fc29f01f25d7 drivers/xen/blktap/blktap.c +--- a/drivers/xen/blktap/blktap.c Wed Jun 17 11:42:31 2009 +0100 ++++ b/drivers/xen/blktap/blktap.c Wed Jun 17 11:44:15 2009 +0100 +@@ -40,7 +40,6 @@ + + #include + #include +-#include + #include + #include + #include "common.h" +@@ -54,7 +53,6 @@ + #include + #include + #include +-#include + #include + + #define MAX_TAP_DEV 256 /*the maximum number of tapdisk ring devices */ +@@ -112,7 +110,6 @@ + unsigned long mode; /*current switching mode */ + int minor; /*Minor number for tapdisk device */ + pid_t pid; /*tapdisk process id */ +- struct pid_namespace *pid_ns; /*... and its corresponding namespace */ + enum { RUNNING, CLEANSHUTDOWN } status; /*Detect a clean userspace + shutdown */ + unsigned long *idx_map; /*Record the user ring id to kern +@@ -296,19 +293,17 @@ + /****************************************************************** + * BLKTAP VM OPS + */ +-struct tap_vma_priv { +- tap_blkif_t *info; +- struct page *map[]; +-}; + +-static int blktap_fault(struct vm_area_struct *vma, struct vm_fault *vmf) ++static struct page *blktap_nopage(struct vm_area_struct *vma, ++ unsigned long address, ++ int *type) + { + /* + * if the page has not been mapped in by the driver then return +- * VM_FAULT_SIGBUS to the domain. ++ * NOPAGE_SIGBUS to the domain. + */ + +- return VM_FAULT_SIGBUS; ++ return NOPAGE_SIGBUS; + } + + static pte_t blktap_clear_pte(struct vm_area_struct *vma, +@@ -331,8 +326,8 @@ + * if vm_file is NULL (meaning mmap failed and we have nothing to do) + */ + if (uvaddr < uvstart || vma->vm_file == NULL) +- return xen_ptep_get_and_clear_full(vma, uvaddr, ptep, +- is_fullmm); ++ return ptep_get_and_clear_full(vma->vm_mm, uvaddr, ++ ptep, is_fullmm); + + info = vma->vm_file->private_data; + map = vma->vm_private_data; +@@ -379,8 +374,8 @@ + BUG_ON(!xen_feature(XENFEAT_auto_translated_physmap)); + + /* USING SHADOW PAGE TABLES. */ +- copy = xen_ptep_get_and_clear_full(vma, uvaddr, ptep, +- is_fullmm); ++ copy = ptep_get_and_clear_full(vma->vm_mm, uvaddr, ptep, ++ is_fullmm); + } + + if (count) { +@@ -393,22 +388,9 @@ + return copy; + } + +-static void blktap_vma_close(struct vm_area_struct *vma) +-{ +- if (vma->vm_private_data) { +- struct tap_vma_priv *priv = container_of(vma->vm_private_data, +- struct tap_vma_priv, +- map); +- +- priv->info->vma = NULL; +- kfree(priv); +- } +-} +- + struct vm_operations_struct blktap_vm_ops = { +- fault: blktap_fault, ++ nopage: blktap_nopage, + zap_pte: blktap_clear_pte, +- close: blktap_vma_close, + }; + + /****************************************************************** +@@ -500,8 +482,9 @@ + tapfds[minor] = info; + + if ((class = get_xen_class()) != NULL) +- device_create(class, NULL, MKDEV(blktap_major, minor), +- NULL, "blktap%d", minor); ++ class_device_create(class, NULL, ++ MKDEV(blktap_major, minor), NULL, ++ "blktap%d", minor); + } + + out: +@@ -543,7 +526,7 @@ + return; + + if (info->pid > 0) { +- ptask = find_task_by_pid_ns(info->pid, info->pid_ns); ++ ptask = find_task_by_pid(info->pid); + if (ptask) + info->status = CLEANSHUTDOWN; + } +@@ -626,6 +609,21 @@ + ClearPageReserved(virt_to_page(info->ufe_ring.sring)); + free_page((unsigned long) info->ufe_ring.sring); + ++ /* Clear any active mappings and free foreign map table */ ++ if (info->vma) { ++ struct mm_struct *mm = info->vma->vm_mm; ++ ++ down_write(&mm->mmap_sem); ++ zap_page_range( ++ info->vma, info->vma->vm_start, ++ info->vma->vm_end - info->vma->vm_start, NULL); ++ up_write(&mm->mmap_sem); ++ ++ kfree(info->vma->vm_private_data); ++ ++ info->vma = NULL; ++ } ++ + if (info->idx_map) { + kfree(info->idx_map); + info->idx_map = NULL; +@@ -664,7 +662,8 @@ + static int blktap_mmap(struct file *filp, struct vm_area_struct *vma) + { + int size; +- struct tap_vma_priv *priv; ++ struct page **map; ++ int i; + tap_blkif_t *info = filp->private_data; + int ret; + +@@ -701,16 +700,18 @@ + } + + /* Mark this VM as containing foreign pages, and set up mappings. */ +- priv = kzalloc(sizeof(*priv) + ((vma->vm_end - vma->vm_start) +- >> PAGE_SHIFT) * sizeof(*priv->map), +- GFP_KERNEL); +- if (priv == NULL) { ++ map = kzalloc(((vma->vm_end - vma->vm_start) >> PAGE_SHIFT) ++ * sizeof(struct page *), ++ GFP_KERNEL); ++ if (map == NULL) { + WPRINTK("Couldn't alloc VM_FOREIGN map.\n"); + goto fail; + } +- priv->info = info; + +- vma->vm_private_data = priv->map; ++ for (i = 0; i < ((vma->vm_end - vma->vm_start) >> PAGE_SHIFT); i++) ++ map[i] = NULL; ++ ++ vma->vm_private_data = map; + vma->vm_flags |= VM_FOREIGN; + vma->vm_flags |= VM_DONTCOPY; + +@@ -771,9 +772,8 @@ + { + if (info) { + info->pid = (pid_t)arg; +- info->pid_ns = current->nsproxy->pid_ns; +- DPRINTK("blktap: pid received %p:%d\n", +- info->pid_ns, info->pid); ++ DPRINTK("blktap: pid received %d\n", ++ info->pid); + } + return 0; + } +@@ -934,7 +934,7 @@ + + static void mmap_req_del(int mmap) + { +- assert_spin_locked(&pending_free_lock); ++ BUG_ON(!spin_is_locked(&pending_free_lock)); + + kfree(pending_reqs[mmap]); + pending_reqs[mmap] = NULL; +@@ -1225,7 +1225,7 @@ + wake_up(&blkif->wq); + } + +-irqreturn_t tap_blkif_be_int(int irq, void *dev_id) ++irqreturn_t tap_blkif_be_int(int irq, void *dev_id, struct pt_regs *regs) + { + blkif_notify_work(dev_id); + return IRQ_HANDLED; +@@ -1323,9 +1323,6 @@ + dispatch_rw_block_io(blkif, &req, pending_req); + break; + +- case BLKIF_OP_WRITE_BARRIER: +- /* TODO Some counter? */ +- /* Fall through */ + case BLKIF_OP_WRITE: + blkif->st_wr_req++; + dispatch_rw_block_io(blkif, &req, pending_req); +@@ -1357,32 +1354,16 @@ + pending_req_t *pending_req) + { + extern void ll_rw_block(int rw, int nr, struct buffer_head * bhs[]); +- int op, operation; ++ int op, operation = (req->operation == BLKIF_OP_WRITE) ? WRITE : READ; + struct gnttab_map_grant_ref map[BLKIF_MAX_SEGMENTS_PER_REQUEST*2]; + unsigned int nseg; + int ret, i, nr_sects = 0; + tap_blkif_t *info; +- struct page **pgmap; + blkif_request_t *target; + int pending_idx = RTN_PEND_IDX(pending_req,pending_req->mem_idx); + int usr_idx; + uint16_t mmap_idx = pending_req->mem_idx; + struct mm_struct *mm; +- +- switch (req->operation) { +- case BLKIF_OP_READ: +- operation = READ; +- break; +- case BLKIF_OP_WRITE: +- operation = WRITE; +- break; +- case BLKIF_OP_WRITE_BARRIER: +- operation = WRITE_BARRIER; +- break; +- default: +- operation = 0; /* make gcc happy */ +- BUG(); +- } + + if (blkif->dev_num < 0 || blkif->dev_num > MAX_TAP_DEV) + goto fail_response; +@@ -1422,7 +1403,7 @@ + + pending_req->blkif = blkif; + pending_req->id = req->id; +- pending_req->operation = req->operation; ++ pending_req->operation = operation; + pending_req->status = BLKIF_RSP_OKAY; + pending_req->nr_pages = nseg; + op = 0; +@@ -1439,7 +1420,7 @@ + kvaddr = idx_to_kaddr(mmap_idx, pending_idx, i); + + flags = GNTMAP_host_map; +- if (operation != READ) ++ if (operation == WRITE) + flags |= GNTMAP_readonly; + gnttab_set_map_op(&map[op], kvaddr, flags, + req->seg[i].gref, blkif->domid); +@@ -1456,7 +1437,7 @@ + + flags = GNTMAP_host_map | GNTMAP_application_map + | GNTMAP_contains_pte; +- if (operation != READ) ++ if (operation == WRITE) + flags |= GNTMAP_readonly; + gnttab_set_map_op(&map[op], ptep, flags, + req->seg[i].gref, blkif->domid); +@@ -1469,8 +1450,6 @@ + + ret = HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, map, op); + BUG_ON(ret); +- +- pgmap = info->vma->vm_private_data; + + if (!xen_feature(XENFEAT_auto_translated_physmap)) { + up_write(&mm->mmap_sem); +@@ -1511,7 +1490,8 @@ + >> PAGE_SHIFT)); + offset = (uvaddr - info->vma->vm_start) >> PAGE_SHIFT; + pg = pfn_to_page(__pa(kvaddr) >> PAGE_SHIFT); +- pgmap[offset] = pg; ++ ((struct page **)info->vma->vm_private_data)[offset] = ++ pg; + } + } else { + for (i = 0; i < nseg; i++) { +@@ -1538,7 +1518,8 @@ + + offset = (uvaddr - info->vma->vm_start) >> PAGE_SHIFT; + pg = pfn_to_page(__pa(kvaddr) >> PAGE_SHIFT); +- pgmap[offset] = pg; ++ ((struct page **)info->vma->vm_private_data)[offset] = ++ pg; + } + } + +@@ -1705,8 +1686,9 @@ + * We only create the device when a request of a new device is + * made. + */ +- device_create(class, NULL, MKDEV(blktap_major, 0), NULL, +- "blktap0"); ++ class_device_create(class, NULL, ++ MKDEV(blktap_major, 0), NULL, ++ "blktap0"); + } else { + /* this is bad, but not fatal */ + WPRINTK("blktap: sysfs xen_class not created\n"); +diff -r fc29f01f25d7 drivers/xen/blktap/blocktap.c +--- a/drivers/xen/blktap/blocktap.c Wed Jun 17 11:42:31 2009 +0100 ++++ /dev/null Thu Jan 01 00:00:00 1970 +0000 +@@ -1,1 +0,0 @@ +-#include "blktap.c" +diff -r fc29f01f25d7 drivers/xen/blktap/common.h +--- a/drivers/xen/blktap/common.h Wed Jun 17 11:42:31 2009 +0100 ++++ b/drivers/xen/blktap/common.h Wed Jun 17 11:44:15 2009 +0100 +@@ -68,7 +68,7 @@ + wait_queue_head_t wq; + struct task_struct *xenblkd; + unsigned int waiting_reqs; +- struct request_queue *plug; ++ request_queue_t *plug; + + /* statistics */ + unsigned long st_print; +@@ -113,7 +113,7 @@ + + void tap_blkif_xenbus_init(void); + +-irqreturn_t tap_blkif_be_int(int irq, void *dev_id); ++irqreturn_t tap_blkif_be_int(int irq, void *dev_id, struct pt_regs *regs); + int tap_blkif_schedule(void *arg); + + int dom_to_devid(domid_t domid, int xenbus_id, blkif_t *blkif); +diff -r fc29f01f25d7 drivers/xen/blktap/interface.c +--- a/drivers/xen/blktap/interface.c Wed Jun 17 11:42:31 2009 +0100 ++++ b/drivers/xen/blktap/interface.c Wed Jun 17 11:44:15 2009 +0100 +@@ -34,7 +34,7 @@ + #include "common.h" + #include + +-static struct kmem_cache *blkif_cachep; ++static kmem_cache_t *blkif_cachep; + + blkif_t *tap_alloc_blkif(domid_t domid) + { +@@ -177,5 +177,5 @@ + void __init tap_blkif_interface_init(void) + { + blkif_cachep = kmem_cache_create("blktapif_cache", sizeof(blkif_t), +- 0, 0, NULL); ++ 0, 0, NULL, NULL); + } +diff -r fc29f01f25d7 drivers/xen/blktap/xenbus.c +--- a/drivers/xen/blktap/xenbus.c Wed Jun 17 11:42:31 2009 +0100 ++++ b/drivers/xen/blktap/xenbus.c Wed Jun 17 11:44:15 2009 +0100 +@@ -394,28 +394,7 @@ + int err; + + struct xenbus_device *dev = be->dev; +- struct xenbus_transaction xbt; + +- /* Write feature-barrier to xenstore */ +-again: +- err = xenbus_transaction_start(&xbt); +- if (err) { +- xenbus_dev_fatal(dev, err, "starting transaction"); +- return; +- } +- +- err = xenbus_printf(xbt, dev->nodename, "feature-barrier", "1"); +- if (err) { +- xenbus_dev_fatal(dev, err, "writing feature-barrier"); +- xenbus_transaction_end(xbt, 1); +- return; +- } +- +- err = xenbus_transaction_end(xbt, 0); +- if (err == -EAGAIN) +- goto again; +- +- /* Switch state */ + err = xenbus_switch_state(dev, XenbusStateConnected); + if (err) + xenbus_dev_fatal(dev, err, "switching to Connected state", +@@ -455,12 +434,6 @@ + be->blkif->blk_protocol = BLKIF_PROTOCOL_X86_32; + else if (0 == strcmp(protocol, XEN_IO_PROTO_ABI_X86_64)) + be->blkif->blk_protocol = BLKIF_PROTOCOL_X86_64; +-#if 1 /* maintain compatibility with early sles10-sp1 and paravirt netware betas */ +- else if (0 == strcmp(protocol, "1")) +- be->blkif->blk_protocol = BLKIF_PROTOCOL_X86_32; +- else if (0 == strcmp(protocol, "2")) +- be->blkif->blk_protocol = BLKIF_PROTOCOL_X86_64; +-#endif + else { + xenbus_dev_fatal(dev, err, "unknown fe protocol %s", protocol); + return -1; +@@ -492,6 +465,7 @@ + + static struct xenbus_driver blktap = { + .name = "tap", ++ .owner = THIS_MODULE, + .ids = blktap_ids, + .probe = blktap_probe, + .remove = blktap_remove, +@@ -501,6 +475,5 @@ + + void tap_blkif_xenbus_init(void) + { +- if (xenbus_register_backend(&blktap)) +- BUG(); ++ xenbus_register_backend(&blktap); + } diff --git a/master/tg3-3.99d b/master/tg3-3.99d new file mode 100644 index 0000000..7d80f02 --- /dev/null +++ b/master/tg3-3.99d @@ -0,0 +1,9930 @@ +diff -r 30b17b8c7526 drivers/net/tg3.c +--- a/drivers/net/tg3.c Mon Jun 15 14:53:57 2009 +0100 ++++ b/drivers/net/tg3.c Mon Jun 15 17:05:21 2009 +0100 +@@ -4,7 +4,7 @@ + * Copyright (C) 2001, 2002, 2003, 2004 David S. Miller (davem@redhat.com) + * Copyright (C) 2001, 2002, 2003 Jeff Garzik (jgarzik@pobox.com) + * Copyright (C) 2004 Sun Microsystems Inc. +- * Copyright (C) 2005-2007 Broadcom Corporation. ++ * Copyright (C) 2005-2009 Broadcom Corporation. + * + * Firmware is: + * Derived from proprietary unpublished source code, +@@ -15,9 +15,22 @@ + * notice is accompanying it. + */ + +- ++#include ++ ++#if (LINUX_VERSION_CODE < 0x020612) ++#include ++#endif ++ ++#if (LINUX_VERSION_CODE < 0x020500) ++#if defined(CONFIG_MODVERSIONS) && defined(MODULE) && ! defined(MODVERSIONS) ++#define MODVERSIONS ++#include ++#endif ++#endif + #include ++#if (LINUX_VERSION_CODE >= 0x20600) + #include ++#endif + #include + #include + #include +@@ -32,14 +45,25 @@ + #include + #include + #include ++#ifdef BCM_INCLUDE_PHYLIB_SUPPORT + #include +-#include ++#endif + #include + #include + #include ++#if (LINUX_VERSION_CODE >= 0x20600) + #include ++#endif + #include ++#if (LINUX_VERSION_CODE >= 0x020600) + #include ++#endif ++#ifdef BCM_HAS_REQUEST_FIRMWARE ++#include ++#else ++#include "tg3_firmware.h" ++#endif ++#include + + #include + #include +@@ -54,20 +78,34 @@ + #include + #endif + ++#define BAR_0 0 ++#define BAR_2 2 ++ + #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) + #define TG3_VLAN_TAG_USED 1 + #else + #define TG3_VLAN_TAG_USED 0 + #endif + +-#define TG3_TSO_SUPPORT 1 +- + #include "tg3.h" + + #define DRV_MODULE_NAME "tg3" + #define PFX DRV_MODULE_NAME ": " +-#define DRV_MODULE_VERSION "3.94" +-#define DRV_MODULE_RELDATE "August 14, 2008" ++#define DRV_MODULE_VERSION "3.99d" ++#define DRV_MODULE_RELDATE "May 26, 2009" ++ ++/* The driver optimizes the hot rx code path by merging a mandatory rx double ++ * copy check with the normal double copy rx threshold check. On those ++ * architectures where the mandatory double copy is not needed, we can optimize ++ * further by saving a device structure dereference and hardcoding the double ++ * copy threshold in place. ++ */ ++#if NET_IP_ALIGN == 0 || defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) ++ #define TG3_RX_COPY_THRESH(tp) RX_COPY_THRESHOLD ++#else ++ #define TG3_RX_COPY_THRESH(tp) ((tp)->rx_copy_thresh) ++#endif ++ + + #define TG3_DEF_MAC_MODE 0 + #define TG3_DEF_RX_MODE 0 +@@ -90,7 +128,7 @@ + /* hardware minimum and maximum for a single frame's data payload */ + #define TG3_MIN_MTU 60 + #define TG3_MAX_MTU(tp) \ +- ((tp->tg3_flags2 & TG3_FLG2_JUMBO_CAPABLE) ? 9000 : 1500) ++ ((tp->tg3_flags & TG3_FLAG_JUMBO_CAPABLE) ? 9000 : 1500) + + /* These numbers seem to be hard coded in the NIC firmware somehow. + * You can't change the ring sizes, but you can change where you place +@@ -123,16 +161,24 @@ + TG3_TX_RING_SIZE) + #define NEXT_TX(N) (((N) + 1) & (TG3_TX_RING_SIZE - 1)) + +-#define RX_PKT_BUF_SZ (1536 + tp->rx_offset + 64) +-#define RX_JUMBO_PKT_BUF_SZ (9046 + tp->rx_offset + 64) ++#define RX_PKT_BUF_SZ (1536 + 64) ++#define RX_JUMBO_PKT_BUF_SZ (9046 + 64) + + /* minimum number of free TX descriptors required to wake up TX process */ + #define TG3_TX_WAKEUP_THRESH(tp) ((tp)->tx_pending / 4) + ++#define TG3_RAW_IP_ALIGN 2 ++ ++#include "tg3_compat2.h" ++ + /* number of ETHTOOL_GSTATS u64's */ + #define TG3_NUM_STATS (sizeof(struct tg3_ethtool_stats)/sizeof(u64)) + + #define TG3_NUM_TEST 6 ++ ++#define FIRMWARE_TG3 "tigon/tg3.bin" ++#define FIRMWARE_TG3TSO "tigon/tg3_tso.bin" ++#define FIRMWARE_TG3TSO5 "tigon/tg3_tso5.bin" + + static char version[] __devinitdata = + DRV_MODULE_NAME ".c:v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n"; +@@ -141,10 +187,16 @@ + MODULE_DESCRIPTION("Broadcom Tigon3 ethernet driver"); + MODULE_LICENSE("GPL"); + MODULE_VERSION(DRV_MODULE_VERSION); ++MODULE_FIRMWARE(FIRMWARE_TG3); ++MODULE_FIRMWARE(FIRMWARE_TG3TSO); ++MODULE_FIRMWARE(FIRMWARE_TG3TSO5); ++ + + static int tg3_debug = -1; /* -1 == use TG3_DEF_MSG_ENABLE as value */ ++#if (LINUX_VERSION_CODE >= 0x20600) + module_param(tg3_debug, int, 0); + MODULE_PARM_DESC(tg3_debug, "Tigon3 bitmapped debugging message enable value"); ++#endif + + static struct pci_device_id tg3_pci_tbl[] = { + {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5700)}, +@@ -205,10 +257,14 @@ + {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5723)}, + {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5761)}, + {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5761E)}, ++ {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_5761S)}, ++ {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_5761SE)}, + {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57780)}, + {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57760)}, + {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57790)}, + {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57720)}, ++ {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_5785_G)}, ++ {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_5785_F)}, + {PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, PCI_DEVICE_ID_SYSKONNECT_9DXX)}, + {PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, PCI_DEVICE_ID_SYSKONNECT_9MXX)}, + {PCI_DEVICE(PCI_VENDOR_ID_ALTIMA, PCI_DEVICE_ID_ALTIMA_AC1000)}, +@@ -664,7 +720,11 @@ + static inline void tg3_netif_stop(struct tg3 *tp) + { + tp->dev->trans_start = jiffies; /* prevent tx timeout */ ++#ifdef TG3_NAPI + napi_disable(&tp->napi); ++#else ++ netif_poll_disable(tp->dev); ++#endif + netif_tx_disable(tp->dev); + } + +@@ -675,7 +735,11 @@ + * so long as all callers are assured to have free tx slots + * (such as after tg3_init_hw) + */ ++#ifdef TG3_NAPI + napi_enable(&tp->napi); ++#else ++ netif_poll_enable(tp->dev); ++#endif + tp->hw_status->status |= SD_STATUS_UPDATED; + tg3_enable_ints(tp); + } +@@ -769,7 +833,7 @@ + unsigned int loops; + int ret; + +- if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906 && ++ if ((tp->tg3_flags3 & TG3_FLG3_PHY_IS_FET) && + (reg == MII_TG3_CTRL || reg == MII_TG3_AUX_CTRL)) + return 0; + +@@ -837,15 +901,16 @@ + } + udelay(10); + } +- if (limit <= 0) ++ if (limit < 0) + return -EBUSY; + + return 0; + } + ++#ifdef BCM_INCLUDE_PHYLIB_SUPPORT + static int tg3_mdio_read(struct mii_bus *bp, int mii_id, int reg) + { +- struct tg3 *tp = (struct tg3 *)bp->priv; ++ struct tg3 *tp = bp->priv; + u32 val; + + if (tp->tg3_flags3 & TG3_FLG3_MDIOBUS_PAUSED) +@@ -859,7 +924,7 @@ + + static int tg3_mdio_write(struct mii_bus *bp, int mii_id, int reg, u16 val) + { +- struct tg3 *tp = (struct tg3 *)bp->priv; ++ struct tg3 *tp = bp->priv; + + if (tp->tg3_flags3 & TG3_FLG3_MDIOBUS_PAUSED) + return -EAGAIN; +@@ -875,28 +940,64 @@ + return 0; + } + +-static void tg3_mdio_config(struct tg3 *tp) +-{ +- u32 val; +- +- if (tp->mdio_bus.phy_map[PHY_ADDR]->interface != +- PHY_INTERFACE_MODE_RGMII) +- return; +- +- val = tr32(MAC_PHYCFG1) & ~(MAC_PHYCFG1_RGMII_EXT_RX_DEC | +- MAC_PHYCFG1_RGMII_SND_STAT_EN); +- if (tp->tg3_flags3 & TG3_FLG3_RGMII_STD_IBND_DISABLE) { ++static void tg3_mdio_config_5785(struct tg3 *tp) ++{ ++ u32 val; ++ struct phy_device *phydev; ++ ++ phydev = tp->mdio_bus->phy_map[PHY_ADDR]; ++ switch (phydev->drv->phy_id & phydev->drv->phy_id_mask) { ++ case PHY_ID_BCM50610: ++ case PHY_ID_BCM50610M: ++ val = MAC_PHYCFG2_50610_LED_MODES; ++ break; ++ case PHY_ID_BCMAC131: ++ val = MAC_PHYCFG2_AC131_LED_MODES; ++ break; ++ case PHY_ID_RTL8211C: ++ val = MAC_PHYCFG2_RTL8211C_LED_MODES; ++ break; ++ case PHY_ID_RTL8201E: ++ val = MAC_PHYCFG2_RTL8201E_LED_MODES; ++ break; ++ default: ++ return; ++ } ++ ++ if (phydev->interface != PHY_INTERFACE_MODE_RGMII) { ++ tw32(MAC_PHYCFG2, val); ++ ++ val = tr32(MAC_PHYCFG1); ++ val &= ~(MAC_PHYCFG1_RGMII_INT | ++ MAC_PHYCFG1_RXCLK_TO_MASK | MAC_PHYCFG1_TXCLK_TO_MASK); ++ val |= MAC_PHYCFG1_RXCLK_TIMEOUT | MAC_PHYCFG1_TXCLK_TIMEOUT; ++ tw32(MAC_PHYCFG1, val); ++ ++ return; ++ } ++ ++ if (!(tp->tg3_flags3 & TG3_FLG3_RGMII_INBAND_DISABLE)) ++ val |= MAC_PHYCFG2_EMODE_MASK_MASK | ++ MAC_PHYCFG2_FMODE_MASK_MASK | ++ MAC_PHYCFG2_GMODE_MASK_MASK | ++ MAC_PHYCFG2_ACT_MASK_MASK | ++ MAC_PHYCFG2_QUAL_MASK_MASK | ++ MAC_PHYCFG2_INBAND_ENABLE; ++ ++ tw32(MAC_PHYCFG2, val); ++ ++ val = tr32(MAC_PHYCFG1); ++ val &= ~(MAC_PHYCFG1_RXCLK_TO_MASK | MAC_PHYCFG1_TXCLK_TO_MASK | ++ MAC_PHYCFG1_RGMII_EXT_RX_DEC | MAC_PHYCFG1_RGMII_SND_STAT_EN); ++ if (!(tp->tg3_flags3 & TG3_FLG3_RGMII_INBAND_DISABLE)) { + if (tp->tg3_flags3 & TG3_FLG3_RGMII_EXT_IBND_RX_EN) + val |= MAC_PHYCFG1_RGMII_EXT_RX_DEC; + if (tp->tg3_flags3 & TG3_FLG3_RGMII_EXT_IBND_TX_EN) + val |= MAC_PHYCFG1_RGMII_SND_STAT_EN; + } +- tw32(MAC_PHYCFG1, val | MAC_PHYCFG1_RGMII_INT | MAC_PHYCFG1_TXC_DRV); +- +- val = tr32(MAC_PHYCFG2) & ~(MAC_PHYCFG2_INBAND_ENABLE); +- if (!(tp->tg3_flags3 & TG3_FLG3_RGMII_STD_IBND_DISABLE)) +- val |= MAC_PHYCFG2_INBAND_ENABLE; +- tw32(MAC_PHYCFG2, val); ++ val |= MAC_PHYCFG1_RXCLK_TIMEOUT | MAC_PHYCFG1_TXCLK_TIMEOUT | ++ MAC_PHYCFG1_RGMII_INT | MAC_PHYCFG1_TXC_DRV; ++ tw32(MAC_PHYCFG1, val); + + val = tr32(MAC_EXT_RGMII_MODE); + val &= ~(MAC_RGMII_MODE_RX_INT_B | +@@ -906,7 +1007,7 @@ + MAC_RGMII_MODE_TX_ENABLE | + MAC_RGMII_MODE_TX_LOWPWR | + MAC_RGMII_MODE_TX_RESET); +- if (tp->tg3_flags3 & TG3_FLG3_RGMII_STD_IBND_DISABLE) { ++ if (!(tp->tg3_flags3 & TG3_FLG3_RGMII_INBAND_DISABLE)) { + if (tp->tg3_flags3 & TG3_FLG3_RGMII_EXT_IBND_RX_EN) + val |= MAC_RGMII_MODE_RX_INT_B | + MAC_RGMII_MODE_RX_QUALITY | +@@ -923,25 +1024,26 @@ + static void tg3_mdio_start(struct tg3 *tp) + { + if (tp->tg3_flags3 & TG3_FLG3_MDIOBUS_INITED) { +- mutex_lock(&tp->mdio_bus.mdio_lock); ++ mutex_lock(&tp->mdio_bus->mdio_lock); + tp->tg3_flags3 &= ~TG3_FLG3_MDIOBUS_PAUSED; +- mutex_unlock(&tp->mdio_bus.mdio_lock); ++ mutex_unlock(&tp->mdio_bus->mdio_lock); + } + + tp->mi_mode &= ~MAC_MI_MODE_AUTO_POLL; + tw32_f(MAC_MI_MODE, tp->mi_mode); + udelay(80); + +- if (tp->tg3_flags3 & TG3_FLG3_MDIOBUS_INITED) +- tg3_mdio_config(tp); ++ if ((tp->tg3_flags3 & TG3_FLG3_MDIOBUS_INITED) && ++ GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5785) ++ tg3_mdio_config_5785(tp); + } + + static void tg3_mdio_stop(struct tg3 *tp) + { + if (tp->tg3_flags3 & TG3_FLG3_MDIOBUS_INITED) { +- mutex_lock(&tp->mdio_bus.mdio_lock); ++ mutex_lock(&tp->mdio_bus->mdio_lock); + tp->tg3_flags3 |= TG3_FLG3_MDIOBUS_PAUSED; +- mutex_unlock(&tp->mdio_bus.mdio_lock); ++ mutex_unlock(&tp->mdio_bus->mdio_lock); + } + } + +@@ -950,7 +1052,6 @@ + int i; + u32 reg; + struct phy_device *phydev; +- struct mii_bus *mdio_bus = &tp->mdio_bus; + + tg3_mdio_start(tp); + +@@ -958,21 +1059,29 @@ + (tp->tg3_flags3 & TG3_FLG3_MDIOBUS_INITED)) + return 0; + +- memset(mdio_bus, 0, sizeof(*mdio_bus)); +- +- mdio_bus->name = "tg3 mdio bus"; +- snprintf(mdio_bus->id, MII_BUS_ID_SIZE, "%x", ++ tp->mdio_bus = mdiobus_alloc(); ++ if (tp->mdio_bus == NULL) ++ return -ENOMEM; ++ ++ tp->mdio_bus->name = "tg3 mdio bus"; ++#ifdef MII_BUS_ID_SIZE ++ snprintf(tp->mdio_bus->id, MII_BUS_ID_SIZE, "%x", + (tp->pdev->bus->number << 8) | tp->pdev->devfn); +- mdio_bus->priv = tp; +- mdio_bus->dev = &tp->pdev->dev; +- mdio_bus->read = &tg3_mdio_read; +- mdio_bus->write = &tg3_mdio_write; +- mdio_bus->reset = &tg3_mdio_reset; +- mdio_bus->phy_mask = ~(1 << PHY_ADDR); +- mdio_bus->irq = &tp->mdio_irq[0]; ++#else ++ tp->mdio_bus->id = tp->pdev->devfn; ++#endif ++ tp->mdio_bus->priv = tp; ++#ifdef BCM_MDIOBUS_HAS_PARENT ++ tp->mdio_bus->parent = &tp->pdev->dev; ++#endif ++ tp->mdio_bus->read = &tg3_mdio_read; ++ tp->mdio_bus->write = &tg3_mdio_write; ++ tp->mdio_bus->reset = &tg3_mdio_reset; ++ tp->mdio_bus->phy_mask = ~(1 << PHY_ADDR); ++ tp->mdio_bus->irq = &tp->mdio_irq[0]; + + for (i = 0; i < PHY_MAX_ADDR; i++) +- mdio_bus->irq[i] = PHY_POLL; ++ tp->mdio_bus->irq[i] = PHY_POLL; + + /* The bus registration will look for all the PHYs on the mdio bus. + * Unfortunately, it does not ensure the PHY is powered up before +@@ -982,40 +1091,49 @@ + if (tg3_readphy(tp, MII_BMCR, ®) || (reg & BMCR_PDOWN)) + tg3_bmcr_reset(tp); + +- i = mdiobus_register(mdio_bus); ++ i = mdiobus_register(tp->mdio_bus); + if (i) { + printk(KERN_WARNING "%s: mdiobus_reg failed (0x%x)\n", + tp->dev->name, i); ++ mdiobus_free(tp->mdio_bus); + return i; + } + +- tp->tg3_flags3 |= TG3_FLG3_MDIOBUS_INITED; +- +- phydev = tp->mdio_bus.phy_map[PHY_ADDR]; +- +-if(!phydev || !phydev->drv) +- return -1; ++ phydev = tp->mdio_bus->phy_map[PHY_ADDR]; ++ ++ if (!phydev || !phydev->drv) { ++ printk(KERN_WARNING "%s: No PHY devices\n", tp->dev->name); ++ mdiobus_unregister(tp->mdio_bus); ++ mdiobus_free(tp->mdio_bus); ++ return -ENODEV; ++ } + + switch (phydev->drv->phy_id & phydev->drv->phy_id_mask) { +- case TG3_PHY_ID_BCM57780: ++ case PHY_ID_BCM57780: + phydev->interface = PHY_INTERFACE_MODE_GMII; +- phydev->dev_flags = PHY_BRCM_WIRESPEED_ENABLE; +- break; +- case TG3_PHY_ID_BCM50610: +- phydev->interface = PHY_INTERFACE_MODE_RGMII; +- if (tp->tg3_flags3 & TG3_FLG3_RGMII_STD_IBND_DISABLE) ++ break; ++ case PHY_ID_BCM50610: ++ case PHY_ID_BCM50610M: ++ if (tp->tg3_flags3 & TG3_FLG3_RGMII_INBAND_DISABLE) + phydev->dev_flags |= PHY_BRCM_STD_IBND_DISABLE; + if (tp->tg3_flags3 & TG3_FLG3_RGMII_EXT_IBND_RX_EN) + phydev->dev_flags |= PHY_BRCM_EXT_IBND_RX_ENABLE; + if (tp->tg3_flags3 & TG3_FLG3_RGMII_EXT_IBND_TX_EN) + phydev->dev_flags |= PHY_BRCM_EXT_IBND_TX_ENABLE; +- break; +- case TG3_PHY_ID_BCMAC131: ++ /* fallthru */ ++ case PHY_ID_RTL8211C: ++ phydev->interface = PHY_INTERFACE_MODE_RGMII; ++ break; ++ case PHY_ID_RTL8201E: ++ case PHY_ID_BCMAC131: + phydev->interface = PHY_INTERFACE_MODE_MII; + break; + } + +- tg3_mdio_config(tp); ++ tp->tg3_flags3 |= TG3_FLG3_MDIOBUS_INITED; ++ ++ if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5785) ++ tg3_mdio_config_5785(tp); + + return 0; + } +@@ -1024,10 +1142,89 @@ + { + if (tp->tg3_flags3 & TG3_FLG3_MDIOBUS_INITED) { + tp->tg3_flags3 &= ~TG3_FLG3_MDIOBUS_INITED; +- mdiobus_unregister(&tp->mdio_bus); ++ mdiobus_unregister(tp->mdio_bus); ++ mdiobus_free(tp->mdio_bus); + tp->tg3_flags3 &= ~TG3_FLG3_MDIOBUS_PAUSED; + } + } ++#else ++static void tg3_mdio_start(struct tg3 *tp) ++{ ++ u32 val; ++ ++ tp->mi_mode &= ~MAC_MI_MODE_AUTO_POLL; ++ tw32_f(MAC_MI_MODE, tp->mi_mode); ++ udelay(80); ++ ++ if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5785) ++ return; ++ ++ if ((tp->phy_id & PHY_ID_MASK) == PHY_ID_BCMAC131) { ++ tw32(MAC_PHYCFG2, MAC_PHYCFG2_AC131_LED_MODES); ++ ++ val = tr32(MAC_PHYCFG1); ++ val &= ~(MAC_PHYCFG1_RGMII_INT | ++ MAC_PHYCFG1_RXCLK_TO_MASK | MAC_PHYCFG1_TXCLK_TO_MASK); ++ val |= MAC_PHYCFG1_RXCLK_TIMEOUT | MAC_PHYCFG1_TXCLK_TIMEOUT; ++ tw32(MAC_PHYCFG1, val); ++ ++ return; ++ } ++ ++ val = MAC_PHYCFG2_50610_LED_MODES; ++ ++ if (!(tp->tg3_flags3 & TG3_FLG3_RGMII_INBAND_DISABLE)) ++ val |= MAC_PHYCFG2_EMODE_MASK_MASK | ++ MAC_PHYCFG2_FMODE_MASK_MASK | ++ MAC_PHYCFG2_GMODE_MASK_MASK | ++ MAC_PHYCFG2_ACT_MASK_MASK | ++ MAC_PHYCFG2_QUAL_MASK_MASK | ++ MAC_PHYCFG2_INBAND_ENABLE; ++ ++ tw32(MAC_PHYCFG2, val); ++ ++ val = tr32(MAC_PHYCFG1); ++ val &= ~(MAC_PHYCFG1_RXCLK_TO_MASK | MAC_PHYCFG1_TXCLK_TO_MASK | ++ MAC_PHYCFG1_RGMII_EXT_RX_DEC | MAC_PHYCFG1_RGMII_SND_STAT_EN); ++ if (!(tp->tg3_flags3 & TG3_FLG3_RGMII_INBAND_DISABLE)) { ++ if (tp->tg3_flags3 & TG3_FLG3_RGMII_EXT_IBND_RX_EN) ++ val |= MAC_PHYCFG1_RGMII_EXT_RX_DEC; ++ if (tp->tg3_flags3 & TG3_FLG3_RGMII_EXT_IBND_TX_EN) ++ val |= MAC_PHYCFG1_RGMII_SND_STAT_EN; ++ } ++ val |= MAC_PHYCFG1_RXCLK_TIMEOUT | MAC_PHYCFG1_TXCLK_TIMEOUT | ++ MAC_PHYCFG1_RGMII_INT | MAC_PHYCFG1_TXC_DRV; ++ tw32(MAC_PHYCFG1, val); ++ ++ val = tr32(MAC_EXT_RGMII_MODE); ++ val &= ~(MAC_RGMII_MODE_RX_INT_B | ++ MAC_RGMII_MODE_RX_QUALITY | ++ MAC_RGMII_MODE_RX_ACTIVITY | ++ MAC_RGMII_MODE_RX_ENG_DET | ++ MAC_RGMII_MODE_TX_ENABLE | ++ MAC_RGMII_MODE_TX_LOWPWR | ++ MAC_RGMII_MODE_TX_RESET); ++ if (!(tp->tg3_flags3 & TG3_FLG3_RGMII_INBAND_DISABLE)) { ++ if (tp->tg3_flags3 & TG3_FLG3_RGMII_EXT_IBND_RX_EN) ++ val |= MAC_RGMII_MODE_RX_INT_B | ++ MAC_RGMII_MODE_RX_QUALITY | ++ MAC_RGMII_MODE_RX_ACTIVITY | ++ MAC_RGMII_MODE_RX_ENG_DET; ++ if (tp->tg3_flags3 & TG3_FLG3_RGMII_EXT_IBND_TX_EN) ++ val |= MAC_RGMII_MODE_TX_ENABLE | ++ MAC_RGMII_MODE_TX_LOWPWR | ++ MAC_RGMII_MODE_TX_RESET; ++ } ++ tw32(MAC_EXT_RGMII_MODE, val); ++} ++static int tg3_mdio_init(struct tg3 *tp) ++{ ++ tg3_mdio_start(tp); ++ return 0; ++} ++#define tg3_mdio_stop(tp) ++#define tg3_mdio_fini(tp) ++#endif /* BCM_INCLUDE_PHYLIB_SUPPORT */ + + /* tp->lock is held. */ + static inline void tg3_generate_fw_event(struct tg3 *tp) +@@ -1138,9 +1335,9 @@ + printk(KERN_INFO PFX + "%s: Flow control is %s for TX and %s for RX.\n", + tp->dev->name, +- (tp->link_config.active_flowctrl & TG3_FLOW_CTRL_TX) ? ++ (tp->link_config.active_flowctrl & FLOW_CTRL_TX) ? + "on" : "off", +- (tp->link_config.active_flowctrl & TG3_FLOW_CTRL_RX) ? ++ (tp->link_config.active_flowctrl & FLOW_CTRL_RX) ? + "on" : "off"); + tg3_ump_link_report(tp); + } +@@ -1150,11 +1347,11 @@ + { + u16 miireg; + +- if ((flow_ctrl & TG3_FLOW_CTRL_TX) && (flow_ctrl & TG3_FLOW_CTRL_RX)) ++ if ((flow_ctrl & FLOW_CTRL_TX) && (flow_ctrl & FLOW_CTRL_RX)) + miireg = ADVERTISE_PAUSE_CAP; +- else if (flow_ctrl & TG3_FLOW_CTRL_TX) ++ else if (flow_ctrl & FLOW_CTRL_TX) + miireg = ADVERTISE_PAUSE_ASYM; +- else if (flow_ctrl & TG3_FLOW_CTRL_RX) ++ else if (flow_ctrl & FLOW_CTRL_RX) + miireg = ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM; + else + miireg = 0; +@@ -1166,38 +1363,16 @@ + { + u16 miireg; + +- if ((flow_ctrl & TG3_FLOW_CTRL_TX) && (flow_ctrl & TG3_FLOW_CTRL_RX)) ++ if ((flow_ctrl & FLOW_CTRL_TX) && (flow_ctrl & FLOW_CTRL_RX)) + miireg = ADVERTISE_1000XPAUSE; +- else if (flow_ctrl & TG3_FLOW_CTRL_TX) ++ else if (flow_ctrl & FLOW_CTRL_TX) + miireg = ADVERTISE_1000XPSE_ASYM; +- else if (flow_ctrl & TG3_FLOW_CTRL_RX) ++ else if (flow_ctrl & FLOW_CTRL_RX) + miireg = ADVERTISE_1000XPAUSE | ADVERTISE_1000XPSE_ASYM; + else + miireg = 0; + + return miireg; +-} +- +-static u8 tg3_resolve_flowctrl_1000T(u16 lcladv, u16 rmtadv) +-{ +- u8 cap = 0; +- +- if (lcladv & ADVERTISE_PAUSE_CAP) { +- if (lcladv & ADVERTISE_PAUSE_ASYM) { +- if (rmtadv & LPA_PAUSE_CAP) +- cap = TG3_FLOW_CTRL_TX | TG3_FLOW_CTRL_RX; +- else if (rmtadv & LPA_PAUSE_ASYM) +- cap = TG3_FLOW_CTRL_RX; +- } else { +- if (rmtadv & LPA_PAUSE_CAP) +- cap = TG3_FLOW_CTRL_TX | TG3_FLOW_CTRL_RX; +- } +- } else if (lcladv & ADVERTISE_PAUSE_ASYM) { +- if ((rmtadv & LPA_PAUSE_CAP) && (rmtadv & LPA_PAUSE_ASYM)) +- cap = TG3_FLOW_CTRL_TX; +- } +- +- return cap; + } + + static u8 tg3_resolve_flowctrl_1000X(u16 lcladv, u16 rmtadv) +@@ -1207,16 +1382,16 @@ + if (lcladv & ADVERTISE_1000XPAUSE) { + if (lcladv & ADVERTISE_1000XPSE_ASYM) { + if (rmtadv & LPA_1000XPAUSE) +- cap = TG3_FLOW_CTRL_TX | TG3_FLOW_CTRL_RX; ++ cap = FLOW_CTRL_TX | FLOW_CTRL_RX; + else if (rmtadv & LPA_1000XPAUSE_ASYM) +- cap = TG3_FLOW_CTRL_RX; ++ cap = FLOW_CTRL_RX; + } else { + if (rmtadv & LPA_1000XPAUSE) +- cap = TG3_FLOW_CTRL_TX | TG3_FLOW_CTRL_RX; ++ cap = FLOW_CTRL_TX | FLOW_CTRL_RX; + } + } else if (lcladv & ADVERTISE_1000XPSE_ASYM) { + if ((rmtadv & LPA_1000XPAUSE) && (rmtadv & LPA_1000XPAUSE_ASYM)) +- cap = TG3_FLOW_CTRL_TX; ++ cap = FLOW_CTRL_TX; + } + + return cap; +@@ -1229,9 +1404,11 @@ + u32 old_rx_mode = tp->rx_mode; + u32 old_tx_mode = tp->tx_mode; + ++#ifdef BCM_INCLUDE_PHYLIB_SUPPORT + if (tp->tg3_flags3 & TG3_FLG3_USE_PHYLIB) +- autoneg = tp->mdio_bus.phy_map[PHY_ADDR]->autoneg; +- else ++ autoneg = tp->mdio_bus->phy_map[PHY_ADDR]->autoneg; ++ else ++#endif /* BCM_INCLUDE_PHYLIB_SUPPORT */ + autoneg = tp->link_config.autoneg; + + if (autoneg == AUTONEG_ENABLE && +@@ -1239,13 +1416,13 @@ + if (tp->tg3_flags2 & TG3_FLG2_ANY_SERDES) + flowctrl = tg3_resolve_flowctrl_1000X(lcladv, rmtadv); + else +- flowctrl = tg3_resolve_flowctrl_1000T(lcladv, rmtadv); ++ flowctrl = mii_resolve_flowctrl_fdx(lcladv, rmtadv); + } else + flowctrl = tp->link_config.flowctrl; + + tp->link_config.active_flowctrl = flowctrl; + +- if (flowctrl & TG3_FLOW_CTRL_RX) ++ if (flowctrl & FLOW_CTRL_RX) + tp->rx_mode |= RX_MODE_FLOW_CTRL_ENABLE; + else + tp->rx_mode &= ~RX_MODE_FLOW_CTRL_ENABLE; +@@ -1253,7 +1430,7 @@ + if (old_rx_mode != tp->rx_mode) + tw32_f(MAC_RX_MODE, tp->rx_mode); + +- if (flowctrl & TG3_FLOW_CTRL_TX) ++ if (flowctrl & FLOW_CTRL_TX) + tp->tx_mode |= TX_MODE_FLOW_CTRL_ENABLE; + else + tp->tx_mode &= ~TX_MODE_FLOW_CTRL_ENABLE; +@@ -1262,12 +1439,13 @@ + tw32_f(MAC_TX_MODE, tp->tx_mode); + } + ++#ifdef BCM_INCLUDE_PHYLIB_SUPPORT + static void tg3_adjust_link(struct net_device *dev) + { + u8 oldflowctrl, linkmesg = 0; + u32 mac_mode, lcl_adv, rmt_adv; + struct tg3 *tp = netdev_priv(dev); +- struct phy_device *phydev = tp->mdio_bus.phy_map[PHY_ADDR]; ++ struct phy_device *phydev = tp->mdio_bus->phy_map[PHY_ADDR]; + + spin_lock(&tp->lock); + +@@ -1305,6 +1483,15 @@ + tp->mac_mode = mac_mode; + tw32_f(MAC_MODE, tp->mac_mode); + udelay(40); ++ } ++ ++ if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5785) { ++ if (phydev->speed == SPEED_10) ++ tw32(MAC_MI_STAT, ++ MAC_MI_STAT_10MBPS_MODE | ++ MAC_MI_STAT_LNKSTAT_ATTN_ENAB); ++ else ++ tw32(MAC_MI_STAT, MAC_MI_STAT_LNKSTAT_ATTN_ENAB); + } + + if (phydev->speed == SPEED_1000 && phydev->duplex == DUPLEX_HALF) +@@ -1344,29 +1531,41 @@ + /* Bring the PHY back to a known state. */ + tg3_bmcr_reset(tp); + +- phydev = tp->mdio_bus.phy_map[PHY_ADDR]; ++ phydev = tp->mdio_bus->phy_map[PHY_ADDR]; + + /* Attach the MAC to the PHY. */ +- phydev = phy_connect(tp->dev, phydev->dev.bus_id, tg3_adjust_link, ++ phydev = phy_connect(tp->dev, dev_name(&phydev->dev), tg3_adjust_link, + phydev->dev_flags, phydev->interface); + if (IS_ERR(phydev)) { + printk(KERN_ERR "%s: Could not attach to PHY\n", tp->dev->name); + return PTR_ERR(phydev); + } + ++ /* Mask with MAC supported features. */ ++ switch (phydev->interface) { ++ case PHY_INTERFACE_MODE_GMII: ++ case PHY_INTERFACE_MODE_RGMII: ++ if (!(tp->tg3_flags & TG3_FLAG_10_100_ONLY)) { ++ phydev->supported &= (PHY_GBIT_FEATURES | ++ SUPPORTED_Pause | ++ SUPPORTED_Asym_Pause); ++ break; ++ } ++ /* fallthru */ ++ case PHY_INTERFACE_MODE_MII: ++ phydev->supported &= (PHY_BASIC_FEATURES | ++ SUPPORTED_Pause | ++ SUPPORTED_Asym_Pause); ++ break; ++ default: ++ phy_disconnect(tp->mdio_bus->phy_map[PHY_ADDR]); ++ return -EINVAL; ++ } ++ + tp->tg3_flags3 |= TG3_FLG3_PHY_CONNECTED; + +- /* Mask with MAC supported features. */ +- phydev->supported &= (PHY_GBIT_FEATURES | +- SUPPORTED_Pause | +- SUPPORTED_Asym_Pause); +- + phydev->advertising = phydev->supported; + +- printk(KERN_INFO +- "%s: attached PHY driver [%s] (mii_bus:phy_addr=%s)\n", +- tp->dev->name, phydev->drv->name, phydev->dev.bus_id); +- + return 0; + } + +@@ -1377,7 +1576,7 @@ + if (!(tp->tg3_flags3 & TG3_FLG3_PHY_CONNECTED)) + return; + +- phydev = tp->mdio_bus.phy_map[PHY_ADDR]; ++ phydev = tp->mdio_bus->phy_map[PHY_ADDR]; + + if (tp->link_config.phy_is_low_power) { + tp->link_config.phy_is_low_power = 0; +@@ -1397,16 +1596,22 @@ + if (!(tp->tg3_flags3 & TG3_FLG3_PHY_CONNECTED)) + return; + +- phy_stop(tp->mdio_bus.phy_map[PHY_ADDR]); ++ phy_stop(tp->mdio_bus->phy_map[PHY_ADDR]); + } + + static void tg3_phy_fini(struct tg3 *tp) + { + if (tp->tg3_flags3 & TG3_FLG3_PHY_CONNECTED) { +- phy_disconnect(tp->mdio_bus.phy_map[PHY_ADDR]); ++ phy_disconnect(tp->mdio_bus->phy_map[PHY_ADDR]); + tp->tg3_flags3 &= ~TG3_FLG3_PHY_CONNECTED; + } + } ++#else ++#define tg3_phy_init(tp) 0 ++#define tg3_phy_start(tp) ++#define tg3_phy_stop(tp) ++#define tg3_phy_fini(tp) ++#endif /* BCM_INCLUDE_PHYLIB_SUPPORT */ + + static void tg3_phydsp_write(struct tg3 *tp, u32 reg, u32 val) + { +@@ -1414,6 +1619,60 @@ + tg3_writephy(tp, MII_TG3_DSP_RW_PORT, val); + } + ++static void tg3_phy_fet_toggle_apd(struct tg3 *tp, bool enable) ++{ ++ u32 phytest; ++ ++ if (!tg3_readphy(tp, MII_TG3_FET_TEST, &phytest)) { ++ u32 phy; ++ ++ tg3_writephy(tp, MII_TG3_FET_TEST, ++ phytest | MII_TG3_FET_SHADOW_EN); ++ if (!tg3_readphy(tp, MII_TG3_FET_SHDW_AUXSTAT2, &phy)) { ++ if (enable) ++ phy |= MII_TG3_FET_SHDW_AUXSTAT2_APD; ++ else ++ phy &= ~MII_TG3_FET_SHDW_AUXSTAT2_APD; ++ tg3_writephy(tp, MII_TG3_FET_SHDW_AUXSTAT2, phy); ++ } ++ tg3_writephy(tp, MII_TG3_FET_TEST, phytest); ++ } ++} ++ ++static void tg3_phy_toggle_apd(struct tg3 *tp, bool enable) ++{ ++ u32 reg; ++ ++ if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) ++ return; ++ ++ if (tp->tg3_flags3 & TG3_FLG3_PHY_IS_FET) { ++ tg3_phy_fet_toggle_apd(tp, enable); ++ return; ++ } ++ ++ reg = MII_TG3_MISC_SHDW_WREN | ++ MII_TG3_MISC_SHDW_SCR5_SEL | ++ MII_TG3_MISC_SHDW_SCR5_LPED | ++ MII_TG3_MISC_SHDW_SCR5_DLPTLM | ++ MII_TG3_MISC_SHDW_SCR5_SDTL | ++ MII_TG3_MISC_SHDW_SCR5_C125OE; ++ if ((GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5784 && ++ GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5785) || !enable) ++ reg |= MII_TG3_MISC_SHDW_SCR5_DLLAPD; ++ ++ tg3_writephy(tp, MII_TG3_MISC_SHDW, reg); ++ ++ ++ reg = MII_TG3_MISC_SHDW_WREN | ++ MII_TG3_MISC_SHDW_APD_SEL | ++ MII_TG3_MISC_SHDW_APD_WKTM_84MS; ++ if (enable) ++ reg |= MII_TG3_MISC_SHDW_APD_ENABLE; ++ ++ tg3_writephy(tp, MII_TG3_MISC_SHDW, reg); ++} ++ + static void tg3_phy_toggle_automdix(struct tg3 *tp, int enable) + { + u32 phy; +@@ -1422,20 +1681,20 @@ + (tp->tg3_flags2 & TG3_FLG2_ANY_SERDES)) + return; + +- if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) { ++ if (tp->tg3_flags3 & TG3_FLG3_PHY_IS_FET) { + u32 ephy; + +- if (!tg3_readphy(tp, MII_TG3_EPHY_TEST, &ephy)) { +- tg3_writephy(tp, MII_TG3_EPHY_TEST, +- ephy | MII_TG3_EPHY_SHADOW_EN); +- if (!tg3_readphy(tp, MII_TG3_EPHYTST_MISCCTRL, &phy)) { ++ if (!tg3_readphy(tp, MII_TG3_FET_TEST, &ephy)) { ++ tg3_writephy(tp, MII_TG3_FET_TEST, ++ ephy | MII_TG3_FET_SHADOW_EN); ++ if (!tg3_readphy(tp, MII_TG3_FET_SHDW_MISCCTRL, &phy)) { + if (enable) +- phy |= MII_TG3_EPHYTST_MISCCTRL_MDIX; ++ phy |= MII_TG3_FET_SHDW_MISCCTRL_MDIX; + else +- phy &= ~MII_TG3_EPHYTST_MISCCTRL_MDIX; +- tg3_writephy(tp, MII_TG3_EPHYTST_MISCCTRL, phy); +- } +- tg3_writephy(tp, MII_TG3_EPHY_TEST, ephy); ++ phy &= ~MII_TG3_FET_SHDW_MISCCTRL_MDIX; ++ tg3_writephy(tp, MII_TG3_FET_SHDW_MISCCTRL, phy); ++ } ++ tg3_writephy(tp, MII_TG3_FET_TEST, ephy); + } + } else { + phy = MII_TG3_AUXCTL_MISC_RDSEL_MISC | +@@ -1520,7 +1779,7 @@ + break; + } + } +- if (limit <= 0) ++ if (limit < 0) + return -EBUSY; + + return 0; +@@ -1745,7 +2004,8 @@ + tw32(TG3_CPMU_CTRL, cpmuctrl); + } + +- if (tp->tg3_flags3 & TG3_FLG3_5761_5784_AX_FIXES) { ++ if (GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5784_AX || ++ GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5761_AX) { + u32 val; + + val = tr32(TG3_CPMU_LSPD_1000MB_CLK); +@@ -1755,17 +2015,42 @@ + udelay(40); + tw32_f(TG3_CPMU_LSPD_1000MB_CLK, val); + } +- +- /* Disable GPHY autopowerdown. */ +- tg3_writephy(tp, MII_TG3_MISC_SHDW, +- MII_TG3_MISC_SHDW_WREN | +- MII_TG3_MISC_SHDW_APD_SEL | +- MII_TG3_MISC_SHDW_APD_WKTM_84MS); + } + + tg3_phy_apply_otp(tp); + ++ if (tp->tg3_flags3 & TG3_FLG3_PHY_ENABLE_APD) ++ tg3_phy_toggle_apd(tp, true); ++ else ++ tg3_phy_toggle_apd(tp, false); ++ + out: ++#ifndef BCM_INCLUDE_PHYLIB_SUPPORT ++ /* Apply workaround to A0 revision parts only. */ ++ if (tp->phy_id == PHY_ID_BCM50610 || tp->phy_id == PHY_ID_BCM50610M) { ++ tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x0C00); ++ tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x0F08); ++ tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x0201); ++ tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x001F); ++ tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x0300); ++ tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x601F); ++ tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x0002); ++ tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x0F75); ++ tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x003C); ++ tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x0F96); ++ tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x0010); ++ tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x0F97); ++ tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x0400); ++ } ++ if ((tp->phy_id & PHY_ID_MASK) == PHY_ID_BCM57780) { ++ u32 reg; ++ ++ tg3_writephy(tp, MII_TG3_DSP_ADDRESS, MII_TG3_DSP_EXP75); ++ tg3_readphy(tp, MII_TG3_DSP_RW_PORT, ®); ++ reg |= MII_TG3_DSP_EXP75_SUP_CM_OSC; ++ tg3_phydsp_write(tp, MII_TG3_DSP_EXP75, reg); ++ } ++#endif + if (tp->tg3_flags2 & TG3_FLG2_PHY_ADC_BUG) { + tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x0c00); + tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x201f); +@@ -1804,7 +2089,7 @@ + if ((tp->phy_id & PHY_ID_MASK) == PHY_ID_BCM5401) { + /* Cannot do read-modify-write on 5401 */ + tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x4c20); +- } else if (tp->tg3_flags2 & TG3_FLG2_JUMBO_CAPABLE) { ++ } else if (tp->tg3_flags & TG3_FLAG_JUMBO_CAPABLE) { + u32 phy_reg; + + /* Set bit 14 with read-modify-write to preserve other bits */ +@@ -1816,7 +2101,7 @@ + /* Set phy register 0x10 bit 0 to high fifo elasticity to support + * jumbo frames transmission. + */ +- if (tp->tg3_flags2 & TG3_FLG2_JUMBO_CAPABLE) { ++ if (tp->tg3_flags & TG3_FLAG_JUMBO_CAPABLE) { + u32 phy_reg; + + if (!tg3_readphy(tp, MII_TG3_EXT_CTRL, &phy_reg)) +@@ -1824,9 +2109,21 @@ + phy_reg | MII_TG3_EXT_CTRL_FIFO_ELASTIC); + } + +- if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) { +- /* adjust output voltage */ +- tg3_writephy(tp, MII_TG3_EPHY_PTEST, 0x12); ++ if (tp->tg3_flags3 & TG3_FLG3_PHY_IS_FET) { ++ if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) { ++ /* adjust output voltage */ ++ tg3_writephy(tp, MII_TG3_FET_PTEST, 0x12); ++ } else { ++ u32 brcmtest; ++ if (!tg3_readphy(tp, MII_TG3_FET_TEST, &brcmtest) && ++ !tg3_writephy(tp, MII_TG3_FET_TEST, ++ brcmtest | MII_TG3_FET_SHADOW_EN)) { ++ ++ tg3_writephy(tp, 0x1a, 0x3001); ++ ++ tg3_writephy(tp, MII_TG3_FET_TEST, brcmtest); ++ } ++ } + } + + tg3_phy_toggle_automdix(tp, 1); +@@ -1866,7 +2163,8 @@ + GRC_LCLCTRL_GPIO_OUTPUT0 | + GRC_LCLCTRL_GPIO_OUTPUT1), + 100); +- } else if (tp->pdev->device == PCI_DEVICE_ID_TIGON3_5761) { ++ } else if (tp->pdev->device == PCI_DEVICE_ID_TIGON3_5761 || ++ tp->pdev->device == TG3PCI_DEVICE_TIGON3_5761S) { + /* The 5761 non-e device swaps GPIO 0 and GPIO 2. */ + u32 grc_local_ctrl = GRC_LCLCTRL_GPIO_OE0 | + GRC_LCLCTRL_GPIO_OE1 | +@@ -1966,10 +2264,8 @@ + + static void tg3_write_sig_post_reset(struct tg3 *, int); + static int tg3_halt_cpu(struct tg3 *, u32); +-static int tg3_nvram_lock(struct tg3 *); +-static void tg3_nvram_unlock(struct tg3 *); +- +-static void tg3_power_down_phy(struct tg3 *tp) ++ ++static void tg3_power_down_phy(struct tg3 *tp, bool do_low_power) + { + u32 val; + +@@ -1986,16 +2282,23 @@ + return; + } + +- if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) { +- tg3_bmcr_reset(tp); +- val = tr32(GRC_MISC_CFG); +- tw32_f(GRC_MISC_CFG, val | GRC_MISC_CFG_EPHY_IDDQ); +- udelay(40); +- return; +- } else if (!(tp->tg3_flags3 & TG3_FLG3_USE_PHYLIB)) { ++ if (tp->tg3_flags3 & TG3_FLG3_PHY_IS_FET) { ++ if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) { ++ tg3_bmcr_reset(tp); ++ val = tr32(GRC_MISC_CFG); ++ tw32_f(GRC_MISC_CFG, val | GRC_MISC_CFG_EPHY_IDDQ); ++ udelay(40); ++ return; ++ } ++ } else if (do_low_power) { + tg3_writephy(tp, MII_TG3_EXT_CTRL, + MII_TG3_EXT_CTRL_FORCE_LED_OFF); +- tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x01b2); ++ ++ tg3_writephy(tp, MII_TG3_AUX_CTRL, ++ MII_TG3_AUXCTL_SHDWSEL_PWRCTL | ++ MII_TG3_AUXCTL_PCTL_100TX_LPWR | ++ MII_TG3_AUXCTL_PCTL_SPR_ISOLATE | ++ MII_TG3_AUXCTL_PCTL_VREG_11V); + } + + /* The PHY should not be powered down on some chips because +@@ -2007,7 +2310,8 @@ + (tp->tg3_flags2 & TG3_FLG2_MII_SERDES))) + return; + +- if (tp->tg3_flags3 & TG3_FLG3_5761_5784_AX_FIXES) { ++ if (GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5784_AX || ++ GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5761_AX) { + val = tr32(TG3_CPMU_LSPD_1000MB_CLK); + val &= ~CPMU_LSPD_1000MB_MACCLK_MASK; + val |= CPMU_LSPD_1000MB_MACCLK_12_5; +@@ -2017,9 +2321,242 @@ + tg3_writephy(tp, MII_BMCR, BMCR_PDOWN); + } + ++/* tp->lock is held. */ ++static int tg3_nvram_lock(struct tg3 *tp) ++{ ++ if (tp->tg3_flags & TG3_FLAG_NVRAM) { ++ int i; ++ ++ if (tp->nvram_lock_cnt == 0) { ++ tw32(NVRAM_SWARB, SWARB_REQ_SET1); ++ for (i = 0; i < 8000; i++) { ++ if (tr32(NVRAM_SWARB) & SWARB_GNT1) ++ break; ++ udelay(20); ++ } ++ if (i == 8000) { ++ tw32(NVRAM_SWARB, SWARB_REQ_CLR1); ++ return -ENODEV; ++ } ++ } ++ tp->nvram_lock_cnt++; ++ } ++ return 0; ++} ++ ++/* tp->lock is held. */ ++static void tg3_nvram_unlock(struct tg3 *tp) ++{ ++ if (tp->tg3_flags & TG3_FLAG_NVRAM) { ++ if (tp->nvram_lock_cnt > 0) ++ tp->nvram_lock_cnt--; ++ if (tp->nvram_lock_cnt == 0) ++ tw32_f(NVRAM_SWARB, SWARB_REQ_CLR1); ++ } ++} ++ ++/* tp->lock is held. */ ++static void tg3_enable_nvram_access(struct tg3 *tp) ++{ ++ if ((tp->tg3_flags2 & TG3_FLG2_5750_PLUS) && ++ !(tp->tg3_flags2 & TG3_FLG2_PROTECTED_NVRAM)) { ++ u32 nvaccess = tr32(NVRAM_ACCESS); ++ ++ tw32(NVRAM_ACCESS, nvaccess | ACCESS_ENABLE); ++ } ++} ++ ++/* tp->lock is held. */ ++static void tg3_disable_nvram_access(struct tg3 *tp) ++{ ++ if ((tp->tg3_flags2 & TG3_FLG2_5750_PLUS) && ++ !(tp->tg3_flags2 & TG3_FLG2_PROTECTED_NVRAM)) { ++ u32 nvaccess = tr32(NVRAM_ACCESS); ++ ++ tw32(NVRAM_ACCESS, nvaccess & ~ACCESS_ENABLE); ++ } ++} ++ ++static int tg3_nvram_read_using_eeprom(struct tg3 *tp, ++ u32 offset, u32 *val) ++{ ++ u32 tmp; ++ int i; ++ ++ if (offset > EEPROM_ADDR_ADDR_MASK || (offset % 4) != 0) ++ return -EINVAL; ++ ++ tmp = tr32(GRC_EEPROM_ADDR) & ~(EEPROM_ADDR_ADDR_MASK | ++ EEPROM_ADDR_DEVID_MASK | ++ EEPROM_ADDR_READ); ++ tw32(GRC_EEPROM_ADDR, ++ tmp | ++ (0 << EEPROM_ADDR_DEVID_SHIFT) | ++ ((offset << EEPROM_ADDR_ADDR_SHIFT) & ++ EEPROM_ADDR_ADDR_MASK) | ++ EEPROM_ADDR_READ | EEPROM_ADDR_START); ++ ++ for (i = 0; i < 1000; i++) { ++ tmp = tr32(GRC_EEPROM_ADDR); ++ ++ if (tmp & EEPROM_ADDR_COMPLETE) ++ break; ++ msleep(1); ++ } ++ if (!(tmp & EEPROM_ADDR_COMPLETE)) ++ return -EBUSY; ++ ++ tmp = tr32(GRC_EEPROM_DATA); ++ ++ /* ++ * The data will always be opposite the native endian ++ * format. Perform a blind byteswap to compensate. ++ */ ++ *val = swab32(tmp); ++ ++ return 0; ++} ++ ++#define NVRAM_CMD_TIMEOUT 10000 ++ ++static int tg3_nvram_exec_cmd(struct tg3 *tp, u32 nvram_cmd) ++{ ++ int i; ++ ++ tw32(NVRAM_CMD, nvram_cmd); ++ for (i = 0; i < NVRAM_CMD_TIMEOUT; i++) { ++ udelay(10); ++ if (tr32(NVRAM_CMD) & NVRAM_CMD_DONE) { ++ udelay(10); ++ break; ++ } ++ } ++ ++ if (i == NVRAM_CMD_TIMEOUT) ++ return -EBUSY; ++ ++ return 0; ++} ++ ++static u32 tg3_nvram_phys_addr(struct tg3 *tp, u32 addr) ++{ ++ if ((tp->tg3_flags & TG3_FLAG_NVRAM) && ++ (tp->tg3_flags & TG3_FLAG_NVRAM_BUFFERED) && ++ (tp->tg3_flags2 & TG3_FLG2_FLASH) && ++ !(tp->tg3_flags3 & TG3_FLG3_NO_NVRAM_ADDR_TRANS) && ++ (tp->nvram_jedecnum == JEDEC_ATMEL)) ++ ++ addr = ((addr / tp->nvram_pagesize) << ++ ATMEL_AT45DB0X1B_PAGE_POS) + ++ (addr % tp->nvram_pagesize); ++ ++ return addr; ++} ++ ++static u32 tg3_nvram_logical_addr(struct tg3 *tp, u32 addr) ++{ ++ if ((tp->tg3_flags & TG3_FLAG_NVRAM) && ++ (tp->tg3_flags & TG3_FLAG_NVRAM_BUFFERED) && ++ (tp->tg3_flags2 & TG3_FLG2_FLASH) && ++ !(tp->tg3_flags3 & TG3_FLG3_NO_NVRAM_ADDR_TRANS) && ++ (tp->nvram_jedecnum == JEDEC_ATMEL)) ++ ++ addr = ((addr >> ATMEL_AT45DB0X1B_PAGE_POS) * ++ tp->nvram_pagesize) + ++ (addr & ((1 << ATMEL_AT45DB0X1B_PAGE_POS) - 1)); ++ ++ return addr; ++} ++ ++/* NOTE: Data read in from NVRAM is byteswapped according to ++ * the byteswapping settings for all other register accesses. ++ * tg3 devices are BE devices, so on a BE machine, the data ++ * returned will be exactly as it is seen in NVRAM. On a LE ++ * machine, the 32-bit value will be byteswapped. ++ */ ++static int tg3_nvram_read(struct tg3 *tp, u32 offset, u32 *val) ++{ ++ int ret; ++ ++ if (!(tp->tg3_flags & TG3_FLAG_NVRAM)) ++ return tg3_nvram_read_using_eeprom(tp, offset, val); ++ ++ offset = tg3_nvram_phys_addr(tp, offset); ++ ++ if (offset > NVRAM_ADDR_MSK) ++ return -EINVAL; ++ ++ ret = tg3_nvram_lock(tp); ++ if (ret) ++ return ret; ++ ++ tg3_enable_nvram_access(tp); ++ ++ tw32(NVRAM_ADDR, offset); ++ ret = tg3_nvram_exec_cmd(tp, NVRAM_CMD_RD | NVRAM_CMD_GO | ++ NVRAM_CMD_FIRST | NVRAM_CMD_LAST | NVRAM_CMD_DONE); ++ ++ if (ret == 0) ++ *val = tr32(NVRAM_RDDATA); ++ ++ tg3_disable_nvram_access(tp); ++ ++ tg3_nvram_unlock(tp); ++ ++ return ret; ++} ++ ++/* Ensures NVRAM data is in bytestream format. */ ++static int tg3_nvram_read_be32(struct tg3 *tp, u32 offset, __be32 *val) ++{ ++ u32 v; ++ int res = tg3_nvram_read(tp, offset, &v); ++ if (!res) ++ *val = cpu_to_be32(v); ++ return res; ++} ++ ++/* tp->lock is held. */ ++static void __tg3_set_mac_addr(struct tg3 *tp, int skip_mac_1) ++{ ++ u32 addr_high, addr_low; ++ int i; ++ ++ addr_high = ((tp->dev->dev_addr[0] << 8) | ++ tp->dev->dev_addr[1]); ++ addr_low = ((tp->dev->dev_addr[2] << 24) | ++ (tp->dev->dev_addr[3] << 16) | ++ (tp->dev->dev_addr[4] << 8) | ++ (tp->dev->dev_addr[5] << 0)); ++ for (i = 0; i < 4; i++) { ++ if (i == 1 && skip_mac_1) ++ continue; ++ tw32(MAC_ADDR_0_HIGH + (i * 8), addr_high); ++ tw32(MAC_ADDR_0_LOW + (i * 8), addr_low); ++ } ++ ++ if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703 || ++ GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) { ++ for (i = 0; i < 12; i++) { ++ tw32(MAC_EXTADDR_0_HIGH + (i * 8), addr_high); ++ tw32(MAC_EXTADDR_0_LOW + (i * 8), addr_low); ++ } ++ } ++ ++ addr_high = (tp->dev->dev_addr[0] + ++ tp->dev->dev_addr[1] + ++ tp->dev->dev_addr[2] + ++ tp->dev->dev_addr[3] + ++ tp->dev->dev_addr[4] + ++ tp->dev->dev_addr[5]) & ++ TX_BACKOFF_SEED_MASK; ++ tw32(MAC_TX_BACKOFF_SEED, addr_high); ++} ++ + static int tg3_set_power_state(struct tg3 *tp, pci_power_t state) + { + u32 misc_host_ctrl; ++ bool device_should_wake, do_low_power; + + /* Make sure register accesses (indirect or otherwise) + * will function correctly. +@@ -2049,17 +2586,37 @@ + tp->dev->name, state); + return -EINVAL; + } ++ ++ /* Restore the CLKREQ setting. */ ++ if (tp->tg3_flags3 & TG3_FLG3_CLKREQ_BUG) { ++ u16 lnkctl; ++ ++ pci_read_config_word(tp->pdev, ++ tp->pcie_cap + PCI_EXP_LNKCTL, ++ &lnkctl); ++ lnkctl |= PCI_EXP_LNKCTL_CLKREQ_EN; ++ pci_write_config_word(tp->pdev, ++ tp->pcie_cap + PCI_EXP_LNKCTL, ++ lnkctl); ++ } ++ + misc_host_ctrl = tr32(TG3PCI_MISC_HOST_CTRL); + tw32(TG3PCI_MISC_HOST_CTRL, + misc_host_ctrl | MISC_HOST_CTRL_MASK_PCI_INT); + ++ device_should_wake = pci_pme_capable(tp->pdev, state) && ++ device_may_wakeup(&tp->pdev->dev) && ++ (tp->tg3_flags & TG3_FLAG_WOL_ENABLE); ++ ++#ifdef BCM_INCLUDE_PHYLIB_SUPPORT + if (tp->tg3_flags3 & TG3_FLG3_USE_PHYLIB) { ++ do_low_power = false; + if ((tp->tg3_flags3 & TG3_FLG3_PHY_CONNECTED) && + !tp->link_config.phy_is_low_power) { + struct phy_device *phydev; +- u32 advertising; +- +- phydev = tp->mdio_bus.phy_map[PHY_ADDR]; ++ u32 phyid, advertising; ++ ++ phydev = tp->mdio_bus->phy_map[PHY_ADDR]; + + tp->link_config.phy_is_low_power = 1; + +@@ -2074,7 +2631,7 @@ + ADVERTISED_10baseT_Half; + + if ((tp->tg3_flags & TG3_FLAG_ENABLE_ASF) || +- (tp->tg3_flags & TG3_FLAG_WOL_ENABLE)) { ++ device_should_wake) { + if (tp->tg3_flags & TG3_FLAG_WOL_SPEED_100MB) + advertising |= + ADVERTISED_100baseT_Half | +@@ -2087,8 +2644,21 @@ + phydev->advertising = advertising; + + phy_start_aneg(phydev); +- } +- } else { ++ ++ phyid = phydev->drv->phy_id & phydev->drv->phy_id_mask; ++ if (phyid != PHY_ID_BCMAC131) { ++ phyid &= TG3_PHY_OUI_MASK; ++ if (phyid == TG3_PHY_OUI_1 || ++ phyid == TG3_PHY_OUI_2 || ++ phyid == TG3_PHY_OUI_3) ++ do_low_power = true; ++ } ++ } ++ } else ++#endif /* BCM_INCLUDE_PHYLIB_SUPPORT */ ++ { ++ do_low_power = true; ++ + if (tp->link_config.phy_is_low_power == 0) { + tp->link_config.phy_is_low_power = 1; + tp->link_config.orig_speed = tp->link_config.speed; +@@ -2126,11 +2696,11 @@ + WOL_DRV_WOL | + WOL_SET_MAGIC_PKT); + +- if (tp->tg3_flags & TG3_FLAG_WOL_ENABLE) { ++ if (device_should_wake) { + u32 mac_mode; + + if (!(tp->tg3_flags2 & TG3_FLG2_PHY_SERDES)) { +- if (!(tp->tg3_flags3 & TG3_FLG3_USE_PHYLIB)) { ++ if (do_low_power) { + tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x5a); + udelay(40); + } +@@ -2158,9 +2728,12 @@ + if (!(tp->tg3_flags2 & TG3_FLG2_5750_PLUS)) + tw32(MAC_LED_CTRL, tp->led_ctrl); + +- if (pci_pme_capable(tp->pdev, state) && +- (tp->tg3_flags & TG3_FLAG_WOL_ENABLE)) +- mac_mode |= MAC_MODE_MAGIC_PKT_ENABLE; ++ mac_mode |= MAC_MODE_MAGIC_PKT_ENABLE; ++ if (((tp->tg3_flags2 & TG3_FLG2_5705_PLUS) && ++ !(tp->tg3_flags2 & TG3_FLG2_5780_CLASS)) && ++ ((tp->tg3_flags & TG3_FLAG_ENABLE_ASF) || ++ (tp->tg3_flags3 & TG3_FLG3_ENABLE_APE))) ++ mac_mode |= MAC_MODE_KEEP_FRAME_IN_WOL; + + if (tp->tg3_flags3 & TG3_FLG3_ENABLE_APE) { + mac_mode |= tp->mac_mode & +@@ -2232,10 +2805,9 @@ + } + } + +- if (!(tp->tg3_flags & TG3_FLAG_WOL_ENABLE) && +- !(tp->tg3_flags & TG3_FLAG_ENABLE_ASF) && +- !(tp->tg3_flags3 & TG3_FLG3_ENABLE_APE)) +- tg3_power_down_phy(tp); ++ if (!(device_should_wake) && ++ !(tp->tg3_flags & TG3_FLAG_ENABLE_ASF)) ++ tg3_power_down_phy(tp, do_low_power); + + tg3_frob_aux_power(tp); + +@@ -2258,7 +2830,7 @@ + + tg3_write_sig_post_reset(tp, RESET_KIND_SHUTDOWN); + +- if (tp->tg3_flags & TG3_FLAG_WOL_ENABLE) ++ if (device_should_wake) + pci_enable_wake(tp->pdev, state, true); + + /* Finally, set the new power state. */ +@@ -2301,7 +2873,7 @@ + break; + + default: +- if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) { ++ if (tp->tg3_flags3 & TG3_FLG3_PHY_IS_FET) { + *speed = (val & MII_TG3_AUX_STAT_100) ? SPEED_100 : + SPEED_10; + *duplex = (val & MII_TG3_AUX_STAT_FULL) ? DUPLEX_FULL : +@@ -2636,7 +3208,7 @@ + + if (tp->tg3_flags & TG3_FLAG_USE_MI_INTERRUPT) + tg3_writephy(tp, MII_TG3_IMASK, ~MII_TG3_INT_LINKCHG); +- else if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5906) ++ else if (!(tp->tg3_flags3 & TG3_FLG3_PHY_IS_FET)) + tg3_writephy(tp, MII_TG3_IMASK, ~0); + + if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 || +@@ -2746,7 +3318,9 @@ + tp->mac_mode |= MAC_MODE_PORT_MODE_MII; + else + tp->mac_mode |= MAC_MODE_PORT_MODE_GMII; +- } else ++ } else if (tp->tg3_flags3 & TG3_FLG3_PHY_IS_FET) ++ tp->mac_mode |= MAC_MODE_PORT_MODE_MII; ++ else + tp->mac_mode |= MAC_MODE_PORT_MODE_GMII; + + tp->mac_mode &= ~MAC_MODE_HALF_DUPLEX; +@@ -2773,6 +3347,17 @@ + + tw32_f(MAC_MODE, tp->mac_mode); + udelay(40); ++ ++#ifndef BCM_INCLUDE_PHYLIB_SUPPORT ++ if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5785) { ++ if (tp->link_config.active_speed == SPEED_10) ++ tw32(MAC_MI_STAT, ++ MAC_MI_STAT_10MBPS_MODE | ++ MAC_MI_STAT_LNKSTAT_ATTN_ENAB); ++ else ++ tw32(MAC_MI_STAT, MAC_MI_STAT_LNKSTAT_ATTN_ENAB); ++ } ++#endif + + if (tp->tg3_flags & TG3_FLAG_USE_LINKCHG_REG) { + /* Polled via timer. */ +@@ -2795,6 +3380,33 @@ + tg3_write_mem(tp, + NIC_SRAM_FIRMWARE_MBOX, + NIC_SRAM_FIRMWARE_MBOX_MAGIC2); ++ } ++ ++ /* Prevent send BD corruption. */ ++ if (tp->tg3_flags3 & TG3_FLG3_CLKREQ_BUG) { ++ u16 oldlnkctl, newlnkctl; ++ ++ pci_read_config_word(tp->pdev, ++ tp->pcie_cap + PCI_EXP_LNKCTL, ++ &oldlnkctl); ++ if (tp->link_config.active_speed == SPEED_100 || ++ tp->link_config.active_speed == SPEED_10) ++ newlnkctl = oldlnkctl & ~PCI_EXP_LNKCTL_CLKREQ_EN; ++ else ++ newlnkctl = oldlnkctl | PCI_EXP_LNKCTL_CLKREQ_EN; ++ if (newlnkctl != oldlnkctl) ++ pci_write_config_word(tp->pdev, ++ tp->pcie_cap + PCI_EXP_LNKCTL, ++ newlnkctl); ++ } else if (tp->tg3_flags3 & TG3_FLG3_TOGGLE_10_100_L1PLLPD) { ++ u32 newreg, oldreg = tr32(PCIE_LINK_CTRL); ++ if (tp->link_config.active_speed == SPEED_100 || ++ tp->link_config.active_speed == SPEED_10) ++ newreg = oldreg & ~PCIE_LINK_CTRL_L1_PLL_PD_EN; ++ else ++ newreg = oldreg | PCIE_LINK_CTRL_L1_PLL_PD_EN; ++ if (newreg != oldreg) ++ tw32(PCIE_LINK_CTRL, newreg); + } + + if (current_link_up != netif_carrier_ok(tp->dev)) { +@@ -3773,8 +4385,7 @@ + err = tg3_setup_copper_phy(tp, force_reset); + } + +- if (tp->pci_chip_rev_id == CHIPREV_ID_5784_A0 || +- tp->pci_chip_rev_id == CHIPREV_ID_5784_A1) { ++ if (GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5784_AX) { + u32 val, scale; + + val = tr32(TG3_CPMU_CLCK_STAT) & CPMU_CLCK_STAT_MAC_CLCK_MASK; +@@ -3871,10 +4482,7 @@ + return; + } + +- pci_unmap_single(tp->pdev, +- pci_unmap_addr(ri, mapping), +- skb_headlen(skb), +- PCI_DMA_TODEVICE); ++ tg3_skb_dma_unmap(tp, skb, DMA_TO_DEVICE); + + ri->skb = NULL; + +@@ -3884,12 +4492,6 @@ + ri = &tp->tx_buffers[sw_idx]; + if (unlikely(ri->skb != NULL || sw_idx == hw_idx)) + tx_bug = 1; +- +- pci_unmap_page(tp->pdev, +- pci_unmap_addr(ri, mapping), +- skb_shinfo(skb)->frags[i].size, +- PCI_DMA_TODEVICE); +- + sw_idx = NEXT_TX(sw_idx); + } + +@@ -3970,14 +4572,14 @@ + * Callers depend upon this behavior and assume that + * we leave everything unchanged if we fail. + */ +- skb = netdev_alloc_skb(tp->dev, skb_size); ++ skb = netdev_alloc_skb(tp->dev, skb_size + tp->rx_offset); + if (skb == NULL) + return -ENOMEM; + + skb_reserve(skb, tp->rx_offset); + + mapping = pci_map_single(tp->pdev, skb->data, +- skb_size - tp->rx_offset, ++ skb_size, + PCI_DMA_FROMDEVICE); + + map->skb = skb; +@@ -4032,13 +4634,6 @@ + + src_map->skb = NULL; + } +- +-#if TG3_VLAN_TAG_USED +-static int tg3_vlan_rx(struct tg3 *tp, struct sk_buff *skb, u16 vlan_tag) +-{ +- return vlan_hwaccel_receive_skb(skb, tp->vlgrp, vlan_tag); +-} +-#endif + + /* The RX ring scheme is composed of multiple rings which post fresh + * buffers to the chip, and one special ring the chip uses to report +@@ -4085,6 +4680,8 @@ + struct sk_buff *skb; + dma_addr_t dma_addr; + u32 opaque_key, desc_idx, *post_ptr; ++ bool hw_vlan __maybe_unused = false; ++ u16 vtag __maybe_unused = 0; + + desc_idx = desc->opaque & RXD_OPAQUE_INDEX_MASK; + opaque_key = desc->opaque & RXD_OPAQUE_RING_MASK; +@@ -4117,13 +4714,10 @@ + goto next_pkt; + } + +- len = ((desc->idx_len & RXD_LEN_MASK) >> RXD_LEN_SHIFT) - 4; /* omit crc */ +- +- if (len > RX_COPY_THRESHOLD +- && tp->rx_offset == 2 +- /* rx_offset != 2 iff this is a 5701 card running +- * in PCI-X mode [see tg3_get_invariants()] */ +- ) { ++ len = ((desc->idx_len & RXD_LEN_MASK) >> RXD_LEN_SHIFT) - ++ ETH_FCS_LEN; ++ ++ if (len > TG3_RX_COPY_THRESH(tp)) { + int skb_size; + + skb_size = tg3_alloc_rx_skb(tp, opaque_key, +@@ -4132,7 +4726,7 @@ + goto drop_it; + + pci_unmap_single(tp->pdev, dma_addr, +- skb_size - tp->rx_offset, ++ skb_size, + PCI_DMA_FROMDEVICE); + + skb_put(skb, len); +@@ -4142,11 +4736,12 @@ + tg3_recycle_rx(tp, opaque_key, + desc_idx, *post_ptr); + +- copy_skb = netdev_alloc_skb(tp->dev, len + 2); ++ copy_skb = netdev_alloc_skb(tp->dev, ++ len + TG3_RAW_IP_ALIGN + VLAN_HLEN); + if (copy_skb == NULL) + goto drop_it_no_recycle; + +- skb_reserve(copy_skb, 2); ++ skb_reserve(copy_skb, TG3_RAW_IP_ALIGN + VLAN_HLEN); + skb_put(copy_skb, len); + pci_dma_sync_single_for_cpu(tp->pdev, dma_addr, len, PCI_DMA_FROMDEVICE); + skb_copy_from_linear_data(skb, copy_skb->data, len); +@@ -4165,16 +4760,41 @@ + skb->ip_summed = CHECKSUM_NONE; + + skb->protocol = eth_type_trans(skb, tp->dev); ++ ++ if (len > (tp->dev->mtu + ETH_HLEN) && ++ skb->protocol != htons(ETH_P_8021Q)) { ++ dev_kfree_skb(skb); ++ goto next_pkt; ++ } ++ ++ if (desc->type_flags & RXD_FLAG_VLAN && ++ !(tp->rx_mode & RX_MODE_KEEP_VLAN_TAG)) { ++ vtag = desc->err_vlan & RXD_VLAN_MASK; + #if TG3_VLAN_TAG_USED +- if (tp->vlgrp != NULL && +- desc->type_flags & RXD_FLAG_VLAN) { +- tg3_vlan_rx(tp, skb, +- desc->err_vlan & RXD_VLAN_MASK); +- } else +-#endif +- netif_receive_skb(skb); +- ++ if (tp->vlgrp) ++ hw_vlan = true; ++ else ++#endif ++ { ++ struct vlan_ethhdr *ve = (struct vlan_ethhdr *) ++ __skb_push(skb, VLAN_HLEN); ++ ++ memmove(ve, skb->data + VLAN_HLEN, ETH_ALEN * 2); ++ ve->h_vlan_proto = htons(ETH_P_8021Q); ++ ve->h_vlan_TCI = htons(vtag); ++ } ++ } ++ ++#if TG3_VLAN_TAG_USED ++ if (hw_vlan) ++ vlan_gro_receive(&tp->napi, tp->vlgrp, vtag, skb); ++ else ++#endif ++ napi_gro_receive(&tp->napi, skb); ++ ++#if (LINUX_VERSION_CODE < 0x02061D) /* 2.6.29 */ + tp->dev->last_rx = jiffies; ++#endif + received++; + budget--; + +@@ -4203,6 +4823,9 @@ + /* ACK the status ring. */ + tp->rx_rcb_ptr = sw_idx; + tw32_rx_mbox(MAILBOX_RCVRET_CON_IDX_0 + TG3_64BIT_REG_LOW, sw_idx); ++ ++ /* Some platforms need to sync memory here */ ++ wmb(); + + /* Refill RX ring(s). */ + if (work_mask & RXD_OPAQUE_RING_STD) { +@@ -4219,6 +4842,8 @@ + + return received; + } ++ ++#ifdef TG3_NAPI + + static int tg3_poll_work(struct tg3 *tp, int work_done, int budget) + { +@@ -4283,12 +4908,13 @@ + * so we must read it before checking for more work. + */ + tp->last_tag = sblk->status_tag; ++ tp->last_irq_tag = tp->last_tag; + rmb(); + } else + sblk->status &= ~SD_STATUS_UPDATED; + + if (likely(!tg3_has_work(tp))) { +- netif_rx_complete(tp->dev, napi); ++ tg3_netif_rx_complete(tp->dev, napi); + tg3_restart_ints(tp); + break; + } +@@ -4298,11 +4924,85 @@ + + tx_recovery: + /* work_done is guaranteed to be less than budget. */ +- netif_rx_complete(tp->dev, napi); ++ tg3_netif_rx_complete(tp->dev, napi); + schedule_work(&tp->reset_task); + return work_done; + } + ++#else ++ ++static int tg3_poll(struct net_device *netdev, int *budget) ++{ ++ struct tg3 *tp = netdev_priv(netdev); ++ struct tg3_hw_status *sblk = tp->hw_status; ++ int done; ++ ++ /* handle link change and other phy events */ ++ if (!(tp->tg3_flags & ++ (TG3_FLAG_USE_LINKCHG_REG | ++ TG3_FLAG_POLL_SERDES))) { ++ if (sblk->status & SD_STATUS_LINK_CHG) { ++ sblk->status = SD_STATUS_UPDATED | ++ (sblk->status & ~SD_STATUS_LINK_CHG); ++ spin_lock(&tp->lock); ++ if (tp->tg3_flags3 & TG3_FLG3_USE_PHYLIB) { ++ tw32_f(MAC_STATUS, ++ (MAC_STATUS_SYNC_CHANGED | ++ MAC_STATUS_CFG_CHANGED | ++ MAC_STATUS_MI_COMPLETION | ++ MAC_STATUS_LNKSTATE_CHANGED)); ++ udelay(40); ++ } else ++ tg3_setup_phy(tp, 0); ++ spin_unlock(&tp->lock); ++ } ++ } ++ ++ /* run TX completion thread */ ++ if (sblk->idx[0].tx_consumer != tp->tx_cons) { ++ tg3_tx(tp); ++ if (unlikely(tp->tg3_flags & TG3_FLAG_TX_RECOVERY_PENDING)) { ++ netif_rx_complete(netdev); ++ schedule_work(&tp->reset_task); ++ return 0; ++ } ++ } ++ ++ /* run RX thread, within the bounds set by NAPI. ++ * All RX "locking" is done by ensuring outside ++ * code synchronizes with dev->poll() ++ */ ++ if (sblk->idx[0].rx_producer != tp->rx_rcb_ptr) { ++ int orig_budget = *budget; ++ int work_done; ++ ++ if (orig_budget > netdev->quota) ++ orig_budget = netdev->quota; ++ ++ work_done = tg3_rx(tp, orig_budget); ++ ++ *budget -= work_done; ++ netdev->quota -= work_done; ++ } ++ ++ if (tp->tg3_flags & TG3_FLAG_TAGGED_STATUS) { ++ tp->last_tag = sblk->status_tag; ++ rmb(); ++ } else ++ sblk->status &= ~SD_STATUS_UPDATED; ++ ++ /* if no more work, tell net stack and NIC we're done */ ++ done = !tg3_has_work(tp); ++ if (done) { ++ netif_rx_complete(netdev); ++ tg3_restart_ints(tp); ++ } ++ ++ return (done ? 0 : 1); ++} ++ ++#endif /* TG3_NAPI */ ++ + static void tg3_irq_quiesce(struct tg3 *tp) + { + BUG_ON(tp->irq_sync); +@@ -4310,7 +5010,11 @@ + tp->irq_sync = 1; + smp_mb(); + ++#if (LINUX_VERSION_CODE >= 0x2051c) + synchronize_irq(tp->pdev->irq); ++#else ++ synchronize_irq(); ++#endif + } + + static inline int tg3_irq_sync(struct tg3 *tp) +@@ -4338,7 +5042,11 @@ + /* One-shot MSI handler - Chip automatically disables interrupt + * after sending MSI so driver doesn't have to do it. + */ ++#ifdef BCM_HAS_NEW_IRQ_SIG + static irqreturn_t tg3_msi_1shot(int irq, void *dev_id) ++#else ++static irqreturn_t tg3_msi_1shot(int irq, void *dev_id, struct pt_regs *regs) ++#endif + { + struct net_device *dev = dev_id; + struct tg3 *tp = netdev_priv(dev); +@@ -4347,7 +5055,7 @@ + prefetch(&tp->rx_rcb[tp->rx_rcb_ptr]); + + if (likely(!tg3_irq_sync(tp))) +- netif_rx_schedule(dev, &tp->napi); ++ tg3_netif_rx_schedule(dev, &tp->napi); + + return IRQ_HANDLED; + } +@@ -4356,7 +5064,11 @@ + * flush status block and interrupt mailbox. PCI ordering rules + * guarantee that MSI will arrive after the status block. + */ ++#ifdef BCM_HAS_NEW_IRQ_SIG + static irqreturn_t tg3_msi(int irq, void *dev_id) ++#else ++static irqreturn_t tg3_msi(int irq, void *dev_id, struct pt_regs *regs) ++#endif + { + struct net_device *dev = dev_id; + struct tg3 *tp = netdev_priv(dev); +@@ -4372,12 +5084,16 @@ + */ + tw32_mailbox(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, 0x00000001); + if (likely(!tg3_irq_sync(tp))) +- netif_rx_schedule(dev, &tp->napi); ++ tg3_netif_rx_schedule(dev, &tp->napi); + + return IRQ_RETVAL(1); + } + ++#ifdef BCM_HAS_NEW_IRQ_SIG + static irqreturn_t tg3_interrupt(int irq, void *dev_id) ++#else ++static irqreturn_t tg3_interrupt(int irq, void *dev_id, struct pt_regs *regs) ++#endif + { + struct net_device *dev = dev_id; + struct tg3 *tp = netdev_priv(dev); +@@ -4414,7 +5130,7 @@ + sblk->status &= ~SD_STATUS_UPDATED; + if (likely(tg3_has_work(tp))) { + prefetch(&tp->rx_rcb[tp->rx_rcb_ptr]); +- netif_rx_schedule(dev, &tp->napi); ++ tg3_netif_rx_schedule(dev, &tp->napi); + } else { + /* No work, shared interrupt perhaps? re-enable + * interrupts, and flush that PCI write +@@ -4426,7 +5142,11 @@ + return IRQ_RETVAL(handled); + } + ++#ifdef BCM_HAS_NEW_IRQ_SIG + static irqreturn_t tg3_interrupt_tagged(int irq, void *dev_id) ++#else ++static irqreturn_t tg3_interrupt_tagged(int irq, void *dev_id, struct pt_regs *regs) ++#endif + { + struct net_device *dev = dev_id; + struct tg3 *tp = netdev_priv(dev); +@@ -4438,7 +5158,7 @@ + * Reading the PCI State register will confirm whether the + * interrupt is ours and will flush the status block. + */ +- if (unlikely(sblk->status_tag == tp->last_tag)) { ++ if (unlikely(sblk->status_tag == tp->last_irq_tag)) { + if ((tp->tg3_flags & TG3_FLAG_CHIP_RESETTING) || + (tr32(TG3PCI_PCISTATE) & PCISTATE_INT_NOT_ACTIVE)) { + handled = 0; +@@ -4458,24 +5178,32 @@ + * excessive spurious interrupts can be worse in some cases. + */ + tw32_mailbox_f(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, 0x00000001); ++ ++ /* ++ * In a shared interrupt configuration, sometimes other devices' ++ * interrupts will scream. We record the current status tag here ++ * so that the above check can report that the screaming interrupts ++ * are unhandled. Eventually they will be silenced. ++ */ ++ tp->last_irq_tag = sblk->status_tag; ++ + if (tg3_irq_sync(tp)) + goto out; +- if (netif_rx_schedule_prep(dev, &tp->napi)) { +- prefetch(&tp->rx_rcb[tp->rx_rcb_ptr]); +- /* Update last_tag to mark that this status has been +- * seen. Because interrupt may be shared, we may be +- * racing with tg3_poll(), so only update last_tag +- * if tg3_poll() is not scheduled. +- */ +- tp->last_tag = sblk->status_tag; +- __netif_rx_schedule(dev, &tp->napi); +- } ++ ++ prefetch(&tp->rx_rcb[tp->rx_rcb_ptr]); ++ ++ tg3_netif_rx_schedule(dev, &tp->napi); ++ + out: + return IRQ_RETVAL(handled); + } + + /* ISR for interrupt test */ ++#ifdef BCM_HAS_NEW_IRQ_SIG + static irqreturn_t tg3_test_isr(int irq, void *dev_id) ++#else ++static irqreturn_t tg3_test_isr(int irq, void *dev_id, struct pt_regs *regs) ++#endif + { + struct net_device *dev = dev_id; + struct tg3 *tp = netdev_priv(dev); +@@ -4509,7 +5237,11 @@ + tg3_full_unlock(tp); + del_timer_sync(&tp->timer); + tp->irq_sync = 0; ++#ifdef TG3_NAPI + napi_enable(&tp->napi); ++#else ++ netif_poll_enable(tp->dev); ++#endif + dev_close(tp->dev); + tg3_full_lock(tp, 0); + } +@@ -4521,13 +5253,36 @@ + { + struct tg3 *tp = netdev_priv(dev); + ++#if defined(BCM_HAS_NETDUMP_MODE) && (LINUX_VERSION_CODE < 0x20600) ++ if (netdump_mode) { ++ tg3_interrupt(tp->pdev->irq, dev, NULL); ++ if (dev->poll_list.prev) { ++ int budget = 64; ++ ++ tg3_poll(dev, &budget); ++ } ++ } ++ else ++#endif ++#ifdef BCM_HAS_NEW_IRQ_SIG + tg3_interrupt(tp->pdev->irq, dev); +-} +-#endif +- ++#else ++ tg3_interrupt(tp->pdev->irq, dev, NULL); ++#endif ++} ++#endif ++ ++#ifdef BCM_HAS_NEW_INIT_WORK + static void tg3_reset_task(struct work_struct *work) +-{ ++#else ++static void tg3_reset_task(void *_data) ++#endif ++{ ++#ifdef BCM_HAS_NEW_INIT_WORK + struct tg3 *tp = container_of(work, struct tg3, reset_task); ++#else ++ struct tg3 *tp = _data; ++#endif + int err; + unsigned int restart_timer; + +@@ -4609,7 +5364,7 @@ + { + #if defined(CONFIG_HIGHMEM) && (BITS_PER_LONG == 64) + if (tp->tg3_flags & TG3_FLAG_40BIT_DMA_BUG) +- return (((u64) mapping + len) > DMA_40BIT_MASK); ++ return (((u64) mapping + len) > DMA_BIT_MASK(40)); + return 0; + #else + return 0; +@@ -4643,12 +5398,16 @@ + } else { + /* New SKB is guaranteed to be linear. */ + entry = *start; +- new_addr = pci_map_single(tp->pdev, new_skb->data, new_skb->len, +- PCI_DMA_TODEVICE); ++ ret = tg3_skb_dma_map(tp, new_skb, DMA_TO_DEVICE); ++ new_addr = tg3_skb_dma_addr(tp, skb_shinfo(new_skb), entry, 0); ++ + /* Make sure new skb does not cross any 4G boundaries. + * Drop the packet if it does. + */ +- if (tg3_4g_overflow_test(new_addr, new_skb->len)) { ++ if (ret || tg3_4g_overflow_test(new_addr, new_skb->len)) { ++ if (!ret) ++ tg3_skb_dma_unmap(tp, new_skb, ++ DMA_TO_DEVICE); + ret = -1; + dev_kfree_skb(new_skb); + new_skb = NULL; +@@ -4662,18 +5421,8 @@ + /* Now clean up the sw ring entries. */ + i = 0; + while (entry != last_plus_one) { +- int len; +- +- if (i == 0) +- len = skb_headlen(skb); +- else +- len = skb_shinfo(skb)->frags[i-1].size; +- pci_unmap_single(tp->pdev, +- pci_unmap_addr(&tp->tx_buffers[entry], mapping), +- len, PCI_DMA_TODEVICE); + if (i == 0) { + tp->tx_buffers[entry].skb = new_skb; +- pci_unmap_addr_set(&tp->tx_buffers[entry], mapping, new_addr); + } else { + tp->tx_buffers[entry].skb = NULL; + } +@@ -4681,6 +5430,7 @@ + i++; + } + ++ tg3_skb_dma_unmap(tp, skb, DMA_TO_DEVICE); + dev_kfree_skb(skb); + + return ret; +@@ -4715,8 +5465,9 @@ + static int tg3_start_xmit(struct sk_buff *skb, struct net_device *dev) + { + struct tg3 *tp = netdev_priv(dev); ++ u32 len, entry, base_flags, mss; ++ struct skb_shared_info *sp; + dma_addr_t mapping; +- u32 len, entry, base_flags, mss; + + len = skb_headlen(skb); + +@@ -4738,6 +5489,7 @@ + + entry = tp->tx_prod; + base_flags = 0; ++#if TG3_TSO_SUPPORT != 0 + mss = 0; + if ((mss = skb_shinfo(skb)->gso_size) != 0) { + int tcp_opt_len, ip_tcp_len; +@@ -4748,9 +5500,12 @@ + goto out_unlock; + } + ++#ifndef BCM_NO_TSO6 + if (skb_shinfo(skb)->gso_type & SKB_GSO_TCPV6) + mss |= (skb_headlen(skb) - ETH_HLEN) << 9; +- else { ++ else ++#endif ++ { + struct iphdr *iph = ip_hdr(skb); + + tcp_opt_len = tcp_optlen(skb); +@@ -4769,17 +5524,27 @@ + } + else if (skb->ip_summed == CHECKSUM_PARTIAL) + base_flags |= TXD_FLAG_TCPUDP_CSUM; ++#else ++ mss = 0; ++ if (skb->ip_summed == CHECKSUM_PARTIAL) ++ base_flags |= TXD_FLAG_TCPUDP_CSUM; ++#endif + #if TG3_VLAN_TAG_USED + if (tp->vlgrp != NULL && vlan_tx_tag_present(skb)) + base_flags |= (TXD_FLAG_VLAN | + (vlan_tx_tag_get(skb) << 16)); + #endif + +- /* Queue skb data, a.k.a. the main skb fragment. */ +- mapping = pci_map_single(tp->pdev, skb->data, len, PCI_DMA_TODEVICE); ++ if (tg3_skb_dma_map(tp, skb, DMA_TO_DEVICE)) { ++ dev_kfree_skb(skb); ++ goto out_unlock; ++ } ++ ++ sp = skb_shinfo(skb); ++ ++ mapping = tg3_skb_dma_addr(tp, sp, entry, 0); + + tp->tx_buffers[entry].skb = skb; +- pci_unmap_addr_set(&tp->tx_buffers[entry], mapping, mapping); + + tg3_set_txd(tp, entry, mapping, len, base_flags, + (skb_shinfo(skb)->nr_frags == 0) | (mss << 1)); +@@ -4795,13 +5560,9 @@ + skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; + + len = frag->size; +- mapping = pci_map_page(tp->pdev, +- frag->page, +- frag->page_offset, +- len, PCI_DMA_TODEVICE); ++ mapping = tg3_skb_dma_addr(tp, sp, entry, i + 1); + + tp->tx_buffers[entry].skb = NULL; +- pci_unmap_addr_set(&tp->tx_buffers[entry], mapping, mapping); + + tg3_set_txd(tp, entry, mapping, len, + base_flags, (i == last) | (mss << 1)); +@@ -4809,6 +5570,9 @@ + entry = NEXT_TX(entry); + } + } ++ ++ /* Some platforms need to sync memory here */ ++ wmb(); + + /* Packets are ready, update Tx producer idx local and on card. */ + tw32_tx_mbox((MAILBOX_SNDHOST_PROD_IDX_0 + TG3_64BIT_REG_LOW), entry); +@@ -4828,6 +5592,7 @@ + return NETDEV_TX_OK; + } + ++#if TG3_TSO_SUPPORT != 0 + static int tg3_start_xmit_dma_bug(struct sk_buff *, struct net_device *); + + /* Use GSO to workaround a rare TSO bug that may be triggered when the +@@ -4862,6 +5627,7 @@ + + return NETDEV_TX_OK; + } ++#endif /* TG3_TSO_SUPPORT */ + + /* hard_start_xmit for devices that have the 4G bug and/or 40-bit bug and + * support TG3_FLG2_HW_TSO_1 or firmware TSO only. +@@ -4869,9 +5635,10 @@ + static int tg3_start_xmit_dma_bug(struct sk_buff *skb, struct net_device *dev) + { + struct tg3 *tp = netdev_priv(dev); ++ u32 len, entry, base_flags, mss; ++ struct skb_shared_info *sp; ++ int would_hit_hwbug; + dma_addr_t mapping; +- u32 len, entry, base_flags, mss; +- int would_hit_hwbug; + + len = skb_headlen(skb); + +@@ -4895,8 +5662,9 @@ + base_flags = 0; + if (skb->ip_summed == CHECKSUM_PARTIAL) + base_flags |= TXD_FLAG_TCPUDP_CSUM; +- mss = 0; +- if ((mss = skb_shinfo(skb)->gso_size) != 0) { ++#if TG3_TSO_SUPPORT != 0 ++ mss = skb_shinfo(skb)->gso_size; ++ if (mss) { + struct iphdr *iph; + int tcp_opt_len, ip_tcp_len, hdr_len; + +@@ -4910,6 +5678,11 @@ + ip_tcp_len = ip_hdrlen(skb) + sizeof(struct tcphdr); + + hdr_len = ip_tcp_len + tcp_opt_len; ++ if (hdr_len + mss >= skb->len - ETH_HLEN) { ++ mss = 0; ++ goto abort_lso; ++ } ++ + if (unlikely((ETH_HLEN + hdr_len) > 80) && + (tp->tg3_flags2 & TG3_FLG2_TSO_BUG)) + return (tg3_tso_bug(tp, skb)); +@@ -4946,17 +5719,26 @@ + } + } + } ++abort_lso: ++#else ++ mss = 0; ++#endif + #if TG3_VLAN_TAG_USED + if (tp->vlgrp != NULL && vlan_tx_tag_present(skb)) + base_flags |= (TXD_FLAG_VLAN | + (vlan_tx_tag_get(skb) << 16)); + #endif + +- /* Queue skb data, a.k.a. the main skb fragment. */ +- mapping = pci_map_single(tp->pdev, skb->data, len, PCI_DMA_TODEVICE); ++ if (tg3_skb_dma_map(tp, skb, DMA_TO_DEVICE)) { ++ dev_kfree_skb(skb); ++ goto out_unlock; ++ } ++ ++ sp = skb_shinfo(skb); ++ ++ mapping = tg3_skb_dma_addr(tp, sp, entry, 0); + + tp->tx_buffers[entry].skb = skb; +- pci_unmap_addr_set(&tp->tx_buffers[entry], mapping, mapping); + + would_hit_hwbug = 0; + +@@ -4979,13 +5761,9 @@ + skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; + + len = frag->size; +- mapping = pci_map_page(tp->pdev, +- frag->page, +- frag->page_offset, +- len, PCI_DMA_TODEVICE); ++ mapping = tg3_skb_dma_addr(tp, sp, entry, i + 1); + + tp->tx_buffers[entry].skb = NULL; +- pci_unmap_addr_set(&tp->tx_buffers[entry], mapping, mapping); + + if (tg3_4g_overflow_test(mapping, len)) + would_hit_hwbug = 1; +@@ -5021,6 +5799,9 @@ + entry = start; + } + ++ /* Some platforms need to sync memory here */ ++ wmb(); ++ + /* Packets are ready, update Tx producer idx local and on card. */ + tw32_tx_mbox((MAILBOX_SNDHOST_PROD_IDX_0 + TG3_64BIT_REG_LOW), entry); + +@@ -5047,7 +5828,9 @@ + if (new_mtu > ETH_DATA_LEN) { + if (tp->tg3_flags2 & TG3_FLG2_5780_CLASS) { + tp->tg3_flags2 &= ~TG3_FLG2_TSO_CAPABLE; ++#if TG3_TSO_SUPPORT != 0 + ethtool_op_set_tso(dev, 0); ++#endif + } + else + tp->tg3_flags |= TG3_FLAG_JUMBO_RING_ENABLE; +@@ -5116,7 +5899,7 @@ + continue; + pci_unmap_single(tp->pdev, + pci_unmap_addr(rxp, mapping), +- tp->rx_pkt_buf_sz - tp->rx_offset, ++ tp->rx_pkt_buf_sz, + PCI_DMA_FROMDEVICE); + dev_kfree_skb_any(rxp->skb); + rxp->skb = NULL; +@@ -5129,7 +5912,7 @@ + continue; + pci_unmap_single(tp->pdev, + pci_unmap_addr(rxp, mapping), +- RX_JUMBO_PKT_BUF_SZ - tp->rx_offset, ++ RX_JUMBO_PKT_BUF_SZ, + PCI_DMA_FROMDEVICE); + dev_kfree_skb_any(rxp->skb); + rxp->skb = NULL; +@@ -5138,7 +5921,6 @@ + for (i = 0; i < TG3_TX_RING_SIZE; ) { + struct tx_ring_info *txp; + struct sk_buff *skb; +- int j; + + txp = &tp->tx_buffers[i]; + skb = txp->skb; +@@ -5148,22 +5930,11 @@ + continue; + } + +- pci_unmap_single(tp->pdev, +- pci_unmap_addr(txp, mapping), +- skb_headlen(skb), +- PCI_DMA_TODEVICE); ++ tg3_skb_dma_unmap(tp, skb, DMA_TO_DEVICE); ++ + txp->skb = NULL; + +- i++; +- +- for (j = 0; j < skb_shinfo(skb)->nr_frags; j++) { +- txp = &tp->tx_buffers[i & (TG3_TX_RING_SIZE - 1)]; +- pci_unmap_page(tp->pdev, +- pci_unmap_addr(txp, mapping), +- skb_shinfo(skb)->frags[j].size, +- PCI_DMA_TODEVICE); +- i++; +- } ++ i += skb_shinfo(skb)->nr_frags + 1; + + dev_kfree_skb_any(skb); + } +@@ -5202,7 +5973,7 @@ + struct tg3_rx_buffer_desc *rxd; + + rxd = &tp->rx_std[i]; +- rxd->idx_len = (tp->rx_pkt_buf_sz - tp->rx_offset - 64) ++ rxd->idx_len = (tp->rx_pkt_buf_sz - 64) + << RXD_LEN_SHIFT; + rxd->type_flags = (RXD_FLAG_END << RXD_FLAGS_SHIFT); + rxd->opaque = (RXD_OPAQUE_RING_STD | +@@ -5214,7 +5985,7 @@ + struct tg3_rx_buffer_desc *rxd; + + rxd = &tp->rx_jumbo[i]; +- rxd->idx_len = (RX_JUMBO_PKT_BUF_SZ - tp->rx_offset - 64) ++ rxd->idx_len = (RX_JUMBO_PKT_BUF_SZ - 64) + << RXD_LEN_SHIFT; + rxd->type_flags = (RXD_FLAG_END << RXD_FLAGS_SHIFT) | + RXD_FLAG_JUMBO; +@@ -5472,62 +6243,6 @@ + return err; + } + +-/* tp->lock is held. */ +-static int tg3_nvram_lock(struct tg3 *tp) +-{ +- if (tp->tg3_flags & TG3_FLAG_NVRAM) { +- int i; +- +- if (tp->nvram_lock_cnt == 0) { +- tw32(NVRAM_SWARB, SWARB_REQ_SET1); +- for (i = 0; i < 8000; i++) { +- if (tr32(NVRAM_SWARB) & SWARB_GNT1) +- break; +- udelay(20); +- } +- if (i == 8000) { +- tw32(NVRAM_SWARB, SWARB_REQ_CLR1); +- return -ENODEV; +- } +- } +- tp->nvram_lock_cnt++; +- } +- return 0; +-} +- +-/* tp->lock is held. */ +-static void tg3_nvram_unlock(struct tg3 *tp) +-{ +- if (tp->tg3_flags & TG3_FLAG_NVRAM) { +- if (tp->nvram_lock_cnt > 0) +- tp->nvram_lock_cnt--; +- if (tp->nvram_lock_cnt == 0) +- tw32_f(NVRAM_SWARB, SWARB_REQ_CLR1); +- } +-} +- +-/* tp->lock is held. */ +-static void tg3_enable_nvram_access(struct tg3 *tp) +-{ +- if ((tp->tg3_flags2 & TG3_FLG2_5750_PLUS) && +- !(tp->tg3_flags2 & TG3_FLG2_PROTECTED_NVRAM)) { +- u32 nvaccess = tr32(NVRAM_ACCESS); +- +- tw32(NVRAM_ACCESS, nvaccess | ACCESS_ENABLE); +- } +-} +- +-/* tp->lock is held. */ +-static void tg3_disable_nvram_access(struct tg3 *tp) +-{ +- if ((tp->tg3_flags2 & TG3_FLG2_5750_PLUS) && +- !(tp->tg3_flags2 & TG3_FLG2_PROTECTED_NVRAM)) { +- u32 nvaccess = tr32(NVRAM_ACCESS); +- +- tw32(NVRAM_ACCESS, nvaccess & ~ACCESS_ENABLE); +- } +-} +- + static void tg3_ape_send_event(struct tg3 *tp, u32 event) + { + int i; +@@ -5588,6 +6303,13 @@ + event = APE_EVENT_STATUS_STATE_START; + break; + case RESET_KIND_SHUTDOWN: ++ /* With the interface we are currently using, ++ * APE does not track driver state. Wiping ++ * out the HOST SEGMENT SIGNATURE forces ++ * the APE to assume OS absent status. ++ */ ++ tg3_ape_write32(tp, TG3_APE_HOST_SEG_SIG, 0x0); ++ + event = APE_EVENT_STATUS_STATE_UNLOAD; + break; + case RESET_KIND_SUSPEND: +@@ -5752,17 +6474,19 @@ + + pci_write_config_word(tp->pdev, PCI_COMMAND, tp->pci_cmd); + +- if (tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS) +- pcie_set_readrq(tp->pdev, 4096); +- else { +- pci_write_config_byte(tp->pdev, PCI_CACHE_LINE_SIZE, +- tp->pci_cacheline_sz); +- pci_write_config_byte(tp->pdev, PCI_LATENCY_TIMER, +- tp->pci_lat_timer); ++ if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5785) { ++ if (tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS) ++ pcie_set_readrq(tp->pdev, 4096); ++ else { ++ pci_write_config_byte(tp->pdev, PCI_CACHE_LINE_SIZE, ++ tp->pci_cacheline_sz); ++ pci_write_config_byte(tp->pdev, PCI_LATENCY_TIMER, ++ tp->pci_lat_timer); ++ } + } + + /* Make sure PCI-X relaxed ordering bit is clear. */ +- if (tp->pcix_cap) { ++ if (tp->tg3_flags & TG3_FLAG_PCIX_MODE) { + u16 pcix_cmd; + + pci_read_config_word(tp->pdev, tp->pcix_cap + PCI_X_CMD, +@@ -5819,12 +6543,7 @@ + tg3_save_pci_state(tp); + + if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5752 || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787 || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57780 || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5761 || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5785) ++ (tp->tg3_flags3 & TG3_FLG3_5755_PLUS)) + tw32(GRC_FASTBOOT_PC, 0); + + /* +@@ -5849,8 +6568,13 @@ + tp->hw_status->status_tag = 0; + } + tp->last_tag = 0; ++ tp->last_irq_tag = 0; + smp_mb(); ++#if (LINUX_VERSION_CODE >= 0x2051c) + synchronize_irq(tp->pdev->irq); ++#else ++ synchronize_irq(); ++#endif + + /* do the reset */ + val = GRC_MISC_CFG_CORECLK_RESET; +@@ -5903,7 +6627,7 @@ + + udelay(120); + +- if (tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS) { ++ if ((tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS) && tp->pcie_cap) { + if (tp->pci_chip_rev_id == CHIPREV_ID_5750_A0) { + int i; + u32 cfg_val; +@@ -5916,8 +6640,23 @@ + pci_write_config_dword(tp->pdev, 0xc4, + cfg_val | (1 << 15)); + } +- /* Set PCIE max payload size and clear error status. */ +- pci_write_config_dword(tp->pdev, 0xd8, 0xf5000); ++ ++ /* Set PCIE max payload size to 128 bytes and ++ * clear the "no snoop" and "relaxed ordering" bits. ++ */ ++ pci_write_config_word(tp->pdev, ++ tp->pcie_cap + PCI_EXP_DEVCTL, ++ 0); ++ ++ pcie_set_readrq(tp->pdev, 4096); ++ ++ /* Clear error status */ ++ pci_write_config_word(tp->pdev, ++ tp->pcie_cap + PCI_EXP_DEVSTA, ++ PCI_EXP_DEVSTA_CED | ++ PCI_EXP_DEVSTA_NFED | ++ PCI_EXP_DEVSTA_FED | ++ PCI_EXP_DEVSTA_URD); + } + + tg3_restore_pci_state(tp); +@@ -6028,6 +6767,8 @@ + tg3_abort_hw(tp, silent); + err = tg3_chip_reset(tp); + ++ __tg3_set_mac_addr(tp, 0); ++ + tg3_write_sig_legacy(tp, kind); + tg3_write_sig_post_reset(tp, kind); + +@@ -6036,130 +6777,6 @@ + + return 0; + } +- +-#define TG3_FW_RELEASE_MAJOR 0x0 +-#define TG3_FW_RELASE_MINOR 0x0 +-#define TG3_FW_RELEASE_FIX 0x0 +-#define TG3_FW_START_ADDR 0x08000000 +-#define TG3_FW_TEXT_ADDR 0x08000000 +-#define TG3_FW_TEXT_LEN 0x9c0 +-#define TG3_FW_RODATA_ADDR 0x080009c0 +-#define TG3_FW_RODATA_LEN 0x60 +-#define TG3_FW_DATA_ADDR 0x08000a40 +-#define TG3_FW_DATA_LEN 0x20 +-#define TG3_FW_SBSS_ADDR 0x08000a60 +-#define TG3_FW_SBSS_LEN 0xc +-#define TG3_FW_BSS_ADDR 0x08000a70 +-#define TG3_FW_BSS_LEN 0x10 +- +-static const u32 tg3FwText[(TG3_FW_TEXT_LEN / sizeof(u32)) + 1] = { +- 0x00000000, 0x10000003, 0x00000000, 0x0000000d, 0x0000000d, 0x3c1d0800, +- 0x37bd3ffc, 0x03a0f021, 0x3c100800, 0x26100000, 0x0e000018, 0x00000000, +- 0x0000000d, 0x3c1d0800, 0x37bd3ffc, 0x03a0f021, 0x3c100800, 0x26100034, +- 0x0e00021c, 0x00000000, 0x0000000d, 0x00000000, 0x00000000, 0x00000000, +- 0x27bdffe0, 0x3c1cc000, 0xafbf0018, 0xaf80680c, 0x0e00004c, 0x241b2105, +- 0x97850000, 0x97870002, 0x9782002c, 0x9783002e, 0x3c040800, 0x248409c0, +- 0xafa00014, 0x00021400, 0x00621825, 0x00052c00, 0xafa30010, 0x8f860010, +- 0x00e52825, 0x0e000060, 0x24070102, 0x3c02ac00, 0x34420100, 0x3c03ac01, +- 0x34630100, 0xaf820490, 0x3c02ffff, 0xaf820494, 0xaf830498, 0xaf82049c, +- 0x24020001, 0xaf825ce0, 0x0e00003f, 0xaf825d00, 0x0e000140, 0x00000000, +- 0x8fbf0018, 0x03e00008, 0x27bd0020, 0x2402ffff, 0xaf825404, 0x8f835400, +- 0x34630400, 0xaf835400, 0xaf825404, 0x3c020800, 0x24420034, 0xaf82541c, +- 0x03e00008, 0xaf805400, 0x00000000, 0x00000000, 0x3c020800, 0x34423000, +- 0x3c030800, 0x34633000, 0x3c040800, 0x348437ff, 0x3c010800, 0xac220a64, +- 0x24020040, 0x3c010800, 0xac220a68, 0x3c010800, 0xac200a60, 0xac600000, +- 0x24630004, 0x0083102b, 0x5040fffd, 0xac600000, 0x03e00008, 0x00000000, +- 0x00804821, 0x8faa0010, 0x3c020800, 0x8c420a60, 0x3c040800, 0x8c840a68, +- 0x8fab0014, 0x24430001, 0x0044102b, 0x3c010800, 0xac230a60, 0x14400003, +- 0x00004021, 0x3c010800, 0xac200a60, 0x3c020800, 0x8c420a60, 0x3c030800, +- 0x8c630a64, 0x91240000, 0x00021140, 0x00431021, 0x00481021, 0x25080001, +- 0xa0440000, 0x29020008, 0x1440fff4, 0x25290001, 0x3c020800, 0x8c420a60, +- 0x3c030800, 0x8c630a64, 0x8f84680c, 0x00021140, 0x00431021, 0xac440008, +- 0xac45000c, 0xac460010, 0xac470014, 0xac4a0018, 0x03e00008, 0xac4b001c, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, +- 0x02000008, 0x00000000, 0x0a0001e3, 0x3c0a0001, 0x0a0001e3, 0x3c0a0002, +- 0x0a0001e3, 0x00000000, 0x0a0001e3, 0x00000000, 0x0a0001e3, 0x00000000, +- 0x0a0001e3, 0x00000000, 0x0a0001e3, 0x00000000, 0x0a0001e3, 0x00000000, +- 0x0a0001e3, 0x00000000, 0x0a0001e3, 0x00000000, 0x0a0001e3, 0x00000000, +- 0x0a0001e3, 0x3c0a0007, 0x0a0001e3, 0x3c0a0008, 0x0a0001e3, 0x3c0a0009, +- 0x0a0001e3, 0x00000000, 0x0a0001e3, 0x00000000, 0x0a0001e3, 0x3c0a000b, +- 0x0a0001e3, 0x3c0a000c, 0x0a0001e3, 0x3c0a000d, 0x0a0001e3, 0x00000000, +- 0x0a0001e3, 0x00000000, 0x0a0001e3, 0x3c0a000e, 0x0a0001e3, 0x00000000, +- 0x0a0001e3, 0x00000000, 0x0a0001e3, 0x00000000, 0x0a0001e3, 0x00000000, +- 0x0a0001e3, 0x00000000, 0x0a0001e3, 0x00000000, 0x0a0001e3, 0x00000000, +- 0x0a0001e3, 0x00000000, 0x0a0001e3, 0x3c0a0013, 0x0a0001e3, 0x3c0a0014, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0x27bdffe0, 0x00001821, 0x00001021, 0xafbf0018, 0xafb10014, 0xafb00010, +- 0x3c010800, 0x00220821, 0xac200a70, 0x3c010800, 0x00220821, 0xac200a74, +- 0x3c010800, 0x00220821, 0xac200a78, 0x24630001, 0x1860fff5, 0x2442000c, +- 0x24110001, 0x8f906810, 0x32020004, 0x14400005, 0x24040001, 0x3c020800, +- 0x8c420a78, 0x18400003, 0x00002021, 0x0e000182, 0x00000000, 0x32020001, +- 0x10400003, 0x00000000, 0x0e000169, 0x00000000, 0x0a000153, 0xaf915028, +- 0x8fbf0018, 0x8fb10014, 0x8fb00010, 0x03e00008, 0x27bd0020, 0x3c050800, +- 0x8ca50a70, 0x3c060800, 0x8cc60a80, 0x3c070800, 0x8ce70a78, 0x27bdffe0, +- 0x3c040800, 0x248409d0, 0xafbf0018, 0xafa00010, 0x0e000060, 0xafa00014, +- 0x0e00017b, 0x00002021, 0x8fbf0018, 0x03e00008, 0x27bd0020, 0x24020001, +- 0x8f836810, 0x00821004, 0x00021027, 0x00621824, 0x03e00008, 0xaf836810, +- 0x27bdffd8, 0xafbf0024, 0x1080002e, 0xafb00020, 0x8f825cec, 0xafa20018, +- 0x8f825cec, 0x3c100800, 0x26100a78, 0xafa2001c, 0x34028000, 0xaf825cec, +- 0x8e020000, 0x18400016, 0x00000000, 0x3c020800, 0x94420a74, 0x8fa3001c, +- 0x000221c0, 0xac830004, 0x8fa2001c, 0x3c010800, 0x0e000201, 0xac220a74, +- 0x10400005, 0x00000000, 0x8e020000, 0x24420001, 0x0a0001df, 0xae020000, +- 0x3c020800, 0x8c420a70, 0x00021c02, 0x000321c0, 0x0a0001c5, 0xafa2001c, +- 0x0e000201, 0x00000000, 0x1040001f, 0x00000000, 0x8e020000, 0x8fa3001c, +- 0x24420001, 0x3c010800, 0xac230a70, 0x3c010800, 0xac230a74, 0x0a0001df, +- 0xae020000, 0x3c100800, 0x26100a78, 0x8e020000, 0x18400028, 0x00000000, +- 0x0e000201, 0x00000000, 0x14400024, 0x00000000, 0x8e020000, 0x3c030800, +- 0x8c630a70, 0x2442ffff, 0xafa3001c, 0x18400006, 0xae020000, 0x00031402, +- 0x000221c0, 0x8c820004, 0x3c010800, 0xac220a70, 0x97a2001e, 0x2442ff00, +- 0x2c420300, 0x1440000b, 0x24024000, 0x3c040800, 0x248409dc, 0xafa00010, +- 0xafa00014, 0x8fa6001c, 0x24050008, 0x0e000060, 0x00003821, 0x0a0001df, +- 0x00000000, 0xaf825cf8, 0x3c020800, 0x8c420a40, 0x8fa3001c, 0x24420001, +- 0xaf835cf8, 0x3c010800, 0xac220a40, 0x8fbf0024, 0x8fb00020, 0x03e00008, +- 0x27bd0028, 0x27bdffe0, 0x3c040800, 0x248409e8, 0x00002821, 0x00003021, +- 0x00003821, 0xafbf0018, 0xafa00010, 0x0e000060, 0xafa00014, 0x8fbf0018, +- 0x03e00008, 0x27bd0020, 0x8f82680c, 0x8f85680c, 0x00021827, 0x0003182b, +- 0x00031823, 0x00431024, 0x00441021, 0x00a2282b, 0x10a00006, 0x00000000, +- 0x00401821, 0x8f82680c, 0x0043102b, 0x1440fffd, 0x00000000, 0x03e00008, +- 0x00000000, 0x3c040800, 0x8c840000, 0x3c030800, 0x8c630a40, 0x0064102b, +- 0x54400002, 0x00831023, 0x00641023, 0x2c420008, 0x03e00008, 0x38420001, +- 0x27bdffe0, 0x00802821, 0x3c040800, 0x24840a00, 0x00003021, 0x00003821, +- 0xafbf0018, 0xafa00010, 0x0e000060, 0xafa00014, 0x0a000216, 0x00000000, +- 0x8fbf0018, 0x03e00008, 0x27bd0020, 0x00000000, 0x27bdffe0, 0x3c1cc000, +- 0xafbf0018, 0x0e00004c, 0xaf80680c, 0x3c040800, 0x24840a10, 0x03802821, +- 0x00003021, 0x00003821, 0xafa00010, 0x0e000060, 0xafa00014, 0x2402ffff, +- 0xaf825404, 0x3c0200aa, 0x0e000234, 0xaf825434, 0x8fbf0018, 0x03e00008, +- 0x27bd0020, 0x00000000, 0x00000000, 0x00000000, 0x27bdffe8, 0xafb00010, +- 0x24100001, 0xafbf0014, 0x3c01c003, 0xac200000, 0x8f826810, 0x30422000, +- 0x10400003, 0x00000000, 0x0e000246, 0x00000000, 0x0a00023a, 0xaf905428, +- 0x8fbf0014, 0x8fb00010, 0x03e00008, 0x27bd0018, 0x27bdfff8, 0x8f845d0c, +- 0x3c0200ff, 0x3c030800, 0x8c630a50, 0x3442fff8, 0x00821024, 0x1043001e, +- 0x3c0500ff, 0x34a5fff8, 0x3c06c003, 0x3c074000, 0x00851824, 0x8c620010, +- 0x3c010800, 0xac230a50, 0x30420008, 0x10400005, 0x00871025, 0x8cc20000, +- 0x24420001, 0xacc20000, 0x00871025, 0xaf825d0c, 0x8fa20000, 0x24420001, +- 0xafa20000, 0x8fa20000, 0x8fa20000, 0x24420001, 0xafa20000, 0x8fa20000, +- 0x8f845d0c, 0x3c030800, 0x8c630a50, 0x00851024, 0x1443ffe8, 0x00851824, +- 0x27bd0008, 0x03e00008, 0x00000000, 0x00000000, 0x00000000 +-}; +- +-static const u32 tg3FwRodata[(TG3_FW_RODATA_LEN / sizeof(u32)) + 1] = { +- 0x35373031, 0x726c7341, 0x00000000, 0x00000000, 0x53774576, 0x656e7430, +- 0x00000000, 0x726c7045, 0x76656e74, 0x31000000, 0x556e6b6e, 0x45766e74, +- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x66617461, 0x6c457272, +- 0x00000000, 0x00000000, 0x4d61696e, 0x43707542, 0x00000000, 0x00000000, +- 0x00000000 +-}; +- +-#if 0 /* All zeros, don't eat up space with it. */ +-u32 tg3FwData[(TG3_FW_DATA_LEN / sizeof(u32)) + 1] = { +- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +- 0x00000000, 0x00000000, 0x00000000, 0x00000000 +-}; +-#endif + + #define RX_CPU_SCRATCH_BASE 0x30000 + #define RX_CPU_SCRATCH_SIZE 0x04000 +@@ -6215,15 +6832,9 @@ + } + + struct fw_info { +- unsigned int text_base; +- unsigned int text_len; +- const u32 *text_data; +- unsigned int rodata_base; +- unsigned int rodata_len; +- const u32 *rodata_data; +- unsigned int data_base; +- unsigned int data_len; +- const u32 *data_data; ++ unsigned int fw_base; ++ unsigned int fw_len; ++ const u32 *fw_data; + }; + + /* tp->lock is held. */ +@@ -6260,24 +6871,11 @@ + write_op(tp, cpu_scratch_base + i, 0); + tw32(cpu_base + CPU_STATE, 0xffffffff); + tw32(cpu_base + CPU_MODE, tr32(cpu_base+CPU_MODE)|CPU_MODE_HALT); +- for (i = 0; i < (info->text_len / sizeof(u32)); i++) ++ for (i = 0; i < (info->fw_len / sizeof(u32)); i++) + write_op(tp, (cpu_scratch_base + +- (info->text_base & 0xffff) + ++ (info->fw_base & 0xffff) + + (i * sizeof(u32))), +- (info->text_data ? +- info->text_data[i] : 0)); +- for (i = 0; i < (info->rodata_len / sizeof(u32)); i++) +- write_op(tp, (cpu_scratch_base + +- (info->rodata_base & 0xffff) + +- (i * sizeof(u32))), +- (info->rodata_data ? +- info->rodata_data[i] : 0)); +- for (i = 0; i < (info->data_len / sizeof(u32)); i++) +- write_op(tp, (cpu_scratch_base + +- (info->data_base & 0xffff) + +- (i * sizeof(u32))), +- (info->data_data ? +- info->data_data[i] : 0)); ++ info->fw_data[i]); + + err = 0; + +@@ -6289,17 +6887,20 @@ + static int tg3_load_5701_a0_firmware_fix(struct tg3 *tp) + { + struct fw_info info; ++ const u32 *fw_data; + int err, i; + +- info.text_base = TG3_FW_TEXT_ADDR; +- info.text_len = TG3_FW_TEXT_LEN; +- info.text_data = &tg3FwText[0]; +- info.rodata_base = TG3_FW_RODATA_ADDR; +- info.rodata_len = TG3_FW_RODATA_LEN; +- info.rodata_data = &tg3FwRodata[0]; +- info.data_base = TG3_FW_DATA_ADDR; +- info.data_len = TG3_FW_DATA_LEN; +- info.data_data = NULL; ++ fw_data = (void *)tp->fw->data; ++ ++ /* Firmware blob starts with version numbers, followed by ++ start address and length. We are setting complete length. ++ length = end_address_of_bss - start_address_of_text. ++ Remainder is the blob to be loaded contiguously ++ from start address. */ ++ ++ info.fw_base = fw_data[1]; ++ info.fw_len = tp->fw->size - 12; ++ info.fw_data = &fw_data[3]; + + err = tg3_load_firmware_cpu(tp, RX_CPU_BASE, + RX_CPU_SCRATCH_BASE, RX_CPU_SCRATCH_SIZE, +@@ -6315,21 +6916,21 @@ + + /* Now startup only the RX cpu. */ + tw32(RX_CPU_BASE + CPU_STATE, 0xffffffff); +- tw32_f(RX_CPU_BASE + CPU_PC, TG3_FW_TEXT_ADDR); ++ tw32_f(RX_CPU_BASE + CPU_PC, info.fw_base); + + for (i = 0; i < 5; i++) { +- if (tr32(RX_CPU_BASE + CPU_PC) == TG3_FW_TEXT_ADDR) ++ if (tr32(RX_CPU_BASE + CPU_PC) == info.fw_base) + break; + tw32(RX_CPU_BASE + CPU_STATE, 0xffffffff); + tw32(RX_CPU_BASE + CPU_MODE, CPU_MODE_HALT); +- tw32_f(RX_CPU_BASE + CPU_PC, TG3_FW_TEXT_ADDR); ++ tw32_f(RX_CPU_BASE + CPU_PC, info.fw_base); + udelay(1000); + } + if (i >= 5) { + printk(KERN_ERR PFX "tg3_load_firmware fails for %s " + "to set RX CPU PC, is %08x should be %08x\n", + tp->dev->name, tr32(RX_CPU_BASE + CPU_PC), +- TG3_FW_TEXT_ADDR); ++ info.fw_base); + return -ENODEV; + } + tw32(RX_CPU_BASE + CPU_STATE, 0xffffffff); +@@ -6338,547 +6939,38 @@ + return 0; + } + +- +-#define TG3_TSO_FW_RELEASE_MAJOR 0x1 +-#define TG3_TSO_FW_RELASE_MINOR 0x6 +-#define TG3_TSO_FW_RELEASE_FIX 0x0 +-#define TG3_TSO_FW_START_ADDR 0x08000000 +-#define TG3_TSO_FW_TEXT_ADDR 0x08000000 +-#define TG3_TSO_FW_TEXT_LEN 0x1aa0 +-#define TG3_TSO_FW_RODATA_ADDR 0x08001aa0 +-#define TG3_TSO_FW_RODATA_LEN 0x60 +-#define TG3_TSO_FW_DATA_ADDR 0x08001b20 +-#define TG3_TSO_FW_DATA_LEN 0x30 +-#define TG3_TSO_FW_SBSS_ADDR 0x08001b50 +-#define TG3_TSO_FW_SBSS_LEN 0x2c +-#define TG3_TSO_FW_BSS_ADDR 0x08001b80 +-#define TG3_TSO_FW_BSS_LEN 0x894 +- +-static const u32 tg3TsoFwText[(TG3_TSO_FW_TEXT_LEN / 4) + 1] = { +- 0x0e000003, 0x00000000, 0x08001b24, 0x00000000, 0x10000003, 0x00000000, +- 0x0000000d, 0x0000000d, 0x3c1d0800, 0x37bd4000, 0x03a0f021, 0x3c100800, +- 0x26100000, 0x0e000010, 0x00000000, 0x0000000d, 0x27bdffe0, 0x3c04fefe, +- 0xafbf0018, 0x0e0005d8, 0x34840002, 0x0e000668, 0x00000000, 0x3c030800, +- 0x90631b68, 0x24020002, 0x3c040800, 0x24841aac, 0x14620003, 0x24050001, +- 0x3c040800, 0x24841aa0, 0x24060006, 0x00003821, 0xafa00010, 0x0e00067c, +- 0xafa00014, 0x8f625c50, 0x34420001, 0xaf625c50, 0x8f625c90, 0x34420001, +- 0xaf625c90, 0x2402ffff, 0x0e000034, 0xaf625404, 0x8fbf0018, 0x03e00008, +- 0x27bd0020, 0x00000000, 0x00000000, 0x00000000, 0x27bdffe0, 0xafbf001c, +- 0xafb20018, 0xafb10014, 0x0e00005b, 0xafb00010, 0x24120002, 0x24110001, +- 0x8f706820, 0x32020100, 0x10400003, 0x00000000, 0x0e0000bb, 0x00000000, +- 0x8f706820, 0x32022000, 0x10400004, 0x32020001, 0x0e0001f0, 0x24040001, +- 0x32020001, 0x10400003, 0x00000000, 0x0e0000a3, 0x00000000, 0x3c020800, +- 0x90421b98, 0x14520003, 0x00000000, 0x0e0004c0, 0x00000000, 0x0a00003c, +- 0xaf715028, 0x8fbf001c, 0x8fb20018, 0x8fb10014, 0x8fb00010, 0x03e00008, +- 0x27bd0020, 0x27bdffe0, 0x3c040800, 0x24841ac0, 0x00002821, 0x00003021, +- 0x00003821, 0xafbf0018, 0xafa00010, 0x0e00067c, 0xafa00014, 0x3c040800, +- 0x248423d8, 0xa4800000, 0x3c010800, 0xa0201b98, 0x3c010800, 0xac201b9c, +- 0x3c010800, 0xac201ba0, 0x3c010800, 0xac201ba4, 0x3c010800, 0xac201bac, +- 0x3c010800, 0xac201bb8, 0x3c010800, 0xac201bbc, 0x8f624434, 0x3c010800, +- 0xac221b88, 0x8f624438, 0x3c010800, 0xac221b8c, 0x8f624410, 0xac80f7a8, +- 0x3c010800, 0xac201b84, 0x3c010800, 0xac2023e0, 0x3c010800, 0xac2023c8, +- 0x3c010800, 0xac2023cc, 0x3c010800, 0xac202400, 0x3c010800, 0xac221b90, +- 0x8f620068, 0x24030007, 0x00021702, 0x10430005, 0x00000000, 0x8f620068, +- 0x00021702, 0x14400004, 0x24020001, 0x3c010800, 0x0a000097, 0xac20240c, +- 0xac820034, 0x3c040800, 0x24841acc, 0x3c050800, 0x8ca5240c, 0x00003021, +- 0x00003821, 0xafa00010, 0x0e00067c, 0xafa00014, 0x8fbf0018, 0x03e00008, +- 0x27bd0020, 0x27bdffe0, 0x3c040800, 0x24841ad8, 0x00002821, 0x00003021, +- 0x00003821, 0xafbf0018, 0xafa00010, 0x0e00067c, 0xafa00014, 0x0e00005b, +- 0x00000000, 0x0e0000b4, 0x00002021, 0x8fbf0018, 0x03e00008, 0x27bd0020, +- 0x24020001, 0x8f636820, 0x00821004, 0x00021027, 0x00621824, 0x03e00008, +- 0xaf636820, 0x27bdffd0, 0xafbf002c, 0xafb60028, 0xafb50024, 0xafb40020, +- 0xafb3001c, 0xafb20018, 0xafb10014, 0xafb00010, 0x8f675c5c, 0x3c030800, +- 0x24631bbc, 0x8c620000, 0x14470005, 0x3c0200ff, 0x3c020800, 0x90421b98, +- 0x14400119, 0x3c0200ff, 0x3442fff8, 0x00e28824, 0xac670000, 0x00111902, +- 0x306300ff, 0x30e20003, 0x000211c0, 0x00622825, 0x00a04021, 0x00071602, +- 0x3c030800, 0x90631b98, 0x3044000f, 0x14600036, 0x00804821, 0x24020001, +- 0x3c010800, 0xa0221b98, 0x00051100, 0x00821025, 0x3c010800, 0xac201b9c, +- 0x3c010800, 0xac201ba0, 0x3c010800, 0xac201ba4, 0x3c010800, 0xac201bac, +- 0x3c010800, 0xac201bb8, 0x3c010800, 0xac201bb0, 0x3c010800, 0xac201bb4, +- 0x3c010800, 0xa42223d8, 0x9622000c, 0x30437fff, 0x3c010800, 0xa4222410, +- 0x30428000, 0x3c010800, 0xa4231bc6, 0x10400005, 0x24020001, 0x3c010800, +- 0xac2223f4, 0x0a000102, 0x2406003e, 0x24060036, 0x3c010800, 0xac2023f4, +- 0x9622000a, 0x3c030800, 0x94631bc6, 0x3c010800, 0xac2023f0, 0x3c010800, +- 0xac2023f8, 0x00021302, 0x00021080, 0x00c21021, 0x00621821, 0x3c010800, +- 0xa42223d0, 0x3c010800, 0x0a000115, 0xa4231b96, 0x9622000c, 0x3c010800, +- 0xa42223ec, 0x3c040800, 0x24841b9c, 0x8c820000, 0x00021100, 0x3c010800, +- 0x00220821, 0xac311bc8, 0x8c820000, 0x00021100, 0x3c010800, 0x00220821, +- 0xac271bcc, 0x8c820000, 0x25030001, 0x306601ff, 0x00021100, 0x3c010800, +- 0x00220821, 0xac261bd0, 0x8c820000, 0x00021100, 0x3c010800, 0x00220821, +- 0xac291bd4, 0x96230008, 0x3c020800, 0x8c421bac, 0x00432821, 0x3c010800, +- 0xac251bac, 0x9622000a, 0x30420004, 0x14400018, 0x00061100, 0x8f630c14, +- 0x3063000f, 0x2c620002, 0x1440000b, 0x3c02c000, 0x8f630c14, 0x3c020800, +- 0x8c421b40, 0x3063000f, 0x24420001, 0x3c010800, 0xac221b40, 0x2c620002, +- 0x1040fff7, 0x3c02c000, 0x00e21825, 0xaf635c5c, 0x8f625c50, 0x30420002, +- 0x10400014, 0x00000000, 0x0a000147, 0x00000000, 0x3c030800, 0x8c631b80, +- 0x3c040800, 0x94841b94, 0x01221025, 0x3c010800, 0xa42223da, 0x24020001, +- 0x3c010800, 0xac221bb8, 0x24630001, 0x0085202a, 0x3c010800, 0x10800003, +- 0xac231b80, 0x3c010800, 0xa4251b94, 0x3c060800, 0x24c61b9c, 0x8cc20000, +- 0x24420001, 0xacc20000, 0x28420080, 0x14400005, 0x00000000, 0x0e000656, +- 0x24040002, 0x0a0001e6, 0x00000000, 0x3c020800, 0x8c421bb8, 0x10400078, +- 0x24020001, 0x3c050800, 0x90a51b98, 0x14a20072, 0x00000000, 0x3c150800, +- 0x96b51b96, 0x3c040800, 0x8c841bac, 0x32a3ffff, 0x0083102a, 0x1440006c, +- 0x00000000, 0x14830003, 0x00000000, 0x3c010800, 0xac2523f0, 0x1060005c, +- 0x00009021, 0x24d60004, 0x0060a021, 0x24d30014, 0x8ec20000, 0x00028100, +- 0x3c110800, 0x02308821, 0x0e000625, 0x8e311bc8, 0x00402821, 0x10a00054, +- 0x00000000, 0x9628000a, 0x31020040, 0x10400005, 0x2407180c, 0x8e22000c, +- 0x2407188c, 0x00021400, 0xaca20018, 0x3c030800, 0x00701821, 0x8c631bd0, +- 0x3c020800, 0x00501021, 0x8c421bd4, 0x00031d00, 0x00021400, 0x00621825, +- 0xaca30014, 0x8ec30004, 0x96220008, 0x00432023, 0x3242ffff, 0x3083ffff, +- 0x00431021, 0x0282102a, 0x14400002, 0x02b23023, 0x00803021, 0x8e620000, +- 0x30c4ffff, 0x00441021, 0xae620000, 0x8e220000, 0xaca20000, 0x8e220004, +- 0x8e63fff4, 0x00431021, 0xaca20004, 0xa4a6000e, 0x8e62fff4, 0x00441021, +- 0xae62fff4, 0x96230008, 0x0043102a, 0x14400005, 0x02469021, 0x8e62fff0, +- 0xae60fff4, 0x24420001, 0xae62fff0, 0xaca00008, 0x3242ffff, 0x14540008, +- 0x24020305, 0x31020080, 0x54400001, 0x34e70010, 0x24020905, 0xa4a2000c, +- 0x0a0001cb, 0x34e70020, 0xa4a2000c, 0x3c020800, 0x8c4223f0, 0x10400003, +- 0x3c024b65, 0x0a0001d3, 0x34427654, 0x3c02b49a, 0x344289ab, 0xaca2001c, +- 0x30e2ffff, 0xaca20010, 0x0e0005a2, 0x00a02021, 0x3242ffff, 0x0054102b, +- 0x1440ffa9, 0x00000000, 0x24020002, 0x3c010800, 0x0a0001e6, 0xa0221b98, +- 0x8ec2083c, 0x24420001, 0x0a0001e6, 0xaec2083c, 0x0e0004c0, 0x00000000, +- 0x8fbf002c, 0x8fb60028, 0x8fb50024, 0x8fb40020, 0x8fb3001c, 0x8fb20018, +- 0x8fb10014, 0x8fb00010, 0x03e00008, 0x27bd0030, 0x27bdffd0, 0xafbf0028, +- 0xafb30024, 0xafb20020, 0xafb1001c, 0xafb00018, 0x8f725c9c, 0x3c0200ff, +- 0x3442fff8, 0x3c070800, 0x24e71bb4, 0x02428824, 0x9623000e, 0x8ce20000, +- 0x00431021, 0xace20000, 0x8e220010, 0x30420020, 0x14400011, 0x00809821, +- 0x0e00063b, 0x02202021, 0x3c02c000, 0x02421825, 0xaf635c9c, 0x8f625c90, +- 0x30420002, 0x1040011e, 0x00000000, 0xaf635c9c, 0x8f625c90, 0x30420002, +- 0x10400119, 0x00000000, 0x0a00020d, 0x00000000, 0x8e240008, 0x8e230014, +- 0x00041402, 0x000231c0, 0x00031502, 0x304201ff, 0x2442ffff, 0x3042007f, +- 0x00031942, 0x30637800, 0x00021100, 0x24424000, 0x00624821, 0x9522000a, +- 0x3084ffff, 0x30420008, 0x104000b0, 0x000429c0, 0x3c020800, 0x8c422400, +- 0x14400024, 0x24c50008, 0x94c20014, 0x3c010800, 0xa42223d0, 0x8cc40010, +- 0x00041402, 0x3c010800, 0xa42223d2, 0x3c010800, 0xa42423d4, 0x94c2000e, +- 0x3083ffff, 0x00431023, 0x3c010800, 0xac222408, 0x94c2001a, 0x3c010800, +- 0xac262400, 0x3c010800, 0xac322404, 0x3c010800, 0xac2223fc, 0x3c02c000, +- 0x02421825, 0xaf635c9c, 0x8f625c90, 0x30420002, 0x104000e5, 0x00000000, +- 0xaf635c9c, 0x8f625c90, 0x30420002, 0x104000e0, 0x00000000, 0x0a000246, +- 0x00000000, 0x94c2000e, 0x3c030800, 0x946323d4, 0x00434023, 0x3103ffff, +- 0x2c620008, 0x1040001c, 0x00000000, 0x94c20014, 0x24420028, 0x00a22821, +- 0x00031042, 0x1840000b, 0x00002021, 0x24e60848, 0x00403821, 0x94a30000, +- 0x8cc20000, 0x24840001, 0x00431021, 0xacc20000, 0x0087102a, 0x1440fff9, +- 0x24a50002, 0x31020001, 0x1040001f, 0x3c024000, 0x3c040800, 0x248423fc, +- 0xa0a00001, 0x94a30000, 0x8c820000, 0x00431021, 0x0a000285, 0xac820000, +- 0x8f626800, 0x3c030010, 0x00431024, 0x10400009, 0x00000000, 0x94c2001a, +- 0x3c030800, 0x8c6323fc, 0x00431021, 0x3c010800, 0xac2223fc, 0x0a000286, +- 0x3c024000, 0x94c2001a, 0x94c4001c, 0x3c030800, 0x8c6323fc, 0x00441023, +- 0x00621821, 0x3c010800, 0xac2323fc, 0x3c024000, 0x02421825, 0xaf635c9c, +- 0x8f625c90, 0x30420002, 0x1440fffc, 0x00000000, 0x9522000a, 0x30420010, +- 0x1040009b, 0x00000000, 0x3c030800, 0x946323d4, 0x3c070800, 0x24e72400, +- 0x8ce40000, 0x8f626800, 0x24630030, 0x00832821, 0x3c030010, 0x00431024, +- 0x1440000a, 0x00000000, 0x94a20004, 0x3c040800, 0x8c842408, 0x3c030800, +- 0x8c6323fc, 0x00441023, 0x00621821, 0x3c010800, 0xac2323fc, 0x3c040800, +- 0x8c8423fc, 0x00041c02, 0x3082ffff, 0x00622021, 0x00041402, 0x00822021, +- 0x00041027, 0xa4a20006, 0x3c030800, 0x8c632404, 0x3c0200ff, 0x3442fff8, +- 0x00628824, 0x96220008, 0x24050001, 0x24034000, 0x000231c0, 0x00801021, +- 0xa4c2001a, 0xa4c0001c, 0xace00000, 0x3c010800, 0xac251b60, 0xaf635cb8, +- 0x8f625cb0, 0x30420002, 0x10400003, 0x00000000, 0x3c010800, 0xac201b60, +- 0x8e220008, 0xaf625cb8, 0x8f625cb0, 0x30420002, 0x10400003, 0x00000000, +- 0x3c010800, 0xac201b60, 0x3c020800, 0x8c421b60, 0x1040ffec, 0x00000000, +- 0x3c040800, 0x0e00063b, 0x8c842404, 0x0a00032a, 0x00000000, 0x3c030800, +- 0x90631b98, 0x24020002, 0x14620003, 0x3c034b65, 0x0a0002e1, 0x00008021, +- 0x8e22001c, 0x34637654, 0x10430002, 0x24100002, 0x24100001, 0x00c02021, +- 0x0e000350, 0x02003021, 0x24020003, 0x3c010800, 0xa0221b98, 0x24020002, +- 0x1202000a, 0x24020001, 0x3c030800, 0x8c6323f0, 0x10620006, 0x00000000, +- 0x3c020800, 0x944223d8, 0x00021400, 0x0a00031f, 0xae220014, 0x3c040800, +- 0x248423da, 0x94820000, 0x00021400, 0xae220014, 0x3c020800, 0x8c421bbc, +- 0x3c03c000, 0x3c010800, 0xa0201b98, 0x00431025, 0xaf625c5c, 0x8f625c50, +- 0x30420002, 0x10400009, 0x00000000, 0x2484f7e2, 0x8c820000, 0x00431025, +- 0xaf625c5c, 0x8f625c50, 0x30420002, 0x1440fffa, 0x00000000, 0x3c020800, +- 0x24421b84, 0x8c430000, 0x24630001, 0xac430000, 0x8f630c14, 0x3063000f, +- 0x2c620002, 0x1440000c, 0x3c024000, 0x8f630c14, 0x3c020800, 0x8c421b40, +- 0x3063000f, 0x24420001, 0x3c010800, 0xac221b40, 0x2c620002, 0x1040fff7, +- 0x00000000, 0x3c024000, 0x02421825, 0xaf635c9c, 0x8f625c90, 0x30420002, +- 0x1440fffc, 0x00000000, 0x12600003, 0x00000000, 0x0e0004c0, 0x00000000, +- 0x8fbf0028, 0x8fb30024, 0x8fb20020, 0x8fb1001c, 0x8fb00018, 0x03e00008, +- 0x27bd0030, 0x8f634450, 0x3c040800, 0x24841b88, 0x8c820000, 0x00031c02, +- 0x0043102b, 0x14400007, 0x3c038000, 0x8c840004, 0x8f624450, 0x00021c02, +- 0x0083102b, 0x1040fffc, 0x3c038000, 0xaf634444, 0x8f624444, 0x00431024, +- 0x1440fffd, 0x00000000, 0x8f624448, 0x03e00008, 0x3042ffff, 0x3c024000, +- 0x00822025, 0xaf645c38, 0x8f625c30, 0x30420002, 0x1440fffc, 0x00000000, +- 0x03e00008, 0x00000000, 0x27bdffe0, 0x00805821, 0x14c00011, 0x256e0008, +- 0x3c020800, 0x8c4223f4, 0x10400007, 0x24020016, 0x3c010800, 0xa42223d2, +- 0x2402002a, 0x3c010800, 0x0a000364, 0xa42223d4, 0x8d670010, 0x00071402, +- 0x3c010800, 0xa42223d2, 0x3c010800, 0xa42723d4, 0x3c040800, 0x948423d4, +- 0x3c030800, 0x946323d2, 0x95cf0006, 0x3c020800, 0x944223d0, 0x00832023, +- 0x01e2c023, 0x3065ffff, 0x24a20028, 0x01c24821, 0x3082ffff, 0x14c0001a, +- 0x01226021, 0x9582000c, 0x3042003f, 0x3c010800, 0xa42223d6, 0x95820004, +- 0x95830006, 0x3c010800, 0xac2023e4, 0x3c010800, 0xac2023e8, 0x00021400, +- 0x00431025, 0x3c010800, 0xac221bc0, 0x95220004, 0x3c010800, 0xa4221bc4, +- 0x95230002, 0x01e51023, 0x0043102a, 0x10400010, 0x24020001, 0x3c010800, +- 0x0a000398, 0xac2223f8, 0x3c030800, 0x8c6323e8, 0x3c020800, 0x94421bc4, +- 0x00431021, 0xa5220004, 0x3c020800, 0x94421bc0, 0xa5820004, 0x3c020800, +- 0x8c421bc0, 0xa5820006, 0x3c020800, 0x8c4223f0, 0x3c0d0800, 0x8dad23e4, +- 0x3c0a0800, 0x144000e5, 0x8d4a23e8, 0x3c020800, 0x94421bc4, 0x004a1821, +- 0x3063ffff, 0x0062182b, 0x24020002, 0x10c2000d, 0x01435023, 0x3c020800, +- 0x944223d6, 0x30420009, 0x10400008, 0x00000000, 0x9582000c, 0x3042fff6, +- 0xa582000c, 0x3c020800, 0x944223d6, 0x30420009, 0x01a26823, 0x3c020800, +- 0x8c4223f8, 0x1040004a, 0x01203821, 0x3c020800, 0x944223d2, 0x00004021, +- 0xa520000a, 0x01e21023, 0xa5220002, 0x3082ffff, 0x00021042, 0x18400008, +- 0x00003021, 0x00401821, 0x94e20000, 0x25080001, 0x00c23021, 0x0103102a, +- 0x1440fffb, 0x24e70002, 0x00061c02, 0x30c2ffff, 0x00623021, 0x00061402, +- 0x00c23021, 0x00c02821, 0x00061027, 0xa522000a, 0x00003021, 0x2527000c, +- 0x00004021, 0x94e20000, 0x25080001, 0x00c23021, 0x2d020004, 0x1440fffb, +- 0x24e70002, 0x95220002, 0x00004021, 0x91230009, 0x00442023, 0x01803821, +- 0x3082ffff, 0xa4e00010, 0x00621821, 0x00021042, 0x18400010, 0x00c33021, +- 0x00404821, 0x94e20000, 0x24e70002, 0x00c23021, 0x30e2007f, 0x14400006, +- 0x25080001, 0x8d630000, 0x3c02007f, 0x3442ff80, 0x00625824, 0x25670008, +- 0x0109102a, 0x1440fff3, 0x00000000, 0x30820001, 0x10400005, 0x00061c02, +- 0xa0e00001, 0x94e20000, 0x00c23021, 0x00061c02, 0x30c2ffff, 0x00623021, +- 0x00061402, 0x00c23021, 0x0a00047d, 0x30c6ffff, 0x24020002, 0x14c20081, +- 0x00000000, 0x3c020800, 0x8c42240c, 0x14400007, 0x00000000, 0x3c020800, +- 0x944223d2, 0x95230002, 0x01e21023, 0x10620077, 0x00000000, 0x3c020800, +- 0x944223d2, 0x01e21023, 0xa5220002, 0x3c020800, 0x8c42240c, 0x1040001a, +- 0x31e3ffff, 0x8dc70010, 0x3c020800, 0x94421b96, 0x00e04021, 0x00072c02, +- 0x00aa2021, 0x00431023, 0x00823823, 0x00072402, 0x30e2ffff, 0x00823821, +- 0x00071027, 0xa522000a, 0x3102ffff, 0x3c040800, 0x948423d4, 0x00453023, +- 0x00e02821, 0x00641823, 0x006d1821, 0x00c33021, 0x00061c02, 0x30c2ffff, +- 0x0a00047d, 0x00623021, 0x01203821, 0x00004021, 0x3082ffff, 0x00021042, +- 0x18400008, 0x00003021, 0x00401821, 0x94e20000, 0x25080001, 0x00c23021, +- 0x0103102a, 0x1440fffb, 0x24e70002, 0x00061c02, 0x30c2ffff, 0x00623021, +- 0x00061402, 0x00c23021, 0x00c02821, 0x00061027, 0xa522000a, 0x00003021, +- 0x2527000c, 0x00004021, 0x94e20000, 0x25080001, 0x00c23021, 0x2d020004, +- 0x1440fffb, 0x24e70002, 0x95220002, 0x00004021, 0x91230009, 0x00442023, +- 0x01803821, 0x3082ffff, 0xa4e00010, 0x3c040800, 0x948423d4, 0x00621821, +- 0x00c33021, 0x00061c02, 0x30c2ffff, 0x00623021, 0x00061c02, 0x3c020800, +- 0x944223d0, 0x00c34821, 0x00441023, 0x00021fc2, 0x00431021, 0x00021043, +- 0x18400010, 0x00003021, 0x00402021, 0x94e20000, 0x24e70002, 0x00c23021, +- 0x30e2007f, 0x14400006, 0x25080001, 0x8d630000, 0x3c02007f, 0x3442ff80, +- 0x00625824, 0x25670008, 0x0104102a, 0x1440fff3, 0x00000000, 0x3c020800, +- 0x944223ec, 0x00c23021, 0x3122ffff, 0x00c23021, 0x00061c02, 0x30c2ffff, +- 0x00623021, 0x00061402, 0x00c23021, 0x00c04021, 0x00061027, 0xa5820010, +- 0xadc00014, 0x0a00049d, 0xadc00000, 0x8dc70010, 0x00e04021, 0x11400007, +- 0x00072c02, 0x00aa3021, 0x00061402, 0x30c3ffff, 0x00433021, 0x00061402, +- 0x00c22821, 0x00051027, 0xa522000a, 0x3c030800, 0x946323d4, 0x3102ffff, +- 0x01e21021, 0x00433023, 0x00cd3021, 0x00061c02, 0x30c2ffff, 0x00623021, +- 0x00061402, 0x00c23021, 0x00c04021, 0x00061027, 0xa5820010, 0x3102ffff, +- 0x00051c00, 0x00431025, 0xadc20010, 0x3c020800, 0x8c4223f4, 0x10400005, +- 0x2de205eb, 0x14400002, 0x25e2fff2, 0x34028870, 0xa5c20034, 0x3c030800, +- 0x246323e8, 0x8c620000, 0x24420001, 0xac620000, 0x3c040800, 0x8c8423e4, +- 0x3c020800, 0x8c421bc0, 0x3303ffff, 0x00832021, 0x00431821, 0x0062102b, +- 0x3c010800, 0xac2423e4, 0x10400003, 0x2482ffff, 0x3c010800, 0xac2223e4, +- 0x3c010800, 0xac231bc0, 0x03e00008, 0x27bd0020, 0x27bdffb8, 0x3c050800, +- 0x24a51b96, 0xafbf0044, 0xafbe0040, 0xafb7003c, 0xafb60038, 0xafb50034, +- 0xafb40030, 0xafb3002c, 0xafb20028, 0xafb10024, 0xafb00020, 0x94a90000, +- 0x3c020800, 0x944223d0, 0x3c030800, 0x8c631bb0, 0x3c040800, 0x8c841bac, +- 0x01221023, 0x0064182a, 0xa7a9001e, 0x106000be, 0xa7a20016, 0x24be0022, +- 0x97b6001e, 0x24b3001a, 0x24b70016, 0x8fc20000, 0x14400008, 0x00000000, +- 0x8fc2fff8, 0x97a30016, 0x8fc4fff4, 0x00431021, 0x0082202a, 0x148000b0, +- 0x00000000, 0x97d50818, 0x32a2ffff, 0x104000a3, 0x00009021, 0x0040a021, +- 0x00008821, 0x0e000625, 0x00000000, 0x00403021, 0x14c00007, 0x00000000, +- 0x3c020800, 0x8c4223dc, 0x24420001, 0x3c010800, 0x0a000596, 0xac2223dc, +- 0x3c100800, 0x02118021, 0x8e101bc8, 0x9608000a, 0x31020040, 0x10400005, +- 0x2407180c, 0x8e02000c, 0x2407188c, 0x00021400, 0xacc20018, 0x31020080, +- 0x54400001, 0x34e70010, 0x3c020800, 0x00511021, 0x8c421bd0, 0x3c030800, +- 0x00711821, 0x8c631bd4, 0x00021500, 0x00031c00, 0x00431025, 0xacc20014, +- 0x96040008, 0x3242ffff, 0x00821021, 0x0282102a, 0x14400002, 0x02b22823, +- 0x00802821, 0x8e020000, 0x02459021, 0xacc20000, 0x8e020004, 0x00c02021, +- 0x26310010, 0xac820004, 0x30e2ffff, 0xac800008, 0xa485000e, 0xac820010, +- 0x24020305, 0x0e0005a2, 0xa482000c, 0x3242ffff, 0x0054102b, 0x1440ffc5, +- 0x3242ffff, 0x0a00058e, 0x00000000, 0x8e620000, 0x8e63fffc, 0x0043102a, +- 0x10400067, 0x00000000, 0x8e62fff0, 0x00028900, 0x3c100800, 0x02118021, +- 0x0e000625, 0x8e101bc8, 0x00403021, 0x14c00005, 0x00000000, 0x8e62082c, +- 0x24420001, 0x0a000596, 0xae62082c, 0x9608000a, 0x31020040, 0x10400005, +- 0x2407180c, 0x8e02000c, 0x2407188c, 0x00021400, 0xacc20018, 0x3c020800, +- 0x00511021, 0x8c421bd0, 0x3c030800, 0x00711821, 0x8c631bd4, 0x00021500, +- 0x00031c00, 0x00431025, 0xacc20014, 0x8e63fff4, 0x96020008, 0x00432023, +- 0x3242ffff, 0x3083ffff, 0x00431021, 0x02c2102a, 0x10400003, 0x00802821, +- 0x97a9001e, 0x01322823, 0x8e620000, 0x30a4ffff, 0x00441021, 0xae620000, +- 0xa4c5000e, 0x8e020000, 0xacc20000, 0x8e020004, 0x8e63fff4, 0x00431021, +- 0xacc20004, 0x8e63fff4, 0x96020008, 0x00641821, 0x0062102a, 0x14400006, +- 0x02459021, 0x8e62fff0, 0xae60fff4, 0x24420001, 0x0a000571, 0xae62fff0, +- 0xae63fff4, 0xacc00008, 0x3242ffff, 0x10560003, 0x31020004, 0x10400006, +- 0x24020305, 0x31020080, 0x54400001, 0x34e70010, 0x34e70020, 0x24020905, +- 0xa4c2000c, 0x8ee30000, 0x8ee20004, 0x14620007, 0x3c02b49a, 0x8ee20860, +- 0x54400001, 0x34e70400, 0x3c024b65, 0x0a000588, 0x34427654, 0x344289ab, +- 0xacc2001c, 0x30e2ffff, 0xacc20010, 0x0e0005a2, 0x00c02021, 0x3242ffff, +- 0x0056102b, 0x1440ff9b, 0x00000000, 0x8e620000, 0x8e63fffc, 0x0043102a, +- 0x1440ff48, 0x00000000, 0x8fbf0044, 0x8fbe0040, 0x8fb7003c, 0x8fb60038, +- 0x8fb50034, 0x8fb40030, 0x8fb3002c, 0x8fb20028, 0x8fb10024, 0x8fb00020, +- 0x03e00008, 0x27bd0048, 0x27bdffe8, 0xafbf0014, 0xafb00010, 0x8f624450, +- 0x8f634410, 0x0a0005b1, 0x00808021, 0x8f626820, 0x30422000, 0x10400003, +- 0x00000000, 0x0e0001f0, 0x00002021, 0x8f624450, 0x8f634410, 0x3042ffff, +- 0x0043102b, 0x1440fff5, 0x00000000, 0x8f630c14, 0x3063000f, 0x2c620002, +- 0x1440000b, 0x00000000, 0x8f630c14, 0x3c020800, 0x8c421b40, 0x3063000f, +- 0x24420001, 0x3c010800, 0xac221b40, 0x2c620002, 0x1040fff7, 0x00000000, +- 0xaf705c18, 0x8f625c10, 0x30420002, 0x10400009, 0x00000000, 0x8f626820, +- 0x30422000, 0x1040fff8, 0x00000000, 0x0e0001f0, 0x00002021, 0x0a0005c4, +- 0x00000000, 0x8fbf0014, 0x8fb00010, 0x03e00008, 0x27bd0018, 0x00000000, +- 0x00000000, 0x00000000, 0x27bdffe8, 0x3c1bc000, 0xafbf0014, 0xafb00010, +- 0xaf60680c, 0x8f626804, 0x34420082, 0xaf626804, 0x8f634000, 0x24020b50, +- 0x3c010800, 0xac221b54, 0x24020b78, 0x3c010800, 0xac221b64, 0x34630002, +- 0xaf634000, 0x0e000605, 0x00808021, 0x3c010800, 0xa0221b68, 0x304200ff, +- 0x24030002, 0x14430005, 0x00000000, 0x3c020800, 0x8c421b54, 0x0a0005f8, +- 0xac5000c0, 0x3c020800, 0x8c421b54, 0xac5000bc, 0x8f624434, 0x8f634438, +- 0x8f644410, 0x3c010800, 0xac221b5c, 0x3c010800, 0xac231b6c, 0x3c010800, +- 0xac241b58, 0x8fbf0014, 0x8fb00010, 0x03e00008, 0x27bd0018, 0x3c040800, +- 0x8c870000, 0x3c03aa55, 0x3463aa55, 0x3c06c003, 0xac830000, 0x8cc20000, +- 0x14430007, 0x24050002, 0x3c0355aa, 0x346355aa, 0xac830000, 0x8cc20000, +- 0x50430001, 0x24050001, 0x3c020800, 0xac470000, 0x03e00008, 0x00a01021, +- 0x27bdfff8, 0x18800009, 0x00002821, 0x8f63680c, 0x8f62680c, 0x1043fffe, +- 0x00000000, 0x24a50001, 0x00a4102a, 0x1440fff9, 0x00000000, 0x03e00008, +- 0x27bd0008, 0x8f634450, 0x3c020800, 0x8c421b5c, 0x00031c02, 0x0043102b, +- 0x14400008, 0x3c038000, 0x3c040800, 0x8c841b6c, 0x8f624450, 0x00021c02, +- 0x0083102b, 0x1040fffc, 0x3c038000, 0xaf634444, 0x8f624444, 0x00431024, +- 0x1440fffd, 0x00000000, 0x8f624448, 0x03e00008, 0x3042ffff, 0x3082ffff, +- 0x2442e000, 0x2c422001, 0x14400003, 0x3c024000, 0x0a000648, 0x2402ffff, +- 0x00822025, 0xaf645c38, 0x8f625c30, 0x30420002, 0x1440fffc, 0x00001021, +- 0x03e00008, 0x00000000, 0x8f624450, 0x3c030800, 0x8c631b58, 0x0a000651, +- 0x3042ffff, 0x8f624450, 0x3042ffff, 0x0043102b, 0x1440fffc, 0x00000000, +- 0x03e00008, 0x00000000, 0x27bdffe0, 0x00802821, 0x3c040800, 0x24841af0, +- 0x00003021, 0x00003821, 0xafbf0018, 0xafa00010, 0x0e00067c, 0xafa00014, +- 0x0a000660, 0x00000000, 0x8fbf0018, 0x03e00008, 0x27bd0020, 0x00000000, +- 0x00000000, 0x00000000, 0x3c020800, 0x34423000, 0x3c030800, 0x34633000, +- 0x3c040800, 0x348437ff, 0x3c010800, 0xac221b74, 0x24020040, 0x3c010800, +- 0xac221b78, 0x3c010800, 0xac201b70, 0xac600000, 0x24630004, 0x0083102b, +- 0x5040fffd, 0xac600000, 0x03e00008, 0x00000000, 0x00804821, 0x8faa0010, +- 0x3c020800, 0x8c421b70, 0x3c040800, 0x8c841b78, 0x8fab0014, 0x24430001, +- 0x0044102b, 0x3c010800, 0xac231b70, 0x14400003, 0x00004021, 0x3c010800, +- 0xac201b70, 0x3c020800, 0x8c421b70, 0x3c030800, 0x8c631b74, 0x91240000, +- 0x00021140, 0x00431021, 0x00481021, 0x25080001, 0xa0440000, 0x29020008, +- 0x1440fff4, 0x25290001, 0x3c020800, 0x8c421b70, 0x3c030800, 0x8c631b74, +- 0x8f64680c, 0x00021140, 0x00431021, 0xac440008, 0xac45000c, 0xac460010, +- 0xac470014, 0xac4a0018, 0x03e00008, 0xac4b001c, 0x00000000, 0x00000000, +-}; +- +-static const u32 tg3TsoFwRodata[] = { +- 0x4d61696e, 0x43707542, 0x00000000, 0x4d61696e, 0x43707541, 0x00000000, +- 0x00000000, 0x00000000, 0x73746b6f, 0x66666c64, 0x496e0000, 0x73746b6f, +- 0x66662a2a, 0x00000000, 0x53774576, 0x656e7430, 0x00000000, 0x00000000, +- 0x00000000, 0x00000000, 0x66617461, 0x6c457272, 0x00000000, 0x00000000, +- 0x00000000, +-}; +- +-static const u32 tg3TsoFwData[] = { +- 0x00000000, 0x73746b6f, 0x66666c64, 0x5f76312e, 0x362e3000, 0x00000000, +- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +- 0x00000000, +-}; +- +-/* 5705 needs a special version of the TSO firmware. */ +-#define TG3_TSO5_FW_RELEASE_MAJOR 0x1 +-#define TG3_TSO5_FW_RELASE_MINOR 0x2 +-#define TG3_TSO5_FW_RELEASE_FIX 0x0 +-#define TG3_TSO5_FW_START_ADDR 0x00010000 +-#define TG3_TSO5_FW_TEXT_ADDR 0x00010000 +-#define TG3_TSO5_FW_TEXT_LEN 0xe90 +-#define TG3_TSO5_FW_RODATA_ADDR 0x00010e90 +-#define TG3_TSO5_FW_RODATA_LEN 0x50 +-#define TG3_TSO5_FW_DATA_ADDR 0x00010f00 +-#define TG3_TSO5_FW_DATA_LEN 0x20 +-#define TG3_TSO5_FW_SBSS_ADDR 0x00010f20 +-#define TG3_TSO5_FW_SBSS_LEN 0x28 +-#define TG3_TSO5_FW_BSS_ADDR 0x00010f50 +-#define TG3_TSO5_FW_BSS_LEN 0x88 +- +-static const u32 tg3Tso5FwText[(TG3_TSO5_FW_TEXT_LEN / 4) + 1] = { +- 0x0c004003, 0x00000000, 0x00010f04, 0x00000000, 0x10000003, 0x00000000, +- 0x0000000d, 0x0000000d, 0x3c1d0001, 0x37bde000, 0x03a0f021, 0x3c100001, +- 0x26100000, 0x0c004010, 0x00000000, 0x0000000d, 0x27bdffe0, 0x3c04fefe, +- 0xafbf0018, 0x0c0042e8, 0x34840002, 0x0c004364, 0x00000000, 0x3c030001, +- 0x90630f34, 0x24020002, 0x3c040001, 0x24840e9c, 0x14620003, 0x24050001, +- 0x3c040001, 0x24840e90, 0x24060002, 0x00003821, 0xafa00010, 0x0c004378, +- 0xafa00014, 0x0c00402c, 0x00000000, 0x8fbf0018, 0x03e00008, 0x27bd0020, +- 0x00000000, 0x00000000, 0x27bdffe0, 0xafbf001c, 0xafb20018, 0xafb10014, +- 0x0c0042d4, 0xafb00010, 0x3c128000, 0x24110001, 0x8f706810, 0x32020400, +- 0x10400007, 0x00000000, 0x8f641008, 0x00921024, 0x14400003, 0x00000000, +- 0x0c004064, 0x00000000, 0x3c020001, 0x90420f56, 0x10510003, 0x32020200, +- 0x1040fff1, 0x00000000, 0x0c0041b4, 0x00000000, 0x08004034, 0x00000000, +- 0x8fbf001c, 0x8fb20018, 0x8fb10014, 0x8fb00010, 0x03e00008, 0x27bd0020, +- 0x27bdffe0, 0x3c040001, 0x24840eb0, 0x00002821, 0x00003021, 0x00003821, +- 0xafbf0018, 0xafa00010, 0x0c004378, 0xafa00014, 0x0000d021, 0x24020130, +- 0xaf625000, 0x3c010001, 0xa4200f50, 0x3c010001, 0xa0200f57, 0x8fbf0018, +- 0x03e00008, 0x27bd0020, 0x00000000, 0x00000000, 0x3c030001, 0x24630f60, +- 0x90620000, 0x27bdfff0, 0x14400003, 0x0080c021, 0x08004073, 0x00004821, +- 0x3c022000, 0x03021024, 0x10400003, 0x24090002, 0x08004073, 0xa0600000, +- 0x24090001, 0x00181040, 0x30431f80, 0x346f8008, 0x1520004b, 0x25eb0028, +- 0x3c040001, 0x00832021, 0x8c848010, 0x3c050001, 0x24a50f7a, 0x00041402, +- 0xa0a20000, 0x3c010001, 0xa0240f7b, 0x3c020001, 0x00431021, 0x94428014, +- 0x3c010001, 0xa0220f7c, 0x3c0c0001, 0x01836021, 0x8d8c8018, 0x304200ff, +- 0x24420008, 0x000220c3, 0x24020001, 0x3c010001, 0xa0220f60, 0x0124102b, +- 0x1040000c, 0x00003821, 0x24a6000e, 0x01602821, 0x8ca20000, 0x8ca30004, +- 0x24a50008, 0x24e70001, 0xacc20000, 0xacc30004, 0x00e4102b, 0x1440fff8, +- 0x24c60008, 0x00003821, 0x3c080001, 0x25080f7b, 0x91060000, 0x3c020001, +- 0x90420f7c, 0x2503000d, 0x00c32821, 0x00461023, 0x00021fc2, 0x00431021, +- 0x00021043, 0x1840000c, 0x00002021, 0x91020001, 0x00461023, 0x00021fc2, +- 0x00431021, 0x00021843, 0x94a20000, 0x24e70001, 0x00822021, 0x00e3102a, +- 0x1440fffb, 0x24a50002, 0x00041c02, 0x3082ffff, 0x00622021, 0x00041402, +- 0x00822021, 0x3c02ffff, 0x01821024, 0x3083ffff, 0x00431025, 0x3c010001, +- 0x080040fa, 0xac220f80, 0x3c050001, 0x24a50f7c, 0x90a20000, 0x3c0c0001, +- 0x01836021, 0x8d8c8018, 0x000220c2, 0x1080000e, 0x00003821, 0x01603021, +- 0x24a5000c, 0x8ca20000, 0x8ca30004, 0x24a50008, 0x24e70001, 0xacc20000, +- 0xacc30004, 0x00e4102b, 0x1440fff8, 0x24c60008, 0x3c050001, 0x24a50f7c, +- 0x90a20000, 0x30430007, 0x24020004, 0x10620011, 0x28620005, 0x10400005, +- 0x24020002, 0x10620008, 0x000710c0, 0x080040fa, 0x00000000, 0x24020006, +- 0x1062000e, 0x000710c0, 0x080040fa, 0x00000000, 0x00a21821, 0x9463000c, +- 0x004b1021, 0x080040fa, 0xa4430000, 0x000710c0, 0x00a21821, 0x8c63000c, +- 0x004b1021, 0x080040fa, 0xac430000, 0x00a21821, 0x8c63000c, 0x004b2021, +- 0x00a21021, 0xac830000, 0x94420010, 0xa4820004, 0x95e70006, 0x3c020001, +- 0x90420f7c, 0x3c030001, 0x90630f7a, 0x00e2c823, 0x3c020001, 0x90420f7b, +- 0x24630028, 0x01e34021, 0x24420028, 0x15200012, 0x01e23021, 0x94c2000c, +- 0x3c010001, 0xa4220f78, 0x94c20004, 0x94c30006, 0x3c010001, 0xa4200f76, +- 0x3c010001, 0xa4200f72, 0x00021400, 0x00431025, 0x3c010001, 0xac220f6c, +- 0x95020004, 0x3c010001, 0x08004124, 0xa4220f70, 0x3c020001, 0x94420f70, +- 0x3c030001, 0x94630f72, 0x00431021, 0xa5020004, 0x3c020001, 0x94420f6c, +- 0xa4c20004, 0x3c020001, 0x8c420f6c, 0xa4c20006, 0x3c040001, 0x94840f72, +- 0x3c020001, 0x94420f70, 0x3c0a0001, 0x954a0f76, 0x00441821, 0x3063ffff, +- 0x0062182a, 0x24020002, 0x1122000b, 0x00832023, 0x3c030001, 0x94630f78, +- 0x30620009, 0x10400006, 0x3062fff6, 0xa4c2000c, 0x3c020001, 0x94420f78, +- 0x30420009, 0x01425023, 0x24020001, 0x1122001b, 0x29220002, 0x50400005, +- 0x24020002, 0x11200007, 0x31a2ffff, 0x08004197, 0x00000000, 0x1122001d, +- 0x24020016, 0x08004197, 0x31a2ffff, 0x3c0e0001, 0x95ce0f80, 0x10800005, +- 0x01806821, 0x01c42021, 0x00041c02, 0x3082ffff, 0x00627021, 0x000e1027, +- 0xa502000a, 0x3c030001, 0x90630f7b, 0x31a2ffff, 0x00e21021, 0x0800418d, +- 0x00432023, 0x3c020001, 0x94420f80, 0x00442021, 0x00041c02, 0x3082ffff, +- 0x00622021, 0x00807021, 0x00041027, 0x08004185, 0xa502000a, 0x3c050001, +- 0x24a50f7a, 0x90a30000, 0x14620002, 0x24e2fff2, 0xa5e20034, 0x90a20000, +- 0x00e21023, 0xa5020002, 0x3c030001, 0x94630f80, 0x3c020001, 0x94420f5a, +- 0x30e5ffff, 0x00641821, 0x00451023, 0x00622023, 0x00041c02, 0x3082ffff, +- 0x00622021, 0x00041027, 0xa502000a, 0x3c030001, 0x90630f7c, 0x24620001, +- 0x14a20005, 0x00807021, 0x01631021, 0x90420000, 0x08004185, 0x00026200, +- 0x24620002, 0x14a20003, 0x306200fe, 0x004b1021, 0x944c0000, 0x3c020001, +- 0x94420f82, 0x3183ffff, 0x3c040001, 0x90840f7b, 0x00431021, 0x00e21021, +- 0x00442023, 0x008a2021, 0x00041c02, 0x3082ffff, 0x00622021, 0x00041402, +- 0x00822021, 0x00806821, 0x00041027, 0xa4c20010, 0x31a2ffff, 0x000e1c00, +- 0x00431025, 0x3c040001, 0x24840f72, 0xade20010, 0x94820000, 0x3c050001, +- 0x94a50f76, 0x3c030001, 0x8c630f6c, 0x24420001, 0x00b92821, 0xa4820000, +- 0x3322ffff, 0x00622021, 0x0083182b, 0x3c010001, 0xa4250f76, 0x10600003, +- 0x24a2ffff, 0x3c010001, 0xa4220f76, 0x3c024000, 0x03021025, 0x3c010001, +- 0xac240f6c, 0xaf621008, 0x03e00008, 0x27bd0010, 0x3c030001, 0x90630f56, +- 0x27bdffe8, 0x24020001, 0xafbf0014, 0x10620026, 0xafb00010, 0x8f620cf4, +- 0x2442ffff, 0x3042007f, 0x00021100, 0x8c434000, 0x3c010001, 0xac230f64, +- 0x8c434008, 0x24444000, 0x8c5c4004, 0x30620040, 0x14400002, 0x24020088, +- 0x24020008, 0x3c010001, 0xa4220f68, 0x30620004, 0x10400005, 0x24020001, +- 0x3c010001, 0xa0220f57, 0x080041d5, 0x00031402, 0x3c010001, 0xa0200f57, +- 0x00031402, 0x3c010001, 0xa4220f54, 0x9483000c, 0x24020001, 0x3c010001, +- 0xa4200f50, 0x3c010001, 0xa0220f56, 0x3c010001, 0xa4230f62, 0x24020001, +- 0x1342001e, 0x00000000, 0x13400005, 0x24020003, 0x13420067, 0x00000000, +- 0x080042cf, 0x00000000, 0x3c020001, 0x94420f62, 0x241a0001, 0x3c010001, +- 0xa4200f5e, 0x3c010001, 0xa4200f52, 0x304407ff, 0x00021bc2, 0x00031823, +- 0x3063003e, 0x34630036, 0x00021242, 0x3042003c, 0x00621821, 0x3c010001, +- 0xa4240f58, 0x00832021, 0x24630030, 0x3c010001, 0xa4240f5a, 0x3c010001, +- 0xa4230f5c, 0x3c060001, 0x24c60f52, 0x94c50000, 0x94c30002, 0x3c040001, +- 0x94840f5a, 0x00651021, 0x0044102a, 0x10400013, 0x3c108000, 0x00a31021, +- 0xa4c20000, 0x3c02a000, 0xaf620cf4, 0x3c010001, 0xa0200f56, 0x8f641008, +- 0x00901024, 0x14400003, 0x00000000, 0x0c004064, 0x00000000, 0x8f620cf4, +- 0x00501024, 0x104000b7, 0x00000000, 0x0800420f, 0x00000000, 0x3c030001, +- 0x94630f50, 0x00851023, 0xa4c40000, 0x00621821, 0x3042ffff, 0x3c010001, +- 0xa4230f50, 0xaf620ce8, 0x3c020001, 0x94420f68, 0x34420024, 0xaf620cec, +- 0x94c30002, 0x3c020001, 0x94420f50, 0x14620012, 0x3c028000, 0x3c108000, +- 0x3c02a000, 0xaf620cf4, 0x3c010001, 0xa0200f56, 0x8f641008, 0x00901024, +- 0x14400003, 0x00000000, 0x0c004064, 0x00000000, 0x8f620cf4, 0x00501024, +- 0x1440fff7, 0x00000000, 0x080042cf, 0x241a0003, 0xaf620cf4, 0x3c108000, +- 0x8f641008, 0x00901024, 0x14400003, 0x00000000, 0x0c004064, 0x00000000, +- 0x8f620cf4, 0x00501024, 0x1440fff7, 0x00000000, 0x080042cf, 0x241a0003, +- 0x3c070001, 0x24e70f50, 0x94e20000, 0x03821021, 0xaf620ce0, 0x3c020001, +- 0x8c420f64, 0xaf620ce4, 0x3c050001, 0x94a50f54, 0x94e30000, 0x3c040001, +- 0x94840f58, 0x3c020001, 0x94420f5e, 0x00a32823, 0x00822023, 0x30a6ffff, +- 0x3083ffff, 0x00c3102b, 0x14400043, 0x00000000, 0x3c020001, 0x94420f5c, +- 0x00021400, 0x00621025, 0xaf620ce8, 0x94e20000, 0x3c030001, 0x94630f54, +- 0x00441021, 0xa4e20000, 0x3042ffff, 0x14430021, 0x3c020008, 0x3c020001, +- 0x90420f57, 0x10400006, 0x3c03000c, 0x3c020001, 0x94420f68, 0x34630624, +- 0x0800427c, 0x0000d021, 0x3c020001, 0x94420f68, 0x3c030008, 0x34630624, +- 0x00431025, 0xaf620cec, 0x3c108000, 0x3c02a000, 0xaf620cf4, 0x3c010001, +- 0xa0200f56, 0x8f641008, 0x00901024, 0x14400003, 0x00000000, 0x0c004064, +- 0x00000000, 0x8f620cf4, 0x00501024, 0x10400015, 0x00000000, 0x08004283, +- 0x00000000, 0x3c030001, 0x94630f68, 0x34420624, 0x3c108000, 0x00621825, +- 0x3c028000, 0xaf630cec, 0xaf620cf4, 0x8f641008, 0x00901024, 0x14400003, +- 0x00000000, 0x0c004064, 0x00000000, 0x8f620cf4, 0x00501024, 0x1440fff7, +- 0x00000000, 0x3c010001, 0x080042cf, 0xa4200f5e, 0x3c020001, 0x94420f5c, +- 0x00021400, 0x00c21025, 0xaf620ce8, 0x3c020001, 0x90420f57, 0x10400009, +- 0x3c03000c, 0x3c020001, 0x94420f68, 0x34630624, 0x0000d021, 0x00431025, +- 0xaf620cec, 0x080042c1, 0x3c108000, 0x3c020001, 0x94420f68, 0x3c030008, +- 0x34630604, 0x00431025, 0xaf620cec, 0x3c020001, 0x94420f5e, 0x00451021, +- 0x3c010001, 0xa4220f5e, 0x3c108000, 0x3c02a000, 0xaf620cf4, 0x3c010001, +- 0xa0200f56, 0x8f641008, 0x00901024, 0x14400003, 0x00000000, 0x0c004064, +- 0x00000000, 0x8f620cf4, 0x00501024, 0x1440fff7, 0x00000000, 0x8fbf0014, +- 0x8fb00010, 0x03e00008, 0x27bd0018, 0x00000000, 0x27bdffe0, 0x3c040001, +- 0x24840ec0, 0x00002821, 0x00003021, 0x00003821, 0xafbf0018, 0xafa00010, +- 0x0c004378, 0xafa00014, 0x0000d021, 0x24020130, 0xaf625000, 0x3c010001, +- 0xa4200f50, 0x3c010001, 0xa0200f57, 0x8fbf0018, 0x03e00008, 0x27bd0020, +- 0x27bdffe8, 0x3c1bc000, 0xafbf0014, 0xafb00010, 0xaf60680c, 0x8f626804, +- 0x34420082, 0xaf626804, 0x8f634000, 0x24020b50, 0x3c010001, 0xac220f20, +- 0x24020b78, 0x3c010001, 0xac220f30, 0x34630002, 0xaf634000, 0x0c004315, +- 0x00808021, 0x3c010001, 0xa0220f34, 0x304200ff, 0x24030002, 0x14430005, +- 0x00000000, 0x3c020001, 0x8c420f20, 0x08004308, 0xac5000c0, 0x3c020001, +- 0x8c420f20, 0xac5000bc, 0x8f624434, 0x8f634438, 0x8f644410, 0x3c010001, +- 0xac220f28, 0x3c010001, 0xac230f38, 0x3c010001, 0xac240f24, 0x8fbf0014, +- 0x8fb00010, 0x03e00008, 0x27bd0018, 0x03e00008, 0x24020001, 0x27bdfff8, +- 0x18800009, 0x00002821, 0x8f63680c, 0x8f62680c, 0x1043fffe, 0x00000000, +- 0x24a50001, 0x00a4102a, 0x1440fff9, 0x00000000, 0x03e00008, 0x27bd0008, +- 0x8f634450, 0x3c020001, 0x8c420f28, 0x00031c02, 0x0043102b, 0x14400008, +- 0x3c038000, 0x3c040001, 0x8c840f38, 0x8f624450, 0x00021c02, 0x0083102b, +- 0x1040fffc, 0x3c038000, 0xaf634444, 0x8f624444, 0x00431024, 0x1440fffd, +- 0x00000000, 0x8f624448, 0x03e00008, 0x3042ffff, 0x3082ffff, 0x2442e000, +- 0x2c422001, 0x14400003, 0x3c024000, 0x08004347, 0x2402ffff, 0x00822025, +- 0xaf645c38, 0x8f625c30, 0x30420002, 0x1440fffc, 0x00001021, 0x03e00008, +- 0x00000000, 0x8f624450, 0x3c030001, 0x8c630f24, 0x08004350, 0x3042ffff, +- 0x8f624450, 0x3042ffff, 0x0043102b, 0x1440fffc, 0x00000000, 0x03e00008, +- 0x00000000, 0x27bdffe0, 0x00802821, 0x3c040001, 0x24840ed0, 0x00003021, +- 0x00003821, 0xafbf0018, 0xafa00010, 0x0c004378, 0xafa00014, 0x0800435f, +- 0x00000000, 0x8fbf0018, 0x03e00008, 0x27bd0020, 0x3c020001, 0x3442d600, +- 0x3c030001, 0x3463d600, 0x3c040001, 0x3484ddff, 0x3c010001, 0xac220f40, +- 0x24020040, 0x3c010001, 0xac220f44, 0x3c010001, 0xac200f3c, 0xac600000, +- 0x24630004, 0x0083102b, 0x5040fffd, 0xac600000, 0x03e00008, 0x00000000, +- 0x00804821, 0x8faa0010, 0x3c020001, 0x8c420f3c, 0x3c040001, 0x8c840f44, +- 0x8fab0014, 0x24430001, 0x0044102b, 0x3c010001, 0xac230f3c, 0x14400003, +- 0x00004021, 0x3c010001, 0xac200f3c, 0x3c020001, 0x8c420f3c, 0x3c030001, +- 0x8c630f40, 0x91240000, 0x00021140, 0x00431021, 0x00481021, 0x25080001, +- 0xa0440000, 0x29020008, 0x1440fff4, 0x25290001, 0x3c020001, 0x8c420f3c, +- 0x3c030001, 0x8c630f40, 0x8f64680c, 0x00021140, 0x00431021, 0xac440008, +- 0xac45000c, 0xac460010, 0xac470014, 0xac4a0018, 0x03e00008, 0xac4b001c, +- 0x00000000, 0x00000000, 0x00000000, +-}; +- +-static const u32 tg3Tso5FwRodata[(TG3_TSO5_FW_RODATA_LEN / 4) + 1] = { +- 0x4d61696e, 0x43707542, 0x00000000, 0x4d61696e, 0x43707541, 0x00000000, +- 0x00000000, 0x00000000, 0x73746b6f, 0x66666c64, 0x00000000, 0x00000000, +- 0x73746b6f, 0x66666c64, 0x00000000, 0x00000000, 0x66617461, 0x6c457272, +- 0x00000000, 0x00000000, 0x00000000, +-}; +- +-static const u32 tg3Tso5FwData[(TG3_TSO5_FW_DATA_LEN / 4) + 1] = { +- 0x00000000, 0x73746b6f, 0x66666c64, 0x5f76312e, 0x322e3000, 0x00000000, +- 0x00000000, 0x00000000, 0x00000000, +-}; ++#if TG3_TSO_SUPPORT != 0 + + /* tp->lock is held. */ + static int tg3_load_tso_firmware(struct tg3 *tp) + { + struct fw_info info; ++ const u32 *fw_data; + unsigned long cpu_base, cpu_scratch_base, cpu_scratch_size; + int err, i; + + if (tp->tg3_flags2 & TG3_FLG2_HW_TSO) + return 0; + ++ fw_data = (void *)tp->fw->data; ++ ++ /* Firmware blob starts with version numbers, followed by ++ start address and length. We are setting complete length. ++ length = end_address_of_bss - start_address_of_text. ++ Remainder is the blob to be loaded contiguously ++ from start address. */ ++ ++ info.fw_base = fw_data[1]; ++ info.fw_len = tp->fw->size - 12; ++ info.fw_data = &fw_data[3]; ++ + if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) { +- info.text_base = TG3_TSO5_FW_TEXT_ADDR; +- info.text_len = TG3_TSO5_FW_TEXT_LEN; +- info.text_data = &tg3Tso5FwText[0]; +- info.rodata_base = TG3_TSO5_FW_RODATA_ADDR; +- info.rodata_len = TG3_TSO5_FW_RODATA_LEN; +- info.rodata_data = &tg3Tso5FwRodata[0]; +- info.data_base = TG3_TSO5_FW_DATA_ADDR; +- info.data_len = TG3_TSO5_FW_DATA_LEN; +- info.data_data = &tg3Tso5FwData[0]; + cpu_base = RX_CPU_BASE; + cpu_scratch_base = NIC_SRAM_MBUF_POOL_BASE5705; +- cpu_scratch_size = (info.text_len + +- info.rodata_len + +- info.data_len + ++ cpu_scratch_size = (info.fw_len + + TG3_TSO5_FW_SBSS_LEN + + TG3_TSO5_FW_BSS_LEN); + } else { +- info.text_base = TG3_TSO_FW_TEXT_ADDR; +- info.text_len = TG3_TSO_FW_TEXT_LEN; +- info.text_data = &tg3TsoFwText[0]; +- info.rodata_base = TG3_TSO_FW_RODATA_ADDR; +- info.rodata_len = TG3_TSO_FW_RODATA_LEN; +- info.rodata_data = &tg3TsoFwRodata[0]; +- info.data_base = TG3_TSO_FW_DATA_ADDR; +- info.data_len = TG3_TSO_FW_DATA_LEN; +- info.data_data = &tg3TsoFwData[0]; + cpu_base = TX_CPU_BASE; + cpu_scratch_base = TX_CPU_SCRATCH_BASE; + cpu_scratch_size = TX_CPU_SCRATCH_SIZE; +@@ -6892,21 +6984,21 @@ + + /* Now startup the cpu. */ + tw32(cpu_base + CPU_STATE, 0xffffffff); +- tw32_f(cpu_base + CPU_PC, info.text_base); ++ tw32_f(cpu_base + CPU_PC, info.fw_base); + + for (i = 0; i < 5; i++) { +- if (tr32(cpu_base + CPU_PC) == info.text_base) ++ if (tr32(cpu_base + CPU_PC) == info.fw_base) + break; + tw32(cpu_base + CPU_STATE, 0xffffffff); + tw32(cpu_base + CPU_MODE, CPU_MODE_HALT); +- tw32_f(cpu_base + CPU_PC, info.text_base); ++ tw32_f(cpu_base + CPU_PC, info.fw_base); + udelay(1000); + } + if (i >= 5) { + printk(KERN_ERR PFX "tg3_load_tso_firmware fails for %s " + "to set CPU PC, is %08x should be %08x\n", + tp->dev->name, tr32(cpu_base + CPU_PC), +- info.text_base); ++ info.fw_base); + return -ENODEV; + } + tw32(cpu_base + CPU_STATE, 0xffffffff); +@@ -6914,43 +7006,7 @@ + return 0; + } + +- +-/* tp->lock is held. */ +-static void __tg3_set_mac_addr(struct tg3 *tp, int skip_mac_1) +-{ +- u32 addr_high, addr_low; +- int i; +- +- addr_high = ((tp->dev->dev_addr[0] << 8) | +- tp->dev->dev_addr[1]); +- addr_low = ((tp->dev->dev_addr[2] << 24) | +- (tp->dev->dev_addr[3] << 16) | +- (tp->dev->dev_addr[4] << 8) | +- (tp->dev->dev_addr[5] << 0)); +- for (i = 0; i < 4; i++) { +- if (i == 1 && skip_mac_1) +- continue; +- tw32(MAC_ADDR_0_HIGH + (i * 8), addr_high); +- tw32(MAC_ADDR_0_LOW + (i * 8), addr_low); +- } +- +- if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703 || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) { +- for (i = 0; i < 12; i++) { +- tw32(MAC_EXTADDR_0_HIGH + (i * 8), addr_high); +- tw32(MAC_EXTADDR_0_LOW + (i * 8), addr_low); +- } +- } +- +- addr_high = (tp->dev->dev_addr[0] + +- tp->dev->dev_addr[1] + +- tp->dev->dev_addr[2] + +- tp->dev->dev_addr[3] + +- tp->dev->dev_addr[4] + +- tp->dev->dev_addr[5]) & +- TX_BACKOFF_SEED_MASK; +- tw32(MAC_TX_BACKOFF_SEED, addr_high); +-} ++#endif /* TG3_TSO_SUPPORT != 0 */ + + static int tg3_set_mac_addr(struct net_device *dev, void *p) + { +@@ -7056,8 +7112,7 @@ + + tg3_write_sig_legacy(tp, RESET_KIND_INIT); + +- if (tp->pci_chip_rev_id == CHIPREV_ID_5784_A0 || +- tp->pci_chip_rev_id == CHIPREV_ID_5784_A1) { ++ if (GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5784_AX) { + val = tr32(TG3_CPMU_CTRL); + val &= ~(CPMU_CTRL_LINK_AWARE_MODE | CPMU_CTRL_LINK_IDLE_MODE); + tw32(TG3_CPMU_CTRL, val); +@@ -7076,6 +7131,22 @@ + val &= ~CPMU_HST_ACC_MACCLK_MASK; + val |= CPMU_HST_ACC_MACCLK_6_25; + tw32(TG3_CPMU_HST_ACC, val); ++ } ++ ++ if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57780) { ++ val = tr32(PCIE_PWR_MGMT_THRESH) & ~PCIE_PWR_MGMT_L1_THRESH_MSK; ++ val |= PCIE_PWR_MGMT_EXT_ASPM_TMR_EN | ++ PCIE_PWR_MGMT_L1_THRESH_4MS; ++ tw32(PCIE_PWR_MGMT_THRESH, val); ++ } ++ ++ if (tp->tg3_flags3 & TG3_FLG3_TOGGLE_10_100_L1PLLPD) { ++ val = tr32(PCIE_LINK_CTRL); ++ if (tp->tg3_flags3 & TG3_FLG3_CLKREQ_BUG) ++ val |= PCIE_LINK_CTRL_L1_PLL_PD_DIS; ++ else ++ val &= ~PCIE_LINK_CTRL_L1_PLL_PD_DIS; ++ tw32(PCIE_LINK_CTRL, val); + } + + /* This works around an issue with Athlon chipsets on +@@ -7123,9 +7194,7 @@ + return err; + + if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5784 && +- GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_57780 && +- GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5761 && +- GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5785) { ++ GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5761) { + /* This value is determined during the probe time DMA + * engine test, tg3_test_dma. + */ +@@ -7168,6 +7237,7 @@ + tw32(BUFMGR_DMA_DESC_POOL_ADDR, NIC_SRAM_DMA_DESC_POOL_BASE); + tw32(BUFMGR_DMA_DESC_POOL_SIZE, NIC_SRAM_DMA_DESC_POOL_SIZE); + } ++#if TG3_TSO_SUPPORT != 0 + else if (tp->tg3_flags2 & TG3_FLG2_TSO_CAPABLE) { + int fw_len; + +@@ -7182,6 +7252,7 @@ + tw32(BUFMGR_MB_POOL_SIZE, + NIC_SRAM_MBUF_POOL_SIZE5705 - fw_len - 0xa00); + } ++#endif + + if (tp->dev->mtu <= ETH_DATA_LEN) { + tw32(BUFMGR_MB_RDMA_LOW_WATER, +@@ -7255,19 +7326,16 @@ + tw32(RCVDBDI_STD_BD + TG3_BDINFO_NIC_ADDR, + NIC_SRAM_RX_BUFFER_DESC); + +- /* Don't even try to program the JUMBO/MINI buffer descriptor +- * configs on 5705. +- */ +- if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS) { +- tw32(RCVDBDI_STD_BD + TG3_BDINFO_MAXLEN_FLAGS, +- RX_STD_MAX_SIZE_5705 << BDINFO_FLAGS_MAXLEN_SHIFT); +- } else { +- tw32(RCVDBDI_STD_BD + TG3_BDINFO_MAXLEN_FLAGS, +- RX_STD_MAX_SIZE << BDINFO_FLAGS_MAXLEN_SHIFT); +- ++ /* Disable the mini ring */ ++ if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) + tw32(RCVDBDI_MINI_BD + TG3_BDINFO_MAXLEN_FLAGS, + BDINFO_FLAGS_DISABLED); + ++ /* Program the jumbo buffer descriptor ring control ++ * blocks on those devices that have them. ++ */ ++ if ((tp->tg3_flags & TG3_FLAG_JUMBO_CAPABLE) && ++ !(tp->tg3_flags2 & TG3_FLG2_5780_CLASS)) { + /* Setup replenish threshold. */ + tw32(RCVBDI_JUMBO_THRESH, tp->rx_jumbo_pending / 8); + +@@ -7285,7 +7353,11 @@ + BDINFO_FLAGS_DISABLED); + } + +- } ++ val = RX_STD_MAX_SIZE << BDINFO_FLAGS_MAXLEN_SHIFT; ++ } else ++ val = RX_STD_MAX_SIZE_5705 << BDINFO_FLAGS_MAXLEN_SHIFT; ++ ++ tw32(RCVDBDI_STD_BD + TG3_BDINFO_MAXLEN_FLAGS, val); + + /* There is only one send ring on 5705/5750, no need to explicitly + * disable the others. +@@ -7308,17 +7380,6 @@ + BDINFO_FLAGS_MAXLEN_SHIFT), + NIC_SRAM_TX_BUFFER_DESC); + +- /* There is only one receive return ring on 5705/5750, no need +- * to explicitly disable the others. +- */ +- if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) { +- for (i = NIC_SRAM_RCV_RET_RCB; i < NIC_SRAM_STATS_BLK; +- i += TG3_BDINFO_SIZE) { +- tg3_write_mem(tp, i + TG3_BDINFO_MAXLEN_FLAGS, +- BDINFO_FLAGS_DISABLED); +- } +- } +- + tp->rx_rcb_ptr = 0; + tw32_rx_mbox(MAILBOX_RCVRET_CON_IDX_0 + TG3_64BIT_REG_LOW, 0); + +@@ -7328,6 +7389,19 @@ + BDINFO_FLAGS_MAXLEN_SHIFT), + 0); + ++ /* Disable all remaining receive return rings. */ ++ if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) ++ limit = 16; ++ else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755) ++ limit = 4; ++ else ++ limit = 1; ++ ++ for (i = 1; i < limit; i++) { ++ tg3_set_bdinfo(tp, NIC_SRAM_RCV_RET_RCB + i * TG3_BDINFO_SIZE, ++ 0, BDINFO_FLAGS_DISABLED, 0); ++ } ++ + tp->rx_std_ptr = tp->rx_pending; + tw32_rx_mbox(MAILBOX_RCV_STD_PROD_IDX + TG3_64BIT_REG_LOW, + tp->rx_std_ptr); +@@ -7341,7 +7415,8 @@ + __tg3_set_mac_addr(tp, 0); + + /* MTU + ethernet header + FCS + optional VLAN tag */ +- tw32(MAC_RX_MTU_SIZE, tp->dev->mtu + ETH_HLEN + 8); ++ tw32(MAC_RX_MTU_SIZE, ++ tp->dev->mtu + ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN); + + /* The slot time is changed by tg3_setup_phy if we + * run at gigabit with half duplex. +@@ -7365,8 +7440,8 @@ + RDMAC_MODE_LNGREAD_ENAB); + + if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57780 || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5785) ++ GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5785 || ++ GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57780) + rdmac_mode |= RDMAC_MODE_BD_SBD_CRPT_ENAB | + RDMAC_MODE_MBUF_RBD_CRPT_ENAB | + RDMAC_MODE_MBUF_SBD_CRPT_ENAB; +@@ -7387,8 +7462,14 @@ + if (tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS) + rdmac_mode |= RDMAC_MODE_FIFO_LONG_BURST; + ++#if TG3_TSO_SUPPORT != 0 + if (tp->tg3_flags2 & TG3_FLG2_HW_TSO) +- rdmac_mode |= (1 << 27); ++ rdmac_mode |= RDMAC_MODE_IPV4_LSO_EN; ++ ++ if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5785 || ++ GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57780) ++ rdmac_mode |= RDMAC_MODE_IPV6_LSO_EN; ++#endif + + /* Receive/send statistics. */ + if (tp->tg3_flags2 & TG3_FLG2_5750_PLUS) { +@@ -7445,13 +7526,17 @@ + if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) + tw32(RCVLSC_MODE, RCVLSC_MODE_ENABLE | RCVLSC_MODE_ATTN_ENABLE); + +- /* Clear statistics/status block in chip, and status block in ram. */ +- for (i = NIC_SRAM_STATS_BLK; +- i < NIC_SRAM_STATUS_BLK + TG3_HW_STATUS_SIZE; +- i += sizeof(u32)) { +- tg3_write_mem(tp, i, 0); +- udelay(40); +- } ++ if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) { ++ /* Clear statistics/status block in chip. */ ++ for (i = NIC_SRAM_STATS_BLK; ++ i < NIC_SRAM_STATUS_BLK + TG3_HW_STATUS_SIZE; ++ i += sizeof(u32)) { ++ tg3_write_mem(tp, i, 0); ++ udelay(40); ++ } ++ } ++ ++ /* Clear status block in ram. */ + memset(tp->hw_status, 0, TG3_HW_STATUS_SIZE); + + if (tp->tg3_flags2 & TG3_FLG2_MII_SERDES) { +@@ -7506,7 +7591,6 @@ + udelay(100); + + tw32_mailbox_f(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, 0); +- tp->last_tag = 0; + + if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) { + tw32_f(DMAC_MODE, DMAC_MODE_ENABLE); +@@ -7535,12 +7619,7 @@ + } + + /* Enable host coalescing bug fix */ +- if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755) || +- (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787) || +- (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784) || +- (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57780) || +- (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5761) || +- (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5785)) ++ if (tp->tg3_flags3 & TG3_FLG3_5755_PLUS) + val |= WDMAC_MODE_STATUS_TAG_FIX; + + tw32_f(WDMAC_MODE, val); +@@ -7579,8 +7658,10 @@ + tw32(RCVBDI_MODE, RCVBDI_MODE_ENABLE | RCVBDI_MODE_RCB_ATTN_ENAB); + tw32(RCVDBDI_MODE, RCVDBDI_MODE_ENABLE | RCVDBDI_MODE_INV_RING_SZ); + tw32(SNDDATAI_MODE, SNDDATAI_MODE_ENABLE); ++#if TG3_TSO_SUPPORT != 0 + if (tp->tg3_flags2 & TG3_FLG2_HW_TSO) + tw32(SNDDATAI_MODE, SNDDATAI_MODE_ENABLE | 0x8); ++#endif + tw32(SNDBDI_MODE, SNDBDI_MODE_ENABLE | SNDBDI_MODE_ATTN_ENABLE); + tw32(SNDBDS_MODE, SNDBDS_MODE_ENABLE | SNDBDS_MODE_ATTN_ENABLE); + +@@ -7590,28 +7671,27 @@ + return err; + } + ++#if TG3_TSO_SUPPORT != 0 + if (tp->tg3_flags2 & TG3_FLG2_TSO_CAPABLE) { + err = tg3_load_tso_firmware(tp); + if (err) + return err; + } ++#endif + + tp->tx_mode = TX_MODE_ENABLE; + tw32_f(MAC_TX_MODE, tp->tx_mode); + udelay(100); + + tp->rx_mode = RX_MODE_ENABLE; +- if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57780 || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5761 || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5785) ++ if (tp->tg3_flags3 & TG3_FLG3_5755_PLUS) + tp->rx_mode |= RX_MODE_IPV6_CSUM_ENABLE; + + tw32_f(MAC_RX_MODE, tp->rx_mode); + udelay(10); + +- tw32(MAC_LED_CTRL, tp->led_ctrl); ++ if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5785) ++ tw32(MAC_LED_CTRL, tp->led_ctrl); + + tw32(MAC_MI_STAT, MAC_MI_STAT_LNKSTAT_ATTN_ENAB); + if (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES) { +@@ -7670,7 +7750,7 @@ + return err; + + if (!(tp->tg3_flags2 & TG3_FLG2_PHY_SERDES) && +- GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5906) { ++ !(tp->tg3_flags3 & TG3_FLG3_PHY_IS_FET)) { + u32 tmp; + + /* Clear CRC stats. */ +@@ -7925,7 +8005,11 @@ + + static int tg3_request_irq(struct tg3 *tp) + { ++#ifdef BCM_HAS_NEW_IRQ_SIG + irq_handler_t fn; ++#else ++ irqreturn_t (*fn)(int, void *, struct pt_regs *); ++#endif + unsigned long flags; + struct net_device *dev = tp->dev; + +@@ -7997,6 +8081,7 @@ + return -EIO; + } + ++#ifdef CONFIG_PCI_MSI + /* Returns 0 if MSI test succeeds or MSI test fails and INTx mode is + * successfully restored + */ +@@ -8034,6 +8119,7 @@ + tp->dev->name); + + free_irq(tp->pdev->irq, dev); ++ + pci_disable_msi(tp->pdev); + + tp->tg3_flags2 &= ~TG3_FLG2_USING_MSI; +@@ -8057,11 +8143,101 @@ + + return err; + } ++#endif /* CONFIG_PCI_MSI */ ++ ++static int tg3_request_firmware(struct tg3 *tp) ++{ ++ const u32 *fw_data; ++ ++ if (tg3_priv_request_firmware(&tp->fw, tp->fw_needed, &tp->pdev->dev)) { ++ printk(KERN_ERR "%s: Failed to load firmware \"%s\"\n", ++ tp->dev->name, tp->fw_needed); ++ return -ENOENT; ++ } ++ ++ fw_data = (void *)tp->fw->data; ++ ++ /* Firmware blob starts with version numbers, followed by ++ * start address and _full_ length including BSS sections ++ * (which must be longer than the actual data, of course ++ */ ++ ++ tp->fw_len = fw_data[2]; /* includes bss */ ++ if (tp->fw_len < (tp->fw->size - 12)) { ++ printk(KERN_ERR "%s: bogus length %d in \"%s\"\n", ++ tp->dev->name, tp->fw_len, tp->fw_needed); ++ tg3_priv_release_firmware(tp->fw); ++ tp->fw = NULL; ++ return -EINVAL; ++ } ++ ++ /* We no longer need firmware; we have it. */ ++ tp->fw_needed = NULL; ++ return 0; ++} ++ ++static void tg3_irq_init(struct tg3 *tp) ++{ ++#ifdef CONFIG_PCI_MSI ++ if ((tp->tg3_flags & TG3_FLAG_SUPPORT_MSI) && ++ !(tp->tg3_flags & TG3_FLAG_TAGGED_STATUS)) { ++ /* ++ * All MSI supporting chips should support tagged ++ * status. Assert that this is the case. ++ */ ++ printk(KERN_WARNING PFX "%s: MSI without TAGGED? " ++ "Not using MSI.\n", tp->dev->name); ++ return; ++ } ++ ++ if ((tp->tg3_flags & TG3_FLAG_SUPPORT_MSI) && ++ pci_enable_msi(tp->pdev) == 0) { ++ ++#ifndef BCM_HAS_INTX_MSI_WORKAROUND ++ /* Hardware bug - MSI won't work if INTX disabled. */ ++ if (tp->tg3_flags2 & TG3_FLG2_5780_CLASS) ++ tg3_enable_intx(tp->pdev); ++#endif ++ ++ tp->tg3_flags2 |= TG3_FLG2_USING_MSI; ++ } ++ ++ if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) { ++ u32 msi_mode = tr32(MSGINT_MODE); ++ tw32(MSGINT_MODE, msi_mode | MSGINT_MODE_ENABLE); ++ } ++#endif ++} ++ ++static void tg3_irq_fini(struct tg3 *tp) ++{ ++#ifdef CONFIG_PCI_MSI ++ if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) ++ pci_disable_msi(tp->pdev); ++#endif ++ tp->tg3_flags2 &= ~TG3_FLG2_USING_MSI; ++} + + static int tg3_open(struct net_device *dev) + { + struct tg3 *tp = netdev_priv(dev); + int err; ++ ++ if (tp->fw_needed) { ++ err = tg3_request_firmware(tp); ++ if (tp->pci_chip_rev_id == CHIPREV_ID_5701_A0) { ++ if (err) ++ return err; ++ } else if (err) { ++ printk(KERN_WARNING "%s: TSO capability disabled.\n", ++ tp->dev->name); ++ tp->tg3_flags2 &= ~TG3_FLG2_TSO_CAPABLE; ++ } else if (!(tp->tg3_flags2 & TG3_FLG2_TSO_CAPABLE)) { ++ printk(KERN_NOTICE "%s: TSO capability restored.\n", ++ tp->dev->name); ++ tp->tg3_flags2 |= TG3_FLG2_TSO_CAPABLE; ++ } ++ } + + netif_carrier_off(tp->dev); + +@@ -8083,33 +8259,19 @@ + if (err) + return err; + +- if (tp->tg3_flags & TG3_FLAG_SUPPORT_MSI) { +- /* All MSI supporting chips should support tagged +- * status. Assert that this is the case. +- */ +- if (!(tp->tg3_flags & TG3_FLAG_TAGGED_STATUS)) { +- printk(KERN_WARNING PFX "%s: MSI without TAGGED? " +- "Not using MSI.\n", tp->dev->name); +- } else if (pci_enable_msi(tp->pdev) == 0) { +- u32 msi_mode; +- +- msi_mode = tr32(MSGINT_MODE); +- tw32(MSGINT_MODE, msi_mode | MSGINT_MODE_ENABLE); +- tp->tg3_flags2 |= TG3_FLG2_USING_MSI; +- } +- } ++ tg3_irq_init(tp); ++ + err = tg3_request_irq(tp); + + if (err) { +- if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) { +- pci_disable_msi(tp->pdev); +- tp->tg3_flags2 &= ~TG3_FLG2_USING_MSI; +- } ++ tg3_irq_fini(tp); + tg3_free_consistent(tp); + return err; + } + ++#ifdef TG3_NAPI + napi_enable(&tp->napi); ++#endif + + tg3_full_lock(tp, 0); + +@@ -8138,33 +8300,31 @@ + tg3_full_unlock(tp); + + if (err) { ++#ifdef TG3_NAPI + napi_disable(&tp->napi); ++#endif + free_irq(tp->pdev->irq, dev); +- if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) { +- pci_disable_msi(tp->pdev); +- tp->tg3_flags2 &= ~TG3_FLG2_USING_MSI; +- } ++ tg3_irq_fini(tp); + tg3_free_consistent(tp); + return err; + } + ++#ifdef CONFIG_PCI_MSI + if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) { + err = tg3_test_msi(tp); + + if (err) { + tg3_full_lock(tp, 0); +- +- if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) { +- pci_disable_msi(tp->pdev); +- tp->tg3_flags2 &= ~TG3_FLG2_USING_MSI; +- } ++ tg3_irq_fini(tp); + tg3_halt(tp, RESET_KIND_SHUTDOWN, 1); + tg3_free_rings(tp); + tg3_free_consistent(tp); + + tg3_full_unlock(tp); + ++#ifdef TG3_NAPI + napi_disable(&tp->napi); ++#endif + + return err; + } +@@ -8178,6 +8338,7 @@ + } + } + } ++#endif /* CONFIG_PCI_MSI */ + + tg3_phy_start(tp); + +@@ -8429,8 +8590,16 @@ + { + struct tg3 *tp = netdev_priv(dev); + ++#ifdef TG3_NAPI + napi_disable(&tp->napi); ++#endif ++ ++#if (LINUX_VERSION_CODE >= 0x20616) + cancel_work_sync(&tp->reset_task); ++#else ++ set_current_state(TASK_UNINTERRUPTIBLE); ++ schedule_timeout(1); ++#endif + + netif_stop_queue(dev); + +@@ -8450,10 +8619,7 @@ + tg3_full_unlock(tp); + + free_irq(tp->pdev->irq, dev); +- if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) { +- pci_disable_msi(tp->pdev); +- tp->tg3_flags2 &= ~TG3_FLG2_USING_MSI; +- } ++ tg3_irq_fini(tp); + + memcpy(&tp->net_stats_prev, tg3_get_stats(tp->dev), + sizeof(tp->net_stats_prev)); +@@ -8854,24 +9020,26 @@ + tg3_full_unlock(tp); + } + ++#if (LINUX_VERSION_CODE >= 0x20418) + static int tg3_get_eeprom_len(struct net_device *dev) + { + struct tg3 *tp = netdev_priv(dev); + + return tp->nvram_size; + } +- +-static int tg3_nvram_read(struct tg3 *tp, u32 offset, u32 *val); +-static int tg3_nvram_read_le(struct tg3 *tp, u32 offset, __le32 *val); +-static int tg3_nvram_read_swab(struct tg3 *tp, u32 offset, u32 *val); +- ++#endif ++ ++#ifdef ETHTOOL_GEEPROM + static int tg3_get_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom, u8 *data) + { + struct tg3 *tp = netdev_priv(dev); + int ret; + u8 *pd; + u32 i, offset, len, b_offset, b_count; +- __le32 val; ++ __be32 val; ++ ++ if (tp->tg3_flags3 & TG3_FLG3_NO_NVRAM) ++ return -EINVAL; + + if (tp->link_config.phy_is_low_power) + return -EAGAIN; +@@ -8890,7 +9058,7 @@ + /* i.e. offset=1 len=2 */ + b_count = len; + } +- ret = tg3_nvram_read_le(tp, offset-b_offset, &val); ++ ret = tg3_nvram_read_be32(tp, offset-b_offset, &val); + if (ret) + return ret; + memcpy(data, ((char*)&val) + b_offset, b_count); +@@ -8902,7 +9070,7 @@ + /* read bytes upto the last 4 byte boundary */ + pd = &data[eeprom->len]; + for (i = 0; i < (len - (len & 3)); i += 4) { +- ret = tg3_nvram_read_le(tp, offset + i, &val); ++ ret = tg3_nvram_read_be32(tp, offset + i, &val); + if (ret) { + eeprom->len += i; + return ret; +@@ -8916,7 +9084,7 @@ + pd = &data[eeprom->len]; + b_count = len & 3; + b_offset = offset + len - b_count; +- ret = tg3_nvram_read_le(tp, b_offset, &val); ++ ret = tg3_nvram_read_be32(tp, b_offset, &val); + if (ret) + return ret; + memcpy(pd, &val, b_count); +@@ -8924,21 +9092,24 @@ + } + return 0; + } ++#endif + + static int tg3_nvram_write_block(struct tg3 *tp, u32 offset, u32 len, u8 *buf); + ++#ifdef ETHTOOL_SEEPROM + static int tg3_set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom, u8 *data) + { + struct tg3 *tp = netdev_priv(dev); + int ret; + u32 offset, len, b_offset, odd_len; + u8 *buf; +- __le32 start, end; ++ __be32 start, end; + + if (tp->link_config.phy_is_low_power) + return -EAGAIN; + +- if (eeprom->magic != TG3_EEPROM_MAGIC) ++ if ((tp->tg3_flags3 & TG3_FLG3_NO_NVRAM) || ++ eeprom->magic != TG3_EEPROM_MAGIC) + return -EINVAL; + + offset = eeprom->offset; +@@ -8946,7 +9117,7 @@ + + if ((b_offset = (offset & 3))) { + /* adjustments to start on required 4 byte boundary */ +- ret = tg3_nvram_read_le(tp, offset-b_offset, &start); ++ ret = tg3_nvram_read_be32(tp, offset-b_offset, &start); + if (ret) + return ret; + len += b_offset; +@@ -8960,7 +9131,7 @@ + /* adjustments to end on required 4 byte boundary */ + odd_len = 1; + len = (len + 3) & ~3; +- ret = tg3_nvram_read_le(tp, offset+len-4, &end); ++ ret = tg3_nvram_read_be32(tp, offset+len-4, &end); + if (ret) + return ret; + } +@@ -8984,16 +9155,19 @@ + + return ret; + } ++#endif + + static int tg3_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) + { + struct tg3 *tp = netdev_priv(dev); + ++#ifdef BCM_INCLUDE_PHYLIB_SUPPORT + if (tp->tg3_flags3 & TG3_FLG3_USE_PHYLIB) { + if (!(tp->tg3_flags3 & TG3_FLG3_PHY_CONNECTED)) + return -EAGAIN; +- return phy_ethtool_gset(tp->mdio_bus.phy_map[PHY_ADDR], cmd); +- } ++ return phy_ethtool_gset(tp->mdio_bus->phy_map[PHY_ADDR], cmd); ++ } ++#endif /* BCM_INCLUDE_PHYLIB_SUPPORT */ + + cmd->supported = (SUPPORTED_Autoneg); + +@@ -9019,7 +9193,7 @@ + cmd->duplex = tp->link_config.active_duplex; + } + cmd->phy_address = PHY_ADDR; +- cmd->transceiver = 0; ++ cmd->transceiver = XCVR_INTERNAL; + cmd->autoneg = tp->link_config.autoneg; + cmd->maxtxpkt = 0; + cmd->maxrxpkt = 0; +@@ -9030,31 +9204,65 @@ + { + struct tg3 *tp = netdev_priv(dev); + ++#ifdef BCM_INCLUDE_PHYLIB_SUPPORT + if (tp->tg3_flags3 & TG3_FLG3_USE_PHYLIB) { + if (!(tp->tg3_flags3 & TG3_FLG3_PHY_CONNECTED)) + return -EAGAIN; +- return phy_ethtool_sset(tp->mdio_bus.phy_map[PHY_ADDR], cmd); +- } +- +- if (tp->tg3_flags2 & TG3_FLG2_ANY_SERDES) { +- /* These are the only valid advertisement bits allowed. */ +- if (cmd->autoneg == AUTONEG_ENABLE && +- (cmd->advertising & ~(ADVERTISED_1000baseT_Half | +- ADVERTISED_1000baseT_Full | +- ADVERTISED_Autoneg | +- ADVERTISED_FIBRE))) ++ return phy_ethtool_sset(tp->mdio_bus->phy_map[PHY_ADDR], cmd); ++ } ++#endif /* BCM_INCLUDE_PHYLIB_SUPPORT */ ++ ++ if (cmd->autoneg != AUTONEG_ENABLE && ++ cmd->autoneg != AUTONEG_DISABLE) ++ return -EINVAL; ++ ++ if (cmd->autoneg == AUTONEG_DISABLE && ++ cmd->duplex != DUPLEX_FULL && ++ cmd->duplex != DUPLEX_HALF) ++ return -EINVAL; ++ ++ if (cmd->autoneg == AUTONEG_ENABLE) { ++ u32 mask = ADVERTISED_Autoneg | ++ ADVERTISED_Pause | ++ ADVERTISED_Asym_Pause; ++ ++ if (!(tp->tg3_flags2 & TG3_FLAG_10_100_ONLY)) ++ mask |= ADVERTISED_1000baseT_Half | ++ ADVERTISED_1000baseT_Full; ++ ++ if (!(tp->tg3_flags2 & TG3_FLG2_ANY_SERDES)) ++ mask |= ADVERTISED_100baseT_Half | ++ ADVERTISED_100baseT_Full | ++ ADVERTISED_10baseT_Half | ++ ADVERTISED_10baseT_Full | ++ ADVERTISED_TP; ++ else ++ mask |= ADVERTISED_FIBRE; ++ ++ if (cmd->advertising & ~mask) + return -EINVAL; +- /* Fiber can only do SPEED_1000. */ +- else if ((cmd->autoneg != AUTONEG_ENABLE) && +- (cmd->speed != SPEED_1000)) +- return -EINVAL; +- /* Copper cannot force SPEED_1000. */ +- } else if ((cmd->autoneg != AUTONEG_ENABLE) && +- (cmd->speed == SPEED_1000)) +- return -EINVAL; +- else if ((cmd->speed == SPEED_1000) && +- (tp->tg3_flags & TG3_FLAG_10_100_ONLY)) +- return -EINVAL; ++ ++ mask &= (ADVERTISED_1000baseT_Half | ++ ADVERTISED_1000baseT_Full | ++ ADVERTISED_100baseT_Half | ++ ADVERTISED_100baseT_Full | ++ ADVERTISED_10baseT_Half | ++ ADVERTISED_10baseT_Full); ++ ++ cmd->advertising &= mask; ++ } else { ++ if (tp->tg3_flags2 & TG3_FLG2_ANY_SERDES) { ++ if (cmd->speed != SPEED_1000) ++ return -EINVAL; ++ ++ if (cmd->duplex != DUPLEX_FULL) ++ return -EINVAL; ++ } else { ++ if (cmd->speed != SPEED_100 && ++ cmd->speed != SPEED_10) ++ return -EINVAL; ++ } ++ } + + tg3_full_lock(tp, 0); + +@@ -9102,7 +9310,8 @@ + else + wol->supported = 0; + wol->wolopts = 0; +- if (tp->tg3_flags & TG3_FLAG_WOL_ENABLE) ++ if ((tp->tg3_flags & TG3_FLAG_WOL_ENABLE) && ++ device_can_wakeup(&tp->pdev->dev)) + wol->wolopts = WAKE_MAGIC; + memset(&wol->sopass, 0, sizeof(wol->sopass)); + } +@@ -9110,7 +9319,9 @@ + static int tg3_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol) + { + struct tg3 *tp = netdev_priv(dev); ++#ifdef BCM_HAS_DEVICE_WAKEUP_API + struct device *dp = &tp->pdev->dev; ++#endif + + if (wol->wolopts & ~WAKE_MAGIC) + return -EINVAL; +@@ -9143,6 +9354,7 @@ + tp->msg_enable = value; + } + ++#if TG3_TSO_SUPPORT != 0 + static int tg3_set_tso(struct net_device *dev, u32 value) + { + struct tg3 *tp = netdev_priv(dev); +@@ -9152,21 +9364,22 @@ + return -EINVAL; + return 0; + } +- if ((tp->tg3_flags2 & TG3_FLG2_HW_TSO_2) && +- (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5906)) { ++ if ((dev->features & NETIF_F_IPV6_CSUM) && ++ (tp->tg3_flags2 & TG3_FLG2_HW_TSO_2)) { + if (value) { + dev->features |= NETIF_F_TSO6; + if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5761 || + (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 && + GET_CHIP_REV(tp->pci_chip_rev_id) != CHIPREV_5784_AX) || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57780 || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5785) ++ GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5785 || ++ GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57780) + dev->features |= NETIF_F_TSO_ECN; + } else + dev->features &= ~(NETIF_F_TSO6 | NETIF_F_TSO_ECN); + } + return ethtool_op_set_tso(dev, value); + } ++#endif + + static int tg3_nway_reset(struct net_device *dev) + { +@@ -9179,11 +9392,14 @@ + if (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES) + return -EINVAL; + ++#ifdef BCM_INCLUDE_PHYLIB_SUPPORT + if (tp->tg3_flags3 & TG3_FLG3_USE_PHYLIB) { + if (!(tp->tg3_flags3 & TG3_FLG3_PHY_CONNECTED)) + return -EAGAIN; +- r = phy_start_aneg(tp->mdio_bus.phy_map[PHY_ADDR]); +- } else { ++ r = phy_start_aneg(tp->mdio_bus->phy_map[PHY_ADDR]); ++ } else ++#endif /* BCM_INCLUDE_PHYLIB_SUPPORT */ ++ { + u32 bmcr; + + spin_lock_bh(&tp->lock); +@@ -9275,12 +9491,12 @@ + + epause->autoneg = (tp->tg3_flags & TG3_FLAG_PAUSE_AUTONEG) != 0; + +- if (tp->link_config.active_flowctrl & TG3_FLOW_CTRL_RX) ++ if (tp->link_config.active_flowctrl & FLOW_CTRL_RX) + epause->rx_pause = 1; + else + epause->rx_pause = 0; + +- if (tp->link_config.active_flowctrl & TG3_FLOW_CTRL_TX) ++ if (tp->link_config.active_flowctrl & FLOW_CTRL_TX) + epause->tx_pause = 1; + else + epause->tx_pause = 0; +@@ -9291,59 +9507,72 @@ + struct tg3 *tp = netdev_priv(dev); + int err = 0; + ++#ifdef BCM_INCLUDE_PHYLIB_SUPPORT + if (tp->tg3_flags3 & TG3_FLG3_USE_PHYLIB) { +- if (!(tp->tg3_flags3 & TG3_FLG3_PHY_CONNECTED)) +- return -EAGAIN; +- +- if (epause->autoneg) { +- u32 newadv; +- struct phy_device *phydev; +- +- phydev = tp->mdio_bus.phy_map[PHY_ADDR]; +- +- if (epause->rx_pause) { +- if (epause->tx_pause) +- newadv = ADVERTISED_Pause; +- else +- newadv = ADVERTISED_Pause | +- ADVERTISED_Asym_Pause; +- } else if (epause->tx_pause) { +- newadv = ADVERTISED_Asym_Pause; ++ u32 newadv; ++ struct phy_device *phydev; ++ ++ phydev = tp->mdio_bus->phy_map[PHY_ADDR]; ++ ++ if (!(phydev->supported & SUPPORTED_Pause) || ++ (!(phydev->supported & SUPPORTED_Asym_Pause) && ++ ((epause->rx_pause && !epause->tx_pause) || ++ (!epause->rx_pause && epause->tx_pause)))) ++ return -EINVAL; ++ ++ tp->link_config.flowctrl = 0; ++ if (epause->rx_pause) { ++ tp->link_config.flowctrl |= FLOW_CTRL_RX; ++ ++ if (epause->tx_pause) { ++ tp->link_config.flowctrl |= FLOW_CTRL_TX; ++ newadv = ADVERTISED_Pause; + } else +- newadv = 0; +- +- if (tp->tg3_flags3 & TG3_FLG3_PHY_CONNECTED) { +- u32 oldadv = phydev->advertising & +- (ADVERTISED_Pause | +- ADVERTISED_Asym_Pause); +- if (oldadv != newadv) { +- phydev->advertising &= +- ~(ADVERTISED_Pause | +- ADVERTISED_Asym_Pause); +- phydev->advertising |= newadv; +- err = phy_start_aneg(phydev); ++ newadv = ADVERTISED_Pause | ++ ADVERTISED_Asym_Pause; ++ } else if (epause->tx_pause) { ++ tp->link_config.flowctrl |= FLOW_CTRL_TX; ++ newadv = ADVERTISED_Asym_Pause; ++ } else ++ newadv = 0; ++ ++ if (epause->autoneg) ++ tp->tg3_flags |= TG3_FLAG_PAUSE_AUTONEG; ++ else ++ tp->tg3_flags &= ~TG3_FLAG_PAUSE_AUTONEG; ++ ++ if (tp->tg3_flags3 & TG3_FLG3_PHY_CONNECTED) { ++ u32 oldadv = phydev->advertising & ++ (ADVERTISED_Pause | ADVERTISED_Asym_Pause); ++ if (oldadv != newadv) { ++ phydev->advertising &= ++ ~(ADVERTISED_Pause | ++ ADVERTISED_Asym_Pause); ++ phydev->advertising |= newadv; ++ if (phydev->autoneg) { ++ /* ++ * Always renegotiate the link to ++ * inform our link partner of our ++ * flow control settings, even if the ++ * flow control is forced. Let ++ * tg3_adjust_link() do the final ++ * flow control setup. ++ */ ++ return phy_start_aneg(phydev); + } +- } else { +- tp->link_config.advertising &= +- ~(ADVERTISED_Pause | +- ADVERTISED_Asym_Pause); +- tp->link_config.advertising |= newadv; +- } +- } else { +- if (epause->rx_pause) +- tp->link_config.flowctrl |= TG3_FLOW_CTRL_RX; +- else +- tp->link_config.flowctrl &= ~TG3_FLOW_CTRL_RX; +- +- if (epause->tx_pause) +- tp->link_config.flowctrl |= TG3_FLOW_CTRL_TX; +- else +- tp->link_config.flowctrl &= ~TG3_FLOW_CTRL_TX; +- +- if (netif_running(dev)) ++ } ++ ++ if (!epause->autoneg) + tg3_setup_flow_control(tp, 0, 0); +- } +- } else { ++ } else { ++ tp->link_config.orig_advertising &= ++ ~(ADVERTISED_Pause | ++ ADVERTISED_Asym_Pause); ++ tp->link_config.orig_advertising |= newadv; ++ } ++ } else ++#endif /* BCM_INCLUDE_PHYLIB_SUPPORT */ ++ { + int irq_sync = 0; + + if (netif_running(dev)) { +@@ -9358,13 +9587,13 @@ + else + tp->tg3_flags &= ~TG3_FLAG_PAUSE_AUTONEG; + if (epause->rx_pause) +- tp->link_config.flowctrl |= TG3_FLOW_CTRL_RX; +- else +- tp->link_config.flowctrl &= ~TG3_FLOW_CTRL_RX; ++ tp->link_config.flowctrl |= FLOW_CTRL_RX; ++ else ++ tp->link_config.flowctrl &= ~FLOW_CTRL_RX; + if (epause->tx_pause) +- tp->link_config.flowctrl |= TG3_FLOW_CTRL_TX; +- else +- tp->link_config.flowctrl &= ~TG3_FLOW_CTRL_TX; ++ tp->link_config.flowctrl |= FLOW_CTRL_TX; ++ else ++ tp->link_config.flowctrl &= ~FLOW_CTRL_TX; + + if (netif_running(dev)) { + tg3_halt(tp, RESET_KIND_SHUTDOWN, 1); +@@ -9405,6 +9634,7 @@ + return 0; + } + ++#ifdef BCM_HAS_SET_TX_CSUM + static int tg3_set_tx_csum(struct net_device *dev, u32 data) + { + struct tg3 *tp = netdev_priv(dev); +@@ -9415,18 +9645,20 @@ + return 0; + } + +- if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787 || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57780 || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5761 || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5785) ++ if (tp->tg3_flags3 & TG3_FLG3_5755_PLUS) ++#if defined(BCM_HAS_ETHTOOL_OP_SET_TX_IPV6_CSUM) + ethtool_op_set_tx_ipv6_csum(dev, data); ++#elif defined(BCM_HAS_ETHTOOL_OP_SET_TX_HW_CSUM) ++ ethtool_op_set_tx_hw_csum(dev, data); ++#else ++ tg3_set_tx_hw_csum(dev, data); ++#endif + else + ethtool_op_set_tx_csum(dev, data); + + return 0; + } ++#endif + + static int tg3_get_sset_count (struct net_device *dev, int sset) + { +@@ -9440,6 +9672,18 @@ + } + } + ++#if (LINUX_VERSION_CODE < 0x020618) ++static int tg3_get_stats_count (struct net_device *dev) ++{ ++ return tg3_get_sset_count(dev, ETH_SS_STATS); ++} ++ ++static int tg3_get_test_count (struct net_device *dev) ++{ ++ return tg3_get_sset_count(dev, ETH_SS_TEST); ++} ++#endif ++ + static void tg3_get_strings (struct net_device *dev, u32 stringset, u8 *buf) + { + switch (stringset) { +@@ -9459,12 +9703,15 @@ + { + struct tg3 *tp = netdev_priv(dev); + int i; ++ u32 led_ctrl; + + if (!netif_running(tp->dev)) + return -EAGAIN; + + if (data == 0) + data = UINT_MAX / 2; ++ ++ led_ctrl = tr32(MAC_LED_CTRL); + + for (i = 0; i < (data * 2); i++) { + if ((i % 2) == 0) +@@ -9483,7 +9730,7 @@ + if (msleep_interruptible(500)) + break; + } +- tw32(MAC_LED_CTRL, tp->led_ctrl); ++ tw32(MAC_LED_CTRL, led_ctrl); + return 0; + } + +@@ -9504,10 +9751,13 @@ + static int tg3_test_nvram(struct tg3 *tp) + { + u32 csum, magic; +- __le32 *buf; ++ __be32 *buf; + int i, j, k, err = 0, size; + +- if (tg3_nvram_read_swab(tp, 0, &magic) != 0) ++ if (tp->tg3_flags3 & TG3_FLG3_NO_NVRAM) ++ return 0; ++ ++ if (tg3_nvram_read(tp, 0, &magic) != 0) + return -EIO; + + if (magic == TG3_EEPROM_MAGIC) +@@ -9541,14 +9791,15 @@ + + err = -EIO; + for (i = 0, j = 0; i < size; i += 4, j++) { +- if ((err = tg3_nvram_read_le(tp, i, &buf[j])) != 0) ++ err = tg3_nvram_read_be32(tp, i, &buf[j]); ++ if (err) + break; + } + if (i < size) + goto out; + + /* Selfboot format */ +- magic = swab32(le32_to_cpu(buf[0])); ++ magic = be32_to_cpu(buf[0]); + if ((magic & TG3_EEPROM_MAGIC_FW_MSK) == + TG3_EEPROM_MAGIC_FW) { + u8 *buf8 = (u8 *) buf, csum8 = 0; +@@ -9577,7 +9828,7 @@ + if ((magic & TG3_EEPROM_MAGIC_HW_MSK) == + TG3_EEPROM_MAGIC_HW) { + u8 data[NVRAM_SELFBOOT_DATA_SIZE]; +- u8 parity[NVRAM_SELFBOOT_DATA_SIZE]; ++ u8 parity[NVRAM_SELFBOOT_DATA_SIZE]; + u8 *buf8 = (u8 *) buf; + + /* Separate the parity bits and the data bytes. */ +@@ -9620,13 +9871,13 @@ + + /* Bootstrap checksum at offset 0x10 */ + csum = calc_crc((unsigned char *) buf, 0x10); +- if(csum != le32_to_cpu(buf[0x10/4])) ++ if (csum != be32_to_cpu(buf[0x10/4])) + goto out; + + /* Manufacturing block starts at offset 0x74, checksum at 0xfc */ + csum = calc_crc((unsigned char *) &buf[0x74/4], 0x88); +- if (csum != le32_to_cpu(buf[0xfc/4])) +- goto out; ++ if (csum != be32_to_cpu(buf[0xfc/4])) ++ goto out; + + err = 0; + +@@ -9636,7 +9887,7 @@ + } + + #define TG3_SERDES_TIMEOUT_SEC 2 +-#define TG3_COPPER_TIMEOUT_SEC 6 ++#define TG3_COPPER_TIMEOUT_SEC 7 + + static int tg3_test_link(struct tg3 *tp) + { +@@ -9937,19 +10188,13 @@ + int err = 0; + int i; + +- if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS) { +- if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787 || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57780 || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5761 || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5785) +- mem_tbl = mem_tbl_5755; +- else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) +- mem_tbl = mem_tbl_5906; +- else +- mem_tbl = mem_tbl_5705; +- } else ++ if (tp->tg3_flags3 & TG3_FLG3_5755_PLUS) ++ mem_tbl = mem_tbl_5755; ++ else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) ++ mem_tbl = mem_tbl_5906; ++ else if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS) ++ mem_tbl = mem_tbl_5705; ++ else + mem_tbl = mem_tbl_570x; + + for (i = 0; mem_tbl[i].offset != 0xffffffff; i++) { +@@ -9994,18 +10239,8 @@ + } else if (loopback_mode == TG3_PHY_LOOPBACK) { + u32 val; + +- if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) { +- u32 phytest; +- +- if (!tg3_readphy(tp, MII_TG3_EPHY_TEST, &phytest)) { +- u32 phy; +- +- tg3_writephy(tp, MII_TG3_EPHY_TEST, +- phytest | MII_TG3_EPHY_SHADOW_EN); +- if (!tg3_readphy(tp, 0x1b, &phy)) +- tg3_writephy(tp, 0x1b, phy & ~0x20); +- tg3_writephy(tp, MII_TG3_EPHY_TEST, phytest); +- } ++ if (tp->tg3_flags3 & TG3_FLG3_PHY_IS_FET) { ++ tg3_phy_fet_toggle_apd(tp, false); + val = BMCR_LOOPBACK | BMCR_FULLDPLX | BMCR_SPEED100; + } else + val = BMCR_LOOPBACK | BMCR_FULLDPLX | BMCR_SPEED1000; +@@ -10016,8 +10251,9 @@ + udelay(40); + + mac_mode = tp->mac_mode & ~MAC_MODE_PORT_MODE_MASK; +- if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) { +- tg3_writephy(tp, MII_TG3_EPHY_PTEST, 0x1800); ++ if (tp->tg3_flags3 & TG3_FLG3_PHY_IS_FET) { ++ if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) ++ tg3_writephy(tp, MII_TG3_FET_PTEST, 0x1800); + mac_mode |= MAC_MODE_PORT_MODE_MII; + } else + mac_mode |= MAC_MODE_PORT_MODE_GMII; +@@ -10073,6 +10309,9 @@ + tp->tx_prod++; + num_pkts++; + ++ /* Some platforms need to sync memory here */ ++ wmb(); ++ + tw32_tx_mbox(MAILBOX_SNDHOST_PROD_IDX_0 + TG3_64BIT_REG_LOW, + tp->tx_prod); + tr32_mailbox(MAILBOX_SNDHOST_PROD_IDX_0 + TG3_64BIT_REG_LOW); +@@ -10149,10 +10388,11 @@ + if (err) + return TG3_LOOPBACK_FAILED; + +- if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57780 || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5761 || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5785) { ++ /* Turn off gphy autopowerdown. */ ++ if (tp->tg3_flags3 & TG3_FLG3_PHY_ENABLE_APD) ++ tg3_phy_toggle_apd(tp, false); ++ ++ if (tp->tg3_flags & TG3_FLAG_CPMU_PRESENT) { + int i; + u32 status; + +@@ -10179,10 +10419,7 @@ + if (tg3_run_loopback(tp, TG3_MAC_LOOPBACK)) + err |= TG3_MAC_LOOPBACK_FAILED; + +- if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57780 || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5761 || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5785) { ++ if (tp->tg3_flags & TG3_FLAG_CPMU_PRESENT) { + tw32(TG3_CPMU_CTRL, cpmuctrl); + + /* Release the mutex */ +@@ -10194,6 +10431,10 @@ + if (tg3_run_loopback(tp, TG3_PHY_LOOPBACK)) + err |= TG3_PHY_LOOPBACK_FAILED; + } ++ ++ /* Re-enable gphy autopowerdown. */ ++ if (tp->tg3_flags3 & TG3_FLG3_PHY_ENABLE_APD) ++ tg3_phy_toggle_apd(tp, true); + + return err; + } +@@ -10278,15 +10519,21 @@ + + static int tg3_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) + { ++#if (LINUX_VERSION_CODE >= 0x020607) + struct mii_ioctl_data *data = if_mii(ifr); +- struct tg3 *tp = netdev_priv(dev); +- int err; +- ++#else ++ struct mii_ioctl_data *data = (struct mii_ioctl_data *) &ifr->ifr_ifru; ++#endif ++ struct tg3 *tp = netdev_priv(dev); ++ int err; ++ ++#ifdef BCM_INCLUDE_PHYLIB_SUPPORT + if (tp->tg3_flags3 & TG3_FLG3_USE_PHYLIB) { + if (!(tp->tg3_flags3 & TG3_FLG3_PHY_CONNECTED)) + return -EAGAIN; +- return phy_mii_ioctl(tp->mdio_bus.phy_map[PHY_ADDR], data, cmd); +- } ++ return phy_mii_ioctl(tp->mdio_bus->phy_map[PHY_ADDR], data, cmd); ++ } ++#endif /* BCM_INCLUDE_PHYLIB_SUPPORT */ + + switch(cmd) { + case SIOCGMIIPHY: +@@ -10339,20 +10586,38 @@ + { + struct tg3 *tp = netdev_priv(dev); + ++ if (!netif_running(dev)) { ++ tp->vlgrp = grp; ++ return; ++ } ++ ++ tg3_netif_stop(tp); ++ ++ tg3_full_lock(tp, 0); ++ ++ tp->vlgrp = grp; ++ ++ /* Update RX_MODE_KEEP_VLAN_TAG bit in RX_MODE register. */ ++ __tg3_set_rx_mode(dev); ++ ++ tg3_netif_start(tp); ++ ++ tg3_full_unlock(tp); ++} ++ ++static void tg3_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid) ++{ ++ struct tg3 *tp = netdev_priv(dev); ++ + if (netif_running(dev)) + tg3_netif_stop(tp); + + tg3_full_lock(tp, 0); +- +- tp->vlgrp = grp; +- +- /* Update RX_MODE_KEEP_VLAN_TAG bit in RX_MODE register. */ +- __tg3_set_rx_mode(dev); ++ vlan_group_set_device(tp->vlgrp, vid, NULL); ++ tg3_full_unlock(tp); + + if (netif_running(dev)) + tg3_netif_start(tp); +- +- tg3_full_unlock(tp); + } + #endif + +@@ -10418,7 +10683,7 @@ + return 0; + } + +-static const struct ethtool_ops tg3_ethtool_ops = { ++static struct ethtool_ops tg3_ethtool_ops = { + .get_settings = tg3_get_settings, + .set_settings = tg3_set_settings, + .get_drvinfo = tg3_get_drvinfo, +@@ -10430,25 +10695,49 @@ + .set_msglevel = tg3_set_msglevel, + .nway_reset = tg3_nway_reset, + .get_link = ethtool_op_get_link, ++#if (LINUX_VERSION_CODE >= 0x20418) + .get_eeprom_len = tg3_get_eeprom_len, ++#endif ++#ifdef ETHTOOL_GEEPROM + .get_eeprom = tg3_get_eeprom, ++#endif ++#ifdef ETHTOOL_SEEPROM + .set_eeprom = tg3_set_eeprom, ++#endif + .get_ringparam = tg3_get_ringparam, + .set_ringparam = tg3_set_ringparam, + .get_pauseparam = tg3_get_pauseparam, + .set_pauseparam = tg3_set_pauseparam, + .get_rx_csum = tg3_get_rx_csum, + .set_rx_csum = tg3_set_rx_csum, ++ .get_tx_csum = ethtool_op_get_tx_csum, ++#ifdef BCM_HAS_SET_TX_CSUM + .set_tx_csum = tg3_set_tx_csum, ++#endif ++ .get_sg = ethtool_op_get_sg, + .set_sg = ethtool_op_set_sg, ++#if TG3_TSO_SUPPORT != 0 ++ .get_tso = ethtool_op_get_tso, + .set_tso = tg3_set_tso, ++#endif ++#if (LINUX_VERSION_CODE < 0x20618) ++ .self_test_count = tg3_get_test_count, ++#endif + .self_test = tg3_self_test, + .get_strings = tg3_get_strings, + .phys_id = tg3_phys_id, ++#if (LINUX_VERSION_CODE < 0x20618) ++ .get_stats_count = tg3_get_stats_count, ++#endif + .get_ethtool_stats = tg3_get_ethtool_stats, + .get_coalesce = tg3_get_coalesce, + .set_coalesce = tg3_set_coalesce, ++#if (LINUX_VERSION_CODE >= 0x20618) + .get_sset_count = tg3_get_sset_count, ++#endif ++#if defined(ETHTOOL_GPERMADDR) && (LINUX_VERSION_CODE < 0x020617) ++ .get_perm_addr = ethtool_op_get_perm_addr, ++#endif + }; + + static void __devinit tg3_get_eeprom_size(struct tg3 *tp) +@@ -10457,7 +10746,7 @@ + + tp->nvram_size = EEPROM_CHIP_SIZE; + +- if (tg3_nvram_read_swab(tp, 0, &magic) != 0) ++ if (tg3_nvram_read(tp, 0, &magic) != 0) + return; + + if ((magic != TG3_EEPROM_MAGIC) && +@@ -10473,7 +10762,7 @@ + cursize = 0x10; + + while (cursize < tp->nvram_size) { +- if (tg3_nvram_read_swab(tp, cursize, &val) != 0) ++ if (tg3_nvram_read(tp, cursize, &val) != 0) + return; + + if (val == magic) +@@ -10489,7 +10778,8 @@ + { + u32 val; + +- if (tg3_nvram_read_swab(tp, 0, &val) != 0) ++ if ((tp->tg3_flags3 & TG3_FLG3_NO_NVRAM) || ++ tg3_nvram_read(tp, 0, &val) != 0) + return; + + /* Selfboot format */ +@@ -10500,7 +10790,18 @@ + + if (tg3_nvram_read(tp, 0xf0, &val) == 0) { + if (val != 0) { +- tp->nvram_size = (val >> 16) * 1024; ++ /* This is confusing. We want to operate on the ++ * 16-bit value at offset 0xf2. The tg3_nvram_read() ++ * call will read from NVRAM and byteswap the data ++ * according to the byteswapping settings for all ++ * other register accesses. This ensures the data we ++ * want will always reside in the lower 16-bits. ++ * However, the data in NVRAM is in LE format, which ++ * means the data from the NVRAM read will always be ++ * opposite the endianness of the CPU. The 16-bit ++ * byteswap then brings the data to CPU endianness. ++ */ ++ tp->nvram_size = swab16((u16)(val & 0x0000ffff)) * 1024; + return; + } + } +@@ -10514,8 +10815,7 @@ + nvcfg1 = tr32(NVRAM_CFG1); + if (nvcfg1 & NVRAM_CFG1_FLASHIF_ENAB) { + tp->tg3_flags2 |= TG3_FLG2_FLASH; +- } +- else { ++ } else { + nvcfg1 &= ~NVRAM_CFG1_COMPAT_BYPASS; + tw32(NVRAM_CFG1, nvcfg1); + } +@@ -10523,37 +10823,36 @@ + if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750) || + (tp->tg3_flags2 & TG3_FLG2_5780_CLASS)) { + switch (nvcfg1 & NVRAM_CFG1_VENDOR_MASK) { +- case FLASH_VENDOR_ATMEL_FLASH_BUFFERED: +- tp->nvram_jedecnum = JEDEC_ATMEL; +- tp->nvram_pagesize = ATMEL_AT45DB0X1B_PAGE_SIZE; +- tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; +- break; +- case FLASH_VENDOR_ATMEL_FLASH_UNBUFFERED: +- tp->nvram_jedecnum = JEDEC_ATMEL; +- tp->nvram_pagesize = ATMEL_AT25F512_PAGE_SIZE; +- break; +- case FLASH_VENDOR_ATMEL_EEPROM: +- tp->nvram_jedecnum = JEDEC_ATMEL; +- tp->nvram_pagesize = ATMEL_AT24C512_CHIP_SIZE; +- tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; +- break; +- case FLASH_VENDOR_ST: +- tp->nvram_jedecnum = JEDEC_ST; +- tp->nvram_pagesize = ST_M45PEX0_PAGE_SIZE; +- tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; +- break; +- case FLASH_VENDOR_SAIFUN: +- tp->nvram_jedecnum = JEDEC_SAIFUN; +- tp->nvram_pagesize = SAIFUN_SA25F0XX_PAGE_SIZE; +- break; +- case FLASH_VENDOR_SST_SMALL: +- case FLASH_VENDOR_SST_LARGE: +- tp->nvram_jedecnum = JEDEC_SST; +- tp->nvram_pagesize = SST_25VF0X0_PAGE_SIZE; +- break; +- } +- } +- else { ++ case FLASH_VENDOR_ATMEL_FLASH_BUFFERED: ++ tp->nvram_jedecnum = JEDEC_ATMEL; ++ tp->nvram_pagesize = ATMEL_AT45DB0X1B_PAGE_SIZE; ++ tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; ++ break; ++ case FLASH_VENDOR_ATMEL_FLASH_UNBUFFERED: ++ tp->nvram_jedecnum = JEDEC_ATMEL; ++ tp->nvram_pagesize = ATMEL_AT25F512_PAGE_SIZE; ++ break; ++ case FLASH_VENDOR_ATMEL_EEPROM: ++ tp->nvram_jedecnum = JEDEC_ATMEL; ++ tp->nvram_pagesize = ATMEL_AT24C512_CHIP_SIZE; ++ tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; ++ break; ++ case FLASH_VENDOR_ST: ++ tp->nvram_jedecnum = JEDEC_ST; ++ tp->nvram_pagesize = ST_M45PEX0_PAGE_SIZE; ++ tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; ++ break; ++ case FLASH_VENDOR_SAIFUN: ++ tp->nvram_jedecnum = JEDEC_SAIFUN; ++ tp->nvram_pagesize = SAIFUN_SA25F0XX_PAGE_SIZE; ++ break; ++ case FLASH_VENDOR_SST_SMALL: ++ case FLASH_VENDOR_SST_LARGE: ++ tp->nvram_jedecnum = JEDEC_SST; ++ tp->nvram_pagesize = SST_25VF0X0_PAGE_SIZE; ++ break; ++ } ++ } else { + tp->nvram_jedecnum = JEDEC_ATMEL; + tp->nvram_pagesize = ATMEL_AT45DB0X1B_PAGE_SIZE; + tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; +@@ -10571,48 +10870,47 @@ + tp->tg3_flags2 |= TG3_FLG2_PROTECTED_NVRAM; + + switch (nvcfg1 & NVRAM_CFG1_5752VENDOR_MASK) { +- case FLASH_5752VENDOR_ATMEL_EEPROM_64KHZ: +- case FLASH_5752VENDOR_ATMEL_EEPROM_376KHZ: +- tp->nvram_jedecnum = JEDEC_ATMEL; +- tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; +- break; +- case FLASH_5752VENDOR_ATMEL_FLASH_BUFFERED: +- tp->nvram_jedecnum = JEDEC_ATMEL; +- tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; +- tp->tg3_flags2 |= TG3_FLG2_FLASH; +- break; +- case FLASH_5752VENDOR_ST_M45PE10: +- case FLASH_5752VENDOR_ST_M45PE20: +- case FLASH_5752VENDOR_ST_M45PE40: +- tp->nvram_jedecnum = JEDEC_ST; +- tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; +- tp->tg3_flags2 |= TG3_FLG2_FLASH; +- break; ++ case FLASH_5752VENDOR_ATMEL_EEPROM_64KHZ: ++ case FLASH_5752VENDOR_ATMEL_EEPROM_376KHZ: ++ tp->nvram_jedecnum = JEDEC_ATMEL; ++ tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; ++ break; ++ case FLASH_5752VENDOR_ATMEL_FLASH_BUFFERED: ++ tp->nvram_jedecnum = JEDEC_ATMEL; ++ tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; ++ tp->tg3_flags2 |= TG3_FLG2_FLASH; ++ break; ++ case FLASH_5752VENDOR_ST_M45PE10: ++ case FLASH_5752VENDOR_ST_M45PE20: ++ case FLASH_5752VENDOR_ST_M45PE40: ++ tp->nvram_jedecnum = JEDEC_ST; ++ tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; ++ tp->tg3_flags2 |= TG3_FLG2_FLASH; ++ break; + } + + if (tp->tg3_flags2 & TG3_FLG2_FLASH) { + switch (nvcfg1 & NVRAM_CFG1_5752PAGE_SIZE_MASK) { +- case FLASH_5752PAGE_SIZE_256: +- tp->nvram_pagesize = 256; +- break; +- case FLASH_5752PAGE_SIZE_512: +- tp->nvram_pagesize = 512; +- break; +- case FLASH_5752PAGE_SIZE_1K: +- tp->nvram_pagesize = 1024; +- break; +- case FLASH_5752PAGE_SIZE_2K: +- tp->nvram_pagesize = 2048; +- break; +- case FLASH_5752PAGE_SIZE_4K: +- tp->nvram_pagesize = 4096; +- break; +- case FLASH_5752PAGE_SIZE_264: +- tp->nvram_pagesize = 264; +- break; +- } +- } +- else { ++ case FLASH_5752PAGE_SIZE_256: ++ tp->nvram_pagesize = 256; ++ break; ++ case FLASH_5752PAGE_SIZE_512: ++ tp->nvram_pagesize = 512; ++ break; ++ case FLASH_5752PAGE_SIZE_1K: ++ tp->nvram_pagesize = 1024; ++ break; ++ case FLASH_5752PAGE_SIZE_2K: ++ tp->nvram_pagesize = 2048; ++ break; ++ case FLASH_5752PAGE_SIZE_4K: ++ tp->nvram_pagesize = 4096; ++ break; ++ case FLASH_5752PAGE_SIZE_264: ++ tp->nvram_pagesize = 264; ++ break; ++ } ++ } else { + /* For eeprom, set pagesize to maximum eeprom size */ + tp->nvram_pagesize = ATMEL_AT24C512_CHIP_SIZE; + +@@ -10635,45 +10933,45 @@ + + nvcfg1 &= NVRAM_CFG1_5752VENDOR_MASK; + switch (nvcfg1) { +- case FLASH_5755VENDOR_ATMEL_FLASH_1: +- case FLASH_5755VENDOR_ATMEL_FLASH_2: +- case FLASH_5755VENDOR_ATMEL_FLASH_3: +- case FLASH_5755VENDOR_ATMEL_FLASH_5: +- tp->nvram_jedecnum = JEDEC_ATMEL; +- tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; +- tp->tg3_flags2 |= TG3_FLG2_FLASH; +- tp->nvram_pagesize = 264; +- if (nvcfg1 == FLASH_5755VENDOR_ATMEL_FLASH_1 || +- nvcfg1 == FLASH_5755VENDOR_ATMEL_FLASH_5) +- tp->nvram_size = (protect ? 0x3e200 : +- TG3_NVRAM_SIZE_512KB); +- else if (nvcfg1 == FLASH_5755VENDOR_ATMEL_FLASH_2) +- tp->nvram_size = (protect ? 0x1f200 : +- TG3_NVRAM_SIZE_256KB); +- else +- tp->nvram_size = (protect ? 0x1f200 : +- TG3_NVRAM_SIZE_128KB); +- break; +- case FLASH_5752VENDOR_ST_M45PE10: +- case FLASH_5752VENDOR_ST_M45PE20: +- case FLASH_5752VENDOR_ST_M45PE40: +- tp->nvram_jedecnum = JEDEC_ST; +- tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; +- tp->tg3_flags2 |= TG3_FLG2_FLASH; +- tp->nvram_pagesize = 256; +- if (nvcfg1 == FLASH_5752VENDOR_ST_M45PE10) +- tp->nvram_size = (protect ? +- TG3_NVRAM_SIZE_64KB : +- TG3_NVRAM_SIZE_128KB); +- else if (nvcfg1 == FLASH_5752VENDOR_ST_M45PE20) +- tp->nvram_size = (protect ? +- TG3_NVRAM_SIZE_64KB : +- TG3_NVRAM_SIZE_256KB); +- else +- tp->nvram_size = (protect ? +- TG3_NVRAM_SIZE_128KB : +- TG3_NVRAM_SIZE_512KB); +- break; ++ case FLASH_5755VENDOR_ATMEL_FLASH_1: ++ case FLASH_5755VENDOR_ATMEL_FLASH_2: ++ case FLASH_5755VENDOR_ATMEL_FLASH_3: ++ case FLASH_5755VENDOR_ATMEL_FLASH_5: ++ tp->nvram_jedecnum = JEDEC_ATMEL; ++ tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; ++ tp->tg3_flags2 |= TG3_FLG2_FLASH; ++ tp->nvram_pagesize = 264; ++ if (nvcfg1 == FLASH_5755VENDOR_ATMEL_FLASH_1 || ++ nvcfg1 == FLASH_5755VENDOR_ATMEL_FLASH_5) ++ tp->nvram_size = (protect ? 0x3e200 : ++ TG3_NVRAM_SIZE_512KB); ++ else if (nvcfg1 == FLASH_5755VENDOR_ATMEL_FLASH_2) ++ tp->nvram_size = (protect ? 0x1f200 : ++ TG3_NVRAM_SIZE_256KB); ++ else ++ tp->nvram_size = (protect ? 0x1f200 : ++ TG3_NVRAM_SIZE_128KB); ++ break; ++ case FLASH_5752VENDOR_ST_M45PE10: ++ case FLASH_5752VENDOR_ST_M45PE20: ++ case FLASH_5752VENDOR_ST_M45PE40: ++ tp->nvram_jedecnum = JEDEC_ST; ++ tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; ++ tp->tg3_flags2 |= TG3_FLG2_FLASH; ++ tp->nvram_pagesize = 256; ++ if (nvcfg1 == FLASH_5752VENDOR_ST_M45PE10) ++ tp->nvram_size = (protect ? ++ TG3_NVRAM_SIZE_64KB : ++ TG3_NVRAM_SIZE_128KB); ++ else if (nvcfg1 == FLASH_5752VENDOR_ST_M45PE20) ++ tp->nvram_size = (protect ? ++ TG3_NVRAM_SIZE_64KB : ++ TG3_NVRAM_SIZE_256KB); ++ else ++ tp->nvram_size = (protect ? ++ TG3_NVRAM_SIZE_128KB : ++ TG3_NVRAM_SIZE_512KB); ++ break; + } + } + +@@ -10684,34 +10982,34 @@ + nvcfg1 = tr32(NVRAM_CFG1); + + switch (nvcfg1 & NVRAM_CFG1_5752VENDOR_MASK) { +- case FLASH_5787VENDOR_ATMEL_EEPROM_64KHZ: +- case FLASH_5787VENDOR_ATMEL_EEPROM_376KHZ: +- case FLASH_5787VENDOR_MICRO_EEPROM_64KHZ: +- case FLASH_5787VENDOR_MICRO_EEPROM_376KHZ: +- tp->nvram_jedecnum = JEDEC_ATMEL; +- tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; +- tp->nvram_pagesize = ATMEL_AT24C512_CHIP_SIZE; +- +- nvcfg1 &= ~NVRAM_CFG1_COMPAT_BYPASS; +- tw32(NVRAM_CFG1, nvcfg1); +- break; +- case FLASH_5752VENDOR_ATMEL_FLASH_BUFFERED: +- case FLASH_5755VENDOR_ATMEL_FLASH_1: +- case FLASH_5755VENDOR_ATMEL_FLASH_2: +- case FLASH_5755VENDOR_ATMEL_FLASH_3: +- tp->nvram_jedecnum = JEDEC_ATMEL; +- tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; +- tp->tg3_flags2 |= TG3_FLG2_FLASH; +- tp->nvram_pagesize = 264; +- break; +- case FLASH_5752VENDOR_ST_M45PE10: +- case FLASH_5752VENDOR_ST_M45PE20: +- case FLASH_5752VENDOR_ST_M45PE40: +- tp->nvram_jedecnum = JEDEC_ST; +- tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; +- tp->tg3_flags2 |= TG3_FLG2_FLASH; +- tp->nvram_pagesize = 256; +- break; ++ case FLASH_5787VENDOR_ATMEL_EEPROM_64KHZ: ++ case FLASH_5787VENDOR_ATMEL_EEPROM_376KHZ: ++ case FLASH_5787VENDOR_MICRO_EEPROM_64KHZ: ++ case FLASH_5787VENDOR_MICRO_EEPROM_376KHZ: ++ tp->nvram_jedecnum = JEDEC_ATMEL; ++ tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; ++ tp->nvram_pagesize = ATMEL_AT24C512_CHIP_SIZE; ++ ++ nvcfg1 &= ~NVRAM_CFG1_COMPAT_BYPASS; ++ tw32(NVRAM_CFG1, nvcfg1); ++ break; ++ case FLASH_5752VENDOR_ATMEL_FLASH_BUFFERED: ++ case FLASH_5755VENDOR_ATMEL_FLASH_1: ++ case FLASH_5755VENDOR_ATMEL_FLASH_2: ++ case FLASH_5755VENDOR_ATMEL_FLASH_3: ++ tp->nvram_jedecnum = JEDEC_ATMEL; ++ tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; ++ tp->tg3_flags2 |= TG3_FLG2_FLASH; ++ tp->nvram_pagesize = 264; ++ break; ++ case FLASH_5752VENDOR_ST_M45PE10: ++ case FLASH_5752VENDOR_ST_M45PE20: ++ case FLASH_5752VENDOR_ST_M45PE40: ++ tp->nvram_jedecnum = JEDEC_ST; ++ tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; ++ tp->tg3_flags2 |= TG3_FLG2_FLASH; ++ tp->nvram_pagesize = 256; ++ break; + } + } + +@@ -10729,63 +11027,63 @@ + + nvcfg1 &= NVRAM_CFG1_5752VENDOR_MASK; + switch (nvcfg1) { +- case FLASH_5761VENDOR_ATMEL_ADB021D: +- case FLASH_5761VENDOR_ATMEL_ADB041D: +- case FLASH_5761VENDOR_ATMEL_ADB081D: +- case FLASH_5761VENDOR_ATMEL_ADB161D: +- case FLASH_5761VENDOR_ATMEL_MDB021D: +- case FLASH_5761VENDOR_ATMEL_MDB041D: +- case FLASH_5761VENDOR_ATMEL_MDB081D: +- case FLASH_5761VENDOR_ATMEL_MDB161D: +- tp->nvram_jedecnum = JEDEC_ATMEL; +- tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; +- tp->tg3_flags2 |= TG3_FLG2_FLASH; +- tp->tg3_flags3 |= TG3_FLG3_NO_NVRAM_ADDR_TRANS; +- tp->nvram_pagesize = 256; +- break; +- case FLASH_5761VENDOR_ST_A_M45PE20: +- case FLASH_5761VENDOR_ST_A_M45PE40: +- case FLASH_5761VENDOR_ST_A_M45PE80: +- case FLASH_5761VENDOR_ST_A_M45PE16: +- case FLASH_5761VENDOR_ST_M_M45PE20: +- case FLASH_5761VENDOR_ST_M_M45PE40: +- case FLASH_5761VENDOR_ST_M_M45PE80: +- case FLASH_5761VENDOR_ST_M_M45PE16: +- tp->nvram_jedecnum = JEDEC_ST; +- tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; +- tp->tg3_flags2 |= TG3_FLG2_FLASH; +- tp->nvram_pagesize = 256; +- break; ++ case FLASH_5761VENDOR_ATMEL_ADB021D: ++ case FLASH_5761VENDOR_ATMEL_ADB041D: ++ case FLASH_5761VENDOR_ATMEL_ADB081D: ++ case FLASH_5761VENDOR_ATMEL_ADB161D: ++ case FLASH_5761VENDOR_ATMEL_MDB021D: ++ case FLASH_5761VENDOR_ATMEL_MDB041D: ++ case FLASH_5761VENDOR_ATMEL_MDB081D: ++ case FLASH_5761VENDOR_ATMEL_MDB161D: ++ tp->nvram_jedecnum = JEDEC_ATMEL; ++ tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; ++ tp->tg3_flags2 |= TG3_FLG2_FLASH; ++ tp->tg3_flags3 |= TG3_FLG3_NO_NVRAM_ADDR_TRANS; ++ tp->nvram_pagesize = 256; ++ break; ++ case FLASH_5761VENDOR_ST_A_M45PE20: ++ case FLASH_5761VENDOR_ST_A_M45PE40: ++ case FLASH_5761VENDOR_ST_A_M45PE80: ++ case FLASH_5761VENDOR_ST_A_M45PE16: ++ case FLASH_5761VENDOR_ST_M_M45PE20: ++ case FLASH_5761VENDOR_ST_M_M45PE40: ++ case FLASH_5761VENDOR_ST_M_M45PE80: ++ case FLASH_5761VENDOR_ST_M_M45PE16: ++ tp->nvram_jedecnum = JEDEC_ST; ++ tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; ++ tp->tg3_flags2 |= TG3_FLG2_FLASH; ++ tp->nvram_pagesize = 256; ++ break; + } + + if (protect) { + tp->nvram_size = tr32(NVRAM_ADDR_LOCKOUT); + } else { + switch (nvcfg1) { +- case FLASH_5761VENDOR_ATMEL_ADB161D: +- case FLASH_5761VENDOR_ATMEL_MDB161D: +- case FLASH_5761VENDOR_ST_A_M45PE16: +- case FLASH_5761VENDOR_ST_M_M45PE16: +- tp->nvram_size = TG3_NVRAM_SIZE_2MB; +- break; +- case FLASH_5761VENDOR_ATMEL_ADB081D: +- case FLASH_5761VENDOR_ATMEL_MDB081D: +- case FLASH_5761VENDOR_ST_A_M45PE80: +- case FLASH_5761VENDOR_ST_M_M45PE80: +- tp->nvram_size = TG3_NVRAM_SIZE_1MB; +- break; +- case FLASH_5761VENDOR_ATMEL_ADB041D: +- case FLASH_5761VENDOR_ATMEL_MDB041D: +- case FLASH_5761VENDOR_ST_A_M45PE40: +- case FLASH_5761VENDOR_ST_M_M45PE40: +- tp->nvram_size = TG3_NVRAM_SIZE_512KB; +- break; +- case FLASH_5761VENDOR_ATMEL_ADB021D: +- case FLASH_5761VENDOR_ATMEL_MDB021D: +- case FLASH_5761VENDOR_ST_A_M45PE20: +- case FLASH_5761VENDOR_ST_M_M45PE20: +- tp->nvram_size = TG3_NVRAM_SIZE_256KB; +- break; ++ case FLASH_5761VENDOR_ATMEL_ADB161D: ++ case FLASH_5761VENDOR_ATMEL_MDB161D: ++ case FLASH_5761VENDOR_ST_A_M45PE16: ++ case FLASH_5761VENDOR_ST_M_M45PE16: ++ tp->nvram_size = TG3_NVRAM_SIZE_2MB; ++ break; ++ case FLASH_5761VENDOR_ATMEL_ADB081D: ++ case FLASH_5761VENDOR_ATMEL_MDB081D: ++ case FLASH_5761VENDOR_ST_A_M45PE80: ++ case FLASH_5761VENDOR_ST_M_M45PE80: ++ tp->nvram_size = TG3_NVRAM_SIZE_1MB; ++ break; ++ case FLASH_5761VENDOR_ATMEL_ADB041D: ++ case FLASH_5761VENDOR_ATMEL_MDB041D: ++ case FLASH_5761VENDOR_ST_A_M45PE40: ++ case FLASH_5761VENDOR_ST_M_M45PE40: ++ tp->nvram_size = TG3_NVRAM_SIZE_512KB; ++ break; ++ case FLASH_5761VENDOR_ATMEL_ADB021D: ++ case FLASH_5761VENDOR_ATMEL_MDB021D: ++ case FLASH_5761VENDOR_ST_A_M45PE20: ++ case FLASH_5761VENDOR_ST_M_M45PE20: ++ tp->nvram_size = TG3_NVRAM_SIZE_256KB; ++ break; + } + } + } +@@ -10795,6 +11093,103 @@ + tp->nvram_jedecnum = JEDEC_ATMEL; + tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; + tp->nvram_pagesize = ATMEL_AT24C512_CHIP_SIZE; ++} ++ ++static void __devinit tg3_get_57780_nvram_info(struct tg3 *tp) ++{ ++ u32 nvcfg1; ++ ++ nvcfg1 = tr32(NVRAM_CFG1); ++ ++ switch (nvcfg1 & NVRAM_CFG1_5752VENDOR_MASK) { ++ case FLASH_5787VENDOR_ATMEL_EEPROM_376KHZ: ++ case FLASH_5787VENDOR_MICRO_EEPROM_376KHZ: ++ tp->nvram_jedecnum = JEDEC_ATMEL; ++ tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; ++ tp->nvram_pagesize = ATMEL_AT24C512_CHIP_SIZE; ++ ++ nvcfg1 &= ~NVRAM_CFG1_COMPAT_BYPASS; ++ tw32(NVRAM_CFG1, nvcfg1); ++ return; ++ case FLASH_5752VENDOR_ATMEL_FLASH_BUFFERED: ++ case FLASH_57780VENDOR_ATMEL_AT45DB011D: ++ case FLASH_57780VENDOR_ATMEL_AT45DB011B: ++ case FLASH_57780VENDOR_ATMEL_AT45DB021D: ++ case FLASH_57780VENDOR_ATMEL_AT45DB021B: ++ case FLASH_57780VENDOR_ATMEL_AT45DB041D: ++ case FLASH_57780VENDOR_ATMEL_AT45DB041B: ++ tp->nvram_jedecnum = JEDEC_ATMEL; ++ tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; ++ tp->tg3_flags2 |= TG3_FLG2_FLASH; ++ ++ switch (nvcfg1 & NVRAM_CFG1_5752VENDOR_MASK) { ++ case FLASH_5752VENDOR_ATMEL_FLASH_BUFFERED: ++ case FLASH_57780VENDOR_ATMEL_AT45DB011D: ++ case FLASH_57780VENDOR_ATMEL_AT45DB011B: ++ tp->nvram_size = TG3_NVRAM_SIZE_128KB; ++ break; ++ case FLASH_57780VENDOR_ATMEL_AT45DB021D: ++ case FLASH_57780VENDOR_ATMEL_AT45DB021B: ++ tp->nvram_size = TG3_NVRAM_SIZE_256KB; ++ break; ++ case FLASH_57780VENDOR_ATMEL_AT45DB041D: ++ case FLASH_57780VENDOR_ATMEL_AT45DB041B: ++ tp->nvram_size = TG3_NVRAM_SIZE_512KB; ++ break; ++ } ++ break; ++ case FLASH_5752VENDOR_ST_M45PE10: ++ case FLASH_5752VENDOR_ST_M45PE20: ++ case FLASH_5752VENDOR_ST_M45PE40: ++ tp->nvram_jedecnum = JEDEC_ST; ++ tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; ++ tp->tg3_flags2 |= TG3_FLG2_FLASH; ++ ++ switch (nvcfg1 & NVRAM_CFG1_5752VENDOR_MASK) { ++ case FLASH_5752VENDOR_ST_M45PE10: ++ tp->nvram_size = TG3_NVRAM_SIZE_128KB; ++ break; ++ case FLASH_5752VENDOR_ST_M45PE20: ++ tp->nvram_size = TG3_NVRAM_SIZE_256KB; ++ break; ++ case FLASH_5752VENDOR_ST_M45PE40: ++ tp->nvram_size = TG3_NVRAM_SIZE_512KB; ++ break; ++ } ++ break; ++ default: ++ tp->tg3_flags3 |= TG3_FLG3_NO_NVRAM; ++ return; ++ } ++ ++ switch (nvcfg1 & NVRAM_CFG1_5752PAGE_SIZE_MASK) { ++ case FLASH_5752PAGE_SIZE_256: ++ tp->tg3_flags3 |= TG3_FLG3_NO_NVRAM_ADDR_TRANS; ++ tp->nvram_pagesize = 256; ++ break; ++ case FLASH_5752PAGE_SIZE_512: ++ tp->tg3_flags3 |= TG3_FLG3_NO_NVRAM_ADDR_TRANS; ++ tp->nvram_pagesize = 512; ++ break; ++ case FLASH_5752PAGE_SIZE_1K: ++ tp->tg3_flags3 |= TG3_FLG3_NO_NVRAM_ADDR_TRANS; ++ tp->nvram_pagesize = 1024; ++ break; ++ case FLASH_5752PAGE_SIZE_2K: ++ tp->tg3_flags3 |= TG3_FLG3_NO_NVRAM_ADDR_TRANS; ++ tp->nvram_pagesize = 2048; ++ break; ++ case FLASH_5752PAGE_SIZE_4K: ++ tp->tg3_flags3 |= TG3_FLG3_NO_NVRAM_ADDR_TRANS; ++ tp->nvram_pagesize = 4096; ++ break; ++ case FLASH_5752PAGE_SIZE_264: ++ tp->nvram_pagesize = 264; ++ break; ++ case FLASH_5752PAGE_SIZE_528: ++ tp->nvram_pagesize = 528; ++ break; ++ } + } + + /* Chips other than 5700/5701 use the NVRAM for fetching info. */ +@@ -10831,13 +11226,14 @@ + tg3_get_5755_nvram_info(tp); + else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787 || + GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57780 || + GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5785) + tg3_get_5787_nvram_info(tp); + else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5761) + tg3_get_5761_nvram_info(tp); + else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) + tg3_get_5906_nvram_info(tp); ++ else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57780) ++ tg3_get_57780_nvram_info(tp); + else + tg3_get_nvram_info(tp); + +@@ -10854,141 +11250,6 @@ + } + } + +-static int tg3_nvram_read_using_eeprom(struct tg3 *tp, +- u32 offset, u32 *val) +-{ +- u32 tmp; +- int i; +- +- if (offset > EEPROM_ADDR_ADDR_MASK || +- (offset % 4) != 0) +- return -EINVAL; +- +- tmp = tr32(GRC_EEPROM_ADDR) & ~(EEPROM_ADDR_ADDR_MASK | +- EEPROM_ADDR_DEVID_MASK | +- EEPROM_ADDR_READ); +- tw32(GRC_EEPROM_ADDR, +- tmp | +- (0 << EEPROM_ADDR_DEVID_SHIFT) | +- ((offset << EEPROM_ADDR_ADDR_SHIFT) & +- EEPROM_ADDR_ADDR_MASK) | +- EEPROM_ADDR_READ | EEPROM_ADDR_START); +- +- for (i = 0; i < 1000; i++) { +- tmp = tr32(GRC_EEPROM_ADDR); +- +- if (tmp & EEPROM_ADDR_COMPLETE) +- break; +- msleep(1); +- } +- if (!(tmp & EEPROM_ADDR_COMPLETE)) +- return -EBUSY; +- +- *val = tr32(GRC_EEPROM_DATA); +- return 0; +-} +- +-#define NVRAM_CMD_TIMEOUT 10000 +- +-static int tg3_nvram_exec_cmd(struct tg3 *tp, u32 nvram_cmd) +-{ +- int i; +- +- tw32(NVRAM_CMD, nvram_cmd); +- for (i = 0; i < NVRAM_CMD_TIMEOUT; i++) { +- udelay(10); +- if (tr32(NVRAM_CMD) & NVRAM_CMD_DONE) { +- udelay(10); +- break; +- } +- } +- if (i == NVRAM_CMD_TIMEOUT) { +- return -EBUSY; +- } +- return 0; +-} +- +-static u32 tg3_nvram_phys_addr(struct tg3 *tp, u32 addr) +-{ +- if ((tp->tg3_flags & TG3_FLAG_NVRAM) && +- (tp->tg3_flags & TG3_FLAG_NVRAM_BUFFERED) && +- (tp->tg3_flags2 & TG3_FLG2_FLASH) && +- !(tp->tg3_flags3 & TG3_FLG3_NO_NVRAM_ADDR_TRANS) && +- (tp->nvram_jedecnum == JEDEC_ATMEL)) +- +- addr = ((addr / tp->nvram_pagesize) << +- ATMEL_AT45DB0X1B_PAGE_POS) + +- (addr % tp->nvram_pagesize); +- +- return addr; +-} +- +-static u32 tg3_nvram_logical_addr(struct tg3 *tp, u32 addr) +-{ +- if ((tp->tg3_flags & TG3_FLAG_NVRAM) && +- (tp->tg3_flags & TG3_FLAG_NVRAM_BUFFERED) && +- (tp->tg3_flags2 & TG3_FLG2_FLASH) && +- !(tp->tg3_flags3 & TG3_FLG3_NO_NVRAM_ADDR_TRANS) && +- (tp->nvram_jedecnum == JEDEC_ATMEL)) +- +- addr = ((addr >> ATMEL_AT45DB0X1B_PAGE_POS) * +- tp->nvram_pagesize) + +- (addr & ((1 << ATMEL_AT45DB0X1B_PAGE_POS) - 1)); +- +- return addr; +-} +- +-static int tg3_nvram_read(struct tg3 *tp, u32 offset, u32 *val) +-{ +- int ret; +- +- if (!(tp->tg3_flags & TG3_FLAG_NVRAM)) +- return tg3_nvram_read_using_eeprom(tp, offset, val); +- +- offset = tg3_nvram_phys_addr(tp, offset); +- +- if (offset > NVRAM_ADDR_MSK) +- return -EINVAL; +- +- ret = tg3_nvram_lock(tp); +- if (ret) +- return ret; +- +- tg3_enable_nvram_access(tp); +- +- tw32(NVRAM_ADDR, offset); +- ret = tg3_nvram_exec_cmd(tp, NVRAM_CMD_RD | NVRAM_CMD_GO | +- NVRAM_CMD_FIRST | NVRAM_CMD_LAST | NVRAM_CMD_DONE); +- +- if (ret == 0) +- *val = swab32(tr32(NVRAM_RDDATA)); +- +- tg3_disable_nvram_access(tp); +- +- tg3_nvram_unlock(tp); +- +- return ret; +-} +- +-static int tg3_nvram_read_le(struct tg3 *tp, u32 offset, __le32 *val) +-{ +- u32 v; +- int res = tg3_nvram_read(tp, offset, &v); +- if (!res) +- *val = cpu_to_le32(v); +- return res; +-} +- +-static int tg3_nvram_read_swab(struct tg3 *tp, u32 offset, u32 *val) +-{ +- int err; +- u32 tmp; +- +- err = tg3_nvram_read(tp, offset, &tmp); +- *val = swab32(tmp); +- return err; +-} +- + static int tg3_nvram_write_block_using_eeprom(struct tg3 *tp, + u32 offset, u32 len, u8 *buf) + { +@@ -10997,13 +11258,19 @@ + + for (i = 0; i < len; i += 4) { + u32 addr; +- __le32 data; ++ __be32 data; + + addr = offset + i; + + memcpy(&data, buf + i, 4); + +- tw32(GRC_EEPROM_DATA, le32_to_cpu(data)); ++ /* ++ * The SEEPROM interface expects the data to always be opposite ++ * the native endian format. We accomplish this by reversing ++ * all the operations that would have been performed on the ++ * data from a call to tg3_nvram_read_be32(). ++ */ ++ tw32(GRC_EEPROM_DATA, swab32(be32_to_cpu(data))); + + val = tr32(GRC_EEPROM_ADDR); + tw32(GRC_EEPROM_ADDR, val | EEPROM_ADDR_COMPLETE); +@@ -11053,8 +11320,9 @@ + phy_addr = offset & ~pagemask; + + for (j = 0; j < pagesize; j += 4) { +- if ((ret = tg3_nvram_read_le(tp, phy_addr + j, +- (__le32 *) (tmp + j)))) ++ ret = tg3_nvram_read_be32(tp, phy_addr + j, ++ (__be32 *) (tmp + j)); ++ if (ret) + break; + } + if (ret) +@@ -11101,7 +11369,7 @@ + __be32 data; + + data = *((__be32 *) (tmp + j)); +- /* swab32(le32_to_cpu(data)), actually */ ++ + tw32(NVRAM_WRDATA, be32_to_cpu(data)); + + tw32(NVRAM_ADDR, phy_addr + j); +@@ -11158,13 +11426,8 @@ + if (i == (len - 4)) + nvram_cmd |= NVRAM_CMD_LAST; + +- if ((GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5752) && +- (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5755) && +- (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5787) && +- (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5784) && +- (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_57780) && +- (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5761) && +- (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5785) && ++ if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5752 && ++ !(tp->tg3_flags3 & TG3_FLG3_5755_PLUS) && + (tp->nvram_jedecnum == JEDEC_ST) && + (nvram_cmd & NVRAM_CMD_FIRST)) { + +@@ -11339,11 +11602,9 @@ + if (val & VCPU_CFGSHDW_ASPM_DBNC) + tp->tg3_flags |= TG3_FLAG_ASPM_WORKAROUND; + if ((val & VCPU_CFGSHDW_WOL_ENABLE) && +- (val & VCPU_CFGSHDW_WOL_MAGPKT)) { ++ (val & VCPU_CFGSHDW_WOL_MAGPKT)) + tp->tg3_flags |= TG3_FLAG_WOL_ENABLE; +- device_set_wakeup_enable(&tp->pdev->dev, true); +- } +- return; ++ goto done; + } + + tg3_read_mem(tp, NIC_SRAM_DATA_SIG, &val); +@@ -11465,17 +11726,18 @@ + if (tp->tg3_flags2 & TG3_FLG2_5750_PLUS) + tp->tg3_flags2 |= TG3_FLG2_ASF_NEW_HANDSHAKE; + } +- if (nic_cfg & NIC_SRAM_DATA_CFG_APE_ENABLE) ++ ++ if ((nic_cfg & NIC_SRAM_DATA_CFG_APE_ENABLE) && ++ (tp->tg3_flags2 & TG3_FLG2_5750_PLUS)) + tp->tg3_flags3 |= TG3_FLG3_ENABLE_APE; ++ + if (tp->tg3_flags2 & TG3_FLG2_ANY_SERDES && + !(nic_cfg & NIC_SRAM_DATA_CFG_FIBER_WOL)) + tp->tg3_flags &= ~TG3_FLAG_WOL_CAP; + + if ((tp->tg3_flags & TG3_FLAG_WOL_CAP) && +- (nic_cfg & NIC_SRAM_DATA_CFG_WOL_ENABLE)) { ++ (nic_cfg & NIC_SRAM_DATA_CFG_WOL_ENABLE)) + tp->tg3_flags |= TG3_FLAG_WOL_ENABLE; +- device_set_wakeup_enable(&tp->pdev->dev, true); +- } + + if (cfg2 & (1 << 17)) + tp->tg3_flags2 |= TG3_FLG2_CAPACITIVE_COUPLING; +@@ -11485,6 +11747,12 @@ + if (cfg2 & (1 << 18)) + tp->tg3_flags2 |= TG3_FLG2_SERDES_PREEMPHASIS; + ++ if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5785 || ++ (((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 && ++ GET_CHIP_REV(tp->pci_chip_rev_id) != CHIPREV_5784_AX)) && ++ (cfg2 & NIC_SRAM_DATA_CFG_2_APD_EN))) ++ tp->tg3_flags3 |= TG3_FLG3_PHY_ENABLE_APD; ++ + if (tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS) { + u32 cfg3; + +@@ -11493,13 +11761,17 @@ + tp->tg3_flags |= TG3_FLAG_ASPM_WORKAROUND; + } + +- if (cfg4 & NIC_SRAM_RGMII_STD_IBND_DISABLE) +- tp->tg3_flags3 |= TG3_FLG3_RGMII_STD_IBND_DISABLE; ++ if (cfg4 & NIC_SRAM_RGMII_INBAND_DISABLE) ++ tp->tg3_flags3 |= TG3_FLG3_RGMII_INBAND_DISABLE; + if (cfg4 & NIC_SRAM_RGMII_EXT_IBND_RX_EN) + tp->tg3_flags3 |= TG3_FLG3_RGMII_EXT_IBND_RX_EN; + if (cfg4 & NIC_SRAM_RGMII_EXT_IBND_TX_EN) + tp->tg3_flags3 |= TG3_FLG3_RGMII_EXT_IBND_TX_EN; + } ++done: ++ device_init_wakeup(&tp->pdev->dev, tp->tg3_flags & TG3_FLAG_WOL_CAP); ++ device_set_wakeup_enable(&tp->pdev->dev, ++ tp->tg3_flags & TG3_FLAG_WOL_ENABLE); + } + + static int __devinit tg3_issue_otp_command(struct tg3 *tp, u32 cmd) +@@ -11561,7 +11833,7 @@ + return tg3_phy_init(tp); + + /* Reading the PHY ID register can conflict with ASF +- * firwmare access to the PHY hardware. ++ * firmware access to the PHY hardware. + */ + err = 0; + if ((tp->tg3_flags & TG3_FLAG_ENABLE_ASF) || +@@ -11684,24 +11956,26 @@ + + static void __devinit tg3_read_partno(struct tg3 *tp) + { +- unsigned char vpd_data[256]; ++ unsigned char vpd_data[256]; /* in little-endian format */ + unsigned int i; + u32 magic; + +- if (tg3_nvram_read_swab(tp, 0x0, &magic)) ++ if ((tp->tg3_flags3 & TG3_FLG3_NO_NVRAM) || ++ tg3_nvram_read(tp, 0x0, &magic)) + goto out_not_found; + + if (magic == TG3_EEPROM_MAGIC) { + for (i = 0; i < 256; i += 4) { + u32 tmp; + +- if (tg3_nvram_read(tp, 0x100 + i, &tmp)) ++ /* The data is in little-endian format in NVRAM. ++ * Use the big-endian read routines to preserve ++ * the byte order as it exists in NVRAM. ++ */ ++ if (tg3_nvram_read_be32(tp, 0x100 + i, &tmp)) + goto out_not_found; + +- vpd_data[i + 0] = ((tmp >> 0) & 0xff); +- vpd_data[i + 1] = ((tmp >> 8) & 0xff); +- vpd_data[i + 2] = ((tmp >> 16) & 0xff); +- vpd_data[i + 3] = ((tmp >> 24) & 0xff); ++ memcpy(&vpd_data[i], &tmp, sizeof(tmp)); + } + } else { + int vpd_cap; +@@ -11727,7 +12001,7 @@ + pci_read_config_dword(tp->pdev, vpd_cap + PCI_VPD_DATA, + &tmp); + v = cpu_to_le32(tmp); +- memcpy(&vpd_data[i], &v, 4); ++ memcpy(&vpd_data[i], &v, sizeof(v)); + } + } + +@@ -11779,6 +12053,15 @@ + out_not_found: + if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) + strcpy(tp->board_part_number, "BCM95906"); ++ else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57780 && ++ tp->pdev->device == TG3PCI_DEVICE_TIGON3_57780) ++ strcpy(tp->board_part_number, "BCM57780"); ++ else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57780 && ++ tp->pdev->device == TG3PCI_DEVICE_TIGON3_57760) ++ strcpy(tp->board_part_number, "BCM57760"); ++ else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57780 && ++ tp->pdev->device == TG3PCI_DEVICE_TIGON3_57790) ++ strcpy(tp->board_part_number, "BCM57790"); + else + strcpy(tp->board_part_number, "none"); + } +@@ -11787,54 +12070,133 @@ + { + u32 val; + +- if (tg3_nvram_read_swab(tp, offset, &val) || ++ if (tg3_nvram_read(tp, offset, &val) || + (val & 0xfc000000) != 0x0c000000 || +- tg3_nvram_read_swab(tp, offset + 4, &val) || ++ tg3_nvram_read(tp, offset + 4, &val) || + val != 0) + return 0; + + return 1; + } + +-static void __devinit tg3_read_fw_ver(struct tg3 *tp) ++static void __devinit tg3_read_bc_ver(struct tg3 *tp) ++{ ++ u32 val, offset, start, ver_offset; ++ int i; ++ bool newver = false; ++ ++ if (tg3_nvram_read(tp, 0xc, &offset) || ++ tg3_nvram_read(tp, 0x4, &start)) ++ return; ++ ++ offset = tg3_nvram_logical_addr(tp, offset); ++ ++ if (tg3_nvram_read(tp, offset, &val)) ++ return; ++ ++ if ((val & 0xfc000000) == 0x0c000000) { ++ if (tg3_nvram_read(tp, offset + 4, &val)) ++ return; ++ ++ if (val == 0) ++ newver = true; ++ } ++ ++ if (newver) { ++ if (tg3_nvram_read(tp, offset + 8, &ver_offset)) ++ return; ++ ++ offset = offset + ver_offset - start; ++ for (i = 0; i < 16; i += 4) { ++ __be32 v; ++ if (tg3_nvram_read_be32(tp, offset + i, &v)) ++ return; ++ ++ memcpy(tp->fw_ver + i, &v, sizeof(v)); ++ } ++ } else { ++ u32 major, minor; ++ ++ if (tg3_nvram_read(tp, TG3_NVM_PTREV_BCVER, &ver_offset)) ++ return; ++ ++ major = (ver_offset & TG3_NVM_BCVER_MAJMSK) >> ++ TG3_NVM_BCVER_MAJSFT; ++ minor = ver_offset & TG3_NVM_BCVER_MINMSK; ++ snprintf(&tp->fw_ver[0], 32, "v%d.%02d", major, minor); ++ } ++} ++ ++static void __devinit tg3_read_hwsb_ver(struct tg3 *tp) ++{ ++ u32 val, major, minor; ++ ++ /* Use native endian representation */ ++ if (tg3_nvram_read(tp, TG3_NVM_HWSB_CFG1, &val)) ++ return; ++ ++ major = (val & TG3_NVM_HWSB_CFG1_MAJMSK) >> ++ TG3_NVM_HWSB_CFG1_MAJSFT; ++ minor = (val & TG3_NVM_HWSB_CFG1_MINMSK) >> ++ TG3_NVM_HWSB_CFG1_MINSFT; ++ ++ snprintf(&tp->fw_ver[0], 32, "sb v%d.%02d", major, minor); ++} ++ ++static void __devinit tg3_read_sb_ver(struct tg3 *tp, u32 val) ++{ ++ u32 offset, major, minor, build; ++ ++ tp->fw_ver[0] = 's'; ++ tp->fw_ver[1] = 'b'; ++ tp->fw_ver[2] = '\0'; ++ ++ if ((val & TG3_EEPROM_SB_FORMAT_MASK) != TG3_EEPROM_SB_FORMAT_1) ++ return; ++ ++ switch (val & TG3_EEPROM_SB_REVISION_MASK) { ++ case TG3_EEPROM_SB_REVISION_0: ++ offset = TG3_EEPROM_SB_F1R0_EDH_OFF; ++ break; ++ case TG3_EEPROM_SB_REVISION_2: ++ offset = TG3_EEPROM_SB_F1R2_EDH_OFF; ++ break; ++ case TG3_EEPROM_SB_REVISION_3: ++ offset = TG3_EEPROM_SB_F1R3_EDH_OFF; ++ break; ++ default: ++ return; ++ } ++ ++ if (tg3_nvram_read(tp, offset, &val)) ++ return; ++ ++ build = (val & TG3_EEPROM_SB_EDH_BLD_MASK) >> ++ TG3_EEPROM_SB_EDH_BLD_SHFT; ++ major = (val & TG3_EEPROM_SB_EDH_MAJ_MASK) >> ++ TG3_EEPROM_SB_EDH_MAJ_SHFT; ++ minor = val & TG3_EEPROM_SB_EDH_MIN_MASK; ++ ++ if (minor > 99 || build > 26) ++ return; ++ ++ snprintf(&tp->fw_ver[2], 30, " v%d.%02d", major, minor); ++ ++ if (build > 0) { ++ tp->fw_ver[8] = 'a' + build - 1; ++ tp->fw_ver[9] = '\0'; ++ } ++} ++ ++static void __devinit tg3_read_mgmtfw_ver(struct tg3 *tp) + { + u32 val, offset, start; +- u32 ver_offset; +- int i, bcnt; +- +- if (tg3_nvram_read_swab(tp, 0, &val)) +- return; +- +- if (val != TG3_EEPROM_MAGIC) +- return; +- +- if (tg3_nvram_read_swab(tp, 0xc, &offset) || +- tg3_nvram_read_swab(tp, 0x4, &start)) +- return; +- +- offset = tg3_nvram_logical_addr(tp, offset); +- +- if (!tg3_fw_img_is_valid(tp, offset) || +- tg3_nvram_read_swab(tp, offset + 8, &ver_offset)) +- return; +- +- offset = offset + ver_offset - start; +- for (i = 0; i < 16; i += 4) { +- __le32 v; +- if (tg3_nvram_read_le(tp, offset + i, &v)) +- return; +- +- memcpy(tp->fw_ver + i, &v, 4); +- } +- +- if (!(tp->tg3_flags & TG3_FLAG_ENABLE_ASF) || +- (tp->tg3_flags3 & TG3_FLG3_ENABLE_APE)) +- return; ++ int i, vlen; + + for (offset = TG3_NVM_DIR_START; + offset < TG3_NVM_DIR_END; + offset += TG3_NVM_DIRENT_SIZE) { +- if (tg3_nvram_read_swab(tp, offset, &val)) ++ if (tg3_nvram_read(tp, offset, &val)) + return; + + if ((val >> TG3_NVM_DIRTYPE_SHIFT) == TG3_NVM_DIRTYPE_ASFINI) +@@ -11846,36 +12208,95 @@ + + if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) + start = 0x08000000; +- else if (tg3_nvram_read_swab(tp, offset - 4, &start)) +- return; +- +- if (tg3_nvram_read_swab(tp, offset + 4, &offset) || ++ else if (tg3_nvram_read(tp, offset - 4, &start)) ++ return; ++ ++ if (tg3_nvram_read(tp, offset + 4, &offset) || + !tg3_fw_img_is_valid(tp, offset) || +- tg3_nvram_read_swab(tp, offset + 8, &val)) ++ tg3_nvram_read(tp, offset + 8, &val)) + return; + + offset += val - start; + +- bcnt = strlen(tp->fw_ver); +- +- tp->fw_ver[bcnt++] = ','; +- tp->fw_ver[bcnt++] = ' '; ++ vlen = strlen(tp->fw_ver); ++ ++ tp->fw_ver[vlen++] = ','; ++ tp->fw_ver[vlen++] = ' '; + + for (i = 0; i < 4; i++) { +- __le32 v; +- if (tg3_nvram_read_le(tp, offset, &v)) ++ __be32 v; ++ if (tg3_nvram_read_be32(tp, offset, &v)) + return; + + offset += sizeof(v); + +- if (bcnt > TG3_VER_SIZE - sizeof(v)) { +- memcpy(&tp->fw_ver[bcnt], &v, TG3_VER_SIZE - bcnt); +- break; +- } +- +- memcpy(&tp->fw_ver[bcnt], &v, sizeof(v)); +- bcnt += sizeof(v); +- } ++ if (vlen > TG3_VER_SIZE - sizeof(v)) { ++ memcpy(&tp->fw_ver[vlen], &v, TG3_VER_SIZE - vlen); ++ break; ++ } ++ ++ memcpy(&tp->fw_ver[vlen], &v, sizeof(v)); ++ vlen += sizeof(v); ++ } ++} ++ ++static void __devinit tg3_read_dash_ver(struct tg3 *tp) ++{ ++ int vlen; ++ u32 apedata; ++ ++ if (!(tp->tg3_flags3 & TG3_FLG3_ENABLE_APE) || ++ !(tp->tg3_flags & TG3_FLAG_ENABLE_ASF)) ++ return; ++ ++ apedata = tg3_ape_read32(tp, TG3_APE_SEG_SIG); ++ if (apedata != APE_SEG_SIG_MAGIC) ++ return; ++ ++ apedata = tg3_ape_read32(tp, TG3_APE_FW_STATUS); ++ if (!(apedata & APE_FW_STATUS_READY)) ++ return; ++ ++ apedata = tg3_ape_read32(tp, TG3_APE_FW_VERSION); ++ ++ vlen = strlen(tp->fw_ver); ++ ++ snprintf(&tp->fw_ver[vlen], TG3_VER_SIZE - vlen, " DASH v%d.%d.%d.%d", ++ (apedata & APE_FW_VERSION_MAJMSK) >> APE_FW_VERSION_MAJSFT, ++ (apedata & APE_FW_VERSION_MINMSK) >> APE_FW_VERSION_MINSFT, ++ (apedata & APE_FW_VERSION_REVMSK) >> APE_FW_VERSION_REVSFT, ++ (apedata & APE_FW_VERSION_BLDMSK)); ++} ++ ++static void __devinit tg3_read_fw_ver(struct tg3 *tp) ++{ ++ u32 val; ++ ++ if (tp->tg3_flags3 & TG3_FLG3_NO_NVRAM) { ++ tp->fw_ver[0] = 's'; ++ tp->fw_ver[1] = 'b'; ++ tp->fw_ver[2] = '\0'; ++ ++ return; ++ } ++ ++ if (tg3_nvram_read(tp, 0, &val)) ++ return; ++ ++ if (val == TG3_EEPROM_MAGIC) ++ tg3_read_bc_ver(tp); ++ else if ((val & TG3_EEPROM_MAGIC_FW_MSK) == TG3_EEPROM_MAGIC_FW) ++ tg3_read_sb_ver(tp, val); ++ else if ((val & TG3_EEPROM_MAGIC_HW_MSK) == TG3_EEPROM_MAGIC_HW) ++ tg3_read_hwsb_ver(tp); ++ else ++ return; ++ ++ if (!(tp->tg3_flags & TG3_FLAG_ENABLE_ASF) || ++ (tp->tg3_flags3 & TG3_FLG3_ENABLE_APE)) ++ return; ++ ++ tg3_read_mgmtfw_ver(tp); + + tp->fw_ver[TG3_VER_SIZE - 1] = 0; + } +@@ -11884,6 +12305,7 @@ + + static int __devinit tg3_get_invariants(struct tg3 *tp) + { ++#if (LINUX_VERSION_CODE >= 0x2060a) + static struct pci_device_id write_reorder_chipsets[] = { + { PCI_DEVICE(PCI_VENDOR_ID_AMD, + PCI_DEVICE_ID_AMD_FE_GATE_700C) }, +@@ -11893,12 +12315,12 @@ + PCI_DEVICE_ID_VIA_8385_0) }, + { }, + }; ++#endif + u32 misc_ctrl_reg; +- u32 cacheline_sz_reg; + u32 pci_state_reg, grc_misc_cfg; + u32 val; + u16 pci_cmd; +- int err, pcie_cap; ++ int err; + + /* Force memory write invalidate off. If we leave it on, + * then on 5700_BX chips we have to enable a workaround. +@@ -11981,7 +12403,11 @@ + continue; + } + if (pci_id->rev != PCI_ANY_ID) { +- if (bridge->revision > pci_id->rev) ++ u8 rev; ++ ++ pci_read_config_byte(bridge, PCI_REVISION_ID, ++ &rev); ++ if (rev > pci_id->rev) + continue; + } + if (bridge->subordinate && +@@ -12064,33 +12490,49 @@ + pci_write_config_dword(tp->pdev, TG3PCI_MISC_HOST_CTRL, + tp->misc_host_ctrl); + +- pci_read_config_dword(tp->pdev, TG3PCI_CACHELINESZ, +- &cacheline_sz_reg); +- +- tp->pci_cacheline_sz = (cacheline_sz_reg >> 0) & 0xff; +- tp->pci_lat_timer = (cacheline_sz_reg >> 8) & 0xff; +- tp->pci_hdr_type = (cacheline_sz_reg >> 16) & 0xff; +- tp->pci_bist = (cacheline_sz_reg >> 24) & 0xff; +- + if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) || + (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5714)) + tp->pdev_peer = tg3_find_peer(tp); + ++ /* Intentionally exclude ASIC_REV_5906 */ ++ if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 || ++ GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787 || ++ GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 || ++ GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5761 || ++ GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5785 || ++ GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57780) ++ tp->tg3_flags3 |= TG3_FLG3_5755_PLUS; ++ + if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750 || + GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5752 || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787 || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57780 || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5761 || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5785 || + GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906 || ++ (tp->tg3_flags3 & TG3_FLG3_5755_PLUS) || + (tp->tg3_flags2 & TG3_FLG2_5780_CLASS)) + tp->tg3_flags2 |= TG3_FLG2_5750_PLUS; + + if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) || + (tp->tg3_flags2 & TG3_FLG2_5750_PLUS)) + tp->tg3_flags2 |= TG3_FLG2_5705_PLUS; ++ ++ /* 5700 B0 chips do not support checksumming correctly due ++ * to hardware bugs. ++ */ ++ if (tp->pci_chip_rev_id == CHIPREV_ID_5700_B0) ++ tp->tg3_flags |= TG3_FLAG_BROKEN_CHECKSUMS; ++ else { ++ tp->tg3_flags |= TG3_FLAG_RX_CHECKSUMS; ++#ifndef BCM_NO_IPV6_CSUM ++ tp->dev->features |= NETIF_F_IP_CSUM | NETIF_F_SG; ++ if (tp->tg3_flags3 & TG3_FLG3_5755_PLUS) ++ tp->dev->features |= NETIF_F_IPV6_CSUM; ++#else ++ tp->dev->features |= NETIF_F_SG; ++ if (tp->tg3_flags3 & TG3_FLG3_5755_PLUS) ++ tp->dev->features |= NETIF_F_HW_CSUM; ++ else ++ tp->dev->features |= NETIF_F_IP_CSUM; ++#endif ++ } + + if (tp->tg3_flags2 & TG3_FLG2_5750_PLUS) { + tp->tg3_flags |= TG3_FLAG_SUPPORT_MSI; +@@ -12101,12 +12543,7 @@ + tp->pdev_peer == tp->pdev)) + tp->tg3_flags &= ~TG3_FLAG_SUPPORT_MSI; + +- if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787 || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57780 || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5761 || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5785 || ++ if ((tp->tg3_flags3 & TG3_FLG3_5755_PLUS) || + GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) { + tp->tg3_flags2 |= TG3_FLG2_HW_TSO_2; + tp->tg3_flags2 |= TG3_FLG2_1SHOT_MSI; +@@ -12121,23 +12558,44 @@ + + if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS) || + (tp->tg3_flags2 & TG3_FLG2_5780_CLASS)) +- tp->tg3_flags2 |= TG3_FLG2_JUMBO_CAPABLE; +- +- pcie_cap = pci_find_capability(tp->pdev, PCI_CAP_ID_EXP); +- if (pcie_cap != 0) { ++ tp->tg3_flags |= TG3_FLAG_JUMBO_CAPABLE; ++ ++ pci_read_config_dword(tp->pdev, TG3PCI_PCISTATE, ++ &pci_state_reg); ++ ++ tp->pcie_cap = pci_find_capability(tp->pdev, PCI_CAP_ID_EXP); ++ if (tp->pcie_cap != 0) { ++ u16 lnkctl; ++ + tp->tg3_flags2 |= TG3_FLG2_PCI_EXPRESS; + + pcie_set_readrq(tp->pdev, 4096); + +- if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) { +- u16 lnkctl; +- +- pci_read_config_word(tp->pdev, +- pcie_cap + PCI_EXP_LNKCTL, +- &lnkctl); +- if (lnkctl & PCI_EXP_LNKCTL_CLKREQ_EN) ++ pci_read_config_word(tp->pdev, ++ tp->pcie_cap + PCI_EXP_LNKCTL, ++ &lnkctl); ++ if (lnkctl & PCI_EXP_LNKCTL_CLKREQ_EN) { ++ if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) + tp->tg3_flags2 &= ~TG3_FLG2_HW_TSO_2; +- } ++ if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 || ++ GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5761 || ++ tp->pci_chip_rev_id == CHIPREV_ID_57780_A0 || ++ tp->pci_chip_rev_id == CHIPREV_ID_57780_A1) ++ tp->tg3_flags3 |= TG3_FLG3_CLKREQ_BUG; ++ } ++ } else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5785) { ++ tp->tg3_flags2 |= TG3_FLG2_PCI_EXPRESS; ++ } else if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS) || ++ (tp->tg3_flags2 & TG3_FLG2_5780_CLASS)) { ++ tp->pcix_cap = pci_find_capability(tp->pdev, PCI_CAP_ID_PCIX); ++ if (!tp->pcix_cap) { ++ printk(KERN_ERR PFX "Cannot find PCI-X " ++ "capability, aborting.\n"); ++ return -EIO; ++ } ++ ++ if (!(pci_state_reg & PCISTATE_CONV_PCI_MODE)) ++ tp->tg3_flags |= TG3_FLAG_PCIX_MODE; + } + + /* If we have an AMD 762 or VIA K8T800 chipset, write +@@ -12146,46 +12604,43 @@ + * every mailbox register write to force the writes to be + * posted to the chip in order. + */ ++#if (LINUX_VERSION_CODE < 0x2060a) ++ if ((pci_find_device(PCI_VENDOR_ID_AMD, ++ PCI_DEVICE_ID_AMD_FE_GATE_700C, NULL) || ++ pci_find_device(PCI_VENDOR_ID_AMD, ++ PCI_DEVICE_ID_AMD_8131_BRIDGE, NULL) || ++ pci_find_device(PCI_VENDOR_ID_VIA, ++ PCI_DEVICE_ID_VIA_8385_0, NULL)) && ++#else + if (pci_dev_present(write_reorder_chipsets) && ++#endif + !(tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS)) + tp->tg3_flags |= TG3_FLAG_MBOX_WRITE_REORDER; + ++ pci_read_config_byte(tp->pdev, PCI_CACHE_LINE_SIZE, ++ &tp->pci_cacheline_sz); ++ pci_read_config_byte(tp->pdev, PCI_LATENCY_TIMER, ++ &tp->pci_lat_timer); + if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703 && + tp->pci_lat_timer < 64) { + tp->pci_lat_timer = 64; + +- cacheline_sz_reg = ((tp->pci_cacheline_sz & 0xff) << 0); +- cacheline_sz_reg |= ((tp->pci_lat_timer & 0xff) << 8); +- cacheline_sz_reg |= ((tp->pci_hdr_type & 0xff) << 16); +- cacheline_sz_reg |= ((tp->pci_bist & 0xff) << 24); +- +- pci_write_config_dword(tp->pdev, TG3PCI_CACHELINESZ, +- cacheline_sz_reg); +- } +- +- if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS) || +- (tp->tg3_flags2 & TG3_FLG2_5780_CLASS)) { +- tp->pcix_cap = pci_find_capability(tp->pdev, PCI_CAP_ID_PCIX); +- if (!tp->pcix_cap) { +- printk(KERN_ERR PFX "Cannot find PCI-X " +- "capability, aborting.\n"); +- return -EIO; +- } +- } +- +- pci_read_config_dword(tp->pdev, TG3PCI_PCISTATE, +- &pci_state_reg); +- +- if (tp->pcix_cap && (pci_state_reg & PCISTATE_CONV_PCI_MODE) == 0) { +- tp->tg3_flags |= TG3_FLAG_PCIX_MODE; +- +- /* If this is a 5700 BX chipset, and we are in PCI-X +- * mode, enable register write workaround. ++ pci_write_config_byte(tp->pdev, PCI_LATENCY_TIMER, ++ tp->pci_lat_timer); ++ } ++ ++ if (GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5700_BX) { ++ /* 5700 BX chips need to have their TX producer index ++ * mailboxes written twice to workaround a bug. ++ */ ++ tp->tg3_flags |= TG3_FLAG_TXD_MBOX_HWBUG; ++ ++ /* If we are in PCI-X mode, enable register write workaround. + * + * The workaround is to use indirect register accesses + * for all chip writes not to mailbox registers. + */ +- if (GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5700_BX) { ++ if (tp->tg3_flags & TG3_FLAG_PCIX_MODE) { + u32 pm_reg; + + tp->tg3_flags |= TG3_FLAG_PCIX_TARGET_HWBUG; +@@ -12210,12 +12665,6 @@ + } + } + +- /* 5700 BX chips need to have their TX producer index mailboxes +- * written twice to workaround a bug. +- */ +- if (GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5700_BX) +- tp->tg3_flags |= TG3_FLAG_TXD_MBOX_HWBUG; +- + if ((pci_state_reg & PCISTATE_BUS_SPEED_HIGH) != 0) + tp->tg3_flags |= TG3_FLAG_PCI_HIGH_SPEED; + if ((pci_state_reg & PCISTATE_BUS_32BIT) != 0) +@@ -12309,17 +12758,10 @@ + } + + if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57780 || + GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5761 || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5785) { ++ GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5785 || ++ GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57780) + tp->tg3_flags |= TG3_FLAG_CPMU_PRESENT; +- +- if (tp->pci_chip_rev_id == CHIPREV_ID_5784_A0 || +- tp->pci_chip_rev_id == CHIPREV_ID_5784_A1 || +- tp->pci_chip_rev_id == CHIPREV_ID_5761_A0 || +- tp->pci_chip_rev_id == CHIPREV_ID_5761_A1) +- tp->tg3_flags3 |= TG3_FLG3_5761_5784_AX_FIXES; +- } + + /* Set up tp->grc_local_ctrl before calling tg3_set_power_state(). + * GPIO1 driven high will bring 5700's external PHY out of reset. +@@ -12336,10 +12778,12 @@ + else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5752) + tp->grc_local_ctrl |= GRC_LCLCTRL_GPIO_OE3; + +- if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755) ++ if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 || ++ GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57780) + tp->grc_local_ctrl |= GRC_LCLCTRL_GPIO_UART_SEL; + +- if (tp->pdev->device == PCI_DEVICE_ID_TIGON3_5761) { ++ if (tp->pdev->device == PCI_DEVICE_ID_TIGON3_5761 || ++ tp->pdev->device == TG3PCI_DEVICE_TIGON3_5761S) { + /* Turn off the debug UART. */ + tp->grc_local_ctrl |= GRC_LCLCTRL_GPIO_UART_SEL; + if (tp->tg3_flags2 & TG3_FLG2_IS_NIC) +@@ -12356,12 +12800,6 @@ + return err; + } + +- /* 5700 B0 chips do not support checksumming correctly due +- * to hardware bugs. +- */ +- if (tp->pci_chip_rev_id == CHIPREV_ID_5700_B0) +- tp->tg3_flags |= TG3_FLAG_BROKEN_CHECKSUMS; +- + /* Derive initial jumbo mode from MTU assigned in + * ether_setup() via the alloc_etherdev() call + */ +@@ -12379,12 +12817,17 @@ + tp->tg3_flags |= TG3_FLAG_WOL_SPEED_100MB; + } + ++ if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906 || ++ (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5785 && ++ (tp->phy_id & PHY_ID_MASK) == PHY_ID_BCMAC131)) ++ tp->tg3_flags3 |= TG3_FLG3_PHY_IS_FET; ++ + /* A few boards don't want Ethernet@WireSpeed phy feature */ + if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700) || + ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) && + (tp->pci_chip_rev_id != CHIPREV_ID_5705_A0) && + (tp->pci_chip_rev_id != CHIPREV_ID_5705_A1)) || +- (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) || ++ (tp->tg3_flags3 & TG3_FLG3_PHY_IS_FET) || + (tp->tg3_flags2 & TG3_FLG2_ANY_SERDES)) + tp->tg3_flags2 |= TG3_FLG2_NO_ETH_WIRE_SPEED; + +@@ -12394,19 +12837,20 @@ + if (tp->pci_chip_rev_id == CHIPREV_ID_5704_A0) + tp->tg3_flags2 |= TG3_FLG2_PHY_5704_A0_BUG; + +- if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS) { ++ if ((tp->tg3_flags2 & TG3_FLG2_5705_PLUS) && ++ !(tp->tg3_flags3 & TG3_FLG3_PHY_IS_FET) && ++ GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5785 && ++ GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_57780) { + if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 || + GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787 || + GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57780 || + GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5761) { + if (tp->pdev->device != PCI_DEVICE_ID_TIGON3_5756 && + tp->pdev->device != PCI_DEVICE_ID_TIGON3_5722) + tp->tg3_flags2 |= TG3_FLG2_PHY_JITTER_BUG; + if (tp->pdev->device == PCI_DEVICE_ID_TIGON3_5755M) + tp->tg3_flags2 |= TG3_FLG2_PHY_ADJUST_TRIM; +- } else if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5906 && +- GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5785) ++ } else + tp->tg3_flags2 |= TG3_FLG2_PHY_BER_BUG; + } + +@@ -12427,8 +12871,16 @@ + GET_CHIP_REV(tp->pci_chip_rev_id) != CHIPREV_5700_BX) + tp->coalesce_mode |= HOSTCC_MODE_32BYTE; + +- if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5785) ++#ifdef BCM_INCLUDE_PHYLIB_SUPPORT ++ if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5785 || ++ GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57780) + tp->tg3_flags3 |= TG3_FLG3_USE_PHYLIB; ++#endif ++ ++ if ((tp->pci_chip_rev_id == CHIPREV_ID_57780_A1 && ++ tr32(RCVLPC_STATS_ENABLE) & RCVLPC_STATSENAB_ASF_FIX) || ++ tp->pci_chip_rev_id == CHIPREV_ID_57780_A0) ++ tp->tg3_flags3 |= TG3_FLG3_TOGGLE_10_100_L1PLLPD; + + err = tg3_mdio_init(tp); + if (err) +@@ -12512,7 +12964,8 @@ + (tp->pdev->device == PCI_DEVICE_ID_TIGON3_5751F || + tp->pdev->device == PCI_DEVICE_ID_TIGON3_5753F || + tp->pdev->device == PCI_DEVICE_ID_TIGON3_5787F)) || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) ++ tp->pdev->device == TG3PCI_DEVICE_TIGON3_57790 || ++ (tp->tg3_flags3 & TG3_FLG3_PHY_IS_FET)) + tp->tg3_flags |= TG3_FLAG_10_100_ONLY; + + err = tg3_phy_probe(tp); +@@ -12561,24 +13014,15 @@ + else + tp->tg3_flags &= ~TG3_FLAG_POLL_SERDES; + +- /* All chips before 5787 can get confused if TX buffers +- * straddle the 4GB address boundary in some cases. +- */ +- if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787 || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57780 || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5761 || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5785 || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) +- tp->dev->hard_start_xmit = tg3_start_xmit; +- else +- tp->dev->hard_start_xmit = tg3_start_xmit_dma_bug; +- +- tp->rx_offset = 2; ++ tp->rx_offset = NET_IP_ALIGN + VLAN_HLEN; ++ tp->rx_copy_thresh = RX_COPY_THRESHOLD; + if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701 && +- (tp->tg3_flags & TG3_FLAG_PCIX_MODE) != 0) +- tp->rx_offset = 0; ++ (tp->tg3_flags & TG3_FLAG_PCIX_MODE) != 0) { ++ tp->rx_offset -= NET_IP_ALIGN; ++#ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS ++ tp->rx_copy_thresh = ~(u16)0; ++#endif ++ } + + tp->rx_std_max_post = TG3_RX_RING_SIZE; + +@@ -12666,14 +13110,11 @@ + } + if (!addr_ok) { + /* Next, try NVRAM. */ +- if (!tg3_nvram_read(tp, mac_offset + 0, &hi) && +- !tg3_nvram_read(tp, mac_offset + 4, &lo)) { +- dev->dev_addr[0] = ((hi >> 16) & 0xff); +- dev->dev_addr[1] = ((hi >> 24) & 0xff); +- dev->dev_addr[2] = ((lo >> 0) & 0xff); +- dev->dev_addr[3] = ((lo >> 8) & 0xff); +- dev->dev_addr[4] = ((lo >> 16) & 0xff); +- dev->dev_addr[5] = ((lo >> 24) & 0xff); ++ if (!(tp->tg3_flags3 & TG3_FLG3_NO_NVRAM) && ++ !tg3_nvram_read_be32(tp, mac_offset + 0, &hi) && ++ !tg3_nvram_read_be32(tp, mac_offset + 4, &lo)) { ++ memcpy(&dev->dev_addr[0], ((char *)&hi) + 2, 2); ++ memcpy(&dev->dev_addr[2], (char *)&lo, sizeof(lo)); + } + /* Finally just fetch it out of the MAC control regs. */ + else { +@@ -12696,7 +13137,9 @@ + #endif + return -EINVAL; + } ++#ifdef ETHTOOL_GPERMADDR + memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len); ++#endif + return 0; + } + +@@ -13083,17 +13526,25 @@ + } + if ((tp->dma_rwctrl & DMA_RWCTRL_WRITE_BNDRY_MASK) != + DMA_RWCTRL_WRITE_BNDRY_16) { ++#if (LINUX_VERSION_CODE >= 0x2060a) + static struct pci_device_id dma_wait_state_chipsets[] = { + { PCI_DEVICE(PCI_VENDOR_ID_APPLE, + PCI_DEVICE_ID_APPLE_UNI_N_PCI15) }, + { }, + }; ++#endif + + /* DMA test passed without adjusting DMA boundary, + * now look for chipsets that are known to expose the + * DMA bug without failing the test. + */ +- if (pci_dev_present(dma_wait_state_chipsets)) { ++#if (LINUX_VERSION_CODE < 0x2060a) ++ if (pci_find_device(PCI_VENDOR_ID_APPLE, ++ PCI_DEVICE_ID_APPLE_UNI_N_PCI15, NULL)) ++#else ++ if (pci_dev_present(dma_wait_state_chipsets)) ++#endif ++ { + tp->dma_rwctrl &= ~DMA_RWCTRL_WRITE_BNDRY_MASK; + tp->dma_rwctrl |= DMA_RWCTRL_WRITE_BNDRY_16; + } +@@ -13190,7 +13641,12 @@ + case PHY_ID_BCM5756: return "5722/5756"; + case PHY_ID_BCM5906: return "5906"; + case PHY_ID_BCM5761: return "5761"; ++#ifndef BCM_INCLUDE_PHYLIB_SUPPORT ++ case PHY_ID_BCM50610: return "50610"; ++ case PHY_ID_BCM50610M: return "50610M"; ++ case PHY_ID_BCMAC131: return "AC131"; + case PHY_ID_BCM57780: return "57780"; ++#endif + case PHY_ID_BCM8002: return "8002/serdes"; + case 0: return "serdes"; + default: return "unknown"; +@@ -13292,12 +13748,50 @@ + } + } + ++#ifdef HAVE_NET_DEVICE_OPS ++static const struct net_device_ops tg3_netdev_ops = { ++ .ndo_open = tg3_open, ++ .ndo_stop = tg3_close, ++ .ndo_start_xmit = tg3_start_xmit, ++ .ndo_get_stats = tg3_get_stats, ++ .ndo_validate_addr = eth_validate_addr, ++ .ndo_set_multicast_list = tg3_set_rx_mode, ++ .ndo_set_mac_address = tg3_set_mac_addr, ++ .ndo_do_ioctl = tg3_ioctl, ++ .ndo_tx_timeout = tg3_tx_timeout, ++ .ndo_change_mtu = tg3_change_mtu, ++#if TG3_VLAN_TAG_USED ++ .ndo_vlan_rx_register = tg3_vlan_rx_register, ++#endif ++#ifdef CONFIG_NET_POLL_CONTROLLER ++ .ndo_poll_controller = tg3_poll_controller, ++#endif ++}; ++ ++static const struct net_device_ops tg3_netdev_ops_dma_bug = { ++ .ndo_open = tg3_open, ++ .ndo_stop = tg3_close, ++ .ndo_start_xmit = tg3_start_xmit_dma_bug, ++ .ndo_get_stats = tg3_get_stats, ++ .ndo_validate_addr = eth_validate_addr, ++ .ndo_set_multicast_list = tg3_set_rx_mode, ++ .ndo_set_mac_address = tg3_set_mac_addr, ++ .ndo_do_ioctl = tg3_ioctl, ++ .ndo_tx_timeout = tg3_tx_timeout, ++ .ndo_change_mtu = tg3_change_mtu, ++#if TG3_VLAN_TAG_USED ++ .ndo_vlan_rx_register = tg3_vlan_rx_register, ++#endif ++#ifdef CONFIG_NET_POLL_CONTROLLER ++ .ndo_poll_controller = tg3_poll_controller, ++#endif ++}; ++#endif /* HAVE_NET_DEVICE_OPS */ ++ + static int __devinit tg3_init_one(struct pci_dev *pdev, + const struct pci_device_id *ent) + { + static int tg3_version_printed = 0; +- resource_size_t tg3reg_base; +- unsigned long tg3reg_len; + struct net_device *dev; + struct tg3 *tp; + int err, pm_cap; +@@ -13313,13 +13807,6 @@ + printk(KERN_ERR PFX "Cannot enable PCI device, " + "aborting.\n"); + return err; +- } +- +- if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM)) { +- printk(KERN_ERR PFX "Cannot find proper PCI device " +- "base address, aborting.\n"); +- err = -ENODEV; +- goto err_out_disable_pdev; + } + + err = pci_request_regions(pdev, DRV_MODULE_NAME); +@@ -13340,9 +13827,6 @@ + goto err_out_free_res; + } + +- tg3reg_base = pci_resource_start(pdev, 0); +- tg3reg_len = pci_resource_len(pdev, 0); +- + dev = alloc_etherdev(sizeof(*tp)); + if (!dev) { + printk(KERN_ERR PFX "Etherdev alloc failed, aborting.\n"); +@@ -13350,11 +13834,13 @@ + goto err_out_free_res; + } + ++ SET_MODULE_OWNER(dev); ++#if (LINUX_VERSION_CODE >= 0x20419) + SET_NETDEV_DEV(dev, &pdev->dev); ++#endif + + #if TG3_VLAN_TAG_USED + dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX; +- dev->vlan_rx_register = tg3_vlan_rx_register; + #endif + + tp = netdev_priv(dev); +@@ -13392,9 +13878,13 @@ + #endif + spin_lock_init(&tp->lock); + spin_lock_init(&tp->indirect_lock); ++#ifdef BCM_HAS_NEW_INIT_WORK + INIT_WORK(&tp->reset_task, tg3_reset_task); +- +- tp->regs = ioremap_nocache(tg3reg_base, tg3reg_len); ++#else ++ INIT_WORK(&tp->reset_task, tg3_reset_task, tp); ++#endif ++ ++ tp->regs = pci_ioremap_bar(pdev, BAR_0); + if (!tp->regs) { + printk(KERN_ERR PFX "Cannot map device registers, " + "aborting.\n"); +@@ -13408,21 +13898,15 @@ + tp->rx_jumbo_pending = TG3_DEF_RX_JUMBO_RING_PENDING; + tp->tx_pending = TG3_DEF_TX_RING_PENDING; + +- dev->open = tg3_open; +- dev->stop = tg3_close; +- dev->get_stats = tg3_get_stats; +- dev->set_multicast_list = tg3_set_rx_mode; +- dev->set_mac_address = tg3_set_mac_addr; +- dev->do_ioctl = tg3_ioctl; +- dev->tx_timeout = tg3_tx_timeout; ++#ifdef TG3_NAPI + netif_napi_add(dev, &tp->napi, tg3_poll, 64); ++#else ++ dev->poll = tg3_poll; ++ dev->weight = 64; ++#endif + dev->ethtool_ops = &tg3_ethtool_ops; + dev->watchdog_timeo = TG3_TX_TIMEOUT; +- dev->change_mtu = tg3_change_mtu; + dev->irq = pdev->irq; +-#ifdef CONFIG_NET_POLL_CONTROLLER +- dev->poll_controller = tg3_poll_controller; +-#endif + + err = tg3_get_invariants(tp); + if (err) { +@@ -13431,6 +13915,39 @@ + goto err_out_iounmap; + } + ++#ifdef HAVE_NET_DEVICE_OPS ++ if ((tp->tg3_flags3 & TG3_FLG3_5755_PLUS) || ++ GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) ++ dev->netdev_ops = &tg3_netdev_ops; ++ else ++ dev->netdev_ops = &tg3_netdev_ops_dma_bug; ++#else ++ dev->open = tg3_open; ++ dev->stop = tg3_close; ++ dev->get_stats = tg3_get_stats; ++ dev->set_multicast_list = tg3_set_rx_mode; ++ dev->set_mac_address = tg3_set_mac_addr; ++ dev->do_ioctl = tg3_ioctl; ++ dev->tx_timeout = tg3_tx_timeout; ++ dev->change_mtu = tg3_change_mtu; ++#if TG3_VLAN_TAG_USED ++ dev->vlan_rx_register = tg3_vlan_rx_register; ++ dev->vlan_rx_kill_vid = tg3_vlan_rx_kill_vid; ++#endif ++#ifdef CONFIG_NET_POLL_CONTROLLER ++ dev->poll_controller = tg3_poll_controller; ++#endif ++ ++ /* All chips before 5787 can get confused if TX buffers ++ * straddle the 4GB address boundary in some cases. ++ */ ++ if ((tp->tg3_flags3 & TG3_FLG3_5755_PLUS) || ++ GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) ++ tp->dev->hard_start_xmit = tg3_start_xmit; ++ else ++ tp->dev->hard_start_xmit = tg3_start_xmit_dma_bug; ++#endif ++ + /* The EPB bridge inside 5714, 5715, and 5780 and any + * device behind the EPB cannot support DMA addresses > 40-bit. + * On 64-bit systems with IOMMU, use 40-bit dma_mask. +@@ -13438,17 +13955,17 @@ + * do DMA address check in tg3_start_xmit(). + */ + if (tp->tg3_flags2 & TG3_FLG2_IS_5788) +- persist_dma_mask = dma_mask = DMA_32BIT_MASK; ++ persist_dma_mask = dma_mask = DMA_BIT_MASK(32); + else if (tp->tg3_flags & TG3_FLAG_40BIT_DMA_BUG) { +- persist_dma_mask = dma_mask = DMA_40BIT_MASK; ++ persist_dma_mask = dma_mask = DMA_BIT_MASK(40); + #ifdef CONFIG_HIGHMEM +- dma_mask = DMA_64BIT_MASK; ++ dma_mask = DMA_BIT_MASK(64); + #endif + } else +- persist_dma_mask = dma_mask = DMA_64BIT_MASK; ++ persist_dma_mask = dma_mask = DMA_BIT_MASK(64); + + /* Configure DMA attributes. */ +- if (dma_mask > DMA_32BIT_MASK) { ++ if (dma_mask > DMA_BIT_MASK(32)) { + err = pci_set_dma_mask(pdev, dma_mask); + if (!err) { + dev->features |= NETIF_F_HIGHDMA; +@@ -13461,8 +13978,8 @@ + } + } + } +- if (err || dma_mask == DMA_32BIT_MASK) { +- err = pci_set_dma_mask(pdev, DMA_32BIT_MASK); ++ if (err || dma_mask == DMA_BIT_MASK(32)) { ++ err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32)); + if (err) { + printk(KERN_ERR PFX "No usable DMA configuration, " + "aborting.\n"); +@@ -13472,6 +13989,10 @@ + + tg3_init_bufmgr_config(tp); + ++ if (tp->pci_chip_rev_id == CHIPREV_ID_5701_A0) ++ tp->fw_needed = FIRMWARE_TG3; ++ ++#if TG3_TSO_SUPPORT != 0 + if (tp->tg3_flags2 & TG3_FLG2_HW_TSO) { + tp->tg3_flags2 |= TG3_FLG2_TSO_CAPABLE; + } +@@ -13483,6 +14004,10 @@ + tp->tg3_flags2 &= ~TG3_FLG2_TSO_CAPABLE; + } else { + tp->tg3_flags2 |= TG3_FLG2_TSO_CAPABLE | TG3_FLG2_TSO_BUG; ++ if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) ++ tp->fw_needed = FIRMWARE_TG3TSO5; ++ else ++ tp->fw_needed = FIRMWARE_TG3TSO; + } + + /* TSO is on by default on chips that support hardware TSO. +@@ -13490,18 +14015,20 @@ + * is off by default, but can be enabled using ethtool. + */ + if (tp->tg3_flags2 & TG3_FLG2_HW_TSO) { +- dev->features |= NETIF_F_TSO; +- if ((tp->tg3_flags2 & TG3_FLG2_HW_TSO_2) && +- (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5906)) ++ if (dev->features & NETIF_F_IP_CSUM) ++ dev->features |= NETIF_F_TSO; ++ if ((dev->features & NETIF_F_IPV6_CSUM) && ++ (tp->tg3_flags2 & TG3_FLG2_HW_TSO_2)) + dev->features |= NETIF_F_TSO6; + if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5761 || + (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 && + GET_CHIP_REV(tp->pci_chip_rev_id) != CHIPREV_5784_AX) || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57780 || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5785) ++ GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5785 || ++ GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57780) + dev->features |= NETIF_F_TSO_ECN; + } + ++#endif + + if (tp->pci_chip_rev_id == CHIPREV_ID_5705_A1 && + !(tp->tg3_flags2 & TG3_FLG2_TSO_CAPABLE) && +@@ -13518,17 +14045,7 @@ + } + + if (tp->tg3_flags3 & TG3_FLG3_ENABLE_APE) { +- if (!(pci_resource_flags(pdev, 2) & IORESOURCE_MEM)) { +- printk(KERN_ERR PFX "Cannot find proper PCI device " +- "base address for APE, aborting.\n"); +- err = -ENODEV; +- goto err_out_iounmap; +- } +- +- tg3reg_base = pci_resource_start(pdev, 2); +- tg3reg_len = pci_resource_len(pdev, 2); +- +- tp->aperegs = ioremap_nocache(tg3reg_base, tg3reg_len); ++ tp->aperegs = pci_ioremap_bar(pdev, BAR_2); + if (!tp->aperegs) { + printk(KERN_ERR PFX "Cannot map APE registers, " + "aborting.\n"); +@@ -13537,6 +14054,9 @@ + } + + tg3_ape_lock_init(tp); ++ ++ if (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) ++ tg3_read_dash_ver(tp); + } + + /* +@@ -13556,26 +14076,9 @@ + goto err_out_apeunmap; + } + +- /* Tigon3 can do ipv4 only... and some chips have buggy +- * checksumming. +- */ +- if ((tp->tg3_flags & TG3_FLAG_BROKEN_CHECKSUMS) == 0) { +- dev->features |= NETIF_F_IP_CSUM | NETIF_F_SG; +- if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787 || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57780 || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5761 || +- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5785) +- dev->features |= NETIF_F_IPV6_CSUM; +- +- tp->tg3_flags |= TG3_FLAG_RX_CHECKSUMS; +- } else +- tp->tg3_flags &= ~TG3_FLAG_RX_CHECKSUMS; +- + /* flow control autonegotiation is default behavior */ + tp->tg3_flags |= TG3_FLAG_PAUSE_AUTONEG; +- tp->link_config.flowctrl = TG3_FLOW_CTRL_TX | TG3_FLOW_CTRL_RX; ++ tp->link_config.flowctrl = FLOW_CTRL_TX | FLOW_CTRL_RX; + + tg3_init_coal(tp); + +@@ -13588,31 +14091,41 @@ + goto err_out_apeunmap; + } + +- printk(KERN_INFO "%s: Tigon3 [partno(%s) rev %04x PHY(%s)] " +- "(%s) %s Ethernet %s\n", ++ printk(KERN_INFO "%s: Tigon3 [partno(%s) rev %04x] (%s) MAC address %s\n", + dev->name, + tp->board_part_number, + tp->pci_chip_rev_id, +- tg3_phy_string(tp), + tg3_bus_string(tp, str), +- ((tp->tg3_flags & TG3_FLAG_10_100_ONLY) ? "10/100Base-TX" : +- ((tp->tg3_flags2 & TG3_FLG2_ANY_SERDES) ? "1000Base-SX" : +- "10/100/1000Base-T")), + print_mac(mac, dev->dev_addr)); + +- printk(KERN_INFO "%s: RXcsums[%d] LinkChgREG[%d] " +- "MIirq[%d] ASF[%d] WireSpeed[%d] TSOcap[%d]\n", ++#ifdef BCM_INCLUDE_PHYLIB_SUPPORT ++ if (tp->tg3_flags3 & TG3_FLG3_PHY_CONNECTED) ++ printk(KERN_INFO ++ "%s: attached PHY driver [%s] (mii_bus:phy_addr=%s)\n", ++ tp->dev->name, ++ tp->mdio_bus->phy_map[PHY_ADDR]->drv->name, ++ dev_name(&tp->mdio_bus->phy_map[PHY_ADDR]->dev)); ++ else ++#endif ++ printk(KERN_INFO ++ "%s: attached PHY is %s (%s Ethernet) (WireSpeed[%d])\n", ++ tp->dev->name, tg3_phy_string(tp), ++ ((tp->tg3_flags & TG3_FLAG_10_100_ONLY) ? "10/100Base-TX" : ++ ((tp->tg3_flags2 & TG3_FLG2_ANY_SERDES) ? "1000Base-SX" : ++ "10/100/1000Base-T")), ++ (tp->tg3_flags2 & TG3_FLG2_NO_ETH_WIRE_SPEED) == 0); ++ ++ printk(KERN_INFO "%s: RXcsums[%d] LinkChgREG[%d] MIirq[%d] ASF[%d] TSOcap[%d]\n", + dev->name, + (tp->tg3_flags & TG3_FLAG_RX_CHECKSUMS) != 0, + (tp->tg3_flags & TG3_FLAG_USE_LINKCHG_REG) != 0, + (tp->tg3_flags & TG3_FLAG_USE_MI_INTERRUPT) != 0, + (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) != 0, +- (tp->tg3_flags2 & TG3_FLG2_NO_ETH_WIRE_SPEED) == 0, + (tp->tg3_flags2 & TG3_FLG2_TSO_CAPABLE) != 0); + printk(KERN_INFO "%s: dma_rwctrl[%08x] dma_mask[%d-bit]\n", + dev->name, tp->dma_rwctrl, +- (pdev->dma_mask == DMA_32BIT_MASK) ? 32 : +- (((u64) pdev->dma_mask == DMA_40BIT_MASK) ? 40 : 64)); ++ (pdev->dma_mask == DMA_BIT_MASK(32)) ? 32 : ++ (((u64) pdev->dma_mask == DMA_BIT_MASK(40)) ? 40 : 64)); + + return 0; + +@@ -13629,7 +14142,11 @@ + } + + err_out_free_dev: ++#if (LINUX_VERSION_CODE >= 0x20418) + free_netdev(dev); ++#else ++ kfree(dev); ++#endif + + err_out_free_res: + pci_release_regions(pdev); +@@ -13647,7 +14164,12 @@ + if (dev) { + struct tg3 *tp = netdev_priv(dev); + ++ if (tp->fw) ++ tg3_priv_release_firmware(tp->fw); ++ ++#if (LINUX_VERSION_CODE >= 0x20600) + flush_scheduled_work(); ++#endif + + if (tp->tg3_flags3 & TG3_FLG3_USE_PHYLIB) { + tg3_phy_fini(tp); +@@ -13663,14 +14185,22 @@ + iounmap(tp->regs); + tp->regs = NULL; + } ++#if (LINUX_VERSION_CODE >= 0x20418) + free_netdev(dev); ++#else ++ kfree(dev); ++#endif + pci_release_regions(pdev); + pci_disable_device(pdev); + pci_set_drvdata(pdev, NULL); + } + } + ++#if (LINUX_VERSION_CODE < 0x2060b) ++static int tg3_suspend(struct pci_dev *pdev, u32 state) ++#else + static int tg3_suspend(struct pci_dev *pdev, pm_message_t state) ++#endif + { + struct net_device *dev = pci_get_drvdata(pdev); + struct tg3 *tp = netdev_priv(dev); +@@ -13681,12 +14211,18 @@ + * MSI address and data need to be saved if using MSI and + * netif_running(). + */ ++#if (LINUX_VERSION_CODE < 0x2060a) ++ pci_save_state(pdev, tp->pci_cfg_state); ++#else + pci_save_state(pdev); ++#endif + + if (!netif_running(dev)) + return 0; + ++#if (LINUX_VERSION_CODE >= 0x20600) + flush_scheduled_work(); ++#endif + tg3_phy_stop(tp); + tg3_netif_stop(tp); + +@@ -13703,7 +14239,11 @@ + tp->tg3_flags &= ~TG3_FLAG_INIT_COMPLETE; + tg3_full_unlock(tp); + ++#ifdef BCM_HAS_PCI_TARGET_STATE + target_state = pdev->pm_cap ? pci_target_state(pdev) : PCI_D3hot; ++#else ++ target_state = pci_choose_state(pdev, state); ++#endif + + err = tg3_set_power_state(tp, target_state); + if (err) { +@@ -13738,7 +14278,11 @@ + struct tg3 *tp = netdev_priv(dev); + int err; + ++#if (LINUX_VERSION_CODE < 0x2060a) ++ pci_restore_state(tp->pdev, tp->pci_cfg_state); ++#else + pci_restore_state(tp->pdev); ++#endif + + if (!netif_running(dev)) + return 0; +@@ -13746,6 +14290,13 @@ + err = tg3_set_power_state(tp, PCI_D0); + if (err) + return err; ++ ++#ifndef BCM_HAS_INTX_MSI_WORKAROUND ++ /* Hardware bug - MSI won't work if INTX disabled. */ ++ if ((tp->tg3_flags2 & TG3_FLG2_5780_CLASS) && ++ (tp->tg3_flags2 & TG3_FLG2_USING_MSI)) ++ tg3_enable_intx(tp->pdev); ++#endif + + netif_device_attach(dev); + +@@ -13781,7 +14332,11 @@ + + static int __init tg3_init(void) + { ++#if (LINUX_VERSION_CODE < 0x020613) ++ return pci_module_init(&tg3_driver); ++#else + return pci_register_driver(&tg3_driver); ++#endif + } + + static void __exit tg3_cleanup(void) +diff -r 30b17b8c7526 drivers/net/tg3.h +--- a/drivers/net/tg3.h Mon Jun 15 14:53:57 2009 +0100 ++++ b/drivers/net/tg3.h Mon Jun 15 17:05:21 2009 +0100 +@@ -8,6 +8,8 @@ + + #ifndef _T3_H + #define _T3_H ++ ++#include "tg3_compat.h" + + #define TG3_64BIT_REG_HIGH 0x00UL + #define TG3_64BIT_REG_LOW 0x04UL +@@ -22,7 +24,7 @@ + #define TG3_BDINFO_NIC_ADDR 0xcUL /* 32-bit */ + #define TG3_BDINFO_SIZE 0x10UL + +-#define RX_COPY_THRESHOLD 256 ++#define RX_COPY_THRESHOLD 256 + + #define TG3_RX_INTERNAL_RING_SZ_5906 32 + +@@ -38,30 +40,15 @@ + #define TG3PCI_DEVICE_TIGON3_2 0x1645 /* BCM5701 */ + #define TG3PCI_DEVICE_TIGON3_3 0x1646 /* BCM5702 */ + #define TG3PCI_DEVICE_TIGON3_4 0x1647 /* BCM5703 */ ++#define TG3PCI_DEVICE_TIGON3_5761S 0x1688 ++#define TG3PCI_DEVICE_TIGON3_5761SE 0x1689 + #define TG3PCI_DEVICE_TIGON3_57780 0x1692 + #define TG3PCI_DEVICE_TIGON3_57760 0x1690 + #define TG3PCI_DEVICE_TIGON3_57790 0x1694 + #define TG3PCI_DEVICE_TIGON3_57720 0x168c +-#define TG3PCI_COMMAND 0x00000004 +-#define TG3PCI_STATUS 0x00000006 +-#define TG3PCI_CCREVID 0x00000008 +-#define TG3PCI_CACHELINESZ 0x0000000c +-#define TG3PCI_LATTIMER 0x0000000d +-#define TG3PCI_HEADERTYPE 0x0000000e +-#define TG3PCI_BIST 0x0000000f +-#define TG3PCI_BASE0_LOW 0x00000010 +-#define TG3PCI_BASE0_HIGH 0x00000014 +-/* 0x18 --> 0x2c unused */ +-#define TG3PCI_SUBSYSVENID 0x0000002c +-#define TG3PCI_SUBSYSID 0x0000002e +-#define TG3PCI_ROMADDR 0x00000030 +-#define TG3PCI_CAPLIST 0x00000034 +-/* 0x35 --> 0x3c unused */ +-#define TG3PCI_IRQ_LINE 0x0000003c +-#define TG3PCI_IRQ_PIN 0x0000003d +-#define TG3PCI_MIN_GNT 0x0000003e +-#define TG3PCI_MAX_LAT 0x0000003f +-/* 0x40 --> 0x64 unused */ ++#define TG3PCI_DEVICE_TIGON3_5785_G 0x1699 /* GPHY */ ++#define TG3PCI_DEVICE_TIGON3_5785_F 0x16a0 /* 10/100 only */ ++/* 0x04 --> 0x64 unused */ + #define TG3PCI_MSI_DATA 0x00000064 + /* 0x66 --> 0x68 unused */ + #define TG3PCI_MISC_HOST_CTRL 0x00000068 +@@ -112,10 +99,8 @@ + #define CHIPREV_ID_5752_A1 0x6001 + #define CHIPREV_ID_5714_A2 0x9002 + #define CHIPREV_ID_5906_A1 0xc001 +-#define CHIPREV_ID_5784_A0 0x5784000 +-#define CHIPREV_ID_5784_A1 0x5784001 +-#define CHIPREV_ID_5761_A0 0x5761000 +-#define CHIPREV_ID_5761_A1 0x5761001 ++#define CHIPREV_ID_57780_A0 0x57780000 ++#define CHIPREV_ID_57780_A1 0x57780001 + #define GET_ASIC_REV(CHIP_REV_ID) ((CHIP_REV_ID) >> 12) + #define ASIC_REV_5700 0x07 + #define ASIC_REV_5701 0x00 +@@ -330,6 +315,7 @@ + #define MAC_MODE_TDE_ENABLE 0x00200000 + #define MAC_MODE_RDE_ENABLE 0x00400000 + #define MAC_MODE_FHDE_ENABLE 0x00800000 ++#define MAC_MODE_KEEP_FRAME_IN_WOL 0x01000000 + #define MAC_MODE_APE_RX_EN 0x08000000 + #define MAC_MODE_APE_TX_EN 0x10000000 + #define MAC_STATUS 0x00000404 +@@ -419,6 +405,7 @@ + #define MI_COM_DATA_MASK 0x0000ffff + #define MAC_MI_STAT 0x00000450 + #define MAC_MI_STAT_LNKSTAT_ATTN_ENAB 0x00000001 ++#define MAC_MI_STAT_10MBPS_MODE 0x00000002 + #define MAC_MI_MODE 0x00000454 + #define MAC_MI_MODE_CLK_10MHZ 0x00000001 + #define MAC_MI_MODE_SHORT_PREAMBLE 0x00000002 +@@ -539,11 +526,109 @@ + /* 0x598 --> 0x5a0 unused */ + #define MAC_PHYCFG1 0x000005a0 + #define MAC_PHYCFG1_RGMII_INT 0x00000001 ++#define MAC_PHYCFG1_RXCLK_TO_MASK 0x00001ff0 ++#define MAC_PHYCFG1_RXCLK_TIMEOUT 0x00001000 ++#define MAC_PHYCFG1_TXCLK_TO_MASK 0x01ff0000 ++#define MAC_PHYCFG1_TXCLK_TIMEOUT 0x01000000 + #define MAC_PHYCFG1_RGMII_EXT_RX_DEC 0x02000000 + #define MAC_PHYCFG1_RGMII_SND_STAT_EN 0x04000000 + #define MAC_PHYCFG1_TXC_DRV 0x20000000 + #define MAC_PHYCFG2 0x000005a4 + #define MAC_PHYCFG2_INBAND_ENABLE 0x00000001 ++#define MAC_PHYCFG2_EMODE_MASK_MASK 0x000001c0 ++#define MAC_PHYCFG2_EMODE_MASK_AC131 0x000000c0 ++#define MAC_PHYCFG2_EMODE_MASK_50610 0x00000100 ++#define MAC_PHYCFG2_EMODE_MASK_RT8211 0x00000000 ++#define MAC_PHYCFG2_EMODE_MASK_RT8201 0x000001c0 ++#define MAC_PHYCFG2_EMODE_COMP_MASK 0x00000e00 ++#define MAC_PHYCFG2_EMODE_COMP_AC131 0x00000600 ++#define MAC_PHYCFG2_EMODE_COMP_50610 0x00000400 ++#define MAC_PHYCFG2_EMODE_COMP_RT8211 0x00000800 ++#define MAC_PHYCFG2_EMODE_COMP_RT8201 0x00000000 ++#define MAC_PHYCFG2_FMODE_MASK_MASK 0x00007000 ++#define MAC_PHYCFG2_FMODE_MASK_AC131 0x00006000 ++#define MAC_PHYCFG2_FMODE_MASK_50610 0x00004000 ++#define MAC_PHYCFG2_FMODE_MASK_RT8211 0x00000000 ++#define MAC_PHYCFG2_FMODE_MASK_RT8201 0x00007000 ++#define MAC_PHYCFG2_FMODE_COMP_MASK 0x00038000 ++#define MAC_PHYCFG2_FMODE_COMP_AC131 0x00030000 ++#define MAC_PHYCFG2_FMODE_COMP_50610 0x00008000 ++#define MAC_PHYCFG2_FMODE_COMP_RT8211 0x00038000 ++#define MAC_PHYCFG2_FMODE_COMP_RT8201 0x00000000 ++#define MAC_PHYCFG2_GMODE_MASK_MASK 0x001c0000 ++#define MAC_PHYCFG2_GMODE_MASK_AC131 0x001c0000 ++#define MAC_PHYCFG2_GMODE_MASK_50610 0x00100000 ++#define MAC_PHYCFG2_GMODE_MASK_RT8211 0x00000000 ++#define MAC_PHYCFG2_GMODE_MASK_RT8201 0x001c0000 ++#define MAC_PHYCFG2_GMODE_COMP_MASK 0x00e00000 ++#define MAC_PHYCFG2_GMODE_COMP_AC131 0x00e00000 ++#define MAC_PHYCFG2_GMODE_COMP_50610 0x00000000 ++#define MAC_PHYCFG2_GMODE_COMP_RT8211 0x00200000 ++#define MAC_PHYCFG2_GMODE_COMP_RT8201 0x00000000 ++#define MAC_PHYCFG2_ACT_MASK_MASK 0x03000000 ++#define MAC_PHYCFG2_ACT_MASK_AC131 0x03000000 ++#define MAC_PHYCFG2_ACT_MASK_50610 0x01000000 ++#define MAC_PHYCFG2_ACT_MASK_RT8211 0x03000000 ++#define MAC_PHYCFG2_ACT_MASK_RT8201 0x01000000 ++#define MAC_PHYCFG2_ACT_COMP_MASK 0x0c000000 ++#define MAC_PHYCFG2_ACT_COMP_AC131 0x00000000 ++#define MAC_PHYCFG2_ACT_COMP_50610 0x00000000 ++#define MAC_PHYCFG2_ACT_COMP_RT8211 0x00000000 ++#define MAC_PHYCFG2_ACT_COMP_RT8201 0x08000000 ++#define MAC_PHYCFG2_QUAL_MASK_MASK 0x30000000 ++#define MAC_PHYCFG2_QUAL_MASK_AC131 0x30000000 ++#define MAC_PHYCFG2_QUAL_MASK_50610 0x30000000 ++#define MAC_PHYCFG2_QUAL_MASK_RT8211 0x30000000 ++#define MAC_PHYCFG2_QUAL_MASK_RT8201 0x30000000 ++#define MAC_PHYCFG2_QUAL_COMP_MASK 0xc0000000 ++#define MAC_PHYCFG2_QUAL_COMP_AC131 0x00000000 ++#define MAC_PHYCFG2_QUAL_COMP_50610 0x00000000 ++#define MAC_PHYCFG2_QUAL_COMP_RT8211 0x00000000 ++#define MAC_PHYCFG2_QUAL_COMP_RT8201 0x00000000 ++#define MAC_PHYCFG2_50610_LED_MODES \ ++ (MAC_PHYCFG2_EMODE_MASK_50610 | \ ++ MAC_PHYCFG2_EMODE_COMP_50610 | \ ++ MAC_PHYCFG2_FMODE_MASK_50610 | \ ++ MAC_PHYCFG2_FMODE_COMP_50610 | \ ++ MAC_PHYCFG2_GMODE_MASK_50610 | \ ++ MAC_PHYCFG2_GMODE_COMP_50610 | \ ++ MAC_PHYCFG2_ACT_MASK_50610 | \ ++ MAC_PHYCFG2_ACT_COMP_50610 | \ ++ MAC_PHYCFG2_QUAL_MASK_50610 | \ ++ MAC_PHYCFG2_QUAL_COMP_50610) ++#define MAC_PHYCFG2_AC131_LED_MODES \ ++ (MAC_PHYCFG2_EMODE_MASK_AC131 | \ ++ MAC_PHYCFG2_EMODE_COMP_AC131 | \ ++ MAC_PHYCFG2_FMODE_MASK_AC131 | \ ++ MAC_PHYCFG2_FMODE_COMP_AC131 | \ ++ MAC_PHYCFG2_GMODE_MASK_AC131 | \ ++ MAC_PHYCFG2_GMODE_COMP_AC131 | \ ++ MAC_PHYCFG2_ACT_MASK_AC131 | \ ++ MAC_PHYCFG2_ACT_COMP_AC131 | \ ++ MAC_PHYCFG2_QUAL_MASK_AC131 | \ ++ MAC_PHYCFG2_QUAL_COMP_AC131) ++#define MAC_PHYCFG2_RTL8211C_LED_MODES \ ++ (MAC_PHYCFG2_EMODE_MASK_RT8211 | \ ++ MAC_PHYCFG2_EMODE_COMP_RT8211 | \ ++ MAC_PHYCFG2_FMODE_MASK_RT8211 | \ ++ MAC_PHYCFG2_FMODE_COMP_RT8211 | \ ++ MAC_PHYCFG2_GMODE_MASK_RT8211 | \ ++ MAC_PHYCFG2_GMODE_COMP_RT8211 | \ ++ MAC_PHYCFG2_ACT_MASK_RT8211 | \ ++ MAC_PHYCFG2_ACT_COMP_RT8211 | \ ++ MAC_PHYCFG2_QUAL_MASK_RT8211 | \ ++ MAC_PHYCFG2_QUAL_COMP_RT8211) ++#define MAC_PHYCFG2_RTL8201E_LED_MODES \ ++ (MAC_PHYCFG2_EMODE_MASK_RT8201 | \ ++ MAC_PHYCFG2_EMODE_COMP_RT8201 | \ ++ MAC_PHYCFG2_FMODE_MASK_RT8201 | \ ++ MAC_PHYCFG2_FMODE_COMP_RT8201 | \ ++ MAC_PHYCFG2_GMODE_MASK_RT8201 | \ ++ MAC_PHYCFG2_GMODE_COMP_RT8201 | \ ++ MAC_PHYCFG2_ACT_MASK_RT8201 | \ ++ MAC_PHYCFG2_ACT_COMP_RT8201 | \ ++ MAC_PHYCFG2_QUAL_MASK_RT8201 | \ ++ MAC_PHYCFG2_QUAL_COMP_RT8201) + #define MAC_EXT_RGMII_MODE 0x000005a8 + #define MAC_RGMII_MODE_TX_ENABLE 0x00000001 + #define MAC_RGMII_MODE_TX_LOWPWR 0x00000002 +@@ -787,6 +872,7 @@ + #define RCVLPC_STATSCTRL_ENABLE 0x00000001 + #define RCVLPC_STATSCTRL_FASTUPD 0x00000002 + #define RCVLPC_STATS_ENABLE 0x00002018 ++#define RCVLPC_STATSENAB_ASF_FIX 0x00000002 + #define RCVLPC_STATSENAB_DACK_FIX 0x00040000 + #define RCVLPC_STATSENAB_LNGBRST_RFIX 0x00400000 + #define RCVLPC_STATS_INCMASK 0x0000201c +@@ -1109,6 +1195,8 @@ + #define RDMAC_MODE_MBUF_SBD_CRPT_ENAB 0x00002000 + #define RDMAC_MODE_FIFO_SIZE_128 0x00020000 + #define RDMAC_MODE_FIFO_LONG_BURST 0x00030000 ++#define RDMAC_MODE_IPV4_LSO_EN 0x08000000 ++#define RDMAC_MODE_IPV6_LSO_EN 0x10000000 + #define RDMAC_STATUS 0x00004804 + #define RDMAC_STATUS_TGTABORT 0x00000004 + #define RDMAC_STATUS_MSTABORT 0x00000008 +@@ -1555,6 +1643,12 @@ + #define FLASH_5761VENDOR_ST_A_M45PE40 0x02000000 + #define FLASH_5761VENDOR_ST_A_M45PE80 0x02000002 + #define FLASH_5761VENDOR_ST_A_M45PE16 0x02000003 ++#define FLASH_57780VENDOR_ATMEL_AT45DB011D 0x00400000 ++#define FLASH_57780VENDOR_ATMEL_AT45DB011B 0x03400000 ++#define FLASH_57780VENDOR_ATMEL_AT45DB021D 0x00400002 ++#define FLASH_57780VENDOR_ATMEL_AT45DB021B 0x03400002 ++#define FLASH_57780VENDOR_ATMEL_AT45DB041D 0x00400001 ++#define FLASH_57780VENDOR_ATMEL_AT45DB041B 0x03400001 + #define NVRAM_CFG1_5752PAGE_SIZE_MASK 0x70000000 + #define FLASH_5752PAGE_SIZE_256 0x00000000 + #define FLASH_5752PAGE_SIZE_512 0x10000000 +@@ -1562,6 +1656,7 @@ + #define FLASH_5752PAGE_SIZE_2K 0x30000000 + #define FLASH_5752PAGE_SIZE_4K 0x40000000 + #define FLASH_5752PAGE_SIZE_264 0x50000000 ++#define FLASH_5752PAGE_SIZE_528 0x60000000 + #define NVRAM_CFG2 0x00007018 + #define NVRAM_CFG3 0x0000701c + #define NVRAM_SWARB 0x00007020 +@@ -1613,6 +1708,12 @@ + + #define PCIE_PWR_MGMT_THRESH 0x00007d28 + #define PCIE_PWR_MGMT_L1_THRESH_MSK 0x0000ff00 ++#define PCIE_PWR_MGMT_L1_THRESH_4MS 0x0000ff00 ++#define PCIE_PWR_MGMT_EXT_ASPM_TMR_EN 0x01000000 ++ ++#define PCIE_LINK_CTRL 0x00007d54 ++#define PCIE_LINK_CTRL_L1_PLL_PD_EN 0x00000008 ++#define PCIE_LINK_CTRL_L1_PLL_PD_DIS 0x00000080 + + + /* OTP bit definitions */ +@@ -1635,6 +1736,12 @@ + + #define TG3_OTP_DEFAULT 0x286c1640 + ++/* Hardware Selfboot NVRAM layout */ ++#define TG3_NVM_HWSB_CFG1 0x00000004 ++#define TG3_NVM_HWSB_CFG1_MAJMSK 0xf8000000 ++#define TG3_NVM_HWSB_CFG1_MAJSFT 27 ++#define TG3_NVM_HWSB_CFG1_MINMSK 0x07c00000 ++#define TG3_NVM_HWSB_CFG1_MINSFT 22 + + #define TG3_EEPROM_MAGIC 0x669955aa + #define TG3_EEPROM_MAGIC_FW 0xa5000000 +@@ -1653,6 +1760,21 @@ + #define TG3_NVM_DIRENT_SIZE 0xc + #define TG3_NVM_DIRTYPE_SHIFT 24 + #define TG3_NVM_DIRTYPE_ASFINI 1 ++#define TG3_NVM_PTREV_BCVER 0x94 ++#define TG3_NVM_BCVER_MAJMSK 0x0000ff00 ++#define TG3_NVM_BCVER_MAJSFT 8 ++#define TG3_NVM_BCVER_MINMSK 0x000000ff ++ ++#define TG3_EEPROM_SB_F1R0_EDH_OFF 0x10 ++#define TG3_EEPROM_SB_F1R2_EDH_OFF 0x14 ++#define TG3_EEPROM_SB_F1R2_MBA_OFF 0x10 ++#define TG3_EEPROM_SB_F1R3_EDH_OFF 0x18 ++#define TG3_EEPROM_SB_EDH_MAJ_MASK 0x00000700 ++#define TG3_EEPROM_SB_EDH_MAJ_SHFT 8 ++#define TG3_EEPROM_SB_EDH_MIN_MASK 0x000000ff ++#define TG3_EEPROM_SB_EDH_BLD_MASK 0x0000f800 ++#define TG3_EEPROM_SB_EDH_BLD_SHFT 11 ++ + + /* 32K Window into NIC internal memory */ + #define NIC_SRAM_WIN_BASE 0x00008000 +@@ -1729,6 +1851,7 @@ + + #define NIC_SRAM_DATA_CFG_2 0x00000d38 + ++#define NIC_SRAM_DATA_CFG_2_APD_EN 0x00000400 + #define SHASTA_EXT_LED_MODE_MASK 0x00018000 + #define SHASTA_EXT_LED_LEGACY 0x00000000 + #define SHASTA_EXT_LED_SHARED 0x00008000 +@@ -1740,7 +1863,7 @@ + + #define NIC_SRAM_DATA_CFG_4 0x00000d60 + #define NIC_SRAM_GMII_MODE 0x00000002 +-#define NIC_SRAM_RGMII_STD_IBND_DISABLE 0x00000004 ++#define NIC_SRAM_RGMII_INBAND_DISABLE 0x00000004 + #define NIC_SRAM_RGMII_EXT_IBND_RX_EN 0x00000008 + #define NIC_SRAM_RGMII_EXT_IBND_TX_EN 0x00000010 + +@@ -1780,7 +1903,6 @@ + + #define MII_TG3_DSP_RW_PORT 0x15 /* DSP coefficient read/write port */ + +-#define MII_TG3_EPHY_PTEST 0x17 /* 5906 PHY register */ + #define MII_TG3_DSP_ADDRESS 0x17 /* DSP address register */ + + #define MII_TG3_DSP_TAP1 0x0001 +@@ -1792,10 +1914,16 @@ + #define MII_TG3_DSP_EXP8_REJ2MHz 0x0001 + #define MII_TG3_DSP_EXP8_AEDW 0x0200 + #define MII_TG3_DSP_EXP75 0x0f75 ++#define MII_TG3_DSP_EXP75_SUP_CM_OSC 0x0001 + #define MII_TG3_DSP_EXP96 0x0f96 + #define MII_TG3_DSP_EXP97 0x0f97 + + #define MII_TG3_AUX_CTRL 0x18 /* auxilliary control register */ ++ ++#define MII_TG3_AUXCTL_PCTL_100TX_LPWR 0x0010 ++#define MII_TG3_AUXCTL_PCTL_SPR_ISOLATE 0x0020 ++#define MII_TG3_AUXCTL_PCTL_VREG_11V 0x0180 ++#define MII_TG3_AUXCTL_SHDWSEL_PWRCTL 0x0002 + + #define MII_TG3_AUXCTL_MISC_WREN 0x8000 + #define MII_TG3_AUXCTL_MISC_FORCE_AMDIX 0x0200 +@@ -1822,12 +1950,6 @@ + #define MII_TG3_ISTAT 0x1a /* IRQ status register */ + #define MII_TG3_IMASK 0x1b /* IRQ mask register */ + +-#define MII_TG3_MISC_SHDW 0x1c +-#define MII_TG3_MISC_SHDW_WREN 0x8000 +-#define MII_TG3_MISC_SHDW_APD_SEL 0x2800 +- +-#define MII_TG3_MISC_SHDW_APD_WKTM_84MS 0x0001 +- + /* ISTAT/IMASK event bits */ + #define MII_TG3_INT_LINKCHG 0x0002 + #define MII_TG3_INT_SPEEDCHG 0x0004 +@@ -1836,7 +1958,9 @@ + + #define MII_TG3_MISC_SHDW 0x1c + #define MII_TG3_MISC_SHDW_WREN 0x8000 +-#define MII_TG3_MISC_SHDW_SCR5_SEL 0x1400 ++ ++#define MII_TG3_MISC_SHDW_APD_WKTM_84MS 0x0001 ++#define MII_TG3_MISC_SHDW_APD_ENABLE 0x0020 + #define MII_TG3_MISC_SHDW_APD_SEL 0x2800 + + #define MII_TG3_MISC_SHDW_SCR5_C125OE 0x0001 +@@ -1844,19 +1968,24 @@ + #define MII_TG3_MISC_SHDW_SCR5_SDTL 0x0004 + #define MII_TG3_MISC_SHDW_SCR5_DLPTLM 0x0008 + #define MII_TG3_MISC_SHDW_SCR5_LPED 0x0010 +- +-#define MII_TG3_MISC_SHDW_APD_WKTM_84MS 0x0001 +-#define MII_TG3_MISC_SHDW_APD_ENABLE 0x0020 +- +-#define MII_TG3_EPHY_TEST 0x1f /* 5906 PHY register */ +-#define MII_TG3_EPHY_SHADOW_EN 0x80 +- +-#define MII_TG3_EPHYTST_MISCCTRL 0x10 /* 5906 EPHY misc ctrl shadow register */ +-#define MII_TG3_EPHYTST_MISCCTRL_MDIX 0x4000 ++#define MII_TG3_MISC_SHDW_SCR5_SEL 0x1400 + + #define MII_TG3_TEST1 0x1e + #define MII_TG3_TEST1_TRIM_EN 0x0010 + #define MII_TG3_TEST1_CRC_EN 0x8000 ++ ++ ++/* Fast Ethernet Tranceiver definitions */ ++#define MII_TG3_FET_PTEST 0x17 ++#define MII_TG3_FET_TEST 0x1f ++#define MII_TG3_FET_SHADOW_EN 0x0080 ++ ++#define MII_TG3_FET_SHDW_MISCCTRL 0x10 ++#define MII_TG3_FET_SHDW_MISCCTRL_MDIX 0x4000 ++ ++#define MII_TG3_FET_SHDW_AUXSTAT2 0x1b ++#define MII_TG3_FET_SHDW_AUXSTAT2_APD 0x0020 ++ + + /* APE registers. Accessible through BAR1 */ + #define TG3_APE_EVENT 0x000c +@@ -1871,6 +2000,14 @@ + /* APE shared memory. Accessible through BAR1 */ + #define TG3_APE_FW_STATUS 0x400c + #define APE_FW_STATUS_READY 0x00000100 ++#define TG3_APE_FW_VERSION 0x4018 ++#define APE_FW_VERSION_MAJMSK 0xff000000 ++#define APE_FW_VERSION_MAJSFT 24 ++#define APE_FW_VERSION_MINMSK 0x00ff0000 ++#define APE_FW_VERSION_MINSFT 16 ++#define APE_FW_VERSION_REVMSK 0x0000ff00 ++#define APE_FW_VERSION_REVSFT 8 ++#define APE_FW_VERSION_BLDMSK 0x000000ff + #define TG3_APE_HOST_SEG_SIG 0x4200 + #define APE_HOST_SEG_SIG_MAGIC 0x484f5354 + #define TG3_APE_HOST_SEG_LEN 0x4204 +@@ -1899,7 +2036,6 @@ + #define TG3_APE_LOCK_GRC 1 + #define TG3_APE_LOCK_MEM 4 + +-#define TG3_EEPROM_SB_F1R2_MBA_OFF 0x10 + + + /* There are two ways to manage the TX descriptors on the tigon3. +@@ -2055,35 +2191,35 @@ + + #define TG3_HW_STATUS_SIZE 0x50 + struct tg3_hw_status { +- u32 status; ++ volatile u32 status; + #define SD_STATUS_UPDATED 0x00000001 + #define SD_STATUS_LINK_CHG 0x00000002 + #define SD_STATUS_ERROR 0x00000004 + +- u32 status_tag; ++ volatile u32 status_tag; + + #ifdef __BIG_ENDIAN +- u16 rx_consumer; +- u16 rx_jumbo_consumer; ++ volatile u16 rx_consumer; ++ volatile u16 rx_jumbo_consumer; + #else +- u16 rx_jumbo_consumer; +- u16 rx_consumer; ++ volatile u16 rx_jumbo_consumer; ++ volatile u16 rx_consumer; + #endif + + #ifdef __BIG_ENDIAN +- u16 reserved; +- u16 rx_mini_consumer; ++ volatile u16 reserved; ++ volatile u16 rx_mini_consumer; + #else +- u16 rx_mini_consumer; +- u16 reserved; ++ volatile u16 rx_mini_consumer; ++ volatile u16 reserved; + #endif + struct { + #ifdef __BIG_ENDIAN +- u16 tx_consumer; +- u16 rx_producer; ++ volatile u16 tx_consumer; ++ volatile u16 rx_producer; + #else +- u16 rx_producer; +- u16 tx_consumer; ++ volatile u16 rx_producer; ++ volatile u16 tx_consumer; + #endif + } idx[16]; + }; +@@ -2202,7 +2338,9 @@ + + struct tx_ring_info { + struct sk_buff *skb; +- DECLARE_PCI_UNMAP_ADDR(mapping) ++#ifndef BCM_HAS_SKB_DMA_MAP ++ dma_addr_t mapping; ++#endif + u32 prev_vlan_tag; + }; + +@@ -2217,8 +2355,6 @@ + u8 duplex; + u8 autoneg; + u8 flowctrl; +-#define TG3_FLOW_CTRL_TX 0x01 +-#define TG3_FLOW_CTRL_RX 0x02 + + /* Describes what we actually have. */ + u8 active_flowctrl; +@@ -2390,6 +2526,7 @@ + struct tg3_hw_status *hw_status; + dma_addr_t status_mapping; + u32 last_tag; ++ u32 last_irq_tag; + + u32 msg_enable; + +@@ -2405,7 +2542,9 @@ + dma_addr_t tx_desc_mapping; + + /* begin "rx thread" cacheline section */ ++#ifdef TG3_NAPI + struct napi_struct napi; ++#endif + void (*write32_rx_mbox) (struct tg3 *, u32, + u32); + u32 rx_rcb_ptr; +@@ -2442,7 +2581,8 @@ + unsigned long last_event_jiffies; + }; + +- u32 rx_offset; ++ u16 rx_offset; ++ u16 rx_copy_thresh; + u32 tg3_flags; + #define TG3_FLAG_TAGGED_STATUS 0x00000001 + #define TG3_FLAG_TXD_MBOX_HWBUG 0x00000002 +@@ -2459,6 +2599,7 @@ + #define TG3_FLAG_EEPROM_WRITE_PROT 0x00001000 + #define TG3_FLAG_NVRAM 0x00002000 + #define TG3_FLAG_NVRAM_BUFFERED 0x00004000 ++#define TG3_FLAG_SUPPORT_MSI 0x00008000 + #define TG3_FLAG_PCIX_MODE 0x00020000 + #define TG3_FLAG_PCI_HIGH_SPEED 0x00040000 + #define TG3_FLAG_PCI_32BIT 0x00080000 +@@ -2471,7 +2612,7 @@ + #define TG3_FLAG_CPMU_PRESENT 0x04000000 + #define TG3_FLAG_40BIT_DMA_BUG 0x08000000 + #define TG3_FLAG_BROKEN_CHECKSUMS 0x10000000 +-#define TG3_FLAG_SUPPORT_MSI 0x20000000 ++#define TG3_FLAG_JUMBO_CAPABLE 0x20000000 + #define TG3_FLAG_CHIP_RESETTING 0x40000000 + #define TG3_FLAG_INIT_COMPLETE 0x80000000 + u32 tg3_flags2; +@@ -2497,7 +2638,6 @@ + #define TG3_FLG2_5750_PLUS 0x00080000 + #define TG3_FLG2_PROTECTED_NVRAM 0x00100000 + #define TG3_FLG2_USING_MSI 0x00200000 +-#define TG3_FLG2_JUMBO_CAPABLE 0x00400000 + #define TG3_FLG2_MII_SERDES 0x00800000 + #define TG3_FLG2_ANY_SERDES (TG3_FLG2_PHY_SERDES | \ + TG3_FLG2_MII_SERDES) +@@ -2513,15 +2653,20 @@ + u32 tg3_flags3; + #define TG3_FLG3_NO_NVRAM_ADDR_TRANS 0x00000001 + #define TG3_FLG3_ENABLE_APE 0x00000002 +-#define TG3_FLG3_5761_5784_AX_FIXES 0x00000004 + #define TG3_FLG3_5701_DMA_BUG 0x00000008 + #define TG3_FLG3_USE_PHYLIB 0x00000010 + #define TG3_FLG3_MDIOBUS_INITED 0x00000020 + #define TG3_FLG3_MDIOBUS_PAUSED 0x00000040 + #define TG3_FLG3_PHY_CONNECTED 0x00000080 +-#define TG3_FLG3_RGMII_STD_IBND_DISABLE 0x00000100 ++#define TG3_FLG3_RGMII_INBAND_DISABLE 0x00000100 + #define TG3_FLG3_RGMII_EXT_IBND_RX_EN 0x00000200 + #define TG3_FLG3_RGMII_EXT_IBND_TX_EN 0x00000400 ++#define TG3_FLG3_CLKREQ_BUG 0x00000800 ++#define TG3_FLG3_PHY_ENABLE_APD 0x00001000 ++#define TG3_FLG3_5755_PLUS 0x00002000 ++#define TG3_FLG3_NO_NVRAM 0x00004000 ++#define TG3_FLG3_PHY_IS_FET 0x00008000 ++#define TG3_FLG3_TOGGLE_10_100_L1PLLPD 0x00010000 + + struct timer_list timer; + u16 timer_counter; +@@ -2553,17 +2698,24 @@ + + /* PCI block */ + u32 pci_chip_rev_id; ++ u16 pci_cmd; + u8 pci_cacheline_sz; + u8 pci_lat_timer; +- u8 pci_hdr_type; +- u8 pci_bist; ++#if (LINUX_VERSION_CODE < 0x2060a) ++ u32 pci_cfg_state[64 / sizeof(u32)]; ++#endif + + int pm_cap; + int msi_cap; ++ union { + int pcix_cap; ++ int pcie_cap; ++ }; + +- struct mii_bus mdio_bus; ++#ifdef BCM_INCLUDE_PHYLIB_SUPPORT ++ struct mii_bus *mdio_bus; + int mdio_irq[PHY_MAX_ADDR]; ++#endif + + /* PHY info */ + u32 phy_id; +@@ -2586,21 +2738,34 @@ + #define PHY_ID_BCM5761 0xbc050fd0 + #define PHY_ID_BCM5906 0xdc00ac40 + #define PHY_ID_BCM8002 0x60010140 +-#define PHY_ID_BCM57780 0x5c0d8990 + #define PHY_ID_INVALID 0xffffffff + #define PHY_ID_REV_MASK 0x0000000f + #define PHY_REV_BCM5401_B0 0x1 + #define PHY_REV_BCM5401_B2 0x3 + #define PHY_REV_BCM5401_C0 0x6 + #define PHY_REV_BCM5411_X0 0x1 /* Found on Netgear GA302T */ +-#define TG3_PHY_ID_BCM50610 0x0143bd60 +-#define TG3_PHY_ID_BCMAC131 0x0143bc70 +-#define TG3_PHY_ID_BCM57780 0x03625d90 +- ++#ifdef BCM_INCLUDE_PHYLIB_SUPPORT ++#define PHY_ID_BCM50610 0x0143bd60 ++#define PHY_ID_BCM50610M 0x0143bd70 ++#define PHY_ID_BCMAC131 0x0143bc70 ++#define PHY_ID_RTL8211C 0x001cc910 ++#define PHY_ID_RTL8201E 0x00008200 ++#define PHY_ID_BCM57780 0x03625d90 ++#define TG3_PHY_OUI_MASK 0xfffffc00 ++#define TG3_PHY_OUI_1 0x00206000 ++#define TG3_PHY_OUI_2 0x0143bc00 ++#define TG3_PHY_OUI_3 0x03625c00 ++#else /* BCM_INCLUDE_PHYLIB_SUPPORT */ ++#define PHY_ID_BCM50610 0xbc050d60 ++#define PHY_ID_BCM50610M 0xbc050d70 ++#define PHY_ID_BCMAC131 0xbc050c70 ++#define PHY_ID_RTL8211C 0xc8007110 ++#define PHY_ID_RTL8201E 0xc800aaa0 ++#define PHY_ID_BCM57780 0x5c0d8990 ++#endif /* BCM_INCLUDE_PHYLIB_SUPPORT */ + + u32 led_ctrl; + u32 phy_otp; +- u16 pci_cmd; + + char board_part_number[24]; + #define TG3_VER_SIZE 32 +@@ -2662,6 +2827,11 @@ + #define SST_25VF0X0_PAGE_SIZE 4098 + + struct ethtool_coalesce coal; ++ ++ /* firmware info */ ++ const char *fw_needed; ++ const struct tg3_firmware *fw; ++ u32 fw_len; /* includes BSS */ + }; + + #endif /* !(_T3_H) */ +diff -r 30b17b8c7526 drivers/net/tg3_compat.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/tg3_compat.h Mon Jun 15 17:05:21 2009 +0100 +@@ -0,0 +1,1187 @@ ++#include "tg3_flags.h" ++ ++#if !defined(__maybe_unused) ++#define __maybe_unused /* unimplemented */ ++#endif ++ ++#if !defined(__iomem) ++#define __iomem ++#endif ++ ++#ifndef __acquires ++#define __acquires(x) ++#endif ++ ++#ifndef __releases ++#define __releases(x) ++#endif ++ ++#ifndef mmiowb ++#define mmiowb() ++#endif ++ ++#ifndef WARN_ON ++#define WARN_ON(x) ++#endif ++ ++#ifndef MODULE_VERSION ++#define MODULE_VERSION(version) ++#endif ++ ++#ifndef SET_MODULE_OWNER ++#define SET_MODULE_OWNER(dev) do { } while (0) ++#endif ++ ++#ifndef ARRAY_SIZE ++#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) ++#endif ++ ++#ifndef BCM_HAS_BOOL ++typedef int bool; ++#define false 0 ++#define true 1 ++#endif ++ ++#ifndef BCM_HAS_LE32 ++typedef u32 __le32; ++typedef u32 __be32; ++#endif ++ ++#ifndef BCM_HAS_RESOURCE_SIZE_T ++typedef unsigned long resource_size_t; ++#endif ++ ++#ifndef IRQ_RETVAL ++typedef void irqreturn_t; ++#define IRQ_RETVAL(x) ++#define IRQ_HANDLED ++#define IRQ_NONE ++#endif ++ ++#ifndef IRQF_SHARED ++#define IRQF_SHARED SA_SHIRQ ++#endif ++ ++#ifndef IRQF_SAMPLE_RANDOM ++#define IRQF_SAMPLE_RANDOM SA_SAMPLE_RANDOM ++#endif ++ ++#if (LINUX_VERSION_CODE <= 0x020600) ++#define schedule_work(x) schedule_task(x) ++#define work_struct tq_struct ++#define INIT_WORK(x, y, z) INIT_TQUEUE(x, y, z) ++#endif ++ ++#ifndef BCM_HAS_KZALLOC ++static inline void *kzalloc(size_t size, int flags) ++{ ++ void * memptr = kmalloc(size, flags); ++ if (memptr) ++ memset(memptr, 0, size); ++ ++ return memptr; ++} ++#endif ++ ++#ifndef USEC_PER_SEC ++#define USEC_PER_SEC 1000000 ++#endif ++ ++#ifndef MSEC_PER_SEC ++#define MSEC_PER_SEC 1000 ++#endif ++ ++#ifndef MAX_JIFFY_OFFSET ++#define MAX_JIFFY_OFFSET ((LONG_MAX >> 1)-1) ++#endif ++ ++#ifndef BCM_HAS_JIFFIES_TO_USECS ++static unsigned int inline jiffies_to_usecs(const unsigned long j) ++{ ++#if HZ <= USEC_PER_SEC && !(USEC_PER_SEC % HZ) ++ return (USEC_PER_SEC / HZ) * j; ++#elif HZ > USEC_PER_SEC && !(HZ % USEC_PER_SEC) ++ return (j + (HZ / USEC_PER_SEC) - 1)/(HZ / USEC_PER_SEC); ++#else ++ return (j * USEC_PER_SEC) / HZ; ++#endif ++} ++#endif /* BCM_HAS_JIFFIES_TO_USECS */ ++ ++#ifndef BCM_HAS_USECS_TO_JIFFIES ++static unsigned long usecs_to_jiffies(const unsigned int u) ++{ ++ if (u > jiffies_to_usecs(MAX_JIFFY_OFFSET)) ++ return MAX_JIFFY_OFFSET; ++#if HZ <= USEC_PER_SEC && !(USEC_PER_SEC % HZ) ++ return (u + (USEC_PER_SEC / HZ) - 1) / (USEC_PER_SEC / HZ); ++#elif HZ > USEC_PER_SEC && !(HZ % USEC_PER_SEC) ++ return u * (HZ / USEC_PER_SEC); ++#else ++ return (u * HZ + USEC_PER_SEC - 1) / USEC_PER_SEC; ++#endif ++} ++#endif /* BCM_HAS_USECS_TO_JIFFIES */ ++ ++#ifndef BCM_HAS_MSECS_TO_JIFFIES ++static unsigned long msecs_to_jiffies(const unsigned int m) ++{ ++#if HZ <= MSEC_PER_SEC && !(MSEC_PER_SEC % HZ) ++ /* ++ * HZ is equal to or smaller than 1000, and 1000 is a nice ++ * round multiple of HZ, divide with the factor between them, ++ * but round upwards: ++ */ ++ return (m + (MSEC_PER_SEC / HZ) - 1) / (MSEC_PER_SEC / HZ); ++#elif HZ > MSEC_PER_SEC && !(HZ % MSEC_PER_SEC) ++ /* ++ * HZ is larger than 1000, and HZ is a nice round multiple of ++ * 1000 - simply multiply with the factor between them. ++ * ++ * But first make sure the multiplication result cannot ++ * overflow: ++ */ ++ if (m > jiffies_to_msecs(MAX_JIFFY_OFFSET)) ++ return MAX_JIFFY_OFFSET; ++ ++ return m * (HZ / MSEC_PER_SEC); ++#else ++ /* ++ * Generic case - multiply, round and divide. But first ++ * check that if we are doing a net multiplication, that ++ * we wouldn't overflow: ++ */ ++ if (HZ > MSEC_PER_SEC && m > jiffies_to_msecs(MAX_JIFFY_OFFSET)) ++ return MAX_JIFFY_OFFSET; ++ ++ return (m * HZ + MSEC_PER_SEC - 1) / MSEC_PER_SEC; ++#endif ++} ++#endif /* BCM_HAS_MSECS_TO_JIFFIES */ ++ ++#ifndef BCM_HAS_MSLEEP ++static void msleep(unsigned int msecs) ++{ ++ unsigned long timeout = msecs_to_jiffies(msecs) + 1; ++ ++ while (timeout) { ++ __set_current_state(TASK_UNINTERRUPTIBLE); ++ timeout = schedule_timeout(timeout); ++ } ++} ++#endif /* BCM_HAS_MSLEEP */ ++ ++#ifndef BCM_HAS_MSLEEP_INTERRUPTIBLE ++static unsigned long msleep_interruptible(unsigned int msecs) ++{ ++ unsigned long timeout = msecs_to_jiffies(msecs) + 1; ++ ++ while (timeout) { ++ __set_current_state(TASK_UNINTERRUPTIBLE); ++ timeout = schedule_timeout(timeout); ++ } ++ ++ return 0; ++} ++#endif /* BCM_HAS_MSLEEP_INTERRUPTIBLE */ ++ ++#ifndef BCM_HAS_PCI_IOREMAP_BAR ++static inline void * pci_ioremap_bar(struct pci_dev *pdev, int bar) ++{ ++ resource_size_t base, size; ++ ++ if (!(pci_resource_flags(pdev, bar) & IORESOURCE_MEM)) { ++ printk(KERN_ERR ++ "Cannot find proper PCI device base address for BAR %d.\n", ++ bar); ++ return NULL; ++ } ++ ++ base = pci_resource_start(pdev, bar); ++ size = pci_resource_len(pdev, bar); ++ ++ return ioremap_nocache(base, size); ++} ++#endif ++ ++#if (LINUX_VERSION_CODE < 0x020547) ++#define pci_set_consistent_dma_mask(pdev, mask) (0) ++#endif ++ ++#if (LINUX_VERSION_CODE < 0x020600) ++#define pci_get_device(x, y, z) pci_find_device(x, y, z) ++#define pci_get_slot(x, y) pci_find_slot((x)->number, y) ++#define pci_dev_put(x) ++#endif ++ ++#if (LINUX_VERSION_CODE < 0x020605) ++#define pci_dma_sync_single_for_cpu(pdev, map, len, dir) \ ++ pci_dma_sync_single(pdev, map, len, dir) ++#define pci_dma_sync_single_for_device(pdev, map, len, dir) ++#endif ++ ++#ifndef PCI_DEVICE ++#define PCI_DEVICE(vend,dev) \ ++ .vendor = (vend), .device = (dev), \ ++ .subvendor = PCI_ANY_ID, .subdevice = PCI_ANY_ID ++#endif ++ ++#ifndef PCI_DEVICE_ID_TIGON3_5704S_2 ++#define PCI_DEVICE_ID_TIGON3_5704S_2 0x1649 ++#endif ++ ++#ifndef PCI_DEVICE_ID_TIGON3_5705F ++#define PCI_DEVICE_ID_TIGON3_5705F 0x166e ++#endif ++ ++#ifndef PCI_DEVICE_ID_TIGON3_5720 ++#define PCI_DEVICE_ID_TIGON3_5720 0x1658 ++#endif ++ ++#ifndef PCI_DEVICE_ID_TIGON3_5721 ++#define PCI_DEVICE_ID_TIGON3_5721 0x1659 ++#endif ++ ++#ifndef PCI_DEVICE_ID_TIGON3_5750 ++#define PCI_DEVICE_ID_TIGON3_5750 0x1676 ++#endif ++ ++#ifndef PCI_DEVICE_ID_TIGON3_5751 ++#define PCI_DEVICE_ID_TIGON3_5751 0x1677 ++#endif ++ ++#ifndef PCI_DEVICE_ID_TIGON3_5750M ++#define PCI_DEVICE_ID_TIGON3_5750M 0x167c ++#endif ++ ++#ifndef PCI_DEVICE_ID_TIGON3_5751M ++#define PCI_DEVICE_ID_TIGON3_5751M 0x167d ++#endif ++ ++#ifndef PCI_DEVICE_ID_TIGON3_5751F ++#define PCI_DEVICE_ID_TIGON3_5751F 0x167e ++#endif ++ ++#ifndef PCI_DEVICE_ID_TIGON3_5789 ++#define PCI_DEVICE_ID_TIGON3_5789 0x169d ++#endif ++ ++#ifndef PCI_DEVICE_ID_TIGON3_5753 ++#define PCI_DEVICE_ID_TIGON3_5753 0x16f7 ++#endif ++ ++#ifndef PCI_DEVICE_ID_TIGON3_5753M ++#define PCI_DEVICE_ID_TIGON3_5753M 0x16fd ++#endif ++ ++#ifndef PCI_DEVICE_ID_TIGON3_5753F ++#define PCI_DEVICE_ID_TIGON3_5753F 0x16fe ++#endif ++ ++#ifndef PCI_DEVICE_ID_TIGON3_5781 ++#define PCI_DEVICE_ID_TIGON3_5781 0x16dd ++#endif ++ ++#ifndef PCI_DEVICE_ID_TIGON3_5752 ++#define PCI_DEVICE_ID_TIGON3_5752 0x1600 ++#endif ++ ++#ifndef PCI_DEVICE_ID_TIGON3_5752M ++#define PCI_DEVICE_ID_TIGON3_5752M 0x1601 ++#endif ++ ++#ifndef PCI_DEVICE_ID_TIGON3_5714 ++#define PCI_DEVICE_ID_TIGON3_5714 0x1668 ++#endif ++ ++#ifndef PCI_DEVICE_ID_TIGON3_5714S ++#define PCI_DEVICE_ID_TIGON3_5714S 0x1669 ++#endif ++ ++#ifndef PCI_DEVICE_ID_TIGON3_5780 ++#define PCI_DEVICE_ID_TIGON3_5780 0x166a ++#endif ++ ++#ifndef PCI_DEVICE_ID_TIGON3_5780S ++#define PCI_DEVICE_ID_TIGON3_5780S 0x166b ++#endif ++ ++#ifndef PCI_DEVICE_ID_TIGON3_5715 ++#define PCI_DEVICE_ID_TIGON3_5715 0x1678 ++#endif ++ ++#ifndef PCI_DEVICE_ID_TIGON3_5715S ++#define PCI_DEVICE_ID_TIGON3_5715S 0x1679 ++#endif ++ ++#ifndef PCI_DEVICE_ID_TIGON3_5756 ++#define PCI_DEVICE_ID_TIGON3_5756 0x1674 ++#endif ++ ++#ifndef PCI_DEVICE_ID_TIGON3_5754 ++#define PCI_DEVICE_ID_TIGON3_5754 0x167a ++#endif ++ ++#ifndef PCI_DEVICE_ID_TIGON3_5754M ++#define PCI_DEVICE_ID_TIGON3_5754M 0x1672 ++#endif ++ ++#ifndef PCI_DEVICE_ID_TIGON3_5755 ++#define PCI_DEVICE_ID_TIGON3_5755 0x167b ++#endif ++ ++#ifndef PCI_DEVICE_ID_TIGON3_5755M ++#define PCI_DEVICE_ID_TIGON3_5755M 0x1673 ++#endif ++ ++#ifndef PCI_DEVICE_ID_TIGON3_5722 ++#define PCI_DEVICE_ID_TIGON3_5722 0x165a ++#endif ++ ++#ifndef PCI_DEVICE_ID_TIGON3_5786 ++#define PCI_DEVICE_ID_TIGON3_5786 0x169a ++#endif ++ ++#ifndef PCI_DEVICE_ID_TIGON3_5787M ++#define PCI_DEVICE_ID_TIGON3_5787M 0x1693 ++#endif ++ ++#ifndef PCI_DEVICE_ID_TIGON3_5787 ++#define PCI_DEVICE_ID_TIGON3_5787 0x169b ++#endif ++ ++#ifndef PCI_DEVICE_ID_TIGON3_5787F ++#define PCI_DEVICE_ID_TIGON3_5787F 0x167f ++#endif ++ ++#ifndef PCI_DEVICE_ID_TIGON3_5906 ++#define PCI_DEVICE_ID_TIGON3_5906 0x1712 ++#endif ++ ++#ifndef PCI_DEVICE_ID_TIGON3_5906M ++#define PCI_DEVICE_ID_TIGON3_5906M 0x1713 ++#endif ++ ++#ifndef PCI_DEVICE_ID_TIGON3_5784 ++#define PCI_DEVICE_ID_TIGON3_5784 0x1698 ++#endif ++ ++#ifndef PCI_DEVICE_ID_TIGON3_5764 ++#define PCI_DEVICE_ID_TIGON3_5764 0x1684 ++#endif ++ ++#ifndef PCI_DEVICE_ID_TIGON3_5723 ++#define PCI_DEVICE_ID_TIGON3_5723 0x165b ++#endif ++ ++#ifndef PCI_DEVICE_ID_TIGON3_5761 ++#define PCI_DEVICE_ID_TIGON3_5761 0x1681 ++#endif ++ ++#ifndef PCI_DEVICE_ID_TIGON3_5761E ++#define PCI_DEVICE_ID_TIGON3_5761E 0x1680 ++#endif ++ ++#ifndef PCI_DEVICE_ID_APPLE_TIGON3 ++#define PCI_DEVICE_ID_APPLE_TIGON3 0x1645 ++#endif ++ ++#ifndef PCI_DEVICE_ID_APPLE_UNI_N_PCI15 ++#define PCI_DEVICE_ID_APPLE_UNI_N_PCI15 0x002e ++#endif ++ ++#ifndef PCI_DEVICE_ID_VIA_8385_0 ++#define PCI_DEVICE_ID_VIA_8385_0 0x3188 ++#endif ++ ++#ifndef PCI_DEVICE_ID_AMD_8131_BRIDGE ++#define PCI_DEVICE_ID_AMD_8131_BRIDGE 0x7450 ++#endif ++ ++#ifndef PCI_DEVICE_ID_SERVERWORKS_EPB ++#define PCI_DEVICE_ID_SERVERWORKS_EPB 0x0103 ++#endif ++ ++#ifndef PCI_VENDOR_ID_ARIMA ++#define PCI_VENDOR_ID_ARIMA 0x161f ++#endif ++ ++#ifndef PCI_DEVICE_ID_INTEL_PXH_0 ++#define PCI_DEVICE_ID_INTEL_PXH_0 0x0329 ++#endif ++ ++#ifndef PCI_DEVICE_ID_INTEL_PXH_1 ++#define PCI_DEVICE_ID_INTEL_PXH_1 0x032A ++#endif ++ ++#if !defined(PCI_VPD_ADDR) ++#define PCI_VPD_ADDR 2 ++#define PCI_VPD_DATA 4 ++#endif ++ ++#ifndef PCI_D0 ++typedef u32 pm_message_t; ++typedef u32 pci_power_t; ++#define PCI_D0 0 ++#define PCI_D1 1 ++#define PCI_D2 2 ++#define PCI_D3hot 3 ++#endif ++ ++#ifndef DMA_64BIT_MASK ++#define DMA_64BIT_MASK ((u64) 0xffffffffffffffffULL) ++#endif ++ ++#ifndef DMA_40BIT_MASK ++#define DMA_40BIT_MASK ((u64) 0x000000ffffffffffULL) ++#endif ++ ++#ifndef DMA_32BIT_MASK ++#define DMA_32BIT_MASK ((u64) 0x00000000ffffffffULL) ++#endif ++ ++#ifndef DMA_BIT_MASK ++#define DMA_BIT_MASK(n) DMA_ ##n ##BIT_MASK ++#endif ++ ++#if !defined(BCM_HAS_PCI_TARGET_STATE) && !defined(BCM_HAS_PCI_CHOOSE_STATE) ++static inline pci_power_t pci_choose_state(struct pci_dev *dev, ++ pm_message_t state) ++{ ++ return state; ++} ++#endif ++ ++#ifndef BCM_HAS_PCI_PME_CAPABLE ++static bool pci_pme_capable(struct pci_dev *dev, pci_power_t state) ++{ ++ int pm_cap; ++ u16 caps; ++ ++ pm_cap = pci_find_capability(dev, PCI_CAP_ID_PM); ++ if (pm_cap == 0) ++ return false; ++ ++ pci_read_config_word(dev, pm_cap + PCI_PM_PMC, &caps); ++ ++ if (caps & PCI_PM_CAP_PME_D3cold) ++ return true; ++ ++ return false; ++} ++#endif /* BCM_HAS_PCI_PME_CAPABLE */ ++ ++#ifndef BCM_HAS_PCI_ENABLE_WAKE ++static int pci_enable_wake(struct pci_dev *dev, pci_power_t state, int enable) ++{ ++ int pm_cap; ++ u16 pmcsr; ++ ++ pm_cap = pci_find_capability(dev, PCI_CAP_ID_PM); ++ if (pm_cap == 0) ++ return -EIO; ++ ++ pci_read_config_word(dev, pm_cap + PCI_PM_CTRL, &pmcsr); ++ ++ /* Clear PME_Status by writing 1 to it */ ++ pmcsr |= PCI_PM_CTRL_PME_STATUS; ++ ++ if (enable) ++ pmcsr |= PCI_PM_CTRL_PME_ENABLE; ++ else ++ pmcsr &= ~PCI_PM_CTRL_PME_ENABLE; ++ ++ pci_write_config_word(dev, pm_cap + PCI_PM_CTRL, pmcsr); ++ ++ return 0; ++} ++#endif /* BCM_HAS_PCI_ENABLE_WAKE */ ++ ++#ifndef BCM_HAS_PCI_SET_POWER_STATE ++static int pci_set_power_state(struct pci_dev *dev, pci_power_t state) ++{ ++ int pm_cap; ++ u16 pmcsr; ++ ++ if (state < PCI_D0 || state > PCI_D3hot) ++ return -EINVAL; ++ ++ pm_cap = pci_find_capability(dev, PCI_CAP_ID_PM); ++ if (pm_cap == 0) ++ return -EIO; ++ ++ pci_read_config_word(dev, pm_cap + PCI_PM_CTRL, &pmcsr); ++ ++ pmcsr &= ~(PCI_PM_CTRL_STATE_MASK); ++ pmcsr |= state; ++ ++ pci_write_config_word(dev, pm_cap + PCI_PM_CTRL, pmcsr); ++ ++ msleep(10); ++ ++ return 0; ++} ++#endif /* BCM_HAS_PCI_SET_POWER_STATE */ ++ ++#ifndef BCM_HAS_DEVICE_WAKEUP_API ++#define device_init_wakeup(dev, val) ++#define device_can_wakeup(dev) 1 ++#define device_set_wakeup_enable(dev, val) ++#define device_may_wakeup(dev) 1 ++#endif /* BCM_HAS_DEVICE_WAKEUP_API */ ++ ++ ++#ifndef PCI_X_CMD_READ_2K ++#define PCI_X_CMD_READ_2K 0x0008 ++#endif ++#ifndef PCI_CAP_ID_EXP ++#define PCI_CAP_ID_EXP 0x10 ++#endif ++#ifndef PCI_EXP_LNKCTL ++#define PCI_EXP_LNKCTL 16 ++#endif ++#ifndef PCI_EXP_LNKCTL_CLKREQ_EN ++#define PCI_EXP_LNKCTL_CLKREQ_EN 0x100 ++#endif ++ ++#ifndef PCI_EXP_DEVCTL_NOSNOOP_EN ++#define PCI_EXP_DEVCTL_NOSNOOP_EN 0x0800 ++#endif ++ ++#ifndef PCI_EXP_DEVCTL_RELAX_EN ++#define PCI_EXP_DEVCTL_RELAX_EN 0x0010 ++#endif ++ ++#ifndef PCI_EXP_DEVCTL_PAYLOAD ++#define PCI_EXP_DEVCTL_PAYLOAD 0x00e0 ++#endif ++ ++#ifndef PCI_EXP_DEVSTA ++#define PCI_EXP_DEVSTA 10 ++#define PCI_EXP_DEVSTA_CED 0x01 ++#define PCI_EXP_DEVSTA_NFED 0x02 ++#define PCI_EXP_DEVSTA_FED 0x04 ++#define PCI_EXP_DEVSTA_URD 0x08 ++#endif ++ ++#ifndef BCM_HAS_PCIE_SET_READRQ ++#ifndef PCI_EXP_DEVCTL ++#define PCI_EXP_DEVCTL 8 ++#endif ++#ifndef PCI_EXP_DEVCTL_READRQ ++#define PCI_EXP_DEVCTL_READRQ 0x7000 ++#endif ++static inline int pcie_set_readrq(struct pci_dev *dev, int rq) ++{ ++ int cap, err = -EINVAL; ++ u16 ctl, v; ++ ++ if (rq < 128 || rq > 4096 || (rq & (rq-1))) ++ goto out; ++ ++ v = (ffs(rq) - 8) << 12; ++ ++ cap = pci_find_capability(dev, PCI_CAP_ID_EXP); ++ if (!cap) ++ goto out; ++ ++ err = pci_read_config_word(dev, cap + PCI_EXP_DEVCTL, &ctl); ++ if (err) ++ goto out; ++ ++ if ((ctl & PCI_EXP_DEVCTL_READRQ) != v) { ++ ctl &= ~PCI_EXP_DEVCTL_READRQ; ++ ctl |= v; ++ err = pci_write_config_dword(dev, cap + PCI_EXP_DEVCTL, ctl); ++ } ++ ++out: ++ return err; ++} ++#endif /* BCM_HAS_PCIE_SET_READRQ */ ++ ++#ifndef BCM_HAS_INTX_MSI_WORKAROUND ++static inline void tg3_enable_intx(struct pci_dev *pdev) ++{ ++#if (LINUX_VERSION_CODE < 0x2060e) ++ u16 pci_command; ++ ++ pci_read_config_word(pdev, PCI_COMMAND, &pci_command); ++ if (pci_command & PCI_COMMAND_INTX_DISABLE) ++ pci_write_config_word(pdev, PCI_COMMAND, ++ pci_command & ~PCI_COMMAND_INTX_DISABLE); ++#else ++ pci_intx(pdev, 1); ++#endif ++} ++#endif /* BCM_HAS_INTX_MSI_WORKAROUND */ ++ ++ ++#if (LINUX_VERSION_CODE >= 0x20613) || \ ++ (defined(VMWARE_ESX_40_DDK) && defined(__USE_COMPAT_LAYER_2_6_18_PLUS__)) ++#define BCM_HAS_NEW_IRQ_SIG ++#endif ++ ++#if defined(INIT_DELAYED_WORK_DEFERRABLE) || \ ++ defined(INIT_WORK_NAR) || \ ++ (defined(VMWARE_ESX_40_DDK) && defined(__USE_COMPAT_LAYER_2_6_18_PLUS__)) ++#define BCM_HAS_NEW_INIT_WORK ++#endif ++ ++#ifndef ETH_FCS_LEN ++#define ETH_FCS_LEN 4 ++#endif ++ ++#ifndef BCM_HAS_PRINT_MAC ++#define DECLARE_MAC_BUF(_mac) char _mac[18] ++ ++#define MAC_FMT "%02x:%02x:%02x:%02x:%02x:%02x" ++ ++static char *print_mac(char * buf, const u8 *addr) ++{ ++ sprintf(buf, MAC_FMT, ++ addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]); ++ return buf; ++} ++#endif ++ ++ ++#ifndef NET_IP_ALIGN ++#define NET_IP_ALIGN 2 ++#endif ++ ++ ++#if !defined(BCM_HAS_ETHTOOL_OP_SET_TX_IPV6_CSUM) && \ ++ !defined(BCM_HAS_ETHTOOL_OP_SET_TX_HW_CSUM) && \ ++ defined(BCM_HAS_SET_TX_CSUM) ++static int tg3_set_tx_hw_csum(struct net_device *dev, u32 data) ++{ ++ if (data) ++ dev->features |= NETIF_F_HW_CSUM; ++ else ++ dev->features &= ~NETIF_F_HW_CSUM; ++ ++ return 0; ++} ++#endif ++ ++#ifndef NETDEV_TX_OK ++#define NETDEV_TX_OK 0 ++#endif ++ ++#ifndef NETDEV_TX_BUSY ++#define NETDEV_TX_BUSY 1 ++#endif ++ ++#ifndef NETDEV_TX_LOCKED ++#define NETDEV_TX_LOCKED -1 ++#endif ++ ++#ifndef CHECKSUM_PARTIAL ++#define CHECKSUM_PARTIAL CHECKSUM_HW ++#endif ++ ++#ifndef NETIF_F_IPV6_CSUM ++#define NETIF_F_IPV6_CSUM 16 ++#define BCM_NO_IPV6_CSUM 1 ++#endif ++ ++#ifdef NETIF_F_TSO ++#ifndef NETIF_F_GSO ++#define gso_size tso_size ++#define gso_segs tso_segs ++#endif ++#ifndef NETIF_F_TSO6 ++#define NETIF_F_TSO6 0 ++#define BCM_NO_TSO6 1 ++#endif ++#ifndef NETIF_F_TSO_ECN ++#define NETIF_F_TSO_ECN 0 ++#endif ++ ++#if (LINUX_VERSION_CODE < 0x2060c) ++static inline int skb_header_cloned(struct sk_buff *skb) { return 0; } ++#endif ++ ++#ifndef BCM_HAS_SKB_COPY_FROM_LINEAR_DATA ++static inline void skb_copy_from_linear_data(const struct sk_buff *skb, ++ void *to, ++ const unsigned int len) ++{ ++ memcpy(to, skb->data, len); ++} ++#endif ++ ++#ifndef BCM_HAS_SKB_TRANSPORT_OFFSET ++static inline int skb_transport_offset(const struct sk_buff *skb) ++{ ++ return (int) (skb->h.raw - skb->data); ++} ++#endif ++ ++#ifndef BCM_HAS_IP_HDR ++static inline struct iphdr *ip_hdr(const struct sk_buff *skb) ++{ ++ return skb->nh.iph; ++} ++#endif ++ ++#ifndef BCM_HAS_IP_HDRLEN ++static inline unsigned int ip_hdrlen(const struct sk_buff *skb) ++{ ++ return ip_hdr(skb)->ihl * 4; ++} ++#endif ++ ++#ifndef BCM_HAS_TCP_HDR ++static inline struct tcphdr *tcp_hdr(const struct sk_buff *skb) ++{ ++ return skb->h.th; ++} ++#endif ++ ++#ifndef BCM_HAS_TCP_OPTLEN ++static inline unsigned int tcp_optlen(const struct sk_buff *skb) ++{ ++ return (tcp_hdr(skb)->doff - 5) * 4; ++} ++#endif ++ ++#ifndef NETIF_F_GSO ++static struct sk_buff *skb_segment(struct sk_buff *skb, int features) ++{ ++ struct sk_buff *segs = NULL; ++ struct sk_buff *tail = NULL; ++ unsigned int mss = skb_shinfo(skb)->gso_size; ++ unsigned int doffset = skb->data - skb->mac.raw; ++ unsigned int offset = doffset; ++ unsigned int headroom; ++ unsigned int len; ++ int nfrags = skb_shinfo(skb)->nr_frags; ++ int err = -ENOMEM; ++ int i = 0; ++ int pos; ++ ++ __skb_push(skb, doffset); ++ headroom = skb_headroom(skb); ++ pos = skb_headlen(skb); ++ ++ do { ++ struct sk_buff *nskb; ++ skb_frag_t *frag; ++ int hsize; ++ int k; ++ int size; ++ ++ len = skb->len - offset; ++ if (len > mss) ++ len = mss; ++ ++ hsize = skb_headlen(skb) - offset; ++ if (hsize < 0) ++ hsize = 0; ++ if (hsize > len) ++ hsize = len; ++ ++ nskb = alloc_skb(hsize + doffset + headroom, GFP_ATOMIC); ++ if (unlikely(!nskb)) ++ goto err; ++ ++ if (segs) ++ tail->next = nskb; ++ else ++ segs = nskb; ++ tail = nskb; ++ ++ nskb->dev = skb->dev; ++ nskb->priority = skb->priority; ++ nskb->protocol = skb->protocol; ++ nskb->dst = dst_clone(skb->dst); ++ memcpy(nskb->cb, skb->cb, sizeof(skb->cb)); ++ nskb->pkt_type = skb->pkt_type; ++ nskb->mac_len = skb->mac_len; ++ ++ skb_reserve(nskb, headroom); ++ nskb->mac.raw = nskb->data; ++ nskb->nh.raw = nskb->data + skb->mac_len; ++ nskb->h.raw = nskb->nh.raw + (skb->h.raw - skb->nh.raw); ++ memcpy(skb_put(nskb, doffset), skb->data, doffset); ++ ++ frag = skb_shinfo(nskb)->frags; ++ k = 0; ++ ++ nskb->ip_summed = CHECKSUM_PARTIAL; ++ nskb->csum = skb->csum; ++ memcpy(skb_put(nskb, hsize), skb->data + offset, hsize); ++ ++ while (pos < offset + len) { ++ BUG_ON(i >= nfrags); ++ ++ *frag = skb_shinfo(skb)->frags[i]; ++ get_page(frag->page); ++ size = frag->size; ++ ++ if (pos < offset) { ++ frag->page_offset += offset - pos; ++ frag->size -= offset - pos; ++ } ++ ++ k++; ++ ++ if (pos + size <= offset + len) { ++ i++; ++ pos += size; ++ } else { ++ frag->size -= pos + size - (offset + len); ++ break; ++ } ++ ++ frag++; ++ } ++ ++ skb_shinfo(nskb)->nr_frags = k; ++ nskb->data_len = len - hsize; ++ nskb->len += nskb->data_len; ++ nskb->truesize += nskb->data_len; ++ } while ((offset += len) < skb->len); ++ ++ return segs; ++ ++err: ++ while ((skb = segs)) { ++ segs = skb->next; ++ kfree(skb); ++ } ++ return ERR_PTR(err); ++} ++ ++static struct sk_buff *tcp_tso_segment(struct sk_buff *skb, int features) ++{ ++ struct sk_buff *segs = ERR_PTR(-EINVAL); ++ struct tcphdr *th; ++ unsigned thlen; ++ unsigned int seq; ++ u32 delta; ++ unsigned int oldlen; ++ unsigned int len; ++ ++ if (!pskb_may_pull(skb, sizeof(*th))) ++ goto out; ++ ++ th = skb->h.th; ++ thlen = th->doff * 4; ++ if (thlen < sizeof(*th)) ++ goto out; ++ ++ if (!pskb_may_pull(skb, thlen)) ++ goto out; ++ ++ oldlen = (u16)~skb->len; ++ __skb_pull(skb, thlen); ++ ++ segs = skb_segment(skb, features); ++ if (IS_ERR(segs)) ++ goto out; ++ ++ len = skb_shinfo(skb)->gso_size; ++ delta = htonl(oldlen + (thlen + len)); ++ ++ skb = segs; ++ th = skb->h.th; ++ seq = ntohl(th->seq); ++ ++ do { ++ th->fin = th->psh = 0; ++ ++ th->check = ~csum_fold((u32)((u32)th->check + ++ (u32)delta)); ++ seq += len; ++ skb = skb->next; ++ th = skb->h.th; ++ ++ th->seq = htonl(seq); ++ th->cwr = 0; ++ } while (skb->next); ++ ++ delta = htonl(oldlen + (skb->tail - skb->h.raw) + skb->data_len); ++ th->check = ~csum_fold((u32)((u32)th->check + ++ (u32)delta)); ++out: ++ return segs; ++} ++ ++static struct sk_buff *inet_gso_segment(struct sk_buff *skb, int features) ++{ ++ struct sk_buff *segs = ERR_PTR(-EINVAL); ++ struct iphdr *iph; ++ int ihl; ++ int id; ++ ++ if (unlikely(!pskb_may_pull(skb, sizeof(*iph)))) ++ goto out; ++ ++ iph = skb->nh.iph; ++ ihl = iph->ihl * 4; ++ if (ihl < sizeof(*iph)) ++ goto out; ++ ++ if (unlikely(!pskb_may_pull(skb, ihl))) ++ goto out; ++ ++ skb->h.raw = __skb_pull(skb, ihl); ++ iph = skb->nh.iph; ++ id = ntohs(iph->id); ++ segs = ERR_PTR(-EPROTONOSUPPORT); ++ ++ segs = tcp_tso_segment(skb, features); ++ ++ if (!segs || IS_ERR(segs)) ++ goto out; ++ ++ skb = segs; ++ do { ++ iph = skb->nh.iph; ++ iph->id = htons(id++); ++ iph->tot_len = htons(skb->len - skb->mac_len); ++ iph->check = 0; ++ iph->check = ip_fast_csum(skb->nh.raw, iph->ihl); ++ } while ((skb = skb->next)); ++ ++out: ++ return segs; ++} ++ ++static struct sk_buff *skb_gso_segment(struct sk_buff *skb, int features) ++{ ++ struct sk_buff *segs = ERR_PTR(-EPROTONOSUPPORT); ++ ++ skb->mac.raw = skb->data; ++ skb->mac_len = skb->nh.raw - skb->data; ++ __skb_pull(skb, skb->mac_len); ++ ++ segs = inet_gso_segment(skb, features); ++ ++ __skb_push(skb, skb->data - skb->mac.raw); ++ return segs; ++} ++ ++static inline void netif_tx_lock(struct net_device *dev) ++{ ++ spin_lock(&dev->xmit_lock); ++ dev->xmit_lock_owner = smp_processor_id(); ++} ++ ++static inline void netif_tx_unlock(struct net_device *dev) ++{ ++ dev->xmit_lock_owner = -1; ++ spin_unlock(&dev->xmit_lock); ++} ++#endif /* NETIF_F_GSO */ ++ ++#endif /* NETIF_F_TSO */ ++ ++#if (LINUX_VERSION_CODE >= 0x020618) || \ ++ (defined(VMWARE_ESX_40_DDK) && defined(__USE_COMPAT_LAYER_2_6_18_PLUS__)) ++#define TG3_NAPI ++#ifdef BCM_HAS_NEW_NAPI_INTERFACE ++#define tg3_netif_rx_complete(dev, napi) netif_rx_complete((napi)) ++#define tg3_netif_rx_schedule(dev, napi) netif_rx_schedule((napi)) ++#define tg3_netif_rx_schedule_prep(dev, napi) netif_rx_schedule_prep((napi)) ++#else ++#define tg3_netif_rx_complete(dev, napi) netif_rx_complete((dev), (napi)) ++#define tg3_netif_rx_schedule(dev, napi) netif_rx_schedule((dev), (napi)) ++#define tg3_netif_rx_schedule_prep(dev, napi) netif_rx_schedule_prep((dev), (napi)) ++#endif /* BCM_HAS_NEW_NAPI_INTERFACE */ ++#else ++#define tg3_netif_rx_schedule(dev, napi) netif_rx_schedule((dev)) ++#define tg3_netif_rx_schedule_prep(dev, napi) netif_rx_schedule_prep((dev)) ++#endif ++ ++#ifndef BCM_HAS_VLAN_GRO_RECEIVE ++#define vlan_gro_receive(nap, grp, tag, skb) \ ++ vlan_hwaccel_receive_skb((skb), (grp), (tag)) ++#endif ++ ++#ifndef BCM_HAS_NAPI_GRO_RECEIVE ++#define napi_gro_receive(nap, skb) \ ++ netif_receive_skb((skb)) ++#endif ++ ++#if (LINUX_VERSION_CODE < 0x020612) ++static inline struct sk_buff *netdev_alloc_skb(struct net_device *dev, ++ unsigned int length) ++{ ++ struct sk_buff *skb = dev_alloc_skb(length); ++ if (skb) ++ skb->dev = dev; ++ return skb; ++} ++#endif ++ ++#if !defined(HAVE_NETDEV_PRIV) && (LINUX_VERSION_CODE != 0x020603) && (LINUX_VERSION_CODE != 0x020604) && (LINUX_VERSION_CODE != 0x20605) ++static inline void *netdev_priv(struct net_device *dev) ++{ ++ return dev->priv; ++} ++#endif ++ ++#ifdef OLD_NETIF ++static inline void netif_poll_disable(struct net_device *dev) ++{ ++ while (test_and_set_bit(__LINK_STATE_RX_SCHED, &dev->state)) { ++ /* No hurry. */ ++ current->state = TASK_INTERRUPTIBLE; ++ schedule_timeout(1); ++ } ++} ++ ++static inline void netif_poll_enable(struct net_device *dev) ++{ ++ clear_bit(__LINK_STATE_RX_SCHED, &dev->state); ++} ++ ++static inline void netif_tx_disable(struct net_device *dev) ++{ ++ spin_lock_bh(&dev->xmit_lock); ++ netif_stop_queue(dev); ++ spin_unlock_bh(&dev->xmit_lock); ++} ++#endif /* OLD_NETIF */ ++ ++#ifndef VLAN_GROUP_ARRAY_SPLIT_PARTS ++static inline void vlan_group_set_device(struct vlan_group *vg, int vlan_id, ++ struct net_device *dev) ++{ ++ if (vg) ++ vg->vlan_devices[vlan_id] = dev; ++} ++#endif ++ ++#ifndef ETH_SS_TEST ++#define ETH_SS_TEST 0 ++#endif ++#ifndef ETH_SS_STATS ++#define ETH_SS_STATS 1 ++#endif ++#ifndef ADVERTISED_Pause ++#define ADVERTISED_Pause (1 << 13) ++#endif ++#ifndef ADVERTISED_Asym_Pause ++#define ADVERTISED_Asym_Pause (1 << 14) ++#endif ++ ++#ifndef MII_CTRL1000 ++#define MII_CTRL1000 0x09 ++#endif ++#ifndef MII_STAT1000 ++#define MII_STAT1000 0x0a ++#endif ++#ifndef BMCR_SPEED1000 ++#define BMCR_SPEED1000 0x0040 ++#endif ++#ifndef ADVERTISE_1000XFULL ++#define ADVERTISE_1000XFULL 0x0020 ++#endif ++#ifndef ADVERTISE_1000XHALF ++#define ADVERTISE_1000XHALF 0x0040 ++#endif ++#ifndef ADVERTISE_1000XPAUSE ++#define ADVERTISE_1000XPAUSE 0x0080 ++#endif ++#ifndef ADVERTISE_1000XPSE_ASYM ++#define ADVERTISE_1000XPSE_ASYM 0x0100 ++#endif ++#ifndef ADVERTISE_PAUSE ++#define ADVERTISE_PAUSE_CAP 0x0400 ++#endif ++#ifndef ADVERTISE_PAUSE_ASYM ++#define ADVERTISE_PAUSE_ASYM 0x0800 ++#endif ++#ifndef LPA_1000XFULL ++#define LPA_1000XFULL 0x0020 ++#endif ++#ifndef LPA_1000XHALF ++#define LPA_1000XHALF 0x0040 ++#endif ++#ifndef LPA_1000XPAUSE ++#define LPA_1000XPAUSE 0x0080 ++#endif ++#ifndef LPA_1000XPAUSE_ASYM ++#define LPA_1000XPAUSE_ASYM 0x0100 ++#endif ++#ifndef LPA_PAUSE ++#define LPA_PAUSE_CAP 0x0400 ++#endif ++#ifndef LPA_PAUSE_ASYM ++#define LPA_PAUSE_ASYM 0x0800 ++#endif ++#ifndef ADVERTISE_1000HALF ++#define ADVERTISE_1000HALF 0x0100 ++#endif ++#ifndef ADVERTISE_1000FULL ++#define ADVERTISE_1000FULL 0x0200 ++#endif ++ ++#ifndef BCM_HAS_MII_RESOLVE_FLOWCTRL_FDX ++#ifndef FLOW_CTRL_TX ++#define FLOW_CTRL_TX 0x01 ++#endif ++#ifndef FLOW_CTRL_RX ++#define FLOW_CTRL_RX 0x02 ++#endif ++static u8 mii_resolve_flowctrl_fdx(u16 lcladv, u16 rmtadv) ++{ ++ u8 cap = 0; ++ ++ if (lcladv & ADVERTISE_PAUSE_CAP) { ++ if (lcladv & ADVERTISE_PAUSE_ASYM) { ++ if (rmtadv & LPA_PAUSE_CAP) ++ cap = FLOW_CTRL_TX | FLOW_CTRL_RX; ++ else if (rmtadv & LPA_PAUSE_ASYM) ++ cap = FLOW_CTRL_RX; ++ } else { ++ if (rmtadv & LPA_PAUSE_CAP) ++ cap = FLOW_CTRL_TX | FLOW_CTRL_RX; ++ } ++ } else if (lcladv & ADVERTISE_PAUSE_ASYM) { ++ if ((rmtadv & LPA_PAUSE_CAP) && (rmtadv & LPA_PAUSE_ASYM)) ++ cap = FLOW_CTRL_TX; ++ } ++ ++ return cap; ++} ++#endif /* BCM_HAS_MII_RESOLVE_FLOWCTRL_FDX */ ++ ++#ifdef BCM_INCLUDE_PHYLIB_SUPPORT ++ ++#ifndef PHY_BRCM_STD_IBND_DISABLE ++#define PHY_BRCM_STD_IBND_DISABLE 0x00000008 ++#define PHY_BRCM_EXT_IBND_RX_ENABLE 0x00000010 ++#define PHY_BRCM_EXT_IBND_TX_ENABLE 0x00000020 ++#endif ++ ++#ifndef BCM_HAS_MDIOBUS_ALLOC ++static struct mii_bus *mdiobus_alloc(void) ++{ ++ struct mii_bus *bus; ++ ++ bus = kzalloc(sizeof(*bus), GFP_KERNEL); ++ ++ return bus; ++} ++ ++void mdiobus_free(struct mii_bus *bus) ++{ ++ kfree(bus); ++} ++#endif ++ ++#ifndef BCM_HAS_DEV_NAME ++static inline const char *dev_name(const struct device *dev) ++{ ++ /* will be changed into kobject_name(&dev->kobj) in the near future */ ++ return dev->bus_id; ++} ++#endif ++ ++#endif /* BCM_INCLUDE_PHYLIB_SUPPORT */ +diff -r 30b17b8c7526 drivers/net/tg3_compat2.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/tg3_compat2.h Mon Jun 15 17:05:21 2009 +0100 +@@ -0,0 +1,165 @@ ++#ifdef BCM_HAS_SKB_DMA_MAP ++ ++#define tg3_skb_dma_addr(tp, sp, entry, i) ((sp)->dma_maps[(i)]) ++#define tg3_skb_dma_map(tp, skb, dir) skb_dma_map(&(tp)->pdev->dev, (skb), (dir)) ++#define tg3_skb_dma_unmap(tp, skb, dir) skb_dma_unmap(&(tp)->pdev->dev, (skb), (dir)) ++ ++#else /* BCM_HAS_SKB_DMA_MAP */ ++ ++#ifndef BCM_HAS_DMA_DATA_DIRECTION ++enum dma_data_direction { ++ DMA_BIDIRECTIONAL = 0, ++ DMA_TO_DEVICE = 1, ++ DMA_FROM_DEVICE = 2, ++ DMA_NONE = 3, ++}; ++#endif ++ ++#ifdef BCM_HAS_NEW_PCI_DMA_MAPPING_ERROR ++#define tg3_pci_dma_mapping_error(pdev, mapping) pci_dma_mapping_error((pdev), (mapping)) ++#elif defined(BCM_HAS_PCI_DMA_MAPPING_ERROR) ++#define tg3_pci_dma_mapping_error(pdev, mapping) pci_dma_mapping_error((mapping)) ++#else ++#define tg3_pci_dma_mapping_error(pdev, mapping) 0 ++#endif ++ ++#define tg3_skb_dma_addr(tp, sp, entry, i) (tp)->tx_buffers[(entry)].mapping; ++ ++static int tg3_skb_dma_map(struct tg3 *tp, struct sk_buff *skb, ++ enum dma_data_direction dir) ++{ ++ struct skb_shared_info *sp = skb_shinfo(skb); ++ dma_addr_t mapping; ++ int i; ++ u32 entry, errent; ++ ++ /* Queue skb data, a.k.a. the main skb fragment. */ ++ mapping = pci_map_single(tp->pdev, skb->data, ++ skb_headlen(skb), PCI_DMA_TODEVICE); ++ ++ if (tg3_pci_dma_mapping_error(tp->pdev, mapping)) ++ goto out_err; ++ ++ entry = tp->tx_prod; ++ ++ tp->tx_buffers[entry].mapping = mapping; ++ entry = NEXT_TX(entry); ++ ++ for (i = 0; i < sp->nr_frags; i++) { ++ skb_frag_t *fp = &sp->frags[i]; ++ ++ mapping = pci_map_page(tp->pdev, fp->page, fp->page_offset, ++ fp->size, PCI_DMA_TODEVICE); ++ ++ if (tg3_pci_dma_mapping_error(tp->pdev, mapping)) ++ goto unwind; ++ ++ tp->tx_buffers[entry].mapping = mapping; ++ entry = NEXT_TX(entry); ++ } ++ ++ return 0; ++ ++unwind: ++ errent = tp->tx_prod; ++ ++ pci_unmap_single(tp->pdev, ++ tp->tx_buffers[errent].mapping, ++ skb_headlen(skb), PCI_DMA_TODEVICE); ++ errent = NEXT_TX(errent); ++ ++ while (errent != entry) { ++ skb_frag_t *fp = &sp->frags[i]; ++ ++ pci_unmap_page(tp->pdev, ++ tp->tx_buffers[errent].mapping, ++ fp->size, PCI_DMA_TODEVICE); ++ errent = NEXT_TX(errent); ++ } ++ ++out_err: ++ return -ENOMEM; ++} ++ ++static void tg3_skb_dma_unmap(struct tg3 *tp, struct sk_buff *skb, ++ enum dma_data_direction dir) ++{ ++ struct skb_shared_info *sp = skb_shinfo(skb); ++ int i; ++ u32 entry = tp->tx_cons; ++ ++ pci_unmap_single(tp->pdev, ++ tp->tx_buffers[entry].mapping, ++ skb_headlen(skb), PCI_DMA_TODEVICE); ++ entry = NEXT_TX(entry); ++ ++ for (i = 0; i < sp->nr_frags; i++) { ++ skb_frag_t *fp = &sp->frags[i]; ++ ++ pci_unmap_page(tp->pdev, ++ tp->tx_buffers[entry].mapping, ++ fp->size, PCI_DMA_TODEVICE); ++ entry = NEXT_TX(entry); ++ } ++} ++ ++#endif /* BCM_HAS_SKB_DMA_MAP */ ++ ++ ++#ifdef HAVE_POLL_CONTROLLER ++#define CONFIG_NET_POLL_CONTROLLER ++#endif ++ ++#ifdef VMWARE_ESX_40_DDK ++ ++/** ++ * skb_copy_expand - copy and expand sk_buff ++ * @skb: buffer to copy ++ * @newheadroom: new free bytes at head ++ * @newtailroom: new free bytes at tail ++ * @gfp_mask: allocation priority ++ * ++ * Make a copy of both an &sk_buff and its data and while doing so ++ * allocate additional space. ++ * ++ * This is used when the caller wishes to modify the data and needs a ++ * private copy of the data to alter as well as more space for new fields. ++ * Returns %NULL on failure or the pointer to the buffer ++ * on success. The returned buffer has a reference count of 1. ++ * ++ * You must pass %GFP_ATOMIC as the allocation priority if this function ++ * is called from an interrupt. ++ */ ++struct sk_buff *skb_copy_expand(const struct sk_buff *skb, ++ int newheadroom, int newtailroom, ++ gfp_t gfp_mask) ++{ ++ int rc; ++ struct sk_buff *new_skb = skb_copy((struct sk_buff *) skb, gfp_mask); ++ ++ if(new_skb == NULL) ++ return NULL; ++ ++ rc = pskb_expand_head(new_skb, newheadroom, newtailroom, gfp_mask); ++ ++ if(rc != 0) ++ return NULL; ++ ++ return new_skb; ++} ++ ++void *memmove(void *dest, const void *src, size_t count) ++{ ++ if (dest < src) { ++ return memcpy(dest, src, count); ++ } else { ++ char *p = dest + count; ++ const char *s = src + count; ++ while (count--) ++ *--p = *--s; ++ } ++ return dest; ++} ++ ++ ++#endif +diff -r 30b17b8c7526 drivers/net/tg3_firmware.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/tg3_firmware.h Mon Jun 15 17:05:21 2009 +0100 +@@ -0,0 +1,972 @@ ++#ifdef NETIF_F_TSO ++#define TG3_TSO_SUPPORT 1 ++#else ++#define TG3_TSO_SUPPORT 0 ++#endif ++ ++#ifndef BCM_HAS_REQUEST_FIRMWARE ++ ++struct tg3_firmware { ++ size_t size; ++ const u8 *data; ++}; ++ ++#ifndef MODULE_FIRMWARE ++#define MODULE_FIRMWARE(x) ++#endif ++ ++#define TG3_FW_RELEASE_MAJOR 0x0 ++#define TG3_FW_RELASE_MINOR 0x0 ++#define TG3_FW_RELEASE_FIX 0x0 ++#define TG3_FW_START_ADDR 0x08000000 ++#define TG3_FW_TEXT_ADDR 0x08000000 ++#define TG3_FW_TEXT_LEN 0x9c0 ++#define TG3_FW_RODATA_ADDR 0x080009c0 ++#define TG3_FW_RODATA_LEN 0x60 ++#define TG3_FW_DATA_ADDR 0x08000a40 ++#define TG3_FW_DATA_LEN 0x20 ++#define TG3_FW_SBSS_ADDR 0x08000a60 ++#define TG3_FW_SBSS_LEN 0xc ++#define TG3_FW_BSS_ADDR 0x08000a70 ++#define TG3_FW_BSS_LEN 0x10 ++ ++#define TG3_5701_RLS_FW_LEN (TG3_FW_TEXT_LEN + TG3_FW_RODATA_LEN) ++ ++static const u32 tg3FwText[] = { ++0x00000000, (u32)TG3_FW_TEXT_ADDR, (u32)TG3_5701_RLS_FW_LEN, ++0x00000000, 0x10000003, 0x00000000, 0x0000000d, ++0x0000000d, 0x3c1d0800, 0x37bd3ffc, 0x03a0f021, ++0x3c100800, 0x26100000, 0x0e000018, 0x00000000, ++0x0000000d, 0x3c1d0800, 0x37bd3ffc, 0x03a0f021, ++0x3c100800, 0x26100034, 0x0e00021c, 0x00000000, ++0x0000000d, 0x00000000, 0x00000000, 0x00000000, ++0x27bdffe0, 0x3c1cc000, 0xafbf0018, 0xaf80680c, ++0x0e00004c, 0x241b2105, 0x97850000, 0x97870002, ++0x9782002c, 0x9783002e, 0x3c040800, 0x248409c0, ++0xafa00014, 0x00021400, 0x00621825, 0x00052c00, ++0xafa30010, 0x8f860010, 0x00e52825, 0x0e000060, ++0x24070102, 0x3c02ac00, 0x34420100, 0x3c03ac01, ++0x34630100, 0xaf820490, 0x3c02ffff, 0xaf820494, ++0xaf830498, 0xaf82049c, 0x24020001, 0xaf825ce0, ++0x0e00003f, 0xaf825d00, 0x0e000140, 0x00000000, ++0x8fbf0018, 0x03e00008, 0x27bd0020, 0x2402ffff, ++0xaf825404, 0x8f835400, 0x34630400, 0xaf835400, ++0xaf825404, 0x3c020800, 0x24420034, 0xaf82541c, ++0x03e00008, 0xaf805400, 0x00000000, 0x00000000, ++0x3c020800, 0x34423000, 0x3c030800, 0x34633000, ++0x3c040800, 0x348437ff, 0x3c010800, 0xac220a64, ++0x24020040, 0x3c010800, 0xac220a68, 0x3c010800, ++0xac200a60, 0xac600000, 0x24630004, 0x0083102b, ++0x5040fffd, 0xac600000, 0x03e00008, 0x00000000, ++0x00804821, 0x8faa0010, 0x3c020800, 0x8c420a60, ++0x3c040800, 0x8c840a68, 0x8fab0014, 0x24430001, ++0x0044102b, 0x3c010800, 0xac230a60, 0x14400003, ++0x00004021, 0x3c010800, 0xac200a60, 0x3c020800, ++0x8c420a60, 0x3c030800, 0x8c630a64, 0x91240000, ++0x00021140, 0x00431021, 0x00481021, 0x25080001, ++0xa0440000, 0x29020008, 0x1440fff4, 0x25290001, ++0x3c020800, 0x8c420a60, 0x3c030800, 0x8c630a64, ++0x8f84680c, 0x00021140, 0x00431021, 0xac440008, ++0xac45000c, 0xac460010, 0xac470014, 0xac4a0018, ++0x03e00008, 0xac4b001c, 0x00000000, 0x00000000, ++0x00000000, 0x00000000, 0x00000000, 0x00000000, ++0x00000000, 0x00000000, 0x00000000, 0x00000000, ++0x00000000, 0x00000000, 0x00000000, 0x00000000, ++0x00000000, 0x00000000, 0x00000000, 0x00000000, ++0x00000000, 0x00000000, 0x00000000, 0x00000000, ++0x00000000, 0x00000000, 0x00000000, 0x00000000, ++0x00000000, 0x00000000, 0x00000000, 0x00000000, ++0x00000000, 0x00000000, 0x00000000, 0x00000000, ++0x00000000, 0x00000000, 0x00000000, 0x00000000, ++0x00000000, 0x00000000, 0x00000000, 0x00000000, ++0x00000000, 0x00000000, 0x00000000, 0x00000000, ++0x00000000, 0x00000000, 0x00000000, 0x00000000, ++0x00000000, 0x00000000, 0x00000000, 0x00000000, ++0x02000008, 0x00000000, 0x0a0001e3, 0x3c0a0001, ++0x0a0001e3, 0x3c0a0002, 0x0a0001e3, 0x00000000, ++0x0a0001e3, 0x00000000, 0x0a0001e3, 0x00000000, ++0x0a0001e3, 0x00000000, 0x0a0001e3, 0x00000000, ++0x0a0001e3, 0x00000000, 0x0a0001e3, 0x00000000, ++0x0a0001e3, 0x00000000, 0x0a0001e3, 0x00000000, ++0x0a0001e3, 0x3c0a0007, 0x0a0001e3, 0x3c0a0008, ++0x0a0001e3, 0x3c0a0009, 0x0a0001e3, 0x00000000, ++0x0a0001e3, 0x00000000, 0x0a0001e3, 0x3c0a000b, ++0x0a0001e3, 0x3c0a000c, 0x0a0001e3, 0x3c0a000d, ++0x0a0001e3, 0x00000000, 0x0a0001e3, 0x00000000, ++0x0a0001e3, 0x3c0a000e, 0x0a0001e3, 0x00000000, ++0x0a0001e3, 0x00000000, 0x0a0001e3, 0x00000000, ++0x0a0001e3, 0x00000000, 0x0a0001e3, 0x00000000, ++0x0a0001e3, 0x00000000, 0x0a0001e3, 0x00000000, ++0x0a0001e3, 0x00000000, 0x0a0001e3, 0x3c0a0013, ++0x0a0001e3, 0x3c0a0014, 0x00000000, 0x00000000, ++0x00000000, 0x00000000, 0x00000000, 0x00000000, ++0x00000000, 0x00000000, 0x00000000, 0x00000000, ++0x00000000, 0x00000000, 0x00000000, 0x00000000, ++0x00000000, 0x00000000, 0x00000000, 0x00000000, ++0x00000000, 0x00000000, 0x00000000, 0x00000000, ++0x00000000, 0x00000000, 0x00000000, 0x00000000, ++0x00000000, 0x00000000, 0x00000000, 0x00000000, ++0x00000000, 0x00000000, 0x00000000, 0x00000000, ++0x00000000, 0x00000000, 0x00000000, 0x00000000, ++0x00000000, 0x00000000, 0x00000000, 0x00000000, ++0x00000000, 0x00000000, 0x00000000, 0x00000000, ++0x00000000, 0x00000000, 0x00000000, 0x00000000, ++0x00000000, 0x00000000, 0x00000000, 0x00000000, ++0x00000000, 0x00000000, 0x00000000, 0x00000000, ++0x00000000, 0x00000000, 0x00000000, 0x00000000, ++0x27bdffe0, 0x00001821, 0x00001021, 0xafbf0018, ++0xafb10014, 0xafb00010, 0x3c010800, 0x00220821, ++0xac200a70, 0x3c010800, 0x00220821, 0xac200a74, ++0x3c010800, 0x00220821, 0xac200a78, 0x24630001, ++0x1860fff5, 0x2442000c, 0x24110001, 0x8f906810, ++0x32020004, 0x14400005, 0x24040001, 0x3c020800, ++0x8c420a78, 0x18400003, 0x00002021, 0x0e000182, ++0x00000000, 0x32020001, 0x10400003, 0x00000000, ++0x0e000169, 0x00000000, 0x0a000153, 0xaf915028, ++0x8fbf0018, 0x8fb10014, 0x8fb00010, 0x03e00008, ++0x27bd0020, 0x3c050800, 0x8ca50a70, 0x3c060800, ++0x8cc60a80, 0x3c070800, 0x8ce70a78, 0x27bdffe0, ++0x3c040800, 0x248409d0, 0xafbf0018, 0xafa00010, ++0x0e000060, 0xafa00014, 0x0e00017b, 0x00002021, ++0x8fbf0018, 0x03e00008, 0x27bd0020, 0x24020001, ++0x8f836810, 0x00821004, 0x00021027, 0x00621824, ++0x03e00008, 0xaf836810, 0x27bdffd8, 0xafbf0024, ++0x1080002e, 0xafb00020, 0x8f825cec, 0xafa20018, ++0x8f825cec, 0x3c100800, 0x26100a78, 0xafa2001c, ++0x34028000, 0xaf825cec, 0x8e020000, 0x18400016, ++0x00000000, 0x3c020800, 0x94420a74, 0x8fa3001c, ++0x000221c0, 0xac830004, 0x8fa2001c, 0x3c010800, ++0x0e000201, 0xac220a74, 0x10400005, 0x00000000, ++0x8e020000, 0x24420001, 0x0a0001df, 0xae020000, ++0x3c020800, 0x8c420a70, 0x00021c02, 0x000321c0, ++0x0a0001c5, 0xafa2001c, 0x0e000201, 0x00000000, ++0x1040001f, 0x00000000, 0x8e020000, 0x8fa3001c, ++0x24420001, 0x3c010800, 0xac230a70, 0x3c010800, ++0xac230a74, 0x0a0001df, 0xae020000, 0x3c100800, ++0x26100a78, 0x8e020000, 0x18400028, 0x00000000, ++0x0e000201, 0x00000000, 0x14400024, 0x00000000, ++0x8e020000, 0x3c030800, 0x8c630a70, 0x2442ffff, ++0xafa3001c, 0x18400006, 0xae020000, 0x00031402, ++0x000221c0, 0x8c820004, 0x3c010800, 0xac220a70, ++0x97a2001e, 0x2442ff00, 0x2c420300, 0x1440000b, ++0x24024000, 0x3c040800, 0x248409dc, 0xafa00010, ++0xafa00014, 0x8fa6001c, 0x24050008, 0x0e000060, ++0x00003821, 0x0a0001df, 0x00000000, 0xaf825cf8, ++0x3c020800, 0x8c420a40, 0x8fa3001c, 0x24420001, ++0xaf835cf8, 0x3c010800, 0xac220a40, 0x8fbf0024, ++0x8fb00020, 0x03e00008, 0x27bd0028, 0x27bdffe0, ++0x3c040800, 0x248409e8, 0x00002821, 0x00003021, ++0x00003821, 0xafbf0018, 0xafa00010, 0x0e000060, ++0xafa00014, 0x8fbf0018, 0x03e00008, 0x27bd0020, ++0x8f82680c, 0x8f85680c, 0x00021827, 0x0003182b, ++0x00031823, 0x00431024, 0x00441021, 0x00a2282b, ++0x10a00006, 0x00000000, 0x00401821, 0x8f82680c, ++0x0043102b, 0x1440fffd, 0x00000000, 0x03e00008, ++0x00000000, 0x3c040800, 0x8c840000, 0x3c030800, ++0x8c630a40, 0x0064102b, 0x54400002, 0x00831023, ++0x00641023, 0x2c420008, 0x03e00008, 0x38420001, ++0x27bdffe0, 0x00802821, 0x3c040800, 0x24840a00, ++0x00003021, 0x00003821, 0xafbf0018, 0xafa00010, ++0x0e000060, 0xafa00014, 0x0a000216, 0x00000000, ++0x8fbf0018, 0x03e00008, 0x27bd0020, 0x00000000, ++0x27bdffe0, 0x3c1cc000, 0xafbf0018, 0x0e00004c, ++0xaf80680c, 0x3c040800, 0x24840a10, 0x03802821, ++0x00003021, 0x00003821, 0xafa00010, 0x0e000060, ++0xafa00014, 0x2402ffff, 0xaf825404, 0x3c0200aa, ++0x0e000234, 0xaf825434, 0x8fbf0018, 0x03e00008, ++0x27bd0020, 0x00000000, 0x00000000, 0x00000000, ++0x27bdffe8, 0xafb00010, 0x24100001, 0xafbf0014, ++0x3c01c003, 0xac200000, 0x8f826810, 0x30422000, ++0x10400003, 0x00000000, 0x0e000246, 0x00000000, ++0x0a00023a, 0xaf905428, 0x8fbf0014, 0x8fb00010, ++0x03e00008, 0x27bd0018, 0x27bdfff8, 0x8f845d0c, ++0x3c0200ff, 0x3c030800, 0x8c630a50, 0x3442fff8, ++0x00821024, 0x1043001e, 0x3c0500ff, 0x34a5fff8, ++0x3c06c003, 0x3c074000, 0x00851824, 0x8c620010, ++0x3c010800, 0xac230a50, 0x30420008, 0x10400005, ++0x00871025, 0x8cc20000, 0x24420001, 0xacc20000, ++0x00871025, 0xaf825d0c, 0x8fa20000, 0x24420001, ++0xafa20000, 0x8fa20000, 0x8fa20000, 0x24420001, ++0xafa20000, 0x8fa20000, 0x8f845d0c, 0x3c030800, ++0x8c630a50, 0x00851024, 0x1443ffe8, 0x00851824, ++0x27bd0008, 0x03e00008, 0x00000000, 0x00000000, ++0x35373031, 0x726c7341, 0x00000000, 0x00000000, ++0x53774576, 0x656e7430, 0x00000000, 0x726c7045, ++0x76656e74, 0x31000000, 0x556e6b6e, 0x45766e74, ++0x00000000, 0x00000000, 0x00000000, 0x00000000, ++0x66617461, 0x6c457272, 0x00000000, 0x00000000, ++0x4d61696e, 0x43707542, 0x00000000, 0x00000000, ++}; ++ ++static const struct tg3_firmware tg3_5701_fw = { ++ .size = TG3_5701_RLS_FW_LEN, ++ .data = (u8 *)&tg3FwText[0], ++}; ++ ++ ++#if TG3_TSO_SUPPORT != 0 ++ ++#define TG3_TSO_FW_RELEASE_MAJOR 0x1 ++#define TG3_TSO_FW_RELASE_MINOR 0x6 ++#define TG3_TSO_FW_RELEASE_FIX 0x0 ++#define TG3_TSO_FW_START_ADDR 0x08000000 ++#define TG3_TSO_FW_TEXT_ADDR 0x08000000 ++#define TG3_TSO_FW_TEXT_LEN 0x1aa0 ++#define TG3_TSO_FW_RODATA_ADDR 0x08001aa0 ++#define TG3_TSO_FW_RODATA_LEN 0x60 ++#define TG3_TSO_FW_DATA_ADDR 0x08001b20 ++#define TG3_TSO_FW_DATA_LEN 0x30 ++#define TG3_TSO_FW_SBSS_ADDR 0x08001b50 ++#define TG3_TSO_FW_SBSS_LEN 0x2c ++#define TG3_TSO_FW_BSS_ADDR 0x08001b80 ++#define TG3_TSO_FW_BSS_LEN 0x894 ++ ++#define TG3_LGCY_TSO_FW_LEN \ ++ (TG3_TSO_FW_TEXT_LEN + \ ++ TG3_TSO_FW_RODATA_LEN + \ ++ 0x20 + \ ++ TG3_TSO_FW_DATA_LEN) ++ ++static const u32 tg3TsoFwText[] = { ++0x00010600, (u32)TG3_TSO_FW_TEXT_ADDR, (u32)TG3_LGCY_TSO_FW_LEN, ++0x0e000003, 0x00000000, 0x08001b24, 0x00000000, ++0x10000003, 0x00000000, 0x0000000d, 0x0000000d, ++0x3c1d0800, 0x37bd4000, 0x03a0f021, 0x3c100800, ++0x26100000, 0x0e000010, 0x00000000, 0x0000000d, ++0x27bdffe0, 0x3c04fefe, 0xafbf0018, 0x0e0005d8, ++0x34840002, 0x0e000668, 0x00000000, 0x3c030800, ++0x90631b68, 0x24020002, 0x3c040800, 0x24841aac, ++0x14620003, 0x24050001, 0x3c040800, 0x24841aa0, ++0x24060006, 0x00003821, 0xafa00010, 0x0e00067c, ++0xafa00014, 0x8f625c50, 0x34420001, 0xaf625c50, ++0x8f625c90, 0x34420001, 0xaf625c90, 0x2402ffff, ++0x0e000034, 0xaf625404, 0x8fbf0018, 0x03e00008, ++0x27bd0020, 0x00000000, 0x00000000, 0x00000000, ++0x27bdffe0, 0xafbf001c, 0xafb20018, 0xafb10014, ++0x0e00005b, 0xafb00010, 0x24120002, 0x24110001, ++0x8f706820, 0x32020100, 0x10400003, 0x00000000, ++0x0e0000bb, 0x00000000, 0x8f706820, 0x32022000, ++0x10400004, 0x32020001, 0x0e0001f0, 0x24040001, ++0x32020001, 0x10400003, 0x00000000, 0x0e0000a3, ++0x00000000, 0x3c020800, 0x90421b98, 0x14520003, ++0x00000000, 0x0e0004c0, 0x00000000, 0x0a00003c, ++0xaf715028, 0x8fbf001c, 0x8fb20018, 0x8fb10014, ++0x8fb00010, 0x03e00008, 0x27bd0020, 0x27bdffe0, ++0x3c040800, 0x24841ac0, 0x00002821, 0x00003021, ++0x00003821, 0xafbf0018, 0xafa00010, 0x0e00067c, ++0xafa00014, 0x3c040800, 0x248423d8, 0xa4800000, ++0x3c010800, 0xa0201b98, 0x3c010800, 0xac201b9c, ++0x3c010800, 0xac201ba0, 0x3c010800, 0xac201ba4, ++0x3c010800, 0xac201bac, 0x3c010800, 0xac201bb8, ++0x3c010800, 0xac201bbc, 0x8f624434, 0x3c010800, ++0xac221b88, 0x8f624438, 0x3c010800, 0xac221b8c, ++0x8f624410, 0xac80f7a8, 0x3c010800, 0xac201b84, ++0x3c010800, 0xac2023e0, 0x3c010800, 0xac2023c8, ++0x3c010800, 0xac2023cc, 0x3c010800, 0xac202400, ++0x3c010800, 0xac221b90, 0x8f620068, 0x24030007, ++0x00021702, 0x10430005, 0x00000000, 0x8f620068, ++0x00021702, 0x14400004, 0x24020001, 0x3c010800, ++0x0a000097, 0xac20240c, 0xac820034, 0x3c040800, ++0x24841acc, 0x3c050800, 0x8ca5240c, 0x00003021, ++0x00003821, 0xafa00010, 0x0e00067c, 0xafa00014, ++0x8fbf0018, 0x03e00008, 0x27bd0020, 0x27bdffe0, ++0x3c040800, 0x24841ad8, 0x00002821, 0x00003021, ++0x00003821, 0xafbf0018, 0xafa00010, 0x0e00067c, ++0xafa00014, 0x0e00005b, 0x00000000, 0x0e0000b4, ++0x00002021, 0x8fbf0018, 0x03e00008, 0x27bd0020, ++0x24020001, 0x8f636820, 0x00821004, 0x00021027, ++0x00621824, 0x03e00008, 0xaf636820, 0x27bdffd0, ++0xafbf002c, 0xafb60028, 0xafb50024, 0xafb40020, ++0xafb3001c, 0xafb20018, 0xafb10014, 0xafb00010, ++0x8f675c5c, 0x3c030800, 0x24631bbc, 0x8c620000, ++0x14470005, 0x3c0200ff, 0x3c020800, 0x90421b98, ++0x14400119, 0x3c0200ff, 0x3442fff8, 0x00e28824, ++0xac670000, 0x00111902, 0x306300ff, 0x30e20003, ++0x000211c0, 0x00622825, 0x00a04021, 0x00071602, ++0x3c030800, 0x90631b98, 0x3044000f, 0x14600036, ++0x00804821, 0x24020001, 0x3c010800, 0xa0221b98, ++0x00051100, 0x00821025, 0x3c010800, 0xac201b9c, ++0x3c010800, 0xac201ba0, 0x3c010800, 0xac201ba4, ++0x3c010800, 0xac201bac, 0x3c010800, 0xac201bb8, ++0x3c010800, 0xac201bb0, 0x3c010800, 0xac201bb4, ++0x3c010800, 0xa42223d8, 0x9622000c, 0x30437fff, ++0x3c010800, 0xa4222410, 0x30428000, 0x3c010800, ++0xa4231bc6, 0x10400005, 0x24020001, 0x3c010800, ++0xac2223f4, 0x0a000102, 0x2406003e, 0x24060036, ++0x3c010800, 0xac2023f4, 0x9622000a, 0x3c030800, ++0x94631bc6, 0x3c010800, 0xac2023f0, 0x3c010800, ++0xac2023f8, 0x00021302, 0x00021080, 0x00c21021, ++0x00621821, 0x3c010800, 0xa42223d0, 0x3c010800, ++0x0a000115, 0xa4231b96, 0x9622000c, 0x3c010800, ++0xa42223ec, 0x3c040800, 0x24841b9c, 0x8c820000, ++0x00021100, 0x3c010800, 0x00220821, 0xac311bc8, ++0x8c820000, 0x00021100, 0x3c010800, 0x00220821, ++0xac271bcc, 0x8c820000, 0x25030001, 0x306601ff, ++0x00021100, 0x3c010800, 0x00220821, 0xac261bd0, ++0x8c820000, 0x00021100, 0x3c010800, 0x00220821, ++0xac291bd4, 0x96230008, 0x3c020800, 0x8c421bac, ++0x00432821, 0x3c010800, 0xac251bac, 0x9622000a, ++0x30420004, 0x14400018, 0x00061100, 0x8f630c14, ++0x3063000f, 0x2c620002, 0x1440000b, 0x3c02c000, ++0x8f630c14, 0x3c020800, 0x8c421b40, 0x3063000f, ++0x24420001, 0x3c010800, 0xac221b40, 0x2c620002, ++0x1040fff7, 0x3c02c000, 0x00e21825, 0xaf635c5c, ++0x8f625c50, 0x30420002, 0x10400014, 0x00000000, ++0x0a000147, 0x00000000, 0x3c030800, 0x8c631b80, ++0x3c040800, 0x94841b94, 0x01221025, 0x3c010800, ++0xa42223da, 0x24020001, 0x3c010800, 0xac221bb8, ++0x24630001, 0x0085202a, 0x3c010800, 0x10800003, ++0xac231b80, 0x3c010800, 0xa4251b94, 0x3c060800, ++0x24c61b9c, 0x8cc20000, 0x24420001, 0xacc20000, ++0x28420080, 0x14400005, 0x00000000, 0x0e000656, ++0x24040002, 0x0a0001e6, 0x00000000, 0x3c020800, ++0x8c421bb8, 0x10400078, 0x24020001, 0x3c050800, ++0x90a51b98, 0x14a20072, 0x00000000, 0x3c150800, ++0x96b51b96, 0x3c040800, 0x8c841bac, 0x32a3ffff, ++0x0083102a, 0x1440006c, 0x00000000, 0x14830003, ++0x00000000, 0x3c010800, 0xac2523f0, 0x1060005c, ++0x00009021, 0x24d60004, 0x0060a021, 0x24d30014, ++0x8ec20000, 0x00028100, 0x3c110800, 0x02308821, ++0x0e000625, 0x8e311bc8, 0x00402821, 0x10a00054, ++0x00000000, 0x9628000a, 0x31020040, 0x10400005, ++0x2407180c, 0x8e22000c, 0x2407188c, 0x00021400, ++0xaca20018, 0x3c030800, 0x00701821, 0x8c631bd0, ++0x3c020800, 0x00501021, 0x8c421bd4, 0x00031d00, ++0x00021400, 0x00621825, 0xaca30014, 0x8ec30004, ++0x96220008, 0x00432023, 0x3242ffff, 0x3083ffff, ++0x00431021, 0x0282102a, 0x14400002, 0x02b23023, ++0x00803021, 0x8e620000, 0x30c4ffff, 0x00441021, ++0xae620000, 0x8e220000, 0xaca20000, 0x8e220004, ++0x8e63fff4, 0x00431021, 0xaca20004, 0xa4a6000e, ++0x8e62fff4, 0x00441021, 0xae62fff4, 0x96230008, ++0x0043102a, 0x14400005, 0x02469021, 0x8e62fff0, ++0xae60fff4, 0x24420001, 0xae62fff0, 0xaca00008, ++0x3242ffff, 0x14540008, 0x24020305, 0x31020080, ++0x54400001, 0x34e70010, 0x24020905, 0xa4a2000c, ++0x0a0001cb, 0x34e70020, 0xa4a2000c, 0x3c020800, ++0x8c4223f0, 0x10400003, 0x3c024b65, 0x0a0001d3, ++0x34427654, 0x3c02b49a, 0x344289ab, 0xaca2001c, ++0x30e2ffff, 0xaca20010, 0x0e0005a2, 0x00a02021, ++0x3242ffff, 0x0054102b, 0x1440ffa9, 0x00000000, ++0x24020002, 0x3c010800, 0x0a0001e6, 0xa0221b98, ++0x8ec2083c, 0x24420001, 0x0a0001e6, 0xaec2083c, ++0x0e0004c0, 0x00000000, 0x8fbf002c, 0x8fb60028, ++0x8fb50024, 0x8fb40020, 0x8fb3001c, 0x8fb20018, ++0x8fb10014, 0x8fb00010, 0x03e00008, 0x27bd0030, ++0x27bdffd0, 0xafbf0028, 0xafb30024, 0xafb20020, ++0xafb1001c, 0xafb00018, 0x8f725c9c, 0x3c0200ff, ++0x3442fff8, 0x3c070800, 0x24e71bb4, 0x02428824, ++0x9623000e, 0x8ce20000, 0x00431021, 0xace20000, ++0x8e220010, 0x30420020, 0x14400011, 0x00809821, ++0x0e00063b, 0x02202021, 0x3c02c000, 0x02421825, ++0xaf635c9c, 0x8f625c90, 0x30420002, 0x1040011e, ++0x00000000, 0xaf635c9c, 0x8f625c90, 0x30420002, ++0x10400119, 0x00000000, 0x0a00020d, 0x00000000, ++0x8e240008, 0x8e230014, 0x00041402, 0x000231c0, ++0x00031502, 0x304201ff, 0x2442ffff, 0x3042007f, ++0x00031942, 0x30637800, 0x00021100, 0x24424000, ++0x00624821, 0x9522000a, 0x3084ffff, 0x30420008, ++0x104000b0, 0x000429c0, 0x3c020800, 0x8c422400, ++0x14400024, 0x24c50008, 0x94c20014, 0x3c010800, ++0xa42223d0, 0x8cc40010, 0x00041402, 0x3c010800, ++0xa42223d2, 0x3c010800, 0xa42423d4, 0x94c2000e, ++0x3083ffff, 0x00431023, 0x3c010800, 0xac222408, ++0x94c2001a, 0x3c010800, 0xac262400, 0x3c010800, ++0xac322404, 0x3c010800, 0xac2223fc, 0x3c02c000, ++0x02421825, 0xaf635c9c, 0x8f625c90, 0x30420002, ++0x104000e5, 0x00000000, 0xaf635c9c, 0x8f625c90, ++0x30420002, 0x104000e0, 0x00000000, 0x0a000246, ++0x00000000, 0x94c2000e, 0x3c030800, 0x946323d4, ++0x00434023, 0x3103ffff, 0x2c620008, 0x1040001c, ++0x00000000, 0x94c20014, 0x24420028, 0x00a22821, ++0x00031042, 0x1840000b, 0x00002021, 0x24e60848, ++0x00403821, 0x94a30000, 0x8cc20000, 0x24840001, ++0x00431021, 0xacc20000, 0x0087102a, 0x1440fff9, ++0x24a50002, 0x31020001, 0x1040001f, 0x3c024000, ++0x3c040800, 0x248423fc, 0xa0a00001, 0x94a30000, ++0x8c820000, 0x00431021, 0x0a000285, 0xac820000, ++0x8f626800, 0x3c030010, 0x00431024, 0x10400009, ++0x00000000, 0x94c2001a, 0x3c030800, 0x8c6323fc, ++0x00431021, 0x3c010800, 0xac2223fc, 0x0a000286, ++0x3c024000, 0x94c2001a, 0x94c4001c, 0x3c030800, ++0x8c6323fc, 0x00441023, 0x00621821, 0x3c010800, ++0xac2323fc, 0x3c024000, 0x02421825, 0xaf635c9c, ++0x8f625c90, 0x30420002, 0x1440fffc, 0x00000000, ++0x9522000a, 0x30420010, 0x1040009b, 0x00000000, ++0x3c030800, 0x946323d4, 0x3c070800, 0x24e72400, ++0x8ce40000, 0x8f626800, 0x24630030, 0x00832821, ++0x3c030010, 0x00431024, 0x1440000a, 0x00000000, ++0x94a20004, 0x3c040800, 0x8c842408, 0x3c030800, ++0x8c6323fc, 0x00441023, 0x00621821, 0x3c010800, ++0xac2323fc, 0x3c040800, 0x8c8423fc, 0x00041c02, ++0x3082ffff, 0x00622021, 0x00041402, 0x00822021, ++0x00041027, 0xa4a20006, 0x3c030800, 0x8c632404, ++0x3c0200ff, 0x3442fff8, 0x00628824, 0x96220008, ++0x24050001, 0x24034000, 0x000231c0, 0x00801021, ++0xa4c2001a, 0xa4c0001c, 0xace00000, 0x3c010800, ++0xac251b60, 0xaf635cb8, 0x8f625cb0, 0x30420002, ++0x10400003, 0x00000000, 0x3c010800, 0xac201b60, ++0x8e220008, 0xaf625cb8, 0x8f625cb0, 0x30420002, ++0x10400003, 0x00000000, 0x3c010800, 0xac201b60, ++0x3c020800, 0x8c421b60, 0x1040ffec, 0x00000000, ++0x3c040800, 0x0e00063b, 0x8c842404, 0x0a00032a, ++0x00000000, 0x3c030800, 0x90631b98, 0x24020002, ++0x14620003, 0x3c034b65, 0x0a0002e1, 0x00008021, ++0x8e22001c, 0x34637654, 0x10430002, 0x24100002, ++0x24100001, 0x00c02021, 0x0e000350, 0x02003021, ++0x24020003, 0x3c010800, 0xa0221b98, 0x24020002, ++0x1202000a, 0x24020001, 0x3c030800, 0x8c6323f0, ++0x10620006, 0x00000000, 0x3c020800, 0x944223d8, ++0x00021400, 0x0a00031f, 0xae220014, 0x3c040800, ++0x248423da, 0x94820000, 0x00021400, 0xae220014, ++0x3c020800, 0x8c421bbc, 0x3c03c000, 0x3c010800, ++0xa0201b98, 0x00431025, 0xaf625c5c, 0x8f625c50, ++0x30420002, 0x10400009, 0x00000000, 0x2484f7e2, ++0x8c820000, 0x00431025, 0xaf625c5c, 0x8f625c50, ++0x30420002, 0x1440fffa, 0x00000000, 0x3c020800, ++0x24421b84, 0x8c430000, 0x24630001, 0xac430000, ++0x8f630c14, 0x3063000f, 0x2c620002, 0x1440000c, ++0x3c024000, 0x8f630c14, 0x3c020800, 0x8c421b40, ++0x3063000f, 0x24420001, 0x3c010800, 0xac221b40, ++0x2c620002, 0x1040fff7, 0x00000000, 0x3c024000, ++0x02421825, 0xaf635c9c, 0x8f625c90, 0x30420002, ++0x1440fffc, 0x00000000, 0x12600003, 0x00000000, ++0x0e0004c0, 0x00000000, 0x8fbf0028, 0x8fb30024, ++0x8fb20020, 0x8fb1001c, 0x8fb00018, 0x03e00008, ++0x27bd0030, 0x8f634450, 0x3c040800, 0x24841b88, ++0x8c820000, 0x00031c02, 0x0043102b, 0x14400007, ++0x3c038000, 0x8c840004, 0x8f624450, 0x00021c02, ++0x0083102b, 0x1040fffc, 0x3c038000, 0xaf634444, ++0x8f624444, 0x00431024, 0x1440fffd, 0x00000000, ++0x8f624448, 0x03e00008, 0x3042ffff, 0x3c024000, ++0x00822025, 0xaf645c38, 0x8f625c30, 0x30420002, ++0x1440fffc, 0x00000000, 0x03e00008, 0x00000000, ++0x27bdffe0, 0x00805821, 0x14c00011, 0x256e0008, ++0x3c020800, 0x8c4223f4, 0x10400007, 0x24020016, ++0x3c010800, 0xa42223d2, 0x2402002a, 0x3c010800, ++0x0a000364, 0xa42223d4, 0x8d670010, 0x00071402, ++0x3c010800, 0xa42223d2, 0x3c010800, 0xa42723d4, ++0x3c040800, 0x948423d4, 0x3c030800, 0x946323d2, ++0x95cf0006, 0x3c020800, 0x944223d0, 0x00832023, ++0x01e2c023, 0x3065ffff, 0x24a20028, 0x01c24821, ++0x3082ffff, 0x14c0001a, 0x01226021, 0x9582000c, ++0x3042003f, 0x3c010800, 0xa42223d6, 0x95820004, ++0x95830006, 0x3c010800, 0xac2023e4, 0x3c010800, ++0xac2023e8, 0x00021400, 0x00431025, 0x3c010800, ++0xac221bc0, 0x95220004, 0x3c010800, 0xa4221bc4, ++0x95230002, 0x01e51023, 0x0043102a, 0x10400010, ++0x24020001, 0x3c010800, 0x0a000398, 0xac2223f8, ++0x3c030800, 0x8c6323e8, 0x3c020800, 0x94421bc4, ++0x00431021, 0xa5220004, 0x3c020800, 0x94421bc0, ++0xa5820004, 0x3c020800, 0x8c421bc0, 0xa5820006, ++0x3c020800, 0x8c4223f0, 0x3c0d0800, 0x8dad23e4, ++0x3c0a0800, 0x144000e5, 0x8d4a23e8, 0x3c020800, ++0x94421bc4, 0x004a1821, 0x3063ffff, 0x0062182b, ++0x24020002, 0x10c2000d, 0x01435023, 0x3c020800, ++0x944223d6, 0x30420009, 0x10400008, 0x00000000, ++0x9582000c, 0x3042fff6, 0xa582000c, 0x3c020800, ++0x944223d6, 0x30420009, 0x01a26823, 0x3c020800, ++0x8c4223f8, 0x1040004a, 0x01203821, 0x3c020800, ++0x944223d2, 0x00004021, 0xa520000a, 0x01e21023, ++0xa5220002, 0x3082ffff, 0x00021042, 0x18400008, ++0x00003021, 0x00401821, 0x94e20000, 0x25080001, ++0x00c23021, 0x0103102a, 0x1440fffb, 0x24e70002, ++0x00061c02, 0x30c2ffff, 0x00623021, 0x00061402, ++0x00c23021, 0x00c02821, 0x00061027, 0xa522000a, ++0x00003021, 0x2527000c, 0x00004021, 0x94e20000, ++0x25080001, 0x00c23021, 0x2d020004, 0x1440fffb, ++0x24e70002, 0x95220002, 0x00004021, 0x91230009, ++0x00442023, 0x01803821, 0x3082ffff, 0xa4e00010, ++0x00621821, 0x00021042, 0x18400010, 0x00c33021, ++0x00404821, 0x94e20000, 0x24e70002, 0x00c23021, ++0x30e2007f, 0x14400006, 0x25080001, 0x8d630000, ++0x3c02007f, 0x3442ff80, 0x00625824, 0x25670008, ++0x0109102a, 0x1440fff3, 0x00000000, 0x30820001, ++0x10400005, 0x00061c02, 0xa0e00001, 0x94e20000, ++0x00c23021, 0x00061c02, 0x30c2ffff, 0x00623021, ++0x00061402, 0x00c23021, 0x0a00047d, 0x30c6ffff, ++0x24020002, 0x14c20081, 0x00000000, 0x3c020800, ++0x8c42240c, 0x14400007, 0x00000000, 0x3c020800, ++0x944223d2, 0x95230002, 0x01e21023, 0x10620077, ++0x00000000, 0x3c020800, 0x944223d2, 0x01e21023, ++0xa5220002, 0x3c020800, 0x8c42240c, 0x1040001a, ++0x31e3ffff, 0x8dc70010, 0x3c020800, 0x94421b96, ++0x00e04021, 0x00072c02, 0x00aa2021, 0x00431023, ++0x00823823, 0x00072402, 0x30e2ffff, 0x00823821, ++0x00071027, 0xa522000a, 0x3102ffff, 0x3c040800, ++0x948423d4, 0x00453023, 0x00e02821, 0x00641823, ++0x006d1821, 0x00c33021, 0x00061c02, 0x30c2ffff, ++0x0a00047d, 0x00623021, 0x01203821, 0x00004021, ++0x3082ffff, 0x00021042, 0x18400008, 0x00003021, ++0x00401821, 0x94e20000, 0x25080001, 0x00c23021, ++0x0103102a, 0x1440fffb, 0x24e70002, 0x00061c02, ++0x30c2ffff, 0x00623021, 0x00061402, 0x00c23021, ++0x00c02821, 0x00061027, 0xa522000a, 0x00003021, ++0x2527000c, 0x00004021, 0x94e20000, 0x25080001, ++0x00c23021, 0x2d020004, 0x1440fffb, 0x24e70002, ++0x95220002, 0x00004021, 0x91230009, 0x00442023, ++0x01803821, 0x3082ffff, 0xa4e00010, 0x3c040800, ++0x948423d4, 0x00621821, 0x00c33021, 0x00061c02, ++0x30c2ffff, 0x00623021, 0x00061c02, 0x3c020800, ++0x944223d0, 0x00c34821, 0x00441023, 0x00021fc2, ++0x00431021, 0x00021043, 0x18400010, 0x00003021, ++0x00402021, 0x94e20000, 0x24e70002, 0x00c23021, ++0x30e2007f, 0x14400006, 0x25080001, 0x8d630000, ++0x3c02007f, 0x3442ff80, 0x00625824, 0x25670008, ++0x0104102a, 0x1440fff3, 0x00000000, 0x3c020800, ++0x944223ec, 0x00c23021, 0x3122ffff, 0x00c23021, ++0x00061c02, 0x30c2ffff, 0x00623021, 0x00061402, ++0x00c23021, 0x00c04021, 0x00061027, 0xa5820010, ++0xadc00014, 0x0a00049d, 0xadc00000, 0x8dc70010, ++0x00e04021, 0x11400007, 0x00072c02, 0x00aa3021, ++0x00061402, 0x30c3ffff, 0x00433021, 0x00061402, ++0x00c22821, 0x00051027, 0xa522000a, 0x3c030800, ++0x946323d4, 0x3102ffff, 0x01e21021, 0x00433023, ++0x00cd3021, 0x00061c02, 0x30c2ffff, 0x00623021, ++0x00061402, 0x00c23021, 0x00c04021, 0x00061027, ++0xa5820010, 0x3102ffff, 0x00051c00, 0x00431025, ++0xadc20010, 0x3c020800, 0x8c4223f4, 0x10400005, ++0x2de205eb, 0x14400002, 0x25e2fff2, 0x34028870, ++0xa5c20034, 0x3c030800, 0x246323e8, 0x8c620000, ++0x24420001, 0xac620000, 0x3c040800, 0x8c8423e4, ++0x3c020800, 0x8c421bc0, 0x3303ffff, 0x00832021, ++0x00431821, 0x0062102b, 0x3c010800, 0xac2423e4, ++0x10400003, 0x2482ffff, 0x3c010800, 0xac2223e4, ++0x3c010800, 0xac231bc0, 0x03e00008, 0x27bd0020, ++0x27bdffb8, 0x3c050800, 0x24a51b96, 0xafbf0044, ++0xafbe0040, 0xafb7003c, 0xafb60038, 0xafb50034, ++0xafb40030, 0xafb3002c, 0xafb20028, 0xafb10024, ++0xafb00020, 0x94a90000, 0x3c020800, 0x944223d0, ++0x3c030800, 0x8c631bb0, 0x3c040800, 0x8c841bac, ++0x01221023, 0x0064182a, 0xa7a9001e, 0x106000be, ++0xa7a20016, 0x24be0022, 0x97b6001e, 0x24b3001a, ++0x24b70016, 0x8fc20000, 0x14400008, 0x00000000, ++0x8fc2fff8, 0x97a30016, 0x8fc4fff4, 0x00431021, ++0x0082202a, 0x148000b0, 0x00000000, 0x97d50818, ++0x32a2ffff, 0x104000a3, 0x00009021, 0x0040a021, ++0x00008821, 0x0e000625, 0x00000000, 0x00403021, ++0x14c00007, 0x00000000, 0x3c020800, 0x8c4223dc, ++0x24420001, 0x3c010800, 0x0a000596, 0xac2223dc, ++0x3c100800, 0x02118021, 0x8e101bc8, 0x9608000a, ++0x31020040, 0x10400005, 0x2407180c, 0x8e02000c, ++0x2407188c, 0x00021400, 0xacc20018, 0x31020080, ++0x54400001, 0x34e70010, 0x3c020800, 0x00511021, ++0x8c421bd0, 0x3c030800, 0x00711821, 0x8c631bd4, ++0x00021500, 0x00031c00, 0x00431025, 0xacc20014, ++0x96040008, 0x3242ffff, 0x00821021, 0x0282102a, ++0x14400002, 0x02b22823, 0x00802821, 0x8e020000, ++0x02459021, 0xacc20000, 0x8e020004, 0x00c02021, ++0x26310010, 0xac820004, 0x30e2ffff, 0xac800008, ++0xa485000e, 0xac820010, 0x24020305, 0x0e0005a2, ++0xa482000c, 0x3242ffff, 0x0054102b, 0x1440ffc5, ++0x3242ffff, 0x0a00058e, 0x00000000, 0x8e620000, ++0x8e63fffc, 0x0043102a, 0x10400067, 0x00000000, ++0x8e62fff0, 0x00028900, 0x3c100800, 0x02118021, ++0x0e000625, 0x8e101bc8, 0x00403021, 0x14c00005, ++0x00000000, 0x8e62082c, 0x24420001, 0x0a000596, ++0xae62082c, 0x9608000a, 0x31020040, 0x10400005, ++0x2407180c, 0x8e02000c, 0x2407188c, 0x00021400, ++0xacc20018, 0x3c020800, 0x00511021, 0x8c421bd0, ++0x3c030800, 0x00711821, 0x8c631bd4, 0x00021500, ++0x00031c00, 0x00431025, 0xacc20014, 0x8e63fff4, ++0x96020008, 0x00432023, 0x3242ffff, 0x3083ffff, ++0x00431021, 0x02c2102a, 0x10400003, 0x00802821, ++0x97a9001e, 0x01322823, 0x8e620000, 0x30a4ffff, ++0x00441021, 0xae620000, 0xa4c5000e, 0x8e020000, ++0xacc20000, 0x8e020004, 0x8e63fff4, 0x00431021, ++0xacc20004, 0x8e63fff4, 0x96020008, 0x00641821, ++0x0062102a, 0x14400006, 0x02459021, 0x8e62fff0, ++0xae60fff4, 0x24420001, 0x0a000571, 0xae62fff0, ++0xae63fff4, 0xacc00008, 0x3242ffff, 0x10560003, ++0x31020004, 0x10400006, 0x24020305, 0x31020080, ++0x54400001, 0x34e70010, 0x34e70020, 0x24020905, ++0xa4c2000c, 0x8ee30000, 0x8ee20004, 0x14620007, ++0x3c02b49a, 0x8ee20860, 0x54400001, 0x34e70400, ++0x3c024b65, 0x0a000588, 0x34427654, 0x344289ab, ++0xacc2001c, 0x30e2ffff, 0xacc20010, 0x0e0005a2, ++0x00c02021, 0x3242ffff, 0x0056102b, 0x1440ff9b, ++0x00000000, 0x8e620000, 0x8e63fffc, 0x0043102a, ++0x1440ff48, 0x00000000, 0x8fbf0044, 0x8fbe0040, ++0x8fb7003c, 0x8fb60038, 0x8fb50034, 0x8fb40030, ++0x8fb3002c, 0x8fb20028, 0x8fb10024, 0x8fb00020, ++0x03e00008, 0x27bd0048, 0x27bdffe8, 0xafbf0014, ++0xafb00010, 0x8f624450, 0x8f634410, 0x0a0005b1, ++0x00808021, 0x8f626820, 0x30422000, 0x10400003, ++0x00000000, 0x0e0001f0, 0x00002021, 0x8f624450, ++0x8f634410, 0x3042ffff, 0x0043102b, 0x1440fff5, ++0x00000000, 0x8f630c14, 0x3063000f, 0x2c620002, ++0x1440000b, 0x00000000, 0x8f630c14, 0x3c020800, ++0x8c421b40, 0x3063000f, 0x24420001, 0x3c010800, ++0xac221b40, 0x2c620002, 0x1040fff7, 0x00000000, ++0xaf705c18, 0x8f625c10, 0x30420002, 0x10400009, ++0x00000000, 0x8f626820, 0x30422000, 0x1040fff8, ++0x00000000, 0x0e0001f0, 0x00002021, 0x0a0005c4, ++0x00000000, 0x8fbf0014, 0x8fb00010, 0x03e00008, ++0x27bd0018, 0x00000000, 0x00000000, 0x00000000, ++0x27bdffe8, 0x3c1bc000, 0xafbf0014, 0xafb00010, ++0xaf60680c, 0x8f626804, 0x34420082, 0xaf626804, ++0x8f634000, 0x24020b50, 0x3c010800, 0xac221b54, ++0x24020b78, 0x3c010800, 0xac221b64, 0x34630002, ++0xaf634000, 0x0e000605, 0x00808021, 0x3c010800, ++0xa0221b68, 0x304200ff, 0x24030002, 0x14430005, ++0x00000000, 0x3c020800, 0x8c421b54, 0x0a0005f8, ++0xac5000c0, 0x3c020800, 0x8c421b54, 0xac5000bc, ++0x8f624434, 0x8f634438, 0x8f644410, 0x3c010800, ++0xac221b5c, 0x3c010800, 0xac231b6c, 0x3c010800, ++0xac241b58, 0x8fbf0014, 0x8fb00010, 0x03e00008, ++0x27bd0018, 0x3c040800, 0x8c870000, 0x3c03aa55, ++0x3463aa55, 0x3c06c003, 0xac830000, 0x8cc20000, ++0x14430007, 0x24050002, 0x3c0355aa, 0x346355aa, ++0xac830000, 0x8cc20000, 0x50430001, 0x24050001, ++0x3c020800, 0xac470000, 0x03e00008, 0x00a01021, ++0x27bdfff8, 0x18800009, 0x00002821, 0x8f63680c, ++0x8f62680c, 0x1043fffe, 0x00000000, 0x24a50001, ++0x00a4102a, 0x1440fff9, 0x00000000, 0x03e00008, ++0x27bd0008, 0x8f634450, 0x3c020800, 0x8c421b5c, ++0x00031c02, 0x0043102b, 0x14400008, 0x3c038000, ++0x3c040800, 0x8c841b6c, 0x8f624450, 0x00021c02, ++0x0083102b, 0x1040fffc, 0x3c038000, 0xaf634444, ++0x8f624444, 0x00431024, 0x1440fffd, 0x00000000, ++0x8f624448, 0x03e00008, 0x3042ffff, 0x3082ffff, ++0x2442e000, 0x2c422001, 0x14400003, 0x3c024000, ++0x0a000648, 0x2402ffff, 0x00822025, 0xaf645c38, ++0x8f625c30, 0x30420002, 0x1440fffc, 0x00001021, ++0x03e00008, 0x00000000, 0x8f624450, 0x3c030800, ++0x8c631b58, 0x0a000651, 0x3042ffff, 0x8f624450, ++0x3042ffff, 0x0043102b, 0x1440fffc, 0x00000000, ++0x03e00008, 0x00000000, 0x27bdffe0, 0x00802821, ++0x3c040800, 0x24841af0, 0x00003021, 0x00003821, ++0xafbf0018, 0xafa00010, 0x0e00067c, 0xafa00014, ++0x0a000660, 0x00000000, 0x8fbf0018, 0x03e00008, ++0x27bd0020, 0x00000000, 0x00000000, 0x00000000, ++0x3c020800, 0x34423000, 0x3c030800, 0x34633000, ++0x3c040800, 0x348437ff, 0x3c010800, 0xac221b74, ++0x24020040, 0x3c010800, 0xac221b78, 0x3c010800, ++0xac201b70, 0xac600000, 0x24630004, 0x0083102b, ++0x5040fffd, 0xac600000, 0x03e00008, 0x00000000, ++0x00804821, 0x8faa0010, 0x3c020800, 0x8c421b70, ++0x3c040800, 0x8c841b78, 0x8fab0014, 0x24430001, ++0x0044102b, 0x3c010800, 0xac231b70, 0x14400003, ++0x00004021, 0x3c010800, 0xac201b70, 0x3c020800, ++0x8c421b70, 0x3c030800, 0x8c631b74, 0x91240000, ++0x00021140, 0x00431021, 0x00481021, 0x25080001, ++0xa0440000, 0x29020008, 0x1440fff4, 0x25290001, ++0x3c020800, 0x8c421b70, 0x3c030800, 0x8c631b74, ++0x8f64680c, 0x00021140, 0x00431021, 0xac440008, ++0xac45000c, 0xac460010, 0xac470014, 0xac4a0018, ++0x03e00008, 0xac4b001c, 0x00000000, 0x00000000, ++0x4d61696e, 0x43707542, 0x00000000, 0x4d61696e, ++0x43707541, 0x00000000, 0x00000000, 0x00000000, ++0x73746b6f, 0x66666c64, 0x496e0000, 0x73746b6f, ++0x66662a2a, 0x00000000, 0x53774576, 0x656e7430, ++0x00000000, 0x00000000, 0x00000000, 0x00000000, ++0x66617461, 0x6c457272, 0x00000000, 0x00000000, ++0x00000000, 0x00000000, 0x00000000, 0x00000000, ++0x00000000, 0x00000000, 0x00000000, 0x00000000, ++0x00000000, 0x73746b6f, 0x66666c64, 0x5f76312e, ++0x362e3000, 0x00000000, 0x00000000, 0x00000000, ++0x00000000, 0x00000000, 0x00000000, 0x00000000, ++}; ++ ++static const struct tg3_firmware tg3_lgcy_tso_fw = { ++ .size = TG3_LGCY_TSO_FW_LEN, ++ .data = (u8 *)&tg3TsoFwText[0], ++}; ++ ++/* 5705 needs a special version of the TSO firmware. */ ++#define TG3_TSO5_FW_RELEASE_MAJOR 0x1 ++#define TG3_TSO5_FW_RELASE_MINOR 0x2 ++#define TG3_TSO5_FW_RELEASE_FIX 0x0 ++#define TG3_TSO5_FW_START_ADDR 0x00010000 ++#define TG3_TSO5_FW_TEXT_ADDR 0x00010000 ++#define TG3_TSO5_FW_TEXT_LEN 0xe90 ++#define TG3_TSO5_FW_RODATA_ADDR 0x00010e90 ++#define TG3_TSO5_FW_RODATA_LEN 0x50 ++#define TG3_TSO5_FW_DATA_ADDR 0x00010f00 ++#define TG3_TSO5_FW_DATA_LEN 0x20 ++#define TG3_TSO5_FW_SBSS_ADDR 0x00010f20 ++#define TG3_TSO5_FW_SBSS_LEN 0x28 ++#define TG3_TSO5_FW_BSS_ADDR 0x00010f50 ++#define TG3_TSO5_FW_BSS_LEN 0x88 ++ ++#define TG3_5705_TSO_FW_LEN \ ++ (TG3_TSO5_FW_TEXT_LEN + \ ++ TG3_TSO5_FW_RODATA_LEN + \ ++ 0x20 + \ ++ TG3_TSO5_FW_DATA_LEN) ++ ++static const u32 tg3Tso5FwText[] = { ++0x00010200, (u32)TG3_TSO5_FW_TEXT_ADDR, (u32)TG3_5705_TSO_FW_LEN, ++0x0c004003, 0x00000000, 0x00010f04, 0x00000000, ++0x10000003, 0x00000000, 0x0000000d, 0x0000000d, ++0x3c1d0001, 0x37bde000, 0x03a0f021, 0x3c100001, ++0x26100000, 0x0c004010, 0x00000000, 0x0000000d, ++0x27bdffe0, 0x3c04fefe, 0xafbf0018, 0x0c0042e8, ++0x34840002, 0x0c004364, 0x00000000, 0x3c030001, ++0x90630f34, 0x24020002, 0x3c040001, 0x24840e9c, ++0x14620003, 0x24050001, 0x3c040001, 0x24840e90, ++0x24060002, 0x00003821, 0xafa00010, 0x0c004378, ++0xafa00014, 0x0c00402c, 0x00000000, 0x8fbf0018, ++0x03e00008, 0x27bd0020, 0x00000000, 0x00000000, ++0x27bdffe0, 0xafbf001c, 0xafb20018, 0xafb10014, ++0x0c0042d4, 0xafb00010, 0x3c128000, 0x24110001, ++0x8f706810, 0x32020400, 0x10400007, 0x00000000, ++0x8f641008, 0x00921024, 0x14400003, 0x00000000, ++0x0c004064, 0x00000000, 0x3c020001, 0x90420f56, ++0x10510003, 0x32020200, 0x1040fff1, 0x00000000, ++0x0c0041b4, 0x00000000, 0x08004034, 0x00000000, ++0x8fbf001c, 0x8fb20018, 0x8fb10014, 0x8fb00010, ++0x03e00008, 0x27bd0020, 0x27bdffe0, 0x3c040001, ++0x24840eb0, 0x00002821, 0x00003021, 0x00003821, ++0xafbf0018, 0xafa00010, 0x0c004378, 0xafa00014, ++0x0000d021, 0x24020130, 0xaf625000, 0x3c010001, ++0xa4200f50, 0x3c010001, 0xa0200f57, 0x8fbf0018, ++0x03e00008, 0x27bd0020, 0x00000000, 0x00000000, ++0x3c030001, 0x24630f60, 0x90620000, 0x27bdfff0, ++0x14400003, 0x0080c021, 0x08004073, 0x00004821, ++0x3c022000, 0x03021024, 0x10400003, 0x24090002, ++0x08004073, 0xa0600000, 0x24090001, 0x00181040, ++0x30431f80, 0x346f8008, 0x1520004b, 0x25eb0028, ++0x3c040001, 0x00832021, 0x8c848010, 0x3c050001, ++0x24a50f7a, 0x00041402, 0xa0a20000, 0x3c010001, ++0xa0240f7b, 0x3c020001, 0x00431021, 0x94428014, ++0x3c010001, 0xa0220f7c, 0x3c0c0001, 0x01836021, ++0x8d8c8018, 0x304200ff, 0x24420008, 0x000220c3, ++0x24020001, 0x3c010001, 0xa0220f60, 0x0124102b, ++0x1040000c, 0x00003821, 0x24a6000e, 0x01602821, ++0x8ca20000, 0x8ca30004, 0x24a50008, 0x24e70001, ++0xacc20000, 0xacc30004, 0x00e4102b, 0x1440fff8, ++0x24c60008, 0x00003821, 0x3c080001, 0x25080f7b, ++0x91060000, 0x3c020001, 0x90420f7c, 0x2503000d, ++0x00c32821, 0x00461023, 0x00021fc2, 0x00431021, ++0x00021043, 0x1840000c, 0x00002021, 0x91020001, ++0x00461023, 0x00021fc2, 0x00431021, 0x00021843, ++0x94a20000, 0x24e70001, 0x00822021, 0x00e3102a, ++0x1440fffb, 0x24a50002, 0x00041c02, 0x3082ffff, ++0x00622021, 0x00041402, 0x00822021, 0x3c02ffff, ++0x01821024, 0x3083ffff, 0x00431025, 0x3c010001, ++0x080040fa, 0xac220f80, 0x3c050001, 0x24a50f7c, ++0x90a20000, 0x3c0c0001, 0x01836021, 0x8d8c8018, ++0x000220c2, 0x1080000e, 0x00003821, 0x01603021, ++0x24a5000c, 0x8ca20000, 0x8ca30004, 0x24a50008, ++0x24e70001, 0xacc20000, 0xacc30004, 0x00e4102b, ++0x1440fff8, 0x24c60008, 0x3c050001, 0x24a50f7c, ++0x90a20000, 0x30430007, 0x24020004, 0x10620011, ++0x28620005, 0x10400005, 0x24020002, 0x10620008, ++0x000710c0, 0x080040fa, 0x00000000, 0x24020006, ++0x1062000e, 0x000710c0, 0x080040fa, 0x00000000, ++0x00a21821, 0x9463000c, 0x004b1021, 0x080040fa, ++0xa4430000, 0x000710c0, 0x00a21821, 0x8c63000c, ++0x004b1021, 0x080040fa, 0xac430000, 0x00a21821, ++0x8c63000c, 0x004b2021, 0x00a21021, 0xac830000, ++0x94420010, 0xa4820004, 0x95e70006, 0x3c020001, ++0x90420f7c, 0x3c030001, 0x90630f7a, 0x00e2c823, ++0x3c020001, 0x90420f7b, 0x24630028, 0x01e34021, ++0x24420028, 0x15200012, 0x01e23021, 0x94c2000c, ++0x3c010001, 0xa4220f78, 0x94c20004, 0x94c30006, ++0x3c010001, 0xa4200f76, 0x3c010001, 0xa4200f72, ++0x00021400, 0x00431025, 0x3c010001, 0xac220f6c, ++0x95020004, 0x3c010001, 0x08004124, 0xa4220f70, ++0x3c020001, 0x94420f70, 0x3c030001, 0x94630f72, ++0x00431021, 0xa5020004, 0x3c020001, 0x94420f6c, ++0xa4c20004, 0x3c020001, 0x8c420f6c, 0xa4c20006, ++0x3c040001, 0x94840f72, 0x3c020001, 0x94420f70, ++0x3c0a0001, 0x954a0f76, 0x00441821, 0x3063ffff, ++0x0062182a, 0x24020002, 0x1122000b, 0x00832023, ++0x3c030001, 0x94630f78, 0x30620009, 0x10400006, ++0x3062fff6, 0xa4c2000c, 0x3c020001, 0x94420f78, ++0x30420009, 0x01425023, 0x24020001, 0x1122001b, ++0x29220002, 0x50400005, 0x24020002, 0x11200007, ++0x31a2ffff, 0x08004197, 0x00000000, 0x1122001d, ++0x24020016, 0x08004197, 0x31a2ffff, 0x3c0e0001, ++0x95ce0f80, 0x10800005, 0x01806821, 0x01c42021, ++0x00041c02, 0x3082ffff, 0x00627021, 0x000e1027, ++0xa502000a, 0x3c030001, 0x90630f7b, 0x31a2ffff, ++0x00e21021, 0x0800418d, 0x00432023, 0x3c020001, ++0x94420f80, 0x00442021, 0x00041c02, 0x3082ffff, ++0x00622021, 0x00807021, 0x00041027, 0x08004185, ++0xa502000a, 0x3c050001, 0x24a50f7a, 0x90a30000, ++0x14620002, 0x24e2fff2, 0xa5e20034, 0x90a20000, ++0x00e21023, 0xa5020002, 0x3c030001, 0x94630f80, ++0x3c020001, 0x94420f5a, 0x30e5ffff, 0x00641821, ++0x00451023, 0x00622023, 0x00041c02, 0x3082ffff, ++0x00622021, 0x00041027, 0xa502000a, 0x3c030001, ++0x90630f7c, 0x24620001, 0x14a20005, 0x00807021, ++0x01631021, 0x90420000, 0x08004185, 0x00026200, ++0x24620002, 0x14a20003, 0x306200fe, 0x004b1021, ++0x944c0000, 0x3c020001, 0x94420f82, 0x3183ffff, ++0x3c040001, 0x90840f7b, 0x00431021, 0x00e21021, ++0x00442023, 0x008a2021, 0x00041c02, 0x3082ffff, ++0x00622021, 0x00041402, 0x00822021, 0x00806821, ++0x00041027, 0xa4c20010, 0x31a2ffff, 0x000e1c00, ++0x00431025, 0x3c040001, 0x24840f72, 0xade20010, ++0x94820000, 0x3c050001, 0x94a50f76, 0x3c030001, ++0x8c630f6c, 0x24420001, 0x00b92821, 0xa4820000, ++0x3322ffff, 0x00622021, 0x0083182b, 0x3c010001, ++0xa4250f76, 0x10600003, 0x24a2ffff, 0x3c010001, ++0xa4220f76, 0x3c024000, 0x03021025, 0x3c010001, ++0xac240f6c, 0xaf621008, 0x03e00008, 0x27bd0010, ++0x3c030001, 0x90630f56, 0x27bdffe8, 0x24020001, ++0xafbf0014, 0x10620026, 0xafb00010, 0x8f620cf4, ++0x2442ffff, 0x3042007f, 0x00021100, 0x8c434000, ++0x3c010001, 0xac230f64, 0x8c434008, 0x24444000, ++0x8c5c4004, 0x30620040, 0x14400002, 0x24020088, ++0x24020008, 0x3c010001, 0xa4220f68, 0x30620004, ++0x10400005, 0x24020001, 0x3c010001, 0xa0220f57, ++0x080041d5, 0x00031402, 0x3c010001, 0xa0200f57, ++0x00031402, 0x3c010001, 0xa4220f54, 0x9483000c, ++0x24020001, 0x3c010001, 0xa4200f50, 0x3c010001, ++0xa0220f56, 0x3c010001, 0xa4230f62, 0x24020001, ++0x1342001e, 0x00000000, 0x13400005, 0x24020003, ++0x13420067, 0x00000000, 0x080042cf, 0x00000000, ++0x3c020001, 0x94420f62, 0x241a0001, 0x3c010001, ++0xa4200f5e, 0x3c010001, 0xa4200f52, 0x304407ff, ++0x00021bc2, 0x00031823, 0x3063003e, 0x34630036, ++0x00021242, 0x3042003c, 0x00621821, 0x3c010001, ++0xa4240f58, 0x00832021, 0x24630030, 0x3c010001, ++0xa4240f5a, 0x3c010001, 0xa4230f5c, 0x3c060001, ++0x24c60f52, 0x94c50000, 0x94c30002, 0x3c040001, ++0x94840f5a, 0x00651021, 0x0044102a, 0x10400013, ++0x3c108000, 0x00a31021, 0xa4c20000, 0x3c02a000, ++0xaf620cf4, 0x3c010001, 0xa0200f56, 0x8f641008, ++0x00901024, 0x14400003, 0x00000000, 0x0c004064, ++0x00000000, 0x8f620cf4, 0x00501024, 0x104000b7, ++0x00000000, 0x0800420f, 0x00000000, 0x3c030001, ++0x94630f50, 0x00851023, 0xa4c40000, 0x00621821, ++0x3042ffff, 0x3c010001, 0xa4230f50, 0xaf620ce8, ++0x3c020001, 0x94420f68, 0x34420024, 0xaf620cec, ++0x94c30002, 0x3c020001, 0x94420f50, 0x14620012, ++0x3c028000, 0x3c108000, 0x3c02a000, 0xaf620cf4, ++0x3c010001, 0xa0200f56, 0x8f641008, 0x00901024, ++0x14400003, 0x00000000, 0x0c004064, 0x00000000, ++0x8f620cf4, 0x00501024, 0x1440fff7, 0x00000000, ++0x080042cf, 0x241a0003, 0xaf620cf4, 0x3c108000, ++0x8f641008, 0x00901024, 0x14400003, 0x00000000, ++0x0c004064, 0x00000000, 0x8f620cf4, 0x00501024, ++0x1440fff7, 0x00000000, 0x080042cf, 0x241a0003, ++0x3c070001, 0x24e70f50, 0x94e20000, 0x03821021, ++0xaf620ce0, 0x3c020001, 0x8c420f64, 0xaf620ce4, ++0x3c050001, 0x94a50f54, 0x94e30000, 0x3c040001, ++0x94840f58, 0x3c020001, 0x94420f5e, 0x00a32823, ++0x00822023, 0x30a6ffff, 0x3083ffff, 0x00c3102b, ++0x14400043, 0x00000000, 0x3c020001, 0x94420f5c, ++0x00021400, 0x00621025, 0xaf620ce8, 0x94e20000, ++0x3c030001, 0x94630f54, 0x00441021, 0xa4e20000, ++0x3042ffff, 0x14430021, 0x3c020008, 0x3c020001, ++0x90420f57, 0x10400006, 0x3c03000c, 0x3c020001, ++0x94420f68, 0x34630624, 0x0800427c, 0x0000d021, ++0x3c020001, 0x94420f68, 0x3c030008, 0x34630624, ++0x00431025, 0xaf620cec, 0x3c108000, 0x3c02a000, ++0xaf620cf4, 0x3c010001, 0xa0200f56, 0x8f641008, ++0x00901024, 0x14400003, 0x00000000, 0x0c004064, ++0x00000000, 0x8f620cf4, 0x00501024, 0x10400015, ++0x00000000, 0x08004283, 0x00000000, 0x3c030001, ++0x94630f68, 0x34420624, 0x3c108000, 0x00621825, ++0x3c028000, 0xaf630cec, 0xaf620cf4, 0x8f641008, ++0x00901024, 0x14400003, 0x00000000, 0x0c004064, ++0x00000000, 0x8f620cf4, 0x00501024, 0x1440fff7, ++0x00000000, 0x3c010001, 0x080042cf, 0xa4200f5e, ++0x3c020001, 0x94420f5c, 0x00021400, 0x00c21025, ++0xaf620ce8, 0x3c020001, 0x90420f57, 0x10400009, ++0x3c03000c, 0x3c020001, 0x94420f68, 0x34630624, ++0x0000d021, 0x00431025, 0xaf620cec, 0x080042c1, ++0x3c108000, 0x3c020001, 0x94420f68, 0x3c030008, ++0x34630604, 0x00431025, 0xaf620cec, 0x3c020001, ++0x94420f5e, 0x00451021, 0x3c010001, 0xa4220f5e, ++0x3c108000, 0x3c02a000, 0xaf620cf4, 0x3c010001, ++0xa0200f56, 0x8f641008, 0x00901024, 0x14400003, ++0x00000000, 0x0c004064, 0x00000000, 0x8f620cf4, ++0x00501024, 0x1440fff7, 0x00000000, 0x8fbf0014, ++0x8fb00010, 0x03e00008, 0x27bd0018, 0x00000000, ++0x27bdffe0, 0x3c040001, 0x24840ec0, 0x00002821, ++0x00003021, 0x00003821, 0xafbf0018, 0xafa00010, ++0x0c004378, 0xafa00014, 0x0000d021, 0x24020130, ++0xaf625000, 0x3c010001, 0xa4200f50, 0x3c010001, ++0xa0200f57, 0x8fbf0018, 0x03e00008, 0x27bd0020, ++0x27bdffe8, 0x3c1bc000, 0xafbf0014, 0xafb00010, ++0xaf60680c, 0x8f626804, 0x34420082, 0xaf626804, ++0x8f634000, 0x24020b50, 0x3c010001, 0xac220f20, ++0x24020b78, 0x3c010001, 0xac220f30, 0x34630002, ++0xaf634000, 0x0c004315, 0x00808021, 0x3c010001, ++0xa0220f34, 0x304200ff, 0x24030002, 0x14430005, ++0x00000000, 0x3c020001, 0x8c420f20, 0x08004308, ++0xac5000c0, 0x3c020001, 0x8c420f20, 0xac5000bc, ++0x8f624434, 0x8f634438, 0x8f644410, 0x3c010001, ++0xac220f28, 0x3c010001, 0xac230f38, 0x3c010001, ++0xac240f24, 0x8fbf0014, 0x8fb00010, 0x03e00008, ++0x27bd0018, 0x03e00008, 0x24020001, 0x27bdfff8, ++0x18800009, 0x00002821, 0x8f63680c, 0x8f62680c, ++0x1043fffe, 0x00000000, 0x24a50001, 0x00a4102a, ++0x1440fff9, 0x00000000, 0x03e00008, 0x27bd0008, ++0x8f634450, 0x3c020001, 0x8c420f28, 0x00031c02, ++0x0043102b, 0x14400008, 0x3c038000, 0x3c040001, ++0x8c840f38, 0x8f624450, 0x00021c02, 0x0083102b, ++0x1040fffc, 0x3c038000, 0xaf634444, 0x8f624444, ++0x00431024, 0x1440fffd, 0x00000000, 0x8f624448, ++0x03e00008, 0x3042ffff, 0x3082ffff, 0x2442e000, ++0x2c422001, 0x14400003, 0x3c024000, 0x08004347, ++0x2402ffff, 0x00822025, 0xaf645c38, 0x8f625c30, ++0x30420002, 0x1440fffc, 0x00001021, 0x03e00008, ++0x00000000, 0x8f624450, 0x3c030001, 0x8c630f24, ++0x08004350, 0x3042ffff, 0x8f624450, 0x3042ffff, ++0x0043102b, 0x1440fffc, 0x00000000, 0x03e00008, ++0x00000000, 0x27bdffe0, 0x00802821, 0x3c040001, ++0x24840ed0, 0x00003021, 0x00003821, 0xafbf0018, ++0xafa00010, 0x0c004378, 0xafa00014, 0x0800435f, ++0x00000000, 0x8fbf0018, 0x03e00008, 0x27bd0020, ++0x3c020001, 0x3442d600, 0x3c030001, 0x3463d600, ++0x3c040001, 0x3484ddff, 0x3c010001, 0xac220f40, ++0x24020040, 0x3c010001, 0xac220f44, 0x3c010001, ++0xac200f3c, 0xac600000, 0x24630004, 0x0083102b, ++0x5040fffd, 0xac600000, 0x03e00008, 0x00000000, ++0x00804821, 0x8faa0010, 0x3c020001, 0x8c420f3c, ++0x3c040001, 0x8c840f44, 0x8fab0014, 0x24430001, ++0x0044102b, 0x3c010001, 0xac230f3c, 0x14400003, ++0x00004021, 0x3c010001, 0xac200f3c, 0x3c020001, ++0x8c420f3c, 0x3c030001, 0x8c630f40, 0x91240000, ++0x00021140, 0x00431021, 0x00481021, 0x25080001, ++0xa0440000, 0x29020008, 0x1440fff4, 0x25290001, ++0x3c020001, 0x8c420f3c, 0x3c030001, 0x8c630f40, ++0x8f64680c, 0x00021140, 0x00431021, 0xac440008, ++0xac45000c, 0xac460010, 0xac470014, 0xac4a0018, ++0x03e00008, 0xac4b001c, 0x00000000, 0x00000000, ++0x4d61696e, 0x43707542, 0x00000000, 0x4d61696e, ++0x43707541, 0x00000000, 0x00000000, 0x00000000, ++0x73746b6f, 0x66666c64, 0x00000000, 0x00000000, ++0x73746b6f, 0x66666c64, 0x00000000, 0x00000000, ++0x66617461, 0x6c457272, 0x00000000, 0x00000000, ++0x00000000, 0x00000000, 0x00000000, 0x00000000, ++0x00000000, 0x00000000, 0x00000000, 0x00000000, ++0x00000000, 0x73746b6f, 0x66666c64, 0x5f76312e, ++0x322e3000, 0x00000000, 0x00000000, 0x00000000, ++}; ++ ++static const struct tg3_firmware tg3_5705_tso_fw = { ++ .size = TG3_5705_TSO_FW_LEN, ++ .data = (u8 *)&tg3Tso5FwText[0], ++}; ++ ++#endif /* TG3_TSO_SUPPORT != 0 */ ++ ++static int tg3_hidden_request_firmware(const struct tg3_firmware **fw, ++ const char *name) ++{ ++ *fw = 0; ++ ++ if (strcmp(name, "tigon/tg3.bin") == 0) ++ *fw = &tg3_5701_fw; ++#if TG3_TSO_SUPPORT != 0 ++ else if (strcmp(name, "tigon/tg3_tso.bin") == 0) ++ *fw = &tg3_lgcy_tso_fw; ++ else if (strcmp(name, "tigon/tg3_tso5.bin") == 0) ++ *fw = &tg3_5705_tso_fw; ++#endif ++ ++ return *fw ? 0 : -EINVAL; ++} ++ ++#define tg3_priv_request_firmware(x, y, z) tg3_hidden_request_firmware((x), (y)) ++ ++#define tg3_priv_release_firmware(x) ++ ++#endif /* BCM_HAS_REQUEST_FIRMWARE */ +diff -r 30b17b8c7526 drivers/net/tg3_flags.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/drivers/net/tg3_flags.h Mon Jun 15 17:05:21 2009 +0100 +@@ -0,0 +1,30 @@ ++#define BCM_HAS_BOOL ++#define BCM_HAS_LE32 ++#define BCM_HAS_RESOURCE_SIZE_T ++#define BCM_HAS_KZALLOC ++#define BCM_HAS_JIFFIES_TO_USECS ++#define BCM_HAS_USECS_TO_JIFFIES ++#define BCM_HAS_MSECS_TO_JIFFIES ++#define BCM_HAS_MSLEEP ++#define BCM_HAS_MSLEEP_INTERRUPTIBLE ++#define BCM_HAS_SKB_COPY_FROM_LINEAR_DATA ++#define BCM_HAS_INTX_MSI_WORKAROUND ++#define BCM_HAS_PCI_TARGET_STATE ++#define BCM_HAS_PCI_CHOOSE_STATE ++#define BCM_HAS_PCI_PME_CAPABLE ++#define BCM_HAS_PCI_ENABLE_WAKE ++#define BCM_HAS_PCI_SET_POWER_STATE ++#define BCM_HAS_DEVICE_WAKEUP_API ++#define BCM_HAS_NEW_PCI_DMA_MAPPING_ERROR ++#define BCM_HAS_PCIE_SET_READRQ ++#define BCM_HAS_PRINT_MAC ++#define BCM_HAS_ETHTOOL_OP_SET_TX_IPV6_CSUM ++#define BCM_HAS_ETHTOOL_OP_SET_TX_HW_CSUM ++#define BCM_HAS_SET_TX_CSUM ++#define BCM_HAS_SKB_TRANSPORT_OFFSET ++#define BCM_HAS_IP_HDR ++#define BCM_HAS_IP_HDRLEN ++#define BCM_HAS_TCP_HDR ++#define BCM_HAS_TCP_OPTLEN ++#define BCM_HAS_DEV_NAME ++#define BCM_HAS_DMA_DATA_DIRECTION diff --git a/master/vim b/master/vim new file mode 100644 index 0000000..ed40bdb --- /dev/null +++ b/master/vim @@ -0,0 +1,72 @@ +.hgignore +blkback-use-blk_getput_queue.patch +blkback_multi_page_ring +blktap_multi_page_ring +bnx2-1.9.16b +bnx2i-1.8.9k +bnx2x-1.50.8 +e1000-8.0.13.patch +e1000e-0.5.18.3.patch +enable-xen-save-restore.patch +export-pci_walk_bus.patch +feature-gso-tcpv4-prefix +forward-port-drivers-xen-blktap.patch +git-01db4957179c92fda7d9a06e49b7ae56fb7c925b.patch +git-0b400c7ed4d027e02f6231afa39852a2d48e6f25.patch +git-14add80b5120966fe0659d61815b9e9b4b68fdc5-fixes.patch +git-14add80b5120966fe0659d61815b9e9b4b68fdc5.patch +git-15b49bee3a2b228370194f1b3ebc3db427cc9c94.patch +git-1b6b8ce2ac372ea1f2065b89228ede105eb68dc5.patch +git-201de56eb22f1ff3f36804bc70cbff220b50f067.patch +git-3789fa8a2e534523c896a32a9f27f78d52ad7d82.patch +git-3fa16fdb48e0d83c2acf46e357548c89891df58b.patch +git-480b93b7837fb3cf0579a42f4953ac463a5b9e1e.patch +git-4d135dbee7b0a89e946f7ba284f2b957505a2c3a.patch +git-58c3a727cb73b75a9104d295f096cca12959a5a5.patch +git-613e7ed6f72b1a115f7ece8ce1b66cf095de1348.patch +git-67fd1a731ff1a990d4da7689909317756e50cb4d.patch +git-6a49d8120021897e139641062236215aac5d220e.patch +git-74bb1bcc7dbbc9ddef773bf3395d7ff92aaaad2e.patch +git-7eb93b175d4de9438a4b0af3a94a112cb5266944.patch +git-8113587c2d14d3be2414190845b2e2617c0aa33b.patch +git-876e501ab25dcd683574a5d3d56d8fe450083ed6.patch +git-898585172fa729513d8636257b44bd1cfd279096.patch +git-8c5cdb6adc6688b9b8fd82ea4a5cf4674dabad79.patch +git-8dd7f8036c123296fc4214f9d8810eb485570422.patch +git-93ff68a55aa92180a765d6c51c3303f6200167a6.patch +git-a28724b0fb909d247229a70761c90bb37b13366a.patch +git-bc5f5a8277cb353161454b6704b3186ebcf3a2a3.patch +git-d1b054da8f599905f3c18a218961dcf17f9d5f13.patch +git-d3a54014e2a94bd37b7dee5e76e03f7bc4fab49a.patch +git-dd7cc44d0bcec5e9c42fe52e88dc254ae62eac8d.patch +git-f19aeb1f3638b7bb4ca21eb361f004fac2bfe259.patch +git-f79b1b146b52765ee38bfb91bb14eb850fa98017.patch +git-fde09c6d8f92de0c9f75698a75f0989f2234c517.patch +igb-1.3.19.3.patch +increase-nr-dynirq +ixgbe-2.0.34.3.patch +linux-2.6.18-xen.hg-734.412b24a36929 +linux-2.6.18-xen.hg-767.78d81e85e8cd +linux-2.6.18-xen.hg-778.0fadef4d5c46 +linux-2.6.18-xen.hg-792.db9857bb0320 +linux-2.6.18-xen.hg-793.3aa9b8a7876b +linux-2.6.18-xen.hg-820.8b86d11a6eb3 +linux-2.6.27.23-0.1.1.patch +mpt2sas-01.255.04.00.patch +mpt2sas-build-integration.patch +mptlinux-4.19.00.03.patch +netback-fix-receive-checksum-setup.patch +open-iscsi-2.0-870.3-2.6.27_compat.patch +open-iscsi-2.0-870.3.patch +revert-balloon-max-target.patch +revert-configurable-nr-guest-devices.patch +revert-netback-dynirq-accounting.patch +revert-netback-notify-multiple.patch +revert-vbd-cdrom-extensions.patch +revert-vbd-packet-extensions.patch +revert-vbd-protocol-hack.patch +sync-drivers-xen-blktap.patch +tg3-3.99d +vim +vswitch-0.90.1.0.patch +vswitch-build-integration.patch diff --git a/master/vswitch-0.90.1.0.patch b/master/vswitch-0.90.1.0.patch new file mode 100644 index 0000000..4b0d4a6 --- /dev/null +++ b/master/vswitch-0.90.1.0.patch @@ -0,0 +1,6419 @@ +diff -r 1a87bbd37bb1 include/openflow/nicira-ext.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/include/openflow/nicira-ext.h Tue Jun 30 13:50:53 2009 +0100 +@@ -0,0 +1,120 @@ ++/* ++ * Copyright (c) 2008, 2009 Nicira Networks ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at: ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ */ ++ ++#ifndef OPENFLOW_NICIRA_EXT_H ++#define OPENFLOW_NICIRA_EXT_H 1 ++ ++#include "openflow/openflow.h" ++ ++#define NICIRA_OUI_STR "002320" ++ ++/* The following vendor extensions, proposed by Nicira Networks, are not yet ++ * ready for standardization (and may never be), so they are not included in ++ * openflow.h. */ ++ ++#define NX_VENDOR_ID 0x00002320 ++ ++enum nicira_type { ++ /* Switch status request. The request body is an ASCII string that ++ * specifies a prefix of the key names to include in the output; if it is ++ * the null string, then all key-value pairs are included. */ ++ NXT_STATUS_REQUEST, ++ ++ /* Switch status reply. The reply body is an ASCII string of key-value ++ * pairs in the form "key=value\n". */ ++ NXT_STATUS_REPLY, ++ ++ /* Configure an action. Most actions do not require configuration ++ * beyond that supplied in the actual action call. */ ++ NXT_ACT_SET_CONFIG, ++ ++ /* Get configuration of action. */ ++ NXT_ACT_GET_CONFIG, ++ ++ /* Remote command execution. The request body is a sequence of strings ++ * delimited by null bytes. The first string is a command name. ++ * Subsequent strings are command arguments. */ ++ NXT_COMMAND_REQUEST, ++ ++ /* Remote command execution reply, sent when the command's execution ++ * completes. The reply body is struct nx_command_reply. */ ++ NXT_COMMAND_REPLY, ++ ++ /* No longer used. */ ++ NXT_FLOW_END_CONFIG__OBSOLETE, ++ ++ /* No longer used. */ ++ NXT_FLOW_END__OBSOLETE, ++ ++ /* Management protocol. See "openflow-mgmt.h". */ ++ NXT_MGMT, ++}; ++ ++struct nicira_header { ++ struct ofp_header header; ++ uint32_t vendor; /* NX_VENDOR_ID. */ ++ uint32_t subtype; /* One of NXT_* above. */ ++}; ++OFP_ASSERT(sizeof(struct nicira_header) == sizeof(struct ofp_vendor_header) + 4); ++ ++ ++enum nx_action_subtype { ++ NXAST_SNAT__OBSOLETE, /* No longer used. */ ++ NXAST_RESUBMIT /* Throw against flow table again. */ ++}; ++ ++/* Action structure for NXAST_RESUBMIT. */ ++struct nx_action_resubmit { ++ uint16_t type; /* OFPAT_VENDOR. */ ++ uint16_t len; /* Length is 8. */ ++ uint32_t vendor; /* NX_VENDOR_ID. */ ++ uint16_t subtype; /* NXAST_RESUBMIT. */ ++ uint16_t in_port; /* New in_port for checking flow table. */ ++ uint8_t pad[4]; ++}; ++OFP_ASSERT(sizeof(struct nx_action_resubmit) == 16); ++ ++/* Header for Nicira-defined actions. */ ++struct nx_action_header { ++ uint16_t type; /* OFPAT_VENDOR. */ ++ uint16_t len; /* Length is 8. */ ++ uint32_t vendor; /* NX_VENDOR_ID. */ ++ uint16_t subtype; /* NXAST_*. */ ++ uint8_t pad[6]; ++}; ++OFP_ASSERT(sizeof(struct nx_action_header) == 16); ++ ++/* Status bits for NXT_COMMAND_REPLY. */ ++enum { ++ NXT_STATUS_EXITED = 1 << 31, /* Exited normally. */ ++ NXT_STATUS_SIGNALED = 1 << 30, /* Exited due to signal. */ ++ NXT_STATUS_UNKNOWN = 1 << 29, /* Exited for unknown reason. */ ++ NXT_STATUS_COREDUMP = 1 << 28, /* Exited with core dump. */ ++ NXT_STATUS_ERROR = 1 << 27, /* Command could not be executed. */ ++ NXT_STATUS_STARTED = 1 << 26, /* Command was started. */ ++ NXT_STATUS_EXITSTATUS = 0xff, /* Exit code mask if NXT_STATUS_EXITED. */ ++ NXT_STATUS_TERMSIG = 0xff, /* Signal number if NXT_STATUS_SIGNALED. */ ++}; ++ ++/* NXT_COMMAND_REPLY. */ ++struct nx_command_reply { ++ struct nicira_header nxh; ++ uint32_t status; /* Status bits defined above. */ ++ /* Followed by any number of bytes of process output. */ ++}; ++OFP_ASSERT(sizeof(struct nx_command_reply) == 20); ++ ++#endif /* openflow/nicira-ext.h */ +diff -r 1a87bbd37bb1 include/openflow/openflow-mgmt.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/include/openflow/openflow-mgmt.h Tue Jun 30 13:50:53 2009 +0100 +@@ -0,0 +1,259 @@ ++/* ++ * Copyright (c) 2009 Nicira Networks. ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at: ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ */ ++ ++#ifndef OPENFLOW_OPENFLOW_MGMT_H ++#define OPENFLOW_OPENFLOW_MGMT_H 1 ++ ++#include "openflow/nicira-ext.h" ++ ++enum ofmp_type { ++ OFMPT_CAPABILITY_REQUEST, ++ OFMPT_CAPABILITY_REPLY, ++ OFMPT_RESOURCES_REQUEST, ++ OFMPT_RESOURCES_UPDATE, ++ OFMPT_CONFIG_REQUEST, ++ OFMPT_CONFIG_UPDATE, ++ OFMPT_CONFIG_UPDATE_ACK, ++ OFMPT_ERROR, ++ OFMPT_EXTENDED_DATA ++}; ++ ++/* Header on all OpenFlow management packets. */ ++struct ofmp_header { ++ struct nicira_header header; ++ uint16_t type; /* One of OFMPT_* above. */ ++ uint8_t pad[2]; ++}; ++OFP_ASSERT(sizeof(struct ofmp_header) == sizeof(struct nicira_header) + 4); ++ ++ ++/* Generic TLV header. */ ++struct ofmp_tlv { ++ uint16_t type; /* Type of value (one of OFMPTLV_*). */ ++ uint16_t len; /* Length of TLV (includes this header). */ ++ uint8_t data[0]; /* Value of data as defined by type and length. */ ++}; ++OFP_ASSERT(sizeof(struct ofmp_tlv) == 4); ++ ++/* Universal TLV terminator. Used to indicate end of TLV list. */ ++struct ofmp_tlv_end { ++ uint16_t type; /* Type is 0. */ ++ uint16_t len; /* Length is 4. */ ++}; ++OFP_ASSERT(sizeof(struct ofmp_tlv_end) == 4); ++ ++ ++/* Bitmask of capability description styles. */ ++enum ofmp_capability_format { ++ OFMPCAF_SIMPLE = 0 << 0, /* "ovs-vswitchd.conf" style. */ ++}; ++ ++/* Body of capbility request. ++ * ++ * OFMPT_CAPABILITY_REQUEST (controller -> switch) */ ++struct ofmp_capability_request { ++ struct ofmp_header header; ++ uint32_t format; /* One of OFMPCAF_*. */ ++}; ++OFP_ASSERT(sizeof(struct ofmp_capability_request) == 24); ++ ++/* Body of reply to capability request. ++ * ++ * OFMPT_CAPABILITY_REPLY (switch -> controller). */ ++struct ofmp_capability_reply { ++ struct ofmp_header header; ++ uint32_t format; /* One of OFMPCAF_*. */ ++ uint64_t mgmt_id; /* Management ID. */ ++ uint8_t data[0]; ++}; ++OFP_ASSERT(sizeof(struct ofmp_capability_reply) == 32); ++ ++ ++/* Resource TLV for datapath description. */ ++struct ofmptsr_dp { ++ uint16_t type; /* OFMPTSR_DP. */ ++ uint16_t len; /* 32. */ ++ uint8_t pad[4]; ++ uint64_t dp_id; /* Datapath ID. */ ++ uint8_t name[OFP_MAX_PORT_NAME_LEN]; /* Null-terminated name. */ ++}; ++OFP_ASSERT(sizeof(struct ofmptsr_dp) == 32); ++ ++/* UUIDs will be passed around as *non-terminated* strings in their ++ * canonical form (e.g., 550e8400-e29b-41d4-a716-446655440000). ++ */ ++#define OFMP_UUID_LEN 36 ++ ++/* Resource TLV for XenServer UUIDs associated with this datapath. */ ++struct ofmptsr_dp_uuid { ++ uint16_t type; /* OFMPTSR_DP_UUID. */ ++ uint16_t len; /* Length. */ ++ uint8_t pad[4]; ++ uint64_t dp_id; /* Datapath ID. */ ++ uint8_t uuid_list[0]; /* List of UUIDs associated with ++ * this datapath. */ ++}; ++OFP_ASSERT(sizeof(struct ofmptsr_dp_uuid) == 16); ++ ++/* Resource TLV for XenServer UUID associated with this managment ++ * instance. ++ */ ++struct ofmptsr_mgmt_uuid { ++ uint16_t type; /* OFMPTSR_MGMT_UUID. */ ++ uint16_t len; /* 52. */ ++ uint8_t pad[4]; ++ uint64_t mgmt_id; /* Management ID. */ ++ uint8_t uuid[OFMP_UUID_LEN]; /* System UUID. */ ++ uint8_t pad2[4]; /* Pad for 64-bit systems. */ ++}; ++OFP_ASSERT(sizeof(struct ofmptsr_mgmt_uuid) == 56); ++ ++/* Resource TLV for details about this XenServer vif. */ ++struct ofmptsr_vif { ++ uint16_t type; /* OFMPTSR_VIF. */ ++ uint16_t len; /* 136. */ ++ uint8_t name[OFP_MAX_PORT_NAME_LEN]; /* Null-terminated name. */ ++ uint8_t vif_uuid[OFMP_UUID_LEN]; /* VIF UUID. */ ++ uint8_t vm_uuid[OFMP_UUID_LEN]; /* VM UUID. */ ++ uint8_t net_uuid[OFMP_UUID_LEN]; /* Network UUID. */ ++ uint64_t vif_mac; /* Management ID. */ ++}; ++OFP_ASSERT(sizeof(struct ofmptsr_vif) == 136); ++ ++/* TLV types for switch resource descriptions. */ ++enum ofmp_switch_resources { ++ OFMPTSR_END = 0, /* Terminator. */ ++ OFMPTSR_DP, /* Datapath. */ ++ OFMPTSR_DP_UUID, /* Xen: datapath uuid's. */ ++ OFMPTSR_MGMT_UUID, /* Xen: management uuid. */ ++ OFMPTSR_VIF, /* Xen: vif details. */ ++}; ++ ++/* Body of resources request. ++ * ++ * OFMPT_RESOURCES_REQUEST (controller -> switch) */ ++struct ofmp_resources_request { ++ struct ofmp_header header; ++}; ++ ++/* Body of capbility update. Sent in response to a resources request or ++ * sent asynchronously when resources change on the switch. ++ * ++ * OFMPT_RESOURCES_UPDATE (switch -> controller) */ ++struct ofmp_resources_update { ++ struct ofmp_header header; ++ uint8_t data[0]; ++}; ++OFP_ASSERT(sizeof(struct ofmp_resources_update) == 20); ++ ++ ++/* Bitmask of capability description styles. */ ++enum ofmp_config_format { ++ OFMPCOF_SIMPLE = 0 << 0, /* "ovs-vswitchd.conf" style. */ ++}; ++ ++#define CONFIG_COOKIE_LEN 20 ++ ++/* Body of configuration request. ++ * ++ * OFMPT_CONFIG_REQUEST (controller -> switch) */ ++struct ofmp_config_request { ++ struct ofmp_header header; ++ uint32_t format; /* One of OFMPCOF_*. */ ++}; ++OFP_ASSERT(sizeof(struct ofmp_config_request) == 24); ++ ++/* Body of configuration update. Sent in response to a configuration ++ * request from the controller. May be sent asynchronously by either ++ * the controller or switch to modify configuration or notify of ++ * changes, respectively. If sent by the controller, the switch must ++ * respond with a OFMPT_CONFIG_UPDATE_ACK. ++ * ++ * OFMPT_CONFIG_UPDATE (switch <-> controller) */ ++struct ofmp_config_update { ++ struct ofmp_header header; ++ uint32_t format; /* One of OFMPCOF_*. */ ++ uint8_t cookie[CONFIG_COOKIE_LEN]; /* Cookie of config attempting to be ++ * replaced by this update. */ ++ uint8_t data[0]; ++}; ++OFP_ASSERT(sizeof(struct ofmp_config_update) == 44); ++ ++/* Bitmask of configuration update ack flags. */ ++enum ofmp_config_update_ack_flags { ++ OFMPCUAF_SUCCESS = 1 << 0, /* Config succeeded. */ ++}; ++ ++/* Body of configuration update ack. Sent in response to a configuration ++ * udpate request. ++ * ++ * OFMPT_CONFIG_UPDATE_ACK (switch -> controller) */ ++struct ofmp_config_update_ack { ++ struct ofmp_header header; ++ uint32_t format; /* One of OFMPCOF_*. */ ++ uint32_t flags; /* One of OFMPCUAF_*. */ ++ uint8_t cookie[CONFIG_COOKIE_LEN]; /* Cookie of current configuration ++ * being used in the switch. */ ++}; ++OFP_ASSERT(sizeof(struct ofmp_config_update_ack) == 48); ++ ++/* Values for 'type' in ofmp_error_msg. */ ++enum ofmp_error_type { ++ OFMPET_BAD_CONFIG /* Problem with configuration. */ ++}; ++ ++/* ofmp_error_msg 'code' values for OFMPET_BAD_CONFIG. 'data' contains ++ * at least the first 64 bytes of the failed request. */ ++enum ofmp_bad_config_code { ++ OFMPBCC_BUSY, /* Config updating, try again. */ ++ OFMPBCC_OLD_COOKIE, /* Config has changed. */ ++}; ++ ++/* Body of error message. May be sent by either the switch or the ++ * controller to indicate some error condition. ++ * ++ * OFMPT_ERROR (switch <-> controller) */ ++struct ofmp_error_msg { ++ struct ofmp_header header; ++ ++ uint16_t type; /* One of OFMPET_*. */ ++ uint16_t code; /* Code depending on 'type'. */ ++ uint8_t data[0]; /* Variable-length data. Interpreted based ++ on the type and code. */ ++}; ++OFP_ASSERT(sizeof(struct ofmp_error_msg) == 24); ++ ++/* Bitmask of extended data message flags. */ ++enum ofmp_extended_data_flags { ++ OFMPEDF_MORE_DATA = 1 << 0, /* More data follows. */ ++}; ++ ++/* Body of extended data message. May be sent by either the switch or the ++ * controller to send messages that are greater than 65535 bytes in ++ * length. ++ * ++ * OFMPT_EXTENDED_DATA (switch <-> controller) */ ++struct ofmp_extended_data { ++ struct ofmp_header header; ++ ++ uint16_t type; /* Type code of the encapsulated message. */ ++ uint8_t flags; /* One of OFMPEDF_*. */ ++ uint8_t pad; ++ uint8_t data[0]; /* Variable-length data. */ ++}; ++OFP_ASSERT(sizeof(struct ofmp_extended_data) == 24); ++ ++#endif /* openflow/openflow-mgmt.h */ +diff -r 1a87bbd37bb1 include/openflow/openflow.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/include/openflow/openflow.h Tue Jun 30 13:50:53 2009 +0100 +@@ -0,0 +1,796 @@ ++/* ++ * Copyright (c) 2008, 2009 Nicira Networks. ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at: ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ */ ++ ++/* OpenFlow: protocol between controller and datapath. */ ++ ++#ifndef OPENFLOW_OPENFLOW_H ++#define OPENFLOW_OPENFLOW_H 1 ++ ++#ifdef __KERNEL__ ++#include ++#else ++#include ++#endif ++ ++#ifdef SWIG ++#define OFP_ASSERT(EXPR) /* SWIG can't handle OFP_ASSERT. */ ++#elif !defined(__cplusplus) ++/* Build-time assertion for use in a declaration context. */ ++#define OFP_ASSERT(EXPR) \ ++ extern int (*build_assert(void))[ sizeof(struct { \ ++ unsigned int build_assert_failed : (EXPR) ? 1 : -1; })] ++#else /* __cplusplus */ ++#include ++#define OFP_ASSERT BOOST_STATIC_ASSERT ++#endif /* __cplusplus */ ++ ++#ifndef SWIG ++#define OFP_PACKED __attribute__((packed)) ++#else ++#define OFP_PACKED /* SWIG doesn't understand __attribute. */ ++#endif ++ ++/* The most significant bit being set in the version field indicates an ++ * experimental OpenFlow version. ++ */ ++#define OFP_VERSION 0x97 ++ ++#define OFP_MAX_TABLE_NAME_LEN 32 ++#define OFP_MAX_PORT_NAME_LEN 16 ++ ++#define OFP_TCP_PORT 6633 ++#define OFP_SSL_PORT 6633 ++ ++#define OFP_ETH_ALEN 6 /* Bytes in an Ethernet address. */ ++ ++/* Port numbering. Physical ports are numbered starting from 0. */ ++enum ofp_port { ++ /* Maximum number of physical switch ports. */ ++ OFPP_MAX = 0xff00, ++ ++ /* Fake output "ports". */ ++ OFPP_IN_PORT = 0xfff8, /* Send the packet out the input port. This ++ virtual port must be explicitly used ++ in order to send back out of the input ++ port. */ ++ OFPP_TABLE = 0xfff9, /* Perform actions in flow table. ++ NB: This can only be the destination ++ port for packet-out messages. */ ++ OFPP_NORMAL = 0xfffa, /* Process with normal L2/L3 switching. */ ++ OFPP_FLOOD = 0xfffb, /* All physical ports except input port and ++ those disabled by STP. */ ++ OFPP_ALL = 0xfffc, /* All physical ports except input port. */ ++ OFPP_CONTROLLER = 0xfffd, /* Send to controller. */ ++ OFPP_LOCAL = 0xfffe, /* Local openflow "port". */ ++ OFPP_NONE = 0xffff /* Not associated with a physical port. */ ++}; ++ ++enum ofp_type { ++ /* Immutable messages. */ ++ OFPT_HELLO, /* Symmetric message */ ++ OFPT_ERROR, /* Symmetric message */ ++ OFPT_ECHO_REQUEST, /* Symmetric message */ ++ OFPT_ECHO_REPLY, /* Symmetric message */ ++ OFPT_VENDOR, /* Symmetric message */ ++ ++ /* Switch configuration messages. */ ++ OFPT_FEATURES_REQUEST, /* Controller/switch message */ ++ OFPT_FEATURES_REPLY, /* Controller/switch message */ ++ OFPT_GET_CONFIG_REQUEST, /* Controller/switch message */ ++ OFPT_GET_CONFIG_REPLY, /* Controller/switch message */ ++ OFPT_SET_CONFIG, /* Controller/switch message */ ++ ++ /* Asynchronous messages. */ ++ OFPT_PACKET_IN, /* Async message */ ++ OFPT_FLOW_EXPIRED, /* Async message */ ++ OFPT_PORT_STATUS, /* Async message */ ++ ++ /* Controller command messages. */ ++ OFPT_PACKET_OUT, /* Controller/switch message */ ++ OFPT_FLOW_MOD, /* Controller/switch message */ ++ OFPT_PORT_MOD, /* Controller/switch message */ ++ ++ /* Statistics messages. */ ++ OFPT_STATS_REQUEST, /* Controller/switch message */ ++ OFPT_STATS_REPLY /* Controller/switch message */ ++}; ++ ++/* Header on all OpenFlow packets. */ ++struct ofp_header { ++ uint8_t version; /* OFP_VERSION. */ ++ uint8_t type; /* One of the OFPT_ constants. */ ++ uint16_t length; /* Length including this ofp_header. */ ++ uint32_t xid; /* Transaction id associated with this packet. ++ Replies use the same id as was in the request ++ to facilitate pairing. */ ++}; ++OFP_ASSERT(sizeof(struct ofp_header) == 8); ++ ++/* OFPT_HELLO. This message has an empty body, but implementations must ++ * ignore any data included in the body, to allow for future extensions. */ ++struct ofp_hello { ++ struct ofp_header header; ++}; ++ ++#define OFP_DEFAULT_MISS_SEND_LEN 128 ++ ++enum ofp_config_flags { ++ /* Tells datapath to notify the controller of expired flow entries. */ ++ OFPC_SEND_FLOW_EXP = 1 << 0, ++ ++ /* Handling of IP fragments. */ ++ OFPC_FRAG_NORMAL = 0 << 1, /* No special handling for fragments. */ ++ OFPC_FRAG_DROP = 1 << 1, /* Drop fragments. */ ++ OFPC_FRAG_REASM = 2 << 1, /* Reassemble (only if OFPC_IP_REASM set). */ ++ OFPC_FRAG_MASK = 3 << 1 ++}; ++ ++/* Switch configuration. */ ++struct ofp_switch_config { ++ struct ofp_header header; ++ uint16_t flags; /* OFPC_* flags. */ ++ uint16_t miss_send_len; /* Max bytes of new flow that datapath should ++ send to the controller. */ ++}; ++OFP_ASSERT(sizeof(struct ofp_switch_config) == 12); ++ ++/* Capabilities supported by the datapath. */ ++enum ofp_capabilities { ++ OFPC_FLOW_STATS = 1 << 0, /* Flow statistics. */ ++ OFPC_TABLE_STATS = 1 << 1, /* Table statistics. */ ++ OFPC_PORT_STATS = 1 << 2, /* Port statistics. */ ++ OFPC_STP = 1 << 3, /* 802.1d spanning tree. */ ++ OFPC_MULTI_PHY_TX = 1 << 4, /* Supports transmitting through multiple ++ physical interfaces */ ++ OFPC_IP_REASM = 1 << 5 /* Can reassemble IP fragments. */ ++}; ++ ++/* Flags to indicate behavior of the physical port. These flags are ++ * used in ofp_phy_port to describe the current configuration. They are ++ * used in the ofp_port_mod message to configure the port's behavior. ++ */ ++enum ofp_port_config { ++ OFPPC_PORT_DOWN = 1 << 0, /* Port is administratively down. */ ++ ++ OFPPC_NO_STP = 1 << 1, /* Disable 802.1D spanning tree on port. */ ++ OFPPC_NO_RECV = 1 << 2, /* Drop most packets received on port. */ ++ OFPPC_NO_RECV_STP = 1 << 3, /* Drop received 802.1D STP packets. */ ++ OFPPC_NO_FLOOD = 1 << 4, /* Do not include this port when flooding. */ ++ OFPPC_NO_FWD = 1 << 5, /* Drop packets forwarded to port. */ ++ OFPPC_NO_PACKET_IN = 1 << 6 /* Do not send packet-in msgs for port. */ ++}; ++ ++/* Current state of the physical port. These are not configurable from ++ * the controller. ++ */ ++enum ofp_port_state { ++ OFPPS_LINK_DOWN = 1 << 0, /* No physical link present. */ ++ ++ /* The OFPPS_STP_* bits have no effect on switch operation. The ++ * controller must adjust OFPPC_NO_RECV, OFPPC_NO_FWD, and ++ * OFPPC_NO_PACKET_IN appropriately to fully implement an 802.1D spanning ++ * tree. */ ++ OFPPS_STP_LISTEN = 0 << 8, /* Not learning or relaying frames. */ ++ OFPPS_STP_LEARN = 1 << 8, /* Learning but not relaying frames. */ ++ OFPPS_STP_FORWARD = 2 << 8, /* Learning and relaying frames. */ ++ OFPPS_STP_BLOCK = 3 << 8, /* Not part of spanning tree. */ ++ OFPPS_STP_MASK = 3 << 8 /* Bit mask for OFPPS_STP_* values. */ ++}; ++ ++/* Features of physical ports available in a datapath. */ ++enum ofp_port_features { ++ OFPPF_10MB_HD = 1 << 0, /* 10 Mb half-duplex rate support. */ ++ OFPPF_10MB_FD = 1 << 1, /* 10 Mb full-duplex rate support. */ ++ OFPPF_100MB_HD = 1 << 2, /* 100 Mb half-duplex rate support. */ ++ OFPPF_100MB_FD = 1 << 3, /* 100 Mb full-duplex rate support. */ ++ OFPPF_1GB_HD = 1 << 4, /* 1 Gb half-duplex rate support. */ ++ OFPPF_1GB_FD = 1 << 5, /* 1 Gb full-duplex rate support. */ ++ OFPPF_10GB_FD = 1 << 6, /* 10 Gb full-duplex rate support. */ ++ OFPPF_COPPER = 1 << 7, /* Copper medium. */ ++ OFPPF_FIBER = 1 << 8, /* Fiber medium. */ ++ OFPPF_AUTONEG = 1 << 9, /* Auto-negotiation. */ ++ OFPPF_PAUSE = 1 << 10, /* Pause. */ ++ OFPPF_PAUSE_ASYM = 1 << 11 /* Asymmetric pause. */ ++}; ++ ++/* Description of a physical port */ ++struct ofp_phy_port { ++ uint16_t port_no; ++ uint8_t hw_addr[OFP_ETH_ALEN]; ++ uint8_t name[OFP_MAX_PORT_NAME_LEN]; /* Null-terminated */ ++ ++ uint32_t config; /* Bitmap of OFPPC_* flags. */ ++ uint32_t state; /* Bitmap of OFPPS_* flags. */ ++ ++ /* Bitmaps of OFPPF_* that describe features. All bits zeroed if ++ * unsupported or unavailable. */ ++ uint32_t curr; /* Current features. */ ++ uint32_t advertised; /* Features being advertised by the port. */ ++ uint32_t supported; /* Features supported by the port. */ ++ uint32_t peer; /* Features advertised by peer. */ ++}; ++OFP_ASSERT(sizeof(struct ofp_phy_port) == 48); ++ ++/* Switch features. */ ++struct ofp_switch_features { ++ struct ofp_header header; ++ uint64_t datapath_id; /* Datapath unique ID. Only the lower 48-bits ++ are meaningful. */ ++ ++ uint32_t n_buffers; /* Max packets buffered at once. */ ++ ++ uint8_t n_tables; /* Number of tables supported by datapath. */ ++ uint8_t pad[3]; /* Align to 64-bits. */ ++ ++ /* Features. */ ++ uint32_t capabilities; /* Bitmap of support "ofp_capabilities". */ ++ uint32_t actions; /* Bitmap of supported "ofp_action_type"s. */ ++ ++ /* Port info.*/ ++ struct ofp_phy_port ports[0]; /* Port definitions. The number of ports ++ is inferred from the length field in ++ the header. */ ++}; ++OFP_ASSERT(sizeof(struct ofp_switch_features) == 32); ++ ++/* What changed about the physical port */ ++enum ofp_port_reason { ++ OFPPR_ADD, /* The port was added. */ ++ OFPPR_DELETE, /* The port was removed. */ ++ OFPPR_MODIFY /* Some attribute of the port has changed. */ ++}; ++ ++/* A physical port has changed in the datapath */ ++struct ofp_port_status { ++ struct ofp_header header; ++ uint8_t reason; /* One of OFPPR_*. */ ++ uint8_t pad[7]; /* Align to 64-bits. */ ++ struct ofp_phy_port desc; ++}; ++OFP_ASSERT(sizeof(struct ofp_port_status) == 64); ++ ++/* Modify behavior of the physical port */ ++struct ofp_port_mod { ++ struct ofp_header header; ++ uint16_t port_no; ++ uint8_t hw_addr[OFP_ETH_ALEN]; /* The hardware address is not ++ configurable. This is used to ++ sanity-check the request, so it must ++ be the same as returned in an ++ ofp_phy_port struct. */ ++ ++ uint32_t config; /* Bitmap of OFPPC_* flags. */ ++ uint32_t mask; /* Bitmap of OFPPC_* flags to be changed. */ ++ ++ uint32_t advertise; /* Bitmap of "ofp_port_features"s. Zero all ++ bits to prevent any action taking place. */ ++ uint8_t pad[4]; /* Pad to 64-bits. */ ++}; ++OFP_ASSERT(sizeof(struct ofp_port_mod) == 32); ++ ++/* Why is this packet being sent to the controller? */ ++enum ofp_packet_in_reason { ++ OFPR_NO_MATCH, /* No matching flow. */ ++ OFPR_ACTION /* Action explicitly output to controller. */ ++}; ++ ++/* Packet received on port (datapath -> controller). */ ++struct ofp_packet_in { ++ struct ofp_header header; ++ uint32_t buffer_id; /* ID assigned by datapath. */ ++ uint16_t total_len; /* Full length of frame. */ ++ uint16_t in_port; /* Port on which frame was received. */ ++ uint8_t reason; /* Reason packet is being sent (one of OFPR_*) */ ++ uint8_t pad; ++ uint8_t data[0]; /* Ethernet frame, halfway through 32-bit word, ++ so the IP header is 32-bit aligned. The ++ amount of data is inferred from the length ++ field in the header. Because of padding, ++ offsetof(struct ofp_packet_in, data) == ++ sizeof(struct ofp_packet_in) - 2. */ ++}; ++OFP_ASSERT(sizeof(struct ofp_packet_in) == 20); ++ ++enum ofp_action_type { ++ OFPAT_OUTPUT, /* Output to switch port. */ ++ OFPAT_SET_VLAN_VID, /* Set the 802.1q VLAN id. */ ++ OFPAT_SET_VLAN_PCP, /* Set the 802.1q priority. */ ++ OFPAT_STRIP_VLAN, /* Strip the 802.1q header. */ ++ OFPAT_SET_DL_SRC, /* Ethernet source address. */ ++ OFPAT_SET_DL_DST, /* Ethernet destination address. */ ++ OFPAT_SET_NW_SRC, /* IP source address. */ ++ OFPAT_SET_NW_DST, /* IP destination address. */ ++ OFPAT_SET_TP_SRC, /* TCP/UDP source port. */ ++ OFPAT_SET_TP_DST, /* TCP/UDP destination port. */ ++ OFPAT_VENDOR = 0xffff ++}; ++ ++/* Action structure for OFPAT_OUTPUT, which sends packets out 'port'. ++ * When the 'port' is the OFPP_CONTROLLER, 'max_len' indicates the max ++ * number of bytes to send. A 'max_len' of zero means the entire packet ++ * should be sent. */ ++struct ofp_action_output { ++ uint16_t type; /* OFPAT_OUTPUT. */ ++ uint16_t len; /* Length is 8. */ ++ uint16_t port; /* Output port. */ ++ uint16_t max_len; /* Max length to send to controller. */ ++}; ++OFP_ASSERT(sizeof(struct ofp_action_output) == 8); ++ ++/* The VLAN id is 12 bits, so we can use the entire 16 bits to indicate ++ * special conditions. All ones is used to match that no VLAN id was ++ * set. */ ++#define OFP_VLAN_NONE 0xffff ++ ++/* Action structure for OFPAT_SET_VLAN_VID. */ ++struct ofp_action_vlan_vid { ++ uint16_t type; /* OFPAT_SET_VLAN_VID. */ ++ uint16_t len; /* Length is 8. */ ++ uint16_t vlan_vid; /* VLAN id. */ ++ uint8_t pad[2]; ++}; ++OFP_ASSERT(sizeof(struct ofp_action_vlan_vid) == 8); ++ ++/* Action structure for OFPAT_SET_VLAN_PCP. */ ++struct ofp_action_vlan_pcp { ++ uint16_t type; /* OFPAT_SET_VLAN_PCP. */ ++ uint16_t len; /* Length is 8. */ ++ uint8_t vlan_pcp; /* VLAN priority. */ ++ uint8_t pad[3]; ++}; ++OFP_ASSERT(sizeof(struct ofp_action_vlan_vid) == 8); ++ ++/* Action structure for OFPAT_SET_DL_SRC/DST. */ ++struct ofp_action_dl_addr { ++ uint16_t type; /* OFPAT_SET_DL_SRC/DST. */ ++ uint16_t len; /* Length is 16. */ ++ uint8_t dl_addr[OFP_ETH_ALEN]; /* Ethernet address. */ ++ uint8_t pad[6]; ++}; ++OFP_ASSERT(sizeof(struct ofp_action_dl_addr) == 16); ++ ++/* Action structure for OFPAT_SET_NW_SRC/DST. */ ++struct ofp_action_nw_addr { ++ uint16_t type; /* OFPAT_SET_TW_SRC/DST. */ ++ uint16_t len; /* Length is 8. */ ++ uint32_t nw_addr; /* IP address. */ ++}; ++OFP_ASSERT(sizeof(struct ofp_action_nw_addr) == 8); ++ ++/* Action structure for OFPAT_SET_TP_SRC/DST. */ ++struct ofp_action_tp_port { ++ uint16_t type; /* OFPAT_SET_TP_SRC/DST. */ ++ uint16_t len; /* Length is 8. */ ++ uint16_t tp_port; /* TCP/UDP port. */ ++ uint8_t pad[2]; ++}; ++OFP_ASSERT(sizeof(struct ofp_action_tp_port) == 8); ++ ++/* Action header for OFPAT_VENDOR. The rest of the body is vendor-defined. */ ++struct ofp_action_vendor_header { ++ uint16_t type; /* OFPAT_VENDOR. */ ++ uint16_t len; /* Length is a multiple of 8. */ ++ uint32_t vendor; /* Vendor ID, which takes the same form ++ as in "struct ofp_vendor_header". */ ++}; ++OFP_ASSERT(sizeof(struct ofp_action_vendor_header) == 8); ++ ++/* Action header that is common to all actions. The length includes the ++ * header and any padding used to make the action 64-bit aligned. ++ * NB: The length of an action *must* always be a multiple of eight. */ ++struct ofp_action_header { ++ uint16_t type; /* One of OFPAT_*. */ ++ uint16_t len; /* Length of action, including this ++ header. This is the length of action, ++ including any padding to make it ++ 64-bit aligned. */ ++ uint8_t pad[4]; ++}; ++OFP_ASSERT(sizeof(struct ofp_action_header) == 8); ++ ++union ofp_action { ++ uint16_t type; ++ struct ofp_action_header header; ++ struct ofp_action_vendor_header vendor; ++ struct ofp_action_output output; ++ struct ofp_action_vlan_vid vlan_vid; ++ struct ofp_action_vlan_pcp vlan_pcp; ++ struct ofp_action_nw_addr nw_addr; ++ struct ofp_action_tp_port tp_port; ++}; ++OFP_ASSERT(sizeof(union ofp_action) == 8); ++ ++/* Send packet (controller -> datapath). */ ++struct ofp_packet_out { ++ struct ofp_header header; ++ uint32_t buffer_id; /* ID assigned by datapath (-1 if none). */ ++ uint16_t in_port; /* Packet's input port (OFPP_NONE if none). */ ++ uint16_t actions_len; /* Size of action array in bytes. */ ++ struct ofp_action_header actions[0]; /* Actions. */ ++ /* uint8_t data[0]; */ /* Packet data. The length is inferred ++ from the length field in the header. ++ (Only meaningful if buffer_id == -1.) */ ++}; ++OFP_ASSERT(sizeof(struct ofp_packet_out) == 16); ++ ++enum ofp_flow_mod_command { ++ OFPFC_ADD, /* New flow. */ ++ OFPFC_MODIFY, /* Modify all matching flows. */ ++ OFPFC_MODIFY_STRICT, /* Modify entry strictly matching wildcards */ ++ OFPFC_DELETE, /* Delete all matching flows. */ ++ OFPFC_DELETE_STRICT /* Strictly match wildcards and priority. */ ++}; ++ ++/* Flow wildcards. */ ++enum ofp_flow_wildcards { ++ OFPFW_IN_PORT = 1 << 0, /* Switch input port. */ ++ OFPFW_DL_VLAN = 1 << 1, /* VLAN. */ ++ OFPFW_DL_SRC = 1 << 2, /* Ethernet source address. */ ++ OFPFW_DL_DST = 1 << 3, /* Ethernet destination address. */ ++ OFPFW_DL_TYPE = 1 << 4, /* Ethernet frame type. */ ++ OFPFW_NW_PROTO = 1 << 5, /* IP protocol. */ ++ OFPFW_TP_SRC = 1 << 6, /* TCP/UDP source port. */ ++ OFPFW_TP_DST = 1 << 7, /* TCP/UDP destination port. */ ++ ++ /* IP source address wildcard bit count. 0 is exact match, 1 ignores the ++ * LSB, 2 ignores the 2 least-significant bits, ..., 32 and higher wildcard ++ * the entire field. This is the *opposite* of the usual convention where ++ * e.g. /24 indicates that 8 bits (not 24 bits) are wildcarded. */ ++ OFPFW_NW_SRC_SHIFT = 8, ++ OFPFW_NW_SRC_BITS = 6, ++ OFPFW_NW_SRC_MASK = ((1 << OFPFW_NW_SRC_BITS) - 1) << OFPFW_NW_SRC_SHIFT, ++ OFPFW_NW_SRC_ALL = 32 << OFPFW_NW_SRC_SHIFT, ++ ++ /* IP destination address wildcard bit count. Same format as source. */ ++ OFPFW_NW_DST_SHIFT = 14, ++ OFPFW_NW_DST_BITS = 6, ++ OFPFW_NW_DST_MASK = ((1 << OFPFW_NW_DST_BITS) - 1) << OFPFW_NW_DST_SHIFT, ++ OFPFW_NW_DST_ALL = 32 << OFPFW_NW_DST_SHIFT, ++ ++ /* Wildcard all fields. */ ++ OFPFW_ALL = ((1 << 20) - 1) ++}; ++ ++/* The wildcards for ICMP type and code fields use the transport source ++ * and destination port fields, respectively. */ ++#define OFPFW_ICMP_TYPE OFPFW_TP_SRC ++#define OFPFW_ICMP_CODE OFPFW_TP_DST ++ ++/* Values below this cutoff are 802.3 packets and the two bytes ++ * following MAC addresses are used as a frame length. Otherwise, the ++ * two bytes are used as the Ethernet type. ++ */ ++#define OFP_DL_TYPE_ETH2_CUTOFF 0x0600 ++ ++/* Value of dl_type to indicate that the frame does not include an ++ * Ethernet type. ++ */ ++#define OFP_DL_TYPE_NOT_ETH_TYPE 0x05ff ++ ++/* The VLAN id is 12-bits, so we can use the entire 16 bits to indicate ++ * special conditions. All ones indicates that no VLAN id was set. ++ */ ++#define OFP_VLAN_NONE 0xffff ++ ++/* Fields to match against flows */ ++struct ofp_match { ++ uint32_t wildcards; /* Wildcard fields. */ ++ uint16_t in_port; /* Input switch port. */ ++ uint8_t dl_src[OFP_ETH_ALEN]; /* Ethernet source address. */ ++ uint8_t dl_dst[OFP_ETH_ALEN]; /* Ethernet destination address. */ ++ uint16_t dl_vlan; /* Input VLAN. */ ++ uint16_t dl_type; /* Ethernet frame type. */ ++ uint8_t nw_proto; /* IP protocol. */ ++ uint8_t pad; /* Align to 32-bits. */ ++ uint32_t nw_src; /* IP source address. */ ++ uint32_t nw_dst; /* IP destination address. */ ++ uint16_t tp_src; /* TCP/UDP source port. */ ++ uint16_t tp_dst; /* TCP/UDP destination port. */ ++}; ++OFP_ASSERT(sizeof(struct ofp_match) == 36); ++ ++/* The match fields for ICMP type and code use the transport source and ++ * destination port fields, respectively. */ ++#define icmp_type tp_src ++#define icmp_code tp_dst ++ ++/* Value used in "idle_timeout" and "hard_timeout" to indicate that the entry ++ * is permanent. */ ++#define OFP_FLOW_PERMANENT 0 ++ ++/* By default, choose a priority in the middle. */ ++#define OFP_DEFAULT_PRIORITY 0x8000 ++ ++/* Flow setup and teardown (controller -> datapath). */ ++struct ofp_flow_mod { ++ struct ofp_header header; ++ struct ofp_match match; /* Fields to match */ ++ ++ /* Flow actions. */ ++ uint16_t command; /* One of OFPFC_*. */ ++ uint16_t idle_timeout; /* Idle time before discarding (seconds). */ ++ uint16_t hard_timeout; /* Max time before discarding (seconds). */ ++ uint16_t priority; /* Priority level of flow entry. */ ++ uint32_t buffer_id; /* Buffered packet to apply to (or -1). ++ Not meaningful for OFPFC_DELETE*. */ ++ uint16_t out_port; /* For OFPFC_DELETE* commands, require ++ matching entries to include this as an ++ output port. A value of OFPP_NONE ++ indicates no restriction. */ ++ uint8_t pad[2]; /* Align to 32-bits. */ ++ uint32_t reserved; /* Reserved for future use. */ ++ struct ofp_action_header actions[0]; /* The action length is inferred ++ from the length field in the ++ header. */ ++}; ++OFP_ASSERT(sizeof(struct ofp_flow_mod) == 64); ++ ++/* Why did this flow expire? */ ++enum ofp_flow_expired_reason { ++ OFPER_IDLE_TIMEOUT, /* Flow idle time exceeded idle_timeout. */ ++ OFPER_HARD_TIMEOUT /* Time exceeded hard_timeout. */ ++}; ++ ++/* Flow expiration (datapath -> controller). */ ++struct ofp_flow_expired { ++ struct ofp_header header; ++ struct ofp_match match; /* Description of fields. */ ++ ++ uint16_t priority; /* Priority level of flow entry. */ ++ uint8_t reason; /* One of OFPER_*. */ ++ uint8_t pad[1]; /* Align to 32-bits. */ ++ ++ uint32_t duration; /* Time flow was alive in seconds. */ ++ uint8_t pad2[4]; /* Align to 64-bits. */ ++ uint64_t packet_count; ++ uint64_t byte_count; ++}; ++OFP_ASSERT(sizeof(struct ofp_flow_expired) == 72); ++ ++/* Values for 'type' in ofp_error_message. These values are immutable: they ++ * will not change in future versions of the protocol (although new values may ++ * be added). */ ++enum ofp_error_type { ++ OFPET_HELLO_FAILED, /* Hello protocol failed. */ ++ OFPET_BAD_REQUEST, /* Request was not understood. */ ++ OFPET_BAD_ACTION, /* Error in action description. */ ++ OFPET_FLOW_MOD_FAILED, /* Problem modifying flow entry. */ ++ OFPET_PORT_MOD_FAILED /* OFPT_PORT_MOD failed. */ ++}; ++ ++/* ofp_error_msg 'code' values for OFPET_HELLO_FAILED. 'data' contains an ++ * ASCII text string that may give failure details. */ ++enum ofp_hello_failed_code { ++ OFPHFC_INCOMPATIBLE /* No compatible version. */ ++}; ++ ++/* ofp_error_msg 'code' values for OFPET_BAD_REQUEST. 'data' contains at least ++ * the first 64 bytes of the failed request. */ ++enum ofp_bad_request_code { ++ OFPBRC_BAD_VERSION, /* ofp_header.version not supported. */ ++ OFPBRC_BAD_TYPE, /* ofp_header.type not supported. */ ++ OFPBRC_BAD_STAT, /* ofp_stats_request.type not supported. */ ++ OFPBRC_BAD_VENDOR, /* Vendor not supported (in ofp_vendor_header ++ * or ofp_stats_request or ofp_stats_reply). */ ++ OFPBRC_BAD_SUBTYPE, /* Vendor subtype not supported. */ ++ OFPBRC_BAD_LENGTH, /* Wrong request length for type. */ ++ OFPBRC_BUFFER_EMPTY, /* Specified buffer has already been used. */ ++ OFPBRC_BAD_COOKIE /* Specified buffer does not exist. */ ++}; ++ ++/* ofp_error_msg 'code' values for OFPET_BAD_ACTION. 'data' contains at least ++ * the first 64 bytes of the failed request. */ ++enum ofp_bad_action_code { ++ OFPBAC_BAD_TYPE, /* Unknown action type. */ ++ OFPBAC_BAD_LEN, /* Length problem in actions. */ ++ OFPBAC_BAD_VENDOR, /* Unknown vendor id specified. */ ++ OFPBAC_BAD_VENDOR_TYPE, /* Unknown action type for vendor id. */ ++ OFPBAC_BAD_OUT_PORT, /* Problem validating output action. */ ++ OFPBAC_BAD_ARGUMENT, /* Bad action argument. */ ++ OFPBAC_TOO_MANY /* Can't handle this many actions. */ ++}; ++ ++/* ofp_error_msg 'code' values for OFPET_FLOW_MOD_FAILED. 'data' contains ++ * at least the first 64 bytes of the failed request. */ ++enum ofp_flow_mod_failed_code { ++ OFPFMFC_ALL_TABLES_FULL, /* Flow not added because of full tables. */ ++ OFPFMFC_BAD_COMMAND /* Unknown command. */ ++}; ++ ++/* ofp_error_msg 'code' values for OFPET_PORT_MOD_FAILED. 'data' contains ++ * at least the first 64 bytes of the failed request. */ ++enum ofp_port_mod_failed_code { ++ OFPPMFC_BAD_PORT, /* Specified port does not exist. */ ++ OFPPMFC_BAD_HW_ADDR, /* Specified hardware address is wrong. */ ++}; ++ ++/* OFPT_ERROR: Error message (datapath -> controller). */ ++struct ofp_error_msg { ++ struct ofp_header header; ++ ++ uint16_t type; ++ uint16_t code; ++ uint8_t data[0]; /* Variable-length data. Interpreted based ++ on the type and code. */ ++}; ++OFP_ASSERT(sizeof(struct ofp_error_msg) == 12); ++ ++enum ofp_stats_types { ++ /* Description of this OpenFlow switch. ++ * The request body is empty. ++ * The reply body is struct ofp_desc_stats. */ ++ OFPST_DESC, ++ ++ /* Individual flow statistics. ++ * The request body is struct ofp_flow_stats_request. ++ * The reply body is an array of struct ofp_flow_stats. */ ++ OFPST_FLOW, ++ ++ /* Aggregate flow statistics. ++ * The request body is struct ofp_aggregate_stats_request. ++ * The reply body is struct ofp_aggregate_stats_reply. */ ++ OFPST_AGGREGATE, ++ ++ /* Flow table statistics. ++ * The request body is empty. ++ * The reply body is an array of struct ofp_table_stats. */ ++ OFPST_TABLE, ++ ++ /* Physical port statistics. ++ * The request body is empty. ++ * The reply body is an array of struct ofp_port_stats. */ ++ OFPST_PORT, ++ ++ /* Vendor extension. ++ * The request and reply bodies begin with a 32-bit vendor ID, which takes ++ * the same form as in "struct ofp_vendor_header". The request and reply ++ * bodies are otherwise vendor-defined. */ ++ OFPST_VENDOR = 0xffff ++}; ++ ++struct ofp_stats_request { ++ struct ofp_header header; ++ uint16_t type; /* One of the OFPST_* constants. */ ++ uint16_t flags; /* OFPSF_REQ_* flags (none yet defined). */ ++ uint8_t body[0]; /* Body of the request. */ ++}; ++OFP_ASSERT(sizeof(struct ofp_stats_request) == 12); ++ ++enum ofp_stats_reply_flags { ++ OFPSF_REPLY_MORE = 1 << 0 /* More replies to follow. */ ++}; ++ ++struct ofp_stats_reply { ++ struct ofp_header header; ++ uint16_t type; /* One of the OFPST_* constants. */ ++ uint16_t flags; /* OFPSF_REPLY_* flags. */ ++ uint8_t body[0]; /* Body of the reply. */ ++}; ++OFP_ASSERT(sizeof(struct ofp_stats_reply) == 12); ++ ++#define DESC_STR_LEN 256 ++#define SERIAL_NUM_LEN 32 ++/* Body of reply to OFPST_DESC request. Each entry is a NULL-terminated ++ * ASCII string. */ ++struct ofp_desc_stats { ++ char mfr_desc[DESC_STR_LEN]; /* Manufacturer description. */ ++ char hw_desc[DESC_STR_LEN]; /* Hardware description. */ ++ char sw_desc[DESC_STR_LEN]; /* Software description. */ ++ char serial_num[SERIAL_NUM_LEN]; /* Serial number. */ ++}; ++OFP_ASSERT(sizeof(struct ofp_desc_stats) == 800); ++ ++/* Body for ofp_stats_request of type OFPST_FLOW. */ ++struct ofp_flow_stats_request { ++ struct ofp_match match; /* Fields to match. */ ++ uint8_t table_id; /* ID of table to read (from ofp_table_stats) ++ or 0xff for all tables. */ ++ uint8_t pad; /* Align to 32 bits. */ ++ uint16_t out_port; /* Require matching entries to include this ++ as an output port. A value of OFPP_NONE ++ indicates no restriction. */ ++}; ++OFP_ASSERT(sizeof(struct ofp_flow_stats_request) == 40); ++ ++/* Body of reply to OFPST_FLOW request. */ ++struct ofp_flow_stats { ++ uint16_t length; /* Length of this entry. */ ++ uint8_t table_id; /* ID of table flow came from. */ ++ uint8_t pad; ++ struct ofp_match match; /* Description of fields. */ ++ uint32_t duration; /* Time flow has been alive in seconds. */ ++ uint16_t priority; /* Priority of the entry. Only meaningful ++ when this is not an exact-match entry. */ ++ uint16_t idle_timeout; /* Number of seconds idle before expiration. */ ++ uint16_t hard_timeout; /* Number of seconds before expiration. */ ++ uint16_t pad2[3]; /* Pad to 64 bits. */ ++ uint64_t packet_count; /* Number of packets in flow. */ ++ uint64_t byte_count; /* Number of bytes in flow. */ ++ struct ofp_action_header actions[0]; /* Actions. */ ++}; ++OFP_ASSERT(sizeof(struct ofp_flow_stats) == 72); ++ ++/* Body for ofp_stats_request of type OFPST_AGGREGATE. */ ++struct ofp_aggregate_stats_request { ++ struct ofp_match match; /* Fields to match. */ ++ uint8_t table_id; /* ID of table to read (from ofp_table_stats) ++ or 0xff for all tables. */ ++ uint8_t pad; /* Align to 32 bits. */ ++ uint16_t out_port; /* Require matching entries to include this ++ as an output port. A value of OFPP_NONE ++ indicates no restriction. */ ++}; ++OFP_ASSERT(sizeof(struct ofp_aggregate_stats_request) == 40); ++ ++/* Body of reply to OFPST_AGGREGATE request. */ ++struct ofp_aggregate_stats_reply { ++ uint64_t packet_count; /* Number of packets in flows. */ ++ uint64_t byte_count; /* Number of bytes in flows. */ ++ uint32_t flow_count; /* Number of flows. */ ++ uint8_t pad[4]; /* Align to 64 bits. */ ++}; ++OFP_ASSERT(sizeof(struct ofp_aggregate_stats_reply) == 24); ++ ++/* Body of reply to OFPST_TABLE request. */ ++struct ofp_table_stats { ++ uint8_t table_id; /* Identifier of table. Lower numbered tables ++ are consulted first. */ ++ uint8_t pad[3]; /* Align to 32-bits. */ ++ char name[OFP_MAX_TABLE_NAME_LEN]; ++ uint32_t wildcards; /* Bitmap of OFPFW_* wildcards that are ++ supported by the table. */ ++ uint32_t max_entries; /* Max number of entries supported. */ ++ uint32_t active_count; /* Number of active entries. */ ++ uint64_t lookup_count; /* Number of packets looked up in table. */ ++ uint64_t matched_count; /* Number of packets that hit table. */ ++}; ++OFP_ASSERT(sizeof(struct ofp_table_stats) == 64); ++ ++/* Body of reply to OFPST_PORT request. If a counter is unsupported, set ++ * the field to all ones. */ ++struct ofp_port_stats { ++ uint16_t port_no; ++ uint8_t pad[6]; /* Align to 64-bits. */ ++ uint64_t rx_packets; /* Number of received packets. */ ++ uint64_t tx_packets; /* Number of transmitted packets. */ ++ uint64_t rx_bytes; /* Number of received bytes. */ ++ uint64_t tx_bytes; /* Number of transmitted bytes. */ ++ uint64_t rx_dropped; /* Number of packets dropped by RX. */ ++ uint64_t tx_dropped; /* Number of packets dropped by TX. */ ++ uint64_t rx_errors; /* Number of receive errors. This is a super-set ++ of receive errors and should be great than or ++ equal to the sum of all rx_*_err values. */ ++ uint64_t tx_errors; /* Number of transmit errors. This is a super-set ++ of transmit errors. */ ++ uint64_t rx_frame_err; /* Number of frame alignment errors. */ ++ uint64_t rx_over_err; /* Number of packets with RX overrun. */ ++ uint64_t rx_crc_err; /* Number of CRC errors. */ ++ uint64_t collisions; /* Number of collisions. */ ++}; ++OFP_ASSERT(sizeof(struct ofp_port_stats) == 104); ++ ++/* Vendor extension. */ ++struct ofp_vendor_header { ++ struct ofp_header header; /* Type OFPT_VENDOR. */ ++ uint32_t vendor; /* Vendor ID: ++ * - MSB 0: low-order bytes are IEEE OUI. ++ * - MSB != 0: defined by OpenFlow ++ * consortium. */ ++ /* Vendor-defined arbitrary additional data. */ ++}; ++OFP_ASSERT(sizeof(struct ofp_vendor_header) == 12); ++ ++#endif /* openflow/openflow.h */ +diff -r 1a87bbd37bb1 include/openvswitch/brcompat-netlink.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/include/openvswitch/brcompat-netlink.h Tue Jun 30 13:50:53 2009 +0100 +@@ -0,0 +1,79 @@ ++/* ++ * Copyright (c) 2008, 2009 Nicira Networks. ++ * ++ * This file is offered under your choice of two licenses: Apache 2.0 or GNU ++ * GPL 2.0 or later. The permission statements for each of these licenses is ++ * given below. You may license your modifications to this file under either ++ * of these licenses or both. If you wish to license your modifications under ++ * only one of these licenses, delete the permission text for the other ++ * license. ++ * ++ * ---------------------------------------------------------------------- ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at: ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ * ---------------------------------------------------------------------- ++ * 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., ++ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ---------------------------------------------------------------------- ++ */ ++ ++#ifndef OPENVSWITCH_BRCOMPAT_NETLINK_H ++#define OPENVSWITCH_BRCOMPAT_NETLINK_H 1 ++ ++#define BRC_GENL_FAMILY_NAME "brcompat" ++ ++/* Attributes that can be attached to the datapath's netlink messages. */ ++enum { ++ BRC_GENL_A_UNSPEC, ++ BRC_GENL_A_DP_NAME, /* Datapath name. */ ++ BRC_GENL_A_PORT_NAME, /* Interface name. */ ++ BRC_GENL_A_ERR_CODE, /* Positive error code. */ ++ BRC_GENL_A_MC_GROUP, /* Generic netlink multicast group. */ ++ BRC_GENL_A_PROC_DIR, /* Name of subdirectory in /proc. */ ++ BRC_GENL_A_PROC_NAME, /* Name of file in /proc. */ ++ BRC_GENL_A_PROC_DATA, /* Contents of file in /proc. */ ++ ++ __BRC_GENL_A_MAX, ++ BRC_GENL_A_MAX = __BRC_GENL_A_MAX - 1 ++}; ++ ++/* Commands that can be executed on the datapath's netlink interface. */ ++enum brc_genl_command { ++ BRC_GENL_C_UNSPEC, ++ ++ /* ++ * "K:" messages are sent by the kernel to userspace. ++ * "U:" messages are sent by userspace to the kernel. ++ */ ++ BRC_GENL_C_DP_ADD, /* K: Datapath created. */ ++ BRC_GENL_C_DP_DEL, /* K: Datapath destroyed. */ ++ BRC_GENL_C_DP_RESULT, /* U: Return code from ovs-brcompatd. */ ++ BRC_GENL_C_PORT_ADD, /* K: Port added to datapath. */ ++ BRC_GENL_C_PORT_DEL, /* K: Port removed from datapath. */ ++ BRC_GENL_C_QUERY_MC, /* U: Get multicast group for brcompat. */ ++ BRC_GENL_C_SET_PROC, /* U: Set contents of file in /proc. */ ++ ++ __BRC_GENL_C_MAX, ++ BRC_GENL_C_MAX = __BRC_GENL_C_MAX - 1 ++}; ++#endif /* openvswitch/brcompat-netlink.h */ +diff -r 1a87bbd37bb1 include/openvswitch/datapath-protocol.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/include/openvswitch/datapath-protocol.h Tue Jun 30 13:50:53 2009 +0100 +@@ -0,0 +1,310 @@ ++/* ++ * Copyright (c) 2009 Nicira Networks. ++ * ++ * This file is offered under your choice of two licenses: Apache 2.0 or GNU ++ * GPL 2.0 or later. The permission statements for each of these licenses is ++ * given below. You may license your modifications to this file under either ++ * of these licenses or both. If you wish to license your modifications under ++ * only one of these licenses, delete the permission text for the other ++ * license. ++ * ++ * ---------------------------------------------------------------------- ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at: ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ * ---------------------------------------------------------------------- ++ * 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., ++ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ---------------------------------------------------------------------- ++ */ ++ ++/* Protocol between secchan and datapath. */ ++ ++#ifndef OPENVSWITCH_DATAPATH_PROTOCOL_H ++#define OPENVSWITCH_DATAPATH_PROTOCOL_H 1 ++ ++#ifdef __KERNEL__ ++#include ++#else ++#include ++#endif ++#include ++ ++#define ODP_MAX 256 /* Maximum number of datapaths. */ ++ ++#define ODP_DP_CREATE _IO('O', 0) ++#define ODP_DP_DESTROY _IO('O', 1) ++#define ODP_DP_STATS _IOW('O', 2, struct odp_stats) ++ ++#define ODP_GET_DROP_FRAGS _IOW('O', 3, int) ++#define ODP_SET_DROP_FRAGS _IOR('O', 4, int) ++ ++#define ODP_GET_LISTEN_MASK _IOW('O', 5, int) ++#define ODP_SET_LISTEN_MASK _IOR('O', 6, int) ++ ++#define ODP_PORT_ADD _IOR('O', 7, struct odp_port) ++#define ODP_PORT_DEL _IOR('O', 8, int) ++#define ODP_PORT_QUERY _IOWR('O', 9, struct odp_port) ++#define ODP_PORT_LIST _IOWR('O', 10, struct odp_portvec) ++ ++#define ODP_PORT_GROUP_SET _IOR('O', 11, struct odp_port_group) ++#define ODP_PORT_GROUP_GET _IOWR('O', 12, struct odp_port_group) ++ ++#define ODP_FLOW_GET _IOWR('O', 13, struct odp_flow) ++#define ODP_FLOW_GET_MULTIPLE _IOWR('O', 14, struct odp_flowvec) ++#define ODP_FLOW_LIST _IOWR('O', 15, struct odp_flowvec) ++ ++#define ODP_FLOW_FLUSH _IO('O', 16) ++#define ODP_FLOW_PUT _IOWR('O', 17, struct odp_flow) ++#define ODP_FLOW_DEL _IOWR('O', 18, struct odp_flow) ++ ++#define ODP_EXECUTE _IOR('O', 19, struct odp_execute) ++ ++struct odp_stats { ++ /* Flows. */ ++ __u32 n_flows; /* Number of flows in flow table. */ ++ __u32 cur_capacity; /* Current flow table capacity. */ ++ __u32 max_capacity; /* Maximum expansion of flow table capacity. */ ++ ++ /* Ports. */ ++ __u32 n_ports; /* Current number of ports. */ ++ __u32 max_ports; /* Maximum supported number of ports. */ ++ __u16 max_groups; /* Maximum number of port groups. */ ++ __u16 reserved; ++ ++ /* Lookups. */ ++ __u64 n_frags; /* Number of dropped IP fragments. */ ++ __u64 n_hit; /* Number of flow table matches. */ ++ __u64 n_missed; /* Number of flow table misses. */ ++ __u64 n_lost; /* Number of misses not sent to userspace. */ ++ ++ /* Queues. */ ++ __u16 max_miss_queue; /* Max length of ODPL_MISS queue. */ ++ __u16 max_action_queue; /* Max length of ODPL_ACTION queue. */ ++}; ++ ++/* Logical ports. */ ++#define ODPP_LOCAL ((__u16)0) ++#define ODPP_NONE ((__u16)-1) ++ ++/* Listening channels. */ ++#define _ODPL_MISS_NR 0 /* Packet missed in flow table. */ ++#define ODPL_MISS (1 << _ODPL_MISS_NR) ++#define _ODPL_ACTION_NR 1 /* Packet output to ODPP_CONTROLLER. */ ++#define ODPL_ACTION (1 << _ODPL_ACTION_NR) ++#define ODPL_ALL (ODPL_MISS | ODPL_ACTION) ++ ++/* Format of messages read from datapath fd. */ ++struct odp_msg { ++ __u32 type; /* _ODPL_MISS_NR or _ODPL_ACTION_NR. */ ++ __u32 length; /* Message length, including header. */ ++ __u16 port; /* Port on which frame was received. */ ++ __u16 reserved; ++ __u32 arg; /* Argument value specified in action. */ ++ /* Followed by packet data. */ ++}; ++ ++#define ODP_PORT_INTERNAL (1 << 0) /* This port is simulated. */ ++struct odp_port { ++ char devname[16]; /* IFNAMSIZ */ ++ __u16 port; ++ __u16 flags; ++ __u32 reserved2; ++}; ++ ++struct odp_portvec { ++ struct odp_port *ports; ++ int n_ports; ++}; ++ ++struct odp_port_group { ++ __u16 *ports; ++ __u16 n_ports; /* Number of ports. */ ++ __u16 group; /* Group number. */ ++}; ++ ++struct odp_flow_stats { ++ __u64 n_packets; /* Number of matched packets. */ ++ __u64 n_bytes; /* Number of matched bytes. */ ++ __u64 used_sec; /* Time last used. */ ++ __u32 used_nsec; ++ __u8 tcp_flags; ++ __u8 ip_tos; ++ __u16 reserved; ++}; ++ ++struct odp_flow_key { ++ __be32 nw_src; /* IP source address. */ ++ __be32 nw_dst; /* IP destination address. */ ++ __u16 in_port; /* Input switch port. */ ++ __be16 dl_vlan; /* Input VLAN. */ ++ __be16 dl_type; /* Ethernet frame type. */ ++ __be16 tp_src; /* TCP/UDP source port. */ ++ __be16 tp_dst; /* TCP/UDP destination port. */ ++ __u8 dl_src[ETH_ALEN]; /* Ethernet source address. */ ++ __u8 dl_dst[ETH_ALEN]; /* Ethernet destination address. */ ++ __u8 nw_proto; /* IP protocol. */ ++ __u8 reserved; /* Pad to 64 bits. */ ++}; ++ ++struct odp_flow { ++ struct odp_flow_stats stats; ++ struct odp_flow_key key; ++ union odp_action *actions; ++ __u32 n_actions; ++}; ++ ++/* Flags for ODP_FLOW_PUT. */ ++#define ODPPF_CREATE (1 << 0) /* Allow creating a new flow. */ ++#define ODPPF_MODIFY (1 << 1) /* Allow modifying an existing flow. */ ++#define ODPPF_ZERO_STATS (1 << 2) /* Zero the stats of an existing flow. */ ++ ++/* ODP_FLOW_PUT argument. */ ++struct odp_flow_put { ++ struct odp_flow flow; ++ __u32 flags; ++}; ++ ++struct odp_flowvec { ++ struct odp_flow *flows; ++ int n_flows; ++}; ++ ++/* The VLAN id is 12 bits, so we can use the entire 16 bits to indicate ++ * special conditions. All ones is used to match that no VLAN id was ++ * set. */ ++#define ODP_VLAN_NONE 0xffff ++ ++/* Action types. */ ++#define ODPAT_OUTPUT 0 /* Output to switch port. */ ++#define ODPAT_OUTPUT_GROUP 1 /* Output to all ports in group. */ ++#define ODPAT_CONTROLLER 2 /* Send copy to controller. */ ++#define ODPAT_SET_VLAN_VID 3 /* Set the 802.1q VLAN id. */ ++#define ODPAT_SET_VLAN_PCP 4 /* Set the 802.1q priority. */ ++#define ODPAT_STRIP_VLAN 5 /* Strip the 802.1q header. */ ++#define ODPAT_SET_DL_SRC 6 /* Ethernet source address. */ ++#define ODPAT_SET_DL_DST 7 /* Ethernet destination address. */ ++#define ODPAT_SET_NW_SRC 8 /* IP source address. */ ++#define ODPAT_SET_NW_DST 9 /* IP destination address. */ ++#define ODPAT_SET_TP_SRC 10 /* TCP/UDP source port. */ ++#define ODPAT_SET_TP_DST 11 /* TCP/UDP destination port. */ ++#define ODPAT_N_ACTIONS 12 ++ ++struct odp_action_output { ++ __u16 type; /* ODPAT_OUTPUT. */ ++ __u16 port; /* Output port. */ ++ __u16 reserved1; ++ __u16 reserved2; ++}; ++ ++struct odp_action_output_group { ++ __u16 type; /* ODPAT_OUTPUT_GROUP. */ ++ __u16 group; /* Group number. */ ++ __u16 reserved1; ++ __u16 reserved2; ++}; ++ ++struct odp_action_controller { ++ __u16 type; /* ODPAT_OUTPUT_CONTROLLER. */ ++ __u16 reserved; ++ __u32 arg; /* Copied to struct odp_msg 'arg' member. */ ++}; ++ ++/* Action structure for ODPAT_SET_VLAN_VID. */ ++struct odp_action_vlan_vid { ++ __u16 type; /* ODPAT_SET_VLAN_VID. */ ++ __be16 vlan_vid; /* VLAN id. */ ++ __u16 reserved1; ++ __u16 reserved2; ++}; ++ ++/* Action structure for ODPAT_SET_VLAN_PCP. */ ++struct odp_action_vlan_pcp { ++ __u16 type; /* ODPAT_SET_VLAN_PCP. */ ++ __u8 vlan_pcp; /* VLAN priority. */ ++ __u8 reserved1; ++ __u16 reserved2; ++ __u16 reserved3; ++}; ++ ++/* Action structure for ODPAT_SET_DL_SRC/DST. */ ++struct odp_action_dl_addr { ++ __u16 type; /* ODPAT_SET_DL_SRC/DST. */ ++ __u8 dl_addr[ETH_ALEN]; /* Ethernet address. */ ++}; ++ ++/* Action structure for ODPAT_SET_NW_SRC/DST. */ ++struct odp_action_nw_addr { ++ __u16 type; /* ODPAT_SET_TW_SRC/DST. */ ++ __u16 reserved; ++ __be32 nw_addr; /* IP address. */ ++}; ++ ++/* Action structure for ODPAT_SET_TP_SRC/DST. */ ++struct odp_action_tp_port { ++ __u16 type; /* ODPAT_SET_TP_SRC/DST. */ ++ __be16 tp_port; /* TCP/UDP port. */ ++ __u16 reserved1; ++ __u16 reserved2; ++}; ++ ++union odp_action { ++ __u16 type; ++ struct odp_action_output output; ++ struct odp_action_output_group output_group; ++ struct odp_action_controller controller; ++ struct odp_action_vlan_vid vlan_vid; ++ struct odp_action_vlan_pcp vlan_pcp; ++ struct odp_action_dl_addr dl_addr; ++ struct odp_action_nw_addr nw_addr; ++ struct odp_action_tp_port tp_port; ++}; ++ ++struct odp_execute { ++ __u16 in_port; ++ __u16 reserved1; ++ __u32 reserved2; ++ ++ union odp_action *actions; ++ __u32 n_actions; ++ ++ const void *data; ++ __u32 length; ++}; ++ ++/* Values below this cutoff are 802.3 packets and the two bytes ++ * following MAC addresses are used as a frame length. Otherwise, the ++ * two bytes are used as the Ethernet type. ++ */ ++#define ODP_DL_TYPE_ETH2_CUTOFF 0x0600 ++ ++/* Value of dl_type to indicate that the frame does not include an ++ * Ethernet type. ++ */ ++#define ODP_DL_TYPE_NOT_ETH_TYPE 0x05ff ++ ++/* The VLAN id is 12-bits, so we can use the entire 16 bits to indicate ++ * special conditions. All ones indicates that no VLAN id was set. ++ */ ++#define ODP_VLAN_NONE 0xffff ++ ++#endif /* openvswitch/datapath-protocol.h */ +diff -r 1a87bbd37bb1 net/vswitch/actions.c +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/net/vswitch/actions.c Tue Jun 30 13:50:53 2009 +0100 +@@ -0,0 +1,424 @@ ++/* ++ * Distributed under the terms of the GNU GPL version 2. ++ * Copyright (c) 2007, 2008, 2009 Nicira Networks. ++ * ++ * Significant portions of this file may be copied from parts of the Linux ++ * kernel, by Linus Torvalds and others. ++ */ ++ ++/* Functions for executing flow actions. */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include "datapath.h" ++#include "dp_dev.h" ++#include "actions.h" ++#include "openvswitch/datapath-protocol.h" ++ ++struct sk_buff * ++make_writable(struct sk_buff *skb, gfp_t gfp) ++{ ++ if (skb_shared(skb) || skb_cloned(skb)) { ++ struct sk_buff *nskb = skb_copy(skb, gfp); ++ if (nskb) { ++ kfree_skb(skb); ++ return nskb; ++ } ++ } else { ++ unsigned int hdr_len = (skb_transport_offset(skb) ++ + sizeof(struct tcphdr)); ++ if (pskb_may_pull(skb, min(hdr_len, skb->len))) ++ return skb; ++ } ++ kfree_skb(skb); ++ return NULL; ++} ++ ++ ++static struct sk_buff * ++vlan_pull_tag(struct sk_buff *skb) ++{ ++ struct vlan_ethhdr *vh = vlan_eth_hdr(skb); ++ struct ethhdr *eh; ++ ++ ++ /* Verify we were given a vlan packet */ ++ if (vh->h_vlan_proto != htons(ETH_P_8021Q)) ++ return skb; ++ ++ memmove(skb->data + VLAN_HLEN, skb->data, 2 * VLAN_ETH_ALEN); ++ ++ eh = (struct ethhdr *)skb_pull(skb, VLAN_HLEN); ++ ++ skb->protocol = eh->h_proto; ++ skb->mac_header += VLAN_HLEN; ++ ++ return skb; ++} ++ ++ ++static struct sk_buff * ++modify_vlan_tci(struct datapath *dp, struct sk_buff *skb, ++ struct odp_flow_key *key, const union odp_action *a, ++ int n_actions, gfp_t gfp) ++{ ++ u16 tci, mask; ++ ++ if (a->type == ODPAT_SET_VLAN_VID) { ++ tci = ntohs(a->vlan_vid.vlan_vid); ++ mask = VLAN_VID_MASK; ++ key->dl_vlan = htons(tci & mask); ++ } else { ++ tci = a->vlan_pcp.vlan_pcp << 13; ++ mask = VLAN_PCP_MASK; ++ } ++ ++ skb = make_writable(skb, gfp); ++ if (!skb) ++ return ERR_PTR(-ENOMEM); ++ ++ if (skb->protocol == htons(ETH_P_8021Q)) { ++ /* Modify vlan id, but maintain other TCI values */ ++ struct vlan_ethhdr *vh = vlan_eth_hdr(skb); ++ vh->h_vlan_TCI = htons((ntohs(vh->h_vlan_TCI) & ~mask) | tci); ++ } else { ++ /* Add vlan header */ ++ ++ /* Set up checksumming pointers for checksum-deferred packets ++ * on Xen. Otherwise, dev_queue_xmit() will try to do this ++ * when we send the packet out on the wire, and it will fail at ++ * that point because skb_checksum_setup() will not look inside ++ * an 802.1Q header. */ ++ skb_checksum_setup(skb); ++ ++ /* GSO is not implemented for packets with an 802.1Q header, so ++ * we have to do segmentation before we add that header. ++ * ++ * GSO does work with hardware-accelerated VLAN tagging, but we ++ * can't use hardware-accelerated VLAN tagging since it ++ * requires the device to have a VLAN group configured (with ++ * e.g. vconfig(8)) and we don't do that. ++ * ++ * Having to do this here may be a performance loss, since we ++ * can't take advantage of TSO hardware support, although it ++ * does not make a measurable network performance difference ++ * for 1G Ethernet. Fixing that would require patching the ++ * kernel (either to add GSO support to the VLAN protocol or to ++ * support hardware-accelerated VLAN tagging without VLAN ++ * groups configured). */ ++ if (skb_is_gso(skb)) { ++ struct sk_buff *segs; ++ ++ segs = skb_gso_segment(skb, 0); ++ kfree_skb(skb); ++ if (unlikely(IS_ERR(segs))) ++ return ERR_CAST(segs); ++ ++ do { ++ struct sk_buff *nskb = segs->next; ++ int err; ++ ++ segs->next = NULL; ++ ++ segs = __vlan_put_tag(segs, tci); ++ err = -ENOMEM; ++ if (segs) { ++ struct odp_flow_key segkey = *key; ++ err = execute_actions(dp, segs, ++ &segkey, a + 1, ++ n_actions - 1, ++ gfp); ++ } ++ ++ if (unlikely(err)) { ++ while ((segs = nskb)) { ++ nskb = segs->next; ++ segs->next = NULL; ++ kfree_skb(segs); ++ } ++ return ERR_PTR(err); ++ } ++ ++ segs = nskb; ++ } while (segs->next); ++ ++ skb = segs; ++ } ++ ++ /* The hardware-accelerated version of vlan_put_tag() works ++ * only for a device that has a VLAN group configured (with ++ * e.g. vconfig(8)), so call the software-only version ++ * __vlan_put_tag() directly instead. ++ */ ++ skb = __vlan_put_tag(skb, tci); ++ if (!skb) ++ return ERR_PTR(-ENOMEM); ++ } ++ ++ return skb; ++} ++ ++static struct sk_buff *strip_vlan(struct sk_buff *skb, ++ struct odp_flow_key *key, gfp_t gfp) ++{ ++ skb = make_writable(skb, gfp); ++ if (skb) { ++ vlan_pull_tag(skb); ++ key->dl_vlan = htons(ODP_VLAN_NONE); ++ } ++ return skb; ++} ++ ++static struct sk_buff *set_dl_addr(struct sk_buff *skb, ++ const struct odp_action_dl_addr *a, ++ gfp_t gfp) ++{ ++ skb = make_writable(skb, gfp); ++ if (skb) { ++ struct ethhdr *eh = eth_hdr(skb); ++ memcpy(a->type == ODPAT_SET_DL_SRC ? eh->h_source : eh->h_dest, ++ a->dl_addr, ETH_ALEN); ++ } ++ return skb; ++} ++ ++/* Updates 'sum', which is a field in 'skb''s data, given that a 4-byte field ++ * covered by the sum has been changed from 'from' to 'to'. If set, ++ * 'pseudohdr' indicates that the field is in the TCP or UDP pseudo-header. ++ * Based on nf_proto_csum_replace4. */ ++static void update_csum(__sum16 *sum, struct sk_buff *skb, ++ __be32 from, __be32 to, int pseudohdr) ++{ ++ __be32 diff[] = { ~from, to }; ++ if (skb->ip_summed != CHECKSUM_PARTIAL) { ++ *sum = csum_fold(csum_partial((char *)diff, sizeof(diff), ++ ~csum_unfold(*sum))); ++ if (skb->ip_summed == CHECKSUM_COMPLETE && pseudohdr) ++ skb->csum = ~csum_partial((char *)diff, sizeof(diff), ++ ~skb->csum); ++ } else if (pseudohdr) ++ *sum = ~csum_fold(csum_partial((char *)diff, sizeof(diff), ++ csum_unfold(*sum))); ++} ++ ++static struct sk_buff *set_nw_addr(struct sk_buff *skb, ++ struct odp_flow_key *key, ++ const struct odp_action_nw_addr *a, ++ gfp_t gfp) ++{ ++ if (key->dl_type != htons(ETH_P_IP)) ++ return skb; ++ ++ skb = make_writable(skb, gfp); ++ if (skb) { ++ struct iphdr *nh = ip_hdr(skb); ++ u32 *f = a->type == ODPAT_SET_NW_SRC ? &nh->saddr : &nh->daddr; ++ u32 old = *f; ++ u32 new = a->nw_addr; ++ ++ if (key->nw_proto == IPPROTO_TCP) { ++ struct tcphdr *th = tcp_hdr(skb); ++ update_csum(&th->check, skb, old, new, 1); ++ } else if (key->nw_proto == IPPROTO_UDP) { ++ struct udphdr *th = udp_hdr(skb); ++ update_csum(&th->check, skb, old, new, 1); ++ } ++ update_csum(&nh->check, skb, old, new, 0); ++ *f = new; ++ } ++ return skb; ++} ++ ++static struct sk_buff * ++set_tp_port(struct sk_buff *skb, struct odp_flow_key *key, ++ const struct odp_action_tp_port *a, ++ gfp_t gfp) ++{ ++ int check_ofs; ++ ++ if (key->dl_type != htons(ETH_P_IP)) ++ return skb; ++ ++ if (key->nw_proto == IPPROTO_TCP) ++ check_ofs = offsetof(struct tcphdr, check); ++ else if (key->nw_proto == IPPROTO_UDP) ++ check_ofs = offsetof(struct udphdr, check); ++ else ++ return skb; ++ ++ skb = make_writable(skb, gfp); ++ if (skb) { ++ struct udphdr *th = udp_hdr(skb); ++ u16 *f = a->type == ODPAT_SET_TP_SRC ? &th->source : &th->dest; ++ u16 old = *f; ++ u16 new = a->tp_port; ++ update_csum((u16*)((u8*)skb->data + check_ofs), ++ skb, old, new, 1); ++ *f = new; ++ } ++ return skb; ++} ++ ++static inline unsigned packet_length(const struct sk_buff *skb) ++{ ++ unsigned length = skb->len - ETH_HLEN; ++ if (skb->protocol == htons(ETH_P_8021Q)) ++ length -= VLAN_HLEN; ++ return length; ++} ++ ++int dp_xmit_skb(struct sk_buff *skb) ++{ ++ struct datapath *dp = skb->dev->br_port->dp; ++ int len = skb->len; ++ ++ if (packet_length(skb) > skb->dev->mtu && !skb_is_gso(skb)) { ++ printk(KERN_WARNING "%s: dropped over-mtu packet: %d > %d\n", ++ dp_name(dp), packet_length(skb), skb->dev->mtu); ++ kfree_skb(skb); ++ return -E2BIG; ++ } ++ ++ dev_queue_xmit(skb); ++ ++ return len; ++} ++ ++static void ++do_output(struct datapath *dp, struct sk_buff *skb, int out_port) ++{ ++ struct net_bridge_port *p; ++ struct net_device *dev; ++ ++ if (!skb) ++ goto error; ++ ++ p = dp->ports[out_port]; ++ if (!p) ++ goto error; ++ ++ dev = skb->dev = p->dev; ++ if (is_dp_dev(dev)) ++ dp_dev_recv(dev, skb); ++ else ++ dp_xmit_skb(skb); ++ return; ++ ++error: ++ kfree_skb(skb); ++} ++ ++/* Never consumes 'skb'. Returns a port that 'skb' should be sent to, -1 if ++ * none. */ ++static int output_group(struct datapath *dp, __u16 group, ++ struct sk_buff *skb, gfp_t gfp) ++{ ++ struct dp_port_group *g = rcu_dereference(dp->groups[group]); ++ int prev_port = -1; ++ int i; ++ ++ if (!g) ++ return -1; ++ for (i = 0; i < g->n_ports; i++) { ++ struct net_bridge_port *p = dp->ports[g->ports[i]]; ++ if (!p || skb->dev == p->dev) ++ continue; ++ if (prev_port != -1) { ++ struct sk_buff *clone = skb_clone(skb, gfp); ++ if (!clone) ++ return -1; ++ do_output(dp, clone, prev_port); ++ } ++ prev_port = p->port_no; ++ } ++ return prev_port; ++} ++ ++static int ++output_control(struct datapath *dp, struct sk_buff *skb, u32 arg, gfp_t gfp) ++{ ++ skb = skb_clone(skb, gfp); ++ if (!skb) ++ return -ENOMEM; ++ return dp_output_control(dp, skb, _ODPL_ACTION_NR, arg); ++} ++ ++/* Execute a list of actions against 'skb'. */ ++int execute_actions(struct datapath *dp, struct sk_buff *skb, ++ struct odp_flow_key *key, ++ const union odp_action *a, int n_actions, ++ gfp_t gfp) ++{ ++ /* Every output action needs a separate clone of 'skb', but the common ++ * case is just a single output action, so that doing a clone and ++ * then freeing the original skbuff is wasteful. So the following code ++ * is slightly obscure just to avoid that. */ ++ int prev_port = -1; ++ int err = 0; ++ for (; n_actions > 0; a++, n_actions--) { ++ WARN_ON_ONCE(skb_shared(skb)); ++ if (prev_port != -1) { ++ do_output(dp, skb_clone(skb, gfp), prev_port); ++ prev_port = -1; ++ } ++ ++ switch (a->type) { ++ case ODPAT_OUTPUT: ++ prev_port = a->output.port; ++ break; ++ ++ case ODPAT_OUTPUT_GROUP: ++ prev_port = output_group(dp, a->output_group.group, ++ skb, gfp); ++ break; ++ ++ case ODPAT_CONTROLLER: ++ err = output_control(dp, skb, a->controller.arg, gfp); ++ if (err) { ++ kfree_skb(skb); ++ return err; ++ } ++ break; ++ ++ case ODPAT_SET_VLAN_VID: ++ case ODPAT_SET_VLAN_PCP: ++ skb = modify_vlan_tci(dp, skb, key, a, n_actions, gfp); ++ if (IS_ERR(skb)) ++ return PTR_ERR(skb); ++ break; ++ ++ case ODPAT_STRIP_VLAN: ++ skb = strip_vlan(skb, key, gfp); ++ break; ++ ++ case ODPAT_SET_DL_SRC: ++ case ODPAT_SET_DL_DST: ++ skb = set_dl_addr(skb, &a->dl_addr, gfp); ++ break; ++ ++ case ODPAT_SET_NW_SRC: ++ case ODPAT_SET_NW_DST: ++ skb = set_nw_addr(skb, key, &a->nw_addr, gfp); ++ break; ++ ++ case ODPAT_SET_TP_SRC: ++ case ODPAT_SET_TP_DST: ++ skb = set_tp_port(skb, key, &a->tp_port, gfp); ++ break; ++ } ++ if (!skb) ++ return -ENOMEM; ++ } ++ if (prev_port != -1) ++ do_output(dp, skb, prev_port); ++ else ++ kfree_skb(skb); ++ return err; ++} +diff -r 1a87bbd37bb1 net/vswitch/actions.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/net/vswitch/actions.h Tue Jun 30 13:50:53 2009 +0100 +@@ -0,0 +1,26 @@ ++/* ++ * Copyright (c) 2009 Nicira Networks. ++ * Distributed under the terms of the GNU GPL version 2. ++ * ++ * Significant portions of this file may be copied from parts of the Linux ++ * kernel, by Linus Torvalds and others. ++ */ ++ ++#ifndef ACTIONS_H ++#define ACTIONS_H 1 ++ ++#include ++ ++struct datapath; ++struct sk_buff; ++struct odp_flow_key; ++union odp_action; ++ ++struct sk_buff *make_writable(struct sk_buff *, gfp_t gfp); ++int dp_xmit_skb(struct sk_buff *); ++int execute_actions(struct datapath *dp, struct sk_buff *skb, ++ struct odp_flow_key *key, ++ const union odp_action *, int n_actions, ++ gfp_t gfp); ++ ++#endif /* actions.h */ +diff -r 1a87bbd37bb1 net/vswitch/brc_procfs.c +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/net/vswitch/brc_procfs.c Tue Jun 30 13:50:53 2009 +0100 +@@ -0,0 +1,193 @@ ++/* ++ * Copyright (c) 2009 Nicira Networks. ++ * Distributed under the terms of the GNU GPL version 2. ++ * ++ * Significant portions of this file may be copied from parts of the Linux ++ * kernel, by Linus Torvalds and others. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include "openvswitch/brcompat-netlink.h" ++ ++/* This code implements a Generic Netlink command BRC_GENL_C_SET_PROC that can ++ * be used to add, modify, and delete arbitrary files in selected ++ * subdirectories of /proc. It's a horrible kluge prompted by the need to ++ * simulate certain /proc/net/vlan and /proc/net/bonding files for software ++ * that wants to read them, and with any luck it will go away eventually. ++ * ++ * The implementation is a kluge too. In particular, we want to release the ++ * strings copied into the 'data' members of proc_dir_entry when the ++ * proc_dir_entry structures are freed, but there doesn't appear to be a way to ++ * hook that, so instead we have to rely on being the only entity modifying the ++ * directories in question. ++ */ ++ ++static int brc_seq_show(struct seq_file *seq, void *unused) ++{ ++ seq_puts(seq, seq->private); ++ return 0; ++} ++ ++static int brc_seq_open(struct inode *inode, struct file *file) ++{ ++ return single_open(file, brc_seq_show, PDE(inode)->data); ++} ++ ++static struct file_operations brc_fops = { ++ .owner = THIS_MODULE, ++ .open = brc_seq_open, ++ .read = seq_read, ++ .llseek = seq_lseek, ++ .release = single_release, ++}; ++ ++static struct proc_dir_entry *proc_vlan_dir; ++static struct proc_dir_entry *proc_bonding_dir; ++ ++struct proc_dir_entry *brc_lookup_entry(struct proc_dir_entry *de, const char *name) ++{ ++ int namelen = strlen(name); ++ for (de = de->subdir; de; de = de->next) { ++ if (de->namelen != namelen) ++ continue; ++ if (!memcmp(name, de->name, de->namelen)) ++ return de; ++ } ++ return NULL; ++} ++ ++static struct proc_dir_entry *brc_open_dir(const char *dir_name, ++ struct proc_dir_entry *parent, ++ struct proc_dir_entry **dirp) ++{ ++ if (!*dirp) { ++ struct proc_dir_entry *dir; ++ if (brc_lookup_entry(parent, dir_name)) { ++ printk(KERN_WARNING "%s proc directory exists, can't " ++ "simulate--probably its real module is " ++ "loaded\n", dir_name); ++ return NULL; ++ } ++ dir = *dirp = proc_mkdir(dir_name, parent); ++ } ++ return *dirp; ++} ++ ++/* Maximum length of the BRC_GENL_A_PROC_DIR and BRC_GENL_A_PROC_NAME strings. ++ * If we could depend on supporting NLA_NUL_STRING and the .len member in ++ * Generic Netlink policy, then we could just put this in brc_genl_policy (and ++ * simplify brc_genl_set_proc() below too), but upstream 2.6.18 does not have ++ * either. */ ++#define BRC_NAME_LEN_MAX 32 ++ ++int brc_genl_set_proc(struct sk_buff *skb, struct genl_info *info) ++{ ++ struct proc_dir_entry *dir, *entry; ++ const char *dir_name, *name; ++ char *data; ++ ++ if (!info->attrs[BRC_GENL_A_PROC_DIR] || ++ VERIFY_NUL_STRING(info->attrs[BRC_GENL_A_PROC_DIR]) || ++ !info->attrs[BRC_GENL_A_PROC_NAME] || ++ VERIFY_NUL_STRING(info->attrs[BRC_GENL_A_PROC_NAME]) || ++ (info->attrs[BRC_GENL_A_PROC_DATA] && ++ VERIFY_NUL_STRING(info->attrs[BRC_GENL_A_PROC_DATA]))) ++ return -EINVAL; ++ ++ dir_name = nla_data(info->attrs[BRC_GENL_A_PROC_DIR]); ++ name = nla_data(info->attrs[BRC_GENL_A_PROC_NAME]); ++ if (strlen(dir_name) > BRC_NAME_LEN_MAX || ++ strlen(name) > BRC_NAME_LEN_MAX) ++ return -EINVAL; ++ ++ if (!strcmp(dir_name, "net/vlan")) ++ dir = brc_open_dir("vlan", proc_net, &proc_vlan_dir); ++ else if (!strcmp(dir_name, "net/bonding")) ++ dir = brc_open_dir("bonding", proc_net, &proc_bonding_dir); ++ else ++ return -EINVAL; ++ if (!dir) { ++ /* Probably failed because the module that really implements ++ * the function in question is loaded and already owns the ++ * directory in question.*/ ++ return -EBUSY; ++ } ++ ++ entry = brc_lookup_entry(dir, name); ++ if (!info->attrs[BRC_GENL_A_PROC_DATA]) { ++ if (!entry) ++ return -ENOENT; ++ ++ data = entry->data; ++ remove_proc_entry(name, dir); ++ if (brc_lookup_entry(dir, name)) ++ return -EBUSY; /* Shouldn't happen */ ++ ++ kfree(data); ++ } else { ++ data = kstrdup(nla_data(info->attrs[BRC_GENL_A_PROC_DATA]), ++ GFP_KERNEL); ++ if (!data) ++ return -ENOMEM; ++ ++ if (entry) { ++ char *old_data = entry->data; ++ entry->data = data; ++ kfree(old_data); ++ return 0; ++ } ++ ++ entry = create_proc_entry(name, S_IFREG|S_IRUSR|S_IWUSR, dir); ++ if (!entry) { ++ kfree(data); ++ return -ENOBUFS; ++ } ++ entry->proc_fops = &brc_fops; ++ entry->data = data; ++ } ++ return 0; ++} ++ ++static void kill_proc_dir(const char *dir_name, ++ struct proc_dir_entry *parent, ++ struct proc_dir_entry *dir) ++{ ++ if (!dir) ++ return; ++ for (;;) { ++ struct proc_dir_entry *e; ++ char *data; ++ char name[BRC_NAME_LEN_MAX + 1]; ++ ++ e = dir->subdir; ++ if (!e) ++ break; ++ ++ if (e->namelen >= sizeof name) { ++ /* Can't happen: we prevent adding names this long by ++ * limiting the BRC_GENL_A_PROC_NAME string to ++ * BRC_NAME_LEN_MAX bytes. */ ++ WARN_ON(1); ++ break; ++ } ++ strcpy(name, e->name); ++ ++ data = e->data; ++ e->data = NULL; ++ kfree(data); ++ ++ remove_proc_entry(name, dir); ++ } ++ remove_proc_entry(dir_name, parent); ++} ++ ++void brc_procfs_exit(void) ++{ ++ kill_proc_dir("vlan", proc_net, proc_vlan_dir); ++ kill_proc_dir("bonding", proc_net, proc_bonding_dir); ++} +diff -r 1a87bbd37bb1 net/vswitch/brc_procfs.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/net/vswitch/brc_procfs.h Tue Jun 30 13:50:53 2009 +0100 +@@ -0,0 +1,19 @@ ++/* ++ * Copyright (c) 2009 Nicira Networks. ++ * Distributed under the terms of the GNU GPL version 2. ++ * ++ * Significant portions of this file may be copied from parts of the Linux ++ * kernel, by Linus Torvalds and others. ++ */ ++ ++#ifndef BRC_PROCFS_H ++#define BRC_PROCFS_H 1 ++ ++struct sk_buff; ++struct genl_info; ++ ++void brc_procfs_exit(void); ++int brc_genl_set_proc(struct sk_buff *skb, struct genl_info *info); ++ ++#endif /* brc_procfs.h */ ++ +diff -r 1a87bbd37bb1 net/vswitch/brc_sysfs.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/net/vswitch/brc_sysfs.h Tue Jun 30 13:50:53 2009 +0100 +@@ -0,0 +1,24 @@ ++/* ++ * Copyright (c) 2009 Nicira Networks. ++ * Distributed under the terms of the GNU GPL version 2. ++ * ++ * Significant portions of this file may be copied from parts of the Linux ++ * kernel, by Linus Torvalds and others. ++ */ ++ ++#ifndef BRC_SYSFS_H ++#define BRC_SYSFS_H 1 ++ ++struct datapath; ++struct net_bridge_port; ++ ++/* brc_sysfs_dp.c */ ++int brc_sysfs_add_dp(struct datapath *dp); ++int brc_sysfs_del_dp(struct datapath *dp); ++ ++/* brc_sysfs_if.c */ ++int brc_sysfs_add_if(struct net_bridge_port *p); ++int brc_sysfs_del_if(struct net_bridge_port *p); ++ ++#endif /* brc_sysfs.h */ ++ +diff -r 1a87bbd37bb1 net/vswitch/brc_sysfs_dp.c +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/net/vswitch/brc_sysfs_dp.c Tue Jun 30 13:50:53 2009 +0100 +@@ -0,0 +1,528 @@ ++/* ++ * Copyright (c) 2009 Nicira Networks. ++ * Distributed under the terms of the GNU GPL version 2. ++ * ++ * Significant portions of this file may be copied from parts of the Linux ++ * kernel, by Linus Torvalds and others. ++ */ ++ ++#include ++ ++/* ++ * Sysfs attributes of bridge for Open vSwitch ++ * ++ * This has been shamelessly copied from the kernel sources. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "brc_sysfs.h" ++#include "datapath.h" ++#include "dp_dev.h" ++ ++#ifdef CONFIG_SYSFS ++#define to_dev(obj) container_of(obj, struct device, kobj) ++ ++/* Hack to attempt to build on more platforms. */ ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21) ++#define BRC_DEVICE_ATTR CLASS_DEVICE_ATTR ++#define DEVICE_PARAMS struct class_device *d ++#define DEVICE_ARGS d ++#define DEV_ATTR(NAME) class_device_attr_##NAME ++#else ++#define BRC_DEVICE_ATTR DEVICE_ATTR ++#define DEVICE_PARAMS struct device *d, struct device_attribute *attr ++#define DEVICE_ARGS d, attr ++#define DEV_ATTR(NAME) dev_attr_##NAME ++#endif ++ ++/* ++ * Common code for storing bridge parameters. ++ */ ++static ssize_t store_bridge_parm(DEVICE_PARAMS, ++ const char *buf, size_t len, ++ void (*set)(struct datapath *, unsigned long)) ++{ ++ struct datapath *dp = dp_dev_get_dp(to_net_dev(d)); ++ char *endp; ++ unsigned long val; ++ ++ if (!capable(CAP_NET_ADMIN)) ++ return -EPERM; ++ ++ val = simple_strtoul(buf, &endp, 0); ++ if (endp == buf) ++ return -EINVAL; ++ ++#if 0 ++ spin_lock_bh(&br->lock); ++ (*set)(br, val); ++ spin_unlock_bh(&br->lock); ++#else ++ /* xxx We use a default value of 0 for all fields. If the caller is ++ * xxx attempting to set the value to our default, just silently ++ * xxx ignore the request. ++ */ ++ if (val != 0) { ++ printk("%s: xxx writing dp parms not supported yet!\n", ++ dp_name(dp)); ++ } ++#endif ++ return len; ++} ++ ++ ++static ssize_t show_forward_delay(DEVICE_PARAMS, char *buf) ++{ ++#if 0 ++ struct datapath *dp = dp_dev_get_dp(to_net_dev(d)); ++ return sprintf(buf, "%lu\n", jiffies_to_clock_t(br->forward_delay)); ++#else ++ return sprintf(buf, "%d\n", 0); ++#endif ++} ++ ++static void set_forward_delay(struct datapath *dp, unsigned long val) ++{ ++#if 0 ++ unsigned long delay = clock_t_to_jiffies(val); ++ br->forward_delay = delay; ++ if (br_is_root_bridge(br)) ++ br->bridge_forward_delay = delay; ++#else ++ printk("%s: xxx attempt to set_forward_delay()\n", dp_name(dp)); ++#endif ++} ++ ++static ssize_t store_forward_delay(DEVICE_PARAMS, ++ const char *buf, size_t len) ++{ ++ return store_bridge_parm(DEVICE_ARGS, buf, len, set_forward_delay); ++} ++static BRC_DEVICE_ATTR(forward_delay, S_IRUGO | S_IWUSR, ++ show_forward_delay, store_forward_delay); ++ ++static ssize_t show_hello_time(DEVICE_PARAMS, char *buf) ++{ ++#if 0 ++ return sprintf(buf, "%lu\n", ++ jiffies_to_clock_t(to_bridge(d)->hello_time)); ++#else ++ return sprintf(buf, "%d\n", 0); ++#endif ++} ++ ++static void set_hello_time(struct datapath *dp, unsigned long val) ++{ ++#if 0 ++ unsigned long t = clock_t_to_jiffies(val); ++ br->hello_time = t; ++ if (br_is_root_bridge(br)) ++ br->bridge_hello_time = t; ++#else ++ printk("%s: xxx attempt to set_hello_time()\n", dp_name(dp)); ++#endif ++} ++ ++static ssize_t store_hello_time(DEVICE_PARAMS, ++ const char *buf, ++ size_t len) ++{ ++ return store_bridge_parm(DEVICE_ARGS, buf, len, set_hello_time); ++} ++static BRC_DEVICE_ATTR(hello_time, S_IRUGO | S_IWUSR, show_hello_time, ++ store_hello_time); ++ ++static ssize_t show_max_age(DEVICE_PARAMS, char *buf) ++{ ++#if 0 ++ return sprintf(buf, "%lu\n", ++ jiffies_to_clock_t(to_bridge(d)->max_age)); ++#else ++ return sprintf(buf, "%d\n", 0); ++#endif ++} ++ ++static void set_max_age(struct datapath *dp, unsigned long val) ++{ ++#if 0 ++ unsigned long t = clock_t_to_jiffies(val); ++ br->max_age = t; ++ if (br_is_root_bridge(br)) ++ br->bridge_max_age = t; ++#else ++ printk("%s: xxx attempt to set_max_age()\n", dp_name(dp)); ++#endif ++} ++ ++static ssize_t store_max_age(DEVICE_PARAMS, ++ const char *buf, size_t len) ++{ ++ return store_bridge_parm(DEVICE_ARGS, buf, len, set_max_age); ++} ++static BRC_DEVICE_ATTR(max_age, S_IRUGO | S_IWUSR, show_max_age, store_max_age); ++ ++static ssize_t show_ageing_time(DEVICE_PARAMS, char *buf) ++{ ++#if 0 ++ struct datapath *dp = dp_dev_get_dp(to_net_dev(d)); ++ return sprintf(buf, "%lu\n", jiffies_to_clock_t(br->ageing_time)); ++#else ++ return sprintf(buf, "%d\n", 0); ++#endif ++} ++ ++static void set_ageing_time(struct datapath *dp, unsigned long val) ++{ ++#if 0 ++ br->ageing_time = clock_t_to_jiffies(val); ++#else ++ printk("%s: xxx attempt to set_ageing_time()\n", dp_name(dp)); ++#endif ++} ++ ++static ssize_t store_ageing_time(DEVICE_PARAMS, ++ const char *buf, size_t len) ++{ ++ return store_bridge_parm(DEVICE_ARGS, buf, len, set_ageing_time); ++} ++static BRC_DEVICE_ATTR(ageing_time, S_IRUGO | S_IWUSR, show_ageing_time, ++ store_ageing_time); ++ ++static ssize_t show_stp_state(DEVICE_PARAMS, char *buf) ++{ ++#if 0 ++ struct datapath *dp = dp_dev_get_dp(to_net_dev(d)); ++ return sprintf(buf, "%d\n", br->stp_enabled); ++#else ++ return sprintf(buf, "%d\n", 0); ++#endif ++} ++ ++ ++static ssize_t store_stp_state(DEVICE_PARAMS, ++ const char *buf, ++ size_t len) ++{ ++ struct datapath *dp = dp_dev_get_dp(to_net_dev(d)); ++#if 0 ++ char *endp; ++ unsigned long val; ++ ++ if (!capable(CAP_NET_ADMIN)) ++ return -EPERM; ++ ++ val = simple_strtoul(buf, &endp, 0); ++ if (endp == buf) ++ return -EINVAL; ++ ++ rtnl_lock(); ++ br_stp_set_enabled(br, val); ++ rtnl_unlock(); ++#else ++ printk("%s: xxx attempt to set_stp_state()\n", dp_name(dp)); ++#endif ++ ++ return len; ++} ++static BRC_DEVICE_ATTR(stp_state, S_IRUGO | S_IWUSR, show_stp_state, ++ store_stp_state); ++ ++static ssize_t show_priority(DEVICE_PARAMS, char *buf) ++{ ++#if 0 ++ struct datapath *dp = dp_dev_get_dp(to_net_dev(d)); ++ return sprintf(buf, "%d\n", ++ (br->bridge_id.prio[0] << 8) | br->bridge_id.prio[1]); ++#else ++ return sprintf(buf, "%d\n", 0); ++#endif ++} ++ ++static void set_priority(struct datapath *dp, unsigned long val) ++{ ++#if 0 ++ br_stp_set_bridge_priority(br, (u16) val); ++#else ++ printk("%s: xxx attempt to set_priority()\n", dp_name(dp)); ++#endif ++} ++ ++static ssize_t store_priority(DEVICE_PARAMS, ++ const char *buf, size_t len) ++{ ++ return store_bridge_parm(DEVICE_ARGS, buf, len, set_priority); ++} ++static BRC_DEVICE_ATTR(priority, S_IRUGO | S_IWUSR, show_priority, store_priority); ++ ++static ssize_t show_root_id(DEVICE_PARAMS, char *buf) ++{ ++#if 0 ++ return br_show_bridge_id(buf, &to_bridge(d)->designated_root); ++#else ++ return sprintf(buf, "0000.010203040506\n"); ++#endif ++} ++static BRC_DEVICE_ATTR(root_id, S_IRUGO, show_root_id, NULL); ++ ++static ssize_t show_bridge_id(DEVICE_PARAMS, char *buf) ++{ ++ struct datapath *dp = dp_dev_get_dp(to_net_dev(d)); ++ const unsigned char *addr = dp->ports[ODPP_LOCAL]->dev->dev_addr; ++ ++ /* xxx Do we need a lock of some sort? */ ++ return sprintf(buf, "%.2x%.2x.%.2x%.2x%.2x%.2x%.2x%.2x\n", ++ 0, 0, addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]); ++} ++static BRC_DEVICE_ATTR(bridge_id, S_IRUGO, show_bridge_id, NULL); ++ ++static ssize_t show_root_port(DEVICE_PARAMS, char *buf) ++{ ++#if 0 ++ return sprintf(buf, "%d\n", to_bridge(d)->root_port); ++#else ++ return sprintf(buf, "%d\n", 0); ++#endif ++} ++static BRC_DEVICE_ATTR(root_port, S_IRUGO, show_root_port, NULL); ++ ++static ssize_t show_root_path_cost(DEVICE_PARAMS, char *buf) ++{ ++#if 0 ++ return sprintf(buf, "%d\n", to_bridge(d)->root_path_cost); ++#else ++ return sprintf(buf, "%d\n", 0); ++#endif ++} ++static BRC_DEVICE_ATTR(root_path_cost, S_IRUGO, show_root_path_cost, NULL); ++ ++static ssize_t show_topology_change(DEVICE_PARAMS, char *buf) ++{ ++#if 0 ++ return sprintf(buf, "%d\n", to_bridge(d)->topology_change); ++#else ++ return sprintf(buf, "%d\n", 0); ++#endif ++} ++static BRC_DEVICE_ATTR(topology_change, S_IRUGO, show_topology_change, NULL); ++ ++static ssize_t show_topology_change_detected(DEVICE_PARAMS, char *buf) ++{ ++#if 0 ++ struct datapath *dp = dp_dev_get_dp(to_net_dev(d)); ++ return sprintf(buf, "%d\n", br->topology_change_detected); ++#else ++ return sprintf(buf, "%d\n", 0); ++#endif ++} ++static BRC_DEVICE_ATTR(topology_change_detected, S_IRUGO, ++ show_topology_change_detected, NULL); ++ ++static ssize_t show_hello_timer(DEVICE_PARAMS, char *buf) ++{ ++#if 0 ++ struct datapath *dp = dp_dev_get_dp(to_net_dev(d)); ++ return sprintf(buf, "%ld\n", br_timer_value(&br->hello_timer)); ++#else ++ return sprintf(buf, "%d\n", 0); ++#endif ++} ++static BRC_DEVICE_ATTR(hello_timer, S_IRUGO, show_hello_timer, NULL); ++ ++static ssize_t show_tcn_timer(DEVICE_PARAMS, char *buf) ++{ ++#if 0 ++ struct datapath *dp = dp_dev_get_dp(to_net_dev(d)); ++ return sprintf(buf, "%ld\n", br_timer_value(&br->tcn_timer)); ++#else ++ return sprintf(buf, "%d\n", 0); ++#endif ++} ++static BRC_DEVICE_ATTR(tcn_timer, S_IRUGO, show_tcn_timer, NULL); ++ ++static ssize_t show_topology_change_timer(DEVICE_PARAMS, char *buf) ++{ ++#if 0 ++ struct datapath *dp = dp_dev_get_dp(to_net_dev(d)); ++ return sprintf(buf, "%ld\n", br_timer_value(&br->topology_change_timer)); ++#else ++ return sprintf(buf, "%d\n", 0); ++#endif ++} ++static BRC_DEVICE_ATTR(topology_change_timer, S_IRUGO, show_topology_change_timer, ++ NULL); ++ ++static ssize_t show_gc_timer(DEVICE_PARAMS, char *buf) ++{ ++#if 0 ++ struct datapath *dp = dp_dev_get_dp(to_net_dev(d)); ++ return sprintf(buf, "%ld\n", br_timer_value(&br->gc_timer)); ++#else ++ return sprintf(buf, "%d\n", 0); ++#endif ++} ++static BRC_DEVICE_ATTR(gc_timer, S_IRUGO, show_gc_timer, NULL); ++ ++static ssize_t show_group_addr(DEVICE_PARAMS, char *buf) ++{ ++#if 0 ++ struct datapath *dp = dp_dev_get_dp(to_net_dev(d)); ++ return sprintf(buf, "%x:%x:%x:%x:%x:%x\n", ++ br->group_addr[0], br->group_addr[1], ++ br->group_addr[2], br->group_addr[3], ++ br->group_addr[4], br->group_addr[5]); ++#else ++ return sprintf(buf, "00:01:02:03:04:05\n"); ++#endif ++} ++ ++static ssize_t store_group_addr(DEVICE_PARAMS, ++ const char *buf, size_t len) ++{ ++ struct datapath *dp = dp_dev_get_dp(to_net_dev(d)); ++#if 0 ++ unsigned new_addr[6]; ++ int i; ++ ++ if (!capable(CAP_NET_ADMIN)) ++ return -EPERM; ++ ++ if (sscanf(buf, "%x:%x:%x:%x:%x:%x", ++ &new_addr[0], &new_addr[1], &new_addr[2], ++ &new_addr[3], &new_addr[4], &new_addr[5]) != 6) ++ return -EINVAL; ++ ++ /* Must be 01:80:c2:00:00:0X */ ++ for (i = 0; i < 5; i++) ++ if (new_addr[i] != br_group_address[i]) ++ return -EINVAL; ++ ++ if (new_addr[5] & ~0xf) ++ return -EINVAL; ++ ++ if (new_addr[5] == 1 /* 802.3x Pause address */ ++ || new_addr[5] == 2 /* 802.3ad Slow protocols */ ++ || new_addr[5] == 3) /* 802.1X PAE address */ ++ return -EINVAL; ++ ++ spin_lock_bh(&br->lock); ++ for (i = 0; i < 6; i++) ++ br->group_addr[i] = new_addr[i]; ++ spin_unlock_bh(&br->lock); ++#else ++ printk("%s: xxx attempt to store_group_addr()\n", dp_name(dp)); ++#endif ++ return len; ++} ++ ++static BRC_DEVICE_ATTR(group_addr, S_IRUGO | S_IWUSR, ++ show_group_addr, store_group_addr); ++ ++static struct attribute *bridge_attrs[] = { ++ &DEV_ATTR(forward_delay).attr, ++ &DEV_ATTR(hello_time).attr, ++ &DEV_ATTR(max_age).attr, ++ &DEV_ATTR(ageing_time).attr, ++ &DEV_ATTR(stp_state).attr, ++ &DEV_ATTR(priority).attr, ++ &DEV_ATTR(bridge_id).attr, ++ &DEV_ATTR(root_id).attr, ++ &DEV_ATTR(root_path_cost).attr, ++ &DEV_ATTR(root_port).attr, ++ &DEV_ATTR(topology_change).attr, ++ &DEV_ATTR(topology_change_detected).attr, ++ &DEV_ATTR(hello_timer).attr, ++ &DEV_ATTR(tcn_timer).attr, ++ &DEV_ATTR(topology_change_timer).attr, ++ &DEV_ATTR(gc_timer).attr, ++ &DEV_ATTR(group_addr).attr, ++ NULL ++}; ++ ++static struct attribute_group bridge_group = { ++ .name = SYSFS_BRIDGE_ATTR, ++ .attrs = bridge_attrs, ++}; ++ ++/* ++ * Add entries in sysfs onto the existing network class device ++ * for the bridge. ++ * Adds a attribute group "bridge" containing tuning parameters. ++ * Sub directory to hold links to interfaces. ++ * ++ * Note: the ifobj exists only to be a subdirectory ++ * to hold links. The ifobj exists in the same data structure ++ * as its parent the bridge so reference counting works. ++ */ ++int brc_sysfs_add_dp(struct datapath *dp) ++{ ++ struct kobject *kobj = &dp->ports[ODPP_LOCAL]->dev->NETDEV_DEV_MEMBER.kobj; ++ int err; ++ ++ err = sysfs_create_group(kobj, &bridge_group); ++ if (err) { ++ pr_info("%s: can't create group %s/%s\n", ++ __func__, dp_name(dp), bridge_group.name); ++ goto out1; ++ } ++ ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25) ++ kobject_set_name(&dp->ifobj, SYSFS_BRIDGE_PORT_SUBDIR); ++ dp->ifobj.ktype = NULL; ++ dp->ifobj.kset = NULL; ++ dp->ifobj.parent = kobj; ++ ++ err = kobject_register(&dp->ifobj); ++ if (err) { ++ pr_info("%s: can't add kobject (directory) %s/%s\n", ++ __FUNCTION__, dp_name(dp), kobject_name(&dp->ifobj)); ++ goto out2; ++ } ++#else ++ dp->ifobj = kobject_create_and_add(SYSFS_BRIDGE_PORT_SUBDIR, kobj); ++ if (!dp->ifobj) { ++ pr_info("%s: can't add kobject (directory) %s/%s\n", ++ __func__, dp_name(dp), SYSFS_BRIDGE_PORT_SUBDIR); ++ goto out2; ++ } ++#endif ++ return 0; ++ ++ out2: ++ sysfs_remove_group(kobj, &bridge_group); ++ out1: ++ return err; ++} ++ ++int brc_sysfs_del_dp(struct datapath *dp) ++{ ++ struct kobject *kobj = &dp->ports[ODPP_LOCAL]->dev->NETDEV_DEV_MEMBER.kobj; ++ ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25) ++ kobject_unregister(&dp->ifobj); ++#else ++ kobject_put(dp->ifobj); ++#endif ++ sysfs_remove_group(kobj, &bridge_group); ++ ++ return 0; ++} ++#else /* !CONFIG_SYSFS */ ++int brc_sysfs_add_dp(struct datapath *dp) { return 0; } ++int brc_sysfs_del_dp(struct datapath *dp) { return 0; } ++int brc_sysfs_add_if(struct net_bridge_port *p) { return 0; } ++int brc_sysfs_del_if(struct net_bridge_port *p) ++{ ++ dev_put(p->dev); ++ kfree(p); ++ return 0; ++} ++#endif /* !CONFIG_SYSFS */ +diff -r 1a87bbd37bb1 net/vswitch/brc_sysfs_if.c +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/net/vswitch/brc_sysfs_if.c Tue Jun 30 13:50:53 2009 +0100 +@@ -0,0 +1,342 @@ ++/* ++ * Copyright (c) 2009 Nicira Networks. ++ * Distributed under the terms of the GNU GPL version 2. ++ * ++ * Significant portions of this file may be copied from parts of the Linux ++ * kernel, by Linus Torvalds and others. ++ */ ++ ++/* ++ * Sysfs attributes of bridge ports for Open vSwitch ++ * ++ * This has been shamelessly copied from the kernel sources. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include "brc_sysfs.h" ++#include "datapath.h" ++ ++#ifdef CONFIG_SYSFS ++ ++struct brport_attribute { ++ struct attribute attr; ++ ssize_t (*show)(struct net_bridge_port *, char *); ++ ssize_t (*store)(struct net_bridge_port *, unsigned long); ++}; ++ ++#define BRPORT_ATTR(_name,_mode,_show,_store) \ ++struct brport_attribute brport_attr_##_name = { \ ++ .attr = {.name = __stringify(_name), \ ++ .mode = _mode, \ ++ .owner = THIS_MODULE, }, \ ++ .show = _show, \ ++ .store = _store, \ ++}; ++ ++static ssize_t show_path_cost(struct net_bridge_port *p, char *buf) ++{ ++#if 0 ++ return sprintf(buf, "%d\n", p->path_cost); ++#else ++ return sprintf(buf, "%d\n", 0); ++#endif ++} ++static ssize_t store_path_cost(struct net_bridge_port *p, unsigned long v) ++{ ++#if 0 ++ br_stp_set_path_cost(p, v); ++#endif ++ return 0; ++} ++static BRPORT_ATTR(path_cost, S_IRUGO | S_IWUSR, ++ show_path_cost, store_path_cost); ++ ++static ssize_t show_priority(struct net_bridge_port *p, char *buf) ++{ ++#if 0 ++ return sprintf(buf, "%d\n", p->priority); ++#else ++ return sprintf(buf, "%d\n", 0); ++#endif ++} ++static ssize_t store_priority(struct net_bridge_port *p, unsigned long v) ++{ ++#if 0 ++ if (v >= (1<<(16-BR_PORT_BITS))) ++ return -ERANGE; ++ br_stp_set_port_priority(p, v); ++#endif ++ return 0; ++} ++static BRPORT_ATTR(priority, S_IRUGO | S_IWUSR, ++ show_priority, store_priority); ++ ++static ssize_t show_designated_root(struct net_bridge_port *p, char *buf) ++{ ++#if 0 ++ return br_show_bridge_id(buf, &p->designated_root); ++#else ++ return sprintf(buf, "0000.010203040506\n"); ++#endif ++} ++static BRPORT_ATTR(designated_root, S_IRUGO, show_designated_root, NULL); ++ ++static ssize_t show_designated_bridge(struct net_bridge_port *p, char *buf) ++{ ++#if 0 ++ return br_show_bridge_id(buf, &p->designated_bridge); ++#else ++ return sprintf(buf, "0000.060504030201\n"); ++#endif ++} ++static BRPORT_ATTR(designated_bridge, S_IRUGO, show_designated_bridge, NULL); ++ ++static ssize_t show_designated_port(struct net_bridge_port *p, char *buf) ++{ ++#if 0 ++ return sprintf(buf, "%d\n", p->designated_port); ++#else ++ return sprintf(buf, "%d\n", 0); ++#endif ++} ++static BRPORT_ATTR(designated_port, S_IRUGO, show_designated_port, NULL); ++ ++static ssize_t show_designated_cost(struct net_bridge_port *p, char *buf) ++{ ++#if 0 ++ return sprintf(buf, "%d\n", p->designated_cost); ++#else ++ return sprintf(buf, "%d\n", 0); ++#endif ++} ++static BRPORT_ATTR(designated_cost, S_IRUGO, show_designated_cost, NULL); ++ ++static ssize_t show_port_id(struct net_bridge_port *p, char *buf) ++{ ++#if 0 ++ return sprintf(buf, "0x%x\n", p->port_id); ++#else ++ return sprintf(buf, "0x%x\n", 0); ++#endif ++} ++static BRPORT_ATTR(port_id, S_IRUGO, show_port_id, NULL); ++ ++static ssize_t show_port_no(struct net_bridge_port *p, char *buf) ++{ ++ return sprintf(buf, "0x%x\n", p->port_no); ++} ++ ++static BRPORT_ATTR(port_no, S_IRUGO, show_port_no, NULL); ++ ++static ssize_t show_change_ack(struct net_bridge_port *p, char *buf) ++{ ++#if 0 ++ return sprintf(buf, "%d\n", p->topology_change_ack); ++#else ++ return sprintf(buf, "%d\n", 0); ++#endif ++} ++static BRPORT_ATTR(change_ack, S_IRUGO, show_change_ack, NULL); ++ ++static ssize_t show_config_pending(struct net_bridge_port *p, char *buf) ++{ ++#if 0 ++ return sprintf(buf, "%d\n", p->config_pending); ++#else ++ return sprintf(buf, "%d\n", 0); ++#endif ++} ++static BRPORT_ATTR(config_pending, S_IRUGO, show_config_pending, NULL); ++ ++static ssize_t show_port_state(struct net_bridge_port *p, char *buf) ++{ ++#if 0 ++ return sprintf(buf, "%d\n", p->state); ++#else ++ return sprintf(buf, "%d\n", 0); ++#endif ++} ++static BRPORT_ATTR(state, S_IRUGO, show_port_state, NULL); ++ ++static ssize_t show_message_age_timer(struct net_bridge_port *p, ++ char *buf) ++{ ++#if 0 ++ return sprintf(buf, "%ld\n", br_timer_value(&p->message_age_timer)); ++#else ++ return sprintf(buf, "%d\n", 0); ++#endif ++} ++static BRPORT_ATTR(message_age_timer, S_IRUGO, show_message_age_timer, NULL); ++ ++static ssize_t show_forward_delay_timer(struct net_bridge_port *p, ++ char *buf) ++{ ++#if 0 ++ return sprintf(buf, "%ld\n", br_timer_value(&p->forward_delay_timer)); ++#else ++ return sprintf(buf, "%d\n", 0); ++#endif ++} ++static BRPORT_ATTR(forward_delay_timer, S_IRUGO, show_forward_delay_timer, NULL); ++ ++static ssize_t show_hold_timer(struct net_bridge_port *p, ++ char *buf) ++{ ++#if 0 ++ return sprintf(buf, "%ld\n", br_timer_value(&p->hold_timer)); ++#else ++ return sprintf(buf, "%d\n", 0); ++#endif ++} ++static BRPORT_ATTR(hold_timer, S_IRUGO, show_hold_timer, NULL); ++ ++static struct brport_attribute *brport_attrs[] = { ++ &brport_attr_path_cost, ++ &brport_attr_priority, ++ &brport_attr_port_id, ++ &brport_attr_port_no, ++ &brport_attr_designated_root, ++ &brport_attr_designated_bridge, ++ &brport_attr_designated_port, ++ &brport_attr_designated_cost, ++ &brport_attr_state, ++ &brport_attr_change_ack, ++ &brport_attr_config_pending, ++ &brport_attr_message_age_timer, ++ &brport_attr_forward_delay_timer, ++ &brport_attr_hold_timer, ++ NULL ++}; ++ ++#define to_brport_attr(_at) container_of(_at, struct brport_attribute, attr) ++#define to_brport(obj) container_of(obj, struct net_bridge_port, kobj) ++ ++static ssize_t brport_show(struct kobject * kobj, ++ struct attribute * attr, char * buf) ++{ ++ struct brport_attribute * brport_attr = to_brport_attr(attr); ++ struct net_bridge_port * p = to_brport(kobj); ++ ++ return brport_attr->show(p, buf); ++} ++ ++static ssize_t brport_store(struct kobject * kobj, ++ struct attribute * attr, ++ const char * buf, size_t count) ++{ ++ struct net_bridge_port * p = to_brport(kobj); ++#if 0 ++ struct brport_attribute * brport_attr = to_brport_attr(attr); ++ char *endp; ++ unsigned long val; ++#endif ++ ssize_t ret = -EINVAL; ++ ++ if (!capable(CAP_NET_ADMIN)) ++ return -EPERM; ++ ++#if 0 ++ val = simple_strtoul(buf, &endp, 0); ++ if (endp != buf) { ++ rtnl_lock(); ++ if (p->dev && p->br && brport_attr->store) { ++ spin_lock_bh(&p->br->lock); ++ ret = brport_attr->store(p, val); ++ spin_unlock_bh(&p->br->lock); ++ if (ret == 0) ++ ret = count; ++ } ++ rtnl_unlock(); ++ } ++#else ++ printk("%s: xxx writing port parms not supported yet!\n", ++ dp_name(p->dp)); ++#endif ++ return ret; ++} ++ ++struct sysfs_ops brport_sysfs_ops = { ++ .show = brport_show, ++ .store = brport_store, ++}; ++ ++static void release_nbp(struct kobject *kobj) ++{ ++ struct net_bridge_port *p ++ = container_of(kobj, struct net_bridge_port, kobj); ++ kfree(p); ++} ++ ++struct kobj_type brport_ktype = { ++ .sysfs_ops = &brport_sysfs_ops, ++ .release = release_nbp ++}; ++ ++/* ++ * Add sysfs entries to ethernet device added to a bridge. ++ * Creates a brport subdirectory with bridge attributes. ++ * Puts symlink in bridge's brport subdirectory ++ */ ++int brc_sysfs_add_if(struct net_bridge_port *p) ++{ ++ struct datapath *dp = p->dp; ++ struct brport_attribute **a; ++ int err; ++ ++ err = kobject_init_and_add(&p->kobj, &brport_ktype, ++ &(p->dev->NETDEV_DEV_MEMBER.kobj), ++ SYSFS_BRIDGE_PORT_ATTR); ++ if (err) ++ goto err; ++ ++ err = sysfs_create_link(&p->kobj, ++ &dp->ports[ODPP_LOCAL]->dev->NETDEV_DEV_MEMBER.kobj, ++ SYSFS_BRIDGE_PORT_LINK); ++ if (err) ++ goto err_del; ++ ++ for (a = brport_attrs; *a; ++a) { ++ err = sysfs_create_file(&p->kobj, &((*a)->attr)); ++ if (err) ++ goto err_del; ++ } ++ ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25) ++ err = sysfs_create_link(&dp->ifobj, &p->kobj, p->dev->name); ++#else ++ err = sysfs_create_link(dp->ifobj, &p->kobj, p->dev->name); ++#endif ++ if (err) ++ goto err_del; ++ ++ kobject_uevent(&p->kobj, KOBJ_ADD); ++ ++ return err; ++ ++err_del: ++ kobject_del(&p->kobj); ++ kobject_put(&p->kobj); ++err: ++ return err; ++} ++ ++int brc_sysfs_del_if(struct net_bridge_port *p) ++{ ++ struct net_device *dev = p->dev; ++ ++ kobject_uevent(&p->kobj, KOBJ_REMOVE); ++ kobject_del(&p->kobj); ++ ++ dev_put(dev); ++ ++ kobject_put(&p->kobj); ++ ++ return 0; ++} ++#endif /* CONFIG_SYSFS */ +diff -r 1a87bbd37bb1 net/vswitch/brcompat.c +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/net/vswitch/brcompat.c Tue Jun 30 13:50:53 2009 +0100 +@@ -0,0 +1,521 @@ ++/* ++ * Copyright (c) 2009 Nicira Networks. ++ * Distributed under the terms of the GNU GPL version 2. ++ * ++ * Significant portions of this file may be copied from parts of the Linux ++ * kernel, by Linus Torvalds and others. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "compat.h" ++#include "openvswitch/brcompat-netlink.h" ++#include "brc_procfs.h" ++#include "brc_sysfs.h" ++#include "datapath.h" ++#include "dp_dev.h" ++ ++static struct genl_family brc_genl_family; ++static struct genl_multicast_group brc_mc_group; ++ ++/* Time to wait for ovs-vswitchd to respond to a datapath action, in ++ * jiffies. */ ++#define BRC_TIMEOUT (HZ * 5) ++ ++/* Mutex to serialize ovs-brcompatd callbacks. (Some callbacks naturally hold ++ * br_ioctl_mutex, others hold rtnl_lock, but we can't take the former ++ * ourselves and we don't want to hold the latter over a potentially long ++ * period of time.) */ ++static DEFINE_MUTEX(brc_serial); ++ ++/* Userspace communication. */ ++static DEFINE_SPINLOCK(brc_lock); /* Ensure atomic access to these vars. */ ++static DECLARE_COMPLETION(brc_done); /* Userspace signaled operation done? */ ++static int brc_err; /* Error code from userspace. */ ++static u32 brc_seq; /* Sequence number for current op. */ ++ ++static int brc_send_command(const char *bridge, const char *port, int op); ++ ++static int ++get_dp_ifindices(int *indices, int num) ++{ ++ int i, index = 0; ++ ++ rcu_read_lock(); ++ for (i=0; i < ODP_MAX && index < num; i++) { ++ struct datapath *dp = get_dp(i); ++ if (!dp) ++ continue; ++ indices[index++] = dp->ports[ODPP_LOCAL]->dev->ifindex; ++ } ++ rcu_read_unlock(); ++ ++ return index; ++} ++ ++static void ++get_port_ifindices(struct datapath *dp, int *ifindices, int num) ++{ ++ struct net_bridge_port *p; ++ ++ rcu_read_lock(); ++ list_for_each_entry_rcu (p, &dp->port_list, node) { ++ if (p->port_no < num) ++ ifindices[p->port_no] = p->dev->ifindex; ++ } ++ rcu_read_unlock(); ++} ++ ++static int brc_add_del_bridge(char __user *uname, int add) ++{ ++ char name[IFNAMSIZ]; ++ ++ if (copy_from_user(name, uname, IFNAMSIZ)) ++ return -EFAULT; ++ ++ name[IFNAMSIZ - 1] = 0; ++ return brc_send_command(name, NULL, ++ add ? BRC_GENL_C_DP_ADD : BRC_GENL_C_DP_DEL); ++} ++ ++static int brc_get_bridges(int __user *uindices, int n) ++{ ++ int *indices; ++ int ret; ++ ++ if (n >= 2048) ++ return -ENOMEM; ++ ++ indices = kcalloc(n, sizeof(int), GFP_KERNEL); ++ if (indices == NULL) ++ return -ENOMEM; ++ ++ n = get_dp_ifindices(indices, n); ++ ++ ret = copy_to_user(uindices, indices, n * sizeof(int)) ? -EFAULT : n; ++ ++ kfree(indices); ++ return ret; ++} ++ ++/* Legacy deviceless bridge ioctl's. Called with br_ioctl_mutex. */ ++static int ++old_deviceless(void __user *uarg) ++{ ++ unsigned long args[3]; ++ ++ if (copy_from_user(args, uarg, sizeof(args))) ++ return -EFAULT; ++ ++ switch (args[0]) { ++ case BRCTL_GET_BRIDGES: ++ return brc_get_bridges((int __user *)args[1], args[2]); ++ ++ case BRCTL_ADD_BRIDGE: ++ return brc_add_del_bridge((void __user *)args[1], 1); ++ case BRCTL_DEL_BRIDGE: ++ return brc_add_del_bridge((void __user *)args[1], 0); ++ } ++ ++ return -EOPNOTSUPP; ++} ++ ++/* Called with the br_ioctl_mutex. */ ++static int ++#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,23) ++brc_ioctl_deviceless_stub(unsigned int cmd, void __user *uarg) ++#else ++brc_ioctl_deviceless_stub(struct net *net, unsigned int cmd, void __user *uarg) ++#endif ++{ ++ switch (cmd) { ++ case SIOCGIFBR: ++ case SIOCSIFBR: ++ return old_deviceless(uarg); ++ ++ case SIOCBRADDBR: ++ return brc_add_del_bridge(uarg, 1); ++ case SIOCBRDELBR: ++ return brc_add_del_bridge(uarg, 0); ++ } ++ ++ return -EOPNOTSUPP; ++} ++ ++static int ++brc_add_del_port(struct net_device *dev, int port_ifindex, int add) ++{ ++ struct net_device *port; ++ char dev_name[IFNAMSIZ], port_name[IFNAMSIZ]; ++ int err; ++ ++ port = __dev_get_by_index(&init_net, port_ifindex); ++ if (!port) ++ return -EINVAL; ++ ++ /* Save name of dev and port because there's a race between the ++ * rtnl_unlock() and the brc_send_command(). */ ++ strcpy(dev_name, dev->name); ++ strcpy(port_name, port->name); ++ ++ rtnl_unlock(); ++ err = brc_send_command(dev_name, port_name, ++ add ? BRC_GENL_C_PORT_ADD : BRC_GENL_C_PORT_DEL); ++ rtnl_lock(); ++ ++ return err; ++} ++ ++static int ++brc_get_bridge_info(struct net_device *dev, struct __bridge_info __user *ub) ++{ ++ struct __bridge_info b; ++ u64 id = 0; ++ int i; ++ ++ memset(&b, 0, sizeof(struct __bridge_info)); ++ ++ for (i=0; idev_addr[i] << (8*(ETH_ALEN-1 - i)); ++ b.bridge_id = cpu_to_be64(id); ++ b.stp_enabled = 0; ++ ++ if (copy_to_user(ub, &b, sizeof(struct __bridge_info))) ++ return -EFAULT; ++ ++ return 0; ++} ++ ++static int ++brc_get_port_list(struct net_device *dev, int __user *uindices, int num) ++{ ++ struct dp_dev *dp_dev = netdev_priv(dev); ++ struct datapath *dp = dp_dev->dp; ++ int *indices; ++ ++ if (num < 0) ++ return -EINVAL; ++ if (num == 0) ++ num = 256; ++ if (num > DP_MAX_PORTS) ++ num = DP_MAX_PORTS; ++ ++ indices = kcalloc(num, sizeof(int), GFP_KERNEL); ++ if (indices == NULL) ++ return -ENOMEM; ++ ++ get_port_ifindices(dp, indices, num); ++ if (copy_to_user(uindices, indices, num * sizeof(int))) ++ num = -EFAULT; ++ kfree(indices); ++ return num; ++} ++ ++/* Legacy ioctl's through SIOCDEVPRIVATE. Called with rtnl_lock. */ ++static int ++old_dev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) ++{ ++ unsigned long args[4]; ++ ++ if (copy_from_user(args, rq->ifr_data, sizeof(args))) ++ return -EFAULT; ++ ++ switch (args[0]) { ++ case BRCTL_ADD_IF: ++ return brc_add_del_port(dev, args[1], 1); ++ case BRCTL_DEL_IF: ++ return brc_add_del_port(dev, args[1], 0); ++ ++ case BRCTL_GET_BRIDGE_INFO: ++ return brc_get_bridge_info(dev, (struct __bridge_info __user *)args[1]); ++ ++ case BRCTL_GET_PORT_LIST: ++ return brc_get_port_list(dev, (int __user *)args[1], args[2]); ++ } ++ ++ return -EOPNOTSUPP; ++} ++ ++/* Called with the rtnl_lock. */ ++static int ++brc_dev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) ++{ ++ int err; ++ ++ switch (cmd) { ++ case SIOCDEVPRIVATE: ++ err = old_dev_ioctl(dev, rq, cmd); ++ break; ++ ++ case SIOCBRADDIF: ++ return brc_add_del_port(dev, rq->ifr_ifindex, 1); ++ case SIOCBRDELIF: ++ return brc_add_del_port(dev, rq->ifr_ifindex, 0); ++ ++ default: ++ err = -EOPNOTSUPP; ++ break; ++ } ++ ++ return err; ++} ++ ++ ++static struct genl_family brc_genl_family = { ++ .id = GENL_ID_GENERATE, ++ .hdrsize = 0, ++ .name = BRC_GENL_FAMILY_NAME, ++ .version = 1, ++ .maxattr = BRC_GENL_A_MAX, ++}; ++ ++static int brc_genl_query(struct sk_buff *skb, struct genl_info *info) ++{ ++ int err = -EINVAL; ++ struct sk_buff *ans_skb; ++ void *data; ++ ++ ans_skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); ++ if (!ans_skb) ++ return -ENOMEM; ++ ++ data = genlmsg_put_reply(ans_skb, info, &brc_genl_family, ++ 0, BRC_GENL_C_QUERY_MC); ++ if (data == NULL) { ++ err = -ENOMEM; ++ goto err; ++ } ++ NLA_PUT_U32(ans_skb, BRC_GENL_A_MC_GROUP, brc_mc_group.id); ++ ++ genlmsg_end(ans_skb, data); ++ return genlmsg_reply(ans_skb, info); ++ ++err: ++nla_put_failure: ++ kfree_skb(ans_skb); ++ return err; ++} ++ ++static struct genl_ops brc_genl_ops_query_dp = { ++ .cmd = BRC_GENL_C_QUERY_MC, ++ .flags = GENL_ADMIN_PERM, /* Requires CAP_NET_ADMIN privelege. */ ++ .policy = NULL, ++ .doit = brc_genl_query, ++ .dumpit = NULL ++}; ++ ++/* Attribute policy: what each attribute may contain. */ ++static struct nla_policy brc_genl_policy[BRC_GENL_A_MAX + 1] = { ++ [BRC_GENL_A_ERR_CODE] = { .type = NLA_U32 }, ++ [BRC_GENL_A_PROC_DIR] = { .type = NLA_NUL_STRING }, ++ [BRC_GENL_A_PROC_NAME] = { .type = NLA_NUL_STRING }, ++ [BRC_GENL_A_PROC_DATA] = { .type = NLA_NUL_STRING }, ++}; ++ ++static int ++brc_genl_dp_result(struct sk_buff *skb, struct genl_info *info) ++{ ++ unsigned long int flags; ++ int err; ++ ++ if (!info->attrs[BRC_GENL_A_ERR_CODE]) ++ return -EINVAL; ++ ++ spin_lock_irqsave(&brc_lock, flags); ++ if (brc_seq == info->snd_seq) { ++ brc_err = nla_get_u32(info->attrs[BRC_GENL_A_ERR_CODE]); ++ complete(&brc_done); ++ err = 0; ++ } else { ++ err = -ESTALE; ++ } ++ spin_unlock_irqrestore(&brc_lock, flags); ++ ++ return err; ++} ++ ++static struct genl_ops brc_genl_ops_dp_result = { ++ .cmd = BRC_GENL_C_DP_RESULT, ++ .flags = GENL_ADMIN_PERM, /* Requires CAP_NET_ADMIN privelege. */ ++ .policy = brc_genl_policy, ++ .doit = brc_genl_dp_result, ++ .dumpit = NULL ++}; ++ ++static struct genl_ops brc_genl_ops_set_proc = { ++ .cmd = BRC_GENL_C_SET_PROC, ++ .flags = GENL_ADMIN_PERM, /* Requires CAP_NET_ADMIN privelege. */ ++ .policy = brc_genl_policy, ++ .doit = brc_genl_set_proc, ++ .dumpit = NULL ++}; ++ ++static int brc_send_command(const char *bridge, const char *port, int op) ++{ ++ unsigned long int flags; ++ struct sk_buff *skb; ++ void *data; ++ int error; ++ ++ mutex_lock(&brc_serial); ++ ++ /* Increment sequence number first, so that we ignore any replies ++ * to stale requests. */ ++ spin_lock_irqsave(&brc_lock, flags); ++ brc_seq++; ++ INIT_COMPLETION(brc_done); ++ spin_unlock_irqrestore(&brc_lock, flags); ++ ++ /* Compose message. */ ++ skb = genlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL); ++ error = -ENOMEM; ++ if (skb == NULL) ++ goto exit_unlock; ++ data = genlmsg_put(skb, 0, brc_seq, &brc_genl_family, 0, op); ++ ++ NLA_PUT_STRING(skb, BRC_GENL_A_DP_NAME, bridge); ++ if (port) ++ NLA_PUT_STRING(skb, BRC_GENL_A_PORT_NAME, port); ++ ++ genlmsg_end(skb, data); ++ ++ /* Send message. */ ++ error = genlmsg_multicast(skb, 0, brc_mc_group.id, GFP_KERNEL); ++ if (error < 0) ++ goto exit_unlock; ++ ++ /* Wait for reply. */ ++ error = -ETIMEDOUT; ++ if (!wait_for_completion_timeout(&brc_done, BRC_TIMEOUT)) ++ goto exit_unlock; ++ ++ error = -brc_err; ++ goto exit_unlock; ++ ++nla_put_failure: ++ kfree_skb(skb); ++exit_unlock: ++ mutex_unlock(&brc_serial); ++ return error; ++} ++ ++int brc_add_dp(struct datapath *dp) ++{ ++ if (!try_module_get(THIS_MODULE)) ++ return -ENODEV; ++ brc_sysfs_add_dp(dp); ++ ++ return 0; ++} ++ ++int brc_del_dp(struct datapath *dp) ++{ ++ brc_sysfs_del_dp(dp); ++ module_put(THIS_MODULE); ++ ++ return 0; ++} ++ ++static int ++__init brc_init(void) ++{ ++ int i; ++ int err; ++ ++ printk("Open vSwitch Bridge Compatibility, built "__DATE__" "__TIME__"\n"); ++ ++ rcu_read_lock(); ++ for (i=0; i ++ ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) ++ ++#include "compat26.h" ++ ++#else ++ ++#include "compat24.h" ++ ++#endif ++ ++ ++#endif /* compat.h */ +diff -r 1a87bbd37bb1 net/vswitch/datapath.c +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/net/vswitch/datapath.c Tue Jun 30 13:50:53 2009 +0100 +@@ -0,0 +1,1619 @@ ++/* ++ * Copyright (c) 2007, 2008, 2009 Nicira Networks. ++ * Distributed under the terms of the GNU GPL version 2. ++ * ++ * Significant portions of this file may be copied from parts of the Linux ++ * kernel, by Linus Torvalds and others. ++ */ ++ ++/* Functions for managing the dp interface/device. */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "openvswitch/datapath-protocol.h" ++#include "datapath.h" ++#include "actions.h" ++#include "dp_dev.h" ++#include "flow.h" ++ ++#include "compat.h" ++ ++ ++int (*dp_ioctl_hook)(struct net_device *dev, struct ifreq *rq, int cmd); ++EXPORT_SYMBOL(dp_ioctl_hook); ++ ++int (*dp_add_dp_hook)(struct datapath *dp); ++EXPORT_SYMBOL(dp_add_dp_hook); ++ ++int (*dp_del_dp_hook)(struct datapath *dp); ++EXPORT_SYMBOL(dp_del_dp_hook); ++ ++int (*dp_add_if_hook)(struct net_bridge_port *p); ++EXPORT_SYMBOL(dp_add_if_hook); ++ ++int (*dp_del_if_hook)(struct net_bridge_port *p); ++EXPORT_SYMBOL(dp_del_if_hook); ++ ++/* Datapaths. Protected on the read side by rcu_read_lock, on the write side ++ * by dp_mutex. dp_mutex is almost completely redundant with genl_mutex ++ * maintained by the Generic Netlink code, but the timeout path needs mutual ++ * exclusion too. ++ * ++ * dp_mutex nests inside the RTNL lock: if you need both you must take the RTNL ++ * lock first. ++ * ++ * It is safe to access the datapath and net_bridge_port structures with just ++ * dp_mutex. ++ */ ++static struct datapath *dps[ODP_MAX]; ++static DEFINE_MUTEX(dp_mutex); ++ ++/* Number of milliseconds between runs of the maintenance thread. */ ++#define MAINT_SLEEP_MSECS 1000 ++ ++static int new_nbp(struct datapath *, struct net_device *, int port_no); ++ ++/* Must be called with rcu_read_lock or dp_mutex. */ ++struct datapath *get_dp(int dp_idx) ++{ ++ if (dp_idx < 0 || dp_idx >= ODP_MAX) ++ return NULL; ++ return rcu_dereference(dps[dp_idx]); ++} ++EXPORT_SYMBOL_GPL(get_dp); ++ ++struct datapath *get_dp_locked(int dp_idx) ++{ ++ struct datapath *dp; ++ ++ mutex_lock(&dp_mutex); ++ dp = get_dp(dp_idx); ++ if (dp) ++ mutex_lock(&dp->mutex); ++ mutex_unlock(&dp_mutex); ++ return dp; ++} ++ ++static inline size_t br_nlmsg_size(void) ++{ ++ return NLMSG_ALIGN(sizeof(struct ifinfomsg)) ++ + nla_total_size(IFNAMSIZ) /* IFLA_IFNAME */ ++ + nla_total_size(MAX_ADDR_LEN) /* IFLA_ADDRESS */ ++ + nla_total_size(4) /* IFLA_MASTER */ ++ + nla_total_size(4) /* IFLA_MTU */ ++ + nla_total_size(4) /* IFLA_LINK */ ++ + nla_total_size(1); /* IFLA_OPERSTATE */ ++} ++ ++static int dp_fill_ifinfo(struct sk_buff *skb, ++ const struct net_bridge_port *port, ++ int event, unsigned int flags) ++{ ++ const struct datapath *dp = port->dp; ++ const struct net_device *dev = port->dev; ++ struct ifinfomsg *hdr; ++ struct nlmsghdr *nlh; ++ ++ nlh = nlmsg_put(skb, 0, 0, event, sizeof(*hdr), flags); ++ if (nlh == NULL) ++ return -EMSGSIZE; ++ ++ hdr = nlmsg_data(nlh); ++ hdr->ifi_family = AF_BRIDGE; ++ hdr->__ifi_pad = 0; ++ hdr->ifi_type = dev->type; ++ hdr->ifi_index = dev->ifindex; ++ hdr->ifi_flags = dev_get_flags(dev); ++ hdr->ifi_change = 0; ++ ++ NLA_PUT_STRING(skb, IFLA_IFNAME, dev->name); ++ NLA_PUT_U32(skb, IFLA_MASTER, dp->ports[ODPP_LOCAL]->dev->ifindex); ++ NLA_PUT_U32(skb, IFLA_MTU, dev->mtu); ++#ifdef IFLA_OPERSTATE ++ NLA_PUT_U8(skb, IFLA_OPERSTATE, ++ netif_running(dev) ? dev->operstate : IF_OPER_DOWN); ++#endif ++ ++ if (dev->addr_len) ++ NLA_PUT(skb, IFLA_ADDRESS, dev->addr_len, dev->dev_addr); ++ ++ if (dev->ifindex != dev->iflink) ++ NLA_PUT_U32(skb, IFLA_LINK, dev->iflink); ++ ++ return nlmsg_end(skb, nlh); ++ ++nla_put_failure: ++ nlmsg_cancel(skb, nlh); ++ return -EMSGSIZE; ++} ++ ++static void dp_ifinfo_notify(int event, struct net_bridge_port *port) ++{ ++ struct net *net = dev_net(port->dev); ++ struct sk_buff *skb; ++ int err = -ENOBUFS; ++ ++ skb = nlmsg_new(br_nlmsg_size(), GFP_KERNEL); ++ if (skb == NULL) ++ goto errout; ++ ++ err = dp_fill_ifinfo(skb, port, event, 0); ++ if (err < 0) { ++ /* -EMSGSIZE implies BUG in br_nlmsg_size() */ ++ WARN_ON(err == -EMSGSIZE); ++ kfree_skb(skb); ++ goto errout; ++ } ++ err = rtnl_notify(skb, net, 0, RTNLGRP_LINK, NULL, GFP_KERNEL); ++errout: ++ if (err < 0) ++ rtnl_set_sk_err(net, RTNLGRP_LINK, err); ++} ++ ++static int create_dp(int dp_idx, const char __user *devnamep) ++{ ++ struct net_device *dp_dev; ++ char devname[IFNAMSIZ]; ++ struct datapath *dp; ++ int err; ++ int i; ++ ++ if (devnamep) { ++ err = -EFAULT; ++ if (strncpy_from_user(devname, devnamep, IFNAMSIZ - 1) < 0) ++ goto err; ++ devname[IFNAMSIZ - 1] = '\0'; ++ } else { ++ snprintf(devname, sizeof devname, "of%d", dp_idx); ++ } ++ ++ rtnl_lock(); ++ mutex_lock(&dp_mutex); ++ err = -ENODEV; ++ if (!try_module_get(THIS_MODULE)) ++ goto err_unlock; ++ ++ /* Exit early if a datapath with that number already exists. ++ * (We don't use -EEXIST because that's ambiguous with 'devname' ++ * conflicting with an existing network device name.) */ ++ err = -EBUSY; ++ if (get_dp(dp_idx)) ++ goto err_put_module; ++ ++ err = -ENOMEM; ++ dp = kzalloc(sizeof *dp, GFP_KERNEL); ++ if (dp == NULL) ++ goto err_put_module; ++ ++ mutex_init(&dp->mutex); ++ dp->dp_idx = dp_idx; ++ for (i = 0; i < DP_N_QUEUES; i++) ++ skb_queue_head_init(&dp->queues[i]); ++ init_waitqueue_head(&dp->waitqueue); ++ ++ /* Setup our datapath device */ ++ dp_dev = dp_dev_create(dp, devname, ODPP_LOCAL); ++ err = PTR_ERR(dp_dev); ++ if (IS_ERR(dp_dev)) ++ goto err_free_dp; ++ ++ err = -ENOMEM; ++ rcu_assign_pointer(dp->table, dp_table_create(DP_L1_SIZE)); ++ if (!dp->table) ++ goto err_destroy_dp_dev; ++ INIT_LIST_HEAD(&dp->port_list); ++ ++ err = new_nbp(dp, dp_dev, ODPP_LOCAL); ++ if (err) ++ goto err_destroy_table; ++ ++ dp->drop_frags = 0; ++ dp->stats_percpu = alloc_percpu(struct dp_stats_percpu); ++ if (!dp->stats_percpu) ++ goto err_destroy_local_port; ++ ++ rcu_assign_pointer(dps[dp_idx], dp); ++ mutex_unlock(&dp_mutex); ++ rtnl_unlock(); ++ ++ if (dp_add_dp_hook) ++ dp_add_dp_hook(dp); ++ ++ return 0; ++ ++err_destroy_local_port: ++ dp_del_port(dp->ports[ODPP_LOCAL], NULL); ++err_destroy_table: ++ dp_table_destroy(dp->table, 0); ++err_destroy_dp_dev: ++ dp_dev_destroy(dp_dev); ++err_free_dp: ++ kfree(dp); ++err_put_module: ++ module_put(THIS_MODULE); ++err_unlock: ++ mutex_unlock(&dp_mutex); ++ rtnl_unlock(); ++err: ++ return err; ++} ++ ++static void do_destroy_dp(struct datapath *dp, struct list_head *dp_devs) ++{ ++ struct net_bridge_port *p, *n; ++ int i; ++ ++ if (dp_del_dp_hook) ++ dp_del_dp_hook(dp); ++ ++ /* Drop references to DP. */ ++ list_for_each_entry_safe (p, n, &dp->port_list, node) ++ dp_del_port(p, dp_devs); ++ ++ rcu_assign_pointer(dps[dp->dp_idx], NULL); ++ synchronize_rcu(); ++ ++ /* Wait until no longer in use, then destroy it. */ ++ synchronize_rcu(); ++ dp_table_destroy(dp->table, 1); ++ for (i = 0; i < DP_N_QUEUES; i++) ++ skb_queue_purge(&dp->queues[i]); ++ for (i = 0; i < DP_MAX_GROUPS; i++) ++ kfree(dp->groups[i]); ++ free_percpu(dp->stats_percpu); ++ kfree(dp); ++ module_put(THIS_MODULE); ++} ++ ++static int destroy_dp(int dp_idx) ++{ ++ struct dp_dev *dp_dev, *next; ++ struct datapath *dp; ++ LIST_HEAD(dp_devs); ++ int err; ++ ++ rtnl_lock(); ++ mutex_lock(&dp_mutex); ++ dp = get_dp(dp_idx); ++ err = -ENODEV; ++ if (!dp) ++ goto err_unlock; ++ ++ do_destroy_dp(dp, &dp_devs); ++ err = 0; ++ ++err_unlock: ++ mutex_unlock(&dp_mutex); ++ rtnl_unlock(); ++ list_for_each_entry_safe (dp_dev, next, &dp_devs, list) ++ free_netdev(dp_dev->dev); ++ return err; ++} ++ ++/* Called with RTNL lock and dp_mutex. */ ++static int new_nbp(struct datapath *dp, struct net_device *dev, int port_no) ++{ ++ struct net_bridge_port *p; ++ ++ if (dev->br_port != NULL) ++ return -EBUSY; ++ ++ p = kzalloc(sizeof(*p), GFP_KERNEL); ++ if (!p) ++ return -ENOMEM; ++ ++ dev_set_promiscuity(dev, 1); ++ dev_hold(dev); ++ p->port_no = port_no; ++ p->dp = dp; ++ p->dev = dev; ++ if (!is_dp_dev(dev)) ++ rcu_assign_pointer(dev->br_port, p); ++ else { ++ /* It would make sense to assign dev->br_port here too, but ++ * that causes packets received on internal ports to get caught ++ * in dp_frame_hook(). In turn dp_frame_hook() can reject them ++ * back to network stack, but that's a waste of time. */ ++ } ++ rcu_assign_pointer(dp->ports[port_no], p); ++ list_add_rcu(&p->node, &dp->port_list); ++ dp->n_ports++; ++ ++ dp_ifinfo_notify(RTM_NEWLINK, p); ++ ++ return 0; ++} ++ ++static int add_port(int dp_idx, struct odp_port __user *portp) ++{ ++ struct net_device *dev; ++ struct datapath *dp; ++ struct odp_port port; ++ int port_no; ++ int err; ++ ++ err = -EFAULT; ++ if (copy_from_user(&port, portp, sizeof port)) ++ goto out; ++ port.devname[IFNAMSIZ - 1] = '\0'; ++ port_no = port.port; ++ ++ err = -EINVAL; ++ if (port_no < 0 || port_no >= DP_MAX_PORTS) ++ goto out; ++ ++ rtnl_lock(); ++ dp = get_dp_locked(dp_idx); ++ err = -ENODEV; ++ if (!dp) ++ goto out_unlock_rtnl; ++ ++ err = -EEXIST; ++ if (dp->ports[port_no]) ++ goto out_unlock_dp; ++ ++ if (!(port.flags & ODP_PORT_INTERNAL)) { ++ err = -ENODEV; ++ dev = dev_get_by_name(&init_net, port.devname); ++ if (!dev) ++ goto out_unlock_dp; ++ ++ err = -EINVAL; ++ if (dev->flags & IFF_LOOPBACK || dev->type != ARPHRD_ETHER || ++ is_dp_dev(dev)) ++ goto out_put; ++ } else { ++ dev = dp_dev_create(dp, port.devname, port_no); ++ err = PTR_ERR(dev); ++ if (IS_ERR(dev)) ++ goto out_unlock_dp; ++ dev_hold(dev); ++ } ++ ++ err = new_nbp(dp, dev, port_no); ++ if (err) ++ goto out_put; ++ ++ if (dp_add_if_hook) ++ dp_add_if_hook(dp->ports[port_no]); ++ ++out_put: ++ dev_put(dev); ++out_unlock_dp: ++ mutex_unlock(&dp->mutex); ++out_unlock_rtnl: ++ rtnl_unlock(); ++out: ++ return err; ++} ++ ++int dp_del_port(struct net_bridge_port *p, struct list_head *dp_devs) ++{ ++ ASSERT_RTNL(); ++ ++ if (p->port_no != ODPP_LOCAL && dp_del_if_hook) { ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25) ++ sysfs_remove_link(&p->dp->ifobj, p->dev->name); ++#else ++ sysfs_remove_link(p->dp->ifobj, p->dev->name); ++#endif ++ } ++ dp_ifinfo_notify(RTM_DELLINK, p); ++ ++ p->dp->n_ports--; ++ ++ if (is_dp_dev(p->dev)) { ++ /* Make sure that no packets arrive from now on, since ++ * dp_dev_xmit() will try to find itself through ++ * p->dp->ports[], and we're about to set that to null. */ ++ netif_tx_disable(p->dev); ++ } ++ ++ /* First drop references to device. */ ++ dev_set_promiscuity(p->dev, -1); ++ list_del_rcu(&p->node); ++ rcu_assign_pointer(p->dp->ports[p->port_no], NULL); ++ rcu_assign_pointer(p->dev->br_port, NULL); ++ ++ /* Then wait until no one is still using it, and destroy it. */ ++ synchronize_rcu(); ++ ++ if (is_dp_dev(p->dev)) { ++ dp_dev_destroy(p->dev); ++ if (dp_devs) { ++ struct dp_dev *dp_dev = dp_dev_priv(p->dev); ++ list_add(&dp_dev->list, dp_devs); ++ } ++ } ++ if (p->port_no != ODPP_LOCAL && dp_del_if_hook) { ++ dp_del_if_hook(p); ++ } else { ++ dev_put(p->dev); ++ kfree(p); ++ } ++ ++ return 0; ++} ++ ++static int del_port(int dp_idx, int port_no) ++{ ++ struct dp_dev *dp_dev, *next; ++ struct net_bridge_port *p; ++ struct datapath *dp; ++ LIST_HEAD(dp_devs); ++ int err; ++ ++ err = -EINVAL; ++ if (port_no < 0 || port_no >= DP_MAX_PORTS || port_no == ODPP_LOCAL) ++ goto out; ++ ++ rtnl_lock(); ++ dp = get_dp_locked(dp_idx); ++ err = -ENODEV; ++ if (!dp) ++ goto out_unlock_rtnl; ++ ++ p = dp->ports[port_no]; ++ err = -ENOENT; ++ if (!p) ++ goto out_unlock_dp; ++ ++ err = dp_del_port(p, &dp_devs); ++ ++out_unlock_dp: ++ mutex_unlock(&dp->mutex); ++out_unlock_rtnl: ++ rtnl_unlock(); ++out: ++ list_for_each_entry_safe (dp_dev, next, &dp_devs, list) ++ free_netdev(dp_dev->dev); ++ return err; ++} ++ ++/* Must be called with rcu_read_lock. */ ++static void ++do_port_input(struct net_bridge_port *p, struct sk_buff *skb) ++{ ++ /* Make our own copy of the packet. Otherwise we will mangle the ++ * packet for anyone who came before us (e.g. tcpdump via AF_PACKET). ++ * (No one comes after us, since we tell handle_bridge() that we took ++ * the packet.) */ ++ skb = skb_share_check(skb, GFP_ATOMIC); ++ if (!skb) ++ return; ++ ++ /* Push the Ethernet header back on. */ ++ skb_push(skb, ETH_HLEN); ++ skb_reset_mac_header(skb); ++ dp_process_received_packet(skb, p); ++} ++ ++/* Must be called with rcu_read_lock and with bottom-halves disabled. */ ++void dp_process_received_packet(struct sk_buff *skb, struct net_bridge_port *p) ++{ ++ struct datapath *dp = p->dp; ++ struct dp_stats_percpu *stats; ++ struct odp_flow_key key; ++ struct sw_flow *flow; ++ ++ WARN_ON_ONCE(skb_shared(skb)); ++ WARN_ON_ONCE(skb->destructor); ++ ++ /* BHs are off so we don't have to use get_cpu()/put_cpu() here. */ ++ stats = percpu_ptr(dp->stats_percpu, smp_processor_id()); ++ ++ if (flow_extract(skb, p ? p->port_no : ODPP_NONE, &key)) { ++ if (dp->drop_frags) { ++ kfree_skb(skb); ++ stats->n_frags++; ++ return; ++ } ++ } ++ ++ flow = dp_table_lookup(rcu_dereference(dp->table), &key); ++ if (flow) { ++ struct sw_flow_actions *acts = rcu_dereference(flow->sf_acts); ++ flow_used(flow, skb); ++ execute_actions(dp, skb, &key, acts->actions, acts->n_actions, ++ GFP_ATOMIC); ++ stats->n_hit++; ++ } else { ++ stats->n_missed++; ++ dp_output_control(dp, skb, _ODPL_MISS_NR, 0); ++ } ++} ++ ++/* ++ * Used as br_handle_frame_hook. (Cannot run bridge at the same time, even on ++ * different set of devices!) ++ */ ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) ++/* Called with rcu_read_lock and bottom-halves disabled. */ ++static struct sk_buff *dp_frame_hook(struct net_bridge_port *p, ++ struct sk_buff *skb) ++{ ++ do_port_input(p, skb); ++ return NULL; ++} ++#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) ++/* Called with rcu_read_lock and bottom-halves disabled. */ ++static int dp_frame_hook(struct net_bridge_port *p, struct sk_buff **pskb) ++{ ++ do_port_input(p, *pskb); ++ return 1; ++} ++#else ++#error ++#endif ++ ++#ifdef CONFIG_XEN ++#if LINUX_VERSION_CODE == KERNEL_VERSION(2,6,18) ++/* This code is copied verbatim from net/dev/core.c in Xen's ++ * linux-2.6.18-92.1.10.el5.xs5.0.0.394.644. We can't call those functions ++ * directly because they aren't exported. */ ++static int skb_pull_up_to(struct sk_buff *skb, void *ptr) ++{ ++ if (ptr < (void *)skb->tail) ++ return 1; ++ if (__pskb_pull_tail(skb, ++ ptr - (void *)skb->data - skb_headlen(skb))) { ++ return 1; ++ } else { ++ return 0; ++ } ++} ++ ++int skb_checksum_setup(struct sk_buff *skb) ++{ ++ if (skb->proto_csum_blank) { ++ if (skb->protocol != htons(ETH_P_IP)) ++ goto out; ++ if (!skb_pull_up_to(skb, skb->nh.iph + 1)) ++ goto out; ++ skb->h.raw = (unsigned char *)skb->nh.iph + 4*skb->nh.iph->ihl; ++ switch (skb->nh.iph->protocol) { ++ case IPPROTO_TCP: ++ skb->csum = offsetof(struct tcphdr, check); ++ break; ++ case IPPROTO_UDP: ++ skb->csum = offsetof(struct udphdr, check); ++ break; ++ default: ++ if (net_ratelimit()) ++ printk(KERN_ERR "Attempting to checksum a non-" ++ "TCP/UDP packet, dropping a protocol" ++ " %d packet", skb->nh.iph->protocol); ++ goto out; ++ } ++ if (!skb_pull_up_to(skb, skb->h.raw + skb->csum + 2)) ++ goto out; ++ skb->ip_summed = CHECKSUM_HW; ++ skb->proto_csum_blank = 0; ++ } ++ return 0; ++out: ++ return -EPROTO; ++} ++#endif /* linux == 2.6.18 */ ++#endif /* CONFIG_XEN */ ++ ++int ++dp_output_control(struct datapath *dp, struct sk_buff *skb, int queue_no, ++ u32 arg) ++{ ++ struct dp_stats_percpu *stats; ++ struct sk_buff_head *queue; ++ int port_no; ++ int err; ++ ++ WARN_ON_ONCE(skb_shared(skb)); ++ BUG_ON(queue_no != _ODPL_MISS_NR && queue_no != _ODPL_ACTION_NR); ++ ++ queue = &dp->queues[queue_no]; ++ err = -ENOBUFS; ++ if (skb_queue_len(queue) >= DP_MAX_QUEUE_LEN) ++ goto err_kfree_skb; ++ ++ /* If a checksum-deferred packet is forwarded to the controller, ++ * correct the pointers and checksum. This happens on a regular basis ++ * only on Xen (the CHECKSUM_HW case), on which VMs can pass up packets ++ * that do not have their checksum computed. We also implement it for ++ * the non-Xen case, but it is difficult to trigger or test this case ++ * there, hence the WARN_ON_ONCE(). ++ */ ++ err = skb_checksum_setup(skb); ++ if (err) ++ goto err_kfree_skb; ++#ifndef CHECKSUM_HW ++ if (skb->ip_summed == CHECKSUM_PARTIAL) { ++ WARN_ON_ONCE(1); ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) ++ /* Until 2.6.22, the start of the transport header was also the ++ * start of data to be checksummed. Linux 2.6.22 introduced ++ * the csum_start field for this purpose, but we should point ++ * the transport header to it anyway for backward ++ * compatibility, as dev_queue_xmit() does even in 2.6.28. */ ++ skb_set_transport_header(skb, skb->csum_start - ++ skb_headroom(skb)); ++#endif ++ err = skb_checksum_help(skb); ++ if (err) ++ goto err_kfree_skb; ++ } ++#else ++ if (skb->ip_summed == CHECKSUM_HW) { ++ err = skb_checksum_help(skb, 0); ++ if (err) ++ goto err_kfree_skb; ++ } ++#endif ++ ++ /* Break apart GSO packets into their component pieces. Otherwise ++ * userspace may try to stuff a 64kB packet into a 1500-byte MTU. */ ++ if (skb_is_gso(skb)) { ++ struct sk_buff *nskb = skb_gso_segment(skb, 0); ++ if (nskb) { ++ kfree_skb(skb); ++ skb = nskb; ++ if (unlikely(IS_ERR(skb))) { ++ err = PTR_ERR(skb); ++ goto err; ++ } ++ } else { ++ /* XXX This case might not be possible. It's hard to ++ * tell from the skb_gso_segment() code and comment. */ ++ } ++ } ++ ++ /* Figure out port number. */ ++ port_no = ODPP_LOCAL; ++ if (skb->dev) { ++ if (skb->dev->br_port) ++ port_no = skb->dev->br_port->port_no; ++ else if (is_dp_dev(skb->dev)) ++ port_no = dp_dev_priv(skb->dev)->port_no; ++ } ++ ++ /* Append each packet to queue. There will be only one packet unless ++ * we broke up a GSO packet above. */ ++ do { ++ struct odp_msg *header; ++ struct sk_buff *nskb = skb->next; ++ skb->next = NULL; ++ ++ err = skb_cow(skb, sizeof *header); ++ if (err) { ++ while (nskb) { ++ kfree_skb(skb); ++ skb = nskb; ++ nskb = skb->next; ++ } ++ goto err_kfree_skb; ++ } ++ ++ header = (struct odp_msg*)__skb_push(skb, sizeof *header); ++ header->type = queue_no; ++ header->length = skb->len; ++ header->port = port_no; ++ header->reserved = 0; ++ header->arg = arg; ++ skb_queue_tail(queue, skb); ++ ++ skb = nskb; ++ } while (skb); ++ ++ wake_up_interruptible(&dp->waitqueue); ++ return 0; ++ ++err_kfree_skb: ++ kfree_skb(skb); ++err: ++ stats = percpu_ptr(dp->stats_percpu, get_cpu()); ++ stats->n_lost++; ++ put_cpu(); ++ ++ return err; ++} ++ ++static int flush_flows(struct datapath *dp) ++{ ++ dp->n_flows = 0; ++ return dp_table_flush(dp); ++} ++ ++static int validate_actions(const struct sw_flow_actions *actions) ++{ ++ unsigned int i; ++ ++ for (i = 0; i < actions->n_actions; i++) { ++ const union odp_action *a = &actions->actions[i]; ++ switch (a->type) { ++ case ODPAT_OUTPUT: ++ if (a->output.port >= DP_MAX_PORTS) ++ return -EINVAL; ++ break; ++ ++ case ODPAT_OUTPUT_GROUP: ++ if (a->output_group.group >= DP_MAX_GROUPS) ++ return -EINVAL; ++ break; ++ ++ case ODPAT_SET_VLAN_VID: ++ if (a->vlan_vid.vlan_vid & htons(~VLAN_VID_MASK)) ++ return -EINVAL; ++ break; ++ ++ case ODPAT_SET_VLAN_PCP: ++ if (a->vlan_pcp.vlan_pcp & ~VLAN_PCP_MASK) ++ return -EINVAL; ++ break; ++ ++ default: ++ if (a->type >= ODPAT_N_ACTIONS) ++ return -EOPNOTSUPP; ++ break; ++ } ++ } ++ ++ return 0; ++} ++ ++static struct sw_flow_actions *get_actions(const struct odp_flow *flow) ++{ ++ struct sw_flow_actions *actions; ++ int error; ++ ++ actions = flow_actions_alloc(flow->n_actions); ++ error = PTR_ERR(actions); ++ if (IS_ERR(actions)) ++ goto error; ++ ++ error = -EFAULT; ++ if (copy_from_user(actions->actions, flow->actions, ++ flow->n_actions * sizeof(union odp_action))) ++ goto error_free_actions; ++ error = validate_actions(actions); ++ if (error) ++ goto error_free_actions; ++ ++ return actions; ++ ++error_free_actions: ++ kfree(actions); ++error: ++ return ERR_PTR(error); ++} ++ ++static void get_stats(struct sw_flow *flow, struct odp_flow_stats *stats) ++{ ++ if (flow->used.tv_sec) { ++ stats->used_sec = flow->used.tv_sec; ++ stats->used_nsec = flow->used.tv_nsec; ++ } else { ++ stats->used_sec = 0; ++ stats->used_nsec = 0; ++ } ++ stats->n_packets = flow->packet_count; ++ stats->n_bytes = flow->byte_count; ++ stats->ip_tos = flow->ip_tos; ++ stats->tcp_flags = flow->tcp_flags; ++} ++ ++static void clear_stats(struct sw_flow *flow) ++{ ++ flow->used.tv_sec = flow->used.tv_nsec = 0; ++ flow->tcp_flags = 0; ++ flow->ip_tos = 0; ++ flow->packet_count = 0; ++ flow->byte_count = 0; ++} ++ ++static int put_flow(struct datapath *dp, struct odp_flow_put __user *ufp) ++{ ++ struct odp_flow_put uf; ++ struct sw_flow *flow, **bucket; ++ struct dp_table *table; ++ struct odp_flow_stats stats; ++ int error; ++ ++ error = -EFAULT; ++ if (copy_from_user(&uf, ufp, sizeof(struct odp_flow_put))) ++ goto error; ++ uf.flow.key.reserved = 0; ++ ++retry: ++ table = rcu_dereference(dp->table); ++ bucket = dp_table_lookup_for_insert(table, &uf.flow.key); ++ if (!bucket) { ++ /* No such flow, and the slots where it could go are full. */ ++ error = uf.flags & ODPPF_CREATE ? -EXFULL : -ENOENT; ++ goto error; ++ } else if (!*bucket) { ++ /* No such flow, but we found an available slot for it. */ ++ struct sw_flow_actions *acts; ++ ++ error = -ENOENT; ++ if (!(uf.flags & ODPPF_CREATE)) ++ goto error; ++ ++ /* Expand table, if necessary, to make room. */ ++ if (dp->n_flows * 4 >= table->n_buckets && ++ table->n_buckets < DP_MAX_BUCKETS) { ++ error = dp_table_expand(dp); ++ if (error) ++ goto error; ++ ++ /* The bucket's location has changed. Try again. */ ++ goto retry; ++ } ++ ++ /* Allocate flow. */ ++ error = -ENOMEM; ++ flow = kmem_cache_alloc(flow_cache, GFP_KERNEL); ++ if (flow == NULL) ++ goto error; ++ flow->key = uf.flow.key; ++ spin_lock_init(&flow->lock); ++ clear_stats(flow); ++ ++ /* Obtain actions. */ ++ acts = get_actions(&uf.flow); ++ error = PTR_ERR(acts); ++ if (IS_ERR(acts)) ++ goto error_free_flow; ++ rcu_assign_pointer(flow->sf_acts, acts); ++ ++ /* Put flow in bucket. */ ++ rcu_assign_pointer(*bucket, flow); ++ dp->n_flows++; ++ memset(&stats, 0, sizeof(struct odp_flow_stats)); ++ } else { ++ /* We found a matching flow. */ ++ struct sw_flow *flow = *rcu_dereference(bucket); ++ struct sw_flow_actions *old_acts, *new_acts; ++ unsigned long int flags; ++ ++ /* Bail out if we're not allowed to modify an existing flow. */ ++ error = -EEXIST; ++ if (!(uf.flags & ODPPF_MODIFY)) ++ goto error; ++ ++ /* Swap actions. */ ++ new_acts = get_actions(&uf.flow); ++ error = PTR_ERR(new_acts); ++ if (IS_ERR(new_acts)) ++ goto error; ++ old_acts = rcu_dereference(flow->sf_acts); ++ if (old_acts->n_actions != new_acts->n_actions || ++ memcmp(old_acts->actions, new_acts->actions, ++ sizeof(union odp_action) * old_acts->n_actions)) { ++ rcu_assign_pointer(flow->sf_acts, new_acts); ++ flow_deferred_free_acts(old_acts); ++ } else { ++ kfree(new_acts); ++ } ++ ++ /* Fetch stats, then clear them if necessary. */ ++ spin_lock_irqsave(&flow->lock, flags); ++ get_stats(flow, &stats); ++ if (uf.flags & ODPPF_ZERO_STATS) ++ clear_stats(flow); ++ spin_unlock_irqrestore(&flow->lock, flags); ++ } ++ ++ /* Copy stats to userspace. */ ++ if (__copy_to_user(&ufp->flow.stats, &stats, ++ sizeof(struct odp_flow_stats))) ++ return -EFAULT; ++ return 0; ++ ++error_free_flow: ++ kmem_cache_free(flow_cache, flow); ++error: ++ return error; ++} ++ ++static int put_actions(const struct sw_flow *flow, struct odp_flow __user *ufp) ++{ ++ union odp_action __user *actions; ++ struct sw_flow_actions *sf_acts; ++ u32 n_actions; ++ ++ if (__get_user(actions, &ufp->actions) || ++ __get_user(n_actions, &ufp->n_actions)) ++ return -EFAULT; ++ ++ if (!n_actions) ++ return 0; ++ if (ufp->n_actions > INT_MAX / sizeof(union odp_action)) ++ return -EINVAL; ++ ++ sf_acts = rcu_dereference(flow->sf_acts); ++ if (__put_user(sf_acts->n_actions, &ufp->n_actions) || ++ (actions && copy_to_user(actions, sf_acts->actions, ++ sizeof(union odp_action) * ++ min(sf_acts->n_actions, n_actions)))) ++ return -EFAULT; ++ ++ return 0; ++} ++ ++static int answer_query(struct sw_flow *flow, struct odp_flow __user *ufp) ++{ ++ struct odp_flow_stats stats; ++ unsigned long int flags; ++ ++ spin_lock_irqsave(&flow->lock, flags); ++ get_stats(flow, &stats); ++ spin_unlock_irqrestore(&flow->lock, flags); ++ ++ if (__copy_to_user(&ufp->stats, &stats, sizeof(struct odp_flow_stats))) ++ return -EFAULT; ++ return put_actions(flow, ufp); ++} ++ ++static int del_or_query_flow(struct datapath *dp, ++ struct odp_flow __user *ufp, ++ unsigned int cmd) ++{ ++ struct dp_table *table = rcu_dereference(dp->table); ++ struct odp_flow uf; ++ struct sw_flow *flow; ++ int error; ++ ++ error = -EFAULT; ++ if (copy_from_user(&uf, ufp, sizeof uf)) ++ goto error; ++ uf.key.reserved = 0; ++ ++ flow = dp_table_lookup(table, &uf.key); ++ error = -ENOENT; ++ if (!flow) ++ goto error; ++ ++ if (cmd == ODP_FLOW_DEL) { ++ /* XXX redundant lookup */ ++ error = dp_table_delete(table, flow); ++ if (error) ++ goto error; ++ ++ /* XXX These statistics might lose a few packets, since other ++ * CPUs can be using this flow. We used to synchronize_rcu() ++ * to make sure that we get completely accurate stats, but that ++ * blows our performance, badly. */ ++ dp->n_flows--; ++ error = answer_query(flow, ufp); ++ flow_deferred_free(flow); ++ } else { ++ error = answer_query(flow, ufp); ++ } ++ ++error: ++ return error; ++} ++ ++static int query_multiple_flows(struct datapath *dp, ++ const struct odp_flowvec *flowvec) ++{ ++ struct dp_table *table = rcu_dereference(dp->table); ++ int i; ++ for (i = 0; i < flowvec->n_flows; i++) { ++ struct __user odp_flow *ufp = &flowvec->flows[i]; ++ struct odp_flow uf; ++ struct sw_flow *flow; ++ int error; ++ ++ if (__copy_from_user(&uf, ufp, sizeof uf)) ++ return -EFAULT; ++ uf.key.reserved = 0; ++ ++ flow = dp_table_lookup(table, &uf.key); ++ if (!flow) ++ error = __clear_user(&ufp->stats, sizeof ufp->stats); ++ else ++ error = answer_query(flow, ufp); ++ if (error) ++ return -EFAULT; ++ } ++ return flowvec->n_flows; ++} ++ ++struct list_flows_cbdata { ++ struct odp_flow __user *uflows; ++ int n_flows; ++ int listed_flows; ++}; ++ ++static int list_flow(struct sw_flow *flow, void *cbdata_) ++{ ++ struct list_flows_cbdata *cbdata = cbdata_; ++ struct odp_flow __user *ufp = &cbdata->uflows[cbdata->listed_flows++]; ++ int error; ++ ++ if (__copy_to_user(&ufp->key, &flow->key, sizeof flow->key)) ++ return -EFAULT; ++ error = answer_query(flow, ufp); ++ if (error) ++ return error; ++ ++ if (cbdata->listed_flows >= cbdata->n_flows) ++ return cbdata->listed_flows; ++ return 0; ++} ++ ++static int list_flows(struct datapath *dp, const struct odp_flowvec *flowvec) ++{ ++ struct list_flows_cbdata cbdata; ++ int error; ++ ++ if (!flowvec->n_flows) ++ return 0; ++ ++ cbdata.uflows = flowvec->flows; ++ cbdata.n_flows = flowvec->n_flows; ++ cbdata.listed_flows = 0; ++ error = dp_table_foreach(rcu_dereference(dp->table), ++ list_flow, &cbdata); ++ return error ? error : cbdata.listed_flows; ++} ++ ++static int do_flowvec_ioctl(struct datapath *dp, unsigned long argp, ++ int (*function)(struct datapath *, ++ const struct odp_flowvec *)) ++{ ++ struct odp_flowvec __user *uflowvec; ++ struct odp_flowvec flowvec; ++ int retval; ++ ++ uflowvec = (struct odp_flowvec __user *)argp; ++ if (!access_ok(VERIFY_WRITE, uflowvec, sizeof *uflowvec) || ++ copy_from_user(&flowvec, uflowvec, sizeof flowvec)) ++ return -EFAULT; ++ ++ if (flowvec.n_flows > INT_MAX / sizeof(struct odp_flow)) ++ return -EINVAL; ++ ++ if (!access_ok(VERIFY_WRITE, flowvec.flows, ++ flowvec.n_flows * sizeof(struct odp_flow))) ++ return -EFAULT; ++ ++ retval = function(dp, &flowvec); ++ return (retval < 0 ? retval ++ : retval == flowvec.n_flows ? 0 ++ : __put_user(retval, &uflowvec->n_flows)); ++} ++ ++static int do_execute(struct datapath *dp, const struct odp_execute *executep) ++{ ++ struct odp_execute execute; ++ struct odp_flow_key key; ++ struct sk_buff *skb; ++ struct sw_flow_actions *actions; ++ int err; ++ ++ err = -EFAULT; ++ if (copy_from_user(&execute, executep, sizeof execute)) ++ goto error; ++ ++ err = -EINVAL; ++ if (execute.length < ETH_HLEN || execute.length > 65535) ++ goto error; ++ ++ err = -ENOMEM; ++ actions = flow_actions_alloc(execute.n_actions); ++ if (!actions) ++ goto error; ++ ++ err = -EFAULT; ++ if (copy_from_user(actions->actions, execute.actions, ++ execute.n_actions * sizeof *execute.actions)) ++ goto error_free_actions; ++ ++ err = validate_actions(actions); ++ if (err) ++ goto error_free_actions; ++ ++ err = -ENOMEM; ++ skb = alloc_skb(execute.length, GFP_KERNEL); ++ if (!skb) ++ goto error_free_actions; ++ if (execute.in_port < DP_MAX_PORTS) { ++ struct net_bridge_port *p = dp->ports[execute.in_port]; ++ if (p) ++ skb->dev = p->dev; ++ } ++ ++ err = -EFAULT; ++ if (copy_from_user(skb_put(skb, execute.length), execute.data, ++ execute.length)) ++ goto error_free_skb; ++ ++ flow_extract(skb, execute.in_port, &key); ++ err = execute_actions(dp, skb, &key, actions->actions, ++ actions->n_actions, GFP_KERNEL); ++ kfree(actions); ++ return err; ++ ++error_free_skb: ++ kfree_skb(skb); ++error_free_actions: ++ kfree(actions); ++error: ++ return err; ++} ++ ++static int ++get_dp_stats(struct datapath *dp, struct odp_stats __user *statsp) ++{ ++ struct odp_stats stats; ++ int i; ++ ++ stats.n_flows = dp->n_flows; ++ stats.cur_capacity = rcu_dereference(dp->table)->n_buckets * 2; ++ stats.max_capacity = DP_MAX_BUCKETS * 2; ++ stats.n_ports = dp->n_ports; ++ stats.max_ports = DP_MAX_PORTS; ++ stats.max_groups = DP_MAX_GROUPS; ++ stats.n_frags = stats.n_hit = stats.n_missed = stats.n_lost = 0; ++ for_each_possible_cpu(i) { ++ const struct dp_stats_percpu *s; ++ s = percpu_ptr(dp->stats_percpu, i); ++ stats.n_frags += s->n_frags; ++ stats.n_hit += s->n_hit; ++ stats.n_missed += s->n_missed; ++ stats.n_lost += s->n_lost; ++ } ++ stats.max_miss_queue = DP_MAX_QUEUE_LEN; ++ stats.max_action_queue = DP_MAX_QUEUE_LEN; ++ return copy_to_user(statsp, &stats, sizeof stats) ? -EFAULT : 0; ++} ++ ++static int ++put_port(const struct net_bridge_port *p, struct odp_port __user *uop) ++{ ++ struct odp_port op; ++ memset(&op, 0, sizeof op); ++ strncpy(op.devname, p->dev->name, sizeof op.devname); ++ op.port = p->port_no; ++ op.flags = is_dp_dev(p->dev) ? ODP_PORT_INTERNAL : 0; ++ return copy_to_user(uop, &op, sizeof op) ? -EFAULT : 0; ++} ++ ++static int ++query_port(struct datapath *dp, struct odp_port __user *uport) ++{ ++ struct odp_port port; ++ ++ if (copy_from_user(&port, uport, sizeof port)) ++ return -EFAULT; ++ if (port.devname[0]) { ++ struct net_bridge_port *p; ++ struct net_device *dev; ++ int err; ++ ++ port.devname[IFNAMSIZ - 1] = '\0'; ++ ++ dev = dev_get_by_name(&init_net, port.devname); ++ if (!dev) ++ return -ENODEV; ++ ++ p = dev->br_port; ++ if (!p && is_dp_dev(dev)) { ++ struct dp_dev *dp_dev = dp_dev_priv(dev); ++ if (dp_dev->dp == dp) ++ p = dp->ports[dp_dev->port_no]; ++ } ++ err = p && p->dp == dp ? put_port(p, uport) : -ENOENT; ++ dev_put(dev); ++ ++ return err; ++ } else { ++ if (port.port >= DP_MAX_PORTS) ++ return -EINVAL; ++ if (!dp->ports[port.port]) ++ return -ENOENT; ++ return put_port(dp->ports[port.port], uport); ++ } ++} ++ ++static int ++list_ports(struct datapath *dp, struct odp_portvec __user *pvp) ++{ ++ struct odp_portvec pv; ++ struct net_bridge_port *p; ++ int idx; ++ ++ if (copy_from_user(&pv, pvp, sizeof pv)) ++ return -EFAULT; ++ ++ idx = 0; ++ if (pv.n_ports) { ++ list_for_each_entry_rcu (p, &dp->port_list, node) { ++ if (put_port(p, &pv.ports[idx])) ++ return -EFAULT; ++ if (idx++ >= pv.n_ports) ++ break; ++ } ++ } ++ return put_user(idx, &pvp->n_ports); ++} ++ ++/* RCU callback for freeing a dp_port_group */ ++static void free_port_group(struct rcu_head *rcu) ++{ ++ struct dp_port_group *g = container_of(rcu, struct dp_port_group, rcu); ++ kfree(g); ++} ++ ++static int ++set_port_group(struct datapath *dp, const struct odp_port_group __user *upg) ++{ ++ struct odp_port_group pg; ++ struct dp_port_group *new_group, *old_group; ++ int error; ++ ++ error = -EFAULT; ++ if (copy_from_user(&pg, upg, sizeof pg)) ++ goto error; ++ ++ error = -EINVAL; ++ if (pg.n_ports > DP_MAX_PORTS || pg.group >= DP_MAX_GROUPS) ++ goto error; ++ ++ error = -ENOMEM; ++ new_group = kmalloc(sizeof *new_group + sizeof(u16) * pg.n_ports, ++ GFP_KERNEL); ++ if (!new_group) ++ goto error; ++ ++ new_group->n_ports = pg.n_ports; ++ error = -EFAULT; ++ if (copy_from_user(new_group->ports, pg.ports, ++ sizeof(u16) * pg.n_ports)) ++ goto error_free; ++ ++ old_group = rcu_dereference(dp->groups[pg.group]); ++ rcu_assign_pointer(dp->groups[pg.group], new_group); ++ if (old_group) ++ call_rcu(&old_group->rcu, free_port_group); ++ return 0; ++ ++error_free: ++ kfree(new_group); ++error: ++ return error; ++} ++ ++static int ++get_port_group(struct datapath *dp, struct odp_port_group *upg) ++{ ++ struct odp_port_group pg; ++ struct dp_port_group *g; ++ u16 n_copy; ++ ++ if (copy_from_user(&pg, upg, sizeof pg)) ++ return -EFAULT; ++ ++ if (pg.group >= DP_MAX_GROUPS) ++ return -EINVAL; ++ ++ g = dp->groups[pg.group]; ++ n_copy = g ? min_t(int, g->n_ports, pg.n_ports) : 0; ++ if (n_copy && copy_to_user(pg.ports, g->ports, n_copy * sizeof(u16))) ++ return -EFAULT; ++ ++ if (put_user(g ? g->n_ports : 0, &upg->n_ports)) ++ return -EFAULT; ++ ++ return 0; ++} ++ ++static long openvswitch_ioctl(struct file *f, unsigned int cmd, ++ unsigned long argp) ++{ ++ int dp_idx = iminor(f->f_dentry->d_inode); ++ struct datapath *dp; ++ int drop_frags, listeners, port_no; ++ int err; ++ ++ /* Handle commands with special locking requirements up front. */ ++ switch (cmd) { ++ case ODP_DP_CREATE: ++ return create_dp(dp_idx, (char __user *)argp); ++ ++ case ODP_DP_DESTROY: ++ return destroy_dp(dp_idx); ++ ++ case ODP_PORT_ADD: ++ return add_port(dp_idx, (struct odp_port __user *)argp); ++ ++ case ODP_PORT_DEL: ++ err = get_user(port_no, (int __user *)argp); ++ if (err) ++ break; ++ return del_port(dp_idx, port_no); ++ } ++ ++ dp = get_dp_locked(dp_idx); ++ if (!dp) ++ return -ENODEV; ++ ++ switch (cmd) { ++ case ODP_DP_STATS: ++ err = get_dp_stats(dp, (struct odp_stats __user *)argp); ++ break; ++ ++ case ODP_GET_DROP_FRAGS: ++ err = put_user(dp->drop_frags, (int __user *)argp); ++ break; ++ ++ case ODP_SET_DROP_FRAGS: ++ err = get_user(drop_frags, (int __user *)argp); ++ if (err) ++ break; ++ err = -EINVAL; ++ if (drop_frags != 0 && drop_frags != 1) ++ break; ++ dp->drop_frags = drop_frags; ++ err = 0; ++ break; ++ ++ case ODP_GET_LISTEN_MASK: ++ err = put_user((int)f->private_data, (int __user *)argp); ++ break; ++ ++ case ODP_SET_LISTEN_MASK: ++ err = get_user(listeners, (int __user *)argp); ++ if (err) ++ break; ++ err = -EINVAL; ++ if (listeners & ~ODPL_ALL) ++ break; ++ err = 0; ++ f->private_data = (void*)listeners; ++ break; ++ ++ case ODP_PORT_QUERY: ++ err = query_port(dp, (struct odp_port __user *)argp); ++ break; ++ ++ case ODP_PORT_LIST: ++ err = list_ports(dp, (struct odp_portvec __user *)argp); ++ break; ++ ++ case ODP_PORT_GROUP_SET: ++ err = set_port_group(dp, (struct odp_port_group __user *)argp); ++ break; ++ ++ case ODP_PORT_GROUP_GET: ++ err = get_port_group(dp, (struct odp_port_group __user *)argp); ++ break; ++ ++ case ODP_FLOW_FLUSH: ++ err = flush_flows(dp); ++ break; ++ ++ case ODP_FLOW_PUT: ++ err = put_flow(dp, (struct odp_flow_put __user *)argp); ++ break; ++ ++ case ODP_FLOW_DEL: ++ case ODP_FLOW_GET: ++ err = del_or_query_flow(dp, (struct odp_flow __user *)argp, ++ cmd); ++ break; ++ ++ case ODP_FLOW_GET_MULTIPLE: ++ err = do_flowvec_ioctl(dp, argp, query_multiple_flows); ++ break; ++ ++ case ODP_FLOW_LIST: ++ err = do_flowvec_ioctl(dp, argp, list_flows); ++ break; ++ ++ case ODP_EXECUTE: ++ err = do_execute(dp, (struct odp_execute __user *)argp); ++ break; ++ ++ default: ++ err = -ENOIOCTLCMD; ++ break; ++ } ++ mutex_unlock(&dp->mutex); ++ return err; ++} ++ ++static int dp_has_packet_of_interest(struct datapath *dp, int listeners) ++{ ++ int i; ++ for (i = 0; i < DP_N_QUEUES; i++) { ++ if (listeners & (1 << i) && !skb_queue_empty(&dp->queues[i])) ++ return 1; ++ } ++ return 0; ++} ++ ++ssize_t openvswitch_read(struct file *f, char __user *buf, size_t nbytes, ++ loff_t *ppos) ++{ ++ int listeners = (int) f->private_data; ++ int dp_idx = iminor(f->f_dentry->d_inode); ++ struct datapath *dp = get_dp(dp_idx); ++ struct sk_buff *skb; ++ struct iovec __user iov; ++ size_t copy_bytes; ++ int retval; ++ ++ if (!dp) ++ return -ENODEV; ++ ++ if (nbytes == 0 || !listeners) ++ return 0; ++ ++ for (;;) { ++ int i; ++ ++ for (i = 0; i < DP_N_QUEUES; i++) { ++ if (listeners & (1 << i)) { ++ skb = skb_dequeue(&dp->queues[i]); ++ if (skb) ++ goto success; ++ } ++ } ++ ++ if (f->f_flags & O_NONBLOCK) { ++ retval = -EAGAIN; ++ goto error; ++ } ++ ++ wait_event_interruptible(dp->waitqueue, ++ dp_has_packet_of_interest(dp, ++ listeners)); ++ ++ if (signal_pending(current)) { ++ retval = -ERESTARTSYS; ++ goto error; ++ } ++ } ++success: ++ copy_bytes = min(skb->len, nbytes); ++ iov.iov_base = buf; ++ iov.iov_len = copy_bytes; ++ retval = skb_copy_datagram_iovec(skb, 0, &iov, iov.iov_len); ++ if (!retval) ++ retval = copy_bytes; ++ kfree_skb(skb); ++ ++error: ++ return retval; ++} ++ ++static unsigned int openvswitch_poll(struct file *file, poll_table *wait) ++{ ++ int dp_idx = iminor(file->f_dentry->d_inode); ++ struct datapath *dp = get_dp(dp_idx); ++ unsigned int mask; ++ ++ if (dp) { ++ mask = 0; ++ poll_wait(file, &dp->waitqueue, wait); ++ if (dp_has_packet_of_interest(dp, (int)file->private_data)) ++ mask |= POLLIN | POLLRDNORM; ++ } else { ++ mask = POLLIN | POLLRDNORM | POLLHUP; ++ } ++ return mask; ++} ++ ++struct file_operations openvswitch_fops = { ++ /* XXX .aio_read = openvswitch_aio_read, */ ++ .read = openvswitch_read, ++ .poll = openvswitch_poll, ++ .unlocked_ioctl = openvswitch_ioctl, ++ /* XXX .fasync = openvswitch_fasync, */ ++}; ++ ++static int major; ++static struct llc_sap *dp_stp_sap; ++ ++static int dp_stp_rcv(struct sk_buff *skb, struct net_device *dev, ++ struct packet_type *pt, struct net_device *orig_dev) ++{ ++ /* We don't really care about STP packets, we just listen for them for ++ * mutual exclusion with the bridge module, so this just discards ++ * them. */ ++ kfree_skb(skb); ++ return 0; ++} ++ ++static int __init dp_init(void) ++{ ++ int err; ++ ++ printk("Open vSwitch %s, built "__DATE__" "__TIME__"\n", VERSION BUILDNR); ++ ++ /* Register to receive STP packets because the bridge module also ++ * attempts to do so. Since there can only be a single listener for a ++ * given protocol, this provides mutual exclusion against the bridge ++ * module, preventing both of them from being loaded at the same ++ * time. */ ++ dp_stp_sap = llc_sap_open(LLC_SAP_BSPAN, dp_stp_rcv); ++ if (!dp_stp_sap) { ++ printk(KERN_ERR "openvswitch: can't register sap for STP (probably the bridge module is loaded)\n"); ++ return -EADDRINUSE; ++ } ++ ++ err = flow_init(); ++ if (err) ++ goto error; ++ ++ err = register_netdevice_notifier(&dp_device_notifier); ++ if (err) ++ goto error_flow_exit; ++ ++ major = register_chrdev(0, "openvswitch", &openvswitch_fops); ++ if (err < 0) ++ goto error_unreg_notifier; ++ ++ /* Hook into callback used by the bridge to intercept packets. ++ * Parasites we are. */ ++ br_handle_frame_hook = dp_frame_hook; ++ ++ return 0; ++ ++error_unreg_notifier: ++ unregister_netdevice_notifier(&dp_device_notifier); ++error_flow_exit: ++ flow_exit(); ++error: ++ return err; ++} ++ ++static void dp_cleanup(void) ++{ ++ rcu_barrier(); ++ unregister_chrdev(major, "openvswitch"); ++ unregister_netdevice_notifier(&dp_device_notifier); ++ flow_exit(); ++ br_handle_frame_hook = NULL; ++ llc_sap_put(dp_stp_sap); ++} ++ ++module_init(dp_init); ++module_exit(dp_cleanup); ++ ++MODULE_DESCRIPTION("Open vSwitch switching datapath"); ++MODULE_LICENSE("GPL"); +diff -r 1a87bbd37bb1 net/vswitch/datapath.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/net/vswitch/datapath.h Tue Jun 30 13:50:53 2009 +0100 +@@ -0,0 +1,152 @@ ++/* ++ * Copyright (c) 2009 Nicira Networks. ++ * Distributed under the terms of the GNU GPL version 2. ++ * ++ * Significant portions of this file may be copied from parts of the Linux ++ * kernel, by Linus Torvalds and others. ++ */ ++ ++/* Interface exported by openvswitch_mod. */ ++ ++#ifndef DATAPATH_H ++#define DATAPATH_H 1 ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include "flow.h" ++#include "brc_sysfs.h" ++ ++struct sk_buff; ++ ++/* Mask for the priority bits in a vlan header. If we ever merge upstream ++ * then this should go into include/linux/if_vlan.h. */ ++#define VLAN_PCP_MASK 0xe000 ++ ++#define DP_MAX_PORTS 256 ++#define DP_MAX_GROUPS 16 ++ ++#define DP_L2_BITS (PAGE_SHIFT - ilog2(sizeof(struct sw_flow*))) ++#define DP_L2_SIZE (1 << DP_L2_BITS) ++#define DP_L2_SHIFT 0 ++ ++#define DP_L1_BITS (PAGE_SHIFT - ilog2(sizeof(struct sw_flow**))) ++#define DP_L1_SIZE (1 << DP_L1_BITS) ++#define DP_L1_SHIFT DP_L2_BITS ++ ++#define DP_MAX_BUCKETS (DP_L1_SIZE * DP_L2_SIZE) ++ ++struct dp_table { ++ unsigned int n_buckets; ++ struct sw_flow ***flows[2]; ++ struct rcu_head rcu; ++}; ++ ++#define DP_N_QUEUES 2 ++#define DP_MAX_QUEUE_LEN 100 ++ ++struct dp_stats_percpu { ++ u64 n_frags; ++ u64 n_hit; ++ u64 n_missed; ++ u64 n_lost; ++}; ++ ++struct dp_port_group { ++ struct rcu_head rcu; ++ int n_ports; ++ u16 ports[]; ++}; ++ ++struct datapath { ++ struct mutex mutex; ++ int dp_idx; ++ ++#ifdef CONFIG_SYSFS ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25) ++ struct kobject ifobj; ++#else ++ struct kobject *ifobj; ++#endif ++#endif ++ ++ int drop_frags; ++ ++ /* Queued data. */ ++ struct sk_buff_head queues[DP_N_QUEUES]; ++ wait_queue_head_t waitqueue; ++ ++ /* Flow table. */ ++ unsigned int n_flows; ++ struct dp_table *table; ++ ++ /* Port groups. */ ++ struct dp_port_group *groups[DP_MAX_GROUPS]; ++ ++ /* Switch ports. */ ++ unsigned int n_ports; ++ struct net_bridge_port *ports[DP_MAX_PORTS]; ++ struct list_head port_list; /* All ports, including local_port. */ ++ ++ /* Stats. */ ++ struct dp_stats_percpu *stats_percpu; ++}; ++ ++struct net_bridge_port { ++ u16 port_no; ++ struct datapath *dp; ++ struct net_device *dev; ++#ifdef CONFIG_SYSFS ++ struct kobject kobj; ++#endif ++ struct list_head node; /* Element in datapath.ports. */ ++}; ++ ++extern struct notifier_block dp_device_notifier; ++extern int (*dp_ioctl_hook)(struct net_device *dev, struct ifreq *rq, int cmd); ++extern int (*dp_add_dp_hook)(struct datapath *dp); ++extern int (*dp_del_dp_hook)(struct datapath *dp); ++extern int (*dp_add_if_hook)(struct net_bridge_port *p); ++extern int (*dp_del_if_hook)(struct net_bridge_port *p); ++ ++/* Flow table. */ ++struct dp_table *dp_table_create(unsigned int n_buckets); ++void dp_table_destroy(struct dp_table *, int free_flows); ++struct sw_flow *dp_table_lookup(struct dp_table *, const struct odp_flow_key *); ++struct sw_flow **dp_table_lookup_for_insert(struct dp_table *, const struct odp_flow_key *); ++int dp_table_delete(struct dp_table *, struct sw_flow *); ++int dp_table_expand(struct datapath *); ++int dp_table_flush(struct datapath *); ++int dp_table_foreach(struct dp_table *table, ++ int (*callback)(struct sw_flow *flow, void *aux), ++ void *aux); ++ ++void dp_process_received_packet(struct sk_buff *, struct net_bridge_port *); ++int dp_del_port(struct net_bridge_port *, struct list_head *); ++int dp_output_port(struct datapath *, struct sk_buff *, int out_port, ++ int ignore_no_fwd); ++int dp_output_control(struct datapath *, struct sk_buff *, int, u32 arg); ++void dp_set_origin(struct datapath *, u16, struct sk_buff *); ++ ++struct datapath *get_dp(int dp_idx); ++ ++static inline const char *dp_name(const struct datapath *dp) ++{ ++ return dp->ports[ODPP_LOCAL]->dev->name; ++} ++ ++#ifdef CONFIG_XEN ++int skb_checksum_setup(struct sk_buff *skb); ++#else ++static inline int skb_checksum_setup(struct sk_buff *skb) ++{ ++ return 0; ++} ++#endif ++ ++#endif /* datapath.h */ +diff -r 1a87bbd37bb1 net/vswitch/dp_dev.c +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/net/vswitch/dp_dev.c Tue Jun 30 13:50:53 2009 +0100 +@@ -0,0 +1,218 @@ ++/* ++ * Copyright (c) 2009 Nicira Networks. ++ * Distributed under the terms of the GNU GPL version 2. ++ * ++ * Significant portions of this file may be copied from parts of the Linux ++ * kernel, by Linus Torvalds and others. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "datapath.h" ++#include "dp_dev.h" ++ ++struct datapath *dp_dev_get_dp(struct net_device *netdev) ++{ ++ return dp_dev_priv(netdev)->dp; ++} ++EXPORT_SYMBOL(dp_dev_get_dp); ++ ++static struct net_device_stats *dp_dev_get_stats(struct net_device *netdev) ++{ ++ struct dp_dev *dp_dev = dp_dev_priv(netdev); ++ return &dp_dev->stats; ++} ++ ++int dp_dev_recv(struct net_device *netdev, struct sk_buff *skb) ++{ ++ struct dp_dev *dp_dev = dp_dev_priv(netdev); ++ int len; ++ len = skb->len; ++ skb->pkt_type = PACKET_HOST; ++ skb->protocol = eth_type_trans(skb, netdev); ++ if (in_interrupt()) ++ netif_rx(skb); ++ else ++ netif_rx_ni(skb); ++ netdev->last_rx = jiffies; ++ dp_dev->stats.rx_packets++; ++ dp_dev->stats.rx_bytes += len; ++ return len; ++} ++ ++static int dp_dev_mac_addr(struct net_device *dev, void *p) ++{ ++ struct sockaddr *addr = p; ++ ++ if (!is_valid_ether_addr(addr->sa_data)) ++ return -EADDRNOTAVAIL; ++ memcpy(dev->dev_addr, addr->sa_data, dev->addr_len); ++ return 0; ++} ++ ++static int dp_dev_xmit(struct sk_buff *skb, struct net_device *netdev) ++{ ++ struct dp_dev *dp_dev = dp_dev_priv(netdev); ++ ++ /* By orphaning 'skb' we will screw up socket accounting slightly, but ++ * the effect is limited to the device queue length. If we don't ++ * do this, then the sk_buff will be destructed eventually, but it is ++ * harder to predict when. */ ++ skb_orphan(skb); ++ ++ /* We are going to modify 'skb', by sticking it on &dp_dev->xmit_queue, ++ * so we need to have our own clone. (At any rate, fwd_port_input() ++ * will need its own clone, so there's no benefit to queuing any other ++ * way.) */ ++ skb = skb_share_check(skb, GFP_ATOMIC); ++ if (!skb) ++ return 0; ++ ++ dp_dev->stats.tx_packets++; ++ dp_dev->stats.tx_bytes += skb->len; ++ ++ if (skb_queue_len(&dp_dev->xmit_queue) >= netdev->tx_queue_len) { ++ /* Queue overflow. Stop transmitter. */ ++ netif_stop_queue(netdev); ++ ++ /* We won't see all dropped packets individually, so overrun ++ * error is appropriate. */ ++ dp_dev->stats.tx_fifo_errors++; ++ } ++ skb_queue_tail(&dp_dev->xmit_queue, skb); ++ netdev->trans_start = jiffies; ++ ++ schedule_work(&dp_dev->xmit_work); ++ ++ return 0; ++} ++ ++static void dp_dev_do_xmit(struct work_struct *work) ++{ ++ struct dp_dev *dp_dev = container_of(work, struct dp_dev, xmit_work); ++ struct datapath *dp = dp_dev->dp; ++ struct sk_buff *skb; ++ ++ while ((skb = skb_dequeue(&dp_dev->xmit_queue)) != NULL) { ++ skb_reset_mac_header(skb); ++ rcu_read_lock_bh(); ++ dp_process_received_packet(skb, dp->ports[dp_dev->port_no]); ++ rcu_read_unlock_bh(); ++ } ++ netif_wake_queue(dp_dev->dev); ++} ++ ++static int dp_dev_open(struct net_device *netdev) ++{ ++ netif_start_queue(netdev); ++ return 0; ++} ++ ++static int dp_dev_stop(struct net_device *netdev) ++{ ++ netif_stop_queue(netdev); ++ return 0; ++} ++ ++static void dp_getinfo(struct net_device *netdev, struct ethtool_drvinfo *info) ++{ ++ struct dp_dev *dp_dev = dp_dev_priv(netdev); ++ strcpy(info->driver, "openvswitch"); ++ sprintf(info->bus_info, "%d", dp_dev->dp->dp_idx); ++} ++ ++static struct ethtool_ops dp_ethtool_ops = { ++ .get_drvinfo = dp_getinfo, ++ .get_link = ethtool_op_get_link, ++ .get_sg = ethtool_op_get_sg, ++ .get_tx_csum = ethtool_op_get_tx_csum, ++ .get_tso = ethtool_op_get_tso, ++}; ++ ++static void ++do_setup(struct net_device *netdev) ++{ ++ ether_setup(netdev); ++ ++ netdev->do_ioctl = dp_ioctl_hook; ++ netdev->get_stats = dp_dev_get_stats; ++ netdev->hard_start_xmit = dp_dev_xmit; ++ netdev->open = dp_dev_open; ++ SET_ETHTOOL_OPS(netdev, &dp_ethtool_ops); ++ netdev->stop = dp_dev_stop; ++ netdev->tx_queue_len = 100; ++ netdev->set_mac_address = dp_dev_mac_addr; ++ ++ netdev->flags = IFF_BROADCAST | IFF_MULTICAST; ++ ++ random_ether_addr(netdev->dev_addr); ++ ++ /* Set the OUI to the Nicira one. */ ++ netdev->dev_addr[0] = 0x00; ++ netdev->dev_addr[1] = 0x23; ++ netdev->dev_addr[2] = 0x20; ++ ++ /* Set the top bits to indicate random Nicira address. */ ++ netdev->dev_addr[3] |= 0xc0; ++} ++ ++/* Create a datapath device associated with 'dp'. If 'dp_name' is null, ++ * the device name will be of the form 'of'. Returns the new device or ++ * an error code. ++ * ++ * Called with RTNL lock and dp_mutex. */ ++struct net_device *dp_dev_create(struct datapath *dp, const char *dp_name, int port_no) ++{ ++ struct dp_dev *dp_dev; ++ struct net_device *netdev; ++ char dev_name[IFNAMSIZ]; ++ int err; ++ ++ if (dp_name) { ++ if (strlen(dp_name) >= IFNAMSIZ) ++ return ERR_PTR(-EINVAL); ++ strncpy(dev_name, dp_name, sizeof(dev_name)); ++ } else ++ snprintf(dev_name, sizeof dev_name, "of%d", dp->dp_idx); ++ ++ netdev = alloc_netdev(sizeof(struct dp_dev), dev_name, do_setup); ++ if (!netdev) ++ return ERR_PTR(-ENOMEM); ++ ++ err = register_netdevice(netdev); ++ if (err) { ++ free_netdev(netdev); ++ return ERR_PTR(err); ++ } ++ ++ dp_dev = dp_dev_priv(netdev); ++ dp_dev->dp = dp; ++ dp_dev->port_no = port_no; ++ dp_dev->dev = netdev; ++ skb_queue_head_init(&dp_dev->xmit_queue); ++ INIT_WORK(&dp_dev->xmit_work, dp_dev_do_xmit); ++ return netdev; ++} ++ ++/* Called with RTNL lock and dp_mutex.*/ ++void dp_dev_destroy(struct net_device *netdev) ++{ ++ struct dp_dev *dp_dev = dp_dev_priv(netdev); ++ ++ netif_tx_disable(netdev); ++ synchronize_net(); ++ skb_queue_purge(&dp_dev->xmit_queue); ++ unregister_netdevice(netdev); ++} ++ ++int is_dp_dev(struct net_device *netdev) ++{ ++ return netdev->open == dp_dev_open; ++} ++EXPORT_SYMBOL(is_dp_dev); +diff -r 1a87bbd37bb1 net/vswitch/dp_dev.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/net/vswitch/dp_dev.h Tue Jun 30 13:50:53 2009 +0100 +@@ -0,0 +1,35 @@ ++/* ++ * Copyright (c) 2009 Nicira Networks. ++ * Distributed under the terms of the GNU GPL version 2. ++ * ++ * Significant portions of this file may be copied from parts of the Linux ++ * kernel, by Linus Torvalds and others. ++ */ ++ ++#ifndef DP_DEV_H ++#define DP_DEV_H 1 ++ ++struct dp_dev { ++ struct datapath *dp; ++ int port_no; ++ ++ struct net_device *dev; ++ struct net_device_stats stats; ++ struct sk_buff_head xmit_queue; ++ struct work_struct xmit_work; ++ ++ struct list_head list; ++}; ++ ++static inline struct dp_dev *dp_dev_priv(struct net_device *netdev) ++{ ++ return netdev_priv(netdev); ++} ++ ++struct net_device *dp_dev_create(struct datapath *, const char *, int port_no); ++void dp_dev_destroy(struct net_device *); ++int dp_dev_recv(struct net_device *, struct sk_buff *); ++int is_dp_dev(struct net_device *); ++struct datapath *dp_dev_get_dp(struct net_device *); ++ ++#endif /* dp_dev.h */ +diff -r 1a87bbd37bb1 net/vswitch/dp_notify.c +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/net/vswitch/dp_notify.c Tue Jun 30 13:50:53 2009 +0100 +@@ -0,0 +1,32 @@ ++/* ++ * Distributed under the terms of the GNU GPL version 2. ++ * Copyright (c) 2007, 2008, 2009 Nicira Networks. ++ * ++ * Significant portions of this file may be copied from parts of the Linux ++ * kernel, by Linus Torvalds and others. ++ */ ++ ++/* Handle changes to managed devices */ ++ ++#include ++ ++#include "datapath.h" ++ ++ ++static int dp_device_event(struct notifier_block *unused, unsigned long event, ++ void *ptr) ++{ ++ struct net_device *dev = ptr; ++ struct net_bridge_port *p = dev->br_port; ++ if (event == NETDEV_UNREGISTER && p) { ++ struct datapath *dp = p->dp; ++ mutex_lock(&dp->mutex); ++ dp_del_port(p, NULL); ++ mutex_unlock(&dp->mutex); ++ } ++ return NOTIFY_DONE; ++} ++ ++struct notifier_block dp_device_notifier = { ++ .notifier_call = dp_device_event ++}; +diff -r 1a87bbd37bb1 net/vswitch/flow.c +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/net/vswitch/flow.c Tue Jun 30 13:50:53 2009 +0100 +@@ -0,0 +1,304 @@ ++/* ++ * Distributed under the terms of the GNU GPL version 2. ++ * Copyright (c) 2007, 2008, 2009 Nicira Networks. ++ * ++ * Significant portions of this file may be copied from parts of the Linux ++ * kernel, by Linus Torvalds and others. ++ */ ++ ++#include "flow.h" ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "compat.h" ++ ++struct kmem_cache *flow_cache; ++ ++static inline int iphdr_ok(struct sk_buff *skb) ++{ ++ int nh_ofs = skb_network_offset(skb); ++ if (skb->len >= nh_ofs + sizeof(struct iphdr)) { ++ int ip_len = ip_hdrlen(skb); ++ return (ip_len >= sizeof(struct iphdr) ++ && pskb_may_pull(skb, nh_ofs + ip_len)); ++ } ++ return 0; ++} ++ ++static inline int tcphdr_ok(struct sk_buff *skb) ++{ ++ int th_ofs = skb_transport_offset(skb); ++ if (pskb_may_pull(skb, th_ofs + sizeof(struct tcphdr))) { ++ int tcp_len = tcp_hdrlen(skb); ++ return (tcp_len >= sizeof(struct tcphdr) ++ && skb->len >= th_ofs + tcp_len); ++ } ++ return 0; ++} ++ ++static inline int udphdr_ok(struct sk_buff *skb) ++{ ++ int th_ofs = skb_transport_offset(skb); ++ return pskb_may_pull(skb, th_ofs + sizeof(struct udphdr)); ++} ++ ++static inline int icmphdr_ok(struct sk_buff *skb) ++{ ++ int th_ofs = skb_transport_offset(skb); ++ return pskb_may_pull(skb, th_ofs + sizeof(struct icmphdr)); ++} ++ ++#define TCP_FLAGS_OFFSET 13 ++#define TCP_FLAG_MASK 0x3f ++ ++static inline struct ovs_tcphdr *ovs_tcp_hdr(const struct sk_buff *skb) ++{ ++ return (struct ovs_tcphdr *)skb_transport_header(skb); ++} ++ ++void flow_used(struct sw_flow *flow, struct sk_buff *skb) ++{ ++ unsigned long flags; ++ u8 tcp_flags = 0; ++ ++ if (flow->key.dl_type == htons(ETH_P_IP) && iphdr_ok(skb)) { ++ struct iphdr *nh = ip_hdr(skb); ++ flow->ip_tos = nh->tos; ++ if (flow->key.nw_proto == IPPROTO_TCP && tcphdr_ok(skb)) { ++ u8 *tcp = (u8 *)tcp_hdr(skb); ++ tcp_flags = *(tcp + TCP_FLAGS_OFFSET) & TCP_FLAG_MASK; ++ } ++ } ++ ++ spin_lock_irqsave(&flow->lock, flags); ++ getnstimeofday(&flow->used); ++ flow->packet_count++; ++ flow->byte_count += skb->len; ++ flow->tcp_flags |= tcp_flags; ++ spin_unlock_irqrestore(&flow->lock, flags); ++} ++ ++struct sw_flow_actions *flow_actions_alloc(size_t n_actions) ++{ ++ struct sw_flow_actions *sfa; ++ ++ if (n_actions > (PAGE_SIZE - sizeof *sfa) / sizeof(union odp_action)) ++ return ERR_PTR(-EINVAL); ++ ++ sfa = kmalloc(sizeof *sfa + n_actions * sizeof(union odp_action), ++ GFP_KERNEL); ++ if (!sfa) ++ return ERR_PTR(-ENOMEM); ++ ++ sfa->n_actions = n_actions; ++ return sfa; ++} ++ ++ ++/* Frees 'flow' immediately. */ ++void flow_free(struct sw_flow *flow) ++{ ++ if (unlikely(!flow)) ++ return; ++ kfree(flow->sf_acts); ++ kmem_cache_free(flow_cache, flow); ++} ++ ++/* RCU callback used by flow_deferred_free. */ ++static void rcu_free_flow_callback(struct rcu_head *rcu) ++{ ++ struct sw_flow *flow = container_of(rcu, struct sw_flow, rcu); ++ flow_free(flow); ++} ++ ++/* Schedules 'flow' to be freed after the next RCU grace period. ++ * The caller must hold rcu_read_lock for this to be sensible. */ ++void flow_deferred_free(struct sw_flow *flow) ++{ ++ call_rcu(&flow->rcu, rcu_free_flow_callback); ++} ++ ++/* RCU callback used by flow_deferred_free_acts. */ ++static void rcu_free_acts_callback(struct rcu_head *rcu) ++{ ++ struct sw_flow_actions *sf_acts = container_of(rcu, ++ struct sw_flow_actions, rcu); ++ kfree(sf_acts); ++} ++ ++/* Schedules 'sf_acts' to be freed after the next RCU grace period. ++ * The caller must hold rcu_read_lock for this to be sensible. */ ++void flow_deferred_free_acts(struct sw_flow_actions *sf_acts) ++{ ++ call_rcu(&sf_acts->rcu, rcu_free_acts_callback); ++} ++ ++#define SNAP_OUI_LEN 3 ++ ++struct eth_snap_hdr ++{ ++ struct ethhdr eth; ++ u8 dsap; /* Always 0xAA */ ++ u8 ssap; /* Always 0xAA */ ++ u8 ctrl; ++ u8 oui[SNAP_OUI_LEN]; ++ u16 ethertype; ++} __attribute__ ((packed)); ++ ++static int is_snap(const struct eth_snap_hdr *esh) ++{ ++ return (esh->dsap == LLC_SAP_SNAP ++ && esh->ssap == LLC_SAP_SNAP ++ && !memcmp(esh->oui, "\0\0\0", 3)); ++} ++ ++/* Parses the Ethernet frame in 'skb', which was received on 'in_port', ++ * and initializes 'key' to match. Returns 1 if 'skb' contains an IP ++ * fragment, 0 otherwise. */ ++int flow_extract(struct sk_buff *skb, u16 in_port, struct odp_flow_key *key) ++{ ++ struct ethhdr *eth; ++ struct eth_snap_hdr *esh; ++ int retval = 0; ++ int nh_ofs; ++ ++ memset(key, 0, sizeof *key); ++ key->dl_vlan = htons(ODP_VLAN_NONE); ++ key->in_port = in_port; ++ ++ if (skb->len < sizeof *eth) ++ return 0; ++ if (!pskb_may_pull(skb, skb->len >= 64 ? 64 : skb->len)) { ++ return 0; ++ } ++ ++ skb_reset_mac_header(skb); ++ eth = eth_hdr(skb); ++ esh = (struct eth_snap_hdr *) eth; ++ nh_ofs = sizeof *eth; ++ if (likely(ntohs(eth->h_proto) >= ODP_DL_TYPE_ETH2_CUTOFF)) ++ key->dl_type = eth->h_proto; ++ else if (skb->len >= sizeof *esh && is_snap(esh)) { ++ key->dl_type = esh->ethertype; ++ nh_ofs = sizeof *esh; ++ } else { ++ key->dl_type = htons(ODP_DL_TYPE_NOT_ETH_TYPE); ++ if (skb->len >= nh_ofs + sizeof(struct llc_pdu_un)) { ++ nh_ofs += sizeof(struct llc_pdu_un); ++ } ++ } ++ ++ /* Check for a VLAN tag */ ++ if (key->dl_type == htons(ETH_P_8021Q) && ++ skb->len >= nh_ofs + sizeof(struct vlan_hdr)) { ++ struct vlan_hdr *vh = (struct vlan_hdr*)(skb->data + nh_ofs); ++ key->dl_type = vh->h_vlan_encapsulated_proto; ++ key->dl_vlan = vh->h_vlan_TCI & htons(VLAN_VID_MASK); ++ nh_ofs += sizeof(struct vlan_hdr); ++ } ++ memcpy(key->dl_src, eth->h_source, ETH_ALEN); ++ memcpy(key->dl_dst, eth->h_dest, ETH_ALEN); ++ skb_set_network_header(skb, nh_ofs); ++ ++ /* Network layer. */ ++ if (key->dl_type == htons(ETH_P_IP) && iphdr_ok(skb)) { ++ struct iphdr *nh = ip_hdr(skb); ++ int th_ofs = nh_ofs + nh->ihl * 4; ++ key->nw_src = nh->saddr; ++ key->nw_dst = nh->daddr; ++ key->nw_proto = nh->protocol; ++ skb_set_transport_header(skb, th_ofs); ++ ++ /* Transport layer. */ ++ if (!(nh->frag_off & htons(IP_MF | IP_OFFSET))) { ++ if (key->nw_proto == IPPROTO_TCP) { ++ if (tcphdr_ok(skb)) { ++ struct tcphdr *tcp = tcp_hdr(skb); ++ key->tp_src = tcp->source; ++ key->tp_dst = tcp->dest; ++ } else { ++ /* Avoid tricking other code into ++ * thinking that this packet has an L4 ++ * header. */ ++ key->nw_proto = 0; ++ } ++ } else if (key->nw_proto == IPPROTO_UDP) { ++ if (udphdr_ok(skb)) { ++ struct udphdr *udp = udp_hdr(skb); ++ key->tp_src = udp->source; ++ key->tp_dst = udp->dest; ++ } else { ++ /* Avoid tricking other code into ++ * thinking that this packet has an L4 ++ * header. */ ++ key->nw_proto = 0; ++ } ++ } else if (key->nw_proto == IPPROTO_ICMP) { ++ if (icmphdr_ok(skb)) { ++ struct icmphdr *icmp = icmp_hdr(skb); ++ /* The ICMP type and code fields use the 16-bit ++ * transport port fields, so we need to store them ++ * in 16-bit network byte order. */ ++ key->tp_src = htons(icmp->type); ++ key->tp_dst = htons(icmp->code); ++ } else { ++ /* Avoid tricking other code into ++ * thinking that this packet has an L4 ++ * header. */ ++ key->nw_proto = 0; ++ } ++ } ++ } else { ++ retval = 1; ++ } ++ } else { ++ skb_reset_transport_header(skb); ++ } ++ return retval; ++} ++ ++/* Initializes the flow module. ++ * Returns zero if successful or a negative error code. */ ++int flow_init(void) ++{ ++ flow_cache = kmem_cache_create("sw_flow", sizeof(struct sw_flow), 0, ++ 0, NULL); ++ if (flow_cache == NULL) ++ return -ENOMEM; ++ ++ return 0; ++} ++ ++/* Uninitializes the flow module. */ ++void flow_exit(void) ++{ ++ kmem_cache_destroy(flow_cache); ++} ++ ++void print_flow(const struct odp_flow_key *key) ++{ ++#define MAC_FMT "%02x:%02x:%02x:%02x:%02x:%02x" ++#define MAC_ARG(x) ((u8*)(x))[0],((u8*)(x))[1],((u8*)(x))[2],((u8*)(x))[3],((u8*)(x))[4],((u8*)(x))[5] ++ printk("port%04x:vlan%d mac"MAC_FMT"->"MAC_FMT" " ++ "type%04x proto%d ip%x->%x port%d->%d\n", ++ key->in_port, ntohs(key->dl_vlan), ++ MAC_ARG(key->dl_src), MAC_ARG(key->dl_dst), ++ ntohs(key->dl_type), key->nw_proto, ++ key->nw_src, key->nw_dst, ++ ntohs(key->tp_src), ntohs(key->tp_dst)); ++} +diff -r 1a87bbd37bb1 net/vswitch/flow.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/net/vswitch/flow.h Tue Jun 30 13:50:53 2009 +0100 +@@ -0,0 +1,57 @@ ++/* ++ * Copyright (c) 2009 Nicira Networks. ++ * Distributed under the terms of the GNU GPL version 2. ++ * ++ * Significant portions of this file may be copied from parts of the Linux ++ * kernel, by Linus Torvalds and others. ++ */ ++ ++#ifndef FLOW_H ++#define FLOW_H 1 ++ ++#include ++#include ++#include ++#include ++#include ++ ++#include "openvswitch/datapath-protocol.h" ++ ++struct sk_buff; ++ ++struct sw_flow_actions { ++ struct rcu_head rcu; ++ unsigned int n_actions; ++ union odp_action actions[]; ++}; ++ ++struct sw_flow { ++ struct rcu_head rcu; ++ struct odp_flow_key key; ++ struct sw_flow_actions *sf_acts; ++ ++ struct timespec used; /* Last used time. */ ++ ++ u8 ip_tos; /* IP TOS value. */ ++ ++ spinlock_t lock; /* Lock for values below. */ ++ u64 packet_count; /* Number of packets matched. */ ++ u64 byte_count; /* Number of bytes matched. */ ++ u8 tcp_flags; /* Union of seen TCP flags. */ ++}; ++ ++extern struct kmem_cache *flow_cache; ++ ++struct sw_flow_actions *flow_actions_alloc(size_t n_actions); ++void flow_free(struct sw_flow *); ++void flow_deferred_free(struct sw_flow *); ++void flow_deferred_free_acts(struct sw_flow_actions *); ++int flow_extract(struct sk_buff *, u16 in_port, struct odp_flow_key *); ++void flow_used(struct sw_flow *, struct sk_buff *); ++ ++void print_flow(const struct odp_flow_key *); ++ ++int flow_init(void); ++void flow_exit(void); ++ ++#endif /* flow.h */ +diff -r 1a87bbd37bb1 net/vswitch/table.c +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/net/vswitch/table.c Tue Jun 30 13:50:53 2009 +0100 +@@ -0,0 +1,248 @@ ++/* ++ * Copyright (c) 2009 Nicira Networks. ++ * Distributed under the terms of the GNU GPL version 2. ++ * ++ * Significant portions of this file may be copied from parts of the Linux ++ * kernel, by Linus Torvalds and others. ++ */ ++ ++#include "flow.h" ++#include "datapath.h" ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++static void free_table(struct sw_flow ***flows, unsigned int n_buckets, ++ int free_flows) ++{ ++ unsigned int i; ++ ++ for (i = 0; i < n_buckets >> DP_L1_BITS; i++) { ++ struct sw_flow **l2 = flows[i]; ++ if (free_flows) { ++ unsigned int j; ++ for (j = 0; j < DP_L1_SIZE; j++) { ++ if (l2[j]) ++ flow_free(l2[j]); ++ } ++ } ++ free_page((unsigned long)l2); ++ } ++ kfree(flows); ++} ++ ++static struct sw_flow ***alloc_table(unsigned int n_buckets) ++{ ++ struct sw_flow ***flows; ++ unsigned int i; ++ ++ flows = kmalloc((n_buckets >> DP_L1_BITS) * sizeof(struct sw_flow**), ++ GFP_KERNEL); ++ if (!flows) ++ return NULL; ++ for (i = 0; i < n_buckets >> DP_L1_BITS; i++) { ++ flows[i] = (struct sw_flow **)get_zeroed_page(GFP_KERNEL); ++ if (!flows[i]) { ++ free_table(flows, i << DP_L1_BITS, 0); ++ return NULL; ++ } ++ } ++ return flows; ++} ++ ++struct dp_table *dp_table_create(unsigned int n_buckets) ++{ ++ struct dp_table *table; ++ ++ table = kzalloc(sizeof *table, GFP_KERNEL); ++ if (!table) ++ goto err; ++ ++ table->n_buckets = n_buckets; ++ table->flows[0] = alloc_table(n_buckets); ++ if (!table[0].flows) ++ goto err_free_tables; ++ ++ table->flows[1] = alloc_table(n_buckets); ++ if (!table->flows[1]) ++ goto err_free_flows0; ++ ++ return table; ++ ++err_free_flows0: ++ free_table(table->flows[0], table->n_buckets, 0); ++err_free_tables: ++ kfree(table); ++err: ++ return NULL; ++} ++ ++void dp_table_destroy(struct dp_table *table, int free_flows) ++{ ++ int i; ++ for (i = 0; i < 2; i++) ++ free_table(table->flows[i], table->n_buckets, free_flows); ++ kfree(table); ++} ++ ++static struct sw_flow **find_bucket(struct dp_table *table, ++ struct sw_flow ***flows, u32 hash) ++{ ++ unsigned int l1 = (hash & (table->n_buckets - 1)) >> DP_L1_SHIFT; ++ unsigned int l2 = hash & ((1 << DP_L2_BITS) - 1); ++ return &flows[l1][l2]; ++} ++ ++static struct sw_flow *lookup_table(struct dp_table *table, ++ struct sw_flow ***flows, u32 hash, ++ const struct odp_flow_key *key) ++{ ++ struct sw_flow **bucket = find_bucket(table, flows, hash); ++ struct sw_flow *flow = rcu_dereference(*bucket); ++ if (flow && !memcmp(&flow->key, key, sizeof(struct odp_flow_key))) ++ return flow; ++ return NULL; ++} ++ ++static u32 flow_hash0(const struct odp_flow_key *key) ++{ ++ return jhash2((u32*)key, sizeof *key / sizeof(u32), 0xaaaaaaaa); ++} ++ ++static u32 flow_hash1(const struct odp_flow_key *key) ++{ ++ return jhash2((u32*)key, sizeof *key / sizeof(u32), 0x55555555); ++} ++ ++static void find_buckets(struct dp_table *table, ++ const struct odp_flow_key *key, ++ struct sw_flow **buckets[2]) ++{ ++ buckets[0] = find_bucket(table, table->flows[0], flow_hash0(key)); ++ buckets[1] = find_bucket(table, table->flows[1], flow_hash1(key)); ++} ++ ++struct sw_flow *dp_table_lookup(struct dp_table *table, ++ const struct odp_flow_key *key) ++{ ++ struct sw_flow *flow; ++ flow = lookup_table(table, table->flows[0], flow_hash0(key), key); ++ if (!flow) ++ flow = lookup_table(table, table->flows[1], ++ flow_hash1(key), key); ++ return flow; ++} ++ ++int dp_table_foreach(struct dp_table *table, ++ int (*callback)(struct sw_flow *flow, void *aux), ++ void *aux) ++{ ++ unsigned int i, j, k; ++ for (i = 0; i < 2; i++) { ++ for (j = 0; j < table->n_buckets >> DP_L1_BITS; j++) { ++ struct sw_flow **l2 = table->flows[i][j]; ++ for (k = 0; k < DP_L1_SIZE; k++) { ++ struct sw_flow *flow = rcu_dereference(l2[k]); ++ if (flow) { ++ int error = callback(flow, aux); ++ if (error) ++ return error; ++ } ++ } ++ } ++ } ++ return 0; ++} ++ ++static int insert_flow(struct sw_flow *flow, void *new_table_) ++{ ++ struct dp_table *new_table = new_table_; ++ struct sw_flow **buckets[2]; ++ int i; ++ ++ find_buckets(new_table, &flow->key, buckets); ++ for (i = 0; i < 2; i++) { ++ if (!*buckets[i]) { ++ rcu_assign_pointer(*buckets[i], flow); ++ return 0; ++ } ++ } ++ WARN_ON_ONCE(1); ++ return 0; ++} ++ ++static void dp_free_table_rcu(struct rcu_head *rcu) ++{ ++ struct dp_table *table = container_of(rcu, struct dp_table, rcu); ++ dp_table_destroy(table, 0); ++} ++ ++int dp_table_expand(struct datapath *dp) ++{ ++ struct dp_table *old_table = rcu_dereference(dp->table); ++ struct dp_table *new_table = dp_table_create(old_table->n_buckets * 2); ++ if (!new_table) ++ return -ENOMEM; ++ dp_table_foreach(old_table, insert_flow, new_table); ++ rcu_assign_pointer(dp->table, new_table); ++ call_rcu(&old_table->rcu, dp_free_table_rcu); ++ return 0; ++} ++ ++static void dp_free_table_and_flows_rcu(struct rcu_head *rcu) ++{ ++ struct dp_table *table = container_of(rcu, struct dp_table, rcu); ++ dp_table_destroy(table, 1); ++} ++ ++int dp_table_flush(struct datapath *dp) ++{ ++ struct dp_table *old_table = rcu_dereference(dp->table); ++ struct dp_table *new_table = dp_table_create(DP_L1_SIZE); ++ if (!new_table) ++ return -ENOMEM; ++ rcu_assign_pointer(dp->table, new_table); ++ call_rcu(&old_table->rcu, dp_free_table_and_flows_rcu); ++ return 0; ++} ++ ++struct sw_flow ** ++dp_table_lookup_for_insert(struct dp_table *table, ++ const struct odp_flow_key *target) ++{ ++ struct sw_flow **buckets[2]; ++ struct sw_flow **empty_bucket = NULL; ++ int i; ++ ++ find_buckets(table, target, buckets); ++ for (i = 0; i < 2; i++) { ++ struct sw_flow *f = rcu_dereference(*buckets[i]); ++ if (f) { ++ if (!memcmp(&f->key, target, sizeof(struct odp_flow_key))) ++ return buckets[i]; ++ } else if (!empty_bucket) ++ empty_bucket = buckets[i]; ++ } ++ return empty_bucket; ++} ++ ++int dp_table_delete(struct dp_table *table, struct sw_flow *target) ++{ ++ struct sw_flow **buckets[2]; ++ int i; ++ ++ find_buckets(table, &target->key, buckets); ++ for (i = 0; i < 2; i++) { ++ struct sw_flow *flow = rcu_dereference(*buckets[i]); ++ if (flow == target) { ++ rcu_assign_pointer(*buckets[i], NULL); ++ return 0; ++ } ++ } ++ return -ENOENT; ++} diff --git a/master/vswitch-build-integration.patch b/master/vswitch-build-integration.patch new file mode 100644 index 0000000..82c1cbd --- /dev/null +++ b/master/vswitch-build-integration.patch @@ -0,0 +1,141 @@ +* * * + +diff -r 65895242b988 net/Kconfig +--- a/net/Kconfig Wed Jul 01 11:16:09 2009 +0100 ++++ b/net/Kconfig Wed Jul 01 15:02:49 2009 +0100 +@@ -180,6 +180,7 @@ + source "net/atm/Kconfig" + source "net/802/Kconfig" + source "net/bridge/Kconfig" ++source "net/vswitch/Kconfig" + source "net/8021q/Kconfig" + source "net/decnet/Kconfig" + source "net/llc/Kconfig" +diff -r 65895242b988 net/Makefile +--- a/net/Makefile Wed Jul 01 11:16:09 2009 +0100 ++++ b/net/Makefile Wed Jul 01 15:02:49 2009 +0100 +@@ -26,6 +26,7 @@ + obj-$(CONFIG_NET_KEY) += key/ + obj-$(CONFIG_NET_SCHED) += sched/ + obj-$(CONFIG_BRIDGE) += bridge/ ++obj-$(CONFIG_VSWITCH) += vswitch/ + obj-$(CONFIG_IPX) += ipx/ + obj-$(CONFIG_ATALK) += appletalk/ + obj-$(CONFIG_WAN_ROUTER) += wanrouter/ +diff -r 65895242b988 net/vswitch/Kconfig +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/net/vswitch/Kconfig Wed Jul 01 15:02:49 2009 +0100 +@@ -0,0 +1,5 @@ ++config VSWITCH ++ tristate "Nicira vSwitch" ++ depends on LLC ++ ---help--- ++ HELP GOES HERE +diff -r 65895242b988 net/vswitch/Makefile +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/net/vswitch/Makefile Wed Jul 01 15:02:49 2009 +0100 +@@ -0,0 +1,18 @@ ++EXTRA_CFLAGS += -DVERSION=\"0.90.1\" ++EXTRA_CFLAGS += -DBUILDNR=\"\" ++ ++obj-$(CONFIG_VSWITCH) += openvswitch_mod.o ++ ++obj-$(CONFIG_VSWITCH) += brcompat_mod.o ++ ++openvswitch_mod-objs += actions.o \ ++ datapath.o \ ++ dp_dev.o \ ++ dp_notify.o \ ++ flow.o \ ++ table.o ++ ++brcompat_mod-objs += brcompat.o \ ++ brc_procfs.o \ ++ brc_sysfs_dp.o \ ++ brc_sysfs_if.o +diff -r 65895242b988 net/vswitch/brc_procfs.c +--- a/net/vswitch/brc_procfs.c Wed Jul 01 11:16:09 2009 +0100 ++++ b/net/vswitch/brc_procfs.c Wed Jul 01 15:02:49 2009 +0100 +@@ -13,6 +13,8 @@ + #include + #include + #include "openvswitch/brcompat-netlink.h" ++ ++#define proc_net init_net.proc_net + + /* This code implements a Generic Netlink command BRC_GENL_C_SET_PROC that can + * be used to add, modify, and delete arbitrary files in selected +@@ -48,6 +50,13 @@ + + static struct proc_dir_entry *proc_vlan_dir; + static struct proc_dir_entry *proc_bonding_dir; ++ ++static inline int VERIFY_NUL_STRING(struct nlattr *attr) ++{ ++ return (!attr || (nla_len(attr) ++ && memchr(nla_data(attr), '\0', nla_len(attr))) ++ ? 0 : EINVAL); ++} + + struct proc_dir_entry *brc_lookup_entry(struct proc_dir_entry *de, const char *name) + { +diff -r 65895242b988 net/vswitch/brc_sysfs_dp.c +--- a/net/vswitch/brc_sysfs_dp.c Wed Jul 01 11:16:09 2009 +0100 ++++ b/net/vswitch/brc_sysfs_dp.c Wed Jul 01 15:02:49 2009 +0100 +@@ -27,6 +27,8 @@ + #include "brc_sysfs.h" + #include "datapath.h" + #include "dp_dev.h" ++ ++#define NETDEV_DEV_MEMBER dev + + #ifdef CONFIG_SYSFS + #define to_dev(obj) container_of(obj, struct device, kobj) +diff -r 65895242b988 net/vswitch/brc_sysfs_if.c +--- a/net/vswitch/brc_sysfs_if.c Wed Jul 01 11:16:09 2009 +0100 ++++ b/net/vswitch/brc_sysfs_if.c Wed Jul 01 15:02:49 2009 +0100 +@@ -20,6 +20,8 @@ + #include + #include "brc_sysfs.h" + #include "datapath.h" ++ ++#define NETDEV_DEV_MEMBER dev + + #ifdef CONFIG_SYSFS + +diff -r 65895242b988 net/vswitch/compat.h +--- a/net/vswitch/compat.h Wed Jul 01 11:16:09 2009 +0100 ++++ b/net/vswitch/compat.h Wed Jul 01 15:02:49 2009 +0100 +@@ -11,15 +11,4 @@ + + #include + +-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) +- +-#include "compat26.h" +- +-#else +- +-#include "compat24.h" +- +-#endif +- +- + #endif /* compat.h */ +diff -r 65895242b988 net/vswitch/datapath.h +--- a/net/vswitch/datapath.h Wed Jul 01 11:16:09 2009 +0100 ++++ b/net/vswitch/datapath.h Wed Jul 01 15:02:49 2009 +0100 +@@ -140,13 +140,4 @@ + return dp->ports[ODPP_LOCAL]->dev->name; + } + +-#ifdef CONFIG_XEN +-int skb_checksum_setup(struct sk_buff *skb); +-#else +-static inline int skb_checksum_setup(struct sk_buff *skb) +-{ +- return 0; +-} +-#endif +- + #endif /* datapath.h */ diff --git a/master/watch_online_node b/master/watch_online_node index 9fa36b4..ffb8e5a 100644 --- a/master/watch_online_node +++ b/master/watch_online_node @@ -7,10 +7,10 @@ Otherwise, the backend doesn't shut down correctly, since online was set when the frontend shut down and we don't get another kick when it becomes unset. -diff -r a02f68c03b26 drivers/xen/xenbus/xenbus_probe.c ---- a/drivers/xen/xenbus/xenbus_probe.c Thu May 10 14:37:27 2007 +0100 -+++ b/drivers/xen/xenbus/xenbus_probe.c Thu May 10 14:39:40 2007 +0100 -@@ -129,6 +129,11 @@ static void free_otherend_watch(struct x +diff -r 0b1452d7e278 drivers/xen/xenbus/xenbus_probe.c +--- a/drivers/xen/xenbus/xenbus_probe.c Wed Jun 17 14:09:46 2009 +0100 ++++ b/drivers/xen/xenbus/xenbus_probe.c Wed Jun 17 14:12:48 2009 +0100 +@@ -138,6 +138,11 @@ unregister_xenbus_watch(&dev->otherend_watch); kfree(dev->otherend_watch.node); dev->otherend_watch.node = NULL; @@ -22,18 +22,17 @@ diff -r a02f68c03b26 drivers/xen/xenbus/xenbus_probe.c } } -@@ -186,22 +191,11 @@ static struct xen_bus_type xenbus_fronte - }, +@@ -220,22 +225,11 @@ + #endif }; -static void otherend_changed(struct xenbus_watch *watch, - const char **vec, unsigned int len) --{ -- struct xenbus_device *dev = -- container_of(watch, struct xenbus_device, otherend_watch); +static void otherend_changed_common(struct xenbus_device *dev, + const char **vec, unsigned int len) -+{ + { +- struct xenbus_device *dev = +- container_of(watch, struct xenbus_device, otherend_watch); struct xenbus_driver *drv = to_xenbus_driver(dev->dev.driver); enum xenbus_state state; - @@ -42,13 +41,13 @@ diff -r a02f68c03b26 drivers/xen/xenbus/xenbus_probe.c - if (!dev->otherend || - strncmp(dev->otherend, vec[XS_WATCH_PATH], - strlen(dev->otherend))) { -- DPRINTK("Ignoring watch at %s", vec[XS_WATCH_PATH]); +- dev_dbg(&dev->dev, "Ignoring watch at %s", vec[XS_WATCH_PATH]); - return; - } state = xenbus_read_driver_state(dev->otherend); -@@ -226,6 +220,33 @@ static void otherend_changed(struct xenb +@@ -263,6 +257,33 @@ drv->otherend_changed(dev, state); } @@ -82,10 +81,10 @@ diff -r a02f68c03b26 drivers/xen/xenbus/xenbus_probe.c static int talk_to_otherend(struct xenbus_device *dev) { -@@ -240,8 +261,14 @@ static int talk_to_otherend(struct xenbu - +@@ -278,8 +299,14 @@ static int watch_otherend(struct xenbus_device *dev) { + #if defined(CONFIG_XEN) || defined(MODULE) - return xenbus_watch_path2(dev, dev->otherend, "state", - &dev->otherend_watch, otherend_changed); + int i; @@ -96,13 +95,13 @@ diff -r a02f68c03b26 drivers/xen/xenbus/xenbus_probe.c + &dev->online_watch, online_changed); + } + return i; - } - - -diff -r a02f68c03b26 include/xen/xenbus.h ---- a/include/xen/xenbus.h Thu May 10 14:37:27 2007 +0100 -+++ b/include/xen/xenbus.h Thu May 10 14:38:54 2007 +0100 -@@ -74,6 +74,7 @@ struct xenbus_device { + #else + return xenbus_watch_pathfmt(dev, &dev->otherend_watch, otherend_changed, + "%s/%s", dev->otherend, "state"); +diff -r 0b1452d7e278 include/xen/xenbus.h +--- a/include/xen/xenbus.h Wed Jun 17 14:09:46 2009 +0100 ++++ b/include/xen/xenbus.h Wed Jun 17 14:12:48 2009 +0100 +@@ -79,6 +79,7 @@ const char *otherend; int otherend_id; struct xenbus_watch otherend_watch; -- 2.39.5